From a128203a1e497ba7f46924549c1d6202e24a2ac8 Mon Sep 17 00:00:00 2001 From: Shailie Jain Date: Fri, 27 Oct 2017 17:32:16 -0700 Subject: [PATCH] read-cmd-date --- tests/ginkgo/read-cmd_test.go | 42 + .../{temp_test.go => read-file_test.go} | 0 .../Microsoft/go-winio/archive/tar/LICENSE | 27 - .../Microsoft/go-winio/archive/tar/common.go | 344 - .../go-winio/archive/tar/example_test.go | 80 - .../Microsoft/go-winio/archive/tar/reader.go | 1002 - .../go-winio/archive/tar/reader_test.go | 1125 - .../go-winio/archive/tar/stat_atim.go | 20 - .../go-winio/archive/tar/stat_atimespec.go | 20 - .../go-winio/archive/tar/stat_unix.go | 32 - .../go-winio/archive/tar/tar_test.go | 325 - .../archive/tar/testdata/gnu-multi-hdrs.tar | Bin 4608 -> 0 bytes .../go-winio/archive/tar/testdata/gnu.tar | Bin 3072 -> 0 bytes .../archive/tar/testdata/hardlink.tar | Bin 2560 -> 0 bytes .../archive/tar/testdata/hdr-only.tar | Bin 10240 -> 0 bytes .../archive/tar/testdata/issue10968.tar | Bin 512 -> 0 bytes .../archive/tar/testdata/issue11169.tar | Bin 602 -> 0 bytes .../archive/tar/testdata/issue12435.tar | Bin 512 -> 0 bytes .../archive/tar/testdata/neg-size.tar | Bin 512 -> 0 bytes .../go-winio/archive/tar/testdata/nil-uid.tar | Bin 1024 -> 0 bytes .../archive/tar/testdata/pax-multi-hdrs.tar | Bin 4608 -> 0 bytes .../archive/tar/testdata/pax-path-hdr.tar | Bin 1024 -> 0 bytes .../go-winio/archive/tar/testdata/pax.tar | Bin 10240 -> 0 bytes .../go-winio/archive/tar/testdata/small.txt | 1 - .../go-winio/archive/tar/testdata/small2.txt | 1 - .../archive/tar/testdata/sparse-formats.tar | Bin 17920 -> 0 bytes .../go-winio/archive/tar/testdata/star.tar | Bin 3072 -> 0 bytes .../archive/tar/testdata/ustar-file-reg.tar | Bin 1536 -> 0 bytes .../go-winio/archive/tar/testdata/ustar.tar | Bin 2048 -> 0 bytes .../go-winio/archive/tar/testdata/v7.tar | Bin 3584 -> 0 bytes .../archive/tar/testdata/writer-big-long.tar | Bin 4096 -> 0 bytes .../archive/tar/testdata/writer-big.tar | Bin 4096 -> 0 bytes .../go-winio/archive/tar/testdata/writer.tar | Bin 3584 -> 0 bytes .../go-winio/archive/tar/testdata/xattrs.tar | Bin 5120 -> 0 bytes .../Microsoft/go-winio/archive/tar/writer.go | 444 - .../go-winio/archive/tar/writer_test.go | 739 - .../Microsoft/go-winio/backuptar/noop.go | 4 - .../Microsoft/go-winio/backuptar/tar.go | 439 - .../Microsoft/go-winio/backuptar/tar_test.go | 84 - .../go-winio/vhd/mksyscall_windows.go | 901 - .../github.com/Microsoft/go-winio/vhd/vhd.go | 82 - .../github.com/Microsoft/go-winio/vhd/zvhd.go | 64 - .../Microsoft/go-winio/wim/decompress.go | 138 - .../Microsoft/go-winio/wim/lzx/lzx.go | 606 - .../go-winio/wim/validate/validate.go | 51 - .../github.com/Microsoft/go-winio/wim/wim.go | 866 - .../davecgh/go-spew/spew/testdata/dumpcgo.go | 82 - .../fake_compressor/fake_compressor.go | 18 - .../fake_extractor/fake_extractor.go | 24 - .../extractor/test_helper/archiver.go | 127 - .../docker/distribution/Godeps/Godeps.json | 458 - .../docker/distribution/Godeps/Readme | 5 - .../docker/distribution/cmd/digest/main.go | 97 - .../registry-api-descriptor-template/main.go | 131 - .../cmd/registry/config-cache.yml | 55 - .../distribution/cmd/registry/config-dev.yml | 66 - .../cmd/registry/config-example.yml | 18 - .../docker/distribution/cmd/registry/main.go | 25 - .../configuration/configuration.go | 643 - .../configuration/configuration_test.go | 529 - .../distribution/configuration/parser.go | 283 - .../docker/distribution/context/context.go | 85 - .../docker/distribution/context/doc.go | 89 - .../docker/distribution/context/http.go | 366 - .../docker/distribution/context/http_test.go | 285 - .../docker/distribution/context/logger.go | 116 - .../docker/distribution/context/trace.go | 104 - .../docker/distribution/context/trace_test.go | 85 - .../docker/distribution/context/util.go | 24 - .../docker/distribution/context/version.go | 16 - .../distribution/context/version_test.go | 19 - .../distribution/contrib/apache/README.MD | 36 - .../distribution/contrib/apache/apache.conf | 127 - .../distribution/contrib/compose/README.md | 147 - .../contrib/compose/docker-compose.yml | 15 - .../contrib/compose/nginx/Dockerfile | 6 - .../compose/nginx/docker-registry-v2.conf | 6 - .../compose/nginx/docker-registry.conf | 7 - .../contrib/compose/nginx/nginx.conf | 27 - .../contrib/compose/nginx/registry.conf | 41 - .../contrib/docker-integration/Dockerfile | 9 - .../contrib/docker-integration/README.md | 63 - .../docker-integration/docker-compose.yml | 91 - .../contrib/docker-integration/golem.conf | 18 - .../contrib/docker-integration/helpers.bash | 101 - .../docker-integration/install_certs.sh | 50 - .../malevolent-certs/localregistry.cert | 19 - .../malevolent-certs/localregistry.key | 27 - .../docker-integration/malevolent.bats | 192 - .../docker-integration/nginx/Dockerfile | 10 - .../nginx/docker-registry-v2.conf | 6 - .../docker-integration/nginx/nginx.conf | 61 - .../nginx/registry-basic.conf | 8 - .../nginx/registry-noauth.conf | 5 - .../docker-integration/nginx/registry.conf | 260 - .../docker-integration/nginx/test.passwd | 1 - .../docker-integration/nginx/v1/search.json | 1 - .../docker-integration/run_multiversion.sh | 64 - .../contrib/docker-integration/tls.bats | 109 - .../contrib/docker-integration/token.bats | 135 - .../tokenserver-oauth/.htpasswd | 1 - .../tokenserver-oauth/Dockerfile | 8 - .../certs/auth.localregistry.cert | 19 - .../certs/auth.localregistry.key | 27 - .../certs/localregistry.cert | 19 - .../tokenserver-oauth/certs/localregistry.key | 27 - .../tokenserver-oauth/certs/signing.cert | 18 - .../tokenserver-oauth/certs/signing.key | 27 - .../registry-config-notls.yml | 15 - .../tokenserver-oauth/registry-config.yml | 18 - .../docker-integration/tokenserver/.htpasswd | 1 - .../docker-integration/tokenserver/Dockerfile | 8 - .../tokenserver/certs/auth.localregistry.cert | 19 - .../tokenserver/certs/auth.localregistry.key | 27 - .../tokenserver/certs/localregistry.cert | 19 - .../tokenserver/certs/localregistry.key | 27 - .../tokenserver/certs/signing.cert | 18 - .../tokenserver/certs/signing.key | 27 - .../tokenserver/registry-config.yml | 18 - .../contrib/token-server/errors.go | 38 - .../distribution/contrib/token-server/main.go | 425 - .../contrib/token-server/token.go | 219 - .../docker/distribution/docs/README.md | 16 - .../docker/distribution/docs/architecture.md | 52 - .../docker/distribution/docs/configuration.md | 1121 - .../docker/distribution/docs/spec/api.md | 5485 -- .../docker/distribution/docs/spec/api.md.tmpl | 1215 - .../distribution/docs/spec/auth/index.md | 12 - .../docker/distribution/docs/spec/auth/jwt.md | 329 - .../distribution/docs/spec/auth/oauth.md | 190 - .../distribution/docs/spec/auth/scope.md | 148 - .../distribution/docs/spec/auth/token.md | 250 - .../distribution/docs/spec/implementations.md | 30 - .../docker/distribution/docs/spec/index.md | 12 - .../docker/distribution/docs/spec/json.md | 90 - .../distribution/docs/spec/manifest-v2-1.md | 163 - .../distribution/docs/spec/manifest-v2-2.md | 295 - .../docker/distribution/docs/spec/menu.md | 7 - .../docker/distribution/health/api/api.go | 37 - .../distribution/health/api/api_test.go | 86 - .../distribution/health/checks/checks.go | 62 - .../distribution/health/checks/checks_test.go | 25 - .../docker/distribution/health/doc.go | 130 - .../docker/distribution/health/health.go | 306 - .../docker/distribution/health/health_test.go | 107 - .../docker/distribution/manifest/doc.go | 1 - .../manifest/manifestlist/manifestlist.go | 155 - .../manifestlist/manifestlist_test.go | 111 - .../manifest/schema1/config_builder.go | 282 - .../manifest/schema1/config_builder_test.go | 272 - .../distribution/manifest/schema1/manifest.go | 184 - .../manifest/schema1/manifest_test.go | 136 - .../manifest/schema1/reference_builder.go | 98 - .../schema1/reference_builder_test.go | 108 - .../distribution/manifest/schema1/sign.go | 68 - .../distribution/manifest/schema1/verify.go | 32 - .../distribution/manifest/schema2/builder.go | 80 - .../manifest/schema2/builder_test.go | 210 - .../distribution/manifest/schema2/manifest.go | 134 - .../manifest/schema2/manifest_test.go | 111 - .../docker/distribution/manifest/versioned.go | 12 - .../distribution/notifications/bridge.go | 214 - .../distribution/notifications/bridge_test.go | 222 - .../distribution/notifications/endpoint.go | 93 - .../distribution/notifications/event.go | 160 - .../distribution/notifications/event_test.go | 157 - .../docker/distribution/notifications/http.go | 150 - .../distribution/notifications/http_test.go | 185 - .../distribution/notifications/listener.go | 215 - .../notifications/listener_test.go | 205 - .../distribution/notifications/metrics.go | 152 - .../distribution/notifications/sinks.go | 375 - .../distribution/notifications/sinks_test.go | 256 - .../distribution/project/dev-image/Dockerfile | 20 - .../distribution/project/hooks/README.md | 6 - .../project/hooks/configure-hooks.sh | 18 - .../distribution/project/hooks/pre-commit | 29 - .../registry/api/errcode/errors.go | 267 - .../registry/api/errcode/errors_test.go | 185 - .../registry/api/errcode/handler.go | 44 - .../registry/api/errcode/register.go | 138 - .../registry/api/v2/descriptors.go | 1596 - .../distribution/registry/api/v2/doc.go | 9 - .../distribution/registry/api/v2/errors.go | 136 - .../registry/api/v2/headerparser.go | 161 - .../registry/api/v2/headerparser_test.go | 161 - .../distribution/registry/api/v2/routes.go | 49 - .../registry/api/v2/routes_test.go | 355 - .../distribution/registry/api/v2/urls.go | 263 - .../distribution/registry/api/v2/urls_test.go | 484 - .../docker/distribution/registry/auth/auth.go | 202 - .../registry/auth/htpasswd/access.go | 115 - .../registry/auth/htpasswd/access_test.go | 122 - .../registry/auth/htpasswd/htpasswd.go | 82 - .../registry/auth/htpasswd/htpasswd_test.go | 85 - .../registry/auth/silly/access.go | 97 - .../registry/auth/silly/access_test.go | 71 - .../registry/auth/token/accesscontroller.go | 272 - .../registry/auth/token/stringset.go | 35 - .../distribution/registry/auth/token/token.go | 378 - .../registry/auth/token/token_test.go | 510 - .../distribution/registry/auth/token/util.go | 58 - .../registry/client/auth/api_version.go | 58 - .../registry/client/auth/challenge/addr.go | 27 - .../client/auth/challenge/authchallenge.go | 237 - .../auth/challenge/authchallenge_test.go | 127 - .../registry/client/auth/session.go | 503 - .../registry/client/auth/session_test.go | 866 - .../registry/client/blob_writer.go | 162 - .../registry/client/blob_writer_test.go | 211 - .../distribution/registry/client/errors.go | 139 - .../registry/client/errors_test.go | 104 - .../registry/client/repository.go | 853 - .../registry/client/repository_test.go | 1226 - .../registry/client/transport/http_reader.go | 251 - .../registry/client/transport/transport.go | 147 - .../docker/distribution/registry/doc.go | 2 - .../registry/handlers/api_test.go | 2513 - .../distribution/registry/handlers/app.go | 1046 - .../registry/handlers/app_test.go | 279 - .../registry/handlers/basicauth.go | 11 - .../registry/handlers/basicauth_prego14.go | 41 - .../distribution/registry/handlers/blob.go | 99 - .../registry/handlers/blobupload.go | 368 - .../distribution/registry/handlers/catalog.go | 98 - .../distribution/registry/handlers/context.go | 152 - .../registry/handlers/health_test.go | 210 - .../distribution/registry/handlers/helpers.go | 71 - .../distribution/registry/handlers/hmac.go | 74 - .../registry/handlers/hmac_test.go | 117 - .../distribution/registry/handlers/hooks.go | 53 - .../distribution/registry/handlers/images.go | 462 - .../distribution/registry/handlers/mail.go | 45 - .../distribution/registry/handlers/tags.go | 62 - .../registry/listener/listener.go | 74 - .../middleware/registry/middleware.go | 54 - .../middleware/repository/middleware.go | 40 - .../distribution/registry/proxy/proxyauth.go | 87 - .../registry/proxy/proxyblobstore.go | 224 - .../registry/proxy/proxyblobstore_test.go | 416 - .../registry/proxy/proxymanifeststore.go | 95 - .../registry/proxy/proxymanifeststore_test.go | 275 - .../registry/proxy/proxymetrics.go | 74 - .../registry/proxy/proxyregistry.go | 249 - .../registry/proxy/proxytagservice.go | 65 - .../registry/proxy/proxytagservice_test.go | 182 - .../registry/proxy/scheduler/scheduler.go | 259 - .../proxy/scheduler/scheduler_test.go | 211 - .../docker/distribution/registry/registry.go | 356 - .../distribution/registry/registry_test.go | 30 - .../docker/distribution/registry/root.go | 84 - .../registry/storage/blob_test.go | 614 - .../registry/storage/blobcachemetrics.go | 60 - .../registry/storage/blobserver.go | 78 - .../registry/storage/blobstore.go | 223 - .../registry/storage/blobwriter.go | 399 - .../storage/blobwriter_nonresumable.go | 17 - .../registry/storage/blobwriter_resumable.go | 145 - .../registry/storage/cache/cache.go | 35 - .../storage/cache/cachecheck/suite.go | 180 - .../cache/cachedblobdescriptorstore.go | 101 - .../registry/storage/cache/memory/memory.go | 179 - .../storage/cache/memory/memory_test.go | 13 - .../registry/storage/cache/redis/redis.go | 268 - .../storage/cache/redis/redis_test.go | 53 - .../distribution/registry/storage/catalog.go | 153 - .../registry/storage/catalog_test.go | 324 - .../distribution/registry/storage/doc.go | 3 - .../registry/storage/driver/azure/azure.go | 483 - .../storage/driver/azure/azure_test.go | 63 - .../registry/storage/driver/base/base.go | 198 - .../registry/storage/driver/base/regulator.go | 145 - .../storage/driver/factory/factory.go | 64 - .../registry/storage/driver/fileinfo.go | 79 - .../storage/driver/filesystem/driver.go | 440 - .../storage/driver/filesystem/driver_test.go | 113 - .../registry/storage/driver/gcs/doc.go | 3 - .../registry/storage/driver/gcs/gcs.go | 873 - .../registry/storage/driver/gcs/gcs_test.go | 311 - .../storage/driver/inmemory/driver.go | 312 - .../storage/driver/inmemory/driver_test.go | 19 - .../registry/storage/driver/inmemory/mfs.go | 338 - .../middleware/cloudfront/middleware.go | 136 - .../driver/middleware/redirect/middleware.go | 50 - .../middleware/redirect/middleware_test.go | 58 - .../driver/middleware/storagemiddleware.go | 39 - .../registry/storage/driver/oss/doc.go | 3 - .../registry/storage/driver/oss/oss.go | 683 - .../registry/storage/driver/oss/oss_test.go | 144 - .../registry/storage/driver/s3-aws/s3.go | 1189 - .../registry/storage/driver/s3-aws/s3_test.go | 313 - .../storage/driver/s3-aws/s3_v2_signer.go | 219 - .../registry/storage/driver/s3-goamz/s3.go | 757 - .../storage/driver/s3-goamz/s3_test.go | 201 - .../registry/storage/driver/storagedriver.go | 165 - .../registry/storage/driver/swift/swift.go | 915 - .../storage/driver/swift/swift_test.go | 245 - .../storage/driver/testdriver/testdriver.go | 71 - .../storage/driver/testsuites/testsuites.go | 1273 - .../registry/storage/filereader.go | 177 - .../registry/storage/filereader_test.go | 198 - .../registry/storage/garbagecollect.go | 114 - .../registry/storage/garbagecollect_test.go | 377 - .../distribution/registry/storage/io.go | 71 - .../registry/storage/linkedblobstore.go | 470 - .../registry/storage/linkedblobstore_test.go | 217 - .../registry/storage/manifestlisthandler.go | 92 - .../registry/storage/manifeststore.go | 141 - .../registry/storage/manifeststore_test.go | 391 - .../distribution/registry/storage/paths.go | 490 - .../registry/storage/paths_test.go | 135 - .../registry/storage/purgeuploads.go | 139 - .../registry/storage/purgeuploads_test.go | 166 - .../distribution/registry/storage/registry.go | 306 - .../storage/schema2manifesthandler.go | 136 - .../storage/schema2manifesthandler_test.go | 136 - .../registry/storage/signedmanifesthandler.go | 141 - .../distribution/registry/storage/tagstore.go | 191 - .../registry/storage/tagstore_test.go | 209 - .../distribution/registry/storage/util.go | 21 - .../distribution/registry/storage/vacuum.go | 67 - .../distribution/registry/storage/walk.go | 59 - .../registry/storage/walk_test.go | 152 - .../docker/distribution/testutil/handler.go | 148 - .../docker/distribution/testutil/manifests.go | 87 - .../docker/distribution/testutil/tarfile.go | 115 - .../docker/distribution/uuid/uuid.go | 126 - .../docker/distribution/uuid/uuid_test.go | 48 - .../docker/distribution/version/print.go | 26 - .../docker/distribution/version/version.go | 11 - .../docker/distribution/version/version.sh | 22 - .../docker/docker/.github/ISSUE_TEMPLATE.md | 64 - .../docker/.github/PULL_REQUEST_TEMPLATE.md | 30 - .../docker/docker/api/errors/errors.go | 47 - .../docker/docker/api/fixtures/keyfile | 7 - .../docker/api/server/httputils/decoder.go | 16 - .../docker/api/server/httputils/errors.go | 101 - .../docker/api/server/httputils/form.go | 73 - .../docker/api/server/httputils/form_test.go | 105 - .../docker/api/server/httputils/httputils.go | 90 - .../server/httputils/httputils_write_json.go | 17 - .../httputils/httputils_write_json_go16.go | 16 - .../docker/docker/api/server/middleware.go | 24 - .../docker/api/server/middleware/cors.go | 37 - .../docker/api/server/middleware/debug.go | 76 - .../api/server/middleware/experimental.go | 29 - .../api/server/middleware/middleware.go | 13 - .../docker/api/server/middleware/version.go | 50 - .../api/server/middleware/version_test.go | 57 - .../docker/docker/api/server/profiler.go | 41 - .../docker/api/server/router/build/backend.go | 20 - .../docker/api/server/router/build/build.go | 29 - .../api/server/router/build/build_routes.go | 225 - .../api/server/router/checkpoint/backend.go | 10 - .../server/router/checkpoint/checkpoint.go | 36 - .../router/checkpoint/checkpoint_routes.go | 65 - .../api/server/router/container/backend.go | 79 - .../api/server/router/container/container.go | 77 - .../router/container/container_routes.go | 554 - .../api/server/router/container/copy.go | 119 - .../api/server/router/container/exec.go | 140 - .../api/server/router/container/inspect.go | 21 - .../docker/api/server/router/experimental.go | 67 - .../docker/api/server/router/image/backend.go | 45 - .../docker/api/server/router/image/image.go | 50 - .../api/server/router/image/image_routes.go | 344 - .../docker/docker/api/server/router/local.go | 96 - .../api/server/router/network/backend.go | 22 - .../api/server/router/network/filter.go | 96 - .../api/server/router/network/network.go | 44 - .../server/router/network/network_routes.go | 308 - .../api/server/router/plugin/backend.go | 25 - .../docker/api/server/router/plugin/plugin.go | 39 - .../api/server/router/plugin/plugin_routes.go | 314 - .../docker/docker/api/server/router/router.go | 19 - .../docker/api/server/router/swarm/backend.go | 36 - .../docker/api/server/router/swarm/cluster.go | 52 - .../api/server/router/swarm/cluster_routes.go | 418 - .../api/server/router/system/backend.go | 21 - .../docker/api/server/router/system/system.go | 39 - .../api/server/router/system/system_routes.go | 186 - .../api/server/router/volume/backend.go | 17 - .../docker/api/server/router/volume/volume.go | 36 - .../api/server/router/volume/volume_routes.go | 80 - .../docker/api/server/router_swapper.go | 30 - .../docker/docker/api/server/server.go | 210 - .../docker/docker/api/server/server_test.go | 46 - .../api/templates/server/operation.gotmpl | 26 - .../docker/api/types/backend/backend.go | 84 - .../docker/api/types/versions/v1p19/types.go | 35 - .../docker/api/types/versions/v1p20/types.go | 40 - .../docker/docker/builder/builder.go | 169 - .../docker/docker/builder/context.go | 260 - .../docker/docker/builder/context_test.go | 307 - .../docker/docker/builder/context_unix.go | 11 - .../docker/docker/builder/context_windows.go | 17 - .../docker/docker/builder/dockerfile/bflag.go | 176 - .../docker/builder/dockerfile/bflag_test.go | 187 - .../docker/builder/dockerfile/builder.go | 370 - .../docker/builder/dockerfile/builder_unix.go | 5 - .../builder/dockerfile/builder_windows.go | 3 - .../builder/dockerfile/command/command.go | 46 - .../docker/builder/dockerfile/dispatchers.go | 821 - .../builder/dockerfile/dispatchers_test.go | 517 - .../builder/dockerfile/dispatchers_unix.go | 27 - .../dockerfile/dispatchers_unix_test.go | 33 - .../builder/dockerfile/dispatchers_windows.go | 86 - .../dockerfile/dispatchers_windows_test.go | 40 - .../docker/builder/dockerfile/envVarTest | 116 - .../docker/builder/dockerfile/evaluator.go | 244 - .../builder/dockerfile/evaluator_test.go | 197 - .../builder/dockerfile/evaluator_unix.go | 9 - .../builder/dockerfile/evaluator_windows.go | 13 - .../docker/builder/dockerfile/internals.go | 669 - .../builder/dockerfile/internals_test.go | 95 - .../builder/dockerfile/internals_unix.go | 38 - .../builder/dockerfile/internals_windows.go | 66 - .../dockerfile/internals_windows_test.go | 51 - .../builder/dockerfile/parser/dumper/main.go | 36 - .../builder/dockerfile/parser/json_test.go | 61 - .../builder/dockerfile/parser/line_parsers.go | 361 - .../builder/dockerfile/parser/parser.go | 221 - .../builder/dockerfile/parser/parser_test.go | 173 - .../parser/testfile-line/Dockerfile | 35 - .../env_no_value/Dockerfile | 3 - .../shykes-nested-json/Dockerfile | 1 - .../testfiles/ADD-COPY-with-JSON/Dockerfile | 11 - .../testfiles/ADD-COPY-with-JSON/result | 10 - .../testfiles/brimstone-consuldock/Dockerfile | 26 - .../testfiles/brimstone-consuldock/result | 5 - .../brimstone-docker-consul/Dockerfile | 52 - .../testfiles/brimstone-docker-consul/result | 9 - .../testfiles/continueIndent/Dockerfile | 36 - .../parser/testfiles/continueIndent/result | 10 - .../testfiles/cpuguy83-nagios/Dockerfile | 54 - .../parser/testfiles/cpuguy83-nagios/result | 40 - .../parser/testfiles/docker/Dockerfile | 103 - .../dockerfile/parser/testfiles/docker/result | 24 - .../parser/testfiles/env/Dockerfile | 23 - .../dockerfile/parser/testfiles/env/result | 16 - .../testfiles/escape-after-comment/Dockerfile | 9 - .../testfiles/escape-after-comment/result | 3 - .../testfiles/escape-nonewline/Dockerfile | 7 - .../parser/testfiles/escape-nonewline/result | 3 - .../parser/testfiles/escape/Dockerfile | 6 - .../dockerfile/parser/testfiles/escape/result | 3 - .../parser/testfiles/escapes/Dockerfile | 14 - .../parser/testfiles/escapes/result | 6 - .../parser/testfiles/flags/Dockerfile | 10 - .../dockerfile/parser/testfiles/flags/result | 10 - .../parser/testfiles/health/Dockerfile | 10 - .../dockerfile/parser/testfiles/health/result | 9 - .../parser/testfiles/influxdb/Dockerfile | 15 - .../parser/testfiles/influxdb/result | 11 - .../Dockerfile | 1 - .../result | 1 - .../Dockerfile | 1 - .../result | 1 - .../Dockerfile | 1 - .../jeztah-invalid-json-single-quotes/result | 1 - .../Dockerfile | 1 - .../result | 1 - .../Dockerfile | 1 - .../result | 1 - .../parser/testfiles/json/Dockerfile | 8 - .../dockerfile/parser/testfiles/json/result | 8 - .../kartar-entrypoint-oddities/Dockerfile | 7 - .../kartar-entrypoint-oddities/result | 7 - .../lk4d4-the-edge-case-generator/Dockerfile | 48 - .../lk4d4-the-edge-case-generator/result | 29 - .../parser/testfiles/mail/Dockerfile | 16 - .../dockerfile/parser/testfiles/mail/result | 14 - .../testfiles/multiple-volumes/Dockerfile | 3 - .../parser/testfiles/multiple-volumes/result | 2 - .../parser/testfiles/mumble/Dockerfile | 7 - .../dockerfile/parser/testfiles/mumble/result | 4 - .../parser/testfiles/nginx/Dockerfile | 14 - .../dockerfile/parser/testfiles/nginx/result | 11 - .../parser/testfiles/tf2/Dockerfile | 23 - .../dockerfile/parser/testfiles/tf2/result | 20 - .../parser/testfiles/weechat/Dockerfile | 9 - .../parser/testfiles/weechat/result | 6 - .../parser/testfiles/znc/Dockerfile | 7 - .../dockerfile/parser/testfiles/znc/result | 5 - .../docker/builder/dockerfile/parser/utils.go | 176 - .../docker/builder/dockerfile/shell_parser.go | 329 - .../builder/dockerfile/shell_parser_test.go | 155 - .../docker/builder/dockerfile/support.go | 19 - .../docker/builder/dockerfile/support_test.go | 65 - .../docker/builder/dockerfile/utils_test.go | 50 - .../docker/builder/dockerfile/wordsTest | 25 - .../docker/docker/builder/dockerignore.go | 48 - .../builder/dockerignore/dockerignore.go | 49 - .../builder/dockerignore/dockerignore_test.go | 57 - .../docker/builder/dockerignore_test.go | 95 - .../github.com/docker/docker/builder/git.go | 28 - .../docker/docker/builder/remote.go | 157 - .../docker/docker/builder/remote_test.go | 213 - .../docker/docker/builder/tarsum.go | 158 - .../docker/docker/builder/tarsum_test.go | 265 - .../docker/docker/builder/utils_test.go | 87 - .../cli/command/bundlefile/bundlefile.go | 69 - .../cli/command/bundlefile/bundlefile_test.go | 77 - .../docker/cli/command/checkpoint/cmd.go | 24 - .../docker/cli/command/checkpoint/create.go | 58 - .../docker/cli/command/checkpoint/list.go | 62 - .../docker/cli/command/checkpoint/remove.go | 44 - .../docker/docker/cli/command/cli.go | 260 - .../docker/cli/command/commands/commands.go | 91 - .../docker/cli/command/container/attach.go | 130 - .../docker/cli/command/container/cmd.go | 46 - .../docker/cli/command/container/commit.go | 76 - .../docker/docker/cli/command/container/cp.go | 303 - .../docker/cli/command/container/create.go | 218 - .../docker/cli/command/container/diff.go | 58 - .../docker/cli/command/container/exec.go | 207 - .../docker/cli/command/container/exec_test.go | 116 - .../docker/cli/command/container/export.go | 59 - .../docker/cli/command/container/hijack.go | 116 - .../docker/cli/command/container/inspect.go | 47 - .../docker/cli/command/container/kill.go | 56 - .../docker/cli/command/container/list.go | 141 - .../docker/cli/command/container/logs.go | 87 - .../docker/cli/command/container/pause.go | 49 - .../docker/cli/command/container/port.go | 78 - .../docker/cli/command/container/prune.go | 75 - .../docker/cli/command/container/ps_test.go | 118 - .../docker/cli/command/container/rename.go | 51 - .../docker/cli/command/container/restart.go | 62 - .../docker/docker/cli/command/container/rm.go | 73 - .../docker/cli/command/container/run.go | 285 - .../docker/cli/command/container/start.go | 179 - .../docker/cli/command/container/stats.go | 243 - .../cli/command/container/stats_helpers.go | 226 - .../cli/command/container/stats_unit_test.go | 20 - .../docker/cli/command/container/stop.go | 67 - .../docker/cli/command/container/top.go | 58 - .../docker/cli/command/container/tty.go | 103 - .../docker/cli/command/container/unpause.go | 50 - .../docker/cli/command/container/update.go | 163 - .../docker/cli/command/container/utils.go | 143 - .../docker/cli/command/container/wait.go | 50 - .../docker/docker/cli/command/events_utils.go | 49 - .../docker/cli/command/formatter/container.go | 235 - .../cli/command/formatter/container_test.go | 398 - .../docker/cli/command/formatter/custom.go | 51 - .../cli/command/formatter/custom_test.go | 28 - .../cli/command/formatter/disk_usage.go | 334 - .../docker/cli/command/formatter/formatter.go | 123 - .../docker/cli/command/formatter/image.go | 259 - .../cli/command/formatter/image_test.go | 333 - .../docker/cli/command/formatter/network.go | 117 - .../cli/command/formatter/network_test.go | 208 - .../docker/cli/command/formatter/reflect.go | 65 - .../cli/command/formatter/reflect_test.go | 66 - .../docker/cli/command/formatter/service.go | 322 - .../docker/cli/command/formatter/stats.go | 211 - .../cli/command/formatter/stats_test.go | 228 - .../docker/cli/command/formatter/volume.go | 121 - .../cli/command/formatter/volume_test.go | 189 - .../cli/command/idresolver/idresolver.go | 90 - .../docker/docker/cli/command/image/build.go | 477 - .../docker/docker/cli/command/image/cmd.go | 33 - .../docker/cli/command/image/history.go | 99 - .../docker/docker/cli/command/image/import.go | 88 - .../docker/cli/command/image/inspect.go | 44 - .../docker/docker/cli/command/image/list.go | 96 - .../docker/docker/cli/command/image/load.go | 77 - .../docker/docker/cli/command/image/prune.go | 92 - .../docker/docker/cli/command/image/pull.go | 84 - .../docker/docker/cli/command/image/push.go | 61 - .../docker/docker/cli/command/image/remove.go | 77 - .../docker/docker/cli/command/image/save.go | 57 - .../docker/docker/cli/command/image/tag.go | 41 - .../docker/docker/cli/command/image/trust.go | 381 - .../docker/cli/command/image/trust_test.go | 57 - .../docker/docker/cli/command/in.go | 75 - .../docker/cli/command/inspect/inspector.go | 195 - .../cli/command/inspect/inspector_test.go | 221 - .../docker/docker/cli/command/network/cmd.go | 28 - .../docker/cli/command/network/connect.go | 64 - .../docker/cli/command/network/create.go | 226 - .../docker/cli/command/network/disconnect.go | 41 - .../docker/cli/command/network/inspect.go | 45 - .../docker/docker/cli/command/network/list.go | 76 - .../docker/cli/command/network/prune.go | 73 - .../docker/cli/command/network/remove.go | 43 - .../docker/docker/cli/command/node/cmd.go | 43 - .../docker/docker/cli/command/node/demote.go | 36 - .../docker/docker/cli/command/node/inspect.go | 144 - .../docker/docker/cli/command/node/list.go | 115 - .../docker/docker/cli/command/node/opts.go | 60 - .../docker/docker/cli/command/node/promote.go | 36 - .../docker/docker/cli/command/node/ps.go | 93 - .../docker/docker/cli/command/node/remove.go | 56 - .../docker/docker/cli/command/node/update.go | 121 - .../docker/docker/cli/command/out.go | 69 - .../docker/docker/cli/command/plugin/cmd.go | 31 - .../docker/cli/command/plugin/create.go | 125 - .../docker/cli/command/plugin/disable.go | 36 - .../docker/cli/command/plugin/enable.go | 47 - .../docker/cli/command/plugin/inspect.go | 42 - .../docker/cli/command/plugin/install.go | 208 - .../docker/docker/cli/command/plugin/list.go | 63 - .../docker/docker/cli/command/plugin/push.go | 71 - .../docker/cli/command/plugin/remove.go | 55 - .../docker/docker/cli/command/plugin/set.go | 22 - .../docker/cli/command/plugin/upgrade.go | 100 - .../docker/docker/cli/command/prune/prune.go | 50 - .../docker/docker/cli/command/registry.go | 186 - .../docker/cli/command/registry/login.go | 85 - .../docker/cli/command/registry/logout.go | 77 - .../docker/cli/command/registry/search.go | 126 - .../docker/docker/cli/command/secret/cmd.go | 25 - .../docker/cli/command/secret/create.go | 79 - .../docker/cli/command/secret/inspect.go | 45 - .../docker/docker/cli/command/secret/ls.go | 68 - .../docker/cli/command/secret/remove.go | 57 - .../docker/docker/cli/command/secret/utils.go | 76 - .../docker/docker/cli/command/service/cmd.go | 29 - .../docker/cli/command/service/create.go | 100 - .../docker/cli/command/service/inspect.go | 84 - .../cli/command/service/inspect_test.go | 129 - .../docker/docker/cli/command/service/list.go | 158 - .../docker/docker/cli/command/service/logs.go | 163 - .../docker/docker/cli/command/service/opts.go | 648 - .../docker/cli/command/service/opts_test.go | 107 - .../docker/cli/command/service/parse.go | 68 - .../docker/docker/cli/command/service/ps.go | 76 - .../docker/cli/command/service/remove.go | 47 - .../docker/cli/command/service/scale.go | 96 - .../docker/cli/command/service/trust.go | 96 - .../docker/cli/command/service/update.go | 849 - .../docker/cli/command/service/update_test.go | 384 - .../docker/docker/cli/command/stack/cmd.go | 35 - .../docker/docker/cli/command/stack/common.go | 60 - .../docker/docker/cli/command/stack/deploy.go | 357 - .../cli/command/stack/deploy_bundlefile.go | 83 - .../docker/docker/cli/command/stack/list.go | 113 - .../docker/docker/cli/command/stack/opts.go | 49 - .../docker/docker/cli/command/stack/ps.go | 61 - .../docker/docker/cli/command/stack/remove.go | 112 - .../docker/cli/command/stack/services.go | 79 - .../docker/docker/cli/command/swarm/cmd.go | 28 - .../docker/docker/cli/command/swarm/init.go | 85 - .../docker/docker/cli/command/swarm/join.go | 69 - .../docker/cli/command/swarm/join_token.go | 105 - .../docker/docker/cli/command/swarm/leave.go | 44 - .../docker/docker/cli/command/swarm/opts.go | 209 - .../docker/cli/command/swarm/opts_test.go | 37 - .../docker/docker/cli/command/swarm/unlock.go | 54 - .../docker/cli/command/swarm/unlock_key.go | 79 - .../docker/docker/cli/command/swarm/update.go | 72 - .../docker/docker/cli/command/system/cmd.go | 26 - .../docker/docker/cli/command/system/df.go | 56 - .../docker/cli/command/system/events.go | 140 - .../docker/docker/cli/command/system/info.go | 334 - .../docker/cli/command/system/inspect.go | 203 - .../docker/docker/cli/command/system/prune.go | 93 - .../docker/cli/command/system/version.go | 113 - .../docker/docker/cli/command/task/print.go | 161 - .../docker/docker/cli/command/trust.go | 39 - .../docker/docker/cli/command/utils.go | 87 - .../docker/docker/cli/command/volume/cmd.go | 45 - .../docker/cli/command/volume/create.go | 111 - .../docker/cli/command/volume/inspect.go | 55 - .../docker/docker/cli/command/volume/list.go | 91 - .../docker/docker/cli/command/volume/prune.go | 75 - .../docker/cli/command/volume/remove.go | 68 - .../docker/cli/compose/convert/compose.go | 116 - .../cli/compose/convert/compose_test.go | 122 - .../docker/cli/compose/convert/service.go | 416 - .../cli/compose/convert/service_test.go | 216 - .../docker/cli/compose/convert/volume.go | 128 - .../docker/cli/compose/convert/volume_test.go | 133 - .../compose/interpolation/interpolation.go | 90 - .../interpolation/interpolation_test.go | 59 - .../docker/cli/compose/loader/example1.env | 8 - .../docker/cli/compose/loader/example2.env | 1 - .../cli/compose/loader/full-example.yml | 287 - .../docker/cli/compose/loader/loader.go | 653 - .../docker/cli/compose/loader/loader_test.go | 800 - .../docker/cli/compose/schema/bindata.go | 260 - .../schema/data/config_schema_v3.0.json | 383 - .../schema/data/config_schema_v3.1.json | 428 - .../docker/cli/compose/schema/schema.go | 137 - .../docker/cli/compose/schema/schema_test.go | 52 - .../docker/cli/compose/template/template.go | 100 - .../cli/compose/template/template_test.go | 83 - .../docker/docker/cli/compose/types/types.go | 253 - .../docker/docker/cli/flags/client.go | 13 - .../docker/docker/cli/flags/common.go | 120 - .../docker/docker/cli/flags/common_test.go | 42 - .../docker/docker/cli/trust/trust.go | 232 - .../docker/docker/cliconfig/config.go | 120 - .../docker/docker/cliconfig/config_test.go | 621 - .../docker/cliconfig/configfile/file.go | 183 - .../docker/cliconfig/configfile/file_test.go | 27 - .../cliconfig/credentials/credentials.go | 17 - .../cliconfig/credentials/default_store.go | 22 - .../credentials/default_store_darwin.go | 3 - .../credentials/default_store_linux.go | 3 - .../credentials/default_store_unsupported.go | 5 - .../credentials/default_store_windows.go | 3 - .../cliconfig/credentials/file_store.go | 53 - .../cliconfig/credentials/file_store_test.go | 139 - .../cliconfig/credentials/native_store.go | 144 - .../credentials/native_store_test.go | 355 - .../docker/docker/client/testdata/ca.pem | 18 - .../docker/docker/client/testdata/cert.pem | 18 - .../docker/docker/client/testdata/key.pem | 27 - .../docker/docker/cmd/docker/daemon_none.go | 27 - .../docker/cmd/docker/daemon_none_test.go | 17 - .../docker/cmd/docker/daemon_unit_test.go | 30 - .../docker/docker/cmd/docker/daemon_unix.go | 79 - .../docker/docker/cmd/docker/docker.go | 180 - .../docker/docker/cmd/docker/docker_test.go | 32 - .../docker/cmd/docker/docker_windows.go | 18 - .../docker/docker/cmd/dockerd/README.md | 3 - .../docker/docker/cmd/dockerd/daemon.go | 524 - .../docker/cmd/dockerd/daemon_freebsd.go | 5 - .../docker/docker/cmd/dockerd/daemon_linux.go | 11 - .../docker/cmd/dockerd/daemon_solaris.go | 85 - .../docker/docker/cmd/dockerd/daemon_test.go | 145 - .../docker/docker/cmd/dockerd/daemon_unix.go | 137 - .../docker/cmd/dockerd/daemon_unix_test.go | 114 - .../docker/cmd/dockerd/daemon_windows.go | 92 - .../docker/docker/cmd/dockerd/docker.go | 110 - .../docker/cmd/dockerd/docker_windows.go | 18 - .../dockerd/hack/malformed_host_override.go | 121 - .../hack/malformed_host_override_test.go | 124 - .../docker/docker/cmd/dockerd/metrics.go | 27 - .../docker/cmd/dockerd/service_unsupported.go | 14 - .../docker/cmd/dockerd/service_windows.go | 426 - .../docker/docker/container/archive.go | 76 - .../docker/docker/container/container.go | 1103 - .../docker/container/container_linux.go | 9 - .../docker/container/container_notlinux.go | 23 - .../docker/container/container_unit_test.go | 60 - .../docker/docker/container/container_unix.go | 448 - .../docker/container/container_windows.go | 111 - .../docker/docker/container/health.go | 49 - .../docker/docker/container/history.go | 30 - .../docker/docker/container/memory_store.go | 95 - .../docker/container/memory_store_test.go | 106 - .../docker/docker/container/monitor.go | 46 - .../docker/docker/container/mounts_unix.go | 12 - .../docker/docker/container/mounts_windows.go | 8 - .../docker/docker/container/state.go | 343 - .../docker/docker/container/state_solaris.go | 7 - .../docker/docker/container/state_test.go | 113 - .../docker/docker/container/state_unix.go | 10 - .../docker/docker/container/state_windows.go | 7 - .../docker/docker/container/store.go | 28 - .../docker/docker/container/stream/streams.go | 143 - .../docker/docker/contrib/README.md | 4 - .../docker/docker/contrib/REVIEWERS | 1 - .../docker/docker/contrib/apparmor/main.go | 56 - .../docker/contrib/apparmor/template.go | 268 - .../contrib/builder/deb/aarch64/build.sh | 10 - .../contrib/builder/deb/aarch64/generate.sh | 118 - .../deb/aarch64/ubuntu-trusty/Dockerfile | 24 - .../deb/aarch64/ubuntu-xenial/Dockerfile | 22 - .../contrib/builder/deb/amd64/README.md | 5 - .../docker/contrib/builder/deb/amd64/build.sh | 10 - .../deb/amd64/debian-jessie/Dockerfile | 20 - .../deb/amd64/debian-stretch/Dockerfile | 20 - .../deb/amd64/debian-wheezy/Dockerfile | 22 - .../contrib/builder/deb/amd64/generate.sh | 149 - .../deb/amd64/ubuntu-precise/Dockerfile | 16 - .../deb/amd64/ubuntu-trusty/Dockerfile | 16 - .../deb/amd64/ubuntu-xenial/Dockerfile | 16 - .../deb/amd64/ubuntu-yakkety/Dockerfile | 16 - .../deb/armhf/debian-jessie/Dockerfile | 20 - .../contrib/builder/deb/armhf/generate.sh | 158 - .../deb/armhf/raspbian-jessie/Dockerfile | 22 - .../deb/armhf/ubuntu-trusty/Dockerfile | 16 - .../deb/armhf/ubuntu-xenial/Dockerfile | 16 - .../deb/armhf/ubuntu-yakkety/Dockerfile | 16 - .../contrib/builder/deb/ppc64le/build.sh | 10 - .../contrib/builder/deb/ppc64le/generate.sh | 103 - .../deb/ppc64le/ubuntu-trusty/Dockerfile | 16 - .../deb/ppc64le/ubuntu-xenial/Dockerfile | 16 - .../deb/ppc64le/ubuntu-yakkety/Dockerfile | 16 - .../docker/contrib/builder/deb/s390x/build.sh | 10 - .../contrib/builder/deb/s390x/generate.sh | 96 - .../deb/s390x/ubuntu-xenial/Dockerfile | 16 - .../contrib/builder/rpm/amd64/README.md | 5 - .../docker/contrib/builder/rpm/amd64/build.sh | 10 - .../builder/rpm/amd64/centos-7/Dockerfile | 19 - .../builder/rpm/amd64/fedora-24/Dockerfile | 19 - .../builder/rpm/amd64/fedora-25/Dockerfile | 19 - .../contrib/builder/rpm/amd64/generate.sh | 189 - .../rpm/amd64/opensuse-13.2/Dockerfile | 18 - .../rpm/amd64/oraclelinux-6/Dockerfile | 28 - .../rpm/amd64/oraclelinux-7/Dockerfile | 18 - .../builder/rpm/amd64/photon-1.0/Dockerfile | 18 - .../docker/docker/contrib/check-config.sh | 354 - .../docker/contrib/completion/REVIEWERS | 2 - .../docker/contrib/completion/bash/docker | 4282 - .../contrib/completion/fish/docker.fish | 405 - .../contrib/completion/powershell/readme.txt | 1 - .../docker/contrib/completion/zsh/REVIEWERS | 2 - .../docker/contrib/completion/zsh/_docker | 2787 - .../contrib/desktop-integration/README.md | 11 - .../desktop-integration/chromium/Dockerfile | 36 - .../desktop-integration/gparted/Dockerfile | 31 - .../contrib/docker-device-tool/README.md | 14 - .../contrib/docker-device-tool/device_tool.go | 176 - .../docker-device-tool/device_tool_windows.go | 4 - .../docker/docker/contrib/dockerize-disk.sh | 118 - .../contrib/download-frozen-image-v1.sh | 108 - .../contrib/download-frozen-image-v2.sh | 121 - .../docker/docker/contrib/editorconfig | 13 - .../docker/docker/contrib/gitdm/aliases | 148 - .../docker/docker/contrib/gitdm/domain-map | 39 - .../docker/contrib/gitdm/generate_aliases.sh | 16 - .../docker/docker/contrib/gitdm/gitdm.config | 17 - .../docker/contrib/httpserver/Dockerfile | 4 - .../contrib/httpserver/Dockerfile.solaris | 4 - .../docker/contrib/httpserver/server.go | 12 - .../docker/contrib/init/openrc/docker.confd | 13 - .../docker/contrib/init/openrc/docker.initd | 22 - .../docker/contrib/init/systemd/REVIEWERS | 3 - .../contrib/init/systemd/docker.service | 29 - .../contrib/init/systemd/docker.service.rpm | 28 - .../docker/contrib/init/systemd/docker.socket | 12 - .../contrib/init/sysvinit-debian/docker | 152 - .../init/sysvinit-debian/docker.default | 20 - .../contrib/init/sysvinit-redhat/docker | 153 - .../init/sysvinit-redhat/docker.sysconfig | 7 - .../docker/contrib/init/upstart/REVIEWERS | 2 - .../docker/contrib/init/upstart/docker.conf | 72 - .../docker/contrib/mac-install-bundle.sh | 45 - .../docker/docker/contrib/mkimage-alpine.sh | 87 - .../docker/contrib/mkimage-arch-pacman.conf | 92 - .../docker/docker/contrib/mkimage-arch.sh | 126 - .../contrib/mkimage-archarm-pacman.conf | 98 - .../docker/docker/contrib/mkimage-busybox.sh | 43 - .../docker/docker/contrib/mkimage-crux.sh | 75 - .../docker/contrib/mkimage-debootstrap.sh | 297 - .../docker/docker/contrib/mkimage-pld.sh | 73 - .../docker/docker/contrib/mkimage-rinse.sh | 123 - .../docker/docker/contrib/mkimage-yum.sh | 136 - .../docker/docker/contrib/mkimage.sh | 128 - .../contrib/mkimage/.febootstrap-minimize | 28 - .../docker/contrib/mkimage/busybox-static | 34 - .../docker/docker/contrib/mkimage/debootstrap | 226 - .../docker/contrib/mkimage/mageia-urpmi | 61 - .../docker/docker/contrib/mkimage/rinse | 25 - .../docker/docker/contrib/mkimage/solaris | 89 - .../docker/docker/contrib/nnp-test/Dockerfile | 9 - .../docker/docker/contrib/nnp-test/nnp-test.c | 10 - .../docker/contrib/nuke-graph-directory.sh | 64 - .../docker/docker/contrib/project-stats.sh | 22 - .../docker/docker/contrib/report-issue.sh | 105 - .../docker/docker/contrib/reprepro/suites.sh | 12 - .../docker-engine-selinux/LICENSE | 339 - .../docker-engine-selinux/Makefile | 23 - .../docker-engine-selinux/README.md | 1 - .../docker-engine-selinux/docker.fc | 29 - .../docker-engine-selinux/docker.if | 523 - .../docker-engine-selinux/docker.te | 399 - .../docker-engine-selinux/LICENSE | 339 - .../docker-engine-selinux/Makefile | 23 - .../docker-engine-selinux/README.md | 1 - .../docker-engine-selinux/docker.fc | 33 - .../docker-engine-selinux/docker.if | 659 - .../docker-engine-selinux/docker.te | 465 - .../selinux/docker-engine-selinux/LICENSE | 340 - .../selinux/docker-engine-selinux/Makefile | 16 - .../selinux/docker-engine-selinux/docker.fc | 18 - .../selinux/docker-engine-selinux/docker.if | 461 - .../selinux/docker-engine-selinux/docker.te | 407 - .../docker-engine-selinux/docker_selinux.8.gz | Bin 2847 -> 0 bytes .../contrib/syntax/nano/Dockerfile.nanorc | 26 - .../docker/contrib/syntax/nano/README.md | 32 - .../Preferences/Dockerfile.tmPreferences | 24 - .../Syntaxes/Dockerfile.tmLanguage | 143 - .../textmate/Docker.tmbundle/info.plist | 16 - .../docker/contrib/syntax/textmate/README.md | 17 - .../docker/contrib/syntax/textmate/REVIEWERS | 1 - .../docker/docker/contrib/syntax/vim/LICENSE | 22 - .../docker/contrib/syntax/vim/README.md | 26 - .../contrib/syntax/vim/doc/dockerfile.txt | 18 - .../syntax/vim/ftdetect/dockerfile.vim | 1 - .../contrib/syntax/vim/syntax/dockerfile.vim | 31 - .../docker/contrib/syscall-test/Dockerfile | 15 - .../docker/docker/contrib/syscall-test/acct.c | 16 - .../docker/contrib/syscall-test/exit32.s | 7 - .../docker/docker/contrib/syscall-test/ns.c | 63 - .../docker/docker/contrib/syscall-test/raw.c | 14 - .../docker/contrib/syscall-test/setgid.c | 11 - .../docker/contrib/syscall-test/setuid.c | 11 - .../docker/contrib/syscall-test/socket.c | 30 - .../docker/contrib/syscall-test/userns.c | 63 - .../docker/contrib/udev/80-docker.rules | 3 - .../docker/contrib/vagrant-docker/README.md | 50 - .../docker/docker/daemon/apparmor_default.go | 36 - .../daemon/apparmor_default_unsupported.go | 7 - .../docker/docker/daemon/archive.go | 436 - .../docker/docker/daemon/archive_unix.go | 58 - .../docker/docker/daemon/archive_windows.go | 18 - .../github.com/docker/docker/daemon/attach.go | 147 - .../github.com/docker/docker/daemon/auth.go | 13 - .../docker/docker/daemon/bindmount_solaris.go | 5 - .../docker/docker/daemon/bindmount_unix.go | 5 - .../github.com/docker/docker/daemon/cache.go | 254 - .../docker/docker/daemon/caps/utils_unix.go | 131 - .../docker/docker/daemon/changes.go | 31 - .../docker/docker/daemon/checkpoint.go | 110 - .../docker/docker/daemon/cluster.go | 12 - .../docker/docker/daemon/cluster/cluster.go | 1973 - .../daemon/cluster/convert/container.go | 235 - .../docker/daemon/cluster/convert/network.go | 210 - .../docker/daemon/cluster/convert/node.go | 89 - .../docker/daemon/cluster/convert/secret.go | 64 - .../docker/daemon/cluster/convert/service.go | 366 - .../docker/daemon/cluster/convert/swarm.go | 122 - .../docker/daemon/cluster/convert/task.go | 81 - .../docker/daemon/cluster/executor/backend.go | 61 - .../cluster/executor/container/adapter.go | 463 - .../cluster/executor/container/attachment.go | 81 - .../cluster/executor/container/container.go | 598 - .../cluster/executor/container/controller.go | 672 - .../cluster/executor/container/errors.go | 15 - .../cluster/executor/container/executor.go | 194 - .../cluster/executor/container/health_test.go | 102 - .../cluster/executor/container/validate.go | 39 - .../executor/container/validate_test.go | 141 - .../executor/container/validate_unix_test.go | 8 - .../container/validate_windows_test.go | 8 - .../docker/docker/daemon/cluster/filters.go | 116 - .../docker/docker/daemon/cluster/helpers.go | 108 - .../docker/daemon/cluster/listen_addr.go | 278 - .../daemon/cluster/listen_addr_linux.go | 91 - .../daemon/cluster/listen_addr_others.go | 9 - .../daemon/cluster/listen_addr_solaris.go | 57 - .../docker/daemon/cluster/provider/network.go | 37 - .../docker/docker/daemon/cluster/secrets.go | 133 - .../github.com/docker/docker/daemon/commit.go | 271 - .../github.com/docker/docker/daemon/config.go | 525 - .../docker/daemon/config_common_unix.go | 90 - .../docker/daemon/config_experimental.go | 8 - .../docker/docker/daemon/config_solaris.go | 47 - .../docker/docker/daemon/config_test.go | 229 - .../docker/docker/daemon/config_unix.go | 104 - .../docker/docker/daemon/config_unix_test.go | 80 - .../docker/docker/daemon/config_windows.go | 71 - .../docker/daemon/config_windows_test.go | 59 - .../docker/docker/daemon/container.go | 282 - .../docker/daemon/container_operations.go | 1049 - .../daemon/container_operations_solaris.go | 46 - .../daemon/container_operations_unix.go | 281 - .../daemon/container_operations_windows.go | 59 - .../github.com/docker/docker/daemon/create.go | 290 - .../docker/docker/daemon/create_unix.go | 81 - .../docker/docker/daemon/create_windows.go | 80 - .../github.com/docker/docker/daemon/daemon.go | 1321 - .../docker/daemon/daemon_experimental.go | 7 - .../docker/docker/daemon/daemon_linux.go | 80 - .../docker/docker/daemon/daemon_linux_test.go | 104 - .../docker/docker/daemon/daemon_solaris.go | 523 - .../docker/docker/daemon/daemon_test.go | 627 - .../docker/docker/daemon/daemon_unix.go | 1237 - .../docker/docker/daemon/daemon_unix_test.go | 283 - .../docker/daemon/daemon_unsupported.go | 5 - .../docker/docker/daemon/daemon_windows.go | 604 - .../docker/docker/daemon/debugtrap.go | 62 - .../docker/docker/daemon/debugtrap_unix.go | 33 - .../docker/daemon/debugtrap_unsupported.go | 7 - .../docker/docker/daemon/debugtrap_windows.go | 52 - .../github.com/docker/docker/daemon/delete.go | 168 - .../docker/docker/daemon/delete_test.go | 43 - .../docker/docker/daemon/discovery.go | 215 - .../docker/docker/daemon/discovery_test.go | 164 - .../docker/docker/daemon/disk_usage.go | 100 - .../github.com/docker/docker/daemon/errors.go | 57 - .../github.com/docker/docker/daemon/events.go | 132 - .../docker/docker/daemon/events/events.go | 158 - .../docker/daemon/events/events_test.go | 275 - .../docker/docker/daemon/events/filter.go | 110 - .../docker/docker/daemon/events/metrics.go | 15 - .../daemon/events/testutils/testutils.go | 76 - .../docker/docker/daemon/events_test.go | 94 - .../github.com/docker/docker/daemon/exec.go | 280 - .../docker/docker/daemon/exec/exec.go | 118 - .../docker/docker/daemon/exec_linux.go | 27 - .../docker/docker/daemon/exec_solaris.go | 11 - .../docker/docker/daemon/exec_windows.go | 14 - .../github.com/docker/docker/daemon/export.go | 60 - .../docker/docker/daemon/getsize_unix.go | 41 - .../docker/daemon/graphdriver/aufs/aufs.go | 669 - .../daemon/graphdriver/aufs/aufs_test.go | 802 - .../docker/daemon/graphdriver/aufs/dirs.go | 64 - .../docker/daemon/graphdriver/aufs/mount.go | 21 - .../daemon/graphdriver/aufs/mount_linux.go | 7 - .../graphdriver/aufs/mount_unsupported.go | 12 - .../docker/daemon/graphdriver/btrfs/btrfs.go | 530 - .../daemon/graphdriver/btrfs/btrfs_test.go | 63 - .../graphdriver/btrfs/dummy_unsupported.go | 3 - .../daemon/graphdriver/btrfs/version.go | 26 - .../daemon/graphdriver/btrfs/version_none.go | 14 - .../daemon/graphdriver/btrfs/version_test.go | 13 - .../docker/daemon/graphdriver/counter.go | 67 - .../daemon/graphdriver/devmapper/README.md | 96 - .../daemon/graphdriver/devmapper/deviceset.go | 2727 - .../graphdriver/devmapper/devmapper_doc.go | 106 - .../graphdriver/devmapper/devmapper_test.go | 110 - .../daemon/graphdriver/devmapper/driver.go | 231 - .../daemon/graphdriver/devmapper/mount.go | 89 - .../docker/daemon/graphdriver/driver.go | 270 - .../daemon/graphdriver/driver_freebsd.go | 19 - .../docker/daemon/graphdriver/driver_linux.go | 135 - .../daemon/graphdriver/driver_solaris.go | 97 - .../daemon/graphdriver/driver_unsupported.go | 15 - .../daemon/graphdriver/driver_windows.go | 14 - .../docker/daemon/graphdriver/fsdiff.go | 169 - .../graphdriver/graphtest/graphbench_unix.go | 259 - .../graphdriver/graphtest/graphtest_unix.go | 358 - .../graphtest/graphtest_windows.go | 1 - .../daemon/graphdriver/graphtest/testutil.go | 342 - .../graphdriver/graphtest/testutil_unix.go | 143 - .../docker/daemon/graphdriver/overlay/copy.go | 174 - .../daemon/graphdriver/overlay/overlay.go | 462 - .../graphdriver/overlay/overlay_test.go | 93 - .../overlay/overlay_unsupported.go | 3 - .../daemon/graphdriver/overlay2/check.go | 79 - .../daemon/graphdriver/overlay2/mount.go | 88 - .../daemon/graphdriver/overlay2/overlay.go | 662 - .../graphdriver/overlay2/overlay_test.go | 121 - .../overlay2/overlay_unsupported.go | 3 - .../daemon/graphdriver/overlay2/randomid.go | 80 - .../graphdriver/overlayutils/overlayutils.go | 18 - .../docker/daemon/graphdriver/plugin.go | 43 - .../docker/docker/daemon/graphdriver/proxy.go | 252 - .../daemon/graphdriver/quota/projectquota.go | 339 - .../graphdriver/register/register_aufs.go | 8 - .../graphdriver/register/register_btrfs.go | 8 - .../register/register_devicemapper.go | 8 - .../graphdriver/register/register_overlay.go | 9 - .../graphdriver/register/register_vfs.go | 6 - .../graphdriver/register/register_windows.go | 6 - .../graphdriver/register/register_zfs.go | 8 - .../docker/daemon/graphdriver/vfs/driver.go | 145 - .../docker/daemon/graphdriver/vfs/vfs_test.go | 37 - .../daemon/graphdriver/windows/windows.go | 886 - .../docker/daemon/graphdriver/zfs/MAINTAINERS | 2 - .../docker/daemon/graphdriver/zfs/zfs.go | 417 - .../daemon/graphdriver/zfs/zfs_freebsd.go | 38 - .../daemon/graphdriver/zfs/zfs_linux.go | 27 - .../daemon/graphdriver/zfs/zfs_solaris.go | 59 - .../docker/daemon/graphdriver/zfs/zfs_test.go | 35 - .../daemon/graphdriver/zfs/zfs_unsupported.go | 11 - .../github.com/docker/docker/daemon/health.go | 341 - .../docker/docker/daemon/health_test.go | 118 - .../github.com/docker/docker/daemon/image.go | 76 - .../docker/docker/daemon/image_delete.go | 412 - .../docker/docker/daemon/image_exporter.go | 25 - .../docker/docker/daemon/image_history.go | 84 - .../docker/docker/daemon/image_inspect.go | 82 - .../docker/docker/daemon/image_pull.go | 149 - .../docker/docker/daemon/image_push.go | 63 - .../docker/docker/daemon/image_tag.go | 37 - .../github.com/docker/docker/daemon/images.go | 331 - .../github.com/docker/docker/daemon/import.go | 135 - .../github.com/docker/docker/daemon/info.go | 180 - .../docker/docker/daemon/info_unix.go | 82 - .../docker/docker/daemon/info_windows.go | 10 - .../docker/daemon/initlayer/setup_solaris.go | 13 - .../docker/daemon/initlayer/setup_unix.go | 69 - .../docker/daemon/initlayer/setup_windows.go | 13 - .../docker/docker/daemon/inspect.go | 264 - .../docker/docker/daemon/inspect_solaris.go | 41 - .../docker/docker/daemon/inspect_unix.go | 92 - .../docker/docker/daemon/inspect_windows.go | 41 - .../github.com/docker/docker/daemon/keys.go | 59 - .../docker/docker/daemon/keys_unsupported.go | 8 - .../github.com/docker/docker/daemon/kill.go | 164 - .../github.com/docker/docker/daemon/links.go | 87 - .../docker/docker/daemon/links/links.go | 141 - .../docker/docker/daemon/links/links_test.go | 213 - .../docker/docker/daemon/links_linux.go | 72 - .../docker/docker/daemon/links_linux_test.go | 98 - .../docker/docker/daemon/links_notlinux.go | 10 - .../github.com/docker/docker/daemon/list.go | 660 - .../docker/docker/daemon/list_unix.go | 11 - .../docker/docker/daemon/list_windows.go | 20 - .../docker/docker/daemon/logdrivers_linux.go | 15 - .../docker/daemon/logdrivers_windows.go | 13 - .../daemon/logger/awslogs/cloudwatchlogs.go | 404 - .../logger/awslogs/cloudwatchlogs_test.go | 724 - .../logger/awslogs/cwlogsiface_mock_test.go | 77 - .../docker/docker/daemon/logger/context.go | 111 - .../docker/docker/daemon/logger/copier.go | 131 - .../docker/daemon/logger/copier_test.go | 296 - .../daemon/logger/etwlogs/etwlogs_windows.go | 170 - .../docker/docker/daemon/logger/factory.go | 104 - .../docker/daemon/logger/fluentd/fluentd.go | 246 - .../daemon/logger/gcplogs/gcplogging.go | 200 - .../docker/docker/daemon/logger/gelf/gelf.go | 209 - .../daemon/logger/gelf/gelf_unsupported.go | 3 - .../docker/daemon/logger/journald/journald.go | 122 - .../daemon/logger/journald/journald_test.go | 23 - .../logger/journald/journald_unsupported.go | 6 - .../docker/daemon/logger/journald/read.go | 401 - .../daemon/logger/journald/read_native.go | 6 - .../logger/journald/read_native_compat.go | 6 - .../logger/journald/read_unsupported.go | 7 - .../daemon/logger/jsonfilelog/jsonfilelog.go | 151 - .../logger/jsonfilelog/jsonfilelog_test.go | 248 - .../docker/daemon/logger/jsonfilelog/read.go | 319 - .../daemon/logger/logentries/logentries.go | 94 - .../docker/docker/daemon/logger/logger.go | 134 - .../docker/daemon/logger/logger_test.go | 26 - .../daemon/logger/loggerutils/log_tag.go | 31 - .../daemon/logger/loggerutils/log_tag_test.go | 47 - .../logger/loggerutils/rotatefilewriter.go | 124 - .../docker/daemon/logger/splunk/splunk.go | 621 - .../daemon/logger/splunk/splunk_test.go | 1302 - .../logger/splunk/splunkhecmock_test.go | 157 - .../docker/daemon/logger/syslog/syslog.go | 262 - .../daemon/logger/syslog/syslog_test.go | 62 - .../github.com/docker/docker/daemon/logs.go | 142 - .../docker/docker/daemon/logs_test.go | 15 - .../docker/docker/daemon/metrics.go | 42 - .../docker/docker/daemon/monitor.go | 132 - .../docker/docker/daemon/monitor_linux.go | 19 - .../docker/docker/daemon/monitor_solaris.go | 18 - .../docker/docker/daemon/monitor_windows.go | 46 - .../github.com/docker/docker/daemon/mounts.go | 48 - .../github.com/docker/docker/daemon/names.go | 116 - .../docker/docker/daemon/network.go | 498 - .../docker/docker/daemon/network/settings.go | 33 - .../docker/docker/daemon/oci_linux.go | 790 - .../docker/docker/daemon/oci_solaris.go | 188 - .../docker/docker/daemon/oci_windows.go | 122 - .../github.com/docker/docker/daemon/pause.go | 49 - .../github.com/docker/docker/daemon/prune.go | 236 - .../github.com/docker/docker/daemon/rename.go | 122 - .../github.com/docker/docker/daemon/resize.go | 40 - .../docker/docker/daemon/restart.go | 70 - .../github.com/docker/docker/daemon/search.go | 94 - .../docker/docker/daemon/search_test.go | 358 - .../docker/docker/daemon/seccomp_disabled.go | 19 - .../docker/docker/daemon/seccomp_linux.go | 55 - .../docker/daemon/seccomp_unsupported.go | 5 - .../docker/docker/daemon/secrets.go | 36 - .../docker/docker/daemon/secrets_linux.go | 7 - .../docker/daemon/secrets_unsupported.go | 7 - .../docker/docker/daemon/selinux_linux.go | 17 - .../docker/daemon/selinux_unsupported.go | 13 - .../github.com/docker/docker/daemon/start.go | 230 - .../docker/docker/daemon/start_unix.go | 31 - .../docker/docker/daemon/start_windows.go | 205 - .../github.com/docker/docker/daemon/stats.go | 158 - .../docker/docker/daemon/stats_collector.go | 132 - .../docker/daemon/stats_collector_solaris.go | 34 - .../docker/daemon/stats_collector_unix.go | 71 - .../docker/daemon/stats_collector_windows.go | 15 - .../docker/docker/daemon/stats_unix.go | 58 - .../docker/docker/daemon/stats_windows.go | 11 - .../github.com/docker/docker/daemon/stop.go | 83 - .../docker/docker/daemon/top_unix.go | 126 - .../docker/docker/daemon/top_unix_test.go | 76 - .../docker/docker/daemon/top_windows.go | 53 - .../docker/docker/daemon/unpause.go | 38 - .../github.com/docker/docker/daemon/update.go | 92 - .../docker/docker/daemon/update_linux.go | 25 - .../docker/docker/daemon/update_solaris.go | 11 - .../docker/docker/daemon/update_windows.go | 13 - .../docker/docker/daemon/volumes.go | 303 - .../docker/docker/daemon/volumes_unit_test.go | 39 - .../docker/docker/daemon/volumes_unix.go | 219 - .../docker/docker/daemon/volumes_windows.go | 47 - .../github.com/docker/docker/daemon/wait.go | 32 - .../docker/docker/daemon/workdir.go | 21 - .../docker/docker/distribution/config.go | 241 - .../docker/docker/distribution/errors.go | 159 - .../fixtures/validate_manifest/bad_manifest | 38 - .../validate_manifest/extra_data_manifest | 46 - .../fixtures/validate_manifest/good_manifest | 38 - .../docker/distribution/metadata/metadata.go | 75 - .../distribution/metadata/v1_id_service.go | 51 - .../metadata/v1_id_service_test.go | 83 - .../metadata/v2_metadata_service.go | 241 - .../metadata/v2_metadata_service_test.go | 115 - .../docker/docker/distribution/pull.go | 200 - .../docker/docker/distribution/pull_v1.go | 368 - .../docker/docker/distribution/pull_v2.go | 878 - .../docker/distribution/pull_v2_test.go | 183 - .../docker/distribution/pull_v2_unix.go | 13 - .../docker/distribution/pull_v2_windows.go | 49 - .../docker/docker/distribution/push.go | 186 - .../docker/docker/distribution/push_v1.go | 463 - .../docker/docker/distribution/push_v2.go | 697 - .../docker/distribution/push_v2_test.go | 579 - .../docker/docker/distribution/registry.go | 156 - .../docker/distribution/registry_unit_test.go | 136 - .../docker/distribution/utils/progress.go | 44 - .../docker/distribution/xfer/download.go | 452 - .../docker/distribution/xfer/download_test.go | 356 - .../docker/distribution/xfer/transfer.go | 401 - .../docker/distribution/xfer/transfer_test.go | 410 - .../docker/docker/distribution/xfer/upload.go | 168 - .../docker/distribution/xfer/upload_test.go | 134 - .../docker/docker/dockerversion/useragent.go | 74 - .../docker/dockerversion/version_lib.go | 16 - .../github.com/docker/docker/docs/README.md | 30 - .../docker/docker/docs/api/v1.18.md | 2156 - .../docker/docker/docs/api/v1.19.md | 2238 - .../docker/docker/docs/api/v1.20.md | 2391 - .../docker/docker/docs/api/v1.21.md | 2969 - .../docker/docker/docs/api/v1.22.md | 3307 - .../docker/docker/docs/api/v1.23.md | 3424 - .../docker/docker/docs/api/v1.24.md | 5316 -- .../docker/docker/docs/api/version-history.md | 249 - .../docker/docker/docs/deprecated.md | 286 - .../docker/docker/docs/extend/EBS_volume.md | 164 - .../docker/docker/docs/extend/config.md | 225 - .../extend/images/authz_additional_info.png | Bin 45916 -> 0 bytes .../docker/docs/extend/images/authz_allow.png | Bin 33505 -> 0 bytes .../docs/extend/images/authz_chunked.png | Bin 33168 -> 0 bytes .../extend/images/authz_connection_hijack.png | Bin 38780 -> 0 bytes .../docker/docs/extend/images/authz_deny.png | Bin 27099 -> 0 bytes .../docker/docker/docs/extend/index.md | 222 - .../docker/docs/extend/legacy_plugins.md | 98 - .../docker/docker/docs/extend/plugin_api.md | 196 - .../docs/extend/plugins_authorization.md | 260 - .../docker/docs/extend/plugins_graphdriver.md | 376 - .../docker/docs/extend/plugins_network.md | 77 - .../docker/docs/extend/plugins_volume.md | 276 - .../docker/docker/docs/reference/builder.md | 1746 - .../docs/reference/commandline/attach.md | 131 - .../docs/reference/commandline/build.md | 451 - .../docker/docs/reference/commandline/cli.md | 249 - .../docs/reference/commandline/commit.md | 93 - .../reference/commandline/container_prune.md | 47 - .../docker/docs/reference/commandline/cp.md | 112 - .../docs/reference/commandline/create.md | 211 - .../docs/reference/commandline/deploy.md | 101 - .../docker/docs/reference/commandline/diff.md | 48 - .../reference/commandline/docker_images.gif | Bin 35785 -> 0 bytes .../docs/reference/commandline/dockerd.md | 1364 - .../docs/reference/commandline/events.md | 217 - .../docker/docs/reference/commandline/exec.md | 65 - .../docs/reference/commandline/export.md | 43 - .../docs/reference/commandline/history.md | 48 - .../docs/reference/commandline/image_prune.md | 71 - .../docs/reference/commandline/images.md | 304 - .../docs/reference/commandline/import.md | 75 - .../docs/reference/commandline/index.md | 178 - .../docker/docs/reference/commandline/info.md | 224 - .../docs/reference/commandline/inspect.md | 102 - .../docker/docs/reference/commandline/kill.md | 34 - .../docker/docs/reference/commandline/load.md | 53 - .../docs/reference/commandline/login.md | 122 - .../docs/reference/commandline/logout.md | 30 - .../docker/docs/reference/commandline/logs.md | 66 - .../docker/docs/reference/commandline/menu.md | 28 - .../reference/commandline/network_connect.md | 100 - .../reference/commandline/network_create.md | 202 - .../commandline/network_disconnect.md | 43 - .../reference/commandline/network_inspect.md | 192 - .../docs/reference/commandline/network_ls.md | 218 - .../reference/commandline/network_prune.md | 45 - .../docs/reference/commandline/network_rm.md | 59 - .../docs/reference/commandline/node_demote.md | 42 - .../reference/commandline/node_inspect.md | 137 - .../docs/reference/commandline/node_ls.md | 130 - .../reference/commandline/node_promote.md | 41 - .../docs/reference/commandline/node_ps.md | 107 - .../docs/reference/commandline/node_rm.md | 73 - .../docs/reference/commandline/node_update.md | 71 - .../docs/reference/commandline/pause.md | 40 - .../reference/commandline/plugin_create.md | 60 - .../reference/commandline/plugin_disable.md | 66 - .../reference/commandline/plugin_enable.md | 65 - .../reference/commandline/plugin_inspect.md | 164 - .../reference/commandline/plugin_install.md | 71 - .../docs/reference/commandline/plugin_ls.md | 53 - .../docs/reference/commandline/plugin_push.md | 50 - .../docs/reference/commandline/plugin_rm.md | 56 - .../docs/reference/commandline/plugin_set.md | 99 - .../reference/commandline/plugin_upgrade.md | 84 - .../docker/docs/reference/commandline/port.md | 41 - .../docker/docs/reference/commandline/ps.md | 384 - .../docker/docs/reference/commandline/pull.md | 252 - .../docker/docs/reference/commandline/push.md | 75 - .../docs/reference/commandline/rename.md | 27 - .../docs/reference/commandline/restart.md | 26 - .../docker/docs/reference/commandline/rm.md | 69 - .../docker/docs/reference/commandline/rmi.md | 83 - .../docker/docs/reference/commandline/run.md | 732 - .../docker/docs/reference/commandline/save.md | 45 - .../docs/reference/commandline/search.md | 134 - .../reference/commandline/secret_create.md | 90 - .../reference/commandline/secret_inspect.md | 85 - .../docs/reference/commandline/secret_ls.md | 43 - .../docs/reference/commandline/secret_rm.md | 48 - .../reference/commandline/service_create.md | 556 - .../reference/commandline/service_inspect.md | 162 - .../reference/commandline/service_logs.md | 77 - .../docs/reference/commandline/service_ls.md | 114 - .../docs/reference/commandline/service_ps.md | 161 - .../docs/reference/commandline/service_rm.md | 55 - .../reference/commandline/service_scale.md | 96 - .../reference/commandline/service_update.md | 181 - .../reference/commandline/stack_deploy.md | 98 - .../docs/reference/commandline/stack_ls.md | 47 - .../docs/reference/commandline/stack_ps.md | 51 - .../docs/reference/commandline/stack_rm.md | 38 - .../reference/commandline/stack_services.md | 70 - .../docs/reference/commandline/start.md | 28 - .../docs/reference/commandline/stats.md | 117 - .../docker/docs/reference/commandline/stop.md | 29 - .../docs/reference/commandline/swarm_init.md | 142 - .../docs/reference/commandline/swarm_join.md | 102 - .../reference/commandline/swarm_join_token.md | 105 - .../docs/reference/commandline/swarm_leave.md | 58 - .../reference/commandline/swarm_unlock.md | 41 - .../reference/commandline/swarm_unlock_key.md | 84 - .../reference/commandline/swarm_update.md | 45 - .../docs/reference/commandline/system_df.md | 76 - .../reference/commandline/system_prune.md | 79 - .../docker/docs/reference/commandline/tag.md | 74 - .../docker/docs/reference/commandline/top.md | 25 - .../docs/reference/commandline/unpause.md | 36 - .../docs/reference/commandline/update.md | 120 - .../docs/reference/commandline/version.md | 67 - .../reference/commandline/volume_create.md | 91 - .../reference/commandline/volume_inspect.md | 59 - .../docs/reference/commandline/volume_ls.md | 183 - .../reference/commandline/volume_prune.md | 54 - .../docs/reference/commandline/volume_rm.md | 42 - .../docker/docs/reference/commandline/wait.md | 25 - .../docker/docker/docs/reference/glossary.md | 286 - .../docker/docker/docs/reference/index.md | 21 - .../docker/docker/docs/reference/run.md | 1555 - .../docker/docs/static_files/contributors.png | Bin 23100 -> 0 bytes .../static_files/docker-logo-compressed.png | Bin 4972 -> 0 bytes .../docker/docker/experimental/README.md | 44 - .../docker/experimental/checkpoint-restore.md | 88 - .../experimental/docker-stacks-and-bundles.md | 202 - .../experimental/images/ipvlan-l3.gliffy | 1 - .../docker/experimental/images/ipvlan-l3.png | Bin 18260 -> 0 bytes .../docker/experimental/images/ipvlan-l3.svg | 1 - .../images/ipvlan_l2_simple.gliffy | 1 - .../experimental/images/ipvlan_l2_simple.png | Bin 20145 -> 0 bytes .../experimental/images/ipvlan_l2_simple.svg | 1 - .../images/macvlan-bridge-ipvlan-l2.gliffy | 1 - .../images/macvlan-bridge-ipvlan-l2.png | Bin 14527 -> 0 bytes .../images/macvlan-bridge-ipvlan-l2.svg | 1 - .../images/multi_tenant_8021q_vlans.gliffy | 1 - .../images/multi_tenant_8021q_vlans.png | Bin 17879 -> 0 bytes .../images/multi_tenant_8021q_vlans.svg | 1 - .../images/vlans-deeper-look.gliffy | 1 - .../experimental/images/vlans-deeper-look.png | Bin 38837 -> 0 bytes .../experimental/images/vlans-deeper-look.svg | 1 - .../docker/experimental/vlan-networks.md | 471 - .../docker/hack/Jenkins/W2L/postbuild.sh | 35 - .../docker/docker/hack/Jenkins/W2L/setup.sh | 309 - .../docker/docker/hack/Jenkins/readme.md | 3 - vendor/github.com/docker/docker/hack/dind | 33 - .../docker/hack/dockerfile/binaries-commits | 11 - .../hack/dockerfile/install-binaries.sh | 123 - .../docker/docker/hack/generate-authors.sh | 15 - .../docker/hack/generate-swagger-api.sh | 22 - .../github.com/docker/docker/hack/install.sh | 484 - vendor/github.com/docker/docker/hack/make.ps1 | 408 - vendor/github.com/docker/docker/hack/make.sh | 304 - .../docker/docker/hack/make/.binary | 48 - .../docker/docker/hack/make/.binary-setup | 10 - .../docker/docker/hack/make/.build-deb/compat | 1 - .../docker/hack/make/.build-deb/control | 29 - .../.build-deb/docker-engine.bash-completion | 1 - .../.build-deb/docker-engine.docker.default | 1 - .../make/.build-deb/docker-engine.docker.init | 1 - .../.build-deb/docker-engine.docker.upstart | 1 - .../make/.build-deb/docker-engine.install | 12 - .../make/.build-deb/docker-engine.manpages | 1 - .../make/.build-deb/docker-engine.postinst | 20 - .../hack/make/.build-deb/docker-engine.udev | 1 - .../docker/docker/hack/make/.build-deb/docs | 1 - .../docker/docker/hack/make/.build-deb/rules | 55 - .../.build-rpm/docker-engine-selinux.spec | 96 - .../hack/make/.build-rpm/docker-engine.spec | 254 - .../docker/hack/make/.detect-daemon-osarch | 69 - .../docker/docker/hack/make/.ensure-emptyfs | 23 - .../docker/docker/hack/make/.go-autogen | 86 - .../docker/docker/hack/make/.go-autogen.ps1 | 91 - .../hack/make/.integration-daemon-setup | 7 - .../hack/make/.integration-daemon-start | 116 - .../docker/hack/make/.integration-daemon-stop | 27 - .../hack/make/.integration-test-helpers | 79 - .../hack/make/.resources-windows/common.rc | 38 - .../.resources-windows/docker.exe.manifest | 18 - .../hack/make/.resources-windows/docker.ico | Bin 370070 -> 0 bytes .../hack/make/.resources-windows/docker.png | Bin 658195 -> 0 bytes .../hack/make/.resources-windows/docker.rc | 3 - .../hack/make/.resources-windows/dockerd.rc | 4 - .../make/.resources-windows/event_messages.mc | 39 - .../hack/make/.resources-windows/resources.go | 18 - .../docker/docker/hack/make/README.md | 17 - .../github.com/docker/docker/hack/make/binary | 15 - .../docker/docker/hack/make/binary-client | 12 - .../docker/docker/hack/make/binary-daemon | 13 - .../docker/docker/hack/make/build-deb | 91 - .../hack/make/build-integration-test-binary | 11 - .../docker/docker/hack/make/build-rpm | 148 - .../docker/docker/hack/make/clean-apt-repo | 43 - .../docker/docker/hack/make/clean-yum-repo | 20 - .../github.com/docker/docker/hack/make/cover | 15 - .../github.com/docker/docker/hack/make/cross | 46 - .../docker/docker/hack/make/dynbinary | 15 - .../docker/docker/hack/make/dynbinary-client | 12 - .../docker/docker/hack/make/dynbinary-daemon | 12 - .../docker/hack/make/generate-index-listing | 74 - .../docker/docker/hack/make/install-binary | 12 - .../docker/hack/make/install-binary-client | 10 - .../docker/hack/make/install-binary-daemon | 16 - .../docker/docker/hack/make/install-script | 63 - .../docker/docker/hack/make/release-deb | 163 - .../docker/docker/hack/make/release-rpm | 71 - vendor/github.com/docker/docker/hack/make/run | 44 - .../docker/docker/hack/make/sign-repos | 65 - .../docker/docker/hack/make/test-deb-install | 71 - .../docker/docker/hack/make/test-docker-py | 20 - .../docker/hack/make/test-install-script | 31 - .../docker/hack/make/test-integration-cli | 28 - .../docker/hack/make/test-integration-shell | 7 - .../docker/docker/hack/make/test-old-apt-repo | 29 - .../docker/docker/hack/make/test-unit | 55 - vendor/github.com/docker/docker/hack/make/tgz | 92 - .../github.com/docker/docker/hack/make/ubuntu | 190 - .../docker/docker/hack/make/update-apt-repo | 70 - vendor/github.com/docker/docker/hack/make/win | 20 - .../github.com/docker/docker/hack/release.sh | 325 - .../docker/hack/validate/.swagger-yamllint | 4 - .../docker/docker/hack/validate/.validate | 30 - .../docker/docker/hack/validate/all | 8 - .../docker/hack/validate/compose-bindata | 28 - .../docker/docker/hack/validate/dco | 55 - .../docker/docker/hack/validate/default | 16 - .../docker/hack/validate/default-seccomp | 28 - .../docker/docker/hack/validate/gofmt | 33 - .../docker/docker/hack/validate/lint | 31 - .../docker/docker/hack/validate/pkg-imports | 33 - .../docker/docker/hack/validate/swagger | 13 - .../docker/docker/hack/validate/swagger-gen | 29 - .../docker/docker/hack/validate/test-imports | 38 - .../docker/docker/hack/validate/toml | 31 - .../docker/docker/hack/validate/vendor | 30 - .../docker/docker/hack/validate/vet | 32 - .../github.com/docker/docker/hack/vendor.sh | 15 - vendor/github.com/docker/docker/image/fs.go | 173 - .../github.com/docker/docker/image/fs_test.go | 384 - .../github.com/docker/docker/image/image.go | 150 - .../docker/docker/image/image_test.go | 59 - .../github.com/docker/docker/image/rootfs.go | 44 - .../docker/docker/image/spec/v1.1.md | 637 - .../docker/docker/image/spec/v1.2.md | 696 - .../github.com/docker/docker/image/spec/v1.md | 573 - .../github.com/docker/docker/image/store.go | 295 - .../docker/docker/image/store_test.go | 300 - .../docker/docker/image/tarexport/load.go | 390 - .../docker/docker/image/tarexport/save.go | 355 - .../docker/image/tarexport/tarexport.go | 47 - .../docker/docker/image/v1/imagev1.go | 156 - .../docker/docker/image/v1/imagev1_test.go | 55 - .../docker/integration-cli/benchmark_test.go | 95 - .../docker/integration-cli/check_test.go | 383 - .../docker/docker/integration-cli/daemon.go | 608 - .../docker/integration-cli/daemon_swarm.go | 419 - .../integration-cli/daemon_swarm_hack.go | 20 - .../docker/integration-cli/daemon_unix.go | 35 - .../docker/integration-cli/daemon_windows.go | 53 - .../integration-cli/docker_api_attach_test.go | 210 - .../integration-cli/docker_api_auth_test.go | 25 - .../integration-cli/docker_api_build_test.go | 254 - .../docker_api_containers_test.go | 1961 - .../integration-cli/docker_api_create_test.go | 84 - .../integration-cli/docker_api_events_test.go | 73 - .../docker_api_exec_resize_test.go | 103 - .../integration-cli/docker_api_exec_test.go | 198 - .../integration-cli/docker_api_images_test.go | 165 - .../integration-cli/docker_api_info_test.go | 53 - .../docker_api_inspect_test.go | 183 - .../docker_api_inspect_unix_test.go | 35 - .../integration-cli/docker_api_logs_test.go | 87 - .../docker_api_network_test.go | 353 - .../integration-cli/docker_api_resize_test.go | 44 - .../docker_api_service_update_test.go | 39 - .../integration-cli/docker_api_stats_test.go | 310 - .../docker_api_stats_unix_test.go | 41 - .../integration-cli/docker_api_swarm_test.go | 1367 - .../docker/integration-cli/docker_api_test.go | 118 - .../docker_api_update_unix_test.go | 35 - .../docker_api_version_test.go | 23 - .../docker_api_volumes_test.go | 89 - .../integration-cli/docker_cli_attach_test.go | 168 - .../docker_cli_attach_unix_test.go | 237 - .../docker_cli_authz_plugin_v2_test.go | 133 - .../docker_cli_authz_unix_test.go | 477 - .../integration-cli/docker_cli_build_test.go | 7392 -- .../docker_cli_build_unix_test.go | 207 - .../docker_cli_by_digest_test.go | 693 - .../integration-cli/docker_cli_commit_test.go | 157 - .../integration-cli/docker_cli_config_test.go | 140 - .../docker_cli_cp_from_container_test.go | 488 - .../integration-cli/docker_cli_cp_test.go | 660 - .../docker_cli_cp_to_container_test.go | 599 - .../docker_cli_cp_to_container_unix_test.go | 39 - .../integration-cli/docker_cli_cp_utils.go | 303 - .../integration-cli/docker_cli_create_test.go | 513 - .../docker_cli_daemon_plugins_test.go | 317 - .../integration-cli/docker_cli_daemon_test.go | 2988 - .../integration-cli/docker_cli_diff_test.go | 98 - .../integration-cli/docker_cli_events_test.go | 794 - .../docker_cli_events_unix_test.go | 486 - .../integration-cli/docker_cli_exec_test.go | 601 - .../docker_cli_exec_unix_test.go | 93 - .../docker_cli_experimental_test.go | 36 - .../docker_cli_export_import_test.go | 49 - ...cker_cli_external_graphdriver_unix_test.go | 405 - ...er_cli_external_volume_driver_unix_test.go | 627 - .../integration-cli/docker_cli_health_test.go | 169 - .../integration-cli/docker_cli_help_test.go | 321 - .../docker_cli_history_test.go | 121 - .../integration-cli/docker_cli_images_test.go | 364 - .../integration-cli/docker_cli_import_test.go | 150 - .../integration-cli/docker_cli_info_test.go | 234 - .../docker_cli_info_unix_test.go | 15 - .../docker_cli_inspect_test.go | 466 - .../integration-cli/docker_cli_kill_test.go | 134 - .../integration-cli/docker_cli_links_test.go | 240 - .../docker_cli_links_unix_test.go | 26 - .../integration-cli/docker_cli_login_test.go | 44 - .../integration-cli/docker_cli_logout_test.go | 100 - .../docker_cli_logs_bench_test.go | 32 - .../integration-cli/docker_cli_logs_test.go | 328 - .../integration-cli/docker_cli_nat_test.go | 93 - .../docker_cli_netmode_test.go | 94 - .../docker_cli_network_unix_test.go | 1791 - .../docker_cli_oom_killed_test.go | 30 - .../integration-cli/docker_cli_pause_test.go | 66 - .../docker_cli_plugins_test.go | 393 - .../integration-cli/docker_cli_port_test.go | 319 - .../integration-cli/docker_cli_proxy_test.go | 53 - .../docker_cli_prune_unix_test.go | 91 - .../integration-cli/docker_cli_ps_test.go | 952 - .../docker_cli_pull_local_test.go | 492 - .../integration-cli/docker_cli_pull_test.go | 274 - .../docker_cli_pull_trusted_test.go | 365 - .../integration-cli/docker_cli_push_test.go | 715 - .../docker_cli_registry_user_agent_test.go | 120 - .../integration-cli/docker_cli_rename_test.go | 138 - .../docker_cli_restart_test.go | 278 - .../integration-cli/docker_cli_rm_test.go | 86 - .../integration-cli/docker_cli_rmi_test.go | 352 - .../integration-cli/docker_cli_run_test.go | 4689 - .../docker_cli_run_unix_test.go | 1592 - .../docker_cli_save_load_test.go | 383 - .../docker_cli_save_load_unix_test.go | 109 - .../integration-cli/docker_cli_search_test.go | 131 - .../docker_cli_secret_create_test.go | 131 - .../docker_cli_secret_inspect_test.go | 68 - .../docker_cli_service_create_test.go | 175 - .../docker_cli_service_health_test.go | 191 - ...cker_cli_service_logs_experimental_test.go | 96 - .../docker_cli_service_scale_test.go | 57 - .../docker_cli_service_update_test.go | 130 - .../integration-cli/docker_cli_sni_test.go | 44 - .../integration-cli/docker_cli_stack_test.go | 186 - .../integration-cli/docker_cli_start_test.go | 199 - .../integration-cli/docker_cli_stats_test.go | 159 - .../integration-cli/docker_cli_stop_test.go | 17 - .../integration-cli/docker_cli_swarm_test.go | 1254 - .../docker_cli_swarm_unix_test.go | 52 - .../integration-cli/docker_cli_tag_test.go | 225 - .../integration-cli/docker_cli_top_test.go | 73 - .../integration-cli/docker_cli_update_test.go | 41 - .../docker_cli_update_unix_test.go | 283 - .../integration-cli/docker_cli_userns_test.go | 98 - .../docker_cli_v2_only_test.go | 125 - .../docker_cli_version_test.go | 58 - .../integration-cli/docker_cli_volume_test.go | 427 - .../integration-cli/docker_cli_wait_test.go | 97 - .../docker_deprecated_api_v124_test.go | 227 - .../docker_deprecated_api_v124_unix_test.go | 30 - .../docker_experimental_network_test.go | 594 - .../docker_hub_pull_suite_test.go | 90 - .../integration-cli/docker_test_vars.go | 165 - .../docker/integration-cli/docker_utils.go | 1607 - .../docker/integration-cli/events_utils.go | 206 - .../docker/docker/integration-cli/fixtures.go | 69 - .../auth/docker-credential-shell-test | 55 - .../fixtures/credentialspecs/valid.json | 25 - .../fixtures/deploy/default.yaml | 9 - .../fixtures/deploy/remove.yaml | 11 - .../fixtures/deploy/secrets.yaml | 20 - .../integration-cli/fixtures/https/ca.pem | 23 - .../fixtures/https/client-cert.pem | 73 - .../fixtures/https/client-key.pem | 16 - .../fixtures/https/client-rogue-cert.pem | 73 - .../fixtures/https/client-rogue-key.pem | 16 - .../fixtures/https/server-cert.pem | 76 - .../fixtures/https/server-key.pem | 16 - .../fixtures/https/server-rogue-cert.pem | 76 - .../fixtures/https/server-rogue-key.pem | 16 - .../fixtures/load/emptyLayer.tar | Bin 30720 -> 0 bytes .../integration-cli/fixtures/load/frozen.go | 182 - .../fixtures/notary/delgkey1.crt | 21 - .../fixtures/notary/delgkey1.key | 27 - .../fixtures/notary/delgkey2.crt | 21 - .../fixtures/notary/delgkey2.key | 27 - .../fixtures/notary/delgkey3.crt | 21 - .../fixtures/notary/delgkey3.key | 27 - .../fixtures/notary/delgkey4.crt | 21 - .../fixtures/notary/delgkey4.key | 27 - .../integration-cli/fixtures/notary/gen.sh | 18 - .../fixtures/notary/localhost.cert | 19 - .../fixtures/notary/localhost.key | 27 - .../fixtures/registry/cert.pem | 21 - .../integration-cli/fixtures/secrets/default | 1 - .../integration-cli/fixtures_linux_daemon.go | 143 - .../docker/docker/integration-cli/npipe.go | 12 - .../docker/integration-cli/npipe_windows.go | 12 - .../docker/docker/integration-cli/registry.go | 177 - .../docker/integration-cli/registry_mock.go | 55 - .../docker/integration-cli/requirements.go | 243 - .../integration-cli/requirements_unix.go | 159 - .../docker/integration-cli/test_vars.go | 11 - .../docker/integration-cli/test_vars_exec.go | 8 - .../integration-cli/test_vars_noexec.go | 8 - .../integration-cli/test_vars_noseccomp.go | 8 - .../integration-cli/test_vars_seccomp.go | 8 - .../docker/integration-cli/test_vars_unix.go | 14 - .../integration-cli/test_vars_windows.go | 15 - .../docker/integration-cli/trust_server.go | 344 - .../docker/docker/integration-cli/utils.go | 79 - .../github.com/docker/docker/layer/empty.go | 56 - .../docker/docker/layer/empty_test.go | 46 - .../docker/docker/layer/filestore.go | 354 - .../docker/docker/layer/filestore_test.go | 104 - .../github.com/docker/docker/layer/layer.go | 275 - .../docker/docker/layer/layer_store.go | 684 - .../docker/layer/layer_store_windows.go | 11 - .../docker/docker/layer/layer_test.go | 771 - .../docker/docker/layer/layer_unix.go | 9 - .../docker/docker/layer/layer_unix_test.go | 71 - .../docker/docker/layer/layer_windows.go | 98 - .../docker/docker/layer/migration.go | 256 - .../docker/docker/layer/migration_test.go | 435 - .../docker/docker/layer/mount_test.go | 230 - .../docker/docker/layer/mounted_layer.go | 99 - .../docker/docker/layer/ro_layer.go | 192 - .../docker/docker/layer/ro_layer_windows.go | 9 - .../docker/docker/libcontainerd/client.go | 46 - .../docker/libcontainerd/client_linux.go | 605 - .../docker/libcontainerd/client_solaris.go | 101 - .../docker/libcontainerd/client_unix.go | 142 - .../docker/libcontainerd/client_windows.go | 631 - .../docker/docker/libcontainerd/container.go | 13 - .../docker/libcontainerd/container_unix.go | 250 - .../docker/libcontainerd/container_windows.go | 311 - .../docker/docker/libcontainerd/oom_linux.go | 31 - .../docker/libcontainerd/oom_solaris.go | 5 - .../docker/libcontainerd/pausemonitor_unix.go | 42 - .../docker/docker/libcontainerd/process.go | 18 - .../docker/libcontainerd/process_unix.go | 107 - .../docker/libcontainerd/process_windows.go | 51 - .../docker/docker/libcontainerd/queue_unix.go | 31 - .../docker/docker/libcontainerd/remote.go | 20 - .../docker/libcontainerd/remote_unix.go | 544 - .../docker/libcontainerd/remote_windows.go | 36 - .../docker/docker/libcontainerd/types.go | 75 - .../docker/libcontainerd/types_linux.go | 49 - .../docker/libcontainerd/types_solaris.go | 43 - .../docker/libcontainerd/types_windows.go | 79 - .../docker/libcontainerd/utils_linux.go | 62 - .../docker/libcontainerd/utils_solaris.go | 27 - .../docker/libcontainerd/utils_windows.go | 46 - .../libcontainerd/utils_windows_test.go | 13 - .../github.com/docker/docker/man/Dockerfile | 24 - .../docker/docker/man/Dockerfile.5.md | 474 - .../docker/docker/man/Dockerfile.aarch64 | 25 - .../docker/docker/man/Dockerfile.armhf | 43 - .../docker/docker/man/Dockerfile.ppc64le | 35 - .../docker/docker/man/Dockerfile.s390x | 35 - vendor/github.com/docker/docker/man/README.md | 15 - .../docker/docker/man/docker-attach.1.md | 99 - .../docker/docker/man/docker-build.1.md | 340 - .../docker/docker/man/docker-commit.1.md | 71 - .../docker/docker/man/docker-config-json.5.md | 72 - .../docker/docker/man/docker-cp.1.md | 175 - .../docker/docker/man/docker-create.1.md | 553 - .../docker/docker/man/docker-diff.1.md | 49 - .../docker/docker/man/docker-events.1.md | 180 - .../docker/docker/man/docker-exec.1.md | 71 - .../docker/docker/man/docker-export.1.md | 46 - .../docker/docker/man/docker-history.1.md | 52 - .../docker/docker/man/docker-images.1.md | 153 - .../docker/docker/man/docker-import.1.md | 72 - .../docker/docker/man/docker-info.1.md | 187 - .../docker/docker/man/docker-inspect.1.md | 323 - .../docker/docker/man/docker-kill.1.md | 28 - .../docker/docker/man/docker-load.1.md | 56 - .../docker/docker/man/docker-login.1.md | 53 - .../docker/docker/man/docker-logout.1.md | 32 - .../docker/docker/man/docker-logs.1.md | 71 - .../docker/man/docker-network-connect.1.md | 66 - .../docker/man/docker-network-create.1.md | 187 - .../docker/man/docker-network-disconnect.1.md | 36 - .../docker/man/docker-network-inspect.1.md | 112 - .../docker/docker/man/docker-network-ls.1.md | 188 - .../docker/docker/man/docker-network-rm.1.md | 43 - .../docker/docker/man/docker-pause.1.md | 32 - .../docker/docker/man/docker-port.1.md | 47 - .../docker/docker/man/docker-ps.1.md | 145 - .../docker/docker/man/docker-pull.1.md | 220 - .../docker/docker/man/docker-push.1.md | 63 - .../docker/docker/man/docker-rename.1.md | 15 - .../docker/docker/man/docker-restart.1.md | 26 - .../docker/docker/man/docker-rm.1.md | 72 - .../docker/docker/man/docker-rmi.1.md | 42 - .../docker/docker/man/docker-run.1.md | 1055 - .../docker/docker/man/docker-save.1.md | 45 - .../docker/docker/man/docker-search.1.md | 70 - .../docker/docker/man/docker-start.1.md | 39 - .../docker/docker/man/docker-stats.1.md | 57 - .../docker/docker/man/docker-stop.1.md | 30 - .../docker/docker/man/docker-tag.1.md | 76 - .../docker/docker/man/docker-top.1.md | 36 - .../docker/docker/man/docker-unpause.1.md | 28 - .../docker/docker/man/docker-update.1.md | 171 - .../docker/docker/man/docker-version.1.md | 62 - .../docker/docker/man/docker-wait.1.md | 30 - .../github.com/docker/docker/man/docker.1.md | 237 - .../github.com/docker/docker/man/dockerd.8.md | 710 - .../github.com/docker/docker/man/generate.go | 43 - .../github.com/docker/docker/man/generate.sh | 15 - .../github.com/docker/docker/man/glide.lock | 52 - .../github.com/docker/docker/man/glide.yaml | 12 - .../docker/docker/man/md2man-all.sh | 22 - .../docker/docker/migrate/v1/migratev1.go | 504 - .../docker/migrate/v1/migratev1_test.go | 438 - .../docker/docker/oci/defaults_linux.go | 168 - .../docker/docker/oci/defaults_solaris.go | 20 - .../docker/docker/oci/defaults_windows.go | 19 - .../docker/docker/oci/devices_linux.go | 86 - .../docker/docker/oci/devices_unsupported.go | 20 - .../docker/docker/oci/namespaces.go | 16 - vendor/github.com/docker/docker/opts/hosts.go | 151 - .../docker/docker/opts/hosts_test.go | 148 - .../docker/docker/opts/hosts_unix.go | 8 - .../docker/docker/opts/hosts_windows.go | 6 - vendor/github.com/docker/docker/opts/ip.go | 47 - .../github.com/docker/docker/opts/ip_test.go | 54 - vendor/github.com/docker/docker/opts/mount.go | 171 - .../docker/docker/opts/mount_test.go | 184 - vendor/github.com/docker/docker/opts/opts.go | 360 - .../docker/docker/opts/opts_test.go | 232 - .../docker/docker/opts/opts_unix.go | 6 - .../docker/docker/opts/opts_windows.go | 56 - vendor/github.com/docker/docker/opts/port.go | 146 - .../docker/docker/opts/port_test.go | 259 - .../docker/docker/opts/quotedstring.go | 37 - .../docker/docker/opts/quotedstring_test.go | 28 - .../github.com/docker/docker/opts/secret.go | 107 - .../docker/docker/opts/secret_test.go | 79 - .../docker/docker/pkg/aaparser/aaparser.go | 91 - .../docker/pkg/aaparser/aaparser_test.go | 73 - .../docker/docker/pkg/archive/README.md | 1 - .../docker/docker/pkg/archive/archive.go | 1175 - .../docker/pkg/archive/archive_linux.go | 95 - .../docker/pkg/archive/archive_linux_test.go | 187 - .../docker/pkg/archive/archive_other.go | 7 - .../docker/docker/pkg/archive/archive_test.go | 1162 - .../docker/docker/pkg/archive/archive_unix.go | 118 - .../docker/pkg/archive/archive_unix_test.go | 249 - .../docker/pkg/archive/archive_windows.go | 70 - .../pkg/archive/archive_windows_test.go | 91 - .../docker/docker/pkg/archive/changes.go | 446 - .../docker/pkg/archive/changes_linux.go | 312 - .../docker/pkg/archive/changes_other.go | 97 - .../docker/pkg/archive/changes_posix_test.go | 132 - .../docker/docker/pkg/archive/changes_test.go | 572 - .../docker/docker/pkg/archive/changes_unix.go | 36 - .../docker/pkg/archive/changes_windows.go | 30 - .../docker/docker/pkg/archive/copy.go | 458 - .../docker/docker/pkg/archive/copy_unix.go | 11 - .../docker/pkg/archive/copy_unix_test.go | 978 - .../docker/docker/pkg/archive/copy_windows.go | 9 - .../docker/docker/pkg/archive/diff.go | 279 - .../docker/docker/pkg/archive/diff_test.go | 386 - .../docker/pkg/archive/example_changes.go | 97 - .../docker/pkg/archive/testdata/broken.tar | Bin 13824 -> 0 bytes .../docker/docker/pkg/archive/time_linux.go | 16 - .../docker/pkg/archive/time_unsupported.go | 16 - .../docker/docker/pkg/archive/utils_test.go | 166 - .../docker/docker/pkg/archive/whiteouts.go | 23 - .../docker/docker/pkg/archive/wrap.go | 59 - .../docker/docker/pkg/archive/wrap_test.go | 98 - .../docker/docker/pkg/authorization/api.go | 88 - .../docker/docker/pkg/authorization/authz.go | 186 - .../pkg/authorization/authz_unix_test.go | 282 - .../docker/pkg/authorization/middleware.go | 84 - .../docker/docker/pkg/authorization/plugin.go | 112 - .../docker/pkg/authorization/response.go | 203 - .../docker/pkg/broadcaster/unbuffered.go | 49 - .../docker/pkg/broadcaster/unbuffered_test.go | 162 - .../docker/pkg/chrootarchive/archive.go | 97 - .../docker/pkg/chrootarchive/archive_test.go | 394 - .../docker/pkg/chrootarchive/archive_unix.go | 86 - .../pkg/chrootarchive/archive_windows.go | 22 - .../docker/pkg/chrootarchive/chroot_linux.go | 108 - .../docker/pkg/chrootarchive/chroot_unix.go | 12 - .../docker/docker/pkg/chrootarchive/diff.go | 23 - .../docker/pkg/chrootarchive/diff_unix.go | 130 - .../docker/pkg/chrootarchive/diff_windows.go | 45 - .../docker/pkg/chrootarchive/init_unix.go | 28 - .../docker/pkg/chrootarchive/init_windows.go | 4 - .../docker/pkg/devicemapper/devmapper.go | 828 - .../docker/pkg/devicemapper/devmapper_log.go | 35 - .../pkg/devicemapper/devmapper_wrapper.go | 251 - .../devmapper_wrapper_deferred_remove.go | 34 - .../devmapper_wrapper_no_deferred_remove.go | 15 - .../docker/docker/pkg/devicemapper/ioctl.go | 27 - .../docker/docker/pkg/devicemapper/log.go | 11 - .../docker/docker/pkg/directory/directory.go | 26 - .../docker/pkg/directory/directory_test.go | 192 - .../docker/pkg/directory/directory_unix.go | 48 - .../docker/pkg/directory/directory_windows.go | 37 - .../docker/docker/pkg/discovery/README.md | 41 - .../docker/docker/pkg/discovery/backends.go | 107 - .../docker/docker/pkg/discovery/discovery.go | 35 - .../docker/pkg/discovery/discovery_test.go | 137 - .../docker/docker/pkg/discovery/entry.go | 94 - .../docker/docker/pkg/discovery/file/file.go | 107 - .../docker/pkg/discovery/file/file_test.go | 114 - .../docker/docker/pkg/discovery/generator.go | 35 - .../docker/pkg/discovery/generator_test.go | 53 - .../docker/docker/pkg/discovery/kv/kv.go | 192 - .../docker/docker/pkg/discovery/kv/kv_test.go | 324 - .../docker/pkg/discovery/memory/memory.go | 93 - .../pkg/discovery/memory/memory_test.go | 48 - .../docker/pkg/discovery/nodes/nodes.go | 54 - .../docker/pkg/discovery/nodes/nodes_test.go | 51 - .../docker/pkg/filenotify/filenotify.go | 40 - .../docker/docker/pkg/filenotify/fsnotify.go | 18 - .../docker/docker/pkg/filenotify/poller.go | 204 - .../docker/pkg/filenotify/poller_test.go | 119 - .../docker/docker/pkg/fileutils/fileutils.go | 283 - .../docker/pkg/fileutils/fileutils_darwin.go | 27 - .../docker/pkg/fileutils/fileutils_solaris.go | 7 - .../docker/pkg/fileutils/fileutils_test.go | 585 - .../docker/pkg/fileutils/fileutils_unix.go | 22 - .../docker/pkg/fileutils/fileutils_windows.go | 7 - .../docker/pkg/fsutils/fsutils_linux.go | 89 - .../docker/pkg/fsutils/fsutils_linux_test.go | 91 - .../docker/docker/pkg/gitutils/gitutils.go | 100 - .../docker/pkg/gitutils/gitutils_test.go | 220 - .../docker/pkg/graphdb/conn_sqlite3_linux.go | 19 - .../docker/pkg/graphdb/graphdb_linux.go | 551 - .../docker/pkg/graphdb/graphdb_linux_test.go | 721 - .../docker/docker/pkg/graphdb/sort_linux.go | 27 - .../docker/pkg/graphdb/sort_linux_test.go | 29 - .../docker/docker/pkg/graphdb/unsupported.go | 3 - .../docker/docker/pkg/graphdb/utils_linux.go | 32 - .../docker/docker/pkg/homedir/homedir.go | 39 - .../docker/docker/pkg/homedir/homedir_test.go | 24 - .../docker/docker/pkg/httputils/httputils.go | 56 - .../docker/pkg/httputils/httputils_test.go | 115 - .../docker/docker/pkg/httputils/mimetype.go | 30 - .../docker/pkg/httputils/mimetype_test.go | 13 - .../pkg/httputils/resumablerequestreader.go | 95 - .../httputils/resumablerequestreader_test.go | 307 - .../docker/docker/pkg/idtools/idtools.go | 197 - .../docker/docker/pkg/idtools/idtools_unix.go | 207 - .../docker/pkg/idtools/idtools_unix_test.go | 271 - .../docker/pkg/idtools/idtools_windows.go | 25 - .../docker/pkg/idtools/usergroupadd_linux.go | 164 - .../pkg/idtools/usergroupadd_unsupported.go | 12 - .../docker/docker/pkg/idtools/utils_unix.go | 32 - .../docker/pkg/integration/checker/checker.go | 46 - .../docker/pkg/integration/cmd/command.go | 294 - .../pkg/integration/cmd/command_test.go | 118 - .../docker/docker/pkg/integration/utils.go | 227 - .../docker/pkg/integration/utils_test.go | 363 - .../docker/docker/pkg/ioutils/buffer.go | 51 - .../docker/docker/pkg/ioutils/buffer_test.go | 75 - .../docker/docker/pkg/ioutils/bytespipe.go | 186 - .../docker/pkg/ioutils/bytespipe_test.go | 159 - .../docker/docker/pkg/ioutils/fmt.go | 22 - .../docker/docker/pkg/ioutils/fmt_test.go | 17 - .../docker/docker/pkg/ioutils/fswriters.go | 162 - .../docker/pkg/ioutils/fswriters_test.go | 132 - .../docker/docker/pkg/ioutils/multireader.go | 223 - .../docker/pkg/ioutils/multireader_test.go | 211 - .../docker/docker/pkg/ioutils/readers.go | 154 - .../docker/docker/pkg/ioutils/readers_test.go | 94 - .../docker/docker/pkg/ioutils/temp_unix.go | 10 - .../docker/docker/pkg/ioutils/temp_windows.go | 18 - .../docker/docker/pkg/ioutils/writeflusher.go | 92 - .../docker/docker/pkg/ioutils/writers.go | 66 - .../docker/docker/pkg/ioutils/writers_test.go | 65 - .../docker/docker/pkg/jsonlog/jsonlog.go | 42 - .../docker/pkg/jsonlog/jsonlog_marshalling.go | 178 - .../pkg/jsonlog/jsonlog_marshalling_test.go | 34 - .../docker/docker/pkg/jsonlog/jsonlogbytes.go | 122 - .../docker/pkg/jsonlog/jsonlogbytes_test.go | 39 - .../docker/pkg/jsonlog/time_marshalling.go | 27 - .../pkg/jsonlog/time_marshalling_test.go | 47 - .../docker/pkg/jsonmessage/jsonmessage.go | 225 - .../pkg/jsonmessage/jsonmessage_test.go | 245 - .../docker/pkg/listeners/listeners_solaris.go | 31 - .../docker/pkg/listeners/listeners_unix.go | 94 - .../docker/pkg/listeners/listeners_windows.go | 54 - .../docker/docker/pkg/locker/README.md | 65 - .../docker/docker/pkg/locker/locker.go | 112 - .../docker/docker/pkg/locker/locker_test.go | 124 - .../docker/docker/pkg/longpath/longpath.go | 26 - .../docker/pkg/longpath/longpath_test.go | 22 - .../docker/pkg/loopback/attach_loopback.go | 137 - .../docker/docker/pkg/loopback/ioctl.go | 53 - .../docker/pkg/loopback/loop_wrapper.go | 52 - .../docker/docker/pkg/loopback/loopback.go | 63 - .../docker/docker/pkg/mount/flags.go | 149 - .../docker/docker/pkg/mount/flags_freebsd.go | 48 - .../docker/docker/pkg/mount/flags_linux.go | 85 - .../docker/pkg/mount/flags_unsupported.go | 30 - .../docker/docker/pkg/mount/mount.go | 74 - .../docker/pkg/mount/mount_unix_test.go | 162 - .../docker/pkg/mount/mounter_freebsd.go | 59 - .../docker/docker/pkg/mount/mounter_linux.go | 21 - .../docker/pkg/mount/mounter_solaris.go | 33 - .../docker/pkg/mount/mounter_unsupported.go | 11 - .../docker/docker/pkg/mount/mountinfo.go | 40 - .../docker/pkg/mount/mountinfo_freebsd.go | 41 - .../docker/pkg/mount/mountinfo_linux.go | 95 - .../docker/pkg/mount/mountinfo_linux_test.go | 476 - .../docker/pkg/mount/mountinfo_solaris.go | 37 - .../docker/pkg/mount/mountinfo_unsupported.go | 12 - .../docker/pkg/mount/mountinfo_windows.go | 6 - .../docker/pkg/mount/sharedsubtree_linux.go | 69 - .../pkg/mount/sharedsubtree_linux_test.go | 331 - .../docker/pkg/mount/sharedsubtree_solaris.go | 58 - .../cmd/names-generator/main.go | 11 - .../pkg/namesgenerator/names-generator.go | 590 - .../namesgenerator/names-generator_test.go | 27 - .../docker/pkg/parsers/kernel/kernel.go | 74 - .../pkg/parsers/kernel/kernel_darwin.go | 56 - .../docker/pkg/parsers/kernel/kernel_unix.go | 45 - .../pkg/parsers/kernel/kernel_unix_test.go | 96 - .../pkg/parsers/kernel/kernel_windows.go | 69 - .../docker/pkg/parsers/kernel/uname_linux.go | 19 - .../pkg/parsers/kernel/uname_solaris.go | 14 - .../pkg/parsers/kernel/uname_unsupported.go | 18 - .../operatingsystem/operatingsystem_linux.go | 77 - .../operatingsystem_solaris.go | 37 - .../operatingsystem/operatingsystem_unix.go | 25 - .../operatingsystem_unix_test.go | 247 - .../operatingsystem_windows.go | 49 - .../docker/docker/pkg/parsers/parsers.go | 69 - .../docker/docker/pkg/parsers/parsers_test.go | 70 - .../docker/docker/pkg/pidfile/pidfile.go | 56 - .../docker/pkg/pidfile/pidfile_darwin.go | 18 - .../docker/docker/pkg/pidfile/pidfile_test.go | 38 - .../docker/docker/pkg/pidfile/pidfile_unix.go | 16 - .../docker/pkg/pidfile/pidfile_windows.go | 23 - .../docker/pkg/platform/architecture_linux.go | 16 - .../docker/pkg/platform/architecture_unix.go | 20 - .../pkg/platform/architecture_windows.go | 60 - .../docker/docker/pkg/platform/platform.go | 23 - .../docker/pkg/platform/utsname_int8.go | 18 - .../docker/pkg/platform/utsname_uint8.go | 18 - .../docker/docker/pkg/plugingetter/getter.go | 35 - .../docker/docker/pkg/plugins/client.go | 205 - .../docker/docker/pkg/plugins/client_test.go | 134 - .../docker/docker/pkg/plugins/discovery.go | 131 - .../docker/pkg/plugins/discovery_test.go | 152 - .../docker/pkg/plugins/discovery_unix.go | 5 - .../docker/pkg/plugins/discovery_unix_test.go | 61 - .../docker/pkg/plugins/discovery_windows.go | 8 - .../docker/docker/pkg/plugins/errors.go | 33 - .../docker/docker/pkg/plugins/plugin_test.go | 44 - .../pkg/plugins/pluginrpc-gen/README.md | 58 - .../pkg/plugins/pluginrpc-gen/fixtures/foo.go | 89 - .../fixtures/otherfixture/spaceship.go | 4 - .../docker/pkg/plugins/pluginrpc-gen/main.go | 91 - .../pkg/plugins/pluginrpc-gen/parser.go | 263 - .../pkg/plugins/pluginrpc-gen/parser_test.go | 222 - .../pkg/plugins/pluginrpc-gen/template.go | 118 - .../docker/docker/pkg/plugins/plugins.go | 329 - .../docker/pkg/plugins/plugins_linux.go | 7 - .../docker/pkg/plugins/plugins_windows.go | 8 - .../docker/pkg/plugins/transport/http.go | 36 - .../docker/pkg/plugins/transport/transport.go | 36 - .../docker/docker/pkg/pools/pools.go | 116 - .../docker/docker/pkg/pools/pools_test.go | 161 - .../docker/docker/pkg/progress/progress.go | 84 - .../docker/pkg/progress/progressreader.go | 66 - .../pkg/progress/progressreader_test.go | 75 - .../docker/docker/pkg/promise/promise.go | 11 - .../docker/docker/pkg/pubsub/publisher.go | 111 - .../docker/pkg/pubsub/publisher_test.go | 142 - .../docker/docker/pkg/random/random.go | 71 - .../docker/docker/pkg/random/random_test.go | 22 - .../docker/docker/pkg/reexec/README.md | 5 - .../docker/docker/pkg/reexec/command_linux.go | 28 - .../docker/docker/pkg/reexec/command_unix.go | 23 - .../docker/pkg/reexec/command_unsupported.go | 12 - .../docker/pkg/reexec/command_windows.go | 23 - .../docker/docker/pkg/reexec/reexec.go | 47 - .../docker/docker/pkg/registrar/registrar.go | 127 - .../docker/pkg/registrar/registrar_test.go | 119 - .../docker/docker/pkg/signal/README.md | 1 - .../docker/docker/pkg/signal/signal.go | 54 - .../docker/docker/pkg/signal/signal_darwin.go | 41 - .../docker/pkg/signal/signal_freebsd.go | 43 - .../docker/docker/pkg/signal/signal_linux.go | 80 - .../docker/pkg/signal/signal_solaris.go | 42 - .../docker/docker/pkg/signal/signal_unix.go | 21 - .../docker/pkg/signal/signal_unsupported.go | 10 - .../docker/pkg/signal/signal_windows.go | 28 - .../docker/docker/pkg/signal/trap.go | 103 - .../pkg/streamformatter/streamformatter.go | 172 - .../streamformatter/streamformatter_test.go | 108 - .../docker/docker/pkg/stringid/README.md | 1 - .../docker/docker/pkg/stringid/stringid.go | 69 - .../docker/pkg/stringid/stringid_test.go | 72 - .../docker/docker/pkg/stringutils/README.md | 1 - .../docker/pkg/stringutils/stringutils.go | 101 - .../pkg/stringutils/stringutils_test.go | 121 - .../docker/docker/pkg/symlink/LICENSE.APACHE | 191 - .../docker/docker/pkg/symlink/LICENSE.BSD | 27 - .../docker/docker/pkg/symlink/README.md | 6 - .../docker/docker/pkg/symlink/fs.go | 144 - .../docker/docker/pkg/symlink/fs_unix.go | 15 - .../docker/docker/pkg/symlink/fs_unix_test.go | 407 - .../docker/docker/pkg/symlink/fs_windows.go | 169 - .../docker/docker/pkg/sysinfo/README.md | 1 - .../docker/docker/pkg/sysinfo/numcpu.go | 12 - .../docker/docker/pkg/sysinfo/numcpu_linux.go | 43 - .../docker/pkg/sysinfo/numcpu_windows.go | 37 - .../docker/docker/pkg/sysinfo/sysinfo.go | 144 - .../docker/pkg/sysinfo/sysinfo_linux.go | 259 - .../docker/pkg/sysinfo/sysinfo_linux_test.go | 58 - .../docker/pkg/sysinfo/sysinfo_solaris.go | 121 - .../docker/docker/pkg/sysinfo/sysinfo_test.go | 26 - .../docker/docker/pkg/sysinfo/sysinfo_unix.go | 9 - .../docker/pkg/sysinfo/sysinfo_windows.go | 9 - .../docker/docker/pkg/system/chtimes.go | 52 - .../docker/docker/pkg/system/chtimes_test.go | 94 - .../docker/docker/pkg/system/chtimes_unix.go | 14 - .../docker/pkg/system/chtimes_unix_test.go | 91 - .../docker/pkg/system/chtimes_windows.go | 27 - .../docker/pkg/system/chtimes_windows_test.go | 86 - .../docker/docker/pkg/system/errors.go | 10 - .../docker/pkg/system/events_windows.go | 85 - .../docker/docker/pkg/system/exitcode.go | 33 - .../docker/docker/pkg/system/filesys.go | 54 - .../docker/pkg/system/filesys_windows.go | 236 - .../docker/docker/pkg/system/lstat.go | 19 - .../docker/pkg/system/lstat_unix_test.go | 30 - .../docker/docker/pkg/system/lstat_windows.go | 25 - .../docker/docker/pkg/system/meminfo.go | 17 - .../docker/docker/pkg/system/meminfo_linux.go | 65 - .../docker/pkg/system/meminfo_solaris.go | 128 - .../docker/pkg/system/meminfo_unix_test.go | 40 - .../docker/pkg/system/meminfo_unsupported.go | 8 - .../docker/pkg/system/meminfo_windows.go | 45 - .../docker/docker/pkg/system/mknod.go | 22 - .../docker/docker/pkg/system/mknod_windows.go | 13 - .../docker/docker/pkg/system/path_unix.go | 14 - .../docker/docker/pkg/system/path_windows.go | 37 - .../docker/pkg/system/path_windows_test.go | 78 - .../docker/docker/pkg/system/stat.go | 53 - .../docker/docker/pkg/system/stat_darwin.go | 32 - .../docker/docker/pkg/system/stat_freebsd.go | 27 - .../docker/docker/pkg/system/stat_linux.go | 33 - .../docker/docker/pkg/system/stat_openbsd.go | 15 - .../docker/docker/pkg/system/stat_solaris.go | 34 - .../docker/pkg/system/stat_unix_test.go | 39 - .../docker/pkg/system/stat_unsupported.go | 17 - .../docker/docker/pkg/system/stat_windows.go | 43 - .../docker/docker/pkg/system/syscall_unix.go | 17 - .../docker/pkg/system/syscall_windows.go | 105 - .../docker/pkg/system/syscall_windows_test.go | 9 - .../docker/docker/pkg/system/umask.go | 13 - .../docker/docker/pkg/system/umask_windows.go | 9 - .../docker/pkg/system/utimes_freebsd.go | 22 - .../docker/docker/pkg/system/utimes_linux.go | 26 - .../docker/pkg/system/utimes_unix_test.go | 68 - .../docker/pkg/system/utimes_unsupported.go | 10 - .../docker/docker/pkg/system/xattrs_linux.go | 63 - .../docker/pkg/system/xattrs_unsupported.go | 13 - .../docker/docker/pkg/tailfile/tailfile.go | 66 - .../docker/pkg/tailfile/tailfile_test.go | 148 - .../docker/pkg/tarsum/builder_context.go | 21 - .../docker/pkg/tarsum/builder_context_test.go | 67 - .../docker/docker/pkg/tarsum/fileinfosums.go | 126 - .../docker/pkg/tarsum/fileinfosums_test.go | 62 - .../docker/docker/pkg/tarsum/tarsum.go | 295 - .../docker/docker/pkg/tarsum/tarsum_spec.md | 230 - .../docker/docker/pkg/tarsum/tarsum_test.go | 664 - .../json | 1 - .../layer.tar | Bin 9216 -> 0 bytes .../json | 1 - .../layer.tar | Bin 1536 -> 0 bytes .../tarsum/testdata/collision/collision-0.tar | Bin 10240 -> 0 bytes .../tarsum/testdata/collision/collision-1.tar | Bin 10240 -> 0 bytes .../tarsum/testdata/collision/collision-2.tar | Bin 10240 -> 0 bytes .../tarsum/testdata/collision/collision-3.tar | Bin 10240 -> 0 bytes .../docker/pkg/tarsum/testdata/xattr/json | 1 - .../pkg/tarsum/testdata/xattr/layer.tar | Bin 2560 -> 0 bytes .../docker/docker/pkg/tarsum/versioning.go | 150 - .../docker/pkg/tarsum/versioning_test.go | 98 - .../docker/docker/pkg/tarsum/writercloser.go | 22 - .../docker/docker/pkg/term/ascii.go | 66 - .../docker/docker/pkg/term/ascii_test.go | 43 - .../docker/docker/pkg/term/tc_linux_cgo.go | 50 - .../docker/docker/pkg/term/tc_other.go | 20 - .../docker/docker/pkg/term/tc_solaris_cgo.go | 63 - .../github.com/docker/docker/pkg/term/term.go | 123 - .../docker/docker/pkg/term/term_solaris.go | 41 - .../docker/docker/pkg/term/term_unix.go | 29 - .../docker/docker/pkg/term/term_windows.go | 233 - .../docker/docker/pkg/term/termios_darwin.go | 69 - .../docker/docker/pkg/term/termios_freebsd.go | 69 - .../docker/docker/pkg/term/termios_linux.go | 47 - .../docker/docker/pkg/term/termios_openbsd.go | 69 - .../docker/pkg/term/windows/ansi_reader.go | 263 - .../docker/pkg/term/windows/ansi_writer.go | 64 - .../docker/docker/pkg/term/windows/console.go | 35 - .../docker/docker/pkg/term/windows/windows.go | 33 - .../docker/pkg/term/windows/windows_test.go | 3 - .../docker/pkg/testutil/assert/assert.go | 97 - .../docker/docker/pkg/testutil/pkg.go | 1 - .../docker/pkg/testutil/tempfile/tempfile.go | 36 - .../docker/pkg/truncindex/truncindex.go | 137 - .../docker/pkg/truncindex/truncindex_test.go | 429 - .../docker/docker/pkg/urlutil/urlutil.go | 50 - .../docker/docker/pkg/urlutil/urlutil_test.go | 70 - .../docker/docker/pkg/useragent/README.md | 1 - .../docker/docker/pkg/useragent/useragent.go | 55 - .../docker/pkg/useragent/useragent_test.go | 31 - .../docker/docker/plugin/backend_linux.go | 790 - .../docker/plugin/backend_unsupported.go | 71 - .../docker/docker/plugin/blobstore.go | 181 - .../github.com/docker/docker/plugin/defs.go | 26 - .../docker/docker/plugin/manager.go | 347 - .../docker/docker/plugin/manager_linux.go | 284 - .../docker/docker/plugin/manager_solaris.go | 28 - .../docker/docker/plugin/manager_windows.go | 30 - .../github.com/docker/docker/plugin/store.go | 263 - .../docker/docker/plugin/store_test.go | 33 - .../docker/docker/plugin/v2/plugin.go | 244 - .../docker/docker/plugin/v2/plugin_linux.go | 121 - .../docker/plugin/v2/plugin_unsupported.go | 14 - .../docker/docker/plugin/v2/settable.go | 102 - .../docker/docker/plugin/v2/settable_test.go | 91 - .../docker/profiles/apparmor/apparmor.go | 122 - .../docker/profiles/apparmor/template.go | 46 - .../docker/profiles/seccomp/default.json | 698 - .../profiles/seccomp/fixtures/example.json | 27 - .../docker/profiles/seccomp/generate.go | 32 - .../docker/docker/profiles/seccomp/seccomp.go | 150 - .../profiles/seccomp/seccomp_default.go | 604 - .../docker/profiles/seccomp/seccomp_test.go | 32 - .../profiles/seccomp/seccomp_unsupported.go | 13 - .../github.com/docker/docker/project/ARM.md | 45 - .../docker/project/BRANCHES-AND-TAGS.md | 35 - .../docker/docker/project/CONTRIBUTORS.md | 1 - .../docker/docker/project/GOVERNANCE.md | 17 - .../docker/project/IRC-ADMINISTRATION.md | 37 - .../docker/docker/project/ISSUE-TRIAGE.md | 132 - .../project/PACKAGE-REPO-MAINTENANCE.md | 74 - .../docker/docker/project/PACKAGERS.md | 307 - .../docker/docker/project/PATCH-RELEASES.md | 68 - .../docker/docker/project/PRINCIPLES.md | 19 - .../docker/docker/project/README.md | 24 - .../docker/project/RELEASE-CHECKLIST.md | 518 - .../docker/docker/project/RELEASE-PROCESS.md | 78 - .../docker/docker/project/REVIEWING.md | 246 - .../github.com/docker/docker/project/TOOLS.md | 63 - .../docker/docker/reference/reference.go | 216 - .../docker/docker/reference/reference_test.go | 275 - .../docker/docker/reference/store.go | 286 - .../docker/docker/reference/store_test.go | 356 - .../github.com/docker/docker/registry/auth.go | 303 - .../docker/docker/registry/auth_test.go | 124 - .../docker/docker/registry/config.go | 305 - .../docker/docker/registry/config_test.go | 49 - .../docker/docker/registry/config_unix.go | 25 - .../docker/docker/registry/config_windows.go | 25 - .../docker/docker/registry/endpoint_test.go | 78 - .../docker/docker/registry/endpoint_v1.go | 198 - .../docker/docker/registry/registry.go | 191 - .../docker/registry/registry_mock_test.go | 478 - .../docker/docker/registry/registry_test.go | 875 - .../docker/docker/registry/service.go | 304 - .../docker/docker/registry/service_v1.go | 40 - .../docker/docker/registry/service_v1_test.go | 23 - .../docker/docker/registry/service_v2.go | 78 - .../docker/docker/registry/session.go | 783 - .../docker/docker/registry/types.go | 73 - .../docker/restartmanager/restartmanager.go | 128 - .../restartmanager/restartmanager_test.go | 34 - .../docker/docker/runconfig/compare.go | 61 - .../docker/docker/runconfig/compare_test.go | 126 - .../docker/docker/runconfig/config.go | 97 - .../docker/docker/runconfig/config_test.go | 139 - .../docker/docker/runconfig/config_unix.go | 59 - .../docker/docker/runconfig/config_windows.go | 19 - .../docker/docker/runconfig/errors.go | 46 - .../fixtures/unix/container_config_1_14.json | 30 - .../fixtures/unix/container_config_1_17.json | 50 - .../fixtures/unix/container_config_1_19.json | 58 - .../unix/container_hostconfig_1_14.json | 18 - .../unix/container_hostconfig_1_19.json | 30 - .../windows/container_config_1_19.json | 58 - .../docker/docker/runconfig/hostconfig.go | 35 - .../docker/runconfig/hostconfig_solaris.go | 41 - .../docker/runconfig/hostconfig_test.go | 283 - .../docker/runconfig/hostconfig_unix.go | 129 - .../docker/runconfig/hostconfig_windows.go | 68 - .../docker/docker/runconfig/opts/envfile.go | 81 - .../docker/runconfig/opts/envfile_test.go | 142 - .../docker/runconfig/opts/fixtures/utf16.env | Bin 54 -> 0 bytes .../runconfig/opts/fixtures/utf16be.env | Bin 54 -> 0 bytes .../docker/runconfig/opts/fixtures/utf8.env | 3 - .../docker/runconfig/opts/fixtures/valid.env | 1 - .../runconfig/opts/fixtures/valid.label | 1 - .../docker/docker/runconfig/opts/opts.go | 83 - .../docker/docker/runconfig/opts/opts_test.go | 113 - .../docker/docker/runconfig/opts/parse.go | 995 - .../docker/runconfig/opts/parse_test.go | 894 - .../docker/docker/runconfig/opts/runtime.go | 79 - .../docker/runconfig/opts/throttledevice.go | 111 - .../docker/docker/runconfig/opts/ulimit.go | 57 - .../docker/runconfig/opts/ulimit_test.go | 42 - .../docker/runconfig/opts/weightdevice.go | 89 - .../github.com/docker/docker/utils/debug.go | 26 - .../docker/docker/utils/debug_test.go | 43 - .../github.com/docker/docker/utils/names.go | 9 - .../docker/docker/utils/process_unix.go | 22 - .../docker/docker/utils/process_windows.go | 20 - .../docker/utils/templates/templates.go | 42 - .../docker/utils/templates/templates_test.go | 38 - .../github.com/docker/docker/utils/utils.go | 87 - .../docker/docker/utils/utils_test.go | 21 - .../docker/docker/volume/drivers/adapter.go | 177 - .../docker/docker/volume/drivers/extpoint.go | 215 - .../docker/volume/drivers/extpoint_test.go | 23 - .../docker/docker/volume/drivers/proxy.go | 242 - .../docker/volume/drivers/proxy_test.go | 132 - .../docker/docker/volume/local/local.go | 364 - .../docker/docker/volume/local/local_test.go | 344 - .../docker/docker/volume/local/local_unix.go | 87 - .../docker/volume/local/local_windows.go | 34 - .../docker/docker/volume/store/db.go | 88 - .../docker/docker/volume/store/errors.go | 76 - .../docker/docker/volume/store/restore.go | 83 - .../docker/docker/volume/store/store.go | 649 - .../docker/docker/volume/store/store_test.go | 234 - .../docker/docker/volume/store/store_unix.go | 9 - .../docker/volume/store/store_windows.go | 12 - .../docker/volume/testutils/testutils.go | 116 - .../docker/docker/volume/validate.go | 125 - .../docker/docker/volume/validate_test.go | 43 - .../docker/volume/validate_test_unix.go | 8 - .../docker/volume/validate_test_windows.go | 6 - .../github.com/docker/docker/volume/volume.go | 323 - .../docker/docker/volume/volume_copy.go | 23 - .../docker/docker/volume/volume_copy_unix.go | 8 - .../docker/volume/volume_copy_windows.go | 6 - .../docker/docker/volume/volume_linux.go | 56 - .../docker/docker/volume/volume_linux_test.go | 51 - .../docker/volume/volume_propagation_linux.go | 47 - .../volume/volume_propagation_linux_test.go | 65 - .../volume/volume_propagation_unsupported.go | 24 - .../docker/docker/volume/volume_test.go | 269 - .../docker/docker/volume/volume_unix.go | 138 - .../docker/volume/volume_unsupported.go | 16 - .../docker/docker/volume/volume_windows.go | 201 - .../docker/go-connections/proxy/logger.go | 11 - .../proxy/network_proxy_test.go | 216 - .../docker/go-connections/proxy/proxy.go | 36 - .../docker/go-connections/proxy/stub_proxy.go | 31 - .../docker/go-connections/proxy/tcp_proxy.go | 105 - .../docker/go-connections/proxy/udp_proxy.go | 176 - .../tlsconfig/fixtures/cert.pem | 18 - .../fixtures/cert_of_encrypted_key.pem | 18 - .../tlsconfig/fixtures/encrypted_key.pem | 30 - .../go-connections/tlsconfig/fixtures/key.pem | 27 - .../tlsconfig/fixtures/multi.pem | 28 - .../fsnotify/.github/ISSUE_TEMPLATE.md | 11 - .../fsnotify/.github/PULL_REQUEST_TEMPLATE.md | 8 - .../hashicorp/hcl/.github/ISSUE_TEMPLATE.md | 21 - .../hashicorp/hcl/hcl/fmtcmd/fmtcmd.go | 162 - .../hashicorp/hcl/hcl/fmtcmd/fmtcmd_test.go | 440 - .../hcl/fmtcmd/test-fixtures/.hidden.ignore | 1 - .../hcl/hcl/fmtcmd/test-fixtures/dir.ignore | 0 .../hcl/hcl/fmtcmd/test-fixtures/file.ignore | 1 - .../hcl/hcl/fmtcmd/test-fixtures/good.hcl | 0 .../parser/test-fixtures/array_comment.hcl | 4 - .../parser/test-fixtures/array_comment_2.hcl | 6 - .../hcl/parser/test-fixtures/assign_colon.hcl | 6 - .../hcl/parser/test-fixtures/assign_deep.hcl | 5 - .../hcl/hcl/parser/test-fixtures/comment.hcl | 15 - .../hcl/parser/test-fixtures/comment_crlf.hcl | 15 - .../parser/test-fixtures/comment_lastline.hcl | 1 - .../parser/test-fixtures/comment_single.hcl | 1 - .../hcl/hcl/parser/test-fixtures/complex.hcl | 42 - .../hcl/parser/test-fixtures/complex_crlf.hcl | 42 - .../hcl/parser/test-fixtures/complex_key.hcl | 1 - .../hcl/hcl/parser/test-fixtures/empty.hcl | 0 .../hcl/parser/test-fixtures/git_crypt.hcl | Bin 10 -> 0 bytes .../test-fixtures/key_without_value.hcl | 1 - .../hcl/hcl/parser/test-fixtures/list.hcl | 1 - .../hcl/parser/test-fixtures/list_comma.hcl | 1 - .../parser/test-fixtures/missing_braces.hcl | 4 - .../hcl/hcl/parser/test-fixtures/multiple.hcl | 2 - .../object_key_assign_without_value.hcl | 3 - .../object_key_assign_without_value2.hcl | 4 - .../object_key_assign_without_value3.hcl | 4 - .../object_key_without_value.hcl | 3 - .../test-fixtures/object_list_comma.hcl | 1 - .../hcl/hcl/parser/test-fixtures/old.hcl | 3 - .../hcl/parser/test-fixtures/structure.hcl | 5 - .../parser/test-fixtures/structure_basic.hcl | 5 - .../parser/test-fixtures/structure_empty.hcl | 1 - .../hcl/hcl/parser/test-fixtures/types.hcl | 7 - .../test-fixtures/unterminated_object.hcl | 2 - .../test-fixtures/unterminated_object_2.hcl | 6 - .../hashicorp/hcl/hcl/printer/nodes.go | 779 - .../hashicorp/hcl/hcl/printer/printer.go | 66 - .../hashicorp/hcl/hcl/printer/printer_test.go | 149 - .../hcl/hcl/printer/testdata/comment.golden | 36 - .../hcl/hcl/printer/testdata/comment.input | 37 - .../printer/testdata/comment_aligned.golden | 32 - .../printer/testdata/comment_aligned.input | 28 - .../hcl/printer/testdata/comment_array.golden | 13 - .../hcl/printer/testdata/comment_array.input | 13 - .../hcl/printer/testdata/comment_crlf.input | 37 - .../printer/testdata/comment_end_file.golden | 6 - .../printer/testdata/comment_end_file.input | 5 - .../testdata/comment_multiline_indent.golden | 12 - .../testdata/comment_multiline_indent.input | 13 - .../comment_multiline_no_stanza.golden | 7 - .../comment_multiline_no_stanza.input | 6 - .../testdata/comment_multiline_stanza.golden | 10 - .../testdata/comment_multiline_stanza.input | 10 - .../printer/testdata/comment_newline.golden | 3 - .../printer/testdata/comment_newline.input | 2 - .../testdata/comment_object_multi.golden | 9 - .../testdata/comment_object_multi.input | 9 - .../testdata/comment_standalone.golden | 17 - .../printer/testdata/comment_standalone.input | 16 - .../hcl/printer/testdata/complexhcl.golden | 54 - .../hcl/hcl/printer/testdata/complexhcl.input | 53 - .../hcl/printer/testdata/empty_block.golden | 12 - .../hcl/printer/testdata/empty_block.input | 14 - .../hcl/hcl/printer/testdata/list.golden | 43 - .../hcl/hcl/printer/testdata/list.input | 37 - .../hcl/printer/testdata/list_comment.golden | 7 - .../hcl/printer/testdata/list_comment.input | 6 - .../printer/testdata/list_of_objects.golden | 10 - .../printer/testdata/list_of_objects.input | 10 - .../printer/testdata/multiline_string.golden | 7 - .../printer/testdata/multiline_string.input | 7 - .../printer/testdata/object_singleline.golden | 26 - .../printer/testdata/object_singleline.input | 19 - .../testdata/object_with_heredoc.golden | 6 - .../testdata/object_with_heredoc.input | 6 - .../hcl/hcl/test-fixtures/array_comment.hcl | 4 - .../hcl/hcl/test-fixtures/assign_colon.hcl | 6 - .../hcl/hcl/test-fixtures/comment.hcl | 15 - .../hcl/hcl/test-fixtures/comment_single.hcl | 1 - .../hcl/hcl/test-fixtures/complex.hcl | 42 - .../hcl/hcl/test-fixtures/complex_key.hcl | 1 - .../hashicorp/hcl/hcl/test-fixtures/empty.hcl | 0 .../hashicorp/hcl/hcl/test-fixtures/list.hcl | 1 - .../hcl/hcl/test-fixtures/list_comma.hcl | 1 - .../hcl/hcl/test-fixtures/multiple.hcl | 2 - .../hashicorp/hcl/hcl/test-fixtures/old.hcl | 3 - .../hcl/hcl/test-fixtures/structure.hcl | 5 - .../hcl/hcl/test-fixtures/structure_basic.hcl | 5 - .../hcl/hcl/test-fixtures/structure_empty.hcl | 1 - .../hashicorp/hcl/hcl/test-fixtures/types.hcl | 7 - .../hcl/json/parser/test-fixtures/array.json | 4 - .../parser/test-fixtures/bad_input_128.json | 1 - .../test-fixtures/bad_input_tf_8110.json | 7 - .../hcl/json/parser/test-fixtures/basic.json | 3 - .../test-fixtures/good_input_tf_8110.json | 7 - .../hcl/json/parser/test-fixtures/object.json | 5 - .../hcl/json/parser/test-fixtures/types.json | 10 - .../hcl/json/test-fixtures/array.json | 4 - .../hcl/json/test-fixtures/basic.json | 3 - .../hcl/json/test-fixtures/object.json | 5 - .../hcl/json/test-fixtures/types.json | 10 - .../hcl/test-fixtures/assign_deep.hcl | 5 - .../hashicorp/hcl/test-fixtures/basic.hcl | 2 - .../hashicorp/hcl/test-fixtures/basic.json | 4 - .../hcl/test-fixtures/basic_int_string.hcl | 1 - .../hcl/test-fixtures/basic_squish.hcl | 3 - .../hcl/test-fixtures/block_assign.hcl | 2 - .../hcl/test-fixtures/decode_policy.hcl | 15 - .../hcl/test-fixtures/decode_policy.json | 19 - .../hcl/test-fixtures/decode_tf_variable.hcl | 10 - .../hcl/test-fixtures/decode_tf_variable.json | 14 - .../hashicorp/hcl/test-fixtures/empty.hcl | 1 - .../hashicorp/hcl/test-fixtures/escape.hcl | 6 - .../hcl/test-fixtures/escape_backslash.hcl | 5 - .../hashicorp/hcl/test-fixtures/flat.hcl | 2 - .../hashicorp/hcl/test-fixtures/float.hcl | 1 - .../hashicorp/hcl/test-fixtures/float.json | 3 - .../hashicorp/hcl/test-fixtures/git_crypt.hcl | Bin 10 -> 0 bytes .../hcl/test-fixtures/interpolate.json | 3 - .../hcl/test-fixtures/list_of_lists.hcl | 2 - .../hcl/test-fixtures/list_of_maps.hcl | 4 - .../hashicorp/hcl/test-fixtures/multiline.hcl | 4 - .../hcl/test-fixtures/multiline.json | 3 - .../hcl/test-fixtures/multiline_bad.hcl | 4 - .../hcl/test-fixtures/multiline_indented.hcl | 4 - .../hcl/test-fixtures/multiline_literal.hcl | 2 - .../multiline_literal_with_hil.hcl | 2 - .../hcl/test-fixtures/multiline_no_eof.hcl | 5 - .../multiline_no_hanging_indent.hcl | 5 - .../hcl/test-fixtures/multiline_no_marker.hcl | 1 - .../test-fixtures/nested_block_comment.hcl | 5 - .../hcl/test-fixtures/nested_provider_bad.hcl | 5 - .../hcl/test-fixtures/null_strings.json | 7 - .../hcl/test-fixtures/object_list.json | 15 - .../hcl/test-fixtures/object_with_bool.hcl | 6 - .../hcl/test-fixtures/scientific.hcl | 6 - .../hcl/test-fixtures/scientific.json | 8 - .../hcl/test-fixtures/slice_expand.hcl | 7 - .../hashicorp/hcl/test-fixtures/structure.hcl | 5 - .../hcl/test-fixtures/structure.json | 8 - .../hcl/test-fixtures/structure2.hcl | 9 - .../hcl/test-fixtures/structure2.json | 10 - .../hcl/test-fixtures/structure_flat.json | 8 - .../hcl/test-fixtures/structure_flatmap.hcl | 7 - .../hcl/test-fixtures/structure_list.hcl | 6 - .../hcl/test-fixtures/structure_list.json | 7 - .../test-fixtures/structure_list_deep.json | 16 - .../test-fixtures/structure_list_empty.json | 3 - .../hcl/test-fixtures/structure_multi.hcl | 7 - .../hcl/test-fixtures/structure_multi.json | 11 - .../hcl/test-fixtures/terraform_heroku.hcl | 5 - .../hcl/test-fixtures/terraform_heroku.json | 6 - .../terraform_variable_invalid.json | 5 - .../hashicorp/hcl/test-fixtures/tfvars.hcl | 3 - .../unterminated_block_comment.hcl | 2 - .../hcl/test-fixtures/unterminated_brace.hcl | 2 - .../hashicorp/hcl/testhelper/unix2dos.go | 15 - .../magiconair/properties/assert/assert.go | 90 - .../properties/assert/assert_test.go | 55 - .../onsi/ginkgo/extensions/table/table.go | 98 - .../ginkgo/extensions/table/table_entry.go | 81 - .../extensions/table/table_suite_test.go | 13 - .../ginkgo/extensions/table/table_test.go | 64 - .../onsi/ginkgo/ginkgo/bootstrap_command.go | 202 - .../onsi/ginkgo/ginkgo/build_command.go | 68 - .../ginkgo/ginkgo/convert/ginkgo_ast_nodes.go | 123 - .../onsi/ginkgo/ginkgo/convert/import.go | 91 - .../ginkgo/ginkgo/convert/package_rewriter.go | 127 - .../onsi/ginkgo/ginkgo/convert/test_finder.go | 56 - .../ginkgo/convert/testfile_rewriter.go | 163 - .../ginkgo/convert/testing_t_rewriter.go | 130 - .../onsi/ginkgo/ginkgo/convert_command.go | 44 - .../onsi/ginkgo/ginkgo/generate_command.go | 167 - .../onsi/ginkgo/ginkgo/help_command.go | 31 - .../interrupthandler/interrupt_handler.go | 52 - .../sigquit_swallower_unix.go | 14 - .../sigquit_swallower_windows.go | 7 - vendor/github.com/onsi/ginkgo/ginkgo/main.go | 300 - .../onsi/ginkgo/ginkgo/nodot/nodot.go | 194 - .../ginkgo/ginkgo/nodot/nodot_suite_test.go | 91 - .../onsi/ginkgo/ginkgo/nodot/nodot_test.go | 81 - .../onsi/ginkgo/ginkgo/nodot_command.go | 76 - .../onsi/ginkgo/ginkgo/notifications.go | 141 - .../onsi/ginkgo/ginkgo/run_command.go | 192 - .../run_watch_and_build_command_flags.go | 167 - .../onsi/ginkgo/ginkgo/suite_runner.go | 173 - .../ginkgo/ginkgo/testrunner/log_writer.go | 52 - .../ginkgo/ginkgo/testrunner/run_result.go | 27 - .../ginkgo/ginkgo/testrunner/test_runner.go | 488 - .../ginkgo/testrunner/test_runner_test.go | 57 - .../ginkgo/ginkgo/testsuite/test_suite.go | 115 - .../ginkgo/testsuite/testsuite_suite_test.go | 13 - .../ginkgo/ginkgo/testsuite/testsuite_test.go | 201 - .../ginkgo/testsuite/vendor_check_go15.go | 16 - .../testsuite/vendor_check_go15_test.go | 201 - .../ginkgo/testsuite/vendor_check_go16.go | 15 - .../onsi/ginkgo/ginkgo/unfocus_command.go | 38 - .../onsi/ginkgo/ginkgo/version_command.go | 23 - .../onsi/ginkgo/ginkgo/watch/delta.go | 22 - .../onsi/ginkgo/ginkgo/watch/delta_tracker.go | 75 - .../onsi/ginkgo/ginkgo/watch/dependencies.go | 91 - .../onsi/ginkgo/ginkgo/watch/package_hash.go | 104 - .../ginkgo/ginkgo/watch/package_hashes.go | 85 - .../onsi/ginkgo/ginkgo/watch/suite.go | 87 - .../onsi/ginkgo/ginkgo/watch_command.go | 175 - .../convert_fixtures/extra_functions_test.go | 14 - .../convert_fixtures/nested/nested_test.go | 10 - .../subpackage/nested_subpackage_test.go | 9 - .../convert_fixtures/outside_package_test.go | 16 - .../_fixtures/convert_fixtures/xunit_test.go | 41 - .../extra_functions_test.go | 17 - .../fixtures_suite_test.go | 13 - .../nested_subpackage_test.go | 11 - .../convert_goldmasters/nested_suite_test.go | 13 - .../convert_goldmasters/nested_test.go | 13 - .../outside_package_test.go | 19 - .../convert_goldmasters/suite_test.go | 13 - .../convert_goldmasters/xunit_test.go | 44 - .../_fixtures/coverage_fixture/coverage.go | 21 - .../coverage_fixture_suite_test.go | 13 - .../coverage_fixture/coverage_fixture_test.go | 31 - .../external_coverage.go | 9 - .../does_not_compile_suite_test.go | 13 - .../does_not_compile/does_not_compile_test.go | 11 - .../eventually_failing_suite_test.go | 13 - .../eventually_failing_test.go | 29 - ...ing_synchronized_setup_tests_suite_test.go | 35 - .../fail_fixture/fail_fixture_suite_test.go | 13 - .../fail_fixture/fail_fixture_test.go | 99 - .../failing_after_suite_suite_test.go | 22 - .../failing_after_suite_test.go | 15 - .../failing_before_suite_suite_test.go | 22 - .../failing_before_suite_test.go | 15 - .../failing_ginkgo_tests.go | 5 - .../failing_ginkgo_tests_suite_test.go | 13 - .../failing_ginkgo_tests_test.go | 17 - .../_fixtures/flags_tests/flags.go | 9 - .../_fixtures/flags_tests/flags_suite_test.go | 13 - .../_fixtures/flags_tests/flags_test.go | 95 - .../focused_fixture_suite_test.go | 13 - .../focused_fixture/focused_fixture_test.go | 63 - .../hanging_suite/hanging_suite_suite_test.go | 13 - .../hanging_suite/hanging_suite_test.go | 29 - .../more_ginkgo_tests/more_ginkgo_tests.go | 5 - .../more_ginkgo_tests_suite_test.go | 13 - .../more_ginkgo_tests_test.go | 17 - .../_fixtures/no_test_fn/no_test_fn.go | 5 - .../_fixtures/no_test_fn/no_test_fn_test.go | 13 - .../_fixtures/no_tests/no_tests.go | 4 - .../passing_ginkgo_tests.go | 9 - .../passing_ginkgo_tests_suite_test.go | 13 - .../passing_ginkgo_tests_test.go | 30 - .../passing_suite_setup_suite_test.go | 26 - .../passing_suite_setup/passing_suite_test.go | 28 - .../progress_fixture_suite_test.go | 13 - .../progress_fixture/progress_fixture_test.go | 39 - .../skip_fixture/skip_fixture_suite_test.go | 13 - .../skip_fixture/skip_fixture_test.go | 72 - .../suite_command_tests/suite_command.go | 9 - .../suite_command_suite_test.go | 13 - .../suite_command_tests/suite_command_test.go | 18 - .../synchronized_setup_tests_suite_test.go | 43 - .../_fixtures/tags_tests/ignored_test.go | 17 - .../tags_tests/tags_tests_suite_test.go | 13 - .../_fixtures/tags_tests/tags_tests_test.go | 11 - .../test_description_suite_test.go | 13 - .../test_description/test_description_test.go | 23 - .../_fixtures/watch_fixtures/A/A.go | 7 - .../watch_fixtures/A/A_suite_test.go | 13 - .../_fixtures/watch_fixtures/A/A_test.go | 14 - .../_fixtures/watch_fixtures/B/B.go | 7 - .../watch_fixtures/B/B_suite_test.go | 13 - .../_fixtures/watch_fixtures/B/B_test.go | 14 - .../_fixtures/watch_fixtures/C/C.go | 5 - .../_fixtures/watch_fixtures/C/C.json | 3 - .../watch_fixtures/C/C_suite_test.go | 13 - .../_fixtures/watch_fixtures/C/C_test.go | 14 - .../_fixtures/watch_fixtures/D/D.go | 7 - .../watch_fixtures/D/D_suite_test.go | 13 - .../_fixtures/watch_fixtures/D/D_test.go | 14 - .../_fixtures/xunit_tests/xunit_tests.go | 5 - .../_fixtures/xunit_tests/xunit_tests_test.go | 11 - .../onsi/ginkgo/integration/convert_test.go | 121 - .../onsi/ginkgo/integration/coverage_test.go | 53 - .../onsi/ginkgo/integration/fail_test.go | 48 - .../onsi/ginkgo/integration/flags_test.go | 236 - .../onsi/ginkgo/integration/integration.go | 1 - .../integration/integration_suite_test.go | 91 - .../onsi/ginkgo/integration/interrupt_test.go | 51 - .../ginkgo/integration/precompiled_test.go | 53 - .../onsi/ginkgo/integration/progress_test.go | 75 - .../onsi/ginkgo/integration/run_test.go | 422 - .../onsi/ginkgo/integration/skip_test.go | 43 - .../ginkgo/integration/subcommand_test.go | 395 - .../ginkgo/integration/suite_command_test.go | 63 - .../ginkgo/integration/suite_setup_test.go | 178 - .../onsi/ginkgo/integration/tags_test.go | 27 - .../integration/test_description_test.go | 25 - .../integration/verbose_and_succinct_test.go | 90 - .../onsi/ginkgo/integration/watch_test.go | 275 - .../github.com/onsi/gomega/gbytes/buffer.go | 245 - .../onsi/gomega/gbytes/buffer_test.go | 205 - .../onsi/gomega/gbytes/gbuffer_suite_test.go | 13 - .../onsi/gomega/gbytes/io_wrappers.go | 85 - .../onsi/gomega/gbytes/io_wrappers_test.go | 188 - .../onsi/gomega/gbytes/say_matcher.go | 105 - .../onsi/gomega/gbytes/say_matcher_test.go | 163 - .../gomega/gexec/_fixture/firefly/main.go | 36 - vendor/github.com/onsi/gomega/gexec/build.go | 99 - .../onsi/gomega/gexec/build_test.go | 59 - .../onsi/gomega/gexec/exit_matcher.go | 86 - .../onsi/gomega/gexec/exit_matcher_test.go | 113 - .../onsi/gomega/gexec/gexec_suite_test.go | 26 - .../onsi/gomega/gexec/prefixed_writer.go | 53 - .../onsi/gomega/gexec/prefixed_writer_test.go | 43 - .../github.com/onsi/gomega/gexec/session.go | 305 - .../onsi/gomega/gexec/session_test.go | 351 - .../github.com/onsi/gomega/ghttp/handlers.go | 313 - .../onsi/gomega/ghttp/protobuf/protobuf.go | 3 - .../ghttp/protobuf/simple_message.pb.go | 55 - .../ghttp/protobuf/simple_message.proto | 9 - .../onsi/gomega/ghttp/test_server.go | 381 - .../gomega/ghttp/test_server_suite_test.go | 13 - .../onsi/gomega/ghttp/test_server_test.go | 1089 - .../onsi/gomega/gstruct/elements.go | 145 - .../onsi/gomega/gstruct/elements_test.go | 144 - .../gomega/gstruct/errors/nested_types.go | 72 - .../github.com/onsi/gomega/gstruct/fields.go | 141 - .../onsi/gomega/gstruct/fields_test.go | 76 - .../gstruct/gstruct_tests_suite_test.go | 13 - .../github.com/onsi/gomega/gstruct/ignore.go | 37 - .../onsi/gomega/gstruct/ignore_test.go | 23 - .../github.com/onsi/gomega/gstruct/pointer.go | 56 - .../onsi/gomega/gstruct/pointer_test.go | 33 - .../github.com/onsi/gomega/gstruct/types.go | 15 - .../internal/fakematcher/fake_matcher.go | 23 - .../matchers/test_data/xml/sample_01.xml | 6 - .../matchers/test_data/xml/sample_02.xml | 9 - .../matchers/test_data/xml/sample_03.xml | 1 - .../matchers/test_data/xml/sample_04.xml | 6 - .../matchers/test_data/xml/sample_05.xml | 211 - .../matchers/test_data/xml/sample_06.xml | 13 - .../matchers/test_data/xml/sample_07.xml | 13 - .../matchers/test_data/xml/sample_08.xml | 13 - .../matchers/test_data/xml/sample_09.xml | 4 - .../matchers/test_data/xml/sample_10.xml | 4 - .../matchers/test_data/xml/sample_11.xml | 7 - .../pelletier/go-toml/cmd/test_program.go | 91 - .../pelletier/go-toml/cmd/tomljson/main.go | 72 - .../go-toml/cmd/tomljson/main_test.go | 82 - .../pelletier/go-toml/cmd/tomll/main.go | 66 - .../github.com/pelletier/go-toml/query/doc.go | 175 - .../pelletier/go-toml/query/lexer.go | 357 - .../pelletier/go-toml/query/lexer_test.go | 179 - .../pelletier/go-toml/query/match.go | 232 - .../pelletier/go-toml/query/match_test.go | 202 - .../pelletier/go-toml/query/parser.go | 275 - .../pelletier/go-toml/query/parser_test.go | 482 - .../pelletier/go-toml/query/query.go | 158 - .../pelletier/go-toml/query/query_test.go | 157 - .../pelletier/go-toml/query/tokens.go | 107 - vendor/github.com/spf13/afero/sftpfs/file.go | 95 - vendor/github.com/spf13/afero/sftpfs/sftp.go | 129 - .../spf13/afero/sftpfs/sftp_test_go | 286 - .../github.com/spf13/cobra/cobra/cmd/add.go | 179 - .../spf13/cobra/cobra/cmd/add_test.go | 109 - .../spf13/cobra/cobra/cmd/golden_test.go | 77 - .../spf13/cobra/cobra/cmd/helpers.go | 150 - .../github.com/spf13/cobra/cobra/cmd/init.go | 234 - .../spf13/cobra/cobra/cmd/init_test.go | 83 - .../spf13/cobra/cobra/cmd/license_agpl.go | 683 - .../spf13/cobra/cobra/cmd/license_apache_2.go | 238 - .../cobra/cobra/cmd/license_bsd_clause_2.go | 71 - .../cobra/cobra/cmd/license_bsd_clause_3.go | 78 - .../spf13/cobra/cobra/cmd/license_gpl_2.go | 376 - .../spf13/cobra/cobra/cmd/license_gpl_3.go | 711 - .../spf13/cobra/cobra/cmd/license_lgpl.go | 186 - .../spf13/cobra/cobra/cmd/license_mit.go | 63 - .../spf13/cobra/cobra/cmd/licenses.go | 118 - .../spf13/cobra/cobra/cmd/project.go | 195 - .../spf13/cobra/cobra/cmd/project_test.go | 24 - .../github.com/spf13/cobra/cobra/cmd/root.go | 79 - .../cobra/cobra/cmd/testdata/LICENSE.golden | 202 - .../cobra/cobra/cmd/testdata/main.go.golden | 21 - .../cobra/cobra/cmd/testdata/root.go.golden | 89 - .../cobra/cobra/cmd/testdata/test.go.golden | 50 - vendor/github.com/spf13/cobra/cobra/main.go | 20 - vendor/github.com/spf13/cobra/doc/cmd_test.go | 145 - vendor/github.com/spf13/cobra/doc/man_docs.go | 236 - vendor/github.com/spf13/cobra/doc/man_docs.md | 31 - .../spf13/cobra/doc/man_docs_test.go | 216 - .../spf13/cobra/doc/man_examples_test.go | 35 - vendor/github.com/spf13/cobra/doc/md_docs.go | 159 - vendor/github.com/spf13/cobra/doc/md_docs.md | 115 - .../spf13/cobra/doc/md_docs_test.go | 124 - vendor/github.com/spf13/cobra/doc/util.go | 51 - .../github.com/spf13/cobra/doc/yaml_docs.go | 169 - .../github.com/spf13/cobra/doc/yaml_docs.md | 112 - .../spf13/cobra/doc/yaml_docs_test.go | 125 - vendor/github.com/spf13/pflag/verify/all.sh | 69 - vendor/github.com/spf13/pflag/verify/gofmt.sh | 19 - .../github.com/spf13/pflag/verify/golint.sh | 15 - .../github.com/spf13/viper/remote/remote.go | 104 - .../stretchr/testify/Godeps/Godeps.json | 23 - .../github.com/stretchr/testify/Godeps/Readme | 5 - .../stretchr/testify/_codegen/main.go | 287 - .../github.com/stretchr/testify/http/doc.go | 2 - .../testify/http/test_response_writer.go | 49 - .../testify/http/test_round_tripper.go | 17 - .../github.com/stretchr/testify/mock/doc.go | 44 - .../github.com/stretchr/testify/mock/mock.go | 763 - .../stretchr/testify/mock/mock_test.go | 1132 - .../github.com/stretchr/testify/suite/doc.go | 65 - .../stretchr/testify/suite/interfaces.go | 34 - .../stretchr/testify/suite/suite.go | 115 - .../stretchr/testify/suite/suite_test.go | 239 - vendor/golang.org/x/net/bpf/asm.go | 41 - vendor/golang.org/x/net/bpf/constants.go | 218 - vendor/golang.org/x/net/bpf/doc.go | 82 - vendor/golang.org/x/net/bpf/instructions.go | 704 - .../golang.org/x/net/bpf/instructions_test.go | 525 - vendor/golang.org/x/net/bpf/setter.go | 10 - .../x/net/bpf/testdata/all_instructions.bpf | 1 - .../x/net/bpf/testdata/all_instructions.txt | 79 - vendor/golang.org/x/net/bpf/vm.go | 140 - vendor/golang.org/x/net/bpf/vm_aluop_test.go | 512 - vendor/golang.org/x/net/bpf/vm_bpf_test.go | 192 - .../golang.org/x/net/bpf/vm_extension_test.go | 49 - .../golang.org/x/net/bpf/vm_instructions.go | 174 - vendor/golang.org/x/net/bpf/vm_jump_test.go | 380 - vendor/golang.org/x/net/bpf/vm_load_test.go | 246 - vendor/golang.org/x/net/bpf/vm_ret_test.go | 115 - .../golang.org/x/net/bpf/vm_scratch_test.go | 247 - vendor/golang.org/x/net/bpf/vm_test.go | 144 - vendor/golang.org/x/net/dict/dict.go | 210 - .../x/net/dns/dnsmessage/example_test.go | 132 - .../x/net/dns/dnsmessage/message.go | 1997 - .../x/net/dns/dnsmessage/message_test.go | 1116 - .../html/charset/testdata/HTTP-charset.html | 48 - .../charset/testdata/HTTP-vs-UTF-8-BOM.html | 48 - .../testdata/HTTP-vs-meta-charset.html | 49 - .../testdata/HTTP-vs-meta-content.html | 49 - .../testdata/No-encoding-declaration.html | 47 - .../x/net/html/charset/testdata/README | 9 - .../html/charset/testdata/UTF-16BE-BOM.html | Bin 2670 -> 0 bytes .../html/charset/testdata/UTF-16LE-BOM.html | Bin 2682 -> 0 bytes .../testdata/UTF-8-BOM-vs-meta-charset.html | 49 - .../testdata/UTF-8-BOM-vs-meta-content.html | 48 - .../testdata/meta-charset-attribute.html | 48 - .../testdata/meta-content-attribute.html | 48 - .../golang.org/x/net/html/testdata/go1.html | 2237 - .../x/net/html/testdata/webkit/README | 28 - .../x/net/html/testdata/webkit/adoption01.dat | 194 - .../x/net/html/testdata/webkit/adoption02.dat | 31 - .../x/net/html/testdata/webkit/comments01.dat | 135 - .../x/net/html/testdata/webkit/doctype01.dat | 370 - .../x/net/html/testdata/webkit/entities01.dat | 603 - .../x/net/html/testdata/webkit/entities02.dat | 249 - .../html/testdata/webkit/html5test-com.dat | 246 - .../x/net/html/testdata/webkit/inbody01.dat | 43 - .../x/net/html/testdata/webkit/isindex.dat | 40 - ...pending-spec-changes-plain-text-unsafe.dat | Bin 115 -> 0 bytes .../testdata/webkit/pending-spec-changes.dat | 52 - .../testdata/webkit/plain-text-unsafe.dat | Bin 4166 -> 0 bytes .../net/html/testdata/webkit/scriptdata01.dat | 308 - .../testdata/webkit/scripted/adoption01.dat | 15 - .../testdata/webkit/scripted/webkit01.dat | 28 - .../x/net/html/testdata/webkit/tables01.dat | 212 - .../x/net/html/testdata/webkit/tests1.dat | 1952 - .../x/net/html/testdata/webkit/tests10.dat | 799 - .../x/net/html/testdata/webkit/tests11.dat | 482 - .../x/net/html/testdata/webkit/tests12.dat | 62 - .../x/net/html/testdata/webkit/tests14.dat | 74 - .../x/net/html/testdata/webkit/tests15.dat | 208 - .../x/net/html/testdata/webkit/tests16.dat | 2299 - .../x/net/html/testdata/webkit/tests17.dat | 153 - .../x/net/html/testdata/webkit/tests18.dat | 269 - .../x/net/html/testdata/webkit/tests19.dat | 1237 - .../x/net/html/testdata/webkit/tests2.dat | 763 - .../x/net/html/testdata/webkit/tests20.dat | 455 - .../x/net/html/testdata/webkit/tests21.dat | 221 - .../x/net/html/testdata/webkit/tests22.dat | 157 - .../x/net/html/testdata/webkit/tests23.dat | 155 - .../x/net/html/testdata/webkit/tests24.dat | 79 - .../x/net/html/testdata/webkit/tests25.dat | 219 - .../x/net/html/testdata/webkit/tests26.dat | 313 - .../x/net/html/testdata/webkit/tests3.dat | 305 - .../x/net/html/testdata/webkit/tests4.dat | 59 - .../x/net/html/testdata/webkit/tests5.dat | 191 - .../x/net/html/testdata/webkit/tests6.dat | 663 - .../x/net/html/testdata/webkit/tests7.dat | 390 - .../x/net/html/testdata/webkit/tests8.dat | 148 - .../x/net/html/testdata/webkit/tests9.dat | 457 - .../testdata/webkit/tests_innerHTML_1.dat | 741 - .../x/net/html/testdata/webkit/tricky01.dat | 261 - .../x/net/html/testdata/webkit/webkit01.dat | 610 - .../x/net/html/testdata/webkit/webkit02.dat | 159 - 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 - vendor/golang.org/x/net/http2/ciphers_test.go | 309 - .../x/net/http2/client_conn_pool.go | 256 - .../x/net/http2/configure_transport.go | 80 - vendor/golang.org/x/net/http2/databuffer.go | 146 - .../golang.org/x/net/http2/databuffer_test.go | 157 - vendor/golang.org/x/net/http2/errors.go | 133 - vendor/golang.org/x/net/http2/errors_test.go | 24 - vendor/golang.org/x/net/http2/flow.go | 50 - vendor/golang.org/x/net/http2/flow_test.go | 53 - vendor/golang.org/x/net/http2/frame.go | 1579 - vendor/golang.org/x/net/http2/frame_test.go | 1191 - vendor/golang.org/x/net/http2/go16.go | 16 - vendor/golang.org/x/net/http2/go17.go | 106 - vendor/golang.org/x/net/http2/go17_not18.go | 36 - vendor/golang.org/x/net/http2/go18.go | 56 - vendor/golang.org/x/net/http2/go18_test.go | 79 - vendor/golang.org/x/net/http2/go19.go | 16 - vendor/golang.org/x/net/http2/go19_test.go | 60 - vendor/golang.org/x/net/http2/gotrack.go | 170 - vendor/golang.org/x/net/http2/gotrack_test.go | 33 - .../golang.org/x/net/http2/h2demo/.gitignore | 5 - vendor/golang.org/x/net/http2/h2demo/Makefile | 8 - vendor/golang.org/x/net/http2/h2demo/README | 16 - .../golang.org/x/net/http2/h2demo/h2demo.go | 538 - .../golang.org/x/net/http2/h2demo/launch.go | 302 - .../golang.org/x/net/http2/h2demo/rootCA.key | 27 - .../golang.org/x/net/http2/h2demo/rootCA.pem | 26 - .../golang.org/x/net/http2/h2demo/rootCA.srl | 1 - .../golang.org/x/net/http2/h2demo/server.crt | 20 - .../golang.org/x/net/http2/h2demo/server.key | 27 - vendor/golang.org/x/net/http2/h2demo/tmpl.go | 1991 - vendor/golang.org/x/net/http2/h2i/README.md | 97 - vendor/golang.org/x/net/http2/h2i/h2i.go | 522 - vendor/golang.org/x/net/http2/headermap.go | 78 - vendor/golang.org/x/net/http2/hpack/encode.go | 240 - .../x/net/http2/hpack/encode_test.go | 386 - vendor/golang.org/x/net/http2/hpack/hpack.go | 490 - .../x/net/http2/hpack/hpack_test.go | 722 - .../golang.org/x/net/http2/hpack/huffman.go | 212 - vendor/golang.org/x/net/http2/hpack/tables.go | 479 - .../x/net/http2/hpack/tables_test.go | 214 - vendor/golang.org/x/net/http2/http2.go | 391 - vendor/golang.org/x/net/http2/http2_test.go | 199 - vendor/golang.org/x/net/http2/not_go16.go | 21 - vendor/golang.org/x/net/http2/not_go17.go | 87 - vendor/golang.org/x/net/http2/not_go18.go | 29 - vendor/golang.org/x/net/http2/not_go19.go | 16 - vendor/golang.org/x/net/http2/pipe.go | 163 - vendor/golang.org/x/net/http2/pipe_test.go | 130 - vendor/golang.org/x/net/http2/server.go | 2857 - .../x/net/http2/server_push_test.go | 521 - vendor/golang.org/x/net/http2/server_test.go | 3721 - .../testdata/draft-ietf-httpbis-http2.xml | 5021 -- vendor/golang.org/x/net/http2/transport.go | 2275 - .../golang.org/x/net/http2/transport_test.go | 3686 - vendor/golang.org/x/net/http2/write.go | 370 - vendor/golang.org/x/net/http2/writesched.go | 242 - .../x/net/http2/writesched_priority.go | 452 - .../x/net/http2/writesched_priority_test.go | 541 - .../x/net/http2/writesched_random.go | 72 - .../x/net/http2/writesched_random_test.go | 44 - .../golang.org/x/net/http2/writesched_test.go | 125 - vendor/golang.org/x/net/http2/z_spec_test.go | 356 - vendor/golang.org/x/net/icmp/dstunreach.go | 41 - vendor/golang.org/x/net/icmp/echo.go | 45 - vendor/golang.org/x/net/icmp/endpoint.go | 113 - vendor/golang.org/x/net/icmp/example_test.go | 63 - vendor/golang.org/x/net/icmp/extension.go | 89 - .../golang.org/x/net/icmp/extension_test.go | 259 - vendor/golang.org/x/net/icmp/helper_posix.go | 75 - vendor/golang.org/x/net/icmp/interface.go | 236 - vendor/golang.org/x/net/icmp/ipv4.go | 61 - vendor/golang.org/x/net/icmp/ipv4_test.go | 83 - vendor/golang.org/x/net/icmp/ipv6.go | 23 - vendor/golang.org/x/net/icmp/listen_posix.go | 100 - vendor/golang.org/x/net/icmp/listen_stub.go | 33 - vendor/golang.org/x/net/icmp/message.go | 152 - vendor/golang.org/x/net/icmp/message_test.go | 134 - vendor/golang.org/x/net/icmp/messagebody.go | 41 - vendor/golang.org/x/net/icmp/mpls.go | 77 - vendor/golang.org/x/net/icmp/multipart.go | 109 - .../golang.org/x/net/icmp/multipart_test.go | 442 - vendor/golang.org/x/net/icmp/packettoobig.go | 43 - vendor/golang.org/x/net/icmp/paramprob.go | 63 - vendor/golang.org/x/net/icmp/ping_test.go | 200 - vendor/golang.org/x/net/icmp/sys_freebsd.go | 11 - vendor/golang.org/x/net/icmp/timeexceeded.go | 39 - vendor/golang.org/x/net/idna/example_test.go | 70 - vendor/golang.org/x/net/idna/idna.go | 680 - vendor/golang.org/x/net/idna/idna_test.go | 108 - vendor/golang.org/x/net/idna/punycode.go | 203 - vendor/golang.org/x/net/idna/punycode_test.go | 198 - vendor/golang.org/x/net/idna/tables.go | 4477 - vendor/golang.org/x/net/idna/trie.go | 72 - vendor/golang.org/x/net/idna/trieval.go | 114 - .../golang.org/x/net/internal/iana/const.go | 180 - vendor/golang.org/x/net/internal/iana/gen.go | 293 - .../x/net/internal/nettest/helper_bsd.go | 53 - .../x/net/internal/nettest/helper_nobsd.go | 15 - .../x/net/internal/nettest/helper_posix.go | 31 - .../x/net/internal/nettest/helper_stub.go | 32 - .../x/net/internal/nettest/helper_unix.go | 29 - .../x/net/internal/nettest/helper_windows.go | 42 - .../x/net/internal/nettest/interface.go | 94 - .../x/net/internal/nettest/rlimit.go | 11 - .../x/net/internal/nettest/stack.go | 147 - .../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 - .../x/net/internal/socket/defs_darwin.go | 44 - .../x/net/internal/socket/defs_dragonfly.go | 44 - .../x/net/internal/socket/defs_freebsd.go | 44 - .../x/net/internal/socket/defs_linux.go | 49 - .../x/net/internal/socket/defs_netbsd.go | 47 - .../x/net/internal/socket/defs_openbsd.go | 44 - .../x/net/internal/socket/defs_solaris.go | 44 - .../x/net/internal/socket/error_unix.go | 31 - .../x/net/internal/socket/error_windows.go | 26 - .../x/net/internal/socket/iovec_32bit.go | 15 - .../x/net/internal/socket/iovec_64bit.go | 15 - .../internal/socket/iovec_solaris_64bit.go | 15 - .../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 | 12 - .../x/net/internal/socket/msghdr_linux.go | 36 - .../net/internal/socket/msghdr_linux_32bit.go | 20 - .../net/internal/socket/msghdr_linux_64bit.go | 20 - .../x/net/internal/socket/msghdr_openbsd.go | 10 - .../internal/socket/msghdr_solaris_64bit.go | 34 - .../x/net/internal/socket/msghdr_stub.go | 14 - .../x/net/internal/socket/rawconn.go | 66 - .../x/net/internal/socket/rawconn_mmsg.go | 74 - .../x/net/internal/socket/rawconn_msg.go | 77 - .../x/net/internal/socket/rawconn_nommsg.go | 18 - .../x/net/internal/socket/rawconn_nomsg.go | 18 - .../x/net/internal/socket/rawconn_stub.go | 25 - .../x/net/internal/socket/reflect.go | 62 - .../x/net/internal/socket/socket.go | 285 - .../net/internal/socket/socket_go1_9_test.go | 256 - .../x/net/internal/socket/socket_test.go | 46 - .../golang.org/x/net/internal/socket/sys.go | 33 - .../x/net/internal/socket/sys_bsd.go | 17 - .../x/net/internal/socket/sys_bsdvar.go | 14 - .../x/net/internal/socket/sys_darwin.go | 7 - .../x/net/internal/socket/sys_dragonfly.go | 7 - .../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 - .../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 | 168 - .../x/net/internal/socket/sys_solaris.go | 71 - .../x/net/internal/socket/sys_solaris_amd64.s | 11 - .../x/net/internal/socket/sys_stub.go | 64 - .../x/net/internal/socket/sys_unix.go | 33 - .../x/net/internal/socket/sys_windows.go | 70 - .../x/net/internal/socket/zsys_darwin_386.go | 59 - .../net/internal/socket/zsys_darwin_amd64.go | 61 - .../x/net/internal/socket/zsys_darwin_arm.go | 59 - .../internal/socket/zsys_dragonfly_amd64.go | 61 - .../x/net/internal/socket/zsys_freebsd_386.go | 59 - .../net/internal/socket/zsys_freebsd_amd64.go | 61 - .../x/net/internal/socket/zsys_freebsd_arm.go | 59 - .../x/net/internal/socket/zsys_linux_386.go | 63 - .../x/net/internal/socket/zsys_linux_amd64.go | 66 - .../x/net/internal/socket/zsys_linux_arm.go | 63 - .../x/net/internal/socket/zsys_linux_arm64.go | 66 - .../x/net/internal/socket/zsys_linux_mips.go | 63 - .../net/internal/socket/zsys_linux_mips64.go | 66 - .../internal/socket/zsys_linux_mips64le.go | 66 - .../net/internal/socket/zsys_linux_mipsle.go | 63 - .../x/net/internal/socket/zsys_linux_ppc64.go | 66 - .../net/internal/socket/zsys_linux_ppc64le.go | 66 - .../x/net/internal/socket/zsys_linux_s390x.go | 66 - .../x/net/internal/socket/zsys_netbsd_386.go | 65 - .../net/internal/socket/zsys_netbsd_amd64.go | 68 - .../x/net/internal/socket/zsys_netbsd_arm.go | 59 - .../x/net/internal/socket/zsys_openbsd_386.go | 59 - .../net/internal/socket/zsys_openbsd_amd64.go | 61 - .../x/net/internal/socket/zsys_openbsd_arm.go | 59 - .../net/internal/socket/zsys_solaris_amd64.go | 60 - .../x/net/internal/timeseries/timeseries.go | 525 - .../internal/timeseries/timeseries_test.go | 170 - vendor/golang.org/x/net/ipv4/batch.go | 191 - vendor/golang.org/x/net/ipv4/bpf_test.go | 93 - vendor/golang.org/x/net/ipv4/control.go | 144 - vendor/golang.org/x/net/ipv4/control_bsd.go | 40 - .../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_test.go | 21 - vendor/golang.org/x/net/ipv4/control_unix.go | 73 - .../golang.org/x/net/ipv4/control_windows.go | 16 - vendor/golang.org/x/net/ipv4/defs_darwin.go | 77 - .../golang.org/x/net/ipv4/defs_dragonfly.go | 38 - vendor/golang.org/x/net/ipv4/defs_freebsd.go | 75 - vendor/golang.org/x/net/ipv4/defs_linux.go | 122 - vendor/golang.org/x/net/ipv4/defs_netbsd.go | 37 - vendor/golang.org/x/net/ipv4/defs_openbsd.go | 37 - vendor/golang.org/x/net/ipv4/defs_solaris.go | 84 - vendor/golang.org/x/net/ipv4/dgramopt.go | 265 - vendor/golang.org/x/net/ipv4/doc.go | 244 - vendor/golang.org/x/net/ipv4/endpoint.go | 187 - vendor/golang.org/x/net/ipv4/example_test.go | 224 - vendor/golang.org/x/net/ipv4/gen.go | 199 - vendor/golang.org/x/net/ipv4/genericopt.go | 57 - vendor/golang.org/x/net/ipv4/header.go | 159 - vendor/golang.org/x/net/ipv4/header_test.go | 228 - vendor/golang.org/x/net/ipv4/helper.go | 63 - vendor/golang.org/x/net/ipv4/iana.go | 34 - 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/icmp_test.go | 95 - .../golang.org/x/net/ipv4/multicast_test.go | 334 - .../x/net/ipv4/multicastlistener_test.go | 265 - .../x/net/ipv4/multicastsockopt_test.go | 195 - vendor/golang.org/x/net/ipv4/packet.go | 69 - vendor/golang.org/x/net/ipv4/packet_go1_8.go | 56 - vendor/golang.org/x/net/ipv4/packet_go1_9.go | 67 - vendor/golang.org/x/net/ipv4/payload.go | 23 - vendor/golang.org/x/net/ipv4/payload_cmsg.go | 36 - .../x/net/ipv4/payload_cmsg_go1_8.go | 59 - .../x/net/ipv4/payload_cmsg_go1_9.go | 67 - .../golang.org/x/net/ipv4/payload_nocmsg.go | 42 - .../x/net/ipv4/readwrite_go1_8_test.go | 248 - .../x/net/ipv4/readwrite_go1_9_test.go | 388 - .../golang.org/x/net/ipv4/readwrite_test.go | 140 - 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_asmreq.go | 119 - .../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 | 23 - 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 | 93 - 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 | 59 - vendor/golang.org/x/net/ipv4/sys_solaris.go | 57 - vendor/golang.org/x/net/ipv4/sys_ssmreq.go | 54 - .../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 - vendor/golang.org/x/net/ipv4/unicast_test.go | 247 - .../x/net/ipv4/unicastsockopt_test.go | 148 - 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 - .../golang.org/x/net/ipv4/zsys_linux_386.go | 148 - .../golang.org/x/net/ipv4/zsys_linux_amd64.go | 150 - .../golang.org/x/net/ipv4/zsys_linux_arm.go | 148 - .../golang.org/x/net/ipv4/zsys_linux_arm64.go | 150 - .../golang.org/x/net/ipv4/zsys_linux_mips.go | 148 - .../x/net/ipv4/zsys_linux_mips64.go | 150 - .../x/net/ipv4/zsys_linux_mips64le.go | 150 - .../x/net/ipv4/zsys_linux_mipsle.go | 148 - .../golang.org/x/net/ipv4/zsys_linux_ppc.go | 148 - .../golang.org/x/net/ipv4/zsys_linux_ppc64.go | 150 - .../x/net/ipv4/zsys_linux_ppc64le.go | 150 - .../golang.org/x/net/ipv4/zsys_linux_s390x.go | 150 - 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 | 119 - vendor/golang.org/x/net/ipv6/bpf_test.go | 96 - 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_test.go | 21 - vendor/golang.org/x/net/ipv6/control_unix.go | 55 - .../golang.org/x/net/ipv6/control_windows.go | 16 - vendor/golang.org/x/net/ipv6/defs_darwin.go | 112 - .../golang.org/x/net/ipv6/defs_dragonfly.go | 84 - vendor/golang.org/x/net/ipv6/defs_freebsd.go | 105 - vendor/golang.org/x/net/ipv6/defs_linux.go | 147 - vendor/golang.org/x/net/ipv6/defs_netbsd.go | 80 - vendor/golang.org/x/net/ipv6/defs_openbsd.go | 89 - vendor/golang.org/x/net/ipv6/defs_solaris.go | 114 - vendor/golang.org/x/net/ipv6/dgramopt.go | 302 - vendor/golang.org/x/net/ipv6/doc.go | 243 - vendor/golang.org/x/net/ipv6/endpoint.go | 128 - vendor/golang.org/x/net/ipv6/example_test.go | 216 - vendor/golang.org/x/net/ipv6/gen.go | 199 - vendor/golang.org/x/net/ipv6/genericopt.go | 58 - vendor/golang.org/x/net/ipv6/header.go | 55 - vendor/golang.org/x/net/ipv6/header_test.go | 55 - vendor/golang.org/x/net/ipv6/helper.go | 57 - vendor/golang.org/x/net/ipv6/iana.go | 82 - 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_test.go | 96 - vendor/golang.org/x/net/ipv6/icmp_windows.go | 22 - .../x/net/ipv6/mocktransponder_test.go | 32 - .../golang.org/x/net/ipv6/multicast_test.go | 264 - .../x/net/ipv6/multicastlistener_test.go | 261 - .../x/net/ipv6/multicastsockopt_test.go | 157 - vendor/golang.org/x/net/ipv6/payload.go | 23 - vendor/golang.org/x/net/ipv6/payload_cmsg.go | 35 - .../x/net/ipv6/payload_cmsg_go1_8.go | 55 - .../x/net/ipv6/payload_cmsg_go1_9.go | 57 - .../golang.org/x/net/ipv6/payload_nocmsg.go | 41 - .../x/net/ipv6/readwrite_go1_8_test.go | 242 - .../x/net/ipv6/readwrite_go1_9_test.go | 373 - .../golang.org/x/net/ipv6/readwrite_test.go | 148 - vendor/golang.org/x/net/ipv6/sockopt.go | 43 - vendor/golang.org/x/net/ipv6/sockopt_posix.go | 87 - vendor/golang.org/x/net/ipv6/sockopt_stub.go | 46 - vendor/golang.org/x/net/ipv6/sockopt_test.go | 133 - 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 | 23 - 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 | 106 - vendor/golang.org/x/net/ipv6/sys_freebsd.go | 92 - vendor/golang.org/x/net/ipv6/sys_linux.go | 74 - 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 - vendor/golang.org/x/net/ipv6/unicast_test.go | 184 - .../x/net/ipv6/unicastsockopt_test.go | 120 - 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 - .../golang.org/x/net/ipv6/zsys_linux_386.go | 170 - .../golang.org/x/net/ipv6/zsys_linux_amd64.go | 172 - .../golang.org/x/net/ipv6/zsys_linux_arm.go | 170 - .../golang.org/x/net/ipv6/zsys_linux_arm64.go | 172 - .../golang.org/x/net/ipv6/zsys_linux_mips.go | 170 - .../x/net/ipv6/zsys_linux_mips64.go | 172 - .../x/net/ipv6/zsys_linux_mips64le.go | 172 - .../x/net/ipv6/zsys_linux_mipsle.go | 170 - .../golang.org/x/net/ipv6/zsys_linux_ppc.go | 170 - .../golang.org/x/net/ipv6/zsys_linux_ppc64.go | 172 - .../x/net/ipv6/zsys_linux_ppc64le.go | 172 - .../golang.org/x/net/ipv6/zsys_linux_s390x.go | 172 - 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 - .../golang.org/x/net/lex/httplex/httplex.go | 351 - .../x/net/lex/httplex/httplex_test.go | 119 - vendor/golang.org/x/net/lif/address.go | 105 - vendor/golang.org/x/net/lif/address_test.go | 123 - vendor/golang.org/x/net/lif/binary.go | 115 - vendor/golang.org/x/net/lif/defs_solaris.go | 90 - vendor/golang.org/x/net/lif/lif.go | 43 - vendor/golang.org/x/net/lif/link.go | 126 - vendor/golang.org/x/net/lif/link_test.go | 63 - vendor/golang.org/x/net/lif/sys.go | 21 - .../golang.org/x/net/lif/sys_solaris_amd64.s | 8 - vendor/golang.org/x/net/lif/syscall.go | 28 - .../x/net/lif/zsys_solaris_amd64.go | 103 - vendor/golang.org/x/net/nettest/conntest.go | 456 - .../golang.org/x/net/nettest/conntest_go16.go | 24 - .../golang.org/x/net/nettest/conntest_go17.go | 24 - .../golang.org/x/net/nettest/conntest_test.go | 76 - vendor/golang.org/x/net/netutil/listen.go | 48 - .../golang.org/x/net/netutil/listen_test.go | 101 - vendor/golang.org/x/net/publicsuffix/gen.go | 713 - vendor/golang.org/x/net/publicsuffix/list.go | 135 - .../x/net/publicsuffix/list_test.go | 416 - vendor/golang.org/x/net/publicsuffix/table.go | 9419 -- .../x/net/publicsuffix/table_test.go | 16756 ---- vendor/golang.org/x/net/route/address.go | 425 - .../x/net/route/address_darwin_test.go | 63 - vendor/golang.org/x/net/route/address_test.go | 103 - vendor/golang.org/x/net/route/binary.go | 90 - vendor/golang.org/x/net/route/defs_darwin.go | 114 - .../golang.org/x/net/route/defs_dragonfly.go | 113 - vendor/golang.org/x/net/route/defs_freebsd.go | 337 - vendor/golang.org/x/net/route/defs_netbsd.go | 112 - vendor/golang.org/x/net/route/defs_openbsd.go | 116 - vendor/golang.org/x/net/route/interface.go | 64 - .../x/net/route/interface_announce.go | 32 - .../x/net/route/interface_classic.go | 66 - .../x/net/route/interface_freebsd.go | 78 - .../x/net/route/interface_multicast.go | 30 - .../x/net/route/interface_openbsd.go | 90 - vendor/golang.org/x/net/route/message.go | 72 - .../x/net/route/message_darwin_test.go | 34 - .../x/net/route/message_freebsd_test.go | 92 - vendor/golang.org/x/net/route/message_test.go | 239 - vendor/golang.org/x/net/route/route.go | 123 - .../golang.org/x/net/route/route_classic.go | 67 - .../golang.org/x/net/route/route_openbsd.go | 65 - vendor/golang.org/x/net/route/route_test.go | 390 - vendor/golang.org/x/net/route/sys.go | 39 - vendor/golang.org/x/net/route/sys_darwin.go | 87 - .../golang.org/x/net/route/sys_dragonfly.go | 76 - vendor/golang.org/x/net/route/sys_freebsd.go | 155 - vendor/golang.org/x/net/route/sys_netbsd.go | 71 - vendor/golang.org/x/net/route/sys_openbsd.go | 80 - vendor/golang.org/x/net/route/syscall.go | 28 - vendor/golang.org/x/net/route/zsys_darwin.go | 99 - .../golang.org/x/net/route/zsys_dragonfly.go | 98 - .../x/net/route/zsys_freebsd_386.go | 126 - .../x/net/route/zsys_freebsd_amd64.go | 123 - .../x/net/route/zsys_freebsd_arm.go | 123 - vendor/golang.org/x/net/route/zsys_netbsd.go | 97 - vendor/golang.org/x/net/route/zsys_openbsd.go | 101 - vendor/golang.org/x/net/trace/events.go | 532 - vendor/golang.org/x/net/trace/histogram.go | 365 - .../golang.org/x/net/trace/histogram_test.go | 325 - vendor/golang.org/x/net/trace/trace.go | 1082 - vendor/golang.org/x/net/trace/trace_go16.go | 21 - vendor/golang.org/x/net/trace/trace_go17.go | 21 - vendor/golang.org/x/net/trace/trace_test.go | 178 - vendor/golang.org/x/net/webdav/file.go | 796 - vendor/golang.org/x/net/webdav/file_go1.6.go | 17 - vendor/golang.org/x/net/webdav/file_go1.7.go | 16 - vendor/golang.org/x/net/webdav/file_test.go | 1184 - vendor/golang.org/x/net/webdav/if.go | 173 - vendor/golang.org/x/net/webdav/if_test.go | 322 - .../x/net/webdav/internal/xml/README | 11 - .../x/net/webdav/internal/xml/atom_test.go | 56 - .../x/net/webdav/internal/xml/example_test.go | 151 - .../x/net/webdav/internal/xml/marshal.go | 1223 - .../x/net/webdav/internal/xml/marshal_test.go | 1939 - .../x/net/webdav/internal/xml/read.go | 692 - .../x/net/webdav/internal/xml/read_test.go | 744 - .../x/net/webdav/internal/xml/typeinfo.go | 371 - .../x/net/webdav/internal/xml/xml.go | 1998 - .../x/net/webdav/internal/xml/xml_test.go | 752 - .../x/net/webdav/litmus_test_server.go | 94 - vendor/golang.org/x/net/webdav/lock.go | 445 - vendor/golang.org/x/net/webdav/lock_test.go | 731 - vendor/golang.org/x/net/webdav/prop.go | 418 - vendor/golang.org/x/net/webdav/prop_test.go | 613 - vendor/golang.org/x/net/webdav/webdav.go | 702 - vendor/golang.org/x/net/webdav/webdav_test.go | 344 - vendor/golang.org/x/net/webdav/xml.go | 519 - vendor/golang.org/x/net/webdav/xml_test.go | 906 - vendor/golang.org/x/net/websocket/client.go | 106 - vendor/golang.org/x/net/websocket/dial.go | 24 - .../golang.org/x/net/websocket/dial_test.go | 43 - .../x/net/websocket/exampledial_test.go | 31 - .../x/net/websocket/examplehandler_test.go | 26 - vendor/golang.org/x/net/websocket/hybi.go | 583 - .../golang.org/x/net/websocket/hybi_test.go | 608 - vendor/golang.org/x/net/websocket/server.go | 113 - .../golang.org/x/net/websocket/websocket.go | 448 - .../x/net/websocket/websocket_test.go | 665 - vendor/golang.org/x/net/xsrftoken/xsrf.go | 94 - .../golang.org/x/net/xsrftoken/xsrf_test.go | 83 - vendor/golang.org/x/sys/plan9/asm.s | 8 - vendor/golang.org/x/sys/plan9/asm_plan9_386.s | 30 - .../golang.org/x/sys/plan9/asm_plan9_amd64.s | 30 - vendor/golang.org/x/sys/plan9/const_plan9.go | 70 - vendor/golang.org/x/sys/plan9/dir_plan9.go | 212 - vendor/golang.org/x/sys/plan9/env_plan9.go | 27 - vendor/golang.org/x/sys/plan9/env_unset.go | 14 - vendor/golang.org/x/sys/plan9/errors_plan9.go | 50 - vendor/golang.org/x/sys/plan9/mkall.sh | 138 - vendor/golang.org/x/sys/plan9/mkerrors.sh | 246 - vendor/golang.org/x/sys/plan9/mksyscall.pl | 319 - .../golang.org/x/sys/plan9/mksysnum_plan9.sh | 23 - .../golang.org/x/sys/plan9/pwd_go15_plan9.go | 21 - vendor/golang.org/x/sys/plan9/pwd_plan9.go | 23 - vendor/golang.org/x/sys/plan9/race.go | 30 - vendor/golang.org/x/sys/plan9/race0.go | 25 - vendor/golang.org/x/sys/plan9/str.go | 22 - vendor/golang.org/x/sys/plan9/syscall.go | 74 - .../golang.org/x/sys/plan9/syscall_plan9.go | 349 - vendor/golang.org/x/sys/plan9/syscall_test.go | 33 - .../x/sys/plan9/zsyscall_plan9_386.go | 292 - .../x/sys/plan9/zsyscall_plan9_amd64.go | 292 - .../golang.org/x/sys/plan9/zsysnum_plan9.go | 49 - vendor/golang.org/x/sys/unix/linux/Dockerfile | 48 - vendor/golang.org/x/sys/unix/linux/mkall.go | 379 - .../golang.org/x/sys/unix/linux/mksysnum.pl | 85 - vendor/golang.org/x/sys/unix/linux/types.go | 607 - .../x/sys/windows/registry/export_test.go | 11 - .../golang.org/x/sys/windows/registry/key.go | 200 - .../x/sys/windows/registry/mksyscall.go | 7 - .../x/sys/windows/registry/registry_test.go | 756 - .../x/sys/windows/registry/syscall.go | 32 - .../x/sys/windows/registry/value.go | 384 - .../sys/windows/registry/zsyscall_windows.go | 120 - .../golang.org/x/sys/windows/svc/debug/log.go | 56 - .../x/sys/windows/svc/debug/service.go | 45 - vendor/golang.org/x/sys/windows/svc/event.go | 48 - .../x/sys/windows/svc/eventlog/install.go | 80 - .../x/sys/windows/svc/eventlog/log.go | 70 - .../x/sys/windows/svc/eventlog/log_test.go | 51 - .../x/sys/windows/svc/example/beep.go | 22 - .../x/sys/windows/svc/example/install.go | 92 - .../x/sys/windows/svc/example/main.go | 76 - .../x/sys/windows/svc/example/manage.go | 62 - .../x/sys/windows/svc/example/service.go | 82 - vendor/golang.org/x/sys/windows/svc/go12.c | 24 - vendor/golang.org/x/sys/windows/svc/go12.go | 11 - vendor/golang.org/x/sys/windows/svc/go13.go | 31 - .../x/sys/windows/svc/mgr/config.go | 139 - .../golang.org/x/sys/windows/svc/mgr/mgr.go | 162 - .../x/sys/windows/svc/mgr/mgr_test.go | 169 - .../x/sys/windows/svc/mgr/service.go | 72 - .../golang.org/x/sys/windows/svc/security.go | 62 - .../golang.org/x/sys/windows/svc/service.go | 363 - .../golang.org/x/sys/windows/svc/svc_test.go | 118 - vendor/golang.org/x/sys/windows/svc/sys_386.s | 68 - .../golang.org/x/sys/windows/svc/sys_amd64.s | 42 - vendor/golang.org/x/text/cases/cases.go | 162 - vendor/golang.org/x/text/cases/context.go | 376 - .../golang.org/x/text/cases/context_test.go | 438 - .../golang.org/x/text/cases/example_test.go | 53 - vendor/golang.org/x/text/cases/fold.go | 34 - vendor/golang.org/x/text/cases/fold_test.go | 51 - vendor/golang.org/x/text/cases/gen.go | 839 - vendor/golang.org/x/text/cases/gen_trieval.go | 219 - vendor/golang.org/x/text/cases/icu.go | 61 - vendor/golang.org/x/text/cases/icu_test.go | 210 - vendor/golang.org/x/text/cases/info.go | 82 - vendor/golang.org/x/text/cases/map.go | 816 - vendor/golang.org/x/text/cases/map_test.go | 950 - vendor/golang.org/x/text/cases/tables.go | 2211 - vendor/golang.org/x/text/cases/tables_test.go | 1154 - vendor/golang.org/x/text/cases/trieval.go | 215 - vendor/golang.org/x/text/cmd/gotext/doc.go | 35 - .../golang.org/x/text/cmd/gotext/extract.go | 195 - vendor/golang.org/x/text/cmd/gotext/main.go | 356 - .../golang.org/x/text/cmd/gotext/message.go | 127 - .../x/text/collate/build/builder.go | 702 - .../x/text/collate/build/builder_test.go | 290 - .../x/text/collate/build/colelem.go | 294 - .../x/text/collate/build/colelem_test.go | 215 - .../x/text/collate/build/contract.go | 309 - .../x/text/collate/build/contract_test.go | 266 - .../golang.org/x/text/collate/build/order.go | 393 - .../x/text/collate/build/order_test.go | 229 - .../golang.org/x/text/collate/build/table.go | 81 - .../golang.org/x/text/collate/build/trie.go | 290 - .../x/text/collate/build/trie_test.go | 107 - vendor/golang.org/x/text/collate/collate.go | 403 - .../golang.org/x/text/collate/collate_test.go | 482 - .../golang.org/x/text/collate/export_test.go | 51 - vendor/golang.org/x/text/collate/index.go | 32 - .../golang.org/x/text/collate/maketables.go | 553 - vendor/golang.org/x/text/collate/option.go | 239 - .../golang.org/x/text/collate/option_test.go | 209 - vendor/golang.org/x/text/collate/reg_test.go | 230 - vendor/golang.org/x/text/collate/sort.go | 81 - vendor/golang.org/x/text/collate/sort_test.go | 55 - .../golang.org/x/text/collate/table_test.go | 291 - vendor/golang.org/x/text/collate/tables.go | 73789 ---------------- .../x/text/collate/tools/colcmp/Makefile | 7 - .../x/text/collate/tools/colcmp/chars.go | 1156 - .../x/text/collate/tools/colcmp/col.go | 97 - .../x/text/collate/tools/colcmp/colcmp.go | 529 - .../x/text/collate/tools/colcmp/darwin.go | 111 - .../x/text/collate/tools/colcmp/gen.go | 183 - .../x/text/collate/tools/colcmp/icu.go | 209 - vendor/golang.org/x/text/currency/common.go | 66 - vendor/golang.org/x/text/currency/currency.go | 185 - .../x/text/currency/currency_test.go | 171 - .../x/text/currency/example_test.go | 27 - vendor/golang.org/x/text/currency/format.go | 215 - .../golang.org/x/text/currency/format_test.go | 70 - vendor/golang.org/x/text/currency/gen.go | 400 - .../golang.org/x/text/currency/gen_common.go | 70 - vendor/golang.org/x/text/currency/query.go | 152 - .../golang.org/x/text/currency/query_test.go | 107 - vendor/golang.org/x/text/currency/tables.go | 2574 - .../golang.org/x/text/currency/tables_test.go | 93 - .../x/text/encoding/ianaindex/example_test.go | 27 - .../x/text/encoding/ianaindex/gen.go | 192 - .../x/text/encoding/ianaindex/ianaindex.go | 209 - .../text/encoding/ianaindex/ianaindex_test.go | 192 - .../x/text/encoding/ianaindex/tables.go | 2348 - .../text/encoding/internal/enctest/enctest.go | 180 - .../encoding/testdata/candide-gb18030.txt | 510 - .../encoding/testdata/candide-utf-16le.txt | Bin 51932 -> 0 bytes .../encoding/testdata/candide-utf-32be.txt | Bin 103864 -> 0 bytes .../text/encoding/testdata/candide-utf-8.txt | 510 - .../testdata/candide-windows-1252.txt | 510 - .../encoding/testdata/rashomon-euc-jp.txt | 178 - .../testdata/rashomon-iso-2022-jp.txt | 178 - .../encoding/testdata/rashomon-shift-jis.txt | 178 - .../text/encoding/testdata/rashomon-utf-8.txt | 178 - ...nzi-bingfa-gb-levels-1-and-2-hz-gb2312.txt | 107 - .../sunzi-bingfa-gb-levels-1-and-2-utf-8.txt | 107 - .../testdata/sunzi-bingfa-simplified-gbk.txt | 107 - .../sunzi-bingfa-simplified-utf-8.txt | 107 - .../sunzi-bingfa-traditional-big5.txt | 106 - .../sunzi-bingfa-traditional-utf-8.txt | 106 - .../testdata/unsu-joh-eun-nal-euc-kr.txt | 175 - .../testdata/unsu-joh-eun-nal-utf-8.txt | 175 - .../x/text/encoding/unicode/utf32/utf32.go | 296 - .../text/encoding/unicode/utf32/utf32_test.go | 248 - .../x/text/feature/plural/common.go | 70 - .../x/text/feature/plural/data_test.go | 190 - .../x/text/feature/plural/example_test.go | 46 - .../golang.org/x/text/feature/plural/gen.go | 513 - .../x/text/feature/plural/gen_common.go | 74 - .../x/text/feature/plural/message.go | 238 - .../x/text/feature/plural/message_test.go | 197 - .../x/text/feature/plural/plural.go | 258 - .../x/text/feature/plural/plural_test.go | 216 - .../x/text/feature/plural/tables.go | 540 - .../x/text/internal/catmsg/catmsg.go | 366 - .../x/text/internal/catmsg/catmsg_test.go | 316 - .../x/text/internal/catmsg/codec.go | 407 - .../x/text/internal/catmsg/varint.go | 62 - .../x/text/internal/catmsg/varint_test.go | 123 - .../x/text/internal/colltab/collate_test.go | 121 - .../x/text/internal/colltab/collelem.go | 371 - .../x/text/internal/colltab/collelem_test.go | 183 - .../x/text/internal/colltab/colltab.go | 105 - .../x/text/internal/colltab/colltab_test.go | 64 - .../x/text/internal/colltab/contract.go | 145 - .../x/text/internal/colltab/contract_test.go | 131 - .../x/text/internal/colltab/iter.go | 178 - .../x/text/internal/colltab/iter_test.go | 63 - .../x/text/internal/colltab/numeric.go | 236 - .../x/text/internal/colltab/numeric_test.go | 159 - .../x/text/internal/colltab/table.go | 275 - .../x/text/internal/colltab/trie.go | 159 - .../x/text/internal/colltab/trie_test.go | 106 - .../x/text/internal/colltab/weighter.go | 31 - .../x/text/internal/colltab/weighter_test.go | 42 - .../golang.org/x/text/internal/export/README | 4 - .../text/internal/export/idna/common_test.go | 55 - .../text/internal/export/idna/example_test.go | 68 - .../x/text/internal/export/idna/gen.go | 259 - .../x/text/internal/export/idna/gen_common.go | 59 - .../x/text/internal/export/idna/gen_test.go | 82 - .../text/internal/export/idna/gen_trieval.go | 118 - .../x/text/internal/export/idna/idna.go | 680 - .../x/text/internal/export/idna/idna_test.go | 299 - .../x/text/internal/export/idna/punycode.go | 201 - .../internal/export/idna/punycode_test.go | 198 - .../x/text/internal/export/idna/tables.go | 4477 - .../x/text/internal/export/idna/trie.go | 70 - .../x/text/internal/export/idna/trieval.go | 114 - .../x/text/internal/format/format.go | 41 - .../x/text/internal/number/common.go | 40 - .../x/text/internal/number/decimal.go | 486 - .../x/text/internal/number/decimal_test.go | 312 - .../x/text/internal/number/format.go | 533 - .../x/text/internal/number/format_test.go | 522 - .../golang.org/x/text/internal/number/gen.go | 458 - .../x/text/internal/number/gen_common.go | 44 - .../x/text/internal/number/number.go | 154 - .../x/text/internal/number/number_test.go | 100 - .../x/text/internal/number/pattern.go | 485 - .../x/text/internal/number/pattern_test.go | 438 - .../internal/number/roundingmode_string.go | 16 - .../x/text/internal/number/tables.go | 1138 - .../x/text/internal/number/tables_test.go | 125 - .../x/text/internal/stringset/set.go | 86 - .../x/text/internal/stringset/set_test.go | 53 - .../x/text/internal/testtext/codesize.go | 53 - .../x/text/internal/testtext/flag.go | 22 - .../golang.org/x/text/internal/testtext/gc.go | 14 - .../x/text/internal/testtext/gccgo.go | 11 - .../x/text/internal/testtext/go1_6.go | 23 - .../x/text/internal/testtext/go1_7.go | 17 - .../x/text/internal/testtext/text.go | 105 - .../x/text/language/display/dict.go | 92 - .../x/text/language/display/dict_test.go | 39 - .../x/text/language/display/display.go | 343 - .../x/text/language/display/display_test.go | 651 - .../x/text/language/display/examples_test.go | 98 - .../x/text/language/display/lookup.go | 251 - .../x/text/language/display/maketables.go | 596 - .../x/text/language/display/tables.go | 50336 ----------- .../testdata/CLDRLocaleMatcherTest.txt | 389 - .../language/testdata/GoLocaleMatcherTest.txt | 226 - vendor/golang.org/x/text/message/catalog.go | 28 - .../x/text/message/catalog/catalog.go | 292 - .../x/text/message/catalog/catalog_test.go | 194 - .../golang.org/x/text/message/catalog/dict.go | 90 - vendor/golang.org/x/text/message/doc.go | 95 - .../x/text/message/examples_test.go | 42 - vendor/golang.org/x/text/message/fmt_test.go | 1889 - vendor/golang.org/x/text/message/format.go | 532 - vendor/golang.org/x/text/message/message.go | 169 - .../golang.org/x/text/message/message_test.go | 181 - vendor/golang.org/x/text/message/print.go | 1194 - vendor/golang.org/x/text/search/index.go | 35 - vendor/golang.org/x/text/search/pattern.go | 155 - .../golang.org/x/text/search/pattern_test.go | 357 - vendor/golang.org/x/text/search/search.go | 237 - vendor/golang.org/x/text/search/tables.go | 12448 --- .../x/text/secure/bidirule/bench_test.go | 54 - .../x/text/secure/bidirule/bidirule.go | 342 - .../x/text/secure/bidirule/bidirule_test.go | 825 - vendor/golang.org/x/text/secure/doc.go | 6 - .../x/text/secure/precis/benchmark_test.go | 82 - .../golang.org/x/text/secure/precis/class.go | 36 - .../x/text/secure/precis/class_test.go | 50 - .../x/text/secure/precis/context.go | 139 - vendor/golang.org/x/text/secure/precis/doc.go | 14 - .../x/text/secure/precis/enforce_test.go | 393 - vendor/golang.org/x/text/secure/precis/gen.go | 310 - .../x/text/secure/precis/gen_trieval.go | 68 - .../x/text/secure/precis/nickname.go | 70 - .../x/text/secure/precis/options.go | 153 - .../x/text/secure/precis/profile.go | 378 - .../x/text/secure/precis/profile_test.go | 149 - .../x/text/secure/precis/profiles.go | 78 - .../golang.org/x/text/secure/precis/tables.go | 3788 - .../x/text/secure/precis/tables_test.go | 69 - .../x/text/secure/precis/transformer.go | 32 - .../x/text/secure/precis/trieval.go | 64 - 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 - .../x/text/unicode/bidi/core_test.go | 224 - vendor/golang.org/x/text/unicode/bidi/gen.go | 133 - .../x/text/unicode/bidi/gen_ranges.go | 57 - .../x/text/unicode/bidi/gen_trieval.go | 64 - vendor/golang.org/x/text/unicode/bidi/prop.go | 206 - .../x/text/unicode/bidi/ranges_test.go | 53 - .../golang.org/x/text/unicode/bidi/tables.go | 1779 - .../x/text/unicode/bidi/tables_test.go | 82 - .../golang.org/x/text/unicode/bidi/trieval.go | 60 - .../x/text/unicode/rangetable/gen.go | 113 - .../x/text/unicode/rangetable/merge.go | 260 - .../x/text/unicode/rangetable/merge_test.go | 184 - .../x/text/unicode/rangetable/rangetable.go | 70 - .../unicode/rangetable/rangetable_test.go | 55 - .../x/text/unicode/rangetable/tables.go | 5735 -- .../x/text/unicode/runenames/bits.go | 59 - .../x/text/unicode/runenames/example_test.go | 118 - .../x/text/unicode/runenames/gen.go | 195 - .../x/text/unicode/runenames/gen_bits.go | 63 - .../x/text/unicode/runenames/runenames.go | 48 - .../text/unicode/runenames/runenames_test.go | 46 - .../x/text/unicode/runenames/tables.go | 15514 ---- vendor/golang.org/x/text/width/common_test.go | 92 - .../golang.org/x/text/width/example_test.go | 52 - vendor/golang.org/x/text/width/gen.go | 115 - vendor/golang.org/x/text/width/gen_common.go | 96 - vendor/golang.org/x/text/width/gen_trieval.go | 34 - vendor/golang.org/x/text/width/kind_string.go | 16 - vendor/golang.org/x/text/width/runes_test.go | 461 - vendor/golang.org/x/text/width/tables.go | 1284 - vendor/golang.org/x/text/width/tables_test.go | 59 - vendor/golang.org/x/text/width/transform.go | 239 - .../golang.org/x/text/width/transform_test.go | 701 - vendor/golang.org/x/text/width/trieval.go | 30 - vendor/golang.org/x/text/width/width.go | 206 - 3574 files changed, 42 insertions(+), 768974 deletions(-) create mode 100644 tests/ginkgo/read-cmd_test.go rename tests/ginkgo/{temp_test.go => read-file_test.go} (100%) delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/LICENSE delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/common.go delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/example_test.go delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/reader.go delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/reader_test.go delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/stat_atim.go delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/stat_atimespec.go delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/stat_unix.go delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/tar_test.go delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/gnu-multi-hdrs.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/gnu.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/hardlink.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/hdr-only.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/issue10968.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/issue11169.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/issue12435.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/neg-size.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/nil-uid.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/pax-multi-hdrs.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/pax-path-hdr.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/pax.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/small.txt delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/small2.txt delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/sparse-formats.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/star.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/ustar-file-reg.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/ustar.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/v7.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/writer-big-long.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/writer-big.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/writer.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/testdata/xattrs.tar delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/writer.go delete mode 100644 vendor/github.com/Microsoft/go-winio/archive/tar/writer_test.go delete mode 100644 vendor/github.com/Microsoft/go-winio/backuptar/noop.go delete mode 100644 vendor/github.com/Microsoft/go-winio/backuptar/tar.go delete mode 100644 vendor/github.com/Microsoft/go-winio/backuptar/tar_test.go delete mode 100644 vendor/github.com/Microsoft/go-winio/vhd/mksyscall_windows.go delete mode 100644 vendor/github.com/Microsoft/go-winio/vhd/vhd.go delete mode 100644 vendor/github.com/Microsoft/go-winio/vhd/zvhd.go delete mode 100644 vendor/github.com/Microsoft/go-winio/wim/decompress.go delete mode 100644 vendor/github.com/Microsoft/go-winio/wim/lzx/lzx.go delete mode 100644 vendor/github.com/Microsoft/go-winio/wim/validate/validate.go delete mode 100644 vendor/github.com/Microsoft/go-winio/wim/wim.go delete mode 100644 vendor/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go delete mode 100644 vendor/github.com/divolgin/archiver/compressor/fake_compressor/fake_compressor.go delete mode 100644 vendor/github.com/divolgin/archiver/extractor/fake_extractor/fake_extractor.go delete mode 100644 vendor/github.com/divolgin/archiver/extractor/test_helper/archiver.go delete mode 100644 vendor/github.com/docker/distribution/Godeps/Godeps.json delete mode 100644 vendor/github.com/docker/distribution/Godeps/Readme delete mode 100644 vendor/github.com/docker/distribution/cmd/digest/main.go delete mode 100644 vendor/github.com/docker/distribution/cmd/registry-api-descriptor-template/main.go delete mode 100644 vendor/github.com/docker/distribution/cmd/registry/config-cache.yml delete mode 100644 vendor/github.com/docker/distribution/cmd/registry/config-dev.yml delete mode 100644 vendor/github.com/docker/distribution/cmd/registry/config-example.yml delete mode 100644 vendor/github.com/docker/distribution/cmd/registry/main.go delete mode 100644 vendor/github.com/docker/distribution/configuration/configuration.go delete mode 100644 vendor/github.com/docker/distribution/configuration/configuration_test.go delete mode 100644 vendor/github.com/docker/distribution/configuration/parser.go delete mode 100644 vendor/github.com/docker/distribution/context/context.go delete mode 100644 vendor/github.com/docker/distribution/context/doc.go delete mode 100644 vendor/github.com/docker/distribution/context/http.go delete mode 100644 vendor/github.com/docker/distribution/context/http_test.go delete mode 100644 vendor/github.com/docker/distribution/context/logger.go delete mode 100644 vendor/github.com/docker/distribution/context/trace.go delete mode 100644 vendor/github.com/docker/distribution/context/trace_test.go delete mode 100644 vendor/github.com/docker/distribution/context/util.go delete mode 100644 vendor/github.com/docker/distribution/context/version.go delete mode 100644 vendor/github.com/docker/distribution/context/version_test.go delete mode 100644 vendor/github.com/docker/distribution/contrib/apache/README.MD delete mode 100644 vendor/github.com/docker/distribution/contrib/apache/apache.conf delete mode 100644 vendor/github.com/docker/distribution/contrib/compose/README.md delete mode 100644 vendor/github.com/docker/distribution/contrib/compose/docker-compose.yml delete mode 100644 vendor/github.com/docker/distribution/contrib/compose/nginx/Dockerfile delete mode 100644 vendor/github.com/docker/distribution/contrib/compose/nginx/docker-registry-v2.conf delete mode 100644 vendor/github.com/docker/distribution/contrib/compose/nginx/docker-registry.conf delete mode 100644 vendor/github.com/docker/distribution/contrib/compose/nginx/nginx.conf delete mode 100644 vendor/github.com/docker/distribution/contrib/compose/nginx/registry.conf delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/Dockerfile delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/README.md delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/docker-compose.yml delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/golem.conf delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/helpers.bash delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/install_certs.sh delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/malevolent-certs/localregistry.cert delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/malevolent-certs/localregistry.key delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/malevolent.bats delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/nginx/Dockerfile delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/nginx/docker-registry-v2.conf delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/nginx/nginx.conf delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry-basic.conf delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry-noauth.conf delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry.conf delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/nginx/test.passwd delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/nginx/v1/search.json delete mode 100755 vendor/github.com/docker/distribution/contrib/docker-integration/run_multiversion.sh delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tls.bats delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/token.bats delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/.htpasswd delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/Dockerfile delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/auth.localregistry.cert delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/auth.localregistry.key delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/localregistry.cert delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/localregistry.key delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/signing.cert delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/signing.key delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/registry-config-notls.yml delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/registry-config.yml delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/.htpasswd delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/Dockerfile delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/auth.localregistry.cert delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/auth.localregistry.key delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/localregistry.cert delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/localregistry.key delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/signing.cert delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/signing.key delete mode 100644 vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/registry-config.yml delete mode 100644 vendor/github.com/docker/distribution/contrib/token-server/errors.go delete mode 100644 vendor/github.com/docker/distribution/contrib/token-server/main.go delete mode 100644 vendor/github.com/docker/distribution/contrib/token-server/token.go delete mode 100644 vendor/github.com/docker/distribution/docs/README.md delete mode 100644 vendor/github.com/docker/distribution/docs/architecture.md delete mode 100644 vendor/github.com/docker/distribution/docs/configuration.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/api.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/api.md.tmpl delete mode 100644 vendor/github.com/docker/distribution/docs/spec/auth/index.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/auth/jwt.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/auth/oauth.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/auth/scope.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/auth/token.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/implementations.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/index.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/json.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/manifest-v2-1.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/manifest-v2-2.md delete mode 100644 vendor/github.com/docker/distribution/docs/spec/menu.md delete mode 100644 vendor/github.com/docker/distribution/health/api/api.go delete mode 100644 vendor/github.com/docker/distribution/health/api/api_test.go delete mode 100644 vendor/github.com/docker/distribution/health/checks/checks.go delete mode 100644 vendor/github.com/docker/distribution/health/checks/checks_test.go delete mode 100644 vendor/github.com/docker/distribution/health/doc.go delete mode 100644 vendor/github.com/docker/distribution/health/health.go delete mode 100644 vendor/github.com/docker/distribution/health/health_test.go delete mode 100644 vendor/github.com/docker/distribution/manifest/doc.go delete mode 100644 vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist.go delete mode 100644 vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist_test.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema1/config_builder.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema1/config_builder_test.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema1/manifest.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema1/manifest_test.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema1/reference_builder.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema1/reference_builder_test.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema1/sign.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema1/verify.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema2/builder.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema2/builder_test.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema2/manifest.go delete mode 100644 vendor/github.com/docker/distribution/manifest/schema2/manifest_test.go delete mode 100644 vendor/github.com/docker/distribution/manifest/versioned.go delete mode 100644 vendor/github.com/docker/distribution/notifications/bridge.go delete mode 100644 vendor/github.com/docker/distribution/notifications/bridge_test.go delete mode 100644 vendor/github.com/docker/distribution/notifications/endpoint.go delete mode 100644 vendor/github.com/docker/distribution/notifications/event.go delete mode 100644 vendor/github.com/docker/distribution/notifications/event_test.go delete mode 100644 vendor/github.com/docker/distribution/notifications/http.go delete mode 100644 vendor/github.com/docker/distribution/notifications/http_test.go delete mode 100644 vendor/github.com/docker/distribution/notifications/listener.go delete mode 100644 vendor/github.com/docker/distribution/notifications/listener_test.go delete mode 100644 vendor/github.com/docker/distribution/notifications/metrics.go delete mode 100644 vendor/github.com/docker/distribution/notifications/sinks.go delete mode 100644 vendor/github.com/docker/distribution/notifications/sinks_test.go delete mode 100644 vendor/github.com/docker/distribution/project/dev-image/Dockerfile delete mode 100644 vendor/github.com/docker/distribution/project/hooks/README.md delete mode 100755 vendor/github.com/docker/distribution/project/hooks/configure-hooks.sh delete mode 100755 vendor/github.com/docker/distribution/project/hooks/pre-commit delete mode 100644 vendor/github.com/docker/distribution/registry/api/errcode/errors.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/errcode/errors_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/errcode/handler.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/errcode/register.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/v2/descriptors.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/v2/doc.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/v2/errors.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/v2/headerparser.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/v2/headerparser_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/v2/routes.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/v2/routes_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/v2/urls.go delete mode 100644 vendor/github.com/docker/distribution/registry/api/v2/urls_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/auth.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/htpasswd/access.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/htpasswd/access_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/htpasswd/htpasswd.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/htpasswd/htpasswd_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/silly/access.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/silly/access_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/token/accesscontroller.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/token/stringset.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/token/token.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/token/token_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/auth/token/util.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/auth/api_version.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/auth/challenge/addr.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/auth/session.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/auth/session_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/blob_writer.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/blob_writer_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/errors.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/errors_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/repository.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/repository_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/transport/http_reader.go delete mode 100644 vendor/github.com/docker/distribution/registry/client/transport/transport.go delete mode 100644 vendor/github.com/docker/distribution/registry/doc.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/api_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/app.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/app_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/basicauth.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/basicauth_prego14.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/blob.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/blobupload.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/catalog.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/context.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/health_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/helpers.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/hmac.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/hmac_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/hooks.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/images.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/mail.go delete mode 100644 vendor/github.com/docker/distribution/registry/handlers/tags.go delete mode 100644 vendor/github.com/docker/distribution/registry/listener/listener.go delete mode 100644 vendor/github.com/docker/distribution/registry/middleware/registry/middleware.go delete mode 100644 vendor/github.com/docker/distribution/registry/middleware/repository/middleware.go delete mode 100644 vendor/github.com/docker/distribution/registry/proxy/proxyauth.go delete mode 100644 vendor/github.com/docker/distribution/registry/proxy/proxyblobstore.go delete mode 100644 vendor/github.com/docker/distribution/registry/proxy/proxyblobstore_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/proxy/proxymanifeststore.go delete mode 100644 vendor/github.com/docker/distribution/registry/proxy/proxymanifeststore_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/proxy/proxymetrics.go delete mode 100644 vendor/github.com/docker/distribution/registry/proxy/proxyregistry.go delete mode 100644 vendor/github.com/docker/distribution/registry/proxy/proxytagservice.go delete mode 100644 vendor/github.com/docker/distribution/registry/proxy/proxytagservice_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/proxy/scheduler/scheduler.go delete mode 100644 vendor/github.com/docker/distribution/registry/proxy/scheduler/scheduler_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/registry.go delete mode 100644 vendor/github.com/docker/distribution/registry/registry_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/root.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/blob_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/blobcachemetrics.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/blobserver.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/blobstore.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/blobwriter.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/blobwriter_nonresumable.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/blobwriter_resumable.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/cache/cache.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/cache/cachecheck/suite.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/cache/cachedblobdescriptorstore.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/cache/memory/memory.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/cache/memory/memory_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/cache/redis/redis.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/cache/redis/redis_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/catalog.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/catalog_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/doc.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/azure/azure.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/azure/azure_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/base/base.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/base/regulator.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/factory/factory.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/fileinfo.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/filesystem/driver.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/filesystem/driver_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/gcs/doc.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/gcs/gcs.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/gcs/gcs_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/inmemory/driver.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/inmemory/driver_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/inmemory/mfs.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/middleware/cloudfront/middleware.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/middleware/redirect/middleware.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/middleware/redirect/middleware_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/middleware/storagemiddleware.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/oss/doc.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/oss/oss.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/oss/oss_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3_v2_signer.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/s3-goamz/s3.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/s3-goamz/s3_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/storagedriver.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/swift/swift.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/swift/swift_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/testdriver/testdriver.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/driver/testsuites/testsuites.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/filereader.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/filereader_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/garbagecollect.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/garbagecollect_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/io.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/linkedblobstore.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/linkedblobstore_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/manifestlisthandler.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/manifeststore.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/manifeststore_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/paths.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/paths_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/purgeuploads.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/purgeuploads_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/registry.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/schema2manifesthandler.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/schema2manifesthandler_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/signedmanifesthandler.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/tagstore.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/tagstore_test.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/util.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/vacuum.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/walk.go delete mode 100644 vendor/github.com/docker/distribution/registry/storage/walk_test.go delete mode 100644 vendor/github.com/docker/distribution/testutil/handler.go delete mode 100644 vendor/github.com/docker/distribution/testutil/manifests.go delete mode 100644 vendor/github.com/docker/distribution/testutil/tarfile.go delete mode 100644 vendor/github.com/docker/distribution/uuid/uuid.go delete mode 100644 vendor/github.com/docker/distribution/uuid/uuid_test.go delete mode 100644 vendor/github.com/docker/distribution/version/print.go delete mode 100644 vendor/github.com/docker/distribution/version/version.go delete mode 100755 vendor/github.com/docker/distribution/version/version.sh delete mode 100644 vendor/github.com/docker/docker/.github/ISSUE_TEMPLATE.md delete mode 100644 vendor/github.com/docker/docker/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 vendor/github.com/docker/docker/api/errors/errors.go delete mode 100644 vendor/github.com/docker/docker/api/fixtures/keyfile delete mode 100644 vendor/github.com/docker/docker/api/server/httputils/decoder.go delete mode 100644 vendor/github.com/docker/docker/api/server/httputils/errors.go delete mode 100644 vendor/github.com/docker/docker/api/server/httputils/form.go delete mode 100644 vendor/github.com/docker/docker/api/server/httputils/form_test.go delete mode 100644 vendor/github.com/docker/docker/api/server/httputils/httputils.go delete mode 100644 vendor/github.com/docker/docker/api/server/httputils/httputils_write_json.go delete mode 100644 vendor/github.com/docker/docker/api/server/httputils/httputils_write_json_go16.go delete mode 100644 vendor/github.com/docker/docker/api/server/middleware.go delete mode 100644 vendor/github.com/docker/docker/api/server/middleware/cors.go delete mode 100644 vendor/github.com/docker/docker/api/server/middleware/debug.go delete mode 100644 vendor/github.com/docker/docker/api/server/middleware/experimental.go delete mode 100644 vendor/github.com/docker/docker/api/server/middleware/middleware.go delete mode 100644 vendor/github.com/docker/docker/api/server/middleware/version.go delete mode 100644 vendor/github.com/docker/docker/api/server/middleware/version_test.go delete mode 100644 vendor/github.com/docker/docker/api/server/profiler.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/build/backend.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/build/build.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/build/build_routes.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/checkpoint/backend.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/checkpoint/checkpoint.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/checkpoint/checkpoint_routes.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/container/backend.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/container/container.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/container/container_routes.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/container/copy.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/container/exec.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/container/inspect.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/experimental.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/image/backend.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/image/image.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/image/image_routes.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/local.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/network/backend.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/network/filter.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/network/network.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/network/network_routes.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/plugin/backend.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/plugin/plugin.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/plugin/plugin_routes.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/router.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/swarm/backend.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/swarm/cluster.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/swarm/cluster_routes.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/system/backend.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/system/system.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/system/system_routes.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/volume/backend.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/volume/volume.go delete mode 100644 vendor/github.com/docker/docker/api/server/router/volume/volume_routes.go delete mode 100644 vendor/github.com/docker/docker/api/server/router_swapper.go delete mode 100644 vendor/github.com/docker/docker/api/server/server.go delete mode 100644 vendor/github.com/docker/docker/api/server/server_test.go delete mode 100644 vendor/github.com/docker/docker/api/templates/server/operation.gotmpl delete mode 100644 vendor/github.com/docker/docker/api/types/backend/backend.go delete mode 100644 vendor/github.com/docker/docker/api/types/versions/v1p19/types.go delete mode 100644 vendor/github.com/docker/docker/api/types/versions/v1p20/types.go delete mode 100644 vendor/github.com/docker/docker/builder/builder.go delete mode 100644 vendor/github.com/docker/docker/builder/context.go delete mode 100644 vendor/github.com/docker/docker/builder/context_test.go delete mode 100644 vendor/github.com/docker/docker/builder/context_unix.go delete mode 100644 vendor/github.com/docker/docker/builder/context_windows.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/bflag.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/bflag_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/builder.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/builder_unix.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/builder_windows.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/command/command.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/dispatchers.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/dispatchers_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/dispatchers_unix.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/dispatchers_unix_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/dispatchers_windows.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/dispatchers_windows_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/envVarTest delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/evaluator.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/evaluator_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/evaluator_unix.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/evaluator_windows.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/internals.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/internals_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/internals_unix.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/internals_windows.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/internals_windows_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/dumper/main.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/json_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/line_parsers.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/parser.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/parser_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfile-line/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles-negative/env_no_value/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles-negative/shykes-nested-json/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/ADD-COPY-with-JSON/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/ADD-COPY-with-JSON/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-consuldock/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-consuldock/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-docker-consul/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-docker-consul/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/continueIndent/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/continueIndent/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/cpuguy83-nagios/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/cpuguy83-nagios/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/docker/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/docker/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/env/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/env/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-after-comment/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-after-comment/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-nonewline/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-nonewline/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escapes/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escapes/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/flags/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/flags/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/health/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/health/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/influxdb/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/influxdb/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string-double/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-single-quotes/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-single-quotes/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-bracket/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-string/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-string/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/json/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/json/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/kartar-entrypoint-oddities/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/kartar-entrypoint-oddities/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/lk4d4-the-edge-case-generator/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/lk4d4-the-edge-case-generator/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mail/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mail/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/multiple-volumes/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/multiple-volumes/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mumble/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mumble/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/nginx/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/nginx/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/tf2/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/tf2/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/weechat/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/weechat/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/znc/Dockerfile delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/znc/result delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/parser/utils.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/shell_parser.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/shell_parser_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/support.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/support_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/utils_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerfile/wordsTest delete mode 100644 vendor/github.com/docker/docker/builder/dockerignore.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerignore/dockerignore.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerignore/dockerignore_test.go delete mode 100644 vendor/github.com/docker/docker/builder/dockerignore_test.go delete mode 100644 vendor/github.com/docker/docker/builder/git.go delete mode 100644 vendor/github.com/docker/docker/builder/remote.go delete mode 100644 vendor/github.com/docker/docker/builder/remote_test.go delete mode 100644 vendor/github.com/docker/docker/builder/tarsum.go delete mode 100644 vendor/github.com/docker/docker/builder/tarsum_test.go delete mode 100644 vendor/github.com/docker/docker/builder/utils_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/bundlefile/bundlefile.go delete mode 100644 vendor/github.com/docker/docker/cli/command/bundlefile/bundlefile_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/checkpoint/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/checkpoint/create.go delete mode 100644 vendor/github.com/docker/docker/cli/command/checkpoint/list.go delete mode 100644 vendor/github.com/docker/docker/cli/command/checkpoint/remove.go delete mode 100644 vendor/github.com/docker/docker/cli/command/cli.go delete mode 100644 vendor/github.com/docker/docker/cli/command/commands/commands.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/attach.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/commit.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/cp.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/create.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/diff.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/exec.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/exec_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/export.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/hijack.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/inspect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/kill.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/list.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/logs.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/pause.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/port.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/prune.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/ps_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/rename.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/restart.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/rm.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/run.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/start.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/stats.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/stats_helpers.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/stats_unit_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/stop.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/top.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/tty.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/unpause.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/update.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/utils.go delete mode 100644 vendor/github.com/docker/docker/cli/command/container/wait.go delete mode 100644 vendor/github.com/docker/docker/cli/command/events_utils.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/container.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/container_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/custom.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/custom_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/disk_usage.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/formatter.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/image.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/image_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/network.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/network_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/reflect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/reflect_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/service.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/stats.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/stats_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/volume.go delete mode 100644 vendor/github.com/docker/docker/cli/command/formatter/volume_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/idresolver/idresolver.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/build.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/history.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/import.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/inspect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/list.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/load.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/prune.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/pull.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/push.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/remove.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/save.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/tag.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/trust.go delete mode 100644 vendor/github.com/docker/docker/cli/command/image/trust_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/in.go delete mode 100644 vendor/github.com/docker/docker/cli/command/inspect/inspector.go delete mode 100644 vendor/github.com/docker/docker/cli/command/inspect/inspector_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/network/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/network/connect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/network/create.go delete mode 100644 vendor/github.com/docker/docker/cli/command/network/disconnect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/network/inspect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/network/list.go delete mode 100644 vendor/github.com/docker/docker/cli/command/network/prune.go delete mode 100644 vendor/github.com/docker/docker/cli/command/network/remove.go delete mode 100644 vendor/github.com/docker/docker/cli/command/node/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/node/demote.go delete mode 100644 vendor/github.com/docker/docker/cli/command/node/inspect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/node/list.go delete mode 100644 vendor/github.com/docker/docker/cli/command/node/opts.go delete mode 100644 vendor/github.com/docker/docker/cli/command/node/promote.go delete mode 100644 vendor/github.com/docker/docker/cli/command/node/ps.go delete mode 100644 vendor/github.com/docker/docker/cli/command/node/remove.go delete mode 100644 vendor/github.com/docker/docker/cli/command/node/update.go delete mode 100644 vendor/github.com/docker/docker/cli/command/out.go delete mode 100644 vendor/github.com/docker/docker/cli/command/plugin/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/plugin/create.go delete mode 100644 vendor/github.com/docker/docker/cli/command/plugin/disable.go delete mode 100644 vendor/github.com/docker/docker/cli/command/plugin/enable.go delete mode 100644 vendor/github.com/docker/docker/cli/command/plugin/inspect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/plugin/install.go delete mode 100644 vendor/github.com/docker/docker/cli/command/plugin/list.go delete mode 100644 vendor/github.com/docker/docker/cli/command/plugin/push.go delete mode 100644 vendor/github.com/docker/docker/cli/command/plugin/remove.go delete mode 100644 vendor/github.com/docker/docker/cli/command/plugin/set.go delete mode 100644 vendor/github.com/docker/docker/cli/command/plugin/upgrade.go delete mode 100644 vendor/github.com/docker/docker/cli/command/prune/prune.go delete mode 100644 vendor/github.com/docker/docker/cli/command/registry.go delete mode 100644 vendor/github.com/docker/docker/cli/command/registry/login.go delete mode 100644 vendor/github.com/docker/docker/cli/command/registry/logout.go delete mode 100644 vendor/github.com/docker/docker/cli/command/registry/search.go delete mode 100644 vendor/github.com/docker/docker/cli/command/secret/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/secret/create.go delete mode 100644 vendor/github.com/docker/docker/cli/command/secret/inspect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/secret/ls.go delete mode 100644 vendor/github.com/docker/docker/cli/command/secret/remove.go delete mode 100644 vendor/github.com/docker/docker/cli/command/secret/utils.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/create.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/inspect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/inspect_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/list.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/logs.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/opts.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/opts_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/parse.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/ps.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/remove.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/scale.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/trust.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/update.go delete mode 100644 vendor/github.com/docker/docker/cli/command/service/update_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/stack/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/stack/common.go delete mode 100644 vendor/github.com/docker/docker/cli/command/stack/deploy.go delete mode 100644 vendor/github.com/docker/docker/cli/command/stack/deploy_bundlefile.go delete mode 100644 vendor/github.com/docker/docker/cli/command/stack/list.go delete mode 100644 vendor/github.com/docker/docker/cli/command/stack/opts.go delete mode 100644 vendor/github.com/docker/docker/cli/command/stack/ps.go delete mode 100644 vendor/github.com/docker/docker/cli/command/stack/remove.go delete mode 100644 vendor/github.com/docker/docker/cli/command/stack/services.go delete mode 100644 vendor/github.com/docker/docker/cli/command/swarm/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/swarm/init.go delete mode 100644 vendor/github.com/docker/docker/cli/command/swarm/join.go delete mode 100644 vendor/github.com/docker/docker/cli/command/swarm/join_token.go delete mode 100644 vendor/github.com/docker/docker/cli/command/swarm/leave.go delete mode 100644 vendor/github.com/docker/docker/cli/command/swarm/opts.go delete mode 100644 vendor/github.com/docker/docker/cli/command/swarm/opts_test.go delete mode 100644 vendor/github.com/docker/docker/cli/command/swarm/unlock.go delete mode 100644 vendor/github.com/docker/docker/cli/command/swarm/unlock_key.go delete mode 100644 vendor/github.com/docker/docker/cli/command/swarm/update.go delete mode 100644 vendor/github.com/docker/docker/cli/command/system/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/system/df.go delete mode 100644 vendor/github.com/docker/docker/cli/command/system/events.go delete mode 100644 vendor/github.com/docker/docker/cli/command/system/info.go delete mode 100644 vendor/github.com/docker/docker/cli/command/system/inspect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/system/prune.go delete mode 100644 vendor/github.com/docker/docker/cli/command/system/version.go delete mode 100644 vendor/github.com/docker/docker/cli/command/task/print.go delete mode 100644 vendor/github.com/docker/docker/cli/command/trust.go delete mode 100644 vendor/github.com/docker/docker/cli/command/utils.go delete mode 100644 vendor/github.com/docker/docker/cli/command/volume/cmd.go delete mode 100644 vendor/github.com/docker/docker/cli/command/volume/create.go delete mode 100644 vendor/github.com/docker/docker/cli/command/volume/inspect.go delete mode 100644 vendor/github.com/docker/docker/cli/command/volume/list.go delete mode 100644 vendor/github.com/docker/docker/cli/command/volume/prune.go delete mode 100644 vendor/github.com/docker/docker/cli/command/volume/remove.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/convert/compose.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/convert/compose_test.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/convert/service.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/convert/service_test.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/convert/volume.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/convert/volume_test.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/interpolation/interpolation.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/interpolation/interpolation_test.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/loader/example1.env delete mode 100644 vendor/github.com/docker/docker/cli/compose/loader/example2.env delete mode 100644 vendor/github.com/docker/docker/cli/compose/loader/full-example.yml delete mode 100644 vendor/github.com/docker/docker/cli/compose/loader/loader.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/loader/loader_test.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/schema/bindata.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/schema/data/config_schema_v3.0.json delete mode 100644 vendor/github.com/docker/docker/cli/compose/schema/data/config_schema_v3.1.json delete mode 100644 vendor/github.com/docker/docker/cli/compose/schema/schema.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/schema/schema_test.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/template/template.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/template/template_test.go delete mode 100644 vendor/github.com/docker/docker/cli/compose/types/types.go delete mode 100644 vendor/github.com/docker/docker/cli/flags/client.go delete mode 100644 vendor/github.com/docker/docker/cli/flags/common.go delete mode 100644 vendor/github.com/docker/docker/cli/flags/common_test.go delete mode 100644 vendor/github.com/docker/docker/cli/trust/trust.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/config.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/config_test.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/configfile/file.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/configfile/file_test.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/credentials/credentials.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/credentials/default_store.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/credentials/default_store_darwin.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/credentials/default_store_linux.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/credentials/default_store_unsupported.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/credentials/default_store_windows.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/credentials/file_store.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/credentials/file_store_test.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/credentials/native_store.go delete mode 100644 vendor/github.com/docker/docker/cliconfig/credentials/native_store_test.go delete mode 100644 vendor/github.com/docker/docker/client/testdata/ca.pem delete mode 100644 vendor/github.com/docker/docker/client/testdata/cert.pem delete mode 100644 vendor/github.com/docker/docker/client/testdata/key.pem delete mode 100644 vendor/github.com/docker/docker/cmd/docker/daemon_none.go delete mode 100644 vendor/github.com/docker/docker/cmd/docker/daemon_none_test.go delete mode 100644 vendor/github.com/docker/docker/cmd/docker/daemon_unit_test.go delete mode 100644 vendor/github.com/docker/docker/cmd/docker/daemon_unix.go delete mode 100644 vendor/github.com/docker/docker/cmd/docker/docker.go delete mode 100644 vendor/github.com/docker/docker/cmd/docker/docker_test.go delete mode 100644 vendor/github.com/docker/docker/cmd/docker/docker_windows.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/README.md delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/daemon.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/daemon_freebsd.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/daemon_linux.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/daemon_solaris.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/daemon_test.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/daemon_unix.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/daemon_unix_test.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/daemon_windows.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/docker.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/docker_windows.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/hack/malformed_host_override.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/hack/malformed_host_override_test.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/metrics.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/service_unsupported.go delete mode 100644 vendor/github.com/docker/docker/cmd/dockerd/service_windows.go delete mode 100644 vendor/github.com/docker/docker/container/archive.go delete mode 100644 vendor/github.com/docker/docker/container/container.go delete mode 100644 vendor/github.com/docker/docker/container/container_linux.go delete mode 100644 vendor/github.com/docker/docker/container/container_notlinux.go delete mode 100644 vendor/github.com/docker/docker/container/container_unit_test.go delete mode 100644 vendor/github.com/docker/docker/container/container_unix.go delete mode 100644 vendor/github.com/docker/docker/container/container_windows.go delete mode 100644 vendor/github.com/docker/docker/container/health.go delete mode 100644 vendor/github.com/docker/docker/container/history.go delete mode 100644 vendor/github.com/docker/docker/container/memory_store.go delete mode 100644 vendor/github.com/docker/docker/container/memory_store_test.go delete mode 100644 vendor/github.com/docker/docker/container/monitor.go delete mode 100644 vendor/github.com/docker/docker/container/mounts_unix.go delete mode 100644 vendor/github.com/docker/docker/container/mounts_windows.go delete mode 100644 vendor/github.com/docker/docker/container/state.go delete mode 100644 vendor/github.com/docker/docker/container/state_solaris.go delete mode 100644 vendor/github.com/docker/docker/container/state_test.go delete mode 100644 vendor/github.com/docker/docker/container/state_unix.go delete mode 100644 vendor/github.com/docker/docker/container/state_windows.go delete mode 100644 vendor/github.com/docker/docker/container/store.go delete mode 100644 vendor/github.com/docker/docker/container/stream/streams.go delete mode 100644 vendor/github.com/docker/docker/contrib/README.md delete mode 100644 vendor/github.com/docker/docker/contrib/REVIEWERS delete mode 100644 vendor/github.com/docker/docker/contrib/apparmor/main.go delete mode 100644 vendor/github.com/docker/docker/contrib/apparmor/template.go delete mode 100755 vendor/github.com/docker/docker/contrib/builder/deb/aarch64/build.sh delete mode 100755 vendor/github.com/docker/docker/contrib/builder/deb/aarch64/generate.sh delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/aarch64/ubuntu-trusty/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/aarch64/ubuntu-xenial/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/amd64/README.md delete mode 100755 vendor/github.com/docker/docker/contrib/builder/deb/amd64/build.sh delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-jessie/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-stretch/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-wheezy/Dockerfile delete mode 100755 vendor/github.com/docker/docker/contrib/builder/deb/amd64/generate.sh delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-precise/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-trusty/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-xenial/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-yakkety/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/armhf/debian-jessie/Dockerfile delete mode 100755 vendor/github.com/docker/docker/contrib/builder/deb/armhf/generate.sh delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/armhf/raspbian-jessie/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-trusty/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-xenial/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-yakkety/Dockerfile delete mode 100755 vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/build.sh delete mode 100755 vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/generate.sh delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-trusty/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-xenial/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-yakkety/Dockerfile delete mode 100755 vendor/github.com/docker/docker/contrib/builder/deb/s390x/build.sh delete mode 100755 vendor/github.com/docker/docker/contrib/builder/deb/s390x/generate.sh delete mode 100644 vendor/github.com/docker/docker/contrib/builder/deb/s390x/ubuntu-xenial/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/rpm/amd64/README.md delete mode 100755 vendor/github.com/docker/docker/contrib/builder/rpm/amd64/build.sh delete mode 100644 vendor/github.com/docker/docker/contrib/builder/rpm/amd64/centos-7/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/rpm/amd64/fedora-24/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/rpm/amd64/fedora-25/Dockerfile delete mode 100755 vendor/github.com/docker/docker/contrib/builder/rpm/amd64/generate.sh delete mode 100644 vendor/github.com/docker/docker/contrib/builder/rpm/amd64/opensuse-13.2/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/rpm/amd64/oraclelinux-6/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/rpm/amd64/oraclelinux-7/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/builder/rpm/amd64/photon-1.0/Dockerfile delete mode 100755 vendor/github.com/docker/docker/contrib/check-config.sh delete mode 100644 vendor/github.com/docker/docker/contrib/completion/REVIEWERS delete mode 100644 vendor/github.com/docker/docker/contrib/completion/bash/docker delete mode 100644 vendor/github.com/docker/docker/contrib/completion/fish/docker.fish delete mode 100644 vendor/github.com/docker/docker/contrib/completion/powershell/readme.txt delete mode 100644 vendor/github.com/docker/docker/contrib/completion/zsh/REVIEWERS delete mode 100644 vendor/github.com/docker/docker/contrib/completion/zsh/_docker delete mode 100644 vendor/github.com/docker/docker/contrib/desktop-integration/README.md delete mode 100644 vendor/github.com/docker/docker/contrib/desktop-integration/chromium/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/desktop-integration/gparted/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/docker-device-tool/README.md delete mode 100644 vendor/github.com/docker/docker/contrib/docker-device-tool/device_tool.go delete mode 100644 vendor/github.com/docker/docker/contrib/docker-device-tool/device_tool_windows.go delete mode 100755 vendor/github.com/docker/docker/contrib/dockerize-disk.sh delete mode 100755 vendor/github.com/docker/docker/contrib/download-frozen-image-v1.sh delete mode 100755 vendor/github.com/docker/docker/contrib/download-frozen-image-v2.sh delete mode 100644 vendor/github.com/docker/docker/contrib/editorconfig delete mode 100644 vendor/github.com/docker/docker/contrib/gitdm/aliases delete mode 100644 vendor/github.com/docker/docker/contrib/gitdm/domain-map delete mode 100755 vendor/github.com/docker/docker/contrib/gitdm/generate_aliases.sh delete mode 100644 vendor/github.com/docker/docker/contrib/gitdm/gitdm.config delete mode 100644 vendor/github.com/docker/docker/contrib/httpserver/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/httpserver/Dockerfile.solaris delete mode 100644 vendor/github.com/docker/docker/contrib/httpserver/server.go delete mode 100644 vendor/github.com/docker/docker/contrib/init/openrc/docker.confd delete mode 100644 vendor/github.com/docker/docker/contrib/init/openrc/docker.initd delete mode 100644 vendor/github.com/docker/docker/contrib/init/systemd/REVIEWERS delete mode 100644 vendor/github.com/docker/docker/contrib/init/systemd/docker.service delete mode 100644 vendor/github.com/docker/docker/contrib/init/systemd/docker.service.rpm delete mode 100644 vendor/github.com/docker/docker/contrib/init/systemd/docker.socket delete mode 100755 vendor/github.com/docker/docker/contrib/init/sysvinit-debian/docker delete mode 100644 vendor/github.com/docker/docker/contrib/init/sysvinit-debian/docker.default delete mode 100755 vendor/github.com/docker/docker/contrib/init/sysvinit-redhat/docker delete mode 100644 vendor/github.com/docker/docker/contrib/init/sysvinit-redhat/docker.sysconfig delete mode 100644 vendor/github.com/docker/docker/contrib/init/upstart/REVIEWERS delete mode 100644 vendor/github.com/docker/docker/contrib/init/upstart/docker.conf delete mode 100755 vendor/github.com/docker/docker/contrib/mac-install-bundle.sh delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage-alpine.sh delete mode 100644 vendor/github.com/docker/docker/contrib/mkimage-arch-pacman.conf delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage-arch.sh delete mode 100644 vendor/github.com/docker/docker/contrib/mkimage-archarm-pacman.conf delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage-busybox.sh delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage-crux.sh delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage-debootstrap.sh delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage-pld.sh delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage-rinse.sh delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage-yum.sh delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage.sh delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage/.febootstrap-minimize delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage/busybox-static delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage/debootstrap delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage/mageia-urpmi delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage/rinse delete mode 100755 vendor/github.com/docker/docker/contrib/mkimage/solaris delete mode 100644 vendor/github.com/docker/docker/contrib/nnp-test/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/nnp-test/nnp-test.c delete mode 100755 vendor/github.com/docker/docker/contrib/nuke-graph-directory.sh delete mode 100755 vendor/github.com/docker/docker/contrib/project-stats.sh delete mode 100755 vendor/github.com/docker/docker/contrib/report-issue.sh delete mode 100755 vendor/github.com/docker/docker/contrib/reprepro/suites.sh delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/LICENSE delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/Makefile delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/README.md delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.fc delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.if delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.te delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/LICENSE delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/Makefile delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/README.md delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.fc delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.if delete mode 100644 vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.te delete mode 100644 vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/LICENSE delete mode 100644 vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/Makefile delete mode 100644 vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.fc delete mode 100644 vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.if delete mode 100644 vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.te delete mode 100644 vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker_selinux.8.gz delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/nano/Dockerfile.nanorc delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/nano/README.md delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/Preferences/Dockerfile.tmPreferences delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/info.plist delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/textmate/README.md delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/textmate/REVIEWERS delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/vim/LICENSE delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/vim/README.md delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/vim/doc/dockerfile.txt delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/vim/ftdetect/dockerfile.vim delete mode 100644 vendor/github.com/docker/docker/contrib/syntax/vim/syntax/dockerfile.vim delete mode 100644 vendor/github.com/docker/docker/contrib/syscall-test/Dockerfile delete mode 100644 vendor/github.com/docker/docker/contrib/syscall-test/acct.c delete mode 100644 vendor/github.com/docker/docker/contrib/syscall-test/exit32.s delete mode 100644 vendor/github.com/docker/docker/contrib/syscall-test/ns.c delete mode 100644 vendor/github.com/docker/docker/contrib/syscall-test/raw.c delete mode 100644 vendor/github.com/docker/docker/contrib/syscall-test/setgid.c delete mode 100644 vendor/github.com/docker/docker/contrib/syscall-test/setuid.c delete mode 100644 vendor/github.com/docker/docker/contrib/syscall-test/socket.c delete mode 100644 vendor/github.com/docker/docker/contrib/syscall-test/userns.c delete mode 100644 vendor/github.com/docker/docker/contrib/udev/80-docker.rules delete mode 100644 vendor/github.com/docker/docker/contrib/vagrant-docker/README.md delete mode 100644 vendor/github.com/docker/docker/daemon/apparmor_default.go delete mode 100644 vendor/github.com/docker/docker/daemon/apparmor_default_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/archive.go delete mode 100644 vendor/github.com/docker/docker/daemon/archive_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/archive_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/attach.go delete mode 100644 vendor/github.com/docker/docker/daemon/auth.go delete mode 100644 vendor/github.com/docker/docker/daemon/bindmount_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/bindmount_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/cache.go delete mode 100644 vendor/github.com/docker/docker/daemon/caps/utils_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/changes.go delete mode 100644 vendor/github.com/docker/docker/daemon/checkpoint.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/cluster.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/convert/container.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/convert/network.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/convert/node.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/convert/secret.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/convert/service.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/convert/swarm.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/convert/task.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/backend.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/container/adapter.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/container/attachment.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/container/container.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/container/controller.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/container/errors.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/container/executor.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/container/health_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/container/validate.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_unix_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_windows_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/filters.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/helpers.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/listen_addr.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/listen_addr_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/listen_addr_others.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/listen_addr_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/provider/network.go delete mode 100644 vendor/github.com/docker/docker/daemon/cluster/secrets.go delete mode 100644 vendor/github.com/docker/docker/daemon/commit.go delete mode 100644 vendor/github.com/docker/docker/daemon/config.go delete mode 100644 vendor/github.com/docker/docker/daemon/config_common_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/config_experimental.go delete mode 100644 vendor/github.com/docker/docker/daemon/config_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/config_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/config_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/config_unix_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/config_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/config_windows_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/container.go delete mode 100644 vendor/github.com/docker/docker/daemon/container_operations.go delete mode 100644 vendor/github.com/docker/docker/daemon/container_operations_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/container_operations_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/container_operations_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/create.go delete mode 100644 vendor/github.com/docker/docker/daemon/create_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/create_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/daemon.go delete mode 100644 vendor/github.com/docker/docker/daemon/daemon_experimental.go delete mode 100644 vendor/github.com/docker/docker/daemon/daemon_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/daemon_linux_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/daemon_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/daemon_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/daemon_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/daemon_unix_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/daemon_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/daemon_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/debugtrap.go delete mode 100644 vendor/github.com/docker/docker/daemon/debugtrap_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/debugtrap_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/debugtrap_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/delete.go delete mode 100644 vendor/github.com/docker/docker/daemon/delete_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/discovery.go delete mode 100644 vendor/github.com/docker/docker/daemon/discovery_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/disk_usage.go delete mode 100644 vendor/github.com/docker/docker/daemon/errors.go delete mode 100644 vendor/github.com/docker/docker/daemon/events.go delete mode 100644 vendor/github.com/docker/docker/daemon/events/events.go delete mode 100644 vendor/github.com/docker/docker/daemon/events/events_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/events/filter.go delete mode 100644 vendor/github.com/docker/docker/daemon/events/metrics.go delete mode 100644 vendor/github.com/docker/docker/daemon/events/testutils/testutils.go delete mode 100644 vendor/github.com/docker/docker/daemon/events_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/exec.go delete mode 100644 vendor/github.com/docker/docker/daemon/exec/exec.go delete mode 100644 vendor/github.com/docker/docker/daemon/exec_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/exec_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/exec_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/export.go delete mode 100644 vendor/github.com/docker/docker/daemon/getsize_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/aufs/aufs.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/aufs/aufs_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/aufs/dirs.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/btrfs/btrfs.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/btrfs/btrfs_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/btrfs/dummy_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version_none.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/counter.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/devmapper/README.md delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/devmapper/deviceset.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/devmapper/devmapper_doc.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/devmapper/devmapper_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/devmapper/driver.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/devmapper/mount.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/driver.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/driver_freebsd.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/driver_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/driver_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/driver_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/driver_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/fsdiff.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphbench_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphtest_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphtest_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/graphtest/testutil.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/graphtest/testutil_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/overlay/copy.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/overlay2/check.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/overlay2/mount.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/overlay2/randomid.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/overlayutils/overlayutils.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/plugin.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/proxy.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/quota/projectquota.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/register/register_aufs.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/register/register_btrfs.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/register/register_devicemapper.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/register/register_overlay.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/register/register_vfs.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/register/register_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/register/register_zfs.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/vfs/driver.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/vfs/vfs_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/windows/windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/zfs/MAINTAINERS delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_freebsd.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/health.go delete mode 100644 vendor/github.com/docker/docker/daemon/health_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/image.go delete mode 100644 vendor/github.com/docker/docker/daemon/image_delete.go delete mode 100644 vendor/github.com/docker/docker/daemon/image_exporter.go delete mode 100644 vendor/github.com/docker/docker/daemon/image_history.go delete mode 100644 vendor/github.com/docker/docker/daemon/image_inspect.go delete mode 100644 vendor/github.com/docker/docker/daemon/image_pull.go delete mode 100644 vendor/github.com/docker/docker/daemon/image_push.go delete mode 100644 vendor/github.com/docker/docker/daemon/image_tag.go delete mode 100644 vendor/github.com/docker/docker/daemon/images.go delete mode 100644 vendor/github.com/docker/docker/daemon/import.go delete mode 100644 vendor/github.com/docker/docker/daemon/info.go delete mode 100644 vendor/github.com/docker/docker/daemon/info_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/info_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/initlayer/setup_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/initlayer/setup_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/initlayer/setup_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/inspect.go delete mode 100644 vendor/github.com/docker/docker/daemon/inspect_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/inspect_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/inspect_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/keys.go delete mode 100644 vendor/github.com/docker/docker/daemon/keys_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/kill.go delete mode 100644 vendor/github.com/docker/docker/daemon/links.go delete mode 100644 vendor/github.com/docker/docker/daemon/links/links.go delete mode 100644 vendor/github.com/docker/docker/daemon/links/links_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/links_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/links_linux_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/links_notlinux.go delete mode 100644 vendor/github.com/docker/docker/daemon/list.go delete mode 100644 vendor/github.com/docker/docker/daemon/list_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/list_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/logdrivers_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/logdrivers_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/awslogs/cloudwatchlogs.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/awslogs/cloudwatchlogs_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/awslogs/cwlogsiface_mock_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/context.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/copier.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/copier_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/etwlogs/etwlogs_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/factory.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/fluentd/fluentd.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/gcplogs/gcplogging.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/gelf/gelf.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/gelf/gelf_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/journald/journald.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/journald/journald_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/journald/journald_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/journald/read.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/journald/read_native.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/journald/read_native_compat.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/journald/read_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonfilelog.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonfilelog_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/jsonfilelog/read.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/logentries/logentries.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/logger.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/logger_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/loggerutils/log_tag.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/loggerutils/log_tag_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/loggerutils/rotatefilewriter.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/splunk/splunk.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/splunk/splunk_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/splunk/splunkhecmock_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/syslog/syslog.go delete mode 100644 vendor/github.com/docker/docker/daemon/logger/syslog/syslog_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/logs.go delete mode 100644 vendor/github.com/docker/docker/daemon/logs_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/metrics.go delete mode 100644 vendor/github.com/docker/docker/daemon/monitor.go delete mode 100644 vendor/github.com/docker/docker/daemon/monitor_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/monitor_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/monitor_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/mounts.go delete mode 100644 vendor/github.com/docker/docker/daemon/names.go delete mode 100644 vendor/github.com/docker/docker/daemon/network.go delete mode 100644 vendor/github.com/docker/docker/daemon/network/settings.go delete mode 100644 vendor/github.com/docker/docker/daemon/oci_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/oci_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/oci_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/pause.go delete mode 100644 vendor/github.com/docker/docker/daemon/prune.go delete mode 100644 vendor/github.com/docker/docker/daemon/rename.go delete mode 100644 vendor/github.com/docker/docker/daemon/resize.go delete mode 100644 vendor/github.com/docker/docker/daemon/restart.go delete mode 100644 vendor/github.com/docker/docker/daemon/search.go delete mode 100644 vendor/github.com/docker/docker/daemon/search_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/seccomp_disabled.go delete mode 100644 vendor/github.com/docker/docker/daemon/seccomp_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/seccomp_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/secrets.go delete mode 100644 vendor/github.com/docker/docker/daemon/secrets_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/secrets_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/selinux_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/selinux_unsupported.go delete mode 100644 vendor/github.com/docker/docker/daemon/start.go delete mode 100644 vendor/github.com/docker/docker/daemon/start_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/start_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/stats.go delete mode 100644 vendor/github.com/docker/docker/daemon/stats_collector.go delete mode 100644 vendor/github.com/docker/docker/daemon/stats_collector_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/stats_collector_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/stats_collector_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/stats_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/stats_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/stop.go delete mode 100644 vendor/github.com/docker/docker/daemon/top_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/top_unix_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/top_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/unpause.go delete mode 100644 vendor/github.com/docker/docker/daemon/update.go delete mode 100644 vendor/github.com/docker/docker/daemon/update_linux.go delete mode 100644 vendor/github.com/docker/docker/daemon/update_solaris.go delete mode 100644 vendor/github.com/docker/docker/daemon/update_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/volumes.go delete mode 100644 vendor/github.com/docker/docker/daemon/volumes_unit_test.go delete mode 100644 vendor/github.com/docker/docker/daemon/volumes_unix.go delete mode 100644 vendor/github.com/docker/docker/daemon/volumes_windows.go delete mode 100644 vendor/github.com/docker/docker/daemon/wait.go delete mode 100644 vendor/github.com/docker/docker/daemon/workdir.go delete mode 100644 vendor/github.com/docker/docker/distribution/config.go delete mode 100644 vendor/github.com/docker/docker/distribution/errors.go delete mode 100644 vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/bad_manifest delete mode 100644 vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/extra_data_manifest delete mode 100644 vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/good_manifest delete mode 100644 vendor/github.com/docker/docker/distribution/metadata/metadata.go delete mode 100644 vendor/github.com/docker/docker/distribution/metadata/v1_id_service.go delete mode 100644 vendor/github.com/docker/docker/distribution/metadata/v1_id_service_test.go delete mode 100644 vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service.go delete mode 100644 vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service_test.go delete mode 100644 vendor/github.com/docker/docker/distribution/pull.go delete mode 100644 vendor/github.com/docker/docker/distribution/pull_v1.go delete mode 100644 vendor/github.com/docker/docker/distribution/pull_v2.go delete mode 100644 vendor/github.com/docker/docker/distribution/pull_v2_test.go delete mode 100644 vendor/github.com/docker/docker/distribution/pull_v2_unix.go delete mode 100644 vendor/github.com/docker/docker/distribution/pull_v2_windows.go delete mode 100644 vendor/github.com/docker/docker/distribution/push.go delete mode 100644 vendor/github.com/docker/docker/distribution/push_v1.go delete mode 100644 vendor/github.com/docker/docker/distribution/push_v2.go delete mode 100644 vendor/github.com/docker/docker/distribution/push_v2_test.go delete mode 100644 vendor/github.com/docker/docker/distribution/registry.go delete mode 100644 vendor/github.com/docker/docker/distribution/registry_unit_test.go delete mode 100644 vendor/github.com/docker/docker/distribution/utils/progress.go delete mode 100644 vendor/github.com/docker/docker/distribution/xfer/download.go delete mode 100644 vendor/github.com/docker/docker/distribution/xfer/download_test.go delete mode 100644 vendor/github.com/docker/docker/distribution/xfer/transfer.go delete mode 100644 vendor/github.com/docker/docker/distribution/xfer/transfer_test.go delete mode 100644 vendor/github.com/docker/docker/distribution/xfer/upload.go delete mode 100644 vendor/github.com/docker/docker/distribution/xfer/upload_test.go delete mode 100644 vendor/github.com/docker/docker/dockerversion/useragent.go delete mode 100644 vendor/github.com/docker/docker/dockerversion/version_lib.go delete mode 100644 vendor/github.com/docker/docker/docs/README.md delete mode 100644 vendor/github.com/docker/docker/docs/api/v1.18.md delete mode 100644 vendor/github.com/docker/docker/docs/api/v1.19.md delete mode 100644 vendor/github.com/docker/docker/docs/api/v1.20.md delete mode 100644 vendor/github.com/docker/docker/docs/api/v1.21.md delete mode 100644 vendor/github.com/docker/docker/docs/api/v1.22.md delete mode 100644 vendor/github.com/docker/docker/docs/api/v1.23.md delete mode 100644 vendor/github.com/docker/docker/docs/api/v1.24.md delete mode 100644 vendor/github.com/docker/docker/docs/api/version-history.md delete mode 100644 vendor/github.com/docker/docker/docs/deprecated.md delete mode 100644 vendor/github.com/docker/docker/docs/extend/EBS_volume.md delete mode 100644 vendor/github.com/docker/docker/docs/extend/config.md delete mode 100644 vendor/github.com/docker/docker/docs/extend/images/authz_additional_info.png delete mode 100644 vendor/github.com/docker/docker/docs/extend/images/authz_allow.png delete mode 100644 vendor/github.com/docker/docker/docs/extend/images/authz_chunked.png delete mode 100644 vendor/github.com/docker/docker/docs/extend/images/authz_connection_hijack.png delete mode 100644 vendor/github.com/docker/docker/docs/extend/images/authz_deny.png delete mode 100644 vendor/github.com/docker/docker/docs/extend/index.md delete mode 100644 vendor/github.com/docker/docker/docs/extend/legacy_plugins.md delete mode 100644 vendor/github.com/docker/docker/docs/extend/plugin_api.md delete mode 100644 vendor/github.com/docker/docker/docs/extend/plugins_authorization.md delete mode 100644 vendor/github.com/docker/docker/docs/extend/plugins_graphdriver.md delete mode 100644 vendor/github.com/docker/docker/docs/extend/plugins_network.md delete mode 100644 vendor/github.com/docker/docker/docs/extend/plugins_volume.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/builder.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/attach.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/build.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/cli.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/commit.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/container_prune.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/cp.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/create.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/deploy.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/diff.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/docker_images.gif delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/dockerd.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/events.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/exec.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/export.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/history.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/image_prune.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/images.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/import.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/index.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/info.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/inspect.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/kill.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/load.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/login.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/logout.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/logs.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/menu.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/network_connect.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/network_create.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/network_disconnect.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/network_inspect.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/network_ls.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/network_prune.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/network_rm.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/node_demote.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/node_inspect.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/node_ls.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/node_promote.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/node_ps.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/node_rm.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/node_update.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/pause.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/plugin_create.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/plugin_disable.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/plugin_enable.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/plugin_inspect.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/plugin_install.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/plugin_ls.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/plugin_push.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/plugin_rm.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/plugin_set.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/plugin_upgrade.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/port.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/ps.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/pull.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/push.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/rename.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/restart.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/rm.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/rmi.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/run.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/save.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/search.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/secret_create.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/secret_inspect.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/secret_ls.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/secret_rm.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/service_create.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/service_inspect.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/service_logs.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/service_ls.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/service_ps.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/service_rm.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/service_scale.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/service_update.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/stack_deploy.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/stack_ls.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/stack_ps.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/stack_rm.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/stack_services.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/start.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/stats.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/stop.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/swarm_init.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/swarm_join.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/swarm_join_token.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/swarm_leave.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/swarm_unlock.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/swarm_unlock_key.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/swarm_update.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/system_df.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/system_prune.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/tag.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/top.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/unpause.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/update.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/version.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/volume_create.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/volume_inspect.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/volume_ls.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/volume_prune.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/volume_rm.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/commandline/wait.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/glossary.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/index.md delete mode 100644 vendor/github.com/docker/docker/docs/reference/run.md delete mode 100644 vendor/github.com/docker/docker/docs/static_files/contributors.png delete mode 100644 vendor/github.com/docker/docker/docs/static_files/docker-logo-compressed.png delete mode 100644 vendor/github.com/docker/docker/experimental/README.md delete mode 100644 vendor/github.com/docker/docker/experimental/checkpoint-restore.md delete mode 100644 vendor/github.com/docker/docker/experimental/docker-stacks-and-bundles.md delete mode 100644 vendor/github.com/docker/docker/experimental/images/ipvlan-l3.gliffy delete mode 100644 vendor/github.com/docker/docker/experimental/images/ipvlan-l3.png delete mode 100644 vendor/github.com/docker/docker/experimental/images/ipvlan-l3.svg delete mode 100644 vendor/github.com/docker/docker/experimental/images/ipvlan_l2_simple.gliffy delete mode 100644 vendor/github.com/docker/docker/experimental/images/ipvlan_l2_simple.png delete mode 100644 vendor/github.com/docker/docker/experimental/images/ipvlan_l2_simple.svg delete mode 100644 vendor/github.com/docker/docker/experimental/images/macvlan-bridge-ipvlan-l2.gliffy delete mode 100644 vendor/github.com/docker/docker/experimental/images/macvlan-bridge-ipvlan-l2.png delete mode 100644 vendor/github.com/docker/docker/experimental/images/macvlan-bridge-ipvlan-l2.svg delete mode 100644 vendor/github.com/docker/docker/experimental/images/multi_tenant_8021q_vlans.gliffy delete mode 100644 vendor/github.com/docker/docker/experimental/images/multi_tenant_8021q_vlans.png delete mode 100644 vendor/github.com/docker/docker/experimental/images/multi_tenant_8021q_vlans.svg delete mode 100644 vendor/github.com/docker/docker/experimental/images/vlans-deeper-look.gliffy delete mode 100644 vendor/github.com/docker/docker/experimental/images/vlans-deeper-look.png delete mode 100644 vendor/github.com/docker/docker/experimental/images/vlans-deeper-look.svg delete mode 100644 vendor/github.com/docker/docker/experimental/vlan-networks.md delete mode 100644 vendor/github.com/docker/docker/hack/Jenkins/W2L/postbuild.sh delete mode 100644 vendor/github.com/docker/docker/hack/Jenkins/W2L/setup.sh delete mode 100644 vendor/github.com/docker/docker/hack/Jenkins/readme.md delete mode 100755 vendor/github.com/docker/docker/hack/dind delete mode 100755 vendor/github.com/docker/docker/hack/dockerfile/binaries-commits delete mode 100755 vendor/github.com/docker/docker/hack/dockerfile/install-binaries.sh delete mode 100755 vendor/github.com/docker/docker/hack/generate-authors.sh delete mode 100755 vendor/github.com/docker/docker/hack/generate-swagger-api.sh delete mode 100644 vendor/github.com/docker/docker/hack/install.sh delete mode 100644 vendor/github.com/docker/docker/hack/make.ps1 delete mode 100755 vendor/github.com/docker/docker/hack/make.sh delete mode 100644 vendor/github.com/docker/docker/hack/make/.binary delete mode 100644 vendor/github.com/docker/docker/hack/make/.binary-setup delete mode 100644 vendor/github.com/docker/docker/hack/make/.build-deb/compat delete mode 100644 vendor/github.com/docker/docker/hack/make/.build-deb/control delete mode 100644 vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.bash-completion delete mode 120000 vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.default delete mode 120000 vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.init delete mode 120000 vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.upstart delete mode 100644 vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.install delete mode 100644 vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.manpages delete mode 100644 vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.postinst delete mode 120000 vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.udev delete mode 100644 vendor/github.com/docker/docker/hack/make/.build-deb/docs delete mode 100755 vendor/github.com/docker/docker/hack/make/.build-deb/rules delete mode 100644 vendor/github.com/docker/docker/hack/make/.build-rpm/docker-engine-selinux.spec delete mode 100644 vendor/github.com/docker/docker/hack/make/.build-rpm/docker-engine.spec delete mode 100644 vendor/github.com/docker/docker/hack/make/.detect-daemon-osarch delete mode 100644 vendor/github.com/docker/docker/hack/make/.ensure-emptyfs delete mode 100644 vendor/github.com/docker/docker/hack/make/.go-autogen delete mode 100644 vendor/github.com/docker/docker/hack/make/.go-autogen.ps1 delete mode 100644 vendor/github.com/docker/docker/hack/make/.integration-daemon-setup delete mode 100644 vendor/github.com/docker/docker/hack/make/.integration-daemon-start delete mode 100644 vendor/github.com/docker/docker/hack/make/.integration-daemon-stop delete mode 100644 vendor/github.com/docker/docker/hack/make/.integration-test-helpers delete mode 100644 vendor/github.com/docker/docker/hack/make/.resources-windows/common.rc delete mode 100644 vendor/github.com/docker/docker/hack/make/.resources-windows/docker.exe.manifest delete mode 100644 vendor/github.com/docker/docker/hack/make/.resources-windows/docker.ico delete mode 100644 vendor/github.com/docker/docker/hack/make/.resources-windows/docker.png delete mode 100644 vendor/github.com/docker/docker/hack/make/.resources-windows/docker.rc delete mode 100644 vendor/github.com/docker/docker/hack/make/.resources-windows/dockerd.rc delete mode 100644 vendor/github.com/docker/docker/hack/make/.resources-windows/event_messages.mc delete mode 100644 vendor/github.com/docker/docker/hack/make/.resources-windows/resources.go delete mode 100644 vendor/github.com/docker/docker/hack/make/README.md delete mode 100644 vendor/github.com/docker/docker/hack/make/binary delete mode 100644 vendor/github.com/docker/docker/hack/make/binary-client delete mode 100644 vendor/github.com/docker/docker/hack/make/binary-daemon delete mode 100644 vendor/github.com/docker/docker/hack/make/build-deb delete mode 100644 vendor/github.com/docker/docker/hack/make/build-integration-test-binary delete mode 100644 vendor/github.com/docker/docker/hack/make/build-rpm delete mode 100755 vendor/github.com/docker/docker/hack/make/clean-apt-repo delete mode 100755 vendor/github.com/docker/docker/hack/make/clean-yum-repo delete mode 100644 vendor/github.com/docker/docker/hack/make/cover delete mode 100644 vendor/github.com/docker/docker/hack/make/cross delete mode 100644 vendor/github.com/docker/docker/hack/make/dynbinary delete mode 100644 vendor/github.com/docker/docker/hack/make/dynbinary-client delete mode 100644 vendor/github.com/docker/docker/hack/make/dynbinary-daemon delete mode 100755 vendor/github.com/docker/docker/hack/make/generate-index-listing delete mode 100644 vendor/github.com/docker/docker/hack/make/install-binary delete mode 100644 vendor/github.com/docker/docker/hack/make/install-binary-client delete mode 100644 vendor/github.com/docker/docker/hack/make/install-binary-daemon delete mode 100644 vendor/github.com/docker/docker/hack/make/install-script delete mode 100755 vendor/github.com/docker/docker/hack/make/release-deb delete mode 100755 vendor/github.com/docker/docker/hack/make/release-rpm delete mode 100644 vendor/github.com/docker/docker/hack/make/run delete mode 100755 vendor/github.com/docker/docker/hack/make/sign-repos delete mode 100755 vendor/github.com/docker/docker/hack/make/test-deb-install delete mode 100644 vendor/github.com/docker/docker/hack/make/test-docker-py delete mode 100755 vendor/github.com/docker/docker/hack/make/test-install-script delete mode 100755 vendor/github.com/docker/docker/hack/make/test-integration-cli delete mode 100644 vendor/github.com/docker/docker/hack/make/test-integration-shell delete mode 100755 vendor/github.com/docker/docker/hack/make/test-old-apt-repo delete mode 100644 vendor/github.com/docker/docker/hack/make/test-unit delete mode 100644 vendor/github.com/docker/docker/hack/make/tgz delete mode 100644 vendor/github.com/docker/docker/hack/make/ubuntu delete mode 100755 vendor/github.com/docker/docker/hack/make/update-apt-repo delete mode 100644 vendor/github.com/docker/docker/hack/make/win delete mode 100755 vendor/github.com/docker/docker/hack/release.sh delete mode 100644 vendor/github.com/docker/docker/hack/validate/.swagger-yamllint delete mode 100644 vendor/github.com/docker/docker/hack/validate/.validate delete mode 100755 vendor/github.com/docker/docker/hack/validate/all delete mode 100755 vendor/github.com/docker/docker/hack/validate/compose-bindata delete mode 100755 vendor/github.com/docker/docker/hack/validate/dco delete mode 100755 vendor/github.com/docker/docker/hack/validate/default delete mode 100755 vendor/github.com/docker/docker/hack/validate/default-seccomp delete mode 100755 vendor/github.com/docker/docker/hack/validate/gofmt delete mode 100755 vendor/github.com/docker/docker/hack/validate/lint delete mode 100755 vendor/github.com/docker/docker/hack/validate/pkg-imports delete mode 100755 vendor/github.com/docker/docker/hack/validate/swagger delete mode 100755 vendor/github.com/docker/docker/hack/validate/swagger-gen delete mode 100755 vendor/github.com/docker/docker/hack/validate/test-imports delete mode 100755 vendor/github.com/docker/docker/hack/validate/toml delete mode 100755 vendor/github.com/docker/docker/hack/validate/vendor delete mode 100755 vendor/github.com/docker/docker/hack/validate/vet delete mode 100755 vendor/github.com/docker/docker/hack/vendor.sh delete mode 100644 vendor/github.com/docker/docker/image/fs.go delete mode 100644 vendor/github.com/docker/docker/image/fs_test.go delete mode 100644 vendor/github.com/docker/docker/image/image.go delete mode 100644 vendor/github.com/docker/docker/image/image_test.go delete mode 100644 vendor/github.com/docker/docker/image/rootfs.go delete mode 100644 vendor/github.com/docker/docker/image/spec/v1.1.md delete mode 100644 vendor/github.com/docker/docker/image/spec/v1.2.md delete mode 100644 vendor/github.com/docker/docker/image/spec/v1.md delete mode 100644 vendor/github.com/docker/docker/image/store.go delete mode 100644 vendor/github.com/docker/docker/image/store_test.go delete mode 100644 vendor/github.com/docker/docker/image/tarexport/load.go delete mode 100644 vendor/github.com/docker/docker/image/tarexport/save.go delete mode 100644 vendor/github.com/docker/docker/image/tarexport/tarexport.go delete mode 100644 vendor/github.com/docker/docker/image/v1/imagev1.go delete mode 100644 vendor/github.com/docker/docker/image/v1/imagev1_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/benchmark_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/check_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/daemon.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/daemon_swarm.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/daemon_swarm_hack.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/daemon_unix.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/daemon_windows.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_attach_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_auth_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_build_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_containers_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_create_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_events_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_exec_resize_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_exec_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_images_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_info_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_inspect_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_inspect_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_logs_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_network_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_resize_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_service_update_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_stats_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_stats_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_swarm_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_update_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_version_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_api_volumes_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_attach_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_attach_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_authz_plugin_v2_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_authz_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_build_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_build_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_by_digest_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_commit_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_config_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_cp_from_container_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_cp_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_cp_utils.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_create_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_plugins_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_diff_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_events_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_events_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_exec_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_exec_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_experimental_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_export_import_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_external_graphdriver_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_external_volume_driver_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_health_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_help_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_history_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_images_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_import_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_info_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_info_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_inspect_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_kill_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_links_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_links_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_login_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_logout_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_logs_bench_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_logs_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_nat_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_netmode_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_network_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_oom_killed_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_pause_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_plugins_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_port_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_proxy_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_prune_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_ps_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_pull_local_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_pull_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_pull_trusted_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_push_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_registry_user_agent_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_rename_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_restart_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_rm_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_rmi_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_run_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_run_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_search_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_secret_create_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_secret_inspect_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_service_create_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_service_health_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_service_logs_experimental_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_service_scale_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_service_update_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_sni_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_stack_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_start_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_stats_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_stop_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_tag_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_top_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_update_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_update_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_userns_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_v2_only_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_version_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_volume_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_cli_wait_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_unix_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_experimental_network_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_hub_pull_suite_test.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_test_vars.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/docker_utils.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/events_utils.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures.go delete mode 100755 vendor/github.com/docker/docker/integration-cli/fixtures/auth/docker-credential-shell-test delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/credentialspecs/valid.json delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/deploy/default.yaml delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/deploy/remove.yaml delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/deploy/secrets.yaml delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/https/ca.pem delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/https/client-cert.pem delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/https/client-key.pem delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/https/client-rogue-cert.pem delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/https/client-rogue-key.pem delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/https/server-cert.pem delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/https/server-key.pem delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/https/server-rogue-cert.pem delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/https/server-rogue-key.pem delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/load/emptyLayer.tar delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/load/frozen.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey1.crt delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey1.key delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey2.crt delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey2.key delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey3.crt delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey3.key delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey4.crt delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey4.key delete mode 100755 vendor/github.com/docker/docker/integration-cli/fixtures/notary/gen.sh delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/notary/localhost.cert delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/notary/localhost.key delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/registry/cert.pem delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures/secrets/default delete mode 100644 vendor/github.com/docker/docker/integration-cli/fixtures_linux_daemon.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/npipe.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/npipe_windows.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/registry.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/registry_mock.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/requirements.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/requirements_unix.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/test_vars.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/test_vars_exec.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/test_vars_noexec.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/test_vars_noseccomp.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/test_vars_seccomp.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/test_vars_unix.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/test_vars_windows.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/trust_server.go delete mode 100644 vendor/github.com/docker/docker/integration-cli/utils.go delete mode 100644 vendor/github.com/docker/docker/layer/empty.go delete mode 100644 vendor/github.com/docker/docker/layer/empty_test.go delete mode 100644 vendor/github.com/docker/docker/layer/filestore.go delete mode 100644 vendor/github.com/docker/docker/layer/filestore_test.go delete mode 100644 vendor/github.com/docker/docker/layer/layer.go delete mode 100644 vendor/github.com/docker/docker/layer/layer_store.go delete mode 100644 vendor/github.com/docker/docker/layer/layer_store_windows.go delete mode 100644 vendor/github.com/docker/docker/layer/layer_test.go delete mode 100644 vendor/github.com/docker/docker/layer/layer_unix.go delete mode 100644 vendor/github.com/docker/docker/layer/layer_unix_test.go delete mode 100644 vendor/github.com/docker/docker/layer/layer_windows.go delete mode 100644 vendor/github.com/docker/docker/layer/migration.go delete mode 100644 vendor/github.com/docker/docker/layer/migration_test.go delete mode 100644 vendor/github.com/docker/docker/layer/mount_test.go delete mode 100644 vendor/github.com/docker/docker/layer/mounted_layer.go delete mode 100644 vendor/github.com/docker/docker/layer/ro_layer.go delete mode 100644 vendor/github.com/docker/docker/layer/ro_layer_windows.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/client.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/client_linux.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/client_solaris.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/client_unix.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/client_windows.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/container.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/container_unix.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/container_windows.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/oom_linux.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/oom_solaris.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/pausemonitor_unix.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/process.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/process_unix.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/process_windows.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/queue_unix.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/remote.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/remote_unix.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/remote_windows.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/types.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/types_linux.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/types_solaris.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/types_windows.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/utils_linux.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/utils_solaris.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/utils_windows.go delete mode 100644 vendor/github.com/docker/docker/libcontainerd/utils_windows_test.go delete mode 100644 vendor/github.com/docker/docker/man/Dockerfile delete mode 100644 vendor/github.com/docker/docker/man/Dockerfile.5.md delete mode 100644 vendor/github.com/docker/docker/man/Dockerfile.aarch64 delete mode 100644 vendor/github.com/docker/docker/man/Dockerfile.armhf delete mode 100644 vendor/github.com/docker/docker/man/Dockerfile.ppc64le delete mode 100644 vendor/github.com/docker/docker/man/Dockerfile.s390x delete mode 100644 vendor/github.com/docker/docker/man/README.md delete mode 100644 vendor/github.com/docker/docker/man/docker-attach.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-build.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-commit.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-config-json.5.md delete mode 100644 vendor/github.com/docker/docker/man/docker-cp.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-create.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-diff.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-events.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-exec.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-export.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-history.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-images.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-import.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-info.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-inspect.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-kill.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-load.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-login.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-logout.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-logs.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-network-connect.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-network-create.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-network-disconnect.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-network-inspect.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-network-ls.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-network-rm.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-pause.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-port.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-ps.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-pull.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-push.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-rename.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-restart.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-rm.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-rmi.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-run.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-save.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-search.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-start.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-stats.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-stop.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-tag.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-top.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-unpause.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-update.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-version.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker-wait.1.md delete mode 100644 vendor/github.com/docker/docker/man/docker.1.md delete mode 100644 vendor/github.com/docker/docker/man/dockerd.8.md delete mode 100644 vendor/github.com/docker/docker/man/generate.go delete mode 100755 vendor/github.com/docker/docker/man/generate.sh delete mode 100644 vendor/github.com/docker/docker/man/glide.lock delete mode 100644 vendor/github.com/docker/docker/man/glide.yaml delete mode 100755 vendor/github.com/docker/docker/man/md2man-all.sh delete mode 100644 vendor/github.com/docker/docker/migrate/v1/migratev1.go delete mode 100644 vendor/github.com/docker/docker/migrate/v1/migratev1_test.go delete mode 100644 vendor/github.com/docker/docker/oci/defaults_linux.go delete mode 100644 vendor/github.com/docker/docker/oci/defaults_solaris.go delete mode 100644 vendor/github.com/docker/docker/oci/defaults_windows.go delete mode 100644 vendor/github.com/docker/docker/oci/devices_linux.go delete mode 100644 vendor/github.com/docker/docker/oci/devices_unsupported.go delete mode 100644 vendor/github.com/docker/docker/oci/namespaces.go delete mode 100644 vendor/github.com/docker/docker/opts/hosts.go delete mode 100644 vendor/github.com/docker/docker/opts/hosts_test.go delete mode 100644 vendor/github.com/docker/docker/opts/hosts_unix.go delete mode 100644 vendor/github.com/docker/docker/opts/hosts_windows.go delete mode 100644 vendor/github.com/docker/docker/opts/ip.go delete mode 100644 vendor/github.com/docker/docker/opts/ip_test.go delete mode 100644 vendor/github.com/docker/docker/opts/mount.go delete mode 100644 vendor/github.com/docker/docker/opts/mount_test.go delete mode 100644 vendor/github.com/docker/docker/opts/opts.go delete mode 100644 vendor/github.com/docker/docker/opts/opts_test.go delete mode 100644 vendor/github.com/docker/docker/opts/opts_unix.go delete mode 100644 vendor/github.com/docker/docker/opts/opts_windows.go delete mode 100644 vendor/github.com/docker/docker/opts/port.go delete mode 100644 vendor/github.com/docker/docker/opts/port_test.go delete mode 100644 vendor/github.com/docker/docker/opts/quotedstring.go delete mode 100644 vendor/github.com/docker/docker/opts/quotedstring_test.go delete mode 100644 vendor/github.com/docker/docker/opts/secret.go delete mode 100644 vendor/github.com/docker/docker/opts/secret_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/aaparser/aaparser.go delete mode 100644 vendor/github.com/docker/docker/pkg/aaparser/aaparser_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/README.md delete mode 100644 vendor/github.com/docker/docker/pkg/archive/archive.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/archive_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/archive_linux_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/archive_other.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/archive_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/archive_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/archive_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/archive_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/archive_windows_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/changes.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/changes_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/changes_other.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/changes_posix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/changes_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/changes_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/changes_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/copy.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/copy_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/copy_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/copy_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/diff.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/diff_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/example_changes.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/testdata/broken.tar delete mode 100644 vendor/github.com/docker/docker/pkg/archive/time_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/time_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/utils_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/whiteouts.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/wrap.go delete mode 100644 vendor/github.com/docker/docker/pkg/archive/wrap_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/authorization/api.go delete mode 100644 vendor/github.com/docker/docker/pkg/authorization/authz.go delete mode 100644 vendor/github.com/docker/docker/pkg/authorization/authz_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/authorization/middleware.go delete mode 100644 vendor/github.com/docker/docker/pkg/authorization/plugin.go delete mode 100644 vendor/github.com/docker/docker/pkg/authorization/response.go delete mode 100644 vendor/github.com/docker/docker/pkg/broadcaster/unbuffered.go delete mode 100644 vendor/github.com/docker/docker/pkg/broadcaster/unbuffered_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/chrootarchive/archive.go delete mode 100644 vendor/github.com/docker/docker/pkg/chrootarchive/archive_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/chrootarchive/archive_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/chrootarchive/archive_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/chrootarchive/chroot_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/chrootarchive/chroot_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/chrootarchive/diff.go delete mode 100644 vendor/github.com/docker/docker/pkg/chrootarchive/diff_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/chrootarchive/diff_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/chrootarchive/init_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/chrootarchive/init_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/devicemapper/devmapper.go delete mode 100644 vendor/github.com/docker/docker/pkg/devicemapper/devmapper_log.go delete mode 100644 vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper.go delete mode 100644 vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper_deferred_remove.go delete mode 100644 vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper_no_deferred_remove.go delete mode 100644 vendor/github.com/docker/docker/pkg/devicemapper/ioctl.go delete mode 100644 vendor/github.com/docker/docker/pkg/devicemapper/log.go delete mode 100644 vendor/github.com/docker/docker/pkg/directory/directory.go delete mode 100644 vendor/github.com/docker/docker/pkg/directory/directory_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/directory/directory_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/directory/directory_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/README.md delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/backends.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/discovery.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/discovery_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/entry.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/file/file.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/file/file_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/generator.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/generator_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/kv/kv.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/kv/kv_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/memory/memory.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/memory/memory_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/nodes/nodes.go delete mode 100644 vendor/github.com/docker/docker/pkg/discovery/nodes/nodes_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/filenotify/filenotify.go delete mode 100644 vendor/github.com/docker/docker/pkg/filenotify/fsnotify.go delete mode 100644 vendor/github.com/docker/docker/pkg/filenotify/poller.go delete mode 100644 vendor/github.com/docker/docker/pkg/filenotify/poller_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/fileutils/fileutils.go delete mode 100644 vendor/github.com/docker/docker/pkg/fileutils/fileutils_darwin.go delete mode 100644 vendor/github.com/docker/docker/pkg/fileutils/fileutils_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/fileutils/fileutils_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/fileutils/fileutils_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/fileutils/fileutils_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/fsutils/fsutils_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/fsutils/fsutils_linux_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/gitutils/gitutils.go delete mode 100644 vendor/github.com/docker/docker/pkg/gitutils/gitutils_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/graphdb/conn_sqlite3_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/graphdb/graphdb_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/graphdb/graphdb_linux_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/graphdb/sort_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/graphdb/sort_linux_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/graphdb/unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/graphdb/utils_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/homedir/homedir.go delete mode 100644 vendor/github.com/docker/docker/pkg/homedir/homedir_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/httputils/httputils.go delete mode 100644 vendor/github.com/docker/docker/pkg/httputils/httputils_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/httputils/mimetype.go delete mode 100644 vendor/github.com/docker/docker/pkg/httputils/mimetype_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader.go delete mode 100644 vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/idtools/idtools.go delete mode 100644 vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/idtools/idtools_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/idtools/usergroupadd_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/idtools/utils_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/integration/checker/checker.go delete mode 100644 vendor/github.com/docker/docker/pkg/integration/cmd/command.go delete mode 100644 vendor/github.com/docker/docker/pkg/integration/cmd/command_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/integration/utils.go delete mode 100644 vendor/github.com/docker/docker/pkg/integration/utils_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/buffer.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/buffer_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/bytespipe_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/fmt.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/fmt_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/fswriters.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/fswriters_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/multireader.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/multireader_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/readers.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/readers_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/writers.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/writers_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonlog/jsonlog.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/listeners/listeners_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/listeners/listeners_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/listeners/listeners_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/locker/README.md delete mode 100644 vendor/github.com/docker/docker/pkg/locker/locker.go delete mode 100644 vendor/github.com/docker/docker/pkg/locker/locker_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/longpath/longpath.go delete mode 100644 vendor/github.com/docker/docker/pkg/longpath/longpath_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/loopback/attach_loopback.go delete mode 100644 vendor/github.com/docker/docker/pkg/loopback/ioctl.go delete mode 100644 vendor/github.com/docker/docker/pkg/loopback/loop_wrapper.go delete mode 100644 vendor/github.com/docker/docker/pkg/loopback/loopback.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/flags.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/flags_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/flags_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mount.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mount_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mounter_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mounter_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_linux_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/namesgenerator/cmd/names-generator/main.go delete mode 100644 vendor/github.com/docker/docker/pkg/namesgenerator/names-generator.go delete mode 100644 vendor/github.com/docker/docker/pkg/namesgenerator/names-generator_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/kernel/kernel.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_darwin.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/kernel/uname_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/kernel/uname_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/kernel/uname_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/parsers.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/parsers_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/pidfile/pidfile.go delete mode 100644 vendor/github.com/docker/docker/pkg/pidfile/pidfile_darwin.go delete mode 100644 vendor/github.com/docker/docker/pkg/pidfile/pidfile_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/pidfile/pidfile_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/pidfile/pidfile_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/platform/architecture_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/platform/architecture_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/platform/architecture_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/platform/platform.go delete mode 100644 vendor/github.com/docker/docker/pkg/platform/utsname_int8.go delete mode 100644 vendor/github.com/docker/docker/pkg/platform/utsname_uint8.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugingetter/getter.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/client.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/client_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/discovery.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/discovery_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/discovery_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/discovery_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/discovery_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/errors.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/plugin_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/README.md delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/fixtures/foo.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/fixtures/otherfixture/spaceship.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/main.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/parser.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/parser_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/template.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/plugins.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/plugins_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/plugins_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/transport/http.go delete mode 100644 vendor/github.com/docker/docker/pkg/plugins/transport/transport.go delete mode 100644 vendor/github.com/docker/docker/pkg/pools/pools.go delete mode 100644 vendor/github.com/docker/docker/pkg/pools/pools_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/progress/progress.go delete mode 100644 vendor/github.com/docker/docker/pkg/progress/progressreader.go delete mode 100644 vendor/github.com/docker/docker/pkg/progress/progressreader_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/promise/promise.go delete mode 100644 vendor/github.com/docker/docker/pkg/pubsub/publisher.go delete mode 100644 vendor/github.com/docker/docker/pkg/pubsub/publisher_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/random/random.go delete mode 100644 vendor/github.com/docker/docker/pkg/random/random_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/reexec/README.md delete mode 100644 vendor/github.com/docker/docker/pkg/reexec/command_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/reexec/command_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/reexec/command_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/reexec/command_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/reexec/reexec.go delete mode 100644 vendor/github.com/docker/docker/pkg/registrar/registrar.go delete mode 100644 vendor/github.com/docker/docker/pkg/registrar/registrar_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/signal/README.md delete mode 100644 vendor/github.com/docker/docker/pkg/signal/signal.go delete mode 100644 vendor/github.com/docker/docker/pkg/signal/signal_darwin.go delete mode 100644 vendor/github.com/docker/docker/pkg/signal/signal_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/signal/signal_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/signal/signal_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/signal/signal_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/signal/signal_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/signal/signal_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/signal/trap.go delete mode 100644 vendor/github.com/docker/docker/pkg/streamformatter/streamformatter.go delete mode 100644 vendor/github.com/docker/docker/pkg/streamformatter/streamformatter_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/stringid/README.md delete mode 100644 vendor/github.com/docker/docker/pkg/stringid/stringid.go delete mode 100644 vendor/github.com/docker/docker/pkg/stringid/stringid_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/stringutils/README.md delete mode 100644 vendor/github.com/docker/docker/pkg/stringutils/stringutils.go delete mode 100644 vendor/github.com/docker/docker/pkg/stringutils/stringutils_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE delete mode 100644 vendor/github.com/docker/docker/pkg/symlink/LICENSE.BSD delete mode 100644 vendor/github.com/docker/docker/pkg/symlink/README.md delete mode 100644 vendor/github.com/docker/docker/pkg/symlink/fs.go delete mode 100644 vendor/github.com/docker/docker/pkg/symlink/fs_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/symlink/fs_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/symlink/fs_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/README.md delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/numcpu.go delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/numcpu_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/numcpu_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/sysinfo.go delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_linux_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_windows_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/errors.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/events_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/exitcode.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/filesys.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/filesys_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/lstat.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/lstat_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/lstat_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/meminfo.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/meminfo_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/meminfo_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/meminfo_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/meminfo_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/mknod.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/mknod_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/path_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/path_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/path_windows_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_darwin.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_openbsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/syscall_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/syscall_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/syscall_windows_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/umask.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/umask_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/utimes_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/utimes_unix_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/xattrs_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/tailfile/tailfile.go delete mode 100644 vendor/github.com/docker/docker/pkg/tailfile/tailfile_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/builder_context.go delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/builder_context_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/fileinfosums.go delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/fileinfosums_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/tarsum.go delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/tarsum_spec.md delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/tarsum_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/json delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/testdata/511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/json delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/testdata/511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/layer.tar delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/testdata/collision/collision-0.tar delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/testdata/collision/collision-1.tar delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/testdata/collision/collision-2.tar delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/testdata/collision/collision-3.tar delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/testdata/xattr/json delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/testdata/xattr/layer.tar delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/versioning.go delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/versioning_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/tarsum/writercloser.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/ascii.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/ascii_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/tc_linux_cgo.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/tc_other.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/tc_solaris_cgo.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/term.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/term_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/term_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/term_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/termios_darwin.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/termios_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/termios_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/termios_openbsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/windows/console.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/windows/windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/windows/windows_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/testutil/assert/assert.go delete mode 100644 vendor/github.com/docker/docker/pkg/testutil/pkg.go delete mode 100644 vendor/github.com/docker/docker/pkg/testutil/tempfile/tempfile.go delete mode 100644 vendor/github.com/docker/docker/pkg/truncindex/truncindex.go delete mode 100644 vendor/github.com/docker/docker/pkg/truncindex/truncindex_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/urlutil/urlutil.go delete mode 100644 vendor/github.com/docker/docker/pkg/urlutil/urlutil_test.go delete mode 100644 vendor/github.com/docker/docker/pkg/useragent/README.md delete mode 100644 vendor/github.com/docker/docker/pkg/useragent/useragent.go delete mode 100644 vendor/github.com/docker/docker/pkg/useragent/useragent_test.go delete mode 100644 vendor/github.com/docker/docker/plugin/backend_linux.go delete mode 100644 vendor/github.com/docker/docker/plugin/backend_unsupported.go delete mode 100644 vendor/github.com/docker/docker/plugin/blobstore.go delete mode 100644 vendor/github.com/docker/docker/plugin/defs.go delete mode 100644 vendor/github.com/docker/docker/plugin/manager.go delete mode 100644 vendor/github.com/docker/docker/plugin/manager_linux.go delete mode 100644 vendor/github.com/docker/docker/plugin/manager_solaris.go delete mode 100644 vendor/github.com/docker/docker/plugin/manager_windows.go delete mode 100644 vendor/github.com/docker/docker/plugin/store.go delete mode 100644 vendor/github.com/docker/docker/plugin/store_test.go delete mode 100644 vendor/github.com/docker/docker/plugin/v2/plugin.go delete mode 100644 vendor/github.com/docker/docker/plugin/v2/plugin_linux.go delete mode 100644 vendor/github.com/docker/docker/plugin/v2/plugin_unsupported.go delete mode 100644 vendor/github.com/docker/docker/plugin/v2/settable.go delete mode 100644 vendor/github.com/docker/docker/plugin/v2/settable_test.go delete mode 100644 vendor/github.com/docker/docker/profiles/apparmor/apparmor.go delete mode 100644 vendor/github.com/docker/docker/profiles/apparmor/template.go delete mode 100755 vendor/github.com/docker/docker/profiles/seccomp/default.json delete mode 100755 vendor/github.com/docker/docker/profiles/seccomp/fixtures/example.json delete mode 100644 vendor/github.com/docker/docker/profiles/seccomp/generate.go delete mode 100644 vendor/github.com/docker/docker/profiles/seccomp/seccomp.go delete mode 100644 vendor/github.com/docker/docker/profiles/seccomp/seccomp_default.go delete mode 100644 vendor/github.com/docker/docker/profiles/seccomp/seccomp_test.go delete mode 100644 vendor/github.com/docker/docker/profiles/seccomp/seccomp_unsupported.go delete mode 100644 vendor/github.com/docker/docker/project/ARM.md delete mode 100644 vendor/github.com/docker/docker/project/BRANCHES-AND-TAGS.md delete mode 120000 vendor/github.com/docker/docker/project/CONTRIBUTORS.md delete mode 100644 vendor/github.com/docker/docker/project/GOVERNANCE.md delete mode 100644 vendor/github.com/docker/docker/project/IRC-ADMINISTRATION.md delete mode 100644 vendor/github.com/docker/docker/project/ISSUE-TRIAGE.md delete mode 100644 vendor/github.com/docker/docker/project/PACKAGE-REPO-MAINTENANCE.md delete mode 100644 vendor/github.com/docker/docker/project/PACKAGERS.md delete mode 100644 vendor/github.com/docker/docker/project/PATCH-RELEASES.md delete mode 100644 vendor/github.com/docker/docker/project/PRINCIPLES.md delete mode 100644 vendor/github.com/docker/docker/project/README.md delete mode 100644 vendor/github.com/docker/docker/project/RELEASE-CHECKLIST.md delete mode 100644 vendor/github.com/docker/docker/project/RELEASE-PROCESS.md delete mode 100644 vendor/github.com/docker/docker/project/REVIEWING.md delete mode 100644 vendor/github.com/docker/docker/project/TOOLS.md delete mode 100644 vendor/github.com/docker/docker/reference/reference.go delete mode 100644 vendor/github.com/docker/docker/reference/reference_test.go delete mode 100644 vendor/github.com/docker/docker/reference/store.go delete mode 100644 vendor/github.com/docker/docker/reference/store_test.go delete mode 100644 vendor/github.com/docker/docker/registry/auth.go delete mode 100644 vendor/github.com/docker/docker/registry/auth_test.go delete mode 100644 vendor/github.com/docker/docker/registry/config.go delete mode 100644 vendor/github.com/docker/docker/registry/config_test.go delete mode 100644 vendor/github.com/docker/docker/registry/config_unix.go delete mode 100644 vendor/github.com/docker/docker/registry/config_windows.go delete mode 100644 vendor/github.com/docker/docker/registry/endpoint_test.go delete mode 100644 vendor/github.com/docker/docker/registry/endpoint_v1.go delete mode 100644 vendor/github.com/docker/docker/registry/registry.go delete mode 100644 vendor/github.com/docker/docker/registry/registry_mock_test.go delete mode 100644 vendor/github.com/docker/docker/registry/registry_test.go delete mode 100644 vendor/github.com/docker/docker/registry/service.go delete mode 100644 vendor/github.com/docker/docker/registry/service_v1.go delete mode 100644 vendor/github.com/docker/docker/registry/service_v1_test.go delete mode 100644 vendor/github.com/docker/docker/registry/service_v2.go delete mode 100644 vendor/github.com/docker/docker/registry/session.go delete mode 100644 vendor/github.com/docker/docker/registry/types.go delete mode 100644 vendor/github.com/docker/docker/restartmanager/restartmanager.go delete mode 100644 vendor/github.com/docker/docker/restartmanager/restartmanager_test.go delete mode 100644 vendor/github.com/docker/docker/runconfig/compare.go delete mode 100644 vendor/github.com/docker/docker/runconfig/compare_test.go delete mode 100644 vendor/github.com/docker/docker/runconfig/config.go delete mode 100644 vendor/github.com/docker/docker/runconfig/config_test.go delete mode 100644 vendor/github.com/docker/docker/runconfig/config_unix.go delete mode 100644 vendor/github.com/docker/docker/runconfig/config_windows.go delete mode 100644 vendor/github.com/docker/docker/runconfig/errors.go delete mode 100644 vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_14.json delete mode 100644 vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_17.json delete mode 100644 vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_19.json delete mode 100644 vendor/github.com/docker/docker/runconfig/fixtures/unix/container_hostconfig_1_14.json delete mode 100644 vendor/github.com/docker/docker/runconfig/fixtures/unix/container_hostconfig_1_19.json delete mode 100644 vendor/github.com/docker/docker/runconfig/fixtures/windows/container_config_1_19.json delete mode 100644 vendor/github.com/docker/docker/runconfig/hostconfig.go delete mode 100644 vendor/github.com/docker/docker/runconfig/hostconfig_solaris.go delete mode 100644 vendor/github.com/docker/docker/runconfig/hostconfig_test.go delete mode 100644 vendor/github.com/docker/docker/runconfig/hostconfig_unix.go delete mode 100644 vendor/github.com/docker/docker/runconfig/hostconfig_windows.go delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/envfile.go delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/envfile_test.go delete mode 100755 vendor/github.com/docker/docker/runconfig/opts/fixtures/utf16.env delete mode 100755 vendor/github.com/docker/docker/runconfig/opts/fixtures/utf16be.env delete mode 100755 vendor/github.com/docker/docker/runconfig/opts/fixtures/utf8.env delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/fixtures/valid.env delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/fixtures/valid.label delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/opts.go delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/opts_test.go delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/parse.go delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/parse_test.go delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/runtime.go delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/throttledevice.go delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/ulimit.go delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/ulimit_test.go delete mode 100644 vendor/github.com/docker/docker/runconfig/opts/weightdevice.go delete mode 100644 vendor/github.com/docker/docker/utils/debug.go delete mode 100644 vendor/github.com/docker/docker/utils/debug_test.go delete mode 100644 vendor/github.com/docker/docker/utils/names.go delete mode 100644 vendor/github.com/docker/docker/utils/process_unix.go delete mode 100644 vendor/github.com/docker/docker/utils/process_windows.go delete mode 100644 vendor/github.com/docker/docker/utils/templates/templates.go delete mode 100644 vendor/github.com/docker/docker/utils/templates/templates_test.go delete mode 100644 vendor/github.com/docker/docker/utils/utils.go delete mode 100644 vendor/github.com/docker/docker/utils/utils_test.go delete mode 100644 vendor/github.com/docker/docker/volume/drivers/adapter.go delete mode 100644 vendor/github.com/docker/docker/volume/drivers/extpoint.go delete mode 100644 vendor/github.com/docker/docker/volume/drivers/extpoint_test.go delete mode 100644 vendor/github.com/docker/docker/volume/drivers/proxy.go delete mode 100644 vendor/github.com/docker/docker/volume/drivers/proxy_test.go delete mode 100644 vendor/github.com/docker/docker/volume/local/local.go delete mode 100644 vendor/github.com/docker/docker/volume/local/local_test.go delete mode 100644 vendor/github.com/docker/docker/volume/local/local_unix.go delete mode 100644 vendor/github.com/docker/docker/volume/local/local_windows.go delete mode 100644 vendor/github.com/docker/docker/volume/store/db.go delete mode 100644 vendor/github.com/docker/docker/volume/store/errors.go delete mode 100644 vendor/github.com/docker/docker/volume/store/restore.go delete mode 100644 vendor/github.com/docker/docker/volume/store/store.go delete mode 100644 vendor/github.com/docker/docker/volume/store/store_test.go delete mode 100644 vendor/github.com/docker/docker/volume/store/store_unix.go delete mode 100644 vendor/github.com/docker/docker/volume/store/store_windows.go delete mode 100644 vendor/github.com/docker/docker/volume/testutils/testutils.go delete mode 100644 vendor/github.com/docker/docker/volume/validate.go delete mode 100644 vendor/github.com/docker/docker/volume/validate_test.go delete mode 100644 vendor/github.com/docker/docker/volume/validate_test_unix.go delete mode 100644 vendor/github.com/docker/docker/volume/validate_test_windows.go delete mode 100644 vendor/github.com/docker/docker/volume/volume.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_copy.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_copy_unix.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_copy_windows.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_linux.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_linux_test.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_propagation_linux.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_propagation_linux_test.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_propagation_unsupported.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_test.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_unix.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_unsupported.go delete mode 100644 vendor/github.com/docker/docker/volume/volume_windows.go delete mode 100644 vendor/github.com/docker/go-connections/proxy/logger.go delete mode 100644 vendor/github.com/docker/go-connections/proxy/network_proxy_test.go delete mode 100644 vendor/github.com/docker/go-connections/proxy/proxy.go delete mode 100644 vendor/github.com/docker/go-connections/proxy/stub_proxy.go delete mode 100644 vendor/github.com/docker/go-connections/proxy/tcp_proxy.go delete mode 100644 vendor/github.com/docker/go-connections/proxy/udp_proxy.go delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/fixtures/cert.pem delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/fixtures/cert_of_encrypted_key.pem delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/fixtures/encrypted_key.pem delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/fixtures/key.pem delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/fixtures/multi.pem delete mode 100644 vendor/github.com/fsnotify/fsnotify/.github/ISSUE_TEMPLATE.md delete mode 100644 vendor/github.com/fsnotify/fsnotify/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 vendor/github.com/hashicorp/hcl/.github/ISSUE_TEMPLATE.md delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd_test.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/.hidden.ignore delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/dir.ignore delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/file.ignore delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/good.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/array_comment.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/array_comment_2.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/assign_colon.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/assign_deep.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_crlf.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_lastline.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_single.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex_crlf.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex_key.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/empty.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/git_crypt.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/key_without_value.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/list.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/list_comma.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/missing_braces.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/multiple.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value2.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value3.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_without_value.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_list_comma.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/old.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure_basic.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure_empty.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/types.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/unterminated_object.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/unterminated_object_2.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/printer.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/printer_test.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_array.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_array.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_crlf.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_end_file.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_end_file.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_multiline_indent.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_multiline_indent.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_multiline_no_stanza.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_multiline_no_stanza.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_multiline_stanza.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_multiline_stanza.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_newline.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_newline.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_object_multi.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_object_multi.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_standalone.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_standalone.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/complexhcl.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/complexhcl.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/empty_block.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/empty_block.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_comment.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_comment.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_of_objects.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/list_of_objects.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/multiline_string.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/multiline_string.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/object_singleline.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/object_singleline.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/object_with_heredoc.golden delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/testdata/object_with_heredoc.input delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/array_comment.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/assign_colon.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/comment.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/comment_single.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/complex.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/complex_key.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/empty.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/list.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/list_comma.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/multiple.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/old.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure_basic.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure_empty.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/test-fixtures/types.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/array.json delete mode 100644 vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/bad_input_128.json delete mode 100644 vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/bad_input_tf_8110.json delete mode 100644 vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/basic.json delete mode 100644 vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/good_input_tf_8110.json delete mode 100644 vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/object.json delete mode 100644 vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/types.json delete mode 100644 vendor/github.com/hashicorp/hcl/json/test-fixtures/array.json delete mode 100644 vendor/github.com/hashicorp/hcl/json/test-fixtures/basic.json delete mode 100644 vendor/github.com/hashicorp/hcl/json/test-fixtures/object.json delete mode 100644 vendor/github.com/hashicorp/hcl/json/test-fixtures/types.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/assign_deep.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/basic.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/basic.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/basic_int_string.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/basic_squish.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/block_assign.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/decode_policy.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/decode_policy.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/decode_tf_variable.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/decode_tf_variable.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/empty.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/escape.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/escape_backslash.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/flat.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/float.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/float.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/git_crypt.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/interpolate.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/list_of_lists.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/list_of_maps.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/multiline.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/multiline.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/multiline_bad.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/multiline_indented.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/multiline_literal.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/multiline_literal_with_hil.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/multiline_no_eof.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/multiline_no_hanging_indent.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/multiline_no_marker.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/nested_block_comment.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/nested_provider_bad.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/null_strings.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/object_list.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/object_with_bool.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/scientific.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/scientific.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/slice_expand.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure2.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure2.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure_flat.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure_flatmap.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure_list.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure_list.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure_list_deep.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure_list_empty.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure_multi.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/structure_multi.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/terraform_heroku.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/terraform_heroku.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/terraform_variable_invalid.json delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/tfvars.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/unterminated_block_comment.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/test-fixtures/unterminated_brace.hcl delete mode 100644 vendor/github.com/hashicorp/hcl/testhelper/unix2dos.go delete mode 100644 vendor/github.com/magiconair/properties/assert/assert.go delete mode 100644 vendor/github.com/magiconair/properties/assert/assert_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/extensions/table/table.go delete mode 100644 vendor/github.com/onsi/ginkgo/extensions/table/table_entry.go delete mode 100644 vendor/github.com/onsi/ginkgo/extensions/table/table_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/extensions/table/table_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/bootstrap_command.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/build_command.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/convert/ginkgo_ast_nodes.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/convert/import.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/convert/package_rewriter.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/convert/test_finder.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/convert/testfile_rewriter.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/convert/testing_t_rewriter.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/convert_command.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/help_command.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/interrupt_handler.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/sigquit_swallower_unix.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/sigquit_swallower_windows.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/main.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/nodot_command.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/notifications.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/run_command.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/run_watch_and_build_command_flags.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/suite_runner.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/testrunner/log_writer.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/testrunner/run_result.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/testsuite/test_suite.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/testsuite/testsuite_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/testsuite/testsuite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go15.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go15_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go16.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/unfocus_command.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/version_command.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/watch/delta.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/watch/delta_tracker.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/watch/dependencies.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/watch/package_hash.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/watch/package_hashes.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/watch/suite.go delete mode 100644 vendor/github.com/onsi/ginkgo/ginkgo/watch_command.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/extra_functions_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/nested/nested_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/nested_without_gofiles/subpackage/nested_subpackage_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/outside_package_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/xunit_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/extra_functions_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/fixtures_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_subpackage_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/outside_package_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/xunit_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage_fixture_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage_fixture_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/external_coverage_fixture/external_coverage.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/does_not_compile/does_not_compile_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/does_not_compile/does_not_compile_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/eventually_failing/eventually_failing_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/eventually_failing/eventually_failing_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/exiting_synchronized_setup_tests/exiting_synchronized_setup_tests_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/fail_fixture/fail_fixture_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/fail_fixture/fail_fixture_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_after_suite/failing_after_suite_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_after_suite/failing_after_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_before_suite/failing_before_suite_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_before_suite/failing_before_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/focused_fixture/focused_fixture_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/focused_fixture/focused_fixture_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/hanging_suite/hanging_suite_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/hanging_suite/hanging_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/no_test_fn/no_test_fn.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/no_test_fn/no_test_fn_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/no_tests/no_tests.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_suite_setup/passing_suite_setup_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_suite_setup/passing_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/progress_fixture/progress_fixture_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/progress_fixture/progress_fixture_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/skip_fixture/skip_fixture_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/skip_fixture/skip_fixture_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/synchronized_setup_tests/synchronized_setup_tests_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/ignored_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/tags_tests_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/tags_tests_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/test_description/test_description_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/test_description/test_description_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C.json delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/xunit_tests/xunit_tests.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/_fixtures/xunit_tests/xunit_tests_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/convert_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/coverage_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/fail_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/flags_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/integration.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/integration_suite_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/interrupt_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/precompiled_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/progress_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/run_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/skip_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/subcommand_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/suite_command_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/suite_setup_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/tags_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/test_description_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/verbose_and_succinct_test.go delete mode 100644 vendor/github.com/onsi/ginkgo/integration/watch_test.go delete mode 100644 vendor/github.com/onsi/gomega/gbytes/buffer.go delete mode 100644 vendor/github.com/onsi/gomega/gbytes/buffer_test.go delete mode 100644 vendor/github.com/onsi/gomega/gbytes/gbuffer_suite_test.go delete mode 100644 vendor/github.com/onsi/gomega/gbytes/io_wrappers.go delete mode 100644 vendor/github.com/onsi/gomega/gbytes/io_wrappers_test.go delete mode 100644 vendor/github.com/onsi/gomega/gbytes/say_matcher.go delete mode 100644 vendor/github.com/onsi/gomega/gbytes/say_matcher_test.go delete mode 100644 vendor/github.com/onsi/gomega/gexec/_fixture/firefly/main.go delete mode 100644 vendor/github.com/onsi/gomega/gexec/build.go delete mode 100644 vendor/github.com/onsi/gomega/gexec/build_test.go delete mode 100644 vendor/github.com/onsi/gomega/gexec/exit_matcher.go delete mode 100644 vendor/github.com/onsi/gomega/gexec/exit_matcher_test.go delete mode 100644 vendor/github.com/onsi/gomega/gexec/gexec_suite_test.go delete mode 100644 vendor/github.com/onsi/gomega/gexec/prefixed_writer.go delete mode 100644 vendor/github.com/onsi/gomega/gexec/prefixed_writer_test.go delete mode 100644 vendor/github.com/onsi/gomega/gexec/session.go delete mode 100644 vendor/github.com/onsi/gomega/gexec/session_test.go delete mode 100644 vendor/github.com/onsi/gomega/ghttp/handlers.go delete mode 100644 vendor/github.com/onsi/gomega/ghttp/protobuf/protobuf.go delete mode 100644 vendor/github.com/onsi/gomega/ghttp/protobuf/simple_message.pb.go delete mode 100644 vendor/github.com/onsi/gomega/ghttp/protobuf/simple_message.proto delete mode 100644 vendor/github.com/onsi/gomega/ghttp/test_server.go delete mode 100644 vendor/github.com/onsi/gomega/ghttp/test_server_suite_test.go delete mode 100644 vendor/github.com/onsi/gomega/ghttp/test_server_test.go delete mode 100644 vendor/github.com/onsi/gomega/gstruct/elements.go delete mode 100644 vendor/github.com/onsi/gomega/gstruct/elements_test.go delete mode 100644 vendor/github.com/onsi/gomega/gstruct/errors/nested_types.go delete mode 100644 vendor/github.com/onsi/gomega/gstruct/fields.go delete mode 100644 vendor/github.com/onsi/gomega/gstruct/fields_test.go delete mode 100644 vendor/github.com/onsi/gomega/gstruct/gstruct_tests_suite_test.go delete mode 100644 vendor/github.com/onsi/gomega/gstruct/ignore.go delete mode 100644 vendor/github.com/onsi/gomega/gstruct/ignore_test.go delete mode 100644 vendor/github.com/onsi/gomega/gstruct/pointer.go delete mode 100644 vendor/github.com/onsi/gomega/gstruct/pointer_test.go delete mode 100644 vendor/github.com/onsi/gomega/gstruct/types.go delete mode 100644 vendor/github.com/onsi/gomega/internal/fakematcher/fake_matcher.go delete mode 100644 vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_01.xml delete mode 100644 vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_02.xml delete mode 100644 vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_03.xml delete mode 100644 vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_04.xml delete mode 100644 vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_05.xml delete mode 100644 vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_06.xml delete mode 100644 vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_07.xml delete mode 100644 vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_08.xml delete mode 100644 vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_09.xml delete mode 100644 vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_10.xml delete mode 100644 vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_11.xml delete mode 100644 vendor/github.com/pelletier/go-toml/cmd/test_program.go delete mode 100644 vendor/github.com/pelletier/go-toml/cmd/tomljson/main.go delete mode 100644 vendor/github.com/pelletier/go-toml/cmd/tomljson/main_test.go delete mode 100644 vendor/github.com/pelletier/go-toml/cmd/tomll/main.go delete mode 100644 vendor/github.com/pelletier/go-toml/query/doc.go delete mode 100644 vendor/github.com/pelletier/go-toml/query/lexer.go delete mode 100644 vendor/github.com/pelletier/go-toml/query/lexer_test.go delete mode 100644 vendor/github.com/pelletier/go-toml/query/match.go delete mode 100644 vendor/github.com/pelletier/go-toml/query/match_test.go delete mode 100644 vendor/github.com/pelletier/go-toml/query/parser.go delete mode 100644 vendor/github.com/pelletier/go-toml/query/parser_test.go delete mode 100644 vendor/github.com/pelletier/go-toml/query/query.go delete mode 100644 vendor/github.com/pelletier/go-toml/query/query_test.go delete mode 100644 vendor/github.com/pelletier/go-toml/query/tokens.go delete mode 100644 vendor/github.com/spf13/afero/sftpfs/file.go delete mode 100644 vendor/github.com/spf13/afero/sftpfs/sftp.go delete mode 100644 vendor/github.com/spf13/afero/sftpfs/sftp_test_go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/add.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/add_test.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/golden_test.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/helpers.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/init.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/init_test.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/license_agpl.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/license_apache_2.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_2.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_3.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_2.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_3.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/license_lgpl.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/license_mit.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/licenses.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/project.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/project_test.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/root.go delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/testdata/main.go.golden delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/testdata/root.go.golden delete mode 100644 vendor/github.com/spf13/cobra/cobra/cmd/testdata/test.go.golden delete mode 100644 vendor/github.com/spf13/cobra/cobra/main.go delete mode 100644 vendor/github.com/spf13/cobra/doc/cmd_test.go delete mode 100644 vendor/github.com/spf13/cobra/doc/man_docs.go delete mode 100644 vendor/github.com/spf13/cobra/doc/man_docs.md delete mode 100644 vendor/github.com/spf13/cobra/doc/man_docs_test.go delete mode 100644 vendor/github.com/spf13/cobra/doc/man_examples_test.go delete mode 100644 vendor/github.com/spf13/cobra/doc/md_docs.go delete mode 100644 vendor/github.com/spf13/cobra/doc/md_docs.md delete mode 100644 vendor/github.com/spf13/cobra/doc/md_docs_test.go delete mode 100644 vendor/github.com/spf13/cobra/doc/util.go delete mode 100644 vendor/github.com/spf13/cobra/doc/yaml_docs.go delete mode 100644 vendor/github.com/spf13/cobra/doc/yaml_docs.md delete mode 100644 vendor/github.com/spf13/cobra/doc/yaml_docs_test.go delete mode 100755 vendor/github.com/spf13/pflag/verify/all.sh delete mode 100755 vendor/github.com/spf13/pflag/verify/gofmt.sh delete mode 100755 vendor/github.com/spf13/pflag/verify/golint.sh delete mode 100644 vendor/github.com/spf13/viper/remote/remote.go delete mode 100644 vendor/github.com/stretchr/testify/Godeps/Godeps.json delete mode 100644 vendor/github.com/stretchr/testify/Godeps/Readme delete mode 100644 vendor/github.com/stretchr/testify/_codegen/main.go delete mode 100644 vendor/github.com/stretchr/testify/http/doc.go delete mode 100644 vendor/github.com/stretchr/testify/http/test_response_writer.go delete mode 100644 vendor/github.com/stretchr/testify/http/test_round_tripper.go delete mode 100644 vendor/github.com/stretchr/testify/mock/doc.go delete mode 100644 vendor/github.com/stretchr/testify/mock/mock.go delete mode 100644 vendor/github.com/stretchr/testify/mock/mock_test.go delete mode 100644 vendor/github.com/stretchr/testify/suite/doc.go delete mode 100644 vendor/github.com/stretchr/testify/suite/interfaces.go delete mode 100644 vendor/github.com/stretchr/testify/suite/suite.go delete mode 100644 vendor/github.com/stretchr/testify/suite/suite_test.go 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/instructions_test.go delete mode 100644 vendor/golang.org/x/net/bpf/setter.go delete mode 100644 vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf delete mode 100644 vendor/golang.org/x/net/bpf/testdata/all_instructions.txt delete mode 100644 vendor/golang.org/x/net/bpf/vm.go delete mode 100644 vendor/golang.org/x/net/bpf/vm_aluop_test.go delete mode 100644 vendor/golang.org/x/net/bpf/vm_bpf_test.go delete mode 100644 vendor/golang.org/x/net/bpf/vm_extension_test.go delete mode 100644 vendor/golang.org/x/net/bpf/vm_instructions.go delete mode 100644 vendor/golang.org/x/net/bpf/vm_jump_test.go delete mode 100644 vendor/golang.org/x/net/bpf/vm_load_test.go delete mode 100644 vendor/golang.org/x/net/bpf/vm_ret_test.go delete mode 100644 vendor/golang.org/x/net/bpf/vm_scratch_test.go delete mode 100644 vendor/golang.org/x/net/bpf/vm_test.go delete mode 100644 vendor/golang.org/x/net/dict/dict.go delete mode 100644 vendor/golang.org/x/net/dns/dnsmessage/example_test.go delete mode 100644 vendor/golang.org/x/net/dns/dnsmessage/message.go delete mode 100644 vendor/golang.org/x/net/dns/dnsmessage/message_test.go delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/README delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html delete mode 100644 vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html delete mode 100644 vendor/golang.org/x/net/html/testdata/go1.html delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/README delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/adoption01.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/adoption02.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/comments01.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/doctype01.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/entities01.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/entities02.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/html5test-com.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/inbody01.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/isindex.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/plain-text-unsafe.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/scriptdata01.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/scripted/adoption01.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/scripted/webkit01.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tables01.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests1.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests10.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests11.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests12.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests14.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests15.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests16.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests17.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests18.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests19.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests2.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests20.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests21.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests22.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests23.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests24.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests25.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests26.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests3.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests4.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests5.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests6.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests7.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests8.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests9.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tests_innerHTML_1.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/tricky01.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/webkit01.dat delete mode 100644 vendor/golang.org/x/net/html/testdata/webkit/webkit02.dat 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/ciphers_test.go delete mode 100644 vendor/golang.org/x/net/http2/client_conn_pool.go delete mode 100644 vendor/golang.org/x/net/http2/configure_transport.go delete mode 100644 vendor/golang.org/x/net/http2/databuffer.go delete mode 100644 vendor/golang.org/x/net/http2/databuffer_test.go delete mode 100644 vendor/golang.org/x/net/http2/errors.go delete mode 100644 vendor/golang.org/x/net/http2/errors_test.go delete mode 100644 vendor/golang.org/x/net/http2/flow.go delete mode 100644 vendor/golang.org/x/net/http2/flow_test.go delete mode 100644 vendor/golang.org/x/net/http2/frame.go delete mode 100644 vendor/golang.org/x/net/http2/frame_test.go delete mode 100644 vendor/golang.org/x/net/http2/go16.go delete mode 100644 vendor/golang.org/x/net/http2/go17.go delete mode 100644 vendor/golang.org/x/net/http2/go17_not18.go delete mode 100644 vendor/golang.org/x/net/http2/go18.go delete mode 100644 vendor/golang.org/x/net/http2/go18_test.go delete mode 100644 vendor/golang.org/x/net/http2/go19.go delete mode 100644 vendor/golang.org/x/net/http2/go19_test.go delete mode 100644 vendor/golang.org/x/net/http2/gotrack.go delete mode 100644 vendor/golang.org/x/net/http2/gotrack_test.go delete mode 100644 vendor/golang.org/x/net/http2/h2demo/.gitignore delete mode 100644 vendor/golang.org/x/net/http2/h2demo/Makefile delete mode 100644 vendor/golang.org/x/net/http2/h2demo/README delete mode 100644 vendor/golang.org/x/net/http2/h2demo/h2demo.go delete mode 100644 vendor/golang.org/x/net/http2/h2demo/launch.go delete mode 100644 vendor/golang.org/x/net/http2/h2demo/rootCA.key delete mode 100644 vendor/golang.org/x/net/http2/h2demo/rootCA.pem delete mode 100644 vendor/golang.org/x/net/http2/h2demo/rootCA.srl delete mode 100644 vendor/golang.org/x/net/http2/h2demo/server.crt delete mode 100644 vendor/golang.org/x/net/http2/h2demo/server.key delete mode 100644 vendor/golang.org/x/net/http2/h2demo/tmpl.go delete mode 100644 vendor/golang.org/x/net/http2/h2i/README.md delete mode 100644 vendor/golang.org/x/net/http2/h2i/h2i.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/encode_test.go delete mode 100644 vendor/golang.org/x/net/http2/hpack/hpack.go delete mode 100644 vendor/golang.org/x/net/http2/hpack/hpack_test.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/hpack/tables_test.go delete mode 100644 vendor/golang.org/x/net/http2/http2.go delete mode 100644 vendor/golang.org/x/net/http2/http2_test.go delete mode 100644 vendor/golang.org/x/net/http2/not_go16.go delete mode 100644 vendor/golang.org/x/net/http2/not_go17.go delete mode 100644 vendor/golang.org/x/net/http2/not_go18.go delete mode 100644 vendor/golang.org/x/net/http2/not_go19.go delete mode 100644 vendor/golang.org/x/net/http2/pipe.go delete mode 100644 vendor/golang.org/x/net/http2/pipe_test.go delete mode 100644 vendor/golang.org/x/net/http2/server.go delete mode 100644 vendor/golang.org/x/net/http2/server_push_test.go delete mode 100644 vendor/golang.org/x/net/http2/server_test.go delete mode 100644 vendor/golang.org/x/net/http2/testdata/draft-ietf-httpbis-http2.xml delete mode 100644 vendor/golang.org/x/net/http2/transport.go delete mode 100644 vendor/golang.org/x/net/http2/transport_test.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_priority_test.go delete mode 100644 vendor/golang.org/x/net/http2/writesched_random.go delete mode 100644 vendor/golang.org/x/net/http2/writesched_random_test.go delete mode 100644 vendor/golang.org/x/net/http2/writesched_test.go delete mode 100644 vendor/golang.org/x/net/http2/z_spec_test.go delete mode 100644 vendor/golang.org/x/net/icmp/dstunreach.go delete mode 100644 vendor/golang.org/x/net/icmp/echo.go delete mode 100644 vendor/golang.org/x/net/icmp/endpoint.go delete mode 100644 vendor/golang.org/x/net/icmp/example_test.go delete mode 100644 vendor/golang.org/x/net/icmp/extension.go delete mode 100644 vendor/golang.org/x/net/icmp/extension_test.go delete mode 100644 vendor/golang.org/x/net/icmp/helper_posix.go delete mode 100644 vendor/golang.org/x/net/icmp/interface.go delete mode 100644 vendor/golang.org/x/net/icmp/ipv4.go delete mode 100644 vendor/golang.org/x/net/icmp/ipv4_test.go delete mode 100644 vendor/golang.org/x/net/icmp/ipv6.go delete mode 100644 vendor/golang.org/x/net/icmp/listen_posix.go delete mode 100644 vendor/golang.org/x/net/icmp/listen_stub.go delete mode 100644 vendor/golang.org/x/net/icmp/message.go delete mode 100644 vendor/golang.org/x/net/icmp/message_test.go delete mode 100644 vendor/golang.org/x/net/icmp/messagebody.go delete mode 100644 vendor/golang.org/x/net/icmp/mpls.go delete mode 100644 vendor/golang.org/x/net/icmp/multipart.go delete mode 100644 vendor/golang.org/x/net/icmp/multipart_test.go delete mode 100644 vendor/golang.org/x/net/icmp/packettoobig.go delete mode 100644 vendor/golang.org/x/net/icmp/paramprob.go delete mode 100644 vendor/golang.org/x/net/icmp/ping_test.go delete mode 100644 vendor/golang.org/x/net/icmp/sys_freebsd.go delete mode 100644 vendor/golang.org/x/net/icmp/timeexceeded.go delete mode 100644 vendor/golang.org/x/net/idna/example_test.go delete mode 100644 vendor/golang.org/x/net/idna/idna.go delete mode 100644 vendor/golang.org/x/net/idna/idna_test.go delete mode 100644 vendor/golang.org/x/net/idna/punycode.go delete mode 100644 vendor/golang.org/x/net/idna/punycode_test.go delete mode 100644 vendor/golang.org/x/net/idna/tables.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/iana/gen.go delete mode 100644 vendor/golang.org/x/net/internal/nettest/helper_bsd.go delete mode 100644 vendor/golang.org/x/net/internal/nettest/helper_nobsd.go delete mode 100644 vendor/golang.org/x/net/internal/nettest/helper_posix.go delete mode 100644 vendor/golang.org/x/net/internal/nettest/helper_stub.go delete mode 100644 vendor/golang.org/x/net/internal/nettest/helper_unix.go delete mode 100644 vendor/golang.org/x/net/internal/nettest/helper_windows.go delete mode 100644 vendor/golang.org/x/net/internal/nettest/interface.go delete mode 100644 vendor/golang.org/x/net/internal/nettest/rlimit.go delete mode 100644 vendor/golang.org/x/net/internal/nettest/stack.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/defs_darwin.go delete mode 100644 vendor/golang.org/x/net/internal/socket/defs_dragonfly.go delete mode 100644 vendor/golang.org/x/net/internal/socket/defs_freebsd.go delete mode 100644 vendor/golang.org/x/net/internal/socket/defs_linux.go delete mode 100644 vendor/golang.org/x/net/internal/socket/defs_netbsd.go delete mode 100644 vendor/golang.org/x/net/internal/socket/defs_openbsd.go delete mode 100644 vendor/golang.org/x/net/internal/socket/defs_solaris.go 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/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/rawconn_stub.go delete mode 100644 vendor/golang.org/x/net/internal/socket/reflect.go delete mode 100644 vendor/golang.org/x/net/internal/socket/socket.go delete mode 100644 vendor/golang.org/x/net/internal/socket/socket_go1_9_test.go delete mode 100644 vendor/golang.org/x/net/internal/socket/socket_test.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_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_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_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_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_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_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_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_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_solaris_amd64.go delete mode 100644 vendor/golang.org/x/net/internal/timeseries/timeseries.go delete mode 100644 vendor/golang.org/x/net/internal/timeseries/timeseries_test.go delete mode 100644 vendor/golang.org/x/net/ipv4/batch.go delete mode 100644 vendor/golang.org/x/net/ipv4/bpf_test.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_test.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/defs_darwin.go delete mode 100644 vendor/golang.org/x/net/ipv4/defs_dragonfly.go delete mode 100644 vendor/golang.org/x/net/ipv4/defs_freebsd.go delete mode 100644 vendor/golang.org/x/net/ipv4/defs_linux.go delete mode 100644 vendor/golang.org/x/net/ipv4/defs_netbsd.go delete mode 100644 vendor/golang.org/x/net/ipv4/defs_openbsd.go delete mode 100644 vendor/golang.org/x/net/ipv4/defs_solaris.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/example_test.go delete mode 100644 vendor/golang.org/x/net/ipv4/gen.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/header_test.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/icmp_test.go delete mode 100644 vendor/golang.org/x/net/ipv4/multicast_test.go delete mode 100644 vendor/golang.org/x/net/ipv4/multicastlistener_test.go delete mode 100644 vendor/golang.org/x/net/ipv4/multicastsockopt_test.go delete mode 100644 vendor/golang.org/x/net/ipv4/packet.go delete mode 100644 vendor/golang.org/x/net/ipv4/packet_go1_8.go delete mode 100644 vendor/golang.org/x/net/ipv4/packet_go1_9.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_cmsg_go1_8.go delete mode 100644 vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go delete mode 100644 vendor/golang.org/x/net/ipv4/payload_nocmsg.go delete mode 100644 vendor/golang.org/x/net/ipv4/readwrite_go1_8_test.go delete mode 100644 vendor/golang.org/x/net/ipv4/readwrite_go1_9_test.go delete mode 100644 vendor/golang.org/x/net/ipv4/readwrite_test.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_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/unicast_test.go delete mode 100644 vendor/golang.org/x/net/ipv4/unicastsockopt_test.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_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_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/bpf_test.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_test.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/defs_darwin.go delete mode 100644 vendor/golang.org/x/net/ipv6/defs_dragonfly.go delete mode 100644 vendor/golang.org/x/net/ipv6/defs_freebsd.go delete mode 100644 vendor/golang.org/x/net/ipv6/defs_linux.go delete mode 100644 vendor/golang.org/x/net/ipv6/defs_netbsd.go delete mode 100644 vendor/golang.org/x/net/ipv6/defs_openbsd.go delete mode 100644 vendor/golang.org/x/net/ipv6/defs_solaris.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/example_test.go delete mode 100644 vendor/golang.org/x/net/ipv6/gen.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/header_test.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_test.go delete mode 100644 vendor/golang.org/x/net/ipv6/icmp_windows.go delete mode 100644 vendor/golang.org/x/net/ipv6/mocktransponder_test.go delete mode 100644 vendor/golang.org/x/net/ipv6/multicast_test.go delete mode 100644 vendor/golang.org/x/net/ipv6/multicastlistener_test.go delete mode 100644 vendor/golang.org/x/net/ipv6/multicastsockopt_test.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_cmsg_go1_8.go delete mode 100644 vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go delete mode 100644 vendor/golang.org/x/net/ipv6/payload_nocmsg.go delete mode 100644 vendor/golang.org/x/net/ipv6/readwrite_go1_8_test.go delete mode 100644 vendor/golang.org/x/net/ipv6/readwrite_go1_9_test.go delete mode 100644 vendor/golang.org/x/net/ipv6/readwrite_test.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/sockopt_test.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/unicast_test.go delete mode 100644 vendor/golang.org/x/net/ipv6/unicastsockopt_test.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_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_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/lex/httplex/httplex.go delete mode 100644 vendor/golang.org/x/net/lex/httplex/httplex_test.go delete mode 100644 vendor/golang.org/x/net/lif/address.go delete mode 100644 vendor/golang.org/x/net/lif/address_test.go delete mode 100644 vendor/golang.org/x/net/lif/binary.go delete mode 100644 vendor/golang.org/x/net/lif/defs_solaris.go delete mode 100644 vendor/golang.org/x/net/lif/lif.go delete mode 100644 vendor/golang.org/x/net/lif/link.go delete mode 100644 vendor/golang.org/x/net/lif/link_test.go delete mode 100644 vendor/golang.org/x/net/lif/sys.go delete mode 100644 vendor/golang.org/x/net/lif/sys_solaris_amd64.s delete mode 100644 vendor/golang.org/x/net/lif/syscall.go delete mode 100644 vendor/golang.org/x/net/lif/zsys_solaris_amd64.go delete mode 100644 vendor/golang.org/x/net/nettest/conntest.go delete mode 100644 vendor/golang.org/x/net/nettest/conntest_go16.go delete mode 100644 vendor/golang.org/x/net/nettest/conntest_go17.go delete mode 100644 vendor/golang.org/x/net/nettest/conntest_test.go delete mode 100644 vendor/golang.org/x/net/netutil/listen.go delete mode 100644 vendor/golang.org/x/net/netutil/listen_test.go delete mode 100644 vendor/golang.org/x/net/publicsuffix/gen.go delete mode 100644 vendor/golang.org/x/net/publicsuffix/list.go delete mode 100644 vendor/golang.org/x/net/publicsuffix/list_test.go delete mode 100644 vendor/golang.org/x/net/publicsuffix/table.go delete mode 100644 vendor/golang.org/x/net/publicsuffix/table_test.go delete mode 100644 vendor/golang.org/x/net/route/address.go delete mode 100644 vendor/golang.org/x/net/route/address_darwin_test.go delete mode 100644 vendor/golang.org/x/net/route/address_test.go delete mode 100644 vendor/golang.org/x/net/route/binary.go delete mode 100644 vendor/golang.org/x/net/route/defs_darwin.go delete mode 100644 vendor/golang.org/x/net/route/defs_dragonfly.go delete mode 100644 vendor/golang.org/x/net/route/defs_freebsd.go delete mode 100644 vendor/golang.org/x/net/route/defs_netbsd.go delete mode 100644 vendor/golang.org/x/net/route/defs_openbsd.go delete mode 100644 vendor/golang.org/x/net/route/interface.go delete mode 100644 vendor/golang.org/x/net/route/interface_announce.go delete mode 100644 vendor/golang.org/x/net/route/interface_classic.go delete mode 100644 vendor/golang.org/x/net/route/interface_freebsd.go delete mode 100644 vendor/golang.org/x/net/route/interface_multicast.go delete mode 100644 vendor/golang.org/x/net/route/interface_openbsd.go delete mode 100644 vendor/golang.org/x/net/route/message.go delete mode 100644 vendor/golang.org/x/net/route/message_darwin_test.go delete mode 100644 vendor/golang.org/x/net/route/message_freebsd_test.go delete mode 100644 vendor/golang.org/x/net/route/message_test.go delete mode 100644 vendor/golang.org/x/net/route/route.go delete mode 100644 vendor/golang.org/x/net/route/route_classic.go delete mode 100644 vendor/golang.org/x/net/route/route_openbsd.go delete mode 100644 vendor/golang.org/x/net/route/route_test.go delete mode 100644 vendor/golang.org/x/net/route/sys.go delete mode 100644 vendor/golang.org/x/net/route/sys_darwin.go delete mode 100644 vendor/golang.org/x/net/route/sys_dragonfly.go delete mode 100644 vendor/golang.org/x/net/route/sys_freebsd.go delete mode 100644 vendor/golang.org/x/net/route/sys_netbsd.go delete mode 100644 vendor/golang.org/x/net/route/sys_openbsd.go delete mode 100644 vendor/golang.org/x/net/route/syscall.go delete mode 100644 vendor/golang.org/x/net/route/zsys_darwin.go delete mode 100644 vendor/golang.org/x/net/route/zsys_dragonfly.go delete mode 100644 vendor/golang.org/x/net/route/zsys_freebsd_386.go delete mode 100644 vendor/golang.org/x/net/route/zsys_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/net/route/zsys_freebsd_arm.go delete mode 100644 vendor/golang.org/x/net/route/zsys_netbsd.go delete mode 100644 vendor/golang.org/x/net/route/zsys_openbsd.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/histogram_test.go delete mode 100644 vendor/golang.org/x/net/trace/trace.go delete mode 100644 vendor/golang.org/x/net/trace/trace_go16.go delete mode 100644 vendor/golang.org/x/net/trace/trace_go17.go delete mode 100644 vendor/golang.org/x/net/trace/trace_test.go delete mode 100644 vendor/golang.org/x/net/webdav/file.go delete mode 100644 vendor/golang.org/x/net/webdav/file_go1.6.go delete mode 100644 vendor/golang.org/x/net/webdav/file_go1.7.go delete mode 100644 vendor/golang.org/x/net/webdav/file_test.go delete mode 100644 vendor/golang.org/x/net/webdav/if.go delete mode 100644 vendor/golang.org/x/net/webdav/if_test.go delete mode 100644 vendor/golang.org/x/net/webdav/internal/xml/README delete mode 100644 vendor/golang.org/x/net/webdav/internal/xml/atom_test.go delete mode 100644 vendor/golang.org/x/net/webdav/internal/xml/example_test.go delete mode 100644 vendor/golang.org/x/net/webdav/internal/xml/marshal.go delete mode 100644 vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go delete mode 100644 vendor/golang.org/x/net/webdav/internal/xml/read.go delete mode 100644 vendor/golang.org/x/net/webdav/internal/xml/read_test.go delete mode 100644 vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go delete mode 100644 vendor/golang.org/x/net/webdav/internal/xml/xml.go delete mode 100644 vendor/golang.org/x/net/webdav/internal/xml/xml_test.go delete mode 100644 vendor/golang.org/x/net/webdav/litmus_test_server.go delete mode 100644 vendor/golang.org/x/net/webdav/lock.go delete mode 100644 vendor/golang.org/x/net/webdav/lock_test.go delete mode 100644 vendor/golang.org/x/net/webdav/prop.go delete mode 100644 vendor/golang.org/x/net/webdav/prop_test.go delete mode 100644 vendor/golang.org/x/net/webdav/webdav.go delete mode 100644 vendor/golang.org/x/net/webdav/webdav_test.go delete mode 100644 vendor/golang.org/x/net/webdav/xml.go delete mode 100644 vendor/golang.org/x/net/webdav/xml_test.go delete mode 100644 vendor/golang.org/x/net/websocket/client.go delete mode 100644 vendor/golang.org/x/net/websocket/dial.go delete mode 100644 vendor/golang.org/x/net/websocket/dial_test.go delete mode 100644 vendor/golang.org/x/net/websocket/exampledial_test.go delete mode 100644 vendor/golang.org/x/net/websocket/examplehandler_test.go delete mode 100644 vendor/golang.org/x/net/websocket/hybi.go delete mode 100644 vendor/golang.org/x/net/websocket/hybi_test.go delete mode 100644 vendor/golang.org/x/net/websocket/server.go delete mode 100644 vendor/golang.org/x/net/websocket/websocket.go delete mode 100644 vendor/golang.org/x/net/websocket/websocket_test.go delete mode 100644 vendor/golang.org/x/net/xsrftoken/xsrf.go delete mode 100644 vendor/golang.org/x/net/xsrftoken/xsrf_test.go delete mode 100644 vendor/golang.org/x/sys/plan9/asm.s delete mode 100644 vendor/golang.org/x/sys/plan9/asm_plan9_386.s delete mode 100644 vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s delete mode 100644 vendor/golang.org/x/sys/plan9/const_plan9.go delete mode 100644 vendor/golang.org/x/sys/plan9/dir_plan9.go delete mode 100644 vendor/golang.org/x/sys/plan9/env_plan9.go delete mode 100644 vendor/golang.org/x/sys/plan9/env_unset.go delete mode 100644 vendor/golang.org/x/sys/plan9/errors_plan9.go delete mode 100755 vendor/golang.org/x/sys/plan9/mkall.sh delete mode 100755 vendor/golang.org/x/sys/plan9/mkerrors.sh delete mode 100755 vendor/golang.org/x/sys/plan9/mksyscall.pl delete mode 100755 vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh delete mode 100644 vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go delete mode 100644 vendor/golang.org/x/sys/plan9/pwd_plan9.go delete mode 100644 vendor/golang.org/x/sys/plan9/race.go delete mode 100644 vendor/golang.org/x/sys/plan9/race0.go delete mode 100644 vendor/golang.org/x/sys/plan9/str.go delete mode 100644 vendor/golang.org/x/sys/plan9/syscall.go delete mode 100644 vendor/golang.org/x/sys/plan9/syscall_plan9.go delete mode 100644 vendor/golang.org/x/sys/plan9/syscall_test.go delete mode 100644 vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go delete mode 100644 vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go delete mode 100644 vendor/golang.org/x/sys/plan9/zsysnum_plan9.go delete mode 100644 vendor/golang.org/x/sys/unix/linux/Dockerfile delete mode 100644 vendor/golang.org/x/sys/unix/linux/mkall.go delete mode 100755 vendor/golang.org/x/sys/unix/linux/mksysnum.pl delete mode 100644 vendor/golang.org/x/sys/unix/linux/types.go delete mode 100644 vendor/golang.org/x/sys/windows/registry/export_test.go delete mode 100644 vendor/golang.org/x/sys/windows/registry/key.go delete mode 100644 vendor/golang.org/x/sys/windows/registry/mksyscall.go delete mode 100644 vendor/golang.org/x/sys/windows/registry/registry_test.go delete mode 100644 vendor/golang.org/x/sys/windows/registry/syscall.go delete mode 100644 vendor/golang.org/x/sys/windows/registry/value.go delete mode 100644 vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/debug/log.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/debug/service.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/event.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/eventlog/install.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/eventlog/log.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/example/beep.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/example/install.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/example/main.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/example/manage.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/example/service.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/go12.c delete mode 100644 vendor/golang.org/x/sys/windows/svc/go12.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/go13.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/mgr/config.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/mgr/mgr.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/mgr/service.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/security.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/service.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/svc_test.go delete mode 100644 vendor/golang.org/x/sys/windows/svc/sys_386.s delete mode 100644 vendor/golang.org/x/sys/windows/svc/sys_amd64.s 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/context_test.go delete mode 100644 vendor/golang.org/x/text/cases/example_test.go delete mode 100644 vendor/golang.org/x/text/cases/fold.go delete mode 100644 vendor/golang.org/x/text/cases/fold_test.go delete mode 100644 vendor/golang.org/x/text/cases/gen.go delete mode 100644 vendor/golang.org/x/text/cases/gen_trieval.go delete mode 100644 vendor/golang.org/x/text/cases/icu.go delete mode 100644 vendor/golang.org/x/text/cases/icu_test.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/map_test.go delete mode 100644 vendor/golang.org/x/text/cases/tables.go delete mode 100644 vendor/golang.org/x/text/cases/tables_test.go delete mode 100644 vendor/golang.org/x/text/cases/trieval.go delete mode 100644 vendor/golang.org/x/text/cmd/gotext/doc.go delete mode 100644 vendor/golang.org/x/text/cmd/gotext/extract.go delete mode 100644 vendor/golang.org/x/text/cmd/gotext/main.go delete mode 100644 vendor/golang.org/x/text/cmd/gotext/message.go delete mode 100644 vendor/golang.org/x/text/collate/build/builder.go delete mode 100644 vendor/golang.org/x/text/collate/build/builder_test.go delete mode 100644 vendor/golang.org/x/text/collate/build/colelem.go delete mode 100644 vendor/golang.org/x/text/collate/build/colelem_test.go delete mode 100644 vendor/golang.org/x/text/collate/build/contract.go delete mode 100644 vendor/golang.org/x/text/collate/build/contract_test.go delete mode 100644 vendor/golang.org/x/text/collate/build/order.go delete mode 100644 vendor/golang.org/x/text/collate/build/order_test.go delete mode 100644 vendor/golang.org/x/text/collate/build/table.go delete mode 100644 vendor/golang.org/x/text/collate/build/trie.go delete mode 100644 vendor/golang.org/x/text/collate/build/trie_test.go delete mode 100644 vendor/golang.org/x/text/collate/collate.go delete mode 100644 vendor/golang.org/x/text/collate/collate_test.go delete mode 100644 vendor/golang.org/x/text/collate/export_test.go delete mode 100644 vendor/golang.org/x/text/collate/index.go delete mode 100644 vendor/golang.org/x/text/collate/maketables.go delete mode 100644 vendor/golang.org/x/text/collate/option.go delete mode 100644 vendor/golang.org/x/text/collate/option_test.go delete mode 100644 vendor/golang.org/x/text/collate/reg_test.go delete mode 100644 vendor/golang.org/x/text/collate/sort.go delete mode 100644 vendor/golang.org/x/text/collate/sort_test.go delete mode 100644 vendor/golang.org/x/text/collate/table_test.go delete mode 100644 vendor/golang.org/x/text/collate/tables.go delete mode 100644 vendor/golang.org/x/text/collate/tools/colcmp/Makefile delete mode 100644 vendor/golang.org/x/text/collate/tools/colcmp/chars.go delete mode 100644 vendor/golang.org/x/text/collate/tools/colcmp/col.go delete mode 100644 vendor/golang.org/x/text/collate/tools/colcmp/colcmp.go delete mode 100644 vendor/golang.org/x/text/collate/tools/colcmp/darwin.go delete mode 100644 vendor/golang.org/x/text/collate/tools/colcmp/gen.go delete mode 100644 vendor/golang.org/x/text/collate/tools/colcmp/icu.go delete mode 100644 vendor/golang.org/x/text/currency/common.go delete mode 100644 vendor/golang.org/x/text/currency/currency.go delete mode 100644 vendor/golang.org/x/text/currency/currency_test.go delete mode 100644 vendor/golang.org/x/text/currency/example_test.go delete mode 100644 vendor/golang.org/x/text/currency/format.go delete mode 100644 vendor/golang.org/x/text/currency/format_test.go delete mode 100644 vendor/golang.org/x/text/currency/gen.go delete mode 100644 vendor/golang.org/x/text/currency/gen_common.go delete mode 100644 vendor/golang.org/x/text/currency/query.go delete mode 100644 vendor/golang.org/x/text/currency/query_test.go delete mode 100644 vendor/golang.org/x/text/currency/tables.go delete mode 100644 vendor/golang.org/x/text/currency/tables_test.go delete mode 100644 vendor/golang.org/x/text/encoding/ianaindex/example_test.go delete mode 100644 vendor/golang.org/x/text/encoding/ianaindex/gen.go delete mode 100644 vendor/golang.org/x/text/encoding/ianaindex/ianaindex.go delete mode 100644 vendor/golang.org/x/text/encoding/ianaindex/ianaindex_test.go delete mode 100644 vendor/golang.org/x/text/encoding/ianaindex/tables.go delete mode 100644 vendor/golang.org/x/text/encoding/internal/enctest/enctest.go delete mode 100644 vendor/golang.org/x/text/encoding/testdata/candide-gb18030.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/candide-utf-16le.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/candide-utf-32be.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/candide-utf-8.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/candide-windows-1252.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/rashomon-euc-jp.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/rashomon-iso-2022-jp.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/rashomon-shift-jis.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/rashomon-utf-8.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-hz-gb2312.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-utf-8.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-gbk.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-utf-8.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-big5.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-utf-8.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-euc-kr.txt delete mode 100644 vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-utf-8.txt delete mode 100644 vendor/golang.org/x/text/encoding/unicode/utf32/utf32.go delete mode 100644 vendor/golang.org/x/text/encoding/unicode/utf32/utf32_test.go delete mode 100644 vendor/golang.org/x/text/feature/plural/common.go delete mode 100644 vendor/golang.org/x/text/feature/plural/data_test.go delete mode 100644 vendor/golang.org/x/text/feature/plural/example_test.go delete mode 100644 vendor/golang.org/x/text/feature/plural/gen.go delete mode 100644 vendor/golang.org/x/text/feature/plural/gen_common.go delete mode 100755 vendor/golang.org/x/text/feature/plural/message.go delete mode 100644 vendor/golang.org/x/text/feature/plural/message_test.go delete mode 100644 vendor/golang.org/x/text/feature/plural/plural.go delete mode 100644 vendor/golang.org/x/text/feature/plural/plural_test.go delete mode 100644 vendor/golang.org/x/text/feature/plural/tables.go delete mode 100644 vendor/golang.org/x/text/internal/catmsg/catmsg.go delete mode 100644 vendor/golang.org/x/text/internal/catmsg/catmsg_test.go delete mode 100755 vendor/golang.org/x/text/internal/catmsg/codec.go delete mode 100644 vendor/golang.org/x/text/internal/catmsg/varint.go delete mode 100644 vendor/golang.org/x/text/internal/catmsg/varint_test.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/collate_test.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/collelem.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/collelem_test.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/colltab.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/colltab_test.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/contract.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/contract_test.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/iter.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/iter_test.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/numeric.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/numeric_test.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/table.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/trie.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/trie_test.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/weighter.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/weighter_test.go delete mode 100644 vendor/golang.org/x/text/internal/export/README delete mode 100644 vendor/golang.org/x/text/internal/export/idna/common_test.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/example_test.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/gen.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/gen_common.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/gen_test.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/gen_trieval.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/idna.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/idna_test.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/punycode.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/punycode_test.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/tables.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/trie.go delete mode 100644 vendor/golang.org/x/text/internal/export/idna/trieval.go delete mode 100644 vendor/golang.org/x/text/internal/format/format.go delete mode 100644 vendor/golang.org/x/text/internal/number/common.go delete mode 100644 vendor/golang.org/x/text/internal/number/decimal.go delete mode 100644 vendor/golang.org/x/text/internal/number/decimal_test.go delete mode 100755 vendor/golang.org/x/text/internal/number/format.go delete mode 100755 vendor/golang.org/x/text/internal/number/format_test.go delete mode 100644 vendor/golang.org/x/text/internal/number/gen.go delete mode 100644 vendor/golang.org/x/text/internal/number/gen_common.go delete mode 100644 vendor/golang.org/x/text/internal/number/number.go delete mode 100644 vendor/golang.org/x/text/internal/number/number_test.go delete mode 100644 vendor/golang.org/x/text/internal/number/pattern.go delete mode 100644 vendor/golang.org/x/text/internal/number/pattern_test.go delete mode 100644 vendor/golang.org/x/text/internal/number/roundingmode_string.go delete mode 100644 vendor/golang.org/x/text/internal/number/tables.go delete mode 100644 vendor/golang.org/x/text/internal/number/tables_test.go delete mode 100644 vendor/golang.org/x/text/internal/stringset/set.go delete mode 100644 vendor/golang.org/x/text/internal/stringset/set_test.go delete mode 100644 vendor/golang.org/x/text/internal/testtext/codesize.go delete mode 100644 vendor/golang.org/x/text/internal/testtext/flag.go delete mode 100644 vendor/golang.org/x/text/internal/testtext/gc.go delete mode 100644 vendor/golang.org/x/text/internal/testtext/gccgo.go delete mode 100644 vendor/golang.org/x/text/internal/testtext/go1_6.go delete mode 100644 vendor/golang.org/x/text/internal/testtext/go1_7.go delete mode 100644 vendor/golang.org/x/text/internal/testtext/text.go delete mode 100644 vendor/golang.org/x/text/language/display/dict.go delete mode 100644 vendor/golang.org/x/text/language/display/dict_test.go delete mode 100644 vendor/golang.org/x/text/language/display/display.go delete mode 100644 vendor/golang.org/x/text/language/display/display_test.go delete mode 100644 vendor/golang.org/x/text/language/display/examples_test.go delete mode 100644 vendor/golang.org/x/text/language/display/lookup.go delete mode 100644 vendor/golang.org/x/text/language/display/maketables.go delete mode 100644 vendor/golang.org/x/text/language/display/tables.go delete mode 100644 vendor/golang.org/x/text/language/testdata/CLDRLocaleMatcherTest.txt delete mode 100644 vendor/golang.org/x/text/language/testdata/GoLocaleMatcherTest.txt delete mode 100644 vendor/golang.org/x/text/message/catalog.go delete mode 100644 vendor/golang.org/x/text/message/catalog/catalog.go delete mode 100644 vendor/golang.org/x/text/message/catalog/catalog_test.go delete mode 100644 vendor/golang.org/x/text/message/catalog/dict.go delete mode 100644 vendor/golang.org/x/text/message/doc.go delete mode 100644 vendor/golang.org/x/text/message/examples_test.go delete mode 100755 vendor/golang.org/x/text/message/fmt_test.go delete mode 100644 vendor/golang.org/x/text/message/format.go delete mode 100644 vendor/golang.org/x/text/message/message.go delete mode 100644 vendor/golang.org/x/text/message/message_test.go delete mode 100644 vendor/golang.org/x/text/message/print.go delete mode 100644 vendor/golang.org/x/text/search/index.go delete mode 100644 vendor/golang.org/x/text/search/pattern.go delete mode 100644 vendor/golang.org/x/text/search/pattern_test.go delete mode 100644 vendor/golang.org/x/text/search/search.go delete mode 100644 vendor/golang.org/x/text/search/tables.go delete mode 100644 vendor/golang.org/x/text/secure/bidirule/bench_test.go delete mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule.go delete mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule_test.go delete mode 100644 vendor/golang.org/x/text/secure/doc.go delete mode 100644 vendor/golang.org/x/text/secure/precis/benchmark_test.go delete mode 100644 vendor/golang.org/x/text/secure/precis/class.go delete mode 100644 vendor/golang.org/x/text/secure/precis/class_test.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/enforce_test.go delete mode 100644 vendor/golang.org/x/text/secure/precis/gen.go delete mode 100644 vendor/golang.org/x/text/secure/precis/gen_trieval.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/profile_test.go delete mode 100644 vendor/golang.org/x/text/secure/precis/profiles.go delete mode 100644 vendor/golang.org/x/text/secure/precis/tables.go delete mode 100644 vendor/golang.org/x/text/secure/precis/tables_test.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/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/core_test.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/gen.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/gen_ranges.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/gen_trieval.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/prop.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/ranges_test.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/tables.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/tables_test.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/trieval.go delete mode 100644 vendor/golang.org/x/text/unicode/rangetable/gen.go delete mode 100644 vendor/golang.org/x/text/unicode/rangetable/merge.go delete mode 100644 vendor/golang.org/x/text/unicode/rangetable/merge_test.go delete mode 100644 vendor/golang.org/x/text/unicode/rangetable/rangetable.go delete mode 100644 vendor/golang.org/x/text/unicode/rangetable/rangetable_test.go delete mode 100644 vendor/golang.org/x/text/unicode/rangetable/tables.go delete mode 100644 vendor/golang.org/x/text/unicode/runenames/bits.go delete mode 100644 vendor/golang.org/x/text/unicode/runenames/example_test.go delete mode 100644 vendor/golang.org/x/text/unicode/runenames/gen.go delete mode 100644 vendor/golang.org/x/text/unicode/runenames/gen_bits.go delete mode 100644 vendor/golang.org/x/text/unicode/runenames/runenames.go delete mode 100644 vendor/golang.org/x/text/unicode/runenames/runenames_test.go delete mode 100644 vendor/golang.org/x/text/unicode/runenames/tables.go delete mode 100644 vendor/golang.org/x/text/width/common_test.go delete mode 100644 vendor/golang.org/x/text/width/example_test.go delete mode 100644 vendor/golang.org/x/text/width/gen.go delete mode 100644 vendor/golang.org/x/text/width/gen_common.go delete mode 100644 vendor/golang.org/x/text/width/gen_trieval.go delete mode 100644 vendor/golang.org/x/text/width/kind_string.go delete mode 100644 vendor/golang.org/x/text/width/runes_test.go delete mode 100644 vendor/golang.org/x/text/width/tables.go delete mode 100644 vendor/golang.org/x/text/width/tables_test.go delete mode 100644 vendor/golang.org/x/text/width/transform.go delete mode 100644 vendor/golang.org/x/text/width/transform_test.go delete mode 100644 vendor/golang.org/x/text/width/trieval.go delete mode 100644 vendor/golang.org/x/text/width/width.go diff --git a/tests/ginkgo/read-cmd_test.go b/tests/ginkgo/read-cmd_test.go new file mode 100644 index 000000000..149561721 --- /dev/null +++ b/tests/ginkgo/read-cmd_test.go @@ -0,0 +1,42 @@ +package ginkgo + +import ( + "path" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/replicatedcom/support-bundle/cmd" +) + +var _ = Describe("Given file paths", func() { + + BeforeEach(EnterNewTempDir) + AfterEach(CleanupDir) + + It("And the user runs the following commands within desired locations", func() { + + WriteFile("config.yml", ` +specs: + - builtin: core.read-command + raw: /daemon/commands/date + config: + command: "date" + `) + + err := cmd.Generate( + path.Join(tmpdir, "config.yml"), + path.Join(tmpdir, "bundle.tar.gz"), + true, + 60, + ) + + Expect(err).To(BeNil()) + + contents := ReadFileFromBundle( + path.Join("bundle.tar.gz"), + "/daemon/commands/date", + ) + + Expect(contents).ToNot(BeEmpty()) + }) +}) diff --git a/tests/ginkgo/temp_test.go b/tests/ginkgo/read-file_test.go similarity index 100% rename from tests/ginkgo/temp_test.go rename to tests/ginkgo/read-file_test.go diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/LICENSE b/vendor/github.com/Microsoft/go-winio/archive/tar/LICENSE deleted file mode 100644 index 744875676..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/common.go b/vendor/github.com/Microsoft/go-winio/archive/tar/common.go deleted file mode 100644 index 0378401c0..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/common.go +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package tar implements access to tar archives. -// It aims to cover most of the variations, including those produced -// by GNU and BSD tars. -// -// References: -// http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5 -// http://www.gnu.org/software/tar/manual/html_node/Standard.html -// http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html -package tar - -import ( - "bytes" - "errors" - "fmt" - "os" - "path" - "time" -) - -const ( - blockSize = 512 - - // Types - TypeReg = '0' // regular file - TypeRegA = '\x00' // regular file - TypeLink = '1' // hard link - TypeSymlink = '2' // symbolic link - TypeChar = '3' // character device node - TypeBlock = '4' // block device node - TypeDir = '5' // directory - TypeFifo = '6' // fifo node - TypeCont = '7' // reserved - TypeXHeader = 'x' // extended header - TypeXGlobalHeader = 'g' // global extended header - TypeGNULongName = 'L' // Next file has a long name - TypeGNULongLink = 'K' // Next file symlinks to a file w/ a long name - TypeGNUSparse = 'S' // sparse file -) - -// A Header represents a single header in a tar archive. -// Some fields may not be populated. -type Header struct { - Name string // name of header file entry - Mode int64 // permission and mode bits - Uid int // user id of owner - Gid int // group id of owner - Size int64 // length in bytes - ModTime time.Time // modified time - Typeflag byte // type of header entry - Linkname string // target name of link - Uname string // user name of owner - Gname string // group name of owner - Devmajor int64 // major number of character or block device - Devminor int64 // minor number of character or block device - AccessTime time.Time // access time - ChangeTime time.Time // status change time - CreationTime time.Time // creation time - Xattrs map[string]string - Winheaders map[string]string -} - -// File name constants from the tar spec. -const ( - fileNameSize = 100 // Maximum number of bytes in a standard tar name. - fileNamePrefixSize = 155 // Maximum number of ustar extension bytes. -) - -// FileInfo returns an os.FileInfo for the Header. -func (h *Header) FileInfo() os.FileInfo { - return headerFileInfo{h} -} - -// headerFileInfo implements os.FileInfo. -type headerFileInfo struct { - h *Header -} - -func (fi headerFileInfo) Size() int64 { return fi.h.Size } -func (fi headerFileInfo) IsDir() bool { return fi.Mode().IsDir() } -func (fi headerFileInfo) ModTime() time.Time { return fi.h.ModTime } -func (fi headerFileInfo) Sys() interface{} { return fi.h } - -// Name returns the base name of the file. -func (fi headerFileInfo) Name() string { - if fi.IsDir() { - return path.Base(path.Clean(fi.h.Name)) - } - return path.Base(fi.h.Name) -} - -// Mode returns the permission and mode bits for the headerFileInfo. -func (fi headerFileInfo) Mode() (mode os.FileMode) { - // Set file permission bits. - mode = os.FileMode(fi.h.Mode).Perm() - - // Set setuid, setgid and sticky bits. - if fi.h.Mode&c_ISUID != 0 { - // setuid - mode |= os.ModeSetuid - } - if fi.h.Mode&c_ISGID != 0 { - // setgid - mode |= os.ModeSetgid - } - if fi.h.Mode&c_ISVTX != 0 { - // sticky - mode |= os.ModeSticky - } - - // Set file mode bits. - // clear perm, setuid, setgid and sticky bits. - m := os.FileMode(fi.h.Mode) &^ 07777 - if m == c_ISDIR { - // directory - mode |= os.ModeDir - } - if m == c_ISFIFO { - // named pipe (FIFO) - mode |= os.ModeNamedPipe - } - if m == c_ISLNK { - // symbolic link - mode |= os.ModeSymlink - } - if m == c_ISBLK { - // device file - mode |= os.ModeDevice - } - if m == c_ISCHR { - // Unix character device - mode |= os.ModeDevice - mode |= os.ModeCharDevice - } - if m == c_ISSOCK { - // Unix domain socket - mode |= os.ModeSocket - } - - switch fi.h.Typeflag { - case TypeSymlink: - // symbolic link - mode |= os.ModeSymlink - case TypeChar: - // character device node - mode |= os.ModeDevice - mode |= os.ModeCharDevice - case TypeBlock: - // block device node - mode |= os.ModeDevice - case TypeDir: - // directory - mode |= os.ModeDir - case TypeFifo: - // fifo node - mode |= os.ModeNamedPipe - } - - return mode -} - -// sysStat, if non-nil, populates h from system-dependent fields of fi. -var sysStat func(fi os.FileInfo, h *Header) error - -// Mode constants from the tar spec. -const ( - c_ISUID = 04000 // Set uid - c_ISGID = 02000 // Set gid - c_ISVTX = 01000 // Save text (sticky bit) - c_ISDIR = 040000 // Directory - c_ISFIFO = 010000 // FIFO - c_ISREG = 0100000 // Regular file - c_ISLNK = 0120000 // Symbolic link - c_ISBLK = 060000 // Block special file - c_ISCHR = 020000 // Character special file - c_ISSOCK = 0140000 // Socket -) - -// Keywords for the PAX Extended Header -const ( - paxAtime = "atime" - paxCharset = "charset" - paxComment = "comment" - paxCtime = "ctime" // please note that ctime is not a valid pax header. - paxCreationTime = "LIBARCHIVE.creationtime" - paxGid = "gid" - paxGname = "gname" - paxLinkpath = "linkpath" - paxMtime = "mtime" - paxPath = "path" - paxSize = "size" - paxUid = "uid" - paxUname = "uname" - paxXattr = "SCHILY.xattr." - paxWindows = "MSWINDOWS." - paxNone = "" -) - -// FileInfoHeader creates a partially-populated Header from fi. -// If fi describes a symlink, FileInfoHeader records link as the link target. -// If fi describes a directory, a slash is appended to the name. -// Because os.FileInfo's Name method returns only the base name of -// the file it describes, it may be necessary to modify the Name field -// of the returned header to provide the full path name of the file. -func FileInfoHeader(fi os.FileInfo, link string) (*Header, error) { - if fi == nil { - return nil, errors.New("tar: FileInfo is nil") - } - fm := fi.Mode() - h := &Header{ - Name: fi.Name(), - ModTime: fi.ModTime(), - Mode: int64(fm.Perm()), // or'd with c_IS* constants later - } - switch { - case fm.IsRegular(): - h.Mode |= c_ISREG - h.Typeflag = TypeReg - h.Size = fi.Size() - case fi.IsDir(): - h.Typeflag = TypeDir - h.Mode |= c_ISDIR - h.Name += "/" - case fm&os.ModeSymlink != 0: - h.Typeflag = TypeSymlink - h.Mode |= c_ISLNK - h.Linkname = link - case fm&os.ModeDevice != 0: - if fm&os.ModeCharDevice != 0 { - h.Mode |= c_ISCHR - h.Typeflag = TypeChar - } else { - h.Mode |= c_ISBLK - h.Typeflag = TypeBlock - } - case fm&os.ModeNamedPipe != 0: - h.Typeflag = TypeFifo - h.Mode |= c_ISFIFO - case fm&os.ModeSocket != 0: - h.Mode |= c_ISSOCK - default: - return nil, fmt.Errorf("archive/tar: unknown file mode %v", fm) - } - if fm&os.ModeSetuid != 0 { - h.Mode |= c_ISUID - } - if fm&os.ModeSetgid != 0 { - h.Mode |= c_ISGID - } - if fm&os.ModeSticky != 0 { - h.Mode |= c_ISVTX - } - // If possible, populate additional fields from OS-specific - // FileInfo fields. - if sys, ok := fi.Sys().(*Header); ok { - // This FileInfo came from a Header (not the OS). Use the - // original Header to populate all remaining fields. - h.Uid = sys.Uid - h.Gid = sys.Gid - h.Uname = sys.Uname - h.Gname = sys.Gname - h.AccessTime = sys.AccessTime - h.ChangeTime = sys.ChangeTime - if sys.Xattrs != nil { - h.Xattrs = make(map[string]string) - for k, v := range sys.Xattrs { - h.Xattrs[k] = v - } - } - if sys.Typeflag == TypeLink { - // hard link - h.Typeflag = TypeLink - h.Size = 0 - h.Linkname = sys.Linkname - } - } - if sysStat != nil { - return h, sysStat(fi, h) - } - return h, nil -} - -var zeroBlock = make([]byte, blockSize) - -// POSIX specifies a sum of the unsigned byte values, but the Sun tar uses signed byte values. -// We compute and return both. -func checksum(header []byte) (unsigned int64, signed int64) { - for i := 0; i < len(header); i++ { - if i == 148 { - // The chksum field (header[148:156]) is special: it should be treated as space bytes. - unsigned += ' ' * 8 - signed += ' ' * 8 - i += 7 - continue - } - unsigned += int64(header[i]) - signed += int64(int8(header[i])) - } - return -} - -type slicer []byte - -func (sp *slicer) next(n int) (b []byte) { - s := *sp - b, *sp = s[0:n], s[n:] - return -} - -func isASCII(s string) bool { - for _, c := range s { - if c >= 0x80 { - return false - } - } - return true -} - -func toASCII(s string) string { - if isASCII(s) { - return s - } - var buf bytes.Buffer - for _, c := range s { - if c < 0x80 { - buf.WriteByte(byte(c)) - } - } - return buf.String() -} - -// isHeaderOnlyType checks if the given type flag is of the type that has no -// data section even if a size is specified. -func isHeaderOnlyType(flag byte) bool { - switch flag { - case TypeLink, TypeSymlink, TypeChar, TypeBlock, TypeDir, TypeFifo: - return true - default: - return false - } -} diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/example_test.go b/vendor/github.com/Microsoft/go-winio/archive/tar/example_test.go deleted file mode 100644 index 5f0ce2f40..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/example_test.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tar_test - -import ( - "archive/tar" - "bytes" - "fmt" - "io" - "log" - "os" -) - -func Example() { - // Create a buffer to write our archive to. - buf := new(bytes.Buffer) - - // Create a new tar archive. - tw := tar.NewWriter(buf) - - // Add some files to the archive. - var files = []struct { - Name, Body string - }{ - {"readme.txt", "This archive contains some text files."}, - {"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"}, - {"todo.txt", "Get animal handling license."}, - } - for _, file := range files { - hdr := &tar.Header{ - Name: file.Name, - Mode: 0600, - Size: int64(len(file.Body)), - } - if err := tw.WriteHeader(hdr); err != nil { - log.Fatalln(err) - } - if _, err := tw.Write([]byte(file.Body)); err != nil { - log.Fatalln(err) - } - } - // Make sure to check the error on Close. - if err := tw.Close(); err != nil { - log.Fatalln(err) - } - - // Open the tar archive for reading. - r := bytes.NewReader(buf.Bytes()) - tr := tar.NewReader(r) - - // Iterate through the files in the archive. - for { - hdr, err := tr.Next() - if err == io.EOF { - // end of tar archive - break - } - if err != nil { - log.Fatalln(err) - } - fmt.Printf("Contents of %s:\n", hdr.Name) - if _, err := io.Copy(os.Stdout, tr); err != nil { - log.Fatalln(err) - } - fmt.Println() - } - - // Output: - // Contents of readme.txt: - // This archive contains some text files. - // Contents of gopher.txt: - // Gopher names: - // George - // Geoffrey - // Gonzo - // Contents of todo.txt: - // Get animal handling license. -} diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/reader.go b/vendor/github.com/Microsoft/go-winio/archive/tar/reader.go deleted file mode 100644 index e210c618a..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/reader.go +++ /dev/null @@ -1,1002 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tar - -// TODO(dsymonds): -// - pax extensions - -import ( - "bytes" - "errors" - "io" - "io/ioutil" - "math" - "os" - "strconv" - "strings" - "time" -) - -var ( - ErrHeader = errors.New("archive/tar: invalid tar header") -) - -const maxNanoSecondIntSize = 9 - -// A Reader provides sequential access to the contents of a tar archive. -// A tar archive consists of a sequence of files. -// The Next method advances to the next file in the archive (including the first), -// and then it can be treated as an io.Reader to access the file's data. -type Reader struct { - r io.Reader - err error - pad int64 // amount of padding (ignored) after current file entry - curr numBytesReader // reader for current file entry - hdrBuff [blockSize]byte // buffer to use in readHeader -} - -type parser struct { - err error // Last error seen -} - -// A numBytesReader is an io.Reader with a numBytes method, returning the number -// of bytes remaining in the underlying encoded data. -type numBytesReader interface { - io.Reader - numBytes() int64 -} - -// A regFileReader is a numBytesReader for reading file data from a tar archive. -type regFileReader struct { - r io.Reader // underlying reader - nb int64 // number of unread bytes for current file entry -} - -// A sparseFileReader is a numBytesReader for reading sparse file data from a -// tar archive. -type sparseFileReader struct { - rfr numBytesReader // Reads the sparse-encoded file data - sp []sparseEntry // The sparse map for the file - pos int64 // Keeps track of file position - total int64 // Total size of the file -} - -// A sparseEntry holds a single entry in a sparse file's sparse map. -// -// Sparse files are represented using a series of sparseEntrys. -// Despite the name, a sparseEntry represents an actual data fragment that -// references data found in the underlying archive stream. All regions not -// covered by a sparseEntry are logically filled with zeros. -// -// For example, if the underlying raw file contains the 10-byte data: -// var compactData = "abcdefgh" -// -// And the sparse map has the following entries: -// var sp = []sparseEntry{ -// {offset: 2, numBytes: 5} // Data fragment for [2..7] -// {offset: 18, numBytes: 3} // Data fragment for [18..21] -// } -// -// Then the content of the resulting sparse file with a "real" size of 25 is: -// var sparseData = "\x00"*2 + "abcde" + "\x00"*11 + "fgh" + "\x00"*4 -type sparseEntry struct { - offset int64 // Starting position of the fragment - numBytes int64 // Length of the fragment -} - -// Keywords for GNU sparse files in a PAX extended header -const ( - paxGNUSparseNumBlocks = "GNU.sparse.numblocks" - paxGNUSparseOffset = "GNU.sparse.offset" - paxGNUSparseNumBytes = "GNU.sparse.numbytes" - paxGNUSparseMap = "GNU.sparse.map" - paxGNUSparseName = "GNU.sparse.name" - paxGNUSparseMajor = "GNU.sparse.major" - paxGNUSparseMinor = "GNU.sparse.minor" - paxGNUSparseSize = "GNU.sparse.size" - paxGNUSparseRealSize = "GNU.sparse.realsize" -) - -// Keywords for old GNU sparse headers -const ( - oldGNUSparseMainHeaderOffset = 386 - oldGNUSparseMainHeaderIsExtendedOffset = 482 - oldGNUSparseMainHeaderNumEntries = 4 - oldGNUSparseExtendedHeaderIsExtendedOffset = 504 - oldGNUSparseExtendedHeaderNumEntries = 21 - oldGNUSparseOffsetSize = 12 - oldGNUSparseNumBytesSize = 12 -) - -// NewReader creates a new Reader reading from r. -func NewReader(r io.Reader) *Reader { return &Reader{r: r} } - -// Next advances to the next entry in the tar archive. -// -// io.EOF is returned at the end of the input. -func (tr *Reader) Next() (*Header, error) { - if tr.err != nil { - return nil, tr.err - } - - var hdr *Header - var extHdrs map[string]string - - // Externally, Next iterates through the tar archive as if it is a series of - // files. Internally, the tar format often uses fake "files" to add meta - // data that describes the next file. These meta data "files" should not - // normally be visible to the outside. As such, this loop iterates through - // one or more "header files" until it finds a "normal file". -loop: - for { - tr.err = tr.skipUnread() - if tr.err != nil { - return nil, tr.err - } - - hdr = tr.readHeader() - if tr.err != nil { - return nil, tr.err - } - - // Check for PAX/GNU special headers and files. - switch hdr.Typeflag { - case TypeXHeader: - extHdrs, tr.err = parsePAX(tr) - if tr.err != nil { - return nil, tr.err - } - continue loop // This is a meta header affecting the next header - case TypeGNULongName, TypeGNULongLink: - var realname []byte - realname, tr.err = ioutil.ReadAll(tr) - if tr.err != nil { - return nil, tr.err - } - - // Convert GNU extensions to use PAX headers. - if extHdrs == nil { - extHdrs = make(map[string]string) - } - var p parser - switch hdr.Typeflag { - case TypeGNULongName: - extHdrs[paxPath] = p.parseString(realname) - case TypeGNULongLink: - extHdrs[paxLinkpath] = p.parseString(realname) - } - if p.err != nil { - tr.err = p.err - return nil, tr.err - } - continue loop // This is a meta header affecting the next header - default: - mergePAX(hdr, extHdrs) - - // Check for a PAX format sparse file - sp, err := tr.checkForGNUSparsePAXHeaders(hdr, extHdrs) - if err != nil { - tr.err = err - return nil, err - } - if sp != nil { - // Current file is a PAX format GNU sparse file. - // Set the current file reader to a sparse file reader. - tr.curr, tr.err = newSparseFileReader(tr.curr, sp, hdr.Size) - if tr.err != nil { - return nil, tr.err - } - } - break loop // This is a file, so stop - } - } - return hdr, nil -} - -// checkForGNUSparsePAXHeaders checks the PAX headers for GNU sparse headers. If they are found, then -// this function reads the sparse map and returns it. Unknown sparse formats are ignored, causing the file to -// be treated as a regular file. -func (tr *Reader) checkForGNUSparsePAXHeaders(hdr *Header, headers map[string]string) ([]sparseEntry, error) { - var sparseFormat string - - // Check for sparse format indicators - major, majorOk := headers[paxGNUSparseMajor] - minor, minorOk := headers[paxGNUSparseMinor] - sparseName, sparseNameOk := headers[paxGNUSparseName] - _, sparseMapOk := headers[paxGNUSparseMap] - sparseSize, sparseSizeOk := headers[paxGNUSparseSize] - sparseRealSize, sparseRealSizeOk := headers[paxGNUSparseRealSize] - - // Identify which, if any, sparse format applies from which PAX headers are set - if majorOk && minorOk { - sparseFormat = major + "." + minor - } else if sparseNameOk && sparseMapOk { - sparseFormat = "0.1" - } else if sparseSizeOk { - sparseFormat = "0.0" - } else { - // Not a PAX format GNU sparse file. - return nil, nil - } - - // Check for unknown sparse format - if sparseFormat != "0.0" && sparseFormat != "0.1" && sparseFormat != "1.0" { - return nil, nil - } - - // Update hdr from GNU sparse PAX headers - if sparseNameOk { - hdr.Name = sparseName - } - if sparseSizeOk { - realSize, err := strconv.ParseInt(sparseSize, 10, 0) - if err != nil { - return nil, ErrHeader - } - hdr.Size = realSize - } else if sparseRealSizeOk { - realSize, err := strconv.ParseInt(sparseRealSize, 10, 0) - if err != nil { - return nil, ErrHeader - } - hdr.Size = realSize - } - - // Set up the sparse map, according to the particular sparse format in use - var sp []sparseEntry - var err error - switch sparseFormat { - case "0.0", "0.1": - sp, err = readGNUSparseMap0x1(headers) - case "1.0": - sp, err = readGNUSparseMap1x0(tr.curr) - } - return sp, err -} - -// mergePAX merges well known headers according to PAX standard. -// In general headers with the same name as those found -// in the header struct overwrite those found in the header -// struct with higher precision or longer values. Esp. useful -// for name and linkname fields. -func mergePAX(hdr *Header, headers map[string]string) error { - for k, v := range headers { - switch k { - case paxPath: - hdr.Name = v - case paxLinkpath: - hdr.Linkname = v - case paxGname: - hdr.Gname = v - case paxUname: - hdr.Uname = v - case paxUid: - uid, err := strconv.ParseInt(v, 10, 0) - if err != nil { - return err - } - hdr.Uid = int(uid) - case paxGid: - gid, err := strconv.ParseInt(v, 10, 0) - if err != nil { - return err - } - hdr.Gid = int(gid) - case paxAtime: - t, err := parsePAXTime(v) - if err != nil { - return err - } - hdr.AccessTime = t - case paxMtime: - t, err := parsePAXTime(v) - if err != nil { - return err - } - hdr.ModTime = t - case paxCtime: - t, err := parsePAXTime(v) - if err != nil { - return err - } - hdr.ChangeTime = t - case paxCreationTime: - t, err := parsePAXTime(v) - if err != nil { - return err - } - hdr.CreationTime = t - case paxSize: - size, err := strconv.ParseInt(v, 10, 0) - if err != nil { - return err - } - hdr.Size = int64(size) - default: - if strings.HasPrefix(k, paxXattr) { - if hdr.Xattrs == nil { - hdr.Xattrs = make(map[string]string) - } - hdr.Xattrs[k[len(paxXattr):]] = v - } else if strings.HasPrefix(k, paxWindows) { - if hdr.Winheaders == nil { - hdr.Winheaders = make(map[string]string) - } - hdr.Winheaders[k[len(paxWindows):]] = v - } - } - } - return nil -} - -// parsePAXTime takes a string of the form %d.%d as described in -// the PAX specification. -func parsePAXTime(t string) (time.Time, error) { - buf := []byte(t) - pos := bytes.IndexByte(buf, '.') - var seconds, nanoseconds int64 - var err error - if pos == -1 { - seconds, err = strconv.ParseInt(t, 10, 0) - if err != nil { - return time.Time{}, err - } - } else { - seconds, err = strconv.ParseInt(string(buf[:pos]), 10, 0) - if err != nil { - return time.Time{}, err - } - nano_buf := string(buf[pos+1:]) - // Pad as needed before converting to a decimal. - // For example .030 -> .030000000 -> 30000000 nanoseconds - if len(nano_buf) < maxNanoSecondIntSize { - // Right pad - nano_buf += strings.Repeat("0", maxNanoSecondIntSize-len(nano_buf)) - } else if len(nano_buf) > maxNanoSecondIntSize { - // Right truncate - nano_buf = nano_buf[:maxNanoSecondIntSize] - } - nanoseconds, err = strconv.ParseInt(string(nano_buf), 10, 0) - if err != nil { - return time.Time{}, err - } - } - ts := time.Unix(seconds, nanoseconds) - return ts, nil -} - -// parsePAX parses PAX headers. -// If an extended header (type 'x') is invalid, ErrHeader is returned -func parsePAX(r io.Reader) (map[string]string, error) { - buf, err := ioutil.ReadAll(r) - if err != nil { - return nil, err - } - sbuf := string(buf) - - // For GNU PAX sparse format 0.0 support. - // This function transforms the sparse format 0.0 headers into sparse format 0.1 headers. - var sparseMap bytes.Buffer - - headers := make(map[string]string) - // Each record is constructed as - // "%d %s=%s\n", length, keyword, value - for len(sbuf) > 0 { - key, value, residual, err := parsePAXRecord(sbuf) - if err != nil { - return nil, ErrHeader - } - sbuf = residual - - keyStr := string(key) - if keyStr == paxGNUSparseOffset || keyStr == paxGNUSparseNumBytes { - // GNU sparse format 0.0 special key. Write to sparseMap instead of using the headers map. - sparseMap.WriteString(value) - sparseMap.Write([]byte{','}) - } else { - // Normal key. Set the value in the headers map. - headers[keyStr] = string(value) - } - } - if sparseMap.Len() != 0 { - // Add sparse info to headers, chopping off the extra comma - sparseMap.Truncate(sparseMap.Len() - 1) - headers[paxGNUSparseMap] = sparseMap.String() - } - return headers, nil -} - -// parsePAXRecord parses the input PAX record string into a key-value pair. -// If parsing is successful, it will slice off the currently read record and -// return the remainder as r. -// -// A PAX record is of the following form: -// "%d %s=%s\n" % (size, key, value) -func parsePAXRecord(s string) (k, v, r string, err error) { - // The size field ends at the first space. - sp := strings.IndexByte(s, ' ') - if sp == -1 { - return "", "", s, ErrHeader - } - - // Parse the first token as a decimal integer. - n, perr := strconv.ParseInt(s[:sp], 10, 0) // Intentionally parse as native int - if perr != nil || n < 5 || int64(len(s)) < n { - return "", "", s, ErrHeader - } - - // Extract everything between the space and the final newline. - rec, nl, rem := s[sp+1:n-1], s[n-1:n], s[n:] - if nl != "\n" { - return "", "", s, ErrHeader - } - - // The first equals separates the key from the value. - eq := strings.IndexByte(rec, '=') - if eq == -1 { - return "", "", s, ErrHeader - } - return rec[:eq], rec[eq+1:], rem, nil -} - -// parseString parses bytes as a NUL-terminated C-style string. -// If a NUL byte is not found then the whole slice is returned as a string. -func (*parser) parseString(b []byte) string { - n := 0 - for n < len(b) && b[n] != 0 { - n++ - } - return string(b[0:n]) -} - -// parseNumeric parses the input as being encoded in either base-256 or octal. -// This function may return negative numbers. -// If parsing fails or an integer overflow occurs, err will be set. -func (p *parser) parseNumeric(b []byte) int64 { - // Check for base-256 (binary) format first. - // If the first bit is set, then all following bits constitute a two's - // complement encoded number in big-endian byte order. - if len(b) > 0 && b[0]&0x80 != 0 { - // Handling negative numbers relies on the following identity: - // -a-1 == ^a - // - // If the number is negative, we use an inversion mask to invert the - // data bytes and treat the value as an unsigned number. - var inv byte // 0x00 if positive or zero, 0xff if negative - if b[0]&0x40 != 0 { - inv = 0xff - } - - var x uint64 - for i, c := range b { - c ^= inv // Inverts c only if inv is 0xff, otherwise does nothing - if i == 0 { - c &= 0x7f // Ignore signal bit in first byte - } - if (x >> 56) > 0 { - p.err = ErrHeader // Integer overflow - return 0 - } - x = x<<8 | uint64(c) - } - if (x >> 63) > 0 { - p.err = ErrHeader // Integer overflow - return 0 - } - if inv == 0xff { - return ^int64(x) - } - return int64(x) - } - - // Normal case is base-8 (octal) format. - return p.parseOctal(b) -} - -func (p *parser) parseOctal(b []byte) int64 { - // Because unused fields are filled with NULs, we need - // to skip leading NULs. Fields may also be padded with - // spaces or NULs. - // So we remove leading and trailing NULs and spaces to - // be sure. - b = bytes.Trim(b, " \x00") - - if len(b) == 0 { - return 0 - } - x, perr := strconv.ParseUint(p.parseString(b), 8, 64) - if perr != nil { - p.err = ErrHeader - } - return int64(x) -} - -// skipUnread skips any unread bytes in the existing file entry, as well as any -// alignment padding. It returns io.ErrUnexpectedEOF if any io.EOF is -// encountered in the data portion; it is okay to hit io.EOF in the padding. -// -// Note that this function still works properly even when sparse files are being -// used since numBytes returns the bytes remaining in the underlying io.Reader. -func (tr *Reader) skipUnread() error { - dataSkip := tr.numBytes() // Number of data bytes to skip - totalSkip := dataSkip + tr.pad // Total number of bytes to skip - tr.curr, tr.pad = nil, 0 - - // If possible, Seek to the last byte before the end of the data section. - // Do this because Seek is often lazy about reporting errors; this will mask - // the fact that the tar stream may be truncated. We can rely on the - // io.CopyN done shortly afterwards to trigger any IO errors. - var seekSkipped int64 // Number of bytes skipped via Seek - if sr, ok := tr.r.(io.Seeker); ok && dataSkip > 1 { - // Not all io.Seeker can actually Seek. For example, os.Stdin implements - // io.Seeker, but calling Seek always returns an error and performs - // no action. Thus, we try an innocent seek to the current position - // to see if Seek is really supported. - pos1, err := sr.Seek(0, os.SEEK_CUR) - if err == nil { - // Seek seems supported, so perform the real Seek. - pos2, err := sr.Seek(dataSkip-1, os.SEEK_CUR) - if err != nil { - tr.err = err - return tr.err - } - seekSkipped = pos2 - pos1 - } - } - - var copySkipped int64 // Number of bytes skipped via CopyN - copySkipped, tr.err = io.CopyN(ioutil.Discard, tr.r, totalSkip-seekSkipped) - if tr.err == io.EOF && seekSkipped+copySkipped < dataSkip { - tr.err = io.ErrUnexpectedEOF - } - return tr.err -} - -func (tr *Reader) verifyChecksum(header []byte) bool { - if tr.err != nil { - return false - } - - var p parser - given := p.parseOctal(header[148:156]) - unsigned, signed := checksum(header) - return p.err == nil && (given == unsigned || given == signed) -} - -// readHeader reads the next block header and assumes that the underlying reader -// is already aligned to a block boundary. -// -// The err will be set to io.EOF only when one of the following occurs: -// * Exactly 0 bytes are read and EOF is hit. -// * Exactly 1 block of zeros is read and EOF is hit. -// * At least 2 blocks of zeros are read. -func (tr *Reader) readHeader() *Header { - header := tr.hdrBuff[:] - copy(header, zeroBlock) - - if _, tr.err = io.ReadFull(tr.r, header); tr.err != nil { - return nil // io.EOF is okay here - } - - // Two blocks of zero bytes marks the end of the archive. - if bytes.Equal(header, zeroBlock[0:blockSize]) { - if _, tr.err = io.ReadFull(tr.r, header); tr.err != nil { - return nil // io.EOF is okay here - } - if bytes.Equal(header, zeroBlock[0:blockSize]) { - tr.err = io.EOF - } else { - tr.err = ErrHeader // zero block and then non-zero block - } - return nil - } - - if !tr.verifyChecksum(header) { - tr.err = ErrHeader - return nil - } - - // Unpack - var p parser - hdr := new(Header) - s := slicer(header) - - hdr.Name = p.parseString(s.next(100)) - hdr.Mode = p.parseNumeric(s.next(8)) - hdr.Uid = int(p.parseNumeric(s.next(8))) - hdr.Gid = int(p.parseNumeric(s.next(8))) - hdr.Size = p.parseNumeric(s.next(12)) - hdr.ModTime = time.Unix(p.parseNumeric(s.next(12)), 0) - s.next(8) // chksum - hdr.Typeflag = s.next(1)[0] - hdr.Linkname = p.parseString(s.next(100)) - - // The remainder of the header depends on the value of magic. - // The original (v7) version of tar had no explicit magic field, - // so its magic bytes, like the rest of the block, are NULs. - magic := string(s.next(8)) // contains version field as well. - var format string - switch { - case magic[:6] == "ustar\x00": // POSIX tar (1003.1-1988) - if string(header[508:512]) == "tar\x00" { - format = "star" - } else { - format = "posix" - } - case magic == "ustar \x00": // old GNU tar - format = "gnu" - } - - switch format { - case "posix", "gnu", "star": - hdr.Uname = p.parseString(s.next(32)) - hdr.Gname = p.parseString(s.next(32)) - devmajor := s.next(8) - devminor := s.next(8) - if hdr.Typeflag == TypeChar || hdr.Typeflag == TypeBlock { - hdr.Devmajor = p.parseNumeric(devmajor) - hdr.Devminor = p.parseNumeric(devminor) - } - var prefix string - switch format { - case "posix", "gnu": - prefix = p.parseString(s.next(155)) - case "star": - prefix = p.parseString(s.next(131)) - hdr.AccessTime = time.Unix(p.parseNumeric(s.next(12)), 0) - hdr.ChangeTime = time.Unix(p.parseNumeric(s.next(12)), 0) - } - if len(prefix) > 0 { - hdr.Name = prefix + "/" + hdr.Name - } - } - - if p.err != nil { - tr.err = p.err - return nil - } - - nb := hdr.Size - if isHeaderOnlyType(hdr.Typeflag) { - nb = 0 - } - if nb < 0 { - tr.err = ErrHeader - return nil - } - - // Set the current file reader. - tr.pad = -nb & (blockSize - 1) // blockSize is a power of two - tr.curr = ®FileReader{r: tr.r, nb: nb} - - // Check for old GNU sparse format entry. - if hdr.Typeflag == TypeGNUSparse { - // Get the real size of the file. - hdr.Size = p.parseNumeric(header[483:495]) - if p.err != nil { - tr.err = p.err - return nil - } - - // Read the sparse map. - sp := tr.readOldGNUSparseMap(header) - if tr.err != nil { - return nil - } - - // Current file is a GNU sparse file. Update the current file reader. - tr.curr, tr.err = newSparseFileReader(tr.curr, sp, hdr.Size) - if tr.err != nil { - return nil - } - } - - return hdr -} - -// readOldGNUSparseMap reads the sparse map as stored in the old GNU sparse format. -// The sparse map is stored in the tar header if it's small enough. If it's larger than four entries, -// then one or more extension headers are used to store the rest of the sparse map. -func (tr *Reader) readOldGNUSparseMap(header []byte) []sparseEntry { - var p parser - isExtended := header[oldGNUSparseMainHeaderIsExtendedOffset] != 0 - spCap := oldGNUSparseMainHeaderNumEntries - if isExtended { - spCap += oldGNUSparseExtendedHeaderNumEntries - } - sp := make([]sparseEntry, 0, spCap) - s := slicer(header[oldGNUSparseMainHeaderOffset:]) - - // Read the four entries from the main tar header - for i := 0; i < oldGNUSparseMainHeaderNumEntries; i++ { - offset := p.parseNumeric(s.next(oldGNUSparseOffsetSize)) - numBytes := p.parseNumeric(s.next(oldGNUSparseNumBytesSize)) - if p.err != nil { - tr.err = p.err - return nil - } - if offset == 0 && numBytes == 0 { - break - } - sp = append(sp, sparseEntry{offset: offset, numBytes: numBytes}) - } - - for isExtended { - // There are more entries. Read an extension header and parse its entries. - sparseHeader := make([]byte, blockSize) - if _, tr.err = io.ReadFull(tr.r, sparseHeader); tr.err != nil { - return nil - } - isExtended = sparseHeader[oldGNUSparseExtendedHeaderIsExtendedOffset] != 0 - s = slicer(sparseHeader) - for i := 0; i < oldGNUSparseExtendedHeaderNumEntries; i++ { - offset := p.parseNumeric(s.next(oldGNUSparseOffsetSize)) - numBytes := p.parseNumeric(s.next(oldGNUSparseNumBytesSize)) - if p.err != nil { - tr.err = p.err - return nil - } - if offset == 0 && numBytes == 0 { - break - } - sp = append(sp, sparseEntry{offset: offset, numBytes: numBytes}) - } - } - return sp -} - -// readGNUSparseMap1x0 reads the sparse map as stored in GNU's PAX sparse format -// version 1.0. The format of the sparse map consists of a series of -// newline-terminated numeric fields. The first field is the number of entries -// and is always present. Following this are the entries, consisting of two -// fields (offset, numBytes). This function must stop reading at the end -// boundary of the block containing the last newline. -// -// Note that the GNU manual says that numeric values should be encoded in octal -// format. However, the GNU tar utility itself outputs these values in decimal. -// As such, this library treats values as being encoded in decimal. -func readGNUSparseMap1x0(r io.Reader) ([]sparseEntry, error) { - var cntNewline int64 - var buf bytes.Buffer - var blk = make([]byte, blockSize) - - // feedTokens copies data in numBlock chunks from r into buf until there are - // at least cnt newlines in buf. It will not read more blocks than needed. - var feedTokens = func(cnt int64) error { - for cntNewline < cnt { - if _, err := io.ReadFull(r, blk); err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - return err - } - buf.Write(blk) - for _, c := range blk { - if c == '\n' { - cntNewline++ - } - } - } - return nil - } - - // nextToken gets the next token delimited by a newline. This assumes that - // at least one newline exists in the buffer. - var nextToken = func() string { - cntNewline-- - tok, _ := buf.ReadString('\n') - return tok[:len(tok)-1] // Cut off newline - } - - // Parse for the number of entries. - // Use integer overflow resistant math to check this. - if err := feedTokens(1); err != nil { - return nil, err - } - numEntries, err := strconv.ParseInt(nextToken(), 10, 0) // Intentionally parse as native int - if err != nil || numEntries < 0 || int(2*numEntries) < int(numEntries) { - return nil, ErrHeader - } - - // Parse for all member entries. - // numEntries is trusted after this since a potential attacker must have - // committed resources proportional to what this library used. - if err := feedTokens(2 * numEntries); err != nil { - return nil, err - } - sp := make([]sparseEntry, 0, numEntries) - for i := int64(0); i < numEntries; i++ { - offset, err := strconv.ParseInt(nextToken(), 10, 64) - if err != nil { - return nil, ErrHeader - } - numBytes, err := strconv.ParseInt(nextToken(), 10, 64) - if err != nil { - return nil, ErrHeader - } - sp = append(sp, sparseEntry{offset: offset, numBytes: numBytes}) - } - return sp, nil -} - -// readGNUSparseMap0x1 reads the sparse map as stored in GNU's PAX sparse format -// version 0.1. The sparse map is stored in the PAX headers. -func readGNUSparseMap0x1(extHdrs map[string]string) ([]sparseEntry, error) { - // Get number of entries. - // Use integer overflow resistant math to check this. - numEntriesStr := extHdrs[paxGNUSparseNumBlocks] - numEntries, err := strconv.ParseInt(numEntriesStr, 10, 0) // Intentionally parse as native int - if err != nil || numEntries < 0 || int(2*numEntries) < int(numEntries) { - return nil, ErrHeader - } - - // There should be two numbers in sparseMap for each entry. - sparseMap := strings.Split(extHdrs[paxGNUSparseMap], ",") - if int64(len(sparseMap)) != 2*numEntries { - return nil, ErrHeader - } - - // Loop through the entries in the sparse map. - // numEntries is trusted now. - sp := make([]sparseEntry, 0, numEntries) - for i := int64(0); i < numEntries; i++ { - offset, err := strconv.ParseInt(sparseMap[2*i], 10, 64) - if err != nil { - return nil, ErrHeader - } - numBytes, err := strconv.ParseInt(sparseMap[2*i+1], 10, 64) - if err != nil { - return nil, ErrHeader - } - sp = append(sp, sparseEntry{offset: offset, numBytes: numBytes}) - } - return sp, nil -} - -// numBytes returns the number of bytes left to read in the current file's entry -// in the tar archive, or 0 if there is no current file. -func (tr *Reader) numBytes() int64 { - if tr.curr == nil { - // No current file, so no bytes - return 0 - } - return tr.curr.numBytes() -} - -// Read reads from the current entry in the tar archive. -// It returns 0, io.EOF when it reaches the end of that entry, -// until Next is called to advance to the next entry. -// -// Calling Read on special types like TypeLink, TypeSymLink, TypeChar, -// TypeBlock, TypeDir, and TypeFifo returns 0, io.EOF regardless of what -// the Header.Size claims. -func (tr *Reader) Read(b []byte) (n int, err error) { - if tr.err != nil { - return 0, tr.err - } - if tr.curr == nil { - return 0, io.EOF - } - - n, err = tr.curr.Read(b) - if err != nil && err != io.EOF { - tr.err = err - } - return -} - -func (rfr *regFileReader) Read(b []byte) (n int, err error) { - if rfr.nb == 0 { - // file consumed - return 0, io.EOF - } - if int64(len(b)) > rfr.nb { - b = b[0:rfr.nb] - } - n, err = rfr.r.Read(b) - rfr.nb -= int64(n) - - if err == io.EOF && rfr.nb > 0 { - err = io.ErrUnexpectedEOF - } - return -} - -// numBytes returns the number of bytes left to read in the file's data in the tar archive. -func (rfr *regFileReader) numBytes() int64 { - return rfr.nb -} - -// newSparseFileReader creates a new sparseFileReader, but validates all of the -// sparse entries before doing so. -func newSparseFileReader(rfr numBytesReader, sp []sparseEntry, total int64) (*sparseFileReader, error) { - if total < 0 { - return nil, ErrHeader // Total size cannot be negative - } - - // Validate all sparse entries. These are the same checks as performed by - // the BSD tar utility. - for i, s := range sp { - switch { - case s.offset < 0 || s.numBytes < 0: - return nil, ErrHeader // Negative values are never okay - case s.offset > math.MaxInt64-s.numBytes: - return nil, ErrHeader // Integer overflow with large length - case s.offset+s.numBytes > total: - return nil, ErrHeader // Region extends beyond the "real" size - case i > 0 && sp[i-1].offset+sp[i-1].numBytes > s.offset: - return nil, ErrHeader // Regions can't overlap and must be in order - } - } - return &sparseFileReader{rfr: rfr, sp: sp, total: total}, nil -} - -// readHole reads a sparse hole ending at endOffset. -func (sfr *sparseFileReader) readHole(b []byte, endOffset int64) int { - n64 := endOffset - sfr.pos - if n64 > int64(len(b)) { - n64 = int64(len(b)) - } - n := int(n64) - for i := 0; i < n; i++ { - b[i] = 0 - } - sfr.pos += n64 - return n -} - -// Read reads the sparse file data in expanded form. -func (sfr *sparseFileReader) Read(b []byte) (n int, err error) { - // Skip past all empty fragments. - for len(sfr.sp) > 0 && sfr.sp[0].numBytes == 0 { - sfr.sp = sfr.sp[1:] - } - - // If there are no more fragments, then it is possible that there - // is one last sparse hole. - if len(sfr.sp) == 0 { - // This behavior matches the BSD tar utility. - // However, GNU tar stops returning data even if sfr.total is unmet. - if sfr.pos < sfr.total { - return sfr.readHole(b, sfr.total), nil - } - return 0, io.EOF - } - - // In front of a data fragment, so read a hole. - if sfr.pos < sfr.sp[0].offset { - return sfr.readHole(b, sfr.sp[0].offset), nil - } - - // In a data fragment, so read from it. - // This math is overflow free since we verify that offset and numBytes can - // be safely added when creating the sparseFileReader. - endPos := sfr.sp[0].offset + sfr.sp[0].numBytes // End offset of fragment - bytesLeft := endPos - sfr.pos // Bytes left in fragment - if int64(len(b)) > bytesLeft { - b = b[:bytesLeft] - } - - n, err = sfr.rfr.Read(b) - sfr.pos += int64(n) - if err == io.EOF { - if sfr.pos < endPos { - err = io.ErrUnexpectedEOF // There was supposed to be more data - } else if sfr.pos < sfr.total { - err = nil // There is still an implicit sparse hole at the end - } - } - - if sfr.pos == endPos { - sfr.sp = sfr.sp[1:] // We are done with this fragment, so pop it - } - return n, err -} - -// numBytes returns the number of bytes left to read in the sparse file's -// sparse-encoded data in the tar archive. -func (sfr *sparseFileReader) numBytes() int64 { - return sfr.rfr.numBytes() -} diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/reader_test.go b/vendor/github.com/Microsoft/go-winio/archive/tar/reader_test.go deleted file mode 100644 index 7b148b512..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/reader_test.go +++ /dev/null @@ -1,1125 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tar - -import ( - "bytes" - "crypto/md5" - "fmt" - "io" - "io/ioutil" - "math" - "os" - "reflect" - "strings" - "testing" - "time" -) - -type untarTest struct { - file string // Test input file - headers []*Header // Expected output headers - chksums []string // MD5 checksum of files, leave as nil if not checked - err error // Expected error to occur -} - -var gnuTarTest = &untarTest{ - file: "testdata/gnu.tar", - headers: []*Header{ - { - Name: "small.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 5, - ModTime: time.Unix(1244428340, 0), - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - { - Name: "small2.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 11, - ModTime: time.Unix(1244436044, 0), - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - }, - chksums: []string{ - "e38b27eaccb4391bdec553a7f3ae6b2f", - "c65bd2e50a56a2138bf1716f2fd56fe9", - }, -} - -var sparseTarTest = &untarTest{ - file: "testdata/sparse-formats.tar", - headers: []*Header{ - { - Name: "sparse-gnu", - Mode: 420, - Uid: 1000, - Gid: 1000, - Size: 200, - ModTime: time.Unix(1392395740, 0), - Typeflag: 0x53, - Linkname: "", - Uname: "david", - Gname: "david", - Devmajor: 0, - Devminor: 0, - }, - { - Name: "sparse-posix-0.0", - Mode: 420, - Uid: 1000, - Gid: 1000, - Size: 200, - ModTime: time.Unix(1392342187, 0), - Typeflag: 0x30, - Linkname: "", - Uname: "david", - Gname: "david", - Devmajor: 0, - Devminor: 0, - }, - { - Name: "sparse-posix-0.1", - Mode: 420, - Uid: 1000, - Gid: 1000, - Size: 200, - ModTime: time.Unix(1392340456, 0), - Typeflag: 0x30, - Linkname: "", - Uname: "david", - Gname: "david", - Devmajor: 0, - Devminor: 0, - }, - { - Name: "sparse-posix-1.0", - Mode: 420, - Uid: 1000, - Gid: 1000, - Size: 200, - ModTime: time.Unix(1392337404, 0), - Typeflag: 0x30, - Linkname: "", - Uname: "david", - Gname: "david", - Devmajor: 0, - Devminor: 0, - }, - { - Name: "end", - Mode: 420, - Uid: 1000, - Gid: 1000, - Size: 4, - ModTime: time.Unix(1392398319, 0), - Typeflag: 0x30, - Linkname: "", - Uname: "david", - Gname: "david", - Devmajor: 0, - Devminor: 0, - }, - }, - chksums: []string{ - "6f53234398c2449fe67c1812d993012f", - "6f53234398c2449fe67c1812d993012f", - "6f53234398c2449fe67c1812d993012f", - "6f53234398c2449fe67c1812d993012f", - "b0061974914468de549a2af8ced10316", - }, -} - -var untarTests = []*untarTest{ - gnuTarTest, - sparseTarTest, - { - file: "testdata/star.tar", - headers: []*Header{ - { - Name: "small.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 5, - ModTime: time.Unix(1244592783, 0), - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - AccessTime: time.Unix(1244592783, 0), - ChangeTime: time.Unix(1244592783, 0), - }, - { - Name: "small2.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 11, - ModTime: time.Unix(1244592783, 0), - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - AccessTime: time.Unix(1244592783, 0), - ChangeTime: time.Unix(1244592783, 0), - }, - }, - }, - { - file: "testdata/v7.tar", - headers: []*Header{ - { - Name: "small.txt", - Mode: 0444, - Uid: 73025, - Gid: 5000, - Size: 5, - ModTime: time.Unix(1244593104, 0), - Typeflag: '\x00', - }, - { - Name: "small2.txt", - Mode: 0444, - Uid: 73025, - Gid: 5000, - Size: 11, - ModTime: time.Unix(1244593104, 0), - Typeflag: '\x00', - }, - }, - }, - { - file: "testdata/pax.tar", - headers: []*Header{ - { - Name: "a/123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100", - Mode: 0664, - Uid: 1000, - Gid: 1000, - Uname: "shane", - Gname: "shane", - Size: 7, - ModTime: time.Unix(1350244992, 23960108), - ChangeTime: time.Unix(1350244992, 23960108), - AccessTime: time.Unix(1350244992, 23960108), - Typeflag: TypeReg, - }, - { - Name: "a/b", - Mode: 0777, - Uid: 1000, - Gid: 1000, - Uname: "shane", - Gname: "shane", - Size: 0, - ModTime: time.Unix(1350266320, 910238425), - ChangeTime: time.Unix(1350266320, 910238425), - AccessTime: time.Unix(1350266320, 910238425), - Typeflag: TypeSymlink, - Linkname: "123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100", - }, - }, - }, - { - file: "testdata/nil-uid.tar", // golang.org/issue/5290 - headers: []*Header{ - { - Name: "P1050238.JPG.log", - Mode: 0664, - Uid: 0, - Gid: 0, - Size: 14, - ModTime: time.Unix(1365454838, 0), - Typeflag: TypeReg, - Linkname: "", - Uname: "eyefi", - Gname: "eyefi", - Devmajor: 0, - Devminor: 0, - }, - }, - }, - { - file: "testdata/xattrs.tar", - headers: []*Header{ - { - Name: "small.txt", - Mode: 0644, - Uid: 1000, - Gid: 10, - Size: 5, - ModTime: time.Unix(1386065770, 448252320), - Typeflag: '0', - Uname: "alex", - Gname: "wheel", - AccessTime: time.Unix(1389782991, 419875220), - ChangeTime: time.Unix(1389782956, 794414986), - Xattrs: map[string]string{ - "user.key": "value", - "user.key2": "value2", - // Interestingly, selinux encodes the terminating null inside the xattr - "security.selinux": "unconfined_u:object_r:default_t:s0\x00", - }, - }, - { - Name: "small2.txt", - Mode: 0644, - Uid: 1000, - Gid: 10, - Size: 11, - ModTime: time.Unix(1386065770, 449252304), - Typeflag: '0', - Uname: "alex", - Gname: "wheel", - AccessTime: time.Unix(1389782991, 419875220), - ChangeTime: time.Unix(1386065770, 449252304), - Xattrs: map[string]string{ - "security.selinux": "unconfined_u:object_r:default_t:s0\x00", - }, - }, - }, - }, - { - // Matches the behavior of GNU, BSD, and STAR tar utilities. - file: "testdata/gnu-multi-hdrs.tar", - headers: []*Header{ - { - Name: "GNU2/GNU2/long-path-name", - Linkname: "GNU4/GNU4/long-linkpath-name", - ModTime: time.Unix(0, 0), - Typeflag: '2', - }, - }, - }, - { - // Matches the behavior of GNU and BSD tar utilities. - file: "testdata/pax-multi-hdrs.tar", - headers: []*Header{ - { - Name: "bar", - Linkname: "PAX4/PAX4/long-linkpath-name", - ModTime: time.Unix(0, 0), - Typeflag: '2', - }, - }, - }, - { - file: "testdata/neg-size.tar", - err: ErrHeader, - }, - { - file: "testdata/issue10968.tar", - err: ErrHeader, - }, - { - file: "testdata/issue11169.tar", - err: ErrHeader, - }, - { - file: "testdata/issue12435.tar", - err: ErrHeader, - }, -} - -func TestReader(t *testing.T) { - for i, v := range untarTests { - f, err := os.Open(v.file) - if err != nil { - t.Errorf("file %s, test %d: unexpected error: %v", v.file, i, err) - continue - } - defer f.Close() - - // Capture all headers and checksums. - var ( - tr = NewReader(f) - hdrs []*Header - chksums []string - rdbuf = make([]byte, 8) - ) - for { - var hdr *Header - hdr, err = tr.Next() - if err != nil { - if err == io.EOF { - err = nil // Expected error - } - break - } - hdrs = append(hdrs, hdr) - - if v.chksums == nil { - continue - } - h := md5.New() - _, err = io.CopyBuffer(h, tr, rdbuf) // Effectively an incremental read - if err != nil { - break - } - chksums = append(chksums, fmt.Sprintf("%x", h.Sum(nil))) - } - - for j, hdr := range hdrs { - if j >= len(v.headers) { - t.Errorf("file %s, test %d, entry %d: unexpected header:\ngot %+v", - v.file, i, j, *hdr) - continue - } - if !reflect.DeepEqual(*hdr, *v.headers[j]) { - t.Errorf("file %s, test %d, entry %d: incorrect header:\ngot %+v\nwant %+v", - v.file, i, j, *hdr, *v.headers[j]) - } - } - if len(hdrs) != len(v.headers) { - t.Errorf("file %s, test %d: got %d headers, want %d headers", - v.file, i, len(hdrs), len(v.headers)) - } - - for j, sum := range chksums { - if j >= len(v.chksums) { - t.Errorf("file %s, test %d, entry %d: unexpected sum: got %s", - v.file, i, j, sum) - continue - } - if sum != v.chksums[j] { - t.Errorf("file %s, test %d, entry %d: incorrect checksum: got %s, want %s", - v.file, i, j, sum, v.chksums[j]) - } - } - - if err != v.err { - t.Errorf("file %s, test %d: unexpected error: got %v, want %v", - v.file, i, err, v.err) - } - f.Close() - } -} - -func TestPartialRead(t *testing.T) { - f, err := os.Open("testdata/gnu.tar") - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer f.Close() - - tr := NewReader(f) - - // Read the first four bytes; Next() should skip the last byte. - hdr, err := tr.Next() - if err != nil || hdr == nil { - t.Fatalf("Didn't get first file: %v", err) - } - buf := make([]byte, 4) - if _, err := io.ReadFull(tr, buf); err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if expected := []byte("Kilt"); !bytes.Equal(buf, expected) { - t.Errorf("Contents = %v, want %v", buf, expected) - } - - // Second file - hdr, err = tr.Next() - if err != nil || hdr == nil { - t.Fatalf("Didn't get second file: %v", err) - } - buf = make([]byte, 6) - if _, err := io.ReadFull(tr, buf); err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if expected := []byte("Google"); !bytes.Equal(buf, expected) { - t.Errorf("Contents = %v, want %v", buf, expected) - } -} - -func TestParsePAXHeader(t *testing.T) { - paxTests := [][3]string{ - {"a", "a=name", "10 a=name\n"}, // Test case involving multiple acceptable lengths - {"a", "a=name", "9 a=name\n"}, // Test case involving multiple acceptable length - {"mtime", "mtime=1350244992.023960108", "30 mtime=1350244992.023960108\n"}} - for _, test := range paxTests { - key, expected, raw := test[0], test[1], test[2] - reader := bytes.NewReader([]byte(raw)) - headers, err := parsePAX(reader) - if err != nil { - t.Errorf("Couldn't parse correctly formatted headers: %v", err) - continue - } - if strings.EqualFold(headers[key], expected) { - t.Errorf("mtime header incorrectly parsed: got %s, wanted %s", headers[key], expected) - continue - } - trailer := make([]byte, 100) - n, err := reader.Read(trailer) - if err != io.EOF || n != 0 { - t.Error("Buffer wasn't consumed") - } - } - badHeaderTests := [][]byte{ - []byte("3 somelongkey=\n"), - []byte("50 tooshort=\n"), - } - for _, test := range badHeaderTests { - if _, err := parsePAX(bytes.NewReader(test)); err != ErrHeader { - t.Fatal("Unexpected success when parsing bad header") - } - } -} - -func TestParsePAXTime(t *testing.T) { - // Some valid PAX time values - timestamps := map[string]time.Time{ - "1350244992.023960108": time.Unix(1350244992, 23960108), // The common case - "1350244992.02396010": time.Unix(1350244992, 23960100), // Lower precision value - "1350244992.0239601089": time.Unix(1350244992, 23960108), // Higher precision value - "1350244992": time.Unix(1350244992, 0), // Low precision value - } - for input, expected := range timestamps { - ts, err := parsePAXTime(input) - if err != nil { - t.Fatal(err) - } - if !ts.Equal(expected) { - t.Fatalf("Time parsing failure %s %s", ts, expected) - } - } -} - -func TestMergePAX(t *testing.T) { - hdr := new(Header) - // Test a string, integer, and time based value. - headers := map[string]string{ - "path": "a/b/c", - "uid": "1000", - "mtime": "1350244992.023960108", - } - err := mergePAX(hdr, headers) - if err != nil { - t.Fatal(err) - } - want := &Header{ - Name: "a/b/c", - Uid: 1000, - ModTime: time.Unix(1350244992, 23960108), - } - if !reflect.DeepEqual(hdr, want) { - t.Errorf("incorrect merge: got %+v, want %+v", hdr, want) - } -} - -func TestSparseFileReader(t *testing.T) { - var vectors = []struct { - realSize int64 // Real size of the output file - sparseMap []sparseEntry // Input sparse map - sparseData string // Input compact data - expected string // Expected output data - err error // Expected error outcome - }{{ - realSize: 8, - sparseMap: []sparseEntry{ - {offset: 0, numBytes: 2}, - {offset: 5, numBytes: 3}, - }, - sparseData: "abcde", - expected: "ab\x00\x00\x00cde", - }, { - realSize: 10, - sparseMap: []sparseEntry{ - {offset: 0, numBytes: 2}, - {offset: 5, numBytes: 3}, - }, - sparseData: "abcde", - expected: "ab\x00\x00\x00cde\x00\x00", - }, { - realSize: 8, - sparseMap: []sparseEntry{ - {offset: 1, numBytes: 3}, - {offset: 6, numBytes: 2}, - }, - sparseData: "abcde", - expected: "\x00abc\x00\x00de", - }, { - realSize: 8, - sparseMap: []sparseEntry{ - {offset: 1, numBytes: 3}, - {offset: 6, numBytes: 0}, - {offset: 6, numBytes: 0}, - {offset: 6, numBytes: 2}, - }, - sparseData: "abcde", - expected: "\x00abc\x00\x00de", - }, { - realSize: 10, - sparseMap: []sparseEntry{ - {offset: 1, numBytes: 3}, - {offset: 6, numBytes: 2}, - }, - sparseData: "abcde", - expected: "\x00abc\x00\x00de\x00\x00", - }, { - realSize: 10, - sparseMap: []sparseEntry{ - {offset: 1, numBytes: 3}, - {offset: 6, numBytes: 2}, - {offset: 8, numBytes: 0}, - {offset: 8, numBytes: 0}, - {offset: 8, numBytes: 0}, - {offset: 8, numBytes: 0}, - }, - sparseData: "abcde", - expected: "\x00abc\x00\x00de\x00\x00", - }, { - realSize: 2, - sparseMap: []sparseEntry{}, - sparseData: "", - expected: "\x00\x00", - }, { - realSize: -2, - sparseMap: []sparseEntry{}, - err: ErrHeader, - }, { - realSize: -10, - sparseMap: []sparseEntry{ - {offset: 1, numBytes: 3}, - {offset: 6, numBytes: 2}, - }, - sparseData: "abcde", - err: ErrHeader, - }, { - realSize: 10, - sparseMap: []sparseEntry{ - {offset: 1, numBytes: 3}, - {offset: 6, numBytes: 5}, - }, - sparseData: "abcde", - err: ErrHeader, - }, { - realSize: 35, - sparseMap: []sparseEntry{ - {offset: 1, numBytes: 3}, - {offset: 6, numBytes: 5}, - }, - sparseData: "abcde", - err: io.ErrUnexpectedEOF, - }, { - realSize: 35, - sparseMap: []sparseEntry{ - {offset: 1, numBytes: 3}, - {offset: 6, numBytes: -5}, - }, - sparseData: "abcde", - err: ErrHeader, - }, { - realSize: 35, - sparseMap: []sparseEntry{ - {offset: math.MaxInt64, numBytes: 3}, - {offset: 6, numBytes: -5}, - }, - sparseData: "abcde", - err: ErrHeader, - }, { - realSize: 10, - sparseMap: []sparseEntry{ - {offset: 1, numBytes: 3}, - {offset: 2, numBytes: 2}, - }, - sparseData: "abcde", - err: ErrHeader, - }} - - for i, v := range vectors { - r := bytes.NewReader([]byte(v.sparseData)) - rfr := ®FileReader{r: r, nb: int64(len(v.sparseData))} - - var sfr *sparseFileReader - var err error - var buf []byte - - sfr, err = newSparseFileReader(rfr, v.sparseMap, v.realSize) - if err != nil { - goto fail - } - if sfr.numBytes() != int64(len(v.sparseData)) { - t.Errorf("test %d, numBytes() before reading: got %d, want %d", i, sfr.numBytes(), len(v.sparseData)) - } - buf, err = ioutil.ReadAll(sfr) - if err != nil { - goto fail - } - if string(buf) != v.expected { - t.Errorf("test %d, ReadAll(): got %q, want %q", i, string(buf), v.expected) - } - if sfr.numBytes() != 0 { - t.Errorf("test %d, numBytes() after reading: got %d, want %d", i, sfr.numBytes(), 0) - } - - fail: - if err != v.err { - t.Errorf("test %d, unexpected error: got %v, want %v", i, err, v.err) - } - } -} - -func TestReadGNUSparseMap0x1(t *testing.T) { - const ( - maxUint = ^uint(0) - maxInt = int(maxUint >> 1) - ) - var ( - big1 = fmt.Sprintf("%d", int64(maxInt)) - big2 = fmt.Sprintf("%d", (int64(maxInt)/2)+1) - big3 = fmt.Sprintf("%d", (int64(maxInt) / 3)) - ) - - var vectors = []struct { - extHdrs map[string]string // Input data - sparseMap []sparseEntry // Expected sparse entries to be outputted - err error // Expected errors that may be raised - }{{ - extHdrs: map[string]string{paxGNUSparseNumBlocks: "-4"}, - err: ErrHeader, - }, { - extHdrs: map[string]string{paxGNUSparseNumBlocks: "fee "}, - err: ErrHeader, - }, { - extHdrs: map[string]string{ - paxGNUSparseNumBlocks: big1, - paxGNUSparseMap: "0,5,10,5,20,5,30,5", - }, - err: ErrHeader, - }, { - extHdrs: map[string]string{ - paxGNUSparseNumBlocks: big2, - paxGNUSparseMap: "0,5,10,5,20,5,30,5", - }, - err: ErrHeader, - }, { - extHdrs: map[string]string{ - paxGNUSparseNumBlocks: big3, - paxGNUSparseMap: "0,5,10,5,20,5,30,5", - }, - err: ErrHeader, - }, { - extHdrs: map[string]string{ - paxGNUSparseNumBlocks: "4", - paxGNUSparseMap: "0.5,5,10,5,20,5,30,5", - }, - err: ErrHeader, - }, { - extHdrs: map[string]string{ - paxGNUSparseNumBlocks: "4", - paxGNUSparseMap: "0,5.5,10,5,20,5,30,5", - }, - err: ErrHeader, - }, { - extHdrs: map[string]string{ - paxGNUSparseNumBlocks: "4", - paxGNUSparseMap: "0,fewafewa.5,fewafw,5,20,5,30,5", - }, - err: ErrHeader, - }, { - extHdrs: map[string]string{ - paxGNUSparseNumBlocks: "4", - paxGNUSparseMap: "0,5,10,5,20,5,30,5", - }, - sparseMap: []sparseEntry{{0, 5}, {10, 5}, {20, 5}, {30, 5}}, - }} - - for i, v := range vectors { - sp, err := readGNUSparseMap0x1(v.extHdrs) - if !reflect.DeepEqual(sp, v.sparseMap) && !(len(sp) == 0 && len(v.sparseMap) == 0) { - t.Errorf("test %d, readGNUSparseMap0x1(...): got %v, want %v", i, sp, v.sparseMap) - } - if err != v.err { - t.Errorf("test %d, unexpected error: got %v, want %v", i, err, v.err) - } - } -} - -func TestReadGNUSparseMap1x0(t *testing.T) { - var sp = []sparseEntry{{1, 2}, {3, 4}} - for i := 0; i < 98; i++ { - sp = append(sp, sparseEntry{54321, 12345}) - } - - var vectors = []struct { - input string // Input data - sparseMap []sparseEntry // Expected sparse entries to be outputted - cnt int // Expected number of bytes read - err error // Expected errors that may be raised - }{{ - input: "", - cnt: 0, - err: io.ErrUnexpectedEOF, - }, { - input: "ab", - cnt: 2, - err: io.ErrUnexpectedEOF, - }, { - input: strings.Repeat("\x00", 512), - cnt: 512, - err: io.ErrUnexpectedEOF, - }, { - input: strings.Repeat("\x00", 511) + "\n", - cnt: 512, - err: ErrHeader, - }, { - input: strings.Repeat("\n", 512), - cnt: 512, - err: ErrHeader, - }, { - input: "0\n" + strings.Repeat("\x00", 510) + strings.Repeat("a", 512), - sparseMap: []sparseEntry{}, - cnt: 512, - }, { - input: strings.Repeat("0", 512) + "0\n" + strings.Repeat("\x00", 510), - sparseMap: []sparseEntry{}, - cnt: 1024, - }, { - input: strings.Repeat("0", 1024) + "1\n2\n3\n" + strings.Repeat("\x00", 506), - sparseMap: []sparseEntry{{2, 3}}, - cnt: 1536, - }, { - input: strings.Repeat("0", 1024) + "1\n2\n\n" + strings.Repeat("\x00", 509), - cnt: 1536, - err: ErrHeader, - }, { - input: strings.Repeat("0", 1024) + "1\n2\n" + strings.Repeat("\x00", 508), - cnt: 1536, - err: io.ErrUnexpectedEOF, - }, { - input: "-1\n2\n\n" + strings.Repeat("\x00", 506), - cnt: 512, - err: ErrHeader, - }, { - input: "1\nk\n2\n" + strings.Repeat("\x00", 506), - cnt: 512, - err: ErrHeader, - }, { - input: "100\n1\n2\n3\n4\n" + strings.Repeat("54321\n0000000000000012345\n", 98) + strings.Repeat("\x00", 512), - cnt: 2560, - sparseMap: sp, - }} - - for i, v := range vectors { - r := strings.NewReader(v.input) - sp, err := readGNUSparseMap1x0(r) - if !reflect.DeepEqual(sp, v.sparseMap) && !(len(sp) == 0 && len(v.sparseMap) == 0) { - t.Errorf("test %d, readGNUSparseMap1x0(...): got %v, want %v", i, sp, v.sparseMap) - } - if numBytes := len(v.input) - r.Len(); numBytes != v.cnt { - t.Errorf("test %d, bytes read: got %v, want %v", i, numBytes, v.cnt) - } - if err != v.err { - t.Errorf("test %d, unexpected error: got %v, want %v", i, err, v.err) - } - } -} - -func TestUninitializedRead(t *testing.T) { - test := gnuTarTest - f, err := os.Open(test.file) - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - defer f.Close() - - tr := NewReader(f) - _, err = tr.Read([]byte{}) - if err == nil || err != io.EOF { - t.Errorf("Unexpected error: %v, wanted %v", err, io.EOF) - } - -} - -type reader struct{ io.Reader } -type readSeeker struct{ io.ReadSeeker } -type readBadSeeker struct{ io.ReadSeeker } - -func (rbs *readBadSeeker) Seek(int64, int) (int64, error) { return 0, fmt.Errorf("illegal seek") } - -// TestReadTruncation test the ending condition on various truncated files and -// that truncated files are still detected even if the underlying io.Reader -// satisfies io.Seeker. -func TestReadTruncation(t *testing.T) { - var ss []string - for _, p := range []string{ - "testdata/gnu.tar", - "testdata/ustar-file-reg.tar", - "testdata/pax-path-hdr.tar", - "testdata/sparse-formats.tar", - } { - buf, err := ioutil.ReadFile(p) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - ss = append(ss, string(buf)) - } - - data1, data2, pax, sparse := ss[0], ss[1], ss[2], ss[3] - data2 += strings.Repeat("\x00", 10*512) - trash := strings.Repeat("garbage ", 64) // Exactly 512 bytes - - var vectors = []struct { - input string // Input stream - cnt int // Expected number of headers read - err error // Expected error outcome - }{ - {"", 0, io.EOF}, // Empty file is a "valid" tar file - {data1[:511], 0, io.ErrUnexpectedEOF}, - {data1[:512], 1, io.ErrUnexpectedEOF}, - {data1[:1024], 1, io.EOF}, - {data1[:1536], 2, io.ErrUnexpectedEOF}, - {data1[:2048], 2, io.EOF}, - {data1, 2, io.EOF}, - {data1[:2048] + data2[:1536], 3, io.EOF}, - {data2[:511], 0, io.ErrUnexpectedEOF}, - {data2[:512], 1, io.ErrUnexpectedEOF}, - {data2[:1195], 1, io.ErrUnexpectedEOF}, - {data2[:1196], 1, io.EOF}, // Exact end of data and start of padding - {data2[:1200], 1, io.EOF}, - {data2[:1535], 1, io.EOF}, - {data2[:1536], 1, io.EOF}, // Exact end of padding - {data2[:1536] + trash[:1], 1, io.ErrUnexpectedEOF}, - {data2[:1536] + trash[:511], 1, io.ErrUnexpectedEOF}, - {data2[:1536] + trash, 1, ErrHeader}, - {data2[:2048], 1, io.EOF}, // Exactly 1 empty block - {data2[:2048] + trash[:1], 1, io.ErrUnexpectedEOF}, - {data2[:2048] + trash[:511], 1, io.ErrUnexpectedEOF}, - {data2[:2048] + trash, 1, ErrHeader}, - {data2[:2560], 1, io.EOF}, // Exactly 2 empty blocks (normal end-of-stream) - {data2[:2560] + trash[:1], 1, io.EOF}, - {data2[:2560] + trash[:511], 1, io.EOF}, - {data2[:2560] + trash, 1, io.EOF}, - {data2[:3072], 1, io.EOF}, - {pax, 0, io.EOF}, // PAX header without data is a "valid" tar file - {pax + trash[:1], 0, io.ErrUnexpectedEOF}, - {pax + trash[:511], 0, io.ErrUnexpectedEOF}, - {sparse[:511], 0, io.ErrUnexpectedEOF}, - // TODO(dsnet): This should pass, but currently fails. - // {sparse[:512], 0, io.ErrUnexpectedEOF}, - {sparse[:3584], 1, io.EOF}, - {sparse[:9200], 1, io.EOF}, // Terminate in padding of sparse header - {sparse[:9216], 1, io.EOF}, - {sparse[:9728], 2, io.ErrUnexpectedEOF}, - {sparse[:10240], 2, io.EOF}, - {sparse[:11264], 2, io.ErrUnexpectedEOF}, - {sparse, 5, io.EOF}, - {sparse + trash, 5, io.EOF}, - } - - for i, v := range vectors { - for j := 0; j < 6; j++ { - var tr *Reader - var s1, s2 string - - switch j { - case 0: - tr = NewReader(&reader{strings.NewReader(v.input)}) - s1, s2 = "io.Reader", "auto" - case 1: - tr = NewReader(&reader{strings.NewReader(v.input)}) - s1, s2 = "io.Reader", "manual" - case 2: - tr = NewReader(&readSeeker{strings.NewReader(v.input)}) - s1, s2 = "io.ReadSeeker", "auto" - case 3: - tr = NewReader(&readSeeker{strings.NewReader(v.input)}) - s1, s2 = "io.ReadSeeker", "manual" - case 4: - tr = NewReader(&readBadSeeker{strings.NewReader(v.input)}) - s1, s2 = "ReadBadSeeker", "auto" - case 5: - tr = NewReader(&readBadSeeker{strings.NewReader(v.input)}) - s1, s2 = "ReadBadSeeker", "manual" - } - - var cnt int - var err error - for { - if _, err = tr.Next(); err != nil { - break - } - cnt++ - if s2 == "manual" { - if _, err = io.Copy(ioutil.Discard, tr); err != nil { - break - } - } - } - if err != v.err { - t.Errorf("test %d, NewReader(%s(...)) with %s discard: got %v, want %v", - i, s1, s2, err, v.err) - } - if cnt != v.cnt { - t.Errorf("test %d, NewReader(%s(...)) with %s discard: got %d headers, want %d headers", - i, s1, s2, cnt, v.cnt) - } - } - } -} - -// TestReadHeaderOnly tests that Reader does not attempt to read special -// header-only files. -func TestReadHeaderOnly(t *testing.T) { - f, err := os.Open("testdata/hdr-only.tar") - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - defer f.Close() - - var hdrs []*Header - tr := NewReader(f) - for { - hdr, err := tr.Next() - if err == io.EOF { - break - } - if err != nil { - t.Errorf("Next(): got %v, want %v", err, nil) - continue - } - hdrs = append(hdrs, hdr) - - // If a special flag, we should read nothing. - cnt, _ := io.ReadFull(tr, []byte{0}) - if cnt > 0 && hdr.Typeflag != TypeReg { - t.Errorf("ReadFull(...): got %d bytes, want 0 bytes", cnt) - } - } - - // File is crafted with 16 entries. The later 8 are identical to the first - // 8 except that the size is set. - if len(hdrs) != 16 { - t.Fatalf("len(hdrs): got %d, want %d", len(hdrs), 16) - } - for i := 0; i < 8; i++ { - var hdr1, hdr2 = hdrs[i+0], hdrs[i+8] - hdr1.Size, hdr2.Size = 0, 0 - if !reflect.DeepEqual(*hdr1, *hdr2) { - t.Errorf("incorrect header:\ngot %+v\nwant %+v", *hdr1, *hdr2) - } - } -} - -func TestParsePAXRecord(t *testing.T) { - var medName = strings.Repeat("CD", 50) - var longName = strings.Repeat("AB", 100) - - var vectors = []struct { - input string - residual string - outputKey string - outputVal string - ok bool - }{ - {"6 k=v\n\n", "\n", "k", "v", true}, - {"19 path=/etc/hosts\n", "", "path", "/etc/hosts", true}, - {"210 path=" + longName + "\nabc", "abc", "path", longName, true}, - {"110 path=" + medName + "\n", "", "path", medName, true}, - {"9 foo=ba\n", "", "foo", "ba", true}, - {"11 foo=bar\n\x00", "\x00", "foo", "bar", true}, - {"18 foo=b=\nar=\n==\x00\n", "", "foo", "b=\nar=\n==\x00", true}, - {"27 foo=hello9 foo=ba\nworld\n", "", "foo", "hello9 foo=ba\nworld", true}, - {"27 ☺☻☹=日a本b語ç\nmeow mix", "meow mix", "☺☻☹", "日a本b語ç", true}, - {"17 \x00hello=\x00world\n", "", "\x00hello", "\x00world", true}, - {"1 k=1\n", "1 k=1\n", "", "", false}, - {"6 k~1\n", "6 k~1\n", "", "", false}, - {"6_k=1\n", "6_k=1\n", "", "", false}, - {"6 k=1 ", "6 k=1 ", "", "", false}, - {"632 k=1\n", "632 k=1\n", "", "", false}, - {"16 longkeyname=hahaha\n", "16 longkeyname=hahaha\n", "", "", false}, - {"3 somelongkey=\n", "3 somelongkey=\n", "", "", false}, - {"50 tooshort=\n", "50 tooshort=\n", "", "", false}, - } - - for _, v := range vectors { - key, val, res, err := parsePAXRecord(v.input) - ok := (err == nil) - if v.ok != ok { - if v.ok { - t.Errorf("parsePAXRecord(%q): got parsing failure, want success", v.input) - } else { - t.Errorf("parsePAXRecord(%q): got parsing success, want failure", v.input) - } - } - if ok && (key != v.outputKey || val != v.outputVal) { - t.Errorf("parsePAXRecord(%q): got (%q: %q), want (%q: %q)", - v.input, key, val, v.outputKey, v.outputVal) - } - if res != v.residual { - t.Errorf("parsePAXRecord(%q): got residual %q, want residual %q", - v.input, res, v.residual) - } - } -} - -func TestParseNumeric(t *testing.T) { - var vectors = []struct { - input string - output int64 - ok bool - }{ - // Test base-256 (binary) encoded values. - {"", 0, true}, - {"\x80", 0, true}, - {"\x80\x00", 0, true}, - {"\x80\x00\x00", 0, true}, - {"\xbf", (1 << 6) - 1, true}, - {"\xbf\xff", (1 << 14) - 1, true}, - {"\xbf\xff\xff", (1 << 22) - 1, true}, - {"\xff", -1, true}, - {"\xff\xff", -1, true}, - {"\xff\xff\xff", -1, true}, - {"\xc0", -1 * (1 << 6), true}, - {"\xc0\x00", -1 * (1 << 14), true}, - {"\xc0\x00\x00", -1 * (1 << 22), true}, - {"\x87\x76\xa2\x22\xeb\x8a\x72\x61", 537795476381659745, true}, - {"\x80\x00\x00\x00\x07\x76\xa2\x22\xeb\x8a\x72\x61", 537795476381659745, true}, - {"\xf7\x76\xa2\x22\xeb\x8a\x72\x61", -615126028225187231, true}, - {"\xff\xff\xff\xff\xf7\x76\xa2\x22\xeb\x8a\x72\x61", -615126028225187231, true}, - {"\x80\x7f\xff\xff\xff\xff\xff\xff\xff", math.MaxInt64, true}, - {"\x80\x80\x00\x00\x00\x00\x00\x00\x00", 0, false}, - {"\xff\x80\x00\x00\x00\x00\x00\x00\x00", math.MinInt64, true}, - {"\xff\x7f\xff\xff\xff\xff\xff\xff\xff", 0, false}, - {"\xf5\xec\xd1\xc7\x7e\x5f\x26\x48\x81\x9f\x8f\x9b", 0, false}, - - // Test base-8 (octal) encoded values. - {"0000000\x00", 0, true}, - {" \x0000000\x00", 0, true}, - {" \x0000003\x00", 3, true}, - {"00000000227\x00", 0227, true}, - {"032033\x00 ", 032033, true}, - {"320330\x00 ", 0320330, true}, - {"0000660\x00 ", 0660, true}, - {"\x00 0000660\x00 ", 0660, true}, - {"0123456789abcdef", 0, false}, - {"0123456789\x00abcdef", 0, false}, - {"01234567\x0089abcdef", 342391, true}, - {"0123\x7e\x5f\x264123", 0, false}, - } - - for _, v := range vectors { - var p parser - num := p.parseNumeric([]byte(v.input)) - ok := (p.err == nil) - if v.ok != ok { - if v.ok { - t.Errorf("parseNumeric(%q): got parsing failure, want success", v.input) - } else { - t.Errorf("parseNumeric(%q): got parsing success, want failure", v.input) - } - } - if ok && num != v.output { - t.Errorf("parseNumeric(%q): got %d, want %d", v.input, num, v.output) - } - } -} diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/stat_atim.go b/vendor/github.com/Microsoft/go-winio/archive/tar/stat_atim.go deleted file mode 100644 index cf9cc79c5..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/stat_atim.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build linux dragonfly openbsd solaris - -package tar - -import ( - "syscall" - "time" -) - -func statAtime(st *syscall.Stat_t) time.Time { - return time.Unix(st.Atim.Unix()) -} - -func statCtime(st *syscall.Stat_t) time.Time { - return time.Unix(st.Ctim.Unix()) -} diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/stat_atimespec.go b/vendor/github.com/Microsoft/go-winio/archive/tar/stat_atimespec.go deleted file mode 100644 index 6f17dbe30..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/stat_atimespec.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin freebsd netbsd - -package tar - -import ( - "syscall" - "time" -) - -func statAtime(st *syscall.Stat_t) time.Time { - return time.Unix(st.Atimespec.Unix()) -} - -func statCtime(st *syscall.Stat_t) time.Time { - return time.Unix(st.Ctimespec.Unix()) -} diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/stat_unix.go b/vendor/github.com/Microsoft/go-winio/archive/tar/stat_unix.go deleted file mode 100644 index cb843db4c..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/stat_unix.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build linux darwin dragonfly freebsd openbsd netbsd solaris - -package tar - -import ( - "os" - "syscall" -) - -func init() { - sysStat = statUnix -} - -func statUnix(fi os.FileInfo, h *Header) error { - sys, ok := fi.Sys().(*syscall.Stat_t) - if !ok { - return nil - } - h.Uid = int(sys.Uid) - h.Gid = int(sys.Gid) - // TODO(bradfitz): populate username & group. os/user - // doesn't cache LookupId lookups, and lacks group - // lookup functions. - h.AccessTime = statAtime(sys) - h.ChangeTime = statCtime(sys) - // TODO(bradfitz): major/minor device numbers? - return nil -} diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/tar_test.go b/vendor/github.com/Microsoft/go-winio/archive/tar/tar_test.go deleted file mode 100644 index d63c072eb..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/tar_test.go +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tar - -import ( - "bytes" - "io/ioutil" - "os" - "path" - "reflect" - "strings" - "testing" - "time" -) - -func TestFileInfoHeader(t *testing.T) { - fi, err := os.Stat("testdata/small.txt") - if err != nil { - t.Fatal(err) - } - h, err := FileInfoHeader(fi, "") - if err != nil { - t.Fatalf("FileInfoHeader: %v", err) - } - if g, e := h.Name, "small.txt"; g != e { - t.Errorf("Name = %q; want %q", g, e) - } - if g, e := h.Mode, int64(fi.Mode().Perm())|c_ISREG; g != e { - t.Errorf("Mode = %#o; want %#o", g, e) - } - if g, e := h.Size, int64(5); g != e { - t.Errorf("Size = %v; want %v", g, e) - } - if g, e := h.ModTime, fi.ModTime(); !g.Equal(e) { - t.Errorf("ModTime = %v; want %v", g, e) - } - // FileInfoHeader should error when passing nil FileInfo - if _, err := FileInfoHeader(nil, ""); err == nil { - t.Fatalf("Expected error when passing nil to FileInfoHeader") - } -} - -func TestFileInfoHeaderDir(t *testing.T) { - fi, err := os.Stat("testdata") - if err != nil { - t.Fatal(err) - } - h, err := FileInfoHeader(fi, "") - if err != nil { - t.Fatalf("FileInfoHeader: %v", err) - } - if g, e := h.Name, "testdata/"; g != e { - t.Errorf("Name = %q; want %q", g, e) - } - // Ignoring c_ISGID for golang.org/issue/4867 - if g, e := h.Mode&^c_ISGID, int64(fi.Mode().Perm())|c_ISDIR; g != e { - t.Errorf("Mode = %#o; want %#o", g, e) - } - if g, e := h.Size, int64(0); g != e { - t.Errorf("Size = %v; want %v", g, e) - } - if g, e := h.ModTime, fi.ModTime(); !g.Equal(e) { - t.Errorf("ModTime = %v; want %v", g, e) - } -} - -func TestFileInfoHeaderSymlink(t *testing.T) { - h, err := FileInfoHeader(symlink{}, "some-target") - if err != nil { - t.Fatal(err) - } - if g, e := h.Name, "some-symlink"; g != e { - t.Errorf("Name = %q; want %q", g, e) - } - if g, e := h.Linkname, "some-target"; g != e { - t.Errorf("Linkname = %q; want %q", g, e) - } -} - -type symlink struct{} - -func (symlink) Name() string { return "some-symlink" } -func (symlink) Size() int64 { return 0 } -func (symlink) Mode() os.FileMode { return os.ModeSymlink } -func (symlink) ModTime() time.Time { return time.Time{} } -func (symlink) IsDir() bool { return false } -func (symlink) Sys() interface{} { return nil } - -func TestRoundTrip(t *testing.T) { - data := []byte("some file contents") - - var b bytes.Buffer - tw := NewWriter(&b) - hdr := &Header{ - Name: "file.txt", - Uid: 1 << 21, // too big for 8 octal digits - Size: int64(len(data)), - ModTime: time.Now(), - } - // tar only supports second precision. - hdr.ModTime = hdr.ModTime.Add(-time.Duration(hdr.ModTime.Nanosecond()) * time.Nanosecond) - if err := tw.WriteHeader(hdr); err != nil { - t.Fatalf("tw.WriteHeader: %v", err) - } - if _, err := tw.Write(data); err != nil { - t.Fatalf("tw.Write: %v", err) - } - if err := tw.Close(); err != nil { - t.Fatalf("tw.Close: %v", err) - } - - // Read it back. - tr := NewReader(&b) - rHdr, err := tr.Next() - if err != nil { - t.Fatalf("tr.Next: %v", err) - } - if !reflect.DeepEqual(rHdr, hdr) { - t.Errorf("Header mismatch.\n got %+v\nwant %+v", rHdr, hdr) - } - rData, err := ioutil.ReadAll(tr) - if err != nil { - t.Fatalf("Read: %v", err) - } - if !bytes.Equal(rData, data) { - t.Errorf("Data mismatch.\n got %q\nwant %q", rData, data) - } -} - -type headerRoundTripTest struct { - h *Header - fm os.FileMode -} - -func TestHeaderRoundTrip(t *testing.T) { - golden := []headerRoundTripTest{ - // regular file. - { - h: &Header{ - Name: "test.txt", - Mode: 0644 | c_ISREG, - Size: 12, - ModTime: time.Unix(1360600916, 0), - Typeflag: TypeReg, - }, - fm: 0644, - }, - // symbolic link. - { - h: &Header{ - Name: "link.txt", - Mode: 0777 | c_ISLNK, - Size: 0, - ModTime: time.Unix(1360600852, 0), - Typeflag: TypeSymlink, - }, - fm: 0777 | os.ModeSymlink, - }, - // character device node. - { - h: &Header{ - Name: "dev/null", - Mode: 0666 | c_ISCHR, - Size: 0, - ModTime: time.Unix(1360578951, 0), - Typeflag: TypeChar, - }, - fm: 0666 | os.ModeDevice | os.ModeCharDevice, - }, - // block device node. - { - h: &Header{ - Name: "dev/sda", - Mode: 0660 | c_ISBLK, - Size: 0, - ModTime: time.Unix(1360578954, 0), - Typeflag: TypeBlock, - }, - fm: 0660 | os.ModeDevice, - }, - // directory. - { - h: &Header{ - Name: "dir/", - Mode: 0755 | c_ISDIR, - Size: 0, - ModTime: time.Unix(1360601116, 0), - Typeflag: TypeDir, - }, - fm: 0755 | os.ModeDir, - }, - // fifo node. - { - h: &Header{ - Name: "dev/initctl", - Mode: 0600 | c_ISFIFO, - Size: 0, - ModTime: time.Unix(1360578949, 0), - Typeflag: TypeFifo, - }, - fm: 0600 | os.ModeNamedPipe, - }, - // setuid. - { - h: &Header{ - Name: "bin/su", - Mode: 0755 | c_ISREG | c_ISUID, - Size: 23232, - ModTime: time.Unix(1355405093, 0), - Typeflag: TypeReg, - }, - fm: 0755 | os.ModeSetuid, - }, - // setguid. - { - h: &Header{ - Name: "group.txt", - Mode: 0750 | c_ISREG | c_ISGID, - Size: 0, - ModTime: time.Unix(1360602346, 0), - Typeflag: TypeReg, - }, - fm: 0750 | os.ModeSetgid, - }, - // sticky. - { - h: &Header{ - Name: "sticky.txt", - Mode: 0600 | c_ISREG | c_ISVTX, - Size: 7, - ModTime: time.Unix(1360602540, 0), - Typeflag: TypeReg, - }, - fm: 0600 | os.ModeSticky, - }, - // hard link. - { - h: &Header{ - Name: "hard.txt", - Mode: 0644 | c_ISREG, - Size: 0, - Linkname: "file.txt", - ModTime: time.Unix(1360600916, 0), - Typeflag: TypeLink, - }, - fm: 0644, - }, - // More information. - { - h: &Header{ - Name: "info.txt", - Mode: 0600 | c_ISREG, - Size: 0, - Uid: 1000, - Gid: 1000, - ModTime: time.Unix(1360602540, 0), - Uname: "slartibartfast", - Gname: "users", - Typeflag: TypeReg, - }, - fm: 0600, - }, - } - - for i, g := range golden { - fi := g.h.FileInfo() - h2, err := FileInfoHeader(fi, "") - if err != nil { - t.Error(err) - continue - } - if strings.Contains(fi.Name(), "/") { - t.Errorf("FileInfo of %q contains slash: %q", g.h.Name, fi.Name()) - } - name := path.Base(g.h.Name) - if fi.IsDir() { - name += "/" - } - if got, want := h2.Name, name; got != want { - t.Errorf("i=%d: Name: got %v, want %v", i, got, want) - } - if got, want := h2.Size, g.h.Size; got != want { - t.Errorf("i=%d: Size: got %v, want %v", i, got, want) - } - if got, want := h2.Uid, g.h.Uid; got != want { - t.Errorf("i=%d: Uid: got %d, want %d", i, got, want) - } - if got, want := h2.Gid, g.h.Gid; got != want { - t.Errorf("i=%d: Gid: got %d, want %d", i, got, want) - } - if got, want := h2.Uname, g.h.Uname; got != want { - t.Errorf("i=%d: Uname: got %q, want %q", i, got, want) - } - if got, want := h2.Gname, g.h.Gname; got != want { - t.Errorf("i=%d: Gname: got %q, want %q", i, got, want) - } - if got, want := h2.Linkname, g.h.Linkname; got != want { - t.Errorf("i=%d: Linkname: got %v, want %v", i, got, want) - } - if got, want := h2.Typeflag, g.h.Typeflag; got != want { - t.Logf("%#v %#v", g.h, fi.Sys()) - t.Errorf("i=%d: Typeflag: got %q, want %q", i, got, want) - } - if got, want := h2.Mode, g.h.Mode; got != want { - t.Errorf("i=%d: Mode: got %o, want %o", i, got, want) - } - if got, want := fi.Mode(), g.fm; got != want { - t.Errorf("i=%d: fi.Mode: got %o, want %o", i, got, want) - } - if got, want := h2.AccessTime, g.h.AccessTime; got != want { - t.Errorf("i=%d: AccessTime: got %v, want %v", i, got, want) - } - if got, want := h2.ChangeTime, g.h.ChangeTime; got != want { - t.Errorf("i=%d: ChangeTime: got %v, want %v", i, got, want) - } - if got, want := h2.ModTime, g.h.ModTime; got != want { - t.Errorf("i=%d: ModTime: got %v, want %v", i, got, want) - } - if sysh, ok := fi.Sys().(*Header); !ok || sysh != g.h { - t.Errorf("i=%d: Sys didn't return original *Header", i) - } - } -} diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/gnu-multi-hdrs.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/gnu-multi-hdrs.tar deleted file mode 100644 index 8bcad55d06e8f9fde3641d2a8df370503a582ce6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 zcmdPX*VA|K$%Afaj^QI J<`xZ33jpEZfW-g+ diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/gnu.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/gnu.tar deleted file mode 100644 index fc899dc8dc2ad9952f5c5f67a0c76ca2d87249e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 zcmeHH%L>9U5Ztq0(Jv@FdDKtv;8zq|ijXv5BIw^6DOh^2UK)_HbK1>@VQ0c5`qsHR zJrb1zXEcV16&lMRW}rdtKd=NSXg->JkvP|Esp4`g&CK_h+FMmo7oR?iU7RP&svn2t z!9Ke4)upeR_aRYKtT+(g`B!B>fS>t?p7IZ9V9LKWlK+)w+iY|SVQ_tY3I4Ddrx1w) M;($0H4*b6ZFWOBnBLDyZ diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/hardlink.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/hardlink.tar deleted file mode 100644 index 9cd1a26572e44150ded8a628fefb28fa089645d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2560 zcmYex%t_TNsVHHfAus>}GZPaAAZ2K7Y5<}Q3?Y0F6C}!DXk=n;YGz~#VjCD58=09i zC>YStO>m=2i%SxVfKDn)N-QZUh6`gbN{dsA@JNF_1@sD>#xP)T3IyjQ7L{Zs0g1H4 z;u5aG>Bv!6(JTZq5{ps>JpTi;4Ql>3F*i14P%uoRL*X>S^FPfJ)~LawAut*OgFXZR DcLg^L diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/hdr-only.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/hdr-only.tar deleted file mode 100644 index f25034083de6e0176e429f939875def6eb78cc73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10240 zcmeI2ZE}J@42Ji2Pq95gv)>o#1+ajk2rWokd-`UnK%I_CXNW`V?jLp5$;Lb+o4jM3 zRS%4K0WN2N31Pu$!vOG|0DSEi6VfBdZFVz=+!#Geo7WlKr zRl;AI>}kUnRryx%w0!65X8WAPynIb6zQg@I`q=ZhT;AVZ14uaInh{tzn(ux&A2{mb)wBl`42&RQXR%ispcL7W$7F z`oDwzV^q+8Xow$MornI@^B?pdod1LVbIgk3(>1Qxw*Nb){{{Vr0_`Z9LH`*QrhogT zdFVfV{nxJ3f3W@s{fGXsn}`0>@$ct<6aa(%Lr=2_XU@0=FB1PuCY>1poj5 diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/issue10968.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/issue10968.tar deleted file mode 100644 index 1cc837bcff14cd822a26e43034955c82e852ab29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmbVI!41MN47Ah*kg@;^fX)>lI!AWsgI^V-_Q4}k$6}2x&>iv*cG6Oc`at9n#lG|1 zIi>(iak!RTol#boyD`0c^v(cHJJuvHh-e39;{t(!nc@gWsV;O@FkUc{-h`pC817Ix zgh|QIatu;A!G^JZ7UC1V_vGb4bURuTWAy6SS-Fx(D=wcI#QP1Y#wzX?HAf0_+~lp> yN?iGbw2JFgJjd0vnp9WIo>K3V$tfee6;KE|`1A3J$tp?9B&Y7`+Gwrtzls-lP-;g2 diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/issue11169.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/issue11169.tar deleted file mode 100644 index 4d71fa15260609ecee0c8c751cfebf49be8763ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcmdPX4@j)=NKH&hEh^SCG%+zV)=x}KWS}ZA00J`;69y0s1n9JZp|KHzp^>Svp`nSX svAH3G0gzz?R8~P%SKu(Lw74X(2$wLeQpM#*<5EsKtJ9uH<6)~%E3&=F&Kzfi~{+q#!cOa=AzbjSO$1IxR;aN z*g3HiZShf(vs!BvbKPiG1!!GY>l3F=j$kqh!InX?lk@{OAsyh#2%!qzcGBC1;;FXq z6(OUFiyZLnA-?TXGNUXTUA0xix-DD8En}aw{C@tp7XnB4F0(23$NLG-y>mPO&s&?~ diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/nil-uid.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/nil-uid.tar deleted file mode 100644 index cc9cfaa33cc5de0a28b4183c1705d801f788c96a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmWGAG%z(VGPcn33UJrU$xmmX0WbgpGcywmlR@HOU}(l*Xk=(?U}j`)Zf3?{U^3;ld-=Ii;m6ILFVT3VXy>=Udb`;P z_AF}Ko(kwITGLdEM1G)5o<9H!jr=439(@V?ONRXCAu*5YPw-#9x&N1V|EJgyTG0B^ zUZ)s9!5N^&Ghph+I3UGBWYR$X|2zH<_}9R{M*cI=m|k}8li%1Drp7@Vny>jkUkM=z Sl}Br1`$oQ%|3`N;j=%%-SrC5! diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/pax-path-hdr.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/pax-path-hdr.tar deleted file mode 100644 index ab8fc325b26159f4fed6bfb59fe5f616d35fec74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmXR&EXmL>$=5GRO-#v6r43~O0Sq{30|OI7m>ft6gMqP;fsrYLLIndIKxuJFViC}K xO07co9Hr*bNx!kNLIE%d*akR880v$Gocz3WU67b=USe)47oFTOYR$le004hRKE?n5 diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/pax.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/pax.tar deleted file mode 100644 index 9bc24b6587d726c7fca4e533d9c61a3801a34688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10240 zcmeH~&u-H|5XOD(Q}_vz`9HIV-Z}CL1|qeBRwxNlAD?kbq{vMJQj94uds*3I@2-Ed zpXb|Q{eF0Qw;4Wdw!4)@_!@~t&7&b8A|a!oqM>78BOoLqCLtvwr=Z5b$i&RT%Er#Y zO+ZjcSVUAHn~8MUp(~vBV+cg7LjpEKCCE6D7E@EwTcMv_>l+&bbg`j1Cv0A776ym5t@+ zSt9MDBFtXbKY&m4pMN0f`l~hhD>#q(-`x$5n+q@eEPmAevA;0XTM8XMYkTvSmQ-t5 zkihVw{(qQ#_JjT})&KMa&-FhG0c8or{CPvw|Jf69WL!B2Wa1KoKYcMW6^2fg(@@ia-%40!5$*6oDd81d2cr_`3;w E2V3|JA^-pY diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/small.txt b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/small.txt deleted file mode 100644 index b249bfc51..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/small.txt +++ /dev/null @@ -1 +0,0 @@ -Kilts \ No newline at end of file diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/small2.txt b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/small2.txt deleted file mode 100644 index 394ee3ecd..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/small2.txt +++ /dev/null @@ -1 +0,0 @@ -Google.com diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/sparse-formats.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/sparse-formats.tar deleted file mode 100644 index 8bd4e74d50f9c8961f80a887ab7d6449e032048b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17920 zcmeHO!BXQ!5M{6a3g^xmb&sU64qQV{sZ?#{1DvdPiv%!*Aw}}_dEEjdi|Nre#)hpG zE{}(KnjXC;wbY|&t*;k1>*dFY-EbwpT`b+-m>u zXfjaoe5W44g1VMFbuvaLV|3acePf?HHj7T34f|}^XTyHz*zDR5hW%jJ$GN!K=dPX7 zuwNSXOT&I?*sl!xm0`a!>{o{UdfWbohf`t0wKm47jd5yYoVY#C#(p&HN5g(h+o$d^ z>C~x6+ovLJp9;gi;Rj^+0U3Tkh98jO2W0pG8Gb;9ACTb()boS>@h8I{`Aj1#H@B=dZfDAvtjWMmW;RoC~7Py0M z`m*5%-1CF}@n^#y*zgB7{DBRBV8b8S@CP>hfen8^_^{DnOAo^z5MmhHr;h_0e!zww zu;B-6_yHS!z=j{N;RkH^0r&ji+3`30fen9P!ynl22R8fx0blw!^!(v@`{T)$#0AMUzUr{%bWEKK}dPBZfAtotM&Q)$6}V4GkAAL?ydIxj}Q`3 zJOATY>UD~$8khO$y?3COY_Ib_T!Mz?cSHC~#(oEVI84ue{e9LR^x69SzvU?x#e`$G z`ReZSkBilxf3HuQYO>v9_2tWYd3#C|uKGRxyy zk#CN0vO|t>vO|t?vO|t@vV)g2dr7mGGDo)W_L8o>q-!tf+DkfmNk=c~=p`M!q@$Pg+)H}y zB|Z0&o_k5py`&p2>BdW1A|f+1N!@lEFX<*ndTZ#%;H1d0PWQ;sPWQ<1PWQ+WPxo*$ zCpU9)GbcB5ax*74^K5XIR5u%)rF*!UXXCT<7;fg-2rW5AHbhJJa5K*aY3VWC%(G!y za*S-8mhRzZo{iMfW4M`TW3}WM*$8{;Fcc4%{&{rCCA9dZs{Iw=Go{iJw}H4J9rlMBkscMKka?4V*dGW zC;x{dmiMq8gvD(vpG{xk(ev}2>9_pg&wuy1`g67#*MIt_+k5+eaQ%mN-{S%QM+!~( zxc)<2*YN+U4#l|sv%B)c7PePszGeL<)ZO)vtHtH=w09GsNfox9d|WQBPwAMB1HKi$ z5#I)1l17qNl4g>25`gi0%mT0gEC34-1PB5I0fGQQfKq@`fKq@`fKq@;fJ%T$fJ%T$ zfLefBfLefBfLeekKolSf5Cw<=%mtVWFc)Ahz+8YvfJT5ufJT5u0A#CaDG)Nzv=opE zMO*%@0IdS81gZg+MP*A>0a;*L*S;zQ^1P%)r9keM))iGXNaa8-mb9xN$g|SAj;op= zlS*1t6=X?iT~QSVc~H`#(jdo4>x!y6$YPQf)rV9dQiVt*BGrggBvO?~WSR`0jpG)F zR$z95<=;=bg;QIfR|BZ{k=7%FW59w-S{C9wpVT}I{Ao4pNVj%vb z{pbH+{)aiAzW>2BZdt7HACK|hLCzZHZZvnf_-l0|IXl~}=T~SgCPR@QPL^Kc(9Lpj zv56@U!e<=Br@-+2fA>qk!2KVorji&Q8CK+X>e0g#)6 z@dUuK3}6apYu09*vX znm!5vu=b8Z0L;v^6bQklmI7jCCS}XN6`)n1l|VJX%uKdX6)-c?y7pBeFf)@Dl>##} ztt+Z(U}h#Qst0CfT31vh!CNoVqM~4CrgcSC7r2GAs4|$DXJmbGf$=ejIaDU{qjK;EfgdABYgg9smFU diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/star.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/star.tar deleted file mode 100644 index 59e2d4e604611eeac3e2a0f3d6f71d2623c50449..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 zcmeHHT?)e>4DRzz;R#BjQ;)ERouag*479>@u-$$NbG3!-WyoMlUh?xvNIv}HZD&jy zuA!-C5KZlY0Y@bP833Zfm_JQ2M2yBQ2dTK6K{>VDLBV=D{z>IvVF` zUD#xgUGh?F1AikeIW6NnOIrMRGU4UU`62nAWxyx>^STEhN#m{lQEc_EhA!%P7hKg3OW)iVh<3F#{;S{=CgM+^V}b=Pyosep=F7x+*OI&?Q6F7LxR?fb`B^0 zttmJo<+m$~$Msw9KQ_wfqfW1sDJ#zsWq25)8&TsKn~+7*oF6~$0+nD?L2C$TBQM>$ zcQqo7Eo8w%PL1H9D9KY4`f7Ku6*oaxOv|7S1ZpTT=%sbGS#L2%*Uxm5P}U`mG$%9I zIRuF>849Ugh}k{mmgLJGtca9XnA{r2KBJ`fRXOnPqEZjWtz4z5Mq_`uZWX)VuFVko z#$DNd>@Saj1w+|ef@dPC=g!5Kb4c+mQ$bcu#R_I=;>D)V&agmv_`vpStP-sQh!z(| z5{9v2$DGKS|DrLqZ8y7?ox@|a-R^30zMeK388O@+r+cK=9NdZ)ow#}n{kwf`tD4=t zR9Oz?v}2QNv&rDR7u$%4%_>%5(k#={r!rZ(5WA5+U_Rz+w6{_kV7C!KK2e+5VuS-5 zWLRhpI#>Iq%|mhyZxDfRHCi7gC+R&sD4|k;~pXMNUD{^NPC5(KX~`*cXkwAurz(+XVNg z1P`yNv%FZy)9`uTGCWUJ^@>e2&T3O`W@re{ZN S9gn%XW0CXwKYp`+7X1&(X!Xnh diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/ustar.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/ustar.tar deleted file mode 100644 index 29679d9a305fc0293f31212541335af824ab32c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2048 zcmYex%t_TNsVHHfAus>}GZPaA5N&Q|3Z@N=AbgM*P?o{a$k4#V#K6eR)QrKv#MIE( zgh9c8hHiozU0Pg{SOj!ZaYkZZDqIwk0aTWjhA9jefq29K;yD8YhMfGo^t{B}RQ&;E gz@3MSk&&8{lh1`qc2s;c1V%$(Gz3ONV7P_=0FTf|dgec!sXT^AK{$jKc@-kWdUe(&uh-&e0L+xARj zwLzm>LI~3|1sT#R&XkBIzWbfCPrYEK7fr^Q@7vXO;&pw$QCTT3-?&yO+jq(<{6qS`FS_vP zIBhMBjnmsnS~{|C9LMN8#r!W{zj5l&zcE?^U_t*||1zJ{zqInH{-Zy}2$O|c?WSFx zxn8RtM3-UpAJiW`Z@Zar#$ojz)NjtWBfnULUzD=jj5!>iG>O2k{o(=ZAg=$-urC7q zVm{n!{kK`S@p|Vk`q%aFg#nw)bMB-40yAj*%7=F37m@ziFINBH7pTSD@Cfil^^9T6 zxL-iu+Aq)#ev#CF(l2&S@A^eC<`;^e4{ZQ#s9$Y4r}$iP3;;e3V;a&MNN*s$f%FFc H(;N5+1FUK9 diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/writer-big-long.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/writer-big-long.tar deleted file mode 100644 index 5960ee824784ffeacb976a9c648be41b0281508b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmeIuJqp7x3tu-|!r}ytVByrmfae ipO37m$1T~NWs?FFpa2CZKmiI+fC3bt00k&;vcMnFf)<_t diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/writer.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/writer.tar deleted file mode 100644 index e6d816ad0775d56d09242d6f5d1dbe56af310a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3584 zcmeHIK@P$o5ajGDd_l9j6nKIMUt!cVjT92WM1L@81h#LhDgML6Bon)c?rO_kPgyt^3D0fH9$GJM`O*&4VCw= zv#H)UKC-TtzNwGuV$*%C{bm zsdIMLR{C5VZL^vBE!S4cfUeCYt@>GOiAt%sq7tp|_iN{x5cDreh9ME=K+wOCQm`$x j!znSk-v6Dy)}|V_!f*AilYjI7l|Jj-R%ReG@B;%+QQ}au diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/xattrs.tar b/vendor/github.com/Microsoft/go-winio/archive/tar/testdata/xattrs.tar deleted file mode 100644 index 9701950edd1f0dc82858b7117136b37391be0b08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5120 zcmeHJv2KGf5M|~o_yWg1+khiw>d;i}P^nX=$R$ooYd`|ilD{uBAv6g^kxC>6-(uu< zHg^v_-l5r}td>fyRbC(vfcdOQq}Iq(#u+Ja9X?}Dv(|CCVoJF~09ZgF;2a!G7^%~| zYNYoMUQ-rE=5KzzBJ^EKyr-Mx-NQ4gq%k=v3zee}wOxElT`HH-ei(K*xV|_} zC{$GDvDuoW?o>&odUrVuVHkt_w?IH zW3PV_@V!Jxt@A^i>Yrj(>;K=H?5X8!tJS~MYVd#a^`?|QJKb&Uduf~MfN4M7$J!Lr zF40zZMF!9x{tqJ#0F5+;{2!=)=Knre|G(mAKU`hAc#r>!#{V(9d;sW1hxVv7@B_zF ze)#eKF~#1~>@WTI`#+&4`lkel_5U6!N8h^5vRAE8lqGgr9-Ul!p=H1_U>TS&1K)l2 B)fNB% diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/writer.go b/vendor/github.com/Microsoft/go-winio/archive/tar/writer.go deleted file mode 100644 index 30d7e606d..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/writer.go +++ /dev/null @@ -1,444 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tar - -// TODO(dsymonds): -// - catch more errors (no first header, etc.) - -import ( - "bytes" - "errors" - "fmt" - "io" - "path" - "sort" - "strconv" - "strings" - "time" -) - -var ( - ErrWriteTooLong = errors.New("archive/tar: write too long") - ErrFieldTooLong = errors.New("archive/tar: header field too long") - ErrWriteAfterClose = errors.New("archive/tar: write after close") - errInvalidHeader = errors.New("archive/tar: header field too long or contains invalid values") -) - -// A Writer provides sequential writing of a tar archive in POSIX.1 format. -// A tar archive consists of a sequence of files. -// Call WriteHeader to begin a new file, and then call Write to supply that file's data, -// writing at most hdr.Size bytes in total. -type Writer struct { - w io.Writer - err error - nb int64 // number of unwritten bytes for current file entry - pad int64 // amount of padding to write after current file entry - closed bool - usedBinary bool // whether the binary numeric field extension was used - preferPax bool // use pax header instead of binary numeric header - hdrBuff [blockSize]byte // buffer to use in writeHeader when writing a regular header - paxHdrBuff [blockSize]byte // buffer to use in writeHeader when writing a pax header -} - -type formatter struct { - err error // Last error seen -} - -// NewWriter creates a new Writer writing to w. -func NewWriter(w io.Writer) *Writer { return &Writer{w: w, preferPax: true} } - -// Flush finishes writing the current file (optional). -func (tw *Writer) Flush() error { - if tw.nb > 0 { - tw.err = fmt.Errorf("archive/tar: missed writing %d bytes", tw.nb) - return tw.err - } - - n := tw.nb + tw.pad - for n > 0 && tw.err == nil { - nr := n - if nr > blockSize { - nr = blockSize - } - var nw int - nw, tw.err = tw.w.Write(zeroBlock[0:nr]) - n -= int64(nw) - } - tw.nb = 0 - tw.pad = 0 - return tw.err -} - -// Write s into b, terminating it with a NUL if there is room. -func (f *formatter) formatString(b []byte, s string) { - if len(s) > len(b) { - f.err = ErrFieldTooLong - return - } - ascii := toASCII(s) - copy(b, ascii) - if len(ascii) < len(b) { - b[len(ascii)] = 0 - } -} - -// Encode x as an octal ASCII string and write it into b with leading zeros. -func (f *formatter) formatOctal(b []byte, x int64) { - s := strconv.FormatInt(x, 8) - // leading zeros, but leave room for a NUL. - for len(s)+1 < len(b) { - s = "0" + s - } - f.formatString(b, s) -} - -// fitsInBase256 reports whether x can be encoded into n bytes using base-256 -// encoding. Unlike octal encoding, base-256 encoding does not require that the -// string ends with a NUL character. Thus, all n bytes are available for output. -// -// If operating in binary mode, this assumes strict GNU binary mode; which means -// that the first byte can only be either 0x80 or 0xff. Thus, the first byte is -// equivalent to the sign bit in two's complement form. -func fitsInBase256(n int, x int64) bool { - var binBits = uint(n-1) * 8 - return n >= 9 || (x >= -1<= 0; i-- { - b[i] = byte(x) - x >>= 8 - } - b[0] |= 0x80 // Highest bit indicates binary format - return - } - - f.formatOctal(b, 0) // Last resort, just write zero - f.err = ErrFieldTooLong -} - -var ( - minTime = time.Unix(0, 0) - // There is room for 11 octal digits (33 bits) of mtime. - maxTime = minTime.Add((1<<33 - 1) * time.Second) -) - -// WriteHeader writes hdr and prepares to accept the file's contents. -// WriteHeader calls Flush if it is not the first header. -// Calling after a Close will return ErrWriteAfterClose. -func (tw *Writer) WriteHeader(hdr *Header) error { - return tw.writeHeader(hdr, true) -} - -// WriteHeader writes hdr and prepares to accept the file's contents. -// WriteHeader calls Flush if it is not the first header. -// Calling after a Close will return ErrWriteAfterClose. -// As this method is called internally by writePax header to allow it to -// suppress writing the pax header. -func (tw *Writer) writeHeader(hdr *Header, allowPax bool) error { - if tw.closed { - return ErrWriteAfterClose - } - if tw.err == nil { - tw.Flush() - } - if tw.err != nil { - return tw.err - } - - // a map to hold pax header records, if any are needed - paxHeaders := make(map[string]string) - - // TODO(shanemhansen): we might want to use PAX headers for - // subsecond time resolution, but for now let's just capture - // too long fields or non ascii characters - - var f formatter - var header []byte - - // We need to select which scratch buffer to use carefully, - // since this method is called recursively to write PAX headers. - // If allowPax is true, this is the non-recursive call, and we will use hdrBuff. - // If allowPax is false, we are being called by writePAXHeader, and hdrBuff is - // already being used by the non-recursive call, so we must use paxHdrBuff. - header = tw.hdrBuff[:] - if !allowPax { - header = tw.paxHdrBuff[:] - } - copy(header, zeroBlock) - s := slicer(header) - - // Wrappers around formatter that automatically sets paxHeaders if the - // argument extends beyond the capacity of the input byte slice. - var formatString = func(b []byte, s string, paxKeyword string) { - needsPaxHeader := paxKeyword != paxNone && len(s) > len(b) || !isASCII(s) - if needsPaxHeader { - paxHeaders[paxKeyword] = s - return - } - f.formatString(b, s) - } - var formatNumeric = func(b []byte, x int64, paxKeyword string) { - // Try octal first. - s := strconv.FormatInt(x, 8) - if len(s) < len(b) { - f.formatOctal(b, x) - return - } - - // If it is too long for octal, and PAX is preferred, use a PAX header. - if paxKeyword != paxNone && tw.preferPax { - f.formatOctal(b, 0) - s := strconv.FormatInt(x, 10) - paxHeaders[paxKeyword] = s - return - } - - tw.usedBinary = true - f.formatNumeric(b, x) - } - var formatTime = func(b []byte, t time.Time, paxKeyword string) { - var unixTime int64 - if !t.Before(minTime) && !t.After(maxTime) { - unixTime = t.Unix() - } - formatNumeric(b, unixTime, paxNone) - - // Write a PAX header if the time didn't fit precisely. - if paxKeyword != "" && tw.preferPax && allowPax && (t.Nanosecond() != 0 || !t.Before(minTime) || !t.After(maxTime)) { - paxHeaders[paxKeyword] = formatPAXTime(t) - } - } - - // keep a reference to the filename to allow to overwrite it later if we detect that we can use ustar longnames instead of pax - pathHeaderBytes := s.next(fileNameSize) - - formatString(pathHeaderBytes, hdr.Name, paxPath) - - f.formatOctal(s.next(8), hdr.Mode) // 100:108 - formatNumeric(s.next(8), int64(hdr.Uid), paxUid) // 108:116 - formatNumeric(s.next(8), int64(hdr.Gid), paxGid) // 116:124 - formatNumeric(s.next(12), hdr.Size, paxSize) // 124:136 - formatTime(s.next(12), hdr.ModTime, paxMtime) // 136:148 - s.next(8) // chksum (148:156) - s.next(1)[0] = hdr.Typeflag // 156:157 - - formatString(s.next(100), hdr.Linkname, paxLinkpath) - - copy(s.next(8), []byte("ustar\x0000")) // 257:265 - formatString(s.next(32), hdr.Uname, paxUname) // 265:297 - formatString(s.next(32), hdr.Gname, paxGname) // 297:329 - formatNumeric(s.next(8), hdr.Devmajor, paxNone) // 329:337 - formatNumeric(s.next(8), hdr.Devminor, paxNone) // 337:345 - - // keep a reference to the prefix to allow to overwrite it later if we detect that we can use ustar longnames instead of pax - prefixHeaderBytes := s.next(155) - formatString(prefixHeaderBytes, "", paxNone) // 345:500 prefix - - // Use the GNU magic instead of POSIX magic if we used any GNU extensions. - if tw.usedBinary { - copy(header[257:265], []byte("ustar \x00")) - } - - _, paxPathUsed := paxHeaders[paxPath] - // try to use a ustar header when only the name is too long - if !tw.preferPax && len(paxHeaders) == 1 && paxPathUsed { - prefix, suffix, ok := splitUSTARPath(hdr.Name) - if ok { - // Since we can encode in USTAR format, disable PAX header. - delete(paxHeaders, paxPath) - - // Update the path fields - formatString(pathHeaderBytes, suffix, paxNone) - formatString(prefixHeaderBytes, prefix, paxNone) - } - } - - // The chksum field is terminated by a NUL and a space. - // This is different from the other octal fields. - chksum, _ := checksum(header) - f.formatOctal(header[148:155], chksum) // Never fails - header[155] = ' ' - - // Check if there were any formatting errors. - if f.err != nil { - tw.err = f.err - return tw.err - } - - if allowPax { - if !hdr.AccessTime.IsZero() { - paxHeaders[paxAtime] = formatPAXTime(hdr.AccessTime) - } - if !hdr.ChangeTime.IsZero() { - paxHeaders[paxCtime] = formatPAXTime(hdr.ChangeTime) - } - if !hdr.CreationTime.IsZero() { - paxHeaders[paxCreationTime] = formatPAXTime(hdr.CreationTime) - } - for k, v := range hdr.Xattrs { - paxHeaders[paxXattr+k] = v - } - for k, v := range hdr.Winheaders { - paxHeaders[paxWindows+k] = v - } - } - - if len(paxHeaders) > 0 { - if !allowPax { - return errInvalidHeader - } - if err := tw.writePAXHeader(hdr, paxHeaders); err != nil { - return err - } - } - tw.nb = int64(hdr.Size) - tw.pad = (blockSize - (tw.nb % blockSize)) % blockSize - - _, tw.err = tw.w.Write(header) - return tw.err -} - -func formatPAXTime(t time.Time) string { - sec := t.Unix() - usec := t.Nanosecond() - s := strconv.FormatInt(sec, 10) - if usec != 0 { - s = fmt.Sprintf("%s.%09d", s, usec) - } - return s -} - -// splitUSTARPath splits a path according to USTAR prefix and suffix rules. -// If the path is not splittable, then it will return ("", "", false). -func splitUSTARPath(name string) (prefix, suffix string, ok bool) { - length := len(name) - if length <= fileNameSize || !isASCII(name) { - return "", "", false - } else if length > fileNamePrefixSize+1 { - length = fileNamePrefixSize + 1 - } else if name[length-1] == '/' { - length-- - } - - i := strings.LastIndex(name[:length], "/") - nlen := len(name) - i - 1 // nlen is length of suffix - plen := i // plen is length of prefix - if i <= 0 || nlen > fileNameSize || nlen == 0 || plen > fileNamePrefixSize { - return "", "", false - } - return name[:i], name[i+1:], true -} - -// writePaxHeader writes an extended pax header to the -// archive. -func (tw *Writer) writePAXHeader(hdr *Header, paxHeaders map[string]string) error { - // Prepare extended header - ext := new(Header) - ext.Typeflag = TypeXHeader - // Setting ModTime is required for reader parsing to - // succeed, and seems harmless enough. - ext.ModTime = hdr.ModTime - // The spec asks that we namespace our pseudo files - // with the current pid. However, this results in differing outputs - // for identical inputs. As such, the constant 0 is now used instead. - // golang.org/issue/12358 - dir, file := path.Split(hdr.Name) - fullName := path.Join(dir, "PaxHeaders.0", file) - - ascii := toASCII(fullName) - if len(ascii) > 100 { - ascii = ascii[:100] - } - ext.Name = ascii - // Construct the body - var buf bytes.Buffer - - // Keys are sorted before writing to body to allow deterministic output. - var keys []string - for k := range paxHeaders { - keys = append(keys, k) - } - sort.Strings(keys) - - for _, k := range keys { - fmt.Fprint(&buf, formatPAXRecord(k, paxHeaders[k])) - } - - ext.Size = int64(len(buf.Bytes())) - if err := tw.writeHeader(ext, false); err != nil { - return err - } - if _, err := tw.Write(buf.Bytes()); err != nil { - return err - } - if err := tw.Flush(); err != nil { - return err - } - return nil -} - -// formatPAXRecord formats a single PAX record, prefixing it with the -// appropriate length. -func formatPAXRecord(k, v string) string { - const padding = 3 // Extra padding for ' ', '=', and '\n' - size := len(k) + len(v) + padding - size += len(strconv.Itoa(size)) - record := fmt.Sprintf("%d %s=%s\n", size, k, v) - - // Final adjustment if adding size field increased the record size. - if len(record) != size { - size = len(record) - record = fmt.Sprintf("%d %s=%s\n", size, k, v) - } - return record -} - -// Write writes to the current entry in the tar archive. -// Write returns the error ErrWriteTooLong if more than -// hdr.Size bytes are written after WriteHeader. -func (tw *Writer) Write(b []byte) (n int, err error) { - if tw.closed { - err = ErrWriteAfterClose - return - } - overwrite := false - if int64(len(b)) > tw.nb { - b = b[0:tw.nb] - overwrite = true - } - n, err = tw.w.Write(b) - tw.nb -= int64(n) - if err == nil && overwrite { - err = ErrWriteTooLong - return - } - tw.err = err - return -} - -// Close closes the tar archive, flushing any unwritten -// data to the underlying writer. -func (tw *Writer) Close() error { - if tw.err != nil || tw.closed { - return tw.err - } - tw.Flush() - tw.closed = true - if tw.err != nil { - return tw.err - } - - // trailer: two zero blocks - for i := 0; i < 2; i++ { - _, tw.err = tw.w.Write(zeroBlock) - if tw.err != nil { - break - } - } - return tw.err -} diff --git a/vendor/github.com/Microsoft/go-winio/archive/tar/writer_test.go b/vendor/github.com/Microsoft/go-winio/archive/tar/writer_test.go deleted file mode 100644 index a5c938270..000000000 --- a/vendor/github.com/Microsoft/go-winio/archive/tar/writer_test.go +++ /dev/null @@ -1,739 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package tar - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "math" - "os" - "reflect" - "sort" - "strings" - "testing" - "testing/iotest" - "time" -) - -type writerTestEntry struct { - header *Header - contents string -} - -type writerTest struct { - file string // filename of expected output - entries []*writerTestEntry -} - -var writerTests = []*writerTest{ - // The writer test file was produced with this command: - // tar (GNU tar) 1.26 - // ln -s small.txt link.txt - // tar -b 1 --format=ustar -c -f writer.tar small.txt small2.txt link.txt - { - file: "testdata/writer.tar", - entries: []*writerTestEntry{ - { - header: &Header{ - Name: "small.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 5, - ModTime: time.Unix(1246508266, 0), - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - contents: "Kilts", - }, - { - header: &Header{ - Name: "small2.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 11, - ModTime: time.Unix(1245217492, 0), - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - contents: "Google.com\n", - }, - { - header: &Header{ - Name: "link.txt", - Mode: 0777, - Uid: 1000, - Gid: 1000, - Size: 0, - ModTime: time.Unix(1314603082, 0), - Typeflag: '2', - Linkname: "small.txt", - Uname: "strings", - Gname: "strings", - }, - // no contents - }, - }, - }, - // The truncated test file was produced using these commands: - // dd if=/dev/zero bs=1048576 count=16384 > /tmp/16gig.txt - // tar -b 1 -c -f- /tmp/16gig.txt | dd bs=512 count=8 > writer-big.tar - { - file: "testdata/writer-big.tar", - entries: []*writerTestEntry{ - { - header: &Header{ - Name: "tmp/16gig.txt", - Mode: 0640, - Uid: 73025, - Gid: 5000, - Size: 16 << 30, - ModTime: time.Unix(1254699560, 0), - Typeflag: '0', - Uname: "dsymonds", - Gname: "eng", - }, - // fake contents - contents: strings.Repeat("\x00", 4<<10), - }, - }, - }, - // The truncated test file was produced using these commands: - // dd if=/dev/zero bs=1048576 count=16384 > (longname/)*15 /16gig.txt - // tar -b 1 -c -f- (longname/)*15 /16gig.txt | dd bs=512 count=8 > writer-big-long.tar - { - file: "testdata/writer-big-long.tar", - entries: []*writerTestEntry{ - { - header: &Header{ - Name: strings.Repeat("longname/", 15) + "16gig.txt", - Mode: 0644, - Uid: 1000, - Gid: 1000, - Size: 16 << 30, - ModTime: time.Unix(1399583047, 0), - Typeflag: '0', - Uname: "guillaume", - Gname: "guillaume", - }, - // fake contents - contents: strings.Repeat("\x00", 4<<10), - }, - }, - }, - // This file was produced using gnu tar 1.17 - // gnutar -b 4 --format=ustar (longname/)*15 + file.txt - { - file: "testdata/ustar.tar", - entries: []*writerTestEntry{ - { - header: &Header{ - Name: strings.Repeat("longname/", 15) + "file.txt", - Mode: 0644, - Uid: 0765, - Gid: 024, - Size: 06, - ModTime: time.Unix(1360135598, 0), - Typeflag: '0', - Uname: "shane", - Gname: "staff", - }, - contents: "hello\n", - }, - }, - }, - // This file was produced using gnu tar 1.26 - // echo "Slartibartfast" > file.txt - // ln file.txt hard.txt - // tar -b 1 --format=ustar -c -f hardlink.tar file.txt hard.txt - { - file: "testdata/hardlink.tar", - entries: []*writerTestEntry{ - { - header: &Header{ - Name: "file.txt", - Mode: 0644, - Uid: 1000, - Gid: 100, - Size: 15, - ModTime: time.Unix(1425484303, 0), - Typeflag: '0', - Uname: "vbatts", - Gname: "users", - }, - contents: "Slartibartfast\n", - }, - { - header: &Header{ - Name: "hard.txt", - Mode: 0644, - Uid: 1000, - Gid: 100, - Size: 0, - ModTime: time.Unix(1425484303, 0), - Typeflag: '1', - Linkname: "file.txt", - Uname: "vbatts", - Gname: "users", - }, - // no contents - }, - }, - }, -} - -// Render byte array in a two-character hexadecimal string, spaced for easy visual inspection. -func bytestr(offset int, b []byte) string { - const rowLen = 32 - s := fmt.Sprintf("%04x ", offset) - for _, ch := range b { - switch { - case '0' <= ch && ch <= '9', 'A' <= ch && ch <= 'Z', 'a' <= ch && ch <= 'z': - s += fmt.Sprintf(" %c", ch) - default: - s += fmt.Sprintf(" %02x", ch) - } - } - return s -} - -// Render a pseudo-diff between two blocks of bytes. -func bytediff(a []byte, b []byte) string { - const rowLen = 32 - s := fmt.Sprintf("(%d bytes vs. %d bytes)\n", len(a), len(b)) - for offset := 0; len(a)+len(b) > 0; offset += rowLen { - na, nb := rowLen, rowLen - if na > len(a) { - na = len(a) - } - if nb > len(b) { - nb = len(b) - } - sa := bytestr(offset, a[0:na]) - sb := bytestr(offset, b[0:nb]) - if sa != sb { - s += fmt.Sprintf("-%v\n+%v\n", sa, sb) - } - a = a[na:] - b = b[nb:] - } - return s -} - -func TestWriter(t *testing.T) { -testLoop: - for i, test := range writerTests { - expected, err := ioutil.ReadFile(test.file) - if err != nil { - t.Errorf("test %d: Unexpected error: %v", i, err) - continue - } - - buf := new(bytes.Buffer) - tw := NewWriter(iotest.TruncateWriter(buf, 4<<10)) // only catch the first 4 KB - big := false - for j, entry := range test.entries { - big = big || entry.header.Size > 1<<10 - if err := tw.WriteHeader(entry.header); err != nil { - t.Errorf("test %d, entry %d: Failed writing header: %v", i, j, err) - continue testLoop - } - if _, err := io.WriteString(tw, entry.contents); err != nil { - t.Errorf("test %d, entry %d: Failed writing contents: %v", i, j, err) - continue testLoop - } - } - // Only interested in Close failures for the small tests. - if err := tw.Close(); err != nil && !big { - t.Errorf("test %d: Failed closing archive: %v", i, err) - continue testLoop - } - - actual := buf.Bytes() - if !bytes.Equal(expected, actual) { - t.Errorf("test %d: Incorrect result: (-=expected, +=actual)\n%v", - i, bytediff(expected, actual)) - } - if testing.Short() { // The second test is expensive. - break - } - } -} - -func TestPax(t *testing.T) { - // Create an archive with a large name - fileinfo, err := os.Stat("testdata/small.txt") - if err != nil { - t.Fatal(err) - } - hdr, err := FileInfoHeader(fileinfo, "") - if err != nil { - t.Fatalf("os.Stat: %v", err) - } - // Force a PAX long name to be written - longName := strings.Repeat("ab", 100) - contents := strings.Repeat(" ", int(hdr.Size)) - hdr.Name = longName - var buf bytes.Buffer - writer := NewWriter(&buf) - if err := writer.WriteHeader(hdr); err != nil { - t.Fatal(err) - } - if _, err = writer.Write([]byte(contents)); err != nil { - t.Fatal(err) - } - if err := writer.Close(); err != nil { - t.Fatal(err) - } - // Simple test to make sure PAX extensions are in effect - if !bytes.Contains(buf.Bytes(), []byte("PaxHeaders.0")) { - t.Fatal("Expected at least one PAX header to be written.") - } - // Test that we can get a long name back out of the archive. - reader := NewReader(&buf) - hdr, err = reader.Next() - if err != nil { - t.Fatal(err) - } - if hdr.Name != longName { - t.Fatal("Couldn't recover long file name") - } -} - -func TestPaxSymlink(t *testing.T) { - // Create an archive with a large linkname - fileinfo, err := os.Stat("testdata/small.txt") - if err != nil { - t.Fatal(err) - } - hdr, err := FileInfoHeader(fileinfo, "") - hdr.Typeflag = TypeSymlink - if err != nil { - t.Fatalf("os.Stat:1 %v", err) - } - // Force a PAX long linkname to be written - longLinkname := strings.Repeat("1234567890/1234567890", 10) - hdr.Linkname = longLinkname - - hdr.Size = 0 - var buf bytes.Buffer - writer := NewWriter(&buf) - if err := writer.WriteHeader(hdr); err != nil { - t.Fatal(err) - } - if err := writer.Close(); err != nil { - t.Fatal(err) - } - // Simple test to make sure PAX extensions are in effect - if !bytes.Contains(buf.Bytes(), []byte("PaxHeaders.0")) { - t.Fatal("Expected at least one PAX header to be written.") - } - // Test that we can get a long name back out of the archive. - reader := NewReader(&buf) - hdr, err = reader.Next() - if err != nil { - t.Fatal(err) - } - if hdr.Linkname != longLinkname { - t.Fatal("Couldn't recover long link name") - } -} - -func TestPaxNonAscii(t *testing.T) { - // Create an archive with non ascii. These should trigger a pax header - // because pax headers have a defined utf-8 encoding. - fileinfo, err := os.Stat("testdata/small.txt") - if err != nil { - t.Fatal(err) - } - - hdr, err := FileInfoHeader(fileinfo, "") - if err != nil { - t.Fatalf("os.Stat:1 %v", err) - } - - // some sample data - chineseFilename := "文件名" - chineseGroupname := "組" - chineseUsername := "用戶名" - - hdr.Name = chineseFilename - hdr.Gname = chineseGroupname - hdr.Uname = chineseUsername - - contents := strings.Repeat(" ", int(hdr.Size)) - - var buf bytes.Buffer - writer := NewWriter(&buf) - if err := writer.WriteHeader(hdr); err != nil { - t.Fatal(err) - } - if _, err = writer.Write([]byte(contents)); err != nil { - t.Fatal(err) - } - if err := writer.Close(); err != nil { - t.Fatal(err) - } - // Simple test to make sure PAX extensions are in effect - if !bytes.Contains(buf.Bytes(), []byte("PaxHeaders.0")) { - t.Fatal("Expected at least one PAX header to be written.") - } - // Test that we can get a long name back out of the archive. - reader := NewReader(&buf) - hdr, err = reader.Next() - if err != nil { - t.Fatal(err) - } - if hdr.Name != chineseFilename { - t.Fatal("Couldn't recover unicode name") - } - if hdr.Gname != chineseGroupname { - t.Fatal("Couldn't recover unicode group") - } - if hdr.Uname != chineseUsername { - t.Fatal("Couldn't recover unicode user") - } -} - -func TestPaxXattrs(t *testing.T) { - xattrs := map[string]string{ - "user.key": "value", - } - - // Create an archive with an xattr - fileinfo, err := os.Stat("testdata/small.txt") - if err != nil { - t.Fatal(err) - } - hdr, err := FileInfoHeader(fileinfo, "") - if err != nil { - t.Fatalf("os.Stat: %v", err) - } - contents := "Kilts" - hdr.Xattrs = xattrs - var buf bytes.Buffer - writer := NewWriter(&buf) - if err := writer.WriteHeader(hdr); err != nil { - t.Fatal(err) - } - if _, err = writer.Write([]byte(contents)); err != nil { - t.Fatal(err) - } - if err := writer.Close(); err != nil { - t.Fatal(err) - } - // Test that we can get the xattrs back out of the archive. - reader := NewReader(&buf) - hdr, err = reader.Next() - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(hdr.Xattrs, xattrs) { - t.Fatalf("xattrs did not survive round trip: got %+v, want %+v", - hdr.Xattrs, xattrs) - } -} - -func TestPaxHeadersSorted(t *testing.T) { - fileinfo, err := os.Stat("testdata/small.txt") - if err != nil { - t.Fatal(err) - } - hdr, err := FileInfoHeader(fileinfo, "") - if err != nil { - t.Fatalf("os.Stat: %v", err) - } - contents := strings.Repeat(" ", int(hdr.Size)) - - hdr.Xattrs = map[string]string{ - "foo": "foo", - "bar": "bar", - "baz": "baz", - "qux": "qux", - } - - var buf bytes.Buffer - writer := NewWriter(&buf) - if err := writer.WriteHeader(hdr); err != nil { - t.Fatal(err) - } - if _, err = writer.Write([]byte(contents)); err != nil { - t.Fatal(err) - } - if err := writer.Close(); err != nil { - t.Fatal(err) - } - // Simple test to make sure PAX extensions are in effect - if !bytes.Contains(buf.Bytes(), []byte("PaxHeaders.0")) { - t.Fatal("Expected at least one PAX header to be written.") - } - - // xattr bar should always appear before others - indices := []int{ - bytes.Index(buf.Bytes(), []byte("bar=bar")), - bytes.Index(buf.Bytes(), []byte("baz=baz")), - bytes.Index(buf.Bytes(), []byte("foo=foo")), - bytes.Index(buf.Bytes(), []byte("qux=qux")), - } - if !sort.IntsAreSorted(indices) { - t.Fatal("PAX headers are not sorted") - } -} - -func TestUSTARLongName(t *testing.T) { - // Create an archive with a path that failed to split with USTAR extension in previous versions. - fileinfo, err := os.Stat("testdata/small.txt") - if err != nil { - t.Fatal(err) - } - hdr, err := FileInfoHeader(fileinfo, "") - hdr.Typeflag = TypeDir - if err != nil { - t.Fatalf("os.Stat:1 %v", err) - } - // Force a PAX long name to be written. The name was taken from a practical example - // that fails and replaced ever char through numbers to anonymize the sample. - longName := "/0000_0000000/00000-000000000/0000_0000000/00000-0000000000000/0000_0000000/00000-0000000-00000000/0000_0000000/00000000/0000_0000000/000/0000_0000000/00000000v00/0000_0000000/000000/0000_0000000/0000000/0000_0000000/00000y-00/0000/0000/00000000/0x000000/" - hdr.Name = longName - - hdr.Size = 0 - var buf bytes.Buffer - writer := NewWriter(&buf) - if err := writer.WriteHeader(hdr); err != nil { - t.Fatal(err) - } - if err := writer.Close(); err != nil { - t.Fatal(err) - } - // Test that we can get a long name back out of the archive. - reader := NewReader(&buf) - hdr, err = reader.Next() - if err != nil { - t.Fatal(err) - } - if hdr.Name != longName { - t.Fatal("Couldn't recover long name") - } -} - -func TestValidTypeflagWithPAXHeader(t *testing.T) { - var buffer bytes.Buffer - tw := NewWriter(&buffer) - - fileName := strings.Repeat("ab", 100) - - hdr := &Header{ - Name: fileName, - Size: 4, - Typeflag: 0, - } - if err := tw.WriteHeader(hdr); err != nil { - t.Fatalf("Failed to write header: %s", err) - } - if _, err := tw.Write([]byte("fooo")); err != nil { - t.Fatalf("Failed to write the file's data: %s", err) - } - tw.Close() - - tr := NewReader(&buffer) - - for { - header, err := tr.Next() - if err == io.EOF { - break - } - if err != nil { - t.Fatalf("Failed to read header: %s", err) - } - if header.Typeflag != 0 { - t.Fatalf("Typeflag should've been 0, found %d", header.Typeflag) - } - } -} - -func TestWriteAfterClose(t *testing.T) { - var buffer bytes.Buffer - tw := NewWriter(&buffer) - - hdr := &Header{ - Name: "small.txt", - Size: 5, - } - if err := tw.WriteHeader(hdr); err != nil { - t.Fatalf("Failed to write header: %s", err) - } - tw.Close() - if _, err := tw.Write([]byte("Kilts")); err != ErrWriteAfterClose { - t.Fatalf("Write: got %v; want ErrWriteAfterClose", err) - } -} - -func TestSplitUSTARPath(t *testing.T) { - var sr = strings.Repeat - - var vectors = []struct { - input string // Input path - prefix string // Expected output prefix - suffix string // Expected output suffix - ok bool // Split success? - }{ - {"", "", "", false}, - {"abc", "", "", false}, - {"用戶名", "", "", false}, - {sr("a", fileNameSize), "", "", false}, - {sr("a", fileNameSize) + "/", "", "", false}, - {sr("a", fileNameSize) + "/a", sr("a", fileNameSize), "a", true}, - {sr("a", fileNamePrefixSize) + "/", "", "", false}, - {sr("a", fileNamePrefixSize) + "/a", sr("a", fileNamePrefixSize), "a", true}, - {sr("a", fileNameSize+1), "", "", false}, - {sr("/", fileNameSize+1), sr("/", fileNameSize-1), "/", true}, - {sr("a", fileNamePrefixSize) + "/" + sr("b", fileNameSize), - sr("a", fileNamePrefixSize), sr("b", fileNameSize), true}, - {sr("a", fileNamePrefixSize) + "//" + sr("b", fileNameSize), "", "", false}, - {sr("a/", fileNameSize), sr("a/", 77) + "a", sr("a/", 22), true}, - } - - for _, v := range vectors { - prefix, suffix, ok := splitUSTARPath(v.input) - if prefix != v.prefix || suffix != v.suffix || ok != v.ok { - t.Errorf("splitUSTARPath(%q):\ngot (%q, %q, %v)\nwant (%q, %q, %v)", - v.input, prefix, suffix, ok, v.prefix, v.suffix, v.ok) - } - } -} - -func TestFormatPAXRecord(t *testing.T) { - var medName = strings.Repeat("CD", 50) - var longName = strings.Repeat("AB", 100) - - var vectors = []struct { - inputKey string - inputVal string - output string - }{ - {"k", "v", "6 k=v\n"}, - {"path", "/etc/hosts", "19 path=/etc/hosts\n"}, - {"path", longName, "210 path=" + longName + "\n"}, - {"path", medName, "110 path=" + medName + "\n"}, - {"foo", "ba", "9 foo=ba\n"}, - {"foo", "bar", "11 foo=bar\n"}, - {"foo", "b=\nar=\n==\x00", "18 foo=b=\nar=\n==\x00\n"}, - {"foo", "hello9 foo=ba\nworld", "27 foo=hello9 foo=ba\nworld\n"}, - {"☺☻☹", "日a本b語ç", "27 ☺☻☹=日a本b語ç\n"}, - {"\x00hello", "\x00world", "17 \x00hello=\x00world\n"}, - } - - for _, v := range vectors { - output := formatPAXRecord(v.inputKey, v.inputVal) - if output != v.output { - t.Errorf("formatPAXRecord(%q, %q): got %q, want %q", - v.inputKey, v.inputVal, output, v.output) - } - } -} - -func TestFitsInBase256(t *testing.T) { - var vectors = []struct { - input int64 - width int - ok bool - }{ - {+1, 8, true}, - {0, 8, true}, - {-1, 8, true}, - {1 << 56, 8, false}, - {(1 << 56) - 1, 8, true}, - {-1 << 56, 8, true}, - {(-1 << 56) - 1, 8, false}, - {121654, 8, true}, - {-9849849, 8, true}, - {math.MaxInt64, 9, true}, - {0, 9, true}, - {math.MinInt64, 9, true}, - {math.MaxInt64, 12, true}, - {0, 12, true}, - {math.MinInt64, 12, true}, - } - - for _, v := range vectors { - ok := fitsInBase256(v.width, v.input) - if ok != v.ok { - t.Errorf("checkNumeric(%d, %d): got %v, want %v", v.input, v.width, ok, v.ok) - } - } -} - -func TestFormatNumeric(t *testing.T) { - var vectors = []struct { - input int64 - output string - ok bool - }{ - // Test base-256 (binary) encoded values. - {-1, "\xff", true}, - {-1, "\xff\xff", true}, - {-1, "\xff\xff\xff", true}, - {(1 << 0), "0", false}, - {(1 << 8) - 1, "\x80\xff", true}, - {(1 << 8), "0\x00", false}, - {(1 << 16) - 1, "\x80\xff\xff", true}, - {(1 << 16), "00\x00", false}, - {-1 * (1 << 0), "\xff", true}, - {-1*(1<<0) - 1, "0", false}, - {-1 * (1 << 8), "\xff\x00", true}, - {-1*(1<<8) - 1, "0\x00", false}, - {-1 * (1 << 16), "\xff\x00\x00", true}, - {-1*(1<<16) - 1, "00\x00", false}, - {537795476381659745, "0000000\x00", false}, - {537795476381659745, "\x80\x00\x00\x00\x07\x76\xa2\x22\xeb\x8a\x72\x61", true}, - {-615126028225187231, "0000000\x00", false}, - {-615126028225187231, "\xff\xff\xff\xff\xf7\x76\xa2\x22\xeb\x8a\x72\x61", true}, - {math.MaxInt64, "0000000\x00", false}, - {math.MaxInt64, "\x80\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff", true}, - {math.MinInt64, "0000000\x00", false}, - {math.MinInt64, "\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00", true}, - {math.MaxInt64, "\x80\x7f\xff\xff\xff\xff\xff\xff\xff", true}, - {math.MinInt64, "\xff\x80\x00\x00\x00\x00\x00\x00\x00", true}, - } - - for _, v := range vectors { - var f formatter - output := make([]byte, len(v.output)) - f.formatNumeric(output, v.input) - ok := (f.err == nil) - if ok != v.ok { - if v.ok { - t.Errorf("formatNumeric(%d): got formatting failure, want success", v.input) - } else { - t.Errorf("formatNumeric(%d): got formatting success, want failure", v.input) - } - } - if string(output) != v.output { - t.Errorf("formatNumeric(%d): got %q, want %q", v.input, output, v.output) - } - } -} - -func TestFormatPAXTime(t *testing.T) { - t1 := time.Date(2000, 1, 1, 11, 0, 0, 0, time.UTC) - t2 := time.Date(2000, 1, 1, 11, 0, 0, 100, time.UTC) - t3 := time.Date(1960, 1, 1, 11, 0, 0, 0, time.UTC) - t4 := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC) - verify := func(time time.Time, s string) { - p := formatPAXTime(time) - if p != s { - t.Errorf("for %v, expected %s, got %s", time, s, p) - } - } - verify(t1, "946724400") - verify(t2, "946724400.000000100") - verify(t3, "-315579600") - verify(t4, "0") -} diff --git a/vendor/github.com/Microsoft/go-winio/backuptar/noop.go b/vendor/github.com/Microsoft/go-winio/backuptar/noop.go deleted file mode 100644 index d39eccf02..000000000 --- a/vendor/github.com/Microsoft/go-winio/backuptar/noop.go +++ /dev/null @@ -1,4 +0,0 @@ -// +build !windows -// This file only exists to allow go get on non-Windows platforms. - -package backuptar diff --git a/vendor/github.com/Microsoft/go-winio/backuptar/tar.go b/vendor/github.com/Microsoft/go-winio/backuptar/tar.go deleted file mode 100644 index 53da908f1..000000000 --- a/vendor/github.com/Microsoft/go-winio/backuptar/tar.go +++ /dev/null @@ -1,439 +0,0 @@ -// +build windows - -package backuptar - -import ( - "encoding/base64" - "errors" - "fmt" - "io" - "io/ioutil" - "path/filepath" - "strconv" - "strings" - "syscall" - "time" - - "github.com/Microsoft/go-winio" - "github.com/Microsoft/go-winio/archive/tar" // until archive/tar supports pax extensions in its interface -) - -const ( - c_ISUID = 04000 // Set uid - c_ISGID = 02000 // Set gid - c_ISVTX = 01000 // Save text (sticky bit) - c_ISDIR = 040000 // Directory - c_ISFIFO = 010000 // FIFO - c_ISREG = 0100000 // Regular file - c_ISLNK = 0120000 // Symbolic link - c_ISBLK = 060000 // Block special file - c_ISCHR = 020000 // Character special file - c_ISSOCK = 0140000 // Socket -) - -const ( - hdrFileAttributes = "fileattr" - hdrSecurityDescriptor = "sd" - hdrRawSecurityDescriptor = "rawsd" - hdrMountPoint = "mountpoint" - hdrEaPrefix = "xattr." -) - -func writeZeroes(w io.Writer, count int64) error { - buf := make([]byte, 8192) - c := len(buf) - for i := int64(0); i < count; i += int64(c) { - if int64(c) > count-i { - c = int(count - i) - } - _, err := w.Write(buf[:c]) - if err != nil { - return err - } - } - return nil -} - -func copySparse(t *tar.Writer, br *winio.BackupStreamReader) error { - curOffset := int64(0) - for { - bhdr, err := br.Next() - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - if err != nil { - return err - } - if bhdr.Id != winio.BackupSparseBlock { - return fmt.Errorf("unexpected stream %d", bhdr.Id) - } - - // archive/tar does not support writing sparse files - // so just write zeroes to catch up to the current offset. - err = writeZeroes(t, bhdr.Offset-curOffset) - if bhdr.Size == 0 { - break - } - n, err := io.Copy(t, br) - if err != nil { - return err - } - curOffset = bhdr.Offset + n - } - return nil -} - -// BasicInfoHeader creates a tar header from basic file information. -func BasicInfoHeader(name string, size int64, fileInfo *winio.FileBasicInfo) *tar.Header { - hdr := &tar.Header{ - Name: filepath.ToSlash(name), - Size: size, - Typeflag: tar.TypeReg, - ModTime: time.Unix(0, fileInfo.LastWriteTime.Nanoseconds()), - ChangeTime: time.Unix(0, fileInfo.ChangeTime.Nanoseconds()), - AccessTime: time.Unix(0, fileInfo.LastAccessTime.Nanoseconds()), - CreationTime: time.Unix(0, fileInfo.CreationTime.Nanoseconds()), - Winheaders: make(map[string]string), - } - hdr.Winheaders[hdrFileAttributes] = fmt.Sprintf("%d", fileInfo.FileAttributes) - - if (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 { - hdr.Mode |= c_ISDIR - hdr.Size = 0 - hdr.Typeflag = tar.TypeDir - } - return hdr -} - -// WriteTarFileFromBackupStream writes a file to a tar writer using data from a Win32 backup stream. -// -// This encodes Win32 metadata as tar pax vendor extensions starting with MSWINDOWS. -// -// The additional Win32 metadata is: -// -// MSWINDOWS.fileattr: The Win32 file attributes, as a decimal value -// -// MSWINDOWS.rawsd: The Win32 security descriptor, in raw binary format -// -// MSWINDOWS.mountpoint: If present, this is a mount point and not a symlink, even though the type is '2' (symlink) -func WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size int64, fileInfo *winio.FileBasicInfo) error { - name = filepath.ToSlash(name) - hdr := BasicInfoHeader(name, size, fileInfo) - - // If r can be seeked, then this function is two-pass: pass 1 collects the - // tar header data, and pass 2 copies the data stream. If r cannot be - // seeked, then some header data (in particular EAs) will be silently lost. - var ( - restartPos int64 - err error - ) - sr, readTwice := r.(io.Seeker) - if readTwice { - if restartPos, err = sr.Seek(0, io.SeekCurrent); err != nil { - readTwice = false - } - } - - br := winio.NewBackupStreamReader(r) - var dataHdr *winio.BackupHeader - for dataHdr == nil { - bhdr, err := br.Next() - if err == io.EOF { - break - } - if err != nil { - return err - } - switch bhdr.Id { - case winio.BackupData: - hdr.Mode |= c_ISREG - if !readTwice { - dataHdr = bhdr - } - case winio.BackupSecurity: - sd, err := ioutil.ReadAll(br) - if err != nil { - return err - } - hdr.Winheaders[hdrRawSecurityDescriptor] = base64.StdEncoding.EncodeToString(sd) - - case winio.BackupReparseData: - hdr.Mode |= c_ISLNK - hdr.Typeflag = tar.TypeSymlink - reparseBuffer, err := ioutil.ReadAll(br) - rp, err := winio.DecodeReparsePoint(reparseBuffer) - if err != nil { - return err - } - if rp.IsMountPoint { - hdr.Winheaders[hdrMountPoint] = "1" - } - hdr.Linkname = rp.Target - - case winio.BackupEaData: - eab, err := ioutil.ReadAll(br) - if err != nil { - return err - } - eas, err := winio.DecodeExtendedAttributes(eab) - if err != nil { - return err - } - for _, ea := range eas { - // Use base64 encoding for the binary value. Note that there - // is no way to encode the EA's flags, since their use doesn't - // make any sense for persisted EAs. - hdr.Winheaders[hdrEaPrefix+ea.Name] = base64.StdEncoding.EncodeToString(ea.Value) - } - - case winio.BackupAlternateData, winio.BackupLink, winio.BackupPropertyData, winio.BackupObjectId, winio.BackupTxfsData: - // ignore these streams - default: - return fmt.Errorf("%s: unknown stream ID %d", name, bhdr.Id) - } - } - - err = t.WriteHeader(hdr) - if err != nil { - return err - } - - if readTwice { - // Get back to the data stream. - if _, err = sr.Seek(restartPos, io.SeekStart); err != nil { - return err - } - for dataHdr == nil { - bhdr, err := br.Next() - if err == io.EOF { - break - } - if err != nil { - return err - } - if bhdr.Id == winio.BackupData { - dataHdr = bhdr - } - } - } - - if dataHdr != nil { - // A data stream was found. Copy the data. - if (dataHdr.Attributes & winio.StreamSparseAttributes) == 0 { - if size != dataHdr.Size { - return fmt.Errorf("%s: mismatch between file size %d and header size %d", name, size, dataHdr.Size) - } - _, err = io.Copy(t, br) - if err != nil { - return err - } - } else { - err = copySparse(t, br) - if err != nil { - return err - } - } - } - - // Look for streams after the data stream. The only ones we handle are alternate data streams. - // Other streams may have metadata that could be serialized, but the tar header has already - // been written. In practice, this means that we don't get EA or TXF metadata. - for { - bhdr, err := br.Next() - if err == io.EOF { - break - } - if err != nil { - return err - } - switch bhdr.Id { - case winio.BackupAlternateData: - altName := bhdr.Name - if strings.HasSuffix(altName, ":$DATA") { - altName = altName[:len(altName)-len(":$DATA")] - } - if (bhdr.Attributes & winio.StreamSparseAttributes) == 0 { - hdr = &tar.Header{ - Name: name + altName, - Mode: hdr.Mode, - Typeflag: tar.TypeReg, - Size: bhdr.Size, - ModTime: hdr.ModTime, - AccessTime: hdr.AccessTime, - ChangeTime: hdr.ChangeTime, - } - err = t.WriteHeader(hdr) - if err != nil { - return err - } - _, err = io.Copy(t, br) - if err != nil { - return err - } - - } else { - // Unsupported for now, since the size of the alternate stream is not present - // in the backup stream until after the data has been read. - return errors.New("tar of sparse alternate data streams is unsupported") - } - case winio.BackupEaData, winio.BackupLink, winio.BackupPropertyData, winio.BackupObjectId, winio.BackupTxfsData: - // ignore these streams - default: - return fmt.Errorf("%s: unknown stream ID %d after data", name, bhdr.Id) - } - } - return nil -} - -// FileInfoFromHeader retrieves basic Win32 file information from a tar header, using the additional metadata written by -// WriteTarFileFromBackupStream. -func FileInfoFromHeader(hdr *tar.Header) (name string, size int64, fileInfo *winio.FileBasicInfo, err error) { - name = hdr.Name - if hdr.Typeflag == tar.TypeReg || hdr.Typeflag == tar.TypeRegA { - size = hdr.Size - } - fileInfo = &winio.FileBasicInfo{ - LastAccessTime: syscall.NsecToFiletime(hdr.AccessTime.UnixNano()), - LastWriteTime: syscall.NsecToFiletime(hdr.ModTime.UnixNano()), - ChangeTime: syscall.NsecToFiletime(hdr.ChangeTime.UnixNano()), - CreationTime: syscall.NsecToFiletime(hdr.CreationTime.UnixNano()), - } - if attrStr, ok := hdr.Winheaders[hdrFileAttributes]; ok { - attr, err := strconv.ParseUint(attrStr, 10, 32) - if err != nil { - return "", 0, nil, err - } - fileInfo.FileAttributes = uintptr(attr) - } else { - if hdr.Typeflag == tar.TypeDir { - fileInfo.FileAttributes |= syscall.FILE_ATTRIBUTE_DIRECTORY - } - } - return -} - -// WriteBackupStreamFromTarFile writes a Win32 backup stream from the current tar file. Since this function may process multiple -// tar file entries in order to collect all the alternate data streams for the file, it returns the next -// tar file that was not processed, or io.EOF is there are no more. -func WriteBackupStreamFromTarFile(w io.Writer, t *tar.Reader, hdr *tar.Header) (*tar.Header, error) { - bw := winio.NewBackupStreamWriter(w) - var sd []byte - var err error - // Maintaining old SDDL-based behavior for backward compatibility. All new tar headers written - // by this library will have raw binary for the security descriptor. - if sddl, ok := hdr.Winheaders[hdrSecurityDescriptor]; ok { - sd, err = winio.SddlToSecurityDescriptor(sddl) - if err != nil { - return nil, err - } - } - if sdraw, ok := hdr.Winheaders[hdrRawSecurityDescriptor]; ok { - sd, err = base64.StdEncoding.DecodeString(sdraw) - if err != nil { - return nil, err - } - } - if len(sd) != 0 { - bhdr := winio.BackupHeader{ - Id: winio.BackupSecurity, - Size: int64(len(sd)), - } - err := bw.WriteHeader(&bhdr) - if err != nil { - return nil, err - } - _, err = bw.Write(sd) - if err != nil { - return nil, err - } - } - var eas []winio.ExtendedAttribute - for k, v := range hdr.Winheaders { - if !strings.HasPrefix(k, hdrEaPrefix) { - continue - } - data, err := base64.StdEncoding.DecodeString(v) - if err != nil { - return nil, err - } - eas = append(eas, winio.ExtendedAttribute{ - Name: k[len(hdrEaPrefix):], - Value: data, - }) - } - if len(eas) != 0 { - eadata, err := winio.EncodeExtendedAttributes(eas) - if err != nil { - return nil, err - } - bhdr := winio.BackupHeader{ - Id: winio.BackupEaData, - Size: int64(len(eadata)), - } - err = bw.WriteHeader(&bhdr) - if err != nil { - return nil, err - } - _, err = bw.Write(eadata) - if err != nil { - return nil, err - } - } - if hdr.Typeflag == tar.TypeSymlink { - _, isMountPoint := hdr.Winheaders[hdrMountPoint] - rp := winio.ReparsePoint{ - Target: filepath.FromSlash(hdr.Linkname), - IsMountPoint: isMountPoint, - } - reparse := winio.EncodeReparsePoint(&rp) - bhdr := winio.BackupHeader{ - Id: winio.BackupReparseData, - Size: int64(len(reparse)), - } - err := bw.WriteHeader(&bhdr) - if err != nil { - return nil, err - } - _, err = bw.Write(reparse) - if err != nil { - return nil, err - } - } - if hdr.Typeflag == tar.TypeReg || hdr.Typeflag == tar.TypeRegA { - bhdr := winio.BackupHeader{ - Id: winio.BackupData, - Size: hdr.Size, - } - err := bw.WriteHeader(&bhdr) - if err != nil { - return nil, err - } - _, err = io.Copy(bw, t) - if err != nil { - return nil, err - } - } - // Copy all the alternate data streams and return the next non-ADS header. - for { - ahdr, err := t.Next() - if err != nil { - return nil, err - } - if ahdr.Typeflag != tar.TypeReg || !strings.HasPrefix(ahdr.Name, hdr.Name+":") { - return ahdr, nil - } - bhdr := winio.BackupHeader{ - Id: winio.BackupAlternateData, - Size: ahdr.Size, - Name: ahdr.Name[len(hdr.Name):] + ":$DATA", - } - err = bw.WriteHeader(&bhdr) - if err != nil { - return nil, err - } - _, err = io.Copy(bw, t) - if err != nil { - return nil, err - } - } -} diff --git a/vendor/github.com/Microsoft/go-winio/backuptar/tar_test.go b/vendor/github.com/Microsoft/go-winio/backuptar/tar_test.go deleted file mode 100644 index e04d47f29..000000000 --- a/vendor/github.com/Microsoft/go-winio/backuptar/tar_test.go +++ /dev/null @@ -1,84 +0,0 @@ -package backuptar - -import ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "testing" - - "github.com/Microsoft/go-winio" - "github.com/Microsoft/go-winio/archive/tar" -) - -func ensurePresent(t *testing.T, m map[string]string, keys ...string) { - for _, k := range keys { - if _, ok := m[k]; !ok { - t.Error(k, "not present in tar header") - } - } -} - -func TestRoundTrip(t *testing.T) { - f, err := ioutil.TempFile("", "tst") - if err != nil { - t.Fatal(err) - } - defer f.Close() - defer os.Remove(f.Name()) - - if _, err = f.Write([]byte("testing 1 2 3\n")); err != nil { - t.Fatal(err) - } - - if _, err = f.Seek(0, 0); err != nil { - t.Fatal(err) - } - - fi, err := f.Stat() - if err != nil { - t.Fatal(err) - } - - bi, err := winio.GetFileBasicInfo(f) - if err != nil { - t.Fatal(err) - } - - br := winio.NewBackupFileReader(f, true) - defer br.Close() - - var buf bytes.Buffer - tw := tar.NewWriter(&buf) - - err = WriteTarFileFromBackupStream(tw, br, f.Name(), fi.Size(), bi) - if err != nil { - t.Fatal(err) - } - - tr := tar.NewReader(&buf) - hdr, err := tr.Next() - if err != nil { - t.Fatal(err) - } - - name, size, bi2, err := FileInfoFromHeader(hdr) - if err != nil { - t.Fatal(err) - } - - if name != filepath.ToSlash(f.Name()) { - t.Errorf("got name %s, expected %s", name, filepath.ToSlash(f.Name())) - } - - if size != fi.Size() { - t.Errorf("got size %d, expected %d", size, fi.Size()) - } - - if !reflect.DeepEqual(*bi, *bi2) { - t.Errorf("got %#v, expected %#v", *bi, *bi2) - } - - ensurePresent(t, hdr.Winheaders, "fileattr", "rawsd") -} diff --git a/vendor/github.com/Microsoft/go-winio/vhd/mksyscall_windows.go b/vendor/github.com/Microsoft/go-winio/vhd/mksyscall_windows.go deleted file mode 100644 index 977fef815..000000000 --- a/vendor/github.com/Microsoft/go-winio/vhd/mksyscall_windows.go +++ /dev/null @@ -1,901 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Hard-coding unicode mode for VHD library. - -// +build ignore - -/* -mksyscall_windows generates windows system call bodies - -It parses all files specified on command line containing function -prototypes (like syscall_windows.go) and prints system call bodies -to standard output. - -The prototypes are marked by lines beginning with "//sys" and read -like func declarations if //sys is replaced by func, but: - -* The parameter lists must give a name for each argument. This - includes return parameters. - -* The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - -* If the return parameter is an error number, it must be named err. - -* If go func name needs to be different from it's winapi dll name, - the winapi name could be specified at the end, after "=" sign, like - //sys LoadLibrary(libname string) (handle uint32, err error) = LoadLibraryA - -* Each function that returns err needs to supply a condition, that - return value of winapi will be tested against to detect failure. - This would set err to windows "last-error", otherwise it will be nil. - The value can be provided at end of //sys declaration, like - //sys LoadLibrary(libname string) (handle uint32, err error) [failretval==-1] = LoadLibraryA - and is [failretval==0] by default. - -Usage: - mksyscall_windows [flags] [path ...] - -The flags are: - -output - Specify output file name (outputs to console if blank). - -trace - Generate print statement after every syscall. -*/ -package main - -import ( - "bufio" - "bytes" - "errors" - "flag" - "fmt" - "go/format" - "go/parser" - "go/token" - "io" - "io/ioutil" - "log" - "os" - "path/filepath" - "runtime" - "sort" - "strconv" - "strings" - "text/template" -) - -var ( - filename = flag.String("output", "", "output file name (standard output if omitted)") - printTraceFlag = flag.Bool("trace", false, "generate print statement after every syscall") - systemDLL = flag.Bool("systemdll", true, "whether all DLLs should be loaded from the Windows system directory") -) - -func trim(s string) string { - return strings.Trim(s, " \t") -} - -var packageName string - -func packagename() string { - return packageName -} - -func syscalldot() string { - if packageName == "syscall" { - return "" - } - return "syscall." -} - -// Param is function parameter -type Param struct { - Name string - Type string - fn *Fn - tmpVarIdx int -} - -// tmpVar returns temp variable name that will be used to represent p during syscall. -func (p *Param) tmpVar() string { - if p.tmpVarIdx < 0 { - p.tmpVarIdx = p.fn.curTmpVarIdx - p.fn.curTmpVarIdx++ - } - return fmt.Sprintf("_p%d", p.tmpVarIdx) -} - -// BoolTmpVarCode returns source code for bool temp variable. -func (p *Param) BoolTmpVarCode() string { - const code = `var %s uint32 - if %s { - %s = 1 - } else { - %s = 0 - }` - tmp := p.tmpVar() - return fmt.Sprintf(code, tmp, p.Name, tmp, tmp) -} - -// SliceTmpVarCode returns source code for slice temp variable. -func (p *Param) SliceTmpVarCode() string { - const code = `var %s *%s - if len(%s) > 0 { - %s = &%s[0] - }` - tmp := p.tmpVar() - return fmt.Sprintf(code, tmp, p.Type[2:], p.Name, tmp, p.Name) -} - -// StringTmpVarCode returns source code for string temp variable. -func (p *Param) StringTmpVarCode() string { - errvar := p.fn.Rets.ErrorVarName() - if errvar == "" { - errvar = "_" - } - tmp := p.tmpVar() - const code = `var %s %s - %s, %s = %s(%s)` - s := fmt.Sprintf(code, tmp, p.fn.StrconvType(), tmp, errvar, p.fn.StrconvFunc(), p.Name) - if errvar == "-" { - return s - } - const morecode = ` - if %s != nil { - return - }` - return s + fmt.Sprintf(morecode, errvar) -} - -// TmpVarCode returns source code for temp variable. -func (p *Param) TmpVarCode() string { - switch { - case p.Type == "bool": - return p.BoolTmpVarCode() - case strings.HasPrefix(p.Type, "[]"): - return p.SliceTmpVarCode() - default: - return "" - } -} - -// TmpVarHelperCode returns source code for helper's temp variable. -func (p *Param) TmpVarHelperCode() string { - if p.Type != "string" { - return "" - } - return p.StringTmpVarCode() -} - -// SyscallArgList returns source code fragments representing p parameter -// in syscall. Slices are translated into 2 syscall parameters: pointer to -// the first element and length. -func (p *Param) SyscallArgList() []string { - t := p.HelperType() - var s string - switch { - case t[0] == '*': - s = fmt.Sprintf("unsafe.Pointer(%s)", p.Name) - case t == "bool": - s = p.tmpVar() - case strings.HasPrefix(t, "[]"): - return []string{ - fmt.Sprintf("uintptr(unsafe.Pointer(%s))", p.tmpVar()), - fmt.Sprintf("uintptr(len(%s))", p.Name), - } - default: - s = p.Name - } - return []string{fmt.Sprintf("uintptr(%s)", s)} -} - -// IsError determines if p parameter is used to return error. -func (p *Param) IsError() bool { - return p.Name == "err" && p.Type == "error" -} - -// HelperType returns type of parameter p used in helper function. -func (p *Param) HelperType() string { - if p.Type == "string" { - return p.fn.StrconvType() - } - return p.Type -} - -// join concatenates parameters ps into a string with sep separator. -// Each parameter is converted into string by applying fn to it -// before conversion. -func join(ps []*Param, fn func(*Param) string, sep string) string { - if len(ps) == 0 { - return "" - } - a := make([]string, 0) - for _, p := range ps { - a = append(a, fn(p)) - } - return strings.Join(a, sep) -} - -// Rets describes function return parameters. -type Rets struct { - Name string - Type string - ReturnsError bool - FailCond string -} - -// ErrorVarName returns error variable name for r. -func (r *Rets) ErrorVarName() string { - if r.ReturnsError { - return "err" - } - if r.Type == "error" { - return r.Name - } - return "" -} - -// ToParams converts r into slice of *Param. -func (r *Rets) ToParams() []*Param { - ps := make([]*Param, 0) - if len(r.Name) > 0 { - ps = append(ps, &Param{Name: r.Name, Type: r.Type}) - } - if r.ReturnsError { - ps = append(ps, &Param{Name: "err", Type: "error"}) - } - return ps -} - -// List returns source code of syscall return parameters. -func (r *Rets) List() string { - s := join(r.ToParams(), func(p *Param) string { return p.Name + " " + p.Type }, ", ") - if len(s) > 0 { - s = "(" + s + ")" - } - return s -} - -// PrintList returns source code of trace printing part correspondent -// to syscall return values. -func (r *Rets) PrintList() string { - return join(r.ToParams(), func(p *Param) string { return fmt.Sprintf(`"%s=", %s, `, p.Name, p.Name) }, `", ", `) -} - -// SetReturnValuesCode returns source code that accepts syscall return values. -func (r *Rets) SetReturnValuesCode() string { - if r.Name == "" && !r.ReturnsError { - return "" - } - retvar := "r0" - if r.Name == "" { - retvar = "r1" - } - errvar := "_" - if r.ReturnsError { - errvar = "e1" - } - return fmt.Sprintf("%s, _, %s := ", retvar, errvar) -} - -func (r *Rets) useLongHandleErrorCode(retvar string) string { - const code = `if %s { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = %sEINVAL - } - }` - cond := retvar + " == 0" - if r.FailCond != "" { - cond = strings.Replace(r.FailCond, "failretval", retvar, 1) - } - return fmt.Sprintf(code, cond, syscalldot()) -} - -// SetErrorCode returns source code that sets return parameters. -func (r *Rets) SetErrorCode() string { - const code = `if r0 != 0 { - %s = %sErrno(r0) - }` - if r.Name == "" && !r.ReturnsError { - return "" - } - if r.Name == "" { - return r.useLongHandleErrorCode("r1") - } - if r.Type == "error" { - return fmt.Sprintf(code, r.Name, syscalldot()) - } - s := "" - switch { - case r.Type[0] == '*': - s = fmt.Sprintf("%s = (%s)(unsafe.Pointer(r0))", r.Name, r.Type) - case r.Type == "bool": - s = fmt.Sprintf("%s = r0 != 0", r.Name) - default: - s = fmt.Sprintf("%s = %s(r0)", r.Name, r.Type) - } - if !r.ReturnsError { - return s - } - return s + "\n\t" + r.useLongHandleErrorCode(r.Name) -} - -// Fn describes syscall function. -type Fn struct { - Name string - Params []*Param - Rets *Rets - PrintTrace bool - dllname string - dllfuncname string - src string - // TODO: get rid of this field and just use parameter index instead - curTmpVarIdx int // insure tmp variables have uniq names -} - -// extractParams parses s to extract function parameters. -func extractParams(s string, f *Fn) ([]*Param, error) { - s = trim(s) - if s == "" { - return nil, nil - } - a := strings.Split(s, ",") - ps := make([]*Param, len(a)) - for i := range ps { - s2 := trim(a[i]) - b := strings.Split(s2, " ") - if len(b) != 2 { - b = strings.Split(s2, "\t") - if len(b) != 2 { - return nil, errors.New("Could not extract function parameter from \"" + s2 + "\"") - } - } - ps[i] = &Param{ - Name: trim(b[0]), - Type: trim(b[1]), - fn: f, - tmpVarIdx: -1, - } - } - return ps, nil -} - -// extractSection extracts text out of string s starting after start -// and ending just before end. found return value will indicate success, -// and prefix, body and suffix will contain correspondent parts of string s. -func extractSection(s string, start, end rune) (prefix, body, suffix string, found bool) { - s = trim(s) - if strings.HasPrefix(s, string(start)) { - // no prefix - body = s[1:] - } else { - a := strings.SplitN(s, string(start), 2) - if len(a) != 2 { - return "", "", s, false - } - prefix = a[0] - body = a[1] - } - a := strings.SplitN(body, string(end), 2) - if len(a) != 2 { - return "", "", "", false - } - return prefix, a[0], a[1], true -} - -// newFn parses string s and return created function Fn. -func newFn(s string) (*Fn, error) { - s = trim(s) - f := &Fn{ - Rets: &Rets{}, - src: s, - PrintTrace: *printTraceFlag, - } - // function name and args - prefix, body, s, found := extractSection(s, '(', ')') - if !found || prefix == "" { - return nil, errors.New("Could not extract function name and parameters from \"" + f.src + "\"") - } - f.Name = prefix - var err error - f.Params, err = extractParams(body, f) - if err != nil { - return nil, err - } - // return values - _, body, s, found = extractSection(s, '(', ')') - if found { - r, err := extractParams(body, f) - if err != nil { - return nil, err - } - switch len(r) { - case 0: - case 1: - if r[0].IsError() { - f.Rets.ReturnsError = true - } else { - f.Rets.Name = r[0].Name - f.Rets.Type = r[0].Type - } - case 2: - if !r[1].IsError() { - return nil, errors.New("Only last windows error is allowed as second return value in \"" + f.src + "\"") - } - f.Rets.ReturnsError = true - f.Rets.Name = r[0].Name - f.Rets.Type = r[0].Type - default: - return nil, errors.New("Too many return values in \"" + f.src + "\"") - } - } - // fail condition - _, body, s, found = extractSection(s, '[', ']') - if found { - f.Rets.FailCond = body - } - // dll and dll function names - s = trim(s) - if s == "" { - return f, nil - } - if !strings.HasPrefix(s, "=") { - return nil, errors.New("Could not extract dll name from \"" + f.src + "\"") - } - s = trim(s[1:]) - a := strings.Split(s, ".") - switch len(a) { - case 1: - f.dllfuncname = a[0] - case 2: - f.dllname = a[0] - f.dllfuncname = a[1] - default: - return nil, errors.New("Could not extract dll name from \"" + f.src + "\"") - } - return f, nil -} - -// DLLName returns DLL name for function f. -func (f *Fn) DLLName() string { - if f.dllname == "" { - return "kernel32" - } - return f.dllname -} - -// DLLName returns DLL function name for function f. -func (f *Fn) DLLFuncName() string { - if f.dllfuncname == "" { - return f.Name - } - return f.dllfuncname -} - -// ParamList returns source code for function f parameters. -func (f *Fn) ParamList() string { - return join(f.Params, func(p *Param) string { return p.Name + " " + p.Type }, ", ") -} - -// HelperParamList returns source code for helper function f parameters. -func (f *Fn) HelperParamList() string { - return join(f.Params, func(p *Param) string { return p.Name + " " + p.HelperType() }, ", ") -} - -// ParamPrintList returns source code of trace printing part correspondent -// to syscall input parameters. -func (f *Fn) ParamPrintList() string { - return join(f.Params, func(p *Param) string { return fmt.Sprintf(`"%s=", %s, `, p.Name, p.Name) }, `", ", `) -} - -// ParamCount return number of syscall parameters for function f. -func (f *Fn) ParamCount() int { - n := 0 - for _, p := range f.Params { - n += len(p.SyscallArgList()) - } - return n -} - -// SyscallParamCount determines which version of Syscall/Syscall6/Syscall9/... -// to use. It returns parameter count for correspondent SyscallX function. -func (f *Fn) SyscallParamCount() int { - n := f.ParamCount() - switch { - case n <= 3: - return 3 - case n <= 6: - return 6 - case n <= 9: - return 9 - case n <= 12: - return 12 - case n <= 15: - return 15 - default: - panic("too many arguments to system call") - } -} - -// Syscall determines which SyscallX function to use for function f. -func (f *Fn) Syscall() string { - c := f.SyscallParamCount() - if c == 3 { - return syscalldot() + "Syscall" - } - return syscalldot() + "Syscall" + strconv.Itoa(c) -} - -// SyscallParamList returns source code for SyscallX parameters for function f. -func (f *Fn) SyscallParamList() string { - a := make([]string, 0) - for _, p := range f.Params { - a = append(a, p.SyscallArgList()...) - } - for len(a) < f.SyscallParamCount() { - a = append(a, "0") - } - return strings.Join(a, ", ") -} - -// HelperCallParamList returns source code of call into function f helper. -func (f *Fn) HelperCallParamList() string { - a := make([]string, 0, len(f.Params)) - for _, p := range f.Params { - s := p.Name - if p.Type == "string" { - s = p.tmpVar() - } - a = append(a, s) - } - return strings.Join(a, ", ") -} - -// IsUTF16 is true, if f is W (utf16) function. It is false -// for all A (ascii) functions. -func (f *Fn) IsUTF16() bool { - return true -} - -// StrconvFunc returns name of Go string to OS string function for f. -func (f *Fn) StrconvFunc() string { - if f.IsUTF16() { - return syscalldot() + "UTF16PtrFromString" - } - return syscalldot() + "BytePtrFromString" -} - -// StrconvType returns Go type name used for OS string for f. -func (f *Fn) StrconvType() string { - if f.IsUTF16() { - return "*uint16" - } - return "*byte" -} - -// HasStringParam is true, if f has at least one string parameter. -// Otherwise it is false. -func (f *Fn) HasStringParam() bool { - for _, p := range f.Params { - if p.Type == "string" { - return true - } - } - return false -} - -// HelperName returns name of function f helper. -func (f *Fn) HelperName() string { - if !f.HasStringParam() { - return f.Name - } - return "_" + f.Name -} - -// Source files and functions. -type Source struct { - Funcs []*Fn - Files []string - StdLibImports []string - ExternalImports []string -} - -func (src *Source) Import(pkg string) { - src.StdLibImports = append(src.StdLibImports, pkg) - sort.Strings(src.StdLibImports) -} - -func (src *Source) ExternalImport(pkg string) { - src.ExternalImports = append(src.ExternalImports, pkg) - sort.Strings(src.ExternalImports) -} - -// ParseFiles parses files listed in fs and extracts all syscall -// functions listed in sys comments. It returns source files -// and functions collection *Source if successful. -func ParseFiles(fs []string) (*Source, error) { - src := &Source{ - Funcs: make([]*Fn, 0), - Files: make([]string, 0), - StdLibImports: []string{ - "unsafe", - }, - ExternalImports: make([]string, 0), - } - for _, file := range fs { - if err := src.ParseFile(file); err != nil { - return nil, err - } - } - return src, nil -} - -// DLLs return dll names for a source set src. -func (src *Source) DLLs() []string { - uniq := make(map[string]bool) - r := make([]string, 0) - for _, f := range src.Funcs { - name := f.DLLName() - if _, found := uniq[name]; !found { - uniq[name] = true - r = append(r, name) - } - } - return r -} - -// ParseFile adds additional file path to a source set src. -func (src *Source) ParseFile(path string) error { - file, err := os.Open(path) - if err != nil { - return err - } - defer file.Close() - - s := bufio.NewScanner(file) - for s.Scan() { - t := trim(s.Text()) - if len(t) < 7 { - continue - } - if !strings.HasPrefix(t, "//sys") { - continue - } - t = t[5:] - if !(t[0] == ' ' || t[0] == '\t') { - continue - } - f, err := newFn(t[1:]) - if err != nil { - return err - } - src.Funcs = append(src.Funcs, f) - } - if err := s.Err(); err != nil { - return err - } - src.Files = append(src.Files, path) - - // get package name - fset := token.NewFileSet() - _, err = file.Seek(0, 0) - if err != nil { - return err - } - pkg, err := parser.ParseFile(fset, "", file, parser.PackageClauseOnly) - if err != nil { - return err - } - packageName = pkg.Name.Name - - return nil -} - -// IsStdRepo returns true if src is part of standard library. -func (src *Source) IsStdRepo() (bool, error) { - if len(src.Files) == 0 { - return false, errors.New("no input files provided") - } - abspath, err := filepath.Abs(src.Files[0]) - if err != nil { - return false, err - } - goroot := runtime.GOROOT() - if runtime.GOOS == "windows" { - abspath = strings.ToLower(abspath) - goroot = strings.ToLower(goroot) - } - sep := string(os.PathSeparator) - if !strings.HasSuffix(goroot, sep) { - goroot += sep - } - return strings.HasPrefix(abspath, goroot), nil -} - -// Generate output source file from a source set src. -func (src *Source) Generate(w io.Writer) error { - const ( - pkgStd = iota // any package in std library - pkgXSysWindows // x/sys/windows package - pkgOther - ) - isStdRepo, err := src.IsStdRepo() - if err != nil { - return err - } - var pkgtype int - switch { - case isStdRepo: - pkgtype = pkgStd - case packageName == "windows": - // TODO: this needs better logic than just using package name - pkgtype = pkgXSysWindows - default: - pkgtype = pkgOther - } - if *systemDLL { - switch pkgtype { - case pkgStd: - src.Import("internal/syscall/windows/sysdll") - case pkgXSysWindows: - default: - src.ExternalImport("golang.org/x/sys/windows") - } - } - if packageName != "syscall" { - src.Import("syscall") - } - funcMap := template.FuncMap{ - "packagename": packagename, - "syscalldot": syscalldot, - "newlazydll": func(dll string) string { - arg := "\"" + dll + ".dll\"" - if !*systemDLL { - return syscalldot() + "NewLazyDLL(" + arg + ")" - } - switch pkgtype { - case pkgStd: - return syscalldot() + "NewLazyDLL(sysdll.Add(" + arg + "))" - case pkgXSysWindows: - return "NewLazySystemDLL(" + arg + ")" - default: - return "windows.NewLazySystemDLL(" + arg + ")" - } - }, - } - t := template.Must(template.New("main").Funcs(funcMap).Parse(srcTemplate)) - err = t.Execute(w, src) - if err != nil { - return errors.New("Failed to execute template: " + err.Error()) - } - return nil -} - -func usage() { - fmt.Fprintf(os.Stderr, "usage: mksyscall_windows [flags] [path ...]\n") - flag.PrintDefaults() - os.Exit(1) -} - -func main() { - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - src, err := ParseFiles(flag.Args()) - if err != nil { - log.Fatal(err) - } - - var buf bytes.Buffer - if err := src.Generate(&buf); err != nil { - log.Fatal(err) - } - - data, err := format.Source(buf.Bytes()) - if err != nil { - log.Fatal(err) - } - if *filename == "" { - _, err = os.Stdout.Write(data) - } else { - err = ioutil.WriteFile(*filename, data, 0644) - } - if err != nil { - log.Fatal(err) - } -} - -// TODO: use println instead to print in the following template -const srcTemplate = ` - -{{define "main"}}// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT - -package {{packagename}} - -import ( -{{range .StdLibImports}}"{{.}}" -{{end}} - -{{range .ExternalImports}}"{{.}}" -{{end}} -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = {{syscalldot}}Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e {{syscalldot}}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 ( -{{template "dlls" .}} -{{template "funcnames" .}}) -{{range .Funcs}}{{if .HasStringParam}}{{template "helperbody" .}}{{end}}{{template "funcbody" .}}{{end}} -{{end}} - -{{/* help functions */}} - -{{define "dlls"}}{{range .DLLs}} mod{{.}} = {{newlazydll .}} -{{end}}{{end}} - -{{define "funcnames"}}{{range .Funcs}} proc{{.DLLFuncName}} = mod{{.DLLName}}.NewProc("{{.DLLFuncName}}") -{{end}}{{end}} - -{{define "helperbody"}} -func {{.Name}}({{.ParamList}}) {{template "results" .}}{ -{{template "helpertmpvars" .}} return {{.HelperName}}({{.HelperCallParamList}}) -} -{{end}} - -{{define "funcbody"}} -func {{.HelperName}}({{.HelperParamList}}) {{template "results" .}}{ -{{template "tmpvars" .}} {{template "syscall" .}} -{{template "seterror" .}}{{template "printtrace" .}} return -} -{{end}} - -{{define "helpertmpvars"}}{{range .Params}}{{if .TmpVarHelperCode}} {{.TmpVarHelperCode}} -{{end}}{{end}}{{end}} - -{{define "tmpvars"}}{{range .Params}}{{if .TmpVarCode}} {{.TmpVarCode}} -{{end}}{{end}}{{end}} - -{{define "results"}}{{if .Rets.List}}{{.Rets.List}} {{end}}{{end}} - -{{define "syscall"}}{{.Rets.SetReturnValuesCode}}{{.Syscall}}(proc{{.DLLFuncName}}.Addr(), {{.ParamCount}}, {{.SyscallParamList}}){{end}} - -{{define "seterror"}}{{if .Rets.SetErrorCode}} {{.Rets.SetErrorCode}} -{{end}}{{end}} - -{{define "printtrace"}}{{if .PrintTrace}} print("SYSCALL: {{.Name}}(", {{.ParamPrintList}}") (", {{.Rets.PrintList}}")\n") -{{end}}{{end}} - -` diff --git a/vendor/github.com/Microsoft/go-winio/vhd/vhd.go b/vendor/github.com/Microsoft/go-winio/vhd/vhd.go deleted file mode 100644 index 32f0701ea..000000000 --- a/vendor/github.com/Microsoft/go-winio/vhd/vhd.go +++ /dev/null @@ -1,82 +0,0 @@ -// +build windows - -package vhd - -import "syscall" - -//go:generate go run mksyscall_windows.go -output zvhd.go vhd.go - -//sys createVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.CreateVirtualDisk - -type virtualStorageType struct { - DeviceID uint32 - VendorID [16]byte -} - -const virtualDiskAccessNONE uint32 = 0 -const virtualDiskAccessATTACHRO uint32 = 65536 -const virtualDiskAccessATTACHRW uint32 = 131072 -const virtualDiskAccessDETACH uint32 = 262144 -const virtualDiskAccessGETINFO uint32 = 524288 -const virtualDiskAccessCREATE uint32 = 1048576 -const virtualDiskAccessMETAOPS uint32 = 2097152 -const virtualDiskAccessREAD uint32 = 851968 -const virtualDiskAccessALL uint32 = 4128768 -const virtualDiskAccessWRITABLE uint32 = 3276800 - -const createVirtualDiskFlagNone uint32 = 0 -const createVirtualDiskFlagFullPhysicalAllocation uint32 = 1 -const createVirtualDiskFlagPreventWritesToSourceDisk uint32 = 2 -const createVirtualDiskFlagDoNotCopyMetadataFromParent uint32 = 4 - -type version2 struct { - UniqueID [16]byte // GUID - MaximumSize uint64 - BlockSizeInBytes uint32 - SectorSizeInBytes uint32 - ParentPath *uint16 // string - SourcePath *uint16 // string - OpenFlags uint32 - ParentVirtualStorageType virtualStorageType - SourceVirtualStorageType virtualStorageType - ResiliencyGUID [16]byte // GUID -} - -type createVirtualDiskParameters struct { - Version uint32 // Must always be set to 2 - Version2 version2 -} - -// CreateVhdx will create a simple vhdx file at the given path using default values. -func CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error { - var defaultType virtualStorageType - - parameters := createVirtualDiskParameters{ - Version: 2, - Version2: version2{ - MaximumSize: uint64(maxSizeInGb) * 1024 * 1024 * 1024, - BlockSizeInBytes: blockSizeInMb * 1024 * 1024, - }, - } - - var handle syscall.Handle - - if err := createVirtualDisk( - &defaultType, - path, - virtualDiskAccessNONE, - nil, - createVirtualDiskFlagNone, - 0, - ¶meters, - nil, - &handle); err != nil { - return err - } - - if err := syscall.CloseHandle(handle); err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/Microsoft/go-winio/vhd/zvhd.go b/vendor/github.com/Microsoft/go-winio/vhd/zvhd.go deleted file mode 100644 index c450955ab..000000000 --- a/vendor/github.com/Microsoft/go-winio/vhd/zvhd.go +++ /dev/null @@ -1,64 +0,0 @@ -// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT - -package vhd - -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 ( - modVirtDisk = windows.NewLazySystemDLL("VirtDisk.dll") - - procCreateVirtualDisk = modVirtDisk.NewProc("CreateVirtualDisk") -) - -func createVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(path) - if err != nil { - return - } - return _createVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, securityDescriptor, flags, providerSpecificFlags, parameters, o, handle) -} - -func _createVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) { - r1, _, e1 := syscall.Syscall9(procCreateVirtualDisk.Addr(), 9, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(flags), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(handle))) - if r1 != 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} diff --git a/vendor/github.com/Microsoft/go-winio/wim/decompress.go b/vendor/github.com/Microsoft/go-winio/wim/decompress.go deleted file mode 100644 index f4e67f845..000000000 --- a/vendor/github.com/Microsoft/go-winio/wim/decompress.go +++ /dev/null @@ -1,138 +0,0 @@ -package wim - -import ( - "encoding/binary" - "io" - "io/ioutil" - - "github.com/Microsoft/go-winio/wim/lzx" -) - -const chunkSize = 32768 // Compressed resource chunk size - -type compressedReader struct { - r *io.SectionReader - d io.ReadCloser - chunks []int64 - curChunk int - originalSize int64 -} - -func newCompressedReader(r *io.SectionReader, originalSize int64, offset int64) (*compressedReader, error) { - nchunks := (originalSize + chunkSize - 1) / chunkSize - var base int64 - chunks := make([]int64, nchunks) - if originalSize <= 0xffffffff { - // 32-bit chunk offsets - base = (nchunks - 1) * 4 - chunks32 := make([]uint32, nchunks-1) - err := binary.Read(r, binary.LittleEndian, chunks32) - if err != nil { - return nil, err - } - for i, n := range chunks32 { - chunks[i+1] = int64(n) - } - - } else { - // 64-bit chunk offsets - base = (nchunks - 1) * 8 - err := binary.Read(r, binary.LittleEndian, chunks[1:]) - if err != nil { - return nil, err - } - } - - for i, c := range chunks { - chunks[i] = c + base - } - - cr := &compressedReader{ - r: r, - chunks: chunks, - originalSize: originalSize, - } - - err := cr.reset(int(offset / chunkSize)) - if err != nil { - return nil, err - } - - suboff := offset % chunkSize - if suboff != 0 { - _, err := io.CopyN(ioutil.Discard, cr.d, suboff) - if err != nil { - return nil, err - } - } - return cr, nil -} - -func (r *compressedReader) chunkOffset(n int) int64 { - if n == len(r.chunks) { - return r.r.Size() - } - return r.chunks[n] -} - -func (r *compressedReader) chunkSize(n int) int { - return int(r.chunkOffset(n+1) - r.chunkOffset(n)) -} - -func (r *compressedReader) uncompressedSize(n int) int { - if n < len(r.chunks)-1 { - return chunkSize - } - size := int(r.originalSize % chunkSize) - if size == 0 { - size = chunkSize - } - return size -} - -func (r *compressedReader) reset(n int) error { - if n >= len(r.chunks) { - return io.EOF - } - if r.d != nil { - r.d.Close() - } - r.curChunk = n - size := r.chunkSize(n) - uncompressedSize := r.uncompressedSize(n) - section := io.NewSectionReader(r.r, r.chunkOffset(n), int64(size)) - if size != uncompressedSize { - d, err := lzx.NewReader(section, uncompressedSize) - if err != nil { - return err - } - r.d = d - } else { - r.d = ioutil.NopCloser(section) - } - - return nil -} - -func (r *compressedReader) Read(b []byte) (int, error) { - for { - n, err := r.d.Read(b) - if err != io.EOF { - return n, err - } - - err = r.reset(r.curChunk + 1) - if err != nil { - return n, err - } - } -} - -func (r *compressedReader) Close() error { - var err error - if r.d != nil { - err = r.d.Close() - r.d = nil - } - return err -} diff --git a/vendor/github.com/Microsoft/go-winio/wim/lzx/lzx.go b/vendor/github.com/Microsoft/go-winio/wim/lzx/lzx.go deleted file mode 100644 index 4deb0df75..000000000 --- a/vendor/github.com/Microsoft/go-winio/wim/lzx/lzx.go +++ /dev/null @@ -1,606 +0,0 @@ -// Package lzx implements a decompressor for the the WIM variant of the -// LZX compression algorithm. -// -// The LZX algorithm is an earlier variant of LZX DELTA, which is documented -// at https://msdn.microsoft.com/en-us/library/cc483133(v=exchg.80).aspx. -package lzx - -import ( - "bytes" - "encoding/binary" - "errors" - "io" -) - -const ( - maincodecount = 496 - maincodesplit = 256 - lencodecount = 249 - lenshift = 9 - codemask = 0x1ff - tablebits = 9 - tablesize = 1 << tablebits - - maxBlockSize = 32768 - windowSize = 32768 - - maxTreePathLen = 16 - - e8filesize = 12000000 - maxe8offset = 0x3fffffff - - verbatimBlock = 1 - alignedOffsetBlock = 2 - uncompressedBlock = 3 -) - -var footerBits = [...]byte{ - 0, 0, 0, 0, 1, 1, 2, 2, - 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, - 11, 11, 12, 12, 13, 13, 14, -} - -var basePosition = [...]uint16{ - 0, 1, 2, 3, 4, 6, 8, 12, - 16, 24, 32, 48, 64, 96, 128, 192, - 256, 384, 512, 768, 1024, 1536, 2048, 3072, - 4096, 6144, 8192, 12288, 16384, 24576, 32768, -} - -var ( - errCorrupt = errors.New("LZX data corrupt") -) - -// Reader is an interface used by the decompressor to access -// the input stream. If the provided io.Reader does not implement -// Reader, then a bufio.Reader is used. -type Reader interface { - io.Reader - io.ByteReader -} - -type decompressor struct { - r io.Reader - err error - unaligned bool - nbits byte - c uint32 - lru [3]uint16 - uncompressed int - windowReader *bytes.Reader - mainlens [maincodecount]byte - lenlens [lencodecount]byte - window [windowSize]byte - b []byte - bv int - bo int -} - -//go:noinline -func (f *decompressor) fail(err error) { - if f.err == nil { - f.err = err - } - f.bo = 0 - f.bv = 0 -} - -func (f *decompressor) ensureAtLeast(n int) error { - if f.bv-f.bo >= n { - return nil - } - - if f.err != nil { - return f.err - } - - if f.bv != f.bo { - copy(f.b[:f.bv-f.bo], f.b[f.bo:f.bv]) - } - n, err := io.ReadAtLeast(f.r, f.b[f.bv-f.bo:], n) - if err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } else { - f.fail(err) - } - return err - } - f.bv = f.bv - f.bo + n - f.bo = 0 - return nil -} - -// feed retrieves another 16-bit word from the stream and consumes -// it into f.c. It returns false if there are no more bytes available. -// Otherwise, on error, it sets f.err. -func (f *decompressor) feed() bool { - err := f.ensureAtLeast(2) - if err != nil { - if err == io.ErrUnexpectedEOF { - return false - } - } - f.c |= (uint32(f.b[f.bo+1])<<8 | uint32(f.b[f.bo])) << (16 - f.nbits) - f.nbits += 16 - f.bo += 2 - return true -} - -// getBits retrieves the next n bits from the byte stream. n -// must be <= 16. It sets f.err on error. -func (f *decompressor) getBits(n byte) uint16 { - if f.nbits < n { - if !f.feed() { - f.fail(io.ErrUnexpectedEOF) - } - } - c := uint16(f.c >> (32 - n)) - f.c <<= n - f.nbits -= n - return c -} - -type huffman struct { - extra [][]uint16 - maxbits byte - table [tablesize]uint16 -} - -// buildTable builds a huffman decoding table from a slice of code lengths, -// one per code, in order. Each code length must be <= maxTreePathLen. -// See https://en.wikipedia.org/wiki/Canonical_Huffman_code. -func buildTable(codelens []byte) *huffman { - // Determine the number of codes of each length, and the - // maximum length. - var count [maxTreePathLen + 1]uint - var max byte - for _, cl := range codelens { - count[cl]++ - if max < cl { - max = cl - } - } - - if max == 0 { - return &huffman{} - } - - // Determine the first code of each length. - var first [maxTreePathLen + 1]uint - code := uint(0) - for i := byte(1); i <= max; i++ { - code <<= 1 - first[i] = code - code += count[i] - } - - if code != 1< tablebits, split long codes into additional tables - // of suffixes of max-tablebits length. - h := &huffman{maxbits: max} - if max > tablebits { - core := first[tablebits+1] / 2 // Number of codes that fit without extra tables - nextra := 1<> (cl - tablebits) - suffix := code & (1<<(cl-tablebits) - 1) - extendedCode := suffix << (max - cl) - for j := uint(0); j < 1<<(max-cl); j++ { - h.extra[h.table[prefix]][extendedCode+j] = v - } - } - } - } - - return h -} - -// getCode retrieves the next code using the provided -// huffman tree. It sets f.err on error. -func (f *decompressor) getCode(h *huffman) uint16 { - if h.maxbits > 0 { - if f.nbits < maxTreePathLen { - f.feed() - } - - // For codes with length < tablebits, it doesn't matter - // what the remainder of the bits used for table lookup - // are, since entries with all possible suffixes were - // added to the table. - c := h.table[f.c>>(32-tablebits)] - if c >= 1<>(32-(h.maxbits-tablebits))] - } - - n := byte(c >> lenshift) - if f.nbits >= n { - // Only consume the length of the code, not the maximum - // code length. - f.c <<= n - f.nbits -= n - return c & codemask - } - - f.fail(io.ErrUnexpectedEOF) - return 0 - } - - // This is an empty tree. It should not be used. - f.fail(errCorrupt) - return 0 -} - -// readTree updates the huffman tree path lengths in lens by -// reading and decoding lengths from the byte stream. lens -// should be prepopulated with the previous block's tree's path -// lengths. For the first block, lens should be zero. -func (f *decompressor) readTree(lens []byte) error { - // Get the pre-tree for the main tree. - var pretreeLen [20]byte - for i := range pretreeLen { - pretreeLen[i] = byte(f.getBits(4)) - } - if f.err != nil { - return f.err - } - h := buildTable(pretreeLen[:]) - - // The lengths are encoded as a series of huffman codes - // encoded by the pre-tree. - for i := 0; i < len(lens); { - c := byte(f.getCode(h)) - if f.err != nil { - return f.err - } - switch { - case c <= 16: // length is delta from previous length - lens[i] = (lens[i] + 17 - c) % 17 - i++ - case c == 17: // next n + 4 lengths are zero - zeroes := int(f.getBits(4)) + 4 - if i+zeroes > len(lens) { - return errCorrupt - } - for j := 0; j < zeroes; j++ { - lens[i+j] = 0 - } - i += zeroes - case c == 18: // next n + 20 lengths are zero - zeroes := int(f.getBits(5)) + 20 - if i+zeroes > len(lens) { - return errCorrupt - } - for j := 0; j < zeroes; j++ { - lens[i+j] = 0 - } - i += zeroes - case c == 19: // next n + 4 lengths all have the same value - same := int(f.getBits(1)) + 4 - if i+same > len(lens) { - return errCorrupt - } - c = byte(f.getCode(h)) - if c > 16 { - return errCorrupt - } - l := (lens[i] + 17 - c) % 17 - for j := 0; j < same; j++ { - lens[i+j] = l - } - i += same - default: - return errCorrupt - } - } - - if f.err != nil { - return f.err - } - return nil -} - -func (f *decompressor) readBlockHeader() (byte, uint16, error) { - // If the previous block was an unaligned uncompressed block, restore - // 2-byte alignment. - if f.unaligned { - err := f.ensureAtLeast(1) - if err != nil { - return 0, 0, err - } - f.bo++ - f.unaligned = false - } - - blockType := f.getBits(3) - full := f.getBits(1) - var blockSize uint16 - if full != 0 { - blockSize = maxBlockSize - } else { - blockSize = f.getBits(16) - if blockSize > maxBlockSize { - return 0, 0, errCorrupt - } - } - - if f.err != nil { - return 0, 0, f.err - } - - switch blockType { - case verbatimBlock, alignedOffsetBlock: - // The caller will read the huffman trees. - case uncompressedBlock: - if f.nbits > 16 { - panic("impossible: more than one 16-bit word remains") - } - - // Drop the remaining bits in the current 16-bit word - // If there are no bits left, discard a full 16-bit word. - n := f.nbits - if n == 0 { - n = 16 - } - - f.getBits(n) - - // Read the LRU values for the next block. - err := f.ensureAtLeast(12) - if err != nil { - return 0, 0, err - } - - f.lru[0] = uint16(binary.LittleEndian.Uint32(f.b[f.bo : f.bo+4])) - f.lru[1] = uint16(binary.LittleEndian.Uint32(f.b[f.bo+4 : f.bo+8])) - f.lru[2] = uint16(binary.LittleEndian.Uint32(f.b[f.bo+8 : f.bo+12])) - f.bo += 12 - - default: - return 0, 0, errCorrupt - } - - return byte(blockType), blockSize, nil -} - -// readTrees reads the two or three huffman trees for the current block. -// readAligned specifies whether to read the aligned offset tree. -func (f *decompressor) readTrees(readAligned bool) (main *huffman, length *huffman, aligned *huffman, err error) { - // Aligned offset blocks start with a small aligned offset tree. - if readAligned { - var alignedLen [8]byte - for i := range alignedLen { - alignedLen[i] = byte(f.getBits(3)) - } - aligned = buildTable(alignedLen[:]) - if aligned == nil { - err = errors.New("corrupt") - return - } - } - - // The main tree is encoded in two parts. - err = f.readTree(f.mainlens[:maincodesplit]) - if err != nil { - return - } - err = f.readTree(f.mainlens[maincodesplit:]) - if err != nil { - return - } - - main = buildTable(f.mainlens[:]) - if main == nil { - err = errors.New("corrupt") - return - } - - // The length tree is encoding in a single part. - err = f.readTree(f.lenlens[:]) - if err != nil { - return - } - - length = buildTable(f.lenlens[:]) - if length == nil { - err = errors.New("corrupt") - return - } - - err = f.err - return -} - -// readCompressedBlock decodes a compressed block, writing into the window -// starting at start and ending at end, and using the provided huffman trees. -func (f *decompressor) readCompressedBlock(start, end uint16, hmain, hlength, haligned *huffman) (int, error) { - i := start - for i < end { - main := f.getCode(hmain) - if f.err != nil { - break - } - if main < 256 { - // Literal byte. - f.window[i] = byte(main) - i++ - continue - } - - // This is a match backward in the window. Determine - // the offset and dlength. - matchlen := (main - 256) % 8 - slot := (main - 256) / 8 - - // The length is either the low bits of the code, - // or if this is 7, is encoded with the length tree. - if matchlen == 7 { - matchlen += f.getCode(hlength) - } - matchlen += 2 - - var matchoffset uint16 - if slot < 3 { - // The offset is one of the LRU values. - matchoffset = f.lru[slot] - f.lru[slot] = f.lru[0] - f.lru[0] = matchoffset - } else { - // The offset is encoded as a combination of the - // slot and more bits from the bit stream. - offsetbits := footerBits[slot] - var verbatimbits, alignedbits uint16 - if offsetbits > 0 { - if haligned != nil && offsetbits >= 3 { - // This is an aligned offset block. Combine - // the bits written verbatim with the aligned - // offset tree code. - verbatimbits = f.getBits(offsetbits-3) * 8 - alignedbits = f.getCode(haligned) - } else { - // There are no aligned offset bits to read, - // only verbatim bits. - verbatimbits = f.getBits(offsetbits) - alignedbits = 0 - } - } - matchoffset = basePosition[slot] + verbatimbits + alignedbits - 2 - // Update the LRU cache. - f.lru[2] = f.lru[1] - f.lru[1] = f.lru[0] - f.lru[0] = matchoffset - } - - if matchoffset <= i && matchlen <= end-i { - copyend := i + matchlen - for ; i < copyend; i++ { - f.window[i] = f.window[i-matchoffset] - } - } else { - f.fail(errCorrupt) - break - } - } - return int(i - start), f.err -} - -// readBlock decodes the current block and returns the number of uncompressed bytes. -func (f *decompressor) readBlock(start uint16) (int, error) { - blockType, size, err := f.readBlockHeader() - if err != nil { - return 0, err - } - - if blockType == uncompressedBlock { - if size%2 == 1 { - // Remember to realign the byte stream at the next block. - f.unaligned = true - } - copied := 0 - if f.bo < f.bv { - copied = int(size) - s := int(start) - if copied > f.bv-f.bo { - copied = f.bv - f.bo - } - copy(f.window[s:s+copied], f.b[f.bo:f.bo+copied]) - f.bo += copied - } - n, err := io.ReadFull(f.r, f.window[start+uint16(copied):start+size]) - return copied + n, err - } - - hmain, hlength, haligned, err := f.readTrees(blockType == alignedOffsetBlock) - if err != nil { - return 0, err - } - - return f.readCompressedBlock(start, start+size, hmain, hlength, haligned) -} - -// decodeE8 reverses the 0xe8 x86 instruction encoding that was performed -// to the uncompressed data before it was compressed. -func decodeE8(b []byte, off int64) { - if off > maxe8offset || len(b) < 10 { - return - } - for i := 0; i < len(b)-10; i++ { - if b[i] == 0xe8 { - currentPtr := int32(off) + int32(i) - abs := int32(binary.LittleEndian.Uint32(b[i+1 : i+5])) - if abs >= -currentPtr && abs < e8filesize { - var rel int32 - if abs >= 0 { - rel = abs - currentPtr - } else { - rel = abs + e8filesize - } - binary.LittleEndian.PutUint32(b[i+1:i+5], uint32(rel)) - } - i += 4 - } - } -} - -func (f *decompressor) Read(b []byte) (int, error) { - // Read and uncompress everything. - if f.windowReader == nil { - n := 0 - for n < f.uncompressed { - k, err := f.readBlock(uint16(n)) - if err != nil { - return 0, err - } - n += k - } - decodeE8(f.window[:f.uncompressed], 0) - f.windowReader = bytes.NewReader(f.window[:f.uncompressed]) - } - - // Just read directly from the window. - return f.windowReader.Read(b) -} - -func (f *decompressor) Close() error { - return nil -} - -// NewReader returns a new io.ReadCloser that decompresses a -// WIM LZX stream until uncompressedSize bytes have been returned. -func NewReader(r io.Reader, uncompressedSize int) (io.ReadCloser, error) { - if uncompressedSize > windowSize { - return nil, errors.New("uncompressed size is limited to 32KB") - } - f := &decompressor{ - lru: [3]uint16{1, 1, 1}, - uncompressed: uncompressedSize, - b: make([]byte, 4096), - r: r, - } - return f, nil -} diff --git a/vendor/github.com/Microsoft/go-winio/wim/validate/validate.go b/vendor/github.com/Microsoft/go-winio/wim/validate/validate.go deleted file mode 100644 index ba03fc9ad..000000000 --- a/vendor/github.com/Microsoft/go-winio/wim/validate/validate.go +++ /dev/null @@ -1,51 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - - "github.com/Microsoft/go-winio/wim" -) - -func main() { - flag.Parse() - f, err := os.Open(flag.Arg(0)) - if err != nil { - panic(err) - } - - w, err := wim.NewReader(f) - if err != nil { - panic(err) - - } - - fmt.Printf("%#v\n%#v\n", w.Image[0], w.Image[0].Windows) - - dir, err := w.Image[0].Open() - if err != nil { - panic(err) - } - - err = recur(dir) - if err != nil { - panic(err) - } -} - -func recur(d *wim.File) error { - files, err := d.Readdir() - if err != nil { - return fmt.Errorf("%s: %s", d.Name, err) - } - for _, f := range files { - if f.IsDir() { - err = recur(f) - if err != nil { - return fmt.Errorf("%s: %s", f.Name, err) - } - } - } - return nil -} diff --git a/vendor/github.com/Microsoft/go-winio/wim/wim.go b/vendor/github.com/Microsoft/go-winio/wim/wim.go deleted file mode 100644 index 1d02e920a..000000000 --- a/vendor/github.com/Microsoft/go-winio/wim/wim.go +++ /dev/null @@ -1,866 +0,0 @@ -// Package wim implements a WIM file parser. -// -// WIM files are used to distribute Windows file system and container images. -// They are documented at https://msdn.microsoft.com/en-us/library/windows/desktop/dd861280.aspx. -package wim - -import ( - "bytes" - "crypto/sha1" - "encoding/binary" - "encoding/xml" - "errors" - "fmt" - "io" - "io/ioutil" - "strconv" - "sync" - "time" - "unicode/utf16" -) - -// File attribute constants from Windows. -const ( - FILE_ATTRIBUTE_READONLY = 0x00000001 - FILE_ATTRIBUTE_HIDDEN = 0x00000002 - FILE_ATTRIBUTE_SYSTEM = 0x00000004 - FILE_ATTRIBUTE_DIRECTORY = 0x00000010 - FILE_ATTRIBUTE_ARCHIVE = 0x00000020 - FILE_ATTRIBUTE_DEVICE = 0x00000040 - FILE_ATTRIBUTE_NORMAL = 0x00000080 - FILE_ATTRIBUTE_TEMPORARY = 0x00000100 - FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200 - FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400 - FILE_ATTRIBUTE_COMPRESSED = 0x00000800 - FILE_ATTRIBUTE_OFFLINE = 0x00001000 - FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000 - FILE_ATTRIBUTE_ENCRYPTED = 0x00004000 - FILE_ATTRIBUTE_INTEGRITY_STREAM = 0x00008000 - FILE_ATTRIBUTE_VIRTUAL = 0x00010000 - FILE_ATTRIBUTE_NO_SCRUB_DATA = 0x00020000 - FILE_ATTRIBUTE_EA = 0x00040000 -) - -// Windows processor architectures. -const ( - PROCESSOR_ARCHITECTURE_INTEL = 0 - PROCESSOR_ARCHITECTURE_MIPS = 1 - PROCESSOR_ARCHITECTURE_ALPHA = 2 - PROCESSOR_ARCHITECTURE_PPC = 3 - PROCESSOR_ARCHITECTURE_SHX = 4 - PROCESSOR_ARCHITECTURE_ARM = 5 - PROCESSOR_ARCHITECTURE_IA64 = 6 - PROCESSOR_ARCHITECTURE_ALPHA64 = 7 - PROCESSOR_ARCHITECTURE_MSIL = 8 - PROCESSOR_ARCHITECTURE_AMD64 = 9 - PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 = 10 - PROCESSOR_ARCHITECTURE_NEUTRAL = 11 - PROCESSOR_ARCHITECTURE_ARM64 = 12 -) - -var wimImageTag = [...]byte{'M', 'S', 'W', 'I', 'M', 0, 0, 0} - -type guid struct { - Data1 uint32 - Data2 uint16 - Data3 uint16 - Data4 [8]byte -} - -func (g guid) String() string { - return fmt.Sprintf("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", g.Data1, g.Data2, g.Data3, g.Data4[0], g.Data4[1], g.Data4[2], g.Data4[3], g.Data4[4], g.Data4[5], g.Data4[6], g.Data4[7]) -} - -type resourceDescriptor struct { - FlagsAndCompressedSize uint64 - Offset int64 - OriginalSize int64 -} - -type resFlag byte - -const ( - resFlagFree resFlag = 1 << iota - resFlagMetadata - resFlagCompressed - resFlagSpanned -) - -const validate = false - -const supportedResFlags = resFlagMetadata | resFlagCompressed - -func (r *resourceDescriptor) Flags() resFlag { - return resFlag(r.FlagsAndCompressedSize >> 56) -} - -func (r *resourceDescriptor) CompressedSize() int64 { - return int64(r.FlagsAndCompressedSize & 0xffffffffffffff) -} - -func (r *resourceDescriptor) String() string { - s := fmt.Sprintf("%d bytes at %d", r.CompressedSize(), r.Offset) - if r.Flags()&4 != 0 { - s += fmt.Sprintf(" (uncompresses to %d)", r.OriginalSize) - } - return s -} - -// SHA1Hash contains the SHA1 hash of a file or stream. -type SHA1Hash [20]byte - -type streamDescriptor struct { - resourceDescriptor - PartNumber uint16 - RefCount uint32 - Hash SHA1Hash -} - -type hdrFlag uint32 - -const ( - hdrFlagReserved hdrFlag = 1 << iota - hdrFlagCompressed - hdrFlagReadOnly - hdrFlagSpanned - hdrFlagResourceOnly - hdrFlagMetadataOnly - hdrFlagWriteInProgress - hdrFlagRpFix -) - -const ( - hdrFlagCompressReserved hdrFlag = 1 << (iota + 16) - hdrFlagCompressXpress - hdrFlagCompressLzx -) - -const supportedHdrFlags = hdrFlagRpFix | hdrFlagReadOnly | hdrFlagCompressed | hdrFlagCompressLzx - -type wimHeader struct { - ImageTag [8]byte - Size uint32 - Version uint32 - Flags hdrFlag - CompressionSize uint32 - WIMGuid guid - PartNumber uint16 - TotalParts uint16 - ImageCount uint32 - OffsetTable resourceDescriptor - XMLData resourceDescriptor - BootMetadata resourceDescriptor - BootIndex uint32 - Padding uint32 - Integrity resourceDescriptor - Unused [60]byte -} - -type securityblockDisk struct { - TotalLength uint32 - NumEntries uint32 -} - -const securityblockDiskSize = 8 - -type direntry struct { - Attributes uint32 - SecurityID uint32 - SubdirOffset int64 - Unused1, Unused2 int64 - CreationTime Filetime - LastAccessTime Filetime - LastWriteTime Filetime - Hash SHA1Hash - Padding uint32 - ReparseHardLink int64 - StreamCount uint16 - ShortNameLength uint16 - FileNameLength uint16 -} - -var direntrySize = int64(binary.Size(direntry{}) + 8) // includes an 8-byte length prefix - -type streamentry struct { - Unused int64 - Hash SHA1Hash - NameLength int16 -} - -var streamentrySize = int64(binary.Size(streamentry{}) + 8) // includes an 8-byte length prefix - -// Filetime represents a Windows time. -type Filetime struct { - LowDateTime uint32 - HighDateTime uint32 -} - -// Time returns the time as time.Time. -func (ft *Filetime) Time() time.Time { - // 100-nanosecond intervals since January 1, 1601 - nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) - // change starting time to the Epoch (00:00:00 UTC, January 1, 1970) - nsec -= 116444736000000000 - // convert into nanoseconds - nsec *= 100 - return time.Unix(0, nsec) -} - -// UnmarshalXML unmarshals the time from a WIM XML blob. -func (ft *Filetime) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - type time struct { - Low string `xml:"LOWPART"` - High string `xml:"HIGHPART"` - } - var t time - err := d.DecodeElement(&t, &start) - if err != nil { - return err - } - - low, err := strconv.ParseUint(t.Low, 0, 32) - if err != nil { - return err - } - high, err := strconv.ParseUint(t.High, 0, 32) - if err != nil { - return err - } - - ft.LowDateTime = uint32(low) - ft.HighDateTime = uint32(high) - return nil -} - -type info struct { - Image []ImageInfo `xml:"IMAGE"` -} - -// ImageInfo contains information about the image. -type ImageInfo struct { - Name string `xml:"NAME"` - Index int `xml:"INDEX,attr"` - CreationTime Filetime `xml:"CREATIONTIME"` - ModTime Filetime `xml:"LASTMODIFICATIONTIME"` - Windows *WindowsInfo `xml:"WINDOWS"` -} - -// WindowsInfo contains information about the Windows installation in the image. -type WindowsInfo struct { - Arch byte `xml:"ARCH"` - ProductName string `xml:"PRODUCTNAME"` - EditionID string `xml:"EDITIONID"` - InstallationType string `xml:"INSTALLATIONTYPE"` - ProductType string `xml:"PRODUCTTYPE"` - Languages []string `xml:"LANGUAGES>LANGUAGE"` - DefaultLanguage string `xml:"LANGUAGES>DEFAULT"` - Version Version `xml:"VERSION"` - SystemRoot string `xml:"SYSTEMROOT"` -} - -// Version represents a Windows build version. -type Version struct { - Major int `xml:"MAJOR"` - Minor int `xml:"MINOR"` - Build int `xml:"BUILD"` - SPBuild int `xml:"SPBUILD"` - SPLevel int `xml:"SPLEVEL"` -} - -// ParseError is returned when the WIM cannot be parsed. -type ParseError struct { - Oper string - Path string - Err error -} - -func (e *ParseError) Error() string { - if e.Path == "" { - return "WIM parse error at " + e.Oper + ": " + e.Err.Error() - } - return fmt.Sprintf("WIM parse error: %s %s: %s", e.Oper, e.Path, e.Err.Error()) -} - -// Reader provides functions to read a WIM file. -type Reader struct { - hdr wimHeader - r io.ReaderAt - fileData map[SHA1Hash]resourceDescriptor - - XMLInfo string // The XML information about the WIM. - Image []*Image // The WIM's images. -} - -// Image represents an image within a WIM file. -type Image struct { - wim *Reader - offset resourceDescriptor - sds [][]byte - rootOffset int64 - r io.ReadCloser - curOffset int64 - m sync.Mutex - - ImageInfo -} - -// StreamHeader contains alternate data stream metadata. -type StreamHeader struct { - Name string - Hash SHA1Hash - Size int64 -} - -// Stream represents an alternate data stream or reparse point data stream. -type Stream struct { - StreamHeader - wim *Reader - offset resourceDescriptor -} - -// FileHeader contains file metadata. -type FileHeader struct { - Name string - ShortName string - Attributes uint32 - SecurityDescriptor []byte - CreationTime Filetime - LastAccessTime Filetime - LastWriteTime Filetime - Hash SHA1Hash - Size int64 - LinkID int64 - ReparseTag uint32 - ReparseReserved uint32 -} - -// File represents a file or directory in a WIM image. -type File struct { - FileHeader - Streams []*Stream - offset resourceDescriptor - img *Image - subdirOffset int64 -} - -// NewReader returns a Reader that can be used to read WIM file data. -func NewReader(f io.ReaderAt) (*Reader, error) { - r := &Reader{r: f} - section := io.NewSectionReader(f, 0, 0xffff) - err := binary.Read(section, binary.LittleEndian, &r.hdr) - if err != nil { - return nil, err - } - - if r.hdr.ImageTag != wimImageTag { - return nil, &ParseError{Oper: "image tag", Err: errors.New("not a WIM file")} - } - - if r.hdr.Flags&^supportedHdrFlags != 0 { - return nil, fmt.Errorf("unsupported WIM flags %x", r.hdr.Flags&^supportedHdrFlags) - } - - if r.hdr.CompressionSize != 0x8000 { - return nil, fmt.Errorf("unsupported compression size %d", r.hdr.CompressionSize) - } - - if r.hdr.TotalParts != 1 { - return nil, errors.New("multi-part WIM not supported") - } - - fileData, images, err := r.readOffsetTable(&r.hdr.OffsetTable) - if err != nil { - return nil, err - } - - xmlinfo, err := r.readXML() - if err != nil { - return nil, err - } - - var info info - err = xml.Unmarshal([]byte(xmlinfo), &info) - if err != nil { - return nil, &ParseError{Oper: "XML info", Err: err} - } - - for i, img := range images { - for _, imgInfo := range info.Image { - if imgInfo.Index == i+1 { - img.ImageInfo = imgInfo - break - } - } - } - - r.fileData = fileData - r.Image = images - r.XMLInfo = xmlinfo - return r, nil -} - -// Close releases resources associated with the Reader. -func (r *Reader) Close() error { - for _, img := range r.Image { - img.reset() - } - return nil -} - -func (r *Reader) resourceReader(hdr *resourceDescriptor) (io.ReadCloser, error) { - return r.resourceReaderWithOffset(hdr, 0) -} - -func (r *Reader) resourceReaderWithOffset(hdr *resourceDescriptor, offset int64) (io.ReadCloser, error) { - var sr io.ReadCloser - section := io.NewSectionReader(r.r, hdr.Offset, hdr.CompressedSize()) - if hdr.Flags()&resFlagCompressed == 0 { - section.Seek(offset, 0) - sr = ioutil.NopCloser(section) - } else { - cr, err := newCompressedReader(section, hdr.OriginalSize, offset) - if err != nil { - return nil, err - } - sr = cr - } - - return sr, nil -} - -func (r *Reader) readResource(hdr *resourceDescriptor) ([]byte, error) { - rsrc, err := r.resourceReader(hdr) - if err != nil { - return nil, err - } - defer rsrc.Close() - return ioutil.ReadAll(rsrc) -} - -func (r *Reader) readXML() (string, error) { - if r.hdr.XMLData.CompressedSize() == 0 { - return "", nil - } - rsrc, err := r.resourceReader(&r.hdr.XMLData) - if err != nil { - return "", err - } - defer rsrc.Close() - - XMLData := make([]uint16, r.hdr.XMLData.OriginalSize/2) - err = binary.Read(rsrc, binary.LittleEndian, XMLData) - if err != nil { - return "", &ParseError{Oper: "XML data", Err: err} - } - - // The BOM will always indicate little-endian UTF-16. - if XMLData[0] != 0xfeff { - return "", &ParseError{Oper: "XML data", Err: errors.New("invalid BOM")} - } - return string(utf16.Decode(XMLData[1:])), nil -} - -func (r *Reader) readOffsetTable(res *resourceDescriptor) (map[SHA1Hash]resourceDescriptor, []*Image, error) { - fileData := make(map[SHA1Hash]resourceDescriptor) - var images []*Image - - offsetTable, err := r.readResource(res) - if err != nil { - return nil, nil, &ParseError{Oper: "offset table", Err: err} - } - - br := bytes.NewReader(offsetTable) - for i := 0; ; i++ { - var res streamDescriptor - err := binary.Read(br, binary.LittleEndian, &res) - if err == io.EOF { - break - } - if err != nil { - return nil, nil, &ParseError{Oper: "offset table", Err: err} - } - if res.Flags()&^supportedResFlags != 0 { - return nil, nil, &ParseError{Oper: "offset table", Err: errors.New("unsupported resource flag")} - } - - // Validation for ad-hoc testing - if validate { - sec, err := r.resourceReader(&res.resourceDescriptor) - if err != nil { - panic(fmt.Sprint(i, err)) - } - hash := sha1.New() - _, err = io.Copy(hash, sec) - sec.Close() - if err != nil { - panic(fmt.Sprint(i, err)) - } - var cmphash SHA1Hash - copy(cmphash[:], hash.Sum(nil)) - if cmphash != res.Hash { - panic(fmt.Sprint(i, "hash mismatch")) - } - } - - if res.Flags()&resFlagMetadata != 0 { - image := &Image{ - wim: r, - offset: res.resourceDescriptor, - } - images = append(images, image) - } else { - fileData[res.Hash] = res.resourceDescriptor - } - } - - if len(images) != int(r.hdr.ImageCount) { - return nil, nil, &ParseError{Oper: "offset table", Err: errors.New("mismatched image count")} - } - - return fileData, images, nil -} - -func (r *Reader) readSecurityDescriptors(rsrc io.Reader) (sds [][]byte, n int64, err error) { - var secBlock securityblockDisk - err = binary.Read(rsrc, binary.LittleEndian, &secBlock) - if err != nil { - err = &ParseError{Oper: "security table", Err: err} - return - } - - n += securityblockDiskSize - - secSizes := make([]int64, secBlock.NumEntries) - err = binary.Read(rsrc, binary.LittleEndian, &secSizes) - if err != nil { - err = &ParseError{Oper: "security table sizes", Err: err} - return - } - - n += int64(secBlock.NumEntries * 8) - - sds = make([][]byte, secBlock.NumEntries) - for i, size := range secSizes { - sd := make([]byte, size&0xffffffff) - _, err = io.ReadFull(rsrc, sd) - if err != nil { - err = &ParseError{Oper: "security descriptor", Err: err} - return - } - n += int64(len(sd)) - sds[i] = sd - } - - secsize := int64((secBlock.TotalLength + 7) &^ 7) - if n > secsize { - err = &ParseError{Oper: "security descriptor", Err: errors.New("security descriptor table too small")} - return - } - - _, err = io.CopyN(ioutil.Discard, rsrc, secsize-n) - if err != nil { - return - } - - n = secsize - return -} - -// Open parses the image and returns the root directory. -func (img *Image) Open() (*File, error) { - if img.sds == nil { - rsrc, err := img.wim.resourceReaderWithOffset(&img.offset, img.rootOffset) - if err != nil { - return nil, err - } - sds, n, err := img.wim.readSecurityDescriptors(rsrc) - if err != nil { - rsrc.Close() - return nil, err - } - img.sds = sds - img.r = rsrc - img.rootOffset = n - img.curOffset = n - } - - f, err := img.readdir(img.rootOffset) - if err != nil { - return nil, err - } - if len(f) != 1 { - return nil, &ParseError{Oper: "root directory", Err: errors.New("expected exactly 1 root directory entry")} - } - return f[0], err -} - -func (img *Image) reset() { - if img.r != nil { - img.r.Close() - img.r = nil - } - img.curOffset = -1 -} - -func (img *Image) readdir(offset int64) ([]*File, error) { - img.m.Lock() - defer img.m.Unlock() - - if offset < img.curOffset || offset > img.curOffset+chunkSize { - // Reset to seek backward or to seek forward very far. - img.reset() - } - if img.r == nil { - rsrc, err := img.wim.resourceReaderWithOffset(&img.offset, offset) - if err != nil { - return nil, err - } - img.r = rsrc - img.curOffset = offset - } - if offset > img.curOffset { - _, err := io.CopyN(ioutil.Discard, img.r, offset-img.curOffset) - if err != nil { - img.reset() - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - return nil, err - } - } - - var entries []*File - for { - e, n, err := img.readNextEntry(img.r) - img.curOffset += n - if err == io.EOF { - break - } - if err != nil { - img.reset() - return nil, err - } - entries = append(entries, e) - } - return entries, nil -} - -func (img *Image) readNextEntry(r io.Reader) (*File, int64, error) { - var length int64 - err := binary.Read(r, binary.LittleEndian, &length) - if err != nil { - return nil, 0, &ParseError{Oper: "directory length check", Err: err} - } - - if length == 0 { - return nil, 8, io.EOF - } - - left := length - if left < direntrySize { - return nil, 0, &ParseError{Oper: "directory entry", Err: errors.New("size too short")} - } - - var dentry direntry - err = binary.Read(r, binary.LittleEndian, &dentry) - if err != nil { - return nil, 0, &ParseError{Oper: "directory entry", Err: err} - } - - left -= direntrySize - - namesLen := int64(dentry.FileNameLength + 2 + dentry.ShortNameLength) - if left < namesLen { - return nil, 0, &ParseError{Oper: "directory entry", Err: errors.New("size too short for names")} - } - - names := make([]uint16, namesLen/2) - err = binary.Read(r, binary.LittleEndian, names) - if err != nil { - return nil, 0, &ParseError{Oper: "file name", Err: err} - } - - left -= namesLen - - var name, shortName string - if dentry.FileNameLength > 0 { - name = string(utf16.Decode(names[:dentry.FileNameLength/2])) - } - - if dentry.ShortNameLength > 0 { - shortName = string(utf16.Decode(names[dentry.FileNameLength/2+1:])) - } - - var offset resourceDescriptor - zerohash := SHA1Hash{} - if dentry.Hash != zerohash { - var ok bool - offset, ok = img.wim.fileData[dentry.Hash] - if !ok { - return nil, 0, &ParseError{Oper: "directory entry", Path: name, Err: fmt.Errorf("could not find file data matching hash %#v", dentry)} - } - } - - f := &File{ - FileHeader: FileHeader{ - Attributes: dentry.Attributes, - CreationTime: dentry.CreationTime, - LastAccessTime: dentry.LastAccessTime, - LastWriteTime: dentry.LastWriteTime, - Hash: dentry.Hash, - Size: offset.OriginalSize, - Name: name, - ShortName: shortName, - }, - - offset: offset, - img: img, - subdirOffset: dentry.SubdirOffset, - } - - isDir := false - - if dentry.Attributes&FILE_ATTRIBUTE_REPARSE_POINT == 0 { - f.LinkID = dentry.ReparseHardLink - if dentry.Attributes&FILE_ATTRIBUTE_DIRECTORY != 0 { - isDir = true - } - } else { - f.ReparseTag = uint32(dentry.ReparseHardLink) - f.ReparseReserved = uint32(dentry.ReparseHardLink >> 32) - } - - if isDir && f.subdirOffset == 0 { - return nil, 0, &ParseError{Oper: "directory entry", Path: name, Err: errors.New("no subdirectory data for directory")} - } else if !isDir && f.subdirOffset != 0 { - return nil, 0, &ParseError{Oper: "directory entry", Path: name, Err: errors.New("unexpected subdirectory data for non-directory")} - } - - if dentry.SecurityID != 0xffffffff { - f.SecurityDescriptor = img.sds[dentry.SecurityID] - } - - _, err = io.CopyN(ioutil.Discard, r, left) - if err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - return nil, 0, err - } - - if dentry.StreamCount > 0 { - var streams []*Stream - for i := uint16(0); i < dentry.StreamCount; i++ { - s, n, err := img.readNextStream(r) - length += n - if err != nil { - return nil, 0, err - } - // The first unnamed stream should be treated as the file stream. - if i == 0 && s.Name == "" { - f.Hash = s.Hash - f.Size = s.Size - f.offset = s.offset - } else if s.Name != "" { - streams = append(streams, s) - } - } - f.Streams = streams - } - - if dentry.Attributes&FILE_ATTRIBUTE_REPARSE_POINT != 0 && f.Size == 0 { - return nil, 0, &ParseError{Oper: "directory entry", Path: name, Err: errors.New("reparse point is missing reparse stream")} - } - - return f, length, nil -} - -func (img *Image) readNextStream(r io.Reader) (*Stream, int64, error) { - var length int64 - err := binary.Read(r, binary.LittleEndian, &length) - if err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - return nil, 0, &ParseError{Oper: "stream length check", Err: err} - } - - left := length - if left < streamentrySize { - return nil, 0, &ParseError{Oper: "stream entry", Err: errors.New("size too short")} - } - - var sentry streamentry - err = binary.Read(r, binary.LittleEndian, &sentry) - if err != nil { - return nil, 0, &ParseError{Oper: "stream entry", Err: err} - } - - left -= streamentrySize - - if left < int64(sentry.NameLength) { - return nil, 0, &ParseError{Oper: "stream entry", Err: errors.New("size too short for name")} - } - - names := make([]uint16, sentry.NameLength/2) - err = binary.Read(r, binary.LittleEndian, names) - if err != nil { - return nil, 0, &ParseError{Oper: "file name", Err: err} - } - - left -= int64(sentry.NameLength) - name := string(utf16.Decode(names)) - - var offset resourceDescriptor - if sentry.Hash != (SHA1Hash{}) { - var ok bool - offset, ok = img.wim.fileData[sentry.Hash] - if !ok { - return nil, 0, &ParseError{Oper: "stream entry", Path: name, Err: fmt.Errorf("could not find file data matching hash %v", sentry.Hash)} - } - } - - s := &Stream{ - StreamHeader: StreamHeader{ - Hash: sentry.Hash, - Size: offset.OriginalSize, - Name: name, - }, - wim: img.wim, - offset: offset, - } - - _, err = io.CopyN(ioutil.Discard, r, left) - if err != nil { - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - return nil, 0, err - } - - return s, length, nil -} - -// Open returns an io.ReadCloser that can be used to read the stream's contents. -func (s *Stream) Open() (io.ReadCloser, error) { - return s.wim.resourceReader(&s.offset) -} - -// Open returns an io.ReadCloser that can be used to read the file's contents. -func (f *File) Open() (io.ReadCloser, error) { - return f.img.wim.resourceReader(&f.offset) -} - -// Readdir reads the directory entries. -func (f *File) Readdir() ([]*File, error) { - if !f.IsDir() { - return nil, errors.New("not a directory") - } - return f.img.readdir(f.subdirOffset) -} - -// IsDir returns whether the given file is a directory. It returns false when it -// is a directory reparse point. -func (f *FileHeader) IsDir() bool { - return f.Attributes&(FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_REPARSE_POINT) == FILE_ATTRIBUTE_DIRECTORY -} diff --git a/vendor/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go b/vendor/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go deleted file mode 100644 index 5c87dd456..000000000 --- a/vendor/github.com/davecgh/go-spew/spew/testdata/dumpcgo.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2013 Dave Collins -// -// 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. - -// NOTE: Due to the following build constraints, this file will only be compiled -// when both cgo is supported and "-tags testcgo" is added to the go test -// command line. This code should really only be in the dumpcgo_test.go file, -// but unfortunately Go will not allow cgo in test files, so this is a -// workaround to allow cgo types to be tested. This configuration is used -// because spew itself does not require cgo to run even though it does handle -// certain cgo types specially. Rather than forcing all clients to require cgo -// and an external C compiler just to run the tests, this scheme makes them -// optional. -// +build cgo,testcgo - -package testdata - -/* -#include -typedef unsigned char custom_uchar_t; - -char *ncp = 0; -char *cp = "test"; -char ca[6] = {'t', 'e', 's', 't', '2', '\0'}; -unsigned char uca[6] = {'t', 'e', 's', 't', '3', '\0'}; -signed char sca[6] = {'t', 'e', 's', 't', '4', '\0'}; -uint8_t ui8ta[6] = {'t', 'e', 's', 't', '5', '\0'}; -custom_uchar_t tuca[6] = {'t', 'e', 's', 't', '6', '\0'}; -*/ -import "C" - -// GetCgoNullCharPointer returns a null char pointer via cgo. This is only -// used for tests. -func GetCgoNullCharPointer() interface{} { - return C.ncp -} - -// GetCgoCharPointer returns a char pointer via cgo. This is only used for -// tests. -func GetCgoCharPointer() interface{} { - return C.cp -} - -// GetCgoCharArray returns a char array via cgo and the array's len and cap. -// This is only used for tests. -func GetCgoCharArray() (interface{}, int, int) { - return C.ca, len(C.ca), cap(C.ca) -} - -// GetCgoUnsignedCharArray returns an unsigned char array via cgo and the -// array's len and cap. This is only used for tests. -func GetCgoUnsignedCharArray() (interface{}, int, int) { - return C.uca, len(C.uca), cap(C.uca) -} - -// GetCgoSignedCharArray returns a signed char array via cgo and the array's len -// and cap. This is only used for tests. -func GetCgoSignedCharArray() (interface{}, int, int) { - return C.sca, len(C.sca), cap(C.sca) -} - -// GetCgoUint8tArray returns a uint8_t array via cgo and the array's len and -// cap. This is only used for tests. -func GetCgoUint8tArray() (interface{}, int, int) { - return C.ui8ta, len(C.ui8ta), cap(C.ui8ta) -} - -// GetCgoTypdefedUnsignedCharArray returns a typedefed unsigned char array via -// cgo and the array's len and cap. This is only used for tests. -func GetCgoTypdefedUnsignedCharArray() (interface{}, int, int) { - return C.tuca, len(C.tuca), cap(C.tuca) -} diff --git a/vendor/github.com/divolgin/archiver/compressor/fake_compressor/fake_compressor.go b/vendor/github.com/divolgin/archiver/compressor/fake_compressor/fake_compressor.go deleted file mode 100644 index b96a1f3ff..000000000 --- a/vendor/github.com/divolgin/archiver/compressor/fake_compressor/fake_compressor.go +++ /dev/null @@ -1,18 +0,0 @@ -package fake_compressor - -type FakeCompressor struct { - Src string - Dest string - - CompressError error -} - -func (compressor *FakeCompressor) Compress(src, dest string) error { - if compressor.CompressError != nil { - return compressor.CompressError - } - - compressor.Src = src - compressor.Dest = dest - return nil -} diff --git a/vendor/github.com/divolgin/archiver/extractor/fake_extractor/fake_extractor.go b/vendor/github.com/divolgin/archiver/extractor/fake_extractor/fake_extractor.go deleted file mode 100644 index 9241284a7..000000000 --- a/vendor/github.com/divolgin/archiver/extractor/fake_extractor/fake_extractor.go +++ /dev/null @@ -1,24 +0,0 @@ -package fake_extractor - -type FakeExtractor struct { - extractInput struct { - src string - dest string - } - extractOutput struct { - err error - } -} - -func (extractor *FakeExtractor) Extract(src, dest string) error { - extractor.extractInput.src = src - extractor.extractInput.dest = dest - return extractor.extractOutput.err -} - -func (extractor *FakeExtractor) ExtractInput() (src, dest string) { - return extractor.extractInput.src, extractor.extractInput.dest -} -func (extractor *FakeExtractor) SetExtractOutput(err error) { - extractor.extractOutput.err = err -} diff --git a/vendor/github.com/divolgin/archiver/extractor/test_helper/archiver.go b/vendor/github.com/divolgin/archiver/extractor/test_helper/archiver.go deleted file mode 100644 index e0922e542..000000000 --- a/vendor/github.com/divolgin/archiver/extractor/test_helper/archiver.go +++ /dev/null @@ -1,127 +0,0 @@ -package test_helper - -import ( - "archive/tar" - "archive/zip" - "compress/gzip" - "io" - "os" - - . "github.com/onsi/gomega" -) - -type ArchiveFile struct { - Name string - Body string - Mode int64 - Dir bool - Link string -} - -func CreateZipArchive(filename string, files []ArchiveFile) { - file, err := os.Create(filename) - Expect(err).NotTo(HaveOccurred()) - - w := zip.NewWriter(file) - - for _, file := range files { - header := &zip.FileHeader{ - Name: file.Name, - } - - mode := file.Mode - if mode == 0 { - mode = 0777 - } - - if file.Link != "" { - header.SetMode(os.FileMode(mode) | os.ModeSymlink) - } else { - header.SetMode(os.FileMode(mode)) - } - - f, err := w.CreateHeader(header) - Expect(err).NotTo(HaveOccurred()) - - if file.Link != "" { - _, err = f.Write([]byte(file.Link)) - } else { - _, err = f.Write([]byte(file.Body)) - } - Expect(err).NotTo(HaveOccurred()) - } - - err = w.Close() - Expect(err).NotTo(HaveOccurred()) - - err = file.Close() - Expect(err).NotTo(HaveOccurred()) -} - -func CreateTarGZArchive(filename string, files []ArchiveFile) { - file, err := os.Create(filename) - Expect(err).NotTo(HaveOccurred()) - - gw := gzip.NewWriter(file) - - WriteTar(gw, files) - - err = gw.Close() - Expect(err).NotTo(HaveOccurred()) - - err = file.Close() - Expect(err).NotTo(HaveOccurred()) -} - -func CreateTarArchive(filename string, files []ArchiveFile) { - file, err := os.Create(filename) - Expect(err).NotTo(HaveOccurred()) - - WriteTar(file, files) - - err = file.Close() - Expect(err).NotTo(HaveOccurred()) -} - -func WriteTar(destination io.Writer, files []ArchiveFile) { - w := tar.NewWriter(destination) - - for _, file := range files { - var header *tar.Header - - mode := file.Mode - if mode == 0 { - mode = 0777 - } - - if file.Dir { - header = &tar.Header{ - Name: file.Name, - Mode: 0755, - Typeflag: tar.TypeDir, - } - } else if file.Link != "" { - header = &tar.Header{ - Name: file.Name, - Typeflag: tar.TypeSymlink, - Linkname: file.Link, - Mode: file.Mode, - } - } else { - header = &tar.Header{ - Name: file.Name, - Mode: mode, - Size: int64(len(file.Body)), - } - } - - err := w.WriteHeader(header) - Expect(err).NotTo(HaveOccurred()) - - _, err = w.Write([]byte(file.Body)) - Expect(err).NotTo(HaveOccurred()) - } - - err := w.Close() - Expect(err).NotTo(HaveOccurred()) -} diff --git a/vendor/github.com/docker/distribution/Godeps/Godeps.json b/vendor/github.com/docker/distribution/Godeps/Godeps.json deleted file mode 100644 index dbdd89149..000000000 --- a/vendor/github.com/docker/distribution/Godeps/Godeps.json +++ /dev/null @@ -1,458 +0,0 @@ -{ - "ImportPath": "github.com/docker/distribution", - "GoVersion": "go1.6", - "GodepVersion": "v74", - "Packages": [ - "./..." - ], - "Deps": [ - { - "ImportPath": "github.com/Azure/azure-sdk-for-go/storage", - "Comment": "v5.0.0-beta-6-g0b5fe2a", - "Rev": "0b5fe2abe0271ba07049eacaa65922d67c319543" - }, - { - "ImportPath": "github.com/Sirupsen/logrus", - "Comment": "v0.7.3", - "Rev": "55eb11d21d2a31a3cc93838241d04800f52e823d" - }, - { - "ImportPath": "github.com/Sirupsen/logrus/formatters/logstash", - "Comment": "v0.7.3", - "Rev": "55eb11d21d2a31a3cc93838241d04800f52e823d" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/awserr", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/awsutil", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/client", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/client/metadata", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/corehandlers", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/credentials", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/defaults", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/ec2metadata", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/request", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/session", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/aws/signer/v4", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/endpoints", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/query", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/query/queryutil", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/rest", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/restxml", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/private/waiter", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/service/cloudfront/sign", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/service/s3", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath", - "Comment": "v1.2.4", - "Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6" - }, - { - "ImportPath": "github.com/bugsnag/bugsnag-go", - "Comment": "v1.0.2-5-gb1d1530", - "Rev": "b1d153021fcd90ca3f080db36bec96dc690fb274" - }, - { - "ImportPath": "github.com/bugsnag/bugsnag-go/errors", - "Comment": "v1.0.2-5-gb1d1530", - "Rev": "b1d153021fcd90ca3f080db36bec96dc690fb274" - }, - { - "ImportPath": "github.com/bugsnag/osext", - "Rev": "0dd3f918b21bec95ace9dc86c7e70266cfc5c702" - }, - { - "ImportPath": "github.com/bugsnag/panicwrap", - "Comment": "1.0.0-2-ge2c2850", - "Rev": "e2c28503fcd0675329da73bf48b33404db873782" - }, - { - "ImportPath": "github.com/denverdino/aliyungo/common", - "Rev": "afedced274aa9a7fcdd47ac97018f0f8db4e5de2" - }, - { - "ImportPath": "github.com/denverdino/aliyungo/oss", - "Rev": "afedced274aa9a7fcdd47ac97018f0f8db4e5de2" - }, - { - "ImportPath": "github.com/denverdino/aliyungo/util", - "Rev": "afedced274aa9a7fcdd47ac97018f0f8db4e5de2" - }, - { - "ImportPath": "github.com/docker/goamz/aws", - "Rev": "f0a21f5b2e12f83a505ecf79b633bb2035cf6f85" - }, - { - "ImportPath": "github.com/docker/goamz/s3", - "Rev": "f0a21f5b2e12f83a505ecf79b633bb2035cf6f85" - }, - { - "ImportPath": "github.com/docker/libtrust", - "Rev": "fa567046d9b14f6aa788882a950d69651d230b21" - }, - { - "ImportPath": "github.com/garyburd/redigo/internal", - "Rev": "535138d7bcd717d6531c701ef5933d98b1866257" - }, - { - "ImportPath": "github.com/garyburd/redigo/redis", - "Rev": "535138d7bcd717d6531c701ef5933d98b1866257" - }, - { - "ImportPath": "github.com/golang/protobuf/proto", - "Rev": "8d92cf5fc15a4382f8964b08e1f42a75c0591aa3" - }, - { - "ImportPath": "github.com/gorilla/context", - "Rev": "14f550f51af52180c2eefed15e5fd18d63c0a64a" - }, - { - "ImportPath": "github.com/gorilla/handlers", - "Rev": "60c7bfde3e33c201519a200a4507a158cc03a17b" - }, - { - "ImportPath": "github.com/gorilla/mux", - "Rev": "e444e69cbd2e2e3e0749a2f3c717cec491552bbf" - }, - { - "ImportPath": "github.com/inconshreveable/mousetrap", - "Rev": "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" - }, - { - "ImportPath": "github.com/mitchellh/mapstructure", - "Rev": "482a9fd5fa83e8c4e7817413b80f3eb8feec03ef" - }, - { - "ImportPath": "github.com/ncw/swift", - "Rev": "ce444d6d47c51d4dda9202cd38f5094dd8e27e86" - }, - { - "ImportPath": "github.com/ncw/swift/swifttest", - "Rev": "ce444d6d47c51d4dda9202cd38f5094dd8e27e86" - }, - { - "ImportPath": "github.com/spf13/cobra", - "Rev": "312092086bed4968099259622145a0c9ae280064" - }, - { - "ImportPath": "github.com/spf13/pflag", - "Rev": "5644820622454e71517561946e3d94b9f9db6842" - }, - { - "ImportPath": "github.com/stevvooe/resumable", - "Rev": "51ad44105773cafcbe91927f70ac68e1bf78f8b4" - }, - { - "ImportPath": "github.com/stevvooe/resumable/sha256", - "Rev": "51ad44105773cafcbe91927f70ac68e1bf78f8b4" - }, - { - "ImportPath": "github.com/stevvooe/resumable/sha512", - "Rev": "51ad44105773cafcbe91927f70ac68e1bf78f8b4" - }, - { - "ImportPath": "github.com/yvasiyarov/go-metrics", - "Rev": "57bccd1ccd43f94bb17fdd8bf3007059b802f85e" - }, - { - "ImportPath": "github.com/yvasiyarov/gorelic", - "Comment": "v0.0.6-8-ga9bba5b", - "Rev": "a9bba5b9ab508a086f9a12b8c51fab68478e2128" - }, - { - "ImportPath": "github.com/yvasiyarov/newrelic_platform_go", - "Rev": "b21fdbd4370f3717f3bbd2bf41c223bc273068e6" - }, - { - "ImportPath": "golang.org/x/crypto/bcrypt", - "Rev": "c10c31b5e94b6f7a0283272dc2bb27163dcea24b" - }, - { - "ImportPath": "golang.org/x/crypto/blowfish", - "Rev": "c10c31b5e94b6f7a0283272dc2bb27163dcea24b" - }, - { - "ImportPath": "golang.org/x/crypto/ocsp", - "Rev": "c10c31b5e94b6f7a0283272dc2bb27163dcea24b" - }, - { - "ImportPath": "golang.org/x/net/context", - "Rev": "4876518f9e71663000c348837735820161a42df7" - }, - { - "ImportPath": "golang.org/x/net/context/ctxhttp", - "Rev": "4876518f9e71663000c348837735820161a42df7" - }, - { - "ImportPath": "golang.org/x/net/http2", - "Rev": "4876518f9e71663000c348837735820161a42df7" - }, - { - "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "4876518f9e71663000c348837735820161a42df7" - }, - { - "ImportPath": "golang.org/x/net/internal/timeseries", - "Rev": "4876518f9e71663000c348837735820161a42df7" - }, - { - "ImportPath": "golang.org/x/net/trace", - "Rev": "4876518f9e71663000c348837735820161a42df7" - }, - { - "ImportPath": "golang.org/x/oauth2", - "Rev": "045497edb6234273d67dbc25da3f2ddbc4c4cacf" - }, - { - "ImportPath": "golang.org/x/oauth2/google", - "Rev": "045497edb6234273d67dbc25da3f2ddbc4c4cacf" - }, - { - "ImportPath": "golang.org/x/oauth2/internal", - "Rev": "045497edb6234273d67dbc25da3f2ddbc4c4cacf" - }, - { - "ImportPath": "golang.org/x/oauth2/jws", - "Rev": "045497edb6234273d67dbc25da3f2ddbc4c4cacf" - }, - { - "ImportPath": "golang.org/x/oauth2/jwt", - "Rev": "045497edb6234273d67dbc25da3f2ddbc4c4cacf" - }, - { - "ImportPath": "golang.org/x/time/rate", - "Rev": "a4bde12657593d5e90d0533a3e4fd95e635124cb" - }, - { - "ImportPath": "google.golang.org/api/gensupport", - "Rev": "9bf6e6e569ff057f75d9604a46c52928f17d2b54" - }, - { - "ImportPath": "google.golang.org/api/googleapi", - "Rev": "9bf6e6e569ff057f75d9604a46c52928f17d2b54" - }, - { - "ImportPath": "google.golang.org/api/googleapi/internal/uritemplates", - "Rev": "9bf6e6e569ff057f75d9604a46c52928f17d2b54" - }, - { - "ImportPath": "google.golang.org/api/storage/v1", - "Rev": "9bf6e6e569ff057f75d9604a46c52928f17d2b54" - }, - { - "ImportPath": "google.golang.org/appengine", - "Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19" - }, - { - "ImportPath": "google.golang.org/appengine/internal", - "Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19" - }, - { - "ImportPath": "google.golang.org/appengine/internal/app_identity", - "Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19" - }, - { - "ImportPath": "google.golang.org/appengine/internal/base", - "Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19" - }, - { - "ImportPath": "google.golang.org/appengine/internal/datastore", - "Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19" - }, - { - "ImportPath": "google.golang.org/appengine/internal/log", - "Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19" - }, - { - "ImportPath": "google.golang.org/appengine/internal/modules", - "Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19" - }, - { - "ImportPath": "google.golang.org/appengine/internal/remote_api", - "Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19" - }, - { - "ImportPath": "google.golang.org/cloud", - "Rev": "975617b05ea8a58727e6c1a06b6161ff4185a9f2" - }, - { - "ImportPath": "google.golang.org/cloud/compute/metadata", - "Rev": "975617b05ea8a58727e6c1a06b6161ff4185a9f2" - }, - { - "ImportPath": "google.golang.org/cloud/internal", - "Rev": "975617b05ea8a58727e6c1a06b6161ff4185a9f2" - }, - { - "ImportPath": "google.golang.org/cloud/internal/opts", - "Rev": "975617b05ea8a58727e6c1a06b6161ff4185a9f2" - }, - { - "ImportPath": "google.golang.org/cloud/storage", - "Rev": "975617b05ea8a58727e6c1a06b6161ff4185a9f2" - }, - { - "ImportPath": "google.golang.org/grpc", - "Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994" - }, - { - "ImportPath": "google.golang.org/grpc/codes", - "Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994" - }, - { - "ImportPath": "google.golang.org/grpc/credentials", - "Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994" - }, - { - "ImportPath": "google.golang.org/grpc/grpclog", - "Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994" - }, - { - "ImportPath": "google.golang.org/grpc/internal", - "Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994" - }, - { - "ImportPath": "google.golang.org/grpc/metadata", - "Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994" - }, - { - "ImportPath": "google.golang.org/grpc/naming", - "Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994" - }, - { - "ImportPath": "google.golang.org/grpc/peer", - "Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994" - }, - { - "ImportPath": "google.golang.org/grpc/transport", - "Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994" - }, - { - "ImportPath": "gopkg.in/check.v1", - "Rev": "64131543e7896d5bcc6bd5a76287eb75ea96c673" - }, - { - "ImportPath": "gopkg.in/yaml.v2", - "Rev": "bef53efd0c76e49e6de55ead051f886bea7e9420" - }, - { - "ImportPath": "rsc.io/letsencrypt", - "Rev": "a019c9e6fce0c7132679dea13bd8df7c86ffe26c" - }, - { - "ImportPath": "rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme", - "Rev": "a019c9e6fce0c7132679dea13bd8df7c86ffe26c" - }, - { - "ImportPath": "rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1", - "Rev": "a019c9e6fce0c7132679dea13bd8df7c86ffe26c" - }, - { - "ImportPath": "rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher", - "Rev": "a019c9e6fce0c7132679dea13bd8df7c86ffe26c" - }, - { - "ImportPath": "rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json", - "Rev": "a019c9e6fce0c7132679dea13bd8df7c86ffe26c" - } - ] -} diff --git a/vendor/github.com/docker/distribution/Godeps/Readme b/vendor/github.com/docker/distribution/Godeps/Readme deleted file mode 100644 index 4cdaa53d5..000000000 --- a/vendor/github.com/docker/distribution/Godeps/Readme +++ /dev/null @@ -1,5 +0,0 @@ -This directory tree is generated automatically by godep. - -Please do not edit. - -See https://github.com/tools/godep for more information. diff --git a/vendor/github.com/docker/distribution/cmd/digest/main.go b/vendor/github.com/docker/distribution/cmd/digest/main.go deleted file mode 100644 index 49426a886..000000000 --- a/vendor/github.com/docker/distribution/cmd/digest/main.go +++ /dev/null @@ -1,97 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "io" - "log" - "os" - - "github.com/docker/distribution/digest" - "github.com/docker/distribution/version" -) - -var ( - algorithm = digest.Canonical - showVersion bool -) - -type job struct { - name string - reader io.Reader -} - -func init() { - flag.Var(&algorithm, "a", "select the digest algorithm (shorthand)") - flag.Var(&algorithm, "algorithm", "select the digest algorithm") - flag.BoolVar(&showVersion, "version", false, "show the version and exit") - - log.SetFlags(0) - log.SetPrefix(os.Args[0] + ": ") -} - -func usage() { - fmt.Fprintf(os.Stderr, "usage: %s [files...]\n", os.Args[0]) - fmt.Fprintf(os.Stderr, ` -Calculate the digest of one or more input files, emitting the result -to standard out. If no files are provided, the digest of stdin will -be calculated. - -`) - flag.PrintDefaults() -} - -func unsupported() { - log.Fatalf("unsupported digest algorithm: %v", algorithm) -} - -func main() { - var jobs []job - - flag.Usage = usage - flag.Parse() - if showVersion { - version.PrintVersion() - return - } - - var fail bool // if we fail on one item, foul the exit code - if flag.NArg() > 0 { - for _, path := range flag.Args() { - fp, err := os.Open(path) - - if err != nil { - log.Printf("%s: %v", path, err) - fail = true - continue - } - defer fp.Close() - - jobs = append(jobs, job{name: path, reader: fp}) - } - } else { - // just read stdin - jobs = append(jobs, job{name: "-", reader: os.Stdin}) - } - - digestFn := algorithm.FromReader - - if !algorithm.Available() { - unsupported() - } - - for _, job := range jobs { - dgst, err := digestFn(job.reader) - if err != nil { - log.Printf("%s: %v", job.name, err) - fail = true - continue - } - - fmt.Printf("%v\t%s\n", dgst, job.name) - } - - if fail { - os.Exit(1) - } -} diff --git a/vendor/github.com/docker/distribution/cmd/registry-api-descriptor-template/main.go b/vendor/github.com/docker/distribution/cmd/registry-api-descriptor-template/main.go deleted file mode 100644 index e9cbc42a4..000000000 --- a/vendor/github.com/docker/distribution/cmd/registry-api-descriptor-template/main.go +++ /dev/null @@ -1,131 +0,0 @@ -// registry-api-descriptor-template uses the APIDescriptor defined in the -// api/v2 package to execute templates passed to the command line. -// -// For example, to generate a new API specification, one would execute the -// following command from the repo root: -// -// $ registry-api-descriptor-template docs/spec/api.md.tmpl > docs/spec/api.md -// -// The templates are passed in the api/v2.APIDescriptor object. Please see the -// package documentation for fields available on that object. The template -// syntax is from Go's standard library text/template package. For information -// on Go's template syntax, please see golang.org/pkg/text/template. -package main - -import ( - "log" - "net/http" - "os" - "path/filepath" - "regexp" - "text/template" - - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" -) - -var spaceRegex = regexp.MustCompile(`\n\s*`) - -func main() { - - if len(os.Args) != 2 { - log.Fatalln("please specify a template to execute.") - } - - path := os.Args[1] - filename := filepath.Base(path) - - funcMap := template.FuncMap{ - "removenewlines": func(s string) string { - return spaceRegex.ReplaceAllString(s, " ") - }, - "statustext": http.StatusText, - "prettygorilla": prettyGorillaMuxPath, - } - - tmpl := template.Must(template.New(filename).Funcs(funcMap).ParseFiles(path)) - - data := struct { - RouteDescriptors []v2.RouteDescriptor - ErrorDescriptors []errcode.ErrorDescriptor - }{ - RouteDescriptors: v2.APIDescriptor.RouteDescriptors, - ErrorDescriptors: append(errcode.GetErrorCodeGroup("registry.api.v2"), - // The following are part of the specification but provided by errcode default. - errcode.ErrorCodeUnauthorized.Descriptor(), - errcode.ErrorCodeDenied.Descriptor(), - errcode.ErrorCodeUnsupported.Descriptor()), - } - - if err := tmpl.Execute(os.Stdout, data); err != nil { - log.Fatalln(err) - } -} - -// prettyGorillaMuxPath removes the regular expressions from a gorilla/mux -// route string, making it suitable for documentation. -func prettyGorillaMuxPath(s string) string { - // Stateful parser that removes regular expressions from gorilla - // routes. It correctly handles balanced bracket pairs. - - var output string - var label string - var level int - -start: - if s[0] == '{' { - s = s[1:] - level++ - goto capture - } - - output += string(s[0]) - s = s[1:] - - goto end -capture: - switch s[0] { - case '{': - level++ - case '}': - level-- - - if level == 0 { - s = s[1:] - goto label - } - case ':': - s = s[1:] - goto skip - default: - label += string(s[0]) - } - s = s[1:] - goto capture -skip: - switch s[0] { - case '{': - level++ - case '}': - level-- - } - s = s[1:] - - if level == 0 { - goto label - } - - goto skip -label: - if label != "" { - output += "<" + label + ">" - label = "" - } -end: - if s != "" { - goto start - } - - return output - -} diff --git a/vendor/github.com/docker/distribution/cmd/registry/config-cache.yml b/vendor/github.com/docker/distribution/cmd/registry/config-cache.yml deleted file mode 100644 index 7a274ea59..000000000 --- a/vendor/github.com/docker/distribution/cmd/registry/config-cache.yml +++ /dev/null @@ -1,55 +0,0 @@ -version: 0.1 -log: - level: debug - fields: - service: registry - environment: development -storage: - cache: - blobdescriptor: redis - filesystem: - rootdirectory: /var/lib/registry-cache - maintenance: - uploadpurging: - enabled: false -http: - addr: :5000 - secret: asecretforlocaldevelopment - debug: - addr: localhost:5001 - headers: - X-Content-Type-Options: [nosniff] -redis: - addr: localhost:6379 - pool: - maxidle: 16 - maxactive: 64 - idletimeout: 300s - dialtimeout: 10ms - readtimeout: 10ms - writetimeout: 10ms -notifications: - endpoints: - - name: local-8082 - url: http://localhost:5003/callback - headers: - Authorization: [Bearer ] - timeout: 1s - threshold: 10 - backoff: 1s - disabled: true - - name: local-8083 - url: http://localhost:8083/callback - timeout: 1s - threshold: 10 - backoff: 1s - disabled: true -proxy: - remoteurl: https://registry-1.docker.io - username: username - password: password -health: - storagedriver: - enabled: true - interval: 10s - threshold: 3 diff --git a/vendor/github.com/docker/distribution/cmd/registry/config-dev.yml b/vendor/github.com/docker/distribution/cmd/registry/config-dev.yml deleted file mode 100644 index b6438be50..000000000 --- a/vendor/github.com/docker/distribution/cmd/registry/config-dev.yml +++ /dev/null @@ -1,66 +0,0 @@ -version: 0.1 -log: - level: debug - fields: - service: registry - environment: development - hooks: - - type: mail - disabled: true - levels: - - panic - options: - smtp: - addr: mail.example.com:25 - username: mailuser - password: password - insecure: true - from: sender@example.com - to: - - errors@example.com -storage: - delete: - enabled: true - cache: - blobdescriptor: redis - filesystem: - rootdirectory: /var/lib/registry - maintenance: - uploadpurging: - enabled: false -http: - addr: :5000 - debug: - addr: localhost:5001 - headers: - X-Content-Type-Options: [nosniff] -redis: - addr: localhost:6379 - pool: - maxidle: 16 - maxactive: 64 - idletimeout: 300s - dialtimeout: 10ms - readtimeout: 10ms - writetimeout: 10ms -notifications: - endpoints: - - name: local-5003 - url: http://localhost:5003/callback - headers: - Authorization: [Bearer ] - timeout: 1s - threshold: 10 - backoff: 1s - disabled: true - - name: local-8083 - url: http://localhost:8083/callback - timeout: 1s - threshold: 10 - backoff: 1s - disabled: true -health: - storagedriver: - enabled: true - interval: 10s - threshold: 3 diff --git a/vendor/github.com/docker/distribution/cmd/registry/config-example.yml b/vendor/github.com/docker/distribution/cmd/registry/config-example.yml deleted file mode 100644 index 3277f9a2e..000000000 --- a/vendor/github.com/docker/distribution/cmd/registry/config-example.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: 0.1 -log: - fields: - service: registry -storage: - cache: - blobdescriptor: inmemory - filesystem: - rootdirectory: /var/lib/registry -http: - addr: :5000 - headers: - X-Content-Type-Options: [nosniff] -health: - storagedriver: - enabled: true - interval: 10s - threshold: 3 diff --git a/vendor/github.com/docker/distribution/cmd/registry/main.go b/vendor/github.com/docker/distribution/cmd/registry/main.go deleted file mode 100644 index c077a0c18..000000000 --- a/vendor/github.com/docker/distribution/cmd/registry/main.go +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - _ "net/http/pprof" - - "github.com/docker/distribution/registry" - _ "github.com/docker/distribution/registry/auth/htpasswd" - _ "github.com/docker/distribution/registry/auth/silly" - _ "github.com/docker/distribution/registry/auth/token" - _ "github.com/docker/distribution/registry/proxy" - _ "github.com/docker/distribution/registry/storage/driver/azure" - _ "github.com/docker/distribution/registry/storage/driver/filesystem" - _ "github.com/docker/distribution/registry/storage/driver/gcs" - _ "github.com/docker/distribution/registry/storage/driver/inmemory" - _ "github.com/docker/distribution/registry/storage/driver/middleware/cloudfront" - _ "github.com/docker/distribution/registry/storage/driver/middleware/redirect" - _ "github.com/docker/distribution/registry/storage/driver/oss" - _ "github.com/docker/distribution/registry/storage/driver/s3-aws" - _ "github.com/docker/distribution/registry/storage/driver/s3-goamz" - _ "github.com/docker/distribution/registry/storage/driver/swift" -) - -func main() { - registry.RootCmd.Execute() -} diff --git a/vendor/github.com/docker/distribution/configuration/configuration.go b/vendor/github.com/docker/distribution/configuration/configuration.go deleted file mode 100644 index ec50a6b18..000000000 --- a/vendor/github.com/docker/distribution/configuration/configuration.go +++ /dev/null @@ -1,643 +0,0 @@ -package configuration - -import ( - "fmt" - "io" - "io/ioutil" - "net/http" - "reflect" - "strings" - "time" -) - -// Configuration is a versioned registry configuration, intended to be provided by a yaml file, and -// optionally modified by environment variables. -// -// Note that yaml field names should never include _ characters, since this is the separator used -// in environment variable names. -type Configuration struct { - // Version is the version which defines the format of the rest of the configuration - Version Version `yaml:"version"` - - // Log supports setting various parameters related to the logging - // subsystem. - Log struct { - // AccessLog configures access logging. - AccessLog struct { - // Disabled disables access logging. - Disabled bool `yaml:"disabled,omitempty"` - } `yaml:"accesslog,omitempty"` - - // Level is the granularity at which registry operations are logged. - Level Loglevel `yaml:"level"` - - // Formatter overrides the default formatter with another. Options - // include "text", "json" and "logstash". - Formatter string `yaml:"formatter,omitempty"` - - // Fields allows users to specify static string fields to include in - // the logger context. - Fields map[string]interface{} `yaml:"fields,omitempty"` - - // Hooks allows users to configure the log hooks, to enabling the - // sequent handling behavior, when defined levels of log message emit. - Hooks []LogHook `yaml:"hooks,omitempty"` - } - - // Loglevel is the level at which registry operations are logged. This is - // deprecated. Please use Log.Level in the future. - Loglevel Loglevel `yaml:"loglevel,omitempty"` - - // Storage is the configuration for the registry's storage driver - Storage Storage `yaml:"storage"` - - // Auth allows configuration of various authorization methods that may be - // used to gate requests. - Auth Auth `yaml:"auth,omitempty"` - - // Middleware lists all middlewares to be used by the registry. - Middleware map[string][]Middleware `yaml:"middleware,omitempty"` - - // Reporting is the configuration for error reporting - Reporting Reporting `yaml:"reporting,omitempty"` - - // HTTP contains configuration parameters for the registry's http - // interface. - HTTP struct { - // Addr specifies the bind address for the registry instance. - Addr string `yaml:"addr,omitempty"` - - // Net specifies the net portion of the bind address. A default empty value means tcp. - Net string `yaml:"net,omitempty"` - - // Host specifies an externally-reachable address for the registry, as a fully - // qualified URL. - Host string `yaml:"host,omitempty"` - - Prefix string `yaml:"prefix,omitempty"` - - // Secret specifies the secret key which HMAC tokens are created with. - Secret string `yaml:"secret,omitempty"` - - // RelativeURLs specifies that relative URLs should be returned in - // Location headers - RelativeURLs bool `yaml:"relativeurls,omitempty"` - - // TLS instructs the http server to listen with a TLS configuration. - // This only support simple tls configuration with a cert and key. - // Mostly, this is useful for testing situations or simple deployments - // that require tls. If more complex configurations are required, use - // a proxy or make a proposal to add support here. - TLS struct { - // Certificate specifies the path to an x509 certificate file to - // be used for TLS. - Certificate string `yaml:"certificate,omitempty"` - - // Key specifies the path to the x509 key file, which should - // contain the private portion for the file specified in - // Certificate. - Key string `yaml:"key,omitempty"` - - // Specifies the CA certs for client authentication - // A file may contain multiple CA certificates encoded as PEM - ClientCAs []string `yaml:"clientcas,omitempty"` - - // LetsEncrypt is used to configuration setting up TLS through - // Let's Encrypt instead of manually specifying certificate and - // key. If a TLS certificate is specified, the Let's Encrypt - // section will not be used. - LetsEncrypt struct { - // CacheFile specifies cache file to use for lets encrypt - // certificates and keys. - CacheFile string `yaml:"cachefile,omitempty"` - - // Email is the email to use during Let's Encrypt registration - Email string `yaml:"email,omitempty"` - } `yaml:"letsencrypt,omitempty"` - } `yaml:"tls,omitempty"` - - // Headers is a set of headers to include in HTTP responses. A common - // use case for this would be security headers such as - // Strict-Transport-Security. The map keys are the header names, and - // the values are the associated header payloads. - Headers http.Header `yaml:"headers,omitempty"` - - // Debug configures the http debug interface, if specified. This can - // include services such as pprof, expvar and other data that should - // not be exposed externally. Left disabled by default. - Debug struct { - // Addr specifies the bind address for the debug server. - Addr string `yaml:"addr,omitempty"` - } `yaml:"debug,omitempty"` - - // HTTP2 configuration options - HTTP2 struct { - // Specifies wether the registry should disallow clients attempting - // to connect via http2. If set to true, only http/1.1 is supported. - Disabled bool `yaml:"disabled,omitempty"` - } `yaml:"http2,omitempty"` - } `yaml:"http,omitempty"` - - // Notifications specifies configuration about various endpoint to which - // registry events are dispatched. - Notifications Notifications `yaml:"notifications,omitempty"` - - // Redis configures the redis pool available to the registry webapp. - Redis struct { - // Addr specifies the the redis instance available to the application. - Addr string `yaml:"addr,omitempty"` - - // Password string to use when making a connection. - Password string `yaml:"password,omitempty"` - - // DB specifies the database to connect to on the redis instance. - DB int `yaml:"db,omitempty"` - - DialTimeout time.Duration `yaml:"dialtimeout,omitempty"` // timeout for connect - ReadTimeout time.Duration `yaml:"readtimeout,omitempty"` // timeout for reads of data - WriteTimeout time.Duration `yaml:"writetimeout,omitempty"` // timeout for writes of data - - // Pool configures the behavior of the redis connection pool. - Pool struct { - // MaxIdle sets the maximum number of idle connections. - MaxIdle int `yaml:"maxidle,omitempty"` - - // MaxActive sets the maximum number of connections that should be - // opened before blocking a connection request. - MaxActive int `yaml:"maxactive,omitempty"` - - // IdleTimeout sets the amount time to wait before closing - // inactive connections. - IdleTimeout time.Duration `yaml:"idletimeout,omitempty"` - } `yaml:"pool,omitempty"` - } `yaml:"redis,omitempty"` - - Health Health `yaml:"health,omitempty"` - - Proxy Proxy `yaml:"proxy,omitempty"` - - // Compatibility is used for configurations of working with older or deprecated features. - Compatibility struct { - // Schema1 configures how schema1 manifests will be handled - Schema1 struct { - // TrustKey is the signing key to use for adding the signature to - // schema1 manifests. - TrustKey string `yaml:"signingkeyfile,omitempty"` - } `yaml:"schema1,omitempty"` - } `yaml:"compatibility,omitempty"` - - // Validation configures validation options for the registry. - Validation struct { - // Enabled enables the other options in this section. - Enabled bool `yaml:"enabled,omitempty"` - // Manifests configures manifest validation. - Manifests struct { - // URLs configures validation for URLs in pushed manifests. - URLs struct { - // Allow specifies regular expressions (https://godoc.org/regexp/syntax) - // that URLs in pushed manifests must match. - Allow []string `yaml:"allow,omitempty"` - // Deny specifies regular expressions (https://godoc.org/regexp/syntax) - // that URLs in pushed manifests must not match. - Deny []string `yaml:"deny,omitempty"` - } `yaml:"urls,omitempty"` - } `yaml:"manifests,omitempty"` - } `yaml:"validation,omitempty"` - - // Policy configures registry policy options. - Policy struct { - // Repository configures policies for repositories - Repository struct { - // Classes is a list of repository classes which the - // registry allows content for. This class is matched - // against the configuration media type inside uploaded - // manifests. When non-empty, the registry will enforce - // the class in authorized resources. - Classes []string `yaml:"classes"` - } `yaml:"repository,omitempty"` - } `yaml:"policy,omitempty"` -} - -// LogHook is composed of hook Level and Type. -// After hooks configuration, it can execute the next handling automatically, -// when defined levels of log message emitted. -// Example: hook can sending an email notification when error log happens in app. -type LogHook struct { - // Disable lets user select to enable hook or not. - Disabled bool `yaml:"disabled,omitempty"` - - // Type allows user to select which type of hook handler they want. - Type string `yaml:"type,omitempty"` - - // Levels set which levels of log message will let hook executed. - Levels []string `yaml:"levels,omitempty"` - - // MailOptions allows user to configurate email parameters. - MailOptions MailOptions `yaml:"options,omitempty"` -} - -// MailOptions provides the configuration sections to user, for specific handler. -type MailOptions struct { - SMTP struct { - // Addr defines smtp host address - Addr string `yaml:"addr,omitempty"` - - // Username defines user name to smtp host - Username string `yaml:"username,omitempty"` - - // Password defines password of login user - Password string `yaml:"password,omitempty"` - - // Insecure defines if smtp login skips the secure certification. - Insecure bool `yaml:"insecure,omitempty"` - } `yaml:"smtp,omitempty"` - - // From defines mail sending address - From string `yaml:"from,omitempty"` - - // To defines mail receiving address - To []string `yaml:"to,omitempty"` -} - -// FileChecker is a type of entry in the health section for checking files. -type FileChecker struct { - // Interval is the duration in between checks - Interval time.Duration `yaml:"interval,omitempty"` - // File is the path to check - File string `yaml:"file,omitempty"` - // Threshold is the number of times a check must fail to trigger an - // unhealthy state - Threshold int `yaml:"threshold,omitempty"` -} - -// HTTPChecker is a type of entry in the health section for checking HTTP URIs. -type HTTPChecker struct { - // Timeout is the duration to wait before timing out the HTTP request - Timeout time.Duration `yaml:"timeout,omitempty"` - // StatusCode is the expected status code - StatusCode int - // Interval is the duration in between checks - Interval time.Duration `yaml:"interval,omitempty"` - // URI is the HTTP URI to check - URI string `yaml:"uri,omitempty"` - // Headers lists static headers that should be added to all requests - Headers http.Header `yaml:"headers"` - // Threshold is the number of times a check must fail to trigger an - // unhealthy state - Threshold int `yaml:"threshold,omitempty"` -} - -// TCPChecker is a type of entry in the health section for checking TCP servers. -type TCPChecker struct { - // Timeout is the duration to wait before timing out the TCP connection - Timeout time.Duration `yaml:"timeout,omitempty"` - // Interval is the duration in between checks - Interval time.Duration `yaml:"interval,omitempty"` - // Addr is the TCP address to check - Addr string `yaml:"addr,omitempty"` - // Threshold is the number of times a check must fail to trigger an - // unhealthy state - Threshold int `yaml:"threshold,omitempty"` -} - -// Health provides the configuration section for health checks. -type Health struct { - // FileCheckers is a list of paths to check - FileCheckers []FileChecker `yaml:"file,omitempty"` - // HTTPCheckers is a list of URIs to check - HTTPCheckers []HTTPChecker `yaml:"http,omitempty"` - // TCPCheckers is a list of URIs to check - TCPCheckers []TCPChecker `yaml:"tcp,omitempty"` - // StorageDriver configures a health check on the configured storage - // driver - StorageDriver struct { - // Enabled turns on the health check for the storage driver - Enabled bool `yaml:"enabled,omitempty"` - // Interval is the duration in between checks - Interval time.Duration `yaml:"interval,omitempty"` - // Threshold is the number of times a check must fail to trigger an - // unhealthy state - Threshold int `yaml:"threshold,omitempty"` - } `yaml:"storagedriver,omitempty"` -} - -// v0_1Configuration is a Version 0.1 Configuration struct -// This is currently aliased to Configuration, as it is the current version -type v0_1Configuration Configuration - -// UnmarshalYAML implements the yaml.Unmarshaler interface -// Unmarshals a string of the form X.Y into a Version, validating that X and Y can represent uints -func (version *Version) UnmarshalYAML(unmarshal func(interface{}) error) error { - var versionString string - err := unmarshal(&versionString) - if err != nil { - return err - } - - newVersion := Version(versionString) - if _, err := newVersion.major(); err != nil { - return err - } - - if _, err := newVersion.minor(); err != nil { - return err - } - - *version = newVersion - return nil -} - -// CurrentVersion is the most recent Version that can be parsed -var CurrentVersion = MajorMinorVersion(0, 1) - -// Loglevel is the level at which operations are logged -// This can be error, warn, info, or debug -type Loglevel string - -// UnmarshalYAML implements the yaml.Umarshaler interface -// Unmarshals a string into a Loglevel, lowercasing the string and validating that it represents a -// valid loglevel -func (loglevel *Loglevel) UnmarshalYAML(unmarshal func(interface{}) error) error { - var loglevelString string - err := unmarshal(&loglevelString) - if err != nil { - return err - } - - loglevelString = strings.ToLower(loglevelString) - switch loglevelString { - case "error", "warn", "info", "debug": - default: - return fmt.Errorf("Invalid loglevel %s Must be one of [error, warn, info, debug]", loglevelString) - } - - *loglevel = Loglevel(loglevelString) - return nil -} - -// Parameters defines a key-value parameters mapping -type Parameters map[string]interface{} - -// Storage defines the configuration for registry object storage -type Storage map[string]Parameters - -// Type returns the storage driver type, such as filesystem or s3 -func (storage Storage) Type() string { - var storageType []string - - // Return only key in this map - for k := range storage { - switch k { - case "maintenance": - // allow configuration of maintenance - case "cache": - // allow configuration of caching - case "delete": - // allow configuration of delete - case "redirect": - // allow configuration of redirect - default: - storageType = append(storageType, k) - } - } - if len(storageType) > 1 { - panic("multiple storage drivers specified in configuration or environment: " + strings.Join(storageType, ", ")) - } - if len(storageType) == 1 { - return storageType[0] - } - return "" -} - -// Parameters returns the Parameters map for a Storage configuration -func (storage Storage) Parameters() Parameters { - return storage[storage.Type()] -} - -// setParameter changes the parameter at the provided key to the new value -func (storage Storage) setParameter(key string, value interface{}) { - storage[storage.Type()][key] = value -} - -// UnmarshalYAML implements the yaml.Unmarshaler interface -// Unmarshals a single item map into a Storage or a string into a Storage type with no parameters -func (storage *Storage) UnmarshalYAML(unmarshal func(interface{}) error) error { - var storageMap map[string]Parameters - err := unmarshal(&storageMap) - if err == nil { - if len(storageMap) > 1 { - types := make([]string, 0, len(storageMap)) - for k := range storageMap { - switch k { - case "maintenance": - // allow for configuration of maintenance - case "cache": - // allow configuration of caching - case "delete": - // allow configuration of delete - case "redirect": - // allow configuration of redirect - default: - types = append(types, k) - } - } - - if len(types) > 1 { - return fmt.Errorf("Must provide exactly one storage type. Provided: %v", types) - } - } - *storage = storageMap - return nil - } - - var storageType string - err = unmarshal(&storageType) - if err == nil { - *storage = Storage{storageType: Parameters{}} - return nil - } - - return err -} - -// MarshalYAML implements the yaml.Marshaler interface -func (storage Storage) MarshalYAML() (interface{}, error) { - if storage.Parameters() == nil { - return storage.Type(), nil - } - return map[string]Parameters(storage), nil -} - -// Auth defines the configuration for registry authorization. -type Auth map[string]Parameters - -// Type returns the auth type, such as htpasswd or token -func (auth Auth) Type() string { - // Return only key in this map - for k := range auth { - return k - } - return "" -} - -// Parameters returns the Parameters map for an Auth configuration -func (auth Auth) Parameters() Parameters { - return auth[auth.Type()] -} - -// setParameter changes the parameter at the provided key to the new value -func (auth Auth) setParameter(key string, value interface{}) { - auth[auth.Type()][key] = value -} - -// UnmarshalYAML implements the yaml.Unmarshaler interface -// Unmarshals a single item map into a Storage or a string into a Storage type with no parameters -func (auth *Auth) UnmarshalYAML(unmarshal func(interface{}) error) error { - var m map[string]Parameters - err := unmarshal(&m) - if err == nil { - if len(m) > 1 { - types := make([]string, 0, len(m)) - for k := range m { - types = append(types, k) - } - - // TODO(stevvooe): May want to change this slightly for - // authorization to allow multiple challenges. - return fmt.Errorf("must provide exactly one type. Provided: %v", types) - - } - *auth = m - return nil - } - - var authType string - err = unmarshal(&authType) - if err == nil { - *auth = Auth{authType: Parameters{}} - return nil - } - - return err -} - -// MarshalYAML implements the yaml.Marshaler interface -func (auth Auth) MarshalYAML() (interface{}, error) { - if auth.Parameters() == nil { - return auth.Type(), nil - } - return map[string]Parameters(auth), nil -} - -// Notifications configures multiple http endpoints. -type Notifications struct { - // Endpoints is a list of http configurations for endpoints that - // respond to webhook notifications. In the future, we may allow other - // kinds of endpoints, such as external queues. - Endpoints []Endpoint `yaml:"endpoints,omitempty"` -} - -// Endpoint describes the configuration of an http webhook notification -// endpoint. -type Endpoint struct { - Name string `yaml:"name"` // identifies the endpoint in the registry instance. - Disabled bool `yaml:"disabled"` // disables the endpoint - URL string `yaml:"url"` // post url for the endpoint. - Headers http.Header `yaml:"headers"` // static headers that should be added to all requests - Timeout time.Duration `yaml:"timeout"` // HTTP timeout - Threshold int `yaml:"threshold"` // circuit breaker threshold before backing off on failure - Backoff time.Duration `yaml:"backoff"` // backoff duration - IgnoredMediaTypes []string `yaml:"ignoredmediatypes"` // target media types to ignore -} - -// Reporting defines error reporting methods. -type Reporting struct { - // Bugsnag configures error reporting for Bugsnag (bugsnag.com). - Bugsnag BugsnagReporting `yaml:"bugsnag,omitempty"` - // NewRelic configures error reporting for NewRelic (newrelic.com) - NewRelic NewRelicReporting `yaml:"newrelic,omitempty"` -} - -// BugsnagReporting configures error reporting for Bugsnag (bugsnag.com). -type BugsnagReporting struct { - // APIKey is the Bugsnag api key. - APIKey string `yaml:"apikey,omitempty"` - // ReleaseStage tracks where the registry is deployed. - // Examples: production, staging, development - ReleaseStage string `yaml:"releasestage,omitempty"` - // Endpoint is used for specifying an enterprise Bugsnag endpoint. - Endpoint string `yaml:"endpoint,omitempty"` -} - -// NewRelicReporting configures error reporting for NewRelic (newrelic.com) -type NewRelicReporting struct { - // LicenseKey is the NewRelic user license key - LicenseKey string `yaml:"licensekey,omitempty"` - // Name is the component name of the registry in NewRelic - Name string `yaml:"name,omitempty"` - // Verbose configures debug output to STDOUT - Verbose bool `yaml:"verbose,omitempty"` -} - -// Middleware configures named middlewares to be applied at injection points. -type Middleware struct { - // Name the middleware registers itself as - Name string `yaml:"name"` - // Flag to disable middleware easily - Disabled bool `yaml:"disabled,omitempty"` - // Map of parameters that will be passed to the middleware's initialization function - Options Parameters `yaml:"options"` -} - -// Proxy configures the registry as a pull through cache -type Proxy struct { - // RemoteURL is the URL of the remote registry - RemoteURL string `yaml:"remoteurl"` - - // Username of the hub user - Username string `yaml:"username"` - - // Password of the hub user - Password string `yaml:"password"` -} - -// Parse parses an input configuration yaml document into a Configuration struct -// This should generally be capable of handling old configuration format versions -// -// Environment variables may be used to override configuration parameters other than version, -// following the scheme below: -// Configuration.Abc may be replaced by the value of REGISTRY_ABC, -// Configuration.Abc.Xyz may be replaced by the value of REGISTRY_ABC_XYZ, and so forth -func Parse(rd io.Reader) (*Configuration, error) { - in, err := ioutil.ReadAll(rd) - if err != nil { - return nil, err - } - - p := NewParser("registry", []VersionedParseInfo{ - { - Version: MajorMinorVersion(0, 1), - ParseAs: reflect.TypeOf(v0_1Configuration{}), - ConversionFunc: func(c interface{}) (interface{}, error) { - if v0_1, ok := c.(*v0_1Configuration); ok { - if v0_1.Loglevel == Loglevel("") { - v0_1.Loglevel = Loglevel("info") - } - if v0_1.Storage.Type() == "" { - return nil, fmt.Errorf("No storage configuration provided") - } - return (*Configuration)(v0_1), nil - } - return nil, fmt.Errorf("Expected *v0_1Configuration, received %#v", c) - }, - }, - }) - - config := new(Configuration) - err = p.Parse(in, config) - if err != nil { - return nil, err - } - - return config, nil -} diff --git a/vendor/github.com/docker/distribution/configuration/configuration_test.go b/vendor/github.com/docker/distribution/configuration/configuration_test.go deleted file mode 100644 index 3e1583dd1..000000000 --- a/vendor/github.com/docker/distribution/configuration/configuration_test.go +++ /dev/null @@ -1,529 +0,0 @@ -package configuration - -import ( - "bytes" - "net/http" - "os" - "reflect" - "strings" - "testing" - - . "gopkg.in/check.v1" - "gopkg.in/yaml.v2" -) - -// Hook up gocheck into the "go test" runner -func Test(t *testing.T) { TestingT(t) } - -// configStruct is a canonical example configuration, which should map to configYamlV0_1 -var configStruct = Configuration{ - Version: "0.1", - Log: struct { - AccessLog struct { - Disabled bool `yaml:"disabled,omitempty"` - } `yaml:"accesslog,omitempty"` - Level Loglevel `yaml:"level"` - Formatter string `yaml:"formatter,omitempty"` - Fields map[string]interface{} `yaml:"fields,omitempty"` - Hooks []LogHook `yaml:"hooks,omitempty"` - }{ - Fields: map[string]interface{}{"environment": "test"}, - }, - Loglevel: "info", - Storage: Storage{ - "s3": Parameters{ - "region": "us-east-1", - "bucket": "my-bucket", - "rootdirectory": "/registry", - "encrypt": true, - "secure": false, - "accesskey": "SAMPLEACCESSKEY", - "secretkey": "SUPERSECRET", - "host": nil, - "port": 42, - }, - }, - Auth: Auth{ - "silly": Parameters{ - "realm": "silly", - "service": "silly", - }, - }, - Reporting: Reporting{ - Bugsnag: BugsnagReporting{ - APIKey: "BugsnagApiKey", - }, - }, - Notifications: Notifications{ - Endpoints: []Endpoint{ - { - Name: "endpoint-1", - URL: "http://example.com", - Headers: http.Header{ - "Authorization": []string{"Bearer "}, - }, - IgnoredMediaTypes: []string{"application/octet-stream"}, - }, - }, - }, - HTTP: struct { - Addr string `yaml:"addr,omitempty"` - Net string `yaml:"net,omitempty"` - Host string `yaml:"host,omitempty"` - Prefix string `yaml:"prefix,omitempty"` - Secret string `yaml:"secret,omitempty"` - RelativeURLs bool `yaml:"relativeurls,omitempty"` - TLS struct { - Certificate string `yaml:"certificate,omitempty"` - Key string `yaml:"key,omitempty"` - ClientCAs []string `yaml:"clientcas,omitempty"` - LetsEncrypt struct { - CacheFile string `yaml:"cachefile,omitempty"` - Email string `yaml:"email,omitempty"` - } `yaml:"letsencrypt,omitempty"` - } `yaml:"tls,omitempty"` - Headers http.Header `yaml:"headers,omitempty"` - Debug struct { - Addr string `yaml:"addr,omitempty"` - } `yaml:"debug,omitempty"` - HTTP2 struct { - Disabled bool `yaml:"disabled,omitempty"` - } `yaml:"http2,omitempty"` - }{ - TLS: struct { - Certificate string `yaml:"certificate,omitempty"` - Key string `yaml:"key,omitempty"` - ClientCAs []string `yaml:"clientcas,omitempty"` - LetsEncrypt struct { - CacheFile string `yaml:"cachefile,omitempty"` - Email string `yaml:"email,omitempty"` - } `yaml:"letsencrypt,omitempty"` - }{ - ClientCAs: []string{"/path/to/ca.pem"}, - }, - Headers: http.Header{ - "X-Content-Type-Options": []string{"nosniff"}, - }, - HTTP2: struct { - Disabled bool `yaml:"disabled,omitempty"` - }{ - Disabled: false, - }, - }, -} - -// configYamlV0_1 is a Version 0.1 yaml document representing configStruct -var configYamlV0_1 = ` -version: 0.1 -log: - fields: - environment: test -loglevel: info -storage: - s3: - region: us-east-1 - bucket: my-bucket - rootdirectory: /registry - encrypt: true - secure: false - accesskey: SAMPLEACCESSKEY - secretkey: SUPERSECRET - host: ~ - port: 42 -auth: - silly: - realm: silly - service: silly -notifications: - endpoints: - - name: endpoint-1 - url: http://example.com - headers: - Authorization: [Bearer ] - ignoredmediatypes: - - application/octet-stream -reporting: - bugsnag: - apikey: BugsnagApiKey -http: - clientcas: - - /path/to/ca.pem - headers: - X-Content-Type-Options: [nosniff] -` - -// inmemoryConfigYamlV0_1 is a Version 0.1 yaml document specifying an inmemory -// storage driver with no parameters -var inmemoryConfigYamlV0_1 = ` -version: 0.1 -loglevel: info -storage: inmemory -auth: - silly: - realm: silly - service: silly -notifications: - endpoints: - - name: endpoint-1 - url: http://example.com - headers: - Authorization: [Bearer ] - ignoredmediatypes: - - application/octet-stream -http: - headers: - X-Content-Type-Options: [nosniff] -` - -type ConfigSuite struct { - expectedConfig *Configuration -} - -var _ = Suite(new(ConfigSuite)) - -func (suite *ConfigSuite) SetUpTest(c *C) { - os.Clearenv() - suite.expectedConfig = copyConfig(configStruct) -} - -// TestMarshalRoundtrip validates that configStruct can be marshaled and -// unmarshaled without changing any parameters -func (suite *ConfigSuite) TestMarshalRoundtrip(c *C) { - configBytes, err := yaml.Marshal(suite.expectedConfig) - c.Assert(err, IsNil) - config, err := Parse(bytes.NewReader(configBytes)) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseSimple validates that configYamlV0_1 can be parsed into a struct -// matching configStruct -func (suite *ConfigSuite) TestParseSimple(c *C) { - config, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseInmemory validates that configuration yaml with storage provided as -// a string can be parsed into a Configuration struct with no storage parameters -func (suite *ConfigSuite) TestParseInmemory(c *C) { - suite.expectedConfig.Storage = Storage{"inmemory": Parameters{}} - suite.expectedConfig.Reporting = Reporting{} - suite.expectedConfig.Log.Fields = nil - - config, err := Parse(bytes.NewReader([]byte(inmemoryConfigYamlV0_1))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseIncomplete validates that an incomplete yaml configuration cannot -// be parsed without providing environment variables to fill in the missing -// components. -func (suite *ConfigSuite) TestParseIncomplete(c *C) { - incompleteConfigYaml := "version: 0.1" - _, err := Parse(bytes.NewReader([]byte(incompleteConfigYaml))) - c.Assert(err, NotNil) - - suite.expectedConfig.Log.Fields = nil - suite.expectedConfig.Storage = Storage{"filesystem": Parameters{"rootdirectory": "/tmp/testroot"}} - suite.expectedConfig.Auth = Auth{"silly": Parameters{"realm": "silly"}} - suite.expectedConfig.Reporting = Reporting{} - suite.expectedConfig.Notifications = Notifications{} - suite.expectedConfig.HTTP.Headers = nil - - // Note: this also tests that REGISTRY_STORAGE and - // REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY can be used together - os.Setenv("REGISTRY_STORAGE", "filesystem") - os.Setenv("REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY", "/tmp/testroot") - os.Setenv("REGISTRY_AUTH", "silly") - os.Setenv("REGISTRY_AUTH_SILLY_REALM", "silly") - - config, err := Parse(bytes.NewReader([]byte(incompleteConfigYaml))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseWithSameEnvStorage validates that providing environment variables -// that match the given storage type will only include environment-defined -// parameters and remove yaml-defined parameters -func (suite *ConfigSuite) TestParseWithSameEnvStorage(c *C) { - suite.expectedConfig.Storage = Storage{"s3": Parameters{"region": "us-east-1"}} - - os.Setenv("REGISTRY_STORAGE", "s3") - os.Setenv("REGISTRY_STORAGE_S3_REGION", "us-east-1") - - config, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseWithDifferentEnvStorageParams validates that providing environment variables that change -// and add to the given storage parameters will change and add parameters to the parsed -// Configuration struct -func (suite *ConfigSuite) TestParseWithDifferentEnvStorageParams(c *C) { - suite.expectedConfig.Storage.setParameter("region", "us-west-1") - suite.expectedConfig.Storage.setParameter("secure", true) - suite.expectedConfig.Storage.setParameter("newparam", "some Value") - - os.Setenv("REGISTRY_STORAGE_S3_REGION", "us-west-1") - os.Setenv("REGISTRY_STORAGE_S3_SECURE", "true") - os.Setenv("REGISTRY_STORAGE_S3_NEWPARAM", "some Value") - - config, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseWithDifferentEnvStorageType validates that providing an environment variable that -// changes the storage type will be reflected in the parsed Configuration struct -func (suite *ConfigSuite) TestParseWithDifferentEnvStorageType(c *C) { - suite.expectedConfig.Storage = Storage{"inmemory": Parameters{}} - - os.Setenv("REGISTRY_STORAGE", "inmemory") - - config, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseWithDifferentEnvStorageTypeAndParams validates that providing an environment variable -// that changes the storage type will be reflected in the parsed Configuration struct and that -// environment storage parameters will also be included -func (suite *ConfigSuite) TestParseWithDifferentEnvStorageTypeAndParams(c *C) { - suite.expectedConfig.Storage = Storage{"filesystem": Parameters{}} - suite.expectedConfig.Storage.setParameter("rootdirectory", "/tmp/testroot") - - os.Setenv("REGISTRY_STORAGE", "filesystem") - os.Setenv("REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY", "/tmp/testroot") - - config, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseWithSameEnvLoglevel validates that providing an environment variable defining the log -// level to the same as the one provided in the yaml will not change the parsed Configuration struct -func (suite *ConfigSuite) TestParseWithSameEnvLoglevel(c *C) { - os.Setenv("REGISTRY_LOGLEVEL", "info") - - config, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseWithDifferentEnvLoglevel validates that providing an environment variable defining the -// log level will override the value provided in the yaml document -func (suite *ConfigSuite) TestParseWithDifferentEnvLoglevel(c *C) { - suite.expectedConfig.Loglevel = "error" - - os.Setenv("REGISTRY_LOGLEVEL", "error") - - config, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseInvalidLoglevel validates that the parser will fail to parse a -// configuration if the loglevel is malformed -func (suite *ConfigSuite) TestParseInvalidLoglevel(c *C) { - invalidConfigYaml := "version: 0.1\nloglevel: derp\nstorage: inmemory" - _, err := Parse(bytes.NewReader([]byte(invalidConfigYaml))) - c.Assert(err, NotNil) - - os.Setenv("REGISTRY_LOGLEVEL", "derp") - - _, err = Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, NotNil) - -} - -// TestParseWithDifferentEnvReporting validates that environment variables -// properly override reporting parameters -func (suite *ConfigSuite) TestParseWithDifferentEnvReporting(c *C) { - suite.expectedConfig.Reporting.Bugsnag.APIKey = "anotherBugsnagApiKey" - suite.expectedConfig.Reporting.Bugsnag.Endpoint = "localhost:8080" - suite.expectedConfig.Reporting.NewRelic.LicenseKey = "NewRelicLicenseKey" - suite.expectedConfig.Reporting.NewRelic.Name = "some NewRelic NAME" - - os.Setenv("REGISTRY_REPORTING_BUGSNAG_APIKEY", "anotherBugsnagApiKey") - os.Setenv("REGISTRY_REPORTING_BUGSNAG_ENDPOINT", "localhost:8080") - os.Setenv("REGISTRY_REPORTING_NEWRELIC_LICENSEKEY", "NewRelicLicenseKey") - os.Setenv("REGISTRY_REPORTING_NEWRELIC_NAME", "some NewRelic NAME") - - config, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseInvalidVersion validates that the parser will fail to parse a newer configuration -// version than the CurrentVersion -func (suite *ConfigSuite) TestParseInvalidVersion(c *C) { - suite.expectedConfig.Version = MajorMinorVersion(CurrentVersion.Major(), CurrentVersion.Minor()+1) - configBytes, err := yaml.Marshal(suite.expectedConfig) - c.Assert(err, IsNil) - _, err = Parse(bytes.NewReader(configBytes)) - c.Assert(err, NotNil) -} - -// TestParseExtraneousVars validates that environment variables referring to -// nonexistent variables don't cause side effects. -func (suite *ConfigSuite) TestParseExtraneousVars(c *C) { - suite.expectedConfig.Reporting.Bugsnag.Endpoint = "localhost:8080" - - // A valid environment variable - os.Setenv("REGISTRY_REPORTING_BUGSNAG_ENDPOINT", "localhost:8080") - - // Environment variables which shouldn't set config items - os.Setenv("registry_REPORTING_NEWRELIC_LICENSEKEY", "NewRelicLicenseKey") - os.Setenv("REPORTING_NEWRELIC_NAME", "some NewRelic NAME") - os.Setenv("REGISTRY_DUCKS", "quack") - os.Setenv("REGISTRY_REPORTING_ASDF", "ghjk") - - config, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseEnvVarImplicitMaps validates that environment variables can set -// values in maps that don't already exist. -func (suite *ConfigSuite) TestParseEnvVarImplicitMaps(c *C) { - readonly := make(map[string]interface{}) - readonly["enabled"] = true - - maintenance := make(map[string]interface{}) - maintenance["readonly"] = readonly - - suite.expectedConfig.Storage["maintenance"] = maintenance - - os.Setenv("REGISTRY_STORAGE_MAINTENANCE_READONLY_ENABLED", "true") - - config, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, IsNil) - c.Assert(config, DeepEquals, suite.expectedConfig) -} - -// TestParseEnvWrongTypeMap validates that incorrectly attempting to unmarshal a -// string over existing map fails. -func (suite *ConfigSuite) TestParseEnvWrongTypeMap(c *C) { - os.Setenv("REGISTRY_STORAGE_S3", "somestring") - - _, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, NotNil) -} - -// TestParseEnvWrongTypeStruct validates that incorrectly attempting to -// unmarshal a string into a struct fails. -func (suite *ConfigSuite) TestParseEnvWrongTypeStruct(c *C) { - os.Setenv("REGISTRY_STORAGE_LOG", "somestring") - - _, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, NotNil) -} - -// TestParseEnvWrongTypeSlice validates that incorrectly attempting to -// unmarshal a string into a slice fails. -func (suite *ConfigSuite) TestParseEnvWrongTypeSlice(c *C) { - os.Setenv("REGISTRY_LOG_HOOKS", "somestring") - - _, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, NotNil) -} - -// TestParseEnvMany tests several environment variable overrides. -// The result is not checked - the goal of this test is to detect panics -// from misuse of reflection. -func (suite *ConfigSuite) TestParseEnvMany(c *C) { - os.Setenv("REGISTRY_VERSION", "0.1") - os.Setenv("REGISTRY_LOG_LEVEL", "debug") - os.Setenv("REGISTRY_LOG_FORMATTER", "json") - os.Setenv("REGISTRY_LOG_HOOKS", "json") - os.Setenv("REGISTRY_LOG_FIELDS", "abc: xyz") - os.Setenv("REGISTRY_LOG_HOOKS", "- type: asdf") - os.Setenv("REGISTRY_LOGLEVEL", "debug") - os.Setenv("REGISTRY_STORAGE", "s3") - os.Setenv("REGISTRY_AUTH_PARAMS", "param1: value1") - os.Setenv("REGISTRY_AUTH_PARAMS_VALUE2", "value2") - os.Setenv("REGISTRY_AUTH_PARAMS_VALUE2", "value2") - - _, err := Parse(bytes.NewReader([]byte(configYamlV0_1))) - c.Assert(err, IsNil) -} - -func checkStructs(c *C, t reflect.Type, structsChecked map[string]struct{}) { - for t.Kind() == reflect.Ptr || t.Kind() == reflect.Map || t.Kind() == reflect.Slice { - t = t.Elem() - } - - if t.Kind() != reflect.Struct { - return - } - if _, present := structsChecked[t.String()]; present { - // Already checked this type - return - } - - structsChecked[t.String()] = struct{}{} - - byUpperCase := make(map[string]int) - for i := 0; i < t.NumField(); i++ { - sf := t.Field(i) - - // Check that the yaml tag does not contain an _. - yamlTag := sf.Tag.Get("yaml") - if strings.Contains(yamlTag, "_") { - c.Fatalf("yaml field name includes _ character: %s", yamlTag) - } - upper := strings.ToUpper(sf.Name) - if _, present := byUpperCase[upper]; present { - c.Fatalf("field name collision in configuration object: %s", sf.Name) - } - byUpperCase[upper] = i - - checkStructs(c, sf.Type, structsChecked) - } -} - -// TestValidateConfigStruct makes sure that the config struct has no members -// with yaml tags that would be ambiguous to the environment variable parser. -func (suite *ConfigSuite) TestValidateConfigStruct(c *C) { - structsChecked := make(map[string]struct{}) - checkStructs(c, reflect.TypeOf(Configuration{}), structsChecked) -} - -func copyConfig(config Configuration) *Configuration { - configCopy := new(Configuration) - - configCopy.Version = MajorMinorVersion(config.Version.Major(), config.Version.Minor()) - configCopy.Loglevel = config.Loglevel - configCopy.Log = config.Log - configCopy.Log.Fields = make(map[string]interface{}, len(config.Log.Fields)) - for k, v := range config.Log.Fields { - configCopy.Log.Fields[k] = v - } - - configCopy.Storage = Storage{config.Storage.Type(): Parameters{}} - for k, v := range config.Storage.Parameters() { - configCopy.Storage.setParameter(k, v) - } - configCopy.Reporting = Reporting{ - Bugsnag: BugsnagReporting{config.Reporting.Bugsnag.APIKey, config.Reporting.Bugsnag.ReleaseStage, config.Reporting.Bugsnag.Endpoint}, - NewRelic: NewRelicReporting{config.Reporting.NewRelic.LicenseKey, config.Reporting.NewRelic.Name, config.Reporting.NewRelic.Verbose}, - } - - configCopy.Auth = Auth{config.Auth.Type(): Parameters{}} - for k, v := range config.Auth.Parameters() { - configCopy.Auth.setParameter(k, v) - } - - configCopy.Notifications = Notifications{Endpoints: []Endpoint{}} - for _, v := range config.Notifications.Endpoints { - configCopy.Notifications.Endpoints = append(configCopy.Notifications.Endpoints, v) - } - - configCopy.HTTP.Headers = make(http.Header) - for k, v := range config.HTTP.Headers { - configCopy.HTTP.Headers[k] = v - } - - return configCopy -} diff --git a/vendor/github.com/docker/distribution/configuration/parser.go b/vendor/github.com/docker/distribution/configuration/parser.go deleted file mode 100644 index 8b81dd5d5..000000000 --- a/vendor/github.com/docker/distribution/configuration/parser.go +++ /dev/null @@ -1,283 +0,0 @@ -package configuration - -import ( - "fmt" - "os" - "reflect" - "sort" - "strconv" - "strings" - - "github.com/Sirupsen/logrus" - "gopkg.in/yaml.v2" -) - -// Version is a major/minor version pair of the form Major.Minor -// Major version upgrades indicate structure or type changes -// Minor version upgrades should be strictly additive -type Version string - -// MajorMinorVersion constructs a Version from its Major and Minor components -func MajorMinorVersion(major, minor uint) Version { - return Version(fmt.Sprintf("%d.%d", major, minor)) -} - -func (version Version) major() (uint, error) { - majorPart := strings.Split(string(version), ".")[0] - major, err := strconv.ParseUint(majorPart, 10, 0) - return uint(major), err -} - -// Major returns the major version portion of a Version -func (version Version) Major() uint { - major, _ := version.major() - return major -} - -func (version Version) minor() (uint, error) { - minorPart := strings.Split(string(version), ".")[1] - minor, err := strconv.ParseUint(minorPart, 10, 0) - return uint(minor), err -} - -// Minor returns the minor version portion of a Version -func (version Version) Minor() uint { - minor, _ := version.minor() - return minor -} - -// VersionedParseInfo defines how a specific version of a configuration should -// be parsed into the current version -type VersionedParseInfo struct { - // Version is the version which this parsing information relates to - Version Version - // ParseAs defines the type which a configuration file of this version - // should be parsed into - ParseAs reflect.Type - // ConversionFunc defines a method for converting the parsed configuration - // (of type ParseAs) into the current configuration version - // Note: this method signature is very unclear with the absence of generics - ConversionFunc func(interface{}) (interface{}, error) -} - -type envVar struct { - name string - value string -} - -type envVars []envVar - -func (a envVars) Len() int { return len(a) } -func (a envVars) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a envVars) Less(i, j int) bool { return a[i].name < a[j].name } - -// Parser can be used to parse a configuration file and environment of a defined -// version into a unified output structure -type Parser struct { - prefix string - mapping map[Version]VersionedParseInfo - env envVars -} - -// NewParser returns a *Parser with the given environment prefix which handles -// versioned configurations which match the given parseInfos -func NewParser(prefix string, parseInfos []VersionedParseInfo) *Parser { - p := Parser{prefix: prefix, mapping: make(map[Version]VersionedParseInfo)} - - for _, parseInfo := range parseInfos { - p.mapping[parseInfo.Version] = parseInfo - } - - for _, env := range os.Environ() { - envParts := strings.SplitN(env, "=", 2) - p.env = append(p.env, envVar{envParts[0], envParts[1]}) - } - - // We must sort the environment variables lexically by name so that - // more specific variables are applied before less specific ones - // (i.e. REGISTRY_STORAGE before - // REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY). This sucks, but it's a - // lot simpler and easier to get right than unmarshalling map entries - // into temporaries and merging with the existing entry. - sort.Sort(p.env) - - return &p -} - -// Parse reads in the given []byte and environment and writes the resulting -// configuration into the input v -// -// Environment variables may be used to override configuration parameters other -// than version, following the scheme below: -// v.Abc may be replaced by the value of PREFIX_ABC, -// v.Abc.Xyz may be replaced by the value of PREFIX_ABC_XYZ, and so forth -func (p *Parser) Parse(in []byte, v interface{}) error { - var versionedStruct struct { - Version Version - } - - if err := yaml.Unmarshal(in, &versionedStruct); err != nil { - return err - } - - parseInfo, ok := p.mapping[versionedStruct.Version] - if !ok { - return fmt.Errorf("Unsupported version: %q", versionedStruct.Version) - } - - parseAs := reflect.New(parseInfo.ParseAs) - err := yaml.Unmarshal(in, parseAs.Interface()) - if err != nil { - return err - } - - for _, envVar := range p.env { - pathStr := envVar.name - if strings.HasPrefix(pathStr, strings.ToUpper(p.prefix)+"_") { - path := strings.Split(pathStr, "_") - - err = p.overwriteFields(parseAs, pathStr, path[1:], envVar.value) - if err != nil { - return err - } - } - } - - c, err := parseInfo.ConversionFunc(parseAs.Interface()) - if err != nil { - return err - } - reflect.ValueOf(v).Elem().Set(reflect.Indirect(reflect.ValueOf(c))) - return nil -} - -// overwriteFields replaces configuration values with alternate values specified -// through the environment. Precondition: an empty path slice must never be -// passed in. -func (p *Parser) overwriteFields(v reflect.Value, fullpath string, path []string, payload string) error { - for v.Kind() == reflect.Ptr { - if v.IsNil() { - panic("encountered nil pointer while handling environment variable " + fullpath) - } - v = reflect.Indirect(v) - } - switch v.Kind() { - case reflect.Struct: - return p.overwriteStruct(v, fullpath, path, payload) - case reflect.Map: - return p.overwriteMap(v, fullpath, path, payload) - case reflect.Interface: - if v.NumMethod() == 0 { - if !v.IsNil() { - return p.overwriteFields(v.Elem(), fullpath, path, payload) - } - // Interface was empty; create an implicit map - var template map[string]interface{} - wrappedV := reflect.MakeMap(reflect.TypeOf(template)) - v.Set(wrappedV) - return p.overwriteMap(wrappedV, fullpath, path, payload) - } - } - return nil -} - -func (p *Parser) overwriteStruct(v reflect.Value, fullpath string, path []string, payload string) error { - // Generate case-insensitive map of struct fields - byUpperCase := make(map[string]int) - for i := 0; i < v.NumField(); i++ { - sf := v.Type().Field(i) - upper := strings.ToUpper(sf.Name) - if _, present := byUpperCase[upper]; present { - panic(fmt.Sprintf("field name collision in configuration object: %s", sf.Name)) - } - byUpperCase[upper] = i - } - - fieldIndex, present := byUpperCase[path[0]] - if !present { - logrus.Warnf("Ignoring unrecognized environment variable %s", fullpath) - return nil - } - field := v.Field(fieldIndex) - sf := v.Type().Field(fieldIndex) - - if len(path) == 1 { - // Env var specifies this field directly - fieldVal := reflect.New(sf.Type) - err := yaml.Unmarshal([]byte(payload), fieldVal.Interface()) - if err != nil { - return err - } - field.Set(reflect.Indirect(fieldVal)) - return nil - } - - // If the field is nil, must create an object - switch sf.Type.Kind() { - case reflect.Map: - if field.IsNil() { - field.Set(reflect.MakeMap(sf.Type)) - } - case reflect.Ptr: - if field.IsNil() { - field.Set(reflect.New(sf.Type)) - } - } - - err := p.overwriteFields(field, fullpath, path[1:], payload) - if err != nil { - return err - } - - return nil -} - -func (p *Parser) overwriteMap(m reflect.Value, fullpath string, path []string, payload string) error { - if m.Type().Key().Kind() != reflect.String { - // non-string keys unsupported - logrus.Warnf("Ignoring environment variable %s involving map with non-string keys", fullpath) - return nil - } - - if len(path) > 1 { - // If a matching key exists, get its value and continue the - // overwriting process. - for _, k := range m.MapKeys() { - if strings.ToUpper(k.String()) == path[0] { - mapValue := m.MapIndex(k) - // If the existing value is nil, we want to - // recreate it instead of using this value. - if (mapValue.Kind() == reflect.Ptr || - mapValue.Kind() == reflect.Interface || - mapValue.Kind() == reflect.Map) && - mapValue.IsNil() { - break - } - return p.overwriteFields(mapValue, fullpath, path[1:], payload) - } - } - } - - // (Re)create this key - var mapValue reflect.Value - if m.Type().Elem().Kind() == reflect.Map { - mapValue = reflect.MakeMap(m.Type().Elem()) - } else { - mapValue = reflect.New(m.Type().Elem()) - } - if len(path) > 1 { - err := p.overwriteFields(mapValue, fullpath, path[1:], payload) - if err != nil { - return err - } - } else { - err := yaml.Unmarshal([]byte(payload), mapValue.Interface()) - if err != nil { - return err - } - } - - m.SetMapIndex(reflect.ValueOf(strings.ToLower(path[0])), reflect.Indirect(mapValue)) - - return nil -} diff --git a/vendor/github.com/docker/distribution/context/context.go b/vendor/github.com/docker/distribution/context/context.go deleted file mode 100644 index 23cbf5b54..000000000 --- a/vendor/github.com/docker/distribution/context/context.go +++ /dev/null @@ -1,85 +0,0 @@ -package context - -import ( - "sync" - - "github.com/docker/distribution/uuid" - "golang.org/x/net/context" -) - -// Context is a copy of Context from the golang.org/x/net/context package. -type Context interface { - context.Context -} - -// instanceContext is a context that provides only an instance id. It is -// provided as the main background context. -type instanceContext struct { - Context - id string // id of context, logged as "instance.id" - once sync.Once // once protect generation of the id -} - -func (ic *instanceContext) Value(key interface{}) interface{} { - if key == "instance.id" { - ic.once.Do(func() { - // We want to lazy initialize the UUID such that we don't - // call a random generator from the package initialization - // code. For various reasons random could not be available - // https://github.com/docker/distribution/issues/782 - ic.id = uuid.Generate().String() - }) - return ic.id - } - - return ic.Context.Value(key) -} - -var background = &instanceContext{ - Context: context.Background(), -} - -// Background returns a non-nil, empty Context. The background context -// provides a single key, "instance.id" that is globally unique to the -// process. -func Background() Context { - return background -} - -// WithValue returns a copy of parent in which the value associated with key is -// val. Use context Values only for request-scoped data that transits processes -// and APIs, not for passing optional parameters to functions. -func WithValue(parent Context, key, val interface{}) Context { - return context.WithValue(parent, key, val) -} - -// stringMapContext is a simple context implementation that checks a map for a -// key, falling back to a parent if not present. -type stringMapContext struct { - context.Context - m map[string]interface{} -} - -// WithValues returns a context that proxies lookups through a map. Only -// supports string keys. -func WithValues(ctx context.Context, m map[string]interface{}) context.Context { - mo := make(map[string]interface{}, len(m)) // make our own copy. - for k, v := range m { - mo[k] = v - } - - return stringMapContext{ - Context: ctx, - m: mo, - } -} - -func (smc stringMapContext) Value(key interface{}) interface{} { - if ks, ok := key.(string); ok { - if v, ok := smc.m[ks]; ok { - return v - } - } - - return smc.Context.Value(key) -} diff --git a/vendor/github.com/docker/distribution/context/doc.go b/vendor/github.com/docker/distribution/context/doc.go deleted file mode 100644 index 3b4ab8882..000000000 --- a/vendor/github.com/docker/distribution/context/doc.go +++ /dev/null @@ -1,89 +0,0 @@ -// Package context provides several utilities for working with -// golang.org/x/net/context in http requests. Primarily, the focus is on -// logging relevant request information but this package is not limited to -// that purpose. -// -// The easiest way to get started is to get the background context: -// -// ctx := context.Background() -// -// The returned context should be passed around your application and be the -// root of all other context instances. If the application has a version, this -// line should be called before anything else: -// -// ctx := context.WithVersion(context.Background(), version) -// -// The above will store the version in the context and will be available to -// the logger. -// -// Logging -// -// The most useful aspect of this package is GetLogger. This function takes -// any context.Context interface and returns the current logger from the -// context. Canonical usage looks like this: -// -// GetLogger(ctx).Infof("something interesting happened") -// -// GetLogger also takes optional key arguments. The keys will be looked up in -// the context and reported with the logger. The following example would -// return a logger that prints the version with each log message: -// -// ctx := context.Context(context.Background(), "version", version) -// GetLogger(ctx, "version").Infof("this log message has a version field") -// -// The above would print out a log message like this: -// -// INFO[0000] this log message has a version field version=v2.0.0-alpha.2.m -// -// When used with WithLogger, we gain the ability to decorate the context with -// loggers that have information from disparate parts of the call stack. -// Following from the version example, we can build a new context with the -// configured logger such that we always print the version field: -// -// ctx = WithLogger(ctx, GetLogger(ctx, "version")) -// -// Since the logger has been pushed to the context, we can now get the version -// field for free with our log messages. Future calls to GetLogger on the new -// context will have the version field: -// -// GetLogger(ctx).Infof("this log message has a version field") -// -// This becomes more powerful when we start stacking loggers. Let's say we -// have the version logger from above but also want a request id. Using the -// context above, in our request scoped function, we place another logger in -// the context: -// -// ctx = context.WithValue(ctx, "http.request.id", "unique id") // called when building request context -// ctx = WithLogger(ctx, GetLogger(ctx, "http.request.id")) -// -// When GetLogger is called on the new context, "http.request.id" will be -// included as a logger field, along with the original "version" field: -// -// INFO[0000] this log message has a version field http.request.id=unique id version=v2.0.0-alpha.2.m -// -// Note that this only affects the new context, the previous context, with the -// version field, can be used independently. Put another way, the new logger, -// added to the request context, is unique to that context and can have -// request scoped varaibles. -// -// HTTP Requests -// -// This package also contains several methods for working with http requests. -// The concepts are very similar to those described above. We simply place the -// request in the context using WithRequest. This makes the request variables -// available. GetRequestLogger can then be called to get request specific -// variables in a log line: -// -// ctx = WithRequest(ctx, req) -// GetRequestLogger(ctx).Infof("request variables") -// -// Like above, if we want to include the request data in all log messages in -// the context, we push the logger to a new context and use that one: -// -// ctx = WithLogger(ctx, GetRequestLogger(ctx)) -// -// The concept is fairly powerful and ensures that calls throughout the stack -// can be traced in log messages. Using the fields like "http.request.id", one -// can analyze call flow for a particular request with a simple grep of the -// logs. -package context diff --git a/vendor/github.com/docker/distribution/context/http.go b/vendor/github.com/docker/distribution/context/http.go deleted file mode 100644 index 7fe9b8ab0..000000000 --- a/vendor/github.com/docker/distribution/context/http.go +++ /dev/null @@ -1,366 +0,0 @@ -package context - -import ( - "errors" - "net" - "net/http" - "strings" - "sync" - "time" - - log "github.com/Sirupsen/logrus" - "github.com/docker/distribution/uuid" - "github.com/gorilla/mux" -) - -// Common errors used with this package. -var ( - ErrNoRequestContext = errors.New("no http request in context") - ErrNoResponseWriterContext = errors.New("no http response in context") -) - -func parseIP(ipStr string) net.IP { - ip := net.ParseIP(ipStr) - if ip == nil { - log.Warnf("invalid remote IP address: %q", ipStr) - } - return ip -} - -// RemoteAddr extracts the remote address of the request, taking into -// account proxy headers. -func RemoteAddr(r *http.Request) string { - if prior := r.Header.Get("X-Forwarded-For"); prior != "" { - proxies := strings.Split(prior, ",") - if len(proxies) > 0 { - remoteAddr := strings.Trim(proxies[0], " ") - if parseIP(remoteAddr) != nil { - return remoteAddr - } - } - } - // X-Real-Ip is less supported, but worth checking in the - // absence of X-Forwarded-For - if realIP := r.Header.Get("X-Real-Ip"); realIP != "" { - if parseIP(realIP) != nil { - return realIP - } - } - - return r.RemoteAddr -} - -// RemoteIP extracts the remote IP of the request, taking into -// account proxy headers. -func RemoteIP(r *http.Request) string { - addr := RemoteAddr(r) - - // Try parsing it as "IP:port" - if ip, _, err := net.SplitHostPort(addr); err == nil { - return ip - } - - return addr -} - -// WithRequest places the request on the context. The context of the request -// is assigned a unique id, available at "http.request.id". The request itself -// is available at "http.request". Other common attributes are available under -// the prefix "http.request.". If a request is already present on the context, -// this method will panic. -func WithRequest(ctx Context, r *http.Request) Context { - if ctx.Value("http.request") != nil { - // NOTE(stevvooe): This needs to be considered a programming error. It - // is unlikely that we'd want to have more than one request in - // context. - panic("only one request per context") - } - - return &httpRequestContext{ - Context: ctx, - startedAt: time.Now(), - id: uuid.Generate().String(), - r: r, - } -} - -// GetRequest returns the http request in the given context. Returns -// ErrNoRequestContext if the context does not have an http request associated -// with it. -func GetRequest(ctx Context) (*http.Request, error) { - if r, ok := ctx.Value("http.request").(*http.Request); r != nil && ok { - return r, nil - } - return nil, ErrNoRequestContext -} - -// GetRequestID attempts to resolve the current request id, if possible. An -// error is return if it is not available on the context. -func GetRequestID(ctx Context) string { - return GetStringValue(ctx, "http.request.id") -} - -// WithResponseWriter returns a new context and response writer that makes -// interesting response statistics available within the context. -func WithResponseWriter(ctx Context, w http.ResponseWriter) (Context, http.ResponseWriter) { - if closeNotifier, ok := w.(http.CloseNotifier); ok { - irwCN := &instrumentedResponseWriterCN{ - instrumentedResponseWriter: instrumentedResponseWriter{ - ResponseWriter: w, - Context: ctx, - }, - CloseNotifier: closeNotifier, - } - - return irwCN, irwCN - } - - irw := instrumentedResponseWriter{ - ResponseWriter: w, - Context: ctx, - } - return &irw, &irw -} - -// GetResponseWriter returns the http.ResponseWriter from the provided -// context. If not present, ErrNoResponseWriterContext is returned. The -// returned instance provides instrumentation in the context. -func GetResponseWriter(ctx Context) (http.ResponseWriter, error) { - v := ctx.Value("http.response") - - rw, ok := v.(http.ResponseWriter) - if !ok || rw == nil { - return nil, ErrNoResponseWriterContext - } - - return rw, nil -} - -// getVarsFromRequest let's us change request vars implementation for testing -// and maybe future changes. -var getVarsFromRequest = mux.Vars - -// WithVars extracts gorilla/mux vars and makes them available on the returned -// context. Variables are available at keys with the prefix "vars.". For -// example, if looking for the variable "name", it can be accessed as -// "vars.name". Implementations that are accessing values need not know that -// the underlying context is implemented with gorilla/mux vars. -func WithVars(ctx Context, r *http.Request) Context { - return &muxVarsContext{ - Context: ctx, - vars: getVarsFromRequest(r), - } -} - -// GetRequestLogger returns a logger that contains fields from the request in -// the current context. If the request is not available in the context, no -// fields will display. Request loggers can safely be pushed onto the context. -func GetRequestLogger(ctx Context) Logger { - return GetLogger(ctx, - "http.request.id", - "http.request.method", - "http.request.host", - "http.request.uri", - "http.request.referer", - "http.request.useragent", - "http.request.remoteaddr", - "http.request.contenttype") -} - -// GetResponseLogger reads the current response stats and builds a logger. -// Because the values are read at call time, pushing a logger returned from -// this function on the context will lead to missing or invalid data. Only -// call this at the end of a request, after the response has been written. -func GetResponseLogger(ctx Context) Logger { - l := getLogrusLogger(ctx, - "http.response.written", - "http.response.status", - "http.response.contenttype") - - duration := Since(ctx, "http.request.startedat") - - if duration > 0 { - l = l.WithField("http.response.duration", duration.String()) - } - - return l -} - -// httpRequestContext makes information about a request available to context. -type httpRequestContext struct { - Context - - startedAt time.Time - id string - r *http.Request -} - -// Value returns a keyed element of the request for use in the context. To get -// the request itself, query "request". For other components, access them as -// "request.". For example, r.RequestURI -func (ctx *httpRequestContext) Value(key interface{}) interface{} { - if keyStr, ok := key.(string); ok { - if keyStr == "http.request" { - return ctx.r - } - - if !strings.HasPrefix(keyStr, "http.request.") { - goto fallback - } - - parts := strings.Split(keyStr, ".") - - if len(parts) != 3 { - goto fallback - } - - switch parts[2] { - case "uri": - return ctx.r.RequestURI - case "remoteaddr": - return RemoteAddr(ctx.r) - case "method": - return ctx.r.Method - case "host": - return ctx.r.Host - case "referer": - referer := ctx.r.Referer() - if referer != "" { - return referer - } - case "useragent": - return ctx.r.UserAgent() - case "id": - return ctx.id - case "startedat": - return ctx.startedAt - case "contenttype": - ct := ctx.r.Header.Get("Content-Type") - if ct != "" { - return ct - } - } - } - -fallback: - return ctx.Context.Value(key) -} - -type muxVarsContext struct { - Context - vars map[string]string -} - -func (ctx *muxVarsContext) Value(key interface{}) interface{} { - if keyStr, ok := key.(string); ok { - if keyStr == "vars" { - return ctx.vars - } - - if strings.HasPrefix(keyStr, "vars.") { - keyStr = strings.TrimPrefix(keyStr, "vars.") - } - - if v, ok := ctx.vars[keyStr]; ok { - return v - } - } - - return ctx.Context.Value(key) -} - -// instrumentedResponseWriterCN provides response writer information in a -// context. It implements http.CloseNotifier so that users can detect -// early disconnects. -type instrumentedResponseWriterCN struct { - instrumentedResponseWriter - http.CloseNotifier -} - -// instrumentedResponseWriter provides response writer information in a -// context. This variant is only used in the case where CloseNotifier is not -// implemented by the parent ResponseWriter. -type instrumentedResponseWriter struct { - http.ResponseWriter - Context - - mu sync.Mutex - status int - written int64 -} - -func (irw *instrumentedResponseWriter) Write(p []byte) (n int, err error) { - n, err = irw.ResponseWriter.Write(p) - - irw.mu.Lock() - irw.written += int64(n) - - // Guess the likely status if not set. - if irw.status == 0 { - irw.status = http.StatusOK - } - - irw.mu.Unlock() - - return -} - -func (irw *instrumentedResponseWriter) WriteHeader(status int) { - irw.ResponseWriter.WriteHeader(status) - - irw.mu.Lock() - irw.status = status - irw.mu.Unlock() -} - -func (irw *instrumentedResponseWriter) Flush() { - if flusher, ok := irw.ResponseWriter.(http.Flusher); ok { - flusher.Flush() - } -} - -func (irw *instrumentedResponseWriter) Value(key interface{}) interface{} { - if keyStr, ok := key.(string); ok { - if keyStr == "http.response" { - return irw - } - - if !strings.HasPrefix(keyStr, "http.response.") { - goto fallback - } - - parts := strings.Split(keyStr, ".") - - if len(parts) != 3 { - goto fallback - } - - irw.mu.Lock() - defer irw.mu.Unlock() - - switch parts[2] { - case "written": - return irw.written - case "status": - return irw.status - case "contenttype": - contentType := irw.Header().Get("Content-Type") - if contentType != "" { - return contentType - } - } - } - -fallback: - return irw.Context.Value(key) -} - -func (irw *instrumentedResponseWriterCN) Value(key interface{}) interface{} { - if keyStr, ok := key.(string); ok { - if keyStr == "http.response" { - return irw - } - } - - return irw.instrumentedResponseWriter.Value(key) -} diff --git a/vendor/github.com/docker/distribution/context/http_test.go b/vendor/github.com/docker/distribution/context/http_test.go deleted file mode 100644 index 3d4b3c8eb..000000000 --- a/vendor/github.com/docker/distribution/context/http_test.go +++ /dev/null @@ -1,285 +0,0 @@ -package context - -import ( - "net/http" - "net/http/httptest" - "net/http/httputil" - "net/url" - "reflect" - "testing" - "time" -) - -func TestWithRequest(t *testing.T) { - var req http.Request - - start := time.Now() - req.Method = "GET" - req.Host = "example.com" - req.RequestURI = "/test-test" - req.Header = make(http.Header) - req.Header.Set("Referer", "foo.com/referer") - req.Header.Set("User-Agent", "test/0.1") - - ctx := WithRequest(Background(), &req) - for _, testcase := range []struct { - key string - expected interface{} - }{ - { - key: "http.request", - expected: &req, - }, - { - key: "http.request.id", - }, - { - key: "http.request.method", - expected: req.Method, - }, - { - key: "http.request.host", - expected: req.Host, - }, - { - key: "http.request.uri", - expected: req.RequestURI, - }, - { - key: "http.request.referer", - expected: req.Referer(), - }, - { - key: "http.request.useragent", - expected: req.UserAgent(), - }, - { - key: "http.request.remoteaddr", - expected: req.RemoteAddr, - }, - { - key: "http.request.startedat", - }, - } { - v := ctx.Value(testcase.key) - - if v == nil { - t.Fatalf("value not found for %q", testcase.key) - } - - if testcase.expected != nil && v != testcase.expected { - t.Fatalf("%s: %v != %v", testcase.key, v, testcase.expected) - } - - // Key specific checks! - switch testcase.key { - case "http.request.id": - if _, ok := v.(string); !ok { - t.Fatalf("request id not a string: %v", v) - } - case "http.request.startedat": - vt, ok := v.(time.Time) - if !ok { - t.Fatalf("value not a time: %v", v) - } - - now := time.Now() - if vt.After(now) { - t.Fatalf("time generated too late: %v > %v", vt, now) - } - - if vt.Before(start) { - t.Fatalf("time generated too early: %v < %v", vt, start) - } - } - } -} - -type testResponseWriter struct { - flushed bool - status int - written int64 - header http.Header -} - -func (trw *testResponseWriter) Header() http.Header { - if trw.header == nil { - trw.header = make(http.Header) - } - - return trw.header -} - -func (trw *testResponseWriter) Write(p []byte) (n int, err error) { - if trw.status == 0 { - trw.status = http.StatusOK - } - - n = len(p) - trw.written += int64(n) - return -} - -func (trw *testResponseWriter) WriteHeader(status int) { - trw.status = status -} - -func (trw *testResponseWriter) Flush() { - trw.flushed = true -} - -func TestWithResponseWriter(t *testing.T) { - trw := testResponseWriter{} - ctx, rw := WithResponseWriter(Background(), &trw) - - if ctx.Value("http.response") != rw { - t.Fatalf("response not available in context: %v != %v", ctx.Value("http.response"), rw) - } - - grw, err := GetResponseWriter(ctx) - if err != nil { - t.Fatalf("error getting response writer: %v", err) - } - - if grw != rw { - t.Fatalf("unexpected response writer returned: %#v != %#v", grw, rw) - } - - if ctx.Value("http.response.status") != 0 { - t.Fatalf("response status should always be a number and should be zero here: %v != 0", ctx.Value("http.response.status")) - } - - if n, err := rw.Write(make([]byte, 1024)); err != nil { - t.Fatalf("unexpected error writing: %v", err) - } else if n != 1024 { - t.Fatalf("unexpected number of bytes written: %v != %v", n, 1024) - } - - if ctx.Value("http.response.status") != http.StatusOK { - t.Fatalf("unexpected response status in context: %v != %v", ctx.Value("http.response.status"), http.StatusOK) - } - - if ctx.Value("http.response.written") != int64(1024) { - t.Fatalf("unexpected number reported bytes written: %v != %v", ctx.Value("http.response.written"), 1024) - } - - // Make sure flush propagates - rw.(http.Flusher).Flush() - - if !trw.flushed { - t.Fatalf("response writer not flushed") - } - - // Write another status and make sure context is correct. This normally - // wouldn't work except for in this contrived testcase. - rw.WriteHeader(http.StatusBadRequest) - - if ctx.Value("http.response.status") != http.StatusBadRequest { - t.Fatalf("unexpected response status in context: %v != %v", ctx.Value("http.response.status"), http.StatusBadRequest) - } -} - -func TestWithVars(t *testing.T) { - var req http.Request - vars := map[string]string{ - "foo": "asdf", - "bar": "qwer", - } - - getVarsFromRequest = func(r *http.Request) map[string]string { - if r != &req { - t.Fatalf("unexpected request: %v != %v", r, req) - } - - return vars - } - - ctx := WithVars(Background(), &req) - for _, testcase := range []struct { - key string - expected interface{} - }{ - { - key: "vars", - expected: vars, - }, - { - key: "vars.foo", - expected: "asdf", - }, - { - key: "vars.bar", - expected: "qwer", - }, - } { - v := ctx.Value(testcase.key) - - if !reflect.DeepEqual(v, testcase.expected) { - t.Fatalf("%q: %v != %v", testcase.key, v, testcase.expected) - } - } -} - -// SingleHostReverseProxy will insert an X-Forwarded-For header, and can be used to test -// RemoteAddr(). A fake RemoteAddr cannot be set on the HTTP request - it is overwritten -// at the transport layer to 127.0.0.1: . However, as the X-Forwarded-For header -// just contains the IP address, it is different enough for testing. -func TestRemoteAddr(t *testing.T) { - var expectedRemote string - backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - - if r.RemoteAddr == expectedRemote { - t.Errorf("Unexpected matching remote addresses") - } - - actualRemote := RemoteAddr(r) - if expectedRemote != actualRemote { - t.Errorf("Mismatching remote hosts: %v != %v", expectedRemote, actualRemote) - } - - w.WriteHeader(200) - })) - - defer backend.Close() - backendURL, err := url.Parse(backend.URL) - if err != nil { - t.Fatal(err) - } - - proxy := httputil.NewSingleHostReverseProxy(backendURL) - frontend := httptest.NewServer(proxy) - defer frontend.Close() - - // X-Forwarded-For set by proxy - expectedRemote = "127.0.0.1" - proxyReq, err := http.NewRequest("GET", frontend.URL, nil) - if err != nil { - t.Fatal(err) - } - - _, err = http.DefaultClient.Do(proxyReq) - if err != nil { - t.Fatal(err) - } - - // RemoteAddr in X-Real-Ip - getReq, err := http.NewRequest("GET", backend.URL, nil) - if err != nil { - t.Fatal(err) - } - - expectedRemote = "1.2.3.4" - getReq.Header["X-Real-ip"] = []string{expectedRemote} - _, err = http.DefaultClient.Do(getReq) - if err != nil { - t.Fatal(err) - } - - // Valid X-Real-Ip and invalid X-Forwarded-For - getReq.Header["X-forwarded-for"] = []string{"1.2.3"} - _, err = http.DefaultClient.Do(getReq) - if err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/distribution/context/logger.go b/vendor/github.com/docker/distribution/context/logger.go deleted file mode 100644 index fbb6a0511..000000000 --- a/vendor/github.com/docker/distribution/context/logger.go +++ /dev/null @@ -1,116 +0,0 @@ -package context - -import ( - "fmt" - - "github.com/Sirupsen/logrus" - "runtime" -) - -// Logger provides a leveled-logging interface. -type Logger interface { - // standard logger methods - Print(args ...interface{}) - Printf(format string, args ...interface{}) - Println(args ...interface{}) - - Fatal(args ...interface{}) - Fatalf(format string, args ...interface{}) - Fatalln(args ...interface{}) - - Panic(args ...interface{}) - Panicf(format string, args ...interface{}) - Panicln(args ...interface{}) - - // Leveled methods, from logrus - Debug(args ...interface{}) - Debugf(format string, args ...interface{}) - Debugln(args ...interface{}) - - Error(args ...interface{}) - Errorf(format string, args ...interface{}) - Errorln(args ...interface{}) - - Info(args ...interface{}) - Infof(format string, args ...interface{}) - Infoln(args ...interface{}) - - Warn(args ...interface{}) - Warnf(format string, args ...interface{}) - Warnln(args ...interface{}) -} - -// WithLogger creates a new context with provided logger. -func WithLogger(ctx Context, logger Logger) Context { - return WithValue(ctx, "logger", logger) -} - -// GetLoggerWithField returns a logger instance with the specified field key -// and value without affecting the context. Extra specified keys will be -// resolved from the context. -func GetLoggerWithField(ctx Context, key, value interface{}, keys ...interface{}) Logger { - return getLogrusLogger(ctx, keys...).WithField(fmt.Sprint(key), value) -} - -// GetLoggerWithFields returns a logger instance with the specified fields -// without affecting the context. Extra specified keys will be resolved from -// the context. -func GetLoggerWithFields(ctx Context, fields map[interface{}]interface{}, keys ...interface{}) Logger { - // must convert from interface{} -> interface{} to string -> interface{} for logrus. - lfields := make(logrus.Fields, len(fields)) - for key, value := range fields { - lfields[fmt.Sprint(key)] = value - } - - return getLogrusLogger(ctx, keys...).WithFields(lfields) -} - -// GetLogger returns the logger from the current context, if present. If one -// or more keys are provided, they will be resolved on the context and -// included in the logger. While context.Value takes an interface, any key -// argument passed to GetLogger will be passed to fmt.Sprint when expanded as -// a logging key field. If context keys are integer constants, for example, -// its recommended that a String method is implemented. -func GetLogger(ctx Context, keys ...interface{}) Logger { - return getLogrusLogger(ctx, keys...) -} - -// GetLogrusLogger returns the logrus logger for the context. If one more keys -// are provided, they will be resolved on the context and included in the -// logger. Only use this function if specific logrus functionality is -// required. -func getLogrusLogger(ctx Context, keys ...interface{}) *logrus.Entry { - var logger *logrus.Entry - - // Get a logger, if it is present. - loggerInterface := ctx.Value("logger") - if loggerInterface != nil { - if lgr, ok := loggerInterface.(*logrus.Entry); ok { - logger = lgr - } - } - - if logger == nil { - fields := logrus.Fields{} - - // Fill in the instance id, if we have it. - instanceID := ctx.Value("instance.id") - if instanceID != nil { - fields["instance.id"] = instanceID - } - - fields["go.version"] = runtime.Version() - // If no logger is found, just return the standard logger. - logger = logrus.StandardLogger().WithFields(fields) - } - - fields := logrus.Fields{} - for _, key := range keys { - v := ctx.Value(key) - if v != nil { - fields[fmt.Sprint(key)] = v - } - } - - return logger.WithFields(fields) -} diff --git a/vendor/github.com/docker/distribution/context/trace.go b/vendor/github.com/docker/distribution/context/trace.go deleted file mode 100644 index 721964a84..000000000 --- a/vendor/github.com/docker/distribution/context/trace.go +++ /dev/null @@ -1,104 +0,0 @@ -package context - -import ( - "runtime" - "time" - - "github.com/docker/distribution/uuid" -) - -// WithTrace allocates a traced timing span in a new context. This allows a -// caller to track the time between calling WithTrace and the returned done -// function. When the done function is called, a log message is emitted with a -// "trace.duration" field, corresponding to the elapsed time and a -// "trace.func" field, corresponding to the function that called WithTrace. -// -// The logging keys "trace.id" and "trace.parent.id" are provided to implement -// dapper-like tracing. This function should be complemented with a WithSpan -// method that could be used for tracing distributed RPC calls. -// -// The main benefit of this function is to post-process log messages or -// intercept them in a hook to provide timing data. Trace ids and parent ids -// can also be linked to provide call tracing, if so required. -// -// Here is an example of the usage: -// -// func timedOperation(ctx Context) { -// ctx, done := WithTrace(ctx) -// defer done("this will be the log message") -// // ... function body ... -// } -// -// If the function ran for roughly 1s, such a usage would emit a log message -// as follows: -// -// INFO[0001] this will be the log message trace.duration=1.004575763s trace.func=github.com/docker/distribution/context.traceOperation trace.id= ... -// -// Notice that the function name is automatically resolved, along with the -// package and a trace id is emitted that can be linked with parent ids. -func WithTrace(ctx Context) (Context, func(format string, a ...interface{})) { - if ctx == nil { - ctx = Background() - } - - pc, file, line, _ := runtime.Caller(1) - f := runtime.FuncForPC(pc) - ctx = &traced{ - Context: ctx, - id: uuid.Generate().String(), - start: time.Now(), - parent: GetStringValue(ctx, "trace.id"), - fnname: f.Name(), - file: file, - line: line, - } - - return ctx, func(format string, a ...interface{}) { - GetLogger(ctx, - "trace.duration", - "trace.id", - "trace.parent.id", - "trace.func", - "trace.file", - "trace.line"). - Debugf(format, a...) - } -} - -// traced represents a context that is traced for function call timing. It -// also provides fast lookup for the various attributes that are available on -// the trace. -type traced struct { - Context - id string - parent string - start time.Time - fnname string - file string - line int -} - -func (ts *traced) Value(key interface{}) interface{} { - switch key { - case "trace.start": - return ts.start - case "trace.duration": - return time.Since(ts.start) - case "trace.id": - return ts.id - case "trace.parent.id": - if ts.parent == "" { - return nil // must return nil to signal no parent. - } - - return ts.parent - case "trace.func": - return ts.fnname - case "trace.file": - return ts.file - case "trace.line": - return ts.line - } - - return ts.Context.Value(key) -} diff --git a/vendor/github.com/docker/distribution/context/trace_test.go b/vendor/github.com/docker/distribution/context/trace_test.go deleted file mode 100644 index 4b969fbb0..000000000 --- a/vendor/github.com/docker/distribution/context/trace_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package context - -import ( - "runtime" - "testing" - "time" -) - -// TestWithTrace ensures that tracing has the expected values in the context. -func TestWithTrace(t *testing.T) { - pc, file, _, _ := runtime.Caller(0) // get current caller. - f := runtime.FuncForPC(pc) - - base := []valueTestCase{ - { - key: "trace.id", - notnilorempty: true, - }, - - { - key: "trace.file", - expected: file, - notnilorempty: true, - }, - { - key: "trace.line", - notnilorempty: true, - }, - { - key: "trace.start", - notnilorempty: true, - }, - } - - ctx, done := WithTrace(Background()) - defer done("this will be emitted at end of test") - - checkContextForValues(t, ctx, append(base, valueTestCase{ - key: "trace.func", - expected: f.Name(), - })) - - traced := func() { - parentID := ctx.Value("trace.id") // ensure the parent trace id is correct. - - pc, _, _, _ := runtime.Caller(0) // get current caller. - f := runtime.FuncForPC(pc) - ctx, done := WithTrace(ctx) - defer done("this should be subordinate to the other trace") - time.Sleep(time.Second) - checkContextForValues(t, ctx, append(base, valueTestCase{ - key: "trace.func", - expected: f.Name(), - }, valueTestCase{ - key: "trace.parent.id", - expected: parentID, - })) - } - traced() - - time.Sleep(time.Second) -} - -type valueTestCase struct { - key string - expected interface{} - notnilorempty bool // just check not empty/not nil -} - -func checkContextForValues(t *testing.T, ctx Context, values []valueTestCase) { - - for _, testcase := range values { - v := ctx.Value(testcase.key) - if testcase.notnilorempty { - if v == nil || v == "" { - t.Fatalf("value was nil or empty for %q: %#v", testcase.key, v) - } - continue - } - - if v != testcase.expected { - t.Fatalf("unexpected value for key %q: %v != %v", testcase.key, v, testcase.expected) - } - } -} diff --git a/vendor/github.com/docker/distribution/context/util.go b/vendor/github.com/docker/distribution/context/util.go deleted file mode 100644 index cb9ef52e3..000000000 --- a/vendor/github.com/docker/distribution/context/util.go +++ /dev/null @@ -1,24 +0,0 @@ -package context - -import ( - "time" -) - -// Since looks up key, which should be a time.Time, and returns the duration -// since that time. If the key is not found, the value returned will be zero. -// This is helpful when inferring metrics related to context execution times. -func Since(ctx Context, key interface{}) time.Duration { - if startedAt, ok := ctx.Value(key).(time.Time); ok { - return time.Since(startedAt) - } - return 0 -} - -// GetStringValue returns a string value from the context. The empty string -// will be returned if not found. -func GetStringValue(ctx Context, key interface{}) (value string) { - if valuev, ok := ctx.Value(key).(string); ok { - value = valuev - } - return value -} diff --git a/vendor/github.com/docker/distribution/context/version.go b/vendor/github.com/docker/distribution/context/version.go deleted file mode 100644 index 746cda02e..000000000 --- a/vendor/github.com/docker/distribution/context/version.go +++ /dev/null @@ -1,16 +0,0 @@ -package context - -// WithVersion stores the application version in the context. The new context -// gets a logger to ensure log messages are marked with the application -// version. -func WithVersion(ctx Context, version string) Context { - ctx = WithValue(ctx, "version", version) - // push a new logger onto the stack - return WithLogger(ctx, GetLogger(ctx, "version")) -} - -// GetVersion returns the application version from the context. An empty -// string may returned if the version was not set on the context. -func GetVersion(ctx Context) string { - return GetStringValue(ctx, "version") -} diff --git a/vendor/github.com/docker/distribution/context/version_test.go b/vendor/github.com/docker/distribution/context/version_test.go deleted file mode 100644 index b81652691..000000000 --- a/vendor/github.com/docker/distribution/context/version_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package context - -import "testing" - -func TestVersionContext(t *testing.T) { - ctx := Background() - - if GetVersion(ctx) != "" { - t.Fatalf("context should not yet have a version") - } - - expected := "2.1-whatever" - ctx = WithVersion(ctx, expected) - version := GetVersion(ctx) - - if version != expected { - t.Fatalf("version was not set: %q != %q", version, expected) - } -} diff --git a/vendor/github.com/docker/distribution/contrib/apache/README.MD b/vendor/github.com/docker/distribution/contrib/apache/README.MD deleted file mode 100644 index 29f6bae18..000000000 --- a/vendor/github.com/docker/distribution/contrib/apache/README.MD +++ /dev/null @@ -1,36 +0,0 @@ -# Apache HTTPd sample for Registry v1, v2 and mirror - -3 containers involved - -* Docker Registry v1 (registry 0.9.1) -* Docker Registry v2 (registry 2.0.0) -* Docker Registry v1 in mirror mode - -HTTP for mirror and HTTPS for v1 & v2 - -* http://registry.example.com proxify Docker Registry 1.0 in Mirror mode -* https://registry.example.com proxify Docker Registry 1.0 or 2.0 in Hosting mode - -## 3 Docker containers should be started - -* Docker Registry 1.0 in Mirror mode : port 5001 -* Docker Registry 1.0 in Hosting mode : port 5000 -* Docker Registry 2.0 in Hosting mode : port 5002 - -### Registry v1 - - docker run -d -e SETTINGS_FLAVOR=dev -v /var/lib/docker-registry/storage/hosting-v1:/tmp -p 5000:5000 registry:0.9.1" - -### Mirror - - docker run -d -e SETTINGS_FLAVOR=dev -e STANDALONE=false -e MIRROR_SOURCE=https://registry-1.docker.io -e MIRROR_SOURCE_INDEX=https://index.docker.io \ - -e MIRROR_TAGS_CACHE_TTL=172800 -v /var/lib/docker-registry/storage/mirror:/tmp -p 5001:5000 registry:0.9.1" - -### Registry v2 - - docker run -d -e SETTINGS_FLAVOR=dev -v /var/lib/axway/docker-registry/storage/hosting2-v2:/tmp -p 5002:5000 registry:2" - -# For Hosting mode access - -* users should have account (valid-user) to be able to fetch images -* only users using account docker-deployer will be allowed to push images diff --git a/vendor/github.com/docker/distribution/contrib/apache/apache.conf b/vendor/github.com/docker/distribution/contrib/apache/apache.conf deleted file mode 100644 index 3300a7c02..000000000 --- a/vendor/github.com/docker/distribution/contrib/apache/apache.conf +++ /dev/null @@ -1,127 +0,0 @@ -# -# Sample Apache 2.x configuration where : -# - - - - ServerName registry.example.com - ServerAlias www.registry.example.com - - ProxyRequests off - ProxyPreserveHost on - - # no proxy for /error/ (Apache HTTPd errors messages) - ProxyPass /error/ ! - - ProxyPass /_ping http://localhost:5001/_ping - ProxyPassReverse /_ping http://localhost:5001/_ping - - ProxyPass /v1 http://localhost:5001/v1 - ProxyPassReverse /v1 http://localhost:5001/v1 - - # Logs - ErrorLog ${APACHE_LOG_DIR}/mirror_error_log - CustomLog ${APACHE_LOG_DIR}/mirror_access_log combined env=!dontlog - - - - - - - ServerName registry.example.com - ServerAlias www.registry.example.com - - SSLEngine on - SSLCertificateFile /etc/apache2/ssl/registry.example.com.crt - SSLCertificateKeyFile /etc/apache2/ssl/registry.example.com.key - - # Higher Strength SSL Ciphers - SSLProtocol all -SSLv2 -SSLv3 -TLSv1 - SSLCipherSuite RC4-SHA:HIGH - SSLHonorCipherOrder on - - # Logs - ErrorLog ${APACHE_LOG_DIR}/registry_error_ssl_log - CustomLog ${APACHE_LOG_DIR}/registry_access_ssl_log combined env=!dontlog - - Header always set "Docker-Distribution-Api-Version" "registry/2.0" - Header onsuccess set "Docker-Distribution-Api-Version" "registry/2.0" - RequestHeader set X-Forwarded-Proto "https" - - ProxyRequests off - ProxyPreserveHost on - - # no proxy for /error/ (Apache HTTPd errors messages) - ProxyPass /error/ ! - - # - # Registry v1 - # - - ProxyPass /v1 http://localhost:5000/v1 - ProxyPassReverse /v1 http://localhost:5000/v1 - - ProxyPass /_ping http://localhost:5000/_ping - ProxyPassReverse /_ping http://localhost:5000/_ping - - # Authentication require for push - - Order deny,allow - Allow from all - AuthName "Registry Authentication" - AuthType basic - AuthUserFile "/etc/apache2/htpasswd/registry-htpasswd" - - # Read access to authentified users - - Require valid-user - - - # Write access to docker-deployer account only - - Require user docker-deployer - - - - - # Allow ping to run unauthenticated. - - Satisfy any - Allow from all - - - # Allow ping to run unauthenticated. - - Satisfy any - Allow from all - - - # - # Registry v2 - # - - ProxyPass /v2 http://localhost:5002/v2 - ProxyPassReverse /v2 http://localhost:5002/v2 - - - Order deny,allow - Allow from all - AuthName "Registry Authentication" - AuthType basic - AuthUserFile "/etc/apache2/htpasswd/registry-htpasswd" - - # Read access to authentified users - - Require valid-user - - - # Write access to docker-deployer only - - Require user docker-deployer - - - - - - - diff --git a/vendor/github.com/docker/distribution/contrib/compose/README.md b/vendor/github.com/docker/distribution/contrib/compose/README.md deleted file mode 100644 index a9522fd24..000000000 --- a/vendor/github.com/docker/distribution/contrib/compose/README.md +++ /dev/null @@ -1,147 +0,0 @@ -# Docker Compose V1 + V2 registry - -This compose configuration configures a `v1` and `v2` registry behind an `nginx` -proxy. By default, you can access the combined registry at `localhost:5000`. - -The configuration does not support pushing images to `v2` and pulling from `v1`. -If a `docker` client has a version less than 1.6, Nginx will route its requests -to the 1.0 registry. Requests from newer clients will route to the 2.0 registry. - -### Install Docker Compose - -1. Open a new terminal on the host with your `distribution` source. - -2. Get the `docker-compose` binary. - - $ sudo wget https://github.com/docker/compose/releases/download/1.1.0/docker-compose-`uname -s`-`uname -m` -O /usr/local/bin/docker-compose - - This command installs the binary in the `/usr/local/bin` directory. - -3. Add executable permissions to the binary. - - $ sudo chmod +x /usr/local/bin/docker-compose - -## Build and run with Compose - -1. In your terminal, navigate to the `distribution/contrib/compose` directory - - This directory includes a single `docker-compose.yml` configuration. - - nginx: - build: "nginx" - ports: - - "5000:5000" - links: - - registryv1:registryv1 - - registryv2:registryv2 - registryv1: - image: registry - ports: - - "5000" - registryv2: - build: "../../" - ports: - - "5000" - - This configuration builds a new `nginx` image as specified by the - `nginx/Dockerfile` file. The 1.0 registry comes from Docker's official - public image. Finally, the registry 2.0 image is built from the - `distribution/Dockerfile` you've used previously. - -2. Get a registry 1.0 image. - - $ docker pull registry:0.9.1 - - The Compose configuration looks for this image locally. If you don't do this - step, later steps can fail. - -3. Build `nginx`, the registry 2.0 image, and - - $ docker-compose build - registryv1 uses an image, skipping - Building registryv2... - Step 0 : FROM golang:1.4 - - ... - - Removing intermediate container 9f5f5068c3f3 - Step 4 : COPY docker-registry-v2.conf /etc/nginx/docker-registry-v2.conf - ---> 74acc70fa106 - Removing intermediate container edb84c2b40cb - Successfully built 74acc70fa106 - - The commmand outputs its progress until it completes. - -4. Start your configuration with compose. - - $ docker-compose up - Recreating compose_registryv1_1... - Recreating compose_registryv2_1... - Recreating compose_nginx_1... - Attaching to compose_registryv1_1, compose_registryv2_1, compose_nginx_1 - ... - - -5. In another terminal, display the running configuration. - - $ docker ps - CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES - a81ad2557702 compose_nginx:latest "nginx -g 'daemon of 8 minutes ago Up 8 minutes 80/tcp, 443/tcp, 0.0.0.0:5000->5000/tcp compose_nginx_1 - 0618437450dd compose_registryv2:latest "registry cmd/regist 8 minutes ago Up 8 minutes 0.0.0.0:32777->5000/tcp compose_registryv2_1 - aa82b1ed8e61 registry:latest "docker-registry" 8 minutes ago Up 8 minutes 0.0.0.0:32776->5000/tcp compose_registryv1_1 - -### Explore a bit - -1. Check for TLS on your `nginx` server. - - $ curl -v https://localhost:5000 - * Rebuilt URL to: https://localhost:5000/ - * Hostname was NOT found in DNS cache - * Trying 127.0.0.1... - * Connected to localhost (127.0.0.1) port 5000 (#0) - * successfully set certificate verify locations: - * CAfile: none - CApath: /etc/ssl/certs - * SSLv3, TLS handshake, Client hello (1): - * SSLv3, TLS handshake, Server hello (2): - * SSLv3, TLS handshake, CERT (11): - * SSLv3, TLS alert, Server hello (2): - * SSL certificate problem: self signed certificate - * Closing connection 0 - curl: (60) SSL certificate problem: self signed certificate - More details here: http://curl.haxx.se/docs/sslcerts.html - -2. Tag the `v1` registry image. - - $ docker tag registry:latest localhost:5000/registry_one:latest - -2. Push it to the localhost. - - $ docker push localhost:5000/registry_one:latest - - If you are using the 1.6 Docker client, this pushes the image the `v2 `registry. - -4. Use `curl` to list the image in the registry. - - $ curl -v -X GET http://localhost:32777/v2/registry1/tags/list - * Hostname was NOT found in DNS cache - * Trying 127.0.0.1... - * Connected to localhost (127.0.0.1) port 32777 (#0) - > GET /v2/registry1/tags/list HTTP/1.1 - > User-Agent: curl/7.36.0 - > Host: localhost:32777 - > Accept: */* - > - < HTTP/1.1 200 OK - < Content-Type: application/json; charset=utf-8 - < Docker-Distribution-Api-Version: registry/2.0 - < Date: Tue, 14 Apr 2015 22:34:13 GMT - < Content-Length: 39 - < - {"name":"registry1","tags":["latest"]} - * Connection #0 to host localhost left intact - - This example refers to the specific port assigned to the 2.0 registry. You saw - this port earlier, when you used `docker ps` to show your running containers. - - diff --git a/vendor/github.com/docker/distribution/contrib/compose/docker-compose.yml b/vendor/github.com/docker/distribution/contrib/compose/docker-compose.yml deleted file mode 100644 index 5cd048588..000000000 --- a/vendor/github.com/docker/distribution/contrib/compose/docker-compose.yml +++ /dev/null @@ -1,15 +0,0 @@ -nginx: - build: "nginx" - ports: - - "5000:5000" - links: - - registryv1:registryv1 - - registryv2:registryv2 -registryv1: - image: registry - ports: - - "5000" -registryv2: - build: "../../" - ports: - - "5000" diff --git a/vendor/github.com/docker/distribution/contrib/compose/nginx/Dockerfile b/vendor/github.com/docker/distribution/contrib/compose/nginx/Dockerfile deleted file mode 100644 index 2b252ec7d..000000000 --- a/vendor/github.com/docker/distribution/contrib/compose/nginx/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM nginx:1.7 - -COPY nginx.conf /etc/nginx/nginx.conf -COPY registry.conf /etc/nginx/conf.d/registry.conf -COPY docker-registry.conf /etc/nginx/docker-registry.conf -COPY docker-registry-v2.conf /etc/nginx/docker-registry-v2.conf diff --git a/vendor/github.com/docker/distribution/contrib/compose/nginx/docker-registry-v2.conf b/vendor/github.com/docker/distribution/contrib/compose/nginx/docker-registry-v2.conf deleted file mode 100644 index 65c4d7766..000000000 --- a/vendor/github.com/docker/distribution/contrib/compose/nginx/docker-registry-v2.conf +++ /dev/null @@ -1,6 +0,0 @@ -proxy_pass http://docker-registry-v2; -proxy_set_header Host $http_host; # required for docker client's sake -proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP -proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; -proxy_set_header X-Forwarded-Proto $scheme; -proxy_read_timeout 900; diff --git a/vendor/github.com/docker/distribution/contrib/compose/nginx/docker-registry.conf b/vendor/github.com/docker/distribution/contrib/compose/nginx/docker-registry.conf deleted file mode 100644 index 7b039a54a..000000000 --- a/vendor/github.com/docker/distribution/contrib/compose/nginx/docker-registry.conf +++ /dev/null @@ -1,7 +0,0 @@ -proxy_pass http://docker-registry; -proxy_set_header Host $http_host; # required for docker client's sake -proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP -proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; -proxy_set_header X-Forwarded-Proto $scheme; -proxy_set_header Authorization ""; # For basic auth through nginx in v1 to work, please comment this line -proxy_read_timeout 900; diff --git a/vendor/github.com/docker/distribution/contrib/compose/nginx/nginx.conf b/vendor/github.com/docker/distribution/contrib/compose/nginx/nginx.conf deleted file mode 100644 index 63cd180d6..000000000 --- a/vendor/github.com/docker/distribution/contrib/compose/nginx/nginx.conf +++ /dev/null @@ -1,27 +0,0 @@ -user nginx; -worker_processes 1; - -error_log /var/log/nginx/error.log warn; -pid /var/run/nginx.pid; - -events { - worker_connections 1024; -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - - keepalive_timeout 65; - - include /etc/nginx/conf.d/*.conf; -} - diff --git a/vendor/github.com/docker/distribution/contrib/compose/nginx/registry.conf b/vendor/github.com/docker/distribution/contrib/compose/nginx/registry.conf deleted file mode 100644 index 47ffd2379..000000000 --- a/vendor/github.com/docker/distribution/contrib/compose/nginx/registry.conf +++ /dev/null @@ -1,41 +0,0 @@ -# Docker registry proxy for api versions 1 and 2 - -upstream docker-registry { - server registryv1:5000; -} - -upstream docker-registry-v2 { - server registryv2:5000; -} - -# No client auth or TLS -server { - listen 5000; - server_name localhost; - - # disable any limits to avoid HTTP 413 for large image uploads - client_max_body_size 0; - - # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486) - chunked_transfer_encoding on; - - location /v2/ { - # Do not allow connections from docker 1.5 and earlier - # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents - if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) { - return 404; - } - - # To add basic authentication to v2 use auth_basic setting plus add_header - # auth_basic "registry.localhost"; - # auth_basic_user_file test.password; - # add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always; - - include docker-registry-v2.conf; - } - - location / { - include docker-registry.conf; - } -} - diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/Dockerfile b/vendor/github.com/docker/distribution/contrib/docker-integration/Dockerfile deleted file mode 100644 index 7a047a689..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM distribution/golem:0.1 - -MAINTAINER Docker Distribution Team - -RUN apk add --no-cache git - -ENV TMPDIR /var/lib/docker/tmp - -WORKDIR /go/src/github.com/docker/distribution/contrib/docker-integration diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/README.md b/vendor/github.com/docker/distribution/contrib/docker-integration/README.md deleted file mode 100644 index bc5be9d96..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# Docker Registry Integration Testing - -These integration tests cover interactions between registry clients such as -the docker daemon and the registry server. All tests can be run using the -[golem integration test runner](https://github.com/docker/golem) - -The integration tests configure components using docker compose -(see docker-compose.yaml) and the runner can be using the golem -configuration file (see golem.conf). - -## Running integration tests - -### Run using multiversion script - -The integration tests in the `contrib/docker-integration` directory can be simply -run by executing the run script `./run_multiversion.sh`. If there is no running -daemon to connect to, run as `./run_multiversion.sh -d`. - -This command will build the distribution image from the locally checked out -version and run against multiple versions of docker defined in the script. To -run a specific version of the registry or docker, Golem will need to be -executed manually. - -### Run manually using Golem - -Using the golem tool directly allows running against multiple versions of -the registry and docker. Running against multiple versions of the registry -can be useful for testing changes in the docker daemon which are not -covered by the default run script. - -#### Installing Golem - -Golem is distributed as an executable binary which can be installed from -the [release page](https://github.com/docker/golem/releases/tag/v0.1). - -#### Running golem with docker - -Additionally golem can be run as a docker image requiring no additonal -installation. - -`docker run --privileged -v "$GOPATH/src/github.com/docker/distribution/contrib/docker-integration:/test" -w /test distribution/golem golem -rundaemon .` - -#### Golem custom images - -Golem tests version of software by defining the docker image to test. - -Run with registry 2.2.1 and docker 1.10.3 - -`golem -i golem-dind:latest,docker:1.10.3-dind,1.10.3 -i golem-distribution:latest,registry:2.2.1 .` - - -#### Use golem caching for developing tests - -Golem allows caching image configuration to reduce test start up time. -Using this cache will allow tests with the same set of images to start -up quickly. This can be useful when developing tests and needing the -test to run quickly. If there are changes which effect the image (such as -building a new registry image), then startup time will be slower. - -Run this command multiple times and after the first time test runs -should start much quicker. -`golem -cache ~/.cache/docker/golem -i golem-dind:latest,docker:1.10.3-dind,1.10.3 -i golem-distribution:latest,registry:2.2.1 .` - diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/docker-compose.yml b/vendor/github.com/docker/distribution/contrib/docker-integration/docker-compose.yml deleted file mode 100644 index 4d4f3856f..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/docker-compose.yml +++ /dev/null @@ -1,91 +0,0 @@ -nginx: - build: "nginx" - ports: - - "5000:5000" - - "5002:5002" - - "5440:5440" - - "5441:5441" - - "5442:5442" - - "5443:5443" - - "5444:5444" - - "5445:5445" - - "5446:5446" - - "5447:5447" - - "5448:5448" - - "5554:5554" - - "5555:5555" - - "5556:5556" - - "5557:5557" - - "5558:5558" - - "5559:5559" - - "5600:5600" - - "6666:6666" - links: - - registryv2:registryv2 - - malevolent:malevolent - - registryv2token:registryv2token - - tokenserver:tokenserver - - registryv2tokenoauth:registryv2tokenoauth - - registryv2tokenoauthnotls:registryv2tokenoauthnotls - - tokenserveroauth:tokenserveroauth -registryv2: - image: golem-distribution:latest - ports: - - "5000" -registryv2token: - image: golem-distribution:latest - ports: - - "5000" - volumes: - - ./tokenserver/registry-config.yml:/etc/docker/registry/config.yml - - ./tokenserver/certs/localregistry.cert:/etc/docker/registry/localregistry.cert - - ./tokenserver/certs/localregistry.key:/etc/docker/registry/localregistry.key - - ./tokenserver/certs/signing.cert:/etc/docker/registry/tokenbundle.pem -tokenserver: - build: "tokenserver" - command: "--debug -addr 0.0.0.0:5556 -issuer registry-test -passwd .htpasswd -tlscert tls.cert -tlskey tls.key -key sign.key -realm http://auth.localregistry:5556" - ports: - - "5556" -registryv2tokenoauth: - image: golem-distribution:latest - ports: - - "5000" - volumes: - - ./tokenserver-oauth/registry-config.yml:/etc/docker/registry/config.yml - - ./tokenserver-oauth/certs/localregistry.cert:/etc/docker/registry/localregistry.cert - - ./tokenserver-oauth/certs/localregistry.key:/etc/docker/registry/localregistry.key - - ./tokenserver-oauth/certs/signing.cert:/etc/docker/registry/tokenbundle.pem -registryv2tokenoauthnotls: - image: golem-distribution:latest - ports: - - "5000" - volumes: - - ./tokenserver-oauth/registry-config-notls.yml:/etc/docker/registry/config.yml - - ./tokenserver-oauth/certs/signing.cert:/etc/docker/registry/tokenbundle.pem -tokenserveroauth: - build: "tokenserver-oauth" - command: "--debug -addr 0.0.0.0:5559 -issuer registry-test -passwd .htpasswd -tlscert tls.cert -tlskey tls.key -key sign.key -realm http://auth.localregistry:5559" - ports: - - "5559" -malevolent: - image: "dmcgowan/malevolent:0.1.0" - command: "-l 0.0.0.0:6666 -r http://registryv2:5000 -c /certs/localregistry.cert -k /certs/localregistry.key" - links: - - registryv2:registryv2 - volumes: - - ./malevolent-certs:/certs:ro - ports: - - "6666" -docker: - image: golem-dind:latest - container_name: dockerdaemon - command: "docker daemon --debug -s $DOCKER_GRAPHDRIVER" - privileged: true - environment: - DOCKER_GRAPHDRIVER: - volumes: - - /etc/generated_certs.d:/etc/docker/certs.d - - /var/lib/docker - links: - - nginx:localregistry - - nginx:auth.localregistry diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/golem.conf b/vendor/github.com/docker/distribution/contrib/docker-integration/golem.conf deleted file mode 100644 index 99c8d600c..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/golem.conf +++ /dev/null @@ -1,18 +0,0 @@ -[[suite]] - dind=true - images=[ "nginx:1.9", "dmcgowan/token-server:simple", "dmcgowan/token-server:oauth", "dmcgowan/malevolent:0.1.0" ] - - [[suite.pretest]] - command="sh ./install_certs.sh /etc/generated_certs.d" - [[suite.testrunner]] - command="bats -t ." - format="tap" - env=["TEST_REPO=hello-world", "TEST_TAG=latest", "TEST_USER=testuser", "TEST_PASSWORD=passpassword", "TEST_REGISTRY=localregistry", "TEST_SKIP_PULL=true"] - [[suite.customimage]] - tag="golem-distribution:latest" - default="registry:2.2.1" - [[suite.customimage]] - tag="golem-dind:latest" - default="docker:1.10.1-dind" - version="1.10.1" - diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/helpers.bash b/vendor/github.com/docker/distribution/contrib/docker-integration/helpers.bash deleted file mode 100644 index e1813d3e5..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/helpers.bash +++ /dev/null @@ -1,101 +0,0 @@ -# has_digest enforces the last output line is "Digest: sha256:..." -# the input is the output from a docker push cli command -function has_digest() { - filtered=$(echo "$1" |sed -rn '/[dD]igest\: sha(256|384|512)/ p') - [ "$filtered" != "" ] - # See http://wiki.alpinelinux.org/wiki/Regex#BREs before making changes to regex - digest=$(expr "$filtered" : ".*\(sha[0-9]\{3,3\}:[a-z0-9]*\)") -} - -# tempImage creates a new image using the provided name -# requires bats -function tempImage() { - dir=$(mktemp -d) - run dd if=/dev/urandom of="$dir/f" bs=1024 count=512 - cat < "$dir/Dockerfile" -FROM scratch -COPY f /f - -CMD [] -DockerFileContent - - cp_t $dir "/tmpbuild/" - exec_t "cd /tmpbuild/; docker build --no-cache -t $1 .; rm -rf /tmpbuild/" -} - -# skip basic auth tests with Docker 1.6, where they don't pass due to -# certificate issues, requires bats -function basic_auth_version_check() { - run sh -c 'docker version | fgrep -q "Client version: 1.6."' - if [ "$status" -eq 0 ]; then - skip "Basic auth tests don't support 1.6.x" - fi -} - -# login issues a login to docker to the provided server -# uses user, password, and email variables set outside of function -# requies bats -function login() { - rm -f /root/.docker/config.json - run docker_t login -u $user -p $password -e $email $1 - if [ "$status" -ne 0 ]; then - echo $output - fi - [ "$status" -eq 0 ] - # First line is WARNING about credential save or email deprecation (maybe both) - [ "${lines[2]}" = "Login Succeeded" -o "${lines[1]}" = "Login Succeeded" ] -} - -function login_oauth() { - login $@ - - tmpFile=$(mktemp) - get_file_t /root/.docker/config.json $tmpFile - run awk -v RS="" "/\"$1\": \\{[[:space:]]+\"auth\": \"[[:alnum:]]+\",[[:space:]]+\"identitytoken\"/ {exit 3}" $tmpFile - [ "$status" -eq 3 ] -} - -function parse_version() { - version=$(echo "$1" | cut -d '-' -f1) # Strip anything after '-' - major=$(echo "$version" | cut -d . -f1) - minor=$(echo "$version" | cut -d . -f2) - rev=$(echo "$version" | cut -d . -f3) - - version=$((major * 1000 * 1000 + minor * 1000 + rev)) -} - -function version_check() { - name=$1 - checkv=$2 - minv=$3 - parse_version "$checkv" - v=$version - parse_version "$minv" - if [ "$v" -lt "$version" ]; then - skip "$name version \"$checkv\" does not meet required version \"$minv\"" - fi -} - -function get_file_t() { - docker cp dockerdaemon:$1 $2 -} - -function cp_t() { - docker cp $1 dockerdaemon:$2 -} - -function exec_t() { - docker exec dockerdaemon sh -c "$@" -} - -function docker_t() { - docker exec dockerdaemon docker $@ -} - -# build reates a new docker image id from another image -function build() { - docker exec -i dockerdaemon docker build --no-cache -t $1 - <> $2/ca.crt -} - -install_test_certs $installdir - -# Malevolent server -install_ca_file ./malevolent-certs/ca.pem $installdir/$hostname:6666 - -# Token server -install_ca_file ./tokenserver/certs/ca.pem $installdir/$hostname:5554 -install_ca_file ./tokenserver/certs/ca.pem $installdir/$hostname:5555 -install_ca_file ./tokenserver/certs/ca.pem $installdir/$hostname:5557 -install_ca_file ./tokenserver/certs/ca.pem $installdir/$hostname:5558 -append_ca_file ./tokenserver/certs/ca.pem $installdir/$hostname:5600 - diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/malevolent-certs/localregistry.cert b/vendor/github.com/docker/distribution/contrib/docker-integration/malevolent-certs/localregistry.cert deleted file mode 100644 index 071e7a2bc..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/malevolent-certs/localregistry.cert +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDETCCAfugAwIBAgIQZRKt7OeG+TlC2riszYwQQTALBgkqhkiG9w0BAQswJjER -MA8GA1UEChMIUXVpY2tUTFMxETAPBgNVBAMTCFF1aWNrVExTMB4XDTE1MDgyMDIz -MjE0OVoXDTE4MDgwNDIzMjE0OVowKzERMA8GA1UEChMIUXVpY2tUTFMxFjAUBgNV -BAMTDWxvY2FscmVnaXN0cnkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDPdsUBStNMz4coXfQVIJIafG85VkngM4fV7hrg7AbiGLCWvq8cWOrYM50G9Wmo -twK1WeQ6bigYOjINgSfTxcy3adciVZIIJyXqboz6n2V0yRPWpakof939bvuAurAP -tSqQ2V5fGN0ZZn4J4IbXMSovKwo7sG3X6i4q/8DYHZ/mKjvCRMPC3MGWqunknpkm -dzyKbIFHaDKlAqIOwTsDhHvGzm/9n3D+h4sl5ZPBobuBEV2u5GR0H5ujak4+Kczt -thCWtRkzCfnjW0TEanheSYJGu8OgCGoFjQnHotgqvOO6iHZCsrB3gf8WQeou+y9e -+OyLZv3FmqdC9SXr3b0LGQTFAgMBAAGjOjA4MA4GA1UdDwEB/wQEAwIAoDAMBgNV -HRMBAf8EAjAAMBgGA1UdEQQRMA+CDWxvY2FscmVnaXN0cnkwCwYJKoZIhvcNAQEL -A4IBAQC/PP2Y9QVhO8t4BXML1QpNRWqXG8Gg0P1XIh6M6FoxcGIodLdbzui828YB -wm9ZlyKars+nDdgLdQWawdV7hSd6s2NeQlHYQSGLsdTAVkgIxiD7D2Tw3kAZ6Zrj -dPikoVAc+rBMm/BXQLzy95IAbBVOHOpBkOOgF+TYxeLnOc3GzbUqBi1Pq97DMaxr -DaDuywH55P/6v7qt610UIsZ6+RZ78iiRx4Q+oRxEqGT0rXI76gVxOFabbJuFr1n1 -kEWa3u/BssJzX3KVAm7oUtaBnj2SH5fokFmvZ5lBXA4QO/5doOa8yZiFFvvQs7EY -SWDxLrvS33UCtsCcpPggjehnxKaC ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/malevolent-certs/localregistry.key b/vendor/github.com/docker/distribution/contrib/docker-integration/malevolent-certs/localregistry.key deleted file mode 100644 index c5bf7ac12..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/malevolent-certs/localregistry.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEAz3bFAUrTTM+HKF30FSCSGnxvOVZJ4DOH1e4a4OwG4hiwlr6v -HFjq2DOdBvVpqLcCtVnkOm4oGDoyDYEn08XMt2nXIlWSCCcl6m6M+p9ldMkT1qWp -KH/d/W77gLqwD7UqkNleXxjdGWZ+CeCG1zEqLysKO7Bt1+ouKv/A2B2f5io7wkTD -wtzBlqrp5J6ZJnc8imyBR2gypQKiDsE7A4R7xs5v/Z9w/oeLJeWTwaG7gRFdruRk -dB+bo2pOPinM7bYQlrUZMwn541tExGp4XkmCRrvDoAhqBY0Jx6LYKrzjuoh2QrKw -d4H/FkHqLvsvXvjsi2b9xZqnQvUl6929CxkExQIDAQABAoIBAQCZjCUI7NFwwxQc -m1UAogeglMJZJHUu+9SoUD8Sg34grvdbyqueBm1iMOkiclaOKU1W3b4eRNNmAwRy -nEnW4km+4hX48m5PnHHijYnIIFsd0YjeT+Pf9qtdXFvGjeWq6oIjjM3dAnD50LKu -KsCB2oCHQoqjXNQfftJGvt2C1oI2/WvdOR4prnGXElVfASswX4PkP5LCfLhIx+Fr -7ErfaRIKigLSaAWLKaw3IlL12Q/KkuGcnzYIzIRwY4VJ64ENN6M3+KknfGovQItL -sCxceSe61THDP9AAI3Mequm8z3H0CImOWhJCge5l7ttLLMXZXqGxDCVx+3zvqlCa -X0cgGSVBAoGBAOvTN3oJJx1vnh1mRj8+hqzFq1bjm4T/Wp314QWLeo++43II4uMM -5hxUlO5ViY1sKxQrGwK+9c9ddxAvm5OAFFkzgW9EhDCu0tXUb2/vAJQ93SgqbcRu -coXWJpk0eNW/ouk2s1X8dzs+sCs3a4H64fEEj8yhwoyovjfucspsn7t1AoGBAOE2 -ayLKx7CcWCiD/VGNvP7714MDst2isyq8reg8LEMmAaXR2IWWj5eGwKrImTQCsrjW -P37aBp1lcWuuYRKl/WEGBy6JLNdATyUoYc1Yo+8YdenekkOtOHHJerlK3OKi3ZVp -q4HJY9wzKg/wYLcbTmjjzKj+OBIZWwig73XUHwoRAoGBAJnuIrYbp1aFdvXFvnCl -xY6c8DwlEWx8qY+V4S2XX4bYmOnkdwSxdLplU1lGqCSRyIS/pj/imdyjK4Z7LNfY -sG+RORmB5a9JTgGZSqwLm5snzmXbXA7t8P7/S+6Q25baIeKMe/7SbplTT/bFk/0h -371MtvhhVfYuZwtnL7KFuLXJAoGBAMQ3UHKYsBC8tsZd8Pf8AL07mFHKiC04Etfa -Wb5rpri+RVM+mGITgnmnavehHHHHJAWMjPetZ3P8rSv/Ww4PVsoQoXM3Cr1jh1E9 -dLCfWPz4l8syIscaBYKF4wnLItXGxj3mOgoy93EjlrMaYHlILjGOv4JBM4L5WmoT -JW7IaF6xAoGAZ4K8MwU/cAah8VinMmLGxvWWuBSgTTebuY5zN603MvFLKv5necuc -BZfTTxD+gOnxRT6QAh++tOsbBmsgR9HmTSlQSSgw1L7cwGyXzLCDYw+5K/03KXSU -DaFdgtfcDDJO8WtjOgjyTRzEAOsqFta1ige4pIu5fTilNVMQlhts5Iw= ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/malevolent.bats b/vendor/github.com/docker/distribution/contrib/docker-integration/malevolent.bats deleted file mode 100644 index 0112ff6f1..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/malevolent.bats +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env bats - -# This tests various expected error scenarios when pulling bad content - -load helpers - -host="localregistry:6666" -base="malevolent-test" - -function setup() { - tempImage $base:latest -} - -@test "Test malevolent proxy pass through" { - docker_t tag -f $base:latest $host/$base/nochange:latest - run docker_t push $host/$base/nochange:latest - echo $output - [ "$status" -eq 0 ] - has_digest "$output" - - run docker_t pull $host/$base/nochange:latest - echo "$output" - [ "$status" -eq 0 ] -} - -@test "Test malevolent image name change" { - imagename="$host/$base/rename" - image="$imagename:lastest" - docker_t tag -f $base:latest $image - run docker_t push $image - [ "$status" -eq 0 ] - has_digest "$output" - - # Pull attempt should fail to verify manifest digest - run docker_t pull "$imagename@$digest" - echo "$output" - [ "$status" -ne 0 ] -} - -@test "Test malevolent altered layer" { - image="$host/$base/addfile:latest" - tempImage $image - run docker_t push $image - echo "$output" - [ "$status" -eq 0 ] - has_digest "$output" - - # Remove image to ensure layer is pulled and digest verified - docker_t rmi -f $image - - run docker_t pull $image - echo "$output" - [ "$status" -ne 0 ] -} - -@test "Test malevolent altered layer (by digest)" { - imagename="$host/$base/addfile" - image="$imagename:latest" - tempImage $image - run docker_t push $image - echo "$output" - [ "$status" -eq 0 ] - has_digest "$output" - - # Remove image to ensure layer is pulled and digest verified - docker_t rmi -f $image - - run docker_t pull "$imagename@$digest" - echo "$output" - [ "$status" -ne 0 ] -} - -@test "Test malevolent poisoned images" { - truncid="777cf9284131" - poison="${truncid}d77ca0863fb7f054c0a276d7e227b5e9a5d62b497979a481fa32" - image1="$host/$base/image1/poison:$poison" - tempImage $image1 - run docker_t push $image1 - echo "$output" - [ "$status" -eq 0 ] - has_digest "$output" - - image2="$host/$base/image2/poison:$poison" - tempImage $image2 - run docker_t push $image2 - echo "$output" - [ "$status" -eq 0 ] - has_digest "$output" - - - # Remove image to ensure layer is pulled and digest verified - docker_t rmi -f $image1 - docker_t rmi -f $image2 - - run docker_t pull $image1 - echo "$output" - [ "$status" -eq 0 ] - run docker_t pull $image2 - echo "$output" - [ "$status" -eq 0 ] - - # Test if there are multiple images - run docker_t images - echo "$output" - [ "$status" -eq 0 ] - - # Test images have same ID and not the poison - id1=$(docker_t inspect --format="{{.Id}}" $image1) - id2=$(docker_t inspect --format="{{.Id}}" $image2) - - # Remove old images - docker_t rmi -f $image1 - docker_t rmi -f $image2 - - [ "$id1" != "$id2" ] - - [ "$id1" != "$truncid" ] - - [ "$id2" != "$truncid" ] -} - -@test "Test malevolent altered identical images" { - truncid1="777cf9284131" - poison1="${truncid1}d77ca0863fb7f054c0a276d7e227b5e9a5d62b497979a481fa32" - truncid2="888cf9284131" - poison2="${truncid2}d77ca0863fb7f054c0a276d7e227b5e9a5d62b497979a481fa64" - - image1="$host/$base/image1/alteredid:$poison1" - tempImage $image1 - run docker_t push $image1 - echo "$output" - [ "$status" -eq 0 ] - has_digest "$output" - - image2="$host/$base/image2/alteredid:$poison2" - docker_t tag -f $image1 $image2 - run docker_t push $image2 - echo "$output" - [ "$status" -eq 0 ] - has_digest "$output" - - - # Remove image to ensure layer is pulled and digest verified - docker_t rmi -f $image1 - docker_t rmi -f $image2 - - run docker_t pull $image1 - echo "$output" - [ "$status" -eq 0 ] - run docker_t pull $image2 - echo "$output" - [ "$status" -eq 0 ] - - # Test if there are multiple images - run docker_t images - echo "$output" - [ "$status" -eq 0 ] - - # Test images have same ID and not the poison - id1=$(docker_t inspect --format="{{.Id}}" $image1) - id2=$(docker_t inspect --format="{{.Id}}" $image2) - - # Remove old images - docker_t rmi -f $image1 - docker_t rmi -f $image2 - - [ "$id1" == "$id2" ] - - [ "$id1" != "$truncid1" ] - - [ "$id2" != "$truncid2" ] -} - -@test "Test malevolent resumeable pull" { - version_check docker "$GOLEM_DIND_VERSION" "1.11.0" - version_check registry "$GOLEM_DISTRIBUTION_VERSION" "2.3.0" - - imagename="$host/$base/resumeable" - image="$imagename:latest" - tempImage $image - run docker_t push $image - echo "$output" - [ "$status" -eq 0 ] - has_digest "$output" - - # Remove image to ensure layer is pulled and digest verified - docker_t rmi -f $image - - run docker_t pull "$imagename@$digest" - echo "$output" - [ "$status" -eq 0 ] -} diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/Dockerfile b/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/Dockerfile deleted file mode 100644 index 17f999d24..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM nginx:1.9 - -COPY nginx.conf /etc/nginx/nginx.conf -COPY registry.conf /etc/nginx/conf.d/registry.conf -COPY docker-registry-v2.conf /etc/nginx/docker-registry-v2.conf -COPY registry-noauth.conf /etc/nginx/registry-noauth.conf -COPY registry-basic.conf /etc/nginx/registry-basic.conf -COPY test.passwd /etc/nginx/test.passwd -COPY ssl /etc/nginx/ssl -COPY v1 /var/www/html/v1 diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/docker-registry-v2.conf b/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/docker-registry-v2.conf deleted file mode 100644 index 65c4d7766..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/docker-registry-v2.conf +++ /dev/null @@ -1,6 +0,0 @@ -proxy_pass http://docker-registry-v2; -proxy_set_header Host $http_host; # required for docker client's sake -proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP -proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; -proxy_set_header X-Forwarded-Proto $scheme; -proxy_read_timeout 900; diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/nginx.conf b/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/nginx.conf deleted file mode 100644 index 543eab69e..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/nginx.conf +++ /dev/null @@ -1,61 +0,0 @@ -user nginx; -worker_processes 1; - -error_log /var/log/nginx/error.log warn; -pid /var/run/nginx.pid; - -events { - worker_connections 1024; -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - - keepalive_timeout 65; - - include /etc/nginx/conf.d/*.conf; -} - -# Setup TCP proxies -stream { - # Malevolent proxy - server { - listen 6666; - proxy_pass malevolent:6666; - } - - # Registry configured for token server - server { - listen 5554; - listen 5555; - proxy_pass registryv2token:5000; - } - - # Token server - server { - listen 5556; - proxy_pass tokenserver:5556; - } - - # Registry configured for token server with oauth - server { - listen 5557; - listen 5558; - proxy_pass registryv2tokenoauth:5000; - } - - # Token server with oauth - server { - listen 5559; - proxy_pass tokenserveroauth:5559; - } -} diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry-basic.conf b/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry-basic.conf deleted file mode 100644 index 117ea5849..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry-basic.conf +++ /dev/null @@ -1,8 +0,0 @@ -client_max_body_size 0; -chunked_transfer_encoding on; -location /v2/ { - auth_basic "registry.localhost"; - auth_basic_user_file test.passwd; - add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always; - include docker-registry-v2.conf; -} diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry-noauth.conf b/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry-noauth.conf deleted file mode 100644 index 6e182d446..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry-noauth.conf +++ /dev/null @@ -1,5 +0,0 @@ -client_max_body_size 0; -chunked_transfer_encoding on; -location /v2/ { - include docker-registry-v2.conf; -} diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry.conf b/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry.conf deleted file mode 100644 index e693d569a..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/registry.conf +++ /dev/null @@ -1,260 +0,0 @@ -# Docker registry proxy for api version 2 - -upstream docker-registry-v2 { - server registryv2:5000; -} - -# No client auth or TLS -server { - listen 5000; - server_name localhost; - - # disable any limits to avoid HTTP 413 for large image uploads - client_max_body_size 0; - - # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486) - chunked_transfer_encoding on; - - location /v2/ { - # Do not allow connections from docker 1.5 and earlier - # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents - if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) { - return 404; - } - - include docker-registry-v2.conf; - } -} - -# No client auth or TLS (V2 Only) -server { - listen 5002; - server_name localhost; - - # disable any limits to avoid HTTP 413 for large image uploads - client_max_body_size 0; - - # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486) - chunked_transfer_encoding on; - - location / { - include docker-registry-v2.conf; - } -} - -# TLS Configuration chart -# Username/Password: testuser/passpassword -# | ca | client | basic | notes -# 5440 | yes | no | no | Tests CA certificate -# 5441 | yes | no | yes | Tests basic auth over TLS -# 5442 | yes | yes | no | Tests client auth with client CA -# 5443 | yes | yes | no | Tests client auth without client CA -# 5444 | yes | yes | yes | Tests using basic auth + tls auth -# 5445 | no | no | no | Tests insecure using TLS -# 5446 | no | no | yes | Tests sending credentials to server with insecure TLS -# 5447 | no | yes | no | Tests client auth to insecure -# 5448 | yes | no | no | Bad SSL version - -server { - listen 5440; - server_name localhost; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-ca+localhost-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-ca+localhost-key.pem; - include registry-noauth.conf; -} - -server { - listen 5441; - server_name localhost; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-ca+localhost-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-ca+localhost-key.pem; - include registry-basic.conf; -} - -server { - listen 5442; - listen 5443; - server_name localhost; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-ca+localhost-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-ca+localhost-key.pem; - ssl_client_certificate /etc/nginx/ssl/registry-ca+ca.pem; - ssl_verify_client on; - include registry-noauth.conf; -} - -server { - listen 5444; - server_name localhost; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-ca+localhost-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-ca+localhost-key.pem; - ssl_client_certificate /etc/nginx/ssl/registry-ca+ca.pem; - ssl_verify_client on; - include registry-basic.conf; -} - -server { - listen 5445; - server_name localhost; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-noca+localhost-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-noca+localhost-key.pem; - include registry-noauth.conf; -} - -server { - listen 5446; - server_name localhost; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-noca+localhost-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-noca+localhost-key.pem; - include registry-basic.conf; -} - -server { - listen 5447; - server_name localhost; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-noca+localhost-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-noca+localhost-key.pem; - ssl_client_certificate /etc/nginx/ssl/registry-ca+ca.pem; - ssl_verify_client on; - include registry-noauth.conf; -} - -server { - listen 5448; - server_name localhost; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-ca+localhost-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-ca+localhost-key.pem; - ssl_protocols SSLv3; - include registry-noauth.conf; -} - -# Add configuration for localregistry server_name -# Requires configuring /etc/hosts to use -# Set /etc/hosts entry to external IP, not 127.0.0.1 for testing -# Docker secure/insecure registry features -server { - listen 5440; - server_name localregistry; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-ca+localregistry-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-ca+localregistry-key.pem; - include registry-noauth.conf; -} - -server { - listen 5441; - server_name localregistry; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-ca+localregistry-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-ca+localregistry-key.pem; - include registry-basic.conf; -} - -server { - listen 5442; - listen 5443; - server_name localregistry; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-ca+localregistry-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-ca+localregistry-key.pem; - ssl_client_certificate /etc/nginx/ssl/registry-ca+ca.pem; - ssl_verify_client on; - include registry-noauth.conf; -} - -server { - listen 5444; - server_name localregistry; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-ca+localregistry-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-ca+localregistry-key.pem; - ssl_client_certificate /etc/nginx/ssl/registry-ca+ca.pem; - ssl_verify_client on; - include registry-basic.conf; -} - -server { - listen 5445; - server_name localregistry; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-noca+localregistry-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-noca+localregistry-key.pem; - include registry-noauth.conf; -} - -server { - listen 5446; - server_name localregistry; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-noca+localregistry-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-noca+localregistry-key.pem; - include registry-basic.conf; -} - -server { - listen 5447; - server_name localregistry; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-noca+localregistry-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-noca+localregistry-key.pem; - ssl_client_certificate /etc/nginx/ssl/registry-ca+ca.pem; - ssl_verify_client on; - include registry-noauth.conf; -} - -server { - listen 5448; - server_name localregistry; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-ca+localregistry-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-ca+localregistry-key.pem; - ssl_protocols SSLv3; - include registry-noauth.conf; -} - - -# V1 search test -# Registry configured with token auth and no tls -# TLS termination done by nginx, search results -# served by nginx - -upstream docker-registry-v2-oauth { - server registryv2tokenoauthnotls:5000; -} - -server { - listen 5600; - server_name localregistry; - ssl on; - ssl_certificate /etc/nginx/ssl/registry-ca+localregistry-cert.pem; - ssl_certificate_key /etc/nginx/ssl/registry-ca+localregistry-key.pem; - - root /var/www/html; - - client_max_body_size 0; - chunked_transfer_encoding on; - location /v2/ { - proxy_buffering off; - proxy_pass http://docker-registry-v2-oauth; - proxy_set_header Host $http_host; # required for docker client's sake - proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_read_timeout 900; - } - - location /v1/search { - if ($http_authorization !~ "Bearer [a-zA-Z0-9\._-]+") { - return 401; - } - try_files /v1/search.json =404; - add_header Content-Type application/json; - } -} diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/test.passwd b/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/test.passwd deleted file mode 100644 index 4e55de816..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/test.passwd +++ /dev/null @@ -1 +0,0 @@ -testuser:$apr1$YmLhHjm6$AjP4z8J1WgcUNxU8J4ue5. diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/v1/search.json b/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/v1/search.json deleted file mode 100644 index 3da8f1adb..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/nginx/v1/search.json +++ /dev/null @@ -1 +0,0 @@ -{"num_pages":1,"num_results":2,"page":1,"page_size": 25,"query":"testsearch","results":[{"description":"","is_automated":false,"is_official":false,"is_trusted":false, "name":"dmcgowan/testsearch-1","star_count":1000},{"description":"Some automated build","is_automated":true,"is_official":false,"is_trusted":false,"name":"dmcgowan/testsearch-2","star_count":10}]} diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/run_multiversion.sh b/vendor/github.com/docker/distribution/contrib/docker-integration/run_multiversion.sh deleted file mode 100755 index b673d3114..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/run_multiversion.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env bash - -# Run the integration tests with multiple versions of the Docker engine - -set -e -set -x - -DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) - - -if [ "$TMPDIR" != "" ] && [ ! -d "$TMPDIR" ]; then - mkdir -p $TMPDIR -fi - -cachedir=`mktemp -t -d golem-cache.XXXXXX` -trap "rm -rf $cachedir" EXIT - -if [ "$1" == "-d" ]; then - # Drivers to use for Docker engines the tests are going to create. - STORAGE_DRIVER=${STORAGE_DRIVER:-overlay} - - docker daemon --log-level=panic --storage-driver="$STORAGE_DRIVER" & - DOCKER_PID=$! - - # Wait for it to become reachable. - tries=10 - until docker version &> /dev/null; do - (( tries-- )) - if [ $tries -le 0 ]; then - echo >&2 "error: daemon failed to start" - exit 1 - fi - sleep 1 - done - - trap "kill $DOCKER_PID" EXIT -fi - -distimage=$(docker build -q $DIR/../..) -fullversion=$(git describe --match 'v[0-9]*' --dirty='.m' --always) -distversion=${fullversion:1} - -echo "Testing image $distimage with distribution version $distversion" - -# Pull needed images before invoking golem to get pull time -# These images are defined in golem.conf -time docker pull nginx:1.9 -time docker pull golang:1.6 -time docker pull registry:0.9.1 -time docker pull dmcgowan/token-server:simple -time docker pull dmcgowan/token-server:oauth -time docker pull distribution/golem-runner:0.1-bats - -time docker pull docker:1.9.1-dind -time docker pull docker:1.10.3-dind -time docker pull docker:1.11.1-dind - -golem -cache $cachedir \ - -i "golem-distribution:latest,$distimage,$distversion" \ - -i "golem-dind:latest,docker:1.9.1-dind,1.9.1" \ - -i "golem-dind:latest,docker:1.10.3-dind,1.10.3" \ - -i "golem-dind:latest,docker:1.11.1-dind,1.11.1" \ - $DIR - diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tls.bats b/vendor/github.com/docker/distribution/contrib/docker-integration/tls.bats deleted file mode 100644 index 46f85e398..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tls.bats +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env bats - -# Registry host name, should be set to non-localhost address and match -# DNS name in nginx/ssl certificates and what is installed in /etc/docker/cert.d - -load helpers - -hostname="localregistry" -base="hello-world" -image="${base}:latest" - -# Login information, should match values in nginx/test.passwd -user=${TEST_USER:-"testuser"} -password=${TEST_PASSWORD:-"passpassword"} -email="distribution@docker.com" - -function setup() { - tempImage $image -} - -@test "Test valid certificates" { - docker_t tag -f $image $hostname:5440/$image - run docker_t push $hostname:5440/$image - [ "$status" -eq 0 ] - has_digest "$output" -} - -@test "Test basic auth" { - basic_auth_version_check - login $hostname:5441 - docker_t tag -f $image $hostname:5441/$image - run docker_t push $hostname:5441/$image - [ "$status" -eq 0 ] - has_digest "$output" -} - -@test "Test basic auth with build" { - basic_auth_version_check - login $hostname:5441 - - image1=$hostname:5441/$image-build - image2=$hostname:5441/$image-build-2 - - tempImage $image1 - - run docker_t push $image1 - [ "$status" -eq 0 ] - has_digest "$output" - - docker_t rmi $image1 - - run build $image2 $image1 - echo $output - [ "$status" -eq 0 ] - - run docker_t push $image2 - echo $output - [ "$status" -eq 0 ] - has_digest "$output" -} - -@test "Test TLS client auth" { - docker_t tag -f $image $hostname:5442/$image - run docker_t push $hostname:5442/$image - [ "$status" -eq 0 ] - has_digest "$output" -} - -@test "Test TLS client with invalid certificate authority fails" { - docker_t tag -f $image $hostname:5443/$image - run docker_t push $hostname:5443/$image - [ "$status" -ne 0 ] -} - -@test "Test basic auth with TLS client auth" { - basic_auth_version_check - login $hostname:5444 - docker_t tag -f $image $hostname:5444/$image - run docker_t push $hostname:5444/$image - [ "$status" -eq 0 ] - has_digest "$output" -} - -@test "Test unknown certificate authority fails" { - docker_t tag -f $image $hostname:5445/$image - run docker_t push $hostname:5445/$image - [ "$status" -ne 0 ] -} - -@test "Test basic auth with unknown certificate authority fails" { - run login $hostname:5446 - [ "$status" -ne 0 ] - docker_t tag -f $image $hostname:5446/$image - run docker_t push $hostname:5446/$image - [ "$status" -ne 0 ] -} - -@test "Test TLS client auth to server with unknown certificate authority fails" { - docker_t tag -f $image $hostname:5447/$image - run docker_t push $hostname:5447/$image - [ "$status" -ne 0 ] -} - -@test "Test failure to connect to server fails to fallback to SSLv3" { - docker_t tag -f $image $hostname:5448/$image - run docker_t push $hostname:5448/$image - [ "$status" -ne 0 ] -} - diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/token.bats b/vendor/github.com/docker/distribution/contrib/docker-integration/token.bats deleted file mode 100644 index 256885a22..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/token.bats +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/env bats - -# This tests contacting a registry using a token server - -load helpers - -user="testuser" -password="testpassword" -email="a@nowhere.com" -base="hello-world" - -@test "Test token server login" { - run docker_t login -u $user -p $password -e $email localregistry:5554 - echo $output - [ "$status" -eq 0 ] - - # First line is WARNING about credential save or email deprecation - [ "${lines[2]}" = "Login Succeeded" -o "${lines[1]}" = "Login Succeeded" ] -} - -@test "Test token server bad login" { - run docker_t login -u "testuser" -p "badpassword" -e $email localregistry:5554 - [ "$status" -ne 0 ] - - run docker_t login -u "baduser" -p "testpassword" -e $email localregistry:5554 - [ "$status" -ne 0 ] -} - -@test "Test push and pull with token auth" { - login localregistry:5555 - image="localregistry:5555/testuser/token" - build $image "$base:latest" - - run docker_t push $image - echo $output - [ "$status" -eq 0 ] - - docker_t rmi $image - - docker_t pull $image -} - -@test "Test push and pull with token auth wrong namespace" { - login localregistry:5555 - image="localregistry:5555/notuser/token" - build $image "$base:latest" - - run docker_t push $image - [ "$status" -ne 0 ] -} - -@test "Test oauth token server login" { - version_check docker "$GOLEM_DIND_VERSION" "1.11.0" - - login_oauth localregistry:5557 -} - -@test "Test oauth token server bad login" { - version_check docker "$GOLEM_DIND_VERSION" "1.11.0" - - run docker_t login -u "testuser" -p "badpassword" -e $email localregistry:5557 - [ "$status" -ne 0 ] - - run docker_t login -u "baduser" -p "testpassword" -e $email localregistry:5557 - [ "$status" -ne 0 ] -} - -@test "Test oauth push and pull with token auth" { - version_check docker "$GOLEM_DIND_VERSION" "1.11.0" - - login_oauth localregistry:5558 - image="localregistry:5558/testuser/token" - build $image "$base:latest" - - run docker_t push $image - echo $output - [ "$status" -eq 0 ] - - docker_t rmi $image - - docker_t pull $image -} - -@test "Test oauth push and build with token auth" { - version_check docker "$GOLEM_DIND_VERSION" "1.11.0" - - login_oauth localregistry:5558 - image="localregistry:5558/testuser/token-build" - tempImage $image - - run docker_t push $image - echo $output - [ "$status" -eq 0 ] - has_digest "$output" - - docker_t rmi $image - - image2="localregistry:5558/testuser/token-build-2" - run build $image2 $image - echo $output - [ "$status" -eq 0 ] - - run docker_t push $image2 - echo $output - [ "$status" -eq 0 ] - has_digest "$output" - -} - -@test "Test oauth push and pull with token auth wrong namespace" { - version_check docker "$GOLEM_DIND_VERSION" "1.11.0" - - login_oauth localregistry:5558 - image="localregistry:5558/notuser/token" - build $image "$base:latest" - - run docker_t push $image - [ "$status" -ne 0 ] -} - -@test "Test oauth with v1 search" { - version_check docker "$GOLEM_DIND_VERSION" "1.12.0" - - run docker_t search localregistry:5600/testsearch - [ "$status" -ne 0 ] - - login_oauth localregistry:5600 - - run docker_t search localregistry:5600/testsearch - echo $output - [ "$status" -eq 0 ] - - echo $output | grep "testsearch-1" - echo $output | grep "testsearch-2" -} diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/.htpasswd b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/.htpasswd deleted file mode 100644 index 0bbf57400..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/.htpasswd +++ /dev/null @@ -1 +0,0 @@ -testuser:$2y$05$T2MlBvkN1R/yICNnLuf1leOlOfAY0DvybctbbWUFKlojfkShVgn4m diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/Dockerfile b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/Dockerfile deleted file mode 100644 index d8c7b5cc0..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM dmcgowan/token-server:oauth - -WORKDIR / - -COPY ./.htpasswd /.htpasswd -COPY ./certs/auth.localregistry.cert /tls.cert -COPY ./certs/auth.localregistry.key /tls.key -COPY ./certs/signing.key /sign.key diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/auth.localregistry.cert b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/auth.localregistry.cert deleted file mode 100644 index 4144ca168..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/auth.localregistry.cert +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDHDCCAgagAwIBAgIRAKhhQMnqZx+hkOmoUYgPb+kwCwYJKoZIhvcNAQELMCYx -ETAPBgNVBAoTCFF1aWNrVExTMREwDwYDVQQDEwhRdWlja1RMUzAeFw0xNjAxMjgw -MDQyMzFaFw0xOTAxMTIwMDQyMzFaMDAxETAPBgNVBAoTCFF1aWNrVExTMRswGQYD -VQQDExJhdXRoLmxvY2FscmVnaXN0cnkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQD1tUf1EghBlIRrE83yF4zDgRu7vH2Jo0kygKJUWtQQe+DfXyjjE/fg -FdKnnoEjsIeF9hxNbTt0ldDz7/n97pbMhoiXULi9iq4jlgSzVL2XEAgrON0YSY/c -Lmmd1KSa/pOUZr2WMAYPZ+FdQfE1W7SMNbErPefBqYdFzpZ+esAtvbajYwIjl8Vy -9c4bidx4vgnNrR9GcFYibjC5sj8syh/OtbzzqiVGT8YcPpmMG6KNRkausa4gqpon -NKYG8C3WDaiPCLYKcvFrFfdEWF/m2oj14eXACXT9iwp8r4bsLgXrZwqcpKOWfVRu -qHC8aV476EYgxWCAOANExUdUaRt5wL/jAgMBAAGjPzA9MA4GA1UdDwEB/wQEAwIA -oDAMBgNVHRMBAf8EAjAAMB0GA1UdEQQWMBSCEmF1dGgubG9jYWxyZWdpc3RyeTAL -BgkqhkiG9w0BAQsDggEBABxPGK9FdGDxcLowNsExKnnZvmQT3H0u+Dux1gkp0AhH -KOrmx3LUENUKLSgotzx133tgOgR5lzAWVFy7bhLwlPhOslxf2oEfztsAMd/tY8rW -PrG2ZqYqlzEQQ9INbAc3woo5A3slN07uhP3F16jNqoMM4zRmw6Ba70CluGKT7x5+ -xVjKoWITLjWDXT5m35PnsN8CpBaFzXYcod/5p9XwCFp0s+aNxfpZECCV/3yqIr+J -ALzroPh43FAlG96o4NyYZ2Msp63newN19R2+TgpV4nXuw2mLVDpvetP7RRqnpvj/ -qwRgt5j4hFjJWb61M0ELL7A9fA71h1ImdGCvnArdBQs= ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/auth.localregistry.key b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/auth.localregistry.key deleted file mode 100644 index 4c499bb21..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/auth.localregistry.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA9bVH9RIIQZSEaxPN8heMw4Ebu7x9iaNJMoCiVFrUEHvg318o -4xP34BXSp56BI7CHhfYcTW07dJXQ8+/5/e6WzIaIl1C4vYquI5YEs1S9lxAIKzjd -GEmP3C5pndSkmv6TlGa9ljAGD2fhXUHxNVu0jDWxKz3nwamHRc6WfnrALb22o2MC -I5fFcvXOG4nceL4Jza0fRnBWIm4wubI/LMofzrW886olRk/GHD6ZjBuijUZGrrGu -IKqaJzSmBvAt1g2ojwi2CnLxaxX3RFhf5tqI9eHlwAl0/YsKfK+G7C4F62cKnKSj -ln1UbqhwvGleO+hGIMVggDgDRMVHVGkbecC/4wIDAQABAoIBAQCrsjXKRwOF8CZo -PLqZBWPT6hBbK+f9miC4LbNBhwbRTf9hl7mWlImOCTHe95/+NIk/Ty+P21jEqzwM -ehETJPoziX9BXaL6sEHnlBlMx1aEjStoKKA3LJBeqAAdzk4IEQVHmlO4824IreqJ -pF7Njnunzo0zTlr4tWJVoXsAfv5z9tNtdkxYBbIa0fjfGtlqXU3gLq58FCON3mB/ -NGc0AyA1UFGp0FzpdEcwTGD4InsXbcmsl2l/VPBJuZbryITRqWs6BbK++80DRhNt -afMhP+IzKrWSCp0rBYrqqz6AevtlKdEfQK1yXPEjN/63QLMevt8mF/1JCp//TQnf -Z6bIQbAhAoGBAP7vFA0PcvoXt9MXvvAwrKY1s6pNw4nWPG27qY1/m+DkBwP8IQms -4AWGv1wscZzXJYTvaLO5/qjmGUj50ohcVEvyZJioh1pKXA8Chxvd6rBA/O/Lj5E0 -3MOSA5Q0gxJ0Mhv0zGbbyN5fY8D8zhxoqQP4LoW+UdZG2Oi6JxsQ9c9dAoGBAPa8 -U3bGuM5OGA9EWP7mkB/VnjDTL1aEIN3cOHbHIKwH/loxdYcNMBE7vwxV1CzgIzXT -wsL0iE15fQdK938u0+um8aH5QtbWNI8tdk1XVjEC/i3C7N6WVUutneCKUDb4QxiB -9OvWCbNNiN+xTKBBM93YlwO3GYfrW9Pmm9q1+hg/AoGBALJlUS22gun50PxaIJZq -KVcCO2DQnCYHki/j48mN4+HjD/m85M2lePrFCYIR48syTyIQer9SR5+frVAA6k/b -9G1VCQo+3MDVSkiCp1Nb3tBKGfYgB65ARMBinDiI6rPuNeaUTrkn0g+yxtaU0hLV -Nnj9omia/x+oYj+xjI4HN0xNAoGARy92dSJIV104m88ATip/EnAzP6ruUWu1f8z1 -jW9OAdQckjEK03f+kjpGmGx61qekAPejjVO3r4KJi/0ZAtyjz61OsYiUvB748wYO -x6mW+HUAmHtQk7eTzE2+6vV8xx9BXGTCIPiTu+N2xfMFRIcLS8odZ7j/6LMCv1Qd -SzCNg0kCgYBaNlEs4pK1VxZZpEWwVmFpgIxfEfxLIaGrek6wBTcCn/VA2M0oHuez -mlMio8VY0yWPBJz30JflDiTmYIvteLPMHT0N0J6isiXLhzJSFI4+cAMLE2Q5v8rz -W+W5/L8YZeierW0qJat1BrgStaf5ZLpiOc9pKBSwycydPH5BfVdK/A== ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/localregistry.cert b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/localregistry.cert deleted file mode 100644 index 105acc4f3..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/localregistry.cert +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDETCCAfugAwIBAgIQN7rT95eAy75c4n6/AsDJODALBgkqhkiG9w0BAQswJjER -MA8GA1UEChMIUXVpY2tUTFMxETAPBgNVBAMTCFF1aWNrVExTMB4XDTE2MDEyODAw -NDIzMloXDTE5MDExMjAwNDIzMlowKzERMA8GA1UEChMIUXVpY2tUTFMxFjAUBgNV -BAMTDWxvY2FscmVnaXN0cnkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDLi75QEkl/qekcoOJlNv9y1IXvrbU2ssl4ViJiZRjWx+/CkyCCOyf9YUpAgRLr -Pskqde2mwhuNP8yBlOBb17Sapz7N3+hJi5j9vLBAFcamPeF3PqxjFv7j5TKkRmSI -dFYQclREwMUd3qEH322KkqOnsEEfdmCgFqWORe+QR5AxzxQP3Pnd4OYH1yZCh0MQ -P2pJgrxxf2I5I/m1AUgoHV1cdBbCv9LGohJPpMtwPC0dJpgMFcnf6hT37At236AY -V437HiRruY7iPWkYFrSPWpwdslJ32MZvRN5RS163jZXjiZ7qWnQOiiDJfXe4evB/ -yQLN4m0qVQxsMz7rkY7OsqaXAgMBAAGjOjA4MA4GA1UdDwEB/wQEAwIAoDAMBgNV -HRMBAf8EAjAAMBgGA1UdEQQRMA+CDWxvY2FscmVnaXN0cnkwCwYJKoZIhvcNAQEL -A4IBAQAyUb3EuMaOylBeV8+4KeBiE4lxykDOwLLSk3jXRsVVtfJpX3v8l5vwo/Jf -iG8tzzz+7uiskI96u3TsekUtVkUxujfKevMP+369K/59s7NRmwwlFMyB2fvL14B2 -oweVjWvM/8fZl6irtFdbJFXXRm7paKso5cmfImxhojAwohgcd4XTVLE/7juYa582 -AaBdRuIiyL71MU9qa1mC5+57AaSLPYaPKpahemgYYkV1Z403Kd6rXchxdQ8JIAL8 -+0oYTSC+svnz1tUU/V5E5id9LQaTmDN5iIVFhNpqAaZmR45UI86woWvnkMb8Ants -4aknwTwY3300PuTqBdQufvOFDRN5 ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/localregistry.key b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/localregistry.key deleted file mode 100644 index cb69a0f3e..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/localregistry.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAy4u+UBJJf6npHKDiZTb/ctSF7621NrLJeFYiYmUY1sfvwpMg -gjsn/WFKQIES6z7JKnXtpsIbjT/MgZTgW9e0mqc+zd/oSYuY/bywQBXGpj3hdz6s -Yxb+4+UypEZkiHRWEHJURMDFHd6hB99tipKjp7BBH3ZgoBaljkXvkEeQMc8UD9z5 -3eDmB9cmQodDED9qSYK8cX9iOSP5tQFIKB1dXHQWwr/SxqIST6TLcDwtHSaYDBXJ -3+oU9+wLdt+gGFeN+x4ka7mO4j1pGBa0j1qcHbJSd9jGb0TeUUtet42V44me6lp0 -DoogyX13uHrwf8kCzeJtKlUMbDM+65GOzrKmlwIDAQABAoIBAF6vFMp+lz4RteSh -Wm8m1FGAVwWVUpStOlcGClynFpTi0L88XYT3K7UMStQSttBDlqRv0ysdZF+ia+lj -bbKLdvHyFp8CJzX/AB4YZgyJlKzEYFtuBhbaHZu5hIMyU5W+OELSTCznV0p7w4C8 -CGLLr+FTdhfCo1QU9NJn6fa9s2/XRdSClBBalAHYs0ZS7ZckaF/sPiC/VapfBMet -qjJXNYiO6pXYriGWKF9zdAMfk2CM0BVWbnwQZkMSEQirrTcJwm3ezyloXCv2nywK -/VzbUT1HJVyzo5oAwTd0MwDc2oEMiFzlfO028zY4LDltpia+SyWvFi5NaIqzFESc -yLgJacECgYEA3jvH+ZQHQf42Md8TCciokaYvwWIKJdk4WRjbvE5cBZekyXAm7/3b -/1VFDKsy2RPlfmfHP3wy9rlnjzsRveB5qaclgS8aI67AYsWd/yRgfRatl7Ve9bHl -LY6VM5L/DZTxykcqivwjc77XoDuBfUKs6tyuSLQku+FOTbLtNYlUCHECgYEA6nkR -lkXufyLmDhNb3093RsYvPcs1kGaIIGTnz3cxWNh485DgsyLBuYQ5ugupQkzM8YSt -ohDTmVpggqjlXQxCg0Zw8gkEV0v8KsLGjn1CuTJg/mBArXlelq1FEeRAYC9/YfOz -ocXegHV7wDKKtcraNZFsEc7Z0LwbC9wtzSFG44cCgYASkMX1CLPOhJE8e1lY0OWc -PVjx++HDJbF6aAQ7aARyBygiF/d4xylw3EvHcinuTqY2eC8CE7siN3z6T0H9Ldqc -HLWaZDf30SqLVd0MKprQ+GsKKIHFXtY5hxbZ1ybtmIrWjjl0oPnJOqFC5pW7xC0z -9bmtozcKZxkmjpMYjN9zUQKBgQCqV6KLRerqunPgLfhE1/qTlE+l2QflDFhBEI3I -j5NuNHZKnSphehK7sHAv1WD2Jc2OeRGb+BWCB8Ktqf5YBxwbOwW7EQnyUeW1OyP9 -SMs8uHj21P6oCNDLLr5LLUQHnPoyM1aBZLstICzziMR1JhY5bJjSpzBfEQmlKCSu -LkrN6QKBgQCRXrBJRUxeJj7wCnCSq0Clf9NhCpQnwo4bEx8sKlj8K8ku8MvwQwoM -3KfWc7bOl6A2/mM/k4yoHtBMM9X9xqYtsgeFhxuiWBcfTmTxWh73LQ48Kgbrgodt -6yTccnjr7OtBidD85c6lgjAUgcL43QY8mlw0OhzXAZ2R5HWFp4ht+w== ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/signing.cert b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/signing.cert deleted file mode 100644 index 45166f2d8..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/signing.cert +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC9TCCAd+gAwIBAgIRAJ6IIisIZxL86oe3oeoAgWUwCwYJKoZIhvcNAQELMCYx -ETAPBgNVBAoTCFF1aWNrVExTMREwDwYDVQQDEwhRdWlja1RMUzAeFw0xNjAxMjgw -MDQyMzNaFw0xOTAxMTIwMDQyMzNaMBMxETAPBgNVBAoTCFF1aWNrVExTMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3IXUwqSdO2QTj2ET6fJPGe+KWVnt -QCQQWjkWVpOz8L2A29BRvv9z6lYNf9sOM0Xb5IUAgoZ/s3U6LNYT/RWYFBfeo40r -Xd/MNKAn0kFsSb6BIKmUwPqFeqc8wiPX6yY4SbF1sUTkCTkw3yFHg/AIlwmhpFH3 -9mAmV+x0kTzFR/78ZDD5CUNS59bbu+7UqB06YrJuVEwPY98YixSPXTcaKimsUe+K -IY8FQ6yN6l27MK56wlj4hw2gYz+cyBUBCExCgYMQlOSg2ilH4qYyFvccSDUH7jTA -NwpsIBfdoUVbI+j2ivn+ZGD614LtIStGgUu0mDDVxVOWnRvq/z7LMaa2jwIDAQAB -ozUwMzAOBgNVHQ8BAf8EBAMCAKAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDAYDVR0T -AQH/BAIwADALBgkqhkiG9w0BAQsDggEBAJq3JzTLrIWCF8rHLTTm1icE9PjOO0sV -a1wrmdJ6NwRbJ66dLZ/4G/NZjVOnce9WFHYLFSEG+wx5YVUPuJXpJaSdy0h8F0Uw -hiJwgeVsGg7vcf4G6mWHrsauDOhylnD31UtYPX1Ao/jcntyyf+gCQpY1J/B8l1yU -LNOwvWLVLpZwZ4ehbKA/UnDXgA+3uHvpzl//cPe0cnt+Mhrgzk5mIMwVR6zCZw1G -oVutAHpv2PXxRwTMu51J+QtSL2b2w3mGHxDLpmz8UdXOtkxdpmDT8kIOtX0T5yGL -29F3fa81iZPs02GWjSGOfOzmCCvaA4C5KJvY/WulF7OOgwvrBpQwqTI= ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/signing.key b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/signing.key deleted file mode 100644 index 475625402..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/certs/signing.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEA3IXUwqSdO2QTj2ET6fJPGe+KWVntQCQQWjkWVpOz8L2A29BR -vv9z6lYNf9sOM0Xb5IUAgoZ/s3U6LNYT/RWYFBfeo40rXd/MNKAn0kFsSb6BIKmU -wPqFeqc8wiPX6yY4SbF1sUTkCTkw3yFHg/AIlwmhpFH39mAmV+x0kTzFR/78ZDD5 -CUNS59bbu+7UqB06YrJuVEwPY98YixSPXTcaKimsUe+KIY8FQ6yN6l27MK56wlj4 -hw2gYz+cyBUBCExCgYMQlOSg2ilH4qYyFvccSDUH7jTANwpsIBfdoUVbI+j2ivn+ -ZGD614LtIStGgUu0mDDVxVOWnRvq/z7LMaa2jwIDAQABAoIBAD2tiNZv6DImSXo+ -sq0qQomEf/OBvWPFMnWppd/NK/TXa+UPHO4I0MjoDJqIEC6zCU+fC4d2St1MmlrT -/X85vPFRw8mGwGxfHeRSLxEVj04I5GDYTWy0JQUrJUk/cTKp2/Bwm/RaylTyFAM0 -caYrSpvD69vjuTDFr7PDxM6iaqM53zK/vD8kCe81z+wN0UbAKsLlUOKztjH6SzL9 -uVOkekIT/j3L2xxyQhjmhfA3TuCP4uNK/+6/4ovl9Nj4pQsFomsCk4phgqy9SOm1 -4yufmVd8k7J3cppMlMPNc+7tqe2Xn593Y8QT95y3yhtkFECF70yBw64HMDDpA22p -5b/JV9ECgYEA9H4RBXOwbdjcpCa9H3mFjHqUQCqNme1vOSGiflZh9KBCDKgdqugm -KHpvAECADie0p6XRHpxRvufKnGFkJwedfeiKz51T+0dqgPxWncYT1TC+cAjOSzfM -wBpUOcAyvTTviwGbg4bLanHo4remzCbcnRvHQX4YfPFCjT9GhsU+XEUCgYEA5ubz -IlSu1wwFJpoO24ZykGUyqGUQXzR0NrXiLrpF0764qjmHyF8SPJPv1XegSxP/nUTz -SjVfJ7wye/X9qlOpBY8mzy9qQMMKc1cQBV1yVW8IRZ7pMYQZO7qmrZD/DWTa5qWt -pqSbIH2FKedELsKJA/SBtczKjspOdDKyh0UelsMCgYA7DyTfc0XAEy2hPXZb3wgC -mi2rnlvcPf2rCFPvPsCkzf2GfynDehaVmpWrsuj8Al1iTezI/yvD+Mv5oJEH2JAT -tROq+S8rOOIiTFJEBHAQBJlMCOSESPNdyD5mQOZAzEO9CWNejzYd/WwrL//Luut5 -zBcC3AngTIsuAYXw0j6xHQKBgQDamkAJep7k3W5q82OplgoUhpqFLtlnKSP1QBFZ -J+U/6Mqv7jONEeUUEQL42H6bVd2kqUikMw9ZcSVikquLfBUDPFoDwOIZWg4k0IJM -cgHyvGHad+5SgLva/oUawbGWnqtXvfc/U4vCINPXrimxE1/grLW4xp/mu8W24OCA -jIG/PQKBgD/Apl+sfqiB/6ONBjjIswA4yFkEXHSZNpAgcPwhA+cO5D0afEWz2HIx -VeOh5NjN1EL0hX8clFW4bfkK1Vr0kjvbMUXnBWaibUgpiVQl9O9WjaKQLZrp4sRu -x2kJ07Qn6ri7f/lsqOELZwBy95iHWRdePptaAKkRGxJstHI7dgUt ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/registry-config-notls.yml b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/registry-config-notls.yml deleted file mode 100644 index ed6b3ea5d..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/registry-config-notls.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: 0.1 -loglevel: debug -storage: - cache: - blobdescriptor: inmemory - filesystem: - rootdirectory: /tmp/registry-dev -http: - addr: 0.0.0.0:5000 -auth: - token: - realm: "https://auth.localregistry:5559/token/" - issuer: "registry-test" - service: "registry-test" - rootcertbundle: "/etc/docker/registry/tokenbundle.pem" diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/registry-config.yml b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/registry-config.yml deleted file mode 100644 index 630ef057c..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver-oauth/registry-config.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: 0.1 -loglevel: debug -storage: - cache: - blobdescriptor: inmemory - filesystem: - rootdirectory: /tmp/registry-dev -http: - addr: 0.0.0.0:5000 - tls: - certificate: "/etc/docker/registry/localregistry.cert" - key: "/etc/docker/registry/localregistry.key" -auth: - token: - realm: "https://auth.localregistry:5559/token/" - issuer: "registry-test" - service: "registry-test" - rootcertbundle: "/etc/docker/registry/tokenbundle.pem" diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/.htpasswd b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/.htpasswd deleted file mode 100644 index 0bbf57400..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/.htpasswd +++ /dev/null @@ -1 +0,0 @@ -testuser:$2y$05$T2MlBvkN1R/yICNnLuf1leOlOfAY0DvybctbbWUFKlojfkShVgn4m diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/Dockerfile b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/Dockerfile deleted file mode 100644 index 345246874..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM dmcgowan/token-server:simple - -WORKDIR / - -COPY ./.htpasswd /.htpasswd -COPY ./certs/auth.localregistry.cert /tls.cert -COPY ./certs/auth.localregistry.key /tls.key -COPY ./certs/signing.key /sign.key diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/auth.localregistry.cert b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/auth.localregistry.cert deleted file mode 100644 index 4144ca168..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/auth.localregistry.cert +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDHDCCAgagAwIBAgIRAKhhQMnqZx+hkOmoUYgPb+kwCwYJKoZIhvcNAQELMCYx -ETAPBgNVBAoTCFF1aWNrVExTMREwDwYDVQQDEwhRdWlja1RMUzAeFw0xNjAxMjgw -MDQyMzFaFw0xOTAxMTIwMDQyMzFaMDAxETAPBgNVBAoTCFF1aWNrVExTMRswGQYD -VQQDExJhdXRoLmxvY2FscmVnaXN0cnkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQD1tUf1EghBlIRrE83yF4zDgRu7vH2Jo0kygKJUWtQQe+DfXyjjE/fg -FdKnnoEjsIeF9hxNbTt0ldDz7/n97pbMhoiXULi9iq4jlgSzVL2XEAgrON0YSY/c -Lmmd1KSa/pOUZr2WMAYPZ+FdQfE1W7SMNbErPefBqYdFzpZ+esAtvbajYwIjl8Vy -9c4bidx4vgnNrR9GcFYibjC5sj8syh/OtbzzqiVGT8YcPpmMG6KNRkausa4gqpon -NKYG8C3WDaiPCLYKcvFrFfdEWF/m2oj14eXACXT9iwp8r4bsLgXrZwqcpKOWfVRu -qHC8aV476EYgxWCAOANExUdUaRt5wL/jAgMBAAGjPzA9MA4GA1UdDwEB/wQEAwIA -oDAMBgNVHRMBAf8EAjAAMB0GA1UdEQQWMBSCEmF1dGgubG9jYWxyZWdpc3RyeTAL -BgkqhkiG9w0BAQsDggEBABxPGK9FdGDxcLowNsExKnnZvmQT3H0u+Dux1gkp0AhH -KOrmx3LUENUKLSgotzx133tgOgR5lzAWVFy7bhLwlPhOslxf2oEfztsAMd/tY8rW -PrG2ZqYqlzEQQ9INbAc3woo5A3slN07uhP3F16jNqoMM4zRmw6Ba70CluGKT7x5+ -xVjKoWITLjWDXT5m35PnsN8CpBaFzXYcod/5p9XwCFp0s+aNxfpZECCV/3yqIr+J -ALzroPh43FAlG96o4NyYZ2Msp63newN19R2+TgpV4nXuw2mLVDpvetP7RRqnpvj/ -qwRgt5j4hFjJWb61M0ELL7A9fA71h1ImdGCvnArdBQs= ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/auth.localregistry.key b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/auth.localregistry.key deleted file mode 100644 index 4c499bb21..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/auth.localregistry.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA9bVH9RIIQZSEaxPN8heMw4Ebu7x9iaNJMoCiVFrUEHvg318o -4xP34BXSp56BI7CHhfYcTW07dJXQ8+/5/e6WzIaIl1C4vYquI5YEs1S9lxAIKzjd -GEmP3C5pndSkmv6TlGa9ljAGD2fhXUHxNVu0jDWxKz3nwamHRc6WfnrALb22o2MC -I5fFcvXOG4nceL4Jza0fRnBWIm4wubI/LMofzrW886olRk/GHD6ZjBuijUZGrrGu -IKqaJzSmBvAt1g2ojwi2CnLxaxX3RFhf5tqI9eHlwAl0/YsKfK+G7C4F62cKnKSj -ln1UbqhwvGleO+hGIMVggDgDRMVHVGkbecC/4wIDAQABAoIBAQCrsjXKRwOF8CZo -PLqZBWPT6hBbK+f9miC4LbNBhwbRTf9hl7mWlImOCTHe95/+NIk/Ty+P21jEqzwM -ehETJPoziX9BXaL6sEHnlBlMx1aEjStoKKA3LJBeqAAdzk4IEQVHmlO4824IreqJ -pF7Njnunzo0zTlr4tWJVoXsAfv5z9tNtdkxYBbIa0fjfGtlqXU3gLq58FCON3mB/ -NGc0AyA1UFGp0FzpdEcwTGD4InsXbcmsl2l/VPBJuZbryITRqWs6BbK++80DRhNt -afMhP+IzKrWSCp0rBYrqqz6AevtlKdEfQK1yXPEjN/63QLMevt8mF/1JCp//TQnf -Z6bIQbAhAoGBAP7vFA0PcvoXt9MXvvAwrKY1s6pNw4nWPG27qY1/m+DkBwP8IQms -4AWGv1wscZzXJYTvaLO5/qjmGUj50ohcVEvyZJioh1pKXA8Chxvd6rBA/O/Lj5E0 -3MOSA5Q0gxJ0Mhv0zGbbyN5fY8D8zhxoqQP4LoW+UdZG2Oi6JxsQ9c9dAoGBAPa8 -U3bGuM5OGA9EWP7mkB/VnjDTL1aEIN3cOHbHIKwH/loxdYcNMBE7vwxV1CzgIzXT -wsL0iE15fQdK938u0+um8aH5QtbWNI8tdk1XVjEC/i3C7N6WVUutneCKUDb4QxiB -9OvWCbNNiN+xTKBBM93YlwO3GYfrW9Pmm9q1+hg/AoGBALJlUS22gun50PxaIJZq -KVcCO2DQnCYHki/j48mN4+HjD/m85M2lePrFCYIR48syTyIQer9SR5+frVAA6k/b -9G1VCQo+3MDVSkiCp1Nb3tBKGfYgB65ARMBinDiI6rPuNeaUTrkn0g+yxtaU0hLV -Nnj9omia/x+oYj+xjI4HN0xNAoGARy92dSJIV104m88ATip/EnAzP6ruUWu1f8z1 -jW9OAdQckjEK03f+kjpGmGx61qekAPejjVO3r4KJi/0ZAtyjz61OsYiUvB748wYO -x6mW+HUAmHtQk7eTzE2+6vV8xx9BXGTCIPiTu+N2xfMFRIcLS8odZ7j/6LMCv1Qd -SzCNg0kCgYBaNlEs4pK1VxZZpEWwVmFpgIxfEfxLIaGrek6wBTcCn/VA2M0oHuez -mlMio8VY0yWPBJz30JflDiTmYIvteLPMHT0N0J6isiXLhzJSFI4+cAMLE2Q5v8rz -W+W5/L8YZeierW0qJat1BrgStaf5ZLpiOc9pKBSwycydPH5BfVdK/A== ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/localregistry.cert b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/localregistry.cert deleted file mode 100644 index 105acc4f3..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/localregistry.cert +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDETCCAfugAwIBAgIQN7rT95eAy75c4n6/AsDJODALBgkqhkiG9w0BAQswJjER -MA8GA1UEChMIUXVpY2tUTFMxETAPBgNVBAMTCFF1aWNrVExTMB4XDTE2MDEyODAw -NDIzMloXDTE5MDExMjAwNDIzMlowKzERMA8GA1UEChMIUXVpY2tUTFMxFjAUBgNV -BAMTDWxvY2FscmVnaXN0cnkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDLi75QEkl/qekcoOJlNv9y1IXvrbU2ssl4ViJiZRjWx+/CkyCCOyf9YUpAgRLr -Pskqde2mwhuNP8yBlOBb17Sapz7N3+hJi5j9vLBAFcamPeF3PqxjFv7j5TKkRmSI -dFYQclREwMUd3qEH322KkqOnsEEfdmCgFqWORe+QR5AxzxQP3Pnd4OYH1yZCh0MQ -P2pJgrxxf2I5I/m1AUgoHV1cdBbCv9LGohJPpMtwPC0dJpgMFcnf6hT37At236AY -V437HiRruY7iPWkYFrSPWpwdslJ32MZvRN5RS163jZXjiZ7qWnQOiiDJfXe4evB/ -yQLN4m0qVQxsMz7rkY7OsqaXAgMBAAGjOjA4MA4GA1UdDwEB/wQEAwIAoDAMBgNV -HRMBAf8EAjAAMBgGA1UdEQQRMA+CDWxvY2FscmVnaXN0cnkwCwYJKoZIhvcNAQEL -A4IBAQAyUb3EuMaOylBeV8+4KeBiE4lxykDOwLLSk3jXRsVVtfJpX3v8l5vwo/Jf -iG8tzzz+7uiskI96u3TsekUtVkUxujfKevMP+369K/59s7NRmwwlFMyB2fvL14B2 -oweVjWvM/8fZl6irtFdbJFXXRm7paKso5cmfImxhojAwohgcd4XTVLE/7juYa582 -AaBdRuIiyL71MU9qa1mC5+57AaSLPYaPKpahemgYYkV1Z403Kd6rXchxdQ8JIAL8 -+0oYTSC+svnz1tUU/V5E5id9LQaTmDN5iIVFhNpqAaZmR45UI86woWvnkMb8Ants -4aknwTwY3300PuTqBdQufvOFDRN5 ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/localregistry.key b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/localregistry.key deleted file mode 100644 index cb69a0f3e..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/localregistry.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAy4u+UBJJf6npHKDiZTb/ctSF7621NrLJeFYiYmUY1sfvwpMg -gjsn/WFKQIES6z7JKnXtpsIbjT/MgZTgW9e0mqc+zd/oSYuY/bywQBXGpj3hdz6s -Yxb+4+UypEZkiHRWEHJURMDFHd6hB99tipKjp7BBH3ZgoBaljkXvkEeQMc8UD9z5 -3eDmB9cmQodDED9qSYK8cX9iOSP5tQFIKB1dXHQWwr/SxqIST6TLcDwtHSaYDBXJ -3+oU9+wLdt+gGFeN+x4ka7mO4j1pGBa0j1qcHbJSd9jGb0TeUUtet42V44me6lp0 -DoogyX13uHrwf8kCzeJtKlUMbDM+65GOzrKmlwIDAQABAoIBAF6vFMp+lz4RteSh -Wm8m1FGAVwWVUpStOlcGClynFpTi0L88XYT3K7UMStQSttBDlqRv0ysdZF+ia+lj -bbKLdvHyFp8CJzX/AB4YZgyJlKzEYFtuBhbaHZu5hIMyU5W+OELSTCznV0p7w4C8 -CGLLr+FTdhfCo1QU9NJn6fa9s2/XRdSClBBalAHYs0ZS7ZckaF/sPiC/VapfBMet -qjJXNYiO6pXYriGWKF9zdAMfk2CM0BVWbnwQZkMSEQirrTcJwm3ezyloXCv2nywK -/VzbUT1HJVyzo5oAwTd0MwDc2oEMiFzlfO028zY4LDltpia+SyWvFi5NaIqzFESc -yLgJacECgYEA3jvH+ZQHQf42Md8TCciokaYvwWIKJdk4WRjbvE5cBZekyXAm7/3b -/1VFDKsy2RPlfmfHP3wy9rlnjzsRveB5qaclgS8aI67AYsWd/yRgfRatl7Ve9bHl -LY6VM5L/DZTxykcqivwjc77XoDuBfUKs6tyuSLQku+FOTbLtNYlUCHECgYEA6nkR -lkXufyLmDhNb3093RsYvPcs1kGaIIGTnz3cxWNh485DgsyLBuYQ5ugupQkzM8YSt -ohDTmVpggqjlXQxCg0Zw8gkEV0v8KsLGjn1CuTJg/mBArXlelq1FEeRAYC9/YfOz -ocXegHV7wDKKtcraNZFsEc7Z0LwbC9wtzSFG44cCgYASkMX1CLPOhJE8e1lY0OWc -PVjx++HDJbF6aAQ7aARyBygiF/d4xylw3EvHcinuTqY2eC8CE7siN3z6T0H9Ldqc -HLWaZDf30SqLVd0MKprQ+GsKKIHFXtY5hxbZ1ybtmIrWjjl0oPnJOqFC5pW7xC0z -9bmtozcKZxkmjpMYjN9zUQKBgQCqV6KLRerqunPgLfhE1/qTlE+l2QflDFhBEI3I -j5NuNHZKnSphehK7sHAv1WD2Jc2OeRGb+BWCB8Ktqf5YBxwbOwW7EQnyUeW1OyP9 -SMs8uHj21P6oCNDLLr5LLUQHnPoyM1aBZLstICzziMR1JhY5bJjSpzBfEQmlKCSu -LkrN6QKBgQCRXrBJRUxeJj7wCnCSq0Clf9NhCpQnwo4bEx8sKlj8K8ku8MvwQwoM -3KfWc7bOl6A2/mM/k4yoHtBMM9X9xqYtsgeFhxuiWBcfTmTxWh73LQ48Kgbrgodt -6yTccnjr7OtBidD85c6lgjAUgcL43QY8mlw0OhzXAZ2R5HWFp4ht+w== ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/signing.cert b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/signing.cert deleted file mode 100644 index 45166f2d8..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/signing.cert +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC9TCCAd+gAwIBAgIRAJ6IIisIZxL86oe3oeoAgWUwCwYJKoZIhvcNAQELMCYx -ETAPBgNVBAoTCFF1aWNrVExTMREwDwYDVQQDEwhRdWlja1RMUzAeFw0xNjAxMjgw -MDQyMzNaFw0xOTAxMTIwMDQyMzNaMBMxETAPBgNVBAoTCFF1aWNrVExTMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3IXUwqSdO2QTj2ET6fJPGe+KWVnt -QCQQWjkWVpOz8L2A29BRvv9z6lYNf9sOM0Xb5IUAgoZ/s3U6LNYT/RWYFBfeo40r -Xd/MNKAn0kFsSb6BIKmUwPqFeqc8wiPX6yY4SbF1sUTkCTkw3yFHg/AIlwmhpFH3 -9mAmV+x0kTzFR/78ZDD5CUNS59bbu+7UqB06YrJuVEwPY98YixSPXTcaKimsUe+K -IY8FQ6yN6l27MK56wlj4hw2gYz+cyBUBCExCgYMQlOSg2ilH4qYyFvccSDUH7jTA -NwpsIBfdoUVbI+j2ivn+ZGD614LtIStGgUu0mDDVxVOWnRvq/z7LMaa2jwIDAQAB -ozUwMzAOBgNVHQ8BAf8EBAMCAKAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDAYDVR0T -AQH/BAIwADALBgkqhkiG9w0BAQsDggEBAJq3JzTLrIWCF8rHLTTm1icE9PjOO0sV -a1wrmdJ6NwRbJ66dLZ/4G/NZjVOnce9WFHYLFSEG+wx5YVUPuJXpJaSdy0h8F0Uw -hiJwgeVsGg7vcf4G6mWHrsauDOhylnD31UtYPX1Ao/jcntyyf+gCQpY1J/B8l1yU -LNOwvWLVLpZwZ4ehbKA/UnDXgA+3uHvpzl//cPe0cnt+Mhrgzk5mIMwVR6zCZw1G -oVutAHpv2PXxRwTMu51J+QtSL2b2w3mGHxDLpmz8UdXOtkxdpmDT8kIOtX0T5yGL -29F3fa81iZPs02GWjSGOfOzmCCvaA4C5KJvY/WulF7OOgwvrBpQwqTI= ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/signing.key b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/signing.key deleted file mode 100644 index 475625402..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/certs/signing.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEA3IXUwqSdO2QTj2ET6fJPGe+KWVntQCQQWjkWVpOz8L2A29BR -vv9z6lYNf9sOM0Xb5IUAgoZ/s3U6LNYT/RWYFBfeo40rXd/MNKAn0kFsSb6BIKmU -wPqFeqc8wiPX6yY4SbF1sUTkCTkw3yFHg/AIlwmhpFH39mAmV+x0kTzFR/78ZDD5 -CUNS59bbu+7UqB06YrJuVEwPY98YixSPXTcaKimsUe+KIY8FQ6yN6l27MK56wlj4 -hw2gYz+cyBUBCExCgYMQlOSg2ilH4qYyFvccSDUH7jTANwpsIBfdoUVbI+j2ivn+ -ZGD614LtIStGgUu0mDDVxVOWnRvq/z7LMaa2jwIDAQABAoIBAD2tiNZv6DImSXo+ -sq0qQomEf/OBvWPFMnWppd/NK/TXa+UPHO4I0MjoDJqIEC6zCU+fC4d2St1MmlrT -/X85vPFRw8mGwGxfHeRSLxEVj04I5GDYTWy0JQUrJUk/cTKp2/Bwm/RaylTyFAM0 -caYrSpvD69vjuTDFr7PDxM6iaqM53zK/vD8kCe81z+wN0UbAKsLlUOKztjH6SzL9 -uVOkekIT/j3L2xxyQhjmhfA3TuCP4uNK/+6/4ovl9Nj4pQsFomsCk4phgqy9SOm1 -4yufmVd8k7J3cppMlMPNc+7tqe2Xn593Y8QT95y3yhtkFECF70yBw64HMDDpA22p -5b/JV9ECgYEA9H4RBXOwbdjcpCa9H3mFjHqUQCqNme1vOSGiflZh9KBCDKgdqugm -KHpvAECADie0p6XRHpxRvufKnGFkJwedfeiKz51T+0dqgPxWncYT1TC+cAjOSzfM -wBpUOcAyvTTviwGbg4bLanHo4remzCbcnRvHQX4YfPFCjT9GhsU+XEUCgYEA5ubz -IlSu1wwFJpoO24ZykGUyqGUQXzR0NrXiLrpF0764qjmHyF8SPJPv1XegSxP/nUTz -SjVfJ7wye/X9qlOpBY8mzy9qQMMKc1cQBV1yVW8IRZ7pMYQZO7qmrZD/DWTa5qWt -pqSbIH2FKedELsKJA/SBtczKjspOdDKyh0UelsMCgYA7DyTfc0XAEy2hPXZb3wgC -mi2rnlvcPf2rCFPvPsCkzf2GfynDehaVmpWrsuj8Al1iTezI/yvD+Mv5oJEH2JAT -tROq+S8rOOIiTFJEBHAQBJlMCOSESPNdyD5mQOZAzEO9CWNejzYd/WwrL//Luut5 -zBcC3AngTIsuAYXw0j6xHQKBgQDamkAJep7k3W5q82OplgoUhpqFLtlnKSP1QBFZ -J+U/6Mqv7jONEeUUEQL42H6bVd2kqUikMw9ZcSVikquLfBUDPFoDwOIZWg4k0IJM -cgHyvGHad+5SgLva/oUawbGWnqtXvfc/U4vCINPXrimxE1/grLW4xp/mu8W24OCA -jIG/PQKBgD/Apl+sfqiB/6ONBjjIswA4yFkEXHSZNpAgcPwhA+cO5D0afEWz2HIx -VeOh5NjN1EL0hX8clFW4bfkK1Vr0kjvbMUXnBWaibUgpiVQl9O9WjaKQLZrp4sRu -x2kJ07Qn6ri7f/lsqOELZwBy95iHWRdePptaAKkRGxJstHI7dgUt ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/registry-config.yml b/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/registry-config.yml deleted file mode 100644 index bc269056a..000000000 --- a/vendor/github.com/docker/distribution/contrib/docker-integration/tokenserver/registry-config.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: 0.1 -loglevel: debug -storage: - cache: - blobdescriptor: inmemory - filesystem: - rootdirectory: /tmp/registry-dev -http: - addr: 0.0.0.0:5000 - tls: - certificate: "/etc/docker/registry/localregistry.cert" - key: "/etc/docker/registry/localregistry.key" -auth: - token: - realm: "https://auth.localregistry:5556/token/" - issuer: "registry-test" - service: "registry-test" - rootcertbundle: "/etc/docker/registry/tokenbundle.pem" diff --git a/vendor/github.com/docker/distribution/contrib/token-server/errors.go b/vendor/github.com/docker/distribution/contrib/token-server/errors.go deleted file mode 100644 index bcac8ee35..000000000 --- a/vendor/github.com/docker/distribution/contrib/token-server/errors.go +++ /dev/null @@ -1,38 +0,0 @@ -package main - -import ( - "net/http" - - "github.com/docker/distribution/registry/api/errcode" -) - -var ( - errGroup = "tokenserver" - - // ErrorBadTokenOption is returned when a token parameter is invalid - ErrorBadTokenOption = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "BAD_TOKEN_OPTION", - Message: "bad token option", - Description: `This error may be returned when a request for a - token contains an option which is not valid`, - HTTPStatusCode: http.StatusBadRequest, - }) - - // ErrorMissingRequiredField is returned when a required form field is missing - ErrorMissingRequiredField = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "MISSING_REQUIRED_FIELD", - Message: "missing required field", - Description: `This error may be returned when a request for a - token does not contain a required form field`, - HTTPStatusCode: http.StatusBadRequest, - }) - - // ErrorUnsupportedValue is returned when a form field has an unsupported value - ErrorUnsupportedValue = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "UNSUPPORTED_VALUE", - Message: "unsupported value", - Description: `This error may be returned when a request for a - token contains a form field with an unsupported value`, - HTTPStatusCode: http.StatusBadRequest, - }) -) diff --git a/vendor/github.com/docker/distribution/contrib/token-server/main.go b/vendor/github.com/docker/distribution/contrib/token-server/main.go deleted file mode 100644 index e9d6d64fa..000000000 --- a/vendor/github.com/docker/distribution/contrib/token-server/main.go +++ /dev/null @@ -1,425 +0,0 @@ -package main - -import ( - "encoding/json" - "flag" - "math/rand" - "net/http" - "strconv" - "strings" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/auth" - _ "github.com/docker/distribution/registry/auth/htpasswd" - "github.com/docker/libtrust" - "github.com/gorilla/mux" -) - -var ( - enforceRepoClass bool -) - -func main() { - var ( - issuer = &TokenIssuer{} - pkFile string - addr string - debug bool - err error - - passwdFile string - realm string - - cert string - certKey string - ) - - flag.StringVar(&issuer.Issuer, "issuer", "distribution-token-server", "Issuer string for token") - flag.StringVar(&pkFile, "key", "", "Private key file") - flag.StringVar(&addr, "addr", "localhost:8080", "Address to listen on") - flag.BoolVar(&debug, "debug", false, "Debug mode") - - flag.StringVar(&passwdFile, "passwd", ".htpasswd", "Passwd file") - flag.StringVar(&realm, "realm", "", "Authentication realm") - - flag.StringVar(&cert, "tlscert", "", "Certificate file for TLS") - flag.StringVar(&certKey, "tlskey", "", "Certificate key for TLS") - - flag.BoolVar(&enforceRepoClass, "enforce-class", false, "Enforce policy for single repository class") - - flag.Parse() - - if debug { - logrus.SetLevel(logrus.DebugLevel) - } - - if pkFile == "" { - issuer.SigningKey, err = libtrust.GenerateECP256PrivateKey() - if err != nil { - logrus.Fatalf("Error generating private key: %v", err) - } - logrus.Debugf("Using newly generated key with id %s", issuer.SigningKey.KeyID()) - } else { - issuer.SigningKey, err = libtrust.LoadKeyFile(pkFile) - if err != nil { - logrus.Fatalf("Error loading key file %s: %v", pkFile, err) - } - logrus.Debugf("Loaded private key with id %s", issuer.SigningKey.KeyID()) - } - - if realm == "" { - logrus.Fatalf("Must provide realm") - } - - ac, err := auth.GetAccessController("htpasswd", map[string]interface{}{ - "realm": realm, - "path": passwdFile, - }) - if err != nil { - logrus.Fatalf("Error initializing access controller: %v", err) - } - - // TODO: Make configurable - issuer.Expiration = 15 * time.Minute - - ctx := context.Background() - - ts := &tokenServer{ - issuer: issuer, - accessController: ac, - refreshCache: map[string]refreshToken{}, - } - - router := mux.NewRouter() - router.Path("/token/").Methods("GET").Handler(handlerWithContext(ctx, ts.getToken)) - router.Path("/token/").Methods("POST").Handler(handlerWithContext(ctx, ts.postToken)) - - if cert == "" { - err = http.ListenAndServe(addr, router) - } else if certKey == "" { - logrus.Fatalf("Must provide certficate (-tlscert) and key (-tlskey)") - } else { - err = http.ListenAndServeTLS(addr, cert, certKey, router) - } - - if err != nil { - logrus.Infof("Error serving: %v", err) - } - -} - -// handlerWithContext wraps the given context-aware handler by setting up the -// request context from a base context. -func handlerWithContext(ctx context.Context, handler func(context.Context, http.ResponseWriter, *http.Request)) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx := context.WithRequest(ctx, r) - logger := context.GetRequestLogger(ctx) - ctx = context.WithLogger(ctx, logger) - - handler(ctx, w, r) - }) -} - -func handleError(ctx context.Context, err error, w http.ResponseWriter) { - ctx, w = context.WithResponseWriter(ctx, w) - - if serveErr := errcode.ServeJSON(w, err); serveErr != nil { - context.GetResponseLogger(ctx).Errorf("error sending error response: %v", serveErr) - return - } - - context.GetResponseLogger(ctx).Info("application error") -} - -var refreshCharacters = []rune("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") - -const refreshTokenLength = 15 - -func newRefreshToken() string { - s := make([]rune, refreshTokenLength) - for i := range s { - s[i] = refreshCharacters[rand.Intn(len(refreshCharacters))] - } - return string(s) -} - -type refreshToken struct { - subject string - service string -} - -type tokenServer struct { - issuer *TokenIssuer - accessController auth.AccessController - refreshCache map[string]refreshToken -} - -type tokenResponse struct { - Token string `json:"access_token"` - RefreshToken string `json:"refresh_token,omitempty"` - ExpiresIn int `json:"expires_in,omitempty"` -} - -var repositoryClassCache = map[string]string{} - -func filterAccessList(ctx context.Context, scope string, requestedAccessList []auth.Access) []auth.Access { - if !strings.HasSuffix(scope, "/") { - scope = scope + "/" - } - grantedAccessList := make([]auth.Access, 0, len(requestedAccessList)) - for _, access := range requestedAccessList { - if access.Type == "repository" { - if !strings.HasPrefix(access.Name, scope) { - context.GetLogger(ctx).Debugf("Resource scope not allowed: %s", access.Name) - continue - } - if enforceRepoClass { - if class, ok := repositoryClassCache[access.Name]; ok { - if class != access.Class { - context.GetLogger(ctx).Debugf("Different repository class: %q, previously %q", access.Class, class) - continue - } - } else if strings.EqualFold(access.Action, "push") { - repositoryClassCache[access.Name] = access.Class - } - } - } else if access.Type == "registry" { - if access.Name != "catalog" { - context.GetLogger(ctx).Debugf("Unknown registry resource: %s", access.Name) - continue - } - // TODO: Limit some actions to "admin" users - } else { - context.GetLogger(ctx).Debugf("Skipping unsupported resource type: %s", access.Type) - continue - } - grantedAccessList = append(grantedAccessList, access) - } - return grantedAccessList -} - -type acctSubject struct{} - -func (acctSubject) String() string { return "acctSubject" } - -type requestedAccess struct{} - -func (requestedAccess) String() string { return "requestedAccess" } - -type grantedAccess struct{} - -func (grantedAccess) String() string { return "grantedAccess" } - -// getToken handles authenticating the request and authorizing access to the -// requested scopes. -func (ts *tokenServer) getToken(ctx context.Context, w http.ResponseWriter, r *http.Request) { - context.GetLogger(ctx).Info("getToken") - - params := r.URL.Query() - service := params.Get("service") - scopeSpecifiers := params["scope"] - var offline bool - if offlineStr := params.Get("offline_token"); offlineStr != "" { - var err error - offline, err = strconv.ParseBool(offlineStr) - if err != nil { - handleError(ctx, ErrorBadTokenOption.WithDetail(err), w) - return - } - } - - requestedAccessList := ResolveScopeSpecifiers(ctx, scopeSpecifiers) - - authorizedCtx, err := ts.accessController.Authorized(ctx, requestedAccessList...) - if err != nil { - challenge, ok := err.(auth.Challenge) - if !ok { - handleError(ctx, err, w) - return - } - - // Get response context. - ctx, w = context.WithResponseWriter(ctx, w) - - challenge.SetHeaders(w) - handleError(ctx, errcode.ErrorCodeUnauthorized.WithDetail(challenge.Error()), w) - - context.GetResponseLogger(ctx).Info("get token authentication challenge") - - return - } - ctx = authorizedCtx - - username := context.GetStringValue(ctx, "auth.user.name") - - ctx = context.WithValue(ctx, acctSubject{}, username) - ctx = context.WithLogger(ctx, context.GetLogger(ctx, acctSubject{})) - - context.GetLogger(ctx).Info("authenticated client") - - ctx = context.WithValue(ctx, requestedAccess{}, requestedAccessList) - ctx = context.WithLogger(ctx, context.GetLogger(ctx, requestedAccess{})) - - grantedAccessList := filterAccessList(ctx, username, requestedAccessList) - ctx = context.WithValue(ctx, grantedAccess{}, grantedAccessList) - ctx = context.WithLogger(ctx, context.GetLogger(ctx, grantedAccess{})) - - token, err := ts.issuer.CreateJWT(username, service, grantedAccessList) - if err != nil { - handleError(ctx, err, w) - return - } - - context.GetLogger(ctx).Info("authorized client") - - response := tokenResponse{ - Token: token, - ExpiresIn: int(ts.issuer.Expiration.Seconds()), - } - - if offline { - response.RefreshToken = newRefreshToken() - ts.refreshCache[response.RefreshToken] = refreshToken{ - subject: username, - service: service, - } - } - - ctx, w = context.WithResponseWriter(ctx, w) - - w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(response) - - context.GetResponseLogger(ctx).Info("get token complete") -} - -type postTokenResponse struct { - Token string `json:"access_token"` - Scope string `json:"scope,omitempty"` - ExpiresIn int `json:"expires_in,omitempty"` - IssuedAt string `json:"issued_at,omitempty"` - RefreshToken string `json:"refresh_token,omitempty"` -} - -// postToken handles authenticating the request and authorizing access to the -// requested scopes. -func (ts *tokenServer) postToken(ctx context.Context, w http.ResponseWriter, r *http.Request) { - grantType := r.PostFormValue("grant_type") - if grantType == "" { - handleError(ctx, ErrorMissingRequiredField.WithDetail("missing grant_type value"), w) - return - } - - service := r.PostFormValue("service") - if service == "" { - handleError(ctx, ErrorMissingRequiredField.WithDetail("missing service value"), w) - return - } - - clientID := r.PostFormValue("client_id") - if clientID == "" { - handleError(ctx, ErrorMissingRequiredField.WithDetail("missing client_id value"), w) - return - } - - var offline bool - switch r.PostFormValue("access_type") { - case "", "online": - case "offline": - offline = true - default: - handleError(ctx, ErrorUnsupportedValue.WithDetail("unknown access_type value"), w) - return - } - - requestedAccessList := ResolveScopeList(ctx, r.PostFormValue("scope")) - - var subject string - var rToken string - switch grantType { - case "refresh_token": - rToken = r.PostFormValue("refresh_token") - if rToken == "" { - handleError(ctx, ErrorUnsupportedValue.WithDetail("missing refresh_token value"), w) - return - } - rt, ok := ts.refreshCache[rToken] - if !ok || rt.service != service { - handleError(ctx, errcode.ErrorCodeUnauthorized.WithDetail("invalid refresh token"), w) - return - } - subject = rt.subject - case "password": - ca, ok := ts.accessController.(auth.CredentialAuthenticator) - if !ok { - handleError(ctx, ErrorUnsupportedValue.WithDetail("password grant type not supported"), w) - return - } - subject = r.PostFormValue("username") - if subject == "" { - handleError(ctx, ErrorUnsupportedValue.WithDetail("missing username value"), w) - return - } - password := r.PostFormValue("password") - if password == "" { - handleError(ctx, ErrorUnsupportedValue.WithDetail("missing password value"), w) - return - } - if err := ca.AuthenticateUser(subject, password); err != nil { - handleError(ctx, errcode.ErrorCodeUnauthorized.WithDetail("invalid credentials"), w) - return - } - default: - handleError(ctx, ErrorUnsupportedValue.WithDetail("unknown grant_type value"), w) - return - } - - ctx = context.WithValue(ctx, acctSubject{}, subject) - ctx = context.WithLogger(ctx, context.GetLogger(ctx, acctSubject{})) - - context.GetLogger(ctx).Info("authenticated client") - - ctx = context.WithValue(ctx, requestedAccess{}, requestedAccessList) - ctx = context.WithLogger(ctx, context.GetLogger(ctx, requestedAccess{})) - - grantedAccessList := filterAccessList(ctx, subject, requestedAccessList) - ctx = context.WithValue(ctx, grantedAccess{}, grantedAccessList) - ctx = context.WithLogger(ctx, context.GetLogger(ctx, grantedAccess{})) - - token, err := ts.issuer.CreateJWT(subject, service, grantedAccessList) - if err != nil { - handleError(ctx, err, w) - return - } - - context.GetLogger(ctx).Info("authorized client") - - response := postTokenResponse{ - Token: token, - ExpiresIn: int(ts.issuer.Expiration.Seconds()), - IssuedAt: time.Now().UTC().Format(time.RFC3339), - Scope: ToScopeList(grantedAccessList), - } - - if offline { - rToken = newRefreshToken() - ts.refreshCache[rToken] = refreshToken{ - subject: subject, - service: service, - } - } - - if rToken != "" { - response.RefreshToken = rToken - } - - ctx, w = context.WithResponseWriter(ctx, w) - - w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(response) - - context.GetResponseLogger(ctx).Info("post token complete") -} diff --git a/vendor/github.com/docker/distribution/contrib/token-server/token.go b/vendor/github.com/docker/distribution/contrib/token-server/token.go deleted file mode 100644 index b0c2abff7..000000000 --- a/vendor/github.com/docker/distribution/contrib/token-server/token.go +++ /dev/null @@ -1,219 +0,0 @@ -package main - -import ( - "crypto" - "crypto/rand" - "encoding/base64" - "encoding/json" - "fmt" - "io" - "regexp" - "strings" - "time" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/auth" - "github.com/docker/distribution/registry/auth/token" - "github.com/docker/libtrust" -) - -// ResolveScopeSpecifiers converts a list of scope specifiers from a token -// request's `scope` query parameters into a list of standard access objects. -func ResolveScopeSpecifiers(ctx context.Context, scopeSpecs []string) []auth.Access { - requestedAccessSet := make(map[auth.Access]struct{}, 2*len(scopeSpecs)) - - for _, scopeSpecifier := range scopeSpecs { - // There should be 3 parts, separated by a `:` character. - parts := strings.SplitN(scopeSpecifier, ":", 3) - - if len(parts) != 3 { - context.GetLogger(ctx).Infof("ignoring unsupported scope format %s", scopeSpecifier) - continue - } - - resourceType, resourceName, actions := parts[0], parts[1], parts[2] - - resourceType, resourceClass := splitResourceClass(resourceType) - if resourceType == "" { - continue - } - - // Actions should be a comma-separated list of actions. - for _, action := range strings.Split(actions, ",") { - requestedAccess := auth.Access{ - Resource: auth.Resource{ - Type: resourceType, - Class: resourceClass, - Name: resourceName, - }, - Action: action, - } - - // Add this access to the requested access set. - requestedAccessSet[requestedAccess] = struct{}{} - } - } - - requestedAccessList := make([]auth.Access, 0, len(requestedAccessSet)) - for requestedAccess := range requestedAccessSet { - requestedAccessList = append(requestedAccessList, requestedAccess) - } - - return requestedAccessList -} - -var typeRegexp = regexp.MustCompile(`^([a-z0-9]+)(\([a-z0-9]+\))?$`) - -func splitResourceClass(t string) (string, string) { - matches := typeRegexp.FindStringSubmatch(t) - if len(matches) < 2 { - return "", "" - } - if len(matches) == 2 || len(matches[2]) < 2 { - return matches[1], "" - } - return matches[1], matches[2][1 : len(matches[2])-1] -} - -// ResolveScopeList converts a scope list from a token request's -// `scope` parameter into a list of standard access objects. -func ResolveScopeList(ctx context.Context, scopeList string) []auth.Access { - scopes := strings.Split(scopeList, " ") - return ResolveScopeSpecifiers(ctx, scopes) -} - -func scopeString(a auth.Access) string { - if a.Class != "" { - return fmt.Sprintf("%s(%s):%s:%s", a.Type, a.Class, a.Name, a.Action) - } - return fmt.Sprintf("%s:%s:%s", a.Type, a.Name, a.Action) -} - -// ToScopeList converts a list of access to a -// scope list string -func ToScopeList(access []auth.Access) string { - var s []string - for _, a := range access { - s = append(s, scopeString(a)) - } - return strings.Join(s, ",") -} - -// TokenIssuer represents an issuer capable of generating JWT tokens -type TokenIssuer struct { - Issuer string - SigningKey libtrust.PrivateKey - Expiration time.Duration -} - -// CreateJWT creates and signs a JSON Web Token for the given subject and -// audience with the granted access. -func (issuer *TokenIssuer) CreateJWT(subject string, audience string, grantedAccessList []auth.Access) (string, error) { - // Make a set of access entries to put in the token's claimset. - resourceActionSets := make(map[auth.Resource]map[string]struct{}, len(grantedAccessList)) - for _, access := range grantedAccessList { - actionSet, exists := resourceActionSets[access.Resource] - if !exists { - actionSet = map[string]struct{}{} - resourceActionSets[access.Resource] = actionSet - } - actionSet[access.Action] = struct{}{} - } - - accessEntries := make([]*token.ResourceActions, 0, len(resourceActionSets)) - for resource, actionSet := range resourceActionSets { - actions := make([]string, 0, len(actionSet)) - for action := range actionSet { - actions = append(actions, action) - } - - accessEntries = append(accessEntries, &token.ResourceActions{ - Type: resource.Type, - Class: resource.Class, - Name: resource.Name, - Actions: actions, - }) - } - - randomBytes := make([]byte, 15) - _, err := io.ReadFull(rand.Reader, randomBytes) - if err != nil { - return "", err - } - randomID := base64.URLEncoding.EncodeToString(randomBytes) - - now := time.Now() - - signingHash := crypto.SHA256 - var alg string - switch issuer.SigningKey.KeyType() { - case "RSA": - alg = "RS256" - case "EC": - alg = "ES256" - default: - panic(fmt.Errorf("unsupported signing key type %q", issuer.SigningKey.KeyType())) - } - - joseHeader := token.Header{ - Type: "JWT", - SigningAlg: alg, - } - - if x5c := issuer.SigningKey.GetExtendedField("x5c"); x5c != nil { - joseHeader.X5c = x5c.([]string) - } else { - var jwkMessage json.RawMessage - jwkMessage, err = issuer.SigningKey.PublicKey().MarshalJSON() - if err != nil { - return "", err - } - joseHeader.RawJWK = &jwkMessage - } - - exp := issuer.Expiration - if exp == 0 { - exp = 5 * time.Minute - } - - claimSet := token.ClaimSet{ - Issuer: issuer.Issuer, - Subject: subject, - Audience: audience, - Expiration: now.Add(exp).Unix(), - NotBefore: now.Unix(), - IssuedAt: now.Unix(), - JWTID: randomID, - - Access: accessEntries, - } - - var ( - joseHeaderBytes []byte - claimSetBytes []byte - ) - - if joseHeaderBytes, err = json.Marshal(joseHeader); err != nil { - return "", fmt.Errorf("unable to encode jose header: %s", err) - } - if claimSetBytes, err = json.Marshal(claimSet); err != nil { - return "", fmt.Errorf("unable to encode claim set: %s", err) - } - - encodedJoseHeader := joseBase64Encode(joseHeaderBytes) - encodedClaimSet := joseBase64Encode(claimSetBytes) - encodingToSign := fmt.Sprintf("%s.%s", encodedJoseHeader, encodedClaimSet) - - var signatureBytes []byte - if signatureBytes, _, err = issuer.SigningKey.Sign(strings.NewReader(encodingToSign), signingHash); err != nil { - return "", fmt.Errorf("unable to sign jwt payload: %s", err) - } - - signature := joseBase64Encode(signatureBytes) - - return fmt.Sprintf("%s.%s", encodingToSign, signature), nil -} - -func joseBase64Encode(data []byte) string { - return strings.TrimRight(base64.URLEncoding.EncodeToString(data), "=") -} diff --git a/vendor/github.com/docker/distribution/docs/README.md b/vendor/github.com/docker/distribution/docs/README.md deleted file mode 100644 index b26dc3754..000000000 --- a/vendor/github.com/docker/distribution/docs/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# The docs have been moved! - -The documentation for Registry has been merged into -[the general documentation repo](https://github.com/docker/docker.github.io). -Commit history has been preserved. - -The docs for Registry are now here: -https://github.com/docker/docker.github.io/tree/master/registry - -> Note: The definitive [./spec directory](spec/) directory and -[configuration.md](configuration.md) file will be maintained in this repository -and be refreshed periodically in -[the general documentation repo](https://github.com/docker/docker.github.io). - -As always, the docs in the general repo remain open-source and we appreciate -your feedback and pull requests! diff --git a/vendor/github.com/docker/distribution/docs/architecture.md b/vendor/github.com/docker/distribution/docs/architecture.md deleted file mode 100644 index c2aaa9f2d..000000000 --- a/vendor/github.com/docker/distribution/docs/architecture.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -published: false ---- - -# Architecture - -## Design -**TODO(stevvooe):** Discuss the architecture of the registry, internally and externally, in a few different deployment scenarios. - -### Eventual Consistency - -> **NOTE:** This section belongs somewhere, perhaps in a design document. We -> are leaving this here so the information is not lost. - -Running the registry on eventually consistent backends has been part of the -design from the beginning. This section covers some of the approaches to -dealing with this reality. - -There are a few classes of issues that we need to worry about when -implementing something on top of the storage drivers: - -1. Read-After-Write consistency (see this [article on - s3](http://shlomoswidler.com/2009/12/read-after-write-consistency-in-amazon.html)). -2. [Write-Write Conflicts](http://en.wikipedia.org/wiki/Write%E2%80%93write_conflict). - -In reality, the registry must worry about these kinds of errors when doing the -following: - -1. Accepting data into a temporary upload file may not have latest data block - yet (read-after-write). -2. Moving uploaded data into its blob location (write-write race). -3. Modifying the "current" manifest for given tag (write-write race). -4. A whole slew of operations around deletes (read-after-write, delete-write - races, garbage collection, etc.). - -The backend path layout employs a few techniques to avoid these problems: - -1. Large writes are done to private upload directories. This alleviates most - of the corruption potential under multiple writers by avoiding multiple - writers. -2. Constraints in storage driver implementations, such as support for writing - after the end of a file to extend it. -3. Digest verification to avoid data corruption. -4. Manifest files are stored by digest and cannot change. -5. All other non-content files (links, hashes, etc.) are written as an atomic - unit. Anything that requires additions and deletions is broken out into - separate "files". Last writer still wins. - -Unfortunately, one must play this game when trying to build something like -this on top of eventually consistent storage systems. If we run into serious -problems, we can wrap the storagedrivers in a shared consistency layer but -that would increase complexity and hinder registry cluster performance. diff --git a/vendor/github.com/docker/distribution/docs/configuration.md b/vendor/github.com/docker/distribution/docs/configuration.md deleted file mode 100644 index a1c66b21c..000000000 --- a/vendor/github.com/docker/distribution/docs/configuration.md +++ /dev/null @@ -1,1121 +0,0 @@ ---- -title: "Configuring a registry" -description: "Explains how to configure a registry" -keywords: registry, on-prem, images, tags, repository, distribution, configuration ---- - -The Registry configuration is based on a YAML file, detailed below. While it -comes with sane default values out of the box, you should review it exhaustively -before moving your systems to production. - -## Override specific configuration options - -In a typical setup where you run your Registry from the official image, you can -specify a configuration variable from the environment by passing `-e` arguments -to your `docker run` stanza or from within a Dockerfile using the `ENV` -instruction. - -To override a configuration option, create an environment variable named -`REGISTRY_variable` where `variable` is the name of the configuration option -and the `_` (underscore) represents indention levels. For example, you can -configure the `rootdirectory` of the `filesystem` storage backend: - -```none -storage: - filesystem: - rootdirectory: /var/lib/registry -``` - -To override this value, set an environment variable like this: - -```none -REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/somewhere -``` - -This variable overrides the `/var/lib/registry` value to the `/somewhere` -directory. - -> **Note**: Create a base configuration file with environment variables that can -> be configured to tweak individual values. Overriding configuration sections -> with environment variables is not recommended. - -## Overriding the entire configuration file - -If the default configuration is not a sound basis for your usage, or if you are -having issues overriding keys from the environment, you can specify an alternate -YAML configuration file by mounting it as a volume in the container. - -Typically, create a new configuration file from scratch,named `config.yml`, then -specify it in the `docker run` command: - -```bash -$ docker run -d -p 5000:5000 --restart=always --name registry \ - -v `pwd`/config.yml:/etc/docker/registry/config.yml \ - registry:2 -``` - -Use this -[example YAML file](https://github.com/docker/distribution/blob/master/cmd/registry/config-example.yml) -as a starting point. - -## List of configuration options - -These are all configuration options for the registry. Some options in the list -are mutually exclusive. Read the detailed reference information about each -option before finalizing your configuration. - -```none -version: 0.1 -log: - accesslog: - disabled: true - level: debug - formatter: text - fields: - service: registry - environment: staging - hooks: - - type: mail - disabled: true - levels: - - panic - options: - smtp: - addr: mail.example.com:25 - username: mailuser - password: password - insecure: true - from: sender@example.com - to: - - errors@example.com -loglevel: debug # deprecated: use "log" -storage: - filesystem: - rootdirectory: /var/lib/registry - maxthreads: 100 - azure: - accountname: accountname - accountkey: base64encodedaccountkey - container: containername - gcs: - bucket: bucketname - keyfile: /path/to/keyfile - rootdirectory: /gcs/object/name/prefix - chunksize: 5242880 - s3: - accesskey: awsaccesskey - secretkey: awssecretkey - region: us-west-1 - regionendpoint: http://myobjects.local - bucket: bucketname - encrypt: true - keyid: mykeyid - secure: true - v4auth: true - chunksize: 5242880 - multipartcopychunksize: 33554432 - multipartcopymaxconcurrency: 100 - multipartcopythresholdsize: 33554432 - rootdirectory: /s3/object/name/prefix - swift: - username: username - password: password - authurl: https://storage.myprovider.com/auth/v1.0 or https://storage.myprovider.com/v2.0 or https://storage.myprovider.com/v3/auth - tenant: tenantname - tenantid: tenantid - domain: domain name for Openstack Identity v3 API - domainid: domain id for Openstack Identity v3 API - insecureskipverify: true - region: fr - container: containername - rootdirectory: /swift/object/name/prefix - oss: - accesskeyid: accesskeyid - accesskeysecret: accesskeysecret - region: OSS region name - endpoint: optional endpoints - internal: optional internal endpoint - bucket: OSS bucket - encrypt: optional data encryption setting - secure: optional ssl setting - chunksize: optional size valye - rootdirectory: optional root directory - inmemory: # This driver takes no parameters - delete: - enabled: false - redirect: - disable: false - cache: - blobdescriptor: redis - maintenance: - uploadpurging: - enabled: true - age: 168h - interval: 24h - dryrun: false - readonly: - enabled: false -auth: - silly: - realm: silly-realm - service: silly-service - token: - realm: token-realm - service: token-service - issuer: registry-token-issuer - rootcertbundle: /root/certs/bundle - htpasswd: - realm: basic-realm - path: /path/to/htpasswd -middleware: - registry: - - name: ARegistryMiddleware - options: - foo: bar - repository: - - name: ARepositoryMiddleware - options: - foo: bar - storage: - - name: cloudfront - options: - baseurl: https://my.cloudfronted.domain.com/ - privatekey: /path/to/pem - keypairid: cloudfrontkeypairid - duration: 3000s - storage: - - name: redirect - options: - baseurl: https://example.com/ -reporting: - bugsnag: - apikey: bugsnagapikey - releasestage: bugsnagreleasestage - endpoint: bugsnagendpoint - newrelic: - licensekey: newreliclicensekey - name: newrelicname - verbose: true -http: - addr: localhost:5000 - prefix: /my/nested/registry/ - host: https://myregistryaddress.org:5000 - secret: asecretforlocaldevelopment - relativeurls: false - tls: - certificate: /path/to/x509/public - key: /path/to/x509/private - clientcas: - - /path/to/ca.pem - - /path/to/another/ca.pem - letsencrypt: - cachefile: /path/to/cache-file - email: emailused@letsencrypt.com - debug: - addr: localhost:5001 - headers: - X-Content-Type-Options: [nosniff] - http2: - disabled: false -notifications: - endpoints: - - name: alistener - disabled: false - url: https://my.listener.com/event - headers: - timeout: 500 - threshold: 5 - backoff: 1000 - ignoredmediatypes: - - application/octet-stream -redis: - addr: localhost:6379 - password: asecret - db: 0 - dialtimeout: 10ms - readtimeout: 10ms - writetimeout: 10ms - pool: - maxidle: 16 - maxactive: 64 - idletimeout: 300s -health: - storagedriver: - enabled: true - interval: 10s - threshold: 3 - file: - - file: /path/to/checked/file - interval: 10s - http: - - uri: http://server.to.check/must/return/200 - headers: - Authorization: [Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==] - statuscode: 200 - timeout: 3s - interval: 10s - threshold: 3 - tcp: - - addr: redis-server.domain.com:6379 - timeout: 3s - interval: 10s - threshold: 3 -proxy: - remoteurl: https://registry-1.docker.io - username: [username] - password: [password] -compatibility: - schema1: - signingkeyfile: /etc/registry/key.json -validation: - enabled: true - manifests: - urls: - allow: - - ^https?://([^/]+\.)*example\.com/ - deny: - - ^https?://www\.example\.com/ -``` - -In some instances a configuration option is **optional** but it contains child -options marked as **required**. In these cases, you can omit the parent with -all its children. However, if the parent is included, you must also include all -the children marked **required**. - -## `version` - -```none -version: 0.1 -``` - -The `version` option is **required**. It specifies the configuration's version. -It is expected to remain a top-level field, to allow for a consistent version -check before parsing the remainder of the configuration file. - -## `log` - -The `log` subsection configures the behavior of the logging system. The logging -system outputs everything to stdout. You can adjust the granularity and format -with this configuration section. - -```none -log: - accesslog: - disabled: true - level: debug - formatter: text - fields: - service: registry - environment: staging -``` - -| Parameter | Required | Description | -|-------------|----------|-------------| -| `level` | no | Sets the sensitivity of logging output. Permitted values are `error`, `warn`, `info`, and `debug`. The default is `info`. | -| `formatter` | no | This selects the format of logging output. The format primarily affects how keyed attributes for a log line are encoded. Options are `text`, `json`, and `logstash`. The default is `text`. | -| `fields` | no | A map of field names to values. These are added to every log line for the context. This is useful for identifying log messages source after being mixed in other systems. | - -### `accesslog` - -```none -accesslog: - disabled: true -``` - -Within `log`, `accesslog` configures the behavior of the access logging -system. By default, the access logging system outputs to stdout in -[Combined Log Format](https://httpd.apache.org/docs/2.4/logs.html#combined). -Access logging can be disabled by setting the boolean flag `disabled` to `true`. - -## `hooks` - -```none -hooks: - - type: mail - levels: - - panic - options: - smtp: - addr: smtp.sendhost.com:25 - username: sendername - password: password - insecure: true - from: name@sendhost.com - to: - - name@receivehost.com -``` - -The `hooks` subsection configures the logging hooks' behavior. This subsection -includes a sequence handler which you can use for sending mail, for example. -Refer to `loglevel` to configure the level of messages printed. - -## `loglevel` - -> **DEPRECATED:** Please use [log](#log) instead. - -```none -loglevel: debug -``` - -Permitted values are `error`, `warn`, `info` and `debug`. The default is -`info`. - -## `storage` - -```none -storage: - filesystem: - rootdirectory: /var/lib/registry - azure: - accountname: accountname - accountkey: base64encodedaccountkey - container: containername - gcs: - bucket: bucketname - keyfile: /path/to/keyfile - rootdirectory: /gcs/object/name/prefix - s3: - accesskey: awsaccesskey - secretkey: awssecretkey - region: us-west-1 - regionendpoint: http://myobjects.local - bucket: bucketname - encrypt: true - keyid: mykeyid - secure: true - v4auth: true - chunksize: 5242880 - multipartcopychunksize: 33554432 - multipartcopymaxconcurrency: 100 - multipartcopythresholdsize: 33554432 - rootdirectory: /s3/object/name/prefix - swift: - username: username - password: password - authurl: https://storage.myprovider.com/auth/v1.0 or https://storage.myprovider.com/v2.0 or https://storage.myprovider.com/v3/auth - tenant: tenantname - tenantid: tenantid - domain: domain name for Openstack Identity v3 API - domainid: domain id for Openstack Identity v3 API - insecureskipverify: true - region: fr - container: containername - rootdirectory: /swift/object/name/prefix - oss: - accesskeyid: accesskeyid - accesskeysecret: accesskeysecret - region: OSS region name - endpoint: optional endpoints - internal: optional internal endpoint - bucket: OSS bucket - encrypt: optional data encryption setting - secure: optional ssl setting - chunksize: optional size valye - rootdirectory: optional root directory - inmemory: - delete: - enabled: false - cache: - blobdescriptor: inmemory - maintenance: - uploadpurging: - enabled: true - age: 168h - interval: 24h - dryrun: false - readonly: - enabled: false - redirect: - disable: false -``` - -The `storage` option is **required** and defines which storage backend is in -use. You must configure exactly one backend. If you configure more, the registry -returns an error. You can choose any of these backend storage drivers: - -| Storage driver | Description | -|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `filesystem` | Uses the local disk to store registry files. It is ideal for development and may be appropriate for some small-scale production applications. See the [driver's reference documentation](https://github.com/docker/docker.github.io/tree/master/registry/storage-drivers/filesystem.md). | -| `azure` | Uses Microsoft Azure Blob Storage. See the [driver's reference documentation](https://github.com/docker/docker.github.io/tree/master/registry/storage-drivers/azure.md). | -| `gcs` | Uses Google Cloud Storage. See the [driver's reference documentation](https://github.com/docker/docker.github.io/tree/master/registry/storage-drivers/gcs.md). | -| `s3` | Uses Amazon Simple Storage Service (S3) and compatible Storage Services. See the [driver's reference documentation](https://github.com/docker/docker.github.io/tree/master/registry/storage-drivers/s3.md). | -| `swift` | Uses Openstack Swift object storage. See the [driver's reference documentation](https://github.com/docker/docker.github.io/tree/master/registry/storage-drivers/swift.md). | -| `oss` | Uses Aliyun OSS for object storage. See the [driver's reference documentation](https://github.com/docker/docker.github.io/tree/master/registry/storage-drivers/oss.md). | - -For testing only, you can use the [`inmemory` storage -driver](https://github.com/docker/docker.github.io/tree/master/registry/storage-drivers/inmemory.md). -If you would like to run a registry from volatile memory, use the -[`filesystem` driver](https://github.com/docker/docker.github.io/tree/master/registry/storage-drivers/filesystem.md) -on a ramdisk. - -If you are deploying a registry on Windows, a Windows volume mounted from the -host is not recommended. Instead, you can use a S3 or Azure backing -data-store. If you do use a Windows volume, the length of the `PATH` to -the mount point must be within the `MAX_PATH` limits (typically 255 characters), -or this error will occur: - -```none -mkdir /XXX protocol error and your registry will not function properly. -``` - -### `maintenance` - -Currently, upload purging and read-only mode are the only `maintenance` -functions available. - -### `uploadpurging` - -Upload purging is a background process that periodically removes orphaned files -from the upload directories of the registry. Upload purging is enabled by -default. To configure upload directory purging, the following parameters must -be set. - - -| Parameter | Required | Description | -|------------|----------|----------------------------------------------------------------------------------------------------| -| `enabled` | yes | Set to `true` to enable upload purging. Defaults to `true`. | -| `age` | yes | Upload directories which are older than this age will be deleted.Defaults to `168h` (1 week). | -| `interval` | yes | The interval between upload directory purging. Defaults to `24h`. | -| `dryrun` | yes | Set `dryrun` to `true` to obtain a summary of what directories will be deleted. Defaults to `false`.| - -> **Note**: `age` and `interval` are strings containing a number with optional -fraction and a unit suffix. Some examples: `45m`, `2h10m`, `168h`. - -### `readonly` - -If the `readonly` section under `maintenance` has `enabled` set to `true`, -clients will not be allowed to write to the registry. This mode is useful to -temporarily prevent writes to the backend storage so a garbage collection pass -can be run. Before running garbage collection, the registry should be -restarted with readonly's `enabled` set to true. After the garbage collection -pass finishes, the registry may be restarted again, this time with `readonly` -removed from the configuration (or set to false). - -### `delete` - -Use the `delete` structure to enable the deletion of image blobs and manifests -by digest. It defaults to false, but it can be enabled by writing the following -on the configuration file: - -```none -delete: - enabled: true -``` - -### `cache` - -Use the `cache` structure to enable caching of data accessed in the storage -backend. Currently, the only available cache provides fast access to layer -metadata, which uses the `blobdescriptor` field if configured. - -You can set `blobdescriptor` field to `redis` or `inmemory`. If set to `redis`,a -Redis pool caches layer metadata. If set to `inmemory`, an in-memory map caches -layer metadata. - -> **NOTE**: Formerly, `blobdescriptor` was known as `layerinfo`. While these -> are equivalent, `layerinfo` has been deprecated. - -### `redirect` - -The `redirect` subsection provides configuration for managing redirects from -content backends. For backends that support it, redirecting is enabled by -default. In certain deployment scenarios, you may decide to route all data -through the Registry, rather than redirecting to the backend. This may be more -efficient when using a backend that is not co-located or when a registry -instance is aggressively caching. - -To disable redirects, add a single flag `disable`, set to `true` -under the `redirect` section: - -```none -redirect: - disable: true -``` - -## `auth` - -```none -auth: - silly: - realm: silly-realm - service: silly-service - token: - realm: token-realm - service: token-service - issuer: registry-token-issuer - rootcertbundle: /root/certs/bundle - htpasswd: - realm: basic-realm - path: /path/to/htpasswd -``` - -The `auth` option is **optional**. Possible auth providers include: - -- [`silly`](#silly) -- [`token`](#token) -- [`htpasswd`](#token) - -You can configure only one authentication provider. - -### `silly` - -The `silly` authentication provider is only appropriate for development. It simply checks -for the existence of the `Authorization` header in the HTTP request. It does not -check the header's value. If the header does not exist, the `silly` auth -responds with a challenge response, echoing back the realm, service, and scope -for which access was denied. - -The following values are used to configure the response: - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `realm` | yes | The realm in which the registry server authenticates. | -| `service` | yes | The service being authenticated. | - -### `token` - -Token-based authentication allows you to decouple the authentication system from -the registry. It is an established authentication paradigm with a high degree of -security. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `realm` | yes | The realm in which the registry server authenticates. | -| `service` | yes | The service being authenticated. | -| `issuer` | yes | The name of the token issuer. The issuer inserts this into the token so it must match the value configured for the issuer. | -| `rootcertbundle` | yes | The absolute path to the root certificate bundle. This bundle contains the public part of the certificates used to sign authentication tokens. | - - -For more information about Token based authentication configuration, see the -[specification](spec/auth/token.md). - -### `htpasswd` - -The _htpasswd_ authentication backed allows you to configure basic -authentication using an -[Apache htpasswd file](https://httpd.apache.org/docs/2.4/programs/htpasswd.html). -The only supported password format is -[`bcrypt`](http://en.wikipedia.org/wiki/Bcrypt). Entries with other hash types -are ignored. The `htpasswd` file is loaded once, at startup. If the file is -invalid, the registry will display an error and will not start. - -> **Warning**: Only use the `htpasswd` authentication scheme with TLS -> configured, since basic authentication sends passwords as part of the HTTP -> header. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `realm` | yes | The realm in which the registry server authenticates. | -| `path` | yes | The path to the `htpasswd` file to load at startup. | - -## `middleware` - -The `middleware` structure is **optional**. Use this option to inject middleware at -named hook points. Each middleware must implement the same interface as the -object it is wrapping. For instance, a registry middleware must implement the -`distribution.Namespace` interface, while a repository middleware must implement -`distribution.Repository`, and a storage middleware must implement -`driver.StorageDriver`. - -This is an example configuration of the `cloudfront` middleware, a storage -middleware: - -```none -middleware: - registry: - - name: ARegistryMiddleware - options: - foo: bar - repository: - - name: ARepositoryMiddleware - options: - foo: bar - storage: - - name: cloudfront - options: - baseurl: https://my.cloudfronted.domain.com/ - privatekey: /path/to/pem - keypairid: cloudfrontkeypairid - duration: 3000s -``` - -Each middleware entry has `name` and `options` entries. The `name` must -correspond to the name under which the middleware registers itself. The -`options` field is a map that details custom configuration required to -initialize the middleware. It is treated as a `map[string]interface{}`. As such, -it supports any interesting structures desired, leaving it up to the middleware -initialization function to best determine how to handle the specific -interpretation of the options. - -### `cloudfront` - - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `baseurl` | yes | The `SCHEME://HOST[/PATH]` at which Cloudfront is served. | -| `privatekey` | yes | The private key for Cloudfront, provided by AWS. | -| `keypairid` | yes | The key pair ID provided by AWS. | -| `duration` | no | An integer and unit for the duration of the Cloudfront session. Valid time units are `ns`, `us` (or `µs`), `ms`, `s`, `m`, or `h`. For example, `3000s` is valid, but `3000 s` is not. If you do not specify a `duration` or you specify an integer without a time unit, the duration defaults to `20m` (20 minutes).| - -### `redirect` - -You can use the `redirect` storage middleware to specify a custom URL to a -location of a proxy for the layer stored by the S3 storage driver. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------------------------------------------------------------| -| `baseurl` | yes | `SCHEME://HOST` at which layers are served. Can also contain port. For example, `https://example.com:5443`. | - -## `reporting` - -``` -reporting: - bugsnag: - apikey: bugsnagapikey - releasestage: bugsnagreleasestage - endpoint: bugsnagendpoint - newrelic: - licensekey: newreliclicensekey - name: newrelicname - verbose: true -``` - -The `reporting` option is **optional** and configures error and metrics -reporting tools. At the moment only two services are supported: - -- [Bugsnag](#bugsnag) -- [New Relic](#new-relic) - -A valid configuration may contain both. - -### `bugsnag` - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `apikey` | yes | The API Key provided by Bugsnag. | -| `releasestage` | no | Tracks where the registry is deployed, using a string like `production`, `staging`, or `development`.| -| `endpoint`| no | The enterprise Bugsnag endpoint. | - -### `newrelic` - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `licensekey` | yes | License key provided by New Relic. | -| `name` | no | New Relic application name. | -| `verbose`| no | Set to `true` to enable New Relic debugging output on `stdout`. | - -## `http` - -```none -http: - addr: localhost:5000 - net: tcp - prefix: /my/nested/registry/ - host: https://myregistryaddress.org:5000 - secret: asecretforlocaldevelopment - relativeurls: false - tls: - certificate: /path/to/x509/public - key: /path/to/x509/private - clientcas: - - /path/to/ca.pem - - /path/to/another/ca.pem - letsencrypt: - cachefile: /path/to/cache-file - email: emailused@letsencrypt.com - debug: - addr: localhost:5001 - headers: - X-Content-Type-Options: [nosniff] - http2: - disabled: false -``` - -The `http` option details the configuration for the HTTP server that hosts the -registry. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `addr` | yes | The address for which the server should accept connections. The form depends on a network type (see the `net` option). Use `HOST:PORT` for TCP and `FILE` for a UNIX socket. | -| `net` | no | The network used to create a listening socket. Known networks are `unix` and `tcp`. | -| `prefix` | no | If the server does not run at the root path, set this to the value of the prefix. The root path is the section before `v2`. It requires both preceding and trailing slashes, such as in the example `/path/`. | -| `host` | no | A fully-qualified URL for an externally-reachable address for the registry. If present, it is used when creating generated URLs. Otherwise, these URLs are derived from client requests. | -| `secret` | no | A random piece of data used to sign state that may be stored with the client to protect against tampering. For production environments you should generate a random piece of data using a cryptographically secure random generator. If you omit the secret, the registry will automatically generate a secret when it starts. **If you are building a cluster of registries behind a load balancer, you MUST ensure the secret is the same for all registries.**| -| `relativeurls`| no | If `true`, the registry returns relative URLs in Location headers. The client is responsible for resolving the correct URL. **This option is not compatible with Docker 1.7 and earlier.**| - - -### `tls` - -The `tls` structure within `http` is **optional**. Use this to configure TLS -for the server. If you already have a web server running on -the same host as the registry, you may prefer to configure TLS on that web server -and proxy connections to the registry server. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `certificate` | yes | Absolute path to the x509 certificate file. | -| `key` | yes | Absolute path to the x509 private key file. | -| `clientcas` | no | An array of absolute paths to x509 CA files. | - -### `letsencrypt` - -The `letsencrypt` structure within `tls` is **optional**. Use this to configure -TLS certificates provided by -[Let's Encrypt](https://letsencrypt.org/how-it-works/). - ->**NOTE**: When using Let's Encrypt, ensure that the outward-facing address is -> accessible on port `443`. The registry defaults to listening on port `5000`. -> If you run the registry as a container, consider adding the flag `-p 443:5000` -> to the `docker run` command or using a similar setting in a cloud -> configuration. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `cachefile` | yes | Absolute path to a file where the Let's Encrypt agent can cache data. | -| `email` | yes | The email address used to register with Let's Encrypt. | - -### `debug` - -The `debug` option is **optional** . Use it to configure a debug server that -can be helpful in diagnosing problems. The debug endpoint can be used for -monitoring registry metrics and health, as well as profiling. Sensitive -information may be available via the debug endpoint. Please be certain that -access to the debug endpoint is locked down in a production environment. - -The `debug` section takes a single required `addr` parameter, which specifies -the `HOST:PORT` on which the debug server should accept connections. - -### `headers` - -The `headers` option is **optional** . Use it to specify headers that the HTTP -server should include in responses. This can be used for security headers such -as `Strict-Transport-Security`. - -The `headers` option should contain an option for each header to include, where -the parameter name is the header's name, and the parameter value a list of the -header's payload values. - -Including `X-Content-Type-Options: [nosniff]` is recommended, so that browsers -will not interpret content as HTML if they are directed to load a page from the -registry. This header is included in the example configuration file. - -### `http2` - -The `http2` structure within `http` is **optional**. Use this to control http2 -settings for the registry. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `disabled` | no | If `true`, then `http2` support is disabled. | - -## `notifications` - -```none -notifications: - endpoints: - - name: alistener - disabled: false - url: https://my.listener.com/event - headers: - timeout: 500 - threshold: 5 - backoff: 1000 - ignoredmediatypes: - - application/octet-stream -``` - -The notifications option is **optional** and currently may contain a single -option, `endpoints`. - -### `endpoints` - -The `endpoints` structure contains a list of named services (URLs) that can -accept event notifications. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `name` | yes | A human-readable name for the service. | -| `disabled` | no | If `true`, notifications are disabled for the service.| -| `url` | yes | The URL to which events should be published. | -| `headers` | yes | A list of static headers to add to each request. Each header's name is a key beneath `headers`, and each value is a list of payloads for that header name. Values must always be lists. | -| `timeout` | yes | A value for the HTTP timeout. A positive integer and an optional suffix indicating the unit of time, which may be `ns`, `us`, `ms`, `s`, `m`, or `h`. If you omit the unit of time, `ns` is used. | -| `threshold` | yes | An integer specifying how long to wait before backing off a failure. | -| `backoff` | yes | How long the system backs off before retrying after a failure. A positive integer and an optional suffix indicating the unit of time, which may be `ns`, `us`, `ms`, `s`, `m`, or `h`. If you omit the unit of time, `ns` is used. | -| `ignoredmediatypes`|no| A list of target media types to ignore. Events with these target media types are not published to the endpoint. | - -## `redis` - -```none -redis: - addr: localhost:6379 - password: asecret - db: 0 - dialtimeout: 10ms - readtimeout: 10ms - writetimeout: 10ms - pool: - maxidle: 16 - maxactive: 64 - idletimeout: 300s -``` - -Declare parameters for constructing the `redis` connections. Registry instances -may use the Redis instance for several applications. Currently, it caches -information about immutable blobs. Most of the `redis` options control -how the registry connects to the `redis` instance. You can control the pool's -behavior with the [pool](#pool) subsection. - -You should configure Redis with the **allkeys-lru** eviction policy, because the -registry does not set an expiration value on keys. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `addr` | yes | The address (host and port) of the Redis instance. | -| `password`| no | A password used to authenticate to the Redis instance.| -| `db` | no | The name of the database to use for each connection. | -| `dialtimeout` | no | The timeout for connecting to the Redis instance. | -| `readtimeout` | no | The timeout for reading from the Redis instance. | -| `writetimeout` | no | The timeout for writing to the Redis instance. | - -### `pool` - -```none -pool: - maxidle: 16 - maxactive: 64 - idletimeout: 300s -``` - -Use these settings to configure the behavior of the Redis connection pool. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `maxidle` | no | The maximum number of idle connections in the pool. | -| `maxactive`| no | The maximum number of connections which can be open before blocking a connection request. | -| `idletimeout`| no | How long to wait before closing inactive connections. | - -## `health` - -```none -health: - storagedriver: - enabled: true - interval: 10s - threshold: 3 - file: - - file: /path/to/checked/file - interval: 10s - http: - - uri: http://server.to.check/must/return/200 - headers: - Authorization: [Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==] - statuscode: 200 - timeout: 3s - interval: 10s - threshold: 3 - tcp: - - addr: redis-server.domain.com:6379 - timeout: 3s - interval: 10s - threshold: 3 -``` - -The health option is **optional**, and contains preferences for a periodic -health check on the storage driver's backend storage, as well as optional -periodic checks on local files, HTTP URIs, and/or TCP servers. The results of -the health checks are available at the `/debug/health` endpoint on the debug -HTTP server if the debug HTTP server is enabled (see http section). - -### `storagedriver` - -The `storagedriver` structure contains options for a health check on the -configured storage driver's backend storage. The health check is only active -when `enabled` is set to `true`. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `enabled` | yes | Set to `true` to enable storage driver health checks or `false` to disable them. | -| `interval`| no | How long to wait between repetitions of the storage driver health check. A positive integer and an optional suffix indicating the unit of time. The suffix is one of `ns`, `us`, `ms`, `s`, `m`, or `h`. Defaults to `10s` if the value is omitted. If you specify a value but omit the suffix, the value is interpreted as a number of nanoseconds. | -| `threshold`| no | A positive integer which represents the number of times the check must fail before the state is marked as unhealthy. If not specified, a single failure marks the state as unhealthy. | - -### `file` - -The `file` structure includes a list of paths to be periodically checked for the\ -existence of a file. If a file exists at the given path, the health check will -fail. You can use this mechanism to bring a registry out of rotation by creating -a file. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `file` | yes | The path to check for existence of a file. | -| `interval`| no | How long to wait before repeating the check. A positive integer and an optional suffix indicating the unit of time. The suffix is one of `ns`, `us`, `ms`, `s`, `m`, or `h`. Defaults to `10s` if the value is omitted. | - -### `http` - -The `http` structure includes a list of HTTP URIs to periodically check with -`HEAD` requests. If a `HEAD` request does not complete or returns an unexpected -status code, the health check will fail. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `uri` | yes | The URI to check. | -| `headers` | no | Static headers to add to each request. Each header's name is a key beneath `headers`, and each value is a list of payloads for that header name. Values must always be lists. | -| `statuscode` | no | The expected status code from the HTTP URI. Defaults to `200`. | -| `timeout` | no | How long to wait before timing out the HTTP request. A positive integer and an optional suffix indicating the unit of time. The suffix is one of `ns`, `us`, `ms`, `s`, `m`, or `h`. If you specify a value but omit the suffix, the value is interpreted as a number of nanoseconds. | -| `interval`| no | How long to wait before repeating the check. A positive integer and an optional suffix indicating the unit of time. The suffix is one of `ns`, `us`, `ms`, `s`, `m`, or `h`. Defaults to `10s` if the value is omitted. If you specify a value but omit the suffix, the value is interpreted as a number of nanoseconds. | -| `threshold`| no | The number of times the check must fail before the state is marked as unhealthy. If this field is not specified, a single failure marks the state as unhealthy. | - -### `tcp` - -The `tcp` structure includes a list of TCP addresses to periodically check using -TCP connection attempts. Addresses must include port numbers. If a connection -attempt fails, the health check will fail. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `addr` | yes | The TCP address and port to connect to. | -| `timeout` | no | How long to wait before timing out the TCP connection. A positive integer and an optional suffix indicating the unit of time. The suffix is one of `ns`, `us`, `ms`, `s`, `m`, or `h`. If you specify a value but omit the suffix, the value is interpreted as a number of nanoseconds. | -| `interval`| no | How long to wait between repetitions of the check. A positive integer and an optional suffix indicating the unit of time. The suffix is one of `ns`, `us`, `ms`, `s`, `m`, or `h`. Defaults to `10s` if the value is omitted. If you specify a value but omit the suffix, the value is interpreted as a number of nanoseconds. | -| `threshold`| no | The number of times the check must fail before the state is marked as unhealthy. If this field is not specified, a single failure marks the state as unhealthy. | - - -## `proxy` - -``` -proxy: - remoteurl: https://registry-1.docker.io - username: [username] - password: [password] -``` - -The `proxy` structure allows a registry to be configured as a pull-through cache -to Docker Hub. See -[mirror](https://github.com/docker/docker.github.io/tree/master/registry/recipes/mirror.md) -for more information. Pushing to a registry configured as a pull-through cache -is unsupported. - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `remoteurl`| yes | The URL for the repository on Docker Hub. | -| `username` | no | The username registered with Docker Hub which has access to the repository. | -| `password` | no | The password used to authenticate to Docker Hub using the username specified in `username`. | - - -To enable pulling private repositories (e.g. `batman/robin`) specify the -username (such as `batman`) and the password for that username. - -> **Note**: These private repositories are stored in the proxy cache's storage. -> Take appropriate measures to protect access to the proxy cache. - -## `compatibility` - -```none -compatibility: - schema1: - signingkeyfile: /etc/registry/key.json -``` - -Use the `compatibility` structure to configure handling of older and deprecated -features. Each subsection defines such a feature with configurable behavior. - -### `schema1` - -| Parameter | Required | Description | -|-----------|----------|-------------------------------------------------------| -| `signingkeyfile` | no | The signing private key used to add signatures to `schema1` manifests. If no signing key is provided, a new ECDSA key is generated when the registry starts. | - -## `validation` - -```none -validation: - enabled: true - manifests: - urls: - allow: - - ^https?://([^/]+\.)*example\.com/ - deny: - - ^https?://www\.example\.com/ -``` - -### `enabled` - -Use the `enabled` flag to enable the other options in the `validation` -section. They are disabled by default. - -### `manifests` - -Use the `manifest` subsection to configure manifest validation. - -#### `urls` - -The `allow` and `deny` options are each a list of -[regular expressions](https://godoc.org/regexp/syntax) that restrict the URLs in -pushed manifests. - -If `allow` is unset, pushing a manifest containing URLs fails. - -If `allow` is set, pushing a manifest succeeds only if all URLs match -one of the `allow` regular expressions **and** one of the following holds: - -1. `deny` is unset. -2. `deny` is set but no URLs within the manifest match any of the `deny` regular - expressions. - -## Example: Development configuration - -You can use this simple example for local development: - -```none -version: 0.1 -log: - level: debug -storage: - filesystem: - rootdirectory: /var/lib/registry -http: - addr: localhost:5000 - secret: asecretforlocaldevelopment - debug: - addr: localhost:5001 -``` - -This example configures the registry instance to run on port `5000`, binding to -`localhost`, with the `debug` server enabled. Registry data is stored in the -`/var/lib/registry` directory. Logging is set to `debug` mode, which is the most -verbose. - -See -[config-example.yml](https://github.com/docker/distribution/blob/master/cmd/registry/config-example.yml) -for another simple configuration. Both examples are generally useful for local -development. - - -## Example: Middleware configuration - -This example configures [Amazon Cloudfront](http://aws.amazon.com/cloudfront/) -as the storage middleware in a registry. Middleware allows the registry to serve -layers via a content delivery network (CDN). This reduces requests to the -storage layer. - -Cloudfront requires the S3 storage driver. - -This is the configuration expressed in YAML: - -```none -middleware: - storage: - - name: cloudfront - disabled: false - options: - baseurl: http://d111111abcdef8.cloudfront.net - privatekey: /path/to/asecret.pem - keypairid: asecret - duration: 60 -``` - -See the configuration reference for [Cloudfront](#cloudfront) for more -information about configuration options. - -> **Note**: Cloudfront keys exist separately from other AWS keys. See -> [the documentation on AWS credentials](http://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html) -> for more information. diff --git a/vendor/github.com/docker/distribution/docs/spec/api.md b/vendor/github.com/docker/distribution/docs/spec/api.md deleted file mode 100644 index 74ac8e24f..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/api.md +++ /dev/null @@ -1,5485 +0,0 @@ ---- -title: "HTTP API V2" -description: "Specification for the Registry API." -keywords: ["registry, on-prem, images, tags, repository, distribution, api, advanced"] ---- - -# Docker Registry HTTP API V2 - -## Introduction - -The _Docker Registry HTTP API_ is the protocol to facilitate distribution of -images to the docker engine. It interacts with instances of the docker -registry, which is a service to manage information about docker images and -enable their distribution. The specification covers the operation of version 2 -of this API, known as _Docker Registry HTTP API V2_. - -While the V1 registry protocol is usable, there are several problems with the -architecture that have led to this new version. The main driver of this -specification is a set of changes to the docker the image format, covered in -[docker/docker#8093](https://github.com/docker/docker/issues/8093). -The new, self-contained image manifest simplifies image definition and improves -security. This specification will build on that work, leveraging new properties -of the manifest format to improve performance, reduce bandwidth usage and -decrease the likelihood of backend corruption. - -For relevant details and history leading up to this specification, please see -the following issues: - -- [docker/docker#8093](https://github.com/docker/docker/issues/8093) -- [docker/docker#9015](https://github.com/docker/docker/issues/9015) -- [docker/docker-registry#612](https://github.com/docker/docker-registry/issues/612) - -### Scope - -This specification covers the URL layout and protocols of the interaction -between docker registry and docker core. This will affect the docker core -registry API and the rewrite of docker-registry. Docker registry -implementations may implement other API endpoints, but they are not covered by -this specification. - -This includes the following features: - -- Namespace-oriented URI Layout -- PUSH/PULL registry server for V2 image manifest format -- Resumable layer PUSH support -- V2 Client library implementation - -While authentication and authorization support will influence this -specification, details of the protocol will be left to a future specification. -Relevant header definitions and error codes are present to provide an -indication of what a client may encounter. - -#### Future - -There are features that have been discussed during the process of cutting this -specification. The following is an incomplete list: - -- Immutable image references -- Multiple architecture support -- Migration from v2compatibility representation - -These may represent features that are either out of the scope of this -specification, the purview of another specification or have been deferred to a -future version. - -### Use Cases - -For the most part, the use cases of the former registry API apply to the new -version. Differentiating use cases are covered below. - -#### Image Verification - -A docker engine instance would like to run verified image named -"library/ubuntu", with the tag "latest". The engine contacts the registry, -requesting the manifest for "library/ubuntu:latest". An untrusted registry -returns a manifest. Before proceeding to download the individual layers, the -engine verifies the manifest's signature, ensuring that the content was -produced from a trusted source and no tampering has occurred. After each layer -is downloaded, the engine verifies the digest of the layer, ensuring that the -content matches that specified by the manifest. - -#### Resumable Push - -Company X's build servers lose connectivity to docker registry before -completing an image layer transfer. After connectivity returns, the build -server attempts to re-upload the image. The registry notifies the build server -that the upload has already been partially attempted. The build server -responds by only sending the remaining data to complete the image file. - -#### Resumable Pull - -Company X is having more connectivity problems but this time in their -deployment datacenter. When downloading an image, the connection is -interrupted before completion. The client keeps the partial data and uses http -`Range` requests to avoid downloading repeated data. - -#### Layer Upload De-duplication - -Company Y's build system creates two identical docker layers from build -processes A and B. Build process A completes uploading the layer before B. -When process B attempts to upload the layer, the registry indicates that its -not necessary because the layer is already known. - -If process A and B upload the same layer at the same time, both operations -will proceed and the first to complete will be stored in the registry (Note: -we may modify this to prevent dogpile with some locking mechanism). - -### Changes - -The V2 specification has been written to work as a living document, specifying -only what is certain and leaving what is not specified open or to future -changes. Only non-conflicting additions should be made to the API and accepted -changes should avoid preventing future changes from happening. - -This section should be updated when changes are made to the specification, -indicating what is different. Optionally, we may start marking parts of the -specification to correspond with the versions enumerated here. - -Each set of changes is given a letter corresponding to a set of modifications -that were applied to the baseline specification. These are merely for -reference and shouldn't be used outside the specification other than to -identify a set of modifications. - -
-
l
-
-
    -
  • Document TOOMANYREQUESTS error code.
  • -
-
- -
k
-
-
    -
  • Document use of Accept and Content-Type headers in manifests endpoint.
  • -
-
- -
j
-
-
    -
  • Add ability to mount blobs across repositories.
  • -
-
- -
i
-
-
    -
  • Clarified expected behavior response to manifest HEAD request.
  • -
-
- -
h
-
-
    -
  • All mention of tarsum removed.
  • -
-
- -
g
-
-
    -
  • Clarify behavior of pagination behavior with unspecified parameters.
  • -
-
- -
f
-
-
    -
  • Specify the delete API for layers and manifests.
  • -
-
- -
e
-
-
    -
  • Added support for listing registry contents.
  • -
  • Added pagination to tags API.
  • -
  • Added common approach to support pagination.
  • -
-
- -
d
-
-
    -
  • Allow repository name components to be one character.
  • -
  • Clarified that single component names are allowed.
  • -
-
- -
c
-
-
    -
  • Added section covering digest format.
  • -
  • Added more clarification that manifest cannot be deleted by tag.
  • -
-
- -
b
-
-
    -
  • Added capability of doing streaming upload to PATCH blob upload.
  • -
  • Updated PUT blob upload to no longer take final chunk, now requires entire data or no data.
  • -
  • Removed `416 Requested Range Not Satisfiable` response status from PUT blob upload.
  • -
-
- -
a
-
-
    -
  • Added support for immutable manifest references in manifest endpoints.
  • -
  • Deleting a manifest by tag has been deprecated.
  • -
  • Specified `Docker-Content-Digest` header for appropriate entities.
  • -
  • Added error code for unsupported operations.
  • -
-
-
- -## Overview - -This section covers client flows and details of the API endpoints. The URI -layout of the new API is structured to support a rich authentication and -authorization model by leveraging namespaces. All endpoints will be prefixed -by the API version and the repository name: - - /v2// - -For example, an API endpoint that will work with the `library/ubuntu` -repository, the URI prefix will be: - - /v2/library/ubuntu/ - -This scheme provides rich access control over various operations and methods -using the URI prefix and http methods that can be controlled in variety of -ways. - -Classically, repository names have always been two path components where each -path component is less than 30 characters. The V2 registry API does not -enforce this. The rules for a repository name are as follows: - -1. A repository name is broken up into _path components_. A component of a - repository name must be at least one lowercase, alpha-numeric characters, - optionally separated by periods, dashes or underscores. More strictly, it - must match the regular expression `[a-z0-9]+(?:[._-][a-z0-9]+)*`. -2. If a repository name has two or more path components, they must be - separated by a forward slash ("/"). -3. The total length of a repository name, including slashes, must be less than - 256 characters. - -These name requirements _only_ apply to the registry API and should accept a -superset of what is supported by other docker ecosystem components. - -All endpoints should support aggressive http caching, compression and range -headers, where appropriate. The new API attempts to leverage HTTP semantics -where possible but may break from standards to implement targeted features. - -For detail on individual endpoints, please see the [_Detail_](#detail) -section. - -### Errors - -Actionable failure conditions, covered in detail in their relevant sections, -are reported as part of 4xx responses, in a json response body. One or more -errors will be returned in the following format: - - { - "errors:" [{ - "code": , - "message": , - "detail": - }, - ... - ] - } - -The `code` field will be a unique identifier, all caps with underscores by -convention. The `message` field will be a human readable string. The optional -`detail` field may contain arbitrary json data providing information the -client can use to resolve the issue. - -While the client can take action on certain error codes, the registry may add -new error codes over time. All client implementations should treat unknown -error codes as `UNKNOWN`, allowing future error codes to be added without -breaking API compatibility. For the purposes of the specification error codes -will only be added and never removed. - -For a complete account of all error codes, please see the [_Errors_](#errors-2) -section. - -### API Version Check - -A minimal endpoint, mounted at `/v2/` will provide version support information -based on its response statuses. The request format is as follows: - - GET /v2/ - -If a `200 OK` response is returned, the registry implements the V2(.1) -registry API and the client may proceed safely with other V2 operations. -Optionally, the response may contain information about the supported paths in -the response body. The client should be prepared to ignore this data. - -If a `401 Unauthorized` response is returned, the client should take action -based on the contents of the "WWW-Authenticate" header and try the endpoint -again. Depending on access control setup, the client may still have to -authenticate against different resources, even if this check succeeds. - -If `404 Not Found` response status, or other unexpected status, is returned, -the client should proceed with the assumption that the registry does not -implement V2 of the API. - -When a `200 OK` or `401 Unauthorized` response is returned, the -"Docker-Distribution-API-Version" header should be set to "registry/2.0". -Clients may require this header value to determine if the endpoint serves this -API. When this header is omitted, clients may fallback to an older API version. - -### Content Digests - -This API design is driven heavily by [content addressability](http://en.wikipedia.org/wiki/Content-addressable_storage). -The core of this design is the concept of a content addressable identifier. It -uniquely identifies content by taking a collision-resistant hash of the bytes. -Such an identifier can be independently calculated and verified by selection -of a common _algorithm_. If such an identifier can be communicated in a secure -manner, one can retrieve the content from an insecure source, calculate it -independently and be certain that the correct content was obtained. Put simply, -the identifier is a property of the content. - -To disambiguate from other concepts, we call this identifier a _digest_. A -_digest_ is a serialized hash result, consisting of a _algorithm_ and _hex_ -portion. The _algorithm_ identifies the methodology used to calculate the -digest. The _hex_ portion is the hex-encoded result of the hash. - -We define a _digest_ string to match the following grammar: -``` -digest := algorithm ":" hex -algorithm := /[A-Fa-f0-9_+.-]+/ -hex := /[A-Fa-f0-9]+/ -``` - -Some examples of _digests_ include the following: - -digest | description | -----------------------------------------------------------------------------------|------------------------------------------------ -sha256:6c3c624b58dbbcd3c0dd82b4c53f04194d1247c6eebdaab7c610cf7d66709b3b | Common sha256 based digest | - -While the _algorithm_ does allow one to implement a wide variety of -algorithms, compliant implementations should use sha256. Heavy processing of -input before calculating a hash is discouraged to avoid degrading the -uniqueness of the _digest_ but some canonicalization may be performed to -ensure consistent identifiers. - -Let's use a simple example in pseudo-code to demonstrate a digest calculation: -``` -let C = 'a small string' -let B = sha256(C) -let D = 'sha256:' + EncodeHex(B) -let ID(C) = D -``` - -Above, we have bytestring `C` passed into a function, `SHA256`, that returns a -bytestring `B`, which is the hash of `C`. `D` gets the algorithm concatenated -with the hex encoding of `B`. We then define the identifier of `C` to `ID(C)` -as equal to `D`. A digest can be verified by independently calculating `D` and -comparing it with identifier `ID(C)`. - -#### Digest Header - -To provide verification of http content, any response may include a -`Docker-Content-Digest` header. This will include the digest of the target -entity returned in the response. For blobs, this is the entire blob content. For -manifests, this is the manifest body without the signature content, also known -as the JWS payload. Note that the commonly used canonicalization for digest -calculation may be dependent on the mediatype of the content, such as with -manifests. - -The client may choose to ignore the header or may verify it to ensure content -integrity and transport security. This is most important when fetching by a -digest. To ensure security, the content should be verified against the digest -used to fetch the content. At times, the returned digest may differ from that -used to initiate a request. Such digests are considered to be from different -_domains_, meaning they have different values for _algorithm_. In such a case, -the client may choose to verify the digests in both domains or ignore the -server's digest. To maintain security, the client _must_ always verify the -content against the _digest_ used to fetch the content. - -> __IMPORTANT:__ If a _digest_ is used to fetch content, the client should use -> the same digest used to fetch the content to verify it. The header -> `Docker-Content-Digest` should not be trusted over the "local" digest. - -### Pulling An Image - -An "image" is a combination of a JSON manifest and individual layer files. The -process of pulling an image centers around retrieving these two components. - -The first step in pulling an image is to retrieve the manifest. For reference, -the relevant manifest fields for the registry are the following: - - field | description | -----------|------------------------------------------------| -name | The name of the image. | -tag | The tag for this version of the image. | -fsLayers | A list of layer descriptors (including digest) | -signature | A JWS used to verify the manifest content | - -For more information about the manifest format, please see -[docker/docker#8093](https://github.com/docker/docker/issues/8093). - -When the manifest is in hand, the client must verify the signature to ensure -the names and layers are valid. Once confirmed, the client will then use the -digests to download the individual layers. Layers are stored in as blobs in -the V2 registry API, keyed by their digest. - -#### Pulling an Image Manifest - -The image manifest can be fetched with the following url: - -``` -GET /v2//manifests/ -``` - -The `name` and `reference` parameter identify the image and are required. The -reference may include a tag or digest. - -The client should include an Accept header indicating which manifest content -types it supports. For more details on the manifest formats and their content -types, see [manifest-v2-1.md](manifest-v2-1.md) and -[manifest-v2-2.md](manifest-v2-2.md). In a successful response, the Content-Type -header will indicate which manifest type is being returned. - -A `404 Not Found` response will be returned if the image is unknown to the -registry. If the image exists and the response is successful, the image -manifest will be returned, with the following format (see -[docker/docker#8093](https://github.com/docker/docker/issues/8093) for details): - - { - "name": , - "tag": , - "fsLayers": [ - { - "blobSum": - }, - ... - ] - ], - "history": , - "signature": - } - -The client should verify the returned manifest signature for authenticity -before fetching layers. - -##### Existing Manifests - -The image manifest can be checked for existence with the following url: - -``` -HEAD /v2//manifests/ -``` - -The `name` and `reference` parameter identify the image and are required. The -reference may include a tag or digest. - -A `404 Not Found` response will be returned if the image is unknown to the -registry. If the image exists and the response is successful the response will -be as follows: - -``` -200 OK -Content-Length: -Docker-Content-Digest: -``` - - -#### Pulling a Layer - -Layers are stored in the blob portion of the registry, keyed by digest. -Pulling a layer is carried out by a standard http request. The URL is as -follows: - - GET /v2//blobs/ - -Access to a layer will be gated by the `name` of the repository but is -identified uniquely in the registry by `digest`. - -This endpoint may issue a 307 (302 for /blobs/uploads/ -``` - -The parameters of this request are the image namespace under which the layer -will be linked. Responses to this request are covered below. - -##### Existing Layers - -The existence of a layer can be checked via a `HEAD` request to the blob store -API. The request should be formatted as follows: - -``` -HEAD /v2//blobs/ -``` - -If the layer with the digest specified in `digest` is available, a 200 OK -response will be received, with no actual body content (this is according to -http specification). The response will look as follows: - -``` -200 OK -Content-Length: -Docker-Content-Digest: -``` - -When this response is received, the client can assume that the layer is -already available in the registry under the given name and should take no -further action to upload the layer. Note that the binary digests may differ -for the existing registry layer, but the digests will be guaranteed to match. - -##### Uploading the Layer - -If the POST request is successful, a `202 Accepted` response will be returned -with the upload URL in the `Location` header: - -``` -202 Accepted -Location: /v2//blobs/uploads/ -Range: bytes=0- -Content-Length: 0 -Docker-Upload-UUID: -``` - -The rest of the upload process can be carried out with the returned url, -called the "Upload URL" from the `Location` header. All responses to the -upload url, whether sending data or getting status, will be in this format. -Though the URI format (`/v2//blobs/uploads/`) for the `Location` -header is specified, clients should treat it as an opaque url and should never -try to assemble it. While the `uuid` parameter may be an actual UUID, this -proposal imposes no constraints on the format and clients should never impose -any. - -If clients need to correlate local upload state with remote upload state, the -contents of the `Docker-Upload-UUID` header should be used. Such an id can be -used to key the last used location header when implementing resumable uploads. - -##### Upload Progress - -The progress and chunk coordination of the upload process will be coordinated -through the `Range` header. While this is a non-standard use of the `Range` -header, there are examples of [similar approaches](https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol) in APIs with heavy use. -For an upload that just started, for an example with a 1000 byte layer file, -the `Range` header would be as follows: - -``` -Range: bytes=0-0 -``` - -To get the status of an upload, issue a GET request to the upload URL: - -``` -GET /v2//blobs/uploads/ -Host: -``` - -The response will be similar to the above, except will return 204 status: - -``` -204 No Content -Location: /v2//blobs/uploads/ -Range: bytes=0- -Docker-Upload-UUID: -``` - -Note that the HTTP `Range` header byte ranges are inclusive and that will be -honored, even in non-standard use cases. - -##### Monolithic Upload - -A monolithic upload is simply a chunked upload with a single chunk and may be -favored by clients that would like to avoided the complexity of chunking. To -carry out a "monolithic" upload, one can simply put the entire content blob to -the provided URL: - -``` -PUT /v2//blobs/uploads/?digest= -Content-Length: -Content-Type: application/octet-stream - - -``` - -The "digest" parameter must be included with the PUT request. Please see the -[_Completed Upload_](#completed-upload) section for details on the parameters -and expected responses. - -##### Chunked Upload - -To carry out an upload of a chunk, the client can specify a range header and -only include that part of the layer file: - -``` -PATCH /v2//blobs/uploads/ -Content-Length: -Content-Range: - -Content-Type: application/octet-stream - - -``` - -There is no enforcement on layer chunk splits other than that the server must -receive them in order. The server may enforce a minimum chunk size. If the -server cannot accept the chunk, a `416 Requested Range Not Satisfiable` -response will be returned and will include a `Range` header indicating the -current status: - -``` -416 Requested Range Not Satisfiable -Location: /v2//blobs/uploads/ -Range: 0- -Content-Length: 0 -Docker-Upload-UUID: -``` - -If this response is received, the client should resume from the "last valid -range" and upload the subsequent chunk. A 416 will be returned under the -following conditions: - -- Invalid Content-Range header format -- Out of order chunk: the range of the next chunk must start immediately after - the "last valid range" from the previous response. - -When a chunk is accepted as part of the upload, a `202 Accepted` response will -be returned, including a `Range` header with the current upload status: - -``` -202 Accepted -Location: /v2//blobs/uploads/ -Range: bytes=0- -Content-Length: 0 -Docker-Upload-UUID: -``` - -##### Completed Upload - -For an upload to be considered complete, the client must submit a `PUT` -request on the upload endpoint with a digest parameter. If it is not provided, -the upload will not be considered complete. The format for the final chunk -will be as follows: - -``` -PUT /v2//blob/uploads/?digest= -Content-Length: -Content-Range: - -Content-Type: application/octet-stream - - -``` - -Optionally, if all chunks have already been uploaded, a `PUT` request with a -`digest` parameter and zero-length body may be sent to complete and validated -the upload. Multiple "digest" parameters may be provided with different -digests. The server may verify none or all of them but _must_ notify the -client if the content is rejected. - -When the last chunk is received and the layer has been validated, the client -will receive a `201 Created` response: - -``` -201 Created -Location: /v2//blobs/ -Content-Length: 0 -Docker-Content-Digest: -``` - -The `Location` header will contain the registry URL to access the accepted -layer file. The `Docker-Content-Digest` header returns the canonical digest of -the uploaded blob which may differ from the provided digest. Most clients may -ignore the value but if it is used, the client should verify the value against -the uploaded blob data. - -###### Digest Parameter - -The "digest" parameter is designed as an opaque parameter to support -verification of a successful transfer. For example, an HTTP URI parameter -might be as follows: - -``` -sha256:6c3c624b58dbbcd3c0dd82b4c53f04194d1247c6eebdaab7c610cf7d66709b3b -``` - -Given this parameter, the registry will verify that the provided content does -match this digest. - -##### Canceling an Upload - -An upload can be cancelled by issuing a DELETE request to the upload endpoint. -The format will be as follows: - -``` -DELETE /v2//blobs/uploads/ -``` - -After this request is issued, the upload uuid will no longer be valid and the -registry server will dump all intermediate data. While uploads will time out -if not completed, clients should issue this request if they encounter a fatal -error but still have the ability to issue an http request. - -##### Cross Repository Blob Mount - -A blob may be mounted from another repository that the client has read access -to, removing the need to upload a blob already known to the registry. To issue -a blob mount instead of an upload, a POST request should be issued in the -following format: - -``` -POST /v2//blobs/uploads/?mount=&from= -Content-Length: 0 -``` - -If the blob is successfully mounted, the client will receive a `201 Created` -response: - -``` -201 Created -Location: /v2//blobs/ -Content-Length: 0 -Docker-Content-Digest: -``` - -The `Location` header will contain the registry URL to access the accepted -layer file. The `Docker-Content-Digest` header returns the canonical digest of -the uploaded blob which may differ from the provided digest. Most clients may -ignore the value but if it is used, the client should verify the value against -the uploaded blob data. - -If a mount fails due to invalid repository or digest arguments, the registry -will fall back to the standard upload behavior and return a `202 Accepted` with -the upload URL in the `Location` header: - -``` -202 Accepted -Location: /v2//blobs/uploads/ -Range: bytes=0- -Content-Length: 0 -Docker-Upload-UUID: -``` - -This behavior is consistent with older versions of the registry, which do not -recognize the repository mount query parameters. - -Note: a client may issue a HEAD request to check existence of a blob in a source -repository to distinguish between the registry not supporting blob mounts and -the blob not existing in the expected repository. - -##### Errors - -If an 502, 503 or 504 error is received, the client should assume that the -download can proceed due to a temporary condition, honoring the appropriate -retry mechanism. Other 5xx errors should be treated as terminal. - -If there is a problem with the upload, a 4xx error will be returned indicating -the problem. After receiving a 4xx response (except 416, as called out above), -the upload will be considered failed and the client should take appropriate -action. - -Note that the upload url will not be available forever. If the upload uuid is -unknown to the registry, a `404 Not Found` response will be returned and the -client must restart the upload process. - -### Deleting a Layer - -A layer may be deleted from the registry via its `name` and `digest`. A -delete may be issued with the following request format: - - DELETE /v2//blobs/ - -If the blob exists and has been successfully deleted, the following response -will be issued: - - 202 Accepted - Content-Length: None - -If the blob had already been deleted or did not exist, a `404 Not Found` -response will be issued instead. - -If a layer is deleted which is referenced by a manifest in the registry, -then the complete images will not be resolvable. - -#### Pushing an Image Manifest - -Once all of the layers for an image are uploaded, the client can upload the -image manifest. An image can be pushed using the following request format: - - PUT /v2//manifests/ - Content-Type: - - { - "name": , - "tag": , - "fsLayers": [ - { - "blobSum": - }, - ... - ] - ], - "history": , - "signature": , - ... - } - -The `name` and `reference` fields of the response body must match those -specified in the URL. The `reference` field may be a "tag" or a "digest". The -content type should match the type of the manifest being uploaded, as specified -in [manifest-v2-1.md](manifest-v2-1.md) and [manifest-v2-2.md](manifest-v2-2.md). - -If there is a problem with pushing the manifest, a relevant 4xx response will -be returned with a JSON error message. Please see the -[_PUT Manifest_](#put-manifest) section for details on possible error codes that -may be returned. - -If one or more layers are unknown to the registry, `BLOB_UNKNOWN` errors are -returned. The `detail` field of the error response will have a `digest` field -identifying the missing blob. An error is returned for each unknown blob. The -response format is as follows: - - { - "errors:" [{ - "code": "BLOB_UNKNOWN", - "message": "blob unknown to registry", - "detail": { - "digest": - } - }, - ... - ] - } - -### Listing Repositories - -Images are stored in collections, known as a _repository_, which is keyed by a -`name`, as seen throughout the API specification. A registry instance may -contain several repositories. The list of available repositories is made -available through the _catalog_. - -The catalog for a given registry can be retrieved with the following request: - -``` -GET /v2/_catalog -``` - -The response will be in the following format: - -``` -200 OK -Content-Type: application/json - -{ - "repositories": [ - , - ... - ] -} -``` - -Note that the contents of the response are specific to the registry -implementation. Some registries may opt to provide a full catalog output, -limit it based on the user's access level or omit upstream results, if -providing mirroring functionality. Subsequently, the presence of a repository -in the catalog listing only means that the registry *may* provide access to -the repository at the time of the request. Conversely, a missing entry does -*not* mean that the registry does not have the repository. More succinctly, -the presence of a repository only guarantees that it is there but not that it -is _not_ there. - -For registries with a large number of repositories, this response may be quite -large. If such a response is expected, one should use pagination. A registry -may also limit the amount of responses returned even if pagination was not -explicitly requested. In this case the `Link` header will be returned along -with the results, and subsequent results can be obtained by following the link -as if pagination had been initially requested. - -For details of the `Link` header, please see the [_Pagination_](#pagination) -section. - -#### Pagination - -Paginated catalog results can be retrieved by adding an `n` parameter to the -request URL, declaring that the response should be limited to `n` results. -Starting a paginated flow begins as follows: - -``` -GET /v2/_catalog?n= -``` - -The above specifies that a catalog response should be returned, from the start of -the result set, ordered lexically, limiting the number of results to `n`. The -response to such a request would look as follows: - -``` -200 OK -Content-Type: application/json -Link: <?n=&last=>; rel="next" - -{ - "repositories": [ - , - ... - ] -} -``` - -The above includes the _first_ `n` entries from the result set. To get the -_next_ `n` entries, one can create a URL where the argument `last` has the -value from `repositories[len(repositories)-1]`. If there are indeed more -results, the URL for the next block is encoded in an -[RFC5988](https://tools.ietf.org/html/rfc5988) `Link` header, as a "next" -relation. The presence of the `Link` header communicates to the client that -the entire result set has not been returned and another request must be -issued. If the header is not present, the client can assume that all results -have been received. - -> __NOTE:__ In the request template above, note that the brackets -> are required. For example, if the url is -> `http://example.com/v2/_catalog?n=20&last=b`, the value of the header would -> be `; rel="next"`. Please see -> [RFC5988](https://tools.ietf.org/html/rfc5988) for details. - -Compliant client implementations should always use the `Link` header -value when proceeding through results linearly. The client may construct URLs -to skip forward in the catalog. - -To get the next result set, a client would issue the request as follows, using -the URL encoded in the described `Link` header: - -``` -GET /v2/_catalog?n=&last= -``` - -The above process should then be repeated until the `Link` header is no longer -set. - -The catalog result set is represented abstractly as a lexically sorted list, -where the position in that list can be specified by the query term `last`. The -entries in the response start _after_ the term specified by `last`, up to `n` -entries. - -The behavior of `last` is quite simple when demonstrated with an example. Let -us say the registry has the following repositories: - -``` -a -b -c -d -``` - -If the value of `n` is 2, _a_ and _b_ will be returned on the first response. -The `Link` header returned on the response will have `n` set to 2 and last set -to _b_: - -``` -Link: <?n=2&last=b>; rel="next" -``` - -The client can then issue the request with the above value from the `Link` -header, receiving the values _c_ and _d_. Note that `n` may change on the second -to last response or be fully omitted, depending on the server implementation. - -### Listing Image Tags - -It may be necessary to list all of the tags under a given repository. The tags -for an image repository can be retrieved with the following request: - - GET /v2//tags/list - -The response will be in the following format: - - 200 OK - Content-Type: application/json - - { - "name": , - "tags": [ - , - ... - ] - } - -For repositories with a large number of tags, this response may be quite -large. If such a response is expected, one should use the pagination. - -#### Pagination - -Paginated tag results can be retrieved by adding the appropriate parameters to -the request URL described above. The behavior of tag pagination is identical -to that specified for catalog pagination. We cover a simple flow to highlight -any differences. - -Starting a paginated flow may begin as follows: - -``` -GET /v2//tags/list?n= -``` - -The above specifies that a tags response should be returned, from the start of -the result set, ordered lexically, limiting the number of results to `n`. The -response to such a request would look as follows: - -``` -200 OK -Content-Type: application/json -Link: <?n=&last=>; rel="next" - -{ - "name": , - "tags": [ - , - ... - ] -} -``` - -To get the next result set, a client would issue the request as follows, using -the value encoded in the [RFC5988](https://tools.ietf.org/html/rfc5988) `Link` -header: - -``` -GET /v2//tags/list?n=&last= -``` - -The above process should then be repeated until the `Link` header is no longer -set in the response. The behavior of the `last` parameter, the provided -response result, lexical ordering and encoding of the `Link` header are -identical to that of catalog pagination. - -### Deleting an Image - -An image may be deleted from the registry via its `name` and `reference`. A -delete may be issued with the following request format: - - DELETE /v2//manifests/ - -For deletes, `reference` *must* be a digest or the delete will fail. If the -image exists and has been successfully deleted, the following response will be -issued: - - 202 Accepted - Content-Length: None - -If the image had already been deleted or did not exist, a `404 Not Found` -response will be issued instead. - -> **Note** When deleting a manifest from a registry version 2.3 or later, the -> following header must be used when `HEAD` or `GET`-ing the manifest to obtain -> the correct digest to delete: - - Accept: application/vnd.docker.distribution.manifest.v2+json - -> for more details, see: [compatibility.md](../compatibility.md#content-addressable-storage-cas) - -## Detail - -> **Note**: This section is still under construction. For the purposes of -> implementation, if any details below differ from the described request flows -> above, the section below should be corrected. When they match, this note -> should be removed. - -The behavior of the endpoints are covered in detail in this section, organized -by route and entity. All aspects of the request and responses are covered, -including headers, parameters and body formats. Examples of requests and their -corresponding responses, with success and failure, are enumerated. - -> **Note**: The sections on endpoint detail are arranged with an example -> request, a description of the request, followed by information about that -> request. - -A list of methods and URIs are covered in the table below: - -|Method|Path|Entity|Description| -|------|----|------|-----------| -| GET | `/v2/` | Base | Check that the endpoint implements Docker Registry API V2. | -| GET | `/v2//tags/list` | Tags | Fetch the tags under the repository identified by `name`. | -| GET | `/v2//manifests/` | Manifest | Fetch the manifest identified by `name` and `reference` where `reference` can be a tag or digest. A `HEAD` request can also be issued to this endpoint to obtain resource information without receiving all data. | -| PUT | `/v2//manifests/` | Manifest | Put the manifest identified by `name` and `reference` where `reference` can be a tag or digest. | -| DELETE | `/v2//manifests/` | Manifest | Delete the manifest identified by `name` and `reference`. Note that a manifest can _only_ be deleted by `digest`. | -| GET | `/v2//blobs/` | Blob | Retrieve the blob from the registry identified by `digest`. A `HEAD` request can also be issued to this endpoint to obtain resource information without receiving all data. | -| DELETE | `/v2//blobs/` | Blob | Delete the blob identified by `name` and `digest` | -| POST | `/v2//blobs/uploads/` | Initiate Blob Upload | Initiate a resumable blob upload. If successful, an upload location will be provided to complete the upload. Optionally, if the `digest` parameter is present, the request body will be used to complete the upload in a single request. | -| GET | `/v2//blobs/uploads/` | Blob Upload | Retrieve status of upload identified by `uuid`. The primary purpose of this endpoint is to resolve the current status of a resumable upload. | -| PATCH | `/v2//blobs/uploads/` | Blob Upload | Upload a chunk of data for the specified upload. | -| PUT | `/v2//blobs/uploads/` | Blob Upload | Complete the upload specified by `uuid`, optionally appending the body as the final chunk. | -| DELETE | `/v2//blobs/uploads/` | Blob Upload | Cancel outstanding upload processes, releasing associated resources. If this is not called, the unfinished uploads will eventually timeout. | -| GET | `/v2/_catalog` | Catalog | Retrieve a sorted, json list of repositories available in the registry. | - - -The detail for each endpoint is covered in the following sections. - -### Errors - -The error codes encountered via the API are enumerated in the following table: - -|Code|Message|Description| -|----|-------|-----------| - `BLOB_UNKNOWN` | blob unknown to registry | This error may be returned when a blob is unknown to the registry in a specified repository. This can be returned with a standard get or if a manifest references an unknown layer during upload. - `BLOB_UPLOAD_INVALID` | blob upload invalid | The blob upload encountered an error and can no longer proceed. - `BLOB_UPLOAD_UNKNOWN` | blob upload unknown to registry | If a blob upload has been cancelled or was never started, this error code may be returned. - `DIGEST_INVALID` | provided digest did not match uploaded content | When a blob is uploaded, the registry will check that the content matches the digest provided by the client. The error may include a detail structure with the key "digest", including the invalid digest string. This error may also be returned when a manifest includes an invalid layer digest. - `MANIFEST_BLOB_UNKNOWN` | blob unknown to registry | This error may be returned when a manifest blob is unknown to the registry. - `MANIFEST_INVALID` | manifest invalid | During upload, manifests undergo several checks ensuring validity. If those checks fail, this error may be returned, unless a more specific error is included. The detail will contain information the failed validation. - `MANIFEST_UNKNOWN` | manifest unknown | This error is returned when the manifest, identified by name and tag is unknown to the repository. - `MANIFEST_UNVERIFIED` | manifest failed signature verification | During manifest upload, if the manifest fails signature verification, this error will be returned. - `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. - `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. - `SIZE_INVALID` | provided length did not match content length | When a layer is uploaded, the provided size will be checked against the uploaded content. If they do not match, this error will be returned. - `TAG_INVALID` | manifest tag did not match URI | During a manifest upload, if the tag in the manifest does not match the uri tag, this error will be returned. - `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. - `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. - `UNSUPPORTED` | The operation is unsupported. | The operation was unsupported due to a missing implementation or invalid set of parameters. - - - -### Base - -Base V2 API route. Typically, this can be used for lightweight version checks and to validate registry authentication. - - - -#### GET Base - -Check that the endpoint implements Docker Registry API V2. - - - -``` -GET /v2/ -Host: -Authorization: -``` - - - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| - - - - -###### On Success: OK - -``` -200 OK -``` - -The API implements V2 protocol and is accessible. - - - - -###### On Failure: Not Found - -``` -404 Not Found -``` - -The registry does not implement the V2 API. - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - - - -### Tags - -Retrieve information about tags. - - - -#### GET Tags - -Fetch the tags under the repository identified by `name`. - - -##### Tags - -``` -GET /v2//tags/list -Host: -Authorization: -``` - -Return all tags for the repository - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`name`|path|Name of the target repository.| - - - - -###### On Success: OK - -``` -200 OK -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "name": , - "tags": [ - , - ... - ] -} -``` - -A list of tags for the named repository. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - -##### Tags Paginated - -``` -GET /v2//tags/list?n=&last= -``` - -Return a portion of the tags for the specified repository. - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`name`|path|Name of the target repository.| -|`n`|query|Limit the number of entries in each response. It not present, all entries will be returned.| -|`last`|query|Result set will include values lexically after last.| - - - - -###### On Success: OK - -``` -200 OK -Content-Length: -Link: <?n=&last=>; rel="next" -Content-Type: application/json; charset=utf-8 - -{ - "name": , - "tags": [ - , - ... - ], -} -``` - -A list of tags for the named repository. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| -|`Link`|RFC5988 compliant rel='next' with URL to next result set, if available| - - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - - - -### Manifest - -Create, update, delete and retrieve manifests. - - - -#### GET Manifest - -Fetch the manifest identified by `name` and `reference` where `reference` can be a tag or digest. A `HEAD` request can also be issued to this endpoint to obtain resource information without receiving all data. - - - -``` -GET /v2//manifests/ -Host: -Authorization: -``` - - - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`name`|path|Name of the target repository.| -|`reference`|path|Tag or digest of the target manifest.| - - - - -###### On Success: OK - -``` -200 OK -Docker-Content-Digest: -Content-Type: - -{ - "name": , - "tag": , - "fsLayers": [ - { - "blobSum": "" - }, - ... - ] - ], - "history": , - "signature": -} -``` - -The manifest identified by `name` and `reference`. The contents can be used to identify and resolve resources required to run the specified image. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Docker-Content-Digest`|Digest of the targeted content for the request.| - - - - -###### On Failure: Bad Request - -``` -400 Bad Request -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The name or reference was invalid. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | -| `TAG_INVALID` | manifest tag did not match URI | During a manifest upload, if the tag in the manifest does not match the uri tag, this error will be returned. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - - -#### PUT Manifest - -Put the manifest identified by `name` and `reference` where `reference` can be a tag or digest. - - - -``` -PUT /v2//manifests/ -Host: -Authorization: -Content-Type: - -{ - "name": , - "tag": , - "fsLayers": [ - { - "blobSum": "" - }, - ... - ] - ], - "history": , - "signature": -} -``` - - - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`name`|path|Name of the target repository.| -|`reference`|path|Tag or digest of the target manifest.| - - - - -###### On Success: Created - -``` -201 Created -Location: -Content-Length: 0 -Docker-Content-Digest: -``` - -The manifest has been accepted by the registry and is stored under the specified `name` and `tag`. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Location`|The canonical location url of the uploaded manifest.| -|`Content-Length`|The `Content-Length` header must be zero and the body must be empty.| -|`Docker-Content-Digest`|Digest of the targeted content for the request.| - - - - -###### On Failure: Invalid Manifest - -``` -400 Bad Request -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The received manifest was invalid in some way, as described by the error codes. The client should resolve the issue and retry the request. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | -| `TAG_INVALID` | manifest tag did not match URI | During a manifest upload, if the tag in the manifest does not match the uri tag, this error will be returned. | -| `MANIFEST_INVALID` | manifest invalid | During upload, manifests undergo several checks ensuring validity. If those checks fail, this error may be returned, unless a more specific error is included. The detail will contain information the failed validation. | -| `MANIFEST_UNVERIFIED` | manifest failed signature verification | During manifest upload, if the manifest fails signature verification, this error will be returned. | -| `BLOB_UNKNOWN` | blob unknown to registry | This error may be returned when a blob is unknown to the registry in a specified repository. This can be returned with a standard get or if a manifest references an unknown layer during upload. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - -###### On Failure: Missing Layer(s) - -``` -400 Bad Request -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [{ - "code": "BLOB_UNKNOWN", - "message": "blob unknown to registry", - "detail": { - "digest": "" - } - }, - ... - ] -} -``` - -One or more layers may be missing during a manifest upload. If so, the missing layers will be enumerated in the error response. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `BLOB_UNKNOWN` | blob unknown to registry | This error may be returned when a blob is unknown to the registry in a specified repository. This can be returned with a standard get or if a manifest references an unknown layer during upload. | - - - -###### On Failure: Not allowed - -``` -405 Method Not Allowed -``` - -Manifest put is not allowed because the registry is configured as a pull-through cache or for some other reason - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNSUPPORTED` | The operation is unsupported. | The operation was unsupported due to a missing implementation or invalid set of parameters. | - - - - -#### DELETE Manifest - -Delete the manifest identified by `name` and `reference`. Note that a manifest can _only_ be deleted by `digest`. - - - -``` -DELETE /v2//manifests/ -Host: -Authorization: -``` - - - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`name`|path|Name of the target repository.| -|`reference`|path|Tag or digest of the target manifest.| - - - - -###### On Success: Accepted - -``` -202 Accepted -``` - - - - - - -###### On Failure: Invalid Name or Reference - -``` -400 Bad Request -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The specified `name` or `reference` were invalid and the delete was unable to proceed. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | -| `TAG_INVALID` | manifest tag did not match URI | During a manifest upload, if the tag in the manifest does not match the uri tag, this error will be returned. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - -###### On Failure: Unknown Manifest - -``` -404 Not Found -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The specified `name` or `reference` are unknown to the registry and the delete was unable to proceed. Clients can assume the manifest was already deleted if this response is returned. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | -| `MANIFEST_UNKNOWN` | manifest unknown | This error is returned when the manifest, identified by name and tag is unknown to the repository. | - - - -###### On Failure: Not allowed - -``` -405 Method Not Allowed -``` - -Manifest delete is not allowed because the registry is configured as a pull-through cache or `delete` has been disabled. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNSUPPORTED` | The operation is unsupported. | The operation was unsupported due to a missing implementation or invalid set of parameters. | - - - - - -### Blob - -Operations on blobs identified by `name` and `digest`. Used to fetch or delete layers by digest. - - - -#### GET Blob - -Retrieve the blob from the registry identified by `digest`. A `HEAD` request can also be issued to this endpoint to obtain resource information without receiving all data. - - -##### Fetch Blob - -``` -GET /v2//blobs/ -Host: -Authorization: -``` - - - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`name`|path|Name of the target repository.| -|`digest`|path|Digest of desired blob.| - - - - -###### On Success: OK - -``` -200 OK -Content-Length: -Docker-Content-Digest: -Content-Type: application/octet-stream - - -``` - -The blob identified by `digest` is available. The blob content will be present in the body of the request. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|The length of the requested blob content.| -|`Docker-Content-Digest`|Digest of the targeted content for the request.| - -###### On Success: Temporary Redirect - -``` -307 Temporary Redirect -Location: -Docker-Content-Digest: -``` - -The blob identified by `digest` is available at the provided location. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Location`|The location where the layer should be accessible.| -|`Docker-Content-Digest`|Digest of the targeted content for the request.| - - - - -###### On Failure: Bad Request - -``` -400 Bad Request -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -There was a problem with the request that needs to be addressed by the client, such as an invalid `name` or `tag`. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | -| `DIGEST_INVALID` | provided digest did not match uploaded content | When a blob is uploaded, the registry will check that the content matches the digest provided by the client. The error may include a detail structure with the key "digest", including the invalid digest string. This error may also be returned when a manifest includes an invalid layer digest. | - - - -###### On Failure: Not Found - -``` -404 Not Found -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The blob, identified by `name` and `digest`, is unknown to the registry. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | -| `BLOB_UNKNOWN` | blob unknown to registry | This error may be returned when a blob is unknown to the registry in a specified repository. This can be returned with a standard get or if a manifest references an unknown layer during upload. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - -##### Fetch Blob Part - -``` -GET /v2//blobs/ -Host: -Authorization: -Range: bytes=- -``` - -This endpoint may also support RFC7233 compliant range requests. Support can be detected by issuing a HEAD request. If the header `Accept-Range: bytes` is returned, range requests can be used to fetch partial content. - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`Range`|header|HTTP Range header specifying blob chunk.| -|`name`|path|Name of the target repository.| -|`digest`|path|Digest of desired blob.| - - - - -###### On Success: Partial Content - -``` -206 Partial Content -Content-Length: -Content-Range: bytes -/ -Content-Type: application/octet-stream - - -``` - -The blob identified by `digest` is available. The specified chunk of blob content will be present in the body of the request. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|The length of the requested blob chunk.| -|`Content-Range`|Content range of blob chunk.| - - - - -###### On Failure: Bad Request - -``` -400 Bad Request -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -There was a problem with the request that needs to be addressed by the client, such as an invalid `name` or `tag`. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | -| `DIGEST_INVALID` | provided digest did not match uploaded content | When a blob is uploaded, the registry will check that the content matches the digest provided by the client. The error may include a detail structure with the key "digest", including the invalid digest string. This error may also be returned when a manifest includes an invalid layer digest. | - - - -###### On Failure: Not Found - -``` -404 Not Found -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - - - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | -| `BLOB_UNKNOWN` | blob unknown to registry | This error may be returned when a blob is unknown to the registry in a specified repository. This can be returned with a standard get or if a manifest references an unknown layer during upload. | - - - -###### On Failure: Requested Range Not Satisfiable - -``` -416 Requested Range Not Satisfiable -``` - -The range specification cannot be satisfied for the requested content. This can happen when the range is not formatted correctly or if the range is outside of the valid size of the content. - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - - -#### DELETE Blob - -Delete the blob identified by `name` and `digest` - - - -``` -DELETE /v2//blobs/ -Host: -Authorization: -``` - - - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`name`|path|Name of the target repository.| -|`digest`|path|Digest of desired blob.| - - - - -###### On Success: Accepted - -``` -202 Accepted -Content-Length: 0 -Docker-Content-Digest: -``` - - - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|0| -|`Docker-Content-Digest`|Digest of the targeted content for the request.| - - - - -###### On Failure: Invalid Name or Digest - -``` -400 Bad Request -``` - - - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DIGEST_INVALID` | provided digest did not match uploaded content | When a blob is uploaded, the registry will check that the content matches the digest provided by the client. The error may include a detail structure with the key "digest", including the invalid digest string. This error may also be returned when a manifest includes an invalid layer digest. | -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | - - - -###### On Failure: Not Found - -``` -404 Not Found -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The blob, identified by `name` and `digest`, is unknown to the registry. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | -| `BLOB_UNKNOWN` | blob unknown to registry | This error may be returned when a blob is unknown to the registry in a specified repository. This can be returned with a standard get or if a manifest references an unknown layer during upload. | - - - -###### On Failure: Method Not Allowed - -``` -405 Method Not Allowed -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -Blob delete is not allowed because the registry is configured as a pull-through cache or `delete` has been disabled - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNSUPPORTED` | The operation is unsupported. | The operation was unsupported due to a missing implementation or invalid set of parameters. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - - - -### Initiate Blob Upload - -Initiate a blob upload. This endpoint can be used to create resumable uploads or monolithic uploads. - - - -#### POST Initiate Blob Upload - -Initiate a resumable blob upload. If successful, an upload location will be provided to complete the upload. Optionally, if the `digest` parameter is present, the request body will be used to complete the upload in a single request. - - -##### Initiate Monolithic Blob Upload - -``` -POST /v2//blobs/uploads/?digest= -Host: -Authorization: -Content-Length: -Content-Type: application/octect-stream - - -``` - -Upload a blob identified by the `digest` parameter in single request. This upload will not be resumable unless a recoverable error is returned. - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`Content-Length`|header|| -|`name`|path|Name of the target repository.| -|`digest`|query|Digest of uploaded blob. If present, the upload will be completed, in a single request, with contents of the request body as the resulting blob.| - - - - -###### On Success: Created - -``` -201 Created -Location: -Content-Length: 0 -Docker-Upload-UUID: -``` - -The blob has been created in the registry and is available at the provided location. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Location`|| -|`Content-Length`|The `Content-Length` header must be zero and the body must be empty.| -|`Docker-Upload-UUID`|Identifies the docker upload uuid for the current request.| - - - - -###### On Failure: Invalid Name or Digest - -``` -400 Bad Request -``` - - - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DIGEST_INVALID` | provided digest did not match uploaded content | When a blob is uploaded, the registry will check that the content matches the digest provided by the client. The error may include a detail structure with the key "digest", including the invalid digest string. This error may also be returned when a manifest includes an invalid layer digest. | -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | - - - -###### On Failure: Not allowed - -``` -405 Method Not Allowed -``` - -Blob upload is not allowed because the registry is configured as a pull-through cache or for some other reason - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNSUPPORTED` | The operation is unsupported. | The operation was unsupported due to a missing implementation or invalid set of parameters. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - -##### Initiate Resumable Blob Upload - -``` -POST /v2//blobs/uploads/ -Host: -Authorization: -Content-Length: 0 -``` - -Initiate a resumable blob upload with an empty request body. - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`Content-Length`|header|The `Content-Length` header must be zero and the body must be empty.| -|`name`|path|Name of the target repository.| - - - - -###### On Success: Accepted - -``` -202 Accepted -Content-Length: 0 -Location: /v2//blobs/uploads/ -Range: 0-0 -Docker-Upload-UUID: -``` - -The upload has been created. The `Location` header must be used to complete the upload. The response should be identical to a `GET` request on the contents of the returned `Location` header. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|The `Content-Length` header must be zero and the body must be empty.| -|`Location`|The location of the created upload. Clients should use the contents verbatim to complete the upload, adding parameters where required.| -|`Range`|Range header indicating the progress of the upload. When starting an upload, it will return an empty range, since no content has been received.| -|`Docker-Upload-UUID`|Identifies the docker upload uuid for the current request.| - - - - -###### On Failure: Invalid Name or Digest - -``` -400 Bad Request -``` - - - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DIGEST_INVALID` | provided digest did not match uploaded content | When a blob is uploaded, the registry will check that the content matches the digest provided by the client. The error may include a detail structure with the key "digest", including the invalid digest string. This error may also be returned when a manifest includes an invalid layer digest. | -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - -##### Mount Blob - -``` -POST /v2//blobs/uploads/?mount=&from= -Host: -Authorization: -Content-Length: 0 -``` - -Mount a blob identified by the `mount` parameter from another repository. - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`Content-Length`|header|The `Content-Length` header must be zero and the body must be empty.| -|`name`|path|Name of the target repository.| -|`mount`|query|Digest of blob to mount from the source repository.| -|`from`|query|Name of the source repository.| - - - - -###### On Success: Created - -``` -201 Created -Location: -Content-Length: 0 -Docker-Upload-UUID: -``` - -The blob has been mounted in the repository and is available at the provided location. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Location`|| -|`Content-Length`|The `Content-Length` header must be zero and the body must be empty.| -|`Docker-Upload-UUID`|Identifies the docker upload uuid for the current request.| - - - - -###### On Failure: Invalid Name or Digest - -``` -400 Bad Request -``` - - - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DIGEST_INVALID` | provided digest did not match uploaded content | When a blob is uploaded, the registry will check that the content matches the digest provided by the client. The error may include a detail structure with the key "digest", including the invalid digest string. This error may also be returned when a manifest includes an invalid layer digest. | -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | - - - -###### On Failure: Not allowed - -``` -405 Method Not Allowed -``` - -Blob mount is not allowed because the registry is configured as a pull-through cache or for some other reason - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNSUPPORTED` | The operation is unsupported. | The operation was unsupported due to a missing implementation or invalid set of parameters. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - - - -### Blob Upload - -Interact with blob uploads. Clients should never assemble URLs for this endpoint and should only take it through the `Location` header on related API requests. The `Location` header and its parameters should be preserved by clients, using the latest value returned via upload related API calls. - - - -#### GET Blob Upload - -Retrieve status of upload identified by `uuid`. The primary purpose of this endpoint is to resolve the current status of a resumable upload. - - - -``` -GET /v2//blobs/uploads/ -Host: -Authorization: -``` - -Retrieve the progress of the current upload, as reported by the `Range` header. - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`name`|path|Name of the target repository.| -|`uuid`|path|A uuid identifying the upload. This field can accept characters that match `[a-zA-Z0-9-_.=]+`.| - - - - -###### On Success: Upload Progress - -``` -204 No Content -Range: 0- -Content-Length: 0 -Docker-Upload-UUID: -``` - -The upload is known and in progress. The last received offset is available in the `Range` header. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Range`|Range indicating the current progress of the upload.| -|`Content-Length`|The `Content-Length` header must be zero and the body must be empty.| -|`Docker-Upload-UUID`|Identifies the docker upload uuid for the current request.| - - - - -###### On Failure: Bad Request - -``` -400 Bad Request -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -There was an error processing the upload and it must be restarted. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DIGEST_INVALID` | provided digest did not match uploaded content | When a blob is uploaded, the registry will check that the content matches the digest provided by the client. The error may include a detail structure with the key "digest", including the invalid digest string. This error may also be returned when a manifest includes an invalid layer digest. | -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | -| `BLOB_UPLOAD_INVALID` | blob upload invalid | The blob upload encountered an error and can no longer proceed. | - - - -###### On Failure: Not Found - -``` -404 Not Found -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The upload is unknown to the registry. The upload must be restarted. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `BLOB_UPLOAD_UNKNOWN` | blob upload unknown to registry | If a blob upload has been cancelled or was never started, this error code may be returned. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - - -#### PATCH Blob Upload - -Upload a chunk of data for the specified upload. - - -##### Stream upload - -``` -PATCH /v2//blobs/uploads/ -Host: -Authorization: -Content-Type: application/octet-stream - - -``` - -Upload a stream of data to upload without completing the upload. - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`name`|path|Name of the target repository.| -|`uuid`|path|A uuid identifying the upload. This field can accept characters that match `[a-zA-Z0-9-_.=]+`.| - - - - -###### On Success: Data Accepted - -``` -204 No Content -Location: /v2//blobs/uploads/ -Range: 0- -Content-Length: 0 -Docker-Upload-UUID: -``` - -The stream of data has been accepted and the current progress is available in the range header. The updated upload location is available in the `Location` header. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Location`|The location of the upload. Clients should assume this changes after each request. Clients should use the contents verbatim to complete the upload, adding parameters where required.| -|`Range`|Range indicating the current progress of the upload.| -|`Content-Length`|The `Content-Length` header must be zero and the body must be empty.| -|`Docker-Upload-UUID`|Identifies the docker upload uuid for the current request.| - - - - -###### On Failure: Bad Request - -``` -400 Bad Request -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -There was an error processing the upload and it must be restarted. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DIGEST_INVALID` | provided digest did not match uploaded content | When a blob is uploaded, the registry will check that the content matches the digest provided by the client. The error may include a detail structure with the key "digest", including the invalid digest string. This error may also be returned when a manifest includes an invalid layer digest. | -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | -| `BLOB_UPLOAD_INVALID` | blob upload invalid | The blob upload encountered an error and can no longer proceed. | - - - -###### On Failure: Not Found - -``` -404 Not Found -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The upload is unknown to the registry. The upload must be restarted. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `BLOB_UPLOAD_UNKNOWN` | blob upload unknown to registry | If a blob upload has been cancelled or was never started, this error code may be returned. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - -##### Chunked upload - -``` -PATCH /v2//blobs/uploads/ -Host: -Authorization: -Content-Range: - -Content-Length: -Content-Type: application/octet-stream - - -``` - -Upload a chunk of data to specified upload without completing the upload. The data will be uploaded to the specified Content Range. - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`Content-Range`|header|Range of bytes identifying the desired block of content represented by the body. Start must the end offset retrieved via status check plus one. Note that this is a non-standard use of the `Content-Range` header.| -|`Content-Length`|header|Length of the chunk being uploaded, corresponding the length of the request body.| -|`name`|path|Name of the target repository.| -|`uuid`|path|A uuid identifying the upload. This field can accept characters that match `[a-zA-Z0-9-_.=]+`.| - - - - -###### On Success: Chunk Accepted - -``` -204 No Content -Location: /v2//blobs/uploads/ -Range: 0- -Content-Length: 0 -Docker-Upload-UUID: -``` - -The chunk of data has been accepted and the current progress is available in the range header. The updated upload location is available in the `Location` header. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Location`|The location of the upload. Clients should assume this changes after each request. Clients should use the contents verbatim to complete the upload, adding parameters where required.| -|`Range`|Range indicating the current progress of the upload.| -|`Content-Length`|The `Content-Length` header must be zero and the body must be empty.| -|`Docker-Upload-UUID`|Identifies the docker upload uuid for the current request.| - - - - -###### On Failure: Bad Request - -``` -400 Bad Request -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -There was an error processing the upload and it must be restarted. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DIGEST_INVALID` | provided digest did not match uploaded content | When a blob is uploaded, the registry will check that the content matches the digest provided by the client. The error may include a detail structure with the key "digest", including the invalid digest string. This error may also be returned when a manifest includes an invalid layer digest. | -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | -| `BLOB_UPLOAD_INVALID` | blob upload invalid | The blob upload encountered an error and can no longer proceed. | - - - -###### On Failure: Not Found - -``` -404 Not Found -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The upload is unknown to the registry. The upload must be restarted. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `BLOB_UPLOAD_UNKNOWN` | blob upload unknown to registry | If a blob upload has been cancelled or was never started, this error code may be returned. | - - - -###### On Failure: Requested Range Not Satisfiable - -``` -416 Requested Range Not Satisfiable -``` - -The `Content-Range` specification cannot be accepted, either because it does not overlap with the current progress or it is invalid. - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - - -#### PUT Blob Upload - -Complete the upload specified by `uuid`, optionally appending the body as the final chunk. - - - -``` -PUT /v2//blobs/uploads/?digest= -Host: -Authorization: -Content-Length: -Content-Type: application/octet-stream - - -``` - -Complete the upload, providing all the data in the body, if necessary. A request without a body will just complete the upload with previously uploaded content. - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`Content-Length`|header|Length of the data being uploaded, corresponding to the length of the request body. May be zero if no data is provided.| -|`name`|path|Name of the target repository.| -|`uuid`|path|A uuid identifying the upload. This field can accept characters that match `[a-zA-Z0-9-_.=]+`.| -|`digest`|query|Digest of uploaded blob.| - - - - -###### On Success: Upload Complete - -``` -204 No Content -Location: -Content-Range: - -Content-Length: 0 -Docker-Content-Digest: -``` - -The upload has been completed and accepted by the registry. The canonical location will be available in the `Location` header. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Location`|The canonical location of the blob for retrieval| -|`Content-Range`|Range of bytes identifying the desired block of content represented by the body. Start must match the end of offset retrieved via status check. Note that this is a non-standard use of the `Content-Range` header.| -|`Content-Length`|The `Content-Length` header must be zero and the body must be empty.| -|`Docker-Content-Digest`|Digest of the targeted content for the request.| - - - - -###### On Failure: Bad Request - -``` -400 Bad Request -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -There was an error processing the upload and it must be restarted. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DIGEST_INVALID` | provided digest did not match uploaded content | When a blob is uploaded, the registry will check that the content matches the digest provided by the client. The error may include a detail structure with the key "digest", including the invalid digest string. This error may also be returned when a manifest includes an invalid layer digest. | -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | -| `BLOB_UPLOAD_INVALID` | blob upload invalid | The blob upload encountered an error and can no longer proceed. | -| `UNSUPPORTED` | The operation is unsupported. | The operation was unsupported due to a missing implementation or invalid set of parameters. | - - - -###### On Failure: Not Found - -``` -404 Not Found -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The upload is unknown to the registry. The upload must be restarted. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `BLOB_UPLOAD_UNKNOWN` | blob upload unknown to registry | If a blob upload has been cancelled or was never started, this error code may be returned. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - - -#### DELETE Blob Upload - -Cancel outstanding upload processes, releasing associated resources. If this is not called, the unfinished uploads will eventually timeout. - - - -``` -DELETE /v2//blobs/uploads/ -Host: -Authorization: -Content-Length: 0 -``` - -Cancel the upload specified by `uuid`. - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`Host`|header|Standard HTTP Host Header. Should be set to the registry host.| -|`Authorization`|header|An RFC7235 compliant authorization header.| -|`Content-Length`|header|The `Content-Length` header must be zero and the body must be empty.| -|`name`|path|Name of the target repository.| -|`uuid`|path|A uuid identifying the upload. This field can accept characters that match `[a-zA-Z0-9-_.=]+`.| - - - - -###### On Success: Upload Deleted - -``` -204 No Content -Content-Length: 0 -``` - -The upload has been successfully deleted. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|The `Content-Length` header must be zero and the body must be empty.| - - - - -###### On Failure: Bad Request - -``` -400 Bad Request -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -An error was encountered processing the delete. The client may ignore this error. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_INVALID` | invalid repository name | Invalid repository name encountered either during manifest validation or any API operation. | -| `BLOB_UPLOAD_INVALID` | blob upload invalid | The blob upload encountered an error and can no longer proceed. | - - - -###### On Failure: Not Found - -``` -404 Not Found -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The upload is unknown to the registry. The client may ignore this error and assume the upload has been deleted. - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `BLOB_UPLOAD_UNKNOWN` | blob upload unknown to registry | If a blob upload has been cancelled or was never started, this error code may be returned. | - - - -###### On Failure: Authentication Required - -``` -401 Unauthorized -WWW-Authenticate: realm="", ..." -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client is not authenticated. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`WWW-Authenticate`|An RFC7235 compliant authentication challenge header.| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `UNAUTHORIZED` | authentication required | The access controller was unable to authenticate the client. Often this will be accompanied by a Www-Authenticate HTTP response header indicating how to authenticate. | - - - -###### On Failure: No Such Repository Error - -``` -404 Not Found -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The repository is not known to the registry. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `NAME_UNKNOWN` | repository name not known to registry | This is returned if the name used during an operation is unknown to the registry. | - - - -###### On Failure: Access Denied - -``` -403 Forbidden -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client does not have required access to the repository. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `DENIED` | requested access to the resource is denied | The access controller denied access for the operation on a resource. | - - - -###### On Failure: Too Many Requests - -``` -429 Too Many Requests -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -} -``` - -The client made too many requests within a time interval. - -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -| `TOOMANYREQUESTS` | too many requests | Returned when a client attempts to contact a service too many times | - - - - - -### Catalog - -List a set of available repositories in the local registry cluster. Does not provide any indication of what may be available upstream. Applications can only determine if a repository is available but not if it is not available. - - - -#### GET Catalog - -Retrieve a sorted, json list of repositories available in the registry. - - -##### Catalog Fetch - -``` -GET /v2/_catalog -``` - -Request an unabridged list of repositories available. The implementation may impose a maximum limit and return a partial set with pagination links. - - - - - -###### On Success: OK - -``` -200 OK -Content-Length: -Content-Type: application/json; charset=utf-8 - -{ - "repositories": [ - , - ... - ] -} -``` - -Returns the unabridged list of repositories as a json response. - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| - - - -##### Catalog Fetch Paginated - -``` -GET /v2/_catalog?n=&last= -``` - -Return the specified portion of repositories. - - -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -|`n`|query|Limit the number of entries in each response. It not present, all entries will be returned.| -|`last`|query|Result set will include values lexically after last.| - - - - -###### On Success: OK - -``` -200 OK -Content-Length: -Link: <?n=&last=>; rel="next" -Content-Type: application/json; charset=utf-8 - -{ - "repositories": [ - , - ... - ] - "next": "?last=&n=" -} -``` - - - -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -|`Content-Length`|Length of the JSON response body.| -|`Link`|RFC5988 compliant rel='next' with URL to next result set, if available| - - - - - diff --git a/vendor/github.com/docker/distribution/docs/spec/api.md.tmpl b/vendor/github.com/docker/distribution/docs/spec/api.md.tmpl deleted file mode 100644 index 406eda5be..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/api.md.tmpl +++ /dev/null @@ -1,1215 +0,0 @@ ---- -title: "HTTP API V2" -description: "Specification for the Registry API." -keywords: ["registry, on-prem, images, tags, repository, distribution, api, advanced"] ---- - -# Docker Registry HTTP API V2 - -## Introduction - -The _Docker Registry HTTP API_ is the protocol to facilitate distribution of -images to the docker engine. It interacts with instances of the docker -registry, which is a service to manage information about docker images and -enable their distribution. The specification covers the operation of version 2 -of this API, known as _Docker Registry HTTP API V2_. - -While the V1 registry protocol is usable, there are several problems with the -architecture that have led to this new version. The main driver of this -specification is a set of changes to the docker the image format, covered in -[docker/docker#8093](https://github.com/docker/docker/issues/8093). -The new, self-contained image manifest simplifies image definition and improves -security. This specification will build on that work, leveraging new properties -of the manifest format to improve performance, reduce bandwidth usage and -decrease the likelihood of backend corruption. - -For relevant details and history leading up to this specification, please see -the following issues: - -- [docker/docker#8093](https://github.com/docker/docker/issues/8093) -- [docker/docker#9015](https://github.com/docker/docker/issues/9015) -- [docker/docker-registry#612](https://github.com/docker/docker-registry/issues/612) - -### Scope - -This specification covers the URL layout and protocols of the interaction -between docker registry and docker core. This will affect the docker core -registry API and the rewrite of docker-registry. Docker registry -implementations may implement other API endpoints, but they are not covered by -this specification. - -This includes the following features: - -- Namespace-oriented URI Layout -- PUSH/PULL registry server for V2 image manifest format -- Resumable layer PUSH support -- V2 Client library implementation - -While authentication and authorization support will influence this -specification, details of the protocol will be left to a future specification. -Relevant header definitions and error codes are present to provide an -indication of what a client may encounter. - -#### Future - -There are features that have been discussed during the process of cutting this -specification. The following is an incomplete list: - -- Immutable image references -- Multiple architecture support -- Migration from v2compatibility representation - -These may represent features that are either out of the scope of this -specification, the purview of another specification or have been deferred to a -future version. - -### Use Cases - -For the most part, the use cases of the former registry API apply to the new -version. Differentiating use cases are covered below. - -#### Image Verification - -A docker engine instance would like to run verified image named -"library/ubuntu", with the tag "latest". The engine contacts the registry, -requesting the manifest for "library/ubuntu:latest". An untrusted registry -returns a manifest. Before proceeding to download the individual layers, the -engine verifies the manifest's signature, ensuring that the content was -produced from a trusted source and no tampering has occurred. After each layer -is downloaded, the engine verifies the digest of the layer, ensuring that the -content matches that specified by the manifest. - -#### Resumable Push - -Company X's build servers lose connectivity to docker registry before -completing an image layer transfer. After connectivity returns, the build -server attempts to re-upload the image. The registry notifies the build server -that the upload has already been partially attempted. The build server -responds by only sending the remaining data to complete the image file. - -#### Resumable Pull - -Company X is having more connectivity problems but this time in their -deployment datacenter. When downloading an image, the connection is -interrupted before completion. The client keeps the partial data and uses http -`Range` requests to avoid downloading repeated data. - -#### Layer Upload De-duplication - -Company Y's build system creates two identical docker layers from build -processes A and B. Build process A completes uploading the layer before B. -When process B attempts to upload the layer, the registry indicates that its -not necessary because the layer is already known. - -If process A and B upload the same layer at the same time, both operations -will proceed and the first to complete will be stored in the registry (Note: -we may modify this to prevent dogpile with some locking mechanism). - -### Changes - -The V2 specification has been written to work as a living document, specifying -only what is certain and leaving what is not specified open or to future -changes. Only non-conflicting additions should be made to the API and accepted -changes should avoid preventing future changes from happening. - -This section should be updated when changes are made to the specification, -indicating what is different. Optionally, we may start marking parts of the -specification to correspond with the versions enumerated here. - -Each set of changes is given a letter corresponding to a set of modifications -that were applied to the baseline specification. These are merely for -reference and shouldn't be used outside the specification other than to -identify a set of modifications. - -
-
l
-
-
    -
  • Document TOOMANYREQUESTS error code.
  • -
-
- -
k
-
-
    -
  • Document use of Accept and Content-Type headers in manifests endpoint.
  • -
-
- -
j
-
-
    -
  • Add ability to mount blobs across repositories.
  • -
-
- -
i
-
-
    -
  • Clarified expected behavior response to manifest HEAD request.
  • -
-
- -
h
-
-
    -
  • All mention of tarsum removed.
  • -
-
- -
g
-
-
    -
  • Clarify behavior of pagination behavior with unspecified parameters.
  • -
-
- -
f
-
-
    -
  • Specify the delete API for layers and manifests.
  • -
-
- -
e
-
-
    -
  • Added support for listing registry contents.
  • -
  • Added pagination to tags API.
  • -
  • Added common approach to support pagination.
  • -
-
- -
d
-
-
    -
  • Allow repository name components to be one character.
  • -
  • Clarified that single component names are allowed.
  • -
-
- -
c
-
-
    -
  • Added section covering digest format.
  • -
  • Added more clarification that manifest cannot be deleted by tag.
  • -
-
- -
b
-
-
    -
  • Added capability of doing streaming upload to PATCH blob upload.
  • -
  • Updated PUT blob upload to no longer take final chunk, now requires entire data or no data.
  • -
  • Removed `416 Requested Range Not Satisfiable` response status from PUT blob upload.
  • -
-
- -
a
-
-
    -
  • Added support for immutable manifest references in manifest endpoints.
  • -
  • Deleting a manifest by tag has been deprecated.
  • -
  • Specified `Docker-Content-Digest` header for appropriate entities.
  • -
  • Added error code for unsupported operations.
  • -
-
-
- -## Overview - -This section covers client flows and details of the API endpoints. The URI -layout of the new API is structured to support a rich authentication and -authorization model by leveraging namespaces. All endpoints will be prefixed -by the API version and the repository name: - - /v2// - -For example, an API endpoint that will work with the `library/ubuntu` -repository, the URI prefix will be: - - /v2/library/ubuntu/ - -This scheme provides rich access control over various operations and methods -using the URI prefix and http methods that can be controlled in variety of -ways. - -Classically, repository names have always been two path components where each -path component is less than 30 characters. The V2 registry API does not -enforce this. The rules for a repository name are as follows: - -1. A repository name is broken up into _path components_. A component of a - repository name must be at least one lowercase, alpha-numeric characters, - optionally separated by periods, dashes or underscores. More strictly, it - must match the regular expression `[a-z0-9]+(?:[._-][a-z0-9]+)*`. -2. If a repository name has two or more path components, they must be - separated by a forward slash ("/"). -3. The total length of a repository name, including slashes, must be less than - 256 characters. - -These name requirements _only_ apply to the registry API and should accept a -superset of what is supported by other docker ecosystem components. - -All endpoints should support aggressive http caching, compression and range -headers, where appropriate. The new API attempts to leverage HTTP semantics -where possible but may break from standards to implement targeted features. - -For detail on individual endpoints, please see the [_Detail_](#detail) -section. - -### Errors - -Actionable failure conditions, covered in detail in their relevant sections, -are reported as part of 4xx responses, in a json response body. One or more -errors will be returned in the following format: - - { - "errors:" [{ - "code": , - "message": , - "detail": - }, - ... - ] - } - -The `code` field will be a unique identifier, all caps with underscores by -convention. The `message` field will be a human readable string. The optional -`detail` field may contain arbitrary json data providing information the -client can use to resolve the issue. - -While the client can take action on certain error codes, the registry may add -new error codes over time. All client implementations should treat unknown -error codes as `UNKNOWN`, allowing future error codes to be added without -breaking API compatibility. For the purposes of the specification error codes -will only be added and never removed. - -For a complete account of all error codes, please see the [_Errors_](#errors-2) -section. - -### API Version Check - -A minimal endpoint, mounted at `/v2/` will provide version support information -based on its response statuses. The request format is as follows: - - GET /v2/ - -If a `200 OK` response is returned, the registry implements the V2(.1) -registry API and the client may proceed safely with other V2 operations. -Optionally, the response may contain information about the supported paths in -the response body. The client should be prepared to ignore this data. - -If a `401 Unauthorized` response is returned, the client should take action -based on the contents of the "WWW-Authenticate" header and try the endpoint -again. Depending on access control setup, the client may still have to -authenticate against different resources, even if this check succeeds. - -If `404 Not Found` response status, or other unexpected status, is returned, -the client should proceed with the assumption that the registry does not -implement V2 of the API. - -When a `200 OK` or `401 Unauthorized` response is returned, the -"Docker-Distribution-API-Version" header should be set to "registry/2.0". -Clients may require this header value to determine if the endpoint serves this -API. When this header is omitted, clients may fallback to an older API version. - -### Content Digests - -This API design is driven heavily by [content addressability](http://en.wikipedia.org/wiki/Content-addressable_storage). -The core of this design is the concept of a content addressable identifier. It -uniquely identifies content by taking a collision-resistant hash of the bytes. -Such an identifier can be independently calculated and verified by selection -of a common _algorithm_. If such an identifier can be communicated in a secure -manner, one can retrieve the content from an insecure source, calculate it -independently and be certain that the correct content was obtained. Put simply, -the identifier is a property of the content. - -To disambiguate from other concepts, we call this identifier a _digest_. A -_digest_ is a serialized hash result, consisting of a _algorithm_ and _hex_ -portion. The _algorithm_ identifies the methodology used to calculate the -digest. The _hex_ portion is the hex-encoded result of the hash. - -We define a _digest_ string to match the following grammar: -``` -digest := algorithm ":" hex -algorithm := /[A-Fa-f0-9_+.-]+/ -hex := /[A-Fa-f0-9]+/ -``` - -Some examples of _digests_ include the following: - -digest | description | -----------------------------------------------------------------------------------|------------------------------------------------ -sha256:6c3c624b58dbbcd3c0dd82b4c53f04194d1247c6eebdaab7c610cf7d66709b3b | Common sha256 based digest | - -While the _algorithm_ does allow one to implement a wide variety of -algorithms, compliant implementations should use sha256. Heavy processing of -input before calculating a hash is discouraged to avoid degrading the -uniqueness of the _digest_ but some canonicalization may be performed to -ensure consistent identifiers. - -Let's use a simple example in pseudo-code to demonstrate a digest calculation: -``` -let C = 'a small string' -let B = sha256(C) -let D = 'sha256:' + EncodeHex(B) -let ID(C) = D -``` - -Above, we have bytestring `C` passed into a function, `SHA256`, that returns a -bytestring `B`, which is the hash of `C`. `D` gets the algorithm concatenated -with the hex encoding of `B`. We then define the identifier of `C` to `ID(C)` -as equal to `D`. A digest can be verified by independently calculating `D` and -comparing it with identifier `ID(C)`. - -#### Digest Header - -To provide verification of http content, any response may include a -`Docker-Content-Digest` header. This will include the digest of the target -entity returned in the response. For blobs, this is the entire blob content. For -manifests, this is the manifest body without the signature content, also known -as the JWS payload. Note that the commonly used canonicalization for digest -calculation may be dependent on the mediatype of the content, such as with -manifests. - -The client may choose to ignore the header or may verify it to ensure content -integrity and transport security. This is most important when fetching by a -digest. To ensure security, the content should be verified against the digest -used to fetch the content. At times, the returned digest may differ from that -used to initiate a request. Such digests are considered to be from different -_domains_, meaning they have different values for _algorithm_. In such a case, -the client may choose to verify the digests in both domains or ignore the -server's digest. To maintain security, the client _must_ always verify the -content against the _digest_ used to fetch the content. - -> __IMPORTANT:__ If a _digest_ is used to fetch content, the client should use -> the same digest used to fetch the content to verify it. The header -> `Docker-Content-Digest` should not be trusted over the "local" digest. - -### Pulling An Image - -An "image" is a combination of a JSON manifest and individual layer files. The -process of pulling an image centers around retrieving these two components. - -The first step in pulling an image is to retrieve the manifest. For reference, -the relevant manifest fields for the registry are the following: - - field | description | -----------|------------------------------------------------| -name | The name of the image. | -tag | The tag for this version of the image. | -fsLayers | A list of layer descriptors (including digest) | -signature | A JWS used to verify the manifest content | - -For more information about the manifest format, please see -[docker/docker#8093](https://github.com/docker/docker/issues/8093). - -When the manifest is in hand, the client must verify the signature to ensure -the names and layers are valid. Once confirmed, the client will then use the -digests to download the individual layers. Layers are stored in as blobs in -the V2 registry API, keyed by their digest. - -#### Pulling an Image Manifest - -The image manifest can be fetched with the following url: - -``` -GET /v2//manifests/ -``` - -The `name` and `reference` parameter identify the image and are required. The -reference may include a tag or digest. - -The client should include an Accept header indicating which manifest content -types it supports. For more details on the manifest formats and their content -types, see [manifest-v2-1.md](manifest-v2-1.md) and -[manifest-v2-2.md](manifest-v2-2.md). In a successful response, the Content-Type -header will indicate which manifest type is being returned. - -A `404 Not Found` response will be returned if the image is unknown to the -registry. If the image exists and the response is successful, the image -manifest will be returned, with the following format (see -[docker/docker#8093](https://github.com/docker/docker/issues/8093) for details): - - { - "name": , - "tag": , - "fsLayers": [ - { - "blobSum": - }, - ... - ] - ], - "history": , - "signature": - } - -The client should verify the returned manifest signature for authenticity -before fetching layers. - -##### Existing Manifests - -The image manifest can be checked for existence with the following url: - -``` -HEAD /v2//manifests/ -``` - -The `name` and `reference` parameter identify the image and are required. The -reference may include a tag or digest. - -A `404 Not Found` response will be returned if the image is unknown to the -registry. If the image exists and the response is successful the response will -be as follows: - -``` -200 OK -Content-Length: -Docker-Content-Digest: -``` - - -#### Pulling a Layer - -Layers are stored in the blob portion of the registry, keyed by digest. -Pulling a layer is carried out by a standard http request. The URL is as -follows: - - GET /v2//blobs/ - -Access to a layer will be gated by the `name` of the repository but is -identified uniquely in the registry by `digest`. - -This endpoint may issue a 307 (302 for /blobs/uploads/ -``` - -The parameters of this request are the image namespace under which the layer -will be linked. Responses to this request are covered below. - -##### Existing Layers - -The existence of a layer can be checked via a `HEAD` request to the blob store -API. The request should be formatted as follows: - -``` -HEAD /v2//blobs/ -``` - -If the layer with the digest specified in `digest` is available, a 200 OK -response will be received, with no actual body content (this is according to -http specification). The response will look as follows: - -``` -200 OK -Content-Length: -Docker-Content-Digest: -``` - -When this response is received, the client can assume that the layer is -already available in the registry under the given name and should take no -further action to upload the layer. Note that the binary digests may differ -for the existing registry layer, but the digests will be guaranteed to match. - -##### Uploading the Layer - -If the POST request is successful, a `202 Accepted` response will be returned -with the upload URL in the `Location` header: - -``` -202 Accepted -Location: /v2//blobs/uploads/ -Range: bytes=0- -Content-Length: 0 -Docker-Upload-UUID: -``` - -The rest of the upload process can be carried out with the returned url, -called the "Upload URL" from the `Location` header. All responses to the -upload url, whether sending data or getting status, will be in this format. -Though the URI format (`/v2//blobs/uploads/`) for the `Location` -header is specified, clients should treat it as an opaque url and should never -try to assemble it. While the `uuid` parameter may be an actual UUID, this -proposal imposes no constraints on the format and clients should never impose -any. - -If clients need to correlate local upload state with remote upload state, the -contents of the `Docker-Upload-UUID` header should be used. Such an id can be -used to key the last used location header when implementing resumable uploads. - -##### Upload Progress - -The progress and chunk coordination of the upload process will be coordinated -through the `Range` header. While this is a non-standard use of the `Range` -header, there are examples of [similar approaches](https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol) in APIs with heavy use. -For an upload that just started, for an example with a 1000 byte layer file, -the `Range` header would be as follows: - -``` -Range: bytes=0-0 -``` - -To get the status of an upload, issue a GET request to the upload URL: - -``` -GET /v2//blobs/uploads/ -Host: -``` - -The response will be similar to the above, except will return 204 status: - -``` -204 No Content -Location: /v2//blobs/uploads/ -Range: bytes=0- -Docker-Upload-UUID: -``` - -Note that the HTTP `Range` header byte ranges are inclusive and that will be -honored, even in non-standard use cases. - -##### Monolithic Upload - -A monolithic upload is simply a chunked upload with a single chunk and may be -favored by clients that would like to avoided the complexity of chunking. To -carry out a "monolithic" upload, one can simply put the entire content blob to -the provided URL: - -``` -PUT /v2//blobs/uploads/?digest= -Content-Length: -Content-Type: application/octet-stream - - -``` - -The "digest" parameter must be included with the PUT request. Please see the -[_Completed Upload_](#completed-upload) section for details on the parameters -and expected responses. - -##### Chunked Upload - -To carry out an upload of a chunk, the client can specify a range header and -only include that part of the layer file: - -``` -PATCH /v2//blobs/uploads/ -Content-Length: -Content-Range: - -Content-Type: application/octet-stream - - -``` - -There is no enforcement on layer chunk splits other than that the server must -receive them in order. The server may enforce a minimum chunk size. If the -server cannot accept the chunk, a `416 Requested Range Not Satisfiable` -response will be returned and will include a `Range` header indicating the -current status: - -``` -416 Requested Range Not Satisfiable -Location: /v2//blobs/uploads/ -Range: 0- -Content-Length: 0 -Docker-Upload-UUID: -``` - -If this response is received, the client should resume from the "last valid -range" and upload the subsequent chunk. A 416 will be returned under the -following conditions: - -- Invalid Content-Range header format -- Out of order chunk: the range of the next chunk must start immediately after - the "last valid range" from the previous response. - -When a chunk is accepted as part of the upload, a `202 Accepted` response will -be returned, including a `Range` header with the current upload status: - -``` -202 Accepted -Location: /v2//blobs/uploads/ -Range: bytes=0- -Content-Length: 0 -Docker-Upload-UUID: -``` - -##### Completed Upload - -For an upload to be considered complete, the client must submit a `PUT` -request on the upload endpoint with a digest parameter. If it is not provided, -the upload will not be considered complete. The format for the final chunk -will be as follows: - -``` -PUT /v2//blob/uploads/?digest= -Content-Length: -Content-Range: - -Content-Type: application/octet-stream - - -``` - -Optionally, if all chunks have already been uploaded, a `PUT` request with a -`digest` parameter and zero-length body may be sent to complete and validated -the upload. Multiple "digest" parameters may be provided with different -digests. The server may verify none or all of them but _must_ notify the -client if the content is rejected. - -When the last chunk is received and the layer has been validated, the client -will receive a `201 Created` response: - -``` -201 Created -Location: /v2//blobs/ -Content-Length: 0 -Docker-Content-Digest: -``` - -The `Location` header will contain the registry URL to access the accepted -layer file. The `Docker-Content-Digest` header returns the canonical digest of -the uploaded blob which may differ from the provided digest. Most clients may -ignore the value but if it is used, the client should verify the value against -the uploaded blob data. - -###### Digest Parameter - -The "digest" parameter is designed as an opaque parameter to support -verification of a successful transfer. For example, an HTTP URI parameter -might be as follows: - -``` -sha256:6c3c624b58dbbcd3c0dd82b4c53f04194d1247c6eebdaab7c610cf7d66709b3b -``` - -Given this parameter, the registry will verify that the provided content does -match this digest. - -##### Canceling an Upload - -An upload can be cancelled by issuing a DELETE request to the upload endpoint. -The format will be as follows: - -``` -DELETE /v2//blobs/uploads/ -``` - -After this request is issued, the upload uuid will no longer be valid and the -registry server will dump all intermediate data. While uploads will time out -if not completed, clients should issue this request if they encounter a fatal -error but still have the ability to issue an http request. - -##### Cross Repository Blob Mount - -A blob may be mounted from another repository that the client has read access -to, removing the need to upload a blob already known to the registry. To issue -a blob mount instead of an upload, a POST request should be issued in the -following format: - -``` -POST /v2//blobs/uploads/?mount=&from= -Content-Length: 0 -``` - -If the blob is successfully mounted, the client will receive a `201 Created` -response: - -``` -201 Created -Location: /v2//blobs/ -Content-Length: 0 -Docker-Content-Digest: -``` - -The `Location` header will contain the registry URL to access the accepted -layer file. The `Docker-Content-Digest` header returns the canonical digest of -the uploaded blob which may differ from the provided digest. Most clients may -ignore the value but if it is used, the client should verify the value against -the uploaded blob data. - -If a mount fails due to invalid repository or digest arguments, the registry -will fall back to the standard upload behavior and return a `202 Accepted` with -the upload URL in the `Location` header: - -``` -202 Accepted -Location: /v2//blobs/uploads/ -Range: bytes=0- -Content-Length: 0 -Docker-Upload-UUID: -``` - -This behavior is consistent with older versions of the registry, which do not -recognize the repository mount query parameters. - -Note: a client may issue a HEAD request to check existence of a blob in a source -repository to distinguish between the registry not supporting blob mounts and -the blob not existing in the expected repository. - -##### Errors - -If an 502, 503 or 504 error is received, the client should assume that the -download can proceed due to a temporary condition, honoring the appropriate -retry mechanism. Other 5xx errors should be treated as terminal. - -If there is a problem with the upload, a 4xx error will be returned indicating -the problem. After receiving a 4xx response (except 416, as called out above), -the upload will be considered failed and the client should take appropriate -action. - -Note that the upload url will not be available forever. If the upload uuid is -unknown to the registry, a `404 Not Found` response will be returned and the -client must restart the upload process. - -### Deleting a Layer - -A layer may be deleted from the registry via its `name` and `digest`. A -delete may be issued with the following request format: - - DELETE /v2//blobs/ - -If the blob exists and has been successfully deleted, the following response -will be issued: - - 202 Accepted - Content-Length: None - -If the blob had already been deleted or did not exist, a `404 Not Found` -response will be issued instead. - -If a layer is deleted which is referenced by a manifest in the registry, -then the complete images will not be resolvable. - -#### Pushing an Image Manifest - -Once all of the layers for an image are uploaded, the client can upload the -image manifest. An image can be pushed using the following request format: - - PUT /v2//manifests/ - Content-Type: - - { - "name": , - "tag": , - "fsLayers": [ - { - "blobSum": - }, - ... - ] - ], - "history": , - "signature": , - ... - } - -The `name` and `reference` fields of the response body must match those -specified in the URL. The `reference` field may be a "tag" or a "digest". The -content type should match the type of the manifest being uploaded, as specified -in [manifest-v2-1.md](manifest-v2-1.md) and [manifest-v2-2.md](manifest-v2-2.md). - -If there is a problem with pushing the manifest, a relevant 4xx response will -be returned with a JSON error message. Please see the -[_PUT Manifest_](#put-manifest) section for details on possible error codes that -may be returned. - -If one or more layers are unknown to the registry, `BLOB_UNKNOWN` errors are -returned. The `detail` field of the error response will have a `digest` field -identifying the missing blob. An error is returned for each unknown blob. The -response format is as follows: - - { - "errors:" [{ - "code": "BLOB_UNKNOWN", - "message": "blob unknown to registry", - "detail": { - "digest": - } - }, - ... - ] - } - -### Listing Repositories - -Images are stored in collections, known as a _repository_, which is keyed by a -`name`, as seen throughout the API specification. A registry instance may -contain several repositories. The list of available repositories is made -available through the _catalog_. - -The catalog for a given registry can be retrieved with the following request: - -``` -GET /v2/_catalog -``` - -The response will be in the following format: - -``` -200 OK -Content-Type: application/json - -{ - "repositories": [ - , - ... - ] -} -``` - -Note that the contents of the response are specific to the registry -implementation. Some registries may opt to provide a full catalog output, -limit it based on the user's access level or omit upstream results, if -providing mirroring functionality. Subsequently, the presence of a repository -in the catalog listing only means that the registry *may* provide access to -the repository at the time of the request. Conversely, a missing entry does -*not* mean that the registry does not have the repository. More succinctly, -the presence of a repository only guarantees that it is there but not that it -is _not_ there. - -For registries with a large number of repositories, this response may be quite -large. If such a response is expected, one should use pagination. A registry -may also limit the amount of responses returned even if pagination was not -explicitly requested. In this case the `Link` header will be returned along -with the results, and subsequent results can be obtained by following the link -as if pagination had been initially requested. - -For details of the `Link` header, please see the [_Pagination_](#pagination) -section. - -#### Pagination - -Paginated catalog results can be retrieved by adding an `n` parameter to the -request URL, declaring that the response should be limited to `n` results. -Starting a paginated flow begins as follows: - -``` -GET /v2/_catalog?n= -``` - -The above specifies that a catalog response should be returned, from the start of -the result set, ordered lexically, limiting the number of results to `n`. The -response to such a request would look as follows: - -``` -200 OK -Content-Type: application/json -Link: <?n=&last=>; rel="next" - -{ - "repositories": [ - , - ... - ] -} -``` - -The above includes the _first_ `n` entries from the result set. To get the -_next_ `n` entries, one can create a URL where the argument `last` has the -value from `repositories[len(repositories)-1]`. If there are indeed more -results, the URL for the next block is encoded in an -[RFC5988](https://tools.ietf.org/html/rfc5988) `Link` header, as a "next" -relation. The presence of the `Link` header communicates to the client that -the entire result set has not been returned and another request must be -issued. If the header is not present, the client can assume that all results -have been received. - -> __NOTE:__ In the request template above, note that the brackets -> are required. For example, if the url is -> `http://example.com/v2/_catalog?n=20&last=b`, the value of the header would -> be `; rel="next"`. Please see -> [RFC5988](https://tools.ietf.org/html/rfc5988) for details. - -Compliant client implementations should always use the `Link` header -value when proceeding through results linearly. The client may construct URLs -to skip forward in the catalog. - -To get the next result set, a client would issue the request as follows, using -the URL encoded in the described `Link` header: - -``` -GET /v2/_catalog?n=&last= -``` - -The above process should then be repeated until the `Link` header is no longer -set. - -The catalog result set is represented abstractly as a lexically sorted list, -where the position in that list can be specified by the query term `last`. The -entries in the response start _after_ the term specified by `last`, up to `n` -entries. - -The behavior of `last` is quite simple when demonstrated with an example. Let -us say the registry has the following repositories: - -``` -a -b -c -d -``` - -If the value of `n` is 2, _a_ and _b_ will be returned on the first response. -The `Link` header returned on the response will have `n` set to 2 and last set -to _b_: - -``` -Link: <?n=2&last=b>; rel="next" -``` - -The client can then issue the request with the above value from the `Link` -header, receiving the values _c_ and _d_. Note that `n` may change on the second -to last response or be fully omitted, depending on the server implementation. - -### Listing Image Tags - -It may be necessary to list all of the tags under a given repository. The tags -for an image repository can be retrieved with the following request: - - GET /v2//tags/list - -The response will be in the following format: - - 200 OK - Content-Type: application/json - - { - "name": , - "tags": [ - , - ... - ] - } - -For repositories with a large number of tags, this response may be quite -large. If such a response is expected, one should use the pagination. - -#### Pagination - -Paginated tag results can be retrieved by adding the appropriate parameters to -the request URL described above. The behavior of tag pagination is identical -to that specified for catalog pagination. We cover a simple flow to highlight -any differences. - -Starting a paginated flow may begin as follows: - -``` -GET /v2//tags/list?n= -``` - -The above specifies that a tags response should be returned, from the start of -the result set, ordered lexically, limiting the number of results to `n`. The -response to such a request would look as follows: - -``` -200 OK -Content-Type: application/json -Link: <?n=&last=>; rel="next" - -{ - "name": , - "tags": [ - , - ... - ] -} -``` - -To get the next result set, a client would issue the request as follows, using -the value encoded in the [RFC5988](https://tools.ietf.org/html/rfc5988) `Link` -header: - -``` -GET /v2//tags/list?n=&last= -``` - -The above process should then be repeated until the `Link` header is no longer -set in the response. The behavior of the `last` parameter, the provided -response result, lexical ordering and encoding of the `Link` header are -identical to that of catalog pagination. - -### Deleting an Image - -An image may be deleted from the registry via its `name` and `reference`. A -delete may be issued with the following request format: - - DELETE /v2//manifests/ - -For deletes, `reference` *must* be a digest or the delete will fail. If the -image exists and has been successfully deleted, the following response will be -issued: - - 202 Accepted - Content-Length: None - -If the image had already been deleted or did not exist, a `404 Not Found` -response will be issued instead. - -> **Note** When deleting a manifest from a registry version 2.3 or later, the -> following header must be used when `HEAD` or `GET`-ing the manifest to obtain -> the correct digest to delete: - - Accept: application/vnd.docker.distribution.manifest.v2+json - -> for more details, see: [compatibility.md](../compatibility.md#content-addressable-storage-cas) - -## Detail - -> **Note**: This section is still under construction. For the purposes of -> implementation, if any details below differ from the described request flows -> above, the section below should be corrected. When they match, this note -> should be removed. - -The behavior of the endpoints are covered in detail in this section, organized -by route and entity. All aspects of the request and responses are covered, -including headers, parameters and body formats. Examples of requests and their -corresponding responses, with success and failure, are enumerated. - -> **Note**: The sections on endpoint detail are arranged with an example -> request, a description of the request, followed by information about that -> request. - -A list of methods and URIs are covered in the table below: - -|Method|Path|Entity|Description| -|------|----|------|-----------| -{{range $route := .RouteDescriptors}}{{range $method := .Methods}}| {{$method.Method}} | `{{$route.Path|prettygorilla}}` | {{$route.Entity}} | {{$method.Description}} | -{{end}}{{end}} - -The detail for each endpoint is covered in the following sections. - -### Errors - -The error codes encountered via the API are enumerated in the following table: - -|Code|Message|Description| -|----|-------|-----------| -{{range $err := .ErrorDescriptors}} `{{$err.Value}}` | {{$err.Message}} | {{$err.Description|removenewlines}} -{{end}} - -{{range $route := .RouteDescriptors}} -### {{.Entity}} - -{{.Description}} - -{{range $method := $route.Methods}} - -#### {{.Method}} {{$route.Entity}} - -{{.Description}} - -{{if .Requests}}{{range .Requests}}{{if .Name}} -##### {{.Name}}{{end}} - -``` -{{$method.Method}} {{$route.Path|prettygorilla}}{{range $i, $param := .QueryParameters}}{{if eq $i 0}}?{{else}}&{{end}}{{$param.Name}}={{$param.Format}}{{end}}{{range .Headers}} -{{.Name}}: {{.Format}}{{end}}{{if .Body.ContentType}} -Content-Type: {{.Body.ContentType}}{{end}}{{if .Body.Format}} - -{{.Body.Format}}{{end}} -``` - -{{.Description}} - -{{if or .Headers .PathParameters .QueryParameters}} -The following parameters should be specified on the request: - -|Name|Kind|Description| -|----|----|-----------| -{{range .Headers}}|`{{.Name}}`|header|{{.Description}}| -{{end}}{{range .PathParameters}}|`{{.Name}}`|path|{{.Description}}| -{{end}}{{range .QueryParameters}}|`{{.Name}}`|query|{{.Description}}| -{{end}}{{end}} - -{{if .Successes}} -{{range .Successes}} -###### On Success: {{if .Name}}{{.Name}}{{else}}{{.StatusCode | statustext}}{{end}} - -``` -{{.StatusCode}} {{.StatusCode | statustext}}{{range .Headers}} -{{.Name}}: {{.Format}}{{end}}{{if .Body.ContentType}} -Content-Type: {{.Body.ContentType}}{{end}}{{if .Body.Format}} - -{{.Body.Format}}{{end}} -``` - -{{.Description}} -{{if .Fields}}The following fields may be returned in the response body: - -|Name|Description| -|----|-----------| -{{range .Fields}}|`{{.Name}}`|{{.Description}}| -{{end}}{{end}}{{if .Headers}} -The following headers will be returned with the response: - -|Name|Description| -|----|-----------| -{{range .Headers}}|`{{.Name}}`|{{.Description}}| -{{end}}{{end}}{{end}}{{end}} - -{{if .Failures}} -{{range .Failures}} -###### On Failure: {{if .Name}}{{.Name}}{{else}}{{.StatusCode | statustext}}{{end}} - -``` -{{.StatusCode}} {{.StatusCode | statustext}}{{range .Headers}} -{{.Name}}: {{.Format}}{{end}}{{if .Body.ContentType}} -Content-Type: {{.Body.ContentType}}{{end}}{{if .Body.Format}} - -{{.Body.Format}}{{end}} -``` - -{{.Description}} -{{if .Headers}} -The following headers will be returned on the response: - -|Name|Description| -|----|-----------| -{{range .Headers}}|`{{.Name}}`|{{.Description}}| -{{end}}{{end}} - -{{if .ErrorCodes}} -The error codes that may be included in the response body are enumerated below: - -|Code|Message|Description| -|----|-------|-----------| -{{range $err := .ErrorCodes}}| `{{$err.Descriptor.Value}}` | {{$err.Descriptor.Message}} | {{$err.Descriptor.Description|removenewlines}} | -{{end}} - -{{end}}{{end}}{{end}}{{end}}{{end}}{{end}} - -{{end}} diff --git a/vendor/github.com/docker/distribution/docs/spec/auth/index.md b/vendor/github.com/docker/distribution/docs/spec/auth/index.md deleted file mode 100644 index d1aa94225..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/auth/index.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Docker Registry Token Authentication" -description: "Docker Registry v2 authentication schema" -keywords: ["registry, on-prem, images, tags, repository, distribution, authentication, advanced"] ---- - -# Docker Registry v2 authentication - -See the [Token Authentication Specification](token.md), -[Token Authentication Implementation](jwt.md), -[Token Scope Documentation](scope.md), -[OAuth2 Token Authentication](oauth.md) for more information. diff --git a/vendor/github.com/docker/distribution/docs/spec/auth/jwt.md b/vendor/github.com/docker/distribution/docs/spec/auth/jwt.md deleted file mode 100644 index aa9941b0b..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/auth/jwt.md +++ /dev/null @@ -1,329 +0,0 @@ ---- -title: "Token Authentication Implementation" -description: "Describe the reference implementation of the Docker Registry v2 authentication schema" -keywords: ["registry, on-prem, images, tags, repository, distribution, JWT authentication, advanced"] ---- - -# Docker Registry v2 Bearer token specification - -This specification covers the `docker/distribution` implementation of the -v2 Registry's authentication schema. Specifically, it describes the JSON -Web Token schema that `docker/distribution` has adopted to implement the -client-opaque Bearer token issued by an authentication service and -understood by the registry. - -This document borrows heavily from the [JSON Web Token Draft Spec](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32) - -## Getting a Bearer Token - -For this example, the client makes an HTTP GET request to the following URL: - -``` -https://auth.docker.io/token?service=registry.docker.io&scope=repository:samalba/my-app:pull,push -``` - -The token server should first attempt to authenticate the client using any -authentication credentials provided with the request. As of Docker 1.8, the -registry client in the Docker Engine only supports Basic Authentication to -these token servers. If an attempt to authenticate to the token server fails, -the token server should return a `401 Unauthorized` response indicating that -the provided credentials are invalid. - -Whether the token server requires authentication is up to the policy of that -access control provider. Some requests may require authentication to determine -access (such as pushing or pulling a private repository) while others may not -(such as pulling from a public repository). - -After authenticating the client (which may simply be an anonymous client if -no attempt was made to authenticate), the token server must next query its -access control list to determine whether the client has the requested scope. In -this example request, if I have authenticated as user `jlhawn`, the token -server will determine what access I have to the repository `samalba/my-app` -hosted by the entity `registry.docker.io`. - -Once the token server has determined what access the client has to the -resources requested in the `scope` parameter, it will take the intersection of -the set of requested actions on each resource and the set of actions that the -client has in fact been granted. If the client only has a subset of the -requested access **it must not be considered an error** as it is not the -responsibility of the token server to indicate authorization errors as part of -this workflow. - -Continuing with the example request, the token server will find that the -client's set of granted access to the repository is `[pull, push]` which when -intersected with the requested access `[pull, push]` yields an equal set. If -the granted access set was found only to be `[pull]` then the intersected set -would only be `[pull]`. If the client has no access to the repository then the -intersected set would be empty, `[]`. - -It is this intersected set of access which is placed in the returned token. - -The server will now construct a JSON Web Token to sign and return. A JSON Web -Token has 3 main parts: - -1. Headers - - The header of a JSON Web Token is a standard JOSE header. The "typ" field - will be "JWT" and it will also contain the "alg" which identifies the - signing algorithm used to produce the signature. It also must have a "kid" - field, representing the ID of the key which was used to sign the token. - - The "kid" field has to be in a libtrust fingerprint compatible format. - Such a format can be generated by following steps: - - 1. Take the DER encoded public key which the JWT token was signed against. - - 2. Create a SHA256 hash out of it and truncate to 240bits. - - 3. Split the result into 12 base32 encoded groups with `:` as delimiter. - - Here is an example JOSE Header for a JSON Web Token (formatted with - whitespace for readability): - - ``` - { - "typ": "JWT", - "alg": "ES256", - "kid": "PYYO:TEWU:V7JH:26JV:AQTZ:LJC3:SXVJ:XGHA:34F2:2LAQ:ZRMK:Z7Q6" - } - ``` - - It specifies that this object is going to be a JSON Web token signed using - the key with the given ID using the Elliptic Curve signature algorithm - using a SHA256 hash. - -2. Claim Set - - The Claim Set is a JSON struct containing these standard registered claim - name fields: - -
-
- iss (Issuer) -
-
- The issuer of the token, typically the fqdn of the authorization - server. -
-
- sub (Subject) -
-
- The subject of the token; the name or id of the client which - requested it. This should be empty (`""`) if the client did not - authenticate. -
-
- aud (Audience) -
-
- The intended audience of the token; the name or id of the service - which will verify the token to authorize the client/subject. -
-
- exp (Expiration) -
-
- The token should only be considered valid up to this specified date - and time. -
-
- nbf (Not Before) -
-
- The token should not be considered valid before this specified date - and time. -
-
- iat (Issued At) -
-
- Specifies the date and time which the Authorization server - generated this token. -
-
- jti (JWT ID) -
-
- A unique identifier for this token. Can be used by the intended - audience to prevent replays of the token. -
-
- - The Claim Set will also contain a private claim name unique to this - authorization server specification: - -
-
- access -
-
- An array of access entry objects with the following fields: - -
-
- type -
-
- The type of resource hosted by the service. -
-
- name -
-
- The name of the resource of the given type hosted by the - service. -
-
- actions -
-
- An array of strings which give the actions authorized on - this resource. -
-
-
-
- - Here is an example of such a JWT Claim Set (formatted with whitespace for - readability): - - ``` - { - "iss": "auth.docker.com", - "sub": "jlhawn", - "aud": "registry.docker.com", - "exp": 1415387315, - "nbf": 1415387015, - "iat": 1415387015, - "jti": "tYJCO1c6cnyy7kAn0c7rKPgbV1H1bFws", - "access": [ - { - "type": "repository", - "name": "samalba/my-app", - "actions": [ - "pull", - "push" - ] - } - ] - } - ``` - -3. Signature - - The authorization server will produce a JOSE header and Claim Set with no - extraneous whitespace, i.e., the JOSE Header from above would be - - ``` - {"typ":"JWT","alg":"ES256","kid":"PYYO:TEWU:V7JH:26JV:AQTZ:LJC3:SXVJ:XGHA:34F2:2LAQ:ZRMK:Z7Q6"} - ``` - - and the Claim Set from above would be - - ``` - {"iss":"auth.docker.com","sub":"jlhawn","aud":"registry.docker.com","exp":1415387315,"nbf":1415387015,"iat":1415387015,"jti":"tYJCO1c6cnyy7kAn0c7rKPgbV1H1bFws","access":[{"type":"repository","name":"samalba/my-app","actions":["push","pull"]}]} - ``` - - The utf-8 representation of this JOSE header and Claim Set are then - url-safe base64 encoded (sans trailing '=' buffer), producing: - - ``` - eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IlBZWU86VEVXVTpWN0pIOjI2SlY6QVFUWjpMSkMzOlNYVko6WEdIQTozNEYyOjJMQVE6WlJNSzpaN1E2In0 - ``` - - for the JOSE Header and - - ``` - eyJpc3MiOiJhdXRoLmRvY2tlci5jb20iLCJzdWIiOiJqbGhhd24iLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuY29tIiwiZXhwIjoxNDE1Mzg3MzE1LCJuYmYiOjE0MTUzODcwMTUsImlhdCI6MTQxNTM4NzAxNSwianRpIjoidFlKQ08xYzZjbnl5N2tBbjBjN3JLUGdiVjFIMWJGd3MiLCJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6InNhbWFsYmEvbXktYXBwIiwiYWN0aW9ucyI6WyJwdXNoIl19XX0 - ``` - - for the Claim Set. These two are concatenated using a '.' character, - yielding the string: - - ``` - eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IlBZWU86VEVXVTpWN0pIOjI2SlY6QVFUWjpMSkMzOlNYVko6WEdIQTozNEYyOjJMQVE6WlJNSzpaN1E2In0.eyJpc3MiOiJhdXRoLmRvY2tlci5jb20iLCJzdWIiOiJqbGhhd24iLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuY29tIiwiZXhwIjoxNDE1Mzg3MzE1LCJuYmYiOjE0MTUzODcwMTUsImlhdCI6MTQxNTM4NzAxNSwianRpIjoidFlKQ08xYzZjbnl5N2tBbjBjN3JLUGdiVjFIMWJGd3MiLCJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6InNhbWFsYmEvbXktYXBwIiwiYWN0aW9ucyI6WyJwdXNoIl19XX0 - ``` - - This is then used as the payload to a the `ES256` signature algorithm - specified in the JOSE header and specified fully in [Section 3.4 of the JSON Web Algorithms (JWA) - draft specification](https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-38#section-3.4) - - This example signature will use the following ECDSA key for the server: - - ``` - { - "kty": "EC", - "crv": "P-256", - "kid": "PYYO:TEWU:V7JH:26JV:AQTZ:LJC3:SXVJ:XGHA:34F2:2LAQ:ZRMK:Z7Q6", - "d": "R7OnbfMaD5J2jl7GeE8ESo7CnHSBm_1N2k9IXYFrKJA", - "x": "m7zUpx3b-zmVE5cymSs64POG9QcyEpJaYCD82-549_Q", - "y": "dU3biz8sZ_8GPB-odm8Wxz3lNDr1xcAQQPQaOcr1fmc" - } - ``` - - A resulting signature of the above payload using this key is: - - ``` - QhflHPfbd6eVF4lM9bwYpFZIV0PfikbyXuLx959ykRTBpe3CYnzs6YBK8FToVb5R47920PVLrh8zuLzdCr9t3w - ``` - - Concatenating all of these together with a `.` character gives the - resulting JWT: - - ``` - eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IlBZWU86VEVXVTpWN0pIOjI2SlY6QVFUWjpMSkMzOlNYVko6WEdIQTozNEYyOjJMQVE6WlJNSzpaN1E2In0.eyJpc3MiOiJhdXRoLmRvY2tlci5jb20iLCJzdWIiOiJqbGhhd24iLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuY29tIiwiZXhwIjoxNDE1Mzg3MzE1LCJuYmYiOjE0MTUzODcwMTUsImlhdCI6MTQxNTM4NzAxNSwianRpIjoidFlKQ08xYzZjbnl5N2tBbjBjN3JLUGdiVjFIMWJGd3MiLCJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6InNhbWFsYmEvbXktYXBwIiwiYWN0aW9ucyI6WyJwdXNoIl19XX0.QhflHPfbd6eVF4lM9bwYpFZIV0PfikbyXuLx959ykRTBpe3CYnzs6YBK8FToVb5R47920PVLrh8zuLzdCr9t3w - ``` - -This can now be placed in an HTTP response and returned to the client to use to -authenticate to the audience service: - - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -{"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IlBZWU86VEVXVTpWN0pIOjI2SlY6QVFUWjpMSkMzOlNYVko6WEdIQTozNEYyOjJMQVE6WlJNSzpaN1E2In0.eyJpc3MiOiJhdXRoLmRvY2tlci5jb20iLCJzdWIiOiJqbGhhd24iLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuY29tIiwiZXhwIjoxNDE1Mzg3MzE1LCJuYmYiOjE0MTUzODcwMTUsImlhdCI6MTQxNTM4NzAxNSwianRpIjoidFlKQ08xYzZjbnl5N2tBbjBjN3JLUGdiVjFIMWJGd3MiLCJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6InNhbWFsYmEvbXktYXBwIiwiYWN0aW9ucyI6WyJwdXNoIl19XX0.QhflHPfbd6eVF4lM9bwYpFZIV0PfikbyXuLx959ykRTBpe3CYnzs6YBK8FToVb5R47920PVLrh8zuLzdCr9t3w"} -``` - -## Using the signed token - -Once the client has a token, it will try the registry request again with the -token placed in the HTTP `Authorization` header like so: - -``` -Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IkJWM0Q6MkFWWjpVQjVaOktJQVA6SU5QTDo1RU42Ok40SjQ6Nk1XTzpEUktFOkJWUUs6M0ZKTDpQT1RMIn0.eyJpc3MiOiJhdXRoLmRvY2tlci5jb20iLCJzdWIiOiJCQ0NZOk9VNlo6UUVKNTpXTjJDOjJBVkM6WTdZRDpBM0xZOjQ1VVc6NE9HRDpLQUxMOkNOSjU6NUlVTCIsImF1ZCI6InJlZ2lzdHJ5LmRvY2tlci5jb20iLCJleHAiOjE0MTUzODczMTUsIm5iZiI6MTQxNTM4NzAxNSwiaWF0IjoxNDE1Mzg3MDE1LCJqdGkiOiJ0WUpDTzFjNmNueXk3a0FuMGM3cktQZ2JWMUgxYkZ3cyIsInNjb3BlIjoiamxoYXduOnJlcG9zaXRvcnk6c2FtYWxiYS9teS1hcHA6cHVzaCxwdWxsIGpsaGF3bjpuYW1lc3BhY2U6c2FtYWxiYTpwdWxsIn0.Y3zZSwaZPqy4y9oRBVRImZyv3m_S9XDHF1tWwN7mL52C_IiA73SJkWVNsvNqpJIn5h7A2F8biv_S2ppQ1lgkbw -``` - -This is also described in [Section 2.1 of RFC 6750: The OAuth 2.0 Authorization Framework: Bearer Token Usage](https://tools.ietf.org/html/rfc6750#section-2.1) - -## Verifying the token - -The registry must now verify the token presented by the user by inspecting the -claim set within. The registry will: - -- Ensure that the issuer (`iss` claim) is an authority it trusts. -- Ensure that the registry identifies as the audience (`aud` claim). -- Check that the current time is between the `nbf` and `exp` claim times. -- If enforcing single-use tokens, check that the JWT ID (`jti` claim) value has - not been seen before. - - To enforce this, the registry may keep a record of `jti`s it has seen for - up to the `exp` time of the token to prevent token replays. -- Check the `access` claim value and use the identified resources and the list - of actions authorized to determine whether the token grants the required - level of access for the operation the client is attempting to perform. -- Verify that the signature of the token is valid. - -If any of these requirements are not met, the registry will return a -`403 Forbidden` response to indicate that the token is invalid. - -**Note**: it is only at this point in the workflow that an authorization error -may occur. The token server should *not* return errors when the user does not -have the requested authorization. Instead, the returned token should indicate -whatever of the requested scope the client does have (the intersection of -requested and granted access). If the token does not supply proper -authorization then the registry will return the appropriate error. - -At no point in this process should the registry need to call back to the -authorization server. The registry only needs to be supplied with the trusted -public keys to verify the token signatures. diff --git a/vendor/github.com/docker/distribution/docs/spec/auth/oauth.md b/vendor/github.com/docker/distribution/docs/spec/auth/oauth.md deleted file mode 100644 index d946da8a2..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/auth/oauth.md +++ /dev/null @@ -1,190 +0,0 @@ ---- -title: "Oauth2 Token Authentication" -description: "Specifies the Docker Registry v2 authentication" -keywords: ["registry, on-prem, images, tags, repository, distribution, oauth2, advanced"] ---- - -# Docker Registry v2 authentication using OAuth2 - -This document describes support for the OAuth2 protocol within the authorization -server. [RFC6749](https://tools.ietf.org/html/rfc6749) should be used as a -reference for the protocol and HTTP endpoints described here. - -**Note**: Not all token servers implement oauth2. If the request to the endpoint -returns `404` using the HTTP `POST` method, refer to -[Token Documentation](token.md) for using the HTTP `GET` method supported by all -token servers. - -## Refresh token format - -The format of the refresh token is completely opaque to the client and should be -determined by the authorization server. The authorization should ensure the -token is sufficiently long and is responsible for storing any information about -long-lived tokens which may be needed for revoking. Any information stored -inside the token will not be extracted and presented by clients. - -## Getting a token - -POST /token - -#### Headers -Content-Type: application/x-www-form-urlencoded - -#### Post parameters - -
-
- grant_type -
-
- (REQUIRED) Type of grant used to get token. When getting a refresh token - using credentials this type should be set to "password" and have the - accompanying username and password paramters. Type "authorization_code" - is reserved for future use for authenticating to an authorization server - without having to send credentials directly from the client. When - requesting an access token with a refresh token this should be set to - "refresh_token". -
-
- service -
-
- (REQUIRED) The name of the service which hosts the resource to get - access for. Refresh tokens will only be good for getting tokens for - this service. -
-
- client_id -
-
- (REQUIRED) String identifying the client. This client_id does not need - to be registered with the authorization server but should be set to a - meaningful value in order to allow auditing keys created by unregistered - clients. Accepted syntax is defined in - [RFC6749 Appendix A.1](https://tools.ietf.org/html/rfc6749#appendix-A.1) -
-
- access_type -
-
- (OPTIONAL) Access which is being requested. If "offline" is provided - then a refresh token will be returned. The default is "online" only - returning short lived access token. If the grant type is "refresh_token" - this will only return the same refresh token and not a new one. -
-
- scope -
-
- (OPTIONAL) The resource in question, formatted as one of the space-delimited - entries from the scope parameters from the WWW-Authenticate header - shown above. This query parameter should only be specified once but may - contain multiple scopes using the scope list format defined in the scope - grammar. If multiple scope is provided from - WWW-Authenticate header the scopes should first be - converted to a scope list before requesting the token. The above example - would be specified as: scope=repository:samalba/my-app:push. - When requesting a refresh token the scopes may be empty since the - refresh token will not be limited by this scope, only the provided short - lived access token will have the scope limitation. -
-
- refresh_token -
-
- (OPTIONAL) The refresh token to use for authentication when grant type "refresh_token" is used. -
-
- username -
-
- (OPTIONAL) The username to use for authentication when grant type "password" is used. -
-
- password -
-
- (OPTIONAL) The password to use for authentication when grant type "password" is used. -
-
- -#### Response fields - -
-
- access_token -
-
- (REQUIRED) An opaque Bearer token that clients should - supply to subsequent requests in the Authorization header. - This token should not be attempted to be parsed or understood by the - client but treated as opaque string. -
-
- scope -
-
- (REQUIRED) The scope granted inside the access token. This may be the - same scope as requested or a subset. This requirement is stronger than - specified in [RFC6749 Section 4.2.2](https://tools.ietf.org/html/rfc6749#section-4.2.2) - by strictly requiring the scope in the return value. -
-
- expires_in -
-
- (REQUIRED) The duration in seconds since the token was issued that it - will remain valid. When omitted, this defaults to 60 seconds. For - compatibility with older clients, a token should never be returned with - less than 60 seconds to live. -
-
- issued_at -
-
- (Optional) The RFC3339-serialized UTC - standard time at which a given token was issued. If issued_at is omitted, the - expiration is from when the token exchange completed. -
-
- refresh_token -
-
- (Optional) Token which can be used to get additional access tokens for - the same subject with different scopes. This token should be kept secure - by the client and only sent to the authorization server which issues - bearer tokens. This field will only be set when `access_type=offline` is - provided in the request. -
-
- - -#### Example getting refresh token - -``` -POST /token HTTP/1.1 -Host: auth.docker.io -Content-Type: application/x-www-form-urlencoded - -grant_type=password&username=johndoe&password=A3ddj3w&service=hub.docker.io&client_id=dockerengine&access_type=offline - -HTTP/1.1 200 OK -Content-Type: application/json - -{"refresh_token":"kas9Da81Dfa8","access_token":"eyJhbGciOiJFUzI1NiIsInR5","expires_in":900,"scope":""} -``` - -#### Example refreshing an Access Token - -``` -POST /token HTTP/1.1 -Host: auth.docker.io -Content-Type: application/x-www-form-urlencoded - -grant_type=refresh_token&refresh_token=kas9Da81Dfa8&service=registry-1.docker.io&client_id=dockerengine&scope=repository:samalba/my-app:pull,push - -HTTP/1.1 200 OK -Content-Type: application/json - -{"refresh_token":"kas9Da81Dfa8","access_token":"eyJhbGciOiJFUzI1NiIsInR5":"expires_in":900,"scope":"repository:samalba/my-app:pull,repository:samalba/my-app:push"} -``` diff --git a/vendor/github.com/docker/distribution/docs/spec/auth/scope.md b/vendor/github.com/docker/distribution/docs/spec/auth/scope.md deleted file mode 100644 index 6ef61edf1..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/auth/scope.md +++ /dev/null @@ -1,148 +0,0 @@ ---- -title: "Token Scope Documentation" -description: "Describes the scope and access fields used for registry authorization tokens" -keywords: ["registry, on-prem, images, tags, repository, distribution, advanced, access, scope"] ---- - -# Docker Registry Token Scope and Access - -Tokens used by the registry are always restricted what resources they may -be used to access, where those resources may be accessed, and what actions -may be done on those resources. Tokens always have the context of a user which -the token was originally created for. This document describes how these -restrictions are represented and enforced by the authorization server and -resource providers. - -## Scope Components - -### Subject (Authenticated User) - -The subject represents the user for which a token is valid. Any actions -performed using an access token should be considered on behalf of the subject. -This is included in the `sub` field of access token JWT. A refresh token should -be limited to a single subject and only be able to give out access tokens for -that subject. - -### Audience (Resource Provider) - -The audience represents a resource provider which is intended to be able to -perform the actions specified in the access token. Any resource provider which -does not match the audience should not use that access token. The audience is -included in the `aud` field of the access token JWT. A refresh token should be -limited to a single audience and only be able to give out access tokens for that -audience. - -### Resource Type - -The resource type represents the type of resource which the resource name is -intended to represent. This type may be specific to a resource provider but must -be understood by the authorization server in order to validate the subject -is authorized for a specific resource. - -#### Resource Class - -The resource type might have a resource class which further classifies the -the resource name within the resource type. A class is not required and -is specific to the resource type. - -#### Example Resource Types - - - `repository` - represents a single repository within a registry. A -repository may represent many manifest or content blobs, but the resource type -is considered the collections of those items. Actions which may be performed on -a `repository` are `pull` for accessing the collection and `push` for adding to -it. By default the `repository` type has the class of `image`. - - `repository(plugin)` - represents a single repository of plugins within a -registry. A plugin repository has the same content and actions as a repository. - - `registry` - represents the entire registry. Used for administrative actions -or lookup operations that span an entire registry. - -### Resource Name - -The resource name represent the name which identifies a resource for a resource -provider. A resource is identified by this name and the provided resource type. -An example of a resource name would be the name component of an image tag, such -as "samalba/myapp" or "hostname/samalba/myapp". - -### Resource Actions - -The resource actions define the actions which the access token allows to be -performed on the identified resource. These actions are type specific but will -normally have actions identifying read and write access on the resource. Example -for the `repository` type are `pull` for read access and `push` for write -access. - -## Authorization Server Use - -Each access token request may include a scope and an audience. The subject is -always derived from the passed in credentials or refresh token. When using -a refresh token the passed in audience must match the audience defined for -the refresh token. The audience (resource provider) is provided using the -`service` field. Multiple resource scopes may be provided using multiple `scope` -fields on the `GET` request. The `POST` request only takes in a single -`scope` field but may use a space to separate a list of multiple resource -scopes. - -### Resource Scope Grammar - -``` -scope := resourcescope [ ' ' resourcescope ]* -resourcescope := resourcetype ":" resourcename ":" action [ ',' action ]* -resourcetype := resourcetypevalue [ '(' resourcetypevalue ')' ] -resourcetypevalue := /[a-z0-9]+/ -resourcename := [ hostname '/' ] component [ '/' component ]* -hostname := hostcomponent ['.' hostcomponent]* [':' port-number] -hostcomponent := /([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/ -port-number := /[0-9]+/ -action := /[a-z]*/ -component := alpha-numeric [ separator alpha-numeric ]* -alpha-numeric := /[a-z0-9]+/ -separator := /[_.]|__|[-]*/ -``` -Full reference grammar is defined -[here](https://godoc.org/github.com/docker/distribution/reference). Currently -the scope name grammar is a subset of the reference grammar. - -> **NOTE:** that the `resourcename` may contain one `:` due to a possible port -> number in the hostname component of the `resourcename`, so a naive -> implementation that interprets the first three `:`-delimited tokens of a -> `scope` to be the `resourcetype`, `resourcename`, and a list of `action` -> would be insufficient. - -## Resource Provider Use - -Once a resource provider has verified the authenticity of the scope through -JWT access token verification, the resource provider must ensure that scope -satisfies the request. The resource provider should match the given audience -according to name or URI the resource provider uses to identify itself. Any -denial based on subject is not defined here and is up to resource provider, the -subject is mainly provided for audit logs and any other user-specific rules -which may need to be provided but are not defined by the authorization server. - -The resource provider must ensure that ANY resource being accessed as the -result of a request has the appropriate access scope. Both the resource type -and resource name must match the accessed resource and an appropriate action -scope must be included. - -When appropriate authorization is not provided either due to lack of scope -or missing token, the resource provider to return a `WWW-AUTHENTICATE` HTTP -header with the `realm` as the authorization server, the `service` as the -expected audience identifying string, and a `scope` field for each required -resource scope to complete the request. - -## JWT Access Tokens - -Each JWT access token may only have a single subject and audience but multiple -resource scopes. The subject and audience are put into standard JWT fields -`sub` and `aud`. The resource scope is put into the `access` field. The -structure of the access field can be seen in the -[jwt documentation](jwt.md). - -## Refresh Tokens - -A refresh token must be defined for a single subject and audience. Further -restricting scope to specific type, name, and actions combinations should be -done by fetching an access token using the refresh token. Since the refresh -token is not scoped to specific resources for an audience, extra care should -be taken to only use the refresh token to negotiate new access tokens directly -with the authorization server, and never with a resource provider. diff --git a/vendor/github.com/docker/distribution/docs/spec/auth/token.md b/vendor/github.com/docker/distribution/docs/spec/auth/token.md deleted file mode 100644 index f8391bd5a..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/auth/token.md +++ /dev/null @@ -1,250 +0,0 @@ ---- -title: "Token Authentication Specification" -description: "Specifies the Docker Registry v2 authentication" -keywords: ["registry, on-prem, images, tags, repository, distribution, Bearer authentication, advanced"] ---- - -# Docker Registry v2 authentication via central service - -This document outlines the v2 Docker registry authentication scheme: - -![v2 registry auth](../../images/v2-registry-auth.png) - -1. Attempt to begin a push/pull operation with the registry. -2. If the registry requires authorization it will return a `401 Unauthorized` - HTTP response with information on how to authenticate. -3. The registry client makes a request to the authorization service for a - Bearer token. -4. The authorization service returns an opaque Bearer token representing the - client's authorized access. -5. The client retries the original request with the Bearer token embedded in - the request's Authorization header. -6. The Registry authorizes the client by validating the Bearer token and the - claim set embedded within it and begins the push/pull session as usual. - -## Requirements - -- Registry clients which can understand and respond to token auth challenges - returned by the resource server. -- An authorization server capable of managing access controls to their - resources hosted by any given service (such as repositories in a Docker - Registry). -- A Docker Registry capable of trusting the authorization server to sign tokens - which clients can use for authorization and the ability to verify these - tokens for single use or for use during a sufficiently short period of time. - -## Authorization Server Endpoint Descriptions - -The described server is meant to serve as a standalone access control manager -for resources hosted by other services which wish to authenticate and manage -authorizations using a separate access control manager. - -A service like this is used by the official Docker Registry to authenticate -clients and verify their authorization to Docker image repositories. - -As of Docker 1.6, the registry client within the Docker Engine has been updated -to handle such an authorization workflow. - -## How to authenticate - -Registry V1 clients first contact the index to initiate a push or pull. Under -the Registry V2 workflow, clients should contact the registry first. If the -registry server requires authentication it will return a `401 Unauthorized` -response with a `WWW-Authenticate` header detailing how to authenticate to this -registry. - -For example, say I (username `jlhawn`) am attempting to push an image to the -repository `samalba/my-app`. For the registry to authorize this, I will need -`push` access to the `samalba/my-app` repository. The registry will first -return this response: - -``` -HTTP/1.1 401 Unauthorized -Content-Type: application/json; charset=utf-8 -Docker-Distribution-Api-Version: registry/2.0 -Www-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:samalba/my-app:pull,push" -Date: Thu, 10 Sep 2015 19:32:31 GMT -Content-Length: 235 -Strict-Transport-Security: max-age=31536000 - -{"errors":[{"code":"UNAUTHORIZED","message":"access to the requested resource is not authorized","detail":[{"Type":"repository","Name":"samalba/my-app","Action":"pull"},{"Type":"repository","Name":"samalba/my-app","Action":"push"}]}]} -``` - -Note the HTTP Response Header indicating the auth challenge: - -``` -Www-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:samalba/my-app:pull,push" -``` - -This format is documented in [Section 3 of RFC 6750: The OAuth 2.0 Authorization Framework: Bearer Token Usage](https://tools.ietf.org/html/rfc6750#section-3) - -This challenge indicates that the registry requires a token issued by the -specified token server and that the request the client is attempting will -need to include sufficient access entries in its claim set. To respond to this -challenge, the client will need to make a `GET` request to the URL -`https://auth.docker.io/token` using the `service` and `scope` values from the -`WWW-Authenticate` header. - -## Requesting a Token - -Defines getting a bearer and refresh token using the token endpoint. - -#### Query Parameters - -
-
- service -
-
- The name of the service which hosts the resource. -
-
- offline_token -
-
- Whether to return a refresh token along with the bearer token. A refresh - token is capable of getting additional bearer tokens for the same - subject with different scopes. The refresh token does not have an - expiration and should be considered completely opaque to the client. -
-
- client_id -
-
- String identifying the client. This client_id does not need - to be registered with the authorization server but should be set to a - meaningful value in order to allow auditing keys created by unregistered - clients. Accepted syntax is defined in - [RFC6749 Appendix A.1](https://tools.ietf.org/html/rfc6749#appendix-A.1). -
-
- scope -
-
- The resource in question, formatted as one of the space-delimited - entries from the scope parameters from the WWW-Authenticate header - shown above. This query parameter should be specified multiple times if - there is more than one scope entry from the WWW-Authenticate - header. The above example would be specified as: - scope=repository:samalba/my-app:push. The scope field may - be empty to request a refresh token without providing any resource - permissions to the returned bearer token. -
-
- - -#### Token Response Fields - -
-
- token -
-
- An opaque Bearer token that clients should supply to subsequent - requests in the Authorization header. -
-
- access_token -
-
- For compatibility with OAuth 2.0, we will also accept token under the name - access_token. At least one of these fields must be specified, but - both may also appear (for compatibility with older clients). When both are specified, - they should be equivalent; if they differ the client's choice is undefined. -
-
- expires_in -
-
- (Optional) The duration in seconds since the token was issued that it - will remain valid. When omitted, this defaults to 60 seconds. For - compatibility with older clients, a token should never be returned with - less than 60 seconds to live. -
-
- issued_at -
-
- (Optional) The RFC3339-serialized UTC - standard time at which a given token was issued. If issued_at is omitted, the - expiration is from when the token exchange completed. -
-
- refresh_token -
-
- (Optional) Token which can be used to get additional access tokens for - the same subject with different scopes. This token should be kept secure - by the client and only sent to the authorization server which issues - bearer tokens. This field will only be set when `offline_token=true` is - provided in the request. -
-
- -#### Example - -For this example, the client makes an HTTP GET request to the following URL: - -``` -https://auth.docker.io/token?service=registry.docker.io&scope=repository:samalba/my-app:pull,push -``` - -The token server should first attempt to authenticate the client using any -authentication credentials provided with the request. From Docker 1.11 the -Docker engine supports both Basic Authentication and [OAuth2](oauth.md) for -getting tokens. Docker 1.10 and before, the registry client in the Docker Engine -only supports Basic Authentication. If an attempt to authenticate to the token -server fails, the token server should return a `401 Unauthorized` response -indicating that the provided credentials are invalid. - -Whether the token server requires authentication is up to the policy of that -access control provider. Some requests may require authentication to determine -access (such as pushing or pulling a private repository) while others may not -(such as pulling from a public repository). - -After authenticating the client (which may simply be an anonymous client if -no attempt was made to authenticate), the token server must next query its -access control list to determine whether the client has the requested scope. In -this example request, if I have authenticated as user `jlhawn`, the token -server will determine what access I have to the repository `samalba/my-app` -hosted by the entity `registry.docker.io`. - -Once the token server has determined what access the client has to the -resources requested in the `scope` parameter, it will take the intersection of -the set of requested actions on each resource and the set of actions that the -client has in fact been granted. If the client only has a subset of the -requested access **it must not be considered an error** as it is not the -responsibility of the token server to indicate authorization errors as part of -this workflow. - -Continuing with the example request, the token server will find that the -client's set of granted access to the repository is `[pull, push]` which when -intersected with the requested access `[pull, push]` yields an equal set. If -the granted access set was found only to be `[pull]` then the intersected set -would only be `[pull]`. If the client has no access to the repository then the -intersected set would be empty, `[]`. - -It is this intersected set of access which is placed in the returned token. - -The server then constructs an implementation-specific token with this -intersected set of access, and returns it to the Docker client to use to -authenticate to the audience service (within the indicated window of time): - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -{"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IlBZWU86VEVXVTpWN0pIOjI2SlY6QVFUWjpMSkMzOlNYVko6WEdIQTozNEYyOjJMQVE6WlJNSzpaN1E2In0.eyJpc3MiOiJhdXRoLmRvY2tlci5jb20iLCJzdWIiOiJqbGhhd24iLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuY29tIiwiZXhwIjoxNDE1Mzg3MzE1LCJuYmYiOjE0MTUzODcwMTUsImlhdCI6MTQxNTM4NzAxNSwianRpIjoidFlKQ08xYzZjbnl5N2tBbjBjN3JLUGdiVjFIMWJGd3MiLCJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6InNhbWFsYmEvbXktYXBwIiwiYWN0aW9ucyI6WyJwdXNoIl19XX0.QhflHPfbd6eVF4lM9bwYpFZIV0PfikbyXuLx959ykRTBpe3CYnzs6YBK8FToVb5R47920PVLrh8zuLzdCr9t3w", "expires_in": 3600,"issued_at": "2009-11-10T23:00:00Z"} -``` - - -## Using the Bearer token - -Once the client has a token, it will try the registry request again with the -token placed in the HTTP `Authorization` header like so: - -``` -Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IkJWM0Q6MkFWWjpVQjVaOktJQVA6SU5QTDo1RU42Ok40SjQ6Nk1XTzpEUktFOkJWUUs6M0ZKTDpQT1RMIn0.eyJpc3MiOiJhdXRoLmRvY2tlci5jb20iLCJzdWIiOiJCQ0NZOk9VNlo6UUVKNTpXTjJDOjJBVkM6WTdZRDpBM0xZOjQ1VVc6NE9HRDpLQUxMOkNOSjU6NUlVTCIsImF1ZCI6InJlZ2lzdHJ5LmRvY2tlci5jb20iLCJleHAiOjE0MTUzODczMTUsIm5iZiI6MTQxNTM4NzAxNSwiaWF0IjoxNDE1Mzg3MDE1LCJqdGkiOiJ0WUpDTzFjNmNueXk3a0FuMGM3cktQZ2JWMUgxYkZ3cyIsInNjb3BlIjoiamxoYXduOnJlcG9zaXRvcnk6c2FtYWxiYS9teS1hcHA6cHVzaCxwdWxsIGpsaGF3bjpuYW1lc3BhY2U6c2FtYWxiYTpwdWxsIn0.Y3zZSwaZPqy4y9oRBVRImZyv3m_S9XDHF1tWwN7mL52C_IiA73SJkWVNsvNqpJIn5h7A2F8biv_S2ppQ1lgkbw -``` - -This is also described in [Section 2.1 of RFC 6750: The OAuth 2.0 Authorization Framework: Bearer Token Usage](https://tools.ietf.org/html/rfc6750#section-2.1) diff --git a/vendor/github.com/docker/distribution/docs/spec/implementations.md b/vendor/github.com/docker/distribution/docs/spec/implementations.md deleted file mode 100644 index 347465350..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/implementations.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -published: false ---- - -# Distribution API Implementations - -This is a list of known implementations of the Distribution API spec. - -## [Docker Distribution Registry](https://github.com/docker/distribution) - -Docker distribution is the reference implementation of the distribution API -specification. It aims to fully implement the entire specification. - -### Releases -#### 2.0.1 (_in development_) -Implements API 2.0.1 - -_Known Issues_ - - No resumable push support - - Content ranges ignored - - Blob upload status will always return a starting range of 0 - -#### 2.0.0 -Implements API 2.0.0 - -_Known Issues_ - - No resumable push support - - No PATCH implementation for blob upload - - Content ranges ignored - diff --git a/vendor/github.com/docker/distribution/docs/spec/index.md b/vendor/github.com/docker/distribution/docs/spec/index.md deleted file mode 100644 index 952ebabd2..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/index.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Reference Overview" -description: "Explains registry JSON objects" -keywords: ["registry, service, images, repository, json"] ---- - -# Docker Registry Reference - -* [HTTP API V2](api.md) -* [Storage Driver](../storage-drivers/index.md) -* [Token Authentication Specification](auth/token.md) -* [Token Authentication Implementation](auth/jwt.md) diff --git a/vendor/github.com/docker/distribution/docs/spec/json.md b/vendor/github.com/docker/distribution/docs/spec/json.md deleted file mode 100644 index 825b17ac2..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/json.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -published: false -title: "Docker Distribution JSON Canonicalization" -description: "Explains registry JSON objects" -keywords: ["registry, service, images, repository, json"] ---- - - - -# Docker Distribution JSON Canonicalization - -To provide consistent content hashing of JSON objects throughout Docker -Distribution APIs, the specification defines a canonical JSON format. Adopting -such a canonicalization also aids in caching JSON responses. - -Note that protocols should not be designed to depend on identical JSON being -generated across different versions or clients. The canonicalization rules are -merely useful for caching and consistency. - -## Rules - -Compliant JSON should conform to the following rules: - -1. All generated JSON should comply with [RFC - 7159](http://www.ietf.org/rfc/rfc7159.txt). -2. Resulting "JSON text" shall always be encoded in UTF-8. -3. Unless a canonical key order is defined for a particular schema, object - keys shall always appear in lexically sorted order. -4. All whitespace between tokens should be removed. -5. No "trailing commas" are allowed in object or array definitions. -6. The angle brackets "<" and ">" are escaped to "\u003c" and "\u003e". - Ampersand "&" is escaped to "\u0026". - -## Examples - -The following is a simple example of a canonicalized JSON string: - -```json -{"asdf":1,"qwer":[],"zxcv":[{},true,1000000000,"tyui"]} -``` - -## Reference - -### Other Canonicalizations - -The OLPC project specifies [Canonical -JSON](http://wiki.laptop.org/go/Canonical_JSON). While this is used in -[TUF](http://theupdateframework.com/), which may be used with other -distribution-related protocols, this alternative format has been proposed in -case the original source changes. Specifications complying with either this -specification or an alternative should explicitly call out the -canonicalization format. Except for key ordering, this specification is mostly -compatible. - -### Go - -In Go, the [`encoding/json`](http://golang.org/pkg/encoding/json/) library -will emit canonical JSON by default. Simply using `json.Marshal` will suffice -in most cases: - -```go -incoming := map[string]interface{}{ - "asdf": 1, - "qwer": []interface{}{}, - "zxcv": []interface{}{ - map[string]interface{}{}, - true, - int(1e9), - "tyui", - }, -} - -canonical, err := json.Marshal(incoming) -if err != nil { - // ... handle error -} -``` - -To apply canonical JSON format spacing to an existing serialized JSON buffer, one -can use -[`json.Indent`](http://golang.org/src/encoding/json/indent.go?s=1918:1989#L65) -with the following arguments: - -```go -incoming := getBytes() -var canonical bytes.Buffer -if err := json.Indent(&canonical, incoming, "", ""); err != nil { - // ... handle error -} -``` diff --git a/vendor/github.com/docker/distribution/docs/spec/manifest-v2-1.md b/vendor/github.com/docker/distribution/docs/spec/manifest-v2-1.md deleted file mode 100644 index b06c2f2a9..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/manifest-v2-1.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: "Image Manifest V 2, Schema 1 " -description: "image manifest for the Registry." -keywords: ["registry, on-prem, images, tags, repository, distribution, api, advanced, manifest"] ---- - -# Image Manifest Version 2, Schema 1 - -This document outlines the format of of the V2 image manifest. The image -manifest described herein was introduced in the Docker daemon in the [v1.3.0 -release](https://github.com/docker/docker/commit/9f482a66ab37ec396ac61ed0c00d59122ac07453). -It is a provisional manifest to provide a compatibility with the [V1 Image -format](https://github.com/docker/docker/blob/master/image/spec/v1.md), as the -requirements are defined for the [V2 Schema 2 -image](https://github.com/docker/distribution/pull/62). - - -Image manifests describe the various constituents of a docker image. Image -manifests can be serialized to JSON format with the following media types: - -Manifest Type | Media Type -------------- | ------------- -manifest | "application/vnd.docker.distribution.manifest.v1+json" -signed manifest | "application/vnd.docker.distribution.manifest.v1+prettyjws" - -*Note that "application/json" will also be accepted for schema 1.* - -References: - - - [Proposal: JSON Registry API V2.1](https://github.com/docker/docker/issues/9015) - - [Proposal: Provenance step 1 - Transform images for validation and verification](https://github.com/docker/docker/issues/8093) - -## *Manifest* Field Descriptions - -Manifest provides the base accessible fields for working with V2 image format - in the registry. - -- **`name`** *string* - - name is the name of the image's repository - -- **`tag`** *string* - - tag is the tag of the image - -- **`architecture`** *string* - - architecture is the host architecture on which this image is intended to - run. This is for information purposes and not currently used by the engine - -- **`fsLayers`** *array* - - fsLayers is a list of filesystem layer blob sums contained in this image. - - An fsLayer is a struct consisting of the following fields - - **`blobSum`** *digest.Digest* - - blobSum is the digest of the referenced filesystem image layer. A - digest must be a sha256 hash. - - -- **`history`** *array* - - history is a list of unstructured historical data for v1 compatibility. It - contains ID of the image layer and ID of the layer's parent layers. - - history is a struct consisting of the following fields - - **`v1Compatibility`** string - - V1Compatibility is the raw V1 compatibility information. This will - contain the JSON object describing the V1 of this image. - -- **`schemaVersion`** *int* - - SchemaVersion is the image manifest schema that this image follows. - ->**Note**:the length of `history` must be equal to the length of `fsLayers` and ->entries in each are correlated by index. - -## Signed Manifests - -Signed manifests provides an envelope for a signed image manifest. A signed -manifest consists of an image manifest along with an additional field -containing the signature of the manifest. - -The docker client can verify signed manifests and displays a message to the user. - -### Signing Manifests - -Image manifests can be signed in two different ways: with a *libtrust* private - key or an x509 certificate chain. When signing with an x509 certificate chain, - the public key of the first element in the chain must be the public key - corresponding with the sign key. - -### Signed Manifest Field Description - -Signed manifests include an image manifest and a list of signatures generated -by *libtrust*. A signature consists of the following fields: - - -- **`header`** *[JOSE](http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-31#section-2)* - - A [JSON Web Signature](http://self-issued.info/docs/draft-ietf-jose-json-web-signature.html) - -- **`signature`** *string* - - A signature for the image manifest, signed by a *libtrust* private key - -- **`protected`** *string* - - The signed protected header - -## Example Manifest - -*Example showing the official 'hello-world' image manifest.* - -``` -{ - "name": "hello-world", - "tag": "latest", - "architecture": "amd64", - "fsLayers": [ - { - "blobSum": "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" - }, - { - "blobSum": "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" - }, - { - "blobSum": "sha256:cc8567d70002e957612902a8e985ea129d831ebe04057d88fb644857caa45d11" - }, - { - "blobSum": "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" - } - ], - "history": [ - { - "v1Compatibility": "{\"id\":\"e45a5af57b00862e5ef5782a9925979a02ba2b12dff832fd0991335f4a11e5c5\",\"parent\":\"31cbccb51277105ba3ae35ce33c22b69c9e3f1002e76e4c736a2e8ebff9d7b5d\",\"created\":\"2014-12-31T22:57:59.178729048Z\",\"container\":\"27b45f8fb11795b52e9605b686159729b0d9ca92f76d40fb4f05a62e19c46b4f\",\"container_config\":{\"Hostname\":\"8ce6509d66e2\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) CMD [/hello]\"],\"Image\":\"31cbccb51277105ba3ae35ce33c22b69c9e3f1002e76e4c736a2e8ebff9d7b5d\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"SecurityOpt\":null,\"Labels\":null},\"docker_version\":\"1.4.1\",\"config\":{\"Hostname\":\"8ce6509d66e2\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/hello\"],\"Image\":\"31cbccb51277105ba3ae35ce33c22b69c9e3f1002e76e4c736a2e8ebff9d7b5d\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"SecurityOpt\":null,\"Labels\":null},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n" - }, - { - "v1Compatibility": "{\"id\":\"e45a5af57b00862e5ef5782a9925979a02ba2b12dff832fd0991335f4a11e5c5\",\"parent\":\"31cbccb51277105ba3ae35ce33c22b69c9e3f1002e76e4c736a2e8ebff9d7b5d\",\"created\":\"2014-12-31T22:57:59.178729048Z\",\"container\":\"27b45f8fb11795b52e9605b686159729b0d9ca92f76d40fb4f05a62e19c46b4f\",\"container_config\":{\"Hostname\":\"8ce6509d66e2\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) CMD [/hello]\"],\"Image\":\"31cbccb51277105ba3ae35ce33c22b69c9e3f1002e76e4c736a2e8ebff9d7b5d\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"SecurityOpt\":null,\"Labels\":null},\"docker_version\":\"1.4.1\",\"config\":{\"Hostname\":\"8ce6509d66e2\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/hello\"],\"Image\":\"31cbccb51277105ba3ae35ce33c22b69c9e3f1002e76e4c736a2e8ebff9d7b5d\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"SecurityOpt\":null,\"Labels\":null},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n" - }, - ], - "schemaVersion": 1, - "signatures": [ - { - "header": { - "jwk": { - "crv": "P-256", - "kid": "OD6I:6DRK:JXEJ:KBM4:255X:NSAA:MUSF:E4VM:ZI6W:CUN2:L4Z6:LSF4", - "kty": "EC", - "x": "3gAwX48IQ5oaYQAYSxor6rYYc_6yjuLCjtQ9LUakg4A", - "y": "t72ge6kIA1XOjqjVoEOiPPAURltJFBMGDSQvEGVB010" - }, - "alg": "ES256" - }, - "signature": "XREm0L8WNn27Ga_iE_vRnTxVMhhYY0Zst_FfkKopg6gWSoTOZTuW4rK0fg_IqnKkEKlbD83tD46LKEGi5aIVFg", - "protected": "eyJmb3JtYXRMZW5ndGgiOjY2MjgsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAxNS0wNC0wOFQxODo1Mjo1OVoifQ" - } - ] -} - -``` diff --git a/vendor/github.com/docker/distribution/docs/spec/manifest-v2-2.md b/vendor/github.com/docker/distribution/docs/spec/manifest-v2-2.md deleted file mode 100644 index 4b41bb28c..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/manifest-v2-2.md +++ /dev/null @@ -1,295 +0,0 @@ ---- -title: "Image Manifest V 2, Schema 2 " -description: "image manifest for the Registry." -keywords: ["registry, on-prem, images, tags, repository, distribution, api, advanced, manifest"] ---- - -# Image Manifest Version 2, Schema 2 - -This document outlines the format of of the V2 image manifest, schema version 2. -The original (and provisional) image manifest for V2 (schema 1), was introduced -in the Docker daemon in the [v1.3.0 -release](https://github.com/docker/docker/commit/9f482a66ab37ec396ac61ed0c00d59122ac07453) -and is specified in the [schema 1 manifest definition](manifest-v2-1.md) - -This second schema version has two primary goals. The first is to allow -multi-architecture images, through a "fat manifest" which references image -manifests for platform-specific versions of an image. The second is to -move the Docker engine towards content-addressable images, by supporting -an image model where the image's configuration can be hashed to generate -an ID for the image. - -# Media Types - -The following media types are used by the manifest formats described here, and -the resources they reference: - -- `application/vnd.docker.distribution.manifest.v1+json`: schema1 (existing manifest format) -- `application/vnd.docker.distribution.manifest.v2+json`: New image manifest format (schemaVersion = 2) -- `application/vnd.docker.distribution.manifest.list.v2+json`: Manifest list, aka "fat manifest" -- `application/vnd.docker.container.image.v1+json`: Container config JSON -- `application/vnd.docker.image.rootfs.diff.tar.gzip`: "Layer", as a gzipped tar -- `application/vnd.docker.image.rootfs.foreign.diff.tar.gzip`: "Layer", as a gzipped tar that should never be pushed -- `application/vnd.docker.plugin.v1+json`: Plugin config JSON - -## Manifest List - -The manifest list is the "fat manifest" which points to specific image manifests -for one or more platforms. Its use is optional, and relatively few images will -use one of these manifests. A client will distinguish a manifest list from an -image manifest based on the Content-Type returned in the HTTP response. - -## *Manifest List* Field Descriptions - -- **`schemaVersion`** *int* - - This field specifies the image manifest schema version as an integer. This - schema uses the version `2`. - -- **`mediaType`** *string* - - The MIME type of the manifest list. This should be set to - `application/vnd.docker.distribution.manifest.list.v2+json`. - -- **`manifests`** *array* - - The manifests field contains a list of manifests for specific platforms. - - Fields of an object in the manifests list are: - - - **`mediaType`** *string* - - The MIME type of the referenced object. This will generally be - `application/vnd.docker.image.manifest.v2+json`, but it could also - be `application/vnd.docker.image.manifest.v1+json` if the manifest - list references a legacy schema-1 manifest. - - - **`size`** *int* - - The size in bytes of the object. This field exists so that a client - will have an expected size for the content before validating. If the - length of the retrieved content does not match the specified length, - the content should not be trusted. - - - **`digest`** *string* - - The digest of the content, as defined by the - [Registry V2 HTTP API Specificiation](api.md#digest-parameter). - - - **`platform`** *object* - - The platform object describes the platform which the image in the - manifest runs on. A full list of valid operating system and architecture - values are listed in the [Go language documentation for `$GOOS` and - `$GOARCH`](https://golang.org/doc/install/source#environment) - - - **`architecture`** *string* - - The architecture field specifies the CPU architecture, for example - `amd64` or `ppc64le`. - - - **`os`** *string* - - The os field specifies the operating system, for example - `linux` or `windows`. - - - **`os.version`** *string* - - The optional os.version field specifies the operating system version, - for example `10.0.10586`. - - - **`os.features`** *array* - - The optional os.features field specifies an array of strings, - each listing a required OS feature (for example on Windows - `win32k`). - - - **`variant`** *string* - - The optional variant field specifies a variant of the CPU, for - example `armv6l` to specify a particular CPU variant of the ARM CPU. - - - **`features`** *array* - - The optional features field specifies an array of strings, each - listing a required CPU feature (for example `sse4` or `aes`). - -## Example Manifest List - -*Example showing a simple manifest list pointing to image manifests for two platforms:* -```json -{ - "schemaVersion": 2, - "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", - "manifests": [ - { - "mediaType": "application/vnd.docker.image.manifest.v2+json", - "size": 7143, - "digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f", - "platform": { - "architecture": "ppc64le", - "os": "linux", - } - }, - { - "mediaType": "application/vnd.docker.image.manifest.v2+json", - "size": 7682, - "digest": "sha256:5b0bcabd1ed22e9fb1310cf6c2dec7cdef19f0ad69efa1f392e94a4333501270", - "platform": { - "architecture": "amd64", - "os": "linux", - "features": [ - "sse4" - ] - } - } - ] -} -``` - -# Image Manifest - -The image manifest provides a configuration and a set of layers for a container -image. It's the direct replacement for the schema-1 manifest. - -## *Image Manifest* Field Descriptions - -- **`schemaVersion`** *int* - - This field specifies the image manifest schema version as an integer. This - schema uses version `2`. - -- **`mediaType`** *string* - - The MIME type of the manifest. This should be set to - `application/vnd.docker.distribution.manifest.v2+json`. - -- **`config`** *object* - - The config field references a configuration object for a container, by - digest. This configuration item is a JSON blob that the runtime uses - to set up the container. This new schema uses a tweaked version - of this configuration to allow image content-addressability on the - daemon side. - - Fields of a config object are: - - - **`mediaType`** *string* - - The MIME type of the referenced object. This should generally be - `application/vnd.docker.container.image.v1+json`. - - - **`size`** *int* - - The size in bytes of the object. This field exists so that a client - will have an expected size for the content before validating. If the - length of the retrieved content does not match the specified length, - the content should not be trusted. - - - **`digest`** *string* - - The digest of the content, as defined by the - [Registry V2 HTTP API Specificiation](api.md#digest-parameter). - -- **`layers`** *array* - - The layer list is ordered starting from the base image (opposite order of schema1). - - Fields of an item in the layers list are: - - - **`mediaType`** *string* - - The MIME type of the referenced object. This should - generally be `application/vnd.docker.image.rootfs.diff.tar.gzip`. - Layers of type - `application/vnd.docker.image.rootfs.foreign.diff.tar.gzip` may be - pulled from a remote location but they should never be pushed. - - - **`size`** *int* - - The size in bytes of the object. This field exists so that a client - will have an expected size for the content before validating. If the - length of the retrieved content does not match the specified length, - the content should not be trusted. - - - **`digest`** *string* - - The digest of the content, as defined by the - [Registry V2 HTTP API Specificiation](api.md#digest-parameter). - - - **`urls`** *array* - - Provides a list of URLs from which the content may be fetched. Content - should be verified against the `digest` and `size`. This field is - optional and uncommon. - -## Example Image Manifest - -*Example showing an image manifest:* -```json -{ - "schemaVersion": 2, - "mediaType": "application/vnd.docker.distribution.manifest.v2+json", - "config": { - "mediaType": "application/vnd.docker.container.image.v1+json", - "size": 7023, - "digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7" - }, - "layers": [ - { - "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", - "size": 32654, - "digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f" - }, - { - "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", - "size": 16724, - "digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b" - }, - { - "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", - "size": 73109, - "digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736" - } - ] -} -``` - -# Backward compatibility - -The registry will continue to accept uploads of manifests in both the old and -new formats. - -When pushing images, clients which support the new manifest format should first -construct a manifest in the new format. If uploading this manifest fails, -presumably because the registry only supports the old format, the client may -fall back to uploading a manifest in the old format. - -When pulling images, clients indicate support for this new version of the -manifest format by sending the -`application/vnd.docker.distribution.manifest.v2+json` and -`application/vnd.docker.distribution.manifest.list.v2+json` media types in an -`Accept` header when making a request to the `manifests` endpoint. Updated -clients should check the `Content-Type` header to see whether the manifest -returned from the endpoint is in the old format, or is an image manifest or -manifest list in the new format. - -If the manifest being requested uses the new format, and the appropriate media -type is not present in an `Accept` header, the registry will assume that the -client cannot handle the manifest as-is, and rewrite it on the fly into the old -format. If the object that would otherwise be returned is a manifest list, the -registry will look up the appropriate manifest for the amd64 platform and -linux OS, rewrite that manifest into the old format if necessary, and return -the result to the client. If no suitable manifest is found in the manifest -list, the registry will return a 404 error. - -One of the challenges in rewriting manifests to the old format is that the old -format involves an image configuration for each layer in the manifest, but the -new format only provides one image configuration. To work around this, the -registry will create synthetic image configurations for all layers except the -top layer. These image configurations will not result in runnable images on -their own, but only serve to fill in the parent chain in a compatible way. -The IDs in these synthetic configurations will be derived from hashes of their -respective blobs. The registry will create these configurations and their IDs -using the same scheme as Docker 1.10 when it creates a legacy manifest to push -to a registry which doesn't support the new format. diff --git a/vendor/github.com/docker/distribution/docs/spec/menu.md b/vendor/github.com/docker/distribution/docs/spec/menu.md deleted file mode 100644 index 9237e3ce8..000000000 --- a/vendor/github.com/docker/distribution/docs/spec/menu.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Reference" -description: "Explains registry JSON objects" -keywords: ["registry, service, images, repository, json"] -type: "menu" -identifier: "smn_registry_ref" ---- diff --git a/vendor/github.com/docker/distribution/health/api/api.go b/vendor/github.com/docker/distribution/health/api/api.go deleted file mode 100644 index 73fcc4535..000000000 --- a/vendor/github.com/docker/distribution/health/api/api.go +++ /dev/null @@ -1,37 +0,0 @@ -package api - -import ( - "errors" - "net/http" - - "github.com/docker/distribution/health" -) - -var ( - updater = health.NewStatusUpdater() -) - -// DownHandler registers a manual_http_status that always returns an Error -func DownHandler(w http.ResponseWriter, r *http.Request) { - if r.Method == "POST" { - updater.Update(errors.New("Manual Check")) - } else { - w.WriteHeader(http.StatusNotFound) - } -} - -// UpHandler registers a manual_http_status that always returns nil -func UpHandler(w http.ResponseWriter, r *http.Request) { - if r.Method == "POST" { - updater.Update(nil) - } else { - w.WriteHeader(http.StatusNotFound) - } -} - -// init sets up the two endpoints to bring the service up and down -func init() { - health.Register("manual_http_status", updater) - http.HandleFunc("/debug/health/down", DownHandler) - http.HandleFunc("/debug/health/up", UpHandler) -} diff --git a/vendor/github.com/docker/distribution/health/api/api_test.go b/vendor/github.com/docker/distribution/health/api/api_test.go deleted file mode 100644 index ec82154f6..000000000 --- a/vendor/github.com/docker/distribution/health/api/api_test.go +++ /dev/null @@ -1,86 +0,0 @@ -package api - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/docker/distribution/health" -) - -// TestGETDownHandlerDoesNotChangeStatus ensures that calling the endpoint -// /debug/health/down with METHOD GET returns a 404 -func TestGETDownHandlerDoesNotChangeStatus(t *testing.T) { - recorder := httptest.NewRecorder() - - req, err := http.NewRequest("GET", "https://fakeurl.com/debug/health/down", nil) - if err != nil { - t.Errorf("Failed to create request.") - } - - DownHandler(recorder, req) - - if recorder.Code != 404 { - t.Errorf("Did not get a 404.") - } -} - -// TestGETUpHandlerDoesNotChangeStatus ensures that calling the endpoint -// /debug/health/down with METHOD GET returns a 404 -func TestGETUpHandlerDoesNotChangeStatus(t *testing.T) { - recorder := httptest.NewRecorder() - - req, err := http.NewRequest("GET", "https://fakeurl.com/debug/health/up", nil) - if err != nil { - t.Errorf("Failed to create request.") - } - - DownHandler(recorder, req) - - if recorder.Code != 404 { - t.Errorf("Did not get a 404.") - } -} - -// TestPOSTDownHandlerChangeStatus ensures the endpoint /debug/health/down changes -// the status code of the response to 503 -// This test is order dependent, and should come before TestPOSTUpHandlerChangeStatus -func TestPOSTDownHandlerChangeStatus(t *testing.T) { - recorder := httptest.NewRecorder() - - req, err := http.NewRequest("POST", "https://fakeurl.com/debug/health/down", nil) - if err != nil { - t.Errorf("Failed to create request.") - } - - DownHandler(recorder, req) - - if recorder.Code != 200 { - t.Errorf("Did not get a 200.") - } - - if len(health.CheckStatus()) != 1 { - t.Errorf("DownHandler didn't add an error check.") - } -} - -// TestPOSTUpHandlerChangeStatus ensures the endpoint /debug/health/up changes -// the status code of the response to 200 -func TestPOSTUpHandlerChangeStatus(t *testing.T) { - recorder := httptest.NewRecorder() - - req, err := http.NewRequest("POST", "https://fakeurl.com/debug/health/up", nil) - if err != nil { - t.Errorf("Failed to create request.") - } - - UpHandler(recorder, req) - - if recorder.Code != 200 { - t.Errorf("Did not get a 200.") - } - - if len(health.CheckStatus()) != 0 { - t.Errorf("UpHandler didn't remove the error check.") - } -} diff --git a/vendor/github.com/docker/distribution/health/checks/checks.go b/vendor/github.com/docker/distribution/health/checks/checks.go deleted file mode 100644 index e3c3b08d3..000000000 --- a/vendor/github.com/docker/distribution/health/checks/checks.go +++ /dev/null @@ -1,62 +0,0 @@ -package checks - -import ( - "errors" - "net" - "net/http" - "os" - "strconv" - "time" - - "github.com/docker/distribution/health" -) - -// FileChecker checks the existence of a file and returns an error -// if the file exists. -func FileChecker(f string) health.Checker { - return health.CheckFunc(func() error { - if _, err := os.Stat(f); err == nil { - return errors.New("file exists") - } - return nil - }) -} - -// HTTPChecker does a HEAD request and verifies that the HTTP status code -// returned matches statusCode. -func HTTPChecker(r string, statusCode int, timeout time.Duration, headers http.Header) health.Checker { - return health.CheckFunc(func() error { - client := http.Client{ - Timeout: timeout, - } - req, err := http.NewRequest("HEAD", r, nil) - if err != nil { - return errors.New("error creating request: " + r) - } - for headerName, headerValues := range headers { - for _, headerValue := range headerValues { - req.Header.Add(headerName, headerValue) - } - } - response, err := client.Do(req) - if err != nil { - return errors.New("error while checking: " + r) - } - if response.StatusCode != statusCode { - return errors.New("downstream service returned unexpected status: " + strconv.Itoa(response.StatusCode)) - } - return nil - }) -} - -// TCPChecker attempts to open a TCP connection. -func TCPChecker(addr string, timeout time.Duration) health.Checker { - return health.CheckFunc(func() error { - conn, err := net.DialTimeout("tcp", addr, timeout) - if err != nil { - return errors.New("connection to " + addr + " failed") - } - conn.Close() - return nil - }) -} diff --git a/vendor/github.com/docker/distribution/health/checks/checks_test.go b/vendor/github.com/docker/distribution/health/checks/checks_test.go deleted file mode 100644 index 6b6dd14fa..000000000 --- a/vendor/github.com/docker/distribution/health/checks/checks_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package checks - -import ( - "testing" -) - -func TestFileChecker(t *testing.T) { - if err := FileChecker("/tmp").Check(); err == nil { - t.Errorf("/tmp was expected as exists") - } - - if err := FileChecker("NoSuchFileFromMoon").Check(); err != nil { - t.Errorf("NoSuchFileFromMoon was expected as not exists, error:%v", err) - } -} - -func TestHTTPChecker(t *testing.T) { - if err := HTTPChecker("https://www.google.cybertron", 200, 0, nil).Check(); err == nil { - t.Errorf("Google on Cybertron was expected as not exists") - } - - if err := HTTPChecker("https://www.google.pt", 200, 0, nil).Check(); err != nil { - t.Errorf("Google at Portugal was expected as exists, error:%v", err) - } -} diff --git a/vendor/github.com/docker/distribution/health/doc.go b/vendor/github.com/docker/distribution/health/doc.go deleted file mode 100644 index 8c106b42b..000000000 --- a/vendor/github.com/docker/distribution/health/doc.go +++ /dev/null @@ -1,130 +0,0 @@ -// Package health provides a generic health checking framework. -// The health package works expvar style. By importing the package the debug -// server is getting a "/debug/health" endpoint that returns the current -// status of the application. -// If there are no errors, "/debug/health" will return an HTTP 200 status, -// together with an empty JSON reply "{}". If there are any checks -// with errors, the JSON reply will include all the failed checks, and the -// response will be have an HTTP 503 status. -// -// A Check can either be run synchronously, or asynchronously. We recommend -// that most checks are registered as an asynchronous check, so a call to the -// "/debug/health" endpoint always returns immediately. This pattern is -// particularly useful for checks that verify upstream connectivity or -// database status, since they might take a long time to return/timeout. -// -// Installing -// -// To install health, just import it in your application: -// -// import "github.com/docker/distribution/health" -// -// You can also (optionally) import "health/api" that will add two convenience -// endpoints: "/debug/health/down" and "/debug/health/up". These endpoints add -// "manual" checks that allow the service to quickly be brought in/out of -// rotation. -// -// import _ "github.com/docker/distribution/registry/health/api" -// -// # curl localhost:5001/debug/health -// {} -// # curl -X POST localhost:5001/debug/health/down -// # curl localhost:5001/debug/health -// {"manual_http_status":"Manual Check"} -// -// After importing these packages to your main application, you can start -// registering checks. -// -// Registering Checks -// -// The recommended way of registering checks is using a periodic Check. -// PeriodicChecks run on a certain schedule and asynchronously update the -// status of the check. This allows CheckStatus to return without blocking -// on an expensive check. -// -// A trivial example of a check that runs every 5 seconds and shuts down our -// server if the current minute is even, could be added as follows: -// -// func currentMinuteEvenCheck() error { -// m := time.Now().Minute() -// if m%2 == 0 { -// return errors.New("Current minute is even!") -// } -// return nil -// } -// -// health.RegisterPeriodicFunc("minute_even", currentMinuteEvenCheck, time.Second*5) -// -// Alternatively, you can also make use of "RegisterPeriodicThresholdFunc" to -// implement the exact same check, but add a threshold of failures after which -// the check will be unhealthy. This is particularly useful for flaky Checks, -// ensuring some stability of the service when handling them. -// -// health.RegisterPeriodicThresholdFunc("minute_even", currentMinuteEvenCheck, time.Second*5, 4) -// -// The lowest-level way to interact with the health package is calling -// "Register" directly. Register allows you to pass in an arbitrary string and -// something that implements "Checker" and runs your check. If your method -// returns an error with nil, it is considered a healthy check, otherwise it -// will make the health check endpoint "/debug/health" start returning a 503 -// and list the specific check that failed. -// -// Assuming you wish to register a method called "currentMinuteEvenCheck() -// error" you could do that by doing: -// -// health.Register("even_minute", health.CheckFunc(currentMinuteEvenCheck)) -// -// CheckFunc is a convenience type that implements Checker. -// -// Another way of registering a check could be by using an anonymous function -// and the convenience method RegisterFunc. An example that makes the status -// endpoint always return an error: -// -// health.RegisterFunc("my_check", func() error { -// return Errors.new("This is an error!") -// })) -// -// Examples -// -// You could also use the health checker mechanism to ensure your application -// only comes up if certain conditions are met, or to allow the developer to -// take the service out of rotation immediately. An example that checks -// database connectivity and immediately takes the server out of rotation on -// err: -// -// updater = health.NewStatusUpdater() -// health.RegisterFunc("database_check", func() error { -// return updater.Check() -// })) -// -// conn, err := Connect(...) // database call here -// if err != nil { -// updater.Update(errors.New("Error connecting to the database: " + err.Error())) -// } -// -// You can also use the predefined Checkers that come included with the health -// package. First, import the checks: -// -// import "github.com/docker/distribution/health/checks -// -// After that you can make use of any of the provided checks. An example of -// using a `FileChecker` to take the application out of rotation if a certain -// file exists can be done as follows: -// -// health.Register("fileChecker", health.PeriodicChecker(checks.FileChecker("/tmp/disable"), time.Second*5)) -// -// After registering the check, it is trivial to take an application out of -// rotation from the console: -// -// # curl localhost:5001/debug/health -// {} -// # touch /tmp/disable -// # curl localhost:5001/debug/health -// {"fileChecker":"file exists"} -// -// You could also test the connectivity to a downstream service by using a -// "HTTPChecker", but ensure that you only mark the test unhealthy if there -// are a minimum of two failures in a row: -// -// health.Register("httpChecker", health.PeriodicThresholdChecker(checks.HTTPChecker("https://www.google.pt"), time.Second*5, 2)) -package health diff --git a/vendor/github.com/docker/distribution/health/health.go b/vendor/github.com/docker/distribution/health/health.go deleted file mode 100644 index 220282dcd..000000000 --- a/vendor/github.com/docker/distribution/health/health.go +++ /dev/null @@ -1,306 +0,0 @@ -package health - -import ( - "encoding/json" - "fmt" - "net/http" - "sync" - "time" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/api/errcode" -) - -// A Registry is a collection of checks. Most applications will use the global -// registry defined in DefaultRegistry. However, unit tests may need to create -// separate registries to isolate themselves from other tests. -type Registry struct { - mu sync.RWMutex - registeredChecks map[string]Checker -} - -// NewRegistry creates a new registry. This isn't necessary for normal use of -// the package, but may be useful for unit tests so individual tests have their -// own set of checks. -func NewRegistry() *Registry { - return &Registry{ - registeredChecks: make(map[string]Checker), - } -} - -// DefaultRegistry is the default registry where checks are registered. It is -// the registry used by the HTTP handler. -var DefaultRegistry *Registry - -// Checker is the interface for a Health Checker -type Checker interface { - // Check returns nil if the service is okay. - Check() error -} - -// CheckFunc is a convenience type to create functions that implement -// the Checker interface -type CheckFunc func() error - -// Check Implements the Checker interface to allow for any func() error method -// to be passed as a Checker -func (cf CheckFunc) Check() error { - return cf() -} - -// Updater implements a health check that is explicitly set. -type Updater interface { - Checker - - // Update updates the current status of the health check. - Update(status error) -} - -// updater implements Checker and Updater, providing an asynchronous Update -// method. -// This allows us to have a Checker that returns the Check() call immediately -// not blocking on a potentially expensive check. -type updater struct { - mu sync.Mutex - status error -} - -// Check implements the Checker interface -func (u *updater) Check() error { - u.mu.Lock() - defer u.mu.Unlock() - - return u.status -} - -// Update implements the Updater interface, allowing asynchronous access to -// the status of a Checker. -func (u *updater) Update(status error) { - u.mu.Lock() - defer u.mu.Unlock() - - u.status = status -} - -// NewStatusUpdater returns a new updater -func NewStatusUpdater() Updater { - return &updater{} -} - -// thresholdUpdater implements Checker and Updater, providing an asynchronous Update -// method. -// This allows us to have a Checker that returns the Check() call immediately -// not blocking on a potentially expensive check. -type thresholdUpdater struct { - mu sync.Mutex - status error - threshold int - count int -} - -// Check implements the Checker interface -func (tu *thresholdUpdater) Check() error { - tu.mu.Lock() - defer tu.mu.Unlock() - - if tu.count >= tu.threshold { - return tu.status - } - - return nil -} - -// thresholdUpdater implements the Updater interface, allowing asynchronous -// access to the status of a Checker. -func (tu *thresholdUpdater) Update(status error) { - tu.mu.Lock() - defer tu.mu.Unlock() - - if status == nil { - tu.count = 0 - } else if tu.count < tu.threshold { - tu.count++ - } - - tu.status = status -} - -// NewThresholdStatusUpdater returns a new thresholdUpdater -func NewThresholdStatusUpdater(t int) Updater { - return &thresholdUpdater{threshold: t} -} - -// PeriodicChecker wraps an updater to provide a periodic checker -func PeriodicChecker(check Checker, period time.Duration) Checker { - u := NewStatusUpdater() - go func() { - t := time.NewTicker(period) - for { - <-t.C - u.Update(check.Check()) - } - }() - - return u -} - -// PeriodicThresholdChecker wraps an updater to provide a periodic checker that -// uses a threshold before it changes status -func PeriodicThresholdChecker(check Checker, period time.Duration, threshold int) Checker { - tu := NewThresholdStatusUpdater(threshold) - go func() { - t := time.NewTicker(period) - for { - <-t.C - tu.Update(check.Check()) - } - }() - - return tu -} - -// CheckStatus returns a map with all the current health check errors -func (registry *Registry) CheckStatus() map[string]string { // TODO(stevvooe) this needs a proper type - registry.mu.RLock() - defer registry.mu.RUnlock() - statusKeys := make(map[string]string) - for k, v := range registry.registeredChecks { - err := v.Check() - if err != nil { - statusKeys[k] = err.Error() - } - } - - return statusKeys -} - -// CheckStatus returns a map with all the current health check errors from the -// default registry. -func CheckStatus() map[string]string { - return DefaultRegistry.CheckStatus() -} - -// Register associates the checker with the provided name. -func (registry *Registry) Register(name string, check Checker) { - if registry == nil { - registry = DefaultRegistry - } - registry.mu.Lock() - defer registry.mu.Unlock() - _, ok := registry.registeredChecks[name] - if ok { - panic("Check already exists: " + name) - } - registry.registeredChecks[name] = check -} - -// Register associates the checker with the provided name in the default -// registry. -func Register(name string, check Checker) { - DefaultRegistry.Register(name, check) -} - -// RegisterFunc allows the convenience of registering a checker directly from -// an arbitrary func() error. -func (registry *Registry) RegisterFunc(name string, check func() error) { - registry.Register(name, CheckFunc(check)) -} - -// RegisterFunc allows the convenience of registering a checker in the default -// registry directly from an arbitrary func() error. -func RegisterFunc(name string, check func() error) { - DefaultRegistry.RegisterFunc(name, check) -} - -// RegisterPeriodicFunc allows the convenience of registering a PeriodicChecker -// from an arbitrary func() error. -func (registry *Registry) RegisterPeriodicFunc(name string, period time.Duration, check CheckFunc) { - registry.Register(name, PeriodicChecker(CheckFunc(check), period)) -} - -// RegisterPeriodicFunc allows the convenience of registering a PeriodicChecker -// in the default registry from an arbitrary func() error. -func RegisterPeriodicFunc(name string, period time.Duration, check CheckFunc) { - DefaultRegistry.RegisterPeriodicFunc(name, period, check) -} - -// RegisterPeriodicThresholdFunc allows the convenience of registering a -// PeriodicChecker from an arbitrary func() error. -func (registry *Registry) RegisterPeriodicThresholdFunc(name string, period time.Duration, threshold int, check CheckFunc) { - registry.Register(name, PeriodicThresholdChecker(CheckFunc(check), period, threshold)) -} - -// RegisterPeriodicThresholdFunc allows the convenience of registering a -// PeriodicChecker in the default registry from an arbitrary func() error. -func RegisterPeriodicThresholdFunc(name string, period time.Duration, threshold int, check CheckFunc) { - DefaultRegistry.RegisterPeriodicThresholdFunc(name, period, threshold, check) -} - -// StatusHandler returns a JSON blob with all the currently registered Health Checks -// and their corresponding status. -// Returns 503 if any Error status exists, 200 otherwise -func StatusHandler(w http.ResponseWriter, r *http.Request) { - if r.Method == "GET" { - checks := CheckStatus() - status := http.StatusOK - - // If there is an error, return 503 - if len(checks) != 0 { - status = http.StatusServiceUnavailable - } - - statusResponse(w, r, status, checks) - } else { - http.NotFound(w, r) - } -} - -// Handler returns a handler that will return 503 response code if the health -// checks have failed. If everything is okay with the health checks, the -// handler will pass through to the provided handler. Use this handler to -// disable a web application when the health checks fail. -func Handler(handler http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - checks := CheckStatus() - if len(checks) != 0 { - errcode.ServeJSON(w, errcode.ErrorCodeUnavailable. - WithDetail("health check failed: please see /debug/health")) - return - } - - handler.ServeHTTP(w, r) // pass through - }) -} - -// statusResponse completes the request with a response describing the health -// of the service. -func statusResponse(w http.ResponseWriter, r *http.Request, status int, checks map[string]string) { - p, err := json.Marshal(checks) - if err != nil { - context.GetLogger(context.Background()).Errorf("error serializing health status: %v", err) - p, err = json.Marshal(struct { - ServerError string `json:"server_error"` - }{ - ServerError: "Could not parse error message", - }) - status = http.StatusInternalServerError - - if err != nil { - context.GetLogger(context.Background()).Errorf("error serializing health status failure message: %v", err) - return - } - } - - w.Header().Set("Content-Type", "application/json; charset=utf-8") - w.Header().Set("Content-Length", fmt.Sprint(len(p))) - w.WriteHeader(status) - if _, err := w.Write(p); err != nil { - context.GetLogger(context.Background()).Errorf("error writing health status response body: %v", err) - } -} - -// Registers global /debug/health api endpoint, creates default registry -func init() { - DefaultRegistry = NewRegistry() - http.HandleFunc("/debug/health", StatusHandler) -} diff --git a/vendor/github.com/docker/distribution/health/health_test.go b/vendor/github.com/docker/distribution/health/health_test.go deleted file mode 100644 index 766fe159f..000000000 --- a/vendor/github.com/docker/distribution/health/health_test.go +++ /dev/null @@ -1,107 +0,0 @@ -package health - -import ( - "errors" - "fmt" - "net/http" - "net/http/httptest" - "testing" -) - -// TestReturns200IfThereAreNoChecks ensures that the result code of the health -// endpoint is 200 if there are not currently registered checks. -func TestReturns200IfThereAreNoChecks(t *testing.T) { - recorder := httptest.NewRecorder() - - req, err := http.NewRequest("GET", "https://fakeurl.com/debug/health", nil) - if err != nil { - t.Errorf("Failed to create request.") - } - - StatusHandler(recorder, req) - - if recorder.Code != 200 { - t.Errorf("Did not get a 200.") - } -} - -// TestReturns500IfThereAreErrorChecks ensures that the result code of the -// health endpoint is 500 if there are health checks with errors -func TestReturns503IfThereAreErrorChecks(t *testing.T) { - recorder := httptest.NewRecorder() - - req, err := http.NewRequest("GET", "https://fakeurl.com/debug/health", nil) - if err != nil { - t.Errorf("Failed to create request.") - } - - // Create a manual error - Register("some_check", CheckFunc(func() error { - return errors.New("This Check did not succeed") - })) - - StatusHandler(recorder, req) - - if recorder.Code != 503 { - t.Errorf("Did not get a 503.") - } -} - -// TestHealthHandler ensures that our handler implementation correct protects -// the web application when things aren't so healthy. -func TestHealthHandler(t *testing.T) { - // clear out existing checks. - DefaultRegistry = NewRegistry() - - // protect an http server - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusNoContent) - })) - - // wrap it in our health handler - handler = Handler(handler) - - // use this swap check status - updater := NewStatusUpdater() - Register("test_check", updater) - - // now, create a test server - server := httptest.NewServer(handler) - - checkUp := func(t *testing.T, message string) { - resp, err := http.Get(server.URL) - if err != nil { - t.Fatalf("error getting success status: %v", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusNoContent { - t.Fatalf("unexpected response code from server when %s: %d != %d", message, resp.StatusCode, http.StatusNoContent) - } - // NOTE(stevvooe): we really don't care about the body -- the format is - // not standardized or supported, yet. - } - - checkDown := func(t *testing.T, message string) { - resp, err := http.Get(server.URL) - if err != nil { - t.Fatalf("error getting down status: %v", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusServiceUnavailable { - t.Fatalf("unexpected response code from server when %s: %d != %d", message, resp.StatusCode, http.StatusServiceUnavailable) - } - } - - // server should be up - checkUp(t, "initial health check") - - // now, we fail the health check - updater.Update(fmt.Errorf("the server is now out of commission")) - checkDown(t, "server should be down") // should be down - - // bring server back up - updater.Update(nil) - checkUp(t, "when server is back up") // now we should be back up. -} diff --git a/vendor/github.com/docker/distribution/manifest/doc.go b/vendor/github.com/docker/distribution/manifest/doc.go deleted file mode 100644 index 88367b0a0..000000000 --- a/vendor/github.com/docker/distribution/manifest/doc.go +++ /dev/null @@ -1 +0,0 @@ -package manifest diff --git a/vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist.go b/vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist.go deleted file mode 100644 index a2082ec02..000000000 --- a/vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist.go +++ /dev/null @@ -1,155 +0,0 @@ -package manifestlist - -import ( - "encoding/json" - "errors" - "fmt" - - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" -) - -// MediaTypeManifestList specifies the mediaType for manifest lists. -const MediaTypeManifestList = "application/vnd.docker.distribution.manifest.list.v2+json" - -// SchemaVersion provides a pre-initialized version structure for this -// packages version of the manifest. -var SchemaVersion = manifest.Versioned{ - SchemaVersion: 2, - MediaType: MediaTypeManifestList, -} - -func init() { - manifestListFunc := func(b []byte) (distribution.Manifest, distribution.Descriptor, error) { - m := new(DeserializedManifestList) - err := m.UnmarshalJSON(b) - if err != nil { - return nil, distribution.Descriptor{}, err - } - - dgst := digest.FromBytes(b) - return m, distribution.Descriptor{Digest: dgst, Size: int64(len(b)), MediaType: MediaTypeManifestList}, err - } - err := distribution.RegisterManifestSchema(MediaTypeManifestList, manifestListFunc) - if err != nil { - panic(fmt.Sprintf("Unable to register manifest: %s", err)) - } -} - -// PlatformSpec specifies a platform where a particular image manifest is -// applicable. -type PlatformSpec struct { - // Architecture field specifies the CPU architecture, for example - // `amd64` or `ppc64`. - Architecture string `json:"architecture"` - - // OS specifies the operating system, for example `linux` or `windows`. - OS string `json:"os"` - - // OSVersion is an optional field specifying the operating system - // version, for example `10.0.10586`. - OSVersion string `json:"os.version,omitempty"` - - // OSFeatures is an optional field specifying an array of strings, - // each listing a required OS feature (for example on Windows `win32k`). - OSFeatures []string `json:"os.features,omitempty"` - - // Variant is an optional field specifying a variant of the CPU, for - // example `ppc64le` to specify a little-endian version of a PowerPC CPU. - Variant string `json:"variant,omitempty"` - - // Features is an optional field specifying an array of strings, each - // listing a required CPU feature (for example `sse4` or `aes`). - Features []string `json:"features,omitempty"` -} - -// A ManifestDescriptor references a platform-specific manifest. -type ManifestDescriptor struct { - distribution.Descriptor - - // Platform specifies which platform the manifest pointed to by the - // descriptor runs on. - Platform PlatformSpec `json:"platform"` -} - -// ManifestList references manifests for various platforms. -type ManifestList struct { - manifest.Versioned - - // Config references the image configuration as a blob. - Manifests []ManifestDescriptor `json:"manifests"` -} - -// References returnes the distribution descriptors for the referenced image -// manifests. -func (m ManifestList) References() []distribution.Descriptor { - dependencies := make([]distribution.Descriptor, len(m.Manifests)) - for i := range m.Manifests { - dependencies[i] = m.Manifests[i].Descriptor - } - - return dependencies -} - -// DeserializedManifestList wraps ManifestList with a copy of the original -// JSON. -type DeserializedManifestList struct { - ManifestList - - // canonical is the canonical byte representation of the Manifest. - canonical []byte -} - -// FromDescriptors takes a slice of descriptors, and returns a -// DeserializedManifestList which contains the resulting manifest list -// and its JSON representation. -func FromDescriptors(descriptors []ManifestDescriptor) (*DeserializedManifestList, error) { - m := ManifestList{ - Versioned: SchemaVersion, - } - - m.Manifests = make([]ManifestDescriptor, len(descriptors), len(descriptors)) - copy(m.Manifests, descriptors) - - deserialized := DeserializedManifestList{ - ManifestList: m, - } - - var err error - deserialized.canonical, err = json.MarshalIndent(&m, "", " ") - return &deserialized, err -} - -// UnmarshalJSON populates a new ManifestList struct from JSON data. -func (m *DeserializedManifestList) UnmarshalJSON(b []byte) error { - m.canonical = make([]byte, len(b), len(b)) - // store manifest list in canonical - copy(m.canonical, b) - - // Unmarshal canonical JSON into ManifestList object - var manifestList ManifestList - if err := json.Unmarshal(m.canonical, &manifestList); err != nil { - return err - } - - m.ManifestList = manifestList - - return nil -} - -// MarshalJSON returns the contents of canonical. If canonical is empty, -// marshals the inner contents. -func (m *DeserializedManifestList) MarshalJSON() ([]byte, error) { - if len(m.canonical) > 0 { - return m.canonical, nil - } - - return nil, errors.New("JSON representation not initialized in DeserializedManifestList") -} - -// Payload returns the raw content of the manifest list. The contents can be -// used to calculate the content identifier. -func (m DeserializedManifestList) Payload() (string, []byte, error) { - return m.MediaType, m.canonical, nil -} diff --git a/vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist_test.go b/vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist_test.go deleted file mode 100644 index 09e6ed1f0..000000000 --- a/vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package manifestlist - -import ( - "bytes" - "encoding/json" - "reflect" - "testing" - - "github.com/docker/distribution" -) - -var expectedManifestListSerialization = []byte(`{ - "schemaVersion": 2, - "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", - "manifests": [ - { - "mediaType": "application/vnd.docker.distribution.manifest.v2+json", - "size": 985, - "digest": "sha256:1a9ec845ee94c202b2d5da74a24f0ed2058318bfa9879fa541efaecba272e86b", - "platform": { - "architecture": "amd64", - "os": "linux", - "features": [ - "sse4" - ] - } - }, - { - "mediaType": "application/vnd.docker.distribution.manifest.v2+json", - "size": 2392, - "digest": "sha256:6346340964309634683409684360934680934608934608934608934068934608", - "platform": { - "architecture": "sun4m", - "os": "sunos" - } - } - ] -}`) - -func TestManifestList(t *testing.T) { - manifestDescriptors := []ManifestDescriptor{ - { - Descriptor: distribution.Descriptor{ - Digest: "sha256:1a9ec845ee94c202b2d5da74a24f0ed2058318bfa9879fa541efaecba272e86b", - Size: 985, - MediaType: "application/vnd.docker.distribution.manifest.v2+json", - }, - Platform: PlatformSpec{ - Architecture: "amd64", - OS: "linux", - Features: []string{"sse4"}, - }, - }, - { - Descriptor: distribution.Descriptor{ - Digest: "sha256:6346340964309634683409684360934680934608934608934608934068934608", - Size: 2392, - MediaType: "application/vnd.docker.distribution.manifest.v2+json", - }, - Platform: PlatformSpec{ - Architecture: "sun4m", - OS: "sunos", - }, - }, - } - - deserialized, err := FromDescriptors(manifestDescriptors) - if err != nil { - t.Fatalf("error creating DeserializedManifestList: %v", err) - } - - mediaType, canonical, err := deserialized.Payload() - - if mediaType != MediaTypeManifestList { - t.Fatalf("unexpected media type: %s", mediaType) - } - - // Check that the canonical field is the same as json.MarshalIndent - // with these parameters. - p, err := json.MarshalIndent(&deserialized.ManifestList, "", " ") - if err != nil { - t.Fatalf("error marshaling manifest list: %v", err) - } - if !bytes.Equal(p, canonical) { - t.Fatalf("manifest bytes not equal: %q != %q", string(canonical), string(p)) - } - - // Check that the canonical field has the expected value. - if !bytes.Equal(expectedManifestListSerialization, canonical) { - t.Fatalf("manifest bytes not equal: %q != %q", string(canonical), string(expectedManifestListSerialization)) - } - - var unmarshalled DeserializedManifestList - if err := json.Unmarshal(deserialized.canonical, &unmarshalled); err != nil { - t.Fatalf("error unmarshaling manifest: %v", err) - } - - if !reflect.DeepEqual(&unmarshalled, deserialized) { - t.Fatalf("manifests are different after unmarshaling: %v != %v", unmarshalled, *deserialized) - } - - references := deserialized.References() - if len(references) != 2 { - t.Fatalf("unexpected number of references: %d", len(references)) - } - for i := range references { - if !reflect.DeepEqual(references[i], manifestDescriptors[i].Descriptor) { - t.Fatalf("unexpected value %d returned by References: %v", i, references[i]) - } - } -} diff --git a/vendor/github.com/docker/distribution/manifest/schema1/config_builder.go b/vendor/github.com/docker/distribution/manifest/schema1/config_builder.go deleted file mode 100644 index be0123731..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema1/config_builder.go +++ /dev/null @@ -1,282 +0,0 @@ -package schema1 - -import ( - "crypto/sha512" - "encoding/json" - "errors" - "fmt" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/reference" - "github.com/docker/libtrust" -) - -type diffID digest.Digest - -// gzippedEmptyTar is a gzip-compressed version of an empty tar file -// (1024 NULL bytes) -var gzippedEmptyTar = []byte{ - 31, 139, 8, 0, 0, 9, 110, 136, 0, 255, 98, 24, 5, 163, 96, 20, 140, 88, - 0, 8, 0, 0, 255, 255, 46, 175, 181, 239, 0, 4, 0, 0, -} - -// digestSHA256GzippedEmptyTar is the canonical sha256 digest of -// gzippedEmptyTar -const digestSHA256GzippedEmptyTar = digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4") - -// configManifestBuilder is a type for constructing manifests from an image -// configuration and generic descriptors. -type configManifestBuilder struct { - // bs is a BlobService used to create empty layer tars in the - // blob store if necessary. - bs distribution.BlobService - // pk is the libtrust private key used to sign the final manifest. - pk libtrust.PrivateKey - // configJSON is configuration supplied when the ManifestBuilder was - // created. - configJSON []byte - // ref contains the name and optional tag provided to NewConfigManifestBuilder. - ref reference.Named - // descriptors is the set of descriptors referencing the layers. - descriptors []distribution.Descriptor - // emptyTarDigest is set to a valid digest if an empty tar has been - // put in the blob store; otherwise it is empty. - emptyTarDigest digest.Digest -} - -// NewConfigManifestBuilder is used to build new manifests for the current -// schema version from an image configuration and a set of descriptors. -// It takes a BlobService so that it can add an empty tar to the blob store -// if the resulting manifest needs empty layers. -func NewConfigManifestBuilder(bs distribution.BlobService, pk libtrust.PrivateKey, ref reference.Named, configJSON []byte) distribution.ManifestBuilder { - return &configManifestBuilder{ - bs: bs, - pk: pk, - configJSON: configJSON, - ref: ref, - } -} - -// Build produces a final manifest from the given references -func (mb *configManifestBuilder) Build(ctx context.Context) (m distribution.Manifest, err error) { - type imageRootFS struct { - Type string `json:"type"` - DiffIDs []diffID `json:"diff_ids,omitempty"` - BaseLayer string `json:"base_layer,omitempty"` - } - - type imageHistory struct { - Created time.Time `json:"created"` - Author string `json:"author,omitempty"` - CreatedBy string `json:"created_by,omitempty"` - Comment string `json:"comment,omitempty"` - EmptyLayer bool `json:"empty_layer,omitempty"` - } - - type imageConfig struct { - RootFS *imageRootFS `json:"rootfs,omitempty"` - History []imageHistory `json:"history,omitempty"` - Architecture string `json:"architecture,omitempty"` - } - - var img imageConfig - - if err := json.Unmarshal(mb.configJSON, &img); err != nil { - return nil, err - } - - if len(img.History) == 0 { - return nil, errors.New("empty history when trying to create schema1 manifest") - } - - if len(img.RootFS.DiffIDs) != len(mb.descriptors) { - return nil, fmt.Errorf("number of descriptors and number of layers in rootfs must match: len(%v) != len(%v)", img.RootFS.DiffIDs, mb.descriptors) - } - - // Generate IDs for each layer - // For non-top-level layers, create fake V1Compatibility strings that - // fit the format and don't collide with anything else, but don't - // result in runnable images on their own. - type v1Compatibility struct { - ID string `json:"id"` - Parent string `json:"parent,omitempty"` - Comment string `json:"comment,omitempty"` - Created time.Time `json:"created"` - ContainerConfig struct { - Cmd []string - } `json:"container_config,omitempty"` - Author string `json:"author,omitempty"` - ThrowAway bool `json:"throwaway,omitempty"` - } - - fsLayerList := make([]FSLayer, len(img.History)) - history := make([]History, len(img.History)) - - parent := "" - layerCounter := 0 - for i, h := range img.History[:len(img.History)-1] { - var blobsum digest.Digest - if h.EmptyLayer { - if blobsum, err = mb.emptyTar(ctx); err != nil { - return nil, err - } - } else { - if len(img.RootFS.DiffIDs) <= layerCounter { - return nil, errors.New("too many non-empty layers in History section") - } - blobsum = mb.descriptors[layerCounter].Digest - layerCounter++ - } - - v1ID := digest.FromBytes([]byte(blobsum.Hex() + " " + parent)).Hex() - - if i == 0 && img.RootFS.BaseLayer != "" { - // windows-only baselayer setup - baseID := sha512.Sum384([]byte(img.RootFS.BaseLayer)) - parent = fmt.Sprintf("%x", baseID[:32]) - } - - v1Compatibility := v1Compatibility{ - ID: v1ID, - Parent: parent, - Comment: h.Comment, - Created: h.Created, - Author: h.Author, - } - v1Compatibility.ContainerConfig.Cmd = []string{img.History[i].CreatedBy} - if h.EmptyLayer { - v1Compatibility.ThrowAway = true - } - jsonBytes, err := json.Marshal(&v1Compatibility) - if err != nil { - return nil, err - } - - reversedIndex := len(img.History) - i - 1 - history[reversedIndex].V1Compatibility = string(jsonBytes) - fsLayerList[reversedIndex] = FSLayer{BlobSum: blobsum} - - parent = v1ID - } - - latestHistory := img.History[len(img.History)-1] - - var blobsum digest.Digest - if latestHistory.EmptyLayer { - if blobsum, err = mb.emptyTar(ctx); err != nil { - return nil, err - } - } else { - if len(img.RootFS.DiffIDs) <= layerCounter { - return nil, errors.New("too many non-empty layers in History section") - } - blobsum = mb.descriptors[layerCounter].Digest - } - - fsLayerList[0] = FSLayer{BlobSum: blobsum} - dgst := digest.FromBytes([]byte(blobsum.Hex() + " " + parent + " " + string(mb.configJSON))) - - // Top-level v1compatibility string should be a modified version of the - // image config. - transformedConfig, err := MakeV1ConfigFromConfig(mb.configJSON, dgst.Hex(), parent, latestHistory.EmptyLayer) - if err != nil { - return nil, err - } - - history[0].V1Compatibility = string(transformedConfig) - - tag := "" - if tagged, isTagged := mb.ref.(reference.Tagged); isTagged { - tag = tagged.Tag() - } - - mfst := Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 1, - }, - Name: mb.ref.Name(), - Tag: tag, - Architecture: img.Architecture, - FSLayers: fsLayerList, - History: history, - } - - return Sign(&mfst, mb.pk) -} - -// emptyTar pushes a compressed empty tar to the blob store if one doesn't -// already exist, and returns its blobsum. -func (mb *configManifestBuilder) emptyTar(ctx context.Context) (digest.Digest, error) { - if mb.emptyTarDigest != "" { - // Already put an empty tar - return mb.emptyTarDigest, nil - } - - descriptor, err := mb.bs.Stat(ctx, digestSHA256GzippedEmptyTar) - switch err { - case nil: - mb.emptyTarDigest = descriptor.Digest - return descriptor.Digest, nil - case distribution.ErrBlobUnknown: - // nop - default: - return "", err - } - - // Add gzipped empty tar to the blob store - descriptor, err = mb.bs.Put(ctx, "", gzippedEmptyTar) - if err != nil { - return "", err - } - - mb.emptyTarDigest = descriptor.Digest - - return descriptor.Digest, nil -} - -// AppendReference adds a reference to the current ManifestBuilder -func (mb *configManifestBuilder) AppendReference(d distribution.Describable) error { - // todo: verification here? - mb.descriptors = append(mb.descriptors, d.Descriptor()) - return nil -} - -// References returns the current references added to this builder -func (mb *configManifestBuilder) References() []distribution.Descriptor { - return mb.descriptors -} - -// MakeV1ConfigFromConfig creates an legacy V1 image config from image config JSON -func MakeV1ConfigFromConfig(configJSON []byte, v1ID, parentV1ID string, throwaway bool) ([]byte, error) { - // Top-level v1compatibility string should be a modified version of the - // image config. - var configAsMap map[string]*json.RawMessage - if err := json.Unmarshal(configJSON, &configAsMap); err != nil { - return nil, err - } - - // Delete fields that didn't exist in old manifest - delete(configAsMap, "rootfs") - delete(configAsMap, "history") - configAsMap["id"] = rawJSON(v1ID) - if parentV1ID != "" { - configAsMap["parent"] = rawJSON(parentV1ID) - } - if throwaway { - configAsMap["throwaway"] = rawJSON(true) - } - - return json.Marshal(configAsMap) -} - -func rawJSON(value interface{}) *json.RawMessage { - jsonval, err := json.Marshal(value) - if err != nil { - return nil - } - return (*json.RawMessage)(&jsonval) -} diff --git a/vendor/github.com/docker/distribution/manifest/schema1/config_builder_test.go b/vendor/github.com/docker/distribution/manifest/schema1/config_builder_test.go deleted file mode 100644 index 5f9abaa9f..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema1/config_builder_test.go +++ /dev/null @@ -1,272 +0,0 @@ -package schema1 - -import ( - "bytes" - "compress/gzip" - "io" - "reflect" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/libtrust" -) - -type mockBlobService struct { - descriptors map[digest.Digest]distribution.Descriptor -} - -func (bs *mockBlobService) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - if descriptor, ok := bs.descriptors[dgst]; ok { - return descriptor, nil - } - return distribution.Descriptor{}, distribution.ErrBlobUnknown -} - -func (bs *mockBlobService) Get(ctx context.Context, dgst digest.Digest) ([]byte, error) { - panic("not implemented") -} - -func (bs *mockBlobService) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { - panic("not implemented") -} - -func (bs *mockBlobService) Put(ctx context.Context, mediaType string, p []byte) (distribution.Descriptor, error) { - d := distribution.Descriptor{ - Digest: digest.FromBytes(p), - Size: int64(len(p)), - MediaType: mediaType, - } - bs.descriptors[d.Digest] = d - return d, nil -} - -func (bs *mockBlobService) Create(ctx context.Context, options ...distribution.BlobCreateOption) (distribution.BlobWriter, error) { - panic("not implemented") -} - -func (bs *mockBlobService) Resume(ctx context.Context, id string) (distribution.BlobWriter, error) { - panic("not implemented") -} - -func TestEmptyTar(t *testing.T) { - // Confirm that gzippedEmptyTar expands to 1024 NULL bytes. - var decompressed [2048]byte - gzipReader, err := gzip.NewReader(bytes.NewReader(gzippedEmptyTar)) - if err != nil { - t.Fatalf("NewReader returned error: %v", err) - } - n, err := gzipReader.Read(decompressed[:]) - if n != 1024 { - t.Fatalf("read returned %d bytes; expected 1024", n) - } - n, err = gzipReader.Read(decompressed[1024:]) - if n != 0 { - t.Fatalf("read returned %d bytes; expected 0", n) - } - if err != io.EOF { - t.Fatal("read did not return io.EOF") - } - gzipReader.Close() - for _, b := range decompressed[:1024] { - if b != 0 { - t.Fatal("nonzero byte in decompressed tar") - } - } - - // Confirm that digestSHA256EmptyTar is the digest of gzippedEmptyTar. - dgst := digest.FromBytes(gzippedEmptyTar) - if dgst != digestSHA256GzippedEmptyTar { - t.Fatalf("digest mismatch for empty tar: expected %s got %s", digestSHA256GzippedEmptyTar, dgst) - } -} - -func TestConfigBuilder(t *testing.T) { - imgJSON := `{ - "architecture": "amd64", - "config": { - "AttachStderr": false, - "AttachStdin": false, - "AttachStdout": false, - "Cmd": [ - "/bin/sh", - "-c", - "echo hi" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "derived=true", - "asdf=true" - ], - "Hostname": "23304fc829f9", - "Image": "sha256:4ab15c48b859c2920dd5224f92aabcd39a52794c5b3cf088fb3bbb438756c246", - "Labels": {}, - "OnBuild": [], - "OpenStdin": false, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": null, - "WorkingDir": "" - }, - "container": "e91032eb0403a61bfe085ff5a5a48e3659e5a6deae9f4d678daa2ae399d5a001", - "container_config": { - "AttachStderr": false, - "AttachStdin": false, - "AttachStdout": false, - "Cmd": [ - "/bin/sh", - "-c", - "#(nop) CMD [\"/bin/sh\" \"-c\" \"echo hi\"]" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "derived=true", - "asdf=true" - ], - "Hostname": "23304fc829f9", - "Image": "sha256:4ab15c48b859c2920dd5224f92aabcd39a52794c5b3cf088fb3bbb438756c246", - "Labels": {}, - "OnBuild": [], - "OpenStdin": false, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": null, - "WorkingDir": "" - }, - "created": "2015-11-04T23:06:32.365666163Z", - "docker_version": "1.9.0-dev", - "history": [ - { - "created": "2015-10-31T22:22:54.690851953Z", - "created_by": "/bin/sh -c #(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /" - }, - { - "created": "2015-10-31T22:22:55.613815829Z", - "created_by": "/bin/sh -c #(nop) CMD [\"sh\"]" - }, - { - "created": "2015-11-04T23:06:30.934316144Z", - "created_by": "/bin/sh -c #(nop) ENV derived=true", - "empty_layer": true - }, - { - "created": "2015-11-04T23:06:31.192097572Z", - "created_by": "/bin/sh -c #(nop) ENV asdf=true", - "empty_layer": true - }, - { - "author": "Alyssa P. Hacker \u003calyspdev@example.com\u003e", - "created": "2015-11-04T23:06:32.083868454Z", - "created_by": "/bin/sh -c dd if=/dev/zero of=/file bs=1024 count=1024" - }, - { - "created": "2015-11-04T23:06:32.365666163Z", - "created_by": "/bin/sh -c #(nop) CMD [\"/bin/sh\" \"-c\" \"echo hi\"]", - "empty_layer": true - } - ], - "os": "linux", - "rootfs": { - "diff_ids": [ - "sha256:c6f988f4874bb0add23a778f753c65efe992244e148a1d2ec2a8b664fb66bbd1", - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef", - "sha256:13f53e08df5a220ab6d13c58b2bf83a59cbdc2e04d0a3f041ddf4b0ba4112d49" - ], - "type": "layers" - } -}` - - descriptors := []distribution.Descriptor{ - {Digest: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {Digest: digest.Digest("sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa")}, - {Digest: digest.Digest("sha256:b4ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - } - - pk, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatalf("could not generate key for testing: %v", err) - } - - bs := &mockBlobService{descriptors: make(map[digest.Digest]distribution.Descriptor)} - - ref, err := reference.ParseNamed("testrepo:testtag") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - - builder := NewConfigManifestBuilder(bs, pk, ref, []byte(imgJSON)) - - for _, d := range descriptors { - if err := builder.AppendReference(d); err != nil { - t.Fatalf("AppendReference returned error: %v", err) - } - } - - signed, err := builder.Build(context.Background()) - if err != nil { - t.Fatalf("Build returned error: %v", err) - } - - // Check that the gzipped empty layer tar was put in the blob store - _, err = bs.Stat(context.Background(), digestSHA256GzippedEmptyTar) - if err != nil { - t.Fatal("gzipped empty tar was not put in the blob store") - } - - manifest := signed.(*SignedManifest).Manifest - - if manifest.Versioned.SchemaVersion != 1 { - t.Fatal("SchemaVersion != 1") - } - if manifest.Name != "testrepo" { - t.Fatal("incorrect name in manifest") - } - if manifest.Tag != "testtag" { - t.Fatal("incorrect tag in manifest") - } - if manifest.Architecture != "amd64" { - t.Fatal("incorrect arch in manifest") - } - - expectedFSLayers := []FSLayer{ - {BlobSum: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {BlobSum: digest.Digest("sha256:b4ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {BlobSum: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {BlobSum: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {BlobSum: digest.Digest("sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa")}, - {BlobSum: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - } - - if len(manifest.FSLayers) != len(expectedFSLayers) { - t.Fatalf("wrong number of FSLayers: %d", len(manifest.FSLayers)) - } - if !reflect.DeepEqual(manifest.FSLayers, expectedFSLayers) { - t.Fatal("wrong FSLayers list") - } - - expectedV1Compatibility := []string{ - `{"architecture":"amd64","config":{"AttachStderr":false,"AttachStdin":false,"AttachStdout":false,"Cmd":["/bin/sh","-c","echo hi"],"Domainname":"","Entrypoint":null,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","derived=true","asdf=true"],"Hostname":"23304fc829f9","Image":"sha256:4ab15c48b859c2920dd5224f92aabcd39a52794c5b3cf088fb3bbb438756c246","Labels":{},"OnBuild":[],"OpenStdin":false,"StdinOnce":false,"Tty":false,"User":"","Volumes":null,"WorkingDir":""},"container":"e91032eb0403a61bfe085ff5a5a48e3659e5a6deae9f4d678daa2ae399d5a001","container_config":{"AttachStderr":false,"AttachStdin":false,"AttachStdout":false,"Cmd":["/bin/sh","-c","#(nop) CMD [\"/bin/sh\" \"-c\" \"echo hi\"]"],"Domainname":"","Entrypoint":null,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","derived=true","asdf=true"],"Hostname":"23304fc829f9","Image":"sha256:4ab15c48b859c2920dd5224f92aabcd39a52794c5b3cf088fb3bbb438756c246","Labels":{},"OnBuild":[],"OpenStdin":false,"StdinOnce":false,"Tty":false,"User":"","Volumes":null,"WorkingDir":""},"created":"2015-11-04T23:06:32.365666163Z","docker_version":"1.9.0-dev","id":"69e5c1bfadad697fdb6db59f6326648fa119e0c031a0eda33b8cfadcab54ba7f","os":"linux","parent":"74cf9c92699240efdba1903c2748ef57105d5bedc588084c4e88f3bb1c3ef0b0","throwaway":true}`, - `{"id":"74cf9c92699240efdba1903c2748ef57105d5bedc588084c4e88f3bb1c3ef0b0","parent":"178be37afc7c49e951abd75525dbe0871b62ad49402f037164ee6314f754599d","created":"2015-11-04T23:06:32.083868454Z","container_config":{"Cmd":["/bin/sh -c dd if=/dev/zero of=/file bs=1024 count=1024"]},"author":"Alyssa P. Hacker \u003calyspdev@example.com\u003e"}`, - `{"id":"178be37afc7c49e951abd75525dbe0871b62ad49402f037164ee6314f754599d","parent":"b449305a55a283538c4574856a8b701f2a3d5ec08ef8aec47f385f20339a4866","created":"2015-11-04T23:06:31.192097572Z","container_config":{"Cmd":["/bin/sh -c #(nop) ENV asdf=true"]},"throwaway":true}`, - `{"id":"b449305a55a283538c4574856a8b701f2a3d5ec08ef8aec47f385f20339a4866","parent":"9e3447ca24cb96d86ebd5960cb34d1299b07e0a0e03801d90b9969a2c187dd6e","created":"2015-11-04T23:06:30.934316144Z","container_config":{"Cmd":["/bin/sh -c #(nop) ENV derived=true"]},"throwaway":true}`, - `{"id":"9e3447ca24cb96d86ebd5960cb34d1299b07e0a0e03801d90b9969a2c187dd6e","parent":"3690474eb5b4b26fdfbd89c6e159e8cc376ca76ef48032a30fa6aafd56337880","created":"2015-10-31T22:22:55.613815829Z","container_config":{"Cmd":["/bin/sh -c #(nop) CMD [\"sh\"]"]}}`, - `{"id":"3690474eb5b4b26fdfbd89c6e159e8cc376ca76ef48032a30fa6aafd56337880","created":"2015-10-31T22:22:54.690851953Z","container_config":{"Cmd":["/bin/sh -c #(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /"]}}`, - } - - if len(manifest.History) != len(expectedV1Compatibility) { - t.Fatalf("wrong number of history entries: %d", len(manifest.History)) - } - for i := range expectedV1Compatibility { - if manifest.History[i].V1Compatibility != expectedV1Compatibility[i] { - t.Errorf("wrong V1Compatibility %d. expected:\n%s\ngot:\n%s", i, expectedV1Compatibility[i], manifest.History[i].V1Compatibility) - } - } -} diff --git a/vendor/github.com/docker/distribution/manifest/schema1/manifest.go b/vendor/github.com/docker/distribution/manifest/schema1/manifest.go deleted file mode 100644 index bff47bde0..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema1/manifest.go +++ /dev/null @@ -1,184 +0,0 @@ -package schema1 - -import ( - "encoding/json" - "fmt" - - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/libtrust" -) - -const ( - // MediaTypeManifest specifies the mediaType for the current version. Note - // that for schema version 1, the the media is optionally "application/json". - MediaTypeManifest = "application/vnd.docker.distribution.manifest.v1+json" - // MediaTypeSignedManifest specifies the mediatype for current SignedManifest version - MediaTypeSignedManifest = "application/vnd.docker.distribution.manifest.v1+prettyjws" - // MediaTypeManifestLayer specifies the media type for manifest layers - MediaTypeManifestLayer = "application/vnd.docker.container.image.rootfs.diff+x-gtar" -) - -var ( - // SchemaVersion provides a pre-initialized version structure for this - // packages version of the manifest. - SchemaVersion = manifest.Versioned{ - SchemaVersion: 1, - } -) - -func init() { - schema1Func := func(b []byte) (distribution.Manifest, distribution.Descriptor, error) { - sm := new(SignedManifest) - err := sm.UnmarshalJSON(b) - if err != nil { - return nil, distribution.Descriptor{}, err - } - - desc := distribution.Descriptor{ - Digest: digest.FromBytes(sm.Canonical), - Size: int64(len(sm.Canonical)), - MediaType: MediaTypeSignedManifest, - } - return sm, desc, err - } - err := distribution.RegisterManifestSchema(MediaTypeSignedManifest, schema1Func) - if err != nil { - panic(fmt.Sprintf("Unable to register manifest: %s", err)) - } - err = distribution.RegisterManifestSchema("", schema1Func) - if err != nil { - panic(fmt.Sprintf("Unable to register manifest: %s", err)) - } - err = distribution.RegisterManifestSchema("application/json", schema1Func) - if err != nil { - panic(fmt.Sprintf("Unable to register manifest: %s", err)) - } -} - -// FSLayer is a container struct for BlobSums defined in an image manifest -type FSLayer struct { - // BlobSum is the tarsum of the referenced filesystem image layer - BlobSum digest.Digest `json:"blobSum"` -} - -// History stores unstructured v1 compatibility information -type History struct { - // V1Compatibility is the raw v1 compatibility information - V1Compatibility string `json:"v1Compatibility"` -} - -// Manifest provides the base accessible fields for working with V2 image -// format in the registry. -type Manifest struct { - manifest.Versioned - - // Name is the name of the image's repository - Name string `json:"name"` - - // Tag is the tag of the image specified by this manifest - Tag string `json:"tag"` - - // Architecture is the host architecture on which this image is intended to - // run - Architecture string `json:"architecture"` - - // FSLayers is a list of filesystem layer blobSums contained in this image - FSLayers []FSLayer `json:"fsLayers"` - - // History is a list of unstructured historical data for v1 compatibility - History []History `json:"history"` -} - -// SignedManifest provides an envelope for a signed image manifest, including -// the format sensitive raw bytes. -type SignedManifest struct { - Manifest - - // Canonical is the canonical byte representation of the ImageManifest, - // without any attached signatures. The manifest byte - // representation cannot change or it will have to be re-signed. - Canonical []byte `json:"-"` - - // all contains the byte representation of the Manifest including signatures - // and is returned by Payload() - all []byte -} - -// UnmarshalJSON populates a new SignedManifest struct from JSON data. -func (sm *SignedManifest) UnmarshalJSON(b []byte) error { - sm.all = make([]byte, len(b), len(b)) - // store manifest and signatures in all - copy(sm.all, b) - - jsig, err := libtrust.ParsePrettySignature(b, "signatures") - if err != nil { - return err - } - - // Resolve the payload in the manifest. - bytes, err := jsig.Payload() - if err != nil { - return err - } - - // sm.Canonical stores the canonical manifest JSON - sm.Canonical = make([]byte, len(bytes), len(bytes)) - copy(sm.Canonical, bytes) - - // Unmarshal canonical JSON into Manifest object - var manifest Manifest - if err := json.Unmarshal(sm.Canonical, &manifest); err != nil { - return err - } - - sm.Manifest = manifest - - return nil -} - -// References returnes the descriptors of this manifests references -func (sm SignedManifest) References() []distribution.Descriptor { - dependencies := make([]distribution.Descriptor, len(sm.FSLayers)) - for i, fsLayer := range sm.FSLayers { - dependencies[i] = distribution.Descriptor{ - MediaType: "application/vnd.docker.container.image.rootfs.diff+x-gtar", - Digest: fsLayer.BlobSum, - } - } - - return dependencies - -} - -// MarshalJSON returns the contents of raw. If Raw is nil, marshals the inner -// contents. Applications requiring a marshaled signed manifest should simply -// use Raw directly, since the the content produced by json.Marshal will be -// compacted and will fail signature checks. -func (sm *SignedManifest) MarshalJSON() ([]byte, error) { - if len(sm.all) > 0 { - return sm.all, nil - } - - // If the raw data is not available, just dump the inner content. - return json.Marshal(&sm.Manifest) -} - -// Payload returns the signed content of the signed manifest. -func (sm SignedManifest) Payload() (string, []byte, error) { - return MediaTypeSignedManifest, sm.all, nil -} - -// Signatures returns the signatures as provided by -// (*libtrust.JSONSignature).Signatures. The byte slices are opaque jws -// signatures. -func (sm *SignedManifest) Signatures() ([][]byte, error) { - jsig, err := libtrust.ParsePrettySignature(sm.all, "signatures") - if err != nil { - return nil, err - } - - // Resolve the payload in the manifest. - return jsig.Signatures() -} diff --git a/vendor/github.com/docker/distribution/manifest/schema1/manifest_test.go b/vendor/github.com/docker/distribution/manifest/schema1/manifest_test.go deleted file mode 100644 index 05bb8ec57..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema1/manifest_test.go +++ /dev/null @@ -1,136 +0,0 @@ -package schema1 - -import ( - "bytes" - "encoding/json" - "reflect" - "testing" - - "github.com/docker/libtrust" -) - -type testEnv struct { - name, tag string - invalidSigned *SignedManifest - signed *SignedManifest - pk libtrust.PrivateKey -} - -func TestManifestMarshaling(t *testing.T) { - env := genEnv(t) - - // Check that the all field is the same as json.MarshalIndent with these - // parameters. - p, err := json.MarshalIndent(env.signed, "", " ") - if err != nil { - t.Fatalf("error marshaling manifest: %v", err) - } - - if !bytes.Equal(p, env.signed.all) { - t.Fatalf("manifest bytes not equal: %q != %q", string(env.signed.all), string(p)) - } -} - -func TestManifestUnmarshaling(t *testing.T) { - env := genEnv(t) - - var signed SignedManifest - if err := json.Unmarshal(env.signed.all, &signed); err != nil { - t.Fatalf("error unmarshaling signed manifest: %v", err) - } - - if !reflect.DeepEqual(&signed, env.signed) { - t.Fatalf("manifests are different after unmarshaling: %v != %v", signed, env.signed) - } - -} - -func TestManifestVerification(t *testing.T) { - env := genEnv(t) - - publicKeys, err := Verify(env.signed) - if err != nil { - t.Fatalf("error verifying manifest: %v", err) - } - - if len(publicKeys) == 0 { - t.Fatalf("no public keys found in signature") - } - - var found bool - publicKey := env.pk.PublicKey() - // ensure that one of the extracted public keys matches the private key. - for _, candidate := range publicKeys { - if candidate.KeyID() == publicKey.KeyID() { - found = true - break - } - } - - if !found { - t.Fatalf("expected public key, %v, not found in verified keys: %v", publicKey, publicKeys) - } - - // Check that an invalid manifest fails verification - _, err = Verify(env.invalidSigned) - if err != nil { - t.Fatalf("Invalid manifest should not pass Verify()") - } -} - -func genEnv(t *testing.T) *testEnv { - pk, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatalf("error generating test key: %v", err) - } - - name, tag := "foo/bar", "test" - - invalid := Manifest{ - Versioned: SchemaVersion, - Name: name, - Tag: tag, - FSLayers: []FSLayer{ - { - BlobSum: "asdf", - }, - { - BlobSum: "qwer", - }, - }, - } - - valid := Manifest{ - Versioned: SchemaVersion, - Name: name, - Tag: tag, - FSLayers: []FSLayer{ - { - BlobSum: "asdf", - }, - }, - History: []History{ - { - V1Compatibility: "", - }, - }, - } - - sm, err := Sign(&valid, pk) - if err != nil { - t.Fatalf("error signing manifest: %v", err) - } - - invalidSigned, err := Sign(&invalid, pk) - if err != nil { - t.Fatalf("error signing manifest: %v", err) - } - - return &testEnv{ - name: name, - tag: tag, - invalidSigned: invalidSigned, - signed: sm, - pk: pk, - } -} diff --git a/vendor/github.com/docker/distribution/manifest/schema1/reference_builder.go b/vendor/github.com/docker/distribution/manifest/schema1/reference_builder.go deleted file mode 100644 index fc1045f9e..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema1/reference_builder.go +++ /dev/null @@ -1,98 +0,0 @@ -package schema1 - -import ( - "fmt" - - "errors" - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/reference" - "github.com/docker/libtrust" -) - -// referenceManifestBuilder is a type for constructing manifests from schema1 -// dependencies. -type referenceManifestBuilder struct { - Manifest - pk libtrust.PrivateKey -} - -// NewReferenceManifestBuilder is used to build new manifests for the current -// schema version using schema1 dependencies. -func NewReferenceManifestBuilder(pk libtrust.PrivateKey, ref reference.Named, architecture string) distribution.ManifestBuilder { - tag := "" - if tagged, isTagged := ref.(reference.Tagged); isTagged { - tag = tagged.Tag() - } - - return &referenceManifestBuilder{ - Manifest: Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 1, - }, - Name: ref.Name(), - Tag: tag, - Architecture: architecture, - }, - pk: pk, - } -} - -func (mb *referenceManifestBuilder) Build(ctx context.Context) (distribution.Manifest, error) { - m := mb.Manifest - if len(m.FSLayers) == 0 { - return nil, errors.New("cannot build manifest with zero layers or history") - } - - m.FSLayers = make([]FSLayer, len(mb.Manifest.FSLayers)) - m.History = make([]History, len(mb.Manifest.History)) - copy(m.FSLayers, mb.Manifest.FSLayers) - copy(m.History, mb.Manifest.History) - - return Sign(&m, mb.pk) -} - -// AppendReference adds a reference to the current ManifestBuilder -func (mb *referenceManifestBuilder) AppendReference(d distribution.Describable) error { - r, ok := d.(Reference) - if !ok { - return fmt.Errorf("Unable to add non-reference type to v1 builder") - } - - // Entries need to be prepended - mb.Manifest.FSLayers = append([]FSLayer{{BlobSum: r.Digest}}, mb.Manifest.FSLayers...) - mb.Manifest.History = append([]History{r.History}, mb.Manifest.History...) - return nil - -} - -// References returns the current references added to this builder -func (mb *referenceManifestBuilder) References() []distribution.Descriptor { - refs := make([]distribution.Descriptor, len(mb.Manifest.FSLayers)) - for i := range mb.Manifest.FSLayers { - layerDigest := mb.Manifest.FSLayers[i].BlobSum - history := mb.Manifest.History[i] - ref := Reference{layerDigest, 0, history} - refs[i] = ref.Descriptor() - } - return refs -} - -// Reference describes a manifest v2, schema version 1 dependency. -// An FSLayer associated with a history entry. -type Reference struct { - Digest digest.Digest - Size int64 // if we know it, set it for the descriptor. - History History -} - -// Descriptor describes a reference -func (r Reference) Descriptor() distribution.Descriptor { - return distribution.Descriptor{ - MediaType: MediaTypeManifestLayer, - Digest: r.Digest, - Size: r.Size, - } -} diff --git a/vendor/github.com/docker/distribution/manifest/schema1/reference_builder_test.go b/vendor/github.com/docker/distribution/manifest/schema1/reference_builder_test.go deleted file mode 100644 index 35db28e46..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema1/reference_builder_test.go +++ /dev/null @@ -1,108 +0,0 @@ -package schema1 - -import ( - "testing" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/reference" - "github.com/docker/libtrust" -) - -func makeSignedManifest(t *testing.T, pk libtrust.PrivateKey, refs []Reference) *SignedManifest { - u := &Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 1, - }, - Name: "foo/bar", - Tag: "latest", - Architecture: "amd64", - } - - for i := len(refs) - 1; i >= 0; i-- { - u.FSLayers = append(u.FSLayers, FSLayer{ - BlobSum: refs[i].Digest, - }) - u.History = append(u.History, History{ - V1Compatibility: refs[i].History.V1Compatibility, - }) - } - - signedManifest, err := Sign(u, pk) - if err != nil { - t.Fatalf("unexpected error signing manifest: %v", err) - } - return signedManifest -} - -func TestReferenceBuilder(t *testing.T) { - pk, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatalf("unexpected error generating private key: %v", err) - } - - r1 := Reference{ - Digest: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - Size: 1, - History: History{V1Compatibility: "{\"a\" : 1 }"}, - } - r2 := Reference{ - Digest: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - Size: 2, - History: History{V1Compatibility: "{\"\a\" : 2 }"}, - } - - handCrafted := makeSignedManifest(t, pk, []Reference{r1, r2}) - - ref, err := reference.ParseNamed(handCrafted.Manifest.Name) - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - ref, err = reference.WithTag(ref, handCrafted.Manifest.Tag) - if err != nil { - t.Fatalf("could not add tag: %v", err) - } - - b := NewReferenceManifestBuilder(pk, ref, handCrafted.Manifest.Architecture) - _, err = b.Build(context.Background()) - if err == nil { - t.Fatal("Expected error building zero length manifest") - } - - err = b.AppendReference(r1) - if err != nil { - t.Fatal(err) - } - - err = b.AppendReference(r2) - if err != nil { - t.Fatal(err) - } - - refs := b.References() - if len(refs) != 2 { - t.Fatalf("Unexpected reference count : %d != %d", 2, len(refs)) - } - - // Ensure ordering - if refs[0].Digest != r2.Digest { - t.Fatalf("Unexpected reference : %v", refs[0]) - } - - m, err := b.Build(context.Background()) - if err != nil { - t.Fatal(err) - } - - built, ok := m.(*SignedManifest) - if !ok { - t.Fatalf("unexpected type from Build() : %T", built) - } - - d1 := digest.FromBytes(built.Canonical) - d2 := digest.FromBytes(handCrafted.Canonical) - if d1 != d2 { - t.Errorf("mismatching canonical JSON") - } -} diff --git a/vendor/github.com/docker/distribution/manifest/schema1/sign.go b/vendor/github.com/docker/distribution/manifest/schema1/sign.go deleted file mode 100644 index c862dd812..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema1/sign.go +++ /dev/null @@ -1,68 +0,0 @@ -package schema1 - -import ( - "crypto/x509" - "encoding/json" - - "github.com/docker/libtrust" -) - -// Sign signs the manifest with the provided private key, returning a -// SignedManifest. This typically won't be used within the registry, except -// for testing. -func Sign(m *Manifest, pk libtrust.PrivateKey) (*SignedManifest, error) { - p, err := json.MarshalIndent(m, "", " ") - if err != nil { - return nil, err - } - - js, err := libtrust.NewJSONSignature(p) - if err != nil { - return nil, err - } - - if err := js.Sign(pk); err != nil { - return nil, err - } - - pretty, err := js.PrettySignature("signatures") - if err != nil { - return nil, err - } - - return &SignedManifest{ - Manifest: *m, - all: pretty, - Canonical: p, - }, nil -} - -// SignWithChain signs the manifest with the given private key and x509 chain. -// The public key of the first element in the chain must be the public key -// corresponding with the sign key. -func SignWithChain(m *Manifest, key libtrust.PrivateKey, chain []*x509.Certificate) (*SignedManifest, error) { - p, err := json.MarshalIndent(m, "", " ") - if err != nil { - return nil, err - } - - js, err := libtrust.NewJSONSignature(p) - if err != nil { - return nil, err - } - - if err := js.SignWithChain(key, chain); err != nil { - return nil, err - } - - pretty, err := js.PrettySignature("signatures") - if err != nil { - return nil, err - } - - return &SignedManifest{ - Manifest: *m, - all: pretty, - Canonical: p, - }, nil -} diff --git a/vendor/github.com/docker/distribution/manifest/schema1/verify.go b/vendor/github.com/docker/distribution/manifest/schema1/verify.go deleted file mode 100644 index fa8daa56f..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema1/verify.go +++ /dev/null @@ -1,32 +0,0 @@ -package schema1 - -import ( - "crypto/x509" - - "github.com/Sirupsen/logrus" - "github.com/docker/libtrust" -) - -// Verify verifies the signature of the signed manifest returning the public -// keys used during signing. -func Verify(sm *SignedManifest) ([]libtrust.PublicKey, error) { - js, err := libtrust.ParsePrettySignature(sm.all, "signatures") - if err != nil { - logrus.WithField("err", err).Debugf("(*SignedManifest).Verify") - return nil, err - } - - return js.Verify() -} - -// VerifyChains verifies the signature of the signed manifest against the -// certificate pool returning the list of verified chains. Signatures without -// an x509 chain are not checked. -func VerifyChains(sm *SignedManifest, ca *x509.CertPool) ([][]*x509.Certificate, error) { - js, err := libtrust.ParsePrettySignature(sm.all, "signatures") - if err != nil { - return nil, err - } - - return js.VerifyChains(ca) -} diff --git a/vendor/github.com/docker/distribution/manifest/schema2/builder.go b/vendor/github.com/docker/distribution/manifest/schema2/builder.go deleted file mode 100644 index ec0bf858d..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema2/builder.go +++ /dev/null @@ -1,80 +0,0 @@ -package schema2 - -import ( - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" -) - -// builder is a type for constructing manifests. -type builder struct { - // bs is a BlobService used to publish the configuration blob. - bs distribution.BlobService - - // configJSON references - configJSON []byte - - // layers is a list of layer descriptors that gets built by successive - // calls to AppendReference. - layers []distribution.Descriptor -} - -// NewManifestBuilder is used to build new manifests for the current schema -// version. It takes a BlobService so it can publish the configuration blob -// as part of the Build process. -func NewManifestBuilder(bs distribution.BlobService, configJSON []byte) distribution.ManifestBuilder { - mb := &builder{ - bs: bs, - configJSON: make([]byte, len(configJSON)), - } - copy(mb.configJSON, configJSON) - - return mb -} - -// Build produces a final manifest from the given references. -func (mb *builder) Build(ctx context.Context) (distribution.Manifest, error) { - m := Manifest{ - Versioned: SchemaVersion, - Layers: make([]distribution.Descriptor, len(mb.layers)), - } - copy(m.Layers, mb.layers) - - configDigest := digest.FromBytes(mb.configJSON) - - var err error - m.Config, err = mb.bs.Stat(ctx, configDigest) - switch err { - case nil: - // Override MediaType, since Put always replaces the specified media - // type with application/octet-stream in the descriptor it returns. - m.Config.MediaType = MediaTypeConfig - return FromStruct(m) - case distribution.ErrBlobUnknown: - // nop - default: - return nil, err - } - - // Add config to the blob store - m.Config, err = mb.bs.Put(ctx, MediaTypeConfig, mb.configJSON) - // Override MediaType, since Put always replaces the specified media - // type with application/octet-stream in the descriptor it returns. - m.Config.MediaType = MediaTypeConfig - if err != nil { - return nil, err - } - - return FromStruct(m) -} - -// AppendReference adds a reference to the current ManifestBuilder. -func (mb *builder) AppendReference(d distribution.Describable) error { - mb.layers = append(mb.layers, d.Descriptor()) - return nil -} - -// References returns the current references added to this builder. -func (mb *builder) References() []distribution.Descriptor { - return mb.layers -} diff --git a/vendor/github.com/docker/distribution/manifest/schema2/builder_test.go b/vendor/github.com/docker/distribution/manifest/schema2/builder_test.go deleted file mode 100644 index 851f917cb..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema2/builder_test.go +++ /dev/null @@ -1,210 +0,0 @@ -package schema2 - -import ( - "reflect" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" -) - -type mockBlobService struct { - descriptors map[digest.Digest]distribution.Descriptor -} - -func (bs *mockBlobService) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - if descriptor, ok := bs.descriptors[dgst]; ok { - return descriptor, nil - } - return distribution.Descriptor{}, distribution.ErrBlobUnknown -} - -func (bs *mockBlobService) Get(ctx context.Context, dgst digest.Digest) ([]byte, error) { - panic("not implemented") -} - -func (bs *mockBlobService) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { - panic("not implemented") -} - -func (bs *mockBlobService) Put(ctx context.Context, mediaType string, p []byte) (distribution.Descriptor, error) { - d := distribution.Descriptor{ - Digest: digest.FromBytes(p), - Size: int64(len(p)), - MediaType: "application/octet-stream", - } - bs.descriptors[d.Digest] = d - return d, nil -} - -func (bs *mockBlobService) Create(ctx context.Context, options ...distribution.BlobCreateOption) (distribution.BlobWriter, error) { - panic("not implemented") -} - -func (bs *mockBlobService) Resume(ctx context.Context, id string) (distribution.BlobWriter, error) { - panic("not implemented") -} - -func TestBuilder(t *testing.T) { - imgJSON := []byte(`{ - "architecture": "amd64", - "config": { - "AttachStderr": false, - "AttachStdin": false, - "AttachStdout": false, - "Cmd": [ - "/bin/sh", - "-c", - "echo hi" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "derived=true", - "asdf=true" - ], - "Hostname": "23304fc829f9", - "Image": "sha256:4ab15c48b859c2920dd5224f92aabcd39a52794c5b3cf088fb3bbb438756c246", - "Labels": {}, - "OnBuild": [], - "OpenStdin": false, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": null, - "WorkingDir": "" - }, - "container": "e91032eb0403a61bfe085ff5a5a48e3659e5a6deae9f4d678daa2ae399d5a001", - "container_config": { - "AttachStderr": false, - "AttachStdin": false, - "AttachStdout": false, - "Cmd": [ - "/bin/sh", - "-c", - "#(nop) CMD [\"/bin/sh\" \"-c\" \"echo hi\"]" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "derived=true", - "asdf=true" - ], - "Hostname": "23304fc829f9", - "Image": "sha256:4ab15c48b859c2920dd5224f92aabcd39a52794c5b3cf088fb3bbb438756c246", - "Labels": {}, - "OnBuild": [], - "OpenStdin": false, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": null, - "WorkingDir": "" - }, - "created": "2015-11-04T23:06:32.365666163Z", - "docker_version": "1.9.0-dev", - "history": [ - { - "created": "2015-10-31T22:22:54.690851953Z", - "created_by": "/bin/sh -c #(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /" - }, - { - "created": "2015-10-31T22:22:55.613815829Z", - "created_by": "/bin/sh -c #(nop) CMD [\"sh\"]" - }, - { - "created": "2015-11-04T23:06:30.934316144Z", - "created_by": "/bin/sh -c #(nop) ENV derived=true", - "empty_layer": true - }, - { - "created": "2015-11-04T23:06:31.192097572Z", - "created_by": "/bin/sh -c #(nop) ENV asdf=true", - "empty_layer": true - }, - { - "created": "2015-11-04T23:06:32.083868454Z", - "created_by": "/bin/sh -c dd if=/dev/zero of=/file bs=1024 count=1024" - }, - { - "created": "2015-11-04T23:06:32.365666163Z", - "created_by": "/bin/sh -c #(nop) CMD [\"/bin/sh\" \"-c\" \"echo hi\"]", - "empty_layer": true - } - ], - "os": "linux", - "rootfs": { - "diff_ids": [ - "sha256:c6f988f4874bb0add23a778f753c65efe992244e148a1d2ec2a8b664fb66bbd1", - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef", - "sha256:13f53e08df5a220ab6d13c58b2bf83a59cbdc2e04d0a3f041ddf4b0ba4112d49" - ], - "type": "layers" - } -}`) - configDigest := digest.FromBytes(imgJSON) - - descriptors := []distribution.Descriptor{ - { - Digest: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"), - Size: 5312, - MediaType: MediaTypeLayer, - }, - { - Digest: digest.Digest("sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa"), - Size: 235231, - MediaType: MediaTypeLayer, - }, - { - Digest: digest.Digest("sha256:b4ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"), - Size: 639152, - MediaType: MediaTypeLayer, - }, - } - - bs := &mockBlobService{descriptors: make(map[digest.Digest]distribution.Descriptor)} - builder := NewManifestBuilder(bs, imgJSON) - - for _, d := range descriptors { - if err := builder.AppendReference(d); err != nil { - t.Fatalf("AppendReference returned error: %v", err) - } - } - - built, err := builder.Build(context.Background()) - if err != nil { - t.Fatalf("Build returned error: %v", err) - } - - // Check that the config was put in the blob store - _, err = bs.Stat(context.Background(), configDigest) - if err != nil { - t.Fatal("config was not put in the blob store") - } - - manifest := built.(*DeserializedManifest).Manifest - - if manifest.Versioned.SchemaVersion != 2 { - t.Fatal("SchemaVersion != 2") - } - - target := manifest.Target() - if target.Digest != configDigest { - t.Fatalf("unexpected digest in target: %s", target.Digest.String()) - } - if target.MediaType != MediaTypeConfig { - t.Fatalf("unexpected media type in target: %s", target.MediaType) - } - if target.Size != 3153 { - t.Fatalf("unexpected size in target: %d", target.Size) - } - - references := manifest.References() - expected := append([]distribution.Descriptor{manifest.Target()}, descriptors...) - if !reflect.DeepEqual(references, expected) { - t.Fatal("References() does not match the descriptors added") - } -} diff --git a/vendor/github.com/docker/distribution/manifest/schema2/manifest.go b/vendor/github.com/docker/distribution/manifest/schema2/manifest.go deleted file mode 100644 index 741998d04..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema2/manifest.go +++ /dev/null @@ -1,134 +0,0 @@ -package schema2 - -import ( - "encoding/json" - "errors" - "fmt" - - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" -) - -const ( - // MediaTypeManifest specifies the mediaType for the current version. - MediaTypeManifest = "application/vnd.docker.distribution.manifest.v2+json" - - // MediaTypeConfig specifies the mediaType for the image configuration. - MediaTypeConfig = "application/vnd.docker.container.image.v1+json" - - // MediaTypePluginConfig specifies the mediaType for plugin configuration. - MediaTypePluginConfig = "application/vnd.docker.plugin.v1+json" - - // MediaTypeLayer is the mediaType used for layers referenced by the - // manifest. - MediaTypeLayer = "application/vnd.docker.image.rootfs.diff.tar.gzip" - - // MediaTypeForeignLayer is the mediaType used for layers that must be - // downloaded from foreign URLs. - MediaTypeForeignLayer = "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip" -) - -var ( - // SchemaVersion provides a pre-initialized version structure for this - // packages version of the manifest. - SchemaVersion = manifest.Versioned{ - SchemaVersion: 2, - MediaType: MediaTypeManifest, - } -) - -func init() { - schema2Func := func(b []byte) (distribution.Manifest, distribution.Descriptor, error) { - m := new(DeserializedManifest) - err := m.UnmarshalJSON(b) - if err != nil { - return nil, distribution.Descriptor{}, err - } - - dgst := digest.FromBytes(b) - return m, distribution.Descriptor{Digest: dgst, Size: int64(len(b)), MediaType: MediaTypeManifest}, err - } - err := distribution.RegisterManifestSchema(MediaTypeManifest, schema2Func) - if err != nil { - panic(fmt.Sprintf("Unable to register manifest: %s", err)) - } -} - -// Manifest defines a schema2 manifest. -type Manifest struct { - manifest.Versioned - - // Config references the image configuration as a blob. - Config distribution.Descriptor `json:"config"` - - // Layers lists descriptors for the layers referenced by the - // configuration. - Layers []distribution.Descriptor `json:"layers"` -} - -// References returnes the descriptors of this manifests references. -func (m Manifest) References() []distribution.Descriptor { - references := make([]distribution.Descriptor, 0, 1+len(m.Layers)) - references = append(references, m.Config) - references = append(references, m.Layers...) - return references -} - -// Target returns the target of this signed manifest. -func (m Manifest) Target() distribution.Descriptor { - return m.Config -} - -// DeserializedManifest wraps Manifest with a copy of the original JSON. -// It satisfies the distribution.Manifest interface. -type DeserializedManifest struct { - Manifest - - // canonical is the canonical byte representation of the Manifest. - canonical []byte -} - -// FromStruct takes a Manifest structure, marshals it to JSON, and returns a -// DeserializedManifest which contains the manifest and its JSON representation. -func FromStruct(m Manifest) (*DeserializedManifest, error) { - var deserialized DeserializedManifest - deserialized.Manifest = m - - var err error - deserialized.canonical, err = json.MarshalIndent(&m, "", " ") - return &deserialized, err -} - -// UnmarshalJSON populates a new Manifest struct from JSON data. -func (m *DeserializedManifest) UnmarshalJSON(b []byte) error { - m.canonical = make([]byte, len(b), len(b)) - // store manifest in canonical - copy(m.canonical, b) - - // Unmarshal canonical JSON into Manifest object - var manifest Manifest - if err := json.Unmarshal(m.canonical, &manifest); err != nil { - return err - } - - m.Manifest = manifest - - return nil -} - -// MarshalJSON returns the contents of canonical. If canonical is empty, -// marshals the inner contents. -func (m *DeserializedManifest) MarshalJSON() ([]byte, error) { - if len(m.canonical) > 0 { - return m.canonical, nil - } - - return nil, errors.New("JSON representation not initialized in DeserializedManifest") -} - -// Payload returns the raw content of the manifest. The contents can be used to -// calculate the content identifier. -func (m DeserializedManifest) Payload() (string, []byte, error) { - return m.MediaType, m.canonical, nil -} diff --git a/vendor/github.com/docker/distribution/manifest/schema2/manifest_test.go b/vendor/github.com/docker/distribution/manifest/schema2/manifest_test.go deleted file mode 100644 index f0003d18b..000000000 --- a/vendor/github.com/docker/distribution/manifest/schema2/manifest_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package schema2 - -import ( - "bytes" - "encoding/json" - "reflect" - "testing" - - "github.com/docker/distribution" -) - -var expectedManifestSerialization = []byte(`{ - "schemaVersion": 2, - "mediaType": "application/vnd.docker.distribution.manifest.v2+json", - "config": { - "mediaType": "application/vnd.docker.container.image.v1+json", - "size": 985, - "digest": "sha256:1a9ec845ee94c202b2d5da74a24f0ed2058318bfa9879fa541efaecba272e86b" - }, - "layers": [ - { - "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", - "size": 153263, - "digest": "sha256:62d8908bee94c202b2d35224a221aaa2058318bfa9879fa541efaecba272331b" - } - ] -}`) - -func TestManifest(t *testing.T) { - manifest := Manifest{ - Versioned: SchemaVersion, - Config: distribution.Descriptor{ - Digest: "sha256:1a9ec845ee94c202b2d5da74a24f0ed2058318bfa9879fa541efaecba272e86b", - Size: 985, - MediaType: MediaTypeConfig, - }, - Layers: []distribution.Descriptor{ - { - Digest: "sha256:62d8908bee94c202b2d35224a221aaa2058318bfa9879fa541efaecba272331b", - Size: 153263, - MediaType: MediaTypeLayer, - }, - }, - } - - deserialized, err := FromStruct(manifest) - if err != nil { - t.Fatalf("error creating DeserializedManifest: %v", err) - } - - mediaType, canonical, err := deserialized.Payload() - - if mediaType != MediaTypeManifest { - t.Fatalf("unexpected media type: %s", mediaType) - } - - // Check that the canonical field is the same as json.MarshalIndent - // with these parameters. - p, err := json.MarshalIndent(&manifest, "", " ") - if err != nil { - t.Fatalf("error marshaling manifest: %v", err) - } - if !bytes.Equal(p, canonical) { - t.Fatalf("manifest bytes not equal: %q != %q", string(canonical), string(p)) - } - - // Check that canonical field matches expected value. - if !bytes.Equal(expectedManifestSerialization, canonical) { - t.Fatalf("manifest bytes not equal: %q != %q", string(canonical), string(expectedManifestSerialization)) - } - - var unmarshalled DeserializedManifest - if err := json.Unmarshal(deserialized.canonical, &unmarshalled); err != nil { - t.Fatalf("error unmarshaling manifest: %v", err) - } - - if !reflect.DeepEqual(&unmarshalled, deserialized) { - t.Fatalf("manifests are different after unmarshaling: %v != %v", unmarshalled, *deserialized) - } - - target := deserialized.Target() - if target.Digest != "sha256:1a9ec845ee94c202b2d5da74a24f0ed2058318bfa9879fa541efaecba272e86b" { - t.Fatalf("unexpected digest in target: %s", target.Digest.String()) - } - if target.MediaType != MediaTypeConfig { - t.Fatalf("unexpected media type in target: %s", target.MediaType) - } - if target.Size != 985 { - t.Fatalf("unexpected size in target: %d", target.Size) - } - - references := deserialized.References() - if len(references) != 2 { - t.Fatalf("unexpected number of references: %d", len(references)) - } - - if !reflect.DeepEqual(references[0], target) { - t.Fatalf("first reference should be target: %v != %v", references[0], target) - } - - // Test the second reference - if references[1].Digest != "sha256:62d8908bee94c202b2d35224a221aaa2058318bfa9879fa541efaecba272331b" { - t.Fatalf("unexpected digest in reference: %s", references[0].Digest.String()) - } - if references[1].MediaType != MediaTypeLayer { - t.Fatalf("unexpected media type in reference: %s", references[0].MediaType) - } - if references[1].Size != 153263 { - t.Fatalf("unexpected size in reference: %d", references[0].Size) - } -} diff --git a/vendor/github.com/docker/distribution/manifest/versioned.go b/vendor/github.com/docker/distribution/manifest/versioned.go deleted file mode 100644 index caa6b14e8..000000000 --- a/vendor/github.com/docker/distribution/manifest/versioned.go +++ /dev/null @@ -1,12 +0,0 @@ -package manifest - -// Versioned provides a struct with the manifest schemaVersion and mediaType. -// Incoming content with unknown schema version can be decoded against this -// struct to check the version. -type Versioned struct { - // SchemaVersion is the image manifest schema that this image follows - SchemaVersion int `json:"schemaVersion"` - - // MediaType is the media type of this schema. - MediaType string `json:"mediaType,omitempty"` -} diff --git a/vendor/github.com/docker/distribution/notifications/bridge.go b/vendor/github.com/docker/distribution/notifications/bridge.go deleted file mode 100644 index 502288a40..000000000 --- a/vendor/github.com/docker/distribution/notifications/bridge.go +++ /dev/null @@ -1,214 +0,0 @@ -package notifications - -import ( - "net/http" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/uuid" -) - -type bridge struct { - ub URLBuilder - actor ActorRecord - source SourceRecord - request RequestRecord - sink Sink -} - -var _ Listener = &bridge{} - -// URLBuilder defines a subset of url builder to be used by the event listener. -type URLBuilder interface { - BuildManifestURL(name reference.Named) (string, error) - BuildBlobURL(ref reference.Canonical) (string, error) -} - -// NewBridge returns a notification listener that writes records to sink, -// using the actor and source. Any urls populated in the events created by -// this bridge will be created using the URLBuilder. -// TODO(stevvooe): Update this to simply take a context.Context object. -func NewBridge(ub URLBuilder, source SourceRecord, actor ActorRecord, request RequestRecord, sink Sink) Listener { - return &bridge{ - ub: ub, - actor: actor, - source: source, - request: request, - sink: sink, - } -} - -// NewRequestRecord builds a RequestRecord for use in NewBridge from an -// http.Request, associating it with a request id. -func NewRequestRecord(id string, r *http.Request) RequestRecord { - return RequestRecord{ - ID: id, - Addr: context.RemoteAddr(r), - Host: r.Host, - Method: r.Method, - UserAgent: r.UserAgent(), - } -} - -func (b *bridge) ManifestPushed(repo reference.Named, sm distribution.Manifest, options ...distribution.ManifestServiceOption) error { - manifestEvent, err := b.createManifestEvent(EventActionPush, repo, sm) - if err != nil { - return err - } - - for _, option := range options { - if opt, ok := option.(distribution.WithTagOption); ok { - manifestEvent.Target.Tag = opt.Tag - break - } - } - return b.sink.Write(*manifestEvent) -} - -func (b *bridge) ManifestPulled(repo reference.Named, sm distribution.Manifest, options ...distribution.ManifestServiceOption) error { - manifestEvent, err := b.createManifestEvent(EventActionPull, repo, sm) - if err != nil { - return err - } - - for _, option := range options { - if opt, ok := option.(distribution.WithTagOption); ok { - manifestEvent.Target.Tag = opt.Tag - break - } - } - return b.sink.Write(*manifestEvent) -} - -func (b *bridge) ManifestDeleted(repo reference.Named, dgst digest.Digest) error { - return b.createManifestDeleteEventAndWrite(EventActionDelete, repo, dgst) -} - -func (b *bridge) BlobPushed(repo reference.Named, desc distribution.Descriptor) error { - return b.createBlobEventAndWrite(EventActionPush, repo, desc) -} - -func (b *bridge) BlobPulled(repo reference.Named, desc distribution.Descriptor) error { - return b.createBlobEventAndWrite(EventActionPull, repo, desc) -} - -func (b *bridge) BlobMounted(repo reference.Named, desc distribution.Descriptor, fromRepo reference.Named) error { - event, err := b.createBlobEvent(EventActionMount, repo, desc) - if err != nil { - return err - } - event.Target.FromRepository = fromRepo.Name() - return b.sink.Write(*event) -} - -func (b *bridge) BlobDeleted(repo reference.Named, dgst digest.Digest) error { - return b.createBlobDeleteEventAndWrite(EventActionDelete, repo, dgst) -} - -func (b *bridge) createManifestEventAndWrite(action string, repo reference.Named, sm distribution.Manifest) error { - manifestEvent, err := b.createManifestEvent(action, repo, sm) - if err != nil { - return err - } - - return b.sink.Write(*manifestEvent) -} - -func (b *bridge) createManifestDeleteEventAndWrite(action string, repo reference.Named, dgst digest.Digest) error { - event := b.createEvent(action) - event.Target.Repository = repo.Name() - event.Target.Digest = dgst - - return b.sink.Write(*event) -} - -func (b *bridge) createManifestEvent(action string, repo reference.Named, sm distribution.Manifest) (*Event, error) { - event := b.createEvent(action) - event.Target.Repository = repo.Name() - - mt, p, err := sm.Payload() - if err != nil { - return nil, err - } - - // Ensure we have the canonical manifest descriptor here - _, desc, err := distribution.UnmarshalManifest(mt, p) - if err != nil { - return nil, err - } - - event.Target.MediaType = mt - event.Target.Length = desc.Size - event.Target.Size = desc.Size - event.Target.Digest = desc.Digest - - ref, err := reference.WithDigest(repo, event.Target.Digest) - if err != nil { - return nil, err - } - - event.Target.URL, err = b.ub.BuildManifestURL(ref) - if err != nil { - return nil, err - } - - return event, nil -} - -func (b *bridge) createBlobDeleteEventAndWrite(action string, repo reference.Named, dgst digest.Digest) error { - event := b.createEvent(action) - event.Target.Digest = dgst - event.Target.Repository = repo.Name() - - return b.sink.Write(*event) -} - -func (b *bridge) createBlobEventAndWrite(action string, repo reference.Named, desc distribution.Descriptor) error { - event, err := b.createBlobEvent(action, repo, desc) - if err != nil { - return err - } - - return b.sink.Write(*event) -} - -func (b *bridge) createBlobEvent(action string, repo reference.Named, desc distribution.Descriptor) (*Event, error) { - event := b.createEvent(action) - event.Target.Descriptor = desc - event.Target.Length = desc.Size - event.Target.Repository = repo.Name() - - ref, err := reference.WithDigest(repo, desc.Digest) - if err != nil { - return nil, err - } - - event.Target.URL, err = b.ub.BuildBlobURL(ref) - if err != nil { - return nil, err - } - - return event, nil -} - -// createEvent creates an event with actor and source populated. -func (b *bridge) createEvent(action string) *Event { - event := createEvent(action) - event.Source = b.source - event.Actor = b.actor - event.Request = b.request - - return event -} - -// createEvent returns a new event, timestamped, with the specified action. -func createEvent(action string) *Event { - return &Event{ - ID: uuid.Generate().String(), - Timestamp: time.Now(), - Action: action, - } -} diff --git a/vendor/github.com/docker/distribution/notifications/bridge_test.go b/vendor/github.com/docker/distribution/notifications/bridge_test.go deleted file mode 100644 index 0f85791c8..000000000 --- a/vendor/github.com/docker/distribution/notifications/bridge_test.go +++ /dev/null @@ -1,222 +0,0 @@ -package notifications - -import ( - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/api/v2" - "github.com/docker/distribution/uuid" - "github.com/docker/libtrust" -) - -var ( - // common environment for expected manifest events. - - repo = "test/repo" - source = SourceRecord{ - Addr: "remote.test", - InstanceID: uuid.Generate().String(), - } - ub = mustUB(v2.NewURLBuilderFromString("http://test.example.com/", false)) - - actor = ActorRecord{ - Name: "test", - } - request = RequestRecord{} - m = schema1.Manifest{ - Name: repo, - Tag: "latest", - } - - sm *schema1.SignedManifest - payload []byte - dgst digest.Digest -) - -func TestEventBridgeManifestPulled(t *testing.T) { - l := createTestEnv(t, testSinkFn(func(events ...Event) error { - checkCommonManifest(t, EventActionPull, events...) - - return nil - })) - - repoRef, _ := reference.ParseNamed(repo) - if err := l.ManifestPulled(repoRef, sm); err != nil { - t.Fatalf("unexpected error notifying manifest pull: %v", err) - } -} - -func TestEventBridgeManifestPushed(t *testing.T) { - l := createTestEnv(t, testSinkFn(func(events ...Event) error { - checkCommonManifest(t, EventActionPush, events...) - - return nil - })) - - repoRef, _ := reference.ParseNamed(repo) - if err := l.ManifestPushed(repoRef, sm); err != nil { - t.Fatalf("unexpected error notifying manifest pull: %v", err) - } -} - -func TestEventBridgeManifestPushedWithTag(t *testing.T) { - l := createTestEnv(t, testSinkFn(func(events ...Event) error { - checkCommonManifest(t, EventActionPush, events...) - if events[0].Target.Tag != "latest" { - t.Fatalf("missing or unexpected tag: %#v", events[0].Target) - } - - return nil - })) - - repoRef, _ := reference.ParseNamed(repo) - if err := l.ManifestPushed(repoRef, sm, distribution.WithTag(m.Tag)); err != nil { - t.Fatalf("unexpected error notifying manifest pull: %v", err) - } -} - -func TestEventBridgeManifestPulledWithTag(t *testing.T) { - l := createTestEnv(t, testSinkFn(func(events ...Event) error { - checkCommonManifest(t, EventActionPull, events...) - if events[0].Target.Tag != "latest" { - t.Fatalf("missing or unexpected tag: %#v", events[0].Target) - } - - return nil - })) - - repoRef, _ := reference.ParseNamed(repo) - if err := l.ManifestPulled(repoRef, sm, distribution.WithTag(m.Tag)); err != nil { - t.Fatalf("unexpected error notifying manifest pull: %v", err) - } -} - -func TestEventBridgeManifestDeleted(t *testing.T) { - l := createTestEnv(t, testSinkFn(func(events ...Event) error { - checkDeleted(t, EventActionDelete, events...) - return nil - })) - - repoRef, _ := reference.ParseNamed(repo) - if err := l.ManifestDeleted(repoRef, dgst); err != nil { - t.Fatalf("unexpected error notifying manifest pull: %v", err) - } -} - -func createTestEnv(t *testing.T, fn testSinkFn) Listener { - pk, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatalf("error generating private key: %v", err) - } - - sm, err = schema1.Sign(&m, pk) - if err != nil { - t.Fatalf("error signing manifest: %v", err) - } - - payload = sm.Canonical - dgst = digest.FromBytes(payload) - - return NewBridge(ub, source, actor, request, fn) -} - -func checkDeleted(t *testing.T, action string, events ...Event) { - if len(events) != 1 { - t.Fatalf("unexpected number of events: %v != 1", len(events)) - } - - event := events[0] - - if event.Source != source { - t.Fatalf("source not equal: %#v != %#v", event.Source, source) - } - - if event.Request != request { - t.Fatalf("request not equal: %#v != %#v", event.Request, request) - } - - if event.Actor != actor { - t.Fatalf("request not equal: %#v != %#v", event.Actor, actor) - } - - if event.Target.Digest != dgst { - t.Fatalf("unexpected digest on event target: %q != %q", event.Target.Digest, dgst) - } - - if event.Target.Repository != repo { - t.Fatalf("unexpected repository: %q != %q", event.Target.Repository, repo) - } - -} - -func checkCommonManifest(t *testing.T, action string, events ...Event) { - checkCommon(t, events...) - - event := events[0] - if event.Action != action { - t.Fatalf("unexpected event action: %q != %q", event.Action, action) - } - - repoRef, _ := reference.ParseNamed(repo) - ref, _ := reference.WithDigest(repoRef, dgst) - u, err := ub.BuildManifestURL(ref) - if err != nil { - t.Fatalf("error building expected url: %v", err) - } - - if event.Target.URL != u { - t.Fatalf("incorrect url passed: \n%q != \n%q", event.Target.URL, u) - } -} - -func checkCommon(t *testing.T, events ...Event) { - if len(events) != 1 { - t.Fatalf("unexpected number of events: %v != 1", len(events)) - } - - event := events[0] - - if event.Source != source { - t.Fatalf("source not equal: %#v != %#v", event.Source, source) - } - - if event.Request != request { - t.Fatalf("request not equal: %#v != %#v", event.Request, request) - } - - if event.Actor != actor { - t.Fatalf("request not equal: %#v != %#v", event.Actor, actor) - } - - if event.Target.Digest != dgst { - t.Fatalf("unexpected digest on event target: %q != %q", event.Target.Digest, dgst) - } - - if event.Target.Length != int64(len(payload)) { - t.Fatalf("unexpected target length: %v != %v", event.Target.Length, len(payload)) - } - - if event.Target.Repository != repo { - t.Fatalf("unexpected repository: %q != %q", event.Target.Repository, repo) - } - -} - -type testSinkFn func(events ...Event) error - -func (tsf testSinkFn) Write(events ...Event) error { - return tsf(events...) -} - -func (tsf testSinkFn) Close() error { return nil } - -func mustUB(ub *v2.URLBuilder, err error) *v2.URLBuilder { - if err != nil { - panic(err) - } - - return ub -} diff --git a/vendor/github.com/docker/distribution/notifications/endpoint.go b/vendor/github.com/docker/distribution/notifications/endpoint.go deleted file mode 100644 index 29a9e27b5..000000000 --- a/vendor/github.com/docker/distribution/notifications/endpoint.go +++ /dev/null @@ -1,93 +0,0 @@ -package notifications - -import ( - "net/http" - "time" -) - -// EndpointConfig covers the optional configuration parameters for an active -// endpoint. -type EndpointConfig struct { - Headers http.Header - Timeout time.Duration - Threshold int - Backoff time.Duration - IgnoredMediaTypes []string - Transport *http.Transport -} - -// defaults set any zero-valued fields to a reasonable default. -func (ec *EndpointConfig) defaults() { - if ec.Timeout <= 0 { - ec.Timeout = time.Second - } - - if ec.Threshold <= 0 { - ec.Threshold = 10 - } - - if ec.Backoff <= 0 { - ec.Backoff = time.Second - } - - if ec.Transport == nil { - ec.Transport = http.DefaultTransport.(*http.Transport) - } -} - -// Endpoint is a reliable, queued, thread-safe sink that notify external http -// services when events are written. Writes are non-blocking and always -// succeed for callers but events may be queued internally. -type Endpoint struct { - Sink - url string - name string - - EndpointConfig - - metrics *safeMetrics -} - -// NewEndpoint returns a running endpoint, ready to receive events. -func NewEndpoint(name, url string, config EndpointConfig) *Endpoint { - var endpoint Endpoint - endpoint.name = name - endpoint.url = url - endpoint.EndpointConfig = config - endpoint.defaults() - endpoint.metrics = newSafeMetrics() - - // Configures the inmemory queue, retry, http pipeline. - endpoint.Sink = newHTTPSink( - endpoint.url, endpoint.Timeout, endpoint.Headers, - endpoint.Transport, endpoint.metrics.httpStatusListener()) - endpoint.Sink = newRetryingSink(endpoint.Sink, endpoint.Threshold, endpoint.Backoff) - endpoint.Sink = newEventQueue(endpoint.Sink, endpoint.metrics.eventQueueListener()) - endpoint.Sink = newIgnoredMediaTypesSink(endpoint.Sink, config.IgnoredMediaTypes) - - register(&endpoint) - return &endpoint -} - -// Name returns the name of the endpoint, generally used for debugging. -func (e *Endpoint) Name() string { - return e.name -} - -// URL returns the url of the endpoint. -func (e *Endpoint) URL() string { - return e.url -} - -// ReadMetrics populates em with metrics from the endpoint. -func (e *Endpoint) ReadMetrics(em *EndpointMetrics) { - e.metrics.Lock() - defer e.metrics.Unlock() - - *em = e.metrics.EndpointMetrics - // Map still need to copied in a threadsafe manner. - em.Statuses = make(map[string]int) - for k, v := range e.metrics.Statuses { - em.Statuses[k] = v - } -} diff --git a/vendor/github.com/docker/distribution/notifications/event.go b/vendor/github.com/docker/distribution/notifications/event.go deleted file mode 100644 index b59a72bed..000000000 --- a/vendor/github.com/docker/distribution/notifications/event.go +++ /dev/null @@ -1,160 +0,0 @@ -package notifications - -import ( - "fmt" - "time" - - "github.com/docker/distribution" -) - -// EventAction constants used in action field of Event. -const ( - EventActionPull = "pull" - EventActionPush = "push" - EventActionMount = "mount" - EventActionDelete = "delete" -) - -const ( - // EventsMediaType is the mediatype for the json event envelope. If the - // Event, ActorRecord, SourceRecord or Envelope structs change, the version - // number should be incremented. - EventsMediaType = "application/vnd.docker.distribution.events.v1+json" - // LayerMediaType is the media type for image rootfs diffs (aka "layers") - // used by Docker. We don't expect this to change for quite a while. - layerMediaType = "application/vnd.docker.container.image.rootfs.diff+x-gtar" -) - -// Envelope defines the fields of a json event envelope message that can hold -// one or more events. -type Envelope struct { - // Events make up the contents of the envelope. Events present in a single - // envelope are not necessarily related. - Events []Event `json:"events,omitempty"` -} - -// TODO(stevvooe): The event type should be separate from the json format. It -// should be defined as an interface. Leaving as is for now since we don't -// need that at this time. If we make this change, the struct below would be -// called "EventRecord". - -// Event provides the fields required to describe a registry event. -type Event struct { - // ID provides a unique identifier for the event. - ID string `json:"id,omitempty"` - - // Timestamp is the time at which the event occurred. - Timestamp time.Time `json:"timestamp,omitempty"` - - // Action indicates what action encompasses the provided event. - Action string `json:"action,omitempty"` - - // Target uniquely describes the target of the event. - Target struct { - // TODO(stevvooe): Use http.DetectContentType for layers, maybe. - - distribution.Descriptor - - // Length in bytes of content. Same as Size field in Descriptor. - // Provided for backwards compatibility. - Length int64 `json:"length,omitempty"` - - // Repository identifies the named repository. - Repository string `json:"repository,omitempty"` - - // FromRepository identifies the named repository which a blob was mounted - // from if appropriate. - FromRepository string `json:"fromRepository,omitempty"` - - // URL provides a direct link to the content. - URL string `json:"url,omitempty"` - - // Tag provides the tag - Tag string `json:"tag,omitempty"` - } `json:"target,omitempty"` - - // Request covers the request that generated the event. - Request RequestRecord `json:"request,omitempty"` - - // Actor specifies the agent that initiated the event. For most - // situations, this could be from the authorizaton context of the request. - Actor ActorRecord `json:"actor,omitempty"` - - // Source identifies the registry node that generated the event. Put - // differently, while the actor "initiates" the event, the source - // "generates" it. - Source SourceRecord `json:"source,omitempty"` -} - -// ActorRecord specifies the agent that initiated the event. For most -// situations, this could be from the authorizaton context of the request. -// Data in this record can refer to both the initiating client and the -// generating request. -type ActorRecord struct { - // Name corresponds to the subject or username associated with the - // request context that generated the event. - Name string `json:"name,omitempty"` - - // TODO(stevvooe): Look into setting a session cookie to get this - // without docker daemon. - // SessionID - - // TODO(stevvooe): Push the "Docker-Command" header to replace cookie and - // get the actual command. - // Command -} - -// RequestRecord covers the request that generated the event. -type RequestRecord struct { - // ID uniquely identifies the request that initiated the event. - ID string `json:"id"` - - // Addr contains the ip or hostname and possibly port of the client - // connection that initiated the event. This is the RemoteAddr from - // the standard http request. - Addr string `json:"addr,omitempty"` - - // Host is the externally accessible host name of the registry instance, - // as specified by the http host header on incoming requests. - Host string `json:"host,omitempty"` - - // Method has the request method that generated the event. - Method string `json:"method"` - - // UserAgent contains the user agent header of the request. - UserAgent string `json:"useragent"` -} - -// SourceRecord identifies the registry node that generated the event. Put -// differently, while the actor "initiates" the event, the source "generates" -// it. -type SourceRecord struct { - // Addr contains the ip or hostname and the port of the registry node - // that generated the event. Generally, this will be resolved by - // os.Hostname() along with the running port. - Addr string `json:"addr,omitempty"` - - // InstanceID identifies a running instance of an application. Changes - // after each restart. - InstanceID string `json:"instanceID,omitempty"` -} - -var ( - // ErrSinkClosed is returned if a write is issued to a sink that has been - // closed. If encountered, the error should be considered terminal and - // retries will not be successful. - ErrSinkClosed = fmt.Errorf("sink: closed") -) - -// Sink accepts and sends events. -type Sink interface { - // Write writes one or more events to the sink. If no error is returned, - // the caller will assume that all events have been committed and will not - // try to send them again. If an error is received, the caller may retry - // sending the event. The caller should cede the slice of memory to the - // sink and not modify it after calling this method. - Write(events ...Event) error - - // Close the sink, possibly waiting for pending events to flush. - Close() error -} diff --git a/vendor/github.com/docker/distribution/notifications/event_test.go b/vendor/github.com/docker/distribution/notifications/event_test.go deleted file mode 100644 index 0981a7ad4..000000000 --- a/vendor/github.com/docker/distribution/notifications/event_test.go +++ /dev/null @@ -1,157 +0,0 @@ -package notifications - -import ( - "encoding/json" - "strings" - "testing" - "time" - - "github.com/docker/distribution/manifest/schema1" -) - -// TestEventJSONFormat provides silly test to detect if the event format or -// envelope has changed. If this code fails, the revision of the protocol may -// need to be incremented. -func TestEventEnvelopeJSONFormat(t *testing.T) { - var expected = strings.TrimSpace(` -{ - "events": [ - { - "id": "asdf-asdf-asdf-asdf-0", - "timestamp": "2006-01-02T15:04:05Z", - "action": "push", - "target": { - "mediaType": "application/vnd.docker.distribution.manifest.v1+prettyjws", - "size": 1, - "digest": "sha256:0123456789abcdef0", - "length": 1, - "repository": "library/test", - "url": "http://example.com/v2/library/test/manifests/latest" - }, - "request": { - "id": "asdfasdf", - "addr": "client.local", - "host": "registrycluster.local", - "method": "PUT", - "useragent": "test/0.1" - }, - "actor": { - "name": "test-actor" - }, - "source": { - "addr": "hostname.local:port" - } - }, - { - "id": "asdf-asdf-asdf-asdf-1", - "timestamp": "2006-01-02T15:04:05Z", - "action": "push", - "target": { - "mediaType": "application/vnd.docker.container.image.rootfs.diff+x-gtar", - "size": 2, - "digest": "sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5", - "length": 2, - "repository": "library/test", - "url": "http://example.com/v2/library/test/manifests/latest" - }, - "request": { - "id": "asdfasdf", - "addr": "client.local", - "host": "registrycluster.local", - "method": "PUT", - "useragent": "test/0.1" - }, - "actor": { - "name": "test-actor" - }, - "source": { - "addr": "hostname.local:port" - } - }, - { - "id": "asdf-asdf-asdf-asdf-2", - "timestamp": "2006-01-02T15:04:05Z", - "action": "push", - "target": { - "mediaType": "application/vnd.docker.container.image.rootfs.diff+x-gtar", - "size": 3, - "digest": "sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d6", - "length": 3, - "repository": "library/test", - "url": "http://example.com/v2/library/test/manifests/latest" - }, - "request": { - "id": "asdfasdf", - "addr": "client.local", - "host": "registrycluster.local", - "method": "PUT", - "useragent": "test/0.1" - }, - "actor": { - "name": "test-actor" - }, - "source": { - "addr": "hostname.local:port" - } - } - ] -} - `) - - tm, err := time.Parse(time.RFC3339, time.RFC3339[:len(time.RFC3339)-5]) - if err != nil { - t.Fatalf("error creating time: %v", err) - } - - var prototype Event - prototype.Action = EventActionPush - prototype.Timestamp = tm - prototype.Actor.Name = "test-actor" - prototype.Request.ID = "asdfasdf" - prototype.Request.Addr = "client.local" - prototype.Request.Host = "registrycluster.local" - prototype.Request.Method = "PUT" - prototype.Request.UserAgent = "test/0.1" - prototype.Source.Addr = "hostname.local:port" - - var manifestPush Event - manifestPush = prototype - manifestPush.ID = "asdf-asdf-asdf-asdf-0" - manifestPush.Target.Digest = "sha256:0123456789abcdef0" - manifestPush.Target.Length = 1 - manifestPush.Target.Size = 1 - manifestPush.Target.MediaType = schema1.MediaTypeSignedManifest - manifestPush.Target.Repository = "library/test" - manifestPush.Target.URL = "http://example.com/v2/library/test/manifests/latest" - - var layerPush0 Event - layerPush0 = prototype - layerPush0.ID = "asdf-asdf-asdf-asdf-1" - layerPush0.Target.Digest = "sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5" - layerPush0.Target.Length = 2 - layerPush0.Target.Size = 2 - layerPush0.Target.MediaType = layerMediaType - layerPush0.Target.Repository = "library/test" - layerPush0.Target.URL = "http://example.com/v2/library/test/manifests/latest" - - var layerPush1 Event - layerPush1 = prototype - layerPush1.ID = "asdf-asdf-asdf-asdf-2" - layerPush1.Target.Digest = "sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d6" - layerPush1.Target.Length = 3 - layerPush1.Target.Size = 3 - layerPush1.Target.MediaType = layerMediaType - layerPush1.Target.Repository = "library/test" - layerPush1.Target.URL = "http://example.com/v2/library/test/manifests/latest" - - var envelope Envelope - envelope.Events = append(envelope.Events, manifestPush, layerPush0, layerPush1) - - p, err := json.MarshalIndent(envelope, "", " ") - if err != nil { - t.Fatalf("unexpected error marshaling envelope: %v", err) - } - if string(p) != expected { - t.Fatalf("format has changed\n%s\n != \n%s", string(p), expected) - } -} diff --git a/vendor/github.com/docker/distribution/notifications/http.go b/vendor/github.com/docker/distribution/notifications/http.go deleted file mode 100644 index 15751619b..000000000 --- a/vendor/github.com/docker/distribution/notifications/http.go +++ /dev/null @@ -1,150 +0,0 @@ -package notifications - -import ( - "bytes" - "encoding/json" - "fmt" - "net/http" - "sync" - "time" -) - -// httpSink implements a single-flight, http notification endpoint. This is -// very lightweight in that it only makes an attempt at an http request. -// Reliability should be provided by the caller. -type httpSink struct { - url string - - mu sync.Mutex - closed bool - client *http.Client - listeners []httpStatusListener - - // TODO(stevvooe): Allow one to configure the media type accepted by this - // sink and choose the serialization based on that. -} - -// newHTTPSink returns an unreliable, single-flight http sink. Wrap in other -// sinks for increased reliability. -func newHTTPSink(u string, timeout time.Duration, headers http.Header, transport *http.Transport, listeners ...httpStatusListener) *httpSink { - if transport == nil { - transport = http.DefaultTransport.(*http.Transport) - } - return &httpSink{ - url: u, - listeners: listeners, - client: &http.Client{ - Transport: &headerRoundTripper{ - Transport: transport, - headers: headers, - }, - Timeout: timeout, - }, - } -} - -// httpStatusListener is called on various outcomes of sending notifications. -type httpStatusListener interface { - success(status int, events ...Event) - failure(status int, events ...Event) - err(err error, events ...Event) -} - -// Accept makes an attempt to notify the endpoint, returning an error if it -// fails. It is the caller's responsibility to retry on error. The events are -// accepted or rejected as a group. -func (hs *httpSink) Write(events ...Event) error { - hs.mu.Lock() - defer hs.mu.Unlock() - defer hs.client.Transport.(*headerRoundTripper).CloseIdleConnections() - - if hs.closed { - return ErrSinkClosed - } - - envelope := Envelope{ - Events: events, - } - - // TODO(stevvooe): It is not ideal to keep re-encoding the request body on - // retry but we are going to do it to keep the code simple. It is likely - // we could change the event struct to manage its own buffer. - - p, err := json.MarshalIndent(envelope, "", " ") - if err != nil { - for _, listener := range hs.listeners { - listener.err(err, events...) - } - return fmt.Errorf("%v: error marshaling event envelope: %v", hs, err) - } - - body := bytes.NewReader(p) - resp, err := hs.client.Post(hs.url, EventsMediaType, body) - if err != nil { - for _, listener := range hs.listeners { - listener.err(err, events...) - } - - return fmt.Errorf("%v: error posting: %v", hs, err) - } - defer resp.Body.Close() - - // The notifier will treat any 2xx or 3xx response as accepted by the - // endpoint. - switch { - case resp.StatusCode >= 200 && resp.StatusCode < 400: - for _, listener := range hs.listeners { - listener.success(resp.StatusCode, events...) - } - - // TODO(stevvooe): This is a little accepting: we may want to support - // unsupported media type responses with retries using the correct - // media type. There may also be cases that will never work. - - return nil - default: - for _, listener := range hs.listeners { - listener.failure(resp.StatusCode, events...) - } - return fmt.Errorf("%v: response status %v unaccepted", hs, resp.Status) - } -} - -// Close the endpoint -func (hs *httpSink) Close() error { - hs.mu.Lock() - defer hs.mu.Unlock() - - if hs.closed { - return fmt.Errorf("httpsink: already closed") - } - - hs.closed = true - return nil -} - -func (hs *httpSink) String() string { - return fmt.Sprintf("httpSink{%s}", hs.url) -} - -type headerRoundTripper struct { - *http.Transport // must be transport to support CancelRequest - headers http.Header -} - -func (hrt *headerRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - var nreq http.Request - nreq = *req - nreq.Header = make(http.Header) - - merge := func(headers http.Header) { - for k, v := range headers { - nreq.Header[k] = append(nreq.Header[k], v...) - } - } - - merge(req.Header) - merge(hrt.headers) - - return hrt.Transport.RoundTrip(&nreq) -} diff --git a/vendor/github.com/docker/distribution/notifications/http_test.go b/vendor/github.com/docker/distribution/notifications/http_test.go deleted file mode 100644 index e04693621..000000000 --- a/vendor/github.com/docker/distribution/notifications/http_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package notifications - -import ( - "crypto/tls" - "encoding/json" - "fmt" - "mime" - "net/http" - "net/http/httptest" - "reflect" - "strconv" - "strings" - "testing" - - "github.com/docker/distribution/manifest/schema1" -) - -// TestHTTPSink mocks out an http endpoint and notifies it under a couple of -// conditions, ensuring correct behavior. -func TestHTTPSink(t *testing.T) { - serverHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - if r.Method != "POST" { - w.WriteHeader(http.StatusMethodNotAllowed) - t.Fatalf("unexpected request method: %v", r.Method) - return - } - - // Extract the content type and make sure it matches - contentType := r.Header.Get("Content-Type") - mediaType, _, err := mime.ParseMediaType(contentType) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - t.Fatalf("error parsing media type: %v, contenttype=%q", err, contentType) - return - } - - if mediaType != EventsMediaType { - w.WriteHeader(http.StatusUnsupportedMediaType) - t.Fatalf("incorrect media type: %q != %q", mediaType, EventsMediaType) - return - } - - var envelope Envelope - dec := json.NewDecoder(r.Body) - if err := dec.Decode(&envelope); err != nil { - w.WriteHeader(http.StatusBadRequest) - t.Fatalf("error decoding request body: %v", err) - return - } - - // Let caller choose the status - status, err := strconv.Atoi(r.FormValue("status")) - if err != nil { - t.Logf("error parsing status: %v", err) - - // May just be empty, set status to 200 - status = http.StatusOK - } - - w.WriteHeader(status) - }) - server := httptest.NewTLSServer(serverHandler) - - metrics := newSafeMetrics() - sink := newHTTPSink(server.URL, 0, nil, nil, - &endpointMetricsHTTPStatusListener{safeMetrics: metrics}) - - // first make sure that the default transport gives x509 untrusted cert error - events := []Event{} - err := sink.Write(events...) - if !strings.Contains(err.Error(), "x509") { - t.Fatal("TLS server with default transport should give unknown CA error") - } - if err := sink.Close(); err != nil { - t.Fatalf("unexpected error closing http sink: %v", err) - } - - // make sure that passing in the transport no longer gives this error - tr := &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - } - sink = newHTTPSink(server.URL, 0, nil, tr, - &endpointMetricsHTTPStatusListener{safeMetrics: metrics}) - err = sink.Write(events...) - if err != nil { - t.Fatalf("unexpected error writing events: %v", err) - } - - // reset server to standard http server and sink to a basic sink - server = httptest.NewServer(serverHandler) - sink = newHTTPSink(server.URL, 0, nil, nil, - &endpointMetricsHTTPStatusListener{safeMetrics: metrics}) - var expectedMetrics EndpointMetrics - expectedMetrics.Statuses = make(map[string]int) - - for _, tc := range []struct { - events []Event // events to send - url string - failure bool // true if there should be a failure. - statusCode int // if not set, no status code should be incremented. - }{ - { - statusCode: http.StatusOK, - events: []Event{ - createTestEvent("push", "library/test", schema1.MediaTypeSignedManifest)}, - }, - { - statusCode: http.StatusOK, - events: []Event{ - createTestEvent("push", "library/test", schema1.MediaTypeSignedManifest), - createTestEvent("push", "library/test", layerMediaType), - createTestEvent("push", "library/test", layerMediaType), - }, - }, - { - statusCode: http.StatusTemporaryRedirect, - }, - { - statusCode: http.StatusBadRequest, - failure: true, - }, - { - // Case where connection never goes through. - url: "http://shoudlntresolve/", - failure: true, - }, - } { - - if tc.failure { - expectedMetrics.Failures += len(tc.events) - } else { - expectedMetrics.Successes += len(tc.events) - } - - if tc.statusCode > 0 { - expectedMetrics.Statuses[fmt.Sprintf("%d %s", tc.statusCode, http.StatusText(tc.statusCode))] += len(tc.events) - } - - url := tc.url - if url == "" { - url = server.URL + "/" - } - // setup endpoint to respond with expected status code. - url += fmt.Sprintf("?status=%v", tc.statusCode) - sink.url = url - - t.Logf("testcase: %v, fail=%v", url, tc.failure) - // Try a simple event emission. - err := sink.Write(tc.events...) - - if !tc.failure { - if err != nil { - t.Fatalf("unexpected error send event: %v", err) - } - } else { - if err == nil { - t.Fatalf("the endpoint should have rejected the request") - } - } - - if !reflect.DeepEqual(metrics.EndpointMetrics, expectedMetrics) { - t.Fatalf("metrics not as expected: %#v != %#v", metrics.EndpointMetrics, expectedMetrics) - } - } - - if err := sink.Close(); err != nil { - t.Fatalf("unexpected error closing http sink: %v", err) - } - - // double close returns error - if err := sink.Close(); err == nil { - t.Fatalf("second close should have returned error: %v", err) - } - -} - -func createTestEvent(action, repo, typ string) Event { - event := createEvent(action) - - event.Target.MediaType = typ - event.Target.Repository = repo - - return *event -} diff --git a/vendor/github.com/docker/distribution/notifications/listener.go b/vendor/github.com/docker/distribution/notifications/listener.go deleted file mode 100644 index c968b98ad..000000000 --- a/vendor/github.com/docker/distribution/notifications/listener.go +++ /dev/null @@ -1,215 +0,0 @@ -package notifications - -import ( - "net/http" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" -) - -// ManifestListener describes a set of methods for listening to events related to manifests. -type ManifestListener interface { - ManifestPushed(repo reference.Named, sm distribution.Manifest, options ...distribution.ManifestServiceOption) error - ManifestPulled(repo reference.Named, sm distribution.Manifest, options ...distribution.ManifestServiceOption) error - ManifestDeleted(repo reference.Named, dgst digest.Digest) error -} - -// BlobListener describes a listener that can respond to layer related events. -type BlobListener interface { - BlobPushed(repo reference.Named, desc distribution.Descriptor) error - BlobPulled(repo reference.Named, desc distribution.Descriptor) error - BlobMounted(repo reference.Named, desc distribution.Descriptor, fromRepo reference.Named) error - BlobDeleted(repo reference.Named, desc digest.Digest) error -} - -// Listener combines all repository events into a single interface. -type Listener interface { - ManifestListener - BlobListener -} - -type repositoryListener struct { - distribution.Repository - listener Listener -} - -// Listen dispatches events on the repository to the listener. -func Listen(repo distribution.Repository, listener Listener) distribution.Repository { - return &repositoryListener{ - Repository: repo, - listener: listener, - } -} - -func (rl *repositoryListener) Manifests(ctx context.Context, options ...distribution.ManifestServiceOption) (distribution.ManifestService, error) { - manifests, err := rl.Repository.Manifests(ctx, options...) - if err != nil { - return nil, err - } - return &manifestServiceListener{ - ManifestService: manifests, - parent: rl, - }, nil -} - -func (rl *repositoryListener) Blobs(ctx context.Context) distribution.BlobStore { - return &blobServiceListener{ - BlobStore: rl.Repository.Blobs(ctx), - parent: rl, - } -} - -type manifestServiceListener struct { - distribution.ManifestService - parent *repositoryListener -} - -func (msl *manifestServiceListener) Delete(ctx context.Context, dgst digest.Digest) error { - err := msl.ManifestService.Delete(ctx, dgst) - if err == nil { - if err := msl.parent.listener.ManifestDeleted(msl.parent.Repository.Named(), dgst); err != nil { - context.GetLogger(ctx).Errorf("error dispatching manifest delete to listener: %v", err) - } - } - - return err -} - -func (msl *manifestServiceListener) Get(ctx context.Context, dgst digest.Digest, options ...distribution.ManifestServiceOption) (distribution.Manifest, error) { - sm, err := msl.ManifestService.Get(ctx, dgst, options...) - if err == nil { - if err := msl.parent.listener.ManifestPulled(msl.parent.Repository.Named(), sm, options...); err != nil { - context.GetLogger(ctx).Errorf("error dispatching manifest pull to listener: %v", err) - } - } - - return sm, err -} - -func (msl *manifestServiceListener) Put(ctx context.Context, sm distribution.Manifest, options ...distribution.ManifestServiceOption) (digest.Digest, error) { - dgst, err := msl.ManifestService.Put(ctx, sm, options...) - - if err == nil { - if err := msl.parent.listener.ManifestPushed(msl.parent.Repository.Named(), sm, options...); err != nil { - context.GetLogger(ctx).Errorf("error dispatching manifest push to listener: %v", err) - } - } - - return dgst, err -} - -type blobServiceListener struct { - distribution.BlobStore - parent *repositoryListener -} - -var _ distribution.BlobStore = &blobServiceListener{} - -func (bsl *blobServiceListener) Get(ctx context.Context, dgst digest.Digest) ([]byte, error) { - p, err := bsl.BlobStore.Get(ctx, dgst) - if err == nil { - if desc, err := bsl.Stat(ctx, dgst); err != nil { - context.GetLogger(ctx).Errorf("error resolving descriptor in ServeBlob listener: %v", err) - } else { - if err := bsl.parent.listener.BlobPulled(bsl.parent.Repository.Named(), desc); err != nil { - context.GetLogger(ctx).Errorf("error dispatching layer pull to listener: %v", err) - } - } - } - - return p, err -} - -func (bsl *blobServiceListener) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { - rc, err := bsl.BlobStore.Open(ctx, dgst) - if err == nil { - if desc, err := bsl.Stat(ctx, dgst); err != nil { - context.GetLogger(ctx).Errorf("error resolving descriptor in ServeBlob listener: %v", err) - } else { - if err := bsl.parent.listener.BlobPulled(bsl.parent.Repository.Named(), desc); err != nil { - context.GetLogger(ctx).Errorf("error dispatching layer pull to listener: %v", err) - } - } - } - - return rc, err -} - -func (bsl *blobServiceListener) ServeBlob(ctx context.Context, w http.ResponseWriter, r *http.Request, dgst digest.Digest) error { - err := bsl.BlobStore.ServeBlob(ctx, w, r, dgst) - if err == nil { - if desc, err := bsl.Stat(ctx, dgst); err != nil { - context.GetLogger(ctx).Errorf("error resolving descriptor in ServeBlob listener: %v", err) - } else { - if err := bsl.parent.listener.BlobPulled(bsl.parent.Repository.Named(), desc); err != nil { - context.GetLogger(ctx).Errorf("error dispatching layer pull to listener: %v", err) - } - } - } - - return err -} - -func (bsl *blobServiceListener) Put(ctx context.Context, mediaType string, p []byte) (distribution.Descriptor, error) { - desc, err := bsl.BlobStore.Put(ctx, mediaType, p) - if err == nil { - if err := bsl.parent.listener.BlobPushed(bsl.parent.Repository.Named(), desc); err != nil { - context.GetLogger(ctx).Errorf("error dispatching layer push to listener: %v", err) - } - } - - return desc, err -} - -func (bsl *blobServiceListener) Create(ctx context.Context, options ...distribution.BlobCreateOption) (distribution.BlobWriter, error) { - wr, err := bsl.BlobStore.Create(ctx, options...) - switch err := err.(type) { - case distribution.ErrBlobMounted: - if err := bsl.parent.listener.BlobMounted(bsl.parent.Repository.Named(), err.Descriptor, err.From); err != nil { - context.GetLogger(ctx).Errorf("error dispatching blob mount to listener: %v", err) - } - return nil, err - } - return bsl.decorateWriter(wr), err -} - -func (bsl *blobServiceListener) Delete(ctx context.Context, dgst digest.Digest) error { - err := bsl.BlobStore.Delete(ctx, dgst) - if err == nil { - if err := bsl.parent.listener.BlobDeleted(bsl.parent.Repository.Named(), dgst); err != nil { - context.GetLogger(ctx).Errorf("error dispatching layer delete to listener: %v", err) - } - } - - return err -} - -func (bsl *blobServiceListener) Resume(ctx context.Context, id string) (distribution.BlobWriter, error) { - wr, err := bsl.BlobStore.Resume(ctx, id) - return bsl.decorateWriter(wr), err -} - -func (bsl *blobServiceListener) decorateWriter(wr distribution.BlobWriter) distribution.BlobWriter { - return &blobWriterListener{ - BlobWriter: wr, - parent: bsl, - } -} - -type blobWriterListener struct { - distribution.BlobWriter - parent *blobServiceListener -} - -func (bwl *blobWriterListener) Commit(ctx context.Context, desc distribution.Descriptor) (distribution.Descriptor, error) { - committed, err := bwl.BlobWriter.Commit(ctx, desc) - if err == nil { - if err := bwl.parent.parent.listener.BlobPushed(bwl.parent.parent.Repository.Named(), committed); err != nil { - context.GetLogger(ctx).Errorf("error dispatching blob push to listener: %v", err) - } - } - - return committed, err -} diff --git a/vendor/github.com/docker/distribution/notifications/listener_test.go b/vendor/github.com/docker/distribution/notifications/listener_test.go deleted file mode 100644 index c7db5944e..000000000 --- a/vendor/github.com/docker/distribution/notifications/listener_test.go +++ /dev/null @@ -1,205 +0,0 @@ -package notifications - -import ( - "io" - "reflect" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage" - "github.com/docker/distribution/registry/storage/cache/memory" - "github.com/docker/distribution/registry/storage/driver/inmemory" - "github.com/docker/distribution/testutil" - "github.com/docker/libtrust" -) - -func TestListener(t *testing.T) { - ctx := context.Background() - k, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatal(err) - } - - registry, err := storage.NewRegistry(ctx, inmemory.New(), storage.BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), storage.EnableDelete, storage.EnableRedirect, storage.Schema1SigningKey(k)) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - tl := &testListener{ - ops: make(map[string]int), - } - - repoRef, _ := reference.ParseNamed("foo/bar") - repository, err := registry.Repository(ctx, repoRef) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - repository = Listen(repository, tl) - - // Now take the registry through a number of operations - checkExerciseRepository(t, repository) - - expectedOps := map[string]int{ - "manifest:push": 1, - "manifest:pull": 1, - "manifest:delete": 1, - "layer:push": 2, - "layer:pull": 2, - "layer:delete": 2, - } - - if !reflect.DeepEqual(tl.ops, expectedOps) { - t.Fatalf("counts do not match:\n%v\n !=\n%v", tl.ops, expectedOps) - } - -} - -type testListener struct { - ops map[string]int -} - -func (tl *testListener) ManifestPushed(repo reference.Named, m distribution.Manifest, options ...distribution.ManifestServiceOption) error { - tl.ops["manifest:push"]++ - - return nil -} - -func (tl *testListener) ManifestPulled(repo reference.Named, m distribution.Manifest, options ...distribution.ManifestServiceOption) error { - tl.ops["manifest:pull"]++ - return nil -} - -func (tl *testListener) ManifestDeleted(repo reference.Named, d digest.Digest) error { - tl.ops["manifest:delete"]++ - return nil -} - -func (tl *testListener) BlobPushed(repo reference.Named, desc distribution.Descriptor) error { - tl.ops["layer:push"]++ - return nil -} - -func (tl *testListener) BlobPulled(repo reference.Named, desc distribution.Descriptor) error { - tl.ops["layer:pull"]++ - return nil -} - -func (tl *testListener) BlobMounted(repo reference.Named, desc distribution.Descriptor, fromRepo reference.Named) error { - tl.ops["layer:mount"]++ - return nil -} - -func (tl *testListener) BlobDeleted(repo reference.Named, d digest.Digest) error { - tl.ops["layer:delete"]++ - return nil -} - -// checkExerciseRegistry takes the registry through all of its operations, -// carrying out generic checks. -func checkExerciseRepository(t *testing.T, repository distribution.Repository) { - // TODO(stevvooe): This would be a nice testutil function. Basically, it - // takes the registry through a common set of operations. This could be - // used to make cross-cutting updates by changing internals that affect - // update counts. Basically, it would make writing tests a lot easier. - - ctx := context.Background() - tag := "thetag" - // todo: change this to use Builder - - m := schema1.Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 1, - }, - Name: repository.Named().Name(), - Tag: tag, - } - - var blobDigests []digest.Digest - blobs := repository.Blobs(ctx) - for i := 0; i < 2; i++ { - rs, ds, err := testutil.CreateRandomTarFile() - if err != nil { - t.Fatalf("error creating test layer: %v", err) - } - dgst := digest.Digest(ds) - blobDigests = append(blobDigests, dgst) - - wr, err := blobs.Create(ctx) - if err != nil { - t.Fatalf("error creating layer upload: %v", err) - } - - // Use the resumes, as well! - wr, err = blobs.Resume(ctx, wr.ID()) - if err != nil { - t.Fatalf("error resuming layer upload: %v", err) - } - - io.Copy(wr, rs) - - if _, err := wr.Commit(ctx, distribution.Descriptor{Digest: dgst}); err != nil { - t.Fatalf("unexpected error finishing upload: %v", err) - } - - m.FSLayers = append(m.FSLayers, schema1.FSLayer{ - BlobSum: dgst, - }) - m.History = append(m.History, schema1.History{ - V1Compatibility: "", - }) - - // Then fetch the blobs - if rc, err := blobs.Open(ctx, dgst); err != nil { - t.Fatalf("error fetching layer: %v", err) - } else { - defer rc.Close() - } - } - - pk, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatalf("unexpected error generating key: %v", err) - } - - sm, err := schema1.Sign(&m, pk) - if err != nil { - t.Fatalf("unexpected error signing manifest: %v", err) - } - - manifests, err := repository.Manifests(ctx) - if err != nil { - t.Fatal(err.Error()) - } - - var digestPut digest.Digest - if digestPut, err = manifests.Put(ctx, sm); err != nil { - t.Fatalf("unexpected error putting the manifest: %v", err) - } - - dgst := digest.FromBytes(sm.Canonical) - if dgst != digestPut { - t.Fatalf("mismatching digest from payload and put") - } - - _, err = manifests.Get(ctx, dgst) - if err != nil { - t.Fatalf("unexpected error fetching manifest: %v", err) - } - - err = manifests.Delete(ctx, dgst) - if err != nil { - t.Fatalf("unexpected error deleting blob: %v", err) - } - - for _, d := range blobDigests { - err = blobs.Delete(ctx, d) - if err != nil { - t.Fatalf("unexpected error deleting blob: %v", err) - } - - } -} diff --git a/vendor/github.com/docker/distribution/notifications/metrics.go b/vendor/github.com/docker/distribution/notifications/metrics.go deleted file mode 100644 index a20af1687..000000000 --- a/vendor/github.com/docker/distribution/notifications/metrics.go +++ /dev/null @@ -1,152 +0,0 @@ -package notifications - -import ( - "expvar" - "fmt" - "net/http" - "sync" -) - -// EndpointMetrics track various actions taken by the endpoint, typically by -// number of events. The goal of this to export it via expvar but we may find -// some other future solution to be better. -type EndpointMetrics struct { - Pending int // events pending in queue - Events int // total events incoming - Successes int // total events written successfully - Failures int // total events failed - Errors int // total events errored - Statuses map[string]int // status code histogram, per call event -} - -// safeMetrics guards the metrics implementation with a lock and provides a -// safe update function. -type safeMetrics struct { - EndpointMetrics - sync.Mutex // protects statuses map -} - -// newSafeMetrics returns safeMetrics with map allocated. -func newSafeMetrics() *safeMetrics { - var sm safeMetrics - sm.Statuses = make(map[string]int) - return &sm -} - -// httpStatusListener returns the listener for the http sink that updates the -// relevant counters. -func (sm *safeMetrics) httpStatusListener() httpStatusListener { - return &endpointMetricsHTTPStatusListener{ - safeMetrics: sm, - } -} - -// eventQueueListener returns a listener that maintains queue related counters. -func (sm *safeMetrics) eventQueueListener() eventQueueListener { - return &endpointMetricsEventQueueListener{ - safeMetrics: sm, - } -} - -// endpointMetricsHTTPStatusListener increments counters related to http sinks -// for the relevant events. -type endpointMetricsHTTPStatusListener struct { - *safeMetrics -} - -var _ httpStatusListener = &endpointMetricsHTTPStatusListener{} - -func (emsl *endpointMetricsHTTPStatusListener) success(status int, events ...Event) { - emsl.safeMetrics.Lock() - defer emsl.safeMetrics.Unlock() - emsl.Statuses[fmt.Sprintf("%d %s", status, http.StatusText(status))] += len(events) - emsl.Successes += len(events) -} - -func (emsl *endpointMetricsHTTPStatusListener) failure(status int, events ...Event) { - emsl.safeMetrics.Lock() - defer emsl.safeMetrics.Unlock() - emsl.Statuses[fmt.Sprintf("%d %s", status, http.StatusText(status))] += len(events) - emsl.Failures += len(events) -} - -func (emsl *endpointMetricsHTTPStatusListener) err(err error, events ...Event) { - emsl.safeMetrics.Lock() - defer emsl.safeMetrics.Unlock() - emsl.Errors += len(events) -} - -// endpointMetricsEventQueueListener maintains the incoming events counter and -// the queues pending count. -type endpointMetricsEventQueueListener struct { - *safeMetrics -} - -func (eqc *endpointMetricsEventQueueListener) ingress(events ...Event) { - eqc.Lock() - defer eqc.Unlock() - eqc.Events += len(events) - eqc.Pending += len(events) -} - -func (eqc *endpointMetricsEventQueueListener) egress(events ...Event) { - eqc.Lock() - defer eqc.Unlock() - eqc.Pending -= len(events) -} - -// endpoints is global registry of endpoints used to report metrics to expvar -var endpoints struct { - registered []*Endpoint - mu sync.Mutex -} - -// register places the endpoint into expvar so that stats are tracked. -func register(e *Endpoint) { - endpoints.mu.Lock() - defer endpoints.mu.Unlock() - - endpoints.registered = append(endpoints.registered, e) -} - -func init() { - // NOTE(stevvooe): Setup registry metrics structure to report to expvar. - // Ideally, we do more metrics through logging but we need some nice - // realtime metrics for queue state for now. - - registry := expvar.Get("registry") - - if registry == nil { - registry = expvar.NewMap("registry") - } - - var notifications expvar.Map - notifications.Init() - notifications.Set("endpoints", expvar.Func(func() interface{} { - endpoints.mu.Lock() - defer endpoints.mu.Unlock() - - var names []interface{} - for _, v := range endpoints.registered { - var epjson struct { - Name string `json:"name"` - URL string `json:"url"` - EndpointConfig - - Metrics EndpointMetrics - } - - epjson.Name = v.Name() - epjson.URL = v.URL() - epjson.EndpointConfig = v.EndpointConfig - - v.ReadMetrics(&epjson.Metrics) - - names = append(names, epjson) - } - - return names - })) - - registry.(*expvar.Map).Set("notifications", ¬ifications) -} diff --git a/vendor/github.com/docker/distribution/notifications/sinks.go b/vendor/github.com/docker/distribution/notifications/sinks.go deleted file mode 100644 index 549ba97e2..000000000 --- a/vendor/github.com/docker/distribution/notifications/sinks.go +++ /dev/null @@ -1,375 +0,0 @@ -package notifications - -import ( - "container/list" - "fmt" - "sync" - "time" - - "github.com/Sirupsen/logrus" -) - -// NOTE(stevvooe): This file contains definitions for several utility sinks. -// Typically, the broadcaster is the only sink that should be required -// externally, but others are suitable for export if the need arises. Albeit, -// the tight integration with endpoint metrics should be removed. - -// Broadcaster sends events to multiple, reliable Sinks. The goal of this -// component is to dispatch events to configured endpoints. Reliability can be -// provided by wrapping incoming sinks. -type Broadcaster struct { - sinks []Sink - events chan []Event - closed chan chan struct{} -} - -// NewBroadcaster ... -// Add appends one or more sinks to the list of sinks. The broadcaster -// behavior will be affected by the properties of the sink. Generally, the -// sink should accept all messages and deal with reliability on its own. Use -// of EventQueue and RetryingSink should be used here. -func NewBroadcaster(sinks ...Sink) *Broadcaster { - b := Broadcaster{ - sinks: sinks, - events: make(chan []Event), - closed: make(chan chan struct{}), - } - - // Start the broadcaster - go b.run() - - return &b -} - -// Write accepts a block of events to be dispatched to all sinks. This method -// will never fail and should never block (hopefully!). The caller cedes the -// slice memory to the broadcaster and should not modify it after calling -// write. -func (b *Broadcaster) Write(events ...Event) error { - select { - case b.events <- events: - case <-b.closed: - return ErrSinkClosed - } - return nil -} - -// Close the broadcaster, ensuring that all messages are flushed to the -// underlying sink before returning. -func (b *Broadcaster) Close() error { - logrus.Infof("broadcaster: closing") - select { - case <-b.closed: - // already closed - return fmt.Errorf("broadcaster: already closed") - default: - // do a little chan handoff dance to synchronize closing - closed := make(chan struct{}) - b.closed <- closed - close(b.closed) - <-closed - return nil - } -} - -// run is the main broadcast loop, started when the broadcaster is created. -// Under normal conditions, it waits for events on the event channel. After -// Close is called, this goroutine will exit. -func (b *Broadcaster) run() { - for { - select { - case block := <-b.events: - for _, sink := range b.sinks { - if err := sink.Write(block...); err != nil { - logrus.Errorf("broadcaster: error writing events to %v, these events will be lost: %v", sink, err) - } - } - case closing := <-b.closed: - - // close all the underlying sinks - for _, sink := range b.sinks { - if err := sink.Close(); err != nil { - logrus.Errorf("broadcaster: error closing sink %v: %v", sink, err) - } - } - closing <- struct{}{} - - logrus.Debugf("broadcaster: closed") - return - } - } -} - -// eventQueue accepts all messages into a queue for asynchronous consumption -// by a sink. It is unbounded and thread safe but the sink must be reliable or -// events will be dropped. -type eventQueue struct { - sink Sink - events *list.List - listeners []eventQueueListener - cond *sync.Cond - mu sync.Mutex - closed bool -} - -// eventQueueListener is called when various events happen on the queue. -type eventQueueListener interface { - ingress(events ...Event) - egress(events ...Event) -} - -// newEventQueue returns a queue to the provided sink. If the updater is non- -// nil, it will be called to update pending metrics on ingress and egress. -func newEventQueue(sink Sink, listeners ...eventQueueListener) *eventQueue { - eq := eventQueue{ - sink: sink, - events: list.New(), - listeners: listeners, - } - - eq.cond = sync.NewCond(&eq.mu) - go eq.run() - return &eq -} - -// Write accepts the events into the queue, only failing if the queue has -// beend closed. -func (eq *eventQueue) Write(events ...Event) error { - eq.mu.Lock() - defer eq.mu.Unlock() - - if eq.closed { - return ErrSinkClosed - } - - for _, listener := range eq.listeners { - listener.ingress(events...) - } - eq.events.PushBack(events) - eq.cond.Signal() // signal waiters - - return nil -} - -// Close shutsdown the event queue, flushing -func (eq *eventQueue) Close() error { - eq.mu.Lock() - defer eq.mu.Unlock() - - if eq.closed { - return fmt.Errorf("eventqueue: already closed") - } - - // set closed flag - eq.closed = true - eq.cond.Signal() // signal flushes queue - eq.cond.Wait() // wait for signal from last flush - - return eq.sink.Close() -} - -// run is the main goroutine to flush events to the target sink. -func (eq *eventQueue) run() { - for { - block := eq.next() - - if block == nil { - return // nil block means event queue is closed. - } - - if err := eq.sink.Write(block...); err != nil { - logrus.Warnf("eventqueue: error writing events to %v, these events will be lost: %v", eq.sink, err) - } - - for _, listener := range eq.listeners { - listener.egress(block...) - } - } -} - -// next encompasses the critical section of the run loop. When the queue is -// empty, it will block on the condition. If new data arrives, it will wake -// and return a block. When closed, a nil slice will be returned. -func (eq *eventQueue) next() []Event { - eq.mu.Lock() - defer eq.mu.Unlock() - - for eq.events.Len() < 1 { - if eq.closed { - eq.cond.Broadcast() - return nil - } - - eq.cond.Wait() - } - - front := eq.events.Front() - block := front.Value.([]Event) - eq.events.Remove(front) - - return block -} - -// ignoredMediaTypesSink discards events with ignored target media types and -// passes the rest along. -type ignoredMediaTypesSink struct { - Sink - ignored map[string]bool -} - -func newIgnoredMediaTypesSink(sink Sink, ignored []string) Sink { - if len(ignored) == 0 { - return sink - } - - ignoredMap := make(map[string]bool) - for _, mediaType := range ignored { - ignoredMap[mediaType] = true - } - - return &ignoredMediaTypesSink{ - Sink: sink, - ignored: ignoredMap, - } -} - -// Write discards events with ignored target media types and passes the rest -// along. -func (imts *ignoredMediaTypesSink) Write(events ...Event) error { - var kept []Event - for _, e := range events { - if !imts.ignored[e.Target.MediaType] { - kept = append(kept, e) - } - } - if len(kept) == 0 { - return nil - } - return imts.Sink.Write(kept...) -} - -// retryingSink retries the write until success or an ErrSinkClosed is -// returned. Underlying sink must have p > 0 of succeeding or the sink will -// block. Internally, it is a circuit breaker retries to manage reset. -// Concurrent calls to a retrying sink are serialized through the sink, -// meaning that if one is in-flight, another will not proceed. -type retryingSink struct { - mu sync.Mutex - sink Sink - closed bool - - // circuit breaker heuristics - failures struct { - threshold int - recent int - last time.Time - backoff time.Duration // time after which we retry after failure. - } -} - -type retryingSinkListener interface { - active(events ...Event) - retry(events ...Event) -} - -// TODO(stevvooe): We are using circuit break here, which actually doesn't -// make a whole lot of sense for this use case, since we always retry. Move -// this to use bounded exponential backoff. - -// newRetryingSink returns a sink that will retry writes to a sink, backing -// off on failure. Parameters threshold and backoff adjust the behavior of the -// circuit breaker. -func newRetryingSink(sink Sink, threshold int, backoff time.Duration) *retryingSink { - rs := &retryingSink{ - sink: sink, - } - rs.failures.threshold = threshold - rs.failures.backoff = backoff - - return rs -} - -// Write attempts to flush the events to the downstream sink until it succeeds -// or the sink is closed. -func (rs *retryingSink) Write(events ...Event) error { - rs.mu.Lock() - defer rs.mu.Unlock() - -retry: - - if rs.closed { - return ErrSinkClosed - } - - if !rs.proceed() { - logrus.Warnf("%v encountered too many errors, backing off", rs.sink) - rs.wait(rs.failures.backoff) - goto retry - } - - if err := rs.write(events...); err != nil { - if err == ErrSinkClosed { - // terminal! - return err - } - - logrus.Errorf("retryingsink: error writing events: %v, retrying", err) - goto retry - } - - return nil -} - -// Close closes the sink and the underlying sink. -func (rs *retryingSink) Close() error { - rs.mu.Lock() - defer rs.mu.Unlock() - - if rs.closed { - return fmt.Errorf("retryingsink: already closed") - } - - rs.closed = true - return rs.sink.Close() -} - -// write provides a helper that dispatches failure and success properly. Used -// by write as the single-flight write call. -func (rs *retryingSink) write(events ...Event) error { - if err := rs.sink.Write(events...); err != nil { - rs.failure() - return err - } - - rs.reset() - return nil -} - -// wait backoff time against the sink, unlocking so others can proceed. Should -// only be called by methods that currently have the mutex. -func (rs *retryingSink) wait(backoff time.Duration) { - rs.mu.Unlock() - defer rs.mu.Lock() - - // backoff here - time.Sleep(backoff) -} - -// reset marks a successful call. -func (rs *retryingSink) reset() { - rs.failures.recent = 0 - rs.failures.last = time.Time{} -} - -// failure records a failure. -func (rs *retryingSink) failure() { - rs.failures.recent++ - rs.failures.last = time.Now().UTC() -} - -// proceed returns true if the call should proceed based on circuit breaker -// heuristics. -func (rs *retryingSink) proceed() bool { - return rs.failures.recent < rs.failures.threshold || - time.Now().UTC().After(rs.failures.last.Add(rs.failures.backoff)) -} diff --git a/vendor/github.com/docker/distribution/notifications/sinks_test.go b/vendor/github.com/docker/distribution/notifications/sinks_test.go deleted file mode 100644 index 1bfa12c6b..000000000 --- a/vendor/github.com/docker/distribution/notifications/sinks_test.go +++ /dev/null @@ -1,256 +0,0 @@ -package notifications - -import ( - "fmt" - "math/rand" - "reflect" - "sync" - "time" - - "github.com/Sirupsen/logrus" - - "testing" -) - -func TestBroadcaster(t *testing.T) { - const nEvents = 1000 - var sinks []Sink - - for i := 0; i < 10; i++ { - sinks = append(sinks, &testSink{}) - } - - b := NewBroadcaster(sinks...) - - var block []Event - var wg sync.WaitGroup - for i := 1; i <= nEvents; i++ { - block = append(block, createTestEvent("push", "library/test", "blob")) - - if i%10 == 0 && i > 0 { - wg.Add(1) - go func(block ...Event) { - if err := b.Write(block...); err != nil { - t.Fatalf("error writing block of length %d: %v", len(block), err) - } - wg.Done() - }(block...) - - block = nil - } - } - - wg.Wait() // Wait until writes complete - checkClose(t, b) - - // Iterate through the sinks and check that they all have the expected length. - for _, sink := range sinks { - ts := sink.(*testSink) - ts.mu.Lock() - defer ts.mu.Unlock() - - if len(ts.events) != nEvents { - t.Fatalf("not all events ended up in testsink: len(testSink) == %d, not %d", len(ts.events), nEvents) - } - - if !ts.closed { - t.Fatalf("sink should have been closed") - } - } - -} - -func TestEventQueue(t *testing.T) { - const nevents = 1000 - var ts testSink - metrics := newSafeMetrics() - eq := newEventQueue( - // delayed sync simulates destination slower than channel comms - &delayedSink{ - Sink: &ts, - delay: time.Millisecond * 1, - }, metrics.eventQueueListener()) - - var wg sync.WaitGroup - var block []Event - for i := 1; i <= nevents; i++ { - block = append(block, createTestEvent("push", "library/test", "blob")) - if i%10 == 0 && i > 0 { - wg.Add(1) - go func(block ...Event) { - if err := eq.Write(block...); err != nil { - t.Fatalf("error writing event block: %v", err) - } - wg.Done() - }(block...) - - block = nil - } - } - - wg.Wait() - checkClose(t, eq) - - ts.mu.Lock() - defer ts.mu.Unlock() - metrics.Lock() - defer metrics.Unlock() - - if len(ts.events) != nevents { - t.Fatalf("events did not make it to the sink: %d != %d", len(ts.events), 1000) - } - - if !ts.closed { - t.Fatalf("sink should have been closed") - } - - if metrics.Events != nevents { - t.Fatalf("unexpected ingress count: %d != %d", metrics.Events, nevents) - } - - if metrics.Pending != 0 { - t.Fatalf("unexpected egress count: %d != %d", metrics.Pending, 0) - } -} - -func TestIgnoredMediaTypesSink(t *testing.T) { - blob := createTestEvent("push", "library/test", "blob") - manifest := createTestEvent("push", "library/test", "manifest") - - type testcase struct { - ignored []string - expected []Event - } - - cases := []testcase{ - {nil, []Event{blob, manifest}}, - {[]string{"other"}, []Event{blob, manifest}}, - {[]string{"blob"}, []Event{manifest}}, - {[]string{"blob", "manifest"}, nil}, - } - - for _, c := range cases { - ts := &testSink{} - s := newIgnoredMediaTypesSink(ts, c.ignored) - - if err := s.Write(blob, manifest); err != nil { - t.Fatalf("error writing event: %v", err) - } - - ts.mu.Lock() - if !reflect.DeepEqual(ts.events, c.expected) { - t.Fatalf("unexpected events: %#v != %#v", ts.events, c.expected) - } - ts.mu.Unlock() - } -} - -func TestRetryingSink(t *testing.T) { - - // Make a sync that fails most of the time, ensuring that all the events - // make it through. - var ts testSink - flaky := &flakySink{ - rate: 1.0, // start out always failing. - Sink: &ts, - } - s := newRetryingSink(flaky, 3, 10*time.Millisecond) - - var wg sync.WaitGroup - var block []Event - for i := 1; i <= 100; i++ { - block = append(block, createTestEvent("push", "library/test", "blob")) - - // Above 50, set the failure rate lower - if i > 50 { - s.mu.Lock() - flaky.rate = 0.90 - s.mu.Unlock() - } - - if i%10 == 0 && i > 0 { - wg.Add(1) - go func(block ...Event) { - defer wg.Done() - if err := s.Write(block...); err != nil { - t.Fatalf("error writing event block: %v", err) - } - }(block...) - - block = nil - } - } - - wg.Wait() - checkClose(t, s) - - ts.mu.Lock() - defer ts.mu.Unlock() - - if len(ts.events) != 100 { - t.Fatalf("events not propagated: %d != %d", len(ts.events), 100) - } -} - -type testSink struct { - events []Event - mu sync.Mutex - closed bool -} - -func (ts *testSink) Write(events ...Event) error { - ts.mu.Lock() - defer ts.mu.Unlock() - ts.events = append(ts.events, events...) - return nil -} - -func (ts *testSink) Close() error { - ts.mu.Lock() - defer ts.mu.Unlock() - ts.closed = true - - logrus.Infof("closing testSink") - return nil -} - -type delayedSink struct { - Sink - delay time.Duration -} - -func (ds *delayedSink) Write(events ...Event) error { - time.Sleep(ds.delay) - return ds.Sink.Write(events...) -} - -type flakySink struct { - Sink - rate float64 -} - -func (fs *flakySink) Write(events ...Event) error { - if rand.Float64() < fs.rate { - return fmt.Errorf("error writing %d events", len(events)) - } - - return fs.Sink.Write(events...) -} - -func checkClose(t *testing.T, sink Sink) { - if err := sink.Close(); err != nil { - t.Fatalf("unexpected error closing: %v", err) - } - - // second close should not crash but should return an error. - if err := sink.Close(); err == nil { - t.Fatalf("no error on double close") - } - - // Write after closed should be an error - if err := sink.Write([]Event{}...); err == nil { - t.Fatalf("write after closed did not have an error") - } else if err != ErrSinkClosed { - t.Fatalf("error should be ErrSinkClosed") - } -} diff --git a/vendor/github.com/docker/distribution/project/dev-image/Dockerfile b/vendor/github.com/docker/distribution/project/dev-image/Dockerfile deleted file mode 100644 index 1e2a8471c..000000000 --- a/vendor/github.com/docker/distribution/project/dev-image/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM ubuntu:14.04 - -ENV GOLANG_VERSION 1.4rc1 -ENV GOPATH /var/cache/drone -ENV GOROOT /usr/local/go -ENV PATH $PATH:$GOROOT/bin:$GOPATH/bin - -ENV LANG C -ENV LC_ALL C - -RUN apt-get update && apt-get install -y \ - wget ca-certificates git mercurial bzr \ - --no-install-recommends \ - && rm -rf /var/lib/apt/lists/* - -RUN wget https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz --quiet && \ - tar -C /usr/local -xzf go$GOLANG_VERSION.linux-amd64.tar.gz && \ - rm go${GOLANG_VERSION}.linux-amd64.tar.gz - -RUN go get github.com/axw/gocov/gocov github.com/mattn/goveralls github.com/golang/lint/golint diff --git a/vendor/github.com/docker/distribution/project/hooks/README.md b/vendor/github.com/docker/distribution/project/hooks/README.md deleted file mode 100644 index eda886966..000000000 --- a/vendor/github.com/docker/distribution/project/hooks/README.md +++ /dev/null @@ -1,6 +0,0 @@ -Git Hooks -========= - -To enforce valid and properly-formatted code, there is CI in place which runs `gofmt`, `golint`, and `go vet` against code in the repository. - -As an aid to prevent committing invalid code in the first place, a git pre-commit hook has been added to the repository, found in [pre-commit](./pre-commit). As it is impossible to automatically add linked hooks to a git repository, this hook should be linked into your `.git/hooks/pre-commit`, which can be done by running the `configure-hooks.sh` script in this directory. This script is the preferred method of configuring hooks, as it will be updated as more are added. \ No newline at end of file diff --git a/vendor/github.com/docker/distribution/project/hooks/configure-hooks.sh b/vendor/github.com/docker/distribution/project/hooks/configure-hooks.sh deleted file mode 100755 index 6afea8a13..000000000 --- a/vendor/github.com/docker/distribution/project/hooks/configure-hooks.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -cd $(dirname $0) - -REPO_ROOT=$(git rev-parse --show-toplevel) -RESOLVE_REPO_ROOT_STATUS=$? -if [ "$RESOLVE_REPO_ROOT_STATUS" -ne "0" ]; then - echo -e "Unable to resolve repository root. Error:\n$REPO_ROOT" > /dev/stderr - exit $RESOLVE_REPO_ROOT_STATUS -fi - -set -e -set -x - -# Just in case the directory doesn't exist -mkdir -p $REPO_ROOT/.git/hooks - -ln -f -s $(pwd)/pre-commit $REPO_ROOT/.git/hooks/pre-commit \ No newline at end of file diff --git a/vendor/github.com/docker/distribution/project/hooks/pre-commit b/vendor/github.com/docker/distribution/project/hooks/pre-commit deleted file mode 100755 index 3ee2e913f..000000000 --- a/vendor/github.com/docker/distribution/project/hooks/pre-commit +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -REPO_ROOT=$(git rev-parse --show-toplevel) -RESOLVE_REPO_ROOT_STATUS=$? -if [ "$RESOLVE_REPO_ROOT_STATUS" -ne "0" ]; then - printf "Unable to resolve repository root. Error:\n%s\n" "$RESOLVE_REPO_ROOT_STATUS" > /dev/stderr - exit $RESOLVE_REPO_ROOT_STATUS -fi - -cd $REPO_ROOT - -GOFMT_ERRORS=$(gofmt -s -l . 2>&1) -if [ -n "$GOFMT_ERRORS" ]; then - printf 'gofmt failed for the following files:\n%s\n\nPlease run "gofmt -s -l ." in the root of your repository before committing\n' "$GOFMT_ERRORS" > /dev/stderr - exit 1 -fi - -GOLINT_ERRORS=$(golint ./... 2>&1) -if [ -n "$GOLINT_ERRORS" ]; then - printf "golint failed with the following errors:\n%s\n" "$GOLINT_ERRORS" > /dev/stderr - exit 1 -fi - -GOVET_ERRORS=$(go vet ./... 2>&1) -GOVET_STATUS=$? -if [ "$GOVET_STATUS" -ne "0" ]; then - printf "govet failed with the following errors:\n%s\n" "$GOVET_ERRORS" > /dev/stderr - exit $GOVET_STATUS -fi diff --git a/vendor/github.com/docker/distribution/registry/api/errcode/errors.go b/vendor/github.com/docker/distribution/registry/api/errcode/errors.go deleted file mode 100644 index 6d9bb4b62..000000000 --- a/vendor/github.com/docker/distribution/registry/api/errcode/errors.go +++ /dev/null @@ -1,267 +0,0 @@ -package errcode - -import ( - "encoding/json" - "fmt" - "strings" -) - -// ErrorCoder is the base interface for ErrorCode and Error allowing -// users of each to just call ErrorCode to get the real ID of each -type ErrorCoder interface { - ErrorCode() ErrorCode -} - -// ErrorCode represents the error type. The errors are serialized via strings -// and the integer format may change and should *never* be exported. -type ErrorCode int - -var _ error = ErrorCode(0) - -// ErrorCode just returns itself -func (ec ErrorCode) ErrorCode() ErrorCode { - return ec -} - -// Error returns the ID/Value -func (ec ErrorCode) Error() string { - // NOTE(stevvooe): Cannot use message here since it may have unpopulated args. - return strings.ToLower(strings.Replace(ec.String(), "_", " ", -1)) -} - -// Descriptor returns the descriptor for the error code. -func (ec ErrorCode) Descriptor() ErrorDescriptor { - d, ok := errorCodeToDescriptors[ec] - - if !ok { - return ErrorCodeUnknown.Descriptor() - } - - return d -} - -// String returns the canonical identifier for this error code. -func (ec ErrorCode) String() string { - return ec.Descriptor().Value -} - -// Message returned the human-readable error message for this error code. -func (ec ErrorCode) Message() string { - return ec.Descriptor().Message -} - -// MarshalText encodes the receiver into UTF-8-encoded text and returns the -// result. -func (ec ErrorCode) MarshalText() (text []byte, err error) { - return []byte(ec.String()), nil -} - -// UnmarshalText decodes the form generated by MarshalText. -func (ec *ErrorCode) UnmarshalText(text []byte) error { - desc, ok := idToDescriptors[string(text)] - - if !ok { - desc = ErrorCodeUnknown.Descriptor() - } - - *ec = desc.Code - - return nil -} - -// WithMessage creates a new Error struct based on the passed-in info and -// overrides the Message property. -func (ec ErrorCode) WithMessage(message string) Error { - return Error{ - Code: ec, - Message: message, - } -} - -// WithDetail creates a new Error struct based on the passed-in info and -// set the Detail property appropriately -func (ec ErrorCode) WithDetail(detail interface{}) Error { - return Error{ - Code: ec, - Message: ec.Message(), - }.WithDetail(detail) -} - -// WithArgs creates a new Error struct and sets the Args slice -func (ec ErrorCode) WithArgs(args ...interface{}) Error { - return Error{ - Code: ec, - Message: ec.Message(), - }.WithArgs(args...) -} - -// Error provides a wrapper around ErrorCode with extra Details provided. -type Error struct { - Code ErrorCode `json:"code"` - Message string `json:"message"` - Detail interface{} `json:"detail,omitempty"` - - // TODO(duglin): See if we need an "args" property so we can do the - // variable substitution right before showing the message to the user -} - -var _ error = Error{} - -// ErrorCode returns the ID/Value of this Error -func (e Error) ErrorCode() ErrorCode { - return e.Code -} - -// Error returns a human readable representation of the error. -func (e Error) Error() string { - return fmt.Sprintf("%s: %s", e.Code.Error(), e.Message) -} - -// WithDetail will return a new Error, based on the current one, but with -// some Detail info added -func (e Error) WithDetail(detail interface{}) Error { - return Error{ - Code: e.Code, - Message: e.Message, - Detail: detail, - } -} - -// WithArgs uses the passed-in list of interface{} as the substitution -// variables in the Error's Message string, but returns a new Error -func (e Error) WithArgs(args ...interface{}) Error { - return Error{ - Code: e.Code, - Message: fmt.Sprintf(e.Code.Message(), args...), - Detail: e.Detail, - } -} - -// ErrorDescriptor provides relevant information about a given error code. -type ErrorDescriptor struct { - // Code is the error code that this descriptor describes. - Code ErrorCode - - // Value provides a unique, string key, often captilized with - // underscores, to identify the error code. This value is used as the - // keyed value when serializing api errors. - Value string - - // Message is a short, human readable decription of the error condition - // included in API responses. - Message string - - // Description provides a complete account of the errors purpose, suitable - // for use in documentation. - Description string - - // HTTPStatusCode provides the http status code that is associated with - // this error condition. - HTTPStatusCode int -} - -// ParseErrorCode returns the value by the string error code. -// `ErrorCodeUnknown` will be returned if the error is not known. -func ParseErrorCode(value string) ErrorCode { - ed, ok := idToDescriptors[value] - if ok { - return ed.Code - } - - return ErrorCodeUnknown -} - -// Errors provides the envelope for multiple errors and a few sugar methods -// for use within the application. -type Errors []error - -var _ error = Errors{} - -func (errs Errors) Error() string { - switch len(errs) { - case 0: - return "" - case 1: - return errs[0].Error() - default: - msg := "errors:\n" - for _, err := range errs { - msg += err.Error() + "\n" - } - return msg - } -} - -// Len returns the current number of errors. -func (errs Errors) Len() int { - return len(errs) -} - -// MarshalJSON converts slice of error, ErrorCode or Error into a -// slice of Error - then serializes -func (errs Errors) MarshalJSON() ([]byte, error) { - var tmpErrs struct { - Errors []Error `json:"errors,omitempty"` - } - - for _, daErr := range errs { - var err Error - - switch daErr.(type) { - case ErrorCode: - err = daErr.(ErrorCode).WithDetail(nil) - case Error: - err = daErr.(Error) - default: - err = ErrorCodeUnknown.WithDetail(daErr) - - } - - // If the Error struct was setup and they forgot to set the - // Message field (meaning its "") then grab it from the ErrCode - msg := err.Message - if msg == "" { - msg = err.Code.Message() - } - - tmpErrs.Errors = append(tmpErrs.Errors, Error{ - Code: err.Code, - Message: msg, - Detail: err.Detail, - }) - } - - return json.Marshal(tmpErrs) -} - -// UnmarshalJSON deserializes []Error and then converts it into slice of -// Error or ErrorCode -func (errs *Errors) UnmarshalJSON(data []byte) error { - var tmpErrs struct { - Errors []Error - } - - if err := json.Unmarshal(data, &tmpErrs); err != nil { - return err - } - - var newErrs Errors - for _, daErr := range tmpErrs.Errors { - // If Message is empty or exactly matches the Code's message string - // then just use the Code, no need for a full Error struct - if daErr.Detail == nil && (daErr.Message == "" || daErr.Message == daErr.Code.Message()) { - // Error's w/o details get converted to ErrorCode - newErrs = append(newErrs, daErr.Code) - } else { - // Error's w/ details are untouched - newErrs = append(newErrs, Error{ - Code: daErr.Code, - Message: daErr.Message, - Detail: daErr.Detail, - }) - } - } - - *errs = newErrs - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/api/errcode/errors_test.go b/vendor/github.com/docker/distribution/registry/api/errcode/errors_test.go deleted file mode 100644 index 54e7a736d..000000000 --- a/vendor/github.com/docker/distribution/registry/api/errcode/errors_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package errcode - -import ( - "encoding/json" - "net/http" - "reflect" - "strings" - "testing" -) - -// TestErrorsManagement does a quick check of the Errors type to ensure that -// members are properly pushed and marshaled. -var ErrorCodeTest1 = Register("test.errors", ErrorDescriptor{ - Value: "TEST1", - Message: "test error 1", - Description: `Just a test message #1.`, - HTTPStatusCode: http.StatusInternalServerError, -}) - -var ErrorCodeTest2 = Register("test.errors", ErrorDescriptor{ - Value: "TEST2", - Message: "test error 2", - Description: `Just a test message #2.`, - HTTPStatusCode: http.StatusNotFound, -}) - -var ErrorCodeTest3 = Register("test.errors", ErrorDescriptor{ - Value: "TEST3", - Message: "Sorry %q isn't valid", - Description: `Just a test message #3.`, - HTTPStatusCode: http.StatusNotFound, -}) - -// TestErrorCodes ensures that error code format, mappings and -// marshaling/unmarshaling. round trips are stable. -func TestErrorCodes(t *testing.T) { - if len(errorCodeToDescriptors) == 0 { - t.Fatal("errors aren't loaded!") - } - - for ec, desc := range errorCodeToDescriptors { - if ec != desc.Code { - t.Fatalf("error code in descriptor isn't correct, %q != %q", ec, desc.Code) - } - - if idToDescriptors[desc.Value].Code != ec { - t.Fatalf("error code in idToDesc isn't correct, %q != %q", idToDescriptors[desc.Value].Code, ec) - } - - if ec.Message() != desc.Message { - t.Fatalf("ec.Message doesn't mtach desc.Message: %q != %q", ec.Message(), desc.Message) - } - - // Test (de)serializing the ErrorCode - p, err := json.Marshal(ec) - if err != nil { - t.Fatalf("couldn't marshal ec %v: %v", ec, err) - } - - if len(p) <= 0 { - t.Fatalf("expected content in marshaled before for error code %v", ec) - } - - // First, unmarshal to interface and ensure we have a string. - var ecUnspecified interface{} - if err := json.Unmarshal(p, &ecUnspecified); err != nil { - t.Fatalf("error unmarshaling error code %v: %v", ec, err) - } - - if _, ok := ecUnspecified.(string); !ok { - t.Fatalf("expected a string for error code %v on unmarshal got a %T", ec, ecUnspecified) - } - - // Now, unmarshal with the error code type and ensure they are equal - var ecUnmarshaled ErrorCode - if err := json.Unmarshal(p, &ecUnmarshaled); err != nil { - t.Fatalf("error unmarshaling error code %v: %v", ec, err) - } - - if ecUnmarshaled != ec { - t.Fatalf("unexpected error code during error code marshal/unmarshal: %v != %v", ecUnmarshaled, ec) - } - - expectedErrorString := strings.ToLower(strings.Replace(ec.Descriptor().Value, "_", " ", -1)) - if ec.Error() != expectedErrorString { - t.Fatalf("unexpected return from %v.Error(): %q != %q", ec, ec.Error(), expectedErrorString) - } - } - -} - -func TestErrorsManagement(t *testing.T) { - var errs Errors - - errs = append(errs, ErrorCodeTest1) - errs = append(errs, ErrorCodeTest2.WithDetail( - map[string]interface{}{"digest": "sometestblobsumdoesntmatter"})) - errs = append(errs, ErrorCodeTest3.WithArgs("BOOGIE")) - errs = append(errs, ErrorCodeTest3.WithArgs("BOOGIE").WithDetail("data")) - - p, err := json.Marshal(errs) - - if err != nil { - t.Fatalf("error marashaling errors: %v", err) - } - - expectedJSON := `{"errors":[` + - `{"code":"TEST1","message":"test error 1"},` + - `{"code":"TEST2","message":"test error 2","detail":{"digest":"sometestblobsumdoesntmatter"}},` + - `{"code":"TEST3","message":"Sorry \"BOOGIE\" isn't valid"},` + - `{"code":"TEST3","message":"Sorry \"BOOGIE\" isn't valid","detail":"data"}` + - `]}` - - if string(p) != expectedJSON { - t.Fatalf("unexpected json:\ngot:\n%q\n\nexpected:\n%q", string(p), expectedJSON) - } - - // Now test the reverse - var unmarshaled Errors - if err := json.Unmarshal(p, &unmarshaled); err != nil { - t.Fatalf("unexpected error unmarshaling error envelope: %v", err) - } - - if !reflect.DeepEqual(unmarshaled, errs) { - t.Fatalf("errors not equal after round trip:\nunmarshaled:\n%#v\n\nerrs:\n%#v", unmarshaled, errs) - } - - // Test the arg substitution stuff - e1 := unmarshaled[3].(Error) - exp1 := `Sorry "BOOGIE" isn't valid` - if e1.Message != exp1 { - t.Fatalf("Wrong msg, got:\n%q\n\nexpected:\n%q", e1.Message, exp1) - } - - exp1 = "test3: " + exp1 - if e1.Error() != exp1 { - t.Fatalf("Error() didn't return the right string, got:%s\nexpected:%s", e1.Error(), exp1) - } - - // Test again with a single value this time - errs = Errors{ErrorCodeUnknown} - expectedJSON = "{\"errors\":[{\"code\":\"UNKNOWN\",\"message\":\"unknown error\"}]}" - p, err = json.Marshal(errs) - - if err != nil { - t.Fatalf("error marashaling errors: %v", err) - } - - if string(p) != expectedJSON { - t.Fatalf("unexpected json: %q != %q", string(p), expectedJSON) - } - - // Now test the reverse - unmarshaled = nil - if err := json.Unmarshal(p, &unmarshaled); err != nil { - t.Fatalf("unexpected error unmarshaling error envelope: %v", err) - } - - if !reflect.DeepEqual(unmarshaled, errs) { - t.Fatalf("errors not equal after round trip:\nunmarshaled:\n%#v\n\nerrs:\n%#v", unmarshaled, errs) - } - - // Verify that calling WithArgs() more than once does the right thing. - // Meaning creates a new Error and uses the ErrorCode Message - e1 = ErrorCodeTest3.WithArgs("test1") - e2 := e1.WithArgs("test2") - if &e1 == &e2 { - t.Fatalf("args: e2 and e1 should not be the same, but they are") - } - if e2.Message != `Sorry "test2" isn't valid` { - t.Fatalf("e2 had wrong message: %q", e2.Message) - } - - // Verify that calling WithDetail() more than once does the right thing. - // Meaning creates a new Error and overwrites the old detail field - e1 = ErrorCodeTest3.WithDetail("stuff1") - e2 = e1.WithDetail("stuff2") - if &e1 == &e2 { - t.Fatalf("detail: e2 and e1 should not be the same, but they are") - } - if e2.Detail != `stuff2` { - t.Fatalf("e2 had wrong detail: %q", e2.Detail) - } - -} diff --git a/vendor/github.com/docker/distribution/registry/api/errcode/handler.go b/vendor/github.com/docker/distribution/registry/api/errcode/handler.go deleted file mode 100644 index 49a64a86e..000000000 --- a/vendor/github.com/docker/distribution/registry/api/errcode/handler.go +++ /dev/null @@ -1,44 +0,0 @@ -package errcode - -import ( - "encoding/json" - "net/http" -) - -// ServeJSON attempts to serve the errcode in a JSON envelope. It marshals err -// and sets the content-type header to 'application/json'. It will handle -// ErrorCoder and Errors, and if necessary will create an envelope. -func ServeJSON(w http.ResponseWriter, err error) error { - w.Header().Set("Content-Type", "application/json; charset=utf-8") - var sc int - - switch errs := err.(type) { - case Errors: - if len(errs) < 1 { - break - } - - if err, ok := errs[0].(ErrorCoder); ok { - sc = err.ErrorCode().Descriptor().HTTPStatusCode - } - case ErrorCoder: - sc = errs.ErrorCode().Descriptor().HTTPStatusCode - err = Errors{err} // create an envelope. - default: - // We just have an unhandled error type, so just place in an envelope - // and move along. - err = Errors{err} - } - - if sc == 0 { - sc = http.StatusInternalServerError - } - - w.WriteHeader(sc) - - if err := json.NewEncoder(w).Encode(err); err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/api/errcode/register.go b/vendor/github.com/docker/distribution/registry/api/errcode/register.go deleted file mode 100644 index d1e8826c6..000000000 --- a/vendor/github.com/docker/distribution/registry/api/errcode/register.go +++ /dev/null @@ -1,138 +0,0 @@ -package errcode - -import ( - "fmt" - "net/http" - "sort" - "sync" -) - -var ( - errorCodeToDescriptors = map[ErrorCode]ErrorDescriptor{} - idToDescriptors = map[string]ErrorDescriptor{} - groupToDescriptors = map[string][]ErrorDescriptor{} -) - -var ( - // ErrorCodeUnknown is a generic error that can be used as a last - // resort if there is no situation-specific error message that can be used - ErrorCodeUnknown = Register("errcode", ErrorDescriptor{ - Value: "UNKNOWN", - Message: "unknown error", - Description: `Generic error returned when the error does not have an - API classification.`, - HTTPStatusCode: http.StatusInternalServerError, - }) - - // ErrorCodeUnsupported is returned when an operation is not supported. - ErrorCodeUnsupported = Register("errcode", ErrorDescriptor{ - Value: "UNSUPPORTED", - Message: "The operation is unsupported.", - Description: `The operation was unsupported due to a missing - implementation or invalid set of parameters.`, - HTTPStatusCode: http.StatusMethodNotAllowed, - }) - - // ErrorCodeUnauthorized is returned if a request requires - // authentication. - ErrorCodeUnauthorized = Register("errcode", ErrorDescriptor{ - Value: "UNAUTHORIZED", - Message: "authentication required", - Description: `The access controller was unable to authenticate - the client. Often this will be accompanied by a - Www-Authenticate HTTP response header indicating how to - authenticate.`, - HTTPStatusCode: http.StatusUnauthorized, - }) - - // ErrorCodeDenied is returned if a client does not have sufficient - // permission to perform an action. - ErrorCodeDenied = Register("errcode", ErrorDescriptor{ - Value: "DENIED", - Message: "requested access to the resource is denied", - Description: `The access controller denied access for the - operation on a resource.`, - HTTPStatusCode: http.StatusForbidden, - }) - - // ErrorCodeUnavailable provides a common error to report unavailability - // of a service or endpoint. - ErrorCodeUnavailable = Register("errcode", ErrorDescriptor{ - Value: "UNAVAILABLE", - Message: "service unavailable", - Description: "Returned when a service is not available", - HTTPStatusCode: http.StatusServiceUnavailable, - }) - - // ErrorCodeTooManyRequests is returned if a client attempts too many - // times to contact a service endpoint. - ErrorCodeTooManyRequests = Register("errcode", ErrorDescriptor{ - Value: "TOOMANYREQUESTS", - Message: "too many requests", - Description: `Returned when a client attempts to contact a - service too many times`, - HTTPStatusCode: http.StatusTooManyRequests, - }) -) - -var nextCode = 1000 -var registerLock sync.Mutex - -// Register will make the passed-in error known to the environment and -// return a new ErrorCode -func Register(group string, descriptor ErrorDescriptor) ErrorCode { - registerLock.Lock() - defer registerLock.Unlock() - - descriptor.Code = ErrorCode(nextCode) - - if _, ok := idToDescriptors[descriptor.Value]; ok { - panic(fmt.Sprintf("ErrorValue %q is already registered", descriptor.Value)) - } - if _, ok := errorCodeToDescriptors[descriptor.Code]; ok { - panic(fmt.Sprintf("ErrorCode %v is already registered", descriptor.Code)) - } - - groupToDescriptors[group] = append(groupToDescriptors[group], descriptor) - errorCodeToDescriptors[descriptor.Code] = descriptor - idToDescriptors[descriptor.Value] = descriptor - - nextCode++ - return descriptor.Code -} - -type byValue []ErrorDescriptor - -func (a byValue) Len() int { return len(a) } -func (a byValue) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byValue) Less(i, j int) bool { return a[i].Value < a[j].Value } - -// GetGroupNames returns the list of Error group names that are registered -func GetGroupNames() []string { - keys := []string{} - - for k := range groupToDescriptors { - keys = append(keys, k) - } - sort.Strings(keys) - return keys -} - -// GetErrorCodeGroup returns the named group of error descriptors -func GetErrorCodeGroup(name string) []ErrorDescriptor { - desc := groupToDescriptors[name] - sort.Sort(byValue(desc)) - return desc -} - -// GetErrorAllDescriptors returns a slice of all ErrorDescriptors that are -// registered, irrespective of what group they're in -func GetErrorAllDescriptors() []ErrorDescriptor { - result := []ErrorDescriptor{} - - for _, group := range GetGroupNames() { - result = append(result, GetErrorCodeGroup(group)...) - } - sort.Sort(byValue(result)) - return result -} diff --git a/vendor/github.com/docker/distribution/registry/api/v2/descriptors.go b/vendor/github.com/docker/distribution/registry/api/v2/descriptors.go deleted file mode 100644 index 9979abae6..000000000 --- a/vendor/github.com/docker/distribution/registry/api/v2/descriptors.go +++ /dev/null @@ -1,1596 +0,0 @@ -package v2 - -import ( - "net/http" - "regexp" - - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/api/errcode" -) - -var ( - nameParameterDescriptor = ParameterDescriptor{ - Name: "name", - Type: "string", - Format: reference.NameRegexp.String(), - Required: true, - Description: `Name of the target repository.`, - } - - referenceParameterDescriptor = ParameterDescriptor{ - Name: "reference", - Type: "string", - Format: reference.TagRegexp.String(), - Required: true, - Description: `Tag or digest of the target manifest.`, - } - - uuidParameterDescriptor = ParameterDescriptor{ - Name: "uuid", - Type: "opaque", - Required: true, - Description: "A uuid identifying the upload. This field can accept characters that match `[a-zA-Z0-9-_.=]+`.", - } - - digestPathParameter = ParameterDescriptor{ - Name: "digest", - Type: "path", - Required: true, - Format: digest.DigestRegexp.String(), - Description: `Digest of desired blob.`, - } - - hostHeader = ParameterDescriptor{ - Name: "Host", - Type: "string", - Description: "Standard HTTP Host Header. Should be set to the registry host.", - Format: "", - Examples: []string{"registry-1.docker.io"}, - } - - authHeader = ParameterDescriptor{ - Name: "Authorization", - Type: "string", - Description: "An RFC7235 compliant authorization header.", - Format: " ", - Examples: []string{"Bearer dGhpcyBpcyBhIGZha2UgYmVhcmVyIHRva2VuIQ=="}, - } - - authChallengeHeader = ParameterDescriptor{ - Name: "WWW-Authenticate", - Type: "string", - Description: "An RFC7235 compliant authentication challenge header.", - Format: ` realm="", ..."`, - Examples: []string{ - `Bearer realm="https://auth.docker.com/", service="registry.docker.com", scopes="repository:library/ubuntu:pull"`, - }, - } - - contentLengthZeroHeader = ParameterDescriptor{ - Name: "Content-Length", - Description: "The `Content-Length` header must be zero and the body must be empty.", - Type: "integer", - Format: "0", - } - - dockerUploadUUIDHeader = ParameterDescriptor{ - Name: "Docker-Upload-UUID", - Description: "Identifies the docker upload uuid for the current request.", - Type: "uuid", - Format: "", - } - - digestHeader = ParameterDescriptor{ - Name: "Docker-Content-Digest", - Description: "Digest of the targeted content for the request.", - Type: "digest", - Format: "", - } - - linkHeader = ParameterDescriptor{ - Name: "Link", - Type: "link", - Description: "RFC5988 compliant rel='next' with URL to next result set, if available", - Format: `<?n=&last=>; rel="next"`, - } - - paginationParameters = []ParameterDescriptor{ - { - Name: "n", - Type: "integer", - Description: "Limit the number of entries in each response. It not present, all entries will be returned.", - Format: "", - Required: false, - }, - { - Name: "last", - Type: "string", - Description: "Result set will include values lexically after last.", - Format: "", - Required: false, - }, - } - - unauthorizedResponseDescriptor = ResponseDescriptor{ - Name: "Authentication Required", - StatusCode: http.StatusUnauthorized, - Description: "The client is not authenticated.", - Headers: []ParameterDescriptor{ - authChallengeHeader, - { - Name: "Content-Length", - Type: "integer", - Description: "Length of the JSON response body.", - Format: "", - }, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - ErrorCodes: []errcode.ErrorCode{ - errcode.ErrorCodeUnauthorized, - }, - } - - repositoryNotFoundResponseDescriptor = ResponseDescriptor{ - Name: "No Such Repository Error", - StatusCode: http.StatusNotFound, - Description: "The repository is not known to the registry.", - Headers: []ParameterDescriptor{ - { - Name: "Content-Length", - Type: "integer", - Description: "Length of the JSON response body.", - Format: "", - }, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeNameUnknown, - }, - } - - deniedResponseDescriptor = ResponseDescriptor{ - Name: "Access Denied", - StatusCode: http.StatusForbidden, - Description: "The client does not have required access to the repository.", - Headers: []ParameterDescriptor{ - { - Name: "Content-Length", - Type: "integer", - Description: "Length of the JSON response body.", - Format: "", - }, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - ErrorCodes: []errcode.ErrorCode{ - errcode.ErrorCodeDenied, - }, - } - - tooManyRequestsDescriptor = ResponseDescriptor{ - Name: "Too Many Requests", - StatusCode: http.StatusTooManyRequests, - Description: "The client made too many requests within a time interval.", - Headers: []ParameterDescriptor{ - { - Name: "Content-Length", - Type: "integer", - Description: "Length of the JSON response body.", - Format: "", - }, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - ErrorCodes: []errcode.ErrorCode{ - errcode.ErrorCodeTooManyRequests, - }, - } -) - -const ( - manifestBody = `{ - "name": , - "tag": , - "fsLayers": [ - { - "blobSum": "" - }, - ... - ] - ], - "history": , - "signature": -}` - - errorsBody = `{ - "errors:" [ - { - "code": , - "message": "", - "detail": ... - }, - ... - ] -}` -) - -// APIDescriptor exports descriptions of the layout of the v2 registry API. -var APIDescriptor = struct { - // RouteDescriptors provides a list of the routes available in the API. - RouteDescriptors []RouteDescriptor -}{ - RouteDescriptors: routeDescriptors, -} - -// RouteDescriptor describes a route specified by name. -type RouteDescriptor struct { - // Name is the name of the route, as specified in RouteNameXXX exports. - // These names a should be considered a unique reference for a route. If - // the route is registered with gorilla, this is the name that will be - // used. - Name string - - // Path is a gorilla/mux-compatible regexp that can be used to match the - // route. For any incoming method and path, only one route descriptor - // should match. - Path string - - // Entity should be a short, human-readalbe description of the object - // targeted by the endpoint. - Entity string - - // Description should provide an accurate overview of the functionality - // provided by the route. - Description string - - // Methods should describe the various HTTP methods that may be used on - // this route, including request and response formats. - Methods []MethodDescriptor -} - -// MethodDescriptor provides a description of the requests that may be -// conducted with the target method. -type MethodDescriptor struct { - - // Method is an HTTP method, such as GET, PUT or POST. - Method string - - // Description should provide an overview of the functionality provided by - // the covered method, suitable for use in documentation. Use of markdown - // here is encouraged. - Description string - - // Requests is a slice of request descriptors enumerating how this - // endpoint may be used. - Requests []RequestDescriptor -} - -// RequestDescriptor covers a particular set of headers and parameters that -// can be carried out with the parent method. Its most helpful to have one -// RequestDescriptor per API use case. -type RequestDescriptor struct { - // Name provides a short identifier for the request, usable as a title or - // to provide quick context for the particular request. - Name string - - // Description should cover the requests purpose, covering any details for - // this particular use case. - Description string - - // Headers describes headers that must be used with the HTTP request. - Headers []ParameterDescriptor - - // PathParameters enumerate the parameterized path components for the - // given request, as defined in the route's regular expression. - PathParameters []ParameterDescriptor - - // QueryParameters provides a list of query parameters for the given - // request. - QueryParameters []ParameterDescriptor - - // Body describes the format of the request body. - Body BodyDescriptor - - // Successes enumerates the possible responses that are considered to be - // the result of a successful request. - Successes []ResponseDescriptor - - // Failures covers the possible failures from this particular request. - Failures []ResponseDescriptor -} - -// ResponseDescriptor describes the components of an API response. -type ResponseDescriptor struct { - // Name provides a short identifier for the response, usable as a title or - // to provide quick context for the particular response. - Name string - - // Description should provide a brief overview of the role of the - // response. - Description string - - // StatusCode specifies the status received by this particular response. - StatusCode int - - // Headers covers any headers that may be returned from the response. - Headers []ParameterDescriptor - - // Fields describes any fields that may be present in the response. - Fields []ParameterDescriptor - - // ErrorCodes enumerates the error codes that may be returned along with - // the response. - ErrorCodes []errcode.ErrorCode - - // Body describes the body of the response, if any. - Body BodyDescriptor -} - -// BodyDescriptor describes a request body and its expected content type. For -// the most part, it should be example json or some placeholder for body -// data in documentation. -type BodyDescriptor struct { - ContentType string - Format string -} - -// ParameterDescriptor describes the format of a request parameter, which may -// be a header, path parameter or query parameter. -type ParameterDescriptor struct { - // Name is the name of the parameter, either of the path component or - // query parameter. - Name string - - // Type specifies the type of the parameter, such as string, integer, etc. - Type string - - // Description provides a human-readable description of the parameter. - Description string - - // Required means the field is required when set. - Required bool - - // Format is a specifying the string format accepted by this parameter. - Format string - - // Regexp is a compiled regular expression that can be used to validate - // the contents of the parameter. - Regexp *regexp.Regexp - - // Examples provides multiple examples for the values that might be valid - // for this parameter. - Examples []string -} - -var routeDescriptors = []RouteDescriptor{ - { - Name: RouteNameBase, - Path: "/v2/", - Entity: "Base", - Description: `Base V2 API route. Typically, this can be used for lightweight version checks and to validate registry authentication.`, - Methods: []MethodDescriptor{ - { - Method: "GET", - Description: "Check that the endpoint implements Docker Registry API V2.", - Requests: []RequestDescriptor{ - { - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - }, - Successes: []ResponseDescriptor{ - { - Description: "The API implements V2 protocol and is accessible.", - StatusCode: http.StatusOK, - }, - }, - Failures: []ResponseDescriptor{ - { - Description: "The registry does not implement the V2 API.", - StatusCode: http.StatusNotFound, - }, - unauthorizedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - }, - }, - }, - }, - { - Name: RouteNameTags, - Path: "/v2/{name:" + reference.NameRegexp.String() + "}/tags/list", - Entity: "Tags", - Description: "Retrieve information about tags.", - Methods: []MethodDescriptor{ - { - Method: "GET", - Description: "Fetch the tags under the repository identified by `name`.", - Requests: []RequestDescriptor{ - { - Name: "Tags", - Description: "Return all tags for the repository", - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - }, - Successes: []ResponseDescriptor{ - { - StatusCode: http.StatusOK, - Description: "A list of tags for the named repository.", - Headers: []ParameterDescriptor{ - { - Name: "Content-Length", - Type: "integer", - Description: "Length of the JSON response body.", - Format: "", - }, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: `{ - "name": , - "tags": [ - , - ... - ] -}`, - }, - }, - }, - Failures: []ResponseDescriptor{ - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - { - Name: "Tags Paginated", - Description: "Return a portion of the tags for the specified repository.", - PathParameters: []ParameterDescriptor{nameParameterDescriptor}, - QueryParameters: paginationParameters, - Successes: []ResponseDescriptor{ - { - StatusCode: http.StatusOK, - Description: "A list of tags for the named repository.", - Headers: []ParameterDescriptor{ - { - Name: "Content-Length", - Type: "integer", - Description: "Length of the JSON response body.", - Format: "", - }, - linkHeader, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: `{ - "name": , - "tags": [ - , - ... - ], -}`, - }, - }, - }, - Failures: []ResponseDescriptor{ - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - }, - }, - }, - }, - { - Name: RouteNameManifest, - Path: "/v2/{name:" + reference.NameRegexp.String() + "}/manifests/{reference:" + reference.TagRegexp.String() + "|" + digest.DigestRegexp.String() + "}", - Entity: "Manifest", - Description: "Create, update, delete and retrieve manifests.", - Methods: []MethodDescriptor{ - { - Method: "GET", - Description: "Fetch the manifest identified by `name` and `reference` where `reference` can be a tag or digest. A `HEAD` request can also be issued to this endpoint to obtain resource information without receiving all data.", - Requests: []RequestDescriptor{ - { - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - referenceParameterDescriptor, - }, - Successes: []ResponseDescriptor{ - { - Description: "The manifest identified by `name` and `reference`. The contents can be used to identify and resolve resources required to run the specified image.", - StatusCode: http.StatusOK, - Headers: []ParameterDescriptor{ - digestHeader, - }, - Body: BodyDescriptor{ - ContentType: "", - Format: manifestBody, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Description: "The name or reference was invalid.", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeNameInvalid, - ErrorCodeTagInvalid, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - }, - }, - { - Method: "PUT", - Description: "Put the manifest identified by `name` and `reference` where `reference` can be a tag or digest.", - Requests: []RequestDescriptor{ - { - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - referenceParameterDescriptor, - }, - Body: BodyDescriptor{ - ContentType: "", - Format: manifestBody, - }, - Successes: []ResponseDescriptor{ - { - Description: "The manifest has been accepted by the registry and is stored under the specified `name` and `tag`.", - StatusCode: http.StatusCreated, - Headers: []ParameterDescriptor{ - { - Name: "Location", - Type: "url", - Description: "The canonical location url of the uploaded manifest.", - Format: "", - }, - contentLengthZeroHeader, - digestHeader, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Name: "Invalid Manifest", - Description: "The received manifest was invalid in some way, as described by the error codes. The client should resolve the issue and retry the request.", - StatusCode: http.StatusBadRequest, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeNameInvalid, - ErrorCodeTagInvalid, - ErrorCodeManifestInvalid, - ErrorCodeManifestUnverified, - ErrorCodeBlobUnknown, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - { - Name: "Missing Layer(s)", - Description: "One or more layers may be missing during a manifest upload. If so, the missing layers will be enumerated in the error response.", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeBlobUnknown, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: `{ - "errors:" [{ - "code": "BLOB_UNKNOWN", - "message": "blob unknown to registry", - "detail": { - "digest": "" - } - }, - ... - ] -}`, - }, - }, - { - Name: "Not allowed", - Description: "Manifest put is not allowed because the registry is configured as a pull-through cache or for some other reason", - StatusCode: http.StatusMethodNotAllowed, - ErrorCodes: []errcode.ErrorCode{ - errcode.ErrorCodeUnsupported, - }, - }, - }, - }, - }, - }, - { - Method: "DELETE", - Description: "Delete the manifest identified by `name` and `reference`. Note that a manifest can _only_ be deleted by `digest`.", - Requests: []RequestDescriptor{ - { - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - referenceParameterDescriptor, - }, - Successes: []ResponseDescriptor{ - { - StatusCode: http.StatusAccepted, - }, - }, - Failures: []ResponseDescriptor{ - { - Name: "Invalid Name or Reference", - Description: "The specified `name` or `reference` were invalid and the delete was unable to proceed.", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeNameInvalid, - ErrorCodeTagInvalid, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - { - Name: "Unknown Manifest", - Description: "The specified `name` or `reference` are unknown to the registry and the delete was unable to proceed. Clients can assume the manifest was already deleted if this response is returned.", - StatusCode: http.StatusNotFound, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeNameUnknown, - ErrorCodeManifestUnknown, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - { - Name: "Not allowed", - Description: "Manifest delete is not allowed because the registry is configured as a pull-through cache or `delete` has been disabled.", - StatusCode: http.StatusMethodNotAllowed, - ErrorCodes: []errcode.ErrorCode{ - errcode.ErrorCodeUnsupported, - }, - }, - }, - }, - }, - }, - }, - }, - - { - Name: RouteNameBlob, - Path: "/v2/{name:" + reference.NameRegexp.String() + "}/blobs/{digest:" + digest.DigestRegexp.String() + "}", - Entity: "Blob", - Description: "Operations on blobs identified by `name` and `digest`. Used to fetch or delete layers by digest.", - Methods: []MethodDescriptor{ - { - Method: "GET", - Description: "Retrieve the blob from the registry identified by `digest`. A `HEAD` request can also be issued to this endpoint to obtain resource information without receiving all data.", - Requests: []RequestDescriptor{ - { - Name: "Fetch Blob", - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - digestPathParameter, - }, - Successes: []ResponseDescriptor{ - { - Description: "The blob identified by `digest` is available. The blob content will be present in the body of the request.", - StatusCode: http.StatusOK, - Headers: []ParameterDescriptor{ - { - Name: "Content-Length", - Type: "integer", - Description: "The length of the requested blob content.", - Format: "", - }, - digestHeader, - }, - Body: BodyDescriptor{ - ContentType: "application/octet-stream", - Format: "", - }, - }, - { - Description: "The blob identified by `digest` is available at the provided location.", - StatusCode: http.StatusTemporaryRedirect, - Headers: []ParameterDescriptor{ - { - Name: "Location", - Type: "url", - Description: "The location where the layer should be accessible.", - Format: "", - }, - digestHeader, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Description: "There was a problem with the request that needs to be addressed by the client, such as an invalid `name` or `tag`.", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeNameInvalid, - ErrorCodeDigestInvalid, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - { - Description: "The blob, identified by `name` and `digest`, is unknown to the registry.", - StatusCode: http.StatusNotFound, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeNameUnknown, - ErrorCodeBlobUnknown, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - { - Name: "Fetch Blob Part", - Description: "This endpoint may also support RFC7233 compliant range requests. Support can be detected by issuing a HEAD request. If the header `Accept-Range: bytes` is returned, range requests can be used to fetch partial content.", - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - { - Name: "Range", - Type: "string", - Description: "HTTP Range header specifying blob chunk.", - Format: "bytes=-", - }, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - digestPathParameter, - }, - Successes: []ResponseDescriptor{ - { - Description: "The blob identified by `digest` is available. The specified chunk of blob content will be present in the body of the request.", - StatusCode: http.StatusPartialContent, - Headers: []ParameterDescriptor{ - { - Name: "Content-Length", - Type: "integer", - Description: "The length of the requested blob chunk.", - Format: "", - }, - { - Name: "Content-Range", - Type: "byte range", - Description: "Content range of blob chunk.", - Format: "bytes -/", - }, - }, - Body: BodyDescriptor{ - ContentType: "application/octet-stream", - Format: "", - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Description: "There was a problem with the request that needs to be addressed by the client, such as an invalid `name` or `tag`.", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeNameInvalid, - ErrorCodeDigestInvalid, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - { - StatusCode: http.StatusNotFound, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeNameUnknown, - ErrorCodeBlobUnknown, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - { - Description: "The range specification cannot be satisfied for the requested content. This can happen when the range is not formatted correctly or if the range is outside of the valid size of the content.", - StatusCode: http.StatusRequestedRangeNotSatisfiable, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - }, - }, - { - Method: "DELETE", - Description: "Delete the blob identified by `name` and `digest`", - Requests: []RequestDescriptor{ - { - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - digestPathParameter, - }, - Successes: []ResponseDescriptor{ - { - StatusCode: http.StatusAccepted, - Headers: []ParameterDescriptor{ - { - Name: "Content-Length", - Type: "integer", - Description: "0", - Format: "0", - }, - digestHeader, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Name: "Invalid Name or Digest", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeDigestInvalid, - ErrorCodeNameInvalid, - }, - }, - { - Description: "The blob, identified by `name` and `digest`, is unknown to the registry.", - StatusCode: http.StatusNotFound, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeNameUnknown, - ErrorCodeBlobUnknown, - }, - }, - { - Description: "Blob delete is not allowed because the registry is configured as a pull-through cache or `delete` has been disabled", - StatusCode: http.StatusMethodNotAllowed, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - ErrorCodes: []errcode.ErrorCode{ - errcode.ErrorCodeUnsupported, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - }, - }, - - // TODO(stevvooe): We may want to add a PUT request here to - // kickoff an upload of a blob, integrated with the blob upload - // API. - }, - }, - - { - Name: RouteNameBlobUpload, - Path: "/v2/{name:" + reference.NameRegexp.String() + "}/blobs/uploads/", - Entity: "Initiate Blob Upload", - Description: "Initiate a blob upload. This endpoint can be used to create resumable uploads or monolithic uploads.", - Methods: []MethodDescriptor{ - { - Method: "POST", - Description: "Initiate a resumable blob upload. If successful, an upload location will be provided to complete the upload. Optionally, if the `digest` parameter is present, the request body will be used to complete the upload in a single request.", - Requests: []RequestDescriptor{ - { - Name: "Initiate Monolithic Blob Upload", - Description: "Upload a blob identified by the `digest` parameter in single request. This upload will not be resumable unless a recoverable error is returned.", - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - { - Name: "Content-Length", - Type: "integer", - Format: "", - }, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - }, - QueryParameters: []ParameterDescriptor{ - { - Name: "digest", - Type: "query", - Format: "", - Regexp: digest.DigestRegexp, - Description: `Digest of uploaded blob. If present, the upload will be completed, in a single request, with contents of the request body as the resulting blob.`, - }, - }, - Body: BodyDescriptor{ - ContentType: "application/octect-stream", - Format: "", - }, - Successes: []ResponseDescriptor{ - { - Description: "The blob has been created in the registry and is available at the provided location.", - StatusCode: http.StatusCreated, - Headers: []ParameterDescriptor{ - { - Name: "Location", - Type: "url", - Format: "", - }, - contentLengthZeroHeader, - dockerUploadUUIDHeader, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Name: "Invalid Name or Digest", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeDigestInvalid, - ErrorCodeNameInvalid, - }, - }, - { - Name: "Not allowed", - Description: "Blob upload is not allowed because the registry is configured as a pull-through cache or for some other reason", - StatusCode: http.StatusMethodNotAllowed, - ErrorCodes: []errcode.ErrorCode{ - errcode.ErrorCodeUnsupported, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - { - Name: "Initiate Resumable Blob Upload", - Description: "Initiate a resumable blob upload with an empty request body.", - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - contentLengthZeroHeader, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - }, - Successes: []ResponseDescriptor{ - { - Description: "The upload has been created. The `Location` header must be used to complete the upload. The response should be identical to a `GET` request on the contents of the returned `Location` header.", - StatusCode: http.StatusAccepted, - Headers: []ParameterDescriptor{ - contentLengthZeroHeader, - { - Name: "Location", - Type: "url", - Format: "/v2//blobs/uploads/", - Description: "The location of the created upload. Clients should use the contents verbatim to complete the upload, adding parameters where required.", - }, - { - Name: "Range", - Format: "0-0", - Description: "Range header indicating the progress of the upload. When starting an upload, it will return an empty range, since no content has been received.", - }, - dockerUploadUUIDHeader, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Name: "Invalid Name or Digest", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeDigestInvalid, - ErrorCodeNameInvalid, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - { - Name: "Mount Blob", - Description: "Mount a blob identified by the `mount` parameter from another repository.", - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - contentLengthZeroHeader, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - }, - QueryParameters: []ParameterDescriptor{ - { - Name: "mount", - Type: "query", - Format: "", - Regexp: digest.DigestRegexp, - Description: `Digest of blob to mount from the source repository.`, - }, - { - Name: "from", - Type: "query", - Format: "", - Regexp: reference.NameRegexp, - Description: `Name of the source repository.`, - }, - }, - Successes: []ResponseDescriptor{ - { - Description: "The blob has been mounted in the repository and is available at the provided location.", - StatusCode: http.StatusCreated, - Headers: []ParameterDescriptor{ - { - Name: "Location", - Type: "url", - Format: "", - }, - contentLengthZeroHeader, - dockerUploadUUIDHeader, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Name: "Invalid Name or Digest", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeDigestInvalid, - ErrorCodeNameInvalid, - }, - }, - { - Name: "Not allowed", - Description: "Blob mount is not allowed because the registry is configured as a pull-through cache or for some other reason", - StatusCode: http.StatusMethodNotAllowed, - ErrorCodes: []errcode.ErrorCode{ - errcode.ErrorCodeUnsupported, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - }, - }, - }, - }, - - { - Name: RouteNameBlobUploadChunk, - Path: "/v2/{name:" + reference.NameRegexp.String() + "}/blobs/uploads/{uuid:[a-zA-Z0-9-_.=]+}", - Entity: "Blob Upload", - Description: "Interact with blob uploads. Clients should never assemble URLs for this endpoint and should only take it through the `Location` header on related API requests. The `Location` header and its parameters should be preserved by clients, using the latest value returned via upload related API calls.", - Methods: []MethodDescriptor{ - { - Method: "GET", - Description: "Retrieve status of upload identified by `uuid`. The primary purpose of this endpoint is to resolve the current status of a resumable upload.", - Requests: []RequestDescriptor{ - { - Description: "Retrieve the progress of the current upload, as reported by the `Range` header.", - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - uuidParameterDescriptor, - }, - Successes: []ResponseDescriptor{ - { - Name: "Upload Progress", - Description: "The upload is known and in progress. The last received offset is available in the `Range` header.", - StatusCode: http.StatusNoContent, - Headers: []ParameterDescriptor{ - { - Name: "Range", - Type: "header", - Format: "0-", - Description: "Range indicating the current progress of the upload.", - }, - contentLengthZeroHeader, - dockerUploadUUIDHeader, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Description: "There was an error processing the upload and it must be restarted.", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeDigestInvalid, - ErrorCodeNameInvalid, - ErrorCodeBlobUploadInvalid, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - { - Description: "The upload is unknown to the registry. The upload must be restarted.", - StatusCode: http.StatusNotFound, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeBlobUploadUnknown, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - }, - }, - { - Method: "PATCH", - Description: "Upload a chunk of data for the specified upload.", - Requests: []RequestDescriptor{ - { - Name: "Stream upload", - Description: "Upload a stream of data to upload without completing the upload.", - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - uuidParameterDescriptor, - }, - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - }, - Body: BodyDescriptor{ - ContentType: "application/octet-stream", - Format: "", - }, - Successes: []ResponseDescriptor{ - { - Name: "Data Accepted", - Description: "The stream of data has been accepted and the current progress is available in the range header. The updated upload location is available in the `Location` header.", - StatusCode: http.StatusNoContent, - Headers: []ParameterDescriptor{ - { - Name: "Location", - Type: "url", - Format: "/v2//blobs/uploads/", - Description: "The location of the upload. Clients should assume this changes after each request. Clients should use the contents verbatim to complete the upload, adding parameters where required.", - }, - { - Name: "Range", - Type: "header", - Format: "0-", - Description: "Range indicating the current progress of the upload.", - }, - contentLengthZeroHeader, - dockerUploadUUIDHeader, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Description: "There was an error processing the upload and it must be restarted.", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeDigestInvalid, - ErrorCodeNameInvalid, - ErrorCodeBlobUploadInvalid, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - { - Description: "The upload is unknown to the registry. The upload must be restarted.", - StatusCode: http.StatusNotFound, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeBlobUploadUnknown, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - { - Name: "Chunked upload", - Description: "Upload a chunk of data to specified upload without completing the upload. The data will be uploaded to the specified Content Range.", - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - uuidParameterDescriptor, - }, - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - { - Name: "Content-Range", - Type: "header", - Format: "-", - Required: true, - Description: "Range of bytes identifying the desired block of content represented by the body. Start must the end offset retrieved via status check plus one. Note that this is a non-standard use of the `Content-Range` header.", - }, - { - Name: "Content-Length", - Type: "integer", - Format: "", - Description: "Length of the chunk being uploaded, corresponding the length of the request body.", - }, - }, - Body: BodyDescriptor{ - ContentType: "application/octet-stream", - Format: "", - }, - Successes: []ResponseDescriptor{ - { - Name: "Chunk Accepted", - Description: "The chunk of data has been accepted and the current progress is available in the range header. The updated upload location is available in the `Location` header.", - StatusCode: http.StatusNoContent, - Headers: []ParameterDescriptor{ - { - Name: "Location", - Type: "url", - Format: "/v2//blobs/uploads/", - Description: "The location of the upload. Clients should assume this changes after each request. Clients should use the contents verbatim to complete the upload, adding parameters where required.", - }, - { - Name: "Range", - Type: "header", - Format: "0-", - Description: "Range indicating the current progress of the upload.", - }, - contentLengthZeroHeader, - dockerUploadUUIDHeader, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Description: "There was an error processing the upload and it must be restarted.", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeDigestInvalid, - ErrorCodeNameInvalid, - ErrorCodeBlobUploadInvalid, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - { - Description: "The upload is unknown to the registry. The upload must be restarted.", - StatusCode: http.StatusNotFound, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeBlobUploadUnknown, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - { - Description: "The `Content-Range` specification cannot be accepted, either because it does not overlap with the current progress or it is invalid.", - StatusCode: http.StatusRequestedRangeNotSatisfiable, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - }, - }, - { - Method: "PUT", - Description: "Complete the upload specified by `uuid`, optionally appending the body as the final chunk.", - Requests: []RequestDescriptor{ - { - Description: "Complete the upload, providing all the data in the body, if necessary. A request without a body will just complete the upload with previously uploaded content.", - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - { - Name: "Content-Length", - Type: "integer", - Format: "", - Description: "Length of the data being uploaded, corresponding to the length of the request body. May be zero if no data is provided.", - }, - }, - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - uuidParameterDescriptor, - }, - QueryParameters: []ParameterDescriptor{ - { - Name: "digest", - Type: "string", - Format: "", - Regexp: digest.DigestRegexp, - Required: true, - Description: `Digest of uploaded blob.`, - }, - }, - Body: BodyDescriptor{ - ContentType: "application/octet-stream", - Format: "", - }, - Successes: []ResponseDescriptor{ - { - Name: "Upload Complete", - Description: "The upload has been completed and accepted by the registry. The canonical location will be available in the `Location` header.", - StatusCode: http.StatusNoContent, - Headers: []ParameterDescriptor{ - { - Name: "Location", - Type: "url", - Format: "", - Description: "The canonical location of the blob for retrieval", - }, - { - Name: "Content-Range", - Type: "header", - Format: "-", - Description: "Range of bytes identifying the desired block of content represented by the body. Start must match the end of offset retrieved via status check. Note that this is a non-standard use of the `Content-Range` header.", - }, - contentLengthZeroHeader, - digestHeader, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Description: "There was an error processing the upload and it must be restarted.", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeDigestInvalid, - ErrorCodeNameInvalid, - ErrorCodeBlobUploadInvalid, - errcode.ErrorCodeUnsupported, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - { - Description: "The upload is unknown to the registry. The upload must be restarted.", - StatusCode: http.StatusNotFound, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeBlobUploadUnknown, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - }, - }, - { - Method: "DELETE", - Description: "Cancel outstanding upload processes, releasing associated resources. If this is not called, the unfinished uploads will eventually timeout.", - Requests: []RequestDescriptor{ - { - Description: "Cancel the upload specified by `uuid`.", - PathParameters: []ParameterDescriptor{ - nameParameterDescriptor, - uuidParameterDescriptor, - }, - Headers: []ParameterDescriptor{ - hostHeader, - authHeader, - contentLengthZeroHeader, - }, - Successes: []ResponseDescriptor{ - { - Name: "Upload Deleted", - Description: "The upload has been successfully deleted.", - StatusCode: http.StatusNoContent, - Headers: []ParameterDescriptor{ - contentLengthZeroHeader, - }, - }, - }, - Failures: []ResponseDescriptor{ - { - Description: "An error was encountered processing the delete. The client may ignore this error.", - StatusCode: http.StatusBadRequest, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeNameInvalid, - ErrorCodeBlobUploadInvalid, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - { - Description: "The upload is unknown to the registry. The client may ignore this error and assume the upload has been deleted.", - StatusCode: http.StatusNotFound, - ErrorCodes: []errcode.ErrorCode{ - ErrorCodeBlobUploadUnknown, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: errorsBody, - }, - }, - unauthorizedResponseDescriptor, - repositoryNotFoundResponseDescriptor, - deniedResponseDescriptor, - tooManyRequestsDescriptor, - }, - }, - }, - }, - }, - }, - { - Name: RouteNameCatalog, - Path: "/v2/_catalog", - Entity: "Catalog", - Description: "List a set of available repositories in the local registry cluster. Does not provide any indication of what may be available upstream. Applications can only determine if a repository is available but not if it is not available.", - Methods: []MethodDescriptor{ - { - Method: "GET", - Description: "Retrieve a sorted, json list of repositories available in the registry.", - Requests: []RequestDescriptor{ - { - Name: "Catalog Fetch", - Description: "Request an unabridged list of repositories available. The implementation may impose a maximum limit and return a partial set with pagination links.", - Successes: []ResponseDescriptor{ - { - Description: "Returns the unabridged list of repositories as a json response.", - StatusCode: http.StatusOK, - Headers: []ParameterDescriptor{ - { - Name: "Content-Length", - Type: "integer", - Description: "Length of the JSON response body.", - Format: "", - }, - }, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: `{ - "repositories": [ - , - ... - ] -}`, - }, - }, - }, - }, - { - Name: "Catalog Fetch Paginated", - Description: "Return the specified portion of repositories.", - QueryParameters: paginationParameters, - Successes: []ResponseDescriptor{ - { - StatusCode: http.StatusOK, - Body: BodyDescriptor{ - ContentType: "application/json; charset=utf-8", - Format: `{ - "repositories": [ - , - ... - ] - "next": "?last=&n=" -}`, - }, - Headers: []ParameterDescriptor{ - { - Name: "Content-Length", - Type: "integer", - Description: "Length of the JSON response body.", - Format: "", - }, - linkHeader, - }, - }, - }, - }, - }, - }, - }, - }, -} - -var routeDescriptorsMap map[string]RouteDescriptor - -func init() { - routeDescriptorsMap = make(map[string]RouteDescriptor, len(routeDescriptors)) - - for _, descriptor := range routeDescriptors { - routeDescriptorsMap[descriptor.Name] = descriptor - } -} diff --git a/vendor/github.com/docker/distribution/registry/api/v2/doc.go b/vendor/github.com/docker/distribution/registry/api/v2/doc.go deleted file mode 100644 index cde011959..000000000 --- a/vendor/github.com/docker/distribution/registry/api/v2/doc.go +++ /dev/null @@ -1,9 +0,0 @@ -// Package v2 describes routes, urls and the error codes used in the Docker -// Registry JSON HTTP API V2. In addition to declarations, descriptors are -// provided for routes and error codes that can be used for implementation and -// automatically generating documentation. -// -// Definitions here are considered to be locked down for the V2 registry api. -// Any changes must be considered carefully and should not proceed without a -// change proposal in docker core. -package v2 diff --git a/vendor/github.com/docker/distribution/registry/api/v2/errors.go b/vendor/github.com/docker/distribution/registry/api/v2/errors.go deleted file mode 100644 index 97d6923aa..000000000 --- a/vendor/github.com/docker/distribution/registry/api/v2/errors.go +++ /dev/null @@ -1,136 +0,0 @@ -package v2 - -import ( - "net/http" - - "github.com/docker/distribution/registry/api/errcode" -) - -const errGroup = "registry.api.v2" - -var ( - // ErrorCodeDigestInvalid is returned when uploading a blob if the - // provided digest does not match the blob contents. - ErrorCodeDigestInvalid = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "DIGEST_INVALID", - Message: "provided digest did not match uploaded content", - Description: `When a blob is uploaded, the registry will check that - the content matches the digest provided by the client. The error may - include a detail structure with the key "digest", including the - invalid digest string. This error may also be returned when a manifest - includes an invalid layer digest.`, - HTTPStatusCode: http.StatusBadRequest, - }) - - // ErrorCodeSizeInvalid is returned when uploading a blob if the provided - ErrorCodeSizeInvalid = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "SIZE_INVALID", - Message: "provided length did not match content length", - Description: `When a layer is uploaded, the provided size will be - checked against the uploaded content. If they do not match, this error - will be returned.`, - HTTPStatusCode: http.StatusBadRequest, - }) - - // ErrorCodeNameInvalid is returned when the name in the manifest does not - // match the provided name. - ErrorCodeNameInvalid = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "NAME_INVALID", - Message: "invalid repository name", - Description: `Invalid repository name encountered either during - manifest validation or any API operation.`, - HTTPStatusCode: http.StatusBadRequest, - }) - - // ErrorCodeTagInvalid is returned when the tag in the manifest does not - // match the provided tag. - ErrorCodeTagInvalid = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "TAG_INVALID", - Message: "manifest tag did not match URI", - Description: `During a manifest upload, if the tag in the manifest - does not match the uri tag, this error will be returned.`, - HTTPStatusCode: http.StatusBadRequest, - }) - - // ErrorCodeNameUnknown when the repository name is not known. - ErrorCodeNameUnknown = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "NAME_UNKNOWN", - Message: "repository name not known to registry", - Description: `This is returned if the name used during an operation is - unknown to the registry.`, - HTTPStatusCode: http.StatusNotFound, - }) - - // ErrorCodeManifestUnknown returned when image manifest is unknown. - ErrorCodeManifestUnknown = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "MANIFEST_UNKNOWN", - Message: "manifest unknown", - Description: `This error is returned when the manifest, identified by - name and tag is unknown to the repository.`, - HTTPStatusCode: http.StatusNotFound, - }) - - // ErrorCodeManifestInvalid returned when an image manifest is invalid, - // typically during a PUT operation. This error encompasses all errors - // encountered during manifest validation that aren't signature errors. - ErrorCodeManifestInvalid = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "MANIFEST_INVALID", - Message: "manifest invalid", - Description: `During upload, manifests undergo several checks ensuring - validity. If those checks fail, this error may be returned, unless a - more specific error is included. The detail will contain information - the failed validation.`, - HTTPStatusCode: http.StatusBadRequest, - }) - - // ErrorCodeManifestUnverified is returned when the manifest fails - // signature verification. - ErrorCodeManifestUnverified = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "MANIFEST_UNVERIFIED", - Message: "manifest failed signature verification", - Description: `During manifest upload, if the manifest fails signature - verification, this error will be returned.`, - HTTPStatusCode: http.StatusBadRequest, - }) - - // ErrorCodeManifestBlobUnknown is returned when a manifest blob is - // unknown to the registry. - ErrorCodeManifestBlobUnknown = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "MANIFEST_BLOB_UNKNOWN", - Message: "blob unknown to registry", - Description: `This error may be returned when a manifest blob is - unknown to the registry.`, - HTTPStatusCode: http.StatusBadRequest, - }) - - // ErrorCodeBlobUnknown is returned when a blob is unknown to the - // registry. This can happen when the manifest references a nonexistent - // layer or the result is not found by a blob fetch. - ErrorCodeBlobUnknown = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "BLOB_UNKNOWN", - Message: "blob unknown to registry", - Description: `This error may be returned when a blob is unknown to the - registry in a specified repository. This can be returned with a - standard get or if a manifest references an unknown layer during - upload.`, - HTTPStatusCode: http.StatusNotFound, - }) - - // ErrorCodeBlobUploadUnknown is returned when an upload is unknown. - ErrorCodeBlobUploadUnknown = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "BLOB_UPLOAD_UNKNOWN", - Message: "blob upload unknown to registry", - Description: `If a blob upload has been cancelled or was never - started, this error code may be returned.`, - HTTPStatusCode: http.StatusNotFound, - }) - - // ErrorCodeBlobUploadInvalid is returned when an upload is invalid. - ErrorCodeBlobUploadInvalid = errcode.Register(errGroup, errcode.ErrorDescriptor{ - Value: "BLOB_UPLOAD_INVALID", - Message: "blob upload invalid", - Description: `The blob upload encountered an error and can no - longer proceed.`, - HTTPStatusCode: http.StatusNotFound, - }) -) diff --git a/vendor/github.com/docker/distribution/registry/api/v2/headerparser.go b/vendor/github.com/docker/distribution/registry/api/v2/headerparser.go deleted file mode 100644 index 9bc41a3a6..000000000 --- a/vendor/github.com/docker/distribution/registry/api/v2/headerparser.go +++ /dev/null @@ -1,161 +0,0 @@ -package v2 - -import ( - "fmt" - "regexp" - "strings" - "unicode" -) - -var ( - // according to rfc7230 - reToken = regexp.MustCompile(`^[^"(),/:;<=>?@[\]{}[:space:][:cntrl:]]+`) - reQuotedValue = regexp.MustCompile(`^[^\\"]+`) - reEscapedCharacter = regexp.MustCompile(`^[[:blank:][:graph:]]`) -) - -// parseForwardedHeader is a benevolent parser of Forwarded header defined in rfc7239. The header contains -// a comma-separated list of forwarding key-value pairs. Each list element is set by single proxy. The -// function parses only the first element of the list, which is set by the very first proxy. It returns a map -// of corresponding key-value pairs and an unparsed slice of the input string. -// -// Examples of Forwarded header values: -// -// 1. Forwarded: For=192.0.2.43; Proto=https,For="[2001:db8:cafe::17]",For=unknown -// 2. Forwarded: for="192.0.2.43:443"; host="registry.example.org", for="10.10.05.40:80" -// -// The first will be parsed into {"for": "192.0.2.43", "proto": "https"} while the second into -// {"for": "192.0.2.43:443", "host": "registry.example.org"}. -func parseForwardedHeader(forwarded string) (map[string]string, string, error) { - // Following are states of forwarded header parser. Any state could transition to a failure. - const ( - // terminating state; can transition to Parameter - stateElement = iota - // terminating state; can transition to KeyValueDelimiter - stateParameter - // can transition to Value - stateKeyValueDelimiter - // can transition to one of { QuotedValue, PairEnd } - stateValue - // can transition to one of { EscapedCharacter, PairEnd } - stateQuotedValue - // can transition to one of { QuotedValue } - stateEscapedCharacter - // terminating state; can transition to one of { Parameter, Element } - statePairEnd - ) - - var ( - parameter string - value string - parse = forwarded[:] - res = map[string]string{} - state = stateElement - ) - -Loop: - for { - // skip spaces unless in quoted value - if state != stateQuotedValue && state != stateEscapedCharacter { - parse = strings.TrimLeftFunc(parse, unicode.IsSpace) - } - - if len(parse) == 0 { - if state != stateElement && state != statePairEnd && state != stateParameter { - return nil, parse, fmt.Errorf("unexpected end of input") - } - // terminating - break - } - - switch state { - // terminate at list element delimiter - case stateElement: - if parse[0] == ',' { - parse = parse[1:] - break Loop - } - state = stateParameter - - // parse parameter (the key of key-value pair) - case stateParameter: - match := reToken.FindString(parse) - if len(match) == 0 { - return nil, parse, fmt.Errorf("failed to parse token at position %d", len(forwarded)-len(parse)) - } - parameter = strings.ToLower(match) - parse = parse[len(match):] - state = stateKeyValueDelimiter - - // parse '=' - case stateKeyValueDelimiter: - if parse[0] != '=' { - return nil, parse, fmt.Errorf("expected '=', not '%c' at position %d", parse[0], len(forwarded)-len(parse)) - } - parse = parse[1:] - state = stateValue - - // parse value or quoted value - case stateValue: - if parse[0] == '"' { - parse = parse[1:] - state = stateQuotedValue - } else { - value = reToken.FindString(parse) - if len(value) == 0 { - return nil, parse, fmt.Errorf("failed to parse value at position %d", len(forwarded)-len(parse)) - } - if _, exists := res[parameter]; exists { - return nil, parse, fmt.Errorf("duplicate parameter %q at position %d", parameter, len(forwarded)-len(parse)) - } - res[parameter] = value - parse = parse[len(value):] - value = "" - state = statePairEnd - } - - // parse a part of quoted value until the first backslash - case stateQuotedValue: - match := reQuotedValue.FindString(parse) - value += match - parse = parse[len(match):] - switch { - case len(parse) == 0: - return nil, parse, fmt.Errorf("unterminated quoted string") - case parse[0] == '"': - res[parameter] = value - value = "" - parse = parse[1:] - state = statePairEnd - case parse[0] == '\\': - parse = parse[1:] - state = stateEscapedCharacter - } - - // parse escaped character in a quoted string, ignore the backslash - // transition back to QuotedValue state - case stateEscapedCharacter: - c := reEscapedCharacter.FindString(parse) - if len(c) == 0 { - return nil, parse, fmt.Errorf("invalid escape sequence at position %d", len(forwarded)-len(parse)-1) - } - value += c - parse = parse[1:] - state = stateQuotedValue - - // expect either a new key-value pair, new list or end of input - case statePairEnd: - switch parse[0] { - case ';': - parse = parse[1:] - state = stateParameter - case ',': - state = stateElement - default: - return nil, parse, fmt.Errorf("expected ',' or ';', not %c at position %d", parse[0], len(forwarded)-len(parse)) - } - } - } - - return res, parse, nil -} diff --git a/vendor/github.com/docker/distribution/registry/api/v2/headerparser_test.go b/vendor/github.com/docker/distribution/registry/api/v2/headerparser_test.go deleted file mode 100644 index b8c37490d..000000000 --- a/vendor/github.com/docker/distribution/registry/api/v2/headerparser_test.go +++ /dev/null @@ -1,161 +0,0 @@ -package v2 - -import ( - "testing" -) - -func TestParseForwardedHeader(t *testing.T) { - for _, tc := range []struct { - name string - raw string - expected map[string]string - expectedRest string - expectedError bool - }{ - { - name: "empty", - raw: "", - }, - { - name: "one pair", - raw: " key = value ", - expected: map[string]string{"key": "value"}, - }, - { - name: "two pairs", - raw: " key1 = value1; key2=value2", - expected: map[string]string{"key1": "value1", "key2": "value2"}, - }, - { - name: "uppercase parameter", - raw: "KeY=VaL", - expected: map[string]string{"key": "VaL"}, - }, - { - name: "missing key=value pair - be tolerant", - raw: "key=val;", - expected: map[string]string{"key": "val"}, - }, - { - name: "quoted values", - raw: `key="val";param = "[[ $((1 + 1)) == 3 ]] && echo panic!;" ; p=" abcd "`, - expected: map[string]string{"key": "val", "param": "[[ $((1 + 1)) == 3 ]] && echo panic!;", "p": " abcd "}, - }, - { - name: "empty quoted value", - raw: `key=""`, - expected: map[string]string{"key": ""}, - }, - { - name: "quoted double quotes", - raw: `key="\"value\""`, - expected: map[string]string{"key": `"value"`}, - }, - { - name: "quoted backslash", - raw: `key="\"\\\""`, - expected: map[string]string{"key": `"\"`}, - }, - { - name: "ignore subsequent elements", - raw: "key=a, param= b", - expected: map[string]string{"key": "a"}, - expectedRest: " param= b", - }, - { - name: "empty element - be tolerant", - raw: " , key=val", - expectedRest: " key=val", - }, - { - name: "obscure key", - raw: `ob₷C&r€ = value`, - expected: map[string]string{`ob₷c&r€`: "value"}, - }, - { - name: "duplicate parameter", - raw: "key=a; p=b; key=c", - expectedError: true, - }, - { - name: "empty parameter", - raw: "=value", - expectedError: true, - }, - { - name: "empty value", - raw: "key= ", - expectedError: true, - }, - { - name: "empty value before a new element ", - raw: "key=,", - expectedError: true, - }, - { - name: "empty value before a new pair", - raw: "key=;", - expectedError: true, - }, - { - name: "just parameter", - raw: "key", - expectedError: true, - }, - { - name: "missing key-value", - raw: "a=b;;", - expectedError: true, - }, - { - name: "unclosed quoted value", - raw: `key="value`, - expectedError: true, - }, - { - name: "escaped terminating dquote", - raw: `key="value\"`, - expectedError: true, - }, - { - name: "just a quoted value", - raw: `"key=val"`, - expectedError: true, - }, - { - name: "quoted key", - raw: `"key"=val`, - expectedError: true, - }, - } { - parsed, rest, err := parseForwardedHeader(tc.raw) - if err != nil && !tc.expectedError { - t.Errorf("[%s] got unexpected error: %v", tc.name, err) - } - if err == nil && tc.expectedError { - t.Errorf("[%s] got unexpected non-error", tc.name) - } - if err != nil || tc.expectedError { - continue - } - for key, value := range tc.expected { - v, exists := parsed[key] - if !exists { - t.Errorf("[%s] missing expected parameter %q", tc.name, key) - continue - } - if v != value { - t.Errorf("[%s] got unexpected value for parameter %q: %q != %q", tc.name, key, v, value) - } - } - for key, value := range parsed { - if _, exists := tc.expected[key]; !exists { - t.Errorf("[%s] got unexpected key/value pair: %q=%q", tc.name, key, value) - } - } - - if rest != tc.expectedRest { - t.Errorf("[%s] got unexpected unparsed string: %q != %q", tc.name, rest, tc.expectedRest) - } - } -} diff --git a/vendor/github.com/docker/distribution/registry/api/v2/routes.go b/vendor/github.com/docker/distribution/registry/api/v2/routes.go deleted file mode 100644 index 5b80d5be7..000000000 --- a/vendor/github.com/docker/distribution/registry/api/v2/routes.go +++ /dev/null @@ -1,49 +0,0 @@ -package v2 - -import "github.com/gorilla/mux" - -// The following are definitions of the name under which all V2 routes are -// registered. These symbols can be used to look up a route based on the name. -const ( - RouteNameBase = "base" - RouteNameManifest = "manifest" - RouteNameTags = "tags" - RouteNameBlob = "blob" - RouteNameBlobUpload = "blob-upload" - RouteNameBlobUploadChunk = "blob-upload-chunk" - RouteNameCatalog = "catalog" -) - -var allEndpoints = []string{ - RouteNameManifest, - RouteNameCatalog, - RouteNameTags, - RouteNameBlob, - RouteNameBlobUpload, - RouteNameBlobUploadChunk, -} - -// Router builds a gorilla router with named routes for the various API -// methods. This can be used directly by both server implementations and -// clients. -func Router() *mux.Router { - return RouterWithPrefix("") -} - -// RouterWithPrefix builds a gorilla router with a configured prefix -// on all routes. -func RouterWithPrefix(prefix string) *mux.Router { - rootRouter := mux.NewRouter() - router := rootRouter - if prefix != "" { - router = router.PathPrefix(prefix).Subrouter() - } - - router.StrictSlash(true) - - for _, descriptor := range routeDescriptors { - router.Path(descriptor.Path).Name(descriptor.Name) - } - - return rootRouter -} diff --git a/vendor/github.com/docker/distribution/registry/api/v2/routes_test.go b/vendor/github.com/docker/distribution/registry/api/v2/routes_test.go deleted file mode 100644 index f632d981c..000000000 --- a/vendor/github.com/docker/distribution/registry/api/v2/routes_test.go +++ /dev/null @@ -1,355 +0,0 @@ -package v2 - -import ( - "encoding/json" - "fmt" - "math/rand" - "net/http" - "net/http/httptest" - "reflect" - "strings" - "testing" - "time" - - "github.com/gorilla/mux" -) - -type routeTestCase struct { - RequestURI string - ExpectedURI string - Vars map[string]string - RouteName string - StatusCode int -} - -// TestRouter registers a test handler with all the routes and ensures that -// each route returns the expected path variables. Not method verification is -// present. This not meant to be exhaustive but as check to ensure that the -// expected variables are extracted. -// -// This may go away as the application structure comes together. -func TestRouter(t *testing.T) { - testCases := []routeTestCase{ - { - RouteName: RouteNameBase, - RequestURI: "/v2/", - Vars: map[string]string{}, - }, - { - RouteName: RouteNameManifest, - RequestURI: "/v2/foo/manifests/bar", - Vars: map[string]string{ - "name": "foo", - "reference": "bar", - }, - }, - { - RouteName: RouteNameManifest, - RequestURI: "/v2/foo/bar/manifests/tag", - Vars: map[string]string{ - "name": "foo/bar", - "reference": "tag", - }, - }, - { - RouteName: RouteNameManifest, - RequestURI: "/v2/foo/bar/manifests/sha256:abcdef01234567890", - Vars: map[string]string{ - "name": "foo/bar", - "reference": "sha256:abcdef01234567890", - }, - }, - { - RouteName: RouteNameTags, - RequestURI: "/v2/foo/bar/tags/list", - Vars: map[string]string{ - "name": "foo/bar", - }, - }, - { - RouteName: RouteNameTags, - RequestURI: "/v2/docker.com/foo/tags/list", - Vars: map[string]string{ - "name": "docker.com/foo", - }, - }, - { - RouteName: RouteNameTags, - RequestURI: "/v2/docker.com/foo/bar/tags/list", - Vars: map[string]string{ - "name": "docker.com/foo/bar", - }, - }, - { - RouteName: RouteNameTags, - RequestURI: "/v2/docker.com/foo/bar/baz/tags/list", - Vars: map[string]string{ - "name": "docker.com/foo/bar/baz", - }, - }, - { - RouteName: RouteNameBlob, - RequestURI: "/v2/foo/bar/blobs/sha256:abcdef0919234", - Vars: map[string]string{ - "name": "foo/bar", - "digest": "sha256:abcdef0919234", - }, - }, - { - RouteName: RouteNameBlobUpload, - RequestURI: "/v2/foo/bar/blobs/uploads/", - Vars: map[string]string{ - "name": "foo/bar", - }, - }, - { - RouteName: RouteNameBlobUploadChunk, - RequestURI: "/v2/foo/bar/blobs/uploads/uuid", - Vars: map[string]string{ - "name": "foo/bar", - "uuid": "uuid", - }, - }, - { - // support uuid proper - RouteName: RouteNameBlobUploadChunk, - RequestURI: "/v2/foo/bar/blobs/uploads/D95306FA-FAD3-4E36-8D41-CF1C93EF8286", - Vars: map[string]string{ - "name": "foo/bar", - "uuid": "D95306FA-FAD3-4E36-8D41-CF1C93EF8286", - }, - }, - { - RouteName: RouteNameBlobUploadChunk, - RequestURI: "/v2/foo/bar/blobs/uploads/RDk1MzA2RkEtRkFEMy00RTM2LThENDEtQ0YxQzkzRUY4Mjg2IA==", - Vars: map[string]string{ - "name": "foo/bar", - "uuid": "RDk1MzA2RkEtRkFEMy00RTM2LThENDEtQ0YxQzkzRUY4Mjg2IA==", - }, - }, - { - // supports urlsafe base64 - RouteName: RouteNameBlobUploadChunk, - RequestURI: "/v2/foo/bar/blobs/uploads/RDk1MzA2RkEtRkFEMy00RTM2LThENDEtQ0YxQzkzRUY4Mjg2IA_-==", - Vars: map[string]string{ - "name": "foo/bar", - "uuid": "RDk1MzA2RkEtRkFEMy00RTM2LThENDEtQ0YxQzkzRUY4Mjg2IA_-==", - }, - }, - { - // does not match - RouteName: RouteNameBlobUploadChunk, - RequestURI: "/v2/foo/bar/blobs/uploads/totalandcompletejunk++$$-==", - StatusCode: http.StatusNotFound, - }, - { - // Check ambiguity: ensure we can distinguish between tags for - // "foo/bar/image/image" and image for "foo/bar/image" with tag - // "tags" - RouteName: RouteNameManifest, - RequestURI: "/v2/foo/bar/manifests/manifests/tags", - Vars: map[string]string{ - "name": "foo/bar/manifests", - "reference": "tags", - }, - }, - { - // This case presents an ambiguity between foo/bar with tag="tags" - // and list tags for "foo/bar/manifest" - RouteName: RouteNameTags, - RequestURI: "/v2/foo/bar/manifests/tags/list", - Vars: map[string]string{ - "name": "foo/bar/manifests", - }, - }, - { - RouteName: RouteNameManifest, - RequestURI: "/v2/locahost:8080/foo/bar/baz/manifests/tag", - Vars: map[string]string{ - "name": "locahost:8080/foo/bar/baz", - "reference": "tag", - }, - }, - } - - checkTestRouter(t, testCases, "", true) - checkTestRouter(t, testCases, "/prefix/", true) -} - -func TestRouterWithPathTraversals(t *testing.T) { - testCases := []routeTestCase{ - { - RouteName: RouteNameBlobUploadChunk, - RequestURI: "/v2/foo/../../blob/uploads/D95306FA-FAD3-4E36-8D41-CF1C93EF8286", - ExpectedURI: "/blob/uploads/D95306FA-FAD3-4E36-8D41-CF1C93EF8286", - StatusCode: http.StatusNotFound, - }, - { - // Testing for path traversal attack handling - RouteName: RouteNameTags, - RequestURI: "/v2/foo/../bar/baz/tags/list", - ExpectedURI: "/v2/bar/baz/tags/list", - Vars: map[string]string{ - "name": "bar/baz", - }, - }, - } - checkTestRouter(t, testCases, "", false) -} - -func TestRouterWithBadCharacters(t *testing.T) { - if testing.Short() { - testCases := []routeTestCase{ - { - RouteName: RouteNameBlobUploadChunk, - RequestURI: "/v2/foo/blob/uploads/不95306FA-FAD3-4E36-8D41-CF1C93EF8286", - StatusCode: http.StatusNotFound, - }, - { - // Testing for path traversal attack handling - RouteName: RouteNameTags, - RequestURI: "/v2/foo/不bar/tags/list", - StatusCode: http.StatusNotFound, - }, - } - checkTestRouter(t, testCases, "", true) - } else { - // in the long version we're going to fuzz the router - // with random UTF8 characters not in the 128 bit ASCII range. - // These are not valid characters for the router and we expect - // 404s on every test. - rand.Seed(time.Now().UTC().UnixNano()) - testCases := make([]routeTestCase, 1000) - for idx := range testCases { - testCases[idx] = routeTestCase{ - RouteName: RouteNameTags, - RequestURI: fmt.Sprintf("/v2/%v/%v/tags/list", randomString(10), randomString(10)), - StatusCode: http.StatusNotFound, - } - } - checkTestRouter(t, testCases, "", true) - } -} - -func checkTestRouter(t *testing.T, testCases []routeTestCase, prefix string, deeplyEqual bool) { - router := RouterWithPrefix(prefix) - - testHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - testCase := routeTestCase{ - RequestURI: r.RequestURI, - Vars: mux.Vars(r), - RouteName: mux.CurrentRoute(r).GetName(), - } - - enc := json.NewEncoder(w) - - if err := enc.Encode(testCase); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - }) - - // Startup test server - server := httptest.NewServer(router) - - for _, testcase := range testCases { - testcase.RequestURI = strings.TrimSuffix(prefix, "/") + testcase.RequestURI - // Register the endpoint - route := router.GetRoute(testcase.RouteName) - if route == nil { - t.Fatalf("route for name %q not found", testcase.RouteName) - } - - route.Handler(testHandler) - - u := server.URL + testcase.RequestURI - - resp, err := http.Get(u) - - if err != nil { - t.Fatalf("error issuing get request: %v", err) - } - - if testcase.StatusCode == 0 { - // Override default, zero-value - testcase.StatusCode = http.StatusOK - } - if testcase.ExpectedURI == "" { - // Override default, zero-value - testcase.ExpectedURI = testcase.RequestURI - } - - if resp.StatusCode != testcase.StatusCode { - t.Fatalf("unexpected status for %s: %v %v", u, resp.Status, resp.StatusCode) - } - - if testcase.StatusCode != http.StatusOK { - resp.Body.Close() - // We don't care about json response. - continue - } - - dec := json.NewDecoder(resp.Body) - - var actualRouteInfo routeTestCase - if err := dec.Decode(&actualRouteInfo); err != nil { - t.Fatalf("error reading json response: %v", err) - } - // Needs to be set out of band - actualRouteInfo.StatusCode = resp.StatusCode - - if actualRouteInfo.RequestURI != testcase.ExpectedURI { - t.Fatalf("URI %v incorrectly parsed, expected %v", actualRouteInfo.RequestURI, testcase.ExpectedURI) - } - - if actualRouteInfo.RouteName != testcase.RouteName { - t.Fatalf("incorrect route %q matched, expected %q", actualRouteInfo.RouteName, testcase.RouteName) - } - - // when testing deep equality, the actualRouteInfo has an empty ExpectedURI, we don't want - // that to make the comparison fail. We're otherwise done with the testcase so empty the - // testcase.ExpectedURI - testcase.ExpectedURI = "" - if deeplyEqual && !reflect.DeepEqual(actualRouteInfo, testcase) { - t.Fatalf("actual does not equal expected: %#v != %#v", actualRouteInfo, testcase) - } - - resp.Body.Close() - } - -} - -// -------------- START LICENSED CODE -------------- -// The following code is derivative of https://github.com/google/gofuzz -// gofuzz is licensed under the Apache License, Version 2.0, January 2004, -// a copy of which can be found in the LICENSE file at the root of this -// repository. - -// These functions allow us to generate strings containing only multibyte -// characters that are invalid in our URLs. They are used above for fuzzing -// to ensure we always get 404s on these invalid strings -type charRange struct { - first, last rune -} - -// choose returns a random unicode character from the given range, using the -// given randomness source. -func (r *charRange) choose() rune { - count := int64(r.last - r.first) - return r.first + rune(rand.Int63n(count)) -} - -var unicodeRanges = []charRange{ - {'\u00a0', '\u02af'}, // Multi-byte encoded characters - {'\u4e00', '\u9fff'}, // Common CJK (even longer encodings) -} - -func randomString(length int) string { - runes := make([]rune, length) - for i := range runes { - runes[i] = unicodeRanges[rand.Intn(len(unicodeRanges))].choose() - } - return string(runes) -} - -// -------------- END LICENSED CODE -------------- diff --git a/vendor/github.com/docker/distribution/registry/api/v2/urls.go b/vendor/github.com/docker/distribution/registry/api/v2/urls.go deleted file mode 100644 index 5e24ca9b5..000000000 --- a/vendor/github.com/docker/distribution/registry/api/v2/urls.go +++ /dev/null @@ -1,263 +0,0 @@ -package v2 - -import ( - "net/http" - "net/url" - "strings" - - "github.com/docker/distribution/reference" - "github.com/gorilla/mux" -) - -// URLBuilder creates registry API urls from a single base endpoint. It can be -// used to create urls for use in a registry client or server. -// -// All urls will be created from the given base, including the api version. -// For example, if a root of "/foo/" is provided, urls generated will be fall -// under "/foo/v2/...". Most application will only provide a schema, host and -// port, such as "https://localhost:5000/". -type URLBuilder struct { - root *url.URL // url root (ie http://localhost/) - router *mux.Router - relative bool -} - -// NewURLBuilder creates a URLBuilder with provided root url object. -func NewURLBuilder(root *url.URL, relative bool) *URLBuilder { - return &URLBuilder{ - root: root, - router: Router(), - relative: relative, - } -} - -// NewURLBuilderFromString workes identically to NewURLBuilder except it takes -// a string argument for the root, returning an error if it is not a valid -// url. -func NewURLBuilderFromString(root string, relative bool) (*URLBuilder, error) { - u, err := url.Parse(root) - if err != nil { - return nil, err - } - - return NewURLBuilder(u, relative), nil -} - -// NewURLBuilderFromRequest uses information from an *http.Request to -// construct the root url. -func NewURLBuilderFromRequest(r *http.Request, relative bool) *URLBuilder { - var ( - scheme = "http" - host = r.Host - ) - - if r.TLS != nil { - scheme = "https" - } else if len(r.URL.Scheme) > 0 { - scheme = r.URL.Scheme - } - - // Handle fowarded headers - // Prefer "Forwarded" header as defined by rfc7239 if given - // see https://tools.ietf.org/html/rfc7239 - if forwarded := r.Header.Get("Forwarded"); len(forwarded) > 0 { - forwardedHeader, _, err := parseForwardedHeader(forwarded) - if err == nil { - if fproto := forwardedHeader["proto"]; len(fproto) > 0 { - scheme = fproto - } - if fhost := forwardedHeader["host"]; len(fhost) > 0 { - host = fhost - } - } - } else { - if forwardedProto := r.Header.Get("X-Forwarded-Proto"); len(forwardedProto) > 0 { - scheme = forwardedProto - } - if forwardedHost := r.Header.Get("X-Forwarded-Host"); len(forwardedHost) > 0 { - // According to the Apache mod_proxy docs, X-Forwarded-Host can be a - // comma-separated list of hosts, to which each proxy appends the - // requested host. We want to grab the first from this comma-separated - // list. - hosts := strings.SplitN(forwardedHost, ",", 2) - host = strings.TrimSpace(hosts[0]) - } - } - - basePath := routeDescriptorsMap[RouteNameBase].Path - - requestPath := r.URL.Path - index := strings.Index(requestPath, basePath) - - u := &url.URL{ - Scheme: scheme, - Host: host, - } - - if index > 0 { - // N.B. index+1 is important because we want to include the trailing / - u.Path = requestPath[0 : index+1] - } - - return NewURLBuilder(u, relative) -} - -// BuildBaseURL constructs a base url for the API, typically just "/v2/". -func (ub *URLBuilder) BuildBaseURL() (string, error) { - route := ub.cloneRoute(RouteNameBase) - - baseURL, err := route.URL() - if err != nil { - return "", err - } - - return baseURL.String(), nil -} - -// BuildCatalogURL constructs a url get a catalog of repositories -func (ub *URLBuilder) BuildCatalogURL(values ...url.Values) (string, error) { - route := ub.cloneRoute(RouteNameCatalog) - - catalogURL, err := route.URL() - if err != nil { - return "", err - } - - return appendValuesURL(catalogURL, values...).String(), nil -} - -// BuildTagsURL constructs a url to list the tags in the named repository. -func (ub *URLBuilder) BuildTagsURL(name reference.Named) (string, error) { - route := ub.cloneRoute(RouteNameTags) - - tagsURL, err := route.URL("name", name.Name()) - if err != nil { - return "", err - } - - return tagsURL.String(), nil -} - -// BuildManifestURL constructs a url for the manifest identified by name and -// reference. The argument reference may be either a tag or digest. -func (ub *URLBuilder) BuildManifestURL(ref reference.Named) (string, error) { - route := ub.cloneRoute(RouteNameManifest) - - tagOrDigest := "" - switch v := ref.(type) { - case reference.Tagged: - tagOrDigest = v.Tag() - case reference.Digested: - tagOrDigest = v.Digest().String() - } - - manifestURL, err := route.URL("name", ref.Name(), "reference", tagOrDigest) - if err != nil { - return "", err - } - - return manifestURL.String(), nil -} - -// BuildBlobURL constructs the url for the blob identified by name and dgst. -func (ub *URLBuilder) BuildBlobURL(ref reference.Canonical) (string, error) { - route := ub.cloneRoute(RouteNameBlob) - - layerURL, err := route.URL("name", ref.Name(), "digest", ref.Digest().String()) - if err != nil { - return "", err - } - - return layerURL.String(), nil -} - -// BuildBlobUploadURL constructs a url to begin a blob upload in the -// repository identified by name. -func (ub *URLBuilder) BuildBlobUploadURL(name reference.Named, values ...url.Values) (string, error) { - route := ub.cloneRoute(RouteNameBlobUpload) - - uploadURL, err := route.URL("name", name.Name()) - if err != nil { - return "", err - } - - return appendValuesURL(uploadURL, values...).String(), nil -} - -// BuildBlobUploadChunkURL constructs a url for the upload identified by uuid, -// including any url values. This should generally not be used by clients, as -// this url is provided by server implementations during the blob upload -// process. -func (ub *URLBuilder) BuildBlobUploadChunkURL(name reference.Named, uuid string, values ...url.Values) (string, error) { - route := ub.cloneRoute(RouteNameBlobUploadChunk) - - uploadURL, err := route.URL("name", name.Name(), "uuid", uuid) - if err != nil { - return "", err - } - - return appendValuesURL(uploadURL, values...).String(), nil -} - -// clondedRoute returns a clone of the named route from the router. Routes -// must be cloned to avoid modifying them during url generation. -func (ub *URLBuilder) cloneRoute(name string) clonedRoute { - route := new(mux.Route) - root := new(url.URL) - - *route = *ub.router.GetRoute(name) // clone the route - *root = *ub.root - - return clonedRoute{Route: route, root: root, relative: ub.relative} -} - -type clonedRoute struct { - *mux.Route - root *url.URL - relative bool -} - -func (cr clonedRoute) URL(pairs ...string) (*url.URL, error) { - routeURL, err := cr.Route.URL(pairs...) - if err != nil { - return nil, err - } - - if cr.relative { - return routeURL, nil - } - - if routeURL.Scheme == "" && routeURL.User == nil && routeURL.Host == "" { - routeURL.Path = routeURL.Path[1:] - } - - url := cr.root.ResolveReference(routeURL) - url.Scheme = cr.root.Scheme - return url, nil -} - -// appendValuesURL appends the parameters to the url. -func appendValuesURL(u *url.URL, values ...url.Values) *url.URL { - merged := u.Query() - - for _, v := range values { - for k, vv := range v { - merged[k] = append(merged[k], vv...) - } - } - - u.RawQuery = merged.Encode() - return u -} - -// appendValues appends the parameters to the url. Panics if the string is not -// a url. -func appendValues(u string, values ...url.Values) string { - up, err := url.Parse(u) - - if err != nil { - panic(err) // should never happen - } - - return appendValuesURL(up, values...).String() -} diff --git a/vendor/github.com/docker/distribution/registry/api/v2/urls_test.go b/vendor/github.com/docker/distribution/registry/api/v2/urls_test.go deleted file mode 100644 index 6d8973fad..000000000 --- a/vendor/github.com/docker/distribution/registry/api/v2/urls_test.go +++ /dev/null @@ -1,484 +0,0 @@ -package v2 - -import ( - "net/http" - "net/url" - "testing" - - "github.com/docker/distribution/reference" -) - -type urlBuilderTestCase struct { - description string - expectedPath string - build func() (string, error) -} - -func makeURLBuilderTestCases(urlBuilder *URLBuilder) []urlBuilderTestCase { - fooBarRef, _ := reference.ParseNamed("foo/bar") - return []urlBuilderTestCase{ - { - description: "test base url", - expectedPath: "/v2/", - build: urlBuilder.BuildBaseURL, - }, - { - description: "test tags url", - expectedPath: "/v2/foo/bar/tags/list", - build: func() (string, error) { - return urlBuilder.BuildTagsURL(fooBarRef) - }, - }, - { - description: "test manifest url", - expectedPath: "/v2/foo/bar/manifests/tag", - build: func() (string, error) { - ref, _ := reference.WithTag(fooBarRef, "tag") - return urlBuilder.BuildManifestURL(ref) - }, - }, - { - description: "build blob url", - expectedPath: "/v2/foo/bar/blobs/sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5", - build: func() (string, error) { - ref, _ := reference.WithDigest(fooBarRef, "sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5") - return urlBuilder.BuildBlobURL(ref) - }, - }, - { - description: "build blob upload url", - expectedPath: "/v2/foo/bar/blobs/uploads/", - build: func() (string, error) { - return urlBuilder.BuildBlobUploadURL(fooBarRef) - }, - }, - { - description: "build blob upload url with digest and size", - expectedPath: "/v2/foo/bar/blobs/uploads/?digest=sha256%3A3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5&size=10000", - build: func() (string, error) { - return urlBuilder.BuildBlobUploadURL(fooBarRef, url.Values{ - "size": []string{"10000"}, - "digest": []string{"sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5"}, - }) - }, - }, - { - description: "build blob upload chunk url", - expectedPath: "/v2/foo/bar/blobs/uploads/uuid-part", - build: func() (string, error) { - return urlBuilder.BuildBlobUploadChunkURL(fooBarRef, "uuid-part") - }, - }, - { - description: "build blob upload chunk url with digest and size", - expectedPath: "/v2/foo/bar/blobs/uploads/uuid-part?digest=sha256%3A3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5&size=10000", - build: func() (string, error) { - return urlBuilder.BuildBlobUploadChunkURL(fooBarRef, "uuid-part", url.Values{ - "size": []string{"10000"}, - "digest": []string{"sha256:3b3692957d439ac1928219a83fac91e7bf96c153725526874673ae1f2023f8d5"}, - }) - }, - }, - } -} - -// TestURLBuilder tests the various url building functions, ensuring they are -// returning the expected values. -func TestURLBuilder(t *testing.T) { - roots := []string{ - "http://example.com", - "https://example.com", - "http://localhost:5000", - "https://localhost:5443", - } - - doTest := func(relative bool) { - for _, root := range roots { - urlBuilder, err := NewURLBuilderFromString(root, relative) - if err != nil { - t.Fatalf("unexpected error creating urlbuilder: %v", err) - } - - for _, testCase := range makeURLBuilderTestCases(urlBuilder) { - url, err := testCase.build() - if err != nil { - t.Fatalf("%s: error building url: %v", testCase.description, err) - } - expectedURL := testCase.expectedPath - if !relative { - expectedURL = root + expectedURL - } - - if url != expectedURL { - t.Fatalf("%s: %q != %q", testCase.description, url, expectedURL) - } - } - } - } - doTest(true) - doTest(false) -} - -func TestURLBuilderWithPrefix(t *testing.T) { - roots := []string{ - "http://example.com/prefix/", - "https://example.com/prefix/", - "http://localhost:5000/prefix/", - "https://localhost:5443/prefix/", - } - - doTest := func(relative bool) { - for _, root := range roots { - urlBuilder, err := NewURLBuilderFromString(root, relative) - if err != nil { - t.Fatalf("unexpected error creating urlbuilder: %v", err) - } - - for _, testCase := range makeURLBuilderTestCases(urlBuilder) { - url, err := testCase.build() - if err != nil { - t.Fatalf("%s: error building url: %v", testCase.description, err) - } - - expectedURL := testCase.expectedPath - if !relative { - expectedURL = root[0:len(root)-1] + expectedURL - } - if url != expectedURL { - t.Fatalf("%s: %q != %q", testCase.description, url, expectedURL) - } - } - } - } - doTest(true) - doTest(false) -} - -type builderFromRequestTestCase struct { - request *http.Request - base string -} - -func TestBuilderFromRequest(t *testing.T) { - u, err := url.Parse("http://example.com") - if err != nil { - t.Fatal(err) - } - - testRequests := []struct { - name string - request *http.Request - base string - configHost url.URL - }{ - { - name: "no forwarded header", - request: &http.Request{URL: u, Host: u.Host}, - base: "http://example.com", - }, - { - name: "https protocol forwarded with a non-standard header", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Custom-Forwarded-Proto": []string{"https"}, - }}, - base: "http://example.com", - }, - { - name: "forwarded protocol is the same", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Proto": []string{"https"}, - }}, - base: "https://example.com", - }, - { - name: "forwarded host with a non-standard header", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Host": []string{"first.example.com"}, - }}, - base: "http://first.example.com", - }, - { - name: "forwarded multiple hosts a with non-standard header", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Host": []string{"first.example.com, proxy1.example.com"}, - }}, - base: "http://first.example.com", - }, - { - name: "host configured in config file takes priority", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Host": []string{"first.example.com, proxy1.example.com"}, - }}, - base: "https://third.example.com:5000", - configHost: url.URL{ - Scheme: "https", - Host: "third.example.com:5000", - }, - }, - { - name: "forwarded host and port with just one non-standard header", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Host": []string{"first.example.com:443"}, - }}, - base: "http://first.example.com:443", - }, - { - name: "forwarded port with a non-standard header", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Host": []string{"example.com:5000"}, - "X-Forwarded-Port": []string{"5000"}, - }}, - base: "http://example.com:5000", - }, - { - name: "forwarded multiple ports with a non-standard header", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Port": []string{"443 , 5001"}, - }}, - base: "http://example.com", - }, - { - name: "forwarded standard port with non-standard headers", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Proto": []string{"https"}, - "X-Forwarded-Host": []string{"example.com"}, - "X-Forwarded-Port": []string{"443"}, - }}, - base: "https://example.com", - }, - { - name: "forwarded standard port with non-standard headers and explicit port", - request: &http.Request{URL: u, Host: u.Host + ":443", Header: http.Header{ - "X-Forwarded-Proto": []string{"https"}, - "X-Forwarded-Host": []string{u.Host + ":443"}, - "X-Forwarded-Port": []string{"443"}, - }}, - base: "https://example.com:443", - }, - { - name: "several non-standard headers", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Proto": []string{"https"}, - "X-Forwarded-Host": []string{" first.example.com:12345 "}, - }}, - base: "https://first.example.com:12345", - }, - { - name: "forwarded host with port supplied takes priority", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Host": []string{"first.example.com:5000"}, - "X-Forwarded-Port": []string{"80"}, - }}, - base: "http://first.example.com:5000", - }, - { - name: "malformed forwarded port", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Host": []string{"first.example.com"}, - "X-Forwarded-Port": []string{"abcd"}, - }}, - base: "http://first.example.com", - }, - { - name: "forwarded protocol and addr using standard header", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "Forwarded": []string{`proto=https;host="192.168.22.30:80"`}, - }}, - base: "https://192.168.22.30:80", - }, - { - name: "forwarded host takes priority over for", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "Forwarded": []string{`host="reg.example.com:5000";for="192.168.22.30"`}, - }}, - base: "http://reg.example.com:5000", - }, - { - name: "forwarded host and protocol using standard header", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "Forwarded": []string{`host=reg.example.com;proto=https`}, - }}, - base: "https://reg.example.com", - }, - { - name: "process just the first standard forwarded header", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "Forwarded": []string{`host="reg.example.com:88";proto=http`, `host=reg.example.com;proto=https`}, - }}, - base: "http://reg.example.com:88", - }, - { - name: "process just the first list element of standard header", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "Forwarded": []string{`host="reg.example.com:443";proto=https, host="reg.example.com:80";proto=http`}, - }}, - base: "https://reg.example.com:443", - }, - { - name: "IPv6 address use host", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "Forwarded": []string{`for="2607:f0d0:1002:51::4";host="[2607:f0d0:1002:51::4]:5001"`}, - "X-Forwarded-Port": []string{"5002"}, - }}, - base: "http://[2607:f0d0:1002:51::4]:5001", - }, - { - name: "IPv6 address with port", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "Forwarded": []string{`host="[2607:f0d0:1002:51::4]:4000"`}, - "X-Forwarded-Port": []string{"5001"}, - }}, - base: "http://[2607:f0d0:1002:51::4]:4000", - }, - { - name: "non-standard and standard forward headers", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Proto": []string{`https`}, - "X-Forwarded-Host": []string{`first.example.com`}, - "X-Forwarded-Port": []string{``}, - "Forwarded": []string{`host=first.example.com; proto=https`}, - }}, - base: "https://first.example.com", - }, - { - name: "standard header takes precedence over non-standard headers", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Proto": []string{`http`}, - "Forwarded": []string{`host=second.example.com; proto=https`}, - "X-Forwarded-Host": []string{`first.example.com`}, - "X-Forwarded-Port": []string{`4000`}, - }}, - base: "https://second.example.com", - }, - { - name: "incomplete standard header uses default", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Proto": []string{`https`}, - "Forwarded": []string{`for=127.0.0.1`}, - "X-Forwarded-Host": []string{`first.example.com`}, - "X-Forwarded-Port": []string{`4000`}, - }}, - base: "http://" + u.Host, - }, - { - name: "standard with just proto", - request: &http.Request{URL: u, Host: u.Host, Header: http.Header{ - "X-Forwarded-Proto": []string{`https`}, - "Forwarded": []string{`proto=https`}, - "X-Forwarded-Host": []string{`first.example.com`}, - "X-Forwarded-Port": []string{`4000`}, - }}, - base: "https://" + u.Host, - }, - } - - doTest := func(relative bool) { - for _, tr := range testRequests { - var builder *URLBuilder - if tr.configHost.Scheme != "" && tr.configHost.Host != "" { - builder = NewURLBuilder(&tr.configHost, relative) - } else { - builder = NewURLBuilderFromRequest(tr.request, relative) - } - - for _, testCase := range makeURLBuilderTestCases(builder) { - buildURL, err := testCase.build() - if err != nil { - t.Fatalf("[relative=%t, request=%q, case=%q]: error building url: %v", relative, tr.name, testCase.description, err) - } - - expectedURL := testCase.expectedPath - if !relative { - expectedURL = tr.base + expectedURL - } - - if buildURL != expectedURL { - t.Errorf("[relative=%t, request=%q, case=%q]: %q != %q", relative, tr.name, testCase.description, buildURL, expectedURL) - } - } - } - } - - doTest(true) - doTest(false) -} - -func TestBuilderFromRequestWithPrefix(t *testing.T) { - u, err := url.Parse("http://example.com/prefix/v2/") - if err != nil { - t.Fatal(err) - } - - forwardedProtoHeader := make(http.Header, 1) - forwardedProtoHeader.Set("X-Forwarded-Proto", "https") - - testRequests := []struct { - request *http.Request - base string - configHost url.URL - }{ - { - request: &http.Request{URL: u, Host: u.Host}, - base: "http://example.com/prefix/", - }, - - { - request: &http.Request{URL: u, Host: u.Host, Header: forwardedProtoHeader}, - base: "http://example.com/prefix/", - }, - { - request: &http.Request{URL: u, Host: u.Host, Header: forwardedProtoHeader}, - base: "https://example.com/prefix/", - }, - { - request: &http.Request{URL: u, Host: u.Host, Header: forwardedProtoHeader}, - base: "https://subdomain.example.com/prefix/", - configHost: url.URL{ - Scheme: "https", - Host: "subdomain.example.com", - Path: "/prefix/", - }, - }, - } - - var relative bool - for _, tr := range testRequests { - var builder *URLBuilder - if tr.configHost.Scheme != "" && tr.configHost.Host != "" { - builder = NewURLBuilder(&tr.configHost, false) - } else { - builder = NewURLBuilderFromRequest(tr.request, false) - } - - for _, testCase := range makeURLBuilderTestCases(builder) { - buildURL, err := testCase.build() - if err != nil { - t.Fatalf("%s: error building url: %v", testCase.description, err) - } - - var expectedURL string - proto, ok := tr.request.Header["X-Forwarded-Proto"] - if !ok { - expectedURL = testCase.expectedPath - if !relative { - expectedURL = tr.base[0:len(tr.base)-1] + expectedURL - } - } else { - urlBase, err := url.Parse(tr.base) - if err != nil { - t.Fatal(err) - } - urlBase.Scheme = proto[0] - expectedURL = testCase.expectedPath - if !relative { - expectedURL = urlBase.String()[0:len(urlBase.String())-1] + expectedURL - } - - } - - if buildURL != expectedURL { - t.Fatalf("%s: %q != %q", testCase.description, buildURL, expectedURL) - } - } - } -} diff --git a/vendor/github.com/docker/distribution/registry/auth/auth.go b/vendor/github.com/docker/distribution/registry/auth/auth.go deleted file mode 100644 index 1c9af8821..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/auth.go +++ /dev/null @@ -1,202 +0,0 @@ -// Package auth defines a standard interface for request access controllers. -// -// An access controller has a simple interface with a single `Authorized` -// method which checks that a given request is authorized to perform one or -// more actions on one or more resources. This method should return a non-nil -// error if the request is not authorized. -// -// An implementation registers its access controller by name with a constructor -// which accepts an options map for configuring the access controller. -// -// options := map[string]interface{}{"sillySecret": "whysosilly?"} -// accessController, _ := auth.GetAccessController("silly", options) -// -// This `accessController` can then be used in a request handler like so: -// -// func updateOrder(w http.ResponseWriter, r *http.Request) { -// orderNumber := r.FormValue("orderNumber") -// resource := auth.Resource{Type: "customerOrder", Name: orderNumber} -// access := auth.Access{Resource: resource, Action: "update"} -// -// if ctx, err := accessController.Authorized(ctx, access); err != nil { -// if challenge, ok := err.(auth.Challenge) { -// // Let the challenge write the response. -// challenge.SetHeaders(w) -// w.WriteHeader(http.StatusUnauthorized) -// return -// } else { -// // Some other error. -// } -// } -// } -// -package auth - -import ( - "errors" - "fmt" - "net/http" - - "github.com/docker/distribution/context" -) - -const ( - // UserKey is used to get the user object from - // a user context - UserKey = "auth.user" - - // UserNameKey is used to get the user name from - // a user context - UserNameKey = "auth.user.name" -) - -var ( - // ErrInvalidCredential is returned when the auth token does not authenticate correctly. - ErrInvalidCredential = errors.New("invalid authorization credential") - - // ErrAuthenticationFailure returned when authentication fails. - ErrAuthenticationFailure = errors.New("authentication failure") -) - -// UserInfo carries information about -// an autenticated/authorized client. -type UserInfo struct { - Name string -} - -// Resource describes a resource by type and name. -type Resource struct { - Type string - Class string - Name string -} - -// Access describes a specific action that is -// requested or allowed for a given resource. -type Access struct { - Resource - Action string -} - -// Challenge is a special error type which is used for HTTP 401 Unauthorized -// responses and is able to write the response with WWW-Authenticate challenge -// header values based on the error. -type Challenge interface { - error - - // SetHeaders prepares the request to conduct a challenge response by - // adding the an HTTP challenge header on the response message. Callers - // are expected to set the appropriate HTTP status code (e.g. 401) - // themselves. - SetHeaders(w http.ResponseWriter) -} - -// AccessController controls access to registry resources based on a request -// and required access levels for a request. Implementations can support both -// complete denial and http authorization challenges. -type AccessController interface { - // Authorized returns a non-nil error if the context is granted access and - // returns a new authorized context. If one or more Access structs are - // provided, the requested access will be compared with what is available - // to the context. The given context will contain a "http.request" key with - // a `*http.Request` value. If the error is non-nil, access should always - // be denied. The error may be of type Challenge, in which case the caller - // may have the Challenge handle the request or choose what action to take - // based on the Challenge header or response status. The returned context - // object should have a "auth.user" value set to a UserInfo struct. - Authorized(ctx context.Context, access ...Access) (context.Context, error) -} - -// CredentialAuthenticator is an object which is able to authenticate credentials -type CredentialAuthenticator interface { - AuthenticateUser(username, password string) error -} - -// WithUser returns a context with the authorized user info. -func WithUser(ctx context.Context, user UserInfo) context.Context { - return userInfoContext{ - Context: ctx, - user: user, - } -} - -type userInfoContext struct { - context.Context - user UserInfo -} - -func (uic userInfoContext) Value(key interface{}) interface{} { - switch key { - case UserKey: - return uic.user - case UserNameKey: - return uic.user.Name - } - - return uic.Context.Value(key) -} - -// WithResources returns a context with the authorized resources. -func WithResources(ctx context.Context, resources []Resource) context.Context { - return resourceContext{ - Context: ctx, - resources: resources, - } -} - -type resourceContext struct { - context.Context - resources []Resource -} - -type resourceKey struct{} - -func (rc resourceContext) Value(key interface{}) interface{} { - if key == (resourceKey{}) { - return rc.resources - } - - return rc.Context.Value(key) -} - -// AuthorizedResources returns the list of resources which have -// been authorized for this request. -func AuthorizedResources(ctx context.Context) []Resource { - if resources, ok := ctx.Value(resourceKey{}).([]Resource); ok { - return resources - } - - return nil -} - -// InitFunc is the type of an AccessController factory function and is used -// to register the constructor for different AccesController backends. -type InitFunc func(options map[string]interface{}) (AccessController, error) - -var accessControllers map[string]InitFunc - -func init() { - accessControllers = make(map[string]InitFunc) -} - -// Register is used to register an InitFunc for -// an AccessController backend with the given name. -func Register(name string, initFunc InitFunc) error { - if _, exists := accessControllers[name]; exists { - return fmt.Errorf("name already registered: %s", name) - } - - accessControllers[name] = initFunc - - return nil -} - -// GetAccessController constructs an AccessController -// with the given options using the named backend. -func GetAccessController(name string, options map[string]interface{}) (AccessController, error) { - if initFunc, exists := accessControllers[name]; exists { - return initFunc(options) - } - - return nil, fmt.Errorf("no access controller registered with name: %s", name) -} diff --git a/vendor/github.com/docker/distribution/registry/auth/htpasswd/access.go b/vendor/github.com/docker/distribution/registry/auth/htpasswd/access.go deleted file mode 100644 index 819b09ca8..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/htpasswd/access.go +++ /dev/null @@ -1,115 +0,0 @@ -// Package htpasswd provides a simple authentication scheme that checks for the -// user credential hash in an htpasswd formatted file in a configuration-determined -// location. -// -// This authentication method MUST be used under TLS, as simple token-replay attack is possible. -package htpasswd - -import ( - "fmt" - "net/http" - "os" - "sync" - "time" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/auth" -) - -type accessController struct { - realm string - path string - modtime time.Time - mu sync.Mutex - htpasswd *htpasswd -} - -var _ auth.AccessController = &accessController{} - -func newAccessController(options map[string]interface{}) (auth.AccessController, error) { - realm, present := options["realm"] - if _, ok := realm.(string); !present || !ok { - return nil, fmt.Errorf(`"realm" must be set for htpasswd access controller`) - } - - path, present := options["path"] - if _, ok := path.(string); !present || !ok { - return nil, fmt.Errorf(`"path" must be set for htpasswd access controller`) - } - - return &accessController{realm: realm.(string), path: path.(string)}, nil -} - -func (ac *accessController) Authorized(ctx context.Context, accessRecords ...auth.Access) (context.Context, error) { - req, err := context.GetRequest(ctx) - if err != nil { - return nil, err - } - - username, password, ok := req.BasicAuth() - if !ok { - return nil, &challenge{ - realm: ac.realm, - err: auth.ErrInvalidCredential, - } - } - - // Dynamically parsing the latest account list - fstat, err := os.Stat(ac.path) - if err != nil { - return nil, err - } - - lastModified := fstat.ModTime() - ac.mu.Lock() - if ac.htpasswd == nil || !ac.modtime.Equal(lastModified) { - ac.modtime = lastModified - - f, err := os.Open(ac.path) - if err != nil { - ac.mu.Unlock() - return nil, err - } - defer f.Close() - - h, err := newHTPasswd(f) - if err != nil { - ac.mu.Unlock() - return nil, err - } - ac.htpasswd = h - } - localHTPasswd := ac.htpasswd - ac.mu.Unlock() - - if err := localHTPasswd.authenticateUser(username, password); err != nil { - context.GetLogger(ctx).Errorf("error authenticating user %q: %v", username, err) - return nil, &challenge{ - realm: ac.realm, - err: auth.ErrAuthenticationFailure, - } - } - - return auth.WithUser(ctx, auth.UserInfo{Name: username}), nil -} - -// challenge implements the auth.Challenge interface. -type challenge struct { - realm string - err error -} - -var _ auth.Challenge = challenge{} - -// SetHeaders sets the basic challenge header on the response. -func (ch challenge) SetHeaders(w http.ResponseWriter) { - w.Header().Set("WWW-Authenticate", fmt.Sprintf("Basic realm=%q", ch.realm)) -} - -func (ch challenge) Error() string { - return fmt.Sprintf("basic authentication challenge for realm %q: %s", ch.realm, ch.err) -} - -func init() { - auth.Register("htpasswd", auth.InitFunc(newAccessController)) -} diff --git a/vendor/github.com/docker/distribution/registry/auth/htpasswd/access_test.go b/vendor/github.com/docker/distribution/registry/auth/htpasswd/access_test.go deleted file mode 100644 index 553f05cf9..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/htpasswd/access_test.go +++ /dev/null @@ -1,122 +0,0 @@ -package htpasswd - -import ( - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/auth" -) - -func TestBasicAccessController(t *testing.T) { - testRealm := "The-Shire" - testUsers := []string{"bilbo", "frodo", "MiShil", "DeokMan"} - testPasswords := []string{"baggins", "baggins", "새주", "공주님"} - testHtpasswdContent := `bilbo:{SHA}5siv5c0SHx681xU6GiSx9ZQryqs= - frodo:$2y$05$926C3y10Quzn/LnqQH86VOEVh/18T6RnLaS.khre96jLNL/7e.K5W - MiShil:$2y$05$0oHgwMehvoe8iAWS8I.7l.KoECXrwVaC16RPfaSCU5eVTFrATuMI2 - DeokMan:공주님` - - tempFile, err := ioutil.TempFile("", "htpasswd-test") - if err != nil { - t.Fatal("could not create temporary htpasswd file") - } - if _, err = tempFile.WriteString(testHtpasswdContent); err != nil { - t.Fatal("could not write temporary htpasswd file") - } - - options := map[string]interface{}{ - "realm": testRealm, - "path": tempFile.Name(), - } - ctx := context.Background() - - accessController, err := newAccessController(options) - if err != nil { - t.Fatal("error creating access controller") - } - - tempFile.Close() - - var userNumber = 0 - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx := context.WithRequest(ctx, r) - authCtx, err := accessController.Authorized(ctx) - if err != nil { - switch err := err.(type) { - case auth.Challenge: - err.SetHeaders(w) - w.WriteHeader(http.StatusUnauthorized) - return - default: - t.Fatalf("unexpected error authorizing request: %v", err) - } - } - - userInfo, ok := authCtx.Value(auth.UserKey).(auth.UserInfo) - if !ok { - t.Fatal("basic accessController did not set auth.user context") - } - - if userInfo.Name != testUsers[userNumber] { - t.Fatalf("expected user name %q, got %q", testUsers[userNumber], userInfo.Name) - } - - w.WriteHeader(http.StatusNoContent) - })) - - client := &http.Client{ - CheckRedirect: nil, - } - - req, _ := http.NewRequest("GET", server.URL, nil) - resp, err := client.Do(req) - - if err != nil { - t.Fatalf("unexpected error during GET: %v", err) - } - defer resp.Body.Close() - - // Request should not be authorized - if resp.StatusCode != http.StatusUnauthorized { - t.Fatalf("unexpected non-fail response status: %v != %v", resp.StatusCode, http.StatusUnauthorized) - } - - nonbcrypt := map[string]struct{}{ - "bilbo": {}, - "DeokMan": {}, - } - - for i := 0; i < len(testUsers); i++ { - userNumber = i - req, err := http.NewRequest("GET", server.URL, nil) - if err != nil { - t.Fatalf("error allocating new request: %v", err) - } - - req.SetBasicAuth(testUsers[i], testPasswords[i]) - - resp, err = client.Do(req) - if err != nil { - t.Fatalf("unexpected error during GET: %v", err) - } - defer resp.Body.Close() - - if _, ok := nonbcrypt[testUsers[i]]; ok { - // these are not allowed. - // Request should be authorized - if resp.StatusCode != http.StatusUnauthorized { - t.Fatalf("unexpected non-success response status: %v != %v for %s %s", resp.StatusCode, http.StatusUnauthorized, testUsers[i], testPasswords[i]) - } - } else { - // Request should be authorized - if resp.StatusCode != http.StatusNoContent { - t.Fatalf("unexpected non-success response status: %v != %v for %s %s", resp.StatusCode, http.StatusNoContent, testUsers[i], testPasswords[i]) - } - } - } - -} diff --git a/vendor/github.com/docker/distribution/registry/auth/htpasswd/htpasswd.go b/vendor/github.com/docker/distribution/registry/auth/htpasswd/htpasswd.go deleted file mode 100644 index b10b256c7..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/htpasswd/htpasswd.go +++ /dev/null @@ -1,82 +0,0 @@ -package htpasswd - -import ( - "bufio" - "fmt" - "io" - "strings" - - "github.com/docker/distribution/registry/auth" - - "golang.org/x/crypto/bcrypt" -) - -// htpasswd holds a path to a system .htpasswd file and the machinery to parse -// it. Only bcrypt hash entries are supported. -type htpasswd struct { - entries map[string][]byte // maps username to password byte slice. -} - -// newHTPasswd parses the reader and returns an htpasswd or an error. -func newHTPasswd(rd io.Reader) (*htpasswd, error) { - entries, err := parseHTPasswd(rd) - if err != nil { - return nil, err - } - - return &htpasswd{entries: entries}, nil -} - -// AuthenticateUser checks a given user:password credential against the -// receiving HTPasswd's file. If the check passes, nil is returned. -func (htpasswd *htpasswd) authenticateUser(username string, password string) error { - credentials, ok := htpasswd.entries[username] - if !ok { - // timing attack paranoia - bcrypt.CompareHashAndPassword([]byte{}, []byte(password)) - - return auth.ErrAuthenticationFailure - } - - err := bcrypt.CompareHashAndPassword([]byte(credentials), []byte(password)) - if err != nil { - return auth.ErrAuthenticationFailure - } - - return nil -} - -// parseHTPasswd parses the contents of htpasswd. This will read all the -// entries in the file, whether or not they are needed. An error is returned -// if a syntax errors are encountered or if the reader fails. -func parseHTPasswd(rd io.Reader) (map[string][]byte, error) { - entries := map[string][]byte{} - scanner := bufio.NewScanner(rd) - var line int - for scanner.Scan() { - line++ // 1-based line numbering - t := strings.TrimSpace(scanner.Text()) - - if len(t) < 1 { - continue - } - - // lines that *begin* with a '#' are considered comments - if t[0] == '#' { - continue - } - - i := strings.Index(t, ":") - if i < 0 || i >= len(t) { - return nil, fmt.Errorf("htpasswd: invalid entry at line %d: %q", line, scanner.Text()) - } - - entries[t[:i]] = []byte(t[i+1:]) - } - - if err := scanner.Err(); err != nil { - return nil, err - } - - return entries, nil -} diff --git a/vendor/github.com/docker/distribution/registry/auth/htpasswd/htpasswd_test.go b/vendor/github.com/docker/distribution/registry/auth/htpasswd/htpasswd_test.go deleted file mode 100644 index 309c359ad..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/htpasswd/htpasswd_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package htpasswd - -import ( - "fmt" - "reflect" - "strings" - "testing" -) - -func TestParseHTPasswd(t *testing.T) { - - for _, tc := range []struct { - desc string - input string - err error - entries map[string][]byte - }{ - { - desc: "basic example", - input: ` -# This is a comment in a basic example. -bilbo:{SHA}5siv5c0SHx681xU6GiSx9ZQryqs= -frodo:$2y$05$926C3y10Quzn/LnqQH86VOEVh/18T6RnLaS.khre96jLNL/7e.K5W -MiShil:$2y$05$0oHgwMehvoe8iAWS8I.7l.KoECXrwVaC16RPfaSCU5eVTFrATuMI2 -DeokMan:공주님 -`, - entries: map[string][]byte{ - "bilbo": []byte("{SHA}5siv5c0SHx681xU6GiSx9ZQryqs="), - "frodo": []byte("$2y$05$926C3y10Quzn/LnqQH86VOEVh/18T6RnLaS.khre96jLNL/7e.K5W"), - "MiShil": []byte("$2y$05$0oHgwMehvoe8iAWS8I.7l.KoECXrwVaC16RPfaSCU5eVTFrATuMI2"), - "DeokMan": []byte("공주님"), - }, - }, - { - desc: "ensures comments are filtered", - input: ` -# asdf:asdf -`, - }, - { - desc: "ensure midline hash is not comment", - input: ` -asdf:as#df -`, - entries: map[string][]byte{ - "asdf": []byte("as#df"), - }, - }, - { - desc: "ensure midline hash is not comment", - input: ` -# A valid comment -valid:entry -asdf -`, - err: fmt.Errorf(`htpasswd: invalid entry at line 4: "asdf"`), - }, - } { - - entries, err := parseHTPasswd(strings.NewReader(tc.input)) - if err != tc.err { - if tc.err == nil { - t.Fatalf("%s: unexpected error: %v", tc.desc, err) - } else { - if err.Error() != tc.err.Error() { // use string equality here. - t.Fatalf("%s: expected error not returned: %v != %v", tc.desc, err, tc.err) - } - } - } - - if tc.err != nil { - continue // don't test output - } - - // allow empty and nil to be equal - if tc.entries == nil { - tc.entries = map[string][]byte{} - } - - if !reflect.DeepEqual(entries, tc.entries) { - t.Fatalf("%s: entries not parsed correctly: %v != %v", tc.desc, entries, tc.entries) - } - } - -} diff --git a/vendor/github.com/docker/distribution/registry/auth/silly/access.go b/vendor/github.com/docker/distribution/registry/auth/silly/access.go deleted file mode 100644 index 2b801d946..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/silly/access.go +++ /dev/null @@ -1,97 +0,0 @@ -// Package silly provides a simple authentication scheme that checks for the -// existence of an Authorization header and issues access if is present and -// non-empty. -// -// This package is present as an example implementation of a minimal -// auth.AccessController and for testing. This is not suitable for any kind of -// production security. -package silly - -import ( - "fmt" - "net/http" - "strings" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/auth" -) - -// accessController provides a simple implementation of auth.AccessController -// that simply checks for a non-empty Authorization header. It is useful for -// demonstration and testing. -type accessController struct { - realm string - service string -} - -var _ auth.AccessController = &accessController{} - -func newAccessController(options map[string]interface{}) (auth.AccessController, error) { - realm, present := options["realm"] - if _, ok := realm.(string); !present || !ok { - return nil, fmt.Errorf(`"realm" must be set for silly access controller`) - } - - service, present := options["service"] - if _, ok := service.(string); !present || !ok { - return nil, fmt.Errorf(`"service" must be set for silly access controller`) - } - - return &accessController{realm: realm.(string), service: service.(string)}, nil -} - -// Authorized simply checks for the existence of the authorization header, -// responding with a bearer challenge if it doesn't exist. -func (ac *accessController) Authorized(ctx context.Context, accessRecords ...auth.Access) (context.Context, error) { - req, err := context.GetRequest(ctx) - if err != nil { - return nil, err - } - - if req.Header.Get("Authorization") == "" { - challenge := challenge{ - realm: ac.realm, - service: ac.service, - } - - if len(accessRecords) > 0 { - var scopes []string - for _, access := range accessRecords { - scopes = append(scopes, fmt.Sprintf("%s:%s:%s", access.Type, access.Resource.Name, access.Action)) - } - challenge.scope = strings.Join(scopes, " ") - } - - return nil, &challenge - } - - return auth.WithUser(ctx, auth.UserInfo{Name: "silly"}), nil -} - -type challenge struct { - realm string - service string - scope string -} - -var _ auth.Challenge = challenge{} - -// SetHeaders sets a simple bearer challenge on the response. -func (ch challenge) SetHeaders(w http.ResponseWriter) { - header := fmt.Sprintf("Bearer realm=%q,service=%q", ch.realm, ch.service) - - if ch.scope != "" { - header = fmt.Sprintf("%s,scope=%q", header, ch.scope) - } - - w.Header().Set("WWW-Authenticate", header) -} - -func (ch challenge) Error() string { - return fmt.Sprintf("silly authentication challenge: %#v", ch) -} - -// init registers the silly auth backend. -func init() { - auth.Register("silly", auth.InitFunc(newAccessController)) -} diff --git a/vendor/github.com/docker/distribution/registry/auth/silly/access_test.go b/vendor/github.com/docker/distribution/registry/auth/silly/access_test.go deleted file mode 100644 index 0a5103e6c..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/silly/access_test.go +++ /dev/null @@ -1,71 +0,0 @@ -package silly - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/auth" -) - -func TestSillyAccessController(t *testing.T) { - ac := &accessController{ - realm: "test-realm", - service: "test-service", - } - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx := context.WithRequest(context.Background(), r) - authCtx, err := ac.Authorized(ctx) - if err != nil { - switch err := err.(type) { - case auth.Challenge: - err.SetHeaders(w) - w.WriteHeader(http.StatusUnauthorized) - return - default: - t.Fatalf("unexpected error authorizing request: %v", err) - } - } - - userInfo, ok := authCtx.Value(auth.UserKey).(auth.UserInfo) - if !ok { - t.Fatal("silly accessController did not set auth.user context") - } - - if userInfo.Name != "silly" { - t.Fatalf("expected user name %q, got %q", "silly", userInfo.Name) - } - - w.WriteHeader(http.StatusNoContent) - })) - - resp, err := http.Get(server.URL) - if err != nil { - t.Fatalf("unexpected error during GET: %v", err) - } - defer resp.Body.Close() - - // Request should not be authorized - if resp.StatusCode != http.StatusUnauthorized { - t.Fatalf("unexpected response status: %v != %v", resp.StatusCode, http.StatusUnauthorized) - } - - req, err := http.NewRequest("GET", server.URL, nil) - if err != nil { - t.Fatalf("unexpected error creating new request: %v", err) - } - req.Header.Set("Authorization", "seriously, anything") - - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("unexpected error during GET: %v", err) - } - defer resp.Body.Close() - - // Request should not be authorized - if resp.StatusCode != http.StatusNoContent { - t.Fatalf("unexpected response status: %v != %v", resp.StatusCode, http.StatusNoContent) - } -} diff --git a/vendor/github.com/docker/distribution/registry/auth/token/accesscontroller.go b/vendor/github.com/docker/distribution/registry/auth/token/accesscontroller.go deleted file mode 100644 index 4e8b7f1ce..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/token/accesscontroller.go +++ /dev/null @@ -1,272 +0,0 @@ -package token - -import ( - "crypto" - "crypto/x509" - "encoding/pem" - "errors" - "fmt" - "io/ioutil" - "net/http" - "os" - "strings" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/auth" - "github.com/docker/libtrust" -) - -// accessSet maps a typed, named resource to -// a set of actions requested or authorized. -type accessSet map[auth.Resource]actionSet - -// newAccessSet constructs an accessSet from -// a variable number of auth.Access items. -func newAccessSet(accessItems ...auth.Access) accessSet { - accessSet := make(accessSet, len(accessItems)) - - for _, access := range accessItems { - resource := auth.Resource{ - Type: access.Type, - Name: access.Name, - } - - set, exists := accessSet[resource] - if !exists { - set = newActionSet() - accessSet[resource] = set - } - - set.add(access.Action) - } - - return accessSet -} - -// contains returns whether or not the given access is in this accessSet. -func (s accessSet) contains(access auth.Access) bool { - actionSet, ok := s[access.Resource] - if ok { - return actionSet.contains(access.Action) - } - - return false -} - -// scopeParam returns a collection of scopes which can -// be used for a WWW-Authenticate challenge parameter. -// See https://tools.ietf.org/html/rfc6750#section-3 -func (s accessSet) scopeParam() string { - scopes := make([]string, 0, len(s)) - - for resource, actionSet := range s { - actions := strings.Join(actionSet.keys(), ",") - scopes = append(scopes, fmt.Sprintf("%s:%s:%s", resource.Type, resource.Name, actions)) - } - - return strings.Join(scopes, " ") -} - -// Errors used and exported by this package. -var ( - ErrInsufficientScope = errors.New("insufficient scope") - ErrTokenRequired = errors.New("authorization token required") -) - -// authChallenge implements the auth.Challenge interface. -type authChallenge struct { - err error - realm string - service string - accessSet accessSet -} - -var _ auth.Challenge = authChallenge{} - -// Error returns the internal error string for this authChallenge. -func (ac authChallenge) Error() string { - return ac.err.Error() -} - -// Status returns the HTTP Response Status Code for this authChallenge. -func (ac authChallenge) Status() int { - return http.StatusUnauthorized -} - -// challengeParams constructs the value to be used in -// the WWW-Authenticate response challenge header. -// See https://tools.ietf.org/html/rfc6750#section-3 -func (ac authChallenge) challengeParams() string { - str := fmt.Sprintf("Bearer realm=%q,service=%q", ac.realm, ac.service) - - if scope := ac.accessSet.scopeParam(); scope != "" { - str = fmt.Sprintf("%s,scope=%q", str, scope) - } - - if ac.err == ErrInvalidToken || ac.err == ErrMalformedToken { - str = fmt.Sprintf("%s,error=%q", str, "invalid_token") - } else if ac.err == ErrInsufficientScope { - str = fmt.Sprintf("%s,error=%q", str, "insufficient_scope") - } - - return str -} - -// SetChallenge sets the WWW-Authenticate value for the response. -func (ac authChallenge) SetHeaders(w http.ResponseWriter) { - w.Header().Add("WWW-Authenticate", ac.challengeParams()) -} - -// accessController implements the auth.AccessController interface. -type accessController struct { - realm string - issuer string - service string - rootCerts *x509.CertPool - trustedKeys map[string]libtrust.PublicKey -} - -// tokenAccessOptions is a convenience type for handling -// options to the contstructor of an accessController. -type tokenAccessOptions struct { - realm string - issuer string - service string - rootCertBundle string -} - -// checkOptions gathers the necessary options -// for an accessController from the given map. -func checkOptions(options map[string]interface{}) (tokenAccessOptions, error) { - var opts tokenAccessOptions - - keys := []string{"realm", "issuer", "service", "rootcertbundle"} - vals := make([]string, 0, len(keys)) - for _, key := range keys { - val, ok := options[key].(string) - if !ok { - return opts, fmt.Errorf("token auth requires a valid option string: %q", key) - } - vals = append(vals, val) - } - - opts.realm, opts.issuer, opts.service, opts.rootCertBundle = vals[0], vals[1], vals[2], vals[3] - - return opts, nil -} - -// newAccessController creates an accessController using the given options. -func newAccessController(options map[string]interface{}) (auth.AccessController, error) { - config, err := checkOptions(options) - if err != nil { - return nil, err - } - - fp, err := os.Open(config.rootCertBundle) - if err != nil { - return nil, fmt.Errorf("unable to open token auth root certificate bundle file %q: %s", config.rootCertBundle, err) - } - defer fp.Close() - - rawCertBundle, err := ioutil.ReadAll(fp) - if err != nil { - return nil, fmt.Errorf("unable to read token auth root certificate bundle file %q: %s", config.rootCertBundle, err) - } - - var rootCerts []*x509.Certificate - pemBlock, rawCertBundle := pem.Decode(rawCertBundle) - for pemBlock != nil { - if pemBlock.Type == "CERTIFICATE" { - cert, err := x509.ParseCertificate(pemBlock.Bytes) - if err != nil { - return nil, fmt.Errorf("unable to parse token auth root certificate: %s", err) - } - - rootCerts = append(rootCerts, cert) - } - - pemBlock, rawCertBundle = pem.Decode(rawCertBundle) - } - - if len(rootCerts) == 0 { - return nil, errors.New("token auth requires at least one token signing root certificate") - } - - rootPool := x509.NewCertPool() - trustedKeys := make(map[string]libtrust.PublicKey, len(rootCerts)) - for _, rootCert := range rootCerts { - rootPool.AddCert(rootCert) - pubKey, err := libtrust.FromCryptoPublicKey(crypto.PublicKey(rootCert.PublicKey)) - if err != nil { - return nil, fmt.Errorf("unable to get public key from token auth root certificate: %s", err) - } - trustedKeys[pubKey.KeyID()] = pubKey - } - - return &accessController{ - realm: config.realm, - issuer: config.issuer, - service: config.service, - rootCerts: rootPool, - trustedKeys: trustedKeys, - }, nil -} - -// Authorized handles checking whether the given request is authorized -// for actions on resources described by the given access items. -func (ac *accessController) Authorized(ctx context.Context, accessItems ...auth.Access) (context.Context, error) { - challenge := &authChallenge{ - realm: ac.realm, - service: ac.service, - accessSet: newAccessSet(accessItems...), - } - - req, err := context.GetRequest(ctx) - if err != nil { - return nil, err - } - - parts := strings.Split(req.Header.Get("Authorization"), " ") - - if len(parts) != 2 || strings.ToLower(parts[0]) != "bearer" { - challenge.err = ErrTokenRequired - return nil, challenge - } - - rawToken := parts[1] - - token, err := NewToken(rawToken) - if err != nil { - challenge.err = err - return nil, challenge - } - - verifyOpts := VerifyOptions{ - TrustedIssuers: []string{ac.issuer}, - AcceptedAudiences: []string{ac.service}, - Roots: ac.rootCerts, - TrustedKeys: ac.trustedKeys, - } - - if err = token.Verify(verifyOpts); err != nil { - challenge.err = err - return nil, challenge - } - - accessSet := token.accessSet() - for _, access := range accessItems { - if !accessSet.contains(access) { - challenge.err = ErrInsufficientScope - return nil, challenge - } - } - - ctx = auth.WithResources(ctx, token.resources()) - - return auth.WithUser(ctx, auth.UserInfo{Name: token.Claims.Subject}), nil -} - -// init handles registering the token auth backend. -func init() { - auth.Register("token", auth.InitFunc(newAccessController)) -} diff --git a/vendor/github.com/docker/distribution/registry/auth/token/stringset.go b/vendor/github.com/docker/distribution/registry/auth/token/stringset.go deleted file mode 100644 index 1d04f104c..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/token/stringset.go +++ /dev/null @@ -1,35 +0,0 @@ -package token - -// StringSet is a useful type for looking up strings. -type stringSet map[string]struct{} - -// NewStringSet creates a new StringSet with the given strings. -func newStringSet(keys ...string) stringSet { - ss := make(stringSet, len(keys)) - ss.add(keys...) - return ss -} - -// Add inserts the given keys into this StringSet. -func (ss stringSet) add(keys ...string) { - for _, key := range keys { - ss[key] = struct{}{} - } -} - -// Contains returns whether the given key is in this StringSet. -func (ss stringSet) contains(key string) bool { - _, ok := ss[key] - return ok -} - -// Keys returns a slice of all keys in this StringSet. -func (ss stringSet) keys() []string { - keys := make([]string, 0, len(ss)) - - for key := range ss { - keys = append(keys, key) - } - - return keys -} diff --git a/vendor/github.com/docker/distribution/registry/auth/token/token.go b/vendor/github.com/docker/distribution/registry/auth/token/token.go deleted file mode 100644 index 850f5813f..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/token/token.go +++ /dev/null @@ -1,378 +0,0 @@ -package token - -import ( - "crypto" - "crypto/x509" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "strings" - "time" - - log "github.com/Sirupsen/logrus" - "github.com/docker/libtrust" - - "github.com/docker/distribution/registry/auth" -) - -const ( - // TokenSeparator is the value which separates the header, claims, and - // signature in the compact serialization of a JSON Web Token. - TokenSeparator = "." - // Leeway is the Duration that will be added to NBF and EXP claim - // checks to account for clock skew as per https://tools.ietf.org/html/rfc7519#section-4.1.5 - Leeway = 60 * time.Second -) - -// Errors used by token parsing and verification. -var ( - ErrMalformedToken = errors.New("malformed token") - ErrInvalidToken = errors.New("invalid token") -) - -// ResourceActions stores allowed actions on a named and typed resource. -type ResourceActions struct { - Type string `json:"type"` - Class string `json:"class,omitempty"` - Name string `json:"name"` - Actions []string `json:"actions"` -} - -// ClaimSet describes the main section of a JSON Web Token. -type ClaimSet struct { - // Public claims - Issuer string `json:"iss"` - Subject string `json:"sub"` - Audience string `json:"aud"` - Expiration int64 `json:"exp"` - NotBefore int64 `json:"nbf"` - IssuedAt int64 `json:"iat"` - JWTID string `json:"jti"` - - // Private claims - Access []*ResourceActions `json:"access"` -} - -// Header describes the header section of a JSON Web Token. -type Header struct { - Type string `json:"typ"` - SigningAlg string `json:"alg"` - KeyID string `json:"kid,omitempty"` - X5c []string `json:"x5c,omitempty"` - RawJWK *json.RawMessage `json:"jwk,omitempty"` -} - -// Token describes a JSON Web Token. -type Token struct { - Raw string - Header *Header - Claims *ClaimSet - Signature []byte -} - -// VerifyOptions is used to specify -// options when verifying a JSON Web Token. -type VerifyOptions struct { - TrustedIssuers []string - AcceptedAudiences []string - Roots *x509.CertPool - TrustedKeys map[string]libtrust.PublicKey -} - -// NewToken parses the given raw token string -// and constructs an unverified JSON Web Token. -func NewToken(rawToken string) (*Token, error) { - parts := strings.Split(rawToken, TokenSeparator) - if len(parts) != 3 { - return nil, ErrMalformedToken - } - - var ( - rawHeader, rawClaims = parts[0], parts[1] - headerJSON, claimsJSON []byte - err error - ) - - defer func() { - if err != nil { - log.Infof("error while unmarshalling raw token: %s", err) - } - }() - - if headerJSON, err = joseBase64UrlDecode(rawHeader); err != nil { - err = fmt.Errorf("unable to decode header: %s", err) - return nil, ErrMalformedToken - } - - if claimsJSON, err = joseBase64UrlDecode(rawClaims); err != nil { - err = fmt.Errorf("unable to decode claims: %s", err) - return nil, ErrMalformedToken - } - - token := new(Token) - token.Header = new(Header) - token.Claims = new(ClaimSet) - - token.Raw = strings.Join(parts[:2], TokenSeparator) - if token.Signature, err = joseBase64UrlDecode(parts[2]); err != nil { - err = fmt.Errorf("unable to decode signature: %s", err) - return nil, ErrMalformedToken - } - - if err = json.Unmarshal(headerJSON, token.Header); err != nil { - return nil, ErrMalformedToken - } - - if err = json.Unmarshal(claimsJSON, token.Claims); err != nil { - return nil, ErrMalformedToken - } - - return token, nil -} - -// Verify attempts to verify this token using the given options. -// Returns a nil error if the token is valid. -func (t *Token) Verify(verifyOpts VerifyOptions) error { - // Verify that the Issuer claim is a trusted authority. - if !contains(verifyOpts.TrustedIssuers, t.Claims.Issuer) { - log.Infof("token from untrusted issuer: %q", t.Claims.Issuer) - return ErrInvalidToken - } - - // Verify that the Audience claim is allowed. - if !contains(verifyOpts.AcceptedAudiences, t.Claims.Audience) { - log.Infof("token intended for another audience: %q", t.Claims.Audience) - return ErrInvalidToken - } - - // Verify that the token is currently usable and not expired. - currentTime := time.Now() - - ExpWithLeeway := time.Unix(t.Claims.Expiration, 0).Add(Leeway) - if currentTime.After(ExpWithLeeway) { - log.Infof("token not to be used after %s - currently %s", ExpWithLeeway, currentTime) - return ErrInvalidToken - } - - NotBeforeWithLeeway := time.Unix(t.Claims.NotBefore, 0).Add(-Leeway) - if currentTime.Before(NotBeforeWithLeeway) { - log.Infof("token not to be used before %s - currently %s", NotBeforeWithLeeway, currentTime) - return ErrInvalidToken - } - - // Verify the token signature. - if len(t.Signature) == 0 { - log.Info("token has no signature") - return ErrInvalidToken - } - - // Verify that the signing key is trusted. - signingKey, err := t.VerifySigningKey(verifyOpts) - if err != nil { - log.Info(err) - return ErrInvalidToken - } - - // Finally, verify the signature of the token using the key which signed it. - if err := signingKey.Verify(strings.NewReader(t.Raw), t.Header.SigningAlg, t.Signature); err != nil { - log.Infof("unable to verify token signature: %s", err) - return ErrInvalidToken - } - - return nil -} - -// VerifySigningKey attempts to get the key which was used to sign this token. -// The token header should contain either of these 3 fields: -// `x5c` - The x509 certificate chain for the signing key. Needs to be -// verified. -// `jwk` - The JSON Web Key representation of the signing key. -// May contain its own `x5c` field which needs to be verified. -// `kid` - The unique identifier for the key. This library interprets it -// as a libtrust fingerprint. The key itself can be looked up in -// the trustedKeys field of the given verify options. -// Each of these methods are tried in that order of preference until the -// signing key is found or an error is returned. -func (t *Token) VerifySigningKey(verifyOpts VerifyOptions) (signingKey libtrust.PublicKey, err error) { - // First attempt to get an x509 certificate chain from the header. - var ( - x5c = t.Header.X5c - rawJWK = t.Header.RawJWK - keyID = t.Header.KeyID - ) - - switch { - case len(x5c) > 0: - signingKey, err = parseAndVerifyCertChain(x5c, verifyOpts.Roots) - case rawJWK != nil: - signingKey, err = parseAndVerifyRawJWK(rawJWK, verifyOpts) - case len(keyID) > 0: - signingKey = verifyOpts.TrustedKeys[keyID] - if signingKey == nil { - err = fmt.Errorf("token signed by untrusted key with ID: %q", keyID) - } - default: - err = errors.New("unable to get token signing key") - } - - return -} - -func parseAndVerifyCertChain(x5c []string, roots *x509.CertPool) (leafKey libtrust.PublicKey, err error) { - if len(x5c) == 0 { - return nil, errors.New("empty x509 certificate chain") - } - - // Ensure the first element is encoded correctly. - leafCertDer, err := base64.StdEncoding.DecodeString(x5c[0]) - if err != nil { - return nil, fmt.Errorf("unable to decode leaf certificate: %s", err) - } - - // And that it is a valid x509 certificate. - leafCert, err := x509.ParseCertificate(leafCertDer) - if err != nil { - return nil, fmt.Errorf("unable to parse leaf certificate: %s", err) - } - - // The rest of the certificate chain are intermediate certificates. - intermediates := x509.NewCertPool() - for i := 1; i < len(x5c); i++ { - intermediateCertDer, err := base64.StdEncoding.DecodeString(x5c[i]) - if err != nil { - return nil, fmt.Errorf("unable to decode intermediate certificate: %s", err) - } - - intermediateCert, err := x509.ParseCertificate(intermediateCertDer) - if err != nil { - return nil, fmt.Errorf("unable to parse intermediate certificate: %s", err) - } - - intermediates.AddCert(intermediateCert) - } - - verifyOpts := x509.VerifyOptions{ - Intermediates: intermediates, - Roots: roots, - KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageAny}, - } - - // TODO: this call returns certificate chains which we ignore for now, but - // we should check them for revocations if we have the ability later. - if _, err = leafCert.Verify(verifyOpts); err != nil { - return nil, fmt.Errorf("unable to verify certificate chain: %s", err) - } - - // Get the public key from the leaf certificate. - leafCryptoKey, ok := leafCert.PublicKey.(crypto.PublicKey) - if !ok { - return nil, errors.New("unable to get leaf cert public key value") - } - - leafKey, err = libtrust.FromCryptoPublicKey(leafCryptoKey) - if err != nil { - return nil, fmt.Errorf("unable to make libtrust public key from leaf certificate: %s", err) - } - - return -} - -func parseAndVerifyRawJWK(rawJWK *json.RawMessage, verifyOpts VerifyOptions) (pubKey libtrust.PublicKey, err error) { - pubKey, err = libtrust.UnmarshalPublicKeyJWK([]byte(*rawJWK)) - if err != nil { - return nil, fmt.Errorf("unable to decode raw JWK value: %s", err) - } - - // Check to see if the key includes a certificate chain. - x5cVal, ok := pubKey.GetExtendedField("x5c").([]interface{}) - if !ok { - // The JWK should be one of the trusted root keys. - if _, trusted := verifyOpts.TrustedKeys[pubKey.KeyID()]; !trusted { - return nil, errors.New("untrusted JWK with no certificate chain") - } - - // The JWK is one of the trusted keys. - return - } - - // Ensure each item in the chain is of the correct type. - x5c := make([]string, len(x5cVal)) - for i, val := range x5cVal { - certString, ok := val.(string) - if !ok || len(certString) == 0 { - return nil, errors.New("malformed certificate chain") - } - x5c[i] = certString - } - - // Ensure that the x509 certificate chain can - // be verified up to one of our trusted roots. - leafKey, err := parseAndVerifyCertChain(x5c, verifyOpts.Roots) - if err != nil { - return nil, fmt.Errorf("could not verify JWK certificate chain: %s", err) - } - - // Verify that the public key in the leaf cert *is* the signing key. - if pubKey.KeyID() != leafKey.KeyID() { - return nil, errors.New("leaf certificate public key ID does not match JWK key ID") - } - - return -} - -// accessSet returns a set of actions available for the resource -// actions listed in the `access` section of this token. -func (t *Token) accessSet() accessSet { - if t.Claims == nil { - return nil - } - - accessSet := make(accessSet, len(t.Claims.Access)) - - for _, resourceActions := range t.Claims.Access { - resource := auth.Resource{ - Type: resourceActions.Type, - Name: resourceActions.Name, - } - - set, exists := accessSet[resource] - if !exists { - set = newActionSet() - accessSet[resource] = set - } - - for _, action := range resourceActions.Actions { - set.add(action) - } - } - - return accessSet -} - -func (t *Token) resources() []auth.Resource { - if t.Claims == nil { - return nil - } - - resourceSet := map[auth.Resource]struct{}{} - for _, resourceActions := range t.Claims.Access { - resource := auth.Resource{ - Type: resourceActions.Type, - Class: resourceActions.Class, - Name: resourceActions.Name, - } - resourceSet[resource] = struct{}{} - } - - resources := make([]auth.Resource, 0, len(resourceSet)) - for resource := range resourceSet { - resources = append(resources, resource) - } - - return resources -} - -func (t *Token) compactRaw() string { - return fmt.Sprintf("%s.%s", t.Raw, joseBase64UrlEncode(t.Signature)) -} diff --git a/vendor/github.com/docker/distribution/registry/auth/token/token_test.go b/vendor/github.com/docker/distribution/registry/auth/token/token_test.go deleted file mode 100644 index cbfe2a6b4..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/token/token_test.go +++ /dev/null @@ -1,510 +0,0 @@ -package token - -import ( - "crypto" - "crypto/rand" - "crypto/x509" - "encoding/base64" - "encoding/json" - "encoding/pem" - "fmt" - "io/ioutil" - "net/http" - "os" - "strings" - "testing" - "time" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/auth" - "github.com/docker/libtrust" -) - -func makeRootKeys(numKeys int) ([]libtrust.PrivateKey, error) { - keys := make([]libtrust.PrivateKey, 0, numKeys) - - for i := 0; i < numKeys; i++ { - key, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - return nil, err - } - keys = append(keys, key) - } - - return keys, nil -} - -func makeSigningKeyWithChain(rootKey libtrust.PrivateKey, depth int) (libtrust.PrivateKey, error) { - if depth == 0 { - // Don't need to build a chain. - return rootKey, nil - } - - var ( - x5c = make([]string, depth) - parentKey = rootKey - key libtrust.PrivateKey - cert *x509.Certificate - err error - ) - - for depth > 0 { - if key, err = libtrust.GenerateECP256PrivateKey(); err != nil { - return nil, err - } - - if cert, err = libtrust.GenerateCACert(parentKey, key); err != nil { - return nil, err - } - - depth-- - x5c[depth] = base64.StdEncoding.EncodeToString(cert.Raw) - parentKey = key - } - - key.AddExtendedField("x5c", x5c) - - return key, nil -} - -func makeRootCerts(rootKeys []libtrust.PrivateKey) ([]*x509.Certificate, error) { - certs := make([]*x509.Certificate, 0, len(rootKeys)) - - for _, key := range rootKeys { - cert, err := libtrust.GenerateCACert(key, key) - if err != nil { - return nil, err - } - certs = append(certs, cert) - } - - return certs, nil -} - -func makeTrustedKeyMap(rootKeys []libtrust.PrivateKey) map[string]libtrust.PublicKey { - trustedKeys := make(map[string]libtrust.PublicKey, len(rootKeys)) - - for _, key := range rootKeys { - trustedKeys[key.KeyID()] = key.PublicKey() - } - - return trustedKeys -} - -func makeTestToken(issuer, audience string, access []*ResourceActions, rootKey libtrust.PrivateKey, depth int, now time.Time, exp time.Time) (*Token, error) { - signingKey, err := makeSigningKeyWithChain(rootKey, depth) - if err != nil { - return nil, fmt.Errorf("unable to make signing key with chain: %s", err) - } - - var rawJWK json.RawMessage - rawJWK, err = signingKey.PublicKey().MarshalJSON() - if err != nil { - return nil, fmt.Errorf("unable to marshal signing key to JSON: %s", err) - } - - joseHeader := &Header{ - Type: "JWT", - SigningAlg: "ES256", - RawJWK: &rawJWK, - } - - randomBytes := make([]byte, 15) - if _, err = rand.Read(randomBytes); err != nil { - return nil, fmt.Errorf("unable to read random bytes for jwt id: %s", err) - } - - claimSet := &ClaimSet{ - Issuer: issuer, - Subject: "foo", - Audience: audience, - Expiration: exp.Unix(), - NotBefore: now.Unix(), - IssuedAt: now.Unix(), - JWTID: base64.URLEncoding.EncodeToString(randomBytes), - Access: access, - } - - var joseHeaderBytes, claimSetBytes []byte - - if joseHeaderBytes, err = json.Marshal(joseHeader); err != nil { - return nil, fmt.Errorf("unable to marshal jose header: %s", err) - } - if claimSetBytes, err = json.Marshal(claimSet); err != nil { - return nil, fmt.Errorf("unable to marshal claim set: %s", err) - } - - encodedJoseHeader := joseBase64UrlEncode(joseHeaderBytes) - encodedClaimSet := joseBase64UrlEncode(claimSetBytes) - encodingToSign := fmt.Sprintf("%s.%s", encodedJoseHeader, encodedClaimSet) - - var signatureBytes []byte - if signatureBytes, _, err = signingKey.Sign(strings.NewReader(encodingToSign), crypto.SHA256); err != nil { - return nil, fmt.Errorf("unable to sign jwt payload: %s", err) - } - - signature := joseBase64UrlEncode(signatureBytes) - tokenString := fmt.Sprintf("%s.%s", encodingToSign, signature) - - return NewToken(tokenString) -} - -// This test makes 4 tokens with a varying number of intermediate -// certificates ranging from no intermediate chain to a length of 3 -// intermediates. -func TestTokenVerify(t *testing.T) { - var ( - numTokens = 4 - issuer = "test-issuer" - audience = "test-audience" - access = []*ResourceActions{ - { - Type: "repository", - Name: "foo/bar", - Actions: []string{"pull", "push"}, - }, - } - ) - - rootKeys, err := makeRootKeys(numTokens) - if err != nil { - t.Fatal(err) - } - - rootCerts, err := makeRootCerts(rootKeys) - if err != nil { - t.Fatal(err) - } - - rootPool := x509.NewCertPool() - for _, rootCert := range rootCerts { - rootPool.AddCert(rootCert) - } - - trustedKeys := makeTrustedKeyMap(rootKeys) - - tokens := make([]*Token, 0, numTokens) - - for i := 0; i < numTokens; i++ { - token, err := makeTestToken(issuer, audience, access, rootKeys[i], i, time.Now(), time.Now().Add(5*time.Minute)) - if err != nil { - t.Fatal(err) - } - tokens = append(tokens, token) - } - - verifyOps := VerifyOptions{ - TrustedIssuers: []string{issuer}, - AcceptedAudiences: []string{audience}, - Roots: rootPool, - TrustedKeys: trustedKeys, - } - - for _, token := range tokens { - if err := token.Verify(verifyOps); err != nil { - t.Fatal(err) - } - } -} - -// This tests that we don't fail tokens with nbf within -// the defined leeway in seconds -func TestLeeway(t *testing.T) { - var ( - issuer = "test-issuer" - audience = "test-audience" - access = []*ResourceActions{ - { - Type: "repository", - Name: "foo/bar", - Actions: []string{"pull", "push"}, - }, - } - ) - - rootKeys, err := makeRootKeys(1) - if err != nil { - t.Fatal(err) - } - - trustedKeys := makeTrustedKeyMap(rootKeys) - - verifyOps := VerifyOptions{ - TrustedIssuers: []string{issuer}, - AcceptedAudiences: []string{audience}, - Roots: nil, - TrustedKeys: trustedKeys, - } - - // nbf verification should pass within leeway - futureNow := time.Now().Add(time.Duration(5) * time.Second) - token, err := makeTestToken(issuer, audience, access, rootKeys[0], 0, futureNow, futureNow.Add(5*time.Minute)) - if err != nil { - t.Fatal(err) - } - - if err := token.Verify(verifyOps); err != nil { - t.Fatal(err) - } - - // nbf verification should fail with a skew larger than leeway - futureNow = time.Now().Add(time.Duration(61) * time.Second) - token, err = makeTestToken(issuer, audience, access, rootKeys[0], 0, futureNow, futureNow.Add(5*time.Minute)) - if err != nil { - t.Fatal(err) - } - - if err = token.Verify(verifyOps); err == nil { - t.Fatal("Verification should fail for token with nbf in the future outside leeway") - } - - // exp verification should pass within leeway - token, err = makeTestToken(issuer, audience, access, rootKeys[0], 0, time.Now(), time.Now().Add(-59*time.Second)) - if err != nil { - t.Fatal(err) - } - - if err = token.Verify(verifyOps); err != nil { - t.Fatal(err) - } - - // exp verification should fail with a skew larger than leeway - token, err = makeTestToken(issuer, audience, access, rootKeys[0], 0, time.Now(), time.Now().Add(-60*time.Second)) - if err != nil { - t.Fatal(err) - } - - if err = token.Verify(verifyOps); err == nil { - t.Fatal("Verification should fail for token with exp in the future outside leeway") - } -} - -func writeTempRootCerts(rootKeys []libtrust.PrivateKey) (filename string, err error) { - rootCerts, err := makeRootCerts(rootKeys) - if err != nil { - return "", err - } - - tempFile, err := ioutil.TempFile("", "rootCertBundle") - if err != nil { - return "", err - } - defer tempFile.Close() - - for _, cert := range rootCerts { - if err = pem.Encode(tempFile, &pem.Block{ - Type: "CERTIFICATE", - Bytes: cert.Raw, - }); err != nil { - os.Remove(tempFile.Name()) - return "", err - } - } - - return tempFile.Name(), nil -} - -// TestAccessController tests complete integration of the token auth package. -// It starts by mocking the options for a token auth accessController which -// it creates. It then tries a few mock requests: -// - don't supply a token; should error with challenge -// - supply an invalid token; should error with challenge -// - supply a token with insufficient access; should error with challenge -// - supply a valid token; should not error -func TestAccessController(t *testing.T) { - // Make 2 keys; only the first is to be a trusted root key. - rootKeys, err := makeRootKeys(2) - if err != nil { - t.Fatal(err) - } - - rootCertBundleFilename, err := writeTempRootCerts(rootKeys[:1]) - if err != nil { - t.Fatal(err) - } - defer os.Remove(rootCertBundleFilename) - - realm := "https://auth.example.com/token/" - issuer := "test-issuer.example.com" - service := "test-service.example.com" - - options := map[string]interface{}{ - "realm": realm, - "issuer": issuer, - "service": service, - "rootcertbundle": rootCertBundleFilename, - } - - accessController, err := newAccessController(options) - if err != nil { - t.Fatal(err) - } - - // 1. Make a mock http.Request with no token. - req, err := http.NewRequest("GET", "http://example.com/foo", nil) - if err != nil { - t.Fatal(err) - } - - testAccess := auth.Access{ - Resource: auth.Resource{ - Type: "foo", - Name: "bar", - }, - Action: "baz", - } - - ctx := context.WithRequest(context.Background(), req) - authCtx, err := accessController.Authorized(ctx, testAccess) - challenge, ok := err.(auth.Challenge) - if !ok { - t.Fatal("accessController did not return a challenge") - } - - if challenge.Error() != ErrTokenRequired.Error() { - t.Fatalf("accessControler did not get expected error - got %s - expected %s", challenge, ErrTokenRequired) - } - - if authCtx != nil { - t.Fatalf("expected nil auth context but got %s", authCtx) - } - - // 2. Supply an invalid token. - token, err := makeTestToken( - issuer, service, - []*ResourceActions{{ - Type: testAccess.Type, - Name: testAccess.Name, - Actions: []string{testAccess.Action}, - }}, - rootKeys[1], 1, time.Now(), time.Now().Add(5*time.Minute), // Everything is valid except the key which signed it. - ) - if err != nil { - t.Fatal(err) - } - - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token.compactRaw())) - - authCtx, err = accessController.Authorized(ctx, testAccess) - challenge, ok = err.(auth.Challenge) - if !ok { - t.Fatal("accessController did not return a challenge") - } - - if challenge.Error() != ErrInvalidToken.Error() { - t.Fatalf("accessControler did not get expected error - got %s - expected %s", challenge, ErrTokenRequired) - } - - if authCtx != nil { - t.Fatalf("expected nil auth context but got %s", authCtx) - } - - // 3. Supply a token with insufficient access. - token, err = makeTestToken( - issuer, service, - []*ResourceActions{}, // No access specified. - rootKeys[0], 1, time.Now(), time.Now().Add(5*time.Minute), - ) - if err != nil { - t.Fatal(err) - } - - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token.compactRaw())) - - authCtx, err = accessController.Authorized(ctx, testAccess) - challenge, ok = err.(auth.Challenge) - if !ok { - t.Fatal("accessController did not return a challenge") - } - - if challenge.Error() != ErrInsufficientScope.Error() { - t.Fatalf("accessControler did not get expected error - got %s - expected %s", challenge, ErrInsufficientScope) - } - - if authCtx != nil { - t.Fatalf("expected nil auth context but got %s", authCtx) - } - - // 4. Supply the token we need, or deserve, or whatever. - token, err = makeTestToken( - issuer, service, - []*ResourceActions{{ - Type: testAccess.Type, - Name: testAccess.Name, - Actions: []string{testAccess.Action}, - }}, - rootKeys[0], 1, time.Now(), time.Now().Add(5*time.Minute), - ) - if err != nil { - t.Fatal(err) - } - - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token.compactRaw())) - - authCtx, err = accessController.Authorized(ctx, testAccess) - if err != nil { - t.Fatalf("accessController returned unexpected error: %s", err) - } - - userInfo, ok := authCtx.Value(auth.UserKey).(auth.UserInfo) - if !ok { - t.Fatal("token accessController did not set auth.user context") - } - - if userInfo.Name != "foo" { - t.Fatalf("expected user name %q, got %q", "foo", userInfo.Name) - } -} - -// This tests that newAccessController can handle PEM blocks in the certificate -// file other than certificates, for example a private key. -func TestNewAccessControllerPemBlock(t *testing.T) { - rootKeys, err := makeRootKeys(2) - if err != nil { - t.Fatal(err) - } - - rootCertBundleFilename, err := writeTempRootCerts(rootKeys) - if err != nil { - t.Fatal(err) - } - defer os.Remove(rootCertBundleFilename) - - // Add something other than a certificate to the rootcertbundle - file, err := os.OpenFile(rootCertBundleFilename, os.O_WRONLY|os.O_APPEND, 0666) - if err != nil { - t.Fatal(err) - } - keyBlock, err := rootKeys[0].PEMBlock() - if err != nil { - t.Fatal(err) - } - err = pem.Encode(file, keyBlock) - if err != nil { - t.Fatal(err) - } - err = file.Close() - if err != nil { - t.Fatal(err) - } - - realm := "https://auth.example.com/token/" - issuer := "test-issuer.example.com" - service := "test-service.example.com" - - options := map[string]interface{}{ - "realm": realm, - "issuer": issuer, - "service": service, - "rootcertbundle": rootCertBundleFilename, - } - - ac, err := newAccessController(options) - if err != nil { - t.Fatal(err) - } - - if len(ac.(*accessController).rootCerts.Subjects()) != 2 { - t.Fatal("accessController has the wrong number of certificates") - } -} diff --git a/vendor/github.com/docker/distribution/registry/auth/token/util.go b/vendor/github.com/docker/distribution/registry/auth/token/util.go deleted file mode 100644 index d7f95be42..000000000 --- a/vendor/github.com/docker/distribution/registry/auth/token/util.go +++ /dev/null @@ -1,58 +0,0 @@ -package token - -import ( - "encoding/base64" - "errors" - "strings" -) - -// joseBase64UrlEncode encodes the given data using the standard base64 url -// encoding format but with all trailing '=' characters omitted in accordance -// with the jose specification. -// http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-31#section-2 -func joseBase64UrlEncode(b []byte) string { - return strings.TrimRight(base64.URLEncoding.EncodeToString(b), "=") -} - -// joseBase64UrlDecode decodes the given string using the standard base64 url -// decoder but first adds the appropriate number of trailing '=' characters in -// accordance with the jose specification. -// http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-31#section-2 -func joseBase64UrlDecode(s string) ([]byte, error) { - switch len(s) % 4 { - case 0: - case 2: - s += "==" - case 3: - s += "=" - default: - return nil, errors.New("illegal base64url string") - } - return base64.URLEncoding.DecodeString(s) -} - -// actionSet is a special type of stringSet. -type actionSet struct { - stringSet -} - -func newActionSet(actions ...string) actionSet { - return actionSet{newStringSet(actions...)} -} - -// Contains calls StringSet.Contains() for -// either "*" or the given action string. -func (s actionSet) contains(action string) bool { - return s.stringSet.contains("*") || s.stringSet.contains(action) -} - -// contains returns true if q is found in ss. -func contains(ss []string, q string) bool { - for _, s := range ss { - if s == q { - return true - } - } - - return false -} diff --git a/vendor/github.com/docker/distribution/registry/client/auth/api_version.go b/vendor/github.com/docker/distribution/registry/client/auth/api_version.go deleted file mode 100644 index 7d8f1d957..000000000 --- a/vendor/github.com/docker/distribution/registry/client/auth/api_version.go +++ /dev/null @@ -1,58 +0,0 @@ -package auth - -import ( - "net/http" - "strings" -) - -// APIVersion represents a version of an API including its -// type and version number. -type APIVersion struct { - // Type refers to the name of a specific API specification - // such as "registry" - Type string - - // Version is the version of the API specification implemented, - // This may omit the revision number and only include - // the major and minor version, such as "2.0" - Version string -} - -// String returns the string formatted API Version -func (v APIVersion) String() string { - return v.Type + "/" + v.Version -} - -// APIVersions gets the API versions out of an HTTP response using the provided -// version header as the key for the HTTP header. -func APIVersions(resp *http.Response, versionHeader string) []APIVersion { - versions := []APIVersion{} - if versionHeader != "" { - for _, supportedVersions := range resp.Header[http.CanonicalHeaderKey(versionHeader)] { - for _, version := range strings.Fields(supportedVersions) { - versions = append(versions, ParseAPIVersion(version)) - } - } - } - return versions -} - -// ParseAPIVersion parses an API version string into an APIVersion -// Format (Expected, not enforced): -// API version string = '/' -// API type = [a-z][a-z0-9]* -// API version = [0-9]+(\.[0-9]+)? -// TODO(dmcgowan): Enforce format, add error condition, remove unknown type -func ParseAPIVersion(versionStr string) APIVersion { - idx := strings.IndexRune(versionStr, '/') - if idx == -1 { - return APIVersion{ - Type: "unknown", - Version: versionStr, - } - } - return APIVersion{ - Type: strings.ToLower(versionStr[:idx]), - Version: versionStr[idx+1:], - } -} diff --git a/vendor/github.com/docker/distribution/registry/client/auth/challenge/addr.go b/vendor/github.com/docker/distribution/registry/client/auth/challenge/addr.go deleted file mode 100644 index 2c3ebe165..000000000 --- a/vendor/github.com/docker/distribution/registry/client/auth/challenge/addr.go +++ /dev/null @@ -1,27 +0,0 @@ -package challenge - -import ( - "net/url" - "strings" -) - -// FROM: https://golang.org/src/net/http/http.go -// Given a string of the form "host", "host:port", or "[ipv6::address]:port", -// return true if the string includes a port. -func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") } - -// FROM: http://golang.org/src/net/http/transport.go -var portMap = map[string]string{ - "http": "80", - "https": "443", -} - -// canonicalAddr returns url.Host but always with a ":port" suffix -// FROM: http://golang.org/src/net/http/transport.go -func canonicalAddr(url *url.URL) string { - addr := url.Host - if !hasPort(addr) { - return addr + ":" + portMap[url.Scheme] - } - return addr -} diff --git a/vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge.go b/vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge.go deleted file mode 100644 index c9bdfc355..000000000 --- a/vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge.go +++ /dev/null @@ -1,237 +0,0 @@ -package challenge - -import ( - "fmt" - "net/http" - "net/url" - "strings" - "sync" -) - -// Challenge carries information from a WWW-Authenticate response header. -// See RFC 2617. -type Challenge struct { - // Scheme is the auth-scheme according to RFC 2617 - Scheme string - - // Parameters are the auth-params according to RFC 2617 - Parameters map[string]string -} - -// Manager manages the challenges for endpoints. -// The challenges are pulled out of HTTP responses. Only -// responses which expect challenges should be added to -// the manager, since a non-unauthorized request will be -// viewed as not requiring challenges. -type Manager interface { - // GetChallenges returns the challenges for the given - // endpoint URL. - GetChallenges(endpoint url.URL) ([]Challenge, error) - - // AddResponse adds the response to the challenge - // manager. The challenges will be parsed out of - // the WWW-Authenicate headers and added to the - // URL which was produced the response. If the - // response was authorized, any challenges for the - // endpoint will be cleared. - AddResponse(resp *http.Response) error -} - -// NewSimpleManager returns an instance of -// Manger which only maps endpoints to challenges -// based on the responses which have been added the -// manager. The simple manager will make no attempt to -// perform requests on the endpoints or cache the responses -// to a backend. -func NewSimpleManager() Manager { - return &simpleManager{ - Challanges: make(map[string][]Challenge), - } -} - -type simpleManager struct { - sync.RWMutex - Challanges map[string][]Challenge -} - -func normalizeURL(endpoint *url.URL) { - endpoint.Host = strings.ToLower(endpoint.Host) - endpoint.Host = canonicalAddr(endpoint) -} - -func (m *simpleManager) GetChallenges(endpoint url.URL) ([]Challenge, error) { - normalizeURL(&endpoint) - - m.RLock() - defer m.RUnlock() - challenges := m.Challanges[endpoint.String()] - return challenges, nil -} - -func (m *simpleManager) AddResponse(resp *http.Response) error { - challenges := ResponseChallenges(resp) - if resp.Request == nil { - return fmt.Errorf("missing request reference") - } - urlCopy := url.URL{ - Path: resp.Request.URL.Path, - Host: resp.Request.URL.Host, - Scheme: resp.Request.URL.Scheme, - } - normalizeURL(&urlCopy) - - m.Lock() - defer m.Unlock() - m.Challanges[urlCopy.String()] = challenges - return nil -} - -// Octet types from RFC 2616. -type octetType byte - -var octetTypes [256]octetType - -const ( - isToken octetType = 1 << iota - isSpace -) - -func init() { - // OCTET = - // CHAR = - // CTL = - // CR = - // LF = - // SP = - // HT = - // <"> = - // CRLF = CR LF - // LWS = [CRLF] 1*( SP | HT ) - // TEXT = - // separators = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | <"> - // | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT - // token = 1* - // qdtext = > - - for c := 0; c < 256; c++ { - var t octetType - isCtl := c <= 31 || c == 127 - isChar := 0 <= c && c <= 127 - isSeparator := strings.IndexRune(" \t\"(),/:;<=>?@[]\\{}", rune(c)) >= 0 - if strings.IndexRune(" \t\r\n", rune(c)) >= 0 { - t |= isSpace - } - if isChar && !isCtl && !isSeparator { - t |= isToken - } - octetTypes[c] = t - } -} - -// ResponseChallenges returns a list of authorization challenges -// for the given http Response. Challenges are only checked if -// the response status code was a 401. -func ResponseChallenges(resp *http.Response) []Challenge { - if resp.StatusCode == http.StatusUnauthorized { - // Parse the WWW-Authenticate Header and store the challenges - // on this endpoint object. - return parseAuthHeader(resp.Header) - } - - return nil -} - -func parseAuthHeader(header http.Header) []Challenge { - challenges := []Challenge{} - for _, h := range header[http.CanonicalHeaderKey("WWW-Authenticate")] { - v, p := parseValueAndParams(h) - if v != "" { - challenges = append(challenges, Challenge{Scheme: v, Parameters: p}) - } - } - return challenges -} - -func parseValueAndParams(header string) (value string, params map[string]string) { - params = make(map[string]string) - value, s := expectToken(header) - if value == "" { - return - } - value = strings.ToLower(value) - s = "," + skipSpace(s) - for strings.HasPrefix(s, ",") { - var pkey string - pkey, s = expectToken(skipSpace(s[1:])) - if pkey == "" { - return - } - if !strings.HasPrefix(s, "=") { - return - } - var pvalue string - pvalue, s = expectTokenOrQuoted(s[1:]) - if pvalue == "" { - return - } - pkey = strings.ToLower(pkey) - params[pkey] = pvalue - s = skipSpace(s) - } - return -} - -func skipSpace(s string) (rest string) { - i := 0 - for ; i < len(s); i++ { - if octetTypes[s[i]]&isSpace == 0 { - break - } - } - return s[i:] -} - -func expectToken(s string) (token, rest string) { - i := 0 - for ; i < len(s); i++ { - if octetTypes[s[i]]&isToken == 0 { - break - } - } - return s[:i], s[i:] -} - -func expectTokenOrQuoted(s string) (value string, rest string) { - if !strings.HasPrefix(s, "\"") { - return expectToken(s) - } - s = s[1:] - for i := 0; i < len(s); i++ { - switch s[i] { - case '"': - return s[:i], s[i+1:] - case '\\': - p := make([]byte, len(s)-1) - j := copy(p, s[:i]) - escape := true - for i = i + 1; i < len(s); i++ { - b := s[i] - switch { - case escape: - escape = false - p[j] = b - j++ - case b == '\\': - escape = true - case b == '"': - return string(p[:j]), s[i+1:] - default: - p[j] = b - j++ - } - } - return "", "" - } - } - return "", "" -} diff --git a/vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge_test.go b/vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge_test.go deleted file mode 100644 index d4986b39e..000000000 --- a/vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge_test.go +++ /dev/null @@ -1,127 +0,0 @@ -package challenge - -import ( - "fmt" - "net/http" - "net/url" - "strings" - "sync" - "testing" -) - -func TestAuthChallengeParse(t *testing.T) { - header := http.Header{} - header.Add("WWW-Authenticate", `Bearer realm="https://auth.example.com/token",service="registry.example.com",other=fun,slashed="he\"\l\lo"`) - - challenges := parseAuthHeader(header) - if len(challenges) != 1 { - t.Fatalf("Unexpected number of auth challenges: %d, expected 1", len(challenges)) - } - challenge := challenges[0] - - if expected := "bearer"; challenge.Scheme != expected { - t.Fatalf("Unexpected scheme: %s, expected: %s", challenge.Scheme, expected) - } - - if expected := "https://auth.example.com/token"; challenge.Parameters["realm"] != expected { - t.Fatalf("Unexpected param: %s, expected: %s", challenge.Parameters["realm"], expected) - } - - if expected := "registry.example.com"; challenge.Parameters["service"] != expected { - t.Fatalf("Unexpected param: %s, expected: %s", challenge.Parameters["service"], expected) - } - - if expected := "fun"; challenge.Parameters["other"] != expected { - t.Fatalf("Unexpected param: %s, expected: %s", challenge.Parameters["other"], expected) - } - - if expected := "he\"llo"; challenge.Parameters["slashed"] != expected { - t.Fatalf("Unexpected param: %s, expected: %s", challenge.Parameters["slashed"], expected) - } - -} - -func TestAuthChallengeNormalization(t *testing.T) { - testAuthChallengeNormalization(t, "reg.EXAMPLE.com") - testAuthChallengeNormalization(t, "bɿɒʜɔiɿ-ɿɘƚƨim-ƚol-ɒ-ƨʞnɒʜƚ.com") - testAuthChallengeNormalization(t, "reg.example.com:80") - testAuthChallengeConcurrent(t, "reg.EXAMPLE.com") -} - -func testAuthChallengeNormalization(t *testing.T, host string) { - - scm := NewSimpleManager() - - url, err := url.Parse(fmt.Sprintf("http://%s/v2/", host)) - if err != nil { - t.Fatal(err) - } - - resp := &http.Response{ - Request: &http.Request{ - URL: url, - }, - Header: make(http.Header), - StatusCode: http.StatusUnauthorized, - } - resp.Header.Add("WWW-Authenticate", fmt.Sprintf("Bearer realm=\"https://%s/token\",service=\"registry.example.com\"", host)) - - err = scm.AddResponse(resp) - if err != nil { - t.Fatal(err) - } - - lowered := *url - lowered.Host = strings.ToLower(lowered.Host) - lowered.Host = canonicalAddr(&lowered) - c, err := scm.GetChallenges(lowered) - if err != nil { - t.Fatal(err) - } - - if len(c) == 0 { - t.Fatal("Expected challenge for lower-cased-host URL") - } -} - -func testAuthChallengeConcurrent(t *testing.T, host string) { - - scm := NewSimpleManager() - - url, err := url.Parse(fmt.Sprintf("http://%s/v2/", host)) - if err != nil { - t.Fatal(err) - } - - resp := &http.Response{ - Request: &http.Request{ - URL: url, - }, - Header: make(http.Header), - StatusCode: http.StatusUnauthorized, - } - resp.Header.Add("WWW-Authenticate", fmt.Sprintf("Bearer realm=\"https://%s/token\",service=\"registry.example.com\"", host)) - var s sync.WaitGroup - s.Add(2) - go func() { - defer s.Done() - for i := 0; i < 200; i++ { - err = scm.AddResponse(resp) - if err != nil { - t.Error(err) - } - } - }() - go func() { - defer s.Done() - lowered := *url - lowered.Host = strings.ToLower(lowered.Host) - for k := 0; k < 200; k++ { - _, err := scm.GetChallenges(lowered) - if err != nil { - t.Error(err) - } - } - }() - s.Wait() -} diff --git a/vendor/github.com/docker/distribution/registry/client/auth/session.go b/vendor/github.com/docker/distribution/registry/client/auth/session.go deleted file mode 100644 index d6d884ffd..000000000 --- a/vendor/github.com/docker/distribution/registry/client/auth/session.go +++ /dev/null @@ -1,503 +0,0 @@ -package auth - -import ( - "encoding/json" - "errors" - "fmt" - "net/http" - "net/url" - "strings" - "sync" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/registry/client" - "github.com/docker/distribution/registry/client/auth/challenge" - "github.com/docker/distribution/registry/client/transport" -) - -var ( - // ErrNoBasicAuthCredentials is returned if a request can't be authorized with - // basic auth due to lack of credentials. - ErrNoBasicAuthCredentials = errors.New("no basic auth credentials") - - // ErrNoToken is returned if a request is successful but the body does not - // contain an authorization token. - ErrNoToken = errors.New("authorization server did not include a token in the response") -) - -const defaultClientID = "registry-client" - -// AuthenticationHandler is an interface for authorizing a request from -// params from a "WWW-Authenicate" header for a single scheme. -type AuthenticationHandler interface { - // Scheme returns the scheme as expected from the "WWW-Authenicate" header. - Scheme() string - - // AuthorizeRequest adds the authorization header to a request (if needed) - // using the parameters from "WWW-Authenticate" method. The parameters - // values depend on the scheme. - AuthorizeRequest(req *http.Request, params map[string]string) error -} - -// CredentialStore is an interface for getting credentials for -// a given URL -type CredentialStore interface { - // Basic returns basic auth for the given URL - Basic(*url.URL) (string, string) - - // RefreshToken returns a refresh token for the - // given URL and service - RefreshToken(*url.URL, string) string - - // SetRefreshToken sets the refresh token if none - // is provided for the given url and service - SetRefreshToken(realm *url.URL, service, token string) -} - -// NewAuthorizer creates an authorizer which can handle multiple authentication -// schemes. The handlers are tried in order, the higher priority authentication -// methods should be first. The challengeMap holds a list of challenges for -// a given root API endpoint (for example "https://registry-1.docker.io/v2/"). -func NewAuthorizer(manager challenge.Manager, handlers ...AuthenticationHandler) transport.RequestModifier { - return &endpointAuthorizer{ - challenges: manager, - handlers: handlers, - } -} - -type endpointAuthorizer struct { - challenges challenge.Manager - handlers []AuthenticationHandler - transport http.RoundTripper -} - -func (ea *endpointAuthorizer) ModifyRequest(req *http.Request) error { - pingPath := req.URL.Path - if v2Root := strings.Index(req.URL.Path, "/v2/"); v2Root != -1 { - pingPath = pingPath[:v2Root+4] - } else if v1Root := strings.Index(req.URL.Path, "/v1/"); v1Root != -1 { - pingPath = pingPath[:v1Root] + "/v2/" - } else { - return nil - } - - ping := url.URL{ - Host: req.URL.Host, - Scheme: req.URL.Scheme, - Path: pingPath, - } - - challenges, err := ea.challenges.GetChallenges(ping) - if err != nil { - return err - } - - if len(challenges) > 0 { - for _, handler := range ea.handlers { - for _, c := range challenges { - if c.Scheme != handler.Scheme() { - continue - } - if err := handler.AuthorizeRequest(req, c.Parameters); err != nil { - return err - } - } - } - } - - return nil -} - -// This is the minimum duration a token can last (in seconds). -// A token must not live less than 60 seconds because older versions -// of the Docker client didn't read their expiration from the token -// response and assumed 60 seconds. So to remain compatible with -// those implementations, a token must live at least this long. -const minimumTokenLifetimeSeconds = 60 - -// Private interface for time used by this package to enable tests to provide their own implementation. -type clock interface { - Now() time.Time -} - -type tokenHandler struct { - header http.Header - creds CredentialStore - transport http.RoundTripper - clock clock - - offlineAccess bool - forceOAuth bool - clientID string - scopes []Scope - - tokenLock sync.Mutex - tokenCache string - tokenExpiration time.Time -} - -// Scope is a type which is serializable to a string -// using the allow scope grammar. -type Scope interface { - String() string -} - -// RepositoryScope represents a token scope for access -// to a repository. -type RepositoryScope struct { - Repository string - Class string - Actions []string -} - -// String returns the string representation of the repository -// using the scope grammar -func (rs RepositoryScope) String() string { - repoType := "repository" - if rs.Class != "" { - repoType = fmt.Sprintf("%s(%s)", repoType, rs.Class) - } - return fmt.Sprintf("%s:%s:%s", repoType, rs.Repository, strings.Join(rs.Actions, ",")) -} - -// RegistryScope represents a token scope for access -// to resources in the registry. -type RegistryScope struct { - Name string - Actions []string -} - -// String returns the string representation of the user -// using the scope grammar -func (rs RegistryScope) String() string { - return fmt.Sprintf("registry:%s:%s", rs.Name, strings.Join(rs.Actions, ",")) -} - -// TokenHandlerOptions is used to configure a new token handler -type TokenHandlerOptions struct { - Transport http.RoundTripper - Credentials CredentialStore - - OfflineAccess bool - ForceOAuth bool - ClientID string - Scopes []Scope -} - -// An implementation of clock for providing real time data. -type realClock struct{} - -// Now implements clock -func (realClock) Now() time.Time { return time.Now() } - -// NewTokenHandler creates a new AuthenicationHandler which supports -// fetching tokens from a remote token server. -func NewTokenHandler(transport http.RoundTripper, creds CredentialStore, scope string, actions ...string) AuthenticationHandler { - // Create options... - return NewTokenHandlerWithOptions(TokenHandlerOptions{ - Transport: transport, - Credentials: creds, - Scopes: []Scope{ - RepositoryScope{ - Repository: scope, - Actions: actions, - }, - }, - }) -} - -// NewTokenHandlerWithOptions creates a new token handler using the provided -// options structure. -func NewTokenHandlerWithOptions(options TokenHandlerOptions) AuthenticationHandler { - handler := &tokenHandler{ - transport: options.Transport, - creds: options.Credentials, - offlineAccess: options.OfflineAccess, - forceOAuth: options.ForceOAuth, - clientID: options.ClientID, - scopes: options.Scopes, - clock: realClock{}, - } - - return handler -} - -func (th *tokenHandler) client() *http.Client { - return &http.Client{ - Transport: th.transport, - Timeout: 15 * time.Second, - } -} - -func (th *tokenHandler) Scheme() string { - return "bearer" -} - -func (th *tokenHandler) AuthorizeRequest(req *http.Request, params map[string]string) error { - var additionalScopes []string - if fromParam := req.URL.Query().Get("from"); fromParam != "" { - additionalScopes = append(additionalScopes, RepositoryScope{ - Repository: fromParam, - Actions: []string{"pull"}, - }.String()) - } - - token, err := th.getToken(params, additionalScopes...) - if err != nil { - return err - } - - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) - - return nil -} - -func (th *tokenHandler) getToken(params map[string]string, additionalScopes ...string) (string, error) { - th.tokenLock.Lock() - defer th.tokenLock.Unlock() - scopes := make([]string, 0, len(th.scopes)+len(additionalScopes)) - for _, scope := range th.scopes { - scopes = append(scopes, scope.String()) - } - var addedScopes bool - for _, scope := range additionalScopes { - scopes = append(scopes, scope) - addedScopes = true - } - - now := th.clock.Now() - if now.After(th.tokenExpiration) || addedScopes { - token, expiration, err := th.fetchToken(params, scopes) - if err != nil { - return "", err - } - - // do not update cache for added scope tokens - if !addedScopes { - th.tokenCache = token - th.tokenExpiration = expiration - } - - return token, nil - } - - return th.tokenCache, nil -} - -type postTokenResponse struct { - AccessToken string `json:"access_token"` - RefreshToken string `json:"refresh_token"` - ExpiresIn int `json:"expires_in"` - IssuedAt time.Time `json:"issued_at"` - Scope string `json:"scope"` -} - -func (th *tokenHandler) fetchTokenWithOAuth(realm *url.URL, refreshToken, service string, scopes []string) (token string, expiration time.Time, err error) { - form := url.Values{} - form.Set("scope", strings.Join(scopes, " ")) - form.Set("service", service) - - clientID := th.clientID - if clientID == "" { - // Use default client, this is a required field - clientID = defaultClientID - } - form.Set("client_id", clientID) - - if refreshToken != "" { - form.Set("grant_type", "refresh_token") - form.Set("refresh_token", refreshToken) - } else if th.creds != nil { - form.Set("grant_type", "password") - username, password := th.creds.Basic(realm) - form.Set("username", username) - form.Set("password", password) - - // attempt to get a refresh token - form.Set("access_type", "offline") - } else { - // refuse to do oauth without a grant type - return "", time.Time{}, fmt.Errorf("no supported grant type") - } - - resp, err := th.client().PostForm(realm.String(), form) - if err != nil { - return "", time.Time{}, err - } - defer resp.Body.Close() - - if !client.SuccessStatus(resp.StatusCode) { - err := client.HandleErrorResponse(resp) - return "", time.Time{}, err - } - - decoder := json.NewDecoder(resp.Body) - - var tr postTokenResponse - if err = decoder.Decode(&tr); err != nil { - return "", time.Time{}, fmt.Errorf("unable to decode token response: %s", err) - } - - if tr.RefreshToken != "" && tr.RefreshToken != refreshToken { - th.creds.SetRefreshToken(realm, service, tr.RefreshToken) - } - - if tr.ExpiresIn < minimumTokenLifetimeSeconds { - // The default/minimum lifetime. - tr.ExpiresIn = minimumTokenLifetimeSeconds - logrus.Debugf("Increasing token expiration to: %d seconds", tr.ExpiresIn) - } - - if tr.IssuedAt.IsZero() { - // issued_at is optional in the token response. - tr.IssuedAt = th.clock.Now().UTC() - } - - return tr.AccessToken, tr.IssuedAt.Add(time.Duration(tr.ExpiresIn) * time.Second), nil -} - -type getTokenResponse struct { - Token string `json:"token"` - AccessToken string `json:"access_token"` - ExpiresIn int `json:"expires_in"` - IssuedAt time.Time `json:"issued_at"` - RefreshToken string `json:"refresh_token"` -} - -func (th *tokenHandler) fetchTokenWithBasicAuth(realm *url.URL, service string, scopes []string) (token string, expiration time.Time, err error) { - - req, err := http.NewRequest("GET", realm.String(), nil) - if err != nil { - return "", time.Time{}, err - } - - reqParams := req.URL.Query() - - if service != "" { - reqParams.Add("service", service) - } - - for _, scope := range scopes { - reqParams.Add("scope", scope) - } - - if th.offlineAccess { - reqParams.Add("offline_token", "true") - clientID := th.clientID - if clientID == "" { - clientID = defaultClientID - } - reqParams.Add("client_id", clientID) - } - - if th.creds != nil { - username, password := th.creds.Basic(realm) - if username != "" && password != "" { - reqParams.Add("account", username) - req.SetBasicAuth(username, password) - } - } - - req.URL.RawQuery = reqParams.Encode() - - resp, err := th.client().Do(req) - if err != nil { - return "", time.Time{}, err - } - defer resp.Body.Close() - - if !client.SuccessStatus(resp.StatusCode) { - err := client.HandleErrorResponse(resp) - return "", time.Time{}, err - } - - decoder := json.NewDecoder(resp.Body) - - var tr getTokenResponse - if err = decoder.Decode(&tr); err != nil { - return "", time.Time{}, fmt.Errorf("unable to decode token response: %s", err) - } - - if tr.RefreshToken != "" && th.creds != nil { - th.creds.SetRefreshToken(realm, service, tr.RefreshToken) - } - - // `access_token` is equivalent to `token` and if both are specified - // the choice is undefined. Canonicalize `access_token` by sticking - // things in `token`. - if tr.AccessToken != "" { - tr.Token = tr.AccessToken - } - - if tr.Token == "" { - return "", time.Time{}, ErrNoToken - } - - if tr.ExpiresIn < minimumTokenLifetimeSeconds { - // The default/minimum lifetime. - tr.ExpiresIn = minimumTokenLifetimeSeconds - logrus.Debugf("Increasing token expiration to: %d seconds", tr.ExpiresIn) - } - - if tr.IssuedAt.IsZero() { - // issued_at is optional in the token response. - tr.IssuedAt = th.clock.Now().UTC() - } - - return tr.Token, tr.IssuedAt.Add(time.Duration(tr.ExpiresIn) * time.Second), nil -} - -func (th *tokenHandler) fetchToken(params map[string]string, scopes []string) (token string, expiration time.Time, err error) { - realm, ok := params["realm"] - if !ok { - return "", time.Time{}, errors.New("no realm specified for token auth challenge") - } - - // TODO(dmcgowan): Handle empty scheme and relative realm - realmURL, err := url.Parse(realm) - if err != nil { - return "", time.Time{}, fmt.Errorf("invalid token auth challenge realm: %s", err) - } - - service := params["service"] - - var refreshToken string - - if th.creds != nil { - refreshToken = th.creds.RefreshToken(realmURL, service) - } - - if refreshToken != "" || th.forceOAuth { - return th.fetchTokenWithOAuth(realmURL, refreshToken, service, scopes) - } - - return th.fetchTokenWithBasicAuth(realmURL, service, scopes) -} - -type basicHandler struct { - creds CredentialStore -} - -// NewBasicHandler creaters a new authentiation handler which adds -// basic authentication credentials to a request. -func NewBasicHandler(creds CredentialStore) AuthenticationHandler { - return &basicHandler{ - creds: creds, - } -} - -func (*basicHandler) Scheme() string { - return "basic" -} - -func (bh *basicHandler) AuthorizeRequest(req *http.Request, params map[string]string) error { - if bh.creds != nil { - username, password := bh.creds.Basic(req.URL) - if username != "" && password != "" { - req.SetBasicAuth(username, password) - return nil - } - } - return ErrNoBasicAuthCredentials -} diff --git a/vendor/github.com/docker/distribution/registry/client/auth/session_test.go b/vendor/github.com/docker/distribution/registry/client/auth/session_test.go deleted file mode 100644 index 4f54c75cc..000000000 --- a/vendor/github.com/docker/distribution/registry/client/auth/session_test.go +++ /dev/null @@ -1,866 +0,0 @@ -package auth - -import ( - "encoding/base64" - "fmt" - "net/http" - "net/http/httptest" - "net/url" - "testing" - "time" - - "github.com/docker/distribution/registry/client/auth/challenge" - "github.com/docker/distribution/registry/client/transport" - "github.com/docker/distribution/testutil" -) - -// An implementation of clock for providing fake time data. -type fakeClock struct { - current time.Time -} - -// Now implements clock -func (fc *fakeClock) Now() time.Time { return fc.current } - -func testServer(rrm testutil.RequestResponseMap) (string, func()) { - h := testutil.NewHandler(rrm) - s := httptest.NewServer(h) - return s.URL, s.Close -} - -type testAuthenticationWrapper struct { - headers http.Header - authCheck func(string) bool - next http.Handler -} - -func (w *testAuthenticationWrapper) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - auth := r.Header.Get("Authorization") - if auth == "" || !w.authCheck(auth) { - h := rw.Header() - for k, values := range w.headers { - h[k] = values - } - rw.WriteHeader(http.StatusUnauthorized) - return - } - w.next.ServeHTTP(rw, r) -} - -func testServerWithAuth(rrm testutil.RequestResponseMap, authenticate string, authCheck func(string) bool) (string, func()) { - h := testutil.NewHandler(rrm) - wrapper := &testAuthenticationWrapper{ - - headers: http.Header(map[string][]string{ - "X-API-Version": {"registry/2.0"}, - "X-Multi-API-Version": {"registry/2.0", "registry/2.1", "trust/1.0"}, - "WWW-Authenticate": {authenticate}, - }), - authCheck: authCheck, - next: h, - } - - s := httptest.NewServer(wrapper) - return s.URL, s.Close -} - -// ping pings the provided endpoint to determine its required authorization challenges. -// If a version header is provided, the versions will be returned. -func ping(manager challenge.Manager, endpoint, versionHeader string) ([]APIVersion, error) { - resp, err := http.Get(endpoint) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - if err := manager.AddResponse(resp); err != nil { - return nil, err - } - - return APIVersions(resp, versionHeader), err -} - -type testCredentialStore struct { - username string - password string - refreshTokens map[string]string -} - -func (tcs *testCredentialStore) Basic(*url.URL) (string, string) { - return tcs.username, tcs.password -} - -func (tcs *testCredentialStore) RefreshToken(u *url.URL, service string) string { - return tcs.refreshTokens[service] -} - -func (tcs *testCredentialStore) SetRefreshToken(u *url.URL, service string, token string) { - if tcs.refreshTokens != nil { - tcs.refreshTokens[service] = token - } -} - -func TestEndpointAuthorizeToken(t *testing.T) { - service := "localhost.localdomain" - repo1 := "some/registry" - repo2 := "other/registry" - scope1 := fmt.Sprintf("repository:%s:pull,push", repo1) - scope2 := fmt.Sprintf("repository:%s:pull,push", repo2) - tokenMap := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: fmt.Sprintf("/token?scope=%s&service=%s", url.QueryEscape(scope1), service), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: []byte(`{"token":"statictoken"}`), - }, - }, - { - Request: testutil.Request{ - Method: "GET", - Route: fmt.Sprintf("/token?scope=%s&service=%s", url.QueryEscape(scope2), service), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: []byte(`{"token":"badtoken"}`), - }, - }, - }) - te, tc := testServer(tokenMap) - defer tc() - - m := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - }) - - authenicate := fmt.Sprintf("Bearer realm=%q,service=%q", te+"/token", service) - validCheck := func(a string) bool { - return a == "Bearer statictoken" - } - e, c := testServerWithAuth(m, authenicate, validCheck) - defer c() - - challengeManager1 := challenge.NewSimpleManager() - versions, err := ping(challengeManager1, e+"/v2/", "x-api-version") - if err != nil { - t.Fatal(err) - } - if len(versions) != 1 { - t.Fatalf("Unexpected version count: %d, expected 1", len(versions)) - } - if check := (APIVersion{Type: "registry", Version: "2.0"}); versions[0] != check { - t.Fatalf("Unexpected api version: %#v, expected %#v", versions[0], check) - } - transport1 := transport.NewTransport(nil, NewAuthorizer(challengeManager1, NewTokenHandler(nil, nil, repo1, "pull", "push"))) - client := &http.Client{Transport: transport1} - - req, _ := http.NewRequest("GET", e+"/v2/hello", nil) - resp, err := client.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - - if resp.StatusCode != http.StatusAccepted { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusAccepted) - } - - e2, c2 := testServerWithAuth(m, authenicate, validCheck) - defer c2() - - challengeManager2 := challenge.NewSimpleManager() - versions, err = ping(challengeManager2, e2+"/v2/", "x-multi-api-version") - if err != nil { - t.Fatal(err) - } - if len(versions) != 3 { - t.Fatalf("Unexpected version count: %d, expected 3", len(versions)) - } - if check := (APIVersion{Type: "registry", Version: "2.0"}); versions[0] != check { - t.Fatalf("Unexpected api version: %#v, expected %#v", versions[0], check) - } - if check := (APIVersion{Type: "registry", Version: "2.1"}); versions[1] != check { - t.Fatalf("Unexpected api version: %#v, expected %#v", versions[1], check) - } - if check := (APIVersion{Type: "trust", Version: "1.0"}); versions[2] != check { - t.Fatalf("Unexpected api version: %#v, expected %#v", versions[2], check) - } - transport2 := transport.NewTransport(nil, NewAuthorizer(challengeManager2, NewTokenHandler(nil, nil, repo2, "pull", "push"))) - client2 := &http.Client{Transport: transport2} - - req, _ = http.NewRequest("GET", e2+"/v2/hello", nil) - resp, err = client2.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - - if resp.StatusCode != http.StatusUnauthorized { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusUnauthorized) - } -} - -func TestEndpointAuthorizeRefreshToken(t *testing.T) { - service := "localhost.localdomain" - repo1 := "some/registry" - repo2 := "other/registry" - scope1 := fmt.Sprintf("repository:%s:pull,push", repo1) - scope2 := fmt.Sprintf("repository:%s:pull,push", repo2) - refreshToken1 := "0123456790abcdef" - refreshToken2 := "0123456790fedcba" - tokenMap := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "POST", - Route: "/token", - Body: []byte(fmt.Sprintf("client_id=registry-client&grant_type=refresh_token&refresh_token=%s&scope=%s&service=%s", refreshToken1, url.QueryEscape(scope1), service)), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: []byte(fmt.Sprintf(`{"access_token":"statictoken","refresh_token":"%s"}`, refreshToken1)), - }, - }, - { - // In the future this test may fail and require using basic auth to get a different refresh token - Request: testutil.Request{ - Method: "POST", - Route: "/token", - Body: []byte(fmt.Sprintf("client_id=registry-client&grant_type=refresh_token&refresh_token=%s&scope=%s&service=%s", refreshToken1, url.QueryEscape(scope2), service)), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: []byte(fmt.Sprintf(`{"access_token":"statictoken","refresh_token":"%s"}`, refreshToken2)), - }, - }, - { - Request: testutil.Request{ - Method: "POST", - Route: "/token", - Body: []byte(fmt.Sprintf("client_id=registry-client&grant_type=refresh_token&refresh_token=%s&scope=%s&service=%s", refreshToken2, url.QueryEscape(scope2), service)), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: []byte(`{"access_token":"badtoken","refresh_token":"%s"}`), - }, - }, - }) - te, tc := testServer(tokenMap) - defer tc() - - m := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - }) - - authenicate := fmt.Sprintf("Bearer realm=%q,service=%q", te+"/token", service) - validCheck := func(a string) bool { - return a == "Bearer statictoken" - } - e, c := testServerWithAuth(m, authenicate, validCheck) - defer c() - - challengeManager1 := challenge.NewSimpleManager() - versions, err := ping(challengeManager1, e+"/v2/", "x-api-version") - if err != nil { - t.Fatal(err) - } - if len(versions) != 1 { - t.Fatalf("Unexpected version count: %d, expected 1", len(versions)) - } - if check := (APIVersion{Type: "registry", Version: "2.0"}); versions[0] != check { - t.Fatalf("Unexpected api version: %#v, expected %#v", versions[0], check) - } - creds := &testCredentialStore{ - refreshTokens: map[string]string{ - service: refreshToken1, - }, - } - transport1 := transport.NewTransport(nil, NewAuthorizer(challengeManager1, NewTokenHandler(nil, creds, repo1, "pull", "push"))) - client := &http.Client{Transport: transport1} - - req, _ := http.NewRequest("GET", e+"/v2/hello", nil) - resp, err := client.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - - if resp.StatusCode != http.StatusAccepted { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusAccepted) - } - - // Try with refresh token setting - e2, c2 := testServerWithAuth(m, authenicate, validCheck) - defer c2() - - challengeManager2 := challenge.NewSimpleManager() - versions, err = ping(challengeManager2, e2+"/v2/", "x-api-version") - if err != nil { - t.Fatal(err) - } - if len(versions) != 1 { - t.Fatalf("Unexpected version count: %d, expected 1", len(versions)) - } - if check := (APIVersion{Type: "registry", Version: "2.0"}); versions[0] != check { - t.Fatalf("Unexpected api version: %#v, expected %#v", versions[0], check) - } - - transport2 := transport.NewTransport(nil, NewAuthorizer(challengeManager2, NewTokenHandler(nil, creds, repo2, "pull", "push"))) - client2 := &http.Client{Transport: transport2} - - req, _ = http.NewRequest("GET", e2+"/v2/hello", nil) - resp, err = client2.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - - if resp.StatusCode != http.StatusAccepted { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusUnauthorized) - } - - if creds.refreshTokens[service] != refreshToken2 { - t.Fatalf("Refresh token not set after change") - } - - // Try with bad token - e3, c3 := testServerWithAuth(m, authenicate, validCheck) - defer c3() - - challengeManager3 := challenge.NewSimpleManager() - versions, err = ping(challengeManager3, e3+"/v2/", "x-api-version") - if err != nil { - t.Fatal(err) - } - if check := (APIVersion{Type: "registry", Version: "2.0"}); versions[0] != check { - t.Fatalf("Unexpected api version: %#v, expected %#v", versions[0], check) - } - - transport3 := transport.NewTransport(nil, NewAuthorizer(challengeManager3, NewTokenHandler(nil, creds, repo2, "pull", "push"))) - client3 := &http.Client{Transport: transport3} - - req, _ = http.NewRequest("GET", e3+"/v2/hello", nil) - resp, err = client3.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - - if resp.StatusCode != http.StatusUnauthorized { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusUnauthorized) - } -} - -func TestEndpointAuthorizeV2RefreshToken(t *testing.T) { - service := "localhost.localdomain" - scope1 := "registry:catalog:search" - refreshToken1 := "0123456790abcdef" - tokenMap := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "POST", - Route: "/token", - Body: []byte(fmt.Sprintf("client_id=registry-client&grant_type=refresh_token&refresh_token=%s&scope=%s&service=%s", refreshToken1, url.QueryEscape(scope1), service)), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: []byte(fmt.Sprintf(`{"access_token":"statictoken","refresh_token":"%s"}`, refreshToken1)), - }, - }, - }) - te, tc := testServer(tokenMap) - defer tc() - - m := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: "/v1/search", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - }) - - authenicate := fmt.Sprintf("Bearer realm=%q,service=%q", te+"/token", service) - validCheck := func(a string) bool { - return a == "Bearer statictoken" - } - e, c := testServerWithAuth(m, authenicate, validCheck) - defer c() - - challengeManager1 := challenge.NewSimpleManager() - versions, err := ping(challengeManager1, e+"/v2/", "x-api-version") - if err != nil { - t.Fatal(err) - } - if len(versions) != 1 { - t.Fatalf("Unexpected version count: %d, expected 1", len(versions)) - } - if check := (APIVersion{Type: "registry", Version: "2.0"}); versions[0] != check { - t.Fatalf("Unexpected api version: %#v, expected %#v", versions[0], check) - } - tho := TokenHandlerOptions{ - Credentials: &testCredentialStore{ - refreshTokens: map[string]string{ - service: refreshToken1, - }, - }, - Scopes: []Scope{ - RegistryScope{ - Name: "catalog", - Actions: []string{"search"}, - }, - }, - } - - transport1 := transport.NewTransport(nil, NewAuthorizer(challengeManager1, NewTokenHandlerWithOptions(tho))) - client := &http.Client{Transport: transport1} - - req, _ := http.NewRequest("GET", e+"/v1/search", nil) - resp, err := client.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - - if resp.StatusCode != http.StatusAccepted { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusAccepted) - } -} - -func basicAuth(username, password string) string { - auth := username + ":" + password - return base64.StdEncoding.EncodeToString([]byte(auth)) -} - -func TestEndpointAuthorizeTokenBasic(t *testing.T) { - service := "localhost.localdomain" - repo := "some/fun/registry" - scope := fmt.Sprintf("repository:%s:pull,push", repo) - username := "tokenuser" - password := "superSecretPa$$word" - - tokenMap := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: fmt.Sprintf("/token?account=%s&scope=%s&service=%s", username, url.QueryEscape(scope), service), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: []byte(`{"access_token":"statictoken"}`), - }, - }, - }) - - authenicate1 := fmt.Sprintf("Basic realm=localhost") - basicCheck := func(a string) bool { - return a == fmt.Sprintf("Basic %s", basicAuth(username, password)) - } - te, tc := testServerWithAuth(tokenMap, authenicate1, basicCheck) - defer tc() - - m := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - }) - - authenicate2 := fmt.Sprintf("Bearer realm=%q,service=%q", te+"/token", service) - bearerCheck := func(a string) bool { - return a == "Bearer statictoken" - } - e, c := testServerWithAuth(m, authenicate2, bearerCheck) - defer c() - - creds := &testCredentialStore{ - username: username, - password: password, - } - - challengeManager := challenge.NewSimpleManager() - _, err := ping(challengeManager, e+"/v2/", "") - if err != nil { - t.Fatal(err) - } - transport1 := transport.NewTransport(nil, NewAuthorizer(challengeManager, NewTokenHandler(nil, creds, repo, "pull", "push"), NewBasicHandler(creds))) - client := &http.Client{Transport: transport1} - - req, _ := http.NewRequest("GET", e+"/v2/hello", nil) - resp, err := client.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - - if resp.StatusCode != http.StatusAccepted { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusAccepted) - } -} - -func TestEndpointAuthorizeTokenBasicWithExpiresIn(t *testing.T) { - service := "localhost.localdomain" - repo := "some/fun/registry" - scope := fmt.Sprintf("repository:%s:pull,push", repo) - username := "tokenuser" - password := "superSecretPa$$word" - - tokenMap := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: fmt.Sprintf("/token?account=%s&scope=%s&service=%s", username, url.QueryEscape(scope), service), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: []byte(`{"token":"statictoken", "expires_in": 3001}`), - }, - }, - { - Request: testutil.Request{ - Method: "GET", - Route: fmt.Sprintf("/token?account=%s&scope=%s&service=%s", username, url.QueryEscape(scope), service), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: []byte(`{"access_token":"statictoken", "expires_in": 3001}`), - }, - }, - }) - - authenicate1 := fmt.Sprintf("Basic realm=localhost") - tokenExchanges := 0 - basicCheck := func(a string) bool { - tokenExchanges = tokenExchanges + 1 - return a == fmt.Sprintf("Basic %s", basicAuth(username, password)) - } - te, tc := testServerWithAuth(tokenMap, authenicate1, basicCheck) - defer tc() - - m := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - }) - - authenicate2 := fmt.Sprintf("Bearer realm=%q,service=%q", te+"/token", service) - bearerCheck := func(a string) bool { - return a == "Bearer statictoken" - } - e, c := testServerWithAuth(m, authenicate2, bearerCheck) - defer c() - - creds := &testCredentialStore{ - username: username, - password: password, - } - - challengeManager := challenge.NewSimpleManager() - _, err := ping(challengeManager, e+"/v2/", "") - if err != nil { - t.Fatal(err) - } - clock := &fakeClock{current: time.Now()} - options := TokenHandlerOptions{ - Transport: nil, - Credentials: creds, - Scopes: []Scope{ - RepositoryScope{ - Repository: repo, - Actions: []string{"pull", "push"}, - }, - }, - } - tHandler := NewTokenHandlerWithOptions(options) - tHandler.(*tokenHandler).clock = clock - transport1 := transport.NewTransport(nil, NewAuthorizer(challengeManager, tHandler, NewBasicHandler(creds))) - client := &http.Client{Transport: transport1} - - // First call should result in a token exchange - // Subsequent calls should recycle the token from the first request, until the expiration has lapsed. - timeIncrement := 1000 * time.Second - for i := 0; i < 4; i++ { - req, _ := http.NewRequest("GET", e+"/v2/hello", nil) - resp, err := client.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - if resp.StatusCode != http.StatusAccepted { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusAccepted) - } - if tokenExchanges != 1 { - t.Fatalf("Unexpected number of token exchanges, want: 1, got %d (iteration: %d)", tokenExchanges, i) - } - clock.current = clock.current.Add(timeIncrement) - } - - // After we've exceeded the expiration, we should see a second token exchange. - req, _ := http.NewRequest("GET", e+"/v2/hello", nil) - resp, err := client.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - if resp.StatusCode != http.StatusAccepted { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusAccepted) - } - if tokenExchanges != 2 { - t.Fatalf("Unexpected number of token exchanges, want: 2, got %d", tokenExchanges) - } -} - -func TestEndpointAuthorizeTokenBasicWithExpiresInAndIssuedAt(t *testing.T) { - service := "localhost.localdomain" - repo := "some/fun/registry" - scope := fmt.Sprintf("repository:%s:pull,push", repo) - username := "tokenuser" - password := "superSecretPa$$word" - - // This test sets things up such that the token was issued one increment - // earlier than its sibling in TestEndpointAuthorizeTokenBasicWithExpiresIn. - // This will mean that the token expires after 3 increments instead of 4. - clock := &fakeClock{current: time.Now()} - timeIncrement := 1000 * time.Second - firstIssuedAt := clock.Now() - clock.current = clock.current.Add(timeIncrement) - secondIssuedAt := clock.current.Add(2 * timeIncrement) - tokenMap := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: fmt.Sprintf("/token?account=%s&scope=%s&service=%s", username, url.QueryEscape(scope), service), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: []byte(`{"token":"statictoken", "issued_at": "` + firstIssuedAt.Format(time.RFC3339Nano) + `", "expires_in": 3001}`), - }, - }, - { - Request: testutil.Request{ - Method: "GET", - Route: fmt.Sprintf("/token?account=%s&scope=%s&service=%s", username, url.QueryEscape(scope), service), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: []byte(`{"access_token":"statictoken", "issued_at": "` + secondIssuedAt.Format(time.RFC3339Nano) + `", "expires_in": 3001}`), - }, - }, - }) - - authenicate1 := fmt.Sprintf("Basic realm=localhost") - tokenExchanges := 0 - basicCheck := func(a string) bool { - tokenExchanges = tokenExchanges + 1 - return a == fmt.Sprintf("Basic %s", basicAuth(username, password)) - } - te, tc := testServerWithAuth(tokenMap, authenicate1, basicCheck) - defer tc() - - m := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - }) - - authenicate2 := fmt.Sprintf("Bearer realm=%q,service=%q", te+"/token", service) - bearerCheck := func(a string) bool { - return a == "Bearer statictoken" - } - e, c := testServerWithAuth(m, authenicate2, bearerCheck) - defer c() - - creds := &testCredentialStore{ - username: username, - password: password, - } - - challengeManager := challenge.NewSimpleManager() - _, err := ping(challengeManager, e+"/v2/", "") - if err != nil { - t.Fatal(err) - } - - options := TokenHandlerOptions{ - Transport: nil, - Credentials: creds, - Scopes: []Scope{ - RepositoryScope{ - Repository: repo, - Actions: []string{"pull", "push"}, - }, - }, - } - tHandler := NewTokenHandlerWithOptions(options) - tHandler.(*tokenHandler).clock = clock - transport1 := transport.NewTransport(nil, NewAuthorizer(challengeManager, tHandler, NewBasicHandler(creds))) - client := &http.Client{Transport: transport1} - - // First call should result in a token exchange - // Subsequent calls should recycle the token from the first request, until the expiration has lapsed. - // We shaved one increment off of the equivalent logic in TestEndpointAuthorizeTokenBasicWithExpiresIn - // so this loop should have one fewer iteration. - for i := 0; i < 3; i++ { - req, _ := http.NewRequest("GET", e+"/v2/hello", nil) - resp, err := client.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - if resp.StatusCode != http.StatusAccepted { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusAccepted) - } - if tokenExchanges != 1 { - t.Fatalf("Unexpected number of token exchanges, want: 1, got %d (iteration: %d)", tokenExchanges, i) - } - clock.current = clock.current.Add(timeIncrement) - } - - // After we've exceeded the expiration, we should see a second token exchange. - req, _ := http.NewRequest("GET", e+"/v2/hello", nil) - resp, err := client.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - if resp.StatusCode != http.StatusAccepted { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusAccepted) - } - if tokenExchanges != 2 { - t.Fatalf("Unexpected number of token exchanges, want: 2, got %d", tokenExchanges) - } -} - -func TestEndpointAuthorizeBasic(t *testing.T) { - m := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/hello", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - }, - }, - }) - - username := "user1" - password := "funSecretPa$$word" - authenicate := fmt.Sprintf("Basic realm=localhost") - validCheck := func(a string) bool { - return a == fmt.Sprintf("Basic %s", basicAuth(username, password)) - } - e, c := testServerWithAuth(m, authenicate, validCheck) - defer c() - creds := &testCredentialStore{ - username: username, - password: password, - } - - challengeManager := challenge.NewSimpleManager() - _, err := ping(challengeManager, e+"/v2/", "") - if err != nil { - t.Fatal(err) - } - transport1 := transport.NewTransport(nil, NewAuthorizer(challengeManager, NewBasicHandler(creds))) - client := &http.Client{Transport: transport1} - - req, _ := http.NewRequest("GET", e+"/v2/hello", nil) - resp, err := client.Do(req) - if err != nil { - t.Fatalf("Error sending get request: %s", err) - } - - if resp.StatusCode != http.StatusAccepted { - t.Fatalf("Unexpected status code: %d, expected %d", resp.StatusCode, http.StatusAccepted) - } -} diff --git a/vendor/github.com/docker/distribution/registry/client/blob_writer.go b/vendor/github.com/docker/distribution/registry/client/blob_writer.go deleted file mode 100644 index e3ffcb00f..000000000 --- a/vendor/github.com/docker/distribution/registry/client/blob_writer.go +++ /dev/null @@ -1,162 +0,0 @@ -package client - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/http" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" -) - -type httpBlobUpload struct { - statter distribution.BlobStatter - client *http.Client - - uuid string - startedAt time.Time - - location string // always the last value of the location header. - offset int64 - closed bool -} - -func (hbu *httpBlobUpload) Reader() (io.ReadCloser, error) { - panic("Not implemented") -} - -func (hbu *httpBlobUpload) handleErrorResponse(resp *http.Response) error { - if resp.StatusCode == http.StatusNotFound { - return distribution.ErrBlobUploadUnknown - } - return HandleErrorResponse(resp) -} - -func (hbu *httpBlobUpload) ReadFrom(r io.Reader) (n int64, err error) { - req, err := http.NewRequest("PATCH", hbu.location, ioutil.NopCloser(r)) - if err != nil { - return 0, err - } - defer req.Body.Close() - - resp, err := hbu.client.Do(req) - if err != nil { - return 0, err - } - - if !SuccessStatus(resp.StatusCode) { - return 0, hbu.handleErrorResponse(resp) - } - - hbu.uuid = resp.Header.Get("Docker-Upload-UUID") - hbu.location, err = sanitizeLocation(resp.Header.Get("Location"), hbu.location) - if err != nil { - return 0, err - } - rng := resp.Header.Get("Range") - var start, end int64 - if n, err := fmt.Sscanf(rng, "%d-%d", &start, &end); err != nil { - return 0, err - } else if n != 2 || end < start { - return 0, fmt.Errorf("bad range format: %s", rng) - } - - return (end - start + 1), nil - -} - -func (hbu *httpBlobUpload) Write(p []byte) (n int, err error) { - req, err := http.NewRequest("PATCH", hbu.location, bytes.NewReader(p)) - if err != nil { - return 0, err - } - req.Header.Set("Content-Range", fmt.Sprintf("%d-%d", hbu.offset, hbu.offset+int64(len(p)-1))) - req.Header.Set("Content-Length", fmt.Sprintf("%d", len(p))) - req.Header.Set("Content-Type", "application/octet-stream") - - resp, err := hbu.client.Do(req) - if err != nil { - return 0, err - } - - if !SuccessStatus(resp.StatusCode) { - return 0, hbu.handleErrorResponse(resp) - } - - hbu.uuid = resp.Header.Get("Docker-Upload-UUID") - hbu.location, err = sanitizeLocation(resp.Header.Get("Location"), hbu.location) - if err != nil { - return 0, err - } - rng := resp.Header.Get("Range") - var start, end int - if n, err := fmt.Sscanf(rng, "%d-%d", &start, &end); err != nil { - return 0, err - } else if n != 2 || end < start { - return 0, fmt.Errorf("bad range format: %s", rng) - } - - return (end - start + 1), nil - -} - -func (hbu *httpBlobUpload) Size() int64 { - return hbu.offset -} - -func (hbu *httpBlobUpload) ID() string { - return hbu.uuid -} - -func (hbu *httpBlobUpload) StartedAt() time.Time { - return hbu.startedAt -} - -func (hbu *httpBlobUpload) Commit(ctx context.Context, desc distribution.Descriptor) (distribution.Descriptor, error) { - // TODO(dmcgowan): Check if already finished, if so just fetch - req, err := http.NewRequest("PUT", hbu.location, nil) - if err != nil { - return distribution.Descriptor{}, err - } - - values := req.URL.Query() - values.Set("digest", desc.Digest.String()) - req.URL.RawQuery = values.Encode() - - resp, err := hbu.client.Do(req) - if err != nil { - return distribution.Descriptor{}, err - } - defer resp.Body.Close() - - if !SuccessStatus(resp.StatusCode) { - return distribution.Descriptor{}, hbu.handleErrorResponse(resp) - } - - return hbu.statter.Stat(ctx, desc.Digest) -} - -func (hbu *httpBlobUpload) Cancel(ctx context.Context) error { - req, err := http.NewRequest("DELETE", hbu.location, nil) - if err != nil { - return err - } - resp, err := hbu.client.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - if resp.StatusCode == http.StatusNotFound || SuccessStatus(resp.StatusCode) { - return nil - } - return hbu.handleErrorResponse(resp) -} - -func (hbu *httpBlobUpload) Close() error { - hbu.closed = true - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/client/blob_writer_test.go b/vendor/github.com/docker/distribution/registry/client/blob_writer_test.go deleted file mode 100644 index 099dca4f0..000000000 --- a/vendor/github.com/docker/distribution/registry/client/blob_writer_test.go +++ /dev/null @@ -1,211 +0,0 @@ -package client - -import ( - "bytes" - "fmt" - "net/http" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" - "github.com/docker/distribution/testutil" -) - -// Test implements distribution.BlobWriter -var _ distribution.BlobWriter = &httpBlobUpload{} - -func TestUploadReadFrom(t *testing.T) { - _, b := newRandomBlob(64) - repo := "test/upload/readfrom" - locationPath := fmt.Sprintf("/v2/%s/uploads/testid", repo) - - m := testutil.RequestResponseMap([]testutil.RequestResponseMapping{ - { - Request: testutil.Request{ - Method: "GET", - Route: "/v2/", - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Headers: http.Header(map[string][]string{ - "Docker-Distribution-API-Version": {"registry/2.0"}, - }), - }, - }, - // Test Valid case - { - Request: testutil.Request{ - Method: "PATCH", - Route: locationPath, - Body: b, - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - Headers: http.Header(map[string][]string{ - "Docker-Upload-UUID": {"46603072-7a1b-4b41-98f9-fd8a7da89f9b"}, - "Location": {locationPath}, - "Range": {"0-63"}, - }), - }, - }, - // Test invalid range - { - Request: testutil.Request{ - Method: "PATCH", - Route: locationPath, - Body: b, - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - Headers: http.Header(map[string][]string{ - "Docker-Upload-UUID": {"46603072-7a1b-4b41-98f9-fd8a7da89f9b"}, - "Location": {locationPath}, - "Range": {""}, - }), - }, - }, - // Test 404 - { - Request: testutil.Request{ - Method: "PATCH", - Route: locationPath, - Body: b, - }, - Response: testutil.Response{ - StatusCode: http.StatusNotFound, - }, - }, - // Test 400 valid json - { - Request: testutil.Request{ - Method: "PATCH", - Route: locationPath, - Body: b, - }, - Response: testutil.Response{ - StatusCode: http.StatusBadRequest, - Body: []byte(` - { "errors": - [ - { - "code": "BLOB_UPLOAD_INVALID", - "message": "blob upload invalid", - "detail": "more detail" - } - ] - } `), - }, - }, - // Test 400 invalid json - { - Request: testutil.Request{ - Method: "PATCH", - Route: locationPath, - Body: b, - }, - Response: testutil.Response{ - StatusCode: http.StatusBadRequest, - Body: []byte("something bad happened"), - }, - }, - // Test 500 - { - Request: testutil.Request{ - Method: "PATCH", - Route: locationPath, - Body: b, - }, - Response: testutil.Response{ - StatusCode: http.StatusInternalServerError, - }, - }, - }) - - e, c := testServer(m) - defer c() - - blobUpload := &httpBlobUpload{ - client: &http.Client{}, - } - - // Valid case - blobUpload.location = e + locationPath - n, err := blobUpload.ReadFrom(bytes.NewReader(b)) - if err != nil { - t.Fatalf("Error calling ReadFrom: %s", err) - } - if n != 64 { - t.Fatalf("Wrong length returned from ReadFrom: %d, expected 64", n) - } - - // Bad range - blobUpload.location = e + locationPath - _, err = blobUpload.ReadFrom(bytes.NewReader(b)) - if err == nil { - t.Fatalf("Expected error when bad range received") - } - - // 404 - blobUpload.location = e + locationPath - _, err = blobUpload.ReadFrom(bytes.NewReader(b)) - if err == nil { - t.Fatalf("Expected error when not found") - } - if err != distribution.ErrBlobUploadUnknown { - t.Fatalf("Wrong error thrown: %s, expected %s", err, distribution.ErrBlobUploadUnknown) - } - - // 400 valid json - blobUpload.location = e + locationPath - _, err = blobUpload.ReadFrom(bytes.NewReader(b)) - if err == nil { - t.Fatalf("Expected error when not found") - } - if uploadErr, ok := err.(errcode.Errors); !ok { - t.Fatalf("Wrong error type %T: %s", err, err) - } else if len(uploadErr) != 1 { - t.Fatalf("Unexpected number of errors: %d, expected 1", len(uploadErr)) - } else { - v2Err, ok := uploadErr[0].(errcode.Error) - if !ok { - t.Fatalf("Not an 'Error' type: %#v", uploadErr[0]) - } - if v2Err.Code != v2.ErrorCodeBlobUploadInvalid { - t.Fatalf("Unexpected error code: %s, expected %d", v2Err.Code.String(), v2.ErrorCodeBlobUploadInvalid) - } - if expected := "blob upload invalid"; v2Err.Message != expected { - t.Fatalf("Unexpected error message: %q, expected %q", v2Err.Message, expected) - } - if expected := "more detail"; v2Err.Detail.(string) != expected { - t.Fatalf("Unexpected error message: %q, expected %q", v2Err.Detail.(string), expected) - } - } - - // 400 invalid json - blobUpload.location = e + locationPath - _, err = blobUpload.ReadFrom(bytes.NewReader(b)) - if err == nil { - t.Fatalf("Expected error when not found") - } - if uploadErr, ok := err.(*UnexpectedHTTPResponseError); !ok { - t.Fatalf("Wrong error type %T: %s", err, err) - } else { - respStr := string(uploadErr.Response) - if expected := "something bad happened"; respStr != expected { - t.Fatalf("Unexpected response string: %s, expected: %s", respStr, expected) - } - } - - // 500 - blobUpload.location = e + locationPath - _, err = blobUpload.ReadFrom(bytes.NewReader(b)) - if err == nil { - t.Fatalf("Expected error when not found") - } - if uploadErr, ok := err.(*UnexpectedHTTPStatusError); !ok { - t.Fatalf("Wrong error type %T: %s", err, err) - } else if expected := "500 " + http.StatusText(http.StatusInternalServerError); uploadErr.Status != expected { - t.Fatalf("Unexpected response status: %s, expected %s", uploadErr.Status, expected) - } -} diff --git a/vendor/github.com/docker/distribution/registry/client/errors.go b/vendor/github.com/docker/distribution/registry/client/errors.go deleted file mode 100644 index 52d49d5d2..000000000 --- a/vendor/github.com/docker/distribution/registry/client/errors.go +++ /dev/null @@ -1,139 +0,0 @@ -package client - -import ( - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/client/auth/challenge" -) - -// ErrNoErrorsInBody is returned when an HTTP response body parses to an empty -// errcode.Errors slice. -var ErrNoErrorsInBody = errors.New("no error details found in HTTP response body") - -// UnexpectedHTTPStatusError is returned when an unexpected HTTP status is -// returned when making a registry api call. -type UnexpectedHTTPStatusError struct { - Status string -} - -func (e *UnexpectedHTTPStatusError) Error() string { - return fmt.Sprintf("received unexpected HTTP status: %s", e.Status) -} - -// UnexpectedHTTPResponseError is returned when an expected HTTP status code -// is returned, but the content was unexpected and failed to be parsed. -type UnexpectedHTTPResponseError struct { - ParseErr error - StatusCode int - Response []byte -} - -func (e *UnexpectedHTTPResponseError) Error() string { - return fmt.Sprintf("error parsing HTTP %d response body: %s: %q", e.StatusCode, e.ParseErr.Error(), string(e.Response)) -} - -func parseHTTPErrorResponse(statusCode int, r io.Reader) error { - var errors errcode.Errors - body, err := ioutil.ReadAll(r) - if err != nil { - return err - } - - // For backward compatibility, handle irregularly formatted - // messages that contain a "details" field. - var detailsErr struct { - Details string `json:"details"` - } - err = json.Unmarshal(body, &detailsErr) - if err == nil && detailsErr.Details != "" { - switch statusCode { - case http.StatusUnauthorized: - return errcode.ErrorCodeUnauthorized.WithMessage(detailsErr.Details) - case http.StatusTooManyRequests: - return errcode.ErrorCodeTooManyRequests.WithMessage(detailsErr.Details) - default: - return errcode.ErrorCodeUnknown.WithMessage(detailsErr.Details) - } - } - - if err := json.Unmarshal(body, &errors); err != nil { - return &UnexpectedHTTPResponseError{ - ParseErr: err, - StatusCode: statusCode, - Response: body, - } - } - - if len(errors) == 0 { - // If there was no error specified in the body, return - // UnexpectedHTTPResponseError. - return &UnexpectedHTTPResponseError{ - ParseErr: ErrNoErrorsInBody, - StatusCode: statusCode, - Response: body, - } - } - - return errors -} - -func makeErrorList(err error) []error { - if errL, ok := err.(errcode.Errors); ok { - return []error(errL) - } - return []error{err} -} - -func mergeErrors(err1, err2 error) error { - return errcode.Errors(append(makeErrorList(err1), makeErrorList(err2)...)) -} - -// HandleErrorResponse returns error parsed from HTTP response for an -// unsuccessful HTTP response code (in the range 400 - 499 inclusive). An -// UnexpectedHTTPStatusError returned for response code outside of expected -// range. -func HandleErrorResponse(resp *http.Response) error { - if resp.StatusCode >= 400 && resp.StatusCode < 500 { - // Check for OAuth errors within the `WWW-Authenticate` header first - // See https://tools.ietf.org/html/rfc6750#section-3 - for _, c := range challenge.ResponseChallenges(resp) { - if c.Scheme == "bearer" { - var err errcode.Error - // codes defined at https://tools.ietf.org/html/rfc6750#section-3.1 - switch c.Parameters["error"] { - case "invalid_token": - err.Code = errcode.ErrorCodeUnauthorized - case "insufficient_scope": - err.Code = errcode.ErrorCodeDenied - default: - continue - } - if description := c.Parameters["error_description"]; description != "" { - err.Message = description - } else { - err.Message = err.Code.Message() - } - - return mergeErrors(err, parseHTTPErrorResponse(resp.StatusCode, resp.Body)) - } - } - err := parseHTTPErrorResponse(resp.StatusCode, resp.Body) - if uErr, ok := err.(*UnexpectedHTTPResponseError); ok && resp.StatusCode == 401 { - return errcode.ErrorCodeUnauthorized.WithDetail(uErr.Response) - } - return err - } - return &UnexpectedHTTPStatusError{Status: resp.Status} -} - -// SuccessStatus returns true if the argument is a successful HTTP response -// code (in the range 200 - 399 inclusive). -func SuccessStatus(status int) bool { - return status >= 200 && status <= 399 -} diff --git a/vendor/github.com/docker/distribution/registry/client/errors_test.go b/vendor/github.com/docker/distribution/registry/client/errors_test.go deleted file mode 100644 index ca9dddd10..000000000 --- a/vendor/github.com/docker/distribution/registry/client/errors_test.go +++ /dev/null @@ -1,104 +0,0 @@ -package client - -import ( - "bytes" - "io" - "net/http" - "strings" - "testing" -) - -type nopCloser struct { - io.Reader -} - -func (nopCloser) Close() error { return nil } - -func TestHandleErrorResponse401ValidBody(t *testing.T) { - json := "{\"errors\":[{\"code\":\"UNAUTHORIZED\",\"message\":\"action requires authentication\"}]}" - response := &http.Response{ - Status: "401 Unauthorized", - StatusCode: 401, - Body: nopCloser{bytes.NewBufferString(json)}, - } - err := HandleErrorResponse(response) - - expectedMsg := "unauthorized: action requires authentication" - if !strings.Contains(err.Error(), expectedMsg) { - t.Errorf("Expected \"%s\", got: \"%s\"", expectedMsg, err.Error()) - } -} - -func TestHandleErrorResponse401WithInvalidBody(t *testing.T) { - json := "{invalid json}" - response := &http.Response{ - Status: "401 Unauthorized", - StatusCode: 401, - Body: nopCloser{bytes.NewBufferString(json)}, - } - err := HandleErrorResponse(response) - - expectedMsg := "unauthorized: authentication required" - if !strings.Contains(err.Error(), expectedMsg) { - t.Errorf("Expected \"%s\", got: \"%s\"", expectedMsg, err.Error()) - } -} - -func TestHandleErrorResponseExpectedStatusCode400ValidBody(t *testing.T) { - json := "{\"errors\":[{\"code\":\"DIGEST_INVALID\",\"message\":\"provided digest does not match\"}]}" - response := &http.Response{ - Status: "400 Bad Request", - StatusCode: 400, - Body: nopCloser{bytes.NewBufferString(json)}, - } - err := HandleErrorResponse(response) - - expectedMsg := "digest invalid: provided digest does not match" - if !strings.Contains(err.Error(), expectedMsg) { - t.Errorf("Expected \"%s\", got: \"%s\"", expectedMsg, err.Error()) - } -} - -func TestHandleErrorResponseExpectedStatusCode404EmptyErrorSlice(t *testing.T) { - json := `{"randomkey": "randomvalue"}` - response := &http.Response{ - Status: "404 Not Found", - StatusCode: 404, - Body: nopCloser{bytes.NewBufferString(json)}, - } - err := HandleErrorResponse(response) - - expectedMsg := `error parsing HTTP 404 response body: no error details found in HTTP response body: "{\"randomkey\": \"randomvalue\"}"` - if !strings.Contains(err.Error(), expectedMsg) { - t.Errorf("Expected \"%s\", got: \"%s\"", expectedMsg, err.Error()) - } -} - -func TestHandleErrorResponseExpectedStatusCode404InvalidBody(t *testing.T) { - json := "{invalid json}" - response := &http.Response{ - Status: "404 Not Found", - StatusCode: 404, - Body: nopCloser{bytes.NewBufferString(json)}, - } - err := HandleErrorResponse(response) - - expectedMsg := "error parsing HTTP 404 response body: invalid character 'i' looking for beginning of object key string: \"{invalid json}\"" - if !strings.Contains(err.Error(), expectedMsg) { - t.Errorf("Expected \"%s\", got: \"%s\"", expectedMsg, err.Error()) - } -} - -func TestHandleErrorResponseUnexpectedStatusCode501(t *testing.T) { - response := &http.Response{ - Status: "501 Not Implemented", - StatusCode: 501, - Body: nopCloser{bytes.NewBufferString("{\"Error Encountered\" : \"Function not implemented.\"}")}, - } - err := HandleErrorResponse(response) - - expectedMsg := "received unexpected HTTP status: 501 Not Implemented" - if !strings.Contains(err.Error(), expectedMsg) { - t.Errorf("Expected \"%s\", got: \"%s\"", expectedMsg, err.Error()) - } -} diff --git a/vendor/github.com/docker/distribution/registry/client/repository.go b/vendor/github.com/docker/distribution/registry/client/repository.go deleted file mode 100644 index 1ebd0b183..000000000 --- a/vendor/github.com/docker/distribution/registry/client/repository.go +++ /dev/null @@ -1,853 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "strings" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/api/v2" - "github.com/docker/distribution/registry/client/transport" - "github.com/docker/distribution/registry/storage/cache" - "github.com/docker/distribution/registry/storage/cache/memory" -) - -// Registry provides an interface for calling Repositories, which returns a catalog of repositories. -type Registry interface { - Repositories(ctx context.Context, repos []string, last string) (n int, err error) -} - -// checkHTTPRedirect is a callback that can manipulate redirected HTTP -// requests. It is used to preserve Accept and Range headers. -func checkHTTPRedirect(req *http.Request, via []*http.Request) error { - if len(via) >= 10 { - return errors.New("stopped after 10 redirects") - } - - if len(via) > 0 { - for headerName, headerVals := range via[0].Header { - if headerName != "Accept" && headerName != "Range" { - continue - } - for _, val := range headerVals { - // Don't add to redirected request if redirected - // request already has a header with the same - // name and value. - hasValue := false - for _, existingVal := range req.Header[headerName] { - if existingVal == val { - hasValue = true - break - } - } - if !hasValue { - req.Header.Add(headerName, val) - } - } - } - } - - return nil -} - -// NewRegistry creates a registry namespace which can be used to get a listing of repositories -func NewRegistry(ctx context.Context, baseURL string, transport http.RoundTripper) (Registry, error) { - ub, err := v2.NewURLBuilderFromString(baseURL, false) - if err != nil { - return nil, err - } - - client := &http.Client{ - Transport: transport, - Timeout: 1 * time.Minute, - CheckRedirect: checkHTTPRedirect, - } - - return ®istry{ - client: client, - ub: ub, - context: ctx, - }, nil -} - -type registry struct { - client *http.Client - ub *v2.URLBuilder - context context.Context -} - -// Repositories returns a lexigraphically sorted catalog given a base URL. The 'entries' slice will be filled up to the size -// of the slice, starting at the value provided in 'last'. The number of entries will be returned along with io.EOF if there -// are no more entries -func (r *registry) Repositories(ctx context.Context, entries []string, last string) (int, error) { - var numFilled int - var returnErr error - - values := buildCatalogValues(len(entries), last) - u, err := r.ub.BuildCatalogURL(values) - if err != nil { - return 0, err - } - - resp, err := r.client.Get(u) - if err != nil { - return 0, err - } - defer resp.Body.Close() - - if SuccessStatus(resp.StatusCode) { - var ctlg struct { - Repositories []string `json:"repositories"` - } - decoder := json.NewDecoder(resp.Body) - - if err := decoder.Decode(&ctlg); err != nil { - return 0, err - } - - for cnt := range ctlg.Repositories { - entries[cnt] = ctlg.Repositories[cnt] - } - numFilled = len(ctlg.Repositories) - - link := resp.Header.Get("Link") - if link == "" { - returnErr = io.EOF - } - } else { - return 0, HandleErrorResponse(resp) - } - - return numFilled, returnErr -} - -// NewRepository creates a new Repository for the given repository name and base URL. -func NewRepository(ctx context.Context, name reference.Named, baseURL string, transport http.RoundTripper) (distribution.Repository, error) { - ub, err := v2.NewURLBuilderFromString(baseURL, false) - if err != nil { - return nil, err - } - - client := &http.Client{ - Transport: transport, - CheckRedirect: checkHTTPRedirect, - // TODO(dmcgowan): create cookie jar - } - - return &repository{ - client: client, - ub: ub, - name: name, - context: ctx, - }, nil -} - -type repository struct { - client *http.Client - ub *v2.URLBuilder - context context.Context - name reference.Named -} - -func (r *repository) Named() reference.Named { - return r.name -} - -func (r *repository) Blobs(ctx context.Context) distribution.BlobStore { - statter := &blobStatter{ - name: r.name, - ub: r.ub, - client: r.client, - } - return &blobs{ - name: r.name, - ub: r.ub, - client: r.client, - statter: cache.NewCachedBlobStatter(memory.NewInMemoryBlobDescriptorCacheProvider(), statter), - } -} - -func (r *repository) Manifests(ctx context.Context, options ...distribution.ManifestServiceOption) (distribution.ManifestService, error) { - // todo(richardscothern): options should be sent over the wire - return &manifests{ - name: r.name, - ub: r.ub, - client: r.client, - etags: make(map[string]string), - }, nil -} - -func (r *repository) Tags(ctx context.Context) distribution.TagService { - return &tags{ - client: r.client, - ub: r.ub, - context: r.context, - name: r.Named(), - } -} - -// tags implements remote tagging operations. -type tags struct { - client *http.Client - ub *v2.URLBuilder - context context.Context - name reference.Named -} - -// All returns all tags -func (t *tags) All(ctx context.Context) ([]string, error) { - var tags []string - - u, err := t.ub.BuildTagsURL(t.name) - if err != nil { - return tags, err - } - - for { - resp, err := t.client.Get(u) - if err != nil { - return tags, err - } - defer resp.Body.Close() - - if SuccessStatus(resp.StatusCode) { - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - return tags, err - } - - tagsResponse := struct { - Tags []string `json:"tags"` - }{} - if err := json.Unmarshal(b, &tagsResponse); err != nil { - return tags, err - } - tags = append(tags, tagsResponse.Tags...) - if link := resp.Header.Get("Link"); link != "" { - u = strings.Trim(strings.Split(link, ";")[0], "<>") - } else { - return tags, nil - } - } else { - return tags, HandleErrorResponse(resp) - } - } -} - -func descriptorFromResponse(response *http.Response) (distribution.Descriptor, error) { - desc := distribution.Descriptor{} - headers := response.Header - - ctHeader := headers.Get("Content-Type") - if ctHeader == "" { - return distribution.Descriptor{}, errors.New("missing or empty Content-Type header") - } - desc.MediaType = ctHeader - - digestHeader := headers.Get("Docker-Content-Digest") - if digestHeader == "" { - bytes, err := ioutil.ReadAll(response.Body) - if err != nil { - return distribution.Descriptor{}, err - } - _, desc, err := distribution.UnmarshalManifest(ctHeader, bytes) - if err != nil { - return distribution.Descriptor{}, err - } - return desc, nil - } - - dgst, err := digest.ParseDigest(digestHeader) - if err != nil { - return distribution.Descriptor{}, err - } - desc.Digest = dgst - - lengthHeader := headers.Get("Content-Length") - if lengthHeader == "" { - return distribution.Descriptor{}, errors.New("missing or empty Content-Length header") - } - length, err := strconv.ParseInt(lengthHeader, 10, 64) - if err != nil { - return distribution.Descriptor{}, err - } - desc.Size = length - - return desc, nil - -} - -// Get issues a HEAD request for a Manifest against its named endpoint in order -// to construct a descriptor for the tag. If the registry doesn't support HEADing -// a manifest, fallback to GET. -func (t *tags) Get(ctx context.Context, tag string) (distribution.Descriptor, error) { - ref, err := reference.WithTag(t.name, tag) - if err != nil { - return distribution.Descriptor{}, err - } - u, err := t.ub.BuildManifestURL(ref) - if err != nil { - return distribution.Descriptor{}, err - } - - newRequest := func(method string) (*http.Response, error) { - req, err := http.NewRequest(method, u, nil) - if err != nil { - return nil, err - } - - for _, t := range distribution.ManifestMediaTypes() { - req.Header.Add("Accept", t) - } - resp, err := t.client.Do(req) - return resp, err - } - - resp, err := newRequest("HEAD") - if err != nil { - return distribution.Descriptor{}, err - } - defer resp.Body.Close() - - switch { - case resp.StatusCode >= 200 && resp.StatusCode < 400: - return descriptorFromResponse(resp) - default: - // if the response is an error - there will be no body to decode. - // Issue a GET request: - // - for data from a server that does not handle HEAD - // - to get error details in case of a failure - resp, err = newRequest("GET") - if err != nil { - return distribution.Descriptor{}, err - } - defer resp.Body.Close() - - if resp.StatusCode >= 200 && resp.StatusCode < 400 { - return descriptorFromResponse(resp) - } - return distribution.Descriptor{}, HandleErrorResponse(resp) - } -} - -func (t *tags) Lookup(ctx context.Context, digest distribution.Descriptor) ([]string, error) { - panic("not implemented") -} - -func (t *tags) Tag(ctx context.Context, tag string, desc distribution.Descriptor) error { - panic("not implemented") -} - -func (t *tags) Untag(ctx context.Context, tag string) error { - panic("not implemented") -} - -type manifests struct { - name reference.Named - ub *v2.URLBuilder - client *http.Client - etags map[string]string -} - -func (ms *manifests) Exists(ctx context.Context, dgst digest.Digest) (bool, error) { - ref, err := reference.WithDigest(ms.name, dgst) - if err != nil { - return false, err - } - u, err := ms.ub.BuildManifestURL(ref) - if err != nil { - return false, err - } - - resp, err := ms.client.Head(u) - if err != nil { - return false, err - } - - if SuccessStatus(resp.StatusCode) { - return true, nil - } else if resp.StatusCode == http.StatusNotFound { - return false, nil - } - return false, HandleErrorResponse(resp) -} - -// AddEtagToTag allows a client to supply an eTag to Get which will be -// used for a conditional HTTP request. If the eTag matches, a nil manifest -// and ErrManifestNotModified error will be returned. etag is automatically -// quoted when added to this map. -func AddEtagToTag(tag, etag string) distribution.ManifestServiceOption { - return etagOption{tag, etag} -} - -type etagOption struct{ tag, etag string } - -func (o etagOption) Apply(ms distribution.ManifestService) error { - if ms, ok := ms.(*manifests); ok { - ms.etags[o.tag] = fmt.Sprintf(`"%s"`, o.etag) - return nil - } - return fmt.Errorf("etag options is a client-only option") -} - -// ReturnContentDigest allows a client to set a the content digest on -// a successful request from the 'Docker-Content-Digest' header. This -// returned digest is represents the digest which the registry uses -// to refer to the content and can be used to delete the content. -func ReturnContentDigest(dgst *digest.Digest) distribution.ManifestServiceOption { - return contentDigestOption{dgst} -} - -type contentDigestOption struct{ digest *digest.Digest } - -func (o contentDigestOption) Apply(ms distribution.ManifestService) error { - return nil -} - -func (ms *manifests) Get(ctx context.Context, dgst digest.Digest, options ...distribution.ManifestServiceOption) (distribution.Manifest, error) { - var ( - digestOrTag string - ref reference.Named - err error - contentDgst *digest.Digest - ) - - for _, option := range options { - if opt, ok := option.(distribution.WithTagOption); ok { - digestOrTag = opt.Tag - ref, err = reference.WithTag(ms.name, opt.Tag) - if err != nil { - return nil, err - } - } else if opt, ok := option.(contentDigestOption); ok { - contentDgst = opt.digest - } else { - err := option.Apply(ms) - if err != nil { - return nil, err - } - } - } - - if digestOrTag == "" { - digestOrTag = dgst.String() - ref, err = reference.WithDigest(ms.name, dgst) - if err != nil { - return nil, err - } - } - - u, err := ms.ub.BuildManifestURL(ref) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("GET", u, nil) - if err != nil { - return nil, err - } - - for _, t := range distribution.ManifestMediaTypes() { - req.Header.Add("Accept", t) - } - - if _, ok := ms.etags[digestOrTag]; ok { - req.Header.Set("If-None-Match", ms.etags[digestOrTag]) - } - - resp, err := ms.client.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - if resp.StatusCode == http.StatusNotModified { - return nil, distribution.ErrManifestNotModified - } else if SuccessStatus(resp.StatusCode) { - if contentDgst != nil { - dgst, err := digest.ParseDigest(resp.Header.Get("Docker-Content-Digest")) - if err == nil { - *contentDgst = dgst - } - } - mt := resp.Header.Get("Content-Type") - body, err := ioutil.ReadAll(resp.Body) - - if err != nil { - return nil, err - } - m, _, err := distribution.UnmarshalManifest(mt, body) - if err != nil { - return nil, err - } - return m, nil - } - return nil, HandleErrorResponse(resp) -} - -// Put puts a manifest. A tag can be specified using an options parameter which uses some shared state to hold the -// tag name in order to build the correct upload URL. -func (ms *manifests) Put(ctx context.Context, m distribution.Manifest, options ...distribution.ManifestServiceOption) (digest.Digest, error) { - ref := ms.name - var tagged bool - - for _, option := range options { - if opt, ok := option.(distribution.WithTagOption); ok { - var err error - ref, err = reference.WithTag(ref, opt.Tag) - if err != nil { - return "", err - } - tagged = true - } else { - err := option.Apply(ms) - if err != nil { - return "", err - } - } - } - mediaType, p, err := m.Payload() - if err != nil { - return "", err - } - - if !tagged { - // generate a canonical digest and Put by digest - _, d, err := distribution.UnmarshalManifest(mediaType, p) - if err != nil { - return "", err - } - ref, err = reference.WithDigest(ref, d.Digest) - if err != nil { - return "", err - } - } - - manifestURL, err := ms.ub.BuildManifestURL(ref) - if err != nil { - return "", err - } - - putRequest, err := http.NewRequest("PUT", manifestURL, bytes.NewReader(p)) - if err != nil { - return "", err - } - - putRequest.Header.Set("Content-Type", mediaType) - - resp, err := ms.client.Do(putRequest) - if err != nil { - return "", err - } - defer resp.Body.Close() - - if SuccessStatus(resp.StatusCode) { - dgstHeader := resp.Header.Get("Docker-Content-Digest") - dgst, err := digest.ParseDigest(dgstHeader) - if err != nil { - return "", err - } - - return dgst, nil - } - - return "", HandleErrorResponse(resp) -} - -func (ms *manifests) Delete(ctx context.Context, dgst digest.Digest) error { - ref, err := reference.WithDigest(ms.name, dgst) - if err != nil { - return err - } - u, err := ms.ub.BuildManifestURL(ref) - if err != nil { - return err - } - req, err := http.NewRequest("DELETE", u, nil) - if err != nil { - return err - } - - resp, err := ms.client.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - if SuccessStatus(resp.StatusCode) { - return nil - } - return HandleErrorResponse(resp) -} - -// todo(richardscothern): Restore interface and implementation with merge of #1050 -/*func (ms *manifests) Enumerate(ctx context.Context, manifests []distribution.Manifest, last distribution.Manifest) (n int, err error) { - panic("not supported") -}*/ - -type blobs struct { - name reference.Named - ub *v2.URLBuilder - client *http.Client - - statter distribution.BlobDescriptorService - distribution.BlobDeleter -} - -func sanitizeLocation(location, base string) (string, error) { - baseURL, err := url.Parse(base) - if err != nil { - return "", err - } - - locationURL, err := url.Parse(location) - if err != nil { - return "", err - } - - return baseURL.ResolveReference(locationURL).String(), nil -} - -func (bs *blobs) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - return bs.statter.Stat(ctx, dgst) - -} - -func (bs *blobs) Get(ctx context.Context, dgst digest.Digest) ([]byte, error) { - reader, err := bs.Open(ctx, dgst) - if err != nil { - return nil, err - } - defer reader.Close() - - return ioutil.ReadAll(reader) -} - -func (bs *blobs) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { - ref, err := reference.WithDigest(bs.name, dgst) - if err != nil { - return nil, err - } - blobURL, err := bs.ub.BuildBlobURL(ref) - if err != nil { - return nil, err - } - - return transport.NewHTTPReadSeeker(bs.client, blobURL, - func(resp *http.Response) error { - if resp.StatusCode == http.StatusNotFound { - return distribution.ErrBlobUnknown - } - return HandleErrorResponse(resp) - }), nil -} - -func (bs *blobs) ServeBlob(ctx context.Context, w http.ResponseWriter, r *http.Request, dgst digest.Digest) error { - panic("not implemented") -} - -func (bs *blobs) Put(ctx context.Context, mediaType string, p []byte) (distribution.Descriptor, error) { - writer, err := bs.Create(ctx) - if err != nil { - return distribution.Descriptor{}, err - } - dgstr := digest.Canonical.New() - n, err := io.Copy(writer, io.TeeReader(bytes.NewReader(p), dgstr.Hash())) - if err != nil { - return distribution.Descriptor{}, err - } - if n < int64(len(p)) { - return distribution.Descriptor{}, fmt.Errorf("short copy: wrote %d of %d", n, len(p)) - } - - desc := distribution.Descriptor{ - MediaType: mediaType, - Size: int64(len(p)), - Digest: dgstr.Digest(), - } - - return writer.Commit(ctx, desc) -} - -type optionFunc func(interface{}) error - -func (f optionFunc) Apply(v interface{}) error { - return f(v) -} - -// WithMountFrom returns a BlobCreateOption which designates that the blob should be -// mounted from the given canonical reference. -func WithMountFrom(ref reference.Canonical) distribution.BlobCreateOption { - return optionFunc(func(v interface{}) error { - opts, ok := v.(*distribution.CreateOptions) - if !ok { - return fmt.Errorf("unexpected options type: %T", v) - } - - opts.Mount.ShouldMount = true - opts.Mount.From = ref - - return nil - }) -} - -func (bs *blobs) Create(ctx context.Context, options ...distribution.BlobCreateOption) (distribution.BlobWriter, error) { - var opts distribution.CreateOptions - - for _, option := range options { - err := option.Apply(&opts) - if err != nil { - return nil, err - } - } - - var values []url.Values - - if opts.Mount.ShouldMount { - values = append(values, url.Values{"from": {opts.Mount.From.Name()}, "mount": {opts.Mount.From.Digest().String()}}) - } - - u, err := bs.ub.BuildBlobUploadURL(bs.name, values...) - if err != nil { - return nil, err - } - - resp, err := bs.client.Post(u, "", nil) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - switch resp.StatusCode { - case http.StatusCreated: - desc, err := bs.statter.Stat(ctx, opts.Mount.From.Digest()) - if err != nil { - return nil, err - } - return nil, distribution.ErrBlobMounted{From: opts.Mount.From, Descriptor: desc} - case http.StatusAccepted: - // TODO(dmcgowan): Check for invalid UUID - uuid := resp.Header.Get("Docker-Upload-UUID") - location, err := sanitizeLocation(resp.Header.Get("Location"), u) - if err != nil { - return nil, err - } - - return &httpBlobUpload{ - statter: bs.statter, - client: bs.client, - uuid: uuid, - startedAt: time.Now(), - location: location, - }, nil - default: - return nil, HandleErrorResponse(resp) - } -} - -func (bs *blobs) Resume(ctx context.Context, id string) (distribution.BlobWriter, error) { - panic("not implemented") -} - -func (bs *blobs) Delete(ctx context.Context, dgst digest.Digest) error { - return bs.statter.Clear(ctx, dgst) -} - -type blobStatter struct { - name reference.Named - ub *v2.URLBuilder - client *http.Client -} - -func (bs *blobStatter) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - ref, err := reference.WithDigest(bs.name, dgst) - if err != nil { - return distribution.Descriptor{}, err - } - u, err := bs.ub.BuildBlobURL(ref) - if err != nil { - return distribution.Descriptor{}, err - } - - resp, err := bs.client.Head(u) - if err != nil { - return distribution.Descriptor{}, err - } - defer resp.Body.Close() - - if SuccessStatus(resp.StatusCode) { - lengthHeader := resp.Header.Get("Content-Length") - if lengthHeader == "" { - return distribution.Descriptor{}, fmt.Errorf("missing content-length header for request: %s", u) - } - - length, err := strconv.ParseInt(lengthHeader, 10, 64) - if err != nil { - return distribution.Descriptor{}, fmt.Errorf("error parsing content-length: %v", err) - } - - return distribution.Descriptor{ - MediaType: resp.Header.Get("Content-Type"), - Size: length, - Digest: dgst, - }, nil - } else if resp.StatusCode == http.StatusNotFound { - return distribution.Descriptor{}, distribution.ErrBlobUnknown - } - return distribution.Descriptor{}, HandleErrorResponse(resp) -} - -func buildCatalogValues(maxEntries int, last string) url.Values { - values := url.Values{} - - if maxEntries > 0 { - values.Add("n", strconv.Itoa(maxEntries)) - } - - if last != "" { - values.Add("last", last) - } - - return values -} - -func (bs *blobStatter) Clear(ctx context.Context, dgst digest.Digest) error { - ref, err := reference.WithDigest(bs.name, dgst) - if err != nil { - return err - } - blobURL, err := bs.ub.BuildBlobURL(ref) - if err != nil { - return err - } - - req, err := http.NewRequest("DELETE", blobURL, nil) - if err != nil { - return err - } - - resp, err := bs.client.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - if SuccessStatus(resp.StatusCode) { - return nil - } - return HandleErrorResponse(resp) -} - -func (bs *blobStatter) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/client/repository_test.go b/vendor/github.com/docker/distribution/registry/client/repository_test.go deleted file mode 100644 index a232e03ec..000000000 --- a/vendor/github.com/docker/distribution/registry/client/repository_test.go +++ /dev/null @@ -1,1226 +0,0 @@ -package client - -import ( - "bytes" - "crypto/rand" - "encoding/json" - "fmt" - "io" - "log" - "net/http" - "net/http/httptest" - "strconv" - "strings" - "testing" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" - "github.com/docker/distribution/testutil" - "github.com/docker/distribution/uuid" - "github.com/docker/libtrust" -) - -func testServer(rrm testutil.RequestResponseMap) (string, func()) { - h := testutil.NewHandler(rrm) - s := httptest.NewServer(h) - return s.URL, s.Close -} - -func newRandomBlob(size int) (digest.Digest, []byte) { - b := make([]byte, size) - if n, err := rand.Read(b); err != nil { - panic(err) - } else if n != size { - panic("unable to read enough bytes") - } - - return digest.FromBytes(b), b -} - -func addTestFetch(repo string, dgst digest.Digest, content []byte, m *testutil.RequestResponseMap) { - *m = append(*m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "GET", - Route: "/v2/" + repo + "/blobs/" + dgst.String(), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: content, - Headers: http.Header(map[string][]string{ - "Content-Length": {fmt.Sprint(len(content))}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - }), - }, - }) - - *m = append(*m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "HEAD", - Route: "/v2/" + repo + "/blobs/" + dgst.String(), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Headers: http.Header(map[string][]string{ - "Content-Length": {fmt.Sprint(len(content))}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - }), - }, - }) -} - -func addTestCatalog(route string, content []byte, link string, m *testutil.RequestResponseMap) { - headers := map[string][]string{ - "Content-Length": {strconv.Itoa(len(content))}, - "Content-Type": {"application/json; charset=utf-8"}, - } - if link != "" { - headers["Link"] = append(headers["Link"], link) - } - - *m = append(*m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "GET", - Route: route, - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: content, - Headers: http.Header(headers), - }, - }) -} - -func TestBlobDelete(t *testing.T) { - dgst, _ := newRandomBlob(1024) - var m testutil.RequestResponseMap - repo, _ := reference.ParseNamed("test.example.com/repo1") - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "DELETE", - Route: "/v2/" + repo.Name() + "/blobs/" + dgst.String(), - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - Headers: http.Header(map[string][]string{ - "Content-Length": {"0"}, - }), - }, - }) - - e, c := testServer(m) - defer c() - - ctx := context.Background() - r, err := NewRepository(ctx, repo, e, nil) - if err != nil { - t.Fatal(err) - } - l := r.Blobs(ctx) - err = l.Delete(ctx, dgst) - if err != nil { - t.Errorf("Error deleting blob: %s", err.Error()) - } - -} - -func TestBlobFetch(t *testing.T) { - d1, b1 := newRandomBlob(1024) - var m testutil.RequestResponseMap - addTestFetch("test.example.com/repo1", d1, b1, &m) - - e, c := testServer(m) - defer c() - - ctx := context.Background() - repo, _ := reference.ParseNamed("test.example.com/repo1") - r, err := NewRepository(ctx, repo, e, nil) - if err != nil { - t.Fatal(err) - } - l := r.Blobs(ctx) - - b, err := l.Get(ctx, d1) - if err != nil { - t.Fatal(err) - } - if bytes.Compare(b, b1) != 0 { - t.Fatalf("Wrong bytes values fetched: [%d]byte != [%d]byte", len(b), len(b1)) - } - - // TODO(dmcgowan): Test for unknown blob case -} - -func TestBlobExistsNoContentLength(t *testing.T) { - var m testutil.RequestResponseMap - - repo, _ := reference.ParseNamed("biff") - dgst, content := newRandomBlob(1024) - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "GET", - Route: "/v2/" + repo.Name() + "/blobs/" + dgst.String(), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: content, - Headers: http.Header(map[string][]string{ - // "Content-Length": {fmt.Sprint(len(content))}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - }), - }, - }) - - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "HEAD", - Route: "/v2/" + repo.Name() + "/blobs/" + dgst.String(), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Headers: http.Header(map[string][]string{ - // "Content-Length": {fmt.Sprint(len(content))}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - }), - }, - }) - e, c := testServer(m) - defer c() - - ctx := context.Background() - r, err := NewRepository(ctx, repo, e, nil) - if err != nil { - t.Fatal(err) - } - l := r.Blobs(ctx) - - _, err = l.Stat(ctx, dgst) - if err == nil { - t.Fatal(err) - } - if !strings.Contains(err.Error(), "missing content-length heade") { - t.Fatalf("Expected missing content-length error message") - } - -} - -func TestBlobExists(t *testing.T) { - d1, b1 := newRandomBlob(1024) - var m testutil.RequestResponseMap - addTestFetch("test.example.com/repo1", d1, b1, &m) - - e, c := testServer(m) - defer c() - - ctx := context.Background() - repo, _ := reference.ParseNamed("test.example.com/repo1") - r, err := NewRepository(ctx, repo, e, nil) - if err != nil { - t.Fatal(err) - } - l := r.Blobs(ctx) - - stat, err := l.Stat(ctx, d1) - if err != nil { - t.Fatal(err) - } - - if stat.Digest != d1 { - t.Fatalf("Unexpected digest: %s, expected %s", stat.Digest, d1) - } - - if stat.Size != int64(len(b1)) { - t.Fatalf("Unexpected length: %d, expected %d", stat.Size, len(b1)) - } - - // TODO(dmcgowan): Test error cases and ErrBlobUnknown case -} - -func TestBlobUploadChunked(t *testing.T) { - dgst, b1 := newRandomBlob(1024) - var m testutil.RequestResponseMap - chunks := [][]byte{ - b1[0:256], - b1[256:512], - b1[512:513], - b1[513:1024], - } - repo, _ := reference.ParseNamed("test.example.com/uploadrepo") - uuids := []string{uuid.Generate().String()} - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "POST", - Route: "/v2/" + repo.Name() + "/blobs/uploads/", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - Headers: http.Header(map[string][]string{ - "Content-Length": {"0"}, - "Location": {"/v2/" + repo.Name() + "/blobs/uploads/" + uuids[0]}, - "Docker-Upload-UUID": {uuids[0]}, - "Range": {"0-0"}, - }), - }, - }) - offset := 0 - for i, chunk := range chunks { - uuids = append(uuids, uuid.Generate().String()) - newOffset := offset + len(chunk) - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "PATCH", - Route: "/v2/" + repo.Name() + "/blobs/uploads/" + uuids[i], - Body: chunk, - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - Headers: http.Header(map[string][]string{ - "Content-Length": {"0"}, - "Location": {"/v2/" + repo.Name() + "/blobs/uploads/" + uuids[i+1]}, - "Docker-Upload-UUID": {uuids[i+1]}, - "Range": {fmt.Sprintf("%d-%d", offset, newOffset-1)}, - }), - }, - }) - offset = newOffset - } - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "PUT", - Route: "/v2/" + repo.Name() + "/blobs/uploads/" + uuids[len(uuids)-1], - QueryParams: map[string][]string{ - "digest": {dgst.String()}, - }, - }, - Response: testutil.Response{ - StatusCode: http.StatusCreated, - Headers: http.Header(map[string][]string{ - "Content-Length": {"0"}, - "Docker-Content-Digest": {dgst.String()}, - "Content-Range": {fmt.Sprintf("0-%d", offset-1)}, - }), - }, - }) - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "HEAD", - Route: "/v2/" + repo.Name() + "/blobs/" + dgst.String(), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Headers: http.Header(map[string][]string{ - "Content-Length": {fmt.Sprint(offset)}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - }), - }, - }) - - e, c := testServer(m) - defer c() - - ctx := context.Background() - r, err := NewRepository(ctx, repo, e, nil) - if err != nil { - t.Fatal(err) - } - l := r.Blobs(ctx) - - upload, err := l.Create(ctx) - if err != nil { - t.Fatal(err) - } - - if upload.ID() != uuids[0] { - log.Fatalf("Unexpected UUID %s; expected %s", upload.ID(), uuids[0]) - } - - for _, chunk := range chunks { - n, err := upload.Write(chunk) - if err != nil { - t.Fatal(err) - } - if n != len(chunk) { - t.Fatalf("Unexpected length returned from write: %d; expected: %d", n, len(chunk)) - } - } - - blob, err := upload.Commit(ctx, distribution.Descriptor{ - Digest: dgst, - Size: int64(len(b1)), - }) - if err != nil { - t.Fatal(err) - } - - if blob.Size != int64(len(b1)) { - t.Fatalf("Unexpected blob size: %d; expected: %d", blob.Size, len(b1)) - } -} - -func TestBlobUploadMonolithic(t *testing.T) { - dgst, b1 := newRandomBlob(1024) - var m testutil.RequestResponseMap - repo, _ := reference.ParseNamed("test.example.com/uploadrepo") - uploadID := uuid.Generate().String() - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "POST", - Route: "/v2/" + repo.Name() + "/blobs/uploads/", - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - Headers: http.Header(map[string][]string{ - "Content-Length": {"0"}, - "Location": {"/v2/" + repo.Name() + "/blobs/uploads/" + uploadID}, - "Docker-Upload-UUID": {uploadID}, - "Range": {"0-0"}, - }), - }, - }) - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "PATCH", - Route: "/v2/" + repo.Name() + "/blobs/uploads/" + uploadID, - Body: b1, - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - Headers: http.Header(map[string][]string{ - "Location": {"/v2/" + repo.Name() + "/blobs/uploads/" + uploadID}, - "Docker-Upload-UUID": {uploadID}, - "Content-Length": {"0"}, - "Docker-Content-Digest": {dgst.String()}, - "Range": {fmt.Sprintf("0-%d", len(b1)-1)}, - }), - }, - }) - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "PUT", - Route: "/v2/" + repo.Name() + "/blobs/uploads/" + uploadID, - QueryParams: map[string][]string{ - "digest": {dgst.String()}, - }, - }, - Response: testutil.Response{ - StatusCode: http.StatusCreated, - Headers: http.Header(map[string][]string{ - "Content-Length": {"0"}, - "Docker-Content-Digest": {dgst.String()}, - "Content-Range": {fmt.Sprintf("0-%d", len(b1)-1)}, - }), - }, - }) - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "HEAD", - Route: "/v2/" + repo.Name() + "/blobs/" + dgst.String(), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Headers: http.Header(map[string][]string{ - "Content-Length": {fmt.Sprint(len(b1))}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - }), - }, - }) - - e, c := testServer(m) - defer c() - - ctx := context.Background() - r, err := NewRepository(ctx, repo, e, nil) - if err != nil { - t.Fatal(err) - } - l := r.Blobs(ctx) - - upload, err := l.Create(ctx) - if err != nil { - t.Fatal(err) - } - - if upload.ID() != uploadID { - log.Fatalf("Unexpected UUID %s; expected %s", upload.ID(), uploadID) - } - - n, err := upload.ReadFrom(bytes.NewReader(b1)) - if err != nil { - t.Fatal(err) - } - if n != int64(len(b1)) { - t.Fatalf("Unexpected ReadFrom length: %d; expected: %d", n, len(b1)) - } - - blob, err := upload.Commit(ctx, distribution.Descriptor{ - Digest: dgst, - Size: int64(len(b1)), - }) - if err != nil { - t.Fatal(err) - } - - if blob.Size != int64(len(b1)) { - t.Fatalf("Unexpected blob size: %d; expected: %d", blob.Size, len(b1)) - } -} - -func TestBlobMount(t *testing.T) { - dgst, content := newRandomBlob(1024) - var m testutil.RequestResponseMap - repo, _ := reference.ParseNamed("test.example.com/uploadrepo") - - sourceRepo, _ := reference.ParseNamed("test.example.com/sourcerepo") - canonicalRef, _ := reference.WithDigest(sourceRepo, dgst) - - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "POST", - Route: "/v2/" + repo.Name() + "/blobs/uploads/", - QueryParams: map[string][]string{"from": {sourceRepo.Name()}, "mount": {dgst.String()}}, - }, - Response: testutil.Response{ - StatusCode: http.StatusCreated, - Headers: http.Header(map[string][]string{ - "Content-Length": {"0"}, - "Location": {"/v2/" + repo.Name() + "/blobs/" + dgst.String()}, - "Docker-Content-Digest": {dgst.String()}, - }), - }, - }) - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "HEAD", - Route: "/v2/" + repo.Name() + "/blobs/" + dgst.String(), - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Headers: http.Header(map[string][]string{ - "Content-Length": {fmt.Sprint(len(content))}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - }), - }, - }) - - e, c := testServer(m) - defer c() - - ctx := context.Background() - r, err := NewRepository(ctx, repo, e, nil) - if err != nil { - t.Fatal(err) - } - - l := r.Blobs(ctx) - - bw, err := l.Create(ctx, WithMountFrom(canonicalRef)) - if bw != nil { - t.Fatalf("Expected blob writer to be nil, was %v", bw) - } - - if ebm, ok := err.(distribution.ErrBlobMounted); ok { - if ebm.From.Digest() != dgst { - t.Fatalf("Unexpected digest: %s, expected %s", ebm.From.Digest(), dgst) - } - if ebm.From.Name() != sourceRepo.Name() { - t.Fatalf("Unexpected from: %s, expected %s", ebm.From.Name(), sourceRepo) - } - } else { - t.Fatalf("Unexpected error: %v, expected an ErrBlobMounted", err) - } -} - -func newRandomSchemaV1Manifest(name reference.Named, tag string, blobCount int) (*schema1.SignedManifest, digest.Digest, []byte) { - blobs := make([]schema1.FSLayer, blobCount) - history := make([]schema1.History, blobCount) - - for i := 0; i < blobCount; i++ { - dgst, blob := newRandomBlob((i % 5) * 16) - - blobs[i] = schema1.FSLayer{BlobSum: dgst} - history[i] = schema1.History{V1Compatibility: fmt.Sprintf("{\"Hex\": \"%x\"}", blob)} - } - - m := schema1.Manifest{ - Name: name.String(), - Tag: tag, - Architecture: "x86", - FSLayers: blobs, - History: history, - Versioned: manifest.Versioned{ - SchemaVersion: 1, - }, - } - - pk, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - panic(err) - } - - sm, err := schema1.Sign(&m, pk) - if err != nil { - panic(err) - } - - return sm, digest.FromBytes(sm.Canonical), sm.Canonical -} - -func addTestManifestWithEtag(repo reference.Named, reference string, content []byte, m *testutil.RequestResponseMap, dgst string) { - actualDigest := digest.FromBytes(content) - getReqWithEtag := testutil.Request{ - Method: "GET", - Route: "/v2/" + repo.Name() + "/manifests/" + reference, - Headers: http.Header(map[string][]string{ - "If-None-Match": {fmt.Sprintf(`"%s"`, dgst)}, - }), - } - - var getRespWithEtag testutil.Response - if actualDigest.String() == dgst { - getRespWithEtag = testutil.Response{ - StatusCode: http.StatusNotModified, - Body: []byte{}, - Headers: http.Header(map[string][]string{ - "Content-Length": {"0"}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - "Content-Type": {schema1.MediaTypeSignedManifest}, - }), - } - } else { - getRespWithEtag = testutil.Response{ - StatusCode: http.StatusOK, - Body: content, - Headers: http.Header(map[string][]string{ - "Content-Length": {fmt.Sprint(len(content))}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - "Content-Type": {schema1.MediaTypeSignedManifest}, - }), - } - - } - *m = append(*m, testutil.RequestResponseMapping{Request: getReqWithEtag, Response: getRespWithEtag}) -} - -func contentDigestString(mediatype string, content []byte) string { - if mediatype == schema1.MediaTypeSignedManifest { - m, _, _ := distribution.UnmarshalManifest(mediatype, content) - content = m.(*schema1.SignedManifest).Canonical - } - return digest.Canonical.FromBytes(content).String() -} - -func addTestManifest(repo reference.Named, reference string, mediatype string, content []byte, m *testutil.RequestResponseMap) { - *m = append(*m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "GET", - Route: "/v2/" + repo.Name() + "/manifests/" + reference, - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: content, - Headers: http.Header(map[string][]string{ - "Content-Length": {fmt.Sprint(len(content))}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - "Content-Type": {mediatype}, - "Docker-Content-Digest": {contentDigestString(mediatype, content)}, - }), - }, - }) - *m = append(*m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "HEAD", - Route: "/v2/" + repo.Name() + "/manifests/" + reference, - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Headers: http.Header(map[string][]string{ - "Content-Length": {fmt.Sprint(len(content))}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - "Content-Type": {mediatype}, - "Docker-Content-Digest": {digest.Canonical.FromBytes(content).String()}, - }), - }, - }) - -} - -func checkEqualManifest(m1, m2 *schema1.SignedManifest) error { - if m1.Name != m2.Name { - return fmt.Errorf("name does not match %q != %q", m1.Name, m2.Name) - } - if m1.Tag != m2.Tag { - return fmt.Errorf("tag does not match %q != %q", m1.Tag, m2.Tag) - } - if len(m1.FSLayers) != len(m2.FSLayers) { - return fmt.Errorf("fs blob length does not match %d != %d", len(m1.FSLayers), len(m2.FSLayers)) - } - for i := range m1.FSLayers { - if m1.FSLayers[i].BlobSum != m2.FSLayers[i].BlobSum { - return fmt.Errorf("blobsum does not match %q != %q", m1.FSLayers[i].BlobSum, m2.FSLayers[i].BlobSum) - } - } - if len(m1.History) != len(m2.History) { - return fmt.Errorf("history length does not match %d != %d", len(m1.History), len(m2.History)) - } - for i := range m1.History { - if m1.History[i].V1Compatibility != m2.History[i].V1Compatibility { - return fmt.Errorf("blobsum does not match %q != %q", m1.History[i].V1Compatibility, m2.History[i].V1Compatibility) - } - } - return nil -} - -func TestV1ManifestFetch(t *testing.T) { - ctx := context.Background() - repo, _ := reference.ParseNamed("test.example.com/repo") - m1, dgst, _ := newRandomSchemaV1Manifest(repo, "latest", 6) - var m testutil.RequestResponseMap - _, pl, err := m1.Payload() - if err != nil { - t.Fatal(err) - } - addTestManifest(repo, dgst.String(), schema1.MediaTypeSignedManifest, pl, &m) - addTestManifest(repo, "latest", schema1.MediaTypeSignedManifest, pl, &m) - addTestManifest(repo, "badcontenttype", "text/html", pl, &m) - - e, c := testServer(m) - defer c() - - r, err := NewRepository(context.Background(), repo, e, nil) - if err != nil { - t.Fatal(err) - } - ms, err := r.Manifests(ctx) - if err != nil { - t.Fatal(err) - } - - ok, err := ms.Exists(ctx, dgst) - if err != nil { - t.Fatal(err) - } - if !ok { - t.Fatal("Manifest does not exist") - } - - manifest, err := ms.Get(ctx, dgst) - if err != nil { - t.Fatal(err) - } - v1manifest, ok := manifest.(*schema1.SignedManifest) - if !ok { - t.Fatalf("Unexpected manifest type from Get: %T", manifest) - } - - if err := checkEqualManifest(v1manifest, m1); err != nil { - t.Fatal(err) - } - - var contentDigest digest.Digest - manifest, err = ms.Get(ctx, dgst, distribution.WithTag("latest"), ReturnContentDigest(&contentDigest)) - if err != nil { - t.Fatal(err) - } - v1manifest, ok = manifest.(*schema1.SignedManifest) - if !ok { - t.Fatalf("Unexpected manifest type from Get: %T", manifest) - } - - if err = checkEqualManifest(v1manifest, m1); err != nil { - t.Fatal(err) - } - - if contentDigest != dgst { - t.Fatalf("Unexpected returned content digest %v, expected %v", contentDigest, dgst) - } - - manifest, err = ms.Get(ctx, dgst, distribution.WithTag("badcontenttype")) - if err != nil { - t.Fatal(err) - } - v1manifest, ok = manifest.(*schema1.SignedManifest) - if !ok { - t.Fatalf("Unexpected manifest type from Get: %T", manifest) - } - - if err = checkEqualManifest(v1manifest, m1); err != nil { - t.Fatal(err) - } -} - -func TestManifestFetchWithEtag(t *testing.T) { - repo, _ := reference.ParseNamed("test.example.com/repo/by/tag") - _, d1, p1 := newRandomSchemaV1Manifest(repo, "latest", 6) - var m testutil.RequestResponseMap - addTestManifestWithEtag(repo, "latest", p1, &m, d1.String()) - - e, c := testServer(m) - defer c() - - ctx := context.Background() - r, err := NewRepository(ctx, repo, e, nil) - if err != nil { - t.Fatal(err) - } - - ms, err := r.Manifests(ctx) - if err != nil { - t.Fatal(err) - } - - clientManifestService, ok := ms.(*manifests) - if !ok { - panic("wrong type for client manifest service") - } - _, err = clientManifestService.Get(ctx, d1, distribution.WithTag("latest"), AddEtagToTag("latest", d1.String())) - if err != distribution.ErrManifestNotModified { - t.Fatal(err) - } -} - -func TestManifestDelete(t *testing.T) { - repo, _ := reference.ParseNamed("test.example.com/repo/delete") - _, dgst1, _ := newRandomSchemaV1Manifest(repo, "latest", 6) - _, dgst2, _ := newRandomSchemaV1Manifest(repo, "latest", 6) - var m testutil.RequestResponseMap - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "DELETE", - Route: "/v2/" + repo.Name() + "/manifests/" + dgst1.String(), - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - Headers: http.Header(map[string][]string{ - "Content-Length": {"0"}, - }), - }, - }) - - e, c := testServer(m) - defer c() - - r, err := NewRepository(context.Background(), repo, e, nil) - if err != nil { - t.Fatal(err) - } - ctx := context.Background() - ms, err := r.Manifests(ctx) - if err != nil { - t.Fatal(err) - } - - if err := ms.Delete(ctx, dgst1); err != nil { - t.Fatal(err) - } - if err := ms.Delete(ctx, dgst2); err == nil { - t.Fatal("Expected error deleting unknown manifest") - } - // TODO(dmcgowan): Check for specific unknown error -} - -func TestManifestPut(t *testing.T) { - repo, _ := reference.ParseNamed("test.example.com/repo/delete") - m1, dgst, _ := newRandomSchemaV1Manifest(repo, "other", 6) - - _, payload, err := m1.Payload() - if err != nil { - t.Fatal(err) - } - - var m testutil.RequestResponseMap - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "PUT", - Route: "/v2/" + repo.Name() + "/manifests/other", - Body: payload, - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - Headers: http.Header(map[string][]string{ - "Content-Length": {"0"}, - "Docker-Content-Digest": {dgst.String()}, - }), - }, - }) - - putDgst := digest.FromBytes(m1.Canonical) - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "PUT", - Route: "/v2/" + repo.Name() + "/manifests/" + putDgst.String(), - Body: payload, - }, - Response: testutil.Response{ - StatusCode: http.StatusAccepted, - Headers: http.Header(map[string][]string{ - "Content-Length": {"0"}, - "Docker-Content-Digest": {putDgst.String()}, - }), - }, - }) - - e, c := testServer(m) - defer c() - - r, err := NewRepository(context.Background(), repo, e, nil) - if err != nil { - t.Fatal(err) - } - ctx := context.Background() - ms, err := r.Manifests(ctx) - if err != nil { - t.Fatal(err) - } - - if _, err := ms.Put(ctx, m1, distribution.WithTag(m1.Tag)); err != nil { - t.Fatal(err) - } - - if _, err := ms.Put(ctx, m1); err != nil { - t.Fatal(err) - } - - // TODO(dmcgowan): Check for invalid input error -} - -func TestManifestTags(t *testing.T) { - repo, _ := reference.ParseNamed("test.example.com/repo/tags/list") - tagsList := []byte(strings.TrimSpace(` -{ - "name": "test.example.com/repo/tags/list", - "tags": [ - "tag1", - "tag2", - "funtag" - ] -} - `)) - var m testutil.RequestResponseMap - for i := 0; i < 3; i++ { - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "GET", - Route: "/v2/" + repo.Name() + "/tags/list", - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: tagsList, - Headers: http.Header(map[string][]string{ - "Content-Length": {fmt.Sprint(len(tagsList))}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - }), - }, - }) - } - e, c := testServer(m) - defer c() - - r, err := NewRepository(context.Background(), repo, e, nil) - if err != nil { - t.Fatal(err) - } - - ctx := context.Background() - tagService := r.Tags(ctx) - - tags, err := tagService.All(ctx) - if err != nil { - t.Fatal(err) - } - if len(tags) != 3 { - t.Fatalf("Wrong number of tags returned: %d, expected 3", len(tags)) - } - - expected := map[string]struct{}{ - "tag1": {}, - "tag2": {}, - "funtag": {}, - } - for _, t := range tags { - delete(expected, t) - } - if len(expected) != 0 { - t.Fatalf("unexpected tags returned: %v", expected) - } - // TODO(dmcgowan): Check for error cases -} - -func TestObtainsErrorForMissingTag(t *testing.T) { - repo, _ := reference.ParseNamed("test.example.com/repo") - - var m testutil.RequestResponseMap - var errors errcode.Errors - errors = append(errors, v2.ErrorCodeManifestUnknown.WithDetail("unknown manifest")) - errBytes, err := json.Marshal(errors) - if err != nil { - t.Fatal(err) - } - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "GET", - Route: "/v2/" + repo.Name() + "/manifests/1.0.0", - }, - Response: testutil.Response{ - StatusCode: http.StatusNotFound, - Body: errBytes, - Headers: http.Header(map[string][]string{ - "Content-Type": {"application/json; charset=utf-8"}, - }), - }, - }) - e, c := testServer(m) - defer c() - - ctx := context.Background() - r, err := NewRepository(ctx, repo, e, nil) - if err != nil { - t.Fatal(err) - } - - tagService := r.Tags(ctx) - - _, err = tagService.Get(ctx, "1.0.0") - if err == nil { - t.Fatalf("Expected an error") - } - if !strings.Contains(err.Error(), "manifest unknown") { - t.Fatalf("Expected unknown manifest error message") - } -} - -func TestManifestTagsPaginated(t *testing.T) { - s := httptest.NewServer(http.NotFoundHandler()) - defer s.Close() - - repo, _ := reference.ParseNamed("test.example.com/repo/tags/list") - tagsList := []string{"tag1", "tag2", "funtag"} - var m testutil.RequestResponseMap - for i := 0; i < 3; i++ { - body, err := json.Marshal(map[string]interface{}{ - "name": "test.example.com/repo/tags/list", - "tags": []string{tagsList[i]}, - }) - if err != nil { - t.Fatal(err) - } - queryParams := make(map[string][]string) - if i > 0 { - queryParams["n"] = []string{"1"} - queryParams["last"] = []string{tagsList[i-1]} - } - headers := http.Header(map[string][]string{ - "Content-Length": {fmt.Sprint(len(body))}, - "Last-Modified": {time.Now().Add(-1 * time.Second).Format(time.ANSIC)}, - }) - if i < 2 { - headers.Set("Link", "<"+s.URL+"/v2/"+repo.Name()+"/tags/list?n=1&last="+tagsList[i]+`>; rel="next"`) - } - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "GET", - Route: "/v2/" + repo.Name() + "/tags/list", - QueryParams: queryParams, - }, - Response: testutil.Response{ - StatusCode: http.StatusOK, - Body: body, - Headers: headers, - }, - }) - } - - s.Config.Handler = testutil.NewHandler(m) - - r, err := NewRepository(context.Background(), repo, s.URL, nil) - if err != nil { - t.Fatal(err) - } - - ctx := context.Background() - tagService := r.Tags(ctx) - - tags, err := tagService.All(ctx) - if err != nil { - t.Fatal(tags, err) - } - if len(tags) != 3 { - t.Fatalf("Wrong number of tags returned: %d, expected 3", len(tags)) - } - - expected := map[string]struct{}{ - "tag1": {}, - "tag2": {}, - "funtag": {}, - } - for _, t := range tags { - delete(expected, t) - } - if len(expected) != 0 { - t.Fatalf("unexpected tags returned: %v", expected) - } -} - -func TestManifestUnauthorized(t *testing.T) { - repo, _ := reference.ParseNamed("test.example.com/repo") - _, dgst, _ := newRandomSchemaV1Manifest(repo, "latest", 6) - var m testutil.RequestResponseMap - - m = append(m, testutil.RequestResponseMapping{ - Request: testutil.Request{ - Method: "GET", - Route: "/v2/" + repo.Name() + "/manifests/" + dgst.String(), - }, - Response: testutil.Response{ - StatusCode: http.StatusUnauthorized, - Body: []byte("garbage"), - }, - }) - - e, c := testServer(m) - defer c() - - r, err := NewRepository(context.Background(), repo, e, nil) - if err != nil { - t.Fatal(err) - } - ctx := context.Background() - ms, err := r.Manifests(ctx) - if err != nil { - t.Fatal(err) - } - - _, err = ms.Get(ctx, dgst) - if err == nil { - t.Fatal("Expected error fetching manifest") - } - v2Err, ok := err.(errcode.Error) - if !ok { - t.Fatalf("Unexpected error type: %#v", err) - } - if v2Err.Code != errcode.ErrorCodeUnauthorized { - t.Fatalf("Unexpected error code: %s", v2Err.Code.String()) - } - if expected := errcode.ErrorCodeUnauthorized.Message(); v2Err.Message != expected { - t.Fatalf("Unexpected message value: %q, expected %q", v2Err.Message, expected) - } -} - -func TestCatalog(t *testing.T) { - var m testutil.RequestResponseMap - addTestCatalog( - "/v2/_catalog?n=5", - []byte("{\"repositories\":[\"foo\", \"bar\", \"baz\"]}"), "", &m) - - e, c := testServer(m) - defer c() - - entries := make([]string, 5) - - r, err := NewRegistry(context.Background(), e, nil) - if err != nil { - t.Fatal(err) - } - - ctx := context.Background() - numFilled, err := r.Repositories(ctx, entries, "") - if err != io.EOF { - t.Fatal(err) - } - - if numFilled != 3 { - t.Fatalf("Got wrong number of repos") - } -} - -func TestCatalogInParts(t *testing.T) { - var m testutil.RequestResponseMap - addTestCatalog( - "/v2/_catalog?n=2", - []byte("{\"repositories\":[\"bar\", \"baz\"]}"), - "", &m) - addTestCatalog( - "/v2/_catalog?last=baz&n=2", - []byte("{\"repositories\":[\"foo\"]}"), - "", &m) - - e, c := testServer(m) - defer c() - - entries := make([]string, 2) - - r, err := NewRegistry(context.Background(), e, nil) - if err != nil { - t.Fatal(err) - } - - ctx := context.Background() - numFilled, err := r.Repositories(ctx, entries, "") - if err != nil { - t.Fatal(err) - } - - if numFilled != 2 { - t.Fatalf("Got wrong number of repos") - } - - numFilled, err = r.Repositories(ctx, entries, "baz") - if err != io.EOF { - t.Fatal(err) - } - - if numFilled != 1 { - t.Fatalf("Got wrong number of repos") - } -} - -func TestSanitizeLocation(t *testing.T) { - for _, testcase := range []struct { - description string - location string - source string - expected string - err error - }{ - { - description: "ensure relative location correctly resolved", - location: "/v2/foo/baasdf", - source: "http://blahalaja.com/v1", - expected: "http://blahalaja.com/v2/foo/baasdf", - }, - { - description: "ensure parameters are preserved", - location: "/v2/foo/baasdf?_state=asdfasfdasdfasdf&digest=foo", - source: "http://blahalaja.com/v1", - expected: "http://blahalaja.com/v2/foo/baasdf?_state=asdfasfdasdfasdf&digest=foo", - }, - { - description: "ensure new hostname overidden", - location: "https://mwhahaha.com/v2/foo/baasdf?_state=asdfasfdasdfasdf", - source: "http://blahalaja.com/v1", - expected: "https://mwhahaha.com/v2/foo/baasdf?_state=asdfasfdasdfasdf", - }, - } { - fatalf := func(format string, args ...interface{}) { - t.Fatalf(testcase.description+": "+format, args...) - } - - s, err := sanitizeLocation(testcase.location, testcase.source) - if err != testcase.err { - if testcase.err != nil { - fatalf("expected error: %v != %v", err, testcase) - } else { - fatalf("unexpected error sanitizing: %v", err) - } - } - - if s != testcase.expected { - fatalf("bad sanitize: %q != %q", s, testcase.expected) - } - } -} diff --git a/vendor/github.com/docker/distribution/registry/client/transport/http_reader.go b/vendor/github.com/docker/distribution/registry/client/transport/http_reader.go deleted file mode 100644 index e5ff09d75..000000000 --- a/vendor/github.com/docker/distribution/registry/client/transport/http_reader.go +++ /dev/null @@ -1,251 +0,0 @@ -package transport - -import ( - "errors" - "fmt" - "io" - "net/http" - "os" - "regexp" - "strconv" -) - -var ( - contentRangeRegexp = regexp.MustCompile(`bytes ([0-9]+)-([0-9]+)/([0-9]+|\\*)`) - - // ErrWrongCodeForByteRange is returned if the client sends a request - // with a Range header but the server returns a 2xx or 3xx code other - // than 206 Partial Content. - ErrWrongCodeForByteRange = errors.New("expected HTTP 206 from byte range request") -) - -// ReadSeekCloser combines io.ReadSeeker with io.Closer. -type ReadSeekCloser interface { - io.ReadSeeker - io.Closer -} - -// NewHTTPReadSeeker handles reading from an HTTP endpoint using a GET -// request. When seeking and starting a read from a non-zero offset -// the a "Range" header will be added which sets the offset. -// TODO(dmcgowan): Move this into a separate utility package -func NewHTTPReadSeeker(client *http.Client, url string, errorHandler func(*http.Response) error) ReadSeekCloser { - return &httpReadSeeker{ - client: client, - url: url, - errorHandler: errorHandler, - } -} - -type httpReadSeeker struct { - client *http.Client - url string - - // errorHandler creates an error from an unsuccessful HTTP response. - // This allows the error to be created with the HTTP response body - // without leaking the body through a returned error. - errorHandler func(*http.Response) error - - size int64 - - // rc is the remote read closer. - rc io.ReadCloser - // readerOffset tracks the offset as of the last read. - readerOffset int64 - // seekOffset allows Seek to override the offset. Seek changes - // seekOffset instead of changing readOffset directly so that - // connection resets can be delayed and possibly avoided if the - // seek is undone (i.e. seeking to the end and then back to the - // beginning). - seekOffset int64 - err error -} - -func (hrs *httpReadSeeker) Read(p []byte) (n int, err error) { - if hrs.err != nil { - return 0, hrs.err - } - - // If we sought to a different position, we need to reset the - // connection. This logic is here instead of Seek so that if - // a seek is undone before the next read, the connection doesn't - // need to be closed and reopened. A common example of this is - // seeking to the end to determine the length, and then seeking - // back to the original position. - if hrs.readerOffset != hrs.seekOffset { - hrs.reset() - } - - hrs.readerOffset = hrs.seekOffset - - rd, err := hrs.reader() - if err != nil { - return 0, err - } - - n, err = rd.Read(p) - hrs.seekOffset += int64(n) - hrs.readerOffset += int64(n) - - return n, err -} - -func (hrs *httpReadSeeker) Seek(offset int64, whence int) (int64, error) { - if hrs.err != nil { - return 0, hrs.err - } - - lastReaderOffset := hrs.readerOffset - - if whence == os.SEEK_SET && hrs.rc == nil { - // If no request has been made yet, and we are seeking to an - // absolute position, set the read offset as well to avoid an - // unnecessary request. - hrs.readerOffset = offset - } - - _, err := hrs.reader() - if err != nil { - hrs.readerOffset = lastReaderOffset - return 0, err - } - - newOffset := hrs.seekOffset - - switch whence { - case os.SEEK_CUR: - newOffset += offset - case os.SEEK_END: - if hrs.size < 0 { - return 0, errors.New("content length not known") - } - newOffset = hrs.size + offset - case os.SEEK_SET: - newOffset = offset - } - - if newOffset < 0 { - err = errors.New("cannot seek to negative position") - } else { - hrs.seekOffset = newOffset - } - - return hrs.seekOffset, err -} - -func (hrs *httpReadSeeker) Close() error { - if hrs.err != nil { - return hrs.err - } - - // close and release reader chain - if hrs.rc != nil { - hrs.rc.Close() - } - - hrs.rc = nil - - hrs.err = errors.New("httpLayer: closed") - - return nil -} - -func (hrs *httpReadSeeker) reset() { - if hrs.err != nil { - return - } - if hrs.rc != nil { - hrs.rc.Close() - hrs.rc = nil - } -} - -func (hrs *httpReadSeeker) reader() (io.Reader, error) { - if hrs.err != nil { - return nil, hrs.err - } - - if hrs.rc != nil { - return hrs.rc, nil - } - - req, err := http.NewRequest("GET", hrs.url, nil) - if err != nil { - return nil, err - } - - if hrs.readerOffset > 0 { - // If we are at different offset, issue a range request from there. - req.Header.Add("Range", fmt.Sprintf("bytes=%d-", hrs.readerOffset)) - // TODO: get context in here - // context.GetLogger(hrs.context).Infof("Range: %s", req.Header.Get("Range")) - } - - req.Header.Add("Accept-Encoding", "identity") - resp, err := hrs.client.Do(req) - if err != nil { - return nil, err - } - - // Normally would use client.SuccessStatus, but that would be a cyclic - // import - if resp.StatusCode >= 200 && resp.StatusCode <= 399 { - if hrs.readerOffset > 0 { - if resp.StatusCode != http.StatusPartialContent { - return nil, ErrWrongCodeForByteRange - } - - contentRange := resp.Header.Get("Content-Range") - if contentRange == "" { - return nil, errors.New("no Content-Range header found in HTTP 206 response") - } - - submatches := contentRangeRegexp.FindStringSubmatch(contentRange) - if len(submatches) < 4 { - return nil, fmt.Errorf("could not parse Content-Range header: %s", contentRange) - } - - startByte, err := strconv.ParseUint(submatches[1], 10, 64) - if err != nil { - return nil, fmt.Errorf("could not parse start of range in Content-Range header: %s", contentRange) - } - - if startByte != uint64(hrs.readerOffset) { - return nil, fmt.Errorf("received Content-Range starting at offset %d instead of requested %d", startByte, hrs.readerOffset) - } - - endByte, err := strconv.ParseUint(submatches[2], 10, 64) - if err != nil { - return nil, fmt.Errorf("could not parse end of range in Content-Range header: %s", contentRange) - } - - if submatches[3] == "*" { - hrs.size = -1 - } else { - size, err := strconv.ParseUint(submatches[3], 10, 64) - if err != nil { - return nil, fmt.Errorf("could not parse total size in Content-Range header: %s", contentRange) - } - - if endByte+1 != size { - return nil, fmt.Errorf("range in Content-Range stops before the end of the content: %s", contentRange) - } - - hrs.size = int64(size) - } - } else if resp.StatusCode == http.StatusOK { - hrs.size = resp.ContentLength - } else { - hrs.size = -1 - } - hrs.rc = resp.Body - } else { - defer resp.Body.Close() - if hrs.errorHandler != nil { - return nil, hrs.errorHandler(resp) - } - return nil, fmt.Errorf("unexpected status resolving reader: %v", resp.Status) - } - - return hrs.rc, nil -} diff --git a/vendor/github.com/docker/distribution/registry/client/transport/transport.go b/vendor/github.com/docker/distribution/registry/client/transport/transport.go deleted file mode 100644 index 30e45fab0..000000000 --- a/vendor/github.com/docker/distribution/registry/client/transport/transport.go +++ /dev/null @@ -1,147 +0,0 @@ -package transport - -import ( - "io" - "net/http" - "sync" -) - -// RequestModifier represents an object which will do an inplace -// modification of an HTTP request. -type RequestModifier interface { - ModifyRequest(*http.Request) error -} - -type headerModifier http.Header - -// NewHeaderRequestModifier returns a new RequestModifier which will -// add the given headers to a request. -func NewHeaderRequestModifier(header http.Header) RequestModifier { - return headerModifier(header) -} - -func (h headerModifier) ModifyRequest(req *http.Request) error { - for k, s := range http.Header(h) { - req.Header[k] = append(req.Header[k], s...) - } - - return nil -} - -// NewTransport creates a new transport which will apply modifiers to -// the request on a RoundTrip call. -func NewTransport(base http.RoundTripper, modifiers ...RequestModifier) http.RoundTripper { - return &transport{ - Modifiers: modifiers, - Base: base, - } -} - -// transport is an http.RoundTripper that makes HTTP requests after -// copying and modifying the request -type transport struct { - Modifiers []RequestModifier - Base http.RoundTripper - - mu sync.Mutex // guards modReq - modReq map[*http.Request]*http.Request // original -> modified -} - -// RoundTrip authorizes and authenticates the request with an -// access token. If no token exists or token is expired, -// tries to refresh/fetch a new token. -func (t *transport) RoundTrip(req *http.Request) (*http.Response, error) { - req2 := cloneRequest(req) - for _, modifier := range t.Modifiers { - if err := modifier.ModifyRequest(req2); err != nil { - return nil, err - } - } - - t.setModReq(req, req2) - res, err := t.base().RoundTrip(req2) - if err != nil { - t.setModReq(req, nil) - return nil, err - } - res.Body = &onEOFReader{ - rc: res.Body, - fn: func() { t.setModReq(req, nil) }, - } - return res, nil -} - -// CancelRequest cancels an in-flight request by closing its connection. -func (t *transport) CancelRequest(req *http.Request) { - type canceler interface { - CancelRequest(*http.Request) - } - if cr, ok := t.base().(canceler); ok { - t.mu.Lock() - modReq := t.modReq[req] - delete(t.modReq, req) - t.mu.Unlock() - cr.CancelRequest(modReq) - } -} - -func (t *transport) base() http.RoundTripper { - if t.Base != nil { - return t.Base - } - return http.DefaultTransport -} - -func (t *transport) setModReq(orig, mod *http.Request) { - t.mu.Lock() - defer t.mu.Unlock() - if t.modReq == nil { - t.modReq = make(map[*http.Request]*http.Request) - } - if mod == nil { - delete(t.modReq, orig) - } else { - t.modReq[orig] = mod - } -} - -// cloneRequest returns a clone of the provided *http.Request. -// The clone is a shallow copy of the struct and its Header map. -func cloneRequest(r *http.Request) *http.Request { - // shallow copy of the struct - r2 := new(http.Request) - *r2 = *r - // deep copy of the Header - r2.Header = make(http.Header, len(r.Header)) - for k, s := range r.Header { - r2.Header[k] = append([]string(nil), s...) - } - - return r2 -} - -type onEOFReader struct { - rc io.ReadCloser - fn func() -} - -func (r *onEOFReader) Read(p []byte) (n int, err error) { - n, err = r.rc.Read(p) - if err == io.EOF { - r.runFunc() - } - return -} - -func (r *onEOFReader) Close() error { - err := r.rc.Close() - r.runFunc() - return err -} - -func (r *onEOFReader) runFunc() { - if fn := r.fn; fn != nil { - fn() - r.fn = nil - } -} diff --git a/vendor/github.com/docker/distribution/registry/doc.go b/vendor/github.com/docker/distribution/registry/doc.go deleted file mode 100644 index a1ba7f3ab..000000000 --- a/vendor/github.com/docker/distribution/registry/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package registry provides the main entrypoints for running a registry. -package registry diff --git a/vendor/github.com/docker/distribution/registry/handlers/api_test.go b/vendor/github.com/docker/distribution/registry/handlers/api_test.go deleted file mode 100644 index 9d64fbbf4..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/api_test.go +++ /dev/null @@ -1,2513 +0,0 @@ -package handlers - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/http/httputil" - "net/url" - "os" - "path" - "reflect" - "regexp" - "strconv" - "strings" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/configuration" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/manifest/manifestlist" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/manifest/schema2" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" - _ "github.com/docker/distribution/registry/storage/driver/testdriver" - "github.com/docker/distribution/testutil" - "github.com/docker/libtrust" - "github.com/gorilla/handlers" -) - -var headerConfig = http.Header{ - "X-Content-Type-Options": []string{"nosniff"}, -} - -// TestCheckAPI hits the base endpoint (/v2/) ensures we return the specified -// 200 OK response. -func TestCheckAPI(t *testing.T) { - env := newTestEnv(t, false) - defer env.Shutdown() - baseURL, err := env.builder.BuildBaseURL() - if err != nil { - t.Fatalf("unexpected error building base url: %v", err) - } - - resp, err := http.Get(baseURL) - if err != nil { - t.Fatalf("unexpected error issuing request: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "issuing api base check", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Content-Type": []string{"application/json; charset=utf-8"}, - "Content-Length": []string{"2"}, - }) - - p, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("unexpected error reading response body: %v", err) - } - - if string(p) != "{}" { - t.Fatalf("unexpected response body: %v", string(p)) - } -} - -// TestCatalogAPI tests the /v2/_catalog endpoint -func TestCatalogAPI(t *testing.T) { - chunkLen := 2 - env := newTestEnv(t, false) - defer env.Shutdown() - - values := url.Values{ - "last": []string{""}, - "n": []string{strconv.Itoa(chunkLen)}} - - catalogURL, err := env.builder.BuildCatalogURL(values) - if err != nil { - t.Fatalf("unexpected error building catalog url: %v", err) - } - - // ----------------------------------- - // try to get an empty catalog - resp, err := http.Get(catalogURL) - if err != nil { - t.Fatalf("unexpected error issuing request: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "issuing catalog api check", resp, http.StatusOK) - - var ctlg struct { - Repositories []string `json:"repositories"` - } - - dec := json.NewDecoder(resp.Body) - if err := dec.Decode(&ctlg); err != nil { - t.Fatalf("error decoding fetched manifest: %v", err) - } - - // we haven't pushed anything to the registry yet - if len(ctlg.Repositories) != 0 { - t.Fatalf("repositories has unexpected values") - } - - if resp.Header.Get("Link") != "" { - t.Fatalf("repositories has more data when none expected") - } - - // ----------------------------------- - // push something to the registry and try again - images := []string{"foo/aaaa", "foo/bbbb", "foo/cccc"} - - for _, image := range images { - createRepository(env, t, image, "sometag") - } - - resp, err = http.Get(catalogURL) - if err != nil { - t.Fatalf("unexpected error issuing request: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "issuing catalog api check", resp, http.StatusOK) - - dec = json.NewDecoder(resp.Body) - if err = dec.Decode(&ctlg); err != nil { - t.Fatalf("error decoding fetched manifest: %v", err) - } - - if len(ctlg.Repositories) != chunkLen { - t.Fatalf("repositories has unexpected values") - } - - for _, image := range images[:chunkLen] { - if !contains(ctlg.Repositories, image) { - t.Fatalf("didn't find our repository '%s' in the catalog", image) - } - } - - link := resp.Header.Get("Link") - if link == "" { - t.Fatalf("repositories has less data than expected") - } - - newValues := checkLink(t, link, chunkLen, ctlg.Repositories[len(ctlg.Repositories)-1]) - - // ----------------------------------- - // get the last chunk of data - - catalogURL, err = env.builder.BuildCatalogURL(newValues) - if err != nil { - t.Fatalf("unexpected error building catalog url: %v", err) - } - - resp, err = http.Get(catalogURL) - if err != nil { - t.Fatalf("unexpected error issuing request: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "issuing catalog api check", resp, http.StatusOK) - - dec = json.NewDecoder(resp.Body) - if err = dec.Decode(&ctlg); err != nil { - t.Fatalf("error decoding fetched manifest: %v", err) - } - - if len(ctlg.Repositories) != 1 { - t.Fatalf("repositories has unexpected values") - } - - lastImage := images[len(images)-1] - if !contains(ctlg.Repositories, lastImage) { - t.Fatalf("didn't find our repository '%s' in the catalog", lastImage) - } - - link = resp.Header.Get("Link") - if link != "" { - t.Fatalf("catalog has unexpected data") - } -} - -func checkLink(t *testing.T, urlStr string, numEntries int, last string) url.Values { - re := regexp.MustCompile("<(/v2/_catalog.*)>; rel=\"next\"") - matches := re.FindStringSubmatch(urlStr) - - if len(matches) != 2 { - t.Fatalf("Catalog link address response was incorrect") - } - linkURL, _ := url.Parse(matches[1]) - urlValues := linkURL.Query() - - if urlValues.Get("n") != strconv.Itoa(numEntries) { - t.Fatalf("Catalog link entry size is incorrect") - } - - if urlValues.Get("last") != last { - t.Fatal("Catalog link last entry is incorrect") - } - - return urlValues -} - -func contains(elems []string, e string) bool { - for _, elem := range elems { - if elem == e { - return true - } - } - return false -} - -func TestURLPrefix(t *testing.T) { - config := configuration.Configuration{ - Storage: configuration.Storage{ - "testdriver": configuration.Parameters{}, - "maintenance": configuration.Parameters{"uploadpurging": map[interface{}]interface{}{ - "enabled": false, - }}, - }, - } - config.HTTP.Prefix = "/test/" - config.HTTP.Headers = headerConfig - - env := newTestEnvWithConfig(t, &config) - defer env.Shutdown() - - baseURL, err := env.builder.BuildBaseURL() - if err != nil { - t.Fatalf("unexpected error building base url: %v", err) - } - - parsed, _ := url.Parse(baseURL) - if !strings.HasPrefix(parsed.Path, config.HTTP.Prefix) { - t.Fatalf("Prefix %v not included in test url %v", config.HTTP.Prefix, baseURL) - } - - resp, err := http.Get(baseURL) - if err != nil { - t.Fatalf("unexpected error issuing request: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "issuing api base check", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Content-Type": []string{"application/json; charset=utf-8"}, - "Content-Length": []string{"2"}, - }) -} - -type blobArgs struct { - imageName reference.Named - layerFile io.ReadSeeker - layerDigest digest.Digest -} - -func makeBlobArgs(t *testing.T) blobArgs { - layerFile, layerDigest, err := testutil.CreateRandomTarFile() - if err != nil { - t.Fatalf("error creating random layer file: %v", err) - } - - args := blobArgs{ - layerFile: layerFile, - layerDigest: layerDigest, - } - args.imageName, _ = reference.ParseNamed("foo/bar") - return args -} - -// TestBlobAPI conducts a full test of the of the blob api. -func TestBlobAPI(t *testing.T) { - deleteEnabled := false - env1 := newTestEnv(t, deleteEnabled) - defer env1.Shutdown() - args := makeBlobArgs(t) - testBlobAPI(t, env1, args) - - deleteEnabled = true - env2 := newTestEnv(t, deleteEnabled) - defer env2.Shutdown() - args = makeBlobArgs(t) - testBlobAPI(t, env2, args) - -} - -func TestBlobDelete(t *testing.T) { - deleteEnabled := true - env := newTestEnv(t, deleteEnabled) - defer env.Shutdown() - - args := makeBlobArgs(t) - env = testBlobAPI(t, env, args) - testBlobDelete(t, env, args) -} - -func TestRelativeURL(t *testing.T) { - config := configuration.Configuration{ - Storage: configuration.Storage{ - "testdriver": configuration.Parameters{}, - "maintenance": configuration.Parameters{"uploadpurging": map[interface{}]interface{}{ - "enabled": false, - }}, - }, - } - config.HTTP.Headers = headerConfig - config.HTTP.RelativeURLs = false - env := newTestEnvWithConfig(t, &config) - defer env.Shutdown() - ref, _ := reference.WithName("foo/bar") - uploadURLBaseAbs, _ := startPushLayer(t, env, ref) - - u, err := url.Parse(uploadURLBaseAbs) - if err != nil { - t.Fatal(err) - } - if !u.IsAbs() { - t.Fatal("Relative URL returned from blob upload chunk with non-relative configuration") - } - - args := makeBlobArgs(t) - resp, err := doPushLayer(t, env.builder, ref, args.layerDigest, uploadURLBaseAbs, args.layerFile) - if err != nil { - t.Fatalf("unexpected error doing layer push relative url: %v", err) - } - checkResponse(t, "relativeurl blob upload", resp, http.StatusCreated) - u, err = url.Parse(resp.Header.Get("Location")) - if err != nil { - t.Fatal(err) - } - if !u.IsAbs() { - t.Fatal("Relative URL returned from blob upload with non-relative configuration") - } - - config.HTTP.RelativeURLs = true - args = makeBlobArgs(t) - uploadURLBaseRelative, _ := startPushLayer(t, env, ref) - u, err = url.Parse(uploadURLBaseRelative) - if err != nil { - t.Fatal(err) - } - if u.IsAbs() { - t.Fatal("Absolute URL returned from blob upload chunk with relative configuration") - } - - // Start a new upload in absolute mode to get a valid base URL - config.HTTP.RelativeURLs = false - uploadURLBaseAbs, _ = startPushLayer(t, env, ref) - u, err = url.Parse(uploadURLBaseAbs) - if err != nil { - t.Fatal(err) - } - if !u.IsAbs() { - t.Fatal("Relative URL returned from blob upload chunk with non-relative configuration") - } - - // Complete upload with relative URLs enabled to ensure the final location is relative - config.HTTP.RelativeURLs = true - resp, err = doPushLayer(t, env.builder, ref, args.layerDigest, uploadURLBaseAbs, args.layerFile) - if err != nil { - t.Fatalf("unexpected error doing layer push relative url: %v", err) - } - - checkResponse(t, "relativeurl blob upload", resp, http.StatusCreated) - u, err = url.Parse(resp.Header.Get("Location")) - if err != nil { - t.Fatal(err) - } - if u.IsAbs() { - t.Fatal("Relative URL returned from blob upload with non-relative configuration") - } -} - -func TestBlobDeleteDisabled(t *testing.T) { - deleteEnabled := false - env := newTestEnv(t, deleteEnabled) - defer env.Shutdown() - args := makeBlobArgs(t) - - imageName := args.imageName - layerDigest := args.layerDigest - ref, _ := reference.WithDigest(imageName, layerDigest) - layerURL, err := env.builder.BuildBlobURL(ref) - if err != nil { - t.Fatalf("error building url: %v", err) - } - - resp, err := httpDelete(layerURL) - if err != nil { - t.Fatalf("unexpected error deleting when disabled: %v", err) - } - - checkResponse(t, "status of disabled delete", resp, http.StatusMethodNotAllowed) -} - -func testBlobAPI(t *testing.T, env *testEnv, args blobArgs) *testEnv { - // TODO(stevvooe): This test code is complete junk but it should cover the - // complete flow. This must be broken down and checked against the - // specification *before* we submit the final to docker core. - imageName := args.imageName - layerFile := args.layerFile - layerDigest := args.layerDigest - - // ----------------------------------- - // Test fetch for non-existent content - ref, _ := reference.WithDigest(imageName, layerDigest) - layerURL, err := env.builder.BuildBlobURL(ref) - if err != nil { - t.Fatalf("error building url: %v", err) - } - - resp, err := http.Get(layerURL) - if err != nil { - t.Fatalf("unexpected error fetching non-existent layer: %v", err) - } - - checkResponse(t, "fetching non-existent content", resp, http.StatusNotFound) - - // ------------------------------------------ - // Test head request for non-existent content - resp, err = http.Head(layerURL) - if err != nil { - t.Fatalf("unexpected error checking head on non-existent layer: %v", err) - } - - checkResponse(t, "checking head on non-existent layer", resp, http.StatusNotFound) - - // ------------------------------------------ - // Start an upload, check the status then cancel - uploadURLBase, uploadUUID := startPushLayer(t, env, imageName) - - // A status check should work - resp, err = http.Get(uploadURLBase) - if err != nil { - t.Fatalf("unexpected error getting upload status: %v", err) - } - checkResponse(t, "status of deleted upload", resp, http.StatusNoContent) - checkHeaders(t, resp, http.Header{ - "Location": []string{"*"}, - "Range": []string{"0-0"}, - "Docker-Upload-UUID": []string{uploadUUID}, - }) - - req, err := http.NewRequest("DELETE", uploadURLBase, nil) - if err != nil { - t.Fatalf("unexpected error creating delete request: %v", err) - } - - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("unexpected error sending delete request: %v", err) - } - - checkResponse(t, "deleting upload", resp, http.StatusNoContent) - - // A status check should result in 404 - resp, err = http.Get(uploadURLBase) - if err != nil { - t.Fatalf("unexpected error getting upload status: %v", err) - } - checkResponse(t, "status of deleted upload", resp, http.StatusNotFound) - - // ----------------------------------------- - // Do layer push with an empty body and different digest - uploadURLBase, uploadUUID = startPushLayer(t, env, imageName) - resp, err = doPushLayer(t, env.builder, imageName, layerDigest, uploadURLBase, bytes.NewReader([]byte{})) - if err != nil { - t.Fatalf("unexpected error doing bad layer push: %v", err) - } - - checkResponse(t, "bad layer push", resp, http.StatusBadRequest) - checkBodyHasErrorCodes(t, "bad layer push", resp, v2.ErrorCodeDigestInvalid) - - // ----------------------------------------- - // Do layer push with an empty body and correct digest - zeroDigest, err := digest.FromReader(bytes.NewReader([]byte{})) - if err != nil { - t.Fatalf("unexpected error digesting empty buffer: %v", err) - } - - uploadURLBase, uploadUUID = startPushLayer(t, env, imageName) - pushLayer(t, env.builder, imageName, zeroDigest, uploadURLBase, bytes.NewReader([]byte{})) - - // ----------------------------------------- - // Do layer push with an empty body and correct digest - - // This is a valid but empty tarfile! - emptyTar := bytes.Repeat([]byte("\x00"), 1024) - emptyDigest, err := digest.FromReader(bytes.NewReader(emptyTar)) - if err != nil { - t.Fatalf("unexpected error digesting empty tar: %v", err) - } - - uploadURLBase, uploadUUID = startPushLayer(t, env, imageName) - pushLayer(t, env.builder, imageName, emptyDigest, uploadURLBase, bytes.NewReader(emptyTar)) - - // ------------------------------------------ - // Now, actually do successful upload. - layerLength, _ := layerFile.Seek(0, os.SEEK_END) - layerFile.Seek(0, os.SEEK_SET) - - uploadURLBase, uploadUUID = startPushLayer(t, env, imageName) - pushLayer(t, env.builder, imageName, layerDigest, uploadURLBase, layerFile) - - // ------------------------------------------ - // Now, push just a chunk - layerFile.Seek(0, 0) - - canonicalDigester := digest.Canonical.New() - if _, err := io.Copy(canonicalDigester.Hash(), layerFile); err != nil { - t.Fatalf("error copying to digest: %v", err) - } - canonicalDigest := canonicalDigester.Digest() - - layerFile.Seek(0, 0) - uploadURLBase, uploadUUID = startPushLayer(t, env, imageName) - uploadURLBase, dgst := pushChunk(t, env.builder, imageName, uploadURLBase, layerFile, layerLength) - finishUpload(t, env.builder, imageName, uploadURLBase, dgst) - - // ------------------------ - // Use a head request to see if the layer exists. - resp, err = http.Head(layerURL) - if err != nil { - t.Fatalf("unexpected error checking head on existing layer: %v", err) - } - - checkResponse(t, "checking head on existing layer", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Content-Length": []string{fmt.Sprint(layerLength)}, - "Docker-Content-Digest": []string{canonicalDigest.String()}, - }) - - // ---------------- - // Fetch the layer! - resp, err = http.Get(layerURL) - if err != nil { - t.Fatalf("unexpected error fetching layer: %v", err) - } - - checkResponse(t, "fetching layer", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Content-Length": []string{fmt.Sprint(layerLength)}, - "Docker-Content-Digest": []string{canonicalDigest.String()}, - }) - - // Verify the body - verifier, err := digest.NewDigestVerifier(layerDigest) - if err != nil { - t.Fatalf("unexpected error getting digest verifier: %s", err) - } - io.Copy(verifier, resp.Body) - - if !verifier.Verified() { - t.Fatalf("response body did not pass verification") - } - - // ---------------- - // Fetch the layer with an invalid digest - badURL := strings.Replace(layerURL, "sha256", "sha257", 1) - resp, err = http.Get(badURL) - if err != nil { - t.Fatalf("unexpected error fetching layer: %v", err) - } - - checkResponse(t, "fetching layer bad digest", resp, http.StatusBadRequest) - - // Cache headers - resp, err = http.Get(layerURL) - if err != nil { - t.Fatalf("unexpected error fetching layer: %v", err) - } - - checkResponse(t, "fetching layer", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Content-Length": []string{fmt.Sprint(layerLength)}, - "Docker-Content-Digest": []string{canonicalDigest.String()}, - "ETag": []string{fmt.Sprintf(`"%s"`, canonicalDigest)}, - "Cache-Control": []string{"max-age=31536000"}, - }) - - // Matching etag, gives 304 - etag := resp.Header.Get("Etag") - req, err = http.NewRequest("GET", layerURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - req.Header.Set("If-None-Match", etag) - - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - - checkResponse(t, "fetching layer with etag", resp, http.StatusNotModified) - - // Non-matching etag, gives 200 - req, err = http.NewRequest("GET", layerURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - req.Header.Set("If-None-Match", "") - resp, err = http.DefaultClient.Do(req) - checkResponse(t, "fetching layer with invalid etag", resp, http.StatusOK) - - // Missing tests: - // - Upload the same tar file under and different repository and - // ensure the content remains uncorrupted. - return env -} - -func testBlobDelete(t *testing.T, env *testEnv, args blobArgs) { - // Upload a layer - imageName := args.imageName - layerFile := args.layerFile - layerDigest := args.layerDigest - - ref, _ := reference.WithDigest(imageName, layerDigest) - layerURL, err := env.builder.BuildBlobURL(ref) - if err != nil { - t.Fatalf(err.Error()) - } - // --------------- - // Delete a layer - resp, err := httpDelete(layerURL) - if err != nil { - t.Fatalf("unexpected error deleting layer: %v", err) - } - - checkResponse(t, "deleting layer", resp, http.StatusAccepted) - checkHeaders(t, resp, http.Header{ - "Content-Length": []string{"0"}, - }) - - // --------------- - // Try and get it back - // Use a head request to see if the layer exists. - resp, err = http.Head(layerURL) - if err != nil { - t.Fatalf("unexpected error checking head on existing layer: %v", err) - } - - checkResponse(t, "checking existence of deleted layer", resp, http.StatusNotFound) - - // Delete already deleted layer - resp, err = httpDelete(layerURL) - if err != nil { - t.Fatalf("unexpected error deleting layer: %v", err) - } - - checkResponse(t, "deleting layer", resp, http.StatusNotFound) - - // ---------------- - // Attempt to delete a layer with an invalid digest - badURL := strings.Replace(layerURL, "sha256", "sha257", 1) - resp, err = httpDelete(badURL) - if err != nil { - t.Fatalf("unexpected error fetching layer: %v", err) - } - - checkResponse(t, "deleting layer bad digest", resp, http.StatusBadRequest) - - // ---------------- - // Reupload previously deleted blob - layerFile.Seek(0, os.SEEK_SET) - - uploadURLBase, _ := startPushLayer(t, env, imageName) - pushLayer(t, env.builder, imageName, layerDigest, uploadURLBase, layerFile) - - layerFile.Seek(0, os.SEEK_SET) - canonicalDigester := digest.Canonical.New() - if _, err := io.Copy(canonicalDigester.Hash(), layerFile); err != nil { - t.Fatalf("error copying to digest: %v", err) - } - canonicalDigest := canonicalDigester.Digest() - - // ------------------------ - // Use a head request to see if it exists - resp, err = http.Head(layerURL) - if err != nil { - t.Fatalf("unexpected error checking head on existing layer: %v", err) - } - - layerLength, _ := layerFile.Seek(0, os.SEEK_END) - checkResponse(t, "checking head on reuploaded layer", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Content-Length": []string{fmt.Sprint(layerLength)}, - "Docker-Content-Digest": []string{canonicalDigest.String()}, - }) -} - -func TestDeleteDisabled(t *testing.T) { - env := newTestEnv(t, false) - defer env.Shutdown() - - imageName, _ := reference.ParseNamed("foo/bar") - // "build" our layer file - layerFile, layerDigest, err := testutil.CreateRandomTarFile() - if err != nil { - t.Fatalf("error creating random layer file: %v", err) - } - - ref, _ := reference.WithDigest(imageName, layerDigest) - layerURL, err := env.builder.BuildBlobURL(ref) - if err != nil { - t.Fatalf("Error building blob URL") - } - uploadURLBase, _ := startPushLayer(t, env, imageName) - pushLayer(t, env.builder, imageName, layerDigest, uploadURLBase, layerFile) - - resp, err := httpDelete(layerURL) - if err != nil { - t.Fatalf("unexpected error deleting layer: %v", err) - } - - checkResponse(t, "deleting layer with delete disabled", resp, http.StatusMethodNotAllowed) -} - -func TestDeleteReadOnly(t *testing.T) { - env := newTestEnv(t, true) - defer env.Shutdown() - - imageName, _ := reference.ParseNamed("foo/bar") - // "build" our layer file - layerFile, layerDigest, err := testutil.CreateRandomTarFile() - if err != nil { - t.Fatalf("error creating random layer file: %v", err) - } - - ref, _ := reference.WithDigest(imageName, layerDigest) - layerURL, err := env.builder.BuildBlobURL(ref) - if err != nil { - t.Fatalf("Error building blob URL") - } - uploadURLBase, _ := startPushLayer(t, env, imageName) - pushLayer(t, env.builder, imageName, layerDigest, uploadURLBase, layerFile) - - env.app.readOnly = true - - resp, err := httpDelete(layerURL) - if err != nil { - t.Fatalf("unexpected error deleting layer: %v", err) - } - - checkResponse(t, "deleting layer in read-only mode", resp, http.StatusMethodNotAllowed) -} - -func TestStartPushReadOnly(t *testing.T) { - env := newTestEnv(t, true) - defer env.Shutdown() - env.app.readOnly = true - - imageName, _ := reference.ParseNamed("foo/bar") - - layerUploadURL, err := env.builder.BuildBlobUploadURL(imageName) - if err != nil { - t.Fatalf("unexpected error building layer upload url: %v", err) - } - - resp, err := http.Post(layerUploadURL, "", nil) - if err != nil { - t.Fatalf("unexpected error starting layer push: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "starting push in read-only mode", resp, http.StatusMethodNotAllowed) -} - -func httpDelete(url string) (*http.Response, error) { - req, err := http.NewRequest("DELETE", url, nil) - if err != nil { - return nil, err - } - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - // defer resp.Body.Close() - return resp, err -} - -type manifestArgs struct { - imageName reference.Named - mediaType string - manifest distribution.Manifest - dgst digest.Digest -} - -func TestManifestAPI(t *testing.T) { - schema1Repo, _ := reference.ParseNamed("foo/schema1") - schema2Repo, _ := reference.ParseNamed("foo/schema2") - - deleteEnabled := false - env1 := newTestEnv(t, deleteEnabled) - defer env1.Shutdown() - testManifestAPISchema1(t, env1, schema1Repo) - schema2Args := testManifestAPISchema2(t, env1, schema2Repo) - testManifestAPIManifestList(t, env1, schema2Args) - - deleteEnabled = true - env2 := newTestEnv(t, deleteEnabled) - defer env2.Shutdown() - testManifestAPISchema1(t, env2, schema1Repo) - schema2Args = testManifestAPISchema2(t, env2, schema2Repo) - testManifestAPIManifestList(t, env2, schema2Args) -} - -func TestManifestDelete(t *testing.T) { - schema1Repo, _ := reference.ParseNamed("foo/schema1") - schema2Repo, _ := reference.ParseNamed("foo/schema2") - - deleteEnabled := true - env := newTestEnv(t, deleteEnabled) - defer env.Shutdown() - schema1Args := testManifestAPISchema1(t, env, schema1Repo) - testManifestDelete(t, env, schema1Args) - schema2Args := testManifestAPISchema2(t, env, schema2Repo) - testManifestDelete(t, env, schema2Args) -} - -func TestManifestDeleteDisabled(t *testing.T) { - schema1Repo, _ := reference.ParseNamed("foo/schema1") - deleteEnabled := false - env := newTestEnv(t, deleteEnabled) - defer env.Shutdown() - testManifestDeleteDisabled(t, env, schema1Repo) -} - -func testManifestDeleteDisabled(t *testing.T, env *testEnv, imageName reference.Named) { - ref, _ := reference.WithDigest(imageName, digest.DigestSha256EmptyTar) - manifestURL, err := env.builder.BuildManifestURL(ref) - if err != nil { - t.Fatalf("unexpected error getting manifest url: %v", err) - } - - resp, err := httpDelete(manifestURL) - if err != nil { - t.Fatalf("unexpected error deleting manifest %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "status of disabled delete of manifest", resp, http.StatusMethodNotAllowed) -} - -func testManifestAPISchema1(t *testing.T, env *testEnv, imageName reference.Named) manifestArgs { - tag := "thetag" - args := manifestArgs{imageName: imageName} - - tagRef, _ := reference.WithTag(imageName, tag) - manifestURL, err := env.builder.BuildManifestURL(tagRef) - if err != nil { - t.Fatalf("unexpected error getting manifest url: %v", err) - } - - // ----------------------------- - // Attempt to fetch the manifest - resp, err := http.Get(manifestURL) - if err != nil { - t.Fatalf("unexpected error getting manifest: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "getting non-existent manifest", resp, http.StatusNotFound) - checkBodyHasErrorCodes(t, "getting non-existent manifest", resp, v2.ErrorCodeManifestUnknown) - - tagsURL, err := env.builder.BuildTagsURL(imageName) - if err != nil { - t.Fatalf("unexpected error building tags url: %v", err) - } - - resp, err = http.Get(tagsURL) - if err != nil { - t.Fatalf("unexpected error getting unknown tags: %v", err) - } - defer resp.Body.Close() - - // Check that we get an unknown repository error when asking for tags - checkResponse(t, "getting unknown manifest tags", resp, http.StatusNotFound) - checkBodyHasErrorCodes(t, "getting unknown manifest tags", resp, v2.ErrorCodeNameUnknown) - - // -------------------------------- - // Attempt to push unsigned manifest with missing layers - unsignedManifest := &schema1.Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 1, - }, - Name: imageName.Name(), - Tag: tag, - FSLayers: []schema1.FSLayer{ - { - BlobSum: "asdf", - }, - { - BlobSum: "qwer", - }, - }, - History: []schema1.History{ - { - V1Compatibility: "", - }, - { - V1Compatibility: "", - }, - }, - } - - resp = putManifest(t, "putting unsigned manifest", manifestURL, "", unsignedManifest) - defer resp.Body.Close() - checkResponse(t, "putting unsigned manifest", resp, http.StatusBadRequest) - _, p, counts := checkBodyHasErrorCodes(t, "putting unsigned manifest", resp, v2.ErrorCodeManifestInvalid) - - expectedCounts := map[errcode.ErrorCode]int{ - v2.ErrorCodeManifestInvalid: 1, - } - - if !reflect.DeepEqual(counts, expectedCounts) { - t.Fatalf("unexpected number of error codes encountered: %v\n!=\n%v\n---\n%s", counts, expectedCounts, string(p)) - } - - // sign the manifest and still get some interesting errors. - sm, err := schema1.Sign(unsignedManifest, env.pk) - if err != nil { - t.Fatalf("error signing manifest: %v", err) - } - - resp = putManifest(t, "putting signed manifest with errors", manifestURL, "", sm) - defer resp.Body.Close() - checkResponse(t, "putting signed manifest with errors", resp, http.StatusBadRequest) - _, p, counts = checkBodyHasErrorCodes(t, "putting signed manifest with errors", resp, - v2.ErrorCodeManifestBlobUnknown, v2.ErrorCodeDigestInvalid) - - expectedCounts = map[errcode.ErrorCode]int{ - v2.ErrorCodeManifestBlobUnknown: 2, - v2.ErrorCodeDigestInvalid: 2, - } - - if !reflect.DeepEqual(counts, expectedCounts) { - t.Fatalf("unexpected number of error codes encountered: %v\n!=\n%v\n---\n%s", counts, expectedCounts, string(p)) - } - - // TODO(stevvooe): Add a test case where we take a mostly valid registry, - // tamper with the content and ensure that we get an unverified manifest - // error. - - // Push 2 random layers - expectedLayers := make(map[digest.Digest]io.ReadSeeker) - - for i := range unsignedManifest.FSLayers { - rs, dgstStr, err := testutil.CreateRandomTarFile() - - if err != nil { - t.Fatalf("error creating random layer %d: %v", i, err) - } - dgst := digest.Digest(dgstStr) - - expectedLayers[dgst] = rs - unsignedManifest.FSLayers[i].BlobSum = dgst - - uploadURLBase, _ := startPushLayer(t, env, imageName) - pushLayer(t, env.builder, imageName, dgst, uploadURLBase, rs) - } - - // ------------------- - // Push the signed manifest with all layers pushed. - signedManifest, err := schema1.Sign(unsignedManifest, env.pk) - if err != nil { - t.Fatalf("unexpected error signing manifest: %v", err) - } - - dgst := digest.FromBytes(signedManifest.Canonical) - args.manifest = signedManifest - args.dgst = dgst - - digestRef, _ := reference.WithDigest(imageName, dgst) - manifestDigestURL, err := env.builder.BuildManifestURL(digestRef) - checkErr(t, err, "building manifest url") - - resp = putManifest(t, "putting signed manifest no error", manifestURL, "", signedManifest) - checkResponse(t, "putting signed manifest no error", resp, http.StatusCreated) - checkHeaders(t, resp, http.Header{ - "Location": []string{manifestDigestURL}, - "Docker-Content-Digest": []string{dgst.String()}, - }) - - // -------------------- - // Push by digest -- should get same result - resp = putManifest(t, "putting signed manifest", manifestDigestURL, "", signedManifest) - checkResponse(t, "putting signed manifest", resp, http.StatusCreated) - checkHeaders(t, resp, http.Header{ - "Location": []string{manifestDigestURL}, - "Docker-Content-Digest": []string{dgst.String()}, - }) - - // ------------------ - // Fetch by tag name - resp, err = http.Get(manifestURL) - if err != nil { - t.Fatalf("unexpected error fetching manifest: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "fetching uploaded manifest", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{dgst.String()}, - "ETag": []string{fmt.Sprintf(`"%s"`, dgst)}, - }) - - var fetchedManifest schema1.SignedManifest - dec := json.NewDecoder(resp.Body) - - if err := dec.Decode(&fetchedManifest); err != nil { - t.Fatalf("error decoding fetched manifest: %v", err) - } - - if !bytes.Equal(fetchedManifest.Canonical, signedManifest.Canonical) { - t.Fatalf("manifests do not match") - } - - // --------------- - // Fetch by digest - resp, err = http.Get(manifestDigestURL) - checkErr(t, err, "fetching manifest by digest") - defer resp.Body.Close() - - checkResponse(t, "fetching uploaded manifest", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{dgst.String()}, - "ETag": []string{fmt.Sprintf(`"%s"`, dgst)}, - }) - - var fetchedManifestByDigest schema1.SignedManifest - dec = json.NewDecoder(resp.Body) - if err := dec.Decode(&fetchedManifestByDigest); err != nil { - t.Fatalf("error decoding fetched manifest: %v", err) - } - - if !bytes.Equal(fetchedManifestByDigest.Canonical, signedManifest.Canonical) { - t.Fatalf("manifests do not match") - } - - // check signature was roundtripped - signatures, err := fetchedManifestByDigest.Signatures() - if err != nil { - t.Fatal(err) - } - - if len(signatures) != 1 { - t.Fatalf("expected 1 signature from manifest, got: %d", len(signatures)) - } - - // Re-sign, push and pull the same digest - sm2, err := schema1.Sign(&fetchedManifestByDigest.Manifest, env.pk) - if err != nil { - t.Fatal(err) - - } - - // Re-push with a few different Content-Types. The official schema1 - // content type should work, as should application/json with/without a - // charset. - resp = putManifest(t, "re-putting signed manifest", manifestDigestURL, schema1.MediaTypeSignedManifest, sm2) - checkResponse(t, "re-putting signed manifest", resp, http.StatusCreated) - resp = putManifest(t, "re-putting signed manifest", manifestDigestURL, "application/json; charset=utf-8", sm2) - checkResponse(t, "re-putting signed manifest", resp, http.StatusCreated) - resp = putManifest(t, "re-putting signed manifest", manifestDigestURL, "application/json", sm2) - checkResponse(t, "re-putting signed manifest", resp, http.StatusCreated) - - resp, err = http.Get(manifestDigestURL) - checkErr(t, err, "re-fetching manifest by digest") - defer resp.Body.Close() - - checkResponse(t, "re-fetching uploaded manifest", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{dgst.String()}, - "ETag": []string{fmt.Sprintf(`"%s"`, dgst)}, - }) - - dec = json.NewDecoder(resp.Body) - if err := dec.Decode(&fetchedManifestByDigest); err != nil { - t.Fatalf("error decoding fetched manifest: %v", err) - } - - // check only 1 signature is returned - signatures, err = fetchedManifestByDigest.Signatures() - if err != nil { - t.Fatal(err) - } - - if len(signatures) != 1 { - t.Fatalf("expected 2 signature from manifest, got: %d", len(signatures)) - } - - // Get by name with etag, gives 304 - etag := resp.Header.Get("Etag") - req, err := http.NewRequest("GET", manifestURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - req.Header.Set("If-None-Match", etag) - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - - checkResponse(t, "fetching manifest by name with etag", resp, http.StatusNotModified) - - // Get by digest with etag, gives 304 - req, err = http.NewRequest("GET", manifestDigestURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - req.Header.Set("If-None-Match", etag) - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - - checkResponse(t, "fetching manifest by dgst with etag", resp, http.StatusNotModified) - - // Ensure that the tag is listed. - resp, err = http.Get(tagsURL) - if err != nil { - t.Fatalf("unexpected error getting unknown tags: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "getting tags", resp, http.StatusOK) - dec = json.NewDecoder(resp.Body) - - var tagsResponse tagsAPIResponse - - if err := dec.Decode(&tagsResponse); err != nil { - t.Fatalf("unexpected error decoding error response: %v", err) - } - - if tagsResponse.Name != imageName.Name() { - t.Fatalf("tags name should match image name: %v != %v", tagsResponse.Name, imageName.Name()) - } - - if len(tagsResponse.Tags) != 1 { - t.Fatalf("expected some tags in response: %v", tagsResponse.Tags) - } - - if tagsResponse.Tags[0] != tag { - t.Fatalf("tag not as expected: %q != %q", tagsResponse.Tags[0], tag) - } - - // Attempt to put a manifest with mismatching FSLayer and History array cardinalities - - unsignedManifest.History = append(unsignedManifest.History, schema1.History{ - V1Compatibility: "", - }) - invalidSigned, err := schema1.Sign(unsignedManifest, env.pk) - if err != nil { - t.Fatalf("error signing manifest") - } - - resp = putManifest(t, "putting invalid signed manifest", manifestDigestURL, "", invalidSigned) - checkResponse(t, "putting invalid signed manifest", resp, http.StatusBadRequest) - - return args -} - -func testManifestAPISchema2(t *testing.T, env *testEnv, imageName reference.Named) manifestArgs { - tag := "schema2tag" - args := manifestArgs{ - imageName: imageName, - mediaType: schema2.MediaTypeManifest, - } - - tagRef, _ := reference.WithTag(imageName, tag) - manifestURL, err := env.builder.BuildManifestURL(tagRef) - if err != nil { - t.Fatalf("unexpected error getting manifest url: %v", err) - } - - // ----------------------------- - // Attempt to fetch the manifest - resp, err := http.Get(manifestURL) - if err != nil { - t.Fatalf("unexpected error getting manifest: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "getting non-existent manifest", resp, http.StatusNotFound) - checkBodyHasErrorCodes(t, "getting non-existent manifest", resp, v2.ErrorCodeManifestUnknown) - - tagsURL, err := env.builder.BuildTagsURL(imageName) - if err != nil { - t.Fatalf("unexpected error building tags url: %v", err) - } - - resp, err = http.Get(tagsURL) - if err != nil { - t.Fatalf("unexpected error getting unknown tags: %v", err) - } - defer resp.Body.Close() - - // Check that we get an unknown repository error when asking for tags - checkResponse(t, "getting unknown manifest tags", resp, http.StatusNotFound) - checkBodyHasErrorCodes(t, "getting unknown manifest tags", resp, v2.ErrorCodeNameUnknown) - - // -------------------------------- - // Attempt to push manifest with missing config and missing layers - manifest := &schema2.Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 2, - MediaType: schema2.MediaTypeManifest, - }, - Config: distribution.Descriptor{ - Digest: "sha256:1a9ec845ee94c202b2d5da74a24f0ed2058318bfa9879fa541efaecba272e86b", - Size: 3253, - MediaType: schema2.MediaTypeConfig, - }, - Layers: []distribution.Descriptor{ - { - Digest: "sha256:463434349086340864309863409683460843608348608934092322395278926a", - Size: 6323, - MediaType: schema2.MediaTypeLayer, - }, - { - Digest: "sha256:630923423623623423352523525237238023652897356239852383652aaaaaaa", - Size: 6863, - MediaType: schema2.MediaTypeLayer, - }, - }, - } - - resp = putManifest(t, "putting missing config manifest", manifestURL, schema2.MediaTypeManifest, manifest) - defer resp.Body.Close() - checkResponse(t, "putting missing config manifest", resp, http.StatusBadRequest) - _, p, counts := checkBodyHasErrorCodes(t, "putting missing config manifest", resp, v2.ErrorCodeManifestBlobUnknown) - - expectedCounts := map[errcode.ErrorCode]int{ - v2.ErrorCodeManifestBlobUnknown: 3, - } - - if !reflect.DeepEqual(counts, expectedCounts) { - t.Fatalf("unexpected number of error codes encountered: %v\n!=\n%v\n---\n%s", counts, expectedCounts, string(p)) - } - - // Push a config, and reference it in the manifest - sampleConfig := []byte(`{ - "architecture": "amd64", - "history": [ - { - "created": "2015-10-31T22:22:54.690851953Z", - "created_by": "/bin/sh -c #(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /" - }, - { - "created": "2015-10-31T22:22:55.613815829Z", - "created_by": "/bin/sh -c #(nop) CMD [\"sh\"]" - } - ], - "rootfs": { - "diff_ids": [ - "sha256:c6f988f4874bb0add23a778f753c65efe992244e148a1d2ec2a8b664fb66bbd1", - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" - ], - "type": "layers" - } - }`) - sampleConfigDigest := digest.FromBytes(sampleConfig) - - uploadURLBase, _ := startPushLayer(t, env, imageName) - pushLayer(t, env.builder, imageName, sampleConfigDigest, uploadURLBase, bytes.NewReader(sampleConfig)) - manifest.Config.Digest = sampleConfigDigest - manifest.Config.Size = int64(len(sampleConfig)) - - // The manifest should still be invalid, because its layer doesn't exist - resp = putManifest(t, "putting missing layer manifest", manifestURL, schema2.MediaTypeManifest, manifest) - defer resp.Body.Close() - checkResponse(t, "putting missing layer manifest", resp, http.StatusBadRequest) - _, p, counts = checkBodyHasErrorCodes(t, "getting unknown manifest tags", resp, v2.ErrorCodeManifestBlobUnknown) - - expectedCounts = map[errcode.ErrorCode]int{ - v2.ErrorCodeManifestBlobUnknown: 2, - } - - if !reflect.DeepEqual(counts, expectedCounts) { - t.Fatalf("unexpected number of error codes encountered: %v\n!=\n%v\n---\n%s", counts, expectedCounts, string(p)) - } - - // Push 2 random layers - expectedLayers := make(map[digest.Digest]io.ReadSeeker) - - for i := range manifest.Layers { - rs, dgstStr, err := testutil.CreateRandomTarFile() - - if err != nil { - t.Fatalf("error creating random layer %d: %v", i, err) - } - dgst := digest.Digest(dgstStr) - - expectedLayers[dgst] = rs - manifest.Layers[i].Digest = dgst - - uploadURLBase, _ := startPushLayer(t, env, imageName) - pushLayer(t, env.builder, imageName, dgst, uploadURLBase, rs) - } - - // ------------------- - // Push the manifest with all layers pushed. - deserializedManifest, err := schema2.FromStruct(*manifest) - if err != nil { - t.Fatalf("could not create DeserializedManifest: %v", err) - } - _, canonical, err := deserializedManifest.Payload() - if err != nil { - t.Fatalf("could not get manifest payload: %v", err) - } - dgst := digest.FromBytes(canonical) - args.dgst = dgst - args.manifest = deserializedManifest - - digestRef, _ := reference.WithDigest(imageName, dgst) - manifestDigestURL, err := env.builder.BuildManifestURL(digestRef) - checkErr(t, err, "building manifest url") - - resp = putManifest(t, "putting manifest no error", manifestURL, schema2.MediaTypeManifest, manifest) - checkResponse(t, "putting manifest no error", resp, http.StatusCreated) - checkHeaders(t, resp, http.Header{ - "Location": []string{manifestDigestURL}, - "Docker-Content-Digest": []string{dgst.String()}, - }) - - // -------------------- - // Push by digest -- should get same result - resp = putManifest(t, "putting manifest by digest", manifestDigestURL, schema2.MediaTypeManifest, manifest) - checkResponse(t, "putting manifest by digest", resp, http.StatusCreated) - checkHeaders(t, resp, http.Header{ - "Location": []string{manifestDigestURL}, - "Docker-Content-Digest": []string{dgst.String()}, - }) - - // ------------------ - // Fetch by tag name - req, err := http.NewRequest("GET", manifestURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - req.Header.Set("Accept", schema2.MediaTypeManifest) - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("unexpected error fetching manifest: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "fetching uploaded manifest", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{dgst.String()}, - "ETag": []string{fmt.Sprintf(`"%s"`, dgst)}, - }) - - var fetchedManifest schema2.DeserializedManifest - dec := json.NewDecoder(resp.Body) - - if err := dec.Decode(&fetchedManifest); err != nil { - t.Fatalf("error decoding fetched manifest: %v", err) - } - - _, fetchedCanonical, err := fetchedManifest.Payload() - if err != nil { - t.Fatalf("error getting manifest payload: %v", err) - } - - if !bytes.Equal(fetchedCanonical, canonical) { - t.Fatalf("manifests do not match") - } - - // --------------- - // Fetch by digest - req, err = http.NewRequest("GET", manifestDigestURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - req.Header.Set("Accept", schema2.MediaTypeManifest) - resp, err = http.DefaultClient.Do(req) - checkErr(t, err, "fetching manifest by digest") - defer resp.Body.Close() - - checkResponse(t, "fetching uploaded manifest", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{dgst.String()}, - "ETag": []string{fmt.Sprintf(`"%s"`, dgst)}, - }) - - var fetchedManifestByDigest schema2.DeserializedManifest - dec = json.NewDecoder(resp.Body) - if err := dec.Decode(&fetchedManifestByDigest); err != nil { - t.Fatalf("error decoding fetched manifest: %v", err) - } - - _, fetchedCanonical, err = fetchedManifest.Payload() - if err != nil { - t.Fatalf("error getting manifest payload: %v", err) - } - - if !bytes.Equal(fetchedCanonical, canonical) { - t.Fatalf("manifests do not match") - } - - // Get by name with etag, gives 304 - etag := resp.Header.Get("Etag") - req, err = http.NewRequest("GET", manifestURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - req.Header.Set("If-None-Match", etag) - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - - checkResponse(t, "fetching manifest by name with etag", resp, http.StatusNotModified) - - // Get by digest with etag, gives 304 - req, err = http.NewRequest("GET", manifestDigestURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - req.Header.Set("If-None-Match", etag) - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - - checkResponse(t, "fetching manifest by dgst with etag", resp, http.StatusNotModified) - - // Ensure that the tag is listed. - resp, err = http.Get(tagsURL) - if err != nil { - t.Fatalf("unexpected error getting unknown tags: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "getting unknown manifest tags", resp, http.StatusOK) - dec = json.NewDecoder(resp.Body) - - var tagsResponse tagsAPIResponse - - if err := dec.Decode(&tagsResponse); err != nil { - t.Fatalf("unexpected error decoding error response: %v", err) - } - - if tagsResponse.Name != imageName.Name() { - t.Fatalf("tags name should match image name: %v != %v", tagsResponse.Name, imageName) - } - - if len(tagsResponse.Tags) != 1 { - t.Fatalf("expected some tags in response: %v", tagsResponse.Tags) - } - - if tagsResponse.Tags[0] != tag { - t.Fatalf("tag not as expected: %q != %q", tagsResponse.Tags[0], tag) - } - - // ------------------ - // Fetch as a schema1 manifest - resp, err = http.Get(manifestURL) - if err != nil { - t.Fatalf("unexpected error fetching manifest as schema1: %v", err) - } - defer resp.Body.Close() - - manifestBytes, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("error reading response body: %v", err) - } - - checkResponse(t, "fetching uploaded manifest as schema1", resp, http.StatusOK) - - m, desc, err := distribution.UnmarshalManifest(schema1.MediaTypeManifest, manifestBytes) - if err != nil { - t.Fatalf("unexpected error unmarshalling manifest: %v", err) - } - - fetchedSchema1Manifest, ok := m.(*schema1.SignedManifest) - if !ok { - t.Fatalf("expecting schema1 manifest") - } - - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{desc.Digest.String()}, - "ETag": []string{fmt.Sprintf(`"%s"`, desc.Digest)}, - }) - - if fetchedSchema1Manifest.Manifest.SchemaVersion != 1 { - t.Fatal("wrong schema version") - } - if fetchedSchema1Manifest.Architecture != "amd64" { - t.Fatal("wrong architecture") - } - if fetchedSchema1Manifest.Name != imageName.Name() { - t.Fatal("wrong image name") - } - if fetchedSchema1Manifest.Tag != tag { - t.Fatal("wrong tag") - } - if len(fetchedSchema1Manifest.FSLayers) != 2 { - t.Fatal("wrong number of FSLayers") - } - for i := range manifest.Layers { - if fetchedSchema1Manifest.FSLayers[i].BlobSum != manifest.Layers[len(manifest.Layers)-i-1].Digest { - t.Fatalf("blob digest mismatch in schema1 manifest for layer %d", i) - } - } - if len(fetchedSchema1Manifest.History) != 2 { - t.Fatal("wrong number of History entries") - } - - // Don't check V1Compatibility fields because we're using randomly-generated - // layers. - - return args -} - -func testManifestAPIManifestList(t *testing.T, env *testEnv, args manifestArgs) { - imageName := args.imageName - tag := "manifestlisttag" - - tagRef, _ := reference.WithTag(imageName, tag) - manifestURL, err := env.builder.BuildManifestURL(tagRef) - if err != nil { - t.Fatalf("unexpected error getting manifest url: %v", err) - } - - // -------------------------------- - // Attempt to push manifest list that refers to an unknown manifest - manifestList := &manifestlist.ManifestList{ - Versioned: manifest.Versioned{ - SchemaVersion: 2, - MediaType: manifestlist.MediaTypeManifestList, - }, - Manifests: []manifestlist.ManifestDescriptor{ - { - Descriptor: distribution.Descriptor{ - Digest: "sha256:1a9ec845ee94c202b2d5da74a24f0ed2058318bfa9879fa541efaecba272e86b", - Size: 3253, - MediaType: schema2.MediaTypeManifest, - }, - Platform: manifestlist.PlatformSpec{ - Architecture: "amd64", - OS: "linux", - }, - }, - }, - } - - resp := putManifest(t, "putting missing manifest manifestlist", manifestURL, manifestlist.MediaTypeManifestList, manifestList) - defer resp.Body.Close() - checkResponse(t, "putting missing manifest manifestlist", resp, http.StatusBadRequest) - _, p, counts := checkBodyHasErrorCodes(t, "putting missing manifest manifestlist", resp, v2.ErrorCodeManifestBlobUnknown) - - expectedCounts := map[errcode.ErrorCode]int{ - v2.ErrorCodeManifestBlobUnknown: 1, - } - - if !reflect.DeepEqual(counts, expectedCounts) { - t.Fatalf("unexpected number of error codes encountered: %v\n!=\n%v\n---\n%s", counts, expectedCounts, string(p)) - } - - // ------------------- - // Push a manifest list that references an actual manifest - manifestList.Manifests[0].Digest = args.dgst - deserializedManifestList, err := manifestlist.FromDescriptors(manifestList.Manifests) - if err != nil { - t.Fatalf("could not create DeserializedManifestList: %v", err) - } - _, canonical, err := deserializedManifestList.Payload() - if err != nil { - t.Fatalf("could not get manifest list payload: %v", err) - } - dgst := digest.FromBytes(canonical) - - digestRef, _ := reference.WithDigest(imageName, dgst) - manifestDigestURL, err := env.builder.BuildManifestURL(digestRef) - checkErr(t, err, "building manifest url") - - resp = putManifest(t, "putting manifest list no error", manifestURL, manifestlist.MediaTypeManifestList, deserializedManifestList) - checkResponse(t, "putting manifest list no error", resp, http.StatusCreated) - checkHeaders(t, resp, http.Header{ - "Location": []string{manifestDigestURL}, - "Docker-Content-Digest": []string{dgst.String()}, - }) - - // -------------------- - // Push by digest -- should get same result - resp = putManifest(t, "putting manifest list by digest", manifestDigestURL, manifestlist.MediaTypeManifestList, deserializedManifestList) - checkResponse(t, "putting manifest list by digest", resp, http.StatusCreated) - checkHeaders(t, resp, http.Header{ - "Location": []string{manifestDigestURL}, - "Docker-Content-Digest": []string{dgst.String()}, - }) - - // ------------------ - // Fetch by tag name - req, err := http.NewRequest("GET", manifestURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - // multiple headers in mixed list format to ensure we parse correctly server-side - req.Header.Set("Accept", fmt.Sprintf(` %s ; q=0.8 , %s ; q=0.5 `, manifestlist.MediaTypeManifestList, schema1.MediaTypeSignedManifest)) - req.Header.Add("Accept", schema2.MediaTypeManifest) - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("unexpected error fetching manifest list: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "fetching uploaded manifest list", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{dgst.String()}, - "ETag": []string{fmt.Sprintf(`"%s"`, dgst)}, - }) - - var fetchedManifestList manifestlist.DeserializedManifestList - dec := json.NewDecoder(resp.Body) - - if err := dec.Decode(&fetchedManifestList); err != nil { - t.Fatalf("error decoding fetched manifest list: %v", err) - } - - _, fetchedCanonical, err := fetchedManifestList.Payload() - if err != nil { - t.Fatalf("error getting manifest list payload: %v", err) - } - - if !bytes.Equal(fetchedCanonical, canonical) { - t.Fatalf("manifest lists do not match") - } - - // --------------- - // Fetch by digest - req, err = http.NewRequest("GET", manifestDigestURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - req.Header.Set("Accept", manifestlist.MediaTypeManifestList) - resp, err = http.DefaultClient.Do(req) - checkErr(t, err, "fetching manifest list by digest") - defer resp.Body.Close() - - checkResponse(t, "fetching uploaded manifest list", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{dgst.String()}, - "ETag": []string{fmt.Sprintf(`"%s"`, dgst)}, - }) - - var fetchedManifestListByDigest manifestlist.DeserializedManifestList - dec = json.NewDecoder(resp.Body) - if err := dec.Decode(&fetchedManifestListByDigest); err != nil { - t.Fatalf("error decoding fetched manifest: %v", err) - } - - _, fetchedCanonical, err = fetchedManifestListByDigest.Payload() - if err != nil { - t.Fatalf("error getting manifest list payload: %v", err) - } - - if !bytes.Equal(fetchedCanonical, canonical) { - t.Fatalf("manifests do not match") - } - - // Get by name with etag, gives 304 - etag := resp.Header.Get("Etag") - req, err = http.NewRequest("GET", manifestURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - req.Header.Set("If-None-Match", etag) - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - - checkResponse(t, "fetching manifest by name with etag", resp, http.StatusNotModified) - - // Get by digest with etag, gives 304 - req, err = http.NewRequest("GET", manifestDigestURL, nil) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - req.Header.Set("If-None-Match", etag) - resp, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("Error constructing request: %s", err) - } - - checkResponse(t, "fetching manifest by dgst with etag", resp, http.StatusNotModified) - - // ------------------ - // Fetch as a schema1 manifest - resp, err = http.Get(manifestURL) - if err != nil { - t.Fatalf("unexpected error fetching manifest list as schema1: %v", err) - } - defer resp.Body.Close() - - manifestBytes, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("error reading response body: %v", err) - } - - checkResponse(t, "fetching uploaded manifest list as schema1", resp, http.StatusOK) - - m, desc, err := distribution.UnmarshalManifest(schema1.MediaTypeManifest, manifestBytes) - if err != nil { - t.Fatalf("unexpected error unmarshalling manifest: %v", err) - } - - fetchedSchema1Manifest, ok := m.(*schema1.SignedManifest) - if !ok { - t.Fatalf("expecting schema1 manifest") - } - - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{desc.Digest.String()}, - "ETag": []string{fmt.Sprintf(`"%s"`, desc.Digest)}, - }) - - if fetchedSchema1Manifest.Manifest.SchemaVersion != 1 { - t.Fatal("wrong schema version") - } - if fetchedSchema1Manifest.Architecture != "amd64" { - t.Fatal("wrong architecture") - } - if fetchedSchema1Manifest.Name != imageName.Name() { - t.Fatal("wrong image name") - } - if fetchedSchema1Manifest.Tag != tag { - t.Fatal("wrong tag") - } - if len(fetchedSchema1Manifest.FSLayers) != 2 { - t.Fatal("wrong number of FSLayers") - } - layers := args.manifest.(*schema2.DeserializedManifest).Layers - for i := range layers { - if fetchedSchema1Manifest.FSLayers[i].BlobSum != layers[len(layers)-i-1].Digest { - t.Fatalf("blob digest mismatch in schema1 manifest for layer %d", i) - } - } - if len(fetchedSchema1Manifest.History) != 2 { - t.Fatal("wrong number of History entries") - } - - // Don't check V1Compatibility fields because we're using randomly-generated - // layers. -} - -func testManifestDelete(t *testing.T, env *testEnv, args manifestArgs) { - imageName := args.imageName - dgst := args.dgst - manifest := args.manifest - - ref, _ := reference.WithDigest(imageName, dgst) - manifestDigestURL, err := env.builder.BuildManifestURL(ref) - // --------------- - // Delete by digest - resp, err := httpDelete(manifestDigestURL) - checkErr(t, err, "deleting manifest by digest") - - checkResponse(t, "deleting manifest", resp, http.StatusAccepted) - checkHeaders(t, resp, http.Header{ - "Content-Length": []string{"0"}, - }) - - // --------------- - // Attempt to fetch deleted manifest - resp, err = http.Get(manifestDigestURL) - checkErr(t, err, "fetching deleted manifest by digest") - defer resp.Body.Close() - - checkResponse(t, "fetching deleted manifest", resp, http.StatusNotFound) - - // --------------- - // Delete already deleted manifest by digest - resp, err = httpDelete(manifestDigestURL) - checkErr(t, err, "re-deleting manifest by digest") - - checkResponse(t, "re-deleting manifest", resp, http.StatusNotFound) - - // -------------------- - // Re-upload manifest by digest - resp = putManifest(t, "putting manifest", manifestDigestURL, args.mediaType, manifest) - checkResponse(t, "putting manifest", resp, http.StatusCreated) - checkHeaders(t, resp, http.Header{ - "Location": []string{manifestDigestURL}, - "Docker-Content-Digest": []string{dgst.String()}, - }) - - // --------------- - // Attempt to fetch re-uploaded deleted digest - resp, err = http.Get(manifestDigestURL) - checkErr(t, err, "fetching re-uploaded manifest by digest") - defer resp.Body.Close() - - checkResponse(t, "fetching re-uploaded manifest", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{dgst.String()}, - }) - - // --------------- - // Attempt to delete an unknown manifest - unknownDigest := digest.Digest("sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") - unknownRef, _ := reference.WithDigest(imageName, unknownDigest) - unknownManifestDigestURL, err := env.builder.BuildManifestURL(unknownRef) - checkErr(t, err, "building unknown manifest url") - - resp, err = httpDelete(unknownManifestDigestURL) - checkErr(t, err, "delting unknown manifest by digest") - checkResponse(t, "fetching deleted manifest", resp, http.StatusNotFound) - - // -------------------- - // Upload manifest by tag - tag := "atag" - tagRef, _ := reference.WithTag(imageName, tag) - manifestTagURL, err := env.builder.BuildManifestURL(tagRef) - resp = putManifest(t, "putting manifest by tag", manifestTagURL, args.mediaType, manifest) - checkResponse(t, "putting manifest by tag", resp, http.StatusCreated) - checkHeaders(t, resp, http.Header{ - "Location": []string{manifestDigestURL}, - "Docker-Content-Digest": []string{dgst.String()}, - }) - - tagsURL, err := env.builder.BuildTagsURL(imageName) - if err != nil { - t.Fatalf("unexpected error building tags url: %v", err) - } - - // Ensure that the tag is listed. - resp, err = http.Get(tagsURL) - if err != nil { - t.Fatalf("unexpected error getting unknown tags: %v", err) - } - defer resp.Body.Close() - - dec := json.NewDecoder(resp.Body) - var tagsResponse tagsAPIResponse - if err := dec.Decode(&tagsResponse); err != nil { - t.Fatalf("unexpected error decoding error response: %v", err) - } - - if tagsResponse.Name != imageName.Name() { - t.Fatalf("tags name should match image name: %v != %v", tagsResponse.Name, imageName) - } - - if len(tagsResponse.Tags) != 1 { - t.Fatalf("expected some tags in response: %v", tagsResponse.Tags) - } - - if tagsResponse.Tags[0] != tag { - t.Fatalf("tag not as expected: %q != %q", tagsResponse.Tags[0], tag) - } - - // --------------- - // Delete by digest - resp, err = httpDelete(manifestDigestURL) - checkErr(t, err, "deleting manifest by digest") - - checkResponse(t, "deleting manifest with tag", resp, http.StatusAccepted) - checkHeaders(t, resp, http.Header{ - "Content-Length": []string{"0"}, - }) - - // Ensure that the tag is not listed. - resp, err = http.Get(tagsURL) - if err != nil { - t.Fatalf("unexpected error getting unknown tags: %v", err) - } - defer resp.Body.Close() - - dec = json.NewDecoder(resp.Body) - if err := dec.Decode(&tagsResponse); err != nil { - t.Fatalf("unexpected error decoding error response: %v", err) - } - - if tagsResponse.Name != imageName.Name() { - t.Fatalf("tags name should match image name: %v != %v", tagsResponse.Name, imageName) - } - - if len(tagsResponse.Tags) != 0 { - t.Fatalf("expected 0 tags in response: %v", tagsResponse.Tags) - } - -} - -type testEnv struct { - pk libtrust.PrivateKey - ctx context.Context - config configuration.Configuration - app *App - server *httptest.Server - builder *v2.URLBuilder -} - -func newTestEnvMirror(t *testing.T, deleteEnabled bool) *testEnv { - config := configuration.Configuration{ - Storage: configuration.Storage{ - "testdriver": configuration.Parameters{}, - "delete": configuration.Parameters{"enabled": deleteEnabled}, - "maintenance": configuration.Parameters{"uploadpurging": map[interface{}]interface{}{ - "enabled": false, - }}, - }, - Proxy: configuration.Proxy{ - RemoteURL: "http://example.com", - }, - } - - return newTestEnvWithConfig(t, &config) - -} - -func newTestEnv(t *testing.T, deleteEnabled bool) *testEnv { - config := configuration.Configuration{ - Storage: configuration.Storage{ - "testdriver": configuration.Parameters{}, - "delete": configuration.Parameters{"enabled": deleteEnabled}, - "maintenance": configuration.Parameters{"uploadpurging": map[interface{}]interface{}{ - "enabled": false, - }}, - }, - } - - config.HTTP.Headers = headerConfig - - return newTestEnvWithConfig(t, &config) -} - -func newTestEnvWithConfig(t *testing.T, config *configuration.Configuration) *testEnv { - ctx := context.Background() - - app := NewApp(ctx, config) - server := httptest.NewServer(handlers.CombinedLoggingHandler(os.Stderr, app)) - builder, err := v2.NewURLBuilderFromString(server.URL+config.HTTP.Prefix, false) - - if err != nil { - t.Fatalf("error creating url builder: %v", err) - } - - pk, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatalf("unexpected error generating private key: %v", err) - } - - return &testEnv{ - pk: pk, - ctx: ctx, - config: *config, - app: app, - server: server, - builder: builder, - } -} - -func (t *testEnv) Shutdown() { - t.server.CloseClientConnections() - t.server.Close() -} - -func putManifest(t *testing.T, msg, url, contentType string, v interface{}) *http.Response { - var body []byte - - switch m := v.(type) { - case *schema1.SignedManifest: - _, pl, err := m.Payload() - if err != nil { - t.Fatalf("error getting payload: %v", err) - } - body = pl - case *manifestlist.DeserializedManifestList: - _, pl, err := m.Payload() - if err != nil { - t.Fatalf("error getting payload: %v", err) - } - body = pl - default: - var err error - body, err = json.MarshalIndent(v, "", " ") - if err != nil { - t.Fatalf("unexpected error marshaling %v: %v", v, err) - } - } - - req, err := http.NewRequest("PUT", url, bytes.NewReader(body)) - if err != nil { - t.Fatalf("error creating request for %s: %v", msg, err) - } - - if contentType != "" { - req.Header.Set("Content-Type", contentType) - } - - resp, err := http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("error doing put request while %s: %v", msg, err) - } - - return resp -} - -func startPushLayer(t *testing.T, env *testEnv, name reference.Named) (location string, uuid string) { - layerUploadURL, err := env.builder.BuildBlobUploadURL(name) - if err != nil { - t.Fatalf("unexpected error building layer upload url: %v", err) - } - - u, err := url.Parse(layerUploadURL) - if err != nil { - t.Fatalf("error parsing layer upload URL: %v", err) - } - - base, err := url.Parse(env.server.URL) - if err != nil { - t.Fatalf("error parsing server URL: %v", err) - } - - layerUploadURL = base.ResolveReference(u).String() - resp, err := http.Post(layerUploadURL, "", nil) - if err != nil { - t.Fatalf("unexpected error starting layer push: %v", err) - } - - defer resp.Body.Close() - - checkResponse(t, fmt.Sprintf("pushing starting layer push %v", name.String()), resp, http.StatusAccepted) - - u, err = url.Parse(resp.Header.Get("Location")) - if err != nil { - t.Fatalf("error parsing location header: %v", err) - } - - uuid = path.Base(u.Path) - checkHeaders(t, resp, http.Header{ - "Location": []string{"*"}, - "Content-Length": []string{"0"}, - "Docker-Upload-UUID": []string{uuid}, - }) - - return resp.Header.Get("Location"), uuid -} - -// doPushLayer pushes the layer content returning the url on success returning -// the response. If you're only expecting a successful response, use pushLayer. -func doPushLayer(t *testing.T, ub *v2.URLBuilder, name reference.Named, dgst digest.Digest, uploadURLBase string, body io.Reader) (*http.Response, error) { - u, err := url.Parse(uploadURLBase) - if err != nil { - t.Fatalf("unexpected error parsing pushLayer url: %v", err) - } - - u.RawQuery = url.Values{ - "_state": u.Query()["_state"], - "digest": []string{dgst.String()}, - }.Encode() - - uploadURL := u.String() - - // Just do a monolithic upload - req, err := http.NewRequest("PUT", uploadURL, body) - if err != nil { - t.Fatalf("unexpected error creating new request: %v", err) - } - - return http.DefaultClient.Do(req) -} - -// pushLayer pushes the layer content returning the url on success. -func pushLayer(t *testing.T, ub *v2.URLBuilder, name reference.Named, dgst digest.Digest, uploadURLBase string, body io.Reader) string { - digester := digest.Canonical.New() - - resp, err := doPushLayer(t, ub, name, dgst, uploadURLBase, io.TeeReader(body, digester.Hash())) - if err != nil { - t.Fatalf("unexpected error doing push layer request: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "putting monolithic chunk", resp, http.StatusCreated) - - if err != nil { - t.Fatalf("error generating sha256 digest of body") - } - - sha256Dgst := digester.Digest() - - ref, _ := reference.WithDigest(name, sha256Dgst) - expectedLayerURL, err := ub.BuildBlobURL(ref) - if err != nil { - t.Fatalf("error building expected layer url: %v", err) - } - - checkHeaders(t, resp, http.Header{ - "Location": []string{expectedLayerURL}, - "Content-Length": []string{"0"}, - "Docker-Content-Digest": []string{sha256Dgst.String()}, - }) - - return resp.Header.Get("Location") -} - -func finishUpload(t *testing.T, ub *v2.URLBuilder, name reference.Named, uploadURLBase string, dgst digest.Digest) string { - resp, err := doPushLayer(t, ub, name, dgst, uploadURLBase, nil) - if err != nil { - t.Fatalf("unexpected error doing push layer request: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "putting monolithic chunk", resp, http.StatusCreated) - - ref, _ := reference.WithDigest(name, dgst) - expectedLayerURL, err := ub.BuildBlobURL(ref) - if err != nil { - t.Fatalf("error building expected layer url: %v", err) - } - - checkHeaders(t, resp, http.Header{ - "Location": []string{expectedLayerURL}, - "Content-Length": []string{"0"}, - "Docker-Content-Digest": []string{dgst.String()}, - }) - - return resp.Header.Get("Location") -} - -func doPushChunk(t *testing.T, uploadURLBase string, body io.Reader) (*http.Response, digest.Digest, error) { - u, err := url.Parse(uploadURLBase) - if err != nil { - t.Fatalf("unexpected error parsing pushLayer url: %v", err) - } - - u.RawQuery = url.Values{ - "_state": u.Query()["_state"], - }.Encode() - - uploadURL := u.String() - - digester := digest.Canonical.New() - - req, err := http.NewRequest("PATCH", uploadURL, io.TeeReader(body, digester.Hash())) - if err != nil { - t.Fatalf("unexpected error creating new request: %v", err) - } - req.Header.Set("Content-Type", "application/octet-stream") - - resp, err := http.DefaultClient.Do(req) - - return resp, digester.Digest(), err -} - -func pushChunk(t *testing.T, ub *v2.URLBuilder, name reference.Named, uploadURLBase string, body io.Reader, length int64) (string, digest.Digest) { - resp, dgst, err := doPushChunk(t, uploadURLBase, body) - if err != nil { - t.Fatalf("unexpected error doing push layer request: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, "putting chunk", resp, http.StatusAccepted) - - if err != nil { - t.Fatalf("error generating sha256 digest of body") - } - - checkHeaders(t, resp, http.Header{ - "Range": []string{fmt.Sprintf("0-%d", length-1)}, - "Content-Length": []string{"0"}, - }) - - return resp.Header.Get("Location"), dgst -} - -func checkResponse(t *testing.T, msg string, resp *http.Response, expectedStatus int) { - if resp.StatusCode != expectedStatus { - t.Logf("unexpected status %s: %v != %v", msg, resp.StatusCode, expectedStatus) - maybeDumpResponse(t, resp) - - t.FailNow() - } - - // We expect the headers included in the configuration, unless the - // status code is 405 (Method Not Allowed), which means the handler - // doesn't even get called. - if resp.StatusCode != 405 && !reflect.DeepEqual(resp.Header["X-Content-Type-Options"], []string{"nosniff"}) { - t.Logf("missing or incorrect header X-Content-Type-Options %s", msg) - maybeDumpResponse(t, resp) - - t.FailNow() - } -} - -// checkBodyHasErrorCodes ensures the body is an error body and has the -// expected error codes, returning the error structure, the json slice and a -// count of the errors by code. -func checkBodyHasErrorCodes(t *testing.T, msg string, resp *http.Response, errorCodes ...errcode.ErrorCode) (errcode.Errors, []byte, map[errcode.ErrorCode]int) { - p, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("unexpected error reading body %s: %v", msg, err) - } - - var errs errcode.Errors - if err := json.Unmarshal(p, &errs); err != nil { - t.Fatalf("unexpected error decoding error response: %v", err) - } - - if len(errs) == 0 { - t.Fatalf("expected errors in response") - } - - // TODO(stevvooe): Shoot. The error setup is not working out. The content- - // type headers are being set after writing the status code. - // if resp.Header.Get("Content-Type") != "application/json; charset=utf-8" { - // t.Fatalf("unexpected content type: %v != 'application/json'", - // resp.Header.Get("Content-Type")) - // } - - expected := map[errcode.ErrorCode]struct{}{} - counts := map[errcode.ErrorCode]int{} - - // Initialize map with zeros for expected - for _, code := range errorCodes { - expected[code] = struct{}{} - counts[code] = 0 - } - - for _, e := range errs { - err, ok := e.(errcode.ErrorCoder) - if !ok { - t.Fatalf("not an ErrorCoder: %#v", e) - } - if _, ok := expected[err.ErrorCode()]; !ok { - t.Fatalf("unexpected error code %v encountered during %s: %s ", err.ErrorCode(), msg, string(p)) - } - counts[err.ErrorCode()]++ - } - - // Ensure that counts of expected errors were all non-zero - for code := range expected { - if counts[code] == 0 { - t.Fatalf("expected error code %v not encounterd during %s: %s", code, msg, string(p)) - } - } - - return errs, p, counts -} - -func maybeDumpResponse(t *testing.T, resp *http.Response) { - if d, err := httputil.DumpResponse(resp, true); err != nil { - t.Logf("error dumping response: %v", err) - } else { - t.Logf("response:\n%s", string(d)) - } -} - -// matchHeaders checks that the response has at least the headers. If not, the -// test will fail. If a passed in header value is "*", any non-zero value will -// suffice as a match. -func checkHeaders(t *testing.T, resp *http.Response, headers http.Header) { - for k, vs := range headers { - if resp.Header.Get(k) == "" { - t.Fatalf("response missing header %q", k) - } - - for _, v := range vs { - if v == "*" { - // Just ensure there is some value. - if len(resp.Header[http.CanonicalHeaderKey(k)]) > 0 { - continue - } - } - - for _, hv := range resp.Header[http.CanonicalHeaderKey(k)] { - if hv != v { - t.Fatalf("%+v %v header value not matched in response: %q != %q", resp.Header, k, hv, v) - } - } - } - } -} - -func checkErr(t *testing.T, err error, msg string) { - if err != nil { - t.Fatalf("unexpected error %s: %v", msg, err) - } -} - -func createRepository(env *testEnv, t *testing.T, imageName string, tag string) digest.Digest { - imageNameRef, err := reference.ParseNamed(imageName) - if err != nil { - t.Fatalf("unable to parse reference: %v", err) - } - - unsignedManifest := &schema1.Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 1, - }, - Name: imageName, - Tag: tag, - FSLayers: []schema1.FSLayer{ - { - BlobSum: "asdf", - }, - }, - History: []schema1.History{ - { - V1Compatibility: "", - }, - }, - } - - // Push 2 random layers - expectedLayers := make(map[digest.Digest]io.ReadSeeker) - - for i := range unsignedManifest.FSLayers { - rs, dgstStr, err := testutil.CreateRandomTarFile() - if err != nil { - t.Fatalf("error creating random layer %d: %v", i, err) - } - dgst := digest.Digest(dgstStr) - - expectedLayers[dgst] = rs - unsignedManifest.FSLayers[i].BlobSum = dgst - uploadURLBase, _ := startPushLayer(t, env, imageNameRef) - pushLayer(t, env.builder, imageNameRef, dgst, uploadURLBase, rs) - } - - signedManifest, err := schema1.Sign(unsignedManifest, env.pk) - if err != nil { - t.Fatalf("unexpected error signing manifest: %v", err) - } - - dgst := digest.FromBytes(signedManifest.Canonical) - - // Create this repository by tag to ensure the tag mapping is made in the registry - tagRef, _ := reference.WithTag(imageNameRef, tag) - manifestDigestURL, err := env.builder.BuildManifestURL(tagRef) - checkErr(t, err, "building manifest url") - - digestRef, _ := reference.WithDigest(imageNameRef, dgst) - location, err := env.builder.BuildManifestURL(digestRef) - checkErr(t, err, "building location URL") - - resp := putManifest(t, "putting signed manifest", manifestDigestURL, "", signedManifest) - checkResponse(t, "putting signed manifest", resp, http.StatusCreated) - checkHeaders(t, resp, http.Header{ - "Location": []string{location}, - "Docker-Content-Digest": []string{dgst.String()}, - }) - return dgst -} - -// Test mutation operations on a registry configured as a cache. Ensure that they return -// appropriate errors. -func TestRegistryAsCacheMutationAPIs(t *testing.T) { - deleteEnabled := true - env := newTestEnvMirror(t, deleteEnabled) - defer env.Shutdown() - - imageName, _ := reference.ParseNamed("foo/bar") - tag := "latest" - tagRef, _ := reference.WithTag(imageName, tag) - manifestURL, err := env.builder.BuildManifestURL(tagRef) - if err != nil { - t.Fatalf("unexpected error building base url: %v", err) - } - - // Manifest upload - m := &schema1.Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 1, - }, - Name: imageName.Name(), - Tag: tag, - FSLayers: []schema1.FSLayer{}, - History: []schema1.History{}, - } - - sm, err := schema1.Sign(m, env.pk) - if err != nil { - t.Fatalf("error signing manifest: %v", err) - } - - resp := putManifest(t, "putting unsigned manifest", manifestURL, "", sm) - checkResponse(t, "putting signed manifest to cache", resp, errcode.ErrorCodeUnsupported.Descriptor().HTTPStatusCode) - - // Manifest Delete - resp, err = httpDelete(manifestURL) - checkResponse(t, "deleting signed manifest from cache", resp, errcode.ErrorCodeUnsupported.Descriptor().HTTPStatusCode) - - // Blob upload initialization - layerUploadURL, err := env.builder.BuildBlobUploadURL(imageName) - if err != nil { - t.Fatalf("unexpected error building layer upload url: %v", err) - } - - resp, err = http.Post(layerUploadURL, "", nil) - if err != nil { - t.Fatalf("unexpected error starting layer push: %v", err) - } - defer resp.Body.Close() - - checkResponse(t, fmt.Sprintf("starting layer push to cache %v", imageName), resp, errcode.ErrorCodeUnsupported.Descriptor().HTTPStatusCode) - - // Blob Delete - ref, _ := reference.WithDigest(imageName, digest.DigestSha256EmptyTar) - blobURL, err := env.builder.BuildBlobURL(ref) - resp, err = httpDelete(blobURL) - checkResponse(t, "deleting blob from cache", resp, errcode.ErrorCodeUnsupported.Descriptor().HTTPStatusCode) - -} - -// TestCheckContextNotifier makes sure the API endpoints get a ResponseWriter -// that implements http.ContextNotifier. -func TestCheckContextNotifier(t *testing.T) { - env := newTestEnv(t, false) - defer env.Shutdown() - - // Register a new endpoint for testing - env.app.router.Handle("/unittest/{name}/", env.app.dispatcher(func(ctx *Context, r *http.Request) http.Handler { - return handlers.MethodHandler{ - "GET": http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if _, ok := w.(http.CloseNotifier); !ok { - t.Fatal("could not cast ResponseWriter to CloseNotifier") - } - w.WriteHeader(200) - }), - } - })) - - resp, err := http.Get(env.server.URL + "/unittest/reponame/") - if err != nil { - t.Fatalf("unexpected error issuing request: %v", err) - } - defer resp.Body.Close() - - if resp.StatusCode != 200 { - t.Fatalf("wrong status code - expected 200, got %d", resp.StatusCode) - } -} - -func TestProxyManifestGetByTag(t *testing.T) { - truthConfig := configuration.Configuration{ - Storage: configuration.Storage{ - "testdriver": configuration.Parameters{}, - "maintenance": configuration.Parameters{"uploadpurging": map[interface{}]interface{}{ - "enabled": false, - }}, - }, - } - truthConfig.HTTP.Headers = headerConfig - - imageName, _ := reference.ParseNamed("foo/bar") - tag := "latest" - - truthEnv := newTestEnvWithConfig(t, &truthConfig) - defer truthEnv.Shutdown() - // create a repository in the truth registry - dgst := createRepository(truthEnv, t, imageName.Name(), tag) - - proxyConfig := configuration.Configuration{ - Storage: configuration.Storage{ - "testdriver": configuration.Parameters{}, - }, - Proxy: configuration.Proxy{ - RemoteURL: truthEnv.server.URL, - }, - } - proxyConfig.HTTP.Headers = headerConfig - - proxyEnv := newTestEnvWithConfig(t, &proxyConfig) - defer proxyEnv.Shutdown() - - digestRef, _ := reference.WithDigest(imageName, dgst) - manifestDigestURL, err := proxyEnv.builder.BuildManifestURL(digestRef) - checkErr(t, err, "building manifest url") - - resp, err := http.Get(manifestDigestURL) - checkErr(t, err, "fetching manifest from proxy by digest") - defer resp.Body.Close() - - tagRef, _ := reference.WithTag(imageName, tag) - manifestTagURL, err := proxyEnv.builder.BuildManifestURL(tagRef) - checkErr(t, err, "building manifest url") - - resp, err = http.Get(manifestTagURL) - checkErr(t, err, "fetching manifest from proxy by tag") - defer resp.Body.Close() - checkResponse(t, "fetching manifest from proxy by tag", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{dgst.String()}, - }) - - // Create another manifest in the remote with the same image/tag pair - newDigest := createRepository(truthEnv, t, imageName.Name(), tag) - if dgst == newDigest { - t.Fatalf("non-random test data") - } - - // fetch it with the same proxy URL as before. Ensure the updated content is at the same tag - resp, err = http.Get(manifestTagURL) - checkErr(t, err, "fetching manifest from proxy by tag") - defer resp.Body.Close() - checkResponse(t, "fetching manifest from proxy by tag", resp, http.StatusOK) - checkHeaders(t, resp, http.Header{ - "Docker-Content-Digest": []string{newDigest.String()}, - }) -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/app.go b/vendor/github.com/docker/distribution/registry/handlers/app.go deleted file mode 100644 index 0f30603f0..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/app.go +++ /dev/null @@ -1,1046 +0,0 @@ -package handlers - -import ( - cryptorand "crypto/rand" - "expvar" - "fmt" - "math/rand" - "net" - "net/http" - "net/url" - "os" - "regexp" - "runtime" - "strings" - "time" - - log "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/distribution/configuration" - ctxu "github.com/docker/distribution/context" - "github.com/docker/distribution/health" - "github.com/docker/distribution/health/checks" - "github.com/docker/distribution/notifications" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" - "github.com/docker/distribution/registry/auth" - registrymiddleware "github.com/docker/distribution/registry/middleware/registry" - repositorymiddleware "github.com/docker/distribution/registry/middleware/repository" - "github.com/docker/distribution/registry/proxy" - "github.com/docker/distribution/registry/storage" - memorycache "github.com/docker/distribution/registry/storage/cache/memory" - rediscache "github.com/docker/distribution/registry/storage/cache/redis" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/factory" - storagemiddleware "github.com/docker/distribution/registry/storage/driver/middleware" - "github.com/docker/distribution/version" - "github.com/docker/libtrust" - "github.com/garyburd/redigo/redis" - "github.com/gorilla/mux" - "golang.org/x/net/context" -) - -// randomSecretSize is the number of random bytes to generate if no secret -// was specified. -const randomSecretSize = 32 - -// defaultCheckInterval is the default time in between health checks -const defaultCheckInterval = 10 * time.Second - -// App is a global registry application object. Shared resources can be placed -// on this object that will be accessible from all requests. Any writable -// fields should be protected. -type App struct { - context.Context - - Config *configuration.Configuration - - router *mux.Router // main application router, configured with dispatchers - driver storagedriver.StorageDriver // driver maintains the app global storage driver instance. - registry distribution.Namespace // registry is the primary registry backend for the app instance. - accessController auth.AccessController // main access controller for application - - // httpHost is a parsed representation of the http.host parameter from - // the configuration. Only the Scheme and Host fields are used. - httpHost url.URL - - // events contains notification related configuration. - events struct { - sink notifications.Sink - source notifications.SourceRecord - } - - redis *redis.Pool - - // trustKey is a deprecated key used to sign manifests converted to - // schema1 for backward compatibility. It should not be used for any - // other purposes. - trustKey libtrust.PrivateKey - - // isCache is true if this registry is configured as a pull through cache - isCache bool - - // readOnly is true if the registry is in a read-only maintenance mode - readOnly bool -} - -// NewApp takes a configuration and returns a configured app, ready to serve -// requests. The app only implements ServeHTTP and can be wrapped in other -// handlers accordingly. -func NewApp(ctx context.Context, config *configuration.Configuration) *App { - app := &App{ - Config: config, - Context: ctx, - router: v2.RouterWithPrefix(config.HTTP.Prefix), - isCache: config.Proxy.RemoteURL != "", - } - - // Register the handler dispatchers. - app.register(v2.RouteNameBase, func(ctx *Context, r *http.Request) http.Handler { - return http.HandlerFunc(apiBase) - }) - app.register(v2.RouteNameManifest, imageManifestDispatcher) - app.register(v2.RouteNameCatalog, catalogDispatcher) - app.register(v2.RouteNameTags, tagsDispatcher) - app.register(v2.RouteNameBlob, blobDispatcher) - app.register(v2.RouteNameBlobUpload, blobUploadDispatcher) - app.register(v2.RouteNameBlobUploadChunk, blobUploadDispatcher) - - // override the storage driver's UA string for registry outbound HTTP requests - storageParams := config.Storage.Parameters() - if storageParams == nil { - storageParams = make(configuration.Parameters) - } - storageParams["useragent"] = fmt.Sprintf("docker-distribution/%s %s", version.Version, runtime.Version()) - - var err error - app.driver, err = factory.Create(config.Storage.Type(), storageParams) - if err != nil { - // TODO(stevvooe): Move the creation of a service into a protected - // method, where this is created lazily. Its status can be queried via - // a health check. - panic(err) - } - - purgeConfig := uploadPurgeDefaultConfig() - if mc, ok := config.Storage["maintenance"]; ok { - if v, ok := mc["uploadpurging"]; ok { - purgeConfig, ok = v.(map[interface{}]interface{}) - if !ok { - panic("uploadpurging config key must contain additional keys") - } - } - if v, ok := mc["readonly"]; ok { - readOnly, ok := v.(map[interface{}]interface{}) - if !ok { - panic("readonly config key must contain additional keys") - } - if readOnlyEnabled, ok := readOnly["enabled"]; ok { - app.readOnly, ok = readOnlyEnabled.(bool) - if !ok { - panic("readonly's enabled config key must have a boolean value") - } - } - } - } - - startUploadPurger(app, app.driver, ctxu.GetLogger(app), purgeConfig) - - app.driver, err = applyStorageMiddleware(app.driver, config.Middleware["storage"]) - if err != nil { - panic(err) - } - - app.configureSecret(config) - app.configureEvents(config) - app.configureRedis(config) - app.configureLogHook(config) - - options := registrymiddleware.GetRegistryOptions() - if config.Compatibility.Schema1.TrustKey != "" { - app.trustKey, err = libtrust.LoadKeyFile(config.Compatibility.Schema1.TrustKey) - if err != nil { - panic(fmt.Sprintf(`could not load schema1 "signingkey" parameter: %v`, err)) - } - } else { - // Generate an ephemeral key to be used for signing converted manifests - // for clients that don't support schema2. - app.trustKey, err = libtrust.GenerateECP256PrivateKey() - if err != nil { - panic(err) - } - } - - options = append(options, storage.Schema1SigningKey(app.trustKey)) - - if config.HTTP.Host != "" { - u, err := url.Parse(config.HTTP.Host) - if err != nil { - panic(fmt.Sprintf(`could not parse http "host" parameter: %v`, err)) - } - app.httpHost = *u - } - - if app.isCache { - options = append(options, storage.DisableDigestResumption) - } - - // configure deletion - if d, ok := config.Storage["delete"]; ok { - e, ok := d["enabled"] - if ok { - if deleteEnabled, ok := e.(bool); ok && deleteEnabled { - options = append(options, storage.EnableDelete) - } - } - } - - // configure redirects - var redirectDisabled bool - if redirectConfig, ok := config.Storage["redirect"]; ok { - v := redirectConfig["disable"] - switch v := v.(type) { - case bool: - redirectDisabled = v - default: - panic(fmt.Sprintf("invalid type for redirect config: %#v", redirectConfig)) - } - } - if redirectDisabled { - ctxu.GetLogger(app).Infof("backend redirection disabled") - } else { - options = append(options, storage.EnableRedirect) - } - - // configure validation - if config.Validation.Enabled { - if len(config.Validation.Manifests.URLs.Allow) == 0 && len(config.Validation.Manifests.URLs.Deny) == 0 { - // If Allow and Deny are empty, allow nothing. - options = append(options, storage.ManifestURLsAllowRegexp(regexp.MustCompile("^$"))) - } else { - if len(config.Validation.Manifests.URLs.Allow) > 0 { - for i, s := range config.Validation.Manifests.URLs.Allow { - // Validate via compilation. - if _, err := regexp.Compile(s); err != nil { - panic(fmt.Sprintf("validation.manifests.urls.allow: %s", err)) - } - // Wrap with non-capturing group. - config.Validation.Manifests.URLs.Allow[i] = fmt.Sprintf("(?:%s)", s) - } - re := regexp.MustCompile(strings.Join(config.Validation.Manifests.URLs.Allow, "|")) - options = append(options, storage.ManifestURLsAllowRegexp(re)) - } - if len(config.Validation.Manifests.URLs.Deny) > 0 { - for i, s := range config.Validation.Manifests.URLs.Deny { - // Validate via compilation. - if _, err := regexp.Compile(s); err != nil { - panic(fmt.Sprintf("validation.manifests.urls.deny: %s", err)) - } - // Wrap with non-capturing group. - config.Validation.Manifests.URLs.Deny[i] = fmt.Sprintf("(?:%s)", s) - } - re := regexp.MustCompile(strings.Join(config.Validation.Manifests.URLs.Deny, "|")) - options = append(options, storage.ManifestURLsDenyRegexp(re)) - } - } - } - - // configure storage caches - if cc, ok := config.Storage["cache"]; ok { - v, ok := cc["blobdescriptor"] - if !ok { - // Backwards compatible: "layerinfo" == "blobdescriptor" - v = cc["layerinfo"] - } - - switch v { - case "redis": - if app.redis == nil { - panic("redis configuration required to use for layerinfo cache") - } - cacheProvider := rediscache.NewRedisBlobDescriptorCacheProvider(app.redis) - localOptions := append(options, storage.BlobDescriptorCacheProvider(cacheProvider)) - app.registry, err = storage.NewRegistry(app, app.driver, localOptions...) - if err != nil { - panic("could not create registry: " + err.Error()) - } - ctxu.GetLogger(app).Infof("using redis blob descriptor cache") - case "inmemory": - cacheProvider := memorycache.NewInMemoryBlobDescriptorCacheProvider() - localOptions := append(options, storage.BlobDescriptorCacheProvider(cacheProvider)) - app.registry, err = storage.NewRegistry(app, app.driver, localOptions...) - if err != nil { - panic("could not create registry: " + err.Error()) - } - ctxu.GetLogger(app).Infof("using inmemory blob descriptor cache") - default: - if v != "" { - ctxu.GetLogger(app).Warnf("unknown cache type %q, caching disabled", config.Storage["cache"]) - } - } - } - - if app.registry == nil { - // configure the registry if no cache section is available. - app.registry, err = storage.NewRegistry(app.Context, app.driver, options...) - if err != nil { - panic("could not create registry: " + err.Error()) - } - } - - app.registry, err = applyRegistryMiddleware(app, app.registry, config.Middleware["registry"]) - if err != nil { - panic(err) - } - - authType := config.Auth.Type() - - if authType != "" { - accessController, err := auth.GetAccessController(config.Auth.Type(), config.Auth.Parameters()) - if err != nil { - panic(fmt.Sprintf("unable to configure authorization (%s): %v", authType, err)) - } - app.accessController = accessController - ctxu.GetLogger(app).Debugf("configured %q access controller", authType) - } - - // configure as a pull through cache - if config.Proxy.RemoteURL != "" { - app.registry, err = proxy.NewRegistryPullThroughCache(ctx, app.registry, app.driver, config.Proxy) - if err != nil { - panic(err.Error()) - } - app.isCache = true - ctxu.GetLogger(app).Info("Registry configured as a proxy cache to ", config.Proxy.RemoteURL) - } - - return app -} - -// RegisterHealthChecks is an awful hack to defer health check registration -// control to callers. This should only ever be called once per registry -// process, typically in a main function. The correct way would be register -// health checks outside of app, since multiple apps may exist in the same -// process. Because the configuration and app are tightly coupled, -// implementing this properly will require a refactor. This method may panic -// if called twice in the same process. -func (app *App) RegisterHealthChecks(healthRegistries ...*health.Registry) { - if len(healthRegistries) > 1 { - panic("RegisterHealthChecks called with more than one registry") - } - healthRegistry := health.DefaultRegistry - if len(healthRegistries) == 1 { - healthRegistry = healthRegistries[0] - } - - if app.Config.Health.StorageDriver.Enabled { - interval := app.Config.Health.StorageDriver.Interval - if interval == 0 { - interval = defaultCheckInterval - } - - storageDriverCheck := func() error { - _, err := app.driver.Stat(app, "/") // "/" should always exist - return err // any error will be treated as failure - } - - if app.Config.Health.StorageDriver.Threshold != 0 { - healthRegistry.RegisterPeriodicThresholdFunc("storagedriver_"+app.Config.Storage.Type(), interval, app.Config.Health.StorageDriver.Threshold, storageDriverCheck) - } else { - healthRegistry.RegisterPeriodicFunc("storagedriver_"+app.Config.Storage.Type(), interval, storageDriverCheck) - } - } - - for _, fileChecker := range app.Config.Health.FileCheckers { - interval := fileChecker.Interval - if interval == 0 { - interval = defaultCheckInterval - } - ctxu.GetLogger(app).Infof("configuring file health check path=%s, interval=%d", fileChecker.File, interval/time.Second) - healthRegistry.Register(fileChecker.File, health.PeriodicChecker(checks.FileChecker(fileChecker.File), interval)) - } - - for _, httpChecker := range app.Config.Health.HTTPCheckers { - interval := httpChecker.Interval - if interval == 0 { - interval = defaultCheckInterval - } - - statusCode := httpChecker.StatusCode - if statusCode == 0 { - statusCode = 200 - } - - checker := checks.HTTPChecker(httpChecker.URI, statusCode, httpChecker.Timeout, httpChecker.Headers) - - if httpChecker.Threshold != 0 { - ctxu.GetLogger(app).Infof("configuring HTTP health check uri=%s, interval=%d, threshold=%d", httpChecker.URI, interval/time.Second, httpChecker.Threshold) - healthRegistry.Register(httpChecker.URI, health.PeriodicThresholdChecker(checker, interval, httpChecker.Threshold)) - } else { - ctxu.GetLogger(app).Infof("configuring HTTP health check uri=%s, interval=%d", httpChecker.URI, interval/time.Second) - healthRegistry.Register(httpChecker.URI, health.PeriodicChecker(checker, interval)) - } - } - - for _, tcpChecker := range app.Config.Health.TCPCheckers { - interval := tcpChecker.Interval - if interval == 0 { - interval = defaultCheckInterval - } - - checker := checks.TCPChecker(tcpChecker.Addr, tcpChecker.Timeout) - - if tcpChecker.Threshold != 0 { - ctxu.GetLogger(app).Infof("configuring TCP health check addr=%s, interval=%d, threshold=%d", tcpChecker.Addr, interval/time.Second, tcpChecker.Threshold) - healthRegistry.Register(tcpChecker.Addr, health.PeriodicThresholdChecker(checker, interval, tcpChecker.Threshold)) - } else { - ctxu.GetLogger(app).Infof("configuring TCP health check addr=%s, interval=%d", tcpChecker.Addr, interval/time.Second) - healthRegistry.Register(tcpChecker.Addr, health.PeriodicChecker(checker, interval)) - } - } -} - -// register a handler with the application, by route name. The handler will be -// passed through the application filters and context will be constructed at -// request time. -func (app *App) register(routeName string, dispatch dispatchFunc) { - - // TODO(stevvooe): This odd dispatcher/route registration is by-product of - // some limitations in the gorilla/mux router. We are using it to keep - // routing consistent between the client and server, but we may want to - // replace it with manual routing and structure-based dispatch for better - // control over the request execution. - - app.router.GetRoute(routeName).Handler(app.dispatcher(dispatch)) -} - -// configureEvents prepares the event sink for action. -func (app *App) configureEvents(configuration *configuration.Configuration) { - // Configure all of the endpoint sinks. - var sinks []notifications.Sink - for _, endpoint := range configuration.Notifications.Endpoints { - if endpoint.Disabled { - ctxu.GetLogger(app).Infof("endpoint %s disabled, skipping", endpoint.Name) - continue - } - - ctxu.GetLogger(app).Infof("configuring endpoint %v (%v), timeout=%s, headers=%v", endpoint.Name, endpoint.URL, endpoint.Timeout, endpoint.Headers) - endpoint := notifications.NewEndpoint(endpoint.Name, endpoint.URL, notifications.EndpointConfig{ - Timeout: endpoint.Timeout, - Threshold: endpoint.Threshold, - Backoff: endpoint.Backoff, - Headers: endpoint.Headers, - IgnoredMediaTypes: endpoint.IgnoredMediaTypes, - }) - - sinks = append(sinks, endpoint) - } - - // NOTE(stevvooe): Moving to a new queuing implementation is as easy as - // replacing broadcaster with a rabbitmq implementation. It's recommended - // that the registry instances also act as the workers to keep deployment - // simple. - app.events.sink = notifications.NewBroadcaster(sinks...) - - // Populate registry event source - hostname, err := os.Hostname() - if err != nil { - hostname = configuration.HTTP.Addr - } else { - // try to pick the port off the config - _, port, err := net.SplitHostPort(configuration.HTTP.Addr) - if err == nil { - hostname = net.JoinHostPort(hostname, port) - } - } - - app.events.source = notifications.SourceRecord{ - Addr: hostname, - InstanceID: ctxu.GetStringValue(app, "instance.id"), - } -} - -type redisStartAtKey struct{} - -func (app *App) configureRedis(configuration *configuration.Configuration) { - if configuration.Redis.Addr == "" { - ctxu.GetLogger(app).Infof("redis not configured") - return - } - - pool := &redis.Pool{ - Dial: func() (redis.Conn, error) { - // TODO(stevvooe): Yet another use case for contextual timing. - ctx := context.WithValue(app, redisStartAtKey{}, time.Now()) - - done := func(err error) { - logger := ctxu.GetLoggerWithField(ctx, "redis.connect.duration", - ctxu.Since(ctx, redisStartAtKey{})) - if err != nil { - logger.Errorf("redis: error connecting: %v", err) - } else { - logger.Infof("redis: connect %v", configuration.Redis.Addr) - } - } - - conn, err := redis.DialTimeout("tcp", - configuration.Redis.Addr, - configuration.Redis.DialTimeout, - configuration.Redis.ReadTimeout, - configuration.Redis.WriteTimeout) - if err != nil { - ctxu.GetLogger(app).Errorf("error connecting to redis instance %s: %v", - configuration.Redis.Addr, err) - done(err) - return nil, err - } - - // authorize the connection - if configuration.Redis.Password != "" { - if _, err = conn.Do("AUTH", configuration.Redis.Password); err != nil { - defer conn.Close() - done(err) - return nil, err - } - } - - // select the database to use - if configuration.Redis.DB != 0 { - if _, err = conn.Do("SELECT", configuration.Redis.DB); err != nil { - defer conn.Close() - done(err) - return nil, err - } - } - - done(nil) - return conn, nil - }, - MaxIdle: configuration.Redis.Pool.MaxIdle, - MaxActive: configuration.Redis.Pool.MaxActive, - IdleTimeout: configuration.Redis.Pool.IdleTimeout, - TestOnBorrow: func(c redis.Conn, t time.Time) error { - // TODO(stevvooe): We can probably do something more interesting - // here with the health package. - _, err := c.Do("PING") - return err - }, - Wait: false, // if a connection is not avialable, proceed without cache. - } - - app.redis = pool - - // setup expvar - registry := expvar.Get("registry") - if registry == nil { - registry = expvar.NewMap("registry") - } - - registry.(*expvar.Map).Set("redis", expvar.Func(func() interface{} { - return map[string]interface{}{ - "Config": configuration.Redis, - "Active": app.redis.ActiveCount(), - } - })) -} - -// configureLogHook prepares logging hook parameters. -func (app *App) configureLogHook(configuration *configuration.Configuration) { - entry, ok := ctxu.GetLogger(app).(*log.Entry) - if !ok { - // somehow, we are not using logrus - return - } - - logger := entry.Logger - - for _, configHook := range configuration.Log.Hooks { - if !configHook.Disabled { - switch configHook.Type { - case "mail": - hook := &logHook{} - hook.LevelsParam = configHook.Levels - hook.Mail = &mailer{ - Addr: configHook.MailOptions.SMTP.Addr, - Username: configHook.MailOptions.SMTP.Username, - Password: configHook.MailOptions.SMTP.Password, - Insecure: configHook.MailOptions.SMTP.Insecure, - From: configHook.MailOptions.From, - To: configHook.MailOptions.To, - } - logger.Hooks.Add(hook) - default: - } - } - } -} - -// configureSecret creates a random secret if a secret wasn't included in the -// configuration. -func (app *App) configureSecret(configuration *configuration.Configuration) { - if configuration.HTTP.Secret == "" { - var secretBytes [randomSecretSize]byte - if _, err := cryptorand.Read(secretBytes[:]); err != nil { - panic(fmt.Sprintf("could not generate random bytes for HTTP secret: %v", err)) - } - configuration.HTTP.Secret = string(secretBytes[:]) - ctxu.GetLogger(app).Warn("No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable.") - } -} - -func (app *App) ServeHTTP(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() // ensure that request body is always closed. - - // Instantiate an http context here so we can track the error codes - // returned by the request router. - ctx := defaultContextManager.context(app, w, r) - - defer func() { - status, ok := ctx.Value("http.response.status").(int) - if ok && status >= 200 && status <= 399 { - ctxu.GetResponseLogger(ctx).Infof("response completed") - } - }() - defer defaultContextManager.release(ctx) - - // NOTE(stevvooe): Total hack to get instrumented responsewriter from context. - var err error - w, err = ctxu.GetResponseWriter(ctx) - if err != nil { - ctxu.GetLogger(ctx).Warnf("response writer not found in context") - } - - // Set a header with the Docker Distribution API Version for all responses. - w.Header().Add("Docker-Distribution-API-Version", "registry/2.0") - app.router.ServeHTTP(w, r) -} - -// dispatchFunc takes a context and request and returns a constructed handler -// for the route. The dispatcher will use this to dynamically create request -// specific handlers for each endpoint without creating a new router for each -// request. -type dispatchFunc func(ctx *Context, r *http.Request) http.Handler - -// TODO(stevvooe): dispatchers should probably have some validation error -// chain with proper error reporting. - -// dispatcher returns a handler that constructs a request specific context and -// handler, using the dispatch factory function. -func (app *App) dispatcher(dispatch dispatchFunc) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - for headerName, headerValues := range app.Config.HTTP.Headers { - for _, value := range headerValues { - w.Header().Add(headerName, value) - } - } - - context := app.context(w, r) - - if err := app.authorized(w, r, context); err != nil { - ctxu.GetLogger(context).Warnf("error authorizing context: %v", err) - return - } - - // Add username to request logging - context.Context = ctxu.WithLogger(context.Context, ctxu.GetLogger(context.Context, auth.UserNameKey)) - - if app.nameRequired(r) { - nameRef, err := reference.ParseNamed(getName(context)) - if err != nil { - ctxu.GetLogger(context).Errorf("error parsing reference from context: %v", err) - context.Errors = append(context.Errors, distribution.ErrRepositoryNameInvalid{ - Name: getName(context), - Reason: err, - }) - if err := errcode.ServeJSON(w, context.Errors); err != nil { - ctxu.GetLogger(context).Errorf("error serving error json: %v (from %v)", err, context.Errors) - } - return - } - repository, err := app.registry.Repository(context, nameRef) - - if err != nil { - ctxu.GetLogger(context).Errorf("error resolving repository: %v", err) - - switch err := err.(type) { - case distribution.ErrRepositoryUnknown: - context.Errors = append(context.Errors, v2.ErrorCodeNameUnknown.WithDetail(err)) - case distribution.ErrRepositoryNameInvalid: - context.Errors = append(context.Errors, v2.ErrorCodeNameInvalid.WithDetail(err)) - case errcode.Error: - context.Errors = append(context.Errors, err) - } - - if err := errcode.ServeJSON(w, context.Errors); err != nil { - ctxu.GetLogger(context).Errorf("error serving error json: %v (from %v)", err, context.Errors) - } - return - } - - // assign and decorate the authorized repository with an event bridge. - context.Repository = notifications.Listen( - repository, - app.eventBridge(context, r)) - - context.Repository, err = applyRepoMiddleware(app, context.Repository, app.Config.Middleware["repository"]) - if err != nil { - ctxu.GetLogger(context).Errorf("error initializing repository middleware: %v", err) - context.Errors = append(context.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - - if err := errcode.ServeJSON(w, context.Errors); err != nil { - ctxu.GetLogger(context).Errorf("error serving error json: %v (from %v)", err, context.Errors) - } - return - } - } - - dispatch(context, r).ServeHTTP(w, r) - // Automated error response handling here. Handlers may return their - // own errors if they need different behavior (such as range errors - // for layer upload). - if context.Errors.Len() > 0 { - if err := errcode.ServeJSON(w, context.Errors); err != nil { - ctxu.GetLogger(context).Errorf("error serving error json: %v (from %v)", err, context.Errors) - } - - app.logError(context, context.Errors) - } - }) -} - -type errCodeKey struct{} - -func (errCodeKey) String() string { return "err.code" } - -type errMessageKey struct{} - -func (errMessageKey) String() string { return "err.message" } - -type errDetailKey struct{} - -func (errDetailKey) String() string { return "err.detail" } - -func (app *App) logError(context context.Context, errors errcode.Errors) { - for _, e1 := range errors { - var c ctxu.Context - - switch e1.(type) { - case errcode.Error: - e, _ := e1.(errcode.Error) - c = ctxu.WithValue(context, errCodeKey{}, e.Code) - c = ctxu.WithValue(c, errMessageKey{}, e.Code.Message()) - c = ctxu.WithValue(c, errDetailKey{}, e.Detail) - case errcode.ErrorCode: - e, _ := e1.(errcode.ErrorCode) - c = ctxu.WithValue(context, errCodeKey{}, e) - c = ctxu.WithValue(c, errMessageKey{}, e.Message()) - default: - // just normal go 'error' - c = ctxu.WithValue(context, errCodeKey{}, errcode.ErrorCodeUnknown) - c = ctxu.WithValue(c, errMessageKey{}, e1.Error()) - } - - c = ctxu.WithLogger(c, ctxu.GetLogger(c, - errCodeKey{}, - errMessageKey{}, - errDetailKey{})) - ctxu.GetResponseLogger(c).Errorf("response completed with error") - } -} - -// context constructs the context object for the application. This only be -// called once per request. -func (app *App) context(w http.ResponseWriter, r *http.Request) *Context { - ctx := defaultContextManager.context(app, w, r) - ctx = ctxu.WithVars(ctx, r) - ctx = ctxu.WithLogger(ctx, ctxu.GetLogger(ctx, - "vars.name", - "vars.reference", - "vars.digest", - "vars.uuid")) - - context := &Context{ - App: app, - Context: ctx, - } - - if app.httpHost.Scheme != "" && app.httpHost.Host != "" { - // A "host" item in the configuration takes precedence over - // X-Forwarded-Proto and X-Forwarded-Host headers, and the - // hostname in the request. - context.urlBuilder = v2.NewURLBuilder(&app.httpHost, false) - } else { - context.urlBuilder = v2.NewURLBuilderFromRequest(r, app.Config.HTTP.RelativeURLs) - } - - return context -} - -// authorized checks if the request can proceed with access to the requested -// repository. If it succeeds, the context may access the requested -// repository. An error will be returned if access is not available. -func (app *App) authorized(w http.ResponseWriter, r *http.Request, context *Context) error { - ctxu.GetLogger(context).Debug("authorizing request") - repo := getName(context) - - if app.accessController == nil { - return nil // access controller is not enabled. - } - - var accessRecords []auth.Access - - if repo != "" { - accessRecords = appendAccessRecords(accessRecords, r.Method, repo) - if fromRepo := r.FormValue("from"); fromRepo != "" { - // mounting a blob from one repository to another requires pull (GET) - // access to the source repository. - accessRecords = appendAccessRecords(accessRecords, "GET", fromRepo) - } - } else { - // Only allow the name not to be set on the base route. - if app.nameRequired(r) { - // For this to be properly secured, repo must always be set for a - // resource that may make a modification. The only condition under - // which name is not set and we still allow access is when the - // base route is accessed. This section prevents us from making - // that mistake elsewhere in the code, allowing any operation to - // proceed. - if err := errcode.ServeJSON(w, errcode.ErrorCodeUnauthorized); err != nil { - ctxu.GetLogger(context).Errorf("error serving error json: %v (from %v)", err, context.Errors) - } - return fmt.Errorf("forbidden: no repository name") - } - accessRecords = appendCatalogAccessRecord(accessRecords, r) - } - - ctx, err := app.accessController.Authorized(context.Context, accessRecords...) - if err != nil { - switch err := err.(type) { - case auth.Challenge: - // Add the appropriate WWW-Auth header - err.SetHeaders(w) - - if err := errcode.ServeJSON(w, errcode.ErrorCodeUnauthorized.WithDetail(accessRecords)); err != nil { - ctxu.GetLogger(context).Errorf("error serving error json: %v (from %v)", err, context.Errors) - } - default: - // This condition is a potential security problem either in - // the configuration or whatever is backing the access - // controller. Just return a bad request with no information - // to avoid exposure. The request should not proceed. - ctxu.GetLogger(context).Errorf("error checking authorization: %v", err) - w.WriteHeader(http.StatusBadRequest) - } - - return err - } - - // TODO(stevvooe): This pattern needs to be cleaned up a bit. One context - // should be replaced by another, rather than replacing the context on a - // mutable object. - context.Context = ctx - return nil -} - -// eventBridge returns a bridge for the current request, configured with the -// correct actor and source. -func (app *App) eventBridge(ctx *Context, r *http.Request) notifications.Listener { - actor := notifications.ActorRecord{ - Name: getUserName(ctx, r), - } - request := notifications.NewRequestRecord(ctxu.GetRequestID(ctx), r) - - return notifications.NewBridge(ctx.urlBuilder, app.events.source, actor, request, app.events.sink) -} - -// nameRequired returns true if the route requires a name. -func (app *App) nameRequired(r *http.Request) bool { - route := mux.CurrentRoute(r) - routeName := route.GetName() - return route == nil || (routeName != v2.RouteNameBase && routeName != v2.RouteNameCatalog) -} - -// apiBase implements a simple yes-man for doing overall checks against the -// api. This can support auth roundtrips to support docker login. -func apiBase(w http.ResponseWriter, r *http.Request) { - const emptyJSON = "{}" - // Provide a simple /v2/ 200 OK response with empty json response. - w.Header().Set("Content-Type", "application/json; charset=utf-8") - w.Header().Set("Content-Length", fmt.Sprint(len(emptyJSON))) - - fmt.Fprint(w, emptyJSON) -} - -// appendAccessRecords checks the method and adds the appropriate Access records to the records list. -func appendAccessRecords(records []auth.Access, method string, repo string) []auth.Access { - resource := auth.Resource{ - Type: "repository", - Name: repo, - } - - switch method { - case "GET", "HEAD": - records = append(records, - auth.Access{ - Resource: resource, - Action: "pull", - }) - case "POST", "PUT", "PATCH": - records = append(records, - auth.Access{ - Resource: resource, - Action: "pull", - }, - auth.Access{ - Resource: resource, - Action: "push", - }) - case "DELETE": - // DELETE access requires full admin rights, which is represented - // as "*". This may not be ideal. - records = append(records, - auth.Access{ - Resource: resource, - Action: "*", - }) - } - return records -} - -// Add the access record for the catalog if it's our current route -func appendCatalogAccessRecord(accessRecords []auth.Access, r *http.Request) []auth.Access { - route := mux.CurrentRoute(r) - routeName := route.GetName() - - if routeName == v2.RouteNameCatalog { - resource := auth.Resource{ - Type: "registry", - Name: "catalog", - } - - accessRecords = append(accessRecords, - auth.Access{ - Resource: resource, - Action: "*", - }) - } - return accessRecords -} - -// applyRegistryMiddleware wraps a registry instance with the configured middlewares -func applyRegistryMiddleware(ctx context.Context, registry distribution.Namespace, middlewares []configuration.Middleware) (distribution.Namespace, error) { - for _, mw := range middlewares { - rmw, err := registrymiddleware.Get(ctx, mw.Name, mw.Options, registry) - if err != nil { - return nil, fmt.Errorf("unable to configure registry middleware (%s): %s", mw.Name, err) - } - registry = rmw - } - return registry, nil - -} - -// applyRepoMiddleware wraps a repository with the configured middlewares -func applyRepoMiddleware(ctx context.Context, repository distribution.Repository, middlewares []configuration.Middleware) (distribution.Repository, error) { - for _, mw := range middlewares { - rmw, err := repositorymiddleware.Get(ctx, mw.Name, mw.Options, repository) - if err != nil { - return nil, err - } - repository = rmw - } - return repository, nil -} - -// applyStorageMiddleware wraps a storage driver with the configured middlewares -func applyStorageMiddleware(driver storagedriver.StorageDriver, middlewares []configuration.Middleware) (storagedriver.StorageDriver, error) { - for _, mw := range middlewares { - smw, err := storagemiddleware.Get(mw.Name, mw.Options, driver) - if err != nil { - return nil, fmt.Errorf("unable to configure storage middleware (%s): %v", mw.Name, err) - } - driver = smw - } - return driver, nil -} - -// uploadPurgeDefaultConfig provides a default configuration for upload -// purging to be used in the absence of configuration in the -// confifuration file -func uploadPurgeDefaultConfig() map[interface{}]interface{} { - config := map[interface{}]interface{}{} - config["enabled"] = true - config["age"] = "168h" - config["interval"] = "24h" - config["dryrun"] = false - return config -} - -func badPurgeUploadConfig(reason string) { - panic(fmt.Sprintf("Unable to parse upload purge configuration: %s", reason)) -} - -// startUploadPurger schedules a goroutine which will periodically -// check upload directories for old files and delete them -func startUploadPurger(ctx context.Context, storageDriver storagedriver.StorageDriver, log ctxu.Logger, config map[interface{}]interface{}) { - if config["enabled"] == false { - return - } - - var purgeAgeDuration time.Duration - var err error - purgeAge, ok := config["age"] - if ok { - ageStr, ok := purgeAge.(string) - if !ok { - badPurgeUploadConfig("age is not a string") - } - purgeAgeDuration, err = time.ParseDuration(ageStr) - if err != nil { - badPurgeUploadConfig(fmt.Sprintf("Cannot parse duration: %s", err.Error())) - } - } else { - badPurgeUploadConfig("age missing") - } - - var intervalDuration time.Duration - interval, ok := config["interval"] - if ok { - intervalStr, ok := interval.(string) - if !ok { - badPurgeUploadConfig("interval is not a string") - } - - intervalDuration, err = time.ParseDuration(intervalStr) - if err != nil { - badPurgeUploadConfig(fmt.Sprintf("Cannot parse interval: %s", err.Error())) - } - } else { - badPurgeUploadConfig("interval missing") - } - - var dryRunBool bool - dryRun, ok := config["dryrun"] - if ok { - dryRunBool, ok = dryRun.(bool) - if !ok { - badPurgeUploadConfig("cannot parse dryrun") - } - } else { - badPurgeUploadConfig("dryrun missing") - } - - go func() { - rand.Seed(time.Now().Unix()) - jitter := time.Duration(rand.Int()%60) * time.Minute - log.Infof("Starting upload purge in %s", jitter) - time.Sleep(jitter) - - for { - storage.PurgeUploads(ctx, storageDriver, time.Now().Add(-purgeAgeDuration), !dryRunBool) - log.Infof("Starting upload purge in %s", intervalDuration) - time.Sleep(intervalDuration) - } - }() -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/app_test.go b/vendor/github.com/docker/distribution/registry/handlers/app_test.go deleted file mode 100644 index 385fa4c6b..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/app_test.go +++ /dev/null @@ -1,279 +0,0 @@ -package handlers - -import ( - "encoding/json" - "net/http" - "net/http/httptest" - "net/url" - "reflect" - "testing" - - "github.com/docker/distribution/configuration" - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" - "github.com/docker/distribution/registry/auth" - _ "github.com/docker/distribution/registry/auth/silly" - "github.com/docker/distribution/registry/storage" - memorycache "github.com/docker/distribution/registry/storage/cache/memory" - "github.com/docker/distribution/registry/storage/driver/testdriver" -) - -// TestAppDispatcher builds an application with a test dispatcher and ensures -// that requests are properly dispatched and the handlers are constructed. -// This only tests the dispatch mechanism. The underlying dispatchers must be -// tested individually. -func TestAppDispatcher(t *testing.T) { - driver := testdriver.New() - ctx := context.Background() - registry, err := storage.NewRegistry(ctx, driver, storage.BlobDescriptorCacheProvider(memorycache.NewInMemoryBlobDescriptorCacheProvider()), storage.EnableDelete, storage.EnableRedirect) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - app := &App{ - Config: &configuration.Configuration{}, - Context: ctx, - router: v2.Router(), - driver: driver, - registry: registry, - } - server := httptest.NewServer(app) - defer server.Close() - router := v2.Router() - - serverURL, err := url.Parse(server.URL) - if err != nil { - t.Fatalf("error parsing server url: %v", err) - } - - varCheckingDispatcher := func(expectedVars map[string]string) dispatchFunc { - return func(ctx *Context, r *http.Request) http.Handler { - // Always checks the same name context - if ctx.Repository.Named().Name() != getName(ctx) { - t.Fatalf("unexpected name: %q != %q", ctx.Repository.Named().Name(), "foo/bar") - } - - // Check that we have all that is expected - for expectedK, expectedV := range expectedVars { - if ctx.Value(expectedK) != expectedV { - t.Fatalf("unexpected %s in context vars: %q != %q", expectedK, ctx.Value(expectedK), expectedV) - } - } - - // Check that we only have variables that are expected - for k, v := range ctx.Value("vars").(map[string]string) { - _, ok := expectedVars[k] - - if !ok { // name is checked on context - // We have an unexpected key, fail - t.Fatalf("unexpected key %q in vars with value %q", k, v) - } - } - - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - }) - } - } - - // unflatten a list of variables, suitable for gorilla/mux, to a map[string]string - unflatten := func(vars []string) map[string]string { - m := make(map[string]string) - for i := 0; i < len(vars)-1; i = i + 2 { - m[vars[i]] = vars[i+1] - } - - return m - } - - for _, testcase := range []struct { - endpoint string - vars []string - }{ - { - endpoint: v2.RouteNameManifest, - vars: []string{ - "name", "foo/bar", - "reference", "sometag", - }, - }, - { - endpoint: v2.RouteNameTags, - vars: []string{ - "name", "foo/bar", - }, - }, - { - endpoint: v2.RouteNameBlobUpload, - vars: []string{ - "name", "foo/bar", - }, - }, - { - endpoint: v2.RouteNameBlobUploadChunk, - vars: []string{ - "name", "foo/bar", - "uuid", "theuuid", - }, - }, - } { - app.register(testcase.endpoint, varCheckingDispatcher(unflatten(testcase.vars))) - route := router.GetRoute(testcase.endpoint).Host(serverURL.Host) - u, err := route.URL(testcase.vars...) - - if err != nil { - t.Fatal(err) - } - - resp, err := http.Get(u.String()) - - if err != nil { - t.Fatal(err) - } - - if resp.StatusCode != http.StatusOK { - t.Fatalf("unexpected status code: %v != %v", resp.StatusCode, http.StatusOK) - } - } -} - -// TestNewApp covers the creation of an application via NewApp with a -// configuration. -func TestNewApp(t *testing.T) { - ctx := context.Background() - config := configuration.Configuration{ - Storage: configuration.Storage{ - "testdriver": nil, - "maintenance": configuration.Parameters{"uploadpurging": map[interface{}]interface{}{ - "enabled": false, - }}, - }, - Auth: configuration.Auth{ - // For now, we simply test that new auth results in a viable - // application. - "silly": { - "realm": "realm-test", - "service": "service-test", - }, - }, - } - - // Mostly, with this test, given a sane configuration, we are simply - // ensuring that NewApp doesn't panic. We might want to tweak this - // behavior. - app := NewApp(ctx, &config) - - server := httptest.NewServer(app) - defer server.Close() - builder, err := v2.NewURLBuilderFromString(server.URL, false) - if err != nil { - t.Fatalf("error creating urlbuilder: %v", err) - } - - baseURL, err := builder.BuildBaseURL() - if err != nil { - t.Fatalf("error creating baseURL: %v", err) - } - - // TODO(stevvooe): The rest of this test might belong in the API tests. - - // Just hit the app and make sure we get a 401 Unauthorized error. - req, err := http.Get(baseURL) - if err != nil { - t.Fatalf("unexpected error during GET: %v", err) - } - defer req.Body.Close() - - if req.StatusCode != http.StatusUnauthorized { - t.Fatalf("unexpected status code during request: %v", err) - } - - if req.Header.Get("Content-Type") != "application/json; charset=utf-8" { - t.Fatalf("unexpected content-type: %v != %v", req.Header.Get("Content-Type"), "application/json; charset=utf-8") - } - - expectedAuthHeader := "Bearer realm=\"realm-test\",service=\"service-test\"" - if e, a := expectedAuthHeader, req.Header.Get("WWW-Authenticate"); e != a { - t.Fatalf("unexpected WWW-Authenticate header: %q != %q", e, a) - } - - var errs errcode.Errors - dec := json.NewDecoder(req.Body) - if err := dec.Decode(&errs); err != nil { - t.Fatalf("error decoding error response: %v", err) - } - - err2, ok := errs[0].(errcode.ErrorCoder) - if !ok { - t.Fatalf("not an ErrorCoder: %#v", errs[0]) - } - if err2.ErrorCode() != errcode.ErrorCodeUnauthorized { - t.Fatalf("unexpected error code: %v != %v", err2.ErrorCode(), errcode.ErrorCodeUnauthorized) - } -} - -// Test the access record accumulator -func TestAppendAccessRecords(t *testing.T) { - repo := "testRepo" - - expectedResource := auth.Resource{ - Type: "repository", - Name: repo, - } - - expectedPullRecord := auth.Access{ - Resource: expectedResource, - Action: "pull", - } - expectedPushRecord := auth.Access{ - Resource: expectedResource, - Action: "push", - } - expectedAllRecord := auth.Access{ - Resource: expectedResource, - Action: "*", - } - - records := []auth.Access{} - result := appendAccessRecords(records, "GET", repo) - expectedResult := []auth.Access{expectedPullRecord} - if ok := reflect.DeepEqual(result, expectedResult); !ok { - t.Fatalf("Actual access record differs from expected") - } - - records = []auth.Access{} - result = appendAccessRecords(records, "HEAD", repo) - expectedResult = []auth.Access{expectedPullRecord} - if ok := reflect.DeepEqual(result, expectedResult); !ok { - t.Fatalf("Actual access record differs from expected") - } - - records = []auth.Access{} - result = appendAccessRecords(records, "POST", repo) - expectedResult = []auth.Access{expectedPullRecord, expectedPushRecord} - if ok := reflect.DeepEqual(result, expectedResult); !ok { - t.Fatalf("Actual access record differs from expected") - } - - records = []auth.Access{} - result = appendAccessRecords(records, "PUT", repo) - expectedResult = []auth.Access{expectedPullRecord, expectedPushRecord} - if ok := reflect.DeepEqual(result, expectedResult); !ok { - t.Fatalf("Actual access record differs from expected") - } - - records = []auth.Access{} - result = appendAccessRecords(records, "PATCH", repo) - expectedResult = []auth.Access{expectedPullRecord, expectedPushRecord} - if ok := reflect.DeepEqual(result, expectedResult); !ok { - t.Fatalf("Actual access record differs from expected") - } - - records = []auth.Access{} - result = appendAccessRecords(records, "DELETE", repo) - expectedResult = []auth.Access{expectedAllRecord} - if ok := reflect.DeepEqual(result, expectedResult); !ok { - t.Fatalf("Actual access record differs from expected") - } - -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/basicauth.go b/vendor/github.com/docker/distribution/registry/handlers/basicauth.go deleted file mode 100644 index 8727a3cd1..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/basicauth.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build go1.4 - -package handlers - -import ( - "net/http" -) - -func basicAuth(r *http.Request) (username, password string, ok bool) { - return r.BasicAuth() -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/basicauth_prego14.go b/vendor/github.com/docker/distribution/registry/handlers/basicauth_prego14.go deleted file mode 100644 index 6cf10a25e..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/basicauth_prego14.go +++ /dev/null @@ -1,41 +0,0 @@ -// +build !go1.4 - -package handlers - -import ( - "encoding/base64" - "net/http" - "strings" -) - -// NOTE(stevvooe): This is basic auth support from go1.4 present to ensure we -// can compile on go1.3 and earlier. - -// BasicAuth returns the username and password provided in the request's -// Authorization header, if the request uses HTTP Basic Authentication. -// See RFC 2617, Section 2. -func basicAuth(r *http.Request) (username, password string, ok bool) { - auth := r.Header.Get("Authorization") - if auth == "" { - return - } - return parseBasicAuth(auth) -} - -// parseBasicAuth parses an HTTP Basic Authentication string. -// "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" returns ("Aladdin", "open sesame", true). -func parseBasicAuth(auth string) (username, password string, ok bool) { - if !strings.HasPrefix(auth, "Basic ") { - return - } - c, err := base64.StdEncoding.DecodeString(strings.TrimPrefix(auth, "Basic ")) - if err != nil { - return - } - cs := string(c) - s := strings.IndexByte(cs, ':') - if s < 0 { - return - } - return cs[:s], cs[s+1:], true -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/blob.go b/vendor/github.com/docker/distribution/registry/handlers/blob.go deleted file mode 100644 index fb250acd2..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/blob.go +++ /dev/null @@ -1,99 +0,0 @@ -package handlers - -import ( - "net/http" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" - "github.com/gorilla/handlers" -) - -// blobDispatcher uses the request context to build a blobHandler. -func blobDispatcher(ctx *Context, r *http.Request) http.Handler { - dgst, err := getDigest(ctx) - if err != nil { - - if err == errDigestNotAvailable { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx.Errors = append(ctx.Errors, v2.ErrorCodeDigestInvalid.WithDetail(err)) - }) - } - - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx.Errors = append(ctx.Errors, v2.ErrorCodeDigestInvalid.WithDetail(err)) - }) - } - - blobHandler := &blobHandler{ - Context: ctx, - Digest: dgst, - } - - mhandler := handlers.MethodHandler{ - "GET": http.HandlerFunc(blobHandler.GetBlob), - "HEAD": http.HandlerFunc(blobHandler.GetBlob), - } - - if !ctx.readOnly { - mhandler["DELETE"] = http.HandlerFunc(blobHandler.DeleteBlob) - } - - return mhandler -} - -// blobHandler serves http blob requests. -type blobHandler struct { - *Context - - Digest digest.Digest -} - -// GetBlob fetches the binary data from backend storage returns it in the -// response. -func (bh *blobHandler) GetBlob(w http.ResponseWriter, r *http.Request) { - context.GetLogger(bh).Debug("GetBlob") - blobs := bh.Repository.Blobs(bh) - desc, err := blobs.Stat(bh, bh.Digest) - if err != nil { - if err == distribution.ErrBlobUnknown { - bh.Errors = append(bh.Errors, v2.ErrorCodeBlobUnknown.WithDetail(bh.Digest)) - } else { - bh.Errors = append(bh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - } - return - } - - if err := blobs.ServeBlob(bh, w, r, desc.Digest); err != nil { - context.GetLogger(bh).Debugf("unexpected error getting blob HTTP handler: %v", err) - bh.Errors = append(bh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - return - } -} - -// DeleteBlob deletes a layer blob -func (bh *blobHandler) DeleteBlob(w http.ResponseWriter, r *http.Request) { - context.GetLogger(bh).Debug("DeleteBlob") - - blobs := bh.Repository.Blobs(bh) - err := blobs.Delete(bh, bh.Digest) - if err != nil { - switch err { - case distribution.ErrUnsupported: - bh.Errors = append(bh.Errors, errcode.ErrorCodeUnsupported) - return - case distribution.ErrBlobUnknown: - bh.Errors = append(bh.Errors, v2.ErrorCodeBlobUnknown) - return - default: - bh.Errors = append(bh.Errors, err) - context.GetLogger(bh).Errorf("Unknown error deleting blob: %s", err.Error()) - return - } - } - - w.Header().Set("Content-Length", "0") - w.WriteHeader(http.StatusAccepted) -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/blobupload.go b/vendor/github.com/docker/distribution/registry/handlers/blobupload.go deleted file mode 100644 index d8c7d88d8..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/blobupload.go +++ /dev/null @@ -1,368 +0,0 @@ -package handlers - -import ( - "fmt" - "net/http" - "net/url" - - "github.com/docker/distribution" - ctxu "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" - "github.com/docker/distribution/registry/storage" - "github.com/gorilla/handlers" -) - -// blobUploadDispatcher constructs and returns the blob upload handler for the -// given request context. -func blobUploadDispatcher(ctx *Context, r *http.Request) http.Handler { - buh := &blobUploadHandler{ - Context: ctx, - UUID: getUploadUUID(ctx), - } - - handler := handlers.MethodHandler{ - "GET": http.HandlerFunc(buh.GetUploadStatus), - "HEAD": http.HandlerFunc(buh.GetUploadStatus), - } - - if !ctx.readOnly { - handler["POST"] = http.HandlerFunc(buh.StartBlobUpload) - handler["PATCH"] = http.HandlerFunc(buh.PatchBlobData) - handler["PUT"] = http.HandlerFunc(buh.PutBlobUploadComplete) - handler["DELETE"] = http.HandlerFunc(buh.CancelBlobUpload) - } - - if buh.UUID != "" { - state, err := hmacKey(ctx.Config.HTTP.Secret).unpackUploadState(r.FormValue("_state")) - if err != nil { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctxu.GetLogger(ctx).Infof("error resolving upload: %v", err) - buh.Errors = append(buh.Errors, v2.ErrorCodeBlobUploadInvalid.WithDetail(err)) - }) - } - buh.State = state - - if state.Name != ctx.Repository.Named().Name() { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctxu.GetLogger(ctx).Infof("mismatched repository name in upload state: %q != %q", state.Name, buh.Repository.Named().Name()) - buh.Errors = append(buh.Errors, v2.ErrorCodeBlobUploadInvalid.WithDetail(err)) - }) - } - - if state.UUID != buh.UUID { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctxu.GetLogger(ctx).Infof("mismatched uuid in upload state: %q != %q", state.UUID, buh.UUID) - buh.Errors = append(buh.Errors, v2.ErrorCodeBlobUploadInvalid.WithDetail(err)) - }) - } - - blobs := ctx.Repository.Blobs(buh) - upload, err := blobs.Resume(buh, buh.UUID) - if err != nil { - ctxu.GetLogger(ctx).Errorf("error resolving upload: %v", err) - if err == distribution.ErrBlobUploadUnknown { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - buh.Errors = append(buh.Errors, v2.ErrorCodeBlobUploadUnknown.WithDetail(err)) - }) - } - - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - }) - } - buh.Upload = upload - - if size := upload.Size(); size != buh.State.Offset { - defer upload.Close() - ctxu.GetLogger(ctx).Errorf("upload resumed at wrong offest: %d != %d", size, buh.State.Offset) - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - buh.Errors = append(buh.Errors, v2.ErrorCodeBlobUploadInvalid.WithDetail(err)) - upload.Cancel(buh) - }) - } - return closeResources(handler, buh.Upload) - } - - return handler -} - -// blobUploadHandler handles the http blob upload process. -type blobUploadHandler struct { - *Context - - // UUID identifies the upload instance for the current request. Using UUID - // to key blob writers since this implementation uses UUIDs. - UUID string - - Upload distribution.BlobWriter - - State blobUploadState -} - -// StartBlobUpload begins the blob upload process and allocates a server-side -// blob writer session, optionally mounting the blob from a separate repository. -func (buh *blobUploadHandler) StartBlobUpload(w http.ResponseWriter, r *http.Request) { - var options []distribution.BlobCreateOption - - fromRepo := r.FormValue("from") - mountDigest := r.FormValue("mount") - - if mountDigest != "" && fromRepo != "" { - opt, err := buh.createBlobMountOption(fromRepo, mountDigest) - if opt != nil && err == nil { - options = append(options, opt) - } - } - - blobs := buh.Repository.Blobs(buh) - upload, err := blobs.Create(buh, options...) - - if err != nil { - if ebm, ok := err.(distribution.ErrBlobMounted); ok { - if err := buh.writeBlobCreatedHeaders(w, ebm.Descriptor); err != nil { - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - } - } else if err == distribution.ErrUnsupported { - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnsupported) - } else { - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - } - return - } - - buh.Upload = upload - - if err := buh.blobUploadResponse(w, r, true); err != nil { - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - return - } - - w.Header().Set("Docker-Upload-UUID", buh.Upload.ID()) - w.WriteHeader(http.StatusAccepted) -} - -// GetUploadStatus returns the status of a given upload, identified by id. -func (buh *blobUploadHandler) GetUploadStatus(w http.ResponseWriter, r *http.Request) { - if buh.Upload == nil { - buh.Errors = append(buh.Errors, v2.ErrorCodeBlobUploadUnknown) - return - } - - // TODO(dmcgowan): Set last argument to false in blobUploadResponse when - // resumable upload is supported. This will enable returning a non-zero - // range for clients to begin uploading at an offset. - if err := buh.blobUploadResponse(w, r, true); err != nil { - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - return - } - - w.Header().Set("Docker-Upload-UUID", buh.UUID) - w.WriteHeader(http.StatusNoContent) -} - -// PatchBlobData writes data to an upload. -func (buh *blobUploadHandler) PatchBlobData(w http.ResponseWriter, r *http.Request) { - if buh.Upload == nil { - buh.Errors = append(buh.Errors, v2.ErrorCodeBlobUploadUnknown) - return - } - - ct := r.Header.Get("Content-Type") - if ct != "" && ct != "application/octet-stream" { - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(fmt.Errorf("Bad Content-Type"))) - // TODO(dmcgowan): encode error - return - } - - // TODO(dmcgowan): support Content-Range header to seek and write range - - if err := copyFullPayload(w, r, buh.Upload, -1, buh, "blob PATCH"); err != nil { - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(err.Error())) - return - } - - if err := buh.blobUploadResponse(w, r, false); err != nil { - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - return - } - - w.WriteHeader(http.StatusAccepted) -} - -// PutBlobUploadComplete takes the final request of a blob upload. The -// request may include all the blob data or no blob data. Any data -// provided is received and verified. If successful, the blob is linked -// into the blob store and 201 Created is returned with the canonical -// url of the blob. -func (buh *blobUploadHandler) PutBlobUploadComplete(w http.ResponseWriter, r *http.Request) { - if buh.Upload == nil { - buh.Errors = append(buh.Errors, v2.ErrorCodeBlobUploadUnknown) - return - } - - dgstStr := r.FormValue("digest") // TODO(stevvooe): Support multiple digest parameters! - - if dgstStr == "" { - // no digest? return error, but allow retry. - buh.Errors = append(buh.Errors, v2.ErrorCodeDigestInvalid.WithDetail("digest missing")) - return - } - - dgst, err := digest.ParseDigest(dgstStr) - if err != nil { - // no digest? return error, but allow retry. - buh.Errors = append(buh.Errors, v2.ErrorCodeDigestInvalid.WithDetail("digest parsing failed")) - return - } - - if err := copyFullPayload(w, r, buh.Upload, -1, buh, "blob PUT"); err != nil { - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(err.Error())) - return - } - - desc, err := buh.Upload.Commit(buh, distribution.Descriptor{ - Digest: dgst, - - // TODO(stevvooe): This isn't wildly important yet, but we should - // really set the mediatype. For now, we can let the backend take care - // of this. - }) - - if err != nil { - switch err := err.(type) { - case distribution.ErrBlobInvalidDigest: - buh.Errors = append(buh.Errors, v2.ErrorCodeDigestInvalid.WithDetail(err)) - case errcode.Error: - buh.Errors = append(buh.Errors, err) - default: - switch err { - case distribution.ErrAccessDenied: - buh.Errors = append(buh.Errors, errcode.ErrorCodeDenied) - case distribution.ErrUnsupported: - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnsupported) - case distribution.ErrBlobInvalidLength, distribution.ErrBlobDigestUnsupported: - buh.Errors = append(buh.Errors, v2.ErrorCodeBlobUploadInvalid.WithDetail(err)) - default: - ctxu.GetLogger(buh).Errorf("unknown error completing upload: %v", err) - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - } - - } - - // Clean up the backend blob data if there was an error. - if err := buh.Upload.Cancel(buh); err != nil { - // If the cleanup fails, all we can do is observe and report. - ctxu.GetLogger(buh).Errorf("error canceling upload after error: %v", err) - } - - return - } - if err := buh.writeBlobCreatedHeaders(w, desc); err != nil { - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - return - } -} - -// CancelBlobUpload cancels an in-progress upload of a blob. -func (buh *blobUploadHandler) CancelBlobUpload(w http.ResponseWriter, r *http.Request) { - if buh.Upload == nil { - buh.Errors = append(buh.Errors, v2.ErrorCodeBlobUploadUnknown) - return - } - - w.Header().Set("Docker-Upload-UUID", buh.UUID) - if err := buh.Upload.Cancel(buh); err != nil { - ctxu.GetLogger(buh).Errorf("error encountered canceling upload: %v", err) - buh.Errors = append(buh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - } - - w.WriteHeader(http.StatusNoContent) -} - -// blobUploadResponse provides a standard request for uploading blobs and -// chunk responses. This sets the correct headers but the response status is -// left to the caller. The fresh argument is used to ensure that new blob -// uploads always start at a 0 offset. This allows disabling resumable push by -// always returning a 0 offset on check status. -func (buh *blobUploadHandler) blobUploadResponse(w http.ResponseWriter, r *http.Request, fresh bool) error { - // TODO(stevvooe): Need a better way to manage the upload state automatically. - buh.State.Name = buh.Repository.Named().Name() - buh.State.UUID = buh.Upload.ID() - buh.Upload.Close() - buh.State.Offset = buh.Upload.Size() - buh.State.StartedAt = buh.Upload.StartedAt() - - token, err := hmacKey(buh.Config.HTTP.Secret).packUploadState(buh.State) - if err != nil { - ctxu.GetLogger(buh).Infof("error building upload state token: %s", err) - return err - } - - uploadURL, err := buh.urlBuilder.BuildBlobUploadChunkURL( - buh.Repository.Named(), buh.Upload.ID(), - url.Values{ - "_state": []string{token}, - }) - if err != nil { - ctxu.GetLogger(buh).Infof("error building upload url: %s", err) - return err - } - - endRange := buh.Upload.Size() - if endRange > 0 { - endRange = endRange - 1 - } - - w.Header().Set("Docker-Upload-UUID", buh.UUID) - w.Header().Set("Location", uploadURL) - - w.Header().Set("Content-Length", "0") - w.Header().Set("Range", fmt.Sprintf("0-%d", endRange)) - - return nil -} - -// mountBlob attempts to mount a blob from another repository by its digest. If -// successful, the blob is linked into the blob store and 201 Created is -// returned with the canonical url of the blob. -func (buh *blobUploadHandler) createBlobMountOption(fromRepo, mountDigest string) (distribution.BlobCreateOption, error) { - dgst, err := digest.ParseDigest(mountDigest) - if err != nil { - return nil, err - } - - ref, err := reference.ParseNamed(fromRepo) - if err != nil { - return nil, err - } - - canonical, err := reference.WithDigest(ref, dgst) - if err != nil { - return nil, err - } - - return storage.WithMountFrom(canonical), nil -} - -// writeBlobCreatedHeaders writes the standard headers describing a newly -// created blob. A 201 Created is written as well as the canonical URL and -// blob digest. -func (buh *blobUploadHandler) writeBlobCreatedHeaders(w http.ResponseWriter, desc distribution.Descriptor) error { - ref, err := reference.WithDigest(buh.Repository.Named(), desc.Digest) - if err != nil { - return err - } - blobURL, err := buh.urlBuilder.BuildBlobURL(ref) - if err != nil { - return err - } - - w.Header().Set("Location", blobURL) - w.Header().Set("Content-Length", "0") - w.Header().Set("Docker-Content-Digest", desc.Digest.String()) - w.WriteHeader(http.StatusCreated) - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/catalog.go b/vendor/github.com/docker/distribution/registry/handlers/catalog.go deleted file mode 100644 index eca984686..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/catalog.go +++ /dev/null @@ -1,98 +0,0 @@ -package handlers - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strconv" - - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/storage/driver" - "github.com/gorilla/handlers" -) - -const maximumReturnedEntries = 100 - -func catalogDispatcher(ctx *Context, r *http.Request) http.Handler { - catalogHandler := &catalogHandler{ - Context: ctx, - } - - return handlers.MethodHandler{ - "GET": http.HandlerFunc(catalogHandler.GetCatalog), - } -} - -type catalogHandler struct { - *Context -} - -type catalogAPIResponse struct { - Repositories []string `json:"repositories"` -} - -func (ch *catalogHandler) GetCatalog(w http.ResponseWriter, r *http.Request) { - var moreEntries = true - - q := r.URL.Query() - lastEntry := q.Get("last") - maxEntries, err := strconv.Atoi(q.Get("n")) - if err != nil || maxEntries < 0 { - maxEntries = maximumReturnedEntries - } - - repos := make([]string, maxEntries) - - filled, err := ch.App.registry.Repositories(ch.Context, repos, lastEntry) - _, pathNotFound := err.(driver.PathNotFoundError) - - if err == io.EOF || pathNotFound { - moreEntries = false - } else if err != nil { - ch.Errors = append(ch.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - return - } - - w.Header().Set("Content-Type", "application/json; charset=utf-8") - - // Add a link header if there are more entries to retrieve - if moreEntries { - lastEntry = repos[len(repos)-1] - urlStr, err := createLinkEntry(r.URL.String(), maxEntries, lastEntry) - if err != nil { - ch.Errors = append(ch.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - return - } - w.Header().Set("Link", urlStr) - } - - enc := json.NewEncoder(w) - if err := enc.Encode(catalogAPIResponse{ - Repositories: repos[0:filled], - }); err != nil { - ch.Errors = append(ch.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - return - } -} - -// Use the original URL from the request to create a new URL for -// the link header -func createLinkEntry(origURL string, maxEntries int, lastEntry string) (string, error) { - calledURL, err := url.Parse(origURL) - if err != nil { - return "", err - } - - v := url.Values{} - v.Add("n", strconv.Itoa(maxEntries)) - v.Add("last", lastEntry) - - calledURL.RawQuery = v.Encode() - - calledURL.Fragment = "" - urlStr := fmt.Sprintf("<%s>; rel=\"next\"", calledURL.String()) - - return urlStr, nil -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/context.go b/vendor/github.com/docker/distribution/registry/handlers/context.go deleted file mode 100644 index 552db2df6..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/context.go +++ /dev/null @@ -1,152 +0,0 @@ -package handlers - -import ( - "fmt" - "net/http" - "sync" - - "github.com/docker/distribution" - ctxu "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" - "github.com/docker/distribution/registry/auth" - "golang.org/x/net/context" -) - -// Context should contain the request specific context for use in across -// handlers. Resources that don't need to be shared across handlers should not -// be on this object. -type Context struct { - // App points to the application structure that created this context. - *App - context.Context - - // Repository is the repository for the current request. All requests - // should be scoped to a single repository. This field may be nil. - Repository distribution.Repository - - // Errors is a collection of errors encountered during the request to be - // returned to the client API. If errors are added to the collection, the - // handler *must not* start the response via http.ResponseWriter. - Errors errcode.Errors - - urlBuilder *v2.URLBuilder - - // TODO(stevvooe): The goal is too completely factor this context and - // dispatching out of the web application. Ideally, we should lean on - // context.Context for injection of these resources. -} - -// Value overrides context.Context.Value to ensure that calls are routed to -// correct context. -func (ctx *Context) Value(key interface{}) interface{} { - return ctx.Context.Value(key) -} - -func getName(ctx context.Context) (name string) { - return ctxu.GetStringValue(ctx, "vars.name") -} - -func getReference(ctx context.Context) (reference string) { - return ctxu.GetStringValue(ctx, "vars.reference") -} - -var errDigestNotAvailable = fmt.Errorf("digest not available in context") - -func getDigest(ctx context.Context) (dgst digest.Digest, err error) { - dgstStr := ctxu.GetStringValue(ctx, "vars.digest") - - if dgstStr == "" { - ctxu.GetLogger(ctx).Errorf("digest not available") - return "", errDigestNotAvailable - } - - d, err := digest.ParseDigest(dgstStr) - if err != nil { - ctxu.GetLogger(ctx).Errorf("error parsing digest=%q: %v", dgstStr, err) - return "", err - } - - return d, nil -} - -func getUploadUUID(ctx context.Context) (uuid string) { - return ctxu.GetStringValue(ctx, "vars.uuid") -} - -// getUserName attempts to resolve a username from the context and request. If -// a username cannot be resolved, the empty string is returned. -func getUserName(ctx context.Context, r *http.Request) string { - username := ctxu.GetStringValue(ctx, auth.UserNameKey) - - // Fallback to request user with basic auth - if username == "" { - var ok bool - uname, _, ok := basicAuth(r) - if ok { - username = uname - } - } - - return username -} - -// contextManager allows us to associate net/context.Context instances with a -// request, based on the memory identity of http.Request. This prepares http- -// level context, which is not application specific. If this is called, -// (*contextManager).release must be called on the context when the request is -// completed. -// -// Providing this circumvents a lot of necessity for dispatchers with the -// benefit of instantiating the request context much earlier. -// -// TODO(stevvooe): Consider making this facility a part of the context package. -type contextManager struct { - contexts map[*http.Request]context.Context - mu sync.Mutex -} - -// defaultContextManager is just a global instance to register request contexts. -var defaultContextManager = newContextManager() - -func newContextManager() *contextManager { - return &contextManager{ - contexts: make(map[*http.Request]context.Context), - } -} - -// context either returns a new context or looks it up in the manager. -func (cm *contextManager) context(parent context.Context, w http.ResponseWriter, r *http.Request) context.Context { - cm.mu.Lock() - defer cm.mu.Unlock() - - ctx, ok := cm.contexts[r] - if ok { - return ctx - } - - if parent == nil { - parent = ctxu.Background() - } - - ctx = ctxu.WithRequest(parent, r) - ctx, w = ctxu.WithResponseWriter(ctx, w) - ctx = ctxu.WithLogger(ctx, ctxu.GetRequestLogger(ctx)) - cm.contexts[r] = ctx - - return ctx -} - -// releases frees any associated with resources from request. -func (cm *contextManager) release(ctx context.Context) { - cm.mu.Lock() - defer cm.mu.Unlock() - - r, err := ctxu.GetRequest(ctx) - if err != nil { - ctxu.GetLogger(ctx).Errorf("no request found in context during release") - return - } - delete(cm.contexts, r) -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/health_test.go b/vendor/github.com/docker/distribution/registry/handlers/health_test.go deleted file mode 100644 index 0f38bd1cd..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/health_test.go +++ /dev/null @@ -1,210 +0,0 @@ -package handlers - -import ( - "io/ioutil" - "net" - "net/http" - "net/http/httptest" - "os" - "testing" - "time" - - "github.com/docker/distribution/configuration" - "github.com/docker/distribution/context" - "github.com/docker/distribution/health" -) - -func TestFileHealthCheck(t *testing.T) { - interval := time.Second - - tmpfile, err := ioutil.TempFile(os.TempDir(), "healthcheck") - if err != nil { - t.Fatalf("could not create temporary file: %v", err) - } - defer tmpfile.Close() - - config := &configuration.Configuration{ - Storage: configuration.Storage{ - "inmemory": configuration.Parameters{}, - "maintenance": configuration.Parameters{"uploadpurging": map[interface{}]interface{}{ - "enabled": false, - }}, - }, - Health: configuration.Health{ - FileCheckers: []configuration.FileChecker{ - { - Interval: interval, - File: tmpfile.Name(), - }, - }, - }, - } - - ctx := context.Background() - - app := NewApp(ctx, config) - healthRegistry := health.NewRegistry() - app.RegisterHealthChecks(healthRegistry) - - // Wait for health check to happen - <-time.After(2 * interval) - - status := healthRegistry.CheckStatus() - if len(status) != 1 { - t.Fatal("expected 1 item in health check results") - } - if status[tmpfile.Name()] != "file exists" { - t.Fatal(`did not get "file exists" result for health check`) - } - - os.Remove(tmpfile.Name()) - - <-time.After(2 * interval) - if len(healthRegistry.CheckStatus()) != 0 { - t.Fatal("expected 0 items in health check results") - } -} - -func TestTCPHealthCheck(t *testing.T) { - interval := time.Second - - ln, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Fatalf("could not create listener: %v", err) - } - addrStr := ln.Addr().String() - - // Start accepting - go func() { - for { - conn, err := ln.Accept() - if err != nil { - // listener was closed - return - } - defer conn.Close() - } - }() - - config := &configuration.Configuration{ - Storage: configuration.Storage{ - "inmemory": configuration.Parameters{}, - "maintenance": configuration.Parameters{"uploadpurging": map[interface{}]interface{}{ - "enabled": false, - }}, - }, - Health: configuration.Health{ - TCPCheckers: []configuration.TCPChecker{ - { - Interval: interval, - Addr: addrStr, - Timeout: 500 * time.Millisecond, - }, - }, - }, - } - - ctx := context.Background() - - app := NewApp(ctx, config) - healthRegistry := health.NewRegistry() - app.RegisterHealthChecks(healthRegistry) - - // Wait for health check to happen - <-time.After(2 * interval) - - if len(healthRegistry.CheckStatus()) != 0 { - t.Fatal("expected 0 items in health check results") - } - - ln.Close() - <-time.After(2 * interval) - - // Health check should now fail - status := healthRegistry.CheckStatus() - if len(status) != 1 { - t.Fatal("expected 1 item in health check results") - } - if status[addrStr] != "connection to "+addrStr+" failed" { - t.Fatal(`did not get "connection failed" result for health check`) - } -} - -func TestHTTPHealthCheck(t *testing.T) { - interval := time.Second - threshold := 3 - - stopFailing := make(chan struct{}) - - checkedServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method != "HEAD" { - t.Fatalf("expected HEAD request, got %s", r.Method) - } - select { - case <-stopFailing: - w.WriteHeader(http.StatusOK) - default: - w.WriteHeader(http.StatusInternalServerError) - } - })) - - config := &configuration.Configuration{ - Storage: configuration.Storage{ - "inmemory": configuration.Parameters{}, - "maintenance": configuration.Parameters{"uploadpurging": map[interface{}]interface{}{ - "enabled": false, - }}, - }, - Health: configuration.Health{ - HTTPCheckers: []configuration.HTTPChecker{ - { - Interval: interval, - URI: checkedServer.URL, - Threshold: threshold, - }, - }, - }, - } - - ctx := context.Background() - - app := NewApp(ctx, config) - healthRegistry := health.NewRegistry() - app.RegisterHealthChecks(healthRegistry) - - for i := 0; ; i++ { - <-time.After(interval) - - status := healthRegistry.CheckStatus() - - if i < threshold-1 { - // definitely shouldn't have hit the threshold yet - if len(status) != 0 { - t.Fatal("expected 1 item in health check results") - } - continue - } - if i < threshold+1 { - // right on the threshold - don't expect a failure yet - continue - } - - if len(status) != 1 { - t.Fatal("expected 1 item in health check results") - } - if status[checkedServer.URL] != "downstream service returned unexpected status: 500" { - t.Fatal("did not get expected result for health check") - } - - break - } - - // Signal HTTP handler to start returning 200 - close(stopFailing) - - <-time.After(2 * interval) - - if len(healthRegistry.CheckStatus()) != 0 { - t.Fatal("expected 0 items in health check results") - } -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/helpers.go b/vendor/github.com/docker/distribution/registry/handlers/helpers.go deleted file mode 100644 index dc3091a9c..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/helpers.go +++ /dev/null @@ -1,71 +0,0 @@ -package handlers - -import ( - "errors" - "io" - "net/http" - - ctxu "github.com/docker/distribution/context" -) - -// closeResources closes all the provided resources after running the target -// handler. -func closeResources(handler http.Handler, closers ...io.Closer) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - for _, closer := range closers { - defer closer.Close() - } - handler.ServeHTTP(w, r) - }) -} - -// copyFullPayload copies the payload of an HTTP request to destWriter. If it -// receives less content than expected, and the client disconnected during the -// upload, it avoids sending a 400 error to keep the logs cleaner. -// -// The copy will be limited to `limit` bytes, if limit is greater than zero. -func copyFullPayload(responseWriter http.ResponseWriter, r *http.Request, destWriter io.Writer, limit int64, context ctxu.Context, action string) error { - // Get a channel that tells us if the client disconnects - var clientClosed <-chan bool - if notifier, ok := responseWriter.(http.CloseNotifier); ok { - clientClosed = notifier.CloseNotify() - } else { - ctxu.GetLogger(context).Warnf("the ResponseWriter does not implement CloseNotifier (type: %T)", responseWriter) - } - - var body = r.Body - if limit > 0 { - body = http.MaxBytesReader(responseWriter, body, limit) - } - - // Read in the data, if any. - copied, err := io.Copy(destWriter, body) - if clientClosed != nil && (err != nil || (r.ContentLength > 0 && copied < r.ContentLength)) { - // Didn't receive as much content as expected. Did the client - // disconnect during the request? If so, avoid returning a 400 - // error to keep the logs cleaner. - select { - case <-clientClosed: - // Set the response code to "499 Client Closed Request" - // Even though the connection has already been closed, - // this causes the logger to pick up a 499 error - // instead of showing 0 for the HTTP status. - responseWriter.WriteHeader(499) - - ctxu.GetLoggerWithFields(context, map[interface{}]interface{}{ - "error": err, - "copied": copied, - "contentLength": r.ContentLength, - }, "error", "copied", "contentLength").Error("client disconnected during " + action) - return errors.New("client disconnected") - default: - } - } - - if err != nil { - ctxu.GetLogger(context).Errorf("unknown error reading request payload: %v", err) - return err - } - - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/hmac.go b/vendor/github.com/docker/distribution/registry/handlers/hmac.go deleted file mode 100644 index 94ed9fda5..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/hmac.go +++ /dev/null @@ -1,74 +0,0 @@ -package handlers - -import ( - "crypto/hmac" - "crypto/sha256" - "encoding/base64" - "encoding/json" - "fmt" - "time" -) - -// blobUploadState captures the state serializable state of the blob upload. -type blobUploadState struct { - // name is the primary repository under which the blob will be linked. - Name string - - // UUID identifies the upload. - UUID string - - // offset contains the current progress of the upload. - Offset int64 - - // StartedAt is the original start time of the upload. - StartedAt time.Time -} - -type hmacKey string - -var errInvalidSecret = fmt.Errorf("invalid secret") - -// unpackUploadState unpacks and validates the blob upload state from the -// token, using the hmacKey secret. -func (secret hmacKey) unpackUploadState(token string) (blobUploadState, error) { - var state blobUploadState - - tokenBytes, err := base64.URLEncoding.DecodeString(token) - if err != nil { - return state, err - } - mac := hmac.New(sha256.New, []byte(secret)) - - if len(tokenBytes) < mac.Size() { - return state, errInvalidSecret - } - - macBytes := tokenBytes[:mac.Size()] - messageBytes := tokenBytes[mac.Size():] - - mac.Write(messageBytes) - if !hmac.Equal(mac.Sum(nil), macBytes) { - return state, errInvalidSecret - } - - if err := json.Unmarshal(messageBytes, &state); err != nil { - return state, err - } - - return state, nil -} - -// packUploadState packs the upload state signed with and hmac digest using -// the hmacKey secret, encoding to url safe base64. The resulting token can be -// used to share data with minimized risk of external tampering. -func (secret hmacKey) packUploadState(lus blobUploadState) (string, error) { - mac := hmac.New(sha256.New, []byte(secret)) - p, err := json.Marshal(lus) - if err != nil { - return "", err - } - - mac.Write(p) - - return base64.URLEncoding.EncodeToString(append(mac.Sum(nil), p...)), nil -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/hmac_test.go b/vendor/github.com/docker/distribution/registry/handlers/hmac_test.go deleted file mode 100644 index 366c7279e..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/hmac_test.go +++ /dev/null @@ -1,117 +0,0 @@ -package handlers - -import "testing" - -var blobUploadStates = []blobUploadState{ - { - Name: "hello", - UUID: "abcd-1234-qwer-0987", - Offset: 0, - }, - { - Name: "hello-world", - UUID: "abcd-1234-qwer-0987", - Offset: 0, - }, - { - Name: "h3ll0_w0rld", - UUID: "abcd-1234-qwer-0987", - Offset: 1337, - }, - { - Name: "ABCDEFG", - UUID: "ABCD-1234-QWER-0987", - Offset: 1234567890, - }, - { - Name: "this-is-A-sort-of-Long-name-for-Testing", - UUID: "dead-1234-beef-0987", - Offset: 8675309, - }, -} - -var secrets = []string{ - "supersecret", - "12345", - "a", - "SuperSecret", - "Sup3r... S3cr3t!", - "This is a reasonably long secret key that is used for the purpose of testing.", - "\u2603+\u2744", // snowman+snowflake -} - -// TestLayerUploadTokens constructs stateTokens from LayerUploadStates and -// validates that the tokens can be used to reconstruct the proper upload state. -func TestLayerUploadTokens(t *testing.T) { - secret := hmacKey("supersecret") - - for _, testcase := range blobUploadStates { - token, err := secret.packUploadState(testcase) - if err != nil { - t.Fatal(err) - } - - lus, err := secret.unpackUploadState(token) - if err != nil { - t.Fatal(err) - } - - assertBlobUploadStateEquals(t, testcase, lus) - } -} - -// TestHMACValidate ensures that any HMAC token providers are compatible if and -// only if they share the same secret. -func TestHMACValidation(t *testing.T) { - for _, secret := range secrets { - secret1 := hmacKey(secret) - secret2 := hmacKey(secret) - badSecret := hmacKey("DifferentSecret") - - for _, testcase := range blobUploadStates { - token, err := secret1.packUploadState(testcase) - if err != nil { - t.Fatal(err) - } - - lus, err := secret2.unpackUploadState(token) - if err != nil { - t.Fatal(err) - } - - assertBlobUploadStateEquals(t, testcase, lus) - - _, err = badSecret.unpackUploadState(token) - if err == nil { - t.Fatalf("Expected token provider to fail at retrieving state from token: %s", token) - } - - badToken, err := badSecret.packUploadState(lus) - if err != nil { - t.Fatal(err) - } - - _, err = secret1.unpackUploadState(badToken) - if err == nil { - t.Fatalf("Expected token provider to fail at retrieving state from token: %s", badToken) - } - - _, err = secret2.unpackUploadState(badToken) - if err == nil { - t.Fatalf("Expected token provider to fail at retrieving state from token: %s", badToken) - } - } - } -} - -func assertBlobUploadStateEquals(t *testing.T, expected blobUploadState, received blobUploadState) { - if expected.Name != received.Name { - t.Fatalf("Expected Name=%q, Received Name=%q", expected.Name, received.Name) - } - if expected.UUID != received.UUID { - t.Fatalf("Expected UUID=%q, Received UUID=%q", expected.UUID, received.UUID) - } - if expected.Offset != received.Offset { - t.Fatalf("Expected Offset=%d, Received Offset=%d", expected.Offset, received.Offset) - } -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/hooks.go b/vendor/github.com/docker/distribution/registry/handlers/hooks.go deleted file mode 100644 index 7bbab4f8a..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/hooks.go +++ /dev/null @@ -1,53 +0,0 @@ -package handlers - -import ( - "bytes" - "errors" - "fmt" - "strings" - "text/template" - - "github.com/Sirupsen/logrus" -) - -// logHook is for hooking Panic in web application -type logHook struct { - LevelsParam []string - Mail *mailer -} - -// Fire forwards an error to LogHook -func (hook *logHook) Fire(entry *logrus.Entry) error { - addr := strings.Split(hook.Mail.Addr, ":") - if len(addr) != 2 { - return errors.New("Invalid Mail Address") - } - host := addr[0] - subject := fmt.Sprintf("[%s] %s: %s", entry.Level, host, entry.Message) - - html := ` - {{.Message}} - - {{range $key, $value := .Data}} - {{$key}}: {{$value}} - {{end}} - ` - b := bytes.NewBuffer(make([]byte, 0)) - t := template.Must(template.New("mail body").Parse(html)) - if err := t.Execute(b, entry); err != nil { - return err - } - body := fmt.Sprintf("%s", b) - - return hook.Mail.sendMail(subject, body) -} - -// Levels contains hook levels to be catched -func (hook *logHook) Levels() []logrus.Level { - levels := []logrus.Level{} - for _, v := range hook.LevelsParam { - lv, _ := logrus.ParseLevel(v) - levels = append(levels, lv) - } - return levels -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/images.go b/vendor/github.com/docker/distribution/registry/handlers/images.go deleted file mode 100644 index 3ee207b61..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/images.go +++ /dev/null @@ -1,462 +0,0 @@ -package handlers - -import ( - "bytes" - "fmt" - "net/http" - "strings" - - "github.com/docker/distribution" - ctxu "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/manifestlist" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/manifest/schema2" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" - "github.com/docker/distribution/registry/auth" - "github.com/gorilla/handlers" -) - -// These constants determine which architecture and OS to choose from a -// manifest list when downconverting it to a schema1 manifest. -const ( - defaultArch = "amd64" - defaultOS = "linux" - maxManifestBodySize = 4 << 20 -) - -// imageManifestDispatcher takes the request context and builds the -// appropriate handler for handling image manifest requests. -func imageManifestDispatcher(ctx *Context, r *http.Request) http.Handler { - imageManifestHandler := &imageManifestHandler{ - Context: ctx, - } - reference := getReference(ctx) - dgst, err := digest.ParseDigest(reference) - if err != nil { - // We just have a tag - imageManifestHandler.Tag = reference - } else { - imageManifestHandler.Digest = dgst - } - - mhandler := handlers.MethodHandler{ - "GET": http.HandlerFunc(imageManifestHandler.GetImageManifest), - "HEAD": http.HandlerFunc(imageManifestHandler.GetImageManifest), - } - - if !ctx.readOnly { - mhandler["PUT"] = http.HandlerFunc(imageManifestHandler.PutImageManifest) - mhandler["DELETE"] = http.HandlerFunc(imageManifestHandler.DeleteImageManifest) - } - - return mhandler -} - -// imageManifestHandler handles http operations on image manifests. -type imageManifestHandler struct { - *Context - - // One of tag or digest gets set, depending on what is present in context. - Tag string - Digest digest.Digest -} - -// GetImageManifest fetches the image manifest from the storage backend, if it exists. -func (imh *imageManifestHandler) GetImageManifest(w http.ResponseWriter, r *http.Request) { - ctxu.GetLogger(imh).Debug("GetImageManifest") - manifests, err := imh.Repository.Manifests(imh) - if err != nil { - imh.Errors = append(imh.Errors, err) - return - } - - var manifest distribution.Manifest - if imh.Tag != "" { - tags := imh.Repository.Tags(imh) - desc, err := tags.Get(imh, imh.Tag) - if err != nil { - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestUnknown.WithDetail(err)) - return - } - imh.Digest = desc.Digest - } - - if etagMatch(r, imh.Digest.String()) { - w.WriteHeader(http.StatusNotModified) - return - } - - var options []distribution.ManifestServiceOption - if imh.Tag != "" { - options = append(options, distribution.WithTag(imh.Tag)) - } - manifest, err = manifests.Get(imh, imh.Digest, options...) - if err != nil { - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestUnknown.WithDetail(err)) - return - } - - supportsSchema2 := false - supportsManifestList := false - // this parsing of Accept headers is not quite as full-featured as godoc.org's parser, but we don't care about "q=" values - // https://github.com/golang/gddo/blob/e91d4165076d7474d20abda83f92d15c7ebc3e81/httputil/header/header.go#L165-L202 - for _, acceptHeader := range r.Header["Accept"] { - // r.Header[...] is a slice in case the request contains the same header more than once - // if the header isn't set, we'll get the zero value, which "range" will handle gracefully - - // we need to split each header value on "," to get the full list of "Accept" values (per RFC 2616) - // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1 - for _, mediaType := range strings.Split(acceptHeader, ",") { - // remove "; q=..." if present - if i := strings.Index(mediaType, ";"); i >= 0 { - mediaType = mediaType[:i] - } - - // it's common (but not required) for Accept values to be space separated ("a/b, c/d, e/f") - mediaType = strings.TrimSpace(mediaType) - - if mediaType == schema2.MediaTypeManifest { - supportsSchema2 = true - } - if mediaType == manifestlist.MediaTypeManifestList { - supportsManifestList = true - } - } - } - - schema2Manifest, isSchema2 := manifest.(*schema2.DeserializedManifest) - manifestList, isManifestList := manifest.(*manifestlist.DeserializedManifestList) - - // Only rewrite schema2 manifests when they are being fetched by tag. - // If they are being fetched by digest, we can't return something not - // matching the digest. - if imh.Tag != "" && isSchema2 && !supportsSchema2 { - // Rewrite manifest in schema1 format - ctxu.GetLogger(imh).Infof("rewriting manifest %s in schema1 format to support old client", imh.Digest.String()) - - manifest, err = imh.convertSchema2Manifest(schema2Manifest) - if err != nil { - return - } - } else if imh.Tag != "" && isManifestList && !supportsManifestList { - // Rewrite manifest in schema1 format - ctxu.GetLogger(imh).Infof("rewriting manifest list %s in schema1 format to support old client", imh.Digest.String()) - - // Find the image manifest corresponding to the default - // platform - var manifestDigest digest.Digest - for _, manifestDescriptor := range manifestList.Manifests { - if manifestDescriptor.Platform.Architecture == defaultArch && manifestDescriptor.Platform.OS == defaultOS { - manifestDigest = manifestDescriptor.Digest - break - } - } - - if manifestDigest == "" { - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestUnknown) - return - } - - manifest, err = manifests.Get(imh, manifestDigest) - if err != nil { - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestUnknown.WithDetail(err)) - return - } - - // If necessary, convert the image manifest - if schema2Manifest, isSchema2 := manifest.(*schema2.DeserializedManifest); isSchema2 && !supportsSchema2 { - manifest, err = imh.convertSchema2Manifest(schema2Manifest) - if err != nil { - return - } - } - } - - ct, p, err := manifest.Payload() - if err != nil { - return - } - - w.Header().Set("Content-Type", ct) - w.Header().Set("Content-Length", fmt.Sprint(len(p))) - w.Header().Set("Docker-Content-Digest", imh.Digest.String()) - w.Header().Set("Etag", fmt.Sprintf(`"%s"`, imh.Digest)) - w.Write(p) -} - -func (imh *imageManifestHandler) convertSchema2Manifest(schema2Manifest *schema2.DeserializedManifest) (distribution.Manifest, error) { - targetDescriptor := schema2Manifest.Target() - blobs := imh.Repository.Blobs(imh) - configJSON, err := blobs.Get(imh, targetDescriptor.Digest) - if err != nil { - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestInvalid.WithDetail(err)) - return nil, err - } - - ref := imh.Repository.Named() - - if imh.Tag != "" { - ref, err = reference.WithTag(ref, imh.Tag) - if err != nil { - imh.Errors = append(imh.Errors, v2.ErrorCodeTagInvalid.WithDetail(err)) - return nil, err - } - } - - builder := schema1.NewConfigManifestBuilder(imh.Repository.Blobs(imh), imh.Context.App.trustKey, ref, configJSON) - for _, d := range schema2Manifest.Layers { - if err := builder.AppendReference(d); err != nil { - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestInvalid.WithDetail(err)) - return nil, err - } - } - manifest, err := builder.Build(imh) - if err != nil { - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestInvalid.WithDetail(err)) - return nil, err - } - imh.Digest = digest.FromBytes(manifest.(*schema1.SignedManifest).Canonical) - - return manifest, nil -} - -func etagMatch(r *http.Request, etag string) bool { - for _, headerVal := range r.Header["If-None-Match"] { - if headerVal == etag || headerVal == fmt.Sprintf(`"%s"`, etag) { // allow quoted or unquoted - return true - } - } - return false -} - -// PutImageManifest validates and stores an image in the registry. -func (imh *imageManifestHandler) PutImageManifest(w http.ResponseWriter, r *http.Request) { - ctxu.GetLogger(imh).Debug("PutImageManifest") - manifests, err := imh.Repository.Manifests(imh) - if err != nil { - imh.Errors = append(imh.Errors, err) - return - } - - var jsonBuf bytes.Buffer - if err := copyFullPayload(w, r, &jsonBuf, maxManifestBodySize, imh, "image manifest PUT"); err != nil { - // copyFullPayload reports the error if necessary - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestInvalid.WithDetail(err.Error())) - return - } - - mediaType := r.Header.Get("Content-Type") - manifest, desc, err := distribution.UnmarshalManifest(mediaType, jsonBuf.Bytes()) - if err != nil { - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestInvalid.WithDetail(err)) - return - } - - if imh.Digest != "" { - if desc.Digest != imh.Digest { - ctxu.GetLogger(imh).Errorf("payload digest does match: %q != %q", desc.Digest, imh.Digest) - imh.Errors = append(imh.Errors, v2.ErrorCodeDigestInvalid) - return - } - } else if imh.Tag != "" { - imh.Digest = desc.Digest - } else { - imh.Errors = append(imh.Errors, v2.ErrorCodeTagInvalid.WithDetail("no tag or digest specified")) - return - } - - var options []distribution.ManifestServiceOption - if imh.Tag != "" { - options = append(options, distribution.WithTag(imh.Tag)) - } - - if err := imh.applyResourcePolicy(manifest); err != nil { - imh.Errors = append(imh.Errors, err) - return - } - - _, err = manifests.Put(imh, manifest, options...) - if err != nil { - // TODO(stevvooe): These error handling switches really need to be - // handled by an app global mapper. - if err == distribution.ErrUnsupported { - imh.Errors = append(imh.Errors, errcode.ErrorCodeUnsupported) - return - } - if err == distribution.ErrAccessDenied { - imh.Errors = append(imh.Errors, errcode.ErrorCodeDenied) - return - } - switch err := err.(type) { - case distribution.ErrManifestVerification: - for _, verificationError := range err { - switch verificationError := verificationError.(type) { - case distribution.ErrManifestBlobUnknown: - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestBlobUnknown.WithDetail(verificationError.Digest)) - case distribution.ErrManifestNameInvalid: - imh.Errors = append(imh.Errors, v2.ErrorCodeNameInvalid.WithDetail(err)) - case distribution.ErrManifestUnverified: - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestUnverified) - default: - if verificationError == digest.ErrDigestInvalidFormat { - imh.Errors = append(imh.Errors, v2.ErrorCodeDigestInvalid) - } else { - imh.Errors = append(imh.Errors, errcode.ErrorCodeUnknown, verificationError) - } - } - } - case errcode.Error: - imh.Errors = append(imh.Errors, err) - default: - imh.Errors = append(imh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - } - - return - } - - // Tag this manifest - if imh.Tag != "" { - tags := imh.Repository.Tags(imh) - err = tags.Tag(imh, imh.Tag, desc) - if err != nil { - imh.Errors = append(imh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - return - } - - } - - // Construct a canonical url for the uploaded manifest. - ref, err := reference.WithDigest(imh.Repository.Named(), imh.Digest) - if err != nil { - imh.Errors = append(imh.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - return - } - - location, err := imh.urlBuilder.BuildManifestURL(ref) - if err != nil { - // NOTE(stevvooe): Given the behavior above, this absurdly unlikely to - // happen. We'll log the error here but proceed as if it worked. Worst - // case, we set an empty location header. - ctxu.GetLogger(imh).Errorf("error building manifest url from digest: %v", err) - } - - w.Header().Set("Location", location) - w.Header().Set("Docker-Content-Digest", imh.Digest.String()) - w.WriteHeader(http.StatusCreated) -} - -// applyResourcePolicy checks whether the resource class matches what has -// been authorized and allowed by the policy configuration. -func (imh *imageManifestHandler) applyResourcePolicy(manifest distribution.Manifest) error { - allowedClasses := imh.App.Config.Policy.Repository.Classes - if len(allowedClasses) == 0 { - return nil - } - - var class string - switch m := manifest.(type) { - case *schema1.SignedManifest: - class = "image" - case *schema2.DeserializedManifest: - switch m.Config.MediaType { - case schema2.MediaTypeConfig: - class = "image" - case schema2.MediaTypePluginConfig: - class = "plugin" - default: - message := fmt.Sprintf("unknown manifest class for %s", m.Config.MediaType) - return errcode.ErrorCodeDenied.WithMessage(message) - } - } - - if class == "" { - return nil - } - - // Check to see if class is allowed in registry - var allowedClass bool - for _, c := range allowedClasses { - if class == c { - allowedClass = true - break - } - } - if !allowedClass { - message := fmt.Sprintf("registry does not allow %s manifest", class) - return errcode.ErrorCodeDenied.WithMessage(message) - } - - resources := auth.AuthorizedResources(imh) - n := imh.Repository.Named().Name() - - var foundResource bool - for _, r := range resources { - if r.Name == n { - if r.Class == "" { - r.Class = "image" - } - if r.Class == class { - return nil - } - foundResource = true - } - } - - // resource was found but no matching class was found - if foundResource { - message := fmt.Sprintf("repository not authorized for %s manifest", class) - return errcode.ErrorCodeDenied.WithMessage(message) - } - - return nil - -} - -// DeleteImageManifest removes the manifest with the given digest from the registry. -func (imh *imageManifestHandler) DeleteImageManifest(w http.ResponseWriter, r *http.Request) { - ctxu.GetLogger(imh).Debug("DeleteImageManifest") - - manifests, err := imh.Repository.Manifests(imh) - if err != nil { - imh.Errors = append(imh.Errors, err) - return - } - - err = manifests.Delete(imh, imh.Digest) - if err != nil { - switch err { - case digest.ErrDigestUnsupported: - case digest.ErrDigestInvalidFormat: - imh.Errors = append(imh.Errors, v2.ErrorCodeDigestInvalid) - return - case distribution.ErrBlobUnknown: - imh.Errors = append(imh.Errors, v2.ErrorCodeManifestUnknown) - return - case distribution.ErrUnsupported: - imh.Errors = append(imh.Errors, errcode.ErrorCodeUnsupported) - return - default: - imh.Errors = append(imh.Errors, errcode.ErrorCodeUnknown) - return - } - } - - tagService := imh.Repository.Tags(imh) - referencedTags, err := tagService.Lookup(imh, distribution.Descriptor{Digest: imh.Digest}) - if err != nil { - imh.Errors = append(imh.Errors, err) - return - } - - for _, tag := range referencedTags { - if err := tagService.Untag(imh, tag); err != nil { - imh.Errors = append(imh.Errors, err) - return - } - } - - w.WriteHeader(http.StatusAccepted) -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/mail.go b/vendor/github.com/docker/distribution/registry/handlers/mail.go deleted file mode 100644 index 39244909d..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/mail.go +++ /dev/null @@ -1,45 +0,0 @@ -package handlers - -import ( - "errors" - "net/smtp" - "strings" -) - -// mailer provides fields of email configuration for sending. -type mailer struct { - Addr, Username, Password, From string - Insecure bool - To []string -} - -// sendMail allows users to send email, only if mail parameters is configured correctly. -func (mail *mailer) sendMail(subject, message string) error { - addr := strings.Split(mail.Addr, ":") - if len(addr) != 2 { - return errors.New("Invalid Mail Address") - } - host := addr[0] - msg := []byte("To:" + strings.Join(mail.To, ";") + - "\r\nFrom: " + mail.From + - "\r\nSubject: " + subject + - "\r\nContent-Type: text/plain\r\n\r\n" + - message) - auth := smtp.PlainAuth( - "", - mail.Username, - mail.Password, - host, - ) - err := smtp.SendMail( - mail.Addr, - auth, - mail.From, - mail.To, - []byte(msg), - ) - if err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/handlers/tags.go b/vendor/github.com/docker/distribution/registry/handlers/tags.go deleted file mode 100644 index 91f1031e3..000000000 --- a/vendor/github.com/docker/distribution/registry/handlers/tags.go +++ /dev/null @@ -1,62 +0,0 @@ -package handlers - -import ( - "encoding/json" - "net/http" - - "github.com/docker/distribution" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" - "github.com/gorilla/handlers" -) - -// tagsDispatcher constructs the tags handler api endpoint. -func tagsDispatcher(ctx *Context, r *http.Request) http.Handler { - tagsHandler := &tagsHandler{ - Context: ctx, - } - - return handlers.MethodHandler{ - "GET": http.HandlerFunc(tagsHandler.GetTags), - } -} - -// tagsHandler handles requests for lists of tags under a repository name. -type tagsHandler struct { - *Context -} - -type tagsAPIResponse struct { - Name string `json:"name"` - Tags []string `json:"tags"` -} - -// GetTags returns a json list of tags for a specific image name. -func (th *tagsHandler) GetTags(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - - tagService := th.Repository.Tags(th) - tags, err := tagService.All(th) - if err != nil { - switch err := err.(type) { - case distribution.ErrRepositoryUnknown: - th.Errors = append(th.Errors, v2.ErrorCodeNameUnknown.WithDetail(map[string]string{"name": th.Repository.Named().Name()})) - case errcode.Error: - th.Errors = append(th.Errors, err) - default: - th.Errors = append(th.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - } - return - } - - w.Header().Set("Content-Type", "application/json; charset=utf-8") - - enc := json.NewEncoder(w) - if err := enc.Encode(tagsAPIResponse{ - Name: th.Repository.Named().Name(), - Tags: tags, - }); err != nil { - th.Errors = append(th.Errors, errcode.ErrorCodeUnknown.WithDetail(err)) - return - } -} diff --git a/vendor/github.com/docker/distribution/registry/listener/listener.go b/vendor/github.com/docker/distribution/registry/listener/listener.go deleted file mode 100644 index b93a7a63f..000000000 --- a/vendor/github.com/docker/distribution/registry/listener/listener.go +++ /dev/null @@ -1,74 +0,0 @@ -package listener - -import ( - "fmt" - "net" - "os" - "time" -) - -// tcpKeepAliveListener sets TCP keep-alive timeouts on accepted -// connections. It's used by ListenAndServe and ListenAndServeTLS so -// dead TCP connections (e.g. closing laptop mid-download) eventually -// go away. -// it is a plain copy-paste from net/http/server.go -type tcpKeepAliveListener struct { - *net.TCPListener -} - -func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) { - tc, err := ln.AcceptTCP() - if err != nil { - return - } - tc.SetKeepAlive(true) - tc.SetKeepAlivePeriod(3 * time.Minute) - return tc, nil -} - -// NewListener announces on laddr and net. Accepted values of the net are -// 'unix' and 'tcp' -func NewListener(net, laddr string) (net.Listener, error) { - switch net { - case "unix": - return newUnixListener(laddr) - case "tcp", "": // an empty net means tcp - return newTCPListener(laddr) - default: - return nil, fmt.Errorf("unknown address type %s", net) - } -} - -func newUnixListener(laddr string) (net.Listener, error) { - fi, err := os.Stat(laddr) - if err == nil { - // the file exists. - // try to remove it if it's a socket - if !isSocket(fi.Mode()) { - return nil, fmt.Errorf("file %s exists and is not a socket", laddr) - } - - if err := os.Remove(laddr); err != nil { - return nil, err - } - } else if !os.IsNotExist(err) { - // we can't do stat on the file. - // it means we can not remove it - return nil, err - } - - return net.Listen("unix", laddr) -} - -func isSocket(m os.FileMode) bool { - return m&os.ModeSocket != 0 -} - -func newTCPListener(laddr string) (net.Listener, error) { - ln, err := net.Listen("tcp", laddr) - if err != nil { - return nil, err - } - - return tcpKeepAliveListener{ln.(*net.TCPListener)}, nil -} diff --git a/vendor/github.com/docker/distribution/registry/middleware/registry/middleware.go b/vendor/github.com/docker/distribution/registry/middleware/registry/middleware.go deleted file mode 100644 index 3e6e5cc71..000000000 --- a/vendor/github.com/docker/distribution/registry/middleware/registry/middleware.go +++ /dev/null @@ -1,54 +0,0 @@ -package middleware - -import ( - "fmt" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/storage" -) - -// InitFunc is the type of a RegistryMiddleware factory function and is -// used to register the constructor for different RegistryMiddleware backends. -type InitFunc func(ctx context.Context, registry distribution.Namespace, options map[string]interface{}) (distribution.Namespace, error) - -var middlewares map[string]InitFunc -var registryoptions []storage.RegistryOption - -// Register is used to register an InitFunc for -// a RegistryMiddleware backend with the given name. -func Register(name string, initFunc InitFunc) error { - if middlewares == nil { - middlewares = make(map[string]InitFunc) - } - if _, exists := middlewares[name]; exists { - return fmt.Errorf("name already registered: %s", name) - } - - middlewares[name] = initFunc - - return nil -} - -// Get constructs a RegistryMiddleware with the given options using the named backend. -func Get(ctx context.Context, name string, options map[string]interface{}, registry distribution.Namespace) (distribution.Namespace, error) { - if middlewares != nil { - if initFunc, exists := middlewares[name]; exists { - return initFunc(ctx, registry, options) - } - } - - return nil, fmt.Errorf("no registry middleware registered with name: %s", name) -} - -// RegisterOptions adds more options to RegistryOption list. Options get applied before -// any other configuration-based options. -func RegisterOptions(options ...storage.RegistryOption) error { - registryoptions = append(registryoptions, options...) - return nil -} - -// GetRegistryOptions returns list of RegistryOption. -func GetRegistryOptions() []storage.RegistryOption { - return registryoptions -} diff --git a/vendor/github.com/docker/distribution/registry/middleware/repository/middleware.go b/vendor/github.com/docker/distribution/registry/middleware/repository/middleware.go deleted file mode 100644 index 27b42aecf..000000000 --- a/vendor/github.com/docker/distribution/registry/middleware/repository/middleware.go +++ /dev/null @@ -1,40 +0,0 @@ -package middleware - -import ( - "fmt" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" -) - -// InitFunc is the type of a RepositoryMiddleware factory function and is -// used to register the constructor for different RepositoryMiddleware backends. -type InitFunc func(ctx context.Context, repository distribution.Repository, options map[string]interface{}) (distribution.Repository, error) - -var middlewares map[string]InitFunc - -// Register is used to register an InitFunc for -// a RepositoryMiddleware backend with the given name. -func Register(name string, initFunc InitFunc) error { - if middlewares == nil { - middlewares = make(map[string]InitFunc) - } - if _, exists := middlewares[name]; exists { - return fmt.Errorf("name already registered: %s", name) - } - - middlewares[name] = initFunc - - return nil -} - -// Get constructs a RepositoryMiddleware with the given options using the named backend. -func Get(ctx context.Context, name string, options map[string]interface{}, repository distribution.Repository) (distribution.Repository, error) { - if middlewares != nil { - if initFunc, exists := middlewares[name]; exists { - return initFunc(ctx, repository, options) - } - } - - return nil, fmt.Errorf("no repository middleware registered with name: %s", name) -} diff --git a/vendor/github.com/docker/distribution/registry/proxy/proxyauth.go b/vendor/github.com/docker/distribution/registry/proxy/proxyauth.go deleted file mode 100644 index 7b405afcf..000000000 --- a/vendor/github.com/docker/distribution/registry/proxy/proxyauth.go +++ /dev/null @@ -1,87 +0,0 @@ -package proxy - -import ( - "net/http" - "net/url" - "strings" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/client/auth" - "github.com/docker/distribution/registry/client/auth/challenge" -) - -const challengeHeader = "Docker-Distribution-Api-Version" - -type userpass struct { - username string - password string -} - -type credentials struct { - creds map[string]userpass -} - -func (c credentials) Basic(u *url.URL) (string, string) { - up := c.creds[u.String()] - - return up.username, up.password -} - -func (c credentials) RefreshToken(u *url.URL, service string) string { - return "" -} - -func (c credentials) SetRefreshToken(u *url.URL, service, token string) { -} - -// configureAuth stores credentials for challenge responses -func configureAuth(username, password, remoteURL string) (auth.CredentialStore, error) { - creds := map[string]userpass{} - - authURLs, err := getAuthURLs(remoteURL) - if err != nil { - return nil, err - } - - for _, url := range authURLs { - context.GetLogger(context.Background()).Infof("Discovered token authentication URL: %s", url) - creds[url] = userpass{ - username: username, - password: password, - } - } - - return credentials{creds: creds}, nil -} - -func getAuthURLs(remoteURL string) ([]string, error) { - authURLs := []string{} - - resp, err := http.Get(remoteURL + "/v2/") - if err != nil { - return nil, err - } - defer resp.Body.Close() - - for _, c := range challenge.ResponseChallenges(resp) { - if strings.EqualFold(c.Scheme, "bearer") { - authURLs = append(authURLs, c.Parameters["realm"]) - } - } - - return authURLs, nil -} - -func ping(manager challenge.Manager, endpoint, versionHeader string) error { - resp, err := http.Get(endpoint) - if err != nil { - return err - } - defer resp.Body.Close() - - if err := manager.AddResponse(resp); err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/proxy/proxyblobstore.go b/vendor/github.com/docker/distribution/registry/proxy/proxyblobstore.go deleted file mode 100644 index 6cd572133..000000000 --- a/vendor/github.com/docker/distribution/registry/proxy/proxyblobstore.go +++ /dev/null @@ -1,224 +0,0 @@ -package proxy - -import ( - "io" - "net/http" - "strconv" - "sync" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/proxy/scheduler" -) - -// todo(richardscothern): from cache control header or config file -const blobTTL = time.Duration(24 * 7 * time.Hour) - -type proxyBlobStore struct { - localStore distribution.BlobStore - remoteStore distribution.BlobService - scheduler *scheduler.TTLExpirationScheduler - repositoryName reference.Named - authChallenger authChallenger -} - -var _ distribution.BlobStore = &proxyBlobStore{} - -// inflight tracks currently downloading blobs -var inflight = make(map[digest.Digest]struct{}) - -// mu protects inflight -var mu sync.Mutex - -func setResponseHeaders(w http.ResponseWriter, length int64, mediaType string, digest digest.Digest) { - w.Header().Set("Content-Length", strconv.FormatInt(length, 10)) - w.Header().Set("Content-Type", mediaType) - w.Header().Set("Docker-Content-Digest", digest.String()) - w.Header().Set("Etag", digest.String()) -} - -func (pbs *proxyBlobStore) copyContent(ctx context.Context, dgst digest.Digest, writer io.Writer) (distribution.Descriptor, error) { - desc, err := pbs.remoteStore.Stat(ctx, dgst) - if err != nil { - return distribution.Descriptor{}, err - } - - if w, ok := writer.(http.ResponseWriter); ok { - setResponseHeaders(w, desc.Size, desc.MediaType, dgst) - } - - remoteReader, err := pbs.remoteStore.Open(ctx, dgst) - if err != nil { - return distribution.Descriptor{}, err - } - - defer remoteReader.Close() - - _, err = io.CopyN(writer, remoteReader, desc.Size) - if err != nil { - return distribution.Descriptor{}, err - } - - proxyMetrics.BlobPush(uint64(desc.Size)) - - return desc, nil -} - -func (pbs *proxyBlobStore) serveLocal(ctx context.Context, w http.ResponseWriter, r *http.Request, dgst digest.Digest) (bool, error) { - localDesc, err := pbs.localStore.Stat(ctx, dgst) - if err != nil { - // Stat can report a zero sized file here if it's checked between creation - // and population. Return nil error, and continue - return false, nil - } - - if err == nil { - proxyMetrics.BlobPush(uint64(localDesc.Size)) - return true, pbs.localStore.ServeBlob(ctx, w, r, dgst) - } - - return false, nil - -} - -func (pbs *proxyBlobStore) storeLocal(ctx context.Context, dgst digest.Digest) error { - defer func() { - mu.Lock() - delete(inflight, dgst) - mu.Unlock() - }() - - var desc distribution.Descriptor - var err error - var bw distribution.BlobWriter - - bw, err = pbs.localStore.Create(ctx) - if err != nil { - return err - } - - desc, err = pbs.copyContent(ctx, dgst, bw) - if err != nil { - return err - } - - _, err = bw.Commit(ctx, desc) - if err != nil { - return err - } - - return nil -} - -func (pbs *proxyBlobStore) ServeBlob(ctx context.Context, w http.ResponseWriter, r *http.Request, dgst digest.Digest) error { - served, err := pbs.serveLocal(ctx, w, r, dgst) - if err != nil { - context.GetLogger(ctx).Errorf("Error serving blob from local storage: %s", err.Error()) - return err - } - - if served { - return nil - } - - if err := pbs.authChallenger.tryEstablishChallenges(ctx); err != nil { - return err - } - - mu.Lock() - _, ok := inflight[dgst] - if ok { - mu.Unlock() - _, err := pbs.copyContent(ctx, dgst, w) - return err - } - inflight[dgst] = struct{}{} - mu.Unlock() - - go func(dgst digest.Digest) { - if err := pbs.storeLocal(ctx, dgst); err != nil { - context.GetLogger(ctx).Errorf("Error committing to storage: %s", err.Error()) - } - - blobRef, err := reference.WithDigest(pbs.repositoryName, dgst) - if err != nil { - context.GetLogger(ctx).Errorf("Error creating reference: %s", err) - return - } - - pbs.scheduler.AddBlob(blobRef, repositoryTTL) - }(dgst) - - _, err = pbs.copyContent(ctx, dgst, w) - if err != nil { - return err - } - return nil -} - -func (pbs *proxyBlobStore) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - desc, err := pbs.localStore.Stat(ctx, dgst) - if err == nil { - return desc, err - } - - if err != distribution.ErrBlobUnknown { - return distribution.Descriptor{}, err - } - - if err := pbs.authChallenger.tryEstablishChallenges(ctx); err != nil { - return distribution.Descriptor{}, err - } - - return pbs.remoteStore.Stat(ctx, dgst) -} - -func (pbs *proxyBlobStore) Get(ctx context.Context, dgst digest.Digest) ([]byte, error) { - blob, err := pbs.localStore.Get(ctx, dgst) - if err == nil { - return blob, nil - } - - if err := pbs.authChallenger.tryEstablishChallenges(ctx); err != nil { - return []byte{}, err - } - - blob, err = pbs.remoteStore.Get(ctx, dgst) - if err != nil { - return []byte{}, err - } - - _, err = pbs.localStore.Put(ctx, "", blob) - if err != nil { - return []byte{}, err - } - return blob, nil -} - -// Unsupported functions -func (pbs *proxyBlobStore) Put(ctx context.Context, mediaType string, p []byte) (distribution.Descriptor, error) { - return distribution.Descriptor{}, distribution.ErrUnsupported -} - -func (pbs *proxyBlobStore) Create(ctx context.Context, options ...distribution.BlobCreateOption) (distribution.BlobWriter, error) { - return nil, distribution.ErrUnsupported -} - -func (pbs *proxyBlobStore) Resume(ctx context.Context, id string) (distribution.BlobWriter, error) { - return nil, distribution.ErrUnsupported -} - -func (pbs *proxyBlobStore) Mount(ctx context.Context, sourceRepo reference.Named, dgst digest.Digest) (distribution.Descriptor, error) { - return distribution.Descriptor{}, distribution.ErrUnsupported -} - -func (pbs *proxyBlobStore) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { - return nil, distribution.ErrUnsupported -} - -func (pbs *proxyBlobStore) Delete(ctx context.Context, dgst digest.Digest) error { - return distribution.ErrUnsupported -} diff --git a/vendor/github.com/docker/distribution/registry/proxy/proxyblobstore_test.go b/vendor/github.com/docker/distribution/registry/proxy/proxyblobstore_test.go deleted file mode 100644 index 8e3a06920..000000000 --- a/vendor/github.com/docker/distribution/registry/proxy/proxyblobstore_test.go +++ /dev/null @@ -1,416 +0,0 @@ -package proxy - -import ( - "io/ioutil" - "math/rand" - "net/http" - "net/http/httptest" - "sync" - "testing" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/proxy/scheduler" - "github.com/docker/distribution/registry/storage" - "github.com/docker/distribution/registry/storage/cache/memory" - "github.com/docker/distribution/registry/storage/driver/filesystem" - "github.com/docker/distribution/registry/storage/driver/inmemory" -) - -var sbsMu sync.Mutex - -type statsBlobStore struct { - stats map[string]int - blobs distribution.BlobStore -} - -func (sbs statsBlobStore) Put(ctx context.Context, mediaType string, p []byte) (distribution.Descriptor, error) { - sbsMu.Lock() - sbs.stats["put"]++ - sbsMu.Unlock() - - return sbs.blobs.Put(ctx, mediaType, p) -} - -func (sbs statsBlobStore) Get(ctx context.Context, dgst digest.Digest) ([]byte, error) { - sbsMu.Lock() - sbs.stats["get"]++ - sbsMu.Unlock() - - return sbs.blobs.Get(ctx, dgst) -} - -func (sbs statsBlobStore) Create(ctx context.Context, options ...distribution.BlobCreateOption) (distribution.BlobWriter, error) { - sbsMu.Lock() - sbs.stats["create"]++ - sbsMu.Unlock() - - return sbs.blobs.Create(ctx, options...) -} - -func (sbs statsBlobStore) Resume(ctx context.Context, id string) (distribution.BlobWriter, error) { - sbsMu.Lock() - sbs.stats["resume"]++ - sbsMu.Unlock() - - return sbs.blobs.Resume(ctx, id) -} - -func (sbs statsBlobStore) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { - sbsMu.Lock() - sbs.stats["open"]++ - sbsMu.Unlock() - - return sbs.blobs.Open(ctx, dgst) -} - -func (sbs statsBlobStore) ServeBlob(ctx context.Context, w http.ResponseWriter, r *http.Request, dgst digest.Digest) error { - sbsMu.Lock() - sbs.stats["serveblob"]++ - sbsMu.Unlock() - - return sbs.blobs.ServeBlob(ctx, w, r, dgst) -} - -func (sbs statsBlobStore) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - - sbsMu.Lock() - sbs.stats["stat"]++ - sbsMu.Unlock() - - return sbs.blobs.Stat(ctx, dgst) -} - -func (sbs statsBlobStore) Delete(ctx context.Context, dgst digest.Digest) error { - sbsMu.Lock() - sbs.stats["delete"]++ - sbsMu.Unlock() - - return sbs.blobs.Delete(ctx, dgst) -} - -type testEnv struct { - numUnique int - inRemote []distribution.Descriptor - store proxyBlobStore - ctx context.Context -} - -func (te *testEnv) LocalStats() *map[string]int { - sbsMu.Lock() - ls := te.store.localStore.(statsBlobStore).stats - sbsMu.Unlock() - return &ls -} - -func (te *testEnv) RemoteStats() *map[string]int { - sbsMu.Lock() - rs := te.store.remoteStore.(statsBlobStore).stats - sbsMu.Unlock() - return &rs -} - -// Populate remote store and record the digests -func makeTestEnv(t *testing.T, name string) *testEnv { - nameRef, err := reference.ParseNamed(name) - if err != nil { - t.Fatalf("unable to parse reference: %s", err) - } - - ctx := context.Background() - - truthDir, err := ioutil.TempDir("", "truth") - if err != nil { - t.Fatalf("unable to create tempdir: %s", err) - } - - cacheDir, err := ioutil.TempDir("", "cache") - if err != nil { - t.Fatalf("unable to create tempdir: %s", err) - } - - localDriver, err := filesystem.FromParameters(map[string]interface{}{ - "rootdirectory": truthDir, - }) - if err != nil { - t.Fatalf("unable to create filesystem driver: %s", err) - } - - // todo: create a tempfile area here - localRegistry, err := storage.NewRegistry(ctx, localDriver, storage.BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), storage.EnableRedirect, storage.DisableDigestResumption) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - localRepo, err := localRegistry.Repository(ctx, nameRef) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - - cacheDriver, err := filesystem.FromParameters(map[string]interface{}{ - "rootdirectory": cacheDir, - }) - if err != nil { - t.Fatalf("unable to create filesystem driver: %s", err) - } - - truthRegistry, err := storage.NewRegistry(ctx, cacheDriver, storage.BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider())) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - truthRepo, err := truthRegistry.Repository(ctx, nameRef) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - - truthBlobs := statsBlobStore{ - stats: make(map[string]int), - blobs: truthRepo.Blobs(ctx), - } - - localBlobs := statsBlobStore{ - stats: make(map[string]int), - blobs: localRepo.Blobs(ctx), - } - - s := scheduler.New(ctx, inmemory.New(), "/scheduler-state.json") - - proxyBlobStore := proxyBlobStore{ - repositoryName: nameRef, - remoteStore: truthBlobs, - localStore: localBlobs, - scheduler: s, - authChallenger: &mockChallenger{}, - } - - te := &testEnv{ - store: proxyBlobStore, - ctx: ctx, - } - return te -} - -func makeBlob(size int) []byte { - blob := make([]byte, size, size) - for i := 0; i < size; i++ { - blob[i] = byte('A' + rand.Int()%48) - } - return blob -} - -func init() { - rand.Seed(42) -} - -func perm(m []distribution.Descriptor) []distribution.Descriptor { - for i := 0; i < len(m); i++ { - j := rand.Intn(i + 1) - tmp := m[i] - m[i] = m[j] - m[j] = tmp - } - return m -} - -func populate(t *testing.T, te *testEnv, blobCount, size, numUnique int) { - var inRemote []distribution.Descriptor - - for i := 0; i < numUnique; i++ { - bytes := makeBlob(size) - for j := 0; j < blobCount/numUnique; j++ { - desc, err := te.store.remoteStore.Put(te.ctx, "", bytes) - if err != nil { - t.Fatalf("Put in store") - } - - inRemote = append(inRemote, desc) - } - } - - te.inRemote = inRemote - te.numUnique = numUnique -} -func TestProxyStoreGet(t *testing.T) { - te := makeTestEnv(t, "foo/bar") - - localStats := te.LocalStats() - remoteStats := te.RemoteStats() - - populate(t, te, 1, 10, 1) - _, err := te.store.Get(te.ctx, te.inRemote[0].Digest) - if err != nil { - t.Fatal(err) - } - - if (*localStats)["get"] != 1 && (*localStats)["put"] != 1 { - t.Errorf("Unexpected local counts") - } - - if (*remoteStats)["get"] != 1 { - t.Errorf("Unexpected remote get count") - } - - _, err = te.store.Get(te.ctx, te.inRemote[0].Digest) - if err != nil { - t.Fatal(err) - } - - if (*localStats)["get"] != 2 && (*localStats)["put"] != 1 { - t.Errorf("Unexpected local counts") - } - - if (*remoteStats)["get"] != 1 { - t.Errorf("Unexpected remote get count") - } - -} - -func TestProxyStoreStat(t *testing.T) { - te := makeTestEnv(t, "foo/bar") - - remoteBlobCount := 1 - populate(t, te, remoteBlobCount, 10, 1) - - localStats := te.LocalStats() - remoteStats := te.RemoteStats() - - // Stat - touches both stores - for _, d := range te.inRemote { - _, err := te.store.Stat(te.ctx, d.Digest) - if err != nil { - t.Fatalf("Error stating proxy store") - } - } - - if (*localStats)["stat"] != remoteBlobCount { - t.Errorf("Unexpected local stat count") - } - - if (*remoteStats)["stat"] != remoteBlobCount { - t.Errorf("Unexpected remote stat count") - } - - if te.store.authChallenger.(*mockChallenger).count != len(te.inRemote) { - t.Fatalf("Unexpected auth challenge count, got %#v", te.store.authChallenger) - } - -} - -func TestProxyStoreServeHighConcurrency(t *testing.T) { - te := makeTestEnv(t, "foo/bar") - blobSize := 200 - blobCount := 10 - numUnique := 1 - populate(t, te, blobCount, blobSize, numUnique) - - numClients := 16 - testProxyStoreServe(t, te, numClients) -} - -func TestProxyStoreServeMany(t *testing.T) { - te := makeTestEnv(t, "foo/bar") - blobSize := 200 - blobCount := 10 - numUnique := 4 - populate(t, te, blobCount, blobSize, numUnique) - - numClients := 4 - testProxyStoreServe(t, te, numClients) -} - -// todo(richardscothern): blobCount must be smaller than num clients -func TestProxyStoreServeBig(t *testing.T) { - te := makeTestEnv(t, "foo/bar") - - blobSize := 2 << 20 - blobCount := 4 - numUnique := 2 - populate(t, te, blobCount, blobSize, numUnique) - - numClients := 4 - testProxyStoreServe(t, te, numClients) -} - -// testProxyStoreServe will create clients to consume all blobs -// populated in the truth store -func testProxyStoreServe(t *testing.T, te *testEnv, numClients int) { - localStats := te.LocalStats() - remoteStats := te.RemoteStats() - - var wg sync.WaitGroup - - for i := 0; i < numClients; i++ { - // Serveblob - pulls through blobs - wg.Add(1) - go func() { - defer wg.Done() - for _, remoteBlob := range te.inRemote { - w := httptest.NewRecorder() - r, err := http.NewRequest("GET", "", nil) - if err != nil { - t.Fatal(err) - } - - err = te.store.ServeBlob(te.ctx, w, r, remoteBlob.Digest) - if err != nil { - t.Fatalf(err.Error()) - } - - bodyBytes := w.Body.Bytes() - localDigest := digest.FromBytes(bodyBytes) - if localDigest != remoteBlob.Digest { - t.Fatalf("Mismatching blob fetch from proxy") - } - } - }() - } - - wg.Wait() - - remoteBlobCount := len(te.inRemote) - sbsMu.Lock() - if (*localStats)["stat"] != remoteBlobCount*numClients && (*localStats)["create"] != te.numUnique { - sbsMu.Unlock() - t.Fatal("Expected: stat:", remoteBlobCount*numClients, "create:", remoteBlobCount) - } - sbsMu.Unlock() - - // Wait for any async storage goroutines to finish - time.Sleep(3 * time.Second) - - sbsMu.Lock() - remoteStatCount := (*remoteStats)["stat"] - remoteOpenCount := (*remoteStats)["open"] - sbsMu.Unlock() - - // Serveblob - blobs come from local - for _, dr := range te.inRemote { - w := httptest.NewRecorder() - r, err := http.NewRequest("GET", "", nil) - if err != nil { - t.Fatal(err) - } - - err = te.store.ServeBlob(te.ctx, w, r, dr.Digest) - if err != nil { - t.Fatalf(err.Error()) - } - - dl := digest.FromBytes(w.Body.Bytes()) - if dl != dr.Digest { - t.Errorf("Mismatching blob fetch from proxy") - } - } - - localStats = te.LocalStats() - remoteStats = te.RemoteStats() - - // Ensure remote unchanged - sbsMu.Lock() - defer sbsMu.Unlock() - if (*remoteStats)["stat"] != remoteStatCount && (*remoteStats)["open"] != remoteOpenCount { - t.Fatalf("unexpected remote stats: %#v", remoteStats) - } -} diff --git a/vendor/github.com/docker/distribution/registry/proxy/proxymanifeststore.go b/vendor/github.com/docker/distribution/registry/proxy/proxymanifeststore.go deleted file mode 100644 index f08e285db..000000000 --- a/vendor/github.com/docker/distribution/registry/proxy/proxymanifeststore.go +++ /dev/null @@ -1,95 +0,0 @@ -package proxy - -import ( - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/proxy/scheduler" -) - -// todo(richardscothern): from cache control header or config -const repositoryTTL = time.Duration(24 * 7 * time.Hour) - -type proxyManifestStore struct { - ctx context.Context - localManifests distribution.ManifestService - remoteManifests distribution.ManifestService - repositoryName reference.Named - scheduler *scheduler.TTLExpirationScheduler - authChallenger authChallenger -} - -var _ distribution.ManifestService = &proxyManifestStore{} - -func (pms proxyManifestStore) Exists(ctx context.Context, dgst digest.Digest) (bool, error) { - exists, err := pms.localManifests.Exists(ctx, dgst) - if err != nil { - return false, err - } - if exists { - return true, nil - } - if err := pms.authChallenger.tryEstablishChallenges(ctx); err != nil { - return false, err - } - return pms.remoteManifests.Exists(ctx, dgst) -} - -func (pms proxyManifestStore) Get(ctx context.Context, dgst digest.Digest, options ...distribution.ManifestServiceOption) (distribution.Manifest, error) { - // At this point `dgst` was either specified explicitly, or returned by the - // tagstore with the most recent association. - var fromRemote bool - manifest, err := pms.localManifests.Get(ctx, dgst, options...) - if err != nil { - if err := pms.authChallenger.tryEstablishChallenges(ctx); err != nil { - return nil, err - } - - manifest, err = pms.remoteManifests.Get(ctx, dgst, options...) - if err != nil { - return nil, err - } - fromRemote = true - } - - _, payload, err := manifest.Payload() - if err != nil { - return nil, err - } - - proxyMetrics.ManifestPush(uint64(len(payload))) - if fromRemote { - proxyMetrics.ManifestPull(uint64(len(payload))) - - _, err = pms.localManifests.Put(ctx, manifest) - if err != nil { - return nil, err - } - - // Schedule the manifest blob for removal - repoBlob, err := reference.WithDigest(pms.repositoryName, dgst) - if err != nil { - context.GetLogger(ctx).Errorf("Error creating reference: %s", err) - return nil, err - } - - pms.scheduler.AddManifest(repoBlob, repositoryTTL) - // Ensure the manifest blob is cleaned up - //pms.scheduler.AddBlob(blobRef, repositoryTTL) - - } - - return manifest, err -} - -func (pms proxyManifestStore) Put(ctx context.Context, manifest distribution.Manifest, options ...distribution.ManifestServiceOption) (digest.Digest, error) { - var d digest.Digest - return d, distribution.ErrUnsupported -} - -func (pms proxyManifestStore) Delete(ctx context.Context, dgst digest.Digest) error { - return distribution.ErrUnsupported -} diff --git a/vendor/github.com/docker/distribution/registry/proxy/proxymanifeststore_test.go b/vendor/github.com/docker/distribution/registry/proxy/proxymanifeststore_test.go deleted file mode 100644 index 067e845a2..000000000 --- a/vendor/github.com/docker/distribution/registry/proxy/proxymanifeststore_test.go +++ /dev/null @@ -1,275 +0,0 @@ -package proxy - -import ( - "io" - "sync" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/client/auth" - "github.com/docker/distribution/registry/client/auth/challenge" - "github.com/docker/distribution/registry/proxy/scheduler" - "github.com/docker/distribution/registry/storage" - "github.com/docker/distribution/registry/storage/cache/memory" - "github.com/docker/distribution/registry/storage/driver/inmemory" - "github.com/docker/distribution/testutil" - "github.com/docker/libtrust" -) - -type statsManifest struct { - manifests distribution.ManifestService - stats map[string]int -} - -type manifestStoreTestEnv struct { - manifestDigest digest.Digest // digest of the signed manifest in the local storage - manifests proxyManifestStore -} - -func (te manifestStoreTestEnv) LocalStats() *map[string]int { - ls := te.manifests.localManifests.(statsManifest).stats - return &ls -} - -func (te manifestStoreTestEnv) RemoteStats() *map[string]int { - rs := te.manifests.remoteManifests.(statsManifest).stats - return &rs -} - -func (sm statsManifest) Delete(ctx context.Context, dgst digest.Digest) error { - sm.stats["delete"]++ - return sm.manifests.Delete(ctx, dgst) -} - -func (sm statsManifest) Exists(ctx context.Context, dgst digest.Digest) (bool, error) { - sm.stats["exists"]++ - return sm.manifests.Exists(ctx, dgst) -} - -func (sm statsManifest) Get(ctx context.Context, dgst digest.Digest, options ...distribution.ManifestServiceOption) (distribution.Manifest, error) { - sm.stats["get"]++ - return sm.manifests.Get(ctx, dgst) -} - -func (sm statsManifest) Put(ctx context.Context, manifest distribution.Manifest, options ...distribution.ManifestServiceOption) (digest.Digest, error) { - sm.stats["put"]++ - return sm.manifests.Put(ctx, manifest) -} - -type mockChallenger struct { - sync.Mutex - count int -} - -// Called for remote operations only -func (m *mockChallenger) tryEstablishChallenges(context.Context) error { - m.Lock() - defer m.Unlock() - m.count++ - return nil -} - -func (m *mockChallenger) credentialStore() auth.CredentialStore { - return nil -} - -func (m *mockChallenger) challengeManager() challenge.Manager { - return nil -} - -func newManifestStoreTestEnv(t *testing.T, name, tag string) *manifestStoreTestEnv { - nameRef, err := reference.ParseNamed(name) - if err != nil { - t.Fatalf("unable to parse reference: %s", err) - } - k, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatal(err) - } - - ctx := context.Background() - truthRegistry, err := storage.NewRegistry(ctx, inmemory.New(), - storage.BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), - storage.Schema1SigningKey(k)) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - truthRepo, err := truthRegistry.Repository(ctx, nameRef) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - tr, err := truthRepo.Manifests(ctx) - if err != nil { - t.Fatal(err.Error()) - } - truthManifests := statsManifest{ - manifests: tr, - stats: make(map[string]int), - } - - manifestDigest, err := populateRepo(ctx, t, truthRepo, name, tag) - if err != nil { - t.Fatalf(err.Error()) - } - - localRegistry, err := storage.NewRegistry(ctx, inmemory.New(), storage.BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), storage.EnableRedirect, storage.DisableDigestResumption, storage.Schema1SigningKey(k)) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - localRepo, err := localRegistry.Repository(ctx, nameRef) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - lr, err := localRepo.Manifests(ctx) - if err != nil { - t.Fatal(err.Error()) - } - - localManifests := statsManifest{ - manifests: lr, - stats: make(map[string]int), - } - - s := scheduler.New(ctx, inmemory.New(), "/scheduler-state.json") - return &manifestStoreTestEnv{ - manifestDigest: manifestDigest, - manifests: proxyManifestStore{ - ctx: ctx, - localManifests: localManifests, - remoteManifests: truthManifests, - scheduler: s, - repositoryName: nameRef, - authChallenger: &mockChallenger{}, - }, - } -} - -func populateRepo(ctx context.Context, t *testing.T, repository distribution.Repository, name, tag string) (digest.Digest, error) { - m := schema1.Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 1, - }, - Name: name, - Tag: tag, - } - - for i := 0; i < 2; i++ { - wr, err := repository.Blobs(ctx).Create(ctx) - if err != nil { - t.Fatalf("unexpected error creating test upload: %v", err) - } - - rs, ts, err := testutil.CreateRandomTarFile() - if err != nil { - t.Fatalf("unexpected error generating test layer file") - } - dgst := digest.Digest(ts) - if _, err := io.Copy(wr, rs); err != nil { - t.Fatalf("unexpected error copying to upload: %v", err) - } - - if _, err := wr.Commit(ctx, distribution.Descriptor{Digest: dgst}); err != nil { - t.Fatalf("unexpected error finishing upload: %v", err) - } - } - - pk, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatalf("unexpected error generating private key: %v", err) - } - - sm, err := schema1.Sign(&m, pk) - if err != nil { - t.Fatalf("error signing manifest: %v", err) - } - - ms, err := repository.Manifests(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - dgst, err := ms.Put(ctx, sm) - if err != nil { - t.Fatalf("unexpected errors putting manifest: %v", err) - } - - return dgst, nil -} - -// TestProxyManifests contains basic acceptance tests -// for the pull-through behavior -func TestProxyManifests(t *testing.T) { - name := "foo/bar" - env := newManifestStoreTestEnv(t, name, "latest") - - localStats := env.LocalStats() - remoteStats := env.RemoteStats() - - ctx := context.Background() - // Stat - must check local and remote - exists, err := env.manifests.Exists(ctx, env.manifestDigest) - if err != nil { - t.Fatalf("Error checking existence") - } - if !exists { - t.Errorf("Unexpected non-existant manifest") - } - - if (*localStats)["exists"] != 1 && (*remoteStats)["exists"] != 1 { - t.Errorf("Unexpected exists count : \n%v \n%v", localStats, remoteStats) - } - - if env.manifests.authChallenger.(*mockChallenger).count != 1 { - t.Fatalf("Expected 1 auth challenge, got %#v", env.manifests.authChallenger) - } - - // Get - should succeed and pull manifest into local - _, err = env.manifests.Get(ctx, env.manifestDigest) - if err != nil { - t.Fatal(err) - } - - if (*localStats)["get"] != 1 && (*remoteStats)["get"] != 1 { - t.Errorf("Unexpected get count") - } - - if (*localStats)["put"] != 1 { - t.Errorf("Expected local put") - } - - if env.manifests.authChallenger.(*mockChallenger).count != 2 { - t.Fatalf("Expected 2 auth challenges, got %#v", env.manifests.authChallenger) - } - - // Stat - should only go to local - exists, err = env.manifests.Exists(ctx, env.manifestDigest) - if err != nil { - t.Fatal(err) - } - if !exists { - t.Errorf("Unexpected non-existant manifest") - } - - if (*localStats)["exists"] != 2 && (*remoteStats)["exists"] != 1 { - t.Errorf("Unexpected exists count") - } - - if env.manifests.authChallenger.(*mockChallenger).count != 2 { - t.Fatalf("Expected 2 auth challenges, got %#v", env.manifests.authChallenger) - } - - // Get proxied - won't require another authchallenge - _, err = env.manifests.Get(ctx, env.manifestDigest) - if err != nil { - t.Fatal(err) - } - - if env.manifests.authChallenger.(*mockChallenger).count != 2 { - t.Fatalf("Expected 2 auth challenges, got %#v", env.manifests.authChallenger) - } - -} diff --git a/vendor/github.com/docker/distribution/registry/proxy/proxymetrics.go b/vendor/github.com/docker/distribution/registry/proxy/proxymetrics.go deleted file mode 100644 index d3d84d786..000000000 --- a/vendor/github.com/docker/distribution/registry/proxy/proxymetrics.go +++ /dev/null @@ -1,74 +0,0 @@ -package proxy - -import ( - "expvar" - "sync/atomic" -) - -// Metrics is used to hold metric counters -// related to the proxy -type Metrics struct { - Requests uint64 - Hits uint64 - Misses uint64 - BytesPulled uint64 - BytesPushed uint64 -} - -type proxyMetricsCollector struct { - blobMetrics Metrics - manifestMetrics Metrics -} - -// BlobPull tracks metrics about blobs pulled into the cache -func (pmc *proxyMetricsCollector) BlobPull(bytesPulled uint64) { - atomic.AddUint64(&pmc.blobMetrics.Misses, 1) - atomic.AddUint64(&pmc.blobMetrics.BytesPulled, bytesPulled) -} - -// BlobPush tracks metrics about blobs pushed to clients -func (pmc *proxyMetricsCollector) BlobPush(bytesPushed uint64) { - atomic.AddUint64(&pmc.blobMetrics.Requests, 1) - atomic.AddUint64(&pmc.blobMetrics.Hits, 1) - atomic.AddUint64(&pmc.blobMetrics.BytesPushed, bytesPushed) -} - -// ManifestPull tracks metrics related to Manifests pulled into the cache -func (pmc *proxyMetricsCollector) ManifestPull(bytesPulled uint64) { - atomic.AddUint64(&pmc.manifestMetrics.Misses, 1) - atomic.AddUint64(&pmc.manifestMetrics.BytesPulled, bytesPulled) -} - -// ManifestPush tracks metrics about manifests pushed to clients -func (pmc *proxyMetricsCollector) ManifestPush(bytesPushed uint64) { - atomic.AddUint64(&pmc.manifestMetrics.Requests, 1) - atomic.AddUint64(&pmc.manifestMetrics.Hits, 1) - atomic.AddUint64(&pmc.manifestMetrics.BytesPushed, bytesPushed) -} - -// proxyMetrics tracks metrics about the proxy cache. This is -// kept globally and made available via expvar. -var proxyMetrics = &proxyMetricsCollector{} - -func init() { - registry := expvar.Get("registry") - if registry == nil { - registry = expvar.NewMap("registry") - } - - pm := registry.(*expvar.Map).Get("proxy") - if pm == nil { - pm = &expvar.Map{} - pm.(*expvar.Map).Init() - registry.(*expvar.Map).Set("proxy", pm) - } - - pm.(*expvar.Map).Set("blobs", expvar.Func(func() interface{} { - return proxyMetrics.blobMetrics - })) - - pm.(*expvar.Map).Set("manifests", expvar.Func(func() interface{} { - return proxyMetrics.manifestMetrics - })) - -} diff --git a/vendor/github.com/docker/distribution/registry/proxy/proxyregistry.go b/vendor/github.com/docker/distribution/registry/proxy/proxyregistry.go deleted file mode 100644 index d64dcbb95..000000000 --- a/vendor/github.com/docker/distribution/registry/proxy/proxyregistry.go +++ /dev/null @@ -1,249 +0,0 @@ -package proxy - -import ( - "fmt" - "net/http" - "net/url" - "sync" - - "github.com/docker/distribution" - "github.com/docker/distribution/configuration" - "github.com/docker/distribution/context" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/client" - "github.com/docker/distribution/registry/client/auth" - "github.com/docker/distribution/registry/client/auth/challenge" - "github.com/docker/distribution/registry/client/transport" - "github.com/docker/distribution/registry/proxy/scheduler" - "github.com/docker/distribution/registry/storage" - "github.com/docker/distribution/registry/storage/driver" -) - -// proxyingRegistry fetches content from a remote registry and caches it locally -type proxyingRegistry struct { - embedded distribution.Namespace // provides local registry functionality - scheduler *scheduler.TTLExpirationScheduler - remoteURL url.URL - authChallenger authChallenger -} - -// NewRegistryPullThroughCache creates a registry acting as a pull through cache -func NewRegistryPullThroughCache(ctx context.Context, registry distribution.Namespace, driver driver.StorageDriver, config configuration.Proxy) (distribution.Namespace, error) { - remoteURL, err := url.Parse(config.RemoteURL) - if err != nil { - return nil, err - } - - v := storage.NewVacuum(ctx, driver) - s := scheduler.New(ctx, driver, "/scheduler-state.json") - s.OnBlobExpire(func(ref reference.Reference) error { - var r reference.Canonical - var ok bool - if r, ok = ref.(reference.Canonical); !ok { - return fmt.Errorf("unexpected reference type : %T", ref) - } - - repo, err := registry.Repository(ctx, r) - if err != nil { - return err - } - - blobs := repo.Blobs(ctx) - - // Clear the repository reference and descriptor caches - err = blobs.Delete(ctx, r.Digest()) - if err != nil { - return err - } - - err = v.RemoveBlob(r.Digest().String()) - if err != nil { - return err - } - - return nil - }) - - s.OnManifestExpire(func(ref reference.Reference) error { - var r reference.Canonical - var ok bool - if r, ok = ref.(reference.Canonical); !ok { - return fmt.Errorf("unexpected reference type : %T", ref) - } - - repo, err := registry.Repository(ctx, r) - if err != nil { - return err - } - - manifests, err := repo.Manifests(ctx) - if err != nil { - return err - } - err = manifests.Delete(ctx, r.Digest()) - if err != nil { - return err - } - return nil - }) - - err = s.Start() - if err != nil { - return nil, err - } - - cs, err := configureAuth(config.Username, config.Password, config.RemoteURL) - if err != nil { - return nil, err - } - - return &proxyingRegistry{ - embedded: registry, - scheduler: s, - remoteURL: *remoteURL, - authChallenger: &remoteAuthChallenger{ - remoteURL: *remoteURL, - cm: challenge.NewSimpleManager(), - cs: cs, - }, - }, nil -} - -func (pr *proxyingRegistry) Scope() distribution.Scope { - return distribution.GlobalScope -} - -func (pr *proxyingRegistry) Repositories(ctx context.Context, repos []string, last string) (n int, err error) { - return pr.embedded.Repositories(ctx, repos, last) -} - -func (pr *proxyingRegistry) Repository(ctx context.Context, name reference.Named) (distribution.Repository, error) { - c := pr.authChallenger - - tr := transport.NewTransport(http.DefaultTransport, - auth.NewAuthorizer(c.challengeManager(), auth.NewTokenHandler(http.DefaultTransport, c.credentialStore(), name.Name(), "pull"))) - - localRepo, err := pr.embedded.Repository(ctx, name) - if err != nil { - return nil, err - } - localManifests, err := localRepo.Manifests(ctx, storage.SkipLayerVerification()) - if err != nil { - return nil, err - } - - remoteRepo, err := client.NewRepository(ctx, name, pr.remoteURL.String(), tr) - if err != nil { - return nil, err - } - - remoteManifests, err := remoteRepo.Manifests(ctx) - if err != nil { - return nil, err - } - - return &proxiedRepository{ - blobStore: &proxyBlobStore{ - localStore: localRepo.Blobs(ctx), - remoteStore: remoteRepo.Blobs(ctx), - scheduler: pr.scheduler, - repositoryName: name, - authChallenger: pr.authChallenger, - }, - manifests: &proxyManifestStore{ - repositoryName: name, - localManifests: localManifests, // Options? - remoteManifests: remoteManifests, - ctx: ctx, - scheduler: pr.scheduler, - authChallenger: pr.authChallenger, - }, - name: name, - tags: &proxyTagService{ - localTags: localRepo.Tags(ctx), - remoteTags: remoteRepo.Tags(ctx), - authChallenger: pr.authChallenger, - }, - }, nil -} - -func (pr *proxyingRegistry) Blobs() distribution.BlobEnumerator { - return pr.embedded.Blobs() -} - -func (pr *proxyingRegistry) BlobStatter() distribution.BlobStatter { - return pr.embedded.BlobStatter() -} - -// authChallenger encapsulates a request to the upstream to establish credential challenges -type authChallenger interface { - tryEstablishChallenges(context.Context) error - challengeManager() challenge.Manager - credentialStore() auth.CredentialStore -} - -type remoteAuthChallenger struct { - remoteURL url.URL - sync.Mutex - cm challenge.Manager - cs auth.CredentialStore -} - -func (r *remoteAuthChallenger) credentialStore() auth.CredentialStore { - return r.cs -} - -func (r *remoteAuthChallenger) challengeManager() challenge.Manager { - return r.cm -} - -// tryEstablishChallenges will attempt to get a challenge type for the upstream if none currently exist -func (r *remoteAuthChallenger) tryEstablishChallenges(ctx context.Context) error { - r.Lock() - defer r.Unlock() - - remoteURL := r.remoteURL - remoteURL.Path = "/v2/" - challenges, err := r.cm.GetChallenges(remoteURL) - if err != nil { - return err - } - - if len(challenges) > 0 { - return nil - } - - // establish challenge type with upstream - if err := ping(r.cm, remoteURL.String(), challengeHeader); err != nil { - return err - } - - context.GetLogger(ctx).Infof("Challenge established with upstream : %s %s", remoteURL, r.cm) - return nil -} - -// proxiedRepository uses proxying blob and manifest services to serve content -// locally, or pulling it through from a remote and caching it locally if it doesn't -// already exist -type proxiedRepository struct { - blobStore distribution.BlobStore - manifests distribution.ManifestService - name reference.Named - tags distribution.TagService -} - -func (pr *proxiedRepository) Manifests(ctx context.Context, options ...distribution.ManifestServiceOption) (distribution.ManifestService, error) { - return pr.manifests, nil -} - -func (pr *proxiedRepository) Blobs(ctx context.Context) distribution.BlobStore { - return pr.blobStore -} - -func (pr *proxiedRepository) Named() reference.Named { - return pr.name -} - -func (pr *proxiedRepository) Tags(ctx context.Context) distribution.TagService { - return pr.tags -} diff --git a/vendor/github.com/docker/distribution/registry/proxy/proxytagservice.go b/vendor/github.com/docker/distribution/registry/proxy/proxytagservice.go deleted file mode 100644 index a8273030d..000000000 --- a/vendor/github.com/docker/distribution/registry/proxy/proxytagservice.go +++ /dev/null @@ -1,65 +0,0 @@ -package proxy - -import ( - "github.com/docker/distribution" - "github.com/docker/distribution/context" -) - -// proxyTagService supports local and remote lookup of tags. -type proxyTagService struct { - localTags distribution.TagService - remoteTags distribution.TagService - authChallenger authChallenger -} - -var _ distribution.TagService = proxyTagService{} - -// Get attempts to get the most recent digest for the tag by checking the remote -// tag service first and then caching it locally. If the remote is unavailable -// the local association is returned -func (pt proxyTagService) Get(ctx context.Context, tag string) (distribution.Descriptor, error) { - err := pt.authChallenger.tryEstablishChallenges(ctx) - if err == nil { - desc, err := pt.remoteTags.Get(ctx, tag) - if err == nil { - err := pt.localTags.Tag(ctx, tag, desc) - if err != nil { - return distribution.Descriptor{}, err - } - return desc, nil - } - } - - desc, err := pt.localTags.Get(ctx, tag) - if err != nil { - return distribution.Descriptor{}, err - } - return desc, nil -} - -func (pt proxyTagService) Tag(ctx context.Context, tag string, desc distribution.Descriptor) error { - return distribution.ErrUnsupported -} - -func (pt proxyTagService) Untag(ctx context.Context, tag string) error { - err := pt.localTags.Untag(ctx, tag) - if err != nil { - return err - } - return nil -} - -func (pt proxyTagService) All(ctx context.Context) ([]string, error) { - err := pt.authChallenger.tryEstablishChallenges(ctx) - if err == nil { - tags, err := pt.remoteTags.All(ctx) - if err == nil { - return tags, err - } - } - return pt.localTags.All(ctx) -} - -func (pt proxyTagService) Lookup(ctx context.Context, digest distribution.Descriptor) ([]string, error) { - return []string{}, distribution.ErrUnsupported -} diff --git a/vendor/github.com/docker/distribution/registry/proxy/proxytagservice_test.go b/vendor/github.com/docker/distribution/registry/proxy/proxytagservice_test.go deleted file mode 100644 index ce0fe78ba..000000000 --- a/vendor/github.com/docker/distribution/registry/proxy/proxytagservice_test.go +++ /dev/null @@ -1,182 +0,0 @@ -package proxy - -import ( - "reflect" - "sort" - "sync" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" -) - -type mockTagStore struct { - mapping map[string]distribution.Descriptor - sync.Mutex -} - -var _ distribution.TagService = &mockTagStore{} - -func (m *mockTagStore) Get(ctx context.Context, tag string) (distribution.Descriptor, error) { - m.Lock() - defer m.Unlock() - - if d, ok := m.mapping[tag]; ok { - return d, nil - } - return distribution.Descriptor{}, distribution.ErrTagUnknown{} -} - -func (m *mockTagStore) Tag(ctx context.Context, tag string, desc distribution.Descriptor) error { - m.Lock() - defer m.Unlock() - - m.mapping[tag] = desc - return nil -} - -func (m *mockTagStore) Untag(ctx context.Context, tag string) error { - m.Lock() - defer m.Unlock() - - if _, ok := m.mapping[tag]; ok { - delete(m.mapping, tag) - return nil - } - return distribution.ErrTagUnknown{} -} - -func (m *mockTagStore) All(ctx context.Context) ([]string, error) { - m.Lock() - defer m.Unlock() - - var tags []string - for tag := range m.mapping { - tags = append(tags, tag) - } - - return tags, nil -} - -func (m *mockTagStore) Lookup(ctx context.Context, digest distribution.Descriptor) ([]string, error) { - panic("not implemented") -} - -func testProxyTagService(local, remote map[string]distribution.Descriptor) *proxyTagService { - if local == nil { - local = make(map[string]distribution.Descriptor) - } - if remote == nil { - remote = make(map[string]distribution.Descriptor) - } - return &proxyTagService{ - localTags: &mockTagStore{mapping: local}, - remoteTags: &mockTagStore{mapping: remote}, - authChallenger: &mockChallenger{}, - } -} - -func TestGet(t *testing.T) { - remoteDesc := distribution.Descriptor{Size: 42} - remoteTag := "remote" - proxyTags := testProxyTagService(map[string]distribution.Descriptor{remoteTag: remoteDesc}, nil) - - ctx := context.Background() - - // Get pre-loaded tag - d, err := proxyTags.Get(ctx, remoteTag) - if err != nil { - t.Fatal(err) - } - - if proxyTags.authChallenger.(*mockChallenger).count != 1 { - t.Fatalf("Expected 1 auth challenge call, got %#v", proxyTags.authChallenger) - } - - if !reflect.DeepEqual(d, remoteDesc) { - t.Fatal("unable to get put tag") - } - - local, err := proxyTags.localTags.Get(ctx, remoteTag) - if err != nil { - t.Fatal("remote tag not pulled into store") - } - - if !reflect.DeepEqual(local, remoteDesc) { - t.Fatalf("unexpected descriptor pulled through") - } - - // Manually overwrite remote tag - newRemoteDesc := distribution.Descriptor{Size: 43} - err = proxyTags.remoteTags.Tag(ctx, remoteTag, newRemoteDesc) - if err != nil { - t.Fatal(err) - } - - d, err = proxyTags.Get(ctx, remoteTag) - if err != nil { - t.Fatal(err) - } - - if proxyTags.authChallenger.(*mockChallenger).count != 2 { - t.Fatalf("Expected 2 auth challenge calls, got %#v", proxyTags.authChallenger) - } - - if !reflect.DeepEqual(d, newRemoteDesc) { - t.Fatal("unable to get put tag") - } - - _, err = proxyTags.localTags.Get(ctx, remoteTag) - if err != nil { - t.Fatal("remote tag not pulled into store") - } - - // untag, ensure it's removed locally, but present in remote - err = proxyTags.Untag(ctx, remoteTag) - if err != nil { - t.Fatal(err) - } - - _, err = proxyTags.localTags.Get(ctx, remoteTag) - if err == nil { - t.Fatalf("Expected error getting Untag'd tag") - } - - _, err = proxyTags.remoteTags.Get(ctx, remoteTag) - if err != nil { - t.Fatalf("remote tag should not be untagged with proxyTag.Untag") - } - - _, err = proxyTags.Get(ctx, remoteTag) - if err != nil { - t.Fatal("untagged tag should be pulled through") - } - - if proxyTags.authChallenger.(*mockChallenger).count != 3 { - t.Fatalf("Expected 3 auth challenge calls, got %#v", proxyTags.authChallenger) - } - - // Add another tag. Ensure both tags appear in 'All' - err = proxyTags.remoteTags.Tag(ctx, "funtag", distribution.Descriptor{Size: 42}) - if err != nil { - t.Fatal(err) - } - - all, err := proxyTags.All(ctx) - if err != nil { - t.Fatal(err) - } - - if len(all) != 2 { - t.Fatalf("Unexpected tag length returned from All() : %d ", len(all)) - } - - sort.Strings(all) - if all[0] != "funtag" && all[1] != "remote" { - t.Fatalf("Unexpected tags returned from All() : %v ", all) - } - - if proxyTags.authChallenger.(*mockChallenger).count != 4 { - t.Fatalf("Expected 4 auth challenge calls, got %#v", proxyTags.authChallenger) - } -} diff --git a/vendor/github.com/docker/distribution/registry/proxy/scheduler/scheduler.go b/vendor/github.com/docker/distribution/registry/proxy/scheduler/scheduler.go deleted file mode 100644 index bde946576..000000000 --- a/vendor/github.com/docker/distribution/registry/proxy/scheduler/scheduler.go +++ /dev/null @@ -1,259 +0,0 @@ -package scheduler - -import ( - "encoding/json" - "fmt" - "sync" - "time" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/driver" -) - -// onTTLExpiryFunc is called when a repository's TTL expires -type expiryFunc func(reference.Reference) error - -const ( - entryTypeBlob = iota - entryTypeManifest - indexSaveFrequency = 5 * time.Second -) - -// schedulerEntry represents an entry in the scheduler -// fields are exported for serialization -type schedulerEntry struct { - Key string `json:"Key"` - Expiry time.Time `json:"ExpiryData"` - EntryType int `json:"EntryType"` - - timer *time.Timer -} - -// New returns a new instance of the scheduler -func New(ctx context.Context, driver driver.StorageDriver, path string) *TTLExpirationScheduler { - return &TTLExpirationScheduler{ - entries: make(map[string]*schedulerEntry), - driver: driver, - pathToStateFile: path, - ctx: ctx, - stopped: true, - doneChan: make(chan struct{}), - saveTimer: time.NewTicker(indexSaveFrequency), - } -} - -// TTLExpirationScheduler is a scheduler used to perform actions -// when TTLs expire -type TTLExpirationScheduler struct { - sync.Mutex - - entries map[string]*schedulerEntry - - driver driver.StorageDriver - ctx context.Context - pathToStateFile string - - stopped bool - - onBlobExpire expiryFunc - onManifestExpire expiryFunc - - indexDirty bool - saveTimer *time.Ticker - doneChan chan struct{} -} - -// OnBlobExpire is called when a scheduled blob's TTL expires -func (ttles *TTLExpirationScheduler) OnBlobExpire(f expiryFunc) { - ttles.Lock() - defer ttles.Unlock() - - ttles.onBlobExpire = f -} - -// OnManifestExpire is called when a scheduled manifest's TTL expires -func (ttles *TTLExpirationScheduler) OnManifestExpire(f expiryFunc) { - ttles.Lock() - defer ttles.Unlock() - - ttles.onManifestExpire = f -} - -// AddBlob schedules a blob cleanup after ttl expires -func (ttles *TTLExpirationScheduler) AddBlob(blobRef reference.Canonical, ttl time.Duration) error { - ttles.Lock() - defer ttles.Unlock() - - if ttles.stopped { - return fmt.Errorf("scheduler not started") - } - - ttles.add(blobRef, ttl, entryTypeBlob) - return nil -} - -// AddManifest schedules a manifest cleanup after ttl expires -func (ttles *TTLExpirationScheduler) AddManifest(manifestRef reference.Canonical, ttl time.Duration) error { - ttles.Lock() - defer ttles.Unlock() - - if ttles.stopped { - return fmt.Errorf("scheduler not started") - } - - ttles.add(manifestRef, ttl, entryTypeManifest) - return nil -} - -// Start starts the scheduler -func (ttles *TTLExpirationScheduler) Start() error { - ttles.Lock() - defer ttles.Unlock() - - err := ttles.readState() - if err != nil { - return err - } - - if !ttles.stopped { - return fmt.Errorf("Scheduler already started") - } - - context.GetLogger(ttles.ctx).Infof("Starting cached object TTL expiration scheduler...") - ttles.stopped = false - - // Start timer for each deserialized entry - for _, entry := range ttles.entries { - entry.timer = ttles.startTimer(entry, entry.Expiry.Sub(time.Now())) - } - - // Start a ticker to periodically save the entries index - - go func() { - for { - select { - case <-ttles.saveTimer.C: - ttles.Lock() - if !ttles.indexDirty { - ttles.Unlock() - continue - } - - err := ttles.writeState() - if err != nil { - context.GetLogger(ttles.ctx).Errorf("Error writing scheduler state: %s", err) - } else { - ttles.indexDirty = false - } - ttles.Unlock() - - case <-ttles.doneChan: - return - } - } - }() - - return nil -} - -func (ttles *TTLExpirationScheduler) add(r reference.Reference, ttl time.Duration, eType int) { - entry := &schedulerEntry{ - Key: r.String(), - Expiry: time.Now().Add(ttl), - EntryType: eType, - } - context.GetLogger(ttles.ctx).Infof("Adding new scheduler entry for %s with ttl=%s", entry.Key, entry.Expiry.Sub(time.Now())) - if oldEntry, present := ttles.entries[entry.Key]; present && oldEntry.timer != nil { - oldEntry.timer.Stop() - } - ttles.entries[entry.Key] = entry - entry.timer = ttles.startTimer(entry, ttl) - ttles.indexDirty = true -} - -func (ttles *TTLExpirationScheduler) startTimer(entry *schedulerEntry, ttl time.Duration) *time.Timer { - return time.AfterFunc(ttl, func() { - ttles.Lock() - defer ttles.Unlock() - - var f expiryFunc - - switch entry.EntryType { - case entryTypeBlob: - f = ttles.onBlobExpire - case entryTypeManifest: - f = ttles.onManifestExpire - default: - f = func(reference.Reference) error { - return fmt.Errorf("scheduler entry type") - } - } - - ref, err := reference.Parse(entry.Key) - if err == nil { - if err := f(ref); err != nil { - context.GetLogger(ttles.ctx).Errorf("Scheduler error returned from OnExpire(%s): %s", entry.Key, err) - } - } else { - context.GetLogger(ttles.ctx).Errorf("Error unpacking reference: %s", err) - } - - delete(ttles.entries, entry.Key) - ttles.indexDirty = true - }) -} - -// Stop stops the scheduler. -func (ttles *TTLExpirationScheduler) Stop() { - ttles.Lock() - defer ttles.Unlock() - - if err := ttles.writeState(); err != nil { - context.GetLogger(ttles.ctx).Errorf("Error writing scheduler state: %s", err) - } - - for _, entry := range ttles.entries { - entry.timer.Stop() - } - - close(ttles.doneChan) - ttles.saveTimer.Stop() - ttles.stopped = true -} - -func (ttles *TTLExpirationScheduler) writeState() error { - jsonBytes, err := json.Marshal(ttles.entries) - if err != nil { - return err - } - - err = ttles.driver.PutContent(ttles.ctx, ttles.pathToStateFile, jsonBytes) - if err != nil { - return err - } - - return nil -} - -func (ttles *TTLExpirationScheduler) readState() error { - if _, err := ttles.driver.Stat(ttles.ctx, ttles.pathToStateFile); err != nil { - switch err := err.(type) { - case driver.PathNotFoundError: - return nil - default: - return err - } - } - - bytes, err := ttles.driver.GetContent(ttles.ctx, ttles.pathToStateFile) - if err != nil { - return err - } - - err = json.Unmarshal(bytes, &ttles.entries) - if err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/proxy/scheduler/scheduler_test.go b/vendor/github.com/docker/distribution/registry/proxy/scheduler/scheduler_test.go deleted file mode 100644 index 4d69d5b55..000000000 --- a/vendor/github.com/docker/distribution/registry/proxy/scheduler/scheduler_test.go +++ /dev/null @@ -1,211 +0,0 @@ -package scheduler - -import ( - "encoding/json" - "sync" - "testing" - "time" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/driver/inmemory" -) - -func testRefs(t *testing.T) (reference.Reference, reference.Reference, reference.Reference) { - ref1, err := reference.Parse("testrepo@sha256:aaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - - ref2, err := reference.Parse("testrepo@sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - - ref3, err := reference.Parse("testrepo@sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - - return ref1, ref2, ref3 -} - -func TestSchedule(t *testing.T) { - ref1, ref2, ref3 := testRefs(t) - timeUnit := time.Millisecond - remainingRepos := map[string]bool{ - ref1.String(): true, - ref2.String(): true, - ref3.String(): true, - } - - var mu sync.Mutex - s := New(context.Background(), inmemory.New(), "/ttl") - deleteFunc := func(repoName reference.Reference) error { - if len(remainingRepos) == 0 { - t.Fatalf("Incorrect expiry count") - } - _, ok := remainingRepos[repoName.String()] - if !ok { - t.Fatalf("Trying to remove nonexistent repo: %s", repoName) - } - t.Log("removing", repoName) - mu.Lock() - delete(remainingRepos, repoName.String()) - mu.Unlock() - - return nil - } - s.onBlobExpire = deleteFunc - err := s.Start() - if err != nil { - t.Fatalf("Error starting ttlExpirationScheduler: %s", err) - } - - s.add(ref1, 3*timeUnit, entryTypeBlob) - s.add(ref2, 1*timeUnit, entryTypeBlob) - - func() { - s.Lock() - s.add(ref3, 1*timeUnit, entryTypeBlob) - s.Unlock() - - }() - - // Ensure all repos are deleted - <-time.After(50 * timeUnit) - - mu.Lock() - defer mu.Unlock() - if len(remainingRepos) != 0 { - t.Fatalf("Repositories remaining: %#v", remainingRepos) - } -} - -func TestRestoreOld(t *testing.T) { - ref1, ref2, _ := testRefs(t) - remainingRepos := map[string]bool{ - ref1.String(): true, - ref2.String(): true, - } - - var wg sync.WaitGroup - wg.Add(len(remainingRepos)) - var mu sync.Mutex - deleteFunc := func(r reference.Reference) error { - mu.Lock() - defer mu.Unlock() - if r.String() == ref1.String() && len(remainingRepos) == 2 { - t.Errorf("ref1 should not be removed first") - } - _, ok := remainingRepos[r.String()] - if !ok { - t.Fatalf("Trying to remove nonexistent repo: %s", r) - } - delete(remainingRepos, r.String()) - wg.Done() - return nil - } - - timeUnit := time.Millisecond - serialized, err := json.Marshal(&map[string]schedulerEntry{ - ref1.String(): { - Expiry: time.Now().Add(10 * timeUnit), - Key: ref1.String(), - EntryType: 0, - }, - ref2.String(): { - Expiry: time.Now().Add(-3 * timeUnit), // TTL passed, should be removed first - Key: ref2.String(), - EntryType: 0, - }, - }) - if err != nil { - t.Fatalf("Error serializing test data: %s", err.Error()) - } - - ctx := context.Background() - pathToStatFile := "/ttl" - fs := inmemory.New() - err = fs.PutContent(ctx, pathToStatFile, serialized) - if err != nil { - t.Fatal("Unable to write serialized data to fs") - } - s := New(context.Background(), fs, "/ttl") - s.OnBlobExpire(deleteFunc) - err = s.Start() - if err != nil { - t.Fatalf("Error starting ttlExpirationScheduler: %s", err) - } - defer s.Stop() - - wg.Wait() - mu.Lock() - defer mu.Unlock() - if len(remainingRepos) != 0 { - t.Fatalf("Repositories remaining: %#v", remainingRepos) - } -} - -func TestStopRestore(t *testing.T) { - ref1, ref2, _ := testRefs(t) - - timeUnit := time.Millisecond - remainingRepos := map[string]bool{ - ref1.String(): true, - ref2.String(): true, - } - - var mu sync.Mutex - deleteFunc := func(r reference.Reference) error { - mu.Lock() - delete(remainingRepos, r.String()) - mu.Unlock() - return nil - } - - fs := inmemory.New() - pathToStateFile := "/ttl" - s := New(context.Background(), fs, pathToStateFile) - s.onBlobExpire = deleteFunc - - err := s.Start() - if err != nil { - t.Fatalf(err.Error()) - } - s.add(ref1, 300*timeUnit, entryTypeBlob) - s.add(ref2, 100*timeUnit, entryTypeBlob) - - // Start and stop before all operations complete - // state will be written to fs - s.Stop() - time.Sleep(10 * time.Millisecond) - - // v2 will restore state from fs - s2 := New(context.Background(), fs, pathToStateFile) - s2.onBlobExpire = deleteFunc - err = s2.Start() - if err != nil { - t.Fatalf("Error starting v2: %s", err.Error()) - } - - <-time.After(500 * timeUnit) - mu.Lock() - defer mu.Unlock() - if len(remainingRepos) != 0 { - t.Fatalf("Repositories remaining: %#v", remainingRepos) - } - -} - -func TestDoubleStart(t *testing.T) { - s := New(context.Background(), inmemory.New(), "/ttl") - err := s.Start() - if err != nil { - t.Fatalf("Unable to start scheduler") - } - err = s.Start() - if err == nil { - t.Fatalf("Scheduler started twice without error") - } -} diff --git a/vendor/github.com/docker/distribution/registry/registry.go b/vendor/github.com/docker/distribution/registry/registry.go deleted file mode 100644 index 2adcb1e3e..000000000 --- a/vendor/github.com/docker/distribution/registry/registry.go +++ /dev/null @@ -1,356 +0,0 @@ -package registry - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "io/ioutil" - "net/http" - "os" - "time" - - "rsc.io/letsencrypt" - - log "github.com/Sirupsen/logrus" - "github.com/Sirupsen/logrus/formatters/logstash" - "github.com/bugsnag/bugsnag-go" - "github.com/docker/distribution/configuration" - "github.com/docker/distribution/context" - "github.com/docker/distribution/health" - "github.com/docker/distribution/registry/handlers" - "github.com/docker/distribution/registry/listener" - "github.com/docker/distribution/uuid" - "github.com/docker/distribution/version" - gorhandlers "github.com/gorilla/handlers" - "github.com/spf13/cobra" - "github.com/yvasiyarov/gorelic" -) - -// ServeCmd is a cobra command for running the registry. -var ServeCmd = &cobra.Command{ - Use: "serve ", - Short: "`serve` stores and distributes Docker images", - Long: "`serve` stores and distributes Docker images.", - Run: func(cmd *cobra.Command, args []string) { - - // setup context - ctx := context.WithVersion(context.Background(), version.Version) - - config, err := resolveConfiguration(args) - if err != nil { - fmt.Fprintf(os.Stderr, "configuration error: %v\n", err) - cmd.Usage() - os.Exit(1) - } - - if config.HTTP.Debug.Addr != "" { - go func(addr string) { - log.Infof("debug server listening %v", addr) - if err := http.ListenAndServe(addr, nil); err != nil { - log.Fatalf("error listening on debug interface: %v", err) - } - }(config.HTTP.Debug.Addr) - } - - registry, err := NewRegistry(ctx, config) - if err != nil { - log.Fatalln(err) - } - - if err = registry.ListenAndServe(); err != nil { - log.Fatalln(err) - } - }, -} - -// A Registry represents a complete instance of the registry. -// TODO(aaronl): It might make sense for Registry to become an interface. -type Registry struct { - config *configuration.Configuration - app *handlers.App - server *http.Server -} - -// NewRegistry creates a new registry from a context and configuration struct. -func NewRegistry(ctx context.Context, config *configuration.Configuration) (*Registry, error) { - var err error - ctx, err = configureLogging(ctx, config) - if err != nil { - return nil, fmt.Errorf("error configuring logger: %v", err) - } - - // inject a logger into the uuid library. warns us if there is a problem - // with uuid generation under low entropy. - uuid.Loggerf = context.GetLogger(ctx).Warnf - - app := handlers.NewApp(ctx, config) - // TODO(aaronl): The global scope of the health checks means NewRegistry - // can only be called once per process. - app.RegisterHealthChecks() - handler := configureReporting(app) - handler = alive("/", handler) - handler = health.Handler(handler) - handler = panicHandler(handler) - if !config.Log.AccessLog.Disabled { - handler = gorhandlers.CombinedLoggingHandler(os.Stdout, handler) - } - - server := &http.Server{ - Handler: handler, - } - - return &Registry{ - app: app, - config: config, - server: server, - }, nil -} - -// ListenAndServe runs the registry's HTTP server. -func (registry *Registry) ListenAndServe() error { - config := registry.config - - ln, err := listener.NewListener(config.HTTP.Net, config.HTTP.Addr) - if err != nil { - return err - } - - if config.HTTP.TLS.Certificate != "" || config.HTTP.TLS.LetsEncrypt.CacheFile != "" { - tlsConf := &tls.Config{ - ClientAuth: tls.NoClientCert, - NextProtos: nextProtos(config), - MinVersion: tls.VersionTLS10, - PreferServerCipherSuites: true, - CipherSuites: []uint16{ - tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - tls.TLS_RSA_WITH_AES_128_CBC_SHA, - tls.TLS_RSA_WITH_AES_256_CBC_SHA, - }, - } - - if config.HTTP.TLS.LetsEncrypt.CacheFile != "" { - if config.HTTP.TLS.Certificate != "" { - return fmt.Errorf("cannot specify both certificate and Let's Encrypt") - } - var m letsencrypt.Manager - if err := m.CacheFile(config.HTTP.TLS.LetsEncrypt.CacheFile); err != nil { - return err - } - if !m.Registered() { - if err := m.Register(config.HTTP.TLS.LetsEncrypt.Email, nil); err != nil { - return err - } - } - tlsConf.GetCertificate = m.GetCertificate - } else { - tlsConf.Certificates = make([]tls.Certificate, 1) - tlsConf.Certificates[0], err = tls.LoadX509KeyPair(config.HTTP.TLS.Certificate, config.HTTP.TLS.Key) - if err != nil { - return err - } - } - - if len(config.HTTP.TLS.ClientCAs) != 0 { - pool := x509.NewCertPool() - - for _, ca := range config.HTTP.TLS.ClientCAs { - caPem, err := ioutil.ReadFile(ca) - if err != nil { - return err - } - - if ok := pool.AppendCertsFromPEM(caPem); !ok { - return fmt.Errorf("Could not add CA to pool") - } - } - - for _, subj := range pool.Subjects() { - context.GetLogger(registry.app).Debugf("CA Subject: %s", string(subj)) - } - - tlsConf.ClientAuth = tls.RequireAndVerifyClientCert - tlsConf.ClientCAs = pool - } - - ln = tls.NewListener(ln, tlsConf) - context.GetLogger(registry.app).Infof("listening on %v, tls", ln.Addr()) - } else { - context.GetLogger(registry.app).Infof("listening on %v", ln.Addr()) - } - - return registry.server.Serve(ln) -} - -func configureReporting(app *handlers.App) http.Handler { - var handler http.Handler = app - - if app.Config.Reporting.Bugsnag.APIKey != "" { - bugsnagConfig := bugsnag.Configuration{ - APIKey: app.Config.Reporting.Bugsnag.APIKey, - // TODO(brianbland): provide the registry version here - // AppVersion: "2.0", - } - if app.Config.Reporting.Bugsnag.ReleaseStage != "" { - bugsnagConfig.ReleaseStage = app.Config.Reporting.Bugsnag.ReleaseStage - } - if app.Config.Reporting.Bugsnag.Endpoint != "" { - bugsnagConfig.Endpoint = app.Config.Reporting.Bugsnag.Endpoint - } - bugsnag.Configure(bugsnagConfig) - - handler = bugsnag.Handler(handler) - } - - if app.Config.Reporting.NewRelic.LicenseKey != "" { - agent := gorelic.NewAgent() - agent.NewrelicLicense = app.Config.Reporting.NewRelic.LicenseKey - if app.Config.Reporting.NewRelic.Name != "" { - agent.NewrelicName = app.Config.Reporting.NewRelic.Name - } - agent.CollectHTTPStat = true - agent.Verbose = app.Config.Reporting.NewRelic.Verbose - agent.Run() - - handler = agent.WrapHTTPHandler(handler) - } - - return handler -} - -// configureLogging prepares the context with a logger using the -// configuration. -func configureLogging(ctx context.Context, config *configuration.Configuration) (context.Context, error) { - if config.Log.Level == "" && config.Log.Formatter == "" { - // If no config for logging is set, fallback to deprecated "Loglevel". - log.SetLevel(logLevel(config.Loglevel)) - ctx = context.WithLogger(ctx, context.GetLogger(ctx)) - return ctx, nil - } - - log.SetLevel(logLevel(config.Log.Level)) - - formatter := config.Log.Formatter - if formatter == "" { - formatter = "text" // default formatter - } - - switch formatter { - case "json": - log.SetFormatter(&log.JSONFormatter{ - TimestampFormat: time.RFC3339Nano, - }) - case "text": - log.SetFormatter(&log.TextFormatter{ - TimestampFormat: time.RFC3339Nano, - }) - case "logstash": - log.SetFormatter(&logstash.LogstashFormatter{ - TimestampFormat: time.RFC3339Nano, - }) - default: - // just let the library use default on empty string. - if config.Log.Formatter != "" { - return ctx, fmt.Errorf("unsupported logging formatter: %q", config.Log.Formatter) - } - } - - if config.Log.Formatter != "" { - log.Debugf("using %q logging formatter", config.Log.Formatter) - } - - if len(config.Log.Fields) > 0 { - // build up the static fields, if present. - var fields []interface{} - for k := range config.Log.Fields { - fields = append(fields, k) - } - - ctx = context.WithValues(ctx, config.Log.Fields) - ctx = context.WithLogger(ctx, context.GetLogger(ctx, fields...)) - } - - return ctx, nil -} - -func logLevel(level configuration.Loglevel) log.Level { - l, err := log.ParseLevel(string(level)) - if err != nil { - l = log.InfoLevel - log.Warnf("error parsing level %q: %v, using %q ", level, err, l) - } - - return l -} - -// panicHandler add an HTTP handler to web app. The handler recover the happening -// panic. logrus.Panic transmits panic message to pre-config log hooks, which is -// defined in config.yml. -func panicHandler(handler http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - defer func() { - if err := recover(); err != nil { - log.Panic(fmt.Sprintf("%v", err)) - } - }() - handler.ServeHTTP(w, r) - }) -} - -// alive simply wraps the handler with a route that always returns an http 200 -// response when the path is matched. If the path is not matched, the request -// is passed to the provided handler. There is no guarantee of anything but -// that the server is up. Wrap with other handlers (such as health.Handler) -// for greater affect. -func alive(path string, handler http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path == path { - w.Header().Set("Cache-Control", "no-cache") - w.WriteHeader(http.StatusOK) - return - } - - handler.ServeHTTP(w, r) - }) -} - -func resolveConfiguration(args []string) (*configuration.Configuration, error) { - var configurationPath string - - if len(args) > 0 { - configurationPath = args[0] - } else if os.Getenv("REGISTRY_CONFIGURATION_PATH") != "" { - configurationPath = os.Getenv("REGISTRY_CONFIGURATION_PATH") - } - - if configurationPath == "" { - return nil, fmt.Errorf("configuration path unspecified") - } - - fp, err := os.Open(configurationPath) - if err != nil { - return nil, err - } - - defer fp.Close() - - config, err := configuration.Parse(fp) - if err != nil { - return nil, fmt.Errorf("error parsing %s: %v", configurationPath, err) - } - - return config, nil -} - -func nextProtos(config *configuration.Configuration) []string { - switch config.HTTP.HTTP2.Disabled { - case true: - return []string{"http/1.1"} - default: - return []string{"h2", "http/1.1"} - } -} diff --git a/vendor/github.com/docker/distribution/registry/registry_test.go b/vendor/github.com/docker/distribution/registry/registry_test.go deleted file mode 100644 index 346731179..000000000 --- a/vendor/github.com/docker/distribution/registry/registry_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package registry - -import ( - "reflect" - "testing" - - "github.com/docker/distribution/configuration" -) - -// Tests to ensure nextProtos returns the correct protocols when: -// * config.HTTP.HTTP2.Disabled is not explicitly set => [h2 http/1.1] -// * config.HTTP.HTTP2.Disabled is explicitly set to false [h2 http/1.1] -// * config.HTTP.HTTP2.Disabled is explicitly set to true [http/1.1] -func TestNextProtos(t *testing.T) { - config := &configuration.Configuration{} - protos := nextProtos(config) - if !reflect.DeepEqual(protos, []string{"h2", "http/1.1"}) { - t.Fatalf("expected protos to equal [h2 http/1.1], got %s", protos) - } - config.HTTP.HTTP2.Disabled = false - protos = nextProtos(config) - if !reflect.DeepEqual(protos, []string{"h2", "http/1.1"}) { - t.Fatalf("expected protos to equal [h2 http/1.1], got %s", protos) - } - config.HTTP.HTTP2.Disabled = true - protos = nextProtos(config) - if !reflect.DeepEqual(protos, []string{"http/1.1"}) { - t.Fatalf("expected protos to equal [http/1.1], got %s", protos) - } -} diff --git a/vendor/github.com/docker/distribution/registry/root.go b/vendor/github.com/docker/distribution/registry/root.go deleted file mode 100644 index 5d3005c26..000000000 --- a/vendor/github.com/docker/distribution/registry/root.go +++ /dev/null @@ -1,84 +0,0 @@ -package registry - -import ( - "fmt" - "os" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/storage" - "github.com/docker/distribution/registry/storage/driver/factory" - "github.com/docker/distribution/version" - "github.com/docker/libtrust" - "github.com/spf13/cobra" -) - -var showVersion bool - -func init() { - RootCmd.AddCommand(ServeCmd) - RootCmd.AddCommand(GCCmd) - GCCmd.Flags().BoolVarP(&dryRun, "dry-run", "d", false, "do everything except remove the blobs") - RootCmd.Flags().BoolVarP(&showVersion, "version", "v", false, "show the version and exit") -} - -// RootCmd is the main command for the 'registry' binary. -var RootCmd = &cobra.Command{ - Use: "registry", - Short: "`registry`", - Long: "`registry`", - Run: func(cmd *cobra.Command, args []string) { - if showVersion { - version.PrintVersion() - return - } - cmd.Usage() - }, -} - -var dryRun bool - -// GCCmd is the cobra command that corresponds to the garbage-collect subcommand -var GCCmd = &cobra.Command{ - Use: "garbage-collect ", - Short: "`garbage-collect` deletes layers not referenced by any manifests", - Long: "`garbage-collect` deletes layers not referenced by any manifests", - Run: func(cmd *cobra.Command, args []string) { - config, err := resolveConfiguration(args) - if err != nil { - fmt.Fprintf(os.Stderr, "configuration error: %v\n", err) - cmd.Usage() - os.Exit(1) - } - - driver, err := factory.Create(config.Storage.Type(), config.Storage.Parameters()) - if err != nil { - fmt.Fprintf(os.Stderr, "failed to construct %s driver: %v", config.Storage.Type(), err) - os.Exit(1) - } - - ctx := context.Background() - ctx, err = configureLogging(ctx, config) - if err != nil { - fmt.Fprintf(os.Stderr, "unable to configure logging with config: %s", err) - os.Exit(1) - } - - k, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - fmt.Fprint(os.Stderr, err) - os.Exit(1) - } - - registry, err := storage.NewRegistry(ctx, driver, storage.Schema1SigningKey(k)) - if err != nil { - fmt.Fprintf(os.Stderr, "failed to construct registry: %v", err) - os.Exit(1) - } - - err = storage.MarkAndSweep(ctx, driver, registry, dryRun) - if err != nil { - fmt.Fprintf(os.Stderr, "failed to garbage collect: %v", err) - os.Exit(1) - } - }, -} diff --git a/vendor/github.com/docker/distribution/registry/storage/blob_test.go b/vendor/github.com/docker/distribution/registry/storage/blob_test.go deleted file mode 100644 index 767526bb2..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/blob_test.go +++ /dev/null @@ -1,614 +0,0 @@ -package storage - -import ( - "bytes" - "crypto/sha256" - "fmt" - "io" - "io/ioutil" - "os" - "path" - "reflect" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/cache/memory" - "github.com/docker/distribution/registry/storage/driver/testdriver" - "github.com/docker/distribution/testutil" -) - -// TestWriteSeek tests that the current file size can be -// obtained using Seek -func TestWriteSeek(t *testing.T) { - ctx := context.Background() - imageName, _ := reference.ParseNamed("foo/bar") - driver := testdriver.New() - registry, err := NewRegistry(ctx, driver, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableDelete, EnableRedirect) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - repository, err := registry.Repository(ctx, imageName) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - bs := repository.Blobs(ctx) - - blobUpload, err := bs.Create(ctx) - - if err != nil { - t.Fatalf("unexpected error starting layer upload: %s", err) - } - contents := []byte{1, 2, 3} - blobUpload.Write(contents) - blobUpload.Close() - offset := blobUpload.Size() - if offset != int64(len(contents)) { - t.Fatalf("unexpected value for blobUpload offset: %v != %v", offset, len(contents)) - } - -} - -// TestSimpleBlobUpload covers the blob upload process, exercising common -// error paths that might be seen during an upload. -func TestSimpleBlobUpload(t *testing.T) { - randomDataReader, dgst, err := testutil.CreateRandomTarFile() - if err != nil { - t.Fatalf("error creating random reader: %v", err) - } - - ctx := context.Background() - imageName, _ := reference.ParseNamed("foo/bar") - driver := testdriver.New() - registry, err := NewRegistry(ctx, driver, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableDelete, EnableRedirect) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - repository, err := registry.Repository(ctx, imageName) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - bs := repository.Blobs(ctx) - - h := sha256.New() - rd := io.TeeReader(randomDataReader, h) - - blobUpload, err := bs.Create(ctx) - - if err != nil { - t.Fatalf("unexpected error starting layer upload: %s", err) - } - - // Cancel the upload then restart it - if err := blobUpload.Cancel(ctx); err != nil { - t.Fatalf("unexpected error during upload cancellation: %v", err) - } - - // get the enclosing directory - uploadPath := path.Dir(blobUpload.(*blobWriter).path) - - // ensure state was cleaned up - _, err = driver.List(ctx, uploadPath) - if err == nil { - t.Fatal("files in upload path after cleanup") - } - - // Do a resume, get unknown upload - blobUpload, err = bs.Resume(ctx, blobUpload.ID()) - if err != distribution.ErrBlobUploadUnknown { - t.Fatalf("unexpected error resuming upload, should be unknown: %v", err) - } - - // Restart! - blobUpload, err = bs.Create(ctx) - if err != nil { - t.Fatalf("unexpected error starting layer upload: %s", err) - } - - // Get the size of our random tarfile - randomDataSize, err := seekerSize(randomDataReader) - if err != nil { - t.Fatalf("error getting seeker size of random data: %v", err) - } - - nn, err := io.Copy(blobUpload, rd) - if err != nil { - t.Fatalf("unexpected error uploading layer data: %v", err) - } - - if nn != randomDataSize { - t.Fatalf("layer data write incomplete") - } - - blobUpload.Close() - - offset := blobUpload.Size() - if offset != nn { - t.Fatalf("blobUpload not updated with correct offset: %v != %v", offset, nn) - } - - // Do a resume, for good fun - blobUpload, err = bs.Resume(ctx, blobUpload.ID()) - if err != nil { - t.Fatalf("unexpected error resuming upload: %v", err) - } - - sha256Digest := digest.NewDigest("sha256", h) - desc, err := blobUpload.Commit(ctx, distribution.Descriptor{Digest: dgst}) - if err != nil { - t.Fatalf("unexpected error finishing layer upload: %v", err) - } - - // ensure state was cleaned up - uploadPath = path.Dir(blobUpload.(*blobWriter).path) - _, err = driver.List(ctx, uploadPath) - if err == nil { - t.Fatal("files in upload path after commit") - } - - // After finishing an upload, it should no longer exist. - if _, err := bs.Resume(ctx, blobUpload.ID()); err != distribution.ErrBlobUploadUnknown { - t.Fatalf("expected layer upload to be unknown, got %v", err) - } - - // Test for existence. - statDesc, err := bs.Stat(ctx, desc.Digest) - if err != nil { - t.Fatalf("unexpected error checking for existence: %v, %#v", err, bs) - } - - if !reflect.DeepEqual(statDesc, desc) { - t.Fatalf("descriptors not equal: %v != %v", statDesc, desc) - } - - rc, err := bs.Open(ctx, desc.Digest) - if err != nil { - t.Fatalf("unexpected error opening blob for read: %v", err) - } - defer rc.Close() - - h.Reset() - nn, err = io.Copy(h, rc) - if err != nil { - t.Fatalf("error reading layer: %v", err) - } - - if nn != randomDataSize { - t.Fatalf("incorrect read length") - } - - if digest.NewDigest("sha256", h) != sha256Digest { - t.Fatalf("unexpected digest from uploaded layer: %q != %q", digest.NewDigest("sha256", h), sha256Digest) - } - - // Delete a blob - err = bs.Delete(ctx, desc.Digest) - if err != nil { - t.Fatalf("Unexpected error deleting blob") - } - - d, err := bs.Stat(ctx, desc.Digest) - if err == nil { - t.Fatalf("unexpected non-error stating deleted blob: %v", d) - } - - switch err { - case distribution.ErrBlobUnknown: - break - default: - t.Errorf("Unexpected error type stat-ing deleted manifest: %#v", err) - } - - _, err = bs.Open(ctx, desc.Digest) - if err == nil { - t.Fatalf("unexpected success opening deleted blob for read") - } - - switch err { - case distribution.ErrBlobUnknown: - break - default: - t.Errorf("Unexpected error type getting deleted manifest: %#v", err) - } - - // Re-upload the blob - randomBlob, err := ioutil.ReadAll(randomDataReader) - if err != nil { - t.Fatalf("Error reading all of blob %s", err.Error()) - } - expectedDigest := digest.FromBytes(randomBlob) - simpleUpload(t, bs, randomBlob, expectedDigest) - - d, err = bs.Stat(ctx, expectedDigest) - if err != nil { - t.Errorf("unexpected error stat-ing blob") - } - if d.Digest != expectedDigest { - t.Errorf("Mismatching digest with restored blob") - } - - _, err = bs.Open(ctx, expectedDigest) - if err != nil { - t.Errorf("Unexpected error opening blob") - } - - // Reuse state to test delete with a delete-disabled registry - registry, err = NewRegistry(ctx, driver, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableRedirect) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - repository, err = registry.Repository(ctx, imageName) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - bs = repository.Blobs(ctx) - err = bs.Delete(ctx, desc.Digest) - if err == nil { - t.Errorf("Unexpected success deleting while disabled") - } -} - -// TestSimpleBlobRead just creates a simple blob file and ensures that basic -// open, read, seek, read works. More specific edge cases should be covered in -// other tests. -func TestSimpleBlobRead(t *testing.T) { - ctx := context.Background() - imageName, _ := reference.ParseNamed("foo/bar") - driver := testdriver.New() - registry, err := NewRegistry(ctx, driver, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableDelete, EnableRedirect) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - repository, err := registry.Repository(ctx, imageName) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - bs := repository.Blobs(ctx) - - randomLayerReader, dgst, err := testutil.CreateRandomTarFile() // TODO(stevvooe): Consider using just a random string. - if err != nil { - t.Fatalf("error creating random data: %v", err) - } - - // Test for existence. - desc, err := bs.Stat(ctx, dgst) - if err != distribution.ErrBlobUnknown { - t.Fatalf("expected not found error when testing for existence: %v", err) - } - - rc, err := bs.Open(ctx, dgst) - if err != distribution.ErrBlobUnknown { - t.Fatalf("expected not found error when opening non-existent blob: %v", err) - } - - randomLayerSize, err := seekerSize(randomLayerReader) - if err != nil { - t.Fatalf("error getting seeker size for random layer: %v", err) - } - - descBefore := distribution.Descriptor{Digest: dgst, MediaType: "application/octet-stream", Size: randomLayerSize} - t.Logf("desc: %v", descBefore) - - desc, err = addBlob(ctx, bs, descBefore, randomLayerReader) - if err != nil { - t.Fatalf("error adding blob to blobservice: %v", err) - } - - if desc.Size != randomLayerSize { - t.Fatalf("committed blob has incorrect length: %v != %v", desc.Size, randomLayerSize) - } - - rc, err = bs.Open(ctx, desc.Digest) // note that we are opening with original digest. - if err != nil { - t.Fatalf("error opening blob with %v: %v", dgst, err) - } - defer rc.Close() - - // Now check the sha digest and ensure its the same - h := sha256.New() - nn, err := io.Copy(h, rc) - if err != nil { - t.Fatalf("unexpected error copying to hash: %v", err) - } - - if nn != randomLayerSize { - t.Fatalf("stored incorrect number of bytes in blob: %d != %d", nn, randomLayerSize) - } - - sha256Digest := digest.NewDigest("sha256", h) - if sha256Digest != desc.Digest { - t.Fatalf("fetched digest does not match: %q != %q", sha256Digest, desc.Digest) - } - - // Now seek back the blob, read the whole thing and check against randomLayerData - offset, err := rc.Seek(0, os.SEEK_SET) - if err != nil { - t.Fatalf("error seeking blob: %v", err) - } - - if offset != 0 { - t.Fatalf("seek failed: expected 0 offset, got %d", offset) - } - - p, err := ioutil.ReadAll(rc) - if err != nil { - t.Fatalf("error reading all of blob: %v", err) - } - - if len(p) != int(randomLayerSize) { - t.Fatalf("blob data read has different length: %v != %v", len(p), randomLayerSize) - } - - // Reset the randomLayerReader and read back the buffer - _, err = randomLayerReader.Seek(0, os.SEEK_SET) - if err != nil { - t.Fatalf("error resetting layer reader: %v", err) - } - - randomLayerData, err := ioutil.ReadAll(randomLayerReader) - if err != nil { - t.Fatalf("random layer read failed: %v", err) - } - - if !bytes.Equal(p, randomLayerData) { - t.Fatalf("layer data not equal") - } -} - -// TestBlobMount covers the blob mount process, exercising common -// error paths that might be seen during a mount. -func TestBlobMount(t *testing.T) { - randomDataReader, dgst, err := testutil.CreateRandomTarFile() - if err != nil { - t.Fatalf("error creating random reader: %v", err) - } - - ctx := context.Background() - imageName, _ := reference.ParseNamed("foo/bar") - sourceImageName, _ := reference.ParseNamed("foo/source") - driver := testdriver.New() - registry, err := NewRegistry(ctx, driver, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableDelete, EnableRedirect) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - - repository, err := registry.Repository(ctx, imageName) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - sourceRepository, err := registry.Repository(ctx, sourceImageName) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - - sbs := sourceRepository.Blobs(ctx) - - blobUpload, err := sbs.Create(ctx) - - if err != nil { - t.Fatalf("unexpected error starting layer upload: %s", err) - } - - // Get the size of our random tarfile - randomDataSize, err := seekerSize(randomDataReader) - if err != nil { - t.Fatalf("error getting seeker size of random data: %v", err) - } - - nn, err := io.Copy(blobUpload, randomDataReader) - if err != nil { - t.Fatalf("unexpected error uploading layer data: %v", err) - } - - desc, err := blobUpload.Commit(ctx, distribution.Descriptor{Digest: dgst}) - if err != nil { - t.Fatalf("unexpected error finishing layer upload: %v", err) - } - - // Test for existence. - statDesc, err := sbs.Stat(ctx, desc.Digest) - if err != nil { - t.Fatalf("unexpected error checking for existence: %v, %#v", err, sbs) - } - - if !reflect.DeepEqual(statDesc, desc) { - t.Fatalf("descriptors not equal: %v != %v", statDesc, desc) - } - - bs := repository.Blobs(ctx) - // Test destination for existence. - statDesc, err = bs.Stat(ctx, desc.Digest) - if err == nil { - t.Fatalf("unexpected non-error stating unmounted blob: %v", desc) - } - - canonicalRef, err := reference.WithDigest(sourceRepository.Named(), desc.Digest) - if err != nil { - t.Fatal(err) - } - - bw, err := bs.Create(ctx, WithMountFrom(canonicalRef)) - if bw != nil { - t.Fatal("unexpected blobwriter returned from Create call, should mount instead") - } - - ebm, ok := err.(distribution.ErrBlobMounted) - if !ok { - t.Fatalf("unexpected error mounting layer: %v", err) - } - - if !reflect.DeepEqual(ebm.Descriptor, desc) { - t.Fatalf("descriptors not equal: %v != %v", ebm.Descriptor, desc) - } - - // Test for existence. - statDesc, err = bs.Stat(ctx, desc.Digest) - if err != nil { - t.Fatalf("unexpected error checking for existence: %v, %#v", err, bs) - } - - if !reflect.DeepEqual(statDesc, desc) { - t.Fatalf("descriptors not equal: %v != %v", statDesc, desc) - } - - rc, err := bs.Open(ctx, desc.Digest) - if err != nil { - t.Fatalf("unexpected error opening blob for read: %v", err) - } - defer rc.Close() - - h := sha256.New() - nn, err = io.Copy(h, rc) - if err != nil { - t.Fatalf("error reading layer: %v", err) - } - - if nn != randomDataSize { - t.Fatalf("incorrect read length") - } - - if digest.NewDigest("sha256", h) != dgst { - t.Fatalf("unexpected digest from uploaded layer: %q != %q", digest.NewDigest("sha256", h), dgst) - } - - // Delete the blob from the source repo - err = sbs.Delete(ctx, desc.Digest) - if err != nil { - t.Fatalf("Unexpected error deleting blob") - } - - d, err := bs.Stat(ctx, desc.Digest) - if err != nil { - t.Fatalf("unexpected error stating blob deleted from source repository: %v", err) - } - - d, err = sbs.Stat(ctx, desc.Digest) - if err == nil { - t.Fatalf("unexpected non-error stating deleted blob: %v", d) - } - - switch err { - case distribution.ErrBlobUnknown: - break - default: - t.Errorf("Unexpected error type stat-ing deleted manifest: %#v", err) - } - - // Delete the blob from the dest repo - err = bs.Delete(ctx, desc.Digest) - if err != nil { - t.Fatalf("Unexpected error deleting blob") - } - - d, err = bs.Stat(ctx, desc.Digest) - if err == nil { - t.Fatalf("unexpected non-error stating deleted blob: %v", d) - } - - switch err { - case distribution.ErrBlobUnknown: - break - default: - t.Errorf("Unexpected error type stat-ing deleted manifest: %#v", err) - } -} - -// TestLayerUploadZeroLength uploads zero-length -func TestLayerUploadZeroLength(t *testing.T) { - ctx := context.Background() - imageName, _ := reference.ParseNamed("foo/bar") - driver := testdriver.New() - registry, err := NewRegistry(ctx, driver, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableDelete, EnableRedirect) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - repository, err := registry.Repository(ctx, imageName) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - bs := repository.Blobs(ctx) - - simpleUpload(t, bs, []byte{}, digest.DigestSha256EmptyTar) -} - -func simpleUpload(t *testing.T, bs distribution.BlobIngester, blob []byte, expectedDigest digest.Digest) { - ctx := context.Background() - wr, err := bs.Create(ctx) - if err != nil { - t.Fatalf("unexpected error starting upload: %v", err) - } - - nn, err := io.Copy(wr, bytes.NewReader(blob)) - if err != nil { - t.Fatalf("error copying into blob writer: %v", err) - } - - if nn != 0 { - t.Fatalf("unexpected number of bytes copied: %v > 0", nn) - } - - dgst, err := digest.FromReader(bytes.NewReader(blob)) - if err != nil { - t.Fatalf("error getting digest: %v", err) - } - - if dgst != expectedDigest { - // sanity check on zero digest - t.Fatalf("digest not as expected: %v != %v", dgst, expectedDigest) - } - - desc, err := wr.Commit(ctx, distribution.Descriptor{Digest: dgst}) - if err != nil { - t.Fatalf("unexpected error committing write: %v", err) - } - - if desc.Digest != dgst { - t.Fatalf("unexpected digest: %v != %v", desc.Digest, dgst) - } -} - -// seekerSize seeks to the end of seeker, checks the size and returns it to -// the original state, returning the size. The state of the seeker should be -// treated as unknown if an error is returned. -func seekerSize(seeker io.ReadSeeker) (int64, error) { - current, err := seeker.Seek(0, os.SEEK_CUR) - if err != nil { - return 0, err - } - - end, err := seeker.Seek(0, os.SEEK_END) - if err != nil { - return 0, err - } - - resumed, err := seeker.Seek(current, os.SEEK_SET) - if err != nil { - return 0, err - } - - if resumed != current { - return 0, fmt.Errorf("error returning seeker to original state, could not seek back to original location") - } - - return end, nil -} - -// addBlob simply consumes the reader and inserts into the blob service, -// returning a descriptor on success. -func addBlob(ctx context.Context, bs distribution.BlobIngester, desc distribution.Descriptor, rd io.Reader) (distribution.Descriptor, error) { - wr, err := bs.Create(ctx) - if err != nil { - return distribution.Descriptor{}, err - } - defer wr.Cancel(ctx) - - if nn, err := io.Copy(wr, rd); err != nil { - return distribution.Descriptor{}, err - } else if nn != desc.Size { - return distribution.Descriptor{}, fmt.Errorf("incorrect number of bytes copied: %v != %v", nn, desc.Size) - } - - return wr.Commit(ctx, desc) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/blobcachemetrics.go b/vendor/github.com/docker/distribution/registry/storage/blobcachemetrics.go deleted file mode 100644 index fad0a77a1..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/blobcachemetrics.go +++ /dev/null @@ -1,60 +0,0 @@ -package storage - -import ( - "expvar" - "sync/atomic" - - "github.com/docker/distribution/registry/storage/cache" -) - -type blobStatCollector struct { - metrics cache.Metrics -} - -func (bsc *blobStatCollector) Hit() { - atomic.AddUint64(&bsc.metrics.Requests, 1) - atomic.AddUint64(&bsc.metrics.Hits, 1) -} - -func (bsc *blobStatCollector) Miss() { - atomic.AddUint64(&bsc.metrics.Requests, 1) - atomic.AddUint64(&bsc.metrics.Misses, 1) -} - -func (bsc *blobStatCollector) Metrics() cache.Metrics { - return bsc.metrics -} - -// blobStatterCacheMetrics keeps track of cache metrics for blob descriptor -// cache requests. Note this is kept globally and made available via expvar. -// For more detailed metrics, its recommend to instrument a particular cache -// implementation. -var blobStatterCacheMetrics cache.MetricsTracker = &blobStatCollector{} - -func init() { - registry := expvar.Get("registry") - if registry == nil { - registry = expvar.NewMap("registry") - } - - cache := registry.(*expvar.Map).Get("cache") - if cache == nil { - cache = &expvar.Map{} - cache.(*expvar.Map).Init() - registry.(*expvar.Map).Set("cache", cache) - } - - storage := cache.(*expvar.Map).Get("storage") - if storage == nil { - storage = &expvar.Map{} - storage.(*expvar.Map).Init() - cache.(*expvar.Map).Set("storage", storage) - } - - storage.(*expvar.Map).Set("blobdescriptor", expvar.Func(func() interface{} { - // no need for synchronous access: the increments are atomic and - // during reading, we don't care if the data is up to date. The - // numbers will always *eventually* be reported correctly. - return blobStatterCacheMetrics - })) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/blobserver.go b/vendor/github.com/docker/distribution/registry/storage/blobserver.go deleted file mode 100644 index 2655e0113..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/blobserver.go +++ /dev/null @@ -1,78 +0,0 @@ -package storage - -import ( - "fmt" - "net/http" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/registry/storage/driver" -) - -// TODO(stevvooe): This should configurable in the future. -const blobCacheControlMaxAge = 365 * 24 * time.Hour - -// blobServer simply serves blobs from a driver instance using a path function -// to identify paths and a descriptor service to fill in metadata. -type blobServer struct { - driver driver.StorageDriver - statter distribution.BlobStatter - pathFn func(dgst digest.Digest) (string, error) - redirect bool // allows disabling URLFor redirects -} - -func (bs *blobServer) ServeBlob(ctx context.Context, w http.ResponseWriter, r *http.Request, dgst digest.Digest) error { - desc, err := bs.statter.Stat(ctx, dgst) - if err != nil { - return err - } - - path, err := bs.pathFn(desc.Digest) - if err != nil { - return err - } - - if bs.redirect { - redirectURL, err := bs.driver.URLFor(ctx, path, map[string]interface{}{"method": r.Method}) - switch err.(type) { - case nil: - // Redirect to storage URL. - http.Redirect(w, r, redirectURL, http.StatusTemporaryRedirect) - return err - - case driver.ErrUnsupportedMethod: - // Fallback to serving the content directly. - default: - // Some unexpected error. - return err - } - } - - br, err := newFileReader(ctx, bs.driver, path, desc.Size) - if err != nil { - return err - } - defer br.Close() - - w.Header().Set("ETag", fmt.Sprintf(`"%s"`, desc.Digest)) // If-None-Match handled by ServeContent - w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%.f", blobCacheControlMaxAge.Seconds())) - - if w.Header().Get("Docker-Content-Digest") == "" { - w.Header().Set("Docker-Content-Digest", desc.Digest.String()) - } - - if w.Header().Get("Content-Type") == "" { - // Set the content type if not already set. - w.Header().Set("Content-Type", desc.MediaType) - } - - if w.Header().Get("Content-Length") == "" { - // Set the content length if not already set. - w.Header().Set("Content-Length", fmt.Sprint(desc.Size)) - } - - http.ServeContent(w, r, desc.Digest.String(), time.Time{}, br) - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/blobstore.go b/vendor/github.com/docker/distribution/registry/storage/blobstore.go deleted file mode 100644 index 2cbbc9b1c..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/blobstore.go +++ /dev/null @@ -1,223 +0,0 @@ -package storage - -import ( - "path" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/registry/storage/driver" -) - -// blobStore implements the read side of the blob store interface over a -// driver without enforcing per-repository membership. This object is -// intentionally a leaky abstraction, providing utility methods that support -// creating and traversing backend links. -type blobStore struct { - driver driver.StorageDriver - statter distribution.BlobStatter -} - -var _ distribution.BlobProvider = &blobStore{} - -// Get implements the BlobReadService.Get call. -func (bs *blobStore) Get(ctx context.Context, dgst digest.Digest) ([]byte, error) { - bp, err := bs.path(dgst) - if err != nil { - return nil, err - } - - p, err := getContent(ctx, bs.driver, bp) - if err != nil { - switch err.(type) { - case driver.PathNotFoundError: - return nil, distribution.ErrBlobUnknown - } - - return nil, err - } - - return p, nil -} - -func (bs *blobStore) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { - desc, err := bs.statter.Stat(ctx, dgst) - if err != nil { - return nil, err - } - - path, err := bs.path(desc.Digest) - if err != nil { - return nil, err - } - - return newFileReader(ctx, bs.driver, path, desc.Size) -} - -// Put stores the content p in the blob store, calculating the digest. If the -// content is already present, only the digest will be returned. This should -// only be used for small objects, such as manifests. This implemented as a convenience for other Put implementations -func (bs *blobStore) Put(ctx context.Context, mediaType string, p []byte) (distribution.Descriptor, error) { - dgst := digest.FromBytes(p) - desc, err := bs.statter.Stat(ctx, dgst) - if err == nil { - // content already present - return desc, nil - } else if err != distribution.ErrBlobUnknown { - context.GetLogger(ctx).Errorf("blobStore: error stating content (%v): %v", dgst, err) - // real error, return it - return distribution.Descriptor{}, err - } - - bp, err := bs.path(dgst) - if err != nil { - return distribution.Descriptor{}, err - } - - // TODO(stevvooe): Write out mediatype here, as well. - return distribution.Descriptor{ - Size: int64(len(p)), - - // NOTE(stevvooe): The central blob store firewalls media types from - // other users. The caller should look this up and override the value - // for the specific repository. - MediaType: "application/octet-stream", - Digest: dgst, - }, bs.driver.PutContent(ctx, bp, p) -} - -func (bs *blobStore) Enumerate(ctx context.Context, ingester func(dgst digest.Digest) error) error { - - specPath, err := pathFor(blobsPathSpec{}) - if err != nil { - return err - } - - err = Walk(ctx, bs.driver, specPath, func(fileInfo driver.FileInfo) error { - // skip directories - if fileInfo.IsDir() { - return nil - } - - currentPath := fileInfo.Path() - // we only want to parse paths that end with /data - _, fileName := path.Split(currentPath) - if fileName != "data" { - return nil - } - - digest, err := digestFromPath(currentPath) - if err != nil { - return err - } - - return ingester(digest) - }) - return err -} - -// path returns the canonical path for the blob identified by digest. The blob -// may or may not exist. -func (bs *blobStore) path(dgst digest.Digest) (string, error) { - bp, err := pathFor(blobDataPathSpec{ - digest: dgst, - }) - - if err != nil { - return "", err - } - - return bp, nil -} - -// link links the path to the provided digest by writing the digest into the -// target file. Caller must ensure that the blob actually exists. -func (bs *blobStore) link(ctx context.Context, path string, dgst digest.Digest) error { - // The contents of the "link" file are the exact string contents of the - // digest, which is specified in that package. - return bs.driver.PutContent(ctx, path, []byte(dgst)) -} - -// readlink returns the linked digest at path. -func (bs *blobStore) readlink(ctx context.Context, path string) (digest.Digest, error) { - content, err := bs.driver.GetContent(ctx, path) - if err != nil { - return "", err - } - - linked, err := digest.ParseDigest(string(content)) - if err != nil { - return "", err - } - - return linked, nil -} - -// resolve reads the digest link at path and returns the blob store path. -func (bs *blobStore) resolve(ctx context.Context, path string) (string, error) { - dgst, err := bs.readlink(ctx, path) - if err != nil { - return "", err - } - - return bs.path(dgst) -} - -type blobStatter struct { - driver driver.StorageDriver -} - -var _ distribution.BlobDescriptorService = &blobStatter{} - -// Stat implements BlobStatter.Stat by returning the descriptor for the blob -// in the main blob store. If this method returns successfully, there is -// strong guarantee that the blob exists and is available. -func (bs *blobStatter) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - path, err := pathFor(blobDataPathSpec{ - digest: dgst, - }) - - if err != nil { - return distribution.Descriptor{}, err - } - - fi, err := bs.driver.Stat(ctx, path) - if err != nil { - switch err := err.(type) { - case driver.PathNotFoundError: - return distribution.Descriptor{}, distribution.ErrBlobUnknown - default: - return distribution.Descriptor{}, err - } - } - - if fi.IsDir() { - // NOTE(stevvooe): This represents a corruption situation. Somehow, we - // calculated a blob path and then detected a directory. We log the - // error and then error on the side of not knowing about the blob. - context.GetLogger(ctx).Warnf("blob path should not be a directory: %q", path) - return distribution.Descriptor{}, distribution.ErrBlobUnknown - } - - // TODO(stevvooe): Add method to resolve the mediatype. We can store and - // cache a "global" media type for the blob, even if a specific repo has a - // mediatype that overrides the main one. - - return distribution.Descriptor{ - Size: fi.Size(), - - // NOTE(stevvooe): The central blob store firewalls media types from - // other users. The caller should look this up and override the value - // for the specific repository. - MediaType: "application/octet-stream", - Digest: dgst, - }, nil -} - -func (bs *blobStatter) Clear(ctx context.Context, dgst digest.Digest) error { - return distribution.ErrUnsupported -} - -func (bs *blobStatter) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { - return distribution.ErrUnsupported -} diff --git a/vendor/github.com/docker/distribution/registry/storage/blobwriter.go b/vendor/github.com/docker/distribution/registry/storage/blobwriter.go deleted file mode 100644 index 668a6fc9b..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/blobwriter.go +++ /dev/null @@ -1,399 +0,0 @@ -package storage - -import ( - "errors" - "fmt" - "io" - "path" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - storagedriver "github.com/docker/distribution/registry/storage/driver" -) - -var ( - errResumableDigestNotAvailable = errors.New("resumable digest not available") -) - -// blobWriter is used to control the various aspects of resumable -// blob upload. -type blobWriter struct { - ctx context.Context - blobStore *linkedBlobStore - - id string - startedAt time.Time - digester digest.Digester - written int64 // track the contiguous write - - fileWriter storagedriver.FileWriter - driver storagedriver.StorageDriver - path string - - resumableDigestEnabled bool - committed bool -} - -var _ distribution.BlobWriter = &blobWriter{} - -// ID returns the identifier for this upload. -func (bw *blobWriter) ID() string { - return bw.id -} - -func (bw *blobWriter) StartedAt() time.Time { - return bw.startedAt -} - -// Commit marks the upload as completed, returning a valid descriptor. The -// final size and digest are checked against the first descriptor provided. -func (bw *blobWriter) Commit(ctx context.Context, desc distribution.Descriptor) (distribution.Descriptor, error) { - context.GetLogger(ctx).Debug("(*blobWriter).Commit") - - if err := bw.fileWriter.Commit(); err != nil { - return distribution.Descriptor{}, err - } - - bw.Close() - desc.Size = bw.Size() - - canonical, err := bw.validateBlob(ctx, desc) - if err != nil { - return distribution.Descriptor{}, err - } - - if err := bw.moveBlob(ctx, canonical); err != nil { - return distribution.Descriptor{}, err - } - - if err := bw.blobStore.linkBlob(ctx, canonical, desc.Digest); err != nil { - return distribution.Descriptor{}, err - } - - if err := bw.removeResources(ctx); err != nil { - return distribution.Descriptor{}, err - } - - err = bw.blobStore.blobAccessController.SetDescriptor(ctx, canonical.Digest, canonical) - if err != nil { - return distribution.Descriptor{}, err - } - - bw.committed = true - return canonical, nil -} - -// Cancel the blob upload process, releasing any resources associated with -// the writer and canceling the operation. -func (bw *blobWriter) Cancel(ctx context.Context) error { - context.GetLogger(ctx).Debug("(*blobWriter).Cancel") - if err := bw.fileWriter.Cancel(); err != nil { - return err - } - - if err := bw.Close(); err != nil { - context.GetLogger(ctx).Errorf("error closing blobwriter: %s", err) - } - - if err := bw.removeResources(ctx); err != nil { - return err - } - - return nil -} - -func (bw *blobWriter) Size() int64 { - return bw.fileWriter.Size() -} - -func (bw *blobWriter) Write(p []byte) (int, error) { - // Ensure that the current write offset matches how many bytes have been - // written to the digester. If not, we need to update the digest state to - // match the current write position. - if err := bw.resumeDigest(bw.blobStore.ctx); err != nil && err != errResumableDigestNotAvailable { - return 0, err - } - - n, err := io.MultiWriter(bw.fileWriter, bw.digester.Hash()).Write(p) - bw.written += int64(n) - - return n, err -} - -func (bw *blobWriter) ReadFrom(r io.Reader) (n int64, err error) { - // Ensure that the current write offset matches how many bytes have been - // written to the digester. If not, we need to update the digest state to - // match the current write position. - if err := bw.resumeDigest(bw.blobStore.ctx); err != nil && err != errResumableDigestNotAvailable { - return 0, err - } - - nn, err := io.Copy(io.MultiWriter(bw.fileWriter, bw.digester.Hash()), r) - bw.written += nn - - return nn, err -} - -func (bw *blobWriter) Close() error { - if bw.committed { - return errors.New("blobwriter close after commit") - } - - if err := bw.storeHashState(bw.blobStore.ctx); err != nil && err != errResumableDigestNotAvailable { - return err - } - - return bw.fileWriter.Close() -} - -// validateBlob checks the data against the digest, returning an error if it -// does not match. The canonical descriptor is returned. -func (bw *blobWriter) validateBlob(ctx context.Context, desc distribution.Descriptor) (distribution.Descriptor, error) { - var ( - verified, fullHash bool - canonical digest.Digest - ) - - if desc.Digest == "" { - // if no descriptors are provided, we have nothing to validate - // against. We don't really want to support this for the registry. - return distribution.Descriptor{}, distribution.ErrBlobInvalidDigest{ - Reason: fmt.Errorf("cannot validate against empty digest"), - } - } - - var size int64 - - // Stat the on disk file - if fi, err := bw.driver.Stat(ctx, bw.path); err != nil { - switch err := err.(type) { - case storagedriver.PathNotFoundError: - // NOTE(stevvooe): We really don't care if the file is - // not actually present for the reader. We now assume - // that the desc length is zero. - desc.Size = 0 - default: - // Any other error we want propagated up the stack. - return distribution.Descriptor{}, err - } - } else { - if fi.IsDir() { - return distribution.Descriptor{}, fmt.Errorf("unexpected directory at upload location %q", bw.path) - } - - size = fi.Size() - } - - if desc.Size > 0 { - if desc.Size != size { - return distribution.Descriptor{}, distribution.ErrBlobInvalidLength - } - } else { - // if provided 0 or negative length, we can assume caller doesn't know or - // care about length. - desc.Size = size - } - - // TODO(stevvooe): This section is very meandering. Need to be broken down - // to be a lot more clear. - - if err := bw.resumeDigest(ctx); err == nil { - canonical = bw.digester.Digest() - - if canonical.Algorithm() == desc.Digest.Algorithm() { - // Common case: client and server prefer the same canonical digest - // algorithm - currently SHA256. - verified = desc.Digest == canonical - } else { - // The client wants to use a different digest algorithm. They'll just - // have to be patient and wait for us to download and re-hash the - // uploaded content using that digest algorithm. - fullHash = true - } - } else if err == errResumableDigestNotAvailable { - // Not using resumable digests, so we need to hash the entire layer. - fullHash = true - } else { - return distribution.Descriptor{}, err - } - - if fullHash { - // a fantastic optimization: if the the written data and the size are - // the same, we don't need to read the data from the backend. This is - // because we've written the entire file in the lifecycle of the - // current instance. - if bw.written == size && digest.Canonical == desc.Digest.Algorithm() { - canonical = bw.digester.Digest() - verified = desc.Digest == canonical - } - - // If the check based on size fails, we fall back to the slowest of - // paths. We may be able to make the size-based check a stronger - // guarantee, so this may be defensive. - if !verified { - digester := digest.Canonical.New() - - digestVerifier, err := digest.NewDigestVerifier(desc.Digest) - if err != nil { - return distribution.Descriptor{}, err - } - - // Read the file from the backend driver and validate it. - fr, err := newFileReader(ctx, bw.driver, bw.path, desc.Size) - if err != nil { - return distribution.Descriptor{}, err - } - defer fr.Close() - - tr := io.TeeReader(fr, digester.Hash()) - - if _, err := io.Copy(digestVerifier, tr); err != nil { - return distribution.Descriptor{}, err - } - - canonical = digester.Digest() - verified = digestVerifier.Verified() - } - } - - if !verified { - context.GetLoggerWithFields(ctx, - map[interface{}]interface{}{ - "canonical": canonical, - "provided": desc.Digest, - }, "canonical", "provided"). - Errorf("canonical digest does match provided digest") - return distribution.Descriptor{}, distribution.ErrBlobInvalidDigest{ - Digest: desc.Digest, - Reason: fmt.Errorf("content does not match digest"), - } - } - - // update desc with canonical hash - desc.Digest = canonical - - if desc.MediaType == "" { - desc.MediaType = "application/octet-stream" - } - - return desc, nil -} - -// moveBlob moves the data into its final, hash-qualified destination, -// identified by dgst. The layer should be validated before commencing the -// move. -func (bw *blobWriter) moveBlob(ctx context.Context, desc distribution.Descriptor) error { - blobPath, err := pathFor(blobDataPathSpec{ - digest: desc.Digest, - }) - - if err != nil { - return err - } - - // Check for existence - if _, err := bw.blobStore.driver.Stat(ctx, blobPath); err != nil { - switch err := err.(type) { - case storagedriver.PathNotFoundError: - break // ensure that it doesn't exist. - default: - return err - } - } else { - // If the path exists, we can assume that the content has already - // been uploaded, since the blob storage is content-addressable. - // While it may be corrupted, detection of such corruption belongs - // elsewhere. - return nil - } - - // If no data was received, we may not actually have a file on disk. Check - // the size here and write a zero-length file to blobPath if this is the - // case. For the most part, this should only ever happen with zero-length - // tars. - if _, err := bw.blobStore.driver.Stat(ctx, bw.path); err != nil { - switch err := err.(type) { - case storagedriver.PathNotFoundError: - // HACK(stevvooe): This is slightly dangerous: if we verify above, - // get a hash, then the underlying file is deleted, we risk moving - // a zero-length blob into a nonzero-length blob location. To - // prevent this horrid thing, we employ the hack of only allowing - // to this happen for the digest of an empty tar. - if desc.Digest == digest.DigestSha256EmptyTar { - return bw.blobStore.driver.PutContent(ctx, blobPath, []byte{}) - } - - // We let this fail during the move below. - logrus. - WithField("upload.id", bw.ID()). - WithField("digest", desc.Digest).Warnf("attempted to move zero-length content with non-zero digest") - default: - return err // unrelated error - } - } - - // TODO(stevvooe): We should also write the mediatype when executing this move. - - return bw.blobStore.driver.Move(ctx, bw.path, blobPath) -} - -// removeResources should clean up all resources associated with the upload -// instance. An error will be returned if the clean up cannot proceed. If the -// resources are already not present, no error will be returned. -func (bw *blobWriter) removeResources(ctx context.Context) error { - dataPath, err := pathFor(uploadDataPathSpec{ - name: bw.blobStore.repository.Named().Name(), - id: bw.id, - }) - - if err != nil { - return err - } - - // Resolve and delete the containing directory, which should include any - // upload related files. - dirPath := path.Dir(dataPath) - if err := bw.blobStore.driver.Delete(ctx, dirPath); err != nil { - switch err := err.(type) { - case storagedriver.PathNotFoundError: - break // already gone! - default: - // This should be uncommon enough such that returning an error - // should be okay. At this point, the upload should be mostly - // complete, but perhaps the backend became unaccessible. - context.GetLogger(ctx).Errorf("unable to delete layer upload resources %q: %v", dirPath, err) - return err - } - } - - return nil -} - -func (bw *blobWriter) Reader() (io.ReadCloser, error) { - // todo(richardscothern): Change to exponential backoff, i=0.5, e=2, n=4 - try := 1 - for try <= 5 { - _, err := bw.driver.Stat(bw.ctx, bw.path) - if err == nil { - break - } - switch err.(type) { - case storagedriver.PathNotFoundError: - context.GetLogger(bw.ctx).Debugf("Nothing found on try %d, sleeping...", try) - time.Sleep(1 * time.Second) - try++ - default: - return nil, err - } - } - - readCloser, err := bw.driver.Reader(bw.ctx, bw.path, 0) - if err != nil { - return nil, err - } - - return readCloser, nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/blobwriter_nonresumable.go b/vendor/github.com/docker/distribution/registry/storage/blobwriter_nonresumable.go deleted file mode 100644 index 32f130974..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/blobwriter_nonresumable.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build noresumabledigest - -package storage - -import ( - "github.com/docker/distribution/context" -) - -// resumeHashAt is a noop when resumable digest support is disabled. -func (bw *blobWriter) resumeDigest(ctx context.Context) error { - return errResumableDigestNotAvailable -} - -// storeHashState is a noop when resumable digest support is disabled. -func (bw *blobWriter) storeHashState(ctx context.Context) error { - return errResumableDigestNotAvailable -} diff --git a/vendor/github.com/docker/distribution/registry/storage/blobwriter_resumable.go b/vendor/github.com/docker/distribution/registry/storage/blobwriter_resumable.go deleted file mode 100644 index ff5482c3f..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/blobwriter_resumable.go +++ /dev/null @@ -1,145 +0,0 @@ -// +build !noresumabledigest - -package storage - -import ( - "fmt" - "path" - "strconv" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/stevvooe/resumable" - - // register resumable hashes with import - _ "github.com/stevvooe/resumable/sha256" - _ "github.com/stevvooe/resumable/sha512" -) - -// resumeDigest attempts to restore the state of the internal hash function -// by loading the most recent saved hash state equal to the current size of the blob. -func (bw *blobWriter) resumeDigest(ctx context.Context) error { - if !bw.resumableDigestEnabled { - return errResumableDigestNotAvailable - } - - h, ok := bw.digester.Hash().(resumable.Hash) - if !ok { - return errResumableDigestNotAvailable - } - offset := bw.fileWriter.Size() - if offset == int64(h.Len()) { - // State of digester is already at the requested offset. - return nil - } - - // List hash states from storage backend. - var hashStateMatch hashStateEntry - hashStates, err := bw.getStoredHashStates(ctx) - if err != nil { - return fmt.Errorf("unable to get stored hash states with offset %d: %s", offset, err) - } - - // Find the highest stored hashState with offset equal to - // the requested offset. - for _, hashState := range hashStates { - if hashState.offset == offset { - hashStateMatch = hashState - break // Found an exact offset match. - } - } - - if hashStateMatch.offset == 0 { - // No need to load any state, just reset the hasher. - h.Reset() - } else { - storedState, err := bw.driver.GetContent(ctx, hashStateMatch.path) - if err != nil { - return err - } - - if err = h.Restore(storedState); err != nil { - return err - } - } - - // Mind the gap. - if gapLen := offset - int64(h.Len()); gapLen > 0 { - return errResumableDigestNotAvailable - } - - return nil -} - -type hashStateEntry struct { - offset int64 - path string -} - -// getStoredHashStates returns a slice of hashStateEntries for this upload. -func (bw *blobWriter) getStoredHashStates(ctx context.Context) ([]hashStateEntry, error) { - uploadHashStatePathPrefix, err := pathFor(uploadHashStatePathSpec{ - name: bw.blobStore.repository.Named().String(), - id: bw.id, - alg: bw.digester.Digest().Algorithm(), - list: true, - }) - - if err != nil { - return nil, err - } - - paths, err := bw.blobStore.driver.List(ctx, uploadHashStatePathPrefix) - if err != nil { - if _, ok := err.(storagedriver.PathNotFoundError); !ok { - return nil, err - } - // Treat PathNotFoundError as no entries. - paths = nil - } - - hashStateEntries := make([]hashStateEntry, 0, len(paths)) - - for _, p := range paths { - pathSuffix := path.Base(p) - // The suffix should be the offset. - offset, err := strconv.ParseInt(pathSuffix, 0, 64) - if err != nil { - logrus.Errorf("unable to parse offset from upload state path %q: %s", p, err) - } - - hashStateEntries = append(hashStateEntries, hashStateEntry{offset: offset, path: p}) - } - - return hashStateEntries, nil -} - -func (bw *blobWriter) storeHashState(ctx context.Context) error { - if !bw.resumableDigestEnabled { - return errResumableDigestNotAvailable - } - - h, ok := bw.digester.Hash().(resumable.Hash) - if !ok { - return errResumableDigestNotAvailable - } - - uploadHashStatePath, err := pathFor(uploadHashStatePathSpec{ - name: bw.blobStore.repository.Named().String(), - id: bw.id, - alg: bw.digester.Digest().Algorithm(), - offset: int64(h.Len()), - }) - - if err != nil { - return err - } - - hashState, err := h.State() - if err != nil { - return err - } - - return bw.driver.PutContent(ctx, uploadHashStatePath, hashState) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/cache/cache.go b/vendor/github.com/docker/distribution/registry/storage/cache/cache.go deleted file mode 100644 index 10a390919..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/cache/cache.go +++ /dev/null @@ -1,35 +0,0 @@ -// Package cache provides facilities to speed up access to the storage -// backend. -package cache - -import ( - "fmt" - - "github.com/docker/distribution" -) - -// BlobDescriptorCacheProvider provides repository scoped -// BlobDescriptorService cache instances and a global descriptor cache. -type BlobDescriptorCacheProvider interface { - distribution.BlobDescriptorService - - RepositoryScoped(repo string) (distribution.BlobDescriptorService, error) -} - -// ValidateDescriptor provides a helper function to ensure that caches have -// common criteria for admitting descriptors. -func ValidateDescriptor(desc distribution.Descriptor) error { - if err := desc.Digest.Validate(); err != nil { - return err - } - - if desc.Size < 0 { - return fmt.Errorf("cache: invalid length in descriptor: %v < 0", desc.Size) - } - - if desc.MediaType == "" { - return fmt.Errorf("cache: empty mediatype on descriptor: %v", desc) - } - - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/cache/cachecheck/suite.go b/vendor/github.com/docker/distribution/registry/storage/cache/cachecheck/suite.go deleted file mode 100644 index a563c02a1..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/cache/cachecheck/suite.go +++ /dev/null @@ -1,180 +0,0 @@ -package cachecheck - -import ( - "reflect" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/registry/storage/cache" -) - -// CheckBlobDescriptorCache takes a cache implementation through a common set -// of operations. If adding new tests, please add them here so new -// implementations get the benefit. This should be used for unit tests. -func CheckBlobDescriptorCache(t *testing.T, provider cache.BlobDescriptorCacheProvider) { - ctx := context.Background() - - checkBlobDescriptorCacheEmptyRepository(ctx, t, provider) - checkBlobDescriptorCacheSetAndRead(ctx, t, provider) - checkBlobDescriptorCacheClear(ctx, t, provider) -} - -func checkBlobDescriptorCacheEmptyRepository(ctx context.Context, t *testing.T, provider cache.BlobDescriptorCacheProvider) { - if _, err := provider.Stat(ctx, "sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"); err != distribution.ErrBlobUnknown { - t.Fatalf("expected unknown blob error with empty store: %v", err) - } - - cache, err := provider.RepositoryScoped("") - if err == nil { - t.Fatalf("expected an error when asking for invalid repo") - } - - cache, err = provider.RepositoryScoped("foo/bar") - if err != nil { - t.Fatalf("unexpected error getting repository: %v", err) - } - - if err := cache.SetDescriptor(ctx, "", distribution.Descriptor{ - Digest: "sha384:abc", - Size: 10, - MediaType: "application/octet-stream"}); err != digest.ErrDigestInvalidFormat { - t.Fatalf("expected error with invalid digest: %v", err) - } - - if err := cache.SetDescriptor(ctx, "sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", distribution.Descriptor{ - Digest: "", - Size: 10, - MediaType: "application/octet-stream"}); err == nil { - t.Fatalf("expected error setting value on invalid descriptor") - } - - if _, err := cache.Stat(ctx, ""); err != digest.ErrDigestInvalidFormat { - t.Fatalf("expected error checking for cache item with empty digest: %v", err) - } - - if _, err := cache.Stat(ctx, "sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"); err != distribution.ErrBlobUnknown { - t.Fatalf("expected unknown blob error with empty repo: %v", err) - } -} - -func checkBlobDescriptorCacheSetAndRead(ctx context.Context, t *testing.T, provider cache.BlobDescriptorCacheProvider) { - localDigest := digest.Digest("sha384:abc111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111") - expected := distribution.Descriptor{ - Digest: "sha256:abc1111111111111111111111111111111111111111111111111111111111111", - Size: 10, - MediaType: "application/octet-stream"} - - cache, err := provider.RepositoryScoped("foo/bar") - if err != nil { - t.Fatalf("unexpected error getting scoped cache: %v", err) - } - - if err := cache.SetDescriptor(ctx, localDigest, expected); err != nil { - t.Fatalf("error setting descriptor: %v", err) - } - - desc, err := cache.Stat(ctx, localDigest) - if err != nil { - t.Fatalf("unexpected error statting fake2:abc: %v", err) - } - - if !reflect.DeepEqual(expected, desc) { - t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) - } - - // also check that we set the canonical key ("fake:abc") - desc, err = cache.Stat(ctx, localDigest) - if err != nil { - t.Fatalf("descriptor not returned for canonical key: %v", err) - } - - if !reflect.DeepEqual(expected, desc) { - t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) - } - - // ensure that global gets extra descriptor mapping - desc, err = provider.Stat(ctx, localDigest) - if err != nil { - t.Fatalf("expected blob unknown in global cache: %v, %v", err, desc) - } - - if !reflect.DeepEqual(desc, expected) { - t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) - } - - // get at it through canonical descriptor - desc, err = provider.Stat(ctx, expected.Digest) - if err != nil { - t.Fatalf("unexpected error checking glboal descriptor: %v", err) - } - - if !reflect.DeepEqual(desc, expected) { - t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) - } - - // now, we set the repo local mediatype to something else and ensure it - // doesn't get changed in the provider cache. - expected.MediaType = "application/json" - - if err := cache.SetDescriptor(ctx, localDigest, expected); err != nil { - t.Fatalf("unexpected error setting descriptor: %v", err) - } - - desc, err = cache.Stat(ctx, localDigest) - if err != nil { - t.Fatalf("unexpected error getting descriptor: %v", err) - } - - if !reflect.DeepEqual(desc, expected) { - t.Fatalf("unexpected descriptor: %#v != %#v", desc, expected) - } - - desc, err = provider.Stat(ctx, localDigest) - if err != nil { - t.Fatalf("unexpected error getting global descriptor: %v", err) - } - - expected.MediaType = "application/octet-stream" // expect original mediatype in global - - if !reflect.DeepEqual(desc, expected) { - t.Fatalf("unexpected descriptor: %#v != %#v", desc, expected) - } -} - -func checkBlobDescriptorCacheClear(ctx context.Context, t *testing.T, provider cache.BlobDescriptorCacheProvider) { - localDigest := digest.Digest("sha384:def111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111") - expected := distribution.Descriptor{ - Digest: "sha256:def1111111111111111111111111111111111111111111111111111111111111", - Size: 10, - MediaType: "application/octet-stream"} - - cache, err := provider.RepositoryScoped("foo/bar") - if err != nil { - t.Fatalf("unexpected error getting scoped cache: %v", err) - } - - if err := cache.SetDescriptor(ctx, localDigest, expected); err != nil { - t.Fatalf("error setting descriptor: %v", err) - } - - desc, err := cache.Stat(ctx, localDigest) - if err != nil { - t.Fatalf("unexpected error statting fake2:abc: %v", err) - } - - if !reflect.DeepEqual(expected, desc) { - t.Fatalf("unexpected descriptor: %#v != %#v", expected, desc) - } - - err = cache.Clear(ctx, localDigest) - if err != nil { - t.Error(err) - } - - desc, err = cache.Stat(ctx, localDigest) - if err == nil { - t.Fatalf("expected error statting deleted blob: %v", err) - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/cache/cachedblobdescriptorstore.go b/vendor/github.com/docker/distribution/registry/storage/cache/cachedblobdescriptorstore.go deleted file mode 100644 index 94ca8a90c..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/cache/cachedblobdescriptorstore.go +++ /dev/null @@ -1,101 +0,0 @@ -package cache - -import ( - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - - "github.com/docker/distribution" -) - -// Metrics is used to hold metric counters -// related to the number of times a cache was -// hit or missed. -type Metrics struct { - Requests uint64 - Hits uint64 - Misses uint64 -} - -// MetricsTracker represents a metric tracker -// which simply counts the number of hits and misses. -type MetricsTracker interface { - Hit() - Miss() - Metrics() Metrics -} - -type cachedBlobStatter struct { - cache distribution.BlobDescriptorService - backend distribution.BlobDescriptorService - tracker MetricsTracker -} - -// NewCachedBlobStatter creates a new statter which prefers a cache and -// falls back to a backend. -func NewCachedBlobStatter(cache distribution.BlobDescriptorService, backend distribution.BlobDescriptorService) distribution.BlobDescriptorService { - return &cachedBlobStatter{ - cache: cache, - backend: backend, - } -} - -// NewCachedBlobStatterWithMetrics creates a new statter which prefers a cache and -// falls back to a backend. Hits and misses will send to the tracker. -func NewCachedBlobStatterWithMetrics(cache distribution.BlobDescriptorService, backend distribution.BlobDescriptorService, tracker MetricsTracker) distribution.BlobStatter { - return &cachedBlobStatter{ - cache: cache, - backend: backend, - tracker: tracker, - } -} - -func (cbds *cachedBlobStatter) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - desc, err := cbds.cache.Stat(ctx, dgst) - if err != nil { - if err != distribution.ErrBlobUnknown { - context.GetLogger(ctx).Errorf("error retrieving descriptor from cache: %v", err) - } - - goto fallback - } - - if cbds.tracker != nil { - cbds.tracker.Hit() - } - return desc, nil -fallback: - if cbds.tracker != nil { - cbds.tracker.Miss() - } - desc, err = cbds.backend.Stat(ctx, dgst) - if err != nil { - return desc, err - } - - if err := cbds.cache.SetDescriptor(ctx, dgst, desc); err != nil { - context.GetLogger(ctx).Errorf("error adding descriptor %v to cache: %v", desc.Digest, err) - } - - return desc, err - -} - -func (cbds *cachedBlobStatter) Clear(ctx context.Context, dgst digest.Digest) error { - err := cbds.cache.Clear(ctx, dgst) - if err != nil { - return err - } - - err = cbds.backend.Clear(ctx, dgst) - if err != nil { - return err - } - return nil -} - -func (cbds *cachedBlobStatter) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { - if err := cbds.cache.SetDescriptor(ctx, dgst, desc); err != nil { - context.GetLogger(ctx).Errorf("error adding descriptor %v to cache: %v", desc.Digest, err) - } - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/cache/memory/memory.go b/vendor/github.com/docker/distribution/registry/storage/cache/memory/memory.go deleted file mode 100644 index cf125e187..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/cache/memory/memory.go +++ /dev/null @@ -1,179 +0,0 @@ -package memory - -import ( - "sync" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/cache" -) - -type inMemoryBlobDescriptorCacheProvider struct { - global *mapBlobDescriptorCache - repositories map[string]*mapBlobDescriptorCache - mu sync.RWMutex -} - -// NewInMemoryBlobDescriptorCacheProvider returns a new mapped-based cache for -// storing blob descriptor data. -func NewInMemoryBlobDescriptorCacheProvider() cache.BlobDescriptorCacheProvider { - return &inMemoryBlobDescriptorCacheProvider{ - global: newMapBlobDescriptorCache(), - repositories: make(map[string]*mapBlobDescriptorCache), - } -} - -func (imbdcp *inMemoryBlobDescriptorCacheProvider) RepositoryScoped(repo string) (distribution.BlobDescriptorService, error) { - if _, err := reference.ParseNamed(repo); err != nil { - return nil, err - } - - imbdcp.mu.RLock() - defer imbdcp.mu.RUnlock() - - return &repositoryScopedInMemoryBlobDescriptorCache{ - repo: repo, - parent: imbdcp, - repository: imbdcp.repositories[repo], - }, nil -} - -func (imbdcp *inMemoryBlobDescriptorCacheProvider) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - return imbdcp.global.Stat(ctx, dgst) -} - -func (imbdcp *inMemoryBlobDescriptorCacheProvider) Clear(ctx context.Context, dgst digest.Digest) error { - return imbdcp.global.Clear(ctx, dgst) -} - -func (imbdcp *inMemoryBlobDescriptorCacheProvider) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { - _, err := imbdcp.Stat(ctx, dgst) - if err == distribution.ErrBlobUnknown { - - if dgst.Algorithm() != desc.Digest.Algorithm() && dgst != desc.Digest { - // if the digests differ, set the other canonical mapping - if err := imbdcp.global.SetDescriptor(ctx, desc.Digest, desc); err != nil { - return err - } - } - - // unknown, just set it - return imbdcp.global.SetDescriptor(ctx, dgst, desc) - } - - // we already know it, do nothing - return err -} - -// repositoryScopedInMemoryBlobDescriptorCache provides the request scoped -// repository cache. Instances are not thread-safe but the delegated -// operations are. -type repositoryScopedInMemoryBlobDescriptorCache struct { - repo string - parent *inMemoryBlobDescriptorCacheProvider // allows lazy allocation of repo's map - repository *mapBlobDescriptorCache -} - -func (rsimbdcp *repositoryScopedInMemoryBlobDescriptorCache) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - rsimbdcp.parent.mu.Lock() - repo := rsimbdcp.repository - rsimbdcp.parent.mu.Unlock() - - if repo == nil { - return distribution.Descriptor{}, distribution.ErrBlobUnknown - } - - return repo.Stat(ctx, dgst) -} - -func (rsimbdcp *repositoryScopedInMemoryBlobDescriptorCache) Clear(ctx context.Context, dgst digest.Digest) error { - rsimbdcp.parent.mu.Lock() - repo := rsimbdcp.repository - rsimbdcp.parent.mu.Unlock() - - if repo == nil { - return distribution.ErrBlobUnknown - } - - return repo.Clear(ctx, dgst) -} - -func (rsimbdcp *repositoryScopedInMemoryBlobDescriptorCache) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { - rsimbdcp.parent.mu.Lock() - repo := rsimbdcp.repository - if repo == nil { - // allocate map since we are setting it now. - var ok bool - // have to read back value since we may have allocated elsewhere. - repo, ok = rsimbdcp.parent.repositories[rsimbdcp.repo] - if !ok { - repo = newMapBlobDescriptorCache() - rsimbdcp.parent.repositories[rsimbdcp.repo] = repo - } - rsimbdcp.repository = repo - } - rsimbdcp.parent.mu.Unlock() - - if err := repo.SetDescriptor(ctx, dgst, desc); err != nil { - return err - } - - return rsimbdcp.parent.SetDescriptor(ctx, dgst, desc) -} - -// mapBlobDescriptorCache provides a simple map-based implementation of the -// descriptor cache. -type mapBlobDescriptorCache struct { - descriptors map[digest.Digest]distribution.Descriptor - mu sync.RWMutex -} - -var _ distribution.BlobDescriptorService = &mapBlobDescriptorCache{} - -func newMapBlobDescriptorCache() *mapBlobDescriptorCache { - return &mapBlobDescriptorCache{ - descriptors: make(map[digest.Digest]distribution.Descriptor), - } -} - -func (mbdc *mapBlobDescriptorCache) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - if err := dgst.Validate(); err != nil { - return distribution.Descriptor{}, err - } - - mbdc.mu.RLock() - defer mbdc.mu.RUnlock() - - desc, ok := mbdc.descriptors[dgst] - if !ok { - return distribution.Descriptor{}, distribution.ErrBlobUnknown - } - - return desc, nil -} - -func (mbdc *mapBlobDescriptorCache) Clear(ctx context.Context, dgst digest.Digest) error { - mbdc.mu.Lock() - defer mbdc.mu.Unlock() - - delete(mbdc.descriptors, dgst) - return nil -} - -func (mbdc *mapBlobDescriptorCache) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { - if err := dgst.Validate(); err != nil { - return err - } - - if err := cache.ValidateDescriptor(desc); err != nil { - return err - } - - mbdc.mu.Lock() - defer mbdc.mu.Unlock() - - mbdc.descriptors[dgst] = desc - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/cache/memory/memory_test.go b/vendor/github.com/docker/distribution/registry/storage/cache/memory/memory_test.go deleted file mode 100644 index 49c2b5c39..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/cache/memory/memory_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package memory - -import ( - "testing" - - "github.com/docker/distribution/registry/storage/cache/cachecheck" -) - -// TestInMemoryBlobInfoCache checks the in memory implementation is working -// correctly. -func TestInMemoryBlobInfoCache(t *testing.T) { - cachecheck.CheckBlobDescriptorCache(t, NewInMemoryBlobDescriptorCacheProvider()) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/cache/redis/redis.go b/vendor/github.com/docker/distribution/registry/storage/cache/redis/redis.go deleted file mode 100644 index cb264b098..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/cache/redis/redis.go +++ /dev/null @@ -1,268 +0,0 @@ -package redis - -import ( - "fmt" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/cache" - "github.com/garyburd/redigo/redis" -) - -// redisBlobStatService provides an implementation of -// BlobDescriptorCacheProvider based on redis. Blob descriptors are stored in -// two parts. The first provide fast access to repository membership through a -// redis set for each repo. The second is a redis hash keyed by the digest of -// the layer, providing path, length and mediatype information. There is also -// a per-repository redis hash of the blob descriptor, allowing override of -// data. This is currently used to override the mediatype on a per-repository -// basis. -// -// Note that there is no implied relationship between these two caches. The -// layer may exist in one, both or none and the code must be written this way. -type redisBlobDescriptorService struct { - pool *redis.Pool - - // TODO(stevvooe): We use a pool because we don't have great control over - // the cache lifecycle to manage connections. A new connection if fetched - // for each operation. Once we have better lifecycle management of the - // request objects, we can change this to a connection. -} - -// NewRedisBlobDescriptorCacheProvider returns a new redis-based -// BlobDescriptorCacheProvider using the provided redis connection pool. -func NewRedisBlobDescriptorCacheProvider(pool *redis.Pool) cache.BlobDescriptorCacheProvider { - return &redisBlobDescriptorService{ - pool: pool, - } -} - -// RepositoryScoped returns the scoped cache. -func (rbds *redisBlobDescriptorService) RepositoryScoped(repo string) (distribution.BlobDescriptorService, error) { - if _, err := reference.ParseNamed(repo); err != nil { - return nil, err - } - - return &repositoryScopedRedisBlobDescriptorService{ - repo: repo, - upstream: rbds, - }, nil -} - -// Stat retrieves the descriptor data from the redis hash entry. -func (rbds *redisBlobDescriptorService) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - if err := dgst.Validate(); err != nil { - return distribution.Descriptor{}, err - } - - conn := rbds.pool.Get() - defer conn.Close() - - return rbds.stat(ctx, conn, dgst) -} - -func (rbds *redisBlobDescriptorService) Clear(ctx context.Context, dgst digest.Digest) error { - if err := dgst.Validate(); err != nil { - return err - } - - conn := rbds.pool.Get() - defer conn.Close() - - // Not atomic in redis <= 2.3 - reply, err := conn.Do("HDEL", rbds.blobDescriptorHashKey(dgst), "digest", "length", "mediatype") - if err != nil { - return err - } - - if reply == 0 { - return distribution.ErrBlobUnknown - } - - return nil -} - -// stat provides an internal stat call that takes a connection parameter. This -// allows some internal management of the connection scope. -func (rbds *redisBlobDescriptorService) stat(ctx context.Context, conn redis.Conn, dgst digest.Digest) (distribution.Descriptor, error) { - reply, err := redis.Values(conn.Do("HMGET", rbds.blobDescriptorHashKey(dgst), "digest", "size", "mediatype")) - if err != nil { - return distribution.Descriptor{}, err - } - - // NOTE(stevvooe): The "size" field used to be "length". We treat a - // missing "size" field here as an unknown blob, which causes a cache - // miss, effectively migrating the field. - if len(reply) < 3 || reply[0] == nil || reply[1] == nil { // don't care if mediatype is nil - return distribution.Descriptor{}, distribution.ErrBlobUnknown - } - - var desc distribution.Descriptor - if _, err := redis.Scan(reply, &desc.Digest, &desc.Size, &desc.MediaType); err != nil { - return distribution.Descriptor{}, err - } - - return desc, nil -} - -// SetDescriptor sets the descriptor data for the given digest using a redis -// hash. A hash is used here since we may store unrelated fields about a layer -// in the future. -func (rbds *redisBlobDescriptorService) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { - if err := dgst.Validate(); err != nil { - return err - } - - if err := cache.ValidateDescriptor(desc); err != nil { - return err - } - - conn := rbds.pool.Get() - defer conn.Close() - - return rbds.setDescriptor(ctx, conn, dgst, desc) -} - -func (rbds *redisBlobDescriptorService) setDescriptor(ctx context.Context, conn redis.Conn, dgst digest.Digest, desc distribution.Descriptor) error { - if _, err := conn.Do("HMSET", rbds.blobDescriptorHashKey(dgst), - "digest", desc.Digest, - "size", desc.Size); err != nil { - return err - } - - // Only set mediatype if not already set. - if _, err := conn.Do("HSETNX", rbds.blobDescriptorHashKey(dgst), - "mediatype", desc.MediaType); err != nil { - return err - } - - return nil -} - -func (rbds *redisBlobDescriptorService) blobDescriptorHashKey(dgst digest.Digest) string { - return "blobs::" + dgst.String() -} - -type repositoryScopedRedisBlobDescriptorService struct { - repo string - upstream *redisBlobDescriptorService -} - -var _ distribution.BlobDescriptorService = &repositoryScopedRedisBlobDescriptorService{} - -// Stat ensures that the digest is a member of the specified repository and -// forwards the descriptor request to the global blob store. If the media type -// differs for the repository, we override it. -func (rsrbds *repositoryScopedRedisBlobDescriptorService) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - if err := dgst.Validate(); err != nil { - return distribution.Descriptor{}, err - } - - conn := rsrbds.upstream.pool.Get() - defer conn.Close() - - // Check membership to repository first - member, err := redis.Bool(conn.Do("SISMEMBER", rsrbds.repositoryBlobSetKey(rsrbds.repo), dgst)) - if err != nil { - return distribution.Descriptor{}, err - } - - if !member { - return distribution.Descriptor{}, distribution.ErrBlobUnknown - } - - upstream, err := rsrbds.upstream.stat(ctx, conn, dgst) - if err != nil { - return distribution.Descriptor{}, err - } - - // We allow a per repository mediatype, let's look it up here. - mediatype, err := redis.String(conn.Do("HGET", rsrbds.blobDescriptorHashKey(dgst), "mediatype")) - if err != nil { - return distribution.Descriptor{}, err - } - - if mediatype != "" { - upstream.MediaType = mediatype - } - - return upstream, nil -} - -// Clear removes the descriptor from the cache and forwards to the upstream descriptor store -func (rsrbds *repositoryScopedRedisBlobDescriptorService) Clear(ctx context.Context, dgst digest.Digest) error { - if err := dgst.Validate(); err != nil { - return err - } - - conn := rsrbds.upstream.pool.Get() - defer conn.Close() - - // Check membership to repository first - member, err := redis.Bool(conn.Do("SISMEMBER", rsrbds.repositoryBlobSetKey(rsrbds.repo), dgst)) - if err != nil { - return err - } - - if !member { - return distribution.ErrBlobUnknown - } - - return rsrbds.upstream.Clear(ctx, dgst) -} - -func (rsrbds *repositoryScopedRedisBlobDescriptorService) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { - if err := dgst.Validate(); err != nil { - return err - } - - if err := cache.ValidateDescriptor(desc); err != nil { - return err - } - - if dgst != desc.Digest { - if dgst.Algorithm() == desc.Digest.Algorithm() { - return fmt.Errorf("redis cache: digest for descriptors differ but algorthim does not: %q != %q", dgst, desc.Digest) - } - } - - conn := rsrbds.upstream.pool.Get() - defer conn.Close() - - return rsrbds.setDescriptor(ctx, conn, dgst, desc) -} - -func (rsrbds *repositoryScopedRedisBlobDescriptorService) setDescriptor(ctx context.Context, conn redis.Conn, dgst digest.Digest, desc distribution.Descriptor) error { - if _, err := conn.Do("SADD", rsrbds.repositoryBlobSetKey(rsrbds.repo), dgst); err != nil { - return err - } - - if err := rsrbds.upstream.setDescriptor(ctx, conn, dgst, desc); err != nil { - return err - } - - // Override repository mediatype. - if _, err := conn.Do("HSET", rsrbds.blobDescriptorHashKey(dgst), "mediatype", desc.MediaType); err != nil { - return err - } - - // Also set the values for the primary descriptor, if they differ by - // algorithm (ie sha256 vs sha512). - if desc.Digest != "" && dgst != desc.Digest && dgst.Algorithm() != desc.Digest.Algorithm() { - if err := rsrbds.setDescriptor(ctx, conn, desc.Digest, desc); err != nil { - return err - } - } - - return nil -} - -func (rsrbds *repositoryScopedRedisBlobDescriptorService) blobDescriptorHashKey(dgst digest.Digest) string { - return "repository::" + rsrbds.repo + "::blobs::" + dgst.String() -} - -func (rsrbds *repositoryScopedRedisBlobDescriptorService) repositoryBlobSetKey(repo string) string { - return "repository::" + rsrbds.repo + "::blobs" -} diff --git a/vendor/github.com/docker/distribution/registry/storage/cache/redis/redis_test.go b/vendor/github.com/docker/distribution/registry/storage/cache/redis/redis_test.go deleted file mode 100644 index d324842d3..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/cache/redis/redis_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package redis - -import ( - "flag" - "os" - "testing" - "time" - - "github.com/docker/distribution/registry/storage/cache/cachecheck" - "github.com/garyburd/redigo/redis" -) - -var redisAddr string - -func init() { - flag.StringVar(&redisAddr, "test.registry.storage.cache.redis.addr", "", "configure the address of a test instance of redis") -} - -// TestRedisLayerInfoCache exercises a live redis instance using the cache -// implementation. -func TestRedisBlobDescriptorCacheProvider(t *testing.T) { - if redisAddr == "" { - // fallback to an environement variable - redisAddr = os.Getenv("TEST_REGISTRY_STORAGE_CACHE_REDIS_ADDR") - } - - if redisAddr == "" { - // skip if still not set - t.Skip("please set -test.registry.storage.cache.redis.addr to test layer info cache against redis") - } - - pool := &redis.Pool{ - Dial: func() (redis.Conn, error) { - return redis.Dial("tcp", redisAddr) - }, - MaxIdle: 1, - MaxActive: 2, - TestOnBorrow: func(c redis.Conn, t time.Time) error { - _, err := c.Do("PING") - return err - }, - Wait: false, // if a connection is not avialable, proceed without cache. - } - - // Clear the database - conn := pool.Get() - if _, err := conn.Do("FLUSHDB"); err != nil { - t.Fatalf("unexpected error flushing redis db: %v", err) - } - conn.Close() - - cachecheck.CheckBlobDescriptorCache(t, NewRedisBlobDescriptorCacheProvider(pool)) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/catalog.go b/vendor/github.com/docker/distribution/registry/storage/catalog.go deleted file mode 100644 index 0b59a39ac..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/catalog.go +++ /dev/null @@ -1,153 +0,0 @@ -package storage - -import ( - "errors" - "io" - "path" - "strings" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/storage/driver" -) - -// errFinishedWalk signals an early exit to the walk when the current query -// is satisfied. -var errFinishedWalk = errors.New("finished walk") - -// Returns a list, or partial list, of repositories in the registry. -// Because it's a quite expensive operation, it should only be used when building up -// an initial set of repositories. -func (reg *registry) Repositories(ctx context.Context, repos []string, last string) (n int, err error) { - var foundRepos []string - - if len(repos) == 0 { - return 0, errors.New("no space in slice") - } - - root, err := pathFor(repositoriesRootPathSpec{}) - if err != nil { - return 0, err - } - - err = Walk(ctx, reg.blobStore.driver, root, func(fileInfo driver.FileInfo) error { - err := handleRepository(fileInfo, root, last, func(repoPath string) error { - foundRepos = append(foundRepos, repoPath) - return nil - }) - if err != nil { - return err - } - - // if we've filled our array, no need to walk any further - if len(foundRepos) == len(repos) { - return errFinishedWalk - } - - return nil - }) - - n = copy(repos, foundRepos) - - switch err { - case nil: - // nil means that we completed walk and didn't fill buffer. No more - // records are available. - err = io.EOF - case errFinishedWalk: - // more records are available. - err = nil - } - - return n, err -} - -// Enumerate applies ingester to each repository -func (reg *registry) Enumerate(ctx context.Context, ingester func(string) error) error { - root, err := pathFor(repositoriesRootPathSpec{}) - if err != nil { - return err - } - - err = Walk(ctx, reg.blobStore.driver, root, func(fileInfo driver.FileInfo) error { - return handleRepository(fileInfo, root, "", ingester) - }) - - return err -} - -// lessPath returns true if one path a is less than path b. -// -// A component-wise comparison is done, rather than the lexical comparison of -// strings. -func lessPath(a, b string) bool { - // we provide this behavior by making separator always sort first. - return compareReplaceInline(a, b, '/', '\x00') < 0 -} - -// compareReplaceInline modifies runtime.cmpstring to replace old with new -// during a byte-wise comparison. -func compareReplaceInline(s1, s2 string, old, new byte) int { - // TODO(stevvooe): We are missing an optimization when the s1 and s2 have - // the exact same slice header. It will make the code unsafe but can - // provide some extra performance. - - l := len(s1) - if len(s2) < l { - l = len(s2) - } - - for i := 0; i < l; i++ { - c1, c2 := s1[i], s2[i] - if c1 == old { - c1 = new - } - - if c2 == old { - c2 = new - } - - if c1 < c2 { - return -1 - } - - if c1 > c2 { - return +1 - } - } - - if len(s1) < len(s2) { - return -1 - } - - if len(s1) > len(s2) { - return +1 - } - - return 0 -} - -// handleRepository calls function fn with a repository path if fileInfo -// has a path of a repository under root and that it is lexographically -// after last. Otherwise, it will return ErrSkipDir. This should be used -// with Walk to do handling with repositories in a storage. -func handleRepository(fileInfo driver.FileInfo, root, last string, fn func(repoPath string) error) error { - filePath := fileInfo.Path() - - // lop the base path off - repo := filePath[len(root)+1:] - - _, file := path.Split(repo) - if file == "_layers" { - repo = strings.TrimSuffix(repo, "/_layers") - if lessPath(last, repo) { - if err := fn(repo); err != nil { - return err - } - } - return ErrSkipDir - } else if strings.HasPrefix(file, "_") { - return ErrSkipDir - } - - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/catalog_test.go b/vendor/github.com/docker/distribution/registry/storage/catalog_test.go deleted file mode 100644 index c69c0cdc1..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/catalog_test.go +++ /dev/null @@ -1,324 +0,0 @@ -package storage - -import ( - "fmt" - "io" - "math/rand" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/cache/memory" - "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/inmemory" - "github.com/docker/distribution/testutil" -) - -type setupEnv struct { - ctx context.Context - driver driver.StorageDriver - expected []string - registry distribution.Namespace -} - -func setupFS(t *testing.T) *setupEnv { - d := inmemory.New() - ctx := context.Background() - registry, err := NewRegistry(ctx, d, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableRedirect) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - - repos := []string{ - "foo/a", - "foo/b", - "foo-bar/a", - "bar/c", - "bar/d", - "bar/e", - "foo/d/in", - "foo-bar/b", - "test", - } - - for _, repo := range repos { - makeRepo(ctx, t, repo, registry) - } - - expected := []string{ - "bar/c", - "bar/d", - "bar/e", - "foo/a", - "foo/b", - "foo/d/in", - "foo-bar/a", - "foo-bar/b", - "test", - } - - return &setupEnv{ - ctx: ctx, - driver: d, - expected: expected, - registry: registry, - } -} - -func makeRepo(ctx context.Context, t *testing.T, name string, reg distribution.Namespace) { - named, err := reference.ParseNamed(name) - if err != nil { - t.Fatal(err) - } - - repo, _ := reg.Repository(ctx, named) - manifests, _ := repo.Manifests(ctx) - - layers, err := testutil.CreateRandomLayers(1) - if err != nil { - t.Fatal(err) - } - - err = testutil.UploadBlobs(repo, layers) - if err != nil { - t.Fatalf("failed to upload layers: %v", err) - } - - getKeys := func(digests map[digest.Digest]io.ReadSeeker) (ds []digest.Digest) { - for d := range digests { - ds = append(ds, d) - } - return - } - - manifest, err := testutil.MakeSchema1Manifest(getKeys(layers)) - if err != nil { - t.Fatal(err) - } - - _, err = manifests.Put(ctx, manifest) - if err != nil { - t.Fatalf("manifest upload failed: %v", err) - } - -} - -func TestCatalog(t *testing.T) { - env := setupFS(t) - - p := make([]string, 50) - - numFilled, err := env.registry.Repositories(env.ctx, p, "") - if numFilled != len(env.expected) { - t.Errorf("missing items in catalog") - } - - if !testEq(p, env.expected, len(env.expected)) { - t.Errorf("Expected catalog repos err") - } - - if err != io.EOF { - t.Errorf("Catalog has more values which we aren't expecting") - } -} - -func TestCatalogInParts(t *testing.T) { - env := setupFS(t) - - chunkLen := 3 - p := make([]string, chunkLen) - - numFilled, err := env.registry.Repositories(env.ctx, p, "") - if err == io.EOF || numFilled != len(p) { - t.Errorf("Expected more values in catalog") - } - - if !testEq(p, env.expected[0:chunkLen], numFilled) { - t.Errorf("Expected catalog first chunk err") - } - - lastRepo := p[len(p)-1] - numFilled, err = env.registry.Repositories(env.ctx, p, lastRepo) - - if err == io.EOF || numFilled != len(p) { - t.Errorf("Expected more values in catalog") - } - - if !testEq(p, env.expected[chunkLen:chunkLen*2], numFilled) { - t.Errorf("Expected catalog second chunk err") - } - - lastRepo = p[len(p)-1] - numFilled, err = env.registry.Repositories(env.ctx, p, lastRepo) - - if err != io.EOF || numFilled != len(p) { - t.Errorf("Expected end of catalog") - } - - if !testEq(p, env.expected[chunkLen*2:chunkLen*3], numFilled) { - t.Errorf("Expected catalog third chunk err") - } - - lastRepo = p[len(p)-1] - numFilled, err = env.registry.Repositories(env.ctx, p, lastRepo) - - if err != io.EOF { - t.Errorf("Catalog has more values which we aren't expecting") - } - - if numFilled != 0 { - t.Errorf("Expected catalog fourth chunk err") - } -} - -func TestCatalogEnumerate(t *testing.T) { - env := setupFS(t) - - var repos []string - repositoryEnumerator := env.registry.(distribution.RepositoryEnumerator) - err := repositoryEnumerator.Enumerate(env.ctx, func(repoName string) error { - repos = append(repos, repoName) - return nil - }) - if err != nil { - t.Errorf("Expected catalog enumerate err") - } - - if len(repos) != len(env.expected) { - t.Errorf("Expected catalog enumerate doesn't have correct number of values") - } - - if !testEq(repos, env.expected, len(env.expected)) { - t.Errorf("Expected catalog enumerate not over all values") - } -} - -func testEq(a, b []string, size int) bool { - for cnt := 0; cnt < size-1; cnt++ { - if a[cnt] != b[cnt] { - return false - } - } - return true -} - -func setupBadWalkEnv(t *testing.T) *setupEnv { - d := newBadListDriver() - ctx := context.Background() - registry, err := NewRegistry(ctx, d, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableRedirect) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - - return &setupEnv{ - ctx: ctx, - driver: d, - registry: registry, - } -} - -type badListDriver struct { - driver.StorageDriver -} - -var _ driver.StorageDriver = &badListDriver{} - -func newBadListDriver() *badListDriver { - return &badListDriver{StorageDriver: inmemory.New()} -} - -func (d *badListDriver) List(ctx context.Context, path string) ([]string, error) { - return nil, fmt.Errorf("List error") -} - -func TestCatalogWalkError(t *testing.T) { - env := setupBadWalkEnv(t) - p := make([]string, 1) - - _, err := env.registry.Repositories(env.ctx, p, "") - if err == io.EOF { - t.Errorf("Expected catalog driver list error") - } -} - -func BenchmarkPathCompareEqual(B *testing.B) { - B.StopTimer() - pp := randomPath(100) - // make a real copy - ppb := append([]byte{}, []byte(pp)...) - a, b := pp, string(ppb) - - B.StartTimer() - for i := 0; i < B.N; i++ { - lessPath(a, b) - } -} - -func BenchmarkPathCompareNotEqual(B *testing.B) { - B.StopTimer() - a, b := randomPath(100), randomPath(100) - B.StartTimer() - - for i := 0; i < B.N; i++ { - lessPath(a, b) - } -} - -func BenchmarkPathCompareNative(B *testing.B) { - B.StopTimer() - a, b := randomPath(100), randomPath(100) - B.StartTimer() - - for i := 0; i < B.N; i++ { - c := a < b - c = c && false - } -} - -func BenchmarkPathCompareNativeEqual(B *testing.B) { - B.StopTimer() - pp := randomPath(100) - a, b := pp, pp - B.StartTimer() - - for i := 0; i < B.N; i++ { - c := a < b - c = c && false - } -} - -var filenameChars = []byte("abcdefghijklmnopqrstuvwxyz0123456789") -var separatorChars = []byte("._-") - -func randomPath(length int64) string { - path := "/" - for int64(len(path)) < length { - chunkLength := rand.Int63n(length-int64(len(path))) + 1 - chunk := randomFilename(chunkLength) - path += chunk - remaining := length - int64(len(path)) - if remaining == 1 { - path += randomFilename(1) - } else if remaining > 1 { - path += "/" - } - } - return path -} - -func randomFilename(length int64) string { - b := make([]byte, length) - wasSeparator := true - for i := range b { - if !wasSeparator && i < len(b)-1 && rand.Intn(4) == 0 { - b[i] = separatorChars[rand.Intn(len(separatorChars))] - wasSeparator = true - } else { - b[i] = filenameChars[rand.Intn(len(filenameChars))] - wasSeparator = false - } - } - return string(b) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/doc.go b/vendor/github.com/docker/distribution/registry/storage/doc.go deleted file mode 100644 index 387d92348..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package storage contains storage services for use in the registry -// application. It should be considered an internal package, as of Go 1.4. -package storage diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/azure/azure.go b/vendor/github.com/docker/distribution/registry/storage/driver/azure/azure.go deleted file mode 100644 index 930b76a17..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/azure/azure.go +++ /dev/null @@ -1,483 +0,0 @@ -// Package azure provides a storagedriver.StorageDriver implementation to -// store blobs in Microsoft Azure Blob Storage Service. -package azure - -import ( - "bufio" - "bytes" - "fmt" - "io" - "io/ioutil" - "net/http" - "strings" - "time" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/base" - "github.com/docker/distribution/registry/storage/driver/factory" - - azure "github.com/Azure/azure-sdk-for-go/storage" -) - -const driverName = "azure" - -const ( - paramAccountName = "accountname" - paramAccountKey = "accountkey" - paramContainer = "container" - paramRealm = "realm" - maxChunkSize = 4 * 1024 * 1024 -) - -type driver struct { - client azure.BlobStorageClient - container string -} - -type baseEmbed struct{ base.Base } - -// Driver is a storagedriver.StorageDriver implementation backed by -// Microsoft Azure Blob Storage Service. -type Driver struct{ baseEmbed } - -func init() { - factory.Register(driverName, &azureDriverFactory{}) -} - -type azureDriverFactory struct{} - -func (factory *azureDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - return FromParameters(parameters) -} - -// FromParameters constructs a new Driver with a given parameters map. -func FromParameters(parameters map[string]interface{}) (*Driver, error) { - accountName, ok := parameters[paramAccountName] - if !ok || fmt.Sprint(accountName) == "" { - return nil, fmt.Errorf("No %s parameter provided", paramAccountName) - } - - accountKey, ok := parameters[paramAccountKey] - if !ok || fmt.Sprint(accountKey) == "" { - return nil, fmt.Errorf("No %s parameter provided", paramAccountKey) - } - - container, ok := parameters[paramContainer] - if !ok || fmt.Sprint(container) == "" { - return nil, fmt.Errorf("No %s parameter provided", paramContainer) - } - - realm, ok := parameters[paramRealm] - if !ok || fmt.Sprint(realm) == "" { - realm = azure.DefaultBaseURL - } - - return New(fmt.Sprint(accountName), fmt.Sprint(accountKey), fmt.Sprint(container), fmt.Sprint(realm)) -} - -// New constructs a new Driver with the given Azure Storage Account credentials -func New(accountName, accountKey, container, realm string) (*Driver, error) { - api, err := azure.NewClient(accountName, accountKey, realm, azure.DefaultAPIVersion, true) - if err != nil { - return nil, err - } - - blobClient := api.GetBlobService() - - // Create registry container - if _, err = blobClient.CreateContainerIfNotExists(container, azure.ContainerAccessTypePrivate); err != nil { - return nil, err - } - - d := &driver{ - client: blobClient, - container: container} - return &Driver{baseEmbed: baseEmbed{Base: base.Base{StorageDriver: d}}}, nil -} - -// Implement the storagedriver.StorageDriver interface. -func (d *driver) Name() string { - return driverName -} - -// GetContent retrieves the content stored at "path" as a []byte. -func (d *driver) GetContent(ctx context.Context, path string) ([]byte, error) { - blob, err := d.client.GetBlob(d.container, path) - if err != nil { - if is404(err) { - return nil, storagedriver.PathNotFoundError{Path: path} - } - return nil, err - } - - defer blob.Close() - return ioutil.ReadAll(blob) -} - -// PutContent stores the []byte content at a location designated by "path". -func (d *driver) PutContent(ctx context.Context, path string, contents []byte) error { - if _, err := d.client.DeleteBlobIfExists(d.container, path, nil); err != nil { - return err - } - writer, err := d.Writer(ctx, path, false) - if err != nil { - return err - } - defer writer.Close() - _, err = writer.Write(contents) - if err != nil { - return err - } - return writer.Commit() -} - -// Reader retrieves an io.ReadCloser for the content stored at "path" with a -// given byte offset. -func (d *driver) Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) { - if ok, err := d.client.BlobExists(d.container, path); err != nil { - return nil, err - } else if !ok { - return nil, storagedriver.PathNotFoundError{Path: path} - } - - info, err := d.client.GetBlobProperties(d.container, path) - if err != nil { - return nil, err - } - - size := int64(info.ContentLength) - if offset >= size { - return ioutil.NopCloser(bytes.NewReader(nil)), nil - } - - bytesRange := fmt.Sprintf("%v-", offset) - resp, err := d.client.GetBlobRange(d.container, path, bytesRange, nil) - if err != nil { - return nil, err - } - return resp, nil -} - -// Writer returns a FileWriter which will store the content written to it -// at the location designated by "path" after the call to Commit. -func (d *driver) Writer(ctx context.Context, path string, append bool) (storagedriver.FileWriter, error) { - blobExists, err := d.client.BlobExists(d.container, path) - if err != nil { - return nil, err - } - var size int64 - if blobExists { - if append { - blobProperties, err := d.client.GetBlobProperties(d.container, path) - if err != nil { - return nil, err - } - size = blobProperties.ContentLength - } else { - err := d.client.DeleteBlob(d.container, path, nil) - if err != nil { - return nil, err - } - } - } else { - if append { - return nil, storagedriver.PathNotFoundError{Path: path} - } - err := d.client.PutAppendBlob(d.container, path, nil) - if err != nil { - return nil, err - } - } - - return d.newWriter(path, size), nil -} - -// Stat retrieves the FileInfo for the given path, including the current size -// in bytes and the creation time. -func (d *driver) Stat(ctx context.Context, path string) (storagedriver.FileInfo, error) { - // Check if the path is a blob - if ok, err := d.client.BlobExists(d.container, path); err != nil { - return nil, err - } else if ok { - blob, err := d.client.GetBlobProperties(d.container, path) - if err != nil { - return nil, err - } - - mtim, err := time.Parse(http.TimeFormat, blob.LastModified) - if err != nil { - return nil, err - } - - return storagedriver.FileInfoInternal{FileInfoFields: storagedriver.FileInfoFields{ - Path: path, - Size: int64(blob.ContentLength), - ModTime: mtim, - IsDir: false, - }}, nil - } - - // Check if path is a virtual container - virtContainerPath := path - if !strings.HasSuffix(virtContainerPath, "/") { - virtContainerPath += "/" - } - blobs, err := d.client.ListBlobs(d.container, azure.ListBlobsParameters{ - Prefix: virtContainerPath, - MaxResults: 1, - }) - if err != nil { - return nil, err - } - if len(blobs.Blobs) > 0 { - // path is a virtual container - return storagedriver.FileInfoInternal{FileInfoFields: storagedriver.FileInfoFields{ - Path: path, - IsDir: true, - }}, nil - } - - // path is not a blob or virtual container - return nil, storagedriver.PathNotFoundError{Path: path} -} - -// List returns a list of the objects that are direct descendants of the given -// path. -func (d *driver) List(ctx context.Context, path string) ([]string, error) { - if path == "/" { - path = "" - } - - blobs, err := d.listBlobs(d.container, path) - if err != nil { - return blobs, err - } - - list := directDescendants(blobs, path) - if path != "" && len(list) == 0 { - return nil, storagedriver.PathNotFoundError{Path: path} - } - return list, nil -} - -// Move moves an object stored at sourcePath to destPath, removing the original -// object. -func (d *driver) Move(ctx context.Context, sourcePath string, destPath string) error { - sourceBlobURL := d.client.GetBlobURL(d.container, sourcePath) - err := d.client.CopyBlob(d.container, destPath, sourceBlobURL) - if err != nil { - if is404(err) { - return storagedriver.PathNotFoundError{Path: sourcePath} - } - return err - } - - return d.client.DeleteBlob(d.container, sourcePath, nil) -} - -// Delete recursively deletes all objects stored at "path" and its subpaths. -func (d *driver) Delete(ctx context.Context, path string) error { - ok, err := d.client.DeleteBlobIfExists(d.container, path, nil) - if err != nil { - return err - } - if ok { - return nil // was a blob and deleted, return - } - - // Not a blob, see if path is a virtual container with blobs - blobs, err := d.listBlobs(d.container, path) - if err != nil { - return err - } - - for _, b := range blobs { - if err = d.client.DeleteBlob(d.container, b, nil); err != nil { - return err - } - } - - if len(blobs) == 0 { - return storagedriver.PathNotFoundError{Path: path} - } - return nil -} - -// URLFor returns a publicly accessible URL for the blob stored at given path -// for specified duration by making use of Azure Storage Shared Access Signatures (SAS). -// See https://msdn.microsoft.com/en-us/library/azure/ee395415.aspx for more info. -func (d *driver) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { - expiresTime := time.Now().UTC().Add(20 * time.Minute) // default expiration - expires, ok := options["expiry"] - if ok { - t, ok := expires.(time.Time) - if ok { - expiresTime = t - } - } - return d.client.GetBlobSASURI(d.container, path, expiresTime, "r") -} - -// directDescendants will find direct descendants (blobs or virtual containers) -// of from list of blob paths and will return their full paths. Elements in blobs -// list must be prefixed with a "/" and -// -// Example: direct descendants of "/" in {"/foo", "/bar/1", "/bar/2"} is -// {"/foo", "/bar"} and direct descendants of "bar" is {"/bar/1", "/bar/2"} -func directDescendants(blobs []string, prefix string) []string { - if !strings.HasPrefix(prefix, "/") { // add trailing '/' - prefix = "/" + prefix - } - if !strings.HasSuffix(prefix, "/") { // containerify the path - prefix += "/" - } - - out := make(map[string]bool) - for _, b := range blobs { - if strings.HasPrefix(b, prefix) { - rel := b[len(prefix):] - c := strings.Count(rel, "/") - if c == 0 { - out[b] = true - } else { - out[prefix+rel[:strings.Index(rel, "/")]] = true - } - } - } - - var keys []string - for k := range out { - keys = append(keys, k) - } - return keys -} - -func (d *driver) listBlobs(container, virtPath string) ([]string, error) { - if virtPath != "" && !strings.HasSuffix(virtPath, "/") { // containerify the path - virtPath += "/" - } - - out := []string{} - marker := "" - for { - resp, err := d.client.ListBlobs(d.container, azure.ListBlobsParameters{ - Marker: marker, - Prefix: virtPath, - }) - - if err != nil { - return out, err - } - - for _, b := range resp.Blobs { - out = append(out, b.Name) - } - - if len(resp.Blobs) == 0 || resp.NextMarker == "" { - break - } - marker = resp.NextMarker - } - return out, nil -} - -func is404(err error) bool { - statusCodeErr, ok := err.(azure.AzureStorageServiceError) - return ok && statusCodeErr.StatusCode == http.StatusNotFound -} - -type writer struct { - driver *driver - path string - size int64 - bw *bufio.Writer - closed bool - committed bool - cancelled bool -} - -func (d *driver) newWriter(path string, size int64) storagedriver.FileWriter { - return &writer{ - driver: d, - path: path, - size: size, - bw: bufio.NewWriterSize(&blockWriter{ - client: d.client, - container: d.container, - path: path, - }, maxChunkSize), - } -} - -func (w *writer) Write(p []byte) (int, error) { - if w.closed { - return 0, fmt.Errorf("already closed") - } else if w.committed { - return 0, fmt.Errorf("already committed") - } else if w.cancelled { - return 0, fmt.Errorf("already cancelled") - } - - n, err := w.bw.Write(p) - w.size += int64(n) - return n, err -} - -func (w *writer) Size() int64 { - return w.size -} - -func (w *writer) Close() error { - if w.closed { - return fmt.Errorf("already closed") - } - w.closed = true - return w.bw.Flush() -} - -func (w *writer) Cancel() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } - w.cancelled = true - return w.driver.client.DeleteBlob(w.driver.container, w.path, nil) -} - -func (w *writer) Commit() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } else if w.cancelled { - return fmt.Errorf("already cancelled") - } - w.committed = true - return w.bw.Flush() -} - -type blockWriter struct { - client azure.BlobStorageClient - container string - path string -} - -func (bw *blockWriter) Write(p []byte) (int, error) { - n := 0 - for offset := 0; offset < len(p); offset += maxChunkSize { - chunkSize := maxChunkSize - if offset+chunkSize > len(p) { - chunkSize = len(p) - offset - } - err := bw.client.AppendBlock(bw.container, bw.path, p[offset:offset+chunkSize], nil) - if err != nil { - return n, err - } - - n += chunkSize - } - - return n, nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/azure/azure_test.go b/vendor/github.com/docker/distribution/registry/storage/driver/azure/azure_test.go deleted file mode 100644 index 4a0661b3e..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/azure/azure_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package azure - -import ( - "fmt" - "os" - "strings" - "testing" - - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/testsuites" - . "gopkg.in/check.v1" -) - -const ( - envAccountName = "AZURE_STORAGE_ACCOUNT_NAME" - envAccountKey = "AZURE_STORAGE_ACCOUNT_KEY" - envContainer = "AZURE_STORAGE_CONTAINER" - envRealm = "AZURE_STORAGE_REALM" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { TestingT(t) } - -func init() { - var ( - accountName string - accountKey string - container string - realm string - ) - - config := []struct { - env string - value *string - }{ - {envAccountName, &accountName}, - {envAccountKey, &accountKey}, - {envContainer, &container}, - {envRealm, &realm}, - } - - missing := []string{} - for _, v := range config { - *v.value = os.Getenv(v.env) - if *v.value == "" { - missing = append(missing, v.env) - } - } - - azureDriverConstructor := func() (storagedriver.StorageDriver, error) { - return New(accountName, accountKey, container, realm) - } - - // Skip Azure storage driver tests if environment variable parameters are not provided - skipCheck := func() string { - if len(missing) > 0 { - return fmt.Sprintf("Must set %s environment variables to run Azure tests", strings.Join(missing, ", ")) - } - return "" - } - - testsuites.RegisterSuite(azureDriverConstructor, skipCheck) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/base/base.go b/vendor/github.com/docker/distribution/registry/storage/driver/base/base.go deleted file mode 100644 index e14f7edb1..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/base/base.go +++ /dev/null @@ -1,198 +0,0 @@ -// Package base provides a base implementation of the storage driver that can -// be used to implement common checks. The goal is to increase the amount of -// code sharing. -// -// The canonical approach to use this class is to embed in the exported driver -// struct such that calls are proxied through this implementation. First, -// declare the internal driver, as follows: -// -// type driver struct { ... internal ...} -// -// The resulting type should implement StorageDriver such that it can be the -// target of a Base struct. The exported type can then be declared as follows: -// -// type Driver struct { -// Base -// } -// -// Because Driver embeds Base, it effectively implements Base. If the driver -// needs to intercept a call, before going to base, Driver should implement -// that method. Effectively, Driver can intercept calls before coming in and -// driver implements the actual logic. -// -// To further shield the embed from other packages, it is recommended to -// employ a private embed struct: -// -// type baseEmbed struct { -// base.Base -// } -// -// Then, declare driver to embed baseEmbed, rather than Base directly: -// -// type Driver struct { -// baseEmbed -// } -// -// The type now implements StorageDriver, proxying through Base, without -// exporting an unnecessary field. -package base - -import ( - "io" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" -) - -// Base provides a wrapper around a storagedriver implementation that provides -// common path and bounds checking. -type Base struct { - storagedriver.StorageDriver -} - -// Format errors received from the storage driver -func (base *Base) setDriverName(e error) error { - switch actual := e.(type) { - case nil: - return nil - case storagedriver.ErrUnsupportedMethod: - actual.DriverName = base.StorageDriver.Name() - return actual - case storagedriver.PathNotFoundError: - actual.DriverName = base.StorageDriver.Name() - return actual - case storagedriver.InvalidPathError: - actual.DriverName = base.StorageDriver.Name() - return actual - case storagedriver.InvalidOffsetError: - actual.DriverName = base.StorageDriver.Name() - return actual - default: - storageError := storagedriver.Error{ - DriverName: base.StorageDriver.Name(), - Enclosed: e, - } - - return storageError - } -} - -// GetContent wraps GetContent of underlying storage driver. -func (base *Base) GetContent(ctx context.Context, path string) ([]byte, error) { - ctx, done := context.WithTrace(ctx) - defer done("%s.GetContent(%q)", base.Name(), path) - - if !storagedriver.PathRegexp.MatchString(path) { - return nil, storagedriver.InvalidPathError{Path: path, DriverName: base.StorageDriver.Name()} - } - - b, e := base.StorageDriver.GetContent(ctx, path) - return b, base.setDriverName(e) -} - -// PutContent wraps PutContent of underlying storage driver. -func (base *Base) PutContent(ctx context.Context, path string, content []byte) error { - ctx, done := context.WithTrace(ctx) - defer done("%s.PutContent(%q)", base.Name(), path) - - if !storagedriver.PathRegexp.MatchString(path) { - return storagedriver.InvalidPathError{Path: path, DriverName: base.StorageDriver.Name()} - } - - return base.setDriverName(base.StorageDriver.PutContent(ctx, path, content)) -} - -// Reader wraps Reader of underlying storage driver. -func (base *Base) Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) { - ctx, done := context.WithTrace(ctx) - defer done("%s.Reader(%q, %d)", base.Name(), path, offset) - - if offset < 0 { - return nil, storagedriver.InvalidOffsetError{Path: path, Offset: offset, DriverName: base.StorageDriver.Name()} - } - - if !storagedriver.PathRegexp.MatchString(path) { - return nil, storagedriver.InvalidPathError{Path: path, DriverName: base.StorageDriver.Name()} - } - - rc, e := base.StorageDriver.Reader(ctx, path, offset) - return rc, base.setDriverName(e) -} - -// Writer wraps Writer of underlying storage driver. -func (base *Base) Writer(ctx context.Context, path string, append bool) (storagedriver.FileWriter, error) { - ctx, done := context.WithTrace(ctx) - defer done("%s.Writer(%q, %v)", base.Name(), path, append) - - if !storagedriver.PathRegexp.MatchString(path) { - return nil, storagedriver.InvalidPathError{Path: path, DriverName: base.StorageDriver.Name()} - } - - writer, e := base.StorageDriver.Writer(ctx, path, append) - return writer, base.setDriverName(e) -} - -// Stat wraps Stat of underlying storage driver. -func (base *Base) Stat(ctx context.Context, path string) (storagedriver.FileInfo, error) { - ctx, done := context.WithTrace(ctx) - defer done("%s.Stat(%q)", base.Name(), path) - - if !storagedriver.PathRegexp.MatchString(path) && path != "/" { - return nil, storagedriver.InvalidPathError{Path: path, DriverName: base.StorageDriver.Name()} - } - - fi, e := base.StorageDriver.Stat(ctx, path) - return fi, base.setDriverName(e) -} - -// List wraps List of underlying storage driver. -func (base *Base) List(ctx context.Context, path string) ([]string, error) { - ctx, done := context.WithTrace(ctx) - defer done("%s.List(%q)", base.Name(), path) - - if !storagedriver.PathRegexp.MatchString(path) && path != "/" { - return nil, storagedriver.InvalidPathError{Path: path, DriverName: base.StorageDriver.Name()} - } - - str, e := base.StorageDriver.List(ctx, path) - return str, base.setDriverName(e) -} - -// Move wraps Move of underlying storage driver. -func (base *Base) Move(ctx context.Context, sourcePath string, destPath string) error { - ctx, done := context.WithTrace(ctx) - defer done("%s.Move(%q, %q", base.Name(), sourcePath, destPath) - - if !storagedriver.PathRegexp.MatchString(sourcePath) { - return storagedriver.InvalidPathError{Path: sourcePath, DriverName: base.StorageDriver.Name()} - } else if !storagedriver.PathRegexp.MatchString(destPath) { - return storagedriver.InvalidPathError{Path: destPath, DriverName: base.StorageDriver.Name()} - } - - return base.setDriverName(base.StorageDriver.Move(ctx, sourcePath, destPath)) -} - -// Delete wraps Delete of underlying storage driver. -func (base *Base) Delete(ctx context.Context, path string) error { - ctx, done := context.WithTrace(ctx) - defer done("%s.Delete(%q)", base.Name(), path) - - if !storagedriver.PathRegexp.MatchString(path) { - return storagedriver.InvalidPathError{Path: path, DriverName: base.StorageDriver.Name()} - } - - return base.setDriverName(base.StorageDriver.Delete(ctx, path)) -} - -// URLFor wraps URLFor of underlying storage driver. -func (base *Base) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { - ctx, done := context.WithTrace(ctx) - defer done("%s.URLFor(%q)", base.Name(), path) - - if !storagedriver.PathRegexp.MatchString(path) { - return "", storagedriver.InvalidPathError{Path: path, DriverName: base.StorageDriver.Name()} - } - - str, e := base.StorageDriver.URLFor(ctx, path, options) - return str, base.setDriverName(e) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/base/regulator.go b/vendor/github.com/docker/distribution/registry/storage/driver/base/regulator.go deleted file mode 100644 index 185160a4b..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/base/regulator.go +++ /dev/null @@ -1,145 +0,0 @@ -package base - -import ( - "io" - "sync" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" -) - -type regulator struct { - storagedriver.StorageDriver - *sync.Cond - - available uint64 -} - -// NewRegulator wraps the given driver and is used to regulate concurrent calls -// to the given storage driver to a maximum of the given limit. This is useful -// for storage drivers that would otherwise create an unbounded number of OS -// threads if allowed to be called unregulated. -func NewRegulator(driver storagedriver.StorageDriver, limit uint64) storagedriver.StorageDriver { - return ®ulator{ - StorageDriver: driver, - Cond: sync.NewCond(&sync.Mutex{}), - available: limit, - } -} - -func (r *regulator) enter() { - r.L.Lock() - for r.available == 0 { - r.Wait() - } - r.available-- - r.L.Unlock() -} - -func (r *regulator) exit() { - r.L.Lock() - // We only need to signal to a waiting FS operation if we're already at the - // limit of threads used - if r.available == 0 { - r.Signal() - } - r.available++ - r.L.Unlock() -} - -// Name returns the human-readable "name" of the driver, useful in error -// messages and logging. By convention, this will just be the registration -// name, but drivers may provide other information here. -func (r *regulator) Name() string { - r.enter() - defer r.exit() - - return r.StorageDriver.Name() -} - -// GetContent retrieves the content stored at "path" as a []byte. -// This should primarily be used for small objects. -func (r *regulator) GetContent(ctx context.Context, path string) ([]byte, error) { - r.enter() - defer r.exit() - - return r.StorageDriver.GetContent(ctx, path) -} - -// PutContent stores the []byte content at a location designated by "path". -// This should primarily be used for small objects. -func (r *regulator) PutContent(ctx context.Context, path string, content []byte) error { - r.enter() - defer r.exit() - - return r.StorageDriver.PutContent(ctx, path, content) -} - -// Reader retrieves an io.ReadCloser for the content stored at "path" -// with a given byte offset. -// May be used to resume reading a stream by providing a nonzero offset. -func (r *regulator) Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) { - r.enter() - defer r.exit() - - return r.StorageDriver.Reader(ctx, path, offset) -} - -// Writer stores the contents of the provided io.ReadCloser at a -// location designated by the given path. -// May be used to resume writing a stream by providing a nonzero offset. -// The offset must be no larger than the CurrentSize for this path. -func (r *regulator) Writer(ctx context.Context, path string, append bool) (storagedriver.FileWriter, error) { - r.enter() - defer r.exit() - - return r.StorageDriver.Writer(ctx, path, append) -} - -// Stat retrieves the FileInfo for the given path, including the current -// size in bytes and the creation time. -func (r *regulator) Stat(ctx context.Context, path string) (storagedriver.FileInfo, error) { - r.enter() - defer r.exit() - - return r.StorageDriver.Stat(ctx, path) -} - -// List returns a list of the objects that are direct descendants of the -//given path. -func (r *regulator) List(ctx context.Context, path string) ([]string, error) { - r.enter() - defer r.exit() - - return r.StorageDriver.List(ctx, path) -} - -// Move moves an object stored at sourcePath to destPath, removing the -// original object. -// Note: This may be no more efficient than a copy followed by a delete for -// many implementations. -func (r *regulator) Move(ctx context.Context, sourcePath string, destPath string) error { - r.enter() - defer r.exit() - - return r.StorageDriver.Move(ctx, sourcePath, destPath) -} - -// Delete recursively deletes all objects stored at "path" and its subpaths. -func (r *regulator) Delete(ctx context.Context, path string) error { - r.enter() - defer r.exit() - - return r.StorageDriver.Delete(ctx, path) -} - -// URLFor returns a URL which may be used to retrieve the content stored at -// the given path, possibly using the given options. -// May return an ErrUnsupportedMethod in certain StorageDriver -// implementations. -func (r *regulator) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { - r.enter() - defer r.exit() - - return r.StorageDriver.URLFor(ctx, path, options) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/factory/factory.go b/vendor/github.com/docker/distribution/registry/storage/driver/factory/factory.go deleted file mode 100644 index a9c04ec59..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/factory/factory.go +++ /dev/null @@ -1,64 +0,0 @@ -package factory - -import ( - "fmt" - - storagedriver "github.com/docker/distribution/registry/storage/driver" -) - -// driverFactories stores an internal mapping between storage driver names and their respective -// factories -var driverFactories = make(map[string]StorageDriverFactory) - -// StorageDriverFactory is a factory interface for creating storagedriver.StorageDriver interfaces -// Storage drivers should call Register() with a factory to make the driver available by name. -// Individual StorageDriver implementations generally register with the factory via the Register -// func (below) in their init() funcs, and as such they should be imported anonymously before use. -// See below for an example of how to register and get a StorageDriver for S3 -// -// import _ "github.com/docker/distribution/registry/storage/driver/s3-aws" -// s3Driver, err = factory.Create("s3", storageParams) -// // assuming no error, s3Driver is the StorageDriver that communicates with S3 according to storageParams -type StorageDriverFactory interface { - // Create returns a new storagedriver.StorageDriver with the given parameters - // Parameters will vary by driver and may be ignored - // Each parameter key must only consist of lowercase letters and numbers - Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) -} - -// Register makes a storage driver available by the provided name. -// If Register is called twice with the same name or if driver factory is nil, it panics. -// Additionally, it is not concurrency safe. Most Storage Drivers call this function -// in their init() functions. See the documentation for StorageDriverFactory for more. -func Register(name string, factory StorageDriverFactory) { - if factory == nil { - panic("Must not provide nil StorageDriverFactory") - } - _, registered := driverFactories[name] - if registered { - panic(fmt.Sprintf("StorageDriverFactory named %s already registered", name)) - } - - driverFactories[name] = factory -} - -// Create a new storagedriver.StorageDriver with the given name and -// parameters. To use a driver, the StorageDriverFactory must first be -// registered with the given name. If no drivers are found, an -// InvalidStorageDriverError is returned -func Create(name string, parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - driverFactory, ok := driverFactories[name] - if !ok { - return nil, InvalidStorageDriverError{name} - } - return driverFactory.Create(parameters) -} - -// InvalidStorageDriverError records an attempt to construct an unregistered storage driver -type InvalidStorageDriverError struct { - Name string -} - -func (err InvalidStorageDriverError) Error() string { - return fmt.Sprintf("StorageDriver not registered: %s", err.Name) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/fileinfo.go b/vendor/github.com/docker/distribution/registry/storage/driver/fileinfo.go deleted file mode 100644 index e5064029a..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/fileinfo.go +++ /dev/null @@ -1,79 +0,0 @@ -package driver - -import "time" - -// FileInfo returns information about a given path. Inspired by os.FileInfo, -// it elides the base name method for a full path instead. -type FileInfo interface { - // Path provides the full path of the target of this file info. - Path() string - - // Size returns current length in bytes of the file. The return value can - // be used to write to the end of the file at path. The value is - // meaningless if IsDir returns true. - Size() int64 - - // ModTime returns the modification time for the file. For backends that - // don't have a modification time, the creation time should be returned. - ModTime() time.Time - - // IsDir returns true if the path is a directory. - IsDir() bool -} - -// NOTE(stevvooe): The next two types, FileInfoFields and FileInfoInternal -// should only be used by storagedriver implementations. They should moved to -// a "driver" package, similar to database/sql. - -// FileInfoFields provides the exported fields for implementing FileInfo -// interface in storagedriver implementations. It should be used with -// InternalFileInfo. -type FileInfoFields struct { - // Path provides the full path of the target of this file info. - Path string - - // Size is current length in bytes of the file. The value of this field - // can be used to write to the end of the file at path. The value is - // meaningless if IsDir is set to true. - Size int64 - - // ModTime returns the modification time for the file. For backends that - // don't have a modification time, the creation time should be returned. - ModTime time.Time - - // IsDir returns true if the path is a directory. - IsDir bool -} - -// FileInfoInternal implements the FileInfo interface. This should only be -// used by storagedriver implementations that don't have a specialized -// FileInfo type. -type FileInfoInternal struct { - FileInfoFields -} - -var _ FileInfo = FileInfoInternal{} -var _ FileInfo = &FileInfoInternal{} - -// Path provides the full path of the target of this file info. -func (fi FileInfoInternal) Path() string { - return fi.FileInfoFields.Path -} - -// Size returns current length in bytes of the file. The return value can -// be used to write to the end of the file at path. The value is -// meaningless if IsDir returns true. -func (fi FileInfoInternal) Size() int64 { - return fi.FileInfoFields.Size -} - -// ModTime returns the modification time for the file. For backends that -// don't have a modification time, the creation time should be returned. -func (fi FileInfoInternal) ModTime() time.Time { - return fi.FileInfoFields.ModTime -} - -// IsDir returns true if the path is a directory. -func (fi FileInfoInternal) IsDir() bool { - return fi.FileInfoFields.IsDir -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/filesystem/driver.go b/vendor/github.com/docker/distribution/registry/storage/driver/filesystem/driver.go deleted file mode 100644 index 649e2bc23..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/filesystem/driver.go +++ /dev/null @@ -1,440 +0,0 @@ -package filesystem - -import ( - "bufio" - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "path" - "reflect" - "strconv" - "time" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/base" - "github.com/docker/distribution/registry/storage/driver/factory" -) - -const ( - driverName = "filesystem" - defaultRootDirectory = "/var/lib/registry" - defaultMaxThreads = uint64(100) - - // minThreads is the minimum value for the maxthreads configuration - // parameter. If the driver's parameters are less than this we set - // the parameters to minThreads - minThreads = uint64(25) -) - -// DriverParameters represents all configuration options available for the -// filesystem driver -type DriverParameters struct { - RootDirectory string - MaxThreads uint64 -} - -func init() { - factory.Register(driverName, &filesystemDriverFactory{}) -} - -// filesystemDriverFactory implements the factory.StorageDriverFactory interface -type filesystemDriverFactory struct{} - -func (factory *filesystemDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - return FromParameters(parameters) -} - -type driver struct { - rootDirectory string -} - -type baseEmbed struct { - base.Base -} - -// Driver is a storagedriver.StorageDriver implementation backed by a local -// filesystem. All provided paths will be subpaths of the RootDirectory. -type Driver struct { - baseEmbed -} - -// FromParameters constructs a new Driver with a given parameters map -// Optional Parameters: -// - rootdirectory -// - maxthreads -func FromParameters(parameters map[string]interface{}) (*Driver, error) { - params, err := fromParametersImpl(parameters) - if err != nil || params == nil { - return nil, err - } - return New(*params), nil -} - -func fromParametersImpl(parameters map[string]interface{}) (*DriverParameters, error) { - var ( - err error - maxThreads = defaultMaxThreads - rootDirectory = defaultRootDirectory - ) - - if parameters != nil { - if rootDir, ok := parameters["rootdirectory"]; ok { - rootDirectory = fmt.Sprint(rootDir) - } - - // Get maximum number of threads for blocking filesystem operations, - // if specified - threads := parameters["maxthreads"] - switch v := threads.(type) { - case string: - if maxThreads, err = strconv.ParseUint(v, 0, 64); err != nil { - return nil, fmt.Errorf("maxthreads parameter must be an integer, %v invalid", threads) - } - case uint64: - maxThreads = v - case int, int32, int64: - val := reflect.ValueOf(v).Convert(reflect.TypeOf(threads)).Int() - // If threads is negative casting to uint64 will wrap around and - // give you the hugest thread limit ever. Let's be sensible, here - if val > 0 { - maxThreads = uint64(val) - } - case uint, uint32: - maxThreads = reflect.ValueOf(v).Convert(reflect.TypeOf(threads)).Uint() - case nil: - // do nothing - default: - return nil, fmt.Errorf("invalid value for maxthreads: %#v", threads) - } - - if maxThreads < minThreads { - maxThreads = minThreads - } - } - - params := &DriverParameters{ - RootDirectory: rootDirectory, - MaxThreads: maxThreads, - } - return params, nil -} - -// New constructs a new Driver with a given rootDirectory -func New(params DriverParameters) *Driver { - fsDriver := &driver{rootDirectory: params.RootDirectory} - - return &Driver{ - baseEmbed: baseEmbed{ - Base: base.Base{ - StorageDriver: base.NewRegulator(fsDriver, params.MaxThreads), - }, - }, - } -} - -// Implement the storagedriver.StorageDriver interface - -func (d *driver) Name() string { - return driverName -} - -// GetContent retrieves the content stored at "path" as a []byte. -func (d *driver) GetContent(ctx context.Context, path string) ([]byte, error) { - rc, err := d.Reader(ctx, path, 0) - if err != nil { - return nil, err - } - defer rc.Close() - - p, err := ioutil.ReadAll(rc) - if err != nil { - return nil, err - } - - return p, nil -} - -// PutContent stores the []byte content at a location designated by "path". -func (d *driver) PutContent(ctx context.Context, subPath string, contents []byte) error { - writer, err := d.Writer(ctx, subPath, false) - if err != nil { - return err - } - defer writer.Close() - _, err = io.Copy(writer, bytes.NewReader(contents)) - if err != nil { - writer.Cancel() - return err - } - return writer.Commit() -} - -// Reader retrieves an io.ReadCloser for the content stored at "path" with a -// given byte offset. -func (d *driver) Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) { - file, err := os.OpenFile(d.fullPath(path), os.O_RDONLY, 0644) - if err != nil { - if os.IsNotExist(err) { - return nil, storagedriver.PathNotFoundError{Path: path} - } - - return nil, err - } - - seekPos, err := file.Seek(int64(offset), os.SEEK_SET) - if err != nil { - file.Close() - return nil, err - } else if seekPos < int64(offset) { - file.Close() - return nil, storagedriver.InvalidOffsetError{Path: path, Offset: offset} - } - - return file, nil -} - -func (d *driver) Writer(ctx context.Context, subPath string, append bool) (storagedriver.FileWriter, error) { - fullPath := d.fullPath(subPath) - parentDir := path.Dir(fullPath) - if err := os.MkdirAll(parentDir, 0777); err != nil { - return nil, err - } - - fp, err := os.OpenFile(fullPath, os.O_WRONLY|os.O_CREATE, 0666) - if err != nil { - return nil, err - } - - var offset int64 - - if !append { - err := fp.Truncate(0) - if err != nil { - fp.Close() - return nil, err - } - } else { - n, err := fp.Seek(0, os.SEEK_END) - if err != nil { - fp.Close() - return nil, err - } - offset = int64(n) - } - - return newFileWriter(fp, offset), nil -} - -// Stat retrieves the FileInfo for the given path, including the current size -// in bytes and the creation time. -func (d *driver) Stat(ctx context.Context, subPath string) (storagedriver.FileInfo, error) { - fullPath := d.fullPath(subPath) - - fi, err := os.Stat(fullPath) - if err != nil { - if os.IsNotExist(err) { - return nil, storagedriver.PathNotFoundError{Path: subPath} - } - - return nil, err - } - - return fileInfo{ - path: subPath, - FileInfo: fi, - }, nil -} - -// List returns a list of the objects that are direct descendants of the given -// path. -func (d *driver) List(ctx context.Context, subPath string) ([]string, error) { - fullPath := d.fullPath(subPath) - - dir, err := os.Open(fullPath) - if err != nil { - if os.IsNotExist(err) { - return nil, storagedriver.PathNotFoundError{Path: subPath} - } - return nil, err - } - - defer dir.Close() - - fileNames, err := dir.Readdirnames(0) - if err != nil { - return nil, err - } - - keys := make([]string, 0, len(fileNames)) - for _, fileName := range fileNames { - keys = append(keys, path.Join(subPath, fileName)) - } - - return keys, nil -} - -// Move moves an object stored at sourcePath to destPath, removing the original -// object. -func (d *driver) Move(ctx context.Context, sourcePath string, destPath string) error { - source := d.fullPath(sourcePath) - dest := d.fullPath(destPath) - - if _, err := os.Stat(source); os.IsNotExist(err) { - return storagedriver.PathNotFoundError{Path: sourcePath} - } - - if err := os.MkdirAll(path.Dir(dest), 0755); err != nil { - return err - } - - err := os.Rename(source, dest) - return err -} - -// Delete recursively deletes all objects stored at "path" and its subpaths. -func (d *driver) Delete(ctx context.Context, subPath string) error { - fullPath := d.fullPath(subPath) - - _, err := os.Stat(fullPath) - if err != nil && !os.IsNotExist(err) { - return err - } else if err != nil { - return storagedriver.PathNotFoundError{Path: subPath} - } - - err = os.RemoveAll(fullPath) - return err -} - -// URLFor returns a URL which may be used to retrieve the content stored at the given path. -// May return an UnsupportedMethodErr in certain StorageDriver implementations. -func (d *driver) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { - return "", storagedriver.ErrUnsupportedMethod{} -} - -// fullPath returns the absolute path of a key within the Driver's storage. -func (d *driver) fullPath(subPath string) string { - return path.Join(d.rootDirectory, subPath) -} - -type fileInfo struct { - os.FileInfo - path string -} - -var _ storagedriver.FileInfo = fileInfo{} - -// Path provides the full path of the target of this file info. -func (fi fileInfo) Path() string { - return fi.path -} - -// Size returns current length in bytes of the file. The return value can -// be used to write to the end of the file at path. The value is -// meaningless if IsDir returns true. -func (fi fileInfo) Size() int64 { - if fi.IsDir() { - return 0 - } - - return fi.FileInfo.Size() -} - -// ModTime returns the modification time for the file. For backends that -// don't have a modification time, the creation time should be returned. -func (fi fileInfo) ModTime() time.Time { - return fi.FileInfo.ModTime() -} - -// IsDir returns true if the path is a directory. -func (fi fileInfo) IsDir() bool { - return fi.FileInfo.IsDir() -} - -type fileWriter struct { - file *os.File - size int64 - bw *bufio.Writer - closed bool - committed bool - cancelled bool -} - -func newFileWriter(file *os.File, size int64) *fileWriter { - return &fileWriter{ - file: file, - size: size, - bw: bufio.NewWriter(file), - } -} - -func (fw *fileWriter) Write(p []byte) (int, error) { - if fw.closed { - return 0, fmt.Errorf("already closed") - } else if fw.committed { - return 0, fmt.Errorf("already committed") - } else if fw.cancelled { - return 0, fmt.Errorf("already cancelled") - } - n, err := fw.bw.Write(p) - fw.size += int64(n) - return n, err -} - -func (fw *fileWriter) Size() int64 { - return fw.size -} - -func (fw *fileWriter) Close() error { - if fw.closed { - return fmt.Errorf("already closed") - } - - if err := fw.bw.Flush(); err != nil { - return err - } - - if err := fw.file.Sync(); err != nil { - return err - } - - if err := fw.file.Close(); err != nil { - return err - } - fw.closed = true - return nil -} - -func (fw *fileWriter) Cancel() error { - if fw.closed { - return fmt.Errorf("already closed") - } - - fw.cancelled = true - fw.file.Close() - return os.Remove(fw.file.Name()) -} - -func (fw *fileWriter) Commit() error { - if fw.closed { - return fmt.Errorf("already closed") - } else if fw.committed { - return fmt.Errorf("already committed") - } else if fw.cancelled { - return fmt.Errorf("already cancelled") - } - - if err := fw.bw.Flush(); err != nil { - return err - } - - if err := fw.file.Sync(); err != nil { - return err - } - - fw.committed = true - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/filesystem/driver_test.go b/vendor/github.com/docker/distribution/registry/storage/driver/filesystem/driver_test.go deleted file mode 100644 index 3be859239..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/filesystem/driver_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package filesystem - -import ( - "io/ioutil" - "os" - "reflect" - "testing" - - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/testsuites" - . "gopkg.in/check.v1" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { TestingT(t) } - -func init() { - root, err := ioutil.TempDir("", "driver-") - if err != nil { - panic(err) - } - defer os.Remove(root) - - driver, err := FromParameters(map[string]interface{}{ - "rootdirectory": root, - }) - if err != nil { - panic(err) - } - - testsuites.RegisterSuite(func() (storagedriver.StorageDriver, error) { - return driver, nil - }, testsuites.NeverSkip) -} - -func TestFromParametersImpl(t *testing.T) { - - tests := []struct { - params map[string]interface{} // techincally the yaml can contain anything - expected DriverParameters - pass bool - }{ - // check we use default threads and root dirs - { - params: map[string]interface{}{}, - expected: DriverParameters{ - RootDirectory: defaultRootDirectory, - MaxThreads: defaultMaxThreads, - }, - pass: true, - }, - // Testing initiation with a string maxThreads which can't be parsed - { - params: map[string]interface{}{ - "maxthreads": "fail", - }, - expected: DriverParameters{}, - pass: false, - }, - { - params: map[string]interface{}{ - "maxthreads": "100", - }, - expected: DriverParameters{ - RootDirectory: defaultRootDirectory, - MaxThreads: uint64(100), - }, - pass: true, - }, - { - params: map[string]interface{}{ - "maxthreads": 100, - }, - expected: DriverParameters{ - RootDirectory: defaultRootDirectory, - MaxThreads: uint64(100), - }, - pass: true, - }, - // check that we use minimum thread counts - { - params: map[string]interface{}{ - "maxthreads": 1, - }, - expected: DriverParameters{ - RootDirectory: defaultRootDirectory, - MaxThreads: minThreads, - }, - pass: true, - }, - } - - for _, item := range tests { - params, err := fromParametersImpl(item.params) - - if !item.pass { - // We only need to assert that expected failures have an error - if err == nil { - t.Fatalf("expected error configuring filesystem driver with invalid param: %+v", item.params) - } - continue - } - - if err != nil { - t.Fatalf("unexpected error creating filesystem driver: %s", err) - } - // Note that we get a pointer to params back - if !reflect.DeepEqual(*params, item.expected) { - t.Fatalf("unexpected params from filesystem driver. expected %+v, got %+v", item.expected, params) - } - } - -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/gcs/doc.go b/vendor/github.com/docker/distribution/registry/storage/driver/gcs/doc.go deleted file mode 100644 index 0f23ea785..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/gcs/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package gcs implements the Google Cloud Storage driver backend. Support can be -// enabled by including the "include_gcs" build tag. -package gcs diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/gcs/gcs.go b/vendor/github.com/docker/distribution/registry/storage/driver/gcs/gcs.go deleted file mode 100644 index 1369c280a..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/gcs/gcs.go +++ /dev/null @@ -1,873 +0,0 @@ -// Package gcs provides a storagedriver.StorageDriver implementation to -// store blobs in Google cloud storage. -// -// This package leverages the google.golang.org/cloud/storage client library -//for interfacing with gcs. -// -// Because gcs is a key, value store the Stat call does not support last modification -// time for directories (directories are an abstraction for key, value stores) -// -// Note that the contents of incomplete uploads are not accessible even though -// Stat returns their length -// -// +build include_gcs - -package gcs - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "math/rand" - "net/http" - "net/url" - "reflect" - "regexp" - "sort" - "strconv" - "strings" - "time" - - "golang.org/x/net/context" - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - "golang.org/x/oauth2/jwt" - "google.golang.org/api/googleapi" - "google.golang.org/cloud" - "google.golang.org/cloud/storage" - - "github.com/Sirupsen/logrus" - - ctx "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/base" - "github.com/docker/distribution/registry/storage/driver/factory" -) - -const ( - driverName = "gcs" - dummyProjectID = "" - - uploadSessionContentType = "application/x-docker-upload-session" - minChunkSize = 256 * 1024 - defaultChunkSize = 20 * minChunkSize - - maxTries = 5 -) - -var rangeHeader = regexp.MustCompile(`^bytes=([0-9])+-([0-9]+)$`) - -// driverParameters is a struct that encapsulates all of the driver parameters after all values have been set -type driverParameters struct { - bucket string - config *jwt.Config - email string - privateKey []byte - client *http.Client - rootDirectory string - chunkSize int -} - -func init() { - factory.Register(driverName, &gcsDriverFactory{}) -} - -// gcsDriverFactory implements the factory.StorageDriverFactory interface -type gcsDriverFactory struct{} - -// Create StorageDriver from parameters -func (factory *gcsDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - return FromParameters(parameters) -} - -// driver is a storagedriver.StorageDriver implementation backed by GCS -// Objects are stored at absolute keys in the provided bucket. -type driver struct { - client *http.Client - bucket string - email string - privateKey []byte - rootDirectory string - chunkSize int -} - -// FromParameters constructs a new Driver with a given parameters map -// Required parameters: -// - bucket -func FromParameters(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - bucket, ok := parameters["bucket"] - if !ok || fmt.Sprint(bucket) == "" { - return nil, fmt.Errorf("No bucket parameter provided") - } - - rootDirectory, ok := parameters["rootdirectory"] - if !ok { - rootDirectory = "" - } - - chunkSize := defaultChunkSize - chunkSizeParam, ok := parameters["chunksize"] - if ok { - switch v := chunkSizeParam.(type) { - case string: - vv, err := strconv.Atoi(v) - if err != nil { - return nil, fmt.Errorf("chunksize parameter must be an integer, %v invalid", chunkSizeParam) - } - chunkSize = vv - case int, uint, int32, uint32, uint64, int64: - chunkSize = int(reflect.ValueOf(v).Convert(reflect.TypeOf(chunkSize)).Int()) - default: - return nil, fmt.Errorf("invalid valud for chunksize: %#v", chunkSizeParam) - } - - if chunkSize < minChunkSize { - return nil, fmt.Errorf("The chunksize %#v parameter should be a number that is larger than or equal to %d", chunkSize, minChunkSize) - } - - if chunkSize%minChunkSize != 0 { - return nil, fmt.Errorf("chunksize should be a multiple of %d", minChunkSize) - } - } - - var ts oauth2.TokenSource - jwtConf := new(jwt.Config) - if keyfile, ok := parameters["keyfile"]; ok { - jsonKey, err := ioutil.ReadFile(fmt.Sprint(keyfile)) - if err != nil { - return nil, err - } - jwtConf, err = google.JWTConfigFromJSON(jsonKey, storage.ScopeFullControl) - if err != nil { - return nil, err - } - ts = jwtConf.TokenSource(context.Background()) - } else { - var err error - ts, err = google.DefaultTokenSource(context.Background(), storage.ScopeFullControl) - if err != nil { - return nil, err - } - } - - params := driverParameters{ - bucket: fmt.Sprint(bucket), - rootDirectory: fmt.Sprint(rootDirectory), - email: jwtConf.Email, - privateKey: jwtConf.PrivateKey, - client: oauth2.NewClient(context.Background(), ts), - chunkSize: chunkSize, - } - - return New(params) -} - -// New constructs a new driver -func New(params driverParameters) (storagedriver.StorageDriver, error) { - rootDirectory := strings.Trim(params.rootDirectory, "/") - if rootDirectory != "" { - rootDirectory += "/" - } - if params.chunkSize <= 0 || params.chunkSize%minChunkSize != 0 { - return nil, fmt.Errorf("Invalid chunksize: %d is not a positive multiple of %d", params.chunkSize, minChunkSize) - } - d := &driver{ - bucket: params.bucket, - rootDirectory: rootDirectory, - email: params.email, - privateKey: params.privateKey, - client: params.client, - chunkSize: params.chunkSize, - } - - return &base.Base{ - StorageDriver: d, - }, nil -} - -// Implement the storagedriver.StorageDriver interface - -func (d *driver) Name() string { - return driverName -} - -// GetContent retrieves the content stored at "path" as a []byte. -// This should primarily be used for small objects. -func (d *driver) GetContent(context ctx.Context, path string) ([]byte, error) { - gcsContext := d.context(context) - name := d.pathToKey(path) - var rc io.ReadCloser - err := retry(func() error { - var err error - rc, err = storage.NewReader(gcsContext, d.bucket, name) - return err - }) - if err == storage.ErrObjectNotExist { - return nil, storagedriver.PathNotFoundError{Path: path} - } - if err != nil { - return nil, err - } - defer rc.Close() - - p, err := ioutil.ReadAll(rc) - if err != nil { - return nil, err - } - return p, nil -} - -// PutContent stores the []byte content at a location designated by "path". -// This should primarily be used for small objects. -func (d *driver) PutContent(context ctx.Context, path string, contents []byte) error { - return retry(func() error { - wc := storage.NewWriter(d.context(context), d.bucket, d.pathToKey(path)) - wc.ContentType = "application/octet-stream" - return putContentsClose(wc, contents) - }) -} - -// Reader retrieves an io.ReadCloser for the content stored at "path" -// with a given byte offset. -// May be used to resume reading a stream by providing a nonzero offset. -func (d *driver) Reader(context ctx.Context, path string, offset int64) (io.ReadCloser, error) { - res, err := getObject(d.client, d.bucket, d.pathToKey(path), offset) - if err != nil { - if res != nil { - if res.StatusCode == http.StatusNotFound { - res.Body.Close() - return nil, storagedriver.PathNotFoundError{Path: path} - } - - if res.StatusCode == http.StatusRequestedRangeNotSatisfiable { - res.Body.Close() - obj, err := storageStatObject(d.context(context), d.bucket, d.pathToKey(path)) - if err != nil { - return nil, err - } - if offset == int64(obj.Size) { - return ioutil.NopCloser(bytes.NewReader([]byte{})), nil - } - return nil, storagedriver.InvalidOffsetError{Path: path, Offset: offset} - } - } - return nil, err - } - if res.Header.Get("Content-Type") == uploadSessionContentType { - defer res.Body.Close() - return nil, storagedriver.PathNotFoundError{Path: path} - } - return res.Body, nil -} - -func getObject(client *http.Client, bucket string, name string, offset int64) (*http.Response, error) { - // copied from google.golang.org/cloud/storage#NewReader : - // to set the additional "Range" header - u := &url.URL{ - Scheme: "https", - Host: "storage.googleapis.com", - Path: fmt.Sprintf("/%s/%s", bucket, name), - } - req, err := http.NewRequest("GET", u.String(), nil) - if err != nil { - return nil, err - } - if offset > 0 { - req.Header.Set("Range", fmt.Sprintf("bytes=%v-", offset)) - } - var res *http.Response - err = retry(func() error { - var err error - res, err = client.Do(req) - return err - }) - if err != nil { - return nil, err - } - return res, googleapi.CheckMediaResponse(res) -} - -// Writer returns a FileWriter which will store the content written to it -// at the location designated by "path" after the call to Commit. -func (d *driver) Writer(context ctx.Context, path string, append bool) (storagedriver.FileWriter, error) { - writer := &writer{ - client: d.client, - bucket: d.bucket, - name: d.pathToKey(path), - buffer: make([]byte, d.chunkSize), - } - - if append { - err := writer.init(path) - if err != nil { - return nil, err - } - } - return writer, nil -} - -type writer struct { - client *http.Client - bucket string - name string - size int64 - offset int64 - closed bool - sessionURI string - buffer []byte - buffSize int -} - -// Cancel removes any written content from this FileWriter. -func (w *writer) Cancel() error { - w.closed = true - err := storageDeleteObject(cloud.NewContext(dummyProjectID, w.client), w.bucket, w.name) - if err != nil { - if status, ok := err.(*googleapi.Error); ok { - if status.Code == http.StatusNotFound { - err = nil - } - } - } - return err -} - -func (w *writer) Close() error { - if w.closed { - return nil - } - w.closed = true - - err := w.writeChunk() - if err != nil { - return err - } - - // Copy the remaining bytes from the buffer to the upload session - // Normally buffSize will be smaller than minChunkSize. However, in the - // unlikely event that the upload session failed to start, this number could be higher. - // In this case we can safely clip the remaining bytes to the minChunkSize - if w.buffSize > minChunkSize { - w.buffSize = minChunkSize - } - - // commit the writes by updating the upload session - err = retry(func() error { - wc := storage.NewWriter(cloud.NewContext(dummyProjectID, w.client), w.bucket, w.name) - wc.ContentType = uploadSessionContentType - wc.Metadata = map[string]string{ - "Session-URI": w.sessionURI, - "Offset": strconv.FormatInt(w.offset, 10), - } - return putContentsClose(wc, w.buffer[0:w.buffSize]) - }) - if err != nil { - return err - } - w.size = w.offset + int64(w.buffSize) - w.buffSize = 0 - return nil -} - -func putContentsClose(wc *storage.Writer, contents []byte) error { - size := len(contents) - var nn int - var err error - for nn < size { - n, err := wc.Write(contents[nn:size]) - nn += n - if err != nil { - break - } - } - if err != nil { - wc.CloseWithError(err) - return err - } - return wc.Close() -} - -// Commit flushes all content written to this FileWriter and makes it -// available for future calls to StorageDriver.GetContent and -// StorageDriver.Reader. -func (w *writer) Commit() error { - - if err := w.checkClosed(); err != nil { - return err - } - w.closed = true - - // no session started yet just perform a simple upload - if w.sessionURI == "" { - err := retry(func() error { - wc := storage.NewWriter(cloud.NewContext(dummyProjectID, w.client), w.bucket, w.name) - wc.ContentType = "application/octet-stream" - return putContentsClose(wc, w.buffer[0:w.buffSize]) - }) - if err != nil { - return err - } - w.size = w.offset + int64(w.buffSize) - w.buffSize = 0 - return nil - } - size := w.offset + int64(w.buffSize) - var nn int - // loop must be performed at least once to ensure the file is committed even when - // the buffer is empty - for { - n, err := putChunk(w.client, w.sessionURI, w.buffer[nn:w.buffSize], w.offset, size) - nn += int(n) - w.offset += n - w.size = w.offset - if err != nil { - w.buffSize = copy(w.buffer, w.buffer[nn:w.buffSize]) - return err - } - if nn == w.buffSize { - break - } - } - w.buffSize = 0 - return nil -} - -func (w *writer) checkClosed() error { - if w.closed { - return fmt.Errorf("Writer already closed") - } - return nil -} - -func (w *writer) writeChunk() error { - var err error - // chunks can be uploaded only in multiples of minChunkSize - // chunkSize is a multiple of minChunkSize less than or equal to buffSize - chunkSize := w.buffSize - (w.buffSize % minChunkSize) - if chunkSize == 0 { - return nil - } - // if their is no sessionURI yet, obtain one by starting the session - if w.sessionURI == "" { - w.sessionURI, err = startSession(w.client, w.bucket, w.name) - } - if err != nil { - return err - } - nn, err := putChunk(w.client, w.sessionURI, w.buffer[0:chunkSize], w.offset, -1) - w.offset += nn - if w.offset > w.size { - w.size = w.offset - } - // shift the remaining bytes to the start of the buffer - w.buffSize = copy(w.buffer, w.buffer[int(nn):w.buffSize]) - - return err -} - -func (w *writer) Write(p []byte) (int, error) { - err := w.checkClosed() - if err != nil { - return 0, err - } - - var nn int - for nn < len(p) { - n := copy(w.buffer[w.buffSize:], p[nn:]) - w.buffSize += n - if w.buffSize == cap(w.buffer) { - err = w.writeChunk() - if err != nil { - break - } - } - nn += n - } - return nn, err -} - -// Size returns the number of bytes written to this FileWriter. -func (w *writer) Size() int64 { - return w.size -} - -func (w *writer) init(path string) error { - res, err := getObject(w.client, w.bucket, w.name, 0) - if err != nil { - return err - } - defer res.Body.Close() - if res.Header.Get("Content-Type") != uploadSessionContentType { - return storagedriver.PathNotFoundError{Path: path} - } - offset, err := strconv.ParseInt(res.Header.Get("X-Goog-Meta-Offset"), 10, 64) - if err != nil { - return err - } - buffer, err := ioutil.ReadAll(res.Body) - if err != nil { - return err - } - w.sessionURI = res.Header.Get("X-Goog-Meta-Session-URI") - w.buffSize = copy(w.buffer, buffer) - w.offset = offset - w.size = offset + int64(w.buffSize) - return nil -} - -type request func() error - -func retry(req request) error { - backoff := time.Second - var err error - for i := 0; i < maxTries; i++ { - err = req() - if err == nil { - return nil - } - - status, ok := err.(*googleapi.Error) - if !ok || (status.Code != 429 && status.Code < http.StatusInternalServerError) { - return err - } - - time.Sleep(backoff - time.Second + (time.Duration(rand.Int31n(1000)) * time.Millisecond)) - if i <= 4 { - backoff = backoff * 2 - } - } - return err -} - -// Stat retrieves the FileInfo for the given path, including the current -// size in bytes and the creation time. -func (d *driver) Stat(context ctx.Context, path string) (storagedriver.FileInfo, error) { - var fi storagedriver.FileInfoFields - //try to get as file - gcsContext := d.context(context) - obj, err := storageStatObject(gcsContext, d.bucket, d.pathToKey(path)) - if err == nil { - if obj.ContentType == uploadSessionContentType { - return nil, storagedriver.PathNotFoundError{Path: path} - } - fi = storagedriver.FileInfoFields{ - Path: path, - Size: obj.Size, - ModTime: obj.Updated, - IsDir: false, - } - return storagedriver.FileInfoInternal{FileInfoFields: fi}, nil - } - //try to get as folder - dirpath := d.pathToDirKey(path) - - var query *storage.Query - query = &storage.Query{} - query.Prefix = dirpath - query.MaxResults = 1 - - objects, err := storageListObjects(gcsContext, d.bucket, query) - if err != nil { - return nil, err - } - if len(objects.Results) < 1 { - return nil, storagedriver.PathNotFoundError{Path: path} - } - fi = storagedriver.FileInfoFields{ - Path: path, - IsDir: true, - } - obj = objects.Results[0] - if obj.Name == dirpath { - fi.Size = obj.Size - fi.ModTime = obj.Updated - } - return storagedriver.FileInfoInternal{FileInfoFields: fi}, nil -} - -// List returns a list of the objects that are direct descendants of the -//given path. -func (d *driver) List(context ctx.Context, path string) ([]string, error) { - var query *storage.Query - query = &storage.Query{} - query.Delimiter = "/" - query.Prefix = d.pathToDirKey(path) - list := make([]string, 0, 64) - for { - objects, err := storageListObjects(d.context(context), d.bucket, query) - if err != nil { - return nil, err - } - for _, object := range objects.Results { - // GCS does not guarantee strong consistency between - // DELETE and LIST operations. Check that the object is not deleted, - // and filter out any objects with a non-zero time-deleted - if object.Deleted.IsZero() && object.ContentType != uploadSessionContentType { - list = append(list, d.keyToPath(object.Name)) - } - } - for _, subpath := range objects.Prefixes { - subpath = d.keyToPath(subpath) - list = append(list, subpath) - } - query = objects.Next - if query == nil { - break - } - } - if path != "/" && len(list) == 0 { - // Treat empty response as missing directory, since we don't actually - // have directories in Google Cloud Storage. - return nil, storagedriver.PathNotFoundError{Path: path} - } - return list, nil -} - -// Move moves an object stored at sourcePath to destPath, removing the -// original object. -func (d *driver) Move(context ctx.Context, sourcePath string, destPath string) error { - gcsContext := d.context(context) - _, err := storageCopyObject(gcsContext, d.bucket, d.pathToKey(sourcePath), d.bucket, d.pathToKey(destPath), nil) - if err != nil { - if status, ok := err.(*googleapi.Error); ok { - if status.Code == http.StatusNotFound { - return storagedriver.PathNotFoundError{Path: sourcePath} - } - } - return err - } - err = storageDeleteObject(gcsContext, d.bucket, d.pathToKey(sourcePath)) - // if deleting the file fails, log the error, but do not fail; the file was successfully copied, - // and the original should eventually be cleaned when purging the uploads folder. - if err != nil { - logrus.Infof("error deleting file: %v due to %v", sourcePath, err) - } - return nil -} - -// listAll recursively lists all names of objects stored at "prefix" and its subpaths. -func (d *driver) listAll(context context.Context, prefix string) ([]string, error) { - list := make([]string, 0, 64) - query := &storage.Query{} - query.Prefix = prefix - query.Versions = false - for { - objects, err := storageListObjects(d.context(context), d.bucket, query) - if err != nil { - return nil, err - } - for _, obj := range objects.Results { - // GCS does not guarantee strong consistency between - // DELETE and LIST operations. Check that the object is not deleted, - // and filter out any objects with a non-zero time-deleted - if obj.Deleted.IsZero() { - list = append(list, obj.Name) - } - } - query = objects.Next - if query == nil { - break - } - } - return list, nil -} - -// Delete recursively deletes all objects stored at "path" and its subpaths. -func (d *driver) Delete(context ctx.Context, path string) error { - prefix := d.pathToDirKey(path) - gcsContext := d.context(context) - keys, err := d.listAll(gcsContext, prefix) - if err != nil { - return err - } - if len(keys) > 0 { - sort.Sort(sort.Reverse(sort.StringSlice(keys))) - for _, key := range keys { - err := storageDeleteObject(gcsContext, d.bucket, key) - // GCS only guarantees eventual consistency, so listAll might return - // paths that no longer exist. If this happens, just ignore any not - // found error - if status, ok := err.(*googleapi.Error); ok { - if status.Code == http.StatusNotFound { - err = nil - } - } - if err != nil { - return err - } - } - return nil - } - err = storageDeleteObject(gcsContext, d.bucket, d.pathToKey(path)) - if err != nil { - if status, ok := err.(*googleapi.Error); ok { - if status.Code == http.StatusNotFound { - return storagedriver.PathNotFoundError{Path: path} - } - } - } - return err -} - -func storageDeleteObject(context context.Context, bucket string, name string) error { - return retry(func() error { - return storage.DeleteObject(context, bucket, name) - }) -} - -func storageStatObject(context context.Context, bucket string, name string) (*storage.Object, error) { - var obj *storage.Object - err := retry(func() error { - var err error - obj, err = storage.StatObject(context, bucket, name) - return err - }) - return obj, err -} - -func storageListObjects(context context.Context, bucket string, q *storage.Query) (*storage.Objects, error) { - var objs *storage.Objects - err := retry(func() error { - var err error - objs, err = storage.ListObjects(context, bucket, q) - return err - }) - return objs, err -} - -func storageCopyObject(context context.Context, srcBucket, srcName string, destBucket, destName string, attrs *storage.ObjectAttrs) (*storage.Object, error) { - var obj *storage.Object - err := retry(func() error { - var err error - obj, err = storage.CopyObject(context, srcBucket, srcName, destBucket, destName, attrs) - return err - }) - return obj, err -} - -// URLFor returns a URL which may be used to retrieve the content stored at -// the given path, possibly using the given options. -// Returns ErrUnsupportedMethod if this driver has no privateKey -func (d *driver) URLFor(context ctx.Context, path string, options map[string]interface{}) (string, error) { - if d.privateKey == nil { - return "", storagedriver.ErrUnsupportedMethod{} - } - - name := d.pathToKey(path) - methodString := "GET" - method, ok := options["method"] - if ok { - methodString, ok = method.(string) - if !ok || (methodString != "GET" && methodString != "HEAD") { - return "", storagedriver.ErrUnsupportedMethod{} - } - } - - expiresTime := time.Now().Add(20 * time.Minute) - expires, ok := options["expiry"] - if ok { - et, ok := expires.(time.Time) - if ok { - expiresTime = et - } - } - - opts := &storage.SignedURLOptions{ - GoogleAccessID: d.email, - PrivateKey: d.privateKey, - Method: methodString, - Expires: expiresTime, - } - return storage.SignedURL(d.bucket, name, opts) -} - -func startSession(client *http.Client, bucket string, name string) (uri string, err error) { - u := &url.URL{ - Scheme: "https", - Host: "www.googleapis.com", - Path: fmt.Sprintf("/upload/storage/v1/b/%v/o", bucket), - RawQuery: fmt.Sprintf("uploadType=resumable&name=%v", name), - } - err = retry(func() error { - req, err := http.NewRequest("POST", u.String(), nil) - if err != nil { - return err - } - req.Header.Set("X-Upload-Content-Type", "application/octet-stream") - req.Header.Set("Content-Length", "0") - resp, err := client.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - err = googleapi.CheckMediaResponse(resp) - if err != nil { - return err - } - uri = resp.Header.Get("Location") - return nil - }) - return uri, err -} - -func putChunk(client *http.Client, sessionURI string, chunk []byte, from int64, totalSize int64) (int64, error) { - bytesPut := int64(0) - err := retry(func() error { - req, err := http.NewRequest("PUT", sessionURI, bytes.NewReader(chunk)) - if err != nil { - return err - } - length := int64(len(chunk)) - to := from + length - 1 - size := "*" - if totalSize >= 0 { - size = strconv.FormatInt(totalSize, 10) - } - req.Header.Set("Content-Type", "application/octet-stream") - if from == to+1 { - req.Header.Set("Content-Range", fmt.Sprintf("bytes */%v", size)) - } else { - req.Header.Set("Content-Range", fmt.Sprintf("bytes %v-%v/%v", from, to, size)) - } - req.Header.Set("Content-Length", strconv.FormatInt(length, 10)) - - resp, err := client.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - if totalSize < 0 && resp.StatusCode == 308 { - groups := rangeHeader.FindStringSubmatch(resp.Header.Get("Range")) - end, err := strconv.ParseInt(groups[2], 10, 64) - if err != nil { - return err - } - bytesPut = end - from + 1 - return nil - } - err = googleapi.CheckMediaResponse(resp) - if err != nil { - return err - } - bytesPut = to - from + 1 - return nil - }) - return bytesPut, err -} - -func (d *driver) context(context ctx.Context) context.Context { - return cloud.WithContext(context, dummyProjectID, d.client) -} - -func (d *driver) pathToKey(path string) string { - return strings.TrimRight(d.rootDirectory+strings.TrimLeft(path, "/"), "/") -} - -func (d *driver) pathToDirKey(path string) string { - return d.pathToKey(path) + "/" -} - -func (d *driver) keyToPath(key string) string { - return "/" + strings.Trim(strings.TrimPrefix(key, d.rootDirectory), "/") -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/gcs/gcs_test.go b/vendor/github.com/docker/distribution/registry/storage/driver/gcs/gcs_test.go deleted file mode 100644 index f2808d5fc..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/gcs/gcs_test.go +++ /dev/null @@ -1,311 +0,0 @@ -// +build include_gcs - -package gcs - -import ( - "io/ioutil" - "os" - "testing" - - "fmt" - ctx "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/testsuites" - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - "google.golang.org/api/googleapi" - "google.golang.org/cloud/storage" - "gopkg.in/check.v1" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -var gcsDriverConstructor func(rootDirectory string) (storagedriver.StorageDriver, error) -var skipGCS func() string - -func init() { - bucket := os.Getenv("REGISTRY_STORAGE_GCS_BUCKET") - credentials := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") - - // Skip GCS storage driver tests if environment variable parameters are not provided - skipGCS = func() string { - if bucket == "" || credentials == "" { - return "The following environment variables must be set to enable these tests: REGISTRY_STORAGE_GCS_BUCKET, GOOGLE_APPLICATION_CREDENTIALS" - } - return "" - } - - if skipGCS() != "" { - return - } - - root, err := ioutil.TempDir("", "driver-") - if err != nil { - panic(err) - } - defer os.Remove(root) - var ts oauth2.TokenSource - var email string - var privateKey []byte - - ts, err = google.DefaultTokenSource(ctx.Background(), storage.ScopeFullControl) - if err != nil { - // Assume that the file contents are within the environment variable since it exists - // but does not contain a valid file path - jwtConfig, err := google.JWTConfigFromJSON([]byte(credentials), storage.ScopeFullControl) - if err != nil { - panic(fmt.Sprintf("Error reading JWT config : %s", err)) - } - email = jwtConfig.Email - privateKey = []byte(jwtConfig.PrivateKey) - if len(privateKey) == 0 { - panic("Error reading JWT config : missing private_key property") - } - if email == "" { - panic("Error reading JWT config : missing client_email property") - } - ts = jwtConfig.TokenSource(ctx.Background()) - } - - gcsDriverConstructor = func(rootDirectory string) (storagedriver.StorageDriver, error) { - parameters := driverParameters{ - bucket: bucket, - rootDirectory: root, - email: email, - privateKey: privateKey, - client: oauth2.NewClient(ctx.Background(), ts), - chunkSize: defaultChunkSize, - } - - return New(parameters) - } - - testsuites.RegisterSuite(func() (storagedriver.StorageDriver, error) { - return gcsDriverConstructor(root) - }, skipGCS) -} - -// Test Committing a FileWriter without having called Write -func TestCommitEmpty(t *testing.T) { - if skipGCS() != "" { - t.Skip(skipGCS()) - } - - validRoot, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(validRoot) - - driver, err := gcsDriverConstructor(validRoot) - if err != nil { - t.Fatalf("unexpected error creating rooted driver: %v", err) - } - - filename := "/test" - ctx := ctx.Background() - - writer, err := driver.Writer(ctx, filename, false) - defer driver.Delete(ctx, filename) - if err != nil { - t.Fatalf("driver.Writer: unexpected error: %v", err) - } - err = writer.Commit() - if err != nil { - t.Fatalf("writer.Commit: unexpected error: %v", err) - } - err = writer.Close() - if err != nil { - t.Fatalf("writer.Close: unexpected error: %v", err) - } - if writer.Size() != 0 { - t.Fatalf("writer.Size: %d != 0", writer.Size()) - } - readContents, err := driver.GetContent(ctx, filename) - if err != nil { - t.Fatalf("driver.GetContent: unexpected error: %v", err) - } - if len(readContents) != 0 { - t.Fatalf("len(driver.GetContent(..)): %d != 0", len(readContents)) - } -} - -// Test Committing a FileWriter after having written exactly -// defaultChunksize bytes. -func TestCommit(t *testing.T) { - if skipGCS() != "" { - t.Skip(skipGCS()) - } - - validRoot, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(validRoot) - - driver, err := gcsDriverConstructor(validRoot) - if err != nil { - t.Fatalf("unexpected error creating rooted driver: %v", err) - } - - filename := "/test" - ctx := ctx.Background() - - contents := make([]byte, defaultChunkSize) - writer, err := driver.Writer(ctx, filename, false) - defer driver.Delete(ctx, filename) - if err != nil { - t.Fatalf("driver.Writer: unexpected error: %v", err) - } - _, err = writer.Write(contents) - if err != nil { - t.Fatalf("writer.Write: unexpected error: %v", err) - } - err = writer.Commit() - if err != nil { - t.Fatalf("writer.Commit: unexpected error: %v", err) - } - err = writer.Close() - if err != nil { - t.Fatalf("writer.Close: unexpected error: %v", err) - } - if writer.Size() != int64(len(contents)) { - t.Fatalf("writer.Size: %d != %d", writer.Size(), len(contents)) - } - readContents, err := driver.GetContent(ctx, filename) - if err != nil { - t.Fatalf("driver.GetContent: unexpected error: %v", err) - } - if len(readContents) != len(contents) { - t.Fatalf("len(driver.GetContent(..)): %d != %d", len(readContents), len(contents)) - } -} - -func TestRetry(t *testing.T) { - if skipGCS() != "" { - t.Skip(skipGCS()) - } - - assertError := func(expected string, observed error) { - observedMsg := "" - if observed != nil { - observedMsg = observed.Error() - } - if observedMsg != expected { - t.Fatalf("expected %v, observed %v\n", expected, observedMsg) - } - } - - err := retry(func() error { - return &googleapi.Error{ - Code: 503, - Message: "google api error", - } - }) - assertError("googleapi: Error 503: google api error", err) - - err = retry(func() error { - return &googleapi.Error{ - Code: 404, - Message: "google api error", - } - }) - assertError("googleapi: Error 404: google api error", err) - - err = retry(func() error { - return fmt.Errorf("error") - }) - assertError("error", err) -} - -func TestEmptyRootList(t *testing.T) { - if skipGCS() != "" { - t.Skip(skipGCS()) - } - - validRoot, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(validRoot) - - rootedDriver, err := gcsDriverConstructor(validRoot) - if err != nil { - t.Fatalf("unexpected error creating rooted driver: %v", err) - } - - emptyRootDriver, err := gcsDriverConstructor("") - if err != nil { - t.Fatalf("unexpected error creating empty root driver: %v", err) - } - - slashRootDriver, err := gcsDriverConstructor("/") - if err != nil { - t.Fatalf("unexpected error creating slash root driver: %v", err) - } - - filename := "/test" - contents := []byte("contents") - ctx := ctx.Background() - err = rootedDriver.PutContent(ctx, filename, contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - defer func() { - err := rootedDriver.Delete(ctx, filename) - if err != nil { - t.Fatalf("failed to remove %v due to %v\n", filename, err) - } - }() - keys, err := emptyRootDriver.List(ctx, "/") - for _, path := range keys { - if !storagedriver.PathRegexp.MatchString(path) { - t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) - } - } - - keys, err = slashRootDriver.List(ctx, "/") - for _, path := range keys { - if !storagedriver.PathRegexp.MatchString(path) { - t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) - } - } -} - -// TestMoveDirectory checks that moving a directory returns an error. -func TestMoveDirectory(t *testing.T) { - if skipGCS() != "" { - t.Skip(skipGCS()) - } - - validRoot, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(validRoot) - - driver, err := gcsDriverConstructor(validRoot) - if err != nil { - t.Fatalf("unexpected error creating rooted driver: %v", err) - } - - ctx := ctx.Background() - contents := []byte("contents") - // Create a regular file. - err = driver.PutContent(ctx, "/parent/dir/foo", contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - defer func() { - err := driver.Delete(ctx, "/parent") - if err != nil { - t.Fatalf("failed to remove /parent due to %v\n", err) - } - }() - - err = driver.Move(ctx, "/parent/dir", "/parent/other") - if err == nil { - t.Fatalf("Moving directory /parent/dir /parent/other should have return a non-nil error\n") - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/inmemory/driver.go b/vendor/github.com/docker/distribution/registry/storage/driver/inmemory/driver.go deleted file mode 100644 index eb2fd1cf4..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/inmemory/driver.go +++ /dev/null @@ -1,312 +0,0 @@ -package inmemory - -import ( - "fmt" - "io" - "io/ioutil" - "sync" - "time" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/base" - "github.com/docker/distribution/registry/storage/driver/factory" -) - -const driverName = "inmemory" - -func init() { - factory.Register(driverName, &inMemoryDriverFactory{}) -} - -// inMemoryDriverFacotry implements the factory.StorageDriverFactory interface. -type inMemoryDriverFactory struct{} - -func (factory *inMemoryDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - return New(), nil -} - -type driver struct { - root *dir - mutex sync.RWMutex -} - -// baseEmbed allows us to hide the Base embed. -type baseEmbed struct { - base.Base -} - -// Driver is a storagedriver.StorageDriver implementation backed by a local map. -// Intended solely for example and testing purposes. -type Driver struct { - baseEmbed // embedded, hidden base driver. -} - -var _ storagedriver.StorageDriver = &Driver{} - -// New constructs a new Driver. -func New() *Driver { - return &Driver{ - baseEmbed: baseEmbed{ - Base: base.Base{ - StorageDriver: &driver{ - root: &dir{ - common: common{ - p: "/", - mod: time.Now(), - }, - }, - }, - }, - }, - } -} - -// Implement the storagedriver.StorageDriver interface. - -func (d *driver) Name() string { - return driverName -} - -// GetContent retrieves the content stored at "path" as a []byte. -func (d *driver) GetContent(ctx context.Context, path string) ([]byte, error) { - d.mutex.RLock() - defer d.mutex.RUnlock() - - rc, err := d.Reader(ctx, path, 0) - if err != nil { - return nil, err - } - defer rc.Close() - - return ioutil.ReadAll(rc) -} - -// PutContent stores the []byte content at a location designated by "path". -func (d *driver) PutContent(ctx context.Context, p string, contents []byte) error { - d.mutex.Lock() - defer d.mutex.Unlock() - - normalized := normalize(p) - - f, err := d.root.mkfile(normalized) - if err != nil { - // TODO(stevvooe): Again, we need to clarify when this is not a - // directory in StorageDriver API. - return fmt.Errorf("not a file") - } - - f.truncate() - f.WriteAt(contents, 0) - - return nil -} - -// Reader retrieves an io.ReadCloser for the content stored at "path" with a -// given byte offset. -func (d *driver) Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) { - d.mutex.RLock() - defer d.mutex.RUnlock() - - if offset < 0 { - return nil, storagedriver.InvalidOffsetError{Path: path, Offset: offset} - } - - normalized := normalize(path) - found := d.root.find(normalized) - - if found.path() != normalized { - return nil, storagedriver.PathNotFoundError{Path: path} - } - - if found.isdir() { - return nil, fmt.Errorf("%q is a directory", path) - } - - return ioutil.NopCloser(found.(*file).sectionReader(offset)), nil -} - -// Writer returns a FileWriter which will store the content written to it -// at the location designated by "path" after the call to Commit. -func (d *driver) Writer(ctx context.Context, path string, append bool) (storagedriver.FileWriter, error) { - d.mutex.Lock() - defer d.mutex.Unlock() - - normalized := normalize(path) - - f, err := d.root.mkfile(normalized) - if err != nil { - return nil, fmt.Errorf("not a file") - } - - if !append { - f.truncate() - } - - return d.newWriter(f), nil -} - -// Stat returns info about the provided path. -func (d *driver) Stat(ctx context.Context, path string) (storagedriver.FileInfo, error) { - d.mutex.RLock() - defer d.mutex.RUnlock() - - normalized := normalize(path) - found := d.root.find(normalized) - - if found.path() != normalized { - return nil, storagedriver.PathNotFoundError{Path: path} - } - - fi := storagedriver.FileInfoFields{ - Path: path, - IsDir: found.isdir(), - ModTime: found.modtime(), - } - - if !fi.IsDir { - fi.Size = int64(len(found.(*file).data)) - } - - return storagedriver.FileInfoInternal{FileInfoFields: fi}, nil -} - -// List returns a list of the objects that are direct descendants of the given -// path. -func (d *driver) List(ctx context.Context, path string) ([]string, error) { - d.mutex.RLock() - defer d.mutex.RUnlock() - - normalized := normalize(path) - - found := d.root.find(normalized) - - if !found.isdir() { - return nil, fmt.Errorf("not a directory") // TODO(stevvooe): Need error type for this... - } - - entries, err := found.(*dir).list(normalized) - - if err != nil { - switch err { - case errNotExists: - return nil, storagedriver.PathNotFoundError{Path: path} - case errIsNotDir: - return nil, fmt.Errorf("not a directory") - default: - return nil, err - } - } - - return entries, nil -} - -// Move moves an object stored at sourcePath to destPath, removing the original -// object. -func (d *driver) Move(ctx context.Context, sourcePath string, destPath string) error { - d.mutex.Lock() - defer d.mutex.Unlock() - - normalizedSrc, normalizedDst := normalize(sourcePath), normalize(destPath) - - err := d.root.move(normalizedSrc, normalizedDst) - switch err { - case errNotExists: - return storagedriver.PathNotFoundError{Path: destPath} - default: - return err - } -} - -// Delete recursively deletes all objects stored at "path" and its subpaths. -func (d *driver) Delete(ctx context.Context, path string) error { - d.mutex.Lock() - defer d.mutex.Unlock() - - normalized := normalize(path) - - err := d.root.delete(normalized) - switch err { - case errNotExists: - return storagedriver.PathNotFoundError{Path: path} - default: - return err - } -} - -// URLFor returns a URL which may be used to retrieve the content stored at the given path. -// May return an UnsupportedMethodErr in certain StorageDriver implementations. -func (d *driver) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { - return "", storagedriver.ErrUnsupportedMethod{} -} - -type writer struct { - d *driver - f *file - closed bool - committed bool - cancelled bool -} - -func (d *driver) newWriter(f *file) storagedriver.FileWriter { - return &writer{ - d: d, - f: f, - } -} - -func (w *writer) Write(p []byte) (int, error) { - if w.closed { - return 0, fmt.Errorf("already closed") - } else if w.committed { - return 0, fmt.Errorf("already committed") - } else if w.cancelled { - return 0, fmt.Errorf("already cancelled") - } - - w.d.mutex.Lock() - defer w.d.mutex.Unlock() - - return w.f.WriteAt(p, int64(len(w.f.data))) -} - -func (w *writer) Size() int64 { - w.d.mutex.RLock() - defer w.d.mutex.RUnlock() - - return int64(len(w.f.data)) -} - -func (w *writer) Close() error { - if w.closed { - return fmt.Errorf("already closed") - } - w.closed = true - return nil -} - -func (w *writer) Cancel() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } - w.cancelled = true - - w.d.mutex.Lock() - defer w.d.mutex.Unlock() - - return w.d.root.delete(w.f.path()) -} - -func (w *writer) Commit() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } else if w.cancelled { - return fmt.Errorf("already cancelled") - } - w.committed = true - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/inmemory/driver_test.go b/vendor/github.com/docker/distribution/registry/storage/driver/inmemory/driver_test.go deleted file mode 100644 index dbc1916f9..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/inmemory/driver_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package inmemory - -import ( - "testing" - - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/testsuites" - "gopkg.in/check.v1" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -func init() { - inmemoryDriverConstructor := func() (storagedriver.StorageDriver, error) { - return New(), nil - } - testsuites.RegisterSuite(inmemoryDriverConstructor, testsuites.NeverSkip) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/inmemory/mfs.go b/vendor/github.com/docker/distribution/registry/storage/driver/inmemory/mfs.go deleted file mode 100644 index cdefacfd8..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/inmemory/mfs.go +++ /dev/null @@ -1,338 +0,0 @@ -package inmemory - -import ( - "fmt" - "io" - "path" - "sort" - "strings" - "time" -) - -var ( - errExists = fmt.Errorf("exists") - errNotExists = fmt.Errorf("notexists") - errIsNotDir = fmt.Errorf("notdir") - errIsDir = fmt.Errorf("isdir") -) - -type node interface { - name() string - path() string - isdir() bool - modtime() time.Time -} - -// dir is the central type for the memory-based storagedriver. All operations -// are dispatched from a root dir. -type dir struct { - common - - // TODO(stevvooe): Use sorted slice + search. - children map[string]node -} - -var _ node = &dir{} - -func (d *dir) isdir() bool { - return true -} - -// add places the node n into dir d. -func (d *dir) add(n node) { - if d.children == nil { - d.children = make(map[string]node) - } - - d.children[n.name()] = n - d.mod = time.Now() -} - -// find searches for the node, given path q in dir. If the node is found, it -// will be returned. If the node is not found, the closet existing parent. If -// the node is found, the returned (node).path() will match q. -func (d *dir) find(q string) node { - q = strings.Trim(q, "/") - i := strings.Index(q, "/") - - if q == "" { - return d - } - - if i == 0 { - panic("shouldn't happen, no root paths") - } - - var component string - if i < 0 { - // No more path components - component = q - } else { - component = q[:i] - } - - child, ok := d.children[component] - if !ok { - // Node was not found. Return p and the current node. - return d - } - - if child.isdir() { - // traverse down! - q = q[i+1:] - return child.(*dir).find(q) - } - - return child -} - -func (d *dir) list(p string) ([]string, error) { - n := d.find(p) - - if n.path() != p { - return nil, errNotExists - } - - if !n.isdir() { - return nil, errIsNotDir - } - - var children []string - for _, child := range n.(*dir).children { - children = append(children, child.path()) - } - - sort.Strings(children) - return children, nil -} - -// mkfile or return the existing one. returns an error if it exists and is a -// directory. Essentially, this is open or create. -func (d *dir) mkfile(p string) (*file, error) { - n := d.find(p) - if n.path() == p { - if n.isdir() { - return nil, errIsDir - } - - return n.(*file), nil - } - - dirpath, filename := path.Split(p) - // Make any non-existent directories - n, err := d.mkdirs(dirpath) - if err != nil { - return nil, err - } - - dd := n.(*dir) - n = &file{ - common: common{ - p: path.Join(dd.path(), filename), - mod: time.Now(), - }, - } - - dd.add(n) - return n.(*file), nil -} - -// mkdirs creates any missing directory entries in p and returns the result. -func (d *dir) mkdirs(p string) (*dir, error) { - p = normalize(p) - - n := d.find(p) - - if !n.isdir() { - // Found something there - return nil, errIsNotDir - } - - if n.path() == p { - return n.(*dir), nil - } - - dd := n.(*dir) - - relative := strings.Trim(strings.TrimPrefix(p, n.path()), "/") - - if relative == "" { - return dd, nil - } - - components := strings.Split(relative, "/") - for _, component := range components { - d, err := dd.mkdir(component) - - if err != nil { - // This should actually never happen, since there are no children. - return nil, err - } - dd = d - } - - return dd, nil -} - -// mkdir creates a child directory under d with the given name. -func (d *dir) mkdir(name string) (*dir, error) { - if name == "" { - return nil, fmt.Errorf("invalid dirname") - } - - _, ok := d.children[name] - if ok { - return nil, errExists - } - - child := &dir{ - common: common{ - p: path.Join(d.path(), name), - mod: time.Now(), - }, - } - d.add(child) - d.mod = time.Now() - - return child, nil -} - -func (d *dir) move(src, dst string) error { - dstDirname, _ := path.Split(dst) - - dp, err := d.mkdirs(dstDirname) - if err != nil { - return err - } - - srcDirname, srcFilename := path.Split(src) - sp := d.find(srcDirname) - - if normalize(srcDirname) != normalize(sp.path()) { - return errNotExists - } - - spd, ok := sp.(*dir) - if !ok { - return errIsNotDir // paranoid. - } - - s, ok := spd.children[srcFilename] - if !ok { - return errNotExists - } - - delete(spd.children, srcFilename) - - switch n := s.(type) { - case *dir: - n.p = dst - case *file: - n.p = dst - } - - dp.add(s) - - return nil -} - -func (d *dir) delete(p string) error { - dirname, filename := path.Split(p) - parent := d.find(dirname) - - if normalize(dirname) != normalize(parent.path()) { - return errNotExists - } - - if _, ok := parent.(*dir).children[filename]; !ok { - return errNotExists - } - - delete(parent.(*dir).children, filename) - return nil -} - -// dump outputs a primitive directory structure to stdout. -func (d *dir) dump(indent string) { - fmt.Println(indent, d.name()+"/") - - for _, child := range d.children { - if child.isdir() { - child.(*dir).dump(indent + "\t") - } else { - fmt.Println(indent, child.name()) - } - - } -} - -func (d *dir) String() string { - return fmt.Sprintf("&dir{path: %v, children: %v}", d.p, d.children) -} - -// file stores actual data in the fs tree. It acts like an open, seekable file -// where operations are conducted through ReadAt and WriteAt. Use it with -// SectionReader for the best effect. -type file struct { - common - data []byte -} - -var _ node = &file{} - -func (f *file) isdir() bool { - return false -} - -func (f *file) truncate() { - f.data = f.data[:0] -} - -func (f *file) sectionReader(offset int64) io.Reader { - return io.NewSectionReader(f, offset, int64(len(f.data))-offset) -} - -func (f *file) ReadAt(p []byte, offset int64) (n int, err error) { - return copy(p, f.data[offset:]), nil -} - -func (f *file) WriteAt(p []byte, offset int64) (n int, err error) { - off := int(offset) - if cap(f.data) < off+len(p) { - data := make([]byte, len(f.data), off+len(p)) - copy(data, f.data) - f.data = data - } - - f.mod = time.Now() - f.data = f.data[:off+len(p)] - - return copy(f.data[off:off+len(p)], p), nil -} - -func (f *file) String() string { - return fmt.Sprintf("&file{path: %q}", f.p) -} - -// common provides shared fields and methods for node implementations. -type common struct { - p string - mod time.Time -} - -func (c *common) name() string { - _, name := path.Split(c.p) - return name -} - -func (c *common) path() string { - return c.p -} - -func (c *common) modtime() time.Time { - return c.mod -} - -func normalize(p string) string { - return "/" + strings.Trim(p, "/") -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/middleware/cloudfront/middleware.go b/vendor/github.com/docker/distribution/registry/storage/driver/middleware/cloudfront/middleware.go deleted file mode 100644 index b0618d1aa..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/middleware/cloudfront/middleware.go +++ /dev/null @@ -1,136 +0,0 @@ -// Package middleware - cloudfront wrapper for storage libs -// N.B. currently only works with S3, not arbitrary sites -// -package middleware - -import ( - "crypto/x509" - "encoding/pem" - "fmt" - "io/ioutil" - "net/url" - "strings" - "time" - - "github.com/aws/aws-sdk-go/service/cloudfront/sign" - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - storagemiddleware "github.com/docker/distribution/registry/storage/driver/middleware" -) - -// cloudFrontStorageMiddleware provides a simple implementation of layerHandler that -// constructs temporary signed CloudFront URLs from the storagedriver layer URL, -// then issues HTTP Temporary Redirects to this CloudFront content URL. -type cloudFrontStorageMiddleware struct { - storagedriver.StorageDriver - urlSigner *sign.URLSigner - baseURL string - duration time.Duration -} - -var _ storagedriver.StorageDriver = &cloudFrontStorageMiddleware{} - -// newCloudFrontLayerHandler constructs and returns a new CloudFront -// LayerHandler implementation. -// Required options: baseurl, privatekey, keypairid -func newCloudFrontStorageMiddleware(storageDriver storagedriver.StorageDriver, options map[string]interface{}) (storagedriver.StorageDriver, error) { - base, ok := options["baseurl"] - if !ok { - return nil, fmt.Errorf("no baseurl provided") - } - baseURL, ok := base.(string) - if !ok { - return nil, fmt.Errorf("baseurl must be a string") - } - if !strings.Contains(baseURL, "://") { - baseURL = "https://" + baseURL - } - if !strings.HasSuffix(baseURL, "/") { - baseURL += "/" - } - if _, err := url.Parse(baseURL); err != nil { - return nil, fmt.Errorf("invalid baseurl: %v", err) - } - pk, ok := options["privatekey"] - if !ok { - return nil, fmt.Errorf("no privatekey provided") - } - pkPath, ok := pk.(string) - if !ok { - return nil, fmt.Errorf("privatekey must be a string") - } - kpid, ok := options["keypairid"] - if !ok { - return nil, fmt.Errorf("no keypairid provided") - } - keypairID, ok := kpid.(string) - if !ok { - return nil, fmt.Errorf("keypairid must be a string") - } - - pkBytes, err := ioutil.ReadFile(pkPath) - if err != nil { - return nil, fmt.Errorf("failed to read privatekey file: %s", err) - } - - block, _ := pem.Decode([]byte(pkBytes)) - if block == nil { - return nil, fmt.Errorf("failed to decode private key as an rsa private key") - } - privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) - if err != nil { - return nil, err - } - - urlSigner := sign.NewURLSigner(keypairID, privateKey) - - duration := 20 * time.Minute - d, ok := options["duration"] - if ok { - switch d := d.(type) { - case time.Duration: - duration = d - case string: - dur, err := time.ParseDuration(d) - if err != nil { - return nil, fmt.Errorf("invalid duration: %s", err) - } - duration = dur - } - } - - return &cloudFrontStorageMiddleware{ - StorageDriver: storageDriver, - urlSigner: urlSigner, - baseURL: baseURL, - duration: duration, - }, nil -} - -// S3BucketKeyer is any type that is capable of returning the S3 bucket key -// which should be cached by AWS CloudFront. -type S3BucketKeyer interface { - S3BucketKey(path string) string -} - -// Resolve returns an http.Handler which can serve the contents of the given -// Layer, or an error if not supported by the storagedriver. -func (lh *cloudFrontStorageMiddleware) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { - // TODO(endophage): currently only supports S3 - keyer, ok := lh.StorageDriver.(S3BucketKeyer) - if !ok { - context.GetLogger(ctx).Warn("the CloudFront middleware does not support this backend storage driver") - return lh.StorageDriver.URLFor(ctx, path, options) - } - - cfURL, err := lh.urlSigner.Sign(lh.baseURL+keyer.S3BucketKey(path), time.Now().Add(lh.duration)) - if err != nil { - return "", err - } - return cfURL, nil -} - -// init registers the cloudfront layerHandler backend. -func init() { - storagemiddleware.Register("cloudfront", storagemiddleware.InitFunc(newCloudFrontStorageMiddleware)) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/middleware/redirect/middleware.go b/vendor/github.com/docker/distribution/registry/storage/driver/middleware/redirect/middleware.go deleted file mode 100644 index 20cd7daa7..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/middleware/redirect/middleware.go +++ /dev/null @@ -1,50 +0,0 @@ -package middleware - -import ( - "fmt" - "net/url" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - storagemiddleware "github.com/docker/distribution/registry/storage/driver/middleware" -) - -type redirectStorageMiddleware struct { - storagedriver.StorageDriver - scheme string - host string -} - -var _ storagedriver.StorageDriver = &redirectStorageMiddleware{} - -func newRedirectStorageMiddleware(sd storagedriver.StorageDriver, options map[string]interface{}) (storagedriver.StorageDriver, error) { - o, ok := options["baseurl"] - if !ok { - return nil, fmt.Errorf("no baseurl provided") - } - b, ok := o.(string) - if !ok { - return nil, fmt.Errorf("baseurl must be a string") - } - u, err := url.Parse(b) - if err != nil { - return nil, fmt.Errorf("unable to parse redirect baseurl: %s", b) - } - if u.Scheme == "" { - return nil, fmt.Errorf("no scheme specified for redirect baseurl") - } - if u.Host == "" { - return nil, fmt.Errorf("no host specified for redirect baseurl") - } - - return &redirectStorageMiddleware{StorageDriver: sd, scheme: u.Scheme, host: u.Host}, nil -} - -func (r *redirectStorageMiddleware) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { - u := &url.URL{Scheme: r.scheme, Host: r.host, Path: path} - return u.String(), nil -} - -func init() { - storagemiddleware.Register("redirect", storagemiddleware.InitFunc(newRedirectStorageMiddleware)) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/middleware/redirect/middleware_test.go b/vendor/github.com/docker/distribution/registry/storage/driver/middleware/redirect/middleware_test.go deleted file mode 100644 index 1eb6309f8..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/middleware/redirect/middleware_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package middleware - -import ( - "testing" - - check "gopkg.in/check.v1" -) - -func Test(t *testing.T) { check.TestingT(t) } - -type MiddlewareSuite struct{} - -var _ = check.Suite(&MiddlewareSuite{}) - -func (s *MiddlewareSuite) TestNoConfig(c *check.C) { - options := make(map[string]interface{}) - _, err := newRedirectStorageMiddleware(nil, options) - c.Assert(err, check.ErrorMatches, "no baseurl provided") -} - -func (s *MiddlewareSuite) TestMissingScheme(c *check.C) { - options := make(map[string]interface{}) - options["baseurl"] = "example.com" - _, err := newRedirectStorageMiddleware(nil, options) - c.Assert(err, check.ErrorMatches, "no scheme specified for redirect baseurl") -} - -func (s *MiddlewareSuite) TestHttpsPort(c *check.C) { - options := make(map[string]interface{}) - options["baseurl"] = "https://example.com:5443" - middleware, err := newRedirectStorageMiddleware(nil, options) - c.Assert(err, check.Equals, nil) - - m, ok := middleware.(*redirectStorageMiddleware) - c.Assert(ok, check.Equals, true) - c.Assert(m.scheme, check.Equals, "https") - c.Assert(m.host, check.Equals, "example.com:5443") - - url, err := middleware.URLFor(nil, "/rick/data", nil) - c.Assert(err, check.Equals, nil) - c.Assert(url, check.Equals, "https://example.com:5443/rick/data") -} - -func (s *MiddlewareSuite) TestHTTP(c *check.C) { - options := make(map[string]interface{}) - options["baseurl"] = "http://example.com" - middleware, err := newRedirectStorageMiddleware(nil, options) - c.Assert(err, check.Equals, nil) - - m, ok := middleware.(*redirectStorageMiddleware) - c.Assert(ok, check.Equals, true) - c.Assert(m.scheme, check.Equals, "http") - c.Assert(m.host, check.Equals, "example.com") - - url, err := middleware.URLFor(nil, "morty/data", nil) - c.Assert(err, check.Equals, nil) - c.Assert(url, check.Equals, "http://example.com/morty/data") -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/middleware/storagemiddleware.go b/vendor/github.com/docker/distribution/registry/storage/driver/middleware/storagemiddleware.go deleted file mode 100644 index 7e40a8dd9..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/middleware/storagemiddleware.go +++ /dev/null @@ -1,39 +0,0 @@ -package storagemiddleware - -import ( - "fmt" - - storagedriver "github.com/docker/distribution/registry/storage/driver" -) - -// InitFunc is the type of a StorageMiddleware factory function and is -// used to register the constructor for different StorageMiddleware backends. -type InitFunc func(storageDriver storagedriver.StorageDriver, options map[string]interface{}) (storagedriver.StorageDriver, error) - -var storageMiddlewares map[string]InitFunc - -// Register is used to register an InitFunc for -// a StorageMiddleware backend with the given name. -func Register(name string, initFunc InitFunc) error { - if storageMiddlewares == nil { - storageMiddlewares = make(map[string]InitFunc) - } - if _, exists := storageMiddlewares[name]; exists { - return fmt.Errorf("name already registered: %s", name) - } - - storageMiddlewares[name] = initFunc - - return nil -} - -// Get constructs a StorageMiddleware with the given options using the named backend. -func Get(name string, options map[string]interface{}, storageDriver storagedriver.StorageDriver) (storagedriver.StorageDriver, error) { - if storageMiddlewares != nil { - if initFunc, exists := storageMiddlewares[name]; exists { - return initFunc(storageDriver, options) - } - } - - return nil, fmt.Errorf("no storage middleware registered with name: %s", name) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/oss/doc.go b/vendor/github.com/docker/distribution/registry/storage/driver/oss/doc.go deleted file mode 100644 index d1bc932f8..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/oss/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package oss implements the Aliyun OSS Storage driver backend. Support can be -// enabled by including the "include_oss" build tag. -package oss diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/oss/oss.go b/vendor/github.com/docker/distribution/registry/storage/driver/oss/oss.go deleted file mode 100644 index 4d215928b..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/oss/oss.go +++ /dev/null @@ -1,683 +0,0 @@ -// Package oss provides a storagedriver.StorageDriver implementation to -// store blobs in Aliyun OSS cloud storage. -// -// This package leverages the denverdino/aliyungo client library for interfacing with -// oss. -// -// Because OSS is a key, value store the Stat call does not support last modification -// time for directories (directories are an abstraction for key, value stores) -// -// +build include_oss - -package oss - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/http" - "reflect" - "strconv" - "strings" - "time" - - "github.com/docker/distribution/context" - - "github.com/Sirupsen/logrus" - "github.com/denverdino/aliyungo/oss" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/base" - "github.com/docker/distribution/registry/storage/driver/factory" -) - -const driverName = "oss" - -// minChunkSize defines the minimum multipart upload chunk size -// OSS API requires multipart upload chunks to be at least 5MB -const minChunkSize = 5 << 20 - -const defaultChunkSize = 2 * minChunkSize -const defaultTimeout = 2 * time.Minute // 2 minute timeout per chunk - -// listMax is the largest amount of objects you can request from OSS in a list call -const listMax = 1000 - -//DriverParameters A struct that encapsulates all of the driver parameters after all values have been set -type DriverParameters struct { - AccessKeyID string - AccessKeySecret string - Bucket string - Region oss.Region - Internal bool - Encrypt bool - Secure bool - ChunkSize int64 - RootDirectory string - Endpoint string -} - -func init() { - factory.Register(driverName, &ossDriverFactory{}) -} - -// ossDriverFactory implements the factory.StorageDriverFactory interface -type ossDriverFactory struct{} - -func (factory *ossDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - return FromParameters(parameters) -} - -type driver struct { - Client *oss.Client - Bucket *oss.Bucket - ChunkSize int64 - Encrypt bool - RootDirectory string -} - -type baseEmbed struct { - base.Base -} - -// Driver is a storagedriver.StorageDriver implementation backed by Aliyun OSS -// Objects are stored at absolute keys in the provided bucket. -type Driver struct { - baseEmbed -} - -// FromParameters constructs a new Driver with a given parameters map -// Required parameters: -// - accesskey -// - secretkey -// - region -// - bucket -// - encrypt -func FromParameters(parameters map[string]interface{}) (*Driver, error) { - // Providing no values for these is valid in case the user is authenticating - - accessKey, ok := parameters["accesskeyid"] - if !ok { - return nil, fmt.Errorf("No accesskeyid parameter provided") - } - secretKey, ok := parameters["accesskeysecret"] - if !ok { - return nil, fmt.Errorf("No accesskeysecret parameter provided") - } - - regionName, ok := parameters["region"] - if !ok || fmt.Sprint(regionName) == "" { - return nil, fmt.Errorf("No region parameter provided") - } - - bucket, ok := parameters["bucket"] - if !ok || fmt.Sprint(bucket) == "" { - return nil, fmt.Errorf("No bucket parameter provided") - } - - internalBool := false - internal, ok := parameters["internal"] - if ok { - internalBool, ok = internal.(bool) - if !ok { - return nil, fmt.Errorf("The internal parameter should be a boolean") - } - } - - encryptBool := false - encrypt, ok := parameters["encrypt"] - if ok { - encryptBool, ok = encrypt.(bool) - if !ok { - return nil, fmt.Errorf("The encrypt parameter should be a boolean") - } - } - - secureBool := true - secure, ok := parameters["secure"] - if ok { - secureBool, ok = secure.(bool) - if !ok { - return nil, fmt.Errorf("The secure parameter should be a boolean") - } - } - - chunkSize := int64(defaultChunkSize) - chunkSizeParam, ok := parameters["chunksize"] - if ok { - switch v := chunkSizeParam.(type) { - case string: - vv, err := strconv.ParseInt(v, 0, 64) - if err != nil { - return nil, fmt.Errorf("chunksize parameter must be an integer, %v invalid", chunkSizeParam) - } - chunkSize = vv - case int64: - chunkSize = v - case int, uint, int32, uint32, uint64: - chunkSize = reflect.ValueOf(v).Convert(reflect.TypeOf(chunkSize)).Int() - default: - return nil, fmt.Errorf("invalid valud for chunksize: %#v", chunkSizeParam) - } - - if chunkSize < minChunkSize { - return nil, fmt.Errorf("The chunksize %#v parameter should be a number that is larger than or equal to %d", chunkSize, minChunkSize) - } - } - - rootDirectory, ok := parameters["rootdirectory"] - if !ok { - rootDirectory = "" - } - - endpoint, ok := parameters["endpoint"] - if !ok { - endpoint = "" - } - - params := DriverParameters{ - AccessKeyID: fmt.Sprint(accessKey), - AccessKeySecret: fmt.Sprint(secretKey), - Bucket: fmt.Sprint(bucket), - Region: oss.Region(fmt.Sprint(regionName)), - ChunkSize: chunkSize, - RootDirectory: fmt.Sprint(rootDirectory), - Encrypt: encryptBool, - Secure: secureBool, - Internal: internalBool, - Endpoint: fmt.Sprint(endpoint), - } - - return New(params) -} - -// New constructs a new Driver with the given Aliyun credentials, region, encryption flag, and -// bucketName -func New(params DriverParameters) (*Driver, error) { - - client := oss.NewOSSClient(params.Region, params.Internal, params.AccessKeyID, params.AccessKeySecret, params.Secure) - client.SetEndpoint(params.Endpoint) - bucket := client.Bucket(params.Bucket) - client.SetDebug(false) - - // Validate that the given credentials have at least read permissions in the - // given bucket scope. - if _, err := bucket.List(strings.TrimRight(params.RootDirectory, "/"), "", "", 1); err != nil { - return nil, err - } - - // TODO(tg123): Currently multipart uploads have no timestamps, so this would be unwise - // if you initiated a new OSS client while another one is running on the same bucket. - - d := &driver{ - Client: client, - Bucket: bucket, - ChunkSize: params.ChunkSize, - Encrypt: params.Encrypt, - RootDirectory: params.RootDirectory, - } - - return &Driver{ - baseEmbed: baseEmbed{ - Base: base.Base{ - StorageDriver: d, - }, - }, - }, nil -} - -// Implement the storagedriver.StorageDriver interface - -func (d *driver) Name() string { - return driverName -} - -// GetContent retrieves the content stored at "path" as a []byte. -func (d *driver) GetContent(ctx context.Context, path string) ([]byte, error) { - content, err := d.Bucket.Get(d.ossPath(path)) - if err != nil { - return nil, parseError(path, err) - } - return content, nil -} - -// PutContent stores the []byte content at a location designated by "path". -func (d *driver) PutContent(ctx context.Context, path string, contents []byte) error { - return parseError(path, d.Bucket.Put(d.ossPath(path), contents, d.getContentType(), getPermissions(), d.getOptions())) -} - -// Reader retrieves an io.ReadCloser for the content stored at "path" with a -// given byte offset. -func (d *driver) Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) { - headers := make(http.Header) - headers.Add("Range", "bytes="+strconv.FormatInt(offset, 10)+"-") - - resp, err := d.Bucket.GetResponseWithHeaders(d.ossPath(path), headers) - if err != nil { - return nil, parseError(path, err) - } - - // Due to Aliyun OSS API, status 200 and whole object will be return instead of an - // InvalidRange error when range is invalid. - // - // OSS sever will always return http.StatusPartialContent if range is acceptable. - if resp.StatusCode != http.StatusPartialContent { - resp.Body.Close() - return ioutil.NopCloser(bytes.NewReader(nil)), nil - } - - return resp.Body, nil -} - -// Writer returns a FileWriter which will store the content written to it -// at the location designated by "path" after the call to Commit. -func (d *driver) Writer(ctx context.Context, path string, append bool) (storagedriver.FileWriter, error) { - key := d.ossPath(path) - if !append { - // TODO (brianbland): cancel other uploads at this path - multi, err := d.Bucket.InitMulti(key, d.getContentType(), getPermissions(), d.getOptions()) - if err != nil { - return nil, err - } - return d.newWriter(key, multi, nil), nil - } - multis, _, err := d.Bucket.ListMulti(key, "") - if err != nil { - return nil, parseError(path, err) - } - for _, multi := range multis { - if key != multi.Key { - continue - } - parts, err := multi.ListParts() - if err != nil { - return nil, parseError(path, err) - } - var multiSize int64 - for _, part := range parts { - multiSize += part.Size - } - return d.newWriter(key, multi, parts), nil - } - return nil, storagedriver.PathNotFoundError{Path: path} -} - -// Stat retrieves the FileInfo for the given path, including the current size -// in bytes and the creation time. -func (d *driver) Stat(ctx context.Context, path string) (storagedriver.FileInfo, error) { - listResponse, err := d.Bucket.List(d.ossPath(path), "", "", 1) - if err != nil { - return nil, err - } - - fi := storagedriver.FileInfoFields{ - Path: path, - } - - if len(listResponse.Contents) == 1 { - if listResponse.Contents[0].Key != d.ossPath(path) { - fi.IsDir = true - } else { - fi.IsDir = false - fi.Size = listResponse.Contents[0].Size - - timestamp, err := time.Parse(time.RFC3339Nano, listResponse.Contents[0].LastModified) - if err != nil { - return nil, err - } - fi.ModTime = timestamp - } - } else if len(listResponse.CommonPrefixes) == 1 { - fi.IsDir = true - } else { - return nil, storagedriver.PathNotFoundError{Path: path} - } - - return storagedriver.FileInfoInternal{FileInfoFields: fi}, nil -} - -// List returns a list of the objects that are direct descendants of the given path. -func (d *driver) List(ctx context.Context, opath string) ([]string, error) { - path := opath - if path != "/" && opath[len(path)-1] != '/' { - path = path + "/" - } - - // This is to cover for the cases when the rootDirectory of the driver is either "" or "/". - // In those cases, there is no root prefix to replace and we must actually add a "/" to all - // results in order to keep them as valid paths as recognized by storagedriver.PathRegexp - prefix := "" - if d.ossPath("") == "" { - prefix = "/" - } - - listResponse, err := d.Bucket.List(d.ossPath(path), "/", "", listMax) - if err != nil { - return nil, parseError(opath, err) - } - - files := []string{} - directories := []string{} - - for { - for _, key := range listResponse.Contents { - files = append(files, strings.Replace(key.Key, d.ossPath(""), prefix, 1)) - } - - for _, commonPrefix := range listResponse.CommonPrefixes { - directories = append(directories, strings.Replace(commonPrefix[0:len(commonPrefix)-1], d.ossPath(""), prefix, 1)) - } - - if listResponse.IsTruncated { - listResponse, err = d.Bucket.List(d.ossPath(path), "/", listResponse.NextMarker, listMax) - if err != nil { - return nil, err - } - } else { - break - } - } - - if opath != "/" { - if len(files) == 0 && len(directories) == 0 { - // Treat empty response as missing directory, since we don't actually - // have directories in s3. - return nil, storagedriver.PathNotFoundError{Path: opath} - } - } - - return append(files, directories...), nil -} - -const maxConcurrency = 10 - -// Move moves an object stored at sourcePath to destPath, removing the original -// object. -func (d *driver) Move(ctx context.Context, sourcePath string, destPath string) error { - logrus.Infof("Move from %s to %s", d.ossPath(sourcePath), d.ossPath(destPath)) - err := d.Bucket.CopyLargeFileInParallel(d.ossPath(sourcePath), d.ossPath(destPath), - d.getContentType(), - getPermissions(), - oss.Options{}, - maxConcurrency) - if err != nil { - logrus.Errorf("Failed for move from %s to %s: %v", d.ossPath(sourcePath), d.ossPath(destPath), err) - return parseError(sourcePath, err) - } - - return d.Delete(ctx, sourcePath) -} - -// Delete recursively deletes all objects stored at "path" and its subpaths. -func (d *driver) Delete(ctx context.Context, path string) error { - ossPath := d.ossPath(path) - listResponse, err := d.Bucket.List(ossPath, "", "", listMax) - if err != nil || len(listResponse.Contents) == 0 { - return storagedriver.PathNotFoundError{Path: path} - } - - ossObjects := make([]oss.Object, listMax) - - for len(listResponse.Contents) > 0 { - numOssObjects := len(listResponse.Contents) - for index, key := range listResponse.Contents { - // Stop if we encounter a key that is not a subpath (so that deleting "/a" does not delete "/ab"). - if len(key.Key) > len(ossPath) && (key.Key)[len(ossPath)] != '/' { - numOssObjects = index - break - } - ossObjects[index].Key = key.Key - } - - err := d.Bucket.DelMulti(oss.Delete{Quiet: false, Objects: ossObjects[0:numOssObjects]}) - if err != nil { - return nil - } - - if numOssObjects < len(listResponse.Contents) { - return nil - } - - listResponse, err = d.Bucket.List(d.ossPath(path), "", "", listMax) - if err != nil { - return err - } - } - - return nil -} - -// URLFor returns a URL which may be used to retrieve the content stored at the given path. -// May return an UnsupportedMethodErr in certain StorageDriver implementations. -func (d *driver) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { - methodString := "GET" - method, ok := options["method"] - if ok { - methodString, ok = method.(string) - if !ok || (methodString != "GET") { - return "", storagedriver.ErrUnsupportedMethod{} - } - } - - expiresTime := time.Now().Add(20 * time.Minute) - - expires, ok := options["expiry"] - if ok { - et, ok := expires.(time.Time) - if ok { - expiresTime = et - } - } - logrus.Infof("methodString: %s, expiresTime: %v", methodString, expiresTime) - signedURL := d.Bucket.SignedURLWithMethod(methodString, d.ossPath(path), expiresTime, nil, nil) - logrus.Infof("signed URL: %s", signedURL) - return signedURL, nil -} - -func (d *driver) ossPath(path string) string { - return strings.TrimLeft(strings.TrimRight(d.RootDirectory, "/")+path, "/") -} - -func parseError(path string, err error) error { - if ossErr, ok := err.(*oss.Error); ok && ossErr.StatusCode == http.StatusNotFound && (ossErr.Code == "NoSuchKey" || ossErr.Code == "") { - return storagedriver.PathNotFoundError{Path: path} - } - - return err -} - -func hasCode(err error, code string) bool { - ossErr, ok := err.(*oss.Error) - return ok && ossErr.Code == code -} - -func (d *driver) getOptions() oss.Options { - return oss.Options{ServerSideEncryption: d.Encrypt} -} - -func getPermissions() oss.ACL { - return oss.Private -} - -func (d *driver) getContentType() string { - return "application/octet-stream" -} - -// writer attempts to upload parts to S3 in a buffered fashion where the last -// part is at least as large as the chunksize, so the multipart upload could be -// cleanly resumed in the future. This is violated if Close is called after less -// than a full chunk is written. -type writer struct { - driver *driver - key string - multi *oss.Multi - parts []oss.Part - size int64 - readyPart []byte - pendingPart []byte - closed bool - committed bool - cancelled bool -} - -func (d *driver) newWriter(key string, multi *oss.Multi, parts []oss.Part) storagedriver.FileWriter { - var size int64 - for _, part := range parts { - size += part.Size - } - return &writer{ - driver: d, - key: key, - multi: multi, - parts: parts, - size: size, - } -} - -func (w *writer) Write(p []byte) (int, error) { - if w.closed { - return 0, fmt.Errorf("already closed") - } else if w.committed { - return 0, fmt.Errorf("already committed") - } else if w.cancelled { - return 0, fmt.Errorf("already cancelled") - } - - // If the last written part is smaller than minChunkSize, we need to make a - // new multipart upload :sadface: - if len(w.parts) > 0 && int(w.parts[len(w.parts)-1].Size) < minChunkSize { - err := w.multi.Complete(w.parts) - if err != nil { - w.multi.Abort() - return 0, err - } - - multi, err := w.driver.Bucket.InitMulti(w.key, w.driver.getContentType(), getPermissions(), w.driver.getOptions()) - if err != nil { - return 0, err - } - w.multi = multi - - // If the entire written file is smaller than minChunkSize, we need to make - // a new part from scratch :double sad face: - if w.size < minChunkSize { - contents, err := w.driver.Bucket.Get(w.key) - if err != nil { - return 0, err - } - w.parts = nil - w.readyPart = contents - } else { - // Otherwise we can use the old file as the new first part - _, part, err := multi.PutPartCopy(1, oss.CopyOptions{}, w.driver.Bucket.Name+"/"+w.key) - if err != nil { - return 0, err - } - w.parts = []oss.Part{part} - } - } - - var n int - - for len(p) > 0 { - // If no parts are ready to write, fill up the first part - if neededBytes := int(w.driver.ChunkSize) - len(w.readyPart); neededBytes > 0 { - if len(p) >= neededBytes { - w.readyPart = append(w.readyPart, p[:neededBytes]...) - n += neededBytes - p = p[neededBytes:] - } else { - w.readyPart = append(w.readyPart, p...) - n += len(p) - p = nil - } - } - - if neededBytes := int(w.driver.ChunkSize) - len(w.pendingPart); neededBytes > 0 { - if len(p) >= neededBytes { - w.pendingPart = append(w.pendingPart, p[:neededBytes]...) - n += neededBytes - p = p[neededBytes:] - err := w.flushPart() - if err != nil { - w.size += int64(n) - return n, err - } - } else { - w.pendingPart = append(w.pendingPart, p...) - n += len(p) - p = nil - } - } - } - w.size += int64(n) - return n, nil -} - -func (w *writer) Size() int64 { - return w.size -} - -func (w *writer) Close() error { - if w.closed { - return fmt.Errorf("already closed") - } - w.closed = true - return w.flushPart() -} - -func (w *writer) Cancel() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } - w.cancelled = true - err := w.multi.Abort() - return err -} - -func (w *writer) Commit() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } else if w.cancelled { - return fmt.Errorf("already cancelled") - } - err := w.flushPart() - if err != nil { - return err - } - w.committed = true - err = w.multi.Complete(w.parts) - if err != nil { - w.multi.Abort() - return err - } - return nil -} - -// flushPart flushes buffers to write a part to S3. -// Only called by Write (with both buffers full) and Close/Commit (always) -func (w *writer) flushPart() error { - if len(w.readyPart) == 0 && len(w.pendingPart) == 0 { - // nothing to write - return nil - } - if len(w.pendingPart) < int(w.driver.ChunkSize) { - // closing with a small pending part - // combine ready and pending to avoid writing a small part - w.readyPart = append(w.readyPart, w.pendingPart...) - w.pendingPart = nil - } - - part, err := w.multi.PutPart(len(w.parts)+1, bytes.NewReader(w.readyPart)) - if err != nil { - return err - } - w.parts = append(w.parts, part) - w.readyPart = w.pendingPart - w.pendingPart = nil - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/oss/oss_test.go b/vendor/github.com/docker/distribution/registry/storage/driver/oss/oss_test.go deleted file mode 100644 index fbae5d9ca..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/oss/oss_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// +build include_oss - -package oss - -import ( - "io/ioutil" - - alioss "github.com/denverdino/aliyungo/oss" - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/testsuites" - //"log" - "os" - "strconv" - "testing" - - "gopkg.in/check.v1" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -var ossDriverConstructor func(rootDirectory string) (*Driver, error) - -var skipCheck func() string - -func init() { - accessKey := os.Getenv("ALIYUN_ACCESS_KEY_ID") - secretKey := os.Getenv("ALIYUN_ACCESS_KEY_SECRET") - bucket := os.Getenv("OSS_BUCKET") - region := os.Getenv("OSS_REGION") - internal := os.Getenv("OSS_INTERNAL") - encrypt := os.Getenv("OSS_ENCRYPT") - secure := os.Getenv("OSS_SECURE") - endpoint := os.Getenv("OSS_ENDPOINT") - root, err := ioutil.TempDir("", "driver-") - if err != nil { - panic(err) - } - defer os.Remove(root) - - ossDriverConstructor = func(rootDirectory string) (*Driver, error) { - encryptBool := false - if encrypt != "" { - encryptBool, err = strconv.ParseBool(encrypt) - if err != nil { - return nil, err - } - } - - secureBool := false - if secure != "" { - secureBool, err = strconv.ParseBool(secure) - if err != nil { - return nil, err - } - } - - internalBool := false - if internal != "" { - internalBool, err = strconv.ParseBool(internal) - if err != nil { - return nil, err - } - } - - parameters := DriverParameters{ - AccessKeyID: accessKey, - AccessKeySecret: secretKey, - Bucket: bucket, - Region: alioss.Region(region), - Internal: internalBool, - ChunkSize: minChunkSize, - RootDirectory: rootDirectory, - Encrypt: encryptBool, - Secure: secureBool, - Endpoint: endpoint, - } - - return New(parameters) - } - - // Skip OSS storage driver tests if environment variable parameters are not provided - skipCheck = func() string { - if accessKey == "" || secretKey == "" || region == "" || bucket == "" || encrypt == "" { - return "Must set ALIYUN_ACCESS_KEY_ID, ALIYUN_ACCESS_KEY_SECRET, OSS_REGION, OSS_BUCKET, and OSS_ENCRYPT to run OSS tests" - } - return "" - } - - testsuites.RegisterSuite(func() (storagedriver.StorageDriver, error) { - return ossDriverConstructor(root) - }, skipCheck) -} - -func TestEmptyRootList(t *testing.T) { - if skipCheck() != "" { - t.Skip(skipCheck()) - } - - validRoot, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(validRoot) - - rootedDriver, err := ossDriverConstructor(validRoot) - if err != nil { - t.Fatalf("unexpected error creating rooted driver: %v", err) - } - - emptyRootDriver, err := ossDriverConstructor("") - if err != nil { - t.Fatalf("unexpected error creating empty root driver: %v", err) - } - - slashRootDriver, err := ossDriverConstructor("/") - if err != nil { - t.Fatalf("unexpected error creating slash root driver: %v", err) - } - - filename := "/test" - contents := []byte("contents") - ctx := context.Background() - err = rootedDriver.PutContent(ctx, filename, contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - defer rootedDriver.Delete(ctx, filename) - - keys, err := emptyRootDriver.List(ctx, "/") - for _, path := range keys { - if !storagedriver.PathRegexp.MatchString(path) { - t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) - } - } - - keys, err = slashRootDriver.List(ctx, "/") - for _, path := range keys { - if !storagedriver.PathRegexp.MatchString(path) { - t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) - } - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3.go b/vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3.go deleted file mode 100644 index c9d19c46c..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3.go +++ /dev/null @@ -1,1189 +0,0 @@ -// Package s3 provides a storagedriver.StorageDriver implementation to -// store blobs in Amazon S3 cloud storage. -// -// This package leverages the official aws client library for interfacing with -// S3. -// -// Because S3 is a key, value store the Stat call does not support last modification -// time for directories (directories are an abstraction for key, value stores) -// -// Keep in mind that S3 guarantees only read-after-write consistency for new -// objects, but no read-after-update or list-after-write consistency. -package s3 - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "math" - "net/http" - "reflect" - "sort" - "strconv" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds" - "github.com/aws/aws-sdk-go/aws/ec2metadata" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/client/transport" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/base" - "github.com/docker/distribution/registry/storage/driver/factory" -) - -const driverName = "s3aws" - -// minChunkSize defines the minimum multipart upload chunk size -// S3 API requires multipart upload chunks to be at least 5MB -const minChunkSize = 5 << 20 - -// maxChunkSize defines the maximum multipart upload chunk size allowed by S3. -const maxChunkSize = 5 << 30 - -const defaultChunkSize = 2 * minChunkSize - -const ( - // defaultMultipartCopyChunkSize defines the default chunk size for all - // but the last Upload Part - Copy operation of a multipart copy. - // Empirically, 32 MB is optimal. - defaultMultipartCopyChunkSize = 32 << 20 - - // defaultMultipartCopyMaxConcurrency defines the default maximum number - // of concurrent Upload Part - Copy operations for a multipart copy. - defaultMultipartCopyMaxConcurrency = 100 - - // defaultMultipartCopyThresholdSize defines the default object size - // above which multipart copy will be used. (PUT Object - Copy is used - // for objects at or below this size.) Empirically, 32 MB is optimal. - defaultMultipartCopyThresholdSize = 32 << 20 -) - -// listMax is the largest amount of objects you can request from S3 in a list call -const listMax = 1000 - -// noStorageClass defines the value to be used if storage class is not supported by the S3 endpoint -const noStorageClass = "NONE" - -// validRegions maps known s3 region identifiers to region descriptors -var validRegions = map[string]struct{}{} - -// validObjectACLs contains known s3 object Acls -var validObjectACLs = map[string]struct{}{} - -//DriverParameters A struct that encapsulates all of the driver parameters after all values have been set -type DriverParameters struct { - AccessKey string - SecretKey string - Bucket string - Region string - RegionEndpoint string - Encrypt bool - KeyID string - Secure bool - V4Auth bool - ChunkSize int64 - MultipartCopyChunkSize int64 - MultipartCopyMaxConcurrency int64 - MultipartCopyThresholdSize int64 - RootDirectory string - StorageClass string - UserAgent string - ObjectACL string -} - -func init() { - for _, region := range []string{ - "us-east-1", - "us-east-2", - "us-west-1", - "us-west-2", - "eu-west-1", - "eu-central-1", - "ap-southeast-1", - "ap-southeast-2", - "ap-northeast-1", - "ap-northeast-2", - "sa-east-1", - "cn-north-1", - "us-gov-west-1", - } { - validRegions[region] = struct{}{} - } - - for _, objectACL := range []string{ - s3.ObjectCannedACLPrivate, - s3.ObjectCannedACLPublicRead, - s3.ObjectCannedACLPublicReadWrite, - s3.ObjectCannedACLAuthenticatedRead, - s3.ObjectCannedACLAwsExecRead, - s3.ObjectCannedACLBucketOwnerRead, - s3.ObjectCannedACLBucketOwnerFullControl, - } { - validObjectACLs[objectACL] = struct{}{} - } - - // Register this as the default s3 driver in addition to s3aws - factory.Register("s3", &s3DriverFactory{}) - factory.Register(driverName, &s3DriverFactory{}) -} - -// s3DriverFactory implements the factory.StorageDriverFactory interface -type s3DriverFactory struct{} - -func (factory *s3DriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - return FromParameters(parameters) -} - -type driver struct { - S3 *s3.S3 - Bucket string - ChunkSize int64 - Encrypt bool - KeyID string - MultipartCopyChunkSize int64 - MultipartCopyMaxConcurrency int64 - MultipartCopyThresholdSize int64 - RootDirectory string - StorageClass string - ObjectACL string -} - -type baseEmbed struct { - base.Base -} - -// Driver is a storagedriver.StorageDriver implementation backed by Amazon S3 -// Objects are stored at absolute keys in the provided bucket. -type Driver struct { - baseEmbed -} - -// FromParameters constructs a new Driver with a given parameters map -// Required parameters: -// - accesskey -// - secretkey -// - region -// - bucket -// - encrypt -func FromParameters(parameters map[string]interface{}) (*Driver, error) { - // Providing no values for these is valid in case the user is authenticating - // with an IAM on an ec2 instance (in which case the instance credentials will - // be summoned when GetAuth is called) - accessKey := parameters["accesskey"] - if accessKey == nil { - accessKey = "" - } - secretKey := parameters["secretkey"] - if secretKey == nil { - secretKey = "" - } - - regionEndpoint := parameters["regionendpoint"] - if regionEndpoint == nil { - regionEndpoint = "" - } - - regionName, ok := parameters["region"] - if regionName == nil || fmt.Sprint(regionName) == "" { - return nil, fmt.Errorf("No region parameter provided") - } - region := fmt.Sprint(regionName) - // Don't check the region value if a custom endpoint is provided. - if regionEndpoint == "" { - if _, ok = validRegions[region]; !ok { - return nil, fmt.Errorf("Invalid region provided: %v", region) - } - } - - bucket := parameters["bucket"] - if bucket == nil || fmt.Sprint(bucket) == "" { - return nil, fmt.Errorf("No bucket parameter provided") - } - - encryptBool := false - encrypt := parameters["encrypt"] - switch encrypt := encrypt.(type) { - case string: - b, err := strconv.ParseBool(encrypt) - if err != nil { - return nil, fmt.Errorf("The encrypt parameter should be a boolean") - } - encryptBool = b - case bool: - encryptBool = encrypt - case nil: - // do nothing - default: - return nil, fmt.Errorf("The encrypt parameter should be a boolean") - } - - secureBool := true - secure := parameters["secure"] - switch secure := secure.(type) { - case string: - b, err := strconv.ParseBool(secure) - if err != nil { - return nil, fmt.Errorf("The secure parameter should be a boolean") - } - secureBool = b - case bool: - secureBool = secure - case nil: - // do nothing - default: - return nil, fmt.Errorf("The secure parameter should be a boolean") - } - - v4Bool := true - v4auth := parameters["v4auth"] - switch v4auth := v4auth.(type) { - case string: - b, err := strconv.ParseBool(v4auth) - if err != nil { - return nil, fmt.Errorf("The v4auth parameter should be a boolean") - } - v4Bool = b - case bool: - v4Bool = v4auth - case nil: - // do nothing - default: - return nil, fmt.Errorf("The v4auth parameter should be a boolean") - } - - keyID := parameters["keyid"] - if keyID == nil { - keyID = "" - } - - chunkSize, err := getParameterAsInt64(parameters, "chunksize", defaultChunkSize, minChunkSize, maxChunkSize) - if err != nil { - return nil, err - } - - multipartCopyChunkSize, err := getParameterAsInt64(parameters, "multipartcopychunksize", defaultMultipartCopyChunkSize, minChunkSize, maxChunkSize) - if err != nil { - return nil, err - } - - multipartCopyMaxConcurrency, err := getParameterAsInt64(parameters, "multipartcopymaxconcurrency", defaultMultipartCopyMaxConcurrency, 1, math.MaxInt64) - if err != nil { - return nil, err - } - - multipartCopyThresholdSize, err := getParameterAsInt64(parameters, "multipartcopythresholdsize", defaultMultipartCopyThresholdSize, 0, maxChunkSize) - if err != nil { - return nil, err - } - - rootDirectory := parameters["rootdirectory"] - if rootDirectory == nil { - rootDirectory = "" - } - - storageClass := s3.StorageClassStandard - storageClassParam := parameters["storageclass"] - if storageClassParam != nil { - storageClassString, ok := storageClassParam.(string) - if !ok { - return nil, fmt.Errorf("The storageclass parameter must be one of %v, %v invalid", - []string{s3.StorageClassStandard, s3.StorageClassReducedRedundancy}, storageClassParam) - } - // All valid storage class parameters are UPPERCASE, so be a bit more flexible here - storageClassString = strings.ToUpper(storageClassString) - if storageClassString != noStorageClass && - storageClassString != s3.StorageClassStandard && - storageClassString != s3.StorageClassReducedRedundancy { - return nil, fmt.Errorf("The storageclass parameter must be one of %v, %v invalid", - []string{noStorageClass, s3.StorageClassStandard, s3.StorageClassReducedRedundancy}, storageClassParam) - } - storageClass = storageClassString - } - - userAgent := parameters["useragent"] - if userAgent == nil { - userAgent = "" - } - - objectACL := s3.ObjectCannedACLPrivate - objectACLParam := parameters["objectacl"] - if objectACLParam != nil { - objectACLString, ok := objectACLParam.(string) - if !ok { - return nil, fmt.Errorf("Invalid value for objectacl parameter: %v", objectACLParam) - } - - if _, ok = validObjectACLs[objectACLString]; !ok { - return nil, fmt.Errorf("Invalid value for objectacl parameter: %v", objectACLParam) - } - objectACL = objectACLString - } - - params := DriverParameters{ - fmt.Sprint(accessKey), - fmt.Sprint(secretKey), - fmt.Sprint(bucket), - region, - fmt.Sprint(regionEndpoint), - encryptBool, - fmt.Sprint(keyID), - secureBool, - v4Bool, - chunkSize, - multipartCopyChunkSize, - multipartCopyMaxConcurrency, - multipartCopyThresholdSize, - fmt.Sprint(rootDirectory), - storageClass, - fmt.Sprint(userAgent), - objectACL, - } - - return New(params) -} - -// getParameterAsInt64 converts paramaters[name] to an int64 value (using -// defaultt if nil), verifies it is no smaller than min, and returns it. -func getParameterAsInt64(parameters map[string]interface{}, name string, defaultt int64, min int64, max int64) (int64, error) { - rv := defaultt - param := parameters[name] - switch v := param.(type) { - case string: - vv, err := strconv.ParseInt(v, 0, 64) - if err != nil { - return 0, fmt.Errorf("%s parameter must be an integer, %v invalid", name, param) - } - rv = vv - case int64: - rv = v - case int, uint, int32, uint32, uint64: - rv = reflect.ValueOf(v).Convert(reflect.TypeOf(rv)).Int() - case nil: - // do nothing - default: - return 0, fmt.Errorf("invalid value for %s: %#v", name, param) - } - - if rv < min || rv > max { - return 0, fmt.Errorf("The %s %#v parameter should be a number between %d and %d (inclusive)", name, rv, min, max) - } - - return rv, nil -} - -// New constructs a new Driver with the given AWS credentials, region, encryption flag, and -// bucketName -func New(params DriverParameters) (*Driver, error) { - if !params.V4Auth && - (params.RegionEndpoint == "" || - strings.Contains(params.RegionEndpoint, "s3.amazonaws.com")) { - return nil, fmt.Errorf("On Amazon S3 this storage driver can only be used with v4 authentication") - } - - awsConfig := aws.NewConfig() - creds := credentials.NewChainCredentials([]credentials.Provider{ - &credentials.StaticProvider{ - Value: credentials.Value{ - AccessKeyID: params.AccessKey, - SecretAccessKey: params.SecretKey, - }, - }, - &credentials.EnvProvider{}, - &credentials.SharedCredentialsProvider{}, - &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(session.New())}, - }) - - if params.RegionEndpoint != "" { - awsConfig.WithS3ForcePathStyle(true) - awsConfig.WithEndpoint(params.RegionEndpoint) - } - - awsConfig.WithCredentials(creds) - awsConfig.WithRegion(params.Region) - awsConfig.WithDisableSSL(!params.Secure) - - if params.UserAgent != "" { - awsConfig.WithHTTPClient(&http.Client{ - Transport: transport.NewTransport(http.DefaultTransport, transport.NewHeaderRequestModifier(http.Header{http.CanonicalHeaderKey("User-Agent"): []string{params.UserAgent}})), - }) - } - - s3obj := s3.New(session.New(awsConfig)) - - // enable S3 compatible signature v2 signing instead - if !params.V4Auth { - setv2Handlers(s3obj) - } - - // TODO Currently multipart uploads have no timestamps, so this would be unwise - // if you initiated a new s3driver while another one is running on the same bucket. - // multis, _, err := bucket.ListMulti("", "") - // if err != nil { - // return nil, err - // } - - // for _, multi := range multis { - // err := multi.Abort() - // //TODO appropriate to do this error checking? - // if err != nil { - // return nil, err - // } - // } - - d := &driver{ - S3: s3obj, - Bucket: params.Bucket, - ChunkSize: params.ChunkSize, - Encrypt: params.Encrypt, - KeyID: params.KeyID, - MultipartCopyChunkSize: params.MultipartCopyChunkSize, - MultipartCopyMaxConcurrency: params.MultipartCopyMaxConcurrency, - MultipartCopyThresholdSize: params.MultipartCopyThresholdSize, - RootDirectory: params.RootDirectory, - StorageClass: params.StorageClass, - ObjectACL: params.ObjectACL, - } - - return &Driver{ - baseEmbed: baseEmbed{ - Base: base.Base{ - StorageDriver: d, - }, - }, - }, nil -} - -// Implement the storagedriver.StorageDriver interface - -func (d *driver) Name() string { - return driverName -} - -// GetContent retrieves the content stored at "path" as a []byte. -func (d *driver) GetContent(ctx context.Context, path string) ([]byte, error) { - reader, err := d.Reader(ctx, path, 0) - if err != nil { - return nil, err - } - return ioutil.ReadAll(reader) -} - -// PutContent stores the []byte content at a location designated by "path". -func (d *driver) PutContent(ctx context.Context, path string, contents []byte) error { - _, err := d.S3.PutObject(&s3.PutObjectInput{ - Bucket: aws.String(d.Bucket), - Key: aws.String(d.s3Path(path)), - ContentType: d.getContentType(), - ACL: d.getACL(), - ServerSideEncryption: d.getEncryptionMode(), - SSEKMSKeyId: d.getSSEKMSKeyID(), - StorageClass: d.getStorageClass(), - Body: bytes.NewReader(contents), - }) - return parseError(path, err) -} - -// Reader retrieves an io.ReadCloser for the content stored at "path" with a -// given byte offset. -func (d *driver) Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) { - resp, err := d.S3.GetObject(&s3.GetObjectInput{ - Bucket: aws.String(d.Bucket), - Key: aws.String(d.s3Path(path)), - Range: aws.String("bytes=" + strconv.FormatInt(offset, 10) + "-"), - }) - - if err != nil { - if s3Err, ok := err.(awserr.Error); ok && s3Err.Code() == "InvalidRange" { - return ioutil.NopCloser(bytes.NewReader(nil)), nil - } - - return nil, parseError(path, err) - } - return resp.Body, nil -} - -// Writer returns a FileWriter which will store the content written to it -// at the location designated by "path" after the call to Commit. -func (d *driver) Writer(ctx context.Context, path string, append bool) (storagedriver.FileWriter, error) { - key := d.s3Path(path) - if !append { - // TODO (brianbland): cancel other uploads at this path - resp, err := d.S3.CreateMultipartUpload(&s3.CreateMultipartUploadInput{ - Bucket: aws.String(d.Bucket), - Key: aws.String(key), - ContentType: d.getContentType(), - ACL: d.getACL(), - ServerSideEncryption: d.getEncryptionMode(), - SSEKMSKeyId: d.getSSEKMSKeyID(), - StorageClass: d.getStorageClass(), - }) - if err != nil { - return nil, err - } - return d.newWriter(key, *resp.UploadId, nil), nil - } - resp, err := d.S3.ListMultipartUploads(&s3.ListMultipartUploadsInput{ - Bucket: aws.String(d.Bucket), - Prefix: aws.String(key), - }) - if err != nil { - return nil, parseError(path, err) - } - - for _, multi := range resp.Uploads { - if key != *multi.Key { - continue - } - resp, err := d.S3.ListParts(&s3.ListPartsInput{ - Bucket: aws.String(d.Bucket), - Key: aws.String(key), - UploadId: multi.UploadId, - }) - if err != nil { - return nil, parseError(path, err) - } - var multiSize int64 - for _, part := range resp.Parts { - multiSize += *part.Size - } - return d.newWriter(key, *multi.UploadId, resp.Parts), nil - } - return nil, storagedriver.PathNotFoundError{Path: path} -} - -// Stat retrieves the FileInfo for the given path, including the current size -// in bytes and the creation time. -func (d *driver) Stat(ctx context.Context, path string) (storagedriver.FileInfo, error) { - resp, err := d.S3.ListObjects(&s3.ListObjectsInput{ - Bucket: aws.String(d.Bucket), - Prefix: aws.String(d.s3Path(path)), - MaxKeys: aws.Int64(1), - }) - if err != nil { - return nil, err - } - - fi := storagedriver.FileInfoFields{ - Path: path, - } - - if len(resp.Contents) == 1 { - if *resp.Contents[0].Key != d.s3Path(path) { - fi.IsDir = true - } else { - fi.IsDir = false - fi.Size = *resp.Contents[0].Size - fi.ModTime = *resp.Contents[0].LastModified - } - } else if len(resp.CommonPrefixes) == 1 { - fi.IsDir = true - } else { - return nil, storagedriver.PathNotFoundError{Path: path} - } - - return storagedriver.FileInfoInternal{FileInfoFields: fi}, nil -} - -// List returns a list of the objects that are direct descendants of the given path. -func (d *driver) List(ctx context.Context, opath string) ([]string, error) { - path := opath - if path != "/" && path[len(path)-1] != '/' { - path = path + "/" - } - - // This is to cover for the cases when the rootDirectory of the driver is either "" or "/". - // In those cases, there is no root prefix to replace and we must actually add a "/" to all - // results in order to keep them as valid paths as recognized by storagedriver.PathRegexp - prefix := "" - if d.s3Path("") == "" { - prefix = "/" - } - - resp, err := d.S3.ListObjects(&s3.ListObjectsInput{ - Bucket: aws.String(d.Bucket), - Prefix: aws.String(d.s3Path(path)), - Delimiter: aws.String("/"), - MaxKeys: aws.Int64(listMax), - }) - if err != nil { - return nil, parseError(opath, err) - } - - files := []string{} - directories := []string{} - - for { - for _, key := range resp.Contents { - files = append(files, strings.Replace(*key.Key, d.s3Path(""), prefix, 1)) - } - - for _, commonPrefix := range resp.CommonPrefixes { - commonPrefix := *commonPrefix.Prefix - directories = append(directories, strings.Replace(commonPrefix[0:len(commonPrefix)-1], d.s3Path(""), prefix, 1)) - } - - if *resp.IsTruncated { - resp, err = d.S3.ListObjects(&s3.ListObjectsInput{ - Bucket: aws.String(d.Bucket), - Prefix: aws.String(d.s3Path(path)), - Delimiter: aws.String("/"), - MaxKeys: aws.Int64(listMax), - Marker: resp.NextMarker, - }) - if err != nil { - return nil, err - } - } else { - break - } - } - - if opath != "/" { - if len(files) == 0 && len(directories) == 0 { - // Treat empty response as missing directory, since we don't actually - // have directories in s3. - return nil, storagedriver.PathNotFoundError{Path: opath} - } - } - - return append(files, directories...), nil -} - -// Move moves an object stored at sourcePath to destPath, removing the original -// object. -func (d *driver) Move(ctx context.Context, sourcePath string, destPath string) error { - /* This is terrible, but aws doesn't have an actual move. */ - if err := d.copy(ctx, sourcePath, destPath); err != nil { - return err - } - return d.Delete(ctx, sourcePath) -} - -// copy copies an object stored at sourcePath to destPath. -func (d *driver) copy(ctx context.Context, sourcePath string, destPath string) error { - // S3 can copy objects up to 5 GB in size with a single PUT Object - Copy - // operation. For larger objects, the multipart upload API must be used. - // - // Empirically, multipart copy is fastest with 32 MB parts and is faster - // than PUT Object - Copy for objects larger than 32 MB. - - fileInfo, err := d.Stat(ctx, sourcePath) - if err != nil { - return parseError(sourcePath, err) - } - - if fileInfo.Size() <= d.MultipartCopyThresholdSize { - _, err := d.S3.CopyObject(&s3.CopyObjectInput{ - Bucket: aws.String(d.Bucket), - Key: aws.String(d.s3Path(destPath)), - ContentType: d.getContentType(), - ACL: d.getACL(), - ServerSideEncryption: d.getEncryptionMode(), - SSEKMSKeyId: d.getSSEKMSKeyID(), - StorageClass: d.getStorageClass(), - CopySource: aws.String(d.Bucket + "/" + d.s3Path(sourcePath)), - }) - if err != nil { - return parseError(sourcePath, err) - } - return nil - } - - // Even in the worst case, a multipart copy should take no more - // than a few minutes, so 30 minutes is very conservative. - expires := time.Now().Add(time.Duration(30) * time.Minute) - createResp, err := d.S3.CreateMultipartUpload(&s3.CreateMultipartUploadInput{ - Bucket: aws.String(d.Bucket), - Key: aws.String(d.s3Path(destPath)), - ContentType: d.getContentType(), - ACL: d.getACL(), - Expires: aws.Time(expires), - SSEKMSKeyId: d.getSSEKMSKeyID(), - ServerSideEncryption: d.getEncryptionMode(), - StorageClass: d.getStorageClass(), - }) - if err != nil { - return err - } - - numParts := (fileInfo.Size() + d.MultipartCopyChunkSize - 1) / d.MultipartCopyChunkSize - completedParts := make([]*s3.CompletedPart, numParts) - errChan := make(chan error, numParts) - limiter := make(chan struct{}, d.MultipartCopyMaxConcurrency) - - for i := range completedParts { - i := int64(i) - go func() { - limiter <- struct{}{} - firstByte := i * d.MultipartCopyChunkSize - lastByte := firstByte + d.MultipartCopyChunkSize - 1 - if lastByte >= fileInfo.Size() { - lastByte = fileInfo.Size() - 1 - } - uploadResp, err := d.S3.UploadPartCopy(&s3.UploadPartCopyInput{ - Bucket: aws.String(d.Bucket), - CopySource: aws.String(d.Bucket + "/" + d.s3Path(sourcePath)), - Key: aws.String(d.s3Path(destPath)), - PartNumber: aws.Int64(i + 1), - UploadId: createResp.UploadId, - CopySourceRange: aws.String(fmt.Sprintf("bytes=%d-%d", firstByte, lastByte)), - }) - if err == nil { - completedParts[i] = &s3.CompletedPart{ - ETag: uploadResp.CopyPartResult.ETag, - PartNumber: aws.Int64(i + 1), - } - } - errChan <- err - <-limiter - }() - } - - for range completedParts { - err := <-errChan - if err != nil { - return err - } - } - - _, err = d.S3.CompleteMultipartUpload(&s3.CompleteMultipartUploadInput{ - Bucket: aws.String(d.Bucket), - Key: aws.String(d.s3Path(destPath)), - UploadId: createResp.UploadId, - MultipartUpload: &s3.CompletedMultipartUpload{Parts: completedParts}, - }) - return err -} - -func min(a, b int) int { - if a < b { - return a - } - return b -} - -// Delete recursively deletes all objects stored at "path" and its subpaths. -// We must be careful since S3 does not guarantee read after delete consistency -func (d *driver) Delete(ctx context.Context, path string) error { - s3Objects := make([]*s3.ObjectIdentifier, 0, listMax) - s3Path := d.s3Path(path) - listObjectsInput := &s3.ListObjectsInput{ - Bucket: aws.String(d.Bucket), - Prefix: aws.String(s3Path), - } -ListLoop: - for { - // list all the objects - resp, err := d.S3.ListObjects(listObjectsInput) - - // resp.Contents can only be empty on the first call - // if there were no more results to return after the first call, resp.IsTruncated would have been false - // and the loop would be exited without recalling ListObjects - if err != nil || len(resp.Contents) == 0 { - return storagedriver.PathNotFoundError{Path: path} - } - - for _, key := range resp.Contents { - // Stop if we encounter a key that is not a subpath (so that deleting "/a" does not delete "/ab"). - if len(*key.Key) > len(s3Path) && (*key.Key)[len(s3Path)] != '/' { - break ListLoop - } - s3Objects = append(s3Objects, &s3.ObjectIdentifier{ - Key: key.Key, - }) - } - - // resp.Contents must have at least one element or we would have returned not found - listObjectsInput.Marker = resp.Contents[len(resp.Contents)-1].Key - - // from the s3 api docs, IsTruncated "specifies whether (true) or not (false) all of the results were returned" - // if everything has been returned, break - if resp.IsTruncated == nil || !*resp.IsTruncated { - break - } - } - - // need to chunk objects into groups of 1000 per s3 restrictions - total := len(s3Objects) - for i := 0; i < total; i += 1000 { - _, err := d.S3.DeleteObjects(&s3.DeleteObjectsInput{ - Bucket: aws.String(d.Bucket), - Delete: &s3.Delete{ - Objects: s3Objects[i:min(i+1000, total)], - Quiet: aws.Bool(false), - }, - }) - if err != nil { - return err - } - } - return nil -} - -// URLFor returns a URL which may be used to retrieve the content stored at the given path. -// May return an UnsupportedMethodErr in certain StorageDriver implementations. -func (d *driver) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { - methodString := "GET" - method, ok := options["method"] - if ok { - methodString, ok = method.(string) - if !ok || (methodString != "GET" && methodString != "HEAD") { - return "", storagedriver.ErrUnsupportedMethod{} - } - } - - expiresIn := 20 * time.Minute - expires, ok := options["expiry"] - if ok { - et, ok := expires.(time.Time) - if ok { - expiresIn = et.Sub(time.Now()) - } - } - - var req *request.Request - - switch methodString { - case "GET": - req, _ = d.S3.GetObjectRequest(&s3.GetObjectInput{ - Bucket: aws.String(d.Bucket), - Key: aws.String(d.s3Path(path)), - }) - case "HEAD": - req, _ = d.S3.HeadObjectRequest(&s3.HeadObjectInput{ - Bucket: aws.String(d.Bucket), - Key: aws.String(d.s3Path(path)), - }) - default: - panic("unreachable") - } - - return req.Presign(expiresIn) -} - -func (d *driver) s3Path(path string) string { - return strings.TrimLeft(strings.TrimRight(d.RootDirectory, "/")+path, "/") -} - -// S3BucketKey returns the s3 bucket key for the given storage driver path. -func (d *Driver) S3BucketKey(path string) string { - return d.StorageDriver.(*driver).s3Path(path) -} - -func parseError(path string, err error) error { - if s3Err, ok := err.(awserr.Error); ok && s3Err.Code() == "NoSuchKey" { - return storagedriver.PathNotFoundError{Path: path} - } - - return err -} - -func (d *driver) getEncryptionMode() *string { - if !d.Encrypt { - return nil - } - if d.KeyID == "" { - return aws.String("AES256") - } - return aws.String("aws:kms") -} - -func (d *driver) getSSEKMSKeyID() *string { - if d.KeyID != "" { - return aws.String(d.KeyID) - } - return nil -} - -func (d *driver) getContentType() *string { - return aws.String("application/octet-stream") -} - -func (d *driver) getACL() *string { - return aws.String(d.ObjectACL) -} - -func (d *driver) getStorageClass() *string { - if d.StorageClass == noStorageClass { - return nil - } - return aws.String(d.StorageClass) -} - -// writer attempts to upload parts to S3 in a buffered fashion where the last -// part is at least as large as the chunksize, so the multipart upload could be -// cleanly resumed in the future. This is violated if Close is called after less -// than a full chunk is written. -type writer struct { - driver *driver - key string - uploadID string - parts []*s3.Part - size int64 - readyPart []byte - pendingPart []byte - closed bool - committed bool - cancelled bool -} - -func (d *driver) newWriter(key, uploadID string, parts []*s3.Part) storagedriver.FileWriter { - var size int64 - for _, part := range parts { - size += *part.Size - } - return &writer{ - driver: d, - key: key, - uploadID: uploadID, - parts: parts, - size: size, - } -} - -type completedParts []*s3.CompletedPart - -func (a completedParts) Len() int { return len(a) } -func (a completedParts) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a completedParts) Less(i, j int) bool { return *a[i].PartNumber < *a[j].PartNumber } - -func (w *writer) Write(p []byte) (int, error) { - if w.closed { - return 0, fmt.Errorf("already closed") - } else if w.committed { - return 0, fmt.Errorf("already committed") - } else if w.cancelled { - return 0, fmt.Errorf("already cancelled") - } - - // If the last written part is smaller than minChunkSize, we need to make a - // new multipart upload :sadface: - if len(w.parts) > 0 && int(*w.parts[len(w.parts)-1].Size) < minChunkSize { - var completedUploadedParts completedParts - for _, part := range w.parts { - completedUploadedParts = append(completedUploadedParts, &s3.CompletedPart{ - ETag: part.ETag, - PartNumber: part.PartNumber, - }) - } - - sort.Sort(completedUploadedParts) - - _, err := w.driver.S3.CompleteMultipartUpload(&s3.CompleteMultipartUploadInput{ - Bucket: aws.String(w.driver.Bucket), - Key: aws.String(w.key), - UploadId: aws.String(w.uploadID), - MultipartUpload: &s3.CompletedMultipartUpload{ - Parts: completedUploadedParts, - }, - }) - if err != nil { - w.driver.S3.AbortMultipartUpload(&s3.AbortMultipartUploadInput{ - Bucket: aws.String(w.driver.Bucket), - Key: aws.String(w.key), - UploadId: aws.String(w.uploadID), - }) - return 0, err - } - - resp, err := w.driver.S3.CreateMultipartUpload(&s3.CreateMultipartUploadInput{ - Bucket: aws.String(w.driver.Bucket), - Key: aws.String(w.key), - ContentType: w.driver.getContentType(), - ACL: w.driver.getACL(), - ServerSideEncryption: w.driver.getEncryptionMode(), - StorageClass: w.driver.getStorageClass(), - }) - if err != nil { - return 0, err - } - w.uploadID = *resp.UploadId - - // If the entire written file is smaller than minChunkSize, we need to make - // a new part from scratch :double sad face: - if w.size < minChunkSize { - resp, err := w.driver.S3.GetObject(&s3.GetObjectInput{ - Bucket: aws.String(w.driver.Bucket), - Key: aws.String(w.key), - }) - defer resp.Body.Close() - if err != nil { - return 0, err - } - w.parts = nil - w.readyPart, err = ioutil.ReadAll(resp.Body) - if err != nil { - return 0, err - } - } else { - // Otherwise we can use the old file as the new first part - copyPartResp, err := w.driver.S3.UploadPartCopy(&s3.UploadPartCopyInput{ - Bucket: aws.String(w.driver.Bucket), - CopySource: aws.String(w.driver.Bucket + "/" + w.key), - Key: aws.String(w.key), - PartNumber: aws.Int64(1), - UploadId: resp.UploadId, - }) - if err != nil { - return 0, err - } - w.parts = []*s3.Part{ - { - ETag: copyPartResp.CopyPartResult.ETag, - PartNumber: aws.Int64(1), - Size: aws.Int64(w.size), - }, - } - } - } - - var n int - - for len(p) > 0 { - // If no parts are ready to write, fill up the first part - if neededBytes := int(w.driver.ChunkSize) - len(w.readyPart); neededBytes > 0 { - if len(p) >= neededBytes { - w.readyPart = append(w.readyPart, p[:neededBytes]...) - n += neededBytes - p = p[neededBytes:] - } else { - w.readyPart = append(w.readyPart, p...) - n += len(p) - p = nil - } - } - - if neededBytes := int(w.driver.ChunkSize) - len(w.pendingPart); neededBytes > 0 { - if len(p) >= neededBytes { - w.pendingPart = append(w.pendingPart, p[:neededBytes]...) - n += neededBytes - p = p[neededBytes:] - err := w.flushPart() - if err != nil { - w.size += int64(n) - return n, err - } - } else { - w.pendingPart = append(w.pendingPart, p...) - n += len(p) - p = nil - } - } - } - w.size += int64(n) - return n, nil -} - -func (w *writer) Size() int64 { - return w.size -} - -func (w *writer) Close() error { - if w.closed { - return fmt.Errorf("already closed") - } - w.closed = true - return w.flushPart() -} - -func (w *writer) Cancel() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } - w.cancelled = true - _, err := w.driver.S3.AbortMultipartUpload(&s3.AbortMultipartUploadInput{ - Bucket: aws.String(w.driver.Bucket), - Key: aws.String(w.key), - UploadId: aws.String(w.uploadID), - }) - return err -} - -func (w *writer) Commit() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } else if w.cancelled { - return fmt.Errorf("already cancelled") - } - err := w.flushPart() - if err != nil { - return err - } - w.committed = true - - var completedUploadedParts completedParts - for _, part := range w.parts { - completedUploadedParts = append(completedUploadedParts, &s3.CompletedPart{ - ETag: part.ETag, - PartNumber: part.PartNumber, - }) - } - - sort.Sort(completedUploadedParts) - - _, err = w.driver.S3.CompleteMultipartUpload(&s3.CompleteMultipartUploadInput{ - Bucket: aws.String(w.driver.Bucket), - Key: aws.String(w.key), - UploadId: aws.String(w.uploadID), - MultipartUpload: &s3.CompletedMultipartUpload{ - Parts: completedUploadedParts, - }, - }) - if err != nil { - w.driver.S3.AbortMultipartUpload(&s3.AbortMultipartUploadInput{ - Bucket: aws.String(w.driver.Bucket), - Key: aws.String(w.key), - UploadId: aws.String(w.uploadID), - }) - return err - } - return nil -} - -// flushPart flushes buffers to write a part to S3. -// Only called by Write (with both buffers full) and Close/Commit (always) -func (w *writer) flushPart() error { - if len(w.readyPart) == 0 && len(w.pendingPart) == 0 { - // nothing to write - return nil - } - if len(w.pendingPart) < int(w.driver.ChunkSize) { - // closing with a small pending part - // combine ready and pending to avoid writing a small part - w.readyPart = append(w.readyPart, w.pendingPart...) - w.pendingPart = nil - } - - partNumber := aws.Int64(int64(len(w.parts) + 1)) - resp, err := w.driver.S3.UploadPart(&s3.UploadPartInput{ - Bucket: aws.String(w.driver.Bucket), - Key: aws.String(w.key), - PartNumber: partNumber, - UploadId: aws.String(w.uploadID), - Body: bytes.NewReader(w.readyPart), - }) - if err != nil { - return err - } - w.parts = append(w.parts, &s3.Part{ - ETag: resp.ETag, - PartNumber: partNumber, - Size: aws.Int64(int64(len(w.readyPart))), - }) - w.readyPart = w.pendingPart - w.pendingPart = nil - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3_test.go b/vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3_test.go deleted file mode 100644 index eb7ee5195..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3_test.go +++ /dev/null @@ -1,313 +0,0 @@ -package s3 - -import ( - "bytes" - "io/ioutil" - "math/rand" - "os" - "strconv" - "testing" - - "gopkg.in/check.v1" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/s3" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/testsuites" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -var s3DriverConstructor func(rootDirectory, storageClass string) (*Driver, error) -var skipS3 func() string - -func init() { - accessKey := os.Getenv("AWS_ACCESS_KEY") - secretKey := os.Getenv("AWS_SECRET_KEY") - bucket := os.Getenv("S3_BUCKET") - encrypt := os.Getenv("S3_ENCRYPT") - keyID := os.Getenv("S3_KEY_ID") - secure := os.Getenv("S3_SECURE") - v4Auth := os.Getenv("S3_V4_AUTH") - region := os.Getenv("AWS_REGION") - objectACL := os.Getenv("S3_OBJECT_ACL") - root, err := ioutil.TempDir("", "driver-") - regionEndpoint := os.Getenv("REGION_ENDPOINT") - if err != nil { - panic(err) - } - defer os.Remove(root) - - s3DriverConstructor = func(rootDirectory, storageClass string) (*Driver, error) { - encryptBool := false - if encrypt != "" { - encryptBool, err = strconv.ParseBool(encrypt) - if err != nil { - return nil, err - } - } - - secureBool := true - if secure != "" { - secureBool, err = strconv.ParseBool(secure) - if err != nil { - return nil, err - } - } - - v4Bool := true - if v4Auth != "" { - v4Bool, err = strconv.ParseBool(v4Auth) - if err != nil { - return nil, err - } - } - - parameters := DriverParameters{ - accessKey, - secretKey, - bucket, - region, - regionEndpoint, - encryptBool, - keyID, - secureBool, - v4Bool, - minChunkSize, - defaultMultipartCopyChunkSize, - defaultMultipartCopyMaxConcurrency, - defaultMultipartCopyThresholdSize, - rootDirectory, - storageClass, - driverName + "-test", - objectACL, - } - - return New(parameters) - } - - // Skip S3 storage driver tests if environment variable parameters are not provided - skipS3 = func() string { - if accessKey == "" || secretKey == "" || region == "" || bucket == "" || encrypt == "" { - return "Must set AWS_ACCESS_KEY, AWS_SECRET_KEY, AWS_REGION, S3_BUCKET, and S3_ENCRYPT to run S3 tests" - } - return "" - } - - testsuites.RegisterSuite(func() (storagedriver.StorageDriver, error) { - return s3DriverConstructor(root, s3.StorageClassStandard) - }, skipS3) -} - -func TestEmptyRootList(t *testing.T) { - if skipS3() != "" { - t.Skip(skipS3()) - } - - validRoot, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(validRoot) - - rootedDriver, err := s3DriverConstructor(validRoot, s3.StorageClassStandard) - if err != nil { - t.Fatalf("unexpected error creating rooted driver: %v", err) - } - - emptyRootDriver, err := s3DriverConstructor("", s3.StorageClassStandard) - if err != nil { - t.Fatalf("unexpected error creating empty root driver: %v", err) - } - - slashRootDriver, err := s3DriverConstructor("/", s3.StorageClassStandard) - if err != nil { - t.Fatalf("unexpected error creating slash root driver: %v", err) - } - - filename := "/test" - contents := []byte("contents") - ctx := context.Background() - err = rootedDriver.PutContent(ctx, filename, contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - defer rootedDriver.Delete(ctx, filename) - - keys, err := emptyRootDriver.List(ctx, "/") - for _, path := range keys { - if !storagedriver.PathRegexp.MatchString(path) { - t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) - } - } - - keys, err = slashRootDriver.List(ctx, "/") - for _, path := range keys { - if !storagedriver.PathRegexp.MatchString(path) { - t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) - } - } -} - -func TestStorageClass(t *testing.T) { - if skipS3() != "" { - t.Skip(skipS3()) - } - - rootDir, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(rootDir) - - standardDriver, err := s3DriverConstructor(rootDir, s3.StorageClassStandard) - if err != nil { - t.Fatalf("unexpected error creating driver with standard storage: %v", err) - } - - rrDriver, err := s3DriverConstructor(rootDir, s3.StorageClassReducedRedundancy) - if err != nil { - t.Fatalf("unexpected error creating driver with reduced redundancy storage: %v", err) - } - - if _, err = s3DriverConstructor(rootDir, noStorageClass); err != nil { - t.Fatalf("unexpected error creating driver without storage class: %v", err) - } - - standardFilename := "/test-standard" - rrFilename := "/test-rr" - contents := []byte("contents") - ctx := context.Background() - - err = standardDriver.PutContent(ctx, standardFilename, contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - defer standardDriver.Delete(ctx, standardFilename) - - err = rrDriver.PutContent(ctx, rrFilename, contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - defer rrDriver.Delete(ctx, rrFilename) - - standardDriverUnwrapped := standardDriver.Base.StorageDriver.(*driver) - resp, err := standardDriverUnwrapped.S3.GetObject(&s3.GetObjectInput{ - Bucket: aws.String(standardDriverUnwrapped.Bucket), - Key: aws.String(standardDriverUnwrapped.s3Path(standardFilename)), - }) - if err != nil { - t.Fatalf("unexpected error retrieving standard storage file: %v", err) - } - defer resp.Body.Close() - // Amazon only populates this header value for non-standard storage classes - if resp.StorageClass != nil { - t.Fatalf("unexpected storage class for standard file: %v", resp.StorageClass) - } - - rrDriverUnwrapped := rrDriver.Base.StorageDriver.(*driver) - resp, err = rrDriverUnwrapped.S3.GetObject(&s3.GetObjectInput{ - Bucket: aws.String(rrDriverUnwrapped.Bucket), - Key: aws.String(rrDriverUnwrapped.s3Path(rrFilename)), - }) - if err != nil { - t.Fatalf("unexpected error retrieving reduced-redundancy storage file: %v", err) - } - defer resp.Body.Close() - if resp.StorageClass == nil { - t.Fatalf("unexpected storage class for reduced-redundancy file: %v", s3.StorageClassStandard) - } else if *resp.StorageClass != s3.StorageClassReducedRedundancy { - t.Fatalf("unexpected storage class for reduced-redundancy file: %v", *resp.StorageClass) - } - -} - -func TestOverThousandBlobs(t *testing.T) { - if skipS3() != "" { - t.Skip(skipS3()) - } - - rootDir, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(rootDir) - - standardDriver, err := s3DriverConstructor(rootDir, s3.StorageClassStandard) - if err != nil { - t.Fatalf("unexpected error creating driver with standard storage: %v", err) - } - - ctx := context.Background() - for i := 0; i < 1005; i++ { - filename := "/thousandfiletest/file" + strconv.Itoa(i) - contents := []byte("contents") - err = standardDriver.PutContent(ctx, filename, contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - } - - // cant actually verify deletion because read-after-delete is inconsistent, but can ensure no errors - err = standardDriver.Delete(ctx, "/thousandfiletest") - if err != nil { - t.Fatalf("unexpected error deleting thousand files: %v", err) - } -} - -func TestMoveWithMultipartCopy(t *testing.T) { - if skipS3() != "" { - t.Skip(skipS3()) - } - - rootDir, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(rootDir) - - d, err := s3DriverConstructor(rootDir, s3.StorageClassStandard) - if err != nil { - t.Fatalf("unexpected error creating driver: %v", err) - } - - ctx := context.Background() - sourcePath := "/source" - destPath := "/dest" - - defer d.Delete(ctx, sourcePath) - defer d.Delete(ctx, destPath) - - // An object larger than d's MultipartCopyThresholdSize will cause d.Move() to perform a multipart copy. - multipartCopyThresholdSize := d.baseEmbed.Base.StorageDriver.(*driver).MultipartCopyThresholdSize - contents := make([]byte, 2*multipartCopyThresholdSize) - rand.Read(contents) - - err = d.PutContent(ctx, sourcePath, contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - - err = d.Move(ctx, sourcePath, destPath) - if err != nil { - t.Fatalf("unexpected error moving file: %v", err) - } - - received, err := d.GetContent(ctx, destPath) - if err != nil { - t.Fatalf("unexpected error getting content: %v", err) - } - if !bytes.Equal(contents, received) { - t.Fatal("content differs") - } - - _, err = d.GetContent(ctx, sourcePath) - switch err.(type) { - case storagedriver.PathNotFoundError: - default: - t.Fatalf("unexpected error getting content: %v", err) - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3_v2_signer.go b/vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3_v2_signer.go deleted file mode 100644 index 7cabe07e2..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/s3-aws/s3_v2_signer.go +++ /dev/null @@ -1,219 +0,0 @@ -package s3 - -// Source: https://github.com/pivotal-golang/s3cli - -// Copyright (c) 2013 Damien Le Berrigaud and Nick Wade - -// 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. - -import ( - "crypto/hmac" - "crypto/sha1" - "encoding/base64" - "net/http" - "net/url" - "sort" - "strings" - "time" - - log "github.com/Sirupsen/logrus" - "github.com/aws/aws-sdk-go/aws/corehandlers" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/service/s3" -) - -const ( - signatureVersion = "2" - signatureMethod = "HmacSHA1" - timeFormat = "2006-01-02T15:04:05Z" -) - -type signer struct { - // Values that must be populated from the request - Request *http.Request - Time time.Time - Credentials *credentials.Credentials - Query url.Values - stringToSign string - signature string -} - -var s3ParamsToSign = map[string]bool{ - "acl": true, - "location": true, - "logging": true, - "notification": true, - "partNumber": true, - "policy": true, - "requestPayment": true, - "torrent": true, - "uploadId": true, - "uploads": true, - "versionId": true, - "versioning": true, - "versions": true, - "response-content-type": true, - "response-content-language": true, - "response-expires": true, - "response-cache-control": true, - "response-content-disposition": true, - "response-content-encoding": true, - "website": true, - "delete": true, -} - -// setv2Handlers will setup v2 signature signing on the S3 driver -func setv2Handlers(svc *s3.S3) { - svc.Handlers.Build.PushBack(func(r *request.Request) { - parsedURL, err := url.Parse(r.HTTPRequest.URL.String()) - if err != nil { - log.Fatalf("Failed to parse URL: %v", err) - } - r.HTTPRequest.URL.Opaque = parsedURL.Path - }) - - svc.Handlers.Sign.Clear() - svc.Handlers.Sign.PushBack(Sign) - svc.Handlers.Sign.PushBackNamed(corehandlers.BuildContentLengthHandler) -} - -// Sign requests with signature version 2. -// -// Will sign the requests with the service config's Credentials object -// Signing is skipped if the credentials is the credentials.AnonymousCredentials -// object. -func Sign(req *request.Request) { - // If the request does not need to be signed ignore the signing of the - // request if the AnonymousCredentials object is used. - if req.Config.Credentials == credentials.AnonymousCredentials { - return - } - - v2 := signer{ - Request: req.HTTPRequest, - Time: req.Time, - Credentials: req.Config.Credentials, - } - v2.Sign() -} - -func (v2 *signer) Sign() error { - credValue, err := v2.Credentials.Get() - if err != nil { - return err - } - accessKey := credValue.AccessKeyID - var ( - md5, ctype, date, xamz string - xamzDate bool - sarray []string - smap map[string]string - sharray []string - ) - - headers := v2.Request.Header - params := v2.Request.URL.Query() - parsedURL, err := url.Parse(v2.Request.URL.String()) - if err != nil { - return err - } - host, canonicalPath := parsedURL.Host, parsedURL.Path - v2.Request.Header["Host"] = []string{host} - v2.Request.Header["date"] = []string{v2.Time.In(time.UTC).Format(time.RFC1123)} - - smap = make(map[string]string) - for k, v := range headers { - k = strings.ToLower(k) - switch k { - case "content-md5": - md5 = v[0] - case "content-type": - ctype = v[0] - case "date": - if !xamzDate { - date = v[0] - } - default: - if strings.HasPrefix(k, "x-amz-") { - vall := strings.Join(v, ",") - smap[k] = k + ":" + vall - if k == "x-amz-date" { - xamzDate = true - date = "" - } - sharray = append(sharray, k) - } - } - } - if len(sharray) > 0 { - sort.StringSlice(sharray).Sort() - for _, h := range sharray { - sarray = append(sarray, smap[h]) - } - xamz = strings.Join(sarray, "\n") + "\n" - } - - expires := false - if v, ok := params["Expires"]; ok { - expires = true - date = v[0] - params["AWSAccessKeyId"] = []string{accessKey} - } - - sarray = sarray[0:0] - for k, v := range params { - if s3ParamsToSign[k] { - for _, vi := range v { - if vi == "" { - sarray = append(sarray, k) - } else { - sarray = append(sarray, k+"="+vi) - } - } - } - } - if len(sarray) > 0 { - sort.StringSlice(sarray).Sort() - canonicalPath = canonicalPath + "?" + strings.Join(sarray, "&") - } - - v2.stringToSign = strings.Join([]string{ - v2.Request.Method, - md5, - ctype, - date, - xamz + canonicalPath, - }, "\n") - hash := hmac.New(sha1.New, []byte(credValue.SecretAccessKey)) - hash.Write([]byte(v2.stringToSign)) - v2.signature = base64.StdEncoding.EncodeToString(hash.Sum(nil)) - - if expires { - params["Signature"] = []string{string(v2.signature)} - } else { - headers["Authorization"] = []string{"AWS " + accessKey + ":" + string(v2.signature)} - } - - log.WithFields(log.Fields{ - "string-to-sign": v2.stringToSign, - "signature": v2.signature, - }).Debugln("request signature") - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/s3-goamz/s3.go b/vendor/github.com/docker/distribution/registry/storage/driver/s3-goamz/s3.go deleted file mode 100644 index 33751c168..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/s3-goamz/s3.go +++ /dev/null @@ -1,757 +0,0 @@ -// Package s3 provides a storagedriver.StorageDriver implementation to -// store blobs in Amazon S3 cloud storage. -// -// This package leverages the docker/goamz client library for interfacing with -// S3. It is intended to be deprecated in favor of the s3-aws driver -// implementation. -// -// Because S3 is a key, value store the Stat call does not support last modification -// time for directories (directories are an abstraction for key, value stores) -// -// Keep in mind that S3 guarantees only read-after-write consistency for new -// objects, but no read-after-update or list-after-write consistency. -package s3 - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/http" - "reflect" - "strconv" - "strings" - "time" - - "github.com/docker/goamz/aws" - "github.com/docker/goamz/s3" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/client/transport" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/base" - "github.com/docker/distribution/registry/storage/driver/factory" -) - -const driverName = "s3goamz" - -// minChunkSize defines the minimum multipart upload chunk size -// S3 API requires multipart upload chunks to be at least 5MB -const minChunkSize = 5 << 20 - -const defaultChunkSize = 2 * minChunkSize - -// listMax is the largest amount of objects you can request from S3 in a list call -const listMax = 1000 - -//DriverParameters A struct that encapsulates all of the driver parameters after all values have been set -type DriverParameters struct { - AccessKey string - SecretKey string - Bucket string - Region aws.Region - Encrypt bool - Secure bool - V4Auth bool - ChunkSize int64 - RootDirectory string - StorageClass s3.StorageClass - UserAgent string -} - -func init() { - factory.Register(driverName, &s3DriverFactory{}) -} - -// s3DriverFactory implements the factory.StorageDriverFactory interface -type s3DriverFactory struct{} - -func (factory *s3DriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - return FromParameters(parameters) -} - -type driver struct { - S3 *s3.S3 - Bucket *s3.Bucket - ChunkSize int64 - Encrypt bool - RootDirectory string - StorageClass s3.StorageClass -} - -type baseEmbed struct { - base.Base -} - -// Driver is a storagedriver.StorageDriver implementation backed by Amazon S3 -// Objects are stored at absolute keys in the provided bucket. -type Driver struct { - baseEmbed -} - -// FromParameters constructs a new Driver with a given parameters map -// Required parameters: -// - accesskey -// - secretkey -// - region -// - bucket -// - encrypt -func FromParameters(parameters map[string]interface{}) (*Driver, error) { - // Providing no values for these is valid in case the user is authenticating - // with an IAM on an ec2 instance (in which case the instance credentials will - // be summoned when GetAuth is called) - accessKey := parameters["accesskey"] - if accessKey == nil { - accessKey = "" - } - - secretKey := parameters["secretkey"] - if secretKey == nil { - secretKey = "" - } - - regionName := parameters["region"] - if regionName == nil || fmt.Sprint(regionName) == "" { - return nil, fmt.Errorf("No region parameter provided") - } - region := aws.GetRegion(fmt.Sprint(regionName)) - if region.Name == "" { - return nil, fmt.Errorf("Invalid region provided: %v", region) - } - - bucket := parameters["bucket"] - if bucket == nil || fmt.Sprint(bucket) == "" { - return nil, fmt.Errorf("No bucket parameter provided") - } - - encryptBool := false - encrypt := parameters["encrypt"] - switch encrypt := encrypt.(type) { - case string: - b, err := strconv.ParseBool(encrypt) - if err != nil { - return nil, fmt.Errorf("The encrypt parameter should be a boolean") - } - encryptBool = b - case bool: - encryptBool = encrypt - case nil: - // do nothing - default: - return nil, fmt.Errorf("The encrypt parameter should be a boolean") - } - - secureBool := true - secure := parameters["secure"] - switch secure := secure.(type) { - case string: - b, err := strconv.ParseBool(secure) - if err != nil { - return nil, fmt.Errorf("The secure parameter should be a boolean") - } - secureBool = b - case bool: - secureBool = secure - case nil: - // do nothing - default: - return nil, fmt.Errorf("The secure parameter should be a boolean") - } - - v4AuthBool := false - v4Auth := parameters["v4auth"] - switch v4Auth := v4Auth.(type) { - case string: - b, err := strconv.ParseBool(v4Auth) - if err != nil { - return nil, fmt.Errorf("The v4auth parameter should be a boolean") - } - v4AuthBool = b - case bool: - v4AuthBool = v4Auth - case nil: - // do nothing - default: - return nil, fmt.Errorf("The v4auth parameter should be a boolean") - } - - chunkSize := int64(defaultChunkSize) - chunkSizeParam := parameters["chunksize"] - switch v := chunkSizeParam.(type) { - case string: - vv, err := strconv.ParseInt(v, 0, 64) - if err != nil { - return nil, fmt.Errorf("chunksize parameter must be an integer, %v invalid", chunkSizeParam) - } - chunkSize = vv - case int64: - chunkSize = v - case int, uint, int32, uint32, uint64: - chunkSize = reflect.ValueOf(v).Convert(reflect.TypeOf(chunkSize)).Int() - case nil: - // do nothing - default: - return nil, fmt.Errorf("invalid value for chunksize: %#v", chunkSizeParam) - } - - if chunkSize < minChunkSize { - return nil, fmt.Errorf("The chunksize %#v parameter should be a number that is larger than or equal to %d", chunkSize, minChunkSize) - } - - rootDirectory := parameters["rootdirectory"] - if rootDirectory == nil { - rootDirectory = "" - } - - storageClass := s3.StandardStorage - storageClassParam := parameters["storageclass"] - if storageClassParam != nil { - storageClassString, ok := storageClassParam.(string) - if !ok { - return nil, fmt.Errorf("The storageclass parameter must be one of %v, %v invalid", []s3.StorageClass{s3.StandardStorage, s3.ReducedRedundancy}, storageClassParam) - } - // All valid storage class parameters are UPPERCASE, so be a bit more flexible here - storageClassCasted := s3.StorageClass(strings.ToUpper(storageClassString)) - if storageClassCasted != s3.StandardStorage && storageClassCasted != s3.ReducedRedundancy { - return nil, fmt.Errorf("The storageclass parameter must be one of %v, %v invalid", []s3.StorageClass{s3.StandardStorage, s3.ReducedRedundancy}, storageClassParam) - } - storageClass = storageClassCasted - } - - userAgent := parameters["useragent"] - if userAgent == nil { - userAgent = "" - } - - params := DriverParameters{ - fmt.Sprint(accessKey), - fmt.Sprint(secretKey), - fmt.Sprint(bucket), - region, - encryptBool, - secureBool, - v4AuthBool, - chunkSize, - fmt.Sprint(rootDirectory), - storageClass, - fmt.Sprint(userAgent), - } - - return New(params) -} - -// New constructs a new Driver with the given AWS credentials, region, encryption flag, and -// bucketName -func New(params DriverParameters) (*Driver, error) { - auth, err := aws.GetAuth(params.AccessKey, params.SecretKey, "", time.Time{}) - if err != nil { - return nil, fmt.Errorf("unable to resolve aws credentials, please ensure that 'accesskey' and 'secretkey' are properly set or the credentials are available in $HOME/.aws/credentials: %v", err) - } - - if !params.Secure { - params.Region.S3Endpoint = strings.Replace(params.Region.S3Endpoint, "https", "http", 1) - } - - s3obj := s3.New(auth, params.Region) - - if params.UserAgent != "" { - s3obj.Client = &http.Client{ - Transport: transport.NewTransport(http.DefaultTransport, - transport.NewHeaderRequestModifier(http.Header{ - http.CanonicalHeaderKey("User-Agent"): []string{params.UserAgent}, - }), - ), - } - } - - if params.V4Auth { - s3obj.Signature = aws.V4Signature - } else { - if params.Region.Name == "eu-central-1" { - return nil, fmt.Errorf("The eu-central-1 region only works with v4 authentication") - } - } - - bucket := s3obj.Bucket(params.Bucket) - - // TODO Currently multipart uploads have no timestamps, so this would be unwise - // if you initiated a new s3driver while another one is running on the same bucket. - // multis, _, err := bucket.ListMulti("", "") - // if err != nil { - // return nil, err - // } - - // for _, multi := range multis { - // err := multi.Abort() - // //TODO appropriate to do this error checking? - // if err != nil { - // return nil, err - // } - // } - - d := &driver{ - S3: s3obj, - Bucket: bucket, - ChunkSize: params.ChunkSize, - Encrypt: params.Encrypt, - RootDirectory: params.RootDirectory, - StorageClass: params.StorageClass, - } - - return &Driver{ - baseEmbed: baseEmbed{ - Base: base.Base{ - StorageDriver: d, - }, - }, - }, nil -} - -// Implement the storagedriver.StorageDriver interface - -func (d *driver) Name() string { - return driverName -} - -// GetContent retrieves the content stored at "path" as a []byte. -func (d *driver) GetContent(ctx context.Context, path string) ([]byte, error) { - content, err := d.Bucket.Get(d.s3Path(path)) - if err != nil { - return nil, parseError(path, err) - } - return content, nil -} - -// PutContent stores the []byte content at a location designated by "path". -func (d *driver) PutContent(ctx context.Context, path string, contents []byte) error { - return parseError(path, d.Bucket.Put(d.s3Path(path), contents, d.getContentType(), getPermissions(), d.getOptions())) -} - -// Reader retrieves an io.ReadCloser for the content stored at "path" with a -// given byte offset. -func (d *driver) Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) { - headers := make(http.Header) - headers.Add("Range", "bytes="+strconv.FormatInt(offset, 10)+"-") - - resp, err := d.Bucket.GetResponseWithHeaders(d.s3Path(path), headers) - if err != nil { - if s3Err, ok := err.(*s3.Error); ok && s3Err.Code == "InvalidRange" { - return ioutil.NopCloser(bytes.NewReader(nil)), nil - } - - return nil, parseError(path, err) - } - return resp.Body, nil -} - -// Writer returns a FileWriter which will store the content written to it -// at the location designated by "path" after the call to Commit. -func (d *driver) Writer(ctx context.Context, path string, append bool) (storagedriver.FileWriter, error) { - key := d.s3Path(path) - if !append { - // TODO (brianbland): cancel other uploads at this path - multi, err := d.Bucket.InitMulti(key, d.getContentType(), getPermissions(), d.getOptions()) - if err != nil { - return nil, err - } - return d.newWriter(key, multi, nil), nil - } - multis, _, err := d.Bucket.ListMulti(key, "") - if err != nil { - return nil, parseError(path, err) - } - for _, multi := range multis { - if key != multi.Key { - continue - } - parts, err := multi.ListParts() - if err != nil { - return nil, parseError(path, err) - } - var multiSize int64 - for _, part := range parts { - multiSize += part.Size - } - return d.newWriter(key, multi, parts), nil - } - return nil, storagedriver.PathNotFoundError{Path: path} -} - -// Stat retrieves the FileInfo for the given path, including the current size -// in bytes and the creation time. -func (d *driver) Stat(ctx context.Context, path string) (storagedriver.FileInfo, error) { - listResponse, err := d.Bucket.List(d.s3Path(path), "", "", 1) - if err != nil { - return nil, err - } - - fi := storagedriver.FileInfoFields{ - Path: path, - } - - if len(listResponse.Contents) == 1 { - if listResponse.Contents[0].Key != d.s3Path(path) { - fi.IsDir = true - } else { - fi.IsDir = false - fi.Size = listResponse.Contents[0].Size - - timestamp, err := time.Parse(time.RFC3339Nano, listResponse.Contents[0].LastModified) - if err != nil { - return nil, err - } - fi.ModTime = timestamp - } - } else if len(listResponse.CommonPrefixes) == 1 { - fi.IsDir = true - } else { - return nil, storagedriver.PathNotFoundError{Path: path} - } - - return storagedriver.FileInfoInternal{FileInfoFields: fi}, nil -} - -// List returns a list of the objects that are direct descendants of the given path. -func (d *driver) List(ctx context.Context, opath string) ([]string, error) { - path := opath - if path != "/" && path[len(path)-1] != '/' { - path = path + "/" - } - - // This is to cover for the cases when the rootDirectory of the driver is either "" or "/". - // In those cases, there is no root prefix to replace and we must actually add a "/" to all - // results in order to keep them as valid paths as recognized by storagedriver.PathRegexp - prefix := "" - if d.s3Path("") == "" { - prefix = "/" - } - - listResponse, err := d.Bucket.List(d.s3Path(path), "/", "", listMax) - if err != nil { - return nil, parseError(opath, err) - } - - files := []string{} - directories := []string{} - - for { - for _, key := range listResponse.Contents { - files = append(files, strings.Replace(key.Key, d.s3Path(""), prefix, 1)) - } - - for _, commonPrefix := range listResponse.CommonPrefixes { - directories = append(directories, strings.Replace(commonPrefix[0:len(commonPrefix)-1], d.s3Path(""), prefix, 1)) - } - - if listResponse.IsTruncated { - listResponse, err = d.Bucket.List(d.s3Path(path), "/", listResponse.NextMarker, listMax) - if err != nil { - return nil, err - } - } else { - break - } - } - - if opath != "/" { - if len(files) == 0 && len(directories) == 0 { - // Treat empty response as missing directory, since we don't actually - // have directories in s3. - return nil, storagedriver.PathNotFoundError{Path: opath} - } - } - - return append(files, directories...), nil -} - -// Move moves an object stored at sourcePath to destPath, removing the original -// object. -func (d *driver) Move(ctx context.Context, sourcePath string, destPath string) error { - /* This is terrible, but aws doesn't have an actual move. */ - _, err := d.Bucket.PutCopy(d.s3Path(destPath), getPermissions(), - s3.CopyOptions{Options: d.getOptions(), ContentType: d.getContentType()}, d.Bucket.Name+"/"+d.s3Path(sourcePath)) - if err != nil { - return parseError(sourcePath, err) - } - - return d.Delete(ctx, sourcePath) -} - -// Delete recursively deletes all objects stored at "path" and its subpaths. -func (d *driver) Delete(ctx context.Context, path string) error { - s3Path := d.s3Path(path) - listResponse, err := d.Bucket.List(s3Path, "", "", listMax) - if err != nil || len(listResponse.Contents) == 0 { - return storagedriver.PathNotFoundError{Path: path} - } - - s3Objects := make([]s3.Object, listMax) - - for len(listResponse.Contents) > 0 { - numS3Objects := len(listResponse.Contents) - for index, key := range listResponse.Contents { - // Stop if we encounter a key that is not a subpath (so that deleting "/a" does not delete "/ab"). - if len(key.Key) > len(s3Path) && (key.Key)[len(s3Path)] != '/' { - numS3Objects = index - break - } - s3Objects[index].Key = key.Key - } - - err := d.Bucket.DelMulti(s3.Delete{Quiet: false, Objects: s3Objects[0:numS3Objects]}) - if err != nil { - return nil - } - - if numS3Objects < len(listResponse.Contents) { - return nil - } - - listResponse, err = d.Bucket.List(d.s3Path(path), "", "", listMax) - if err != nil { - return err - } - } - - return nil -} - -// URLFor returns a URL which may be used to retrieve the content stored at the given path. -// May return an UnsupportedMethodErr in certain StorageDriver implementations. -func (d *driver) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { - methodString := "GET" - method, ok := options["method"] - if ok { - methodString, ok = method.(string) - if !ok || (methodString != "GET" && methodString != "HEAD") { - return "", storagedriver.ErrUnsupportedMethod{} - } - } - - expiresTime := time.Now().Add(20 * time.Minute) - expires, ok := options["expiry"] - if ok { - et, ok := expires.(time.Time) - if ok { - expiresTime = et - } - } - - return d.Bucket.SignedURLWithMethod(methodString, d.s3Path(path), expiresTime, nil, nil), nil -} - -func (d *driver) s3Path(path string) string { - return strings.TrimLeft(strings.TrimRight(d.RootDirectory, "/")+path, "/") -} - -// S3BucketKey returns the s3 bucket key for the given storage driver path. -func (d *Driver) S3BucketKey(path string) string { - return d.StorageDriver.(*driver).s3Path(path) -} - -func parseError(path string, err error) error { - if s3Err, ok := err.(*s3.Error); ok && s3Err.Code == "NoSuchKey" { - return storagedriver.PathNotFoundError{Path: path} - } - - return err -} - -func hasCode(err error, code string) bool { - s3err, ok := err.(*aws.Error) - return ok && s3err.Code == code -} - -func (d *driver) getOptions() s3.Options { - return s3.Options{ - SSE: d.Encrypt, - StorageClass: d.StorageClass, - } -} - -func getPermissions() s3.ACL { - return s3.Private -} - -func (d *driver) getContentType() string { - return "application/octet-stream" -} - -// writer attempts to upload parts to S3 in a buffered fashion where the last -// part is at least as large as the chunksize, so the multipart upload could be -// cleanly resumed in the future. This is violated if Close is called after less -// than a full chunk is written. -type writer struct { - driver *driver - key string - multi *s3.Multi - parts []s3.Part - size int64 - readyPart []byte - pendingPart []byte - closed bool - committed bool - cancelled bool -} - -func (d *driver) newWriter(key string, multi *s3.Multi, parts []s3.Part) storagedriver.FileWriter { - var size int64 - for _, part := range parts { - size += part.Size - } - return &writer{ - driver: d, - key: key, - multi: multi, - parts: parts, - size: size, - } -} - -func (w *writer) Write(p []byte) (int, error) { - if w.closed { - return 0, fmt.Errorf("already closed") - } else if w.committed { - return 0, fmt.Errorf("already committed") - } else if w.cancelled { - return 0, fmt.Errorf("already cancelled") - } - - // If the last written part is smaller than minChunkSize, we need to make a - // new multipart upload :sadface: - if len(w.parts) > 0 && int(w.parts[len(w.parts)-1].Size) < minChunkSize { - err := w.multi.Complete(w.parts) - if err != nil { - w.multi.Abort() - return 0, err - } - - multi, err := w.driver.Bucket.InitMulti(w.key, w.driver.getContentType(), getPermissions(), w.driver.getOptions()) - if err != nil { - return 0, err - } - w.multi = multi - - // If the entire written file is smaller than minChunkSize, we need to make - // a new part from scratch :double sad face: - if w.size < minChunkSize { - contents, err := w.driver.Bucket.Get(w.key) - if err != nil { - return 0, err - } - w.parts = nil - w.readyPart = contents - } else { - // Otherwise we can use the old file as the new first part - _, part, err := multi.PutPartCopy(1, s3.CopyOptions{}, w.driver.Bucket.Name+"/"+w.key) - if err != nil { - return 0, err - } - w.parts = []s3.Part{part} - } - } - - var n int - - for len(p) > 0 { - // If no parts are ready to write, fill up the first part - if neededBytes := int(w.driver.ChunkSize) - len(w.readyPart); neededBytes > 0 { - if len(p) >= neededBytes { - w.readyPart = append(w.readyPart, p[:neededBytes]...) - n += neededBytes - p = p[neededBytes:] - } else { - w.readyPart = append(w.readyPart, p...) - n += len(p) - p = nil - } - } - - if neededBytes := int(w.driver.ChunkSize) - len(w.pendingPart); neededBytes > 0 { - if len(p) >= neededBytes { - w.pendingPart = append(w.pendingPart, p[:neededBytes]...) - n += neededBytes - p = p[neededBytes:] - err := w.flushPart() - if err != nil { - w.size += int64(n) - return n, err - } - } else { - w.pendingPart = append(w.pendingPart, p...) - n += len(p) - p = nil - } - } - } - w.size += int64(n) - return n, nil -} - -func (w *writer) Size() int64 { - return w.size -} - -func (w *writer) Close() error { - if w.closed { - return fmt.Errorf("already closed") - } - w.closed = true - return w.flushPart() -} - -func (w *writer) Cancel() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } - w.cancelled = true - err := w.multi.Abort() - return err -} - -func (w *writer) Commit() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } else if w.cancelled { - return fmt.Errorf("already cancelled") - } - err := w.flushPart() - if err != nil { - return err - } - w.committed = true - err = w.multi.Complete(w.parts) - if err != nil { - w.multi.Abort() - return err - } - return nil -} - -// flushPart flushes buffers to write a part to S3. -// Only called by Write (with both buffers full) and Close/Commit (always) -func (w *writer) flushPart() error { - if len(w.readyPart) == 0 && len(w.pendingPart) == 0 { - // nothing to write - return nil - } - if len(w.pendingPart) < int(w.driver.ChunkSize) { - // closing with a small pending part - // combine ready and pending to avoid writing a small part - w.readyPart = append(w.readyPart, w.pendingPart...) - w.pendingPart = nil - } - - part, err := w.multi.PutPart(len(w.parts)+1, bytes.NewReader(w.readyPart)) - if err != nil { - return err - } - w.parts = append(w.parts, part) - w.readyPart = w.pendingPart - w.pendingPart = nil - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/s3-goamz/s3_test.go b/vendor/github.com/docker/distribution/registry/storage/driver/s3-goamz/s3_test.go deleted file mode 100644 index 352ec3f5c..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/s3-goamz/s3_test.go +++ /dev/null @@ -1,201 +0,0 @@ -package s3 - -import ( - "io/ioutil" - "os" - "strconv" - "testing" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/testsuites" - "github.com/docker/goamz/aws" - "github.com/docker/goamz/s3" - - "gopkg.in/check.v1" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -var s3DriverConstructor func(rootDirectory string, storageClass s3.StorageClass) (*Driver, error) -var skipS3 func() string - -func init() { - accessKey := os.Getenv("AWS_ACCESS_KEY") - secretKey := os.Getenv("AWS_SECRET_KEY") - bucket := os.Getenv("S3_BUCKET") - encrypt := os.Getenv("S3_ENCRYPT") - secure := os.Getenv("S3_SECURE") - v4auth := os.Getenv("S3_USE_V4_AUTH") - region := os.Getenv("AWS_REGION") - root, err := ioutil.TempDir("", "driver-") - if err != nil { - panic(err) - } - defer os.Remove(root) - - s3DriverConstructor = func(rootDirectory string, storageClass s3.StorageClass) (*Driver, error) { - encryptBool := false - if encrypt != "" { - encryptBool, err = strconv.ParseBool(encrypt) - if err != nil { - return nil, err - } - } - - secureBool := true - if secure != "" { - secureBool, err = strconv.ParseBool(secure) - if err != nil { - return nil, err - } - } - - v4AuthBool := false - if v4auth != "" { - v4AuthBool, err = strconv.ParseBool(v4auth) - if err != nil { - return nil, err - } - } - - parameters := DriverParameters{ - accessKey, - secretKey, - bucket, - aws.GetRegion(region), - encryptBool, - secureBool, - v4AuthBool, - minChunkSize, - rootDirectory, - storageClass, - driverName + "-test", - } - - return New(parameters) - } - - // Skip S3 storage driver tests if environment variable parameters are not provided - skipS3 = func() string { - if accessKey == "" || secretKey == "" || region == "" || bucket == "" || encrypt == "" { - return "Must set AWS_ACCESS_KEY, AWS_SECRET_KEY, AWS_REGION, S3_BUCKET, and S3_ENCRYPT to run S3 tests" - } - return "" - } - - testsuites.RegisterSuite(func() (storagedriver.StorageDriver, error) { - return s3DriverConstructor(root, s3.StandardStorage) - }, skipS3) -} - -func TestEmptyRootList(t *testing.T) { - if skipS3() != "" { - t.Skip(skipS3()) - } - - validRoot, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(validRoot) - - rootedDriver, err := s3DriverConstructor(validRoot, s3.StandardStorage) - if err != nil { - t.Fatalf("unexpected error creating rooted driver: %v", err) - } - - emptyRootDriver, err := s3DriverConstructor("", s3.StandardStorage) - if err != nil { - t.Fatalf("unexpected error creating empty root driver: %v", err) - } - - slashRootDriver, err := s3DriverConstructor("/", s3.StandardStorage) - if err != nil { - t.Fatalf("unexpected error creating slash root driver: %v", err) - } - - filename := "/test" - contents := []byte("contents") - ctx := context.Background() - err = rootedDriver.PutContent(ctx, filename, contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - defer rootedDriver.Delete(ctx, filename) - - keys, err := emptyRootDriver.List(ctx, "/") - for _, path := range keys { - if !storagedriver.PathRegexp.MatchString(path) { - t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) - } - } - - keys, err = slashRootDriver.List(ctx, "/") - for _, path := range keys { - if !storagedriver.PathRegexp.MatchString(path) { - t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) - } - } -} - -func TestStorageClass(t *testing.T) { - if skipS3() != "" { - t.Skip(skipS3()) - } - - rootDir, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(rootDir) - - standardDriver, err := s3DriverConstructor(rootDir, s3.StandardStorage) - if err != nil { - t.Fatalf("unexpected error creating driver with standard storage: %v", err) - } - - rrDriver, err := s3DriverConstructor(rootDir, s3.ReducedRedundancy) - if err != nil { - t.Fatalf("unexpected error creating driver with reduced redundancy storage: %v", err) - } - - standardFilename := "/test-standard" - rrFilename := "/test-rr" - contents := []byte("contents") - ctx := context.Background() - - err = standardDriver.PutContent(ctx, standardFilename, contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - defer standardDriver.Delete(ctx, standardFilename) - - err = rrDriver.PutContent(ctx, rrFilename, contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - defer rrDriver.Delete(ctx, rrFilename) - - standardDriverUnwrapped := standardDriver.Base.StorageDriver.(*driver) - resp, err := standardDriverUnwrapped.Bucket.GetResponse(standardDriverUnwrapped.s3Path(standardFilename)) - if err != nil { - t.Fatalf("unexpected error retrieving standard storage file: %v", err) - } - defer resp.Body.Close() - // Amazon only populates this header value for non-standard storage classes - if storageClass := resp.Header.Get("x-amz-storage-class"); storageClass != "" { - t.Fatalf("unexpected storage class for standard file: %v", storageClass) - } - - rrDriverUnwrapped := rrDriver.Base.StorageDriver.(*driver) - resp, err = rrDriverUnwrapped.Bucket.GetResponse(rrDriverUnwrapped.s3Path(rrFilename)) - if err != nil { - t.Fatalf("unexpected error retrieving reduced-redundancy storage file: %v", err) - } - defer resp.Body.Close() - if storageClass := resp.Header.Get("x-amz-storage-class"); storageClass != string(s3.ReducedRedundancy) { - t.Fatalf("unexpected storage class for reduced-redundancy file: %v", storageClass) - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/storagedriver.go b/vendor/github.com/docker/distribution/registry/storage/driver/storagedriver.go deleted file mode 100644 index 548a17d84..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/storagedriver.go +++ /dev/null @@ -1,165 +0,0 @@ -package driver - -import ( - "fmt" - "io" - "regexp" - "strconv" - "strings" - - "github.com/docker/distribution/context" -) - -// Version is a string representing the storage driver version, of the form -// Major.Minor. -// The registry must accept storage drivers with equal major version and greater -// minor version, but may not be compatible with older storage driver versions. -type Version string - -// Major returns the major (primary) component of a version. -func (version Version) Major() uint { - majorPart := strings.Split(string(version), ".")[0] - major, _ := strconv.ParseUint(majorPart, 10, 0) - return uint(major) -} - -// Minor returns the minor (secondary) component of a version. -func (version Version) Minor() uint { - minorPart := strings.Split(string(version), ".")[1] - minor, _ := strconv.ParseUint(minorPart, 10, 0) - return uint(minor) -} - -// CurrentVersion is the current storage driver Version. -const CurrentVersion Version = "0.1" - -// StorageDriver defines methods that a Storage Driver must implement for a -// filesystem-like key/value object storage. Storage Drivers are automatically -// registered via an internal registration mechanism, and generally created -// via the StorageDriverFactory interface (https://godoc.org/github.com/docker/distribution/registry/storage/driver/factory). -// Please see the aforementioned factory package for example code showing how to get an instance -// of a StorageDriver -type StorageDriver interface { - // Name returns the human-readable "name" of the driver, useful in error - // messages and logging. By convention, this will just be the registration - // name, but drivers may provide other information here. - Name() string - - // GetContent retrieves the content stored at "path" as a []byte. - // This should primarily be used for small objects. - GetContent(ctx context.Context, path string) ([]byte, error) - - // PutContent stores the []byte content at a location designated by "path". - // This should primarily be used for small objects. - PutContent(ctx context.Context, path string, content []byte) error - - // Reader retrieves an io.ReadCloser for the content stored at "path" - // with a given byte offset. - // May be used to resume reading a stream by providing a nonzero offset. - Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) - - // Writer returns a FileWriter which will store the content written to it - // at the location designated by "path" after the call to Commit. - Writer(ctx context.Context, path string, append bool) (FileWriter, error) - - // Stat retrieves the FileInfo for the given path, including the current - // size in bytes and the creation time. - Stat(ctx context.Context, path string) (FileInfo, error) - - // List returns a list of the objects that are direct descendants of the - //given path. - List(ctx context.Context, path string) ([]string, error) - - // Move moves an object stored at sourcePath to destPath, removing the - // original object. - // Note: This may be no more efficient than a copy followed by a delete for - // many implementations. - Move(ctx context.Context, sourcePath string, destPath string) error - - // Delete recursively deletes all objects stored at "path" and its subpaths. - Delete(ctx context.Context, path string) error - - // URLFor returns a URL which may be used to retrieve the content stored at - // the given path, possibly using the given options. - // May return an ErrUnsupportedMethod in certain StorageDriver - // implementations. - URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) -} - -// FileWriter provides an abstraction for an opened writable file-like object in -// the storage backend. The FileWriter must flush all content written to it on -// the call to Close, but is only required to make its content readable on a -// call to Commit. -type FileWriter interface { - io.WriteCloser - - // Size returns the number of bytes written to this FileWriter. - Size() int64 - - // Cancel removes any written content from this FileWriter. - Cancel() error - - // Commit flushes all content written to this FileWriter and makes it - // available for future calls to StorageDriver.GetContent and - // StorageDriver.Reader. - Commit() error -} - -// PathRegexp is the regular expression which each file path must match. A -// file path is absolute, beginning with a slash and containing a positive -// number of path components separated by slashes, where each component is -// restricted to alphanumeric characters or a period, underscore, or -// hyphen. -var PathRegexp = regexp.MustCompile(`^(/[A-Za-z0-9._-]+)+$`) - -// ErrUnsupportedMethod may be returned in the case where a StorageDriver implementation does not support an optional method. -type ErrUnsupportedMethod struct { - DriverName string -} - -func (err ErrUnsupportedMethod) Error() string { - return fmt.Sprintf("%s: unsupported method", err.DriverName) -} - -// PathNotFoundError is returned when operating on a nonexistent path. -type PathNotFoundError struct { - Path string - DriverName string -} - -func (err PathNotFoundError) Error() string { - return fmt.Sprintf("%s: Path not found: %s", err.DriverName, err.Path) -} - -// InvalidPathError is returned when the provided path is malformed. -type InvalidPathError struct { - Path string - DriverName string -} - -func (err InvalidPathError) Error() string { - return fmt.Sprintf("%s: invalid path: %s", err.DriverName, err.Path) -} - -// InvalidOffsetError is returned when attempting to read or write from an -// invalid offset. -type InvalidOffsetError struct { - Path string - Offset int64 - DriverName string -} - -func (err InvalidOffsetError) Error() string { - return fmt.Sprintf("%s: invalid offset: %d for path: %s", err.DriverName, err.Offset, err.Path) -} - -// Error is a catch-all error type which captures an error string and -// the driver type on which it occurred. -type Error struct { - DriverName string - Enclosed error -} - -func (err Error) Error() string { - return fmt.Sprintf("%s: %s", err.DriverName, err.Enclosed) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/swift/swift.go b/vendor/github.com/docker/distribution/registry/storage/driver/swift/swift.go deleted file mode 100644 index 4b7aa4e9f..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/swift/swift.go +++ /dev/null @@ -1,915 +0,0 @@ -// Package swift provides a storagedriver.StorageDriver implementation to -// store blobs in Openstack Swift object storage. -// -// This package leverages the ncw/swift client library for interfacing with -// Swift. -// -// It supports both TempAuth authentication and Keystone authentication -// (up to version 3). -// -// As Swift has a limit on the size of a single uploaded object (by default -// this is 5GB), the driver makes use of the Swift Large Object Support -// (http://docs.openstack.org/developer/swift/overview_large_objects.html). -// Only one container is used for both manifests and data objects. Manifests -// are stored in the 'files' pseudo directory, data objects are stored under -// 'segments'. -package swift - -import ( - "bufio" - "bytes" - "crypto/rand" - "crypto/sha1" - "crypto/tls" - "encoding/hex" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "strings" - "time" - - "github.com/mitchellh/mapstructure" - "github.com/ncw/swift" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/base" - "github.com/docker/distribution/registry/storage/driver/factory" - "github.com/docker/distribution/version" -) - -const driverName = "swift" - -// defaultChunkSize defines the default size of a segment -const defaultChunkSize = 20 * 1024 * 1024 - -// minChunkSize defines the minimum size of a segment -const minChunkSize = 1 << 20 - -// contentType defines the Content-Type header associated with stored segments -const contentType = "application/octet-stream" - -// readAfterWriteTimeout defines the time we wait before an object appears after having been uploaded -var readAfterWriteTimeout = 15 * time.Second - -// readAfterWriteWait defines the time to sleep between two retries -var readAfterWriteWait = 200 * time.Millisecond - -// Parameters A struct that encapsulates all of the driver parameters after all values have been set -type Parameters struct { - Username string - Password string - AuthURL string - Tenant string - TenantID string - Domain string - DomainID string - TenantDomain string - TenantDomainID string - TrustID string - Region string - AuthVersion int - Container string - Prefix string - EndpointType string - InsecureSkipVerify bool - ChunkSize int - SecretKey string - AccessKey string - TempURLContainerKey bool - TempURLMethods []string -} - -// swiftInfo maps the JSON structure returned by Swift /info endpoint -type swiftInfo struct { - Swift struct { - Version string `mapstructure:"version"` - } - Tempurl struct { - Methods []string `mapstructure:"methods"` - } - BulkDelete struct { - MaxDeletesPerRequest int `mapstructure:"max_deletes_per_request"` - } `mapstructure:"bulk_delete"` -} - -func init() { - factory.Register(driverName, &swiftDriverFactory{}) -} - -// swiftDriverFactory implements the factory.StorageDriverFactory interface -type swiftDriverFactory struct{} - -func (factory *swiftDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - return FromParameters(parameters) -} - -type driver struct { - Conn *swift.Connection - Container string - Prefix string - BulkDeleteSupport bool - BulkDeleteMaxDeletes int - ChunkSize int - SecretKey string - AccessKey string - TempURLContainerKey bool - TempURLMethods []string -} - -type baseEmbed struct { - base.Base -} - -// Driver is a storagedriver.StorageDriver implementation backed by Openstack Swift -// Objects are stored at absolute keys in the provided container. -type Driver struct { - baseEmbed -} - -// FromParameters constructs a new Driver with a given parameters map -// Required parameters: -// - username -// - password -// - authurl -// - container -func FromParameters(parameters map[string]interface{}) (*Driver, error) { - params := Parameters{ - ChunkSize: defaultChunkSize, - InsecureSkipVerify: false, - } - - if err := mapstructure.Decode(parameters, ¶ms); err != nil { - return nil, err - } - - if params.Username == "" { - return nil, fmt.Errorf("No username parameter provided") - } - - if params.Password == "" { - return nil, fmt.Errorf("No password parameter provided") - } - - if params.AuthURL == "" { - return nil, fmt.Errorf("No authurl parameter provided") - } - - if params.Container == "" { - return nil, fmt.Errorf("No container parameter provided") - } - - if params.ChunkSize < minChunkSize { - return nil, fmt.Errorf("The chunksize %#v parameter should be a number that is larger than or equal to %d", params.ChunkSize, minChunkSize) - } - - return New(params) -} - -// New constructs a new Driver with the given Openstack Swift credentials and container name -func New(params Parameters) (*Driver, error) { - transport := &http.Transport{ - Proxy: http.ProxyFromEnvironment, - MaxIdleConnsPerHost: 2048, - TLSClientConfig: &tls.Config{InsecureSkipVerify: params.InsecureSkipVerify}, - } - - ct := &swift.Connection{ - UserName: params.Username, - ApiKey: params.Password, - AuthUrl: params.AuthURL, - Region: params.Region, - AuthVersion: params.AuthVersion, - UserAgent: "distribution/" + version.Version, - Tenant: params.Tenant, - TenantId: params.TenantID, - Domain: params.Domain, - DomainId: params.DomainID, - TenantDomain: params.TenantDomain, - TenantDomainId: params.TenantDomainID, - TrustId: params.TrustID, - EndpointType: swift.EndpointType(params.EndpointType), - Transport: transport, - ConnectTimeout: 60 * time.Second, - Timeout: 15 * 60 * time.Second, - } - err := ct.Authenticate() - if err != nil { - return nil, fmt.Errorf("Swift authentication failed: %s", err) - } - - if _, _, err := ct.Container(params.Container); err == swift.ContainerNotFound { - if err := ct.ContainerCreate(params.Container, nil); err != nil { - return nil, fmt.Errorf("Failed to create container %s (%s)", params.Container, err) - } - } else if err != nil { - return nil, fmt.Errorf("Failed to retrieve info about container %s (%s)", params.Container, err) - } - - d := &driver{ - Conn: ct, - Container: params.Container, - Prefix: params.Prefix, - ChunkSize: params.ChunkSize, - TempURLMethods: make([]string, 0), - AccessKey: params.AccessKey, - } - - info := swiftInfo{} - if config, err := d.Conn.QueryInfo(); err == nil { - _, d.BulkDeleteSupport = config["bulk_delete"] - - if err := mapstructure.Decode(config, &info); err == nil { - d.TempURLContainerKey = info.Swift.Version >= "2.3.0" - d.TempURLMethods = info.Tempurl.Methods - if d.BulkDeleteSupport { - d.BulkDeleteMaxDeletes = info.BulkDelete.MaxDeletesPerRequest - } - } - } else { - d.TempURLContainerKey = params.TempURLContainerKey - d.TempURLMethods = params.TempURLMethods - } - - if len(d.TempURLMethods) > 0 { - secretKey := params.SecretKey - if secretKey == "" { - secretKey, _ = generateSecret() - } - - // Since Swift 2.2.2, we can now set secret keys on containers - // in addition to the account secret keys. Use them in preference. - if d.TempURLContainerKey { - _, containerHeaders, err := d.Conn.Container(d.Container) - if err != nil { - return nil, fmt.Errorf("Failed to fetch container info %s (%s)", d.Container, err) - } - - d.SecretKey = containerHeaders["X-Container-Meta-Temp-Url-Key"] - if d.SecretKey == "" || (params.SecretKey != "" && d.SecretKey != params.SecretKey) { - m := swift.Metadata{} - m["temp-url-key"] = secretKey - if d.Conn.ContainerUpdate(d.Container, m.ContainerHeaders()); err == nil { - d.SecretKey = secretKey - } - } - } else { - // Use the account secret key - _, accountHeaders, err := d.Conn.Account() - if err != nil { - return nil, fmt.Errorf("Failed to fetch account info (%s)", err) - } - - d.SecretKey = accountHeaders["X-Account-Meta-Temp-Url-Key"] - if d.SecretKey == "" || (params.SecretKey != "" && d.SecretKey != params.SecretKey) { - m := swift.Metadata{} - m["temp-url-key"] = secretKey - if err := d.Conn.AccountUpdate(m.AccountHeaders()); err == nil { - d.SecretKey = secretKey - } - } - } - } - - return &Driver{ - baseEmbed: baseEmbed{ - Base: base.Base{ - StorageDriver: d, - }, - }, - }, nil -} - -// Implement the storagedriver.StorageDriver interface - -func (d *driver) Name() string { - return driverName -} - -// GetContent retrieves the content stored at "path" as a []byte. -func (d *driver) GetContent(ctx context.Context, path string) ([]byte, error) { - content, err := d.Conn.ObjectGetBytes(d.Container, d.swiftPath(path)) - if err == swift.ObjectNotFound { - return nil, storagedriver.PathNotFoundError{Path: path} - } - return content, err -} - -// PutContent stores the []byte content at a location designated by "path". -func (d *driver) PutContent(ctx context.Context, path string, contents []byte) error { - err := d.Conn.ObjectPutBytes(d.Container, d.swiftPath(path), contents, contentType) - if err == swift.ObjectNotFound { - return storagedriver.PathNotFoundError{Path: path} - } - return err -} - -// Reader retrieves an io.ReadCloser for the content stored at "path" with a -// given byte offset. -func (d *driver) Reader(ctx context.Context, path string, offset int64) (io.ReadCloser, error) { - headers := make(swift.Headers) - headers["Range"] = "bytes=" + strconv.FormatInt(offset, 10) + "-" - - waitingTime := readAfterWriteWait - endTime := time.Now().Add(readAfterWriteTimeout) - - for { - file, headers, err := d.Conn.ObjectOpen(d.Container, d.swiftPath(path), false, headers) - if err != nil { - if err == swift.ObjectNotFound { - return nil, storagedriver.PathNotFoundError{Path: path} - } - if swiftErr, ok := err.(*swift.Error); ok && swiftErr.StatusCode == http.StatusRequestedRangeNotSatisfiable { - return ioutil.NopCloser(bytes.NewReader(nil)), nil - } - return file, err - } - - //if this is a DLO and it is clear that segments are still missing, - //wait until they show up - _, isDLO := headers["X-Object-Manifest"] - size, err := file.Length() - if err != nil { - return file, err - } - if isDLO && size == 0 { - if time.Now().Add(waitingTime).After(endTime) { - return nil, fmt.Errorf("Timeout expired while waiting for segments of %s to show up", path) - } - time.Sleep(waitingTime) - waitingTime *= 2 - continue - } - - //if not, then this reader will be fine - return file, nil - } -} - -// Writer returns a FileWriter which will store the content written to it -// at the location designated by "path" after the call to Commit. -func (d *driver) Writer(ctx context.Context, path string, append bool) (storagedriver.FileWriter, error) { - var ( - segments []swift.Object - segmentsPath string - err error - ) - - if !append { - segmentsPath, err = d.swiftSegmentPath(path) - if err != nil { - return nil, err - } - } else { - info, headers, err := d.Conn.Object(d.Container, d.swiftPath(path)) - if err == swift.ObjectNotFound { - return nil, storagedriver.PathNotFoundError{Path: path} - } else if err != nil { - return nil, err - } - manifest, ok := headers["X-Object-Manifest"] - if !ok { - segmentsPath, err = d.swiftSegmentPath(path) - if err != nil { - return nil, err - } - if err := d.Conn.ObjectMove(d.Container, d.swiftPath(path), d.Container, getSegmentPath(segmentsPath, len(segments))); err != nil { - return nil, err - } - segments = []swift.Object{info} - } else { - _, segmentsPath = parseManifest(manifest) - if segments, err = d.getAllSegments(segmentsPath); err != nil { - return nil, err - } - } - } - - return d.newWriter(path, segmentsPath, segments), nil -} - -// Stat retrieves the FileInfo for the given path, including the current size -// in bytes and the creation time. -func (d *driver) Stat(ctx context.Context, path string) (storagedriver.FileInfo, error) { - swiftPath := d.swiftPath(path) - opts := &swift.ObjectsOpts{ - Prefix: swiftPath, - Delimiter: '/', - } - - objects, err := d.Conn.ObjectsAll(d.Container, opts) - if err != nil { - if err == swift.ContainerNotFound { - return nil, storagedriver.PathNotFoundError{Path: path} - } - return nil, err - } - - fi := storagedriver.FileInfoFields{ - Path: strings.TrimPrefix(strings.TrimSuffix(swiftPath, "/"), d.swiftPath("/")), - } - - for _, obj := range objects { - if obj.PseudoDirectory && obj.Name == swiftPath+"/" { - fi.IsDir = true - return storagedriver.FileInfoInternal{FileInfoFields: fi}, nil - } else if obj.Name == swiftPath { - // The file exists. But on Swift 1.12, the 'bytes' field is always 0 so - // we need to do a separate HEAD request. - break - } - } - - //Don't trust an empty `objects` slice. A container listing can be - //outdated. For files, we can make a HEAD request on the object which - //reports existence (at least) much more reliably. - waitingTime := readAfterWriteWait - endTime := time.Now().Add(readAfterWriteTimeout) - - for { - info, headers, err := d.Conn.Object(d.Container, swiftPath) - if err != nil { - if err == swift.ObjectNotFound { - return nil, storagedriver.PathNotFoundError{Path: path} - } - return nil, err - } - - //if this is a DLO and it is clear that segments are still missing, - //wait until they show up - _, isDLO := headers["X-Object-Manifest"] - if isDLO && info.Bytes == 0 { - if time.Now().Add(waitingTime).After(endTime) { - return nil, fmt.Errorf("Timeout expired while waiting for segments of %s to show up", path) - } - time.Sleep(waitingTime) - waitingTime *= 2 - continue - } - - //otherwise, accept the result - fi.IsDir = false - fi.Size = info.Bytes - fi.ModTime = info.LastModified - return storagedriver.FileInfoInternal{FileInfoFields: fi}, nil - } -} - -// List returns a list of the objects that are direct descendants of the given path. -func (d *driver) List(ctx context.Context, path string) ([]string, error) { - var files []string - - prefix := d.swiftPath(path) - if prefix != "" { - prefix += "/" - } - - opts := &swift.ObjectsOpts{ - Prefix: prefix, - Delimiter: '/', - } - - objects, err := d.Conn.ObjectsAll(d.Container, opts) - for _, obj := range objects { - files = append(files, strings.TrimPrefix(strings.TrimSuffix(obj.Name, "/"), d.swiftPath("/"))) - } - - if err == swift.ContainerNotFound || (len(objects) == 0 && path != "/") { - return files, storagedriver.PathNotFoundError{Path: path} - } - return files, err -} - -// Move moves an object stored at sourcePath to destPath, removing the original -// object. -func (d *driver) Move(ctx context.Context, sourcePath string, destPath string) error { - _, headers, err := d.Conn.Object(d.Container, d.swiftPath(sourcePath)) - if err == nil { - if manifest, ok := headers["X-Object-Manifest"]; ok { - if err = d.createManifest(destPath, manifest); err != nil { - return err - } - err = d.Conn.ObjectDelete(d.Container, d.swiftPath(sourcePath)) - } else { - err = d.Conn.ObjectMove(d.Container, d.swiftPath(sourcePath), d.Container, d.swiftPath(destPath)) - } - } - if err == swift.ObjectNotFound { - return storagedriver.PathNotFoundError{Path: sourcePath} - } - return err -} - -// Delete recursively deletes all objects stored at "path" and its subpaths. -func (d *driver) Delete(ctx context.Context, path string) error { - opts := swift.ObjectsOpts{ - Prefix: d.swiftPath(path) + "/", - } - - objects, err := d.Conn.ObjectsAll(d.Container, &opts) - if err != nil { - if err == swift.ContainerNotFound { - return storagedriver.PathNotFoundError{Path: path} - } - return err - } - - for _, obj := range objects { - if obj.PseudoDirectory { - continue - } - if _, headers, err := d.Conn.Object(d.Container, obj.Name); err == nil { - manifest, ok := headers["X-Object-Manifest"] - if ok { - _, prefix := parseManifest(manifest) - segments, err := d.getAllSegments(prefix) - if err != nil { - return err - } - objects = append(objects, segments...) - } - } else { - if err == swift.ObjectNotFound { - return storagedriver.PathNotFoundError{Path: obj.Name} - } - return err - } - } - - if d.BulkDeleteSupport && len(objects) > 0 && d.BulkDeleteMaxDeletes > 0 { - filenames := make([]string, len(objects)) - for i, obj := range objects { - filenames[i] = obj.Name - } - - chunks, err := chunkFilenames(filenames, d.BulkDeleteMaxDeletes) - if err != nil { - return err - } - for _, chunk := range chunks { - _, err := d.Conn.BulkDelete(d.Container, chunk) - // Don't fail on ObjectNotFound because eventual consistency - // makes this situation normal. - if err != nil && err != swift.Forbidden && err != swift.ObjectNotFound { - if err == swift.ContainerNotFound { - return storagedriver.PathNotFoundError{Path: path} - } - return err - } - } - } else { - for _, obj := range objects { - if err := d.Conn.ObjectDelete(d.Container, obj.Name); err != nil { - if err == swift.ObjectNotFound { - return storagedriver.PathNotFoundError{Path: obj.Name} - } - return err - } - } - } - - _, _, err = d.Conn.Object(d.Container, d.swiftPath(path)) - if err == nil { - if err := d.Conn.ObjectDelete(d.Container, d.swiftPath(path)); err != nil { - if err == swift.ObjectNotFound { - return storagedriver.PathNotFoundError{Path: path} - } - return err - } - } else if err == swift.ObjectNotFound { - if len(objects) == 0 { - return storagedriver.PathNotFoundError{Path: path} - } - } else { - return err - } - return nil -} - -// URLFor returns a URL which may be used to retrieve the content stored at the given path. -func (d *driver) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) { - if d.SecretKey == "" { - return "", storagedriver.ErrUnsupportedMethod{} - } - - methodString := "GET" - method, ok := options["method"] - if ok { - if methodString, ok = method.(string); !ok { - return "", storagedriver.ErrUnsupportedMethod{} - } - } - - if methodString == "HEAD" { - // A "HEAD" request on a temporary URL is allowed if the - // signature was generated with "GET", "POST" or "PUT" - methodString = "GET" - } - - supported := false - for _, method := range d.TempURLMethods { - if method == methodString { - supported = true - break - } - } - - if !supported { - return "", storagedriver.ErrUnsupportedMethod{} - } - - expiresTime := time.Now().Add(20 * time.Minute) - expires, ok := options["expiry"] - if ok { - et, ok := expires.(time.Time) - if ok { - expiresTime = et - } - } - - tempURL := d.Conn.ObjectTempUrl(d.Container, d.swiftPath(path), d.SecretKey, methodString, expiresTime) - - if d.AccessKey != "" { - // On HP Cloud, the signature must be in the form of tenant_id:access_key:signature - url, _ := url.Parse(tempURL) - query := url.Query() - query.Set("temp_url_sig", fmt.Sprintf("%s:%s:%s", d.Conn.TenantId, d.AccessKey, query.Get("temp_url_sig"))) - url.RawQuery = query.Encode() - tempURL = url.String() - } - - return tempURL, nil -} - -func (d *driver) swiftPath(path string) string { - return strings.TrimLeft(strings.TrimRight(d.Prefix+"/files"+path, "/"), "/") -} - -func (d *driver) swiftSegmentPath(path string) (string, error) { - checksum := sha1.New() - random := make([]byte, 32) - if _, err := rand.Read(random); err != nil { - return "", err - } - path = hex.EncodeToString(checksum.Sum(append([]byte(path), random...))) - return strings.TrimLeft(strings.TrimRight(d.Prefix+"/segments/"+path[0:3]+"/"+path[3:], "/"), "/"), nil -} - -func (d *driver) getAllSegments(path string) ([]swift.Object, error) { - //a simple container listing works 99.9% of the time - segments, err := d.Conn.ObjectsAll(d.Container, &swift.ObjectsOpts{Prefix: path}) - if err != nil { - if err == swift.ContainerNotFound { - return nil, storagedriver.PathNotFoundError{Path: path} - } - return nil, err - } - - //build a lookup table by object name - hasObjectName := make(map[string]struct{}) - for _, segment := range segments { - hasObjectName[segment.Name] = struct{}{} - } - - //The container listing might be outdated (i.e. not contain all existing - //segment objects yet) because of temporary inconsistency (Swift is only - //eventually consistent!). Check its completeness. - segmentNumber := 0 - for { - segmentNumber++ - segmentPath := getSegmentPath(path, segmentNumber) - - if _, seen := hasObjectName[segmentPath]; seen { - continue - } - - //This segment is missing in the container listing. Use a more reliable - //request to check its existence. (HEAD requests on segments are - //guaranteed to return the correct metadata, except for the pathological - //case of an outage of large parts of the Swift cluster or its network, - //since every segment is only written once.) - segment, _, err := d.Conn.Object(d.Container, segmentPath) - switch err { - case nil: - //found new segment -> keep going, more might be missing - segments = append(segments, segment) - continue - case swift.ObjectNotFound: - //This segment is missing. Since we upload segments sequentially, - //there won't be any more segments after it. - return segments, nil - default: - return nil, err //unexpected error - } - } -} - -func (d *driver) createManifest(path string, segments string) error { - headers := make(swift.Headers) - headers["X-Object-Manifest"] = segments - manifest, err := d.Conn.ObjectCreate(d.Container, d.swiftPath(path), false, "", contentType, headers) - if err != nil { - if err == swift.ObjectNotFound { - return storagedriver.PathNotFoundError{Path: path} - } - return err - } - if err := manifest.Close(); err != nil { - if err == swift.ObjectNotFound { - return storagedriver.PathNotFoundError{Path: path} - } - return err - } - return nil -} - -func chunkFilenames(slice []string, maxSize int) (chunks [][]string, err error) { - if maxSize > 0 { - for offset := 0; offset < len(slice); offset += maxSize { - chunkSize := maxSize - if offset+chunkSize > len(slice) { - chunkSize = len(slice) - offset - } - chunks = append(chunks, slice[offset:offset+chunkSize]) - } - } else { - return nil, fmt.Errorf("Max chunk size must be > 0") - } - return -} - -func parseManifest(manifest string) (container string, prefix string) { - components := strings.SplitN(manifest, "/", 2) - container = components[0] - if len(components) > 1 { - prefix = components[1] - } - return container, prefix -} - -func generateSecret() (string, error) { - var secretBytes [32]byte - if _, err := rand.Read(secretBytes[:]); err != nil { - return "", fmt.Errorf("could not generate random bytes for Swift secret key: %v", err) - } - return hex.EncodeToString(secretBytes[:]), nil -} - -func getSegmentPath(segmentsPath string, partNumber int) string { - return fmt.Sprintf("%s/%016d", segmentsPath, partNumber) -} - -type writer struct { - driver *driver - path string - segmentsPath string - size int64 - bw *bufio.Writer - closed bool - committed bool - cancelled bool -} - -func (d *driver) newWriter(path, segmentsPath string, segments []swift.Object) storagedriver.FileWriter { - var size int64 - for _, segment := range segments { - size += segment.Bytes - } - return &writer{ - driver: d, - path: path, - segmentsPath: segmentsPath, - size: size, - bw: bufio.NewWriterSize(&segmentWriter{ - conn: d.Conn, - container: d.Container, - segmentsPath: segmentsPath, - segmentNumber: len(segments) + 1, - maxChunkSize: d.ChunkSize, - }, d.ChunkSize), - } -} - -func (w *writer) Write(p []byte) (int, error) { - if w.closed { - return 0, fmt.Errorf("already closed") - } else if w.committed { - return 0, fmt.Errorf("already committed") - } else if w.cancelled { - return 0, fmt.Errorf("already cancelled") - } - - n, err := w.bw.Write(p) - w.size += int64(n) - return n, err -} - -func (w *writer) Size() int64 { - return w.size -} - -func (w *writer) Close() error { - if w.closed { - return fmt.Errorf("already closed") - } - - if err := w.bw.Flush(); err != nil { - return err - } - - if !w.committed && !w.cancelled { - if err := w.driver.createManifest(w.path, w.driver.Container+"/"+w.segmentsPath); err != nil { - return err - } - if err := w.waitForSegmentsToShowUp(); err != nil { - return err - } - } - w.closed = true - - return nil -} - -func (w *writer) Cancel() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } - w.cancelled = true - return w.driver.Delete(context.Background(), w.path) -} - -func (w *writer) Commit() error { - if w.closed { - return fmt.Errorf("already closed") - } else if w.committed { - return fmt.Errorf("already committed") - } else if w.cancelled { - return fmt.Errorf("already cancelled") - } - - if err := w.bw.Flush(); err != nil { - return err - } - - if err := w.driver.createManifest(w.path, w.driver.Container+"/"+w.segmentsPath); err != nil { - return err - } - - w.committed = true - return w.waitForSegmentsToShowUp() -} - -func (w *writer) waitForSegmentsToShowUp() error { - var err error - waitingTime := readAfterWriteWait - endTime := time.Now().Add(readAfterWriteTimeout) - - for { - var info swift.Object - if info, _, err = w.driver.Conn.Object(w.driver.Container, w.driver.swiftPath(w.path)); err == nil { - if info.Bytes == w.size { - break - } - err = fmt.Errorf("Timeout expired while waiting for segments of %s to show up", w.path) - } - if time.Now().Add(waitingTime).After(endTime) { - break - } - time.Sleep(waitingTime) - waitingTime *= 2 - } - - return err -} - -type segmentWriter struct { - conn *swift.Connection - container string - segmentsPath string - segmentNumber int - maxChunkSize int -} - -func (sw *segmentWriter) Write(p []byte) (int, error) { - n := 0 - for offset := 0; offset < len(p); offset += sw.maxChunkSize { - chunkSize := sw.maxChunkSize - if offset+chunkSize > len(p) { - chunkSize = len(p) - offset - } - _, err := sw.conn.ObjectPut(sw.container, getSegmentPath(sw.segmentsPath, sw.segmentNumber), bytes.NewReader(p[offset:offset+chunkSize]), false, "", contentType, nil) - if err != nil { - return n, err - } - - sw.segmentNumber++ - n += chunkSize - } - - return n, nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/swift/swift_test.go b/vendor/github.com/docker/distribution/registry/storage/driver/swift/swift_test.go deleted file mode 100644 index dcd5e4ff8..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/swift/swift_test.go +++ /dev/null @@ -1,245 +0,0 @@ -package swift - -import ( - "io/ioutil" - "os" - "reflect" - "strconv" - "strings" - "testing" - - "github.com/ncw/swift/swifttest" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/testsuites" - - "gopkg.in/check.v1" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -var swiftDriverConstructor func(prefix string) (*Driver, error) - -func init() { - var ( - username string - password string - authURL string - tenant string - tenantID string - domain string - domainID string - tenantDomain string - tenantDomainID string - trustID string - container string - region string - AuthVersion int - endpointType string - insecureSkipVerify bool - secretKey string - accessKey string - containerKey bool - tempURLMethods []string - - swiftServer *swifttest.SwiftServer - err error - ) - username = os.Getenv("SWIFT_USERNAME") - password = os.Getenv("SWIFT_PASSWORD") - authURL = os.Getenv("SWIFT_AUTH_URL") - tenant = os.Getenv("SWIFT_TENANT_NAME") - tenantID = os.Getenv("SWIFT_TENANT_ID") - domain = os.Getenv("SWIFT_DOMAIN_NAME") - domainID = os.Getenv("SWIFT_DOMAIN_ID") - tenantDomain = os.Getenv("SWIFT_DOMAIN_NAME") - tenantDomainID = os.Getenv("SWIFT_DOMAIN_ID") - trustID = os.Getenv("SWIFT_TRUST_ID") - container = os.Getenv("SWIFT_CONTAINER_NAME") - region = os.Getenv("SWIFT_REGION_NAME") - AuthVersion, _ = strconv.Atoi(os.Getenv("SWIFT_AUTH_VERSION")) - endpointType = os.Getenv("SWIFT_ENDPOINT_TYPE") - insecureSkipVerify, _ = strconv.ParseBool(os.Getenv("SWIFT_INSECURESKIPVERIFY")) - secretKey = os.Getenv("SWIFT_SECRET_KEY") - accessKey = os.Getenv("SWIFT_ACCESS_KEY") - containerKey, _ = strconv.ParseBool(os.Getenv("SWIFT_TEMPURL_CONTAINERKEY")) - tempURLMethods = strings.Split(os.Getenv("SWIFT_TEMPURL_METHODS"), ",") - - if username == "" || password == "" || authURL == "" || container == "" { - if swiftServer, err = swifttest.NewSwiftServer("localhost"); err != nil { - panic(err) - } - username = "swifttest" - password = "swifttest" - authURL = swiftServer.AuthURL - container = "test" - } - - prefix, err := ioutil.TempDir("", "driver-") - if err != nil { - panic(err) - } - defer os.Remove(prefix) - - swiftDriverConstructor = func(root string) (*Driver, error) { - parameters := Parameters{ - username, - password, - authURL, - tenant, - tenantID, - domain, - domainID, - tenantDomain, - tenantDomainID, - trustID, - region, - AuthVersion, - container, - root, - endpointType, - insecureSkipVerify, - defaultChunkSize, - secretKey, - accessKey, - containerKey, - tempURLMethods, - } - - return New(parameters) - } - - driverConstructor := func() (storagedriver.StorageDriver, error) { - return swiftDriverConstructor(prefix) - } - - testsuites.RegisterSuite(driverConstructor, testsuites.NeverSkip) -} - -func TestEmptyRootList(t *testing.T) { - validRoot, err := ioutil.TempDir("", "driver-") - if err != nil { - t.Fatalf("unexpected error creating temporary directory: %v", err) - } - defer os.Remove(validRoot) - - rootedDriver, err := swiftDriverConstructor(validRoot) - if err != nil { - t.Fatalf("unexpected error creating rooted driver: %v", err) - } - - emptyRootDriver, err := swiftDriverConstructor("") - if err != nil { - t.Fatalf("unexpected error creating empty root driver: %v", err) - } - - slashRootDriver, err := swiftDriverConstructor("/") - if err != nil { - t.Fatalf("unexpected error creating slash root driver: %v", err) - } - - filename := "/test" - contents := []byte("contents") - ctx := context.Background() - err = rootedDriver.PutContent(ctx, filename, contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - - keys, err := emptyRootDriver.List(ctx, "/") - for _, path := range keys { - if !storagedriver.PathRegexp.MatchString(path) { - t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) - } - } - - keys, err = slashRootDriver.List(ctx, "/") - for _, path := range keys { - if !storagedriver.PathRegexp.MatchString(path) { - t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) - } - } - - // Create an object with a path nested under the existing object - err = rootedDriver.PutContent(ctx, filename+"/file1", contents) - if err != nil { - t.Fatalf("unexpected error creating content: %v", err) - } - - err = rootedDriver.Delete(ctx, filename) - if err != nil { - t.Fatalf("failed to delete: %v", err) - } - - keys, err = rootedDriver.List(ctx, "/") - if err != nil { - t.Fatalf("failed to list objects after deletion: %v", err) - } - - if len(keys) != 0 { - t.Fatal("delete did not remove nested objects") - } -} - -func TestFilenameChunking(t *testing.T) { - // Test valid input and sizes - input := []string{"a", "b", "c", "d", "e"} - expecteds := [][][]string{ - { - {"a"}, - {"b"}, - {"c"}, - {"d"}, - {"e"}, - }, - { - {"a", "b"}, - {"c", "d"}, - {"e"}, - }, - { - {"a", "b", "c"}, - {"d", "e"}, - }, - { - {"a", "b", "c", "d"}, - {"e"}, - }, - { - {"a", "b", "c", "d", "e"}, - }, - { - {"a", "b", "c", "d", "e"}, - }, - } - for i, expected := range expecteds { - actual, err := chunkFilenames(input, i+1) - if !reflect.DeepEqual(actual, expected) { - t.Fatalf("chunk %v didn't match expected value %v", actual, expected) - } - if err != nil { - t.Fatalf("unexpected error chunking filenames: %v", err) - } - } - - // Test nil input - actual, err := chunkFilenames(nil, 5) - if len(actual) != 0 { - t.Fatal("chunks were returned when passed nil") - } - if err != nil { - t.Fatalf("unexpected error chunking filenames: %v", err) - } - - // Test 0 and < 0 sizes - actual, err = chunkFilenames(nil, 0) - if err == nil { - t.Fatal("expected error for size = 0") - } - actual, err = chunkFilenames(nil, -1) - if err == nil { - t.Fatal("expected error for size = -1") - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/testdriver/testdriver.go b/vendor/github.com/docker/distribution/registry/storage/driver/testdriver/testdriver.go deleted file mode 100644 index 988e5d33b..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/testdriver/testdriver.go +++ /dev/null @@ -1,71 +0,0 @@ -package testdriver - -import ( - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/factory" - "github.com/docker/distribution/registry/storage/driver/inmemory" -) - -const driverName = "testdriver" - -func init() { - factory.Register(driverName, &testDriverFactory{}) -} - -// testDriverFactory implements the factory.StorageDriverFactory interface. -type testDriverFactory struct{} - -func (factory *testDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) { - return New(), nil -} - -// TestDriver is a StorageDriver for testing purposes. The Writer returned by this driver -// simulates the case where Write operations are buffered. This causes the value returned by Size to lag -// behind until Close (or Commit, or Cancel) is called. -type TestDriver struct { - storagedriver.StorageDriver -} - -type testFileWriter struct { - storagedriver.FileWriter - prevchunk []byte -} - -var _ storagedriver.StorageDriver = &TestDriver{} - -// New constructs a new StorageDriver for testing purposes. The Writer returned by this driver -// simulates the case where Write operations are buffered. This causes the value returned by Size to lag -// behind until Close (or Commit, or Cancel) is called. -func New() *TestDriver { - return &TestDriver{StorageDriver: inmemory.New()} -} - -// Writer returns a FileWriter which will store the content written to it -// at the location designated by "path" after the call to Commit. -func (td *TestDriver) Writer(ctx context.Context, path string, append bool) (storagedriver.FileWriter, error) { - fw, err := td.StorageDriver.Writer(ctx, path, append) - return &testFileWriter{FileWriter: fw}, err -} - -func (tfw *testFileWriter) Write(p []byte) (int, error) { - _, err := tfw.FileWriter.Write(tfw.prevchunk) - tfw.prevchunk = make([]byte, len(p)) - copy(tfw.prevchunk, p) - return len(p), err -} - -func (tfw *testFileWriter) Close() error { - tfw.Write(nil) - return tfw.FileWriter.Close() -} - -func (tfw *testFileWriter) Cancel() error { - tfw.Write(nil) - return tfw.FileWriter.Cancel() -} - -func (tfw *testFileWriter) Commit() error { - tfw.Write(nil) - return tfw.FileWriter.Commit() -} diff --git a/vendor/github.com/docker/distribution/registry/storage/driver/testsuites/testsuites.go b/vendor/github.com/docker/distribution/registry/storage/driver/testsuites/testsuites.go deleted file mode 100644 index d8afe0c85..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/driver/testsuites/testsuites.go +++ /dev/null @@ -1,1273 +0,0 @@ -package testsuites - -import ( - "bytes" - "crypto/sha1" - "io" - "io/ioutil" - "math/rand" - "net/http" - "os" - "path" - "sort" - "strings" - "sync" - "testing" - "time" - - "gopkg.in/check.v1" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" -) - -// Test hooks up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -// RegisterSuite registers an in-process storage driver test suite with -// the go test runner. -func RegisterSuite(driverConstructor DriverConstructor, skipCheck SkipCheck) { - check.Suite(&DriverSuite{ - Constructor: driverConstructor, - SkipCheck: skipCheck, - ctx: context.Background(), - }) -} - -// SkipCheck is a function used to determine if a test suite should be skipped. -// If a SkipCheck returns a non-empty skip reason, the suite is skipped with -// the given reason. -type SkipCheck func() (reason string) - -// NeverSkip is a default SkipCheck which never skips the suite. -var NeverSkip SkipCheck = func() string { return "" } - -// DriverConstructor is a function which returns a new -// storagedriver.StorageDriver. -type DriverConstructor func() (storagedriver.StorageDriver, error) - -// DriverTeardown is a function which cleans up a suite's -// storagedriver.StorageDriver. -type DriverTeardown func() error - -// DriverSuite is a gocheck test suite designed to test a -// storagedriver.StorageDriver. The intended way to create a DriverSuite is -// with RegisterSuite. -type DriverSuite struct { - Constructor DriverConstructor - Teardown DriverTeardown - SkipCheck - storagedriver.StorageDriver - ctx context.Context -} - -// SetUpSuite sets up the gocheck test suite. -func (suite *DriverSuite) SetUpSuite(c *check.C) { - if reason := suite.SkipCheck(); reason != "" { - c.Skip(reason) - } - d, err := suite.Constructor() - c.Assert(err, check.IsNil) - suite.StorageDriver = d -} - -// TearDownSuite tears down the gocheck test suite. -func (suite *DriverSuite) TearDownSuite(c *check.C) { - if suite.Teardown != nil { - err := suite.Teardown() - c.Assert(err, check.IsNil) - } -} - -// TearDownTest tears down the gocheck test. -// This causes the suite to abort if any files are left around in the storage -// driver. -func (suite *DriverSuite) TearDownTest(c *check.C) { - files, _ := suite.StorageDriver.List(suite.ctx, "/") - if len(files) > 0 { - c.Fatalf("Storage driver did not clean up properly. Offending files: %#v", files) - } -} - -// TestRootExists ensures that all storage drivers have a root path by default. -func (suite *DriverSuite) TestRootExists(c *check.C) { - _, err := suite.StorageDriver.List(suite.ctx, "/") - if err != nil { - c.Fatalf(`the root path "/" should always exist: %v`, err) - } -} - -// TestValidPaths checks that various valid file paths are accepted by the -// storage driver. -func (suite *DriverSuite) TestValidPaths(c *check.C) { - contents := randomContents(64) - validFiles := []string{ - "/a", - "/2", - "/aa", - "/a.a", - "/0-9/abcdefg", - "/abcdefg/z.75", - "/abc/1.2.3.4.5-6_zyx/123.z/4", - "/docker/docker-registry", - "/123.abc", - "/abc./abc", - "/.abc", - "/a--b", - "/a-.b", - "/_.abc", - "/Docker/docker-registry", - "/Abc/Cba"} - - for _, filename := range validFiles { - err := suite.StorageDriver.PutContent(suite.ctx, filename, contents) - defer suite.deletePath(c, firstPart(filename)) - c.Assert(err, check.IsNil) - - received, err := suite.StorageDriver.GetContent(suite.ctx, filename) - c.Assert(err, check.IsNil) - c.Assert(received, check.DeepEquals, contents) - } -} - -func (suite *DriverSuite) deletePath(c *check.C, path string) { - for tries := 2; tries > 0; tries-- { - err := suite.StorageDriver.Delete(suite.ctx, path) - if _, ok := err.(storagedriver.PathNotFoundError); ok { - err = nil - } - c.Assert(err, check.IsNil) - paths, err := suite.StorageDriver.List(suite.ctx, path) - if len(paths) == 0 { - break - } - time.Sleep(time.Second * 2) - } -} - -// TestInvalidPaths checks that various invalid file paths are rejected by the -// storage driver. -func (suite *DriverSuite) TestInvalidPaths(c *check.C) { - contents := randomContents(64) - invalidFiles := []string{ - "", - "/", - "abc", - "123.abc", - "//bcd", - "/abc_123/"} - - for _, filename := range invalidFiles { - err := suite.StorageDriver.PutContent(suite.ctx, filename, contents) - // only delete if file was successfully written - if err == nil { - defer suite.deletePath(c, firstPart(filename)) - } - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.InvalidPathError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - - _, err = suite.StorageDriver.GetContent(suite.ctx, filename) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.InvalidPathError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - } -} - -// TestWriteRead1 tests a simple write-read workflow. -func (suite *DriverSuite) TestWriteRead1(c *check.C) { - filename := randomPath(32) - contents := []byte("a") - suite.writeReadCompare(c, filename, contents) -} - -// TestWriteRead2 tests a simple write-read workflow with unicode data. -func (suite *DriverSuite) TestWriteRead2(c *check.C) { - filename := randomPath(32) - contents := []byte("\xc3\x9f") - suite.writeReadCompare(c, filename, contents) -} - -// TestWriteRead3 tests a simple write-read workflow with a small string. -func (suite *DriverSuite) TestWriteRead3(c *check.C) { - filename := randomPath(32) - contents := randomContents(32) - suite.writeReadCompare(c, filename, contents) -} - -// TestWriteRead4 tests a simple write-read workflow with 1MB of data. -func (suite *DriverSuite) TestWriteRead4(c *check.C) { - filename := randomPath(32) - contents := randomContents(1024 * 1024) - suite.writeReadCompare(c, filename, contents) -} - -// TestWriteReadNonUTF8 tests that non-utf8 data may be written to the storage -// driver safely. -func (suite *DriverSuite) TestWriteReadNonUTF8(c *check.C) { - filename := randomPath(32) - contents := []byte{0x80, 0x80, 0x80, 0x80} - suite.writeReadCompare(c, filename, contents) -} - -// TestTruncate tests that putting smaller contents than an original file does -// remove the excess contents. -func (suite *DriverSuite) TestTruncate(c *check.C) { - filename := randomPath(32) - contents := randomContents(1024 * 1024) - suite.writeReadCompare(c, filename, contents) - - contents = randomContents(1024) - suite.writeReadCompare(c, filename, contents) -} - -// TestReadNonexistent tests reading content from an empty path. -func (suite *DriverSuite) TestReadNonexistent(c *check.C) { - filename := randomPath(32) - _, err := suite.StorageDriver.GetContent(suite.ctx, filename) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) -} - -// TestWriteReadStreams1 tests a simple write-read streaming workflow. -func (suite *DriverSuite) TestWriteReadStreams1(c *check.C) { - filename := randomPath(32) - contents := []byte("a") - suite.writeReadCompareStreams(c, filename, contents) -} - -// TestWriteReadStreams2 tests a simple write-read streaming workflow with -// unicode data. -func (suite *DriverSuite) TestWriteReadStreams2(c *check.C) { - filename := randomPath(32) - contents := []byte("\xc3\x9f") - suite.writeReadCompareStreams(c, filename, contents) -} - -// TestWriteReadStreams3 tests a simple write-read streaming workflow with a -// small amount of data. -func (suite *DriverSuite) TestWriteReadStreams3(c *check.C) { - filename := randomPath(32) - contents := randomContents(32) - suite.writeReadCompareStreams(c, filename, contents) -} - -// TestWriteReadStreams4 tests a simple write-read streaming workflow with 1MB -// of data. -func (suite *DriverSuite) TestWriteReadStreams4(c *check.C) { - filename := randomPath(32) - contents := randomContents(1024 * 1024) - suite.writeReadCompareStreams(c, filename, contents) -} - -// TestWriteReadStreamsNonUTF8 tests that non-utf8 data may be written to the -// storage driver safely. -func (suite *DriverSuite) TestWriteReadStreamsNonUTF8(c *check.C) { - filename := randomPath(32) - contents := []byte{0x80, 0x80, 0x80, 0x80} - suite.writeReadCompareStreams(c, filename, contents) -} - -// TestWriteReadLargeStreams tests that a 5GB file may be written to the storage -// driver safely. -func (suite *DriverSuite) TestWriteReadLargeStreams(c *check.C) { - if testing.Short() { - c.Skip("Skipping test in short mode") - } - - filename := randomPath(32) - defer suite.deletePath(c, firstPart(filename)) - - checksum := sha1.New() - var fileSize int64 = 5 * 1024 * 1024 * 1024 - - contents := newRandReader(fileSize) - - writer, err := suite.StorageDriver.Writer(suite.ctx, filename, false) - c.Assert(err, check.IsNil) - written, err := io.Copy(writer, io.TeeReader(contents, checksum)) - c.Assert(err, check.IsNil) - c.Assert(written, check.Equals, fileSize) - - err = writer.Commit() - c.Assert(err, check.IsNil) - err = writer.Close() - c.Assert(err, check.IsNil) - - reader, err := suite.StorageDriver.Reader(suite.ctx, filename, 0) - c.Assert(err, check.IsNil) - defer reader.Close() - - writtenChecksum := sha1.New() - io.Copy(writtenChecksum, reader) - - c.Assert(writtenChecksum.Sum(nil), check.DeepEquals, checksum.Sum(nil)) -} - -// TestReaderWithOffset tests that the appropriate data is streamed when -// reading with a given offset. -func (suite *DriverSuite) TestReaderWithOffset(c *check.C) { - filename := randomPath(32) - defer suite.deletePath(c, firstPart(filename)) - - chunkSize := int64(32) - - contentsChunk1 := randomContents(chunkSize) - contentsChunk2 := randomContents(chunkSize) - contentsChunk3 := randomContents(chunkSize) - - err := suite.StorageDriver.PutContent(suite.ctx, filename, append(append(contentsChunk1, contentsChunk2...), contentsChunk3...)) - c.Assert(err, check.IsNil) - - reader, err := suite.StorageDriver.Reader(suite.ctx, filename, 0) - c.Assert(err, check.IsNil) - defer reader.Close() - - readContents, err := ioutil.ReadAll(reader) - c.Assert(err, check.IsNil) - - c.Assert(readContents, check.DeepEquals, append(append(contentsChunk1, contentsChunk2...), contentsChunk3...)) - - reader, err = suite.StorageDriver.Reader(suite.ctx, filename, chunkSize) - c.Assert(err, check.IsNil) - defer reader.Close() - - readContents, err = ioutil.ReadAll(reader) - c.Assert(err, check.IsNil) - - c.Assert(readContents, check.DeepEquals, append(contentsChunk2, contentsChunk3...)) - - reader, err = suite.StorageDriver.Reader(suite.ctx, filename, chunkSize*2) - c.Assert(err, check.IsNil) - defer reader.Close() - - readContents, err = ioutil.ReadAll(reader) - c.Assert(err, check.IsNil) - c.Assert(readContents, check.DeepEquals, contentsChunk3) - - // Ensure we get invalid offest for negative offsets. - reader, err = suite.StorageDriver.Reader(suite.ctx, filename, -1) - c.Assert(err, check.FitsTypeOf, storagedriver.InvalidOffsetError{}) - c.Assert(err.(storagedriver.InvalidOffsetError).Offset, check.Equals, int64(-1)) - c.Assert(err.(storagedriver.InvalidOffsetError).Path, check.Equals, filename) - c.Assert(reader, check.IsNil) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - - // Read past the end of the content and make sure we get a reader that - // returns 0 bytes and io.EOF - reader, err = suite.StorageDriver.Reader(suite.ctx, filename, chunkSize*3) - c.Assert(err, check.IsNil) - defer reader.Close() - - buf := make([]byte, chunkSize) - n, err := reader.Read(buf) - c.Assert(err, check.Equals, io.EOF) - c.Assert(n, check.Equals, 0) - - // Check the N-1 boundary condition, ensuring we get 1 byte then io.EOF. - reader, err = suite.StorageDriver.Reader(suite.ctx, filename, chunkSize*3-1) - c.Assert(err, check.IsNil) - defer reader.Close() - - n, err = reader.Read(buf) - c.Assert(n, check.Equals, 1) - - // We don't care whether the io.EOF comes on the this read or the first - // zero read, but the only error acceptable here is io.EOF. - if err != nil { - c.Assert(err, check.Equals, io.EOF) - } - - // Any more reads should result in zero bytes and io.EOF - n, err = reader.Read(buf) - c.Assert(n, check.Equals, 0) - c.Assert(err, check.Equals, io.EOF) -} - -// TestContinueStreamAppendLarge tests that a stream write can be appended to without -// corrupting the data with a large chunk size. -func (suite *DriverSuite) TestContinueStreamAppendLarge(c *check.C) { - suite.testContinueStreamAppend(c, int64(10*1024*1024)) -} - -// TestContinueStreamAppendSmall is the same as TestContinueStreamAppendLarge, but only -// with a tiny chunk size in order to test corner cases for some cloud storage drivers. -func (suite *DriverSuite) TestContinueStreamAppendSmall(c *check.C) { - suite.testContinueStreamAppend(c, int64(32)) -} - -func (suite *DriverSuite) testContinueStreamAppend(c *check.C, chunkSize int64) { - filename := randomPath(32) - defer suite.deletePath(c, firstPart(filename)) - - contentsChunk1 := randomContents(chunkSize) - contentsChunk2 := randomContents(chunkSize) - contentsChunk3 := randomContents(chunkSize) - - fullContents := append(append(contentsChunk1, contentsChunk2...), contentsChunk3...) - - writer, err := suite.StorageDriver.Writer(suite.ctx, filename, false) - c.Assert(err, check.IsNil) - nn, err := io.Copy(writer, bytes.NewReader(contentsChunk1)) - c.Assert(err, check.IsNil) - c.Assert(nn, check.Equals, int64(len(contentsChunk1))) - - err = writer.Close() - c.Assert(err, check.IsNil) - - curSize := writer.Size() - c.Assert(curSize, check.Equals, int64(len(contentsChunk1))) - - writer, err = suite.StorageDriver.Writer(suite.ctx, filename, true) - c.Assert(err, check.IsNil) - c.Assert(writer.Size(), check.Equals, curSize) - - nn, err = io.Copy(writer, bytes.NewReader(contentsChunk2)) - c.Assert(err, check.IsNil) - c.Assert(nn, check.Equals, int64(len(contentsChunk2))) - - err = writer.Close() - c.Assert(err, check.IsNil) - - curSize = writer.Size() - c.Assert(curSize, check.Equals, 2*chunkSize) - - writer, err = suite.StorageDriver.Writer(suite.ctx, filename, true) - c.Assert(err, check.IsNil) - c.Assert(writer.Size(), check.Equals, curSize) - - nn, err = io.Copy(writer, bytes.NewReader(fullContents[curSize:])) - c.Assert(err, check.IsNil) - c.Assert(nn, check.Equals, int64(len(fullContents[curSize:]))) - - err = writer.Commit() - c.Assert(err, check.IsNil) - err = writer.Close() - c.Assert(err, check.IsNil) - - received, err := suite.StorageDriver.GetContent(suite.ctx, filename) - c.Assert(err, check.IsNil) - c.Assert(received, check.DeepEquals, fullContents) -} - -// TestReadNonexistentStream tests that reading a stream for a nonexistent path -// fails. -func (suite *DriverSuite) TestReadNonexistentStream(c *check.C) { - filename := randomPath(32) - - _, err := suite.StorageDriver.Reader(suite.ctx, filename, 0) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - - _, err = suite.StorageDriver.Reader(suite.ctx, filename, 64) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) -} - -// TestList checks the returned list of keys after populating a directory tree. -func (suite *DriverSuite) TestList(c *check.C) { - rootDirectory := "/" + randomFilename(int64(8+rand.Intn(8))) - defer suite.deletePath(c, rootDirectory) - - doesnotexist := path.Join(rootDirectory, "nonexistent") - _, err := suite.StorageDriver.List(suite.ctx, doesnotexist) - c.Assert(err, check.Equals, storagedriver.PathNotFoundError{ - Path: doesnotexist, - DriverName: suite.StorageDriver.Name(), - }) - - parentDirectory := rootDirectory + "/" + randomFilename(int64(8+rand.Intn(8))) - childFiles := make([]string, 50) - for i := 0; i < len(childFiles); i++ { - childFile := parentDirectory + "/" + randomFilename(int64(8+rand.Intn(8))) - childFiles[i] = childFile - err := suite.StorageDriver.PutContent(suite.ctx, childFile, randomContents(32)) - c.Assert(err, check.IsNil) - } - sort.Strings(childFiles) - - keys, err := suite.StorageDriver.List(suite.ctx, "/") - c.Assert(err, check.IsNil) - c.Assert(keys, check.DeepEquals, []string{rootDirectory}) - - keys, err = suite.StorageDriver.List(suite.ctx, rootDirectory) - c.Assert(err, check.IsNil) - c.Assert(keys, check.DeepEquals, []string{parentDirectory}) - - keys, err = suite.StorageDriver.List(suite.ctx, parentDirectory) - c.Assert(err, check.IsNil) - - sort.Strings(keys) - c.Assert(keys, check.DeepEquals, childFiles) - - // A few checks to add here (check out #819 for more discussion on this): - // 1. Ensure that all paths are absolute. - // 2. Ensure that listings only include direct children. - // 3. Ensure that we only respond to directory listings that end with a slash (maybe?). -} - -// TestMove checks that a moved object no longer exists at the source path and -// does exist at the destination. -func (suite *DriverSuite) TestMove(c *check.C) { - contents := randomContents(32) - sourcePath := randomPath(32) - destPath := randomPath(32) - - defer suite.deletePath(c, firstPart(sourcePath)) - defer suite.deletePath(c, firstPart(destPath)) - - err := suite.StorageDriver.PutContent(suite.ctx, sourcePath, contents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.Move(suite.ctx, sourcePath, destPath) - c.Assert(err, check.IsNil) - - received, err := suite.StorageDriver.GetContent(suite.ctx, destPath) - c.Assert(err, check.IsNil) - c.Assert(received, check.DeepEquals, contents) - - _, err = suite.StorageDriver.GetContent(suite.ctx, sourcePath) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) -} - -// TestMoveOverwrite checks that a moved object no longer exists at the source -// path and overwrites the contents at the destination. -func (suite *DriverSuite) TestMoveOverwrite(c *check.C) { - sourcePath := randomPath(32) - destPath := randomPath(32) - sourceContents := randomContents(32) - destContents := randomContents(64) - - defer suite.deletePath(c, firstPart(sourcePath)) - defer suite.deletePath(c, firstPart(destPath)) - - err := suite.StorageDriver.PutContent(suite.ctx, sourcePath, sourceContents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.PutContent(suite.ctx, destPath, destContents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.Move(suite.ctx, sourcePath, destPath) - c.Assert(err, check.IsNil) - - received, err := suite.StorageDriver.GetContent(suite.ctx, destPath) - c.Assert(err, check.IsNil) - c.Assert(received, check.DeepEquals, sourceContents) - - _, err = suite.StorageDriver.GetContent(suite.ctx, sourcePath) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) -} - -// TestMoveNonexistent checks that moving a nonexistent key fails and does not -// delete the data at the destination path. -func (suite *DriverSuite) TestMoveNonexistent(c *check.C) { - contents := randomContents(32) - sourcePath := randomPath(32) - destPath := randomPath(32) - - defer suite.deletePath(c, firstPart(destPath)) - - err := suite.StorageDriver.PutContent(suite.ctx, destPath, contents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.Move(suite.ctx, sourcePath, destPath) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - - received, err := suite.StorageDriver.GetContent(suite.ctx, destPath) - c.Assert(err, check.IsNil) - c.Assert(received, check.DeepEquals, contents) -} - -// TestMoveInvalid provides various checks for invalid moves. -func (suite *DriverSuite) TestMoveInvalid(c *check.C) { - contents := randomContents(32) - - // Create a regular file. - err := suite.StorageDriver.PutContent(suite.ctx, "/notadir", contents) - c.Assert(err, check.IsNil) - defer suite.deletePath(c, "/notadir") - - // Now try to move a non-existent file under it. - err = suite.StorageDriver.Move(suite.ctx, "/notadir/foo", "/notadir/bar") - c.Assert(err, check.NotNil) // non-nil error -} - -// TestDelete checks that the delete operation removes data from the storage -// driver -func (suite *DriverSuite) TestDelete(c *check.C) { - filename := randomPath(32) - contents := randomContents(32) - - defer suite.deletePath(c, firstPart(filename)) - - err := suite.StorageDriver.PutContent(suite.ctx, filename, contents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.Delete(suite.ctx, filename) - c.Assert(err, check.IsNil) - - _, err = suite.StorageDriver.GetContent(suite.ctx, filename) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) -} - -// TestURLFor checks that the URLFor method functions properly, but only if it -// is implemented -func (suite *DriverSuite) TestURLFor(c *check.C) { - filename := randomPath(32) - contents := randomContents(32) - - defer suite.deletePath(c, firstPart(filename)) - - err := suite.StorageDriver.PutContent(suite.ctx, filename, contents) - c.Assert(err, check.IsNil) - - url, err := suite.StorageDriver.URLFor(suite.ctx, filename, nil) - if _, ok := err.(storagedriver.ErrUnsupportedMethod); ok { - return - } - c.Assert(err, check.IsNil) - - response, err := http.Get(url) - c.Assert(err, check.IsNil) - defer response.Body.Close() - - read, err := ioutil.ReadAll(response.Body) - c.Assert(err, check.IsNil) - c.Assert(read, check.DeepEquals, contents) - - url, err = suite.StorageDriver.URLFor(suite.ctx, filename, map[string]interface{}{"method": "HEAD"}) - if _, ok := err.(storagedriver.ErrUnsupportedMethod); ok { - return - } - c.Assert(err, check.IsNil) - - response, err = http.Head(url) - c.Assert(response.StatusCode, check.Equals, 200) - c.Assert(response.ContentLength, check.Equals, int64(32)) -} - -// TestDeleteNonexistent checks that removing a nonexistent key fails. -func (suite *DriverSuite) TestDeleteNonexistent(c *check.C) { - filename := randomPath(32) - err := suite.StorageDriver.Delete(suite.ctx, filename) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) -} - -// TestDeleteFolder checks that deleting a folder removes all child elements. -func (suite *DriverSuite) TestDeleteFolder(c *check.C) { - dirname := randomPath(32) - filename1 := randomPath(32) - filename2 := randomPath(32) - filename3 := randomPath(32) - contents := randomContents(32) - - defer suite.deletePath(c, firstPart(dirname)) - - err := suite.StorageDriver.PutContent(suite.ctx, path.Join(dirname, filename1), contents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.PutContent(suite.ctx, path.Join(dirname, filename2), contents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.PutContent(suite.ctx, path.Join(dirname, filename3), contents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.Delete(suite.ctx, path.Join(dirname, filename1)) - c.Assert(err, check.IsNil) - - _, err = suite.StorageDriver.GetContent(suite.ctx, path.Join(dirname, filename1)) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - - _, err = suite.StorageDriver.GetContent(suite.ctx, path.Join(dirname, filename2)) - c.Assert(err, check.IsNil) - - _, err = suite.StorageDriver.GetContent(suite.ctx, path.Join(dirname, filename3)) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.Delete(suite.ctx, dirname) - c.Assert(err, check.IsNil) - - _, err = suite.StorageDriver.GetContent(suite.ctx, path.Join(dirname, filename1)) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - - _, err = suite.StorageDriver.GetContent(suite.ctx, path.Join(dirname, filename2)) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - - _, err = suite.StorageDriver.GetContent(suite.ctx, path.Join(dirname, filename3)) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) -} - -// TestDeleteOnlyDeletesSubpaths checks that deleting path A does not -// delete path B when A is a prefix of B but B is not a subpath of A (so that -// deleting "/a" does not delete "/ab"). This matters for services like S3 that -// do not implement directories. -func (suite *DriverSuite) TestDeleteOnlyDeletesSubpaths(c *check.C) { - dirname := randomPath(32) - filename := randomPath(32) - contents := randomContents(32) - - defer suite.deletePath(c, firstPart(dirname)) - - err := suite.StorageDriver.PutContent(suite.ctx, path.Join(dirname, filename), contents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.PutContent(suite.ctx, path.Join(dirname, filename+"suffix"), contents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.PutContent(suite.ctx, path.Join(dirname, dirname, filename), contents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.PutContent(suite.ctx, path.Join(dirname, dirname+"suffix", filename), contents) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.Delete(suite.ctx, path.Join(dirname, filename)) - c.Assert(err, check.IsNil) - - _, err = suite.StorageDriver.GetContent(suite.ctx, path.Join(dirname, filename)) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - - _, err = suite.StorageDriver.GetContent(suite.ctx, path.Join(dirname, filename+"suffix")) - c.Assert(err, check.IsNil) - - err = suite.StorageDriver.Delete(suite.ctx, path.Join(dirname, dirname)) - c.Assert(err, check.IsNil) - - _, err = suite.StorageDriver.GetContent(suite.ctx, path.Join(dirname, dirname, filename)) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - - _, err = suite.StorageDriver.GetContent(suite.ctx, path.Join(dirname, dirname+"suffix", filename)) - c.Assert(err, check.IsNil) -} - -// TestStatCall runs verifies the implementation of the storagedriver's Stat call. -func (suite *DriverSuite) TestStatCall(c *check.C) { - content := randomContents(4096) - dirPath := randomPath(32) - fileName := randomFilename(32) - filePath := path.Join(dirPath, fileName) - - defer suite.deletePath(c, firstPart(dirPath)) - - // Call on non-existent file/dir, check error. - fi, err := suite.StorageDriver.Stat(suite.ctx, dirPath) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - c.Assert(fi, check.IsNil) - - fi, err = suite.StorageDriver.Stat(suite.ctx, filePath) - c.Assert(err, check.NotNil) - c.Assert(err, check.FitsTypeOf, storagedriver.PathNotFoundError{}) - c.Assert(strings.Contains(err.Error(), suite.Name()), check.Equals, true) - c.Assert(fi, check.IsNil) - - err = suite.StorageDriver.PutContent(suite.ctx, filePath, content) - c.Assert(err, check.IsNil) - - // Call on regular file, check results - fi, err = suite.StorageDriver.Stat(suite.ctx, filePath) - c.Assert(err, check.IsNil) - c.Assert(fi, check.NotNil) - c.Assert(fi.Path(), check.Equals, filePath) - c.Assert(fi.Size(), check.Equals, int64(len(content))) - c.Assert(fi.IsDir(), check.Equals, false) - createdTime := fi.ModTime() - - // Sleep and modify the file - time.Sleep(time.Second * 10) - content = randomContents(4096) - err = suite.StorageDriver.PutContent(suite.ctx, filePath, content) - c.Assert(err, check.IsNil) - fi, err = suite.StorageDriver.Stat(suite.ctx, filePath) - c.Assert(err, check.IsNil) - c.Assert(fi, check.NotNil) - time.Sleep(time.Second * 5) // allow changes to propagate (eventual consistency) - - // Check if the modification time is after the creation time. - // In case of cloud storage services, storage frontend nodes might have - // time drift between them, however that should be solved with sleeping - // before update. - modTime := fi.ModTime() - if !modTime.After(createdTime) { - c.Errorf("modtime (%s) is before the creation time (%s)", modTime, createdTime) - } - - // Call on directory (do not check ModTime as dirs don't need to support it) - fi, err = suite.StorageDriver.Stat(suite.ctx, dirPath) - c.Assert(err, check.IsNil) - c.Assert(fi, check.NotNil) - c.Assert(fi.Path(), check.Equals, dirPath) - c.Assert(fi.Size(), check.Equals, int64(0)) - c.Assert(fi.IsDir(), check.Equals, true) -} - -// TestPutContentMultipleTimes checks that if storage driver can overwrite the content -// in the subsequent puts. Validates that PutContent does not have to work -// with an offset like Writer does and overwrites the file entirely -// rather than writing the data to the [0,len(data)) of the file. -func (suite *DriverSuite) TestPutContentMultipleTimes(c *check.C) { - filename := randomPath(32) - contents := randomContents(4096) - - defer suite.deletePath(c, firstPart(filename)) - err := suite.StorageDriver.PutContent(suite.ctx, filename, contents) - c.Assert(err, check.IsNil) - - contents = randomContents(2048) // upload a different, smaller file - err = suite.StorageDriver.PutContent(suite.ctx, filename, contents) - c.Assert(err, check.IsNil) - - readContents, err := suite.StorageDriver.GetContent(suite.ctx, filename) - c.Assert(err, check.IsNil) - c.Assert(readContents, check.DeepEquals, contents) -} - -// TestConcurrentStreamReads checks that multiple clients can safely read from -// the same file simultaneously with various offsets. -func (suite *DriverSuite) TestConcurrentStreamReads(c *check.C) { - var filesize int64 = 128 * 1024 * 1024 - - if testing.Short() { - filesize = 10 * 1024 * 1024 - c.Log("Reducing file size to 10MB for short mode") - } - - filename := randomPath(32) - contents := randomContents(filesize) - - defer suite.deletePath(c, firstPart(filename)) - - err := suite.StorageDriver.PutContent(suite.ctx, filename, contents) - c.Assert(err, check.IsNil) - - var wg sync.WaitGroup - - readContents := func() { - defer wg.Done() - offset := rand.Int63n(int64(len(contents))) - reader, err := suite.StorageDriver.Reader(suite.ctx, filename, offset) - c.Assert(err, check.IsNil) - - readContents, err := ioutil.ReadAll(reader) - c.Assert(err, check.IsNil) - c.Assert(readContents, check.DeepEquals, contents[offset:]) - } - - wg.Add(10) - for i := 0; i < 10; i++ { - go readContents() - } - wg.Wait() -} - -// TestConcurrentFileStreams checks that multiple *os.File objects can be passed -// in to Writer concurrently without hanging. -func (suite *DriverSuite) TestConcurrentFileStreams(c *check.C) { - numStreams := 32 - - if testing.Short() { - numStreams = 8 - c.Log("Reducing number of streams to 8 for short mode") - } - - var wg sync.WaitGroup - - testStream := func(size int64) { - defer wg.Done() - suite.testFileStreams(c, size) - } - - wg.Add(numStreams) - for i := numStreams; i > 0; i-- { - go testStream(int64(numStreams) * 1024 * 1024) - } - - wg.Wait() -} - -// TODO (brianbland): evaluate the relevancy of this test -// TestEventualConsistency checks that if stat says that a file is a certain size, then -// you can freely read from the file (this is the only guarantee that the driver needs to provide) -// func (suite *DriverSuite) TestEventualConsistency(c *check.C) { -// if testing.Short() { -// c.Skip("Skipping test in short mode") -// } -// -// filename := randomPath(32) -// defer suite.deletePath(c, firstPart(filename)) -// -// var offset int64 -// var misswrites int -// var chunkSize int64 = 32 -// -// for i := 0; i < 1024; i++ { -// contents := randomContents(chunkSize) -// read, err := suite.StorageDriver.Writer(suite.ctx, filename, offset, bytes.NewReader(contents)) -// c.Assert(err, check.IsNil) -// -// fi, err := suite.StorageDriver.Stat(suite.ctx, filename) -// c.Assert(err, check.IsNil) -// -// // We are most concerned with being able to read data as soon as Stat declares -// // it is uploaded. This is the strongest guarantee that some drivers (that guarantee -// // at best eventual consistency) absolutely need to provide. -// if fi.Size() == offset+chunkSize { -// reader, err := suite.StorageDriver.Reader(suite.ctx, filename, offset) -// c.Assert(err, check.IsNil) -// -// readContents, err := ioutil.ReadAll(reader) -// c.Assert(err, check.IsNil) -// -// c.Assert(readContents, check.DeepEquals, contents) -// -// reader.Close() -// offset += read -// } else { -// misswrites++ -// } -// } -// -// if misswrites > 0 { -// c.Log("There were " + string(misswrites) + " occurrences of a write not being instantly available.") -// } -// -// c.Assert(misswrites, check.Not(check.Equals), 1024) -// } - -// BenchmarkPutGetEmptyFiles benchmarks PutContent/GetContent for 0B files -func (suite *DriverSuite) BenchmarkPutGetEmptyFiles(c *check.C) { - suite.benchmarkPutGetFiles(c, 0) -} - -// BenchmarkPutGet1KBFiles benchmarks PutContent/GetContent for 1KB files -func (suite *DriverSuite) BenchmarkPutGet1KBFiles(c *check.C) { - suite.benchmarkPutGetFiles(c, 1024) -} - -// BenchmarkPutGet1MBFiles benchmarks PutContent/GetContent for 1MB files -func (suite *DriverSuite) BenchmarkPutGet1MBFiles(c *check.C) { - suite.benchmarkPutGetFiles(c, 1024*1024) -} - -// BenchmarkPutGet1GBFiles benchmarks PutContent/GetContent for 1GB files -func (suite *DriverSuite) BenchmarkPutGet1GBFiles(c *check.C) { - suite.benchmarkPutGetFiles(c, 1024*1024*1024) -} - -func (suite *DriverSuite) benchmarkPutGetFiles(c *check.C, size int64) { - c.SetBytes(size) - parentDir := randomPath(8) - defer func() { - c.StopTimer() - suite.StorageDriver.Delete(suite.ctx, firstPart(parentDir)) - }() - - for i := 0; i < c.N; i++ { - filename := path.Join(parentDir, randomPath(32)) - err := suite.StorageDriver.PutContent(suite.ctx, filename, randomContents(size)) - c.Assert(err, check.IsNil) - - _, err = suite.StorageDriver.GetContent(suite.ctx, filename) - c.Assert(err, check.IsNil) - } -} - -// BenchmarkStreamEmptyFiles benchmarks Writer/Reader for 0B files -func (suite *DriverSuite) BenchmarkStreamEmptyFiles(c *check.C) { - suite.benchmarkStreamFiles(c, 0) -} - -// BenchmarkStream1KBFiles benchmarks Writer/Reader for 1KB files -func (suite *DriverSuite) BenchmarkStream1KBFiles(c *check.C) { - suite.benchmarkStreamFiles(c, 1024) -} - -// BenchmarkStream1MBFiles benchmarks Writer/Reader for 1MB files -func (suite *DriverSuite) BenchmarkStream1MBFiles(c *check.C) { - suite.benchmarkStreamFiles(c, 1024*1024) -} - -// BenchmarkStream1GBFiles benchmarks Writer/Reader for 1GB files -func (suite *DriverSuite) BenchmarkStream1GBFiles(c *check.C) { - suite.benchmarkStreamFiles(c, 1024*1024*1024) -} - -func (suite *DriverSuite) benchmarkStreamFiles(c *check.C, size int64) { - c.SetBytes(size) - parentDir := randomPath(8) - defer func() { - c.StopTimer() - suite.StorageDriver.Delete(suite.ctx, firstPart(parentDir)) - }() - - for i := 0; i < c.N; i++ { - filename := path.Join(parentDir, randomPath(32)) - writer, err := suite.StorageDriver.Writer(suite.ctx, filename, false) - c.Assert(err, check.IsNil) - written, err := io.Copy(writer, bytes.NewReader(randomContents(size))) - c.Assert(err, check.IsNil) - c.Assert(written, check.Equals, size) - - err = writer.Commit() - c.Assert(err, check.IsNil) - err = writer.Close() - c.Assert(err, check.IsNil) - - rc, err := suite.StorageDriver.Reader(suite.ctx, filename, 0) - c.Assert(err, check.IsNil) - rc.Close() - } -} - -// BenchmarkList5Files benchmarks List for 5 small files -func (suite *DriverSuite) BenchmarkList5Files(c *check.C) { - suite.benchmarkListFiles(c, 5) -} - -// BenchmarkList50Files benchmarks List for 50 small files -func (suite *DriverSuite) BenchmarkList50Files(c *check.C) { - suite.benchmarkListFiles(c, 50) -} - -func (suite *DriverSuite) benchmarkListFiles(c *check.C, numFiles int64) { - parentDir := randomPath(8) - defer func() { - c.StopTimer() - suite.StorageDriver.Delete(suite.ctx, firstPart(parentDir)) - }() - - for i := int64(0); i < numFiles; i++ { - err := suite.StorageDriver.PutContent(suite.ctx, path.Join(parentDir, randomPath(32)), nil) - c.Assert(err, check.IsNil) - } - - c.ResetTimer() - for i := 0; i < c.N; i++ { - files, err := suite.StorageDriver.List(suite.ctx, parentDir) - c.Assert(err, check.IsNil) - c.Assert(int64(len(files)), check.Equals, numFiles) - } -} - -// BenchmarkDelete5Files benchmarks Delete for 5 small files -func (suite *DriverSuite) BenchmarkDelete5Files(c *check.C) { - suite.benchmarkDeleteFiles(c, 5) -} - -// BenchmarkDelete50Files benchmarks Delete for 50 small files -func (suite *DriverSuite) BenchmarkDelete50Files(c *check.C) { - suite.benchmarkDeleteFiles(c, 50) -} - -func (suite *DriverSuite) benchmarkDeleteFiles(c *check.C, numFiles int64) { - for i := 0; i < c.N; i++ { - parentDir := randomPath(8) - defer suite.deletePath(c, firstPart(parentDir)) - - c.StopTimer() - for j := int64(0); j < numFiles; j++ { - err := suite.StorageDriver.PutContent(suite.ctx, path.Join(parentDir, randomPath(32)), nil) - c.Assert(err, check.IsNil) - } - c.StartTimer() - - // This is the operation we're benchmarking - err := suite.StorageDriver.Delete(suite.ctx, firstPart(parentDir)) - c.Assert(err, check.IsNil) - } -} - -func (suite *DriverSuite) testFileStreams(c *check.C, size int64) { - tf, err := ioutil.TempFile("", "tf") - c.Assert(err, check.IsNil) - defer os.Remove(tf.Name()) - defer tf.Close() - - filename := randomPath(32) - defer suite.deletePath(c, firstPart(filename)) - - contents := randomContents(size) - - _, err = tf.Write(contents) - c.Assert(err, check.IsNil) - - tf.Sync() - tf.Seek(0, os.SEEK_SET) - - writer, err := suite.StorageDriver.Writer(suite.ctx, filename, false) - c.Assert(err, check.IsNil) - nn, err := io.Copy(writer, tf) - c.Assert(err, check.IsNil) - c.Assert(nn, check.Equals, size) - - err = writer.Commit() - c.Assert(err, check.IsNil) - err = writer.Close() - c.Assert(err, check.IsNil) - - reader, err := suite.StorageDriver.Reader(suite.ctx, filename, 0) - c.Assert(err, check.IsNil) - defer reader.Close() - - readContents, err := ioutil.ReadAll(reader) - c.Assert(err, check.IsNil) - - c.Assert(readContents, check.DeepEquals, contents) -} - -func (suite *DriverSuite) writeReadCompare(c *check.C, filename string, contents []byte) { - defer suite.deletePath(c, firstPart(filename)) - - err := suite.StorageDriver.PutContent(suite.ctx, filename, contents) - c.Assert(err, check.IsNil) - - readContents, err := suite.StorageDriver.GetContent(suite.ctx, filename) - c.Assert(err, check.IsNil) - - c.Assert(readContents, check.DeepEquals, contents) -} - -func (suite *DriverSuite) writeReadCompareStreams(c *check.C, filename string, contents []byte) { - defer suite.deletePath(c, firstPart(filename)) - - writer, err := suite.StorageDriver.Writer(suite.ctx, filename, false) - c.Assert(err, check.IsNil) - nn, err := io.Copy(writer, bytes.NewReader(contents)) - c.Assert(err, check.IsNil) - c.Assert(nn, check.Equals, int64(len(contents))) - - err = writer.Commit() - c.Assert(err, check.IsNil) - err = writer.Close() - c.Assert(err, check.IsNil) - - reader, err := suite.StorageDriver.Reader(suite.ctx, filename, 0) - c.Assert(err, check.IsNil) - defer reader.Close() - - readContents, err := ioutil.ReadAll(reader) - c.Assert(err, check.IsNil) - - c.Assert(readContents, check.DeepEquals, contents) -} - -var filenameChars = []byte("abcdefghijklmnopqrstuvwxyz0123456789") -var separatorChars = []byte("._-") - -func randomPath(length int64) string { - path := "/" - for int64(len(path)) < length { - chunkLength := rand.Int63n(length-int64(len(path))) + 1 - chunk := randomFilename(chunkLength) - path += chunk - remaining := length - int64(len(path)) - if remaining == 1 { - path += randomFilename(1) - } else if remaining > 1 { - path += "/" - } - } - return path -} - -func randomFilename(length int64) string { - b := make([]byte, length) - wasSeparator := true - for i := range b { - if !wasSeparator && i < len(b)-1 && rand.Intn(4) == 0 { - b[i] = separatorChars[rand.Intn(len(separatorChars))] - wasSeparator = true - } else { - b[i] = filenameChars[rand.Intn(len(filenameChars))] - wasSeparator = false - } - } - return string(b) -} - -// randomBytes pre-allocates all of the memory sizes needed for the test. If -// anything panics while accessing randomBytes, just make this number bigger. -var randomBytes = make([]byte, 128<<20) - -func init() { - _, _ = rand.Read(randomBytes) // always returns len(randomBytes) and nil error -} - -func randomContents(length int64) []byte { - return randomBytes[:length] -} - -type randReader struct { - r int64 - m sync.Mutex -} - -func (rr *randReader) Read(p []byte) (n int, err error) { - rr.m.Lock() - defer rr.m.Unlock() - - toread := int64(len(p)) - if toread > rr.r { - toread = rr.r - } - n = copy(p, randomContents(toread)) - rr.r -= int64(n) - - if rr.r <= 0 { - err = io.EOF - } - - return -} - -func newRandReader(n int64) *randReader { - return &randReader{r: n} -} - -func firstPart(filePath string) string { - if filePath == "" { - return "/" - } - for { - if filePath[len(filePath)-1] == '/' { - filePath = filePath[:len(filePath)-1] - } - - dir, file := path.Split(filePath) - if dir == "" && file == "" { - return "/" - } - if dir == "/" || dir == "" { - return "/" + file - } - if file == "" { - return dir - } - filePath = dir - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/filereader.go b/vendor/github.com/docker/distribution/registry/storage/filereader.go deleted file mode 100644 index 3b06c8179..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/filereader.go +++ /dev/null @@ -1,177 +0,0 @@ -package storage - -import ( - "bufio" - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - - "github.com/docker/distribution/context" - storagedriver "github.com/docker/distribution/registry/storage/driver" -) - -// TODO(stevvooe): Set an optimal buffer size here. We'll have to -// understand the latency characteristics of the underlying network to -// set this correctly, so we may want to leave it to the driver. For -// out of process drivers, we'll have to optimize this buffer size for -// local communication. -const fileReaderBufferSize = 4 << 20 - -// remoteFileReader provides a read seeker interface to files stored in -// storagedriver. Used to implement part of layer interface and will be used -// to implement read side of LayerUpload. -type fileReader struct { - driver storagedriver.StorageDriver - - ctx context.Context - - // identifying fields - path string - size int64 // size is the total size, must be set. - - // mutable fields - rc io.ReadCloser // remote read closer - brd *bufio.Reader // internal buffered io - offset int64 // offset is the current read offset - err error // terminal error, if set, reader is closed -} - -// newFileReader initializes a file reader for the remote file. The reader -// takes on the size and path that must be determined externally with a stat -// call. The reader operates optimistically, assuming that the file is already -// there. -func newFileReader(ctx context.Context, driver storagedriver.StorageDriver, path string, size int64) (*fileReader, error) { - return &fileReader{ - ctx: ctx, - driver: driver, - path: path, - size: size, - }, nil -} - -func (fr *fileReader) Read(p []byte) (n int, err error) { - if fr.err != nil { - return 0, fr.err - } - - rd, err := fr.reader() - if err != nil { - return 0, err - } - - n, err = rd.Read(p) - fr.offset += int64(n) - - // Simulate io.EOR error if we reach filesize. - if err == nil && fr.offset >= fr.size { - err = io.EOF - } - - return n, err -} - -func (fr *fileReader) Seek(offset int64, whence int) (int64, error) { - if fr.err != nil { - return 0, fr.err - } - - var err error - newOffset := fr.offset - - switch whence { - case os.SEEK_CUR: - newOffset += int64(offset) - case os.SEEK_END: - newOffset = fr.size + int64(offset) - case os.SEEK_SET: - newOffset = int64(offset) - } - - if newOffset < 0 { - err = fmt.Errorf("cannot seek to negative position") - } else { - if fr.offset != newOffset { - fr.reset() - } - - // No problems, set the offset. - fr.offset = newOffset - } - - return fr.offset, err -} - -func (fr *fileReader) Close() error { - return fr.closeWithErr(fmt.Errorf("fileReader: closed")) -} - -// reader prepares the current reader at the lrs offset, ensuring its buffered -// and ready to go. -func (fr *fileReader) reader() (io.Reader, error) { - if fr.err != nil { - return nil, fr.err - } - - if fr.rc != nil { - return fr.brd, nil - } - - // If we don't have a reader, open one up. - rc, err := fr.driver.Reader(fr.ctx, fr.path, fr.offset) - if err != nil { - switch err := err.(type) { - case storagedriver.PathNotFoundError: - // NOTE(stevvooe): If the path is not found, we simply return a - // reader that returns io.EOF. However, we do not set fr.rc, - // allowing future attempts at getting a reader to possibly - // succeed if the file turns up later. - return ioutil.NopCloser(bytes.NewReader([]byte{})), nil - default: - return nil, err - } - } - - fr.rc = rc - - if fr.brd == nil { - fr.brd = bufio.NewReaderSize(fr.rc, fileReaderBufferSize) - } else { - fr.brd.Reset(fr.rc) - } - - return fr.brd, nil -} - -// resetReader resets the reader, forcing the read method to open up a new -// connection and rebuild the buffered reader. This should be called when the -// offset and the reader will become out of sync, such as during a seek -// operation. -func (fr *fileReader) reset() { - if fr.err != nil { - return - } - if fr.rc != nil { - fr.rc.Close() - fr.rc = nil - } -} - -func (fr *fileReader) closeWithErr(err error) error { - if fr.err != nil { - return fr.err - } - - fr.err = err - - // close and release reader chain - if fr.rc != nil { - fr.rc.Close() - } - - fr.rc = nil - fr.brd = nil - - return fr.err -} diff --git a/vendor/github.com/docker/distribution/registry/storage/filereader_test.go b/vendor/github.com/docker/distribution/registry/storage/filereader_test.go deleted file mode 100644 index 5926020cc..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/filereader_test.go +++ /dev/null @@ -1,198 +0,0 @@ -package storage - -import ( - "bytes" - "io" - mrand "math/rand" - "os" - "testing" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/registry/storage/driver/inmemory" -) - -func TestSimpleRead(t *testing.T) { - ctx := context.Background() - content := make([]byte, 1<<20) - n, err := mrand.Read(content) - if err != nil { - t.Fatalf("unexpected error building random data: %v", err) - } - - if n != len(content) { - t.Fatalf("random read didn't fill buffer") - } - - dgst, err := digest.FromReader(bytes.NewReader(content)) - if err != nil { - t.Fatalf("unexpected error digesting random content: %v", err) - } - - driver := inmemory.New() - path := "/random" - - if err := driver.PutContent(ctx, path, content); err != nil { - t.Fatalf("error putting patterned content: %v", err) - } - - fr, err := newFileReader(ctx, driver, path, int64(len(content))) - if err != nil { - t.Fatalf("error allocating file reader: %v", err) - } - - verifier, err := digest.NewDigestVerifier(dgst) - if err != nil { - t.Fatalf("error getting digest verifier: %s", err) - } - - io.Copy(verifier, fr) - - if !verifier.Verified() { - t.Fatalf("unable to verify read data") - } -} - -func TestFileReaderSeek(t *testing.T) { - driver := inmemory.New() - pattern := "01234567890ab" // prime length block - repititions := 1024 - path := "/patterned" - content := bytes.Repeat([]byte(pattern), repititions) - ctx := context.Background() - - if err := driver.PutContent(ctx, path, content); err != nil { - t.Fatalf("error putting patterned content: %v", err) - } - - fr, err := newFileReader(ctx, driver, path, int64(len(content))) - - if err != nil { - t.Fatalf("unexpected error creating file reader: %v", err) - } - - // Seek all over the place, in blocks of pattern size and make sure we get - // the right data. - for _, repitition := range mrand.Perm(repititions - 1) { - targetOffset := int64(len(pattern) * repitition) - // Seek to a multiple of pattern size and read pattern size bytes - offset, err := fr.Seek(targetOffset, os.SEEK_SET) - if err != nil { - t.Fatalf("unexpected error seeking: %v", err) - } - - if offset != targetOffset { - t.Fatalf("did not seek to correct offset: %d != %d", offset, targetOffset) - } - - p := make([]byte, len(pattern)) - - n, err := fr.Read(p) - if err != nil { - t.Fatalf("error reading pattern: %v", err) - } - - if n != len(pattern) { - t.Fatalf("incorrect read length: %d != %d", n, len(pattern)) - } - - if string(p) != pattern { - t.Fatalf("incorrect read content: %q != %q", p, pattern) - } - - // Check offset - current, err := fr.Seek(0, os.SEEK_CUR) - if err != nil { - t.Fatalf("error checking current offset: %v", err) - } - - if current != targetOffset+int64(len(pattern)) { - t.Fatalf("unexpected offset after read: %v", err) - } - } - - start, err := fr.Seek(0, os.SEEK_SET) - if err != nil { - t.Fatalf("error seeking to start: %v", err) - } - - if start != 0 { - t.Fatalf("expected to seek to start: %v != 0", start) - } - - end, err := fr.Seek(0, os.SEEK_END) - if err != nil { - t.Fatalf("error checking current offset: %v", err) - } - - if end != int64(len(content)) { - t.Fatalf("expected to seek to end: %v != %v", end, len(content)) - } - - // 4. Seek before start, ensure error. - - // seek before start - before, err := fr.Seek(-1, os.SEEK_SET) - if err == nil { - t.Fatalf("error expected, returned offset=%v", before) - } - - // 5. Seek after end, - after, err := fr.Seek(1, os.SEEK_END) - if err != nil { - t.Fatalf("unexpected error expected, returned offset=%v", after) - } - - p := make([]byte, 16) - n, err := fr.Read(p) - - if n != 0 { - t.Fatalf("bytes reads %d != %d", n, 0) - } - - if err != io.EOF { - t.Fatalf("expected io.EOF, got %v", err) - } -} - -// TestFileReaderNonExistentFile ensures the reader behaves as expected with a -// missing or zero-length remote file. While the file may not exist, the -// reader should not error out on creation and should return 0-bytes from the -// read method, with an io.EOF error. -func TestFileReaderNonExistentFile(t *testing.T) { - driver := inmemory.New() - fr, err := newFileReader(context.Background(), driver, "/doesnotexist", 10) - if err != nil { - t.Fatalf("unexpected error initializing reader: %v", err) - } - - var buf [1024]byte - - n, err := fr.Read(buf[:]) - if n != 0 { - t.Fatalf("non-zero byte read reported: %d != 0", n) - } - - if err != io.EOF { - t.Fatalf("read on missing file should return io.EOF, got %v", err) - } -} - -// TestLayerReadErrors covers the various error return type for different -// conditions that can arise when reading a layer. -func TestFileReaderErrors(t *testing.T) { - // TODO(stevvooe): We need to cover error return types, driven by the - // errors returned via the HTTP API. For now, here is an incomplete list: - // - // 1. Layer Not Found: returned when layer is not found or access is - // denied. - // 2. Layer Unavailable: returned when link references are unresolved, - // but layer is known to the registry. - // 3. Layer Invalid: This may more split into more errors, but should be - // returned when name or tarsum does not reference a valid error. We - // may also need something to communication layer verification errors - // for the inline tarsum check. - // 4. Timeout: timeouts to backend. Need to better understand these - // failure cases and how the storage driver propagates these errors - // up the stack. -} diff --git a/vendor/github.com/docker/distribution/registry/storage/garbagecollect.go b/vendor/github.com/docker/distribution/registry/storage/garbagecollect.go deleted file mode 100644 index 7cf0298e1..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/garbagecollect.go +++ /dev/null @@ -1,114 +0,0 @@ -package storage - -import ( - "fmt" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/driver" -) - -func emit(format string, a ...interface{}) { - fmt.Printf(format+"\n", a...) -} - -// MarkAndSweep performs a mark and sweep of registry data -func MarkAndSweep(ctx context.Context, storageDriver driver.StorageDriver, registry distribution.Namespace, dryRun bool) error { - repositoryEnumerator, ok := registry.(distribution.RepositoryEnumerator) - if !ok { - return fmt.Errorf("unable to convert Namespace to RepositoryEnumerator") - } - - // mark - markSet := make(map[digest.Digest]struct{}) - err := repositoryEnumerator.Enumerate(ctx, func(repoName string) error { - emit(repoName) - - var err error - named, err := reference.ParseNamed(repoName) - if err != nil { - return fmt.Errorf("failed to parse repo name %s: %v", repoName, err) - } - repository, err := registry.Repository(ctx, named) - if err != nil { - return fmt.Errorf("failed to construct repository: %v", err) - } - - manifestService, err := repository.Manifests(ctx) - if err != nil { - return fmt.Errorf("failed to construct manifest service: %v", err) - } - - manifestEnumerator, ok := manifestService.(distribution.ManifestEnumerator) - if !ok { - return fmt.Errorf("unable to convert ManifestService into ManifestEnumerator") - } - - err = manifestEnumerator.Enumerate(ctx, func(dgst digest.Digest) error { - // Mark the manifest's blob - emit("%s: marking manifest %s ", repoName, dgst) - markSet[dgst] = struct{}{} - - manifest, err := manifestService.Get(ctx, dgst) - if err != nil { - return fmt.Errorf("failed to retrieve manifest for digest %v: %v", dgst, err) - } - - descriptors := manifest.References() - for _, descriptor := range descriptors { - markSet[descriptor.Digest] = struct{}{} - emit("%s: marking blob %s", repoName, descriptor.Digest) - } - - return nil - }) - - if err != nil { - // In certain situations such as unfinished uploads, deleting all - // tags in S3 or removing the _manifests folder manually, this - // error may be of type PathNotFound. - // - // In these cases we can continue marking other manifests safely. - if _, ok := err.(driver.PathNotFoundError); ok { - return nil - } - } - - return err - }) - - if err != nil { - return fmt.Errorf("failed to mark: %v", err) - } - - // sweep - blobService := registry.Blobs() - deleteSet := make(map[digest.Digest]struct{}) - err = blobService.Enumerate(ctx, func(dgst digest.Digest) error { - // check if digest is in markSet. If not, delete it! - if _, ok := markSet[dgst]; !ok { - deleteSet[dgst] = struct{}{} - } - return nil - }) - if err != nil { - return fmt.Errorf("error enumerating blobs: %v", err) - } - emit("\n%d blobs marked, %d blobs eligible for deletion", len(markSet), len(deleteSet)) - // Construct vacuum - vacuum := NewVacuum(ctx, storageDriver) - for dgst := range deleteSet { - emit("blob eligible for deletion: %s", dgst) - if dryRun { - continue - } - err = vacuum.RemoveBlob(string(dgst)) - if err != nil { - return fmt.Errorf("failed to delete blob %s: %v", dgst, err) - } - } - - return err -} diff --git a/vendor/github.com/docker/distribution/registry/storage/garbagecollect_test.go b/vendor/github.com/docker/distribution/registry/storage/garbagecollect_test.go deleted file mode 100644 index 925f1a10f..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/garbagecollect_test.go +++ /dev/null @@ -1,377 +0,0 @@ -package storage - -import ( - "io" - "path" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/inmemory" - "github.com/docker/distribution/testutil" - "github.com/docker/libtrust" -) - -type image struct { - manifest distribution.Manifest - manifestDigest digest.Digest - layers map[digest.Digest]io.ReadSeeker -} - -func createRegistry(t *testing.T, driver driver.StorageDriver, options ...RegistryOption) distribution.Namespace { - ctx := context.Background() - k, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatal(err) - } - options = append([]RegistryOption{EnableDelete, Schema1SigningKey(k)}, options...) - registry, err := NewRegistry(ctx, driver, options...) - if err != nil { - t.Fatalf("Failed to construct namespace") - } - return registry -} - -func makeRepository(t *testing.T, registry distribution.Namespace, name string) distribution.Repository { - ctx := context.Background() - - // Initialize a dummy repository - named, err := reference.ParseNamed(name) - if err != nil { - t.Fatalf("Failed to parse name %s: %v", name, err) - } - - repo, err := registry.Repository(ctx, named) - if err != nil { - t.Fatalf("Failed to construct repository: %v", err) - } - return repo -} - -func makeManifestService(t *testing.T, repository distribution.Repository) distribution.ManifestService { - ctx := context.Background() - - manifestService, err := repository.Manifests(ctx) - if err != nil { - t.Fatalf("Failed to construct manifest store: %v", err) - } - return manifestService -} - -func allBlobs(t *testing.T, registry distribution.Namespace) map[digest.Digest]struct{} { - ctx := context.Background() - blobService := registry.Blobs() - allBlobsMap := make(map[digest.Digest]struct{}) - err := blobService.Enumerate(ctx, func(dgst digest.Digest) error { - allBlobsMap[dgst] = struct{}{} - return nil - }) - if err != nil { - t.Fatalf("Error getting all blobs: %v", err) - } - return allBlobsMap -} - -func uploadImage(t *testing.T, repository distribution.Repository, im image) digest.Digest { - // upload layers - err := testutil.UploadBlobs(repository, im.layers) - if err != nil { - t.Fatalf("layer upload failed: %v", err) - } - - // upload manifest - ctx := context.Background() - manifestService := makeManifestService(t, repository) - manifestDigest, err := manifestService.Put(ctx, im.manifest) - if err != nil { - t.Fatalf("manifest upload failed: %v", err) - } - - return manifestDigest -} - -func uploadRandomSchema1Image(t *testing.T, repository distribution.Repository) image { - randomLayers, err := testutil.CreateRandomLayers(2) - if err != nil { - t.Fatalf("%v", err) - } - - digests := []digest.Digest{} - for digest := range randomLayers { - digests = append(digests, digest) - } - - manifest, err := testutil.MakeSchema1Manifest(digests) - if err != nil { - t.Fatalf("%v", err) - } - - manifestDigest := uploadImage(t, repository, image{manifest: manifest, layers: randomLayers}) - return image{ - manifest: manifest, - manifestDigest: manifestDigest, - layers: randomLayers, - } -} - -func uploadRandomSchema2Image(t *testing.T, repository distribution.Repository) image { - randomLayers, err := testutil.CreateRandomLayers(2) - if err != nil { - t.Fatalf("%v", err) - } - - digests := []digest.Digest{} - for digest := range randomLayers { - digests = append(digests, digest) - } - - manifest, err := testutil.MakeSchema2Manifest(repository, digests) - if err != nil { - t.Fatalf("%v", err) - } - - manifestDigest := uploadImage(t, repository, image{manifest: manifest, layers: randomLayers}) - return image{ - manifest: manifest, - manifestDigest: manifestDigest, - layers: randomLayers, - } -} - -func TestNoDeletionNoEffect(t *testing.T) { - ctx := context.Background() - inmemoryDriver := inmemory.New() - - registry := createRegistry(t, inmemoryDriver) - repo := makeRepository(t, registry, "palailogos") - manifestService, err := repo.Manifests(ctx) - - image1 := uploadRandomSchema1Image(t, repo) - image2 := uploadRandomSchema1Image(t, repo) - uploadRandomSchema2Image(t, repo) - - // construct manifestlist for fun. - blobstatter := registry.BlobStatter() - manifestList, err := testutil.MakeManifestList(blobstatter, []digest.Digest{ - image1.manifestDigest, image2.manifestDigest}) - if err != nil { - t.Fatalf("Failed to make manifest list: %v", err) - } - - _, err = manifestService.Put(ctx, manifestList) - if err != nil { - t.Fatalf("Failed to add manifest list: %v", err) - } - - before := allBlobs(t, registry) - - // Run GC - err = MarkAndSweep(context.Background(), inmemoryDriver, registry, false) - if err != nil { - t.Fatalf("Failed mark and sweep: %v", err) - } - - after := allBlobs(t, registry) - if len(before) != len(after) { - t.Fatalf("Garbage collection affected storage: %d != %d", len(before), len(after)) - } -} - -func TestGCWithMissingManifests(t *testing.T) { - ctx := context.Background() - d := inmemory.New() - - registry := createRegistry(t, d) - repo := makeRepository(t, registry, "testrepo") - uploadRandomSchema1Image(t, repo) - - // Simulate a missing _manifests directory - revPath, err := pathFor(manifestRevisionsPathSpec{"testrepo"}) - if err != nil { - t.Fatal(err) - } - - _manifestsPath := path.Dir(revPath) - err = d.Delete(ctx, _manifestsPath) - if err != nil { - t.Fatal(err) - } - - err = MarkAndSweep(context.Background(), d, registry, false) - if err != nil { - t.Fatalf("Failed mark and sweep: %v", err) - } - - blobs := allBlobs(t, registry) - if len(blobs) > 0 { - t.Errorf("unexpected blobs after gc") - } -} - -func TestDeletionHasEffect(t *testing.T) { - ctx := context.Background() - inmemoryDriver := inmemory.New() - - registry := createRegistry(t, inmemoryDriver) - repo := makeRepository(t, registry, "komnenos") - manifests, err := repo.Manifests(ctx) - - image1 := uploadRandomSchema1Image(t, repo) - image2 := uploadRandomSchema1Image(t, repo) - image3 := uploadRandomSchema2Image(t, repo) - - manifests.Delete(ctx, image2.manifestDigest) - manifests.Delete(ctx, image3.manifestDigest) - - // Run GC - err = MarkAndSweep(context.Background(), inmemoryDriver, registry, false) - if err != nil { - t.Fatalf("Failed mark and sweep: %v", err) - } - - blobs := allBlobs(t, registry) - - // check that the image1 manifest and all the layers are still in blobs - if _, ok := blobs[image1.manifestDigest]; !ok { - t.Fatalf("First manifest is missing") - } - - for layer := range image1.layers { - if _, ok := blobs[layer]; !ok { - t.Fatalf("manifest 1 layer is missing: %v", layer) - } - } - - // check that image2 and image3 layers are not still around - for layer := range image2.layers { - if _, ok := blobs[layer]; ok { - t.Fatalf("manifest 2 layer is present: %v", layer) - } - } - - for layer := range image3.layers { - if _, ok := blobs[layer]; ok { - t.Fatalf("manifest 3 layer is present: %v", layer) - } - } -} - -func getAnyKey(digests map[digest.Digest]io.ReadSeeker) (d digest.Digest) { - for d = range digests { - break - } - return -} - -func getKeys(digests map[digest.Digest]io.ReadSeeker) (ds []digest.Digest) { - for d := range digests { - ds = append(ds, d) - } - return -} - -func TestDeletionWithSharedLayer(t *testing.T) { - ctx := context.Background() - inmemoryDriver := inmemory.New() - - registry := createRegistry(t, inmemoryDriver) - repo := makeRepository(t, registry, "tzimiskes") - - // Create random layers - randomLayers1, err := testutil.CreateRandomLayers(3) - if err != nil { - t.Fatalf("failed to make layers: %v", err) - } - - randomLayers2, err := testutil.CreateRandomLayers(3) - if err != nil { - t.Fatalf("failed to make layers: %v", err) - } - - // Upload all layers - err = testutil.UploadBlobs(repo, randomLayers1) - if err != nil { - t.Fatalf("failed to upload layers: %v", err) - } - - err = testutil.UploadBlobs(repo, randomLayers2) - if err != nil { - t.Fatalf("failed to upload layers: %v", err) - } - - // Construct manifests - manifest1, err := testutil.MakeSchema1Manifest(getKeys(randomLayers1)) - if err != nil { - t.Fatalf("failed to make manifest: %v", err) - } - - sharedKey := getAnyKey(randomLayers1) - manifest2, err := testutil.MakeSchema2Manifest(repo, append(getKeys(randomLayers2), sharedKey)) - if err != nil { - t.Fatalf("failed to make manifest: %v", err) - } - - manifestService := makeManifestService(t, repo) - - // Upload manifests - _, err = manifestService.Put(ctx, manifest1) - if err != nil { - t.Fatalf("manifest upload failed: %v", err) - } - - manifestDigest2, err := manifestService.Put(ctx, manifest2) - if err != nil { - t.Fatalf("manifest upload failed: %v", err) - } - - // delete - err = manifestService.Delete(ctx, manifestDigest2) - if err != nil { - t.Fatalf("manifest deletion failed: %v", err) - } - - // check that all of the layers in layer 1 are still there - blobs := allBlobs(t, registry) - for dgst := range randomLayers1 { - if _, ok := blobs[dgst]; !ok { - t.Fatalf("random layer 1 blob missing: %v", dgst) - } - } -} - -func TestOrphanBlobDeleted(t *testing.T) { - inmemoryDriver := inmemory.New() - - registry := createRegistry(t, inmemoryDriver) - repo := makeRepository(t, registry, "michael_z_doukas") - - digests, err := testutil.CreateRandomLayers(1) - if err != nil { - t.Fatalf("Failed to create random digest: %v", err) - } - - if err = testutil.UploadBlobs(repo, digests); err != nil { - t.Fatalf("Failed to upload blob: %v", err) - } - - // formality to create the necessary directories - uploadRandomSchema2Image(t, repo) - - // Run GC - err = MarkAndSweep(context.Background(), inmemoryDriver, registry, false) - if err != nil { - t.Fatalf("Failed mark and sweep: %v", err) - } - - blobs := allBlobs(t, registry) - - // check that orphan blob layers are not still around - for dgst := range digests { - if _, ok := blobs[dgst]; ok { - t.Fatalf("Orphan layer is present: %v", dgst) - } - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/io.go b/vendor/github.com/docker/distribution/registry/storage/io.go deleted file mode 100644 index c1be3b771..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/io.go +++ /dev/null @@ -1,71 +0,0 @@ -package storage - -import ( - "errors" - "io" - "io/ioutil" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/storage/driver" -) - -const ( - maxBlobGetSize = 4 << 20 -) - -func getContent(ctx context.Context, driver driver.StorageDriver, p string) ([]byte, error) { - r, err := driver.Reader(ctx, p, 0) - if err != nil { - return nil, err - } - - return readAllLimited(r, maxBlobGetSize) -} - -func readAllLimited(r io.Reader, limit int64) ([]byte, error) { - r = limitReader(r, limit) - return ioutil.ReadAll(r) -} - -// limitReader returns a new reader limited to n bytes. Unlike io.LimitReader, -// this returns an error when the limit reached. -func limitReader(r io.Reader, n int64) io.Reader { - return &limitedReader{r: r, n: n} -} - -// limitedReader implements a reader that errors when the limit is reached. -// -// Partially cribbed from net/http.MaxBytesReader. -type limitedReader struct { - r io.Reader // underlying reader - n int64 // max bytes remaining - err error // sticky error -} - -func (l *limitedReader) Read(p []byte) (n int, err error) { - if l.err != nil { - return 0, l.err - } - if len(p) == 0 { - return 0, nil - } - // If they asked for a 32KB byte read but only 5 bytes are - // remaining, no need to read 32KB. 6 bytes will answer the - // question of the whether we hit the limit or go past it. - if int64(len(p)) > l.n+1 { - p = p[:l.n+1] - } - n, err = l.r.Read(p) - - if int64(n) <= l.n { - l.n -= int64(n) - l.err = err - return n, err - } - - n = int(l.n) - l.n = 0 - - l.err = errors.New("storage: read exceeds limit") - return n, l.err -} diff --git a/vendor/github.com/docker/distribution/registry/storage/linkedblobstore.go b/vendor/github.com/docker/distribution/registry/storage/linkedblobstore.go deleted file mode 100644 index 6a5e8d033..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/linkedblobstore.go +++ /dev/null @@ -1,470 +0,0 @@ -package storage - -import ( - "fmt" - "net/http" - "path" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/uuid" -) - -// linkPathFunc describes a function that can resolve a link based on the -// repository name and digest. -type linkPathFunc func(name string, dgst digest.Digest) (string, error) - -// linkedBlobStore provides a full BlobService that namespaces the blobs to a -// given repository. Effectively, it manages the links in a given repository -// that grant access to the global blob store. -type linkedBlobStore struct { - *blobStore - registry *registry - blobServer distribution.BlobServer - blobAccessController distribution.BlobDescriptorService - repository distribution.Repository - ctx context.Context // only to be used where context can't come through method args - deleteEnabled bool - resumableDigestEnabled bool - - // linkPathFns specifies one or more path functions allowing one to - // control the repository blob link set to which the blob store - // dispatches. This is required because manifest and layer blobs have not - // yet been fully merged. At some point, this functionality should be - // removed the blob links folder should be merged. The first entry is - // treated as the "canonical" link location and will be used for writes. - linkPathFns []linkPathFunc - - // linkDirectoryPathSpec locates the root directories in which one might find links - linkDirectoryPathSpec pathSpec -} - -var _ distribution.BlobStore = &linkedBlobStore{} - -func (lbs *linkedBlobStore) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - return lbs.blobAccessController.Stat(ctx, dgst) -} - -func (lbs *linkedBlobStore) Get(ctx context.Context, dgst digest.Digest) ([]byte, error) { - canonical, err := lbs.Stat(ctx, dgst) // access check - if err != nil { - return nil, err - } - - return lbs.blobStore.Get(ctx, canonical.Digest) -} - -func (lbs *linkedBlobStore) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { - canonical, err := lbs.Stat(ctx, dgst) // access check - if err != nil { - return nil, err - } - - return lbs.blobStore.Open(ctx, canonical.Digest) -} - -func (lbs *linkedBlobStore) ServeBlob(ctx context.Context, w http.ResponseWriter, r *http.Request, dgst digest.Digest) error { - canonical, err := lbs.Stat(ctx, dgst) // access check - if err != nil { - return err - } - - if canonical.MediaType != "" { - // Set the repository local content type. - w.Header().Set("Content-Type", canonical.MediaType) - } - - return lbs.blobServer.ServeBlob(ctx, w, r, canonical.Digest) -} - -func (lbs *linkedBlobStore) Put(ctx context.Context, mediaType string, p []byte) (distribution.Descriptor, error) { - dgst := digest.FromBytes(p) - // Place the data in the blob store first. - desc, err := lbs.blobStore.Put(ctx, mediaType, p) - if err != nil { - context.GetLogger(ctx).Errorf("error putting into main store: %v", err) - return distribution.Descriptor{}, err - } - - if err := lbs.blobAccessController.SetDescriptor(ctx, dgst, desc); err != nil { - return distribution.Descriptor{}, err - } - - // TODO(stevvooe): Write out mediatype if incoming differs from what is - // returned by Put above. Note that we should allow updates for a given - // repository. - - return desc, lbs.linkBlob(ctx, desc) -} - -type optionFunc func(interface{}) error - -func (f optionFunc) Apply(v interface{}) error { - return f(v) -} - -// WithMountFrom returns a BlobCreateOption which designates that the blob should be -// mounted from the given canonical reference. -func WithMountFrom(ref reference.Canonical) distribution.BlobCreateOption { - return optionFunc(func(v interface{}) error { - opts, ok := v.(*distribution.CreateOptions) - if !ok { - return fmt.Errorf("unexpected options type: %T", v) - } - - opts.Mount.ShouldMount = true - opts.Mount.From = ref - - return nil - }) -} - -// Writer begins a blob write session, returning a handle. -func (lbs *linkedBlobStore) Create(ctx context.Context, options ...distribution.BlobCreateOption) (distribution.BlobWriter, error) { - context.GetLogger(ctx).Debug("(*linkedBlobStore).Writer") - - var opts distribution.CreateOptions - - for _, option := range options { - err := option.Apply(&opts) - if err != nil { - return nil, err - } - } - - if opts.Mount.ShouldMount { - desc, err := lbs.mount(ctx, opts.Mount.From, opts.Mount.From.Digest(), opts.Mount.Stat) - if err == nil { - // Mount successful, no need to initiate an upload session - return nil, distribution.ErrBlobMounted{From: opts.Mount.From, Descriptor: desc} - } - } - - uuid := uuid.Generate().String() - startedAt := time.Now().UTC() - - path, err := pathFor(uploadDataPathSpec{ - name: lbs.repository.Named().Name(), - id: uuid, - }) - - if err != nil { - return nil, err - } - - startedAtPath, err := pathFor(uploadStartedAtPathSpec{ - name: lbs.repository.Named().Name(), - id: uuid, - }) - - if err != nil { - return nil, err - } - - // Write a startedat file for this upload - if err := lbs.blobStore.driver.PutContent(ctx, startedAtPath, []byte(startedAt.Format(time.RFC3339))); err != nil { - return nil, err - } - - return lbs.newBlobUpload(ctx, uuid, path, startedAt, false) -} - -func (lbs *linkedBlobStore) Resume(ctx context.Context, id string) (distribution.BlobWriter, error) { - context.GetLogger(ctx).Debug("(*linkedBlobStore).Resume") - - startedAtPath, err := pathFor(uploadStartedAtPathSpec{ - name: lbs.repository.Named().Name(), - id: id, - }) - - if err != nil { - return nil, err - } - - startedAtBytes, err := lbs.blobStore.driver.GetContent(ctx, startedAtPath) - if err != nil { - switch err := err.(type) { - case driver.PathNotFoundError: - return nil, distribution.ErrBlobUploadUnknown - default: - return nil, err - } - } - - startedAt, err := time.Parse(time.RFC3339, string(startedAtBytes)) - if err != nil { - return nil, err - } - - path, err := pathFor(uploadDataPathSpec{ - name: lbs.repository.Named().Name(), - id: id, - }) - - if err != nil { - return nil, err - } - - return lbs.newBlobUpload(ctx, id, path, startedAt, true) -} - -func (lbs *linkedBlobStore) Delete(ctx context.Context, dgst digest.Digest) error { - if !lbs.deleteEnabled { - return distribution.ErrUnsupported - } - - // Ensure the blob is available for deletion - _, err := lbs.blobAccessController.Stat(ctx, dgst) - if err != nil { - return err - } - - err = lbs.blobAccessController.Clear(ctx, dgst) - if err != nil { - return err - } - - return nil -} - -func (lbs *linkedBlobStore) Enumerate(ctx context.Context, ingestor func(digest.Digest) error) error { - rootPath, err := pathFor(lbs.linkDirectoryPathSpec) - if err != nil { - return err - } - err = Walk(ctx, lbs.blobStore.driver, rootPath, func(fileInfo driver.FileInfo) error { - // exit early if directory... - if fileInfo.IsDir() { - return nil - } - filePath := fileInfo.Path() - - // check if it's a link - _, fileName := path.Split(filePath) - if fileName != "link" { - return nil - } - - // read the digest found in link - digest, err := lbs.blobStore.readlink(ctx, filePath) - if err != nil { - return err - } - - // ensure this conforms to the linkPathFns - _, err = lbs.Stat(ctx, digest) - if err != nil { - // we expect this error to occur so we move on - if err == distribution.ErrBlobUnknown { - return nil - } - return err - } - - err = ingestor(digest) - if err != nil { - return err - } - - return nil - }) - - if err != nil { - return err - } - - return nil -} - -func (lbs *linkedBlobStore) mount(ctx context.Context, sourceRepo reference.Named, dgst digest.Digest, sourceStat *distribution.Descriptor) (distribution.Descriptor, error) { - var stat distribution.Descriptor - if sourceStat == nil { - // look up the blob info from the sourceRepo if not already provided - repo, err := lbs.registry.Repository(ctx, sourceRepo) - if err != nil { - return distribution.Descriptor{}, err - } - stat, err = repo.Blobs(ctx).Stat(ctx, dgst) - if err != nil { - return distribution.Descriptor{}, err - } - } else { - // use the provided blob info - stat = *sourceStat - } - - desc := distribution.Descriptor{ - Size: stat.Size, - - // NOTE(stevvooe): The central blob store firewalls media types from - // other users. The caller should look this up and override the value - // for the specific repository. - MediaType: "application/octet-stream", - Digest: dgst, - } - return desc, lbs.linkBlob(ctx, desc) -} - -// newBlobUpload allocates a new upload controller with the given state. -func (lbs *linkedBlobStore) newBlobUpload(ctx context.Context, uuid, path string, startedAt time.Time, append bool) (distribution.BlobWriter, error) { - fw, err := lbs.driver.Writer(ctx, path, append) - if err != nil { - return nil, err - } - - bw := &blobWriter{ - ctx: ctx, - blobStore: lbs, - id: uuid, - startedAt: startedAt, - digester: digest.Canonical.New(), - fileWriter: fw, - driver: lbs.driver, - path: path, - resumableDigestEnabled: lbs.resumableDigestEnabled, - } - - return bw, nil -} - -// linkBlob links a valid, written blob into the registry under the named -// repository for the upload controller. -func (lbs *linkedBlobStore) linkBlob(ctx context.Context, canonical distribution.Descriptor, aliases ...digest.Digest) error { - dgsts := append([]digest.Digest{canonical.Digest}, aliases...) - - // TODO(stevvooe): Need to write out mediatype for only canonical hash - // since we don't care about the aliases. They are generally unused except - // for tarsum but those versions don't care about mediatype. - - // Don't make duplicate links. - seenDigests := make(map[digest.Digest]struct{}, len(dgsts)) - - // only use the first link - linkPathFn := lbs.linkPathFns[0] - - for _, dgst := range dgsts { - if _, seen := seenDigests[dgst]; seen { - continue - } - seenDigests[dgst] = struct{}{} - - blobLinkPath, err := linkPathFn(lbs.repository.Named().Name(), dgst) - if err != nil { - return err - } - - if err := lbs.blobStore.link(ctx, blobLinkPath, canonical.Digest); err != nil { - return err - } - } - - return nil -} - -type linkedBlobStatter struct { - *blobStore - repository distribution.Repository - - // linkPathFns specifies one or more path functions allowing one to - // control the repository blob link set to which the blob store - // dispatches. This is required because manifest and layer blobs have not - // yet been fully merged. At some point, this functionality should be - // removed an the blob links folder should be merged. The first entry is - // treated as the "canonical" link location and will be used for writes. - linkPathFns []linkPathFunc -} - -var _ distribution.BlobDescriptorService = &linkedBlobStatter{} - -func (lbs *linkedBlobStatter) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - var ( - found bool - target digest.Digest - ) - - // try the many link path functions until we get success or an error that - // is not PathNotFoundError. - for _, linkPathFn := range lbs.linkPathFns { - var err error - target, err = lbs.resolveWithLinkFunc(ctx, dgst, linkPathFn) - - if err == nil { - found = true - break // success! - } - - switch err := err.(type) { - case driver.PathNotFoundError: - // do nothing, just move to the next linkPathFn - default: - return distribution.Descriptor{}, err - } - } - - if !found { - return distribution.Descriptor{}, distribution.ErrBlobUnknown - } - - if target != dgst { - // Track when we are doing cross-digest domain lookups. ie, sha512 to sha256. - context.GetLogger(ctx).Warnf("looking up blob with canonical target: %v -> %v", dgst, target) - } - - // TODO(stevvooe): Look up repository local mediatype and replace that on - // the returned descriptor. - - return lbs.blobStore.statter.Stat(ctx, target) -} - -func (lbs *linkedBlobStatter) Clear(ctx context.Context, dgst digest.Digest) (err error) { - // clear any possible existence of a link described in linkPathFns - for _, linkPathFn := range lbs.linkPathFns { - blobLinkPath, err := linkPathFn(lbs.repository.Named().Name(), dgst) - if err != nil { - return err - } - - err = lbs.blobStore.driver.Delete(ctx, blobLinkPath) - if err != nil { - switch err := err.(type) { - case driver.PathNotFoundError: - continue // just ignore this error and continue - default: - return err - } - } - } - - return nil -} - -// resolveTargetWithFunc allows us to read a link to a resource with different -// linkPathFuncs to let us try a few different paths before returning not -// found. -func (lbs *linkedBlobStatter) resolveWithLinkFunc(ctx context.Context, dgst digest.Digest, linkPathFn linkPathFunc) (digest.Digest, error) { - blobLinkPath, err := linkPathFn(lbs.repository.Named().Name(), dgst) - if err != nil { - return "", err - } - - return lbs.blobStore.readlink(ctx, blobLinkPath) -} - -func (lbs *linkedBlobStatter) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { - // The canonical descriptor for a blob is set at the commit phase of upload - return nil -} - -// blobLinkPath provides the path to the blob link, also known as layers. -func blobLinkPath(name string, dgst digest.Digest) (string, error) { - return pathFor(layerLinkPathSpec{name: name, digest: dgst}) -} - -// manifestRevisionLinkPath provides the path to the manifest revision link. -func manifestRevisionLinkPath(name string, dgst digest.Digest) (string, error) { - return pathFor(manifestRevisionLinkPathSpec{name: name, revision: dgst}) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/linkedblobstore_test.go b/vendor/github.com/docker/distribution/registry/storage/linkedblobstore_test.go deleted file mode 100644 index f0f63d87b..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/linkedblobstore_test.go +++ /dev/null @@ -1,217 +0,0 @@ -package storage - -import ( - "fmt" - "io" - "reflect" - "strconv" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - - "github.com/docker/distribution/reference" - "github.com/docker/distribution/testutil" -) - -func TestLinkedBlobStoreCreateWithMountFrom(t *testing.T) { - fooRepoName, _ := reference.ParseNamed("nm/foo") - fooEnv := newManifestStoreTestEnv(t, fooRepoName, "thetag") - ctx := context.Background() - stats, err := mockRegistry(t, fooEnv.registry) - if err != nil { - t.Fatal(err) - } - - // Build up some test layers and add them to the manifest, saving the - // readseekers for upload later. - testLayers := map[digest.Digest]io.ReadSeeker{} - for i := 0; i < 2; i++ { - rs, ds, err := testutil.CreateRandomTarFile() - if err != nil { - t.Fatalf("unexpected error generating test layer file") - } - dgst := digest.Digest(ds) - - testLayers[digest.Digest(dgst)] = rs - } - - // upload the layers to foo/bar - for dgst, rs := range testLayers { - wr, err := fooEnv.repository.Blobs(fooEnv.ctx).Create(fooEnv.ctx) - if err != nil { - t.Fatalf("unexpected error creating test upload: %v", err) - } - - if _, err := io.Copy(wr, rs); err != nil { - t.Fatalf("unexpected error copying to upload: %v", err) - } - - if _, err := wr.Commit(fooEnv.ctx, distribution.Descriptor{Digest: dgst}); err != nil { - t.Fatalf("unexpected error finishing upload: %v", err) - } - } - - // create another repository nm/bar - barRepoName, _ := reference.ParseNamed("nm/bar") - barRepo, err := fooEnv.registry.Repository(ctx, barRepoName) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - - // cross-repo mount the test layers into a nm/bar - for dgst := range testLayers { - fooCanonical, _ := reference.WithDigest(fooRepoName, dgst) - option := WithMountFrom(fooCanonical) - // ensure we can instrospect it - createOpts := distribution.CreateOptions{} - if err := option.Apply(&createOpts); err != nil { - t.Fatalf("failed to apply MountFrom option: %v", err) - } - if !createOpts.Mount.ShouldMount || createOpts.Mount.From.String() != fooCanonical.String() { - t.Fatalf("unexpected create options: %#+v", createOpts.Mount) - } - - _, err := barRepo.Blobs(ctx).Create(ctx, WithMountFrom(fooCanonical)) - if err == nil { - t.Fatalf("unexpected non-error while mounting from %q: %v", fooRepoName.String(), err) - } - if _, ok := err.(distribution.ErrBlobMounted); !ok { - t.Fatalf("expected ErrMountFrom error, not %T: %v", err, err) - } - } - for dgst := range testLayers { - fooCanonical, _ := reference.WithDigest(fooRepoName, dgst) - count, exists := stats[fooCanonical.String()] - if !exists { - t.Errorf("expected entry %q not found among handled stat calls", fooCanonical.String()) - } else if count != 1 { - t.Errorf("expected exactly one stat call for entry %q, not %d", fooCanonical.String(), count) - } - } - - clearStats(stats) - - // create yet another repository nm/baz - bazRepoName, _ := reference.ParseNamed("nm/baz") - bazRepo, err := fooEnv.registry.Repository(ctx, bazRepoName) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - - // cross-repo mount them into a nm/baz and provide a prepopulated blob descriptor - for dgst := range testLayers { - fooCanonical, _ := reference.WithDigest(fooRepoName, dgst) - size, err := strconv.ParseInt("0x"+dgst.Hex()[:8], 0, 64) - if err != nil { - t.Fatal(err) - } - prepolutatedDescriptor := distribution.Descriptor{ - Digest: dgst, - Size: size, - MediaType: "application/octet-stream", - } - _, err = bazRepo.Blobs(ctx).Create(ctx, WithMountFrom(fooCanonical), &statCrossMountCreateOption{ - desc: prepolutatedDescriptor, - }) - blobMounted, ok := err.(distribution.ErrBlobMounted) - if !ok { - t.Errorf("expected ErrMountFrom error, not %T: %v", err, err) - continue - } - if !reflect.DeepEqual(blobMounted.Descriptor, prepolutatedDescriptor) { - t.Errorf("unexpected descriptor: %#+v != %#+v", blobMounted.Descriptor, prepolutatedDescriptor) - } - } - // this time no stat calls will be made - if len(stats) != 0 { - t.Errorf("unexpected number of stats made: %d != %d", len(stats), len(testLayers)) - } -} - -func clearStats(stats map[string]int) { - for k := range stats { - delete(stats, k) - } -} - -// mockRegistry sets a mock blob descriptor service factory that overrides -// statter's Stat method to note each attempt to stat a blob in any repository. -// Returned stats map contains canonical references to blobs with a number of -// attempts. -func mockRegistry(t *testing.T, nm distribution.Namespace) (map[string]int, error) { - registry, ok := nm.(*registry) - if !ok { - return nil, fmt.Errorf("not an expected type of registry: %T", nm) - } - stats := make(map[string]int) - - registry.blobDescriptorServiceFactory = &mockBlobDescriptorServiceFactory{ - t: t, - stats: stats, - } - - return stats, nil -} - -type mockBlobDescriptorServiceFactory struct { - t *testing.T - stats map[string]int -} - -func (f *mockBlobDescriptorServiceFactory) BlobAccessController(svc distribution.BlobDescriptorService) distribution.BlobDescriptorService { - return &mockBlobDescriptorService{ - BlobDescriptorService: svc, - t: f.t, - stats: f.stats, - } -} - -type mockBlobDescriptorService struct { - distribution.BlobDescriptorService - t *testing.T - stats map[string]int -} - -var _ distribution.BlobDescriptorService = &mockBlobDescriptorService{} - -func (bs *mockBlobDescriptorService) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - statter, ok := bs.BlobDescriptorService.(*linkedBlobStatter) - if !ok { - return distribution.Descriptor{}, fmt.Errorf("unexpected blob descriptor service: %T", bs.BlobDescriptorService) - } - - name := statter.repository.Named() - canonical, err := reference.WithDigest(name, dgst) - if err != nil { - return distribution.Descriptor{}, fmt.Errorf("failed to make canonical reference: %v", err) - } - - bs.stats[canonical.String()]++ - bs.t.Logf("calling Stat on %s", canonical.String()) - - return bs.BlobDescriptorService.Stat(ctx, dgst) -} - -// statCrossMountCreateOptions ensures the expected options type is passed, and optionally pre-fills the cross-mount stat info -type statCrossMountCreateOption struct { - desc distribution.Descriptor -} - -var _ distribution.BlobCreateOption = statCrossMountCreateOption{} - -func (f statCrossMountCreateOption) Apply(v interface{}) error { - opts, ok := v.(*distribution.CreateOptions) - if !ok { - return fmt.Errorf("Unexpected create options: %#v", v) - } - - if !opts.Mount.ShouldMount { - return nil - } - - opts.Mount.Stat = &f.desc - - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/manifestlisthandler.go b/vendor/github.com/docker/distribution/registry/storage/manifestlisthandler.go deleted file mode 100644 index e24062cd0..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/manifestlisthandler.go +++ /dev/null @@ -1,92 +0,0 @@ -package storage - -import ( - "fmt" - - "encoding/json" - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/manifestlist" -) - -// manifestListHandler is a ManifestHandler that covers schema2 manifest lists. -type manifestListHandler struct { - repository distribution.Repository - blobStore distribution.BlobStore - ctx context.Context -} - -var _ ManifestHandler = &manifestListHandler{} - -func (ms *manifestListHandler) Unmarshal(ctx context.Context, dgst digest.Digest, content []byte) (distribution.Manifest, error) { - context.GetLogger(ms.ctx).Debug("(*manifestListHandler).Unmarshal") - - var m manifestlist.DeserializedManifestList - if err := json.Unmarshal(content, &m); err != nil { - return nil, err - } - - return &m, nil -} - -func (ms *manifestListHandler) Put(ctx context.Context, manifestList distribution.Manifest, skipDependencyVerification bool) (digest.Digest, error) { - context.GetLogger(ms.ctx).Debug("(*manifestListHandler).Put") - - m, ok := manifestList.(*manifestlist.DeserializedManifestList) - if !ok { - return "", fmt.Errorf("wrong type put to manifestListHandler: %T", manifestList) - } - - if err := ms.verifyManifest(ms.ctx, *m, skipDependencyVerification); err != nil { - return "", err - } - - mt, payload, err := m.Payload() - if err != nil { - return "", err - } - - revision, err := ms.blobStore.Put(ctx, mt, payload) - if err != nil { - context.GetLogger(ctx).Errorf("error putting payload into blobstore: %v", err) - return "", err - } - - return revision.Digest, nil -} - -// verifyManifest ensures that the manifest content is valid from the -// perspective of the registry. As a policy, the registry only tries to -// store valid content, leaving trust policies of that content up to -// consumers. -func (ms *manifestListHandler) verifyManifest(ctx context.Context, mnfst manifestlist.DeserializedManifestList, skipDependencyVerification bool) error { - var errs distribution.ErrManifestVerification - - if !skipDependencyVerification { - // This manifest service is different from the blob service - // returned by Blob. It uses a linked blob store to ensure that - // only manifests are accessible. - - manifestService, err := ms.repository.Manifests(ctx) - if err != nil { - return err - } - - for _, manifestDescriptor := range mnfst.References() { - exists, err := manifestService.Exists(ctx, manifestDescriptor.Digest) - if err != nil && err != distribution.ErrBlobUnknown { - errs = append(errs, err) - } - if err != nil || !exists { - // On error here, we always append unknown blob errors. - errs = append(errs, distribution.ErrManifestBlobUnknown{Digest: manifestDescriptor.Digest}) - } - } - } - if len(errs) != 0 { - return errs - } - - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/manifeststore.go b/vendor/github.com/docker/distribution/registry/storage/manifeststore.go deleted file mode 100644 index 9e8065bb7..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/manifeststore.go +++ /dev/null @@ -1,141 +0,0 @@ -package storage - -import ( - "fmt" - - "encoding/json" - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/manifest/manifestlist" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/manifest/schema2" -) - -// A ManifestHandler gets and puts manifests of a particular type. -type ManifestHandler interface { - // Unmarshal unmarshals the manifest from a byte slice. - Unmarshal(ctx context.Context, dgst digest.Digest, content []byte) (distribution.Manifest, error) - - // Put creates or updates the given manifest returning the manifest digest. - Put(ctx context.Context, manifest distribution.Manifest, skipDependencyVerification bool) (digest.Digest, error) -} - -// SkipLayerVerification allows a manifest to be Put before its -// layers are on the filesystem -func SkipLayerVerification() distribution.ManifestServiceOption { - return skipLayerOption{} -} - -type skipLayerOption struct{} - -func (o skipLayerOption) Apply(m distribution.ManifestService) error { - if ms, ok := m.(*manifestStore); ok { - ms.skipDependencyVerification = true - return nil - } - return fmt.Errorf("skip layer verification only valid for manifestStore") -} - -type manifestStore struct { - repository *repository - blobStore *linkedBlobStore - ctx context.Context - - skipDependencyVerification bool - - schema1Handler ManifestHandler - schema2Handler ManifestHandler - manifestListHandler ManifestHandler -} - -var _ distribution.ManifestService = &manifestStore{} - -func (ms *manifestStore) Exists(ctx context.Context, dgst digest.Digest) (bool, error) { - context.GetLogger(ms.ctx).Debug("(*manifestStore).Exists") - - _, err := ms.blobStore.Stat(ms.ctx, dgst) - if err != nil { - if err == distribution.ErrBlobUnknown { - return false, nil - } - - return false, err - } - - return true, nil -} - -func (ms *manifestStore) Get(ctx context.Context, dgst digest.Digest, options ...distribution.ManifestServiceOption) (distribution.Manifest, error) { - context.GetLogger(ms.ctx).Debug("(*manifestStore).Get") - - // TODO(stevvooe): Need to check descriptor from above to ensure that the - // mediatype is as we expect for the manifest store. - - content, err := ms.blobStore.Get(ctx, dgst) - if err != nil { - if err == distribution.ErrBlobUnknown { - return nil, distribution.ErrManifestUnknownRevision{ - Name: ms.repository.Named().Name(), - Revision: dgst, - } - } - - return nil, err - } - - var versioned manifest.Versioned - if err = json.Unmarshal(content, &versioned); err != nil { - return nil, err - } - - switch versioned.SchemaVersion { - case 1: - return ms.schema1Handler.Unmarshal(ctx, dgst, content) - case 2: - // This can be an image manifest or a manifest list - switch versioned.MediaType { - case schema2.MediaTypeManifest: - return ms.schema2Handler.Unmarshal(ctx, dgst, content) - case manifestlist.MediaTypeManifestList: - return ms.manifestListHandler.Unmarshal(ctx, dgst, content) - default: - return nil, distribution.ErrManifestVerification{fmt.Errorf("unrecognized manifest content type %s", versioned.MediaType)} - } - } - - return nil, fmt.Errorf("unrecognized manifest schema version %d", versioned.SchemaVersion) -} - -func (ms *manifestStore) Put(ctx context.Context, manifest distribution.Manifest, options ...distribution.ManifestServiceOption) (digest.Digest, error) { - context.GetLogger(ms.ctx).Debug("(*manifestStore).Put") - - switch manifest.(type) { - case *schema1.SignedManifest: - return ms.schema1Handler.Put(ctx, manifest, ms.skipDependencyVerification) - case *schema2.DeserializedManifest: - return ms.schema2Handler.Put(ctx, manifest, ms.skipDependencyVerification) - case *manifestlist.DeserializedManifestList: - return ms.manifestListHandler.Put(ctx, manifest, ms.skipDependencyVerification) - } - - return "", fmt.Errorf("unrecognized manifest type %T", manifest) -} - -// Delete removes the revision of the specified manifest. -func (ms *manifestStore) Delete(ctx context.Context, dgst digest.Digest) error { - context.GetLogger(ms.ctx).Debug("(*manifestStore).Delete") - return ms.blobStore.Delete(ctx, dgst) -} - -func (ms *manifestStore) Enumerate(ctx context.Context, ingester func(digest.Digest) error) error { - err := ms.blobStore.Enumerate(ctx, func(dgst digest.Digest) error { - err := ingester(dgst) - if err != nil { - return err - } - return nil - }) - return err -} diff --git a/vendor/github.com/docker/distribution/registry/storage/manifeststore_test.go b/vendor/github.com/docker/distribution/registry/storage/manifeststore_test.go deleted file mode 100644 index cbd30c044..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/manifeststore_test.go +++ /dev/null @@ -1,391 +0,0 @@ -package storage - -import ( - "bytes" - "io" - "reflect" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/cache/memory" - "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/inmemory" - "github.com/docker/distribution/testutil" - "github.com/docker/libtrust" -) - -type manifestStoreTestEnv struct { - ctx context.Context - driver driver.StorageDriver - registry distribution.Namespace - repository distribution.Repository - name reference.Named - tag string -} - -func newManifestStoreTestEnv(t *testing.T, name reference.Named, tag string, options ...RegistryOption) *manifestStoreTestEnv { - ctx := context.Background() - driver := inmemory.New() - registry, err := NewRegistry(ctx, driver, options...) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - - repo, err := registry.Repository(ctx, name) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - - return &manifestStoreTestEnv{ - ctx: ctx, - driver: driver, - registry: registry, - repository: repo, - name: name, - tag: tag, - } -} - -func TestManifestStorage(t *testing.T) { - k, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatal(err) - } - testManifestStorage(t, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableDelete, EnableRedirect, Schema1SigningKey(k)) -} - -func testManifestStorage(t *testing.T, options ...RegistryOption) { - repoName, _ := reference.ParseNamed("foo/bar") - env := newManifestStoreTestEnv(t, repoName, "thetag", options...) - ctx := context.Background() - ms, err := env.repository.Manifests(ctx) - if err != nil { - t.Fatal(err) - } - - m := schema1.Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 1, - }, - Name: env.name.Name(), - Tag: env.tag, - } - - // Build up some test layers and add them to the manifest, saving the - // readseekers for upload later. - testLayers := map[digest.Digest]io.ReadSeeker{} - for i := 0; i < 2; i++ { - rs, ds, err := testutil.CreateRandomTarFile() - if err != nil { - t.Fatalf("unexpected error generating test layer file") - } - dgst := digest.Digest(ds) - - testLayers[digest.Digest(dgst)] = rs - m.FSLayers = append(m.FSLayers, schema1.FSLayer{ - BlobSum: dgst, - }) - m.History = append(m.History, schema1.History{ - V1Compatibility: "", - }) - - } - - pk, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatalf("unexpected error generating private key: %v", err) - } - - sm, merr := schema1.Sign(&m, pk) - if merr != nil { - t.Fatalf("error signing manifest: %v", err) - } - - _, err = ms.Put(ctx, sm) - if err == nil { - t.Fatalf("expected errors putting manifest with full verification") - } - - switch err := err.(type) { - case distribution.ErrManifestVerification: - if len(err) != 2 { - t.Fatalf("expected 2 verification errors: %#v", err) - } - - for _, err := range err { - if _, ok := err.(distribution.ErrManifestBlobUnknown); !ok { - t.Fatalf("unexpected error type: %v", err) - } - } - default: - t.Fatalf("unexpected error verifying manifest: %v", err) - } - - // Now, upload the layers that were missing! - for dgst, rs := range testLayers { - wr, err := env.repository.Blobs(env.ctx).Create(env.ctx) - if err != nil { - t.Fatalf("unexpected error creating test upload: %v", err) - } - - if _, err := io.Copy(wr, rs); err != nil { - t.Fatalf("unexpected error copying to upload: %v", err) - } - - if _, err := wr.Commit(env.ctx, distribution.Descriptor{Digest: dgst}); err != nil { - t.Fatalf("unexpected error finishing upload: %v", err) - } - } - - var manifestDigest digest.Digest - if manifestDigest, err = ms.Put(ctx, sm); err != nil { - t.Fatalf("unexpected error putting manifest: %v", err) - } - - exists, err := ms.Exists(ctx, manifestDigest) - if err != nil { - t.Fatalf("unexpected error checking manifest existence: %#v", err) - } - - if !exists { - t.Fatalf("manifest should exist") - } - - fromStore, err := ms.Get(ctx, manifestDigest) - if err != nil { - t.Fatalf("unexpected error fetching manifest: %v", err) - } - - fetchedManifest, ok := fromStore.(*schema1.SignedManifest) - if !ok { - t.Fatalf("unexpected manifest type from signedstore") - } - - if !bytes.Equal(fetchedManifest.Canonical, sm.Canonical) { - t.Fatalf("fetched payload does not match original payload: %q != %q", fetchedManifest.Canonical, sm.Canonical) - } - - _, pl, err := fetchedManifest.Payload() - if err != nil { - t.Fatalf("error getting payload %#v", err) - } - - fetchedJWS, err := libtrust.ParsePrettySignature(pl, "signatures") - if err != nil { - t.Fatalf("unexpected error parsing jws: %v", err) - } - - payload, err := fetchedJWS.Payload() - if err != nil { - t.Fatalf("unexpected error extracting payload: %v", err) - } - - // Now that we have a payload, take a moment to check that the manifest is - // return by the payload digest. - - dgst := digest.FromBytes(payload) - exists, err = ms.Exists(ctx, dgst) - if err != nil { - t.Fatalf("error checking manifest existence by digest: %v", err) - } - - if !exists { - t.Fatalf("manifest %s should exist", dgst) - } - - fetchedByDigest, err := ms.Get(ctx, dgst) - if err != nil { - t.Fatalf("unexpected error fetching manifest by digest: %v", err) - } - - byDigestManifest, ok := fetchedByDigest.(*schema1.SignedManifest) - if !ok { - t.Fatalf("unexpected manifest type from signedstore") - } - - if !bytes.Equal(byDigestManifest.Canonical, fetchedManifest.Canonical) { - t.Fatalf("fetched manifest not equal: %q != %q", byDigestManifest.Canonical, fetchedManifest.Canonical) - } - - sigs, err := fetchedJWS.Signatures() - if err != nil { - t.Fatalf("unable to extract signatures: %v", err) - } - - if len(sigs) != 1 { - t.Fatalf("unexpected number of signatures: %d != %d", len(sigs), 1) - } - - // Now, push the same manifest with a different key - pk2, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - t.Fatalf("unexpected error generating private key: %v", err) - } - - sm2, err := schema1.Sign(&m, pk2) - if err != nil { - t.Fatalf("unexpected error signing manifest: %v", err) - } - _, pl, err = sm2.Payload() - if err != nil { - t.Fatalf("error getting payload %#v", err) - } - - jws2, err := libtrust.ParsePrettySignature(pl, "signatures") - if err != nil { - t.Fatalf("error parsing signature: %v", err) - } - - sigs2, err := jws2.Signatures() - if err != nil { - t.Fatalf("unable to extract signatures: %v", err) - } - - if len(sigs2) != 1 { - t.Fatalf("unexpected number of signatures: %d != %d", len(sigs2), 1) - } - - if manifestDigest, err = ms.Put(ctx, sm2); err != nil { - t.Fatalf("unexpected error putting manifest: %v", err) - } - - fromStore, err = ms.Get(ctx, manifestDigest) - if err != nil { - t.Fatalf("unexpected error fetching manifest: %v", err) - } - - fetched, ok := fromStore.(*schema1.SignedManifest) - if !ok { - t.Fatalf("unexpected type from signed manifeststore : %T", fetched) - } - - if _, err := schema1.Verify(fetched); err != nil { - t.Fatalf("unexpected error verifying manifest: %v", err) - } - - _, pl, err = fetched.Payload() - if err != nil { - t.Fatalf("error getting payload %#v", err) - } - - receivedJWS, err := libtrust.ParsePrettySignature(pl, "signatures") - if err != nil { - t.Fatalf("unexpected error parsing jws: %v", err) - } - - receivedPayload, err := receivedJWS.Payload() - if err != nil { - t.Fatalf("unexpected error extracting received payload: %v", err) - } - - if !bytes.Equal(receivedPayload, payload) { - t.Fatalf("payloads are not equal") - } - - // Test deleting manifests - err = ms.Delete(ctx, dgst) - if err != nil { - t.Fatalf("unexpected an error deleting manifest by digest: %v", err) - } - - exists, err = ms.Exists(ctx, dgst) - if err != nil { - t.Fatalf("Error querying manifest existence") - } - if exists { - t.Errorf("Deleted manifest should not exist") - } - - deletedManifest, err := ms.Get(ctx, dgst) - if err == nil { - t.Errorf("Unexpected success getting deleted manifest") - } - switch err.(type) { - case distribution.ErrManifestUnknownRevision: - break - default: - t.Errorf("Unexpected error getting deleted manifest: %s", reflect.ValueOf(err).Type()) - } - - if deletedManifest != nil { - t.Errorf("Deleted manifest get returned non-nil") - } - - // Re-upload should restore manifest to a good state - _, err = ms.Put(ctx, sm) - if err != nil { - t.Errorf("Error re-uploading deleted manifest") - } - - exists, err = ms.Exists(ctx, dgst) - if err != nil { - t.Fatalf("Error querying manifest existence") - } - if !exists { - t.Errorf("Restored manifest should exist") - } - - deletedManifest, err = ms.Get(ctx, dgst) - if err != nil { - t.Errorf("Unexpected error getting manifest") - } - if deletedManifest == nil { - t.Errorf("Deleted manifest get returned non-nil") - } - - r, err := NewRegistry(ctx, env.driver, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableRedirect) - if err != nil { - t.Fatalf("error creating registry: %v", err) - } - repo, err := r.Repository(ctx, env.name) - if err != nil { - t.Fatalf("unexpected error getting repo: %v", err) - } - ms, err = repo.Manifests(ctx) - if err != nil { - t.Fatal(err) - } - err = ms.Delete(ctx, dgst) - if err == nil { - t.Errorf("Unexpected success deleting while disabled") - } -} - -// TestLinkPathFuncs ensures that the link path functions behavior are locked -// down and implemented as expected. -func TestLinkPathFuncs(t *testing.T) { - for _, testcase := range []struct { - repo string - digest digest.Digest - linkPathFn linkPathFunc - expected string - }{ - { - repo: "foo/bar", - digest: "sha256:deadbeaf98fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - linkPathFn: blobLinkPath, - expected: "/docker/registry/v2/repositories/foo/bar/_layers/sha256/deadbeaf98fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/link", - }, - { - repo: "foo/bar", - digest: "sha256:deadbeaf98fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - linkPathFn: manifestRevisionLinkPath, - expected: "/docker/registry/v2/repositories/foo/bar/_manifests/revisions/sha256/deadbeaf98fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/link", - }, - } { - p, err := testcase.linkPathFn(testcase.repo, testcase.digest) - if err != nil { - t.Fatalf("unexpected error calling linkPathFn(pm, %q, %q): %v", testcase.repo, testcase.digest, err) - } - - if p != testcase.expected { - t.Fatalf("incorrect path returned: %q != %q", p, testcase.expected) - } - } - -} diff --git a/vendor/github.com/docker/distribution/registry/storage/paths.go b/vendor/github.com/docker/distribution/registry/storage/paths.go deleted file mode 100644 index 1b142b88f..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/paths.go +++ /dev/null @@ -1,490 +0,0 @@ -package storage - -import ( - "fmt" - "path" - "strings" - - "github.com/docker/distribution/digest" -) - -const ( - storagePathVersion = "v2" // fixed storage layout version - storagePathRoot = "/docker/registry/" // all driver paths have a prefix - - // TODO(stevvooe): Get rid of the "storagePathRoot". Initially, we though - // storage path root would configurable for all drivers through this - // package. In reality, we've found it simpler to do this on a per driver - // basis. -) - -// pathFor maps paths based on "object names" and their ids. The "object -// names" mapped by are internal to the storage system. -// -// The path layout in the storage backend is roughly as follows: -// -// /v2 -// -> repositories/ -// ->/ -// -> _manifests/ -// revisions -// -> -// -> link -// tags/ -// -> current/link -// -> index -// -> //link -// -> _layers/ -// -// -> _uploads/ -// data -// startedat -// hashstates// -// -> blob/ -// -// -// The storage backend layout is broken up into a content-addressable blob -// store and repositories. The content-addressable blob store holds most data -// throughout the backend, keyed by algorithm and digests of the underlying -// content. Access to the blob store is controlled through links from the -// repository to blobstore. -// -// A repository is made up of layers, manifests and tags. The layers component -// is just a directory of layers which are "linked" into a repository. A layer -// can only be accessed through a qualified repository name if it is linked in -// the repository. Uploads of layers are managed in the uploads directory, -// which is key by upload id. When all data for an upload is received, the -// data is moved into the blob store and the upload directory is deleted. -// Abandoned uploads can be garbage collected by reading the startedat file -// and removing uploads that have been active for longer than a certain time. -// -// The third component of the repository directory is the manifests store, -// which is made up of a revision store and tag store. Manifests are stored in -// the blob store and linked into the revision store. -// While the registry can save all revisions of a manifest, no relationship is -// implied as to the ordering of changes to a manifest. The tag store provides -// support for name, tag lookups of manifests, using "current/link" under a -// named tag directory. An index is maintained to support deletions of all -// revisions of a given manifest tag. -// -// We cover the path formats implemented by this path mapper below. -// -// Manifests: -// -// manifestRevisionsPathSpec: /v2/repositories//_manifests/revisions/ -// manifestRevisionPathSpec: /v2/repositories//_manifests/revisions/// -// manifestRevisionLinkPathSpec: /v2/repositories//_manifests/revisions///link -// -// Tags: -// -// manifestTagsPathSpec: /v2/repositories//_manifests/tags/ -// manifestTagPathSpec: /v2/repositories//_manifests/tags// -// manifestTagCurrentPathSpec: /v2/repositories//_manifests/tags//current/link -// manifestTagIndexPathSpec: /v2/repositories//_manifests/tags//index/ -// manifestTagIndexEntryPathSpec: /v2/repositories//_manifests/tags//index/// -// manifestTagIndexEntryLinkPathSpec: /v2/repositories//_manifests/tags//index///link -// -// Blobs: -// -// layerLinkPathSpec: /v2/repositories//_layers///link -// -// Uploads: -// -// uploadDataPathSpec: /v2/repositories//_uploads//data -// uploadStartedAtPathSpec: /v2/repositories//_uploads//startedat -// uploadHashStatePathSpec: /v2/repositories//_uploads//hashstates// -// -// Blob Store: -// -// blobsPathSpec: /v2/blobs/ -// blobPathSpec: /v2/blobs/// -// blobDataPathSpec: /v2/blobs////data -// blobMediaTypePathSpec: /v2/blobs////data -// -// For more information on the semantic meaning of each path and their -// contents, please see the path spec documentation. -func pathFor(spec pathSpec) (string, error) { - - // Switch on the path object type and return the appropriate path. At - // first glance, one may wonder why we don't use an interface to - // accomplish this. By keep the formatting separate from the pathSpec, we - // keep separate the path generation componentized. These specs could be - // passed to a completely different mapper implementation and generate a - // different set of paths. - // - // For example, imagine migrating from one backend to the other: one could - // build a filesystem walker that converts a string path in one version, - // to an intermediate path object, than can be consumed and mapped by the - // other version. - - rootPrefix := []string{storagePathRoot, storagePathVersion} - repoPrefix := append(rootPrefix, "repositories") - - switch v := spec.(type) { - - case manifestRevisionsPathSpec: - return path.Join(append(repoPrefix, v.name, "_manifests", "revisions")...), nil - - case manifestRevisionPathSpec: - components, err := digestPathComponents(v.revision, false) - if err != nil { - return "", err - } - - return path.Join(append(append(repoPrefix, v.name, "_manifests", "revisions"), components...)...), nil - case manifestRevisionLinkPathSpec: - root, err := pathFor(manifestRevisionPathSpec{ - name: v.name, - revision: v.revision, - }) - - if err != nil { - return "", err - } - - return path.Join(root, "link"), nil - case manifestTagsPathSpec: - return path.Join(append(repoPrefix, v.name, "_manifests", "tags")...), nil - case manifestTagPathSpec: - root, err := pathFor(manifestTagsPathSpec{ - name: v.name, - }) - - if err != nil { - return "", err - } - - return path.Join(root, v.tag), nil - case manifestTagCurrentPathSpec: - root, err := pathFor(manifestTagPathSpec{ - name: v.name, - tag: v.tag, - }) - - if err != nil { - return "", err - } - - return path.Join(root, "current", "link"), nil - case manifestTagIndexPathSpec: - root, err := pathFor(manifestTagPathSpec{ - name: v.name, - tag: v.tag, - }) - - if err != nil { - return "", err - } - - return path.Join(root, "index"), nil - case manifestTagIndexEntryLinkPathSpec: - root, err := pathFor(manifestTagIndexEntryPathSpec{ - name: v.name, - tag: v.tag, - revision: v.revision, - }) - - if err != nil { - return "", err - } - - return path.Join(root, "link"), nil - case manifestTagIndexEntryPathSpec: - root, err := pathFor(manifestTagIndexPathSpec{ - name: v.name, - tag: v.tag, - }) - - if err != nil { - return "", err - } - - components, err := digestPathComponents(v.revision, false) - if err != nil { - return "", err - } - - return path.Join(root, path.Join(components...)), nil - case layerLinkPathSpec: - components, err := digestPathComponents(v.digest, false) - if err != nil { - return "", err - } - - // TODO(stevvooe): Right now, all blobs are linked under "_layers". If - // we have future migrations, we may want to rename this to "_blobs". - // A migration strategy would simply leave existing items in place and - // write the new paths, commit a file then delete the old files. - - blobLinkPathComponents := append(repoPrefix, v.name, "_layers") - - return path.Join(path.Join(append(blobLinkPathComponents, components...)...), "link"), nil - case blobsPathSpec: - blobsPathPrefix := append(rootPrefix, "blobs") - return path.Join(blobsPathPrefix...), nil - case blobPathSpec: - components, err := digestPathComponents(v.digest, true) - if err != nil { - return "", err - } - - blobPathPrefix := append(rootPrefix, "blobs") - return path.Join(append(blobPathPrefix, components...)...), nil - case blobDataPathSpec: - components, err := digestPathComponents(v.digest, true) - if err != nil { - return "", err - } - - components = append(components, "data") - blobPathPrefix := append(rootPrefix, "blobs") - return path.Join(append(blobPathPrefix, components...)...), nil - - case uploadDataPathSpec: - return path.Join(append(repoPrefix, v.name, "_uploads", v.id, "data")...), nil - case uploadStartedAtPathSpec: - return path.Join(append(repoPrefix, v.name, "_uploads", v.id, "startedat")...), nil - case uploadHashStatePathSpec: - offset := fmt.Sprintf("%d", v.offset) - if v.list { - offset = "" // Limit to the prefix for listing offsets. - } - return path.Join(append(repoPrefix, v.name, "_uploads", v.id, "hashstates", string(v.alg), offset)...), nil - case repositoriesRootPathSpec: - return path.Join(repoPrefix...), nil - default: - // TODO(sday): This is an internal error. Ensure it doesn't escape (panic?). - return "", fmt.Errorf("unknown path spec: %#v", v) - } -} - -// pathSpec is a type to mark structs as path specs. There is no -// implementation because we'd like to keep the specs and the mappers -// decoupled. -type pathSpec interface { - pathSpec() -} - -// manifestRevisionsPathSpec describes the directory path for -// a manifest revision. -type manifestRevisionsPathSpec struct { - name string -} - -func (manifestRevisionsPathSpec) pathSpec() {} - -// manifestRevisionPathSpec describes the components of the directory path for -// a manifest revision. -type manifestRevisionPathSpec struct { - name string - revision digest.Digest -} - -func (manifestRevisionPathSpec) pathSpec() {} - -// manifestRevisionLinkPathSpec describes the path components required to look -// up the data link for a revision of a manifest. If this file is not present, -// the manifest blob is not available in the given repo. The contents of this -// file should just be the digest. -type manifestRevisionLinkPathSpec struct { - name string - revision digest.Digest -} - -func (manifestRevisionLinkPathSpec) pathSpec() {} - -// manifestTagsPathSpec describes the path elements required to point to the -// manifest tags directory. -type manifestTagsPathSpec struct { - name string -} - -func (manifestTagsPathSpec) pathSpec() {} - -// manifestTagPathSpec describes the path elements required to point to the -// manifest tag links files under a repository. These contain a blob id that -// can be used to look up the data and signatures. -type manifestTagPathSpec struct { - name string - tag string -} - -func (manifestTagPathSpec) pathSpec() {} - -// manifestTagCurrentPathSpec describes the link to the current revision for a -// given tag. -type manifestTagCurrentPathSpec struct { - name string - tag string -} - -func (manifestTagCurrentPathSpec) pathSpec() {} - -// manifestTagCurrentPathSpec describes the link to the index of revisions -// with the given tag. -type manifestTagIndexPathSpec struct { - name string - tag string -} - -func (manifestTagIndexPathSpec) pathSpec() {} - -// manifestTagIndexEntryPathSpec contains the entries of the index by revision. -type manifestTagIndexEntryPathSpec struct { - name string - tag string - revision digest.Digest -} - -func (manifestTagIndexEntryPathSpec) pathSpec() {} - -// manifestTagIndexEntryLinkPathSpec describes the link to a revisions of a -// manifest with given tag within the index. -type manifestTagIndexEntryLinkPathSpec struct { - name string - tag string - revision digest.Digest -} - -func (manifestTagIndexEntryLinkPathSpec) pathSpec() {} - -// blobLinkPathSpec specifies a path for a blob link, which is a file with a -// blob id. The blob link will contain a content addressable blob id reference -// into the blob store. The format of the contents is as follows: -// -// : -// -// The following example of the file contents is more illustrative: -// -// sha256:96443a84ce518ac22acb2e985eda402b58ac19ce6f91980bde63726a79d80b36 -// -// This indicates that there is a blob with the id/digest, calculated via -// sha256 that can be fetched from the blob store. -type layerLinkPathSpec struct { - name string - digest digest.Digest -} - -func (layerLinkPathSpec) pathSpec() {} - -// blobAlgorithmReplacer does some very simple path sanitization for user -// input. Paths should be "safe" before getting this far due to strict digest -// requirements but we can add further path conversion here, if needed. -var blobAlgorithmReplacer = strings.NewReplacer( - "+", "/", - ".", "/", - ";", "/", -) - -// blobsPathSpec contains the path for the blobs directory -type blobsPathSpec struct{} - -func (blobsPathSpec) pathSpec() {} - -// blobPathSpec contains the path for the registry global blob store. -type blobPathSpec struct { - digest digest.Digest -} - -func (blobPathSpec) pathSpec() {} - -// blobDataPathSpec contains the path for the registry global blob store. For -// now, this contains layer data, exclusively. -type blobDataPathSpec struct { - digest digest.Digest -} - -func (blobDataPathSpec) pathSpec() {} - -// uploadDataPathSpec defines the path parameters of the data file for -// uploads. -type uploadDataPathSpec struct { - name string - id string -} - -func (uploadDataPathSpec) pathSpec() {} - -// uploadDataPathSpec defines the path parameters for the file that stores the -// start time of an uploads. If it is missing, the upload is considered -// unknown. Admittedly, the presence of this file is an ugly hack to make sure -// we have a way to cleanup old or stalled uploads that doesn't rely on driver -// FileInfo behavior. If we come up with a more clever way to do this, we -// should remove this file immediately and rely on the startetAt field from -// the client to enforce time out policies. -type uploadStartedAtPathSpec struct { - name string - id string -} - -func (uploadStartedAtPathSpec) pathSpec() {} - -// uploadHashStatePathSpec defines the path parameters for the file that stores -// the hash function state of an upload at a specific byte offset. If `list` is -// set, then the path mapper will generate a list prefix for all hash state -// offsets for the upload identified by the name, id, and alg. -type uploadHashStatePathSpec struct { - name string - id string - alg digest.Algorithm - offset int64 - list bool -} - -func (uploadHashStatePathSpec) pathSpec() {} - -// repositoriesRootPathSpec returns the root of repositories -type repositoriesRootPathSpec struct { -} - -func (repositoriesRootPathSpec) pathSpec() {} - -// digestPathComponents provides a consistent path breakdown for a given -// digest. For a generic digest, it will be as follows: -// -// / -// -// If multilevel is true, the first two bytes of the digest will separate -// groups of digest folder. It will be as follows: -// -// // -// -func digestPathComponents(dgst digest.Digest, multilevel bool) ([]string, error) { - if err := dgst.Validate(); err != nil { - return nil, err - } - - algorithm := blobAlgorithmReplacer.Replace(string(dgst.Algorithm())) - hex := dgst.Hex() - prefix := []string{algorithm} - - var suffix []string - - if multilevel { - suffix = append(suffix, hex[:2]) - } - - suffix = append(suffix, hex) - - return append(prefix, suffix...), nil -} - -// Reconstructs a digest from a path -func digestFromPath(digestPath string) (digest.Digest, error) { - - digestPath = strings.TrimSuffix(digestPath, "/data") - dir, hex := path.Split(digestPath) - dir = path.Dir(dir) - dir, next := path.Split(dir) - - // next is either the algorithm OR the first two characters in the hex string - var algo string - if next == hex[:2] { - algo = path.Base(dir) - } else { - algo = next - } - - dgst := digest.NewDigestFromHex(algo, hex) - return dgst, dgst.Validate() -} diff --git a/vendor/github.com/docker/distribution/registry/storage/paths_test.go b/vendor/github.com/docker/distribution/registry/storage/paths_test.go deleted file mode 100644 index f739552aa..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/paths_test.go +++ /dev/null @@ -1,135 +0,0 @@ -package storage - -import ( - "testing" - - "github.com/docker/distribution/digest" -) - -func TestPathMapper(t *testing.T) { - for _, testcase := range []struct { - spec pathSpec - expected string - err error - }{ - { - spec: manifestRevisionPathSpec{ - name: "foo/bar", - revision: "sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789", - }, - expected: "/docker/registry/v2/repositories/foo/bar/_manifests/revisions/sha256/abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789", - }, - { - spec: manifestRevisionLinkPathSpec{ - name: "foo/bar", - revision: "sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789", - }, - expected: "/docker/registry/v2/repositories/foo/bar/_manifests/revisions/sha256/abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789/link", - }, - { - spec: manifestTagsPathSpec{ - name: "foo/bar", - }, - expected: "/docker/registry/v2/repositories/foo/bar/_manifests/tags", - }, - { - spec: manifestTagPathSpec{ - name: "foo/bar", - tag: "thetag", - }, - expected: "/docker/registry/v2/repositories/foo/bar/_manifests/tags/thetag", - }, - { - spec: manifestTagCurrentPathSpec{ - name: "foo/bar", - tag: "thetag", - }, - expected: "/docker/registry/v2/repositories/foo/bar/_manifests/tags/thetag/current/link", - }, - { - spec: manifestTagIndexPathSpec{ - name: "foo/bar", - tag: "thetag", - }, - expected: "/docker/registry/v2/repositories/foo/bar/_manifests/tags/thetag/index", - }, - { - spec: manifestTagIndexEntryPathSpec{ - name: "foo/bar", - tag: "thetag", - revision: "sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789", - }, - expected: "/docker/registry/v2/repositories/foo/bar/_manifests/tags/thetag/index/sha256/abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789", - }, - { - spec: manifestTagIndexEntryLinkPathSpec{ - name: "foo/bar", - tag: "thetag", - revision: "sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789", - }, - expected: "/docker/registry/v2/repositories/foo/bar/_manifests/tags/thetag/index/sha256/abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789/link", - }, - - { - spec: uploadDataPathSpec{ - name: "foo/bar", - id: "asdf-asdf-asdf-adsf", - }, - expected: "/docker/registry/v2/repositories/foo/bar/_uploads/asdf-asdf-asdf-adsf/data", - }, - { - spec: uploadStartedAtPathSpec{ - name: "foo/bar", - id: "asdf-asdf-asdf-adsf", - }, - expected: "/docker/registry/v2/repositories/foo/bar/_uploads/asdf-asdf-asdf-adsf/startedat", - }, - } { - p, err := pathFor(testcase.spec) - if err != nil { - t.Fatalf("unexpected generating path (%T): %v", testcase.spec, err) - } - - if p != testcase.expected { - t.Fatalf("unexpected path generated (%T): %q != %q", testcase.spec, p, testcase.expected) - } - } - - // Add a few test cases to ensure we cover some errors - - // Specify a path that requires a revision and get a digest validation error. - badpath, err := pathFor(manifestRevisionPathSpec{ - name: "foo/bar", - }) - - if err == nil { - t.Fatalf("expected an error when mapping an invalid revision: %s", badpath) - } - -} - -func TestDigestFromPath(t *testing.T) { - for _, testcase := range []struct { - path string - expected digest.Digest - multilevel bool - err error - }{ - { - path: "/docker/registry/v2/blobs/sha256/99/9943fffae777400c0344c58869c4c2619c329ca3ad4df540feda74d291dd7c86/data", - multilevel: true, - expected: "sha256:9943fffae777400c0344c58869c4c2619c329ca3ad4df540feda74d291dd7c86", - err: nil, - }, - } { - result, err := digestFromPath(testcase.path) - if err != testcase.err { - t.Fatalf("Unexpected error value %v when we wanted %v", err, testcase.err) - } - - if result != testcase.expected { - t.Fatalf("Unexpected result value %v when we wanted %v", result, testcase.expected) - - } - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/purgeuploads.go b/vendor/github.com/docker/distribution/registry/storage/purgeuploads.go deleted file mode 100644 index 7576b189c..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/purgeuploads.go +++ /dev/null @@ -1,139 +0,0 @@ -package storage - -import ( - "path" - "strings" - "time" - - log "github.com/Sirupsen/logrus" - "github.com/docker/distribution/context" - storageDriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/uuid" -) - -// uploadData stored the location of temporary files created during a layer upload -// along with the date the upload was started -type uploadData struct { - containingDir string - startedAt time.Time -} - -func newUploadData() uploadData { - return uploadData{ - containingDir: "", - // default to far in future to protect against missing startedat - startedAt: time.Now().Add(time.Duration(10000 * time.Hour)), - } -} - -// PurgeUploads deletes files from the upload directory -// created before olderThan. The list of files deleted and errors -// encountered are returned -func PurgeUploads(ctx context.Context, driver storageDriver.StorageDriver, olderThan time.Time, actuallyDelete bool) ([]string, []error) { - log.Infof("PurgeUploads starting: olderThan=%s, actuallyDelete=%t", olderThan, actuallyDelete) - uploadData, errors := getOutstandingUploads(ctx, driver) - var deleted []string - for _, uploadData := range uploadData { - if uploadData.startedAt.Before(olderThan) { - var err error - log.Infof("Upload files in %s have older date (%s) than purge date (%s). Removing upload directory.", - uploadData.containingDir, uploadData.startedAt, olderThan) - if actuallyDelete { - err = driver.Delete(ctx, uploadData.containingDir) - } - if err == nil { - deleted = append(deleted, uploadData.containingDir) - } else { - errors = append(errors, err) - } - } - } - - log.Infof("Purge uploads finished. Num deleted=%d, num errors=%d", len(deleted), len(errors)) - return deleted, errors -} - -// getOutstandingUploads walks the upload directory, collecting files -// which could be eligible for deletion. The only reliable way to -// classify the age of a file is with the date stored in the startedAt -// file, so gather files by UUID with a date from startedAt. -func getOutstandingUploads(ctx context.Context, driver storageDriver.StorageDriver) (map[string]uploadData, []error) { - var errors []error - uploads := make(map[string]uploadData, 0) - - inUploadDir := false - root, err := pathFor(repositoriesRootPathSpec{}) - if err != nil { - return uploads, append(errors, err) - } - - err = Walk(ctx, driver, root, func(fileInfo storageDriver.FileInfo) error { - filePath := fileInfo.Path() - _, file := path.Split(filePath) - if file[0] == '_' { - // Reserved directory - inUploadDir = (file == "_uploads") - - if fileInfo.IsDir() && !inUploadDir { - return ErrSkipDir - } - - } - - uuid, isContainingDir := uUIDFromPath(filePath) - if uuid == "" { - // Cannot reliably delete - return nil - } - ud, ok := uploads[uuid] - if !ok { - ud = newUploadData() - } - if isContainingDir { - ud.containingDir = filePath - } - if file == "startedat" { - if t, err := readStartedAtFile(driver, filePath); err == nil { - ud.startedAt = t - } else { - errors = pushError(errors, filePath, err) - } - - } - - uploads[uuid] = ud - return nil - }) - - if err != nil { - errors = pushError(errors, root, err) - } - return uploads, errors -} - -// uUIDFromPath extracts the upload UUID from a given path -// If the UUID is the last path component, this is the containing -// directory for all upload files -func uUIDFromPath(path string) (string, bool) { - components := strings.Split(path, "/") - for i := len(components) - 1; i >= 0; i-- { - if u, err := uuid.Parse(components[i]); err == nil { - return u.String(), i == len(components)-1 - } - } - return "", false -} - -// readStartedAtFile reads the date from an upload's startedAtFile -func readStartedAtFile(driver storageDriver.StorageDriver, path string) (time.Time, error) { - // todo:(richardscothern) - pass in a context - startedAtBytes, err := driver.GetContent(context.Background(), path) - if err != nil { - return time.Now(), err - } - startedAt, err := time.Parse(time.RFC3339, string(startedAtBytes)) - if err != nil { - return time.Now(), err - } - return startedAt, nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/purgeuploads_test.go b/vendor/github.com/docker/distribution/registry/storage/purgeuploads_test.go deleted file mode 100644 index 3b70f7234..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/purgeuploads_test.go +++ /dev/null @@ -1,166 +0,0 @@ -package storage - -import ( - "path" - "strings" - "testing" - "time" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/inmemory" - "github.com/docker/distribution/uuid" -) - -func testUploadFS(t *testing.T, numUploads int, repoName string, startedAt time.Time) (driver.StorageDriver, context.Context) { - d := inmemory.New() - ctx := context.Background() - for i := 0; i < numUploads; i++ { - addUploads(ctx, t, d, uuid.Generate().String(), repoName, startedAt) - } - return d, ctx -} - -func addUploads(ctx context.Context, t *testing.T, d driver.StorageDriver, uploadID, repo string, startedAt time.Time) { - dataPath, err := pathFor(uploadDataPathSpec{name: repo, id: uploadID}) - if err != nil { - t.Fatalf("Unable to resolve path") - } - if err := d.PutContent(ctx, dataPath, []byte("")); err != nil { - t.Fatalf("Unable to write data file") - } - - startedAtPath, err := pathFor(uploadStartedAtPathSpec{name: repo, id: uploadID}) - if err != nil { - t.Fatalf("Unable to resolve path") - } - - if d.PutContent(ctx, startedAtPath, []byte(startedAt.Format(time.RFC3339))); err != nil { - t.Fatalf("Unable to write startedAt file") - } - -} - -func TestPurgeGather(t *testing.T) { - uploadCount := 5 - fs, ctx := testUploadFS(t, uploadCount, "test-repo", time.Now()) - uploadData, errs := getOutstandingUploads(ctx, fs) - if len(errs) != 0 { - t.Errorf("Unexepected errors: %q", errs) - } - if len(uploadData) != uploadCount { - t.Errorf("Unexpected upload file count: %d != %d", uploadCount, len(uploadData)) - } -} - -func TestPurgeNone(t *testing.T) { - fs, ctx := testUploadFS(t, 10, "test-repo", time.Now()) - oneHourAgo := time.Now().Add(-1 * time.Hour) - deleted, errs := PurgeUploads(ctx, fs, oneHourAgo, true) - if len(errs) != 0 { - t.Error("Unexpected errors", errs) - } - if len(deleted) != 0 { - t.Errorf("Unexpectedly deleted files for time: %s", oneHourAgo) - } -} - -func TestPurgeAll(t *testing.T) { - uploadCount := 10 - oneHourAgo := time.Now().Add(-1 * time.Hour) - fs, ctx := testUploadFS(t, uploadCount, "test-repo", oneHourAgo) - - // Ensure > 1 repos are purged - addUploads(ctx, t, fs, uuid.Generate().String(), "test-repo2", oneHourAgo) - uploadCount++ - - deleted, errs := PurgeUploads(ctx, fs, time.Now(), true) - if len(errs) != 0 { - t.Error("Unexpected errors:", errs) - } - fileCount := uploadCount - if len(deleted) != fileCount { - t.Errorf("Unexpectedly deleted file count %d != %d", - len(deleted), fileCount) - } -} - -func TestPurgeSome(t *testing.T) { - oldUploadCount := 5 - oneHourAgo := time.Now().Add(-1 * time.Hour) - fs, ctx := testUploadFS(t, oldUploadCount, "library/test-repo", oneHourAgo) - - newUploadCount := 4 - - for i := 0; i < newUploadCount; i++ { - addUploads(ctx, t, fs, uuid.Generate().String(), "test-repo", time.Now().Add(1*time.Hour)) - } - - deleted, errs := PurgeUploads(ctx, fs, time.Now(), true) - if len(errs) != 0 { - t.Error("Unexpected errors:", errs) - } - if len(deleted) != oldUploadCount { - t.Errorf("Unexpectedly deleted file count %d != %d", - len(deleted), oldUploadCount) - } -} - -func TestPurgeOnlyUploads(t *testing.T) { - oldUploadCount := 5 - oneHourAgo := time.Now().Add(-1 * time.Hour) - fs, ctx := testUploadFS(t, oldUploadCount, "test-repo", oneHourAgo) - - // Create a directory tree outside _uploads and ensure - // these files aren't deleted. - dataPath, err := pathFor(uploadDataPathSpec{name: "test-repo", id: uuid.Generate().String()}) - if err != nil { - t.Fatalf(err.Error()) - } - nonUploadPath := strings.Replace(dataPath, "_upload", "_important", -1) - if strings.Index(nonUploadPath, "_upload") != -1 { - t.Fatalf("Non-upload path not created correctly") - } - - nonUploadFile := path.Join(nonUploadPath, "file") - if err = fs.PutContent(ctx, nonUploadFile, []byte("")); err != nil { - t.Fatalf("Unable to write data file") - } - - deleted, errs := PurgeUploads(ctx, fs, time.Now(), true) - if len(errs) != 0 { - t.Error("Unexpected errors", errs) - } - for _, file := range deleted { - if strings.Index(file, "_upload") == -1 { - t.Errorf("Non-upload file deleted") - } - } -} - -func TestPurgeMissingStartedAt(t *testing.T) { - oneHourAgo := time.Now().Add(-1 * time.Hour) - fs, ctx := testUploadFS(t, 1, "test-repo", oneHourAgo) - - err := Walk(ctx, fs, "/", func(fileInfo driver.FileInfo) error { - filePath := fileInfo.Path() - _, file := path.Split(filePath) - - if file == "startedat" { - if err := fs.Delete(ctx, filePath); err != nil { - t.Fatalf("Unable to delete startedat file: %s", filePath) - } - } - return nil - }) - if err != nil { - t.Fatalf("Unexpected error during Walk: %s ", err.Error()) - } - deleted, errs := PurgeUploads(ctx, fs, time.Now(), true) - if len(errs) > 0 { - t.Errorf("Unexpected errors") - } - if len(deleted) > 0 { - t.Errorf("Files unexpectedly deleted: %s", deleted) - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/registry.go b/vendor/github.com/docker/distribution/registry/storage/registry.go deleted file mode 100644 index 20525ffb3..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/registry.go +++ /dev/null @@ -1,306 +0,0 @@ -package storage - -import ( - "regexp" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/cache" - storagedriver "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/libtrust" -) - -// registry is the top-level implementation of Registry for use in the storage -// package. All instances should descend from this object. -type registry struct { - blobStore *blobStore - blobServer *blobServer - statter *blobStatter // global statter service. - blobDescriptorCacheProvider cache.BlobDescriptorCacheProvider - deleteEnabled bool - resumableDigestEnabled bool - schema1SigningKey libtrust.PrivateKey - blobDescriptorServiceFactory distribution.BlobDescriptorServiceFactory - manifestURLs manifestURLs -} - -// manifestURLs holds regular expressions for controlling manifest URL whitelisting -type manifestURLs struct { - allow *regexp.Regexp - deny *regexp.Regexp -} - -// RegistryOption is the type used for functional options for NewRegistry. -type RegistryOption func(*registry) error - -// EnableRedirect is a functional option for NewRegistry. It causes the backend -// blob server to attempt using (StorageDriver).URLFor to serve all blobs. -func EnableRedirect(registry *registry) error { - registry.blobServer.redirect = true - return nil -} - -// EnableDelete is a functional option for NewRegistry. It enables deletion on -// the registry. -func EnableDelete(registry *registry) error { - registry.deleteEnabled = true - return nil -} - -// DisableDigestResumption is a functional option for NewRegistry. It should be -// used if the registry is acting as a caching proxy. -func DisableDigestResumption(registry *registry) error { - registry.resumableDigestEnabled = false - return nil -} - -// ManifestURLsAllowRegexp is a functional option for NewRegistry. -func ManifestURLsAllowRegexp(r *regexp.Regexp) RegistryOption { - return func(registry *registry) error { - registry.manifestURLs.allow = r - return nil - } -} - -// ManifestURLsDenyRegexp is a functional option for NewRegistry. -func ManifestURLsDenyRegexp(r *regexp.Regexp) RegistryOption { - return func(registry *registry) error { - registry.manifestURLs.deny = r - return nil - } -} - -// Schema1SigningKey returns a functional option for NewRegistry. It sets the -// key for signing all schema1 manifests. -func Schema1SigningKey(key libtrust.PrivateKey) RegistryOption { - return func(registry *registry) error { - registry.schema1SigningKey = key - return nil - } -} - -// BlobDescriptorServiceFactory returns a functional option for NewRegistry. It sets the -// factory to create BlobDescriptorServiceFactory middleware. -func BlobDescriptorServiceFactory(factory distribution.BlobDescriptorServiceFactory) RegistryOption { - return func(registry *registry) error { - registry.blobDescriptorServiceFactory = factory - return nil - } -} - -// BlobDescriptorCacheProvider returns a functional option for -// NewRegistry. It creates a cached blob statter for use by the -// registry. -func BlobDescriptorCacheProvider(blobDescriptorCacheProvider cache.BlobDescriptorCacheProvider) RegistryOption { - // TODO(aaronl): The duplication of statter across several objects is - // ugly, and prevents us from using interface types in the registry - // struct. Ideally, blobStore and blobServer should be lazily - // initialized, and use the current value of - // blobDescriptorCacheProvider. - return func(registry *registry) error { - if blobDescriptorCacheProvider != nil { - statter := cache.NewCachedBlobStatter(blobDescriptorCacheProvider, registry.statter) - registry.blobStore.statter = statter - registry.blobServer.statter = statter - registry.blobDescriptorCacheProvider = blobDescriptorCacheProvider - } - return nil - } -} - -// NewRegistry creates a new registry instance from the provided driver. The -// resulting registry may be shared by multiple goroutines but is cheap to -// allocate. If the Redirect option is specified, the backend blob server will -// attempt to use (StorageDriver).URLFor to serve all blobs. -func NewRegistry(ctx context.Context, driver storagedriver.StorageDriver, options ...RegistryOption) (distribution.Namespace, error) { - // create global statter - statter := &blobStatter{ - driver: driver, - } - - bs := &blobStore{ - driver: driver, - statter: statter, - } - - registry := ®istry{ - blobStore: bs, - blobServer: &blobServer{ - driver: driver, - statter: statter, - pathFn: bs.path, - }, - statter: statter, - resumableDigestEnabled: true, - } - - for _, option := range options { - if err := option(registry); err != nil { - return nil, err - } - } - - return registry, nil -} - -// Scope returns the namespace scope for a registry. The registry -// will only serve repositories contained within this scope. -func (reg *registry) Scope() distribution.Scope { - return distribution.GlobalScope -} - -// Repository returns an instance of the repository tied to the registry. -// Instances should not be shared between goroutines but are cheap to -// allocate. In general, they should be request scoped. -func (reg *registry) Repository(ctx context.Context, canonicalName reference.Named) (distribution.Repository, error) { - var descriptorCache distribution.BlobDescriptorService - if reg.blobDescriptorCacheProvider != nil { - var err error - descriptorCache, err = reg.blobDescriptorCacheProvider.RepositoryScoped(canonicalName.Name()) - if err != nil { - return nil, err - } - } - - return &repository{ - ctx: ctx, - registry: reg, - name: canonicalName, - descriptorCache: descriptorCache, - }, nil -} - -func (reg *registry) Blobs() distribution.BlobEnumerator { - return reg.blobStore -} - -func (reg *registry) BlobStatter() distribution.BlobStatter { - return reg.statter -} - -// repository provides name-scoped access to various services. -type repository struct { - *registry - ctx context.Context - name reference.Named - descriptorCache distribution.BlobDescriptorService -} - -// Name returns the name of the repository. -func (repo *repository) Named() reference.Named { - return repo.name -} - -func (repo *repository) Tags(ctx context.Context) distribution.TagService { - tags := &tagStore{ - repository: repo, - blobStore: repo.registry.blobStore, - } - - return tags -} - -// Manifests returns an instance of ManifestService. Instantiation is cheap and -// may be context sensitive in the future. The instance should be used similar -// to a request local. -func (repo *repository) Manifests(ctx context.Context, options ...distribution.ManifestServiceOption) (distribution.ManifestService, error) { - manifestLinkPathFns := []linkPathFunc{ - // NOTE(stevvooe): Need to search through multiple locations since - // 2.1.0 unintentionally linked into _layers. - manifestRevisionLinkPath, - blobLinkPath, - } - - manifestDirectoryPathSpec := manifestRevisionsPathSpec{name: repo.name.Name()} - - var statter distribution.BlobDescriptorService = &linkedBlobStatter{ - blobStore: repo.blobStore, - repository: repo, - linkPathFns: manifestLinkPathFns, - } - - if repo.registry.blobDescriptorServiceFactory != nil { - statter = repo.registry.blobDescriptorServiceFactory.BlobAccessController(statter) - } - - blobStore := &linkedBlobStore{ - ctx: ctx, - blobStore: repo.blobStore, - repository: repo, - deleteEnabled: repo.registry.deleteEnabled, - blobAccessController: statter, - - // TODO(stevvooe): linkPath limits this blob store to only - // manifests. This instance cannot be used for blob checks. - linkPathFns: manifestLinkPathFns, - linkDirectoryPathSpec: manifestDirectoryPathSpec, - } - - ms := &manifestStore{ - ctx: ctx, - repository: repo, - blobStore: blobStore, - schema1Handler: &signedManifestHandler{ - ctx: ctx, - schema1SigningKey: repo.schema1SigningKey, - repository: repo, - blobStore: blobStore, - }, - schema2Handler: &schema2ManifestHandler{ - ctx: ctx, - repository: repo, - blobStore: blobStore, - manifestURLs: repo.registry.manifestURLs, - }, - manifestListHandler: &manifestListHandler{ - ctx: ctx, - repository: repo, - blobStore: blobStore, - }, - } - - // Apply options - for _, option := range options { - err := option.Apply(ms) - if err != nil { - return nil, err - } - } - - return ms, nil -} - -// Blobs returns an instance of the BlobStore. Instantiation is cheap and -// may be context sensitive in the future. The instance should be used similar -// to a request local. -func (repo *repository) Blobs(ctx context.Context) distribution.BlobStore { - var statter distribution.BlobDescriptorService = &linkedBlobStatter{ - blobStore: repo.blobStore, - repository: repo, - linkPathFns: []linkPathFunc{blobLinkPath}, - } - - if repo.descriptorCache != nil { - statter = cache.NewCachedBlobStatter(repo.descriptorCache, statter) - } - - if repo.registry.blobDescriptorServiceFactory != nil { - statter = repo.registry.blobDescriptorServiceFactory.BlobAccessController(statter) - } - - return &linkedBlobStore{ - registry: repo.registry, - blobStore: repo.blobStore, - blobServer: repo.blobServer, - blobAccessController: statter, - repository: repo, - ctx: ctx, - - // TODO(stevvooe): linkPath limits this blob store to only layers. - // This instance cannot be used for manifest checks. - linkPathFns: []linkPathFunc{blobLinkPath}, - deleteEnabled: repo.registry.deleteEnabled, - resumableDigestEnabled: repo.resumableDigestEnabled, - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/schema2manifesthandler.go b/vendor/github.com/docker/distribution/registry/storage/schema2manifesthandler.go deleted file mode 100644 index 9fe71bb4d..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/schema2manifesthandler.go +++ /dev/null @@ -1,136 +0,0 @@ -package storage - -import ( - "encoding/json" - "errors" - "fmt" - "net/url" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/manifest/schema2" -) - -var ( - errUnexpectedURL = errors.New("unexpected URL on layer") - errMissingURL = errors.New("missing URL on layer") - errInvalidURL = errors.New("invalid URL on layer") -) - -//schema2ManifestHandler is a ManifestHandler that covers schema2 manifests. -type schema2ManifestHandler struct { - repository distribution.Repository - blobStore distribution.BlobStore - ctx context.Context - manifestURLs manifestURLs -} - -var _ ManifestHandler = &schema2ManifestHandler{} - -func (ms *schema2ManifestHandler) Unmarshal(ctx context.Context, dgst digest.Digest, content []byte) (distribution.Manifest, error) { - context.GetLogger(ms.ctx).Debug("(*schema2ManifestHandler).Unmarshal") - - var m schema2.DeserializedManifest - if err := json.Unmarshal(content, &m); err != nil { - return nil, err - } - - return &m, nil -} - -func (ms *schema2ManifestHandler) Put(ctx context.Context, manifest distribution.Manifest, skipDependencyVerification bool) (digest.Digest, error) { - context.GetLogger(ms.ctx).Debug("(*schema2ManifestHandler).Put") - - m, ok := manifest.(*schema2.DeserializedManifest) - if !ok { - return "", fmt.Errorf("non-schema2 manifest put to schema2ManifestHandler: %T", manifest) - } - - if err := ms.verifyManifest(ms.ctx, *m, skipDependencyVerification); err != nil { - return "", err - } - - mt, payload, err := m.Payload() - if err != nil { - return "", err - } - - revision, err := ms.blobStore.Put(ctx, mt, payload) - if err != nil { - context.GetLogger(ctx).Errorf("error putting payload into blobstore: %v", err) - return "", err - } - - return revision.Digest, nil -} - -// verifyManifest ensures that the manifest content is valid from the -// perspective of the registry. As a policy, the registry only tries to store -// valid content, leaving trust policies of that content up to consumers. -func (ms *schema2ManifestHandler) verifyManifest(ctx context.Context, mnfst schema2.DeserializedManifest, skipDependencyVerification bool) error { - var errs distribution.ErrManifestVerification - - if skipDependencyVerification { - return nil - } - - manifestService, err := ms.repository.Manifests(ctx) - if err != nil { - return err - } - - blobsService := ms.repository.Blobs(ctx) - - for _, descriptor := range mnfst.References() { - var err error - - switch descriptor.MediaType { - case schema2.MediaTypeForeignLayer: - // Clients download this layer from an external URL, so do not check for - // its presense. - if len(descriptor.URLs) == 0 { - err = errMissingURL - } - allow := ms.manifestURLs.allow - deny := ms.manifestURLs.deny - for _, u := range descriptor.URLs { - var pu *url.URL - pu, err = url.Parse(u) - if err != nil || (pu.Scheme != "http" && pu.Scheme != "https") || pu.Fragment != "" || (allow != nil && !allow.MatchString(u)) || (deny != nil && deny.MatchString(u)) { - err = errInvalidURL - break - } - } - case schema2.MediaTypeManifest, schema1.MediaTypeManifest: - var exists bool - exists, err = manifestService.Exists(ctx, descriptor.Digest) - if err != nil || !exists { - err = distribution.ErrBlobUnknown // just coerce to unknown. - } - - fallthrough // double check the blob store. - default: - // forward all else to blob storage - if len(descriptor.URLs) == 0 { - _, err = blobsService.Stat(ctx, descriptor.Digest) - } - } - - if err != nil { - if err != distribution.ErrBlobUnknown { - errs = append(errs, err) - } - - // On error here, we always append unknown blob errors. - errs = append(errs, distribution.ErrManifestBlobUnknown{Digest: descriptor.Digest}) - } - } - - if len(errs) != 0 { - return errs - } - - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/schema2manifesthandler_test.go b/vendor/github.com/docker/distribution/registry/storage/schema2manifesthandler_test.go deleted file mode 100644 index 5051fa3de..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/schema2manifesthandler_test.go +++ /dev/null @@ -1,136 +0,0 @@ -package storage - -import ( - "regexp" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/manifest/schema2" - "github.com/docker/distribution/registry/storage/driver/inmemory" -) - -func TestVerifyManifestForeignLayer(t *testing.T) { - ctx := context.Background() - inmemoryDriver := inmemory.New() - registry := createRegistry(t, inmemoryDriver, - ManifestURLsAllowRegexp(regexp.MustCompile("^https?://foo")), - ManifestURLsDenyRegexp(regexp.MustCompile("^https?://foo/nope"))) - repo := makeRepository(t, registry, "test") - manifestService := makeManifestService(t, repo) - - config, err := repo.Blobs(ctx).Put(ctx, schema2.MediaTypeConfig, nil) - if err != nil { - t.Fatal(err) - } - - layer, err := repo.Blobs(ctx).Put(ctx, schema2.MediaTypeLayer, nil) - if err != nil { - t.Fatal(err) - } - - foreignLayer := distribution.Descriptor{ - Digest: "sha256:463435349086340864309863409683460843608348608934092322395278926a", - Size: 6323, - MediaType: schema2.MediaTypeForeignLayer, - } - - template := schema2.Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 2, - MediaType: schema2.MediaTypeManifest, - }, - Config: config, - } - - type testcase struct { - BaseLayer distribution.Descriptor - URLs []string - Err error - } - - cases := []testcase{ - { - foreignLayer, - nil, - errMissingURL, - }, - { - // regular layers may have foreign urls - layer, - []string{"http://foo/bar"}, - nil, - }, - { - foreignLayer, - []string{"file:///local/file"}, - errInvalidURL, - }, - { - foreignLayer, - []string{"http://foo/bar#baz"}, - errInvalidURL, - }, - { - foreignLayer, - []string{""}, - errInvalidURL, - }, - { - foreignLayer, - []string{"https://foo/bar", ""}, - errInvalidURL, - }, - { - foreignLayer, - []string{"", "https://foo/bar"}, - errInvalidURL, - }, - { - foreignLayer, - []string{"http://nope/bar"}, - errInvalidURL, - }, - { - foreignLayer, - []string{"http://foo/nope"}, - errInvalidURL, - }, - { - foreignLayer, - []string{"http://foo/bar"}, - nil, - }, - { - foreignLayer, - []string{"https://foo/bar"}, - nil, - }, - } - - for _, c := range cases { - m := template - l := c.BaseLayer - l.URLs = c.URLs - m.Layers = []distribution.Descriptor{l} - dm, err := schema2.FromStruct(m) - if err != nil { - t.Error(err) - continue - } - - _, err = manifestService.Put(ctx, dm) - if verr, ok := err.(distribution.ErrManifestVerification); ok { - // Extract the first error - if len(verr) == 2 { - if _, ok = verr[1].(distribution.ErrManifestBlobUnknown); ok { - err = verr[0] - } - } - } - if err != c.Err { - t.Errorf("%#v: expected %v, got %v", l, c.Err, err) - } - } -} diff --git a/vendor/github.com/docker/distribution/registry/storage/signedmanifesthandler.go b/vendor/github.com/docker/distribution/registry/storage/signedmanifesthandler.go deleted file mode 100644 index 30d330824..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/signedmanifesthandler.go +++ /dev/null @@ -1,141 +0,0 @@ -package storage - -import ( - "encoding/json" - "fmt" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/reference" - "github.com/docker/libtrust" -) - -// signedManifestHandler is a ManifestHandler that covers schema1 manifests. It -// can unmarshal and put schema1 manifests that have been signed by libtrust. -type signedManifestHandler struct { - repository distribution.Repository - schema1SigningKey libtrust.PrivateKey - blobStore distribution.BlobStore - ctx context.Context -} - -var _ ManifestHandler = &signedManifestHandler{} - -func (ms *signedManifestHandler) Unmarshal(ctx context.Context, dgst digest.Digest, content []byte) (distribution.Manifest, error) { - context.GetLogger(ms.ctx).Debug("(*signedManifestHandler).Unmarshal") - - var ( - signatures [][]byte - err error - ) - - jsig, err := libtrust.NewJSONSignature(content, signatures...) - if err != nil { - return nil, err - } - - if ms.schema1SigningKey != nil { - if err := jsig.Sign(ms.schema1SigningKey); err != nil { - return nil, err - } - } - - // Extract the pretty JWS - raw, err := jsig.PrettySignature("signatures") - if err != nil { - return nil, err - } - - var sm schema1.SignedManifest - if err := json.Unmarshal(raw, &sm); err != nil { - return nil, err - } - return &sm, nil -} - -func (ms *signedManifestHandler) Put(ctx context.Context, manifest distribution.Manifest, skipDependencyVerification bool) (digest.Digest, error) { - context.GetLogger(ms.ctx).Debug("(*signedManifestHandler).Put") - - sm, ok := manifest.(*schema1.SignedManifest) - if !ok { - return "", fmt.Errorf("non-schema1 manifest put to signedManifestHandler: %T", manifest) - } - - if err := ms.verifyManifest(ms.ctx, *sm, skipDependencyVerification); err != nil { - return "", err - } - - mt := schema1.MediaTypeManifest - payload := sm.Canonical - - revision, err := ms.blobStore.Put(ctx, mt, payload) - if err != nil { - context.GetLogger(ctx).Errorf("error putting payload into blobstore: %v", err) - return "", err - } - - return revision.Digest, nil -} - -// verifyManifest ensures that the manifest content is valid from the -// perspective of the registry. It ensures that the signature is valid for the -// enclosed payload. As a policy, the registry only tries to store valid -// content, leaving trust policies of that content up to consumers. -func (ms *signedManifestHandler) verifyManifest(ctx context.Context, mnfst schema1.SignedManifest, skipDependencyVerification bool) error { - var errs distribution.ErrManifestVerification - - if len(mnfst.Name) > reference.NameTotalLengthMax { - errs = append(errs, - distribution.ErrManifestNameInvalid{ - Name: mnfst.Name, - Reason: fmt.Errorf("manifest name must not be more than %v characters", reference.NameTotalLengthMax), - }) - } - - if !reference.NameRegexp.MatchString(mnfst.Name) { - errs = append(errs, - distribution.ErrManifestNameInvalid{ - Name: mnfst.Name, - Reason: fmt.Errorf("invalid manifest name format"), - }) - } - - if len(mnfst.History) != len(mnfst.FSLayers) { - errs = append(errs, fmt.Errorf("mismatched history and fslayer cardinality %d != %d", - len(mnfst.History), len(mnfst.FSLayers))) - } - - if _, err := schema1.Verify(&mnfst); err != nil { - switch err { - case libtrust.ErrMissingSignatureKey, libtrust.ErrInvalidJSONContent, libtrust.ErrMissingSignatureKey: - errs = append(errs, distribution.ErrManifestUnverified{}) - default: - if err.Error() == "invalid signature" { // TODO(stevvooe): This should be exported by libtrust - errs = append(errs, distribution.ErrManifestUnverified{}) - } else { - errs = append(errs, err) - } - } - } - - if !skipDependencyVerification { - for _, fsLayer := range mnfst.References() { - _, err := ms.repository.Blobs(ctx).Stat(ctx, fsLayer.Digest) - if err != nil { - if err != distribution.ErrBlobUnknown { - errs = append(errs, err) - } - - // On error here, we always append unknown blob errors. - errs = append(errs, distribution.ErrManifestBlobUnknown{Digest: fsLayer.Digest}) - } - } - } - if len(errs) != 0 { - return errs - } - - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/tagstore.go b/vendor/github.com/docker/distribution/registry/storage/tagstore.go deleted file mode 100644 index 4386ffcac..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/tagstore.go +++ /dev/null @@ -1,191 +0,0 @@ -package storage - -import ( - "path" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - storagedriver "github.com/docker/distribution/registry/storage/driver" -) - -var _ distribution.TagService = &tagStore{} - -// tagStore provides methods to manage manifest tags in a backend storage driver. -// This implementation uses the same on-disk layout as the (now deleted) tag -// store. This provides backward compatibility with current registry deployments -// which only makes use of the Digest field of the returned distribution.Descriptor -// but does not enable full roundtripping of Descriptor objects -type tagStore struct { - repository *repository - blobStore *blobStore -} - -// All returns all tags -func (ts *tagStore) All(ctx context.Context) ([]string, error) { - var tags []string - - pathSpec, err := pathFor(manifestTagPathSpec{ - name: ts.repository.Named().Name(), - }) - if err != nil { - return tags, err - } - - entries, err := ts.blobStore.driver.List(ctx, pathSpec) - if err != nil { - switch err := err.(type) { - case storagedriver.PathNotFoundError: - return tags, distribution.ErrRepositoryUnknown{Name: ts.repository.Named().Name()} - default: - return tags, err - } - } - - for _, entry := range entries { - _, filename := path.Split(entry) - tags = append(tags, filename) - } - - return tags, nil -} - -// exists returns true if the specified manifest tag exists in the repository. -func (ts *tagStore) exists(ctx context.Context, tag string) (bool, error) { - tagPath, err := pathFor(manifestTagCurrentPathSpec{ - name: ts.repository.Named().Name(), - tag: tag, - }) - - if err != nil { - return false, err - } - - exists, err := exists(ctx, ts.blobStore.driver, tagPath) - if err != nil { - return false, err - } - - return exists, nil -} - -// Tag tags the digest with the given tag, updating the the store to point at -// the current tag. The digest must point to a manifest. -func (ts *tagStore) Tag(ctx context.Context, tag string, desc distribution.Descriptor) error { - currentPath, err := pathFor(manifestTagCurrentPathSpec{ - name: ts.repository.Named().Name(), - tag: tag, - }) - - if err != nil { - return err - } - - lbs := ts.linkedBlobStore(ctx, tag) - - // Link into the index - if err := lbs.linkBlob(ctx, desc); err != nil { - return err - } - - // Overwrite the current link - return ts.blobStore.link(ctx, currentPath, desc.Digest) -} - -// resolve the current revision for name and tag. -func (ts *tagStore) Get(ctx context.Context, tag string) (distribution.Descriptor, error) { - currentPath, err := pathFor(manifestTagCurrentPathSpec{ - name: ts.repository.Named().Name(), - tag: tag, - }) - - if err != nil { - return distribution.Descriptor{}, err - } - - revision, err := ts.blobStore.readlink(ctx, currentPath) - if err != nil { - switch err.(type) { - case storagedriver.PathNotFoundError: - return distribution.Descriptor{}, distribution.ErrTagUnknown{Tag: tag} - } - - return distribution.Descriptor{}, err - } - - return distribution.Descriptor{Digest: revision}, nil -} - -// Untag removes the tag association -func (ts *tagStore) Untag(ctx context.Context, tag string) error { - tagPath, err := pathFor(manifestTagPathSpec{ - name: ts.repository.Named().Name(), - tag: tag, - }) - - switch err.(type) { - case storagedriver.PathNotFoundError: - return distribution.ErrTagUnknown{Tag: tag} - case nil: - break - default: - return err - } - - return ts.blobStore.driver.Delete(ctx, tagPath) -} - -// linkedBlobStore returns the linkedBlobStore for the named tag, allowing one -// to index manifest blobs by tag name. While the tag store doesn't map -// precisely to the linked blob store, using this ensures the links are -// managed via the same code path. -func (ts *tagStore) linkedBlobStore(ctx context.Context, tag string) *linkedBlobStore { - return &linkedBlobStore{ - blobStore: ts.blobStore, - repository: ts.repository, - ctx: ctx, - linkPathFns: []linkPathFunc{func(name string, dgst digest.Digest) (string, error) { - return pathFor(manifestTagIndexEntryLinkPathSpec{ - name: name, - tag: tag, - revision: dgst, - }) - - }}, - } -} - -// Lookup recovers a list of tags which refer to this digest. When a manifest is deleted by -// digest, tag entries which point to it need to be recovered to avoid dangling tags. -func (ts *tagStore) Lookup(ctx context.Context, desc distribution.Descriptor) ([]string, error) { - allTags, err := ts.All(ctx) - switch err.(type) { - case distribution.ErrRepositoryUnknown: - // This tag store has been initialized but not yet populated - break - case nil: - break - default: - return nil, err - } - - var tags []string - for _, tag := range allTags { - tagLinkPathSpec := manifestTagCurrentPathSpec{ - name: ts.repository.Named().Name(), - tag: tag, - } - - tagLinkPath, err := pathFor(tagLinkPathSpec) - tagDigest, err := ts.blobStore.readlink(ctx, tagLinkPath) - if err != nil { - return nil, err - } - - if tagDigest == desc.Digest { - tags = append(tags, tag) - } - } - - return tags, nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/tagstore_test.go b/vendor/github.com/docker/distribution/registry/storage/tagstore_test.go deleted file mode 100644 index 554a46bf7..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/tagstore_test.go +++ /dev/null @@ -1,209 +0,0 @@ -package storage - -import ( - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/storage/driver/inmemory" -) - -type tagsTestEnv struct { - ts distribution.TagService - ctx context.Context -} - -func testTagStore(t *testing.T) *tagsTestEnv { - ctx := context.Background() - d := inmemory.New() - reg, err := NewRegistry(ctx, d) - if err != nil { - t.Fatal(err) - } - - repoRef, _ := reference.ParseNamed("a/b") - repo, err := reg.Repository(ctx, repoRef) - if err != nil { - t.Fatal(err) - } - - return &tagsTestEnv{ - ctx: ctx, - ts: repo.Tags(ctx), - } -} - -func TestTagStoreTag(t *testing.T) { - env := testTagStore(t) - tags := env.ts - ctx := env.ctx - - d := distribution.Descriptor{} - err := tags.Tag(ctx, "latest", d) - if err == nil { - t.Errorf("unexpected error putting malformed descriptor : %s", err) - } - - d.Digest = "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - err = tags.Tag(ctx, "latest", d) - if err != nil { - t.Error(err) - } - - d1, err := tags.Get(ctx, "latest") - if err != nil { - t.Error(err) - } - - if d1.Digest != d.Digest { - t.Error("put and get digest differ") - } - - // Overwrite existing - d.Digest = "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" - err = tags.Tag(ctx, "latest", d) - if err != nil { - t.Error(err) - } - - d1, err = tags.Get(ctx, "latest") - if err != nil { - t.Error(err) - } - - if d1.Digest != d.Digest { - t.Error("put and get digest differ") - } -} - -func TestTagStoreUnTag(t *testing.T) { - env := testTagStore(t) - tags := env.ts - ctx := env.ctx - desc := distribution.Descriptor{Digest: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"} - - err := tags.Untag(ctx, "latest") - if err == nil { - t.Errorf("Expected error untagging non-existant tag") - } - - err = tags.Tag(ctx, "latest", desc) - if err != nil { - t.Error(err) - } - - err = tags.Untag(ctx, "latest") - if err != nil { - t.Error(err) - } - - errExpect := distribution.ErrTagUnknown{Tag: "latest"}.Error() - _, err = tags.Get(ctx, "latest") - if err == nil || err.Error() != errExpect { - t.Error("Expected error getting untagged tag") - } -} - -func TestTagStoreAll(t *testing.T) { - env := testTagStore(t) - tagStore := env.ts - ctx := env.ctx - - alpha := "abcdefghijklmnopqrstuvwxyz" - for i := 0; i < len(alpha); i++ { - tag := alpha[i] - desc := distribution.Descriptor{Digest: "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"} - err := tagStore.Tag(ctx, string(tag), desc) - if err != nil { - t.Error(err) - } - } - - all, err := tagStore.All(ctx) - if err != nil { - t.Error(err) - } - if len(all) != len(alpha) { - t.Errorf("Unexpected count returned from enumerate") - } - - for i, c := range all { - if c != string(alpha[i]) { - t.Errorf("unexpected tag in enumerate %s", c) - } - } - - removed := "a" - err = tagStore.Untag(ctx, removed) - if err != nil { - t.Error(err) - } - - all, err = tagStore.All(ctx) - if err != nil { - t.Error(err) - } - for _, tag := range all { - if tag == removed { - t.Errorf("unexpected tag in enumerate %s", removed) - } - } - -} - -func TestTagLookup(t *testing.T) { - env := testTagStore(t) - tagStore := env.ts - ctx := env.ctx - - descA := distribution.Descriptor{Digest: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"} - desc0 := distribution.Descriptor{Digest: "sha256:0000000000000000000000000000000000000000000000000000000000000000"} - - tags, err := tagStore.Lookup(ctx, descA) - if err != nil { - t.Fatal(err) - } - if len(tags) != 0 { - t.Fatalf("Lookup returned > 0 tags from empty store") - } - - err = tagStore.Tag(ctx, "a", descA) - if err != nil { - t.Fatal(err) - } - - err = tagStore.Tag(ctx, "b", descA) - if err != nil { - t.Fatal(err) - } - - err = tagStore.Tag(ctx, "0", desc0) - if err != nil { - t.Fatal(err) - } - - err = tagStore.Tag(ctx, "1", desc0) - if err != nil { - t.Fatal(err) - } - - tags, err = tagStore.Lookup(ctx, descA) - if err != nil { - t.Fatal(err) - } - - if len(tags) != 2 { - t.Errorf("Lookup of descA returned %d tags, expected 2", len(tags)) - } - - tags, err = tagStore.Lookup(ctx, desc0) - if err != nil { - t.Fatal(err) - } - - if len(tags) != 2 { - t.Errorf("Lookup of descB returned %d tags, expected 2", len(tags)) - } - -} diff --git a/vendor/github.com/docker/distribution/registry/storage/util.go b/vendor/github.com/docker/distribution/registry/storage/util.go deleted file mode 100644 index 773d7ba0b..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/util.go +++ /dev/null @@ -1,21 +0,0 @@ -package storage - -import ( - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/storage/driver" -) - -// Exists provides a utility method to test whether or not a path exists in -// the given driver. -func exists(ctx context.Context, drv driver.StorageDriver, path string) (bool, error) { - if _, err := drv.Stat(ctx, path); err != nil { - switch err := err.(type) { - case driver.PathNotFoundError: - return false, nil - default: - return false, err - } - } - - return true, nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/vacuum.go b/vendor/github.com/docker/distribution/registry/storage/vacuum.go deleted file mode 100644 index 3bdfebf27..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/vacuum.go +++ /dev/null @@ -1,67 +0,0 @@ -package storage - -import ( - "path" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/registry/storage/driver" -) - -// vacuum contains functions for cleaning up repositories and blobs -// These functions will only reliably work on strongly consistent -// storage systems. -// https://en.wikipedia.org/wiki/Consistency_model - -// NewVacuum creates a new Vacuum -func NewVacuum(ctx context.Context, driver driver.StorageDriver) Vacuum { - return Vacuum{ - ctx: ctx, - driver: driver, - } -} - -// Vacuum removes content from the filesystem -type Vacuum struct { - driver driver.StorageDriver - ctx context.Context -} - -// RemoveBlob removes a blob from the filesystem -func (v Vacuum) RemoveBlob(dgst string) error { - d, err := digest.ParseDigest(dgst) - if err != nil { - return err - } - - blobPath, err := pathFor(blobPathSpec{digest: d}) - if err != nil { - return err - } - - context.GetLogger(v.ctx).Infof("Deleting blob: %s", blobPath) - - err = v.driver.Delete(v.ctx, blobPath) - if err != nil { - return err - } - - return nil -} - -// RemoveRepository removes a repository directory from the -// filesystem -func (v Vacuum) RemoveRepository(repoName string) error { - rootForRepository, err := pathFor(repositoriesRootPathSpec{}) - if err != nil { - return err - } - repoDir := path.Join(rootForRepository, repoName) - context.GetLogger(v.ctx).Infof("Deleting repo: %s", repoDir) - err = v.driver.Delete(v.ctx, repoDir) - if err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/distribution/registry/storage/walk.go b/vendor/github.com/docker/distribution/registry/storage/walk.go deleted file mode 100644 index d979796eb..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/walk.go +++ /dev/null @@ -1,59 +0,0 @@ -package storage - -import ( - "errors" - "fmt" - "sort" - - "github.com/docker/distribution/context" - storageDriver "github.com/docker/distribution/registry/storage/driver" -) - -// ErrSkipDir is used as a return value from onFileFunc to indicate that -// the directory named in the call is to be skipped. It is not returned -// as an error by any function. -var ErrSkipDir = errors.New("skip this directory") - -// WalkFn is called once per file by Walk -// If the returned error is ErrSkipDir and fileInfo refers -// to a directory, the directory will not be entered and Walk -// will continue the traversal. Otherwise Walk will return -type WalkFn func(fileInfo storageDriver.FileInfo) error - -// Walk traverses a filesystem defined within driver, starting -// from the given path, calling f on each file -func Walk(ctx context.Context, driver storageDriver.StorageDriver, from string, f WalkFn) error { - children, err := driver.List(ctx, from) - if err != nil { - return err - } - sort.Stable(sort.StringSlice(children)) - for _, child := range children { - // TODO(stevvooe): Calling driver.Stat for every entry is quite - // expensive when running against backends with a slow Stat - // implementation, such as s3. This is very likely a serious - // performance bottleneck. - fileInfo, err := driver.Stat(ctx, child) - if err != nil { - return err - } - err = f(fileInfo) - skipDir := (err == ErrSkipDir) - if err != nil && !skipDir { - return err - } - - if fileInfo.IsDir() && !skipDir { - if err := Walk(ctx, driver, child, f); err != nil { - return err - } - } - } - return nil -} - -// pushError formats an error type given a path and an error -// and pushes it to a slice of errors -func pushError(errors []error, path string, err error) []error { - return append(errors, fmt.Errorf("%s: %s", path, err)) -} diff --git a/vendor/github.com/docker/distribution/registry/storage/walk_test.go b/vendor/github.com/docker/distribution/registry/storage/walk_test.go deleted file mode 100644 index 3d7a4b1b6..000000000 --- a/vendor/github.com/docker/distribution/registry/storage/walk_test.go +++ /dev/null @@ -1,152 +0,0 @@ -package storage - -import ( - "fmt" - "sort" - "testing" - - "github.com/docker/distribution/context" - "github.com/docker/distribution/registry/storage/driver" - "github.com/docker/distribution/registry/storage/driver/inmemory" -) - -func testFS(t *testing.T) (driver.StorageDriver, map[string]string, context.Context) { - d := inmemory.New() - ctx := context.Background() - - expected := map[string]string{ - "/a": "dir", - "/a/b": "dir", - "/a/b/c": "dir", - "/a/b/c/d": "file", - "/a/b/c/e": "file", - "/a/b/f": "dir", - "/a/b/f/g": "file", - "/a/b/f/h": "file", - "/a/b/f/i": "file", - "/z": "dir", - "/z/y": "file", - } - - for p, typ := range expected { - if typ != "file" { - continue - } - - if err := d.PutContent(ctx, p, []byte(p)); err != nil { - t.Fatalf("unable to put content into fixture: %v", err) - } - } - - return d, expected, ctx -} - -func TestWalkErrors(t *testing.T) { - d, expected, ctx := testFS(t) - fileCount := len(expected) - err := Walk(ctx, d, "", func(fileInfo driver.FileInfo) error { - return nil - }) - if err == nil { - t.Error("Expected invalid root err") - } - - errEarlyExpected := fmt.Errorf("Early termination") - - err = Walk(ctx, d, "/", func(fileInfo driver.FileInfo) error { - // error on the 2nd file - if fileInfo.Path() == "/a/b" { - return errEarlyExpected - } - - delete(expected, fileInfo.Path()) - return nil - }) - if len(expected) != fileCount-1 { - t.Error("Walk failed to terminate with error") - } - if err != errEarlyExpected { - if err == nil { - t.Fatalf("expected an error due to early termination") - } else { - t.Error(err.Error()) - } - } - - err = Walk(ctx, d, "/nonexistent", func(fileInfo driver.FileInfo) error { - return nil - }) - if err == nil { - t.Errorf("Expected missing file err") - } - -} - -func TestWalk(t *testing.T) { - d, expected, ctx := testFS(t) - var traversed []string - err := Walk(ctx, d, "/", func(fileInfo driver.FileInfo) error { - filePath := fileInfo.Path() - filetype, ok := expected[filePath] - if !ok { - t.Fatalf("Unexpected file in walk: %q", filePath) - } - - if fileInfo.IsDir() { - if filetype != "dir" { - t.Errorf("Unexpected file type: %q", filePath) - } - } else { - if filetype != "file" { - t.Errorf("Unexpected file type: %q", filePath) - } - - // each file has its own path as the contents. If the length - // doesn't match the path length, fail. - if fileInfo.Size() != int64(len(fileInfo.Path())) { - t.Fatalf("unexpected size for %q: %v != %v", - fileInfo.Path(), fileInfo.Size(), len(fileInfo.Path())) - } - } - delete(expected, filePath) - traversed = append(traversed, filePath) - return nil - }) - if len(expected) > 0 { - t.Errorf("Missed files in walk: %q", expected) - } - - if !sort.StringsAreSorted(traversed) { - t.Errorf("result should be sorted: %v", traversed) - } - - if err != nil { - t.Fatalf(err.Error()) - } -} - -func TestWalkSkipDir(t *testing.T) { - d, expected, ctx := testFS(t) - err := Walk(ctx, d, "/", func(fileInfo driver.FileInfo) error { - filePath := fileInfo.Path() - if filePath == "/a/b" { - // skip processing /a/b/c and /a/b/c/d - return ErrSkipDir - } - delete(expected, filePath) - return nil - }) - if err != nil { - t.Fatalf(err.Error()) - } - if _, ok := expected["/a/b/c"]; !ok { - t.Errorf("/a/b/c not skipped") - } - if _, ok := expected["/a/b/c/d"]; !ok { - t.Errorf("/a/b/c/d not skipped") - } - if _, ok := expected["/a/b/c/e"]; !ok { - t.Errorf("/a/b/c/e not skipped") - } - -} diff --git a/vendor/github.com/docker/distribution/testutil/handler.go b/vendor/github.com/docker/distribution/testutil/handler.go deleted file mode 100644 index 00cd8a6ac..000000000 --- a/vendor/github.com/docker/distribution/testutil/handler.go +++ /dev/null @@ -1,148 +0,0 @@ -package testutil - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "sort" - "strings" -) - -// RequestResponseMap is an ordered mapping from Requests to Responses -type RequestResponseMap []RequestResponseMapping - -// RequestResponseMapping defines a Response to be sent in response to a given -// Request -type RequestResponseMapping struct { - Request Request - Response Response -} - -// Request is a simplified http.Request object -type Request struct { - // Method is the http method of the request, for example GET - Method string - - // Route is the http route of this request - Route string - - // QueryParams are the query parameters of this request - QueryParams map[string][]string - - // Body is the byte contents of the http request - Body []byte - - // Headers are the header for this request - Headers http.Header -} - -func (r Request) String() string { - queryString := "" - if len(r.QueryParams) > 0 { - keys := make([]string, 0, len(r.QueryParams)) - queryParts := make([]string, 0, len(r.QueryParams)) - for k := range r.QueryParams { - keys = append(keys, k) - } - sort.Strings(keys) - for _, k := range keys { - for _, val := range r.QueryParams[k] { - queryParts = append(queryParts, fmt.Sprintf("%s=%s", k, url.QueryEscape(val))) - } - } - queryString = "?" + strings.Join(queryParts, "&") - } - var headers []string - if len(r.Headers) > 0 { - var headerKeys []string - for k := range r.Headers { - headerKeys = append(headerKeys, k) - } - sort.Strings(headerKeys) - - for _, k := range headerKeys { - for _, val := range r.Headers[k] { - headers = append(headers, fmt.Sprintf("%s:%s", k, val)) - } - } - - } - return fmt.Sprintf("%s %s%s\n%s\n%s", r.Method, r.Route, queryString, headers, r.Body) -} - -// Response is a simplified http.Response object -type Response struct { - // Statuscode is the http status code of the Response - StatusCode int - - // Headers are the http headers of this Response - Headers http.Header - - // Body is the response body - Body []byte -} - -// testHandler is an http.Handler with a defined mapping from Request to an -// ordered list of Response objects -type testHandler struct { - responseMap map[string][]Response -} - -// NewHandler returns a new test handler that responds to defined requests -// with specified responses -// Each time a Request is received, the next Response is returned in the -// mapping, until no Responses are defined, at which point a 404 is sent back -func NewHandler(requestResponseMap RequestResponseMap) http.Handler { - responseMap := make(map[string][]Response) - for _, mapping := range requestResponseMap { - responses, ok := responseMap[mapping.Request.String()] - if ok { - responseMap[mapping.Request.String()] = append(responses, mapping.Response) - } else { - responseMap[mapping.Request.String()] = []Response{mapping.Response} - } - } - return &testHandler{responseMap: responseMap} -} - -func (app *testHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - - requestBody, _ := ioutil.ReadAll(r.Body) - request := Request{ - Method: r.Method, - Route: r.URL.Path, - QueryParams: r.URL.Query(), - Body: requestBody, - Headers: make(map[string][]string), - } - - // Add headers of interest here - for k, v := range r.Header { - if k == "If-None-Match" { - request.Headers[k] = v - } - } - - responses, ok := app.responseMap[request.String()] - - if !ok || len(responses) == 0 { - http.NotFound(w, r) - return - } - - response := responses[0] - app.responseMap[request.String()] = responses[1:] - - responseHeader := w.Header() - for k, v := range response.Headers { - responseHeader[k] = v - } - - w.WriteHeader(response.StatusCode) - - io.Copy(w, bytes.NewReader(response.Body)) -} diff --git a/vendor/github.com/docker/distribution/testutil/manifests.go b/vendor/github.com/docker/distribution/testutil/manifests.go deleted file mode 100644 index c4f9fef53..000000000 --- a/vendor/github.com/docker/distribution/testutil/manifests.go +++ /dev/null @@ -1,87 +0,0 @@ -package testutil - -import ( - "fmt" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/manifest/manifestlist" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/manifest/schema2" - "github.com/docker/libtrust" -) - -// MakeManifestList constructs a manifest list out of a list of manifest digests -func MakeManifestList(blobstatter distribution.BlobStatter, manifestDigests []digest.Digest) (*manifestlist.DeserializedManifestList, error) { - ctx := context.Background() - - var manifestDescriptors []manifestlist.ManifestDescriptor - for _, manifestDigest := range manifestDigests { - descriptor, err := blobstatter.Stat(ctx, manifestDigest) - if err != nil { - return nil, err - } - platformSpec := manifestlist.PlatformSpec{ - Architecture: "atari2600", - OS: "CP/M", - Variant: "ternary", - Features: []string{"VLIW", "superscalaroutoforderdevnull"}, - } - manifestDescriptor := manifestlist.ManifestDescriptor{ - Descriptor: descriptor, - Platform: platformSpec, - } - manifestDescriptors = append(manifestDescriptors, manifestDescriptor) - } - - return manifestlist.FromDescriptors(manifestDescriptors) -} - -// MakeSchema1Manifest constructs a schema 1 manifest from a given list of digests and returns -// the digest of the manifest -func MakeSchema1Manifest(digests []digest.Digest) (distribution.Manifest, error) { - manifest := schema1.Manifest{ - Versioned: manifest.Versioned{ - SchemaVersion: 1, - }, - Name: "who", - Tag: "cares", - } - - for _, digest := range digests { - manifest.FSLayers = append(manifest.FSLayers, schema1.FSLayer{BlobSum: digest}) - manifest.History = append(manifest.History, schema1.History{V1Compatibility: ""}) - } - - pk, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - return nil, fmt.Errorf("unexpected error generating private key: %v", err) - } - - signedManifest, err := schema1.Sign(&manifest, pk) - if err != nil { - return nil, fmt.Errorf("error signing manifest: %v", err) - } - - return signedManifest, nil -} - -// MakeSchema2Manifest constructs a schema 2 manifest from a given list of digests and returns -// the digest of the manifest -func MakeSchema2Manifest(repository distribution.Repository, digests []digest.Digest) (distribution.Manifest, error) { - ctx := context.Background() - blobStore := repository.Blobs(ctx) - builder := schema2.NewManifestBuilder(blobStore, []byte{}) - for _, digest := range digests { - builder.AppendReference(distribution.Descriptor{Digest: digest}) - } - - manifest, err := builder.Build(ctx) - if err != nil { - return nil, fmt.Errorf("unexpected error generating manifest: %v", err) - } - - return manifest, nil -} diff --git a/vendor/github.com/docker/distribution/testutil/tarfile.go b/vendor/github.com/docker/distribution/testutil/tarfile.go deleted file mode 100644 index a8ba01553..000000000 --- a/vendor/github.com/docker/distribution/testutil/tarfile.go +++ /dev/null @@ -1,115 +0,0 @@ -package testutil - -import ( - "archive/tar" - "bytes" - "fmt" - "io" - mrand "math/rand" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" -) - -// CreateRandomTarFile creates a random tarfile, returning it as an -// io.ReadSeeker along with its digest. An error is returned if there is a -// problem generating valid content. -func CreateRandomTarFile() (rs io.ReadSeeker, dgst digest.Digest, err error) { - nFiles := mrand.Intn(10) + 10 - target := &bytes.Buffer{} - wr := tar.NewWriter(target) - - // Perturb this on each iteration of the loop below. - header := &tar.Header{ - Mode: 0644, - ModTime: time.Now(), - Typeflag: tar.TypeReg, - Uname: "randocalrissian", - Gname: "cloudcity", - AccessTime: time.Now(), - ChangeTime: time.Now(), - } - - for fileNumber := 0; fileNumber < nFiles; fileNumber++ { - fileSize := mrand.Int63n(1<<20) + 1<<20 - - header.Name = fmt.Sprint(fileNumber) - header.Size = fileSize - - if err := wr.WriteHeader(header); err != nil { - return nil, "", err - } - - randomData := make([]byte, fileSize) - - // Fill up the buffer with some random data. - n, err := mrand.Read(randomData) - - if n != len(randomData) { - return nil, "", fmt.Errorf("short read creating random reader: %v bytes != %v bytes", n, len(randomData)) - } - - if err != nil { - return nil, "", err - } - - nn, err := io.Copy(wr, bytes.NewReader(randomData)) - if nn != fileSize { - return nil, "", fmt.Errorf("short copy writing random file to tar") - } - - if err != nil { - return nil, "", err - } - - if err := wr.Flush(); err != nil { - return nil, "", err - } - } - - if err := wr.Close(); err != nil { - return nil, "", err - } - - dgst = digest.FromBytes(target.Bytes()) - - return bytes.NewReader(target.Bytes()), dgst, nil -} - -// CreateRandomLayers returns a map of n digests. We don't particularly care -// about the order of said digests (since they're all random anyway). -func CreateRandomLayers(n int) (map[digest.Digest]io.ReadSeeker, error) { - digestMap := map[digest.Digest]io.ReadSeeker{} - for i := 0; i < n; i++ { - rs, ds, err := CreateRandomTarFile() - if err != nil { - return nil, fmt.Errorf("unexpected error generating test layer file: %v", err) - } - - dgst := digest.Digest(ds) - digestMap[dgst] = rs - } - return digestMap, nil -} - -// UploadBlobs lets you upload blobs to a repository -func UploadBlobs(repository distribution.Repository, layers map[digest.Digest]io.ReadSeeker) error { - ctx := context.Background() - for digest, rs := range layers { - wr, err := repository.Blobs(ctx).Create(ctx) - if err != nil { - return fmt.Errorf("unexpected error creating upload: %v", err) - } - - if _, err := io.Copy(wr, rs); err != nil { - return fmt.Errorf("unexpected error copying to upload: %v", err) - } - - if _, err := wr.Commit(ctx, distribution.Descriptor{Digest: digest}); err != nil { - return fmt.Errorf("unexpected error committinng upload: %v", err) - } - } - return nil -} diff --git a/vendor/github.com/docker/distribution/uuid/uuid.go b/vendor/github.com/docker/distribution/uuid/uuid.go deleted file mode 100644 index d433ccaf5..000000000 --- a/vendor/github.com/docker/distribution/uuid/uuid.go +++ /dev/null @@ -1,126 +0,0 @@ -// Package uuid provides simple UUID generation. Only version 4 style UUIDs -// can be generated. -// -// Please see http://tools.ietf.org/html/rfc4122 for details on UUIDs. -package uuid - -import ( - "crypto/rand" - "fmt" - "io" - "os" - "syscall" - "time" -) - -const ( - // Bits is the number of bits in a UUID - Bits = 128 - - // Size is the number of bytes in a UUID - Size = Bits / 8 - - format = "%08x-%04x-%04x-%04x-%012x" -) - -var ( - // ErrUUIDInvalid indicates a parsed string is not a valid uuid. - ErrUUIDInvalid = fmt.Errorf("invalid uuid") - - // Loggerf can be used to override the default logging destination. Such - // log messages in this library should be logged at warning or higher. - Loggerf = func(format string, args ...interface{}) {} -) - -// UUID represents a UUID value. UUIDs can be compared and set to other values -// and accessed by byte. -type UUID [Size]byte - -// Generate creates a new, version 4 uuid. -func Generate() (u UUID) { - const ( - // ensures we backoff for less than 450ms total. Use the following to - // select new value, in units of 10ms: - // n*(n+1)/2 = d -> n^2 + n - 2d -> n = (sqrt(8d + 1) - 1)/2 - maxretries = 9 - backoff = time.Millisecond * 10 - ) - - var ( - totalBackoff time.Duration - count int - retries int - ) - - for { - // This should never block but the read may fail. Because of this, - // we just try to read the random number generator until we get - // something. This is a very rare condition but may happen. - b := time.Duration(retries) * backoff - time.Sleep(b) - totalBackoff += b - - n, err := io.ReadFull(rand.Reader, u[count:]) - if err != nil { - if retryOnError(err) && retries < maxretries { - count += n - retries++ - Loggerf("error generating version 4 uuid, retrying: %v", err) - continue - } - - // Any other errors represent a system problem. What did someone - // do to /dev/urandom? - panic(fmt.Errorf("error reading random number generator, retried for %v: %v", totalBackoff.String(), err)) - } - - break - } - - u[6] = (u[6] & 0x0f) | 0x40 // set version byte - u[8] = (u[8] & 0x3f) | 0x80 // set high order byte 0b10{8,9,a,b} - - return u -} - -// Parse attempts to extract a uuid from the string or returns an error. -func Parse(s string) (u UUID, err error) { - if len(s) != 36 { - return UUID{}, ErrUUIDInvalid - } - - // create stack addresses for each section of the uuid. - p := make([][]byte, 5) - - if _, err := fmt.Sscanf(s, format, &p[0], &p[1], &p[2], &p[3], &p[4]); err != nil { - return u, err - } - - copy(u[0:4], p[0]) - copy(u[4:6], p[1]) - copy(u[6:8], p[2]) - copy(u[8:10], p[3]) - copy(u[10:16], p[4]) - - return -} - -func (u UUID) String() string { - return fmt.Sprintf(format, u[:4], u[4:6], u[6:8], u[8:10], u[10:]) -} - -// retryOnError tries to detect whether or not retrying would be fruitful. -func retryOnError(err error) bool { - switch err := err.(type) { - case *os.PathError: - return retryOnError(err.Err) // unpack the target error - case syscall.Errno: - if err == syscall.EPERM { - // EPERM represents an entropy pool exhaustion, a condition under - // which we backoff and retry. - return true - } - } - - return false -} diff --git a/vendor/github.com/docker/distribution/uuid/uuid_test.go b/vendor/github.com/docker/distribution/uuid/uuid_test.go deleted file mode 100644 index 09c3a7bb4..000000000 --- a/vendor/github.com/docker/distribution/uuid/uuid_test.go +++ /dev/null @@ -1,48 +0,0 @@ -package uuid - -import ( - "testing" -) - -const iterations = 1000 - -func TestUUID4Generation(t *testing.T) { - for i := 0; i < iterations; i++ { - u := Generate() - - if u[6]&0xf0 != 0x40 { - t.Fatalf("version byte not correctly set: %v, %08b %08b", u, u[6], u[6]&0xf0) - } - - if u[8]&0xc0 != 0x80 { - t.Fatalf("top order 8th byte not correctly set: %v, %b", u, u[8]) - } - } -} - -func TestParseAndEquality(t *testing.T) { - for i := 0; i < iterations; i++ { - u := Generate() - - parsed, err := Parse(u.String()) - if err != nil { - t.Fatalf("error parsing uuid %v: %v", u, err) - } - - if parsed != u { - t.Fatalf("parsing round trip failed: %v != %v", parsed, u) - } - } - - for _, c := range []string{ - "bad", - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", // correct length, incorrect format - " 20cc7775-2671-43c7-8742-51d1cfa23258", // leading space - "20cc7775-2671-43c7-8742-51d1cfa23258 ", // trailing space - "00000000-0000-0000-0000-x00000000000", // out of range character - } { - if _, err := Parse(c); err == nil { - t.Fatalf("parsing %q should have failed", c) - } - } -} diff --git a/vendor/github.com/docker/distribution/version/print.go b/vendor/github.com/docker/distribution/version/print.go deleted file mode 100644 index a82bce39f..000000000 --- a/vendor/github.com/docker/distribution/version/print.go +++ /dev/null @@ -1,26 +0,0 @@ -package version - -import ( - "fmt" - "io" - "os" -) - -// FprintVersion outputs the version string to the writer, in the following -// format, followed by a newline: -// -// -// -// For example, a binary "registry" built from github.com/docker/distribution -// with version "v2.0" would print the following: -// -// registry github.com/docker/distribution v2.0 -// -func FprintVersion(w io.Writer) { - fmt.Fprintln(w, os.Args[0], Package, Version) -} - -// PrintVersion outputs the version information, from Fprint, to stdout. -func PrintVersion() { - FprintVersion(os.Stdout) -} diff --git a/vendor/github.com/docker/distribution/version/version.go b/vendor/github.com/docker/distribution/version/version.go deleted file mode 100644 index 3b7210524..000000000 --- a/vendor/github.com/docker/distribution/version/version.go +++ /dev/null @@ -1,11 +0,0 @@ -package version - -// Package is the overall, canonical project import path under which the -// package was built. -var Package = "github.com/docker/distribution" - -// Version indicates which version of the binary is running. This is set to -// the latest release tag by hand, always suffixed by "+unknown". During -// build, it will be replaced by the actual version. The value here will be -// used if the registry is run after a go get based install. -var Version = "v2.6.2+unknown" diff --git a/vendor/github.com/docker/distribution/version/version.sh b/vendor/github.com/docker/distribution/version/version.sh deleted file mode 100755 index 53e29ce9b..000000000 --- a/vendor/github.com/docker/distribution/version/version.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -# This bash script outputs the current, desired content of version.go, using -# git describe. For best effect, pipe this to the target file. Generally, this -# only needs to updated for releases. The actual value of will be replaced -# during build time if the makefile is used. - -set -e - -cat < - -**Description** - - - -**Steps to reproduce the issue:** -1. -2. -3. - -**Describe the results you received:** - - -**Describe the results you expected:** - - -**Additional information you deem important (e.g. issue happens only occasionally):** - -**Output of `docker version`:** - -``` -(paste your output here) -``` - -**Output of `docker info`:** - -``` -(paste your output here) -``` - -**Additional environment details (AWS, VirtualBox, physical, etc.):** diff --git a/vendor/github.com/docker/docker/.github/PULL_REQUEST_TEMPLATE.md b/vendor/github.com/docker/docker/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 426981828..000000000 --- a/vendor/github.com/docker/docker/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,30 +0,0 @@ - - -**- What I did** - -**- How I did it** - -**- How to verify it** - -**- Description for the changelog** - - - -**- A picture of a cute animal (not mandatory but encouraged)** - diff --git a/vendor/github.com/docker/docker/api/errors/errors.go b/vendor/github.com/docker/docker/api/errors/errors.go deleted file mode 100644 index 29fd2545d..000000000 --- a/vendor/github.com/docker/docker/api/errors/errors.go +++ /dev/null @@ -1,47 +0,0 @@ -package errors - -import "net/http" - -// apiError is an error wrapper that also -// holds information about response status codes. -type apiError struct { - error - statusCode int -} - -// HTTPErrorStatusCode returns a status code. -func (e apiError) HTTPErrorStatusCode() int { - return e.statusCode -} - -// NewErrorWithStatusCode allows you to associate -// a specific HTTP Status Code to an error. -// The Server will take that code and set -// it as the response status. -func NewErrorWithStatusCode(err error, code int) error { - return apiError{err, code} -} - -// NewBadRequestError creates a new API error -// that has the 400 HTTP status code associated to it. -func NewBadRequestError(err error) error { - return NewErrorWithStatusCode(err, http.StatusBadRequest) -} - -// NewRequestForbiddenError creates a new API error -// that has the 403 HTTP status code associated to it. -func NewRequestForbiddenError(err error) error { - return NewErrorWithStatusCode(err, http.StatusForbidden) -} - -// NewRequestNotFoundError creates a new API error -// that has the 404 HTTP status code associated to it. -func NewRequestNotFoundError(err error) error { - return NewErrorWithStatusCode(err, http.StatusNotFound) -} - -// NewRequestConflictError creates a new API error -// that has the 409 HTTP status code associated to it. -func NewRequestConflictError(err error) error { - return NewErrorWithStatusCode(err, http.StatusConflict) -} diff --git a/vendor/github.com/docker/docker/api/fixtures/keyfile b/vendor/github.com/docker/docker/api/fixtures/keyfile deleted file mode 100644 index 322f25440..000000000 --- a/vendor/github.com/docker/docker/api/fixtures/keyfile +++ /dev/null @@ -1,7 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -keyID: AWX2:I27X:WQFX:IOMK:CNAK:O7PW:VYNB:ZLKC:CVAE:YJP2:SI4A:XXAY - -MHcCAQEEILHTRWdcpKWsnORxSFyBnndJ4ROU41hMtr/GCiLVvwBQoAoGCCqGSM49 -AwEHoUQDQgAElpVFbQ2V2UQKajqdE3fVxJ+/pE/YuEFOxWbOxF2be19BY209/iky -NzeFFK7SLpQ4CBJ7zDVXOHsMzrkY/GquGA== ------END EC PRIVATE KEY----- diff --git a/vendor/github.com/docker/docker/api/server/httputils/decoder.go b/vendor/github.com/docker/docker/api/server/httputils/decoder.go deleted file mode 100644 index 458eac560..000000000 --- a/vendor/github.com/docker/docker/api/server/httputils/decoder.go +++ /dev/null @@ -1,16 +0,0 @@ -package httputils - -import ( - "io" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/network" -) - -// ContainerDecoder specifies how -// to translate an io.Reader into -// container configuration. -type ContainerDecoder interface { - DecodeConfig(src io.Reader) (*container.Config, *container.HostConfig, *network.NetworkingConfig, error) - DecodeHostConfig(src io.Reader) (*container.HostConfig, error) -} diff --git a/vendor/github.com/docker/docker/api/server/httputils/errors.go b/vendor/github.com/docker/docker/api/server/httputils/errors.go deleted file mode 100644 index 59098a9df..000000000 --- a/vendor/github.com/docker/docker/api/server/httputils/errors.go +++ /dev/null @@ -1,101 +0,0 @@ -package httputils - -import ( - "net/http" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/versions" - "github.com/gorilla/mux" - "google.golang.org/grpc" -) - -// httpStatusError is an interface -// that errors with custom status codes -// implement to tell the api layer -// which response status to set. -type httpStatusError interface { - HTTPErrorStatusCode() int -} - -// inputValidationError is an interface -// that errors generated by invalid -// inputs can implement to tell the -// api layer to set a 400 status code -// in the response. -type inputValidationError interface { - IsValidationError() bool -} - -// GetHTTPErrorStatusCode retrieves status code from error message -func GetHTTPErrorStatusCode(err error) int { - if err == nil { - logrus.WithFields(logrus.Fields{"error": err}).Error("unexpected HTTP error handling") - return http.StatusInternalServerError - } - - var statusCode int - errMsg := err.Error() - - switch e := err.(type) { - case httpStatusError: - statusCode = e.HTTPErrorStatusCode() - case inputValidationError: - statusCode = http.StatusBadRequest - default: - // FIXME: this is brittle and should not be necessary, but we still need to identify if - // there are errors falling back into this logic. - // If we need to differentiate between different possible error types, - // we should create appropriate error types that implement the httpStatusError interface. - errStr := strings.ToLower(errMsg) - for _, status := range []struct { - keyword string - code int - }{ - {"not found", http.StatusNotFound}, - {"no such", http.StatusNotFound}, - {"bad parameter", http.StatusBadRequest}, - {"no command", http.StatusBadRequest}, - {"conflict", http.StatusConflict}, - {"impossible", http.StatusNotAcceptable}, - {"wrong login/password", http.StatusUnauthorized}, - {"unauthorized", http.StatusUnauthorized}, - {"hasn't been activated", http.StatusForbidden}, - {"this node", http.StatusServiceUnavailable}, - } { - if strings.Contains(errStr, status.keyword) { - statusCode = status.code - break - } - } - } - - if statusCode == 0 { - statusCode = http.StatusInternalServerError - } - - return statusCode -} - -func apiVersionSupportsJSONErrors(version string) bool { - const firstAPIVersionWithJSONErrors = "1.23" - return version == "" || versions.GreaterThan(version, firstAPIVersionWithJSONErrors) -} - -// MakeErrorHandler makes an HTTP handler that decodes a Docker error and -// returns it in the response. -func MakeErrorHandler(err error) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - statusCode := GetHTTPErrorStatusCode(err) - vars := mux.Vars(r) - if apiVersionSupportsJSONErrors(vars["version"]) { - response := &types.ErrorResponse{ - Message: err.Error(), - } - WriteJSON(w, statusCode, response) - } else { - http.Error(w, grpc.ErrorDesc(err), statusCode) - } - } -} diff --git a/vendor/github.com/docker/docker/api/server/httputils/form.go b/vendor/github.com/docker/docker/api/server/httputils/form.go deleted file mode 100644 index 20188c12d..000000000 --- a/vendor/github.com/docker/docker/api/server/httputils/form.go +++ /dev/null @@ -1,73 +0,0 @@ -package httputils - -import ( - "fmt" - "net/http" - "path/filepath" - "strconv" - "strings" -) - -// BoolValue transforms a form value in different formats into a boolean type. -func BoolValue(r *http.Request, k string) bool { - s := strings.ToLower(strings.TrimSpace(r.FormValue(k))) - return !(s == "" || s == "0" || s == "no" || s == "false" || s == "none") -} - -// BoolValueOrDefault returns the default bool passed if the query param is -// missing, otherwise it's just a proxy to boolValue above -func BoolValueOrDefault(r *http.Request, k string, d bool) bool { - if _, ok := r.Form[k]; !ok { - return d - } - return BoolValue(r, k) -} - -// Int64ValueOrZero parses a form value into an int64 type. -// It returns 0 if the parsing fails. -func Int64ValueOrZero(r *http.Request, k string) int64 { - val, err := Int64ValueOrDefault(r, k, 0) - if err != nil { - return 0 - } - return val -} - -// Int64ValueOrDefault parses a form value into an int64 type. If there is an -// error, returns the error. If there is no value returns the default value. -func Int64ValueOrDefault(r *http.Request, field string, def int64) (int64, error) { - if r.Form.Get(field) != "" { - value, err := strconv.ParseInt(r.Form.Get(field), 10, 64) - if err != nil { - return value, err - } - return value, nil - } - return def, nil -} - -// ArchiveOptions stores archive information for different operations. -type ArchiveOptions struct { - Name string - Path string -} - -// ArchiveFormValues parses form values and turns them into ArchiveOptions. -// It fails if the archive name and path are not in the request. -func ArchiveFormValues(r *http.Request, vars map[string]string) (ArchiveOptions, error) { - if err := ParseForm(r); err != nil { - return ArchiveOptions{}, err - } - - name := vars["name"] - path := filepath.FromSlash(r.Form.Get("path")) - - switch { - case name == "": - return ArchiveOptions{}, fmt.Errorf("bad parameter: 'name' cannot be empty") - case path == "": - return ArchiveOptions{}, fmt.Errorf("bad parameter: 'path' cannot be empty") - } - - return ArchiveOptions{name, path}, nil -} diff --git a/vendor/github.com/docker/docker/api/server/httputils/form_test.go b/vendor/github.com/docker/docker/api/server/httputils/form_test.go deleted file mode 100644 index c56f7c15e..000000000 --- a/vendor/github.com/docker/docker/api/server/httputils/form_test.go +++ /dev/null @@ -1,105 +0,0 @@ -package httputils - -import ( - "net/http" - "net/url" - "testing" -) - -func TestBoolValue(t *testing.T) { - cases := map[string]bool{ - "": false, - "0": false, - "no": false, - "false": false, - "none": false, - "1": true, - "yes": true, - "true": true, - "one": true, - "100": true, - } - - for c, e := range cases { - v := url.Values{} - v.Set("test", c) - r, _ := http.NewRequest("POST", "", nil) - r.Form = v - - a := BoolValue(r, "test") - if a != e { - t.Fatalf("Value: %s, expected: %v, actual: %v", c, e, a) - } - } -} - -func TestBoolValueOrDefault(t *testing.T) { - r, _ := http.NewRequest("GET", "", nil) - if !BoolValueOrDefault(r, "queryparam", true) { - t.Fatal("Expected to get true default value, got false") - } - - v := url.Values{} - v.Set("param", "") - r, _ = http.NewRequest("GET", "", nil) - r.Form = v - if BoolValueOrDefault(r, "param", true) { - t.Fatal("Expected not to get true") - } -} - -func TestInt64ValueOrZero(t *testing.T) { - cases := map[string]int64{ - "": 0, - "asdf": 0, - "0": 0, - "1": 1, - } - - for c, e := range cases { - v := url.Values{} - v.Set("test", c) - r, _ := http.NewRequest("POST", "", nil) - r.Form = v - - a := Int64ValueOrZero(r, "test") - if a != e { - t.Fatalf("Value: %s, expected: %v, actual: %v", c, e, a) - } - } -} - -func TestInt64ValueOrDefault(t *testing.T) { - cases := map[string]int64{ - "": -1, - "-1": -1, - "42": 42, - } - - for c, e := range cases { - v := url.Values{} - v.Set("test", c) - r, _ := http.NewRequest("POST", "", nil) - r.Form = v - - a, err := Int64ValueOrDefault(r, "test", -1) - if a != e { - t.Fatalf("Value: %s, expected: %v, actual: %v", c, e, a) - } - if err != nil { - t.Fatalf("Error should be nil, but received: %s", err) - } - } -} - -func TestInt64ValueOrDefaultWithError(t *testing.T) { - v := url.Values{} - v.Set("test", "invalid") - r, _ := http.NewRequest("POST", "", nil) - r.Form = v - - _, err := Int64ValueOrDefault(r, "test", -1) - if err == nil { - t.Fatalf("Expected an error.") - } -} diff --git a/vendor/github.com/docker/docker/api/server/httputils/httputils.go b/vendor/github.com/docker/docker/api/server/httputils/httputils.go deleted file mode 100644 index 7930ff7a0..000000000 --- a/vendor/github.com/docker/docker/api/server/httputils/httputils.go +++ /dev/null @@ -1,90 +0,0 @@ -package httputils - -import ( - "fmt" - "io" - "net/http" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api" -) - -// APIVersionKey is the client's requested API version. -const APIVersionKey = "api-version" - -// UAStringKey is used as key type for user-agent string in net/context struct -const UAStringKey = "upstream-user-agent" - -// APIFunc is an adapter to allow the use of ordinary functions as Docker API endpoints. -// Any function that has the appropriate signature can be registered as an API endpoint (e.g. getVersion). -type APIFunc func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error - -// HijackConnection interrupts the http response writer to get the -// underlying connection and operate with it. -func HijackConnection(w http.ResponseWriter) (io.ReadCloser, io.Writer, error) { - conn, _, err := w.(http.Hijacker).Hijack() - if err != nil { - return nil, nil, err - } - // Flush the options to make sure the client sets the raw mode - conn.Write([]byte{}) - return conn, conn, nil -} - -// CloseStreams ensures that a list for http streams are properly closed. -func CloseStreams(streams ...interface{}) { - for _, stream := range streams { - if tcpc, ok := stream.(interface { - CloseWrite() error - }); ok { - tcpc.CloseWrite() - } else if closer, ok := stream.(io.Closer); ok { - closer.Close() - } - } -} - -// CheckForJSON makes sure that the request's Content-Type is application/json. -func CheckForJSON(r *http.Request) error { - ct := r.Header.Get("Content-Type") - - // No Content-Type header is ok as long as there's no Body - if ct == "" { - if r.Body == nil || r.ContentLength == 0 { - return nil - } - } - - // Otherwise it better be json - if api.MatchesContentType(ct, "application/json") { - return nil - } - return fmt.Errorf("Content-Type specified (%s) must be 'application/json'", ct) -} - -// ParseForm ensures the request form is parsed even with invalid content types. -// If we don't do this, POST method without Content-type (even with empty body) will fail. -func ParseForm(r *http.Request) error { - if r == nil { - return nil - } - if err := r.ParseForm(); err != nil && !strings.HasPrefix(err.Error(), "mime:") { - return err - } - return nil -} - -// VersionFromContext returns an API version from the context using APIVersionKey. -// It panics if the context value does not have version.Version type. -func VersionFromContext(ctx context.Context) (ver string) { - if ctx == nil { - return - } - val := ctx.Value(APIVersionKey) - if val == nil { - return - } - return val.(string) -} diff --git a/vendor/github.com/docker/docker/api/server/httputils/httputils_write_json.go b/vendor/github.com/docker/docker/api/server/httputils/httputils_write_json.go deleted file mode 100644 index 4787cc3c3..000000000 --- a/vendor/github.com/docker/docker/api/server/httputils/httputils_write_json.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build go1.7 - -package httputils - -import ( - "encoding/json" - "net/http" -) - -// WriteJSON writes the value v to the http response stream as json with standard json encoding. -func WriteJSON(w http.ResponseWriter, code int, v interface{}) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(code) - enc := json.NewEncoder(w) - enc.SetEscapeHTML(false) - return enc.Encode(v) -} diff --git a/vendor/github.com/docker/docker/api/server/httputils/httputils_write_json_go16.go b/vendor/github.com/docker/docker/api/server/httputils/httputils_write_json_go16.go deleted file mode 100644 index bdc698173..000000000 --- a/vendor/github.com/docker/docker/api/server/httputils/httputils_write_json_go16.go +++ /dev/null @@ -1,16 +0,0 @@ -// +build go1.6,!go1.7 - -package httputils - -import ( - "encoding/json" - "net/http" -) - -// WriteJSON writes the value v to the http response stream as json with standard json encoding. -func WriteJSON(w http.ResponseWriter, code int, v interface{}) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(code) - enc := json.NewEncoder(w) - return enc.Encode(v) -} diff --git a/vendor/github.com/docker/docker/api/server/middleware.go b/vendor/github.com/docker/docker/api/server/middleware.go deleted file mode 100644 index 537ce8028..000000000 --- a/vendor/github.com/docker/docker/api/server/middleware.go +++ /dev/null @@ -1,24 +0,0 @@ -package server - -import ( - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/server/middleware" -) - -// handlerWithGlobalMiddlewares wraps the handler function for a request with -// the server's global middlewares. The order of the middlewares is backwards, -// meaning that the first in the list will be evaluated last. -func (s *Server) handlerWithGlobalMiddlewares(handler httputils.APIFunc) httputils.APIFunc { - next := handler - - for _, m := range s.middlewares { - next = m.WrapHandler(next) - } - - if s.cfg.Logging && logrus.GetLevel() == logrus.DebugLevel { - next = middleware.DebugRequestMiddleware(next) - } - - return next -} diff --git a/vendor/github.com/docker/docker/api/server/middleware/cors.go b/vendor/github.com/docker/docker/api/server/middleware/cors.go deleted file mode 100644 index ea725dbc7..000000000 --- a/vendor/github.com/docker/docker/api/server/middleware/cors.go +++ /dev/null @@ -1,37 +0,0 @@ -package middleware - -import ( - "net/http" - - "github.com/Sirupsen/logrus" - "golang.org/x/net/context" -) - -// CORSMiddleware injects CORS headers to each request -// when it's configured. -type CORSMiddleware struct { - defaultHeaders string -} - -// NewCORSMiddleware creates a new CORSMiddleware with default headers. -func NewCORSMiddleware(d string) CORSMiddleware { - return CORSMiddleware{defaultHeaders: d} -} - -// WrapHandler returns a new handler function wrapping the previous one in the request chain. -func (c CORSMiddleware) WrapHandler(handler func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error) func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - return func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - // If "api-cors-header" is not given, but "api-enable-cors" is true, we set cors to "*" - // otherwise, all head values will be passed to HTTP handler - corsHeaders := c.defaultHeaders - if corsHeaders == "" { - corsHeaders = "*" - } - - logrus.Debugf("CORS header is enabled and set to: %s", corsHeaders) - w.Header().Add("Access-Control-Allow-Origin", corsHeaders) - w.Header().Add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, X-Registry-Auth") - w.Header().Add("Access-Control-Allow-Methods", "HEAD, GET, POST, DELETE, PUT, OPTIONS") - return handler(ctx, w, r, vars) - } -} diff --git a/vendor/github.com/docker/docker/api/server/middleware/debug.go b/vendor/github.com/docker/docker/api/server/middleware/debug.go deleted file mode 100644 index 8c8567669..000000000 --- a/vendor/github.com/docker/docker/api/server/middleware/debug.go +++ /dev/null @@ -1,76 +0,0 @@ -package middleware - -import ( - "bufio" - "encoding/json" - "io" - "net/http" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/pkg/ioutils" - "golang.org/x/net/context" -) - -// DebugRequestMiddleware dumps the request to logger -func DebugRequestMiddleware(handler func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error) func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - return func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - logrus.Debugf("Calling %s %s", r.Method, r.RequestURI) - - if r.Method != "POST" { - return handler(ctx, w, r, vars) - } - if err := httputils.CheckForJSON(r); err != nil { - return handler(ctx, w, r, vars) - } - maxBodySize := 4096 // 4KB - if r.ContentLength > int64(maxBodySize) { - return handler(ctx, w, r, vars) - } - - body := r.Body - bufReader := bufio.NewReaderSize(body, maxBodySize) - r.Body = ioutils.NewReadCloserWrapper(bufReader, func() error { return body.Close() }) - - b, err := bufReader.Peek(maxBodySize) - if err != io.EOF { - // either there was an error reading, or the buffer is full (in which case the request is too large) - return handler(ctx, w, r, vars) - } - - var postForm map[string]interface{} - if err := json.Unmarshal(b, &postForm); err == nil { - maskSecretKeys(postForm) - formStr, errMarshal := json.Marshal(postForm) - if errMarshal == nil { - logrus.Debugf("form data: %s", string(formStr)) - } else { - logrus.Debugf("form data: %q", postForm) - } - } - - return handler(ctx, w, r, vars) - } -} - -func maskSecretKeys(inp interface{}) { - if arr, ok := inp.([]interface{}); ok { - for _, f := range arr { - maskSecretKeys(f) - } - return - } - if form, ok := inp.(map[string]interface{}); ok { - loop0: - for k, v := range form { - for _, m := range []string{"password", "secret", "jointoken", "unlockkey"} { - if strings.EqualFold(m, k) { - form[k] = "*****" - continue loop0 - } - } - maskSecretKeys(v) - } - } -} diff --git a/vendor/github.com/docker/docker/api/server/middleware/experimental.go b/vendor/github.com/docker/docker/api/server/middleware/experimental.go deleted file mode 100644 index b8f56e88b..000000000 --- a/vendor/github.com/docker/docker/api/server/middleware/experimental.go +++ /dev/null @@ -1,29 +0,0 @@ -package middleware - -import ( - "net/http" - - "golang.org/x/net/context" -) - -// ExperimentalMiddleware is a the middleware in charge of adding the -// 'Docker-Experimental' header to every outgoing request -type ExperimentalMiddleware struct { - experimental string -} - -// NewExperimentalMiddleware creates a new ExperimentalMiddleware -func NewExperimentalMiddleware(experimentalEnabled bool) ExperimentalMiddleware { - if experimentalEnabled { - return ExperimentalMiddleware{"true"} - } - return ExperimentalMiddleware{"false"} -} - -// WrapHandler returns a new handler function wrapping the previous one in the request chain. -func (e ExperimentalMiddleware) WrapHandler(handler func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error) func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - return func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - w.Header().Set("Docker-Experimental", e.experimental) - return handler(ctx, w, r, vars) - } -} diff --git a/vendor/github.com/docker/docker/api/server/middleware/middleware.go b/vendor/github.com/docker/docker/api/server/middleware/middleware.go deleted file mode 100644 index dc1f5bfa0..000000000 --- a/vendor/github.com/docker/docker/api/server/middleware/middleware.go +++ /dev/null @@ -1,13 +0,0 @@ -package middleware - -import ( - "net/http" - - "golang.org/x/net/context" -) - -// Middleware is an interface to allow the use of ordinary functions as Docker API filters. -// Any struct that has the appropriate signature can be registered as a middleware. -type Middleware interface { - WrapHandler(func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error) func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error -} diff --git a/vendor/github.com/docker/docker/api/server/middleware/version.go b/vendor/github.com/docker/docker/api/server/middleware/version.go deleted file mode 100644 index 11014659e..000000000 --- a/vendor/github.com/docker/docker/api/server/middleware/version.go +++ /dev/null @@ -1,50 +0,0 @@ -package middleware - -import ( - "fmt" - "net/http" - "runtime" - - "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/types/versions" - "golang.org/x/net/context" -) - -// VersionMiddleware is a middleware that -// validates the client and server versions. -type VersionMiddleware struct { - serverVersion string - defaultVersion string - minVersion string -} - -// NewVersionMiddleware creates a new VersionMiddleware -// with the default versions. -func NewVersionMiddleware(s, d, m string) VersionMiddleware { - return VersionMiddleware{ - serverVersion: s, - defaultVersion: d, - minVersion: m, - } -} - -// WrapHandler returns a new handler function wrapping the previous one in the request chain. -func (v VersionMiddleware) WrapHandler(handler func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error) func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - return func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - apiVersion := vars["version"] - if apiVersion == "" { - apiVersion = v.defaultVersion - } - - if versions.LessThan(apiVersion, v.minVersion) { - return errors.NewBadRequestError(fmt.Errorf("client version %s is too old. Minimum supported API version is %s, please upgrade your client to a newer version", apiVersion, v.minVersion)) - } - - header := fmt.Sprintf("Docker/%s (%s)", v.serverVersion, runtime.GOOS) - w.Header().Set("Server", header) - w.Header().Set("API-Version", v.defaultVersion) - ctx = context.WithValue(ctx, "api-version", apiVersion) - return handler(ctx, w, r, vars) - } - -} diff --git a/vendor/github.com/docker/docker/api/server/middleware/version_test.go b/vendor/github.com/docker/docker/api/server/middleware/version_test.go deleted file mode 100644 index 9e72efd78..000000000 --- a/vendor/github.com/docker/docker/api/server/middleware/version_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package middleware - -import ( - "net/http" - "net/http/httptest" - "strings" - "testing" - - "github.com/docker/docker/api/server/httputils" - "golang.org/x/net/context" -) - -func TestVersionMiddleware(t *testing.T) { - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if httputils.VersionFromContext(ctx) == "" { - t.Fatalf("Expected version, got empty string") - } - return nil - } - - defaultVersion := "1.10.0" - minVersion := "1.2.0" - m := NewVersionMiddleware(defaultVersion, defaultVersion, minVersion) - h := m.WrapHandler(handler) - - req, _ := http.NewRequest("GET", "/containers/json", nil) - resp := httptest.NewRecorder() - ctx := context.Background() - if err := h(ctx, resp, req, map[string]string{}); err != nil { - t.Fatal(err) - } -} - -func TestVersionMiddlewareWithErrors(t *testing.T) { - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if httputils.VersionFromContext(ctx) == "" { - t.Fatalf("Expected version, got empty string") - } - return nil - } - - defaultVersion := "1.10.0" - minVersion := "1.2.0" - m := NewVersionMiddleware(defaultVersion, defaultVersion, minVersion) - h := m.WrapHandler(handler) - - req, _ := http.NewRequest("GET", "/containers/json", nil) - resp := httptest.NewRecorder() - ctx := context.Background() - - vars := map[string]string{"version": "0.1"} - err := h(ctx, resp, req, vars) - - if !strings.Contains(err.Error(), "client version 0.1 is too old. Minimum supported API version is 1.2.0") { - t.Fatalf("Expected too old client error, got %v", err) - } -} diff --git a/vendor/github.com/docker/docker/api/server/profiler.go b/vendor/github.com/docker/docker/api/server/profiler.go deleted file mode 100644 index 8bf8384fd..000000000 --- a/vendor/github.com/docker/docker/api/server/profiler.go +++ /dev/null @@ -1,41 +0,0 @@ -package server - -import ( - "expvar" - "fmt" - "net/http" - "net/http/pprof" - - "github.com/gorilla/mux" -) - -const debugPathPrefix = "/debug/" - -func profilerSetup(mainRouter *mux.Router) { - var r = mainRouter.PathPrefix(debugPathPrefix).Subrouter() - r.HandleFunc("/vars", expVars) - r.HandleFunc("/pprof/", pprof.Index) - r.HandleFunc("/pprof/cmdline", pprof.Cmdline) - r.HandleFunc("/pprof/profile", pprof.Profile) - r.HandleFunc("/pprof/symbol", pprof.Symbol) - r.HandleFunc("/pprof/trace", pprof.Trace) - r.HandleFunc("/pprof/block", pprof.Handler("block").ServeHTTP) - r.HandleFunc("/pprof/heap", pprof.Handler("heap").ServeHTTP) - r.HandleFunc("/pprof/goroutine", pprof.Handler("goroutine").ServeHTTP) - r.HandleFunc("/pprof/threadcreate", pprof.Handler("threadcreate").ServeHTTP) -} - -// Replicated from expvar.go as not public. -func expVars(w http.ResponseWriter, r *http.Request) { - first := true - w.Header().Set("Content-Type", "application/json; charset=utf-8") - fmt.Fprintf(w, "{\n") - expvar.Do(func(kv expvar.KeyValue) { - if !first { - fmt.Fprintf(w, ",\n") - } - first = false - fmt.Fprintf(w, "%q: %s", kv.Key, kv.Value) - }) - fmt.Fprintf(w, "\n}\n") -} diff --git a/vendor/github.com/docker/docker/api/server/router/build/backend.go b/vendor/github.com/docker/docker/api/server/router/build/backend.go deleted file mode 100644 index 0f01c11af..000000000 --- a/vendor/github.com/docker/docker/api/server/router/build/backend.go +++ /dev/null @@ -1,20 +0,0 @@ -package build - -import ( - "io" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "golang.org/x/net/context" -) - -// Backend abstracts an image builder whose only purpose is to build an image referenced by an imageID. -type Backend interface { - // Build builds a Docker image referenced by an imageID string. - // - // Note: Tagging an image should not be done by a Builder, it should instead be done - // by the caller. - // - // TODO: make this return a reference instead of string - BuildFromContext(ctx context.Context, src io.ReadCloser, remote string, buildOptions *types.ImageBuildOptions, pg backend.ProgressWriter) (string, error) -} diff --git a/vendor/github.com/docker/docker/api/server/router/build/build.go b/vendor/github.com/docker/docker/api/server/router/build/build.go deleted file mode 100644 index 959498e0f..000000000 --- a/vendor/github.com/docker/docker/api/server/router/build/build.go +++ /dev/null @@ -1,29 +0,0 @@ -package build - -import "github.com/docker/docker/api/server/router" - -// buildRouter is a router to talk with the build controller -type buildRouter struct { - backend Backend - routes []router.Route -} - -// NewRouter initializes a new build router -func NewRouter(b Backend) router.Router { - r := &buildRouter{ - backend: b, - } - r.initRoutes() - return r -} - -// Routes returns the available routers to the build controller -func (r *buildRouter) Routes() []router.Route { - return r.routes -} - -func (r *buildRouter) initRoutes() { - r.routes = []router.Route{ - router.Cancellable(router.NewPostRoute("/build", r.postBuild)), - } -} diff --git a/vendor/github.com/docker/docker/api/server/router/build/build_routes.go b/vendor/github.com/docker/docker/api/server/router/build/build_routes.go deleted file mode 100644 index 75425b19f..000000000 --- a/vendor/github.com/docker/docker/api/server/router/build/build_routes.go +++ /dev/null @@ -1,225 +0,0 @@ -package build - -import ( - "bytes" - "encoding/base64" - "encoding/json" - "fmt" - "io" - "net/http" - "runtime" - "strconv" - "strings" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/pkg/streamformatter" - "github.com/docker/go-units" - "golang.org/x/net/context" -) - -func newImageBuildOptions(ctx context.Context, r *http.Request) (*types.ImageBuildOptions, error) { - version := httputils.VersionFromContext(ctx) - options := &types.ImageBuildOptions{} - if httputils.BoolValue(r, "forcerm") && versions.GreaterThanOrEqualTo(version, "1.12") { - options.Remove = true - } else if r.FormValue("rm") == "" && versions.GreaterThanOrEqualTo(version, "1.12") { - options.Remove = true - } else { - options.Remove = httputils.BoolValue(r, "rm") - } - if httputils.BoolValue(r, "pull") && versions.GreaterThanOrEqualTo(version, "1.16") { - options.PullParent = true - } - - options.Dockerfile = r.FormValue("dockerfile") - options.SuppressOutput = httputils.BoolValue(r, "q") - options.NoCache = httputils.BoolValue(r, "nocache") - options.ForceRemove = httputils.BoolValue(r, "forcerm") - options.MemorySwap = httputils.Int64ValueOrZero(r, "memswap") - options.Memory = httputils.Int64ValueOrZero(r, "memory") - options.CPUShares = httputils.Int64ValueOrZero(r, "cpushares") - options.CPUPeriod = httputils.Int64ValueOrZero(r, "cpuperiod") - options.CPUQuota = httputils.Int64ValueOrZero(r, "cpuquota") - options.CPUSetCPUs = r.FormValue("cpusetcpus") - options.CPUSetMems = r.FormValue("cpusetmems") - options.CgroupParent = r.FormValue("cgroupparent") - options.NetworkMode = r.FormValue("networkmode") - options.Tags = r.Form["t"] - options.SecurityOpt = r.Form["securityopt"] - options.Squash = httputils.BoolValue(r, "squash") - - if r.Form.Get("shmsize") != "" { - shmSize, err := strconv.ParseInt(r.Form.Get("shmsize"), 10, 64) - if err != nil { - return nil, err - } - options.ShmSize = shmSize - } - - if i := container.Isolation(r.FormValue("isolation")); i != "" { - if !container.Isolation.IsValid(i) { - return nil, fmt.Errorf("Unsupported isolation: %q", i) - } - options.Isolation = i - } - - if runtime.GOOS != "windows" && options.SecurityOpt != nil { - return nil, fmt.Errorf("the daemon on this platform does not support --security-opt to build") - } - - var buildUlimits = []*units.Ulimit{} - ulimitsJSON := r.FormValue("ulimits") - if ulimitsJSON != "" { - if err := json.Unmarshal([]byte(ulimitsJSON), &buildUlimits); err != nil { - return nil, err - } - options.Ulimits = buildUlimits - } - - var buildArgs = map[string]*string{} - buildArgsJSON := r.FormValue("buildargs") - - // Note that there are two ways a --build-arg might appear in the - // json of the query param: - // "foo":"bar" - // and "foo":nil - // The first is the normal case, ie. --build-arg foo=bar - // or --build-arg foo - // where foo's value was picked up from an env var. - // The second ("foo":nil) is where they put --build-arg foo - // but "foo" isn't set as an env var. In that case we can't just drop - // the fact they mentioned it, we need to pass that along to the builder - // so that it can print a warning about "foo" being unused if there is - // no "ARG foo" in the Dockerfile. - if buildArgsJSON != "" { - if err := json.Unmarshal([]byte(buildArgsJSON), &buildArgs); err != nil { - return nil, err - } - options.BuildArgs = buildArgs - } - - var labels = map[string]string{} - labelsJSON := r.FormValue("labels") - if labelsJSON != "" { - if err := json.Unmarshal([]byte(labelsJSON), &labels); err != nil { - return nil, err - } - options.Labels = labels - } - - var cacheFrom = []string{} - cacheFromJSON := r.FormValue("cachefrom") - if cacheFromJSON != "" { - if err := json.Unmarshal([]byte(cacheFromJSON), &cacheFrom); err != nil { - return nil, err - } - options.CacheFrom = cacheFrom - } - - return options, nil -} - -type syncWriter struct { - w io.Writer - mu sync.Mutex -} - -func (s *syncWriter) Write(b []byte) (count int, err error) { - s.mu.Lock() - count, err = s.w.Write(b) - s.mu.Unlock() - return -} - -func (br *buildRouter) postBuild(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var ( - authConfigs = map[string]types.AuthConfig{} - authConfigsEncoded = r.Header.Get("X-Registry-Config") - notVerboseBuffer = bytes.NewBuffer(nil) - ) - - if authConfigsEncoded != "" { - authConfigsJSON := base64.NewDecoder(base64.URLEncoding, strings.NewReader(authConfigsEncoded)) - if err := json.NewDecoder(authConfigsJSON).Decode(&authConfigs); err != nil { - // for a pull it is not an error if no auth was given - // to increase compatibility with the existing api it is defaulting - // to be empty. - } - } - - w.Header().Set("Content-Type", "application/json") - - output := ioutils.NewWriteFlusher(w) - defer output.Close() - sf := streamformatter.NewJSONStreamFormatter() - errf := func(err error) error { - if httputils.BoolValue(r, "q") && notVerboseBuffer.Len() > 0 { - output.Write(notVerboseBuffer.Bytes()) - } - // Do not write the error in the http output if it's still empty. - // This prevents from writing a 200(OK) when there is an internal error. - if !output.Flushed() { - return err - } - _, err = w.Write(sf.FormatError(err)) - if err != nil { - logrus.Warnf("could not write error response: %v", err) - } - return nil - } - - buildOptions, err := newImageBuildOptions(ctx, r) - if err != nil { - return errf(err) - } - buildOptions.AuthConfigs = authConfigs - - remoteURL := r.FormValue("remote") - - // Currently, only used if context is from a remote url. - // Look at code in DetectContextFromRemoteURL for more information. - createProgressReader := func(in io.ReadCloser) io.ReadCloser { - progressOutput := sf.NewProgressOutput(output, true) - if buildOptions.SuppressOutput { - progressOutput = sf.NewProgressOutput(notVerboseBuffer, true) - } - return progress.NewProgressReader(in, progressOutput, r.ContentLength, "Downloading context", remoteURL) - } - - out := io.Writer(output) - if buildOptions.SuppressOutput { - out = notVerboseBuffer - } - out = &syncWriter{w: out} - stdout := &streamformatter.StdoutFormatter{Writer: out, StreamFormatter: sf} - stderr := &streamformatter.StderrFormatter{Writer: out, StreamFormatter: sf} - - pg := backend.ProgressWriter{ - Output: out, - StdoutFormatter: stdout, - StderrFormatter: stderr, - ProgressReaderFunc: createProgressReader, - } - - imgID, err := br.backend.BuildFromContext(ctx, r.Body, remoteURL, buildOptions, pg) - if err != nil { - return errf(err) - } - - // Everything worked so if -q was provided the output from the daemon - // should be just the image ID and we'll print that to stdout. - if buildOptions.SuppressOutput { - stdout := &streamformatter.StdoutFormatter{Writer: output, StreamFormatter: sf} - fmt.Fprintf(stdout, "%s\n", string(imgID)) - } - - return nil -} diff --git a/vendor/github.com/docker/docker/api/server/router/checkpoint/backend.go b/vendor/github.com/docker/docker/api/server/router/checkpoint/backend.go deleted file mode 100644 index 8810f88b7..000000000 --- a/vendor/github.com/docker/docker/api/server/router/checkpoint/backend.go +++ /dev/null @@ -1,10 +0,0 @@ -package checkpoint - -import "github.com/docker/docker/api/types" - -// Backend for Checkpoint -type Backend interface { - CheckpointCreate(container string, config types.CheckpointCreateOptions) error - CheckpointDelete(container string, config types.CheckpointDeleteOptions) error - CheckpointList(container string, config types.CheckpointListOptions) ([]types.Checkpoint, error) -} diff --git a/vendor/github.com/docker/docker/api/server/router/checkpoint/checkpoint.go b/vendor/github.com/docker/docker/api/server/router/checkpoint/checkpoint.go deleted file mode 100644 index c1e93926f..000000000 --- a/vendor/github.com/docker/docker/api/server/router/checkpoint/checkpoint.go +++ /dev/null @@ -1,36 +0,0 @@ -package checkpoint - -import ( - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/server/router" -) - -// checkpointRouter is a router to talk with the checkpoint controller -type checkpointRouter struct { - backend Backend - decoder httputils.ContainerDecoder - routes []router.Route -} - -// NewRouter initializes a new checkpoint router -func NewRouter(b Backend, decoder httputils.ContainerDecoder) router.Router { - r := &checkpointRouter{ - backend: b, - decoder: decoder, - } - r.initRoutes() - return r -} - -// Routes returns the available routers to the checkpoint controller -func (r *checkpointRouter) Routes() []router.Route { - return r.routes -} - -func (r *checkpointRouter) initRoutes() { - r.routes = []router.Route{ - router.Experimental(router.NewGetRoute("/containers/{name:.*}/checkpoints", r.getContainerCheckpoints)), - router.Experimental(router.NewPostRoute("/containers/{name:.*}/checkpoints", r.postContainerCheckpoint)), - router.Experimental(router.NewDeleteRoute("/containers/{name}/checkpoints/{checkpoint}", r.deleteContainerCheckpoint)), - } -} diff --git a/vendor/github.com/docker/docker/api/server/router/checkpoint/checkpoint_routes.go b/vendor/github.com/docker/docker/api/server/router/checkpoint/checkpoint_routes.go deleted file mode 100644 index f98843119..000000000 --- a/vendor/github.com/docker/docker/api/server/router/checkpoint/checkpoint_routes.go +++ /dev/null @@ -1,65 +0,0 @@ -package checkpoint - -import ( - "encoding/json" - "net/http" - - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -func (s *checkpointRouter) postContainerCheckpoint(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - var options types.CheckpointCreateOptions - - decoder := json.NewDecoder(r.Body) - if err := decoder.Decode(&options); err != nil { - return err - } - - err := s.backend.CheckpointCreate(vars["name"], options) - if err != nil { - return err - } - - w.WriteHeader(http.StatusCreated) - return nil -} - -func (s *checkpointRouter) getContainerCheckpoints(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - checkpoints, err := s.backend.CheckpointList(vars["name"], types.CheckpointListOptions{ - CheckpointDir: r.Form.Get("dir"), - }) - - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, checkpoints) -} - -func (s *checkpointRouter) deleteContainerCheckpoint(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - err := s.backend.CheckpointDelete(vars["name"], types.CheckpointDeleteOptions{ - CheckpointDir: r.Form.Get("dir"), - CheckpointID: vars["checkpoint"], - }) - - if err != nil { - return err - } - - w.WriteHeader(http.StatusNoContent) - return nil -} diff --git a/vendor/github.com/docker/docker/api/server/router/container/backend.go b/vendor/github.com/docker/docker/api/server/router/container/backend.go deleted file mode 100644 index 0d20188cc..000000000 --- a/vendor/github.com/docker/docker/api/server/router/container/backend.go +++ /dev/null @@ -1,79 +0,0 @@ -package container - -import ( - "io" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/pkg/archive" -) - -// execBackend includes functions to implement to provide exec functionality. -type execBackend interface { - ContainerExecCreate(name string, config *types.ExecConfig) (string, error) - ContainerExecInspect(id string) (*backend.ExecInspect, error) - ContainerExecResize(name string, height, width int) error - ContainerExecStart(ctx context.Context, name string, stdin io.ReadCloser, stdout io.Writer, stderr io.Writer) error - ExecExists(name string) (bool, error) -} - -// copyBackend includes functions to implement to provide container copy functionality. -type copyBackend interface { - ContainerArchivePath(name string, path string) (content io.ReadCloser, stat *types.ContainerPathStat, err error) - ContainerCopy(name string, res string) (io.ReadCloser, error) - ContainerExport(name string, out io.Writer) error - ContainerExtractToDir(name, path string, noOverwriteDirNonDir bool, content io.Reader) error - ContainerStatPath(name string, path string) (stat *types.ContainerPathStat, err error) -} - -// stateBackend includes functions to implement to provide container state lifecycle functionality. -type stateBackend interface { - ContainerCreate(config types.ContainerCreateConfig) (container.ContainerCreateCreatedBody, error) - ContainerKill(name string, sig uint64) error - ContainerPause(name string) error - ContainerRename(oldName, newName string) error - ContainerResize(name string, height, width int) error - ContainerRestart(name string, seconds *int) error - ContainerRm(name string, config *types.ContainerRmConfig) error - ContainerStart(name string, hostConfig *container.HostConfig, checkpoint string, checkpointDir string) error - ContainerStop(name string, seconds *int) error - ContainerUnpause(name string) error - ContainerUpdate(name string, hostConfig *container.HostConfig) (container.ContainerUpdateOKBody, error) - ContainerWait(name string, timeout time.Duration) (int, error) -} - -// monitorBackend includes functions to implement to provide containers monitoring functionality. -type monitorBackend interface { - ContainerChanges(name string) ([]archive.Change, error) - ContainerInspect(name string, size bool, version string) (interface{}, error) - ContainerLogs(ctx context.Context, name string, config *backend.ContainerLogsConfig, started chan struct{}) error - ContainerStats(ctx context.Context, name string, config *backend.ContainerStatsConfig) error - ContainerTop(name string, psArgs string) (*types.ContainerProcessList, error) - - Containers(config *types.ContainerListOptions) ([]*types.Container, error) -} - -// attachBackend includes function to implement to provide container attaching functionality. -type attachBackend interface { - ContainerAttach(name string, c *backend.ContainerAttachConfig) error -} - -// systemBackend includes functions to implement to provide system wide containers functionality -type systemBackend interface { - ContainersPrune(pruneFilters filters.Args) (*types.ContainersPruneReport, error) -} - -// Backend is all the methods that need to be implemented to provide container specific functionality. -type Backend interface { - execBackend - copyBackend - stateBackend - monitorBackend - attachBackend - systemBackend -} diff --git a/vendor/github.com/docker/docker/api/server/router/container/container.go b/vendor/github.com/docker/docker/api/server/router/container/container.go deleted file mode 100644 index bbed7e994..000000000 --- a/vendor/github.com/docker/docker/api/server/router/container/container.go +++ /dev/null @@ -1,77 +0,0 @@ -package container - -import ( - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/server/router" -) - -type validationError struct { - error -} - -func (validationError) IsValidationError() bool { - return true -} - -// containerRouter is a router to talk with the container controller -type containerRouter struct { - backend Backend - decoder httputils.ContainerDecoder - routes []router.Route -} - -// NewRouter initializes a new container router -func NewRouter(b Backend, decoder httputils.ContainerDecoder) router.Router { - r := &containerRouter{ - backend: b, - decoder: decoder, - } - r.initRoutes() - return r -} - -// Routes returns the available routes to the container controller -func (r *containerRouter) Routes() []router.Route { - return r.routes -} - -// initRoutes initializes the routes in container router -func (r *containerRouter) initRoutes() { - r.routes = []router.Route{ - // HEAD - router.NewHeadRoute("/containers/{name:.*}/archive", r.headContainersArchive), - // GET - router.NewGetRoute("/containers/json", r.getContainersJSON), - router.NewGetRoute("/containers/{name:.*}/export", r.getContainersExport), - router.NewGetRoute("/containers/{name:.*}/changes", r.getContainersChanges), - router.NewGetRoute("/containers/{name:.*}/json", r.getContainersByName), - router.NewGetRoute("/containers/{name:.*}/top", r.getContainersTop), - router.Cancellable(router.NewGetRoute("/containers/{name:.*}/logs", r.getContainersLogs)), - router.Cancellable(router.NewGetRoute("/containers/{name:.*}/stats", r.getContainersStats)), - router.NewGetRoute("/containers/{name:.*}/attach/ws", r.wsContainersAttach), - router.NewGetRoute("/exec/{id:.*}/json", r.getExecByID), - router.NewGetRoute("/containers/{name:.*}/archive", r.getContainersArchive), - // POST - router.NewPostRoute("/containers/create", r.postContainersCreate), - router.NewPostRoute("/containers/{name:.*}/kill", r.postContainersKill), - router.NewPostRoute("/containers/{name:.*}/pause", r.postContainersPause), - router.NewPostRoute("/containers/{name:.*}/unpause", r.postContainersUnpause), - router.NewPostRoute("/containers/{name:.*}/restart", r.postContainersRestart), - router.NewPostRoute("/containers/{name:.*}/start", r.postContainersStart), - router.NewPostRoute("/containers/{name:.*}/stop", r.postContainersStop), - router.NewPostRoute("/containers/{name:.*}/wait", r.postContainersWait), - router.NewPostRoute("/containers/{name:.*}/resize", r.postContainersResize), - router.NewPostRoute("/containers/{name:.*}/attach", r.postContainersAttach), - router.NewPostRoute("/containers/{name:.*}/copy", r.postContainersCopy), // Deprecated since 1.8, Errors out since 1.12 - router.NewPostRoute("/containers/{name:.*}/exec", r.postContainerExecCreate), - router.NewPostRoute("/exec/{name:.*}/start", r.postContainerExecStart), - router.NewPostRoute("/exec/{name:.*}/resize", r.postContainerExecResize), - router.NewPostRoute("/containers/{name:.*}/rename", r.postContainerRename), - router.NewPostRoute("/containers/{name:.*}/update", r.postContainerUpdate), - router.NewPostRoute("/containers/prune", r.postContainersPrune), - // PUT - router.NewPutRoute("/containers/{name:.*}/archive", r.putContainersArchive), - // DELETE - router.NewDeleteRoute("/containers/{name:.*}", r.deleteContainers), - } -} diff --git a/vendor/github.com/docker/docker/api/server/router/container/container_routes.go b/vendor/github.com/docker/docker/api/server/router/container/container_routes.go deleted file mode 100644 index 9c9bc0f8c..000000000 --- a/vendor/github.com/docker/docker/api/server/router/container/container_routes.go +++ /dev/null @@ -1,554 +0,0 @@ -package container - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "strconv" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/signal" - "golang.org/x/net/context" - "golang.org/x/net/websocket" -) - -func (s *containerRouter) getContainersJSON(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - filter, err := filters.FromParam(r.Form.Get("filters")) - if err != nil { - return err - } - - config := &types.ContainerListOptions{ - All: httputils.BoolValue(r, "all"), - Size: httputils.BoolValue(r, "size"), - Since: r.Form.Get("since"), - Before: r.Form.Get("before"), - Filters: filter, - } - - if tmpLimit := r.Form.Get("limit"); tmpLimit != "" { - limit, err := strconv.Atoi(tmpLimit) - if err != nil { - return err - } - config.Limit = limit - } - - containers, err := s.backend.Containers(config) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, containers) -} - -func (s *containerRouter) getContainersStats(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - stream := httputils.BoolValueOrDefault(r, "stream", true) - if !stream { - w.Header().Set("Content-Type", "application/json") - } - - config := &backend.ContainerStatsConfig{ - Stream: stream, - OutStream: w, - Version: string(httputils.VersionFromContext(ctx)), - } - - return s.backend.ContainerStats(ctx, vars["name"], config) -} - -func (s *containerRouter) getContainersLogs(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - // Args are validated before the stream starts because when it starts we're - // sending HTTP 200 by writing an empty chunk of data to tell the client that - // daemon is going to stream. By sending this initial HTTP 200 we can't report - // any error after the stream starts (i.e. container not found, wrong parameters) - // with the appropriate status code. - stdout, stderr := httputils.BoolValue(r, "stdout"), httputils.BoolValue(r, "stderr") - if !(stdout || stderr) { - return fmt.Errorf("Bad parameters: you must choose at least one stream") - } - - containerName := vars["name"] - logsConfig := &backend.ContainerLogsConfig{ - ContainerLogsOptions: types.ContainerLogsOptions{ - Follow: httputils.BoolValue(r, "follow"), - Timestamps: httputils.BoolValue(r, "timestamps"), - Since: r.Form.Get("since"), - Tail: r.Form.Get("tail"), - ShowStdout: stdout, - ShowStderr: stderr, - Details: httputils.BoolValue(r, "details"), - }, - OutStream: w, - } - - chStarted := make(chan struct{}) - if err := s.backend.ContainerLogs(ctx, containerName, logsConfig, chStarted); err != nil { - select { - case <-chStarted: - // The client may be expecting all of the data we're sending to - // be multiplexed, so send it through OutStream, which will - // have been set up to handle that if needed. - fmt.Fprintf(logsConfig.OutStream, "Error running logs job: %v\n", err) - default: - return err - } - } - - return nil -} - -func (s *containerRouter) getContainersExport(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - return s.backend.ContainerExport(vars["name"], w) -} - -func (s *containerRouter) postContainersStart(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - // If contentLength is -1, we can assumed chunked encoding - // or more technically that the length is unknown - // https://golang.org/src/pkg/net/http/request.go#L139 - // net/http otherwise seems to swallow any headers related to chunked encoding - // including r.TransferEncoding - // allow a nil body for backwards compatibility - - version := httputils.VersionFromContext(ctx) - var hostConfig *container.HostConfig - // A non-nil json object is at least 7 characters. - if r.ContentLength > 7 || r.ContentLength == -1 { - if versions.GreaterThanOrEqualTo(version, "1.24") { - return validationError{fmt.Errorf("starting container with non-empty request body was deprecated since v1.10 and removed in v1.12")} - } - - if err := httputils.CheckForJSON(r); err != nil { - return err - } - - c, err := s.decoder.DecodeHostConfig(r.Body) - if err != nil { - return err - } - hostConfig = c - } - - if err := httputils.ParseForm(r); err != nil { - return err - } - - checkpoint := r.Form.Get("checkpoint") - checkpointDir := r.Form.Get("checkpoint-dir") - if err := s.backend.ContainerStart(vars["name"], hostConfig, checkpoint, checkpointDir); err != nil { - return err - } - - w.WriteHeader(http.StatusNoContent) - return nil -} - -func (s *containerRouter) postContainersStop(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - var seconds *int - if tmpSeconds := r.Form.Get("t"); tmpSeconds != "" { - valSeconds, err := strconv.Atoi(tmpSeconds) - if err != nil { - return err - } - seconds = &valSeconds - } - - if err := s.backend.ContainerStop(vars["name"], seconds); err != nil { - return err - } - w.WriteHeader(http.StatusNoContent) - - return nil -} - -type errContainerIsRunning interface { - ContainerIsRunning() bool -} - -func (s *containerRouter) postContainersKill(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - var sig syscall.Signal - name := vars["name"] - - // If we have a signal, look at it. Otherwise, do nothing - if sigStr := r.Form.Get("signal"); sigStr != "" { - var err error - if sig, err = signal.ParseSignal(sigStr); err != nil { - return err - } - } - - if err := s.backend.ContainerKill(name, uint64(sig)); err != nil { - var isStopped bool - if e, ok := err.(errContainerIsRunning); ok { - isStopped = !e.ContainerIsRunning() - } - - // Return error that's not caused because the container is stopped. - // Return error if the container is not running and the api is >= 1.20 - // to keep backwards compatibility. - version := httputils.VersionFromContext(ctx) - if versions.GreaterThanOrEqualTo(version, "1.20") || !isStopped { - return fmt.Errorf("Cannot kill container %s: %v", name, err) - } - } - - w.WriteHeader(http.StatusNoContent) - return nil -} - -func (s *containerRouter) postContainersRestart(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - var seconds *int - if tmpSeconds := r.Form.Get("t"); tmpSeconds != "" { - valSeconds, err := strconv.Atoi(tmpSeconds) - if err != nil { - return err - } - seconds = &valSeconds - } - - if err := s.backend.ContainerRestart(vars["name"], seconds); err != nil { - return err - } - - w.WriteHeader(http.StatusNoContent) - - return nil -} - -func (s *containerRouter) postContainersPause(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - if err := s.backend.ContainerPause(vars["name"]); err != nil { - return err - } - - w.WriteHeader(http.StatusNoContent) - - return nil -} - -func (s *containerRouter) postContainersUnpause(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - if err := s.backend.ContainerUnpause(vars["name"]); err != nil { - return err - } - - w.WriteHeader(http.StatusNoContent) - - return nil -} - -func (s *containerRouter) postContainersWait(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - status, err := s.backend.ContainerWait(vars["name"], -1*time.Second) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, &container.ContainerWaitOKBody{ - StatusCode: int64(status), - }) -} - -func (s *containerRouter) getContainersChanges(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - changes, err := s.backend.ContainerChanges(vars["name"]) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, changes) -} - -func (s *containerRouter) getContainersTop(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - procList, err := s.backend.ContainerTop(vars["name"], r.Form.Get("ps_args")) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, procList) -} - -func (s *containerRouter) postContainerRename(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - name := vars["name"] - newName := r.Form.Get("name") - if err := s.backend.ContainerRename(name, newName); err != nil { - return err - } - w.WriteHeader(http.StatusNoContent) - return nil -} - -func (s *containerRouter) postContainerUpdate(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - if err := httputils.CheckForJSON(r); err != nil { - return err - } - - var updateConfig container.UpdateConfig - - decoder := json.NewDecoder(r.Body) - if err := decoder.Decode(&updateConfig); err != nil { - return err - } - - hostConfig := &container.HostConfig{ - Resources: updateConfig.Resources, - RestartPolicy: updateConfig.RestartPolicy, - } - - name := vars["name"] - resp, err := s.backend.ContainerUpdate(name, hostConfig) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, resp) -} - -func (s *containerRouter) postContainersCreate(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - if err := httputils.CheckForJSON(r); err != nil { - return err - } - - name := r.Form.Get("name") - - config, hostConfig, networkingConfig, err := s.decoder.DecodeConfig(r.Body) - if err != nil { - return err - } - version := httputils.VersionFromContext(ctx) - adjustCPUShares := versions.LessThan(version, "1.19") - - ccr, err := s.backend.ContainerCreate(types.ContainerCreateConfig{ - Name: name, - Config: config, - HostConfig: hostConfig, - NetworkingConfig: networkingConfig, - AdjustCPUShares: adjustCPUShares, - }) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusCreated, ccr) -} - -func (s *containerRouter) deleteContainers(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - name := vars["name"] - config := &types.ContainerRmConfig{ - ForceRemove: httputils.BoolValue(r, "force"), - RemoveVolume: httputils.BoolValue(r, "v"), - RemoveLink: httputils.BoolValue(r, "link"), - } - - if err := s.backend.ContainerRm(name, config); err != nil { - return err - } - - w.WriteHeader(http.StatusNoContent) - - return nil -} - -func (s *containerRouter) postContainersResize(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - height, err := strconv.Atoi(r.Form.Get("h")) - if err != nil { - return err - } - width, err := strconv.Atoi(r.Form.Get("w")) - if err != nil { - return err - } - - return s.backend.ContainerResize(vars["name"], height, width) -} - -func (s *containerRouter) postContainersAttach(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - err := httputils.ParseForm(r) - if err != nil { - return err - } - containerName := vars["name"] - - _, upgrade := r.Header["Upgrade"] - detachKeys := r.FormValue("detachKeys") - - hijacker, ok := w.(http.Hijacker) - if !ok { - return fmt.Errorf("error attaching to container %s, hijack connection missing", containerName) - } - - setupStreams := func() (io.ReadCloser, io.Writer, io.Writer, error) { - conn, _, err := hijacker.Hijack() - if err != nil { - return nil, nil, nil, err - } - - // set raw mode - conn.Write([]byte{}) - - if upgrade { - fmt.Fprintf(conn, "HTTP/1.1 101 UPGRADED\r\nContent-Type: application/vnd.docker.raw-stream\r\nConnection: Upgrade\r\nUpgrade: tcp\r\n\r\n") - } else { - fmt.Fprintf(conn, "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.docker.raw-stream\r\n\r\n") - } - - closer := func() error { - httputils.CloseStreams(conn) - return nil - } - return ioutils.NewReadCloserWrapper(conn, closer), conn, conn, nil - } - - attachConfig := &backend.ContainerAttachConfig{ - GetStreams: setupStreams, - UseStdin: httputils.BoolValue(r, "stdin"), - UseStdout: httputils.BoolValue(r, "stdout"), - UseStderr: httputils.BoolValue(r, "stderr"), - Logs: httputils.BoolValue(r, "logs"), - Stream: httputils.BoolValue(r, "stream"), - DetachKeys: detachKeys, - MuxStreams: true, - } - - if err = s.backend.ContainerAttach(containerName, attachConfig); err != nil { - logrus.Errorf("Handler for %s %s returned error: %v", r.Method, r.URL.Path, err) - // Remember to close stream if error happens - conn, _, errHijack := hijacker.Hijack() - if errHijack == nil { - statusCode := httputils.GetHTTPErrorStatusCode(err) - statusText := http.StatusText(statusCode) - fmt.Fprintf(conn, "HTTP/1.1 %d %s\r\nContent-Type: application/vnd.docker.raw-stream\r\n\r\n%s\r\n", statusCode, statusText, err.Error()) - httputils.CloseStreams(conn) - } else { - logrus.Errorf("Error Hijacking: %v", err) - } - } - return nil -} - -func (s *containerRouter) wsContainersAttach(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - containerName := vars["name"] - - var err error - detachKeys := r.FormValue("detachKeys") - - done := make(chan struct{}) - started := make(chan struct{}) - - setupStreams := func() (io.ReadCloser, io.Writer, io.Writer, error) { - wsChan := make(chan *websocket.Conn) - h := func(conn *websocket.Conn) { - wsChan <- conn - <-done - } - - srv := websocket.Server{Handler: h, Handshake: nil} - go func() { - close(started) - srv.ServeHTTP(w, r) - }() - - conn := <-wsChan - return conn, conn, conn, nil - } - - attachConfig := &backend.ContainerAttachConfig{ - GetStreams: setupStreams, - Logs: httputils.BoolValue(r, "logs"), - Stream: httputils.BoolValue(r, "stream"), - DetachKeys: detachKeys, - UseStdin: true, - UseStdout: true, - UseStderr: true, - MuxStreams: false, // TODO: this should be true since it's a single stream for both stdout and stderr - } - - err = s.backend.ContainerAttach(containerName, attachConfig) - close(done) - select { - case <-started: - logrus.Errorf("Error attaching websocket: %s", err) - return nil - default: - } - return err -} - -func (s *containerRouter) postContainersPrune(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - pruneFilters, err := filters.FromParam(r.Form.Get("filters")) - if err != nil { - return err - } - - pruneReport, err := s.backend.ContainersPrune(pruneFilters) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, pruneReport) -} diff --git a/vendor/github.com/docker/docker/api/server/router/container/copy.go b/vendor/github.com/docker/docker/api/server/router/container/copy.go deleted file mode 100644 index ede6dff92..000000000 --- a/vendor/github.com/docker/docker/api/server/router/container/copy.go +++ /dev/null @@ -1,119 +0,0 @@ -package container - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "io" - "net/http" - "os" - "strings" - - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/versions" - "golang.org/x/net/context" -) - -// postContainersCopy is deprecated in favor of getContainersArchive. -func (s *containerRouter) postContainersCopy(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - // Deprecated since 1.8, Errors out since 1.12 - version := httputils.VersionFromContext(ctx) - if versions.GreaterThanOrEqualTo(version, "1.24") { - w.WriteHeader(http.StatusNotFound) - return nil - } - if err := httputils.CheckForJSON(r); err != nil { - return err - } - - cfg := types.CopyConfig{} - if err := json.NewDecoder(r.Body).Decode(&cfg); err != nil { - return err - } - - if cfg.Resource == "" { - return fmt.Errorf("Path cannot be empty") - } - - data, err := s.backend.ContainerCopy(vars["name"], cfg.Resource) - if err != nil { - if strings.Contains(strings.ToLower(err.Error()), "no such container") { - w.WriteHeader(http.StatusNotFound) - return nil - } - if os.IsNotExist(err) { - return fmt.Errorf("Could not find the file %s in container %s", cfg.Resource, vars["name"]) - } - return err - } - defer data.Close() - - w.Header().Set("Content-Type", "application/x-tar") - if _, err := io.Copy(w, data); err != nil { - return err - } - - return nil -} - -// // Encode the stat to JSON, base64 encode, and place in a header. -func setContainerPathStatHeader(stat *types.ContainerPathStat, header http.Header) error { - statJSON, err := json.Marshal(stat) - if err != nil { - return err - } - - header.Set( - "X-Docker-Container-Path-Stat", - base64.StdEncoding.EncodeToString(statJSON), - ) - - return nil -} - -func (s *containerRouter) headContainersArchive(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - v, err := httputils.ArchiveFormValues(r, vars) - if err != nil { - return err - } - - stat, err := s.backend.ContainerStatPath(v.Name, v.Path) - if err != nil { - return err - } - - return setContainerPathStatHeader(stat, w.Header()) -} - -func (s *containerRouter) getContainersArchive(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - v, err := httputils.ArchiveFormValues(r, vars) - if err != nil { - return err - } - - tarArchive, stat, err := s.backend.ContainerArchivePath(v.Name, v.Path) - if err != nil { - return err - } - defer tarArchive.Close() - - if err := setContainerPathStatHeader(stat, w.Header()); err != nil { - return err - } - - w.Header().Set("Content-Type", "application/x-tar") - _, err = io.Copy(w, tarArchive) - - return err -} - -func (s *containerRouter) putContainersArchive(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - v, err := httputils.ArchiveFormValues(r, vars) - if err != nil { - return err - } - - noOverwriteDirNonDir := httputils.BoolValue(r, "noOverwriteDirNonDir") - return s.backend.ContainerExtractToDir(v.Name, v.Path, noOverwriteDirNonDir, r.Body) -} diff --git a/vendor/github.com/docker/docker/api/server/router/container/exec.go b/vendor/github.com/docker/docker/api/server/router/container/exec.go deleted file mode 100644 index 1134a0e79..000000000 --- a/vendor/github.com/docker/docker/api/server/router/container/exec.go +++ /dev/null @@ -1,140 +0,0 @@ -package container - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "strconv" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/pkg/stdcopy" - "golang.org/x/net/context" -) - -func (s *containerRouter) getExecByID(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - eConfig, err := s.backend.ContainerExecInspect(vars["id"]) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, eConfig) -} - -func (s *containerRouter) postContainerExecCreate(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - if err := httputils.CheckForJSON(r); err != nil { - return err - } - name := vars["name"] - - execConfig := &types.ExecConfig{} - if err := json.NewDecoder(r.Body).Decode(execConfig); err != nil { - return err - } - - if len(execConfig.Cmd) == 0 { - return fmt.Errorf("No exec command specified") - } - - // Register an instance of Exec in container. - id, err := s.backend.ContainerExecCreate(name, execConfig) - if err != nil { - logrus.Errorf("Error setting up exec command in container %s: %v", name, err) - return err - } - - return httputils.WriteJSON(w, http.StatusCreated, &types.IDResponse{ - ID: id, - }) -} - -// TODO(vishh): Refactor the code to avoid having to specify stream config as part of both create and start. -func (s *containerRouter) postContainerExecStart(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - version := httputils.VersionFromContext(ctx) - if versions.GreaterThan(version, "1.21") { - if err := httputils.CheckForJSON(r); err != nil { - return err - } - } - - var ( - execName = vars["name"] - stdin, inStream io.ReadCloser - stdout, stderr, outStream io.Writer - ) - - execStartCheck := &types.ExecStartCheck{} - if err := json.NewDecoder(r.Body).Decode(execStartCheck); err != nil { - return err - } - - if exists, err := s.backend.ExecExists(execName); !exists { - return err - } - - if !execStartCheck.Detach { - var err error - // Setting up the streaming http interface. - inStream, outStream, err = httputils.HijackConnection(w) - if err != nil { - return err - } - defer httputils.CloseStreams(inStream, outStream) - - if _, ok := r.Header["Upgrade"]; ok { - fmt.Fprint(outStream, "HTTP/1.1 101 UPGRADED\r\nContent-Type: application/vnd.docker.raw-stream\r\nConnection: Upgrade\r\nUpgrade: tcp\r\n") - } else { - fmt.Fprint(outStream, "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.docker.raw-stream\r\n") - } - - // copy headers that were removed as part of hijack - if err := w.Header().WriteSubset(outStream, nil); err != nil { - return err - } - fmt.Fprint(outStream, "\r\n") - - stdin = inStream - stdout = outStream - if !execStartCheck.Tty { - stderr = stdcopy.NewStdWriter(outStream, stdcopy.Stderr) - stdout = stdcopy.NewStdWriter(outStream, stdcopy.Stdout) - } - } - - // Now run the user process in container. - // Maybe we should we pass ctx here if we're not detaching? - if err := s.backend.ContainerExecStart(context.Background(), execName, stdin, stdout, stderr); err != nil { - if execStartCheck.Detach { - return err - } - stdout.Write([]byte(err.Error() + "\r\n")) - logrus.Errorf("Error running exec in container: %v", err) - } - return nil -} - -func (s *containerRouter) postContainerExecResize(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - height, err := strconv.Atoi(r.Form.Get("h")) - if err != nil { - return err - } - width, err := strconv.Atoi(r.Form.Get("w")) - if err != nil { - return err - } - - return s.backend.ContainerExecResize(vars["name"], height, width) -} diff --git a/vendor/github.com/docker/docker/api/server/router/container/inspect.go b/vendor/github.com/docker/docker/api/server/router/container/inspect.go deleted file mode 100644 index dbbced7ee..000000000 --- a/vendor/github.com/docker/docker/api/server/router/container/inspect.go +++ /dev/null @@ -1,21 +0,0 @@ -package container - -import ( - "net/http" - - "github.com/docker/docker/api/server/httputils" - "golang.org/x/net/context" -) - -// getContainersByName inspects container's configuration and serializes it as json. -func (s *containerRouter) getContainersByName(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - displaySize := httputils.BoolValue(r, "size") - - version := httputils.VersionFromContext(ctx) - json, err := s.backend.ContainerInspect(vars["name"], displaySize, version) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, json) -} diff --git a/vendor/github.com/docker/docker/api/server/router/experimental.go b/vendor/github.com/docker/docker/api/server/router/experimental.go deleted file mode 100644 index 51385c255..000000000 --- a/vendor/github.com/docker/docker/api/server/router/experimental.go +++ /dev/null @@ -1,67 +0,0 @@ -package router - -import ( - "errors" - "net/http" - - "golang.org/x/net/context" - - apierrors "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/server/httputils" -) - -var ( - errExperimentalFeature = errors.New("This experimental feature is disabled by default. Start the Docker daemon with --experimental in order to enable it.") -) - -// ExperimentalRoute defines an experimental API route that can be enabled or disabled. -type ExperimentalRoute interface { - Route - - Enable() - Disable() -} - -// experimentalRoute defines an experimental API route that can be enabled or disabled. -// It implements ExperimentalRoute -type experimentalRoute struct { - local Route - handler httputils.APIFunc -} - -// Enable enables this experimental route -func (r *experimentalRoute) Enable() { - r.handler = r.local.Handler() -} - -// Disable disables the experimental route -func (r *experimentalRoute) Disable() { - r.handler = experimentalHandler -} - -func experimentalHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - return apierrors.NewErrorWithStatusCode(errExperimentalFeature, http.StatusNotImplemented) -} - -// Handler returns returns the APIFunc to let the server wrap it in middlewares. -func (r *experimentalRoute) Handler() httputils.APIFunc { - return r.handler -} - -// Method returns the http method that the route responds to. -func (r *experimentalRoute) Method() string { - return r.local.Method() -} - -// Path returns the subpath where the route responds to. -func (r *experimentalRoute) Path() string { - return r.local.Path() -} - -// Experimental will mark a route as experimental. -func Experimental(r Route) Route { - return &experimentalRoute{ - local: r, - handler: experimentalHandler, - } -} diff --git a/vendor/github.com/docker/docker/api/server/router/image/backend.go b/vendor/github.com/docker/docker/api/server/router/image/backend.go deleted file mode 100644 index 19a67a5ed..000000000 --- a/vendor/github.com/docker/docker/api/server/router/image/backend.go +++ /dev/null @@ -1,45 +0,0 @@ -package image - -import ( - "io" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/registry" - "golang.org/x/net/context" -) - -// Backend is all the methods that need to be implemented -// to provide image specific functionality. -type Backend interface { - containerBackend - imageBackend - importExportBackend - registryBackend -} - -type containerBackend interface { - Commit(name string, config *backend.ContainerCommitConfig) (imageID string, err error) -} - -type imageBackend interface { - ImageDelete(imageRef string, force, prune bool) ([]types.ImageDelete, error) - ImageHistory(imageName string) ([]*types.ImageHistory, error) - Images(imageFilters filters.Args, all bool, withExtraAttrs bool) ([]*types.ImageSummary, error) - LookupImage(name string) (*types.ImageInspect, error) - TagImage(imageName, repository, tag string) error - ImagesPrune(pruneFilters filters.Args) (*types.ImagesPruneReport, error) -} - -type importExportBackend interface { - LoadImage(inTar io.ReadCloser, outStream io.Writer, quiet bool) error - ImportImage(src string, repository, tag string, msg string, inConfig io.ReadCloser, outStream io.Writer, changes []string) error - ExportImage(names []string, outStream io.Writer) error -} - -type registryBackend interface { - PullImage(ctx context.Context, image, tag string, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error - PushImage(ctx context.Context, image, tag string, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error - SearchRegistryForImages(ctx context.Context, filtersArgs string, term string, limit int, authConfig *types.AuthConfig, metaHeaders map[string][]string) (*registry.SearchResults, error) -} diff --git a/vendor/github.com/docker/docker/api/server/router/image/image.go b/vendor/github.com/docker/docker/api/server/router/image/image.go deleted file mode 100644 index 54a4d5148..000000000 --- a/vendor/github.com/docker/docker/api/server/router/image/image.go +++ /dev/null @@ -1,50 +0,0 @@ -package image - -import ( - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/server/router" -) - -// imageRouter is a router to talk with the image controller -type imageRouter struct { - backend Backend - decoder httputils.ContainerDecoder - routes []router.Route -} - -// NewRouter initializes a new image router -func NewRouter(backend Backend, decoder httputils.ContainerDecoder) router.Router { - r := &imageRouter{ - backend: backend, - decoder: decoder, - } - r.initRoutes() - return r -} - -// Routes returns the available routes to the image controller -func (r *imageRouter) Routes() []router.Route { - return r.routes -} - -// initRoutes initializes the routes in the image router -func (r *imageRouter) initRoutes() { - r.routes = []router.Route{ - // GET - router.NewGetRoute("/images/json", r.getImagesJSON), - router.NewGetRoute("/images/search", r.getImagesSearch), - router.NewGetRoute("/images/get", r.getImagesGet), - router.NewGetRoute("/images/{name:.*}/get", r.getImagesGet), - router.NewGetRoute("/images/{name:.*}/history", r.getImagesHistory), - router.NewGetRoute("/images/{name:.*}/json", r.getImagesByName), - // POST - router.NewPostRoute("/commit", r.postCommit), - router.NewPostRoute("/images/load", r.postImagesLoad), - router.Cancellable(router.NewPostRoute("/images/create", r.postImagesCreate)), - router.Cancellable(router.NewPostRoute("/images/{name:.*}/push", r.postImagesPush)), - router.NewPostRoute("/images/{name:.*}/tag", r.postImagesTag), - router.NewPostRoute("/images/prune", r.postImagesPrune), - // DELETE - router.NewDeleteRoute("/images/{name:.*}", r.deleteImages), - } -} diff --git a/vendor/github.com/docker/docker/api/server/router/image/image_routes.go b/vendor/github.com/docker/docker/api/server/router/image/image_routes.go deleted file mode 100644 index 69403652a..000000000 --- a/vendor/github.com/docker/docker/api/server/router/image/image_routes.go +++ /dev/null @@ -1,344 +0,0 @@ -package image - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "io" - "net/http" - "strconv" - "strings" - - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/streamformatter" - "github.com/docker/docker/registry" - "golang.org/x/net/context" -) - -func (s *imageRouter) postCommit(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - if err := httputils.CheckForJSON(r); err != nil { - return err - } - - cname := r.Form.Get("container") - - pause := httputils.BoolValue(r, "pause") - version := httputils.VersionFromContext(ctx) - if r.FormValue("pause") == "" && versions.GreaterThanOrEqualTo(version, "1.13") { - pause = true - } - - c, _, _, err := s.decoder.DecodeConfig(r.Body) - if err != nil && err != io.EOF { //Do not fail if body is empty. - return err - } - if c == nil { - c = &container.Config{} - } - - commitCfg := &backend.ContainerCommitConfig{ - ContainerCommitConfig: types.ContainerCommitConfig{ - Pause: pause, - Repo: r.Form.Get("repo"), - Tag: r.Form.Get("tag"), - Author: r.Form.Get("author"), - Comment: r.Form.Get("comment"), - Config: c, - MergeConfigs: true, - }, - Changes: r.Form["changes"], - } - - imgID, err := s.backend.Commit(cname, commitCfg) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusCreated, &types.IDResponse{ - ID: string(imgID), - }) -} - -// Creates an image from Pull or from Import -func (s *imageRouter) postImagesCreate(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - var ( - image = r.Form.Get("fromImage") - repo = r.Form.Get("repo") - tag = r.Form.Get("tag") - message = r.Form.Get("message") - err error - output = ioutils.NewWriteFlusher(w) - ) - defer output.Close() - - w.Header().Set("Content-Type", "application/json") - - if image != "" { //pull - metaHeaders := map[string][]string{} - for k, v := range r.Header { - if strings.HasPrefix(k, "X-Meta-") { - metaHeaders[k] = v - } - } - - authEncoded := r.Header.Get("X-Registry-Auth") - authConfig := &types.AuthConfig{} - if authEncoded != "" { - authJSON := base64.NewDecoder(base64.URLEncoding, strings.NewReader(authEncoded)) - if err := json.NewDecoder(authJSON).Decode(authConfig); err != nil { - // for a pull it is not an error if no auth was given - // to increase compatibility with the existing api it is defaulting to be empty - authConfig = &types.AuthConfig{} - } - } - - err = s.backend.PullImage(ctx, image, tag, metaHeaders, authConfig, output) - } else { //import - src := r.Form.Get("fromSrc") - // 'err' MUST NOT be defined within this block, we need any error - // generated from the download to be available to the output - // stream processing below - err = s.backend.ImportImage(src, repo, tag, message, r.Body, output, r.Form["changes"]) - } - if err != nil { - if !output.Flushed() { - return err - } - sf := streamformatter.NewJSONStreamFormatter() - output.Write(sf.FormatError(err)) - } - - return nil -} - -func (s *imageRouter) postImagesPush(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - metaHeaders := map[string][]string{} - for k, v := range r.Header { - if strings.HasPrefix(k, "X-Meta-") { - metaHeaders[k] = v - } - } - if err := httputils.ParseForm(r); err != nil { - return err - } - authConfig := &types.AuthConfig{} - - authEncoded := r.Header.Get("X-Registry-Auth") - if authEncoded != "" { - // the new format is to handle the authConfig as a header - authJSON := base64.NewDecoder(base64.URLEncoding, strings.NewReader(authEncoded)) - if err := json.NewDecoder(authJSON).Decode(authConfig); err != nil { - // to increase compatibility to existing api it is defaulting to be empty - authConfig = &types.AuthConfig{} - } - } else { - // the old format is supported for compatibility if there was no authConfig header - if err := json.NewDecoder(r.Body).Decode(authConfig); err != nil { - return fmt.Errorf("Bad parameters and missing X-Registry-Auth: %v", err) - } - } - - image := vars["name"] - tag := r.Form.Get("tag") - - output := ioutils.NewWriteFlusher(w) - defer output.Close() - - w.Header().Set("Content-Type", "application/json") - - if err := s.backend.PushImage(ctx, image, tag, metaHeaders, authConfig, output); err != nil { - if !output.Flushed() { - return err - } - sf := streamformatter.NewJSONStreamFormatter() - output.Write(sf.FormatError(err)) - } - return nil -} - -func (s *imageRouter) getImagesGet(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - w.Header().Set("Content-Type", "application/x-tar") - - output := ioutils.NewWriteFlusher(w) - defer output.Close() - var names []string - if name, ok := vars["name"]; ok { - names = []string{name} - } else { - names = r.Form["names"] - } - - if err := s.backend.ExportImage(names, output); err != nil { - if !output.Flushed() { - return err - } - sf := streamformatter.NewJSONStreamFormatter() - output.Write(sf.FormatError(err)) - } - return nil -} - -func (s *imageRouter) postImagesLoad(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - quiet := httputils.BoolValueOrDefault(r, "quiet", true) - - w.Header().Set("Content-Type", "application/json") - - output := ioutils.NewWriteFlusher(w) - defer output.Close() - if err := s.backend.LoadImage(r.Body, output, quiet); err != nil { - output.Write(streamformatter.NewJSONStreamFormatter().FormatError(err)) - } - return nil -} - -func (s *imageRouter) deleteImages(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - name := vars["name"] - - if strings.TrimSpace(name) == "" { - return fmt.Errorf("image name cannot be blank") - } - - force := httputils.BoolValue(r, "force") - prune := !httputils.BoolValue(r, "noprune") - - list, err := s.backend.ImageDelete(name, force, prune) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, list) -} - -func (s *imageRouter) getImagesByName(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - imageInspect, err := s.backend.LookupImage(vars["name"]) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, imageInspect) -} - -func (s *imageRouter) getImagesJSON(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - imageFilters, err := filters.FromParam(r.Form.Get("filters")) - if err != nil { - return err - } - - version := httputils.VersionFromContext(ctx) - filterParam := r.Form.Get("filter") - if versions.LessThan(version, "1.28") && filterParam != "" { - imageFilters.Add("reference", filterParam) - } - - images, err := s.backend.Images(imageFilters, httputils.BoolValue(r, "all"), false) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, images) -} - -func (s *imageRouter) getImagesHistory(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - name := vars["name"] - history, err := s.backend.ImageHistory(name) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, history) -} - -func (s *imageRouter) postImagesTag(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - if err := s.backend.TagImage(vars["name"], r.Form.Get("repo"), r.Form.Get("tag")); err != nil { - return err - } - w.WriteHeader(http.StatusCreated) - return nil -} - -func (s *imageRouter) getImagesSearch(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - var ( - config *types.AuthConfig - authEncoded = r.Header.Get("X-Registry-Auth") - headers = map[string][]string{} - ) - - if authEncoded != "" { - authJSON := base64.NewDecoder(base64.URLEncoding, strings.NewReader(authEncoded)) - if err := json.NewDecoder(authJSON).Decode(&config); err != nil { - // for a search it is not an error if no auth was given - // to increase compatibility with the existing api it is defaulting to be empty - config = &types.AuthConfig{} - } - } - for k, v := range r.Header { - if strings.HasPrefix(k, "X-Meta-") { - headers[k] = v - } - } - limit := registry.DefaultSearchLimit - if r.Form.Get("limit") != "" { - limitValue, err := strconv.Atoi(r.Form.Get("limit")) - if err != nil { - return err - } - limit = limitValue - } - query, err := s.backend.SearchRegistryForImages(ctx, r.Form.Get("filters"), r.Form.Get("term"), limit, config, headers) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, query.Results) -} - -func (s *imageRouter) postImagesPrune(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - pruneFilters, err := filters.FromParam(r.Form.Get("filters")) - if err != nil { - return err - } - - pruneReport, err := s.backend.ImagesPrune(pruneFilters) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, pruneReport) -} diff --git a/vendor/github.com/docker/docker/api/server/router/local.go b/vendor/github.com/docker/docker/api/server/router/local.go deleted file mode 100644 index 7cb2a5a2f..000000000 --- a/vendor/github.com/docker/docker/api/server/router/local.go +++ /dev/null @@ -1,96 +0,0 @@ -package router - -import ( - "net/http" - - "github.com/docker/docker/api/server/httputils" - "golang.org/x/net/context" -) - -// localRoute defines an individual API route to connect -// with the docker daemon. It implements Route. -type localRoute struct { - method string - path string - handler httputils.APIFunc -} - -// Handler returns the APIFunc to let the server wrap it in middlewares. -func (l localRoute) Handler() httputils.APIFunc { - return l.handler -} - -// Method returns the http method that the route responds to. -func (l localRoute) Method() string { - return l.method -} - -// Path returns the subpath where the route responds to. -func (l localRoute) Path() string { - return l.path -} - -// NewRoute initializes a new local route for the router. -func NewRoute(method, path string, handler httputils.APIFunc) Route { - return localRoute{method, path, handler} -} - -// NewGetRoute initializes a new route with the http method GET. -func NewGetRoute(path string, handler httputils.APIFunc) Route { - return NewRoute("GET", path, handler) -} - -// NewPostRoute initializes a new route with the http method POST. -func NewPostRoute(path string, handler httputils.APIFunc) Route { - return NewRoute("POST", path, handler) -} - -// NewPutRoute initializes a new route with the http method PUT. -func NewPutRoute(path string, handler httputils.APIFunc) Route { - return NewRoute("PUT", path, handler) -} - -// NewDeleteRoute initializes a new route with the http method DELETE. -func NewDeleteRoute(path string, handler httputils.APIFunc) Route { - return NewRoute("DELETE", path, handler) -} - -// NewOptionsRoute initializes a new route with the http method OPTIONS. -func NewOptionsRoute(path string, handler httputils.APIFunc) Route { - return NewRoute("OPTIONS", path, handler) -} - -// NewHeadRoute initializes a new route with the http method HEAD. -func NewHeadRoute(path string, handler httputils.APIFunc) Route { - return NewRoute("HEAD", path, handler) -} - -func cancellableHandler(h httputils.APIFunc) httputils.APIFunc { - return func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if notifier, ok := w.(http.CloseNotifier); ok { - notify := notifier.CloseNotify() - notifyCtx, cancel := context.WithCancel(ctx) - finished := make(chan struct{}) - defer close(finished) - ctx = notifyCtx - go func() { - select { - case <-notify: - cancel() - case <-finished: - } - }() - } - return h(ctx, w, r, vars) - } -} - -// Cancellable makes new route which embeds http.CloseNotifier feature to -// context.Context of handler. -func Cancellable(r Route) Route { - return localRoute{ - method: r.Method(), - path: r.Path(), - handler: cancellableHandler(r.Handler()), - } -} diff --git a/vendor/github.com/docker/docker/api/server/router/network/backend.go b/vendor/github.com/docker/docker/api/server/router/network/backend.go deleted file mode 100644 index 0d1dfb012..000000000 --- a/vendor/github.com/docker/docker/api/server/router/network/backend.go +++ /dev/null @@ -1,22 +0,0 @@ -package network - -import ( - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/network" - "github.com/docker/libnetwork" -) - -// Backend is all the methods that need to be implemented -// to provide network specific functionality. -type Backend interface { - FindNetwork(idName string) (libnetwork.Network, error) - GetNetworkByName(idName string) (libnetwork.Network, error) - GetNetworksByID(partialID string) []libnetwork.Network - GetNetworks() []libnetwork.Network - CreateNetwork(nc types.NetworkCreateRequest) (*types.NetworkCreateResponse, error) - ConnectContainerToNetwork(containerName, networkName string, endpointConfig *network.EndpointSettings) error - DisconnectContainerFromNetwork(containerName string, networkName string, force bool) error - DeleteNetwork(name string) error - NetworksPrune(pruneFilters filters.Args) (*types.NetworksPruneReport, error) -} diff --git a/vendor/github.com/docker/docker/api/server/router/network/filter.go b/vendor/github.com/docker/docker/api/server/router/network/filter.go deleted file mode 100644 index 94affb83c..000000000 --- a/vendor/github.com/docker/docker/api/server/router/network/filter.go +++ /dev/null @@ -1,96 +0,0 @@ -package network - -import ( - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/runconfig" -) - -var ( - // AcceptedFilters is an acceptable filters for validation - AcceptedFilters = map[string]bool{ - "driver": true, - "type": true, - "name": true, - "id": true, - "label": true, - } -) - -func filterNetworkByType(nws []types.NetworkResource, netType string) (retNws []types.NetworkResource, err error) { - switch netType { - case "builtin": - for _, nw := range nws { - if runconfig.IsPreDefinedNetwork(nw.Name) { - retNws = append(retNws, nw) - } - } - case "custom": - for _, nw := range nws { - if !runconfig.IsPreDefinedNetwork(nw.Name) { - retNws = append(retNws, nw) - } - } - default: - return nil, fmt.Errorf("Invalid filter: 'type'='%s'", netType) - } - return retNws, nil -} - -// filterNetworks filters network list according to user specified filter -// and returns user chosen networks -func filterNetworks(nws []types.NetworkResource, filter filters.Args) ([]types.NetworkResource, error) { - // if filter is empty, return original network list - if filter.Len() == 0 { - return nws, nil - } - - if err := filter.Validate(AcceptedFilters); err != nil { - return nil, err - } - - displayNet := []types.NetworkResource{} - for _, nw := range nws { - if filter.Include("driver") { - if !filter.ExactMatch("driver", nw.Driver) { - continue - } - } - if filter.Include("name") { - if !filter.Match("name", nw.Name) { - continue - } - } - if filter.Include("id") { - if !filter.Match("id", nw.ID) { - continue - } - } - if filter.Include("label") { - if !filter.MatchKVList("label", nw.Labels) { - continue - } - } - displayNet = append(displayNet, nw) - } - - if filter.Include("type") { - var typeNet []types.NetworkResource - errFilter := filter.WalkValues("type", func(fval string) error { - passList, err := filterNetworkByType(displayNet, fval) - if err != nil { - return err - } - typeNet = append(typeNet, passList...) - return nil - }) - if errFilter != nil { - return nil, errFilter - } - displayNet = typeNet - } - - return displayNet, nil -} diff --git a/vendor/github.com/docker/docker/api/server/router/network/network.go b/vendor/github.com/docker/docker/api/server/router/network/network.go deleted file mode 100644 index 08a5c8c6a..000000000 --- a/vendor/github.com/docker/docker/api/server/router/network/network.go +++ /dev/null @@ -1,44 +0,0 @@ -package network - -import ( - "github.com/docker/docker/api/server/router" - "github.com/docker/docker/daemon/cluster" -) - -// networkRouter is a router to talk with the network controller -type networkRouter struct { - backend Backend - clusterProvider *cluster.Cluster - routes []router.Route -} - -// NewRouter initializes a new network router -func NewRouter(b Backend, c *cluster.Cluster) router.Router { - r := &networkRouter{ - backend: b, - clusterProvider: c, - } - r.initRoutes() - return r -} - -// Routes returns the available routes to the network controller -func (r *networkRouter) Routes() []router.Route { - return r.routes -} - -func (r *networkRouter) initRoutes() { - r.routes = []router.Route{ - // GET - router.NewGetRoute("/networks", r.getNetworksList), - router.NewGetRoute("/networks/", r.getNetworksList), - router.NewGetRoute("/networks/{id:.+}", r.getNetwork), - // POST - router.NewPostRoute("/networks/create", r.postNetworkCreate), - router.NewPostRoute("/networks/{id:.*}/connect", r.postNetworkConnect), - router.NewPostRoute("/networks/{id:.*}/disconnect", r.postNetworkDisconnect), - router.NewPostRoute("/networks/prune", r.postNetworksPrune), - // DELETE - router.NewDeleteRoute("/networks/{id:.*}", r.deleteNetwork), - } -} diff --git a/vendor/github.com/docker/docker/api/server/router/network/network_routes.go b/vendor/github.com/docker/docker/api/server/router/network/network_routes.go deleted file mode 100644 index 7bfc49955..000000000 --- a/vendor/github.com/docker/docker/api/server/router/network/network_routes.go +++ /dev/null @@ -1,308 +0,0 @@ -package network - -import ( - "encoding/json" - "net/http" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/network" - "github.com/docker/libnetwork" - "github.com/docker/libnetwork/networkdb" -) - -func (n *networkRouter) getNetworksList(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - filter := r.Form.Get("filters") - netFilters, err := filters.FromParam(filter) - if err != nil { - return err - } - - list := []types.NetworkResource{} - - if nr, err := n.clusterProvider.GetNetworks(); err == nil { - list = append(list, nr...) - } - - // Combine the network list returned by Docker daemon if it is not already - // returned by the cluster manager -SKIP: - for _, nw := range n.backend.GetNetworks() { - for _, nl := range list { - if nl.ID == nw.ID() { - continue SKIP - } - } - list = append(list, *n.buildNetworkResource(nw)) - } - - list, err = filterNetworks(list, netFilters) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, list) -} - -func (n *networkRouter) getNetwork(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - nw, err := n.backend.FindNetwork(vars["id"]) - if err != nil { - if nr, err := n.clusterProvider.GetNetwork(vars["id"]); err == nil { - return httputils.WriteJSON(w, http.StatusOK, nr) - } - return err - } - return httputils.WriteJSON(w, http.StatusOK, n.buildNetworkResource(nw)) -} - -func (n *networkRouter) postNetworkCreate(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var create types.NetworkCreateRequest - - if err := httputils.ParseForm(r); err != nil { - return err - } - - if err := httputils.CheckForJSON(r); err != nil { - return err - } - - if err := json.NewDecoder(r.Body).Decode(&create); err != nil { - return err - } - - if nws, err := n.clusterProvider.GetNetworksByName(create.Name); err == nil && len(nws) > 0 { - return libnetwork.NetworkNameError(create.Name) - } - - nw, err := n.backend.CreateNetwork(create) - if err != nil { - if _, ok := err.(libnetwork.ManagerRedirectError); !ok { - return err - } - id, err := n.clusterProvider.CreateNetwork(create) - if err != nil { - return err - } - nw = &types.NetworkCreateResponse{ID: id} - } - - return httputils.WriteJSON(w, http.StatusCreated, nw) -} - -func (n *networkRouter) postNetworkConnect(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var connect types.NetworkConnect - if err := httputils.ParseForm(r); err != nil { - return err - } - - if err := httputils.CheckForJSON(r); err != nil { - return err - } - - if err := json.NewDecoder(r.Body).Decode(&connect); err != nil { - return err - } - - return n.backend.ConnectContainerToNetwork(connect.Container, vars["id"], connect.EndpointConfig) -} - -func (n *networkRouter) postNetworkDisconnect(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var disconnect types.NetworkDisconnect - if err := httputils.ParseForm(r); err != nil { - return err - } - - if err := httputils.CheckForJSON(r); err != nil { - return err - } - - if err := json.NewDecoder(r.Body).Decode(&disconnect); err != nil { - return err - } - - return n.backend.DisconnectContainerFromNetwork(disconnect.Container, vars["id"], disconnect.Force) -} - -func (n *networkRouter) deleteNetwork(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - if _, err := n.clusterProvider.GetNetwork(vars["id"]); err == nil { - if err = n.clusterProvider.RemoveNetwork(vars["id"]); err != nil { - return err - } - w.WriteHeader(http.StatusNoContent) - return nil - } - if err := n.backend.DeleteNetwork(vars["id"]); err != nil { - return err - } - w.WriteHeader(http.StatusNoContent) - return nil -} - -func (n *networkRouter) buildNetworkResource(nw libnetwork.Network) *types.NetworkResource { - r := &types.NetworkResource{} - if nw == nil { - return r - } - - info := nw.Info() - r.Name = nw.Name() - r.ID = nw.ID() - r.Created = info.Created() - r.Scope = info.Scope() - if n.clusterProvider.IsManager() { - if _, err := n.clusterProvider.GetNetwork(nw.ID()); err == nil { - r.Scope = "swarm" - } - } else if info.Dynamic() { - r.Scope = "swarm" - } - r.Driver = nw.Type() - r.EnableIPv6 = info.IPv6Enabled() - r.Internal = info.Internal() - r.Attachable = info.Attachable() - r.Options = info.DriverOptions() - r.Containers = make(map[string]types.EndpointResource) - buildIpamResources(r, info) - r.Labels = info.Labels() - - peers := info.Peers() - if len(peers) != 0 { - r.Peers = buildPeerInfoResources(peers) - } - - epl := nw.Endpoints() - for _, e := range epl { - ei := e.Info() - if ei == nil { - continue - } - sb := ei.Sandbox() - tmpID := e.ID() - key := "ep-" + tmpID - if sb != nil { - key = sb.ContainerID() - } - - r.Containers[key] = buildEndpointResource(tmpID, e.Name(), ei) - } - return r -} - -func buildPeerInfoResources(peers []networkdb.PeerInfo) []network.PeerInfo { - peerInfo := make([]network.PeerInfo, 0, len(peers)) - for _, peer := range peers { - peerInfo = append(peerInfo, network.PeerInfo{ - Name: peer.Name, - IP: peer.IP, - }) - } - return peerInfo -} - -func buildIpamResources(r *types.NetworkResource, nwInfo libnetwork.NetworkInfo) { - id, opts, ipv4conf, ipv6conf := nwInfo.IpamConfig() - - ipv4Info, ipv6Info := nwInfo.IpamInfo() - - r.IPAM.Driver = id - - r.IPAM.Options = opts - - r.IPAM.Config = []network.IPAMConfig{} - for _, ip4 := range ipv4conf { - if ip4.PreferredPool == "" { - continue - } - iData := network.IPAMConfig{} - iData.Subnet = ip4.PreferredPool - iData.IPRange = ip4.SubPool - iData.Gateway = ip4.Gateway - iData.AuxAddress = ip4.AuxAddresses - r.IPAM.Config = append(r.IPAM.Config, iData) - } - - if len(r.IPAM.Config) == 0 { - for _, ip4Info := range ipv4Info { - iData := network.IPAMConfig{} - iData.Subnet = ip4Info.IPAMData.Pool.String() - iData.Gateway = ip4Info.IPAMData.Gateway.IP.String() - r.IPAM.Config = append(r.IPAM.Config, iData) - } - } - - hasIpv6Conf := false - for _, ip6 := range ipv6conf { - if ip6.PreferredPool == "" { - continue - } - hasIpv6Conf = true - iData := network.IPAMConfig{} - iData.Subnet = ip6.PreferredPool - iData.IPRange = ip6.SubPool - iData.Gateway = ip6.Gateway - iData.AuxAddress = ip6.AuxAddresses - r.IPAM.Config = append(r.IPAM.Config, iData) - } - - if !hasIpv6Conf { - for _, ip6Info := range ipv6Info { - if ip6Info.IPAMData.Pool == nil { - continue - } - iData := network.IPAMConfig{} - iData.Subnet = ip6Info.IPAMData.Pool.String() - iData.Gateway = ip6Info.IPAMData.Gateway.String() - r.IPAM.Config = append(r.IPAM.Config, iData) - } - } -} - -func buildEndpointResource(id string, name string, info libnetwork.EndpointInfo) types.EndpointResource { - er := types.EndpointResource{} - - er.EndpointID = id - er.Name = name - ei := info - if ei == nil { - return er - } - - if iface := ei.Iface(); iface != nil { - if mac := iface.MacAddress(); mac != nil { - er.MacAddress = mac.String() - } - if ip := iface.Address(); ip != nil && len(ip.IP) > 0 { - er.IPv4Address = ip.String() - } - - if ipv6 := iface.AddressIPv6(); ipv6 != nil && len(ipv6.IP) > 0 { - er.IPv6Address = ipv6.String() - } - } - return er -} - -func (n *networkRouter) postNetworksPrune(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - pruneReport, err := n.backend.NetworksPrune(filters.Args{}) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, pruneReport) -} diff --git a/vendor/github.com/docker/docker/api/server/router/plugin/backend.go b/vendor/github.com/docker/docker/api/server/router/plugin/backend.go deleted file mode 100644 index ab006b225..000000000 --- a/vendor/github.com/docker/docker/api/server/router/plugin/backend.go +++ /dev/null @@ -1,25 +0,0 @@ -package plugin - -import ( - "io" - "net/http" - - enginetypes "github.com/docker/docker/api/types" - "github.com/docker/docker/reference" - "golang.org/x/net/context" -) - -// Backend for Plugin -type Backend interface { - Disable(name string, config *enginetypes.PluginDisableConfig) error - Enable(name string, config *enginetypes.PluginEnableConfig) error - List() ([]enginetypes.Plugin, error) - Inspect(name string) (*enginetypes.Plugin, error) - Remove(name string, config *enginetypes.PluginRmConfig) error - Set(name string, args []string) error - Privileges(ctx context.Context, ref reference.Named, metaHeaders http.Header, authConfig *enginetypes.AuthConfig) (enginetypes.PluginPrivileges, error) - Pull(ctx context.Context, ref reference.Named, name string, metaHeaders http.Header, authConfig *enginetypes.AuthConfig, privileges enginetypes.PluginPrivileges, outStream io.Writer) error - Push(ctx context.Context, name string, metaHeaders http.Header, authConfig *enginetypes.AuthConfig, outStream io.Writer) error - Upgrade(ctx context.Context, ref reference.Named, name string, metaHeaders http.Header, authConfig *enginetypes.AuthConfig, privileges enginetypes.PluginPrivileges, outStream io.Writer) error - CreateFromContext(ctx context.Context, tarCtx io.ReadCloser, options *enginetypes.PluginCreateOptions) error -} diff --git a/vendor/github.com/docker/docker/api/server/router/plugin/plugin.go b/vendor/github.com/docker/docker/api/server/router/plugin/plugin.go deleted file mode 100644 index e4ea9e23b..000000000 --- a/vendor/github.com/docker/docker/api/server/router/plugin/plugin.go +++ /dev/null @@ -1,39 +0,0 @@ -package plugin - -import "github.com/docker/docker/api/server/router" - -// pluginRouter is a router to talk with the plugin controller -type pluginRouter struct { - backend Backend - routes []router.Route -} - -// NewRouter initializes a new plugin router -func NewRouter(b Backend) router.Router { - r := &pluginRouter{ - backend: b, - } - r.initRoutes() - return r -} - -// Routes returns the available routers to the plugin controller -func (r *pluginRouter) Routes() []router.Route { - return r.routes -} - -func (r *pluginRouter) initRoutes() { - r.routes = []router.Route{ - router.NewGetRoute("/plugins", r.listPlugins), - router.NewGetRoute("/plugins/{name:.*}/json", r.inspectPlugin), - router.NewGetRoute("/plugins/privileges", r.getPrivileges), - router.NewDeleteRoute("/plugins/{name:.*}", r.removePlugin), - router.NewPostRoute("/plugins/{name:.*}/enable", r.enablePlugin), // PATCH? - router.NewPostRoute("/plugins/{name:.*}/disable", r.disablePlugin), - router.Cancellable(router.NewPostRoute("/plugins/pull", r.pullPlugin)), - router.Cancellable(router.NewPostRoute("/plugins/{name:.*}/push", r.pushPlugin)), - router.Cancellable(router.NewPostRoute("/plugins/{name:.*}/upgrade", r.upgradePlugin)), - router.NewPostRoute("/plugins/{name:.*}/set", r.setPlugin), - router.NewPostRoute("/plugins/create", r.createPlugin), - } -} diff --git a/vendor/github.com/docker/docker/api/server/router/plugin/plugin_routes.go b/vendor/github.com/docker/docker/api/server/router/plugin/plugin_routes.go deleted file mode 100644 index 693fa95ba..000000000 --- a/vendor/github.com/docker/docker/api/server/router/plugin/plugin_routes.go +++ /dev/null @@ -1,314 +0,0 @@ -package plugin - -import ( - "encoding/base64" - "encoding/json" - "net/http" - "strconv" - "strings" - - distreference "github.com/docker/distribution/reference" - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/streamformatter" - "github.com/docker/docker/reference" - "github.com/pkg/errors" - "golang.org/x/net/context" -) - -func parseHeaders(headers http.Header) (map[string][]string, *types.AuthConfig) { - - metaHeaders := map[string][]string{} - for k, v := range headers { - if strings.HasPrefix(k, "X-Meta-") { - metaHeaders[k] = v - } - } - - // Get X-Registry-Auth - authEncoded := headers.Get("X-Registry-Auth") - authConfig := &types.AuthConfig{} - if authEncoded != "" { - authJSON := base64.NewDecoder(base64.URLEncoding, strings.NewReader(authEncoded)) - if err := json.NewDecoder(authJSON).Decode(authConfig); err != nil { - authConfig = &types.AuthConfig{} - } - } - - return metaHeaders, authConfig -} - -// parseRemoteRef parses the remote reference into a reference.Named -// returning the tag associated with the reference. In the case the -// given reference string includes both digest and tag, the returned -// reference will have the digest without the tag, but the tag will -// be returned. -func parseRemoteRef(remote string) (reference.Named, string, error) { - // Parse remote reference, supporting remotes with name and tag - // NOTE: Using distribution reference to handle references - // containing both a name and digest - remoteRef, err := distreference.ParseNamed(remote) - if err != nil { - return nil, "", err - } - - var tag string - if t, ok := remoteRef.(distreference.Tagged); ok { - tag = t.Tag() - } - - // Convert distribution reference to docker reference - // TODO: remove when docker reference changes reconciled upstream - ref, err := reference.WithName(remoteRef.Name()) - if err != nil { - return nil, "", err - } - if d, ok := remoteRef.(distreference.Digested); ok { - ref, err = reference.WithDigest(ref, d.Digest()) - if err != nil { - return nil, "", err - } - } else if tag != "" { - ref, err = reference.WithTag(ref, tag) - if err != nil { - return nil, "", err - } - } else { - ref = reference.WithDefaultTag(ref) - } - - return ref, tag, nil -} - -func (pr *pluginRouter) getPrivileges(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - metaHeaders, authConfig := parseHeaders(r.Header) - - ref, _, err := parseRemoteRef(r.FormValue("remote")) - if err != nil { - return err - } - - privileges, err := pr.backend.Privileges(ctx, ref, metaHeaders, authConfig) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, privileges) -} - -func (pr *pluginRouter) upgradePlugin(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return errors.Wrap(err, "failed to parse form") - } - - var privileges types.PluginPrivileges - dec := json.NewDecoder(r.Body) - if err := dec.Decode(&privileges); err != nil { - return errors.Wrap(err, "failed to parse privileges") - } - if dec.More() { - return errors.New("invalid privileges") - } - - metaHeaders, authConfig := parseHeaders(r.Header) - ref, tag, err := parseRemoteRef(r.FormValue("remote")) - if err != nil { - return err - } - - name, err := getName(ref, tag, vars["name"]) - if err != nil { - return err - } - w.Header().Set("Docker-Plugin-Name", name) - - w.Header().Set("Content-Type", "application/json") - output := ioutils.NewWriteFlusher(w) - - if err := pr.backend.Upgrade(ctx, ref, name, metaHeaders, authConfig, privileges, output); err != nil { - if !output.Flushed() { - return err - } - output.Write(streamformatter.NewJSONStreamFormatter().FormatError(err)) - } - - return nil -} - -func (pr *pluginRouter) pullPlugin(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return errors.Wrap(err, "failed to parse form") - } - - var privileges types.PluginPrivileges - dec := json.NewDecoder(r.Body) - if err := dec.Decode(&privileges); err != nil { - return errors.Wrap(err, "failed to parse privileges") - } - if dec.More() { - return errors.New("invalid privileges") - } - - metaHeaders, authConfig := parseHeaders(r.Header) - ref, tag, err := parseRemoteRef(r.FormValue("remote")) - if err != nil { - return err - } - - name, err := getName(ref, tag, r.FormValue("name")) - if err != nil { - return err - } - w.Header().Set("Docker-Plugin-Name", name) - - w.Header().Set("Content-Type", "application/json") - output := ioutils.NewWriteFlusher(w) - - if err := pr.backend.Pull(ctx, ref, name, metaHeaders, authConfig, privileges, output); err != nil { - if !output.Flushed() { - return err - } - output.Write(streamformatter.NewJSONStreamFormatter().FormatError(err)) - } - - return nil -} - -func getName(ref reference.Named, tag, name string) (string, error) { - if name == "" { - if _, ok := ref.(reference.Canonical); ok { - trimmed := reference.TrimNamed(ref) - if tag != "" { - nt, err := reference.WithTag(trimmed, tag) - if err != nil { - return "", err - } - name = nt.String() - } else { - name = reference.WithDefaultTag(trimmed).String() - } - } else { - name = ref.String() - } - } else { - localRef, err := reference.ParseNamed(name) - if err != nil { - return "", err - } - if _, ok := localRef.(reference.Canonical); ok { - return "", errors.New("cannot use digest in plugin tag") - } - if distreference.IsNameOnly(localRef) { - // TODO: log change in name to out stream - name = reference.WithDefaultTag(localRef).String() - } - } - return name, nil -} - -func (pr *pluginRouter) createPlugin(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - options := &types.PluginCreateOptions{ - RepoName: r.FormValue("name")} - - if err := pr.backend.CreateFromContext(ctx, r.Body, options); err != nil { - return err - } - //TODO: send progress bar - w.WriteHeader(http.StatusNoContent) - return nil -} - -func (pr *pluginRouter) enablePlugin(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - name := vars["name"] - timeout, err := strconv.Atoi(r.Form.Get("timeout")) - if err != nil { - return err - } - config := &types.PluginEnableConfig{Timeout: timeout} - - return pr.backend.Enable(name, config) -} - -func (pr *pluginRouter) disablePlugin(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - name := vars["name"] - config := &types.PluginDisableConfig{ - ForceDisable: httputils.BoolValue(r, "force"), - } - - return pr.backend.Disable(name, config) -} - -func (pr *pluginRouter) removePlugin(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - name := vars["name"] - config := &types.PluginRmConfig{ - ForceRemove: httputils.BoolValue(r, "force"), - } - return pr.backend.Remove(name, config) -} - -func (pr *pluginRouter) pushPlugin(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return errors.Wrap(err, "failed to parse form") - } - - metaHeaders, authConfig := parseHeaders(r.Header) - - w.Header().Set("Content-Type", "application/json") - output := ioutils.NewWriteFlusher(w) - - if err := pr.backend.Push(ctx, vars["name"], metaHeaders, authConfig, output); err != nil { - if !output.Flushed() { - return err - } - output.Write(streamformatter.NewJSONStreamFormatter().FormatError(err)) - } - return nil -} - -func (pr *pluginRouter) setPlugin(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var args []string - if err := json.NewDecoder(r.Body).Decode(&args); err != nil { - return err - } - if err := pr.backend.Set(vars["name"], args); err != nil { - return err - } - w.WriteHeader(http.StatusNoContent) - return nil -} - -func (pr *pluginRouter) listPlugins(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - l, err := pr.backend.List() - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, l) -} - -func (pr *pluginRouter) inspectPlugin(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - result, err := pr.backend.Inspect(vars["name"]) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, result) -} diff --git a/vendor/github.com/docker/docker/api/server/router/router.go b/vendor/github.com/docker/docker/api/server/router/router.go deleted file mode 100644 index 2de25c27f..000000000 --- a/vendor/github.com/docker/docker/api/server/router/router.go +++ /dev/null @@ -1,19 +0,0 @@ -package router - -import "github.com/docker/docker/api/server/httputils" - -// Router defines an interface to specify a group of routes to add to the docker server. -type Router interface { - // Routes returns the list of routes to add to the docker server. - Routes() []Route -} - -// Route defines an individual API route in the docker server. -type Route interface { - // Handler returns the raw function to create the http handler. - Handler() httputils.APIFunc - // Method returns the http method that the route responds to. - Method() string - // Path returns the subpath where the route responds to. - Path() string -} diff --git a/vendor/github.com/docker/docker/api/server/router/swarm/backend.go b/vendor/github.com/docker/docker/api/server/router/swarm/backend.go deleted file mode 100644 index 33840f0d3..000000000 --- a/vendor/github.com/docker/docker/api/server/router/swarm/backend.go +++ /dev/null @@ -1,36 +0,0 @@ -package swarm - -import ( - basictypes "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - types "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// Backend abstracts an swarm commands manager. -type Backend interface { - Init(req types.InitRequest) (string, error) - Join(req types.JoinRequest) error - Leave(force bool) error - Inspect() (types.Swarm, error) - Update(uint64, types.Spec, types.UpdateFlags) error - GetUnlockKey() (string, error) - UnlockSwarm(req types.UnlockRequest) error - GetServices(basictypes.ServiceListOptions) ([]types.Service, error) - GetService(string) (types.Service, error) - CreateService(types.ServiceSpec, string) (*basictypes.ServiceCreateResponse, error) - UpdateService(string, uint64, types.ServiceSpec, string, string) (*basictypes.ServiceUpdateResponse, error) - RemoveService(string) error - ServiceLogs(context.Context, string, *backend.ContainerLogsConfig, chan struct{}) error - GetNodes(basictypes.NodeListOptions) ([]types.Node, error) - GetNode(string) (types.Node, error) - UpdateNode(string, uint64, types.NodeSpec) error - RemoveNode(string, bool) error - GetTasks(basictypes.TaskListOptions) ([]types.Task, error) - GetTask(string) (types.Task, error) - GetSecrets(opts basictypes.SecretListOptions) ([]types.Secret, error) - CreateSecret(s types.SecretSpec) (string, error) - RemoveSecret(id string) error - GetSecret(id string) (types.Secret, error) - UpdateSecret(id string, version uint64, spec types.SecretSpec) error -} diff --git a/vendor/github.com/docker/docker/api/server/router/swarm/cluster.go b/vendor/github.com/docker/docker/api/server/router/swarm/cluster.go deleted file mode 100644 index e2d5ad19b..000000000 --- a/vendor/github.com/docker/docker/api/server/router/swarm/cluster.go +++ /dev/null @@ -1,52 +0,0 @@ -package swarm - -import "github.com/docker/docker/api/server/router" - -// swarmRouter is a router to talk with the build controller -type swarmRouter struct { - backend Backend - routes []router.Route -} - -// NewRouter initializes a new build router -func NewRouter(b Backend) router.Router { - r := &swarmRouter{ - backend: b, - } - r.initRoutes() - return r -} - -// Routes returns the available routers to the swarm controller -func (sr *swarmRouter) Routes() []router.Route { - return sr.routes -} - -func (sr *swarmRouter) initRoutes() { - sr.routes = []router.Route{ - router.NewPostRoute("/swarm/init", sr.initCluster), - router.NewPostRoute("/swarm/join", sr.joinCluster), - router.NewPostRoute("/swarm/leave", sr.leaveCluster), - router.NewGetRoute("/swarm", sr.inspectCluster), - router.NewGetRoute("/swarm/unlockkey", sr.getUnlockKey), - router.NewPostRoute("/swarm/update", sr.updateCluster), - router.NewPostRoute("/swarm/unlock", sr.unlockCluster), - router.NewGetRoute("/services", sr.getServices), - router.NewGetRoute("/services/{id}", sr.getService), - router.NewPostRoute("/services/create", sr.createService), - router.NewPostRoute("/services/{id}/update", sr.updateService), - router.NewDeleteRoute("/services/{id}", sr.removeService), - router.Experimental(router.Cancellable(router.NewGetRoute("/services/{id}/logs", sr.getServiceLogs))), - router.NewGetRoute("/nodes", sr.getNodes), - router.NewGetRoute("/nodes/{id}", sr.getNode), - router.NewDeleteRoute("/nodes/{id}", sr.removeNode), - router.NewPostRoute("/nodes/{id}/update", sr.updateNode), - router.NewGetRoute("/tasks", sr.getTasks), - router.NewGetRoute("/tasks/{id}", sr.getTask), - router.NewGetRoute("/secrets", sr.getSecrets), - router.NewPostRoute("/secrets/create", sr.createSecret), - router.NewDeleteRoute("/secrets/{id}", sr.removeSecret), - router.NewGetRoute("/secrets/{id}", sr.getSecret), - router.NewPostRoute("/secrets/{id}/update", sr.updateSecret), - } -} diff --git a/vendor/github.com/docker/docker/api/server/router/swarm/cluster_routes.go b/vendor/github.com/docker/docker/api/server/router/swarm/cluster_routes.go deleted file mode 100644 index fe976434b..000000000 --- a/vendor/github.com/docker/docker/api/server/router/swarm/cluster_routes.go +++ /dev/null @@ -1,418 +0,0 @@ -package swarm - -import ( - "encoding/json" - "fmt" - "net/http" - "strconv" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/server/httputils" - basictypes "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/filters" - types "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -func (sr *swarmRouter) initCluster(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var req types.InitRequest - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - return err - } - nodeID, err := sr.backend.Init(req) - if err != nil { - logrus.Errorf("Error initializing swarm: %v", err) - return err - } - return httputils.WriteJSON(w, http.StatusOK, nodeID) -} - -func (sr *swarmRouter) joinCluster(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var req types.JoinRequest - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - return err - } - return sr.backend.Join(req) -} - -func (sr *swarmRouter) leaveCluster(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - force := httputils.BoolValue(r, "force") - return sr.backend.Leave(force) -} - -func (sr *swarmRouter) inspectCluster(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - swarm, err := sr.backend.Inspect() - if err != nil { - logrus.Errorf("Error getting swarm: %v", err) - return err - } - - return httputils.WriteJSON(w, http.StatusOK, swarm) -} - -func (sr *swarmRouter) updateCluster(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var swarm types.Spec - if err := json.NewDecoder(r.Body).Decode(&swarm); err != nil { - return err - } - - rawVersion := r.URL.Query().Get("version") - version, err := strconv.ParseUint(rawVersion, 10, 64) - if err != nil { - return fmt.Errorf("Invalid swarm version '%s': %s", rawVersion, err.Error()) - } - - var flags types.UpdateFlags - - if value := r.URL.Query().Get("rotateWorkerToken"); value != "" { - rot, err := strconv.ParseBool(value) - if err != nil { - return fmt.Errorf("invalid value for rotateWorkerToken: %s", value) - } - - flags.RotateWorkerToken = rot - } - - if value := r.URL.Query().Get("rotateManagerToken"); value != "" { - rot, err := strconv.ParseBool(value) - if err != nil { - return fmt.Errorf("invalid value for rotateManagerToken: %s", value) - } - - flags.RotateManagerToken = rot - } - - if value := r.URL.Query().Get("rotateManagerUnlockKey"); value != "" { - rot, err := strconv.ParseBool(value) - if err != nil { - return fmt.Errorf("invalid value for rotateManagerUnlockKey: %s", value) - } - - flags.RotateManagerUnlockKey = rot - } - - if err := sr.backend.Update(version, swarm, flags); err != nil { - logrus.Errorf("Error configuring swarm: %v", err) - return err - } - return nil -} - -func (sr *swarmRouter) unlockCluster(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var req types.UnlockRequest - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - return err - } - - if err := sr.backend.UnlockSwarm(req); err != nil { - logrus.Errorf("Error unlocking swarm: %v", err) - return err - } - return nil -} - -func (sr *swarmRouter) getUnlockKey(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - unlockKey, err := sr.backend.GetUnlockKey() - if err != nil { - logrus.WithError(err).Errorf("Error retrieving swarm unlock key") - return err - } - - return httputils.WriteJSON(w, http.StatusOK, &basictypes.SwarmUnlockKeyResponse{ - UnlockKey: unlockKey, - }) -} - -func (sr *swarmRouter) getServices(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - filter, err := filters.FromParam(r.Form.Get("filters")) - if err != nil { - return err - } - - services, err := sr.backend.GetServices(basictypes.ServiceListOptions{Filters: filter}) - if err != nil { - logrus.Errorf("Error getting services: %v", err) - return err - } - - return httputils.WriteJSON(w, http.StatusOK, services) -} - -func (sr *swarmRouter) getService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - service, err := sr.backend.GetService(vars["id"]) - if err != nil { - logrus.Errorf("Error getting service %s: %v", vars["id"], err) - return err - } - - return httputils.WriteJSON(w, http.StatusOK, service) -} - -func (sr *swarmRouter) createService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var service types.ServiceSpec - if err := json.NewDecoder(r.Body).Decode(&service); err != nil { - return err - } - - // Get returns "" if the header does not exist - encodedAuth := r.Header.Get("X-Registry-Auth") - - resp, err := sr.backend.CreateService(service, encodedAuth) - if err != nil { - logrus.Errorf("Error creating service %s: %v", service.Name, err) - return err - } - - return httputils.WriteJSON(w, http.StatusCreated, resp) -} - -func (sr *swarmRouter) updateService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var service types.ServiceSpec - if err := json.NewDecoder(r.Body).Decode(&service); err != nil { - return err - } - - rawVersion := r.URL.Query().Get("version") - version, err := strconv.ParseUint(rawVersion, 10, 64) - if err != nil { - return fmt.Errorf("Invalid service version '%s': %s", rawVersion, err.Error()) - } - - // Get returns "" if the header does not exist - encodedAuth := r.Header.Get("X-Registry-Auth") - - registryAuthFrom := r.URL.Query().Get("registryAuthFrom") - - resp, err := sr.backend.UpdateService(vars["id"], version, service, encodedAuth, registryAuthFrom) - if err != nil { - logrus.Errorf("Error updating service %s: %v", vars["id"], err) - return err - } - return httputils.WriteJSON(w, http.StatusOK, resp) -} - -func (sr *swarmRouter) removeService(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := sr.backend.RemoveService(vars["id"]); err != nil { - logrus.Errorf("Error removing service %s: %v", vars["id"], err) - return err - } - return nil -} - -func (sr *swarmRouter) getServiceLogs(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - // Args are validated before the stream starts because when it starts we're - // sending HTTP 200 by writing an empty chunk of data to tell the client that - // daemon is going to stream. By sending this initial HTTP 200 we can't report - // any error after the stream starts (i.e. container not found, wrong parameters) - // with the appropriate status code. - stdout, stderr := httputils.BoolValue(r, "stdout"), httputils.BoolValue(r, "stderr") - if !(stdout || stderr) { - return fmt.Errorf("Bad parameters: you must choose at least one stream") - } - - serviceName := vars["id"] - logsConfig := &backend.ContainerLogsConfig{ - ContainerLogsOptions: basictypes.ContainerLogsOptions{ - Follow: httputils.BoolValue(r, "follow"), - Timestamps: httputils.BoolValue(r, "timestamps"), - Since: r.Form.Get("since"), - Tail: r.Form.Get("tail"), - ShowStdout: stdout, - ShowStderr: stderr, - Details: httputils.BoolValue(r, "details"), - }, - OutStream: w, - } - - if logsConfig.Details { - return fmt.Errorf("Bad parameters: details is not currently supported") - } - - chStarted := make(chan struct{}) - if err := sr.backend.ServiceLogs(ctx, serviceName, logsConfig, chStarted); err != nil { - select { - case <-chStarted: - // The client may be expecting all of the data we're sending to - // be multiplexed, so send it through OutStream, which will - // have been set up to handle that if needed. - fmt.Fprintf(logsConfig.OutStream, "Error grabbing service logs: %v\n", err) - default: - return err - } - } - - return nil -} - -func (sr *swarmRouter) getNodes(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - filter, err := filters.FromParam(r.Form.Get("filters")) - if err != nil { - return err - } - - nodes, err := sr.backend.GetNodes(basictypes.NodeListOptions{Filters: filter}) - if err != nil { - logrus.Errorf("Error getting nodes: %v", err) - return err - } - - return httputils.WriteJSON(w, http.StatusOK, nodes) -} - -func (sr *swarmRouter) getNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - node, err := sr.backend.GetNode(vars["id"]) - if err != nil { - logrus.Errorf("Error getting node %s: %v", vars["id"], err) - return err - } - - return httputils.WriteJSON(w, http.StatusOK, node) -} - -func (sr *swarmRouter) updateNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var node types.NodeSpec - if err := json.NewDecoder(r.Body).Decode(&node); err != nil { - return err - } - - rawVersion := r.URL.Query().Get("version") - version, err := strconv.ParseUint(rawVersion, 10, 64) - if err != nil { - return fmt.Errorf("Invalid node version '%s': %s", rawVersion, err.Error()) - } - - if err := sr.backend.UpdateNode(vars["id"], version, node); err != nil { - logrus.Errorf("Error updating node %s: %v", vars["id"], err) - return err - } - return nil -} - -func (sr *swarmRouter) removeNode(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - force := httputils.BoolValue(r, "force") - - if err := sr.backend.RemoveNode(vars["id"], force); err != nil { - logrus.Errorf("Error removing node %s: %v", vars["id"], err) - return err - } - return nil -} - -func (sr *swarmRouter) getTasks(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - filter, err := filters.FromParam(r.Form.Get("filters")) - if err != nil { - return err - } - - tasks, err := sr.backend.GetTasks(basictypes.TaskListOptions{Filters: filter}) - if err != nil { - logrus.Errorf("Error getting tasks: %v", err) - return err - } - - return httputils.WriteJSON(w, http.StatusOK, tasks) -} - -func (sr *swarmRouter) getTask(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - task, err := sr.backend.GetTask(vars["id"]) - if err != nil { - logrus.Errorf("Error getting task %s: %v", vars["id"], err) - return err - } - - return httputils.WriteJSON(w, http.StatusOK, task) -} - -func (sr *swarmRouter) getSecrets(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - filters, err := filters.FromParam(r.Form.Get("filters")) - if err != nil { - return err - } - - secrets, err := sr.backend.GetSecrets(basictypes.SecretListOptions{Filters: filters}) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, secrets) -} - -func (sr *swarmRouter) createSecret(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var secret types.SecretSpec - if err := json.NewDecoder(r.Body).Decode(&secret); err != nil { - return err - } - - id, err := sr.backend.CreateSecret(secret) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusCreated, &basictypes.SecretCreateResponse{ - ID: id, - }) -} - -func (sr *swarmRouter) removeSecret(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := sr.backend.RemoveSecret(vars["id"]); err != nil { - return err - } - w.WriteHeader(http.StatusNoContent) - - return nil -} - -func (sr *swarmRouter) getSecret(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - secret, err := sr.backend.GetSecret(vars["id"]) - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, secret) -} - -func (sr *swarmRouter) updateSecret(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var secret types.SecretSpec - if err := json.NewDecoder(r.Body).Decode(&secret); err != nil { - return errors.NewBadRequestError(err) - } - - rawVersion := r.URL.Query().Get("version") - version, err := strconv.ParseUint(rawVersion, 10, 64) - if err != nil { - return errors.NewBadRequestError(fmt.Errorf("invalid secret version")) - } - - id := vars["id"] - if err := sr.backend.UpdateSecret(id, version, secret); err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/api/server/router/system/backend.go b/vendor/github.com/docker/docker/api/server/router/system/backend.go deleted file mode 100644 index 6946c4e2d..000000000 --- a/vendor/github.com/docker/docker/api/server/router/system/backend.go +++ /dev/null @@ -1,21 +0,0 @@ -package system - -import ( - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/events" - "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" -) - -// Backend is the methods that need to be implemented to provide -// system specific functionality. -type Backend interface { - SystemInfo() (*types.Info, error) - SystemVersion() types.Version - SystemDiskUsage() (*types.DiskUsage, error) - SubscribeToEvents(since, until time.Time, ef filters.Args) ([]events.Message, chan interface{}) - UnsubscribeFromEvents(chan interface{}) - AuthenticateToRegistry(ctx context.Context, authConfig *types.AuthConfig) (string, string, error) -} diff --git a/vendor/github.com/docker/docker/api/server/router/system/system.go b/vendor/github.com/docker/docker/api/server/router/system/system.go deleted file mode 100644 index ed23d3bde..000000000 --- a/vendor/github.com/docker/docker/api/server/router/system/system.go +++ /dev/null @@ -1,39 +0,0 @@ -package system - -import ( - "github.com/docker/docker/api/server/router" - "github.com/docker/docker/daemon/cluster" -) - -// systemRouter provides information about the Docker system overall. -// It gathers information about host, daemon and container events. -type systemRouter struct { - backend Backend - clusterProvider *cluster.Cluster - routes []router.Route -} - -// NewRouter initializes a new system router -func NewRouter(b Backend, c *cluster.Cluster) router.Router { - r := &systemRouter{ - backend: b, - clusterProvider: c, - } - - r.routes = []router.Route{ - router.NewOptionsRoute("/{anyroute:.*}", optionsHandler), - router.NewGetRoute("/_ping", pingHandler), - router.Cancellable(router.NewGetRoute("/events", r.getEvents)), - router.NewGetRoute("/info", r.getInfo), - router.NewGetRoute("/version", r.getVersion), - router.NewGetRoute("/system/df", r.getDiskUsage), - router.NewPostRoute("/auth", r.postAuth), - } - - return r -} - -// Routes returns all the API routes dedicated to the docker system -func (s *systemRouter) Routes() []router.Route { - return s.routes -} diff --git a/vendor/github.com/docker/docker/api/server/router/system/system_routes.go b/vendor/github.com/docker/docker/api/server/router/system/system_routes.go deleted file mode 100644 index 0d851b684..000000000 --- a/vendor/github.com/docker/docker/api/server/router/system/system_routes.go +++ /dev/null @@ -1,186 +0,0 @@ -package system - -import ( - "encoding/json" - "fmt" - "net/http" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api" - "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/events" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/registry" - timetypes "github.com/docker/docker/api/types/time" - "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/pkg/ioutils" - "golang.org/x/net/context" -) - -func optionsHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - w.WriteHeader(http.StatusOK) - return nil -} - -func pingHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - _, err := w.Write([]byte{'O', 'K'}) - return err -} - -func (s *systemRouter) getInfo(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - info, err := s.backend.SystemInfo() - if err != nil { - return err - } - if s.clusterProvider != nil { - info.Swarm = s.clusterProvider.Info() - } - - if versions.LessThan(httputils.VersionFromContext(ctx), "1.25") { - // TODO: handle this conversion in engine-api - type oldInfo struct { - *types.Info - ExecutionDriver string - } - old := &oldInfo{ - Info: info, - ExecutionDriver: "", - } - nameOnlySecurityOptions := []string{} - kvSecOpts, err := types.DecodeSecurityOptions(old.SecurityOptions) - if err != nil { - return err - } - for _, s := range kvSecOpts { - nameOnlySecurityOptions = append(nameOnlySecurityOptions, s.Name) - } - old.SecurityOptions = nameOnlySecurityOptions - return httputils.WriteJSON(w, http.StatusOK, old) - } - return httputils.WriteJSON(w, http.StatusOK, info) -} - -func (s *systemRouter) getVersion(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - info := s.backend.SystemVersion() - info.APIVersion = api.DefaultVersion - - return httputils.WriteJSON(w, http.StatusOK, info) -} - -func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - du, err := s.backend.SystemDiskUsage() - if err != nil { - return err - } - - return httputils.WriteJSON(w, http.StatusOK, du) -} - -func (s *systemRouter) getEvents(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - since, err := eventTime(r.Form.Get("since")) - if err != nil { - return err - } - until, err := eventTime(r.Form.Get("until")) - if err != nil { - return err - } - - var ( - timeout <-chan time.Time - onlyPastEvents bool - ) - if !until.IsZero() { - if until.Before(since) { - return errors.NewBadRequestError(fmt.Errorf("`since` time (%s) cannot be after `until` time (%s)", r.Form.Get("since"), r.Form.Get("until"))) - } - - now := time.Now() - - onlyPastEvents = until.Before(now) - - if !onlyPastEvents { - dur := until.Sub(now) - timeout = time.NewTimer(dur).C - } - } - - ef, err := filters.FromParam(r.Form.Get("filters")) - if err != nil { - return err - } - - w.Header().Set("Content-Type", "application/json") - output := ioutils.NewWriteFlusher(w) - defer output.Close() - output.Flush() - - enc := json.NewEncoder(output) - - buffered, l := s.backend.SubscribeToEvents(since, until, ef) - defer s.backend.UnsubscribeFromEvents(l) - - for _, ev := range buffered { - if err := enc.Encode(ev); err != nil { - return err - } - } - - if onlyPastEvents { - return nil - } - - for { - select { - case ev := <-l: - jev, ok := ev.(events.Message) - if !ok { - logrus.Warnf("unexpected event message: %q", ev) - continue - } - if err := enc.Encode(jev); err != nil { - return err - } - case <-timeout: - return nil - case <-ctx.Done(): - logrus.Debug("Client context cancelled, stop sending events") - return nil - } - } -} - -func (s *systemRouter) postAuth(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - var config *types.AuthConfig - err := json.NewDecoder(r.Body).Decode(&config) - r.Body.Close() - if err != nil { - return err - } - status, token, err := s.backend.AuthenticateToRegistry(ctx, config) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, ®istry.AuthenticateOKBody{ - Status: status, - IdentityToken: token, - }) -} - -func eventTime(formTime string) (time.Time, error) { - t, tNano, err := timetypes.ParseTimestamps(formTime, -1) - if err != nil { - return time.Time{}, err - } - if t == -1 { - return time.Time{}, nil - } - return time.Unix(t, tNano), nil -} diff --git a/vendor/github.com/docker/docker/api/server/router/volume/backend.go b/vendor/github.com/docker/docker/api/server/router/volume/backend.go deleted file mode 100644 index 180c06e5d..000000000 --- a/vendor/github.com/docker/docker/api/server/router/volume/backend.go +++ /dev/null @@ -1,17 +0,0 @@ -package volume - -import ( - // TODO return types need to be refactored into pkg - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" -) - -// Backend is the methods that need to be implemented to provide -// volume specific functionality -type Backend interface { - Volumes(filter string) ([]*types.Volume, []string, error) - VolumeInspect(name string) (*types.Volume, error) - VolumeCreate(name, driverName string, opts, labels map[string]string) (*types.Volume, error) - VolumeRm(name string, force bool) error - VolumesPrune(pruneFilters filters.Args) (*types.VolumesPruneReport, error) -} diff --git a/vendor/github.com/docker/docker/api/server/router/volume/volume.go b/vendor/github.com/docker/docker/api/server/router/volume/volume.go deleted file mode 100644 index 4e9f972a6..000000000 --- a/vendor/github.com/docker/docker/api/server/router/volume/volume.go +++ /dev/null @@ -1,36 +0,0 @@ -package volume - -import "github.com/docker/docker/api/server/router" - -// volumeRouter is a router to talk with the volumes controller -type volumeRouter struct { - backend Backend - routes []router.Route -} - -// NewRouter initializes a new volume router -func NewRouter(b Backend) router.Router { - r := &volumeRouter{ - backend: b, - } - r.initRoutes() - return r -} - -// Routes returns the available routes to the volumes controller -func (r *volumeRouter) Routes() []router.Route { - return r.routes -} - -func (r *volumeRouter) initRoutes() { - r.routes = []router.Route{ - // GET - router.NewGetRoute("/volumes", r.getVolumesList), - router.NewGetRoute("/volumes/{name:.*}", r.getVolumeByName), - // POST - router.NewPostRoute("/volumes/create", r.postVolumesCreate), - router.NewPostRoute("/volumes/prune", r.postVolumesPrune), - // DELETE - router.NewDeleteRoute("/volumes/{name:.*}", r.deleteVolumes), - } -} diff --git a/vendor/github.com/docker/docker/api/server/router/volume/volume_routes.go b/vendor/github.com/docker/docker/api/server/router/volume/volume_routes.go deleted file mode 100644 index cfd4618a4..000000000 --- a/vendor/github.com/docker/docker/api/server/router/volume/volume_routes.go +++ /dev/null @@ -1,80 +0,0 @@ -package volume - -import ( - "encoding/json" - "net/http" - - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/types/filters" - volumetypes "github.com/docker/docker/api/types/volume" - "golang.org/x/net/context" -) - -func (v *volumeRouter) getVolumesList(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - volumes, warnings, err := v.backend.Volumes(r.Form.Get("filters")) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, &volumetypes.VolumesListOKBody{Volumes: volumes, Warnings: warnings}) -} - -func (v *volumeRouter) getVolumeByName(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - volume, err := v.backend.VolumeInspect(vars["name"]) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, volume) -} - -func (v *volumeRouter) postVolumesCreate(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - if err := httputils.CheckForJSON(r); err != nil { - return err - } - - var req volumetypes.VolumesCreateBody - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - return err - } - - volume, err := v.backend.VolumeCreate(req.Name, req.Driver, req.DriverOpts, req.Labels) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusCreated, volume) -} - -func (v *volumeRouter) deleteVolumes(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - force := httputils.BoolValue(r, "force") - if err := v.backend.VolumeRm(vars["name"], force); err != nil { - return err - } - w.WriteHeader(http.StatusNoContent) - return nil -} - -func (v *volumeRouter) postVolumesPrune(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if err := httputils.ParseForm(r); err != nil { - return err - } - - pruneReport, err := v.backend.VolumesPrune(filters.Args{}) - if err != nil { - return err - } - return httputils.WriteJSON(w, http.StatusOK, pruneReport) -} diff --git a/vendor/github.com/docker/docker/api/server/router_swapper.go b/vendor/github.com/docker/docker/api/server/router_swapper.go deleted file mode 100644 index 1ecc7a7f3..000000000 --- a/vendor/github.com/docker/docker/api/server/router_swapper.go +++ /dev/null @@ -1,30 +0,0 @@ -package server - -import ( - "net/http" - "sync" - - "github.com/gorilla/mux" -) - -// routerSwapper is an http.Handler that allows you to swap -// mux routers. -type routerSwapper struct { - mu sync.Mutex - router *mux.Router -} - -// Swap changes the old router with the new one. -func (rs *routerSwapper) Swap(newRouter *mux.Router) { - rs.mu.Lock() - rs.router = newRouter - rs.mu.Unlock() -} - -// ServeHTTP makes the routerSwapper to implement the http.Handler interface. -func (rs *routerSwapper) ServeHTTP(w http.ResponseWriter, r *http.Request) { - rs.mu.Lock() - router := rs.router - rs.mu.Unlock() - router.ServeHTTP(w, r) -} diff --git a/vendor/github.com/docker/docker/api/server/server.go b/vendor/github.com/docker/docker/api/server/server.go deleted file mode 100644 index 60ee075c7..000000000 --- a/vendor/github.com/docker/docker/api/server/server.go +++ /dev/null @@ -1,210 +0,0 @@ -package server - -import ( - "crypto/tls" - "fmt" - "net" - "net/http" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/server/middleware" - "github.com/docker/docker/api/server/router" - "github.com/gorilla/mux" - "golang.org/x/net/context" -) - -// versionMatcher defines a variable matcher to be parsed by the router -// when a request is about to be served. -const versionMatcher = "/v{version:[0-9.]+}" - -// Config provides the configuration for the API server -type Config struct { - Logging bool - EnableCors bool - CorsHeaders string - Version string - SocketGroup string - TLSConfig *tls.Config -} - -// Server contains instance details for the server -type Server struct { - cfg *Config - servers []*HTTPServer - routers []router.Router - routerSwapper *routerSwapper - middlewares []middleware.Middleware -} - -// New returns a new instance of the server based on the specified configuration. -// It allocates resources which will be needed for ServeAPI(ports, unix-sockets). -func New(cfg *Config) *Server { - return &Server{ - cfg: cfg, - } -} - -// UseMiddleware appends a new middleware to the request chain. -// This needs to be called before the API routes are configured. -func (s *Server) UseMiddleware(m middleware.Middleware) { - s.middlewares = append(s.middlewares, m) -} - -// Accept sets a listener the server accepts connections into. -func (s *Server) Accept(addr string, listeners ...net.Listener) { - for _, listener := range listeners { - httpServer := &HTTPServer{ - srv: &http.Server{ - Addr: addr, - }, - l: listener, - } - s.servers = append(s.servers, httpServer) - } -} - -// Close closes servers and thus stop receiving requests -func (s *Server) Close() { - for _, srv := range s.servers { - if err := srv.Close(); err != nil { - logrus.Error(err) - } - } -} - -// serveAPI loops through all initialized servers and spawns goroutine -// with Serve method for each. It sets createMux() as Handler also. -func (s *Server) serveAPI() error { - var chErrors = make(chan error, len(s.servers)) - for _, srv := range s.servers { - srv.srv.Handler = s.routerSwapper - go func(srv *HTTPServer) { - var err error - logrus.Infof("API listen on %s", srv.l.Addr()) - if err = srv.Serve(); err != nil && strings.Contains(err.Error(), "use of closed network connection") { - err = nil - } - chErrors <- err - }(srv) - } - - for i := 0; i < len(s.servers); i++ { - err := <-chErrors - if err != nil { - return err - } - } - - return nil -} - -// HTTPServer contains an instance of http server and the listener. -// srv *http.Server, contains configuration to create an http server and a mux router with all api end points. -// l net.Listener, is a TCP or Socket listener that dispatches incoming request to the router. -type HTTPServer struct { - srv *http.Server - l net.Listener -} - -// Serve starts listening for inbound requests. -func (s *HTTPServer) Serve() error { - return s.srv.Serve(s.l) -} - -// Close closes the HTTPServer from listening for the inbound requests. -func (s *HTTPServer) Close() error { - return s.l.Close() -} - -func (s *Server) makeHTTPHandler(handler httputils.APIFunc) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - // Define the context that we'll pass around to share info - // like the docker-request-id. - // - // The 'context' will be used for global data that should - // apply to all requests. Data that is specific to the - // immediate function being called should still be passed - // as 'args' on the function call. - ctx := context.WithValue(context.Background(), httputils.UAStringKey, r.Header.Get("User-Agent")) - handlerFunc := s.handlerWithGlobalMiddlewares(handler) - - vars := mux.Vars(r) - if vars == nil { - vars = make(map[string]string) - } - - if err := handlerFunc(ctx, w, r, vars); err != nil { - statusCode := httputils.GetHTTPErrorStatusCode(err) - errFormat := "%v" - if statusCode == http.StatusInternalServerError { - errFormat = "%+v" - } - logrus.Errorf("Handler for %s %s returned error: "+errFormat, r.Method, r.URL.Path, err) - httputils.MakeErrorHandler(err)(w, r) - } - } -} - -// InitRouter initializes the list of routers for the server. -// This method also enables the Go profiler if enableProfiler is true. -func (s *Server) InitRouter(enableProfiler bool, routers ...router.Router) { - s.routers = append(s.routers, routers...) - - m := s.createMux() - if enableProfiler { - profilerSetup(m) - } - s.routerSwapper = &routerSwapper{ - router: m, - } -} - -// createMux initializes the main router the server uses. -func (s *Server) createMux() *mux.Router { - m := mux.NewRouter() - - logrus.Debug("Registering routers") - for _, apiRouter := range s.routers { - for _, r := range apiRouter.Routes() { - f := s.makeHTTPHandler(r.Handler()) - - logrus.Debugf("Registering %s, %s", r.Method(), r.Path()) - m.Path(versionMatcher + r.Path()).Methods(r.Method()).Handler(f) - m.Path(r.Path()).Methods(r.Method()).Handler(f) - } - } - - err := errors.NewRequestNotFoundError(fmt.Errorf("page not found")) - notFoundHandler := httputils.MakeErrorHandler(err) - m.HandleFunc(versionMatcher+"/{path:.*}", notFoundHandler) - m.NotFoundHandler = notFoundHandler - - return m -} - -// Wait blocks the server goroutine until it exits. -// It sends an error message if there is any error during -// the API execution. -func (s *Server) Wait(waitChan chan error) { - if err := s.serveAPI(); err != nil { - logrus.Errorf("ServeAPI error: %v", err) - waitChan <- err - return - } - waitChan <- nil -} - -// DisableProfiler reloads the server mux without adding the profiler routes. -func (s *Server) DisableProfiler() { - s.routerSwapper.Swap(s.createMux()) -} - -// EnableProfiler reloads the server mux adding the profiler routes. -func (s *Server) EnableProfiler() { - m := s.createMux() - profilerSetup(m) - s.routerSwapper.Swap(m) -} diff --git a/vendor/github.com/docker/docker/api/server/server_test.go b/vendor/github.com/docker/docker/api/server/server_test.go deleted file mode 100644 index 11831c148..000000000 --- a/vendor/github.com/docker/docker/api/server/server_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package server - -import ( - "net/http" - "net/http/httptest" - "strings" - "testing" - - "github.com/docker/docker/api" - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/api/server/middleware" - - "golang.org/x/net/context" -) - -func TestMiddlewares(t *testing.T) { - cfg := &Config{ - Version: "0.1omega2", - } - srv := &Server{ - cfg: cfg, - } - - srv.UseMiddleware(middleware.NewVersionMiddleware("0.1omega2", api.DefaultVersion, api.MinVersion)) - - req, _ := http.NewRequest("GET", "/containers/json", nil) - resp := httptest.NewRecorder() - ctx := context.Background() - - localHandler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - if httputils.VersionFromContext(ctx) == "" { - t.Fatalf("Expected version, got empty string") - } - - if sv := w.Header().Get("Server"); !strings.Contains(sv, "Docker/0.1omega2") { - t.Fatalf("Expected server version in the header `Docker/0.1omega2`, got %s", sv) - } - - return nil - } - - handlerFunc := srv.handlerWithGlobalMiddlewares(localHandler) - if err := handlerFunc(ctx, resp, req, map[string]string{}); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/docker/api/templates/server/operation.gotmpl b/vendor/github.com/docker/docker/api/templates/server/operation.gotmpl deleted file mode 100644 index 3a3d7527d..000000000 --- a/vendor/github.com/docker/docker/api/templates/server/operation.gotmpl +++ /dev/null @@ -1,26 +0,0 @@ -package {{ .Package }} - -// ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` -// -// See hack/swagger-gen.sh -// ---------------------------------------------------------------------------- - -import ( - "net/http" - - context "golang.org/x/net/context" - - {{ range .DefaultImports }}{{ printf "%q" . }} - {{ end }} - {{ range $key, $value := .Imports }}{{ $key }} {{ printf "%q" $value }} - {{ end }} -) - - -{{ range .ExtraSchemas }} -// {{ .Name }} {{ template "docstring" . }} -// swagger:model {{ .Name }} -{{ template "schema" . }} -{{ end }} diff --git a/vendor/github.com/docker/docker/api/types/backend/backend.go b/vendor/github.com/docker/docker/api/types/backend/backend.go deleted file mode 100644 index abc0bba3f..000000000 --- a/vendor/github.com/docker/docker/api/types/backend/backend.go +++ /dev/null @@ -1,84 +0,0 @@ -// Package backend includes types to send information to server backends. -package backend - -import ( - "io" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/streamformatter" -) - -// ContainerAttachConfig holds the streams to use when connecting to a container to view logs. -type ContainerAttachConfig struct { - GetStreams func() (io.ReadCloser, io.Writer, io.Writer, error) - UseStdin bool - UseStdout bool - UseStderr bool - Logs bool - Stream bool - DetachKeys string - - // Used to signify that streams are multiplexed and therefore need a StdWriter to encode stdout/sderr messages accordingly. - // TODO @cpuguy83: This shouldn't be needed. It was only added so that http and websocket endpoints can use the same function, and the websocket function was not using a stdwriter prior to this change... - // HOWEVER, the websocket endpoint is using a single stream and SHOULD be encoded with stdout/stderr as is done for HTTP since it is still just a single stream. - // Since such a change is an API change unrelated to the current changeset we'll keep it as is here and change separately. - MuxStreams bool -} - -// ContainerLogsConfig holds configs for logging operations. Exists -// for users of the backend to to pass it a logging configuration. -type ContainerLogsConfig struct { - types.ContainerLogsOptions - OutStream io.Writer -} - -// ContainerStatsConfig holds information for configuring the runtime -// behavior of a backend.ContainerStats() call. -type ContainerStatsConfig struct { - Stream bool - OutStream io.Writer - Version string -} - -// ExecInspect holds information about a running process started -// with docker exec. -type ExecInspect struct { - ID string - Running bool - ExitCode *int - ProcessConfig *ExecProcessConfig - OpenStdin bool - OpenStderr bool - OpenStdout bool - CanRemove bool - ContainerID string - DetachKeys []byte - Pid int -} - -// ExecProcessConfig holds information about the exec process -// running on the host. -type ExecProcessConfig struct { - Tty bool `json:"tty"` - Entrypoint string `json:"entrypoint"` - Arguments []string `json:"arguments"` - Privileged *bool `json:"privileged,omitempty"` - User string `json:"user,omitempty"` -} - -// ContainerCommitConfig is a wrapper around -// types.ContainerCommitConfig that also -// transports configuration changes for a container. -type ContainerCommitConfig struct { - types.ContainerCommitConfig - Changes []string -} - -// ProgressWriter is an interface -// to transport progress streams. -type ProgressWriter struct { - Output io.Writer - StdoutFormatter *streamformatter.StdoutFormatter - StderrFormatter *streamformatter.StderrFormatter - ProgressReaderFunc func(io.ReadCloser) io.ReadCloser -} diff --git a/vendor/github.com/docker/docker/api/types/versions/v1p19/types.go b/vendor/github.com/docker/docker/api/types/versions/v1p19/types.go deleted file mode 100644 index dc1315054..000000000 --- a/vendor/github.com/docker/docker/api/types/versions/v1p19/types.go +++ /dev/null @@ -1,35 +0,0 @@ -// Package v1p19 provides specific API types for the API version 1, patch 19. -package v1p19 - -import ( - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/versions/v1p20" - "github.com/docker/go-connections/nat" -) - -// ContainerJSON is a backcompatibility struct for APIs prior to 1.20. -// Note this is not used by the Windows daemon. -type ContainerJSON struct { - *types.ContainerJSONBase - Volumes map[string]string - VolumesRW map[string]bool - Config *ContainerConfig - NetworkSettings *v1p20.NetworkSettings -} - -// ContainerConfig is a backcompatibility struct for APIs prior to 1.20. -type ContainerConfig struct { - *container.Config - - MacAddress string - NetworkDisabled bool - ExposedPorts map[nat.Port]struct{} - - // backward compatibility, they now live in HostConfig - VolumeDriver string - Memory int64 - MemorySwap int64 - CPUShares int64 `json:"CpuShares"` - CPUSet string `json:"Cpuset"` -} diff --git a/vendor/github.com/docker/docker/api/types/versions/v1p20/types.go b/vendor/github.com/docker/docker/api/types/versions/v1p20/types.go deleted file mode 100644 index 94a06d745..000000000 --- a/vendor/github.com/docker/docker/api/types/versions/v1p20/types.go +++ /dev/null @@ -1,40 +0,0 @@ -// Package v1p20 provides specific API types for the API version 1, patch 20. -package v1p20 - -import ( - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/go-connections/nat" -) - -// ContainerJSON is a backcompatibility struct for the API 1.20 -type ContainerJSON struct { - *types.ContainerJSONBase - Mounts []types.MountPoint - Config *ContainerConfig - NetworkSettings *NetworkSettings -} - -// ContainerConfig is a backcompatibility struct used in ContainerJSON for the API 1.20 -type ContainerConfig struct { - *container.Config - - MacAddress string - NetworkDisabled bool - ExposedPorts map[nat.Port]struct{} - - // backward compatibility, they now live in HostConfig - VolumeDriver string -} - -// StatsJSON is a backcompatibility struct used in Stats for APIs prior to 1.21 -type StatsJSON struct { - types.Stats - Network types.NetworkStats `json:"network,omitempty"` -} - -// NetworkSettings is a backward compatible struct for APIs prior to 1.21 -type NetworkSettings struct { - types.NetworkSettingsBase - types.DefaultNetworkSettings -} diff --git a/vendor/github.com/docker/docker/builder/builder.go b/vendor/github.com/docker/docker/builder/builder.go deleted file mode 100644 index ced19e81e..000000000 --- a/vendor/github.com/docker/docker/builder/builder.go +++ /dev/null @@ -1,169 +0,0 @@ -// Package builder defines interfaces for any Docker builder to implement. -// -// Historically, only server-side Dockerfile interpreters existed. -// This package allows for other implementations of Docker builders. -package builder - -import ( - "io" - "os" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/image" - "github.com/docker/docker/reference" - "golang.org/x/net/context" -) - -const ( - // DefaultDockerfileName is the Default filename with Docker commands, read by docker build - DefaultDockerfileName string = "Dockerfile" -) - -// Context represents a file system tree. -type Context interface { - // Close allows to signal that the filesystem tree won't be used anymore. - // For Context implementations using a temporary directory, it is recommended to - // delete the temporary directory in Close(). - Close() error - // Stat returns an entry corresponding to path if any. - // It is recommended to return an error if path was not found. - // If path is a symlink it also returns the path to the target file. - Stat(path string) (string, FileInfo, error) - // Open opens path from the context and returns a readable stream of it. - Open(path string) (io.ReadCloser, error) - // Walk walks the tree of the context with the function passed to it. - Walk(root string, walkFn WalkFunc) error -} - -// WalkFunc is the type of the function called for each file or directory visited by Context.Walk(). -type WalkFunc func(path string, fi FileInfo, err error) error - -// ModifiableContext represents a modifiable Context. -// TODO: remove this interface once we can get rid of Remove() -type ModifiableContext interface { - Context - // Remove deletes the entry specified by `path`. - // It is usual for directory entries to delete all its subentries. - Remove(path string) error -} - -// FileInfo extends os.FileInfo to allow retrieving an absolute path to the file. -// TODO: remove this interface once pkg/archive exposes a walk function that Context can use. -type FileInfo interface { - os.FileInfo - Path() string -} - -// PathFileInfo is a convenience struct that implements the FileInfo interface. -type PathFileInfo struct { - os.FileInfo - // FilePath holds the absolute path to the file. - FilePath string - // Name holds the basename for the file. - FileName string -} - -// Path returns the absolute path to the file. -func (fi PathFileInfo) Path() string { - return fi.FilePath -} - -// Name returns the basename of the file. -func (fi PathFileInfo) Name() string { - if fi.FileName != "" { - return fi.FileName - } - return fi.FileInfo.Name() -} - -// Hashed defines an extra method intended for implementations of os.FileInfo. -type Hashed interface { - // Hash returns the hash of a file. - Hash() string - SetHash(string) -} - -// HashedFileInfo is a convenient struct that augments FileInfo with a field. -type HashedFileInfo struct { - FileInfo - // FileHash represents the hash of a file. - FileHash string -} - -// Hash returns the hash of a file. -func (fi HashedFileInfo) Hash() string { - return fi.FileHash -} - -// SetHash sets the hash of a file. -func (fi *HashedFileInfo) SetHash(h string) { - fi.FileHash = h -} - -// Backend abstracts calls to a Docker Daemon. -type Backend interface { - // TODO: use digest reference instead of name - - // GetImageOnBuild looks up a Docker image referenced by `name`. - GetImageOnBuild(name string) (Image, error) - // TagImage tags an image with newTag - TagImageWithReference(image.ID, reference.Named) error - // PullOnBuild tells Docker to pull image referenced by `name`. - PullOnBuild(ctx context.Context, name string, authConfigs map[string]types.AuthConfig, output io.Writer) (Image, error) - // ContainerAttachRaw attaches to container. - ContainerAttachRaw(cID string, stdin io.ReadCloser, stdout, stderr io.Writer, stream bool) error - // ContainerCreate creates a new Docker container and returns potential warnings - ContainerCreate(config types.ContainerCreateConfig) (container.ContainerCreateCreatedBody, error) - // ContainerRm removes a container specified by `id`. - ContainerRm(name string, config *types.ContainerRmConfig) error - // Commit creates a new Docker image from an existing Docker container. - Commit(string, *backend.ContainerCommitConfig) (string, error) - // ContainerKill stops the container execution abruptly. - ContainerKill(containerID string, sig uint64) error - // ContainerStart starts a new container - ContainerStart(containerID string, hostConfig *container.HostConfig, checkpoint string, checkpointDir string) error - // ContainerWait stops processing until the given container is stopped. - ContainerWait(containerID string, timeout time.Duration) (int, error) - // ContainerUpdateCmdOnBuild updates container.Path and container.Args - ContainerUpdateCmdOnBuild(containerID string, cmd []string) error - // ContainerCreateWorkdir creates the workdir (currently only used on Windows) - ContainerCreateWorkdir(containerID string) error - - // ContainerCopy copies/extracts a source FileInfo to a destination path inside a container - // specified by a container object. - // TODO: make an Extract method instead of passing `decompress` - // TODO: do not pass a FileInfo, instead refactor the archive package to export a Walk function that can be used - // with Context.Walk - // ContainerCopy(name string, res string) (io.ReadCloser, error) - // TODO: use copyBackend api - CopyOnBuild(containerID string, destPath string, src FileInfo, decompress bool) error - - // HasExperimental checks if the backend supports experimental features - HasExperimental() bool - - // SquashImage squashes the fs layers from the provided image down to the specified `to` image - SquashImage(from string, to string) (string, error) -} - -// Image represents a Docker image used by the builder. -type Image interface { - ImageID() string - RunConfig() *container.Config -} - -// ImageCacheBuilder represents a generator for stateful image cache. -type ImageCacheBuilder interface { - // MakeImageCache creates a stateful image cache. - MakeImageCache(cacheFrom []string) ImageCache -} - -// ImageCache abstracts an image cache. -// (parent image, child runconfig) -> child image -type ImageCache interface { - // GetCachedImageOnBuild returns a reference to a cached image whose parent equals `parent` - // and runconfig equals `cfg`. A cache miss is expected to return an empty ID and a nil error. - GetCache(parentID string, cfg *container.Config) (imageID string, err error) -} diff --git a/vendor/github.com/docker/docker/builder/context.go b/vendor/github.com/docker/docker/builder/context.go deleted file mode 100644 index 600f42319..000000000 --- a/vendor/github.com/docker/docker/builder/context.go +++ /dev/null @@ -1,260 +0,0 @@ -package builder - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/fileutils" - "github.com/docker/docker/pkg/gitutils" - "github.com/docker/docker/pkg/httputils" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/pkg/streamformatter" -) - -// ValidateContextDirectory checks if all the contents of the directory -// can be read and returns an error if some files can't be read -// symlinks which point to non-existing files don't trigger an error -func ValidateContextDirectory(srcPath string, excludes []string) error { - contextRoot, err := getContextRoot(srcPath) - if err != nil { - return err - } - return filepath.Walk(contextRoot, func(filePath string, f os.FileInfo, err error) error { - if err != nil { - if os.IsPermission(err) { - return fmt.Errorf("can't stat '%s'", filePath) - } - if os.IsNotExist(err) { - return nil - } - return err - } - - // skip this directory/file if it's not in the path, it won't get added to the context - if relFilePath, err := filepath.Rel(contextRoot, filePath); err != nil { - return err - } else if skip, err := fileutils.Matches(relFilePath, excludes); err != nil { - return err - } else if skip { - if f.IsDir() { - return filepath.SkipDir - } - return nil - } - - // skip checking if symlinks point to non-existing files, such symlinks can be useful - // also skip named pipes, because they hanging on open - if f.Mode()&(os.ModeSymlink|os.ModeNamedPipe) != 0 { - return nil - } - - if !f.IsDir() { - currentFile, err := os.Open(filePath) - if err != nil && os.IsPermission(err) { - return fmt.Errorf("no permission to read from '%s'", filePath) - } - currentFile.Close() - } - return nil - }) -} - -// GetContextFromReader will read the contents of the given reader as either a -// Dockerfile or tar archive. Returns a tar archive used as a context and a -// path to the Dockerfile inside the tar. -func GetContextFromReader(r io.ReadCloser, dockerfileName string) (out io.ReadCloser, relDockerfile string, err error) { - buf := bufio.NewReader(r) - - magic, err := buf.Peek(archive.HeaderSize) - if err != nil && err != io.EOF { - return nil, "", fmt.Errorf("failed to peek context header from STDIN: %v", err) - } - - if archive.IsArchive(magic) { - return ioutils.NewReadCloserWrapper(buf, func() error { return r.Close() }), dockerfileName, nil - } - - // Input should be read as a Dockerfile. - tmpDir, err := ioutil.TempDir("", "docker-build-context-") - if err != nil { - return nil, "", fmt.Errorf("unbale to create temporary context directory: %v", err) - } - - f, err := os.Create(filepath.Join(tmpDir, DefaultDockerfileName)) - if err != nil { - return nil, "", err - } - _, err = io.Copy(f, buf) - if err != nil { - f.Close() - return nil, "", err - } - - if err := f.Close(); err != nil { - return nil, "", err - } - if err := r.Close(); err != nil { - return nil, "", err - } - - tar, err := archive.Tar(tmpDir, archive.Uncompressed) - if err != nil { - return nil, "", err - } - - return ioutils.NewReadCloserWrapper(tar, func() error { - err := tar.Close() - os.RemoveAll(tmpDir) - return err - }), DefaultDockerfileName, nil - -} - -// GetContextFromGitURL uses a Git URL as context for a `docker build`. The -// git repo is cloned into a temporary directory used as the context directory. -// Returns the absolute path to the temporary context directory, the relative -// path of the dockerfile in that context directory, and a non-nil error on -// success. -func GetContextFromGitURL(gitURL, dockerfileName string) (absContextDir, relDockerfile string, err error) { - if _, err := exec.LookPath("git"); err != nil { - return "", "", fmt.Errorf("unable to find 'git': %v", err) - } - if absContextDir, err = gitutils.Clone(gitURL); err != nil { - return "", "", fmt.Errorf("unable to 'git clone' to temporary context directory: %v", err) - } - - return getDockerfileRelPath(absContextDir, dockerfileName) -} - -// GetContextFromURL uses a remote URL as context for a `docker build`. The -// remote resource is downloaded as either a Dockerfile or a tar archive. -// Returns the tar archive used for the context and a path of the -// dockerfile inside the tar. -func GetContextFromURL(out io.Writer, remoteURL, dockerfileName string) (io.ReadCloser, string, error) { - response, err := httputils.Download(remoteURL) - if err != nil { - return nil, "", fmt.Errorf("unable to download remote context %s: %v", remoteURL, err) - } - progressOutput := streamformatter.NewStreamFormatter().NewProgressOutput(out, true) - - // Pass the response body through a progress reader. - progReader := progress.NewProgressReader(response.Body, progressOutput, response.ContentLength, "", fmt.Sprintf("Downloading build context from remote url: %s", remoteURL)) - - return GetContextFromReader(ioutils.NewReadCloserWrapper(progReader, func() error { return response.Body.Close() }), dockerfileName) -} - -// GetContextFromLocalDir uses the given local directory as context for a -// `docker build`. Returns the absolute path to the local context directory, -// the relative path of the dockerfile in that context directory, and a non-nil -// error on success. -func GetContextFromLocalDir(localDir, dockerfileName string) (absContextDir, relDockerfile string, err error) { - // When using a local context directory, when the Dockerfile is specified - // with the `-f/--file` option then it is considered relative to the - // current directory and not the context directory. - if dockerfileName != "" { - if dockerfileName, err = filepath.Abs(dockerfileName); err != nil { - return "", "", fmt.Errorf("unable to get absolute path to Dockerfile: %v", err) - } - } - - return getDockerfileRelPath(localDir, dockerfileName) -} - -// getDockerfileRelPath uses the given context directory for a `docker build` -// and returns the absolute path to the context directory, the relative path of -// the dockerfile in that context directory, and a non-nil error on success. -func getDockerfileRelPath(givenContextDir, givenDockerfile string) (absContextDir, relDockerfile string, err error) { - if absContextDir, err = filepath.Abs(givenContextDir); err != nil { - return "", "", fmt.Errorf("unable to get absolute context directory of given context directory %q: %v", givenContextDir, err) - } - - // The context dir might be a symbolic link, so follow it to the actual - // target directory. - // - // FIXME. We use isUNC (always false on non-Windows platforms) to workaround - // an issue in golang. On Windows, EvalSymLinks does not work on UNC file - // paths (those starting with \\). This hack means that when using links - // on UNC paths, they will not be followed. - if !isUNC(absContextDir) { - absContextDir, err = filepath.EvalSymlinks(absContextDir) - if err != nil { - return "", "", fmt.Errorf("unable to evaluate symlinks in context path: %v", err) - } - } - - stat, err := os.Lstat(absContextDir) - if err != nil { - return "", "", fmt.Errorf("unable to stat context directory %q: %v", absContextDir, err) - } - - if !stat.IsDir() { - return "", "", fmt.Errorf("context must be a directory: %s", absContextDir) - } - - absDockerfile := givenDockerfile - if absDockerfile == "" { - // No -f/--file was specified so use the default relative to the - // context directory. - absDockerfile = filepath.Join(absContextDir, DefaultDockerfileName) - - // Just to be nice ;-) look for 'dockerfile' too but only - // use it if we found it, otherwise ignore this check - if _, err = os.Lstat(absDockerfile); os.IsNotExist(err) { - altPath := filepath.Join(absContextDir, strings.ToLower(DefaultDockerfileName)) - if _, err = os.Lstat(altPath); err == nil { - absDockerfile = altPath - } - } - } - - // If not already an absolute path, the Dockerfile path should be joined to - // the base directory. - if !filepath.IsAbs(absDockerfile) { - absDockerfile = filepath.Join(absContextDir, absDockerfile) - } - - // Evaluate symlinks in the path to the Dockerfile too. - // - // FIXME. We use isUNC (always false on non-Windows platforms) to workaround - // an issue in golang. On Windows, EvalSymLinks does not work on UNC file - // paths (those starting with \\). This hack means that when using links - // on UNC paths, they will not be followed. - if !isUNC(absDockerfile) { - absDockerfile, err = filepath.EvalSymlinks(absDockerfile) - if err != nil { - return "", "", fmt.Errorf("unable to evaluate symlinks in Dockerfile path: %v", err) - } - } - - if _, err := os.Lstat(absDockerfile); err != nil { - if os.IsNotExist(err) { - return "", "", fmt.Errorf("Cannot locate Dockerfile: %q", absDockerfile) - } - return "", "", fmt.Errorf("unable to stat Dockerfile: %v", err) - } - - if relDockerfile, err = filepath.Rel(absContextDir, absDockerfile); err != nil { - return "", "", fmt.Errorf("unable to get relative Dockerfile path: %v", err) - } - - if strings.HasPrefix(relDockerfile, ".."+string(filepath.Separator)) { - return "", "", fmt.Errorf("The Dockerfile (%s) must be within the build context (%s)", givenDockerfile, givenContextDir) - } - - return absContextDir, relDockerfile, nil -} - -// isUNC returns true if the path is UNC (one starting \\). It always returns -// false on Linux. -func isUNC(path string) bool { - return runtime.GOOS == "windows" && strings.HasPrefix(path, `\\`) -} diff --git a/vendor/github.com/docker/docker/builder/context_test.go b/vendor/github.com/docker/docker/builder/context_test.go deleted file mode 100644 index 27d29d79f..000000000 --- a/vendor/github.com/docker/docker/builder/context_test.go +++ /dev/null @@ -1,307 +0,0 @@ -package builder - -import ( - "archive/tar" - "bytes" - "io" - "io/ioutil" - "path/filepath" - "runtime" - "strings" - "testing" - - "github.com/docker/docker/pkg/archive" -) - -var prepareEmpty = func(t *testing.T) (string, func()) { - return "", func() {} -} - -var prepareNoFiles = func(t *testing.T) (string, func()) { - return createTestTempDir(t, "", "builder-context-test") -} - -var prepareOneFile = func(t *testing.T) (string, func()) { - contextDir, cleanup := createTestTempDir(t, "", "builder-context-test") - createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777) - return contextDir, cleanup -} - -func testValidateContextDirectory(t *testing.T, prepare func(t *testing.T) (string, func()), excludes []string) { - contextDir, cleanup := prepare(t) - defer cleanup() - - err := ValidateContextDirectory(contextDir, excludes) - - if err != nil { - t.Fatalf("Error should be nil, got: %s", err) - } -} - -func TestGetContextFromLocalDirNoDockerfile(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-context-test") - defer cleanup() - - absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, "") - - if err == nil { - t.Fatalf("Error should not be nil") - } - - if absContextDir != "" { - t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir) - } - - if relDockerfile != "" { - t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile) - } -} - -func TestGetContextFromLocalDirNotExistingDir(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-context-test") - defer cleanup() - - fakePath := filepath.Join(contextDir, "fake") - - absContextDir, relDockerfile, err := GetContextFromLocalDir(fakePath, "") - - if err == nil { - t.Fatalf("Error should not be nil") - } - - if absContextDir != "" { - t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir) - } - - if relDockerfile != "" { - t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile) - } -} - -func TestGetContextFromLocalDirNotExistingDockerfile(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-context-test") - defer cleanup() - - fakePath := filepath.Join(contextDir, "fake") - - absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, fakePath) - - if err == nil { - t.Fatalf("Error should not be nil") - } - - if absContextDir != "" { - t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir) - } - - if relDockerfile != "" { - t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile) - } -} - -func TestGetContextFromLocalDirWithNoDirectory(t *testing.T) { - contextDir, dirCleanup := createTestTempDir(t, "", "builder-context-test") - defer dirCleanup() - - createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777) - - chdirCleanup := chdir(t, contextDir) - defer chdirCleanup() - - absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, "") - - if err != nil { - t.Fatalf("Error when getting context from local dir: %s", err) - } - - if absContextDir != contextDir { - t.Fatalf("Absolute directory path should be equal to %s, got: %s", contextDir, absContextDir) - } - - if relDockerfile != DefaultDockerfileName { - t.Fatalf("Relative path to dockerfile should be equal to %s, got: %s", DefaultDockerfileName, relDockerfile) - } -} - -func TestGetContextFromLocalDirWithDockerfile(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-context-test") - defer cleanup() - - createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777) - - absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, "") - - if err != nil { - t.Fatalf("Error when getting context from local dir: %s", err) - } - - if absContextDir != contextDir { - t.Fatalf("Absolute directory path should be equal to %s, got: %s", contextDir, absContextDir) - } - - if relDockerfile != DefaultDockerfileName { - t.Fatalf("Relative path to dockerfile should be equal to %s, got: %s", DefaultDockerfileName, relDockerfile) - } -} - -func TestGetContextFromLocalDirLocalFile(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-context-test") - defer cleanup() - - createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777) - testFilename := createTestTempFile(t, contextDir, "tmpTest", "test", 0777) - - absContextDir, relDockerfile, err := GetContextFromLocalDir(testFilename, "") - - if err == nil { - t.Fatalf("Error should not be nil") - } - - if absContextDir != "" { - t.Fatalf("Absolute directory path should be empty, got: %s", absContextDir) - } - - if relDockerfile != "" { - t.Fatalf("Relative path to Dockerfile should be empty, got: %s", relDockerfile) - } -} - -func TestGetContextFromLocalDirWithCustomDockerfile(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-context-test") - defer cleanup() - - chdirCleanup := chdir(t, contextDir) - defer chdirCleanup() - - createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777) - - absContextDir, relDockerfile, err := GetContextFromLocalDir(contextDir, DefaultDockerfileName) - - if err != nil { - t.Fatalf("Error when getting context from local dir: %s", err) - } - - if absContextDir != contextDir { - t.Fatalf("Absolute directory path should be equal to %s, got: %s", contextDir, absContextDir) - } - - if relDockerfile != DefaultDockerfileName { - t.Fatalf("Relative path to dockerfile should be equal to %s, got: %s", DefaultDockerfileName, relDockerfile) - } - -} - -func TestGetContextFromReaderString(t *testing.T) { - tarArchive, relDockerfile, err := GetContextFromReader(ioutil.NopCloser(strings.NewReader(dockerfileContents)), "") - - if err != nil { - t.Fatalf("Error when executing GetContextFromReader: %s", err) - } - - tarReader := tar.NewReader(tarArchive) - - _, err = tarReader.Next() - - if err != nil { - t.Fatalf("Error when reading tar archive: %s", err) - } - - buff := new(bytes.Buffer) - buff.ReadFrom(tarReader) - contents := buff.String() - - _, err = tarReader.Next() - - if err != io.EOF { - t.Fatalf("Tar stream too long: %s", err) - } - - if err = tarArchive.Close(); err != nil { - t.Fatalf("Error when closing tar stream: %s", err) - } - - if dockerfileContents != contents { - t.Fatalf("Uncompressed tar archive does not equal: %s, got: %s", dockerfileContents, contents) - } - - if relDockerfile != DefaultDockerfileName { - t.Fatalf("Relative path not equals %s, got: %s", DefaultDockerfileName, relDockerfile) - } -} - -func TestGetContextFromReaderTar(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-context-test") - defer cleanup() - - createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777) - - tarStream, err := archive.Tar(contextDir, archive.Uncompressed) - - if err != nil { - t.Fatalf("Error when creating tar: %s", err) - } - - tarArchive, relDockerfile, err := GetContextFromReader(tarStream, DefaultDockerfileName) - - if err != nil { - t.Fatalf("Error when executing GetContextFromReader: %s", err) - } - - tarReader := tar.NewReader(tarArchive) - - header, err := tarReader.Next() - - if err != nil { - t.Fatalf("Error when reading tar archive: %s", err) - } - - if header.Name != DefaultDockerfileName { - t.Fatalf("Dockerfile name should be: %s, got: %s", DefaultDockerfileName, header.Name) - } - - buff := new(bytes.Buffer) - buff.ReadFrom(tarReader) - contents := buff.String() - - _, err = tarReader.Next() - - if err != io.EOF { - t.Fatalf("Tar stream too long: %s", err) - } - - if err = tarArchive.Close(); err != nil { - t.Fatalf("Error when closing tar stream: %s", err) - } - - if dockerfileContents != contents { - t.Fatalf("Uncompressed tar archive does not equal: %s, got: %s", dockerfileContents, contents) - } - - if relDockerfile != DefaultDockerfileName { - t.Fatalf("Relative path not equals %s, got: %s", DefaultDockerfileName, relDockerfile) - } -} - -func TestValidateContextDirectoryEmptyContext(t *testing.T) { - // This isn't a valid test on Windows. See https://play.golang.org/p/RR6z6jxR81. - // The test will ultimately end up calling filepath.Abs(""). On Windows, - // golang will error. On Linux, golang will return /. Due to there being - // drive letters on Windows, this is probably the correct behaviour for - // Windows. - if runtime.GOOS == "windows" { - t.Skip("Invalid test on Windows") - } - testValidateContextDirectory(t, prepareEmpty, []string{}) -} - -func TestValidateContextDirectoryContextWithNoFiles(t *testing.T) { - testValidateContextDirectory(t, prepareNoFiles, []string{}) -} - -func TestValidateContextDirectoryWithOneFile(t *testing.T) { - testValidateContextDirectory(t, prepareOneFile, []string{}) -} - -func TestValidateContextDirectoryWithOneFileExcludes(t *testing.T) { - testValidateContextDirectory(t, prepareOneFile, []string{DefaultDockerfileName}) -} diff --git a/vendor/github.com/docker/docker/builder/context_unix.go b/vendor/github.com/docker/docker/builder/context_unix.go deleted file mode 100644 index d1f72e057..000000000 --- a/vendor/github.com/docker/docker/builder/context_unix.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build !windows - -package builder - -import ( - "path/filepath" -) - -func getContextRoot(srcPath string) (string, error) { - return filepath.Join(srcPath, "."), nil -} diff --git a/vendor/github.com/docker/docker/builder/context_windows.go b/vendor/github.com/docker/docker/builder/context_windows.go deleted file mode 100644 index b8ba2ba23..000000000 --- a/vendor/github.com/docker/docker/builder/context_windows.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build windows - -package builder - -import ( - "path/filepath" - - "github.com/docker/docker/pkg/longpath" -) - -func getContextRoot(srcPath string) (string, error) { - cr, err := filepath.Abs(srcPath) - if err != nil { - return "", err - } - return longpath.AddPrefix(cr), nil -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/bflag.go b/vendor/github.com/docker/docker/builder/dockerfile/bflag.go deleted file mode 100644 index 1e0369307..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/bflag.go +++ /dev/null @@ -1,176 +0,0 @@ -package dockerfile - -import ( - "fmt" - "strings" -) - -// FlagType is the type of the build flag -type FlagType int - -const ( - boolType FlagType = iota - stringType -) - -// BFlags contains all flags information for the builder -type BFlags struct { - Args []string // actual flags/args from cmd line - flags map[string]*Flag - used map[string]*Flag - Err error -} - -// Flag contains all information for a flag -type Flag struct { - bf *BFlags - name string - flagType FlagType - Value string -} - -// NewBFlags returns the new BFlags struct -func NewBFlags() *BFlags { - return &BFlags{ - flags: make(map[string]*Flag), - used: make(map[string]*Flag), - } -} - -// AddBool adds a bool flag to BFlags -// Note, any error will be generated when Parse() is called (see Parse). -func (bf *BFlags) AddBool(name string, def bool) *Flag { - flag := bf.addFlag(name, boolType) - if flag == nil { - return nil - } - if def { - flag.Value = "true" - } else { - flag.Value = "false" - } - return flag -} - -// AddString adds a string flag to BFlags -// Note, any error will be generated when Parse() is called (see Parse). -func (bf *BFlags) AddString(name string, def string) *Flag { - flag := bf.addFlag(name, stringType) - if flag == nil { - return nil - } - flag.Value = def - return flag -} - -// addFlag is a generic func used by the other AddXXX() func -// to add a new flag to the BFlags struct. -// Note, any error will be generated when Parse() is called (see Parse). -func (bf *BFlags) addFlag(name string, flagType FlagType) *Flag { - if _, ok := bf.flags[name]; ok { - bf.Err = fmt.Errorf("Duplicate flag defined: %s", name) - return nil - } - - newFlag := &Flag{ - bf: bf, - name: name, - flagType: flagType, - } - bf.flags[name] = newFlag - - return newFlag -} - -// IsUsed checks if the flag is used -func (fl *Flag) IsUsed() bool { - if _, ok := fl.bf.used[fl.name]; ok { - return true - } - return false -} - -// IsTrue checks if a bool flag is true -func (fl *Flag) IsTrue() bool { - if fl.flagType != boolType { - // Should never get here - panic(fmt.Errorf("Trying to use IsTrue on a non-boolean: %s", fl.name)) - } - return fl.Value == "true" -} - -// Parse parses and checks if the BFlags is valid. -// Any error noticed during the AddXXX() funcs will be generated/returned -// here. We do this because an error during AddXXX() is more like a -// compile time error so it doesn't matter too much when we stop our -// processing as long as we do stop it, so this allows the code -// around AddXXX() to be just: -// defFlag := AddString("description", "") -// w/o needing to add an if-statement around each one. -func (bf *BFlags) Parse() error { - // If there was an error while defining the possible flags - // go ahead and bubble it back up here since we didn't do it - // earlier in the processing - if bf.Err != nil { - return fmt.Errorf("Error setting up flags: %s", bf.Err) - } - - for _, arg := range bf.Args { - if !strings.HasPrefix(arg, "--") { - return fmt.Errorf("Arg should start with -- : %s", arg) - } - - if arg == "--" { - return nil - } - - arg = arg[2:] - value := "" - - index := strings.Index(arg, "=") - if index >= 0 { - value = arg[index+1:] - arg = arg[:index] - } - - flag, ok := bf.flags[arg] - if !ok { - return fmt.Errorf("Unknown flag: %s", arg) - } - - if _, ok = bf.used[arg]; ok { - return fmt.Errorf("Duplicate flag specified: %s", arg) - } - - bf.used[arg] = flag - - switch flag.flagType { - case boolType: - // value == "" is only ok if no "=" was specified - if index >= 0 && value == "" { - return fmt.Errorf("Missing a value on flag: %s", arg) - } - - lower := strings.ToLower(value) - if lower == "" { - flag.Value = "true" - } else if lower == "true" || lower == "false" { - flag.Value = lower - } else { - return fmt.Errorf("Expecting boolean value for flag %s, not: %s", arg, value) - } - - case stringType: - if index < 0 { - return fmt.Errorf("Missing a value on flag: %s", arg) - } - flag.Value = value - - default: - panic(fmt.Errorf("No idea what kind of flag we have! Should never get here!")) - } - - } - - return nil -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/bflag_test.go b/vendor/github.com/docker/docker/builder/dockerfile/bflag_test.go deleted file mode 100644 index 65cfceadd..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/bflag_test.go +++ /dev/null @@ -1,187 +0,0 @@ -package dockerfile - -import ( - "testing" -) - -func TestBuilderFlags(t *testing.T) { - var expected string - var err error - - // --- - - bf := NewBFlags() - bf.Args = []string{} - if err := bf.Parse(); err != nil { - t.Fatalf("Test1 of %q was supposed to work: %s", bf.Args, err) - } - - // --- - - bf = NewBFlags() - bf.Args = []string{"--"} - if err := bf.Parse(); err != nil { - t.Fatalf("Test2 of %q was supposed to work: %s", bf.Args, err) - } - - // --- - - bf = NewBFlags() - flStr1 := bf.AddString("str1", "") - flBool1 := bf.AddBool("bool1", false) - bf.Args = []string{} - if err = bf.Parse(); err != nil { - t.Fatalf("Test3 of %q was supposed to work: %s", bf.Args, err) - } - - if flStr1.IsUsed() == true { - t.Fatalf("Test3 - str1 was not used!") - } - if flBool1.IsUsed() == true { - t.Fatalf("Test3 - bool1 was not used!") - } - - // --- - - bf = NewBFlags() - flStr1 = bf.AddString("str1", "HI") - flBool1 = bf.AddBool("bool1", false) - bf.Args = []string{} - - if err = bf.Parse(); err != nil { - t.Fatalf("Test4 of %q was supposed to work: %s", bf.Args, err) - } - - if flStr1.Value != "HI" { - t.Fatalf("Str1 was supposed to default to: HI") - } - if flBool1.IsTrue() { - t.Fatalf("Bool1 was supposed to default to: false") - } - if flStr1.IsUsed() == true { - t.Fatalf("Str1 was not used!") - } - if flBool1.IsUsed() == true { - t.Fatalf("Bool1 was not used!") - } - - // --- - - bf = NewBFlags() - flStr1 = bf.AddString("str1", "HI") - bf.Args = []string{"--str1"} - - if err = bf.Parse(); err == nil { - t.Fatalf("Test %q was supposed to fail", bf.Args) - } - - // --- - - bf = NewBFlags() - flStr1 = bf.AddString("str1", "HI") - bf.Args = []string{"--str1="} - - if err = bf.Parse(); err != nil { - t.Fatalf("Test %q was supposed to work: %s", bf.Args, err) - } - - expected = "" - if flStr1.Value != expected { - t.Fatalf("Str1 (%q) should be: %q", flStr1.Value, expected) - } - - // --- - - bf = NewBFlags() - flStr1 = bf.AddString("str1", "HI") - bf.Args = []string{"--str1=BYE"} - - if err = bf.Parse(); err != nil { - t.Fatalf("Test %q was supposed to work: %s", bf.Args, err) - } - - expected = "BYE" - if flStr1.Value != expected { - t.Fatalf("Str1 (%q) should be: %q", flStr1.Value, expected) - } - - // --- - - bf = NewBFlags() - flBool1 = bf.AddBool("bool1", false) - bf.Args = []string{"--bool1"} - - if err = bf.Parse(); err != nil { - t.Fatalf("Test %q was supposed to work: %s", bf.Args, err) - } - - if !flBool1.IsTrue() { - t.Fatalf("Test-b1 Bool1 was supposed to be true") - } - - // --- - - bf = NewBFlags() - flBool1 = bf.AddBool("bool1", false) - bf.Args = []string{"--bool1=true"} - - if err = bf.Parse(); err != nil { - t.Fatalf("Test %q was supposed to work: %s", bf.Args, err) - } - - if !flBool1.IsTrue() { - t.Fatalf("Test-b2 Bool1 was supposed to be true") - } - - // --- - - bf = NewBFlags() - flBool1 = bf.AddBool("bool1", false) - bf.Args = []string{"--bool1=false"} - - if err = bf.Parse(); err != nil { - t.Fatalf("Test %q was supposed to work: %s", bf.Args, err) - } - - if flBool1.IsTrue() { - t.Fatalf("Test-b3 Bool1 was supposed to be false") - } - - // --- - - bf = NewBFlags() - flBool1 = bf.AddBool("bool1", false) - bf.Args = []string{"--bool1=false1"} - - if err = bf.Parse(); err == nil { - t.Fatalf("Test %q was supposed to fail", bf.Args) - } - - // --- - - bf = NewBFlags() - flBool1 = bf.AddBool("bool1", false) - bf.Args = []string{"--bool2"} - - if err = bf.Parse(); err == nil { - t.Fatalf("Test %q was supposed to fail", bf.Args) - } - - // --- - - bf = NewBFlags() - flStr1 = bf.AddString("str1", "HI") - flBool1 = bf.AddBool("bool1", false) - bf.Args = []string{"--bool1", "--str1=BYE"} - - if err = bf.Parse(); err != nil { - t.Fatalf("Test %q was supposed to work: %s", bf.Args, err) - } - - if flStr1.Value != "BYE" { - t.Fatalf("Teset %s, str1 should be BYE", bf.Args) - } - if !flBool1.IsTrue() { - t.Fatalf("Teset %s, bool1 should be true", bf.Args) - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/builder.go b/vendor/github.com/docker/docker/builder/dockerfile/builder.go deleted file mode 100644 index da43513ff..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/builder.go +++ /dev/null @@ -1,370 +0,0 @@ -package dockerfile - -import ( - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "strings" - - "github.com/Sirupsen/logrus" - apierrors "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/builder" - "github.com/docker/docker/builder/dockerfile/parser" - "github.com/docker/docker/image" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/reference" - perrors "github.com/pkg/errors" - "golang.org/x/net/context" -) - -var validCommitCommands = map[string]bool{ - "cmd": true, - "entrypoint": true, - "healthcheck": true, - "env": true, - "expose": true, - "label": true, - "onbuild": true, - "user": true, - "volume": true, - "workdir": true, -} - -// BuiltinAllowedBuildArgs is list of built-in allowed build args -var BuiltinAllowedBuildArgs = map[string]bool{ - "HTTP_PROXY": true, - "http_proxy": true, - "HTTPS_PROXY": true, - "https_proxy": true, - "FTP_PROXY": true, - "ftp_proxy": true, - "NO_PROXY": true, - "no_proxy": true, -} - -// Builder is a Dockerfile builder -// It implements the builder.Backend interface. -type Builder struct { - options *types.ImageBuildOptions - - Stdout io.Writer - Stderr io.Writer - Output io.Writer - - docker builder.Backend - context builder.Context - clientCtx context.Context - cancel context.CancelFunc - - dockerfile *parser.Node - runConfig *container.Config // runconfig for cmd, run, entrypoint etc. - flags *BFlags - tmpContainers map[string]struct{} - image string // imageID - noBaseImage bool - maintainer string - cmdSet bool - disableCommit bool - cacheBusted bool - allowedBuildArgs map[string]bool // list of build-time args that are allowed for expansion/substitution and passing to commands in 'run'. - directive parser.Directive - - // TODO: remove once docker.Commit can receive a tag - id string - - imageCache builder.ImageCache - from builder.Image -} - -// BuildManager implements builder.Backend and is shared across all Builder objects. -type BuildManager struct { - backend builder.Backend -} - -// NewBuildManager creates a BuildManager. -func NewBuildManager(b builder.Backend) (bm *BuildManager) { - return &BuildManager{backend: b} -} - -// BuildFromContext builds a new image from a given context. -func (bm *BuildManager) BuildFromContext(ctx context.Context, src io.ReadCloser, remote string, buildOptions *types.ImageBuildOptions, pg backend.ProgressWriter) (string, error) { - if buildOptions.Squash && !bm.backend.HasExperimental() { - return "", apierrors.NewBadRequestError(errors.New("squash is only supported with experimental mode")) - } - buildContext, dockerfileName, err := builder.DetectContextFromRemoteURL(src, remote, pg.ProgressReaderFunc) - if err != nil { - return "", err - } - defer func() { - if err := buildContext.Close(); err != nil { - logrus.Debugf("[BUILDER] failed to remove temporary context: %v", err) - } - }() - - if len(dockerfileName) > 0 { - buildOptions.Dockerfile = dockerfileName - } - b, err := NewBuilder(ctx, buildOptions, bm.backend, builder.DockerIgnoreContext{ModifiableContext: buildContext}, nil) - if err != nil { - return "", err - } - return b.build(pg.StdoutFormatter, pg.StderrFormatter, pg.Output) -} - -// NewBuilder creates a new Dockerfile builder from an optional dockerfile and a Config. -// If dockerfile is nil, the Dockerfile specified by Config.DockerfileName, -// will be read from the Context passed to Build(). -func NewBuilder(clientCtx context.Context, config *types.ImageBuildOptions, backend builder.Backend, buildContext builder.Context, dockerfile io.ReadCloser) (b *Builder, err error) { - if config == nil { - config = new(types.ImageBuildOptions) - } - if config.BuildArgs == nil { - config.BuildArgs = make(map[string]*string) - } - ctx, cancel := context.WithCancel(clientCtx) - b = &Builder{ - clientCtx: ctx, - cancel: cancel, - options: config, - Stdout: os.Stdout, - Stderr: os.Stderr, - docker: backend, - context: buildContext, - runConfig: new(container.Config), - tmpContainers: map[string]struct{}{}, - id: stringid.GenerateNonCryptoID(), - allowedBuildArgs: make(map[string]bool), - directive: parser.Directive{ - EscapeSeen: false, - LookingForDirectives: true, - }, - } - if icb, ok := backend.(builder.ImageCacheBuilder); ok { - b.imageCache = icb.MakeImageCache(config.CacheFrom) - } - - parser.SetEscapeToken(parser.DefaultEscapeToken, &b.directive) // Assume the default token for escape - - if dockerfile != nil { - b.dockerfile, err = parser.Parse(dockerfile, &b.directive) - if err != nil { - return nil, err - } - } - - return b, nil -} - -// sanitizeRepoAndTags parses the raw "t" parameter received from the client -// to a slice of repoAndTag. -// It also validates each repoName and tag. -func sanitizeRepoAndTags(names []string) ([]reference.Named, error) { - var ( - repoAndTags []reference.Named - // This map is used for deduplicating the "-t" parameter. - uniqNames = make(map[string]struct{}) - ) - for _, repo := range names { - if repo == "" { - continue - } - - ref, err := reference.ParseNamed(repo) - if err != nil { - return nil, err - } - - ref = reference.WithDefaultTag(ref) - - if _, isCanonical := ref.(reference.Canonical); isCanonical { - return nil, errors.New("build tag cannot contain a digest") - } - - if _, isTagged := ref.(reference.NamedTagged); !isTagged { - ref, err = reference.WithTag(ref, reference.DefaultTag) - if err != nil { - return nil, err - } - } - - nameWithTag := ref.String() - - if _, exists := uniqNames[nameWithTag]; !exists { - uniqNames[nameWithTag] = struct{}{} - repoAndTags = append(repoAndTags, ref) - } - } - return repoAndTags, nil -} - -// build runs the Dockerfile builder from a context and a docker object that allows to make calls -// to Docker. -// -// This will (barring errors): -// -// * read the dockerfile from context -// * parse the dockerfile if not already parsed -// * walk the AST and execute it by dispatching to handlers. If Remove -// or ForceRemove is set, additional cleanup around containers happens after -// processing. -// * Tag image, if applicable. -// * Print a happy message and return the image ID. -// -func (b *Builder) build(stdout io.Writer, stderr io.Writer, out io.Writer) (string, error) { - b.Stdout = stdout - b.Stderr = stderr - b.Output = out - - // If Dockerfile was not parsed yet, extract it from the Context - if b.dockerfile == nil { - if err := b.readDockerfile(); err != nil { - return "", err - } - } - - repoAndTags, err := sanitizeRepoAndTags(b.options.Tags) - if err != nil { - return "", err - } - - if len(b.options.Labels) > 0 { - line := "LABEL " - for k, v := range b.options.Labels { - line += fmt.Sprintf("%q='%s' ", k, v) - } - _, node, err := parser.ParseLine(line, &b.directive, false) - if err != nil { - return "", err - } - b.dockerfile.Children = append(b.dockerfile.Children, node) - } - - var shortImgID string - total := len(b.dockerfile.Children) - for _, n := range b.dockerfile.Children { - if err := b.checkDispatch(n, false); err != nil { - return "", err - } - } - - for i, n := range b.dockerfile.Children { - select { - case <-b.clientCtx.Done(): - logrus.Debug("Builder: build cancelled!") - fmt.Fprintf(b.Stdout, "Build cancelled") - return "", fmt.Errorf("Build cancelled") - default: - // Not cancelled yet, keep going... - } - - if err := b.dispatch(i, total, n); err != nil { - if b.options.ForceRemove { - b.clearTmp() - } - return "", err - } - - shortImgID = stringid.TruncateID(b.image) - fmt.Fprintf(b.Stdout, " ---> %s\n", shortImgID) - if b.options.Remove { - b.clearTmp() - } - } - - // check if there are any leftover build-args that were passed but not - // consumed during build. Return a warning, if there are any. - leftoverArgs := []string{} - for arg := range b.options.BuildArgs { - if !b.isBuildArgAllowed(arg) { - leftoverArgs = append(leftoverArgs, arg) - } - } - - if len(leftoverArgs) > 0 { - fmt.Fprintf(b.Stderr, "[Warning] One or more build-args %v were not consumed\n", leftoverArgs) - } - - if b.image == "" { - return "", fmt.Errorf("No image was generated. Is your Dockerfile empty?") - } - - if b.options.Squash { - var fromID string - if b.from != nil { - fromID = b.from.ImageID() - } - b.image, err = b.docker.SquashImage(b.image, fromID) - if err != nil { - return "", perrors.Wrap(err, "error squashing image") - } - } - - imageID := image.ID(b.image) - for _, rt := range repoAndTags { - if err := b.docker.TagImageWithReference(imageID, rt); err != nil { - return "", err - } - } - - fmt.Fprintf(b.Stdout, "Successfully built %s\n", shortImgID) - return b.image, nil -} - -// Cancel cancels an ongoing Dockerfile build. -func (b *Builder) Cancel() { - b.cancel() -} - -// BuildFromConfig builds directly from `changes`, treating it as if it were the contents of a Dockerfile -// It will: -// - Call parse.Parse() to get an AST root for the concatenated Dockerfile entries. -// - Do build by calling builder.dispatch() to call all entries' handling routines -// -// BuildFromConfig is used by the /commit endpoint, with the changes -// coming from the query parameter of the same name. -// -// TODO: Remove? -func BuildFromConfig(config *container.Config, changes []string) (*container.Config, error) { - b, err := NewBuilder(context.Background(), nil, nil, nil, nil) - if err != nil { - return nil, err - } - - ast, err := parser.Parse(bytes.NewBufferString(strings.Join(changes, "\n")), &b.directive) - if err != nil { - return nil, err - } - - // ensure that the commands are valid - for _, n := range ast.Children { - if !validCommitCommands[n.Value] { - return nil, fmt.Errorf("%s is not a valid change command", n.Value) - } - } - - b.runConfig = config - b.Stdout = ioutil.Discard - b.Stderr = ioutil.Discard - b.disableCommit = true - - total := len(ast.Children) - for _, n := range ast.Children { - if err := b.checkDispatch(n, false); err != nil { - return nil, err - } - } - - for i, n := range ast.Children { - if err := b.dispatch(i, total, n); err != nil { - return nil, err - } - } - - return b.runConfig, nil -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/builder_unix.go b/vendor/github.com/docker/docker/builder/dockerfile/builder_unix.go deleted file mode 100644 index 76a7ce74f..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/builder_unix.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build !windows - -package dockerfile - -var defaultShell = []string{"/bin/sh", "-c"} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/builder_windows.go b/vendor/github.com/docker/docker/builder/dockerfile/builder_windows.go deleted file mode 100644 index 37e9fbcf4..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/builder_windows.go +++ /dev/null @@ -1,3 +0,0 @@ -package dockerfile - -var defaultShell = []string{"cmd", "/S", "/C"} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/command/command.go b/vendor/github.com/docker/docker/builder/dockerfile/command/command.go deleted file mode 100644 index f23c6874b..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/command/command.go +++ /dev/null @@ -1,46 +0,0 @@ -// Package command contains the set of Dockerfile commands. -package command - -// Define constants for the command strings -const ( - Add = "add" - Arg = "arg" - Cmd = "cmd" - Copy = "copy" - Entrypoint = "entrypoint" - Env = "env" - Expose = "expose" - From = "from" - Healthcheck = "healthcheck" - Label = "label" - Maintainer = "maintainer" - Onbuild = "onbuild" - Run = "run" - Shell = "shell" - StopSignal = "stopsignal" - User = "user" - Volume = "volume" - Workdir = "workdir" -) - -// Commands is list of all Dockerfile commands -var Commands = map[string]struct{}{ - Add: {}, - Arg: {}, - Cmd: {}, - Copy: {}, - Entrypoint: {}, - Env: {}, - Expose: {}, - From: {}, - Healthcheck: {}, - Label: {}, - Maintainer: {}, - Onbuild: {}, - Run: {}, - Shell: {}, - StopSignal: {}, - User: {}, - Volume: {}, - Workdir: {}, -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers.go b/vendor/github.com/docker/docker/builder/dockerfile/dispatchers.go deleted file mode 100644 index 3e78abdd6..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers.go +++ /dev/null @@ -1,821 +0,0 @@ -package dockerfile - -// This file contains the dispatchers for each command. Note that -// `nullDispatch` is not actually a command, but support for commands we parse -// but do nothing with. -// -// See evaluator.go for a higher level discussion of the whole evaluator -// package. - -import ( - "fmt" - "regexp" - "runtime" - "sort" - "strconv" - "strings" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/strslice" - "github.com/docker/docker/builder" - "github.com/docker/docker/pkg/signal" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/docker/go-connections/nat" -) - -// ENV foo bar -// -// Sets the environment variable foo to bar, also makes interpolation -// in the dockerfile available from the next statement on via ${foo}. -// -func env(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) == 0 { - return errAtLeastOneArgument("ENV") - } - - if len(args)%2 != 0 { - // should never get here, but just in case - return errTooManyArguments("ENV") - } - - if err := b.flags.Parse(); err != nil { - return err - } - - // TODO/FIXME/NOT USED - // Just here to show how to use the builder flags stuff within the - // context of a builder command. Will remove once we actually add - // a builder command to something! - /* - flBool1 := b.flags.AddBool("bool1", false) - flStr1 := b.flags.AddString("str1", "HI") - - if err := b.flags.Parse(); err != nil { - return err - } - - fmt.Printf("Bool1:%v\n", flBool1) - fmt.Printf("Str1:%v\n", flStr1) - */ - - commitStr := "ENV" - - for j := 0; j < len(args); j++ { - // name ==> args[j] - // value ==> args[j+1] - - if len(args[j]) == 0 { - return errBlankCommandNames("ENV") - } - newVar := args[j] + "=" + args[j+1] + "" - commitStr += " " + newVar - - gotOne := false - for i, envVar := range b.runConfig.Env { - envParts := strings.SplitN(envVar, "=", 2) - compareFrom := envParts[0] - compareTo := args[j] - if runtime.GOOS == "windows" { - // Case insensitive environment variables on Windows - compareFrom = strings.ToUpper(compareFrom) - compareTo = strings.ToUpper(compareTo) - } - if compareFrom == compareTo { - b.runConfig.Env[i] = newVar - gotOne = true - break - } - } - if !gotOne { - b.runConfig.Env = append(b.runConfig.Env, newVar) - } - j++ - } - - return b.commit("", b.runConfig.Cmd, commitStr) -} - -// MAINTAINER some text -// -// Sets the maintainer metadata. -func maintainer(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) != 1 { - return errExactlyOneArgument("MAINTAINER") - } - - if err := b.flags.Parse(); err != nil { - return err - } - - b.maintainer = args[0] - return b.commit("", b.runConfig.Cmd, fmt.Sprintf("MAINTAINER %s", b.maintainer)) -} - -// LABEL some json data describing the image -// -// Sets the Label variable foo to bar, -// -func label(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) == 0 { - return errAtLeastOneArgument("LABEL") - } - if len(args)%2 != 0 { - // should never get here, but just in case - return errTooManyArguments("LABEL") - } - - if err := b.flags.Parse(); err != nil { - return err - } - - commitStr := "LABEL" - - if b.runConfig.Labels == nil { - b.runConfig.Labels = map[string]string{} - } - - for j := 0; j < len(args); j++ { - // name ==> args[j] - // value ==> args[j+1] - - if len(args[j]) == 0 { - return errBlankCommandNames("LABEL") - } - - newVar := args[j] + "=" + args[j+1] + "" - commitStr += " " + newVar - - b.runConfig.Labels[args[j]] = args[j+1] - j++ - } - return b.commit("", b.runConfig.Cmd, commitStr) -} - -// ADD foo /path -// -// Add the file 'foo' to '/path'. Tarball and Remote URL (git, http) handling -// exist here. If you do not wish to have this automatic handling, use COPY. -// -func add(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) < 2 { - return errAtLeastTwoArguments("ADD") - } - - if err := b.flags.Parse(); err != nil { - return err - } - - return b.runContextCommand(args, true, true, "ADD") -} - -// COPY foo /path -// -// Same as 'ADD' but without the tar and remote url handling. -// -func dispatchCopy(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) < 2 { - return errAtLeastTwoArguments("COPY") - } - - if err := b.flags.Parse(); err != nil { - return err - } - - return b.runContextCommand(args, false, false, "COPY") -} - -// FROM imagename -// -// This sets the image the dockerfile will build on top of. -// -func from(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) != 1 { - return errExactlyOneArgument("FROM") - } - - if err := b.flags.Parse(); err != nil { - return err - } - - name := args[0] - - var ( - image builder.Image - err error - ) - - // Windows cannot support a container with no base image. - if name == api.NoBaseImageSpecifier { - if runtime.GOOS == "windows" { - return fmt.Errorf("Windows does not support FROM scratch") - } - b.image = "" - b.noBaseImage = true - } else { - // TODO: don't use `name`, instead resolve it to a digest - if !b.options.PullParent { - image, err = b.docker.GetImageOnBuild(name) - // TODO: shouldn't we error out if error is different from "not found" ? - } - if image == nil { - image, err = b.docker.PullOnBuild(b.clientCtx, name, b.options.AuthConfigs, b.Output) - if err != nil { - return err - } - } - } - b.from = image - - return b.processImageFrom(image) -} - -// ONBUILD RUN echo yo -// -// ONBUILD triggers run when the image is used in a FROM statement. -// -// ONBUILD handling has a lot of special-case functionality, the heading in -// evaluator.go and comments around dispatch() in the same file explain the -// special cases. search for 'OnBuild' in internals.go for additional special -// cases. -// -func onbuild(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) == 0 { - return errAtLeastOneArgument("ONBUILD") - } - - if err := b.flags.Parse(); err != nil { - return err - } - - triggerInstruction := strings.ToUpper(strings.TrimSpace(args[0])) - switch triggerInstruction { - case "ONBUILD": - return fmt.Errorf("Chaining ONBUILD via `ONBUILD ONBUILD` isn't allowed") - case "MAINTAINER", "FROM": - return fmt.Errorf("%s isn't allowed as an ONBUILD trigger", triggerInstruction) - } - - original = regexp.MustCompile(`(?i)^\s*ONBUILD\s*`).ReplaceAllString(original, "") - - b.runConfig.OnBuild = append(b.runConfig.OnBuild, original) - return b.commit("", b.runConfig.Cmd, fmt.Sprintf("ONBUILD %s", original)) -} - -// WORKDIR /tmp -// -// Set the working directory for future RUN/CMD/etc statements. -// -func workdir(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) != 1 { - return errExactlyOneArgument("WORKDIR") - } - - err := b.flags.Parse() - if err != nil { - return err - } - - // This is from the Dockerfile and will not necessarily be in platform - // specific semantics, hence ensure it is converted. - b.runConfig.WorkingDir, err = normaliseWorkdir(b.runConfig.WorkingDir, args[0]) - if err != nil { - return err - } - - // For performance reasons, we explicitly do a create/mkdir now - // This avoids having an unnecessary expensive mount/unmount calls - // (on Windows in particular) during each container create. - // Prior to 1.13, the mkdir was deferred and not executed at this step. - if b.disableCommit { - // Don't call back into the daemon if we're going through docker commit --change "WORKDIR /foo". - // We've already updated the runConfig and that's enough. - return nil - } - b.runConfig.Image = b.image - - cmd := b.runConfig.Cmd - comment := "WORKDIR " + b.runConfig.WorkingDir - // reset the command for cache detection - b.runConfig.Cmd = strslice.StrSlice(append(getShell(b.runConfig), "#(nop) "+comment)) - defer func(cmd strslice.StrSlice) { b.runConfig.Cmd = cmd }(cmd) - - if hit, err := b.probeCache(); err != nil { - return err - } else if hit { - return nil - } - - container, err := b.docker.ContainerCreate(types.ContainerCreateConfig{Config: b.runConfig}) - if err != nil { - return err - } - b.tmpContainers[container.ID] = struct{}{} - if err := b.docker.ContainerCreateWorkdir(container.ID); err != nil { - return err - } - - return b.commit(container.ID, cmd, comment) -} - -// RUN some command yo -// -// run a command and commit the image. Args are automatically prepended with -// the current SHELL which defaults to 'sh -c' under linux or 'cmd /S /C' under -// Windows, in the event there is only one argument The difference in processing: -// -// RUN echo hi # sh -c echo hi (Linux) -// RUN echo hi # cmd /S /C echo hi (Windows) -// RUN [ "echo", "hi" ] # echo hi -// -func run(b *Builder, args []string, attributes map[string]bool, original string) error { - if b.image == "" && !b.noBaseImage { - return fmt.Errorf("Please provide a source image with `from` prior to run") - } - - if err := b.flags.Parse(); err != nil { - return err - } - - args = handleJSONArgs(args, attributes) - - if !attributes["json"] { - args = append(getShell(b.runConfig), args...) - } - config := &container.Config{ - Cmd: strslice.StrSlice(args), - Image: b.image, - } - - // stash the cmd - cmd := b.runConfig.Cmd - if len(b.runConfig.Entrypoint) == 0 && len(b.runConfig.Cmd) == 0 { - b.runConfig.Cmd = config.Cmd - } - - // stash the config environment - env := b.runConfig.Env - - defer func(cmd strslice.StrSlice) { b.runConfig.Cmd = cmd }(cmd) - defer func(env []string) { b.runConfig.Env = env }(env) - - // derive the net build-time environment for this run. We let config - // environment override the build time environment. - // This means that we take the b.buildArgs list of env vars and remove - // any of those variables that are defined as part of the container. In other - // words, anything in b.Config.Env. What's left is the list of build-time env - // vars that we need to add to each RUN command - note the list could be empty. - // - // We don't persist the build time environment with container's config - // environment, but just sort and prepend it to the command string at time - // of commit. - // This helps with tracing back the image's actual environment at the time - // of RUN, without leaking it to the final image. It also aids cache - // lookup for same image built with same build time environment. - cmdBuildEnv := []string{} - configEnv := runconfigopts.ConvertKVStringsToMap(b.runConfig.Env) - for key, val := range b.options.BuildArgs { - if !b.isBuildArgAllowed(key) { - // skip build-args that are not in allowed list, meaning they have - // not been defined by an "ARG" Dockerfile command yet. - // This is an error condition but only if there is no "ARG" in the entire - // Dockerfile, so we'll generate any necessary errors after we parsed - // the entire file (see 'leftoverArgs' processing in evaluator.go ) - continue - } - if _, ok := configEnv[key]; !ok && val != nil { - cmdBuildEnv = append(cmdBuildEnv, fmt.Sprintf("%s=%s", key, *val)) - } - } - - // derive the command to use for probeCache() and to commit in this container. - // Note that we only do this if there are any build-time env vars. Also, we - // use the special argument "|#" at the start of the args array. This will - // avoid conflicts with any RUN command since commands can not - // start with | (vertical bar). The "#" (number of build envs) is there to - // help ensure proper cache matches. We don't want a RUN command - // that starts with "foo=abc" to be considered part of a build-time env var. - saveCmd := config.Cmd - if len(cmdBuildEnv) > 0 { - sort.Strings(cmdBuildEnv) - tmpEnv := append([]string{fmt.Sprintf("|%d", len(cmdBuildEnv))}, cmdBuildEnv...) - saveCmd = strslice.StrSlice(append(tmpEnv, saveCmd...)) - } - - b.runConfig.Cmd = saveCmd - hit, err := b.probeCache() - if err != nil { - return err - } - if hit { - return nil - } - - // set Cmd manually, this is special case only for Dockerfiles - b.runConfig.Cmd = config.Cmd - // set build-time environment for 'run'. - b.runConfig.Env = append(b.runConfig.Env, cmdBuildEnv...) - // set config as already being escaped, this prevents double escaping on windows - b.runConfig.ArgsEscaped = true - - logrus.Debugf("[BUILDER] Command to be executed: %v", b.runConfig.Cmd) - - cID, err := b.create() - if err != nil { - return err - } - - if err := b.run(cID); err != nil { - return err - } - - // revert to original config environment and set the command string to - // have the build-time env vars in it (if any) so that future cache look-ups - // properly match it. - b.runConfig.Env = env - b.runConfig.Cmd = saveCmd - return b.commit(cID, cmd, "run") -} - -// CMD foo -// -// Set the default command to run in the container (which may be empty). -// Argument handling is the same as RUN. -// -func cmd(b *Builder, args []string, attributes map[string]bool, original string) error { - if err := b.flags.Parse(); err != nil { - return err - } - - cmdSlice := handleJSONArgs(args, attributes) - - if !attributes["json"] { - cmdSlice = append(getShell(b.runConfig), cmdSlice...) - } - - b.runConfig.Cmd = strslice.StrSlice(cmdSlice) - // set config as already being escaped, this prevents double escaping on windows - b.runConfig.ArgsEscaped = true - - if err := b.commit("", b.runConfig.Cmd, fmt.Sprintf("CMD %q", cmdSlice)); err != nil { - return err - } - - if len(args) != 0 { - b.cmdSet = true - } - - return nil -} - -// parseOptInterval(flag) is the duration of flag.Value, or 0 if -// empty. An error is reported if the value is given and is not positive. -func parseOptInterval(f *Flag) (time.Duration, error) { - s := f.Value - if s == "" { - return 0, nil - } - d, err := time.ParseDuration(s) - if err != nil { - return 0, err - } - if d <= 0 { - return 0, fmt.Errorf("Interval %#v must be positive", f.name) - } - return d, nil -} - -// HEALTHCHECK foo -// -// Set the default healthcheck command to run in the container (which may be empty). -// Argument handling is the same as RUN. -// -func healthcheck(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) == 0 { - return errAtLeastOneArgument("HEALTHCHECK") - } - typ := strings.ToUpper(args[0]) - args = args[1:] - if typ == "NONE" { - if len(args) != 0 { - return fmt.Errorf("HEALTHCHECK NONE takes no arguments") - } - test := strslice.StrSlice{typ} - b.runConfig.Healthcheck = &container.HealthConfig{ - Test: test, - } - } else { - if b.runConfig.Healthcheck != nil { - oldCmd := b.runConfig.Healthcheck.Test - if len(oldCmd) > 0 && oldCmd[0] != "NONE" { - fmt.Fprintf(b.Stdout, "Note: overriding previous HEALTHCHECK: %v\n", oldCmd) - } - } - - healthcheck := container.HealthConfig{} - - flInterval := b.flags.AddString("interval", "") - flTimeout := b.flags.AddString("timeout", "") - flRetries := b.flags.AddString("retries", "") - - if err := b.flags.Parse(); err != nil { - return err - } - - switch typ { - case "CMD": - cmdSlice := handleJSONArgs(args, attributes) - if len(cmdSlice) == 0 { - return fmt.Errorf("Missing command after HEALTHCHECK CMD") - } - - if !attributes["json"] { - typ = "CMD-SHELL" - } - - healthcheck.Test = strslice.StrSlice(append([]string{typ}, cmdSlice...)) - default: - return fmt.Errorf("Unknown type %#v in HEALTHCHECK (try CMD)", typ) - } - - interval, err := parseOptInterval(flInterval) - if err != nil { - return err - } - healthcheck.Interval = interval - - timeout, err := parseOptInterval(flTimeout) - if err != nil { - return err - } - healthcheck.Timeout = timeout - - if flRetries.Value != "" { - retries, err := strconv.ParseInt(flRetries.Value, 10, 32) - if err != nil { - return err - } - if retries < 1 { - return fmt.Errorf("--retries must be at least 1 (not %d)", retries) - } - healthcheck.Retries = int(retries) - } else { - healthcheck.Retries = 0 - } - - b.runConfig.Healthcheck = &healthcheck - } - - return b.commit("", b.runConfig.Cmd, fmt.Sprintf("HEALTHCHECK %q", b.runConfig.Healthcheck)) -} - -// ENTRYPOINT /usr/sbin/nginx -// -// Set the entrypoint to /usr/sbin/nginx. Will accept the CMD as the arguments -// to /usr/sbin/nginx. Uses the default shell if not in JSON format. -// -// Handles command processing similar to CMD and RUN, only b.runConfig.Entrypoint -// is initialized at NewBuilder time instead of through argument parsing. -// -func entrypoint(b *Builder, args []string, attributes map[string]bool, original string) error { - if err := b.flags.Parse(); err != nil { - return err - } - - parsed := handleJSONArgs(args, attributes) - - switch { - case attributes["json"]: - // ENTRYPOINT ["echo", "hi"] - b.runConfig.Entrypoint = strslice.StrSlice(parsed) - case len(parsed) == 0: - // ENTRYPOINT [] - b.runConfig.Entrypoint = nil - default: - // ENTRYPOINT echo hi - b.runConfig.Entrypoint = strslice.StrSlice(append(getShell(b.runConfig), parsed[0])) - } - - // when setting the entrypoint if a CMD was not explicitly set then - // set the command to nil - if !b.cmdSet { - b.runConfig.Cmd = nil - } - - if err := b.commit("", b.runConfig.Cmd, fmt.Sprintf("ENTRYPOINT %q", b.runConfig.Entrypoint)); err != nil { - return err - } - - return nil -} - -// EXPOSE 6667/tcp 7000/tcp -// -// Expose ports for links and port mappings. This all ends up in -// b.runConfig.ExposedPorts for runconfig. -// -func expose(b *Builder, args []string, attributes map[string]bool, original string) error { - portsTab := args - - if len(args) == 0 { - return errAtLeastOneArgument("EXPOSE") - } - - if err := b.flags.Parse(); err != nil { - return err - } - - if b.runConfig.ExposedPorts == nil { - b.runConfig.ExposedPorts = make(nat.PortSet) - } - - ports, _, err := nat.ParsePortSpecs(portsTab) - if err != nil { - return err - } - - // instead of using ports directly, we build a list of ports and sort it so - // the order is consistent. This prevents cache burst where map ordering - // changes between builds - portList := make([]string, len(ports)) - var i int - for port := range ports { - if _, exists := b.runConfig.ExposedPorts[port]; !exists { - b.runConfig.ExposedPorts[port] = struct{}{} - } - portList[i] = string(port) - i++ - } - sort.Strings(portList) - return b.commit("", b.runConfig.Cmd, fmt.Sprintf("EXPOSE %s", strings.Join(portList, " "))) -} - -// USER foo -// -// Set the user to 'foo' for future commands and when running the -// ENTRYPOINT/CMD at container run time. -// -func user(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) != 1 { - return errExactlyOneArgument("USER") - } - - if err := b.flags.Parse(); err != nil { - return err - } - - b.runConfig.User = args[0] - return b.commit("", b.runConfig.Cmd, fmt.Sprintf("USER %v", args)) -} - -// VOLUME /foo -// -// Expose the volume /foo for use. Will also accept the JSON array form. -// -func volume(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) == 0 { - return errAtLeastOneArgument("VOLUME") - } - - if err := b.flags.Parse(); err != nil { - return err - } - - if b.runConfig.Volumes == nil { - b.runConfig.Volumes = map[string]struct{}{} - } - for _, v := range args { - v = strings.TrimSpace(v) - if v == "" { - return fmt.Errorf("VOLUME specified can not be an empty string") - } - b.runConfig.Volumes[v] = struct{}{} - } - if err := b.commit("", b.runConfig.Cmd, fmt.Sprintf("VOLUME %v", args)); err != nil { - return err - } - return nil -} - -// STOPSIGNAL signal -// -// Set the signal that will be used to kill the container. -func stopSignal(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) != 1 { - return errExactlyOneArgument("STOPSIGNAL") - } - - sig := args[0] - _, err := signal.ParseSignal(sig) - if err != nil { - return err - } - - b.runConfig.StopSignal = sig - return b.commit("", b.runConfig.Cmd, fmt.Sprintf("STOPSIGNAL %v", args)) -} - -// ARG name[=value] -// -// Adds the variable foo to the trusted list of variables that can be passed -// to builder using the --build-arg flag for expansion/subsitution or passing to 'run'. -// Dockerfile author may optionally set a default value of this variable. -func arg(b *Builder, args []string, attributes map[string]bool, original string) error { - if len(args) != 1 { - return errExactlyOneArgument("ARG") - } - - var ( - name string - newValue string - hasDefault bool - ) - - arg := args[0] - // 'arg' can just be a name or name-value pair. Note that this is different - // from 'env' that handles the split of name and value at the parser level. - // The reason for doing it differently for 'arg' is that we support just - // defining an arg and not assign it a value (while 'env' always expects a - // name-value pair). If possible, it will be good to harmonize the two. - if strings.Contains(arg, "=") { - parts := strings.SplitN(arg, "=", 2) - if len(parts[0]) == 0 { - return errBlankCommandNames("ARG") - } - - name = parts[0] - newValue = parts[1] - hasDefault = true - } else { - name = arg - hasDefault = false - } - // add the arg to allowed list of build-time args from this step on. - b.allowedBuildArgs[name] = true - - // If there is a default value associated with this arg then add it to the - // b.buildArgs if one is not already passed to the builder. The args passed - // to builder override the default value of 'arg'. Note that a 'nil' for - // a value means that the user specified "--build-arg FOO" and "FOO" wasn't - // defined as an env var - and in that case we DO want to use the default - // value specified in the ARG cmd. - if baValue, ok := b.options.BuildArgs[name]; (!ok || baValue == nil) && hasDefault { - b.options.BuildArgs[name] = &newValue - } - - return b.commit("", b.runConfig.Cmd, fmt.Sprintf("ARG %s", arg)) -} - -// SHELL powershell -command -// -// Set the non-default shell to use. -func shell(b *Builder, args []string, attributes map[string]bool, original string) error { - if err := b.flags.Parse(); err != nil { - return err - } - shellSlice := handleJSONArgs(args, attributes) - switch { - case len(shellSlice) == 0: - // SHELL [] - return errAtLeastOneArgument("SHELL") - case attributes["json"]: - // SHELL ["powershell", "-command"] - b.runConfig.Shell = strslice.StrSlice(shellSlice) - default: - // SHELL powershell -command - not JSON - return errNotJSON("SHELL", original) - } - return b.commit("", b.runConfig.Cmd, fmt.Sprintf("SHELL %v", shellSlice)) -} - -func errAtLeastOneArgument(command string) error { - return fmt.Errorf("%s requires at least one argument", command) -} - -func errExactlyOneArgument(command string) error { - return fmt.Errorf("%s requires exactly one argument", command) -} - -func errAtLeastTwoArguments(command string) error { - return fmt.Errorf("%s requires at least two arguments", command) -} - -func errBlankCommandNames(command string) error { - return fmt.Errorf("%s names can not be blank", command) -} - -func errTooManyArguments(command string) error { - return fmt.Errorf("Bad input to %s, too many arguments", command) -} - -// getShell is a helper function which gets the right shell for prefixing the -// shell-form of RUN, ENTRYPOINT and CMD instructions -func getShell(c *container.Config) []string { - if 0 == len(c.Shell) { - return defaultShell[:] - } - return c.Shell[:] -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_test.go b/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_test.go deleted file mode 100644 index f7c57f7e3..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_test.go +++ /dev/null @@ -1,517 +0,0 @@ -package dockerfile - -import ( - "fmt" - "runtime" - "strings" - "testing" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/strslice" - "github.com/docker/go-connections/nat" -) - -type commandWithFunction struct { - name string - function func(args []string) error -} - -func TestCommandsExactlyOneArgument(t *testing.T) { - commands := []commandWithFunction{ - {"MAINTAINER", func(args []string) error { return maintainer(nil, args, nil, "") }}, - {"FROM", func(args []string) error { return from(nil, args, nil, "") }}, - {"WORKDIR", func(args []string) error { return workdir(nil, args, nil, "") }}, - {"USER", func(args []string) error { return user(nil, args, nil, "") }}, - {"STOPSIGNAL", func(args []string) error { return stopSignal(nil, args, nil, "") }}} - - for _, command := range commands { - err := command.function([]string{}) - - if err == nil { - t.Fatalf("Error should be present for %s command", command.name) - } - - expectedError := errExactlyOneArgument(command.name) - - if err.Error() != expectedError.Error() { - t.Fatalf("Wrong error message for %s. Got: %s. Should be: %s", command.name, err.Error(), expectedError) - } - } -} - -func TestCommandsAtLeastOneArgument(t *testing.T) { - commands := []commandWithFunction{ - {"ENV", func(args []string) error { return env(nil, args, nil, "") }}, - {"LABEL", func(args []string) error { return label(nil, args, nil, "") }}, - {"ONBUILD", func(args []string) error { return onbuild(nil, args, nil, "") }}, - {"HEALTHCHECK", func(args []string) error { return healthcheck(nil, args, nil, "") }}, - {"EXPOSE", func(args []string) error { return expose(nil, args, nil, "") }}, - {"VOLUME", func(args []string) error { return volume(nil, args, nil, "") }}} - - for _, command := range commands { - err := command.function([]string{}) - - if err == nil { - t.Fatalf("Error should be present for %s command", command.name) - } - - expectedError := errAtLeastOneArgument(command.name) - - if err.Error() != expectedError.Error() { - t.Fatalf("Wrong error message for %s. Got: %s. Should be: %s", command.name, err.Error(), expectedError) - } - } -} - -func TestCommandsAtLeastTwoArguments(t *testing.T) { - commands := []commandWithFunction{ - {"ADD", func(args []string) error { return add(nil, args, nil, "") }}, - {"COPY", func(args []string) error { return dispatchCopy(nil, args, nil, "") }}} - - for _, command := range commands { - err := command.function([]string{"arg1"}) - - if err == nil { - t.Fatalf("Error should be present for %s command", command.name) - } - - expectedError := errAtLeastTwoArguments(command.name) - - if err.Error() != expectedError.Error() { - t.Fatalf("Wrong error message for %s. Got: %s. Should be: %s", command.name, err.Error(), expectedError) - } - } -} - -func TestCommandsTooManyArguments(t *testing.T) { - commands := []commandWithFunction{ - {"ENV", func(args []string) error { return env(nil, args, nil, "") }}, - {"LABEL", func(args []string) error { return label(nil, args, nil, "") }}} - - for _, command := range commands { - err := command.function([]string{"arg1", "arg2", "arg3"}) - - if err == nil { - t.Fatalf("Error should be present for %s command", command.name) - } - - expectedError := errTooManyArguments(command.name) - - if err.Error() != expectedError.Error() { - t.Fatalf("Wrong error message for %s. Got: %s. Should be: %s", command.name, err.Error(), expectedError) - } - } -} - -func TestCommandseBlankNames(t *testing.T) { - bflags := &BFlags{} - config := &container.Config{} - - b := &Builder{flags: bflags, runConfig: config, disableCommit: true} - - commands := []commandWithFunction{ - {"ENV", func(args []string) error { return env(b, args, nil, "") }}, - {"LABEL", func(args []string) error { return label(b, args, nil, "") }}, - } - - for _, command := range commands { - err := command.function([]string{"", ""}) - - if err == nil { - t.Fatalf("Error should be present for %s command", command.name) - } - - expectedError := errBlankCommandNames(command.name) - - if err.Error() != expectedError.Error() { - t.Fatalf("Wrong error message for %s. Got: %s. Should be: %s", command.name, err.Error(), expectedError) - } - } -} - -func TestEnv2Variables(t *testing.T) { - variables := []string{"var1", "val1", "var2", "val2"} - - bflags := &BFlags{} - config := &container.Config{} - - b := &Builder{flags: bflags, runConfig: config, disableCommit: true} - - if err := env(b, variables, nil, ""); err != nil { - t.Fatalf("Error when executing env: %s", err.Error()) - } - - expectedVar1 := fmt.Sprintf("%s=%s", variables[0], variables[1]) - expectedVar2 := fmt.Sprintf("%s=%s", variables[2], variables[3]) - - if b.runConfig.Env[0] != expectedVar1 { - t.Fatalf("Wrong env output for first variable. Got: %s. Should be: %s", b.runConfig.Env[0], expectedVar1) - } - - if b.runConfig.Env[1] != expectedVar2 { - t.Fatalf("Wrong env output for second variable. Got: %s, Should be: %s", b.runConfig.Env[1], expectedVar2) - } -} - -func TestMaintainer(t *testing.T) { - maintainerEntry := "Some Maintainer " - - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - if err := maintainer(b, []string{maintainerEntry}, nil, ""); err != nil { - t.Fatalf("Error when executing maintainer: %s", err.Error()) - } - - if b.maintainer != maintainerEntry { - t.Fatalf("Maintainer in builder should be set to %s. Got: %s", maintainerEntry, b.maintainer) - } -} - -func TestLabel(t *testing.T) { - labelName := "label" - labelValue := "value" - - labelEntry := []string{labelName, labelValue} - - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - if err := label(b, labelEntry, nil, ""); err != nil { - t.Fatalf("Error when executing label: %s", err.Error()) - } - - if val, ok := b.runConfig.Labels[labelName]; ok { - if val != labelValue { - t.Fatalf("Label %s should have value %s, had %s instead", labelName, labelValue, val) - } - } else { - t.Fatalf("Label %s should be present but it is not", labelName) - } -} - -func TestFrom(t *testing.T) { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - err := from(b, []string{"scratch"}, nil, "") - - if runtime.GOOS == "windows" { - if err == nil { - t.Fatalf("Error not set on Windows") - } - - expectedError := "Windows does not support FROM scratch" - - if !strings.Contains(err.Error(), expectedError) { - t.Fatalf("Error message not correct on Windows. Should be: %s, got: %s", expectedError, err.Error()) - } - } else { - if err != nil { - t.Fatalf("Error when executing from: %s", err.Error()) - } - - if b.image != "" { - t.Fatalf("Image shoule be empty, got: %s", b.image) - } - - if b.noBaseImage != true { - t.Fatalf("Image should not have any base image, got: %v", b.noBaseImage) - } - } -} - -func TestOnbuildIllegalTriggers(t *testing.T) { - triggers := []struct{ command, expectedError string }{ - {"ONBUILD", "Chaining ONBUILD via `ONBUILD ONBUILD` isn't allowed"}, - {"MAINTAINER", "MAINTAINER isn't allowed as an ONBUILD trigger"}, - {"FROM", "FROM isn't allowed as an ONBUILD trigger"}} - - for _, trigger := range triggers { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - err := onbuild(b, []string{trigger.command}, nil, "") - - if err == nil { - t.Fatalf("Error should not be nil") - } - - if !strings.Contains(err.Error(), trigger.expectedError) { - t.Fatalf("Error message not correct. Should be: %s, got: %s", trigger.expectedError, err.Error()) - } - } -} - -func TestOnbuild(t *testing.T) { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - err := onbuild(b, []string{"ADD", ".", "/app/src"}, nil, "ONBUILD ADD . /app/src") - - if err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - expectedOnbuild := "ADD . /app/src" - - if b.runConfig.OnBuild[0] != expectedOnbuild { - t.Fatalf("Wrong ONBUILD command. Expected: %s, got: %s", expectedOnbuild, b.runConfig.OnBuild[0]) - } -} - -func TestWorkdir(t *testing.T) { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - workingDir := "/app" - - if runtime.GOOS == "windows" { - workingDir = "C:\app" - } - - err := workdir(b, []string{workingDir}, nil, "") - - if err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - if b.runConfig.WorkingDir != workingDir { - t.Fatalf("WorkingDir should be set to %s, got %s", workingDir, b.runConfig.WorkingDir) - } - -} - -func TestCmd(t *testing.T) { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - command := "./executable" - - err := cmd(b, []string{command}, nil, "") - - if err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - var expectedCommand strslice.StrSlice - - if runtime.GOOS == "windows" { - expectedCommand = strslice.StrSlice(append([]string{"cmd"}, "/S", "/C", command)) - } else { - expectedCommand = strslice.StrSlice(append([]string{"/bin/sh"}, "-c", command)) - } - - if !compareStrSlice(b.runConfig.Cmd, expectedCommand) { - t.Fatalf("Command should be set to %s, got %s", command, b.runConfig.Cmd) - } - - if !b.cmdSet { - t.Fatalf("Command should be marked as set") - } -} - -func compareStrSlice(slice1, slice2 strslice.StrSlice) bool { - if len(slice1) != len(slice2) { - return false - } - - for i := range slice1 { - if slice1[i] != slice2[i] { - return false - } - } - - return true -} - -func TestHealthcheckNone(t *testing.T) { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - if err := healthcheck(b, []string{"NONE"}, nil, ""); err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - if b.runConfig.Healthcheck == nil { - t.Fatal("Healthcheck should be set, got nil") - } - - expectedTest := strslice.StrSlice(append([]string{"NONE"})) - - if !compareStrSlice(expectedTest, b.runConfig.Healthcheck.Test) { - t.Fatalf("Command should be set to %s, got %s", expectedTest, b.runConfig.Healthcheck.Test) - } -} - -func TestHealthcheckCmd(t *testing.T) { - b := &Builder{flags: &BFlags{flags: make(map[string]*Flag)}, runConfig: &container.Config{}, disableCommit: true} - - if err := healthcheck(b, []string{"CMD", "curl", "-f", "http://localhost/", "||", "exit", "1"}, nil, ""); err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - if b.runConfig.Healthcheck == nil { - t.Fatal("Healthcheck should be set, got nil") - } - - expectedTest := strslice.StrSlice(append([]string{"CMD-SHELL"}, "curl -f http://localhost/ || exit 1")) - - if !compareStrSlice(expectedTest, b.runConfig.Healthcheck.Test) { - t.Fatalf("Command should be set to %s, got %s", expectedTest, b.runConfig.Healthcheck.Test) - } -} - -func TestEntrypoint(t *testing.T) { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - entrypointCmd := "/usr/sbin/nginx" - - if err := entrypoint(b, []string{entrypointCmd}, nil, ""); err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - if b.runConfig.Entrypoint == nil { - t.Fatalf("Entrypoint should be set") - } - - var expectedEntrypoint strslice.StrSlice - - if runtime.GOOS == "windows" { - expectedEntrypoint = strslice.StrSlice(append([]string{"cmd"}, "/S", "/C", entrypointCmd)) - } else { - expectedEntrypoint = strslice.StrSlice(append([]string{"/bin/sh"}, "-c", entrypointCmd)) - } - - if !compareStrSlice(expectedEntrypoint, b.runConfig.Entrypoint) { - t.Fatalf("Entrypoint command should be set to %s, got %s", expectedEntrypoint, b.runConfig.Entrypoint) - } -} - -func TestExpose(t *testing.T) { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - exposedPort := "80" - - if err := expose(b, []string{exposedPort}, nil, ""); err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - if b.runConfig.ExposedPorts == nil { - t.Fatalf("ExposedPorts should be set") - } - - if len(b.runConfig.ExposedPorts) != 1 { - t.Fatalf("ExposedPorts should contain only 1 element. Got %s", b.runConfig.ExposedPorts) - } - - portsMapping, err := nat.ParsePortSpec(exposedPort) - - if err != nil { - t.Fatalf("Error when parsing port spec: %s", err.Error()) - } - - if _, ok := b.runConfig.ExposedPorts[portsMapping[0].Port]; !ok { - t.Fatalf("Port %s should be present. Got %s", exposedPort, b.runConfig.ExposedPorts) - } -} - -func TestUser(t *testing.T) { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - userCommand := "foo" - - if err := user(b, []string{userCommand}, nil, ""); err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - if b.runConfig.User != userCommand { - t.Fatalf("User should be set to %s, got %s", userCommand, b.runConfig.User) - } -} - -func TestVolume(t *testing.T) { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - exposedVolume := "/foo" - - if err := volume(b, []string{exposedVolume}, nil, ""); err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - if b.runConfig.Volumes == nil { - t.Fatalf("Volumes should be set") - } - - if len(b.runConfig.Volumes) != 1 { - t.Fatalf("Volumes should contain only 1 element. Got %s", b.runConfig.Volumes) - } - - if _, ok := b.runConfig.Volumes[exposedVolume]; !ok { - t.Fatalf("Volume %s should be present. Got %s", exposedVolume, b.runConfig.Volumes) - } -} - -func TestStopSignal(t *testing.T) { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - signal := "SIGKILL" - - if err := stopSignal(b, []string{signal}, nil, ""); err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - if b.runConfig.StopSignal != signal { - t.Fatalf("StopSignal should be set to %s, got %s", signal, b.runConfig.StopSignal) - } -} - -func TestArg(t *testing.T) { - buildOptions := &types.ImageBuildOptions{BuildArgs: make(map[string]*string)} - - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true, allowedBuildArgs: make(map[string]bool), options: buildOptions} - - argName := "foo" - argVal := "bar" - argDef := fmt.Sprintf("%s=%s", argName, argVal) - - if err := arg(b, []string{argDef}, nil, ""); err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - allowed, ok := b.allowedBuildArgs[argName] - - if !ok { - t.Fatalf("%s argument should be allowed as a build arg", argName) - } - - if !allowed { - t.Fatalf("%s argument was present in map but disallowed as a build arg", argName) - } - - val, ok := b.options.BuildArgs[argName] - - if !ok { - t.Fatalf("%s argument should be a build arg", argName) - } - - if *val != "bar" { - t.Fatalf("%s argument should have default value 'bar', got %s", argName, val) - } -} - -func TestShell(t *testing.T) { - b := &Builder{flags: &BFlags{}, runConfig: &container.Config{}, disableCommit: true} - - shellCmd := "powershell" - - attrs := make(map[string]bool) - attrs["json"] = true - - if err := shell(b, []string{shellCmd}, attrs, ""); err != nil { - t.Fatalf("Error should be empty, got: %s", err.Error()) - } - - if b.runConfig.Shell == nil { - t.Fatalf("Shell should be set") - } - - expectedShell := strslice.StrSlice([]string{shellCmd}) - - if !compareStrSlice(expectedShell, b.runConfig.Shell) { - t.Fatalf("Shell should be set to %s, got %s", expectedShell, b.runConfig.Shell) - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_unix.go b/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_unix.go deleted file mode 100644 index 8b0dfc391..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_unix.go +++ /dev/null @@ -1,27 +0,0 @@ -// +build !windows - -package dockerfile - -import ( - "fmt" - "os" - "path/filepath" -) - -// normaliseWorkdir normalises a user requested working directory in a -// platform sematically consistent way. -func normaliseWorkdir(current string, requested string) (string, error) { - if requested == "" { - return "", fmt.Errorf("cannot normalise nothing") - } - current = filepath.FromSlash(current) - requested = filepath.FromSlash(requested) - if !filepath.IsAbs(requested) { - return filepath.Join(string(os.PathSeparator), current, requested), nil - } - return requested, nil -} - -func errNotJSON(command, _ string) error { - return fmt.Errorf("%s requires the arguments to be in JSON form", command) -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_unix_test.go b/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_unix_test.go deleted file mode 100644 index 4aae6b460..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_unix_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// +build !windows - -package dockerfile - -import ( - "testing" -) - -func TestNormaliseWorkdir(t *testing.T) { - testCases := []struct{ current, requested, expected, expectedError string }{ - {``, ``, ``, `cannot normalise nothing`}, - {``, `foo`, `/foo`, ``}, - {``, `/foo`, `/foo`, ``}, - {`/foo`, `bar`, `/foo/bar`, ``}, - {`/foo`, `/bar`, `/bar`, ``}, - } - - for _, test := range testCases { - normalised, err := normaliseWorkdir(test.current, test.requested) - - if test.expectedError != "" && err == nil { - t.Fatalf("NormaliseWorkdir should return an error %s, got nil", test.expectedError) - } - - if test.expectedError != "" && err.Error() != test.expectedError { - t.Fatalf("NormaliseWorkdir returned wrong error. Expected %s, got %s", test.expectedError, err.Error()) - } - - if normalised != test.expected { - t.Fatalf("NormaliseWorkdir error. Expected %s for current %s and requested %s, got %s", test.expected, test.current, test.requested, normalised) - } - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_windows.go b/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_windows.go deleted file mode 100644 index e890c3ae1..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_windows.go +++ /dev/null @@ -1,86 +0,0 @@ -package dockerfile - -import ( - "fmt" - "os" - "path/filepath" - "regexp" - "strings" - - "github.com/docker/docker/pkg/system" -) - -var pattern = regexp.MustCompile(`^[a-zA-Z]:\.$`) - -// normaliseWorkdir normalises a user requested working directory in a -// platform sematically consistent way. -func normaliseWorkdir(current string, requested string) (string, error) { - if requested == "" { - return "", fmt.Errorf("cannot normalise nothing") - } - - // `filepath.Clean` will replace "" with "." so skip in that case - if current != "" { - current = filepath.Clean(current) - } - if requested != "" { - requested = filepath.Clean(requested) - } - - // If either current or requested in Windows is: - // C: - // C:. - // then an error will be thrown as the definition for the above - // refers to `current directory on drive C:` - // Since filepath.Clean() will automatically normalize the above - // to `C:.`, we only need to check the last format - if pattern.MatchString(current) { - return "", fmt.Errorf("%s is not a directory. If you are specifying a drive letter, please add a trailing '\\'", current) - } - if pattern.MatchString(requested) { - return "", fmt.Errorf("%s is not a directory. If you are specifying a drive letter, please add a trailing '\\'", requested) - } - - // Target semantics is C:\somefolder, specifically in the format: - // UPPERCASEDriveLetter-Colon-Backslash-FolderName. We are already - // guaranteed that `current`, if set, is consistent. This allows us to - // cope correctly with any of the following in a Dockerfile: - // WORKDIR a --> C:\a - // WORKDIR c:\\foo --> C:\foo - // WORKDIR \\foo --> C:\foo - // WORKDIR /foo --> C:\foo - // WORKDIR c:\\foo \ WORKDIR bar --> C:\foo --> C:\foo\bar - // WORKDIR C:/foo \ WORKDIR bar --> C:\foo --> C:\foo\bar - // WORKDIR C:/foo \ WORKDIR \\bar --> C:\foo --> C:\bar - // WORKDIR /foo \ WORKDIR c:/bar --> C:\foo --> C:\bar - if len(current) == 0 || system.IsAbs(requested) { - if (requested[0] == os.PathSeparator) || - (len(requested) > 1 && string(requested[1]) != ":") || - (len(requested) == 1) { - requested = filepath.Join(`C:\`, requested) - } - } else { - requested = filepath.Join(current, requested) - } - // Upper-case drive letter - return (strings.ToUpper(string(requested[0])) + requested[1:]), nil -} - -func errNotJSON(command, original string) error { - // For Windows users, give a hint if it looks like it might contain - // a path which hasn't been escaped such as ["c:\windows\system32\prog.exe", "-param"], - // as JSON must be escaped. Unfortunate... - // - // Specifically looking for quote-driveletter-colon-backslash, there's no - // double backslash and a [] pair. No, this is not perfect, but it doesn't - // have to be. It's simply a hint to make life a little easier. - extra := "" - original = filepath.FromSlash(strings.ToLower(strings.Replace(strings.ToLower(original), strings.ToLower(command)+" ", "", -1))) - if len(regexp.MustCompile(`"[a-z]:\\.*`).FindStringSubmatch(original)) > 0 && - !strings.Contains(original, `\\`) && - strings.Contains(original, "[") && - strings.Contains(original, "]") { - extra = fmt.Sprintf(`. It looks like '%s' includes a file path without an escaped back-slash. JSON requires back-slashes to be escaped such as ["c:\\path\\to\\file.exe", "/parameter"]`, original) - } - return fmt.Errorf("%s requires the arguments to be in JSON form%s", command, extra) -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_windows_test.go b/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_windows_test.go deleted file mode 100644 index 3319c0658..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers_windows_test.go +++ /dev/null @@ -1,40 +0,0 @@ -// +build windows - -package dockerfile - -import "testing" - -func TestNormaliseWorkdir(t *testing.T) { - tests := []struct{ current, requested, expected, etext string }{ - {``, ``, ``, `cannot normalise nothing`}, - {``, `C:`, ``, `C:. is not a directory. If you are specifying a drive letter, please add a trailing '\'`}, - {``, `C:.`, ``, `C:. is not a directory. If you are specifying a drive letter, please add a trailing '\'`}, - {`c:`, `\a`, ``, `c:. is not a directory. If you are specifying a drive letter, please add a trailing '\'`}, - {`c:.`, `\a`, ``, `c:. is not a directory. If you are specifying a drive letter, please add a trailing '\'`}, - {``, `a`, `C:\a`, ``}, - {``, `c:\foo`, `C:\foo`, ``}, - {``, `c:\\foo`, `C:\foo`, ``}, - {``, `\foo`, `C:\foo`, ``}, - {``, `\\foo`, `C:\foo`, ``}, - {``, `/foo`, `C:\foo`, ``}, - {``, `C:/foo`, `C:\foo`, ``}, - {`C:\foo`, `bar`, `C:\foo\bar`, ``}, - {`C:\foo`, `/bar`, `C:\bar`, ``}, - {`C:\foo`, `\bar`, `C:\bar`, ``}, - } - for _, i := range tests { - r, e := normaliseWorkdir(i.current, i.requested) - - if i.etext != "" && e == nil { - t.Fatalf("TestNormaliseWorkingDir Expected error %s for '%s' '%s', got no error", i.etext, i.current, i.requested) - } - - if i.etext != "" && e.Error() != i.etext { - t.Fatalf("TestNormaliseWorkingDir Expected error %s for '%s' '%s', got %s", i.etext, i.current, i.requested, e.Error()) - } - - if r != i.expected { - t.Fatalf("TestNormaliseWorkingDir Expected '%s' for '%s' '%s', got '%s'", i.expected, i.current, i.requested, r) - } - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/envVarTest b/vendor/github.com/docker/docker/builder/dockerfile/envVarTest deleted file mode 100644 index 067dca9a5..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/envVarTest +++ /dev/null @@ -1,116 +0,0 @@ -A|hello | hello -A|he'll'o | hello -A|he'llo | hello -A|he\'llo | he'llo -A|he\\'llo | he\llo -A|abc\tdef | abctdef -A|"abc\tdef" | abc\tdef -A|'abc\tdef' | abc\tdef -A|hello\ | hello -A|hello\\ | hello\ -A|"hello | hello -A|"hello\" | hello" -A|"hel'lo" | hel'lo -A|'hello | hello -A|'hello\' | hello\ -A|"''" | '' -A|$. | $. -A|$1 | -A|he$1x | hex -A|he$.x | he$.x -# Next one is different on Windows as $pwd==$PWD -U|he$pwd. | he. -W|he$pwd. | he/home. -A|he$PWD | he/home -A|he\$PWD | he$PWD -A|he\\$PWD | he\/home -A|he\${} | he${} -A|he\${}xx | he${}xx -A|he${} | he -A|he${}xx | hexx -A|he${hi} | he -A|he${hi}xx | hexx -A|he${PWD} | he/home -A|he${.} | error -A|he${XXX:-000}xx | he000xx -A|he${PWD:-000}xx | he/homexx -A|he${XXX:-$PWD}xx | he/homexx -A|he${XXX:-${PWD:-yyy}}xx | he/homexx -A|he${XXX:-${YYY:-yyy}}xx | heyyyxx -A|he${XXX:YYY} | error -A|he${XXX:+${PWD}}xx | hexx -A|he${PWD:+${XXX}}xx | hexx -A|he${PWD:+${SHELL}}xx | hebashxx -A|he${XXX:+000}xx | hexx -A|he${PWD:+000}xx | he000xx -A|'he${XX}' | he${XX} -A|"he${PWD}" | he/home -A|"he'$PWD'" | he'/home' -A|"$PWD" | /home -A|'$PWD' | $PWD -A|'\$PWD' | \$PWD -A|'"hello"' | "hello" -A|he\$PWD | he$PWD -A|"he\$PWD" | he$PWD -A|'he\$PWD' | he\$PWD -A|he${PWD | error -A|he${PWD:=000}xx | error -A|he${PWD:+${PWD}:}xx | he/home:xx -A|he${XXX:-\$PWD:}xx | he$PWD:xx -A|he${XXX:-\${PWD}z}xx | he${PWDz}xx -A|안녕하세요 | 안녕하세요 -A|안'녕'하세요 | 안녕하세요 -A|안'녕하세요 | 안녕하세요 -A|안녕\'하세요 | 안녕'하세요 -A|안\\'녕하세요 | 안\녕하세요 -A|안녕\t하세요 | 안녕t하세요 -A|"안녕\t하세요" | 안녕\t하세요 -A|'안녕\t하세요 | 안녕\t하세요 -A|안녕하세요\ | 안녕하세요 -A|안녕하세요\\ | 안녕하세요\ -A|"안녕하세요 | 안녕하세요 -A|"안녕하세요\" | 안녕하세요" -A|"안녕'하세요" | 안녕'하세요 -A|'안녕하세요 | 안녕하세요 -A|'안녕하세요\' | 안녕하세요\ -A|안녕$1x | 안녕x -A|안녕$.x | 안녕$.x -# Next one is different on Windows as $pwd==$PWD -U|안녕$pwd. | 안녕. -W|안녕$pwd. | 안녕/home. -A|안녕$PWD | 안녕/home -A|안녕\$PWD | 안녕$PWD -A|안녕\\$PWD | 안녕\/home -A|안녕\${} | 안녕${} -A|안녕\${}xx | 안녕${}xx -A|안녕${} | 안녕 -A|안녕${}xx | 안녕xx -A|안녕${hi} | 안녕 -A|안녕${hi}xx | 안녕xx -A|안녕${PWD} | 안녕/home -A|안녕${.} | error -A|안녕${XXX:-000}xx | 안녕000xx -A|안녕${PWD:-000}xx | 안녕/homexx -A|안녕${XXX:-$PWD}xx | 안녕/homexx -A|안녕${XXX:-${PWD:-yyy}}xx | 안녕/homexx -A|안녕${XXX:-${YYY:-yyy}}xx | 안녕yyyxx -A|안녕${XXX:YYY} | error -A|안녕${XXX:+${PWD}}xx | 안녕xx -A|안녕${PWD:+${XXX}}xx | 안녕xx -A|안녕${PWD:+${SHELL}}xx | 안녕bashxx -A|안녕${XXX:+000}xx | 안녕xx -A|안녕${PWD:+000}xx | 안녕000xx -A|'안녕${XX}' | 안녕${XX} -A|"안녕${PWD}" | 안녕/home -A|"안녕'$PWD'" | 안녕'/home' -A|'"안녕"' | "안녕" -A|안녕\$PWD | 안녕$PWD -A|"안녕\$PWD" | 안녕$PWD -A|'안녕\$PWD' | 안녕\$PWD -A|안녕${PWD | error -A|안녕${PWD:=000}xx | error -A|안녕${PWD:+${PWD}:}xx | 안녕/home:xx -A|안녕${XXX:-\$PWD:}xx | 안녕$PWD:xx -A|안녕${XXX:-\${PWD}z}xx | 안녕${PWDz}xx -A|$KOREAN | 한국어 -A|안녕$KOREAN | 안녕한국어 diff --git a/vendor/github.com/docker/docker/builder/dockerfile/evaluator.go b/vendor/github.com/docker/docker/builder/dockerfile/evaluator.go deleted file mode 100644 index f5997c91a..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/evaluator.go +++ /dev/null @@ -1,244 +0,0 @@ -// Package dockerfile is the evaluation step in the Dockerfile parse/evaluate pipeline. -// -// It incorporates a dispatch table based on the parser.Node values (see the -// parser package for more information) that are yielded from the parser itself. -// Calling NewBuilder with the BuildOpts struct can be used to customize the -// experience for execution purposes only. Parsing is controlled in the parser -// package, and this division of responsibility should be respected. -// -// Please see the jump table targets for the actual invocations, most of which -// will call out to the functions in internals.go to deal with their tasks. -// -// ONBUILD is a special case, which is covered in the onbuild() func in -// dispatchers.go. -// -// The evaluator uses the concept of "steps", which are usually each processable -// line in the Dockerfile. Each step is numbered and certain actions are taken -// before and after each step, such as creating an image ID and removing temporary -// containers and images. Note that ONBUILD creates a kinda-sorta "sub run" which -// includes its own set of steps (usually only one of them). -package dockerfile - -import ( - "fmt" - "strings" - - "github.com/docker/docker/builder/dockerfile/command" - "github.com/docker/docker/builder/dockerfile/parser" -) - -// Environment variable interpolation will happen on these statements only. -var replaceEnvAllowed = map[string]bool{ - command.Env: true, - command.Label: true, - command.Add: true, - command.Copy: true, - command.Workdir: true, - command.Expose: true, - command.Volume: true, - command.User: true, - command.StopSignal: true, - command.Arg: true, -} - -// Certain commands are allowed to have their args split into more -// words after env var replacements. Meaning: -// ENV foo="123 456" -// EXPOSE $foo -// should result in the same thing as: -// EXPOSE 123 456 -// and not treat "123 456" as a single word. -// Note that: EXPOSE "$foo" and EXPOSE $foo are not the same thing. -// Quotes will cause it to still be treated as single word. -var allowWordExpansion = map[string]bool{ - command.Expose: true, -} - -var evaluateTable map[string]func(*Builder, []string, map[string]bool, string) error - -func init() { - evaluateTable = map[string]func(*Builder, []string, map[string]bool, string) error{ - command.Add: add, - command.Arg: arg, - command.Cmd: cmd, - command.Copy: dispatchCopy, // copy() is a go builtin - command.Entrypoint: entrypoint, - command.Env: env, - command.Expose: expose, - command.From: from, - command.Healthcheck: healthcheck, - command.Label: label, - command.Maintainer: maintainer, - command.Onbuild: onbuild, - command.Run: run, - command.Shell: shell, - command.StopSignal: stopSignal, - command.User: user, - command.Volume: volume, - command.Workdir: workdir, - } -} - -// This method is the entrypoint to all statement handling routines. -// -// Almost all nodes will have this structure: -// Child[Node, Node, Node] where Child is from parser.Node.Children and each -// node comes from parser.Node.Next. This forms a "line" with a statement and -// arguments and we process them in this normalized form by hitting -// evaluateTable with the leaf nodes of the command and the Builder object. -// -// ONBUILD is a special case; in this case the parser will emit: -// Child[Node, Child[Node, Node...]] where the first node is the literal -// "onbuild" and the child entrypoint is the command of the ONBUILD statement, -// such as `RUN` in ONBUILD RUN foo. There is special case logic in here to -// deal with that, at least until it becomes more of a general concern with new -// features. -func (b *Builder) dispatch(stepN int, stepTotal int, ast *parser.Node) error { - cmd := ast.Value - upperCasedCmd := strings.ToUpper(cmd) - - // To ensure the user is given a decent error message if the platform - // on which the daemon is running does not support a builder command. - if err := platformSupports(strings.ToLower(cmd)); err != nil { - return err - } - - attrs := ast.Attributes - original := ast.Original - flags := ast.Flags - strList := []string{} - msg := fmt.Sprintf("Step %d/%d : %s", stepN+1, stepTotal, upperCasedCmd) - - if len(ast.Flags) > 0 { - msg += " " + strings.Join(ast.Flags, " ") - } - - if cmd == "onbuild" { - if ast.Next == nil { - return fmt.Errorf("ONBUILD requires at least one argument") - } - ast = ast.Next.Children[0] - strList = append(strList, ast.Value) - msg += " " + ast.Value - - if len(ast.Flags) > 0 { - msg += " " + strings.Join(ast.Flags, " ") - } - - } - - // count the number of nodes that we are going to traverse first - // so we can pre-create the argument and message array. This speeds up the - // allocation of those list a lot when they have a lot of arguments - cursor := ast - var n int - for cursor.Next != nil { - cursor = cursor.Next - n++ - } - msgList := make([]string, n) - - var i int - // Append the build-time args to config-environment. - // This allows builder config to override the variables, making the behavior similar to - // a shell script i.e. `ENV foo bar` overrides value of `foo` passed in build - // context. But `ENV foo $foo` will use the value from build context if one - // isn't already been defined by a previous ENV primitive. - // Note, we get this behavior because we know that ProcessWord() will - // stop on the first occurrence of a variable name and not notice - // a subsequent one. So, putting the buildArgs list after the Config.Env - // list, in 'envs', is safe. - envs := b.runConfig.Env - for key, val := range b.options.BuildArgs { - if !b.isBuildArgAllowed(key) { - // skip build-args that are not in allowed list, meaning they have - // not been defined by an "ARG" Dockerfile command yet. - // This is an error condition but only if there is no "ARG" in the entire - // Dockerfile, so we'll generate any necessary errors after we parsed - // the entire file (see 'leftoverArgs' processing in evaluator.go ) - continue - } - envs = append(envs, fmt.Sprintf("%s=%s", key, *val)) - } - for ast.Next != nil { - ast = ast.Next - var str string - str = ast.Value - if replaceEnvAllowed[cmd] { - var err error - var words []string - - if allowWordExpansion[cmd] { - words, err = ProcessWords(str, envs, b.directive.EscapeToken) - if err != nil { - return err - } - strList = append(strList, words...) - } else { - str, err = ProcessWord(str, envs, b.directive.EscapeToken) - if err != nil { - return err - } - strList = append(strList, str) - } - } else { - strList = append(strList, str) - } - msgList[i] = ast.Value - i++ - } - - msg += " " + strings.Join(msgList, " ") - fmt.Fprintln(b.Stdout, msg) - - // XXX yes, we skip any cmds that are not valid; the parser should have - // picked these out already. - if f, ok := evaluateTable[cmd]; ok { - b.flags = NewBFlags() - b.flags.Args = flags - return f(b, strList, attrs, original) - } - - return fmt.Errorf("Unknown instruction: %s", upperCasedCmd) -} - -// checkDispatch does a simple check for syntax errors of the Dockerfile. -// Because some of the instructions can only be validated through runtime, -// arg, env, etc., this syntax check will not be complete and could not replace -// the runtime check. Instead, this function is only a helper that allows -// user to find out the obvious error in Dockerfile earlier on. -// onbuild bool: indicate if instruction XXX is part of `ONBUILD XXX` trigger -func (b *Builder) checkDispatch(ast *parser.Node, onbuild bool) error { - cmd := ast.Value - upperCasedCmd := strings.ToUpper(cmd) - - // To ensure the user is given a decent error message if the platform - // on which the daemon is running does not support a builder command. - if err := platformSupports(strings.ToLower(cmd)); err != nil { - return err - } - - // The instruction itself is ONBUILD, we will make sure it follows with at - // least one argument - if upperCasedCmd == "ONBUILD" { - if ast.Next == nil { - return fmt.Errorf("ONBUILD requires at least one argument") - } - } - - // The instruction is part of ONBUILD trigger (not the instruction itself) - if onbuild { - switch upperCasedCmd { - case "ONBUILD": - return fmt.Errorf("Chaining ONBUILD via `ONBUILD ONBUILD` isn't allowed") - case "MAINTAINER", "FROM": - return fmt.Errorf("%s isn't allowed as an ONBUILD trigger", upperCasedCmd) - } - } - - if _, ok := evaluateTable[cmd]; ok { - return nil - } - - return fmt.Errorf("Unknown instruction: %s", upperCasedCmd) -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/evaluator_test.go b/vendor/github.com/docker/docker/builder/dockerfile/evaluator_test.go deleted file mode 100644 index 4340a2f8a..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/evaluator_test.go +++ /dev/null @@ -1,197 +0,0 @@ -package dockerfile - -import ( - "io/ioutil" - "strings" - "testing" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/builder" - "github.com/docker/docker/builder/dockerfile/parser" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/reexec" -) - -type dispatchTestCase struct { - name, dockerfile, expectedError string - files map[string]string -} - -func init() { - reexec.Init() -} - -func initDispatchTestCases() []dispatchTestCase { - dispatchTestCases := []dispatchTestCase{{ - name: "copyEmptyWhitespace", - dockerfile: `COPY - quux \ - bar`, - expectedError: "COPY requires at least two arguments", - }, - { - name: "ONBUILD forbidden FROM", - dockerfile: "ONBUILD FROM scratch", - expectedError: "FROM isn't allowed as an ONBUILD trigger", - files: nil, - }, - { - name: "ONBUILD forbidden MAINTAINER", - dockerfile: "ONBUILD MAINTAINER docker.io", - expectedError: "MAINTAINER isn't allowed as an ONBUILD trigger", - files: nil, - }, - { - name: "ARG two arguments", - dockerfile: "ARG foo bar", - expectedError: "ARG requires exactly one argument", - files: nil, - }, - { - name: "MAINTAINER unknown flag", - dockerfile: "MAINTAINER --boo joe@example.com", - expectedError: "Unknown flag: boo", - files: nil, - }, - { - name: "ADD multiple files to file", - dockerfile: "ADD file1.txt file2.txt test", - expectedError: "When using ADD with more than one source file, the destination must be a directory and end with a /", - files: map[string]string{"file1.txt": "test1", "file2.txt": "test2"}, - }, - { - name: "JSON ADD multiple files to file", - dockerfile: `ADD ["file1.txt", "file2.txt", "test"]`, - expectedError: "When using ADD with more than one source file, the destination must be a directory and end with a /", - files: map[string]string{"file1.txt": "test1", "file2.txt": "test2"}, - }, - { - name: "Wildcard ADD multiple files to file", - dockerfile: "ADD file*.txt test", - expectedError: "When using ADD with more than one source file, the destination must be a directory and end with a /", - files: map[string]string{"file1.txt": "test1", "file2.txt": "test2"}, - }, - { - name: "Wildcard JSON ADD multiple files to file", - dockerfile: `ADD ["file*.txt", "test"]`, - expectedError: "When using ADD with more than one source file, the destination must be a directory and end with a /", - files: map[string]string{"file1.txt": "test1", "file2.txt": "test2"}, - }, - { - name: "COPY multiple files to file", - dockerfile: "COPY file1.txt file2.txt test", - expectedError: "When using COPY with more than one source file, the destination must be a directory and end with a /", - files: map[string]string{"file1.txt": "test1", "file2.txt": "test2"}, - }, - { - name: "JSON COPY multiple files to file", - dockerfile: `COPY ["file1.txt", "file2.txt", "test"]`, - expectedError: "When using COPY with more than one source file, the destination must be a directory and end with a /", - files: map[string]string{"file1.txt": "test1", "file2.txt": "test2"}, - }, - { - name: "ADD multiple files to file with whitespace", - dockerfile: `ADD [ "test file1.txt", "test file2.txt", "test" ]`, - expectedError: "When using ADD with more than one source file, the destination must be a directory and end with a /", - files: map[string]string{"test file1.txt": "test1", "test file2.txt": "test2"}, - }, - { - name: "COPY multiple files to file with whitespace", - dockerfile: `COPY [ "test file1.txt", "test file2.txt", "test" ]`, - expectedError: "When using COPY with more than one source file, the destination must be a directory and end with a /", - files: map[string]string{"test file1.txt": "test1", "test file2.txt": "test2"}, - }, - { - name: "COPY wildcard no files", - dockerfile: `COPY file*.txt /tmp/`, - expectedError: "No source files were specified", - files: nil, - }, - { - name: "COPY url", - dockerfile: `COPY https://index.docker.io/robots.txt /`, - expectedError: "Source can't be a URL for COPY", - files: nil, - }, - { - name: "Chaining ONBUILD", - dockerfile: `ONBUILD ONBUILD RUN touch foobar`, - expectedError: "Chaining ONBUILD via `ONBUILD ONBUILD` isn't allowed", - files: nil, - }, - { - name: "Invalid instruction", - dockerfile: `foo bar`, - expectedError: "Unknown instruction: FOO", - files: nil, - }} - - return dispatchTestCases -} - -func TestDispatch(t *testing.T) { - testCases := initDispatchTestCases() - - for _, testCase := range testCases { - executeTestCase(t, testCase) - } -} - -func executeTestCase(t *testing.T, testCase dispatchTestCase) { - contextDir, cleanup := createTestTempDir(t, "", "builder-dockerfile-test") - defer cleanup() - - for filename, content := range testCase.files { - createTestTempFile(t, contextDir, filename, content, 0777) - } - - tarStream, err := archive.Tar(contextDir, archive.Uncompressed) - - if err != nil { - t.Fatalf("Error when creating tar stream: %s", err) - } - - defer func() { - if err = tarStream.Close(); err != nil { - t.Fatalf("Error when closing tar stream: %s", err) - } - }() - - context, err := builder.MakeTarSumContext(tarStream) - - if err != nil { - t.Fatalf("Error when creating tar context: %s", err) - } - - defer func() { - if err = context.Close(); err != nil { - t.Fatalf("Error when closing tar context: %s", err) - } - }() - - r := strings.NewReader(testCase.dockerfile) - d := parser.Directive{} - parser.SetEscapeToken(parser.DefaultEscapeToken, &d) - n, err := parser.Parse(r, &d) - - if err != nil { - t.Fatalf("Error when parsing Dockerfile: %s", err) - } - - config := &container.Config{} - options := &types.ImageBuildOptions{} - - b := &Builder{runConfig: config, options: options, Stdout: ioutil.Discard, context: context} - - err = b.dispatch(0, len(n.Children), n.Children[0]) - - if err == nil { - t.Fatalf("No error when executing test %s", testCase.name) - } - - if !strings.Contains(err.Error(), testCase.expectedError) { - t.Fatalf("Wrong error message. Should be \"%s\". Got \"%s\"", testCase.expectedError, err.Error()) - } - -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/evaluator_unix.go b/vendor/github.com/docker/docker/builder/dockerfile/evaluator_unix.go deleted file mode 100644 index 28fd5b156..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/evaluator_unix.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build !windows - -package dockerfile - -// platformSupports is a short-term function to give users a quality error -// message if a Dockerfile uses a command not supported on the platform. -func platformSupports(command string) error { - return nil -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/evaluator_windows.go b/vendor/github.com/docker/docker/builder/dockerfile/evaluator_windows.go deleted file mode 100644 index 72483a2ec..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/evaluator_windows.go +++ /dev/null @@ -1,13 +0,0 @@ -package dockerfile - -import "fmt" - -// platformSupports is gives users a quality error message if a Dockerfile uses -// a command not supported on the platform. -func platformSupports(command string) error { - switch command { - case "stopsignal": - return fmt.Errorf("The daemon on this platform does not support the command '%s'", command) - } - return nil -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/internals.go b/vendor/github.com/docker/docker/builder/dockerfile/internals.go deleted file mode 100644 index 6f0a36784..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/internals.go +++ /dev/null @@ -1,669 +0,0 @@ -package dockerfile - -// internals for handling commands. Covers many areas and a lot of -// non-contiguous functionality. Please read the comments. - -import ( - "crypto/sha256" - "encoding/hex" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "os" - "path/filepath" - "sort" - "strings" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/strslice" - "github.com/docker/docker/builder" - "github.com/docker/docker/builder/dockerfile/parser" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/httputils" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/jsonmessage" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/pkg/streamformatter" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/system" - "github.com/docker/docker/pkg/tarsum" - "github.com/docker/docker/pkg/urlutil" - "github.com/docker/docker/runconfig/opts" -) - -func (b *Builder) commit(id string, autoCmd strslice.StrSlice, comment string) error { - if b.disableCommit { - return nil - } - if b.image == "" && !b.noBaseImage { - return fmt.Errorf("Please provide a source image with `from` prior to commit") - } - b.runConfig.Image = b.image - - if id == "" { - cmd := b.runConfig.Cmd - b.runConfig.Cmd = strslice.StrSlice(append(getShell(b.runConfig), "#(nop) ", comment)) - defer func(cmd strslice.StrSlice) { b.runConfig.Cmd = cmd }(cmd) - - hit, err := b.probeCache() - if err != nil { - return err - } else if hit { - return nil - } - id, err = b.create() - if err != nil { - return err - } - } - - // Note: Actually copy the struct - autoConfig := *b.runConfig - autoConfig.Cmd = autoCmd - - commitCfg := &backend.ContainerCommitConfig{ - ContainerCommitConfig: types.ContainerCommitConfig{ - Author: b.maintainer, - Pause: true, - Config: &autoConfig, - }, - } - - // Commit the container - imageID, err := b.docker.Commit(id, commitCfg) - if err != nil { - return err - } - - b.image = imageID - return nil -} - -type copyInfo struct { - builder.FileInfo - decompress bool -} - -func (b *Builder) runContextCommand(args []string, allowRemote bool, allowLocalDecompression bool, cmdName string) error { - if b.context == nil { - return fmt.Errorf("No context given. Impossible to use %s", cmdName) - } - - if len(args) < 2 { - return fmt.Errorf("Invalid %s format - at least two arguments required", cmdName) - } - - // Work in daemon-specific filepath semantics - dest := filepath.FromSlash(args[len(args)-1]) // last one is always the dest - - b.runConfig.Image = b.image - - var infos []copyInfo - - // Loop through each src file and calculate the info we need to - // do the copy (e.g. hash value if cached). Don't actually do - // the copy until we've looked at all src files - var err error - for _, orig := range args[0 : len(args)-1] { - var fi builder.FileInfo - decompress := allowLocalDecompression - if urlutil.IsURL(orig) { - if !allowRemote { - return fmt.Errorf("Source can't be a URL for %s", cmdName) - } - fi, err = b.download(orig) - if err != nil { - return err - } - defer os.RemoveAll(filepath.Dir(fi.Path())) - decompress = false - infos = append(infos, copyInfo{fi, decompress}) - continue - } - // not a URL - subInfos, err := b.calcCopyInfo(cmdName, orig, allowLocalDecompression, true) - if err != nil { - return err - } - - infos = append(infos, subInfos...) - } - - if len(infos) == 0 { - return fmt.Errorf("No source files were specified") - } - if len(infos) > 1 && !strings.HasSuffix(dest, string(os.PathSeparator)) { - return fmt.Errorf("When using %s with more than one source file, the destination must be a directory and end with a /", cmdName) - } - - // For backwards compat, if there's just one info then use it as the - // cache look-up string, otherwise hash 'em all into one - var srcHash string - var origPaths string - - if len(infos) == 1 { - fi := infos[0].FileInfo - origPaths = fi.Name() - if hfi, ok := fi.(builder.Hashed); ok { - srcHash = hfi.Hash() - } - } else { - var hashs []string - var origs []string - for _, info := range infos { - fi := info.FileInfo - origs = append(origs, fi.Name()) - if hfi, ok := fi.(builder.Hashed); ok { - hashs = append(hashs, hfi.Hash()) - } - } - hasher := sha256.New() - hasher.Write([]byte(strings.Join(hashs, ","))) - srcHash = "multi:" + hex.EncodeToString(hasher.Sum(nil)) - origPaths = strings.Join(origs, " ") - } - - cmd := b.runConfig.Cmd - b.runConfig.Cmd = strslice.StrSlice(append(getShell(b.runConfig), fmt.Sprintf("#(nop) %s %s in %s ", cmdName, srcHash, dest))) - defer func(cmd strslice.StrSlice) { b.runConfig.Cmd = cmd }(cmd) - - if hit, err := b.probeCache(); err != nil { - return err - } else if hit { - return nil - } - - container, err := b.docker.ContainerCreate(types.ContainerCreateConfig{Config: b.runConfig}) - if err != nil { - return err - } - b.tmpContainers[container.ID] = struct{}{} - - comment := fmt.Sprintf("%s %s in %s", cmdName, origPaths, dest) - - // Twiddle the destination when its a relative path - meaning, make it - // relative to the WORKINGDIR - if dest, err = normaliseDest(cmdName, b.runConfig.WorkingDir, dest); err != nil { - return err - } - - for _, info := range infos { - if err := b.docker.CopyOnBuild(container.ID, dest, info.FileInfo, info.decompress); err != nil { - return err - } - } - - return b.commit(container.ID, cmd, comment) -} - -func (b *Builder) download(srcURL string) (fi builder.FileInfo, err error) { - // get filename from URL - u, err := url.Parse(srcURL) - if err != nil { - return - } - path := filepath.FromSlash(u.Path) // Ensure in platform semantics - if strings.HasSuffix(path, string(os.PathSeparator)) { - path = path[:len(path)-1] - } - parts := strings.Split(path, string(os.PathSeparator)) - filename := parts[len(parts)-1] - if filename == "" { - err = fmt.Errorf("cannot determine filename from url: %s", u) - return - } - - // Initiate the download - resp, err := httputils.Download(srcURL) - if err != nil { - return - } - - // Prepare file in a tmp dir - tmpDir, err := ioutils.TempDir("", "docker-remote") - if err != nil { - return - } - defer func() { - if err != nil { - os.RemoveAll(tmpDir) - } - }() - tmpFileName := filepath.Join(tmpDir, filename) - tmpFile, err := os.OpenFile(tmpFileName, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) - if err != nil { - return - } - - stdoutFormatter := b.Stdout.(*streamformatter.StdoutFormatter) - progressOutput := stdoutFormatter.StreamFormatter.NewProgressOutput(stdoutFormatter.Writer, true) - progressReader := progress.NewProgressReader(resp.Body, progressOutput, resp.ContentLength, "", "Downloading") - // Download and dump result to tmp file - if _, err = io.Copy(tmpFile, progressReader); err != nil { - tmpFile.Close() - return - } - fmt.Fprintln(b.Stdout) - // ignoring error because the file was already opened successfully - tmpFileSt, err := tmpFile.Stat() - if err != nil { - tmpFile.Close() - return - } - - // Set the mtime to the Last-Modified header value if present - // Otherwise just remove atime and mtime - mTime := time.Time{} - - lastMod := resp.Header.Get("Last-Modified") - if lastMod != "" { - // If we can't parse it then just let it default to 'zero' - // otherwise use the parsed time value - if parsedMTime, err := http.ParseTime(lastMod); err == nil { - mTime = parsedMTime - } - } - - tmpFile.Close() - - if err = system.Chtimes(tmpFileName, mTime, mTime); err != nil { - return - } - - // Calc the checksum, even if we're using the cache - r, err := archive.Tar(tmpFileName, archive.Uncompressed) - if err != nil { - return - } - tarSum, err := tarsum.NewTarSum(r, true, tarsum.Version1) - if err != nil { - return - } - if _, err = io.Copy(ioutil.Discard, tarSum); err != nil { - return - } - hash := tarSum.Sum(nil) - r.Close() - return &builder.HashedFileInfo{FileInfo: builder.PathFileInfo{FileInfo: tmpFileSt, FilePath: tmpFileName}, FileHash: hash}, nil -} - -func (b *Builder) calcCopyInfo(cmdName, origPath string, allowLocalDecompression, allowWildcards bool) ([]copyInfo, error) { - - // Work in daemon-specific OS filepath semantics - origPath = filepath.FromSlash(origPath) - - if origPath != "" && origPath[0] == os.PathSeparator && len(origPath) > 1 { - origPath = origPath[1:] - } - origPath = strings.TrimPrefix(origPath, "."+string(os.PathSeparator)) - - // Deal with wildcards - if allowWildcards && containsWildcards(origPath) { - var copyInfos []copyInfo - if err := b.context.Walk("", func(path string, info builder.FileInfo, err error) error { - if err != nil { - return err - } - if info.Name() == "" { - // Why are we doing this check? - return nil - } - if match, _ := filepath.Match(origPath, path); !match { - return nil - } - - // Note we set allowWildcards to false in case the name has - // a * in it - subInfos, err := b.calcCopyInfo(cmdName, path, allowLocalDecompression, false) - if err != nil { - return err - } - copyInfos = append(copyInfos, subInfos...) - return nil - }); err != nil { - return nil, err - } - return copyInfos, nil - } - - // Must be a dir or a file - - statPath, fi, err := b.context.Stat(origPath) - if err != nil { - return nil, err - } - - copyInfos := []copyInfo{{FileInfo: fi, decompress: allowLocalDecompression}} - - hfi, handleHash := fi.(builder.Hashed) - if !handleHash { - return copyInfos, nil - } - - // Deal with the single file case - if !fi.IsDir() { - hfi.SetHash("file:" + hfi.Hash()) - return copyInfos, nil - } - // Must be a dir - var subfiles []string - err = b.context.Walk(statPath, func(path string, info builder.FileInfo, err error) error { - if err != nil { - return err - } - // we already checked handleHash above - subfiles = append(subfiles, info.(builder.Hashed).Hash()) - return nil - }) - if err != nil { - return nil, err - } - - sort.Strings(subfiles) - hasher := sha256.New() - hasher.Write([]byte(strings.Join(subfiles, ","))) - hfi.SetHash("dir:" + hex.EncodeToString(hasher.Sum(nil))) - - return copyInfos, nil -} - -func (b *Builder) processImageFrom(img builder.Image) error { - if img != nil { - b.image = img.ImageID() - - if img.RunConfig() != nil { - b.runConfig = img.RunConfig() - } - } - - // Check to see if we have a default PATH, note that windows won't - // have one as its set by HCS - if system.DefaultPathEnv != "" { - // Convert the slice of strings that represent the current list - // of env vars into a map so we can see if PATH is already set. - // If its not set then go ahead and give it our default value - configEnv := opts.ConvertKVStringsToMap(b.runConfig.Env) - if _, ok := configEnv["PATH"]; !ok { - b.runConfig.Env = append(b.runConfig.Env, - "PATH="+system.DefaultPathEnv) - } - } - - if img == nil { - // Typically this means they used "FROM scratch" - return nil - } - - // Process ONBUILD triggers if they exist - if nTriggers := len(b.runConfig.OnBuild); nTriggers != 0 { - word := "trigger" - if nTriggers > 1 { - word = "triggers" - } - fmt.Fprintf(b.Stderr, "# Executing %d build %s...\n", nTriggers, word) - } - - // Copy the ONBUILD triggers, and remove them from the config, since the config will be committed. - onBuildTriggers := b.runConfig.OnBuild - b.runConfig.OnBuild = []string{} - - // parse the ONBUILD triggers by invoking the parser - for _, step := range onBuildTriggers { - ast, err := parser.Parse(strings.NewReader(step), &b.directive) - if err != nil { - return err - } - - total := len(ast.Children) - for _, n := range ast.Children { - if err := b.checkDispatch(n, true); err != nil { - return err - } - } - for i, n := range ast.Children { - if err := b.dispatch(i, total, n); err != nil { - return err - } - } - } - - return nil -} - -// probeCache checks if cache match can be found for current build instruction. -// If an image is found, probeCache returns `(true, nil)`. -// If no image is found, it returns `(false, nil)`. -// If there is any error, it returns `(false, err)`. -func (b *Builder) probeCache() (bool, error) { - c := b.imageCache - if c == nil || b.options.NoCache || b.cacheBusted { - return false, nil - } - cache, err := c.GetCache(b.image, b.runConfig) - if err != nil { - return false, err - } - if len(cache) == 0 { - logrus.Debugf("[BUILDER] Cache miss: %s", b.runConfig.Cmd) - b.cacheBusted = true - return false, nil - } - - fmt.Fprintf(b.Stdout, " ---> Using cache\n") - logrus.Debugf("[BUILDER] Use cached version: %s", b.runConfig.Cmd) - b.image = string(cache) - - return true, nil -} - -func (b *Builder) create() (string, error) { - if b.image == "" && !b.noBaseImage { - return "", fmt.Errorf("Please provide a source image with `from` prior to run") - } - b.runConfig.Image = b.image - - resources := container.Resources{ - CgroupParent: b.options.CgroupParent, - CPUShares: b.options.CPUShares, - CPUPeriod: b.options.CPUPeriod, - CPUQuota: b.options.CPUQuota, - CpusetCpus: b.options.CPUSetCPUs, - CpusetMems: b.options.CPUSetMems, - Memory: b.options.Memory, - MemorySwap: b.options.MemorySwap, - Ulimits: b.options.Ulimits, - } - - // TODO: why not embed a hostconfig in builder? - hostConfig := &container.HostConfig{ - SecurityOpt: b.options.SecurityOpt, - Isolation: b.options.Isolation, - ShmSize: b.options.ShmSize, - Resources: resources, - NetworkMode: container.NetworkMode(b.options.NetworkMode), - } - - config := *b.runConfig - - // Create the container - c, err := b.docker.ContainerCreate(types.ContainerCreateConfig{ - Config: b.runConfig, - HostConfig: hostConfig, - }) - if err != nil { - return "", err - } - for _, warning := range c.Warnings { - fmt.Fprintf(b.Stdout, " ---> [Warning] %s\n", warning) - } - - b.tmpContainers[c.ID] = struct{}{} - fmt.Fprintf(b.Stdout, " ---> Running in %s\n", stringid.TruncateID(c.ID)) - - // override the entry point that may have been picked up from the base image - if err := b.docker.ContainerUpdateCmdOnBuild(c.ID, config.Cmd); err != nil { - return "", err - } - - return c.ID, nil -} - -var errCancelled = errors.New("build cancelled") - -func (b *Builder) run(cID string) (err error) { - errCh := make(chan error) - go func() { - errCh <- b.docker.ContainerAttachRaw(cID, nil, b.Stdout, b.Stderr, true) - }() - - finished := make(chan struct{}) - cancelErrCh := make(chan error, 1) - go func() { - select { - case <-b.clientCtx.Done(): - logrus.Debugln("Build cancelled, killing and removing container:", cID) - b.docker.ContainerKill(cID, 0) - b.removeContainer(cID) - cancelErrCh <- errCancelled - case <-finished: - cancelErrCh <- nil - } - }() - - if err := b.docker.ContainerStart(cID, nil, "", ""); err != nil { - close(finished) - if cancelErr := <-cancelErrCh; cancelErr != nil { - logrus.Debugf("Build cancelled (%v) and got an error from ContainerStart: %v", - cancelErr, err) - } - return err - } - - // Block on reading output from container, stop on err or chan closed - if err := <-errCh; err != nil { - close(finished) - if cancelErr := <-cancelErrCh; cancelErr != nil { - logrus.Debugf("Build cancelled (%v) and got an error from errCh: %v", - cancelErr, err) - } - return err - } - - if ret, _ := b.docker.ContainerWait(cID, -1); ret != 0 { - close(finished) - if cancelErr := <-cancelErrCh; cancelErr != nil { - logrus.Debugf("Build cancelled (%v) and got a non-zero code from ContainerWait: %d", - cancelErr, ret) - } - // TODO: change error type, because jsonmessage.JSONError assumes HTTP - return &jsonmessage.JSONError{ - Message: fmt.Sprintf("The command '%s' returned a non-zero code: %d", strings.Join(b.runConfig.Cmd, " "), ret), - Code: ret, - } - } - close(finished) - return <-cancelErrCh -} - -func (b *Builder) removeContainer(c string) error { - rmConfig := &types.ContainerRmConfig{ - ForceRemove: true, - RemoveVolume: true, - } - if err := b.docker.ContainerRm(c, rmConfig); err != nil { - fmt.Fprintf(b.Stdout, "Error removing intermediate container %s: %v\n", stringid.TruncateID(c), err) - return err - } - return nil -} - -func (b *Builder) clearTmp() { - for c := range b.tmpContainers { - if err := b.removeContainer(c); err != nil { - return - } - delete(b.tmpContainers, c) - fmt.Fprintf(b.Stdout, "Removing intermediate container %s\n", stringid.TruncateID(c)) - } -} - -// readDockerfile reads a Dockerfile from the current context. -func (b *Builder) readDockerfile() error { - // If no -f was specified then look for 'Dockerfile'. If we can't find - // that then look for 'dockerfile'. If neither are found then default - // back to 'Dockerfile' and use that in the error message. - if b.options.Dockerfile == "" { - b.options.Dockerfile = builder.DefaultDockerfileName - if _, _, err := b.context.Stat(b.options.Dockerfile); os.IsNotExist(err) { - lowercase := strings.ToLower(b.options.Dockerfile) - if _, _, err := b.context.Stat(lowercase); err == nil { - b.options.Dockerfile = lowercase - } - } - } - - err := b.parseDockerfile() - - if err != nil { - return err - } - - // After the Dockerfile has been parsed, we need to check the .dockerignore - // file for either "Dockerfile" or ".dockerignore", and if either are - // present then erase them from the build context. These files should never - // have been sent from the client but we did send them to make sure that - // we had the Dockerfile to actually parse, and then we also need the - // .dockerignore file to know whether either file should be removed. - // Note that this assumes the Dockerfile has been read into memory and - // is now safe to be removed. - if dockerIgnore, ok := b.context.(builder.DockerIgnoreContext); ok { - dockerIgnore.Process([]string{b.options.Dockerfile}) - } - return nil -} - -func (b *Builder) parseDockerfile() error { - f, err := b.context.Open(b.options.Dockerfile) - if err != nil { - if os.IsNotExist(err) { - return fmt.Errorf("Cannot locate specified Dockerfile: %s", b.options.Dockerfile) - } - return err - } - defer f.Close() - if f, ok := f.(*os.File); ok { - // ignoring error because Open already succeeded - fi, err := f.Stat() - if err != nil { - return fmt.Errorf("Unexpected error reading Dockerfile: %v", err) - } - if fi.Size() == 0 { - return fmt.Errorf("The Dockerfile (%s) cannot be empty", b.options.Dockerfile) - } - } - b.dockerfile, err = parser.Parse(f, &b.directive) - if err != nil { - return err - } - - return nil -} - -// determine if build arg is part of built-in args or user -// defined args in Dockerfile at any point in time. -func (b *Builder) isBuildArgAllowed(arg string) bool { - if _, ok := BuiltinAllowedBuildArgs[arg]; ok { - return true - } - if _, ok := b.allowedBuildArgs[arg]; ok { - return true - } - return false -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/internals_test.go b/vendor/github.com/docker/docker/builder/dockerfile/internals_test.go deleted file mode 100644 index d170d8e25..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/internals_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package dockerfile - -import ( - "fmt" - "strings" - "testing" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/builder" - "github.com/docker/docker/pkg/archive" -) - -func TestEmptyDockerfile(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-dockerfile-test") - defer cleanup() - - createTestTempFile(t, contextDir, builder.DefaultDockerfileName, "", 0777) - - readAndCheckDockerfile(t, "emptyDockefile", contextDir, "", "The Dockerfile (Dockerfile) cannot be empty") -} - -func TestSymlinkDockerfile(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-dockerfile-test") - defer cleanup() - - createTestSymlink(t, contextDir, builder.DefaultDockerfileName, "/etc/passwd") - - // The reason the error is "Cannot locate specified Dockerfile" is because - // in the builder, the symlink is resolved within the context, therefore - // Dockerfile -> /etc/passwd becomes etc/passwd from the context which is - // a nonexistent file. - expectedError := fmt.Sprintf("Cannot locate specified Dockerfile: %s", builder.DefaultDockerfileName) - - readAndCheckDockerfile(t, "symlinkDockerfile", contextDir, builder.DefaultDockerfileName, expectedError) -} - -func TestDockerfileOutsideTheBuildContext(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-dockerfile-test") - defer cleanup() - - expectedError := "Forbidden path outside the build context" - - readAndCheckDockerfile(t, "DockerfileOutsideTheBuildContext", contextDir, "../../Dockerfile", expectedError) -} - -func TestNonExistingDockerfile(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-dockerfile-test") - defer cleanup() - - expectedError := "Cannot locate specified Dockerfile: Dockerfile" - - readAndCheckDockerfile(t, "NonExistingDockerfile", contextDir, "Dockerfile", expectedError) -} - -func readAndCheckDockerfile(t *testing.T, testName, contextDir, dockerfilePath, expectedError string) { - tarStream, err := archive.Tar(contextDir, archive.Uncompressed) - - if err != nil { - t.Fatalf("Error when creating tar stream: %s", err) - } - - defer func() { - if err = tarStream.Close(); err != nil { - t.Fatalf("Error when closing tar stream: %s", err) - } - }() - - context, err := builder.MakeTarSumContext(tarStream) - - if err != nil { - t.Fatalf("Error when creating tar context: %s", err) - } - - defer func() { - if err = context.Close(); err != nil { - t.Fatalf("Error when closing tar context: %s", err) - } - }() - - options := &types.ImageBuildOptions{ - Dockerfile: dockerfilePath, - } - - b := &Builder{options: options, context: context} - - err = b.readDockerfile() - - if err == nil { - t.Fatalf("No error when executing test: %s", testName) - } - - if !strings.Contains(err.Error(), expectedError) { - t.Fatalf("Wrong error message. Should be \"%s\". Got \"%s\"", expectedError, err.Error()) - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/internals_unix.go b/vendor/github.com/docker/docker/builder/dockerfile/internals_unix.go deleted file mode 100644 index a8a47c358..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/internals_unix.go +++ /dev/null @@ -1,38 +0,0 @@ -// +build !windows - -package dockerfile - -import ( - "os" - "path/filepath" - "strings" - - "github.com/docker/docker/pkg/system" -) - -// normaliseDest normalises the destination of a COPY/ADD command in a -// platform semantically consistent way. -func normaliseDest(cmdName, workingDir, requested string) (string, error) { - dest := filepath.FromSlash(requested) - endsInSlash := strings.HasSuffix(requested, string(os.PathSeparator)) - if !system.IsAbs(requested) { - dest = filepath.Join(string(os.PathSeparator), filepath.FromSlash(workingDir), dest) - // Make sure we preserve any trailing slash - if endsInSlash { - dest += string(os.PathSeparator) - } - } - return dest, nil -} - -func containsWildcards(name string) bool { - for i := 0; i < len(name); i++ { - ch := name[i] - if ch == '\\' { - i++ - } else if ch == '*' || ch == '?' || ch == '[' { - return true - } - } - return false -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/internals_windows.go b/vendor/github.com/docker/docker/builder/dockerfile/internals_windows.go deleted file mode 100644 index f60b11204..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/internals_windows.go +++ /dev/null @@ -1,66 +0,0 @@ -package dockerfile - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/docker/docker/pkg/system" -) - -// normaliseDest normalises the destination of a COPY/ADD command in a -// platform semantically consistent way. -func normaliseDest(cmdName, workingDir, requested string) (string, error) { - dest := filepath.FromSlash(requested) - endsInSlash := strings.HasSuffix(dest, string(os.PathSeparator)) - - // We are guaranteed that the working directory is already consistent, - // However, Windows also has, for now, the limitation that ADD/COPY can - // only be done to the system drive, not any drives that might be present - // as a result of a bind mount. - // - // So... if the path requested is Linux-style absolute (/foo or \\foo), - // we assume it is the system drive. If it is a Windows-style absolute - // (DRIVE:\\foo), error if DRIVE is not C. And finally, ensure we - // strip any configured working directories drive letter so that it - // can be subsequently legitimately converted to a Windows volume-style - // pathname. - - // Not a typo - filepath.IsAbs, not system.IsAbs on this next check as - // we only want to validate where the DriveColon part has been supplied. - if filepath.IsAbs(dest) { - if strings.ToUpper(string(dest[0])) != "C" { - return "", fmt.Errorf("Windows does not support %s with a destinations not on the system drive (C:)", cmdName) - } - dest = dest[2:] // Strip the drive letter - } - - // Cannot handle relative where WorkingDir is not the system drive. - if len(workingDir) > 0 { - if ((len(workingDir) > 1) && !system.IsAbs(workingDir[2:])) || (len(workingDir) == 1) { - return "", fmt.Errorf("Current WorkingDir %s is not platform consistent", workingDir) - } - if !system.IsAbs(dest) { - if string(workingDir[0]) != "C" { - return "", fmt.Errorf("Windows does not support %s with relative paths when WORKDIR is not the system drive", cmdName) - } - dest = filepath.Join(string(os.PathSeparator), workingDir[2:], dest) - // Make sure we preserve any trailing slash - if endsInSlash { - dest += string(os.PathSeparator) - } - } - } - return dest, nil -} - -func containsWildcards(name string) bool { - for i := 0; i < len(name); i++ { - ch := name[i] - if ch == '*' || ch == '?' || ch == '[' { - return true - } - } - return false -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/internals_windows_test.go b/vendor/github.com/docker/docker/builder/dockerfile/internals_windows_test.go deleted file mode 100644 index 868a6671a..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/internals_windows_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// +build windows - -package dockerfile - -import "testing" - -func TestNormaliseDest(t *testing.T) { - tests := []struct{ current, requested, expected, etext string }{ - {``, `D:\`, ``, `Windows does not support TEST with a destinations not on the system drive (C:)`}, - {``, `e:/`, ``, `Windows does not support TEST with a destinations not on the system drive (C:)`}, - {`invalid`, `./c1`, ``, `Current WorkingDir invalid is not platform consistent`}, - {`C:`, ``, ``, `Current WorkingDir C: is not platform consistent`}, - {`C`, ``, ``, `Current WorkingDir C is not platform consistent`}, - {`D:\`, `.`, ``, "Windows does not support TEST with relative paths when WORKDIR is not the system drive"}, - {``, `D`, `D`, ``}, - {``, `./a1`, `.\a1`, ``}, - {``, `.\b1`, `.\b1`, ``}, - {``, `/`, `\`, ``}, - {``, `\`, `\`, ``}, - {``, `c:/`, `\`, ``}, - {``, `c:\`, `\`, ``}, - {``, `.`, `.`, ``}, - {`C:\wdd`, `./a1`, `\wdd\a1`, ``}, - {`C:\wde`, `.\b1`, `\wde\b1`, ``}, - {`C:\wdf`, `/`, `\`, ``}, - {`C:\wdg`, `\`, `\`, ``}, - {`C:\wdh`, `c:/`, `\`, ``}, - {`C:\wdi`, `c:\`, `\`, ``}, - {`C:\wdj`, `.`, `\wdj`, ``}, - {`C:\wdk`, `foo/bar`, `\wdk\foo\bar`, ``}, - {`C:\wdl`, `foo\bar`, `\wdl\foo\bar`, ``}, - {`C:\wdm`, `foo/bar/`, `\wdm\foo\bar\`, ``}, - {`C:\wdn`, `foo\bar/`, `\wdn\foo\bar\`, ``}, - } - for _, i := range tests { - got, err := normaliseDest("TEST", i.current, i.requested) - if err != nil && i.etext == "" { - t.Fatalf("TestNormaliseDest Got unexpected error %q for %s %s. ", err.Error(), i.current, i.requested) - } - if i.etext != "" && ((err == nil) || (err != nil && err.Error() != i.etext)) { - if err == nil { - t.Fatalf("TestNormaliseDest Expected an error for %s %s but didn't get one", i.current, i.requested) - } else { - t.Fatalf("TestNormaliseDest Wrong error text for %s %s - %s", i.current, i.requested, err.Error()) - } - } - if i.etext == "" && got != i.expected { - t.Fatalf("TestNormaliseDest Expected %q for %q and %q. Got %q", i.expected, i.current, i.requested, got) - } - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/dumper/main.go b/vendor/github.com/docker/docker/builder/dockerfile/parser/dumper/main.go deleted file mode 100644 index fff3046fd..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/dumper/main.go +++ /dev/null @@ -1,36 +0,0 @@ -package main - -import ( - "fmt" - "os" - - "github.com/docker/docker/builder/dockerfile/parser" -) - -func main() { - var f *os.File - var err error - - if len(os.Args) < 2 { - fmt.Println("please supply filename(s)") - os.Exit(1) - } - - for _, fn := range os.Args[1:] { - f, err = os.Open(fn) - if err != nil { - panic(err) - } - defer f.Close() - - d := parser.Directive{LookingForDirectives: true} - parser.SetEscapeToken(parser.DefaultEscapeToken, &d) - - ast, err := parser.Parse(f, &d) - if err != nil { - panic(err) - } else { - fmt.Println(ast.Dump()) - } - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/json_test.go b/vendor/github.com/docker/docker/builder/dockerfile/parser/json_test.go deleted file mode 100644 index 60d74d9c3..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/json_test.go +++ /dev/null @@ -1,61 +0,0 @@ -package parser - -import ( - "testing" -) - -var invalidJSONArraysOfStrings = []string{ - `["a",42,"b"]`, - `["a",123.456,"b"]`, - `["a",{},"b"]`, - `["a",{"c": "d"},"b"]`, - `["a",["c"],"b"]`, - `["a",true,"b"]`, - `["a",false,"b"]`, - `["a",null,"b"]`, -} - -var validJSONArraysOfStrings = map[string][]string{ - `[]`: {}, - `[""]`: {""}, - `["a"]`: {"a"}, - `["a","b"]`: {"a", "b"}, - `[ "a", "b" ]`: {"a", "b"}, - `[ "a", "b" ]`: {"a", "b"}, - ` [ "a", "b" ] `: {"a", "b"}, - `["abc 123", "♥", "☃", "\" \\ \/ \b \f \n \r \t \u0000"]`: {"abc 123", "♥", "☃", "\" \\ / \b \f \n \r \t \u0000"}, -} - -func TestJSONArraysOfStrings(t *testing.T) { - for json, expected := range validJSONArraysOfStrings { - d := Directive{} - SetEscapeToken(DefaultEscapeToken, &d) - - if node, _, err := parseJSON(json, &d); err != nil { - t.Fatalf("%q should be a valid JSON array of strings, but wasn't! (err: %q)", json, err) - } else { - i := 0 - for node != nil { - if i >= len(expected) { - t.Fatalf("expected result is shorter than parsed result (%d vs %d+) in %q", len(expected), i+1, json) - } - if node.Value != expected[i] { - t.Fatalf("expected %q (not %q) in %q at pos %d", expected[i], node.Value, json, i) - } - node = node.Next - i++ - } - if i != len(expected) { - t.Fatalf("expected result is longer than parsed result (%d vs %d) in %q", len(expected), i+1, json) - } - } - } - for _, json := range invalidJSONArraysOfStrings { - d := Directive{} - SetEscapeToken(DefaultEscapeToken, &d) - - if _, _, err := parseJSON(json, &d); err != errDockerfileNotStringArray { - t.Fatalf("%q should be an invalid JSON array of strings, but wasn't!", json) - } - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/line_parsers.go b/vendor/github.com/docker/docker/builder/dockerfile/parser/line_parsers.go deleted file mode 100644 index d2bf2b01b..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/line_parsers.go +++ /dev/null @@ -1,361 +0,0 @@ -package parser - -// line parsers are dispatch calls that parse a single unit of text into a -// Node object which contains the whole statement. Dockerfiles have varied -// (but not usually unique, see ONBUILD for a unique example) parsing rules -// per-command, and these unify the processing in a way that makes it -// manageable. - -import ( - "encoding/json" - "errors" - "fmt" - "strings" - "unicode" - "unicode/utf8" -) - -var ( - errDockerfileNotStringArray = errors.New("When using JSON array syntax, arrays must be comprised of strings only.") -) - -// ignore the current argument. This will still leave a command parsed, but -// will not incorporate the arguments into the ast. -func parseIgnore(rest string, d *Directive) (*Node, map[string]bool, error) { - return &Node{}, nil, nil -} - -// used for onbuild. Could potentially be used for anything that represents a -// statement with sub-statements. -// -// ONBUILD RUN foo bar -> (onbuild (run foo bar)) -// -func parseSubCommand(rest string, d *Directive) (*Node, map[string]bool, error) { - if rest == "" { - return nil, nil, nil - } - - _, child, err := ParseLine(rest, d, false) - if err != nil { - return nil, nil, err - } - - return &Node{Children: []*Node{child}}, nil, nil -} - -// helper to parse words (i.e space delimited or quoted strings) in a statement. -// The quotes are preserved as part of this function and they are stripped later -// as part of processWords(). -func parseWords(rest string, d *Directive) []string { - const ( - inSpaces = iota // looking for start of a word - inWord - inQuote - ) - - words := []string{} - phase := inSpaces - word := "" - quote := '\000' - blankOK := false - var ch rune - var chWidth int - - for pos := 0; pos <= len(rest); pos += chWidth { - if pos != len(rest) { - ch, chWidth = utf8.DecodeRuneInString(rest[pos:]) - } - - if phase == inSpaces { // Looking for start of word - if pos == len(rest) { // end of input - break - } - if unicode.IsSpace(ch) { // skip spaces - continue - } - phase = inWord // found it, fall through - } - if (phase == inWord || phase == inQuote) && (pos == len(rest)) { - if blankOK || len(word) > 0 { - words = append(words, word) - } - break - } - if phase == inWord { - if unicode.IsSpace(ch) { - phase = inSpaces - if blankOK || len(word) > 0 { - words = append(words, word) - } - word = "" - blankOK = false - continue - } - if ch == '\'' || ch == '"' { - quote = ch - blankOK = true - phase = inQuote - } - if ch == d.EscapeToken { - if pos+chWidth == len(rest) { - continue // just skip an escape token at end of line - } - // If we're not quoted and we see an escape token, then always just - // add the escape token plus the char to the word, even if the char - // is a quote. - word += string(ch) - pos += chWidth - ch, chWidth = utf8.DecodeRuneInString(rest[pos:]) - } - word += string(ch) - continue - } - if phase == inQuote { - if ch == quote { - phase = inWord - } - // The escape token is special except for ' quotes - can't escape anything for ' - if ch == d.EscapeToken && quote != '\'' { - if pos+chWidth == len(rest) { - phase = inWord - continue // just skip the escape token at end - } - pos += chWidth - word += string(ch) - ch, chWidth = utf8.DecodeRuneInString(rest[pos:]) - } - word += string(ch) - } - } - - return words -} - -// parse environment like statements. Note that this does *not* handle -// variable interpolation, which will be handled in the evaluator. -func parseNameVal(rest string, key string, d *Directive) (*Node, map[string]bool, error) { - // This is kind of tricky because we need to support the old - // variant: KEY name value - // as well as the new one: KEY name=value ... - // The trigger to know which one is being used will be whether we hit - // a space or = first. space ==> old, "=" ==> new - - words := parseWords(rest, d) - if len(words) == 0 { - return nil, nil, nil - } - - var rootnode *Node - - // Old format (KEY name value) - if !strings.Contains(words[0], "=") { - node := &Node{} - rootnode = node - strs := tokenWhitespace.Split(rest, 2) - - if len(strs) < 2 { - return nil, nil, fmt.Errorf(key + " must have two arguments") - } - - node.Value = strs[0] - node.Next = &Node{} - node.Next.Value = strs[1] - } else { - var prevNode *Node - for i, word := range words { - if !strings.Contains(word, "=") { - return nil, nil, fmt.Errorf("Syntax error - can't find = in %q. Must be of the form: name=value", word) - } - parts := strings.SplitN(word, "=", 2) - - name := &Node{} - value := &Node{} - - name.Next = value - name.Value = parts[0] - value.Value = parts[1] - - if i == 0 { - rootnode = name - } else { - prevNode.Next = name - } - prevNode = value - } - } - - return rootnode, nil, nil -} - -func parseEnv(rest string, d *Directive) (*Node, map[string]bool, error) { - return parseNameVal(rest, "ENV", d) -} - -func parseLabel(rest string, d *Directive) (*Node, map[string]bool, error) { - return parseNameVal(rest, "LABEL", d) -} - -// parses a statement containing one or more keyword definition(s) and/or -// value assignments, like `name1 name2= name3="" name4=value`. -// Note that this is a stricter format than the old format of assignment, -// allowed by parseNameVal(), in a way that this only allows assignment of the -// form `keyword=[]` like `name2=`, `name3=""`, and `name4=value` above. -// In addition, a keyword definition alone is of the form `keyword` like `name1` -// above. And the assignments `name2=` and `name3=""` are equivalent and -// assign an empty value to the respective keywords. -func parseNameOrNameVal(rest string, d *Directive) (*Node, map[string]bool, error) { - words := parseWords(rest, d) - if len(words) == 0 { - return nil, nil, nil - } - - var ( - rootnode *Node - prevNode *Node - ) - for i, word := range words { - node := &Node{} - node.Value = word - if i == 0 { - rootnode = node - } else { - prevNode.Next = node - } - prevNode = node - } - - return rootnode, nil, nil -} - -// parses a whitespace-delimited set of arguments. The result is effectively a -// linked list of string arguments. -func parseStringsWhitespaceDelimited(rest string, d *Directive) (*Node, map[string]bool, error) { - if rest == "" { - return nil, nil, nil - } - - node := &Node{} - rootnode := node - prevnode := node - for _, str := range tokenWhitespace.Split(rest, -1) { // use regexp - prevnode = node - node.Value = str - node.Next = &Node{} - node = node.Next - } - - // XXX to get around regexp.Split *always* providing an empty string at the - // end due to how our loop is constructed, nil out the last node in the - // chain. - prevnode.Next = nil - - return rootnode, nil, nil -} - -// parsestring just wraps the string in quotes and returns a working node. -func parseString(rest string, d *Directive) (*Node, map[string]bool, error) { - if rest == "" { - return nil, nil, nil - } - n := &Node{} - n.Value = rest - return n, nil, nil -} - -// parseJSON converts JSON arrays to an AST. -func parseJSON(rest string, d *Directive) (*Node, map[string]bool, error) { - rest = strings.TrimLeftFunc(rest, unicode.IsSpace) - if !strings.HasPrefix(rest, "[") { - return nil, nil, fmt.Errorf(`Error parsing "%s" as a JSON array`, rest) - } - - var myJSON []interface{} - if err := json.NewDecoder(strings.NewReader(rest)).Decode(&myJSON); err != nil { - return nil, nil, err - } - - var top, prev *Node - for _, str := range myJSON { - s, ok := str.(string) - if !ok { - return nil, nil, errDockerfileNotStringArray - } - - node := &Node{Value: s} - if prev == nil { - top = node - } else { - prev.Next = node - } - prev = node - } - - return top, map[string]bool{"json": true}, nil -} - -// parseMaybeJSON determines if the argument appears to be a JSON array. If -// so, passes to parseJSON; if not, quotes the result and returns a single -// node. -func parseMaybeJSON(rest string, d *Directive) (*Node, map[string]bool, error) { - if rest == "" { - return nil, nil, nil - } - - node, attrs, err := parseJSON(rest, d) - - if err == nil { - return node, attrs, nil - } - if err == errDockerfileNotStringArray { - return nil, nil, err - } - - node = &Node{} - node.Value = rest - return node, nil, nil -} - -// parseMaybeJSONToList determines if the argument appears to be a JSON array. If -// so, passes to parseJSON; if not, attempts to parse it as a whitespace -// delimited string. -func parseMaybeJSONToList(rest string, d *Directive) (*Node, map[string]bool, error) { - node, attrs, err := parseJSON(rest, d) - - if err == nil { - return node, attrs, nil - } - if err == errDockerfileNotStringArray { - return nil, nil, err - } - - return parseStringsWhitespaceDelimited(rest, d) -} - -// The HEALTHCHECK command is like parseMaybeJSON, but has an extra type argument. -func parseHealthConfig(rest string, d *Directive) (*Node, map[string]bool, error) { - // Find end of first argument - var sep int - for ; sep < len(rest); sep++ { - if unicode.IsSpace(rune(rest[sep])) { - break - } - } - next := sep - for ; next < len(rest); next++ { - if !unicode.IsSpace(rune(rest[next])) { - break - } - } - - if sep == 0 { - return nil, nil, nil - } - - typ := rest[:sep] - cmd, attrs, err := parseMaybeJSON(rest[next:], d) - if err != nil { - return nil, nil, err - } - - return &Node{Value: typ, Next: cmd}, attrs, err -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/parser.go b/vendor/github.com/docker/docker/builder/dockerfile/parser/parser.go deleted file mode 100644 index e53464449..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/parser.go +++ /dev/null @@ -1,221 +0,0 @@ -// Package parser implements a parser and parse tree dumper for Dockerfiles. -package parser - -import ( - "bufio" - "bytes" - "fmt" - "io" - "regexp" - "strings" - "unicode" - - "github.com/docker/docker/builder/dockerfile/command" -) - -// Node is a structure used to represent a parse tree. -// -// In the node there are three fields, Value, Next, and Children. Value is the -// current token's string value. Next is always the next non-child token, and -// children contains all the children. Here's an example: -// -// (value next (child child-next child-next-next) next-next) -// -// This data structure is frankly pretty lousy for handling complex languages, -// but lucky for us the Dockerfile isn't very complicated. This structure -// works a little more effectively than a "proper" parse tree for our needs. -// -type Node struct { - Value string // actual content - Next *Node // the next item in the current sexp - Children []*Node // the children of this sexp - Attributes map[string]bool // special attributes for this node - Original string // original line used before parsing - Flags []string // only top Node should have this set - StartLine int // the line in the original dockerfile where the node begins - EndLine int // the line in the original dockerfile where the node ends -} - -// Directive is the structure used during a build run to hold the state of -// parsing directives. -type Directive struct { - EscapeToken rune // Current escape token - LineContinuationRegex *regexp.Regexp // Current line contination regex - LookingForDirectives bool // Whether we are currently looking for directives - EscapeSeen bool // Whether the escape directive has been seen -} - -var ( - dispatch map[string]func(string, *Directive) (*Node, map[string]bool, error) - tokenWhitespace = regexp.MustCompile(`[\t\v\f\r ]+`) - tokenEscapeCommand = regexp.MustCompile(`^#[ \t]*escape[ \t]*=[ \t]*(?P.).*$`) - tokenComment = regexp.MustCompile(`^#.*$`) -) - -// DefaultEscapeToken is the default escape token -const DefaultEscapeToken = "\\" - -// SetEscapeToken sets the default token for escaping characters in a Dockerfile. -func SetEscapeToken(s string, d *Directive) error { - if s != "`" && s != "\\" { - return fmt.Errorf("invalid ESCAPE '%s'. Must be ` or \\", s) - } - d.EscapeToken = rune(s[0]) - d.LineContinuationRegex = regexp.MustCompile(`\` + s + `[ \t]*$`) - return nil -} - -func init() { - // Dispatch Table. see line_parsers.go for the parse functions. - // The command is parsed and mapped to the line parser. The line parser - // receives the arguments but not the command, and returns an AST after - // reformulating the arguments according to the rules in the parser - // functions. Errors are propagated up by Parse() and the resulting AST can - // be incorporated directly into the existing AST as a next. - dispatch = map[string]func(string, *Directive) (*Node, map[string]bool, error){ - command.Add: parseMaybeJSONToList, - command.Arg: parseNameOrNameVal, - command.Cmd: parseMaybeJSON, - command.Copy: parseMaybeJSONToList, - command.Entrypoint: parseMaybeJSON, - command.Env: parseEnv, - command.Expose: parseStringsWhitespaceDelimited, - command.From: parseString, - command.Healthcheck: parseHealthConfig, - command.Label: parseLabel, - command.Maintainer: parseString, - command.Onbuild: parseSubCommand, - command.Run: parseMaybeJSON, - command.Shell: parseMaybeJSON, - command.StopSignal: parseString, - command.User: parseString, - command.Volume: parseMaybeJSONToList, - command.Workdir: parseString, - } -} - -// ParseLine parses a line and returns the remainder. -func ParseLine(line string, d *Directive, ignoreCont bool) (string, *Node, error) { - // Handle the parser directive '# escape=. Parser directives must precede - // any builder instruction or other comments, and cannot be repeated. - if d.LookingForDirectives { - tecMatch := tokenEscapeCommand.FindStringSubmatch(strings.ToLower(line)) - if len(tecMatch) > 0 { - if d.EscapeSeen == true { - return "", nil, fmt.Errorf("only one escape parser directive can be used") - } - for i, n := range tokenEscapeCommand.SubexpNames() { - if n == "escapechar" { - if err := SetEscapeToken(tecMatch[i], d); err != nil { - return "", nil, err - } - d.EscapeSeen = true - return "", nil, nil - } - } - } - } - - d.LookingForDirectives = false - - if line = stripComments(line); line == "" { - return "", nil, nil - } - - if !ignoreCont && d.LineContinuationRegex.MatchString(line) { - line = d.LineContinuationRegex.ReplaceAllString(line, "") - return line, nil, nil - } - - cmd, flags, args, err := splitCommand(line) - if err != nil { - return "", nil, err - } - - node := &Node{} - node.Value = cmd - - sexp, attrs, err := fullDispatch(cmd, args, d) - if err != nil { - return "", nil, err - } - - node.Next = sexp - node.Attributes = attrs - node.Original = line - node.Flags = flags - - return "", node, nil -} - -// Parse is the main parse routine. -// It handles an io.ReadWriteCloser and returns the root of the AST. -func Parse(rwc io.Reader, d *Directive) (*Node, error) { - currentLine := 0 - root := &Node{} - root.StartLine = -1 - scanner := bufio.NewScanner(rwc) - - utf8bom := []byte{0xEF, 0xBB, 0xBF} - for scanner.Scan() { - scannedBytes := scanner.Bytes() - // We trim UTF8 BOM - if currentLine == 0 { - scannedBytes = bytes.TrimPrefix(scannedBytes, utf8bom) - } - scannedLine := strings.TrimLeftFunc(string(scannedBytes), unicode.IsSpace) - currentLine++ - line, child, err := ParseLine(scannedLine, d, false) - if err != nil { - return nil, err - } - startLine := currentLine - - if line != "" && child == nil { - for scanner.Scan() { - newline := scanner.Text() - currentLine++ - - if stripComments(strings.TrimSpace(newline)) == "" { - continue - } - - line, child, err = ParseLine(line+newline, d, false) - if err != nil { - return nil, err - } - - if child != nil { - break - } - } - if child == nil && line != "" { - // When we call ParseLine we'll pass in 'true' for - // the ignoreCont param if we're at the EOF. This will - // prevent the func from returning immediately w/o - // parsing the line thinking that there's more input - // to come. - - _, child, err = ParseLine(line, d, scanner.Err() == nil) - if err != nil { - return nil, err - } - } - } - - if child != nil { - // Update the line information for the current child. - child.StartLine = startLine - child.EndLine = currentLine - // Update the line information for the root. The starting line of the root is always the - // starting line of the first child and the ending line is the ending line of the last child. - if root.StartLine < 0 { - root.StartLine = currentLine - } - root.EndLine = currentLine - root.Children = append(root.Children, child) - } - } - - return root, nil -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/parser_test.go b/vendor/github.com/docker/docker/builder/dockerfile/parser/parser_test.go deleted file mode 100644 index e8e26961d..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/parser_test.go +++ /dev/null @@ -1,173 +0,0 @@ -package parser - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "testing" -) - -const testDir = "testfiles" -const negativeTestDir = "testfiles-negative" -const testFileLineInfo = "testfile-line/Dockerfile" - -func getDirs(t *testing.T, dir string) []string { - f, err := os.Open(dir) - if err != nil { - t.Fatal(err) - } - - defer f.Close() - - dirs, err := f.Readdirnames(0) - if err != nil { - t.Fatal(err) - } - - return dirs -} - -func TestTestNegative(t *testing.T) { - for _, dir := range getDirs(t, negativeTestDir) { - dockerfile := filepath.Join(negativeTestDir, dir, "Dockerfile") - - df, err := os.Open(dockerfile) - if err != nil { - t.Fatalf("Dockerfile missing for %s: %v", dir, err) - } - defer df.Close() - - d := Directive{LookingForDirectives: true} - SetEscapeToken(DefaultEscapeToken, &d) - _, err = Parse(df, &d) - if err == nil { - t.Fatalf("No error parsing broken dockerfile for %s", dir) - } - } -} - -func TestTestData(t *testing.T) { - for _, dir := range getDirs(t, testDir) { - dockerfile := filepath.Join(testDir, dir, "Dockerfile") - resultfile := filepath.Join(testDir, dir, "result") - - df, err := os.Open(dockerfile) - if err != nil { - t.Fatalf("Dockerfile missing for %s: %v", dir, err) - } - defer df.Close() - - d := Directive{LookingForDirectives: true} - SetEscapeToken(DefaultEscapeToken, &d) - ast, err := Parse(df, &d) - if err != nil { - t.Fatalf("Error parsing %s's dockerfile: %v", dir, err) - } - - content, err := ioutil.ReadFile(resultfile) - if err != nil { - t.Fatalf("Error reading %s's result file: %v", dir, err) - } - - if runtime.GOOS == "windows" { - // CRLF --> CR to match Unix behavior - content = bytes.Replace(content, []byte{'\x0d', '\x0a'}, []byte{'\x0a'}, -1) - } - - if ast.Dump()+"\n" != string(content) { - fmt.Fprintln(os.Stderr, "Result:\n"+ast.Dump()) - fmt.Fprintln(os.Stderr, "Expected:\n"+string(content)) - t.Fatalf("%s: AST dump of dockerfile does not match result", dir) - } - } -} - -func TestParseWords(t *testing.T) { - tests := []map[string][]string{ - { - "input": {"foo"}, - "expect": {"foo"}, - }, - { - "input": {"foo bar"}, - "expect": {"foo", "bar"}, - }, - { - "input": {"foo\\ bar"}, - "expect": {"foo\\ bar"}, - }, - { - "input": {"foo=bar"}, - "expect": {"foo=bar"}, - }, - { - "input": {"foo bar 'abc xyz'"}, - "expect": {"foo", "bar", "'abc xyz'"}, - }, - { - "input": {`foo bar "abc xyz"`}, - "expect": {"foo", "bar", `"abc xyz"`}, - }, - { - "input": {"àöû"}, - "expect": {"àöû"}, - }, - { - "input": {`föo bàr "âbc xÿz"`}, - "expect": {"föo", "bàr", `"âbc xÿz"`}, - }, - } - - for _, test := range tests { - d := Directive{LookingForDirectives: true} - SetEscapeToken(DefaultEscapeToken, &d) - words := parseWords(test["input"][0], &d) - if len(words) != len(test["expect"]) { - t.Fatalf("length check failed. input: %v, expect: %q, output: %q", test["input"][0], test["expect"], words) - } - for i, word := range words { - if word != test["expect"][i] { - t.Fatalf("word check failed for word: %q. input: %q, expect: %q, output: %q", word, test["input"][0], test["expect"], words) - } - } - } -} - -func TestLineInformation(t *testing.T) { - df, err := os.Open(testFileLineInfo) - if err != nil { - t.Fatalf("Dockerfile missing for %s: %v", testFileLineInfo, err) - } - defer df.Close() - - d := Directive{LookingForDirectives: true} - SetEscapeToken(DefaultEscapeToken, &d) - ast, err := Parse(df, &d) - if err != nil { - t.Fatalf("Error parsing dockerfile %s: %v", testFileLineInfo, err) - } - - if ast.StartLine != 5 || ast.EndLine != 31 { - fmt.Fprintf(os.Stderr, "Wrong root line information: expected(%d-%d), actual(%d-%d)\n", 5, 31, ast.StartLine, ast.EndLine) - t.Fatalf("Root line information doesn't match result.") - } - if len(ast.Children) != 3 { - fmt.Fprintf(os.Stderr, "Wrong number of child: expected(%d), actual(%d)\n", 3, len(ast.Children)) - t.Fatalf("Root line information doesn't match result for %s", testFileLineInfo) - } - expected := [][]int{ - {5, 5}, - {11, 12}, - {17, 31}, - } - for i, child := range ast.Children { - if child.StartLine != expected[i][0] || child.EndLine != expected[i][1] { - t.Logf("Wrong line information for child %d: expected(%d-%d), actual(%d-%d)\n", - i, expected[i][0], expected[i][1], child.StartLine, child.EndLine) - t.Fatalf("Root line information doesn't match result.") - } - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfile-line/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfile-line/Dockerfile deleted file mode 100644 index c7601c9f6..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfile-line/Dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -# ESCAPE=\ - - - -FROM brimstone/ubuntu:14.04 - - -# TORUN -v /var/run/docker.sock:/var/run/docker.sock - - -ENV GOPATH \ -/go - - - -# Install the packages we need, clean up after them and us -RUN apt-get update \ - && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean \ - - - && apt-get install -y --no-install-recommends git golang ca-certificates \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists \ - - && go get -v github.com/brimstone/consuldock \ - && mv $GOPATH/bin/consuldock /usr/local/bin/consuldock \ - - && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty \ - && apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') \ - && rm /tmp/dpkg.* \ - && rm -rf $GOPATH - - - - diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles-negative/env_no_value/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles-negative/env_no_value/Dockerfile deleted file mode 100644 index 1d6557879..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles-negative/env_no_value/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM busybox - -ENV PATH diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles-negative/shykes-nested-json/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles-negative/shykes-nested-json/Dockerfile deleted file mode 100644 index d1be4596c..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles-negative/shykes-nested-json/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -CMD [ "echo", [ "nested json" ] ] diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/ADD-COPY-with-JSON/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/ADD-COPY-with-JSON/Dockerfile deleted file mode 100644 index 00b444cba..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/ADD-COPY-with-JSON/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM ubuntu:14.04 -MAINTAINER Seongyeol Lim - -COPY . /go/src/github.com/docker/docker -ADD . / -ADD null / -COPY nullfile /tmp -ADD [ "vimrc", "/tmp" ] -COPY [ "bashrc", "/tmp" ] -COPY [ "test file", "/tmp" ] -ADD [ "test file", "/tmp/test file" ] diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/ADD-COPY-with-JSON/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/ADD-COPY-with-JSON/result deleted file mode 100644 index 85aee6401..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/ADD-COPY-with-JSON/result +++ /dev/null @@ -1,10 +0,0 @@ -(from "ubuntu:14.04") -(maintainer "Seongyeol Lim ") -(copy "." "/go/src/github.com/docker/docker") -(add "." "/") -(add "null" "/") -(copy "nullfile" "/tmp") -(add "vimrc" "/tmp") -(copy "bashrc" "/tmp") -(copy "test file" "/tmp") -(add "test file" "/tmp/test file") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-consuldock/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-consuldock/Dockerfile deleted file mode 100644 index 0364ef9d9..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-consuldock/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -#escape=\ -FROM brimstone/ubuntu:14.04 - -MAINTAINER brimstone@the.narro.ws - -# TORUN -v /var/run/docker.sock:/var/run/docker.sock - -ENV GOPATH /go - -# Set our command -ENTRYPOINT ["/usr/local/bin/consuldock"] - -# Install the packages we need, clean up after them and us -RUN apt-get update \ - && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean \ - && apt-get install -y --no-install-recommends git golang ca-certificates \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists \ - - && go get -v github.com/brimstone/consuldock \ - && mv $GOPATH/bin/consuldock /usr/local/bin/consuldock \ - - && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty \ - && apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') \ - && rm /tmp/dpkg.* \ - && rm -rf $GOPATH diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-consuldock/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-consuldock/result deleted file mode 100644 index 227f748cd..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-consuldock/result +++ /dev/null @@ -1,5 +0,0 @@ -(from "brimstone/ubuntu:14.04") -(maintainer "brimstone@the.narro.ws") -(env "GOPATH" "/go") -(entrypoint "/usr/local/bin/consuldock") -(run "apt-get update \t&& dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean && apt-get install -y --no-install-recommends git golang ca-certificates && apt-get clean && rm -rf /var/lib/apt/lists \t&& go get -v github.com/brimstone/consuldock && mv $GOPATH/bin/consuldock /usr/local/bin/consuldock \t&& dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty \t&& apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') \t&& rm /tmp/dpkg.* \t&& rm -rf $GOPATH") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-docker-consul/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-docker-consul/Dockerfile deleted file mode 100644 index 25ae35216..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-docker-consul/Dockerfile +++ /dev/null @@ -1,52 +0,0 @@ -FROM brimstone/ubuntu:14.04 - -CMD [] - -ENTRYPOINT ["/usr/bin/consul", "agent", "-server", "-data-dir=/consul", "-client=0.0.0.0", "-ui-dir=/webui"] - -EXPOSE 8500 8600 8400 8301 8302 - -RUN apt-get update \ - && apt-get install -y unzip wget \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists - -RUN cd /tmp \ - && wget https://dl.bintray.com/mitchellh/consul/0.3.1_web_ui.zip \ - -O web_ui.zip \ - && unzip web_ui.zip \ - && mv dist /webui \ - && rm web_ui.zip - -RUN apt-get update \ - && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean \ - && apt-get install -y --no-install-recommends unzip wget \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists \ - - && cd /tmp \ - && wget https://dl.bintray.com/mitchellh/consul/0.3.1_web_ui.zip \ - -O web_ui.zip \ - && unzip web_ui.zip \ - && mv dist /webui \ - && rm web_ui.zip \ - - && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty \ - && apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') \ - && rm /tmp/dpkg.* - -ENV GOPATH /go - -RUN apt-get update \ - && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean \ - && apt-get install -y --no-install-recommends git golang ca-certificates build-essential \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists \ - - && go get -v github.com/hashicorp/consul \ - && mv $GOPATH/bin/consul /usr/bin/consul \ - - && dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty \ - && apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') \ - && rm /tmp/dpkg.* \ - && rm -rf $GOPATH diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-docker-consul/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-docker-consul/result deleted file mode 100644 index 16492e516..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/brimstone-docker-consul/result +++ /dev/null @@ -1,9 +0,0 @@ -(from "brimstone/ubuntu:14.04") -(cmd) -(entrypoint "/usr/bin/consul" "agent" "-server" "-data-dir=/consul" "-client=0.0.0.0" "-ui-dir=/webui") -(expose "8500" "8600" "8400" "8301" "8302") -(run "apt-get update && apt-get install -y unzip wget \t&& apt-get clean \t&& rm -rf /var/lib/apt/lists") -(run "cd /tmp && wget https://dl.bintray.com/mitchellh/consul/0.3.1_web_ui.zip -O web_ui.zip && unzip web_ui.zip && mv dist /webui && rm web_ui.zip") -(run "apt-get update \t&& dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean && apt-get install -y --no-install-recommends unzip wget && apt-get clean && rm -rf /var/lib/apt/lists && cd /tmp && wget https://dl.bintray.com/mitchellh/consul/0.3.1_web_ui.zip -O web_ui.zip && unzip web_ui.zip && mv dist /webui && rm web_ui.zip \t&& dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty \t&& apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') \t&& rm /tmp/dpkg.*") -(env "GOPATH" "/go") -(run "apt-get update \t&& dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.clean && apt-get install -y --no-install-recommends git golang ca-certificates build-essential && apt-get clean && rm -rf /var/lib/apt/lists \t&& go get -v github.com/hashicorp/consul \t&& mv $GOPATH/bin/consul /usr/bin/consul \t&& dpkg -l | awk '/^ii/ {print $2}' > /tmp/dpkg.dirty \t&& apt-get remove --purge -y $(diff /tmp/dpkg.clean /tmp/dpkg.dirty | awk '/^>/ {print $2}') \t&& rm /tmp/dpkg.* \t&& rm -rf $GOPATH") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/continueIndent/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/continueIndent/Dockerfile deleted file mode 100644 index 42b324e77..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/continueIndent/Dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -FROM ubuntu:14.04 - -RUN echo hello\ - world\ - goodnight \ - moon\ - light\ -ning -RUN echo hello \ - world -RUN echo hello \ -world -RUN echo hello \ -goodbye\ -frog -RUN echo hello \ -world -RUN echo hi \ - \ - world \ -\ - good\ -\ -night -RUN echo goodbye\ -frog -RUN echo good\ -bye\ -frog - -RUN echo hello \ -# this is a comment - -# this is a comment with a blank line surrounding it - -this is some more useful stuff diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/continueIndent/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/continueIndent/result deleted file mode 100644 index 268ae073c..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/continueIndent/result +++ /dev/null @@ -1,10 +0,0 @@ -(from "ubuntu:14.04") -(run "echo hello world goodnight moon lightning") -(run "echo hello world") -(run "echo hello world") -(run "echo hello goodbyefrog") -(run "echo hello world") -(run "echo hi world goodnight") -(run "echo goodbyefrog") -(run "echo goodbyefrog") -(run "echo hello this is some more useful stuff") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/cpuguy83-nagios/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/cpuguy83-nagios/Dockerfile deleted file mode 100644 index 8ccb71a57..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/cpuguy83-nagios/Dockerfile +++ /dev/null @@ -1,54 +0,0 @@ -FROM cpuguy83/ubuntu -ENV NAGIOS_HOME /opt/nagios -ENV NAGIOS_USER nagios -ENV NAGIOS_GROUP nagios -ENV NAGIOS_CMDUSER nagios -ENV NAGIOS_CMDGROUP nagios -ENV NAGIOSADMIN_USER nagiosadmin -ENV NAGIOSADMIN_PASS nagios -ENV APACHE_RUN_USER nagios -ENV APACHE_RUN_GROUP nagios -ENV NAGIOS_TIMEZONE UTC - -RUN sed -i 's/universe/universe multiverse/' /etc/apt/sources.list -RUN apt-get update && apt-get install -y iputils-ping netcat build-essential snmp snmpd snmp-mibs-downloader php5-cli apache2 libapache2-mod-php5 runit bc postfix bsd-mailx -RUN ( egrep -i "^${NAGIOS_GROUP}" /etc/group || groupadd $NAGIOS_GROUP ) && ( egrep -i "^${NAGIOS_CMDGROUP}" /etc/group || groupadd $NAGIOS_CMDGROUP ) -RUN ( id -u $NAGIOS_USER || useradd --system $NAGIOS_USER -g $NAGIOS_GROUP -d $NAGIOS_HOME ) && ( id -u $NAGIOS_CMDUSER || useradd --system -d $NAGIOS_HOME -g $NAGIOS_CMDGROUP $NAGIOS_CMDUSER ) - -ADD http://downloads.sourceforge.net/project/nagios/nagios-3.x/nagios-3.5.1/nagios-3.5.1.tar.gz?r=http%3A%2F%2Fwww.nagios.org%2Fdownload%2Fcore%2Fthanks%2F%3Ft%3D1398863696&ts=1398863718&use_mirror=superb-dca3 /tmp/nagios.tar.gz -RUN cd /tmp && tar -zxvf nagios.tar.gz && cd nagios && ./configure --prefix=${NAGIOS_HOME} --exec-prefix=${NAGIOS_HOME} --enable-event-broker --with-nagios-command-user=${NAGIOS_CMDUSER} --with-command-group=${NAGIOS_CMDGROUP} --with-nagios-user=${NAGIOS_USER} --with-nagios-group=${NAGIOS_GROUP} && make all && make install && make install-config && make install-commandmode && cp sample-config/httpd.conf /etc/apache2/conf.d/nagios.conf -ADD http://www.nagios-plugins.org/download/nagios-plugins-1.5.tar.gz /tmp/ -RUN cd /tmp && tar -zxvf nagios-plugins-1.5.tar.gz && cd nagios-plugins-1.5 && ./configure --prefix=${NAGIOS_HOME} && make && make install - -RUN sed -i.bak 's/.*\=www\-data//g' /etc/apache2/envvars -RUN export DOC_ROOT="DocumentRoot $(echo $NAGIOS_HOME/share)"; sed -i "s,DocumentRoot.*,$DOC_ROOT," /etc/apache2/sites-enabled/000-default - -RUN ln -s ${NAGIOS_HOME}/bin/nagios /usr/local/bin/nagios && mkdir -p /usr/share/snmp/mibs && chmod 0755 /usr/share/snmp/mibs && touch /usr/share/snmp/mibs/.foo - -RUN echo "use_timezone=$NAGIOS_TIMEZONE" >> ${NAGIOS_HOME}/etc/nagios.cfg && echo "SetEnv TZ \"${NAGIOS_TIMEZONE}\"" >> /etc/apache2/conf.d/nagios.conf - -RUN mkdir -p ${NAGIOS_HOME}/etc/conf.d && mkdir -p ${NAGIOS_HOME}/etc/monitor && ln -s /usr/share/snmp/mibs ${NAGIOS_HOME}/libexec/mibs -RUN echo "cfg_dir=${NAGIOS_HOME}/etc/conf.d" >> ${NAGIOS_HOME}/etc/nagios.cfg -RUN echo "cfg_dir=${NAGIOS_HOME}/etc/monitor" >> ${NAGIOS_HOME}/etc/nagios.cfg -RUN download-mibs && echo "mibs +ALL" > /etc/snmp/snmp.conf - -RUN sed -i 's,/bin/mail,/usr/bin/mail,' /opt/nagios/etc/objects/commands.cfg && \ - sed -i 's,/usr/usr,/usr,' /opt/nagios/etc/objects/commands.cfg -RUN cp /etc/services /var/spool/postfix/etc/ - -RUN mkdir -p /etc/sv/nagios && mkdir -p /etc/sv/apache && rm -rf /etc/sv/getty-5 && mkdir -p /etc/sv/postfix -ADD nagios.init /etc/sv/nagios/run -ADD apache.init /etc/sv/apache/run -ADD postfix.init /etc/sv/postfix/run -ADD postfix.stop /etc/sv/postfix/finish - -ADD start.sh /usr/local/bin/start_nagios - -ENV APACHE_LOCK_DIR /var/run -ENV APACHE_LOG_DIR /var/log/apache2 - -EXPOSE 80 - -VOLUME ["/opt/nagios/var", "/opt/nagios/etc", "/opt/nagios/libexec", "/var/log/apache2", "/usr/share/snmp/mibs"] - -CMD ["/usr/local/bin/start_nagios"] diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/cpuguy83-nagios/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/cpuguy83-nagios/result deleted file mode 100644 index 25dd3ddfe..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/cpuguy83-nagios/result +++ /dev/null @@ -1,40 +0,0 @@ -(from "cpuguy83/ubuntu") -(env "NAGIOS_HOME" "/opt/nagios") -(env "NAGIOS_USER" "nagios") -(env "NAGIOS_GROUP" "nagios") -(env "NAGIOS_CMDUSER" "nagios") -(env "NAGIOS_CMDGROUP" "nagios") -(env "NAGIOSADMIN_USER" "nagiosadmin") -(env "NAGIOSADMIN_PASS" "nagios") -(env "APACHE_RUN_USER" "nagios") -(env "APACHE_RUN_GROUP" "nagios") -(env "NAGIOS_TIMEZONE" "UTC") -(run "sed -i 's/universe/universe multiverse/' /etc/apt/sources.list") -(run "apt-get update && apt-get install -y iputils-ping netcat build-essential snmp snmpd snmp-mibs-downloader php5-cli apache2 libapache2-mod-php5 runit bc postfix bsd-mailx") -(run "( egrep -i \"^${NAGIOS_GROUP}\" /etc/group || groupadd $NAGIOS_GROUP ) && ( egrep -i \"^${NAGIOS_CMDGROUP}\" /etc/group || groupadd $NAGIOS_CMDGROUP )") -(run "( id -u $NAGIOS_USER || useradd --system $NAGIOS_USER -g $NAGIOS_GROUP -d $NAGIOS_HOME ) && ( id -u $NAGIOS_CMDUSER || useradd --system -d $NAGIOS_HOME -g $NAGIOS_CMDGROUP $NAGIOS_CMDUSER )") -(add "http://downloads.sourceforge.net/project/nagios/nagios-3.x/nagios-3.5.1/nagios-3.5.1.tar.gz?r=http%3A%2F%2Fwww.nagios.org%2Fdownload%2Fcore%2Fthanks%2F%3Ft%3D1398863696&ts=1398863718&use_mirror=superb-dca3" "/tmp/nagios.tar.gz") -(run "cd /tmp && tar -zxvf nagios.tar.gz && cd nagios && ./configure --prefix=${NAGIOS_HOME} --exec-prefix=${NAGIOS_HOME} --enable-event-broker --with-nagios-command-user=${NAGIOS_CMDUSER} --with-command-group=${NAGIOS_CMDGROUP} --with-nagios-user=${NAGIOS_USER} --with-nagios-group=${NAGIOS_GROUP} && make all && make install && make install-config && make install-commandmode && cp sample-config/httpd.conf /etc/apache2/conf.d/nagios.conf") -(add "http://www.nagios-plugins.org/download/nagios-plugins-1.5.tar.gz" "/tmp/") -(run "cd /tmp && tar -zxvf nagios-plugins-1.5.tar.gz && cd nagios-plugins-1.5 && ./configure --prefix=${NAGIOS_HOME} && make && make install") -(run "sed -i.bak 's/.*\\=www\\-data//g' /etc/apache2/envvars") -(run "export DOC_ROOT=\"DocumentRoot $(echo $NAGIOS_HOME/share)\"; sed -i \"s,DocumentRoot.*,$DOC_ROOT,\" /etc/apache2/sites-enabled/000-default") -(run "ln -s ${NAGIOS_HOME}/bin/nagios /usr/local/bin/nagios && mkdir -p /usr/share/snmp/mibs && chmod 0755 /usr/share/snmp/mibs && touch /usr/share/snmp/mibs/.foo") -(run "echo \"use_timezone=$NAGIOS_TIMEZONE\" >> ${NAGIOS_HOME}/etc/nagios.cfg && echo \"SetEnv TZ \\\"${NAGIOS_TIMEZONE}\\\"\" >> /etc/apache2/conf.d/nagios.conf") -(run "mkdir -p ${NAGIOS_HOME}/etc/conf.d && mkdir -p ${NAGIOS_HOME}/etc/monitor && ln -s /usr/share/snmp/mibs ${NAGIOS_HOME}/libexec/mibs") -(run "echo \"cfg_dir=${NAGIOS_HOME}/etc/conf.d\" >> ${NAGIOS_HOME}/etc/nagios.cfg") -(run "echo \"cfg_dir=${NAGIOS_HOME}/etc/monitor\" >> ${NAGIOS_HOME}/etc/nagios.cfg") -(run "download-mibs && echo \"mibs +ALL\" > /etc/snmp/snmp.conf") -(run "sed -i 's,/bin/mail,/usr/bin/mail,' /opt/nagios/etc/objects/commands.cfg && sed -i 's,/usr/usr,/usr,' /opt/nagios/etc/objects/commands.cfg") -(run "cp /etc/services /var/spool/postfix/etc/") -(run "mkdir -p /etc/sv/nagios && mkdir -p /etc/sv/apache && rm -rf /etc/sv/getty-5 && mkdir -p /etc/sv/postfix") -(add "nagios.init" "/etc/sv/nagios/run") -(add "apache.init" "/etc/sv/apache/run") -(add "postfix.init" "/etc/sv/postfix/run") -(add "postfix.stop" "/etc/sv/postfix/finish") -(add "start.sh" "/usr/local/bin/start_nagios") -(env "APACHE_LOCK_DIR" "/var/run") -(env "APACHE_LOG_DIR" "/var/log/apache2") -(expose "80") -(volume "/opt/nagios/var" "/opt/nagios/etc" "/opt/nagios/libexec" "/var/log/apache2" "/usr/share/snmp/mibs") -(cmd "/usr/local/bin/start_nagios") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/docker/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/docker/Dockerfile deleted file mode 100644 index 99fbe55be..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/docker/Dockerfile +++ /dev/null @@ -1,103 +0,0 @@ -# This file describes the standard way to build Docker, using docker -# -# Usage: -# -# # Assemble the full dev environment. This is slow the first time. -# docker build -t docker . -# -# # Mount your source in an interactive container for quick testing: -# docker run -v `pwd`:/go/src/github.com/docker/docker --privileged -i -t docker bash -# -# # Run the test suite: -# docker run --privileged docker hack/make.sh test-unit test-integration-cli test-docker-py -# -# # Publish a release: -# docker run --privileged \ -# -e AWS_S3_BUCKET=baz \ -# -e AWS_ACCESS_KEY=foo \ -# -e AWS_SECRET_KEY=bar \ -# -e GPG_PASSPHRASE=gloubiboulga \ -# docker hack/release.sh -# -# Note: AppArmor used to mess with privileged mode, but this is no longer -# the case. Therefore, you don't have to disable it anymore. -# - -FROM ubuntu:14.04 -MAINTAINER Tianon Gravi (@tianon) - -# Packaged dependencies -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -yq \ - apt-utils \ - aufs-tools \ - automake \ - btrfs-tools \ - build-essential \ - curl \ - dpkg-sig \ - git \ - iptables \ - libapparmor-dev \ - libcap-dev \ - libsqlite3-dev \ - mercurial \ - pandoc \ - parallel \ - reprepro \ - ruby1.9.1 \ - ruby1.9.1-dev \ - s3cmd=1.1.0* \ - --no-install-recommends - -# Get lvm2 source for compiling statically -RUN git clone --no-checkout https://git.fedorahosted.org/git/lvm2.git /usr/local/lvm2 && cd /usr/local/lvm2 && git checkout -q v2_02_103 -# see https://git.fedorahosted.org/cgit/lvm2.git/refs/tags for release tags -# note: we don't use "git clone -b" above because it then spews big nasty warnings about 'detached HEAD' state that we can't silence as easily as we can silence them using "git checkout" directly - -# Compile and install lvm2 -RUN cd /usr/local/lvm2 && ./configure --enable-static_link && make device-mapper && make install_device-mapper -# see https://git.fedorahosted.org/cgit/lvm2.git/tree/INSTALL - -# Install Go -RUN curl -sSL https://golang.org/dl/go1.3.src.tar.gz | tar -v -C /usr/local -xz -ENV PATH /usr/local/go/bin:$PATH -ENV GOPATH /go:/go/src/github.com/docker/docker/vendor -RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1 - -# Compile Go for cross compilation -ENV DOCKER_CROSSPLATFORMS \ - linux/386 linux/arm \ - darwin/amd64 darwin/386 \ - freebsd/amd64 freebsd/386 freebsd/arm -# (set an explicit GOARM of 5 for maximum compatibility) -ENV GOARM 5 -RUN cd /usr/local/go/src && bash -xc 'for platform in $DOCKER_CROSSPLATFORMS; do GOOS=${platform%/*} GOARCH=${platform##*/} ./make.bash --no-clean 2>&1; done' - -# Grab Go's cover tool for dead-simple code coverage testing -RUN go get golang.org/x/tools/cmd/cover - -# TODO replace FPM with some very minimal debhelper stuff -RUN gem install --no-rdoc --no-ri fpm --version 1.0.2 - -# Get the "busybox" image source so we can build locally instead of pulling -RUN git clone -b buildroot-2014.02 https://github.com/jpetazzo/docker-busybox.git /docker-busybox - -# Setup s3cmd config -RUN /bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY' > /.s3cfg - -# Set user.email so crosbymichael's in-container merge commits go smoothly -RUN git config --global user.email 'docker-dummy@example.com' - -# Add an unprivileged user to be used for tests which need it -RUN groupadd -r docker -RUN useradd --create-home --gid docker unprivilegeduser - -VOLUME /var/lib/docker -WORKDIR /go/src/github.com/docker/docker -ENV DOCKER_BUILDTAGS apparmor selinux - -# Wrap all commands in the "docker-in-docker" script to allow nested containers -ENTRYPOINT ["hack/dind"] - -# Upload docker source -COPY . /go/src/github.com/docker/docker diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/docker/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/docker/result deleted file mode 100644 index d032f9bac..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/docker/result +++ /dev/null @@ -1,24 +0,0 @@ -(from "ubuntu:14.04") -(maintainer "Tianon Gravi (@tianon)") -(run "apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -yq \tapt-utils \taufs-tools \tautomake \tbtrfs-tools \tbuild-essential \tcurl \tdpkg-sig \tgit \tiptables \tlibapparmor-dev \tlibcap-dev \tlibsqlite3-dev \tmercurial \tpandoc \tparallel \treprepro \truby1.9.1 \truby1.9.1-dev \ts3cmd=1.1.0* \t--no-install-recommends") -(run "git clone --no-checkout https://git.fedorahosted.org/git/lvm2.git /usr/local/lvm2 && cd /usr/local/lvm2 && git checkout -q v2_02_103") -(run "cd /usr/local/lvm2 && ./configure --enable-static_link && make device-mapper && make install_device-mapper") -(run "curl -sSL https://golang.org/dl/go1.3.src.tar.gz | tar -v -C /usr/local -xz") -(env "PATH" "/usr/local/go/bin:$PATH") -(env "GOPATH" "/go:/go/src/github.com/docker/docker/vendor") -(run "cd /usr/local/go/src && ./make.bash --no-clean 2>&1") -(env "DOCKER_CROSSPLATFORMS" "linux/386 linux/arm \tdarwin/amd64 darwin/386 \tfreebsd/amd64 freebsd/386 freebsd/arm") -(env "GOARM" "5") -(run "cd /usr/local/go/src && bash -xc 'for platform in $DOCKER_CROSSPLATFORMS; do GOOS=${platform%/*} GOARCH=${platform##*/} ./make.bash --no-clean 2>&1; done'") -(run "go get golang.org/x/tools/cmd/cover") -(run "gem install --no-rdoc --no-ri fpm --version 1.0.2") -(run "git clone -b buildroot-2014.02 https://github.com/jpetazzo/docker-busybox.git /docker-busybox") -(run "/bin/echo -e '[default]\\naccess_key=$AWS_ACCESS_KEY\\nsecret_key=$AWS_SECRET_KEY' > /.s3cfg") -(run "git config --global user.email 'docker-dummy@example.com'") -(run "groupadd -r docker") -(run "useradd --create-home --gid docker unprivilegeduser") -(volume "/var/lib/docker") -(workdir "/go/src/github.com/docker/docker") -(env "DOCKER_BUILDTAGS" "apparmor selinux") -(entrypoint "hack/dind") -(copy "." "/go/src/github.com/docker/docker") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/env/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/env/Dockerfile deleted file mode 100644 index 08fa18ace..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/env/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM ubuntu -ENV name value -ENV name=value -ENV name=value name2=value2 -ENV name="value value1" -ENV name=value\ value2 -ENV name="value'quote space'value2" -ENV name='value"double quote"value2' -ENV name=value\ value2 name2=value2\ value3 -ENV name="a\"b" -ENV name="a\'b" -ENV name='a\'b' -ENV name='a\'b'' -ENV name='a\"b' -ENV name="''" -# don't put anything after the next line - it must be the last line of the -# Dockerfile and it must end with \ -ENV name=value \ - name1=value1 \ - name2="value2a \ - value2b" \ - name3="value3a\n\"value3b\"" \ - name4="value4a\\nvalue4b" \ diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/env/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/env/result deleted file mode 100644 index ba0a6dd7c..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/env/result +++ /dev/null @@ -1,16 +0,0 @@ -(from "ubuntu") -(env "name" "value") -(env "name" "value") -(env "name" "value" "name2" "value2") -(env "name" "\"value value1\"") -(env "name" "value\\ value2") -(env "name" "\"value'quote space'value2\"") -(env "name" "'value\"double quote\"value2'") -(env "name" "value\\ value2" "name2" "value2\\ value3") -(env "name" "\"a\\\"b\"") -(env "name" "\"a\\'b\"") -(env "name" "'a\\'b'") -(env "name" "'a\\'b''") -(env "name" "'a\\\"b'") -(env "name" "\"''\"") -(env "name" "value" "name1" "value1" "name2" "\"value2a value2b\"" "name3" "\"value3a\\n\\\"value3b\\\"\"" "name4" "\"value4a\\\\nvalue4b\"") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-after-comment/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-after-comment/Dockerfile deleted file mode 100644 index 6def7efdc..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-after-comment/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -# Comment here. Should not be looking for the following parser directive. -# Hence the following line will be ignored, and the subsequent backslash -# continuation will be the default. -# escape = ` - -FROM image -MAINTAINER foo@bar.com -ENV GOPATH \ -\go \ No newline at end of file diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-after-comment/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-after-comment/result deleted file mode 100644 index 21522a880..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-after-comment/result +++ /dev/null @@ -1,3 +0,0 @@ -(from "image") -(maintainer "foo@bar.com") -(env "GOPATH" "\\go") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-nonewline/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-nonewline/Dockerfile deleted file mode 100644 index 08a8cc432..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-nonewline/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -# escape = `` -# There is no white space line after the directives. This still succeeds, but goes -# against best practices. -FROM image -MAINTAINER foo@bar.com -ENV GOPATH ` -\go \ No newline at end of file diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-nonewline/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-nonewline/result deleted file mode 100644 index 21522a880..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape-nonewline/result +++ /dev/null @@ -1,3 +0,0 @@ -(from "image") -(maintainer "foo@bar.com") -(env "GOPATH" "\\go") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape/Dockerfile deleted file mode 100644 index ef30414a5..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -#escape = ` - -FROM image -MAINTAINER foo@bar.com -ENV GOPATH ` -\go \ No newline at end of file diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape/result deleted file mode 100644 index 21522a880..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escape/result +++ /dev/null @@ -1,3 +0,0 @@ -(from "image") -(maintainer "foo@bar.com") -(env "GOPATH" "\\go") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escapes/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escapes/Dockerfile deleted file mode 100644 index 1ffb17ef0..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escapes/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM ubuntu:14.04 -MAINTAINER Erik \\Hollensbe \" - -RUN apt-get \update && \ - apt-get \"install znc -y -ADD \conf\\" /.znc - -RUN foo \ - -bar \ - -baz - -CMD [ "\/usr\\\"/bin/znc", "-f", "-r" ] diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escapes/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escapes/result deleted file mode 100644 index 13e409cb1..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/escapes/result +++ /dev/null @@ -1,6 +0,0 @@ -(from "ubuntu:14.04") -(maintainer "Erik \\\\Hollensbe \\\"") -(run "apt-get \\update && apt-get \\\"install znc -y") -(add "\\conf\\\\\"" "/.znc") -(run "foo bar baz") -(cmd "/usr\\\"/bin/znc" "-f" "-r") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/flags/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/flags/Dockerfile deleted file mode 100644 index 2418e0f06..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/flags/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM scratch -COPY foo /tmp/ -COPY --user=me foo /tmp/ -COPY --doit=true foo /tmp/ -COPY --user=me --doit=true foo /tmp/ -COPY --doit=true -- foo /tmp/ -COPY -- foo /tmp/ -CMD --doit [ "a", "b" ] -CMD --doit=true -- [ "a", "b" ] -CMD --doit -- [ ] diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/flags/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/flags/result deleted file mode 100644 index 4578f4cba..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/flags/result +++ /dev/null @@ -1,10 +0,0 @@ -(from "scratch") -(copy "foo" "/tmp/") -(copy ["--user=me"] "foo" "/tmp/") -(copy ["--doit=true"] "foo" "/tmp/") -(copy ["--user=me" "--doit=true"] "foo" "/tmp/") -(copy ["--doit=true"] "foo" "/tmp/") -(copy "foo" "/tmp/") -(cmd ["--doit"] "a" "b") -(cmd ["--doit=true"] "a" "b") -(cmd ["--doit"]) diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/health/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/health/Dockerfile deleted file mode 100644 index 081e44288..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/health/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM debian -ADD check.sh main.sh /app/ -CMD /app/main.sh -HEALTHCHECK -HEALTHCHECK --interval=5s --timeout=3s --retries=3 \ - CMD /app/check.sh --quiet -HEALTHCHECK CMD -HEALTHCHECK CMD a b -HEALTHCHECK --timeout=3s CMD ["foo"] -HEALTHCHECK CONNECT TCP 7000 diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/health/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/health/result deleted file mode 100644 index 092924f88..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/health/result +++ /dev/null @@ -1,9 +0,0 @@ -(from "debian") -(add "check.sh" "main.sh" "/app/") -(cmd "/app/main.sh") -(healthcheck) -(healthcheck ["--interval=5s" "--timeout=3s" "--retries=3"] "CMD" "/app/check.sh --quiet") -(healthcheck "CMD") -(healthcheck "CMD" "a b") -(healthcheck ["--timeout=3s"] "CMD" "foo") -(healthcheck "CONNECT" "TCP 7000") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/influxdb/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/influxdb/Dockerfile deleted file mode 100644 index 587fb9b54..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/influxdb/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM ubuntu:14.04 - -RUN apt-get update && apt-get install wget -y -RUN wget http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb -RUN dpkg -i influxdb_latest_amd64.deb -RUN rm -r /opt/influxdb/shared - -VOLUME /opt/influxdb/shared - -CMD /usr/bin/influxdb --pidfile /var/run/influxdb.pid -config /opt/influxdb/shared/config.toml - -EXPOSE 8083 -EXPOSE 8086 -EXPOSE 8090 -EXPOSE 8099 diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/influxdb/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/influxdb/result deleted file mode 100644 index 0998e87e6..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/influxdb/result +++ /dev/null @@ -1,11 +0,0 @@ -(from "ubuntu:14.04") -(run "apt-get update && apt-get install wget -y") -(run "wget http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb") -(run "dpkg -i influxdb_latest_amd64.deb") -(run "rm -r /opt/influxdb/shared") -(volume "/opt/influxdb/shared") -(cmd "/usr/bin/influxdb --pidfile /var/run/influxdb.pid -config /opt/influxdb/shared/config.toml") -(expose "8083") -(expose "8086") -(expose "8090") -(expose "8099") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string-double/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string-double/Dockerfile deleted file mode 100644 index 39fe27d99..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string-double/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -CMD "[\"echo\", \"Phew, I just managed to escaped those double quotes\"]" diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result deleted file mode 100644 index afc220c2a..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result +++ /dev/null @@ -1 +0,0 @@ -(cmd "\"[\\\"echo\\\", \\\"Phew, I just managed to escaped those double quotes\\\"]\"") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string/Dockerfile deleted file mode 100644 index eaae081a0..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -CMD '["echo", "Well, JSON in a string is JSON too?"]' diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string/result deleted file mode 100644 index 484804e2b..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-json-inside-string/result +++ /dev/null @@ -1 +0,0 @@ -(cmd "'[\"echo\", \"Well, JSON in a string is JSON too?\"]'") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-single-quotes/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-single-quotes/Dockerfile deleted file mode 100644 index c3ac63c07..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-single-quotes/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -CMD ['echo','single quotes are invalid JSON'] diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-single-quotes/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-single-quotes/result deleted file mode 100644 index 614789120..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-single-quotes/result +++ /dev/null @@ -1 +0,0 @@ -(cmd "['echo','single quotes are invalid JSON']") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-bracket/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-bracket/Dockerfile deleted file mode 100644 index 5fd4afa52..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-bracket/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -CMD ["echo", "Please, close the brackets when you're done" diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result deleted file mode 100644 index 1ffbb8ff8..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result +++ /dev/null @@ -1 +0,0 @@ -(cmd "[\"echo\", \"Please, close the brackets when you're done\"") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-string/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-string/Dockerfile deleted file mode 100644 index 30cc4bb48..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-string/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -CMD ["echo", "look ma, no quote!] diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-string/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-string/result deleted file mode 100644 index 32048147b..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/jeztah-invalid-json-unterminated-string/result +++ /dev/null @@ -1 +0,0 @@ -(cmd "[\"echo\", \"look ma, no quote!]") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/json/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/json/Dockerfile deleted file mode 100644 index a58691711..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/json/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -CMD [] -CMD [""] -CMD ["a"] -CMD ["a","b"] -CMD [ "a", "b" ] -CMD [ "a", "b" ] -CMD [ "a", "b" ] -CMD ["abc 123", "♥", "☃", "\" \\ \/ \b \f \n \r \t \u0000"] diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/json/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/json/result deleted file mode 100644 index c6553e6e1..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/json/result +++ /dev/null @@ -1,8 +0,0 @@ -(cmd) -(cmd "") -(cmd "a") -(cmd "a" "b") -(cmd "a" "b") -(cmd "a" "b") -(cmd "a" "b") -(cmd "abc 123" "♥" "☃" "\" \\ / \b \f \n \r \t \x00") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/kartar-entrypoint-oddities/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/kartar-entrypoint-oddities/Dockerfile deleted file mode 100644 index 35f9c24aa..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/kartar-entrypoint-oddities/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM ubuntu:14.04 -MAINTAINER James Turnbull "james@example.com" -ENV REFRESHED_AT 2014-06-01 -RUN apt-get update -RUN apt-get -y install redis-server redis-tools -EXPOSE 6379 -ENTRYPOINT [ "/usr/bin/redis-server" ] diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/kartar-entrypoint-oddities/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/kartar-entrypoint-oddities/result deleted file mode 100644 index b5ac6fe44..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/kartar-entrypoint-oddities/result +++ /dev/null @@ -1,7 +0,0 @@ -(from "ubuntu:14.04") -(maintainer "James Turnbull \"james@example.com\"") -(env "REFRESHED_AT" "2014-06-01") -(run "apt-get update") -(run "apt-get -y install redis-server redis-tools") -(expose "6379") -(entrypoint "/usr/bin/redis-server") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/lk4d4-the-edge-case-generator/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/lk4d4-the-edge-case-generator/Dockerfile deleted file mode 100644 index 188395fe8..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/lk4d4-the-edge-case-generator/Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -FROM busybox:buildroot-2014.02 - -MAINTAINER docker - -ONBUILD RUN ["echo", "test"] -ONBUILD RUN echo test -ONBUILD COPY . / - - -# RUN Commands \ -# linebreak in comment \ -RUN ["ls", "-la"] -RUN ["echo", "'1234'"] -RUN echo "1234" -RUN echo 1234 -RUN echo '1234' && \ - echo "456" && \ - echo 789 -RUN sh -c 'echo root:testpass \ - > /tmp/passwd' -RUN mkdir -p /test /test2 /test3/test - -# ENV \ -ENV SCUBA 1 DUBA 3 -ENV SCUBA "1 DUBA 3" - -# CMD \ -CMD ["echo", "test"] -CMD echo test -CMD echo "test" -CMD echo 'test' -CMD echo 'test' | wc - - -#EXPOSE\ -EXPOSE 3000 -EXPOSE 9000 5000 6000 - -USER docker -USER docker:root - -VOLUME ["/test"] -VOLUME ["/test", "/test2"] -VOLUME /test3 - -WORKDIR /test - -ADD . / -COPY . copy diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/lk4d4-the-edge-case-generator/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/lk4d4-the-edge-case-generator/result deleted file mode 100644 index 6f7d57a39..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/lk4d4-the-edge-case-generator/result +++ /dev/null @@ -1,29 +0,0 @@ -(from "busybox:buildroot-2014.02") -(maintainer "docker ") -(onbuild (run "echo" "test")) -(onbuild (run "echo test")) -(onbuild (copy "." "/")) -(run "ls" "-la") -(run "echo" "'1234'") -(run "echo \"1234\"") -(run "echo 1234") -(run "echo '1234' && echo \"456\" && echo 789") -(run "sh -c 'echo root:testpass > /tmp/passwd'") -(run "mkdir -p /test /test2 /test3/test") -(env "SCUBA" "1 DUBA 3") -(env "SCUBA" "\"1 DUBA 3\"") -(cmd "echo" "test") -(cmd "echo test") -(cmd "echo \"test\"") -(cmd "echo 'test'") -(cmd "echo 'test' | wc -") -(expose "3000") -(expose "9000" "5000" "6000") -(user "docker") -(user "docker:root") -(volume "/test") -(volume "/test" "/test2") -(volume "/test3") -(workdir "/test") -(add "." "/") -(copy "." "copy") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mail/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mail/Dockerfile deleted file mode 100644 index f64c1168c..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mail/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM ubuntu:14.04 - -RUN apt-get update -qy && apt-get install mutt offlineimap vim-nox abook elinks curl tmux cron zsh -y -ADD .muttrc / -ADD .offlineimaprc / -ADD .tmux.conf / -ADD mutt /.mutt -ADD vim /.vim -ADD vimrc /.vimrc -ADD crontab /etc/crontab -RUN chmod 644 /etc/crontab -RUN mkdir /Mail -RUN mkdir /.offlineimap -RUN echo "export TERM=screen-256color" >/.zshenv - -CMD setsid cron; tmux -2 diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mail/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mail/result deleted file mode 100644 index a0efcf04b..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mail/result +++ /dev/null @@ -1,14 +0,0 @@ -(from "ubuntu:14.04") -(run "apt-get update -qy && apt-get install mutt offlineimap vim-nox abook elinks curl tmux cron zsh -y") -(add ".muttrc" "/") -(add ".offlineimaprc" "/") -(add ".tmux.conf" "/") -(add "mutt" "/.mutt") -(add "vim" "/.vim") -(add "vimrc" "/.vimrc") -(add "crontab" "/etc/crontab") -(run "chmod 644 /etc/crontab") -(run "mkdir /Mail") -(run "mkdir /.offlineimap") -(run "echo \"export TERM=screen-256color\" >/.zshenv") -(cmd "setsid cron; tmux -2") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/multiple-volumes/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/multiple-volumes/Dockerfile deleted file mode 100644 index 57bb5976a..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/multiple-volumes/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM foo - -VOLUME /opt/nagios/var /opt/nagios/etc /opt/nagios/libexec /var/log/apache2 /usr/share/snmp/mibs diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/multiple-volumes/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/multiple-volumes/result deleted file mode 100644 index 18dbdeeaa..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/multiple-volumes/result +++ /dev/null @@ -1,2 +0,0 @@ -(from "foo") -(volume "/opt/nagios/var" "/opt/nagios/etc" "/opt/nagios/libexec" "/var/log/apache2" "/usr/share/snmp/mibs") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mumble/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mumble/Dockerfile deleted file mode 100644 index 5b9ec06a6..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mumble/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM ubuntu:14.04 - -RUN apt-get update && apt-get install libcap2-bin mumble-server -y - -ADD ./mumble-server.ini /etc/mumble-server.ini - -CMD /usr/sbin/murmurd diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mumble/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mumble/result deleted file mode 100644 index a0036a943..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/mumble/result +++ /dev/null @@ -1,4 +0,0 @@ -(from "ubuntu:14.04") -(run "apt-get update && apt-get install libcap2-bin mumble-server -y") -(add "./mumble-server.ini" "/etc/mumble-server.ini") -(cmd "/usr/sbin/murmurd") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/nginx/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/nginx/Dockerfile deleted file mode 100644 index bf8368e1c..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/nginx/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM ubuntu:14.04 -MAINTAINER Erik Hollensbe - -RUN apt-get update && apt-get install nginx-full -y -RUN rm -rf /etc/nginx -ADD etc /etc/nginx -RUN chown -R root:root /etc/nginx -RUN /usr/sbin/nginx -qt -RUN mkdir /www - -CMD ["/usr/sbin/nginx"] - -VOLUME /www -EXPOSE 80 diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/nginx/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/nginx/result deleted file mode 100644 index 56ddb6f25..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/nginx/result +++ /dev/null @@ -1,11 +0,0 @@ -(from "ubuntu:14.04") -(maintainer "Erik Hollensbe ") -(run "apt-get update && apt-get install nginx-full -y") -(run "rm -rf /etc/nginx") -(add "etc" "/etc/nginx") -(run "chown -R root:root /etc/nginx") -(run "/usr/sbin/nginx -qt") -(run "mkdir /www") -(cmd "/usr/sbin/nginx") -(volume "/www") -(expose "80") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/tf2/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/tf2/Dockerfile deleted file mode 100644 index 72b79bdd7..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/tf2/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM ubuntu:12.04 - -EXPOSE 27015 -EXPOSE 27005 -EXPOSE 26901 -EXPOSE 27020 - -RUN apt-get update && apt-get install libc6-dev-i386 curl unzip -y -RUN mkdir -p /steam -RUN curl http://media.steampowered.com/client/steamcmd_linux.tar.gz | tar vxz -C /steam -ADD ./script /steam/script -RUN /steam/steamcmd.sh +runscript /steam/script -RUN curl http://mirror.pointysoftware.net/alliedmodders/mmsource-1.10.0-linux.tar.gz | tar vxz -C /steam/tf2/tf -RUN curl http://mirror.pointysoftware.net/alliedmodders/sourcemod-1.5.3-linux.tar.gz | tar vxz -C /steam/tf2/tf -ADD ./server.cfg /steam/tf2/tf/cfg/server.cfg -ADD ./ctf_2fort.cfg /steam/tf2/tf/cfg/ctf_2fort.cfg -ADD ./sourcemod.cfg /steam/tf2/tf/cfg/sourcemod/sourcemod.cfg -RUN rm -r /steam/tf2/tf/addons/sourcemod/configs -ADD ./configs /steam/tf2/tf/addons/sourcemod/configs -RUN mkdir -p /steam/tf2/tf/addons/sourcemod/translations/en -RUN cp /steam/tf2/tf/addons/sourcemod/translations/*.txt /steam/tf2/tf/addons/sourcemod/translations/en - -CMD cd /steam/tf2 && ./srcds_run -port 27015 +ip 0.0.0.0 +map ctf_2fort -autoupdate -steam_dir /steam -steamcmd_script /steam/script +tf_bot_quota 12 +tf_bot_quota_mode fill diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/tf2/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/tf2/result deleted file mode 100644 index d4f94cd8b..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/tf2/result +++ /dev/null @@ -1,20 +0,0 @@ -(from "ubuntu:12.04") -(expose "27015") -(expose "27005") -(expose "26901") -(expose "27020") -(run "apt-get update && apt-get install libc6-dev-i386 curl unzip -y") -(run "mkdir -p /steam") -(run "curl http://media.steampowered.com/client/steamcmd_linux.tar.gz | tar vxz -C /steam") -(add "./script" "/steam/script") -(run "/steam/steamcmd.sh +runscript /steam/script") -(run "curl http://mirror.pointysoftware.net/alliedmodders/mmsource-1.10.0-linux.tar.gz | tar vxz -C /steam/tf2/tf") -(run "curl http://mirror.pointysoftware.net/alliedmodders/sourcemod-1.5.3-linux.tar.gz | tar vxz -C /steam/tf2/tf") -(add "./server.cfg" "/steam/tf2/tf/cfg/server.cfg") -(add "./ctf_2fort.cfg" "/steam/tf2/tf/cfg/ctf_2fort.cfg") -(add "./sourcemod.cfg" "/steam/tf2/tf/cfg/sourcemod/sourcemod.cfg") -(run "rm -r /steam/tf2/tf/addons/sourcemod/configs") -(add "./configs" "/steam/tf2/tf/addons/sourcemod/configs") -(run "mkdir -p /steam/tf2/tf/addons/sourcemod/translations/en") -(run "cp /steam/tf2/tf/addons/sourcemod/translations/*.txt /steam/tf2/tf/addons/sourcemod/translations/en") -(cmd "cd /steam/tf2 && ./srcds_run -port 27015 +ip 0.0.0.0 +map ctf_2fort -autoupdate -steam_dir /steam -steamcmd_script /steam/script +tf_bot_quota 12 +tf_bot_quota_mode fill") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/weechat/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/weechat/Dockerfile deleted file mode 100644 index 484208816..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/weechat/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM ubuntu:14.04 - -RUN apt-get update -qy && apt-get install tmux zsh weechat-curses -y - -ADD .weechat /.weechat -ADD .tmux.conf / -RUN echo "export TERM=screen-256color" >/.zshenv - -CMD zsh -c weechat diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/weechat/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/weechat/result deleted file mode 100644 index c3abb4c54..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/weechat/result +++ /dev/null @@ -1,6 +0,0 @@ -(from "ubuntu:14.04") -(run "apt-get update -qy && apt-get install tmux zsh weechat-curses -y") -(add ".weechat" "/.weechat") -(add ".tmux.conf" "/") -(run "echo \"export TERM=screen-256color\" >/.zshenv") -(cmd "zsh -c weechat") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/znc/Dockerfile b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/znc/Dockerfile deleted file mode 100644 index 3a4da6e91..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/znc/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM ubuntu:14.04 -MAINTAINER Erik Hollensbe - -RUN apt-get update && apt-get install znc -y -ADD conf /.znc - -CMD [ "/usr/bin/znc", "-f", "-r" ] diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/znc/result b/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/znc/result deleted file mode 100644 index 5493b255f..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/testfiles/znc/result +++ /dev/null @@ -1,5 +0,0 @@ -(from "ubuntu:14.04") -(maintainer "Erik Hollensbe ") -(run "apt-get update && apt-get install znc -y") -(add "conf" "/.znc") -(cmd "/usr/bin/znc" "-f" "-r") diff --git a/vendor/github.com/docker/docker/builder/dockerfile/parser/utils.go b/vendor/github.com/docker/docker/builder/dockerfile/parser/utils.go deleted file mode 100644 index cd7af75e7..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/parser/utils.go +++ /dev/null @@ -1,176 +0,0 @@ -package parser - -import ( - "fmt" - "strconv" - "strings" - "unicode" -) - -// Dump dumps the AST defined by `node` as a list of sexps. -// Returns a string suitable for printing. -func (node *Node) Dump() string { - str := "" - str += node.Value - - if len(node.Flags) > 0 { - str += fmt.Sprintf(" %q", node.Flags) - } - - for _, n := range node.Children { - str += "(" + n.Dump() + ")\n" - } - - if node.Next != nil { - for n := node.Next; n != nil; n = n.Next { - if len(n.Children) > 0 { - str += " " + n.Dump() - } else { - str += " " + strconv.Quote(n.Value) - } - } - } - - return strings.TrimSpace(str) -} - -// performs the dispatch based on the two primal strings, cmd and args. Please -// look at the dispatch table in parser.go to see how these dispatchers work. -func fullDispatch(cmd, args string, d *Directive) (*Node, map[string]bool, error) { - fn := dispatch[cmd] - - // Ignore invalid Dockerfile instructions - if fn == nil { - fn = parseIgnore - } - - sexp, attrs, err := fn(args, d) - if err != nil { - return nil, nil, err - } - - return sexp, attrs, nil -} - -// splitCommand takes a single line of text and parses out the cmd and args, -// which are used for dispatching to more exact parsing functions. -func splitCommand(line string) (string, []string, string, error) { - var args string - var flags []string - - // Make sure we get the same results irrespective of leading/trailing spaces - cmdline := tokenWhitespace.Split(strings.TrimSpace(line), 2) - cmd := strings.ToLower(cmdline[0]) - - if len(cmdline) == 2 { - var err error - args, flags, err = extractBuilderFlags(cmdline[1]) - if err != nil { - return "", nil, "", err - } - } - - return cmd, flags, strings.TrimSpace(args), nil -} - -// covers comments and empty lines. Lines should be trimmed before passing to -// this function. -func stripComments(line string) string { - // string is already trimmed at this point - if tokenComment.MatchString(line) { - return tokenComment.ReplaceAllString(line, "") - } - - return line -} - -func extractBuilderFlags(line string) (string, []string, error) { - // Parses the BuilderFlags and returns the remaining part of the line - - const ( - inSpaces = iota // looking for start of a word - inWord - inQuote - ) - - words := []string{} - phase := inSpaces - word := "" - quote := '\000' - blankOK := false - var ch rune - - for pos := 0; pos <= len(line); pos++ { - if pos != len(line) { - ch = rune(line[pos]) - } - - if phase == inSpaces { // Looking for start of word - if pos == len(line) { // end of input - break - } - if unicode.IsSpace(ch) { // skip spaces - continue - } - - // Only keep going if the next word starts with -- - if ch != '-' || pos+1 == len(line) || rune(line[pos+1]) != '-' { - return line[pos:], words, nil - } - - phase = inWord // found someting with "--", fall through - } - if (phase == inWord || phase == inQuote) && (pos == len(line)) { - if word != "--" && (blankOK || len(word) > 0) { - words = append(words, word) - } - break - } - if phase == inWord { - if unicode.IsSpace(ch) { - phase = inSpaces - if word == "--" { - return line[pos:], words, nil - } - if blankOK || len(word) > 0 { - words = append(words, word) - } - word = "" - blankOK = false - continue - } - if ch == '\'' || ch == '"' { - quote = ch - blankOK = true - phase = inQuote - continue - } - if ch == '\\' { - if pos+1 == len(line) { - continue // just skip \ at end - } - pos++ - ch = rune(line[pos]) - } - word += string(ch) - continue - } - if phase == inQuote { - if ch == quote { - phase = inWord - continue - } - if ch == '\\' { - if pos+1 == len(line) { - phase = inWord - continue // just skip \ at end - } - pos++ - ch = rune(line[pos]) - } - word += string(ch) - } - } - - return "", words, nil -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/shell_parser.go b/vendor/github.com/docker/docker/builder/dockerfile/shell_parser.go deleted file mode 100644 index 189afd1fd..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/shell_parser.go +++ /dev/null @@ -1,329 +0,0 @@ -package dockerfile - -// This will take a single word and an array of env variables and -// process all quotes (" and ') as well as $xxx and ${xxx} env variable -// tokens. Tries to mimic bash shell process. -// It doesn't support all flavors of ${xx:...} formats but new ones can -// be added by adding code to the "special ${} format processing" section - -import ( - "fmt" - "runtime" - "strings" - "text/scanner" - "unicode" -) - -type shellWord struct { - word string - scanner scanner.Scanner - envs []string - pos int - escapeToken rune -} - -// ProcessWord will use the 'env' list of environment variables, -// and replace any env var references in 'word'. -func ProcessWord(word string, env []string, escapeToken rune) (string, error) { - sw := &shellWord{ - word: word, - envs: env, - pos: 0, - escapeToken: escapeToken, - } - sw.scanner.Init(strings.NewReader(word)) - word, _, err := sw.process() - return word, err -} - -// ProcessWords will use the 'env' list of environment variables, -// and replace any env var references in 'word' then it will also -// return a slice of strings which represents the 'word' -// split up based on spaces - taking into account quotes. Note that -// this splitting is done **after** the env var substitutions are done. -// Note, each one is trimmed to remove leading and trailing spaces (unless -// they are quoted", but ProcessWord retains spaces between words. -func ProcessWords(word string, env []string, escapeToken rune) ([]string, error) { - sw := &shellWord{ - word: word, - envs: env, - pos: 0, - escapeToken: escapeToken, - } - sw.scanner.Init(strings.NewReader(word)) - _, words, err := sw.process() - return words, err -} - -func (sw *shellWord) process() (string, []string, error) { - return sw.processStopOn(scanner.EOF) -} - -type wordsStruct struct { - word string - words []string - inWord bool -} - -func (w *wordsStruct) addChar(ch rune) { - if unicode.IsSpace(ch) && w.inWord { - if len(w.word) != 0 { - w.words = append(w.words, w.word) - w.word = "" - w.inWord = false - } - } else if !unicode.IsSpace(ch) { - w.addRawChar(ch) - } -} - -func (w *wordsStruct) addRawChar(ch rune) { - w.word += string(ch) - w.inWord = true -} - -func (w *wordsStruct) addString(str string) { - var scan scanner.Scanner - scan.Init(strings.NewReader(str)) - for scan.Peek() != scanner.EOF { - w.addChar(scan.Next()) - } -} - -func (w *wordsStruct) addRawString(str string) { - w.word += str - w.inWord = true -} - -func (w *wordsStruct) getWords() []string { - if len(w.word) > 0 { - w.words = append(w.words, w.word) - - // Just in case we're called again by mistake - w.word = "" - w.inWord = false - } - return w.words -} - -// Process the word, starting at 'pos', and stop when we get to the -// end of the word or the 'stopChar' character -func (sw *shellWord) processStopOn(stopChar rune) (string, []string, error) { - var result string - var words wordsStruct - - var charFuncMapping = map[rune]func() (string, error){ - '\'': sw.processSingleQuote, - '"': sw.processDoubleQuote, - '$': sw.processDollar, - } - - for sw.scanner.Peek() != scanner.EOF { - ch := sw.scanner.Peek() - - if stopChar != scanner.EOF && ch == stopChar { - sw.scanner.Next() - break - } - if fn, ok := charFuncMapping[ch]; ok { - // Call special processing func for certain chars - tmp, err := fn() - if err != nil { - return "", []string{}, err - } - result += tmp - - if ch == rune('$') { - words.addString(tmp) - } else { - words.addRawString(tmp) - } - } else { - // Not special, just add it to the result - ch = sw.scanner.Next() - - if ch == sw.escapeToken { - // '\' (default escape token, but ` allowed) escapes, except end of line - - ch = sw.scanner.Next() - - if ch == scanner.EOF { - break - } - - words.addRawChar(ch) - } else { - words.addChar(ch) - } - - result += string(ch) - } - } - - return result, words.getWords(), nil -} - -func (sw *shellWord) processSingleQuote() (string, error) { - // All chars between single quotes are taken as-is - // Note, you can't escape ' - var result string - - sw.scanner.Next() - - for { - ch := sw.scanner.Next() - if ch == '\'' || ch == scanner.EOF { - break - } - result += string(ch) - } - - return result, nil -} - -func (sw *shellWord) processDoubleQuote() (string, error) { - // All chars up to the next " are taken as-is, even ', except any $ chars - // But you can escape " with a \ (or ` if escape token set accordingly) - var result string - - sw.scanner.Next() - - for sw.scanner.Peek() != scanner.EOF { - ch := sw.scanner.Peek() - if ch == '"' { - sw.scanner.Next() - break - } - if ch == '$' { - tmp, err := sw.processDollar() - if err != nil { - return "", err - } - result += tmp - } else { - ch = sw.scanner.Next() - if ch == sw.escapeToken { - chNext := sw.scanner.Peek() - - if chNext == scanner.EOF { - // Ignore \ at end of word - continue - } - - if chNext == '"' || chNext == '$' { - // \" and \$ can be escaped, all other \'s are left as-is - ch = sw.scanner.Next() - } - } - result += string(ch) - } - } - - return result, nil -} - -func (sw *shellWord) processDollar() (string, error) { - sw.scanner.Next() - ch := sw.scanner.Peek() - if ch == '{' { - sw.scanner.Next() - name := sw.processName() - ch = sw.scanner.Peek() - if ch == '}' { - // Normal ${xx} case - sw.scanner.Next() - return sw.getEnv(name), nil - } - if ch == ':' { - // Special ${xx:...} format processing - // Yes it allows for recursive $'s in the ... spot - - sw.scanner.Next() // skip over : - modifier := sw.scanner.Next() - - word, _, err := sw.processStopOn('}') - if err != nil { - return "", err - } - - // Grab the current value of the variable in question so we - // can use to to determine what to do based on the modifier - newValue := sw.getEnv(name) - - switch modifier { - case '+': - if newValue != "" { - newValue = word - } - return newValue, nil - - case '-': - if newValue == "" { - newValue = word - } - return newValue, nil - - default: - return "", fmt.Errorf("Unsupported modifier (%c) in substitution: %s", modifier, sw.word) - } - } - return "", fmt.Errorf("Missing ':' in substitution: %s", sw.word) - } - // $xxx case - name := sw.processName() - if name == "" { - return "$", nil - } - return sw.getEnv(name), nil -} - -func (sw *shellWord) processName() string { - // Read in a name (alphanumeric or _) - // If it starts with a numeric then just return $# - var name string - - for sw.scanner.Peek() != scanner.EOF { - ch := sw.scanner.Peek() - if len(name) == 0 && unicode.IsDigit(ch) { - ch = sw.scanner.Next() - return string(ch) - } - if !unicode.IsLetter(ch) && !unicode.IsDigit(ch) && ch != '_' { - break - } - ch = sw.scanner.Next() - name += string(ch) - } - - return name -} - -func (sw *shellWord) getEnv(name string) string { - if runtime.GOOS == "windows" { - // Case-insensitive environment variables on Windows - name = strings.ToUpper(name) - } - for _, env := range sw.envs { - i := strings.Index(env, "=") - if i < 0 { - if runtime.GOOS == "windows" { - env = strings.ToUpper(env) - } - if name == env { - // Should probably never get here, but just in case treat - // it like "var" and "var=" are the same - return "" - } - continue - } - compareName := env[:i] - if runtime.GOOS == "windows" { - compareName = strings.ToUpper(compareName) - } - if name != compareName { - continue - } - return env[i+1:] - } - return "" -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/shell_parser_test.go b/vendor/github.com/docker/docker/builder/dockerfile/shell_parser_test.go deleted file mode 100644 index 6cf691c07..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/shell_parser_test.go +++ /dev/null @@ -1,155 +0,0 @@ -package dockerfile - -import ( - "bufio" - "os" - "runtime" - "strings" - "testing" -) - -func TestShellParser4EnvVars(t *testing.T) { - fn := "envVarTest" - lineCount := 0 - - file, err := os.Open(fn) - if err != nil { - t.Fatalf("Can't open '%s': %s", err, fn) - } - defer file.Close() - - scanner := bufio.NewScanner(file) - envs := []string{"PWD=/home", "SHELL=bash", "KOREAN=한국어"} - for scanner.Scan() { - line := scanner.Text() - lineCount++ - - // Trim comments and blank lines - i := strings.Index(line, "#") - if i >= 0 { - line = line[:i] - } - line = strings.TrimSpace(line) - - if line == "" { - continue - } - - words := strings.Split(line, "|") - if len(words) != 3 { - t.Fatalf("Error in '%s' - should be exactly one | in:%q", fn, line) - } - - words[0] = strings.TrimSpace(words[0]) - words[1] = strings.TrimSpace(words[1]) - words[2] = strings.TrimSpace(words[2]) - - // Key W=Windows; A=All; U=Unix - if (words[0] != "W") && (words[0] != "A") && (words[0] != "U") { - t.Fatalf("Invalid tag %s at line %d of %s. Must be W, A or U", words[0], lineCount, fn) - } - - if ((words[0] == "W" || words[0] == "A") && runtime.GOOS == "windows") || - ((words[0] == "U" || words[0] == "A") && runtime.GOOS != "windows") { - newWord, err := ProcessWord(words[1], envs, '\\') - - if err != nil { - newWord = "error" - } - - if newWord != words[2] { - t.Fatalf("Error. Src: %s Calc: %s Expected: %s at line %d", words[1], newWord, words[2], lineCount) - } - } - } -} - -func TestShellParser4Words(t *testing.T) { - fn := "wordsTest" - - file, err := os.Open(fn) - if err != nil { - t.Fatalf("Can't open '%s': %s", err, fn) - } - defer file.Close() - - envs := []string{} - scanner := bufio.NewScanner(file) - for scanner.Scan() { - line := scanner.Text() - - if strings.HasPrefix(line, "#") { - continue - } - - if strings.HasPrefix(line, "ENV ") { - line = strings.TrimLeft(line[3:], " ") - envs = append(envs, line) - continue - } - - words := strings.Split(line, "|") - if len(words) != 2 { - t.Fatalf("Error in '%s' - should be exactly one | in: %q", fn, line) - } - test := strings.TrimSpace(words[0]) - expected := strings.Split(strings.TrimLeft(words[1], " "), ",") - - result, err := ProcessWords(test, envs, '\\') - - if err != nil { - result = []string{"error"} - } - - if len(result) != len(expected) { - t.Fatalf("Error. %q was suppose to result in %q, but got %q instead", test, expected, result) - } - for i, w := range expected { - if w != result[i] { - t.Fatalf("Error. %q was suppose to result in %q, but got %q instead", test, expected, result) - } - } - } -} - -func TestGetEnv(t *testing.T) { - sw := &shellWord{ - word: "", - envs: nil, - pos: 0, - } - - sw.envs = []string{} - if sw.getEnv("foo") != "" { - t.Fatalf("2 - 'foo' should map to ''") - } - - sw.envs = []string{"foo"} - if sw.getEnv("foo") != "" { - t.Fatalf("3 - 'foo' should map to ''") - } - - sw.envs = []string{"foo="} - if sw.getEnv("foo") != "" { - t.Fatalf("4 - 'foo' should map to ''") - } - - sw.envs = []string{"foo=bar"} - if sw.getEnv("foo") != "bar" { - t.Fatalf("5 - 'foo' should map to 'bar'") - } - - sw.envs = []string{"foo=bar", "car=hat"} - if sw.getEnv("foo") != "bar" { - t.Fatalf("6 - 'foo' should map to 'bar'") - } - if sw.getEnv("car") != "hat" { - t.Fatalf("7 - 'car' should map to 'hat'") - } - - // Make sure we grab the first 'car' in the list - sw.envs = []string{"foo=bar", "car=hat", "car=bike"} - if sw.getEnv("car") != "hat" { - t.Fatalf("8 - 'car' should map to 'hat'") - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/support.go b/vendor/github.com/docker/docker/builder/dockerfile/support.go deleted file mode 100644 index e87588910..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/support.go +++ /dev/null @@ -1,19 +0,0 @@ -package dockerfile - -import "strings" - -// handleJSONArgs parses command passed to CMD, ENTRYPOINT, RUN and SHELL instruction in Dockerfile -// for exec form it returns untouched args slice -// for shell form it returns concatenated args as the first element of a slice -func handleJSONArgs(args []string, attributes map[string]bool) []string { - if len(args) == 0 { - return []string{} - } - - if attributes != nil && attributes["json"] { - return args - } - - // literal string command, not an exec array - return []string{strings.Join(args, " ")} -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/support_test.go b/vendor/github.com/docker/docker/builder/dockerfile/support_test.go deleted file mode 100644 index 7cc6fe9dc..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/support_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package dockerfile - -import "testing" - -type testCase struct { - name string - args []string - attributes map[string]bool - expected []string -} - -func initTestCases() []testCase { - testCases := []testCase{} - - testCases = append(testCases, testCase{ - name: "empty args", - args: []string{}, - attributes: make(map[string]bool), - expected: []string{}, - }) - - jsonAttributes := make(map[string]bool) - jsonAttributes["json"] = true - - testCases = append(testCases, testCase{ - name: "json attribute with one element", - args: []string{"foo"}, - attributes: jsonAttributes, - expected: []string{"foo"}, - }) - - testCases = append(testCases, testCase{ - name: "json attribute with two elements", - args: []string{"foo", "bar"}, - attributes: jsonAttributes, - expected: []string{"foo", "bar"}, - }) - - testCases = append(testCases, testCase{ - name: "no attributes", - args: []string{"foo", "bar"}, - attributes: nil, - expected: []string{"foo bar"}, - }) - - return testCases -} - -func TestHandleJSONArgs(t *testing.T) { - testCases := initTestCases() - - for _, test := range testCases { - arguments := handleJSONArgs(test.args, test.attributes) - - if len(arguments) != len(test.expected) { - t.Fatalf("In test \"%s\": length of returned slice is incorrect. Expected: %d, got: %d", test.name, len(test.expected), len(arguments)) - } - - for i := range test.expected { - if arguments[i] != test.expected[i] { - t.Fatalf("In test \"%s\": element as position %d is incorrect. Expected: %s, got: %s", test.name, i, test.expected[i], arguments[i]) - } - } - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/utils_test.go b/vendor/github.com/docker/docker/builder/dockerfile/utils_test.go deleted file mode 100644 index 80a3f1bab..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/utils_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package dockerfile - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" -) - -// createTestTempDir creates a temporary directory for testing. -// It returns the created path and a cleanup function which is meant to be used as deferred call. -// When an error occurs, it terminates the test. -func createTestTempDir(t *testing.T, dir, prefix string) (string, func()) { - path, err := ioutil.TempDir(dir, prefix) - - if err != nil { - t.Fatalf("Error when creating directory %s with prefix %s: %s", dir, prefix, err) - } - - return path, func() { - err = os.RemoveAll(path) - - if err != nil { - t.Fatalf("Error when removing directory %s: %s", path, err) - } - } -} - -// createTestTempFile creates a temporary file within dir with specific contents and permissions. -// When an error occurs, it terminates the test -func createTestTempFile(t *testing.T, dir, filename, contents string, perm os.FileMode) string { - filePath := filepath.Join(dir, filename) - err := ioutil.WriteFile(filePath, []byte(contents), perm) - - if err != nil { - t.Fatalf("Error when creating %s file: %s", filename, err) - } - - return filePath -} - -// createTestSymlink creates a symlink file within dir which points to oldname -func createTestSymlink(t *testing.T, dir, filename, oldname string) string { - filePath := filepath.Join(dir, filename) - if err := os.Symlink(oldname, filePath); err != nil { - t.Fatalf("Error when creating %s symlink to %s: %s", filename, oldname, err) - } - - return filePath -} diff --git a/vendor/github.com/docker/docker/builder/dockerfile/wordsTest b/vendor/github.com/docker/docker/builder/dockerfile/wordsTest deleted file mode 100644 index fa916c67f..000000000 --- a/vendor/github.com/docker/docker/builder/dockerfile/wordsTest +++ /dev/null @@ -1,25 +0,0 @@ -hello | hello -hello${hi}bye | hellobye -ENV hi=hi -hello${hi}bye | hellohibye -ENV space=abc def -hello${space}bye | helloabc,defbye -hello"${space}"bye | helloabc defbye -hello "${space}"bye | hello,abc defbye -ENV leading= ab c -hello${leading}def | hello,ab,cdef -hello"${leading}" def | hello ab c,def -hello"${leading}" | hello ab c -hello${leading} | hello,ab,c -# next line MUST have 3 trailing spaces, don't erase them! -ENV trailing=ab c -hello${trailing} | helloab,c -hello${trailing}d | helloab,c,d -hello"${trailing}"d | helloab c d -# next line MUST have 3 trailing spaces, don't erase them! -hel"lo${trailing}" | helloab c -hello" there " | hello there -hello there | hello,there -hello\ there | hello there -hello" there | hello there -hello\" there | hello",there diff --git a/vendor/github.com/docker/docker/builder/dockerignore.go b/vendor/github.com/docker/docker/builder/dockerignore.go deleted file mode 100644 index 3da791336..000000000 --- a/vendor/github.com/docker/docker/builder/dockerignore.go +++ /dev/null @@ -1,48 +0,0 @@ -package builder - -import ( - "os" - - "github.com/docker/docker/builder/dockerignore" - "github.com/docker/docker/pkg/fileutils" -) - -// DockerIgnoreContext wraps a ModifiableContext to add a method -// for handling the .dockerignore file at the root of the context. -type DockerIgnoreContext struct { - ModifiableContext -} - -// Process reads the .dockerignore file at the root of the embedded context. -// If .dockerignore does not exist in the context, then nil is returned. -// -// It can take a list of files to be removed after .dockerignore is removed. -// This is used for server-side implementations of builders that need to send -// the .dockerignore file as well as the special files specified in filesToRemove, -// but expect them to be excluded from the context after they were processed. -// -// For example, server-side Dockerfile builders are expected to pass in the name -// of the Dockerfile to be removed after it was parsed. -// -// TODO: Don't require a ModifiableContext (use Context instead) and don't remove -// files, instead handle a list of files to be excluded from the context. -func (c DockerIgnoreContext) Process(filesToRemove []string) error { - f, err := c.Open(".dockerignore") - // Note that a missing .dockerignore file isn't treated as an error - if err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - excludes, _ := dockerignore.ReadAll(f) - f.Close() - filesToRemove = append([]string{".dockerignore"}, filesToRemove...) - for _, fileToRemove := range filesToRemove { - rm, _ := fileutils.Matches(fileToRemove, excludes) - if rm { - c.Remove(fileToRemove) - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/builder/dockerignore/dockerignore.go b/vendor/github.com/docker/docker/builder/dockerignore/dockerignore.go deleted file mode 100644 index 2db67be79..000000000 --- a/vendor/github.com/docker/docker/builder/dockerignore/dockerignore.go +++ /dev/null @@ -1,49 +0,0 @@ -package dockerignore - -import ( - "bufio" - "bytes" - "fmt" - "io" - "path/filepath" - "strings" -) - -// ReadAll reads a .dockerignore file and returns the list of file patterns -// to ignore. Note this will trim whitespace from each line as well -// as use GO's "clean" func to get the shortest/cleanest path for each. -func ReadAll(reader io.Reader) ([]string, error) { - if reader == nil { - return nil, nil - } - - scanner := bufio.NewScanner(reader) - var excludes []string - currentLine := 0 - - utf8bom := []byte{0xEF, 0xBB, 0xBF} - for scanner.Scan() { - scannedBytes := scanner.Bytes() - // We trim UTF8 BOM - if currentLine == 0 { - scannedBytes = bytes.TrimPrefix(scannedBytes, utf8bom) - } - pattern := string(scannedBytes) - currentLine++ - // Lines starting with # (comments) are ignored before processing - if strings.HasPrefix(pattern, "#") { - continue - } - pattern = strings.TrimSpace(pattern) - if pattern == "" { - continue - } - pattern = filepath.Clean(pattern) - pattern = filepath.ToSlash(pattern) - excludes = append(excludes, pattern) - } - if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("Error reading .dockerignore: %v", err) - } - return excludes, nil -} diff --git a/vendor/github.com/docker/docker/builder/dockerignore/dockerignore_test.go b/vendor/github.com/docker/docker/builder/dockerignore/dockerignore_test.go deleted file mode 100644 index 612a1399c..000000000 --- a/vendor/github.com/docker/docker/builder/dockerignore/dockerignore_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package dockerignore - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "testing" -) - -func TestReadAll(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "dockerignore-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpDir) - - di, err := ReadAll(nil) - if err != nil { - t.Fatalf("Expected not to have error, got %v", err) - } - - if diLen := len(di); diLen != 0 { - t.Fatalf("Expected to have zero dockerignore entry, got %d", diLen) - } - - diName := filepath.Join(tmpDir, ".dockerignore") - content := fmt.Sprintf("test1\n/test2\n/a/file/here\n\nlastfile") - err = ioutil.WriteFile(diName, []byte(content), 0777) - if err != nil { - t.Fatal(err) - } - - diFd, err := os.Open(diName) - if err != nil { - t.Fatal(err) - } - defer diFd.Close() - - di, err = ReadAll(diFd) - if err != nil { - t.Fatal(err) - } - - if di[0] != "test1" { - t.Fatalf("First element is not test1") - } - if di[1] != "/test2" { - t.Fatalf("Second element is not /test2") - } - if di[2] != "/a/file/here" { - t.Fatalf("Third element is not /a/file/here") - } - if di[3] != "lastfile" { - t.Fatalf("Fourth element is not lastfile") - } -} diff --git a/vendor/github.com/docker/docker/builder/dockerignore_test.go b/vendor/github.com/docker/docker/builder/dockerignore_test.go deleted file mode 100644 index 3c0ceda4c..000000000 --- a/vendor/github.com/docker/docker/builder/dockerignore_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package builder - -import ( - "io/ioutil" - "log" - "os" - "sort" - "testing" -) - -const shouldStayFilename = "should_stay" - -func extractFilenames(files []os.FileInfo) []string { - filenames := make([]string, len(files), len(files)) - - for i, file := range files { - filenames[i] = file.Name() - } - - return filenames -} - -func checkDirectory(t *testing.T, dir string, expectedFiles []string) { - files, err := ioutil.ReadDir(dir) - - if err != nil { - t.Fatalf("Could not read directory: %s", err) - } - - if len(files) != len(expectedFiles) { - log.Fatalf("Directory should contain exactly %d file(s), got %d", len(expectedFiles), len(files)) - } - - filenames := extractFilenames(files) - sort.Strings(filenames) - sort.Strings(expectedFiles) - - for i, filename := range filenames { - if filename != expectedFiles[i] { - t.Fatalf("File %s should be in the directory, got: %s", expectedFiles[i], filename) - } - } -} - -func executeProcess(t *testing.T, contextDir string) { - modifiableCtx := &tarSumContext{root: contextDir} - ctx := DockerIgnoreContext{ModifiableContext: modifiableCtx} - - err := ctx.Process([]string{DefaultDockerfileName}) - - if err != nil { - t.Fatalf("Error when executing Process: %s", err) - } -} - -func TestProcessShouldRemoveDockerfileDockerignore(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-dockerignore-process-test") - defer cleanup() - - createTestTempFile(t, contextDir, shouldStayFilename, testfileContents, 0777) - createTestTempFile(t, contextDir, dockerignoreFilename, "Dockerfile\n.dockerignore", 0777) - createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777) - - executeProcess(t, contextDir) - - checkDirectory(t, contextDir, []string{shouldStayFilename}) - -} - -func TestProcessNoDockerignore(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-dockerignore-process-test") - defer cleanup() - - createTestTempFile(t, contextDir, shouldStayFilename, testfileContents, 0777) - createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777) - - executeProcess(t, contextDir) - - checkDirectory(t, contextDir, []string{shouldStayFilename, DefaultDockerfileName}) - -} - -func TestProcessShouldLeaveAllFiles(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-dockerignore-process-test") - defer cleanup() - - createTestTempFile(t, contextDir, shouldStayFilename, testfileContents, 0777) - createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777) - createTestTempFile(t, contextDir, dockerignoreFilename, "input1\ninput2", 0777) - - executeProcess(t, contextDir) - - checkDirectory(t, contextDir, []string{shouldStayFilename, DefaultDockerfileName, dockerignoreFilename}) - -} diff --git a/vendor/github.com/docker/docker/builder/git.go b/vendor/github.com/docker/docker/builder/git.go deleted file mode 100644 index 74df24461..000000000 --- a/vendor/github.com/docker/docker/builder/git.go +++ /dev/null @@ -1,28 +0,0 @@ -package builder - -import ( - "os" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/gitutils" -) - -// MakeGitContext returns a Context from gitURL that is cloned in a temporary directory. -func MakeGitContext(gitURL string) (ModifiableContext, error) { - root, err := gitutils.Clone(gitURL) - if err != nil { - return nil, err - } - - c, err := archive.Tar(root, archive.Uncompressed) - if err != nil { - return nil, err - } - - defer func() { - // TODO: print errors? - c.Close() - os.RemoveAll(root) - }() - return MakeTarSumContext(c) -} diff --git a/vendor/github.com/docker/docker/builder/remote.go b/vendor/github.com/docker/docker/builder/remote.go deleted file mode 100644 index f3a4329d1..000000000 --- a/vendor/github.com/docker/docker/builder/remote.go +++ /dev/null @@ -1,157 +0,0 @@ -package builder - -import ( - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "regexp" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/httputils" - "github.com/docker/docker/pkg/urlutil" -) - -// When downloading remote contexts, limit the amount (in bytes) -// to be read from the response body in order to detect its Content-Type -const maxPreambleLength = 100 - -const acceptableRemoteMIME = `(?:application/(?:(?:x\-)?tar|octet\-stream|((?:x\-)?(?:gzip|bzip2?|xz)))|(?:text/plain))` - -var mimeRe = regexp.MustCompile(acceptableRemoteMIME) - -// MakeRemoteContext downloads a context from remoteURL and returns it. -// -// If contentTypeHandlers is non-nil, then the Content-Type header is read along with a maximum of -// maxPreambleLength bytes from the body to help detecting the MIME type. -// Look at acceptableRemoteMIME for more details. -// -// If a match is found, then the body is sent to the contentType handler and a (potentially compressed) tar stream is expected -// to be returned. If no match is found, it is assumed the body is a tar stream (compressed or not). -// In either case, an (assumed) tar stream is passed to MakeTarSumContext whose result is returned. -func MakeRemoteContext(remoteURL string, contentTypeHandlers map[string]func(io.ReadCloser) (io.ReadCloser, error)) (ModifiableContext, error) { - f, err := httputils.Download(remoteURL) - if err != nil { - return nil, fmt.Errorf("error downloading remote context %s: %v", remoteURL, err) - } - defer f.Body.Close() - - var contextReader io.ReadCloser - if contentTypeHandlers != nil { - contentType := f.Header.Get("Content-Type") - clen := f.ContentLength - - contentType, contextReader, err = inspectResponse(contentType, f.Body, clen) - if err != nil { - return nil, fmt.Errorf("error detecting content type for remote %s: %v", remoteURL, err) - } - defer contextReader.Close() - - // This loop tries to find a content-type handler for the detected content-type. - // If it could not find one from the caller-supplied map, it tries the empty content-type `""` - // which is interpreted as a fallback handler (usually used for raw tar contexts). - for _, ct := range []string{contentType, ""} { - if fn, ok := contentTypeHandlers[ct]; ok { - defer contextReader.Close() - if contextReader, err = fn(contextReader); err != nil { - return nil, err - } - break - } - } - } - - // Pass through - this is a pre-packaged context, presumably - // with a Dockerfile with the right name inside it. - return MakeTarSumContext(contextReader) -} - -// DetectContextFromRemoteURL returns a context and in certain cases the name of the dockerfile to be used -// irrespective of user input. -// progressReader is only used if remoteURL is actually a URL (not empty, and not a Git endpoint). -func DetectContextFromRemoteURL(r io.ReadCloser, remoteURL string, createProgressReader func(in io.ReadCloser) io.ReadCloser) (context ModifiableContext, dockerfileName string, err error) { - switch { - case remoteURL == "": - context, err = MakeTarSumContext(r) - case urlutil.IsGitURL(remoteURL): - context, err = MakeGitContext(remoteURL) - case urlutil.IsURL(remoteURL): - context, err = MakeRemoteContext(remoteURL, map[string]func(io.ReadCloser) (io.ReadCloser, error){ - httputils.MimeTypes.TextPlain: func(rc io.ReadCloser) (io.ReadCloser, error) { - dockerfile, err := ioutil.ReadAll(rc) - if err != nil { - return nil, err - } - - // dockerfileName is set to signal that the remote was interpreted as a single Dockerfile, in which case the caller - // should use dockerfileName as the new name for the Dockerfile, irrespective of any other user input. - dockerfileName = DefaultDockerfileName - - // TODO: return a context without tarsum - r, err := archive.Generate(dockerfileName, string(dockerfile)) - if err != nil { - return nil, err - } - - return ioutil.NopCloser(r), nil - }, - // fallback handler (tar context) - "": func(rc io.ReadCloser) (io.ReadCloser, error) { - return createProgressReader(rc), nil - }, - }) - default: - err = fmt.Errorf("remoteURL (%s) could not be recognized as URL", remoteURL) - } - return -} - -// inspectResponse looks into the http response data at r to determine whether its -// content-type is on the list of acceptable content types for remote build contexts. -// This function returns: -// - a string representation of the detected content-type -// - an io.Reader for the response body -// - an error value which will be non-nil either when something goes wrong while -// reading bytes from r or when the detected content-type is not acceptable. -func inspectResponse(ct string, r io.ReadCloser, clen int64) (string, io.ReadCloser, error) { - plen := clen - if plen <= 0 || plen > maxPreambleLength { - plen = maxPreambleLength - } - - preamble := make([]byte, plen, plen) - rlen, err := r.Read(preamble) - if rlen == 0 { - return ct, r, errors.New("empty response") - } - if err != nil && err != io.EOF { - return ct, r, err - } - - preambleR := bytes.NewReader(preamble) - bodyReader := ioutil.NopCloser(io.MultiReader(preambleR, r)) - // Some web servers will use application/octet-stream as the default - // content type for files without an extension (e.g. 'Dockerfile') - // so if we receive this value we better check for text content - contentType := ct - if len(ct) == 0 || ct == httputils.MimeTypes.OctetStream { - contentType, _, err = httputils.DetectContentType(preamble) - if err != nil { - return contentType, bodyReader, err - } - } - - contentType = selectAcceptableMIME(contentType) - var cterr error - if len(contentType) == 0 { - cterr = fmt.Errorf("unsupported Content-Type %q", ct) - contentType = ct - } - - return contentType, bodyReader, cterr -} - -func selectAcceptableMIME(ct string) string { - return mimeRe.FindString(ct) -} diff --git a/vendor/github.com/docker/docker/builder/remote_test.go b/vendor/github.com/docker/docker/builder/remote_test.go deleted file mode 100644 index 691a08476..000000000 --- a/vendor/github.com/docker/docker/builder/remote_test.go +++ /dev/null @@ -1,213 +0,0 @@ -package builder - -import ( - "bytes" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "testing" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/httputils" -) - -var binaryContext = []byte{0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00} //xz magic - -func TestSelectAcceptableMIME(t *testing.T) { - validMimeStrings := []string{ - "application/x-bzip2", - "application/bzip2", - "application/gzip", - "application/x-gzip", - "application/x-xz", - "application/xz", - "application/tar", - "application/x-tar", - "application/octet-stream", - "text/plain", - } - - invalidMimeStrings := []string{ - "", - "application/octet", - "application/json", - } - - for _, m := range invalidMimeStrings { - if len(selectAcceptableMIME(m)) > 0 { - t.Fatalf("Should not have accepted %q", m) - } - } - - for _, m := range validMimeStrings { - if str := selectAcceptableMIME(m); str == "" { - t.Fatalf("Should have accepted %q", m) - } - } -} - -func TestInspectEmptyResponse(t *testing.T) { - ct := "application/octet-stream" - br := ioutil.NopCloser(bytes.NewReader([]byte(""))) - contentType, bReader, err := inspectResponse(ct, br, 0) - if err == nil { - t.Fatalf("Should have generated an error for an empty response") - } - if contentType != "application/octet-stream" { - t.Fatalf("Content type should be 'application/octet-stream' but is %q", contentType) - } - body, err := ioutil.ReadAll(bReader) - if err != nil { - t.Fatal(err) - } - if len(body) != 0 { - t.Fatal("response body should remain empty") - } -} - -func TestInspectResponseBinary(t *testing.T) { - ct := "application/octet-stream" - br := ioutil.NopCloser(bytes.NewReader(binaryContext)) - contentType, bReader, err := inspectResponse(ct, br, int64(len(binaryContext))) - if err != nil { - t.Fatal(err) - } - if contentType != "application/octet-stream" { - t.Fatalf("Content type should be 'application/octet-stream' but is %q", contentType) - } - body, err := ioutil.ReadAll(bReader) - if err != nil { - t.Fatal(err) - } - if len(body) != len(binaryContext) { - t.Fatalf("Wrong response size %d, should be == len(binaryContext)", len(body)) - } - for i := range body { - if body[i] != binaryContext[i] { - t.Fatalf("Corrupted response body at byte index %d", i) - } - } -} - -func TestResponseUnsupportedContentType(t *testing.T) { - content := []byte(dockerfileContents) - ct := "application/json" - br := ioutil.NopCloser(bytes.NewReader(content)) - contentType, bReader, err := inspectResponse(ct, br, int64(len(dockerfileContents))) - - if err == nil { - t.Fatal("Should have returned an error on content-type 'application/json'") - } - if contentType != ct { - t.Fatalf("Should not have altered content-type: orig: %s, altered: %s", ct, contentType) - } - body, err := ioutil.ReadAll(bReader) - if err != nil { - t.Fatal(err) - } - if string(body) != dockerfileContents { - t.Fatalf("Corrupted response body %s", body) - } -} - -func TestInspectResponseTextSimple(t *testing.T) { - content := []byte(dockerfileContents) - ct := "text/plain" - br := ioutil.NopCloser(bytes.NewReader(content)) - contentType, bReader, err := inspectResponse(ct, br, int64(len(content))) - if err != nil { - t.Fatal(err) - } - if contentType != "text/plain" { - t.Fatalf("Content type should be 'text/plain' but is %q", contentType) - } - body, err := ioutil.ReadAll(bReader) - if err != nil { - t.Fatal(err) - } - if string(body) != dockerfileContents { - t.Fatalf("Corrupted response body %s", body) - } -} - -func TestInspectResponseEmptyContentType(t *testing.T) { - content := []byte(dockerfileContents) - br := ioutil.NopCloser(bytes.NewReader(content)) - contentType, bodyReader, err := inspectResponse("", br, int64(len(content))) - if err != nil { - t.Fatal(err) - } - if contentType != "text/plain" { - t.Fatalf("Content type should be 'text/plain' but is %q", contentType) - } - body, err := ioutil.ReadAll(bodyReader) - if err != nil { - t.Fatal(err) - } - if string(body) != dockerfileContents { - t.Fatalf("Corrupted response body %s", body) - } -} - -func TestMakeRemoteContext(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test") - defer cleanup() - - createTestTempFile(t, contextDir, DefaultDockerfileName, dockerfileContents, 0777) - - mux := http.NewServeMux() - server := httptest.NewServer(mux) - serverURL, _ := url.Parse(server.URL) - - serverURL.Path = "/" + DefaultDockerfileName - remoteURL := serverURL.String() - - mux.Handle("/", http.FileServer(http.Dir(contextDir))) - - remoteContext, err := MakeRemoteContext(remoteURL, map[string]func(io.ReadCloser) (io.ReadCloser, error){ - httputils.MimeTypes.TextPlain: func(rc io.ReadCloser) (io.ReadCloser, error) { - dockerfile, err := ioutil.ReadAll(rc) - if err != nil { - return nil, err - } - - r, err := archive.Generate(DefaultDockerfileName, string(dockerfile)) - if err != nil { - return nil, err - } - return ioutil.NopCloser(r), nil - }, - }) - - if err != nil { - t.Fatalf("Error when executing DetectContextFromRemoteURL: %s", err) - } - - if remoteContext == nil { - t.Fatalf("Remote context should not be nil") - } - - tarSumCtx, ok := remoteContext.(*tarSumContext) - - if !ok { - t.Fatalf("Cast error, remote context should be casted to tarSumContext") - } - - fileInfoSums := tarSumCtx.sums - - if fileInfoSums.Len() != 1 { - t.Fatalf("Size of file info sums should be 1, got: %d", fileInfoSums.Len()) - } - - fileInfo := fileInfoSums.GetFile(DefaultDockerfileName) - - if fileInfo == nil { - t.Fatalf("There should be file named %s in fileInfoSums", DefaultDockerfileName) - } - - if fileInfo.Pos() != 0 { - t.Fatalf("File %s should have position 0, got %d", DefaultDockerfileName, fileInfo.Pos()) - } -} diff --git a/vendor/github.com/docker/docker/builder/tarsum.go b/vendor/github.com/docker/docker/builder/tarsum.go deleted file mode 100644 index 35054dcba..000000000 --- a/vendor/github.com/docker/docker/builder/tarsum.go +++ /dev/null @@ -1,158 +0,0 @@ -package builder - -import ( - "fmt" - "io" - "os" - "path/filepath" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/chrootarchive" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/symlink" - "github.com/docker/docker/pkg/tarsum" -) - -type tarSumContext struct { - root string - sums tarsum.FileInfoSums -} - -func (c *tarSumContext) Close() error { - return os.RemoveAll(c.root) -} - -func convertPathError(err error, cleanpath string) error { - if err, ok := err.(*os.PathError); ok { - err.Path = cleanpath - return err - } - return err -} - -func (c *tarSumContext) Open(path string) (io.ReadCloser, error) { - cleanpath, fullpath, err := c.normalize(path) - if err != nil { - return nil, err - } - r, err := os.Open(fullpath) - if err != nil { - return nil, convertPathError(err, cleanpath) - } - return r, nil -} - -func (c *tarSumContext) Stat(path string) (string, FileInfo, error) { - cleanpath, fullpath, err := c.normalize(path) - if err != nil { - return "", nil, err - } - - st, err := os.Lstat(fullpath) - if err != nil { - return "", nil, convertPathError(err, cleanpath) - } - - rel, err := filepath.Rel(c.root, fullpath) - if err != nil { - return "", nil, convertPathError(err, cleanpath) - } - - // We set sum to path by default for the case where GetFile returns nil. - // The usual case is if relative path is empty. - sum := path - // Use the checksum of the followed path(not the possible symlink) because - // this is the file that is actually copied. - if tsInfo := c.sums.GetFile(filepath.ToSlash(rel)); tsInfo != nil { - sum = tsInfo.Sum() - } - fi := &HashedFileInfo{PathFileInfo{st, fullpath, filepath.Base(cleanpath)}, sum} - return rel, fi, nil -} - -// MakeTarSumContext returns a build Context from a tar stream. -// -// It extracts the tar stream to a temporary folder that is deleted as soon as -// the Context is closed. -// As the extraction happens, a tarsum is calculated for every file, and the set of -// all those sums then becomes the source of truth for all operations on this Context. -// -// Closing tarStream has to be done by the caller. -func MakeTarSumContext(tarStream io.Reader) (ModifiableContext, error) { - root, err := ioutils.TempDir("", "docker-builder") - if err != nil { - return nil, err - } - - tsc := &tarSumContext{root: root} - - // Make sure we clean-up upon error. In the happy case the caller - // is expected to manage the clean-up - defer func() { - if err != nil { - tsc.Close() - } - }() - - decompressedStream, err := archive.DecompressStream(tarStream) - if err != nil { - return nil, err - } - - sum, err := tarsum.NewTarSum(decompressedStream, true, tarsum.Version1) - if err != nil { - return nil, err - } - - if err := chrootarchive.Untar(sum, root, nil); err != nil { - return nil, err - } - - tsc.sums = sum.GetSums() - - return tsc, nil -} - -func (c *tarSumContext) normalize(path string) (cleanpath, fullpath string, err error) { - cleanpath = filepath.Clean(string(os.PathSeparator) + path)[1:] - fullpath, err = symlink.FollowSymlinkInScope(filepath.Join(c.root, path), c.root) - if err != nil { - return "", "", fmt.Errorf("Forbidden path outside the build context: %s (%s)", path, fullpath) - } - _, err = os.Lstat(fullpath) - if err != nil { - return "", "", convertPathError(err, path) - } - return -} - -func (c *tarSumContext) Walk(root string, walkFn WalkFunc) error { - root = filepath.Join(c.root, filepath.Join(string(filepath.Separator), root)) - return filepath.Walk(root, func(fullpath string, info os.FileInfo, err error) error { - rel, err := filepath.Rel(c.root, fullpath) - if err != nil { - return err - } - if rel == "." { - return nil - } - - sum := rel - if tsInfo := c.sums.GetFile(filepath.ToSlash(rel)); tsInfo != nil { - sum = tsInfo.Sum() - } - fi := &HashedFileInfo{PathFileInfo{FileInfo: info, FilePath: fullpath}, sum} - if err := walkFn(rel, fi, nil); err != nil { - return err - } - return nil - }) -} - -func (c *tarSumContext) Remove(path string) error { - _, fullpath, err := c.normalize(path) - if err != nil { - return err - } - return os.RemoveAll(fullpath) -} diff --git a/vendor/github.com/docker/docker/builder/tarsum_test.go b/vendor/github.com/docker/docker/builder/tarsum_test.go deleted file mode 100644 index 278e5830d..000000000 --- a/vendor/github.com/docker/docker/builder/tarsum_test.go +++ /dev/null @@ -1,265 +0,0 @@ -package builder - -import ( - "bufio" - "bytes" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/reexec" -) - -const ( - filename = "test" - contents = "contents test" -) - -func init() { - reexec.Init() -} - -func TestCloseRootDirectory(t *testing.T) { - contextDir, err := ioutil.TempDir("", "builder-tarsum-test") - - if err != nil { - t.Fatalf("Error with creating temporary directory: %s", err) - } - - tarsum := &tarSumContext{root: contextDir} - - err = tarsum.Close() - - if err != nil { - t.Fatalf("Error while executing Close: %s", err) - } - - _, err = os.Stat(contextDir) - - if !os.IsNotExist(err) { - t.Fatalf("Directory should not exist at this point") - defer os.RemoveAll(contextDir) - } -} - -func TestOpenFile(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test") - defer cleanup() - - createTestTempFile(t, contextDir, filename, contents, 0777) - - tarSum := &tarSumContext{root: contextDir} - - file, err := tarSum.Open(filename) - - if err != nil { - t.Fatalf("Error when executing Open: %s", err) - } - - defer file.Close() - - scanner := bufio.NewScanner(file) - buff := bytes.NewBufferString("") - - for scanner.Scan() { - buff.WriteString(scanner.Text()) - } - - if contents != buff.String() { - t.Fatalf("Contents are not equal. Expected: %s, got: %s", contents, buff.String()) - } - -} - -func TestOpenNotExisting(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test") - defer cleanup() - - tarSum := &tarSumContext{root: contextDir} - - file, err := tarSum.Open("not-existing") - - if file != nil { - t.Fatal("Opened file should be nil") - } - - if !os.IsNotExist(err) { - t.Fatalf("Error when executing Open: %s", err) - } -} - -func TestStatFile(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test") - defer cleanup() - - testFilename := createTestTempFile(t, contextDir, filename, contents, 0777) - - tarSum := &tarSumContext{root: contextDir} - - relPath, fileInfo, err := tarSum.Stat(filename) - - if err != nil { - t.Fatalf("Error when executing Stat: %s", err) - } - - if relPath != filename { - t.Fatalf("Relative path should be equal to %s, got %s", filename, relPath) - } - - if fileInfo.Path() != testFilename { - t.Fatalf("Full path should be equal to %s, got %s", testFilename, fileInfo.Path()) - } -} - -func TestStatSubdir(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test") - defer cleanup() - - contextSubdir := createTestTempSubdir(t, contextDir, "builder-tarsum-test-subdir") - - testFilename := createTestTempFile(t, contextSubdir, filename, contents, 0777) - - tarSum := &tarSumContext{root: contextDir} - - relativePath, err := filepath.Rel(contextDir, testFilename) - - if err != nil { - t.Fatalf("Error when getting relative path: %s", err) - } - - relPath, fileInfo, err := tarSum.Stat(relativePath) - - if err != nil { - t.Fatalf("Error when executing Stat: %s", err) - } - - if relPath != relativePath { - t.Fatalf("Relative path should be equal to %s, got %s", relativePath, relPath) - } - - if fileInfo.Path() != testFilename { - t.Fatalf("Full path should be equal to %s, got %s", testFilename, fileInfo.Path()) - } -} - -func TestStatNotExisting(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test") - defer cleanup() - - tarSum := &tarSumContext{root: contextDir} - - relPath, fileInfo, err := tarSum.Stat("not-existing") - - if relPath != "" { - t.Fatal("Relative path should be nil") - } - - if fileInfo != nil { - t.Fatalf("File info should be nil") - } - - if !os.IsNotExist(err) { - t.Fatalf("This file should not exist: %s", err) - } -} - -func TestRemoveDirectory(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test") - defer cleanup() - - contextSubdir := createTestTempSubdir(t, contextDir, "builder-tarsum-test-subdir") - - relativePath, err := filepath.Rel(contextDir, contextSubdir) - - if err != nil { - t.Fatalf("Error when getting relative path: %s", err) - } - - tarSum := &tarSumContext{root: contextDir} - - err = tarSum.Remove(relativePath) - - if err != nil { - t.Fatalf("Error when executing Remove: %s", err) - } - - _, err = os.Stat(contextSubdir) - - if !os.IsNotExist(err) { - t.Fatalf("Directory should not exist at this point") - } -} - -func TestMakeTarSumContext(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test") - defer cleanup() - - createTestTempFile(t, contextDir, filename, contents, 0777) - - tarStream, err := archive.Tar(contextDir, archive.Uncompressed) - - if err != nil { - t.Fatalf("error: %s", err) - } - - defer tarStream.Close() - - tarSum, err := MakeTarSumContext(tarStream) - - if err != nil { - t.Fatalf("Error when executing MakeTarSumContext: %s", err) - } - - if tarSum == nil { - t.Fatalf("Tar sum context should not be nil") - } -} - -func TestWalkWithoutError(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test") - defer cleanup() - - contextSubdir := createTestTempSubdir(t, contextDir, "builder-tarsum-test-subdir") - - createTestTempFile(t, contextSubdir, filename, contents, 0777) - - tarSum := &tarSumContext{root: contextDir} - - walkFun := func(path string, fi FileInfo, err error) error { - return nil - } - - err := tarSum.Walk(contextSubdir, walkFun) - - if err != nil { - t.Fatalf("Error when executing Walk: %s", err) - } -} - -type WalkError struct { -} - -func (we WalkError) Error() string { - return "Error when executing Walk" -} - -func TestWalkWithError(t *testing.T) { - contextDir, cleanup := createTestTempDir(t, "", "builder-tarsum-test") - defer cleanup() - - contextSubdir := createTestTempSubdir(t, contextDir, "builder-tarsum-test-subdir") - - tarSum := &tarSumContext{root: contextDir} - - walkFun := func(path string, fi FileInfo, err error) error { - return WalkError{} - } - - err := tarSum.Walk(contextSubdir, walkFun) - - if err == nil { - t.Fatalf("Error should not be nil") - } -} diff --git a/vendor/github.com/docker/docker/builder/utils_test.go b/vendor/github.com/docker/docker/builder/utils_test.go deleted file mode 100644 index 1101ff1d1..000000000 --- a/vendor/github.com/docker/docker/builder/utils_test.go +++ /dev/null @@ -1,87 +0,0 @@ -package builder - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" -) - -const ( - dockerfileContents = "FROM busybox" - dockerignoreFilename = ".dockerignore" - testfileContents = "test" -) - -// createTestTempDir creates a temporary directory for testing. -// It returns the created path and a cleanup function which is meant to be used as deferred call. -// When an error occurs, it terminates the test. -func createTestTempDir(t *testing.T, dir, prefix string) (string, func()) { - path, err := ioutil.TempDir(dir, prefix) - - if err != nil { - t.Fatalf("Error when creating directory %s with prefix %s: %s", dir, prefix, err) - } - - return path, func() { - err = os.RemoveAll(path) - - if err != nil { - t.Fatalf("Error when removing directory %s: %s", path, err) - } - } -} - -// createTestTempSubdir creates a temporary directory for testing. -// It returns the created path but doesn't provide a cleanup function, -// so createTestTempSubdir should be used only for creating temporary subdirectories -// whose parent directories are properly cleaned up. -// When an error occurs, it terminates the test. -func createTestTempSubdir(t *testing.T, dir, prefix string) string { - path, err := ioutil.TempDir(dir, prefix) - - if err != nil { - t.Fatalf("Error when creating directory %s with prefix %s: %s", dir, prefix, err) - } - - return path -} - -// createTestTempFile creates a temporary file within dir with specific contents and permissions. -// When an error occurs, it terminates the test -func createTestTempFile(t *testing.T, dir, filename, contents string, perm os.FileMode) string { - filePath := filepath.Join(dir, filename) - err := ioutil.WriteFile(filePath, []byte(contents), perm) - - if err != nil { - t.Fatalf("Error when creating %s file: %s", filename, err) - } - - return filePath -} - -// chdir changes current working directory to dir. -// It returns a function which changes working directory back to the previous one. -// This function is meant to be executed as a deferred call. -// When an error occurs, it terminates the test. -func chdir(t *testing.T, dir string) func() { - workingDirectory, err := os.Getwd() - - if err != nil { - t.Fatalf("Error when retrieving working directory: %s", err) - } - - err = os.Chdir(dir) - - if err != nil { - t.Fatalf("Error when changing directory to %s: %s", dir, err) - } - - return func() { - err = os.Chdir(workingDirectory) - - if err != nil { - t.Fatalf("Error when changing back to working directory (%s): %s", workingDirectory, err) - } - } -} diff --git a/vendor/github.com/docker/docker/cli/command/bundlefile/bundlefile.go b/vendor/github.com/docker/docker/cli/command/bundlefile/bundlefile.go deleted file mode 100644 index 7fd1e4f6c..000000000 --- a/vendor/github.com/docker/docker/cli/command/bundlefile/bundlefile.go +++ /dev/null @@ -1,69 +0,0 @@ -package bundlefile - -import ( - "encoding/json" - "fmt" - "io" -) - -// Bundlefile stores the contents of a bundlefile -type Bundlefile struct { - Version string - Services map[string]Service -} - -// Service is a service from a bundlefile -type Service struct { - Image string - Command []string `json:",omitempty"` - Args []string `json:",omitempty"` - Env []string `json:",omitempty"` - Labels map[string]string `json:",omitempty"` - Ports []Port `json:",omitempty"` - WorkingDir *string `json:",omitempty"` - User *string `json:",omitempty"` - Networks []string `json:",omitempty"` -} - -// Port is a port as defined in a bundlefile -type Port struct { - Protocol string - Port uint32 -} - -// LoadFile loads a bundlefile from a path to the file -func LoadFile(reader io.Reader) (*Bundlefile, error) { - bundlefile := &Bundlefile{} - - decoder := json.NewDecoder(reader) - if err := decoder.Decode(bundlefile); err != nil { - switch jsonErr := err.(type) { - case *json.SyntaxError: - return nil, fmt.Errorf( - "JSON syntax error at byte %v: %s", - jsonErr.Offset, - jsonErr.Error()) - case *json.UnmarshalTypeError: - return nil, fmt.Errorf( - "Unexpected type at byte %v. Expected %s but received %s.", - jsonErr.Offset, - jsonErr.Type, - jsonErr.Value) - } - return nil, err - } - - return bundlefile, nil -} - -// Print writes the contents of the bundlefile to the output writer -// as human readable json -func Print(out io.Writer, bundle *Bundlefile) error { - bytes, err := json.MarshalIndent(*bundle, "", " ") - if err != nil { - return err - } - - _, err = out.Write(bytes) - return err -} diff --git a/vendor/github.com/docker/docker/cli/command/bundlefile/bundlefile_test.go b/vendor/github.com/docker/docker/cli/command/bundlefile/bundlefile_test.go deleted file mode 100644 index c343410df..000000000 --- a/vendor/github.com/docker/docker/cli/command/bundlefile/bundlefile_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package bundlefile - -import ( - "bytes" - "strings" - "testing" - - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestLoadFileV01Success(t *testing.T) { - reader := strings.NewReader(`{ - "Version": "0.1", - "Services": { - "redis": { - "Image": "redis@sha256:4b24131101fa0117bcaa18ac37055fffd9176aa1a240392bb8ea85e0be50f2ce", - "Networks": ["default"] - }, - "web": { - "Image": "dockercloud/hello-world@sha256:fe79a2cfbd17eefc344fb8419420808df95a1e22d93b7f621a7399fd1e9dca1d", - "Networks": ["default"], - "User": "web" - } - } - }`) - - bundle, err := LoadFile(reader) - assert.NilError(t, err) - assert.Equal(t, bundle.Version, "0.1") - assert.Equal(t, len(bundle.Services), 2) -} - -func TestLoadFileSyntaxError(t *testing.T) { - reader := strings.NewReader(`{ - "Version": "0.1", - "Services": unquoted string - }`) - - _, err := LoadFile(reader) - assert.Error(t, err, "syntax error at byte 37: invalid character 'u'") -} - -func TestLoadFileTypeError(t *testing.T) { - reader := strings.NewReader(`{ - "Version": "0.1", - "Services": { - "web": { - "Image": "redis", - "Networks": "none" - } - } - }`) - - _, err := LoadFile(reader) - assert.Error(t, err, "Unexpected type at byte 94. Expected []string but received string") -} - -func TestPrint(t *testing.T) { - var buffer bytes.Buffer - bundle := &Bundlefile{ - Version: "0.1", - Services: map[string]Service{ - "web": { - Image: "image", - Command: []string{"echo", "something"}, - }, - }, - } - assert.NilError(t, Print(&buffer, bundle)) - output := buffer.String() - assert.Contains(t, output, "\"Image\": \"image\"") - assert.Contains(t, output, - `"Command": [ - "echo", - "something" - ]`) -} diff --git a/vendor/github.com/docker/docker/cli/command/checkpoint/cmd.go b/vendor/github.com/docker/docker/cli/command/checkpoint/cmd.go deleted file mode 100644 index d5705a4da..000000000 --- a/vendor/github.com/docker/docker/cli/command/checkpoint/cmd.go +++ /dev/null @@ -1,24 +0,0 @@ -package checkpoint - -import ( - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -// NewCheckpointCommand returns the `checkpoint` subcommand (only in experimental) -func NewCheckpointCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "checkpoint", - Short: "Manage checkpoints", - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - Tags: map[string]string{"experimental": "", "version": "1.25"}, - } - cmd.AddCommand( - newCreateCommand(dockerCli), - newListCommand(dockerCli), - newRemoveCommand(dockerCli), - ) - return cmd -} diff --git a/vendor/github.com/docker/docker/cli/command/checkpoint/create.go b/vendor/github.com/docker/docker/cli/command/checkpoint/create.go deleted file mode 100644 index 473a94173..000000000 --- a/vendor/github.com/docker/docker/cli/command/checkpoint/create.go +++ /dev/null @@ -1,58 +0,0 @@ -package checkpoint - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type createOptions struct { - container string - checkpoint string - checkpointDir string - leaveRunning bool -} - -func newCreateCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts createOptions - - cmd := &cobra.Command{ - Use: "create [OPTIONS] CONTAINER CHECKPOINT", - Short: "Create a checkpoint from a running container", - Args: cli.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - opts.container = args[0] - opts.checkpoint = args[1] - return runCreate(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.BoolVar(&opts.leaveRunning, "leave-running", false, "Leave the container running after checkpoint") - flags.StringVarP(&opts.checkpointDir, "checkpoint-dir", "", "", "Use a custom checkpoint storage directory") - - return cmd -} - -func runCreate(dockerCli *command.DockerCli, opts createOptions) error { - client := dockerCli.Client() - - checkpointOpts := types.CheckpointCreateOptions{ - CheckpointID: opts.checkpoint, - CheckpointDir: opts.checkpointDir, - Exit: !opts.leaveRunning, - } - - err := client.CheckpointCreate(context.Background(), opts.container, checkpointOpts) - if err != nil { - return err - } - - fmt.Fprintf(dockerCli.Out(), "%s\n", opts.checkpoint) - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/checkpoint/list.go b/vendor/github.com/docker/docker/cli/command/checkpoint/list.go deleted file mode 100644 index daf834999..000000000 --- a/vendor/github.com/docker/docker/cli/command/checkpoint/list.go +++ /dev/null @@ -1,62 +0,0 @@ -package checkpoint - -import ( - "fmt" - "text/tabwriter" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type listOptions struct { - checkpointDir string -} - -func newListCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts listOptions - - cmd := &cobra.Command{ - Use: "ls [OPTIONS] CONTAINER", - Aliases: []string{"list"}, - Short: "List checkpoints for a container", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runList(dockerCli, args[0], opts) - }, - } - - flags := cmd.Flags() - flags.StringVarP(&opts.checkpointDir, "checkpoint-dir", "", "", "Use a custom checkpoint storage directory") - - return cmd - -} - -func runList(dockerCli *command.DockerCli, container string, opts listOptions) error { - client := dockerCli.Client() - - listOpts := types.CheckpointListOptions{ - CheckpointDir: opts.checkpointDir, - } - - checkpoints, err := client.CheckpointList(context.Background(), container, listOpts) - if err != nil { - return err - } - - w := tabwriter.NewWriter(dockerCli.Out(), 20, 1, 3, ' ', 0) - fmt.Fprintf(w, "CHECKPOINT NAME") - fmt.Fprintf(w, "\n") - - for _, checkpoint := range checkpoints { - fmt.Fprintf(w, "%s\t", checkpoint.Name) - fmt.Fprint(w, "\n") - } - - w.Flush() - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/checkpoint/remove.go b/vendor/github.com/docker/docker/cli/command/checkpoint/remove.go deleted file mode 100644 index ec39fa7b5..000000000 --- a/vendor/github.com/docker/docker/cli/command/checkpoint/remove.go +++ /dev/null @@ -1,44 +0,0 @@ -package checkpoint - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type removeOptions struct { - checkpointDir string -} - -func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts removeOptions - - cmd := &cobra.Command{ - Use: "rm [OPTIONS] CONTAINER CHECKPOINT", - Aliases: []string{"remove"}, - Short: "Remove a checkpoint", - Args: cli.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - return runRemove(dockerCli, args[0], args[1], opts) - }, - } - - flags := cmd.Flags() - flags.StringVarP(&opts.checkpointDir, "checkpoint-dir", "", "", "Use a custom checkpoint storage directory") - - return cmd -} - -func runRemove(dockerCli *command.DockerCli, container string, checkpoint string, opts removeOptions) error { - client := dockerCli.Client() - - removeOpts := types.CheckpointDeleteOptions{ - CheckpointID: checkpoint, - CheckpointDir: opts.checkpointDir, - } - - return client.CheckpointDelete(context.Background(), container, removeOpts) -} diff --git a/vendor/github.com/docker/docker/cli/command/cli.go b/vendor/github.com/docker/docker/cli/command/cli.go deleted file mode 100644 index 6d1dd7472..000000000 --- a/vendor/github.com/docker/docker/cli/command/cli.go +++ /dev/null @@ -1,260 +0,0 @@ -package command - -import ( - "errors" - "fmt" - "io" - "net/http" - "os" - "path/filepath" - "runtime" - - "github.com/docker/docker/api" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/versions" - cliflags "github.com/docker/docker/cli/flags" - "github.com/docker/docker/cliconfig" - "github.com/docker/docker/cliconfig/configfile" - "github.com/docker/docker/cliconfig/credentials" - "github.com/docker/docker/client" - "github.com/docker/docker/dockerversion" - dopts "github.com/docker/docker/opts" - "github.com/docker/go-connections/sockets" - "github.com/docker/go-connections/tlsconfig" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -// Streams is an interface which exposes the standard input and output streams -type Streams interface { - In() *InStream - Out() *OutStream - Err() io.Writer -} - -// DockerCli represents the docker command line client. -// Instances of the client can be returned from NewDockerCli. -type DockerCli struct { - configFile *configfile.ConfigFile - in *InStream - out *OutStream - err io.Writer - keyFile string - client client.APIClient - hasExperimental bool - defaultVersion string -} - -// HasExperimental returns true if experimental features are accessible. -func (cli *DockerCli) HasExperimental() bool { - return cli.hasExperimental -} - -// DefaultVersion returns api.defaultVersion of DOCKER_API_VERSION if specified. -func (cli *DockerCli) DefaultVersion() string { - return cli.defaultVersion -} - -// Client returns the APIClient -func (cli *DockerCli) Client() client.APIClient { - return cli.client -} - -// Out returns the writer used for stdout -func (cli *DockerCli) Out() *OutStream { - return cli.out -} - -// Err returns the writer used for stderr -func (cli *DockerCli) Err() io.Writer { - return cli.err -} - -// In returns the reader used for stdin -func (cli *DockerCli) In() *InStream { - return cli.in -} - -// ShowHelp shows the command help. -func (cli *DockerCli) ShowHelp(cmd *cobra.Command, args []string) error { - cmd.SetOutput(cli.err) - cmd.HelpFunc()(cmd, args) - return nil -} - -// ConfigFile returns the ConfigFile -func (cli *DockerCli) ConfigFile() *configfile.ConfigFile { - return cli.configFile -} - -// GetAllCredentials returns all of the credentials stored in all of the -// configured credential stores. -func (cli *DockerCli) GetAllCredentials() (map[string]types.AuthConfig, error) { - auths := make(map[string]types.AuthConfig) - for registry := range cli.configFile.CredentialHelpers { - helper := cli.CredentialsStore(registry) - newAuths, err := helper.GetAll() - if err != nil { - return nil, err - } - addAll(auths, newAuths) - } - defaultStore := cli.CredentialsStore("") - newAuths, err := defaultStore.GetAll() - if err != nil { - return nil, err - } - addAll(auths, newAuths) - return auths, nil -} - -func addAll(to, from map[string]types.AuthConfig) { - for reg, ac := range from { - to[reg] = ac - } -} - -// CredentialsStore returns a new credentials store based -// on the settings provided in the configuration file. Empty string returns -// the default credential store. -func (cli *DockerCli) CredentialsStore(serverAddress string) credentials.Store { - if helper := getConfiguredCredentialStore(cli.configFile, serverAddress); helper != "" { - return credentials.NewNativeStore(cli.configFile, helper) - } - return credentials.NewFileStore(cli.configFile) -} - -// getConfiguredCredentialStore returns the credential helper configured for the -// given registry, the default credsStore, or the empty string if neither are -// configured. -func getConfiguredCredentialStore(c *configfile.ConfigFile, serverAddress string) string { - if c.CredentialHelpers != nil && serverAddress != "" { - if helper, exists := c.CredentialHelpers[serverAddress]; exists { - return helper - } - } - return c.CredentialsStore -} - -// Initialize the dockerCli runs initialization that must happen after command -// line flags are parsed. -func (cli *DockerCli) Initialize(opts *cliflags.ClientOptions) error { - cli.configFile = LoadDefaultConfigFile(cli.err) - - var err error - cli.client, err = NewAPIClientFromFlags(opts.Common, cli.configFile) - if err != nil { - return err - } - - cli.defaultVersion = cli.client.ClientVersion() - - if opts.Common.TrustKey == "" { - cli.keyFile = filepath.Join(cliconfig.ConfigDir(), cliflags.DefaultTrustKeyFile) - } else { - cli.keyFile = opts.Common.TrustKey - } - - if ping, err := cli.client.Ping(context.Background()); err == nil { - cli.hasExperimental = ping.Experimental - - // since the new header was added in 1.25, assume server is 1.24 if header is not present. - if ping.APIVersion == "" { - ping.APIVersion = "1.24" - } - - // if server version is lower than the current cli, downgrade - if versions.LessThan(ping.APIVersion, cli.client.ClientVersion()) { - cli.client.UpdateClientVersion(ping.APIVersion) - } - } - return nil -} - -// NewDockerCli returns a DockerCli instance with IO output and error streams set by in, out and err. -func NewDockerCli(in io.ReadCloser, out, err io.Writer) *DockerCli { - return &DockerCli{in: NewInStream(in), out: NewOutStream(out), err: err} -} - -// LoadDefaultConfigFile attempts to load the default config file and returns -// an initialized ConfigFile struct if none is found. -func LoadDefaultConfigFile(err io.Writer) *configfile.ConfigFile { - configFile, e := cliconfig.Load(cliconfig.ConfigDir()) - if e != nil { - fmt.Fprintf(err, "WARNING: Error loading config file:%v\n", e) - } - if !configFile.ContainsAuth() { - credentials.DetectDefaultStore(configFile) - } - return configFile -} - -// NewAPIClientFromFlags creates a new APIClient from command line flags -func NewAPIClientFromFlags(opts *cliflags.CommonOptions, configFile *configfile.ConfigFile) (client.APIClient, error) { - host, err := getServerHost(opts.Hosts, opts.TLSOptions) - if err != nil { - return &client.Client{}, err - } - - customHeaders := configFile.HTTPHeaders - if customHeaders == nil { - customHeaders = map[string]string{} - } - customHeaders["User-Agent"] = UserAgent() - - verStr := api.DefaultVersion - if tmpStr := os.Getenv("DOCKER_API_VERSION"); tmpStr != "" { - verStr = tmpStr - } - - httpClient, err := newHTTPClient(host, opts.TLSOptions) - if err != nil { - return &client.Client{}, err - } - - return client.NewClient(host, verStr, httpClient, customHeaders) -} - -func getServerHost(hosts []string, tlsOptions *tlsconfig.Options) (host string, err error) { - switch len(hosts) { - case 0: - host = os.Getenv("DOCKER_HOST") - case 1: - host = hosts[0] - default: - return "", errors.New("Please specify only one -H") - } - - host, err = dopts.ParseHost(tlsOptions != nil, host) - return -} - -func newHTTPClient(host string, tlsOptions *tlsconfig.Options) (*http.Client, error) { - if tlsOptions == nil { - // let the api client configure the default transport. - return nil, nil - } - - config, err := tlsconfig.Client(*tlsOptions) - if err != nil { - return nil, err - } - tr := &http.Transport{ - TLSClientConfig: config, - } - proto, addr, _, err := client.ParseHost(host) - if err != nil { - return nil, err - } - - sockets.ConfigureTransport(tr, proto, addr) - - return &http.Client{ - Transport: tr, - }, nil -} - -// UserAgent returns the user agent string used for making API requests -func UserAgent() string { - return "Docker-Client/" + dockerversion.Version + " (" + runtime.GOOS + ")" -} diff --git a/vendor/github.com/docker/docker/cli/command/commands/commands.go b/vendor/github.com/docker/docker/cli/command/commands/commands.go deleted file mode 100644 index d64d5680c..000000000 --- a/vendor/github.com/docker/docker/cli/command/commands/commands.go +++ /dev/null @@ -1,91 +0,0 @@ -package commands - -import ( - "os" - - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/checkpoint" - "github.com/docker/docker/cli/command/container" - "github.com/docker/docker/cli/command/image" - "github.com/docker/docker/cli/command/network" - "github.com/docker/docker/cli/command/node" - "github.com/docker/docker/cli/command/plugin" - "github.com/docker/docker/cli/command/registry" - "github.com/docker/docker/cli/command/secret" - "github.com/docker/docker/cli/command/service" - "github.com/docker/docker/cli/command/stack" - "github.com/docker/docker/cli/command/swarm" - "github.com/docker/docker/cli/command/system" - "github.com/docker/docker/cli/command/volume" - "github.com/spf13/cobra" -) - -// AddCommands adds all the commands from cli/command to the root command -func AddCommands(cmd *cobra.Command, dockerCli *command.DockerCli) { - cmd.AddCommand( - node.NewNodeCommand(dockerCli), - service.NewServiceCommand(dockerCli), - swarm.NewSwarmCommand(dockerCli), - secret.NewSecretCommand(dockerCli), - container.NewContainerCommand(dockerCli), - image.NewImageCommand(dockerCli), - system.NewSystemCommand(dockerCli), - container.NewRunCommand(dockerCli), - image.NewBuildCommand(dockerCli), - network.NewNetworkCommand(dockerCli), - hide(system.NewEventsCommand(dockerCli)), - registry.NewLoginCommand(dockerCli), - registry.NewLogoutCommand(dockerCli), - registry.NewSearchCommand(dockerCli), - system.NewVersionCommand(dockerCli), - volume.NewVolumeCommand(dockerCli), - hide(system.NewInfoCommand(dockerCli)), - hide(container.NewAttachCommand(dockerCli)), - hide(container.NewCommitCommand(dockerCli)), - hide(container.NewCopyCommand(dockerCli)), - hide(container.NewCreateCommand(dockerCli)), - hide(container.NewDiffCommand(dockerCli)), - hide(container.NewExecCommand(dockerCli)), - hide(container.NewExportCommand(dockerCli)), - hide(container.NewKillCommand(dockerCli)), - hide(container.NewLogsCommand(dockerCli)), - hide(container.NewPauseCommand(dockerCli)), - hide(container.NewPortCommand(dockerCli)), - hide(container.NewPsCommand(dockerCli)), - hide(container.NewRenameCommand(dockerCli)), - hide(container.NewRestartCommand(dockerCli)), - hide(container.NewRmCommand(dockerCli)), - hide(container.NewStartCommand(dockerCli)), - hide(container.NewStatsCommand(dockerCli)), - hide(container.NewStopCommand(dockerCli)), - hide(container.NewTopCommand(dockerCli)), - hide(container.NewUnpauseCommand(dockerCli)), - hide(container.NewUpdateCommand(dockerCli)), - hide(container.NewWaitCommand(dockerCli)), - hide(image.NewHistoryCommand(dockerCli)), - hide(image.NewImagesCommand(dockerCli)), - hide(image.NewImportCommand(dockerCli)), - hide(image.NewLoadCommand(dockerCli)), - hide(image.NewPullCommand(dockerCli)), - hide(image.NewPushCommand(dockerCli)), - hide(image.NewRemoveCommand(dockerCli)), - hide(image.NewSaveCommand(dockerCli)), - hide(image.NewTagCommand(dockerCli)), - hide(system.NewInspectCommand(dockerCli)), - stack.NewStackCommand(dockerCli), - stack.NewTopLevelDeployCommand(dockerCli), - checkpoint.NewCheckpointCommand(dockerCli), - plugin.NewPluginCommand(dockerCli), - ) - -} - -func hide(cmd *cobra.Command) *cobra.Command { - if os.Getenv("DOCKER_HIDE_LEGACY_COMMANDS") == "" { - return cmd - } - cmdCopy := *cmd - cmdCopy.Hidden = true - cmdCopy.Aliases = []string{} - return &cmdCopy -} diff --git a/vendor/github.com/docker/docker/cli/command/container/attach.go b/vendor/github.com/docker/docker/cli/command/container/attach.go deleted file mode 100644 index 31bb10934..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/attach.go +++ /dev/null @@ -1,130 +0,0 @@ -package container - -import ( - "fmt" - "io" - "net/http/httputil" - - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/signal" - "github.com/spf13/cobra" -) - -type attachOptions struct { - noStdin bool - proxy bool - detachKeys string - - container string -} - -// NewAttachCommand creates a new cobra.Command for `docker attach` -func NewAttachCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts attachOptions - - cmd := &cobra.Command{ - Use: "attach [OPTIONS] CONTAINER", - Short: "Attach to a running container", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.container = args[0] - return runAttach(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.BoolVar(&opts.noStdin, "no-stdin", false, "Do not attach STDIN") - flags.BoolVar(&opts.proxy, "sig-proxy", true, "Proxy all received signals to the process") - flags.StringVar(&opts.detachKeys, "detach-keys", "", "Override the key sequence for detaching a container") - return cmd -} - -func runAttach(dockerCli *command.DockerCli, opts *attachOptions) error { - ctx := context.Background() - client := dockerCli.Client() - - c, err := client.ContainerInspect(ctx, opts.container) - if err != nil { - return err - } - - if !c.State.Running { - return fmt.Errorf("You cannot attach to a stopped container, start it first") - } - - if c.State.Paused { - return fmt.Errorf("You cannot attach to a paused container, unpause it first") - } - - if err := dockerCli.In().CheckTty(!opts.noStdin, c.Config.Tty); err != nil { - return err - } - - if opts.detachKeys != "" { - dockerCli.ConfigFile().DetachKeys = opts.detachKeys - } - - options := types.ContainerAttachOptions{ - Stream: true, - Stdin: !opts.noStdin && c.Config.OpenStdin, - Stdout: true, - Stderr: true, - DetachKeys: dockerCli.ConfigFile().DetachKeys, - } - - var in io.ReadCloser - if options.Stdin { - in = dockerCli.In() - } - - if opts.proxy && !c.Config.Tty { - sigc := ForwardAllSignals(ctx, dockerCli, opts.container) - defer signal.StopCatch(sigc) - } - - resp, errAttach := client.ContainerAttach(ctx, opts.container, options) - if errAttach != nil && errAttach != httputil.ErrPersistEOF { - // ContainerAttach returns an ErrPersistEOF (connection closed) - // means server met an error and put it in Hijacked connection - // keep the error and read detailed error message from hijacked connection later - return errAttach - } - defer resp.Close() - - if c.Config.Tty && dockerCli.Out().IsTerminal() { - height, width := dockerCli.Out().GetTtySize() - // To handle the case where a user repeatedly attaches/detaches without resizing their - // terminal, the only way to get the shell prompt to display for attaches 2+ is to artificially - // resize it, then go back to normal. Without this, every attach after the first will - // require the user to manually resize or hit enter. - resizeTtyTo(ctx, client, opts.container, height+1, width+1, false) - - // After the above resizing occurs, the call to MonitorTtySize below will handle resetting back - // to the actual size. - if err := MonitorTtySize(ctx, dockerCli, opts.container, false); err != nil { - logrus.Debugf("Error monitoring TTY size: %s", err) - } - } - if err := holdHijackedConnection(ctx, dockerCli, c.Config.Tty, in, dockerCli.Out(), dockerCli.Err(), resp); err != nil { - return err - } - - if errAttach != nil { - return errAttach - } - - _, status, err := getExitCode(ctx, dockerCli, opts.container) - if err != nil { - return err - } - if status != 0 { - return cli.StatusError{StatusCode: status} - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/cmd.go b/vendor/github.com/docker/docker/cli/command/container/cmd.go deleted file mode 100644 index 3e9b4880a..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/cmd.go +++ /dev/null @@ -1,46 +0,0 @@ -package container - -import ( - "github.com/spf13/cobra" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" -) - -// NewContainerCommand returns a cobra command for `container` subcommands -func NewContainerCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "container", - Short: "Manage containers", - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - } - cmd.AddCommand( - NewAttachCommand(dockerCli), - NewCommitCommand(dockerCli), - NewCopyCommand(dockerCli), - NewCreateCommand(dockerCli), - NewDiffCommand(dockerCli), - NewExecCommand(dockerCli), - NewExportCommand(dockerCli), - NewKillCommand(dockerCli), - NewLogsCommand(dockerCli), - NewPauseCommand(dockerCli), - NewPortCommand(dockerCli), - NewRenameCommand(dockerCli), - NewRestartCommand(dockerCli), - NewRmCommand(dockerCli), - NewRunCommand(dockerCli), - NewStartCommand(dockerCli), - NewStatsCommand(dockerCli), - NewStopCommand(dockerCli), - NewTopCommand(dockerCli), - NewUnpauseCommand(dockerCli), - NewUpdateCommand(dockerCli), - NewWaitCommand(dockerCli), - newListCommand(dockerCli), - newInspectCommand(dockerCli), - NewPruneCommand(dockerCli), - ) - return cmd -} diff --git a/vendor/github.com/docker/docker/cli/command/container/commit.go b/vendor/github.com/docker/docker/cli/command/container/commit.go deleted file mode 100644 index cf8d0102a..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/commit.go +++ /dev/null @@ -1,76 +0,0 @@ -package container - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - dockeropts "github.com/docker/docker/opts" - "github.com/spf13/cobra" -) - -type commitOptions struct { - container string - reference string - - pause bool - comment string - author string - changes dockeropts.ListOpts -} - -// NewCommitCommand creates a new cobra.Command for `docker commit` -func NewCommitCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts commitOptions - - cmd := &cobra.Command{ - Use: "commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]", - Short: "Create a new image from a container's changes", - Args: cli.RequiresRangeArgs(1, 2), - RunE: func(cmd *cobra.Command, args []string) error { - opts.container = args[0] - if len(args) > 1 { - opts.reference = args[1] - } - return runCommit(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.SetInterspersed(false) - - flags.BoolVarP(&opts.pause, "pause", "p", true, "Pause container during commit") - flags.StringVarP(&opts.comment, "message", "m", "", "Commit message") - flags.StringVarP(&opts.author, "author", "a", "", "Author (e.g., \"John Hannibal Smith \")") - - opts.changes = dockeropts.NewListOpts(nil) - flags.VarP(&opts.changes, "change", "c", "Apply Dockerfile instruction to the created image") - - return cmd -} - -func runCommit(dockerCli *command.DockerCli, opts *commitOptions) error { - ctx := context.Background() - - name := opts.container - reference := opts.reference - - options := types.ContainerCommitOptions{ - Reference: reference, - Comment: opts.comment, - Author: opts.author, - Changes: opts.changes.GetAll(), - Pause: opts.pause, - } - - response, err := dockerCli.Client().ContainerCommit(ctx, name, options) - if err != nil { - return err - } - - fmt.Fprintln(dockerCli.Out(), response.ID) - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/cp.go b/vendor/github.com/docker/docker/cli/command/container/cp.go deleted file mode 100644 index 17ab2accf..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/cp.go +++ /dev/null @@ -1,303 +0,0 @@ -package container - -import ( - "fmt" - "io" - "os" - "path/filepath" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/system" - "github.com/spf13/cobra" -) - -type copyOptions struct { - source string - destination string - followLink bool -} - -type copyDirection int - -const ( - fromContainer copyDirection = (1 << iota) - toContainer - acrossContainers = fromContainer | toContainer -) - -type cpConfig struct { - followLink bool -} - -// NewCopyCommand creates a new `docker cp` command -func NewCopyCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts copyOptions - - cmd := &cobra.Command{ - Use: `cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- - docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH`, - Short: "Copy files/folders between a container and the local filesystem", - Long: strings.Join([]string{ - "Copy files/folders between a container and the local filesystem\n", - "\nUse '-' as the source to read a tar archive from stdin\n", - "and extract it to a directory destination in a container.\n", - "Use '-' as the destination to stream a tar archive of a\n", - "container source to stdout.", - }, ""), - Args: cli.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - if args[0] == "" { - return fmt.Errorf("source can not be empty") - } - if args[1] == "" { - return fmt.Errorf("destination can not be empty") - } - opts.source = args[0] - opts.destination = args[1] - return runCopy(dockerCli, opts) - }, - } - - flags := cmd.Flags() - - flags.BoolVarP(&opts.followLink, "follow-link", "L", false, "Always follow symbol link in SRC_PATH") - - return cmd -} - -func runCopy(dockerCli *command.DockerCli, opts copyOptions) error { - srcContainer, srcPath := splitCpArg(opts.source) - dstContainer, dstPath := splitCpArg(opts.destination) - - var direction copyDirection - if srcContainer != "" { - direction |= fromContainer - } - if dstContainer != "" { - direction |= toContainer - } - - cpParam := &cpConfig{ - followLink: opts.followLink, - } - - ctx := context.Background() - - switch direction { - case fromContainer: - return copyFromContainer(ctx, dockerCli, srcContainer, srcPath, dstPath, cpParam) - case toContainer: - return copyToContainer(ctx, dockerCli, srcPath, dstContainer, dstPath, cpParam) - case acrossContainers: - // Copying between containers isn't supported. - return fmt.Errorf("copying between containers is not supported") - default: - // User didn't specify any container. - return fmt.Errorf("must specify at least one container source") - } -} - -func statContainerPath(ctx context.Context, dockerCli *command.DockerCli, containerName, path string) (types.ContainerPathStat, error) { - return dockerCli.Client().ContainerStatPath(ctx, containerName, path) -} - -func resolveLocalPath(localPath string) (absPath string, err error) { - if absPath, err = filepath.Abs(localPath); err != nil { - return - } - - return archive.PreserveTrailingDotOrSeparator(absPath, localPath), nil -} - -func copyFromContainer(ctx context.Context, dockerCli *command.DockerCli, srcContainer, srcPath, dstPath string, cpParam *cpConfig) (err error) { - if dstPath != "-" { - // Get an absolute destination path. - dstPath, err = resolveLocalPath(dstPath) - if err != nil { - return err - } - } - - // if client requests to follow symbol link, then must decide target file to be copied - var rebaseName string - if cpParam.followLink { - srcStat, err := statContainerPath(ctx, dockerCli, srcContainer, srcPath) - - // If the destination is a symbolic link, we should follow it. - if err == nil && srcStat.Mode&os.ModeSymlink != 0 { - linkTarget := srcStat.LinkTarget - if !system.IsAbs(linkTarget) { - // Join with the parent directory. - srcParent, _ := archive.SplitPathDirEntry(srcPath) - linkTarget = filepath.Join(srcParent, linkTarget) - } - - linkTarget, rebaseName = archive.GetRebaseName(srcPath, linkTarget) - srcPath = linkTarget - } - - } - - content, stat, err := dockerCli.Client().CopyFromContainer(ctx, srcContainer, srcPath) - if err != nil { - return err - } - defer content.Close() - - if dstPath == "-" { - // Send the response to STDOUT. - _, err = io.Copy(os.Stdout, content) - - return err - } - - // Prepare source copy info. - srcInfo := archive.CopyInfo{ - Path: srcPath, - Exists: true, - IsDir: stat.Mode.IsDir(), - RebaseName: rebaseName, - } - - preArchive := content - if len(srcInfo.RebaseName) != 0 { - _, srcBase := archive.SplitPathDirEntry(srcInfo.Path) - preArchive = archive.RebaseArchiveEntries(content, srcBase, srcInfo.RebaseName) - } - // See comments in the implementation of `archive.CopyTo` for exactly what - // goes into deciding how and whether the source archive needs to be - // altered for the correct copy behavior. - return archive.CopyTo(preArchive, srcInfo, dstPath) -} - -func copyToContainer(ctx context.Context, dockerCli *command.DockerCli, srcPath, dstContainer, dstPath string, cpParam *cpConfig) (err error) { - if srcPath != "-" { - // Get an absolute source path. - srcPath, err = resolveLocalPath(srcPath) - if err != nil { - return err - } - } - - // In order to get the copy behavior right, we need to know information - // about both the source and destination. The API is a simple tar - // archive/extract API but we can use the stat info header about the - // destination to be more informed about exactly what the destination is. - - // Prepare destination copy info by stat-ing the container path. - dstInfo := archive.CopyInfo{Path: dstPath} - dstStat, err := statContainerPath(ctx, dockerCli, dstContainer, dstPath) - - // If the destination is a symbolic link, we should evaluate it. - if err == nil && dstStat.Mode&os.ModeSymlink != 0 { - linkTarget := dstStat.LinkTarget - if !system.IsAbs(linkTarget) { - // Join with the parent directory. - dstParent, _ := archive.SplitPathDirEntry(dstPath) - linkTarget = filepath.Join(dstParent, linkTarget) - } - - dstInfo.Path = linkTarget - dstStat, err = statContainerPath(ctx, dockerCli, dstContainer, linkTarget) - } - - // Ignore any error and assume that the parent directory of the destination - // path exists, in which case the copy may still succeed. If there is any - // type of conflict (e.g., non-directory overwriting an existing directory - // or vice versa) the extraction will fail. If the destination simply did - // not exist, but the parent directory does, the extraction will still - // succeed. - if err == nil { - dstInfo.Exists, dstInfo.IsDir = true, dstStat.Mode.IsDir() - } - - var ( - content io.Reader - resolvedDstPath string - ) - - if srcPath == "-" { - // Use STDIN. - content = os.Stdin - resolvedDstPath = dstInfo.Path - if !dstInfo.IsDir { - return fmt.Errorf("destination %q must be a directory", fmt.Sprintf("%s:%s", dstContainer, dstPath)) - } - } else { - // Prepare source copy info. - srcInfo, err := archive.CopyInfoSourcePath(srcPath, cpParam.followLink) - if err != nil { - return err - } - - srcArchive, err := archive.TarResource(srcInfo) - if err != nil { - return err - } - defer srcArchive.Close() - - // With the stat info about the local source as well as the - // destination, we have enough information to know whether we need to - // alter the archive that we upload so that when the server extracts - // it to the specified directory in the container we get the desired - // copy behavior. - - // See comments in the implementation of `archive.PrepareArchiveCopy` - // for exactly what goes into deciding how and whether the source - // archive needs to be altered for the correct copy behavior when it is - // extracted. This function also infers from the source and destination - // info which directory to extract to, which may be the parent of the - // destination that the user specified. - dstDir, preparedArchive, err := archive.PrepareArchiveCopy(srcArchive, srcInfo, dstInfo) - if err != nil { - return err - } - defer preparedArchive.Close() - - resolvedDstPath = dstDir - content = preparedArchive - } - - options := types.CopyToContainerOptions{ - AllowOverwriteDirWithFile: false, - } - - return dockerCli.Client().CopyToContainer(ctx, dstContainer, resolvedDstPath, content, options) -} - -// We use `:` as a delimiter between CONTAINER and PATH, but `:` could also be -// in a valid LOCALPATH, like `file:name.txt`. We can resolve this ambiguity by -// requiring a LOCALPATH with a `:` to be made explicit with a relative or -// absolute path: -// `/path/to/file:name.txt` or `./file:name.txt` -// -// This is apparently how `scp` handles this as well: -// http://www.cyberciti.biz/faq/rsync-scp-file-name-with-colon-punctuation-in-it/ -// -// We can't simply check for a filepath separator because container names may -// have a separator, e.g., "host0/cname1" if container is in a Docker cluster, -// so we have to check for a `/` or `.` prefix. Also, in the case of a Windows -// client, a `:` could be part of an absolute Windows path, in which case it -// is immediately proceeded by a backslash. -func splitCpArg(arg string) (container, path string) { - if system.IsAbs(arg) { - // Explicit local absolute path, e.g., `C:\foo` or `/foo`. - return "", arg - } - - parts := strings.SplitN(arg, ":", 2) - - if len(parts) == 1 || strings.HasPrefix(parts[0], ".") { - // Either there's no `:` in the arg - // OR it's an explicit local relative path like `./file:name.txt`. - return "", arg - } - - return parts[0], parts[1] -} diff --git a/vendor/github.com/docker/docker/cli/command/container/create.go b/vendor/github.com/docker/docker/cli/command/container/create.go deleted file mode 100644 index d5e63bd9e..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/create.go +++ /dev/null @@ -1,218 +0,0 @@ -package container - -import ( - "fmt" - "io" - "os" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/image" - "github.com/docker/docker/pkg/jsonmessage" - // FIXME migrate to docker/distribution/reference - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - networktypes "github.com/docker/docker/api/types/network" - apiclient "github.com/docker/docker/client" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -type createOptions struct { - name string -} - -// NewCreateCommand creates a new cobra.Command for `docker create` -func NewCreateCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts createOptions - var copts *runconfigopts.ContainerOptions - - cmd := &cobra.Command{ - Use: "create [OPTIONS] IMAGE [COMMAND] [ARG...]", - Short: "Create a new container", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - copts.Image = args[0] - if len(args) > 1 { - copts.Args = args[1:] - } - return runCreate(dockerCli, cmd.Flags(), &opts, copts) - }, - } - - flags := cmd.Flags() - flags.SetInterspersed(false) - - flags.StringVar(&opts.name, "name", "", "Assign a name to the container") - - // Add an explicit help that doesn't have a `-h` to prevent the conflict - // with hostname - flags.Bool("help", false, "Print usage") - - command.AddTrustedFlags(flags, true) - copts = runconfigopts.AddFlags(flags) - return cmd -} - -func runCreate(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts *createOptions, copts *runconfigopts.ContainerOptions) error { - config, hostConfig, networkingConfig, err := runconfigopts.Parse(flags, copts) - if err != nil { - reportError(dockerCli.Err(), "create", err.Error(), true) - return cli.StatusError{StatusCode: 125} - } - response, err := createContainer(context.Background(), dockerCli, config, hostConfig, networkingConfig, hostConfig.ContainerIDFile, opts.name) - if err != nil { - return err - } - fmt.Fprintf(dockerCli.Out(), "%s\n", response.ID) - return nil -} - -func pullImage(ctx context.Context, dockerCli *command.DockerCli, image string, out io.Writer) error { - ref, err := reference.ParseNamed(image) - if err != nil { - return err - } - - // Resolve the Repository name from fqn to RepositoryInfo - repoInfo, err := registry.ParseRepositoryInfo(ref) - if err != nil { - return err - } - - authConfig := command.ResolveAuthConfig(ctx, dockerCli, repoInfo.Index) - encodedAuth, err := command.EncodeAuthToBase64(authConfig) - if err != nil { - return err - } - - options := types.ImageCreateOptions{ - RegistryAuth: encodedAuth, - } - - responseBody, err := dockerCli.Client().ImageCreate(ctx, image, options) - if err != nil { - return err - } - defer responseBody.Close() - - return jsonmessage.DisplayJSONMessagesStream( - responseBody, - out, - dockerCli.Out().FD(), - dockerCli.Out().IsTerminal(), - nil) -} - -type cidFile struct { - path string - file *os.File - written bool -} - -func (cid *cidFile) Close() error { - cid.file.Close() - - if !cid.written { - if err := os.Remove(cid.path); err != nil { - return fmt.Errorf("failed to remove the CID file '%s': %s \n", cid.path, err) - } - } - - return nil -} - -func (cid *cidFile) Write(id string) error { - if _, err := cid.file.Write([]byte(id)); err != nil { - return fmt.Errorf("Failed to write the container ID to the file: %s", err) - } - cid.written = true - return nil -} - -func newCIDFile(path string) (*cidFile, error) { - if _, err := os.Stat(path); err == nil { - return nil, fmt.Errorf("Container ID file found, make sure the other container isn't running or delete %s", path) - } - - f, err := os.Create(path) - if err != nil { - return nil, fmt.Errorf("Failed to create the container ID file: %s", err) - } - - return &cidFile{path: path, file: f}, nil -} - -func createContainer(ctx context.Context, dockerCli *command.DockerCli, config *container.Config, hostConfig *container.HostConfig, networkingConfig *networktypes.NetworkingConfig, cidfile, name string) (*container.ContainerCreateCreatedBody, error) { - stderr := dockerCli.Err() - - var containerIDFile *cidFile - if cidfile != "" { - var err error - if containerIDFile, err = newCIDFile(cidfile); err != nil { - return nil, err - } - defer containerIDFile.Close() - } - - var trustedRef reference.Canonical - _, ref, err := reference.ParseIDOrReference(config.Image) - if err != nil { - return nil, err - } - if ref != nil { - ref = reference.WithDefaultTag(ref) - - if ref, ok := ref.(reference.NamedTagged); ok && command.IsTrusted() { - var err error - trustedRef, err = image.TrustedReference(ctx, dockerCli, ref, nil) - if err != nil { - return nil, err - } - config.Image = trustedRef.String() - } - } - - //create the container - response, err := dockerCli.Client().ContainerCreate(ctx, config, hostConfig, networkingConfig, name) - - //if image not found try to pull it - if err != nil { - if apiclient.IsErrImageNotFound(err) && ref != nil { - fmt.Fprintf(stderr, "Unable to find image '%s' locally\n", ref.String()) - - // we don't want to write to stdout anything apart from container.ID - if err = pullImage(ctx, dockerCli, config.Image, stderr); err != nil { - return nil, err - } - if ref, ok := ref.(reference.NamedTagged); ok && trustedRef != nil { - if err := image.TagTrusted(ctx, dockerCli, trustedRef, ref); err != nil { - return nil, err - } - } - // Retry - var retryErr error - response, retryErr = dockerCli.Client().ContainerCreate(ctx, config, hostConfig, networkingConfig, name) - if retryErr != nil { - return nil, retryErr - } - } else { - return nil, err - } - } - - for _, warning := range response.Warnings { - fmt.Fprintf(stderr, "WARNING: %s\n", warning) - } - if containerIDFile != nil { - if err = containerIDFile.Write(response.ID); err != nil { - return nil, err - } - } - return &response, nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/diff.go b/vendor/github.com/docker/docker/cli/command/container/diff.go deleted file mode 100644 index 12d659101..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/diff.go +++ /dev/null @@ -1,58 +0,0 @@ -package container - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/archive" - "github.com/spf13/cobra" -) - -type diffOptions struct { - container string -} - -// NewDiffCommand creates a new cobra.Command for `docker diff` -func NewDiffCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts diffOptions - - return &cobra.Command{ - Use: "diff CONTAINER", - Short: "Inspect changes on a container's filesystem", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.container = args[0] - return runDiff(dockerCli, &opts) - }, - } -} - -func runDiff(dockerCli *command.DockerCli, opts *diffOptions) error { - if opts.container == "" { - return fmt.Errorf("Container name cannot be empty") - } - ctx := context.Background() - - changes, err := dockerCli.Client().ContainerDiff(ctx, opts.container) - if err != nil { - return err - } - - for _, change := range changes { - var kind string - switch change.Kind { - case archive.ChangeModify: - kind = "C" - case archive.ChangeAdd: - kind = "A" - case archive.ChangeDelete: - kind = "D" - } - fmt.Fprintf(dockerCli.Out(), "%s %s\n", kind, change.Path) - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/exec.go b/vendor/github.com/docker/docker/cli/command/container/exec.go deleted file mode 100644 index f0381494e..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/exec.go +++ /dev/null @@ -1,207 +0,0 @@ -package container - -import ( - "fmt" - "io" - - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - apiclient "github.com/docker/docker/client" - options "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/promise" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/spf13/cobra" -) - -type execOptions struct { - detachKeys string - interactive bool - tty bool - detach bool - user string - privileged bool - env *options.ListOpts -} - -func newExecOptions() *execOptions { - var values []string - return &execOptions{ - env: options.NewListOptsRef(&values, runconfigopts.ValidateEnv), - } -} - -// NewExecCommand creats a new cobra.Command for `docker exec` -func NewExecCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := newExecOptions() - - cmd := &cobra.Command{ - Use: "exec [OPTIONS] CONTAINER COMMAND [ARG...]", - Short: "Run a command in a running container", - Args: cli.RequiresMinArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - container := args[0] - execCmd := args[1:] - return runExec(dockerCli, opts, container, execCmd) - }, - } - - flags := cmd.Flags() - flags.SetInterspersed(false) - - flags.StringVarP(&opts.detachKeys, "detach-keys", "", "", "Override the key sequence for detaching a container") - flags.BoolVarP(&opts.interactive, "interactive", "i", false, "Keep STDIN open even if not attached") - flags.BoolVarP(&opts.tty, "tty", "t", false, "Allocate a pseudo-TTY") - flags.BoolVarP(&opts.detach, "detach", "d", false, "Detached mode: run command in the background") - flags.StringVarP(&opts.user, "user", "u", "", "Username or UID (format: [:])") - flags.BoolVarP(&opts.privileged, "privileged", "", false, "Give extended privileges to the command") - flags.VarP(opts.env, "env", "e", "Set environment variables") - flags.SetAnnotation("env", "version", []string{"1.25"}) - - return cmd -} - -func runExec(dockerCli *command.DockerCli, opts *execOptions, container string, execCmd []string) error { - execConfig, err := parseExec(opts, execCmd) - // just in case the ParseExec does not exit - if container == "" || err != nil { - return cli.StatusError{StatusCode: 1} - } - - if opts.detachKeys != "" { - dockerCli.ConfigFile().DetachKeys = opts.detachKeys - } - - // Send client escape keys - execConfig.DetachKeys = dockerCli.ConfigFile().DetachKeys - - ctx := context.Background() - client := dockerCli.Client() - - response, err := client.ContainerExecCreate(ctx, container, *execConfig) - if err != nil { - return err - } - - execID := response.ID - if execID == "" { - fmt.Fprintf(dockerCli.Out(), "exec ID empty") - return nil - } - - //Temp struct for execStart so that we don't need to transfer all the execConfig - if !execConfig.Detach { - if err := dockerCli.In().CheckTty(execConfig.AttachStdin, execConfig.Tty); err != nil { - return err - } - } else { - execStartCheck := types.ExecStartCheck{ - Detach: execConfig.Detach, - Tty: execConfig.Tty, - } - - if err := client.ContainerExecStart(ctx, execID, execStartCheck); err != nil { - return err - } - // For now don't print this - wait for when we support exec wait() - // fmt.Fprintf(dockerCli.Out(), "%s\n", execID) - return nil - } - - // Interactive exec requested. - var ( - out, stderr io.Writer - in io.ReadCloser - errCh chan error - ) - - if execConfig.AttachStdin { - in = dockerCli.In() - } - if execConfig.AttachStdout { - out = dockerCli.Out() - } - if execConfig.AttachStderr { - if execConfig.Tty { - stderr = dockerCli.Out() - } else { - stderr = dockerCli.Err() - } - } - - resp, err := client.ContainerExecAttach(ctx, execID, *execConfig) - if err != nil { - return err - } - defer resp.Close() - errCh = promise.Go(func() error { - return holdHijackedConnection(ctx, dockerCli, execConfig.Tty, in, out, stderr, resp) - }) - - if execConfig.Tty && dockerCli.In().IsTerminal() { - if err := MonitorTtySize(ctx, dockerCli, execID, true); err != nil { - fmt.Fprintf(dockerCli.Err(), "Error monitoring TTY size: %s\n", err) - } - } - - if err := <-errCh; err != nil { - logrus.Debugf("Error hijack: %s", err) - return err - } - - var status int - if _, status, err = getExecExitCode(ctx, client, execID); err != nil { - return err - } - - if status != 0 { - return cli.StatusError{StatusCode: status} - } - - return nil -} - -// getExecExitCode perform an inspect on the exec command. It returns -// the running state and the exit code. -func getExecExitCode(ctx context.Context, client apiclient.ContainerAPIClient, execID string) (bool, int, error) { - resp, err := client.ContainerExecInspect(ctx, execID) - if err != nil { - // If we can't connect, then the daemon probably died. - if !apiclient.IsErrConnectionFailed(err) { - return false, -1, err - } - return false, -1, nil - } - - return resp.Running, resp.ExitCode, nil -} - -// parseExec parses the specified args for the specified command and generates -// an ExecConfig from it. -func parseExec(opts *execOptions, execCmd []string) (*types.ExecConfig, error) { - execConfig := &types.ExecConfig{ - User: opts.user, - Privileged: opts.privileged, - Tty: opts.tty, - Cmd: execCmd, - Detach: opts.detach, - } - - // If -d is not set, attach to everything by default - if !opts.detach { - execConfig.AttachStdout = true - execConfig.AttachStderr = true - if opts.interactive { - execConfig.AttachStdin = true - } - } - - if opts.env != nil { - execConfig.Env = opts.env.GetAll() - } - - return execConfig, nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/exec_test.go b/vendor/github.com/docker/docker/cli/command/container/exec_test.go deleted file mode 100644 index baeeaf190..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/exec_test.go +++ /dev/null @@ -1,116 +0,0 @@ -package container - -import ( - "testing" - - "github.com/docker/docker/api/types" -) - -type arguments struct { - options execOptions - execCmd []string -} - -func TestParseExec(t *testing.T) { - valids := map[*arguments]*types.ExecConfig{ - &arguments{ - execCmd: []string{"command"}, - }: { - Cmd: []string{"command"}, - AttachStdout: true, - AttachStderr: true, - }, - &arguments{ - execCmd: []string{"command1", "command2"}, - }: { - Cmd: []string{"command1", "command2"}, - AttachStdout: true, - AttachStderr: true, - }, - &arguments{ - options: execOptions{ - interactive: true, - tty: true, - user: "uid", - }, - execCmd: []string{"command"}, - }: { - User: "uid", - AttachStdin: true, - AttachStdout: true, - AttachStderr: true, - Tty: true, - Cmd: []string{"command"}, - }, - &arguments{ - options: execOptions{ - detach: true, - }, - execCmd: []string{"command"}, - }: { - AttachStdin: false, - AttachStdout: false, - AttachStderr: false, - Detach: true, - Cmd: []string{"command"}, - }, - &arguments{ - options: execOptions{ - tty: true, - interactive: true, - detach: true, - }, - execCmd: []string{"command"}, - }: { - AttachStdin: false, - AttachStdout: false, - AttachStderr: false, - Detach: true, - Tty: true, - Cmd: []string{"command"}, - }, - } - - for valid, expectedExecConfig := range valids { - execConfig, err := parseExec(&valid.options, valid.execCmd) - if err != nil { - t.Fatal(err) - } - if !compareExecConfig(expectedExecConfig, execConfig) { - t.Fatalf("Expected [%v] for %v, got [%v]", expectedExecConfig, valid, execConfig) - } - } -} - -func compareExecConfig(config1 *types.ExecConfig, config2 *types.ExecConfig) bool { - if config1.AttachStderr != config2.AttachStderr { - return false - } - if config1.AttachStdin != config2.AttachStdin { - return false - } - if config1.AttachStdout != config2.AttachStdout { - return false - } - if config1.Detach != config2.Detach { - return false - } - if config1.Privileged != config2.Privileged { - return false - } - if config1.Tty != config2.Tty { - return false - } - if config1.User != config2.User { - return false - } - if len(config1.Cmd) != len(config2.Cmd) { - return false - } - for index, value := range config1.Cmd { - if value != config2.Cmd[index] { - return false - } - } - return true -} diff --git a/vendor/github.com/docker/docker/cli/command/container/export.go b/vendor/github.com/docker/docker/cli/command/container/export.go deleted file mode 100644 index 8fa2e5d77..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/export.go +++ /dev/null @@ -1,59 +0,0 @@ -package container - -import ( - "errors" - "io" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type exportOptions struct { - container string - output string -} - -// NewExportCommand creates a new `docker export` command -func NewExportCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts exportOptions - - cmd := &cobra.Command{ - Use: "export [OPTIONS] CONTAINER", - Short: "Export a container's filesystem as a tar archive", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.container = args[0] - return runExport(dockerCli, opts) - }, - } - - flags := cmd.Flags() - - flags.StringVarP(&opts.output, "output", "o", "", "Write to a file, instead of STDOUT") - - return cmd -} - -func runExport(dockerCli *command.DockerCli, opts exportOptions) error { - if opts.output == "" && dockerCli.Out().IsTerminal() { - return errors.New("Cowardly refusing to save to a terminal. Use the -o flag or redirect.") - } - - clnt := dockerCli.Client() - - responseBody, err := clnt.ContainerExport(context.Background(), opts.container) - if err != nil { - return err - } - defer responseBody.Close() - - if opts.output == "" { - _, err := io.Copy(dockerCli.Out(), responseBody) - return err - } - - return command.CopyToFile(opts.output, responseBody) -} diff --git a/vendor/github.com/docker/docker/cli/command/container/hijack.go b/vendor/github.com/docker/docker/cli/command/container/hijack.go deleted file mode 100644 index ca136f0e4..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/hijack.go +++ /dev/null @@ -1,116 +0,0 @@ -package container - -import ( - "io" - "runtime" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/stdcopy" - "golang.org/x/net/context" -) - -// holdHijackedConnection handles copying input to and output from streams to the -// connection -func holdHijackedConnection(ctx context.Context, streams command.Streams, tty bool, inputStream io.ReadCloser, outputStream, errorStream io.Writer, resp types.HijackedResponse) error { - var ( - err error - restoreOnce sync.Once - ) - if inputStream != nil && tty { - if err := setRawTerminal(streams); err != nil { - return err - } - defer func() { - restoreOnce.Do(func() { - restoreTerminal(streams, inputStream) - }) - }() - } - - receiveStdout := make(chan error, 1) - if outputStream != nil || errorStream != nil { - go func() { - // When TTY is ON, use regular copy - if tty && outputStream != nil { - _, err = io.Copy(outputStream, resp.Reader) - // we should restore the terminal as soon as possible once connection end - // so any following print messages will be in normal type. - if inputStream != nil { - restoreOnce.Do(func() { - restoreTerminal(streams, inputStream) - }) - } - } else { - _, err = stdcopy.StdCopy(outputStream, errorStream, resp.Reader) - } - - logrus.Debug("[hijack] End of stdout") - receiveStdout <- err - }() - } - - stdinDone := make(chan struct{}) - go func() { - if inputStream != nil { - io.Copy(resp.Conn, inputStream) - // we should restore the terminal as soon as possible once connection end - // so any following print messages will be in normal type. - if tty { - restoreOnce.Do(func() { - restoreTerminal(streams, inputStream) - }) - } - logrus.Debug("[hijack] End of stdin") - } - - if err := resp.CloseWrite(); err != nil { - logrus.Debugf("Couldn't send EOF: %s", err) - } - close(stdinDone) - }() - - select { - case err := <-receiveStdout: - if err != nil { - logrus.Debugf("Error receiveStdout: %s", err) - return err - } - case <-stdinDone: - if outputStream != nil || errorStream != nil { - select { - case err := <-receiveStdout: - if err != nil { - logrus.Debugf("Error receiveStdout: %s", err) - return err - } - case <-ctx.Done(): - } - } - case <-ctx.Done(): - } - - return nil -} - -func setRawTerminal(streams command.Streams) error { - if err := streams.In().SetRawTerminal(); err != nil { - return err - } - return streams.Out().SetRawTerminal() -} - -func restoreTerminal(streams command.Streams, in io.Closer) error { - streams.In().RestoreTerminal() - streams.Out().RestoreTerminal() - // WARNING: DO NOT REMOVE THE OS CHECK !!! - // For some reason this Close call blocks on darwin.. - // As the client exists right after, simply discard the close - // until we find a better solution. - if in != nil && runtime.GOOS != "darwin" { - return in.Close() - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/inspect.go b/vendor/github.com/docker/docker/cli/command/container/inspect.go deleted file mode 100644 index 08a8d244d..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/inspect.go +++ /dev/null @@ -1,47 +0,0 @@ -package container - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/inspect" - "github.com/spf13/cobra" -) - -type inspectOptions struct { - format string - size bool - refs []string -} - -// newInspectCommand creates a new cobra.Command for `docker container inspect` -func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts inspectOptions - - cmd := &cobra.Command{ - Use: "inspect [OPTIONS] CONTAINER [CONTAINER...]", - Short: "Display detailed information on one or more containers", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.refs = args - return runInspect(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template") - flags.BoolVarP(&opts.size, "size", "s", false, "Display total file sizes") - - return cmd -} - -func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - getRefFunc := func(ref string) (interface{}, []byte, error) { - return client.ContainerInspectWithRaw(ctx, ref, opts.size) - } - return inspect.Inspect(dockerCli.Out(), opts.refs, opts.format, getRefFunc) -} diff --git a/vendor/github.com/docker/docker/cli/command/container/kill.go b/vendor/github.com/docker/docker/cli/command/container/kill.go deleted file mode 100644 index 6da91a40e..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/kill.go +++ /dev/null @@ -1,56 +0,0 @@ -package container - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type killOptions struct { - signal string - - containers []string -} - -// NewKillCommand creates a new cobra.Command for `docker kill` -func NewKillCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts killOptions - - cmd := &cobra.Command{ - Use: "kill [OPTIONS] CONTAINER [CONTAINER...]", - Short: "Kill one or more running containers", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.containers = args - return runKill(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.StringVarP(&opts.signal, "signal", "s", "KILL", "Signal to send to the container") - return cmd -} - -func runKill(dockerCli *command.DockerCli, opts *killOptions) error { - var errs []string - ctx := context.Background() - errChan := parallelOperation(ctx, opts.containers, func(ctx context.Context, container string) error { - return dockerCli.Client().ContainerKill(ctx, container, opts.signal) - }) - for _, name := range opts.containers { - if err := <-errChan; err != nil { - errs = append(errs, err.Error()) - } else { - fmt.Fprintf(dockerCli.Out(), "%s\n", name) - } - } - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/list.go b/vendor/github.com/docker/docker/cli/command/container/list.go deleted file mode 100644 index 5bbf41966..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/list.go +++ /dev/null @@ -1,141 +0,0 @@ -package container - -import ( - "io/ioutil" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/formatter" - "github.com/docker/docker/opts" - "github.com/docker/docker/utils/templates" - "github.com/spf13/cobra" -) - -type psOptions struct { - quiet bool - size bool - all bool - noTrunc bool - nLatest bool - last int - format string - filter opts.FilterOpt -} - -// NewPsCommand creates a new cobra.Command for `docker ps` -func NewPsCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := psOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "ps [OPTIONS]", - Short: "List containers", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runPs(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display numeric IDs") - flags.BoolVarP(&opts.size, "size", "s", false, "Display total file sizes") - flags.BoolVarP(&opts.all, "all", "a", false, "Show all containers (default shows just running)") - flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Don't truncate output") - flags.BoolVarP(&opts.nLatest, "latest", "l", false, "Show the latest created container (includes all states)") - flags.IntVarP(&opts.last, "last", "n", -1, "Show n last created containers (includes all states)") - flags.StringVarP(&opts.format, "format", "", "", "Pretty-print containers using a Go template") - flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided") - - return cmd -} - -func newListCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := *NewPsCommand(dockerCli) - cmd.Aliases = []string{"ps", "list"} - cmd.Use = "ls [OPTIONS]" - return &cmd -} - -// listOptionsProcessor is used to set any container list options which may only -// be embedded in the format template. -// This is passed directly into tmpl.Execute in order to allow the preprocessor -// to set any list options that were not provided by flags (e.g. `.Size`). -// It is using a `map[string]bool` so that unknown fields passed into the -// template format do not cause errors. These errors will get picked up when -// running through the actual template processor. -type listOptionsProcessor map[string]bool - -// Size sets the size of the map when called by a template execution. -func (o listOptionsProcessor) Size() bool { - o["size"] = true - return true -} - -// Label is needed here as it allows the correct pre-processing -// because Label() is a method with arguments -func (o listOptionsProcessor) Label(name string) string { - return "" -} - -func buildContainerListOptions(opts *psOptions) (*types.ContainerListOptions, error) { - options := &types.ContainerListOptions{ - All: opts.all, - Limit: opts.last, - Size: opts.size, - Filters: opts.filter.Value(), - } - - if opts.nLatest && opts.last == -1 { - options.Limit = 1 - } - - tmpl, err := templates.Parse(opts.format) - - if err != nil { - return nil, err - } - - optionsProcessor := listOptionsProcessor{} - // This shouldn't error out but swallowing the error makes it harder - // to track down if preProcessor issues come up. Ref #24696 - if err := tmpl.Execute(ioutil.Discard, optionsProcessor); err != nil { - return nil, err - } - // At the moment all we need is to capture .Size for preprocessor - options.Size = opts.size || optionsProcessor["size"] - - return options, nil -} - -func runPs(dockerCli *command.DockerCli, opts *psOptions) error { - ctx := context.Background() - - listOptions, err := buildContainerListOptions(opts) - if err != nil { - return err - } - - containers, err := dockerCli.Client().ContainerList(ctx, *listOptions) - if err != nil { - return err - } - - format := opts.format - if len(format) == 0 { - if len(dockerCli.ConfigFile().PsFormat) > 0 && !opts.quiet { - format = dockerCli.ConfigFile().PsFormat - } else { - format = formatter.TableFormatKey - } - } - - containerCtx := formatter.Context{ - Output: dockerCli.Out(), - Format: formatter.NewContainerFormat(format, opts.quiet, listOptions.Size), - Trunc: !opts.noTrunc, - } - return formatter.ContainerWrite(containerCtx, containers) -} diff --git a/vendor/github.com/docker/docker/cli/command/container/logs.go b/vendor/github.com/docker/docker/cli/command/container/logs.go deleted file mode 100644 index 3a37cedf4..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/logs.go +++ /dev/null @@ -1,87 +0,0 @@ -package container - -import ( - "fmt" - "io" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/stdcopy" - "github.com/spf13/cobra" -) - -var validDrivers = map[string]bool{ - "json-file": true, - "journald": true, -} - -type logsOptions struct { - follow bool - since string - timestamps bool - details bool - tail string - - container string -} - -// NewLogsCommand creates a new cobra.Command for `docker logs` -func NewLogsCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts logsOptions - - cmd := &cobra.Command{ - Use: "logs [OPTIONS] CONTAINER", - Short: "Fetch the logs of a container", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.container = args[0] - return runLogs(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.follow, "follow", "f", false, "Follow log output") - flags.StringVar(&opts.since, "since", "", "Show logs since timestamp") - flags.BoolVarP(&opts.timestamps, "timestamps", "t", false, "Show timestamps") - flags.BoolVar(&opts.details, "details", false, "Show extra details provided to logs") - flags.StringVar(&opts.tail, "tail", "all", "Number of lines to show from the end of the logs") - return cmd -} - -func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error { - ctx := context.Background() - - c, err := dockerCli.Client().ContainerInspect(ctx, opts.container) - if err != nil { - return err - } - - if !validDrivers[c.HostConfig.LogConfig.Type] { - return fmt.Errorf("\"logs\" command is supported only for \"json-file\" and \"journald\" logging drivers (got: %s)", c.HostConfig.LogConfig.Type) - } - - options := types.ContainerLogsOptions{ - ShowStdout: true, - ShowStderr: true, - Since: opts.since, - Timestamps: opts.timestamps, - Follow: opts.follow, - Tail: opts.tail, - Details: opts.details, - } - responseBody, err := dockerCli.Client().ContainerLogs(ctx, opts.container, options) - if err != nil { - return err - } - defer responseBody.Close() - - if c.Config.Tty { - _, err = io.Copy(dockerCli.Out(), responseBody) - } else { - _, err = stdcopy.StdCopy(dockerCli.Out(), dockerCli.Err(), responseBody) - } - return err -} diff --git a/vendor/github.com/docker/docker/cli/command/container/pause.go b/vendor/github.com/docker/docker/cli/command/container/pause.go deleted file mode 100644 index 6817cf60e..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/pause.go +++ /dev/null @@ -1,49 +0,0 @@ -package container - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type pauseOptions struct { - containers []string -} - -// NewPauseCommand creates a new cobra.Command for `docker pause` -func NewPauseCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts pauseOptions - - return &cobra.Command{ - Use: "pause CONTAINER [CONTAINER...]", - Short: "Pause all processes within one or more containers", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.containers = args - return runPause(dockerCli, &opts) - }, - } -} - -func runPause(dockerCli *command.DockerCli, opts *pauseOptions) error { - ctx := context.Background() - - var errs []string - errChan := parallelOperation(ctx, opts.containers, dockerCli.Client().ContainerPause) - for _, container := range opts.containers { - if err := <-errChan; err != nil { - errs = append(errs, err.Error()) - } else { - fmt.Fprintf(dockerCli.Out(), "%s\n", container) - } - } - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/port.go b/vendor/github.com/docker/docker/cli/command/container/port.go deleted file mode 100644 index ea1529014..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/port.go +++ /dev/null @@ -1,78 +0,0 @@ -package container - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/go-connections/nat" - "github.com/spf13/cobra" -) - -type portOptions struct { - container string - - port string -} - -// NewPortCommand creates a new cobra.Command for `docker port` -func NewPortCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts portOptions - - cmd := &cobra.Command{ - Use: "port CONTAINER [PRIVATE_PORT[/PROTO]]", - Short: "List port mappings or a specific mapping for the container", - Args: cli.RequiresRangeArgs(1, 2), - RunE: func(cmd *cobra.Command, args []string) error { - opts.container = args[0] - if len(args) > 1 { - opts.port = args[1] - } - return runPort(dockerCli, &opts) - }, - } - return cmd -} - -func runPort(dockerCli *command.DockerCli, opts *portOptions) error { - ctx := context.Background() - - c, err := dockerCli.Client().ContainerInspect(ctx, opts.container) - if err != nil { - return err - } - - if opts.port != "" { - port := opts.port - proto := "tcp" - parts := strings.SplitN(port, "/", 2) - - if len(parts) == 2 && len(parts[1]) != 0 { - port = parts[0] - proto = parts[1] - } - natPort := port + "/" + proto - newP, err := nat.NewPort(proto, port) - if err != nil { - return err - } - if frontends, exists := c.NetworkSettings.Ports[newP]; exists && frontends != nil { - for _, frontend := range frontends { - fmt.Fprintf(dockerCli.Out(), "%s:%s\n", frontend.HostIP, frontend.HostPort) - } - return nil - } - return fmt.Errorf("Error: No public port '%s' published for %s", natPort, opts.container) - } - - for from, frontends := range c.NetworkSettings.Ports { - for _, frontend := range frontends { - fmt.Fprintf(dockerCli.Out(), "%s -> %s:%s\n", from, frontend.HostIP, frontend.HostPort) - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/prune.go b/vendor/github.com/docker/docker/cli/command/container/prune.go deleted file mode 100644 index 064f4c08e..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/prune.go +++ /dev/null @@ -1,75 +0,0 @@ -package container - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - units "github.com/docker/go-units" - "github.com/spf13/cobra" -) - -type pruneOptions struct { - force bool -} - -// NewPruneCommand returns a new cobra prune command for containers -func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts pruneOptions - - cmd := &cobra.Command{ - Use: "prune [OPTIONS]", - Short: "Remove all stopped containers", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - spaceReclaimed, output, err := runPrune(dockerCli, opts) - if err != nil { - return err - } - if output != "" { - fmt.Fprintln(dockerCli.Out(), output) - } - fmt.Fprintln(dockerCli.Out(), "Total reclaimed space:", units.HumanSize(float64(spaceReclaimed))) - return nil - }, - Tags: map[string]string{"version": "1.25"}, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.force, "force", "f", false, "Do not prompt for confirmation") - - return cmd -} - -const warning = `WARNING! This will remove all stopped containers. -Are you sure you want to continue?` - -func runPrune(dockerCli *command.DockerCli, opts pruneOptions) (spaceReclaimed uint64, output string, err error) { - if !opts.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), warning) { - return - } - - report, err := dockerCli.Client().ContainersPrune(context.Background(), filters.Args{}) - if err != nil { - return - } - - if len(report.ContainersDeleted) > 0 { - output = "Deleted Containers:\n" - for _, id := range report.ContainersDeleted { - output += id + "\n" - } - spaceReclaimed = report.SpaceReclaimed - } - - return -} - -// RunPrune calls the Container Prune API -// This returns the amount of space reclaimed and a detailed output string -func RunPrune(dockerCli *command.DockerCli) (uint64, string, error) { - return runPrune(dockerCli, pruneOptions{force: true}) -} diff --git a/vendor/github.com/docker/docker/cli/command/container/ps_test.go b/vendor/github.com/docker/docker/cli/command/container/ps_test.go deleted file mode 100644 index 62b054527..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/ps_test.go +++ /dev/null @@ -1,118 +0,0 @@ -package container - -import ( - "testing" - - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestBuildContainerListOptions(t *testing.T) { - filters := opts.NewFilterOpt() - assert.NilError(t, filters.Set("foo=bar")) - assert.NilError(t, filters.Set("baz=foo")) - - contexts := []struct { - psOpts *psOptions - expectedAll bool - expectedSize bool - expectedLimit int - expectedFilters map[string]string - }{ - { - psOpts: &psOptions{ - all: true, - size: true, - last: 5, - filter: filters, - }, - expectedAll: true, - expectedSize: true, - expectedLimit: 5, - expectedFilters: map[string]string{ - "foo": "bar", - "baz": "foo", - }, - }, - { - psOpts: &psOptions{ - all: true, - size: true, - last: -1, - nLatest: true, - }, - expectedAll: true, - expectedSize: true, - expectedLimit: 1, - expectedFilters: make(map[string]string), - }, - { - psOpts: &psOptions{ - all: true, - size: false, - last: 5, - filter: filters, - // With .Size, size should be true - format: "{{.Size}}", - }, - expectedAll: true, - expectedSize: true, - expectedLimit: 5, - expectedFilters: map[string]string{ - "foo": "bar", - "baz": "foo", - }, - }, - { - psOpts: &psOptions{ - all: true, - size: false, - last: 5, - filter: filters, - // With .Size, size should be true - format: "{{.Size}} {{.CreatedAt}} {{.Networks}}", - }, - expectedAll: true, - expectedSize: true, - expectedLimit: 5, - expectedFilters: map[string]string{ - "foo": "bar", - "baz": "foo", - }, - }, - { - psOpts: &psOptions{ - all: true, - size: false, - last: 5, - filter: filters, - // Without .Size, size should be false - format: "{{.CreatedAt}} {{.Networks}}", - }, - expectedAll: true, - expectedSize: false, - expectedLimit: 5, - expectedFilters: map[string]string{ - "foo": "bar", - "baz": "foo", - }, - }, - } - - for _, c := range contexts { - options, err := buildContainerListOptions(c.psOpts) - assert.NilError(t, err) - - assert.Equal(t, c.expectedAll, options.All) - assert.Equal(t, c.expectedSize, options.Size) - assert.Equal(t, c.expectedLimit, options.Limit) - assert.Equal(t, options.Filters.Len(), len(c.expectedFilters)) - - for k, v := range c.expectedFilters { - f := options.Filters - if !f.ExactMatch(k, v) { - t.Fatalf("Expected filter with key %s to be %s but got %s", k, v, f.Get(k)) - } - } - } -} diff --git a/vendor/github.com/docker/docker/cli/command/container/rename.go b/vendor/github.com/docker/docker/cli/command/container/rename.go deleted file mode 100644 index 346fb7b3b..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/rename.go +++ /dev/null @@ -1,51 +0,0 @@ -package container - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type renameOptions struct { - oldName string - newName string -} - -// NewRenameCommand creates a new cobra.Command for `docker rename` -func NewRenameCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts renameOptions - - cmd := &cobra.Command{ - Use: "rename CONTAINER NEW_NAME", - Short: "Rename a container", - Args: cli.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - opts.oldName = args[0] - opts.newName = args[1] - return runRename(dockerCli, &opts) - }, - } - return cmd -} - -func runRename(dockerCli *command.DockerCli, opts *renameOptions) error { - ctx := context.Background() - - oldName := strings.TrimSpace(opts.oldName) - newName := strings.TrimSpace(opts.newName) - - if oldName == "" || newName == "" { - return fmt.Errorf("Error: Neither old nor new names may be empty") - } - - if err := dockerCli.Client().ContainerRename(ctx, oldName, newName); err != nil { - fmt.Fprintf(dockerCli.Err(), "%s\n", err) - return fmt.Errorf("Error: failed to rename container named %s", oldName) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/restart.go b/vendor/github.com/docker/docker/cli/command/container/restart.go deleted file mode 100644 index fc3ba93c8..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/restart.go +++ /dev/null @@ -1,62 +0,0 @@ -package container - -import ( - "fmt" - "strings" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type restartOptions struct { - nSeconds int - nSecondsChanged bool - - containers []string -} - -// NewRestartCommand creates a new cobra.Command for `docker restart` -func NewRestartCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts restartOptions - - cmd := &cobra.Command{ - Use: "restart [OPTIONS] CONTAINER [CONTAINER...]", - Short: "Restart one or more containers", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.containers = args - opts.nSecondsChanged = cmd.Flags().Changed("time") - return runRestart(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.IntVarP(&opts.nSeconds, "time", "t", 10, "Seconds to wait for stop before killing the container") - return cmd -} - -func runRestart(dockerCli *command.DockerCli, opts *restartOptions) error { - ctx := context.Background() - var errs []string - var timeout *time.Duration - if opts.nSecondsChanged { - timeoutValue := time.Duration(opts.nSeconds) * time.Second - timeout = &timeoutValue - } - - for _, name := range opts.containers { - if err := dockerCli.Client().ContainerRestart(ctx, name, timeout); err != nil { - errs = append(errs, err.Error()) - } else { - fmt.Fprintf(dockerCli.Out(), "%s\n", name) - } - } - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/rm.go b/vendor/github.com/docker/docker/cli/command/container/rm.go deleted file mode 100644 index 60724f194..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/rm.go +++ /dev/null @@ -1,73 +0,0 @@ -package container - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type rmOptions struct { - rmVolumes bool - rmLink bool - force bool - - containers []string -} - -// NewRmCommand creates a new cobra.Command for `docker rm` -func NewRmCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts rmOptions - - cmd := &cobra.Command{ - Use: "rm [OPTIONS] CONTAINER [CONTAINER...]", - Short: "Remove one or more containers", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.containers = args - return runRm(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.rmVolumes, "volumes", "v", false, "Remove the volumes associated with the container") - flags.BoolVarP(&opts.rmLink, "link", "l", false, "Remove the specified link") - flags.BoolVarP(&opts.force, "force", "f", false, "Force the removal of a running container (uses SIGKILL)") - return cmd -} - -func runRm(dockerCli *command.DockerCli, opts *rmOptions) error { - ctx := context.Background() - - var errs []string - options := types.ContainerRemoveOptions{ - RemoveVolumes: opts.rmVolumes, - RemoveLinks: opts.rmLink, - Force: opts.force, - } - - errChan := parallelOperation(ctx, opts.containers, func(ctx context.Context, container string) error { - if container == "" { - return fmt.Errorf("Container name cannot be empty") - } - container = strings.Trim(container, "/") - return dockerCli.Client().ContainerRemove(ctx, container, options) - }) - - for _, name := range opts.containers { - if err := <-errChan; err != nil { - errs = append(errs, err.Error()) - } else { - fmt.Fprintf(dockerCli.Out(), "%s\n", name) - } - } - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/run.go b/vendor/github.com/docker/docker/cli/command/container/run.go deleted file mode 100644 index 0fad93e68..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/run.go +++ /dev/null @@ -1,285 +0,0 @@ -package container - -import ( - "fmt" - "io" - "net/http/httputil" - "os" - "runtime" - "strings" - "syscall" - - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - opttypes "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/promise" - "github.com/docker/docker/pkg/signal" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/docker/libnetwork/resolvconf/dns" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -type runOptions struct { - detach bool - sigProxy bool - name string - detachKeys string -} - -// NewRunCommand create a new `docker run` command -func NewRunCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts runOptions - var copts *runconfigopts.ContainerOptions - - cmd := &cobra.Command{ - Use: "run [OPTIONS] IMAGE [COMMAND] [ARG...]", - Short: "Run a command in a new container", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - copts.Image = args[0] - if len(args) > 1 { - copts.Args = args[1:] - } - return runRun(dockerCli, cmd.Flags(), &opts, copts) - }, - } - - flags := cmd.Flags() - flags.SetInterspersed(false) - - // These are flags not stored in Config/HostConfig - flags.BoolVarP(&opts.detach, "detach", "d", false, "Run container in background and print container ID") - flags.BoolVar(&opts.sigProxy, "sig-proxy", true, "Proxy received signals to the process") - flags.StringVar(&opts.name, "name", "", "Assign a name to the container") - flags.StringVar(&opts.detachKeys, "detach-keys", "", "Override the key sequence for detaching a container") - - // Add an explicit help that doesn't have a `-h` to prevent the conflict - // with hostname - flags.Bool("help", false, "Print usage") - - command.AddTrustedFlags(flags, true) - copts = runconfigopts.AddFlags(flags) - return cmd -} - -func runRun(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts *runOptions, copts *runconfigopts.ContainerOptions) error { - stdout, stderr, stdin := dockerCli.Out(), dockerCli.Err(), dockerCli.In() - client := dockerCli.Client() - // TODO: pass this as an argument - cmdPath := "run" - - var ( - flAttach *opttypes.ListOpts - ErrConflictAttachDetach = fmt.Errorf("Conflicting options: -a and -d") - ErrConflictRestartPolicyAndAutoRemove = fmt.Errorf("Conflicting options: --restart and --rm") - ) - - config, hostConfig, networkingConfig, err := runconfigopts.Parse(flags, copts) - - // just in case the Parse does not exit - if err != nil { - reportError(stderr, cmdPath, err.Error(), true) - return cli.StatusError{StatusCode: 125} - } - - if hostConfig.AutoRemove && !hostConfig.RestartPolicy.IsNone() { - return ErrConflictRestartPolicyAndAutoRemove - } - if hostConfig.OomKillDisable != nil && *hostConfig.OomKillDisable && hostConfig.Memory == 0 { - fmt.Fprintf(stderr, "WARNING: Disabling the OOM killer on containers without setting a '-m/--memory' limit may be dangerous.\n") - } - - if len(hostConfig.DNS) > 0 { - // check the DNS settings passed via --dns against - // localhost regexp to warn if they are trying to - // set a DNS to a localhost address - for _, dnsIP := range hostConfig.DNS { - if dns.IsLocalhost(dnsIP) { - fmt.Fprintf(stderr, "WARNING: Localhost DNS setting (--dns=%s) may fail in containers.\n", dnsIP) - break - } - } - } - - config.ArgsEscaped = false - - if !opts.detach { - if err := dockerCli.In().CheckTty(config.AttachStdin, config.Tty); err != nil { - return err - } - } else { - if fl := flags.Lookup("attach"); fl != nil { - flAttach = fl.Value.(*opttypes.ListOpts) - if flAttach.Len() != 0 { - return ErrConflictAttachDetach - } - } - - config.AttachStdin = false - config.AttachStdout = false - config.AttachStderr = false - config.StdinOnce = false - } - - // Disable sigProxy when in TTY mode - if config.Tty { - opts.sigProxy = false - } - - // Telling the Windows daemon the initial size of the tty during start makes - // a far better user experience rather than relying on subsequent resizes - // to cause things to catch up. - if runtime.GOOS == "windows" { - hostConfig.ConsoleSize[0], hostConfig.ConsoleSize[1] = dockerCli.Out().GetTtySize() - } - - ctx, cancelFun := context.WithCancel(context.Background()) - - createResponse, err := createContainer(ctx, dockerCli, config, hostConfig, networkingConfig, hostConfig.ContainerIDFile, opts.name) - if err != nil { - reportError(stderr, cmdPath, err.Error(), true) - return runStartContainerErr(err) - } - if opts.sigProxy { - sigc := ForwardAllSignals(ctx, dockerCli, createResponse.ID) - defer signal.StopCatch(sigc) - } - var ( - waitDisplayID chan struct{} - errCh chan error - ) - if !config.AttachStdout && !config.AttachStderr { - // Make this asynchronous to allow the client to write to stdin before having to read the ID - waitDisplayID = make(chan struct{}) - go func() { - defer close(waitDisplayID) - fmt.Fprintf(stdout, "%s\n", createResponse.ID) - }() - } - attach := config.AttachStdin || config.AttachStdout || config.AttachStderr - if attach { - var ( - out, cerr io.Writer - in io.ReadCloser - ) - if config.AttachStdin { - in = stdin - } - if config.AttachStdout { - out = stdout - } - if config.AttachStderr { - if config.Tty { - cerr = stdout - } else { - cerr = stderr - } - } - - if opts.detachKeys != "" { - dockerCli.ConfigFile().DetachKeys = opts.detachKeys - } - - options := types.ContainerAttachOptions{ - Stream: true, - Stdin: config.AttachStdin, - Stdout: config.AttachStdout, - Stderr: config.AttachStderr, - DetachKeys: dockerCli.ConfigFile().DetachKeys, - } - - resp, errAttach := client.ContainerAttach(ctx, createResponse.ID, options) - if errAttach != nil && errAttach != httputil.ErrPersistEOF { - // ContainerAttach returns an ErrPersistEOF (connection closed) - // means server met an error and put it in Hijacked connection - // keep the error and read detailed error message from hijacked connection later - return errAttach - } - defer resp.Close() - - errCh = promise.Go(func() error { - errHijack := holdHijackedConnection(ctx, dockerCli, config.Tty, in, out, cerr, resp) - if errHijack == nil { - return errAttach - } - return errHijack - }) - } - - statusChan := waitExitOrRemoved(ctx, dockerCli, createResponse.ID, hostConfig.AutoRemove) - - //start the container - if err := client.ContainerStart(ctx, createResponse.ID, types.ContainerStartOptions{}); err != nil { - // If we have holdHijackedConnection, we should notify - // holdHijackedConnection we are going to exit and wait - // to avoid the terminal are not restored. - if attach { - cancelFun() - <-errCh - } - - reportError(stderr, cmdPath, err.Error(), false) - if hostConfig.AutoRemove { - // wait container to be removed - <-statusChan - } - return runStartContainerErr(err) - } - - if (config.AttachStdin || config.AttachStdout || config.AttachStderr) && config.Tty && dockerCli.Out().IsTerminal() { - if err := MonitorTtySize(ctx, dockerCli, createResponse.ID, false); err != nil { - fmt.Fprintf(stderr, "Error monitoring TTY size: %s\n", err) - } - } - - if errCh != nil { - if err := <-errCh; err != nil { - logrus.Debugf("Error hijack: %s", err) - return err - } - } - - // Detached mode: wait for the id to be displayed and return. - if !config.AttachStdout && !config.AttachStderr { - // Detached mode - <-waitDisplayID - return nil - } - - status := <-statusChan - if status != 0 { - return cli.StatusError{StatusCode: status} - } - return nil -} - -// reportError is a utility method that prints a user-friendly message -// containing the error that occurred during parsing and a suggestion to get help -func reportError(stderr io.Writer, name string, str string, withHelp bool) { - if withHelp { - str += ".\nSee '" + os.Args[0] + " " + name + " --help'" - } - fmt.Fprintf(stderr, "%s: %s.\n", os.Args[0], str) -} - -// if container start fails with 'not found'/'no such' error, return 127 -// if container start fails with 'permission denied' error, return 126 -// return 125 for generic docker daemon failures -func runStartContainerErr(err error) error { - trimmedErr := strings.TrimPrefix(err.Error(), "Error response from daemon: ") - statusError := cli.StatusError{StatusCode: 125} - if strings.Contains(trimmedErr, "executable file not found") || - strings.Contains(trimmedErr, "no such file or directory") || - strings.Contains(trimmedErr, "system cannot find the file specified") { - statusError = cli.StatusError{StatusCode: 127} - } else if strings.Contains(trimmedErr, syscall.EACCES.Error()) { - statusError = cli.StatusError{StatusCode: 126} - } - - return statusError -} diff --git a/vendor/github.com/docker/docker/cli/command/container/start.go b/vendor/github.com/docker/docker/cli/command/container/start.go deleted file mode 100644 index 3521a4194..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/start.go +++ /dev/null @@ -1,179 +0,0 @@ -package container - -import ( - "fmt" - "io" - "net/http/httputil" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/promise" - "github.com/docker/docker/pkg/signal" - "github.com/spf13/cobra" -) - -type startOptions struct { - attach bool - openStdin bool - detachKeys string - checkpoint string - checkpointDir string - - containers []string -} - -// NewStartCommand creates a new cobra.Command for `docker start` -func NewStartCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts startOptions - - cmd := &cobra.Command{ - Use: "start [OPTIONS] CONTAINER [CONTAINER...]", - Short: "Start one or more stopped containers", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.containers = args - return runStart(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.attach, "attach", "a", false, "Attach STDOUT/STDERR and forward signals") - flags.BoolVarP(&opts.openStdin, "interactive", "i", false, "Attach container's STDIN") - flags.StringVar(&opts.detachKeys, "detach-keys", "", "Override the key sequence for detaching a container") - - flags.StringVar(&opts.checkpoint, "checkpoint", "", "Restore from this checkpoint") - flags.SetAnnotation("checkpoint", "experimental", nil) - flags.StringVar(&opts.checkpointDir, "checkpoint-dir", "", "Use a custom checkpoint storage directory") - flags.SetAnnotation("checkpoint-dir", "experimental", nil) - return cmd -} - -func runStart(dockerCli *command.DockerCli, opts *startOptions) error { - ctx, cancelFun := context.WithCancel(context.Background()) - - if opts.attach || opts.openStdin { - // We're going to attach to a container. - // 1. Ensure we only have one container. - if len(opts.containers) > 1 { - return fmt.Errorf("You cannot start and attach multiple containers at once.") - } - - // 2. Attach to the container. - container := opts.containers[0] - c, err := dockerCli.Client().ContainerInspect(ctx, container) - if err != nil { - return err - } - - // We always use c.ID instead of container to maintain consistency during `docker start` - if !c.Config.Tty { - sigc := ForwardAllSignals(ctx, dockerCli, c.ID) - defer signal.StopCatch(sigc) - } - - if opts.detachKeys != "" { - dockerCli.ConfigFile().DetachKeys = opts.detachKeys - } - - options := types.ContainerAttachOptions{ - Stream: true, - Stdin: opts.openStdin && c.Config.OpenStdin, - Stdout: true, - Stderr: true, - DetachKeys: dockerCli.ConfigFile().DetachKeys, - } - - var in io.ReadCloser - - if options.Stdin { - in = dockerCli.In() - } - - resp, errAttach := dockerCli.Client().ContainerAttach(ctx, c.ID, options) - if errAttach != nil && errAttach != httputil.ErrPersistEOF { - // ContainerAttach return an ErrPersistEOF (connection closed) - // means server met an error and already put it in Hijacked connection, - // we would keep the error and read the detailed error message from hijacked connection - return errAttach - } - defer resp.Close() - cErr := promise.Go(func() error { - errHijack := holdHijackedConnection(ctx, dockerCli, c.Config.Tty, in, dockerCli.Out(), dockerCli.Err(), resp) - if errHijack == nil { - return errAttach - } - return errHijack - }) - - // 3. We should open a channel for receiving status code of the container - // no matter it's detached, removed on daemon side(--rm) or exit normally. - statusChan := waitExitOrRemoved(ctx, dockerCli, c.ID, c.HostConfig.AutoRemove) - startOptions := types.ContainerStartOptions{ - CheckpointID: opts.checkpoint, - CheckpointDir: opts.checkpointDir, - } - - // 4. Start the container. - if err := dockerCli.Client().ContainerStart(ctx, c.ID, startOptions); err != nil { - cancelFun() - <-cErr - if c.HostConfig.AutoRemove { - // wait container to be removed - <-statusChan - } - return err - } - - // 5. Wait for attachment to break. - if c.Config.Tty && dockerCli.Out().IsTerminal() { - if err := MonitorTtySize(ctx, dockerCli, c.ID, false); err != nil { - fmt.Fprintf(dockerCli.Err(), "Error monitoring TTY size: %s\n", err) - } - } - if attchErr := <-cErr; attchErr != nil { - return attchErr - } - - if status := <-statusChan; status != 0 { - return cli.StatusError{StatusCode: status} - } - } else if opts.checkpoint != "" { - if len(opts.containers) > 1 { - return fmt.Errorf("You cannot restore multiple containers at once.") - } - container := opts.containers[0] - startOptions := types.ContainerStartOptions{ - CheckpointID: opts.checkpoint, - CheckpointDir: opts.checkpointDir, - } - return dockerCli.Client().ContainerStart(ctx, container, startOptions) - - } else { - // We're not going to attach to anything. - // Start as many containers as we want. - return startContainersWithoutAttachments(ctx, dockerCli, opts.containers) - } - - return nil -} - -func startContainersWithoutAttachments(ctx context.Context, dockerCli *command.DockerCli, containers []string) error { - var failedContainers []string - for _, container := range containers { - if err := dockerCli.Client().ContainerStart(ctx, container, types.ContainerStartOptions{}); err != nil { - fmt.Fprintf(dockerCli.Err(), "%s\n", err) - failedContainers = append(failedContainers, container) - } else { - fmt.Fprintf(dockerCli.Out(), "%s\n", container) - } - } - - if len(failedContainers) > 0 { - return fmt.Errorf("Error: failed to start containers: %v", strings.Join(failedContainers, ", ")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/stats.go b/vendor/github.com/docker/docker/cli/command/container/stats.go deleted file mode 100644 index 12d5c6852..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/stats.go +++ /dev/null @@ -1,243 +0,0 @@ -package container - -import ( - "fmt" - "io" - "strings" - "sync" - "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" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/formatter" - "github.com/spf13/cobra" -) - -type statsOptions struct { - all bool - noStream bool - format string - containers []string -} - -// NewStatsCommand creates a new cobra.Command for `docker stats` -func NewStatsCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts statsOptions - - cmd := &cobra.Command{ - Use: "stats [OPTIONS] [CONTAINER...]", - Short: "Display a live stream of container(s) resource usage statistics", - Args: cli.RequiresMinArgs(0), - RunE: func(cmd *cobra.Command, args []string) error { - opts.containers = args - return runStats(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.all, "all", "a", false, "Show all containers (default shows just running)") - flags.BoolVar(&opts.noStream, "no-stream", false, "Disable streaming stats and only pull the first result") - flags.StringVar(&opts.format, "format", "", "Pretty-print images using a Go template") - return cmd -} - -// runStats displays a live stream of resource usage statistics for one or more containers. -// This shows real-time information on CPU usage, memory usage, and network I/O. -func runStats(dockerCli *command.DockerCli, opts *statsOptions) error { - showAll := len(opts.containers) == 0 - closeChan := make(chan error) - - ctx := context.Background() - - // monitorContainerEvents watches for container creation and removal (only - // used when calling `docker stats` without arguments). - monitorContainerEvents := func(started chan<- struct{}, c chan events.Message) { - f := filters.NewArgs() - f.Add("type", "container") - options := types.EventsOptions{ - Filters: f, - } - - eventq, errq := dockerCli.Client().Events(ctx, options) - - // Whether we successfully subscribed to eventq or not, we can now - // unblock the main goroutine. - close(started) - - for { - select { - case event := <-eventq: - c <- event - case err := <-errq: - closeChan <- err - return - } - } - } - - // Get the daemonOSType if not set already - if daemonOSType == "" { - svctx := context.Background() - sv, err := dockerCli.Client().ServerVersion(svctx) - if err != nil { - return err - } - daemonOSType = sv.Os - } - - // waitFirst is a WaitGroup to wait first stat data's reach for each container - waitFirst := &sync.WaitGroup{} - - cStats := stats{} - // getContainerList simulates creation event for all previously existing - // containers (only used when calling `docker stats` without arguments). - getContainerList := func() { - options := types.ContainerListOptions{ - All: opts.all, - } - cs, err := dockerCli.Client().ContainerList(ctx, options) - if err != nil { - closeChan <- err - } - for _, container := range cs { - s := formatter.NewContainerStats(container.ID[:12], daemonOSType) - if cStats.add(s) { - waitFirst.Add(1) - go collect(ctx, s, dockerCli.Client(), !opts.noStream, waitFirst) - } - } - } - - if showAll { - // If no names were specified, start a long running goroutine which - // monitors container events. We make sure we're subscribed before - // retrieving the list of running containers to avoid a race where we - // would "miss" a creation. - started := make(chan struct{}) - eh := command.InitEventHandler() - eh.Handle("create", func(e events.Message) { - if opts.all { - s := formatter.NewContainerStats(e.ID[:12], daemonOSType) - if cStats.add(s) { - waitFirst.Add(1) - go collect(ctx, s, dockerCli.Client(), !opts.noStream, waitFirst) - } - } - }) - - eh.Handle("start", func(e events.Message) { - s := formatter.NewContainerStats(e.ID[:12], daemonOSType) - if cStats.add(s) { - waitFirst.Add(1) - go collect(ctx, s, dockerCli.Client(), !opts.noStream, waitFirst) - } - }) - - eh.Handle("die", func(e events.Message) { - if !opts.all { - cStats.remove(e.ID[:12]) - } - }) - - eventChan := make(chan events.Message) - go eh.Watch(eventChan) - go monitorContainerEvents(started, eventChan) - defer close(eventChan) - <-started - - // Start a short-lived goroutine to retrieve the initial list of - // containers. - getContainerList() - } else { - // Artificially send creation events for the containers we were asked to - // monitor (same code path than we use when monitoring all containers). - for _, name := range opts.containers { - s := formatter.NewContainerStats(name, daemonOSType) - if cStats.add(s) { - waitFirst.Add(1) - go collect(ctx, s, dockerCli.Client(), !opts.noStream, waitFirst) - } - } - - // We don't expect any asynchronous errors: closeChan can be closed. - close(closeChan) - - // Do a quick pause to detect any error with the provided list of - // container names. - time.Sleep(1500 * time.Millisecond) - var errs []string - cStats.mu.Lock() - for _, c := range cStats.cs { - cErr := c.GetError() - if cErr != nil { - errs = append(errs, fmt.Sprintf("%s: %v", c.Name, cErr)) - } - } - cStats.mu.Unlock() - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, ", ")) - } - } - - // before print to screen, make sure each container get at least one valid stat data - waitFirst.Wait() - format := opts.format - if len(format) == 0 { - if len(dockerCli.ConfigFile().StatsFormat) > 0 { - format = dockerCli.ConfigFile().StatsFormat - } else { - format = formatter.TableFormatKey - } - } - statsCtx := formatter.Context{ - Output: dockerCli.Out(), - Format: formatter.NewStatsFormat(format, daemonOSType), - } - cleanScreen := func() { - if !opts.noStream { - fmt.Fprint(dockerCli.Out(), "\033[2J") - fmt.Fprint(dockerCli.Out(), "\033[H") - } - } - - var err error - for range time.Tick(500 * time.Millisecond) { - cleanScreen() - ccstats := []formatter.StatsEntry{} - cStats.mu.Lock() - for _, c := range cStats.cs { - ccstats = append(ccstats, c.GetStatistics()) - } - cStats.mu.Unlock() - if err = formatter.ContainerStatsWrite(statsCtx, ccstats); err != nil { - break - } - if len(cStats.cs) == 0 && !showAll { - break - } - if opts.noStream { - break - } - select { - case err, ok := <-closeChan: - if ok { - if err != nil { - // this is suppressing "unexpected EOF" in the cli when the - // daemon restarts so it shutdowns cleanly - if err == io.ErrUnexpectedEOF { - return nil - } - return err - } - } - default: - // just skip - } - } - return err -} diff --git a/vendor/github.com/docker/docker/cli/command/container/stats_helpers.go b/vendor/github.com/docker/docker/cli/command/container/stats_helpers.go deleted file mode 100644 index 4b57e3fe0..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/stats_helpers.go +++ /dev/null @@ -1,226 +0,0 @@ -package container - -import ( - "encoding/json" - "errors" - "io" - "strings" - "sync" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli/command/formatter" - "github.com/docker/docker/client" - "golang.org/x/net/context" -) - -type stats struct { - ostype string - mu sync.Mutex - cs []*formatter.ContainerStats -} - -// daemonOSType is set once we have at least one stat for a container -// from the daemon. It is used to ensure we print the right header based -// on the daemon platform. -var daemonOSType string - -func (s *stats) add(cs *formatter.ContainerStats) bool { - s.mu.Lock() - defer s.mu.Unlock() - if _, exists := s.isKnownContainer(cs.Container); !exists { - s.cs = append(s.cs, cs) - return true - } - return false -} - -func (s *stats) remove(id string) { - s.mu.Lock() - if i, exists := s.isKnownContainer(id); exists { - s.cs = append(s.cs[:i], s.cs[i+1:]...) - } - s.mu.Unlock() -} - -func (s *stats) isKnownContainer(cid string) (int, bool) { - for i, c := range s.cs { - if c.Container == cid { - return i, true - } - } - return -1, false -} - -func collect(ctx context.Context, s *formatter.ContainerStats, cli client.APIClient, streamStats bool, waitFirst *sync.WaitGroup) { - logrus.Debugf("collecting stats for %s", s.Container) - var ( - getFirst bool - previousCPU uint64 - previousSystem uint64 - u = make(chan error, 1) - ) - - defer func() { - // if error happens and we get nothing of stats, release wait group whatever - if !getFirst { - getFirst = true - waitFirst.Done() - } - }() - - response, err := cli.ContainerStats(ctx, s.Container, streamStats) - if err != nil { - s.SetError(err) - return - } - defer response.Body.Close() - - dec := json.NewDecoder(response.Body) - go func() { - for { - var ( - v *types.StatsJSON - memPercent = 0.0 - cpuPercent = 0.0 - blkRead, blkWrite uint64 // Only used on Linux - mem = 0.0 - memLimit = 0.0 - memPerc = 0.0 - pidsStatsCurrent uint64 - ) - - if err := dec.Decode(&v); err != nil { - dec = json.NewDecoder(io.MultiReader(dec.Buffered(), response.Body)) - u <- err - if err == io.EOF { - break - } - time.Sleep(100 * time.Millisecond) - continue - } - - daemonOSType = response.OSType - - if daemonOSType != "windows" { - // MemoryStats.Limit will never be 0 unless the container is not running and we haven't - // got any data from cgroup - if v.MemoryStats.Limit != 0 { - memPercent = float64(v.MemoryStats.Usage) / float64(v.MemoryStats.Limit) * 100.0 - } - previousCPU = v.PreCPUStats.CPUUsage.TotalUsage - previousSystem = v.PreCPUStats.SystemUsage - cpuPercent = calculateCPUPercentUnix(previousCPU, previousSystem, v) - blkRead, blkWrite = calculateBlockIO(v.BlkioStats) - mem = float64(v.MemoryStats.Usage) - memLimit = float64(v.MemoryStats.Limit) - memPerc = memPercent - pidsStatsCurrent = v.PidsStats.Current - } else { - cpuPercent = calculateCPUPercentWindows(v) - blkRead = v.StorageStats.ReadSizeBytes - blkWrite = v.StorageStats.WriteSizeBytes - mem = float64(v.MemoryStats.PrivateWorkingSet) - } - netRx, netTx := calculateNetwork(v.Networks) - s.SetStatistics(formatter.StatsEntry{ - Name: v.Name, - ID: v.ID, - CPUPercentage: cpuPercent, - Memory: mem, - MemoryPercentage: memPerc, - MemoryLimit: memLimit, - NetworkRx: netRx, - NetworkTx: netTx, - BlockRead: float64(blkRead), - BlockWrite: float64(blkWrite), - PidsCurrent: pidsStatsCurrent, - }) - u <- nil - if !streamStats { - return - } - } - }() - for { - select { - case <-time.After(2 * time.Second): - // zero out the values if we have not received an update within - // the specified duration. - s.SetErrorAndReset(errors.New("timeout waiting for stats")) - // if this is the first stat you get, release WaitGroup - if !getFirst { - getFirst = true - waitFirst.Done() - } - case err := <-u: - if err != nil { - s.SetError(err) - continue - } - s.SetError(nil) - // if this is the first stat you get, release WaitGroup - if !getFirst { - getFirst = true - waitFirst.Done() - } - } - if !streamStats { - return - } - } -} - -func calculateCPUPercentUnix(previousCPU, previousSystem uint64, v *types.StatsJSON) float64 { - var ( - cpuPercent = 0.0 - // calculate the change for the cpu usage of the container in between readings - cpuDelta = float64(v.CPUStats.CPUUsage.TotalUsage) - float64(previousCPU) - // calculate the change for the entire system between readings - systemDelta = float64(v.CPUStats.SystemUsage) - float64(previousSystem) - ) - - if systemDelta > 0.0 && cpuDelta > 0.0 { - cpuPercent = (cpuDelta / systemDelta) * float64(len(v.CPUStats.CPUUsage.PercpuUsage)) * 100.0 - } - return cpuPercent -} - -func calculateCPUPercentWindows(v *types.StatsJSON) float64 { - // Max number of 100ns intervals between the previous time read and now - possIntervals := uint64(v.Read.Sub(v.PreRead).Nanoseconds()) // Start with number of ns intervals - possIntervals /= 100 // Convert to number of 100ns intervals - possIntervals *= uint64(v.NumProcs) // Multiple by the number of processors - - // Intervals used - intervalsUsed := v.CPUStats.CPUUsage.TotalUsage - v.PreCPUStats.CPUUsage.TotalUsage - - // Percentage avoiding divide-by-zero - if possIntervals > 0 { - return float64(intervalsUsed) / float64(possIntervals) * 100.0 - } - return 0.00 -} - -func calculateBlockIO(blkio types.BlkioStats) (blkRead uint64, blkWrite uint64) { - for _, bioEntry := range blkio.IoServiceBytesRecursive { - switch strings.ToLower(bioEntry.Op) { - case "read": - blkRead = blkRead + bioEntry.Value - case "write": - blkWrite = blkWrite + bioEntry.Value - } - } - return -} - -func calculateNetwork(network map[string]types.NetworkStats) (float64, float64) { - var rx, tx float64 - - for _, v := range network { - rx += float64(v.RxBytes) - tx += float64(v.TxBytes) - } - return rx, tx -} diff --git a/vendor/github.com/docker/docker/cli/command/container/stats_unit_test.go b/vendor/github.com/docker/docker/cli/command/container/stats_unit_test.go deleted file mode 100644 index 828d634c8..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/stats_unit_test.go +++ /dev/null @@ -1,20 +0,0 @@ -package container - -import ( - "testing" - - "github.com/docker/docker/api/types" -) - -func TestCalculateBlockIO(t *testing.T) { - blkio := types.BlkioStats{ - IoServiceBytesRecursive: []types.BlkioStatEntry{{8, 0, "read", 1234}, {8, 1, "read", 4567}, {8, 0, "write", 123}, {8, 1, "write", 456}}, - } - blkRead, blkWrite := calculateBlockIO(blkio) - if blkRead != 5801 { - t.Fatalf("blkRead = %d, want 5801", blkRead) - } - if blkWrite != 579 { - t.Fatalf("blkWrite = %d, want 579", blkWrite) - } -} diff --git a/vendor/github.com/docker/docker/cli/command/container/stop.go b/vendor/github.com/docker/docker/cli/command/container/stop.go deleted file mode 100644 index c68ede536..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/stop.go +++ /dev/null @@ -1,67 +0,0 @@ -package container - -import ( - "fmt" - "strings" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type stopOptions struct { - time int - timeChanged bool - - containers []string -} - -// NewStopCommand creates a new cobra.Command for `docker stop` -func NewStopCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts stopOptions - - cmd := &cobra.Command{ - Use: "stop [OPTIONS] CONTAINER [CONTAINER...]", - Short: "Stop one or more running containers", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.containers = args - opts.timeChanged = cmd.Flags().Changed("time") - return runStop(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.IntVarP(&opts.time, "time", "t", 10, "Seconds to wait for stop before killing it") - return cmd -} - -func runStop(dockerCli *command.DockerCli, opts *stopOptions) error { - ctx := context.Background() - - var timeout *time.Duration - if opts.timeChanged { - timeoutValue := time.Duration(opts.time) * time.Second - timeout = &timeoutValue - } - - var errs []string - - errChan := parallelOperation(ctx, opts.containers, func(ctx context.Context, id string) error { - return dockerCli.Client().ContainerStop(ctx, id, timeout) - }) - for _, container := range opts.containers { - if err := <-errChan; err != nil { - errs = append(errs, err.Error()) - } else { - fmt.Fprintf(dockerCli.Out(), "%s\n", container) - } - } - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/top.go b/vendor/github.com/docker/docker/cli/command/container/top.go deleted file mode 100644 index 160153ba7..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/top.go +++ /dev/null @@ -1,58 +0,0 @@ -package container - -import ( - "fmt" - "strings" - "text/tabwriter" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type topOptions struct { - container string - - args []string -} - -// NewTopCommand creates a new cobra.Command for `docker top` -func NewTopCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts topOptions - - cmd := &cobra.Command{ - Use: "top CONTAINER [ps OPTIONS]", - Short: "Display the running processes of a container", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.container = args[0] - opts.args = args[1:] - return runTop(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.SetInterspersed(false) - - return cmd -} - -func runTop(dockerCli *command.DockerCli, opts *topOptions) error { - ctx := context.Background() - - procList, err := dockerCli.Client().ContainerTop(ctx, opts.container, opts.args) - if err != nil { - return err - } - - w := tabwriter.NewWriter(dockerCli.Out(), 20, 1, 3, ' ', 0) - fmt.Fprintln(w, strings.Join(procList.Titles, "\t")) - - for _, proc := range procList.Processes { - fmt.Fprintln(w, strings.Join(proc, "\t")) - } - w.Flush() - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/tty.go b/vendor/github.com/docker/docker/cli/command/container/tty.go deleted file mode 100644 index 6af8e2bec..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/tty.go +++ /dev/null @@ -1,103 +0,0 @@ -package container - -import ( - "fmt" - "os" - gosignal "os/signal" - "runtime" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/client" - "github.com/docker/docker/pkg/signal" - "golang.org/x/net/context" -) - -// resizeTtyTo resizes tty to specific height and width -func resizeTtyTo(ctx context.Context, client client.ContainerAPIClient, id string, height, width uint, isExec bool) { - if height == 0 && width == 0 { - return - } - - options := types.ResizeOptions{ - Height: height, - Width: width, - } - - var err error - if isExec { - err = client.ContainerExecResize(ctx, id, options) - } else { - err = client.ContainerResize(ctx, id, options) - } - - if err != nil { - logrus.Debugf("Error resize: %s", err) - } -} - -// MonitorTtySize updates the container tty size when the terminal tty changes size -func MonitorTtySize(ctx context.Context, cli *command.DockerCli, id string, isExec bool) error { - resizeTty := func() { - height, width := cli.Out().GetTtySize() - resizeTtyTo(ctx, cli.Client(), id, height, width, isExec) - } - - resizeTty() - - if runtime.GOOS == "windows" { - go func() { - prevH, prevW := cli.Out().GetTtySize() - for { - time.Sleep(time.Millisecond * 250) - h, w := cli.Out().GetTtySize() - - if prevW != w || prevH != h { - resizeTty() - } - prevH = h - prevW = w - } - }() - } else { - sigchan := make(chan os.Signal, 1) - gosignal.Notify(sigchan, signal.SIGWINCH) - go func() { - for range sigchan { - resizeTty() - } - }() - } - return nil -} - -// ForwardAllSignals forwards signals to the container -func ForwardAllSignals(ctx context.Context, cli *command.DockerCli, cid string) chan os.Signal { - sigc := make(chan os.Signal, 128) - signal.CatchAll(sigc) - go func() { - for s := range sigc { - if s == signal.SIGCHLD || s == signal.SIGPIPE { - continue - } - var sig string - for sigStr, sigN := range signal.SignalMap { - if sigN == s { - sig = sigStr - break - } - } - if sig == "" { - fmt.Fprintf(cli.Err(), "Unsupported signal: %v. Discarding.\n", s) - continue - } - - if err := cli.Client().ContainerKill(ctx, cid, sig); err != nil { - logrus.Debugf("Error sending signal: %s", err) - } - } - }() - return sigc -} diff --git a/vendor/github.com/docker/docker/cli/command/container/unpause.go b/vendor/github.com/docker/docker/cli/command/container/unpause.go deleted file mode 100644 index c4d8d4841..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/unpause.go +++ /dev/null @@ -1,50 +0,0 @@ -package container - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type unpauseOptions struct { - containers []string -} - -// NewUnpauseCommand creates a new cobra.Command for `docker unpause` -func NewUnpauseCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts unpauseOptions - - cmd := &cobra.Command{ - Use: "unpause CONTAINER [CONTAINER...]", - Short: "Unpause all processes within one or more containers", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.containers = args - return runUnpause(dockerCli, &opts) - }, - } - return cmd -} - -func runUnpause(dockerCli *command.DockerCli, opts *unpauseOptions) error { - ctx := context.Background() - - var errs []string - errChan := parallelOperation(ctx, opts.containers, dockerCli.Client().ContainerUnpause) - for _, container := range opts.containers { - if err := <-errChan; err != nil { - errs = append(errs, err.Error()) - } else { - fmt.Fprintf(dockerCli.Out(), "%s\n", container) - } - } - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/update.go b/vendor/github.com/docker/docker/cli/command/container/update.go deleted file mode 100644 index 75765856c..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/update.go +++ /dev/null @@ -1,163 +0,0 @@ -package container - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/docker/go-units" - "github.com/spf13/cobra" -) - -type updateOptions struct { - blkioWeight uint16 - cpuPeriod int64 - cpuQuota int64 - cpuRealtimePeriod int64 - cpuRealtimeRuntime int64 - cpusetCpus string - cpusetMems string - cpuShares int64 - memoryString string - memoryReservation string - memorySwap string - kernelMemory string - restartPolicy string - - nFlag int - - containers []string -} - -// NewUpdateCommand creates a new cobra.Command for `docker update` -func NewUpdateCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts updateOptions - - cmd := &cobra.Command{ - Use: "update [OPTIONS] CONTAINER [CONTAINER...]", - Short: "Update configuration of one or more containers", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.containers = args - opts.nFlag = cmd.Flags().NFlag() - return runUpdate(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.Uint16Var(&opts.blkioWeight, "blkio-weight", 0, "Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)") - flags.Int64Var(&opts.cpuPeriod, "cpu-period", 0, "Limit CPU CFS (Completely Fair Scheduler) period") - flags.Int64Var(&opts.cpuQuota, "cpu-quota", 0, "Limit CPU CFS (Completely Fair Scheduler) quota") - flags.Int64Var(&opts.cpuRealtimePeriod, "cpu-rt-period", 0, "Limit the CPU real-time period in microseconds") - flags.Int64Var(&opts.cpuRealtimeRuntime, "cpu-rt-runtime", 0, "Limit the CPU real-time runtime in microseconds") - flags.StringVar(&opts.cpusetCpus, "cpuset-cpus", "", "CPUs in which to allow execution (0-3, 0,1)") - flags.StringVar(&opts.cpusetMems, "cpuset-mems", "", "MEMs in which to allow execution (0-3, 0,1)") - flags.Int64VarP(&opts.cpuShares, "cpu-shares", "c", 0, "CPU shares (relative weight)") - flags.StringVarP(&opts.memoryString, "memory", "m", "", "Memory limit") - flags.StringVar(&opts.memoryReservation, "memory-reservation", "", "Memory soft limit") - flags.StringVar(&opts.memorySwap, "memory-swap", "", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap") - flags.StringVar(&opts.kernelMemory, "kernel-memory", "", "Kernel memory limit") - flags.StringVar(&opts.restartPolicy, "restart", "", "Restart policy to apply when a container exits") - - return cmd -} - -func runUpdate(dockerCli *command.DockerCli, opts *updateOptions) error { - var err error - - if opts.nFlag == 0 { - return fmt.Errorf("You must provide one or more flags when using this command.") - } - - var memory int64 - if opts.memoryString != "" { - memory, err = units.RAMInBytes(opts.memoryString) - if err != nil { - return err - } - } - - var memoryReservation int64 - if opts.memoryReservation != "" { - memoryReservation, err = units.RAMInBytes(opts.memoryReservation) - if err != nil { - return err - } - } - - var memorySwap int64 - if opts.memorySwap != "" { - if opts.memorySwap == "-1" { - memorySwap = -1 - } else { - memorySwap, err = units.RAMInBytes(opts.memorySwap) - if err != nil { - return err - } - } - } - - var kernelMemory int64 - if opts.kernelMemory != "" { - kernelMemory, err = units.RAMInBytes(opts.kernelMemory) - if err != nil { - return err - } - } - - var restartPolicy containertypes.RestartPolicy - if opts.restartPolicy != "" { - restartPolicy, err = runconfigopts.ParseRestartPolicy(opts.restartPolicy) - if err != nil { - return err - } - } - - resources := containertypes.Resources{ - BlkioWeight: opts.blkioWeight, - CpusetCpus: opts.cpusetCpus, - CpusetMems: opts.cpusetMems, - CPUShares: opts.cpuShares, - Memory: memory, - MemoryReservation: memoryReservation, - MemorySwap: memorySwap, - KernelMemory: kernelMemory, - CPUPeriod: opts.cpuPeriod, - CPUQuota: opts.cpuQuota, - CPURealtimePeriod: opts.cpuRealtimePeriod, - CPURealtimeRuntime: opts.cpuRealtimeRuntime, - } - - updateConfig := containertypes.UpdateConfig{ - Resources: resources, - RestartPolicy: restartPolicy, - } - - ctx := context.Background() - - var ( - warns []string - errs []string - ) - for _, container := range opts.containers { - r, err := dockerCli.Client().ContainerUpdate(ctx, container, updateConfig) - if err != nil { - errs = append(errs, err.Error()) - } else { - fmt.Fprintf(dockerCli.Out(), "%s\n", container) - } - warns = append(warns, r.Warnings...) - } - if len(warns) > 0 { - fmt.Fprintf(dockerCli.Out(), "%s", strings.Join(warns, "\n")) - } - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/container/utils.go b/vendor/github.com/docker/docker/cli/command/container/utils.go deleted file mode 100644 index 6bef92463..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/utils.go +++ /dev/null @@ -1,143 +0,0 @@ -package container - -import ( - "strconv" - - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/events" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/cli/command" - clientapi "github.com/docker/docker/client" -) - -func waitExitOrRemoved(ctx context.Context, dockerCli *command.DockerCli, containerID string, waitRemove bool) chan int { - if len(containerID) == 0 { - // containerID can never be empty - panic("Internal Error: waitExitOrRemoved needs a containerID as parameter") - } - - var removeErr error - statusChan := make(chan int) - exitCode := 125 - - // Get events via Events API - f := filters.NewArgs() - f.Add("type", "container") - f.Add("container", containerID) - options := types.EventsOptions{ - Filters: f, - } - eventCtx, cancel := context.WithCancel(ctx) - eventq, errq := dockerCli.Client().Events(eventCtx, options) - - eventProcessor := func(e events.Message) bool { - stopProcessing := false - switch e.Status { - case "die": - if v, ok := e.Actor.Attributes["exitCode"]; ok { - code, cerr := strconv.Atoi(v) - if cerr != nil { - logrus.Errorf("failed to convert exitcode '%q' to int: %v", v, cerr) - } else { - exitCode = code - } - } - if !waitRemove { - stopProcessing = true - } else { - // If we are talking to an older daemon, `AutoRemove` is not supported. - // We need to fall back to the old behavior, which is client-side removal - if versions.LessThan(dockerCli.Client().ClientVersion(), "1.25") { - go func() { - removeErr = dockerCli.Client().ContainerRemove(ctx, containerID, types.ContainerRemoveOptions{RemoveVolumes: true}) - if removeErr != nil { - logrus.Errorf("error removing container: %v", removeErr) - cancel() // cancel the event Q - } - }() - } - } - case "detach": - exitCode = 0 - stopProcessing = true - case "destroy": - stopProcessing = true - } - return stopProcessing - } - - go func() { - defer func() { - statusChan <- exitCode // must always send an exit code or the caller will block - cancel() - }() - - for { - select { - case <-eventCtx.Done(): - if removeErr != nil { - return - } - case evt := <-eventq: - if eventProcessor(evt) { - return - } - case err := <-errq: - logrus.Errorf("error getting events from daemon: %v", err) - return - } - } - }() - - return statusChan -} - -// getExitCode performs an inspect on the container. It returns -// the running state and the exit code. -func getExitCode(ctx context.Context, dockerCli *command.DockerCli, containerID string) (bool, int, error) { - c, err := dockerCli.Client().ContainerInspect(ctx, containerID) - if err != nil { - // If we can't connect, then the daemon probably died. - if !clientapi.IsErrConnectionFailed(err) { - return false, -1, err - } - return false, -1, nil - } - return c.State.Running, c.State.ExitCode, nil -} - -func parallelOperation(ctx context.Context, containers []string, op func(ctx context.Context, container string) error) chan error { - if len(containers) == 0 { - return nil - } - const defaultParallel int = 50 - sem := make(chan struct{}, defaultParallel) - errChan := make(chan error) - - // make sure result is printed in correct order - output := map[string]chan error{} - for _, c := range containers { - output[c] = make(chan error, 1) - } - go func() { - for _, c := range containers { - err := <-output[c] - errChan <- err - } - }() - - go func() { - for _, c := range containers { - sem <- struct{}{} // Wait for active queue sem to drain. - go func(container string) { - output[container] <- op(ctx, container) - <-sem - }(c) - } - }() - return errChan -} diff --git a/vendor/github.com/docker/docker/cli/command/container/wait.go b/vendor/github.com/docker/docker/cli/command/container/wait.go deleted file mode 100644 index 19ccf7ac2..000000000 --- a/vendor/github.com/docker/docker/cli/command/container/wait.go +++ /dev/null @@ -1,50 +0,0 @@ -package container - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type waitOptions struct { - containers []string -} - -// NewWaitCommand creates a new cobra.Command for `docker wait` -func NewWaitCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts waitOptions - - cmd := &cobra.Command{ - Use: "wait CONTAINER [CONTAINER...]", - Short: "Block until one or more containers stop, then print their exit codes", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.containers = args - return runWait(dockerCli, &opts) - }, - } - return cmd -} - -func runWait(dockerCli *command.DockerCli, opts *waitOptions) error { - ctx := context.Background() - - var errs []string - for _, container := range opts.containers { - status, err := dockerCli.Client().ContainerWait(ctx, container) - if err != nil { - errs = append(errs, err.Error()) - } else { - fmt.Fprintf(dockerCli.Out(), "%d\n", status) - } - } - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/events_utils.go b/vendor/github.com/docker/docker/cli/command/events_utils.go deleted file mode 100644 index e710c9757..000000000 --- a/vendor/github.com/docker/docker/cli/command/events_utils.go +++ /dev/null @@ -1,49 +0,0 @@ -package command - -import ( - "sync" - - "github.com/Sirupsen/logrus" - eventtypes "github.com/docker/docker/api/types/events" -) - -type eventProcessor func(eventtypes.Message, error) error - -// EventHandler is abstract interface for user to customize -// own handle functions of each type of events -type EventHandler interface { - Handle(action string, h func(eventtypes.Message)) - Watch(c <-chan eventtypes.Message) -} - -// InitEventHandler initializes and returns an EventHandler -func InitEventHandler() EventHandler { - return &eventHandler{handlers: make(map[string]func(eventtypes.Message))} -} - -type eventHandler struct { - handlers map[string]func(eventtypes.Message) - mu sync.Mutex -} - -func (w *eventHandler) Handle(action string, h func(eventtypes.Message)) { - w.mu.Lock() - w.handlers[action] = h - w.mu.Unlock() -} - -// Watch ranges over the passed in event chan and processes the events based on the -// handlers created for a given action. -// To stop watching, close the event chan. -func (w *eventHandler) Watch(c <-chan eventtypes.Message) { - for e := range c { - w.mu.Lock() - h, exists := w.handlers[e.Action] - w.mu.Unlock() - if !exists { - continue - } - logrus.Debugf("event handler: received event: %v", e) - go h(e) - } -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/container.go b/vendor/github.com/docker/docker/cli/command/formatter/container.go deleted file mode 100644 index 627345335..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/container.go +++ /dev/null @@ -1,235 +0,0 @@ -package formatter - -import ( - "fmt" - "strconv" - "strings" - "time" - - "github.com/docker/docker/api" - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/stringutils" - units "github.com/docker/go-units" -) - -const ( - defaultContainerTableFormat = "table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.RunningFor}} ago\t{{.Status}}\t{{.Ports}}\t{{.Names}}" - - containerIDHeader = "CONTAINER ID" - namesHeader = "NAMES" - commandHeader = "COMMAND" - runningForHeader = "CREATED" - statusHeader = "STATUS" - portsHeader = "PORTS" - mountsHeader = "MOUNTS" - localVolumes = "LOCAL VOLUMES" - networksHeader = "NETWORKS" -) - -// NewContainerFormat returns a Format for rendering using a Context -func NewContainerFormat(source string, quiet bool, size bool) Format { - switch source { - case TableFormatKey: - if quiet { - return defaultQuietFormat - } - format := defaultContainerTableFormat - if size { - format += `\t{{.Size}}` - } - return Format(format) - case RawFormatKey: - if quiet { - return `container_id: {{.ID}}` - } - format := `container_id: {{.ID}} -image: {{.Image}} -command: {{.Command}} -created_at: {{.CreatedAt}} -status: {{- pad .Status 1 0}} -names: {{.Names}} -labels: {{- pad .Labels 1 0}} -ports: {{- pad .Ports 1 0}} -` - if size { - format += `size: {{.Size}}\n` - } - return Format(format) - } - return Format(source) -} - -// ContainerWrite renders the context for a list of containers -func ContainerWrite(ctx Context, containers []types.Container) error { - render := func(format func(subContext subContext) error) error { - for _, container := range containers { - err := format(&containerContext{trunc: ctx.Trunc, c: container}) - if err != nil { - return err - } - } - return nil - } - return ctx.Write(&containerContext{}, render) -} - -type containerContext struct { - HeaderContext - trunc bool - c types.Container -} - -func (c *containerContext) MarshalJSON() ([]byte, error) { - return marshalJSON(c) -} - -func (c *containerContext) ID() string { - c.AddHeader(containerIDHeader) - if c.trunc { - return stringid.TruncateID(c.c.ID) - } - return c.c.ID -} - -func (c *containerContext) Names() string { - c.AddHeader(namesHeader) - names := stripNamePrefix(c.c.Names) - if c.trunc { - for _, name := range names { - if len(strings.Split(name, "/")) == 1 { - names = []string{name} - break - } - } - } - return strings.Join(names, ",") -} - -func (c *containerContext) Image() string { - c.AddHeader(imageHeader) - if c.c.Image == "" { - return "" - } - if c.trunc { - if trunc := stringid.TruncateID(c.c.ImageID); trunc == stringid.TruncateID(c.c.Image) { - return trunc - } - } - return c.c.Image -} - -func (c *containerContext) Command() string { - c.AddHeader(commandHeader) - command := c.c.Command - if c.trunc { - command = stringutils.Ellipsis(command, 20) - } - return strconv.Quote(command) -} - -func (c *containerContext) CreatedAt() string { - c.AddHeader(createdAtHeader) - return time.Unix(int64(c.c.Created), 0).String() -} - -func (c *containerContext) RunningFor() string { - c.AddHeader(runningForHeader) - createdAt := time.Unix(int64(c.c.Created), 0) - return units.HumanDuration(time.Now().UTC().Sub(createdAt)) -} - -func (c *containerContext) Ports() string { - c.AddHeader(portsHeader) - return api.DisplayablePorts(c.c.Ports) -} - -func (c *containerContext) Status() string { - c.AddHeader(statusHeader) - return c.c.Status -} - -func (c *containerContext) Size() string { - c.AddHeader(sizeHeader) - srw := units.HumanSizeWithPrecision(float64(c.c.SizeRw), 3) - sv := units.HumanSizeWithPrecision(float64(c.c.SizeRootFs), 3) - - sf := srw - if c.c.SizeRootFs > 0 { - sf = fmt.Sprintf("%s (virtual %s)", srw, sv) - } - return sf -} - -func (c *containerContext) Labels() string { - c.AddHeader(labelsHeader) - if c.c.Labels == nil { - return "" - } - - var joinLabels []string - for k, v := range c.c.Labels { - joinLabels = append(joinLabels, fmt.Sprintf("%s=%s", k, v)) - } - return strings.Join(joinLabels, ",") -} - -func (c *containerContext) Label(name string) string { - n := strings.Split(name, ".") - r := strings.NewReplacer("-", " ", "_", " ") - h := r.Replace(n[len(n)-1]) - - c.AddHeader(h) - - if c.c.Labels == nil { - return "" - } - return c.c.Labels[name] -} - -func (c *containerContext) Mounts() string { - c.AddHeader(mountsHeader) - - var name string - var mounts []string - for _, m := range c.c.Mounts { - if m.Name == "" { - name = m.Source - } else { - name = m.Name - } - if c.trunc { - name = stringutils.Ellipsis(name, 15) - } - mounts = append(mounts, name) - } - return strings.Join(mounts, ",") -} - -func (c *containerContext) LocalVolumes() string { - c.AddHeader(localVolumes) - - count := 0 - for _, m := range c.c.Mounts { - if m.Driver == "local" { - count++ - } - } - - return fmt.Sprintf("%d", count) -} - -func (c *containerContext) Networks() string { - c.AddHeader(networksHeader) - - if c.c.NetworkSettings == nil { - return "" - } - - networks := []string{} - for k := range c.c.NetworkSettings.Networks { - networks = append(networks, k) - } - - return strings.Join(networks, ",") -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/container_test.go b/vendor/github.com/docker/docker/cli/command/formatter/container_test.go deleted file mode 100644 index 16137897b..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/container_test.go +++ /dev/null @@ -1,398 +0,0 @@ -package formatter - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" - "testing" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestContainerPsContext(t *testing.T) { - containerID := stringid.GenerateRandomID() - unix := time.Now().Add(-65 * time.Second).Unix() - - var ctx containerContext - cases := []struct { - container types.Container - trunc bool - expValue string - expHeader string - call func() string - }{ - {types.Container{ID: containerID}, true, stringid.TruncateID(containerID), containerIDHeader, ctx.ID}, - {types.Container{ID: containerID}, false, containerID, containerIDHeader, ctx.ID}, - {types.Container{Names: []string{"/foobar_baz"}}, true, "foobar_baz", namesHeader, ctx.Names}, - {types.Container{Image: "ubuntu"}, true, "ubuntu", imageHeader, ctx.Image}, - {types.Container{Image: "verylongimagename"}, true, "verylongimagename", imageHeader, ctx.Image}, - {types.Container{Image: "verylongimagename"}, false, "verylongimagename", imageHeader, ctx.Image}, - {types.Container{ - Image: "a5a665ff33eced1e0803148700880edab4", - ImageID: "a5a665ff33eced1e0803148700880edab4269067ed77e27737a708d0d293fbf5", - }, - true, - "a5a665ff33ec", - imageHeader, - ctx.Image, - }, - {types.Container{ - Image: "a5a665ff33eced1e0803148700880edab4", - ImageID: "a5a665ff33eced1e0803148700880edab4269067ed77e27737a708d0d293fbf5", - }, - false, - "a5a665ff33eced1e0803148700880edab4", - imageHeader, - ctx.Image, - }, - {types.Container{Image: ""}, true, "", imageHeader, ctx.Image}, - {types.Container{Command: "sh -c 'ls -la'"}, true, `"sh -c 'ls -la'"`, commandHeader, ctx.Command}, - {types.Container{Created: unix}, true, time.Unix(unix, 0).String(), createdAtHeader, ctx.CreatedAt}, - {types.Container{Ports: []types.Port{{PrivatePort: 8080, PublicPort: 8080, Type: "tcp"}}}, true, "8080/tcp", portsHeader, ctx.Ports}, - {types.Container{Status: "RUNNING"}, true, "RUNNING", statusHeader, ctx.Status}, - {types.Container{SizeRw: 10}, true, "10 B", sizeHeader, ctx.Size}, - {types.Container{SizeRw: 10, SizeRootFs: 20}, true, "10 B (virtual 20 B)", sizeHeader, ctx.Size}, - {types.Container{}, true, "", labelsHeader, ctx.Labels}, - {types.Container{Labels: map[string]string{"cpu": "6", "storage": "ssd"}}, true, "cpu=6,storage=ssd", labelsHeader, ctx.Labels}, - {types.Container{Created: unix}, true, "About a minute", runningForHeader, ctx.RunningFor}, - {types.Container{ - Mounts: []types.MountPoint{ - { - Name: "this-is-a-long-volume-name-and-will-be-truncated-if-trunc-is-set", - Driver: "local", - Source: "/a/path", - }, - }, - }, true, "this-is-a-lo...", mountsHeader, ctx.Mounts}, - {types.Container{ - Mounts: []types.MountPoint{ - { - Driver: "local", - Source: "/a/path", - }, - }, - }, false, "/a/path", mountsHeader, ctx.Mounts}, - {types.Container{ - Mounts: []types.MountPoint{ - { - Name: "733908409c91817de8e92b0096373245f329f19a88e2c849f02460e9b3d1c203", - Driver: "local", - Source: "/a/path", - }, - }, - }, false, "733908409c91817de8e92b0096373245f329f19a88e2c849f02460e9b3d1c203", mountsHeader, ctx.Mounts}, - } - - for _, c := range cases { - ctx = containerContext{c: c.container, trunc: c.trunc} - v := c.call() - if strings.Contains(v, ",") { - compareMultipleValues(t, v, c.expValue) - } else if v != c.expValue { - t.Fatalf("Expected %s, was %s\n", c.expValue, v) - } - - h := ctx.FullHeader() - if h != c.expHeader { - t.Fatalf("Expected %s, was %s\n", c.expHeader, h) - } - } - - c1 := types.Container{Labels: map[string]string{"com.docker.swarm.swarm-id": "33", "com.docker.swarm.node_name": "ubuntu"}} - ctx = containerContext{c: c1, trunc: true} - - sid := ctx.Label("com.docker.swarm.swarm-id") - node := ctx.Label("com.docker.swarm.node_name") - if sid != "33" { - t.Fatalf("Expected 33, was %s\n", sid) - } - - if node != "ubuntu" { - t.Fatalf("Expected ubuntu, was %s\n", node) - } - - h := ctx.FullHeader() - if h != "SWARM ID\tNODE NAME" { - t.Fatalf("Expected %s, was %s\n", "SWARM ID\tNODE NAME", h) - - } - - c2 := types.Container{} - ctx = containerContext{c: c2, trunc: true} - - label := ctx.Label("anything.really") - if label != "" { - t.Fatalf("Expected an empty string, was %s", label) - } - - ctx = containerContext{c: c2, trunc: true} - FullHeader := ctx.FullHeader() - if FullHeader != "" { - t.Fatalf("Expected FullHeader to be empty, was %s", FullHeader) - } - -} - -func TestContainerContextWrite(t *testing.T) { - unixTime := time.Now().AddDate(0, 0, -1).Unix() - expectedTime := time.Unix(unixTime, 0).String() - - cases := []struct { - context Context - expected string - }{ - // Errors - { - Context{Format: "{{InvalidFunction}}"}, - `Template parsing error: template: :1: function "InvalidFunction" not defined -`, - }, - { - Context{Format: "{{nil}}"}, - `Template parsing error: template: :1:2: executing "" at : nil is not a command -`, - }, - // Table Format - { - Context{Format: NewContainerFormat("table", false, true)}, - `CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE -containerID1 ubuntu "" 24 hours ago foobar_baz 0 B -containerID2 ubuntu "" 24 hours ago foobar_bar 0 B -`, - }, - { - Context{Format: NewContainerFormat("table", false, false)}, - `CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -containerID1 ubuntu "" 24 hours ago foobar_baz -containerID2 ubuntu "" 24 hours ago foobar_bar -`, - }, - { - Context{Format: NewContainerFormat("table {{.Image}}", false, false)}, - "IMAGE\nubuntu\nubuntu\n", - }, - { - Context{Format: NewContainerFormat("table {{.Image}}", false, true)}, - "IMAGE\nubuntu\nubuntu\n", - }, - { - Context{Format: NewContainerFormat("table {{.Image}}", true, false)}, - "IMAGE\nubuntu\nubuntu\n", - }, - { - Context{Format: NewContainerFormat("table", true, false)}, - "containerID1\ncontainerID2\n", - }, - // Raw Format - { - Context{Format: NewContainerFormat("raw", false, false)}, - fmt.Sprintf(`container_id: containerID1 -image: ubuntu -command: "" -created_at: %s -status: -names: foobar_baz -labels: -ports: - -container_id: containerID2 -image: ubuntu -command: "" -created_at: %s -status: -names: foobar_bar -labels: -ports: - -`, expectedTime, expectedTime), - }, - { - Context{Format: NewContainerFormat("raw", false, true)}, - fmt.Sprintf(`container_id: containerID1 -image: ubuntu -command: "" -created_at: %s -status: -names: foobar_baz -labels: -ports: -size: 0 B - -container_id: containerID2 -image: ubuntu -command: "" -created_at: %s -status: -names: foobar_bar -labels: -ports: -size: 0 B - -`, expectedTime, expectedTime), - }, - { - Context{Format: NewContainerFormat("raw", true, false)}, - "container_id: containerID1\ncontainer_id: containerID2\n", - }, - // Custom Format - { - Context{Format: "{{.Image}}"}, - "ubuntu\nubuntu\n", - }, - { - Context{Format: NewContainerFormat("{{.Image}}", false, true)}, - "ubuntu\nubuntu\n", - }, - } - - for _, testcase := range cases { - containers := []types.Container{ - {ID: "containerID1", Names: []string{"/foobar_baz"}, Image: "ubuntu", Created: unixTime}, - {ID: "containerID2", Names: []string{"/foobar_bar"}, Image: "ubuntu", Created: unixTime}, - } - out := bytes.NewBufferString("") - testcase.context.Output = out - err := ContainerWrite(testcase.context, containers) - if err != nil { - assert.Error(t, err, testcase.expected) - } else { - assert.Equal(t, out.String(), testcase.expected) - } - } -} - -func TestContainerContextWriteWithNoContainers(t *testing.T) { - out := bytes.NewBufferString("") - containers := []types.Container{} - - contexts := []struct { - context Context - expected string - }{ - { - Context{ - Format: "{{.Image}}", - Output: out, - }, - "", - }, - { - Context{ - Format: "table {{.Image}}", - Output: out, - }, - "IMAGE\n", - }, - { - Context{ - Format: NewContainerFormat("{{.Image}}", false, true), - Output: out, - }, - "", - }, - { - Context{ - Format: NewContainerFormat("table {{.Image}}", false, true), - Output: out, - }, - "IMAGE\n", - }, - { - Context{ - Format: "table {{.Image}}\t{{.Size}}", - Output: out, - }, - "IMAGE SIZE\n", - }, - { - Context{ - Format: NewContainerFormat("table {{.Image}}\t{{.Size}}", false, true), - Output: out, - }, - "IMAGE SIZE\n", - }, - } - - for _, context := range contexts { - ContainerWrite(context.context, containers) - assert.Equal(t, context.expected, out.String()) - // Clean buffer - out.Reset() - } -} - -func TestContainerContextWriteJSON(t *testing.T) { - unix := time.Now().Add(-65 * time.Second).Unix() - containers := []types.Container{ - {ID: "containerID1", Names: []string{"/foobar_baz"}, Image: "ubuntu", Created: unix}, - {ID: "containerID2", Names: []string{"/foobar_bar"}, Image: "ubuntu", Created: unix}, - } - expectedCreated := time.Unix(unix, 0).String() - expectedJSONs := []map[string]interface{}{ - {"Command": "\"\"", "CreatedAt": expectedCreated, "ID": "containerID1", "Image": "ubuntu", "Labels": "", "LocalVolumes": "0", "Mounts": "", "Names": "foobar_baz", "Networks": "", "Ports": "", "RunningFor": "About a minute", "Size": "0 B", "Status": ""}, - {"Command": "\"\"", "CreatedAt": expectedCreated, "ID": "containerID2", "Image": "ubuntu", "Labels": "", "LocalVolumes": "0", "Mounts": "", "Names": "foobar_bar", "Networks": "", "Ports": "", "RunningFor": "About a minute", "Size": "0 B", "Status": ""}, - } - out := bytes.NewBufferString("") - err := ContainerWrite(Context{Format: "{{json .}}", Output: out}, containers) - if err != nil { - t.Fatal(err) - } - for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") { - t.Logf("Output: line %d: %s", i, line) - var m map[string]interface{} - if err := json.Unmarshal([]byte(line), &m); err != nil { - t.Fatal(err) - } - assert.DeepEqual(t, m, expectedJSONs[i]) - } -} - -func TestContainerContextWriteJSONField(t *testing.T) { - containers := []types.Container{ - {ID: "containerID1", Names: []string{"/foobar_baz"}, Image: "ubuntu"}, - {ID: "containerID2", Names: []string{"/foobar_bar"}, Image: "ubuntu"}, - } - out := bytes.NewBufferString("") - err := ContainerWrite(Context{Format: "{{json .ID}}", Output: out}, containers) - if err != nil { - t.Fatal(err) - } - for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") { - t.Logf("Output: line %d: %s", i, line) - var s string - if err := json.Unmarshal([]byte(line), &s); err != nil { - t.Fatal(err) - } - assert.Equal(t, s, containers[i].ID) - } -} - -func TestContainerBackCompat(t *testing.T) { - containers := []types.Container{{ID: "brewhaha"}} - cases := []string{ - "ID", - "Names", - "Image", - "Command", - "CreatedAt", - "RunningFor", - "Ports", - "Status", - "Size", - "Labels", - "Mounts", - } - buf := bytes.NewBuffer(nil) - for _, c := range cases { - ctx := Context{Format: Format(fmt.Sprintf("{{ .%s }}", c)), Output: buf} - if err := ContainerWrite(ctx, containers); err != nil { - t.Logf("could not render template for field '%s': %v", c, err) - t.Fail() - } - buf.Reset() - } -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/custom.go b/vendor/github.com/docker/docker/cli/command/formatter/custom.go deleted file mode 100644 index df3268442..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/custom.go +++ /dev/null @@ -1,51 +0,0 @@ -package formatter - -import ( - "strings" -) - -const ( - imageHeader = "IMAGE" - createdSinceHeader = "CREATED" - createdAtHeader = "CREATED AT" - sizeHeader = "SIZE" - labelsHeader = "LABELS" - nameHeader = "NAME" - driverHeader = "DRIVER" - scopeHeader = "SCOPE" -) - -type subContext interface { - FullHeader() string - AddHeader(header string) -} - -// HeaderContext provides the subContext interface for managing headers -type HeaderContext struct { - header []string -} - -// FullHeader returns the header as a string -func (c *HeaderContext) FullHeader() string { - if c.header == nil { - return "" - } - return strings.Join(c.header, "\t") -} - -// AddHeader adds another column to the header -func (c *HeaderContext) AddHeader(header string) { - if c.header == nil { - c.header = []string{} - } - c.header = append(c.header, strings.ToUpper(header)) -} - -func stripNamePrefix(ss []string) []string { - sss := make([]string, len(ss)) - for i, s := range ss { - sss[i] = s[1:] - } - - return sss -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/custom_test.go b/vendor/github.com/docker/docker/cli/command/formatter/custom_test.go deleted file mode 100644 index da42039dc..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/custom_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package formatter - -import ( - "reflect" - "strings" - "testing" -) - -func compareMultipleValues(t *testing.T, value, expected string) { - // comma-separated values means probably a map input, which won't - // be guaranteed to have the same order as our expected value - // We'll create maps and use reflect.DeepEquals to check instead: - entriesMap := make(map[string]string) - expMap := make(map[string]string) - entries := strings.Split(value, ",") - expectedEntries := strings.Split(expected, ",") - for _, entry := range entries { - keyval := strings.Split(entry, "=") - entriesMap[keyval[0]] = keyval[1] - } - for _, expected := range expectedEntries { - keyval := strings.Split(expected, "=") - expMap[keyval[0]] = keyval[1] - } - if !reflect.DeepEqual(expMap, entriesMap) { - t.Fatalf("Expected entries: %v, got: %v", expected, value) - } -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/disk_usage.go b/vendor/github.com/docker/docker/cli/command/formatter/disk_usage.go deleted file mode 100644 index 5309d880a..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/disk_usage.go +++ /dev/null @@ -1,334 +0,0 @@ -package formatter - -import ( - "bytes" - "fmt" - "strings" - "text/template" - - "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" - units "github.com/docker/go-units" -) - -const ( - defaultDiskUsageImageTableFormat = "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedSince}} ago\t{{.VirtualSize}}\t{{.SharedSize}}\t{{.UniqueSize}}\t{{.Containers}}" - defaultDiskUsageContainerTableFormat = "table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.LocalVolumes}}\t{{.Size}}\t{{.RunningFor}} ago\t{{.Status}}\t{{.Names}}" - defaultDiskUsageVolumeTableFormat = "table {{.Name}}\t{{.Links}}\t{{.Size}}" - defaultDiskUsageTableFormat = "table {{.Type}}\t{{.TotalCount}}\t{{.Active}}\t{{.Size}}\t{{.Reclaimable}}" - - typeHeader = "TYPE" - totalHeader = "TOTAL" - activeHeader = "ACTIVE" - reclaimableHeader = "RECLAIMABLE" - containersHeader = "CONTAINERS" - sharedSizeHeader = "SHARED SIZE" - uniqueSizeHeader = "UNIQUE SiZE" -) - -// DiskUsageContext contains disk usage specific information required by the formater, encapsulate a Context struct. -type DiskUsageContext struct { - Context - Verbose bool - LayersSize int64 - Images []*types.ImageSummary - Containers []*types.Container - Volumes []*types.Volume -} - -func (ctx *DiskUsageContext) startSubsection(format string) (*template.Template, error) { - ctx.buffer = bytes.NewBufferString("") - ctx.header = "" - ctx.Format = Format(format) - ctx.preFormat() - - return ctx.parseFormat() -} - -func (ctx *DiskUsageContext) Write() { - if ctx.Verbose == false { - ctx.buffer = bytes.NewBufferString("") - ctx.Format = defaultDiskUsageTableFormat - ctx.preFormat() - - tmpl, err := ctx.parseFormat() - if err != nil { - return - } - - err = ctx.contextFormat(tmpl, &diskUsageImagesContext{ - totalSize: ctx.LayersSize, - images: ctx.Images, - }) - if err != nil { - return - } - err = ctx.contextFormat(tmpl, &diskUsageContainersContext{ - containers: ctx.Containers, - }) - if err != nil { - return - } - - err = ctx.contextFormat(tmpl, &diskUsageVolumesContext{ - volumes: ctx.Volumes, - }) - if err != nil { - return - } - - ctx.postFormat(tmpl, &diskUsageContainersContext{containers: []*types.Container{}}) - - return - } - - // First images - tmpl, err := ctx.startSubsection(defaultDiskUsageImageTableFormat) - if err != nil { - return - } - - ctx.Output.Write([]byte("Images space usage:\n\n")) - for _, i := range ctx.Images { - repo := "" - tag := "" - if len(i.RepoTags) > 0 && !isDangling(*i) { - // Only show the first tag - ref, err := reference.ParseNamed(i.RepoTags[0]) - if err != nil { - continue - } - if nt, ok := ref.(reference.NamedTagged); ok { - repo = ref.Name() - tag = nt.Tag() - } - } - - err = ctx.contextFormat(tmpl, &imageContext{ - repo: repo, - tag: tag, - trunc: true, - i: *i, - }) - if err != nil { - return - } - } - ctx.postFormat(tmpl, &imageContext{}) - - // Now containers - ctx.Output.Write([]byte("\nContainers space usage:\n\n")) - tmpl, err = ctx.startSubsection(defaultDiskUsageContainerTableFormat) - if err != nil { - return - } - for _, c := range ctx.Containers { - // Don't display the virtual size - c.SizeRootFs = 0 - err = ctx.contextFormat(tmpl, &containerContext{ - trunc: true, - c: *c, - }) - if err != nil { - return - } - } - ctx.postFormat(tmpl, &containerContext{}) - - // And volumes - ctx.Output.Write([]byte("\nLocal Volumes space usage:\n\n")) - tmpl, err = ctx.startSubsection(defaultDiskUsageVolumeTableFormat) - if err != nil { - return - } - for _, v := range ctx.Volumes { - err = ctx.contextFormat(tmpl, &volumeContext{ - v: *v, - }) - if err != nil { - return - } - } - ctx.postFormat(tmpl, &volumeContext{v: types.Volume{}}) -} - -type diskUsageImagesContext struct { - HeaderContext - totalSize int64 - images []*types.ImageSummary -} - -func (c *diskUsageImagesContext) Type() string { - c.AddHeader(typeHeader) - return "Images" -} - -func (c *diskUsageImagesContext) TotalCount() string { - c.AddHeader(totalHeader) - return fmt.Sprintf("%d", len(c.images)) -} - -func (c *diskUsageImagesContext) Active() string { - c.AddHeader(activeHeader) - used := 0 - for _, i := range c.images { - if i.Containers > 0 { - used++ - } - } - - return fmt.Sprintf("%d", used) -} - -func (c *diskUsageImagesContext) Size() string { - c.AddHeader(sizeHeader) - return units.HumanSize(float64(c.totalSize)) - -} - -func (c *diskUsageImagesContext) Reclaimable() string { - var used int64 - - c.AddHeader(reclaimableHeader) - for _, i := range c.images { - if i.Containers != 0 { - if i.VirtualSize == -1 || i.SharedSize == -1 { - continue - } - used += i.VirtualSize - i.SharedSize - } - } - - reclaimable := c.totalSize - used - if c.totalSize > 0 { - return fmt.Sprintf("%s (%v%%)", units.HumanSize(float64(reclaimable)), (reclaimable*100)/c.totalSize) - } - return fmt.Sprintf("%s", units.HumanSize(float64(reclaimable))) -} - -type diskUsageContainersContext struct { - HeaderContext - verbose bool - containers []*types.Container -} - -func (c *diskUsageContainersContext) Type() string { - c.AddHeader(typeHeader) - return "Containers" -} - -func (c *diskUsageContainersContext) TotalCount() string { - c.AddHeader(totalHeader) - return fmt.Sprintf("%d", len(c.containers)) -} - -func (c *diskUsageContainersContext) isActive(container types.Container) bool { - return strings.Contains(container.State, "running") || - strings.Contains(container.State, "paused") || - strings.Contains(container.State, "restarting") -} - -func (c *diskUsageContainersContext) Active() string { - c.AddHeader(activeHeader) - used := 0 - for _, container := range c.containers { - if c.isActive(*container) { - used++ - } - } - - return fmt.Sprintf("%d", used) -} - -func (c *diskUsageContainersContext) Size() string { - var size int64 - - c.AddHeader(sizeHeader) - for _, container := range c.containers { - size += container.SizeRw - } - - return units.HumanSize(float64(size)) -} - -func (c *diskUsageContainersContext) Reclaimable() string { - var reclaimable int64 - var totalSize int64 - - c.AddHeader(reclaimableHeader) - for _, container := range c.containers { - if !c.isActive(*container) { - reclaimable += container.SizeRw - } - totalSize += container.SizeRw - } - - if totalSize > 0 { - return fmt.Sprintf("%s (%v%%)", units.HumanSize(float64(reclaimable)), (reclaimable*100)/totalSize) - } - - return fmt.Sprintf("%s", units.HumanSize(float64(reclaimable))) -} - -type diskUsageVolumesContext struct { - HeaderContext - verbose bool - volumes []*types.Volume -} - -func (c *diskUsageVolumesContext) Type() string { - c.AddHeader(typeHeader) - return "Local Volumes" -} - -func (c *diskUsageVolumesContext) TotalCount() string { - c.AddHeader(totalHeader) - return fmt.Sprintf("%d", len(c.volumes)) -} - -func (c *diskUsageVolumesContext) Active() string { - c.AddHeader(activeHeader) - - used := 0 - for _, v := range c.volumes { - if v.UsageData.RefCount > 0 { - used++ - } - } - - return fmt.Sprintf("%d", used) -} - -func (c *diskUsageVolumesContext) Size() string { - var size int64 - - c.AddHeader(sizeHeader) - for _, v := range c.volumes { - if v.UsageData.Size != -1 { - size += v.UsageData.Size - } - } - - return units.HumanSize(float64(size)) -} - -func (c *diskUsageVolumesContext) Reclaimable() string { - var reclaimable int64 - var totalSize int64 - - c.AddHeader(reclaimableHeader) - for _, v := range c.volumes { - if v.UsageData.Size != -1 { - if v.UsageData.RefCount == 0 { - reclaimable += v.UsageData.Size - } - totalSize += v.UsageData.Size - } - } - - if totalSize > 0 { - return fmt.Sprintf("%s (%v%%)", units.HumanSize(float64(reclaimable)), (reclaimable*100)/totalSize) - } - - return fmt.Sprintf("%s", units.HumanSize(float64(reclaimable))) -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/formatter.go b/vendor/github.com/docker/docker/cli/command/formatter/formatter.go deleted file mode 100644 index e859a1ca2..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/formatter.go +++ /dev/null @@ -1,123 +0,0 @@ -package formatter - -import ( - "bytes" - "fmt" - "io" - "strings" - "text/tabwriter" - "text/template" - - "github.com/docker/docker/utils/templates" -) - -// Format keys used to specify certain kinds of output formats -const ( - TableFormatKey = "table" - RawFormatKey = "raw" - PrettyFormatKey = "pretty" - - defaultQuietFormat = "{{.ID}}" -) - -// Format is the format string rendered using the Context -type Format string - -// IsTable returns true if the format is a table-type format -func (f Format) IsTable() bool { - return strings.HasPrefix(string(f), TableFormatKey) -} - -// Contains returns true if the format contains the substring -func (f Format) Contains(sub string) bool { - return strings.Contains(string(f), sub) -} - -// Context contains information required by the formatter to print the output as desired. -type Context struct { - // Output is the output stream to which the formatted string is written. - Output io.Writer - // Format is used to choose raw, table or custom format for the output. - Format Format - // Trunc when set to true will truncate the output of certain fields such as Container ID. - Trunc bool - - // internal element - finalFormat string - header string - buffer *bytes.Buffer -} - -func (c *Context) preFormat() { - c.finalFormat = string(c.Format) - - // TODO: handle this in the Format type - if c.Format.IsTable() { - c.finalFormat = c.finalFormat[len(TableFormatKey):] - } - - c.finalFormat = strings.Trim(c.finalFormat, " ") - r := strings.NewReplacer(`\t`, "\t", `\n`, "\n") - c.finalFormat = r.Replace(c.finalFormat) -} - -func (c *Context) parseFormat() (*template.Template, error) { - tmpl, err := templates.Parse(c.finalFormat) - if err != nil { - return tmpl, fmt.Errorf("Template parsing error: %v\n", err) - } - return tmpl, err -} - -func (c *Context) postFormat(tmpl *template.Template, subContext subContext) { - if c.Format.IsTable() { - if len(c.header) == 0 { - // if we still don't have a header, we didn't have any containers so we need to fake it to get the right headers from the template - tmpl.Execute(bytes.NewBufferString(""), subContext) - c.header = subContext.FullHeader() - } - - t := tabwriter.NewWriter(c.Output, 20, 1, 3, ' ', 0) - t.Write([]byte(c.header)) - t.Write([]byte("\n")) - c.buffer.WriteTo(t) - t.Flush() - } else { - c.buffer.WriteTo(c.Output) - } -} - -func (c *Context) contextFormat(tmpl *template.Template, subContext subContext) error { - if err := tmpl.Execute(c.buffer, subContext); err != nil { - return fmt.Errorf("Template parsing error: %v\n", err) - } - if c.Format.IsTable() && len(c.header) == 0 { - c.header = subContext.FullHeader() - } - c.buffer.WriteString("\n") - return nil -} - -// SubFormat is a function type accepted by Write() -type SubFormat func(func(subContext) error) error - -// Write the template to the buffer using this Context -func (c *Context) Write(sub subContext, f SubFormat) error { - c.buffer = bytes.NewBufferString("") - c.preFormat() - - tmpl, err := c.parseFormat() - if err != nil { - return err - } - - subFormat := func(subContext subContext) error { - return c.contextFormat(tmpl, subContext) - } - if err := f(subFormat); err != nil { - return err - } - - c.postFormat(tmpl, sub) - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/image.go b/vendor/github.com/docker/docker/cli/command/formatter/image.go deleted file mode 100644 index 5c7de826f..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/image.go +++ /dev/null @@ -1,259 +0,0 @@ -package formatter - -import ( - "fmt" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/reference" - units "github.com/docker/go-units" -) - -const ( - defaultImageTableFormat = "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedSince}} ago\t{{.Size}}" - defaultImageTableFormatWithDigest = "table {{.Repository}}\t{{.Tag}}\t{{.Digest}}\t{{.ID}}\t{{.CreatedSince}} ago\t{{.Size}}" - - imageIDHeader = "IMAGE ID" - repositoryHeader = "REPOSITORY" - tagHeader = "TAG" - digestHeader = "DIGEST" -) - -// ImageContext contains image specific information required by the formater, encapsulate a Context struct. -type ImageContext struct { - Context - Digest bool -} - -func isDangling(image types.ImageSummary) bool { - return len(image.RepoTags) == 1 && image.RepoTags[0] == ":" && len(image.RepoDigests) == 1 && image.RepoDigests[0] == "@" -} - -// NewImageFormat returns a format for rendering an ImageContext -func NewImageFormat(source string, quiet bool, digest bool) Format { - switch source { - case TableFormatKey: - switch { - case quiet: - return defaultQuietFormat - case digest: - return defaultImageTableFormatWithDigest - default: - return defaultImageTableFormat - } - case RawFormatKey: - switch { - case quiet: - return `image_id: {{.ID}}` - case digest: - return `repository: {{ .Repository }} -tag: {{.Tag}} -digest: {{.Digest}} -image_id: {{.ID}} -created_at: {{.CreatedAt}} -virtual_size: {{.Size}} -` - default: - return `repository: {{ .Repository }} -tag: {{.Tag}} -image_id: {{.ID}} -created_at: {{.CreatedAt}} -virtual_size: {{.Size}} -` - } - } - - format := Format(source) - if format.IsTable() && digest && !format.Contains("{{.Digest}}") { - format += "\t{{.Digest}}" - } - return format -} - -// ImageWrite writes the formatter images using the ImageContext -func ImageWrite(ctx ImageContext, images []types.ImageSummary) error { - render := func(format func(subContext subContext) error) error { - return imageFormat(ctx, images, format) - } - return ctx.Write(&imageContext{}, render) -} - -func imageFormat(ctx ImageContext, images []types.ImageSummary, format func(subContext subContext) error) error { - for _, image := range images { - images := []*imageContext{} - if isDangling(image) { - images = append(images, &imageContext{ - trunc: ctx.Trunc, - i: image, - repo: "", - tag: "", - digest: "", - }) - } else { - repoTags := map[string][]string{} - repoDigests := map[string][]string{} - - for _, refString := range append(image.RepoTags) { - ref, err := reference.ParseNamed(refString) - if err != nil { - continue - } - if nt, ok := ref.(reference.NamedTagged); ok { - repoTags[ref.Name()] = append(repoTags[ref.Name()], nt.Tag()) - } - } - for _, refString := range append(image.RepoDigests) { - ref, err := reference.ParseNamed(refString) - if err != nil { - continue - } - if c, ok := ref.(reference.Canonical); ok { - repoDigests[ref.Name()] = append(repoDigests[ref.Name()], c.Digest().String()) - } - } - - for repo, tags := range repoTags { - digests := repoDigests[repo] - - // Do not display digests as their own row - delete(repoDigests, repo) - - if !ctx.Digest { - // Ignore digest references, just show tag once - digests = nil - } - - for _, tag := range tags { - if len(digests) == 0 { - images = append(images, &imageContext{ - trunc: ctx.Trunc, - i: image, - repo: repo, - tag: tag, - digest: "", - }) - continue - } - // Display the digests for each tag - for _, dgst := range digests { - images = append(images, &imageContext{ - trunc: ctx.Trunc, - i: image, - repo: repo, - tag: tag, - digest: dgst, - }) - } - - } - } - - // Show rows for remaining digest only references - for repo, digests := range repoDigests { - // If digests are displayed, show row per digest - if ctx.Digest { - for _, dgst := range digests { - images = append(images, &imageContext{ - trunc: ctx.Trunc, - i: image, - repo: repo, - tag: "", - digest: dgst, - }) - } - } else { - images = append(images, &imageContext{ - trunc: ctx.Trunc, - i: image, - repo: repo, - tag: "", - }) - } - } - } - for _, imageCtx := range images { - if err := format(imageCtx); err != nil { - return err - } - } - } - return nil -} - -type imageContext struct { - HeaderContext - trunc bool - i types.ImageSummary - repo string - tag string - digest string -} - -func (c *imageContext) ID() string { - c.AddHeader(imageIDHeader) - if c.trunc { - return stringid.TruncateID(c.i.ID) - } - return c.i.ID -} - -func (c *imageContext) Repository() string { - c.AddHeader(repositoryHeader) - return c.repo -} - -func (c *imageContext) Tag() string { - c.AddHeader(tagHeader) - return c.tag -} - -func (c *imageContext) Digest() string { - c.AddHeader(digestHeader) - return c.digest -} - -func (c *imageContext) CreatedSince() string { - c.AddHeader(createdSinceHeader) - createdAt := time.Unix(int64(c.i.Created), 0) - return units.HumanDuration(time.Now().UTC().Sub(createdAt)) -} - -func (c *imageContext) CreatedAt() string { - c.AddHeader(createdAtHeader) - return time.Unix(int64(c.i.Created), 0).String() -} - -func (c *imageContext) Size() string { - c.AddHeader(sizeHeader) - return units.HumanSizeWithPrecision(float64(c.i.Size), 3) -} - -func (c *imageContext) Containers() string { - c.AddHeader(containersHeader) - if c.i.Containers == -1 { - return "N/A" - } - return fmt.Sprintf("%d", c.i.Containers) -} - -func (c *imageContext) VirtualSize() string { - c.AddHeader(sizeHeader) - return units.HumanSize(float64(c.i.VirtualSize)) -} - -func (c *imageContext) SharedSize() string { - c.AddHeader(sharedSizeHeader) - if c.i.SharedSize == -1 { - return "N/A" - } - return units.HumanSize(float64(c.i.SharedSize)) -} - -func (c *imageContext) UniqueSize() string { - c.AddHeader(uniqueSizeHeader) - if c.i.VirtualSize == -1 || c.i.SharedSize == -1 { - return "N/A" - } - return units.HumanSize(float64(c.i.VirtualSize - c.i.SharedSize)) -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/image_test.go b/vendor/github.com/docker/docker/cli/command/formatter/image_test.go deleted file mode 100644 index ffe77f667..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/image_test.go +++ /dev/null @@ -1,333 +0,0 @@ -package formatter - -import ( - "bytes" - "fmt" - "strings" - "testing" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestImageContext(t *testing.T) { - imageID := stringid.GenerateRandomID() - unix := time.Now().Unix() - - var ctx imageContext - cases := []struct { - imageCtx imageContext - expValue string - expHeader string - call func() string - }{ - {imageContext{ - i: types.ImageSummary{ID: imageID}, - trunc: true, - }, stringid.TruncateID(imageID), imageIDHeader, ctx.ID}, - {imageContext{ - i: types.ImageSummary{ID: imageID}, - trunc: false, - }, imageID, imageIDHeader, ctx.ID}, - {imageContext{ - i: types.ImageSummary{Size: 10, VirtualSize: 10}, - trunc: true, - }, "10 B", sizeHeader, ctx.Size}, - {imageContext{ - i: types.ImageSummary{Created: unix}, - trunc: true, - }, time.Unix(unix, 0).String(), createdAtHeader, ctx.CreatedAt}, - // FIXME - // {imageContext{ - // i: types.ImageSummary{Created: unix}, - // trunc: true, - // }, units.HumanDuration(time.Unix(unix, 0)), createdSinceHeader, ctx.CreatedSince}, - {imageContext{ - i: types.ImageSummary{}, - repo: "busybox", - }, "busybox", repositoryHeader, ctx.Repository}, - {imageContext{ - i: types.ImageSummary{}, - tag: "latest", - }, "latest", tagHeader, ctx.Tag}, - {imageContext{ - i: types.ImageSummary{}, - digest: "sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a", - }, "sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a", digestHeader, ctx.Digest}, - } - - for _, c := range cases { - ctx = c.imageCtx - v := c.call() - if strings.Contains(v, ",") { - compareMultipleValues(t, v, c.expValue) - } else if v != c.expValue { - t.Fatalf("Expected %s, was %s\n", c.expValue, v) - } - - h := ctx.FullHeader() - if h != c.expHeader { - t.Fatalf("Expected %s, was %s\n", c.expHeader, h) - } - } -} - -func TestImageContextWrite(t *testing.T) { - unixTime := time.Now().AddDate(0, 0, -1).Unix() - expectedTime := time.Unix(unixTime, 0).String() - - cases := []struct { - context ImageContext - expected string - }{ - // Errors - { - ImageContext{ - Context: Context{ - Format: "{{InvalidFunction}}", - }, - }, - `Template parsing error: template: :1: function "InvalidFunction" not defined -`, - }, - { - ImageContext{ - Context: Context{ - Format: "{{nil}}", - }, - }, - `Template parsing error: template: :1:2: executing "" at : nil is not a command -`, - }, - // Table Format - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("table", false, false), - }, - }, - `REPOSITORY TAG IMAGE ID CREATED SIZE -image tag1 imageID1 24 hours ago 0 B -image tag2 imageID2 24 hours ago 0 B - imageID3 24 hours ago 0 B -`, - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("table {{.Repository}}", false, false), - }, - }, - "REPOSITORY\nimage\nimage\n\n", - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("table {{.Repository}}", false, true), - }, - Digest: true, - }, - `REPOSITORY DIGEST -image sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf -image - -`, - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("table {{.Repository}}", true, false), - }, - }, - "REPOSITORY\nimage\nimage\n\n", - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("table", true, false), - }, - }, - "imageID1\nimageID2\nimageID3\n", - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("table", false, true), - }, - Digest: true, - }, - `REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE -image tag1 sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf imageID1 24 hours ago 0 B -image tag2 imageID2 24 hours ago 0 B - imageID3 24 hours ago 0 B -`, - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("table", true, true), - }, - Digest: true, - }, - "imageID1\nimageID2\nimageID3\n", - }, - // Raw Format - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("raw", false, false), - }, - }, - fmt.Sprintf(`repository: image -tag: tag1 -image_id: imageID1 -created_at: %s -virtual_size: 0 B - -repository: image -tag: tag2 -image_id: imageID2 -created_at: %s -virtual_size: 0 B - -repository: -tag: -image_id: imageID3 -created_at: %s -virtual_size: 0 B - -`, expectedTime, expectedTime, expectedTime), - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("raw", false, true), - }, - Digest: true, - }, - fmt.Sprintf(`repository: image -tag: tag1 -digest: sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf -image_id: imageID1 -created_at: %s -virtual_size: 0 B - -repository: image -tag: tag2 -digest: -image_id: imageID2 -created_at: %s -virtual_size: 0 B - -repository: -tag: -digest: -image_id: imageID3 -created_at: %s -virtual_size: 0 B - -`, expectedTime, expectedTime, expectedTime), - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("raw", true, false), - }, - }, - `image_id: imageID1 -image_id: imageID2 -image_id: imageID3 -`, - }, - // Custom Format - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("{{.Repository}}", false, false), - }, - }, - "image\nimage\n\n", - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("{{.Repository}}", false, true), - }, - Digest: true, - }, - "image\nimage\n\n", - }, - } - - for _, testcase := range cases { - images := []types.ImageSummary{ - {ID: "imageID1", RepoTags: []string{"image:tag1"}, RepoDigests: []string{"image@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"}, Created: unixTime}, - {ID: "imageID2", RepoTags: []string{"image:tag2"}, Created: unixTime}, - {ID: "imageID3", RepoTags: []string{":"}, RepoDigests: []string{"@"}, Created: unixTime}, - } - out := bytes.NewBufferString("") - testcase.context.Output = out - err := ImageWrite(testcase.context, images) - if err != nil { - assert.Error(t, err, testcase.expected) - } else { - assert.Equal(t, out.String(), testcase.expected) - } - } -} - -func TestImageContextWriteWithNoImage(t *testing.T) { - out := bytes.NewBufferString("") - images := []types.ImageSummary{} - - contexts := []struct { - context ImageContext - expected string - }{ - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("{{.Repository}}", false, false), - Output: out, - }, - }, - "", - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("table {{.Repository}}", false, false), - Output: out, - }, - }, - "REPOSITORY\n", - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("{{.Repository}}", false, true), - Output: out, - }, - }, - "", - }, - { - ImageContext{ - Context: Context{ - Format: NewImageFormat("table {{.Repository}}", false, true), - Output: out, - }, - }, - "REPOSITORY DIGEST\n", - }, - } - - for _, context := range contexts { - ImageWrite(context.context, images) - assert.Equal(t, out.String(), context.expected) - // Clean buffer - out.Reset() - } -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/network.go b/vendor/github.com/docker/docker/cli/command/formatter/network.go deleted file mode 100644 index 7fbad7d2a..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/network.go +++ /dev/null @@ -1,117 +0,0 @@ -package formatter - -import ( - "fmt" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/stringid" -) - -const ( - defaultNetworkTableFormat = "table {{.ID}}\t{{.Name}}\t{{.Driver}}\t{{.Scope}}" - - networkIDHeader = "NETWORK ID" - ipv6Header = "IPV6" - internalHeader = "INTERNAL" -) - -// NewNetworkFormat returns a Format for rendering using a network Context -func NewNetworkFormat(source string, quiet bool) Format { - switch source { - case TableFormatKey: - if quiet { - return defaultQuietFormat - } - return defaultNetworkTableFormat - case RawFormatKey: - if quiet { - return `network_id: {{.ID}}` - } - return `network_id: {{.ID}}\nname: {{.Name}}\ndriver: {{.Driver}}\nscope: {{.Scope}}\n` - } - return Format(source) -} - -// NetworkWrite writes the context -func NetworkWrite(ctx Context, networks []types.NetworkResource) error { - render := func(format func(subContext subContext) error) error { - for _, network := range networks { - networkCtx := &networkContext{trunc: ctx.Trunc, n: network} - if err := format(networkCtx); err != nil { - return err - } - } - return nil - } - return ctx.Write(&networkContext{}, render) -} - -type networkContext struct { - HeaderContext - trunc bool - n types.NetworkResource -} - -func (c *networkContext) MarshalJSON() ([]byte, error) { - return marshalJSON(c) -} - -func (c *networkContext) ID() string { - c.AddHeader(networkIDHeader) - if c.trunc { - return stringid.TruncateID(c.n.ID) - } - return c.n.ID -} - -func (c *networkContext) Name() string { - c.AddHeader(nameHeader) - return c.n.Name -} - -func (c *networkContext) Driver() string { - c.AddHeader(driverHeader) - return c.n.Driver -} - -func (c *networkContext) Scope() string { - c.AddHeader(scopeHeader) - return c.n.Scope -} - -func (c *networkContext) IPv6() string { - c.AddHeader(ipv6Header) - return fmt.Sprintf("%v", c.n.EnableIPv6) -} - -func (c *networkContext) Internal() string { - c.AddHeader(internalHeader) - return fmt.Sprintf("%v", c.n.Internal) -} - -func (c *networkContext) Labels() string { - c.AddHeader(labelsHeader) - if c.n.Labels == nil { - return "" - } - - var joinLabels []string - for k, v := range c.n.Labels { - joinLabels = append(joinLabels, fmt.Sprintf("%s=%s", k, v)) - } - return strings.Join(joinLabels, ",") -} - -func (c *networkContext) Label(name string) string { - n := strings.Split(name, ".") - r := strings.NewReplacer("-", " ", "_", " ") - h := r.Replace(n[len(n)-1]) - - c.AddHeader(h) - - if c.n.Labels == nil { - return "" - } - return c.n.Labels[name] -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/network_test.go b/vendor/github.com/docker/docker/cli/command/formatter/network_test.go deleted file mode 100644 index b40a534ee..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/network_test.go +++ /dev/null @@ -1,208 +0,0 @@ -package formatter - -import ( - "bytes" - "encoding/json" - "strings" - "testing" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestNetworkContext(t *testing.T) { - networkID := stringid.GenerateRandomID() - - var ctx networkContext - cases := []struct { - networkCtx networkContext - expValue string - expHeader string - call func() string - }{ - {networkContext{ - n: types.NetworkResource{ID: networkID}, - trunc: false, - }, networkID, networkIDHeader, ctx.ID}, - {networkContext{ - n: types.NetworkResource{ID: networkID}, - trunc: true, - }, stringid.TruncateID(networkID), networkIDHeader, ctx.ID}, - {networkContext{ - n: types.NetworkResource{Name: "network_name"}, - }, "network_name", nameHeader, ctx.Name}, - {networkContext{ - n: types.NetworkResource{Driver: "driver_name"}, - }, "driver_name", driverHeader, ctx.Driver}, - {networkContext{ - n: types.NetworkResource{EnableIPv6: true}, - }, "true", ipv6Header, ctx.IPv6}, - {networkContext{ - n: types.NetworkResource{EnableIPv6: false}, - }, "false", ipv6Header, ctx.IPv6}, - {networkContext{ - n: types.NetworkResource{Internal: true}, - }, "true", internalHeader, ctx.Internal}, - {networkContext{ - n: types.NetworkResource{Internal: false}, - }, "false", internalHeader, ctx.Internal}, - {networkContext{ - n: types.NetworkResource{}, - }, "", labelsHeader, ctx.Labels}, - {networkContext{ - n: types.NetworkResource{Labels: map[string]string{"label1": "value1", "label2": "value2"}}, - }, "label1=value1,label2=value2", labelsHeader, ctx.Labels}, - } - - for _, c := range cases { - ctx = c.networkCtx - v := c.call() - if strings.Contains(v, ",") { - compareMultipleValues(t, v, c.expValue) - } else if v != c.expValue { - t.Fatalf("Expected %s, was %s\n", c.expValue, v) - } - - h := ctx.FullHeader() - if h != c.expHeader { - t.Fatalf("Expected %s, was %s\n", c.expHeader, h) - } - } -} - -func TestNetworkContextWrite(t *testing.T) { - cases := []struct { - context Context - expected string - }{ - - // Errors - { - Context{Format: "{{InvalidFunction}}"}, - `Template parsing error: template: :1: function "InvalidFunction" not defined -`, - }, - { - Context{Format: "{{nil}}"}, - `Template parsing error: template: :1:2: executing "" at : nil is not a command -`, - }, - // Table format - { - Context{Format: NewNetworkFormat("table", false)}, - `NETWORK ID NAME DRIVER SCOPE -networkID1 foobar_baz foo local -networkID2 foobar_bar bar local -`, - }, - { - Context{Format: NewNetworkFormat("table", true)}, - `networkID1 -networkID2 -`, - }, - { - Context{Format: NewNetworkFormat("table {{.Name}}", false)}, - `NAME -foobar_baz -foobar_bar -`, - }, - { - Context{Format: NewNetworkFormat("table {{.Name}}", true)}, - `NAME -foobar_baz -foobar_bar -`, - }, - // Raw Format - { - Context{Format: NewNetworkFormat("raw", false)}, - `network_id: networkID1 -name: foobar_baz -driver: foo -scope: local - -network_id: networkID2 -name: foobar_bar -driver: bar -scope: local - -`, - }, - { - Context{Format: NewNetworkFormat("raw", true)}, - `network_id: networkID1 -network_id: networkID2 -`, - }, - // Custom Format - { - Context{Format: NewNetworkFormat("{{.Name}}", false)}, - `foobar_baz -foobar_bar -`, - }, - } - - for _, testcase := range cases { - networks := []types.NetworkResource{ - {ID: "networkID1", Name: "foobar_baz", Driver: "foo", Scope: "local"}, - {ID: "networkID2", Name: "foobar_bar", Driver: "bar", Scope: "local"}, - } - out := bytes.NewBufferString("") - testcase.context.Output = out - err := NetworkWrite(testcase.context, networks) - if err != nil { - assert.Error(t, err, testcase.expected) - } else { - assert.Equal(t, out.String(), testcase.expected) - } - } -} - -func TestNetworkContextWriteJSON(t *testing.T) { - networks := []types.NetworkResource{ - {ID: "networkID1", Name: "foobar_baz"}, - {ID: "networkID2", Name: "foobar_bar"}, - } - expectedJSONs := []map[string]interface{}{ - {"Driver": "", "ID": "networkID1", "IPv6": "false", "Internal": "false", "Labels": "", "Name": "foobar_baz", "Scope": ""}, - {"Driver": "", "ID": "networkID2", "IPv6": "false", "Internal": "false", "Labels": "", "Name": "foobar_bar", "Scope": ""}, - } - - out := bytes.NewBufferString("") - err := NetworkWrite(Context{Format: "{{json .}}", Output: out}, networks) - if err != nil { - t.Fatal(err) - } - for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") { - t.Logf("Output: line %d: %s", i, line) - var m map[string]interface{} - if err := json.Unmarshal([]byte(line), &m); err != nil { - t.Fatal(err) - } - assert.DeepEqual(t, m, expectedJSONs[i]) - } -} - -func TestNetworkContextWriteJSONField(t *testing.T) { - networks := []types.NetworkResource{ - {ID: "networkID1", Name: "foobar_baz"}, - {ID: "networkID2", Name: "foobar_bar"}, - } - out := bytes.NewBufferString("") - err := NetworkWrite(Context{Format: "{{json .ID}}", Output: out}, networks) - if err != nil { - t.Fatal(err) - } - for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") { - t.Logf("Output: line %d: %s", i, line) - var s string - if err := json.Unmarshal([]byte(line), &s); err != nil { - t.Fatal(err) - } - assert.Equal(t, s, networks[i].ID) - } -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/reflect.go b/vendor/github.com/docker/docker/cli/command/formatter/reflect.go deleted file mode 100644 index d1d8737d2..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/reflect.go +++ /dev/null @@ -1,65 +0,0 @@ -package formatter - -import ( - "encoding/json" - "fmt" - "reflect" - "unicode" -) - -func marshalJSON(x interface{}) ([]byte, error) { - m, err := marshalMap(x) - if err != nil { - return nil, err - } - return json.Marshal(m) -} - -// marshalMap marshals x to map[string]interface{} -func marshalMap(x interface{}) (map[string]interface{}, error) { - val := reflect.ValueOf(x) - if val.Kind() != reflect.Ptr { - return nil, fmt.Errorf("expected a pointer to a struct, got %v", val.Kind()) - } - if val.IsNil() { - return nil, fmt.Errorf("expxected a pointer to a struct, got nil pointer") - } - valElem := val.Elem() - if valElem.Kind() != reflect.Struct { - return nil, fmt.Errorf("expected a pointer to a struct, got a pointer to %v", valElem.Kind()) - } - typ := val.Type() - m := make(map[string]interface{}) - for i := 0; i < val.NumMethod(); i++ { - k, v, err := marshalForMethod(typ.Method(i), val.Method(i)) - if err != nil { - return nil, err - } - if k != "" { - m[k] = v - } - } - return m, nil -} - -var unmarshallableNames = map[string]struct{}{"FullHeader": {}} - -// marshalForMethod returns the map key and the map value for marshalling the method. -// It returns ("", nil, nil) for valid but non-marshallable parameter. (e.g. "unexportedFunc()") -func marshalForMethod(typ reflect.Method, val reflect.Value) (string, interface{}, error) { - if val.Kind() != reflect.Func { - return "", nil, fmt.Errorf("expected func, got %v", val.Kind()) - } - name, numIn, numOut := typ.Name, val.Type().NumIn(), val.Type().NumOut() - _, blackListed := unmarshallableNames[name] - // FIXME: In text/template, (numOut == 2) is marshallable, - // if the type of the second param is error. - marshallable := unicode.IsUpper(rune(name[0])) && !blackListed && - numIn == 0 && numOut == 1 - if !marshallable { - return "", nil, nil - } - result := val.Call(make([]reflect.Value, numIn)) - intf := result[0].Interface() - return name, intf, nil -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/reflect_test.go b/vendor/github.com/docker/docker/cli/command/formatter/reflect_test.go deleted file mode 100644 index e547b1841..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/reflect_test.go +++ /dev/null @@ -1,66 +0,0 @@ -package formatter - -import ( - "reflect" - "testing" -) - -type dummy struct { -} - -func (d *dummy) Func1() string { - return "Func1" -} - -func (d *dummy) func2() string { - return "func2(should not be marshalled)" -} - -func (d *dummy) Func3() (string, int) { - return "Func3(should not be marshalled)", -42 -} - -func (d *dummy) Func4() int { - return 4 -} - -type dummyType string - -func (d *dummy) Func5() dummyType { - return dummyType("Func5") -} - -func (d *dummy) FullHeader() string { - return "FullHeader(should not be marshalled)" -} - -var dummyExpected = map[string]interface{}{ - "Func1": "Func1", - "Func4": 4, - "Func5": dummyType("Func5"), -} - -func TestMarshalMap(t *testing.T) { - d := dummy{} - m, err := marshalMap(&d) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(dummyExpected, m) { - t.Fatalf("expected %+v, got %+v", - dummyExpected, m) - } -} - -func TestMarshalMapBad(t *testing.T) { - if _, err := marshalMap(nil); err == nil { - t.Fatal("expected an error (argument is nil)") - } - if _, err := marshalMap(dummy{}); err == nil { - t.Fatal("expected an error (argument is non-pointer)") - } - x := 42 - if _, err := marshalMap(&x); err == nil { - t.Fatal("expected an error (argument is a pointer to non-struct)") - } -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/service.go b/vendor/github.com/docker/docker/cli/command/formatter/service.go deleted file mode 100644 index aaa78386c..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/service.go +++ /dev/null @@ -1,322 +0,0 @@ -package formatter - -import ( - "fmt" - "strings" - "time" - - mounttypes "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli/command/inspect" - units "github.com/docker/go-units" -) - -const serviceInspectPrettyTemplate Format = ` -ID: {{.ID}} -Name: {{.Name}} -{{- if .Labels }} -Labels: -{{- range $k, $v := .Labels }} - {{ $k }}{{if $v }}={{ $v }}{{ end }} -{{- end }}{{ end }} -Service Mode: -{{- if .IsModeGlobal }} Global -{{- else if .IsModeReplicated }} Replicated -{{- if .ModeReplicatedReplicas }} - Replicas: {{ .ModeReplicatedReplicas }} -{{- end }}{{ end }} -{{- if .HasUpdateStatus }} -UpdateStatus: - State: {{ .UpdateStatusState }} - Started: {{ .UpdateStatusStarted }} -{{- if .UpdateIsCompleted }} - Completed: {{ .UpdateStatusCompleted }} -{{- end }} - Message: {{ .UpdateStatusMessage }} -{{- end }} -Placement: -{{- if .TaskPlacementConstraints -}} - Contraints: {{ .TaskPlacementConstraints }} -{{- end }} -{{- if .HasUpdateConfig }} -UpdateConfig: - Parallelism: {{ .UpdateParallelism }} -{{- if .HasUpdateDelay}} - Delay: {{ .UpdateDelay }} -{{- end }} - On failure: {{ .UpdateOnFailure }} -{{- if .HasUpdateMonitor}} - Monitoring Period: {{ .UpdateMonitor }} -{{- end }} - Max failure ratio: {{ .UpdateMaxFailureRatio }} -{{- end }} -ContainerSpec: - Image: {{ .ContainerImage }} -{{- if .ContainerArgs }} - Args: {{ range $arg := .ContainerArgs }}{{ $arg }} {{ end }} -{{- end -}} -{{- if .ContainerEnv }} - Env: {{ range $env := .ContainerEnv }}{{ $env }} {{ end }} -{{- end -}} -{{- if .ContainerWorkDir }} - Dir: {{ .ContainerWorkDir }} -{{- end -}} -{{- if .ContainerUser }} - User: {{ .ContainerUser }} -{{- end }} -{{- if .ContainerMounts }} -Mounts: -{{- end }} -{{- range $mount := .ContainerMounts }} - Target = {{ $mount.Target }} - Source = {{ $mount.Source }} - ReadOnly = {{ $mount.ReadOnly }} - Type = {{ $mount.Type }} -{{- end -}} -{{- if .HasResources }} -Resources: -{{- if .HasResourceReservations }} - Reservations: -{{- if gt .ResourceReservationNanoCPUs 0.0 }} - CPU: {{ .ResourceReservationNanoCPUs }} -{{- end }} -{{- if .ResourceReservationMemory }} - Memory: {{ .ResourceReservationMemory }} -{{- end }}{{ end }} -{{- if .HasResourceLimits }} - Limits: -{{- if gt .ResourceLimitsNanoCPUs 0.0 }} - CPU: {{ .ResourceLimitsNanoCPUs }} -{{- end }} -{{- if .ResourceLimitMemory }} - Memory: {{ .ResourceLimitMemory }} -{{- end }}{{ end }}{{ end }} -{{- if .Networks }} -Networks: -{{- range $network := .Networks }} {{ $network }}{{ end }} {{ end }} -Endpoint Mode: {{ .EndpointMode }} -{{- if .Ports }} -Ports: -{{- range $port := .Ports }} - PublishedPort {{ $port.PublishedPort }} - Protocol = {{ $port.Protocol }} - TargetPort = {{ $port.TargetPort }} -{{- end }} {{ end -}} -` - -// NewServiceFormat returns a Format for rendering using a Context -func NewServiceFormat(source string) Format { - switch source { - case PrettyFormatKey: - return serviceInspectPrettyTemplate - default: - return Format(strings.TrimPrefix(source, RawFormatKey)) - } -} - -// ServiceInspectWrite renders the context for a list of services -func ServiceInspectWrite(ctx Context, refs []string, getRef inspect.GetRefFunc) error { - if ctx.Format != serviceInspectPrettyTemplate { - return inspect.Inspect(ctx.Output, refs, string(ctx.Format), getRef) - } - render := func(format func(subContext subContext) error) error { - for _, ref := range refs { - serviceI, _, err := getRef(ref) - if err != nil { - return err - } - service, ok := serviceI.(swarm.Service) - if !ok { - return fmt.Errorf("got wrong object to inspect") - } - if err := format(&serviceInspectContext{Service: service}); err != nil { - return err - } - } - return nil - } - return ctx.Write(&serviceInspectContext{}, render) -} - -type serviceInspectContext struct { - swarm.Service - subContext -} - -func (ctx *serviceInspectContext) MarshalJSON() ([]byte, error) { - return marshalJSON(ctx) -} - -func (ctx *serviceInspectContext) ID() string { - return ctx.Service.ID -} - -func (ctx *serviceInspectContext) Name() string { - return ctx.Service.Spec.Name -} - -func (ctx *serviceInspectContext) Labels() map[string]string { - return ctx.Service.Spec.Labels -} - -func (ctx *serviceInspectContext) IsModeGlobal() bool { - return ctx.Service.Spec.Mode.Global != nil -} - -func (ctx *serviceInspectContext) IsModeReplicated() bool { - return ctx.Service.Spec.Mode.Replicated != nil -} - -func (ctx *serviceInspectContext) ModeReplicatedReplicas() *uint64 { - return ctx.Service.Spec.Mode.Replicated.Replicas -} - -func (ctx *serviceInspectContext) HasUpdateStatus() bool { - return ctx.Service.UpdateStatus.State != "" -} - -func (ctx *serviceInspectContext) UpdateStatusState() swarm.UpdateState { - return ctx.Service.UpdateStatus.State -} - -func (ctx *serviceInspectContext) UpdateStatusStarted() string { - return units.HumanDuration(time.Since(ctx.Service.UpdateStatus.StartedAt)) -} - -func (ctx *serviceInspectContext) UpdateIsCompleted() bool { - return ctx.Service.UpdateStatus.State == swarm.UpdateStateCompleted -} - -func (ctx *serviceInspectContext) UpdateStatusCompleted() string { - return units.HumanDuration(time.Since(ctx.Service.UpdateStatus.CompletedAt)) -} - -func (ctx *serviceInspectContext) UpdateStatusMessage() string { - return ctx.Service.UpdateStatus.Message -} - -func (ctx *serviceInspectContext) TaskPlacementConstraints() []string { - if ctx.Service.Spec.TaskTemplate.Placement != nil { - return ctx.Service.Spec.TaskTemplate.Placement.Constraints - } - return nil -} - -func (ctx *serviceInspectContext) HasUpdateConfig() bool { - return ctx.Service.Spec.UpdateConfig != nil -} - -func (ctx *serviceInspectContext) UpdateParallelism() uint64 { - return ctx.Service.Spec.UpdateConfig.Parallelism -} - -func (ctx *serviceInspectContext) HasUpdateDelay() bool { - return ctx.Service.Spec.UpdateConfig.Delay.Nanoseconds() > 0 -} - -func (ctx *serviceInspectContext) UpdateDelay() time.Duration { - return ctx.Service.Spec.UpdateConfig.Delay -} - -func (ctx *serviceInspectContext) UpdateOnFailure() string { - return ctx.Service.Spec.UpdateConfig.FailureAction -} - -func (ctx *serviceInspectContext) HasUpdateMonitor() bool { - return ctx.Service.Spec.UpdateConfig.Monitor.Nanoseconds() > 0 -} - -func (ctx *serviceInspectContext) UpdateMonitor() time.Duration { - return ctx.Service.Spec.UpdateConfig.Monitor -} - -func (ctx *serviceInspectContext) UpdateMaxFailureRatio() float32 { - return ctx.Service.Spec.UpdateConfig.MaxFailureRatio -} - -func (ctx *serviceInspectContext) ContainerImage() string { - return ctx.Service.Spec.TaskTemplate.ContainerSpec.Image -} - -func (ctx *serviceInspectContext) ContainerArgs() []string { - return ctx.Service.Spec.TaskTemplate.ContainerSpec.Args -} - -func (ctx *serviceInspectContext) ContainerEnv() []string { - return ctx.Service.Spec.TaskTemplate.ContainerSpec.Env -} - -func (ctx *serviceInspectContext) ContainerWorkDir() string { - return ctx.Service.Spec.TaskTemplate.ContainerSpec.Dir -} - -func (ctx *serviceInspectContext) ContainerUser() string { - return ctx.Service.Spec.TaskTemplate.ContainerSpec.User -} - -func (ctx *serviceInspectContext) ContainerMounts() []mounttypes.Mount { - return ctx.Service.Spec.TaskTemplate.ContainerSpec.Mounts -} - -func (ctx *serviceInspectContext) HasResources() bool { - return ctx.Service.Spec.TaskTemplate.Resources != nil -} - -func (ctx *serviceInspectContext) HasResourceReservations() bool { - if ctx.Service.Spec.TaskTemplate.Resources == nil || ctx.Service.Spec.TaskTemplate.Resources.Reservations == nil { - return false - } - return ctx.Service.Spec.TaskTemplate.Resources.Reservations.NanoCPUs > 0 || ctx.Service.Spec.TaskTemplate.Resources.Reservations.MemoryBytes > 0 -} - -func (ctx *serviceInspectContext) ResourceReservationNanoCPUs() float64 { - if ctx.Service.Spec.TaskTemplate.Resources.Reservations.NanoCPUs == 0 { - return float64(0) - } - return float64(ctx.Service.Spec.TaskTemplate.Resources.Reservations.NanoCPUs) / 1e9 -} - -func (ctx *serviceInspectContext) ResourceReservationMemory() string { - if ctx.Service.Spec.TaskTemplate.Resources.Reservations.MemoryBytes == 0 { - return "" - } - return units.BytesSize(float64(ctx.Service.Spec.TaskTemplate.Resources.Reservations.MemoryBytes)) -} - -func (ctx *serviceInspectContext) HasResourceLimits() bool { - if ctx.Service.Spec.TaskTemplate.Resources == nil || ctx.Service.Spec.TaskTemplate.Resources.Limits == nil { - return false - } - return ctx.Service.Spec.TaskTemplate.Resources.Limits.NanoCPUs > 0 || ctx.Service.Spec.TaskTemplate.Resources.Limits.MemoryBytes > 0 -} - -func (ctx *serviceInspectContext) ResourceLimitsNanoCPUs() float64 { - return float64(ctx.Service.Spec.TaskTemplate.Resources.Limits.NanoCPUs) / 1e9 -} - -func (ctx *serviceInspectContext) ResourceLimitMemory() string { - if ctx.Service.Spec.TaskTemplate.Resources.Limits.MemoryBytes == 0 { - return "" - } - return units.BytesSize(float64(ctx.Service.Spec.TaskTemplate.Resources.Limits.MemoryBytes)) -} - -func (ctx *serviceInspectContext) Networks() []string { - var out []string - for _, n := range ctx.Service.Spec.Networks { - out = append(out, n.Target) - } - return out -} - -func (ctx *serviceInspectContext) EndpointMode() string { - if ctx.Service.Spec.EndpointSpec == nil { - return "" - } - - return string(ctx.Service.Spec.EndpointSpec.Mode) -} - -func (ctx *serviceInspectContext) Ports() []swarm.PortConfig { - return ctx.Service.Endpoint.Ports -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/stats.go b/vendor/github.com/docker/docker/cli/command/formatter/stats.go deleted file mode 100644 index 7997f996d..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/stats.go +++ /dev/null @@ -1,211 +0,0 @@ -package formatter - -import ( - "fmt" - "sync" - - units "github.com/docker/go-units" -) - -const ( - winOSType = "windows" - defaultStatsTableFormat = "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}" - winDefaultStatsTableFormat = "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}" - - containerHeader = "CONTAINER" - cpuPercHeader = "CPU %" - netIOHeader = "NET I/O" - blockIOHeader = "BLOCK I/O" - memPercHeader = "MEM %" // Used only on Linux - winMemUseHeader = "PRIV WORKING SET" // Used only on Windows - memUseHeader = "MEM USAGE / LIMIT" // Used only on Linux - pidsHeader = "PIDS" // Used only on Linux -) - -// StatsEntry represents represents the statistics data collected from a container -type StatsEntry struct { - Container string - Name string - ID string - CPUPercentage float64 - Memory float64 // On Windows this is the private working set - MemoryLimit float64 // Not used on Windows - MemoryPercentage float64 // Not used on Windows - NetworkRx float64 - NetworkTx float64 - BlockRead float64 - BlockWrite float64 - PidsCurrent uint64 // Not used on Windows - IsInvalid bool - OSType string -} - -// ContainerStats represents an entity to store containers statistics synchronously -type ContainerStats struct { - mutex sync.Mutex - StatsEntry - err error -} - -// GetError returns the container statistics error. -// This is used to determine whether the statistics are valid or not -func (cs *ContainerStats) GetError() error { - cs.mutex.Lock() - defer cs.mutex.Unlock() - return cs.err -} - -// SetErrorAndReset zeroes all the container statistics and store the error. -// It is used when receiving time out error during statistics collecting to reduce lock overhead -func (cs *ContainerStats) SetErrorAndReset(err error) { - cs.mutex.Lock() - defer cs.mutex.Unlock() - cs.CPUPercentage = 0 - cs.Memory = 0 - cs.MemoryPercentage = 0 - cs.MemoryLimit = 0 - cs.NetworkRx = 0 - cs.NetworkTx = 0 - cs.BlockRead = 0 - cs.BlockWrite = 0 - cs.PidsCurrent = 0 - cs.err = err - cs.IsInvalid = true -} - -// SetError sets container statistics error -func (cs *ContainerStats) SetError(err error) { - cs.mutex.Lock() - defer cs.mutex.Unlock() - cs.err = err - if err != nil { - cs.IsInvalid = true - } -} - -// SetStatistics set the container statistics -func (cs *ContainerStats) SetStatistics(s StatsEntry) { - cs.mutex.Lock() - defer cs.mutex.Unlock() - s.Container = cs.Container - s.OSType = cs.OSType - cs.StatsEntry = s -} - -// GetStatistics returns container statistics with other meta data such as the container name -func (cs *ContainerStats) GetStatistics() StatsEntry { - cs.mutex.Lock() - defer cs.mutex.Unlock() - return cs.StatsEntry -} - -// NewStatsFormat returns a format for rendering an CStatsContext -func NewStatsFormat(source, osType string) Format { - if source == TableFormatKey { - if osType == winOSType { - return Format(winDefaultStatsTableFormat) - } - return Format(defaultStatsTableFormat) - } - return Format(source) -} - -// NewContainerStats returns a new ContainerStats entity and sets in it the given name -func NewContainerStats(container, osType string) *ContainerStats { - return &ContainerStats{ - StatsEntry: StatsEntry{Container: container, OSType: osType}, - } -} - -// ContainerStatsWrite renders the context for a list of containers statistics -func ContainerStatsWrite(ctx Context, containerStats []StatsEntry) error { - render := func(format func(subContext subContext) error) error { - for _, cstats := range containerStats { - containerStatsCtx := &containerStatsContext{ - s: cstats, - } - if err := format(containerStatsCtx); err != nil { - return err - } - } - return nil - } - return ctx.Write(&containerStatsContext{}, render) -} - -type containerStatsContext struct { - HeaderContext - s StatsEntry -} - -func (c *containerStatsContext) Container() string { - c.AddHeader(containerHeader) - return c.s.Container -} - -func (c *containerStatsContext) Name() string { - c.AddHeader(nameHeader) - name := c.s.Name[1:] - return name -} - -func (c *containerStatsContext) ID() string { - c.AddHeader(containerIDHeader) - return c.s.ID -} - -func (c *containerStatsContext) CPUPerc() string { - c.AddHeader(cpuPercHeader) - if c.s.IsInvalid { - return fmt.Sprintf("--") - } - return fmt.Sprintf("%.2f%%", c.s.CPUPercentage) -} - -func (c *containerStatsContext) MemUsage() string { - header := memUseHeader - if c.s.OSType == winOSType { - header = winMemUseHeader - } - c.AddHeader(header) - if c.s.IsInvalid { - return fmt.Sprintf("-- / --") - } - if c.s.OSType == winOSType { - return fmt.Sprintf("%s", units.BytesSize(c.s.Memory)) - } - return fmt.Sprintf("%s / %s", units.BytesSize(c.s.Memory), units.BytesSize(c.s.MemoryLimit)) -} - -func (c *containerStatsContext) MemPerc() string { - header := memPercHeader - c.AddHeader(header) - if c.s.IsInvalid || c.s.OSType == winOSType { - return fmt.Sprintf("--") - } - return fmt.Sprintf("%.2f%%", c.s.MemoryPercentage) -} - -func (c *containerStatsContext) NetIO() string { - c.AddHeader(netIOHeader) - if c.s.IsInvalid { - return fmt.Sprintf("--") - } - return fmt.Sprintf("%s / %s", units.HumanSizeWithPrecision(c.s.NetworkRx, 3), units.HumanSizeWithPrecision(c.s.NetworkTx, 3)) -} - -func (c *containerStatsContext) BlockIO() string { - c.AddHeader(blockIOHeader) - if c.s.IsInvalid { - return fmt.Sprintf("--") - } - return fmt.Sprintf("%s / %s", units.HumanSizeWithPrecision(c.s.BlockRead, 3), units.HumanSizeWithPrecision(c.s.BlockWrite, 3)) -} - -func (c *containerStatsContext) PIDs() string { - c.AddHeader(pidsHeader) - if c.s.IsInvalid || c.s.OSType == winOSType { - return fmt.Sprintf("--") - } - return fmt.Sprintf("%d", c.s.PidsCurrent) -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/stats_test.go b/vendor/github.com/docker/docker/cli/command/formatter/stats_test.go deleted file mode 100644 index d5a17cc70..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/stats_test.go +++ /dev/null @@ -1,228 +0,0 @@ -package formatter - -import ( - "bytes" - "testing" - - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestContainerStatsContext(t *testing.T) { - containerID := stringid.GenerateRandomID() - - var ctx containerStatsContext - tt := []struct { - stats StatsEntry - expValue string - expHeader string - call func() string - }{ - {StatsEntry{Container: containerID}, containerID, containerHeader, ctx.Container}, - {StatsEntry{CPUPercentage: 5.5}, "5.50%", cpuPercHeader, ctx.CPUPerc}, - {StatsEntry{CPUPercentage: 5.5, IsInvalid: true}, "--", cpuPercHeader, ctx.CPUPerc}, - {StatsEntry{NetworkRx: 0.31, NetworkTx: 12.3}, "0.31 B / 12.3 B", netIOHeader, ctx.NetIO}, - {StatsEntry{NetworkRx: 0.31, NetworkTx: 12.3, IsInvalid: true}, "--", netIOHeader, ctx.NetIO}, - {StatsEntry{BlockRead: 0.1, BlockWrite: 2.3}, "0.1 B / 2.3 B", blockIOHeader, ctx.BlockIO}, - {StatsEntry{BlockRead: 0.1, BlockWrite: 2.3, IsInvalid: true}, "--", blockIOHeader, ctx.BlockIO}, - {StatsEntry{MemoryPercentage: 10.2}, "10.20%", memPercHeader, ctx.MemPerc}, - {StatsEntry{MemoryPercentage: 10.2, IsInvalid: true}, "--", memPercHeader, ctx.MemPerc}, - {StatsEntry{MemoryPercentage: 10.2, OSType: "windows"}, "--", memPercHeader, ctx.MemPerc}, - {StatsEntry{Memory: 24, MemoryLimit: 30}, "24 B / 30 B", memUseHeader, ctx.MemUsage}, - {StatsEntry{Memory: 24, MemoryLimit: 30, IsInvalid: true}, "-- / --", memUseHeader, ctx.MemUsage}, - {StatsEntry{Memory: 24, MemoryLimit: 30, OSType: "windows"}, "24 B", winMemUseHeader, ctx.MemUsage}, - {StatsEntry{PidsCurrent: 10}, "10", pidsHeader, ctx.PIDs}, - {StatsEntry{PidsCurrent: 10, IsInvalid: true}, "--", pidsHeader, ctx.PIDs}, - {StatsEntry{PidsCurrent: 10, OSType: "windows"}, "--", pidsHeader, ctx.PIDs}, - } - - for _, te := range tt { - ctx = containerStatsContext{s: te.stats} - if v := te.call(); v != te.expValue { - t.Fatalf("Expected %q, got %q", te.expValue, v) - } - - h := ctx.FullHeader() - if h != te.expHeader { - t.Fatalf("Expected %q, got %q", te.expHeader, h) - } - } -} - -func TestContainerStatsContextWrite(t *testing.T) { - tt := []struct { - context Context - expected string - }{ - { - Context{Format: "{{InvalidFunction}}"}, - `Template parsing error: template: :1: function "InvalidFunction" not defined -`, - }, - { - Context{Format: "{{nil}}"}, - `Template parsing error: template: :1:2: executing "" at : nil is not a command -`, - }, - { - Context{Format: "table {{.MemUsage}}"}, - `MEM USAGE / LIMIT -20 B / 20 B --- / -- -`, - }, - { - Context{Format: "{{.Container}} {{.CPUPerc}}"}, - `container1 20.00% -container2 -- -`, - }, - } - - for _, te := range tt { - stats := []StatsEntry{ - { - Container: "container1", - CPUPercentage: 20, - Memory: 20, - MemoryLimit: 20, - MemoryPercentage: 20, - NetworkRx: 20, - NetworkTx: 20, - BlockRead: 20, - BlockWrite: 20, - PidsCurrent: 2, - IsInvalid: false, - OSType: "linux", - }, - { - Container: "container2", - CPUPercentage: 30, - Memory: 30, - MemoryLimit: 30, - MemoryPercentage: 30, - NetworkRx: 30, - NetworkTx: 30, - BlockRead: 30, - BlockWrite: 30, - PidsCurrent: 3, - IsInvalid: true, - OSType: "linux", - }, - } - var out bytes.Buffer - te.context.Output = &out - err := ContainerStatsWrite(te.context, stats) - if err != nil { - assert.Error(t, err, te.expected) - } else { - assert.Equal(t, out.String(), te.expected) - } - } -} - -func TestContainerStatsContextWriteWindows(t *testing.T) { - tt := []struct { - context Context - expected string - }{ - { - Context{Format: "table {{.MemUsage}}"}, - `PRIV WORKING SET -20 B --- / -- -`, - }, - { - Context{Format: "{{.Container}} {{.CPUPerc}}"}, - `container1 20.00% -container2 -- -`, - }, - { - Context{Format: "{{.Container}} {{.MemPerc}} {{.PIDs}}"}, - `container1 -- -- -container2 -- -- -`, - }, - } - - for _, te := range tt { - stats := []StatsEntry{ - { - Container: "container1", - CPUPercentage: 20, - Memory: 20, - MemoryLimit: 20, - MemoryPercentage: 20, - NetworkRx: 20, - NetworkTx: 20, - BlockRead: 20, - BlockWrite: 20, - PidsCurrent: 2, - IsInvalid: false, - OSType: "windows", - }, - { - Container: "container2", - CPUPercentage: 30, - Memory: 30, - MemoryLimit: 30, - MemoryPercentage: 30, - NetworkRx: 30, - NetworkTx: 30, - BlockRead: 30, - BlockWrite: 30, - PidsCurrent: 3, - IsInvalid: true, - OSType: "windows", - }, - } - var out bytes.Buffer - te.context.Output = &out - err := ContainerStatsWrite(te.context, stats) - if err != nil { - assert.Error(t, err, te.expected) - } else { - assert.Equal(t, out.String(), te.expected) - } - } -} - -func TestContainerStatsContextWriteWithNoStats(t *testing.T) { - var out bytes.Buffer - - contexts := []struct { - context Context - expected string - }{ - { - Context{ - Format: "{{.Container}}", - Output: &out, - }, - "", - }, - { - Context{ - Format: "table {{.Container}}", - Output: &out, - }, - "CONTAINER\n", - }, - { - Context{ - Format: "table {{.Container}}\t{{.CPUPerc}}", - Output: &out, - }, - "CONTAINER CPU %\n", - }, - } - - for _, context := range contexts { - ContainerStatsWrite(context.context, []StatsEntry{}) - assert.Equal(t, context.expected, out.String()) - // Clean buffer - out.Reset() - } -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/volume.go b/vendor/github.com/docker/docker/cli/command/formatter/volume.go deleted file mode 100644 index 90c9b1353..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/volume.go +++ /dev/null @@ -1,121 +0,0 @@ -package formatter - -import ( - "fmt" - "strings" - - "github.com/docker/docker/api/types" - units "github.com/docker/go-units" -) - -const ( - defaultVolumeQuietFormat = "{{.Name}}" - defaultVolumeTableFormat = "table {{.Driver}}\t{{.Name}}" - - volumeNameHeader = "VOLUME NAME" - mountpointHeader = "MOUNTPOINT" - linksHeader = "LINKS" - // Status header ? -) - -// NewVolumeFormat returns a format for use with a volume Context -func NewVolumeFormat(source string, quiet bool) Format { - switch source { - case TableFormatKey: - if quiet { - return defaultVolumeQuietFormat - } - return defaultVolumeTableFormat - case RawFormatKey: - if quiet { - return `name: {{.Name}}` - } - return `name: {{.Name}}\ndriver: {{.Driver}}\n` - } - return Format(source) -} - -// VolumeWrite writes formatted volumes using the Context -func VolumeWrite(ctx Context, volumes []*types.Volume) error { - render := func(format func(subContext subContext) error) error { - for _, volume := range volumes { - if err := format(&volumeContext{v: *volume}); err != nil { - return err - } - } - return nil - } - return ctx.Write(&volumeContext{}, render) -} - -type volumeContext struct { - HeaderContext - v types.Volume -} - -func (c *volumeContext) MarshalJSON() ([]byte, error) { - return marshalJSON(c) -} - -func (c *volumeContext) Name() string { - c.AddHeader(volumeNameHeader) - return c.v.Name -} - -func (c *volumeContext) Driver() string { - c.AddHeader(driverHeader) - return c.v.Driver -} - -func (c *volumeContext) Scope() string { - c.AddHeader(scopeHeader) - return c.v.Scope -} - -func (c *volumeContext) Mountpoint() string { - c.AddHeader(mountpointHeader) - return c.v.Mountpoint -} - -func (c *volumeContext) Labels() string { - c.AddHeader(labelsHeader) - if c.v.Labels == nil { - return "" - } - - var joinLabels []string - for k, v := range c.v.Labels { - joinLabels = append(joinLabels, fmt.Sprintf("%s=%s", k, v)) - } - return strings.Join(joinLabels, ",") -} - -func (c *volumeContext) Label(name string) string { - - n := strings.Split(name, ".") - r := strings.NewReplacer("-", " ", "_", " ") - h := r.Replace(n[len(n)-1]) - - c.AddHeader(h) - - if c.v.Labels == nil { - return "" - } - return c.v.Labels[name] -} - -func (c *volumeContext) Links() string { - c.AddHeader(linksHeader) - if c.v.UsageData == nil { - return "N/A" - } - return fmt.Sprintf("%d", c.v.UsageData.RefCount) -} - -func (c *volumeContext) Size() string { - c.AddHeader(sizeHeader) - if c.v.UsageData == nil { - return "N/A" - } - return units.HumanSize(float64(c.v.UsageData.Size)) -} diff --git a/vendor/github.com/docker/docker/cli/command/formatter/volume_test.go b/vendor/github.com/docker/docker/cli/command/formatter/volume_test.go deleted file mode 100644 index 9ec18b691..000000000 --- a/vendor/github.com/docker/docker/cli/command/formatter/volume_test.go +++ /dev/null @@ -1,189 +0,0 @@ -package formatter - -import ( - "bytes" - "encoding/json" - "strings" - "testing" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestVolumeContext(t *testing.T) { - volumeName := stringid.GenerateRandomID() - - var ctx volumeContext - cases := []struct { - volumeCtx volumeContext - expValue string - expHeader string - call func() string - }{ - {volumeContext{ - v: types.Volume{Name: volumeName}, - }, volumeName, volumeNameHeader, ctx.Name}, - {volumeContext{ - v: types.Volume{Driver: "driver_name"}, - }, "driver_name", driverHeader, ctx.Driver}, - {volumeContext{ - v: types.Volume{Scope: "local"}, - }, "local", scopeHeader, ctx.Scope}, - {volumeContext{ - v: types.Volume{Mountpoint: "mountpoint"}, - }, "mountpoint", mountpointHeader, ctx.Mountpoint}, - {volumeContext{ - v: types.Volume{}, - }, "", labelsHeader, ctx.Labels}, - {volumeContext{ - v: types.Volume{Labels: map[string]string{"label1": "value1", "label2": "value2"}}, - }, "label1=value1,label2=value2", labelsHeader, ctx.Labels}, - } - - for _, c := range cases { - ctx = c.volumeCtx - v := c.call() - if strings.Contains(v, ",") { - compareMultipleValues(t, v, c.expValue) - } else if v != c.expValue { - t.Fatalf("Expected %s, was %s\n", c.expValue, v) - } - - h := ctx.FullHeader() - if h != c.expHeader { - t.Fatalf("Expected %s, was %s\n", c.expHeader, h) - } - } -} - -func TestVolumeContextWrite(t *testing.T) { - cases := []struct { - context Context - expected string - }{ - - // Errors - { - Context{Format: "{{InvalidFunction}}"}, - `Template parsing error: template: :1: function "InvalidFunction" not defined -`, - }, - { - Context{Format: "{{nil}}"}, - `Template parsing error: template: :1:2: executing "" at : nil is not a command -`, - }, - // Table format - { - Context{Format: NewVolumeFormat("table", false)}, - `DRIVER VOLUME NAME -foo foobar_baz -bar foobar_bar -`, - }, - { - Context{Format: NewVolumeFormat("table", true)}, - `foobar_baz -foobar_bar -`, - }, - { - Context{Format: NewVolumeFormat("table {{.Name}}", false)}, - `VOLUME NAME -foobar_baz -foobar_bar -`, - }, - { - Context{Format: NewVolumeFormat("table {{.Name}}", true)}, - `VOLUME NAME -foobar_baz -foobar_bar -`, - }, - // Raw Format - { - Context{Format: NewVolumeFormat("raw", false)}, - `name: foobar_baz -driver: foo - -name: foobar_bar -driver: bar - -`, - }, - { - Context{Format: NewVolumeFormat("raw", true)}, - `name: foobar_baz -name: foobar_bar -`, - }, - // Custom Format - { - Context{Format: NewVolumeFormat("{{.Name}}", false)}, - `foobar_baz -foobar_bar -`, - }, - } - - for _, testcase := range cases { - volumes := []*types.Volume{ - {Name: "foobar_baz", Driver: "foo"}, - {Name: "foobar_bar", Driver: "bar"}, - } - out := bytes.NewBufferString("") - testcase.context.Output = out - err := VolumeWrite(testcase.context, volumes) - if err != nil { - assert.Error(t, err, testcase.expected) - } else { - assert.Equal(t, out.String(), testcase.expected) - } - } -} - -func TestVolumeContextWriteJSON(t *testing.T) { - volumes := []*types.Volume{ - {Driver: "foo", Name: "foobar_baz"}, - {Driver: "bar", Name: "foobar_bar"}, - } - expectedJSONs := []map[string]interface{}{ - {"Driver": "foo", "Labels": "", "Links": "N/A", "Mountpoint": "", "Name": "foobar_baz", "Scope": "", "Size": "N/A"}, - {"Driver": "bar", "Labels": "", "Links": "N/A", "Mountpoint": "", "Name": "foobar_bar", "Scope": "", "Size": "N/A"}, - } - out := bytes.NewBufferString("") - err := VolumeWrite(Context{Format: "{{json .}}", Output: out}, volumes) - if err != nil { - t.Fatal(err) - } - for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") { - t.Logf("Output: line %d: %s", i, line) - var m map[string]interface{} - if err := json.Unmarshal([]byte(line), &m); err != nil { - t.Fatal(err) - } - assert.DeepEqual(t, m, expectedJSONs[i]) - } -} - -func TestVolumeContextWriteJSONField(t *testing.T) { - volumes := []*types.Volume{ - {Driver: "foo", Name: "foobar_baz"}, - {Driver: "bar", Name: "foobar_bar"}, - } - out := bytes.NewBufferString("") - err := VolumeWrite(Context{Format: "{{json .Name}}", Output: out}, volumes) - if err != nil { - t.Fatal(err) - } - for i, line := range strings.Split(strings.TrimSpace(out.String()), "\n") { - t.Logf("Output: line %d: %s", i, line) - var s string - if err := json.Unmarshal([]byte(line), &s); err != nil { - t.Fatal(err) - } - assert.Equal(t, s, volumes[i].Name) - } -} diff --git a/vendor/github.com/docker/docker/cli/command/idresolver/idresolver.go b/vendor/github.com/docker/docker/cli/command/idresolver/idresolver.go deleted file mode 100644 index 511b1a8f5..000000000 --- a/vendor/github.com/docker/docker/cli/command/idresolver/idresolver.go +++ /dev/null @@ -1,90 +0,0 @@ -package idresolver - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/client" - "github.com/docker/docker/pkg/stringid" -) - -// IDResolver provides ID to Name resolution. -type IDResolver struct { - client client.APIClient - noResolve bool - cache map[string]string -} - -// New creates a new IDResolver. -func New(client client.APIClient, noResolve bool) *IDResolver { - return &IDResolver{ - client: client, - noResolve: noResolve, - cache: make(map[string]string), - } -} - -func (r *IDResolver) get(ctx context.Context, t interface{}, id string) (string, error) { - switch t := t.(type) { - case swarm.Node: - node, _, err := r.client.NodeInspectWithRaw(ctx, id) - if err != nil { - return id, nil - } - if node.Spec.Annotations.Name != "" { - return node.Spec.Annotations.Name, nil - } - if node.Description.Hostname != "" { - return node.Description.Hostname, nil - } - return id, nil - case swarm.Service: - service, _, err := r.client.ServiceInspectWithRaw(ctx, id) - if err != nil { - return id, nil - } - return service.Spec.Annotations.Name, nil - case swarm.Task: - // If the caller passes the full task there's no need to do a lookup. - if t.ID == "" { - var err error - - t, _, err = r.client.TaskInspectWithRaw(ctx, id) - if err != nil { - return id, nil - } - } - taskID := stringid.TruncateID(t.ID) - if t.ServiceID == "" { - return taskID, nil - } - service, err := r.Resolve(ctx, swarm.Service{}, t.ServiceID) - if err != nil { - return "", err - } - return fmt.Sprintf("%s.%d.%s", service, t.Slot, taskID), nil - default: - return "", fmt.Errorf("unsupported type") - } - -} - -// Resolve will attempt to resolve an ID to a Name by querying the manager. -// Results are stored into a cache. -// If the `-n` flag is used in the command-line, resolution is disabled. -func (r *IDResolver) Resolve(ctx context.Context, t interface{}, id string) (string, error) { - if r.noResolve { - return id, nil - } - if name, ok := r.cache[id]; ok { - return name, nil - } - name, err := r.get(ctx, t, id) - if err != nil { - return "", err - } - r.cache[id] = name - return name, nil -} diff --git a/vendor/github.com/docker/docker/cli/command/image/build.go b/vendor/github.com/docker/docker/cli/command/image/build.go deleted file mode 100644 index 0c88af5fc..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/build.go +++ /dev/null @@ -1,477 +0,0 @@ -package image - -import ( - "archive/tar" - "bufio" - "bytes" - "fmt" - "io" - "os" - "path/filepath" - "regexp" - "runtime" - - "golang.org/x/net/context" - - "github.com/docker/docker/api" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/builder" - "github.com/docker/docker/builder/dockerignore" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/fileutils" - "github.com/docker/docker/pkg/jsonmessage" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/pkg/streamformatter" - "github.com/docker/docker/pkg/urlutil" - "github.com/docker/docker/reference" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/docker/go-units" - "github.com/spf13/cobra" -) - -type buildOptions struct { - context string - dockerfileName string - tags opts.ListOpts - labels opts.ListOpts - buildArgs opts.ListOpts - ulimits *runconfigopts.UlimitOpt - memory string - memorySwap string - shmSize string - cpuShares int64 - cpuPeriod int64 - cpuQuota int64 - cpuSetCpus string - cpuSetMems string - cgroupParent string - isolation string - quiet bool - noCache bool - rm bool - forceRm bool - pull bool - cacheFrom []string - compress bool - securityOpt []string - networkMode string - squash bool -} - -// NewBuildCommand creates a new `docker build` command -func NewBuildCommand(dockerCli *command.DockerCli) *cobra.Command { - ulimits := make(map[string]*units.Ulimit) - options := buildOptions{ - tags: opts.NewListOpts(validateTag), - buildArgs: opts.NewListOpts(runconfigopts.ValidateEnv), - ulimits: runconfigopts.NewUlimitOpt(&ulimits), - labels: opts.NewListOpts(runconfigopts.ValidateEnv), - } - - cmd := &cobra.Command{ - Use: "build [OPTIONS] PATH | URL | -", - Short: "Build an image from a Dockerfile", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - options.context = args[0] - return runBuild(dockerCli, options) - }, - } - - flags := cmd.Flags() - - flags.VarP(&options.tags, "tag", "t", "Name and optionally a tag in the 'name:tag' format") - flags.Var(&options.buildArgs, "build-arg", "Set build-time variables") - flags.Var(options.ulimits, "ulimit", "Ulimit options") - flags.StringVarP(&options.dockerfileName, "file", "f", "", "Name of the Dockerfile (Default is 'PATH/Dockerfile')") - flags.StringVarP(&options.memory, "memory", "m", "", "Memory limit") - flags.StringVar(&options.memorySwap, "memory-swap", "", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap") - flags.StringVar(&options.shmSize, "shm-size", "", "Size of /dev/shm, default value is 64MB") - flags.Int64VarP(&options.cpuShares, "cpu-shares", "c", 0, "CPU shares (relative weight)") - flags.Int64Var(&options.cpuPeriod, "cpu-period", 0, "Limit the CPU CFS (Completely Fair Scheduler) period") - flags.Int64Var(&options.cpuQuota, "cpu-quota", 0, "Limit the CPU CFS (Completely Fair Scheduler) quota") - flags.StringVar(&options.cpuSetCpus, "cpuset-cpus", "", "CPUs in which to allow execution (0-3, 0,1)") - flags.StringVar(&options.cpuSetMems, "cpuset-mems", "", "MEMs in which to allow execution (0-3, 0,1)") - flags.StringVar(&options.cgroupParent, "cgroup-parent", "", "Optional parent cgroup for the container") - flags.StringVar(&options.isolation, "isolation", "", "Container isolation technology") - flags.Var(&options.labels, "label", "Set metadata for an image") - flags.BoolVar(&options.noCache, "no-cache", false, "Do not use cache when building the image") - flags.BoolVar(&options.rm, "rm", true, "Remove intermediate containers after a successful build") - flags.BoolVar(&options.forceRm, "force-rm", false, "Always remove intermediate containers") - flags.BoolVarP(&options.quiet, "quiet", "q", false, "Suppress the build output and print image ID on success") - flags.BoolVar(&options.pull, "pull", false, "Always attempt to pull a newer version of the image") - flags.StringSliceVar(&options.cacheFrom, "cache-from", []string{}, "Images to consider as cache sources") - flags.BoolVar(&options.compress, "compress", false, "Compress the build context using gzip") - flags.StringSliceVar(&options.securityOpt, "security-opt", []string{}, "Security options") - flags.StringVar(&options.networkMode, "network", "default", "Set the networking mode for the RUN instructions during build") - - command.AddTrustedFlags(flags, true) - - flags.BoolVar(&options.squash, "squash", false, "Squash newly built layers into a single new layer") - flags.SetAnnotation("squash", "experimental", nil) - flags.SetAnnotation("squash", "version", []string{"1.25"}) - - return cmd -} - -// lastProgressOutput is the same as progress.Output except -// that it only output with the last update. It is used in -// non terminal scenarios to depresss verbose messages -type lastProgressOutput struct { - output progress.Output -} - -// WriteProgress formats progress information from a ProgressReader. -func (out *lastProgressOutput) WriteProgress(prog progress.Progress) error { - if !prog.LastUpdate { - return nil - } - - return out.output.WriteProgress(prog) -} - -func runBuild(dockerCli *command.DockerCli, options buildOptions) error { - - var ( - buildCtx io.ReadCloser - err error - contextDir string - tempDir string - relDockerfile string - progBuff io.Writer - buildBuff io.Writer - ) - - specifiedContext := options.context - progBuff = dockerCli.Out() - buildBuff = dockerCli.Out() - if options.quiet { - progBuff = bytes.NewBuffer(nil) - buildBuff = bytes.NewBuffer(nil) - } - - switch { - case specifiedContext == "-": - buildCtx, relDockerfile, err = builder.GetContextFromReader(dockerCli.In(), options.dockerfileName) - case urlutil.IsGitURL(specifiedContext): - tempDir, relDockerfile, err = builder.GetContextFromGitURL(specifiedContext, options.dockerfileName) - case urlutil.IsURL(specifiedContext): - buildCtx, relDockerfile, err = builder.GetContextFromURL(progBuff, specifiedContext, options.dockerfileName) - default: - contextDir, relDockerfile, err = builder.GetContextFromLocalDir(specifiedContext, options.dockerfileName) - } - - if err != nil { - if options.quiet && urlutil.IsURL(specifiedContext) { - fmt.Fprintln(dockerCli.Err(), progBuff) - } - return fmt.Errorf("unable to prepare context: %s", err) - } - - if tempDir != "" { - defer os.RemoveAll(tempDir) - contextDir = tempDir - } - - if buildCtx == nil { - // And canonicalize dockerfile name to a platform-independent one - relDockerfile, err = archive.CanonicalTarNameForPath(relDockerfile) - if err != nil { - return fmt.Errorf("cannot canonicalize dockerfile path %s: %v", relDockerfile, err) - } - - f, err := os.Open(filepath.Join(contextDir, ".dockerignore")) - if err != nil && !os.IsNotExist(err) { - return err - } - defer f.Close() - - var excludes []string - if err == nil { - excludes, err = dockerignore.ReadAll(f) - if err != nil { - return err - } - } - - if err := builder.ValidateContextDirectory(contextDir, excludes); err != nil { - return fmt.Errorf("Error checking context: '%s'.", err) - } - - // If .dockerignore mentions .dockerignore or the Dockerfile - // then make sure we send both files over to the daemon - // because Dockerfile is, obviously, needed no matter what, and - // .dockerignore is needed to know if either one needs to be - // removed. The daemon will remove them for us, if needed, after it - // parses the Dockerfile. Ignore errors here, as they will have been - // caught by validateContextDirectory above. - var includes = []string{"."} - keepThem1, _ := fileutils.Matches(".dockerignore", excludes) - keepThem2, _ := fileutils.Matches(relDockerfile, excludes) - if keepThem1 || keepThem2 { - includes = append(includes, ".dockerignore", relDockerfile) - } - - compression := archive.Uncompressed - if options.compress { - compression = archive.Gzip - } - buildCtx, err = archive.TarWithOptions(contextDir, &archive.TarOptions{ - Compression: compression, - ExcludePatterns: excludes, - IncludeFiles: includes, - }) - if err != nil { - return err - } - } - - ctx := context.Background() - - var resolvedTags []*resolvedTag - if command.IsTrusted() { - translator := func(ctx context.Context, ref reference.NamedTagged) (reference.Canonical, error) { - return TrustedReference(ctx, dockerCli, ref, nil) - } - // Wrap the tar archive to replace the Dockerfile entry with the rewritten - // Dockerfile which uses trusted pulls. - buildCtx = replaceDockerfileTarWrapper(ctx, buildCtx, relDockerfile, translator, &resolvedTags) - } - - // Setup an upload progress bar - progressOutput := streamformatter.NewStreamFormatter().NewProgressOutput(progBuff, true) - if !dockerCli.Out().IsTerminal() { - progressOutput = &lastProgressOutput{output: progressOutput} - } - - var body io.Reader = progress.NewProgressReader(buildCtx, progressOutput, 0, "", "Sending build context to Docker daemon") - - var memory int64 - if options.memory != "" { - parsedMemory, err := units.RAMInBytes(options.memory) - if err != nil { - return err - } - memory = parsedMemory - } - - var memorySwap int64 - if options.memorySwap != "" { - if options.memorySwap == "-1" { - memorySwap = -1 - } else { - parsedMemorySwap, err := units.RAMInBytes(options.memorySwap) - if err != nil { - return err - } - memorySwap = parsedMemorySwap - } - } - - var shmSize int64 - if options.shmSize != "" { - shmSize, err = units.RAMInBytes(options.shmSize) - if err != nil { - return err - } - } - - authConfigs, _ := dockerCli.GetAllCredentials() - buildOptions := types.ImageBuildOptions{ - Memory: memory, - MemorySwap: memorySwap, - Tags: options.tags.GetAll(), - SuppressOutput: options.quiet, - NoCache: options.noCache, - Remove: options.rm, - ForceRemove: options.forceRm, - PullParent: options.pull, - Isolation: container.Isolation(options.isolation), - CPUSetCPUs: options.cpuSetCpus, - CPUSetMems: options.cpuSetMems, - CPUShares: options.cpuShares, - CPUQuota: options.cpuQuota, - CPUPeriod: options.cpuPeriod, - CgroupParent: options.cgroupParent, - Dockerfile: relDockerfile, - ShmSize: shmSize, - Ulimits: options.ulimits.GetList(), - BuildArgs: runconfigopts.ConvertKVStringsToMapWithNil(options.buildArgs.GetAll()), - AuthConfigs: authConfigs, - Labels: runconfigopts.ConvertKVStringsToMap(options.labels.GetAll()), - CacheFrom: options.cacheFrom, - SecurityOpt: options.securityOpt, - NetworkMode: options.networkMode, - Squash: options.squash, - } - - response, err := dockerCli.Client().ImageBuild(ctx, body, buildOptions) - if err != nil { - if options.quiet { - fmt.Fprintf(dockerCli.Err(), "%s", progBuff) - } - return err - } - defer response.Body.Close() - - err = jsonmessage.DisplayJSONMessagesStream(response.Body, buildBuff, dockerCli.Out().FD(), dockerCli.Out().IsTerminal(), nil) - if err != nil { - if jerr, ok := err.(*jsonmessage.JSONError); ok { - // If no error code is set, default to 1 - if jerr.Code == 0 { - jerr.Code = 1 - } - if options.quiet { - fmt.Fprintf(dockerCli.Err(), "%s%s", progBuff, buildBuff) - } - return cli.StatusError{Status: jerr.Message, StatusCode: jerr.Code} - } - } - - // Windows: show error message about modified file permissions if the - // daemon isn't running Windows. - if response.OSType != "windows" && runtime.GOOS == "windows" && !options.quiet { - fmt.Fprintln(dockerCli.Err(), `SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.`) - } - - // Everything worked so if -q was provided the output from the daemon - // should be just the image ID and we'll print that to stdout. - if options.quiet { - fmt.Fprintf(dockerCli.Out(), "%s", buildBuff) - } - - if command.IsTrusted() { - // Since the build was successful, now we must tag any of the resolved - // images from the above Dockerfile rewrite. - for _, resolved := range resolvedTags { - if err := TagTrusted(ctx, dockerCli, resolved.digestRef, resolved.tagRef); err != nil { - return err - } - } - } - - return nil -} - -type translatorFunc func(context.Context, reference.NamedTagged) (reference.Canonical, error) - -// validateTag checks if the given image name can be resolved. -func validateTag(rawRepo string) (string, error) { - _, err := reference.ParseNamed(rawRepo) - if err != nil { - return "", err - } - - return rawRepo, nil -} - -var dockerfileFromLinePattern = regexp.MustCompile(`(?i)^[\s]*FROM[ \f\r\t\v]+(?P[^ \f\r\t\v\n#]+)`) - -// resolvedTag records the repository, tag, and resolved digest reference -// from a Dockerfile rewrite. -type resolvedTag struct { - digestRef reference.Canonical - tagRef reference.NamedTagged -} - -// rewriteDockerfileFrom rewrites the given Dockerfile by resolving images in -// "FROM " instructions to a digest reference. `translator` is a -// function that takes a repository name and tag reference and returns a -// trusted digest reference. -func rewriteDockerfileFrom(ctx context.Context, dockerfile io.Reader, translator translatorFunc) (newDockerfile []byte, resolvedTags []*resolvedTag, err error) { - scanner := bufio.NewScanner(dockerfile) - buf := bytes.NewBuffer(nil) - - // Scan the lines of the Dockerfile, looking for a "FROM" line. - for scanner.Scan() { - line := scanner.Text() - - matches := dockerfileFromLinePattern.FindStringSubmatch(line) - if matches != nil && matches[1] != api.NoBaseImageSpecifier { - // Replace the line with a resolved "FROM repo@digest" - ref, err := reference.ParseNamed(matches[1]) - if err != nil { - return nil, nil, err - } - ref = reference.WithDefaultTag(ref) - if ref, ok := ref.(reference.NamedTagged); ok && command.IsTrusted() { - trustedRef, err := translator(ctx, ref) - if err != nil { - return nil, nil, err - } - - line = dockerfileFromLinePattern.ReplaceAllLiteralString(line, fmt.Sprintf("FROM %s", trustedRef.String())) - resolvedTags = append(resolvedTags, &resolvedTag{ - digestRef: trustedRef, - tagRef: ref, - }) - } - } - - _, err := fmt.Fprintln(buf, line) - if err != nil { - return nil, nil, err - } - } - - return buf.Bytes(), resolvedTags, scanner.Err() -} - -// replaceDockerfileTarWrapper wraps the given input tar archive stream and -// replaces the entry with the given Dockerfile name with the contents of the -// new Dockerfile. Returns a new tar archive stream with the replaced -// Dockerfile. -func replaceDockerfileTarWrapper(ctx context.Context, inputTarStream io.ReadCloser, dockerfileName string, translator translatorFunc, resolvedTags *[]*resolvedTag) io.ReadCloser { - pipeReader, pipeWriter := io.Pipe() - go func() { - tarReader := tar.NewReader(inputTarStream) - tarWriter := tar.NewWriter(pipeWriter) - - defer inputTarStream.Close() - - for { - hdr, err := tarReader.Next() - if err == io.EOF { - // Signals end of archive. - tarWriter.Close() - pipeWriter.Close() - return - } - if err != nil { - pipeWriter.CloseWithError(err) - return - } - - content := io.Reader(tarReader) - if hdr.Name == dockerfileName { - // This entry is the Dockerfile. Since the tar archive was - // generated from a directory on the local filesystem, the - // Dockerfile will only appear once in the archive. - var newDockerfile []byte - newDockerfile, *resolvedTags, err = rewriteDockerfileFrom(ctx, content, translator) - if err != nil { - pipeWriter.CloseWithError(err) - return - } - hdr.Size = int64(len(newDockerfile)) - content = bytes.NewBuffer(newDockerfile) - } - - if err := tarWriter.WriteHeader(hdr); err != nil { - pipeWriter.CloseWithError(err) - return - } - - if _, err := io.Copy(tarWriter, content); err != nil { - pipeWriter.CloseWithError(err) - return - } - } - }() - - return pipeReader -} diff --git a/vendor/github.com/docker/docker/cli/command/image/cmd.go b/vendor/github.com/docker/docker/cli/command/image/cmd.go deleted file mode 100644 index c3ca61f85..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/cmd.go +++ /dev/null @@ -1,33 +0,0 @@ -package image - -import ( - "github.com/spf13/cobra" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" -) - -// NewImageCommand returns a cobra command for `image` subcommands -func NewImageCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "image", - Short: "Manage images", - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - } - cmd.AddCommand( - NewBuildCommand(dockerCli), - NewHistoryCommand(dockerCli), - NewImportCommand(dockerCli), - NewLoadCommand(dockerCli), - NewPullCommand(dockerCli), - NewPushCommand(dockerCli), - NewSaveCommand(dockerCli), - NewTagCommand(dockerCli), - newListCommand(dockerCli), - newRemoveCommand(dockerCli), - newInspectCommand(dockerCli), - NewPruneCommand(dockerCli), - ) - return cmd -} diff --git a/vendor/github.com/docker/docker/cli/command/image/history.go b/vendor/github.com/docker/docker/cli/command/image/history.go deleted file mode 100644 index 91c8f75a6..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/history.go +++ /dev/null @@ -1,99 +0,0 @@ -package image - -import ( - "fmt" - "strconv" - "strings" - "text/tabwriter" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/stringutils" - "github.com/docker/go-units" - "github.com/spf13/cobra" -) - -type historyOptions struct { - image string - - human bool - quiet bool - noTrunc bool -} - -// NewHistoryCommand creates a new `docker history` command -func NewHistoryCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts historyOptions - - cmd := &cobra.Command{ - Use: "history [OPTIONS] IMAGE", - Short: "Show the history of an image", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.image = args[0] - return runHistory(dockerCli, opts) - }, - } - - flags := cmd.Flags() - - flags.BoolVarP(&opts.human, "human", "H", true, "Print sizes and dates in human readable format") - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only show numeric IDs") - flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Don't truncate output") - - return cmd -} - -func runHistory(dockerCli *command.DockerCli, opts historyOptions) error { - ctx := context.Background() - - history, err := dockerCli.Client().ImageHistory(ctx, opts.image) - if err != nil { - return err - } - - w := tabwriter.NewWriter(dockerCli.Out(), 20, 1, 3, ' ', 0) - - if opts.quiet { - for _, entry := range history { - if opts.noTrunc { - fmt.Fprintf(w, "%s\n", entry.ID) - } else { - fmt.Fprintf(w, "%s\n", stringid.TruncateID(entry.ID)) - } - } - w.Flush() - return nil - } - - var imageID string - var createdBy string - var created string - var size string - - fmt.Fprintln(w, "IMAGE\tCREATED\tCREATED BY\tSIZE\tCOMMENT") - for _, entry := range history { - imageID = entry.ID - createdBy = strings.Replace(entry.CreatedBy, "\t", " ", -1) - if !opts.noTrunc { - createdBy = stringutils.Ellipsis(createdBy, 45) - imageID = stringid.TruncateID(entry.ID) - } - - if opts.human { - created = units.HumanDuration(time.Now().UTC().Sub(time.Unix(entry.Created, 0))) + " ago" - size = units.HumanSizeWithPrecision(float64(entry.Size), 3) - } else { - created = time.Unix(entry.Created, 0).Format(time.RFC3339) - size = strconv.FormatInt(entry.Size, 10) - } - - fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\n", imageID, created, createdBy, size, entry.Comment) - } - w.Flush() - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/image/import.go b/vendor/github.com/docker/docker/cli/command/image/import.go deleted file mode 100644 index 60024fb53..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/import.go +++ /dev/null @@ -1,88 +0,0 @@ -package image - -import ( - "io" - "os" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - dockeropts "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/jsonmessage" - "github.com/docker/docker/pkg/urlutil" - "github.com/spf13/cobra" -) - -type importOptions struct { - source string - reference string - changes dockeropts.ListOpts - message string -} - -// NewImportCommand creates a new `docker import` command -func NewImportCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts importOptions - - cmd := &cobra.Command{ - Use: "import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]", - Short: "Import the contents from a tarball to create a filesystem image", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.source = args[0] - if len(args) > 1 { - opts.reference = args[1] - } - return runImport(dockerCli, opts) - }, - } - - flags := cmd.Flags() - - opts.changes = dockeropts.NewListOpts(nil) - flags.VarP(&opts.changes, "change", "c", "Apply Dockerfile instruction to the created image") - flags.StringVarP(&opts.message, "message", "m", "", "Set commit message for imported image") - - return cmd -} - -func runImport(dockerCli *command.DockerCli, opts importOptions) error { - var ( - in io.Reader - srcName = opts.source - ) - - if opts.source == "-" { - in = dockerCli.In() - } else if !urlutil.IsURL(opts.source) { - srcName = "-" - file, err := os.Open(opts.source) - if err != nil { - return err - } - defer file.Close() - in = file - } - - source := types.ImageImportSource{ - Source: in, - SourceName: srcName, - } - - options := types.ImageImportOptions{ - Message: opts.message, - Changes: opts.changes.GetAll(), - } - - clnt := dockerCli.Client() - - responseBody, err := clnt.ImageImport(context.Background(), source, opts.reference, options) - if err != nil { - return err - } - defer responseBody.Close() - - return jsonmessage.DisplayJSONMessagesToStream(responseBody, dockerCli.Out(), nil) -} diff --git a/vendor/github.com/docker/docker/cli/command/image/inspect.go b/vendor/github.com/docker/docker/cli/command/image/inspect.go deleted file mode 100644 index 217863c77..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/inspect.go +++ /dev/null @@ -1,44 +0,0 @@ -package image - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/inspect" - "github.com/spf13/cobra" -) - -type inspectOptions struct { - format string - refs []string -} - -// newInspectCommand creates a new cobra.Command for `docker image inspect` -func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts inspectOptions - - cmd := &cobra.Command{ - Use: "inspect [OPTIONS] IMAGE [IMAGE...]", - Short: "Display detailed information on one or more images", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.refs = args - return runInspect(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template") - return cmd -} - -func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - getRefFunc := func(ref string) (interface{}, []byte, error) { - return client.ImageInspectWithRaw(ctx, ref) - } - return inspect.Inspect(dockerCli.Out(), opts.refs, opts.format, getRefFunc) -} diff --git a/vendor/github.com/docker/docker/cli/command/image/list.go b/vendor/github.com/docker/docker/cli/command/image/list.go deleted file mode 100644 index 679604fc0..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/list.go +++ /dev/null @@ -1,96 +0,0 @@ -package image - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/formatter" - "github.com/docker/docker/opts" - "github.com/spf13/cobra" -) - -type imagesOptions struct { - matchName string - - quiet bool - all bool - noTrunc bool - showDigests bool - format string - filter opts.FilterOpt -} - -// NewImagesCommand creates a new `docker images` command -func NewImagesCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := imagesOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "images [OPTIONS] [REPOSITORY[:TAG]]", - Short: "List images", - Args: cli.RequiresMaxArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - if len(args) > 0 { - opts.matchName = args[0] - } - return runImages(dockerCli, opts) - }, - } - - flags := cmd.Flags() - - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only show numeric IDs") - flags.BoolVarP(&opts.all, "all", "a", false, "Show all images (default hides intermediate images)") - flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Don't truncate output") - flags.BoolVar(&opts.showDigests, "digests", false, "Show digests") - flags.StringVar(&opts.format, "format", "", "Pretty-print images using a Go template") - flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided") - - return cmd -} - -func newListCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := *NewImagesCommand(dockerCli) - cmd.Aliases = []string{"images", "list"} - cmd.Use = "ls [OPTIONS] [REPOSITORY[:TAG]]" - return &cmd -} - -func runImages(dockerCli *command.DockerCli, opts imagesOptions) error { - ctx := context.Background() - - filters := opts.filter.Value() - if opts.matchName != "" { - filters.Add("reference", opts.matchName) - } - - options := types.ImageListOptions{ - All: opts.all, - Filters: filters, - } - - images, err := dockerCli.Client().ImageList(ctx, options) - if err != nil { - return err - } - - format := opts.format - if len(format) == 0 { - if len(dockerCli.ConfigFile().ImagesFormat) > 0 && !opts.quiet { - format = dockerCli.ConfigFile().ImagesFormat - } else { - format = formatter.TableFormatKey - } - } - - imageCtx := formatter.ImageContext{ - Context: formatter.Context{ - Output: dockerCli.Out(), - Format: formatter.NewImageFormat(format, opts.quiet, opts.showDigests), - Trunc: !opts.noTrunc, - }, - Digest: opts.showDigests, - } - return formatter.ImageWrite(imageCtx, images) -} diff --git a/vendor/github.com/docker/docker/cli/command/image/load.go b/vendor/github.com/docker/docker/cli/command/image/load.go deleted file mode 100644 index 988f5106e..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/load.go +++ /dev/null @@ -1,77 +0,0 @@ -package image - -import ( - "fmt" - "io" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/jsonmessage" - "github.com/docker/docker/pkg/system" - "github.com/spf13/cobra" -) - -type loadOptions struct { - input string - quiet bool -} - -// NewLoadCommand creates a new `docker load` command -func NewLoadCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts loadOptions - - cmd := &cobra.Command{ - Use: "load [OPTIONS]", - Short: "Load an image from a tar archive or STDIN", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runLoad(dockerCli, opts) - }, - } - - flags := cmd.Flags() - - flags.StringVarP(&opts.input, "input", "i", "", "Read from tar archive file, instead of STDIN") - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Suppress the load output") - - return cmd -} - -func runLoad(dockerCli *command.DockerCli, opts loadOptions) error { - - var input io.Reader = dockerCli.In() - if opts.input != "" { - // We use system.OpenSequential to use sequential file access on Windows, avoiding - // depleting the standby list un-necessarily. On Linux, this equates to a regular os.Open. - file, err := system.OpenSequential(opts.input) - if err != nil { - return err - } - defer file.Close() - input = file - } - - // To avoid getting stuck, verify that a tar file is given either in - // the input flag or through stdin and if not display an error message and exit. - if opts.input == "" && dockerCli.In().IsTerminal() { - return fmt.Errorf("requested load from stdin, but stdin is empty") - } - - if !dockerCli.Out().IsTerminal() { - opts.quiet = true - } - response, err := dockerCli.Client().ImageLoad(context.Background(), input, opts.quiet) - if err != nil { - return err - } - defer response.Body.Close() - - if response.Body != nil && response.JSON { - return jsonmessage.DisplayJSONMessagesToStream(response.Body, dockerCli.Out(), nil) - } - - _, err = io.Copy(dockerCli.Out(), response.Body) - return err -} diff --git a/vendor/github.com/docker/docker/cli/command/image/prune.go b/vendor/github.com/docker/docker/cli/command/image/prune.go deleted file mode 100644 index 82c28fcf4..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/prune.go +++ /dev/null @@ -1,92 +0,0 @@ -package image - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - units "github.com/docker/go-units" - "github.com/spf13/cobra" -) - -type pruneOptions struct { - force bool - all bool -} - -// NewPruneCommand returns a new cobra prune command for images -func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts pruneOptions - - cmd := &cobra.Command{ - Use: "prune [OPTIONS]", - Short: "Remove unused images", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - spaceReclaimed, output, err := runPrune(dockerCli, opts) - if err != nil { - return err - } - if output != "" { - fmt.Fprintln(dockerCli.Out(), output) - } - fmt.Fprintln(dockerCli.Out(), "Total reclaimed space:", units.HumanSize(float64(spaceReclaimed))) - return nil - }, - Tags: map[string]string{"version": "1.25"}, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.force, "force", "f", false, "Do not prompt for confirmation") - flags.BoolVarP(&opts.all, "all", "a", false, "Remove all unused images, not just dangling ones") - - return cmd -} - -const ( - allImageWarning = `WARNING! This will remove all images without at least one container associated to them. -Are you sure you want to continue?` - danglingWarning = `WARNING! This will remove all dangling images. -Are you sure you want to continue?` -) - -func runPrune(dockerCli *command.DockerCli, opts pruneOptions) (spaceReclaimed uint64, output string, err error) { - pruneFilters := filters.NewArgs() - pruneFilters.Add("dangling", fmt.Sprintf("%v", !opts.all)) - - warning := danglingWarning - if opts.all { - warning = allImageWarning - } - if !opts.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), warning) { - return - } - - report, err := dockerCli.Client().ImagesPrune(context.Background(), pruneFilters) - if err != nil { - return - } - - if len(report.ImagesDeleted) > 0 { - output = "Deleted Images:\n" - for _, st := range report.ImagesDeleted { - if st.Untagged != "" { - output += fmt.Sprintln("untagged:", st.Untagged) - } else { - output += fmt.Sprintln("deleted:", st.Deleted) - } - } - spaceReclaimed = report.SpaceReclaimed - } - - return -} - -// RunPrune calls the Image Prune API -// This returns the amount of space reclaimed and a detailed output string -func RunPrune(dockerCli *command.DockerCli, all bool) (uint64, string, error) { - return runPrune(dockerCli, pruneOptions{force: true, all: all}) -} diff --git a/vendor/github.com/docker/docker/cli/command/image/pull.go b/vendor/github.com/docker/docker/cli/command/image/pull.go deleted file mode 100644 index 24933fe84..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/pull.go +++ /dev/null @@ -1,84 +0,0 @@ -package image - -import ( - "errors" - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "github.com/spf13/cobra" -) - -type pullOptions struct { - remote string - all bool -} - -// NewPullCommand creates a new `docker pull` command -func NewPullCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts pullOptions - - cmd := &cobra.Command{ - Use: "pull [OPTIONS] NAME[:TAG|@DIGEST]", - Short: "Pull an image or a repository from a registry", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.remote = args[0] - return runPull(dockerCli, opts) - }, - } - - flags := cmd.Flags() - - flags.BoolVarP(&opts.all, "all-tags", "a", false, "Download all tagged images in the repository") - command.AddTrustedFlags(flags, true) - - return cmd -} - -func runPull(dockerCli *command.DockerCli, opts pullOptions) error { - distributionRef, err := reference.ParseNamed(opts.remote) - if err != nil { - return err - } - if opts.all && !reference.IsNameOnly(distributionRef) { - return errors.New("tag can't be used with --all-tags/-a") - } - - if !opts.all && reference.IsNameOnly(distributionRef) { - distributionRef = reference.WithDefaultTag(distributionRef) - fmt.Fprintf(dockerCli.Out(), "Using default tag: %s\n", reference.DefaultTag) - } - - // Resolve the Repository name from fqn to RepositoryInfo - repoInfo, err := registry.ParseRepositoryInfo(distributionRef) - if err != nil { - return err - } - - ctx := context.Background() - - authConfig := command.ResolveAuthConfig(ctx, dockerCli, repoInfo.Index) - requestPrivilege := command.RegistryAuthenticationPrivilegedFunc(dockerCli, repoInfo.Index, "pull") - - // Check if reference has a digest - _, isCanonical := distributionRef.(reference.Canonical) - if command.IsTrusted() && !isCanonical { - err = trustedPull(ctx, dockerCli, repoInfo, distributionRef, authConfig, requestPrivilege) - } else { - err = imagePullPrivileged(ctx, dockerCli, authConfig, distributionRef.String(), requestPrivilege, opts.all) - } - if err != nil { - if strings.Contains(err.Error(), "target is plugin") { - return errors.New(err.Error() + " - Use `docker plugin install`") - } - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/image/push.go b/vendor/github.com/docker/docker/cli/command/image/push.go deleted file mode 100644 index a8ce4945e..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/push.go +++ /dev/null @@ -1,61 +0,0 @@ -package image - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/jsonmessage" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "github.com/spf13/cobra" -) - -// NewPushCommand creates a new `docker push` command -func NewPushCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "push [OPTIONS] NAME[:TAG]", - Short: "Push an image or a repository to a registry", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runPush(dockerCli, args[0]) - }, - } - - flags := cmd.Flags() - - command.AddTrustedFlags(flags, true) - - return cmd -} - -func runPush(dockerCli *command.DockerCli, remote string) error { - ref, err := reference.ParseNamed(remote) - if err != nil { - return err - } - - // Resolve the Repository name from fqn to RepositoryInfo - repoInfo, err := registry.ParseRepositoryInfo(ref) - if err != nil { - return err - } - - ctx := context.Background() - - // Resolve the Auth config relevant for this server - authConfig := command.ResolveAuthConfig(ctx, dockerCli, repoInfo.Index) - requestPrivilege := command.RegistryAuthenticationPrivilegedFunc(dockerCli, repoInfo.Index, "push") - - if command.IsTrusted() { - return trustedPush(ctx, dockerCli, repoInfo, ref, authConfig, requestPrivilege) - } - - responseBody, err := imagePushPrivileged(ctx, dockerCli, authConfig, ref.String(), requestPrivilege) - if err != nil { - return err - } - - defer responseBody.Close() - return jsonmessage.DisplayJSONMessagesToStream(responseBody, dockerCli.Out(), nil) -} diff --git a/vendor/github.com/docker/docker/cli/command/image/remove.go b/vendor/github.com/docker/docker/cli/command/image/remove.go deleted file mode 100644 index c79ceba7a..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/remove.go +++ /dev/null @@ -1,77 +0,0 @@ -package image - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type removeOptions struct { - force bool - noPrune bool -} - -// NewRemoveCommand creates a new `docker remove` command -func NewRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts removeOptions - - cmd := &cobra.Command{ - Use: "rmi [OPTIONS] IMAGE [IMAGE...]", - Short: "Remove one or more images", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runRemove(dockerCli, opts, args) - }, - } - - flags := cmd.Flags() - - flags.BoolVarP(&opts.force, "force", "f", false, "Force removal of the image") - flags.BoolVar(&opts.noPrune, "no-prune", false, "Do not delete untagged parents") - - return cmd -} - -func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := *NewRemoveCommand(dockerCli) - cmd.Aliases = []string{"rmi", "remove"} - cmd.Use = "rm [OPTIONS] IMAGE [IMAGE...]" - return &cmd -} - -func runRemove(dockerCli *command.DockerCli, opts removeOptions, images []string) error { - client := dockerCli.Client() - ctx := context.Background() - - options := types.ImageRemoveOptions{ - Force: opts.force, - PruneChildren: !opts.noPrune, - } - - var errs []string - for _, image := range images { - dels, err := client.ImageRemove(ctx, image, options) - if err != nil { - errs = append(errs, err.Error()) - } else { - for _, del := range dels { - if del.Deleted != "" { - fmt.Fprintf(dockerCli.Out(), "Deleted: %s\n", del.Deleted) - } else { - fmt.Fprintf(dockerCli.Out(), "Untagged: %s\n", del.Untagged) - } - } - } - } - - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/image/save.go b/vendor/github.com/docker/docker/cli/command/image/save.go deleted file mode 100644 index bbe82d2a0..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/save.go +++ /dev/null @@ -1,57 +0,0 @@ -package image - -import ( - "errors" - "io" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type saveOptions struct { - images []string - output string -} - -// NewSaveCommand creates a new `docker save` command -func NewSaveCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts saveOptions - - cmd := &cobra.Command{ - Use: "save [OPTIONS] IMAGE [IMAGE...]", - Short: "Save one or more images to a tar archive (streamed to STDOUT by default)", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.images = args - return runSave(dockerCli, opts) - }, - } - - flags := cmd.Flags() - - flags.StringVarP(&opts.output, "output", "o", "", "Write to a file, instead of STDOUT") - - return cmd -} - -func runSave(dockerCli *command.DockerCli, opts saveOptions) error { - if opts.output == "" && dockerCli.Out().IsTerminal() { - return errors.New("Cowardly refusing to save to a terminal. Use the -o flag or redirect.") - } - - responseBody, err := dockerCli.Client().ImageSave(context.Background(), opts.images) - if err != nil { - return err - } - defer responseBody.Close() - - if opts.output == "" { - _, err := io.Copy(dockerCli.Out(), responseBody) - return err - } - - return command.CopyToFile(opts.output, responseBody) -} diff --git a/vendor/github.com/docker/docker/cli/command/image/tag.go b/vendor/github.com/docker/docker/cli/command/image/tag.go deleted file mode 100644 index fb2b70385..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/tag.go +++ /dev/null @@ -1,41 +0,0 @@ -package image - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type tagOptions struct { - image string - name string -} - -// NewTagCommand creates a new `docker tag` command -func NewTagCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts tagOptions - - cmd := &cobra.Command{ - Use: "tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]", - Short: "Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE", - Args: cli.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - opts.image = args[0] - opts.name = args[1] - return runTag(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.SetInterspersed(false) - - return cmd -} - -func runTag(dockerCli *command.DockerCli, opts tagOptions) error { - ctx := context.Background() - - return dockerCli.Client().ImageTag(ctx, opts.image, opts.name) -} diff --git a/vendor/github.com/docker/docker/cli/command/image/trust.go b/vendor/github.com/docker/docker/cli/command/image/trust.go deleted file mode 100644 index 5136a2215..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/trust.go +++ /dev/null @@ -1,381 +0,0 @@ -package image - -import ( - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "path" - "sort" - - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/trust" - "github.com/docker/docker/distribution" - "github.com/docker/docker/pkg/jsonmessage" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "github.com/docker/notary/client" - "github.com/docker/notary/tuf/data" -) - -type target struct { - name string - digest digest.Digest - size int64 -} - -// trustedPush handles content trust pushing of an image -func trustedPush(ctx context.Context, cli *command.DockerCli, repoInfo *registry.RepositoryInfo, ref reference.Named, authConfig types.AuthConfig, requestPrivilege types.RequestPrivilegeFunc) error { - responseBody, err := imagePushPrivileged(ctx, cli, authConfig, ref.String(), requestPrivilege) - if err != nil { - return err - } - - defer responseBody.Close() - - return PushTrustedReference(cli, repoInfo, ref, authConfig, responseBody) -} - -// PushTrustedReference pushes a canonical reference to the trust server. -func PushTrustedReference(cli *command.DockerCli, repoInfo *registry.RepositoryInfo, ref reference.Named, authConfig types.AuthConfig, in io.Reader) error { - // If it is a trusted push we would like to find the target entry which match the - // tag provided in the function and then do an AddTarget later. - target := &client.Target{} - // Count the times of calling for handleTarget, - // if it is called more that once, that should be considered an error in a trusted push. - cnt := 0 - handleTarget := func(aux *json.RawMessage) { - cnt++ - if cnt > 1 { - // handleTarget should only be called one. This will be treated as an error. - return - } - - var pushResult distribution.PushResult - err := json.Unmarshal(*aux, &pushResult) - if err == nil && pushResult.Tag != "" && pushResult.Digest.Validate() == nil { - h, err := hex.DecodeString(pushResult.Digest.Hex()) - if err != nil { - target = nil - return - } - target.Name = pushResult.Tag - target.Hashes = data.Hashes{string(pushResult.Digest.Algorithm()): h} - target.Length = int64(pushResult.Size) - } - } - - var tag string - switch x := ref.(type) { - case reference.Canonical: - return errors.New("cannot push a digest reference") - case reference.NamedTagged: - tag = x.Tag() - default: - // We want trust signatures to always take an explicit tag, - // otherwise it will act as an untrusted push. - if err := jsonmessage.DisplayJSONMessagesToStream(in, cli.Out(), nil); err != nil { - return err - } - fmt.Fprintln(cli.Out(), "No tag specified, skipping trust metadata push") - return nil - } - - if err := jsonmessage.DisplayJSONMessagesToStream(in, cli.Out(), handleTarget); err != nil { - return err - } - - if cnt > 1 { - return fmt.Errorf("internal error: only one call to handleTarget expected") - } - - if target == nil { - fmt.Fprintln(cli.Out(), "No targets found, please provide a specific tag in order to sign it") - return nil - } - - fmt.Fprintln(cli.Out(), "Signing and pushing trust metadata") - - repo, err := trust.GetNotaryRepository(cli, repoInfo, authConfig, "push", "pull") - if err != nil { - fmt.Fprintf(cli.Out(), "Error establishing connection to notary repository: %s\n", err) - return err - } - - // get the latest repository metadata so we can figure out which roles to sign - err = repo.Update(false) - - switch err.(type) { - case client.ErrRepoNotInitialized, client.ErrRepositoryNotExist: - keys := repo.CryptoService.ListKeys(data.CanonicalRootRole) - var rootKeyID string - // always select the first root key - if len(keys) > 0 { - sort.Strings(keys) - rootKeyID = keys[0] - } else { - rootPublicKey, err := repo.CryptoService.Create(data.CanonicalRootRole, "", data.ECDSAKey) - if err != nil { - return err - } - rootKeyID = rootPublicKey.ID() - } - - // Initialize the notary repository with a remotely managed snapshot key - if err := repo.Initialize([]string{rootKeyID}, data.CanonicalSnapshotRole); err != nil { - return trust.NotaryError(repoInfo.FullName(), err) - } - fmt.Fprintf(cli.Out(), "Finished initializing %q\n", repoInfo.FullName()) - err = repo.AddTarget(target, data.CanonicalTargetsRole) - case nil: - // already initialized and we have successfully downloaded the latest metadata - err = addTargetToAllSignableRoles(repo, target) - default: - return trust.NotaryError(repoInfo.FullName(), err) - } - - if err == nil { - err = repo.Publish() - } - - if err != nil { - fmt.Fprintf(cli.Out(), "Failed to sign %q:%s - %s\n", repoInfo.FullName(), tag, err.Error()) - return trust.NotaryError(repoInfo.FullName(), err) - } - - fmt.Fprintf(cli.Out(), "Successfully signed %q:%s\n", repoInfo.FullName(), tag) - return nil -} - -// Attempt to add the image target to all the top level delegation roles we can -// (based on whether we have the signing key and whether the role's path allows -// us to). -// If there are no delegation roles, we add to the targets role. -func addTargetToAllSignableRoles(repo *client.NotaryRepository, target *client.Target) error { - var signableRoles []string - - // translate the full key names, which includes the GUN, into just the key IDs - allCanonicalKeyIDs := make(map[string]struct{}) - for fullKeyID := range repo.CryptoService.ListAllKeys() { - allCanonicalKeyIDs[path.Base(fullKeyID)] = struct{}{} - } - - allDelegationRoles, err := repo.GetDelegationRoles() - if err != nil { - return err - } - - // if there are no delegation roles, then just try to sign it into the targets role - if len(allDelegationRoles) == 0 { - return repo.AddTarget(target, data.CanonicalTargetsRole) - } - - // there are delegation roles, find every delegation role we have a key for, and - // attempt to sign into into all those roles. - for _, delegationRole := range allDelegationRoles { - // We do not support signing any delegation role that isn't a direct child of the targets role. - // Also don't bother checking the keys if we can't add the target - // to this role due to path restrictions - if path.Dir(delegationRole.Name) != data.CanonicalTargetsRole || !delegationRole.CheckPaths(target.Name) { - continue - } - - for _, canonicalKeyID := range delegationRole.KeyIDs { - if _, ok := allCanonicalKeyIDs[canonicalKeyID]; ok { - signableRoles = append(signableRoles, delegationRole.Name) - break - } - } - } - - if len(signableRoles) == 0 { - return fmt.Errorf("no valid signing keys for delegation roles") - } - - return repo.AddTarget(target, signableRoles...) -} - -// imagePushPrivileged push the image -func imagePushPrivileged(ctx context.Context, cli *command.DockerCli, authConfig types.AuthConfig, ref string, requestPrivilege types.RequestPrivilegeFunc) (io.ReadCloser, error) { - encodedAuth, err := command.EncodeAuthToBase64(authConfig) - if err != nil { - return nil, err - } - options := types.ImagePushOptions{ - RegistryAuth: encodedAuth, - PrivilegeFunc: requestPrivilege, - } - - return cli.Client().ImagePush(ctx, ref, options) -} - -// trustedPull handles content trust pulling of an image -func trustedPull(ctx context.Context, cli *command.DockerCli, repoInfo *registry.RepositoryInfo, ref reference.Named, authConfig types.AuthConfig, requestPrivilege types.RequestPrivilegeFunc) error { - var refs []target - - notaryRepo, err := trust.GetNotaryRepository(cli, repoInfo, authConfig, "pull") - if err != nil { - fmt.Fprintf(cli.Out(), "Error establishing connection to trust repository: %s\n", err) - return err - } - - if tagged, isTagged := ref.(reference.NamedTagged); !isTagged { - // List all targets - targets, err := notaryRepo.ListTargets(trust.ReleasesRole, data.CanonicalTargetsRole) - if err != nil { - return trust.NotaryError(repoInfo.FullName(), err) - } - for _, tgt := range targets { - t, err := convertTarget(tgt.Target) - if err != nil { - fmt.Fprintf(cli.Out(), "Skipping target for %q\n", repoInfo.Name()) - continue - } - // Only list tags in the top level targets role or the releases delegation role - ignore - // all other delegation roles - if tgt.Role != trust.ReleasesRole && tgt.Role != data.CanonicalTargetsRole { - continue - } - refs = append(refs, t) - } - if len(refs) == 0 { - return trust.NotaryError(repoInfo.FullName(), fmt.Errorf("No trusted tags for %s", repoInfo.FullName())) - } - } else { - t, err := notaryRepo.GetTargetByName(tagged.Tag(), trust.ReleasesRole, data.CanonicalTargetsRole) - if err != nil { - return trust.NotaryError(repoInfo.FullName(), err) - } - // Only get the tag if it's in the top level targets role or the releases delegation role - // ignore it if it's in any other delegation roles - if t.Role != trust.ReleasesRole && t.Role != data.CanonicalTargetsRole { - return trust.NotaryError(repoInfo.FullName(), fmt.Errorf("No trust data for %s", tagged.Tag())) - } - - logrus.Debugf("retrieving target for %s role\n", t.Role) - r, err := convertTarget(t.Target) - if err != nil { - return err - - } - refs = append(refs, r) - } - - for i, r := range refs { - displayTag := r.name - if displayTag != "" { - displayTag = ":" + displayTag - } - fmt.Fprintf(cli.Out(), "Pull (%d of %d): %s%s@%s\n", i+1, len(refs), repoInfo.Name(), displayTag, r.digest) - - ref, err := reference.WithDigest(reference.TrimNamed(repoInfo), r.digest) - if err != nil { - return err - } - if err := imagePullPrivileged(ctx, cli, authConfig, ref.String(), requestPrivilege, false); err != nil { - return err - } - - tagged, err := reference.WithTag(repoInfo, r.name) - if err != nil { - return err - } - trustedRef, err := reference.WithDigest(reference.TrimNamed(repoInfo), r.digest) - if err != nil { - return err - } - if err := TagTrusted(ctx, cli, trustedRef, tagged); err != nil { - return err - } - } - return nil -} - -// imagePullPrivileged pulls the image and displays it to the output -func imagePullPrivileged(ctx context.Context, cli *command.DockerCli, authConfig types.AuthConfig, ref string, requestPrivilege types.RequestPrivilegeFunc, all bool) error { - - encodedAuth, err := command.EncodeAuthToBase64(authConfig) - if err != nil { - return err - } - options := types.ImagePullOptions{ - RegistryAuth: encodedAuth, - PrivilegeFunc: requestPrivilege, - All: all, - } - - responseBody, err := cli.Client().ImagePull(ctx, ref, options) - if err != nil { - return err - } - defer responseBody.Close() - - return jsonmessage.DisplayJSONMessagesToStream(responseBody, cli.Out(), nil) -} - -// TrustedReference returns the canonical trusted reference for an image reference -func TrustedReference(ctx context.Context, cli *command.DockerCli, ref reference.NamedTagged, rs registry.Service) (reference.Canonical, error) { - var ( - repoInfo *registry.RepositoryInfo - err error - ) - if rs != nil { - repoInfo, err = rs.ResolveRepository(ref) - } else { - repoInfo, err = registry.ParseRepositoryInfo(ref) - } - if err != nil { - return nil, err - } - - // Resolve the Auth config relevant for this server - authConfig := command.ResolveAuthConfig(ctx, cli, repoInfo.Index) - - notaryRepo, err := trust.GetNotaryRepository(cli, repoInfo, authConfig, "pull") - if err != nil { - fmt.Fprintf(cli.Out(), "Error establishing connection to trust repository: %s\n", err) - return nil, err - } - - t, err := notaryRepo.GetTargetByName(ref.Tag(), trust.ReleasesRole, data.CanonicalTargetsRole) - if err != nil { - return nil, trust.NotaryError(repoInfo.FullName(), err) - } - // Only list tags in the top level targets role or the releases delegation role - ignore - // all other delegation roles - if t.Role != trust.ReleasesRole && t.Role != data.CanonicalTargetsRole { - return nil, trust.NotaryError(repoInfo.FullName(), fmt.Errorf("No trust data for %s", ref.Tag())) - } - r, err := convertTarget(t.Target) - if err != nil { - return nil, err - - } - - return reference.WithDigest(reference.TrimNamed(ref), r.digest) -} - -func convertTarget(t client.Target) (target, error) { - h, ok := t.Hashes["sha256"] - if !ok { - return target{}, errors.New("no valid hash, expecting sha256") - } - return target{ - name: t.Name, - digest: digest.NewDigestFromHex("sha256", hex.EncodeToString(h)), - size: t.Length, - }, nil -} - -// TagTrusted tags a trusted ref -func TagTrusted(ctx context.Context, cli *command.DockerCli, trustedRef reference.Canonical, ref reference.NamedTagged) error { - fmt.Fprintf(cli.Out(), "Tagging %s as %s\n", trustedRef.String(), ref.String()) - - return cli.Client().ImageTag(ctx, trustedRef.String(), ref.String()) -} diff --git a/vendor/github.com/docker/docker/cli/command/image/trust_test.go b/vendor/github.com/docker/docker/cli/command/image/trust_test.go deleted file mode 100644 index 78146465e..000000000 --- a/vendor/github.com/docker/docker/cli/command/image/trust_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package image - -import ( - "os" - "testing" - - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/cli/trust" - "github.com/docker/docker/registry" -) - -func unsetENV() { - os.Unsetenv("DOCKER_CONTENT_TRUST") - os.Unsetenv("DOCKER_CONTENT_TRUST_SERVER") -} - -func TestENVTrustServer(t *testing.T) { - defer unsetENV() - indexInfo := ®istrytypes.IndexInfo{Name: "testserver"} - if err := os.Setenv("DOCKER_CONTENT_TRUST_SERVER", "https://notary-test.com:5000"); err != nil { - t.Fatal("Failed to set ENV variable") - } - output, err := trust.Server(indexInfo) - expectedStr := "https://notary-test.com:5000" - if err != nil || output != expectedStr { - t.Fatalf("Expected server to be %s, got %s", expectedStr, output) - } -} - -func TestHTTPENVTrustServer(t *testing.T) { - defer unsetENV() - indexInfo := ®istrytypes.IndexInfo{Name: "testserver"} - if err := os.Setenv("DOCKER_CONTENT_TRUST_SERVER", "http://notary-test.com:5000"); err != nil { - t.Fatal("Failed to set ENV variable") - } - _, err := trust.Server(indexInfo) - if err == nil { - t.Fatal("Expected error with invalid scheme") - } -} - -func TestOfficialTrustServer(t *testing.T) { - indexInfo := ®istrytypes.IndexInfo{Name: "testserver", Official: true} - output, err := trust.Server(indexInfo) - if err != nil || output != registry.NotaryServer { - t.Fatalf("Expected server to be %s, got %s", registry.NotaryServer, output) - } -} - -func TestNonOfficialTrustServer(t *testing.T) { - indexInfo := ®istrytypes.IndexInfo{Name: "testserver", Official: false} - output, err := trust.Server(indexInfo) - expectedStr := "https://" + indexInfo.Name - if err != nil || output != expectedStr { - t.Fatalf("Expected server to be %s, got %s", expectedStr, output) - } -} diff --git a/vendor/github.com/docker/docker/cli/command/in.go b/vendor/github.com/docker/docker/cli/command/in.go deleted file mode 100644 index 7204b7ad0..000000000 --- a/vendor/github.com/docker/docker/cli/command/in.go +++ /dev/null @@ -1,75 +0,0 @@ -package command - -import ( - "errors" - "io" - "os" - "runtime" - - "github.com/docker/docker/pkg/term" -) - -// InStream is an input stream used by the DockerCli to read user input -type InStream struct { - in io.ReadCloser - fd uintptr - isTerminal bool - state *term.State -} - -func (i *InStream) Read(p []byte) (int, error) { - return i.in.Read(p) -} - -// Close implements the Closer interface -func (i *InStream) Close() error { - return i.in.Close() -} - -// FD returns the file descriptor number for this stream -func (i *InStream) FD() uintptr { - return i.fd -} - -// IsTerminal returns true if this stream is connected to a terminal -func (i *InStream) IsTerminal() bool { - return i.isTerminal -} - -// SetRawTerminal sets raw mode on the input terminal -func (i *InStream) SetRawTerminal() (err error) { - if os.Getenv("NORAW") != "" || !i.isTerminal { - return nil - } - i.state, err = term.SetRawTerminal(i.fd) - return err -} - -// RestoreTerminal restores normal mode to the terminal -func (i *InStream) RestoreTerminal() { - if i.state != nil { - term.RestoreTerminal(i.fd, i.state) - } -} - -// CheckTty checks if we are trying to attach to a container tty -// from a non-tty client input stream, and if so, returns an error. -func (i *InStream) CheckTty(attachStdin, ttyMode bool) error { - // In order to attach to a container tty, input stream for the client must - // be a tty itself: redirecting or piping the client standard input is - // incompatible with `docker run -t`, `docker exec -t` or `docker attach`. - if ttyMode && attachStdin && !i.isTerminal { - eText := "the input device is not a TTY" - if runtime.GOOS == "windows" { - return errors.New(eText + ". If you are using mintty, try prefixing the command with 'winpty'") - } - return errors.New(eText) - } - return nil -} - -// NewInStream returns a new InStream object from a ReadCloser -func NewInStream(in io.ReadCloser) *InStream { - fd, isTerminal := term.GetFdInfo(in) - return &InStream{in: in, fd: fd, isTerminal: isTerminal} -} diff --git a/vendor/github.com/docker/docker/cli/command/inspect/inspector.go b/vendor/github.com/docker/docker/cli/command/inspect/inspector.go deleted file mode 100644 index 1d81643fb..000000000 --- a/vendor/github.com/docker/docker/cli/command/inspect/inspector.go +++ /dev/null @@ -1,195 +0,0 @@ -package inspect - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "text/template" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/cli" - "github.com/docker/docker/utils/templates" -) - -// Inspector defines an interface to implement to process elements -type Inspector interface { - Inspect(typedElement interface{}, rawElement []byte) error - Flush() error -} - -// TemplateInspector uses a text template to inspect elements. -type TemplateInspector struct { - outputStream io.Writer - buffer *bytes.Buffer - tmpl *template.Template -} - -// NewTemplateInspector creates a new inspector with a template. -func NewTemplateInspector(outputStream io.Writer, tmpl *template.Template) Inspector { - return &TemplateInspector{ - outputStream: outputStream, - buffer: new(bytes.Buffer), - tmpl: tmpl, - } -} - -// NewTemplateInspectorFromString creates a new TemplateInspector from a string -// which is compiled into a template. -func NewTemplateInspectorFromString(out io.Writer, tmplStr string) (Inspector, error) { - if tmplStr == "" { - return NewIndentedInspector(out), nil - } - - tmpl, err := templates.Parse(tmplStr) - if err != nil { - return nil, fmt.Errorf("Template parsing error: %s", err) - } - return NewTemplateInspector(out, tmpl), nil -} - -// GetRefFunc is a function which used by Inspect to fetch an object from a -// reference -type GetRefFunc func(ref string) (interface{}, []byte, error) - -// Inspect fetches objects by reference using GetRefFunc and writes the json -// representation to the output writer. -func Inspect(out io.Writer, references []string, tmplStr string, getRef GetRefFunc) error { - inspector, err := NewTemplateInspectorFromString(out, tmplStr) - if err != nil { - return cli.StatusError{StatusCode: 64, Status: err.Error()} - } - - var inspectErr error - for _, ref := range references { - element, raw, err := getRef(ref) - if err != nil { - inspectErr = err - break - } - - if err := inspector.Inspect(element, raw); err != nil { - inspectErr = err - break - } - } - - if err := inspector.Flush(); err != nil { - logrus.Errorf("%s\n", err) - } - - if inspectErr != nil { - return cli.StatusError{StatusCode: 1, Status: inspectErr.Error()} - } - return nil -} - -// Inspect executes the inspect template. -// It decodes the raw element into a map if the initial execution fails. -// This allows docker cli to parse inspect structs injected with Swarm fields. -func (i *TemplateInspector) Inspect(typedElement interface{}, rawElement []byte) error { - buffer := new(bytes.Buffer) - if err := i.tmpl.Execute(buffer, typedElement); err != nil { - if rawElement == nil { - return fmt.Errorf("Template parsing error: %v", err) - } - return i.tryRawInspectFallback(rawElement) - } - i.buffer.Write(buffer.Bytes()) - i.buffer.WriteByte('\n') - return nil -} - -// tryRawInspectFallback executes the inspect template with a raw interface. -// This allows docker cli to parse inspect structs injected with Swarm fields. -func (i *TemplateInspector) tryRawInspectFallback(rawElement []byte) error { - var raw interface{} - buffer := new(bytes.Buffer) - rdr := bytes.NewReader(rawElement) - dec := json.NewDecoder(rdr) - - if rawErr := dec.Decode(&raw); rawErr != nil { - return fmt.Errorf("unable to read inspect data: %v", rawErr) - } - - tmplMissingKey := i.tmpl.Option("missingkey=error") - if rawErr := tmplMissingKey.Execute(buffer, raw); rawErr != nil { - return fmt.Errorf("Template parsing error: %v", rawErr) - } - - i.buffer.Write(buffer.Bytes()) - i.buffer.WriteByte('\n') - return nil -} - -// Flush writes the result of inspecting all elements into the output stream. -func (i *TemplateInspector) Flush() error { - if i.buffer.Len() == 0 { - _, err := io.WriteString(i.outputStream, "\n") - return err - } - _, err := io.Copy(i.outputStream, i.buffer) - return err -} - -// IndentedInspector uses a buffer to stop the indented representation of an element. -type IndentedInspector struct { - outputStream io.Writer - elements []interface{} - rawElements [][]byte -} - -// NewIndentedInspector generates a new IndentedInspector. -func NewIndentedInspector(outputStream io.Writer) Inspector { - return &IndentedInspector{ - outputStream: outputStream, - } -} - -// Inspect writes the raw element with an indented json format. -func (i *IndentedInspector) Inspect(typedElement interface{}, rawElement []byte) error { - if rawElement != nil { - i.rawElements = append(i.rawElements, rawElement) - } else { - i.elements = append(i.elements, typedElement) - } - return nil -} - -// Flush writes the result of inspecting all elements into the output stream. -func (i *IndentedInspector) Flush() error { - if len(i.elements) == 0 && len(i.rawElements) == 0 { - _, err := io.WriteString(i.outputStream, "[]\n") - return err - } - - var buffer io.Reader - if len(i.rawElements) > 0 { - bytesBuffer := new(bytes.Buffer) - bytesBuffer.WriteString("[") - for idx, r := range i.rawElements { - bytesBuffer.Write(r) - if idx < len(i.rawElements)-1 { - bytesBuffer.WriteString(",") - } - } - bytesBuffer.WriteString("]") - indented := new(bytes.Buffer) - if err := json.Indent(indented, bytesBuffer.Bytes(), "", " "); err != nil { - return err - } - buffer = indented - } else { - b, err := json.MarshalIndent(i.elements, "", " ") - if err != nil { - return err - } - buffer = bytes.NewReader(b) - } - - if _, err := io.Copy(i.outputStream, buffer); err != nil { - return err - } - _, err := io.WriteString(i.outputStream, "\n") - return err -} diff --git a/vendor/github.com/docker/docker/cli/command/inspect/inspector_test.go b/vendor/github.com/docker/docker/cli/command/inspect/inspector_test.go deleted file mode 100644 index 1ce1593ab..000000000 --- a/vendor/github.com/docker/docker/cli/command/inspect/inspector_test.go +++ /dev/null @@ -1,221 +0,0 @@ -package inspect - -import ( - "bytes" - "strings" - "testing" - - "github.com/docker/docker/utils/templates" -) - -type testElement struct { - DNS string `json:"Dns"` -} - -func TestTemplateInspectorDefault(t *testing.T) { - b := new(bytes.Buffer) - tmpl, err := templates.Parse("{{.DNS}}") - if err != nil { - t.Fatal(err) - } - i := NewTemplateInspector(b, tmpl) - if err := i.Inspect(testElement{"0.0.0.0"}, nil); err != nil { - t.Fatal(err) - } - - if err := i.Flush(); err != nil { - t.Fatal(err) - } - if b.String() != "0.0.0.0\n" { - t.Fatalf("Expected `0.0.0.0\\n`, got `%s`", b.String()) - } -} - -func TestTemplateInspectorEmpty(t *testing.T) { - b := new(bytes.Buffer) - tmpl, err := templates.Parse("{{.DNS}}") - if err != nil { - t.Fatal(err) - } - i := NewTemplateInspector(b, tmpl) - - if err := i.Flush(); err != nil { - t.Fatal(err) - } - if b.String() != "\n" { - t.Fatalf("Expected `\\n`, got `%s`", b.String()) - } -} - -func TestTemplateInspectorTemplateError(t *testing.T) { - b := new(bytes.Buffer) - tmpl, err := templates.Parse("{{.Foo}}") - if err != nil { - t.Fatal(err) - } - i := NewTemplateInspector(b, tmpl) - - err = i.Inspect(testElement{"0.0.0.0"}, nil) - if err == nil { - t.Fatal("Expected error got nil") - } - - if !strings.HasPrefix(err.Error(), "Template parsing error") { - t.Fatalf("Expected template error, got %v", err) - } -} - -func TestTemplateInspectorRawFallback(t *testing.T) { - b := new(bytes.Buffer) - tmpl, err := templates.Parse("{{.Dns}}") - if err != nil { - t.Fatal(err) - } - i := NewTemplateInspector(b, tmpl) - if err := i.Inspect(testElement{"0.0.0.0"}, []byte(`{"Dns": "0.0.0.0"}`)); err != nil { - t.Fatal(err) - } - - if err := i.Flush(); err != nil { - t.Fatal(err) - } - if b.String() != "0.0.0.0\n" { - t.Fatalf("Expected `0.0.0.0\\n`, got `%s`", b.String()) - } -} - -func TestTemplateInspectorRawFallbackError(t *testing.T) { - b := new(bytes.Buffer) - tmpl, err := templates.Parse("{{.Dns}}") - if err != nil { - t.Fatal(err) - } - i := NewTemplateInspector(b, tmpl) - err = i.Inspect(testElement{"0.0.0.0"}, []byte(`{"Foo": "0.0.0.0"}`)) - if err == nil { - t.Fatal("Expected error got nil") - } - - if !strings.HasPrefix(err.Error(), "Template parsing error") { - t.Fatalf("Expected template error, got %v", err) - } -} - -func TestTemplateInspectorMultiple(t *testing.T) { - b := new(bytes.Buffer) - tmpl, err := templates.Parse("{{.DNS}}") - if err != nil { - t.Fatal(err) - } - i := NewTemplateInspector(b, tmpl) - - if err := i.Inspect(testElement{"0.0.0.0"}, nil); err != nil { - t.Fatal(err) - } - if err := i.Inspect(testElement{"1.1.1.1"}, nil); err != nil { - t.Fatal(err) - } - - if err := i.Flush(); err != nil { - t.Fatal(err) - } - if b.String() != "0.0.0.0\n1.1.1.1\n" { - t.Fatalf("Expected `0.0.0.0\\n1.1.1.1\\n`, got `%s`", b.String()) - } -} - -func TestIndentedInspectorDefault(t *testing.T) { - b := new(bytes.Buffer) - i := NewIndentedInspector(b) - if err := i.Inspect(testElement{"0.0.0.0"}, nil); err != nil { - t.Fatal(err) - } - - if err := i.Flush(); err != nil { - t.Fatal(err) - } - - expected := `[ - { - "Dns": "0.0.0.0" - } -] -` - if b.String() != expected { - t.Fatalf("Expected `%s`, got `%s`", expected, b.String()) - } -} - -func TestIndentedInspectorMultiple(t *testing.T) { - b := new(bytes.Buffer) - i := NewIndentedInspector(b) - if err := i.Inspect(testElement{"0.0.0.0"}, nil); err != nil { - t.Fatal(err) - } - - if err := i.Inspect(testElement{"1.1.1.1"}, nil); err != nil { - t.Fatal(err) - } - - if err := i.Flush(); err != nil { - t.Fatal(err) - } - - expected := `[ - { - "Dns": "0.0.0.0" - }, - { - "Dns": "1.1.1.1" - } -] -` - if b.String() != expected { - t.Fatalf("Expected `%s`, got `%s`", expected, b.String()) - } -} - -func TestIndentedInspectorEmpty(t *testing.T) { - b := new(bytes.Buffer) - i := NewIndentedInspector(b) - - if err := i.Flush(); err != nil { - t.Fatal(err) - } - - expected := "[]\n" - if b.String() != expected { - t.Fatalf("Expected `%s`, got `%s`", expected, b.String()) - } -} - -func TestIndentedInspectorRawElements(t *testing.T) { - b := new(bytes.Buffer) - i := NewIndentedInspector(b) - if err := i.Inspect(testElement{"0.0.0.0"}, []byte(`{"Dns": "0.0.0.0", "Node": "0"}`)); err != nil { - t.Fatal(err) - } - - if err := i.Inspect(testElement{"1.1.1.1"}, []byte(`{"Dns": "1.1.1.1", "Node": "1"}`)); err != nil { - t.Fatal(err) - } - - if err := i.Flush(); err != nil { - t.Fatal(err) - } - - expected := `[ - { - "Dns": "0.0.0.0", - "Node": "0" - }, - { - "Dns": "1.1.1.1", - "Node": "1" - } -] -` - if b.String() != expected { - t.Fatalf("Expected `%s`, got `%s`", expected, b.String()) - } -} diff --git a/vendor/github.com/docker/docker/cli/command/network/cmd.go b/vendor/github.com/docker/docker/cli/command/network/cmd.go deleted file mode 100644 index ab8393cde..000000000 --- a/vendor/github.com/docker/docker/cli/command/network/cmd.go +++ /dev/null @@ -1,28 +0,0 @@ -package network - -import ( - "github.com/spf13/cobra" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" -) - -// NewNetworkCommand returns a cobra command for `network` subcommands -func NewNetworkCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "network", - Short: "Manage networks", - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - } - cmd.AddCommand( - newConnectCommand(dockerCli), - newCreateCommand(dockerCli), - newDisconnectCommand(dockerCli), - newInspectCommand(dockerCli), - newListCommand(dockerCli), - newRemoveCommand(dockerCli), - NewPruneCommand(dockerCli), - ) - return cmd -} diff --git a/vendor/github.com/docker/docker/cli/command/network/connect.go b/vendor/github.com/docker/docker/cli/command/network/connect.go deleted file mode 100644 index c4b676e5f..000000000 --- a/vendor/github.com/docker/docker/cli/command/network/connect.go +++ /dev/null @@ -1,64 +0,0 @@ -package network - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/api/types/network" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/opts" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/spf13/cobra" -) - -type connectOptions struct { - network string - container string - ipaddress string - ipv6address string - links opts.ListOpts - aliases []string - linklocalips []string -} - -func newConnectCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := connectOptions{ - links: opts.NewListOpts(runconfigopts.ValidateLink), - } - - cmd := &cobra.Command{ - Use: "connect [OPTIONS] NETWORK CONTAINER", - Short: "Connect a container to a network", - Args: cli.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - opts.network = args[0] - opts.container = args[1] - return runConnect(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.StringVar(&opts.ipaddress, "ip", "", "IP Address") - flags.StringVar(&opts.ipv6address, "ip6", "", "IPv6 Address") - flags.Var(&opts.links, "link", "Add link to another container") - flags.StringSliceVar(&opts.aliases, "alias", []string{}, "Add network-scoped alias for the container") - flags.StringSliceVar(&opts.linklocalips, "link-local-ip", []string{}, "Add a link-local address for the container") - - return cmd -} - -func runConnect(dockerCli *command.DockerCli, opts connectOptions) error { - client := dockerCli.Client() - - epConfig := &network.EndpointSettings{ - IPAMConfig: &network.EndpointIPAMConfig{ - IPv4Address: opts.ipaddress, - IPv6Address: opts.ipv6address, - LinkLocalIPs: opts.linklocalips, - }, - Links: opts.links.GetAll(), - Aliases: opts.aliases, - } - - return client.NetworkConnect(context.Background(), opts.network, opts.container, epConfig) -} diff --git a/vendor/github.com/docker/docker/cli/command/network/create.go b/vendor/github.com/docker/docker/cli/command/network/create.go deleted file mode 100644 index abc494e1e..000000000 --- a/vendor/github.com/docker/docker/cli/command/network/create.go +++ /dev/null @@ -1,226 +0,0 @@ -package network - -import ( - "fmt" - "net" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/network" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/opts" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/spf13/cobra" -) - -type createOptions struct { - name string - driver string - driverOpts opts.MapOpts - labels opts.ListOpts - internal bool - ipv6 bool - attachable bool - - ipamDriver string - ipamSubnet []string - ipamIPRange []string - ipamGateway []string - ipamAux opts.MapOpts - ipamOpt opts.MapOpts -} - -func newCreateCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := createOptions{ - driverOpts: *opts.NewMapOpts(nil, nil), - labels: opts.NewListOpts(runconfigopts.ValidateEnv), - ipamAux: *opts.NewMapOpts(nil, nil), - ipamOpt: *opts.NewMapOpts(nil, nil), - } - - cmd := &cobra.Command{ - Use: "create [OPTIONS] NETWORK", - Short: "Create a network", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.name = args[0] - return runCreate(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.StringVarP(&opts.driver, "driver", "d", "bridge", "Driver to manage the Network") - flags.VarP(&opts.driverOpts, "opt", "o", "Set driver specific options") - flags.Var(&opts.labels, "label", "Set metadata on a network") - flags.BoolVar(&opts.internal, "internal", false, "Restrict external access to the network") - flags.BoolVar(&opts.ipv6, "ipv6", false, "Enable IPv6 networking") - flags.BoolVar(&opts.attachable, "attachable", false, "Enable manual container attachment") - - flags.StringVar(&opts.ipamDriver, "ipam-driver", "default", "IP Address Management Driver") - flags.StringSliceVar(&opts.ipamSubnet, "subnet", []string{}, "Subnet in CIDR format that represents a network segment") - flags.StringSliceVar(&opts.ipamIPRange, "ip-range", []string{}, "Allocate container ip from a sub-range") - flags.StringSliceVar(&opts.ipamGateway, "gateway", []string{}, "IPv4 or IPv6 Gateway for the master subnet") - - flags.Var(&opts.ipamAux, "aux-address", "Auxiliary IPv4 or IPv6 addresses used by Network driver") - flags.Var(&opts.ipamOpt, "ipam-opt", "Set IPAM driver specific options") - - return cmd -} - -func runCreate(dockerCli *command.DockerCli, opts createOptions) error { - client := dockerCli.Client() - - ipamCfg, err := consolidateIpam(opts.ipamSubnet, opts.ipamIPRange, opts.ipamGateway, opts.ipamAux.GetAll()) - if err != nil { - return err - } - - // Construct network create request body - nc := types.NetworkCreate{ - Driver: opts.driver, - Options: opts.driverOpts.GetAll(), - IPAM: &network.IPAM{ - Driver: opts.ipamDriver, - Config: ipamCfg, - Options: opts.ipamOpt.GetAll(), - }, - CheckDuplicate: true, - Internal: opts.internal, - EnableIPv6: opts.ipv6, - Attachable: opts.attachable, - Labels: runconfigopts.ConvertKVStringsToMap(opts.labels.GetAll()), - } - - resp, err := client.NetworkCreate(context.Background(), opts.name, nc) - if err != nil { - return err - } - fmt.Fprintf(dockerCli.Out(), "%s\n", resp.ID) - return nil -} - -// Consolidates the ipam configuration as a group from different related configurations -// user can configure network with multiple non-overlapping subnets and hence it is -// possible to correlate the various related parameters and consolidate them. -// consoidateIpam consolidates subnets, ip-ranges, gateways and auxiliary addresses into -// structured ipam data. -func consolidateIpam(subnets, ranges, gateways []string, auxaddrs map[string]string) ([]network.IPAMConfig, error) { - if len(subnets) < len(ranges) || len(subnets) < len(gateways) { - return nil, fmt.Errorf("every ip-range or gateway must have a corresponding subnet") - } - iData := map[string]*network.IPAMConfig{} - - // Populate non-overlapping subnets into consolidation map - for _, s := range subnets { - for k := range iData { - ok1, err := subnetMatches(s, k) - if err != nil { - return nil, err - } - ok2, err := subnetMatches(k, s) - if err != nil { - return nil, err - } - if ok1 || ok2 { - return nil, fmt.Errorf("multiple overlapping subnet configuration is not supported") - } - } - iData[s] = &network.IPAMConfig{Subnet: s, AuxAddress: map[string]string{}} - } - - // Validate and add valid ip ranges - for _, r := range ranges { - match := false - for _, s := range subnets { - ok, err := subnetMatches(s, r) - if err != nil { - return nil, err - } - if !ok { - continue - } - if iData[s].IPRange != "" { - return nil, fmt.Errorf("cannot configure multiple ranges (%s, %s) on the same subnet (%s)", r, iData[s].IPRange, s) - } - d := iData[s] - d.IPRange = r - match = true - } - if !match { - return nil, fmt.Errorf("no matching subnet for range %s", r) - } - } - - // Validate and add valid gateways - for _, g := range gateways { - match := false - for _, s := range subnets { - ok, err := subnetMatches(s, g) - if err != nil { - return nil, err - } - if !ok { - continue - } - if iData[s].Gateway != "" { - return nil, fmt.Errorf("cannot configure multiple gateways (%s, %s) for the same subnet (%s)", g, iData[s].Gateway, s) - } - d := iData[s] - d.Gateway = g - match = true - } - if !match { - return nil, fmt.Errorf("no matching subnet for gateway %s", g) - } - } - - // Validate and add aux-addresses - for key, aa := range auxaddrs { - match := false - for _, s := range subnets { - ok, err := subnetMatches(s, aa) - if err != nil { - return nil, err - } - if !ok { - continue - } - iData[s].AuxAddress[key] = aa - match = true - } - if !match { - return nil, fmt.Errorf("no matching subnet for aux-address %s", aa) - } - } - - idl := []network.IPAMConfig{} - for _, v := range iData { - idl = append(idl, *v) - } - return idl, nil -} - -func subnetMatches(subnet, data string) (bool, error) { - var ( - ip net.IP - ) - - _, s, err := net.ParseCIDR(subnet) - if err != nil { - return false, fmt.Errorf("Invalid subnet %s : %v", s, err) - } - - if strings.Contains(data, "/") { - ip, _, err = net.ParseCIDR(data) - if err != nil { - return false, fmt.Errorf("Invalid cidr %s : %v", data, err) - } - } else { - ip = net.ParseIP(data) - } - - return s.Contains(ip), nil -} diff --git a/vendor/github.com/docker/docker/cli/command/network/disconnect.go b/vendor/github.com/docker/docker/cli/command/network/disconnect.go deleted file mode 100644 index c9d9c14a1..000000000 --- a/vendor/github.com/docker/docker/cli/command/network/disconnect.go +++ /dev/null @@ -1,41 +0,0 @@ -package network - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type disconnectOptions struct { - network string - container string - force bool -} - -func newDisconnectCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := disconnectOptions{} - - cmd := &cobra.Command{ - Use: "disconnect [OPTIONS] NETWORK CONTAINER", - Short: "Disconnect a container from a network", - Args: cli.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - opts.network = args[0] - opts.container = args[1] - return runDisconnect(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.force, "force", "f", false, "Force the container to disconnect from a network") - - return cmd -} - -func runDisconnect(dockerCli *command.DockerCli, opts disconnectOptions) error { - client := dockerCli.Client() - - return client.NetworkDisconnect(context.Background(), opts.network, opts.container, opts.force) -} diff --git a/vendor/github.com/docker/docker/cli/command/network/inspect.go b/vendor/github.com/docker/docker/cli/command/network/inspect.go deleted file mode 100644 index 1a86855f7..000000000 --- a/vendor/github.com/docker/docker/cli/command/network/inspect.go +++ /dev/null @@ -1,45 +0,0 @@ -package network - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/inspect" - "github.com/spf13/cobra" -) - -type inspectOptions struct { - format string - names []string -} - -func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts inspectOptions - - cmd := &cobra.Command{ - Use: "inspect [OPTIONS] NETWORK [NETWORK...]", - Short: "Display detailed information on one or more networks", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.names = args - return runInspect(dockerCli, opts) - }, - } - - cmd.Flags().StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template") - - return cmd -} - -func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error { - client := dockerCli.Client() - - ctx := context.Background() - - getNetFunc := func(name string) (interface{}, []byte, error) { - return client.NetworkInspectWithRaw(ctx, name) - } - - return inspect.Inspect(dockerCli.Out(), opts.names, opts.format, getNetFunc) -} diff --git a/vendor/github.com/docker/docker/cli/command/network/list.go b/vendor/github.com/docker/docker/cli/command/network/list.go deleted file mode 100644 index 1a5d28510..000000000 --- a/vendor/github.com/docker/docker/cli/command/network/list.go +++ /dev/null @@ -1,76 +0,0 @@ -package network - -import ( - "sort" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/formatter" - "github.com/docker/docker/opts" - "github.com/spf13/cobra" -) - -type byNetworkName []types.NetworkResource - -func (r byNetworkName) Len() int { return len(r) } -func (r byNetworkName) Swap(i, j int) { r[i], r[j] = r[j], r[i] } -func (r byNetworkName) Less(i, j int) bool { return r[i].Name < r[j].Name } - -type listOptions struct { - quiet bool - noTrunc bool - format string - filter opts.FilterOpt -} - -func newListCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := listOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "ls [OPTIONS]", - Aliases: []string{"list"}, - Short: "List networks", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runList(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display network IDs") - flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate the output") - flags.StringVar(&opts.format, "format", "", "Pretty-print networks using a Go template") - flags.VarP(&opts.filter, "filter", "f", "Provide filter values (e.g. 'driver=bridge')") - - return cmd -} - -func runList(dockerCli *command.DockerCli, opts listOptions) error { - client := dockerCli.Client() - options := types.NetworkListOptions{Filters: opts.filter.Value()} - networkResources, err := client.NetworkList(context.Background(), options) - if err != nil { - return err - } - - format := opts.format - if len(format) == 0 { - if len(dockerCli.ConfigFile().NetworksFormat) > 0 && !opts.quiet { - format = dockerCli.ConfigFile().NetworksFormat - } else { - format = formatter.TableFormatKey - } - } - - sort.Sort(byNetworkName(networkResources)) - - networksCtx := formatter.Context{ - Output: dockerCli.Out(), - Format: formatter.NewNetworkFormat(format, opts.quiet), - Trunc: !opts.noTrunc, - } - return formatter.NetworkWrite(networksCtx, networkResources) -} diff --git a/vendor/github.com/docker/docker/cli/command/network/prune.go b/vendor/github.com/docker/docker/cli/command/network/prune.go deleted file mode 100644 index 9f1979e6b..000000000 --- a/vendor/github.com/docker/docker/cli/command/network/prune.go +++ /dev/null @@ -1,73 +0,0 @@ -package network - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type pruneOptions struct { - force bool -} - -// NewPruneCommand returns a new cobra prune command for networks -func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts pruneOptions - - cmd := &cobra.Command{ - Use: "prune [OPTIONS]", - Short: "Remove all unused networks", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - output, err := runPrune(dockerCli, opts) - if err != nil { - return err - } - if output != "" { - fmt.Fprintln(dockerCli.Out(), output) - } - return nil - }, - Tags: map[string]string{"version": "1.25"}, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.force, "force", "f", false, "Do not prompt for confirmation") - - return cmd -} - -const warning = `WARNING! This will remove all networks not used by at least one container. -Are you sure you want to continue?` - -func runPrune(dockerCli *command.DockerCli, opts pruneOptions) (output string, err error) { - if !opts.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), warning) { - return - } - - report, err := dockerCli.Client().NetworksPrune(context.Background(), filters.Args{}) - if err != nil { - return - } - - if len(report.NetworksDeleted) > 0 { - output = "Deleted Networks:\n" - for _, id := range report.NetworksDeleted { - output += id + "\n" - } - } - - return -} - -// RunPrune calls the Network Prune API -// This returns the amount of space reclaimed and a detailed output string -func RunPrune(dockerCli *command.DockerCli) (uint64, string, error) { - output, err := runPrune(dockerCli, pruneOptions{force: true}) - return 0, output, err -} diff --git a/vendor/github.com/docker/docker/cli/command/network/remove.go b/vendor/github.com/docker/docker/cli/command/network/remove.go deleted file mode 100644 index 2034b8709..000000000 --- a/vendor/github.com/docker/docker/cli/command/network/remove.go +++ /dev/null @@ -1,43 +0,0 @@ -package network - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { - return &cobra.Command{ - Use: "rm NETWORK [NETWORK...]", - Aliases: []string{"remove"}, - Short: "Remove one or more networks", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runRemove(dockerCli, args) - }, - } -} - -func runRemove(dockerCli *command.DockerCli, networks []string) error { - client := dockerCli.Client() - ctx := context.Background() - status := 0 - - for _, name := range networks { - if err := client.NetworkRemove(ctx, name); err != nil { - fmt.Fprintf(dockerCli.Err(), "%s\n", err) - status = 1 - continue - } - fmt.Fprintf(dockerCli.Out(), "%s\n", name) - } - - if status != 0 { - return cli.StatusError{StatusCode: status} - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/node/cmd.go b/vendor/github.com/docker/docker/cli/command/node/cmd.go deleted file mode 100644 index e71b9199a..000000000 --- a/vendor/github.com/docker/docker/cli/command/node/cmd.go +++ /dev/null @@ -1,43 +0,0 @@ -package node - -import ( - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - apiclient "github.com/docker/docker/client" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -// NewNodeCommand returns a cobra command for `node` subcommands -func NewNodeCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "node", - Short: "Manage Swarm nodes", - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - } - cmd.AddCommand( - newDemoteCommand(dockerCli), - newInspectCommand(dockerCli), - newListCommand(dockerCli), - newPromoteCommand(dockerCli), - newRemoveCommand(dockerCli), - newPsCommand(dockerCli), - newUpdateCommand(dockerCli), - ) - return cmd -} - -// Reference returns the reference of a node. The special value "self" for a node -// reference is mapped to the current node, hence the node ID is retrieved using -// the `/info` endpoint. -func Reference(ctx context.Context, client apiclient.APIClient, ref string) (string, error) { - if ref == "self" { - info, err := client.Info(ctx) - if err != nil { - return "", err - } - return info.Swarm.NodeID, nil - } - return ref, nil -} diff --git a/vendor/github.com/docker/docker/cli/command/node/demote.go b/vendor/github.com/docker/docker/cli/command/node/demote.go deleted file mode 100644 index 33f86c649..000000000 --- a/vendor/github.com/docker/docker/cli/command/node/demote.go +++ /dev/null @@ -1,36 +0,0 @@ -package node - -import ( - "fmt" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -func newDemoteCommand(dockerCli *command.DockerCli) *cobra.Command { - return &cobra.Command{ - Use: "demote NODE [NODE...]", - Short: "Demote one or more nodes from manager in the swarm", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runDemote(dockerCli, args) - }, - } -} - -func runDemote(dockerCli *command.DockerCli, nodes []string) error { - demote := func(node *swarm.Node) error { - if node.Spec.Role == swarm.NodeRoleWorker { - fmt.Fprintf(dockerCli.Out(), "Node %s is already a worker.\n", node.ID) - return errNoRoleChange - } - node.Spec.Role = swarm.NodeRoleWorker - return nil - } - success := func(nodeID string) { - fmt.Fprintf(dockerCli.Out(), "Manager %s demoted in the swarm.\n", nodeID) - } - return updateNodes(dockerCli, nodes, demote, success) -} diff --git a/vendor/github.com/docker/docker/cli/command/node/inspect.go b/vendor/github.com/docker/docker/cli/command/node/inspect.go deleted file mode 100644 index fde70185f..000000000 --- a/vendor/github.com/docker/docker/cli/command/node/inspect.go +++ /dev/null @@ -1,144 +0,0 @@ -package node - -import ( - "fmt" - "io" - "sort" - "strings" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/inspect" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/go-units" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type inspectOptions struct { - nodeIds []string - format string - pretty bool -} - -func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts inspectOptions - - cmd := &cobra.Command{ - Use: "inspect [OPTIONS] self|NODE [NODE...]", - Short: "Display detailed information on one or more nodes", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.nodeIds = args - return runInspect(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template") - flags.BoolVar(&opts.pretty, "pretty", false, "Print the information in a human friendly format.") - return cmd -} - -func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error { - client := dockerCli.Client() - ctx := context.Background() - getRef := func(ref string) (interface{}, []byte, error) { - nodeRef, err := Reference(ctx, client, ref) - if err != nil { - return nil, nil, err - } - node, _, err := client.NodeInspectWithRaw(ctx, nodeRef) - return node, nil, err - } - - if !opts.pretty { - return inspect.Inspect(dockerCli.Out(), opts.nodeIds, opts.format, getRef) - } - return printHumanFriendly(dockerCli.Out(), opts.nodeIds, getRef) -} - -func printHumanFriendly(out io.Writer, refs []string, getRef inspect.GetRefFunc) error { - for idx, ref := range refs { - obj, _, err := getRef(ref) - if err != nil { - return err - } - printNode(out, obj.(swarm.Node)) - - // TODO: better way to do this? - // print extra space between objects, but not after the last one - if idx+1 != len(refs) { - fmt.Fprintf(out, "\n\n") - } else { - fmt.Fprintf(out, "\n") - } - } - return nil -} - -// TODO: use a template -func printNode(out io.Writer, node swarm.Node) { - fmt.Fprintf(out, "ID:\t\t\t%s\n", node.ID) - ioutils.FprintfIfNotEmpty(out, "Name:\t\t\t%s\n", node.Spec.Name) - if node.Spec.Labels != nil { - fmt.Fprintln(out, "Labels:") - for k, v := range node.Spec.Labels { - fmt.Fprintf(out, " - %s = %s\n", k, v) - } - } - - ioutils.FprintfIfNotEmpty(out, "Hostname:\t\t%s\n", node.Description.Hostname) - fmt.Fprintf(out, "Joined at:\t\t%s\n", command.PrettyPrint(node.CreatedAt)) - fmt.Fprintln(out, "Status:") - fmt.Fprintf(out, " State:\t\t\t%s\n", command.PrettyPrint(node.Status.State)) - ioutils.FprintfIfNotEmpty(out, " Message:\t\t%s\n", command.PrettyPrint(node.Status.Message)) - fmt.Fprintf(out, " Availability:\t\t%s\n", command.PrettyPrint(node.Spec.Availability)) - ioutils.FprintfIfNotEmpty(out, " Address:\t\t%s\n", command.PrettyPrint(node.Status.Addr)) - - if node.ManagerStatus != nil { - fmt.Fprintln(out, "Manager Status:") - fmt.Fprintf(out, " Address:\t\t%s\n", node.ManagerStatus.Addr) - fmt.Fprintf(out, " Raft Status:\t\t%s\n", command.PrettyPrint(node.ManagerStatus.Reachability)) - leader := "No" - if node.ManagerStatus.Leader { - leader = "Yes" - } - fmt.Fprintf(out, " Leader:\t\t%s\n", leader) - } - - fmt.Fprintln(out, "Platform:") - fmt.Fprintf(out, " Operating System:\t%s\n", node.Description.Platform.OS) - fmt.Fprintf(out, " Architecture:\t\t%s\n", node.Description.Platform.Architecture) - - fmt.Fprintln(out, "Resources:") - fmt.Fprintf(out, " CPUs:\t\t\t%d\n", node.Description.Resources.NanoCPUs/1e9) - fmt.Fprintf(out, " Memory:\t\t%s\n", units.BytesSize(float64(node.Description.Resources.MemoryBytes))) - - var pluginTypes []string - pluginNamesByType := map[string][]string{} - for _, p := range node.Description.Engine.Plugins { - // append to pluginTypes only if not done previously - if _, ok := pluginNamesByType[p.Type]; !ok { - pluginTypes = append(pluginTypes, p.Type) - } - pluginNamesByType[p.Type] = append(pluginNamesByType[p.Type], p.Name) - } - - if len(pluginTypes) > 0 { - fmt.Fprintln(out, "Plugins:") - sort.Strings(pluginTypes) // ensure stable output - for _, pluginType := range pluginTypes { - fmt.Fprintf(out, " %s:\t\t%s\n", pluginType, strings.Join(pluginNamesByType[pluginType], ", ")) - } - } - fmt.Fprintf(out, "Engine Version:\t\t%s\n", node.Description.Engine.EngineVersion) - - if len(node.Description.Engine.Labels) != 0 { - fmt.Fprintln(out, "Engine Labels:") - for k, v := range node.Description.Engine.Labels { - fmt.Fprintf(out, " - %s = %s\n", k, v) - } - } -} diff --git a/vendor/github.com/docker/docker/cli/command/node/list.go b/vendor/github.com/docker/docker/cli/command/node/list.go deleted file mode 100644 index 9cacdcf44..000000000 --- a/vendor/github.com/docker/docker/cli/command/node/list.go +++ /dev/null @@ -1,115 +0,0 @@ -package node - -import ( - "fmt" - "io" - "text/tabwriter" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/opts" - "github.com/spf13/cobra" -) - -const ( - listItemFmt = "%s\t%s\t%s\t%s\t%s\n" -) - -type listOptions struct { - quiet bool - filter opts.FilterOpt -} - -func newListCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := listOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "ls [OPTIONS]", - Aliases: []string{"list"}, - Short: "List nodes in the swarm", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runList(dockerCli, opts) - }, - } - flags := cmd.Flags() - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display IDs") - flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided") - - return cmd -} - -func runList(dockerCli *command.DockerCli, opts listOptions) error { - client := dockerCli.Client() - out := dockerCli.Out() - ctx := context.Background() - - nodes, err := client.NodeList( - ctx, - types.NodeListOptions{Filters: opts.filter.Value()}) - if err != nil { - return err - } - - if len(nodes) > 0 && !opts.quiet { - // only non-empty nodes and not quiet, should we call /info api - info, err := client.Info(ctx) - if err != nil { - return err - } - printTable(out, nodes, info) - } else if !opts.quiet { - // no nodes and not quiet, print only one line with columns ID, HOSTNAME, ... - printTable(out, nodes, types.Info{}) - } else { - printQuiet(out, nodes) - } - - return nil -} - -func printTable(out io.Writer, nodes []swarm.Node, info types.Info) { - writer := tabwriter.NewWriter(out, 0, 4, 2, ' ', 0) - - // Ignore flushing errors - defer writer.Flush() - - fmt.Fprintf(writer, listItemFmt, "ID", "HOSTNAME", "STATUS", "AVAILABILITY", "MANAGER STATUS") - for _, node := range nodes { - name := node.Description.Hostname - availability := string(node.Spec.Availability) - - reachability := "" - if node.ManagerStatus != nil { - if node.ManagerStatus.Leader { - reachability = "Leader" - } else { - reachability = string(node.ManagerStatus.Reachability) - } - } - - ID := node.ID - if node.ID == info.Swarm.NodeID { - ID = ID + " *" - } - - fmt.Fprintf( - writer, - listItemFmt, - ID, - name, - command.PrettyPrint(string(node.Status.State)), - command.PrettyPrint(availability), - command.PrettyPrint(reachability)) - } -} - -func printQuiet(out io.Writer, nodes []swarm.Node) { - for _, node := range nodes { - fmt.Fprintln(out, node.ID) - } -} diff --git a/vendor/github.com/docker/docker/cli/command/node/opts.go b/vendor/github.com/docker/docker/cli/command/node/opts.go deleted file mode 100644 index 7e6c55d48..000000000 --- a/vendor/github.com/docker/docker/cli/command/node/opts.go +++ /dev/null @@ -1,60 +0,0 @@ -package node - -import ( - "fmt" - "strings" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/opts" - runconfigopts "github.com/docker/docker/runconfig/opts" -) - -type nodeOptions struct { - annotations - role string - availability string -} - -type annotations struct { - name string - labels opts.ListOpts -} - -func newNodeOptions() *nodeOptions { - return &nodeOptions{ - annotations: annotations{ - labels: opts.NewListOpts(nil), - }, - } -} - -func (opts *nodeOptions) ToNodeSpec() (swarm.NodeSpec, error) { - var spec swarm.NodeSpec - - spec.Annotations.Name = opts.annotations.name - spec.Annotations.Labels = runconfigopts.ConvertKVStringsToMap(opts.annotations.labels.GetAll()) - - switch swarm.NodeRole(strings.ToLower(opts.role)) { - case swarm.NodeRoleWorker: - spec.Role = swarm.NodeRoleWorker - case swarm.NodeRoleManager: - spec.Role = swarm.NodeRoleManager - case "": - default: - return swarm.NodeSpec{}, fmt.Errorf("invalid role %q, only worker and manager are supported", opts.role) - } - - switch swarm.NodeAvailability(strings.ToLower(opts.availability)) { - case swarm.NodeAvailabilityActive: - spec.Availability = swarm.NodeAvailabilityActive - case swarm.NodeAvailabilityPause: - spec.Availability = swarm.NodeAvailabilityPause - case swarm.NodeAvailabilityDrain: - spec.Availability = swarm.NodeAvailabilityDrain - case "": - default: - return swarm.NodeSpec{}, fmt.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability) - } - - return spec, nil -} diff --git a/vendor/github.com/docker/docker/cli/command/node/promote.go b/vendor/github.com/docker/docker/cli/command/node/promote.go deleted file mode 100644 index f47d783f4..000000000 --- a/vendor/github.com/docker/docker/cli/command/node/promote.go +++ /dev/null @@ -1,36 +0,0 @@ -package node - -import ( - "fmt" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -func newPromoteCommand(dockerCli *command.DockerCli) *cobra.Command { - return &cobra.Command{ - Use: "promote NODE [NODE...]", - Short: "Promote one or more nodes to manager in the swarm", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runPromote(dockerCli, args) - }, - } -} - -func runPromote(dockerCli *command.DockerCli, nodes []string) error { - promote := func(node *swarm.Node) error { - if node.Spec.Role == swarm.NodeRoleManager { - fmt.Fprintf(dockerCli.Out(), "Node %s is already a manager.\n", node.ID) - return errNoRoleChange - } - node.Spec.Role = swarm.NodeRoleManager - return nil - } - success := func(nodeID string) { - fmt.Fprintf(dockerCli.Out(), "Node %s promoted to a manager in the swarm.\n", nodeID) - } - return updateNodes(dockerCli, nodes, promote, success) -} diff --git a/vendor/github.com/docker/docker/cli/command/node/ps.go b/vendor/github.com/docker/docker/cli/command/node/ps.go deleted file mode 100644 index a034721d2..000000000 --- a/vendor/github.com/docker/docker/cli/command/node/ps.go +++ /dev/null @@ -1,93 +0,0 @@ -package node - -import ( - "fmt" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/idresolver" - "github.com/docker/docker/cli/command/task" - "github.com/docker/docker/opts" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type psOptions struct { - nodeIDs []string - noResolve bool - noTrunc bool - filter opts.FilterOpt -} - -func newPsCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := psOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "ps [OPTIONS] [NODE...]", - Short: "List tasks running on one or more nodes, defaults to current node", - Args: cli.RequiresMinArgs(0), - RunE: func(cmd *cobra.Command, args []string) error { - opts.nodeIDs = []string{"self"} - - if len(args) != 0 { - opts.nodeIDs = args - } - - return runPs(dockerCli, opts) - }, - } - flags := cmd.Flags() - flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate output") - flags.BoolVar(&opts.noResolve, "no-resolve", false, "Do not map IDs to Names") - flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided") - - return cmd -} - -func runPs(dockerCli *command.DockerCli, opts psOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - var ( - errs []string - tasks []swarm.Task - ) - - for _, nodeID := range opts.nodeIDs { - nodeRef, err := Reference(ctx, client, nodeID) - if err != nil { - errs = append(errs, err.Error()) - continue - } - - node, _, err := client.NodeInspectWithRaw(ctx, nodeRef) - if err != nil { - errs = append(errs, err.Error()) - continue - } - - filter := opts.filter.Value() - filter.Add("node", node.ID) - - nodeTasks, err := client.TaskList(ctx, types.TaskListOptions{Filters: filter}) - if err != nil { - errs = append(errs, err.Error()) - continue - } - - tasks = append(tasks, nodeTasks...) - } - - if err := task.Print(dockerCli, ctx, tasks, idresolver.New(client, opts.noResolve), opts.noTrunc); err != nil { - errs = append(errs, err.Error()) - } - - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/node/remove.go b/vendor/github.com/docker/docker/cli/command/node/remove.go deleted file mode 100644 index 19b4a9663..000000000 --- a/vendor/github.com/docker/docker/cli/command/node/remove.go +++ /dev/null @@ -1,56 +0,0 @@ -package node - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type removeOptions struct { - force bool -} - -func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := removeOptions{} - - cmd := &cobra.Command{ - Use: "rm [OPTIONS] NODE [NODE...]", - Aliases: []string{"remove"}, - Short: "Remove one or more nodes from the swarm", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runRemove(dockerCli, args, opts) - }, - } - flags := cmd.Flags() - flags.BoolVarP(&opts.force, "force", "f", false, "Force remove a node from the swarm") - return cmd -} - -func runRemove(dockerCli *command.DockerCli, args []string, opts removeOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - var errs []string - - for _, nodeID := range args { - err := client.NodeRemove(ctx, nodeID, types.NodeRemoveOptions{Force: opts.force}) - if err != nil { - errs = append(errs, err.Error()) - continue - } - fmt.Fprintf(dockerCli.Out(), "%s\n", nodeID) - } - - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/node/update.go b/vendor/github.com/docker/docker/cli/command/node/update.go deleted file mode 100644 index 65339e138..000000000 --- a/vendor/github.com/docker/docker/cli/command/node/update.go +++ /dev/null @@ -1,121 +0,0 @@ -package node - -import ( - "errors" - "fmt" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/opts" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "golang.org/x/net/context" -) - -var ( - errNoRoleChange = errors.New("role was already set to the requested value") -) - -func newUpdateCommand(dockerCli *command.DockerCli) *cobra.Command { - nodeOpts := newNodeOptions() - - cmd := &cobra.Command{ - Use: "update [OPTIONS] NODE", - Short: "Update a node", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runUpdate(dockerCli, cmd.Flags(), args[0]) - }, - } - - flags := cmd.Flags() - flags.StringVar(&nodeOpts.role, flagRole, "", "Role of the node (worker/manager)") - flags.StringVar(&nodeOpts.availability, flagAvailability, "", "Availability of the node (active/pause/drain)") - flags.Var(&nodeOpts.annotations.labels, flagLabelAdd, "Add or update a node label (key=value)") - labelKeys := opts.NewListOpts(nil) - flags.Var(&labelKeys, flagLabelRemove, "Remove a node label if exists") - return cmd -} - -func runUpdate(dockerCli *command.DockerCli, flags *pflag.FlagSet, nodeID string) error { - success := func(_ string) { - fmt.Fprintln(dockerCli.Out(), nodeID) - } - return updateNodes(dockerCli, []string{nodeID}, mergeNodeUpdate(flags), success) -} - -func updateNodes(dockerCli *command.DockerCli, nodes []string, mergeNode func(node *swarm.Node) error, success func(nodeID string)) error { - client := dockerCli.Client() - ctx := context.Background() - - for _, nodeID := range nodes { - node, _, err := client.NodeInspectWithRaw(ctx, nodeID) - if err != nil { - return err - } - - err = mergeNode(&node) - if err != nil { - if err == errNoRoleChange { - continue - } - return err - } - err = client.NodeUpdate(ctx, node.ID, node.Version, node.Spec) - if err != nil { - return err - } - success(nodeID) - } - return nil -} - -func mergeNodeUpdate(flags *pflag.FlagSet) func(*swarm.Node) error { - return func(node *swarm.Node) error { - spec := &node.Spec - - if flags.Changed(flagRole) { - str, err := flags.GetString(flagRole) - if err != nil { - return err - } - spec.Role = swarm.NodeRole(str) - } - if flags.Changed(flagAvailability) { - str, err := flags.GetString(flagAvailability) - if err != nil { - return err - } - spec.Availability = swarm.NodeAvailability(str) - } - if spec.Annotations.Labels == nil { - spec.Annotations.Labels = make(map[string]string) - } - if flags.Changed(flagLabelAdd) { - labels := flags.Lookup(flagLabelAdd).Value.(*opts.ListOpts).GetAll() - for k, v := range runconfigopts.ConvertKVStringsToMap(labels) { - spec.Annotations.Labels[k] = v - } - } - if flags.Changed(flagLabelRemove) { - keys := flags.Lookup(flagLabelRemove).Value.(*opts.ListOpts).GetAll() - for _, k := range keys { - // if a key doesn't exist, fail the command explicitly - if _, exists := spec.Annotations.Labels[k]; !exists { - return fmt.Errorf("key %s doesn't exist in node's labels", k) - } - delete(spec.Annotations.Labels, k) - } - } - return nil - } -} - -const ( - flagRole = "role" - flagAvailability = "availability" - flagLabelAdd = "label-add" - flagLabelRemove = "label-rm" -) diff --git a/vendor/github.com/docker/docker/cli/command/out.go b/vendor/github.com/docker/docker/cli/command/out.go deleted file mode 100644 index 85718d7ac..000000000 --- a/vendor/github.com/docker/docker/cli/command/out.go +++ /dev/null @@ -1,69 +0,0 @@ -package command - -import ( - "io" - "os" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/term" -) - -// OutStream is an output stream used by the DockerCli to write normal program -// output. -type OutStream struct { - out io.Writer - fd uintptr - isTerminal bool - state *term.State -} - -func (o *OutStream) Write(p []byte) (int, error) { - return o.out.Write(p) -} - -// FD returns the file descriptor number for this stream -func (o *OutStream) FD() uintptr { - return o.fd -} - -// IsTerminal returns true if this stream is connected to a terminal -func (o *OutStream) IsTerminal() bool { - return o.isTerminal -} - -// SetRawTerminal sets raw mode on the output terminal -func (o *OutStream) SetRawTerminal() (err error) { - if os.Getenv("NORAW") != "" || !o.isTerminal { - return nil - } - o.state, err = term.SetRawTerminalOutput(o.fd) - return err -} - -// RestoreTerminal restores normal mode to the terminal -func (o *OutStream) RestoreTerminal() { - if o.state != nil { - term.RestoreTerminal(o.fd, o.state) - } -} - -// GetTtySize returns the height and width in characters of the tty -func (o *OutStream) GetTtySize() (uint, uint) { - if !o.isTerminal { - return 0, 0 - } - ws, err := term.GetWinsize(o.fd) - if err != nil { - logrus.Debugf("Error getting size: %s", err) - if ws == nil { - return 0, 0 - } - } - return uint(ws.Height), uint(ws.Width) -} - -// NewOutStream returns a new OutStream object from a Writer -func NewOutStream(out io.Writer) *OutStream { - fd, isTerminal := term.GetFdInfo(out) - return &OutStream{out: out, fd: fd, isTerminal: isTerminal} -} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/cmd.go b/vendor/github.com/docker/docker/cli/command/plugin/cmd.go deleted file mode 100644 index 92c990a97..000000000 --- a/vendor/github.com/docker/docker/cli/command/plugin/cmd.go +++ /dev/null @@ -1,31 +0,0 @@ -package plugin - -import ( - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -// NewPluginCommand returns a cobra command for `plugin` subcommands -func NewPluginCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "plugin", - Short: "Manage plugins", - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - } - - cmd.AddCommand( - newDisableCommand(dockerCli), - newEnableCommand(dockerCli), - newInspectCommand(dockerCli), - newInstallCommand(dockerCli), - newListCommand(dockerCli), - newRemoveCommand(dockerCli), - newSetCommand(dockerCli), - newPushCommand(dockerCli), - newCreateCommand(dockerCli), - newUpgradeCommand(dockerCli), - ) - return cmd -} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/create.go b/vendor/github.com/docker/docker/cli/command/plugin/create.go deleted file mode 100644 index 2aab1e9e4..000000000 --- a/vendor/github.com/docker/docker/cli/command/plugin/create.go +++ /dev/null @@ -1,125 +0,0 @@ -package plugin - -import ( - "encoding/json" - "fmt" - "io" - "os" - "path/filepath" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/reference" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -// validateTag checks if the given repoName can be resolved. -func validateTag(rawRepo string) error { - _, err := reference.ParseNamed(rawRepo) - - return err -} - -// validateConfig ensures that a valid config.json is available in the given path -func validateConfig(path string) error { - dt, err := os.Open(filepath.Join(path, "config.json")) - if err != nil { - return err - } - - m := types.PluginConfig{} - err = json.NewDecoder(dt).Decode(&m) - dt.Close() - - return err -} - -// validateContextDir validates the given dir and returns abs path on success. -func validateContextDir(contextDir string) (string, error) { - absContextDir, err := filepath.Abs(contextDir) - - stat, err := os.Lstat(absContextDir) - if err != nil { - return "", err - } - - if !stat.IsDir() { - return "", fmt.Errorf("context must be a directory") - } - - return absContextDir, nil -} - -type pluginCreateOptions struct { - repoName string - context string - compress bool -} - -func newCreateCommand(dockerCli *command.DockerCli) *cobra.Command { - options := pluginCreateOptions{} - - cmd := &cobra.Command{ - Use: "create [OPTIONS] PLUGIN PLUGIN-DATA-DIR", - Short: "Create a plugin from a rootfs and configuration. Plugin data directory must contain config.json and rootfs directory.", - Args: cli.RequiresMinArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - options.repoName = args[0] - options.context = args[1] - return runCreate(dockerCli, options) - }, - } - - flags := cmd.Flags() - - flags.BoolVar(&options.compress, "compress", false, "Compress the context using gzip") - - return cmd -} - -func runCreate(dockerCli *command.DockerCli, options pluginCreateOptions) error { - var ( - createCtx io.ReadCloser - err error - ) - - if err := validateTag(options.repoName); err != nil { - return err - } - - absContextDir, err := validateContextDir(options.context) - if err != nil { - return err - } - - if err := validateConfig(options.context); err != nil { - return err - } - - compression := archive.Uncompressed - if options.compress { - logrus.Debugf("compression enabled") - compression = archive.Gzip - } - - createCtx, err = archive.TarWithOptions(absContextDir, &archive.TarOptions{ - Compression: compression, - }) - - if err != nil { - return err - } - - ctx := context.Background() - - createOptions := types.PluginCreateOptions{RepoName: options.repoName} - if err = dockerCli.Client().PluginCreate(ctx, createCtx, createOptions); err != nil { - return err - } - fmt.Fprintln(dockerCli.Out(), options.repoName) - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/disable.go b/vendor/github.com/docker/docker/cli/command/plugin/disable.go deleted file mode 100644 index 07b0ec228..000000000 --- a/vendor/github.com/docker/docker/cli/command/plugin/disable.go +++ /dev/null @@ -1,36 +0,0 @@ -package plugin - -import ( - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -func newDisableCommand(dockerCli *command.DockerCli) *cobra.Command { - var force bool - - cmd := &cobra.Command{ - Use: "disable [OPTIONS] PLUGIN", - Short: "Disable a plugin", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runDisable(dockerCli, args[0], force) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&force, "force", "f", false, "Force the disable of an active plugin") - return cmd -} - -func runDisable(dockerCli *command.DockerCli, name string, force bool) error { - if err := dockerCli.Client().PluginDisable(context.Background(), name, types.PluginDisableOptions{Force: force}); err != nil { - return err - } - fmt.Fprintln(dockerCli.Out(), name) - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/enable.go b/vendor/github.com/docker/docker/cli/command/plugin/enable.go deleted file mode 100644 index 77762f402..000000000 --- a/vendor/github.com/docker/docker/cli/command/plugin/enable.go +++ /dev/null @@ -1,47 +0,0 @@ -package plugin - -import ( - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type enableOpts struct { - timeout int - name string -} - -func newEnableCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts enableOpts - - cmd := &cobra.Command{ - Use: "enable [OPTIONS] PLUGIN", - Short: "Enable a plugin", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.name = args[0] - return runEnable(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.IntVar(&opts.timeout, "timeout", 0, "HTTP client timeout (in seconds)") - return cmd -} - -func runEnable(dockerCli *command.DockerCli, opts *enableOpts) error { - name := opts.name - if opts.timeout < 0 { - return fmt.Errorf("negative timeout %d is invalid", opts.timeout) - } - - if err := dockerCli.Client().PluginEnable(context.Background(), name, types.PluginEnableOptions{Timeout: opts.timeout}); err != nil { - return err - } - fmt.Fprintln(dockerCli.Out(), name) - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/inspect.go b/vendor/github.com/docker/docker/cli/command/plugin/inspect.go deleted file mode 100644 index c2c7a0d6b..000000000 --- a/vendor/github.com/docker/docker/cli/command/plugin/inspect.go +++ /dev/null @@ -1,42 +0,0 @@ -package plugin - -import ( - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/inspect" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type inspectOptions struct { - pluginNames []string - format string -} - -func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts inspectOptions - - cmd := &cobra.Command{ - Use: "inspect [OPTIONS] PLUGIN [PLUGIN...]", - Short: "Display detailed information on one or more plugins", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.pluginNames = args - return runInspect(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template") - return cmd -} - -func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error { - client := dockerCli.Client() - ctx := context.Background() - getRef := func(ref string) (interface{}, []byte, error) { - return client.PluginInspectWithRaw(ctx, ref) - } - - return inspect.Inspect(dockerCli.Out(), opts.pluginNames, opts.format, getRef) -} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/install.go b/vendor/github.com/docker/docker/cli/command/plugin/install.go deleted file mode 100644 index 2c3170c54..000000000 --- a/vendor/github.com/docker/docker/cli/command/plugin/install.go +++ /dev/null @@ -1,208 +0,0 @@ -package plugin - -import ( - "bufio" - "errors" - "fmt" - "strings" - - distreference "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/image" - "github.com/docker/docker/pkg/jsonmessage" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "golang.org/x/net/context" -) - -type pluginOptions struct { - remote string - localName string - grantPerms bool - disable bool - args []string - skipRemoteCheck bool -} - -func loadPullFlags(opts *pluginOptions, flags *pflag.FlagSet) { - flags.BoolVar(&opts.grantPerms, "grant-all-permissions", false, "Grant all permissions necessary to run the plugin") - command.AddTrustedFlags(flags, true) -} - -func newInstallCommand(dockerCli *command.DockerCli) *cobra.Command { - var options pluginOptions - cmd := &cobra.Command{ - Use: "install [OPTIONS] PLUGIN [KEY=VALUE...]", - Short: "Install a plugin", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - options.remote = args[0] - if len(args) > 1 { - options.args = args[1:] - } - return runInstall(dockerCli, options) - }, - } - - flags := cmd.Flags() - loadPullFlags(&options, flags) - flags.BoolVar(&options.disable, "disable", false, "Do not enable the plugin on install") - flags.StringVar(&options.localName, "alias", "", "Local name for plugin") - return cmd -} - -func getRepoIndexFromUnnormalizedRef(ref distreference.Named) (*registrytypes.IndexInfo, error) { - named, err := reference.ParseNamed(ref.Name()) - if err != nil { - return nil, err - } - - repoInfo, err := registry.ParseRepositoryInfo(named) - if err != nil { - return nil, err - } - - return repoInfo.Index, nil -} - -type pluginRegistryService struct { - registry.Service -} - -func (s pluginRegistryService) ResolveRepository(name reference.Named) (repoInfo *registry.RepositoryInfo, err error) { - repoInfo, err = s.Service.ResolveRepository(name) - if repoInfo != nil { - repoInfo.Class = "plugin" - } - return -} - -func newRegistryService() registry.Service { - return pluginRegistryService{ - Service: registry.NewService(registry.ServiceOptions{V2Only: true}), - } -} - -func buildPullConfig(ctx context.Context, dockerCli *command.DockerCli, opts pluginOptions, cmdName string) (types.PluginInstallOptions, error) { - // Parse name using distribution reference package to support name - // containing both tag and digest. Names with both tag and digest - // will be treated by the daemon as a pull by digest with - // an alias for the tag (if no alias is provided). - ref, err := distreference.ParseNamed(opts.remote) - if err != nil { - return types.PluginInstallOptions{}, err - } - - index, err := getRepoIndexFromUnnormalizedRef(ref) - if err != nil { - return types.PluginInstallOptions{}, err - } - - repoInfoIndex, err := getRepoIndexFromUnnormalizedRef(ref) - if err != nil { - return types.PluginInstallOptions{}, err - } - remote := ref.String() - - _, isCanonical := ref.(distreference.Canonical) - if command.IsTrusted() && !isCanonical { - var nt reference.NamedTagged - named, err := reference.ParseNamed(ref.Name()) - if err != nil { - return types.PluginInstallOptions{}, err - } - if tagged, ok := ref.(distreference.Tagged); ok { - nt, err = reference.WithTag(named, tagged.Tag()) - if err != nil { - return types.PluginInstallOptions{}, err - } - } else { - named = reference.WithDefaultTag(named) - nt = named.(reference.NamedTagged) - } - - ctx := context.Background() - trusted, err := image.TrustedReference(ctx, dockerCli, nt, newRegistryService()) - if err != nil { - return types.PluginInstallOptions{}, err - } - remote = trusted.String() - } - - authConfig := command.ResolveAuthConfig(ctx, dockerCli, index) - - encodedAuth, err := command.EncodeAuthToBase64(authConfig) - if err != nil { - return types.PluginInstallOptions{}, err - } - - registryAuthFunc := command.RegistryAuthenticationPrivilegedFunc(dockerCli, repoInfoIndex, cmdName) - - options := types.PluginInstallOptions{ - RegistryAuth: encodedAuth, - RemoteRef: remote, - Disabled: opts.disable, - AcceptAllPermissions: opts.grantPerms, - AcceptPermissionsFunc: acceptPrivileges(dockerCli, opts.remote), - // TODO: Rename PrivilegeFunc, it has nothing to do with privileges - PrivilegeFunc: registryAuthFunc, - Args: opts.args, - } - return options, nil -} - -func runInstall(dockerCli *command.DockerCli, opts pluginOptions) error { - var localName string - if opts.localName != "" { - aref, err := reference.ParseNamed(opts.localName) - if err != nil { - return err - } - aref = reference.WithDefaultTag(aref) - if _, ok := aref.(reference.NamedTagged); !ok { - return fmt.Errorf("invalid name: %s", opts.localName) - } - localName = aref.String() - } - - ctx := context.Background() - options, err := buildPullConfig(ctx, dockerCli, opts, "plugin install") - if err != nil { - return err - } - responseBody, err := dockerCli.Client().PluginInstall(ctx, localName, options) - if err != nil { - if strings.Contains(err.Error(), "target is image") { - return errors.New(err.Error() + " - Use `docker image pull`") - } - return err - } - defer responseBody.Close() - if err := jsonmessage.DisplayJSONMessagesToStream(responseBody, dockerCli.Out(), nil); err != nil { - return err - } - fmt.Fprintf(dockerCli.Out(), "Installed plugin %s\n", opts.remote) // todo: return proper values from the API for this result - return nil -} - -func acceptPrivileges(dockerCli *command.DockerCli, name string) func(privileges types.PluginPrivileges) (bool, error) { - return func(privileges types.PluginPrivileges) (bool, error) { - fmt.Fprintf(dockerCli.Out(), "Plugin %q is requesting the following privileges:\n", name) - for _, privilege := range privileges { - fmt.Fprintf(dockerCli.Out(), " - %s: %v\n", privilege.Name, privilege.Value) - } - - fmt.Fprint(dockerCli.Out(), "Do you grant the above permissions? [y/N] ") - reader := bufio.NewReader(dockerCli.In()) - line, _, err := reader.ReadLine() - if err != nil { - return false, err - } - return strings.ToLower(string(line)) == "y", nil - } -} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/list.go b/vendor/github.com/docker/docker/cli/command/plugin/list.go deleted file mode 100644 index 8fd16dae3..000000000 --- a/vendor/github.com/docker/docker/cli/command/plugin/list.go +++ /dev/null @@ -1,63 +0,0 @@ -package plugin - -import ( - "fmt" - "strings" - "text/tabwriter" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/stringutils" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type listOptions struct { - noTrunc bool -} - -func newListCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts listOptions - - cmd := &cobra.Command{ - Use: "ls [OPTIONS]", - Short: "List plugins", - Aliases: []string{"list"}, - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runList(dockerCli, opts) - }, - } - - flags := cmd.Flags() - - flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Don't truncate output") - - return cmd -} - -func runList(dockerCli *command.DockerCli, opts listOptions) error { - plugins, err := dockerCli.Client().PluginList(context.Background()) - if err != nil { - return err - } - - w := tabwriter.NewWriter(dockerCli.Out(), 20, 1, 3, ' ', 0) - fmt.Fprintf(w, "ID \tNAME \tDESCRIPTION\tENABLED") - fmt.Fprintf(w, "\n") - - for _, p := range plugins { - id := p.ID - desc := strings.Replace(p.Config.Description, "\n", " ", -1) - desc = strings.Replace(desc, "\r", " ", -1) - if !opts.noTrunc { - id = stringid.TruncateID(p.ID) - desc = stringutils.Ellipsis(desc, 45) - } - - fmt.Fprintf(w, "%s\t%s\t%s\t%v\n", id, p.Name, desc, p.Enabled) - } - w.Flush() - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/push.go b/vendor/github.com/docker/docker/cli/command/plugin/push.go deleted file mode 100644 index 9abb38ec0..000000000 --- a/vendor/github.com/docker/docker/cli/command/plugin/push.go +++ /dev/null @@ -1,71 +0,0 @@ -package plugin - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/image" - "github.com/docker/docker/pkg/jsonmessage" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "github.com/spf13/cobra" -) - -func newPushCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "push [OPTIONS] PLUGIN[:TAG]", - Short: "Push a plugin to a registry", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runPush(dockerCli, args[0]) - }, - } - - flags := cmd.Flags() - - command.AddTrustedFlags(flags, true) - - return cmd -} - -func runPush(dockerCli *command.DockerCli, name string) error { - named, err := reference.ParseNamed(name) // FIXME: validate - if err != nil { - return err - } - if reference.IsNameOnly(named) { - named = reference.WithDefaultTag(named) - } - ref, ok := named.(reference.NamedTagged) - if !ok { - return fmt.Errorf("invalid name: %s", named.String()) - } - - ctx := context.Background() - - repoInfo, err := registry.ParseRepositoryInfo(named) - if err != nil { - return err - } - authConfig := command.ResolveAuthConfig(ctx, dockerCli, repoInfo.Index) - - encodedAuth, err := command.EncodeAuthToBase64(authConfig) - if err != nil { - return err - } - responseBody, err := dockerCli.Client().PluginPush(ctx, ref.String(), encodedAuth) - if err != nil { - return err - } - defer responseBody.Close() - - if command.IsTrusted() { - repoInfo.Class = "plugin" - return image.PushTrustedReference(dockerCli, repoInfo, named, authConfig, responseBody) - } - - return jsonmessage.DisplayJSONMessagesToStream(responseBody, dockerCli.Out(), nil) -} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/remove.go b/vendor/github.com/docker/docker/cli/command/plugin/remove.go deleted file mode 100644 index 9f3aba9a0..000000000 --- a/vendor/github.com/docker/docker/cli/command/plugin/remove.go +++ /dev/null @@ -1,55 +0,0 @@ -package plugin - -import ( - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type rmOptions struct { - force bool - - plugins []string -} - -func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts rmOptions - - cmd := &cobra.Command{ - Use: "rm [OPTIONS] PLUGIN [PLUGIN...]", - Short: "Remove one or more plugins", - Aliases: []string{"remove"}, - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.plugins = args - return runRemove(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.force, "force", "f", false, "Force the removal of an active plugin") - return cmd -} - -func runRemove(dockerCli *command.DockerCli, opts *rmOptions) error { - ctx := context.Background() - - var errs cli.Errors - for _, name := range opts.plugins { - // TODO: pass names to api instead of making multiple api calls - if err := dockerCli.Client().PluginRemove(ctx, name, types.PluginRemoveOptions{Force: opts.force}); err != nil { - errs = append(errs, err) - continue - } - fmt.Fprintln(dockerCli.Out(), name) - } - // Do not simplify to `return errs` because even if errs == nil, it is not a nil-error interface value. - if errs != nil { - return errs - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/set.go b/vendor/github.com/docker/docker/cli/command/plugin/set.go deleted file mode 100644 index 52b09fb50..000000000 --- a/vendor/github.com/docker/docker/cli/command/plugin/set.go +++ /dev/null @@ -1,22 +0,0 @@ -package plugin - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -func newSetCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "set PLUGIN KEY=VALUE [KEY=VALUE...]", - Short: "Change settings for a plugin", - Args: cli.RequiresMinArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - return dockerCli.Client().PluginSet(context.Background(), args[0], args[1:]) - }, - } - - return cmd -} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/upgrade.go b/vendor/github.com/docker/docker/cli/command/plugin/upgrade.go deleted file mode 100644 index d212cd7e5..000000000 --- a/vendor/github.com/docker/docker/cli/command/plugin/upgrade.go +++ /dev/null @@ -1,100 +0,0 @@ -package plugin - -import ( - "bufio" - "context" - "fmt" - "strings" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/jsonmessage" - "github.com/docker/docker/reference" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -func newUpgradeCommand(dockerCli *command.DockerCli) *cobra.Command { - var options pluginOptions - cmd := &cobra.Command{ - Use: "upgrade [OPTIONS] PLUGIN [REMOTE]", - Short: "Upgrade an existing plugin", - Args: cli.RequiresRangeArgs(1, 2), - RunE: func(cmd *cobra.Command, args []string) error { - options.localName = args[0] - if len(args) == 2 { - options.remote = args[1] - } - return runUpgrade(dockerCli, options) - }, - } - - flags := cmd.Flags() - loadPullFlags(&options, flags) - flags.BoolVar(&options.skipRemoteCheck, "skip-remote-check", false, "Do not check if specified remote plugin matches existing plugin image") - return cmd -} - -func runUpgrade(dockerCli *command.DockerCli, opts pluginOptions) error { - ctx := context.Background() - p, _, err := dockerCli.Client().PluginInspectWithRaw(ctx, opts.localName) - if err != nil { - return fmt.Errorf("error reading plugin data: %v", err) - } - - if p.Enabled { - return fmt.Errorf("the plugin must be disabled before upgrading") - } - - opts.localName = p.Name - if opts.remote == "" { - opts.remote = p.PluginReference - } - remote, err := reference.ParseNamed(opts.remote) - if err != nil { - return errors.Wrap(err, "error parsing remote upgrade image reference") - } - remote = reference.WithDefaultTag(remote) - - old, err := reference.ParseNamed(p.PluginReference) - if err != nil { - return errors.Wrap(err, "error parsing current image reference") - } - old = reference.WithDefaultTag(old) - - fmt.Fprintf(dockerCli.Out(), "Upgrading plugin %s from %s to %s\n", p.Name, old, remote) - if !opts.skipRemoteCheck && remote.String() != old.String() { - _, err := fmt.Fprint(dockerCli.Out(), "Plugin images do not match, are you sure? ") - if err != nil { - return errors.Wrap(err, "error writing to stdout") - } - - rdr := bufio.NewReader(dockerCli.In()) - line, _, err := rdr.ReadLine() - if err != nil { - return errors.Wrap(err, "error reading from stdin") - } - if strings.ToLower(string(line)) != "y" { - return errors.New("canceling upgrade request") - } - } - - options, err := buildPullConfig(ctx, dockerCli, opts, "plugin upgrade") - if err != nil { - return err - } - - responseBody, err := dockerCli.Client().PluginUpgrade(ctx, opts.localName, options) - if err != nil { - if strings.Contains(err.Error(), "target is image") { - return errors.New(err.Error() + " - Use `docker image pull`") - } - return err - } - defer responseBody.Close() - if err := jsonmessage.DisplayJSONMessagesToStream(responseBody, dockerCli.Out(), nil); err != nil { - return err - } - fmt.Fprintf(dockerCli.Out(), "Upgraded plugin %s to %s\n", opts.localName, opts.remote) // todo: return proper values from the API for this result - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/prune/prune.go b/vendor/github.com/docker/docker/cli/command/prune/prune.go deleted file mode 100644 index a022487fd..000000000 --- a/vendor/github.com/docker/docker/cli/command/prune/prune.go +++ /dev/null @@ -1,50 +0,0 @@ -package prune - -import ( - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/container" - "github.com/docker/docker/cli/command/image" - "github.com/docker/docker/cli/command/network" - "github.com/docker/docker/cli/command/volume" - "github.com/spf13/cobra" -) - -// NewContainerPruneCommand returns a cobra prune command for containers -func NewContainerPruneCommand(dockerCli *command.DockerCli) *cobra.Command { - return container.NewPruneCommand(dockerCli) -} - -// NewVolumePruneCommand returns a cobra prune command for volumes -func NewVolumePruneCommand(dockerCli *command.DockerCli) *cobra.Command { - return volume.NewPruneCommand(dockerCli) -} - -// NewImagePruneCommand returns a cobra prune command for images -func NewImagePruneCommand(dockerCli *command.DockerCli) *cobra.Command { - return image.NewPruneCommand(dockerCli) -} - -// NewNetworkPruneCommand returns a cobra prune command for Networks -func NewNetworkPruneCommand(dockerCli *command.DockerCli) *cobra.Command { - return network.NewPruneCommand(dockerCli) -} - -// RunContainerPrune executes a prune command for containers -func RunContainerPrune(dockerCli *command.DockerCli) (uint64, string, error) { - return container.RunPrune(dockerCli) -} - -// RunVolumePrune executes a prune command for volumes -func RunVolumePrune(dockerCli *command.DockerCli) (uint64, string, error) { - return volume.RunPrune(dockerCli) -} - -// RunImagePrune executes a prune command for images -func RunImagePrune(dockerCli *command.DockerCli, all bool) (uint64, string, error) { - return image.RunPrune(dockerCli, all) -} - -// RunNetworkPrune executes a prune command for networks -func RunNetworkPrune(dockerCli *command.DockerCli) (uint64, string, error) { - return network.RunPrune(dockerCli) -} diff --git a/vendor/github.com/docker/docker/cli/command/registry.go b/vendor/github.com/docker/docker/cli/command/registry.go deleted file mode 100644 index 65f6b3309..000000000 --- a/vendor/github.com/docker/docker/cli/command/registry.go +++ /dev/null @@ -1,186 +0,0 @@ -package command - -import ( - "bufio" - "encoding/base64" - "encoding/json" - "fmt" - "io" - "os" - "runtime" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/pkg/term" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" -) - -// ElectAuthServer returns the default registry to use (by asking the daemon) -func ElectAuthServer(ctx context.Context, cli *DockerCli) string { - // The daemon `/info` endpoint informs us of the default registry being - // used. This is essential in cross-platforms environment, where for - // example a Linux client might be interacting with a Windows daemon, hence - // the default registry URL might be Windows specific. - serverAddress := registry.IndexServer - if info, err := cli.Client().Info(ctx); err != nil { - fmt.Fprintf(cli.Out(), "Warning: failed to get default registry endpoint from daemon (%v). Using system default: %s\n", err, serverAddress) - } else { - serverAddress = info.IndexServerAddress - } - return serverAddress -} - -// EncodeAuthToBase64 serializes the auth configuration as JSON base64 payload -func EncodeAuthToBase64(authConfig types.AuthConfig) (string, error) { - buf, err := json.Marshal(authConfig) - if err != nil { - return "", err - } - return base64.URLEncoding.EncodeToString(buf), nil -} - -// RegistryAuthenticationPrivilegedFunc returns a RequestPrivilegeFunc from the specified registry index info -// for the given command. -func RegistryAuthenticationPrivilegedFunc(cli *DockerCli, index *registrytypes.IndexInfo, cmdName string) types.RequestPrivilegeFunc { - return func() (string, error) { - fmt.Fprintf(cli.Out(), "\nPlease login prior to %s:\n", cmdName) - indexServer := registry.GetAuthConfigKey(index) - isDefaultRegistry := indexServer == ElectAuthServer(context.Background(), cli) - authConfig, err := ConfigureAuth(cli, "", "", indexServer, isDefaultRegistry) - if err != nil { - return "", err - } - return EncodeAuthToBase64(authConfig) - } -} - -// ResolveAuthConfig is like registry.ResolveAuthConfig, but if using the -// default index, it uses the default index name for the daemon's platform, -// not the client's platform. -func ResolveAuthConfig(ctx context.Context, cli *DockerCli, index *registrytypes.IndexInfo) types.AuthConfig { - configKey := index.Name - if index.Official { - configKey = ElectAuthServer(ctx, cli) - } - - a, _ := cli.CredentialsStore(configKey).Get(configKey) - return a -} - -// ConfigureAuth returns an AuthConfig from the specified user, password and server. -func ConfigureAuth(cli *DockerCli, flUser, flPassword, serverAddress string, isDefaultRegistry bool) (types.AuthConfig, error) { - // On Windows, force the use of the regular OS stdin stream. Fixes #14336/#14210 - if runtime.GOOS == "windows" { - cli.in = NewInStream(os.Stdin) - } - - if !isDefaultRegistry { - serverAddress = registry.ConvertToHostname(serverAddress) - } - - authconfig, err := cli.CredentialsStore(serverAddress).Get(serverAddress) - if err != nil { - return authconfig, err - } - - // Some links documenting this: - // - https://code.google.com/archive/p/mintty/issues/56 - // - https://github.com/docker/docker/issues/15272 - // - https://mintty.github.io/ (compatibility) - // Linux will hit this if you attempt `cat | docker login`, and Windows - // will hit this if you attempt docker login from mintty where stdin - // is a pipe, not a character based console. - if flPassword == "" && !cli.In().IsTerminal() { - return authconfig, fmt.Errorf("Error: Cannot perform an interactive login from a non TTY device") - } - - authconfig.Username = strings.TrimSpace(authconfig.Username) - - if flUser = strings.TrimSpace(flUser); flUser == "" { - if isDefaultRegistry { - // if this is a default registry (docker hub), then display the following message. - fmt.Fprintln(cli.Out(), "Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.") - } - promptWithDefault(cli.Out(), "Username", authconfig.Username) - flUser = readInput(cli.In(), cli.Out()) - flUser = strings.TrimSpace(flUser) - if flUser == "" { - flUser = authconfig.Username - } - } - if flUser == "" { - return authconfig, fmt.Errorf("Error: Non-null Username Required") - } - if flPassword == "" { - oldState, err := term.SaveState(cli.In().FD()) - if err != nil { - return authconfig, err - } - fmt.Fprintf(cli.Out(), "Password: ") - term.DisableEcho(cli.In().FD(), oldState) - - flPassword = readInput(cli.In(), cli.Out()) - fmt.Fprint(cli.Out(), "\n") - - term.RestoreTerminal(cli.In().FD(), oldState) - if flPassword == "" { - return authconfig, fmt.Errorf("Error: Password Required") - } - } - - authconfig.Username = flUser - authconfig.Password = flPassword - authconfig.ServerAddress = serverAddress - authconfig.IdentityToken = "" - - return authconfig, nil -} - -func readInput(in io.Reader, out io.Writer) string { - reader := bufio.NewReader(in) - line, _, err := reader.ReadLine() - if err != nil { - fmt.Fprintln(out, err.Error()) - os.Exit(1) - } - return string(line) -} - -func promptWithDefault(out io.Writer, prompt string, configDefault string) { - if configDefault == "" { - fmt.Fprintf(out, "%s: ", prompt) - } else { - fmt.Fprintf(out, "%s (%s): ", prompt, configDefault) - } -} - -// RetrieveAuthTokenFromImage retrieves an encoded auth token given a complete image -func RetrieveAuthTokenFromImage(ctx context.Context, cli *DockerCli, image string) (string, error) { - // Retrieve encoded auth token from the image reference - authConfig, err := resolveAuthConfigFromImage(ctx, cli, image) - if err != nil { - return "", err - } - encodedAuth, err := EncodeAuthToBase64(authConfig) - if err != nil { - return "", err - } - return encodedAuth, nil -} - -// resolveAuthConfigFromImage retrieves that AuthConfig using the image string -func resolveAuthConfigFromImage(ctx context.Context, cli *DockerCli, image string) (types.AuthConfig, error) { - registryRef, err := reference.ParseNamed(image) - if err != nil { - return types.AuthConfig{}, err - } - repoInfo, err := registry.ParseRepositoryInfo(registryRef) - if err != nil { - return types.AuthConfig{}, err - } - return ResolveAuthConfig(ctx, cli, repoInfo.Index), nil -} diff --git a/vendor/github.com/docker/docker/cli/command/registry/login.go b/vendor/github.com/docker/docker/cli/command/registry/login.go deleted file mode 100644 index 05b3bb03b..000000000 --- a/vendor/github.com/docker/docker/cli/command/registry/login.go +++ /dev/null @@ -1,85 +0,0 @@ -package registry - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type loginOptions struct { - serverAddress string - user string - password string - email string -} - -// NewLoginCommand creates a new `docker login` command -func NewLoginCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts loginOptions - - cmd := &cobra.Command{ - Use: "login [OPTIONS] [SERVER]", - Short: "Log in to a Docker registry", - Long: "Log in to a Docker registry.\nIf no server is specified, the default is defined by the daemon.", - Args: cli.RequiresMaxArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - if len(args) > 0 { - opts.serverAddress = args[0] - } - return runLogin(dockerCli, opts) - }, - } - - flags := cmd.Flags() - - flags.StringVarP(&opts.user, "username", "u", "", "Username") - flags.StringVarP(&opts.password, "password", "p", "", "Password") - - // Deprecated in 1.11: Should be removed in docker 1.14 - flags.StringVarP(&opts.email, "email", "e", "", "Email") - flags.MarkDeprecated("email", "will be removed in 1.14.") - - return cmd -} - -func runLogin(dockerCli *command.DockerCli, opts loginOptions) error { - ctx := context.Background() - clnt := dockerCli.Client() - - var ( - serverAddress string - authServer = command.ElectAuthServer(ctx, dockerCli) - ) - if opts.serverAddress != "" { - serverAddress = opts.serverAddress - } else { - serverAddress = authServer - } - - isDefaultRegistry := serverAddress == authServer - - authConfig, err := command.ConfigureAuth(dockerCli, opts.user, opts.password, serverAddress, isDefaultRegistry) - if err != nil { - return err - } - response, err := clnt.RegistryLogin(ctx, authConfig) - if err != nil { - return err - } - if response.IdentityToken != "" { - authConfig.Password = "" - authConfig.IdentityToken = response.IdentityToken - } - if err := dockerCli.CredentialsStore(serverAddress).Store(authConfig); err != nil { - return fmt.Errorf("Error saving credentials: %v", err) - } - - if response.Status != "" { - fmt.Fprintln(dockerCli.Out(), response.Status) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/registry/logout.go b/vendor/github.com/docker/docker/cli/command/registry/logout.go deleted file mode 100644 index 877e60e8c..000000000 --- a/vendor/github.com/docker/docker/cli/command/registry/logout.go +++ /dev/null @@ -1,77 +0,0 @@ -package registry - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/registry" - "github.com/spf13/cobra" -) - -// NewLogoutCommand creates a new `docker login` command -func NewLogoutCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "logout [SERVER]", - Short: "Log out from a Docker registry", - Long: "Log out from a Docker registry.\nIf no server is specified, the default is defined by the daemon.", - Args: cli.RequiresMaxArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - var serverAddress string - if len(args) > 0 { - serverAddress = args[0] - } - return runLogout(dockerCli, serverAddress) - }, - } - - return cmd -} - -func runLogout(dockerCli *command.DockerCli, serverAddress string) error { - ctx := context.Background() - var isDefaultRegistry bool - - if serverAddress == "" { - serverAddress = command.ElectAuthServer(ctx, dockerCli) - isDefaultRegistry = true - } - - var ( - loggedIn bool - regsToLogout []string - hostnameAddress = serverAddress - regsToTry = []string{serverAddress} - ) - if !isDefaultRegistry { - hostnameAddress = registry.ConvertToHostname(serverAddress) - // the tries below are kept for backward compatibility where a user could have - // saved the registry in one of the following format. - regsToTry = append(regsToTry, hostnameAddress, "http://"+hostnameAddress, "https://"+hostnameAddress) - } - - // check if we're logged in based on the records in the config file - // which means it couldn't have user/pass cause they may be in the creds store - for _, s := range regsToTry { - if _, ok := dockerCli.ConfigFile().AuthConfigs[s]; ok { - loggedIn = true - regsToLogout = append(regsToLogout, s) - } - } - - if !loggedIn { - fmt.Fprintf(dockerCli.Out(), "Not logged in to %s\n", hostnameAddress) - return nil - } - - fmt.Fprintf(dockerCli.Out(), "Removing login credentials for %s\n", hostnameAddress) - for _, r := range regsToLogout { - if err := dockerCli.CredentialsStore(r).Erase(r); err != nil { - fmt.Fprintf(dockerCli.Err(), "WARNING: could not erase credentials: %v\n", err) - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/registry/search.go b/vendor/github.com/docker/docker/cli/command/registry/search.go deleted file mode 100644 index 124b4ae6c..000000000 --- a/vendor/github.com/docker/docker/cli/command/registry/search.go +++ /dev/null @@ -1,126 +0,0 @@ -package registry - -import ( - "fmt" - "sort" - "strings" - "text/tabwriter" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/stringutils" - "github.com/docker/docker/registry" - "github.com/spf13/cobra" -) - -type searchOptions struct { - term string - noTrunc bool - limit int - filter opts.FilterOpt - - // Deprecated - stars uint - automated bool -} - -// NewSearchCommand creates a new `docker search` command -func NewSearchCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := searchOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "search [OPTIONS] TERM", - Short: "Search the Docker Hub for images", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.term = args[0] - return runSearch(dockerCli, opts) - }, - } - - flags := cmd.Flags() - - flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Don't truncate output") - flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided") - flags.IntVar(&opts.limit, "limit", registry.DefaultSearchLimit, "Max number of search results") - - flags.BoolVar(&opts.automated, "automated", false, "Only show automated builds") - flags.UintVarP(&opts.stars, "stars", "s", 0, "Only displays with at least x stars") - - flags.MarkDeprecated("automated", "use --filter=automated=true instead") - flags.MarkDeprecated("stars", "use --filter=stars=3 instead") - - return cmd -} - -func runSearch(dockerCli *command.DockerCli, opts searchOptions) error { - indexInfo, err := registry.ParseSearchIndexInfo(opts.term) - if err != nil { - return err - } - - ctx := context.Background() - - authConfig := command.ResolveAuthConfig(ctx, dockerCli, indexInfo) - requestPrivilege := command.RegistryAuthenticationPrivilegedFunc(dockerCli, indexInfo, "search") - - encodedAuth, err := command.EncodeAuthToBase64(authConfig) - if err != nil { - return err - } - - options := types.ImageSearchOptions{ - RegistryAuth: encodedAuth, - PrivilegeFunc: requestPrivilege, - Filters: opts.filter.Value(), - Limit: opts.limit, - } - - clnt := dockerCli.Client() - - unorderedResults, err := clnt.ImageSearch(ctx, opts.term, options) - if err != nil { - return err - } - - results := searchResultsByStars(unorderedResults) - sort.Sort(results) - - w := tabwriter.NewWriter(dockerCli.Out(), 10, 1, 3, ' ', 0) - fmt.Fprintf(w, "NAME\tDESCRIPTION\tSTARS\tOFFICIAL\tAUTOMATED\n") - for _, res := range results { - // --automated and -s, --stars are deprecated since Docker 1.12 - if (opts.automated && !res.IsAutomated) || (int(opts.stars) > res.StarCount) { - continue - } - desc := strings.Replace(res.Description, "\n", " ", -1) - desc = strings.Replace(desc, "\r", " ", -1) - if !opts.noTrunc { - desc = stringutils.Ellipsis(desc, 45) - } - fmt.Fprintf(w, "%s\t%s\t%d\t", res.Name, desc, res.StarCount) - if res.IsOfficial { - fmt.Fprint(w, "[OK]") - - } - fmt.Fprint(w, "\t") - if res.IsAutomated { - fmt.Fprint(w, "[OK]") - } - fmt.Fprint(w, "\n") - } - w.Flush() - return nil -} - -// SearchResultsByStars sorts search results in descending order by number of stars. -type searchResultsByStars []registrytypes.SearchResult - -func (r searchResultsByStars) Len() int { return len(r) } -func (r searchResultsByStars) Swap(i, j int) { r[i], r[j] = r[j], r[i] } -func (r searchResultsByStars) Less(i, j int) bool { return r[j].StarCount < r[i].StarCount } diff --git a/vendor/github.com/docker/docker/cli/command/secret/cmd.go b/vendor/github.com/docker/docker/cli/command/secret/cmd.go deleted file mode 100644 index 79e669858..000000000 --- a/vendor/github.com/docker/docker/cli/command/secret/cmd.go +++ /dev/null @@ -1,25 +0,0 @@ -package secret - -import ( - "github.com/spf13/cobra" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" -) - -// NewSecretCommand returns a cobra command for `secret` subcommands -func NewSecretCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "secret", - Short: "Manage Docker secrets", - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - } - cmd.AddCommand( - newSecretListCommand(dockerCli), - newSecretCreateCommand(dockerCli), - newSecretInspectCommand(dockerCli), - newSecretRemoveCommand(dockerCli), - ) - return cmd -} diff --git a/vendor/github.com/docker/docker/cli/command/secret/create.go b/vendor/github.com/docker/docker/cli/command/secret/create.go deleted file mode 100644 index f4683a60f..000000000 --- a/vendor/github.com/docker/docker/cli/command/secret/create.go +++ /dev/null @@ -1,79 +0,0 @@ -package secret - -import ( - "fmt" - "io" - "io/ioutil" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/system" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type createOptions struct { - name string - file string - labels opts.ListOpts -} - -func newSecretCreateCommand(dockerCli *command.DockerCli) *cobra.Command { - createOpts := createOptions{ - labels: opts.NewListOpts(runconfigopts.ValidateEnv), - } - - cmd := &cobra.Command{ - Use: "create [OPTIONS] SECRET file|-", - Short: "Create a secret from a file or STDIN as content", - Args: cli.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - createOpts.name = args[0] - createOpts.file = args[1] - return runSecretCreate(dockerCli, createOpts) - }, - } - flags := cmd.Flags() - flags.VarP(&createOpts.labels, "label", "l", "Secret labels") - - return cmd -} - -func runSecretCreate(dockerCli *command.DockerCli, options createOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - var in io.Reader = dockerCli.In() - if options.file != "-" { - file, err := system.OpenSequential(options.file) - if err != nil { - return err - } - in = file - defer file.Close() - } - - secretData, err := ioutil.ReadAll(in) - if err != nil { - return fmt.Errorf("Error reading content from %q: %v", options.file, err) - } - - spec := swarm.SecretSpec{ - Annotations: swarm.Annotations{ - Name: options.name, - Labels: runconfigopts.ConvertKVStringsToMap(options.labels.GetAll()), - }, - Data: secretData, - } - - r, err := client.SecretCreate(ctx, spec) - if err != nil { - return err - } - - fmt.Fprintln(dockerCli.Out(), r.ID) - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/secret/inspect.go b/vendor/github.com/docker/docker/cli/command/secret/inspect.go deleted file mode 100644 index 0a8bd4a23..000000000 --- a/vendor/github.com/docker/docker/cli/command/secret/inspect.go +++ /dev/null @@ -1,45 +0,0 @@ -package secret - -import ( - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/inspect" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type inspectOptions struct { - names []string - format string -} - -func newSecretInspectCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := inspectOptions{} - cmd := &cobra.Command{ - Use: "inspect [OPTIONS] SECRET [SECRET...]", - Short: "Display detailed information on one or more secrets", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.names = args - return runSecretInspect(dockerCli, opts) - }, - } - - cmd.Flags().StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template") - return cmd -} - -func runSecretInspect(dockerCli *command.DockerCli, opts inspectOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - ids, err := getCliRequestedSecretIDs(ctx, client, opts.names) - if err != nil { - return err - } - getRef := func(id string) (interface{}, []byte, error) { - return client.SecretInspectWithRaw(ctx, id) - } - - return inspect.Inspect(dockerCli.Out(), ids, opts.format, getRef) -} diff --git a/vendor/github.com/docker/docker/cli/command/secret/ls.go b/vendor/github.com/docker/docker/cli/command/secret/ls.go deleted file mode 100644 index faeab314b..000000000 --- a/vendor/github.com/docker/docker/cli/command/secret/ls.go +++ /dev/null @@ -1,68 +0,0 @@ -package secret - -import ( - "fmt" - "text/tabwriter" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/go-units" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type listOptions struct { - quiet bool -} - -func newSecretListCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := listOptions{} - - cmd := &cobra.Command{ - Use: "ls [OPTIONS]", - Aliases: []string{"list"}, - Short: "List secrets", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runSecretList(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display IDs") - - return cmd -} - -func runSecretList(dockerCli *command.DockerCli, opts listOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - secrets, err := client.SecretList(ctx, types.SecretListOptions{}) - if err != nil { - return err - } - - w := tabwriter.NewWriter(dockerCli.Out(), 20, 1, 3, ' ', 0) - if opts.quiet { - for _, s := range secrets { - fmt.Fprintf(w, "%s\n", s.ID) - } - } else { - fmt.Fprintf(w, "ID\tNAME\tCREATED\tUPDATED") - fmt.Fprintf(w, "\n") - - for _, s := range secrets { - created := units.HumanDuration(time.Now().UTC().Sub(s.Meta.CreatedAt)) + " ago" - updated := units.HumanDuration(time.Now().UTC().Sub(s.Meta.UpdatedAt)) + " ago" - - fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", s.ID, s.Spec.Annotations.Name, created, updated) - } - } - - w.Flush() - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/secret/remove.go b/vendor/github.com/docker/docker/cli/command/secret/remove.go deleted file mode 100644 index f45a619f6..000000000 --- a/vendor/github.com/docker/docker/cli/command/secret/remove.go +++ /dev/null @@ -1,57 +0,0 @@ -package secret - -import ( - "fmt" - "strings" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type removeOptions struct { - names []string -} - -func newSecretRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { - return &cobra.Command{ - Use: "rm SECRET [SECRET...]", - Aliases: []string{"remove"}, - Short: "Remove one or more secrets", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts := removeOptions{ - names: args, - } - return runSecretRemove(dockerCli, opts) - }, - } -} - -func runSecretRemove(dockerCli *command.DockerCli, opts removeOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - ids, err := getCliRequestedSecretIDs(ctx, client, opts.names) - if err != nil { - return err - } - - var errs []string - - for _, id := range ids { - if err := client.SecretRemove(ctx, id); err != nil { - errs = append(errs, err.Error()) - continue - } - - fmt.Fprintln(dockerCli.Out(), id) - } - - if len(errs) > 0 { - return fmt.Errorf("%s", strings.Join(errs, "\n")) - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/secret/utils.go b/vendor/github.com/docker/docker/cli/command/secret/utils.go deleted file mode 100644 index 11d31ffd1..000000000 --- a/vendor/github.com/docker/docker/cli/command/secret/utils.go +++ /dev/null @@ -1,76 +0,0 @@ -package secret - -import ( - "fmt" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/client" - "golang.org/x/net/context" -) - -// GetSecretsByNameOrIDPrefixes returns secrets given a list of ids or names -func GetSecretsByNameOrIDPrefixes(ctx context.Context, client client.APIClient, terms []string) ([]swarm.Secret, error) { - args := filters.NewArgs() - for _, n := range terms { - args.Add("names", n) - args.Add("id", n) - } - - return client.SecretList(ctx, types.SecretListOptions{ - Filters: args, - }) -} - -func getCliRequestedSecretIDs(ctx context.Context, client client.APIClient, terms []string) ([]string, error) { - secrets, err := GetSecretsByNameOrIDPrefixes(ctx, client, terms) - if err != nil { - return nil, err - } - - if len(secrets) > 0 { - found := make(map[string]struct{}) - next: - for _, term := range terms { - // attempt to lookup secret by full ID - for _, s := range secrets { - if s.ID == term { - found[s.ID] = struct{}{} - continue next - } - } - // attempt to lookup secret by full name - for _, s := range secrets { - if s.Spec.Annotations.Name == term { - found[s.ID] = struct{}{} - continue next - } - } - // attempt to lookup secret by partial ID (prefix) - // return error if more than one matches found (ambiguous) - n := 0 - for _, s := range secrets { - if strings.HasPrefix(s.ID, term) { - found[s.ID] = struct{}{} - n++ - } - } - if n > 1 { - return nil, fmt.Errorf("secret %s is ambiguous (%d matches found)", term, n) - } - } - - // We already collected all the IDs found. - // Now we will remove duplicates by converting the map to slice - ids := []string{} - for id := range found { - ids = append(ids, id) - } - - return ids, nil - } - - return terms, nil -} diff --git a/vendor/github.com/docker/docker/cli/command/service/cmd.go b/vendor/github.com/docker/docker/cli/command/service/cmd.go deleted file mode 100644 index 796fe926c..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/cmd.go +++ /dev/null @@ -1,29 +0,0 @@ -package service - -import ( - "github.com/spf13/cobra" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" -) - -// NewServiceCommand returns a cobra command for `service` subcommands -func NewServiceCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "service", - Short: "Manage services", - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - } - cmd.AddCommand( - newCreateCommand(dockerCli), - newInspectCommand(dockerCli), - newPsCommand(dockerCli), - newListCommand(dockerCli), - newRemoveCommand(dockerCli), - newScaleCommand(dockerCli), - newUpdateCommand(dockerCli), - newLogsCommand(dockerCli), - ) - return cmd -} diff --git a/vendor/github.com/docker/docker/cli/command/service/create.go b/vendor/github.com/docker/docker/cli/command/service/create.go deleted file mode 100644 index 1355c19c6..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/create.go +++ /dev/null @@ -1,100 +0,0 @@ -package service - -import ( - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -func newCreateCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := newServiceOptions() - - cmd := &cobra.Command{ - Use: "create [OPTIONS] IMAGE [COMMAND] [ARG...]", - Short: "Create a new service", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.image = args[0] - if len(args) > 1 { - opts.args = args[1:] - } - return runCreate(dockerCli, opts) - }, - } - flags := cmd.Flags() - flags.StringVar(&opts.mode, flagMode, "replicated", "Service mode (replicated or global)") - flags.StringVar(&opts.name, flagName, "", "Service name") - - addServiceFlags(cmd, opts) - - flags.VarP(&opts.labels, flagLabel, "l", "Service labels") - flags.Var(&opts.containerLabels, flagContainerLabel, "Container labels") - flags.VarP(&opts.env, flagEnv, "e", "Set environment variables") - flags.Var(&opts.envFile, flagEnvFile, "Read in a file of environment variables") - flags.Var(&opts.mounts, flagMount, "Attach a filesystem mount to the service") - flags.Var(&opts.constraints, flagConstraint, "Placement constraints") - flags.Var(&opts.networks, flagNetwork, "Network attachments") - flags.Var(&opts.secrets, flagSecret, "Specify secrets to expose to the service") - flags.VarP(&opts.endpoint.publishPorts, flagPublish, "p", "Publish a port as a node port") - flags.Var(&opts.groups, flagGroup, "Set one or more supplementary user groups for the container") - flags.Var(&opts.dns, flagDNS, "Set custom DNS servers") - flags.Var(&opts.dnsOption, flagDNSOption, "Set DNS options") - flags.Var(&opts.dnsSearch, flagDNSSearch, "Set custom DNS search domains") - flags.Var(&opts.hosts, flagHost, "Set one or more custom host-to-IP mappings (host:ip)") - - flags.SetInterspersed(false) - return cmd -} - -func runCreate(dockerCli *command.DockerCli, opts *serviceOptions) error { - apiClient := dockerCli.Client() - createOpts := types.ServiceCreateOptions{} - - service, err := opts.ToService() - if err != nil { - return err - } - - specifiedSecrets := opts.secrets.Value() - if len(specifiedSecrets) > 0 { - // parse and validate secrets - secrets, err := ParseSecrets(apiClient, specifiedSecrets) - if err != nil { - return err - } - service.TaskTemplate.ContainerSpec.Secrets = secrets - - } - - ctx := context.Background() - - if err := resolveServiceImageDigest(dockerCli, &service); err != nil { - return err - } - - // only send auth if flag was set - if opts.registryAuth { - // Retrieve encoded auth token from the image reference - encodedAuth, err := command.RetrieveAuthTokenFromImage(ctx, dockerCli, opts.image) - if err != nil { - return err - } - createOpts.EncodedRegistryAuth = encodedAuth - } - - response, err := apiClient.ServiceCreate(ctx, service, createOpts) - if err != nil { - return err - } - - for _, warning := range response.Warnings { - fmt.Fprintln(dockerCli.Err(), warning) - } - - fmt.Fprintf(dockerCli.Out(), "%s\n", response.ID) - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/service/inspect.go b/vendor/github.com/docker/docker/cli/command/service/inspect.go deleted file mode 100644 index deb701bf6..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/inspect.go +++ /dev/null @@ -1,84 +0,0 @@ -package service - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/formatter" - apiclient "github.com/docker/docker/client" - "github.com/spf13/cobra" -) - -type inspectOptions struct { - refs []string - format string - pretty bool -} - -func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts inspectOptions - - cmd := &cobra.Command{ - Use: "inspect [OPTIONS] SERVICE [SERVICE...]", - Short: "Display detailed information on one or more services", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.refs = args - - if opts.pretty && len(opts.format) > 0 { - return fmt.Errorf("--format is incompatible with human friendly format") - } - return runInspect(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template") - flags.BoolVar(&opts.pretty, "pretty", false, "Print the information in a human friendly format.") - return cmd -} - -func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - if opts.pretty { - opts.format = "pretty" - } - - getRef := func(ref string) (interface{}, []byte, error) { - service, _, err := client.ServiceInspectWithRaw(ctx, ref) - if err == nil || !apiclient.IsErrServiceNotFound(err) { - return service, nil, err - } - return nil, nil, fmt.Errorf("Error: no such service: %s", ref) - } - - f := opts.format - if len(f) == 0 { - f = "raw" - if len(dockerCli.ConfigFile().ServiceInspectFormat) > 0 { - f = dockerCli.ConfigFile().ServiceInspectFormat - } - } - - // check if the user is trying to apply a template to the pretty format, which - // is not supported - if strings.HasPrefix(f, "pretty") && f != "pretty" { - return fmt.Errorf("Cannot supply extra formatting options to the pretty template") - } - - serviceCtx := formatter.Context{ - Output: dockerCli.Out(), - Format: formatter.NewServiceFormat(f), - } - - if err := formatter.ServiceInspectWrite(serviceCtx, opts.refs, getRef); err != nil { - return cli.StatusError{StatusCode: 1, Status: err.Error()} - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/service/inspect_test.go b/vendor/github.com/docker/docker/cli/command/service/inspect_test.go deleted file mode 100644 index 04a65080c..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/inspect_test.go +++ /dev/null @@ -1,129 +0,0 @@ -package service - -import ( - "bytes" - "encoding/json" - "strings" - "testing" - "time" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli/command/formatter" - "github.com/docker/docker/pkg/testutil/assert" -) - -func formatServiceInspect(t *testing.T, format formatter.Format, now time.Time) string { - b := new(bytes.Buffer) - - endpointSpec := &swarm.EndpointSpec{ - Mode: "vip", - Ports: []swarm.PortConfig{ - { - Protocol: swarm.PortConfigProtocolTCP, - TargetPort: 5000, - }, - }, - } - - two := uint64(2) - - s := swarm.Service{ - ID: "de179gar9d0o7ltdybungplod", - Meta: swarm.Meta{ - Version: swarm.Version{Index: 315}, - CreatedAt: now, - UpdatedAt: now, - }, - Spec: swarm.ServiceSpec{ - Annotations: swarm.Annotations{ - Name: "my_service", - Labels: map[string]string{"com.label": "foo"}, - }, - TaskTemplate: swarm.TaskSpec{ - ContainerSpec: swarm.ContainerSpec{ - Image: "foo/bar@sha256:this_is_a_test", - }, - }, - Mode: swarm.ServiceMode{ - Replicated: &swarm.ReplicatedService{ - Replicas: &two, - }, - }, - UpdateConfig: nil, - Networks: []swarm.NetworkAttachmentConfig{ - { - Target: "5vpyomhb6ievnk0i0o60gcnei", - Aliases: []string{"web"}, - }, - }, - EndpointSpec: endpointSpec, - }, - Endpoint: swarm.Endpoint{ - Spec: *endpointSpec, - Ports: []swarm.PortConfig{ - { - Protocol: swarm.PortConfigProtocolTCP, - TargetPort: 5000, - PublishedPort: 30000, - }, - }, - VirtualIPs: []swarm.EndpointVirtualIP{ - { - NetworkID: "6o4107cj2jx9tihgb0jyts6pj", - Addr: "10.255.0.4/16", - }, - }, - }, - UpdateStatus: swarm.UpdateStatus{ - StartedAt: now, - CompletedAt: now, - }, - } - - ctx := formatter.Context{ - Output: b, - Format: format, - } - - err := formatter.ServiceInspectWrite(ctx, []string{"de179gar9d0o7ltdybungplod"}, func(ref string) (interface{}, []byte, error) { - return s, nil, nil - }) - if err != nil { - t.Fatal(err) - } - return b.String() -} - -func TestPrettyPrintWithNoUpdateConfig(t *testing.T) { - s := formatServiceInspect(t, formatter.NewServiceFormat("pretty"), time.Now()) - if strings.Contains(s, "UpdateStatus") { - t.Fatal("Pretty print failed before parsing UpdateStatus") - } -} - -func TestJSONFormatWithNoUpdateConfig(t *testing.T) { - now := time.Now() - // s1: [{"ID":..}] - // s2: {"ID":..} - s1 := formatServiceInspect(t, formatter.NewServiceFormat(""), now) - t.Log("// s1") - t.Logf("%s", s1) - s2 := formatServiceInspect(t, formatter.NewServiceFormat("{{json .}}"), now) - t.Log("// s2") - t.Logf("%s", s2) - var m1Wrap []map[string]interface{} - if err := json.Unmarshal([]byte(s1), &m1Wrap); err != nil { - t.Fatal(err) - } - if len(m1Wrap) != 1 { - t.Fatalf("strange s1=%s", s1) - } - m1 := m1Wrap[0] - t.Logf("m1=%+v", m1) - var m2 map[string]interface{} - if err := json.Unmarshal([]byte(s2), &m2); err != nil { - t.Fatal(err) - } - t.Logf("m2=%+v", m2) - assert.DeepEqual(t, m2, m1) -} diff --git a/vendor/github.com/docker/docker/cli/command/service/list.go b/vendor/github.com/docker/docker/cli/command/service/list.go deleted file mode 100644 index 724126079..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/list.go +++ /dev/null @@ -1,158 +0,0 @@ -package service - -import ( - "fmt" - "io" - "text/tabwriter" - - distreference "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/stringid" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -const ( - listItemFmt = "%s\t%s\t%s\t%s\t%s\n" -) - -type listOptions struct { - quiet bool - filter opts.FilterOpt -} - -func newListCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := listOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "ls [OPTIONS]", - Aliases: []string{"list"}, - Short: "List services", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runList(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display IDs") - flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided") - - return cmd -} - -func runList(dockerCli *command.DockerCli, opts listOptions) error { - ctx := context.Background() - client := dockerCli.Client() - out := dockerCli.Out() - - services, err := client.ServiceList(ctx, types.ServiceListOptions{Filters: opts.filter.Value()}) - if err != nil { - return err - } - - if len(services) > 0 && !opts.quiet { - // only non-empty services and not quiet, should we call TaskList and NodeList api - taskFilter := filters.NewArgs() - for _, service := range services { - taskFilter.Add("service", service.ID) - } - - tasks, err := client.TaskList(ctx, types.TaskListOptions{Filters: taskFilter}) - if err != nil { - return err - } - - nodes, err := client.NodeList(ctx, types.NodeListOptions{}) - if err != nil { - return err - } - - PrintNotQuiet(out, services, nodes, tasks) - } else if !opts.quiet { - // no services and not quiet, print only one line with columns ID, NAME, MODE, REPLICAS... - PrintNotQuiet(out, services, []swarm.Node{}, []swarm.Task{}) - } else { - PrintQuiet(out, services) - } - - return nil -} - -// PrintNotQuiet shows service list in a non-quiet way. -// Besides this, command `docker stack services xxx` will call this, too. -func PrintNotQuiet(out io.Writer, services []swarm.Service, nodes []swarm.Node, tasks []swarm.Task) { - activeNodes := make(map[string]struct{}) - for _, n := range nodes { - if n.Status.State != swarm.NodeStateDown { - activeNodes[n.ID] = struct{}{} - } - } - - running := map[string]int{} - tasksNoShutdown := map[string]int{} - - for _, task := range tasks { - if task.DesiredState != swarm.TaskStateShutdown { - tasksNoShutdown[task.ServiceID]++ - } - - if _, nodeActive := activeNodes[task.NodeID]; nodeActive && task.Status.State == swarm.TaskStateRunning { - running[task.ServiceID]++ - } - } - - printTable(out, services, running, tasksNoShutdown) -} - -func printTable(out io.Writer, services []swarm.Service, running, tasksNoShutdown map[string]int) { - writer := tabwriter.NewWriter(out, 0, 4, 2, ' ', 0) - - // Ignore flushing errors - defer writer.Flush() - - fmt.Fprintf(writer, listItemFmt, "ID", "NAME", "MODE", "REPLICAS", "IMAGE") - - for _, service := range services { - mode := "" - replicas := "" - if service.Spec.Mode.Replicated != nil && service.Spec.Mode.Replicated.Replicas != nil { - mode = "replicated" - replicas = fmt.Sprintf("%d/%d", running[service.ID], *service.Spec.Mode.Replicated.Replicas) - } else if service.Spec.Mode.Global != nil { - mode = "global" - replicas = fmt.Sprintf("%d/%d", running[service.ID], tasksNoShutdown[service.ID]) - } - image := service.Spec.TaskTemplate.ContainerSpec.Image - ref, err := distreference.ParseNamed(image) - if err == nil { - // update image string for display - namedTagged, ok := ref.(distreference.NamedTagged) - if ok { - image = namedTagged.Name() + ":" + namedTagged.Tag() - } - } - - fmt.Fprintf( - writer, - listItemFmt, - stringid.TruncateID(service.ID), - service.Spec.Name, - mode, - replicas, - image) - } -} - -// PrintQuiet shows service list in a quiet way. -// Besides this, command `docker stack services xxx` will call this, too. -func PrintQuiet(out io.Writer, services []swarm.Service) { - for _, service := range services { - fmt.Fprintln(out, service.ID) - } -} diff --git a/vendor/github.com/docker/docker/cli/command/service/logs.go b/vendor/github.com/docker/docker/cli/command/service/logs.go deleted file mode 100644 index 19d3d9a48..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/logs.go +++ /dev/null @@ -1,163 +0,0 @@ -package service - -import ( - "bytes" - "fmt" - "io" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/idresolver" - "github.com/docker/docker/pkg/stdcopy" - "github.com/spf13/cobra" -) - -type logsOptions struct { - noResolve bool - follow bool - since string - timestamps bool - details bool - tail string - - service string -} - -func newLogsCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts logsOptions - - cmd := &cobra.Command{ - Use: "logs [OPTIONS] SERVICE", - Short: "Fetch the logs of a service", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.service = args[0] - return runLogs(dockerCli, &opts) - }, - Tags: map[string]string{"experimental": ""}, - } - - flags := cmd.Flags() - flags.BoolVar(&opts.noResolve, "no-resolve", false, "Do not map IDs to Names") - flags.BoolVarP(&opts.follow, "follow", "f", false, "Follow log output") - flags.StringVar(&opts.since, "since", "", "Show logs since timestamp") - flags.BoolVarP(&opts.timestamps, "timestamps", "t", false, "Show timestamps") - flags.BoolVar(&opts.details, "details", false, "Show extra details provided to logs") - flags.StringVar(&opts.tail, "tail", "all", "Number of lines to show from the end of the logs") - return cmd -} - -func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error { - ctx := context.Background() - - options := types.ContainerLogsOptions{ - ShowStdout: true, - ShowStderr: true, - Since: opts.since, - Timestamps: opts.timestamps, - Follow: opts.follow, - Tail: opts.tail, - Details: opts.details, - } - - client := dockerCli.Client() - responseBody, err := client.ServiceLogs(ctx, opts.service, options) - if err != nil { - return err - } - defer responseBody.Close() - - resolver := idresolver.New(client, opts.noResolve) - - stdout := &logWriter{ctx: ctx, opts: opts, r: resolver, w: dockerCli.Out()} - stderr := &logWriter{ctx: ctx, opts: opts, r: resolver, w: dockerCli.Err()} - - // TODO(aluzzardi): Do an io.Copy for services with TTY enabled. - _, err = stdcopy.StdCopy(stdout, stderr, responseBody) - return err -} - -type logWriter struct { - ctx context.Context - opts *logsOptions - r *idresolver.IDResolver - w io.Writer -} - -func (lw *logWriter) Write(buf []byte) (int, error) { - contextIndex := 0 - numParts := 2 - if lw.opts.timestamps { - contextIndex++ - numParts++ - } - - parts := bytes.SplitN(buf, []byte(" "), numParts) - if len(parts) != numParts { - return 0, fmt.Errorf("invalid context in log message: %v", string(buf)) - } - - taskName, nodeName, err := lw.parseContext(string(parts[contextIndex])) - if err != nil { - return 0, err - } - - output := []byte{} - for i, part := range parts { - // First part doesn't get space separation. - if i > 0 { - output = append(output, []byte(" ")...) - } - - if i == contextIndex { - // TODO(aluzzardi): Consider constant padding. - output = append(output, []byte(fmt.Sprintf("%s@%s |", taskName, nodeName))...) - } else { - output = append(output, part...) - } - } - _, err = lw.w.Write(output) - if err != nil { - return 0, err - } - - return len(buf), nil -} - -func (lw *logWriter) parseContext(input string) (string, string, error) { - context := make(map[string]string) - - components := strings.Split(input, ",") - for _, component := range components { - parts := strings.SplitN(component, "=", 2) - if len(parts) != 2 { - return "", "", fmt.Errorf("invalid context: %s", input) - } - context[parts[0]] = parts[1] - } - - taskID, ok := context["com.docker.swarm.task.id"] - if !ok { - return "", "", fmt.Errorf("missing task id in context: %s", input) - } - taskName, err := lw.r.Resolve(lw.ctx, swarm.Task{}, taskID) - if err != nil { - return "", "", err - } - - nodeID, ok := context["com.docker.swarm.node.id"] - if !ok { - return "", "", fmt.Errorf("missing node id in context: %s", input) - } - nodeName, err := lw.r.Resolve(lw.ctx, swarm.Node{}, nodeID) - if err != nil { - return "", "", err - } - - return taskName, nodeName, nil -} diff --git a/vendor/github.com/docker/docker/cli/command/service/opts.go b/vendor/github.com/docker/docker/cli/command/service/opts.go deleted file mode 100644 index cbe544aac..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/opts.go +++ /dev/null @@ -1,648 +0,0 @@ -package service - -import ( - "encoding/csv" - "fmt" - "os" - "path/filepath" - "strconv" - "strings" - "time" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/opts" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/docker/go-connections/nat" - units "github.com/docker/go-units" - "github.com/spf13/cobra" -) - -type int64Value interface { - Value() int64 -} - -type memBytes int64 - -func (m *memBytes) String() string { - return units.BytesSize(float64(m.Value())) -} - -func (m *memBytes) Set(value string) error { - val, err := units.RAMInBytes(value) - *m = memBytes(val) - return err -} - -func (m *memBytes) Type() string { - return "bytes" -} - -func (m *memBytes) Value() int64 { - return int64(*m) -} - -// PositiveDurationOpt is an option type for time.Duration that uses a pointer. -// It bahave similarly to DurationOpt but only allows positive duration values. -type PositiveDurationOpt struct { - DurationOpt -} - -// Set a new value on the option. Setting a negative duration value will cause -// an error to be returned. -func (d *PositiveDurationOpt) Set(s string) error { - err := d.DurationOpt.Set(s) - if err != nil { - return err - } - if *d.DurationOpt.value < 0 { - return fmt.Errorf("duration cannot be negative") - } - return nil -} - -// DurationOpt is an option type for time.Duration that uses a pointer. This -// allows us to get nil values outside, instead of defaulting to 0 -type DurationOpt struct { - value *time.Duration -} - -// Set a new value on the option -func (d *DurationOpt) Set(s string) error { - v, err := time.ParseDuration(s) - d.value = &v - return err -} - -// Type returns the type of this option, which will be displayed in `--help` output -func (d *DurationOpt) Type() string { - return "duration" -} - -// String returns a string repr of this option -func (d *DurationOpt) String() string { - if d.value != nil { - return d.value.String() - } - return "" -} - -// Value returns the time.Duration -func (d *DurationOpt) Value() *time.Duration { - return d.value -} - -// Uint64Opt represents a uint64. -type Uint64Opt struct { - value *uint64 -} - -// Set a new value on the option -func (i *Uint64Opt) Set(s string) error { - v, err := strconv.ParseUint(s, 0, 64) - i.value = &v - return err -} - -// Type returns the type of this option, which will be displayed in `--help` output -func (i *Uint64Opt) Type() string { - return "uint" -} - -// String returns a string repr of this option -func (i *Uint64Opt) String() string { - if i.value != nil { - return fmt.Sprintf("%v", *i.value) - } - return "" -} - -// Value returns the uint64 -func (i *Uint64Opt) Value() *uint64 { - return i.value -} - -type floatValue float32 - -func (f *floatValue) Set(s string) error { - v, err := strconv.ParseFloat(s, 32) - *f = floatValue(v) - return err -} - -func (f *floatValue) Type() string { - return "float" -} - -func (f *floatValue) String() string { - return strconv.FormatFloat(float64(*f), 'g', -1, 32) -} - -func (f *floatValue) Value() float32 { - return float32(*f) -} - -// SecretRequestSpec is a type for requesting secrets -type SecretRequestSpec struct { - source string - target string - uid string - gid string - mode os.FileMode -} - -// SecretOpt is a Value type for parsing secrets -type SecretOpt struct { - values []*SecretRequestSpec -} - -// Set a new secret value -func (o *SecretOpt) Set(value string) error { - csvReader := csv.NewReader(strings.NewReader(value)) - fields, err := csvReader.Read() - if err != nil { - return err - } - - spec := &SecretRequestSpec{ - source: "", - target: "", - uid: "0", - gid: "0", - mode: 0444, - } - - for _, field := range fields { - parts := strings.SplitN(field, "=", 2) - key := strings.ToLower(parts[0]) - - if len(parts) != 2 { - return fmt.Errorf("invalid field '%s' must be a key=value pair", field) - } - - value := parts[1] - switch key { - case "source", "src": - spec.source = value - case "target": - tDir, _ := filepath.Split(value) - if tDir != "" { - return fmt.Errorf("target must not have a path") - } - spec.target = value - case "uid": - spec.uid = value - case "gid": - spec.gid = value - case "mode": - m, err := strconv.ParseUint(value, 0, 32) - if err != nil { - return fmt.Errorf("invalid mode specified: %v", err) - } - - spec.mode = os.FileMode(m) - default: - return fmt.Errorf("invalid field in secret request: %s", key) - } - } - - if spec.source == "" { - return fmt.Errorf("source is required") - } - - o.values = append(o.values, spec) - return nil -} - -// Type returns the type of this option -func (o *SecretOpt) Type() string { - return "secret" -} - -// String returns a string repr of this option -func (o *SecretOpt) String() string { - secrets := []string{} - for _, secret := range o.values { - repr := fmt.Sprintf("%s -> %s", secret.source, secret.target) - secrets = append(secrets, repr) - } - return strings.Join(secrets, ", ") -} - -// Value returns the secret requests -func (o *SecretOpt) Value() []*SecretRequestSpec { - return o.values -} - -type updateOptions struct { - parallelism uint64 - delay time.Duration - monitor time.Duration - onFailure string - maxFailureRatio floatValue -} - -type resourceOptions struct { - limitCPU opts.NanoCPUs - limitMemBytes memBytes - resCPU opts.NanoCPUs - resMemBytes memBytes -} - -func (r *resourceOptions) ToResourceRequirements() *swarm.ResourceRequirements { - return &swarm.ResourceRequirements{ - Limits: &swarm.Resources{ - NanoCPUs: r.limitCPU.Value(), - MemoryBytes: r.limitMemBytes.Value(), - }, - Reservations: &swarm.Resources{ - NanoCPUs: r.resCPU.Value(), - MemoryBytes: r.resMemBytes.Value(), - }, - } -} - -type restartPolicyOptions struct { - condition string - delay DurationOpt - maxAttempts Uint64Opt - window DurationOpt -} - -func (r *restartPolicyOptions) ToRestartPolicy() *swarm.RestartPolicy { - return &swarm.RestartPolicy{ - Condition: swarm.RestartPolicyCondition(r.condition), - Delay: r.delay.Value(), - MaxAttempts: r.maxAttempts.Value(), - Window: r.window.Value(), - } -} - -func convertNetworks(networks []string) []swarm.NetworkAttachmentConfig { - nets := []swarm.NetworkAttachmentConfig{} - for _, network := range networks { - nets = append(nets, swarm.NetworkAttachmentConfig{Target: network}) - } - return nets -} - -type endpointOptions struct { - mode string - publishPorts opts.PortOpt -} - -func (e *endpointOptions) ToEndpointSpec() *swarm.EndpointSpec { - return &swarm.EndpointSpec{ - Mode: swarm.ResolutionMode(strings.ToLower(e.mode)), - Ports: e.publishPorts.Value(), - } -} - -type logDriverOptions struct { - name string - opts opts.ListOpts -} - -func newLogDriverOptions() logDriverOptions { - return logDriverOptions{opts: opts.NewListOpts(runconfigopts.ValidateEnv)} -} - -func (ldo *logDriverOptions) toLogDriver() *swarm.Driver { - if ldo.name == "" { - return nil - } - - // set the log driver only if specified. - return &swarm.Driver{ - Name: ldo.name, - Options: runconfigopts.ConvertKVStringsToMap(ldo.opts.GetAll()), - } -} - -type healthCheckOptions struct { - cmd string - interval PositiveDurationOpt - timeout PositiveDurationOpt - retries int - noHealthcheck bool -} - -func (opts *healthCheckOptions) toHealthConfig() (*container.HealthConfig, error) { - var healthConfig *container.HealthConfig - haveHealthSettings := opts.cmd != "" || - opts.interval.Value() != nil || - opts.timeout.Value() != nil || - opts.retries != 0 - if opts.noHealthcheck { - if haveHealthSettings { - return nil, fmt.Errorf("--%s conflicts with --health-* options", flagNoHealthcheck) - } - healthConfig = &container.HealthConfig{Test: []string{"NONE"}} - } else if haveHealthSettings { - var test []string - if opts.cmd != "" { - test = []string{"CMD-SHELL", opts.cmd} - } - var interval, timeout time.Duration - if ptr := opts.interval.Value(); ptr != nil { - interval = *ptr - } - if ptr := opts.timeout.Value(); ptr != nil { - timeout = *ptr - } - healthConfig = &container.HealthConfig{ - Test: test, - Interval: interval, - Timeout: timeout, - Retries: opts.retries, - } - } - return healthConfig, nil -} - -// ValidatePort validates a string is in the expected format for a port definition -func ValidatePort(value string) (string, error) { - portMappings, err := nat.ParsePortSpec(value) - for _, portMapping := range portMappings { - if portMapping.Binding.HostIP != "" { - return "", fmt.Errorf("HostIP is not supported by a service.") - } - } - return value, err -} - -// convertExtraHostsToSwarmHosts converts an array of extra hosts in cli -// : -// into a swarmkit host format: -// IP_address canonical_hostname [aliases...] -// This assumes input value (:) has already been validated -func convertExtraHostsToSwarmHosts(extraHosts []string) []string { - hosts := []string{} - for _, extraHost := range extraHosts { - parts := strings.SplitN(extraHost, ":", 2) - hosts = append(hosts, fmt.Sprintf("%s %s", parts[1], parts[0])) - } - return hosts -} - -type serviceOptions struct { - name string - labels opts.ListOpts - containerLabels opts.ListOpts - image string - args []string - hostname string - env opts.ListOpts - envFile opts.ListOpts - workdir string - user string - groups opts.ListOpts - tty bool - mounts opts.MountOpt - dns opts.ListOpts - dnsSearch opts.ListOpts - dnsOption opts.ListOpts - hosts opts.ListOpts - - resources resourceOptions - stopGrace DurationOpt - - replicas Uint64Opt - mode string - - restartPolicy restartPolicyOptions - constraints opts.ListOpts - update updateOptions - networks opts.ListOpts - endpoint endpointOptions - - registryAuth bool - - logDriver logDriverOptions - - healthcheck healthCheckOptions - secrets opts.SecretOpt -} - -func newServiceOptions() *serviceOptions { - return &serviceOptions{ - labels: opts.NewListOpts(runconfigopts.ValidateEnv), - constraints: opts.NewListOpts(nil), - containerLabels: opts.NewListOpts(runconfigopts.ValidateEnv), - env: opts.NewListOpts(runconfigopts.ValidateEnv), - envFile: opts.NewListOpts(nil), - groups: opts.NewListOpts(nil), - logDriver: newLogDriverOptions(), - dns: opts.NewListOpts(opts.ValidateIPAddress), - dnsOption: opts.NewListOpts(nil), - dnsSearch: opts.NewListOpts(opts.ValidateDNSSearch), - hosts: opts.NewListOpts(runconfigopts.ValidateExtraHost), - networks: opts.NewListOpts(nil), - } -} - -func (opts *serviceOptions) ToService() (swarm.ServiceSpec, error) { - var service swarm.ServiceSpec - - envVariables, err := runconfigopts.ReadKVStrings(opts.envFile.GetAll(), opts.env.GetAll()) - if err != nil { - return service, err - } - - currentEnv := make([]string, 0, len(envVariables)) - for _, env := range envVariables { // need to process each var, in order - k := strings.SplitN(env, "=", 2)[0] - for i, current := range currentEnv { // remove duplicates - if current == env { - continue // no update required, may hide this behind flag to preserve order of envVariables - } - if strings.HasPrefix(current, k+"=") { - currentEnv = append(currentEnv[:i], currentEnv[i+1:]...) - } - } - currentEnv = append(currentEnv, env) - } - - service = swarm.ServiceSpec{ - Annotations: swarm.Annotations{ - Name: opts.name, - Labels: runconfigopts.ConvertKVStringsToMap(opts.labels.GetAll()), - }, - TaskTemplate: swarm.TaskSpec{ - ContainerSpec: swarm.ContainerSpec{ - Image: opts.image, - Args: opts.args, - Env: currentEnv, - Hostname: opts.hostname, - Labels: runconfigopts.ConvertKVStringsToMap(opts.containerLabels.GetAll()), - Dir: opts.workdir, - User: opts.user, - Groups: opts.groups.GetAll(), - TTY: opts.tty, - Mounts: opts.mounts.Value(), - DNSConfig: &swarm.DNSConfig{ - Nameservers: opts.dns.GetAll(), - Search: opts.dnsSearch.GetAll(), - Options: opts.dnsOption.GetAll(), - }, - Hosts: convertExtraHostsToSwarmHosts(opts.hosts.GetAll()), - StopGracePeriod: opts.stopGrace.Value(), - Secrets: nil, - }, - Networks: convertNetworks(opts.networks.GetAll()), - Resources: opts.resources.ToResourceRequirements(), - RestartPolicy: opts.restartPolicy.ToRestartPolicy(), - Placement: &swarm.Placement{ - Constraints: opts.constraints.GetAll(), - }, - LogDriver: opts.logDriver.toLogDriver(), - }, - Networks: convertNetworks(opts.networks.GetAll()), - Mode: swarm.ServiceMode{}, - UpdateConfig: &swarm.UpdateConfig{ - Parallelism: opts.update.parallelism, - Delay: opts.update.delay, - Monitor: opts.update.monitor, - FailureAction: opts.update.onFailure, - MaxFailureRatio: opts.update.maxFailureRatio.Value(), - }, - EndpointSpec: opts.endpoint.ToEndpointSpec(), - } - - healthConfig, err := opts.healthcheck.toHealthConfig() - if err != nil { - return service, err - } - service.TaskTemplate.ContainerSpec.Healthcheck = healthConfig - - switch opts.mode { - case "global": - if opts.replicas.Value() != nil { - return service, fmt.Errorf("replicas can only be used with replicated mode") - } - - service.Mode.Global = &swarm.GlobalService{} - case "replicated": - service.Mode.Replicated = &swarm.ReplicatedService{ - Replicas: opts.replicas.Value(), - } - default: - return service, fmt.Errorf("Unknown mode: %s", opts.mode) - } - return service, nil -} - -// addServiceFlags adds all flags that are common to both `create` and `update`. -// Any flags that are not common are added separately in the individual command -func addServiceFlags(cmd *cobra.Command, opts *serviceOptions) { - flags := cmd.Flags() - - flags.StringVarP(&opts.workdir, flagWorkdir, "w", "", "Working directory inside the container") - flags.StringVarP(&opts.user, flagUser, "u", "", "Username or UID (format: [:])") - flags.StringVar(&opts.hostname, flagHostname, "", "Container hostname") - - flags.Var(&opts.resources.limitCPU, flagLimitCPU, "Limit CPUs") - flags.Var(&opts.resources.limitMemBytes, flagLimitMemory, "Limit Memory") - flags.Var(&opts.resources.resCPU, flagReserveCPU, "Reserve CPUs") - flags.Var(&opts.resources.resMemBytes, flagReserveMemory, "Reserve Memory") - flags.Var(&opts.stopGrace, flagStopGracePeriod, "Time to wait before force killing a container (ns|us|ms|s|m|h)") - - flags.Var(&opts.replicas, flagReplicas, "Number of tasks") - - flags.StringVar(&opts.restartPolicy.condition, flagRestartCondition, "", "Restart when condition is met (none, on-failure, or any)") - flags.Var(&opts.restartPolicy.delay, flagRestartDelay, "Delay between restart attempts (ns|us|ms|s|m|h)") - flags.Var(&opts.restartPolicy.maxAttempts, flagRestartMaxAttempts, "Maximum number of restarts before giving up") - flags.Var(&opts.restartPolicy.window, flagRestartWindow, "Window used to evaluate the restart policy (ns|us|ms|s|m|h)") - - flags.Uint64Var(&opts.update.parallelism, flagUpdateParallelism, 1, "Maximum number of tasks updated simultaneously (0 to update all at once)") - flags.DurationVar(&opts.update.delay, flagUpdateDelay, time.Duration(0), "Delay between updates (ns|us|ms|s|m|h) (default 0s)") - flags.DurationVar(&opts.update.monitor, flagUpdateMonitor, time.Duration(0), "Duration after each task update to monitor for failure (ns|us|ms|s|m|h) (default 0s)") - flags.StringVar(&opts.update.onFailure, flagUpdateFailureAction, "pause", "Action on update failure (pause|continue)") - flags.Var(&opts.update.maxFailureRatio, flagUpdateMaxFailureRatio, "Failure rate to tolerate during an update") - - flags.StringVar(&opts.endpoint.mode, flagEndpointMode, "", "Endpoint mode (vip or dnsrr)") - - flags.BoolVar(&opts.registryAuth, flagRegistryAuth, false, "Send registry authentication details to swarm agents") - - flags.StringVar(&opts.logDriver.name, flagLogDriver, "", "Logging driver for service") - flags.Var(&opts.logDriver.opts, flagLogOpt, "Logging driver options") - - flags.StringVar(&opts.healthcheck.cmd, flagHealthCmd, "", "Command to run to check health") - flags.Var(&opts.healthcheck.interval, flagHealthInterval, "Time between running the check (ns|us|ms|s|m|h)") - flags.Var(&opts.healthcheck.timeout, flagHealthTimeout, "Maximum time to allow one check to run (ns|us|ms|s|m|h)") - flags.IntVar(&opts.healthcheck.retries, flagHealthRetries, 0, "Consecutive failures needed to report unhealthy") - flags.BoolVar(&opts.healthcheck.noHealthcheck, flagNoHealthcheck, false, "Disable any container-specified HEALTHCHECK") - - flags.BoolVarP(&opts.tty, flagTTY, "t", false, "Allocate a pseudo-TTY") -} - -const ( - flagConstraint = "constraint" - flagConstraintRemove = "constraint-rm" - flagConstraintAdd = "constraint-add" - flagContainerLabel = "container-label" - flagContainerLabelRemove = "container-label-rm" - flagContainerLabelAdd = "container-label-add" - flagDNS = "dns" - flagDNSRemove = "dns-rm" - flagDNSAdd = "dns-add" - flagDNSOption = "dns-option" - flagDNSOptionRemove = "dns-option-rm" - flagDNSOptionAdd = "dns-option-add" - flagDNSSearch = "dns-search" - flagDNSSearchRemove = "dns-search-rm" - flagDNSSearchAdd = "dns-search-add" - flagEndpointMode = "endpoint-mode" - flagHost = "host" - flagHostAdd = "host-add" - flagHostRemove = "host-rm" - flagHostname = "hostname" - flagEnv = "env" - flagEnvFile = "env-file" - flagEnvRemove = "env-rm" - flagEnvAdd = "env-add" - flagGroup = "group" - flagGroupAdd = "group-add" - flagGroupRemove = "group-rm" - flagLabel = "label" - flagLabelRemove = "label-rm" - flagLabelAdd = "label-add" - flagLimitCPU = "limit-cpu" - flagLimitMemory = "limit-memory" - flagMode = "mode" - flagMount = "mount" - flagMountRemove = "mount-rm" - flagMountAdd = "mount-add" - flagName = "name" - flagNetwork = "network" - flagPublish = "publish" - flagPublishRemove = "publish-rm" - flagPublishAdd = "publish-add" - flagReplicas = "replicas" - flagReserveCPU = "reserve-cpu" - flagReserveMemory = "reserve-memory" - flagRestartCondition = "restart-condition" - flagRestartDelay = "restart-delay" - flagRestartMaxAttempts = "restart-max-attempts" - flagRestartWindow = "restart-window" - flagStopGracePeriod = "stop-grace-period" - flagTTY = "tty" - flagUpdateDelay = "update-delay" - flagUpdateFailureAction = "update-failure-action" - flagUpdateMaxFailureRatio = "update-max-failure-ratio" - flagUpdateMonitor = "update-monitor" - flagUpdateParallelism = "update-parallelism" - flagUser = "user" - flagWorkdir = "workdir" - flagRegistryAuth = "with-registry-auth" - flagLogDriver = "log-driver" - flagLogOpt = "log-opt" - flagHealthCmd = "health-cmd" - flagHealthInterval = "health-interval" - flagHealthRetries = "health-retries" - flagHealthTimeout = "health-timeout" - flagNoHealthcheck = "no-healthcheck" - flagSecret = "secret" - flagSecretAdd = "secret-add" - flagSecretRemove = "secret-rm" -) diff --git a/vendor/github.com/docker/docker/cli/command/service/opts_test.go b/vendor/github.com/docker/docker/cli/command/service/opts_test.go deleted file mode 100644 index 78b956ad6..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/opts_test.go +++ /dev/null @@ -1,107 +0,0 @@ -package service - -import ( - "reflect" - "testing" - "time" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestMemBytesString(t *testing.T) { - var mem memBytes = 1048576 - assert.Equal(t, mem.String(), "1 MiB") -} - -func TestMemBytesSetAndValue(t *testing.T) { - var mem memBytes - assert.NilError(t, mem.Set("5kb")) - assert.Equal(t, mem.Value(), int64(5120)) -} - -func TestNanoCPUsString(t *testing.T) { - var cpus opts.NanoCPUs = 6100000000 - assert.Equal(t, cpus.String(), "6.100") -} - -func TestNanoCPUsSetAndValue(t *testing.T) { - var cpus opts.NanoCPUs - assert.NilError(t, cpus.Set("0.35")) - assert.Equal(t, cpus.Value(), int64(350000000)) -} - -func TestDurationOptString(t *testing.T) { - dur := time.Duration(300 * 10e8) - duration := DurationOpt{value: &dur} - assert.Equal(t, duration.String(), "5m0s") -} - -func TestDurationOptSetAndValue(t *testing.T) { - var duration DurationOpt - assert.NilError(t, duration.Set("300s")) - assert.Equal(t, *duration.Value(), time.Duration(300*10e8)) - assert.NilError(t, duration.Set("-300s")) - assert.Equal(t, *duration.Value(), time.Duration(-300*10e8)) -} - -func TestPositiveDurationOptSetAndValue(t *testing.T) { - var duration PositiveDurationOpt - assert.NilError(t, duration.Set("300s")) - assert.Equal(t, *duration.Value(), time.Duration(300*10e8)) - assert.Error(t, duration.Set("-300s"), "cannot be negative") -} - -func TestUint64OptString(t *testing.T) { - value := uint64(2345678) - opt := Uint64Opt{value: &value} - assert.Equal(t, opt.String(), "2345678") - - opt = Uint64Opt{} - assert.Equal(t, opt.String(), "") -} - -func TestUint64OptSetAndValue(t *testing.T) { - var opt Uint64Opt - assert.NilError(t, opt.Set("14445")) - assert.Equal(t, *opt.Value(), uint64(14445)) -} - -func TestHealthCheckOptionsToHealthConfig(t *testing.T) { - dur := time.Second - opt := healthCheckOptions{ - cmd: "curl", - interval: PositiveDurationOpt{DurationOpt{value: &dur}}, - timeout: PositiveDurationOpt{DurationOpt{value: &dur}}, - retries: 10, - } - config, err := opt.toHealthConfig() - assert.NilError(t, err) - assert.Equal(t, reflect.DeepEqual(config, &container.HealthConfig{ - Test: []string{"CMD-SHELL", "curl"}, - Interval: time.Second, - Timeout: time.Second, - Retries: 10, - }), true) -} - -func TestHealthCheckOptionsToHealthConfigNoHealthcheck(t *testing.T) { - opt := healthCheckOptions{ - noHealthcheck: true, - } - config, err := opt.toHealthConfig() - assert.NilError(t, err) - assert.Equal(t, reflect.DeepEqual(config, &container.HealthConfig{ - Test: []string{"NONE"}, - }), true) -} - -func TestHealthCheckOptionsToHealthConfigConflict(t *testing.T) { - opt := healthCheckOptions{ - cmd: "curl", - noHealthcheck: true, - } - _, err := opt.toHealthConfig() - assert.Error(t, err, "--no-healthcheck conflicts with --health-* options") -} diff --git a/vendor/github.com/docker/docker/cli/command/service/parse.go b/vendor/github.com/docker/docker/cli/command/service/parse.go deleted file mode 100644 index ce9b454ed..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/parse.go +++ /dev/null @@ -1,68 +0,0 @@ -package service - -import ( - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - swarmtypes "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/client" - "golang.org/x/net/context" -) - -// ParseSecrets retrieves the secrets from the requested names and converts -// them to secret references to use with the spec -func ParseSecrets(client client.SecretAPIClient, requestedSecrets []*types.SecretRequestOption) ([]*swarmtypes.SecretReference, error) { - secretRefs := make(map[string]*swarmtypes.SecretReference) - ctx := context.Background() - - for _, secret := range requestedSecrets { - if _, exists := secretRefs[secret.Target]; exists { - return nil, fmt.Errorf("duplicate secret target for %s not allowed", secret.Source) - } - secretRef := &swarmtypes.SecretReference{ - File: &swarmtypes.SecretReferenceFileTarget{ - Name: secret.Target, - UID: secret.UID, - GID: secret.GID, - Mode: secret.Mode, - }, - SecretName: secret.Source, - } - - secretRefs[secret.Target] = secretRef - } - - args := filters.NewArgs() - for _, s := range secretRefs { - args.Add("names", s.SecretName) - } - - secrets, err := client.SecretList(ctx, types.SecretListOptions{ - Filters: args, - }) - if err != nil { - return nil, err - } - - foundSecrets := make(map[string]string) - for _, secret := range secrets { - foundSecrets[secret.Spec.Annotations.Name] = secret.ID - } - - addedSecrets := []*swarmtypes.SecretReference{} - - for _, ref := range secretRefs { - id, ok := foundSecrets[ref.SecretName] - if !ok { - return nil, fmt.Errorf("secret not found: %s", ref.SecretName) - } - - // set the id for the ref to properly assign in swarm - // since swarm needs the ID instead of the name - ref.SecretID = id - addedSecrets = append(addedSecrets, ref) - } - - return addedSecrets, nil -} diff --git a/vendor/github.com/docker/docker/cli/command/service/ps.go b/vendor/github.com/docker/docker/cli/command/service/ps.go deleted file mode 100644 index cf94ad737..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/ps.go +++ /dev/null @@ -1,76 +0,0 @@ -package service - -import ( - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/idresolver" - "github.com/docker/docker/cli/command/node" - "github.com/docker/docker/cli/command/task" - "github.com/docker/docker/opts" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type psOptions struct { - serviceID string - quiet bool - noResolve bool - noTrunc bool - filter opts.FilterOpt -} - -func newPsCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := psOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "ps [OPTIONS] SERVICE", - Short: "List the tasks of a service", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.serviceID = args[0] - return runPS(dockerCli, opts) - }, - } - flags := cmd.Flags() - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display task IDs") - flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate output") - flags.BoolVar(&opts.noResolve, "no-resolve", false, "Do not map IDs to Names") - flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided") - - return cmd -} - -func runPS(dockerCli *command.DockerCli, opts psOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - service, _, err := client.ServiceInspectWithRaw(ctx, opts.serviceID) - if err != nil { - return err - } - - filter := opts.filter.Value() - filter.Add("service", service.ID) - if filter.Include("node") { - nodeFilters := filter.Get("node") - for _, nodeFilter := range nodeFilters { - nodeReference, err := node.Reference(ctx, client, nodeFilter) - if err != nil { - return err - } - filter.Del("node", nodeFilter) - filter.Add("node", nodeReference) - } - } - - tasks, err := client.TaskList(ctx, types.TaskListOptions{Filters: filter}) - if err != nil { - return err - } - - if opts.quiet { - return task.PrintQuiet(dockerCli, tasks) - } - return task.Print(dockerCli, ctx, tasks, idresolver.New(client, opts.noResolve), opts.noTrunc) -} diff --git a/vendor/github.com/docker/docker/cli/command/service/remove.go b/vendor/github.com/docker/docker/cli/command/service/remove.go deleted file mode 100644 index c3fbbabbc..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/remove.go +++ /dev/null @@ -1,47 +0,0 @@ -package service - -import ( - "fmt" - "strings" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { - - cmd := &cobra.Command{ - Use: "rm SERVICE [SERVICE...]", - Aliases: []string{"remove"}, - Short: "Remove one or more services", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runRemove(dockerCli, args) - }, - } - cmd.Flags() - - return cmd -} - -func runRemove(dockerCli *command.DockerCli, sids []string) error { - client := dockerCli.Client() - - ctx := context.Background() - - var errs []string - for _, sid := range sids { - err := client.ServiceRemove(ctx, sid) - if err != nil { - errs = append(errs, err.Error()) - continue - } - fmt.Fprintf(dockerCli.Out(), "%s\n", sid) - } - if len(errs) > 0 { - return fmt.Errorf(strings.Join(errs, "\n")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/service/scale.go b/vendor/github.com/docker/docker/cli/command/service/scale.go deleted file mode 100644 index cf89e9027..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/scale.go +++ /dev/null @@ -1,96 +0,0 @@ -package service - -import ( - "fmt" - "strconv" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -func newScaleCommand(dockerCli *command.DockerCli) *cobra.Command { - return &cobra.Command{ - Use: "scale SERVICE=REPLICAS [SERVICE=REPLICAS...]", - Short: "Scale one or multiple replicated services", - Args: scaleArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runScale(dockerCli, args) - }, - } -} - -func scaleArgs(cmd *cobra.Command, args []string) error { - if err := cli.RequiresMinArgs(1)(cmd, args); err != nil { - return err - } - for _, arg := range args { - if parts := strings.SplitN(arg, "=", 2); len(parts) != 2 { - return fmt.Errorf( - "Invalid scale specifier '%s'.\nSee '%s --help'.\n\nUsage: %s\n\n%s", - arg, - cmd.CommandPath(), - cmd.UseLine(), - cmd.Short, - ) - } - } - return nil -} - -func runScale(dockerCli *command.DockerCli, args []string) error { - var errors []string - for _, arg := range args { - parts := strings.SplitN(arg, "=", 2) - serviceID, scaleStr := parts[0], parts[1] - - // validate input arg scale number - scale, err := strconv.ParseUint(scaleStr, 10, 64) - if err != nil { - errors = append(errors, fmt.Sprintf("%s: invalid replicas value %s: %v", serviceID, scaleStr, err)) - continue - } - - if err := runServiceScale(dockerCli, serviceID, scale); err != nil { - errors = append(errors, fmt.Sprintf("%s: %v", serviceID, err)) - } - } - - if len(errors) == 0 { - return nil - } - return fmt.Errorf(strings.Join(errors, "\n")) -} - -func runServiceScale(dockerCli *command.DockerCli, serviceID string, scale uint64) error { - client := dockerCli.Client() - ctx := context.Background() - - service, _, err := client.ServiceInspectWithRaw(ctx, serviceID) - if err != nil { - return err - } - - serviceMode := &service.Spec.Mode - if serviceMode.Replicated == nil { - return fmt.Errorf("scale can only be used with replicated mode") - } - - serviceMode.Replicated.Replicas = &scale - - response, err := client.ServiceUpdate(ctx, service.ID, service.Version, service.Spec, types.ServiceUpdateOptions{}) - if err != nil { - return err - } - - for _, warning := range response.Warnings { - fmt.Fprintln(dockerCli.Err(), warning) - } - - fmt.Fprintf(dockerCli.Out(), "%s scaled to %d\n", serviceID, scale) - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/service/trust.go b/vendor/github.com/docker/docker/cli/command/service/trust.go deleted file mode 100644 index 052d49c32..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/trust.go +++ /dev/null @@ -1,96 +0,0 @@ -package service - -import ( - "encoding/hex" - "fmt" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - distreference "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/trust" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "github.com/docker/notary/tuf/data" - "github.com/pkg/errors" - "golang.org/x/net/context" -) - -func resolveServiceImageDigest(dockerCli *command.DockerCli, service *swarm.ServiceSpec) error { - if !command.IsTrusted() { - // Digests are resolved by the daemon when not using content - // trust. - return nil - } - - image := service.TaskTemplate.ContainerSpec.Image - - // We only attempt to resolve the digest if the reference - // could be parsed as a digest reference. Specifying an image ID - // is valid but not resolvable. There is no warning message for - // an image ID because it's valid to use one. - if _, err := digest.ParseDigest(image); err == nil { - return nil - } - - ref, err := reference.ParseNamed(image) - if err != nil { - return fmt.Errorf("Could not parse image reference %s", service.TaskTemplate.ContainerSpec.Image) - } - if _, ok := ref.(reference.Canonical); !ok { - ref = reference.WithDefaultTag(ref) - - taggedRef, ok := ref.(reference.NamedTagged) - if !ok { - // This should never happen because a reference either - // has a digest, or WithDefaultTag would give it a tag. - return errors.New("Failed to resolve image digest using content trust: reference is missing a tag") - } - - resolvedImage, err := trustedResolveDigest(context.Background(), dockerCli, taggedRef) - if err != nil { - return fmt.Errorf("Failed to resolve image digest using content trust: %v", err) - } - logrus.Debugf("resolved image tag to %s using content trust", resolvedImage.String()) - service.TaskTemplate.ContainerSpec.Image = resolvedImage.String() - } - return nil -} - -func trustedResolveDigest(ctx context.Context, cli *command.DockerCli, ref reference.NamedTagged) (distreference.Canonical, error) { - repoInfo, err := registry.ParseRepositoryInfo(ref) - if err != nil { - return nil, err - } - - authConfig := command.ResolveAuthConfig(ctx, cli, repoInfo.Index) - - notaryRepo, err := trust.GetNotaryRepository(cli, repoInfo, authConfig, "pull") - if err != nil { - return nil, errors.Wrap(err, "error establishing connection to trust repository") - } - - t, err := notaryRepo.GetTargetByName(ref.Tag(), trust.ReleasesRole, data.CanonicalTargetsRole) - if err != nil { - return nil, trust.NotaryError(repoInfo.FullName(), err) - } - // Only get the tag if it's in the top level targets role or the releases delegation role - // ignore it if it's in any other delegation roles - if t.Role != trust.ReleasesRole && t.Role != data.CanonicalTargetsRole { - return nil, trust.NotaryError(repoInfo.FullName(), fmt.Errorf("No trust data for %s", ref.String())) - } - - logrus.Debugf("retrieving target for %s role\n", t.Role) - h, ok := t.Hashes["sha256"] - if !ok { - return nil, errors.New("no valid hash, expecting sha256") - } - - dgst := digest.NewDigestFromHex("sha256", hex.EncodeToString(h)) - - // Using distribution reference package to make sure that adding a - // digest does not erase the tag. When the two reference packages - // are unified, this will no longer be an issue. - return distreference.WithDigest(ref, dgst) -} diff --git a/vendor/github.com/docker/docker/cli/command/service/update.go b/vendor/github.com/docker/docker/cli/command/service/update.go deleted file mode 100644 index d56de1091..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/update.go +++ /dev/null @@ -1,849 +0,0 @@ -package service - -import ( - "fmt" - "sort" - "strings" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - mounttypes "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/client" - "github.com/docker/docker/opts" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/docker/go-connections/nat" - shlex "github.com/flynn-archive/go-shlex" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -func newUpdateCommand(dockerCli *command.DockerCli) *cobra.Command { - serviceOpts := newServiceOptions() - - cmd := &cobra.Command{ - Use: "update [OPTIONS] SERVICE", - Short: "Update a service", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runUpdate(dockerCli, cmd.Flags(), args[0]) - }, - } - - flags := cmd.Flags() - flags.String("image", "", "Service image tag") - flags.String("args", "", "Service command args") - flags.Bool("rollback", false, "Rollback to previous specification") - flags.Bool("force", false, "Force update even if no changes require it") - addServiceFlags(cmd, serviceOpts) - - flags.Var(newListOptsVar(), flagEnvRemove, "Remove an environment variable") - flags.Var(newListOptsVar(), flagGroupRemove, "Remove a previously added supplementary user group from the container") - flags.Var(newListOptsVar(), flagLabelRemove, "Remove a label by its key") - flags.Var(newListOptsVar(), flagContainerLabelRemove, "Remove a container label by its key") - flags.Var(newListOptsVar(), flagMountRemove, "Remove a mount by its target path") - // flags.Var(newListOptsVar().WithValidator(validatePublishRemove), flagPublishRemove, "Remove a published port by its target port") - flags.Var(&opts.PortOpt{}, flagPublishRemove, "Remove a published port by its target port") - flags.Var(newListOptsVar(), flagConstraintRemove, "Remove a constraint") - flags.Var(newListOptsVar(), flagDNSRemove, "Remove a custom DNS server") - flags.Var(newListOptsVar(), flagDNSOptionRemove, "Remove a DNS option") - flags.Var(newListOptsVar(), flagDNSSearchRemove, "Remove a DNS search domain") - flags.Var(newListOptsVar(), flagHostRemove, "Remove a custom host-to-IP mapping (host:ip)") - flags.Var(&serviceOpts.labels, flagLabelAdd, "Add or update a service label") - flags.Var(&serviceOpts.containerLabels, flagContainerLabelAdd, "Add or update a container label") - flags.Var(&serviceOpts.env, flagEnvAdd, "Add or update an environment variable") - flags.Var(newListOptsVar(), flagSecretRemove, "Remove a secret") - flags.Var(&serviceOpts.secrets, flagSecretAdd, "Add or update a secret on a service") - flags.Var(&serviceOpts.mounts, flagMountAdd, "Add or update a mount on a service") - flags.Var(&serviceOpts.constraints, flagConstraintAdd, "Add or update a placement constraint") - flags.Var(&serviceOpts.endpoint.publishPorts, flagPublishAdd, "Add or update a published port") - flags.Var(&serviceOpts.groups, flagGroupAdd, "Add an additional supplementary user group to the container") - flags.Var(&serviceOpts.dns, flagDNSAdd, "Add or update a custom DNS server") - flags.Var(&serviceOpts.dnsOption, flagDNSOptionAdd, "Add or update a DNS option") - flags.Var(&serviceOpts.dnsSearch, flagDNSSearchAdd, "Add or update a custom DNS search domain") - flags.Var(&serviceOpts.hosts, flagHostAdd, "Add or update a custom host-to-IP mapping (host:ip)") - - return cmd -} - -func newListOptsVar() *opts.ListOpts { - return opts.NewListOptsRef(&[]string{}, nil) -} - -func runUpdate(dockerCli *command.DockerCli, flags *pflag.FlagSet, serviceID string) error { - apiClient := dockerCli.Client() - ctx := context.Background() - updateOpts := types.ServiceUpdateOptions{} - - service, _, err := apiClient.ServiceInspectWithRaw(ctx, serviceID) - if err != nil { - return err - } - - rollback, err := flags.GetBool("rollback") - if err != nil { - return err - } - - spec := &service.Spec - if rollback { - spec = service.PreviousSpec - if spec == nil { - return fmt.Errorf("service does not have a previous specification to roll back to") - } - } - - err = updateService(flags, spec) - if err != nil { - return err - } - - if flags.Changed("image") { - if err := resolveServiceImageDigest(dockerCli, spec); err != nil { - return err - } - } - - updatedSecrets, err := getUpdatedSecrets(apiClient, flags, spec.TaskTemplate.ContainerSpec.Secrets) - if err != nil { - return err - } - - spec.TaskTemplate.ContainerSpec.Secrets = updatedSecrets - - // only send auth if flag was set - sendAuth, err := flags.GetBool(flagRegistryAuth) - if err != nil { - return err - } - if sendAuth { - // Retrieve encoded auth token from the image reference - // This would be the old image if it didn't change in this update - image := spec.TaskTemplate.ContainerSpec.Image - encodedAuth, err := command.RetrieveAuthTokenFromImage(ctx, dockerCli, image) - if err != nil { - return err - } - updateOpts.EncodedRegistryAuth = encodedAuth - } else if rollback { - updateOpts.RegistryAuthFrom = types.RegistryAuthFromPreviousSpec - } else { - updateOpts.RegistryAuthFrom = types.RegistryAuthFromSpec - } - - response, err := apiClient.ServiceUpdate(ctx, service.ID, service.Version, *spec, updateOpts) - if err != nil { - return err - } - - for _, warning := range response.Warnings { - fmt.Fprintln(dockerCli.Err(), warning) - } - - fmt.Fprintf(dockerCli.Out(), "%s\n", serviceID) - return nil -} - -func updateService(flags *pflag.FlagSet, spec *swarm.ServiceSpec) error { - updateString := func(flag string, field *string) { - if flags.Changed(flag) { - *field, _ = flags.GetString(flag) - } - } - - updateInt64Value := func(flag string, field *int64) { - if flags.Changed(flag) { - *field = flags.Lookup(flag).Value.(int64Value).Value() - } - } - - updateFloatValue := func(flag string, field *float32) { - if flags.Changed(flag) { - *field = flags.Lookup(flag).Value.(*floatValue).Value() - } - } - - updateDuration := func(flag string, field *time.Duration) { - if flags.Changed(flag) { - *field, _ = flags.GetDuration(flag) - } - } - - updateDurationOpt := func(flag string, field **time.Duration) { - if flags.Changed(flag) { - val := *flags.Lookup(flag).Value.(*DurationOpt).Value() - *field = &val - } - } - - updateUint64 := func(flag string, field *uint64) { - if flags.Changed(flag) { - *field, _ = flags.GetUint64(flag) - } - } - - updateUint64Opt := func(flag string, field **uint64) { - if flags.Changed(flag) { - val := *flags.Lookup(flag).Value.(*Uint64Opt).Value() - *field = &val - } - } - - cspec := &spec.TaskTemplate.ContainerSpec - task := &spec.TaskTemplate - - taskResources := func() *swarm.ResourceRequirements { - if task.Resources == nil { - task.Resources = &swarm.ResourceRequirements{} - } - return task.Resources - } - - updateLabels(flags, &spec.Labels) - updateContainerLabels(flags, &cspec.Labels) - updateString("image", &cspec.Image) - updateStringToSlice(flags, "args", &cspec.Args) - updateEnvironment(flags, &cspec.Env) - updateString(flagWorkdir, &cspec.Dir) - updateString(flagUser, &cspec.User) - updateString(flagHostname, &cspec.Hostname) - if err := updateMounts(flags, &cspec.Mounts); err != nil { - return err - } - - if flags.Changed(flagLimitCPU) || flags.Changed(flagLimitMemory) { - taskResources().Limits = &swarm.Resources{} - updateInt64Value(flagLimitCPU, &task.Resources.Limits.NanoCPUs) - updateInt64Value(flagLimitMemory, &task.Resources.Limits.MemoryBytes) - } - if flags.Changed(flagReserveCPU) || flags.Changed(flagReserveMemory) { - taskResources().Reservations = &swarm.Resources{} - updateInt64Value(flagReserveCPU, &task.Resources.Reservations.NanoCPUs) - updateInt64Value(flagReserveMemory, &task.Resources.Reservations.MemoryBytes) - } - - updateDurationOpt(flagStopGracePeriod, &cspec.StopGracePeriod) - - if anyChanged(flags, flagRestartCondition, flagRestartDelay, flagRestartMaxAttempts, flagRestartWindow) { - if task.RestartPolicy == nil { - task.RestartPolicy = &swarm.RestartPolicy{} - } - - if flags.Changed(flagRestartCondition) { - value, _ := flags.GetString(flagRestartCondition) - task.RestartPolicy.Condition = swarm.RestartPolicyCondition(value) - } - updateDurationOpt(flagRestartDelay, &task.RestartPolicy.Delay) - updateUint64Opt(flagRestartMaxAttempts, &task.RestartPolicy.MaxAttempts) - updateDurationOpt(flagRestartWindow, &task.RestartPolicy.Window) - } - - if anyChanged(flags, flagConstraintAdd, flagConstraintRemove) { - if task.Placement == nil { - task.Placement = &swarm.Placement{} - } - updatePlacement(flags, task.Placement) - } - - if err := updateReplicas(flags, &spec.Mode); err != nil { - return err - } - - if anyChanged(flags, flagUpdateParallelism, flagUpdateDelay, flagUpdateMonitor, flagUpdateFailureAction, flagUpdateMaxFailureRatio) { - if spec.UpdateConfig == nil { - spec.UpdateConfig = &swarm.UpdateConfig{} - } - updateUint64(flagUpdateParallelism, &spec.UpdateConfig.Parallelism) - updateDuration(flagUpdateDelay, &spec.UpdateConfig.Delay) - updateDuration(flagUpdateMonitor, &spec.UpdateConfig.Monitor) - updateString(flagUpdateFailureAction, &spec.UpdateConfig.FailureAction) - updateFloatValue(flagUpdateMaxFailureRatio, &spec.UpdateConfig.MaxFailureRatio) - } - - if flags.Changed(flagEndpointMode) { - value, _ := flags.GetString(flagEndpointMode) - if spec.EndpointSpec == nil { - spec.EndpointSpec = &swarm.EndpointSpec{} - } - spec.EndpointSpec.Mode = swarm.ResolutionMode(value) - } - - if anyChanged(flags, flagGroupAdd, flagGroupRemove) { - if err := updateGroups(flags, &cspec.Groups); err != nil { - return err - } - } - - if anyChanged(flags, flagPublishAdd, flagPublishRemove) { - if spec.EndpointSpec == nil { - spec.EndpointSpec = &swarm.EndpointSpec{} - } - if err := updatePorts(flags, &spec.EndpointSpec.Ports); err != nil { - return err - } - } - - if anyChanged(flags, flagDNSAdd, flagDNSRemove, flagDNSOptionAdd, flagDNSOptionRemove, flagDNSSearchAdd, flagDNSSearchRemove) { - if cspec.DNSConfig == nil { - cspec.DNSConfig = &swarm.DNSConfig{} - } - if err := updateDNSConfig(flags, &cspec.DNSConfig); err != nil { - return err - } - } - - if anyChanged(flags, flagHostAdd, flagHostRemove) { - if err := updateHosts(flags, &cspec.Hosts); err != nil { - return err - } - } - - if err := updateLogDriver(flags, &spec.TaskTemplate); err != nil { - return err - } - - force, err := flags.GetBool("force") - if err != nil { - return err - } - - if force { - spec.TaskTemplate.ForceUpdate++ - } - - if err := updateHealthcheck(flags, cspec); err != nil { - return err - } - - if flags.Changed(flagTTY) { - tty, err := flags.GetBool(flagTTY) - if err != nil { - return err - } - cspec.TTY = tty - } - - return nil -} - -func updateStringToSlice(flags *pflag.FlagSet, flag string, field *[]string) error { - if !flags.Changed(flag) { - return nil - } - - value, _ := flags.GetString(flag) - valueSlice, err := shlex.Split(value) - *field = valueSlice - return err -} - -func anyChanged(flags *pflag.FlagSet, fields ...string) bool { - for _, flag := range fields { - if flags.Changed(flag) { - return true - } - } - return false -} - -func updatePlacement(flags *pflag.FlagSet, placement *swarm.Placement) { - if flags.Changed(flagConstraintAdd) { - values := flags.Lookup(flagConstraintAdd).Value.(*opts.ListOpts).GetAll() - placement.Constraints = append(placement.Constraints, values...) - } - toRemove := buildToRemoveSet(flags, flagConstraintRemove) - - newConstraints := []string{} - for _, constraint := range placement.Constraints { - if _, exists := toRemove[constraint]; !exists { - newConstraints = append(newConstraints, constraint) - } - } - // Sort so that result is predictable. - sort.Strings(newConstraints) - - placement.Constraints = newConstraints -} - -func updateContainerLabels(flags *pflag.FlagSet, field *map[string]string) { - if flags.Changed(flagContainerLabelAdd) { - if *field == nil { - *field = map[string]string{} - } - - values := flags.Lookup(flagContainerLabelAdd).Value.(*opts.ListOpts).GetAll() - for key, value := range runconfigopts.ConvertKVStringsToMap(values) { - (*field)[key] = value - } - } - - if *field != nil && flags.Changed(flagContainerLabelRemove) { - toRemove := flags.Lookup(flagContainerLabelRemove).Value.(*opts.ListOpts).GetAll() - for _, label := range toRemove { - delete(*field, label) - } - } -} - -func updateLabels(flags *pflag.FlagSet, field *map[string]string) { - if flags.Changed(flagLabelAdd) { - if *field == nil { - *field = map[string]string{} - } - - values := flags.Lookup(flagLabelAdd).Value.(*opts.ListOpts).GetAll() - for key, value := range runconfigopts.ConvertKVStringsToMap(values) { - (*field)[key] = value - } - } - - if *field != nil && flags.Changed(flagLabelRemove) { - toRemove := flags.Lookup(flagLabelRemove).Value.(*opts.ListOpts).GetAll() - for _, label := range toRemove { - delete(*field, label) - } - } -} - -func updateEnvironment(flags *pflag.FlagSet, field *[]string) { - envSet := map[string]string{} - for _, v := range *field { - envSet[envKey(v)] = v - } - if flags.Changed(flagEnvAdd) { - value := flags.Lookup(flagEnvAdd).Value.(*opts.ListOpts) - for _, v := range value.GetAll() { - envSet[envKey(v)] = v - } - } - - *field = []string{} - for _, v := range envSet { - *field = append(*field, v) - } - - toRemove := buildToRemoveSet(flags, flagEnvRemove) - *field = removeItems(*field, toRemove, envKey) -} - -func getUpdatedSecrets(apiClient client.SecretAPIClient, flags *pflag.FlagSet, secrets []*swarm.SecretReference) ([]*swarm.SecretReference, error) { - if flags.Changed(flagSecretAdd) { - values := flags.Lookup(flagSecretAdd).Value.(*opts.SecretOpt).Value() - - addSecrets, err := ParseSecrets(apiClient, values) - if err != nil { - return nil, err - } - secrets = append(secrets, addSecrets...) - } - toRemove := buildToRemoveSet(flags, flagSecretRemove) - newSecrets := []*swarm.SecretReference{} - for _, secret := range secrets { - if _, exists := toRemove[secret.SecretName]; !exists { - newSecrets = append(newSecrets, secret) - } - } - - return newSecrets, nil -} - -func envKey(value string) string { - kv := strings.SplitN(value, "=", 2) - return kv[0] -} - -func itemKey(value string) string { - return value -} - -func buildToRemoveSet(flags *pflag.FlagSet, flag string) map[string]struct{} { - var empty struct{} - toRemove := make(map[string]struct{}) - - if !flags.Changed(flag) { - return toRemove - } - - toRemoveSlice := flags.Lookup(flag).Value.(*opts.ListOpts).GetAll() - for _, key := range toRemoveSlice { - toRemove[key] = empty - } - return toRemove -} - -func removeItems( - seq []string, - toRemove map[string]struct{}, - keyFunc func(string) string, -) []string { - newSeq := []string{} - for _, item := range seq { - if _, exists := toRemove[keyFunc(item)]; !exists { - newSeq = append(newSeq, item) - } - } - return newSeq -} - -type byMountSource []mounttypes.Mount - -func (m byMountSource) Len() int { return len(m) } -func (m byMountSource) Swap(i, j int) { m[i], m[j] = m[j], m[i] } -func (m byMountSource) Less(i, j int) bool { - a, b := m[i], m[j] - - if a.Source == b.Source { - return a.Target < b.Target - } - - return a.Source < b.Source -} - -func updateMounts(flags *pflag.FlagSet, mounts *[]mounttypes.Mount) error { - - mountsByTarget := map[string]mounttypes.Mount{} - - if flags.Changed(flagMountAdd) { - values := flags.Lookup(flagMountAdd).Value.(*opts.MountOpt).Value() - for _, mount := range values { - if _, ok := mountsByTarget[mount.Target]; ok { - return fmt.Errorf("duplicate mount target") - } - mountsByTarget[mount.Target] = mount - } - } - - // Add old list of mount points minus updated one. - for _, mount := range *mounts { - if _, ok := mountsByTarget[mount.Target]; !ok { - mountsByTarget[mount.Target] = mount - } - } - - newMounts := []mounttypes.Mount{} - - toRemove := buildToRemoveSet(flags, flagMountRemove) - - for _, mount := range mountsByTarget { - if _, exists := toRemove[mount.Target]; !exists { - newMounts = append(newMounts, mount) - } - } - sort.Sort(byMountSource(newMounts)) - *mounts = newMounts - return nil -} - -func updateGroups(flags *pflag.FlagSet, groups *[]string) error { - if flags.Changed(flagGroupAdd) { - values := flags.Lookup(flagGroupAdd).Value.(*opts.ListOpts).GetAll() - *groups = append(*groups, values...) - } - toRemove := buildToRemoveSet(flags, flagGroupRemove) - - newGroups := []string{} - for _, group := range *groups { - if _, exists := toRemove[group]; !exists { - newGroups = append(newGroups, group) - } - } - // Sort so that result is predictable. - sort.Strings(newGroups) - - *groups = newGroups - return nil -} - -func removeDuplicates(entries []string) []string { - hit := map[string]bool{} - newEntries := []string{} - for _, v := range entries { - if !hit[v] { - newEntries = append(newEntries, v) - hit[v] = true - } - } - return newEntries -} - -func updateDNSConfig(flags *pflag.FlagSet, config **swarm.DNSConfig) error { - newConfig := &swarm.DNSConfig{} - - nameservers := (*config).Nameservers - if flags.Changed(flagDNSAdd) { - values := flags.Lookup(flagDNSAdd).Value.(*opts.ListOpts).GetAll() - nameservers = append(nameservers, values...) - } - nameservers = removeDuplicates(nameservers) - toRemove := buildToRemoveSet(flags, flagDNSRemove) - for _, nameserver := range nameservers { - if _, exists := toRemove[nameserver]; !exists { - newConfig.Nameservers = append(newConfig.Nameservers, nameserver) - - } - } - // Sort so that result is predictable. - sort.Strings(newConfig.Nameservers) - - search := (*config).Search - if flags.Changed(flagDNSSearchAdd) { - values := flags.Lookup(flagDNSSearchAdd).Value.(*opts.ListOpts).GetAll() - search = append(search, values...) - } - search = removeDuplicates(search) - toRemove = buildToRemoveSet(flags, flagDNSSearchRemove) - for _, entry := range search { - if _, exists := toRemove[entry]; !exists { - newConfig.Search = append(newConfig.Search, entry) - } - } - // Sort so that result is predictable. - sort.Strings(newConfig.Search) - - options := (*config).Options - if flags.Changed(flagDNSOptionAdd) { - values := flags.Lookup(flagDNSOptionAdd).Value.(*opts.ListOpts).GetAll() - options = append(options, values...) - } - options = removeDuplicates(options) - toRemove = buildToRemoveSet(flags, flagDNSOptionRemove) - for _, option := range options { - if _, exists := toRemove[option]; !exists { - newConfig.Options = append(newConfig.Options, option) - } - } - // Sort so that result is predictable. - sort.Strings(newConfig.Options) - - *config = newConfig - return nil -} - -type byPortConfig []swarm.PortConfig - -func (r byPortConfig) Len() int { return len(r) } -func (r byPortConfig) Swap(i, j int) { r[i], r[j] = r[j], r[i] } -func (r byPortConfig) Less(i, j int) bool { - // We convert PortConfig into `port/protocol`, e.g., `80/tcp` - // In updatePorts we already filter out with map so there is duplicate entries - return portConfigToString(&r[i]) < portConfigToString(&r[j]) -} - -func portConfigToString(portConfig *swarm.PortConfig) string { - protocol := portConfig.Protocol - mode := portConfig.PublishMode - return fmt.Sprintf("%v:%v/%s/%s", portConfig.PublishedPort, portConfig.TargetPort, protocol, mode) -} - -// FIXME(vdemeester) port to opts.PortOpt -// This validation is only used for `--publish-rm`. -// The `--publish-rm` takes: -// [/] (e.g., 80, 80/tcp, 53/udp) -func validatePublishRemove(val string) (string, error) { - proto, port := nat.SplitProtoPort(val) - if proto != "tcp" && proto != "udp" { - return "", fmt.Errorf("invalid protocol '%s' for %s", proto, val) - } - if strings.Contains(port, ":") { - return "", fmt.Errorf("invalid port format: '%s', should be [/] (e.g., 80, 80/tcp, 53/udp)", port) - } - if _, err := nat.ParsePort(port); err != nil { - return "", err - } - return val, nil -} - -func updatePorts(flags *pflag.FlagSet, portConfig *[]swarm.PortConfig) error { - // The key of the map is `port/protocol`, e.g., `80/tcp` - portSet := map[string]swarm.PortConfig{} - - // Build the current list of portConfig - for _, entry := range *portConfig { - if _, ok := portSet[portConfigToString(&entry)]; !ok { - portSet[portConfigToString(&entry)] = entry - } - } - - newPorts := []swarm.PortConfig{} - - // Clean current ports - toRemove := flags.Lookup(flagPublishRemove).Value.(*opts.PortOpt).Value() -portLoop: - for _, port := range portSet { - for _, pConfig := range toRemove { - if equalProtocol(port.Protocol, pConfig.Protocol) && - port.TargetPort == pConfig.TargetPort && - equalPublishMode(port.PublishMode, pConfig.PublishMode) { - continue portLoop - } - } - - newPorts = append(newPorts, port) - } - - // Check to see if there are any conflict in flags. - if flags.Changed(flagPublishAdd) { - ports := flags.Lookup(flagPublishAdd).Value.(*opts.PortOpt).Value() - - for _, port := range ports { - if v, ok := portSet[portConfigToString(&port)]; ok { - if v != port { - fmt.Println("v", v) - return fmt.Errorf("conflicting port mapping between %v:%v/%s and %v:%v/%s", port.PublishedPort, port.TargetPort, port.Protocol, v.PublishedPort, v.TargetPort, v.Protocol) - } - continue - } - //portSet[portConfigToString(&port)] = port - newPorts = append(newPorts, port) - } - } - - // Sort the PortConfig to avoid unnecessary updates - sort.Sort(byPortConfig(newPorts)) - *portConfig = newPorts - return nil -} - -func equalProtocol(prot1, prot2 swarm.PortConfigProtocol) bool { - return prot1 == prot2 || - (prot1 == swarm.PortConfigProtocol("") && prot2 == swarm.PortConfigProtocolTCP) || - (prot2 == swarm.PortConfigProtocol("") && prot1 == swarm.PortConfigProtocolTCP) -} - -func equalPublishMode(mode1, mode2 swarm.PortConfigPublishMode) bool { - return mode1 == mode2 || - (mode1 == swarm.PortConfigPublishMode("") && mode2 == swarm.PortConfigPublishModeIngress) || - (mode2 == swarm.PortConfigPublishMode("") && mode1 == swarm.PortConfigPublishModeIngress) -} - -func equalPort(targetPort nat.Port, port swarm.PortConfig) bool { - return (string(port.Protocol) == targetPort.Proto() && - port.TargetPort == uint32(targetPort.Int())) -} - -func updateReplicas(flags *pflag.FlagSet, serviceMode *swarm.ServiceMode) error { - if !flags.Changed(flagReplicas) { - return nil - } - - if serviceMode == nil || serviceMode.Replicated == nil { - return fmt.Errorf("replicas can only be used with replicated mode") - } - serviceMode.Replicated.Replicas = flags.Lookup(flagReplicas).Value.(*Uint64Opt).Value() - return nil -} - -func updateHosts(flags *pflag.FlagSet, hosts *[]string) error { - // Combine existing Hosts (in swarmkit format) with the host to add (convert to swarmkit format) - if flags.Changed(flagHostAdd) { - values := convertExtraHostsToSwarmHosts(flags.Lookup(flagHostAdd).Value.(*opts.ListOpts).GetAll()) - *hosts = append(*hosts, values...) - } - // Remove duplicate - *hosts = removeDuplicates(*hosts) - - keysToRemove := make(map[string]struct{}) - if flags.Changed(flagHostRemove) { - var empty struct{} - extraHostsToRemove := flags.Lookup(flagHostRemove).Value.(*opts.ListOpts).GetAll() - for _, entry := range extraHostsToRemove { - key := strings.SplitN(entry, ":", 2)[0] - keysToRemove[key] = empty - } - } - - newHosts := []string{} - for _, entry := range *hosts { - // Since this is in swarmkit format, we need to find the key, which is canonical_hostname of: - // IP_address canonical_hostname [aliases...] - parts := strings.Fields(entry) - if len(parts) > 1 { - key := parts[1] - if _, exists := keysToRemove[key]; !exists { - newHosts = append(newHosts, entry) - } - } else { - newHosts = append(newHosts, entry) - } - } - - // Sort so that result is predictable. - sort.Strings(newHosts) - - *hosts = newHosts - return nil -} - -// updateLogDriver updates the log driver only if the log driver flag is set. -// All options will be replaced with those provided on the command line. -func updateLogDriver(flags *pflag.FlagSet, taskTemplate *swarm.TaskSpec) error { - if !flags.Changed(flagLogDriver) { - return nil - } - - name, err := flags.GetString(flagLogDriver) - if err != nil { - return err - } - - if name == "" { - return nil - } - - taskTemplate.LogDriver = &swarm.Driver{ - Name: name, - Options: runconfigopts.ConvertKVStringsToMap(flags.Lookup(flagLogOpt).Value.(*opts.ListOpts).GetAll()), - } - - return nil -} - -func updateHealthcheck(flags *pflag.FlagSet, containerSpec *swarm.ContainerSpec) error { - if !anyChanged(flags, flagNoHealthcheck, flagHealthCmd, flagHealthInterval, flagHealthRetries, flagHealthTimeout) { - return nil - } - if containerSpec.Healthcheck == nil { - containerSpec.Healthcheck = &container.HealthConfig{} - } - noHealthcheck, err := flags.GetBool(flagNoHealthcheck) - if err != nil { - return err - } - if noHealthcheck { - if !anyChanged(flags, flagHealthCmd, flagHealthInterval, flagHealthRetries, flagHealthTimeout) { - containerSpec.Healthcheck = &container.HealthConfig{ - Test: []string{"NONE"}, - } - return nil - } - return fmt.Errorf("--%s conflicts with --health-* options", flagNoHealthcheck) - } - if len(containerSpec.Healthcheck.Test) > 0 && containerSpec.Healthcheck.Test[0] == "NONE" { - containerSpec.Healthcheck.Test = nil - } - if flags.Changed(flagHealthInterval) { - val := *flags.Lookup(flagHealthInterval).Value.(*PositiveDurationOpt).Value() - containerSpec.Healthcheck.Interval = val - } - if flags.Changed(flagHealthTimeout) { - val := *flags.Lookup(flagHealthTimeout).Value.(*PositiveDurationOpt).Value() - containerSpec.Healthcheck.Timeout = val - } - if flags.Changed(flagHealthRetries) { - containerSpec.Healthcheck.Retries, _ = flags.GetInt(flagHealthRetries) - } - if flags.Changed(flagHealthCmd) { - cmd, _ := flags.GetString(flagHealthCmd) - if cmd != "" { - containerSpec.Healthcheck.Test = []string{"CMD-SHELL", cmd} - } else { - containerSpec.Healthcheck.Test = nil - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/service/update_test.go b/vendor/github.com/docker/docker/cli/command/service/update_test.go deleted file mode 100644 index 08fe24876..000000000 --- a/vendor/github.com/docker/docker/cli/command/service/update_test.go +++ /dev/null @@ -1,384 +0,0 @@ -package service - -import ( - "reflect" - "sort" - "testing" - "time" - - "github.com/docker/docker/api/types/container" - mounttypes "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestUpdateServiceArgs(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("args", "the \"new args\"") - - spec := &swarm.ServiceSpec{} - cspec := &spec.TaskTemplate.ContainerSpec - cspec.Args = []string{"old", "args"} - - updateService(flags, spec) - assert.EqualStringSlice(t, cspec.Args, []string{"the", "new args"}) -} - -func TestUpdateLabels(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("label-add", "toadd=newlabel") - flags.Set("label-rm", "toremove") - - labels := map[string]string{ - "toremove": "thelabeltoremove", - "tokeep": "value", - } - - updateLabels(flags, &labels) - assert.Equal(t, len(labels), 2) - assert.Equal(t, labels["tokeep"], "value") - assert.Equal(t, labels["toadd"], "newlabel") -} - -func TestUpdateLabelsRemoveALabelThatDoesNotExist(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("label-rm", "dne") - - labels := map[string]string{"foo": "theoldlabel"} - updateLabels(flags, &labels) - assert.Equal(t, len(labels), 1) -} - -func TestUpdatePlacement(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("constraint-add", "node=toadd") - flags.Set("constraint-rm", "node!=toremove") - - placement := &swarm.Placement{ - Constraints: []string{"node!=toremove", "container=tokeep"}, - } - - updatePlacement(flags, placement) - assert.Equal(t, len(placement.Constraints), 2) - assert.Equal(t, placement.Constraints[0], "container=tokeep") - assert.Equal(t, placement.Constraints[1], "node=toadd") -} - -func TestUpdateEnvironment(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("env-add", "toadd=newenv") - flags.Set("env-rm", "toremove") - - envs := []string{"toremove=theenvtoremove", "tokeep=value"} - - updateEnvironment(flags, &envs) - assert.Equal(t, len(envs), 2) - // Order has been removed in updateEnvironment (map) - sort.Strings(envs) - assert.Equal(t, envs[0], "toadd=newenv") - assert.Equal(t, envs[1], "tokeep=value") -} - -func TestUpdateEnvironmentWithDuplicateValues(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("env-add", "foo=newenv") - flags.Set("env-add", "foo=dupe") - flags.Set("env-rm", "foo") - - envs := []string{"foo=value"} - - updateEnvironment(flags, &envs) - assert.Equal(t, len(envs), 0) -} - -func TestUpdateEnvironmentWithDuplicateKeys(t *testing.T) { - // Test case for #25404 - flags := newUpdateCommand(nil).Flags() - flags.Set("env-add", "A=b") - - envs := []string{"A=c"} - - updateEnvironment(flags, &envs) - assert.Equal(t, len(envs), 1) - assert.Equal(t, envs[0], "A=b") -} - -func TestUpdateGroups(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("group-add", "wheel") - flags.Set("group-add", "docker") - flags.Set("group-rm", "root") - flags.Set("group-add", "foo") - flags.Set("group-rm", "docker") - - groups := []string{"bar", "root"} - - updateGroups(flags, &groups) - assert.Equal(t, len(groups), 3) - assert.Equal(t, groups[0], "bar") - assert.Equal(t, groups[1], "foo") - assert.Equal(t, groups[2], "wheel") -} - -func TestUpdateDNSConfig(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - - // IPv4, with duplicates - flags.Set("dns-add", "1.1.1.1") - flags.Set("dns-add", "1.1.1.1") - flags.Set("dns-add", "2.2.2.2") - flags.Set("dns-rm", "3.3.3.3") - flags.Set("dns-rm", "2.2.2.2") - // IPv6 - flags.Set("dns-add", "2001:db8:abc8::1") - // Invalid dns record - assert.Error(t, flags.Set("dns-add", "x.y.z.w"), "x.y.z.w is not an ip address") - - // domains with duplicates - flags.Set("dns-search-add", "example.com") - flags.Set("dns-search-add", "example.com") - flags.Set("dns-search-add", "example.org") - flags.Set("dns-search-rm", "example.org") - // Invalid dns search domain - assert.Error(t, flags.Set("dns-search-add", "example$com"), "example$com is not a valid domain") - - flags.Set("dns-option-add", "ndots:9") - flags.Set("dns-option-rm", "timeout:3") - - config := &swarm.DNSConfig{ - Nameservers: []string{"3.3.3.3", "5.5.5.5"}, - Search: []string{"localdomain"}, - Options: []string{"timeout:3"}, - } - - updateDNSConfig(flags, &config) - - assert.Equal(t, len(config.Nameservers), 3) - assert.Equal(t, config.Nameservers[0], "1.1.1.1") - assert.Equal(t, config.Nameservers[1], "2001:db8:abc8::1") - assert.Equal(t, config.Nameservers[2], "5.5.5.5") - - assert.Equal(t, len(config.Search), 2) - assert.Equal(t, config.Search[0], "example.com") - assert.Equal(t, config.Search[1], "localdomain") - - assert.Equal(t, len(config.Options), 1) - assert.Equal(t, config.Options[0], "ndots:9") -} - -func TestUpdateMounts(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("mount-add", "type=volume,source=vol2,target=/toadd") - flags.Set("mount-rm", "/toremove") - - mounts := []mounttypes.Mount{ - {Target: "/toremove", Source: "vol1", Type: mounttypes.TypeBind}, - {Target: "/tokeep", Source: "vol3", Type: mounttypes.TypeBind}, - } - - updateMounts(flags, &mounts) - assert.Equal(t, len(mounts), 2) - assert.Equal(t, mounts[0].Target, "/toadd") - assert.Equal(t, mounts[1].Target, "/tokeep") - -} - -func TestUpdateMountsWithDuplicateMounts(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("mount-add", "type=volume,source=vol4,target=/toadd") - - mounts := []mounttypes.Mount{ - {Target: "/tokeep1", Source: "vol1", Type: mounttypes.TypeBind}, - {Target: "/toadd", Source: "vol2", Type: mounttypes.TypeBind}, - {Target: "/tokeep2", Source: "vol3", Type: mounttypes.TypeBind}, - } - - updateMounts(flags, &mounts) - assert.Equal(t, len(mounts), 3) - assert.Equal(t, mounts[0].Target, "/tokeep1") - assert.Equal(t, mounts[1].Target, "/tokeep2") - assert.Equal(t, mounts[2].Target, "/toadd") -} - -func TestUpdatePorts(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("publish-add", "1000:1000") - flags.Set("publish-rm", "333/udp") - - portConfigs := []swarm.PortConfig{ - {TargetPort: 333, Protocol: swarm.PortConfigProtocolUDP}, - {TargetPort: 555}, - } - - err := updatePorts(flags, &portConfigs) - assert.Equal(t, err, nil) - assert.Equal(t, len(portConfigs), 2) - // Do a sort to have the order (might have changed by map) - targetPorts := []int{int(portConfigs[0].TargetPort), int(portConfigs[1].TargetPort)} - sort.Ints(targetPorts) - assert.Equal(t, targetPorts[0], 555) - assert.Equal(t, targetPorts[1], 1000) -} - -func TestUpdatePortsDuplicate(t *testing.T) { - // Test case for #25375 - flags := newUpdateCommand(nil).Flags() - flags.Set("publish-add", "80:80") - - portConfigs := []swarm.PortConfig{ - { - TargetPort: 80, - PublishedPort: 80, - Protocol: swarm.PortConfigProtocolTCP, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - } - - err := updatePorts(flags, &portConfigs) - assert.Equal(t, err, nil) - assert.Equal(t, len(portConfigs), 1) - assert.Equal(t, portConfigs[0].TargetPort, uint32(80)) -} - -func TestUpdateHealthcheckTable(t *testing.T) { - type test struct { - flags [][2]string - initial *container.HealthConfig - expected *container.HealthConfig - err string - } - testCases := []test{ - { - flags: [][2]string{{"no-healthcheck", "true"}}, - initial: &container.HealthConfig{Test: []string{"CMD-SHELL", "cmd1"}, Retries: 10}, - expected: &container.HealthConfig{Test: []string{"NONE"}}, - }, - { - flags: [][2]string{{"health-cmd", "cmd1"}}, - initial: &container.HealthConfig{Test: []string{"NONE"}}, - expected: &container.HealthConfig{Test: []string{"CMD-SHELL", "cmd1"}}, - }, - { - flags: [][2]string{{"health-retries", "10"}}, - initial: &container.HealthConfig{Test: []string{"NONE"}}, - expected: &container.HealthConfig{Retries: 10}, - }, - { - flags: [][2]string{{"health-retries", "10"}}, - initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}}, - expected: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Retries: 10}, - }, - { - flags: [][2]string{{"health-interval", "1m"}}, - initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}}, - expected: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Interval: time.Minute}, - }, - { - flags: [][2]string{{"health-cmd", ""}}, - initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Retries: 10}, - expected: &container.HealthConfig{Retries: 10}, - }, - { - flags: [][2]string{{"health-retries", "0"}}, - initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Retries: 10}, - expected: &container.HealthConfig{Test: []string{"CMD", "cmd1"}}, - }, - { - flags: [][2]string{{"health-cmd", "cmd1"}, {"no-healthcheck", "true"}}, - err: "--no-healthcheck conflicts with --health-* options", - }, - { - flags: [][2]string{{"health-interval", "10m"}, {"no-healthcheck", "true"}}, - err: "--no-healthcheck conflicts with --health-* options", - }, - { - flags: [][2]string{{"health-timeout", "1m"}, {"no-healthcheck", "true"}}, - err: "--no-healthcheck conflicts with --health-* options", - }, - } - for i, c := range testCases { - flags := newUpdateCommand(nil).Flags() - for _, flag := range c.flags { - flags.Set(flag[0], flag[1]) - } - cspec := &swarm.ContainerSpec{ - Healthcheck: c.initial, - } - err := updateHealthcheck(flags, cspec) - if c.err != "" { - assert.Error(t, err, c.err) - } else { - assert.NilError(t, err) - if !reflect.DeepEqual(cspec.Healthcheck, c.expected) { - t.Errorf("incorrect result for test %d, expected health config:\n\t%#v\ngot:\n\t%#v", i, c.expected, cspec.Healthcheck) - } - } - } -} - -func TestUpdateHosts(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("host-add", "example.net:2.2.2.2") - flags.Set("host-add", "ipv6.net:2001:db8:abc8::1") - // remove with ipv6 should work - flags.Set("host-rm", "example.net:2001:db8:abc8::1") - // just hostname should work as well - flags.Set("host-rm", "example.net") - // bad format error - assert.Error(t, flags.Set("host-add", "$example.com$"), "bad format for add-host:") - - hosts := []string{"1.2.3.4 example.com", "4.3.2.1 example.org", "2001:db8:abc8::1 example.net"} - - updateHosts(flags, &hosts) - assert.Equal(t, len(hosts), 3) - assert.Equal(t, hosts[0], "1.2.3.4 example.com") - assert.Equal(t, hosts[1], "2001:db8:abc8::1 ipv6.net") - assert.Equal(t, hosts[2], "4.3.2.1 example.org") -} - -func TestUpdatePortsRmWithProtocol(t *testing.T) { - flags := newUpdateCommand(nil).Flags() - flags.Set("publish-add", "8081:81") - flags.Set("publish-add", "8082:82") - flags.Set("publish-rm", "80") - flags.Set("publish-rm", "81/tcp") - flags.Set("publish-rm", "82/udp") - - portConfigs := []swarm.PortConfig{ - { - TargetPort: 80, - PublishedPort: 8080, - Protocol: swarm.PortConfigProtocolTCP, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - } - - err := updatePorts(flags, &portConfigs) - assert.Equal(t, err, nil) - assert.Equal(t, len(portConfigs), 2) - assert.Equal(t, portConfigs[0].TargetPort, uint32(81)) - assert.Equal(t, portConfigs[1].TargetPort, uint32(82)) -} - -// FIXME(vdemeester) port to opts.PortOpt -func TestValidatePort(t *testing.T) { - validPorts := []string{"80/tcp", "80", "80/udp"} - invalidPorts := map[string]string{ - "9999999": "out of range", - "80:80/tcp": "invalid port format", - "53:53/udp": "invalid port format", - "80:80": "invalid port format", - "80/xyz": "invalid protocol", - "tcp": "invalid syntax", - "udp": "invalid syntax", - "": "invalid protocol", - } - for _, port := range validPorts { - _, err := validatePublishRemove(port) - assert.Equal(t, err, nil) - } - for port, e := range invalidPorts { - _, err := validatePublishRemove(port) - assert.Error(t, err, e) - } -} diff --git a/vendor/github.com/docker/docker/cli/command/stack/cmd.go b/vendor/github.com/docker/docker/cli/command/stack/cmd.go deleted file mode 100644 index 860bfedd1..000000000 --- a/vendor/github.com/docker/docker/cli/command/stack/cmd.go +++ /dev/null @@ -1,35 +0,0 @@ -package stack - -import ( - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -// NewStackCommand returns a cobra command for `stack` subcommands -func NewStackCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "stack", - Short: "Manage Docker stacks", - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - Tags: map[string]string{"version": "1.25"}, - } - cmd.AddCommand( - newDeployCommand(dockerCli), - newListCommand(dockerCli), - newRemoveCommand(dockerCli), - newServicesCommand(dockerCli), - newPsCommand(dockerCli), - ) - return cmd -} - -// NewTopLevelDeployCommand returns a command for `docker deploy` -func NewTopLevelDeployCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := newDeployCommand(dockerCli) - // Remove the aliases at the top level - cmd.Aliases = []string{} - cmd.Tags = map[string]string{"experimental": "", "version": "1.25"} - return cmd -} diff --git a/vendor/github.com/docker/docker/cli/command/stack/common.go b/vendor/github.com/docker/docker/cli/command/stack/common.go deleted file mode 100644 index 72719f94f..000000000 --- a/vendor/github.com/docker/docker/cli/command/stack/common.go +++ /dev/null @@ -1,60 +0,0 @@ -package stack - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli/compose/convert" - "github.com/docker/docker/client" - "github.com/docker/docker/opts" -) - -func getStackFilter(namespace string) filters.Args { - filter := filters.NewArgs() - filter.Add("label", convert.LabelNamespace+"="+namespace) - return filter -} - -func getStackFilterFromOpt(namespace string, opt opts.FilterOpt) filters.Args { - filter := opt.Value() - filter.Add("label", convert.LabelNamespace+"="+namespace) - return filter -} - -func getAllStacksFilter() filters.Args { - filter := filters.NewArgs() - filter.Add("label", convert.LabelNamespace) - return filter -} - -func getServices( - ctx context.Context, - apiclient client.APIClient, - namespace string, -) ([]swarm.Service, error) { - return apiclient.ServiceList( - ctx, - types.ServiceListOptions{Filters: getStackFilter(namespace)}) -} - -func getStackNetworks( - ctx context.Context, - apiclient client.APIClient, - namespace string, -) ([]types.NetworkResource, error) { - return apiclient.NetworkList( - ctx, - types.NetworkListOptions{Filters: getStackFilter(namespace)}) -} - -func getStackSecrets( - ctx context.Context, - apiclient client.APIClient, - namespace string, -) ([]swarm.Secret, error) { - return apiclient.SecretList( - ctx, - types.SecretListOptions{Filters: getStackFilter(namespace)}) -} diff --git a/vendor/github.com/docker/docker/cli/command/stack/deploy.go b/vendor/github.com/docker/docker/cli/command/stack/deploy.go deleted file mode 100644 index 980876a6a..000000000 --- a/vendor/github.com/docker/docker/cli/command/stack/deploy.go +++ /dev/null @@ -1,357 +0,0 @@ -package stack - -import ( - "fmt" - "io/ioutil" - "os" - "sort" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - secretcli "github.com/docker/docker/cli/command/secret" - "github.com/docker/docker/cli/compose/convert" - "github.com/docker/docker/cli/compose/loader" - composetypes "github.com/docker/docker/cli/compose/types" - dockerclient "github.com/docker/docker/client" - "github.com/pkg/errors" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -const ( - defaultNetworkDriver = "overlay" -) - -type deployOptions struct { - bundlefile string - composefile string - namespace string - sendRegistryAuth bool -} - -func newDeployCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts deployOptions - - cmd := &cobra.Command{ - Use: "deploy [OPTIONS] STACK", - Aliases: []string{"up"}, - Short: "Deploy a new stack or update an existing stack", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.namespace = args[0] - return runDeploy(dockerCli, opts) - }, - } - - flags := cmd.Flags() - addBundlefileFlag(&opts.bundlefile, flags) - addComposefileFlag(&opts.composefile, flags) - addRegistryAuthFlag(&opts.sendRegistryAuth, flags) - return cmd -} - -func runDeploy(dockerCli *command.DockerCli, opts deployOptions) error { - ctx := context.Background() - - switch { - case opts.bundlefile == "" && opts.composefile == "": - return fmt.Errorf("Please specify either a bundle file (with --bundle-file) or a Compose file (with --compose-file).") - case opts.bundlefile != "" && opts.composefile != "": - return fmt.Errorf("You cannot specify both a bundle file and a Compose file.") - case opts.bundlefile != "": - return deployBundle(ctx, dockerCli, opts) - default: - return deployCompose(ctx, dockerCli, opts) - } -} - -// checkDaemonIsSwarmManager does an Info API call to verify that the daemon is -// a swarm manager. This is necessary because we must create networks before we -// create services, but the API call for creating a network does not return a -// proper status code when it can't create a network in the "global" scope. -func checkDaemonIsSwarmManager(ctx context.Context, dockerCli *command.DockerCli) error { - info, err := dockerCli.Client().Info(ctx) - if err != nil { - return err - } - if !info.Swarm.ControlAvailable { - return errors.New("This node is not a swarm manager. Use \"docker swarm init\" or \"docker swarm join\" to connect this node to swarm and try again.") - } - return nil -} - -func deployCompose(ctx context.Context, dockerCli *command.DockerCli, opts deployOptions) error { - configDetails, err := getConfigDetails(opts) - if err != nil { - return err - } - - config, err := loader.Load(configDetails) - if err != nil { - if fpe, ok := err.(*loader.ForbiddenPropertiesError); ok { - return fmt.Errorf("Compose file contains unsupported options:\n\n%s\n", - propertyWarnings(fpe.Properties)) - } - - return err - } - - unsupportedProperties := loader.GetUnsupportedProperties(configDetails) - if len(unsupportedProperties) > 0 { - fmt.Fprintf(dockerCli.Err(), "Ignoring unsupported options: %s\n\n", - strings.Join(unsupportedProperties, ", ")) - } - - deprecatedProperties := loader.GetDeprecatedProperties(configDetails) - if len(deprecatedProperties) > 0 { - fmt.Fprintf(dockerCli.Err(), "Ignoring deprecated options:\n\n%s\n\n", - propertyWarnings(deprecatedProperties)) - } - - if err := checkDaemonIsSwarmManager(ctx, dockerCli); err != nil { - return err - } - - namespace := convert.NewNamespace(opts.namespace) - - serviceNetworks := getServicesDeclaredNetworks(config.Services) - networks, externalNetworks := convert.Networks(namespace, config.Networks, serviceNetworks) - if err := validateExternalNetworks(ctx, dockerCli, externalNetworks); err != nil { - return err - } - if err := createNetworks(ctx, dockerCli, namespace, networks); err != nil { - return err - } - - secrets, err := convert.Secrets(namespace, config.Secrets) - if err != nil { - return err - } - if err := createSecrets(ctx, dockerCli, namespace, secrets); err != nil { - return err - } - - services, err := convert.Services(namespace, config, dockerCli.Client()) - if err != nil { - return err - } - return deployServices(ctx, dockerCli, services, namespace, opts.sendRegistryAuth) -} -func getServicesDeclaredNetworks(serviceConfigs []composetypes.ServiceConfig) map[string]struct{} { - serviceNetworks := map[string]struct{}{} - for _, serviceConfig := range serviceConfigs { - if len(serviceConfig.Networks) == 0 { - serviceNetworks["default"] = struct{}{} - continue - } - for network := range serviceConfig.Networks { - serviceNetworks[network] = struct{}{} - } - } - return serviceNetworks -} - -func propertyWarnings(properties map[string]string) string { - var msgs []string - for name, description := range properties { - msgs = append(msgs, fmt.Sprintf("%s: %s", name, description)) - } - sort.Strings(msgs) - return strings.Join(msgs, "\n\n") -} - -func getConfigDetails(opts deployOptions) (composetypes.ConfigDetails, error) { - var details composetypes.ConfigDetails - var err error - - details.WorkingDir, err = os.Getwd() - if err != nil { - return details, err - } - - configFile, err := getConfigFile(opts.composefile) - if err != nil { - return details, err - } - // TODO: support multiple files - details.ConfigFiles = []composetypes.ConfigFile{*configFile} - return details, nil -} - -func getConfigFile(filename string) (*composetypes.ConfigFile, error) { - bytes, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - config, err := loader.ParseYAML(bytes) - if err != nil { - return nil, err - } - return &composetypes.ConfigFile{ - Filename: filename, - Config: config, - }, nil -} - -func validateExternalNetworks( - ctx context.Context, - dockerCli *command.DockerCli, - externalNetworks []string) error { - client := dockerCli.Client() - - for _, networkName := range externalNetworks { - network, err := client.NetworkInspect(ctx, networkName) - if err != nil { - if dockerclient.IsErrNetworkNotFound(err) { - return fmt.Errorf("network %q is declared as external, but could not be found. You need to create the network before the stack is deployed (with overlay driver)", networkName) - } - return err - } - if network.Scope != "swarm" { - return fmt.Errorf("network %q is declared as external, but it is not in the right scope: %q instead of %q", networkName, network.Scope, "swarm") - } - } - - return nil -} - -func createSecrets( - ctx context.Context, - dockerCli *command.DockerCli, - namespace convert.Namespace, - secrets []swarm.SecretSpec, -) error { - client := dockerCli.Client() - - for _, secretSpec := range secrets { - // TODO: fix this after https://github.com/docker/docker/pull/29218 - secrets, err := secretcli.GetSecretsByNameOrIDPrefixes(ctx, client, []string{secretSpec.Name}) - switch { - case err != nil: - return err - case len(secrets) > 1: - return errors.Errorf("ambiguous secret name: %s", secretSpec.Name) - case len(secrets) == 0: - fmt.Fprintf(dockerCli.Out(), "Creating secret %s\n", secretSpec.Name) - _, err = client.SecretCreate(ctx, secretSpec) - default: - secret := secrets[0] - // Update secret to ensure that the local data hasn't changed - err = client.SecretUpdate(ctx, secret.ID, secret.Meta.Version, secretSpec) - } - if err != nil { - return err - } - } - return nil -} - -func createNetworks( - ctx context.Context, - dockerCli *command.DockerCli, - namespace convert.Namespace, - networks map[string]types.NetworkCreate, -) error { - client := dockerCli.Client() - - existingNetworks, err := getStackNetworks(ctx, client, namespace.Name()) - if err != nil { - return err - } - - existingNetworkMap := make(map[string]types.NetworkResource) - for _, network := range existingNetworks { - existingNetworkMap[network.Name] = network - } - - for internalName, createOpts := range networks { - name := namespace.Scope(internalName) - if _, exists := existingNetworkMap[name]; exists { - continue - } - - if createOpts.Driver == "" { - createOpts.Driver = defaultNetworkDriver - } - - fmt.Fprintf(dockerCli.Out(), "Creating network %s\n", name) - if _, err := client.NetworkCreate(ctx, name, createOpts); err != nil { - return err - } - } - - return nil -} - -func deployServices( - ctx context.Context, - dockerCli *command.DockerCli, - services map[string]swarm.ServiceSpec, - namespace convert.Namespace, - sendAuth bool, -) error { - apiClient := dockerCli.Client() - out := dockerCli.Out() - - existingServices, err := getServices(ctx, apiClient, namespace.Name()) - if err != nil { - return err - } - - existingServiceMap := make(map[string]swarm.Service) - for _, service := range existingServices { - existingServiceMap[service.Spec.Name] = service - } - - for internalName, serviceSpec := range services { - name := namespace.Scope(internalName) - - encodedAuth := "" - if sendAuth { - // Retrieve encoded auth token from the image reference - image := serviceSpec.TaskTemplate.ContainerSpec.Image - encodedAuth, err = command.RetrieveAuthTokenFromImage(ctx, dockerCli, image) - if err != nil { - return err - } - } - - if service, exists := existingServiceMap[name]; exists { - fmt.Fprintf(out, "Updating service %s (id: %s)\n", name, service.ID) - - updateOpts := types.ServiceUpdateOptions{} - if sendAuth { - updateOpts.EncodedRegistryAuth = encodedAuth - } - response, err := apiClient.ServiceUpdate( - ctx, - service.ID, - service.Version, - serviceSpec, - updateOpts, - ) - if err != nil { - return err - } - - for _, warning := range response.Warnings { - fmt.Fprintln(dockerCli.Err(), warning) - } - } else { - fmt.Fprintf(out, "Creating service %s\n", name) - - createOpts := types.ServiceCreateOptions{} - if sendAuth { - createOpts.EncodedRegistryAuth = encodedAuth - } - if _, err := apiClient.ServiceCreate(ctx, serviceSpec, createOpts); err != nil { - return err - } - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/stack/deploy_bundlefile.go b/vendor/github.com/docker/docker/cli/command/stack/deploy_bundlefile.go deleted file mode 100644 index 5a178c4ab..000000000 --- a/vendor/github.com/docker/docker/cli/command/stack/deploy_bundlefile.go +++ /dev/null @@ -1,83 +0,0 @@ -package stack - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/compose/convert" -) - -func deployBundle(ctx context.Context, dockerCli *command.DockerCli, opts deployOptions) error { - bundle, err := loadBundlefile(dockerCli.Err(), opts.namespace, opts.bundlefile) - if err != nil { - return err - } - - if err := checkDaemonIsSwarmManager(ctx, dockerCli); err != nil { - return err - } - - namespace := convert.NewNamespace(opts.namespace) - - networks := make(map[string]types.NetworkCreate) - for _, service := range bundle.Services { - for _, networkName := range service.Networks { - networks[networkName] = types.NetworkCreate{ - Labels: convert.AddStackLabel(namespace, nil), - } - } - } - - services := make(map[string]swarm.ServiceSpec) - for internalName, service := range bundle.Services { - name := namespace.Scope(internalName) - - var ports []swarm.PortConfig - for _, portSpec := range service.Ports { - ports = append(ports, swarm.PortConfig{ - Protocol: swarm.PortConfigProtocol(portSpec.Protocol), - TargetPort: portSpec.Port, - }) - } - - nets := []swarm.NetworkAttachmentConfig{} - for _, networkName := range service.Networks { - nets = append(nets, swarm.NetworkAttachmentConfig{ - Target: namespace.Scope(networkName), - Aliases: []string{networkName}, - }) - } - - serviceSpec := swarm.ServiceSpec{ - Annotations: swarm.Annotations{ - Name: name, - Labels: convert.AddStackLabel(namespace, service.Labels), - }, - TaskTemplate: swarm.TaskSpec{ - ContainerSpec: swarm.ContainerSpec{ - Image: service.Image, - Command: service.Command, - Args: service.Args, - Env: service.Env, - // Service Labels will not be copied to Containers - // automatically during the deployment so we apply - // it here. - Labels: convert.AddStackLabel(namespace, nil), - }, - }, - EndpointSpec: &swarm.EndpointSpec{ - Ports: ports, - }, - Networks: nets, - } - - services[internalName] = serviceSpec - } - - if err := createNetworks(ctx, dockerCli, namespace, networks); err != nil { - return err - } - return deployServices(ctx, dockerCli, services, namespace, opts.sendRegistryAuth) -} diff --git a/vendor/github.com/docker/docker/cli/command/stack/list.go b/vendor/github.com/docker/docker/cli/command/stack/list.go deleted file mode 100644 index 9b6c645e2..000000000 --- a/vendor/github.com/docker/docker/cli/command/stack/list.go +++ /dev/null @@ -1,113 +0,0 @@ -package stack - -import ( - "fmt" - "io" - "strconv" - "text/tabwriter" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/compose/convert" - "github.com/docker/docker/client" - "github.com/spf13/cobra" -) - -const ( - listItemFmt = "%s\t%s\n" -) - -type listOptions struct { -} - -func newListCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := listOptions{} - - cmd := &cobra.Command{ - Use: "ls", - Aliases: []string{"list"}, - Short: "List stacks", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runList(dockerCli, opts) - }, - } - - return cmd -} - -func runList(dockerCli *command.DockerCli, opts listOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - stacks, err := getStacks(ctx, client) - if err != nil { - return err - } - - out := dockerCli.Out() - printTable(out, stacks) - return nil -} - -func printTable(out io.Writer, stacks []*stack) { - writer := tabwriter.NewWriter(out, 0, 4, 2, ' ', 0) - - // Ignore flushing errors - defer writer.Flush() - - fmt.Fprintf(writer, listItemFmt, "NAME", "SERVICES") - for _, stack := range stacks { - fmt.Fprintf( - writer, - listItemFmt, - stack.Name, - strconv.Itoa(stack.Services), - ) - } -} - -type stack struct { - // Name is the name of the stack - Name string - // Services is the number of the services - Services int -} - -func getStacks( - ctx context.Context, - apiclient client.APIClient, -) ([]*stack, error) { - services, err := apiclient.ServiceList( - ctx, - types.ServiceListOptions{Filters: getAllStacksFilter()}) - if err != nil { - return nil, err - } - m := make(map[string]*stack, 0) - for _, service := range services { - labels := service.Spec.Labels - name, ok := labels[convert.LabelNamespace] - if !ok { - return nil, fmt.Errorf("cannot get label %s for service %s", - convert.LabelNamespace, service.ID) - } - ztack, ok := m[name] - if !ok { - m[name] = &stack{ - Name: name, - Services: 1, - } - } else { - ztack.Services++ - } - } - var stacks []*stack - for _, stack := range m { - stacks = append(stacks, stack) - } - return stacks, nil -} diff --git a/vendor/github.com/docker/docker/cli/command/stack/opts.go b/vendor/github.com/docker/docker/cli/command/stack/opts.go deleted file mode 100644 index 74fe4f534..000000000 --- a/vendor/github.com/docker/docker/cli/command/stack/opts.go +++ /dev/null @@ -1,49 +0,0 @@ -package stack - -import ( - "fmt" - "io" - "os" - - "github.com/docker/docker/cli/command/bundlefile" - "github.com/spf13/pflag" -) - -func addComposefileFlag(opt *string, flags *pflag.FlagSet) { - flags.StringVarP(opt, "compose-file", "c", "", "Path to a Compose file") -} - -func addBundlefileFlag(opt *string, flags *pflag.FlagSet) { - flags.StringVar(opt, "bundle-file", "", "Path to a Distributed Application Bundle file") - flags.SetAnnotation("bundle-file", "experimental", nil) -} - -func addRegistryAuthFlag(opt *bool, flags *pflag.FlagSet) { - flags.BoolVar(opt, "with-registry-auth", false, "Send registry authentication details to Swarm agents") -} - -func loadBundlefile(stderr io.Writer, namespace string, path string) (*bundlefile.Bundlefile, error) { - defaultPath := fmt.Sprintf("%s.dab", namespace) - - if path == "" { - path = defaultPath - } - if _, err := os.Stat(path); err != nil { - return nil, fmt.Errorf( - "Bundle %s not found. Specify the path with --file", - path) - } - - fmt.Fprintf(stderr, "Loading bundle from %s\n", path) - reader, err := os.Open(path) - if err != nil { - return nil, err - } - defer reader.Close() - - bundle, err := bundlefile.LoadFile(reader) - if err != nil { - return nil, fmt.Errorf("Error reading %s: %v\n", path, err) - } - return bundle, err -} diff --git a/vendor/github.com/docker/docker/cli/command/stack/ps.go b/vendor/github.com/docker/docker/cli/command/stack/ps.go deleted file mode 100644 index e4351bfc7..000000000 --- a/vendor/github.com/docker/docker/cli/command/stack/ps.go +++ /dev/null @@ -1,61 +0,0 @@ -package stack - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/idresolver" - "github.com/docker/docker/cli/command/task" - "github.com/docker/docker/opts" - "github.com/spf13/cobra" -) - -type psOptions struct { - filter opts.FilterOpt - noTrunc bool - namespace string - noResolve bool -} - -func newPsCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := psOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "ps [OPTIONS] STACK", - Short: "List the tasks in the stack", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.namespace = args[0] - return runPS(dockerCli, opts) - }, - } - flags := cmd.Flags() - flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate output") - flags.BoolVar(&opts.noResolve, "no-resolve", false, "Do not map IDs to Names") - flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided") - - return cmd -} - -func runPS(dockerCli *command.DockerCli, opts psOptions) error { - namespace := opts.namespace - client := dockerCli.Client() - ctx := context.Background() - - filter := getStackFilterFromOpt(opts.namespace, opts.filter) - tasks, err := client.TaskList(ctx, types.TaskListOptions{Filters: filter}) - if err != nil { - return err - } - - if len(tasks) == 0 { - fmt.Fprintf(dockerCli.Out(), "Nothing found in stack: %s\n", namespace) - return nil - } - - return task.Print(dockerCli, ctx, tasks, idresolver.New(client, opts.noResolve), opts.noTrunc) -} diff --git a/vendor/github.com/docker/docker/cli/command/stack/remove.go b/vendor/github.com/docker/docker/cli/command/stack/remove.go deleted file mode 100644 index 966c1aa6b..000000000 --- a/vendor/github.com/docker/docker/cli/command/stack/remove.go +++ /dev/null @@ -1,112 +0,0 @@ -package stack - -import ( - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type removeOptions struct { - namespace string -} - -func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts removeOptions - - cmd := &cobra.Command{ - Use: "rm STACK", - Aliases: []string{"remove", "down"}, - Short: "Remove the stack", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.namespace = args[0] - return runRemove(dockerCli, opts) - }, - } - return cmd -} - -func runRemove(dockerCli *command.DockerCli, opts removeOptions) error { - namespace := opts.namespace - client := dockerCli.Client() - ctx := context.Background() - - services, err := getServices(ctx, client, namespace) - if err != nil { - return err - } - - networks, err := getStackNetworks(ctx, client, namespace) - if err != nil { - return err - } - - secrets, err := getStackSecrets(ctx, client, namespace) - if err != nil { - return err - } - - if len(services)+len(networks)+len(secrets) == 0 { - fmt.Fprintf(dockerCli.Out(), "Nothing found in stack: %s\n", namespace) - return nil - } - - hasError := removeServices(ctx, dockerCli, services) - hasError = removeSecrets(ctx, dockerCli, secrets) || hasError - hasError = removeNetworks(ctx, dockerCli, networks) || hasError - - if hasError { - return fmt.Errorf("Failed to remove some resources") - } - return nil -} - -func removeServices( - ctx context.Context, - dockerCli *command.DockerCli, - services []swarm.Service, -) bool { - var err error - for _, service := range services { - fmt.Fprintf(dockerCli.Err(), "Removing service %s\n", service.Spec.Name) - if err = dockerCli.Client().ServiceRemove(ctx, service.ID); err != nil { - fmt.Fprintf(dockerCli.Err(), "Failed to remove service %s: %s", service.ID, err) - } - } - return err != nil -} - -func removeNetworks( - ctx context.Context, - dockerCli *command.DockerCli, - networks []types.NetworkResource, -) bool { - var err error - for _, network := range networks { - fmt.Fprintf(dockerCli.Err(), "Removing network %s\n", network.Name) - if err = dockerCli.Client().NetworkRemove(ctx, network.ID); err != nil { - fmt.Fprintf(dockerCli.Err(), "Failed to remove network %s: %s", network.ID, err) - } - } - return err != nil -} - -func removeSecrets( - ctx context.Context, - dockerCli *command.DockerCli, - secrets []swarm.Secret, -) bool { - var err error - for _, secret := range secrets { - fmt.Fprintf(dockerCli.Err(), "Removing secret %s\n", secret.Spec.Name) - if err = dockerCli.Client().SecretRemove(ctx, secret.ID); err != nil { - fmt.Fprintf(dockerCli.Err(), "Failed to remove secret %s: %s", secret.ID, err) - } - } - return err != nil -} diff --git a/vendor/github.com/docker/docker/cli/command/stack/services.go b/vendor/github.com/docker/docker/cli/command/stack/services.go deleted file mode 100644 index a46652df7..000000000 --- a/vendor/github.com/docker/docker/cli/command/stack/services.go +++ /dev/null @@ -1,79 +0,0 @@ -package stack - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/service" - "github.com/docker/docker/opts" - "github.com/spf13/cobra" -) - -type servicesOptions struct { - quiet bool - filter opts.FilterOpt - namespace string -} - -func newServicesCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := servicesOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "services [OPTIONS] STACK", - Short: "List the services in the stack", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.namespace = args[0] - return runServices(dockerCli, opts) - }, - } - flags := cmd.Flags() - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display IDs") - flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided") - - return cmd -} - -func runServices(dockerCli *command.DockerCli, opts servicesOptions) error { - ctx := context.Background() - client := dockerCli.Client() - - filter := getStackFilterFromOpt(opts.namespace, opts.filter) - services, err := client.ServiceList(ctx, types.ServiceListOptions{Filters: filter}) - if err != nil { - return err - } - - out := dockerCli.Out() - - // if no services in this stack, print message and exit 0 - if len(services) == 0 { - fmt.Fprintf(out, "Nothing found in stack: %s\n", opts.namespace) - return nil - } - - if opts.quiet { - service.PrintQuiet(out, services) - } else { - taskFilter := filters.NewArgs() - for _, service := range services { - taskFilter.Add("service", service.ID) - } - - tasks, err := client.TaskList(ctx, types.TaskListOptions{Filters: taskFilter}) - if err != nil { - return err - } - nodes, err := client.NodeList(ctx, types.NodeListOptions{}) - if err != nil { - return err - } - service.PrintNotQuiet(out, services, nodes, tasks) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/cmd.go b/vendor/github.com/docker/docker/cli/command/swarm/cmd.go deleted file mode 100644 index 632679c4b..000000000 --- a/vendor/github.com/docker/docker/cli/command/swarm/cmd.go +++ /dev/null @@ -1,28 +0,0 @@ -package swarm - -import ( - "github.com/spf13/cobra" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" -) - -// NewSwarmCommand returns a cobra command for `swarm` subcommands -func NewSwarmCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "swarm", - Short: "Manage Swarm", - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - } - cmd.AddCommand( - newInitCommand(dockerCli), - newJoinCommand(dockerCli), - newJoinTokenCommand(dockerCli), - newUnlockKeyCommand(dockerCli), - newUpdateCommand(dockerCli), - newLeaveCommand(dockerCli), - newUnlockCommand(dockerCli), - ) - return cmd -} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/init.go b/vendor/github.com/docker/docker/cli/command/swarm/init.go deleted file mode 100644 index 2550feeb4..000000000 --- a/vendor/github.com/docker/docker/cli/command/swarm/init.go +++ /dev/null @@ -1,85 +0,0 @@ -package swarm - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/pkg/errors" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -type initOptions struct { - swarmOptions - listenAddr NodeAddrOption - // Not a NodeAddrOption because it has no default port. - advertiseAddr string - forceNewCluster bool -} - -func newInitCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := initOptions{ - listenAddr: NewListenAddrOption(), - } - - cmd := &cobra.Command{ - Use: "init [OPTIONS]", - Short: "Initialize a swarm", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runInit(dockerCli, cmd.Flags(), opts) - }, - } - - flags := cmd.Flags() - flags.Var(&opts.listenAddr, flagListenAddr, "Listen address (format: [:port])") - flags.StringVar(&opts.advertiseAddr, flagAdvertiseAddr, "", "Advertised address (format: [:port])") - flags.BoolVar(&opts.forceNewCluster, "force-new-cluster", false, "Force create a new cluster from current state") - flags.BoolVar(&opts.autolock, flagAutolock, false, "Enable manager autolocking (requiring an unlock key to start a stopped manager)") - addSwarmFlags(flags, &opts.swarmOptions) - return cmd -} - -func runInit(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts initOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - req := swarm.InitRequest{ - ListenAddr: opts.listenAddr.String(), - AdvertiseAddr: opts.advertiseAddr, - ForceNewCluster: opts.forceNewCluster, - Spec: opts.swarmOptions.ToSpec(flags), - AutoLockManagers: opts.swarmOptions.autolock, - } - - nodeID, err := client.SwarmInit(ctx, req) - if err != nil { - if strings.Contains(err.Error(), "could not choose an IP address to advertise") || strings.Contains(err.Error(), "could not find the system's IP address") { - return errors.New(err.Error() + " - specify one with --advertise-addr") - } - return err - } - - fmt.Fprintf(dockerCli.Out(), "Swarm initialized: current node (%s) is now a manager.\n\n", nodeID) - - if err := printJoinCommand(ctx, dockerCli, nodeID, true, false); err != nil { - return err - } - - fmt.Fprint(dockerCli.Out(), "To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.\n\n") - - if req.AutoLockManagers { - unlockKeyResp, err := client.SwarmGetUnlockKey(ctx) - if err != nil { - return errors.Wrap(err, "could not fetch unlock key") - } - printUnlockCommand(ctx, dockerCli, unlockKeyResp.UnlockKey) - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/join.go b/vendor/github.com/docker/docker/cli/command/swarm/join.go deleted file mode 100644 index 004313b4c..000000000 --- a/vendor/github.com/docker/docker/cli/command/swarm/join.go +++ /dev/null @@ -1,69 +0,0 @@ -package swarm - -import ( - "fmt" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type joinOptions struct { - remote string - listenAddr NodeAddrOption - // Not a NodeAddrOption because it has no default port. - advertiseAddr string - token string -} - -func newJoinCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := joinOptions{ - listenAddr: NewListenAddrOption(), - } - - cmd := &cobra.Command{ - Use: "join [OPTIONS] HOST:PORT", - Short: "Join a swarm as a node and/or manager", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.remote = args[0] - return runJoin(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.Var(&opts.listenAddr, flagListenAddr, "Listen address (format: [:port])") - flags.StringVar(&opts.advertiseAddr, flagAdvertiseAddr, "", "Advertised address (format: [:port])") - flags.StringVar(&opts.token, flagToken, "", "Token for entry into the swarm") - return cmd -} - -func runJoin(dockerCli *command.DockerCli, opts joinOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - req := swarm.JoinRequest{ - JoinToken: opts.token, - ListenAddr: opts.listenAddr.String(), - AdvertiseAddr: opts.advertiseAddr, - RemoteAddrs: []string{opts.remote}, - } - err := client.SwarmJoin(ctx, req) - if err != nil { - return err - } - - info, err := client.Info(ctx) - if err != nil { - return err - } - - if info.Swarm.ControlAvailable { - fmt.Fprintln(dockerCli.Out(), "This node joined a swarm as a manager.") - } else { - fmt.Fprintln(dockerCli.Out(), "This node joined a swarm as a worker.") - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/join_token.go b/vendor/github.com/docker/docker/cli/command/swarm/join_token.go deleted file mode 100644 index 3a17a8020..000000000 --- a/vendor/github.com/docker/docker/cli/command/swarm/join_token.go +++ /dev/null @@ -1,105 +0,0 @@ -package swarm - -import ( - "errors" - "fmt" - - "github.com/spf13/cobra" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "golang.org/x/net/context" -) - -func newJoinTokenCommand(dockerCli *command.DockerCli) *cobra.Command { - var rotate, quiet bool - - cmd := &cobra.Command{ - Use: "join-token [OPTIONS] (worker|manager)", - Short: "Manage join tokens", - Args: cli.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - worker := args[0] == "worker" - manager := args[0] == "manager" - - if !worker && !manager { - return errors.New("unknown role " + args[0]) - } - - client := dockerCli.Client() - ctx := context.Background() - - if rotate { - var flags swarm.UpdateFlags - - swarm, err := client.SwarmInspect(ctx) - if err != nil { - return err - } - - flags.RotateWorkerToken = worker - flags.RotateManagerToken = manager - - err = client.SwarmUpdate(ctx, swarm.Version, swarm.Spec, flags) - if err != nil { - return err - } - if !quiet { - fmt.Fprintf(dockerCli.Out(), "Successfully rotated %s join token.\n\n", args[0]) - } - } - - swarm, err := client.SwarmInspect(ctx) - if err != nil { - return err - } - - if quiet { - if worker { - fmt.Fprintln(dockerCli.Out(), swarm.JoinTokens.Worker) - } else { - fmt.Fprintln(dockerCli.Out(), swarm.JoinTokens.Manager) - } - } else { - info, err := client.Info(ctx) - if err != nil { - return err - } - return printJoinCommand(ctx, dockerCli, info.Swarm.NodeID, worker, manager) - } - return nil - }, - } - - flags := cmd.Flags() - flags.BoolVar(&rotate, flagRotate, false, "Rotate join token") - flags.BoolVarP(&quiet, flagQuiet, "q", false, "Only display token") - - return cmd -} - -func printJoinCommand(ctx context.Context, dockerCli *command.DockerCli, nodeID string, worker bool, manager bool) error { - client := dockerCli.Client() - - swarm, err := client.SwarmInspect(ctx) - if err != nil { - return err - } - - node, _, err := client.NodeInspectWithRaw(ctx, nodeID) - if err != nil { - return err - } - - if node.ManagerStatus != nil { - if worker { - fmt.Fprintf(dockerCli.Out(), "To add a worker to this swarm, run the following command:\n\n docker swarm join \\\n --token %s \\\n %s\n\n", swarm.JoinTokens.Worker, node.ManagerStatus.Addr) - } - if manager { - fmt.Fprintf(dockerCli.Out(), "To add a manager to this swarm, run the following command:\n\n docker swarm join \\\n --token %s \\\n %s\n\n", swarm.JoinTokens.Manager, node.ManagerStatus.Addr) - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/leave.go b/vendor/github.com/docker/docker/cli/command/swarm/leave.go deleted file mode 100644 index e2cfa0a04..000000000 --- a/vendor/github.com/docker/docker/cli/command/swarm/leave.go +++ /dev/null @@ -1,44 +0,0 @@ -package swarm - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type leaveOptions struct { - force bool -} - -func newLeaveCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := leaveOptions{} - - cmd := &cobra.Command{ - Use: "leave [OPTIONS]", - Short: "Leave the swarm", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runLeave(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.force, "force", "f", false, "Force this node to leave the swarm, ignoring warnings") - return cmd -} - -func runLeave(dockerCli *command.DockerCli, opts leaveOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - if err := client.SwarmLeave(ctx, opts.force); err != nil { - return err - } - - fmt.Fprintln(dockerCli.Out(), "Node left the swarm.") - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/opts.go b/vendor/github.com/docker/docker/cli/command/swarm/opts.go deleted file mode 100644 index 9db46dcf5..000000000 --- a/vendor/github.com/docker/docker/cli/command/swarm/opts.go +++ /dev/null @@ -1,209 +0,0 @@ -package swarm - -import ( - "encoding/csv" - "errors" - "fmt" - "strings" - "time" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/opts" - "github.com/spf13/pflag" -) - -const ( - defaultListenAddr = "0.0.0.0:2377" - - flagCertExpiry = "cert-expiry" - flagDispatcherHeartbeat = "dispatcher-heartbeat" - flagListenAddr = "listen-addr" - flagAdvertiseAddr = "advertise-addr" - flagQuiet = "quiet" - flagRotate = "rotate" - flagToken = "token" - flagTaskHistoryLimit = "task-history-limit" - flagExternalCA = "external-ca" - flagMaxSnapshots = "max-snapshots" - flagSnapshotInterval = "snapshot-interval" - flagLockKey = "lock-key" - flagAutolock = "autolock" -) - -type swarmOptions struct { - taskHistoryLimit int64 - dispatcherHeartbeat time.Duration - nodeCertExpiry time.Duration - externalCA ExternalCAOption - maxSnapshots uint64 - snapshotInterval uint64 - autolock bool -} - -// NodeAddrOption is a pflag.Value for listening addresses -type NodeAddrOption struct { - addr string -} - -// String prints the representation of this flag -func (a *NodeAddrOption) String() string { - return a.Value() -} - -// Set the value for this flag -func (a *NodeAddrOption) Set(value string) error { - addr, err := opts.ParseTCPAddr(value, a.addr) - if err != nil { - return err - } - a.addr = addr - return nil -} - -// Type returns the type of this flag -func (a *NodeAddrOption) Type() string { - return "node-addr" -} - -// Value returns the value of this option as addr:port -func (a *NodeAddrOption) Value() string { - return strings.TrimPrefix(a.addr, "tcp://") -} - -// NewNodeAddrOption returns a new node address option -func NewNodeAddrOption(addr string) NodeAddrOption { - return NodeAddrOption{addr} -} - -// NewListenAddrOption returns a NodeAddrOption with default values -func NewListenAddrOption() NodeAddrOption { - return NewNodeAddrOption(defaultListenAddr) -} - -// ExternalCAOption is a Value type for parsing external CA specifications. -type ExternalCAOption struct { - values []*swarm.ExternalCA -} - -// Set parses an external CA option. -func (m *ExternalCAOption) Set(value string) error { - parsed, err := parseExternalCA(value) - if err != nil { - return err - } - - m.values = append(m.values, parsed) - return nil -} - -// Type returns the type of this option. -func (m *ExternalCAOption) Type() string { - return "external-ca" -} - -// String returns a string repr of this option. -func (m *ExternalCAOption) String() string { - externalCAs := []string{} - for _, externalCA := range m.values { - repr := fmt.Sprintf("%s: %s", externalCA.Protocol, externalCA.URL) - externalCAs = append(externalCAs, repr) - } - return strings.Join(externalCAs, ", ") -} - -// Value returns the external CAs -func (m *ExternalCAOption) Value() []*swarm.ExternalCA { - return m.values -} - -// parseExternalCA parses an external CA specification from the command line, -// such as protocol=cfssl,url=https://example.com. -func parseExternalCA(caSpec string) (*swarm.ExternalCA, error) { - csvReader := csv.NewReader(strings.NewReader(caSpec)) - fields, err := csvReader.Read() - if err != nil { - return nil, err - } - - externalCA := swarm.ExternalCA{ - Options: make(map[string]string), - } - - var ( - hasProtocol bool - hasURL bool - ) - - for _, field := range fields { - parts := strings.SplitN(field, "=", 2) - - if len(parts) != 2 { - return nil, fmt.Errorf("invalid field '%s' must be a key=value pair", field) - } - - key, value := parts[0], parts[1] - - switch strings.ToLower(key) { - case "protocol": - hasProtocol = true - if strings.ToLower(value) == string(swarm.ExternalCAProtocolCFSSL) { - externalCA.Protocol = swarm.ExternalCAProtocolCFSSL - } else { - return nil, fmt.Errorf("unrecognized external CA protocol %s", value) - } - case "url": - hasURL = true - externalCA.URL = value - default: - externalCA.Options[key] = value - } - } - - if !hasProtocol { - return nil, errors.New("the external-ca option needs a protocol= parameter") - } - if !hasURL { - return nil, errors.New("the external-ca option needs a url= parameter") - } - - return &externalCA, nil -} - -func addSwarmFlags(flags *pflag.FlagSet, opts *swarmOptions) { - flags.Int64Var(&opts.taskHistoryLimit, flagTaskHistoryLimit, 5, "Task history retention limit") - flags.DurationVar(&opts.dispatcherHeartbeat, flagDispatcherHeartbeat, time.Duration(5*time.Second), "Dispatcher heartbeat period (ns|us|ms|s|m|h)") - flags.DurationVar(&opts.nodeCertExpiry, flagCertExpiry, time.Duration(90*24*time.Hour), "Validity period for node certificates (ns|us|ms|s|m|h)") - flags.Var(&opts.externalCA, flagExternalCA, "Specifications of one or more certificate signing endpoints") - flags.Uint64Var(&opts.maxSnapshots, flagMaxSnapshots, 0, "Number of additional Raft snapshots to retain") - flags.Uint64Var(&opts.snapshotInterval, flagSnapshotInterval, 10000, "Number of log entries between Raft snapshots") -} - -func (opts *swarmOptions) mergeSwarmSpec(spec *swarm.Spec, flags *pflag.FlagSet) { - if flags.Changed(flagTaskHistoryLimit) { - spec.Orchestration.TaskHistoryRetentionLimit = &opts.taskHistoryLimit - } - if flags.Changed(flagDispatcherHeartbeat) { - spec.Dispatcher.HeartbeatPeriod = opts.dispatcherHeartbeat - } - if flags.Changed(flagCertExpiry) { - spec.CAConfig.NodeCertExpiry = opts.nodeCertExpiry - } - if flags.Changed(flagExternalCA) { - spec.CAConfig.ExternalCAs = opts.externalCA.Value() - } - if flags.Changed(flagMaxSnapshots) { - spec.Raft.KeepOldSnapshots = &opts.maxSnapshots - } - if flags.Changed(flagSnapshotInterval) { - spec.Raft.SnapshotInterval = opts.snapshotInterval - } - if flags.Changed(flagAutolock) { - spec.EncryptionConfig.AutoLockManagers = opts.autolock - } -} - -func (opts *swarmOptions) ToSpec(flags *pflag.FlagSet) swarm.Spec { - var spec swarm.Spec - opts.mergeSwarmSpec(&spec, flags) - return spec -} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/opts_test.go b/vendor/github.com/docker/docker/cli/command/swarm/opts_test.go deleted file mode 100644 index 568dc8730..000000000 --- a/vendor/github.com/docker/docker/cli/command/swarm/opts_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package swarm - -import ( - "testing" - - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestNodeAddrOptionSetHostAndPort(t *testing.T) { - opt := NewNodeAddrOption("old:123") - addr := "newhost:5555" - assert.NilError(t, opt.Set(addr)) - assert.Equal(t, opt.Value(), addr) -} - -func TestNodeAddrOptionSetHostOnly(t *testing.T) { - opt := NewListenAddrOption() - assert.NilError(t, opt.Set("newhost")) - assert.Equal(t, opt.Value(), "newhost:2377") -} - -func TestNodeAddrOptionSetHostOnlyIPv6(t *testing.T) { - opt := NewListenAddrOption() - assert.NilError(t, opt.Set("::1")) - assert.Equal(t, opt.Value(), "[::1]:2377") -} - -func TestNodeAddrOptionSetPortOnly(t *testing.T) { - opt := NewListenAddrOption() - assert.NilError(t, opt.Set(":4545")) - assert.Equal(t, opt.Value(), "0.0.0.0:4545") -} - -func TestNodeAddrOptionSetInvalidFormat(t *testing.T) { - opt := NewListenAddrOption() - assert.Error(t, opt.Set("http://localhost:4545"), "Invalid") -} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/unlock.go b/vendor/github.com/docker/docker/cli/command/swarm/unlock.go deleted file mode 100644 index 048fb56e3..000000000 --- a/vendor/github.com/docker/docker/cli/command/swarm/unlock.go +++ /dev/null @@ -1,54 +0,0 @@ -package swarm - -import ( - "bufio" - "fmt" - "io" - "strings" - - "github.com/spf13/cobra" - "golang.org/x/crypto/ssh/terminal" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "golang.org/x/net/context" -) - -func newUnlockCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "unlock", - Short: "Unlock swarm", - Args: cli.ExactArgs(0), - RunE: func(cmd *cobra.Command, args []string) error { - client := dockerCli.Client() - ctx := context.Background() - - key, err := readKey(dockerCli.In(), "Please enter unlock key: ") - if err != nil { - return err - } - req := swarm.UnlockRequest{ - UnlockKey: key, - } - - return client.SwarmUnlock(ctx, req) - }, - } - - return cmd -} - -func readKey(in *command.InStream, prompt string) (string, error) { - if in.IsTerminal() { - fmt.Print(prompt) - dt, err := terminal.ReadPassword(int(in.FD())) - fmt.Println() - return string(dt), err - } - key, err := bufio.NewReader(in).ReadString('\n') - if err == io.EOF { - err = nil - } - return strings.TrimSpace(key), err -} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/unlock_key.go b/vendor/github.com/docker/docker/cli/command/swarm/unlock_key.go deleted file mode 100644 index 96450f55b..000000000 --- a/vendor/github.com/docker/docker/cli/command/swarm/unlock_key.go +++ /dev/null @@ -1,79 +0,0 @@ -package swarm - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/pkg/errors" - "golang.org/x/net/context" -) - -func newUnlockKeyCommand(dockerCli *command.DockerCli) *cobra.Command { - var rotate, quiet bool - - cmd := &cobra.Command{ - Use: "unlock-key [OPTIONS]", - Short: "Manage the unlock key", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - client := dockerCli.Client() - ctx := context.Background() - - if rotate { - flags := swarm.UpdateFlags{RotateManagerUnlockKey: true} - - swarm, err := client.SwarmInspect(ctx) - if err != nil { - return err - } - - if !swarm.Spec.EncryptionConfig.AutoLockManagers { - return errors.New("cannot rotate because autolock is not turned on") - } - - err = client.SwarmUpdate(ctx, swarm.Version, swarm.Spec, flags) - if err != nil { - return err - } - if !quiet { - fmt.Fprintf(dockerCli.Out(), "Successfully rotated manager unlock key.\n\n") - } - } - - unlockKeyResp, err := client.SwarmGetUnlockKey(ctx) - if err != nil { - return errors.Wrap(err, "could not fetch unlock key") - } - - if unlockKeyResp.UnlockKey == "" { - return errors.New("no unlock key is set") - } - - if quiet { - fmt.Fprintln(dockerCli.Out(), unlockKeyResp.UnlockKey) - } else { - printUnlockCommand(ctx, dockerCli, unlockKeyResp.UnlockKey) - } - return nil - }, - } - - flags := cmd.Flags() - flags.BoolVar(&rotate, flagRotate, false, "Rotate unlock key") - flags.BoolVarP(&quiet, flagQuiet, "q", false, "Only display token") - - return cmd -} - -func printUnlockCommand(ctx context.Context, dockerCli *command.DockerCli, unlockKey string) { - if len(unlockKey) == 0 { - return - } - - fmt.Fprintf(dockerCli.Out(), "To unlock a swarm manager after it restarts, run the `docker swarm unlock`\ncommand and provide the following key:\n\n %s\n\nPlease remember to store this key in a password manager, since without it you\nwill not be able to restart the manager.\n", unlockKey) - return -} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/update.go b/vendor/github.com/docker/docker/cli/command/swarm/update.go deleted file mode 100644 index dbbd26872..000000000 --- a/vendor/github.com/docker/docker/cli/command/swarm/update.go +++ /dev/null @@ -1,72 +0,0 @@ -package swarm - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/pkg/errors" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -func newUpdateCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := swarmOptions{} - - cmd := &cobra.Command{ - Use: "update [OPTIONS]", - Short: "Update the swarm", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runUpdate(dockerCli, cmd.Flags(), opts) - }, - PreRunE: func(cmd *cobra.Command, args []string) error { - if cmd.Flags().NFlag() == 0 { - return pflag.ErrHelp - } - return nil - }, - } - - cmd.Flags().BoolVar(&opts.autolock, flagAutolock, false, "Change manager autolocking setting (true|false)") - addSwarmFlags(cmd.Flags(), &opts) - return cmd -} - -func runUpdate(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts swarmOptions) error { - client := dockerCli.Client() - ctx := context.Background() - - var updateFlags swarm.UpdateFlags - - swarm, err := client.SwarmInspect(ctx) - if err != nil { - return err - } - - prevAutoLock := swarm.Spec.EncryptionConfig.AutoLockManagers - - opts.mergeSwarmSpec(&swarm.Spec, flags) - - curAutoLock := swarm.Spec.EncryptionConfig.AutoLockManagers - - err = client.SwarmUpdate(ctx, swarm.Version, swarm.Spec, updateFlags) - if err != nil { - return err - } - - fmt.Fprintln(dockerCli.Out(), "Swarm updated.") - - if curAutoLock && !prevAutoLock { - unlockKeyResp, err := client.SwarmGetUnlockKey(ctx) - if err != nil { - return errors.Wrap(err, "could not fetch unlock key") - } - printUnlockCommand(ctx, dockerCli, unlockKeyResp.UnlockKey) - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/system/cmd.go b/vendor/github.com/docker/docker/cli/command/system/cmd.go deleted file mode 100644 index ab3beb895..000000000 --- a/vendor/github.com/docker/docker/cli/command/system/cmd.go +++ /dev/null @@ -1,26 +0,0 @@ -package system - -import ( - "github.com/spf13/cobra" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" -) - -// NewSystemCommand returns a cobra command for `system` subcommands -func NewSystemCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "system", - Short: "Manage Docker", - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - } - cmd.AddCommand( - NewEventsCommand(dockerCli), - NewInfoCommand(dockerCli), - NewDiskUsageCommand(dockerCli), - NewPruneCommand(dockerCli), - ) - - return cmd -} diff --git a/vendor/github.com/docker/docker/cli/command/system/df.go b/vendor/github.com/docker/docker/cli/command/system/df.go deleted file mode 100644 index 9f712484a..000000000 --- a/vendor/github.com/docker/docker/cli/command/system/df.go +++ /dev/null @@ -1,56 +0,0 @@ -package system - -import ( - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/formatter" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -type diskUsageOptions struct { - verbose bool -} - -// NewDiskUsageCommand creates a new cobra.Command for `docker df` -func NewDiskUsageCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts diskUsageOptions - - cmd := &cobra.Command{ - Use: "df [OPTIONS]", - Short: "Show docker disk usage", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runDiskUsage(dockerCli, opts) - }, - Tags: map[string]string{"version": "1.25"}, - } - - flags := cmd.Flags() - - flags.BoolVarP(&opts.verbose, "verbose", "v", false, "Show detailed information on space usage") - - return cmd -} - -func runDiskUsage(dockerCli *command.DockerCli, opts diskUsageOptions) error { - du, err := dockerCli.Client().DiskUsage(context.Background()) - if err != nil { - return err - } - - duCtx := formatter.DiskUsageContext{ - Context: formatter.Context{ - Output: dockerCli.Out(), - }, - LayersSize: du.LayersSize, - Images: du.Images, - Containers: du.Containers, - Volumes: du.Volumes, - Verbose: opts.verbose, - } - - duCtx.Write() - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/system/events.go b/vendor/github.com/docker/docker/cli/command/system/events.go deleted file mode 100644 index 087523051..000000000 --- a/vendor/github.com/docker/docker/cli/command/system/events.go +++ /dev/null @@ -1,140 +0,0 @@ -package system - -import ( - "fmt" - "io" - "io/ioutil" - "sort" - "strings" - "text/template" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - eventtypes "github.com/docker/docker/api/types/events" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/jsonlog" - "github.com/docker/docker/utils/templates" - "github.com/spf13/cobra" -) - -type eventsOptions struct { - since string - until string - filter opts.FilterOpt - format string -} - -// NewEventsCommand creates a new cobra.Command for `docker events` -func NewEventsCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := eventsOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "events [OPTIONS]", - Short: "Get real time events from the server", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runEvents(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.StringVar(&opts.since, "since", "", "Show all events created since timestamp") - flags.StringVar(&opts.until, "until", "", "Stream events until this timestamp") - flags.VarP(&opts.filter, "filter", "f", "Filter output based on conditions provided") - flags.StringVar(&opts.format, "format", "", "Format the output using the given Go template") - - return cmd -} - -func runEvents(dockerCli *command.DockerCli, opts *eventsOptions) error { - tmpl, err := makeTemplate(opts.format) - if err != nil { - return cli.StatusError{ - StatusCode: 64, - Status: "Error parsing format: " + err.Error()} - } - options := types.EventsOptions{ - Since: opts.since, - Until: opts.until, - Filters: opts.filter.Value(), - } - - ctx, cancel := context.WithCancel(context.Background()) - events, errs := dockerCli.Client().Events(ctx, options) - defer cancel() - - out := dockerCli.Out() - - for { - select { - case event := <-events: - if err := handleEvent(out, event, tmpl); err != nil { - return err - } - case err := <-errs: - if err == io.EOF { - return nil - } - return err - } - } -} - -func handleEvent(out io.Writer, event eventtypes.Message, tmpl *template.Template) error { - if tmpl == nil { - return prettyPrintEvent(out, event) - } - - return formatEvent(out, event, tmpl) -} - -func makeTemplate(format string) (*template.Template, error) { - if format == "" { - return nil, nil - } - tmpl, err := templates.Parse(format) - if err != nil { - return tmpl, err - } - // we execute the template for an empty message, so as to validate - // a bad template like "{{.badFieldString}}" - return tmpl, tmpl.Execute(ioutil.Discard, &eventtypes.Message{}) -} - -// prettyPrintEvent prints all types of event information. -// Each output includes the event type, actor id, name and action. -// Actor attributes are printed at the end if the actor has any. -func prettyPrintEvent(out io.Writer, event eventtypes.Message) error { - if event.TimeNano != 0 { - fmt.Fprintf(out, "%s ", time.Unix(0, event.TimeNano).Format(jsonlog.RFC3339NanoFixed)) - } else if event.Time != 0 { - fmt.Fprintf(out, "%s ", time.Unix(event.Time, 0).Format(jsonlog.RFC3339NanoFixed)) - } - - fmt.Fprintf(out, "%s %s %s", event.Type, event.Action, event.Actor.ID) - - if len(event.Actor.Attributes) > 0 { - var attrs []string - var keys []string - for k := range event.Actor.Attributes { - keys = append(keys, k) - } - sort.Strings(keys) - for _, k := range keys { - v := event.Actor.Attributes[k] - attrs = append(attrs, fmt.Sprintf("%s=%s", k, v)) - } - fmt.Fprintf(out, " (%s)", strings.Join(attrs, ", ")) - } - fmt.Fprint(out, "\n") - return nil -} - -func formatEvent(out io.Writer, event eventtypes.Message, tmpl *template.Template) error { - defer out.Write([]byte{'\n'}) - return tmpl.Execute(out, event) -} diff --git a/vendor/github.com/docker/docker/cli/command/system/info.go b/vendor/github.com/docker/docker/cli/command/system/info.go deleted file mode 100644 index e0b876737..000000000 --- a/vendor/github.com/docker/docker/cli/command/system/info.go +++ /dev/null @@ -1,334 +0,0 @@ -package system - -import ( - "fmt" - "sort" - "strings" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/utils" - "github.com/docker/docker/utils/templates" - "github.com/docker/go-units" - "github.com/spf13/cobra" -) - -type infoOptions struct { - format string -} - -// NewInfoCommand creates a new cobra.Command for `docker info` -func NewInfoCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts infoOptions - - cmd := &cobra.Command{ - Use: "info [OPTIONS]", - Short: "Display system-wide information", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runInfo(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - - flags.StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template") - - return cmd -} - -func runInfo(dockerCli *command.DockerCli, opts *infoOptions) error { - ctx := context.Background() - info, err := dockerCli.Client().Info(ctx) - if err != nil { - return err - } - if opts.format == "" { - return prettyPrintInfo(dockerCli, info) - } - return formatInfo(dockerCli, info, opts.format) -} - -func prettyPrintInfo(dockerCli *command.DockerCli, info types.Info) error { - fmt.Fprintf(dockerCli.Out(), "Containers: %d\n", info.Containers) - fmt.Fprintf(dockerCli.Out(), " Running: %d\n", info.ContainersRunning) - fmt.Fprintf(dockerCli.Out(), " Paused: %d\n", info.ContainersPaused) - fmt.Fprintf(dockerCli.Out(), " Stopped: %d\n", info.ContainersStopped) - fmt.Fprintf(dockerCli.Out(), "Images: %d\n", info.Images) - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "Server Version: %s\n", info.ServerVersion) - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "Storage Driver: %s\n", info.Driver) - if info.DriverStatus != nil { - for _, pair := range info.DriverStatus { - fmt.Fprintf(dockerCli.Out(), " %s: %s\n", pair[0], pair[1]) - - // print a warning if devicemapper is using a loopback file - if pair[0] == "Data loop file" { - fmt.Fprintln(dockerCli.Err(), " WARNING: Usage of loopback devices is strongly discouraged for production use. Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.") - } - } - - } - if info.SystemStatus != nil { - for _, pair := range info.SystemStatus { - fmt.Fprintf(dockerCli.Out(), "%s: %s\n", pair[0], pair[1]) - } - } - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "Logging Driver: %s\n", info.LoggingDriver) - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "Cgroup Driver: %s\n", info.CgroupDriver) - - fmt.Fprintf(dockerCli.Out(), "Plugins: \n") - fmt.Fprintf(dockerCli.Out(), " Volume:") - fmt.Fprintf(dockerCli.Out(), " %s", strings.Join(info.Plugins.Volume, " ")) - fmt.Fprintf(dockerCli.Out(), "\n") - fmt.Fprintf(dockerCli.Out(), " Network:") - fmt.Fprintf(dockerCli.Out(), " %s", strings.Join(info.Plugins.Network, " ")) - fmt.Fprintf(dockerCli.Out(), "\n") - - if len(info.Plugins.Authorization) != 0 { - fmt.Fprintf(dockerCli.Out(), " Authorization:") - fmt.Fprintf(dockerCli.Out(), " %s", strings.Join(info.Plugins.Authorization, " ")) - fmt.Fprintf(dockerCli.Out(), "\n") - } - - fmt.Fprintf(dockerCli.Out(), "Swarm: %v\n", info.Swarm.LocalNodeState) - if info.Swarm.LocalNodeState != swarm.LocalNodeStateInactive && info.Swarm.LocalNodeState != swarm.LocalNodeStateLocked { - fmt.Fprintf(dockerCli.Out(), " NodeID: %s\n", info.Swarm.NodeID) - if info.Swarm.Error != "" { - fmt.Fprintf(dockerCli.Out(), " Error: %v\n", info.Swarm.Error) - } - fmt.Fprintf(dockerCli.Out(), " Is Manager: %v\n", info.Swarm.ControlAvailable) - if info.Swarm.ControlAvailable { - fmt.Fprintf(dockerCli.Out(), " ClusterID: %s\n", info.Swarm.Cluster.ID) - fmt.Fprintf(dockerCli.Out(), " Managers: %d\n", info.Swarm.Managers) - fmt.Fprintf(dockerCli.Out(), " Nodes: %d\n", info.Swarm.Nodes) - fmt.Fprintf(dockerCli.Out(), " Orchestration:\n") - taskHistoryRetentionLimit := int64(0) - if info.Swarm.Cluster.Spec.Orchestration.TaskHistoryRetentionLimit != nil { - taskHistoryRetentionLimit = *info.Swarm.Cluster.Spec.Orchestration.TaskHistoryRetentionLimit - } - fmt.Fprintf(dockerCli.Out(), " Task History Retention Limit: %d\n", taskHistoryRetentionLimit) - fmt.Fprintf(dockerCli.Out(), " Raft:\n") - fmt.Fprintf(dockerCli.Out(), " Snapshot Interval: %d\n", info.Swarm.Cluster.Spec.Raft.SnapshotInterval) - if info.Swarm.Cluster.Spec.Raft.KeepOldSnapshots != nil { - fmt.Fprintf(dockerCli.Out(), " Number of Old Snapshots to Retain: %d\n", *info.Swarm.Cluster.Spec.Raft.KeepOldSnapshots) - } - fmt.Fprintf(dockerCli.Out(), " Heartbeat Tick: %d\n", info.Swarm.Cluster.Spec.Raft.HeartbeatTick) - fmt.Fprintf(dockerCli.Out(), " Election Tick: %d\n", info.Swarm.Cluster.Spec.Raft.ElectionTick) - fmt.Fprintf(dockerCli.Out(), " Dispatcher:\n") - fmt.Fprintf(dockerCli.Out(), " Heartbeat Period: %s\n", units.HumanDuration(time.Duration(info.Swarm.Cluster.Spec.Dispatcher.HeartbeatPeriod))) - fmt.Fprintf(dockerCli.Out(), " CA Configuration:\n") - fmt.Fprintf(dockerCli.Out(), " Expiry Duration: %s\n", units.HumanDuration(info.Swarm.Cluster.Spec.CAConfig.NodeCertExpiry)) - if len(info.Swarm.Cluster.Spec.CAConfig.ExternalCAs) > 0 { - fmt.Fprintf(dockerCli.Out(), " External CAs:\n") - for _, entry := range info.Swarm.Cluster.Spec.CAConfig.ExternalCAs { - fmt.Fprintf(dockerCli.Out(), " %s: %s\n", entry.Protocol, entry.URL) - } - } - } - fmt.Fprintf(dockerCli.Out(), " Node Address: %s\n", info.Swarm.NodeAddr) - managers := []string{} - for _, entry := range info.Swarm.RemoteManagers { - managers = append(managers, entry.Addr) - } - if len(managers) > 0 { - sort.Strings(managers) - fmt.Fprintf(dockerCli.Out(), " Manager Addresses:\n") - for _, entry := range managers { - fmt.Fprintf(dockerCli.Out(), " %s\n", entry) - } - } - } - - if len(info.Runtimes) > 0 { - fmt.Fprintf(dockerCli.Out(), "Runtimes:") - for name := range info.Runtimes { - fmt.Fprintf(dockerCli.Out(), " %s", name) - } - fmt.Fprint(dockerCli.Out(), "\n") - fmt.Fprintf(dockerCli.Out(), "Default Runtime: %s\n", info.DefaultRuntime) - } - - if info.OSType == "linux" { - fmt.Fprintf(dockerCli.Out(), "Init Binary: %v\n", info.InitBinary) - - for _, ci := range []struct { - Name string - Commit types.Commit - }{ - {"containerd", info.ContainerdCommit}, - {"runc", info.RuncCommit}, - {"init", info.InitCommit}, - } { - fmt.Fprintf(dockerCli.Out(), "%s version: %s", ci.Name, ci.Commit.ID) - if ci.Commit.ID != ci.Commit.Expected { - fmt.Fprintf(dockerCli.Out(), " (expected: %s)", ci.Commit.Expected) - } - fmt.Fprintf(dockerCli.Out(), "\n") - } - if len(info.SecurityOptions) != 0 { - kvs, err := types.DecodeSecurityOptions(info.SecurityOptions) - if err != nil { - return err - } - fmt.Fprintf(dockerCli.Out(), "Security Options:\n") - for _, so := range kvs { - fmt.Fprintf(dockerCli.Out(), " %s\n", so.Name) - for _, o := range so.Options { - switch o.Key { - case "profile": - if o.Value != "default" { - fmt.Fprintf(dockerCli.Err(), " WARNING: You're not using the default seccomp profile\n") - } - fmt.Fprintf(dockerCli.Out(), " Profile: %s\n", o.Value) - } - } - } - } - } - - // Isolation only has meaning on a Windows daemon. - if info.OSType == "windows" { - fmt.Fprintf(dockerCli.Out(), "Default Isolation: %v\n", info.Isolation) - } - - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "Kernel Version: %s\n", info.KernelVersion) - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "Operating System: %s\n", info.OperatingSystem) - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "OSType: %s\n", info.OSType) - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "Architecture: %s\n", info.Architecture) - fmt.Fprintf(dockerCli.Out(), "CPUs: %d\n", info.NCPU) - fmt.Fprintf(dockerCli.Out(), "Total Memory: %s\n", units.BytesSize(float64(info.MemTotal))) - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "Name: %s\n", info.Name) - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "ID: %s\n", info.ID) - fmt.Fprintf(dockerCli.Out(), "Docker Root Dir: %s\n", info.DockerRootDir) - fmt.Fprintf(dockerCli.Out(), "Debug Mode (client): %v\n", utils.IsDebugEnabled()) - fmt.Fprintf(dockerCli.Out(), "Debug Mode (server): %v\n", info.Debug) - - if info.Debug { - fmt.Fprintf(dockerCli.Out(), " File Descriptors: %d\n", info.NFd) - fmt.Fprintf(dockerCli.Out(), " Goroutines: %d\n", info.NGoroutines) - fmt.Fprintf(dockerCli.Out(), " System Time: %s\n", info.SystemTime) - fmt.Fprintf(dockerCli.Out(), " EventsListeners: %d\n", info.NEventsListener) - } - - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "Http Proxy: %s\n", info.HTTPProxy) - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "Https Proxy: %s\n", info.HTTPSProxy) - ioutils.FprintfIfNotEmpty(dockerCli.Out(), "No Proxy: %s\n", info.NoProxy) - - if info.IndexServerAddress != "" { - u := dockerCli.ConfigFile().AuthConfigs[info.IndexServerAddress].Username - if len(u) > 0 { - fmt.Fprintf(dockerCli.Out(), "Username: %v\n", u) - } - fmt.Fprintf(dockerCli.Out(), "Registry: %v\n", info.IndexServerAddress) - } - - // Only output these warnings if the server does not support these features - if info.OSType != "windows" { - if !info.MemoryLimit { - fmt.Fprintln(dockerCli.Err(), "WARNING: No memory limit support") - } - if !info.SwapLimit { - fmt.Fprintln(dockerCli.Err(), "WARNING: No swap limit support") - } - if !info.KernelMemory { - fmt.Fprintln(dockerCli.Err(), "WARNING: No kernel memory limit support") - } - if !info.OomKillDisable { - fmt.Fprintln(dockerCli.Err(), "WARNING: No oom kill disable support") - } - if !info.CPUCfsQuota { - fmt.Fprintln(dockerCli.Err(), "WARNING: No cpu cfs quota support") - } - if !info.CPUCfsPeriod { - fmt.Fprintln(dockerCli.Err(), "WARNING: No cpu cfs period support") - } - if !info.CPUShares { - fmt.Fprintln(dockerCli.Err(), "WARNING: No cpu shares support") - } - if !info.CPUSet { - fmt.Fprintln(dockerCli.Err(), "WARNING: No cpuset support") - } - if !info.IPv4Forwarding { - fmt.Fprintln(dockerCli.Err(), "WARNING: IPv4 forwarding is disabled") - } - if !info.BridgeNfIptables { - fmt.Fprintln(dockerCli.Err(), "WARNING: bridge-nf-call-iptables is disabled") - } - if !info.BridgeNfIP6tables { - fmt.Fprintln(dockerCli.Err(), "WARNING: bridge-nf-call-ip6tables is disabled") - } - } - - if info.Labels != nil { - fmt.Fprintln(dockerCli.Out(), "Labels:") - for _, attribute := range info.Labels { - fmt.Fprintf(dockerCli.Out(), " %s\n", attribute) - } - // TODO: Engine labels with duplicate keys has been deprecated in 1.13 and will be error out - // after 3 release cycles (1.16). For now, a WARNING will be generated. The following will - // be removed eventually. - labelMap := map[string]string{} - for _, label := range info.Labels { - stringSlice := strings.SplitN(label, "=", 2) - if len(stringSlice) > 1 { - // If there is a conflict we will throw out an warning - if v, ok := labelMap[stringSlice[0]]; ok && v != stringSlice[1] { - fmt.Fprintln(dockerCli.Err(), "WARNING: labels with duplicate keys and conflicting values have been deprecated") - break - } - labelMap[stringSlice[0]] = stringSlice[1] - } - } - } - - fmt.Fprintf(dockerCli.Out(), "Experimental: %v\n", info.ExperimentalBuild) - if info.ClusterStore != "" { - fmt.Fprintf(dockerCli.Out(), "Cluster Store: %s\n", info.ClusterStore) - } - - if info.ClusterAdvertise != "" { - fmt.Fprintf(dockerCli.Out(), "Cluster Advertise: %s\n", info.ClusterAdvertise) - } - - if info.RegistryConfig != nil && (len(info.RegistryConfig.InsecureRegistryCIDRs) > 0 || len(info.RegistryConfig.IndexConfigs) > 0) { - fmt.Fprintln(dockerCli.Out(), "Insecure Registries:") - for _, registry := range info.RegistryConfig.IndexConfigs { - if registry.Secure == false { - fmt.Fprintf(dockerCli.Out(), " %s\n", registry.Name) - } - } - - for _, registry := range info.RegistryConfig.InsecureRegistryCIDRs { - mask, _ := registry.Mask.Size() - fmt.Fprintf(dockerCli.Out(), " %s/%d\n", registry.IP.String(), mask) - } - } - - if info.RegistryConfig != nil && len(info.RegistryConfig.Mirrors) > 0 { - fmt.Fprintln(dockerCli.Out(), "Registry Mirrors:") - for _, mirror := range info.RegistryConfig.Mirrors { - fmt.Fprintf(dockerCli.Out(), " %s\n", mirror) - } - } - - fmt.Fprintf(dockerCli.Out(), "Live Restore Enabled: %v\n", info.LiveRestoreEnabled) - - return nil -} - -func formatInfo(dockerCli *command.DockerCli, info types.Info, format string) error { - tmpl, err := templates.Parse(format) - if err != nil { - return cli.StatusError{StatusCode: 64, - Status: "Template parsing error: " + err.Error()} - } - err = tmpl.Execute(dockerCli.Out(), info) - dockerCli.Out().Write([]byte{'\n'}) - return err -} diff --git a/vendor/github.com/docker/docker/cli/command/system/inspect.go b/vendor/github.com/docker/docker/cli/command/system/inspect.go deleted file mode 100644 index c86e858a2..000000000 --- a/vendor/github.com/docker/docker/cli/command/system/inspect.go +++ /dev/null @@ -1,203 +0,0 @@ -package system - -import ( - "fmt" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/inspect" - apiclient "github.com/docker/docker/client" - "github.com/spf13/cobra" -) - -type inspectOptions struct { - format string - inspectType string - size bool - ids []string -} - -// NewInspectCommand creates a new cobra.Command for `docker inspect` -func NewInspectCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts inspectOptions - - cmd := &cobra.Command{ - Use: "inspect [OPTIONS] NAME|ID [NAME|ID...]", - Short: "Return low-level information on Docker objects", - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.ids = args - return runInspect(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template") - flags.StringVar(&opts.inspectType, "type", "", "Return JSON for specified type") - flags.BoolVarP(&opts.size, "size", "s", false, "Display total file sizes if the type is container") - - return cmd -} - -func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error { - var elementSearcher inspect.GetRefFunc - switch opts.inspectType { - case "", "container", "image", "node", "network", "service", "volume", "task", "plugin": - elementSearcher = inspectAll(context.Background(), dockerCli, opts.size, opts.inspectType) - default: - return fmt.Errorf("%q is not a valid value for --type", opts.inspectType) - } - return inspect.Inspect(dockerCli.Out(), opts.ids, opts.format, elementSearcher) -} - -func inspectContainers(ctx context.Context, dockerCli *command.DockerCli, getSize bool) inspect.GetRefFunc { - return func(ref string) (interface{}, []byte, error) { - return dockerCli.Client().ContainerInspectWithRaw(ctx, ref, getSize) - } -} - -func inspectImages(ctx context.Context, dockerCli *command.DockerCli) inspect.GetRefFunc { - return func(ref string) (interface{}, []byte, error) { - return dockerCli.Client().ImageInspectWithRaw(ctx, ref) - } -} - -func inspectNetwork(ctx context.Context, dockerCli *command.DockerCli) inspect.GetRefFunc { - return func(ref string) (interface{}, []byte, error) { - return dockerCli.Client().NetworkInspectWithRaw(ctx, ref) - } -} - -func inspectNode(ctx context.Context, dockerCli *command.DockerCli) inspect.GetRefFunc { - return func(ref string) (interface{}, []byte, error) { - return dockerCli.Client().NodeInspectWithRaw(ctx, ref) - } -} - -func inspectService(ctx context.Context, dockerCli *command.DockerCli) inspect.GetRefFunc { - return func(ref string) (interface{}, []byte, error) { - return dockerCli.Client().ServiceInspectWithRaw(ctx, ref) - } -} - -func inspectTasks(ctx context.Context, dockerCli *command.DockerCli) inspect.GetRefFunc { - return func(ref string) (interface{}, []byte, error) { - return dockerCli.Client().TaskInspectWithRaw(ctx, ref) - } -} - -func inspectVolume(ctx context.Context, dockerCli *command.DockerCli) inspect.GetRefFunc { - return func(ref string) (interface{}, []byte, error) { - return dockerCli.Client().VolumeInspectWithRaw(ctx, ref) - } -} - -func inspectPlugin(ctx context.Context, dockerCli *command.DockerCli) inspect.GetRefFunc { - return func(ref string) (interface{}, []byte, error) { - return dockerCli.Client().PluginInspectWithRaw(ctx, ref) - } -} - -func inspectAll(ctx context.Context, dockerCli *command.DockerCli, getSize bool, typeConstraint string) inspect.GetRefFunc { - var inspectAutodetect = []struct { - objectType string - isSizeSupported bool - isSwarmObject bool - objectInspector func(string) (interface{}, []byte, error) - }{ - { - objectType: "container", - isSizeSupported: true, - objectInspector: inspectContainers(ctx, dockerCli, getSize), - }, - { - objectType: "image", - objectInspector: inspectImages(ctx, dockerCli), - }, - { - objectType: "network", - objectInspector: inspectNetwork(ctx, dockerCli), - }, - { - objectType: "volume", - objectInspector: inspectVolume(ctx, dockerCli), - }, - { - objectType: "service", - isSwarmObject: true, - objectInspector: inspectService(ctx, dockerCli), - }, - { - objectType: "task", - isSwarmObject: true, - objectInspector: inspectTasks(ctx, dockerCli), - }, - { - objectType: "node", - isSwarmObject: true, - objectInspector: inspectNode(ctx, dockerCli), - }, - { - objectType: "plugin", - objectInspector: inspectPlugin(ctx, dockerCli), - }, - } - - // isSwarmManager does an Info API call to verify that the daemon is - // a swarm manager. - isSwarmManager := func() bool { - info, err := dockerCli.Client().Info(ctx) - if err != nil { - fmt.Fprintln(dockerCli.Err(), err) - return false - } - return info.Swarm.ControlAvailable - } - - isErrNotSupported := func(err error) bool { - return strings.Contains(err.Error(), "not supported") - } - - return func(ref string) (interface{}, []byte, error) { - const ( - swarmSupportUnknown = iota - swarmSupported - swarmUnsupported - ) - - isSwarmSupported := swarmSupportUnknown - - for _, inspectData := range inspectAutodetect { - if typeConstraint != "" && inspectData.objectType != typeConstraint { - continue - } - if typeConstraint == "" && inspectData.isSwarmObject { - if isSwarmSupported == swarmSupportUnknown { - if isSwarmManager() { - isSwarmSupported = swarmSupported - } else { - isSwarmSupported = swarmUnsupported - } - } - if isSwarmSupported == swarmUnsupported { - continue - } - } - v, raw, err := inspectData.objectInspector(ref) - if err != nil { - if typeConstraint == "" && (apiclient.IsErrNotFound(err) || isErrNotSupported(err)) { - continue - } - return v, raw, err - } - if getSize && !inspectData.isSizeSupported { - fmt.Fprintf(dockerCli.Err(), "WARNING: --size ignored for %s\n", inspectData.objectType) - } - return v, raw, err - } - return nil, nil, fmt.Errorf("Error: No such object: %s", ref) - } -} diff --git a/vendor/github.com/docker/docker/cli/command/system/prune.go b/vendor/github.com/docker/docker/cli/command/system/prune.go deleted file mode 100644 index 92dddbdca..000000000 --- a/vendor/github.com/docker/docker/cli/command/system/prune.go +++ /dev/null @@ -1,93 +0,0 @@ -package system - -import ( - "fmt" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/prune" - units "github.com/docker/go-units" - "github.com/spf13/cobra" -) - -type pruneOptions struct { - force bool - all bool -} - -// NewPruneCommand creates a new cobra.Command for `docker prune` -func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts pruneOptions - - cmd := &cobra.Command{ - Use: "prune [OPTIONS]", - Short: "Remove unused data", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runPrune(dockerCli, opts) - }, - Tags: map[string]string{"version": "1.25"}, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.force, "force", "f", false, "Do not prompt for confirmation") - flags.BoolVarP(&opts.all, "all", "a", false, "Remove all unused images not just dangling ones") - - return cmd -} - -const ( - warning = `WARNING! This will remove: - - all stopped containers - - all volumes not used by at least one container - - all networks not used by at least one container - %s -Are you sure you want to continue?` - - danglingImageDesc = "- all dangling images" - allImageDesc = `- all images without at least one container associated to them` -) - -func runPrune(dockerCli *command.DockerCli, opts pruneOptions) error { - var message string - - if opts.all { - message = fmt.Sprintf(warning, allImageDesc) - } else { - message = fmt.Sprintf(warning, danglingImageDesc) - } - - if !opts.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), message) { - return nil - } - - var spaceReclaimed uint64 - - for _, pruneFn := range []func(dockerCli *command.DockerCli) (uint64, string, error){ - prune.RunContainerPrune, - prune.RunVolumePrune, - prune.RunNetworkPrune, - } { - spc, output, err := pruneFn(dockerCli) - if err != nil { - return err - } - spaceReclaimed += spc - if output != "" { - fmt.Fprintln(dockerCli.Out(), output) - } - } - - spc, output, err := prune.RunImagePrune(dockerCli, opts.all) - if err != nil { - return err - } - if spc > 0 { - spaceReclaimed += spc - fmt.Fprintln(dockerCli.Out(), output) - } - - fmt.Fprintln(dockerCli.Out(), "Total reclaimed space:", units.HumanSize(float64(spaceReclaimed))) - - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/system/version.go b/vendor/github.com/docker/docker/cli/command/system/version.go deleted file mode 100644 index ded4f4d11..000000000 --- a/vendor/github.com/docker/docker/cli/command/system/version.go +++ /dev/null @@ -1,113 +0,0 @@ -package system - -import ( - "fmt" - "runtime" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/utils/templates" - "github.com/spf13/cobra" -) - -var versionTemplate = `Client: - Version: {{.Client.Version}} - API version: {{.Client.APIVersion}} - Go version: {{.Client.GoVersion}} - Git commit: {{.Client.GitCommit}} - Built: {{.Client.BuildTime}} - OS/Arch: {{.Client.Os}}/{{.Client.Arch}}{{if .ServerOK}} - -Server: - Version: {{.Server.Version}} - API version: {{.Server.APIVersion}} (minimum version {{.Server.MinAPIVersion}}) - Go version: {{.Server.GoVersion}} - Git commit: {{.Server.GitCommit}} - Built: {{.Server.BuildTime}} - OS/Arch: {{.Server.Os}}/{{.Server.Arch}} - Experimental: {{.Server.Experimental}}{{end}}` - -type versionOptions struct { - format string -} - -// NewVersionCommand creates a new cobra.Command for `docker version` -func NewVersionCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts versionOptions - - cmd := &cobra.Command{ - Use: "version [OPTIONS]", - Short: "Show the Docker version information", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runVersion(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - - flags.StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template") - - return cmd -} - -func runVersion(dockerCli *command.DockerCli, opts *versionOptions) error { - ctx := context.Background() - - templateFormat := versionTemplate - if opts.format != "" { - templateFormat = opts.format - } - - tmpl, err := templates.Parse(templateFormat) - if err != nil { - return cli.StatusError{StatusCode: 64, - Status: "Template parsing error: " + err.Error()} - } - - APIVersion := dockerCli.Client().ClientVersion() - if defaultAPIVersion := dockerCli.DefaultVersion(); APIVersion != defaultAPIVersion { - APIVersion = fmt.Sprintf("%s (downgraded from %s)", APIVersion, defaultAPIVersion) - } - - vd := types.VersionResponse{ - Client: &types.Version{ - Version: dockerversion.Version, - APIVersion: APIVersion, - GoVersion: runtime.Version(), - GitCommit: dockerversion.GitCommit, - BuildTime: dockerversion.BuildTime, - Os: runtime.GOOS, - Arch: runtime.GOARCH, - }, - } - - serverVersion, err := dockerCli.Client().ServerVersion(ctx) - if err == nil { - vd.Server = &serverVersion - } - - // first we need to make BuildTime more human friendly - t, errTime := time.Parse(time.RFC3339Nano, vd.Client.BuildTime) - if errTime == nil { - vd.Client.BuildTime = t.Format(time.ANSIC) - } - - if vd.ServerOK() { - t, errTime = time.Parse(time.RFC3339Nano, vd.Server.BuildTime) - if errTime == nil { - vd.Server.BuildTime = t.Format(time.ANSIC) - } - } - - if err2 := tmpl.Execute(dockerCli.Out(), vd); err2 != nil && err == nil { - err = err2 - } - dockerCli.Out().Write([]byte{'\n'}) - return err -} diff --git a/vendor/github.com/docker/docker/cli/command/task/print.go b/vendor/github.com/docker/docker/cli/command/task/print.go deleted file mode 100644 index 0f1c2cf72..000000000 --- a/vendor/github.com/docker/docker/cli/command/task/print.go +++ /dev/null @@ -1,161 +0,0 @@ -package task - -import ( - "fmt" - "io" - "sort" - "strings" - "text/tabwriter" - "time" - - "golang.org/x/net/context" - - distreference "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/idresolver" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/go-units" -) - -const ( - psTaskItemFmt = "%s\t%s\t%s\t%s\t%s\t%s %s ago\t%s\t%s\n" - maxErrLength = 30 -) - -type portStatus swarm.PortStatus - -func (ps portStatus) String() string { - if len(ps.Ports) == 0 { - return "" - } - - str := fmt.Sprintf("*:%d->%d/%s", ps.Ports[0].PublishedPort, ps.Ports[0].TargetPort, ps.Ports[0].Protocol) - for _, pConfig := range ps.Ports[1:] { - str += fmt.Sprintf(",*:%d->%d/%s", pConfig.PublishedPort, pConfig.TargetPort, pConfig.Protocol) - } - - return str -} - -type tasksBySlot []swarm.Task - -func (t tasksBySlot) Len() int { - return len(t) -} - -func (t tasksBySlot) Swap(i, j int) { - t[i], t[j] = t[j], t[i] -} - -func (t tasksBySlot) Less(i, j int) bool { - // Sort by slot. - if t[i].Slot != t[j].Slot { - return t[i].Slot < t[j].Slot - } - - // If same slot, sort by most recent. - return t[j].Meta.CreatedAt.Before(t[i].CreatedAt) -} - -// Print task information in a table format. -// Besides this, command `docker node ps ` -// and `docker stack ps` will call this, too. -func Print(dockerCli *command.DockerCli, ctx context.Context, tasks []swarm.Task, resolver *idresolver.IDResolver, noTrunc bool) error { - sort.Stable(tasksBySlot(tasks)) - - writer := tabwriter.NewWriter(dockerCli.Out(), 0, 4, 2, ' ', 0) - - // Ignore flushing errors - defer writer.Flush() - fmt.Fprintln(writer, strings.Join([]string{"ID", "NAME", "IMAGE", "NODE", "DESIRED STATE", "CURRENT STATE", "ERROR", "PORTS"}, "\t")) - - if err := print(writer, ctx, tasks, resolver, noTrunc); err != nil { - return err - } - - return nil -} - -// PrintQuiet shows task list in a quiet way. -func PrintQuiet(dockerCli *command.DockerCli, tasks []swarm.Task) error { - sort.Stable(tasksBySlot(tasks)) - - out := dockerCli.Out() - - for _, task := range tasks { - fmt.Fprintln(out, task.ID) - } - - return nil -} - -func print(out io.Writer, ctx context.Context, tasks []swarm.Task, resolver *idresolver.IDResolver, noTrunc bool) error { - prevName := "" - for _, task := range tasks { - id := task.ID - if !noTrunc { - id = stringid.TruncateID(id) - } - - serviceName, err := resolver.Resolve(ctx, swarm.Service{}, task.ServiceID) - if err != nil { - return err - } - - nodeValue, err := resolver.Resolve(ctx, swarm.Node{}, task.NodeID) - if err != nil { - return err - } - - name := "" - if task.Slot != 0 { - name = fmt.Sprintf("%v.%v", serviceName, task.Slot) - } else { - name = fmt.Sprintf("%v.%v", serviceName, task.NodeID) - } - - // Indent the name if necessary - indentedName := name - if name == prevName { - indentedName = fmt.Sprintf(" \\_ %s", indentedName) - } - prevName = name - - // Trim and quote the error message. - taskErr := task.Status.Err - if !noTrunc && len(taskErr) > maxErrLength { - taskErr = fmt.Sprintf("%s…", taskErr[:maxErrLength-1]) - } - if len(taskErr) > 0 { - taskErr = fmt.Sprintf("\"%s\"", taskErr) - } - - image := task.Spec.ContainerSpec.Image - if !noTrunc { - ref, err := distreference.ParseNamed(image) - if err == nil { - // update image string for display - namedTagged, ok := ref.(distreference.NamedTagged) - if ok { - image = namedTagged.Name() + ":" + namedTagged.Tag() - } - } - } - - fmt.Fprintf( - out, - psTaskItemFmt, - id, - indentedName, - image, - nodeValue, - command.PrettyPrint(task.DesiredState), - command.PrettyPrint(task.Status.State), - strings.ToLower(units.HumanDuration(time.Since(task.Status.Timestamp))), - taskErr, - portStatus(task.Status.PortStatus), - ) - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/command/trust.go b/vendor/github.com/docker/docker/cli/command/trust.go deleted file mode 100644 index b4c8a84ee..000000000 --- a/vendor/github.com/docker/docker/cli/command/trust.go +++ /dev/null @@ -1,39 +0,0 @@ -package command - -import ( - "os" - "strconv" - - "github.com/spf13/pflag" -) - -var ( - // TODO: make this not global - untrusted bool -) - -// AddTrustedFlags adds content trust flags to the current command flagset -func AddTrustedFlags(fs *pflag.FlagSet, verify bool) { - trusted, message := setupTrustedFlag(verify) - fs.BoolVar(&untrusted, "disable-content-trust", !trusted, message) -} - -func setupTrustedFlag(verify bool) (bool, string) { - var trusted bool - if e := os.Getenv("DOCKER_CONTENT_TRUST"); e != "" { - if t, err := strconv.ParseBool(e); t || err != nil { - // treat any other value as true - trusted = true - } - } - message := "Skip image signing" - if verify { - message = "Skip image verification" - } - return trusted, message -} - -// IsTrusted returns true if content trust is enabled -func IsTrusted() bool { - return !untrusted -} diff --git a/vendor/github.com/docker/docker/cli/command/utils.go b/vendor/github.com/docker/docker/cli/command/utils.go deleted file mode 100644 index 1837ca41f..000000000 --- a/vendor/github.com/docker/docker/cli/command/utils.go +++ /dev/null @@ -1,87 +0,0 @@ -package command - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strings" -) - -// CopyToFile writes the content of the reader to the specified file -func CopyToFile(outfile string, r io.Reader) error { - tmpFile, err := ioutil.TempFile(filepath.Dir(outfile), ".docker_temp_") - if err != nil { - return err - } - - tmpPath := tmpFile.Name() - - _, err = io.Copy(tmpFile, r) - tmpFile.Close() - - if err != nil { - os.Remove(tmpPath) - return err - } - - if err = os.Rename(tmpPath, outfile); err != nil { - os.Remove(tmpPath) - return err - } - - return nil -} - -// capitalizeFirst capitalizes the first character of string -func capitalizeFirst(s string) string { - switch l := len(s); l { - case 0: - return s - case 1: - return strings.ToLower(s) - default: - return strings.ToUpper(string(s[0])) + strings.ToLower(s[1:]) - } -} - -// PrettyPrint outputs arbitrary data for human formatted output by uppercasing the first letter. -func PrettyPrint(i interface{}) string { - switch t := i.(type) { - case nil: - return "None" - case string: - return capitalizeFirst(t) - default: - return capitalizeFirst(fmt.Sprintf("%s", t)) - } -} - -// PromptForConfirmation requests and checks confirmation from user. -// This will display the provided message followed by ' [y/N] '. If -// the user input 'y' or 'Y' it returns true other false. If no -// message is provided "Are you sure you want to proceed? [y/N] " -// will be used instead. -func PromptForConfirmation(ins *InStream, outs *OutStream, message string) bool { - if message == "" { - message = "Are you sure you want to proceed?" - } - message += " [y/N] " - - fmt.Fprintf(outs, message) - - // On Windows, force the use of the regular OS stdin stream. - if runtime.GOOS == "windows" { - ins = NewInStream(os.Stdin) - } - - answer := "" - n, _ := fmt.Fscan(ins, &answer) - if n != 1 || (answer != "y" && answer != "Y") { - return false - } - - return true -} diff --git a/vendor/github.com/docker/docker/cli/command/volume/cmd.go b/vendor/github.com/docker/docker/cli/command/volume/cmd.go deleted file mode 100644 index 40862f29d..000000000 --- a/vendor/github.com/docker/docker/cli/command/volume/cmd.go +++ /dev/null @@ -1,45 +0,0 @@ -package volume - -import ( - "github.com/spf13/cobra" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" -) - -// NewVolumeCommand returns a cobra command for `volume` subcommands -func NewVolumeCommand(dockerCli *command.DockerCli) *cobra.Command { - cmd := &cobra.Command{ - Use: "volume COMMAND", - Short: "Manage volumes", - Long: volumeDescription, - Args: cli.NoArgs, - RunE: dockerCli.ShowHelp, - } - cmd.AddCommand( - newCreateCommand(dockerCli), - newInspectCommand(dockerCli), - newListCommand(dockerCli), - newRemoveCommand(dockerCli), - NewPruneCommand(dockerCli), - ) - return cmd -} - -var volumeDescription = ` -The **docker volume** command has subcommands for managing data volumes. A data -volume is a specially-designated directory that by-passes storage driver -management. - -Data volumes persist data independent of a container's life cycle. When you -delete a container, the Docker daemon does not delete any data volumes. You can -share volumes across multiple containers. Moreover, you can share data volumes -with other computing resources in your system. - -To see help for a subcommand, use: - - docker volume COMMAND --help - -For full details on using docker volume visit Docker's online documentation. - -` diff --git a/vendor/github.com/docker/docker/cli/command/volume/create.go b/vendor/github.com/docker/docker/cli/command/volume/create.go deleted file mode 100644 index 7b2a7e331..000000000 --- a/vendor/github.com/docker/docker/cli/command/volume/create.go +++ /dev/null @@ -1,111 +0,0 @@ -package volume - -import ( - "fmt" - - "golang.org/x/net/context" - - volumetypes "github.com/docker/docker/api/types/volume" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/opts" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/spf13/cobra" -) - -type createOptions struct { - name string - driver string - driverOpts opts.MapOpts - labels opts.ListOpts -} - -func newCreateCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := createOptions{ - driverOpts: *opts.NewMapOpts(nil, nil), - labels: opts.NewListOpts(runconfigopts.ValidateEnv), - } - - cmd := &cobra.Command{ - Use: "create [OPTIONS] [VOLUME]", - Short: "Create a volume", - Long: createDescription, - Args: cli.RequiresMaxArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - if len(args) == 1 { - if opts.name != "" { - fmt.Fprint(dockerCli.Err(), "Conflicting options: either specify --name or provide positional arg, not both\n") - return cli.StatusError{StatusCode: 1} - } - opts.name = args[0] - } - return runCreate(dockerCli, opts) - }, - } - flags := cmd.Flags() - flags.StringVarP(&opts.driver, "driver", "d", "local", "Specify volume driver name") - flags.StringVar(&opts.name, "name", "", "Specify volume name") - flags.Lookup("name").Hidden = true - flags.VarP(&opts.driverOpts, "opt", "o", "Set driver specific options") - flags.Var(&opts.labels, "label", "Set metadata for a volume") - - return cmd -} - -func runCreate(dockerCli *command.DockerCli, opts createOptions) error { - client := dockerCli.Client() - - volReq := volumetypes.VolumesCreateBody{ - Driver: opts.driver, - DriverOpts: opts.driverOpts.GetAll(), - Name: opts.name, - Labels: runconfigopts.ConvertKVStringsToMap(opts.labels.GetAll()), - } - - vol, err := client.VolumeCreate(context.Background(), volReq) - if err != nil { - return err - } - - fmt.Fprintf(dockerCli.Out(), "%s\n", vol.Name) - return nil -} - -var createDescription = ` -Creates a new volume that containers can consume and store data in. If a name -is not specified, Docker generates a random name. You create a volume and then -configure the container to use it, for example: - - $ docker volume create hello - hello - $ docker run -d -v hello:/world busybox ls /world - -The mount is created inside the container's **/src** directory. Docker doesn't -not support relative paths for mount points inside the container. - -Multiple containers can use the same volume in the same time period. This is -useful if two containers need access to shared data. For example, if one -container writes and the other reads the data. - -## Driver specific options - -Some volume drivers may take options to customize the volume creation. Use the -**-o** or **--opt** flags to pass driver options: - - $ docker volume create --driver fake --opt tardis=blue --opt timey=wimey - -These options are passed directly to the volume driver. Options for different -volume drivers may do different things (or nothing at all). - -The built-in **local** driver on Windows does not support any options. - -The built-in **local** driver on Linux accepts options similar to the linux -**mount** command: - - $ docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m,uid=1000 - -Another example: - - $ docker volume create --driver local --opt type=btrfs --opt device=/dev/sda2 - -` diff --git a/vendor/github.com/docker/docker/cli/command/volume/inspect.go b/vendor/github.com/docker/docker/cli/command/volume/inspect.go deleted file mode 100644 index 5eb8ad251..000000000 --- a/vendor/github.com/docker/docker/cli/command/volume/inspect.go +++ /dev/null @@ -1,55 +0,0 @@ -package volume - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/inspect" - "github.com/spf13/cobra" -) - -type inspectOptions struct { - format string - names []string -} - -func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts inspectOptions - - cmd := &cobra.Command{ - Use: "inspect [OPTIONS] VOLUME [VOLUME...]", - Short: "Display detailed information on one or more volumes", - Long: inspectDescription, - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.names = args - return runInspect(dockerCli, opts) - }, - } - - cmd.Flags().StringVarP(&opts.format, "format", "f", "", "Format the output using the given Go template") - - return cmd -} - -func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error { - client := dockerCli.Client() - - ctx := context.Background() - - getVolFunc := func(name string) (interface{}, []byte, error) { - i, err := client.VolumeInspect(ctx, name) - return i, nil, err - } - - return inspect.Inspect(dockerCli.Out(), opts.names, opts.format, getVolFunc) -} - -var inspectDescription = ` -Returns information about one or more volumes. By default, this command renders -all results in a JSON array. You can specify an alternate format to execute a -given template is executed for each result. Go's https://golang.org/pkg/text/template/ -package describes all the details of the format. - -` diff --git a/vendor/github.com/docker/docker/cli/command/volume/list.go b/vendor/github.com/docker/docker/cli/command/volume/list.go deleted file mode 100644 index d76006a1b..000000000 --- a/vendor/github.com/docker/docker/cli/command/volume/list.go +++ /dev/null @@ -1,91 +0,0 @@ -package volume - -import ( - "sort" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/formatter" - "github.com/docker/docker/opts" - "github.com/spf13/cobra" -) - -type byVolumeName []*types.Volume - -func (r byVolumeName) Len() int { return len(r) } -func (r byVolumeName) Swap(i, j int) { r[i], r[j] = r[j], r[i] } -func (r byVolumeName) Less(i, j int) bool { - return r[i].Name < r[j].Name -} - -type listOptions struct { - quiet bool - format string - filter opts.FilterOpt -} - -func newListCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := listOptions{filter: opts.NewFilterOpt()} - - cmd := &cobra.Command{ - Use: "ls [OPTIONS]", - Aliases: []string{"list"}, - Short: "List volumes", - Long: listDescription, - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runList(dockerCli, opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Only display volume names") - flags.StringVar(&opts.format, "format", "", "Pretty-print volumes using a Go template") - flags.VarP(&opts.filter, "filter", "f", "Provide filter values (e.g. 'dangling=true')") - - return cmd -} - -func runList(dockerCli *command.DockerCli, opts listOptions) error { - client := dockerCli.Client() - volumes, err := client.VolumeList(context.Background(), opts.filter.Value()) - if err != nil { - return err - } - - format := opts.format - if len(format) == 0 { - if len(dockerCli.ConfigFile().VolumesFormat) > 0 && !opts.quiet { - format = dockerCli.ConfigFile().VolumesFormat - } else { - format = formatter.TableFormatKey - } - } - - sort.Sort(byVolumeName(volumes.Volumes)) - - volumeCtx := formatter.Context{ - Output: dockerCli.Out(), - Format: formatter.NewVolumeFormat(format, opts.quiet), - } - return formatter.VolumeWrite(volumeCtx, volumes.Volumes) -} - -var listDescription = ` - -Lists all the volumes Docker manages. You can filter using the **-f** or -**--filter** flag. The filtering format is a **key=value** pair. To specify -more than one filter, pass multiple flags (for example, -**--filter "foo=bar" --filter "bif=baz"**) - -The currently supported filters are: - -* **dangling** (boolean - **true** or **false**, **1** or **0**) -* **driver** (a volume driver's name) -* **label** (**label=** or **label==**) -* **name** (a volume's name) - -` diff --git a/vendor/github.com/docker/docker/cli/command/volume/prune.go b/vendor/github.com/docker/docker/cli/command/volume/prune.go deleted file mode 100644 index 405fbeb29..000000000 --- a/vendor/github.com/docker/docker/cli/command/volume/prune.go +++ /dev/null @@ -1,75 +0,0 @@ -package volume - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - units "github.com/docker/go-units" - "github.com/spf13/cobra" -) - -type pruneOptions struct { - force bool -} - -// NewPruneCommand returns a new cobra prune command for volumes -func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts pruneOptions - - cmd := &cobra.Command{ - Use: "prune [OPTIONS]", - Short: "Remove all unused volumes", - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - spaceReclaimed, output, err := runPrune(dockerCli, opts) - if err != nil { - return err - } - if output != "" { - fmt.Fprintln(dockerCli.Out(), output) - } - fmt.Fprintln(dockerCli.Out(), "Total reclaimed space:", units.HumanSize(float64(spaceReclaimed))) - return nil - }, - Tags: map[string]string{"version": "1.25"}, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.force, "force", "f", false, "Do not prompt for confirmation") - - return cmd -} - -const warning = `WARNING! This will remove all volumes not used by at least one container. -Are you sure you want to continue?` - -func runPrune(dockerCli *command.DockerCli, opts pruneOptions) (spaceReclaimed uint64, output string, err error) { - if !opts.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), warning) { - return - } - - report, err := dockerCli.Client().VolumesPrune(context.Background(), filters.Args{}) - if err != nil { - return - } - - if len(report.VolumesDeleted) > 0 { - output = "Deleted Volumes:\n" - for _, id := range report.VolumesDeleted { - output += id + "\n" - } - spaceReclaimed = report.SpaceReclaimed - } - - return -} - -// RunPrune calls the Volume Prune API -// This returns the amount of space reclaimed and a detailed output string -func RunPrune(dockerCli *command.DockerCli) (uint64, string, error) { - return runPrune(dockerCli, pruneOptions{force: true}) -} diff --git a/vendor/github.com/docker/docker/cli/command/volume/remove.go b/vendor/github.com/docker/docker/cli/command/volume/remove.go deleted file mode 100644 index f464bb3e1..000000000 --- a/vendor/github.com/docker/docker/cli/command/volume/remove.go +++ /dev/null @@ -1,68 +0,0 @@ -package volume - -import ( - "fmt" - - "golang.org/x/net/context" - - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/spf13/cobra" -) - -type removeOptions struct { - force bool - - volumes []string -} - -func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts removeOptions - - cmd := &cobra.Command{ - Use: "rm [OPTIONS] VOLUME [VOLUME...]", - Aliases: []string{"remove"}, - Short: "Remove one or more volumes", - Long: removeDescription, - Example: removeExample, - Args: cli.RequiresMinArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - opts.volumes = args - return runRemove(dockerCli, &opts) - }, - } - - flags := cmd.Flags() - flags.BoolVarP(&opts.force, "force", "f", false, "Force the removal of one or more volumes") - flags.SetAnnotation("force", "version", []string{"1.25"}) - return cmd -} - -func runRemove(dockerCli *command.DockerCli, opts *removeOptions) error { - client := dockerCli.Client() - ctx := context.Background() - status := 0 - - for _, name := range opts.volumes { - if err := client.VolumeRemove(ctx, name, opts.force); err != nil { - fmt.Fprintf(dockerCli.Err(), "%s\n", err) - status = 1 - continue - } - fmt.Fprintf(dockerCli.Out(), "%s\n", name) - } - - if status != 0 { - return cli.StatusError{StatusCode: status} - } - return nil -} - -var removeDescription = ` -Remove one or more volumes. You cannot remove a volume that is in use by a container. -` - -var removeExample = ` -$ docker volume rm hello -hello -` diff --git a/vendor/github.com/docker/docker/cli/compose/convert/compose.go b/vendor/github.com/docker/docker/cli/compose/convert/compose.go deleted file mode 100644 index 8122326aa..000000000 --- a/vendor/github.com/docker/docker/cli/compose/convert/compose.go +++ /dev/null @@ -1,116 +0,0 @@ -package convert - -import ( - "io/ioutil" - - "github.com/docker/docker/api/types" - networktypes "github.com/docker/docker/api/types/network" - "github.com/docker/docker/api/types/swarm" - composetypes "github.com/docker/docker/cli/compose/types" -) - -const ( - // LabelNamespace is the label used to track stack resources - LabelNamespace = "com.docker.stack.namespace" -) - -// Namespace mangles names by prepending the name -type Namespace struct { - name string -} - -// Scope prepends the namespace to a name -func (n Namespace) Scope(name string) string { - return n.name + "_" + name -} - -// Name returns the name of the namespace -func (n Namespace) Name() string { - return n.name -} - -// NewNamespace returns a new Namespace for scoping of names -func NewNamespace(name string) Namespace { - return Namespace{name: name} -} - -// AddStackLabel returns labels with the namespace label added -func AddStackLabel(namespace Namespace, labels map[string]string) map[string]string { - if labels == nil { - labels = make(map[string]string) - } - labels[LabelNamespace] = namespace.name - return labels -} - -type networkMap map[string]composetypes.NetworkConfig - -// Networks converts networks from the compose-file type to the engine API type -func Networks( - namespace Namespace, - networks networkMap, - servicesNetworks map[string]struct{}, -) (map[string]types.NetworkCreate, []string) { - if networks == nil { - networks = make(map[string]composetypes.NetworkConfig) - } - - externalNetworks := []string{} - result := make(map[string]types.NetworkCreate) - - for internalName := range servicesNetworks { - network := networks[internalName] - if network.External.External { - externalNetworks = append(externalNetworks, network.External.Name) - continue - } - - createOpts := types.NetworkCreate{ - Labels: AddStackLabel(namespace, network.Labels), - Driver: network.Driver, - Options: network.DriverOpts, - Internal: network.Internal, - } - - if network.Ipam.Driver != "" || len(network.Ipam.Config) > 0 { - createOpts.IPAM = &networktypes.IPAM{} - } - - if network.Ipam.Driver != "" { - createOpts.IPAM.Driver = network.Ipam.Driver - } - for _, ipamConfig := range network.Ipam.Config { - config := networktypes.IPAMConfig{ - Subnet: ipamConfig.Subnet, - } - createOpts.IPAM.Config = append(createOpts.IPAM.Config, config) - } - result[internalName] = createOpts - } - - return result, externalNetworks -} - -// Secrets converts secrets from the Compose type to the engine API type -func Secrets(namespace Namespace, secrets map[string]composetypes.SecretConfig) ([]swarm.SecretSpec, error) { - result := []swarm.SecretSpec{} - for name, secret := range secrets { - if secret.External.External { - continue - } - - data, err := ioutil.ReadFile(secret.File) - if err != nil { - return nil, err - } - - result = append(result, swarm.SecretSpec{ - Annotations: swarm.Annotations{ - Name: namespace.Scope(name), - Labels: AddStackLabel(namespace, secret.Labels), - }, - Data: data, - }) - } - return result, nil -} diff --git a/vendor/github.com/docker/docker/cli/compose/convert/compose_test.go b/vendor/github.com/docker/docker/cli/compose/convert/compose_test.go deleted file mode 100644 index f333d73fd..000000000 --- a/vendor/github.com/docker/docker/cli/compose/convert/compose_test.go +++ /dev/null @@ -1,122 +0,0 @@ -package convert - -import ( - "testing" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/network" - composetypes "github.com/docker/docker/cli/compose/types" - "github.com/docker/docker/pkg/testutil/assert" - "github.com/docker/docker/pkg/testutil/tempfile" -) - -func TestNamespaceScope(t *testing.T) { - scoped := Namespace{name: "foo"}.Scope("bar") - assert.Equal(t, scoped, "foo_bar") -} - -func TestAddStackLabel(t *testing.T) { - labels := map[string]string{ - "something": "labeled", - } - actual := AddStackLabel(Namespace{name: "foo"}, labels) - expected := map[string]string{ - "something": "labeled", - LabelNamespace: "foo", - } - assert.DeepEqual(t, actual, expected) -} - -func TestNetworks(t *testing.T) { - namespace := Namespace{name: "foo"} - source := networkMap{ - "normal": composetypes.NetworkConfig{ - Driver: "overlay", - DriverOpts: map[string]string{ - "opt": "value", - }, - Ipam: composetypes.IPAMConfig{ - Driver: "driver", - Config: []*composetypes.IPAMPool{ - { - Subnet: "10.0.0.0", - }, - }, - }, - Labels: map[string]string{ - "something": "labeled", - }, - }, - "outside": composetypes.NetworkConfig{ - External: composetypes.External{ - External: true, - Name: "special", - }, - }, - } - expected := map[string]types.NetworkCreate{ - "default": { - Labels: map[string]string{ - LabelNamespace: "foo", - }, - }, - "normal": { - Driver: "overlay", - IPAM: &network.IPAM{ - Driver: "driver", - Config: []network.IPAMConfig{ - { - Subnet: "10.0.0.0", - }, - }, - }, - Options: map[string]string{ - "opt": "value", - }, - Labels: map[string]string{ - LabelNamespace: "foo", - "something": "labeled", - }, - }, - } - - serviceNetworks := map[string]struct{}{ - "default": {}, - "normal": {}, - "outside": {}, - } - networks, externals := Networks(namespace, source, serviceNetworks) - assert.DeepEqual(t, networks, expected) - assert.DeepEqual(t, externals, []string{"special"}) -} - -func TestSecrets(t *testing.T) { - namespace := Namespace{name: "foo"} - - secretText := "this is the first secret" - secretFile := tempfile.NewTempFile(t, "convert-secrets", secretText) - defer secretFile.Remove() - - source := map[string]composetypes.SecretConfig{ - "one": { - File: secretFile.Name(), - Labels: map[string]string{"monster": "mash"}, - }, - "ext": { - External: composetypes.External{ - External: true, - }, - }, - } - - specs, err := Secrets(namespace, source) - assert.NilError(t, err) - assert.Equal(t, len(specs), 1) - secret := specs[0] - assert.Equal(t, secret.Name, "foo_one") - assert.DeepEqual(t, secret.Labels, map[string]string{ - "monster": "mash", - LabelNamespace: "foo", - }) - assert.DeepEqual(t, secret.Data, []byte(secretText)) -} diff --git a/vendor/github.com/docker/docker/cli/compose/convert/service.go b/vendor/github.com/docker/docker/cli/compose/convert/service.go deleted file mode 100644 index 4a5489562..000000000 --- a/vendor/github.com/docker/docker/cli/compose/convert/service.go +++ /dev/null @@ -1,416 +0,0 @@ -package convert - -import ( - "fmt" - "os" - "sort" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/swarm" - servicecli "github.com/docker/docker/cli/command/service" - composetypes "github.com/docker/docker/cli/compose/types" - "github.com/docker/docker/client" - "github.com/docker/docker/opts" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/docker/go-connections/nat" -) - -// Services from compose-file types to engine API types -// TODO: fix secrets API so that SecretAPIClient is not required here -func Services( - namespace Namespace, - config *composetypes.Config, - client client.SecretAPIClient, -) (map[string]swarm.ServiceSpec, error) { - result := make(map[string]swarm.ServiceSpec) - - services := config.Services - volumes := config.Volumes - networks := config.Networks - - for _, service := range services { - - secrets, err := convertServiceSecrets(client, namespace, service.Secrets, config.Secrets) - if err != nil { - return nil, err - } - serviceSpec, err := convertService(namespace, service, networks, volumes, secrets) - if err != nil { - return nil, err - } - result[service.Name] = serviceSpec - } - - return result, nil -} - -func convertService( - namespace Namespace, - service composetypes.ServiceConfig, - networkConfigs map[string]composetypes.NetworkConfig, - volumes map[string]composetypes.VolumeConfig, - secrets []*swarm.SecretReference, -) (swarm.ServiceSpec, error) { - name := namespace.Scope(service.Name) - - endpoint, err := convertEndpointSpec(service.Ports) - if err != nil { - return swarm.ServiceSpec{}, err - } - - mode, err := convertDeployMode(service.Deploy.Mode, service.Deploy.Replicas) - if err != nil { - return swarm.ServiceSpec{}, err - } - - mounts, err := Volumes(service.Volumes, volumes, namespace) - if err != nil { - // TODO: better error message (include service name) - return swarm.ServiceSpec{}, err - } - - resources, err := convertResources(service.Deploy.Resources) - if err != nil { - return swarm.ServiceSpec{}, err - } - - restartPolicy, err := convertRestartPolicy( - service.Restart, service.Deploy.RestartPolicy) - if err != nil { - return swarm.ServiceSpec{}, err - } - - healthcheck, err := convertHealthcheck(service.HealthCheck) - if err != nil { - return swarm.ServiceSpec{}, err - } - - networks, err := convertServiceNetworks(service.Networks, networkConfigs, namespace, service.Name) - if err != nil { - return swarm.ServiceSpec{}, err - } - - var logDriver *swarm.Driver - if service.Logging != nil { - logDriver = &swarm.Driver{ - Name: service.Logging.Driver, - Options: service.Logging.Options, - } - } - - serviceSpec := swarm.ServiceSpec{ - Annotations: swarm.Annotations{ - Name: name, - Labels: AddStackLabel(namespace, service.Deploy.Labels), - }, - TaskTemplate: swarm.TaskSpec{ - ContainerSpec: swarm.ContainerSpec{ - Image: service.Image, - Command: service.Entrypoint, - Args: service.Command, - Hostname: service.Hostname, - Hosts: sortStrings(convertExtraHosts(service.ExtraHosts)), - Healthcheck: healthcheck, - Env: sortStrings(convertEnvironment(service.Environment)), - Labels: AddStackLabel(namespace, service.Labels), - Dir: service.WorkingDir, - User: service.User, - Mounts: mounts, - StopGracePeriod: service.StopGracePeriod, - TTY: service.Tty, - OpenStdin: service.StdinOpen, - Secrets: secrets, - }, - LogDriver: logDriver, - Resources: resources, - RestartPolicy: restartPolicy, - Placement: &swarm.Placement{ - Constraints: service.Deploy.Placement.Constraints, - }, - }, - EndpointSpec: endpoint, - Mode: mode, - Networks: networks, - UpdateConfig: convertUpdateConfig(service.Deploy.UpdateConfig), - } - - return serviceSpec, nil -} - -func sortStrings(strs []string) []string { - sort.Strings(strs) - return strs -} - -type byNetworkTarget []swarm.NetworkAttachmentConfig - -func (a byNetworkTarget) Len() int { return len(a) } -func (a byNetworkTarget) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byNetworkTarget) Less(i, j int) bool { return a[i].Target < a[j].Target } - -func convertServiceNetworks( - networks map[string]*composetypes.ServiceNetworkConfig, - networkConfigs networkMap, - namespace Namespace, - name string, -) ([]swarm.NetworkAttachmentConfig, error) { - if len(networks) == 0 { - return []swarm.NetworkAttachmentConfig{ - { - Target: namespace.Scope("default"), - Aliases: []string{name}, - }, - }, nil - } - - nets := []swarm.NetworkAttachmentConfig{} - for networkName, network := range networks { - networkConfig, ok := networkConfigs[networkName] - if !ok { - return []swarm.NetworkAttachmentConfig{}, fmt.Errorf( - "service %q references network %q, which is not declared", name, networkName) - } - var aliases []string - if network != nil { - aliases = network.Aliases - } - target := namespace.Scope(networkName) - if networkConfig.External.External { - target = networkConfig.External.Name - } - nets = append(nets, swarm.NetworkAttachmentConfig{ - Target: target, - Aliases: append(aliases, name), - }) - } - - sort.Sort(byNetworkTarget(nets)) - - return nets, nil -} - -// TODO: fix secrets API so that SecretAPIClient is not required here -func convertServiceSecrets( - client client.SecretAPIClient, - namespace Namespace, - secrets []composetypes.ServiceSecretConfig, - secretSpecs map[string]composetypes.SecretConfig, -) ([]*swarm.SecretReference, error) { - opts := []*types.SecretRequestOption{} - for _, secret := range secrets { - target := secret.Target - if target == "" { - target = secret.Source - } - - source := namespace.Scope(secret.Source) - secretSpec := secretSpecs[secret.Source] - if secretSpec.External.External { - source = secretSpec.External.Name - } - - uid := secret.UID - gid := secret.GID - if uid == "" { - uid = "0" - } - if gid == "" { - gid = "0" - } - - opts = append(opts, &types.SecretRequestOption{ - Source: source, - Target: target, - UID: uid, - GID: gid, - Mode: os.FileMode(secret.Mode), - }) - } - - return servicecli.ParseSecrets(client, opts) -} - -func convertExtraHosts(extraHosts map[string]string) []string { - hosts := []string{} - for host, ip := range extraHosts { - hosts = append(hosts, fmt.Sprintf("%s %s", ip, host)) - } - return hosts -} - -func convertHealthcheck(healthcheck *composetypes.HealthCheckConfig) (*container.HealthConfig, error) { - if healthcheck == nil { - return nil, nil - } - var ( - err error - timeout, interval time.Duration - retries int - ) - if healthcheck.Disable { - if len(healthcheck.Test) != 0 { - return nil, fmt.Errorf("test and disable can't be set at the same time") - } - return &container.HealthConfig{ - Test: []string{"NONE"}, - }, nil - - } - if healthcheck.Timeout != "" { - timeout, err = time.ParseDuration(healthcheck.Timeout) - if err != nil { - return nil, err - } - } - if healthcheck.Interval != "" { - interval, err = time.ParseDuration(healthcheck.Interval) - if err != nil { - return nil, err - } - } - if healthcheck.Retries != nil { - retries = int(*healthcheck.Retries) - } - return &container.HealthConfig{ - Test: healthcheck.Test, - Timeout: timeout, - Interval: interval, - Retries: retries, - }, nil -} - -func convertRestartPolicy(restart string, source *composetypes.RestartPolicy) (*swarm.RestartPolicy, error) { - // TODO: log if restart is being ignored - if source == nil { - policy, err := runconfigopts.ParseRestartPolicy(restart) - if err != nil { - return nil, err - } - switch { - case policy.IsNone(): - return nil, nil - case policy.IsAlways(), policy.IsUnlessStopped(): - return &swarm.RestartPolicy{ - Condition: swarm.RestartPolicyConditionAny, - }, nil - case policy.IsOnFailure(): - attempts := uint64(policy.MaximumRetryCount) - return &swarm.RestartPolicy{ - Condition: swarm.RestartPolicyConditionOnFailure, - MaxAttempts: &attempts, - }, nil - default: - return nil, fmt.Errorf("unknown restart policy: %s", restart) - } - } - return &swarm.RestartPolicy{ - Condition: swarm.RestartPolicyCondition(source.Condition), - Delay: source.Delay, - MaxAttempts: source.MaxAttempts, - Window: source.Window, - }, nil -} - -func convertUpdateConfig(source *composetypes.UpdateConfig) *swarm.UpdateConfig { - if source == nil { - return nil - } - parallel := uint64(1) - if source.Parallelism != nil { - parallel = *source.Parallelism - } - return &swarm.UpdateConfig{ - Parallelism: parallel, - Delay: source.Delay, - FailureAction: source.FailureAction, - Monitor: source.Monitor, - MaxFailureRatio: source.MaxFailureRatio, - } -} - -func convertResources(source composetypes.Resources) (*swarm.ResourceRequirements, error) { - resources := &swarm.ResourceRequirements{} - var err error - if source.Limits != nil { - var cpus int64 - if source.Limits.NanoCPUs != "" { - cpus, err = opts.ParseCPUs(source.Limits.NanoCPUs) - if err != nil { - return nil, err - } - } - resources.Limits = &swarm.Resources{ - NanoCPUs: cpus, - MemoryBytes: int64(source.Limits.MemoryBytes), - } - } - if source.Reservations != nil { - var cpus int64 - if source.Reservations.NanoCPUs != "" { - cpus, err = opts.ParseCPUs(source.Reservations.NanoCPUs) - if err != nil { - return nil, err - } - } - resources.Reservations = &swarm.Resources{ - NanoCPUs: cpus, - MemoryBytes: int64(source.Reservations.MemoryBytes), - } - } - return resources, nil - -} - -type byPublishedPort []swarm.PortConfig - -func (a byPublishedPort) Len() int { return len(a) } -func (a byPublishedPort) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byPublishedPort) Less(i, j int) bool { return a[i].PublishedPort < a[j].PublishedPort } - -func convertEndpointSpec(source []string) (*swarm.EndpointSpec, error) { - portConfigs := []swarm.PortConfig{} - ports, portBindings, err := nat.ParsePortSpecs(source) - if err != nil { - return nil, err - } - - for port := range ports { - portConfigs = append( - portConfigs, - opts.ConvertPortToPortConfig(port, portBindings)...) - } - - // Sorting to make sure these are always in the same order - sort.Sort(byPublishedPort(portConfigs)) - - return &swarm.EndpointSpec{Ports: portConfigs}, nil -} - -func convertEnvironment(source map[string]string) []string { - var output []string - - for name, value := range source { - output = append(output, fmt.Sprintf("%s=%s", name, value)) - } - - return output -} - -func convertDeployMode(mode string, replicas *uint64) (swarm.ServiceMode, error) { - serviceMode := swarm.ServiceMode{} - - switch mode { - case "global": - if replicas != nil { - return serviceMode, fmt.Errorf("replicas can only be used with replicated mode") - } - serviceMode.Global = &swarm.GlobalService{} - case "replicated", "": - serviceMode.Replicated = &swarm.ReplicatedService{Replicas: replicas} - default: - return serviceMode, fmt.Errorf("Unknown mode: %s", mode) - } - return serviceMode, nil -} diff --git a/vendor/github.com/docker/docker/cli/compose/convert/service_test.go b/vendor/github.com/docker/docker/cli/compose/convert/service_test.go deleted file mode 100644 index 2e614d730..000000000 --- a/vendor/github.com/docker/docker/cli/compose/convert/service_test.go +++ /dev/null @@ -1,216 +0,0 @@ -package convert - -import ( - "sort" - "strings" - "testing" - "time" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/swarm" - composetypes "github.com/docker/docker/cli/compose/types" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestConvertRestartPolicyFromNone(t *testing.T) { - policy, err := convertRestartPolicy("no", nil) - assert.NilError(t, err) - assert.Equal(t, policy, (*swarm.RestartPolicy)(nil)) -} - -func TestConvertRestartPolicyFromUnknown(t *testing.T) { - _, err := convertRestartPolicy("unknown", nil) - assert.Error(t, err, "unknown restart policy: unknown") -} - -func TestConvertRestartPolicyFromAlways(t *testing.T) { - policy, err := convertRestartPolicy("always", nil) - expected := &swarm.RestartPolicy{ - Condition: swarm.RestartPolicyConditionAny, - } - assert.NilError(t, err) - assert.DeepEqual(t, policy, expected) -} - -func TestConvertRestartPolicyFromFailure(t *testing.T) { - policy, err := convertRestartPolicy("on-failure:4", nil) - attempts := uint64(4) - expected := &swarm.RestartPolicy{ - Condition: swarm.RestartPolicyConditionOnFailure, - MaxAttempts: &attempts, - } - assert.NilError(t, err) - assert.DeepEqual(t, policy, expected) -} - -func TestConvertEnvironment(t *testing.T) { - source := map[string]string{ - "foo": "bar", - "key": "value", - } - env := convertEnvironment(source) - sort.Strings(env) - assert.DeepEqual(t, env, []string{"foo=bar", "key=value"}) -} - -func TestConvertResourcesFull(t *testing.T) { - source := composetypes.Resources{ - Limits: &composetypes.Resource{ - NanoCPUs: "0.003", - MemoryBytes: composetypes.UnitBytes(300000000), - }, - Reservations: &composetypes.Resource{ - NanoCPUs: "0.002", - MemoryBytes: composetypes.UnitBytes(200000000), - }, - } - resources, err := convertResources(source) - assert.NilError(t, err) - - expected := &swarm.ResourceRequirements{ - Limits: &swarm.Resources{ - NanoCPUs: 3000000, - MemoryBytes: 300000000, - }, - Reservations: &swarm.Resources{ - NanoCPUs: 2000000, - MemoryBytes: 200000000, - }, - } - assert.DeepEqual(t, resources, expected) -} - -func TestConvertResourcesOnlyMemory(t *testing.T) { - source := composetypes.Resources{ - Limits: &composetypes.Resource{ - MemoryBytes: composetypes.UnitBytes(300000000), - }, - Reservations: &composetypes.Resource{ - MemoryBytes: composetypes.UnitBytes(200000000), - }, - } - resources, err := convertResources(source) - assert.NilError(t, err) - - expected := &swarm.ResourceRequirements{ - Limits: &swarm.Resources{ - MemoryBytes: 300000000, - }, - Reservations: &swarm.Resources{ - MemoryBytes: 200000000, - }, - } - assert.DeepEqual(t, resources, expected) -} - -func TestConvertHealthcheck(t *testing.T) { - retries := uint64(10) - source := &composetypes.HealthCheckConfig{ - Test: []string{"EXEC", "touch", "/foo"}, - Timeout: "30s", - Interval: "2ms", - Retries: &retries, - } - expected := &container.HealthConfig{ - Test: source.Test, - Timeout: 30 * time.Second, - Interval: 2 * time.Millisecond, - Retries: 10, - } - - healthcheck, err := convertHealthcheck(source) - assert.NilError(t, err) - assert.DeepEqual(t, healthcheck, expected) -} - -func TestConvertHealthcheckDisable(t *testing.T) { - source := &composetypes.HealthCheckConfig{Disable: true} - expected := &container.HealthConfig{ - Test: []string{"NONE"}, - } - - healthcheck, err := convertHealthcheck(source) - assert.NilError(t, err) - assert.DeepEqual(t, healthcheck, expected) -} - -func TestConvertHealthcheckDisableWithTest(t *testing.T) { - source := &composetypes.HealthCheckConfig{ - Disable: true, - Test: []string{"EXEC", "touch"}, - } - _, err := convertHealthcheck(source) - assert.Error(t, err, "test and disable can't be set") -} - -func TestConvertServiceNetworksOnlyDefault(t *testing.T) { - networkConfigs := networkMap{} - networks := map[string]*composetypes.ServiceNetworkConfig{} - - configs, err := convertServiceNetworks( - networks, networkConfigs, NewNamespace("foo"), "service") - - expected := []swarm.NetworkAttachmentConfig{ - { - Target: "foo_default", - Aliases: []string{"service"}, - }, - } - - assert.NilError(t, err) - assert.DeepEqual(t, configs, expected) -} - -func TestConvertServiceNetworks(t *testing.T) { - networkConfigs := networkMap{ - "front": composetypes.NetworkConfig{ - External: composetypes.External{ - External: true, - Name: "fronttier", - }, - }, - "back": composetypes.NetworkConfig{}, - } - networks := map[string]*composetypes.ServiceNetworkConfig{ - "front": { - Aliases: []string{"something"}, - }, - "back": { - Aliases: []string{"other"}, - }, - } - - configs, err := convertServiceNetworks( - networks, networkConfigs, NewNamespace("foo"), "service") - - expected := []swarm.NetworkAttachmentConfig{ - { - Target: "foo_back", - Aliases: []string{"other", "service"}, - }, - { - Target: "fronttier", - Aliases: []string{"something", "service"}, - }, - } - - sortedConfigs := byTargetSort(configs) - sort.Sort(&sortedConfigs) - - assert.NilError(t, err) - assert.DeepEqual(t, []swarm.NetworkAttachmentConfig(sortedConfigs), expected) -} - -type byTargetSort []swarm.NetworkAttachmentConfig - -func (s byTargetSort) Len() int { - return len(s) -} - -func (s byTargetSort) Less(i, j int) bool { - return strings.Compare(s[i].Target, s[j].Target) < 0 -} - -func (s byTargetSort) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} diff --git a/vendor/github.com/docker/docker/cli/compose/convert/volume.go b/vendor/github.com/docker/docker/cli/compose/convert/volume.go deleted file mode 100644 index 24442d4dc..000000000 --- a/vendor/github.com/docker/docker/cli/compose/convert/volume.go +++ /dev/null @@ -1,128 +0,0 @@ -package convert - -import ( - "fmt" - "strings" - - "github.com/docker/docker/api/types/mount" - composetypes "github.com/docker/docker/cli/compose/types" -) - -type volumes map[string]composetypes.VolumeConfig - -// Volumes from compose-file types to engine api types -func Volumes(serviceVolumes []string, stackVolumes volumes, namespace Namespace) ([]mount.Mount, error) { - var mounts []mount.Mount - - for _, volumeSpec := range serviceVolumes { - mount, err := convertVolumeToMount(volumeSpec, stackVolumes, namespace) - if err != nil { - return nil, err - } - mounts = append(mounts, mount) - } - return mounts, nil -} - -func convertVolumeToMount(volumeSpec string, stackVolumes volumes, namespace Namespace) (mount.Mount, error) { - var source, target string - var mode []string - - // TODO: split Windows path mappings properly - parts := strings.SplitN(volumeSpec, ":", 3) - - for _, part := range parts { - if strings.TrimSpace(part) == "" { - return mount.Mount{}, fmt.Errorf("invalid volume: %s", volumeSpec) - } - } - - switch len(parts) { - case 3: - source = parts[0] - target = parts[1] - mode = strings.Split(parts[2], ",") - case 2: - source = parts[0] - target = parts[1] - case 1: - target = parts[0] - } - - if source == "" { - // Anonymous volume - return mount.Mount{ - Type: mount.TypeVolume, - Target: target, - }, nil - } - - // TODO: catch Windows paths here - if strings.HasPrefix(source, "/") { - return mount.Mount{ - Type: mount.TypeBind, - Source: source, - Target: target, - ReadOnly: isReadOnly(mode), - BindOptions: getBindOptions(mode), - }, nil - } - - stackVolume, exists := stackVolumes[source] - if !exists { - return mount.Mount{}, fmt.Errorf("undefined volume: %s", source) - } - - var volumeOptions *mount.VolumeOptions - if stackVolume.External.Name != "" { - source = stackVolume.External.Name - } else { - volumeOptions = &mount.VolumeOptions{ - Labels: AddStackLabel(namespace, stackVolume.Labels), - NoCopy: isNoCopy(mode), - } - - if stackVolume.Driver != "" { - volumeOptions.DriverConfig = &mount.Driver{ - Name: stackVolume.Driver, - Options: stackVolume.DriverOpts, - } - } - source = namespace.Scope(source) - } - return mount.Mount{ - Type: mount.TypeVolume, - Source: source, - Target: target, - ReadOnly: isReadOnly(mode), - VolumeOptions: volumeOptions, - }, nil -} - -func modeHas(mode []string, field string) bool { - for _, item := range mode { - if item == field { - return true - } - } - return false -} - -func isReadOnly(mode []string) bool { - return modeHas(mode, "ro") -} - -func isNoCopy(mode []string) bool { - return modeHas(mode, "nocopy") -} - -func getBindOptions(mode []string) *mount.BindOptions { - for _, item := range mode { - for _, propagation := range mount.Propagations { - if mount.Propagation(item) == propagation { - return &mount.BindOptions{Propagation: mount.Propagation(item)} - } - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/cli/compose/convert/volume_test.go b/vendor/github.com/docker/docker/cli/compose/convert/volume_test.go deleted file mode 100644 index 113ab1e1b..000000000 --- a/vendor/github.com/docker/docker/cli/compose/convert/volume_test.go +++ /dev/null @@ -1,133 +0,0 @@ -package convert - -import ( - "testing" - - "github.com/docker/docker/api/types/mount" - composetypes "github.com/docker/docker/cli/compose/types" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestIsReadOnly(t *testing.T) { - assert.Equal(t, isReadOnly([]string{"foo", "bar", "ro"}), true) - assert.Equal(t, isReadOnly([]string{"ro"}), true) - assert.Equal(t, isReadOnly([]string{}), false) - assert.Equal(t, isReadOnly([]string{"foo", "rw"}), false) - assert.Equal(t, isReadOnly([]string{"foo"}), false) -} - -func TestIsNoCopy(t *testing.T) { - assert.Equal(t, isNoCopy([]string{"foo", "bar", "nocopy"}), true) - assert.Equal(t, isNoCopy([]string{"nocopy"}), true) - assert.Equal(t, isNoCopy([]string{}), false) - assert.Equal(t, isNoCopy([]string{"foo", "rw"}), false) -} - -func TestGetBindOptions(t *testing.T) { - opts := getBindOptions([]string{"slave"}) - expected := mount.BindOptions{Propagation: mount.PropagationSlave} - assert.Equal(t, *opts, expected) -} - -func TestGetBindOptionsNone(t *testing.T) { - opts := getBindOptions([]string{"ro"}) - assert.Equal(t, opts, (*mount.BindOptions)(nil)) -} - -func TestConvertVolumeToMountNamedVolume(t *testing.T) { - stackVolumes := volumes{ - "normal": composetypes.VolumeConfig{ - Driver: "glusterfs", - DriverOpts: map[string]string{ - "opt": "value", - }, - Labels: map[string]string{ - "something": "labeled", - }, - }, - } - namespace := NewNamespace("foo") - expected := mount.Mount{ - Type: mount.TypeVolume, - Source: "foo_normal", - Target: "/foo", - ReadOnly: true, - VolumeOptions: &mount.VolumeOptions{ - Labels: map[string]string{ - LabelNamespace: "foo", - "something": "labeled", - }, - DriverConfig: &mount.Driver{ - Name: "glusterfs", - Options: map[string]string{ - "opt": "value", - }, - }, - }, - } - mount, err := convertVolumeToMount("normal:/foo:ro", stackVolumes, namespace) - assert.NilError(t, err) - assert.DeepEqual(t, mount, expected) -} - -func TestConvertVolumeToMountNamedVolumeExternal(t *testing.T) { - stackVolumes := volumes{ - "outside": composetypes.VolumeConfig{ - External: composetypes.External{ - External: true, - Name: "special", - }, - }, - } - namespace := NewNamespace("foo") - expected := mount.Mount{ - Type: mount.TypeVolume, - Source: "special", - Target: "/foo", - } - mount, err := convertVolumeToMount("outside:/foo", stackVolumes, namespace) - assert.NilError(t, err) - assert.DeepEqual(t, mount, expected) -} - -func TestConvertVolumeToMountBind(t *testing.T) { - stackVolumes := volumes{} - namespace := NewNamespace("foo") - expected := mount.Mount{ - Type: mount.TypeBind, - Source: "/bar", - Target: "/foo", - ReadOnly: true, - BindOptions: &mount.BindOptions{Propagation: mount.PropagationShared}, - } - mount, err := convertVolumeToMount("/bar:/foo:ro,shared", stackVolumes, namespace) - assert.NilError(t, err) - assert.DeepEqual(t, mount, expected) -} - -func TestConvertVolumeToMountVolumeDoesNotExist(t *testing.T) { - namespace := NewNamespace("foo") - _, err := convertVolumeToMount("unknown:/foo:ro", volumes{}, namespace) - assert.Error(t, err, "undefined volume: unknown") -} - -func TestConvertVolumeToMountAnonymousVolume(t *testing.T) { - stackVolumes := map[string]composetypes.VolumeConfig{} - namespace := NewNamespace("foo") - expected := mount.Mount{ - Type: mount.TypeVolume, - Target: "/foo/bar", - } - mnt, err := convertVolumeToMount("/foo/bar", stackVolumes, namespace) - assert.NilError(t, err) - assert.DeepEqual(t, mnt, expected) -} - -func TestConvertVolumeToMountInvalidFormat(t *testing.T) { - namespace := NewNamespace("foo") - invalids := []string{"::", "::cc", ":bb:", "aa::", "aa::cc", "aa:bb:", " : : ", " : :cc", " :bb: ", "aa: : ", "aa: :cc", "aa:bb: "} - for _, vol := range invalids { - _, err := convertVolumeToMount(vol, map[string]composetypes.VolumeConfig{}, namespace) - assert.Error(t, err, "invalid volume: "+vol) - } -} diff --git a/vendor/github.com/docker/docker/cli/compose/interpolation/interpolation.go b/vendor/github.com/docker/docker/cli/compose/interpolation/interpolation.go deleted file mode 100644 index 734f28ec9..000000000 --- a/vendor/github.com/docker/docker/cli/compose/interpolation/interpolation.go +++ /dev/null @@ -1,90 +0,0 @@ -package interpolation - -import ( - "fmt" - - "github.com/docker/docker/cli/compose/template" - "github.com/docker/docker/cli/compose/types" -) - -// Interpolate replaces variables in a string with the values from a mapping -func Interpolate(config types.Dict, section string, mapping template.Mapping) (types.Dict, error) { - out := types.Dict{} - - for name, item := range config { - if item == nil { - out[name] = nil - continue - } - interpolatedItem, err := interpolateSectionItem(name, item.(types.Dict), section, mapping) - if err != nil { - return nil, err - } - out[name] = interpolatedItem - } - - return out, nil -} - -func interpolateSectionItem( - name string, - item types.Dict, - section string, - mapping template.Mapping, -) (types.Dict, error) { - - out := types.Dict{} - - for key, value := range item { - interpolatedValue, err := recursiveInterpolate(value, mapping) - if err != nil { - return nil, fmt.Errorf( - "Invalid interpolation format for %#v option in %s %#v: %#v", - key, section, name, err.Template, - ) - } - out[key] = interpolatedValue - } - - return out, nil - -} - -func recursiveInterpolate( - value interface{}, - mapping template.Mapping, -) (interface{}, *template.InvalidTemplateError) { - - switch value := value.(type) { - - case string: - return template.Substitute(value, mapping) - - case types.Dict: - out := types.Dict{} - for key, elem := range value { - interpolatedElem, err := recursiveInterpolate(elem, mapping) - if err != nil { - return nil, err - } - out[key] = interpolatedElem - } - return out, nil - - case []interface{}: - out := make([]interface{}, len(value)) - for i, elem := range value { - interpolatedElem, err := recursiveInterpolate(elem, mapping) - if err != nil { - return nil, err - } - out[i] = interpolatedElem - } - return out, nil - - default: - return value, nil - - } - -} diff --git a/vendor/github.com/docker/docker/cli/compose/interpolation/interpolation_test.go b/vendor/github.com/docker/docker/cli/compose/interpolation/interpolation_test.go deleted file mode 100644 index c3921701b..000000000 --- a/vendor/github.com/docker/docker/cli/compose/interpolation/interpolation_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package interpolation - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/docker/docker/cli/compose/types" -) - -var defaults = map[string]string{ - "USER": "jenny", - "FOO": "bar", -} - -func defaultMapping(name string) (string, bool) { - val, ok := defaults[name] - return val, ok -} - -func TestInterpolate(t *testing.T) { - services := types.Dict{ - "servicea": types.Dict{ - "image": "example:${USER}", - "volumes": []interface{}{"$FOO:/target"}, - "logging": types.Dict{ - "driver": "${FOO}", - "options": types.Dict{ - "user": "$USER", - }, - }, - }, - } - expected := types.Dict{ - "servicea": types.Dict{ - "image": "example:jenny", - "volumes": []interface{}{"bar:/target"}, - "logging": types.Dict{ - "driver": "bar", - "options": types.Dict{ - "user": "jenny", - }, - }, - }, - } - result, err := Interpolate(services, "service", defaultMapping) - assert.NoError(t, err) - assert.Equal(t, expected, result) -} - -func TestInvalidInterpolation(t *testing.T) { - services := types.Dict{ - "servicea": types.Dict{ - "image": "${", - }, - } - _, err := Interpolate(services, "service", defaultMapping) - assert.EqualError(t, err, `Invalid interpolation format for "image" option in service "servicea": "${"`) -} diff --git a/vendor/github.com/docker/docker/cli/compose/loader/example1.env b/vendor/github.com/docker/docker/cli/compose/loader/example1.env deleted file mode 100644 index 3e7a05961..000000000 --- a/vendor/github.com/docker/docker/cli/compose/loader/example1.env +++ /dev/null @@ -1,8 +0,0 @@ -# passed through -FOO=1 - -# overridden in example2.env -BAR=1 - -# overridden in full-example.yml -BAZ=1 diff --git a/vendor/github.com/docker/docker/cli/compose/loader/example2.env b/vendor/github.com/docker/docker/cli/compose/loader/example2.env deleted file mode 100644 index 0920d5ab0..000000000 --- a/vendor/github.com/docker/docker/cli/compose/loader/example2.env +++ /dev/null @@ -1 +0,0 @@ -BAR=2 diff --git a/vendor/github.com/docker/docker/cli/compose/loader/full-example.yml b/vendor/github.com/docker/docker/cli/compose/loader/full-example.yml deleted file mode 100644 index fb5686a38..000000000 --- a/vendor/github.com/docker/docker/cli/compose/loader/full-example.yml +++ /dev/null @@ -1,287 +0,0 @@ -version: "3" - -services: - foo: - cap_add: - - ALL - - cap_drop: - - NET_ADMIN - - SYS_ADMIN - - cgroup_parent: m-executor-abcd - - # String or list - command: bundle exec thin -p 3000 - # command: ["bundle", "exec", "thin", "-p", "3000"] - - container_name: my-web-container - - depends_on: - - db - - redis - - deploy: - mode: replicated - replicas: 6 - labels: [FOO=BAR] - update_config: - parallelism: 3 - delay: 10s - failure_action: continue - monitor: 60s - max_failure_ratio: 0.3 - resources: - limits: - cpus: '0.001' - memory: 50M - reservations: - cpus: '0.0001' - memory: 20M - restart_policy: - condition: on_failure - delay: 5s - max_attempts: 3 - window: 120s - placement: - constraints: [node=foo] - - devices: - - "/dev/ttyUSB0:/dev/ttyUSB0" - - # String or list - # dns: 8.8.8.8 - dns: - - 8.8.8.8 - - 9.9.9.9 - - # String or list - # dns_search: example.com - dns_search: - - dc1.example.com - - dc2.example.com - - domainname: foo.com - - # String or list - # entrypoint: /code/entrypoint.sh -p 3000 - entrypoint: ["/code/entrypoint.sh", "-p", "3000"] - - # String or list - # env_file: .env - env_file: - - ./example1.env - - ./example2.env - - # Mapping or list - # Mapping values can be strings, numbers or null - # Booleans are not allowed - must be quoted - environment: - RACK_ENV: development - SHOW: 'true' - SESSION_SECRET: - BAZ: 3 - # environment: - # - RACK_ENV=development - # - SHOW=true - # - SESSION_SECRET - - # Items can be strings or numbers - expose: - - "3000" - - 8000 - - external_links: - - redis_1 - - project_db_1:mysql - - project_db_1:postgresql - - # Mapping or list - # Mapping values must be strings - # extra_hosts: - # somehost: "162.242.195.82" - # otherhost: "50.31.209.229" - extra_hosts: - - "somehost:162.242.195.82" - - "otherhost:50.31.209.229" - - hostname: foo - - healthcheck: - test: echo "hello world" - interval: 10s - timeout: 1s - retries: 5 - - # Any valid image reference - repo, tag, id, sha - image: redis - # image: ubuntu:14.04 - # image: tutum/influxdb - # image: example-registry.com:4000/postgresql - # image: a4bc65fd - # image: busybox@sha256:38a203e1986cf79639cfb9b2e1d6e773de84002feea2d4eb006b52004ee8502d - - ipc: host - - # Mapping or list - # Mapping values can be strings, numbers or null - labels: - com.example.description: "Accounting webapp" - com.example.number: 42 - com.example.empty-label: - # labels: - # - "com.example.description=Accounting webapp" - # - "com.example.number=42" - # - "com.example.empty-label" - - links: - - db - - db:database - - redis - - logging: - driver: syslog - options: - syslog-address: "tcp://192.168.0.42:123" - - mac_address: 02:42:ac:11:65:43 - - # network_mode: "bridge" - # network_mode: "host" - # network_mode: "none" - # Use the network mode of an arbitrary container from another service - # network_mode: "service:db" - # Use the network mode of another container, specified by name or id - # network_mode: "container:some-container" - network_mode: "container:0cfeab0f748b9a743dc3da582046357c6ef497631c1a016d28d2bf9b4f899f7b" - - networks: - some-network: - aliases: - - alias1 - - alias3 - other-network: - ipv4_address: 172.16.238.10 - ipv6_address: 2001:3984:3989::10 - other-other-network: - - pid: "host" - - ports: - - 3000 - - "3000-3005" - - "8000:8000" - - "9090-9091:8080-8081" - - "49100:22" - - "127.0.0.1:8001:8001" - - "127.0.0.1:5000-5010:5000-5010" - - privileged: true - - read_only: true - - restart: always - - security_opt: - - label=level:s0:c100,c200 - - label=type:svirt_apache_t - - stdin_open: true - - stop_grace_period: 20s - - stop_signal: SIGUSR1 - - # String or list - # tmpfs: /run - tmpfs: - - /run - - /tmp - - tty: true - - ulimits: - # Single number or mapping with soft + hard limits - nproc: 65535 - nofile: - soft: 20000 - hard: 40000 - - user: someone - - volumes: - # Just specify a path and let the Engine create a volume - - /var/lib/mysql - # Specify an absolute path mapping - - /opt/data:/var/lib/mysql - # Path on the host, relative to the Compose file - - .:/code - - ./static:/var/www/html - # User-relative path - - ~/configs:/etc/configs/:ro - # Named volume - - datavolume:/var/lib/mysql - - working_dir: /code - -networks: - # Entries can be null, which specifies simply that a network - # called "{project name}_some-network" should be created and - # use the default driver - some-network: - - other-network: - driver: overlay - - driver_opts: - # Values can be strings or numbers - foo: "bar" - baz: 1 - - ipam: - driver: overlay - # driver_opts: - # # Values can be strings or numbers - # com.docker.network.enable_ipv6: "true" - # com.docker.network.numeric_value: 1 - config: - - subnet: 172.16.238.0/24 - # gateway: 172.16.238.1 - - subnet: 2001:3984:3989::/64 - # gateway: 2001:3984:3989::1 - - external-network: - # Specifies that a pre-existing network called "external-network" - # can be referred to within this file as "external-network" - external: true - - other-external-network: - # Specifies that a pre-existing network called "my-cool-network" - # can be referred to within this file as "other-external-network" - external: - name: my-cool-network - -volumes: - # Entries can be null, which specifies simply that a volume - # called "{project name}_some-volume" should be created and - # use the default driver - some-volume: - - other-volume: - driver: flocker - - driver_opts: - # Values can be strings or numbers - foo: "bar" - baz: 1 - - external-volume: - # Specifies that a pre-existing volume called "external-volume" - # can be referred to within this file as "external-volume" - external: true - - other-external-volume: - # Specifies that a pre-existing volume called "my-cool-volume" - # can be referred to within this file as "other-external-volume" - external: - name: my-cool-volume diff --git a/vendor/github.com/docker/docker/cli/compose/loader/loader.go b/vendor/github.com/docker/docker/cli/compose/loader/loader.go deleted file mode 100644 index 39f69a03f..000000000 --- a/vendor/github.com/docker/docker/cli/compose/loader/loader.go +++ /dev/null @@ -1,653 +0,0 @@ -package loader - -import ( - "fmt" - "os" - "path" - "reflect" - "regexp" - "sort" - "strings" - - "github.com/docker/docker/cli/compose/interpolation" - "github.com/docker/docker/cli/compose/schema" - "github.com/docker/docker/cli/compose/types" - "github.com/docker/docker/runconfig/opts" - units "github.com/docker/go-units" - shellwords "github.com/mattn/go-shellwords" - "github.com/mitchellh/mapstructure" - yaml "gopkg.in/yaml.v2" -) - -var ( - fieldNameRegexp = regexp.MustCompile("[A-Z][a-z0-9]+") -) - -// ParseYAML reads the bytes from a file, parses the bytes into a mapping -// structure, and returns it. -func ParseYAML(source []byte) (types.Dict, error) { - var cfg interface{} - if err := yaml.Unmarshal(source, &cfg); err != nil { - return nil, err - } - cfgMap, ok := cfg.(map[interface{}]interface{}) - if !ok { - return nil, fmt.Errorf("Top-level object must be a mapping") - } - converted, err := convertToStringKeysRecursive(cfgMap, "") - if err != nil { - return nil, err - } - return converted.(types.Dict), nil -} - -// Load reads a ConfigDetails and returns a fully loaded configuration -func Load(configDetails types.ConfigDetails) (*types.Config, error) { - if len(configDetails.ConfigFiles) < 1 { - return nil, fmt.Errorf("No files specified") - } - if len(configDetails.ConfigFiles) > 1 { - return nil, fmt.Errorf("Multiple files are not yet supported") - } - - configDict := getConfigDict(configDetails) - - if services, ok := configDict["services"]; ok { - if servicesDict, ok := services.(types.Dict); ok { - forbidden := getProperties(servicesDict, types.ForbiddenProperties) - - if len(forbidden) > 0 { - return nil, &ForbiddenPropertiesError{Properties: forbidden} - } - } - } - - if err := schema.Validate(configDict, schema.Version(configDict)); err != nil { - return nil, err - } - - cfg := types.Config{} - if services, ok := configDict["services"]; ok { - servicesConfig, err := interpolation.Interpolate(services.(types.Dict), "service", os.LookupEnv) - if err != nil { - return nil, err - } - - servicesList, err := loadServices(servicesConfig, configDetails.WorkingDir) - if err != nil { - return nil, err - } - - cfg.Services = servicesList - } - - if networks, ok := configDict["networks"]; ok { - networksConfig, err := interpolation.Interpolate(networks.(types.Dict), "network", os.LookupEnv) - if err != nil { - return nil, err - } - - networksMapping, err := loadNetworks(networksConfig) - if err != nil { - return nil, err - } - - cfg.Networks = networksMapping - } - - if volumes, ok := configDict["volumes"]; ok { - volumesConfig, err := interpolation.Interpolate(volumes.(types.Dict), "volume", os.LookupEnv) - if err != nil { - return nil, err - } - - volumesMapping, err := loadVolumes(volumesConfig) - if err != nil { - return nil, err - } - - cfg.Volumes = volumesMapping - } - - if secrets, ok := configDict["secrets"]; ok { - secretsConfig, err := interpolation.Interpolate(secrets.(types.Dict), "secret", os.LookupEnv) - if err != nil { - return nil, err - } - - secretsMapping, err := loadSecrets(secretsConfig, configDetails.WorkingDir) - if err != nil { - return nil, err - } - - cfg.Secrets = secretsMapping - } - - return &cfg, nil -} - -// GetUnsupportedProperties returns the list of any unsupported properties that are -// used in the Compose files. -func GetUnsupportedProperties(configDetails types.ConfigDetails) []string { - unsupported := map[string]bool{} - - for _, service := range getServices(getConfigDict(configDetails)) { - serviceDict := service.(types.Dict) - for _, property := range types.UnsupportedProperties { - if _, isSet := serviceDict[property]; isSet { - unsupported[property] = true - } - } - } - - return sortedKeys(unsupported) -} - -func sortedKeys(set map[string]bool) []string { - var keys []string - for key := range set { - keys = append(keys, key) - } - sort.Strings(keys) - return keys -} - -// GetDeprecatedProperties returns the list of any deprecated properties that -// are used in the compose files. -func GetDeprecatedProperties(configDetails types.ConfigDetails) map[string]string { - return getProperties(getServices(getConfigDict(configDetails)), types.DeprecatedProperties) -} - -func getProperties(services types.Dict, propertyMap map[string]string) map[string]string { - output := map[string]string{} - - for _, service := range services { - if serviceDict, ok := service.(types.Dict); ok { - for property, description := range propertyMap { - if _, isSet := serviceDict[property]; isSet { - output[property] = description - } - } - } - } - - return output -} - -// ForbiddenPropertiesError is returned when there are properties in the Compose -// file that are forbidden. -type ForbiddenPropertiesError struct { - Properties map[string]string -} - -func (e *ForbiddenPropertiesError) Error() string { - return "Configuration contains forbidden properties" -} - -// TODO: resolve multiple files into a single config -func getConfigDict(configDetails types.ConfigDetails) types.Dict { - return configDetails.ConfigFiles[0].Config -} - -func getServices(configDict types.Dict) types.Dict { - if services, ok := configDict["services"]; ok { - if servicesDict, ok := services.(types.Dict); ok { - return servicesDict - } - } - - return types.Dict{} -} - -func transform(source map[string]interface{}, target interface{}) error { - data := mapstructure.Metadata{} - config := &mapstructure.DecoderConfig{ - DecodeHook: mapstructure.ComposeDecodeHookFunc( - transformHook, - mapstructure.StringToTimeDurationHookFunc()), - Result: target, - Metadata: &data, - } - decoder, err := mapstructure.NewDecoder(config) - if err != nil { - return err - } - err = decoder.Decode(source) - // TODO: log unused keys - return err -} - -func transformHook( - source reflect.Type, - target reflect.Type, - data interface{}, -) (interface{}, error) { - switch target { - case reflect.TypeOf(types.External{}): - return transformExternal(data) - case reflect.TypeOf(make(map[string]string, 0)): - return transformMapStringString(source, target, data) - case reflect.TypeOf(types.UlimitsConfig{}): - return transformUlimits(data) - case reflect.TypeOf(types.UnitBytes(0)): - return loadSize(data) - case reflect.TypeOf(types.ServiceSecretConfig{}): - return transformServiceSecret(data) - } - switch target.Kind() { - case reflect.Struct: - return transformStruct(source, target, data) - } - return data, nil -} - -// keys needs to be converted to strings for jsonschema -// TODO: don't use types.Dict -func convertToStringKeysRecursive(value interface{}, keyPrefix string) (interface{}, error) { - if mapping, ok := value.(map[interface{}]interface{}); ok { - dict := make(types.Dict) - for key, entry := range mapping { - str, ok := key.(string) - if !ok { - var location string - if keyPrefix == "" { - location = "at top level" - } else { - location = fmt.Sprintf("in %s", keyPrefix) - } - return nil, fmt.Errorf("Non-string key %s: %#v", location, key) - } - var newKeyPrefix string - if keyPrefix == "" { - newKeyPrefix = str - } else { - newKeyPrefix = fmt.Sprintf("%s.%s", keyPrefix, str) - } - convertedEntry, err := convertToStringKeysRecursive(entry, newKeyPrefix) - if err != nil { - return nil, err - } - dict[str] = convertedEntry - } - return dict, nil - } - if list, ok := value.([]interface{}); ok { - var convertedList []interface{} - for index, entry := range list { - newKeyPrefix := fmt.Sprintf("%s[%d]", keyPrefix, index) - convertedEntry, err := convertToStringKeysRecursive(entry, newKeyPrefix) - if err != nil { - return nil, err - } - convertedList = append(convertedList, convertedEntry) - } - return convertedList, nil - } - return value, nil -} - -func loadServices(servicesDict types.Dict, workingDir string) ([]types.ServiceConfig, error) { - var services []types.ServiceConfig - - for name, serviceDef := range servicesDict { - serviceConfig, err := loadService(name, serviceDef.(types.Dict), workingDir) - if err != nil { - return nil, err - } - services = append(services, *serviceConfig) - } - - return services, nil -} - -func loadService(name string, serviceDict types.Dict, workingDir string) (*types.ServiceConfig, error) { - serviceConfig := &types.ServiceConfig{} - if err := transform(serviceDict, serviceConfig); err != nil { - return nil, err - } - serviceConfig.Name = name - - if err := resolveEnvironment(serviceConfig, serviceDict, workingDir); err != nil { - return nil, err - } - - if err := resolveVolumePaths(serviceConfig.Volumes, workingDir); err != nil { - return nil, err - } - - return serviceConfig, nil -} - -func resolveEnvironment(serviceConfig *types.ServiceConfig, serviceDict types.Dict, workingDir string) error { - environment := make(map[string]string) - - if envFileVal, ok := serviceDict["env_file"]; ok { - envFiles := loadStringOrListOfStrings(envFileVal) - - var envVars []string - - for _, file := range envFiles { - filePath := absPath(workingDir, file) - fileVars, err := opts.ParseEnvFile(filePath) - if err != nil { - return err - } - envVars = append(envVars, fileVars...) - } - - for k, v := range opts.ConvertKVStringsToMap(envVars) { - environment[k] = v - } - } - - for k, v := range serviceConfig.Environment { - environment[k] = v - } - - serviceConfig.Environment = environment - - return nil -} - -func resolveVolumePaths(volumes []string, workingDir string) error { - for i, mapping := range volumes { - parts := strings.SplitN(mapping, ":", 2) - if len(parts) == 1 { - continue - } - - if strings.HasPrefix(parts[0], ".") { - parts[0] = absPath(workingDir, parts[0]) - } - parts[0] = expandUser(parts[0]) - - volumes[i] = strings.Join(parts, ":") - } - - return nil -} - -// TODO: make this more robust -func expandUser(path string) string { - if strings.HasPrefix(path, "~") { - return strings.Replace(path, "~", os.Getenv("HOME"), 1) - } - return path -} - -func transformUlimits(data interface{}) (interface{}, error) { - switch value := data.(type) { - case int: - return types.UlimitsConfig{Single: value}, nil - case types.Dict: - ulimit := types.UlimitsConfig{} - ulimit.Soft = value["soft"].(int) - ulimit.Hard = value["hard"].(int) - return ulimit, nil - default: - return data, fmt.Errorf("invalid type %T for ulimits", value) - } -} - -func loadNetworks(source types.Dict) (map[string]types.NetworkConfig, error) { - networks := make(map[string]types.NetworkConfig) - err := transform(source, &networks) - if err != nil { - return networks, err - } - for name, network := range networks { - if network.External.External && network.External.Name == "" { - network.External.Name = name - networks[name] = network - } - } - return networks, nil -} - -func loadVolumes(source types.Dict) (map[string]types.VolumeConfig, error) { - volumes := make(map[string]types.VolumeConfig) - err := transform(source, &volumes) - if err != nil { - return volumes, err - } - for name, volume := range volumes { - if volume.External.External && volume.External.Name == "" { - volume.External.Name = name - volumes[name] = volume - } - } - return volumes, nil -} - -// TODO: remove duplicate with networks/volumes -func loadSecrets(source types.Dict, workingDir string) (map[string]types.SecretConfig, error) { - secrets := make(map[string]types.SecretConfig) - if err := transform(source, &secrets); err != nil { - return secrets, err - } - for name, secret := range secrets { - if secret.External.External && secret.External.Name == "" { - secret.External.Name = name - secrets[name] = secret - } - if secret.File != "" { - secret.File = absPath(workingDir, secret.File) - } - } - return secrets, nil -} - -func absPath(workingDir string, filepath string) string { - if path.IsAbs(filepath) { - return filepath - } - return path.Join(workingDir, filepath) -} - -func transformStruct( - source reflect.Type, - target reflect.Type, - data interface{}, -) (interface{}, error) { - structValue, ok := data.(map[string]interface{}) - if !ok { - // FIXME: this is necessary because of convertToStringKeysRecursive - structValue, ok = data.(types.Dict) - if !ok { - panic(fmt.Sprintf( - "transformStruct called with non-map type: %T, %s", data, data)) - } - } - - var err error - for i := 0; i < target.NumField(); i++ { - field := target.Field(i) - fieldTag := field.Tag.Get("compose") - - yamlName := toYAMLName(field.Name) - value, ok := structValue[yamlName] - if !ok { - continue - } - - structValue[yamlName], err = convertField( - fieldTag, reflect.TypeOf(value), field.Type, value) - if err != nil { - return nil, fmt.Errorf("field %s: %s", yamlName, err.Error()) - } - } - return structValue, nil -} - -func transformMapStringString( - source reflect.Type, - target reflect.Type, - data interface{}, -) (interface{}, error) { - switch value := data.(type) { - case map[string]interface{}: - return toMapStringString(value), nil - case types.Dict: - return toMapStringString(value), nil - case map[string]string: - return value, nil - default: - return data, fmt.Errorf("invalid type %T for map[string]string", value) - } -} - -func convertField( - fieldTag string, - source reflect.Type, - target reflect.Type, - data interface{}, -) (interface{}, error) { - switch fieldTag { - case "": - return data, nil - case "healthcheck": - return loadHealthcheck(data) - case "list_or_dict_equals": - return loadMappingOrList(data, "="), nil - case "list_or_dict_colon": - return loadMappingOrList(data, ":"), nil - case "list_or_struct_map": - return loadListOrStructMap(data, target) - case "string_or_list": - return loadStringOrListOfStrings(data), nil - case "list_of_strings_or_numbers": - return loadListOfStringsOrNumbers(data), nil - case "shell_command": - return loadShellCommand(data) - case "size": - return loadSize(data) - case "-": - return nil, nil - } - return data, nil -} - -func transformExternal(data interface{}) (interface{}, error) { - switch value := data.(type) { - case bool: - return map[string]interface{}{"external": value}, nil - case types.Dict: - return map[string]interface{}{"external": true, "name": value["name"]}, nil - case map[string]interface{}: - return map[string]interface{}{"external": true, "name": value["name"]}, nil - default: - return data, fmt.Errorf("invalid type %T for external", value) - } -} - -func transformServiceSecret(data interface{}) (interface{}, error) { - switch value := data.(type) { - case string: - return map[string]interface{}{"source": value}, nil - case types.Dict: - return data, nil - case map[string]interface{}: - return data, nil - default: - return data, fmt.Errorf("invalid type %T for external", value) - } - -} - -func toYAMLName(name string) string { - nameParts := fieldNameRegexp.FindAllString(name, -1) - for i, p := range nameParts { - nameParts[i] = strings.ToLower(p) - } - return strings.Join(nameParts, "_") -} - -func loadListOrStructMap(value interface{}, target reflect.Type) (interface{}, error) { - if list, ok := value.([]interface{}); ok { - mapValue := map[interface{}]interface{}{} - for _, name := range list { - mapValue[name] = nil - } - return mapValue, nil - } - - return value, nil -} - -func loadListOfStringsOrNumbers(value interface{}) []string { - list := value.([]interface{}) - result := make([]string, len(list)) - for i, item := range list { - result[i] = fmt.Sprint(item) - } - return result -} - -func loadStringOrListOfStrings(value interface{}) []string { - if list, ok := value.([]interface{}); ok { - result := make([]string, len(list)) - for i, item := range list { - result[i] = fmt.Sprint(item) - } - return result - } - return []string{value.(string)} -} - -func loadMappingOrList(mappingOrList interface{}, sep string) map[string]string { - if mapping, ok := mappingOrList.(types.Dict); ok { - return toMapStringString(mapping) - } - if list, ok := mappingOrList.([]interface{}); ok { - result := make(map[string]string) - for _, value := range list { - parts := strings.SplitN(value.(string), sep, 2) - if len(parts) == 1 { - result[parts[0]] = "" - } else { - result[parts[0]] = parts[1] - } - } - return result - } - panic(fmt.Errorf("expected a map or a slice, got: %#v", mappingOrList)) -} - -func loadShellCommand(value interface{}) (interface{}, error) { - if str, ok := value.(string); ok { - return shellwords.Parse(str) - } - return value, nil -} - -func loadHealthcheck(value interface{}) (interface{}, error) { - if str, ok := value.(string); ok { - return append([]string{"CMD-SHELL"}, str), nil - } - return value, nil -} - -func loadSize(value interface{}) (int64, error) { - switch value := value.(type) { - case int: - return int64(value), nil - case string: - return units.RAMInBytes(value) - } - panic(fmt.Errorf("invalid type for size %T", value)) -} - -func toMapStringString(value map[string]interface{}) map[string]string { - output := make(map[string]string) - for key, value := range value { - output[key] = toString(value) - } - return output -} - -func toString(value interface{}) string { - if value == nil { - return "" - } - return fmt.Sprint(value) -} diff --git a/vendor/github.com/docker/docker/cli/compose/loader/loader_test.go b/vendor/github.com/docker/docker/cli/compose/loader/loader_test.go deleted file mode 100644 index f7fee89ed..000000000 --- a/vendor/github.com/docker/docker/cli/compose/loader/loader_test.go +++ /dev/null @@ -1,800 +0,0 @@ -package loader - -import ( - "fmt" - "io/ioutil" - "os" - "sort" - "testing" - "time" - - "github.com/docker/docker/cli/compose/types" - "github.com/stretchr/testify/assert" -) - -func buildConfigDetails(source types.Dict) types.ConfigDetails { - workingDir, err := os.Getwd() - if err != nil { - panic(err) - } - - return types.ConfigDetails{ - WorkingDir: workingDir, - ConfigFiles: []types.ConfigFile{ - {Filename: "filename.yml", Config: source}, - }, - Environment: nil, - } -} - -var sampleYAML = ` -version: "3" -services: - foo: - image: busybox - networks: - with_me: - bar: - image: busybox - environment: - - FOO=1 - networks: - - with_ipam -volumes: - hello: - driver: default - driver_opts: - beep: boop -networks: - default: - driver: bridge - driver_opts: - beep: boop - with_ipam: - ipam: - driver: default - config: - - subnet: 172.28.0.0/16 -` - -var sampleDict = types.Dict{ - "version": "3", - "services": types.Dict{ - "foo": types.Dict{ - "image": "busybox", - "networks": types.Dict{"with_me": nil}, - }, - "bar": types.Dict{ - "image": "busybox", - "environment": []interface{}{"FOO=1"}, - "networks": []interface{}{"with_ipam"}, - }, - }, - "volumes": types.Dict{ - "hello": types.Dict{ - "driver": "default", - "driver_opts": types.Dict{ - "beep": "boop", - }, - }, - }, - "networks": types.Dict{ - "default": types.Dict{ - "driver": "bridge", - "driver_opts": types.Dict{ - "beep": "boop", - }, - }, - "with_ipam": types.Dict{ - "ipam": types.Dict{ - "driver": "default", - "config": []interface{}{ - types.Dict{ - "subnet": "172.28.0.0/16", - }, - }, - }, - }, - }, -} - -var sampleConfig = types.Config{ - Services: []types.ServiceConfig{ - { - Name: "foo", - Image: "busybox", - Environment: map[string]string{}, - Networks: map[string]*types.ServiceNetworkConfig{ - "with_me": nil, - }, - }, - { - Name: "bar", - Image: "busybox", - Environment: map[string]string{"FOO": "1"}, - Networks: map[string]*types.ServiceNetworkConfig{ - "with_ipam": nil, - }, - }, - }, - Networks: map[string]types.NetworkConfig{ - "default": { - Driver: "bridge", - DriverOpts: map[string]string{ - "beep": "boop", - }, - }, - "with_ipam": { - Ipam: types.IPAMConfig{ - Driver: "default", - Config: []*types.IPAMPool{ - { - Subnet: "172.28.0.0/16", - }, - }, - }, - }, - }, - Volumes: map[string]types.VolumeConfig{ - "hello": { - Driver: "default", - DriverOpts: map[string]string{ - "beep": "boop", - }, - }, - }, -} - -func TestParseYAML(t *testing.T) { - dict, err := ParseYAML([]byte(sampleYAML)) - if !assert.NoError(t, err) { - return - } - assert.Equal(t, sampleDict, dict) -} - -func TestLoad(t *testing.T) { - actual, err := Load(buildConfigDetails(sampleDict)) - if !assert.NoError(t, err) { - return - } - assert.Equal(t, serviceSort(sampleConfig.Services), serviceSort(actual.Services)) - assert.Equal(t, sampleConfig.Networks, actual.Networks) - assert.Equal(t, sampleConfig.Volumes, actual.Volumes) -} - -func TestLoadV31(t *testing.T) { - actual, err := loadYAML(` -version: "3.1" -services: - foo: - image: busybox - secrets: [super] -secrets: - super: - external: true -`) - if !assert.NoError(t, err) { - return - } - assert.Equal(t, len(actual.Services), 1) - assert.Equal(t, len(actual.Secrets), 1) -} - -func TestParseAndLoad(t *testing.T) { - actual, err := loadYAML(sampleYAML) - if !assert.NoError(t, err) { - return - } - assert.Equal(t, serviceSort(sampleConfig.Services), serviceSort(actual.Services)) - assert.Equal(t, sampleConfig.Networks, actual.Networks) - assert.Equal(t, sampleConfig.Volumes, actual.Volumes) -} - -func TestInvalidTopLevelObjectType(t *testing.T) { - _, err := loadYAML("1") - assert.Error(t, err) - assert.Contains(t, err.Error(), "Top-level object must be a mapping") - - _, err = loadYAML("\"hello\"") - assert.Error(t, err) - assert.Contains(t, err.Error(), "Top-level object must be a mapping") - - _, err = loadYAML("[\"hello\"]") - assert.Error(t, err) - assert.Contains(t, err.Error(), "Top-level object must be a mapping") -} - -func TestNonStringKeys(t *testing.T) { - _, err := loadYAML(` -version: "3" -123: - foo: - image: busybox -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "Non-string key at top level: 123") - - _, err = loadYAML(` -version: "3" -services: - foo: - image: busybox - 123: - image: busybox -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "Non-string key in services: 123") - - _, err = loadYAML(` -version: "3" -services: - foo: - image: busybox -networks: - default: - ipam: - config: - - 123: oh dear -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "Non-string key in networks.default.ipam.config[0]: 123") - - _, err = loadYAML(` -version: "3" -services: - dict-env: - image: busybox - environment: - 1: FOO -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "Non-string key in services.dict-env.environment: 1") -} - -func TestSupportedVersion(t *testing.T) { - _, err := loadYAML(` -version: "3" -services: - foo: - image: busybox -`) - assert.NoError(t, err) - - _, err = loadYAML(` -version: "3.0" -services: - foo: - image: busybox -`) - assert.NoError(t, err) -} - -func TestUnsupportedVersion(t *testing.T) { - _, err := loadYAML(` -version: "2" -services: - foo: - image: busybox -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "version") - - _, err = loadYAML(` -version: "2.0" -services: - foo: - image: busybox -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "version") -} - -func TestInvalidVersion(t *testing.T) { - _, err := loadYAML(` -version: 3 -services: - foo: - image: busybox -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "version must be a string") -} - -func TestV1Unsupported(t *testing.T) { - _, err := loadYAML(` -foo: - image: busybox -`) - assert.Error(t, err) -} - -func TestNonMappingObject(t *testing.T) { - _, err := loadYAML(` -version: "3" -services: - - foo: - image: busybox -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "services must be a mapping") - - _, err = loadYAML(` -version: "3" -services: - foo: busybox -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "services.foo must be a mapping") - - _, err = loadYAML(` -version: "3" -networks: - - default: - driver: bridge -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "networks must be a mapping") - - _, err = loadYAML(` -version: "3" -networks: - default: bridge -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "networks.default must be a mapping") - - _, err = loadYAML(` -version: "3" -volumes: - - data: - driver: local -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "volumes must be a mapping") - - _, err = loadYAML(` -version: "3" -volumes: - data: local -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "volumes.data must be a mapping") -} - -func TestNonStringImage(t *testing.T) { - _, err := loadYAML(` -version: "3" -services: - foo: - image: ["busybox", "latest"] -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "services.foo.image must be a string") -} - -func TestValidEnvironment(t *testing.T) { - config, err := loadYAML(` -version: "3" -services: - dict-env: - image: busybox - environment: - FOO: "1" - BAR: 2 - BAZ: 2.5 - QUUX: - list-env: - image: busybox - environment: - - FOO=1 - - BAR=2 - - BAZ=2.5 - - QUUX= -`) - assert.NoError(t, err) - - expected := map[string]string{ - "FOO": "1", - "BAR": "2", - "BAZ": "2.5", - "QUUX": "", - } - - assert.Equal(t, 2, len(config.Services)) - - for _, service := range config.Services { - assert.Equal(t, expected, service.Environment) - } -} - -func TestInvalidEnvironmentValue(t *testing.T) { - _, err := loadYAML(` -version: "3" -services: - dict-env: - image: busybox - environment: - FOO: ["1"] -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "services.dict-env.environment.FOO must be a string, number or null") -} - -func TestInvalidEnvironmentObject(t *testing.T) { - _, err := loadYAML(` -version: "3" -services: - dict-env: - image: busybox - environment: "FOO=1" -`) - assert.Error(t, err) - assert.Contains(t, err.Error(), "services.dict-env.environment must be a mapping") -} - -func TestEnvironmentInterpolation(t *testing.T) { - config, err := loadYAML(` -version: "3" -services: - test: - image: busybox - labels: - - home1=$HOME - - home2=${HOME} - - nonexistent=$NONEXISTENT - - default=${NONEXISTENT-default} -networks: - test: - driver: $HOME -volumes: - test: - driver: $HOME -`) - - assert.NoError(t, err) - - home := os.Getenv("HOME") - - expectedLabels := map[string]string{ - "home1": home, - "home2": home, - "nonexistent": "", - "default": "default", - } - - assert.Equal(t, expectedLabels, config.Services[0].Labels) - assert.Equal(t, home, config.Networks["test"].Driver) - assert.Equal(t, home, config.Volumes["test"].Driver) -} - -func TestUnsupportedProperties(t *testing.T) { - dict, err := ParseYAML([]byte(` -version: "3" -services: - web: - image: web - build: ./web - links: - - bar - db: - image: db - build: ./db -`)) - assert.NoError(t, err) - - configDetails := buildConfigDetails(dict) - - _, err = Load(configDetails) - assert.NoError(t, err) - - unsupported := GetUnsupportedProperties(configDetails) - assert.Equal(t, []string{"build", "links"}, unsupported) -} - -func TestDeprecatedProperties(t *testing.T) { - dict, err := ParseYAML([]byte(` -version: "3" -services: - web: - image: web - container_name: web - db: - image: db - container_name: db - expose: ["5434"] -`)) - assert.NoError(t, err) - - configDetails := buildConfigDetails(dict) - - _, err = Load(configDetails) - assert.NoError(t, err) - - deprecated := GetDeprecatedProperties(configDetails) - assert.Equal(t, 2, len(deprecated)) - assert.Contains(t, deprecated, "container_name") - assert.Contains(t, deprecated, "expose") -} - -func TestForbiddenProperties(t *testing.T) { - _, err := loadYAML(` -version: "3" -services: - foo: - image: busybox - volumes: - - /data - volume_driver: some-driver - bar: - extends: - service: foo -`) - - assert.Error(t, err) - assert.IsType(t, &ForbiddenPropertiesError{}, err) - fmt.Println(err) - forbidden := err.(*ForbiddenPropertiesError).Properties - - assert.Equal(t, 2, len(forbidden)) - assert.Contains(t, forbidden, "volume_driver") - assert.Contains(t, forbidden, "extends") -} - -func durationPtr(value time.Duration) *time.Duration { - return &value -} - -func int64Ptr(value int64) *int64 { - return &value -} - -func uint64Ptr(value uint64) *uint64 { - return &value -} - -func TestFullExample(t *testing.T) { - bytes, err := ioutil.ReadFile("full-example.yml") - assert.NoError(t, err) - - config, err := loadYAML(string(bytes)) - if !assert.NoError(t, err) { - return - } - - workingDir, err := os.Getwd() - assert.NoError(t, err) - - homeDir := os.Getenv("HOME") - stopGracePeriod := time.Duration(20 * time.Second) - - expectedServiceConfig := types.ServiceConfig{ - Name: "foo", - - CapAdd: []string{"ALL"}, - CapDrop: []string{"NET_ADMIN", "SYS_ADMIN"}, - CgroupParent: "m-executor-abcd", - Command: []string{"bundle", "exec", "thin", "-p", "3000"}, - ContainerName: "my-web-container", - DependsOn: []string{"db", "redis"}, - Deploy: types.DeployConfig{ - Mode: "replicated", - Replicas: uint64Ptr(6), - Labels: map[string]string{"FOO": "BAR"}, - UpdateConfig: &types.UpdateConfig{ - Parallelism: uint64Ptr(3), - Delay: time.Duration(10 * time.Second), - FailureAction: "continue", - Monitor: time.Duration(60 * time.Second), - MaxFailureRatio: 0.3, - }, - Resources: types.Resources{ - Limits: &types.Resource{ - NanoCPUs: "0.001", - MemoryBytes: 50 * 1024 * 1024, - }, - Reservations: &types.Resource{ - NanoCPUs: "0.0001", - MemoryBytes: 20 * 1024 * 1024, - }, - }, - RestartPolicy: &types.RestartPolicy{ - Condition: "on_failure", - Delay: durationPtr(5 * time.Second), - MaxAttempts: uint64Ptr(3), - Window: durationPtr(2 * time.Minute), - }, - Placement: types.Placement{ - Constraints: []string{"node=foo"}, - }, - }, - Devices: []string{"/dev/ttyUSB0:/dev/ttyUSB0"}, - DNS: []string{"8.8.8.8", "9.9.9.9"}, - DNSSearch: []string{"dc1.example.com", "dc2.example.com"}, - DomainName: "foo.com", - Entrypoint: []string{"/code/entrypoint.sh", "-p", "3000"}, - Environment: map[string]string{ - "RACK_ENV": "development", - "SHOW": "true", - "SESSION_SECRET": "", - "FOO": "1", - "BAR": "2", - "BAZ": "3", - }, - Expose: []string{"3000", "8000"}, - ExternalLinks: []string{ - "redis_1", - "project_db_1:mysql", - "project_db_1:postgresql", - }, - ExtraHosts: map[string]string{ - "otherhost": "50.31.209.229", - "somehost": "162.242.195.82", - }, - HealthCheck: &types.HealthCheckConfig{ - Test: []string{ - "CMD-SHELL", - "echo \"hello world\"", - }, - Interval: "10s", - Timeout: "1s", - Retries: uint64Ptr(5), - }, - Hostname: "foo", - Image: "redis", - Ipc: "host", - Labels: map[string]string{ - "com.example.description": "Accounting webapp", - "com.example.number": "42", - "com.example.empty-label": "", - }, - Links: []string{ - "db", - "db:database", - "redis", - }, - Logging: &types.LoggingConfig{ - Driver: "syslog", - Options: map[string]string{ - "syslog-address": "tcp://192.168.0.42:123", - }, - }, - MacAddress: "02:42:ac:11:65:43", - NetworkMode: "container:0cfeab0f748b9a743dc3da582046357c6ef497631c1a016d28d2bf9b4f899f7b", - Networks: map[string]*types.ServiceNetworkConfig{ - "some-network": { - Aliases: []string{"alias1", "alias3"}, - Ipv4Address: "", - Ipv6Address: "", - }, - "other-network": { - Ipv4Address: "172.16.238.10", - Ipv6Address: "2001:3984:3989::10", - }, - "other-other-network": nil, - }, - Pid: "host", - Ports: []string{ - "3000", - "3000-3005", - "8000:8000", - "9090-9091:8080-8081", - "49100:22", - "127.0.0.1:8001:8001", - "127.0.0.1:5000-5010:5000-5010", - }, - Privileged: true, - ReadOnly: true, - Restart: "always", - SecurityOpt: []string{ - "label=level:s0:c100,c200", - "label=type:svirt_apache_t", - }, - StdinOpen: true, - StopSignal: "SIGUSR1", - StopGracePeriod: &stopGracePeriod, - Tmpfs: []string{"/run", "/tmp"}, - Tty: true, - Ulimits: map[string]*types.UlimitsConfig{ - "nproc": { - Single: 65535, - }, - "nofile": { - Soft: 20000, - Hard: 40000, - }, - }, - User: "someone", - Volumes: []string{ - "/var/lib/mysql", - "/opt/data:/var/lib/mysql", - fmt.Sprintf("%s:/code", workingDir), - fmt.Sprintf("%s/static:/var/www/html", workingDir), - fmt.Sprintf("%s/configs:/etc/configs/:ro", homeDir), - "datavolume:/var/lib/mysql", - }, - WorkingDir: "/code", - } - - assert.Equal(t, []types.ServiceConfig{expectedServiceConfig}, config.Services) - - expectedNetworkConfig := map[string]types.NetworkConfig{ - "some-network": {}, - - "other-network": { - Driver: "overlay", - DriverOpts: map[string]string{ - "foo": "bar", - "baz": "1", - }, - Ipam: types.IPAMConfig{ - Driver: "overlay", - Config: []*types.IPAMPool{ - {Subnet: "172.16.238.0/24"}, - {Subnet: "2001:3984:3989::/64"}, - }, - }, - }, - - "external-network": { - External: types.External{ - Name: "external-network", - External: true, - }, - }, - - "other-external-network": { - External: types.External{ - Name: "my-cool-network", - External: true, - }, - }, - } - - assert.Equal(t, expectedNetworkConfig, config.Networks) - - expectedVolumeConfig := map[string]types.VolumeConfig{ - "some-volume": {}, - "other-volume": { - Driver: "flocker", - DriverOpts: map[string]string{ - "foo": "bar", - "baz": "1", - }, - }, - "external-volume": { - External: types.External{ - Name: "external-volume", - External: true, - }, - }, - "other-external-volume": { - External: types.External{ - Name: "my-cool-volume", - External: true, - }, - }, - } - - assert.Equal(t, expectedVolumeConfig, config.Volumes) -} - -func loadYAML(yaml string) (*types.Config, error) { - dict, err := ParseYAML([]byte(yaml)) - if err != nil { - return nil, err - } - - return Load(buildConfigDetails(dict)) -} - -func serviceSort(services []types.ServiceConfig) []types.ServiceConfig { - sort.Sort(servicesByName(services)) - return services -} - -type servicesByName []types.ServiceConfig - -func (sbn servicesByName) Len() int { return len(sbn) } -func (sbn servicesByName) Swap(i, j int) { sbn[i], sbn[j] = sbn[j], sbn[i] } -func (sbn servicesByName) Less(i, j int) bool { return sbn[i].Name < sbn[j].Name } diff --git a/vendor/github.com/docker/docker/cli/compose/schema/bindata.go b/vendor/github.com/docker/docker/cli/compose/schema/bindata.go deleted file mode 100644 index 9486e91ae..000000000 --- a/vendor/github.com/docker/docker/cli/compose/schema/bindata.go +++ /dev/null @@ -1,260 +0,0 @@ -// Code generated by go-bindata. -// sources: -// data/config_schema_v3.0.json -// data/config_schema_v3.1.json -// DO NOT EDIT! - -package schema - -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 _dataConfig_schema_v30Json = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x5a\x4f\x8f\xdb\xb8\x0e\xbf\xe7\x53\x18\x6e\x6f\xcd\xcc\x14\x78\xc5\x03\x5e\x6f\xef\xb8\xa7\xdd\xf3\x0e\x5c\x43\xb1\x99\x44\x1d\x59\x52\x29\x39\x9d\xb4\xc8\x77\x5f\xc8\xff\x22\x2b\x92\xe5\x24\xee\xb6\x87\x9e\x66\x62\x91\x14\xff\xe9\x47\x8a\xf6\xf7\x55\x92\xa4\x6f\x55\xb1\x87\x8a\xa4\x1f\x93\x74\xaf\xb5\xfc\xf8\xf4\xf4\x59\x09\xfe\xd0\x3e\x7d\x14\xb8\x7b\x2a\x91\x6c\xf5\xc3\xfb\x0f\x4f\xed\xb3\x37\xe9\xda\xf0\xd1\xd2\xb0\x14\x82\x6f\xe9\x2e\x6f\x57\xf2\xc3\x7f\x1e\xdf\x3f\x1a\xf6\x96\x44\x1f\x25\x18\x22\xb1\xf9\x0c\x85\x6e\x9f\x21\x7c\xa9\x29\x82\x61\x7e\x4e\x0f\x80\x8a\x0a\x9e\x66\xeb\x95\x59\x93\x28\x24\xa0\xa6\xa0\xd2\x8f\x89\x51\x2e\x49\x06\x92\xfe\x81\x25\x56\x69\xa4\x7c\x97\x36\x8f\x4f\x8d\x84\x24\x49\x15\xe0\x81\x16\x96\x84\x41\xd5\x37\x4f\x67\xf9\x4f\x03\xd9\xda\x95\x6a\x29\xdb\x3c\x97\x44\x6b\x40\xfe\xd7\xa5\x6e\xcd\xf2\xa7\x67\xf2\xf0\xed\xff\x0f\x7f\xbf\x7f\xf8\xdf\x63\xfe\x90\xbd\x7b\x3b\x5a\x36\xfe\x45\xd8\xb6\xdb\x97\xb0\xa5\x9c\x6a\x2a\xf8\xb0\x7f\x3a\x50\x9e\xba\xff\x4e\xc3\xc6\xa4\x2c\x1b\x62\xc2\x46\x7b\x6f\x09\x53\x30\xb6\x99\x83\xfe\x2a\xf0\x25\x66\xf3\x40\xf6\x93\x6c\xee\xf6\xf7\xd8\x3c\x36\xe7\x20\x58\x5d\x45\x23\xd8\x53\xfd\x24\x63\xda\xed\xef\x8b\xdf\xaa\x37\x7a\x92\xb6\xa5\xb0\xf6\x6e\x14\x1c\x65\xbb\xcf\x55\xbe\x6c\x0b\xfb\x6a\x70\x56\xc0\x4b\x25\x48\x26\x8e\xe6\x59\xc0\x1f\x2d\x41\x05\x5c\xa7\x83\x0b\x92\x24\xdd\xd4\x94\x95\xae\x47\x05\x87\x3f\x8d\x88\x67\xeb\x61\x92\x7c\x77\x0f\xb6\x25\xa7\x59\x1f\xfd\x0a\x07\x7c\x58\x0f\xd8\x32\xac\x17\x82\x6b\x78\xd5\x8d\x51\xd3\x5b\xb7\x2e\x10\xc5\x0b\xe0\x96\x32\x98\xcb\x41\x70\xa7\x26\x5c\xc6\xa8\xd2\xb9\xc0\xbc\xa4\x85\x4e\x4f\x0e\xfb\x85\xbc\x78\x3e\x0d\xac\xd6\xaf\x6c\xe5\x11\x98\x16\x44\xe6\xa4\x2c\x47\x76\x10\x44\x72\x4c\xd7\x49\x4a\x35\x54\xca\x6f\x62\x92\xd6\x9c\x7e\xa9\xe1\x8f\x8e\x44\x63\x0d\xae\xdc\x12\x85\x5c\x5e\xf0\x0e\x45\x2d\x73\x49\xd0\x24\xd8\xb4\xfb\xd3\x42\x54\x15\xe1\x4b\x65\xdd\x35\x76\xcc\xf0\xbc\xe0\x9a\x50\x0e\x98\x73\x52\xc5\x12\xc9\x9c\x3a\xe0\xa5\xca\xdb\xfa\x37\x99\x46\xdb\xbc\xe5\x57\x8e\x80\xa1\x18\x2e\x1a\x8f\x92\x4f\x25\x76\x2b\xc6\xa4\xb6\xd1\x2d\x75\x18\x73\x05\x04\x8b\xfd\x8d\xfc\xa2\x22\x94\xcf\xf1\x1d\x70\x8d\x47\x29\x68\x9b\x2f\xbf\x5c\x22\x00\x3f\xe4\x03\x96\x5c\xed\x06\xe0\x07\x8a\x82\x57\xfd\x69\x98\x03\x30\x03\xc8\x1b\xfe\x57\x29\x14\xb8\x8e\x71\x0c\xb4\x97\x06\x53\x47\x3e\xe9\x39\x9e\x7b\xc3\xd7\x49\xca\xeb\x6a\x03\x68\x5a\xba\x11\xe5\x56\x60\x45\x8c\xb2\xfd\xde\xd6\xf2\xc8\xd3\x9e\xcc\xb3\x1d\x68\xdb\x60\xca\x3a\x61\x39\xa3\xfc\x65\xf9\x14\x87\x57\x8d\x24\xdf\x0b\xa5\xe7\x63\xb8\xc5\xbe\x07\xc2\xf4\xbe\xd8\x43\xf1\x32\xc1\x6e\x53\x8d\xb8\x85\xd2\x73\x92\x9c\x56\x64\x17\x27\x92\x45\x8c\x84\x91\x0d\xb0\x9b\xec\x5c\xd4\xf9\x96\x58\xb1\xdb\x19\xd2\x50\xc6\x5d\x74\x2e\xdd\x72\xac\xe6\x97\x48\x0f\x80\x73\x0b\xb8\x90\xe7\x86\xcb\x5d\x8c\x37\x20\x49\xbc\xfb\x1c\x91\x7e\x7a\x6c\x9b\xcf\x89\x53\xd5\xfc\xc7\x58\x9a\xb9\xed\x42\xe2\xd4\x7d\xdf\x13\xc7\xc2\x79\x0d\xc5\x28\x2a\x15\x29\x4c\xdf\x80\xa0\x02\x71\x3d\x93\x76\xcd\x7e\x5e\x89\x32\x94\xa0\x17\xc4\xae\x6f\x82\x48\x7d\x75\x21\x4c\x6e\xea\x1f\x67\x85\x2e\x7a\x81\x88\x58\x13\x52\x6f\xae\x9a\x67\x75\xe3\x29\xd6\xd0\x11\x46\x89\x82\xf8\x61\x0f\x3a\x72\x24\x8d\xca\xc3\x87\x99\x39\xe1\xe3\xfd\xef\x24\x6f\x80\x35\x28\x73\x7e\x8f\x1c\x11\x75\x56\xa5\x39\x6e\x3e\x45\xb2\xc8\x69\xfb\xc1\x2d\xbc\xa4\x65\x18\x2b\x1a\x84\xb0\x0f\x98\x14\xa8\x2f\x4e\xd7\xbf\x53\xee\xdb\xad\xef\xae\xf6\x12\xe9\x81\x32\xd8\xc1\xf8\xd6\xb2\x11\x82\x01\xe1\x23\xe8\x41\x20\x65\x2e\x38\x3b\xce\xa0\x54\x9a\x60\xf4\x42\xa1\xa0\xa8\x91\xea\x63\x2e\xa4\x5e\xbc\xcf\x50\xfb\x2a\x57\xf4\x1b\x8c\xa3\x79\xc6\xfb\x4e\x50\x36\xe2\x39\xaa\x42\xdf\x56\xaf\x95\x2e\x29\xcf\x85\x04\x1e\xf5\x8e\xd2\x42\xe6\x3b\x24\x05\xe4\x12\x90\x8a\xd2\x67\xe0\xda\x8e\x75\x59\x23\x31\xfb\x5f\x8a\x51\x74\xc7\x09\x8b\x39\x5a\x57\x72\x7b\xe3\xc5\x42\xeb\x78\xb8\x6b\x46\x2b\x1a\x3e\x07\x1e\x80\x9d\x51\x03\x5a\xfc\xf7\xc3\xfe\x04\xe4\x9f\x35\xa5\x5c\xc3\x0e\xd0\x87\x94\x13\x5d\xc7\x74\xd3\x31\xa3\xdb\xd8\x13\x1c\x07\x74\x42\x8f\x86\x41\x89\xad\xf6\x33\xf8\x7a\x11\xaf\x5e\xa3\xe1\x6f\x23\x6f\xdd\x29\x92\x79\xe9\xaf\x82\x73\x57\x8d\x2c\x88\xa8\x27\x2f\xa2\xd6\x2a\xda\x18\x36\x34\x5c\x4d\x35\x35\x03\xa9\x35\xc5\x5c\x14\x2f\x4c\xa3\x64\x0e\x41\x49\xfd\xda\xae\x1c\xcb\xae\x98\x23\x3b\x77\x96\x5e\x80\x6f\xa2\x68\x93\x46\x27\xb0\xd3\xd3\xcd\x8e\x28\x38\x79\xa4\x8a\x6c\x9c\x99\x9b\xef\x70\x9b\x6c\xc4\x43\x1c\x63\x10\x34\x52\x27\x2e\x1d\xda\x8e\xf0\x04\xd4\xaf\x39\x38\xd0\xb4\x02\x51\xfb\x6b\xd6\xca\xce\xef\x8e\x29\xb5\x26\xb3\x91\xa0\x5a\x94\x6e\x4c\x9f\x87\xa0\xf6\xfd\x45\x34\x70\x73\x0e\x09\x82\x64\xb4\x20\x2a\x06\x44\x77\x5c\x50\x6b\x59\x12\x0d\x79\xfb\xa2\xea\x2a\xe8\x9f\xc0\x7c\x49\x90\x30\x06\x8c\xaa\x6a\x0e\x86\xa6\x25\x30\x72\xbc\xa9\x7c\x36\xec\x5b\x42\x59\x8d\x90\x93\x42\x77\xef\xc2\x22\x39\x97\x56\x82\x53\x2d\xbc\x08\x31\x6f\xcb\x8a\xbc\xe6\xfd\xb6\x0d\x89\xf7\xc0\x04\xdb\xba\xb9\x77\x4b\x2b\x13\x94\xa8\xb1\xb8\x70\xf6\xcd\x21\x3a\xd7\xfa\x40\xc6\xf4\x3b\x5e\x98\x8e\xa0\x0c\x92\x0c\x57\xff\x28\x7f\xb4\xb4\x74\x7d\x66\x2e\x05\xa3\xc5\x71\x29\x0b\x0b\xc1\x5b\x27\xcf\x49\x88\x3b\x33\xd0\xa4\x83\x69\x85\x2a\xa9\xa3\x87\xb5\x61\xf8\x4a\x79\x29\xbe\x5e\xb1\xe1\x72\xa9\x24\x19\x29\xc0\xc1\xbb\x7b\x1d\xad\x34\x12\xca\xf5\xd5\xe5\xfc\x5e\xb3\xee\xa8\xe6\x43\x7e\x46\x50\x7f\xa0\x8b\xbf\x49\x0d\x20\x7d\x21\xeb\xe8\x3c\xa8\x82\x4a\xa0\x37\x01\x17\x78\xf3\x1d\x33\xb1\x27\x5b\xa0\xaa\xcd\x1a\x20\x76\x54\xe6\xbe\xb8\xf8\x6d\x23\x3e\x24\xcc\xe2\x80\x44\x25\xa9\x96\x3a\x1d\xb3\x47\xaa\xa9\xb7\x06\x27\xd3\xa3\x88\x24\x3c\x8e\x88\x69\x1d\xd7\xbd\xa3\x50\xf5\x86\xc3\x64\x47\x65\xf9\xd3\xf7\x9e\x77\xfe\x35\xe5\x14\xbe\x94\xdc\x07\x7a\xfd\xdb\x90\x40\x54\x9f\x87\x9e\x79\x3d\xf8\x2a\x9b\x1d\xe2\xe0\xab\x88\xe5\xf4\xbf\xb2\xc1\xbb\x03\x33\xba\x2f\x37\x22\x90\xd1\x51\xfd\x46\x8c\xdf\xf9\x75\x65\x7e\x39\x43\x2a\x2b\xcf\x2e\xef\x8f\x53\x29\x31\x7b\x3a\xdf\x71\x64\x63\x35\x5c\x32\xcf\x07\x74\x63\xb4\x9d\x1a\x4a\xf4\x24\x81\x69\xad\xb3\x69\xe7\xc4\x69\xcb\x17\xcc\xf0\xc7\x77\x13\x35\x65\xea\x2d\xda\x0f\x02\xe3\x05\x06\x3e\xfe\x98\x3a\x8d\x68\xef\xdd\xcb\xaf\xc0\x02\xa0\x66\xf1\x5f\x7c\x13\x66\xec\xe4\xc7\x8b\xf9\xc6\xf7\xf1\xd0\xae\xfd\x9e\x2b\x1b\xf9\xc7\x21\x69\xdf\x49\x5b\x90\x92\xd9\xbd\x79\x28\x8c\xde\x2f\xc5\xdc\x91\x61\xff\xc5\x56\xe6\x87\xab\x95\xfd\xb7\xf9\xba\x6e\x75\x5a\xfd\x13\x00\x00\xff\xff\x46\xf7\x7b\x23\xe5\x2a\x00\x00") - -func dataConfig_schema_v30JsonBytes() ([]byte, error) { - return bindataRead( - _dataConfig_schema_v30Json, - "data/config_schema_v3.0.json", - ) -} - -func dataConfig_schema_v30Json() (*asset, error) { - bytes, err := dataConfig_schema_v30JsonBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "data/config_schema_v3.0.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _dataConfig_schema_v31Json = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x1a\xcb\x8e\xdb\x36\xf0\xee\xaf\x10\x94\xdc\xe2\xdd\x4d\xd1\xa0\x40\x73\xeb\xb1\xa7\xf6\xdc\x85\x23\xd0\xd2\x58\x66\x96\x22\x19\x92\x72\xd6\x09\xfc\xef\x05\xf5\x32\x45\x91\x22\x6d\x2b\xd9\x45\xd1\xd3\xae\xc5\x99\xe1\xbc\x67\x38\xe4\xf7\x55\x92\xa4\x6f\x65\xbe\x87\x0a\xa5\x1f\x93\x74\xaf\x14\xff\xf8\xf0\xf0\x59\x32\x7a\xd7\x7e\xbd\x67\xa2\x7c\x28\x04\xda\xa9\xbb\xf7\x1f\x1e\xda\x6f\x6f\xd2\xb5\xc6\xc3\x85\x46\xc9\x19\xdd\xe1\x32\x6b\x57\xb2\xc3\xaf\xf7\xbf\xdc\x6b\xf4\x16\x44\x1d\x39\x68\x20\xb6\xfd\x0c\xb9\x6a\xbf\x09\xf8\x52\x63\x01\x1a\xf9\x31\x3d\x80\x90\x98\xd1\x74\xb3\x5e\xe9\x35\x2e\x18\x07\xa1\x30\xc8\xf4\x63\xa2\x99\x4b\x92\x01\xa4\xff\x60\x90\x95\x4a\x60\x5a\xa6\xcd\xe7\x53\x43\x21\x49\x52\x09\xe2\x80\x73\x83\xc2\xc0\xea\x9b\x87\x33\xfd\x87\x01\x6c\x6d\x53\x35\x98\x6d\xbe\x73\xa4\x14\x08\xfa\xf7\x94\xb7\x66\xf9\xd3\x23\xba\xfb\xf6\xc7\xdd\x3f\xef\xef\x7e\xbf\xcf\xee\x36\xef\xde\x8e\x96\xb5\x7e\x05\xec\xda\xed\x0b\xd8\x61\x8a\x15\x66\x74\xd8\x3f\x1d\x20\x4f\xdd\x7f\xa7\x61\x63\x54\x14\x0d\x30\x22\xa3\xbd\x77\x88\x48\x18\xcb\x4c\x41\x7d\x65\xe2\x29\x24\xf3\x00\xf6\x42\x32\x77\xfb\x3b\x64\x1e\x8b\x73\x60\xa4\xae\x82\x16\xec\xa1\x5e\x48\x98\x76\xfb\x65\xec\x27\x21\x17\xa0\xc2\x2e\xdb\x42\xbd\x98\xc7\xea\xed\x6f\x13\x78\xd5\x0b\x3d\x0b\xdb\x42\x18\x7b\x37\x0c\x8e\xc2\xdb\xa5\x2a\x57\x78\xf9\x75\x35\x28\xcb\xa3\xa5\x02\x38\x61\x47\xfd\xcd\xa3\x8f\x16\xa0\x02\xaa\xd2\x41\x05\x49\x92\x6e\x6b\x4c\x0a\x5b\xa3\x8c\xc2\x5f\x9a\xc4\xa3\xf1\x31\x49\xbe\xdb\x99\xcc\xa0\xd3\xac\x8f\x7e\xf9\x0d\x3e\xac\x7b\x64\x19\xd6\x73\x46\x15\x3c\xab\x46\xa8\xf9\xad\x5b\x15\xb0\xfc\x09\xc4\x0e\x13\x88\xc5\x40\xa2\x94\x33\x2a\x23\x58\xaa\x8c\x89\xac\xc0\xb9\x4a\x4f\x16\xfa\x84\x5e\xd8\x9f\x06\x54\xe3\xd7\x66\xe5\x20\x98\xe6\x88\x67\xa8\x28\x46\x72\x20\x21\xd0\x31\x5d\x27\x29\x56\x50\x49\xb7\x88\x49\x5a\x53\xfc\xa5\x86\x3f\x3b\x10\x25\x6a\xb0\xe9\x16\x82\xf1\xe5\x09\x97\x82\xd5\x3c\xe3\x48\x68\x07\x9b\x57\x7f\x9a\xb3\xaa\x42\x74\x29\xaf\xbb\x44\x8e\x08\xcd\x33\xaa\x10\xa6\x20\x32\x8a\xaa\x90\x23\xe9\xa8\x03\x5a\xc8\xac\x2d\xf8\xb3\x6e\xb4\xcb\x5a\x7c\x69\x11\x18\xaa\xff\xa2\xf6\x28\xe8\x9c\x63\xb7\x64\xb4\x6b\x6b\xde\x52\x0b\x31\x93\x80\x44\xbe\xbf\x12\x9f\x55\x08\xd3\x18\xdd\x01\x55\xe2\xc8\x19\x6e\xfd\xe5\xd5\x39\x02\xd0\x43\x36\xe4\x92\x8b\xd5\x00\xf4\x80\x05\xa3\x55\x1f\x0d\x31\x09\x66\x48\xf2\x1a\xff\x99\x33\x09\xb6\x62\x2c\x01\xcd\xa5\x41\xd4\x91\x4e\x7a\x8c\xc7\x5e\xf0\x75\x92\xd2\xba\xda\x82\xd0\x3d\xec\x08\x72\xc7\x44\x85\x34\xb3\xfd\xde\xc6\xf2\x48\xd3\x0e\xcf\x33\x15\x68\xca\xa0\xcb\x3a\x22\x19\xc1\xf4\x69\x79\x17\x87\x67\x25\x50\xb6\x67\x52\xc5\xe7\x70\x03\x7d\x0f\x88\xa8\x7d\xbe\x87\xfc\x69\x06\xdd\x84\x1a\x61\x33\xa9\x62\x9c\x1c\x57\xa8\x0c\x03\xf1\x3c\x04\x42\xd0\x16\xc8\x55\x72\x2e\xaa\x7c\x83\x2c\x2b\x4b\x0d\xea\xf3\xb8\x49\xe7\xd2\x2d\x87\x6a\x7e\x21\xf0\x01\x44\x6c\x01\x67\xfc\xdc\x70\xd9\x8b\xe1\x06\x24\x09\x77\x9f\x23\xd0\x4f\xf7\x6d\xf3\x39\x13\x55\xcd\x7f\x84\xa4\x1b\xbb\x5d\x48\xac\xba\xef\xfa\x62\x49\x18\xd7\x50\x8c\xac\x52\xa1\x5c\xf7\x0d\x02\xa4\xc7\xae\x67\xd0\xee\x74\x93\x55\xac\xf0\x39\xe8\x04\xd8\xd6\x8d\x37\x53\x5f\x5c\x08\x93\xab\xfa\xc7\x28\xd3\x05\x0f\x10\x01\x69\x7c\xec\xc5\xb2\x79\x66\x37\xec\x62\x0d\x1c\x22\x18\x49\x08\x07\xbb\x57\x91\x23\x6a\x98\x1f\x3e\x44\xfa\x84\x0b\xf7\xb7\x59\x5c\x0f\xaa\x97\x66\x7c\x8f\x1c\x20\x75\x66\xa5\x09\x37\x17\x23\x9b\x40\xb4\xfd\xe0\x16\x9e\xe3\xc2\x9f\x2b\x9a\x0c\x61\x06\x18\x67\x42\x4d\xa2\xeb\xe7\x94\xfb\x76\xeb\x9b\xab\x3d\x17\xf8\x80\x09\x94\x30\x3e\xb5\x6c\x19\x23\x80\xe8\x28\xf5\x08\x40\x45\xc6\x28\x39\x46\x40\x4a\x85\x44\xf0\x40\x21\x21\xaf\x05\x56\xc7\x8c\x71\xb5\x78\x9f\x21\xf7\x55\x26\xf1\x37\x18\x5b\xf3\x9c\xef\x3b\x42\x1b\x8b\x21\x6b\x42\x72\xa5\x41\x7d\x29\x29\x1c\xc6\x8e\x44\x18\x4c\x54\xe1\x14\x95\x4a\x56\x8b\x3c\xf6\x80\xad\xf7\x44\xa2\x84\xd8\x23\xbc\x76\xb7\x71\xd8\xcc\x03\x97\x97\x00\x4f\x0a\x5d\x67\xc2\x50\x55\xb6\x7f\x9b\x79\xe5\xe4\x0c\x7d\x79\x94\xb9\xba\xae\x5b\x93\xaa\xc0\x34\x63\x1c\x68\x30\x36\xa4\x62\x3c\x2b\x05\xca\x21\xe3\x20\x30\x73\xaa\x62\x6d\x46\x7a\x51\x0b\xa4\xf7\x9f\x92\x91\xb8\xa4\x88\x84\xc2\x4c\x55\x7c\x77\xe5\xb1\x52\xa9\x70\xb0\xd7\x04\x57\xd8\x1f\x34\x0e\xaf\x8d\xe8\x00\xda\xea\xef\x2e\xfa\x33\x05\xff\xcc\x29\xa6\x0a\x4a\xed\x26\x53\xa7\x9a\xe9\x39\xe7\x5b\xce\x88\x5e\x73\x8f\xc4\xd8\xa0\x33\x7c\x24\x6d\x60\xee\x94\x1b\xc1\xd5\x89\x3a\xf9\x1a\xdd\x75\x34\xf4\xd6\x1d\x23\x1b\x27\xfc\x45\xc5\xdc\x66\x63\xe3\xad\xa7\xee\xa0\xaa\x65\xf0\x58\xd0\xc0\x50\x39\xd7\xd2\x0e\xa0\xc6\xd0\x7e\xd1\x6a\xa1\xdb\x64\x1d\x04\x05\x76\x73\xbb\xb2\x24\xbb\x60\xec\x6e\x9d\x58\x7b\x02\xae\x79\xb2\x09\x1a\x9c\xbf\xcf\xcf\xb6\x3b\x20\xef\xdc\x19\x4b\xb4\xb5\x26\xae\xae\xe0\xd6\xde\x28\x0e\xe1\x1c\x23\x40\x09\x6c\xd9\xa5\x4f\xd4\x66\x3e\x01\xf9\x3a\xc7\x46\x0a\x57\xc0\x6a\x77\xc1\x5b\x99\xfe\xdd\x21\xa5\xc6\x5c\x3e\x60\x54\x03\xd2\xb6\xe9\xe3\x60\xd4\xbe\xbb\x0c\x1a\x2e\x26\x48\x04\x70\x82\x73\x24\x43\x89\xe8\x86\xf1\x44\xcd\x0b\xa4\x20\x6b\xef\x65\x2f\x4a\xfd\x33\x39\x9f\x23\x81\x08\x01\x82\x65\x15\x93\x43\xd3\x02\x08\x3a\x5e\x55\x3e\x1b\xf4\x1d\xc2\xa4\x16\x90\xa1\x5c\x75\x57\xbf\x01\x9f\x4b\x2b\x46\xb1\x62\xce\x0c\x11\xb7\x65\x85\x9e\xb3\x7e\xdb\x06\x24\xd4\xd9\x8c\x9b\xfa\xd8\xc9\x82\xe1\x09\x6d\xe3\x77\x59\x75\x9e\x31\xd1\xb9\xd6\x7b\x3c\xa6\xdf\x71\x22\xba\x00\xa9\x33\xc9\x30\xf8\x09\xe2\x07\x4b\x4b\x77\xca\xc8\x38\x23\x38\x3f\x2e\x25\x61\xce\x68\xab\xe4\x18\x87\xb8\xd1\x03\xb5\x3b\xe8\x56\xa8\xe2\x2a\x18\xac\x0d\xc2\x57\x4c\x0b\xf6\xf5\x82\x0d\x97\x73\x25\x4e\x50\x0e\x56\xbe\xbb\x55\xd1\x52\x09\x84\xa9\xba\xb8\x9c\xdf\x2a\xd6\x0d\xd5\x7c\xf0\xcf\x40\xd6\x1f\xe0\xc2\xf7\xe8\x9e\x4c\x9f\xf3\x3a\x38\x0d\xac\xa0\x62\xc2\xe9\x80\x0b\x3c\xf4\x08\x89\xd8\x83\x2d\x50\xd5\xa2\xc6\xc7\x1d\x54\xc6\xf8\xf2\xa7\x8d\xf0\x88\x78\x13\x4e\x48\x98\xa3\x6a\xa9\xe8\x88\x1e\xa8\xa7\xce\x1a\x9c\xcc\xcf\x2d\x12\xff\xec\x22\xc4\x75\x98\xf7\x0e\x42\xd6\x5b\xea\x19\x21\x4c\x4f\x19\xae\x5b\xfe\xf8\x63\xca\xc9\x7f\x28\xb9\x2d\xe9\xf5\x77\x61\x1e\xab\x3e\x0e\x3d\xf3\x7a\xd0\xd5\x26\xda\xc4\xde\x8b\xa8\xe5\xf8\x6f\xda\x77\x7b\x44\xe0\xea\xf3\x2f\xec\x04\x6f\x48\x2e\xdd\x8b\xa6\x40\x6e\xe9\xa0\xfe\x4f\x2d\xff\x11\x47\xfc\x79\xfe\xd5\x3d\x20\x0b\xbe\xdc\x6a\xa0\xae\x2e\xce\x11\xcf\x95\x5e\x81\xcd\x5e\xda\x14\xe3\xc1\xa2\x61\x92\xe9\x99\x7f\x4e\x93\xd1\xf7\x69\x1d\xc6\x66\xcc\x86\x0d\xe6\x78\xe3\x3b\xae\x90\x73\x83\xa4\x1e\xc4\x73\xbf\x62\x6d\xda\x29\x71\x5e\xf2\x05\x93\xcd\xfd\xbb\x99\x3e\x60\xee\xde\xfb\x07\x15\xd0\x05\x86\x74\x6e\x9b\x5a\x87\x87\x5e\xbb\xd3\x77\x9b\x9e\xf8\x37\xf0\x27\xaf\x38\xb5\x9c\xf4\x38\x99\x49\x7d\x1f\x0f\x5a\xdb\x17\x98\x9b\x91\x7e\x2c\x90\xf6\x15\x89\x91\xdd\x37\xe6\x79\xca\x67\x46\xe7\xdb\x4e\x7b\xcc\xdb\xbf\xb1\xf4\xdc\x6a\xac\xcc\xbf\xcd\x7b\xd8\xd5\x69\xf5\x6f\x00\x00\x00\xff\xff\xfc\xf3\x11\x6a\x88\x2f\x00\x00") - -func dataConfig_schema_v31JsonBytes() ([]byte, error) { - return bindataRead( - _dataConfig_schema_v31Json, - "data/config_schema_v3.1.json", - ) -} - -func dataConfig_schema_v31Json() (*asset, error) { - bytes, err := dataConfig_schema_v31JsonBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "data/config_schema_v3.1.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 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){ - "data/config_schema_v3.0.json": dataConfig_schema_v30Json, - "data/config_schema_v3.1.json": dataConfig_schema_v31Json, -} - -// 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{ - "data": &bintree{nil, map[string]*bintree{ - "config_schema_v3.0.json": &bintree{dataConfig_schema_v30Json, map[string]*bintree{}}, - "config_schema_v3.1.json": &bintree{dataConfig_schema_v31Json, 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/docker/docker/cli/compose/schema/data/config_schema_v3.0.json b/vendor/github.com/docker/docker/cli/compose/schema/data/config_schema_v3.0.json deleted file mode 100644 index fbcd8bb85..000000000 --- a/vendor/github.com/docker/docker/cli/compose/schema/data/config_schema_v3.0.json +++ /dev/null @@ -1,383 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "config_schema_v3.0.json", - "type": "object", - "required": ["version"], - - "properties": { - "version": { - "type": "string" - }, - - "services": { - "id": "#/properties/services", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/service" - } - }, - "additionalProperties": false - }, - - "networks": { - "id": "#/properties/networks", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/network" - } - } - }, - - "volumes": { - "id": "#/properties/volumes", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/volume" - } - }, - "additionalProperties": false - } - }, - - "additionalProperties": false, - - "definitions": { - - "service": { - "id": "#/definitions/service", - "type": "object", - - "properties": { - "deploy": {"$ref": "#/definitions/deployment"}, - "build": { - "oneOf": [ - {"type": "string"}, - { - "type": "object", - "properties": { - "context": {"type": "string"}, - "dockerfile": {"type": "string"}, - "args": {"$ref": "#/definitions/list_or_dict"} - }, - "additionalProperties": false - } - ] - }, - "cap_add": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "cap_drop": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "cgroup_parent": {"type": "string"}, - "command": { - "oneOf": [ - {"type": "string"}, - {"type": "array", "items": {"type": "string"}} - ] - }, - "container_name": {"type": "string"}, - "depends_on": {"$ref": "#/definitions/list_of_strings"}, - "devices": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "dns": {"$ref": "#/definitions/string_or_list"}, - "dns_search": {"$ref": "#/definitions/string_or_list"}, - "domainname": {"type": "string"}, - "entrypoint": { - "oneOf": [ - {"type": "string"}, - {"type": "array", "items": {"type": "string"}} - ] - }, - "env_file": {"$ref": "#/definitions/string_or_list"}, - "environment": {"$ref": "#/definitions/list_or_dict"}, - - "expose": { - "type": "array", - "items": { - "type": ["string", "number"], - "format": "expose" - }, - "uniqueItems": true - }, - - "external_links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "extra_hosts": {"$ref": "#/definitions/list_or_dict"}, - "healthcheck": {"$ref": "#/definitions/healthcheck"}, - "hostname": {"type": "string"}, - "image": {"type": "string"}, - "ipc": {"type": "string"}, - "labels": {"$ref": "#/definitions/list_or_dict"}, - "links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - - "logging": { - "type": "object", - - "properties": { - "driver": {"type": "string"}, - "options": { - "type": "object", - "patternProperties": { - "^.+$": {"type": ["string", "number", "null"]} - } - } - }, - "additionalProperties": false - }, - - "mac_address": {"type": "string"}, - "network_mode": {"type": "string"}, - - "networks": { - "oneOf": [ - {"$ref": "#/definitions/list_of_strings"}, - { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "oneOf": [ - { - "type": "object", - "properties": { - "aliases": {"$ref": "#/definitions/list_of_strings"}, - "ipv4_address": {"type": "string"}, - "ipv6_address": {"type": "string"} - }, - "additionalProperties": false - }, - {"type": "null"} - ] - } - }, - "additionalProperties": false - } - ] - }, - "pid": {"type": ["string", "null"]}, - - "ports": { - "type": "array", - "items": { - "type": ["string", "number"], - "format": "ports" - }, - "uniqueItems": true - }, - - "privileged": {"type": "boolean"}, - "read_only": {"type": "boolean"}, - "restart": {"type": "string"}, - "security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "shm_size": {"type": ["number", "string"]}, - "sysctls": {"$ref": "#/definitions/list_or_dict"}, - "stdin_open": {"type": "boolean"}, - "stop_grace_period": {"type": "string", "format": "duration"}, - "stop_signal": {"type": "string"}, - "tmpfs": {"$ref": "#/definitions/string_or_list"}, - "tty": {"type": "boolean"}, - "ulimits": { - "type": "object", - "patternProperties": { - "^[a-z]+$": { - "oneOf": [ - {"type": "integer"}, - { - "type":"object", - "properties": { - "hard": {"type": "integer"}, - "soft": {"type": "integer"} - }, - "required": ["soft", "hard"], - "additionalProperties": false - } - ] - } - } - }, - "user": {"type": "string"}, - "userns_mode": {"type": "string"}, - "volumes": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "working_dir": {"type": "string"} - }, - "additionalProperties": false - }, - - "healthcheck": { - "id": "#/definitions/healthcheck", - "type": "object", - "additionalProperties": false, - "properties": { - "disable": {"type": "boolean"}, - "interval": {"type": "string"}, - "retries": {"type": "number"}, - "test": { - "oneOf": [ - {"type": "string"}, - {"type": "array", "items": {"type": "string"}} - ] - }, - "timeout": {"type": "string"} - } - }, - "deployment": { - "id": "#/definitions/deployment", - "type": ["object", "null"], - "properties": { - "mode": {"type": "string"}, - "replicas": {"type": "integer"}, - "labels": {"$ref": "#/definitions/list_or_dict"}, - "update_config": { - "type": "object", - "properties": { - "parallelism": {"type": "integer"}, - "delay": {"type": "string", "format": "duration"}, - "failure_action": {"type": "string"}, - "monitor": {"type": "string", "format": "duration"}, - "max_failure_ratio": {"type": "number"} - }, - "additionalProperties": false - }, - "resources": { - "type": "object", - "properties": { - "limits": {"$ref": "#/definitions/resource"}, - "reservations": {"$ref": "#/definitions/resource"} - } - }, - "restart_policy": { - "type": "object", - "properties": { - "condition": {"type": "string"}, - "delay": {"type": "string", "format": "duration"}, - "max_attempts": {"type": "integer"}, - "window": {"type": "string", "format": "duration"} - }, - "additionalProperties": false - }, - "placement": { - "type": "object", - "properties": { - "constraints": {"type": "array", "items": {"type": "string"}} - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - - "resource": { - "id": "#/definitions/resource", - "type": "object", - "properties": { - "cpus": {"type": "string"}, - "memory": {"type": "string"} - }, - "additionalProperties": false - }, - - "network": { - "id": "#/definitions/network", - "type": ["object", "null"], - "properties": { - "driver": {"type": "string"}, - "driver_opts": { - "type": "object", - "patternProperties": { - "^.+$": {"type": ["string", "number"]} - } - }, - "ipam": { - "type": "object", - "properties": { - "driver": {"type": "string"}, - "config": { - "type": "array", - "items": { - "type": "object", - "properties": { - "subnet": {"type": "string"} - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "external": { - "type": ["boolean", "object"], - "properties": { - "name": {"type": "string"} - }, - "additionalProperties": false - }, - "internal": {"type": "boolean"}, - "labels": {"$ref": "#/definitions/list_or_dict"} - }, - "additionalProperties": false - }, - - "volume": { - "id": "#/definitions/volume", - "type": ["object", "null"], - "properties": { - "driver": {"type": "string"}, - "driver_opts": { - "type": "object", - "patternProperties": { - "^.+$": {"type": ["string", "number"]} - } - }, - "external": { - "type": ["boolean", "object"], - "properties": { - "name": {"type": "string"} - }, - "additionalProperties": false - }, - "labels": {"$ref": "#/definitions/list_or_dict"} - }, - "additionalProperties": false - }, - - "string_or_list": { - "oneOf": [ - {"type": "string"}, - {"$ref": "#/definitions/list_of_strings"} - ] - }, - - "list_of_strings": { - "type": "array", - "items": {"type": "string"}, - "uniqueItems": true - }, - - "list_or_dict": { - "oneOf": [ - { - "type": "object", - "patternProperties": { - ".+": { - "type": ["string", "number", "null"] - } - }, - "additionalProperties": false - }, - {"type": "array", "items": {"type": "string"}, "uniqueItems": true} - ] - }, - - "constraints": { - "service": { - "id": "#/definitions/constraints/service", - "anyOf": [ - {"required": ["build"]}, - {"required": ["image"]} - ], - "properties": { - "build": { - "required": ["context"] - } - } - } - } - } -} diff --git a/vendor/github.com/docker/docker/cli/compose/schema/data/config_schema_v3.1.json b/vendor/github.com/docker/docker/cli/compose/schema/data/config_schema_v3.1.json deleted file mode 100644 index b7037485f..000000000 --- a/vendor/github.com/docker/docker/cli/compose/schema/data/config_schema_v3.1.json +++ /dev/null @@ -1,428 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "id": "config_schema_v3.1.json", - "type": "object", - "required": ["version"], - - "properties": { - "version": { - "type": "string" - }, - - "services": { - "id": "#/properties/services", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/service" - } - }, - "additionalProperties": false - }, - - "networks": { - "id": "#/properties/networks", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/network" - } - } - }, - - "volumes": { - "id": "#/properties/volumes", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/volume" - } - }, - "additionalProperties": false - }, - - "secrets": { - "id": "#/properties/secrets", - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "$ref": "#/definitions/secret" - } - }, - "additionalProperties": false - } - }, - - "additionalProperties": false, - - "definitions": { - - "service": { - "id": "#/definitions/service", - "type": "object", - - "properties": { - "deploy": {"$ref": "#/definitions/deployment"}, - "build": { - "oneOf": [ - {"type": "string"}, - { - "type": "object", - "properties": { - "context": {"type": "string"}, - "dockerfile": {"type": "string"}, - "args": {"$ref": "#/definitions/list_or_dict"} - }, - "additionalProperties": false - } - ] - }, - "cap_add": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "cap_drop": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "cgroup_parent": {"type": "string"}, - "command": { - "oneOf": [ - {"type": "string"}, - {"type": "array", "items": {"type": "string"}} - ] - }, - "container_name": {"type": "string"}, - "depends_on": {"$ref": "#/definitions/list_of_strings"}, - "devices": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "dns": {"$ref": "#/definitions/string_or_list"}, - "dns_search": {"$ref": "#/definitions/string_or_list"}, - "domainname": {"type": "string"}, - "entrypoint": { - "oneOf": [ - {"type": "string"}, - {"type": "array", "items": {"type": "string"}} - ] - }, - "env_file": {"$ref": "#/definitions/string_or_list"}, - "environment": {"$ref": "#/definitions/list_or_dict"}, - - "expose": { - "type": "array", - "items": { - "type": ["string", "number"], - "format": "expose" - }, - "uniqueItems": true - }, - - "external_links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "extra_hosts": {"$ref": "#/definitions/list_or_dict"}, - "healthcheck": {"$ref": "#/definitions/healthcheck"}, - "hostname": {"type": "string"}, - "image": {"type": "string"}, - "ipc": {"type": "string"}, - "labels": {"$ref": "#/definitions/list_or_dict"}, - "links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - - "logging": { - "type": "object", - - "properties": { - "driver": {"type": "string"}, - "options": { - "type": "object", - "patternProperties": { - "^.+$": {"type": ["string", "number", "null"]} - } - } - }, - "additionalProperties": false - }, - - "mac_address": {"type": "string"}, - "network_mode": {"type": "string"}, - - "networks": { - "oneOf": [ - {"$ref": "#/definitions/list_of_strings"}, - { - "type": "object", - "patternProperties": { - "^[a-zA-Z0-9._-]+$": { - "oneOf": [ - { - "type": "object", - "properties": { - "aliases": {"$ref": "#/definitions/list_of_strings"}, - "ipv4_address": {"type": "string"}, - "ipv6_address": {"type": "string"} - }, - "additionalProperties": false - }, - {"type": "null"} - ] - } - }, - "additionalProperties": false - } - ] - }, - "pid": {"type": ["string", "null"]}, - - "ports": { - "type": "array", - "items": { - "type": ["string", "number"], - "format": "ports" - }, - "uniqueItems": true - }, - - "privileged": {"type": "boolean"}, - "read_only": {"type": "boolean"}, - "restart": {"type": "string"}, - "security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "shm_size": {"type": ["number", "string"]}, - "secrets": { - "type": "array", - "items": { - "oneOf": [ - {"type": "string"}, - { - "type": "object", - "properties": { - "source": {"type": "string"}, - "target": {"type": "string"}, - "uid": {"type": "string"}, - "gid": {"type": "string"}, - "mode": {"type": "number"} - } - } - ] - } - }, - "sysctls": {"$ref": "#/definitions/list_or_dict"}, - "stdin_open": {"type": "boolean"}, - "stop_grace_period": {"type": "string", "format": "duration"}, - "stop_signal": {"type": "string"}, - "tmpfs": {"$ref": "#/definitions/string_or_list"}, - "tty": {"type": "boolean"}, - "ulimits": { - "type": "object", - "patternProperties": { - "^[a-z]+$": { - "oneOf": [ - {"type": "integer"}, - { - "type":"object", - "properties": { - "hard": {"type": "integer"}, - "soft": {"type": "integer"} - }, - "required": ["soft", "hard"], - "additionalProperties": false - } - ] - } - } - }, - "user": {"type": "string"}, - "userns_mode": {"type": "string"}, - "volumes": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, - "working_dir": {"type": "string"} - }, - "additionalProperties": false - }, - - "healthcheck": { - "id": "#/definitions/healthcheck", - "type": "object", - "additionalProperties": false, - "properties": { - "disable": {"type": "boolean"}, - "interval": {"type": "string"}, - "retries": {"type": "number"}, - "test": { - "oneOf": [ - {"type": "string"}, - {"type": "array", "items": {"type": "string"}} - ] - }, - "timeout": {"type": "string"} - } - }, - "deployment": { - "id": "#/definitions/deployment", - "type": ["object", "null"], - "properties": { - "mode": {"type": "string"}, - "replicas": {"type": "integer"}, - "labels": {"$ref": "#/definitions/list_or_dict"}, - "update_config": { - "type": "object", - "properties": { - "parallelism": {"type": "integer"}, - "delay": {"type": "string", "format": "duration"}, - "failure_action": {"type": "string"}, - "monitor": {"type": "string", "format": "duration"}, - "max_failure_ratio": {"type": "number"} - }, - "additionalProperties": false - }, - "resources": { - "type": "object", - "properties": { - "limits": {"$ref": "#/definitions/resource"}, - "reservations": {"$ref": "#/definitions/resource"} - } - }, - "restart_policy": { - "type": "object", - "properties": { - "condition": {"type": "string"}, - "delay": {"type": "string", "format": "duration"}, - "max_attempts": {"type": "integer"}, - "window": {"type": "string", "format": "duration"} - }, - "additionalProperties": false - }, - "placement": { - "type": "object", - "properties": { - "constraints": {"type": "array", "items": {"type": "string"}} - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - - "resource": { - "id": "#/definitions/resource", - "type": "object", - "properties": { - "cpus": {"type": "string"}, - "memory": {"type": "string"} - }, - "additionalProperties": false - }, - - "network": { - "id": "#/definitions/network", - "type": ["object", "null"], - "properties": { - "driver": {"type": "string"}, - "driver_opts": { - "type": "object", - "patternProperties": { - "^.+$": {"type": ["string", "number"]} - } - }, - "ipam": { - "type": "object", - "properties": { - "driver": {"type": "string"}, - "config": { - "type": "array", - "items": { - "type": "object", - "properties": { - "subnet": {"type": "string"} - }, - "additionalProperties": false - } - } - }, - "additionalProperties": false - }, - "external": { - "type": ["boolean", "object"], - "properties": { - "name": {"type": "string"} - }, - "additionalProperties": false - }, - "internal": {"type": "boolean"}, - "labels": {"$ref": "#/definitions/list_or_dict"} - }, - "additionalProperties": false - }, - - "volume": { - "id": "#/definitions/volume", - "type": ["object", "null"], - "properties": { - "driver": {"type": "string"}, - "driver_opts": { - "type": "object", - "patternProperties": { - "^.+$": {"type": ["string", "number"]} - } - }, - "external": { - "type": ["boolean", "object"], - "properties": { - "name": {"type": "string"} - }, - "additionalProperties": false - }, - "labels": {"$ref": "#/definitions/list_or_dict"} - }, - "additionalProperties": false - }, - - "secret": { - "id": "#/definitions/secret", - "type": "object", - "properties": { - "file": {"type": "string"}, - "external": { - "type": ["boolean", "object"], - "properties": { - "name": {"type": "string"} - } - }, - "labels": {"$ref": "#/definitions/list_or_dict"} - }, - "additionalProperties": false - }, - - "string_or_list": { - "oneOf": [ - {"type": "string"}, - {"$ref": "#/definitions/list_of_strings"} - ] - }, - - "list_of_strings": { - "type": "array", - "items": {"type": "string"}, - "uniqueItems": true - }, - - "list_or_dict": { - "oneOf": [ - { - "type": "object", - "patternProperties": { - ".+": { - "type": ["string", "number", "null"] - } - }, - "additionalProperties": false - }, - {"type": "array", "items": {"type": "string"}, "uniqueItems": true} - ] - }, - - "constraints": { - "service": { - "id": "#/definitions/constraints/service", - "anyOf": [ - {"required": ["build"]}, - {"required": ["image"]} - ], - "properties": { - "build": { - "required": ["context"] - } - } - } - } - } -} diff --git a/vendor/github.com/docker/docker/cli/compose/schema/schema.go b/vendor/github.com/docker/docker/cli/compose/schema/schema.go deleted file mode 100644 index ae33c77fb..000000000 --- a/vendor/github.com/docker/docker/cli/compose/schema/schema.go +++ /dev/null @@ -1,137 +0,0 @@ -package schema - -//go:generate go-bindata -pkg schema -nometadata data - -import ( - "fmt" - "strings" - "time" - - "github.com/pkg/errors" - "github.com/xeipuuv/gojsonschema" -) - -const ( - defaultVersion = "1.0" - versionField = "version" -) - -type portsFormatChecker struct{} - -func (checker portsFormatChecker) IsFormat(input string) bool { - // TODO: implement this - return true -} - -type durationFormatChecker struct{} - -func (checker durationFormatChecker) IsFormat(input string) bool { - _, err := time.ParseDuration(input) - return err == nil -} - -func init() { - gojsonschema.FormatCheckers.Add("expose", portsFormatChecker{}) - gojsonschema.FormatCheckers.Add("ports", portsFormatChecker{}) - gojsonschema.FormatCheckers.Add("duration", durationFormatChecker{}) -} - -// Version returns the version of the config, defaulting to version 1.0 -func Version(config map[string]interface{}) string { - version, ok := config[versionField] - if !ok { - return defaultVersion - } - return normalizeVersion(fmt.Sprintf("%v", version)) -} - -func normalizeVersion(version string) string { - switch version { - case "3": - return "3.0" - default: - return version - } -} - -// Validate uses the jsonschema to validate the configuration -func Validate(config map[string]interface{}, version string) error { - schemaData, err := Asset(fmt.Sprintf("data/config_schema_v%s.json", version)) - if err != nil { - return errors.Errorf("unsupported Compose file version: %s", version) - } - - schemaLoader := gojsonschema.NewStringLoader(string(schemaData)) - dataLoader := gojsonschema.NewGoLoader(config) - - result, err := gojsonschema.Validate(schemaLoader, dataLoader) - if err != nil { - return err - } - - if !result.Valid() { - return toError(result) - } - - return nil -} - -func toError(result *gojsonschema.Result) error { - err := getMostSpecificError(result.Errors()) - description := getDescription(err) - return fmt.Errorf("%s %s", err.Field(), description) -} - -func getDescription(err gojsonschema.ResultError) string { - if err.Type() == "invalid_type" { - if expectedType, ok := err.Details()["expected"].(string); ok { - return fmt.Sprintf("must be a %s", humanReadableType(expectedType)) - } - } - - return err.Description() -} - -func humanReadableType(definition string) string { - if definition[0:1] == "[" { - allTypes := strings.Split(definition[1:len(definition)-1], ",") - for i, t := range allTypes { - allTypes[i] = humanReadableType(t) - } - return fmt.Sprintf( - "%s or %s", - strings.Join(allTypes[0:len(allTypes)-1], ", "), - allTypes[len(allTypes)-1], - ) - } - if definition == "object" { - return "mapping" - } - if definition == "array" { - return "list" - } - return definition -} - -func getMostSpecificError(errors []gojsonschema.ResultError) gojsonschema.ResultError { - var mostSpecificError gojsonschema.ResultError - - for _, err := range errors { - if mostSpecificError == nil { - mostSpecificError = err - } else if specificity(err) > specificity(mostSpecificError) { - mostSpecificError = err - } else if specificity(err) == specificity(mostSpecificError) { - // Invalid type errors win in a tie-breaker for most specific field name - if err.Type() == "invalid_type" && mostSpecificError.Type() != "invalid_type" { - mostSpecificError = err - } - } - } - - return mostSpecificError -} - -func specificity(err gojsonschema.ResultError) int { - return len(strings.Split(err.Field(), ".")) -} diff --git a/vendor/github.com/docker/docker/cli/compose/schema/schema_test.go b/vendor/github.com/docker/docker/cli/compose/schema/schema_test.go deleted file mode 100644 index 0935d4022..000000000 --- a/vendor/github.com/docker/docker/cli/compose/schema/schema_test.go +++ /dev/null @@ -1,52 +0,0 @@ -package schema - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -type dict map[string]interface{} - -func TestValidate(t *testing.T) { - config := dict{ - "version": "3.0", - "services": dict{ - "foo": dict{ - "image": "busybox", - }, - }, - } - - assert.NoError(t, Validate(config, "3.0")) -} - -func TestValidateUndefinedTopLevelOption(t *testing.T) { - config := dict{ - "version": "3.0", - "helicopters": dict{ - "foo": dict{ - "image": "busybox", - }, - }, - } - - err := Validate(config, "3.0") - assert.Error(t, err) - assert.Contains(t, err.Error(), "Additional property helicopters is not allowed") -} - -func TestValidateInvalidVersion(t *testing.T) { - config := dict{ - "version": "2.1", - "services": dict{ - "foo": dict{ - "image": "busybox", - }, - }, - } - - err := Validate(config, "2.1") - assert.Error(t, err) - assert.Contains(t, err.Error(), "unsupported Compose file version: 2.1") -} diff --git a/vendor/github.com/docker/docker/cli/compose/template/template.go b/vendor/github.com/docker/docker/cli/compose/template/template.go deleted file mode 100644 index 28495baf5..000000000 --- a/vendor/github.com/docker/docker/cli/compose/template/template.go +++ /dev/null @@ -1,100 +0,0 @@ -package template - -import ( - "fmt" - "regexp" - "strings" -) - -var delimiter = "\\$" -var substitution = "[_a-z][_a-z0-9]*(?::?-[^}]+)?" - -var patternString = fmt.Sprintf( - "%s(?i:(?P%s)|(?P%s)|{(?P%s)}|(?P))", - delimiter, delimiter, substitution, substitution, -) - -var pattern = regexp.MustCompile(patternString) - -// InvalidTemplateError is returned when a variable template is not in a valid -// format -type InvalidTemplateError struct { - Template string -} - -func (e InvalidTemplateError) Error() string { - return fmt.Sprintf("Invalid template: %#v", e.Template) -} - -// Mapping is a user-supplied function which maps from variable names to values. -// Returns the value as a string and a bool indicating whether -// the value is present, to distinguish between an empty string -// and the absence of a value. -type Mapping func(string) (string, bool) - -// Substitute variables in the string with their values -func Substitute(template string, mapping Mapping) (result string, err *InvalidTemplateError) { - result = pattern.ReplaceAllStringFunc(template, func(substring string) string { - matches := pattern.FindStringSubmatch(substring) - groups := make(map[string]string) - for i, name := range pattern.SubexpNames() { - if i != 0 { - groups[name] = matches[i] - } - } - - substitution := groups["named"] - if substitution == "" { - substitution = groups["braced"] - } - if substitution != "" { - // Soft default (fall back if unset or empty) - if strings.Contains(substitution, ":-") { - name, defaultValue := partition(substitution, ":-") - value, ok := mapping(name) - if !ok || value == "" { - return defaultValue - } - return value - } - - // Hard default (fall back if-and-only-if empty) - if strings.Contains(substitution, "-") { - name, defaultValue := partition(substitution, "-") - value, ok := mapping(name) - if !ok { - return defaultValue - } - return value - } - - // No default (fall back to empty string) - value, ok := mapping(substitution) - if !ok { - return "" - } - return value - } - - if escaped := groups["escaped"]; escaped != "" { - return escaped - } - - err = &InvalidTemplateError{Template: template} - return "" - }) - - return result, err -} - -// Split the string at the first occurrence of sep, and return the part before the separator, -// and the part after the separator. -// -// If the separator is not found, return the string itself, followed by an empty string. -func partition(s, sep string) (string, string) { - if strings.Contains(s, sep) { - parts := strings.SplitN(s, sep, 2) - return parts[0], parts[1] - } - return s, "" -} diff --git a/vendor/github.com/docker/docker/cli/compose/template/template_test.go b/vendor/github.com/docker/docker/cli/compose/template/template_test.go deleted file mode 100644 index 6b81bf0a3..000000000 --- a/vendor/github.com/docker/docker/cli/compose/template/template_test.go +++ /dev/null @@ -1,83 +0,0 @@ -package template - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -var defaults = map[string]string{ - "FOO": "first", - "BAR": "", -} - -func defaultMapping(name string) (string, bool) { - val, ok := defaults[name] - return val, ok -} - -func TestEscaped(t *testing.T) { - result, err := Substitute("$${foo}", defaultMapping) - assert.NoError(t, err) - assert.Equal(t, "${foo}", result) -} - -func TestInvalid(t *testing.T) { - invalidTemplates := []string{ - "${", - "$}", - "${}", - "${ }", - "${ foo}", - "${foo }", - "${foo!}", - } - - for _, template := range invalidTemplates { - _, err := Substitute(template, defaultMapping) - assert.Error(t, err) - assert.IsType(t, &InvalidTemplateError{}, err) - } -} - -func TestNoValueNoDefault(t *testing.T) { - for _, template := range []string{"This ${missing} var", "This ${BAR} var"} { - result, err := Substitute(template, defaultMapping) - assert.NoError(t, err) - assert.Equal(t, "This var", result) - } -} - -func TestValueNoDefault(t *testing.T) { - for _, template := range []string{"This $FOO var", "This ${FOO} var"} { - result, err := Substitute(template, defaultMapping) - assert.NoError(t, err) - assert.Equal(t, "This first var", result) - } -} - -func TestNoValueWithDefault(t *testing.T) { - for _, template := range []string{"ok ${missing:-def}", "ok ${missing-def}"} { - result, err := Substitute(template, defaultMapping) - assert.NoError(t, err) - assert.Equal(t, "ok def", result) - } -} - -func TestEmptyValueWithSoftDefault(t *testing.T) { - result, err := Substitute("ok ${BAR:-def}", defaultMapping) - assert.NoError(t, err) - assert.Equal(t, "ok def", result) -} - -func TestEmptyValueWithHardDefault(t *testing.T) { - result, err := Substitute("ok ${BAR-def}", defaultMapping) - assert.NoError(t, err) - assert.Equal(t, "ok ", result) -} - -func TestNonAlphanumericDefault(t *testing.T) { - result, err := Substitute("ok ${BAR:-/non:-alphanumeric}", defaultMapping) - assert.NoError(t, err) - assert.Equal(t, "ok /non:-alphanumeric", result) -} diff --git a/vendor/github.com/docker/docker/cli/compose/types/types.go b/vendor/github.com/docker/docker/cli/compose/types/types.go deleted file mode 100644 index cae7b4af2..000000000 --- a/vendor/github.com/docker/docker/cli/compose/types/types.go +++ /dev/null @@ -1,253 +0,0 @@ -package types - -import ( - "time" -) - -// UnsupportedProperties not yet supported by this implementation of the compose file -var UnsupportedProperties = []string{ - "build", - "cap_add", - "cap_drop", - "cgroup_parent", - "devices", - "dns", - "dns_search", - "domainname", - "external_links", - "ipc", - "links", - "mac_address", - "network_mode", - "privileged", - "read_only", - "restart", - "security_opt", - "shm_size", - "stop_signal", - "sysctls", - "tmpfs", - "userns_mode", -} - -// DeprecatedProperties that were removed from the v3 format, but their -// use should not impact the behaviour of the application. -var DeprecatedProperties = map[string]string{ - "container_name": "Setting the container name is not supported.", - "expose": "Exposing ports is unnecessary - services on the same network can access each other's containers on any port.", -} - -// ForbiddenProperties that are not supported in this implementation of the -// compose file. -var ForbiddenProperties = map[string]string{ - "extends": "Support for `extends` is not implemented yet. Use `docker-compose config` to generate a configuration with all `extends` options resolved, and deploy from that.", - "volume_driver": "Instead of setting the volume driver on the service, define a volume using the top-level `volumes` option and specify the driver there.", - "volumes_from": "To share a volume between services, define it using the top-level `volumes` option and reference it from each service that shares it using the service-level `volumes` option.", - "cpu_quota": "Set resource limits using deploy.resources", - "cpu_shares": "Set resource limits using deploy.resources", - "cpuset": "Set resource limits using deploy.resources", - "mem_limit": "Set resource limits using deploy.resources", - "memswap_limit": "Set resource limits using deploy.resources", -} - -// Dict is a mapping of strings to interface{} -type Dict map[string]interface{} - -// ConfigFile is a filename and the contents of the file as a Dict -type ConfigFile struct { - Filename string - Config Dict -} - -// ConfigDetails are the details about a group of ConfigFiles -type ConfigDetails struct { - WorkingDir string - ConfigFiles []ConfigFile - Environment map[string]string -} - -// Config is a full compose file configuration -type Config struct { - Services []ServiceConfig - Networks map[string]NetworkConfig - Volumes map[string]VolumeConfig - Secrets map[string]SecretConfig -} - -// ServiceConfig is the configuration of one service -type ServiceConfig struct { - Name string - - CapAdd []string `mapstructure:"cap_add"` - CapDrop []string `mapstructure:"cap_drop"` - CgroupParent string `mapstructure:"cgroup_parent"` - Command []string `compose:"shell_command"` - ContainerName string `mapstructure:"container_name"` - DependsOn []string `mapstructure:"depends_on"` - Deploy DeployConfig - Devices []string - DNS []string `compose:"string_or_list"` - DNSSearch []string `mapstructure:"dns_search" compose:"string_or_list"` - DomainName string `mapstructure:"domainname"` - Entrypoint []string `compose:"shell_command"` - Environment map[string]string `compose:"list_or_dict_equals"` - Expose []string `compose:"list_of_strings_or_numbers"` - ExternalLinks []string `mapstructure:"external_links"` - ExtraHosts map[string]string `mapstructure:"extra_hosts" compose:"list_or_dict_colon"` - Hostname string - HealthCheck *HealthCheckConfig - Image string - Ipc string - Labels map[string]string `compose:"list_or_dict_equals"` - Links []string - Logging *LoggingConfig - MacAddress string `mapstructure:"mac_address"` - NetworkMode string `mapstructure:"network_mode"` - Networks map[string]*ServiceNetworkConfig `compose:"list_or_struct_map"` - Pid string - Ports []string `compose:"list_of_strings_or_numbers"` - Privileged bool - ReadOnly bool `mapstructure:"read_only"` - Restart string - Secrets []ServiceSecretConfig - SecurityOpt []string `mapstructure:"security_opt"` - StdinOpen bool `mapstructure:"stdin_open"` - StopGracePeriod *time.Duration `mapstructure:"stop_grace_period"` - StopSignal string `mapstructure:"stop_signal"` - Tmpfs []string `compose:"string_or_list"` - Tty bool `mapstructure:"tty"` - Ulimits map[string]*UlimitsConfig - User string - Volumes []string - WorkingDir string `mapstructure:"working_dir"` -} - -// LoggingConfig the logging configuration for a service -type LoggingConfig struct { - Driver string - Options map[string]string -} - -// DeployConfig the deployment configuration for a service -type DeployConfig struct { - Mode string - Replicas *uint64 - Labels map[string]string `compose:"list_or_dict_equals"` - UpdateConfig *UpdateConfig `mapstructure:"update_config"` - Resources Resources - RestartPolicy *RestartPolicy `mapstructure:"restart_policy"` - Placement Placement -} - -// HealthCheckConfig the healthcheck configuration for a service -type HealthCheckConfig struct { - Test []string `compose:"healthcheck"` - Timeout string - Interval string - Retries *uint64 - Disable bool -} - -// UpdateConfig the service update configuration -type UpdateConfig struct { - Parallelism *uint64 - Delay time.Duration - FailureAction string `mapstructure:"failure_action"` - Monitor time.Duration - MaxFailureRatio float32 `mapstructure:"max_failure_ratio"` -} - -// Resources the resource limits and reservations -type Resources struct { - Limits *Resource - Reservations *Resource -} - -// Resource is a resource to be limited or reserved -type Resource struct { - // TODO: types to convert from units and ratios - NanoCPUs string `mapstructure:"cpus"` - MemoryBytes UnitBytes `mapstructure:"memory"` -} - -// UnitBytes is the bytes type -type UnitBytes int64 - -// RestartPolicy the service restart policy -type RestartPolicy struct { - Condition string - Delay *time.Duration - MaxAttempts *uint64 `mapstructure:"max_attempts"` - Window *time.Duration -} - -// Placement constraints for the service -type Placement struct { - Constraints []string -} - -// ServiceNetworkConfig is the network configuration for a service -type ServiceNetworkConfig struct { - Aliases []string - Ipv4Address string `mapstructure:"ipv4_address"` - Ipv6Address string `mapstructure:"ipv6_address"` -} - -// ServiceSecretConfig is the secret configuration for a service -type ServiceSecretConfig struct { - Source string - Target string - UID string - GID string - Mode uint32 -} - -// UlimitsConfig the ulimit configuration -type UlimitsConfig struct { - Single int - Soft int - Hard int -} - -// NetworkConfig for a network -type NetworkConfig struct { - Driver string - DriverOpts map[string]string `mapstructure:"driver_opts"` - Ipam IPAMConfig - External External - Internal bool - Labels map[string]string `compose:"list_or_dict_equals"` -} - -// IPAMConfig for a network -type IPAMConfig struct { - Driver string - Config []*IPAMPool -} - -// IPAMPool for a network -type IPAMPool struct { - Subnet string -} - -// VolumeConfig for a volume -type VolumeConfig struct { - Driver string - DriverOpts map[string]string `mapstructure:"driver_opts"` - External External - Labels map[string]string `compose:"list_or_dict_equals"` -} - -// External identifies a Volume or Network as a reference to a resource that is -// not managed, and should already exist. -type External struct { - Name string - External bool -} - -// SecretConfig for a secret -type SecretConfig struct { - File string - External External - Labels map[string]string `compose:"list_or_dict_equals"` -} diff --git a/vendor/github.com/docker/docker/cli/flags/client.go b/vendor/github.com/docker/docker/cli/flags/client.go deleted file mode 100644 index 9b6940f6b..000000000 --- a/vendor/github.com/docker/docker/cli/flags/client.go +++ /dev/null @@ -1,13 +0,0 @@ -package flags - -// ClientOptions are the options used to configure the client cli -type ClientOptions struct { - Common *CommonOptions - ConfigDir string - Version bool -} - -// NewClientOptions returns a new ClientOptions -func NewClientOptions() *ClientOptions { - return &ClientOptions{Common: NewCommonOptions()} -} diff --git a/vendor/github.com/docker/docker/cli/flags/common.go b/vendor/github.com/docker/docker/cli/flags/common.go deleted file mode 100644 index e2f9da073..000000000 --- a/vendor/github.com/docker/docker/cli/flags/common.go +++ /dev/null @@ -1,120 +0,0 @@ -package flags - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/cliconfig" - "github.com/docker/docker/opts" - "github.com/docker/go-connections/tlsconfig" - "github.com/spf13/pflag" -) - -const ( - // DefaultTrustKeyFile is the default filename for the trust key - DefaultTrustKeyFile = "key.json" - // DefaultCaFile is the default filename for the CA pem file - DefaultCaFile = "ca.pem" - // DefaultKeyFile is the default filename for the key pem file - DefaultKeyFile = "key.pem" - // DefaultCertFile is the default filename for the cert pem file - DefaultCertFile = "cert.pem" - // FlagTLSVerify is the flag name for the tls verification option - FlagTLSVerify = "tlsverify" -) - -var ( - dockerCertPath = os.Getenv("DOCKER_CERT_PATH") - dockerTLSVerify = os.Getenv("DOCKER_TLS_VERIFY") != "" -) - -// CommonOptions are options common to both the client and the daemon. -type CommonOptions struct { - Debug bool - Hosts []string - LogLevel string - TLS bool - TLSVerify bool - TLSOptions *tlsconfig.Options - TrustKey string -} - -// NewCommonOptions returns a new CommonOptions -func NewCommonOptions() *CommonOptions { - return &CommonOptions{} -} - -// InstallFlags adds flags for the common options on the FlagSet -func (commonOpts *CommonOptions) InstallFlags(flags *pflag.FlagSet) { - if dockerCertPath == "" { - dockerCertPath = cliconfig.ConfigDir() - } - - flags.BoolVarP(&commonOpts.Debug, "debug", "D", false, "Enable debug mode") - flags.StringVarP(&commonOpts.LogLevel, "log-level", "l", "info", "Set the logging level (\"debug\", \"info\", \"warn\", \"error\", \"fatal\")") - flags.BoolVar(&commonOpts.TLS, "tls", false, "Use TLS; implied by --tlsverify") - flags.BoolVar(&commonOpts.TLSVerify, FlagTLSVerify, dockerTLSVerify, "Use TLS and verify the remote") - - // TODO use flag flags.String("identity"}, "i", "", "Path to libtrust key file") - - commonOpts.TLSOptions = &tlsconfig.Options{ - CAFile: filepath.Join(dockerCertPath, DefaultCaFile), - CertFile: filepath.Join(dockerCertPath, DefaultCertFile), - KeyFile: filepath.Join(dockerCertPath, DefaultKeyFile), - } - tlsOptions := commonOpts.TLSOptions - flags.Var(opts.NewQuotedString(&tlsOptions.CAFile), "tlscacert", "Trust certs signed only by this CA") - flags.Var(opts.NewQuotedString(&tlsOptions.CertFile), "tlscert", "Path to TLS certificate file") - flags.Var(opts.NewQuotedString(&tlsOptions.KeyFile), "tlskey", "Path to TLS key file") - - hostOpt := opts.NewNamedListOptsRef("hosts", &commonOpts.Hosts, opts.ValidateHost) - flags.VarP(hostOpt, "host", "H", "Daemon socket(s) to connect to") -} - -// SetDefaultOptions sets default values for options after flag parsing is -// complete -func (commonOpts *CommonOptions) SetDefaultOptions(flags *pflag.FlagSet) { - // Regardless of whether the user sets it to true or false, if they - // specify --tlsverify at all then we need to turn on tls - // TLSVerify can be true even if not set due to DOCKER_TLS_VERIFY env var, so we need - // to check that here as well - if flags.Changed(FlagTLSVerify) || commonOpts.TLSVerify { - commonOpts.TLS = true - } - - if !commonOpts.TLS { - commonOpts.TLSOptions = nil - } else { - tlsOptions := commonOpts.TLSOptions - tlsOptions.InsecureSkipVerify = !commonOpts.TLSVerify - - // Reset CertFile and KeyFile to empty string if the user did not specify - // the respective flags and the respective default files were not found. - if !flags.Changed("tlscert") { - if _, err := os.Stat(tlsOptions.CertFile); os.IsNotExist(err) { - tlsOptions.CertFile = "" - } - } - if !flags.Changed("tlskey") { - if _, err := os.Stat(tlsOptions.KeyFile); os.IsNotExist(err) { - tlsOptions.KeyFile = "" - } - } - } -} - -// SetLogLevel sets the logrus logging level -func SetLogLevel(logLevel string) { - if logLevel != "" { - lvl, err := logrus.ParseLevel(logLevel) - if err != nil { - fmt.Fprintf(os.Stderr, "Unable to parse logging level: %s\n", logLevel) - os.Exit(1) - } - logrus.SetLevel(lvl) - } else { - logrus.SetLevel(logrus.InfoLevel) - } -} diff --git a/vendor/github.com/docker/docker/cli/flags/common_test.go b/vendor/github.com/docker/docker/cli/flags/common_test.go deleted file mode 100644 index 81eaa38f4..000000000 --- a/vendor/github.com/docker/docker/cli/flags/common_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package flags - -import ( - "path/filepath" - "testing" - - "github.com/docker/docker/cliconfig" - "github.com/docker/docker/pkg/testutil/assert" - "github.com/spf13/pflag" -) - -func TestCommonOptionsInstallFlags(t *testing.T) { - flags := pflag.NewFlagSet("testing", pflag.ContinueOnError) - opts := NewCommonOptions() - opts.InstallFlags(flags) - - err := flags.Parse([]string{ - "--tlscacert=\"/foo/cafile\"", - "--tlscert=\"/foo/cert\"", - "--tlskey=\"/foo/key\"", - }) - assert.NilError(t, err) - assert.Equal(t, opts.TLSOptions.CAFile, "/foo/cafile") - assert.Equal(t, opts.TLSOptions.CertFile, "/foo/cert") - assert.Equal(t, opts.TLSOptions.KeyFile, "/foo/key") -} - -func defaultPath(filename string) string { - return filepath.Join(cliconfig.ConfigDir(), filename) -} - -func TestCommonOptionsInstallFlagsWithDefaults(t *testing.T) { - flags := pflag.NewFlagSet("testing", pflag.ContinueOnError) - opts := NewCommonOptions() - opts.InstallFlags(flags) - - err := flags.Parse([]string{}) - assert.NilError(t, err) - assert.Equal(t, opts.TLSOptions.CAFile, defaultPath("ca.pem")) - assert.Equal(t, opts.TLSOptions.CertFile, defaultPath("cert.pem")) - assert.Equal(t, opts.TLSOptions.KeyFile, defaultPath("key.pem")) -} diff --git a/vendor/github.com/docker/docker/cli/trust/trust.go b/vendor/github.com/docker/docker/cli/trust/trust.go deleted file mode 100644 index 51914f74b..000000000 --- a/vendor/github.com/docker/docker/cli/trust/trust.go +++ /dev/null @@ -1,232 +0,0 @@ -package trust - -import ( - "encoding/json" - "fmt" - "net" - "net/http" - "net/url" - "os" - "path" - "path/filepath" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/registry/client/auth" - "github.com/docker/distribution/registry/client/auth/challenge" - "github.com/docker/distribution/registry/client/transport" - "github.com/docker/docker/api/types" - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cliconfig" - "github.com/docker/docker/registry" - "github.com/docker/go-connections/tlsconfig" - "github.com/docker/notary" - "github.com/docker/notary/client" - "github.com/docker/notary/passphrase" - "github.com/docker/notary/storage" - "github.com/docker/notary/trustmanager" - "github.com/docker/notary/trustpinning" - "github.com/docker/notary/tuf/data" - "github.com/docker/notary/tuf/signed" -) - -var ( - // ReleasesRole is the role named "releases" - ReleasesRole = path.Join(data.CanonicalTargetsRole, "releases") -) - -func trustDirectory() string { - return filepath.Join(cliconfig.ConfigDir(), "trust") -} - -// certificateDirectory returns the directory containing -// TLS certificates for the given server. An error is -// returned if there was an error parsing the server string. -func certificateDirectory(server string) (string, error) { - u, err := url.Parse(server) - if err != nil { - return "", err - } - - return filepath.Join(cliconfig.ConfigDir(), "tls", u.Host), nil -} - -// Server returns the base URL for the trust server. -func Server(index *registrytypes.IndexInfo) (string, error) { - if s := os.Getenv("DOCKER_CONTENT_TRUST_SERVER"); s != "" { - urlObj, err := url.Parse(s) - if err != nil || urlObj.Scheme != "https" { - return "", fmt.Errorf("valid https URL required for trust server, got %s", s) - } - - return s, nil - } - if index.Official { - return registry.NotaryServer, nil - } - return "https://" + index.Name, nil -} - -type simpleCredentialStore struct { - auth types.AuthConfig -} - -func (scs simpleCredentialStore) Basic(u *url.URL) (string, string) { - return scs.auth.Username, scs.auth.Password -} - -func (scs simpleCredentialStore) RefreshToken(u *url.URL, service string) string { - return scs.auth.IdentityToken -} - -func (scs simpleCredentialStore) SetRefreshToken(*url.URL, string, string) { -} - -// GetNotaryRepository returns a NotaryRepository which stores all the -// information needed to operate on a notary repository. -// It creates an HTTP transport providing authentication support. -func GetNotaryRepository(streams command.Streams, repoInfo *registry.RepositoryInfo, authConfig types.AuthConfig, actions ...string) (*client.NotaryRepository, error) { - server, err := Server(repoInfo.Index) - if err != nil { - return nil, err - } - - var cfg = tlsconfig.ClientDefault() - cfg.InsecureSkipVerify = !repoInfo.Index.Secure - - // Get certificate base directory - certDir, err := certificateDirectory(server) - if err != nil { - return nil, err - } - logrus.Debugf("reading certificate directory: %s", certDir) - - if err := registry.ReadCertsDirectory(cfg, certDir); err != nil { - return nil, err - } - - base := &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - DualStack: true, - }).Dial, - TLSHandshakeTimeout: 10 * time.Second, - TLSClientConfig: cfg, - DisableKeepAlives: true, - } - - // Skip configuration headers since request is not going to Docker daemon - modifiers := registry.DockerHeaders(command.UserAgent(), http.Header{}) - authTransport := transport.NewTransport(base, modifiers...) - pingClient := &http.Client{ - Transport: authTransport, - Timeout: 5 * time.Second, - } - endpointStr := server + "/v2/" - req, err := http.NewRequest("GET", endpointStr, nil) - if err != nil { - return nil, err - } - - challengeManager := challenge.NewSimpleManager() - - resp, err := pingClient.Do(req) - if err != nil { - // Ignore error on ping to operate in offline mode - logrus.Debugf("Error pinging notary server %q: %s", endpointStr, err) - } else { - defer resp.Body.Close() - - // Add response to the challenge manager to parse out - // authentication header and register authentication method - if err := challengeManager.AddResponse(resp); err != nil { - return nil, err - } - } - - scope := auth.RepositoryScope{ - Repository: repoInfo.FullName(), - Actions: actions, - Class: repoInfo.Class, - } - creds := simpleCredentialStore{auth: authConfig} - tokenHandlerOptions := auth.TokenHandlerOptions{ - Transport: authTransport, - Credentials: creds, - Scopes: []auth.Scope{scope}, - ClientID: registry.AuthClientID, - } - tokenHandler := auth.NewTokenHandlerWithOptions(tokenHandlerOptions) - basicHandler := auth.NewBasicHandler(creds) - modifiers = append(modifiers, transport.RequestModifier(auth.NewAuthorizer(challengeManager, tokenHandler, basicHandler))) - tr := transport.NewTransport(base, modifiers...) - - return client.NewNotaryRepository( - trustDirectory(), - repoInfo.FullName(), - server, - tr, - getPassphraseRetriever(streams), - trustpinning.TrustPinConfig{}) -} - -func getPassphraseRetriever(streams command.Streams) notary.PassRetriever { - aliasMap := map[string]string{ - "root": "root", - "snapshot": "repository", - "targets": "repository", - "default": "repository", - } - baseRetriever := passphrase.PromptRetrieverWithInOut(streams.In(), streams.Out(), aliasMap) - env := map[string]string{ - "root": os.Getenv("DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE"), - "snapshot": os.Getenv("DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE"), - "targets": os.Getenv("DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE"), - "default": os.Getenv("DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE"), - } - - return func(keyName string, alias string, createNew bool, numAttempts int) (string, bool, error) { - if v := env[alias]; v != "" { - return v, numAttempts > 1, nil - } - // For non-root roles, we can also try the "default" alias if it is specified - if v := env["default"]; v != "" && alias != data.CanonicalRootRole { - return v, numAttempts > 1, nil - } - return baseRetriever(keyName, alias, createNew, numAttempts) - } -} - -// NotaryError formats an error message received from the notary service -func NotaryError(repoName string, err error) error { - switch err.(type) { - case *json.SyntaxError: - logrus.Debugf("Notary syntax error: %s", err) - return fmt.Errorf("Error: no trust data available for remote repository %s. Try running notary server and setting DOCKER_CONTENT_TRUST_SERVER to its HTTPS address?", repoName) - case signed.ErrExpired: - return fmt.Errorf("Error: remote repository %s out-of-date: %v", repoName, err) - case trustmanager.ErrKeyNotFound: - return fmt.Errorf("Error: signing keys for remote repository %s not found: %v", repoName, err) - case storage.NetworkError: - return fmt.Errorf("Error: error contacting notary server: %v", err) - case storage.ErrMetaNotFound: - return fmt.Errorf("Error: trust data missing for remote repository %s or remote repository not found: %v", repoName, err) - case trustpinning.ErrRootRotationFail, trustpinning.ErrValidationFail, signed.ErrInvalidKeyType: - return fmt.Errorf("Warning: potential malicious behavior - trust data mismatch for remote repository %s: %v", repoName, err) - case signed.ErrNoKeys: - return fmt.Errorf("Error: could not find signing keys for remote repository %s, or could not decrypt signing key: %v", repoName, err) - case signed.ErrLowVersion: - return fmt.Errorf("Warning: potential malicious behavior - trust data version is lower than expected for remote repository %s: %v", repoName, err) - case signed.ErrRoleThreshold: - return fmt.Errorf("Warning: potential malicious behavior - trust data has insufficient signatures for remote repository %s: %v", repoName, err) - case client.ErrRepositoryNotExist: - return fmt.Errorf("Error: remote trust data does not exist for %s: %v", repoName, err) - case signed.ErrInsufficientSignatures: - return fmt.Errorf("Error: could not produce valid signature for %s. If Yubikey was used, was touch input provided?: %v", repoName, err) - } - - return err -} diff --git a/vendor/github.com/docker/docker/cliconfig/config.go b/vendor/github.com/docker/docker/cliconfig/config.go deleted file mode 100644 index d81bf86b7..000000000 --- a/vendor/github.com/docker/docker/cliconfig/config.go +++ /dev/null @@ -1,120 +0,0 @@ -package cliconfig - -import ( - "fmt" - "io" - "os" - "path/filepath" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cliconfig/configfile" - "github.com/docker/docker/pkg/homedir" -) - -const ( - // ConfigFileName is the name of config file - ConfigFileName = "config.json" - configFileDir = ".docker" - oldConfigfile = ".dockercfg" -) - -var ( - configDir = os.Getenv("DOCKER_CONFIG") -) - -func init() { - if configDir == "" { - configDir = filepath.Join(homedir.Get(), configFileDir) - } -} - -// ConfigDir returns the directory the configuration file is stored in -func ConfigDir() string { - return configDir -} - -// SetConfigDir sets the directory the configuration file is stored in -func SetConfigDir(dir string) { - configDir = dir -} - -// NewConfigFile initializes an empty configuration file for the given filename 'fn' -func NewConfigFile(fn string) *configfile.ConfigFile { - return &configfile.ConfigFile{ - AuthConfigs: make(map[string]types.AuthConfig), - HTTPHeaders: make(map[string]string), - Filename: fn, - } -} - -// LegacyLoadFromReader is a convenience function that creates a ConfigFile object from -// a non-nested reader -func LegacyLoadFromReader(configData io.Reader) (*configfile.ConfigFile, error) { - configFile := configfile.ConfigFile{ - AuthConfigs: make(map[string]types.AuthConfig), - } - err := configFile.LegacyLoadFromReader(configData) - return &configFile, err -} - -// LoadFromReader is a convenience function that creates a ConfigFile object from -// a reader -func LoadFromReader(configData io.Reader) (*configfile.ConfigFile, error) { - configFile := configfile.ConfigFile{ - AuthConfigs: make(map[string]types.AuthConfig), - } - err := configFile.LoadFromReader(configData) - return &configFile, err -} - -// Load reads the configuration files in the given directory, and sets up -// the auth config information and returns values. -// FIXME: use the internal golang config parser -func Load(configDir string) (*configfile.ConfigFile, error) { - if configDir == "" { - configDir = ConfigDir() - } - - configFile := configfile.ConfigFile{ - AuthConfigs: make(map[string]types.AuthConfig), - Filename: filepath.Join(configDir, ConfigFileName), - } - - // Try happy path first - latest config file - if _, err := os.Stat(configFile.Filename); err == nil { - file, err := os.Open(configFile.Filename) - if err != nil { - return &configFile, fmt.Errorf("%s - %v", configFile.Filename, err) - } - defer file.Close() - err = configFile.LoadFromReader(file) - if err != nil { - err = fmt.Errorf("%s - %v", configFile.Filename, err) - } - return &configFile, err - } else if !os.IsNotExist(err) { - // if file is there but we can't stat it for any reason other - // than it doesn't exist then stop - return &configFile, fmt.Errorf("%s - %v", configFile.Filename, err) - } - - // Can't find latest config file so check for the old one - confFile := filepath.Join(homedir.Get(), oldConfigfile) - if _, err := os.Stat(confFile); err != nil { - return &configFile, nil //missing file is not an error - } - file, err := os.Open(confFile) - if err != nil { - return &configFile, fmt.Errorf("%s - %v", confFile, err) - } - defer file.Close() - err = configFile.LegacyLoadFromReader(file) - if err != nil { - return &configFile, fmt.Errorf("%s - %v", confFile, err) - } - - if configFile.HTTPHeaders == nil { - configFile.HTTPHeaders = map[string]string{} - } - return &configFile, nil -} diff --git a/vendor/github.com/docker/docker/cliconfig/config_test.go b/vendor/github.com/docker/docker/cliconfig/config_test.go deleted file mode 100644 index d8a099ab5..000000000 --- a/vendor/github.com/docker/docker/cliconfig/config_test.go +++ /dev/null @@ -1,621 +0,0 @@ -package cliconfig - -import ( - "io/ioutil" - "os" - "path/filepath" - "strings" - "testing" - - "github.com/docker/docker/cliconfig/configfile" - "github.com/docker/docker/pkg/homedir" -) - -func TestEmptyConfigDir(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - SetConfigDir(tmpHome) - - config, err := Load("") - if err != nil { - t.Fatalf("Failed loading on empty config dir: %q", err) - } - - expectedConfigFilename := filepath.Join(tmpHome, ConfigFileName) - if config.Filename != expectedConfigFilename { - t.Fatalf("Expected config filename %s, got %s", expectedConfigFilename, config.Filename) - } - - // Now save it and make sure it shows up in new form - saveConfigAndValidateNewFormat(t, config, tmpHome) -} - -func TestMissingFile(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - config, err := Load(tmpHome) - if err != nil { - t.Fatalf("Failed loading on missing file: %q", err) - } - - // Now save it and make sure it shows up in new form - saveConfigAndValidateNewFormat(t, config, tmpHome) -} - -func TestSaveFileToDirs(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - tmpHome += "/.docker" - - config, err := Load(tmpHome) - if err != nil { - t.Fatalf("Failed loading on missing file: %q", err) - } - - // Now save it and make sure it shows up in new form - saveConfigAndValidateNewFormat(t, config, tmpHome) -} - -func TestEmptyFile(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - fn := filepath.Join(tmpHome, ConfigFileName) - if err := ioutil.WriteFile(fn, []byte(""), 0600); err != nil { - t.Fatal(err) - } - - _, err = Load(tmpHome) - if err == nil { - t.Fatalf("Was supposed to fail") - } -} - -func TestEmptyJSON(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - fn := filepath.Join(tmpHome, ConfigFileName) - if err := ioutil.WriteFile(fn, []byte("{}"), 0600); err != nil { - t.Fatal(err) - } - - config, err := Load(tmpHome) - if err != nil { - t.Fatalf("Failed loading on empty json file: %q", err) - } - - // Now save it and make sure it shows up in new form - saveConfigAndValidateNewFormat(t, config, tmpHome) -} - -func TestOldInvalidsAuth(t *testing.T) { - invalids := map[string]string{ - `username = test`: "The Auth config file is empty", - `username -password`: "Invalid Auth config file", - `username = test -email`: "Invalid auth configuration file", - } - - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - homeKey := homedir.Key() - homeVal := homedir.Get() - - defer func() { os.Setenv(homeKey, homeVal) }() - os.Setenv(homeKey, tmpHome) - - for content, expectedError := range invalids { - fn := filepath.Join(tmpHome, oldConfigfile) - if err := ioutil.WriteFile(fn, []byte(content), 0600); err != nil { - t.Fatal(err) - } - - config, err := Load(tmpHome) - // Use Contains instead of == since the file name will change each time - if err == nil || !strings.Contains(err.Error(), expectedError) { - t.Fatalf("Should have failed\nConfig: %v\nGot: %v\nExpected: %v", config, err, expectedError) - } - - } -} - -func TestOldValidAuth(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - homeKey := homedir.Key() - homeVal := homedir.Get() - - defer func() { os.Setenv(homeKey, homeVal) }() - os.Setenv(homeKey, tmpHome) - - fn := filepath.Join(tmpHome, oldConfigfile) - js := `username = am9lam9lOmhlbGxv - email = user@example.com` - if err := ioutil.WriteFile(fn, []byte(js), 0600); err != nil { - t.Fatal(err) - } - - config, err := Load(tmpHome) - if err != nil { - t.Fatal(err) - } - - // defaultIndexserver is https://index.docker.io/v1/ - ac := config.AuthConfigs["https://index.docker.io/v1/"] - if ac.Username != "joejoe" || ac.Password != "hello" { - t.Fatalf("Missing data from parsing:\n%q", config) - } - - // Now save it and make sure it shows up in new form - configStr := saveConfigAndValidateNewFormat(t, config, tmpHome) - - expConfStr := `{ - "auths": { - "https://index.docker.io/v1/": { - "auth": "am9lam9lOmhlbGxv" - } - } -}` - - if configStr != expConfStr { - t.Fatalf("Should have save in new form: \n%s\n not \n%s", configStr, expConfStr) - } -} - -func TestOldJSONInvalid(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - homeKey := homedir.Key() - homeVal := homedir.Get() - - defer func() { os.Setenv(homeKey, homeVal) }() - os.Setenv(homeKey, tmpHome) - - fn := filepath.Join(tmpHome, oldConfigfile) - js := `{"https://index.docker.io/v1/":{"auth":"test","email":"user@example.com"}}` - if err := ioutil.WriteFile(fn, []byte(js), 0600); err != nil { - t.Fatal(err) - } - - config, err := Load(tmpHome) - // Use Contains instead of == since the file name will change each time - if err == nil || !strings.Contains(err.Error(), "Invalid auth configuration file") { - t.Fatalf("Expected an error got : %v, %v", config, err) - } -} - -func TestOldJSON(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - homeKey := homedir.Key() - homeVal := homedir.Get() - - defer func() { os.Setenv(homeKey, homeVal) }() - os.Setenv(homeKey, tmpHome) - - fn := filepath.Join(tmpHome, oldConfigfile) - js := `{"https://index.docker.io/v1/":{"auth":"am9lam9lOmhlbGxv","email":"user@example.com"}}` - if err := ioutil.WriteFile(fn, []byte(js), 0600); err != nil { - t.Fatal(err) - } - - config, err := Load(tmpHome) - if err != nil { - t.Fatalf("Failed loading on empty json file: %q", err) - } - - ac := config.AuthConfigs["https://index.docker.io/v1/"] - if ac.Username != "joejoe" || ac.Password != "hello" { - t.Fatalf("Missing data from parsing:\n%q", config) - } - - // Now save it and make sure it shows up in new form - configStr := saveConfigAndValidateNewFormat(t, config, tmpHome) - - expConfStr := `{ - "auths": { - "https://index.docker.io/v1/": { - "auth": "am9lam9lOmhlbGxv", - "email": "user@example.com" - } - } -}` - - if configStr != expConfStr { - t.Fatalf("Should have save in new form: \n'%s'\n not \n'%s'\n", configStr, expConfStr) - } -} - -func TestNewJSON(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - fn := filepath.Join(tmpHome, ConfigFileName) - js := ` { "auths": { "https://index.docker.io/v1/": { "auth": "am9lam9lOmhlbGxv" } } }` - if err := ioutil.WriteFile(fn, []byte(js), 0600); err != nil { - t.Fatal(err) - } - - config, err := Load(tmpHome) - if err != nil { - t.Fatalf("Failed loading on empty json file: %q", err) - } - - ac := config.AuthConfigs["https://index.docker.io/v1/"] - if ac.Username != "joejoe" || ac.Password != "hello" { - t.Fatalf("Missing data from parsing:\n%q", config) - } - - // Now save it and make sure it shows up in new form - configStr := saveConfigAndValidateNewFormat(t, config, tmpHome) - - expConfStr := `{ - "auths": { - "https://index.docker.io/v1/": { - "auth": "am9lam9lOmhlbGxv" - } - } -}` - - if configStr != expConfStr { - t.Fatalf("Should have save in new form: \n%s\n not \n%s", configStr, expConfStr) - } -} - -func TestNewJSONNoEmail(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - fn := filepath.Join(tmpHome, ConfigFileName) - js := ` { "auths": { "https://index.docker.io/v1/": { "auth": "am9lam9lOmhlbGxv" } } }` - if err := ioutil.WriteFile(fn, []byte(js), 0600); err != nil { - t.Fatal(err) - } - - config, err := Load(tmpHome) - if err != nil { - t.Fatalf("Failed loading on empty json file: %q", err) - } - - ac := config.AuthConfigs["https://index.docker.io/v1/"] - if ac.Username != "joejoe" || ac.Password != "hello" { - t.Fatalf("Missing data from parsing:\n%q", config) - } - - // Now save it and make sure it shows up in new form - configStr := saveConfigAndValidateNewFormat(t, config, tmpHome) - - expConfStr := `{ - "auths": { - "https://index.docker.io/v1/": { - "auth": "am9lam9lOmhlbGxv" - } - } -}` - - if configStr != expConfStr { - t.Fatalf("Should have save in new form: \n%s\n not \n%s", configStr, expConfStr) - } -} - -func TestJSONWithPsFormat(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - fn := filepath.Join(tmpHome, ConfigFileName) - js := `{ - "auths": { "https://index.docker.io/v1/": { "auth": "am9lam9lOmhlbGxv", "email": "user@example.com" } }, - "psFormat": "table {{.ID}}\\t{{.Label \"com.docker.label.cpu\"}}" -}` - if err := ioutil.WriteFile(fn, []byte(js), 0600); err != nil { - t.Fatal(err) - } - - config, err := Load(tmpHome) - if err != nil { - t.Fatalf("Failed loading on empty json file: %q", err) - } - - if config.PsFormat != `table {{.ID}}\t{{.Label "com.docker.label.cpu"}}` { - t.Fatalf("Unknown ps format: %s\n", config.PsFormat) - } - - // Now save it and make sure it shows up in new form - configStr := saveConfigAndValidateNewFormat(t, config, tmpHome) - if !strings.Contains(configStr, `"psFormat":`) || - !strings.Contains(configStr, "{{.ID}}") { - t.Fatalf("Should have save in new form: %s", configStr) - } -} - -func TestJSONWithCredentialStore(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - fn := filepath.Join(tmpHome, ConfigFileName) - js := `{ - "auths": { "https://index.docker.io/v1/": { "auth": "am9lam9lOmhlbGxv", "email": "user@example.com" } }, - "credsStore": "crazy-secure-storage" -}` - if err := ioutil.WriteFile(fn, []byte(js), 0600); err != nil { - t.Fatal(err) - } - - config, err := Load(tmpHome) - if err != nil { - t.Fatalf("Failed loading on empty json file: %q", err) - } - - if config.CredentialsStore != "crazy-secure-storage" { - t.Fatalf("Unknown credential store: %s\n", config.CredentialsStore) - } - - // Now save it and make sure it shows up in new form - configStr := saveConfigAndValidateNewFormat(t, config, tmpHome) - if !strings.Contains(configStr, `"credsStore":`) || - !strings.Contains(configStr, "crazy-secure-storage") { - t.Fatalf("Should have save in new form: %s", configStr) - } -} - -func TestJSONWithCredentialHelpers(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - fn := filepath.Join(tmpHome, ConfigFileName) - js := `{ - "auths": { "https://index.docker.io/v1/": { "auth": "am9lam9lOmhlbGxv", "email": "user@example.com" } }, - "credHelpers": { "images.io": "images-io", "containers.com": "crazy-secure-storage" } -}` - if err := ioutil.WriteFile(fn, []byte(js), 0600); err != nil { - t.Fatal(err) - } - - config, err := Load(tmpHome) - if err != nil { - t.Fatalf("Failed loading on empty json file: %q", err) - } - - if config.CredentialHelpers == nil { - t.Fatal("config.CredentialHelpers was nil") - } else if config.CredentialHelpers["images.io"] != "images-io" || - config.CredentialHelpers["containers.com"] != "crazy-secure-storage" { - t.Fatalf("Credential helpers not deserialized properly: %v\n", config.CredentialHelpers) - } - - // Now save it and make sure it shows up in new form - configStr := saveConfigAndValidateNewFormat(t, config, tmpHome) - if !strings.Contains(configStr, `"credHelpers":`) || - !strings.Contains(configStr, "images.io") || - !strings.Contains(configStr, "images-io") || - !strings.Contains(configStr, "containers.com") || - !strings.Contains(configStr, "crazy-secure-storage") { - t.Fatalf("Should have save in new form: %s", configStr) - } -} - -// Save it and make sure it shows up in new form -func saveConfigAndValidateNewFormat(t *testing.T, config *configfile.ConfigFile, homeFolder string) string { - if err := config.Save(); err != nil { - t.Fatalf("Failed to save: %q", err) - } - - buf, err := ioutil.ReadFile(filepath.Join(homeFolder, ConfigFileName)) - if err != nil { - t.Fatal(err) - } - if !strings.Contains(string(buf), `"auths":`) { - t.Fatalf("Should have save in new form: %s", string(buf)) - } - return string(buf) -} - -func TestConfigDir(t *testing.T) { - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpHome) - - if ConfigDir() == tmpHome { - t.Fatalf("Expected ConfigDir to be different than %s by default, but was the same", tmpHome) - } - - // Update configDir - SetConfigDir(tmpHome) - - if ConfigDir() != tmpHome { - t.Fatalf("Expected ConfigDir to %s, but was %s", tmpHome, ConfigDir()) - } -} - -func TestConfigFile(t *testing.T) { - configFilename := "configFilename" - configFile := NewConfigFile(configFilename) - - if configFile.Filename != configFilename { - t.Fatalf("Expected %s, got %s", configFilename, configFile.Filename) - } -} - -func TestJSONReaderNoFile(t *testing.T) { - js := ` { "auths": { "https://index.docker.io/v1/": { "auth": "am9lam9lOmhlbGxv", "email": "user@example.com" } } }` - - config, err := LoadFromReader(strings.NewReader(js)) - if err != nil { - t.Fatalf("Failed loading on empty json file: %q", err) - } - - ac := config.AuthConfigs["https://index.docker.io/v1/"] - if ac.Username != "joejoe" || ac.Password != "hello" { - t.Fatalf("Missing data from parsing:\n%q", config) - } - -} - -func TestOldJSONReaderNoFile(t *testing.T) { - js := `{"https://index.docker.io/v1/":{"auth":"am9lam9lOmhlbGxv","email":"user@example.com"}}` - - config, err := LegacyLoadFromReader(strings.NewReader(js)) - if err != nil { - t.Fatalf("Failed loading on empty json file: %q", err) - } - - ac := config.AuthConfigs["https://index.docker.io/v1/"] - if ac.Username != "joejoe" || ac.Password != "hello" { - t.Fatalf("Missing data from parsing:\n%q", config) - } -} - -func TestJSONWithPsFormatNoFile(t *testing.T) { - js := `{ - "auths": { "https://index.docker.io/v1/": { "auth": "am9lam9lOmhlbGxv", "email": "user@example.com" } }, - "psFormat": "table {{.ID}}\\t{{.Label \"com.docker.label.cpu\"}}" -}` - config, err := LoadFromReader(strings.NewReader(js)) - if err != nil { - t.Fatalf("Failed loading on empty json file: %q", err) - } - - if config.PsFormat != `table {{.ID}}\t{{.Label "com.docker.label.cpu"}}` { - t.Fatalf("Unknown ps format: %s\n", config.PsFormat) - } - -} - -func TestJSONSaveWithNoFile(t *testing.T) { - js := `{ - "auths": { "https://index.docker.io/v1/": { "auth": "am9lam9lOmhlbGxv" } }, - "psFormat": "table {{.ID}}\\t{{.Label \"com.docker.label.cpu\"}}" -}` - config, err := LoadFromReader(strings.NewReader(js)) - err = config.Save() - if err == nil { - t.Fatalf("Expected error. File should not have been able to save with no file name.") - } - - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatalf("Failed to create a temp dir: %q", err) - } - defer os.RemoveAll(tmpHome) - - fn := filepath.Join(tmpHome, ConfigFileName) - f, _ := os.OpenFile(fn, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - defer f.Close() - - err = config.SaveToWriter(f) - if err != nil { - t.Fatalf("Failed saving to file: %q", err) - } - buf, err := ioutil.ReadFile(filepath.Join(tmpHome, ConfigFileName)) - if err != nil { - t.Fatal(err) - } - expConfStr := `{ - "auths": { - "https://index.docker.io/v1/": { - "auth": "am9lam9lOmhlbGxv" - } - }, - "psFormat": "table {{.ID}}\\t{{.Label \"com.docker.label.cpu\"}}" -}` - if string(buf) != expConfStr { - t.Fatalf("Should have save in new form: \n%s\nnot \n%s", string(buf), expConfStr) - } -} - -func TestLegacyJSONSaveWithNoFile(t *testing.T) { - - js := `{"https://index.docker.io/v1/":{"auth":"am9lam9lOmhlbGxv","email":"user@example.com"}}` - config, err := LegacyLoadFromReader(strings.NewReader(js)) - err = config.Save() - if err == nil { - t.Fatalf("Expected error. File should not have been able to save with no file name.") - } - - tmpHome, err := ioutil.TempDir("", "config-test") - if err != nil { - t.Fatalf("Failed to create a temp dir: %q", err) - } - defer os.RemoveAll(tmpHome) - - fn := filepath.Join(tmpHome, ConfigFileName) - f, _ := os.OpenFile(fn, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - defer f.Close() - - if err = config.SaveToWriter(f); err != nil { - t.Fatalf("Failed saving to file: %q", err) - } - buf, err := ioutil.ReadFile(filepath.Join(tmpHome, ConfigFileName)) - if err != nil { - t.Fatal(err) - } - - expConfStr := `{ - "auths": { - "https://index.docker.io/v1/": { - "auth": "am9lam9lOmhlbGxv", - "email": "user@example.com" - } - } -}` - - if string(buf) != expConfStr { - t.Fatalf("Should have save in new form: \n%s\n not \n%s", string(buf), expConfStr) - } -} diff --git a/vendor/github.com/docker/docker/cliconfig/configfile/file.go b/vendor/github.com/docker/docker/cliconfig/configfile/file.go deleted file mode 100644 index 39097133a..000000000 --- a/vendor/github.com/docker/docker/cliconfig/configfile/file.go +++ /dev/null @@ -1,183 +0,0 @@ -package configfile - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - - "github.com/docker/docker/api/types" -) - -const ( - // This constant is only used for really old config files when the - // URL wasn't saved as part of the config file and it was just - // assumed to be this value. - defaultIndexserver = "https://index.docker.io/v1/" -) - -// ConfigFile ~/.docker/config.json file info -type ConfigFile struct { - AuthConfigs map[string]types.AuthConfig `json:"auths"` - HTTPHeaders map[string]string `json:"HttpHeaders,omitempty"` - PsFormat string `json:"psFormat,omitempty"` - ImagesFormat string `json:"imagesFormat,omitempty"` - NetworksFormat string `json:"networksFormat,omitempty"` - VolumesFormat string `json:"volumesFormat,omitempty"` - StatsFormat string `json:"statsFormat,omitempty"` - DetachKeys string `json:"detachKeys,omitempty"` - CredentialsStore string `json:"credsStore,omitempty"` - CredentialHelpers map[string]string `json:"credHelpers,omitempty"` - Filename string `json:"-"` // Note: for internal use only - ServiceInspectFormat string `json:"serviceInspectFormat,omitempty"` -} - -// LegacyLoadFromReader reads the non-nested configuration data given and sets up the -// auth config information with given directory and populates the receiver object -func (configFile *ConfigFile) LegacyLoadFromReader(configData io.Reader) error { - b, err := ioutil.ReadAll(configData) - if err != nil { - return err - } - - if err := json.Unmarshal(b, &configFile.AuthConfigs); err != nil { - arr := strings.Split(string(b), "\n") - if len(arr) < 2 { - return fmt.Errorf("The Auth config file is empty") - } - authConfig := types.AuthConfig{} - origAuth := strings.Split(arr[0], " = ") - if len(origAuth) != 2 { - return fmt.Errorf("Invalid Auth config file") - } - authConfig.Username, authConfig.Password, err = decodeAuth(origAuth[1]) - if err != nil { - return err - } - authConfig.ServerAddress = defaultIndexserver - configFile.AuthConfigs[defaultIndexserver] = authConfig - } else { - for k, authConfig := range configFile.AuthConfigs { - authConfig.Username, authConfig.Password, err = decodeAuth(authConfig.Auth) - if err != nil { - return err - } - authConfig.Auth = "" - authConfig.ServerAddress = k - configFile.AuthConfigs[k] = authConfig - } - } - return nil -} - -// LoadFromReader reads the configuration data given and sets up the auth config -// information with given directory and populates the receiver object -func (configFile *ConfigFile) LoadFromReader(configData io.Reader) error { - if err := json.NewDecoder(configData).Decode(&configFile); err != nil { - return err - } - var err error - for addr, ac := range configFile.AuthConfigs { - ac.Username, ac.Password, err = decodeAuth(ac.Auth) - if err != nil { - return err - } - ac.Auth = "" - ac.ServerAddress = addr - configFile.AuthConfigs[addr] = ac - } - return nil -} - -// ContainsAuth returns whether there is authentication configured -// in this file or not. -func (configFile *ConfigFile) ContainsAuth() bool { - return configFile.CredentialsStore != "" || - len(configFile.CredentialHelpers) > 0 || - len(configFile.AuthConfigs) > 0 -} - -// SaveToWriter encodes and writes out all the authorization information to -// the given writer -func (configFile *ConfigFile) SaveToWriter(writer io.Writer) error { - // Encode sensitive data into a new/temp struct - tmpAuthConfigs := make(map[string]types.AuthConfig, len(configFile.AuthConfigs)) - for k, authConfig := range configFile.AuthConfigs { - authCopy := authConfig - // encode and save the authstring, while blanking out the original fields - authCopy.Auth = encodeAuth(&authCopy) - authCopy.Username = "" - authCopy.Password = "" - authCopy.ServerAddress = "" - tmpAuthConfigs[k] = authCopy - } - - saveAuthConfigs := configFile.AuthConfigs - configFile.AuthConfigs = tmpAuthConfigs - defer func() { configFile.AuthConfigs = saveAuthConfigs }() - - data, err := json.MarshalIndent(configFile, "", "\t") - if err != nil { - return err - } - _, err = writer.Write(data) - return err -} - -// Save encodes and writes out all the authorization information -func (configFile *ConfigFile) Save() error { - if configFile.Filename == "" { - return fmt.Errorf("Can't save config with empty filename") - } - - if err := os.MkdirAll(filepath.Dir(configFile.Filename), 0700); err != nil { - return err - } - f, err := os.OpenFile(configFile.Filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - if err != nil { - return err - } - defer f.Close() - return configFile.SaveToWriter(f) -} - -// encodeAuth creates a base64 encoded string to containing authorization information -func encodeAuth(authConfig *types.AuthConfig) string { - if authConfig.Username == "" && authConfig.Password == "" { - return "" - } - - authStr := authConfig.Username + ":" + authConfig.Password - msg := []byte(authStr) - encoded := make([]byte, base64.StdEncoding.EncodedLen(len(msg))) - base64.StdEncoding.Encode(encoded, msg) - return string(encoded) -} - -// decodeAuth decodes a base64 encoded string and returns username and password -func decodeAuth(authStr string) (string, string, error) { - if authStr == "" { - return "", "", nil - } - - decLen := base64.StdEncoding.DecodedLen(len(authStr)) - decoded := make([]byte, decLen) - authByte := []byte(authStr) - n, err := base64.StdEncoding.Decode(decoded, authByte) - if err != nil { - return "", "", err - } - if n > decLen { - return "", "", fmt.Errorf("Something went wrong decoding auth config") - } - arr := strings.SplitN(string(decoded), ":", 2) - if len(arr) != 2 { - return "", "", fmt.Errorf("Invalid auth configuration file") - } - password := strings.Trim(arr[1], "\x00") - return arr[0], password, nil -} diff --git a/vendor/github.com/docker/docker/cliconfig/configfile/file_test.go b/vendor/github.com/docker/docker/cliconfig/configfile/file_test.go deleted file mode 100644 index 435797f68..000000000 --- a/vendor/github.com/docker/docker/cliconfig/configfile/file_test.go +++ /dev/null @@ -1,27 +0,0 @@ -package configfile - -import ( - "testing" - - "github.com/docker/docker/api/types" -) - -func TestEncodeAuth(t *testing.T) { - newAuthConfig := &types.AuthConfig{Username: "ken", Password: "test"} - authStr := encodeAuth(newAuthConfig) - decAuthConfig := &types.AuthConfig{} - var err error - decAuthConfig.Username, decAuthConfig.Password, err = decodeAuth(authStr) - if err != nil { - t.Fatal(err) - } - if newAuthConfig.Username != decAuthConfig.Username { - t.Fatal("Encode Username doesn't match decoded Username") - } - if newAuthConfig.Password != decAuthConfig.Password { - t.Fatal("Encode Password doesn't match decoded Password") - } - if authStr != "a2VuOnRlc3Q=" { - t.Fatal("AuthString encoding isn't correct.") - } -} diff --git a/vendor/github.com/docker/docker/cliconfig/credentials/credentials.go b/vendor/github.com/docker/docker/cliconfig/credentials/credentials.go deleted file mode 100644 index ca874cac5..000000000 --- a/vendor/github.com/docker/docker/cliconfig/credentials/credentials.go +++ /dev/null @@ -1,17 +0,0 @@ -package credentials - -import ( - "github.com/docker/docker/api/types" -) - -// Store is the interface that any credentials store must implement. -type Store interface { - // Erase removes credentials from the store for a given server. - Erase(serverAddress string) error - // Get retrieves credentials from the store for a given server. - Get(serverAddress string) (types.AuthConfig, error) - // GetAll retrieves all the credentials from the store. - GetAll() (map[string]types.AuthConfig, error) - // Store saves credentials in the store. - Store(authConfig types.AuthConfig) error -} diff --git a/vendor/github.com/docker/docker/cliconfig/credentials/default_store.go b/vendor/github.com/docker/docker/cliconfig/credentials/default_store.go deleted file mode 100644 index b4733709b..000000000 --- a/vendor/github.com/docker/docker/cliconfig/credentials/default_store.go +++ /dev/null @@ -1,22 +0,0 @@ -package credentials - -import ( - "os/exec" - - "github.com/docker/docker/cliconfig/configfile" -) - -// DetectDefaultStore sets the default credentials store -// if the host includes the default store helper program. -func DetectDefaultStore(c *configfile.ConfigFile) { - if c.CredentialsStore != "" { - // user defined - return - } - - if defaultCredentialsStore != "" { - if _, err := exec.LookPath(remoteCredentialsPrefix + defaultCredentialsStore); err == nil { - c.CredentialsStore = defaultCredentialsStore - } - } -} diff --git a/vendor/github.com/docker/docker/cliconfig/credentials/default_store_darwin.go b/vendor/github.com/docker/docker/cliconfig/credentials/default_store_darwin.go deleted file mode 100644 index 63e8ed401..000000000 --- a/vendor/github.com/docker/docker/cliconfig/credentials/default_store_darwin.go +++ /dev/null @@ -1,3 +0,0 @@ -package credentials - -const defaultCredentialsStore = "osxkeychain" diff --git a/vendor/github.com/docker/docker/cliconfig/credentials/default_store_linux.go b/vendor/github.com/docker/docker/cliconfig/credentials/default_store_linux.go deleted file mode 100644 index 864c540f6..000000000 --- a/vendor/github.com/docker/docker/cliconfig/credentials/default_store_linux.go +++ /dev/null @@ -1,3 +0,0 @@ -package credentials - -const defaultCredentialsStore = "secretservice" diff --git a/vendor/github.com/docker/docker/cliconfig/credentials/default_store_unsupported.go b/vendor/github.com/docker/docker/cliconfig/credentials/default_store_unsupported.go deleted file mode 100644 index 519ef53dc..000000000 --- a/vendor/github.com/docker/docker/cliconfig/credentials/default_store_unsupported.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build !windows,!darwin,!linux - -package credentials - -const defaultCredentialsStore = "" diff --git a/vendor/github.com/docker/docker/cliconfig/credentials/default_store_windows.go b/vendor/github.com/docker/docker/cliconfig/credentials/default_store_windows.go deleted file mode 100644 index fb6a9745c..000000000 --- a/vendor/github.com/docker/docker/cliconfig/credentials/default_store_windows.go +++ /dev/null @@ -1,3 +0,0 @@ -package credentials - -const defaultCredentialsStore = "wincred" diff --git a/vendor/github.com/docker/docker/cliconfig/credentials/file_store.go b/vendor/github.com/docker/docker/cliconfig/credentials/file_store.go deleted file mode 100644 index ca73a384d..000000000 --- a/vendor/github.com/docker/docker/cliconfig/credentials/file_store.go +++ /dev/null @@ -1,53 +0,0 @@ -package credentials - -import ( - "github.com/docker/docker/api/types" - "github.com/docker/docker/cliconfig/configfile" - "github.com/docker/docker/registry" -) - -// fileStore implements a credentials store using -// the docker configuration file to keep the credentials in plain text. -type fileStore struct { - file *configfile.ConfigFile -} - -// NewFileStore creates a new file credentials store. -func NewFileStore(file *configfile.ConfigFile) Store { - return &fileStore{ - file: file, - } -} - -// Erase removes the given credentials from the file store. -func (c *fileStore) Erase(serverAddress string) error { - delete(c.file.AuthConfigs, serverAddress) - return c.file.Save() -} - -// Get retrieves credentials for a specific server from the file store. -func (c *fileStore) Get(serverAddress string) (types.AuthConfig, error) { - authConfig, ok := c.file.AuthConfigs[serverAddress] - if !ok { - // Maybe they have a legacy config file, we will iterate the keys converting - // them to the new format and testing - for r, ac := range c.file.AuthConfigs { - if serverAddress == registry.ConvertToHostname(r) { - return ac, nil - } - } - - authConfig = types.AuthConfig{} - } - return authConfig, nil -} - -func (c *fileStore) GetAll() (map[string]types.AuthConfig, error) { - return c.file.AuthConfigs, nil -} - -// Store saves the given credentials in the file store. -func (c *fileStore) Store(authConfig types.AuthConfig) error { - c.file.AuthConfigs[authConfig.ServerAddress] = authConfig - return c.file.Save() -} diff --git a/vendor/github.com/docker/docker/cliconfig/credentials/file_store_test.go b/vendor/github.com/docker/docker/cliconfig/credentials/file_store_test.go deleted file mode 100644 index efed4e904..000000000 --- a/vendor/github.com/docker/docker/cliconfig/credentials/file_store_test.go +++ /dev/null @@ -1,139 +0,0 @@ -package credentials - -import ( - "io/ioutil" - "testing" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/cliconfig" - "github.com/docker/docker/cliconfig/configfile" -) - -func newConfigFile(auths map[string]types.AuthConfig) *configfile.ConfigFile { - tmp, _ := ioutil.TempFile("", "docker-test") - name := tmp.Name() - tmp.Close() - - c := cliconfig.NewConfigFile(name) - c.AuthConfigs = auths - return c -} - -func TestFileStoreAddCredentials(t *testing.T) { - f := newConfigFile(make(map[string]types.AuthConfig)) - - s := NewFileStore(f) - err := s.Store(types.AuthConfig{ - Auth: "super_secret_token", - Email: "foo@example.com", - ServerAddress: "https://example.com", - }) - - if err != nil { - t.Fatal(err) - } - - if len(f.AuthConfigs) != 1 { - t.Fatalf("expected 1 auth config, got %d", len(f.AuthConfigs)) - } - - a, ok := f.AuthConfigs["https://example.com"] - if !ok { - t.Fatalf("expected auth for https://example.com, got %v", f.AuthConfigs) - } - if a.Auth != "super_secret_token" { - t.Fatalf("expected auth `super_secret_token`, got %s", a.Auth) - } - if a.Email != "foo@example.com" { - t.Fatalf("expected email `foo@example.com`, got %s", a.Email) - } -} - -func TestFileStoreGet(t *testing.T) { - f := newConfigFile(map[string]types.AuthConfig{ - "https://example.com": { - Auth: "super_secret_token", - Email: "foo@example.com", - ServerAddress: "https://example.com", - }, - }) - - s := NewFileStore(f) - a, err := s.Get("https://example.com") - if err != nil { - t.Fatal(err) - } - if a.Auth != "super_secret_token" { - t.Fatalf("expected auth `super_secret_token`, got %s", a.Auth) - } - if a.Email != "foo@example.com" { - t.Fatalf("expected email `foo@example.com`, got %s", a.Email) - } -} - -func TestFileStoreGetAll(t *testing.T) { - s1 := "https://example.com" - s2 := "https://example2.com" - f := newConfigFile(map[string]types.AuthConfig{ - s1: { - Auth: "super_secret_token", - Email: "foo@example.com", - ServerAddress: "https://example.com", - }, - s2: { - Auth: "super_secret_token2", - Email: "foo@example2.com", - ServerAddress: "https://example2.com", - }, - }) - - s := NewFileStore(f) - as, err := s.GetAll() - if err != nil { - t.Fatal(err) - } - if len(as) != 2 { - t.Fatalf("wanted 2, got %d", len(as)) - } - if as[s1].Auth != "super_secret_token" { - t.Fatalf("expected auth `super_secret_token`, got %s", as[s1].Auth) - } - if as[s1].Email != "foo@example.com" { - t.Fatalf("expected email `foo@example.com`, got %s", as[s1].Email) - } - if as[s2].Auth != "super_secret_token2" { - t.Fatalf("expected auth `super_secret_token2`, got %s", as[s2].Auth) - } - if as[s2].Email != "foo@example2.com" { - t.Fatalf("expected email `foo@example2.com`, got %s", as[s2].Email) - } -} - -func TestFileStoreErase(t *testing.T) { - f := newConfigFile(map[string]types.AuthConfig{ - "https://example.com": { - Auth: "super_secret_token", - Email: "foo@example.com", - ServerAddress: "https://example.com", - }, - }) - - s := NewFileStore(f) - err := s.Erase("https://example.com") - if err != nil { - t.Fatal(err) - } - - // file store never returns errors, check that the auth config is empty - a, err := s.Get("https://example.com") - if err != nil { - t.Fatal(err) - } - - if a.Auth != "" { - t.Fatalf("expected empty auth token, got %s", a.Auth) - } - if a.Email != "" { - t.Fatalf("expected empty email, got %s", a.Email) - } -} diff --git a/vendor/github.com/docker/docker/cliconfig/credentials/native_store.go b/vendor/github.com/docker/docker/cliconfig/credentials/native_store.go deleted file mode 100644 index dec2dbcb8..000000000 --- a/vendor/github.com/docker/docker/cliconfig/credentials/native_store.go +++ /dev/null @@ -1,144 +0,0 @@ -package credentials - -import ( - "github.com/docker/docker-credential-helpers/client" - "github.com/docker/docker-credential-helpers/credentials" - "github.com/docker/docker/api/types" - "github.com/docker/docker/cliconfig/configfile" -) - -const ( - remoteCredentialsPrefix = "docker-credential-" - tokenUsername = "" -) - -// nativeStore implements a credentials store -// using native keychain to keep credentials secure. -// It piggybacks into a file store to keep users' emails. -type nativeStore struct { - programFunc client.ProgramFunc - fileStore Store -} - -// NewNativeStore creates a new native store that -// uses a remote helper program to manage credentials. -func NewNativeStore(file *configfile.ConfigFile, helperSuffix string) Store { - name := remoteCredentialsPrefix + helperSuffix - return &nativeStore{ - programFunc: client.NewShellProgramFunc(name), - fileStore: NewFileStore(file), - } -} - -// Erase removes the given credentials from the native store. -func (c *nativeStore) Erase(serverAddress string) error { - if err := client.Erase(c.programFunc, serverAddress); err != nil { - return err - } - - // Fallback to plain text store to remove email - return c.fileStore.Erase(serverAddress) -} - -// Get retrieves credentials for a specific server from the native store. -func (c *nativeStore) Get(serverAddress string) (types.AuthConfig, error) { - // load user email if it exist or an empty auth config. - auth, _ := c.fileStore.Get(serverAddress) - - creds, err := c.getCredentialsFromStore(serverAddress) - if err != nil { - return auth, err - } - auth.Username = creds.Username - auth.IdentityToken = creds.IdentityToken - auth.Password = creds.Password - - return auth, nil -} - -// GetAll retrieves all the credentials from the native store. -func (c *nativeStore) GetAll() (map[string]types.AuthConfig, error) { - auths, err := c.listCredentialsInStore() - if err != nil { - return nil, err - } - - // Emails are only stored in the file store. - // This call can be safely eliminated when emails are removed. - fileConfigs, _ := c.fileStore.GetAll() - - authConfigs := make(map[string]types.AuthConfig) - for registry := range auths { - creds, err := c.getCredentialsFromStore(registry) - if err != nil { - return nil, err - } - ac, _ := fileConfigs[registry] // might contain Email - ac.Username = creds.Username - ac.Password = creds.Password - ac.IdentityToken = creds.IdentityToken - authConfigs[registry] = ac - } - - return authConfigs, nil -} - -// Store saves the given credentials in the file store. -func (c *nativeStore) Store(authConfig types.AuthConfig) error { - if err := c.storeCredentialsInStore(authConfig); err != nil { - return err - } - authConfig.Username = "" - authConfig.Password = "" - authConfig.IdentityToken = "" - - // Fallback to old credential in plain text to save only the email - return c.fileStore.Store(authConfig) -} - -// storeCredentialsInStore executes the command to store the credentials in the native store. -func (c *nativeStore) storeCredentialsInStore(config types.AuthConfig) error { - creds := &credentials.Credentials{ - ServerURL: config.ServerAddress, - Username: config.Username, - Secret: config.Password, - } - - if config.IdentityToken != "" { - creds.Username = tokenUsername - creds.Secret = config.IdentityToken - } - - return client.Store(c.programFunc, creds) -} - -// getCredentialsFromStore executes the command to get the credentials from the native store. -func (c *nativeStore) getCredentialsFromStore(serverAddress string) (types.AuthConfig, error) { - var ret types.AuthConfig - - creds, err := client.Get(c.programFunc, serverAddress) - if err != nil { - if credentials.IsErrCredentialsNotFound(err) { - // do not return an error if the credentials are not - // in the keyckain. Let docker ask for new credentials. - return ret, nil - } - return ret, err - } - - if creds.Username == tokenUsername { - ret.IdentityToken = creds.Secret - } else { - ret.Password = creds.Secret - ret.Username = creds.Username - } - - ret.ServerAddress = serverAddress - return ret, nil -} - -// listCredentialsInStore returns a listing of stored credentials as a map of -// URL -> username. -func (c *nativeStore) listCredentialsInStore() (map[string]string, error) { - return client.List(c.programFunc) -} diff --git a/vendor/github.com/docker/docker/cliconfig/credentials/native_store_test.go b/vendor/github.com/docker/docker/cliconfig/credentials/native_store_test.go deleted file mode 100644 index 7664faf9e..000000000 --- a/vendor/github.com/docker/docker/cliconfig/credentials/native_store_test.go +++ /dev/null @@ -1,355 +0,0 @@ -package credentials - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "strings" - "testing" - - "github.com/docker/docker-credential-helpers/client" - "github.com/docker/docker-credential-helpers/credentials" - "github.com/docker/docker/api/types" -) - -const ( - validServerAddress = "https://index.docker.io/v1" - validServerAddress2 = "https://example.com:5002" - invalidServerAddress = "https://foobar.example.com" - missingCredsAddress = "https://missing.docker.io/v1" -) - -var errCommandExited = fmt.Errorf("exited 1") - -// mockCommand simulates interactions between the docker client and a remote -// credentials helper. -// Unit tests inject this mocked command into the remote to control execution. -type mockCommand struct { - arg string - input io.Reader -} - -// Output returns responses from the remote credentials helper. -// It mocks those responses based in the input in the mock. -func (m *mockCommand) Output() ([]byte, error) { - in, err := ioutil.ReadAll(m.input) - if err != nil { - return nil, err - } - inS := string(in) - - switch m.arg { - case "erase": - switch inS { - case validServerAddress: - return nil, nil - default: - return []byte("program failed"), errCommandExited - } - case "get": - switch inS { - case validServerAddress: - return []byte(`{"Username": "foo", "Secret": "bar"}`), nil - case validServerAddress2: - return []byte(`{"Username": "", "Secret": "abcd1234"}`), nil - case missingCredsAddress: - return []byte(credentials.NewErrCredentialsNotFound().Error()), errCommandExited - case invalidServerAddress: - return []byte("program failed"), errCommandExited - } - case "store": - var c credentials.Credentials - err := json.NewDecoder(strings.NewReader(inS)).Decode(&c) - if err != nil { - return []byte("program failed"), errCommandExited - } - switch c.ServerURL { - case validServerAddress: - return nil, nil - default: - return []byte("program failed"), errCommandExited - } - case "list": - return []byte(fmt.Sprintf(`{"%s": "%s", "%s": "%s"}`, validServerAddress, "foo", validServerAddress2, "")), nil - } - - return []byte(fmt.Sprintf("unknown argument %q with %q", m.arg, inS)), errCommandExited -} - -// Input sets the input to send to a remote credentials helper. -func (m *mockCommand) Input(in io.Reader) { - m.input = in -} - -func mockCommandFn(args ...string) client.Program { - return &mockCommand{ - arg: args[0], - } -} - -func TestNativeStoreAddCredentials(t *testing.T) { - f := newConfigFile(make(map[string]types.AuthConfig)) - f.CredentialsStore = "mock" - - s := &nativeStore{ - programFunc: mockCommandFn, - fileStore: NewFileStore(f), - } - err := s.Store(types.AuthConfig{ - Username: "foo", - Password: "bar", - Email: "foo@example.com", - ServerAddress: validServerAddress, - }) - - if err != nil { - t.Fatal(err) - } - - if len(f.AuthConfigs) != 1 { - t.Fatalf("expected 1 auth config, got %d", len(f.AuthConfigs)) - } - - a, ok := f.AuthConfigs[validServerAddress] - if !ok { - t.Fatalf("expected auth for %s, got %v", validServerAddress, f.AuthConfigs) - } - if a.Auth != "" { - t.Fatalf("expected auth to be empty, got %s", a.Auth) - } - if a.Username != "" { - t.Fatalf("expected username to be empty, got %s", a.Username) - } - if a.Password != "" { - t.Fatalf("expected password to be empty, got %s", a.Password) - } - if a.IdentityToken != "" { - t.Fatalf("expected identity token to be empty, got %s", a.IdentityToken) - } - if a.Email != "foo@example.com" { - t.Fatalf("expected email `foo@example.com`, got %s", a.Email) - } -} - -func TestNativeStoreAddInvalidCredentials(t *testing.T) { - f := newConfigFile(make(map[string]types.AuthConfig)) - f.CredentialsStore = "mock" - - s := &nativeStore{ - programFunc: mockCommandFn, - fileStore: NewFileStore(f), - } - err := s.Store(types.AuthConfig{ - Username: "foo", - Password: "bar", - Email: "foo@example.com", - ServerAddress: invalidServerAddress, - }) - - if err == nil { - t.Fatal("expected error, got nil") - } - - if !strings.Contains(err.Error(), "program failed") { - t.Fatalf("expected `program failed`, got %v", err) - } - - if len(f.AuthConfigs) != 0 { - t.Fatalf("expected 0 auth config, got %d", len(f.AuthConfigs)) - } -} - -func TestNativeStoreGet(t *testing.T) { - f := newConfigFile(map[string]types.AuthConfig{ - validServerAddress: { - Email: "foo@example.com", - }, - }) - f.CredentialsStore = "mock" - - s := &nativeStore{ - programFunc: mockCommandFn, - fileStore: NewFileStore(f), - } - a, err := s.Get(validServerAddress) - if err != nil { - t.Fatal(err) - } - - if a.Username != "foo" { - t.Fatalf("expected username `foo`, got %s", a.Username) - } - if a.Password != "bar" { - t.Fatalf("expected password `bar`, got %s", a.Password) - } - if a.IdentityToken != "" { - t.Fatalf("expected identity token to be empty, got %s", a.IdentityToken) - } - if a.Email != "foo@example.com" { - t.Fatalf("expected email `foo@example.com`, got %s", a.Email) - } -} - -func TestNativeStoreGetIdentityToken(t *testing.T) { - f := newConfigFile(map[string]types.AuthConfig{ - validServerAddress2: { - Email: "foo@example2.com", - }, - }) - f.CredentialsStore = "mock" - - s := &nativeStore{ - programFunc: mockCommandFn, - fileStore: NewFileStore(f), - } - a, err := s.Get(validServerAddress2) - if err != nil { - t.Fatal(err) - } - - if a.Username != "" { - t.Fatalf("expected username to be empty, got %s", a.Username) - } - if a.Password != "" { - t.Fatalf("expected password to be empty, got %s", a.Password) - } - if a.IdentityToken != "abcd1234" { - t.Fatalf("expected identity token `abcd1234`, got %s", a.IdentityToken) - } - if a.Email != "foo@example2.com" { - t.Fatalf("expected email `foo@example2.com`, got %s", a.Email) - } -} - -func TestNativeStoreGetAll(t *testing.T) { - f := newConfigFile(map[string]types.AuthConfig{ - validServerAddress: { - Email: "foo@example.com", - }, - }) - f.CredentialsStore = "mock" - - s := &nativeStore{ - programFunc: mockCommandFn, - fileStore: NewFileStore(f), - } - as, err := s.GetAll() - if err != nil { - t.Fatal(err) - } - - if len(as) != 2 { - t.Fatalf("wanted 2, got %d", len(as)) - } - - if as[validServerAddress].Username != "foo" { - t.Fatalf("expected username `foo` for %s, got %s", validServerAddress, as[validServerAddress].Username) - } - if as[validServerAddress].Password != "bar" { - t.Fatalf("expected password `bar` for %s, got %s", validServerAddress, as[validServerAddress].Password) - } - if as[validServerAddress].IdentityToken != "" { - t.Fatalf("expected identity to be empty for %s, got %s", validServerAddress, as[validServerAddress].IdentityToken) - } - if as[validServerAddress].Email != "foo@example.com" { - t.Fatalf("expected email `foo@example.com` for %s, got %s", validServerAddress, as[validServerAddress].Email) - } - if as[validServerAddress2].Username != "" { - t.Fatalf("expected username to be empty for %s, got %s", validServerAddress2, as[validServerAddress2].Username) - } - if as[validServerAddress2].Password != "" { - t.Fatalf("expected password to be empty for %s, got %s", validServerAddress2, as[validServerAddress2].Password) - } - if as[validServerAddress2].IdentityToken != "abcd1234" { - t.Fatalf("expected identity token `abcd1324` for %s, got %s", validServerAddress2, as[validServerAddress2].IdentityToken) - } - if as[validServerAddress2].Email != "" { - t.Fatalf("expected no email for %s, got %s", validServerAddress2, as[validServerAddress2].Email) - } -} - -func TestNativeStoreGetMissingCredentials(t *testing.T) { - f := newConfigFile(map[string]types.AuthConfig{ - validServerAddress: { - Email: "foo@example.com", - }, - }) - f.CredentialsStore = "mock" - - s := &nativeStore{ - programFunc: mockCommandFn, - fileStore: NewFileStore(f), - } - _, err := s.Get(missingCredsAddress) - if err != nil { - // missing credentials do not produce an error - t.Fatal(err) - } -} - -func TestNativeStoreGetInvalidAddress(t *testing.T) { - f := newConfigFile(map[string]types.AuthConfig{ - validServerAddress: { - Email: "foo@example.com", - }, - }) - f.CredentialsStore = "mock" - - s := &nativeStore{ - programFunc: mockCommandFn, - fileStore: NewFileStore(f), - } - _, err := s.Get(invalidServerAddress) - if err == nil { - t.Fatal("expected error, got nil") - } - - if !strings.Contains(err.Error(), "program failed") { - t.Fatalf("expected `program failed`, got %v", err) - } -} - -func TestNativeStoreErase(t *testing.T) { - f := newConfigFile(map[string]types.AuthConfig{ - validServerAddress: { - Email: "foo@example.com", - }, - }) - f.CredentialsStore = "mock" - - s := &nativeStore{ - programFunc: mockCommandFn, - fileStore: NewFileStore(f), - } - err := s.Erase(validServerAddress) - if err != nil { - t.Fatal(err) - } - - if len(f.AuthConfigs) != 0 { - t.Fatalf("expected 0 auth configs, got %d", len(f.AuthConfigs)) - } -} - -func TestNativeStoreEraseInvalidAddress(t *testing.T) { - f := newConfigFile(map[string]types.AuthConfig{ - validServerAddress: { - Email: "foo@example.com", - }, - }) - f.CredentialsStore = "mock" - - s := &nativeStore{ - programFunc: mockCommandFn, - fileStore: NewFileStore(f), - } - err := s.Erase(invalidServerAddress) - if err == nil { - t.Fatal("expected error, got nil") - } - - if !strings.Contains(err.Error(), "program failed") { - t.Fatalf("expected `program failed`, got %v", err) - } -} diff --git a/vendor/github.com/docker/docker/client/testdata/ca.pem b/vendor/github.com/docker/docker/client/testdata/ca.pem deleted file mode 100644 index ad14d4706..000000000 --- a/vendor/github.com/docker/docker/client/testdata/ca.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC0jCCAbqgAwIBAgIRAILlP5WWLaHkQ/m2ASHP7SowDQYJKoZIhvcNAQELBQAw -EjEQMA4GA1UEChMHdmluY2VudDAeFw0xNjAzMjQxMDE5MDBaFw0xOTAzMDkxMDE5 -MDBaMBIxEDAOBgNVBAoTB3ZpbmNlbnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQD0yZPKAGncoaxaU/QW9tWEHbrvDoGVF/65L8Si/jBrlAgLjhmmV1di -vKG9QPzuU8snxHro3/uCwyA6kTqw0U8bGwHxJq2Bpa6JBYj8N2jMJ+M+sjXgSo2t -E0zIzjTW2Pir3C8qwfrVL6NFp9xClwMD23SFZ0UsEH36NkfyrKBVeM8IOjJd4Wjs -xIcuvF3BTVkji84IJBW2JIKf9ZrzJwUlSCPgptRp4Evdbyp5d+UPxtwxD7qjW4lM -yQQ8vfcC4lKkVx5s/RNJ4fzd5uEgLdEbZ20qt7Zt/bLcxFHpUhH2teA0QjmrOWFh -gbL83s95/+hbSVhsO4hoFW7vTeiCCY4xAgMBAAGjIzAhMA4GA1UdDwEB/wQEAwIC -rDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBY51RHajuDuhO2 -tcm26jeNROzfffnjhvbOVPjSEdo9vI3JpMU/RuQw+nbNcLwJrdjL6UH7tD/36Y+q -NXH+xSIjWFH0zXGxrIUsVrvt6f8CbOvw7vD+gygOG+849PDQMbL6czP8rvXY7vZV -9pdpQfrENk4b5kePRW/6HaGSTvtgN7XOrYD9fp3pm/G534T2e3IxgYMRNwdB9Ul9 -bLwMqQqf4eiqqMs6x4IVmZUkGVMKiFKcvkNg9a+Ozx5pMizHeAezWMcZ5V+QJZVT -8lElSCKZ2Yy2xkcl7aeQMLwcAeZwfTp+Yu9dVzlqXiiBTLd1+LtAQCuKHzmw4Q8k -EvD5m49l ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/docker/client/testdata/cert.pem b/vendor/github.com/docker/docker/client/testdata/cert.pem deleted file mode 100644 index 9000ffb32..000000000 --- a/vendor/github.com/docker/docker/client/testdata/cert.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC8DCCAdigAwIBAgIRAJAS1glgcke4q7eCaretwgUwDQYJKoZIhvcNAQELBQAw -EjEQMA4GA1UEChMHdmluY2VudDAeFw0xNjAzMjQxMDE5MDBaFw0xOTAzMDkxMDE5 -MDBaMB4xHDAaBgNVBAoME3ZpbmNlbnQuPGJvb3RzdHJhcD4wggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQClpvG442dGEvrRgmCrqY4kBml1LVlw2Y7ZDn6B -TKa52+MuGDmfXbO1UhclNqTXjLgAwKjPz/OvnPRxNEUoQEDbBd+Xev7rxTY5TvYI -27YH3fMH2LL2j62jum649abfhZ6ekD5eD8tCn3mnrEOgqRIlK7efPIVixq/ZqU1H -7ez0ggB7dmWHlhnUaxyQOCSnAX/7nKYQXqZgVvGhDeR2jp7GcnhbK/qPrZ/mOm83 -2IjCeYN145opYlzTSp64GYIZz7uqMNcnDKK37ZbS8MYcTjrRaHEiqZVVdIC+ghbx -qYqzbZRVfgztI9jwmifn0mYrN4yt+nhNYwBcRJ4Pv3uLFbo7AgMBAAGjNTAzMA4G -A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAA -MA0GCSqGSIb3DQEBCwUAA4IBAQDg1r7nksjYgDFYEcBbrRrRHddIoK+RVmSBTTrq -8giC77m0srKdh9XTVWK1PUbGfODV1oD8m9QhPE8zPDyYQ8jeXNRSU5wXdkrTRmmY -w/T3SREqmE7CObMtusokHidjYFuqqCR07sJzqBKRlzr3o0EGe3tuEhUlF5ARY028 -eipaDcVlT5ChGcDa6LeJ4e05u4cVap0dd6Rp1w3Rx1AYAecdgtgBMnw1iWdl/nrC -sp26ZXNaAhFOUovlY9VY257AMd9hQV7WvAK4yNEHcckVu3uXTBmDgNSOPtl0QLsL -Kjlj75ksCx8nCln/hCut/0+kGTsGZqdV5c6ktgcGYRir/5Hs ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/docker/client/testdata/key.pem b/vendor/github.com/docker/docker/client/testdata/key.pem deleted file mode 100644 index c0869dfc1..000000000 --- a/vendor/github.com/docker/docker/client/testdata/key.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEApabxuONnRhL60YJgq6mOJAZpdS1ZcNmO2Q5+gUymudvjLhg5 -n12ztVIXJTak14y4AMCoz8/zr5z0cTRFKEBA2wXfl3r+68U2OU72CNu2B93zB9iy -9o+to7puuPWm34WenpA+Xg/LQp95p6xDoKkSJSu3nzyFYsav2alNR+3s9IIAe3Zl -h5YZ1GsckDgkpwF/+5ymEF6mYFbxoQ3kdo6exnJ4Wyv6j62f5jpvN9iIwnmDdeOa -KWJc00qeuBmCGc+7qjDXJwyit+2W0vDGHE460WhxIqmVVXSAvoIW8amKs22UVX4M -7SPY8Jon59JmKzeMrfp4TWMAXESeD797ixW6OwIDAQABAoIBAHfyAAleL8NfrtnR -S+pApbmUIvxD0AWUooispBE/zWG6xC72P5MTqDJctIGvpYCmVf3Fgvamns7EGYN2 -07Sngc6V3Ca1WqyhaffpIuGbJZ1gqr89u6gotRRexBmNVj13ZTlvPJmjWgxtqQsu -AvHsOkVL+HOGwRaaw24Z1umEcBVCepl7PGTqsLeJUtBUZBiqdJTu4JYLAB6BggBI -OxhHoTWvlNWwzezo2C/IXkXcXD/tp3i5vTn5rAXHSMQkdMAUh7/xJ73Fl36gxZhp -W7NoPKaS9qNh8jhs6p54S7tInb6+mrKtvRFKl5XAR3istXrXteT5UaukpuBbQ/5d -qf4BXuECgYEAzoOKxMee5tG/G9iC6ImNq5xGAZm0OnmteNgIEQj49If1Q68av525 -FioqdC9zV+blfHQqXEIUeum4JAou4xqmB8Lw2H0lYwOJ1IkpUy3QJjU1IrI+U5Qy -ryZuA9cxSTLf1AJFbROsoZDpjaBh0uUQkD/4PHpwXMgHu/3CaJ4nTEkCgYEAzVjE -VWgczWJGyRxmHSeR51ft1jrlChZHEd3HwgLfo854JIj+MGUH4KPLSMIkYNuyiwNQ -W7zdXCB47U8afSL/lPTv1M5+ZsWY6sZAT6gtp/IeU0Va943h9cj10fAOBJaz1H6M -jnZS4jjWhVInE7wpCDVCwDRoHHJ84kb6JeflamMCgYBDQDcKie9HP3q6uLE4xMKr -5gIuNz2n5UQGnGNUGNXp2/SVDArr55MEksqsd19aesi01KeOz74XoNDke6R1NJJo -6KTB+08XhWl3GwuoGL02FBGvsNf3I8W1oBAnlAZqzfRx+CNfuA55ttU318jDgvD3 -6L0QBNdef411PNf4dbhacQKBgAd/e0PHFm4lbYJAaDYeUMSKwGN3KQ/SOmwblgSu -iC36BwcGfYmU1tHMCUsx05Q50W4kA9Ylskt/4AqCPexdz8lHnE4/7/uesXO5I3YF -JQ2h2Jufx6+MXbjUyq0Mv+ZI/m3+5PD6vxIFk0ew9T5SO4lSMIrGHxsSzx6QCuhB -bG4TAoGBAJ5PWG7d2CyCjLtfF8J4NxykRvIQ8l/3kDvDdNrXiXbgonojo2lgRYaM -5LoK9ApN8KHdedpTRipBaDA22Sp5SjMcUE7A6q42PJCL9r+BRYF0foFQx/rqpCff -pVWKgwIPoKnfxDqN1RUgyFcx1jbA3XVJZCuT+wbMuDQ9nlvulD1W ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/docker/cmd/docker/daemon_none.go b/vendor/github.com/docker/docker/cmd/docker/daemon_none.go deleted file mode 100644 index 65f9f37be..000000000 --- a/vendor/github.com/docker/docker/cmd/docker/daemon_none.go +++ /dev/null @@ -1,27 +0,0 @@ -// +build !daemon - -package main - -import ( - "fmt" - "runtime" - "strings" - - "github.com/spf13/cobra" -) - -func newDaemonCommand() *cobra.Command { - return &cobra.Command{ - Use: "daemon", - Hidden: true, - RunE: func(cmd *cobra.Command, args []string) error { - return runDaemon() - }, - } -} - -func runDaemon() error { - return fmt.Errorf( - "`docker daemon` is not supported on %s. Please run `dockerd` directly", - strings.Title(runtime.GOOS)) -} diff --git a/vendor/github.com/docker/docker/cmd/docker/daemon_none_test.go b/vendor/github.com/docker/docker/cmd/docker/daemon_none_test.go deleted file mode 100644 index 32032fe1b..000000000 --- a/vendor/github.com/docker/docker/cmd/docker/daemon_none_test.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build !daemon - -package main - -import ( - "testing" - - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestDaemonCommand(t *testing.T) { - cmd := newDaemonCommand() - cmd.SetArgs([]string{"--help"}) - err := cmd.Execute() - - assert.Error(t, err, "Please run `dockerd`") -} diff --git a/vendor/github.com/docker/docker/cmd/docker/daemon_unit_test.go b/vendor/github.com/docker/docker/cmd/docker/daemon_unit_test.go deleted file mode 100644 index 26348a884..000000000 --- a/vendor/github.com/docker/docker/cmd/docker/daemon_unit_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build daemon - -package main - -import ( - "testing" - - "github.com/docker/docker/pkg/testutil/assert" - "github.com/spf13/cobra" -) - -func stubRun(cmd *cobra.Command, args []string) error { - return nil -} - -func TestDaemonCommandHelp(t *testing.T) { - cmd := newDaemonCommand() - cmd.RunE = stubRun - cmd.SetArgs([]string{"--help"}) - err := cmd.Execute() - assert.NilError(t, err) -} - -func TestDaemonCommand(t *testing.T) { - cmd := newDaemonCommand() - cmd.RunE = stubRun - cmd.SetArgs([]string{"--containerd", "/foo"}) - err := cmd.Execute() - assert.NilError(t, err) -} diff --git a/vendor/github.com/docker/docker/cmd/docker/daemon_unix.go b/vendor/github.com/docker/docker/cmd/docker/daemon_unix.go deleted file mode 100644 index f68d220c2..000000000 --- a/vendor/github.com/docker/docker/cmd/docker/daemon_unix.go +++ /dev/null @@ -1,79 +0,0 @@ -// +build daemon - -package main - -import ( - "fmt" - - "os" - "os/exec" - "path/filepath" - "syscall" - - "github.com/spf13/cobra" -) - -const daemonBinary = "dockerd" - -func newDaemonCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "daemon", - Hidden: true, - Args: cobra.ArbitraryArgs, - DisableFlagParsing: true, - RunE: func(cmd *cobra.Command, args []string) error { - return runDaemon() - }, - Deprecated: "and will be removed in Docker 1.16. Please run `dockerd` directly.", - } - cmd.SetHelpFunc(helpFunc) - return cmd -} - -// CmdDaemon execs dockerd with the same flags -func runDaemon() error { - // Use os.Args[1:] so that "global" args are passed to dockerd - return execDaemon(stripDaemonArg(os.Args[1:])) -} - -func execDaemon(args []string) error { - binaryPath, err := findDaemonBinary() - if err != nil { - return err - } - - return syscall.Exec( - binaryPath, - append([]string{daemonBinary}, args...), - os.Environ()) -} - -func helpFunc(cmd *cobra.Command, args []string) { - if err := execDaemon([]string{"--help"}); err != nil { - fmt.Fprintf(os.Stderr, "%s\n", err.Error()) - } -} - -// findDaemonBinary looks for the path to the dockerd binary starting with -// the directory of the current executable (if one exists) and followed by $PATH -func findDaemonBinary() (string, error) { - execDirname := filepath.Dir(os.Args[0]) - if execDirname != "" { - binaryPath := filepath.Join(execDirname, daemonBinary) - if _, err := os.Stat(binaryPath); err == nil { - return binaryPath, nil - } - } - - return exec.LookPath(daemonBinary) -} - -// stripDaemonArg removes the `daemon` argument from the list -func stripDaemonArg(args []string) []string { - for i, arg := range args { - if arg == "daemon" { - return append(args[:i], args[i+1:]...) - } - } - return args -} diff --git a/vendor/github.com/docker/docker/cmd/docker/docker.go b/vendor/github.com/docker/docker/cmd/docker/docker.go deleted file mode 100644 index d4847a90e..000000000 --- a/vendor/github.com/docker/docker/cmd/docker/docker.go +++ /dev/null @@ -1,180 +0,0 @@ -package main - -import ( - "errors" - "fmt" - "os" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/cli" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/commands" - cliflags "github.com/docker/docker/cli/flags" - "github.com/docker/docker/cliconfig" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/pkg/term" - "github.com/docker/docker/utils" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -func newDockerCommand(dockerCli *command.DockerCli) *cobra.Command { - opts := cliflags.NewClientOptions() - var flags *pflag.FlagSet - - cmd := &cobra.Command{ - Use: "docker [OPTIONS] COMMAND [ARG...]", - Short: "A self-sufficient runtime for containers", - SilenceUsage: true, - SilenceErrors: true, - TraverseChildren: true, - Args: noArgs, - RunE: func(cmd *cobra.Command, args []string) error { - if opts.Version { - showVersion() - return nil - } - return dockerCli.ShowHelp(cmd, args) - }, - PersistentPreRunE: func(cmd *cobra.Command, args []string) error { - // daemon command is special, we redirect directly to another binary - if cmd.Name() == "daemon" { - return nil - } - // flags must be the top-level command flags, not cmd.Flags() - opts.Common.SetDefaultOptions(flags) - dockerPreRun(opts) - if err := dockerCli.Initialize(opts); err != nil { - return err - } - return isSupported(cmd, dockerCli.Client().ClientVersion(), dockerCli.HasExperimental()) - }, - } - cli.SetupRootCommand(cmd) - - cmd.SetHelpFunc(func(ccmd *cobra.Command, args []string) { - if dockerCli.Client() == nil { // when using --help, PersistenPreRun is not called, so initialization is needed. - // flags must be the top-level command flags, not cmd.Flags() - opts.Common.SetDefaultOptions(flags) - dockerPreRun(opts) - dockerCli.Initialize(opts) - } - - if err := isSupported(ccmd, dockerCli.Client().ClientVersion(), dockerCli.HasExperimental()); err != nil { - ccmd.Println(err) - return - } - - hideUnsupportedFeatures(ccmd, dockerCli.Client().ClientVersion(), dockerCli.HasExperimental()) - - if err := ccmd.Help(); err != nil { - ccmd.Println(err) - } - }) - - flags = cmd.Flags() - flags.BoolVarP(&opts.Version, "version", "v", false, "Print version information and quit") - flags.StringVar(&opts.ConfigDir, "config", cliconfig.ConfigDir(), "Location of client config files") - opts.Common.InstallFlags(flags) - - cmd.SetOutput(dockerCli.Out()) - cmd.AddCommand(newDaemonCommand()) - commands.AddCommands(cmd, dockerCli) - - return cmd -} - -func noArgs(cmd *cobra.Command, args []string) error { - if len(args) == 0 { - return nil - } - return fmt.Errorf( - "docker: '%s' is not a docker command.\nSee 'docker --help'", args[0]) -} - -func main() { - // Set terminal emulation based on platform as required. - stdin, stdout, stderr := term.StdStreams() - logrus.SetOutput(stderr) - - dockerCli := command.NewDockerCli(stdin, stdout, stderr) - cmd := newDockerCommand(dockerCli) - - if err := cmd.Execute(); err != nil { - if sterr, ok := err.(cli.StatusError); ok { - if sterr.Status != "" { - fmt.Fprintln(stderr, sterr.Status) - } - // StatusError should only be used for errors, and all errors should - // have a non-zero exit status, so never exit with 0 - if sterr.StatusCode == 0 { - os.Exit(1) - } - os.Exit(sterr.StatusCode) - } - fmt.Fprintln(stderr, err) - os.Exit(1) - } -} - -func showVersion() { - fmt.Printf("Docker version %s, build %s\n", dockerversion.Version, dockerversion.GitCommit) -} - -func dockerPreRun(opts *cliflags.ClientOptions) { - cliflags.SetLogLevel(opts.Common.LogLevel) - - if opts.ConfigDir != "" { - cliconfig.SetConfigDir(opts.ConfigDir) - } - - if opts.Common.Debug { - utils.EnableDebug() - } -} - -func hideUnsupportedFeatures(cmd *cobra.Command, clientVersion string, hasExperimental bool) { - cmd.Flags().VisitAll(func(f *pflag.Flag) { - // hide experimental flags - if !hasExperimental { - if _, ok := f.Annotations["experimental"]; ok { - f.Hidden = true - } - } - - // hide flags not supported by the server - if flagVersion, ok := f.Annotations["version"]; ok && len(flagVersion) == 1 && versions.LessThan(clientVersion, flagVersion[0]) { - f.Hidden = true - } - - }) - - for _, subcmd := range cmd.Commands() { - // hide experimental subcommands - if !hasExperimental { - if _, ok := subcmd.Tags["experimental"]; ok { - subcmd.Hidden = true - } - } - - // hide subcommands not supported by the server - if subcmdVersion, ok := subcmd.Tags["version"]; ok && versions.LessThan(clientVersion, subcmdVersion) { - subcmd.Hidden = true - } - } -} - -func isSupported(cmd *cobra.Command, clientVersion string, hasExperimental bool) error { - if !hasExperimental { - if _, ok := cmd.Tags["experimental"]; ok { - return errors.New("only supported with experimental daemon") - } - } - - if cmdVersion, ok := cmd.Tags["version"]; ok && versions.LessThan(clientVersion, cmdVersion) { - return fmt.Errorf("only supported with daemon version >= %s", cmdVersion) - } - - return nil -} diff --git a/vendor/github.com/docker/docker/cmd/docker/docker_test.go b/vendor/github.com/docker/docker/cmd/docker/docker_test.go deleted file mode 100644 index 8738f6005..000000000 --- a/vendor/github.com/docker/docker/cmd/docker/docker_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package main - -import ( - "io/ioutil" - "os" - "testing" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/cli/command" - "github.com/docker/docker/pkg/testutil/assert" - "github.com/docker/docker/utils" -) - -func TestClientDebugEnabled(t *testing.T) { - defer utils.DisableDebug() - - cmd := newDockerCommand(&command.DockerCli{}) - cmd.Flags().Set("debug", "true") - - err := cmd.PersistentPreRunE(cmd, []string{}) - assert.NilError(t, err) - assert.Equal(t, os.Getenv("DEBUG"), "1") - assert.Equal(t, logrus.GetLevel(), logrus.DebugLevel) -} - -func TestExitStatusForInvalidSubcommandWithHelpFlag(t *testing.T) { - discard := ioutil.Discard - cmd := newDockerCommand(command.NewDockerCli(os.Stdin, discard, discard)) - cmd.SetArgs([]string{"help", "invalid"}) - err := cmd.Execute() - assert.Error(t, err, "unknown help topic: invalid") -} diff --git a/vendor/github.com/docker/docker/cmd/docker/docker_windows.go b/vendor/github.com/docker/docker/cmd/docker/docker_windows.go deleted file mode 100644 index 9bc507e20..000000000 --- a/vendor/github.com/docker/docker/cmd/docker/docker_windows.go +++ /dev/null @@ -1,18 +0,0 @@ -package main - -import ( - "sync/atomic" - - _ "github.com/docker/docker/autogen/winresources/docker" -) - -//go:cgo_import_dynamic main.dummy CommandLineToArgvW%2 "shell32.dll" - -var dummy uintptr - -func init() { - // Ensure that this import is not removed by the linker. This is used to - // ensure that shell32.dll is loaded by the system loader, preventing - // go#15286 from triggering on Nano Server TP5. - atomic.LoadUintptr(&dummy) -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/README.md b/vendor/github.com/docker/docker/cmd/dockerd/README.md deleted file mode 100644 index a8c20b354..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/README.md +++ /dev/null @@ -1,3 +0,0 @@ -docker.go contains Docker daemon's main function. - -This file provides first line CLI argument parsing and environment variable setting. diff --git a/vendor/github.com/docker/docker/cmd/dockerd/daemon.go b/vendor/github.com/docker/docker/cmd/dockerd/daemon.go deleted file mode 100644 index 2f099e019..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/daemon.go +++ /dev/null @@ -1,524 +0,0 @@ -package main - -import ( - "crypto/tls" - "fmt" - "io" - "os" - "path/filepath" - "runtime" - "strings" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/uuid" - "github.com/docker/docker/api" - apiserver "github.com/docker/docker/api/server" - "github.com/docker/docker/api/server/middleware" - "github.com/docker/docker/api/server/router" - "github.com/docker/docker/api/server/router/build" - checkpointrouter "github.com/docker/docker/api/server/router/checkpoint" - "github.com/docker/docker/api/server/router/container" - "github.com/docker/docker/api/server/router/image" - "github.com/docker/docker/api/server/router/network" - pluginrouter "github.com/docker/docker/api/server/router/plugin" - swarmrouter "github.com/docker/docker/api/server/router/swarm" - systemrouter "github.com/docker/docker/api/server/router/system" - "github.com/docker/docker/api/server/router/volume" - "github.com/docker/docker/builder/dockerfile" - cliflags "github.com/docker/docker/cli/flags" - "github.com/docker/docker/cliconfig" - "github.com/docker/docker/daemon" - "github.com/docker/docker/daemon/cluster" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/libcontainerd" - dopts "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/authorization" - "github.com/docker/docker/pkg/jsonlog" - "github.com/docker/docker/pkg/listeners" - "github.com/docker/docker/pkg/pidfile" - "github.com/docker/docker/pkg/plugingetter" - "github.com/docker/docker/pkg/signal" - "github.com/docker/docker/pkg/system" - "github.com/docker/docker/registry" - "github.com/docker/docker/runconfig" - "github.com/docker/docker/utils" - "github.com/docker/go-connections/tlsconfig" - "github.com/spf13/pflag" -) - -const ( - flagDaemonConfigFile = "config-file" -) - -// DaemonCli represents the daemon CLI. -type DaemonCli struct { - *daemon.Config - configFile *string - flags *pflag.FlagSet - - api *apiserver.Server - d *daemon.Daemon - authzMiddleware *authorization.Middleware // authzMiddleware enables to dynamically reload the authorization plugins -} - -// NewDaemonCli returns a daemon CLI -func NewDaemonCli() *DaemonCli { - return &DaemonCli{} -} - -func migrateKey(config *daemon.Config) (err error) { - // No migration necessary on Windows - if runtime.GOOS == "windows" { - return nil - } - - // Migrate trust key if exists at ~/.docker/key.json and owned by current user - oldPath := filepath.Join(cliconfig.ConfigDir(), cliflags.DefaultTrustKeyFile) - newPath := filepath.Join(getDaemonConfDir(config.Root), cliflags.DefaultTrustKeyFile) - if _, statErr := os.Stat(newPath); os.IsNotExist(statErr) && currentUserIsOwner(oldPath) { - defer func() { - // Ensure old path is removed if no error occurred - if err == nil { - err = os.Remove(oldPath) - } else { - logrus.Warnf("Key migration failed, key file not removed at %s", oldPath) - os.Remove(newPath) - } - }() - - if err := system.MkdirAll(getDaemonConfDir(config.Root), os.FileMode(0644)); err != nil { - return fmt.Errorf("Unable to create daemon configuration directory: %s", err) - } - - newFile, err := os.OpenFile(newPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) - if err != nil { - return fmt.Errorf("error creating key file %q: %s", newPath, err) - } - defer newFile.Close() - - oldFile, err := os.Open(oldPath) - if err != nil { - return fmt.Errorf("error opening key file %q: %s", oldPath, err) - } - defer oldFile.Close() - - if _, err := io.Copy(newFile, oldFile); err != nil { - return fmt.Errorf("error copying key: %s", err) - } - - logrus.Infof("Migrated key from %s to %s", oldPath, newPath) - } - - return nil -} - -func (cli *DaemonCli) start(opts daemonOptions) (err error) { - stopc := make(chan bool) - defer close(stopc) - - // warn from uuid package when running the daemon - uuid.Loggerf = logrus.Warnf - - opts.common.SetDefaultOptions(opts.flags) - - if cli.Config, err = loadDaemonCliConfig(opts); err != nil { - return err - } - cli.configFile = &opts.configFile - cli.flags = opts.flags - - if opts.common.TrustKey == "" { - opts.common.TrustKey = filepath.Join( - getDaemonConfDir(cli.Config.Root), - cliflags.DefaultTrustKeyFile) - } - - if cli.Config.Debug { - utils.EnableDebug() - } - - if cli.Config.Experimental { - logrus.Warn("Running experimental build") - } - - logrus.SetFormatter(&logrus.TextFormatter{ - TimestampFormat: jsonlog.RFC3339NanoFixed, - DisableColors: cli.Config.RawLogs, - }) - - if err := setDefaultUmask(); err != nil { - return fmt.Errorf("Failed to set umask: %v", err) - } - - if len(cli.LogConfig.Config) > 0 { - if err := logger.ValidateLogOpts(cli.LogConfig.Type, cli.LogConfig.Config); err != nil { - return fmt.Errorf("Failed to set log opts: %v", err) - } - } - - // Create the daemon root before we create ANY other files (PID, or migrate keys) - // to ensure the appropriate ACL is set (particularly relevant on Windows) - if err := daemon.CreateDaemonRoot(cli.Config); err != nil { - return err - } - - if cli.Pidfile != "" { - pf, err := pidfile.New(cli.Pidfile) - if err != nil { - return fmt.Errorf("Error starting daemon: %v", err) - } - defer func() { - if err := pf.Remove(); err != nil { - logrus.Error(err) - } - }() - } - - serverConfig := &apiserver.Config{ - Logging: true, - SocketGroup: cli.Config.SocketGroup, - Version: dockerversion.Version, - EnableCors: cli.Config.EnableCors, - CorsHeaders: cli.Config.CorsHeaders, - } - - if cli.Config.TLS { - tlsOptions := tlsconfig.Options{ - CAFile: cli.Config.CommonTLSOptions.CAFile, - CertFile: cli.Config.CommonTLSOptions.CertFile, - KeyFile: cli.Config.CommonTLSOptions.KeyFile, - } - - if cli.Config.TLSVerify { - // server requires and verifies client's certificate - tlsOptions.ClientAuth = tls.RequireAndVerifyClientCert - } - tlsConfig, err := tlsconfig.Server(tlsOptions) - if err != nil { - return err - } - serverConfig.TLSConfig = tlsConfig - } - - if len(cli.Config.Hosts) == 0 { - cli.Config.Hosts = make([]string, 1) - } - - api := apiserver.New(serverConfig) - cli.api = api - - for i := 0; i < len(cli.Config.Hosts); i++ { - var err error - if cli.Config.Hosts[i], err = dopts.ParseHost(cli.Config.TLS, cli.Config.Hosts[i]); err != nil { - return fmt.Errorf("error parsing -H %s : %v", cli.Config.Hosts[i], err) - } - - protoAddr := cli.Config.Hosts[i] - protoAddrParts := strings.SplitN(protoAddr, "://", 2) - if len(protoAddrParts) != 2 { - return fmt.Errorf("bad format %s, expected PROTO://ADDR", protoAddr) - } - - proto := protoAddrParts[0] - addr := protoAddrParts[1] - - // It's a bad idea to bind to TCP without tlsverify. - if proto == "tcp" && (serverConfig.TLSConfig == nil || serverConfig.TLSConfig.ClientAuth != tls.RequireAndVerifyClientCert) { - logrus.Warn("[!] DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING [!]") - } - ls, err := listeners.Init(proto, addr, serverConfig.SocketGroup, serverConfig.TLSConfig) - if err != nil { - return err - } - ls = wrapListeners(proto, ls) - // If we're binding to a TCP port, make sure that a container doesn't try to use it. - if proto == "tcp" { - if err := allocateDaemonPort(addr); err != nil { - return err - } - } - logrus.Debugf("Listener created for HTTP on %s (%s)", proto, addr) - api.Accept(addr, ls...) - } - - if err := migrateKey(cli.Config); err != nil { - return err - } - - // FIXME: why is this down here instead of with the other TrustKey logic above? - cli.TrustKeyPath = opts.common.TrustKey - - registryService := registry.NewService(cli.Config.ServiceOptions) - containerdRemote, err := libcontainerd.New(cli.getLibcontainerdRoot(), cli.getPlatformRemoteOptions()...) - if err != nil { - return err - } - signal.Trap(func() { - cli.stop() - <-stopc // wait for daemonCli.start() to return - }) - - d, err := daemon.NewDaemon(cli.Config, registryService, containerdRemote) - if err != nil { - return fmt.Errorf("Error starting daemon: %v", err) - } - - if cli.Config.MetricsAddress != "" { - if !d.HasExperimental() { - return fmt.Errorf("metrics-addr is only supported when experimental is enabled") - } - if err := startMetricsServer(cli.Config.MetricsAddress); err != nil { - return err - } - } - - name, _ := os.Hostname() - - c, err := cluster.New(cluster.Config{ - Root: cli.Config.Root, - Name: name, - Backend: d, - NetworkSubnetsProvider: d, - DefaultAdvertiseAddr: cli.Config.SwarmDefaultAdvertiseAddr, - RuntimeRoot: cli.getSwarmRunRoot(), - }) - if err != nil { - logrus.Fatalf("Error creating cluster component: %v", err) - } - - // Restart all autostart containers which has a swarm endpoint - // and is not yet running now that we have successfully - // initialized the cluster. - d.RestartSwarmContainers() - - logrus.Info("Daemon has completed initialization") - - logrus.WithFields(logrus.Fields{ - "version": dockerversion.Version, - "commit": dockerversion.GitCommit, - "graphdriver": d.GraphDriverName(), - }).Info("Docker daemon") - - cli.d = d - - // initMiddlewares needs cli.d to be populated. Dont change this init order. - if err := cli.initMiddlewares(api, serverConfig); err != nil { - logrus.Fatalf("Error creating middlewares: %v", err) - } - d.SetCluster(c) - initRouter(api, d, c) - - cli.setupConfigReloadTrap() - - // The serve API routine never exits unless an error occurs - // We need to start it as a goroutine and wait on it so - // daemon doesn't exit - serveAPIWait := make(chan error) - go api.Wait(serveAPIWait) - - // after the daemon is done setting up we can notify systemd api - notifySystem() - - // Daemon is fully initialized and handling API traffic - // Wait for serve API to complete - errAPI := <-serveAPIWait - c.Cleanup() - shutdownDaemon(d) - containerdRemote.Cleanup() - if errAPI != nil { - return fmt.Errorf("Shutting down due to ServeAPI error: %v", errAPI) - } - - return nil -} - -func (cli *DaemonCli) reloadConfig() { - reload := func(config *daemon.Config) { - - // Revalidate and reload the authorization plugins - if err := validateAuthzPlugins(config.AuthorizationPlugins, cli.d.PluginStore); err != nil { - logrus.Fatalf("Error validating authorization plugin: %v", err) - return - } - cli.authzMiddleware.SetPlugins(config.AuthorizationPlugins) - - if err := cli.d.Reload(config); err != nil { - logrus.Errorf("Error reconfiguring the daemon: %v", err) - return - } - - if config.IsValueSet("debug") { - debugEnabled := utils.IsDebugEnabled() - switch { - case debugEnabled && !config.Debug: // disable debug - utils.DisableDebug() - cli.api.DisableProfiler() - case config.Debug && !debugEnabled: // enable debug - utils.EnableDebug() - cli.api.EnableProfiler() - } - - } - } - - if err := daemon.ReloadConfiguration(*cli.configFile, cli.flags, reload); err != nil { - logrus.Error(err) - } -} - -func (cli *DaemonCli) stop() { - cli.api.Close() -} - -// shutdownDaemon just wraps daemon.Shutdown() to handle a timeout in case -// d.Shutdown() is waiting too long to kill container or worst it's -// blocked there -func shutdownDaemon(d *daemon.Daemon) { - shutdownTimeout := d.ShutdownTimeout() - ch := make(chan struct{}) - go func() { - d.Shutdown() - close(ch) - }() - if shutdownTimeout < 0 { - <-ch - logrus.Debug("Clean shutdown succeeded") - return - } - select { - case <-ch: - logrus.Debug("Clean shutdown succeeded") - case <-time.After(time.Duration(shutdownTimeout) * time.Second): - logrus.Error("Force shutdown daemon") - } -} - -func loadDaemonCliConfig(opts daemonOptions) (*daemon.Config, error) { - config := opts.daemonConfig - flags := opts.flags - config.Debug = opts.common.Debug - config.Hosts = opts.common.Hosts - config.LogLevel = opts.common.LogLevel - config.TLS = opts.common.TLS - config.TLSVerify = opts.common.TLSVerify - config.CommonTLSOptions = daemon.CommonTLSOptions{} - - if opts.common.TLSOptions != nil { - config.CommonTLSOptions.CAFile = opts.common.TLSOptions.CAFile - config.CommonTLSOptions.CertFile = opts.common.TLSOptions.CertFile - config.CommonTLSOptions.KeyFile = opts.common.TLSOptions.KeyFile - } - - if opts.configFile != "" { - c, err := daemon.MergeDaemonConfigurations(config, flags, opts.configFile) - if err != nil { - if flags.Changed(flagDaemonConfigFile) || !os.IsNotExist(err) { - return nil, fmt.Errorf("unable to configure the Docker daemon with file %s: %v\n", opts.configFile, err) - } - } - // the merged configuration can be nil if the config file didn't exist. - // leave the current configuration as it is if when that happens. - if c != nil { - config = c - } - } - - if err := daemon.ValidateConfiguration(config); err != nil { - return nil, err - } - - // Labels of the docker engine used to allow multiple values associated with the same key. - // This is deprecated in 1.13, and, be removed after 3 release cycles. - // The following will check the conflict of labels, and report a warning for deprecation. - // - // TODO: After 3 release cycles (1.16) an error will be returned, and labels will be - // sanitized to consolidate duplicate key-value pairs (config.Labels = newLabels): - // - // newLabels, err := daemon.GetConflictFreeLabels(config.Labels) - // if err != nil { - // return nil, err - // } - // config.Labels = newLabels - // - if _, err := daemon.GetConflictFreeLabels(config.Labels); err != nil { - logrus.Warnf("Engine labels with duplicate keys and conflicting values have been deprecated: %s", err) - } - - // Regardless of whether the user sets it to true or false, if they - // specify TLSVerify at all then we need to turn on TLS - if config.IsValueSet(cliflags.FlagTLSVerify) { - config.TLS = true - } - - // ensure that the log level is the one set after merging configurations - cliflags.SetLogLevel(config.LogLevel) - - return config, nil -} - -func initRouter(s *apiserver.Server, d *daemon.Daemon, c *cluster.Cluster) { - decoder := runconfig.ContainerDecoder{} - - routers := []router.Router{ - // we need to add the checkpoint router before the container router or the DELETE gets masked - checkpointrouter.NewRouter(d, decoder), - container.NewRouter(d, decoder), - image.NewRouter(d, decoder), - systemrouter.NewRouter(d, c), - volume.NewRouter(d), - build.NewRouter(dockerfile.NewBuildManager(d)), - swarmrouter.NewRouter(c), - pluginrouter.NewRouter(d.PluginManager()), - } - - if d.NetworkControllerEnabled() { - routers = append(routers, network.NewRouter(d, c)) - } - - if d.HasExperimental() { - for _, r := range routers { - for _, route := range r.Routes() { - if experimental, ok := route.(router.ExperimentalRoute); ok { - experimental.Enable() - } - } - } - } - - s.InitRouter(utils.IsDebugEnabled(), routers...) -} - -func (cli *DaemonCli) initMiddlewares(s *apiserver.Server, cfg *apiserver.Config) error { - v := cfg.Version - - exp := middleware.NewExperimentalMiddleware(cli.d.HasExperimental()) - s.UseMiddleware(exp) - - vm := middleware.NewVersionMiddleware(v, api.DefaultVersion, api.MinVersion) - s.UseMiddleware(vm) - - if cfg.EnableCors { - c := middleware.NewCORSMiddleware(cfg.CorsHeaders) - s.UseMiddleware(c) - } - - if err := validateAuthzPlugins(cli.Config.AuthorizationPlugins, cli.d.PluginStore); err != nil { - return fmt.Errorf("Error validating authorization plugin: %v", err) - } - cli.authzMiddleware = authorization.NewMiddleware(cli.Config.AuthorizationPlugins, cli.d.PluginStore) - s.UseMiddleware(cli.authzMiddleware) - return nil -} - -// validates that the plugins requested with the --authorization-plugin flag are valid AuthzDriver -// plugins present on the host and available to the daemon -func validateAuthzPlugins(requestedPlugins []string, pg plugingetter.PluginGetter) error { - for _, reqPlugin := range requestedPlugins { - if _, err := pg.Get(reqPlugin, authorization.AuthZApiImplements, plugingetter.LOOKUP); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/daemon_freebsd.go b/vendor/github.com/docker/docker/cmd/dockerd/daemon_freebsd.go deleted file mode 100644 index 623aaf4b0..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/daemon_freebsd.go +++ /dev/null @@ -1,5 +0,0 @@ -package main - -// notifySystem sends a message to the host when the server is ready to be used -func notifySystem() { -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/daemon_linux.go b/vendor/github.com/docker/docker/cmd/dockerd/daemon_linux.go deleted file mode 100644 index a556daa18..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/daemon_linux.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build linux - -package main - -import systemdDaemon "github.com/coreos/go-systemd/daemon" - -// notifySystem sends a message to the host when the server is ready to be used -func notifySystem() { - // Tell the init daemon we are accepting requests - go systemdDaemon.SdNotify("READY=1") -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/daemon_solaris.go b/vendor/github.com/docker/docker/cmd/dockerd/daemon_solaris.go deleted file mode 100644 index 974ba1634..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/daemon_solaris.go +++ /dev/null @@ -1,85 +0,0 @@ -// +build solaris - -package main - -import ( - "fmt" - "net" - "os" - "path/filepath" - "syscall" - - "github.com/docker/docker/libcontainerd" - "github.com/docker/docker/pkg/system" -) - -const defaultDaemonConfigFile = "" - -// currentUserIsOwner checks whether the current user is the owner of the given -// file. -func currentUserIsOwner(f string) bool { - if fileInfo, err := system.Stat(f); err == nil && fileInfo != nil { - if int(fileInfo.UID()) == os.Getuid() { - return true - } - } - return false -} - -// setDefaultUmask sets the umask to 0022 to avoid problems -// caused by custom umask -func setDefaultUmask() error { - desiredUmask := 0022 - syscall.Umask(desiredUmask) - if umask := syscall.Umask(desiredUmask); umask != desiredUmask { - return fmt.Errorf("failed to set umask: expected %#o, got %#o", desiredUmask, umask) - } - - return nil -} - -func getDaemonConfDir(_ string) string { - return "/etc/docker" -} - -// setupConfigReloadTrap configures the USR2 signal to reload the configuration. -func (cli *DaemonCli) setupConfigReloadTrap() { -} - -// notifySystem sends a message to the host when the server is ready to be used -func notifySystem() { -} - -func (cli *DaemonCli) getPlatformRemoteOptions() []libcontainerd.RemoteOption { - opts := []libcontainerd.RemoteOption{} - if cli.Config.ContainerdAddr != "" { - opts = append(opts, libcontainerd.WithRemoteAddr(cli.Config.ContainerdAddr)) - } else { - opts = append(opts, libcontainerd.WithStartDaemon(true)) - } - return opts -} - -// getLibcontainerdRoot gets the root directory for libcontainerd/containerd to -// store their state. -func (cli *DaemonCli) getLibcontainerdRoot() string { - return filepath.Join(cli.Config.ExecRoot, "libcontainerd") -} - -// getSwarmRunRoot gets the root directory for swarm to store runtime state -// For example, the control socket -func (cli *DaemonCli) getSwarmRunRoot() string { - return filepath.Join(cli.Config.ExecRoot, "swarm") -} - -func allocateDaemonPort(addr string) error { - return nil -} - -// notifyShutdown is called after the daemon shuts down but before the process exits. -func notifyShutdown(err error) { -} - -func wrapListeners(proto string, ls []net.Listener) []net.Listener { - return ls -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/daemon_test.go b/vendor/github.com/docker/docker/cmd/dockerd/daemon_test.go deleted file mode 100644 index b364f8784..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/daemon_test.go +++ /dev/null @@ -1,145 +0,0 @@ -package main - -import ( - "testing" - - "github.com/Sirupsen/logrus" - cliflags "github.com/docker/docker/cli/flags" - "github.com/docker/docker/daemon" - "github.com/docker/docker/pkg/testutil/assert" - "github.com/docker/docker/pkg/testutil/tempfile" - "github.com/spf13/pflag" -) - -func defaultOptions(configFile string) daemonOptions { - opts := daemonOptions{ - daemonConfig: &daemon.Config{}, - flags: &pflag.FlagSet{}, - common: cliflags.NewCommonOptions(), - } - opts.common.InstallFlags(opts.flags) - opts.daemonConfig.InstallFlags(opts.flags) - opts.flags.StringVar(&opts.configFile, flagDaemonConfigFile, defaultDaemonConfigFile, "") - opts.configFile = configFile - return opts -} - -func TestLoadDaemonCliConfigWithoutOverriding(t *testing.T) { - opts := defaultOptions("") - opts.common.Debug = true - - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - if !loadedConfig.Debug { - t.Fatalf("expected debug to be copied from the common flags, got false") - } -} - -func TestLoadDaemonCliConfigWithTLS(t *testing.T) { - opts := defaultOptions("") - opts.common.TLSOptions.CAFile = "/tmp/ca.pem" - opts.common.TLS = true - - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - assert.Equal(t, loadedConfig.CommonTLSOptions.CAFile, "/tmp/ca.pem") -} - -func TestLoadDaemonCliConfigWithConflicts(t *testing.T) { - tempFile := tempfile.NewTempFile(t, "config", `{"labels": ["l3=foo"]}`) - defer tempFile.Remove() - configFile := tempFile.Name() - - opts := defaultOptions(configFile) - flags := opts.flags - - assert.NilError(t, flags.Set(flagDaemonConfigFile, configFile)) - assert.NilError(t, flags.Set("label", "l1=bar")) - assert.NilError(t, flags.Set("label", "l2=baz")) - - _, err := loadDaemonCliConfig(opts) - assert.Error(t, err, "as a flag and in the configuration file: labels") -} - -func TestLoadDaemonCliConfigWithTLSVerify(t *testing.T) { - tempFile := tempfile.NewTempFile(t, "config", `{"tlsverify": true}`) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - opts.common.TLSOptions.CAFile = "/tmp/ca.pem" - - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - assert.Equal(t, loadedConfig.TLS, true) -} - -func TestLoadDaemonCliConfigWithExplicitTLSVerifyFalse(t *testing.T) { - tempFile := tempfile.NewTempFile(t, "config", `{"tlsverify": false}`) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - opts.common.TLSOptions.CAFile = "/tmp/ca.pem" - - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - assert.Equal(t, loadedConfig.TLS, true) -} - -func TestLoadDaemonCliConfigWithoutTLSVerify(t *testing.T) { - tempFile := tempfile.NewTempFile(t, "config", `{}`) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - opts.common.TLSOptions.CAFile = "/tmp/ca.pem" - - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - assert.Equal(t, loadedConfig.TLS, false) -} - -func TestLoadDaemonCliConfigWithLogLevel(t *testing.T) { - tempFile := tempfile.NewTempFile(t, "config", `{"log-level": "warn"}`) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - assert.Equal(t, loadedConfig.LogLevel, "warn") - assert.Equal(t, logrus.GetLevel(), logrus.WarnLevel) -} - -func TestLoadDaemonConfigWithEmbeddedOptions(t *testing.T) { - content := `{"tlscacert": "/etc/certs/ca.pem", "log-driver": "syslog"}` - tempFile := tempfile.NewTempFile(t, "config", content) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - assert.Equal(t, loadedConfig.CommonTLSOptions.CAFile, "/etc/certs/ca.pem") - assert.Equal(t, loadedConfig.LogConfig.Type, "syslog") -} - -func TestLoadDaemonConfigWithRegistryOptions(t *testing.T) { - content := `{ - "registry-mirrors": ["https://mirrors.docker.com"], - "insecure-registries": ["https://insecure.docker.com"] - }` - tempFile := tempfile.NewTempFile(t, "config", content) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - - assert.Equal(t, len(loadedConfig.Mirrors), 1) - assert.Equal(t, len(loadedConfig.InsecureRegistries), 1) -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/daemon_unix.go b/vendor/github.com/docker/docker/cmd/dockerd/daemon_unix.go deleted file mode 100644 index bdce98bd2..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/daemon_unix.go +++ /dev/null @@ -1,137 +0,0 @@ -// +build !windows,!solaris - -package main - -import ( - "fmt" - "net" - "os" - "os/signal" - "path/filepath" - "strconv" - "syscall" - - "github.com/docker/docker/cmd/dockerd/hack" - "github.com/docker/docker/daemon" - "github.com/docker/docker/libcontainerd" - "github.com/docker/docker/pkg/system" - "github.com/docker/libnetwork/portallocator" -) - -const defaultDaemonConfigFile = "/etc/docker/daemon.json" - -// currentUserIsOwner checks whether the current user is the owner of the given -// file. -func currentUserIsOwner(f string) bool { - if fileInfo, err := system.Stat(f); err == nil && fileInfo != nil { - if int(fileInfo.UID()) == os.Getuid() { - return true - } - } - return false -} - -// setDefaultUmask sets the umask to 0022 to avoid problems -// caused by custom umask -func setDefaultUmask() error { - desiredUmask := 0022 - syscall.Umask(desiredUmask) - if umask := syscall.Umask(desiredUmask); umask != desiredUmask { - return fmt.Errorf("failed to set umask: expected %#o, got %#o", desiredUmask, umask) - } - - return nil -} - -func getDaemonConfDir(_ string) string { - return "/etc/docker" -} - -// setupConfigReloadTrap configures the USR2 signal to reload the configuration. -func (cli *DaemonCli) setupConfigReloadTrap() { - c := make(chan os.Signal, 1) - signal.Notify(c, syscall.SIGHUP) - go func() { - for range c { - cli.reloadConfig() - } - }() -} - -func (cli *DaemonCli) getPlatformRemoteOptions() []libcontainerd.RemoteOption { - opts := []libcontainerd.RemoteOption{ - libcontainerd.WithDebugLog(cli.Config.Debug), - libcontainerd.WithOOMScore(cli.Config.OOMScoreAdjust), - } - if cli.Config.ContainerdAddr != "" { - opts = append(opts, libcontainerd.WithRemoteAddr(cli.Config.ContainerdAddr)) - } else { - opts = append(opts, libcontainerd.WithStartDaemon(true)) - } - if daemon.UsingSystemd(cli.Config) { - args := []string{"--systemd-cgroup=true"} - opts = append(opts, libcontainerd.WithRuntimeArgs(args)) - } - if cli.Config.LiveRestoreEnabled { - opts = append(opts, libcontainerd.WithLiveRestore(true)) - } - opts = append(opts, libcontainerd.WithRuntimePath(daemon.DefaultRuntimeBinary)) - return opts -} - -// getLibcontainerdRoot gets the root directory for libcontainerd/containerd to -// store their state. -func (cli *DaemonCli) getLibcontainerdRoot() string { - return filepath.Join(cli.Config.ExecRoot, "libcontainerd") -} - -// getSwarmRunRoot gets the root directory for swarm to store runtime state -// For example, the control socket -func (cli *DaemonCli) getSwarmRunRoot() string { - return filepath.Join(cli.Config.ExecRoot, "swarm") -} - -// allocateDaemonPort ensures that there are no containers -// that try to use any port allocated for the docker server. -func allocateDaemonPort(addr string) error { - host, port, err := net.SplitHostPort(addr) - if err != nil { - return err - } - - intPort, err := strconv.Atoi(port) - if err != nil { - return err - } - - var hostIPs []net.IP - if parsedIP := net.ParseIP(host); parsedIP != nil { - hostIPs = append(hostIPs, parsedIP) - } else if hostIPs, err = net.LookupIP(host); err != nil { - return fmt.Errorf("failed to lookup %s address in host specification", host) - } - - pa := portallocator.Get() - for _, hostIP := range hostIPs { - if _, err := pa.RequestPort(hostIP, "tcp", intPort); err != nil { - return fmt.Errorf("failed to allocate daemon listening port %d (err: %v)", intPort, err) - } - } - return nil -} - -// notifyShutdown is called after the daemon shuts down but before the process exits. -func notifyShutdown(err error) { -} - -func wrapListeners(proto string, ls []net.Listener) []net.Listener { - switch proto { - case "unix": - ls[0] = &hack.MalformedHostHeaderOverride{ls[0]} - case "fd": - for i := range ls { - ls[i] = &hack.MalformedHostHeaderOverride{ls[i]} - } - } - return ls -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/daemon_unix_test.go b/vendor/github.com/docker/docker/cmd/dockerd/daemon_unix_test.go deleted file mode 100644 index d66dba77e..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/daemon_unix_test.go +++ /dev/null @@ -1,114 +0,0 @@ -// +build !windows,!solaris - -// TODO: Create new file for Solaris which tests config parameters -// as described in daemon/config_solaris.go - -package main - -import ( - "github.com/docker/docker/daemon" - "github.com/docker/docker/pkg/testutil/assert" - "github.com/docker/docker/pkg/testutil/tempfile" - "testing" -) - -func TestLoadDaemonCliConfigWithDaemonFlags(t *testing.T) { - content := `{"log-opts": {"max-size": "1k"}}` - tempFile := tempfile.NewTempFile(t, "config", content) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - opts.common.Debug = true - opts.common.LogLevel = "info" - assert.NilError(t, opts.flags.Set("selinux-enabled", "true")) - - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - - assert.Equal(t, loadedConfig.Debug, true) - assert.Equal(t, loadedConfig.LogLevel, "info") - assert.Equal(t, loadedConfig.EnableSelinuxSupport, true) - assert.Equal(t, loadedConfig.LogConfig.Type, "json-file") - assert.Equal(t, loadedConfig.LogConfig.Config["max-size"], "1k") -} - -func TestLoadDaemonConfigWithNetwork(t *testing.T) { - content := `{"bip": "127.0.0.2", "ip": "127.0.0.1"}` - tempFile := tempfile.NewTempFile(t, "config", content) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - - assert.Equal(t, loadedConfig.IP, "127.0.0.2") - assert.Equal(t, loadedConfig.DefaultIP.String(), "127.0.0.1") -} - -func TestLoadDaemonConfigWithMapOptions(t *testing.T) { - content := `{ - "cluster-store-opts": {"kv.cacertfile": "/var/lib/docker/discovery_certs/ca.pem"}, - "log-opts": {"tag": "test"} -}` - tempFile := tempfile.NewTempFile(t, "config", content) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - assert.NotNil(t, loadedConfig.ClusterOpts) - - expectedPath := "/var/lib/docker/discovery_certs/ca.pem" - assert.Equal(t, loadedConfig.ClusterOpts["kv.cacertfile"], expectedPath) - assert.NotNil(t, loadedConfig.LogConfig.Config) - assert.Equal(t, loadedConfig.LogConfig.Config["tag"], "test") -} - -func TestLoadDaemonConfigWithTrueDefaultValues(t *testing.T) { - content := `{ "userland-proxy": false }` - tempFile := tempfile.NewTempFile(t, "config", content) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - assert.NotNil(t, loadedConfig.ClusterOpts) - - assert.Equal(t, loadedConfig.EnableUserlandProxy, false) - - // make sure reloading doesn't generate configuration - // conflicts after normalizing boolean values. - reload := func(reloadedConfig *daemon.Config) { - assert.Equal(t, reloadedConfig.EnableUserlandProxy, false) - } - assert.NilError(t, daemon.ReloadConfiguration(opts.configFile, opts.flags, reload)) -} - -func TestLoadDaemonConfigWithTrueDefaultValuesLeaveDefaults(t *testing.T) { - tempFile := tempfile.NewTempFile(t, "config", `{}`) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - assert.NotNil(t, loadedConfig.ClusterOpts) - - assert.Equal(t, loadedConfig.EnableUserlandProxy, true) -} - -func TestLoadDaemonConfigWithLegacyRegistryOptions(t *testing.T) { - content := `{"disable-legacy-registry": true}` - tempFile := tempfile.NewTempFile(t, "config", content) - defer tempFile.Remove() - - opts := defaultOptions(tempFile.Name()) - loadedConfig, err := loadDaemonCliConfig(opts) - assert.NilError(t, err) - assert.NotNil(t, loadedConfig) - assert.Equal(t, loadedConfig.V2Only, true) -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/daemon_windows.go b/vendor/github.com/docker/docker/cmd/dockerd/daemon_windows.go deleted file mode 100644 index 4cccd3268..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/daemon_windows.go +++ /dev/null @@ -1,92 +0,0 @@ -package main - -import ( - "fmt" - "net" - "os" - "path/filepath" - "syscall" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/libcontainerd" - "github.com/docker/docker/pkg/system" -) - -var defaultDaemonConfigFile = "" - -// currentUserIsOwner checks whether the current user is the owner of the given -// file. -func currentUserIsOwner(f string) bool { - return false -} - -// setDefaultUmask doesn't do anything on windows -func setDefaultUmask() error { - return nil -} - -func getDaemonConfDir(root string) string { - return filepath.Join(root, `\config`) -} - -// notifySystem sends a message to the host when the server is ready to be used -func notifySystem() { - if service != nil { - err := service.started() - if err != nil { - logrus.Fatal(err) - } - } -} - -// notifyShutdown is called after the daemon shuts down but before the process exits. -func notifyShutdown(err error) { - if service != nil { - if err != nil { - logrus.Fatal(err) - } - service.stopped(err) - } -} - -// setupConfigReloadTrap configures a Win32 event to reload the configuration. -func (cli *DaemonCli) setupConfigReloadTrap() { - go func() { - sa := syscall.SecurityAttributes{ - Length: 0, - } - ev := "Global\\docker-daemon-config-" + fmt.Sprint(os.Getpid()) - if h, _ := system.CreateEvent(&sa, false, false, ev); h != 0 { - logrus.Debugf("Config reload - waiting signal at %s", ev) - for { - syscall.WaitForSingleObject(h, syscall.INFINITE) - cli.reloadConfig() - } - } - }() -} - -func (cli *DaemonCli) getPlatformRemoteOptions() []libcontainerd.RemoteOption { - return nil -} - -// getLibcontainerdRoot gets the root directory for libcontainerd to store its -// state. The Windows libcontainerd implementation does not need to write a spec -// or state to disk, so this is a no-op. -func (cli *DaemonCli) getLibcontainerdRoot() string { - return "" -} - -// getSwarmRunRoot gets the root directory for swarm to store runtime state -// For example, the control socket -func (cli *DaemonCli) getSwarmRunRoot() string { - return "" -} - -func allocateDaemonPort(addr string) error { - return nil -} - -func wrapListeners(proto string, ls []net.Listener) []net.Listener { - return ls -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/docker.go b/vendor/github.com/docker/docker/cmd/dockerd/docker.go deleted file mode 100644 index 60742ae92..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/docker.go +++ /dev/null @@ -1,110 +0,0 @@ -package main - -import ( - "fmt" - "os" - "path/filepath" - "runtime" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/cli" - cliflags "github.com/docker/docker/cli/flags" - "github.com/docker/docker/daemon" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/pkg/reexec" - "github.com/docker/docker/pkg/term" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -type daemonOptions struct { - version bool - configFile string - daemonConfig *daemon.Config - common *cliflags.CommonOptions - flags *pflag.FlagSet -} - -func newDaemonCommand() *cobra.Command { - opts := daemonOptions{ - daemonConfig: daemon.NewConfig(), - common: cliflags.NewCommonOptions(), - } - - cmd := &cobra.Command{ - Use: "dockerd [OPTIONS]", - Short: "A self-sufficient runtime for containers.", - SilenceUsage: true, - SilenceErrors: true, - Args: cli.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - opts.flags = cmd.Flags() - return runDaemon(opts) - }, - } - cli.SetupRootCommand(cmd) - - flags := cmd.Flags() - flags.BoolVarP(&opts.version, "version", "v", false, "Print version information and quit") - flags.StringVar(&opts.configFile, flagDaemonConfigFile, defaultDaemonConfigFile, "Daemon configuration file") - opts.common.InstallFlags(flags) - opts.daemonConfig.InstallFlags(flags) - installServiceFlags(flags) - - return cmd -} - -func runDaemon(opts daemonOptions) error { - if opts.version { - showVersion() - return nil - } - - daemonCli := NewDaemonCli() - - // Windows specific settings as these are not defaulted. - if runtime.GOOS == "windows" { - if opts.daemonConfig.Pidfile == "" { - opts.daemonConfig.Pidfile = filepath.Join(opts.daemonConfig.Root, "docker.pid") - } - if opts.configFile == "" { - opts.configFile = filepath.Join(opts.daemonConfig.Root, `config\daemon.json`) - } - } - - // On Windows, this may be launching as a service or with an option to - // register the service. - stop, err := initService(daemonCli) - if err != nil { - logrus.Fatal(err) - } - - if stop { - return nil - } - - err = daemonCli.start(opts) - notifyShutdown(err) - return err -} - -func showVersion() { - fmt.Printf("Docker version %s, build %s\n", dockerversion.Version, dockerversion.GitCommit) -} - -func main() { - if reexec.Init() { - return - } - - // Set terminal emulation based on platform as required. - _, stdout, stderr := term.StdStreams() - logrus.SetOutput(stderr) - - cmd := newDaemonCommand() - cmd.SetOutput(stdout) - if err := cmd.Execute(); err != nil { - fmt.Fprintf(stderr, "%s\n", err) - os.Exit(1) - } -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/docker_windows.go b/vendor/github.com/docker/docker/cmd/dockerd/docker_windows.go deleted file mode 100644 index 19c5587cb..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/docker_windows.go +++ /dev/null @@ -1,18 +0,0 @@ -package main - -import ( - "sync/atomic" - - _ "github.com/docker/docker/autogen/winresources/dockerd" -) - -//go:cgo_import_dynamic main.dummy CommandLineToArgvW%2 "shell32.dll" - -var dummy uintptr - -func init() { - // Ensure that this import is not removed by the linker. This is used to - // ensure that shell32.dll is loaded by the system loader, preventing - // go#15286 from triggering on Nano Server TP5. - atomic.LoadUintptr(&dummy) -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/hack/malformed_host_override.go b/vendor/github.com/docker/docker/cmd/dockerd/hack/malformed_host_override.go deleted file mode 100644 index d4aa3ddd7..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/hack/malformed_host_override.go +++ /dev/null @@ -1,121 +0,0 @@ -// +build !windows - -package hack - -import "net" - -// MalformedHostHeaderOverride is a wrapper to be able -// to overcome the 400 Bad request coming from old docker -// clients that send an invalid Host header. -type MalformedHostHeaderOverride struct { - net.Listener -} - -// MalformedHostHeaderOverrideConn wraps the underlying unix -// connection and keeps track of the first read from http.Server -// which just reads the headers. -type MalformedHostHeaderOverrideConn struct { - net.Conn - first bool -} - -var closeConnHeader = []byte("\r\nConnection: close\r") - -// Read reads the first *read* request from http.Server to inspect -// the Host header. If the Host starts with / then we're talking to -// an old docker client which send an invalid Host header. To not -// error out in http.Server we rewrite the first bytes of the request -// to sanitize the Host header itself. -// In case we're not dealing with old docker clients the data is just passed -// to the server w/o modification. -func (l *MalformedHostHeaderOverrideConn) Read(b []byte) (n int, err error) { - // http.Server uses a 4k buffer - if l.first && len(b) == 4096 { - // This keeps track of the first read from http.Server which just reads - // the headers - l.first = false - // The first read of the connection by http.Server is done limited to - // DefaultMaxHeaderBytes (usually 1 << 20) + 4096. - // Here we do the first read which gets us all the http headers to - // be inspected and modified below. - c, err := l.Conn.Read(b) - if err != nil { - return c, err - } - - var ( - start, end int - firstLineFeed = -1 - buf []byte - ) - for i := 0; i <= c-1-7; i++ { - if b[i] == '\n' && firstLineFeed == -1 { - firstLineFeed = i - } - if b[i] != '\n' { - continue - } - - if b[i+1] == '\r' && b[i+2] == '\n' { - return c, nil - } - - if b[i+1] != 'H' { - continue - } - if b[i+2] != 'o' { - continue - } - if b[i+3] != 's' { - continue - } - if b[i+4] != 't' { - continue - } - if b[i+5] != ':' { - continue - } - if b[i+6] != ' ' { - continue - } - if b[i+7] != '/' { - continue - } - // ensure clients other than the docker clients do not get this hack - if i != firstLineFeed { - return c, nil - } - start = i + 7 - // now find where the value ends - for ii, bbb := range b[start:c] { - if bbb == '\n' { - end = start + ii - break - } - } - buf = make([]byte, 0, c+len(closeConnHeader)-(end-start)) - // strip the value of the host header and - // inject `Connection: close` to ensure we don't reuse this connection - buf = append(buf, b[:start]...) - buf = append(buf, closeConnHeader...) - buf = append(buf, b[end:c]...) - copy(b, buf) - break - } - if len(buf) == 0 { - return c, nil - } - return len(buf), nil - } - return l.Conn.Read(b) -} - -// Accept makes the listener accepts connections and wraps the connection -// in a MalformedHostHeaderOverrideConn initilizing first to true. -func (l *MalformedHostHeaderOverride) Accept() (net.Conn, error) { - c, err := l.Listener.Accept() - if err != nil { - return c, err - } - return &MalformedHostHeaderOverrideConn{c, true}, nil -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/hack/malformed_host_override_test.go b/vendor/github.com/docker/docker/cmd/dockerd/hack/malformed_host_override_test.go deleted file mode 100644 index 1a0a60baf..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/hack/malformed_host_override_test.go +++ /dev/null @@ -1,124 +0,0 @@ -// +build !windows - -package hack - -import ( - "bytes" - "io" - "net" - "strings" - "testing" -) - -type bufConn struct { - net.Conn - buf *bytes.Buffer -} - -func (bc *bufConn) Read(b []byte) (int, error) { - return bc.buf.Read(b) -} - -func TestHeaderOverrideHack(t *testing.T) { - tests := [][2][]byte{ - { - []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\n"), - []byte("GET /foo\nHost: \r\nConnection: close\r\nUser-Agent: Docker\r\n\r\n"), - }, - { - []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\nFoo: Bar\r\n"), - []byte("GET /foo\nHost: \r\nConnection: close\r\nUser-Agent: Docker\nFoo: Bar\r\n"), - }, - { - []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\ntest something!"), - []byte("GET /foo\nHost: \r\nConnection: close\r\nUser-Agent: Docker\r\n\r\ntest something!"), - }, - { - []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\ntest something! " + strings.Repeat("test", 15000)), - []byte("GET /foo\nHost: \r\nConnection: close\r\nUser-Agent: Docker\r\n\r\ntest something! " + strings.Repeat("test", 15000)), - }, - { - []byte("GET /foo\nFoo: Bar\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\n"), - []byte("GET /foo\nFoo: Bar\nHost: /var/run/docker.sock\nUser-Agent: Docker\r\n\r\n"), - }, - } - - // Test for https://github.com/docker/docker/issues/23045 - h0 := "GET /foo\nUser-Agent: Docker\r\n\r\n" - h0 = h0 + strings.Repeat("a", 4096-len(h0)-1) + "\n" - tests = append(tests, [2][]byte{[]byte(h0), []byte(h0)}) - - for _, pair := range tests { - read := make([]byte, 4096) - client := &bufConn{ - buf: bytes.NewBuffer(pair[0]), - } - l := MalformedHostHeaderOverrideConn{client, true} - - n, err := l.Read(read) - if err != nil && err != io.EOF { - t.Fatalf("read: %d - %d, err: %v\n%s", n, len(pair[0]), err, string(read[:n])) - } - if !bytes.Equal(read[:n], pair[1][:n]) { - t.Fatalf("\n%s\n%s\n", read[:n], pair[1][:n]) - } - } -} - -func BenchmarkWithHack(b *testing.B) { - client, srv := net.Pipe() - done := make(chan struct{}) - req := []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\n") - read := make([]byte, 4096) - b.SetBytes(int64(len(req) * 30)) - - l := MalformedHostHeaderOverrideConn{client, true} - go func() { - for { - if _, err := srv.Write(req); err != nil { - srv.Close() - break - } - l.first = true // make sure each subsequent run uses the hack parsing - } - close(done) - }() - - for i := 0; i < b.N; i++ { - for i := 0; i < 30; i++ { - if n, err := l.Read(read); err != nil && err != io.EOF { - b.Fatalf("read: %d - %d, err: %v\n%s", n, len(req), err, string(read[:n])) - } - } - } - l.Close() - <-done -} - -func BenchmarkNoHack(b *testing.B) { - client, srv := net.Pipe() - done := make(chan struct{}) - req := []byte("GET /foo\nHost: /var/run/docker.sock\nUser-Agent: Docker\n") - read := make([]byte, 4096) - b.SetBytes(int64(len(req) * 30)) - - go func() { - for { - if _, err := srv.Write(req); err != nil { - srv.Close() - break - } - } - close(done) - }() - - for i := 0; i < b.N; i++ { - for i := 0; i < 30; i++ { - if _, err := client.Read(read); err != nil && err != io.EOF { - b.Fatal(err) - } - } - } - client.Close() - <-done -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/metrics.go b/vendor/github.com/docker/docker/cmd/dockerd/metrics.go deleted file mode 100644 index 0c8860408..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/metrics.go +++ /dev/null @@ -1,27 +0,0 @@ -package main - -import ( - "net" - "net/http" - - "github.com/Sirupsen/logrus" - metrics "github.com/docker/go-metrics" -) - -func startMetricsServer(addr string) error { - if err := allocateDaemonPort(addr); err != nil { - return err - } - l, err := net.Listen("tcp", addr) - if err != nil { - return err - } - mux := http.NewServeMux() - mux.Handle("/metrics", metrics.Handler()) - go func() { - if err := http.Serve(l, mux); err != nil { - logrus.Errorf("serve metrics api: %s", err) - } - }() - return nil -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/service_unsupported.go b/vendor/github.com/docker/docker/cmd/dockerd/service_unsupported.go deleted file mode 100644 index 64ad7fcaa..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/service_unsupported.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !windows - -package main - -import ( - "github.com/spf13/pflag" -) - -func initService(daemonCli *DaemonCli) (bool, error) { - return false, nil -} - -func installServiceFlags(flags *pflag.FlagSet) { -} diff --git a/vendor/github.com/docker/docker/cmd/dockerd/service_windows.go b/vendor/github.com/docker/docker/cmd/dockerd/service_windows.go deleted file mode 100644 index dd37abcf3..000000000 --- a/vendor/github.com/docker/docker/cmd/dockerd/service_windows.go +++ /dev/null @@ -1,426 +0,0 @@ -package main - -import ( - "bytes" - "errors" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "syscall" - "time" - "unsafe" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/system" - "github.com/spf13/pflag" - "golang.org/x/sys/windows" - "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/debug" - "golang.org/x/sys/windows/svc/eventlog" - "golang.org/x/sys/windows/svc/mgr" -) - -var ( - flServiceName *string - flRegisterService *bool - flUnregisterService *bool - flRunService *bool - - setStdHandle = windows.NewLazySystemDLL("kernel32.dll").NewProc("SetStdHandle") - oldStderr syscall.Handle - panicFile *os.File - - service *handler -) - -const ( - // These should match the values in event_messages.mc. - eventInfo = 1 - eventWarn = 1 - eventError = 1 - eventDebug = 2 - eventPanic = 3 - eventFatal = 4 - - eventExtraOffset = 10 // Add this to any event to get a string that supports extended data -) - -func installServiceFlags(flags *pflag.FlagSet) { - flServiceName = flags.String("service-name", "docker", "Set the Windows service name") - flRegisterService = flags.Bool("register-service", false, "Register the service and exit") - flUnregisterService = flags.Bool("unregister-service", false, "Unregister the service and exit") - flRunService = flags.Bool("run-service", false, "") - flags.MarkHidden("run-service") -} - -type handler struct { - tosvc chan bool - fromsvc chan error - daemonCli *DaemonCli -} - -type etwHook struct { - log *eventlog.Log -} - -func (h *etwHook) Levels() []logrus.Level { - return []logrus.Level{ - logrus.PanicLevel, - logrus.FatalLevel, - logrus.ErrorLevel, - logrus.WarnLevel, - logrus.InfoLevel, - logrus.DebugLevel, - } -} - -func (h *etwHook) Fire(e *logrus.Entry) error { - var ( - etype uint16 - eid uint32 - ) - - switch e.Level { - case logrus.PanicLevel: - etype = windows.EVENTLOG_ERROR_TYPE - eid = eventPanic - case logrus.FatalLevel: - etype = windows.EVENTLOG_ERROR_TYPE - eid = eventFatal - case logrus.ErrorLevel: - etype = windows.EVENTLOG_ERROR_TYPE - eid = eventError - case logrus.WarnLevel: - etype = windows.EVENTLOG_WARNING_TYPE - eid = eventWarn - case logrus.InfoLevel: - etype = windows.EVENTLOG_INFORMATION_TYPE - eid = eventInfo - case logrus.DebugLevel: - etype = windows.EVENTLOG_INFORMATION_TYPE - eid = eventDebug - default: - return errors.New("unknown level") - } - - // If there is additional data, include it as a second string. - exts := "" - if len(e.Data) > 0 { - fs := bytes.Buffer{} - for k, v := range e.Data { - fs.WriteString(k) - fs.WriteByte('=') - fmt.Fprint(&fs, v) - fs.WriteByte(' ') - } - - exts = fs.String()[:fs.Len()-1] - eid += eventExtraOffset - } - - if h.log == nil { - fmt.Fprintf(os.Stderr, "%s [%s]\n", e.Message, exts) - return nil - } - - var ( - ss [2]*uint16 - err error - ) - - ss[0], err = syscall.UTF16PtrFromString(e.Message) - if err != nil { - return err - } - - count := uint16(1) - if exts != "" { - ss[1], err = syscall.UTF16PtrFromString(exts) - if err != nil { - return err - } - - count++ - } - - return windows.ReportEvent(h.log.Handle, etype, 0, eid, 0, count, 0, &ss[0], nil) -} - -func getServicePath() (string, error) { - p, err := exec.LookPath(os.Args[0]) - if err != nil { - return "", err - } - return filepath.Abs(p) -} - -func registerService() error { - p, err := getServicePath() - if err != nil { - return err - } - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - - depends := []string{} - - // This dependency is required on build 14393 (RS1) - // it is added to the platform in newer builds - if system.GetOSVersion().Build == 14393 { - depends = append(depends, "ConDrv") - } - - c := mgr.Config{ - ServiceType: windows.SERVICE_WIN32_OWN_PROCESS, - StartType: mgr.StartAutomatic, - ErrorControl: mgr.ErrorNormal, - Dependencies: depends, - DisplayName: "Docker Engine", - } - - // Configure the service to launch with the arguments that were just passed. - args := []string{"--run-service"} - for _, a := range os.Args[1:] { - if a != "--register-service" && a != "--unregister-service" { - args = append(args, a) - } - } - - s, err := m.CreateService(*flServiceName, p, c, args...) - if err != nil { - return err - } - defer s.Close() - - // See http://stackoverflow.com/questions/35151052/how-do-i-configure-failure-actions-of-a-windows-service-written-in-go - const ( - scActionNone = 0 - scActionRestart = 1 - scActionReboot = 2 - scActionRunCommand = 3 - - serviceConfigFailureActions = 2 - ) - - type serviceFailureActions struct { - ResetPeriod uint32 - RebootMsg *uint16 - Command *uint16 - ActionsCount uint32 - Actions uintptr - } - - type scAction struct { - Type uint32 - Delay uint32 - } - t := []scAction{ - {Type: scActionRestart, Delay: uint32(60 * time.Second / time.Millisecond)}, - {Type: scActionRestart, Delay: uint32(60 * time.Second / time.Millisecond)}, - {Type: scActionNone}, - } - lpInfo := serviceFailureActions{ResetPeriod: uint32(24 * time.Hour / time.Second), ActionsCount: uint32(3), Actions: uintptr(unsafe.Pointer(&t[0]))} - err = windows.ChangeServiceConfig2(s.Handle, serviceConfigFailureActions, (*byte)(unsafe.Pointer(&lpInfo))) - if err != nil { - return err - } - - err = eventlog.Install(*flServiceName, p, false, eventlog.Info|eventlog.Warning|eventlog.Error) - if err != nil { - return err - } - - return nil -} - -func unregisterService() error { - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - - s, err := m.OpenService(*flServiceName) - if err != nil { - return err - } - defer s.Close() - - eventlog.Remove(*flServiceName) - err = s.Delete() - if err != nil { - return err - } - return nil -} - -func initService(daemonCli *DaemonCli) (bool, error) { - if *flUnregisterService { - if *flRegisterService { - return true, errors.New("--register-service and --unregister-service cannot be used together") - } - return true, unregisterService() - } - - if *flRegisterService { - return true, registerService() - } - - if !*flRunService { - return false, nil - } - - interactive, err := svc.IsAnInteractiveSession() - if err != nil { - return false, err - } - - h := &handler{ - tosvc: make(chan bool), - fromsvc: make(chan error), - daemonCli: daemonCli, - } - - var log *eventlog.Log - if !interactive { - log, err = eventlog.Open(*flServiceName) - if err != nil { - return false, err - } - } - - logrus.AddHook(&etwHook{log}) - logrus.SetOutput(ioutil.Discard) - - service = h - go func() { - if interactive { - err = debug.Run(*flServiceName, h) - } else { - err = svc.Run(*flServiceName, h) - } - - h.fromsvc <- err - }() - - // Wait for the first signal from the service handler. - err = <-h.fromsvc - if err != nil { - return false, err - } - return false, nil -} - -func (h *handler) started() error { - // This must be delayed until daemonCli initializes Config.Root - err := initPanicFile(filepath.Join(h.daemonCli.Config.Root, "panic.log")) - if err != nil { - return err - } - - h.tosvc <- false - return nil -} - -func (h *handler) stopped(err error) { - logrus.Debugf("Stopping service: %v", err) - h.tosvc <- err != nil - <-h.fromsvc -} - -func (h *handler) Execute(_ []string, r <-chan svc.ChangeRequest, s chan<- svc.Status) (bool, uint32) { - s <- svc.Status{State: svc.StartPending, Accepts: 0} - // Unblock initService() - h.fromsvc <- nil - - // Wait for initialization to complete. - failed := <-h.tosvc - if failed { - logrus.Debug("Aborting service start due to failure during initialization") - return true, 1 - } - - s <- svc.Status{State: svc.Running, Accepts: svc.AcceptStop | svc.AcceptShutdown | svc.Accepted(windows.SERVICE_ACCEPT_PARAMCHANGE)} - logrus.Debug("Service running") -Loop: - for { - select { - case failed = <-h.tosvc: - break Loop - case c := <-r: - switch c.Cmd { - case svc.Cmd(windows.SERVICE_CONTROL_PARAMCHANGE): - h.daemonCli.reloadConfig() - case svc.Interrogate: - s <- c.CurrentStatus - case svc.Stop, svc.Shutdown: - s <- svc.Status{State: svc.StopPending, Accepts: 0} - h.daemonCli.stop() - } - } - } - - removePanicFile() - if failed { - return true, 1 - } - return false, 0 -} - -func initPanicFile(path string) error { - var err error - panicFile, err = os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0) - if err != nil { - return err - } - - st, err := panicFile.Stat() - if err != nil { - return err - } - - // If there are contents in the file already, move the file out of the way - // and replace it. - if st.Size() > 0 { - panicFile.Close() - os.Rename(path, path+".old") - panicFile, err = os.Create(path) - if err != nil { - return err - } - } - - // Update STD_ERROR_HANDLE to point to the panic file so that Go writes to - // it when it panics. Remember the old stderr to restore it before removing - // the panic file. - sh := syscall.STD_ERROR_HANDLE - h, err := syscall.GetStdHandle(sh) - if err != nil { - return err - } - - oldStderr = h - - r, _, err := setStdHandle.Call(uintptr(sh), uintptr(panicFile.Fd())) - if r == 0 && err != nil { - return err - } - - return nil -} - -func removePanicFile() { - if st, err := panicFile.Stat(); err == nil { - if st.Size() == 0 { - sh := syscall.STD_ERROR_HANDLE - setStdHandle.Call(uintptr(sh), uintptr(oldStderr)) - panicFile.Close() - os.Remove(panicFile.Name()) - } - } -} diff --git a/vendor/github.com/docker/docker/container/archive.go b/vendor/github.com/docker/docker/container/archive.go deleted file mode 100644 index 56e6598b9..000000000 --- a/vendor/github.com/docker/docker/container/archive.go +++ /dev/null @@ -1,76 +0,0 @@ -package container - -import ( - "os" - "path/filepath" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/system" -) - -// ResolvePath resolves the given path in the container to a resource on the -// host. Returns a resolved path (absolute path to the resource on the host), -// the absolute path to the resource relative to the container's rootfs, and -// an error if the path points to outside the container's rootfs. -func (container *Container) ResolvePath(path string) (resolvedPath, absPath string, err error) { - // Check if a drive letter supplied, it must be the system drive. No-op except on Windows - path, err = system.CheckSystemDriveAndRemoveDriveLetter(path) - if err != nil { - return "", "", err - } - - // Consider the given path as an absolute path in the container. - absPath = archive.PreserveTrailingDotOrSeparator(filepath.Join(string(filepath.Separator), path), path) - - // Split the absPath into its Directory and Base components. We will - // resolve the dir in the scope of the container then append the base. - dirPath, basePath := filepath.Split(absPath) - - resolvedDirPath, err := container.GetResourcePath(dirPath) - if err != nil { - return "", "", err - } - - // resolvedDirPath will have been cleaned (no trailing path separators) so - // we can manually join it with the base path element. - resolvedPath = resolvedDirPath + string(filepath.Separator) + basePath - - return resolvedPath, absPath, nil -} - -// StatPath is the unexported version of StatPath. Locks and mounts should -// be acquired before calling this method and the given path should be fully -// resolved to a path on the host corresponding to the given absolute path -// inside the container. -func (container *Container) StatPath(resolvedPath, absPath string) (stat *types.ContainerPathStat, err error) { - lstat, err := os.Lstat(resolvedPath) - if err != nil { - return nil, err - } - - var linkTarget string - if lstat.Mode()&os.ModeSymlink != 0 { - // Fully evaluate the symlink in the scope of the container rootfs. - hostPath, err := container.GetResourcePath(absPath) - if err != nil { - return nil, err - } - - linkTarget, err = filepath.Rel(container.BaseFS, hostPath) - if err != nil { - return nil, err - } - - // Make it an absolute path. - linkTarget = filepath.Join(string(filepath.Separator), linkTarget) - } - - return &types.ContainerPathStat{ - Name: filepath.Base(absPath), - Size: lstat.Size(), - Mode: lstat.Mode(), - Mtime: lstat.ModTime(), - LinkTarget: linkTarget, - }, nil -} diff --git a/vendor/github.com/docker/docker/container/container.go b/vendor/github.com/docker/docker/container/container.go deleted file mode 100644 index fc4fe2717..000000000 --- a/vendor/github.com/docker/docker/container/container.go +++ /dev/null @@ -1,1103 +0,0 @@ -package container - -import ( - "encoding/json" - "fmt" - "io" - "net" - "os" - "path/filepath" - "strconv" - "strings" - "sync" - "syscall" - "time" - - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - containertypes "github.com/docker/docker/api/types/container" - mounttypes "github.com/docker/docker/api/types/mount" - networktypes "github.com/docker/docker/api/types/network" - swarmtypes "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/container/stream" - "github.com/docker/docker/daemon/exec" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/daemon/logger/jsonfilelog" - "github.com/docker/docker/daemon/network" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/libcontainerd" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/promise" - "github.com/docker/docker/pkg/signal" - "github.com/docker/docker/pkg/symlink" - "github.com/docker/docker/restartmanager" - "github.com/docker/docker/runconfig" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/docker/docker/volume" - "github.com/docker/go-connections/nat" - "github.com/docker/libnetwork" - "github.com/docker/libnetwork/netlabel" - "github.com/docker/libnetwork/options" - "github.com/docker/libnetwork/types" - agentexec "github.com/docker/swarmkit/agent/exec" - "github.com/opencontainers/runc/libcontainer/label" -) - -const configFileName = "config.v2.json" - -const ( - // DefaultStopTimeout is the timeout (in seconds) for the syscall signal used to stop a container. - DefaultStopTimeout = 10 -) - -var ( - errInvalidEndpoint = fmt.Errorf("invalid endpoint while building port map info") - errInvalidNetwork = fmt.Errorf("invalid network settings while building port map info") -) - -// DetachError is special error which returned in case of container detach. -type DetachError struct{} - -func (DetachError) Error() string { - return "detached from container" -} - -// CommonContainer holds the fields for a container which are -// applicable across all platforms supported by the daemon. -type CommonContainer struct { - StreamConfig *stream.Config - // embed for Container to support states directly. - *State `json:"State"` // Needed for Engine API version <= 1.11 - Root string `json:"-"` // Path to the "home" of the container, including metadata. - BaseFS string `json:"-"` // Path to the graphdriver mountpoint - RWLayer layer.RWLayer `json:"-"` - ID string - Created time.Time - Managed bool - Path string - Args []string - Config *containertypes.Config - ImageID image.ID `json:"Image"` - NetworkSettings *network.Settings - LogPath string - Name string - Driver string - // MountLabel contains the options for the 'mount' command - MountLabel string - ProcessLabel string - RestartCount int - HasBeenStartedBefore bool - HasBeenManuallyStopped bool // used for unless-stopped restart policy - MountPoints map[string]*volume.MountPoint - HostConfig *containertypes.HostConfig `json:"-"` // do not serialize the host config in the json, otherwise we'll make the container unportable - ExecCommands *exec.Store `json:"-"` - SecretStore agentexec.SecretGetter `json:"-"` - SecretReferences []*swarmtypes.SecretReference - // logDriver for closing - LogDriver logger.Logger `json:"-"` - LogCopier *logger.Copier `json:"-"` - restartManager restartmanager.RestartManager - attachContext *attachContext -} - -// NewBaseContainer creates a new container with its -// basic configuration. -func NewBaseContainer(id, root string) *Container { - return &Container{ - CommonContainer: CommonContainer{ - ID: id, - State: NewState(), - ExecCommands: exec.NewStore(), - Root: root, - MountPoints: make(map[string]*volume.MountPoint), - StreamConfig: stream.NewConfig(), - attachContext: &attachContext{}, - }, - } -} - -// FromDisk loads the container configuration stored in the host. -func (container *Container) FromDisk() error { - pth, err := container.ConfigPath() - if err != nil { - return err - } - - jsonSource, err := os.Open(pth) - if err != nil { - return err - } - defer jsonSource.Close() - - dec := json.NewDecoder(jsonSource) - - // Load container settings - if err := dec.Decode(container); err != nil { - return err - } - - if err := label.ReserveLabel(container.ProcessLabel); err != nil { - return err - } - return container.readHostConfig() -} - -// ToDisk saves the container configuration on disk. -func (container *Container) ToDisk() error { - pth, err := container.ConfigPath() - if err != nil { - return err - } - - jsonSource, err := ioutils.NewAtomicFileWriter(pth, 0644) - if err != nil { - return err - } - defer jsonSource.Close() - - enc := json.NewEncoder(jsonSource) - - // Save container settings - if err := enc.Encode(container); err != nil { - return err - } - - return container.WriteHostConfig() -} - -// ToDiskLocking saves the container configuration on disk in a thread safe way. -func (container *Container) ToDiskLocking() error { - container.Lock() - err := container.ToDisk() - container.Unlock() - return err -} - -// readHostConfig reads the host configuration from disk for the container. -func (container *Container) readHostConfig() error { - container.HostConfig = &containertypes.HostConfig{} - // If the hostconfig file does not exist, do not read it. - // (We still have to initialize container.HostConfig, - // but that's OK, since we just did that above.) - pth, err := container.HostConfigPath() - if err != nil { - return err - } - - f, err := os.Open(pth) - if err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - defer f.Close() - - if err := json.NewDecoder(f).Decode(&container.HostConfig); err != nil { - return err - } - - container.InitDNSHostConfig() - - return nil -} - -// WriteHostConfig saves the host configuration on disk for the container. -func (container *Container) WriteHostConfig() error { - pth, err := container.HostConfigPath() - if err != nil { - return err - } - - f, err := ioutils.NewAtomicFileWriter(pth, 0644) - if err != nil { - return err - } - defer f.Close() - - return json.NewEncoder(f).Encode(&container.HostConfig) -} - -// SetupWorkingDirectory sets up the container's working directory as set in container.Config.WorkingDir -func (container *Container) SetupWorkingDirectory(rootUID, rootGID int) error { - if container.Config.WorkingDir == "" { - return nil - } - - container.Config.WorkingDir = filepath.Clean(container.Config.WorkingDir) - - pth, err := container.GetResourcePath(container.Config.WorkingDir) - if err != nil { - return err - } - - if err := idtools.MkdirAllNewAs(pth, 0755, rootUID, rootGID); err != nil { - pthInfo, err2 := os.Stat(pth) - if err2 == nil && pthInfo != nil && !pthInfo.IsDir() { - return fmt.Errorf("Cannot mkdir: %s is not a directory", container.Config.WorkingDir) - } - - return err - } - - return nil -} - -// GetResourcePath evaluates `path` in the scope of the container's BaseFS, with proper path -// sanitisation. Symlinks are all scoped to the BaseFS of the container, as -// though the container's BaseFS was `/`. -// -// The BaseFS of a container is the host-facing path which is bind-mounted as -// `/` inside the container. This method is essentially used to access a -// particular path inside the container as though you were a process in that -// container. -// -// NOTE: The returned path is *only* safely scoped inside the container's BaseFS -// if no component of the returned path changes (such as a component -// symlinking to a different path) between using this method and using the -// path. See symlink.FollowSymlinkInScope for more details. -func (container *Container) GetResourcePath(path string) (string, error) { - // IMPORTANT - These are paths on the OS where the daemon is running, hence - // any filepath operations must be done in an OS agnostic way. - - cleanPath := cleanResourcePath(path) - r, e := symlink.FollowSymlinkInScope(filepath.Join(container.BaseFS, cleanPath), container.BaseFS) - - // Log this here on the daemon side as there's otherwise no indication apart - // from the error being propagated all the way back to the client. This makes - // debugging significantly easier and clearly indicates the error comes from the daemon. - if e != nil { - logrus.Errorf("Failed to FollowSymlinkInScope BaseFS %s cleanPath %s path %s %s\n", container.BaseFS, cleanPath, path, e) - } - return r, e -} - -// GetRootResourcePath evaluates `path` in the scope of the container's root, with proper path -// sanitisation. Symlinks are all scoped to the root of the container, as -// though the container's root was `/`. -// -// The root of a container is the host-facing configuration metadata directory. -// Only use this method to safely access the container's `container.json` or -// other metadata files. If in doubt, use container.GetResourcePath. -// -// NOTE: The returned path is *only* safely scoped inside the container's root -// if no component of the returned path changes (such as a component -// symlinking to a different path) between using this method and using the -// path. See symlink.FollowSymlinkInScope for more details. -func (container *Container) GetRootResourcePath(path string) (string, error) { - // IMPORTANT - These are paths on the OS where the daemon is running, hence - // any filepath operations must be done in an OS agnostic way. - cleanPath := filepath.Join(string(os.PathSeparator), path) - return symlink.FollowSymlinkInScope(filepath.Join(container.Root, cleanPath), container.Root) -} - -// ExitOnNext signals to the monitor that it should not restart the container -// after we send the kill signal. -func (container *Container) ExitOnNext() { - container.RestartManager().Cancel() -} - -// HostConfigPath returns the path to the container's JSON hostconfig -func (container *Container) HostConfigPath() (string, error) { - return container.GetRootResourcePath("hostconfig.json") -} - -// ConfigPath returns the path to the container's JSON config -func (container *Container) ConfigPath() (string, error) { - return container.GetRootResourcePath(configFileName) -} - -// CheckpointDir returns the directory checkpoints are stored in -func (container *Container) CheckpointDir() string { - return filepath.Join(container.Root, "checkpoints") -} - -// StartLogger starts a new logger driver for the container. -func (container *Container) StartLogger(cfg containertypes.LogConfig) (logger.Logger, error) { - c, err := logger.GetLogDriver(cfg.Type) - if err != nil { - return nil, fmt.Errorf("Failed to get logging factory: %v", err) - } - ctx := logger.Context{ - Config: cfg.Config, - ContainerID: container.ID, - ContainerName: container.Name, - ContainerEntrypoint: container.Path, - ContainerArgs: container.Args, - ContainerImageID: container.ImageID.String(), - ContainerImageName: container.Config.Image, - ContainerCreated: container.Created, - ContainerEnv: container.Config.Env, - ContainerLabels: container.Config.Labels, - DaemonName: "docker", - } - - // Set logging file for "json-logger" - if cfg.Type == jsonfilelog.Name { - ctx.LogPath, err = container.GetRootResourcePath(fmt.Sprintf("%s-json.log", container.ID)) - if err != nil { - return nil, err - } - } - return c(ctx) -} - -// GetProcessLabel returns the process label for the container. -func (container *Container) GetProcessLabel() string { - // even if we have a process label return "" if we are running - // in privileged mode - if container.HostConfig.Privileged { - return "" - } - return container.ProcessLabel -} - -// GetMountLabel returns the mounting label for the container. -// This label is empty if the container is privileged. -func (container *Container) GetMountLabel() string { - return container.MountLabel -} - -// GetExecIDs returns the list of exec commands running on the container. -func (container *Container) GetExecIDs() []string { - return container.ExecCommands.List() -} - -// Attach connects to the container's TTY, delegating to standard -// streams or websockets depending on the configuration. -func (container *Container) Attach(stdin io.ReadCloser, stdout io.Writer, stderr io.Writer, keys []byte) chan error { - ctx := container.InitAttachContext() - return AttachStreams(ctx, container.StreamConfig, container.Config.OpenStdin, container.Config.StdinOnce, container.Config.Tty, stdin, stdout, stderr, keys) -} - -// AttachStreams connects streams to a TTY. -// Used by exec too. Should this move somewhere else? -func AttachStreams(ctx context.Context, streamConfig *stream.Config, openStdin, stdinOnce, tty bool, stdin io.ReadCloser, stdout io.Writer, stderr io.Writer, keys []byte) chan error { - var ( - cStdout, cStderr io.ReadCloser - cStdin io.WriteCloser - wg sync.WaitGroup - errors = make(chan error, 3) - ) - - if stdin != nil && openStdin { - cStdin = streamConfig.StdinPipe() - wg.Add(1) - } - - if stdout != nil { - cStdout = streamConfig.StdoutPipe() - wg.Add(1) - } - - if stderr != nil { - cStderr = streamConfig.StderrPipe() - wg.Add(1) - } - - // Connect stdin of container to the http conn. - go func() { - if stdin == nil || !openStdin { - return - } - logrus.Debug("attach: stdin: begin") - - var err error - if tty { - _, err = copyEscapable(cStdin, stdin, keys) - } else { - _, err = io.Copy(cStdin, stdin) - } - if err == io.ErrClosedPipe { - err = nil - } - if err != nil { - logrus.Errorf("attach: stdin: %s", err) - errors <- err - } - if stdinOnce && !tty { - cStdin.Close() - } else { - // No matter what, when stdin is closed (io.Copy unblock), close stdout and stderr - if cStdout != nil { - cStdout.Close() - } - if cStderr != nil { - cStderr.Close() - } - } - logrus.Debug("attach: stdin: end") - wg.Done() - }() - - attachStream := func(name string, stream io.Writer, streamPipe io.ReadCloser) { - if stream == nil { - return - } - - logrus.Debugf("attach: %s: begin", name) - _, err := io.Copy(stream, streamPipe) - if err == io.ErrClosedPipe { - err = nil - } - if err != nil { - logrus.Errorf("attach: %s: %v", name, err) - errors <- err - } - // Make sure stdin gets closed - if stdin != nil { - stdin.Close() - } - streamPipe.Close() - logrus.Debugf("attach: %s: end", name) - wg.Done() - } - - go attachStream("stdout", stdout, cStdout) - go attachStream("stderr", stderr, cStderr) - - return promise.Go(func() error { - done := make(chan struct{}) - go func() { - wg.Wait() - close(done) - }() - select { - case <-done: - case <-ctx.Done(): - // close all pipes - if cStdin != nil { - cStdin.Close() - } - if cStdout != nil { - cStdout.Close() - } - if cStderr != nil { - cStderr.Close() - } - <-done - } - close(errors) - for err := range errors { - if err != nil { - return err - } - } - return nil - }) -} - -// Code c/c from io.Copy() modified to handle escape sequence -func copyEscapable(dst io.Writer, src io.ReadCloser, keys []byte) (written int64, err error) { - if len(keys) == 0 { - // Default keys : ctrl-p ctrl-q - keys = []byte{16, 17} - } - buf := make([]byte, 32*1024) - for { - nr, er := src.Read(buf) - if nr > 0 { - // ---- Docker addition - preservBuf := []byte{} - for i, key := range keys { - preservBuf = append(preservBuf, buf[0:nr]...) - if nr != 1 || buf[0] != key { - break - } - if i == len(keys)-1 { - src.Close() - return 0, DetachError{} - } - nr, er = src.Read(buf) - } - var nw int - var ew error - if len(preservBuf) > 0 { - nw, ew = dst.Write(preservBuf) - nr = len(preservBuf) - } else { - // ---- End of docker - nw, ew = dst.Write(buf[0:nr]) - } - if nw > 0 { - written += int64(nw) - } - if ew != nil { - err = ew - break - } - if nr != nw { - err = io.ErrShortWrite - break - } - } - if er == io.EOF { - break - } - if er != nil { - err = er - break - } - } - return written, err -} - -// ShouldRestart decides whether the daemon should restart the container or not. -// This is based on the container's restart policy. -func (container *Container) ShouldRestart() bool { - shouldRestart, _, _ := container.RestartManager().ShouldRestart(uint32(container.ExitCode()), container.HasBeenManuallyStopped, container.FinishedAt.Sub(container.StartedAt)) - return shouldRestart -} - -// AddMountPointWithVolume adds a new mount point configured with a volume to the container. -func (container *Container) AddMountPointWithVolume(destination string, vol volume.Volume, rw bool) { - container.MountPoints[destination] = &volume.MountPoint{ - Type: mounttypes.TypeVolume, - Name: vol.Name(), - Driver: vol.DriverName(), - Destination: destination, - RW: rw, - Volume: vol, - CopyData: volume.DefaultCopyMode, - } -} - -// UnmountVolumes unmounts all volumes -func (container *Container) UnmountVolumes(volumeEventLog func(name, action string, attributes map[string]string)) error { - var errors []string - for _, volumeMount := range container.MountPoints { - // Check if the mounpoint has an ID, this is currently the best way to tell if it's actually mounted - // TODO(cpuguyh83): there should be a better way to handle this - if volumeMount.Volume != nil && volumeMount.ID != "" { - if err := volumeMount.Volume.Unmount(volumeMount.ID); err != nil { - errors = append(errors, err.Error()) - continue - } - volumeMount.ID = "" - - attributes := map[string]string{ - "driver": volumeMount.Volume.DriverName(), - "container": container.ID, - } - volumeEventLog(volumeMount.Volume.Name(), "unmount", attributes) - } - } - if len(errors) > 0 { - return fmt.Errorf("error while unmounting volumes for container %s: %s", container.ID, strings.Join(errors, "; ")) - } - return nil -} - -// IsDestinationMounted checks whether a path is mounted on the container or not. -func (container *Container) IsDestinationMounted(destination string) bool { - return container.MountPoints[destination] != nil -} - -// StopSignal returns the signal used to stop the container. -func (container *Container) StopSignal() int { - var stopSignal syscall.Signal - if container.Config.StopSignal != "" { - stopSignal, _ = signal.ParseSignal(container.Config.StopSignal) - } - - if int(stopSignal) == 0 { - stopSignal, _ = signal.ParseSignal(signal.DefaultStopSignal) - } - return int(stopSignal) -} - -// StopTimeout returns the timeout (in seconds) used to stop the container. -func (container *Container) StopTimeout() int { - if container.Config.StopTimeout != nil { - return *container.Config.StopTimeout - } - return DefaultStopTimeout -} - -// InitDNSHostConfig ensures that the dns fields are never nil. -// New containers don't ever have those fields nil, -// but pre created containers can still have those nil values. -// The non-recommended host configuration in the start api can -// make these fields nil again, this corrects that issue until -// we remove that behavior for good. -// See https://github.com/docker/docker/pull/17779 -// for a more detailed explanation on why we don't want that. -func (container *Container) InitDNSHostConfig() { - container.Lock() - defer container.Unlock() - if container.HostConfig.DNS == nil { - container.HostConfig.DNS = make([]string, 0) - } - - if container.HostConfig.DNSSearch == nil { - container.HostConfig.DNSSearch = make([]string, 0) - } - - if container.HostConfig.DNSOptions == nil { - container.HostConfig.DNSOptions = make([]string, 0) - } -} - -// GetEndpointInNetwork returns the container's endpoint to the provided network. -func (container *Container) GetEndpointInNetwork(n libnetwork.Network) (libnetwork.Endpoint, error) { - endpointName := strings.TrimPrefix(container.Name, "/") - return n.EndpointByName(endpointName) -} - -func (container *Container) buildPortMapInfo(ep libnetwork.Endpoint) error { - if ep == nil { - return errInvalidEndpoint - } - - networkSettings := container.NetworkSettings - if networkSettings == nil { - return errInvalidNetwork - } - - if len(networkSettings.Ports) == 0 { - pm, err := getEndpointPortMapInfo(ep) - if err != nil { - return err - } - networkSettings.Ports = pm - } - return nil -} - -func getEndpointPortMapInfo(ep libnetwork.Endpoint) (nat.PortMap, error) { - pm := nat.PortMap{} - driverInfo, err := ep.DriverInfo() - if err != nil { - return pm, err - } - - if driverInfo == nil { - // It is not an error for epInfo to be nil - return pm, nil - } - - if expData, ok := driverInfo[netlabel.ExposedPorts]; ok { - if exposedPorts, ok := expData.([]types.TransportPort); ok { - for _, tp := range exposedPorts { - natPort, err := nat.NewPort(tp.Proto.String(), strconv.Itoa(int(tp.Port))) - if err != nil { - return pm, fmt.Errorf("Error parsing Port value(%v):%v", tp.Port, err) - } - pm[natPort] = nil - } - } - } - - mapData, ok := driverInfo[netlabel.PortMap] - if !ok { - return pm, nil - } - - if portMapping, ok := mapData.([]types.PortBinding); ok { - for _, pp := range portMapping { - natPort, err := nat.NewPort(pp.Proto.String(), strconv.Itoa(int(pp.Port))) - if err != nil { - return pm, err - } - natBndg := nat.PortBinding{HostIP: pp.HostIP.String(), HostPort: strconv.Itoa(int(pp.HostPort))} - pm[natPort] = append(pm[natPort], natBndg) - } - } - - return pm, nil -} - -// GetSandboxPortMapInfo retrieves the current port-mapping programmed for the given sandbox -func GetSandboxPortMapInfo(sb libnetwork.Sandbox) nat.PortMap { - pm := nat.PortMap{} - if sb == nil { - return pm - } - - for _, ep := range sb.Endpoints() { - pm, _ = getEndpointPortMapInfo(ep) - if len(pm) > 0 { - break - } - } - return pm -} - -// BuildEndpointInfo sets endpoint-related fields on container.NetworkSettings based on the provided network and endpoint. -func (container *Container) BuildEndpointInfo(n libnetwork.Network, ep libnetwork.Endpoint) error { - if ep == nil { - return errInvalidEndpoint - } - - networkSettings := container.NetworkSettings - if networkSettings == nil { - return errInvalidNetwork - } - - epInfo := ep.Info() - if epInfo == nil { - // It is not an error to get an empty endpoint info - return nil - } - - if _, ok := networkSettings.Networks[n.Name()]; !ok { - networkSettings.Networks[n.Name()] = &network.EndpointSettings{ - EndpointSettings: &networktypes.EndpointSettings{}, - } - } - networkSettings.Networks[n.Name()].NetworkID = n.ID() - networkSettings.Networks[n.Name()].EndpointID = ep.ID() - - iface := epInfo.Iface() - if iface == nil { - return nil - } - - if iface.MacAddress() != nil { - networkSettings.Networks[n.Name()].MacAddress = iface.MacAddress().String() - } - - if iface.Address() != nil { - ones, _ := iface.Address().Mask.Size() - networkSettings.Networks[n.Name()].IPAddress = iface.Address().IP.String() - networkSettings.Networks[n.Name()].IPPrefixLen = ones - } - - if iface.AddressIPv6() != nil && iface.AddressIPv6().IP.To16() != nil { - onesv6, _ := iface.AddressIPv6().Mask.Size() - networkSettings.Networks[n.Name()].GlobalIPv6Address = iface.AddressIPv6().IP.String() - networkSettings.Networks[n.Name()].GlobalIPv6PrefixLen = onesv6 - } - - return nil -} - -// UpdateJoinInfo updates network settings when container joins network n with endpoint ep. -func (container *Container) UpdateJoinInfo(n libnetwork.Network, ep libnetwork.Endpoint) error { - if err := container.buildPortMapInfo(ep); err != nil { - return err - } - - epInfo := ep.Info() - if epInfo == nil { - // It is not an error to get an empty endpoint info - return nil - } - if epInfo.Gateway() != nil { - container.NetworkSettings.Networks[n.Name()].Gateway = epInfo.Gateway().String() - } - if epInfo.GatewayIPv6().To16() != nil { - container.NetworkSettings.Networks[n.Name()].IPv6Gateway = epInfo.GatewayIPv6().String() - } - - return nil -} - -// UpdateSandboxNetworkSettings updates the sandbox ID and Key. -func (container *Container) UpdateSandboxNetworkSettings(sb libnetwork.Sandbox) error { - container.NetworkSettings.SandboxID = sb.ID() - container.NetworkSettings.SandboxKey = sb.Key() - return nil -} - -// BuildJoinOptions builds endpoint Join options from a given network. -func (container *Container) BuildJoinOptions(n libnetwork.Network) ([]libnetwork.EndpointOption, error) { - var joinOptions []libnetwork.EndpointOption - if epConfig, ok := container.NetworkSettings.Networks[n.Name()]; ok { - for _, str := range epConfig.Links { - name, alias, err := runconfigopts.ParseLink(str) - if err != nil { - return nil, err - } - joinOptions = append(joinOptions, libnetwork.CreateOptionAlias(name, alias)) - } - } - return joinOptions, nil -} - -// BuildCreateEndpointOptions builds endpoint options from a given network. -func (container *Container) BuildCreateEndpointOptions(n libnetwork.Network, epConfig *networktypes.EndpointSettings, sb libnetwork.Sandbox, daemonDNS []string) ([]libnetwork.EndpointOption, error) { - var ( - bindings = make(nat.PortMap) - pbList []types.PortBinding - exposeList []types.TransportPort - createOptions []libnetwork.EndpointOption - ) - - defaultNetName := runconfig.DefaultDaemonNetworkMode().NetworkName() - - if (!container.EnableServiceDiscoveryOnDefaultNetwork() && n.Name() == defaultNetName) || - container.NetworkSettings.IsAnonymousEndpoint { - createOptions = append(createOptions, libnetwork.CreateOptionAnonymous()) - } - - if epConfig != nil { - ipam := epConfig.IPAMConfig - if ipam != nil && (ipam.IPv4Address != "" || ipam.IPv6Address != "" || len(ipam.LinkLocalIPs) > 0) { - var ipList []net.IP - for _, ips := range ipam.LinkLocalIPs { - if ip := net.ParseIP(ips); ip != nil { - ipList = append(ipList, ip) - } - } - createOptions = append(createOptions, - libnetwork.CreateOptionIpam(net.ParseIP(ipam.IPv4Address), net.ParseIP(ipam.IPv6Address), ipList, nil)) - } - - for _, alias := range epConfig.Aliases { - createOptions = append(createOptions, libnetwork.CreateOptionMyAlias(alias)) - } - } - - if container.NetworkSettings.Service != nil { - svcCfg := container.NetworkSettings.Service - - var vip string - if svcCfg.VirtualAddresses[n.ID()] != nil { - vip = svcCfg.VirtualAddresses[n.ID()].IPv4 - } - - var portConfigs []*libnetwork.PortConfig - for _, portConfig := range svcCfg.ExposedPorts { - portConfigs = append(portConfigs, &libnetwork.PortConfig{ - Name: portConfig.Name, - Protocol: libnetwork.PortConfig_Protocol(portConfig.Protocol), - TargetPort: portConfig.TargetPort, - PublishedPort: portConfig.PublishedPort, - }) - } - - createOptions = append(createOptions, libnetwork.CreateOptionService(svcCfg.Name, svcCfg.ID, net.ParseIP(vip), portConfigs, svcCfg.Aliases[n.ID()])) - } - - if !containertypes.NetworkMode(n.Name()).IsUserDefined() { - createOptions = append(createOptions, libnetwork.CreateOptionDisableResolution()) - } - - // configs that are applicable only for the endpoint in the network - // to which container was connected to on docker run. - // Ideally all these network-specific endpoint configurations must be moved under - // container.NetworkSettings.Networks[n.Name()] - if n.Name() == container.HostConfig.NetworkMode.NetworkName() || - (n.Name() == defaultNetName && container.HostConfig.NetworkMode.IsDefault()) { - if container.Config.MacAddress != "" { - mac, err := net.ParseMAC(container.Config.MacAddress) - if err != nil { - return nil, err - } - - genericOption := options.Generic{ - netlabel.MacAddress: mac, - } - - createOptions = append(createOptions, libnetwork.EndpointOptionGeneric(genericOption)) - } - } - - // Port-mapping rules belong to the container & applicable only to non-internal networks - portmaps := GetSandboxPortMapInfo(sb) - if n.Info().Internal() || len(portmaps) > 0 { - return createOptions, nil - } - - if container.HostConfig.PortBindings != nil { - for p, b := range container.HostConfig.PortBindings { - bindings[p] = []nat.PortBinding{} - for _, bb := range b { - bindings[p] = append(bindings[p], nat.PortBinding{ - HostIP: bb.HostIP, - HostPort: bb.HostPort, - }) - } - } - } - - portSpecs := container.Config.ExposedPorts - ports := make([]nat.Port, len(portSpecs)) - var i int - for p := range portSpecs { - ports[i] = p - i++ - } - nat.SortPortMap(ports, bindings) - for _, port := range ports { - expose := types.TransportPort{} - expose.Proto = types.ParseProtocol(port.Proto()) - expose.Port = uint16(port.Int()) - exposeList = append(exposeList, expose) - - pb := types.PortBinding{Port: expose.Port, Proto: expose.Proto} - binding := bindings[port] - for i := 0; i < len(binding); i++ { - pbCopy := pb.GetCopy() - newP, err := nat.NewPort(nat.SplitProtoPort(binding[i].HostPort)) - var portStart, portEnd int - if err == nil { - portStart, portEnd, err = newP.Range() - } - if err != nil { - return nil, fmt.Errorf("Error parsing HostPort value(%s):%v", binding[i].HostPort, err) - } - pbCopy.HostPort = uint16(portStart) - pbCopy.HostPortEnd = uint16(portEnd) - pbCopy.HostIP = net.ParseIP(binding[i].HostIP) - pbList = append(pbList, pbCopy) - } - - if container.HostConfig.PublishAllPorts && len(binding) == 0 { - pbList = append(pbList, pb) - } - } - - var dns []string - - if len(container.HostConfig.DNS) > 0 { - dns = container.HostConfig.DNS - } else if len(daemonDNS) > 0 { - dns = daemonDNS - } - - if len(dns) > 0 { - createOptions = append(createOptions, - libnetwork.CreateOptionDNS(dns)) - } - - createOptions = append(createOptions, - libnetwork.CreateOptionPortMapping(pbList), - libnetwork.CreateOptionExposedPorts(exposeList)) - - return createOptions, nil -} - -// UpdateMonitor updates monitor configure for running container -func (container *Container) UpdateMonitor(restartPolicy containertypes.RestartPolicy) { - type policySetter interface { - SetPolicy(containertypes.RestartPolicy) - } - - if rm, ok := container.RestartManager().(policySetter); ok { - rm.SetPolicy(restartPolicy) - } -} - -// FullHostname returns hostname and optional domain appended to it. -func (container *Container) FullHostname() string { - fullHostname := container.Config.Hostname - if container.Config.Domainname != "" { - fullHostname = fmt.Sprintf("%s.%s", fullHostname, container.Config.Domainname) - } - return fullHostname -} - -// RestartManager returns the current restartmanager instance connected to container. -func (container *Container) RestartManager() restartmanager.RestartManager { - if container.restartManager == nil { - container.restartManager = restartmanager.New(container.HostConfig.RestartPolicy, container.RestartCount) - } - return container.restartManager -} - -// ResetRestartManager initializes new restartmanager based on container config -func (container *Container) ResetRestartManager(resetCount bool) { - if container.restartManager != nil { - container.restartManager.Cancel() - } - if resetCount { - container.RestartCount = 0 - } - container.restartManager = nil -} - -type attachContext struct { - ctx context.Context - cancel context.CancelFunc - mu sync.Mutex -} - -// InitAttachContext initializes or returns existing context for attach calls to -// track container liveness. -func (container *Container) InitAttachContext() context.Context { - container.attachContext.mu.Lock() - defer container.attachContext.mu.Unlock() - if container.attachContext.ctx == nil { - container.attachContext.ctx, container.attachContext.cancel = context.WithCancel(context.Background()) - } - return container.attachContext.ctx -} - -// CancelAttachContext cancels attach context. All attach calls should detach -// after this call. -func (container *Container) CancelAttachContext() { - container.attachContext.mu.Lock() - if container.attachContext.ctx != nil { - container.attachContext.cancel() - container.attachContext.ctx = nil - } - container.attachContext.mu.Unlock() -} - -func (container *Container) startLogging() error { - if container.HostConfig.LogConfig.Type == "none" { - return nil // do not start logging routines - } - - l, err := container.StartLogger(container.HostConfig.LogConfig) - if err != nil { - return fmt.Errorf("Failed to initialize logging driver: %v", err) - } - - copier := logger.NewCopier(map[string]io.Reader{"stdout": container.StdoutPipe(), "stderr": container.StderrPipe()}, l) - container.LogCopier = copier - copier.Run() - container.LogDriver = l - - // set LogPath field only for json-file logdriver - if jl, ok := l.(*jsonfilelog.JSONFileLogger); ok { - container.LogPath = jl.LogPath() - } - - return nil -} - -// StdinPipe gets the stdin stream of the container -func (container *Container) StdinPipe() io.WriteCloser { - return container.StreamConfig.StdinPipe() -} - -// StdoutPipe gets the stdout stream of the container -func (container *Container) StdoutPipe() io.ReadCloser { - return container.StreamConfig.StdoutPipe() -} - -// StderrPipe gets the stderr stream of the container -func (container *Container) StderrPipe() io.ReadCloser { - return container.StreamConfig.StderrPipe() -} - -// CloseStreams closes the container's stdio streams -func (container *Container) CloseStreams() error { - return container.StreamConfig.CloseStreams() -} - -// InitializeStdio is called by libcontainerd to connect the stdio. -func (container *Container) InitializeStdio(iop libcontainerd.IOPipe) error { - if err := container.startLogging(); err != nil { - container.Reset(false) - return err - } - - container.StreamConfig.CopyToPipe(iop) - - if container.StreamConfig.Stdin() == nil && !container.Config.Tty { - if iop.Stdin != nil { - if err := iop.Stdin.Close(); err != nil { - logrus.Warnf("error closing stdin: %+v", err) - } - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/container/container_linux.go b/vendor/github.com/docker/docker/container/container_linux.go deleted file mode 100644 index 4d4c16b56..000000000 --- a/vendor/github.com/docker/docker/container/container_linux.go +++ /dev/null @@ -1,9 +0,0 @@ -package container - -import ( - "golang.org/x/sys/unix" -) - -func detachMounted(path string) error { - return unix.Unmount(path, unix.MNT_DETACH) -} diff --git a/vendor/github.com/docker/docker/container/container_notlinux.go b/vendor/github.com/docker/docker/container/container_notlinux.go deleted file mode 100644 index f65653e99..000000000 --- a/vendor/github.com/docker/docker/container/container_notlinux.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build solaris freebsd - -package container - -import ( - "golang.org/x/sys/unix" -) - -func detachMounted(path string) error { - //Solaris and FreeBSD do not support the lazy unmount or MNT_DETACH feature. - // Therefore there are separate definitions for this. - return unix.Unmount(path, 0) -} - -// SecretMount returns the mount for the secret path -func (container *Container) SecretMount() *Mount { - return nil -} - -// UnmountSecrets unmounts the fs for secrets -func (container *Container) UnmountSecrets() error { - return nil -} diff --git a/vendor/github.com/docker/docker/container/container_unit_test.go b/vendor/github.com/docker/docker/container/container_unit_test.go deleted file mode 100644 index f301f25bb..000000000 --- a/vendor/github.com/docker/docker/container/container_unit_test.go +++ /dev/null @@ -1,60 +0,0 @@ -package container - -import ( - "testing" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/pkg/signal" -) - -func TestContainerStopSignal(t *testing.T) { - c := &Container{ - CommonContainer: CommonContainer{ - Config: &container.Config{}, - }, - } - - def, err := signal.ParseSignal(signal.DefaultStopSignal) - if err != nil { - t.Fatal(err) - } - - s := c.StopSignal() - if s != int(def) { - t.Fatalf("Expected %v, got %v", def, s) - } - - c = &Container{ - CommonContainer: CommonContainer{ - Config: &container.Config{StopSignal: "SIGKILL"}, - }, - } - s = c.StopSignal() - if s != 9 { - t.Fatalf("Expected 9, got %v", s) - } -} - -func TestContainerStopTimeout(t *testing.T) { - c := &Container{ - CommonContainer: CommonContainer{ - Config: &container.Config{}, - }, - } - - s := c.StopTimeout() - if s != DefaultStopTimeout { - t.Fatalf("Expected %v, got %v", DefaultStopTimeout, s) - } - - stopTimeout := 15 - c = &Container{ - CommonContainer: CommonContainer{ - Config: &container.Config{StopTimeout: &stopTimeout}, - }, - } - s = c.StopSignal() - if s != 15 { - t.Fatalf("Expected 15, got %v", s) - } -} diff --git a/vendor/github.com/docker/docker/container/container_unix.go b/vendor/github.com/docker/docker/container/container_unix.go deleted file mode 100644 index 4f6b795d2..000000000 --- a/vendor/github.com/docker/docker/container/container_unix.go +++ /dev/null @@ -1,448 +0,0 @@ -// +build linux freebsd solaris - -package container - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strings" - - "github.com/Sirupsen/logrus" - containertypes "github.com/docker/docker/api/types/container" - mounttypes "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/pkg/chrootarchive" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/symlink" - "github.com/docker/docker/pkg/system" - "github.com/docker/docker/utils" - "github.com/docker/docker/volume" - "github.com/opencontainers/runc/libcontainer/label" - "golang.org/x/sys/unix" -) - -const ( - // DefaultSHMSize is the default size (64MB) of the SHM which will be mounted in the container - DefaultSHMSize int64 = 67108864 - containerSecretMountPath = "/run/secrets" -) - -// Container holds the fields specific to unixen implementations. -// See CommonContainer for standard fields common to all containers. -type Container struct { - CommonContainer - - // Fields below here are platform specific. - AppArmorProfile string - HostnamePath string - HostsPath string - ShmPath string - ResolvConfPath string - SeccompProfile string - NoNewPrivileges bool -} - -// ExitStatus provides exit reasons for a container. -type ExitStatus struct { - // The exit code with which the container exited. - ExitCode int - - // Whether the container encountered an OOM. - OOMKilled bool -} - -// CreateDaemonEnvironment returns the list of all environment variables given the list of -// environment variables related to links. -// Sets PATH, HOSTNAME and if container.Config.Tty is set: TERM. -// The defaults set here do not override the values in container.Config.Env -func (container *Container) CreateDaemonEnvironment(tty bool, linkedEnv []string) []string { - // Setup environment - env := []string{ - "PATH=" + system.DefaultPathEnv, - "HOSTNAME=" + container.Config.Hostname, - } - if tty { - env = append(env, "TERM=xterm") - } - env = append(env, linkedEnv...) - // because the env on the container can override certain default values - // we need to replace the 'env' keys where they match and append anything - // else. - env = utils.ReplaceOrAppendEnvValues(env, container.Config.Env) - return env -} - -// TrySetNetworkMount attempts to set the network mounts given a provided destination and -// the path to use for it; return true if the given destination was a network mount file -func (container *Container) TrySetNetworkMount(destination string, path string) bool { - if destination == "/etc/resolv.conf" { - container.ResolvConfPath = path - return true - } - if destination == "/etc/hostname" { - container.HostnamePath = path - return true - } - if destination == "/etc/hosts" { - container.HostsPath = path - return true - } - - return false -} - -// BuildHostnameFile writes the container's hostname file. -func (container *Container) BuildHostnameFile() error { - hostnamePath, err := container.GetRootResourcePath("hostname") - if err != nil { - return err - } - container.HostnamePath = hostnamePath - return ioutil.WriteFile(container.HostnamePath, []byte(container.Config.Hostname+"\n"), 0644) -} - -// NetworkMounts returns the list of network mounts. -func (container *Container) NetworkMounts() []Mount { - var mounts []Mount - shared := container.HostConfig.NetworkMode.IsContainer() - if container.ResolvConfPath != "" { - if _, err := os.Stat(container.ResolvConfPath); err != nil { - logrus.Warnf("ResolvConfPath set to %q, but can't stat this filename (err = %v); skipping", container.ResolvConfPath, err) - } else { - if !container.HasMountFor("/etc/resolv.conf") { - label.Relabel(container.ResolvConfPath, container.MountLabel, shared) - } - writable := !container.HostConfig.ReadonlyRootfs - if m, exists := container.MountPoints["/etc/resolv.conf"]; exists { - writable = m.RW - } - mounts = append(mounts, Mount{ - Source: container.ResolvConfPath, - Destination: "/etc/resolv.conf", - Writable: writable, - Propagation: string(volume.DefaultPropagationMode), - }) - } - } - if container.HostnamePath != "" { - if _, err := os.Stat(container.HostnamePath); err != nil { - logrus.Warnf("HostnamePath set to %q, but can't stat this filename (err = %v); skipping", container.HostnamePath, err) - } else { - if !container.HasMountFor("/etc/hostname") { - label.Relabel(container.HostnamePath, container.MountLabel, shared) - } - writable := !container.HostConfig.ReadonlyRootfs - if m, exists := container.MountPoints["/etc/hostname"]; exists { - writable = m.RW - } - mounts = append(mounts, Mount{ - Source: container.HostnamePath, - Destination: "/etc/hostname", - Writable: writable, - Propagation: string(volume.DefaultPropagationMode), - }) - } - } - if container.HostsPath != "" { - if _, err := os.Stat(container.HostsPath); err != nil { - logrus.Warnf("HostsPath set to %q, but can't stat this filename (err = %v); skipping", container.HostsPath, err) - } else { - if !container.HasMountFor("/etc/hosts") { - label.Relabel(container.HostsPath, container.MountLabel, shared) - } - writable := !container.HostConfig.ReadonlyRootfs - if m, exists := container.MountPoints["/etc/hosts"]; exists { - writable = m.RW - } - mounts = append(mounts, Mount{ - Source: container.HostsPath, - Destination: "/etc/hosts", - Writable: writable, - Propagation: string(volume.DefaultPropagationMode), - }) - } - } - return mounts -} - -// SecretMountPath returns the path of the secret mount for the container -func (container *Container) SecretMountPath() string { - return filepath.Join(container.Root, "secrets") -} - -// CopyImagePathContent copies files in destination to the volume. -func (container *Container) CopyImagePathContent(v volume.Volume, destination string) error { - rootfs, err := symlink.FollowSymlinkInScope(filepath.Join(container.BaseFS, destination), container.BaseFS) - if err != nil { - return err - } - - if _, err = ioutil.ReadDir(rootfs); err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - - id := stringid.GenerateNonCryptoID() - path, err := v.Mount(id) - if err != nil { - return err - } - - defer func() { - if err := v.Unmount(id); err != nil { - logrus.Warnf("error while unmounting volume %s: %v", v.Name(), err) - } - }() - if err := label.Relabel(path, container.MountLabel, true); err != nil && err != unix.ENOTSUP { - return err - } - return copyExistingContents(rootfs, path) -} - -// ShmResourcePath returns path to shm -func (container *Container) ShmResourcePath() (string, error) { - return container.GetRootResourcePath("shm") -} - -// HasMountFor checks if path is a mountpoint -func (container *Container) HasMountFor(path string) bool { - _, exists := container.MountPoints[path] - return exists -} - -// UnmountIpcMounts uses the provided unmount function to unmount shm and mqueue if they were mounted -func (container *Container) UnmountIpcMounts(unmount func(pth string) error) { - if container.HostConfig.IpcMode.IsContainer() || container.HostConfig.IpcMode.IsHost() { - return - } - - var warnings []string - - if !container.HasMountFor("/dev/shm") { - shmPath, err := container.ShmResourcePath() - if err != nil { - logrus.Error(err) - warnings = append(warnings, err.Error()) - } else if shmPath != "" { - if err := unmount(shmPath); err != nil && !os.IsNotExist(err) { - warnings = append(warnings, fmt.Sprintf("failed to umount %s: %v", shmPath, err)) - } - - } - } - - if len(warnings) > 0 { - logrus.Warnf("failed to cleanup ipc mounts:\n%v", strings.Join(warnings, "\n")) - } -} - -// IpcMounts returns the list of IPC mounts -func (container *Container) IpcMounts() []Mount { - var mounts []Mount - - if !container.HasMountFor("/dev/shm") { - label.SetFileLabel(container.ShmPath, container.MountLabel) - mounts = append(mounts, Mount{ - Source: container.ShmPath, - Destination: "/dev/shm", - Writable: true, - Propagation: string(volume.DefaultPropagationMode), - }) - } - - return mounts -} - -// SecretMount returns the mount for the secret path -func (container *Container) SecretMount() *Mount { - if len(container.SecretReferences) > 0 { - return &Mount{ - Source: container.SecretMountPath(), - Destination: containerSecretMountPath, - Writable: false, - } - } - - return nil -} - -// UnmountSecrets unmounts the local tmpfs for secrets -func (container *Container) UnmountSecrets() error { - if _, err := os.Stat(container.SecretMountPath()); err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - - return detachMounted(container.SecretMountPath()) -} - -// UpdateContainer updates configuration of a container. -func (container *Container) UpdateContainer(hostConfig *containertypes.HostConfig) error { - container.Lock() - defer container.Unlock() - - // update resources of container - resources := hostConfig.Resources - cResources := &container.HostConfig.Resources - if resources.BlkioWeight != 0 { - cResources.BlkioWeight = resources.BlkioWeight - } - if resources.CPUShares != 0 { - cResources.CPUShares = resources.CPUShares - } - if resources.CPUPeriod != 0 { - cResources.CPUPeriod = resources.CPUPeriod - } - if resources.CPUQuota != 0 { - cResources.CPUQuota = resources.CPUQuota - } - if resources.CpusetCpus != "" { - cResources.CpusetCpus = resources.CpusetCpus - } - if resources.CpusetMems != "" { - cResources.CpusetMems = resources.CpusetMems - } - if resources.Memory != 0 { - // if memory limit smaller than already set memoryswap limit and doesn't - // update the memoryswap limit, then error out. - if resources.Memory > cResources.MemorySwap && resources.MemorySwap == 0 { - return fmt.Errorf("Memory limit should be smaller than already set memoryswap limit, update the memoryswap at the same time") - } - cResources.Memory = resources.Memory - } - if resources.MemorySwap != 0 { - cResources.MemorySwap = resources.MemorySwap - } - if resources.MemoryReservation != 0 { - cResources.MemoryReservation = resources.MemoryReservation - } - if resources.KernelMemory != 0 { - cResources.KernelMemory = resources.KernelMemory - } - - // update HostConfig of container - if hostConfig.RestartPolicy.Name != "" { - if container.HostConfig.AutoRemove && !hostConfig.RestartPolicy.IsNone() { - return fmt.Errorf("Restart policy cannot be updated because AutoRemove is enabled for the container") - } - container.HostConfig.RestartPolicy = hostConfig.RestartPolicy - } - - if err := container.ToDisk(); err != nil { - logrus.Errorf("Error saving updated container: %v", err) - return err - } - - return nil -} - -// DetachAndUnmount uses a detached mount on all mount destinations, then -// unmounts each volume normally. -// This is used from daemon/archive for `docker cp` -func (container *Container) DetachAndUnmount(volumeEventLog func(name, action string, attributes map[string]string)) error { - networkMounts := container.NetworkMounts() - mountPaths := make([]string, 0, len(container.MountPoints)+len(networkMounts)) - - for _, mntPoint := range container.MountPoints { - dest, err := container.GetResourcePath(mntPoint.Destination) - if err != nil { - logrus.Warnf("Failed to get volume destination path for container '%s' at '%s' while lazily unmounting: %v", container.ID, mntPoint.Destination, err) - continue - } - mountPaths = append(mountPaths, dest) - } - - for _, m := range networkMounts { - dest, err := container.GetResourcePath(m.Destination) - if err != nil { - logrus.Warnf("Failed to get volume destination path for container '%s' at '%s' while lazily unmounting: %v", container.ID, m.Destination, err) - continue - } - mountPaths = append(mountPaths, dest) - } - - for _, mountPath := range mountPaths { - if err := detachMounted(mountPath); err != nil { - logrus.Warnf("%s unmountVolumes: Failed to do lazy umount fo volume '%s': %v", container.ID, mountPath, err) - } - } - return container.UnmountVolumes(volumeEventLog) -} - -// copyExistingContents copies from the source to the destination and -// ensures the ownership is appropriately set. -func copyExistingContents(source, destination string) error { - volList, err := ioutil.ReadDir(source) - if err != nil { - return err - } - if len(volList) > 0 { - srcList, err := ioutil.ReadDir(destination) - if err != nil { - return err - } - if len(srcList) == 0 { - // If the source volume is empty, copies files from the root into the volume - if err := chrootarchive.CopyWithTar(source, destination); err != nil { - return err - } - } - } - return copyOwnership(source, destination) -} - -// copyOwnership copies the permissions and uid:gid of the source file -// to the destination file -func copyOwnership(source, destination string) error { - stat, err := system.Stat(source) - if err != nil { - return err - } - - if err := os.Chown(destination, int(stat.UID()), int(stat.GID())); err != nil { - return err - } - - return os.Chmod(destination, os.FileMode(stat.Mode())) -} - -// TmpfsMounts returns the list of tmpfs mounts -func (container *Container) TmpfsMounts() ([]Mount, error) { - var mounts []Mount - for dest, data := range container.HostConfig.Tmpfs { - mounts = append(mounts, Mount{ - Source: "tmpfs", - Destination: dest, - Data: data, - }) - } - for dest, mnt := range container.MountPoints { - if mnt.Type == mounttypes.TypeTmpfs { - data, err := volume.ConvertTmpfsOptions(mnt.Spec.TmpfsOptions, mnt.Spec.ReadOnly) - if err != nil { - return nil, err - } - mounts = append(mounts, Mount{ - Source: "tmpfs", - Destination: dest, - Data: data, - }) - } - } - return mounts, nil -} - -// cleanResourcePath cleans a resource path and prepares to combine with mnt path -func cleanResourcePath(path string) string { - return filepath.Join(string(os.PathSeparator), path) -} - -// EnableServiceDiscoveryOnDefaultNetwork Enable service discovery on default network -func (container *Container) EnableServiceDiscoveryOnDefaultNetwork() bool { - return false -} diff --git a/vendor/github.com/docker/docker/container/container_windows.go b/vendor/github.com/docker/docker/container/container_windows.go deleted file mode 100644 index 1025836f1..000000000 --- a/vendor/github.com/docker/docker/container/container_windows.go +++ /dev/null @@ -1,111 +0,0 @@ -// +build windows - -package container - -import ( - "fmt" - "os" - "path/filepath" - - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/utils" -) - -// Container holds fields specific to the Windows implementation. See -// CommonContainer for standard fields common to all containers. -type Container struct { - CommonContainer - - // Fields below here are platform specific. -} - -// ExitStatus provides exit reasons for a container. -type ExitStatus struct { - // The exit code with which the container exited. - ExitCode int -} - -// CreateDaemonEnvironment creates a new environment variable slice for this container. -func (container *Container) CreateDaemonEnvironment(_ bool, linkedEnv []string) []string { - // because the env on the container can override certain default values - // we need to replace the 'env' keys where they match and append anything - // else. - return utils.ReplaceOrAppendEnvValues(linkedEnv, container.Config.Env) -} - -// UnmountIpcMounts unmounts Ipc related mounts. -// This is a NOOP on windows. -func (container *Container) UnmountIpcMounts(unmount func(pth string) error) { -} - -// IpcMounts returns the list of Ipc related mounts. -func (container *Container) IpcMounts() []Mount { - return nil -} - -// SecretMount returns the mount for the secret path -func (container *Container) SecretMount() *Mount { - return nil -} - -// UnmountSecrets unmounts the fs for secrets -func (container *Container) UnmountSecrets() error { - return nil -} - -// DetachAndUnmount unmounts all volumes. -// On Windows it only delegates to `UnmountVolumes` since there is nothing to -// force unmount. -func (container *Container) DetachAndUnmount(volumeEventLog func(name, action string, attributes map[string]string)) error { - return container.UnmountVolumes(volumeEventLog) -} - -// TmpfsMounts returns the list of tmpfs mounts -func (container *Container) TmpfsMounts() ([]Mount, error) { - var mounts []Mount - return mounts, nil -} - -// UpdateContainer updates configuration of a container -func (container *Container) UpdateContainer(hostConfig *containertypes.HostConfig) error { - container.Lock() - defer container.Unlock() - resources := hostConfig.Resources - if resources.BlkioWeight != 0 || resources.CPUShares != 0 || - resources.CPUPeriod != 0 || resources.CPUQuota != 0 || - resources.CpusetCpus != "" || resources.CpusetMems != "" || - resources.Memory != 0 || resources.MemorySwap != 0 || - resources.MemoryReservation != 0 || resources.KernelMemory != 0 { - return fmt.Errorf("Resource updating isn't supported on Windows") - } - // update HostConfig of container - if hostConfig.RestartPolicy.Name != "" { - if container.HostConfig.AutoRemove && !hostConfig.RestartPolicy.IsNone() { - return fmt.Errorf("Restart policy cannot be updated because AutoRemove is enabled for the container") - } - container.HostConfig.RestartPolicy = hostConfig.RestartPolicy - } - return nil -} - -// cleanResourcePath cleans a resource path by removing C:\ syntax, and prepares -// to combine with a volume path -func cleanResourcePath(path string) string { - if len(path) >= 2 { - c := path[0] - if path[1] == ':' && ('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z') { - path = path[2:] - } - } - return filepath.Join(string(os.PathSeparator), path) -} - -// BuildHostnameFile writes the container's hostname file. -func (container *Container) BuildHostnameFile() error { - return nil -} - -// EnableServiceDiscoveryOnDefaultNetwork Enable service discovery on default network -func (container *Container) EnableServiceDiscoveryOnDefaultNetwork() bool { - return true -} diff --git a/vendor/github.com/docker/docker/container/health.go b/vendor/github.com/docker/docker/container/health.go deleted file mode 100644 index 6e3cd12f3..000000000 --- a/vendor/github.com/docker/docker/container/health.go +++ /dev/null @@ -1,49 +0,0 @@ -package container - -import ( - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" -) - -// Health holds the current container health-check state -type Health struct { - types.Health - stop chan struct{} // Write struct{} to stop the monitor -} - -// String returns a human-readable description of the health-check state -func (s *Health) String() string { - // This happens when the container is being shutdown and the monitor has stopped - // or the monitor has yet to be setup. - if s.stop == nil { - return types.Unhealthy - } - - switch s.Status { - case types.Starting: - return "health: starting" - default: // Healthy and Unhealthy are clear on their own - return s.Status - } -} - -// OpenMonitorChannel creates and returns a new monitor channel. If there already is one, -// it returns nil. -func (s *Health) OpenMonitorChannel() chan struct{} { - if s.stop == nil { - logrus.Debug("OpenMonitorChannel") - s.stop = make(chan struct{}) - return s.stop - } - return nil -} - -// CloseMonitorChannel closes any existing monitor channel. -func (s *Health) CloseMonitorChannel() { - if s.stop != nil { - logrus.Debug("CloseMonitorChannel: waiting for probe to stop") - close(s.stop) - s.stop = nil - logrus.Debug("CloseMonitorChannel done") - } -} diff --git a/vendor/github.com/docker/docker/container/history.go b/vendor/github.com/docker/docker/container/history.go deleted file mode 100644 index c80c2aa0c..000000000 --- a/vendor/github.com/docker/docker/container/history.go +++ /dev/null @@ -1,30 +0,0 @@ -package container - -import "sort" - -// History is a convenience type for storing a list of containers, -// sorted by creation date in descendant order. -type History []*Container - -// Len returns the number of containers in the history. -func (history *History) Len() int { - return len(*history) -} - -// Less compares two containers and returns true if the second one -// was created before the first one. -func (history *History) Less(i, j int) bool { - containers := *history - return containers[j].Created.Before(containers[i].Created) -} - -// Swap switches containers i and j positions in the history. -func (history *History) Swap(i, j int) { - containers := *history - containers[i], containers[j] = containers[j], containers[i] -} - -// sort orders the history by creation date in descendant order. -func (history *History) sort() { - sort.Sort(history) -} diff --git a/vendor/github.com/docker/docker/container/memory_store.go b/vendor/github.com/docker/docker/container/memory_store.go deleted file mode 100644 index 706407a71..000000000 --- a/vendor/github.com/docker/docker/container/memory_store.go +++ /dev/null @@ -1,95 +0,0 @@ -package container - -import ( - "sync" -) - -// memoryStore implements a Store in memory. -type memoryStore struct { - s map[string]*Container - sync.RWMutex -} - -// NewMemoryStore initializes a new memory store. -func NewMemoryStore() Store { - return &memoryStore{ - s: make(map[string]*Container), - } -} - -// Add appends a new container to the memory store. -// It overrides the id if it existed before. -func (c *memoryStore) Add(id string, cont *Container) { - c.Lock() - c.s[id] = cont - c.Unlock() -} - -// Get returns a container from the store by id. -func (c *memoryStore) Get(id string) *Container { - var res *Container - c.RLock() - res = c.s[id] - c.RUnlock() - return res -} - -// Delete removes a container from the store by id. -func (c *memoryStore) Delete(id string) { - c.Lock() - delete(c.s, id) - c.Unlock() -} - -// List returns a sorted list of containers from the store. -// The containers are ordered by creation date. -func (c *memoryStore) List() []*Container { - containers := History(c.all()) - containers.sort() - return containers -} - -// Size returns the number of containers in the store. -func (c *memoryStore) Size() int { - c.RLock() - defer c.RUnlock() - return len(c.s) -} - -// First returns the first container found in the store by a given filter. -func (c *memoryStore) First(filter StoreFilter) *Container { - for _, cont := range c.all() { - if filter(cont) { - return cont - } - } - return nil -} - -// ApplyAll calls the reducer function with every container in the store. -// This operation is asynchronous in the memory store. -// NOTE: Modifications to the store MUST NOT be done by the StoreReducer. -func (c *memoryStore) ApplyAll(apply StoreReducer) { - wg := new(sync.WaitGroup) - for _, cont := range c.all() { - wg.Add(1) - go func(container *Container) { - apply(container) - wg.Done() - }(cont) - } - - wg.Wait() -} - -func (c *memoryStore) all() []*Container { - c.RLock() - containers := make([]*Container, 0, len(c.s)) - for _, cont := range c.s { - containers = append(containers, cont) - } - c.RUnlock() - return containers -} - -var _ Store = &memoryStore{} diff --git a/vendor/github.com/docker/docker/container/memory_store_test.go b/vendor/github.com/docker/docker/container/memory_store_test.go deleted file mode 100644 index f81738fae..000000000 --- a/vendor/github.com/docker/docker/container/memory_store_test.go +++ /dev/null @@ -1,106 +0,0 @@ -package container - -import ( - "testing" - "time" -) - -func TestNewMemoryStore(t *testing.T) { - s := NewMemoryStore() - m, ok := s.(*memoryStore) - if !ok { - t.Fatalf("store is not a memory store %v", s) - } - if m.s == nil { - t.Fatal("expected store map to not be nil") - } -} - -func TestAddContainers(t *testing.T) { - s := NewMemoryStore() - s.Add("id", NewBaseContainer("id", "root")) - if s.Size() != 1 { - t.Fatalf("expected store size 1, got %v", s.Size()) - } -} - -func TestGetContainer(t *testing.T) { - s := NewMemoryStore() - s.Add("id", NewBaseContainer("id", "root")) - c := s.Get("id") - if c == nil { - t.Fatal("expected container to not be nil") - } -} - -func TestDeleteContainer(t *testing.T) { - s := NewMemoryStore() - s.Add("id", NewBaseContainer("id", "root")) - s.Delete("id") - if c := s.Get("id"); c != nil { - t.Fatalf("expected container to be nil after removal, got %v", c) - } - - if s.Size() != 0 { - t.Fatalf("expected store size to be 0, got %v", s.Size()) - } -} - -func TestListContainers(t *testing.T) { - s := NewMemoryStore() - - cont := NewBaseContainer("id", "root") - cont.Created = time.Now() - cont2 := NewBaseContainer("id2", "root") - cont2.Created = time.Now().Add(24 * time.Hour) - - s.Add("id", cont) - s.Add("id2", cont2) - - list := s.List() - if len(list) != 2 { - t.Fatalf("expected list size 2, got %v", len(list)) - } - if list[0].ID != "id2" { - t.Fatalf("expected older container to be first, got %v", list[0].ID) - } -} - -func TestFirstContainer(t *testing.T) { - s := NewMemoryStore() - - s.Add("id", NewBaseContainer("id", "root")) - s.Add("id2", NewBaseContainer("id2", "root")) - - first := s.First(func(cont *Container) bool { - return cont.ID == "id2" - }) - - if first == nil { - t.Fatal("expected container to not be nil") - } - if first.ID != "id2" { - t.Fatalf("expected id2, got %v", first) - } -} - -func TestApplyAllContainer(t *testing.T) { - s := NewMemoryStore() - - s.Add("id", NewBaseContainer("id", "root")) - s.Add("id2", NewBaseContainer("id2", "root")) - - s.ApplyAll(func(cont *Container) { - if cont.ID == "id2" { - cont.ID = "newID" - } - }) - - cont := s.Get("id2") - if cont == nil { - t.Fatal("expected container to not be nil") - } - if cont.ID != "newID" { - t.Fatalf("expected newID, got %v", cont) - } -} diff --git a/vendor/github.com/docker/docker/container/monitor.go b/vendor/github.com/docker/docker/container/monitor.go deleted file mode 100644 index f05e72b25..000000000 --- a/vendor/github.com/docker/docker/container/monitor.go +++ /dev/null @@ -1,46 +0,0 @@ -package container - -import ( - "time" - - "github.com/Sirupsen/logrus" -) - -const ( - loggerCloseTimeout = 10 * time.Second -) - -// Reset puts a container into a state where it can be restarted again. -func (container *Container) Reset(lock bool) { - if lock { - container.Lock() - defer container.Unlock() - } - - if err := container.CloseStreams(); err != nil { - logrus.Errorf("%s: %s", container.ID, err) - } - - // Re-create a brand new stdin pipe once the container exited - if container.Config.OpenStdin { - container.StreamConfig.NewInputPipes() - } - - if container.LogDriver != nil { - if container.LogCopier != nil { - exit := make(chan struct{}) - go func() { - container.LogCopier.Wait() - close(exit) - }() - select { - case <-time.After(loggerCloseTimeout): - logrus.Warn("Logger didn't exit in time: logs may be truncated") - case <-exit: - } - } - container.LogDriver.Close() - container.LogCopier = nil - container.LogDriver = nil - } -} diff --git a/vendor/github.com/docker/docker/container/mounts_unix.go b/vendor/github.com/docker/docker/container/mounts_unix.go deleted file mode 100644 index c52abed2d..000000000 --- a/vendor/github.com/docker/docker/container/mounts_unix.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !windows - -package container - -// Mount contains information for a mount operation. -type Mount struct { - Source string `json:"source"` - Destination string `json:"destination"` - Writable bool `json:"writable"` - Data string `json:"data"` - Propagation string `json:"mountpropagation"` -} diff --git a/vendor/github.com/docker/docker/container/mounts_windows.go b/vendor/github.com/docker/docker/container/mounts_windows.go deleted file mode 100644 index 01b327f78..000000000 --- a/vendor/github.com/docker/docker/container/mounts_windows.go +++ /dev/null @@ -1,8 +0,0 @@ -package container - -// Mount contains information for a mount operation. -type Mount struct { - Source string `json:"source"` - Destination string `json:"destination"` - Writable bool `json:"writable"` -} diff --git a/vendor/github.com/docker/docker/container/state.go b/vendor/github.com/docker/docker/container/state.go deleted file mode 100644 index 4dd2ecec6..000000000 --- a/vendor/github.com/docker/docker/container/state.go +++ /dev/null @@ -1,343 +0,0 @@ -package container - -import ( - "fmt" - "sync" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/go-units" -) - -// State holds the current container state, and has methods to get and -// set the state. Container has an embed, which allows all of the -// functions defined against State to run against Container. -type State struct { - sync.Mutex - // FIXME: Why do we have both paused and running if a - // container cannot be paused and running at the same time? - Running bool - Paused bool - Restarting bool - OOMKilled bool - RemovalInProgress bool // Not need for this to be persistent on disk. - Dead bool - Pid int - ExitCodeValue int `json:"ExitCode"` - ErrorMsg string `json:"Error"` // contains last known error when starting the container - StartedAt time.Time - FinishedAt time.Time - waitChan chan struct{} - Health *Health -} - -// StateStatus is used to return an error type implementing both -// exec.ExitCode and error. -// This type is needed as State include a sync.Mutex field which make -// copying it unsafe. -type StateStatus struct { - exitCode int - error string -} - -func newStateStatus(ec int, err string) *StateStatus { - return &StateStatus{ - exitCode: ec, - error: err, - } -} - -// ExitCode returns current exitcode for the state. -func (ss *StateStatus) ExitCode() int { - return ss.exitCode -} - -// Error returns current error for the state. -func (ss *StateStatus) Error() string { - return ss.error -} - -// NewState creates a default state object with a fresh channel for state changes. -func NewState() *State { - return &State{ - waitChan: make(chan struct{}), - } -} - -// String returns a human-readable description of the state -func (s *State) String() string { - if s.Running { - if s.Paused { - return fmt.Sprintf("Up %s (Paused)", units.HumanDuration(time.Now().UTC().Sub(s.StartedAt))) - } - if s.Restarting { - return fmt.Sprintf("Restarting (%d) %s ago", s.ExitCodeValue, units.HumanDuration(time.Now().UTC().Sub(s.FinishedAt))) - } - - if h := s.Health; h != nil { - return fmt.Sprintf("Up %s (%s)", units.HumanDuration(time.Now().UTC().Sub(s.StartedAt)), h.String()) - } - - return fmt.Sprintf("Up %s", units.HumanDuration(time.Now().UTC().Sub(s.StartedAt))) - } - - if s.RemovalInProgress { - return "Removal In Progress" - } - - if s.Dead { - return "Dead" - } - - if s.StartedAt.IsZero() { - return "Created" - } - - if s.FinishedAt.IsZero() { - return "" - } - - return fmt.Sprintf("Exited (%d) %s ago", s.ExitCodeValue, units.HumanDuration(time.Now().UTC().Sub(s.FinishedAt))) -} - -// HealthString returns a single string to describe health status. -func (s *State) HealthString() string { - if s.Health == nil { - return types.NoHealthcheck - } - - return s.Health.String() -} - -// IsValidHealthString checks if the provided string is a valid container health status or not. -func IsValidHealthString(s string) bool { - return s == types.Starting || - s == types.Healthy || - s == types.Unhealthy || - s == types.NoHealthcheck -} - -// StateString returns a single string to describe state -func (s *State) StateString() string { - if s.Running { - if s.Paused { - return "paused" - } - if s.Restarting { - return "restarting" - } - return "running" - } - - if s.RemovalInProgress { - return "removing" - } - - if s.Dead { - return "dead" - } - - if s.StartedAt.IsZero() { - return "created" - } - - return "exited" -} - -// IsValidStateString checks if the provided string is a valid container state or not. -func IsValidStateString(s string) bool { - if s != "paused" && - s != "restarting" && - s != "removing" && - s != "running" && - s != "dead" && - s != "created" && - s != "exited" { - return false - } - return true -} - -func wait(waitChan <-chan struct{}, timeout time.Duration) error { - if timeout < 0 { - <-waitChan - return nil - } - select { - case <-time.After(timeout): - return fmt.Errorf("Timed out: %v", timeout) - case <-waitChan: - return nil - } -} - -// WaitStop waits until state is stopped. If state already stopped it returns -// immediately. If you want wait forever you must supply negative timeout. -// Returns exit code, that was passed to SetStopped -func (s *State) WaitStop(timeout time.Duration) (int, error) { - s.Lock() - if !s.Running { - exitCode := s.ExitCodeValue - s.Unlock() - return exitCode, nil - } - waitChan := s.waitChan - s.Unlock() - if err := wait(waitChan, timeout); err != nil { - return -1, err - } - s.Lock() - defer s.Unlock() - return s.ExitCode(), nil -} - -// WaitWithContext waits for the container to stop. Optional context can be -// passed for canceling the request. -func (s *State) WaitWithContext(ctx context.Context) error { - // todo(tonistiigi): make other wait functions use this - s.Lock() - if !s.Running { - state := newStateStatus(s.ExitCode(), s.Error()) - defer s.Unlock() - if state.ExitCode() == 0 { - return nil - } - return state - } - waitChan := s.waitChan - s.Unlock() - select { - case <-waitChan: - s.Lock() - state := newStateStatus(s.ExitCode(), s.Error()) - s.Unlock() - if state.ExitCode() == 0 { - return nil - } - return state - case <-ctx.Done(): - return ctx.Err() - } -} - -// IsRunning returns whether the running flag is set. Used by Container to check whether a container is running. -func (s *State) IsRunning() bool { - s.Lock() - res := s.Running - s.Unlock() - return res -} - -// GetPID holds the process id of a container. -func (s *State) GetPID() int { - s.Lock() - res := s.Pid - s.Unlock() - return res -} - -// ExitCode returns current exitcode for the state. Take lock before if state -// may be shared. -func (s *State) ExitCode() int { - return s.ExitCodeValue -} - -// SetExitCode sets current exitcode for the state. Take lock before if state -// may be shared. -func (s *State) SetExitCode(ec int) { - s.ExitCodeValue = ec -} - -// SetRunning sets the state of the container to "running". -func (s *State) SetRunning(pid int, initial bool) { - s.ErrorMsg = "" - s.Running = true - s.Restarting = false - s.ExitCodeValue = 0 - s.Pid = pid - if initial { - s.StartedAt = time.Now().UTC() - } -} - -// SetStopped sets the container state to "stopped" without locking. -func (s *State) SetStopped(exitStatus *ExitStatus) { - s.Running = false - s.Paused = false - s.Restarting = false - s.Pid = 0 - s.FinishedAt = time.Now().UTC() - s.setFromExitStatus(exitStatus) - close(s.waitChan) // fire waiters for stop - s.waitChan = make(chan struct{}) -} - -// SetRestarting sets the container state to "restarting" without locking. -// It also sets the container PID to 0. -func (s *State) SetRestarting(exitStatus *ExitStatus) { - // we should consider the container running when it is restarting because of - // all the checks in docker around rm/stop/etc - s.Running = true - s.Restarting = true - s.Pid = 0 - s.FinishedAt = time.Now().UTC() - s.setFromExitStatus(exitStatus) - close(s.waitChan) // fire waiters for stop - s.waitChan = make(chan struct{}) -} - -// SetError sets the container's error state. This is useful when we want to -// know the error that occurred when container transits to another state -// when inspecting it -func (s *State) SetError(err error) { - s.ErrorMsg = err.Error() -} - -// IsPaused returns whether the container is paused or not. -func (s *State) IsPaused() bool { - s.Lock() - res := s.Paused - s.Unlock() - return res -} - -// IsRestarting returns whether the container is restarting or not. -func (s *State) IsRestarting() bool { - s.Lock() - res := s.Restarting - s.Unlock() - return res -} - -// SetRemovalInProgress sets the container state as being removed. -// It returns true if the container was already in that state. -func (s *State) SetRemovalInProgress() bool { - s.Lock() - defer s.Unlock() - if s.RemovalInProgress { - return true - } - s.RemovalInProgress = true - return false -} - -// ResetRemovalInProgress makes the RemovalInProgress state to false. -func (s *State) ResetRemovalInProgress() { - s.Lock() - s.RemovalInProgress = false - s.Unlock() -} - -// SetDead sets the container state to "dead" -func (s *State) SetDead() { - s.Lock() - s.Dead = true - s.Unlock() -} - -// Error returns current error for the state. -func (s *State) Error() string { - return s.ErrorMsg -} diff --git a/vendor/github.com/docker/docker/container/state_solaris.go b/vendor/github.com/docker/docker/container/state_solaris.go deleted file mode 100644 index 1229650ef..000000000 --- a/vendor/github.com/docker/docker/container/state_solaris.go +++ /dev/null @@ -1,7 +0,0 @@ -package container - -// setFromExitStatus is a platform specific helper function to set the state -// based on the ExitStatus structure. -func (s *State) setFromExitStatus(exitStatus *ExitStatus) { - s.ExitCodeValue = exitStatus.ExitCode -} diff --git a/vendor/github.com/docker/docker/container/state_test.go b/vendor/github.com/docker/docker/container/state_test.go deleted file mode 100644 index c9a7bb4b7..000000000 --- a/vendor/github.com/docker/docker/container/state_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package container - -import ( - "sync/atomic" - "testing" - "time" - - "github.com/docker/docker/api/types" -) - -func TestIsValidHealthString(t *testing.T) { - contexts := []struct { - Health string - Expected bool - }{ - {types.Healthy, true}, - {types.Unhealthy, true}, - {types.Starting, true}, - {types.NoHealthcheck, true}, - {"fail", false}, - } - - for _, c := range contexts { - v := IsValidHealthString(c.Health) - if v != c.Expected { - t.Fatalf("Expected %t, but got %t", c.Expected, v) - } - } -} - -func TestStateRunStop(t *testing.T) { - s := NewState() - for i := 1; i < 3; i++ { // full lifecycle two times - s.Lock() - s.SetRunning(i+100, false) - s.Unlock() - - if !s.IsRunning() { - t.Fatal("State not running") - } - if s.Pid != i+100 { - t.Fatalf("Pid %v, expected %v", s.Pid, i+100) - } - if s.ExitCode() != 0 { - t.Fatalf("ExitCode %v, expected 0", s.ExitCode()) - } - - stopped := make(chan struct{}) - var exit int64 - go func() { - exitCode, _ := s.WaitStop(-1 * time.Second) - atomic.StoreInt64(&exit, int64(exitCode)) - close(stopped) - }() - s.Lock() - s.SetStopped(&ExitStatus{ExitCode: i}) - s.Unlock() - if s.IsRunning() { - t.Fatal("State is running") - } - if s.ExitCode() != i { - t.Fatalf("ExitCode %v, expected %v", s.ExitCode(), i) - } - if s.Pid != 0 { - t.Fatalf("Pid %v, expected 0", s.Pid) - } - select { - case <-time.After(100 * time.Millisecond): - t.Fatal("Stop callback doesn't fire in 100 milliseconds") - case <-stopped: - t.Log("Stop callback fired") - } - exitCode := int(atomic.LoadInt64(&exit)) - if exitCode != i { - t.Fatalf("ExitCode %v, expected %v", exitCode, i) - } - if exitCode, err := s.WaitStop(-1 * time.Second); err != nil || exitCode != i { - t.Fatalf("WaitStop returned exitCode: %v, err: %v, expected exitCode: %v, err: %v", exitCode, err, i, nil) - } - } -} - -func TestStateTimeoutWait(t *testing.T) { - s := NewState() - stopped := make(chan struct{}) - go func() { - s.WaitStop(100 * time.Millisecond) - close(stopped) - }() - select { - case <-time.After(200 * time.Millisecond): - t.Fatal("Stop callback doesn't fire in 200 milliseconds") - case <-stopped: - t.Log("Stop callback fired") - } - - s.Lock() - s.SetStopped(&ExitStatus{ExitCode: 1}) - s.Unlock() - - stopped = make(chan struct{}) - go func() { - s.WaitStop(100 * time.Millisecond) - close(stopped) - }() - select { - case <-time.After(200 * time.Millisecond): - t.Fatal("Stop callback doesn't fire in 100 milliseconds") - case <-stopped: - t.Log("Stop callback fired") - } - -} diff --git a/vendor/github.com/docker/docker/container/state_unix.go b/vendor/github.com/docker/docker/container/state_unix.go deleted file mode 100644 index a2fa5afc2..000000000 --- a/vendor/github.com/docker/docker/container/state_unix.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build linux freebsd - -package container - -// setFromExitStatus is a platform specific helper function to set the state -// based on the ExitStatus structure. -func (s *State) setFromExitStatus(exitStatus *ExitStatus) { - s.ExitCodeValue = exitStatus.ExitCode - s.OOMKilled = exitStatus.OOMKilled -} diff --git a/vendor/github.com/docker/docker/container/state_windows.go b/vendor/github.com/docker/docker/container/state_windows.go deleted file mode 100644 index 1229650ef..000000000 --- a/vendor/github.com/docker/docker/container/state_windows.go +++ /dev/null @@ -1,7 +0,0 @@ -package container - -// setFromExitStatus is a platform specific helper function to set the state -// based on the ExitStatus structure. -func (s *State) setFromExitStatus(exitStatus *ExitStatus) { - s.ExitCodeValue = exitStatus.ExitCode -} diff --git a/vendor/github.com/docker/docker/container/store.go b/vendor/github.com/docker/docker/container/store.go deleted file mode 100644 index 042fb1a34..000000000 --- a/vendor/github.com/docker/docker/container/store.go +++ /dev/null @@ -1,28 +0,0 @@ -package container - -// StoreFilter defines a function to filter -// container in the store. -type StoreFilter func(*Container) bool - -// StoreReducer defines a function to -// manipulate containers in the store -type StoreReducer func(*Container) - -// Store defines an interface that -// any container store must implement. -type Store interface { - // Add appends a new container to the store. - Add(string, *Container) - // Get returns a container from the store by the identifier it was stored with. - Get(string) *Container - // Delete removes a container from the store by the identifier it was stored with. - Delete(string) - // List returns a list of containers from the store. - List() []*Container - // Size returns the number of containers in the store. - Size() int - // First returns the first container found in the store by a given filter. - First(StoreFilter) *Container - // ApplyAll calls the reducer function with every container in the store. - ApplyAll(StoreReducer) -} diff --git a/vendor/github.com/docker/docker/container/stream/streams.go b/vendor/github.com/docker/docker/container/stream/streams.go deleted file mode 100644 index 79f366afd..000000000 --- a/vendor/github.com/docker/docker/container/stream/streams.go +++ /dev/null @@ -1,143 +0,0 @@ -package stream - -import ( - "fmt" - "io" - "io/ioutil" - "strings" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/libcontainerd" - "github.com/docker/docker/pkg/broadcaster" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/pools" -) - -// Config holds information about I/O streams managed together. -// -// config.StdinPipe returns a WriteCloser which can be used to feed data -// to the standard input of the streamConfig's active process. -// config.StdoutPipe and streamConfig.StderrPipe each return a ReadCloser -// which can be used to retrieve the standard output (and error) generated -// by the container's active process. The output (and error) are actually -// copied and delivered to all StdoutPipe and StderrPipe consumers, using -// a kind of "broadcaster". -type Config struct { - sync.WaitGroup - stdout *broadcaster.Unbuffered - stderr *broadcaster.Unbuffered - stdin io.ReadCloser - stdinPipe io.WriteCloser -} - -// NewConfig creates a stream config and initializes -// the standard err and standard out to new unbuffered broadcasters. -func NewConfig() *Config { - return &Config{ - stderr: new(broadcaster.Unbuffered), - stdout: new(broadcaster.Unbuffered), - } -} - -// Stdout returns the standard output in the configuration. -func (c *Config) Stdout() *broadcaster.Unbuffered { - return c.stdout -} - -// Stderr returns the standard error in the configuration. -func (c *Config) Stderr() *broadcaster.Unbuffered { - return c.stderr -} - -// Stdin returns the standard input in the configuration. -func (c *Config) Stdin() io.ReadCloser { - return c.stdin -} - -// StdinPipe returns an input writer pipe as an io.WriteCloser. -func (c *Config) StdinPipe() io.WriteCloser { - return c.stdinPipe -} - -// StdoutPipe creates a new io.ReadCloser with an empty bytes pipe. -// It adds this new out pipe to the Stdout broadcaster. -func (c *Config) StdoutPipe() io.ReadCloser { - bytesPipe := ioutils.NewBytesPipe() - c.stdout.Add(bytesPipe) - return bytesPipe -} - -// StderrPipe creates a new io.ReadCloser with an empty bytes pipe. -// It adds this new err pipe to the Stderr broadcaster. -func (c *Config) StderrPipe() io.ReadCloser { - bytesPipe := ioutils.NewBytesPipe() - c.stderr.Add(bytesPipe) - return bytesPipe -} - -// NewInputPipes creates new pipes for both standard inputs, Stdin and StdinPipe. -func (c *Config) NewInputPipes() { - c.stdin, c.stdinPipe = io.Pipe() -} - -// NewNopInputPipe creates a new input pipe that will silently drop all messages in the input. -func (c *Config) NewNopInputPipe() { - c.stdinPipe = ioutils.NopWriteCloser(ioutil.Discard) -} - -// CloseStreams ensures that the configured streams are properly closed. -func (c *Config) CloseStreams() error { - var errors []string - - if c.stdin != nil { - if err := c.stdin.Close(); err != nil { - errors = append(errors, fmt.Sprintf("error close stdin: %s", err)) - } - } - - if err := c.stdout.Clean(); err != nil { - errors = append(errors, fmt.Sprintf("error close stdout: %s", err)) - } - - if err := c.stderr.Clean(); err != nil { - errors = append(errors, fmt.Sprintf("error close stderr: %s", err)) - } - - if len(errors) > 0 { - return fmt.Errorf(strings.Join(errors, "\n")) - } - - return nil -} - -// CopyToPipe connects streamconfig with a libcontainerd.IOPipe -func (c *Config) CopyToPipe(iop libcontainerd.IOPipe) { - copyFunc := func(w io.Writer, r io.Reader) { - c.Add(1) - go func() { - if _, err := pools.Copy(w, r); err != nil { - logrus.Errorf("stream copy error: %+v", err) - } - c.Done() - }() - } - - if iop.Stdout != nil { - copyFunc(c.Stdout(), iop.Stdout) - } - if iop.Stderr != nil { - copyFunc(c.Stderr(), iop.Stderr) - } - - if stdin := c.Stdin(); stdin != nil { - if iop.Stdin != nil { - go func() { - pools.Copy(iop.Stdin, stdin) - if err := iop.Stdin.Close(); err != nil { - logrus.Warnf("failed to close stdin: %+v", err) - } - }() - } - } -} diff --git a/vendor/github.com/docker/docker/contrib/README.md b/vendor/github.com/docker/docker/contrib/README.md deleted file mode 100644 index 92b1d9443..000000000 --- a/vendor/github.com/docker/docker/contrib/README.md +++ /dev/null @@ -1,4 +0,0 @@ -The `contrib` directory contains scripts, images, and other helpful things -which are not part of the core docker distribution. Please note that they -could be out of date, since they do not receive the same attention as the -rest of the repository. diff --git a/vendor/github.com/docker/docker/contrib/REVIEWERS b/vendor/github.com/docker/docker/contrib/REVIEWERS deleted file mode 100644 index 18e05a307..000000000 --- a/vendor/github.com/docker/docker/contrib/REVIEWERS +++ /dev/null @@ -1 +0,0 @@ -Tianon Gravi (@tianon) diff --git a/vendor/github.com/docker/docker/contrib/apparmor/main.go b/vendor/github.com/docker/docker/contrib/apparmor/main.go deleted file mode 100644 index f4a2978b8..000000000 --- a/vendor/github.com/docker/docker/contrib/apparmor/main.go +++ /dev/null @@ -1,56 +0,0 @@ -package main - -import ( - "fmt" - "log" - "os" - "path" - "text/template" - - "github.com/docker/docker/pkg/aaparser" -) - -type profileData struct { - Version int -} - -func main() { - if len(os.Args) < 2 { - log.Fatal("pass a filename to save the profile in.") - } - - // parse the arg - apparmorProfilePath := os.Args[1] - - version, err := aaparser.GetVersion() - if err != nil { - log.Fatal(err) - } - data := profileData{ - Version: version, - } - fmt.Printf("apparmor_parser is of version %+v\n", data) - - // parse the template - compiled, err := template.New("apparmor_profile").Parse(dockerProfileTemplate) - if err != nil { - log.Fatalf("parsing template failed: %v", err) - } - - // make sure /etc/apparmor.d exists - if err := os.MkdirAll(path.Dir(apparmorProfilePath), 0755); err != nil { - log.Fatal(err) - } - - f, err := os.OpenFile(apparmorProfilePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { - log.Fatal(err) - } - defer f.Close() - - if err := compiled.Execute(f, data); err != nil { - log.Fatalf("executing template failed: %v", err) - } - - fmt.Printf("created apparmor profile for version %+v at %q\n", data, apparmorProfilePath) -} diff --git a/vendor/github.com/docker/docker/contrib/apparmor/template.go b/vendor/github.com/docker/docker/contrib/apparmor/template.go deleted file mode 100644 index e5e1c8bed..000000000 --- a/vendor/github.com/docker/docker/contrib/apparmor/template.go +++ /dev/null @@ -1,268 +0,0 @@ -package main - -const dockerProfileTemplate = `@{DOCKER_GRAPH_PATH}=/var/lib/docker - -profile /usr/bin/docker (attach_disconnected, complain) { - # Prevent following links to these files during container setup. - deny /etc/** mkl, - deny /dev/** kl, - deny /sys/** mkl, - deny /proc/** mkl, - - mount -> @{DOCKER_GRAPH_PATH}/**, - mount -> /, - mount -> /proc/**, - mount -> /sys/**, - mount -> /run/docker/netns/**, - mount -> /.pivot_root[0-9]*/, - - / r, - - umount, - pivot_root, -{{if ge .Version 209000}} - signal (receive) peer=@{profile_name}, - signal (receive) peer=unconfined, - signal (send), -{{end}} - network, - capability, - owner /** rw, - @{DOCKER_GRAPH_PATH}/** rwl, - @{DOCKER_GRAPH_PATH}/linkgraph.db k, - @{DOCKER_GRAPH_PATH}/network/files/boltdb.db k, - @{DOCKER_GRAPH_PATH}/network/files/local-kv.db k, - @{DOCKER_GRAPH_PATH}/[0-9]*.[0-9]*/linkgraph.db k, - - # For non-root client use: - /dev/urandom r, - /dev/null rw, - /dev/pts/[0-9]* rw, - /run/docker.sock rw, - /proc/** r, - /proc/[0-9]*/attr/exec w, - /sys/kernel/mm/hugepages/ r, - /etc/localtime r, - /etc/ld.so.cache r, - /etc/passwd r, - -{{if ge .Version 209000}} - ptrace peer=@{profile_name}, - ptrace (read) peer=docker-default, - deny ptrace (trace) peer=docker-default, - deny ptrace peer=/usr/bin/docker///bin/ps, -{{end}} - - /usr/lib/** rm, - /lib/** rm, - - /usr/bin/docker pix, - /sbin/xtables-multi rCx, - /sbin/iptables rCx, - /sbin/modprobe rCx, - /sbin/auplink rCx, - /sbin/mke2fs rCx, - /sbin/tune2fs rCx, - /sbin/blkid rCx, - /bin/kmod rCx, - /usr/bin/xz rCx, - /bin/ps rCx, - /bin/tar rCx, - /bin/cat rCx, - /sbin/zfs rCx, - /sbin/apparmor_parser rCx, - -{{if ge .Version 209000}} - # Transitions - change_profile -> docker-*, - change_profile -> unconfined, -{{end}} - - profile /bin/cat (complain) { - /etc/ld.so.cache r, - /lib/** rm, - /dev/null rw, - /proc r, - /bin/cat mr, - - # For reading in 'docker stats': - /proc/[0-9]*/net/dev r, - } - profile /bin/ps (complain) { - /etc/ld.so.cache r, - /etc/localtime r, - /etc/passwd r, - /etc/nsswitch.conf r, - /lib/** rm, - /proc/[0-9]*/** r, - /dev/null rw, - /bin/ps mr, - -{{if ge .Version 209000}} - # We don't need ptrace so we'll deny and ignore the error. - deny ptrace (read, trace), -{{end}} - - # Quiet dac_override denials - deny capability dac_override, - deny capability dac_read_search, - deny capability sys_ptrace, - - /dev/tty r, - /proc/stat r, - /proc/cpuinfo r, - /proc/meminfo r, - /proc/uptime r, - /sys/devices/system/cpu/online r, - /proc/sys/kernel/pid_max r, - /proc/ r, - /proc/tty/drivers r, - } - profile /sbin/iptables (complain) { -{{if ge .Version 209000}} - signal (receive) peer=/usr/bin/docker, -{{end}} - capability net_admin, - } - profile /sbin/auplink flags=(attach_disconnected, complain) { -{{if ge .Version 209000}} - signal (receive) peer=/usr/bin/docker, -{{end}} - capability sys_admin, - capability dac_override, - - @{DOCKER_GRAPH_PATH}/aufs/** rw, - @{DOCKER_GRAPH_PATH}/tmp/** rw, - # For user namespaces: - @{DOCKER_GRAPH_PATH}/[0-9]*.[0-9]*/** rw, - - /sys/fs/aufs/** r, - /lib/** rm, - /apparmor/.null r, - /dev/null rw, - /etc/ld.so.cache r, - /sbin/auplink rm, - /proc/fs/aufs/** rw, - /proc/[0-9]*/mounts rw, - } - profile /sbin/modprobe /bin/kmod (complain) { -{{if ge .Version 209000}} - signal (receive) peer=/usr/bin/docker, -{{end}} - capability sys_module, - /etc/ld.so.cache r, - /lib/** rm, - /dev/null rw, - /apparmor/.null rw, - /sbin/modprobe rm, - /bin/kmod rm, - /proc/cmdline r, - /sys/module/** r, - /etc/modprobe.d{/,/**} r, - } - # xz works via pipes, so we do not need access to the filesystem. - profile /usr/bin/xz (complain) { -{{if ge .Version 209000}} - signal (receive) peer=/usr/bin/docker, -{{end}} - /etc/ld.so.cache r, - /lib/** rm, - /usr/bin/xz rm, - deny /proc/** rw, - deny /sys/** rw, - } - profile /sbin/xtables-multi (attach_disconnected, complain) { - /etc/ld.so.cache r, - /lib/** rm, - /sbin/xtables-multi rm, - /apparmor/.null w, - /dev/null rw, - - /proc r, - - capability net_raw, - capability net_admin, - network raw, - } - profile /sbin/zfs (attach_disconnected, complain) { - file, - capability, - } - profile /sbin/mke2fs (complain) { - /sbin/mke2fs rm, - - /lib/** rm, - - /apparmor/.null w, - - /etc/ld.so.cache r, - /etc/mke2fs.conf r, - /etc/mtab r, - - /dev/dm-* rw, - /dev/urandom r, - /dev/null rw, - - /proc/swaps r, - /proc/[0-9]*/mounts r, - } - profile /sbin/tune2fs (complain) { - /sbin/tune2fs rm, - - /lib/** rm, - - /apparmor/.null w, - - /etc/blkid.conf r, - /etc/mtab r, - /etc/ld.so.cache r, - - /dev/null rw, - /dev/.blkid.tab r, - /dev/dm-* rw, - - /proc/swaps r, - /proc/[0-9]*/mounts r, - } - profile /sbin/blkid (complain) { - /sbin/blkid rm, - - /lib/** rm, - /apparmor/.null w, - - /etc/ld.so.cache r, - /etc/blkid.conf r, - - /dev/null rw, - /dev/.blkid.tab rl, - /dev/.blkid.tab* rwl, - /dev/dm-* r, - - /sys/devices/virtual/block/** r, - - capability mknod, - - mount -> @{DOCKER_GRAPH_PATH}/**, - } - profile /sbin/apparmor_parser (complain) { - /sbin/apparmor_parser rm, - - /lib/** rm, - - /etc/ld.so.cache r, - /etc/apparmor/** r, - /etc/apparmor.d/** r, - /etc/apparmor.d/cache/** w, - - /dev/null rw, - - /sys/kernel/security/apparmor/** r, - /sys/kernel/security/apparmor/.replace w, - - /proc/[0-9]*/mounts r, - /proc/sys/kernel/osrelease r, - /proc r, - - capability mac_admin, - } -}` diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/build.sh b/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/build.sh deleted file mode 100755 index 8271d9dc4..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -set -e - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -set -x -./generate.sh -for d in */; do - docker build -t "dockercore/builder-deb:$(basename "$d")" "$d" -done diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/generate.sh b/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/generate.sh deleted file mode 100755 index b5040b709..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/generate.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/bash -set -e - -# This file is used to auto-generate Dockerfiles for making debs via 'make deb' -# -# usage: ./generate.sh [versions] -# ie: ./generate.sh -# to update all Dockerfiles in this directory -# or: ./generate.sh ubuntu-trusty -# to only update ubuntu-trusty/Dockerfile -# or: ./generate.sh ubuntu-newversion -# to create a new folder and a Dockerfile within it -# -# Note: non-LTS versions are not guaranteed to work. - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -versions=( "$@" ) -if [ ${#versions[@]} -eq 0 ]; then - versions=( */ ) -fi -versions=( "${versions[@]%/}" ) - -for version in "${versions[@]}"; do - echo "${versions[@]}" - distro="${version%-*}" - suite="${version##*-}" - from="aarch64/${distro}:${suite}" - - mkdir -p "$version" - echo "$version -> FROM $from" - cat > "$version/Dockerfile" <<-EOF - # - # THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/aarch64/generate.sh"! - # - - FROM $from - - EOF - - dockerBuildTags='apparmor pkcs11 selinux' - runcBuildTags='apparmor selinux' - - # this list is sorted alphabetically; please keep it that way - packages=( - apparmor # for apparmor_parser for testing the profile - bash-completion # for bash-completion debhelper integration - btrfs-tools # for "btrfs/ioctl.h" (and "version.h" if possible) - build-essential # "essential for building Debian packages" - cmake # tini dep - curl ca-certificates # for downloading Go - debhelper # for easy ".deb" building - dh-apparmor # for apparmor debhelper - dh-systemd # for systemd debhelper integration - git # for "git commit" info in "docker -v" - libapparmor-dev # for "sys/apparmor.h" - libdevmapper-dev # for "libdevmapper.h" - libltdl-dev # for pkcs11 "ltdl.h" - libsqlite3-dev # for "sqlite3.h" - pkg-config # for detecting things like libsystemd-journal dynamically - vim-common # tini dep - ) - - case "$suite" in - trusty) - packages+=( libsystemd-journal-dev ) - # aarch64 doesn't have an official downloadable binary for go. - # And gccgo for trusty only includes Go 1.2 implementation which - # is too old to build current go source, fortunately trusty has - # golang-1.6-go package can be used as bootstrap. - packages+=( golang-1.6-go ) - ;; - xenial) - packages+=( libsystemd-dev ) - packages+=( golang-go libseccomp-dev) - - dockerBuildTags="$dockerBuildTags seccomp" - runcBuildTags="$runcBuildTags seccomp" - ;; - *) - echo "Unsupported distro:" $distro:$suite - rm -fr "$version" - exit 1 - ;; - esac - - # update and install packages - echo "RUN apt-get update && apt-get install -y ${packages[*]} --no-install-recommends && rm -rf /var/lib/apt/lists/*" >> "$version/Dockerfile" - echo >> "$version/Dockerfile" - - case "$suite" in - trusty) - echo 'RUN update-alternatives --install /usr/bin/go go /usr/lib/go-1.6/bin/go 100' >> "$version/Dockerfile" - echo >> "$version/Dockerfile" - ;; - *) - ;; - esac - - echo "# Install Go" >> "$version/Dockerfile" - echo "# aarch64 doesn't have official go binaries, so use the version of go installed from" >> "$version/Dockerfile" - echo "# the image to build go from source." >> "$version/Dockerfile" - - awk '$1 == "ENV" && $2 == "GO_VERSION" { print; exit }' ../../../../Dockerfile.aarch64 >> "$version/Dockerfile" - echo 'RUN mkdir /usr/src/go && curl -fsSL https://golang.org/dl/go${GO_VERSION}.src.tar.gz | tar -v -C /usr/src/go -xz --strip-components=1 \' >> "$version/Dockerfile" - echo ' && cd /usr/src/go/src \' >> "$version/Dockerfile" - echo ' && GOOS=linux GOARCH=arm64 GOROOT_BOOTSTRAP="$(go env GOROOT)" ./make.bash' >> "$version/Dockerfile" - echo >> "$version/Dockerfile" - - echo 'ENV PATH $PATH:/usr/src/go/bin' >> "$version/Dockerfile" - echo >> "$version/Dockerfile" - - echo "ENV AUTO_GOPATH 1" >> "$version/Dockerfile" - echo >> "$version/Dockerfile" - - echo "ENV DOCKER_BUILDTAGS $dockerBuildTags" >> "$version/Dockerfile" - echo "ENV RUNC_BUILDTAGS $runcBuildTags" >> "$version/Dockerfile" -done diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/ubuntu-trusty/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/ubuntu-trusty/Dockerfile deleted file mode 100644 index d04860ccd..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/ubuntu-trusty/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/aarch64/generate.sh"! -# - -FROM aarch64/ubuntu:trusty - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libsqlite3-dev pkg-config vim-common libsystemd-journal-dev golang-1.6-go --no-install-recommends && rm -rf /var/lib/apt/lists/* - -RUN update-alternatives --install /usr/bin/go go /usr/lib/go-1.6/bin/go 100 - -# Install Go -# aarch64 doesn't have official go binaries, so use the version of go installed from -# the image to build go from source. -ENV GO_VERSION 1.7.5 -RUN mkdir /usr/src/go && curl -fsSL https://golang.org/dl/go${GO_VERSION}.src.tar.gz | tar -v -C /usr/src/go -xz --strip-components=1 \ - && cd /usr/src/go/src \ - && GOOS=linux GOARCH=arm64 GOROOT_BOOTSTRAP="$(go env GOROOT)" ./make.bash - -ENV PATH $PATH:/usr/src/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux -ENV RUNC_BUILDTAGS apparmor selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/ubuntu-xenial/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/ubuntu-xenial/Dockerfile deleted file mode 100644 index 3cd8442ec..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/aarch64/ubuntu-xenial/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/aarch64/generate.sh"! -# - -FROM aarch64/ubuntu:xenial - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libsqlite3-dev pkg-config vim-common libsystemd-dev golang-go libseccomp-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -# Install Go -# aarch64 doesn't have official go binaries, so use the version of go installed from -# the image to build go from source. -ENV GO_VERSION 1.7.5 -RUN mkdir /usr/src/go && curl -fsSL https://golang.org/dl/go${GO_VERSION}.src.tar.gz | tar -v -C /usr/src/go -xz --strip-components=1 \ - && cd /usr/src/go/src \ - && GOOS=linux GOARCH=arm64 GOROOT_BOOTSTRAP="$(go env GOROOT)" ./make.bash - -ENV PATH $PATH:/usr/src/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux seccomp -ENV RUNC_BUILDTAGS apparmor selinux seccomp diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/README.md b/vendor/github.com/docker/docker/contrib/builder/deb/amd64/README.md deleted file mode 100644 index 20a0ff100..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# `dockercore/builder-deb` - -This image's tags contain the dependencies for building Docker `.deb`s for each of the Debian-based platforms Docker targets. - -To add new tags, see [`contrib/builder/deb/amd64` in https://github.com/docker/docker](https://github.com/docker/docker/tree/master/contrib/builder/deb/amd64), specifically the `generate.sh` script, whose usage is described in a comment at the top of the file. diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/build.sh b/vendor/github.com/docker/docker/contrib/builder/deb/amd64/build.sh deleted file mode 100755 index 8271d9dc4..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -set -e - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -set -x -./generate.sh -for d in */; do - docker build -t "dockercore/builder-deb:$(basename "$d")" "$d" -done diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-jessie/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-jessie/Dockerfile deleted file mode 100644 index 42aaa56c0..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-jessie/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/amd64/generate.sh"! -# - -FROM debian:jessie - -# allow replacing httpredir or deb mirror -ARG APT_MIRROR=deb.debian.org -RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libsqlite3-dev pkg-config vim-common libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux -ENV RUNC_BUILDTAGS apparmor selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-stretch/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-stretch/Dockerfile deleted file mode 100644 index c052be56c..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-stretch/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/amd64/generate.sh"! -# - -FROM debian:stretch - -# allow replacing httpredir or deb mirror -ARG APT_MIRROR=deb.debian.org -RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libseccomp-dev libsqlite3-dev pkg-config vim-common libsystemd-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS apparmor seccomp selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-wheezy/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-wheezy/Dockerfile deleted file mode 100644 index bcedb47b9..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/debian-wheezy/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/amd64/generate.sh"! -# - -FROM debian:wheezy-backports - -# allow replacing httpredir or deb mirror -ARG APT_MIRROR=deb.debian.org -RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list -RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list.d/backports.list - -RUN apt-get update && apt-get install -y -t wheezy-backports btrfs-tools --no-install-recommends && rm -rf /var/lib/apt/lists/* -RUN apt-get update && apt-get install -y apparmor bash-completion build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libsqlite3-dev pkg-config vim-common --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux -ENV RUNC_BUILDTAGS apparmor selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/generate.sh b/vendor/github.com/docker/docker/contrib/builder/deb/amd64/generate.sh deleted file mode 100755 index 765db5d8e..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/generate.sh +++ /dev/null @@ -1,149 +0,0 @@ -#!/bin/bash -set -e - -# usage: ./generate.sh [versions] -# ie: ./generate.sh -# to update all Dockerfiles in this directory -# or: ./generate.sh debian-jessie -# to only update debian-jessie/Dockerfile -# or: ./generate.sh debian-newversion -# to create a new folder and a Dockerfile within it - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -versions=( "$@" ) -if [ ${#versions[@]} -eq 0 ]; then - versions=( */ ) -fi -versions=( "${versions[@]%/}" ) - -for version in "${versions[@]}"; do - distro="${version%-*}" - suite="${version##*-}" - from="${distro}:${suite}" - - case "$from" in - debian:wheezy) - # add -backports, like our users have to - from+='-backports' - ;; - esac - - mkdir -p "$version" - echo "$version -> FROM $from" - cat > "$version/Dockerfile" <<-EOF - # - # THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/amd64/generate.sh"! - # - - FROM $from - EOF - - echo >> "$version/Dockerfile" - - if [ "$distro" = "debian" ]; then - cat >> "$version/Dockerfile" <<-'EOF' - # allow replacing httpredir or deb mirror - ARG APT_MIRROR=deb.debian.org - RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list - EOF - - if [ "$suite" = "wheezy" ]; then - cat >> "$version/Dockerfile" <<-'EOF' - RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list.d/backports.list - EOF - fi - - echo "" >> "$version/Dockerfile" - fi - - extraBuildTags='pkcs11' - runcBuildTags= - - # this list is sorted alphabetically; please keep it that way - packages=( - apparmor # for apparmor_parser for testing the profile - bash-completion # for bash-completion debhelper integration - btrfs-tools # for "btrfs/ioctl.h" (and "version.h" if possible) - build-essential # "essential for building Debian packages" - cmake # tini dep - curl ca-certificates # for downloading Go - debhelper # for easy ".deb" building - dh-apparmor # for apparmor debhelper - dh-systemd # for systemd debhelper integration - git # for "git commit" info in "docker -v" - libapparmor-dev # for "sys/apparmor.h" - libdevmapper-dev # for "libdevmapper.h" - libltdl-dev # for pkcs11 "ltdl.h" - libseccomp-dev # for "seccomp.h" & "libseccomp.so" - libsqlite3-dev # for "sqlite3.h" - pkg-config # for detecting things like libsystemd-journal dynamically - vim-common # tini dep - ) - # packaging for "sd-journal.h" and libraries varies - case "$suite" in - precise|wheezy) ;; - jessie|trusty) packages+=( libsystemd-journal-dev );; - *) packages+=( libsystemd-dev );; - esac - - # debian wheezy & ubuntu precise do not have the right libseccomp libs - # debian jessie & ubuntu trusty have a libseccomp < 2.2.1 :( - case "$suite" in - precise|wheezy|jessie|trusty) - packages=( "${packages[@]/libseccomp-dev}" ) - runcBuildTags="apparmor selinux" - ;; - *) - extraBuildTags+=' seccomp' - runcBuildTags="apparmor seccomp selinux" - ;; - esac - - - if [ "$suite" = 'precise' ]; then - # precise has a few package issues - - # - dh-systemd doesn't exist at all - packages=( "${packages[@]/dh-systemd}" ) - - # - libdevmapper-dev is missing critical structs (too old) - packages=( "${packages[@]/libdevmapper-dev}" ) - extraBuildTags+=' exclude_graphdriver_devicemapper' - - # - btrfs-tools is missing "ioctl.h" (too old), so it's useless - # (since kernels on precise are old too, just skip btrfs entirely) - packages=( "${packages[@]/btrfs-tools}" ) - extraBuildTags+=' exclude_graphdriver_btrfs' - fi - - if [ "$suite" = 'wheezy' ]; then - # pull a couple packages from backports explicitly - # (build failures otherwise) - backportsPackages=( btrfs-tools ) - for pkg in "${backportsPackages[@]}"; do - packages=( "${packages[@]/$pkg}" ) - done - echo "RUN apt-get update && apt-get install -y -t $suite-backports ${backportsPackages[*]} --no-install-recommends && rm -rf /var/lib/apt/lists/*" >> "$version/Dockerfile" - fi - - echo "RUN apt-get update && apt-get install -y ${packages[*]} --no-install-recommends && rm -rf /var/lib/apt/lists/*" >> "$version/Dockerfile" - - echo >> "$version/Dockerfile" - - awk '$1 == "ENV" && $2 == "GO_VERSION" { print; exit }' ../../../../Dockerfile >> "$version/Dockerfile" - echo 'RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local' >> "$version/Dockerfile" - echo 'ENV PATH $PATH:/usr/local/go/bin' >> "$version/Dockerfile" - - echo >> "$version/Dockerfile" - - echo 'ENV AUTO_GOPATH 1' >> "$version/Dockerfile" - - echo >> "$version/Dockerfile" - - # print build tags in alphabetical order - buildTags=$( echo "apparmor selinux $extraBuildTags" | xargs -n1 | sort -n | tr '\n' ' ' | sed -e 's/[[:space:]]*$//' ) - - echo "ENV DOCKER_BUILDTAGS $buildTags" >> "$version/Dockerfile" - echo "ENV RUNC_BUILDTAGS $runcBuildTags" >> "$version/Dockerfile" -done diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-precise/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-precise/Dockerfile deleted file mode 100644 index aa027f83b..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-precise/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/amd64/generate.sh"! -# - -FROM ubuntu:precise - -RUN apt-get update && apt-get install -y apparmor bash-completion build-essential cmake curl ca-certificates debhelper dh-apparmor git libapparmor-dev libltdl-dev libsqlite3-dev pkg-config vim-common --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor exclude_graphdriver_btrfs exclude_graphdriver_devicemapper pkcs11 selinux -ENV RUNC_BUILDTAGS apparmor selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-trusty/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-trusty/Dockerfile deleted file mode 100644 index b03a853ed..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-trusty/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/amd64/generate.sh"! -# - -FROM ubuntu:trusty - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libsqlite3-dev pkg-config vim-common libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux -ENV RUNC_BUILDTAGS apparmor selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-xenial/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-xenial/Dockerfile deleted file mode 100644 index af03f6226..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-xenial/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/amd64/generate.sh"! -# - -FROM ubuntu:xenial - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libseccomp-dev libsqlite3-dev pkg-config vim-common libsystemd-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS apparmor seccomp selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-yakkety/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-yakkety/Dockerfile deleted file mode 100644 index 5ac1edf1a..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/amd64/ubuntu-yakkety/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/amd64/generate.sh"! -# - -FROM ubuntu:yakkety - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libseccomp-dev libsqlite3-dev pkg-config vim-common libsystemd-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS apparmor seccomp selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/debian-jessie/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/armhf/debian-jessie/Dockerfile deleted file mode 100644 index a4ac781eb..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/debian-jessie/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/armhf/generate.sh"! -# - -FROM armhf/debian:jessie - -# allow replacing httpredir or deb mirror -ARG APT_MIRROR=deb.debian.org -RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libsqlite3-dev pkg-config vim-common libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-armv6l.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux -ENV RUNC_BUILDTAGS apparmor selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/generate.sh b/vendor/github.com/docker/docker/contrib/builder/deb/armhf/generate.sh deleted file mode 100755 index e110a219a..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/generate.sh +++ /dev/null @@ -1,158 +0,0 @@ -#!/bin/bash -set -e - -# usage: ./generate.sh [versions] -# ie: ./generate.sh -# to update all Dockerfiles in this directory -# or: ./generate.sh debian-jessie -# to only update debian-jessie/Dockerfile -# or: ./generate.sh debian-newversion -# to create a new folder and a Dockerfile within it - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -versions=( "$@" ) -if [ ${#versions[@]} -eq 0 ]; then - versions=( */ ) -fi -versions=( "${versions[@]%/}" ) - -for version in "${versions[@]}"; do - distro="${version%-*}" - suite="${version##*-}" - from="${distro}:${suite}" - - case "$from" in - raspbian:jessie) - from="resin/rpi-raspbian:jessie" - ;; - *) - from="armhf/$from" - ;; - esac - - mkdir -p "$version" - echo "$version -> FROM $from" - cat > "$version/Dockerfile" <<-EOF - # - # THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/armhf/generate.sh"! - # - - FROM $from - EOF - - echo >> "$version/Dockerfile" - - if [[ "$distro" = "debian" || "$distro" = "raspbian" ]]; then - cat >> "$version/Dockerfile" <<-'EOF' - # allow replacing httpredir or deb mirror - ARG APT_MIRROR=deb.debian.org - RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list - EOF - - if [ "$suite" = "wheezy" ]; then - cat >> "$version/Dockerfile" <<-'EOF' - RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list.d/backports.list - EOF - fi - - echo "" >> "$version/Dockerfile" - fi - - extraBuildTags='pkcs11' - runcBuildTags= - - # this list is sorted alphabetically; please keep it that way - packages=( - apparmor # for apparmor_parser for testing the profile - bash-completion # for bash-completion debhelper integration - btrfs-tools # for "btrfs/ioctl.h" (and "version.h" if possible) - build-essential # "essential for building Debian packages" - cmake # tini dep - curl ca-certificates # for downloading Go - debhelper # for easy ".deb" building - dh-apparmor # for apparmor debhelper - dh-systemd # for systemd debhelper integration - git # for "git commit" info in "docker -v" - libapparmor-dev # for "sys/apparmor.h" - libdevmapper-dev # for "libdevmapper.h" - libltdl-dev # for pkcs11 "ltdl.h" - libseccomp-dev # for "seccomp.h" & "libseccomp.so" - libsqlite3-dev # for "sqlite3.h" - pkg-config # for detecting things like libsystemd-journal dynamically - vim-common # tini dep - ) - # packaging for "sd-journal.h" and libraries varies - case "$suite" in - precise|wheezy) ;; - jessie|trusty) packages+=( libsystemd-journal-dev );; - *) packages+=( libsystemd-dev );; - esac - - # debian wheezy & ubuntu precise do not have the right libseccomp libs - # debian jessie & ubuntu trusty have a libseccomp < 2.2.1 :( - case "$suite" in - precise|wheezy|jessie|trusty) - packages=( "${packages[@]/libseccomp-dev}" ) - runcBuildTags="apparmor selinux" - ;; - *) - extraBuildTags+=' seccomp' - runcBuildTags="apparmor seccomp selinux" - ;; - esac - - - if [ "$suite" = 'precise' ]; then - # precise has a few package issues - - # - dh-systemd doesn't exist at all - packages=( "${packages[@]/dh-systemd}" ) - - # - libdevmapper-dev is missing critical structs (too old) - packages=( "${packages[@]/libdevmapper-dev}" ) - extraBuildTags+=' exclude_graphdriver_devicemapper' - - # - btrfs-tools is missing "ioctl.h" (too old), so it's useless - # (since kernels on precise are old too, just skip btrfs entirely) - packages=( "${packages[@]/btrfs-tools}" ) - extraBuildTags+=' exclude_graphdriver_btrfs' - fi - - if [ "$suite" = 'wheezy' ]; then - # pull a couple packages from backports explicitly - # (build failures otherwise) - backportsPackages=( btrfs-tools ) - for pkg in "${backportsPackages[@]}"; do - packages=( "${packages[@]/$pkg}" ) - done - echo "RUN apt-get update && apt-get install -y -t $suite-backports ${backportsPackages[*]} --no-install-recommends && rm -rf /var/lib/apt/lists/*" >> "$version/Dockerfile" - fi - - echo "RUN apt-get update && apt-get install -y ${packages[*]} --no-install-recommends && rm -rf /var/lib/apt/lists/*" >> "$version/Dockerfile" - - echo >> "$version/Dockerfile" - - awk '$1 == "ENV" && $2 == "GO_VERSION" { print; exit }' ../../../../Dockerfile >> "$version/Dockerfile" - if [ "$distro" == 'raspbian' ]; - then - cat <> "$version/Dockerfile" -# GOARM is the ARM architecture version which is unrelated to the above Golang version -ENV GOARM 6 -EOF - fi - echo 'RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-armv6l.tar.gz" | tar xzC /usr/local' >> "$version/Dockerfile" - echo 'ENV PATH $PATH:/usr/local/go/bin' >> "$version/Dockerfile" - - echo >> "$version/Dockerfile" - - echo 'ENV AUTO_GOPATH 1' >> "$version/Dockerfile" - - echo >> "$version/Dockerfile" - - # print build tags in alphabetical order - buildTags=$( echo "apparmor selinux $extraBuildTags" | xargs -n1 | sort -n | tr '\n' ' ' | sed -e 's/[[:space:]]*$//' ) - - echo "ENV DOCKER_BUILDTAGS $buildTags" >> "$version/Dockerfile" - echo "ENV RUNC_BUILDTAGS $runcBuildTags" >> "$version/Dockerfile" -done diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/raspbian-jessie/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/armhf/raspbian-jessie/Dockerfile deleted file mode 100644 index 4dbfd093d..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/raspbian-jessie/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/armhf/generate.sh"! -# - -FROM resin/rpi-raspbian:jessie - -# allow replacing httpredir or deb mirror -ARG APT_MIRROR=deb.debian.org -RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libsqlite3-dev pkg-config vim-common libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -# GOARM is the ARM architecture version which is unrelated to the above Golang version -ENV GOARM 6 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-armv6l.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux -ENV RUNC_BUILDTAGS apparmor selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-trusty/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-trusty/Dockerfile deleted file mode 100644 index b36c1dac7..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-trusty/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/armhf/generate.sh"! -# - -FROM armhf/ubuntu:trusty - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libsqlite3-dev pkg-config vim-common libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-armv6l.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux -ENV RUNC_BUILDTAGS apparmor selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-xenial/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-xenial/Dockerfile deleted file mode 100644 index b5e55ad2d..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-xenial/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/armhf/generate.sh"! -# - -FROM armhf/ubuntu:xenial - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libseccomp-dev libsqlite3-dev pkg-config vim-common libsystemd-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-armv6l.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS apparmor seccomp selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-yakkety/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-yakkety/Dockerfile deleted file mode 100644 index 69c2e7f2d..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/armhf/ubuntu-yakkety/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/armhf/generate.sh"! -# - -FROM armhf/ubuntu:yakkety - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libseccomp-dev libsqlite3-dev pkg-config vim-common libsystemd-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-armv6l.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS apparmor seccomp selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/build.sh b/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/build.sh deleted file mode 100755 index 7d22e8c47..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -set -e - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -set -x -./generate.sh -for d in */; do - docker build -t "dockercore/builder-deb:$(basename "$d")" "$d" -done diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/generate.sh b/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/generate.sh deleted file mode 100755 index 0e20b9c4b..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/generate.sh +++ /dev/null @@ -1,103 +0,0 @@ -#!/bin/bash -set -e - -# This file is used to auto-generate Dockerfiles for making debs via 'make deb' -# -# usage: ./generate.sh [versions] -# ie: ./generate.sh -# to update all Dockerfiles in this directory -# or: ./generate.sh ubuntu-xenial -# to only update ubuntu-xenial/Dockerfile -# or: ./generate.sh ubuntu-newversion -# to create a new folder and a Dockerfile within it - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -versions=( "$@" ) -if [ ${#versions[@]} -eq 0 ]; then - versions=( */ ) -fi -versions=( "${versions[@]%/}" ) - -for version in "${versions[@]}"; do - echo "${versions[@]}" - distro="${version%-*}" - suite="${version##*-}" - from="ppc64le/${distro}:${suite}" - - mkdir -p "$version" - echo "$version -> FROM $from" - cat > "$version/Dockerfile" <<-EOF - # - # THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/ppc64le/generate.sh"! - # - - FROM $from - - EOF - - extraBuildTags='pkcs11' - runcBuildTags= - - # this list is sorted alphabetically; please keep it that way - packages=( - apparmor # for apparmor_parser for testing the profile - bash-completion # for bash-completion debhelper integration - btrfs-tools # for "btrfs/ioctl.h" (and "version.h" if possible) - build-essential # "essential for building Debian packages" - cmake # tini dep - curl ca-certificates # for downloading Go - debhelper # for easy ".deb" building - dh-apparmor # for apparmor debhelper - dh-systemd # for systemd debhelper integration - git # for "git commit" info in "docker -v" - libapparmor-dev # for "sys/apparmor.h" - libdevmapper-dev # for "libdevmapper.h" - libltdl-dev # for pkcs11 "ltdl.h" - libsqlite3-dev # for "sqlite3.h" - pkg-config # for detecting things like libsystemd-journal dynamically - vim-common # tini dep - ) - - case "$suite" in - trusty) - packages+=( libsystemd-journal-dev ) - ;; - *) - # libseccomp isn't available until ubuntu xenial and is required for "seccomp.h" & "libseccomp.so" - packages+=( libseccomp-dev ) - packages+=( libsystemd-dev ) - ;; - esac - - # buildtags - case "$suite" in - # trusty has no seccomp package - trusty) - runcBuildTags="apparmor selinux" - ;; - # ppc64le support was backported into libseccomp 2.2.3-2, - # so enable seccomp by default - *) - extraBuildTags+=' seccomp' - runcBuildTags="apparmor seccomp selinux" - ;; - esac - - # update and install packages - echo "RUN apt-get update && apt-get install -y ${packages[*]} --no-install-recommends && rm -rf /var/lib/apt/lists/*" >> "$version/Dockerfile" - echo >> "$version/Dockerfile" - - awk '$1 == "ENV" && $2 == "GO_VERSION" { print; exit }' ../../../../Dockerfile.ppc64le >> "$version/Dockerfile" - echo 'RUN curl -fsSL "https://golang.org/dl/go${GO_VERSION}.linux-ppc64le.tar.gz" | tar xzC /usr/local' >> "$version/Dockerfile" - echo 'ENV PATH $PATH:/usr/local/go/bin' >> "$version/Dockerfile" - echo >> "$version/Dockerfile" - - echo 'ENV AUTO_GOPATH 1' >> "$version/Dockerfile" - echo >> "$version/Dockerfile" - - # print build tags in alphabetical order - buildTags=$( echo "apparmor selinux $extraBuildTags" | xargs -n1 | sort -n | tr '\n' ' ' | sed -e 's/[[:space:]]*$//' ) - echo "ENV DOCKER_BUILDTAGS $buildTags" >> "$version/Dockerfile" - echo "ENV RUNC_BUILDTAGS $runcBuildTags" >> "$version/Dockerfile" -done diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-trusty/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-trusty/Dockerfile deleted file mode 100644 index 4182d683b..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-trusty/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/ppc64le/generate.sh"! -# - -FROM ppc64le/ubuntu:trusty - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libsqlite3-dev pkg-config vim-common libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fsSL "https://golang.org/dl/go${GO_VERSION}.linux-ppc64le.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux -ENV RUNC_BUILDTAGS apparmor selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-xenial/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-xenial/Dockerfile deleted file mode 100644 index f1521db72..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-xenial/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/ppc64le/generate.sh"! -# - -FROM ppc64le/ubuntu:xenial - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libsqlite3-dev pkg-config vim-common libseccomp-dev libsystemd-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fsSL "https://golang.org/dl/go${GO_VERSION}.linux-ppc64le.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS apparmor seccomp selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-yakkety/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-yakkety/Dockerfile deleted file mode 100644 index 4f8cc6676..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/ppc64le/ubuntu-yakkety/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/ppc64le/generate.sh"! -# - -FROM ppc64le/ubuntu:yakkety - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libsqlite3-dev pkg-config vim-common libseccomp-dev libsystemd-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fsSL "https://golang.org/dl/go${GO_VERSION}.linux-ppc64le.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS apparmor seccomp selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/s390x/build.sh b/vendor/github.com/docker/docker/contrib/builder/deb/s390x/build.sh deleted file mode 100755 index 8271d9dc4..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/s390x/build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -set -e - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -set -x -./generate.sh -for d in */; do - docker build -t "dockercore/builder-deb:$(basename "$d")" "$d" -done diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/s390x/generate.sh b/vendor/github.com/docker/docker/contrib/builder/deb/s390x/generate.sh deleted file mode 100755 index b8f586084..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/s390x/generate.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash -set -e - -# This file is used to auto-generate Dockerfiles for making debs via 'make deb' -# -# usage: ./generate.sh [versions] -# ie: ./generate.sh -# to update all Dockerfiles in this directory -# or: ./generate.sh ubuntu-xenial -# to only update ubuntu-xenial/Dockerfile -# or: ./generate.sh ubuntu-newversion -# to create a new folder and a Dockerfile within it - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -versions=( "$@" ) -if [ ${#versions[@]} -eq 0 ]; then - versions=( */ ) -fi -versions=( "${versions[@]%/}" ) - -for version in "${versions[@]}"; do - echo "${versions[@]}" - distro="${version%-*}" - suite="${version##*-}" - from="s390x/${distro}:${suite}" - - mkdir -p "$version" - echo "$version -> FROM $from" - cat > "$version/Dockerfile" <<-EOF - # - # THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/s390x/generate.sh"! - # - - FROM $from - - EOF - - extraBuildTags='pkcs11' - runcBuildTags= - - # this list is sorted alphabetically; please keep it that way - packages=( - apparmor # for apparmor_parser for testing the profile - bash-completion # for bash-completion debhelper integration - btrfs-tools # for "btrfs/ioctl.h" (and "version.h" if possible) - build-essential # "essential for building Debian packages" - cmake # tini dep - curl ca-certificates # for downloading Go - debhelper # for easy ".deb" building - dh-apparmor # for apparmor debhelper - dh-systemd # for systemd debhelper integration - git # for "git commit" info in "docker -v" - libapparmor-dev # for "sys/apparmor.h" - libdevmapper-dev # for "libdevmapper.h" - libltdl-dev # for pkcs11 "ltdl.h" - libseccomp-dev # for "seccomp.h" & "libseccomp.so" - libsqlite3-dev # for "sqlite3.h" - pkg-config # for detecting things like libsystemd-journal dynamically - libsystemd-dev - vim-common # tini dep - ) - - case "$suite" in - # s390x needs libseccomp 2.3.1 - xenial) - # Ubuntu Xenial has libseccomp 2.2.3 - runcBuildTags="apparmor selinux" - ;; - *) - extraBuildTags+=' seccomp' - runcBuildTags="apparmor selinux seccomp" - ;; - esac - - # update and install packages - echo "RUN apt-get update && apt-get install -y ${packages[*]} --no-install-recommends && rm -rf /var/lib/apt/lists/*" >> "$version/Dockerfile" - - echo >> "$version/Dockerfile" - - awk '$1 == "ENV" && $2 == "GO_VERSION" { print; exit }' ../../../../Dockerfile >> "$version/Dockerfile" - echo 'RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-s390x.tar.gz" | tar xzC /usr/local' >> "$version/Dockerfile" - echo 'ENV PATH $PATH:/usr/local/go/bin' >> "$version/Dockerfile" - - echo >> "$version/Dockerfile" - - echo 'ENV AUTO_GOPATH 1' >> "$version/Dockerfile" - - echo >> "$version/Dockerfile" - - # print build tags in alphabetical order - buildTags=$( echo "apparmor selinux $extraBuildTags" | xargs -n1 | sort -n | tr '\n' ' ' | sed -e 's/[[:space:]]*$//' ) - - echo "ENV DOCKER_BUILDTAGS $buildTags" >> "$version/Dockerfile" - echo "ENV RUNC_BUILDTAGS $runcBuildTags" >> "$version/Dockerfile" -done diff --git a/vendor/github.com/docker/docker/contrib/builder/deb/s390x/ubuntu-xenial/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/deb/s390x/ubuntu-xenial/Dockerfile deleted file mode 100644 index 6d7e4c574..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/deb/s390x/ubuntu-xenial/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/s390x/generate.sh"! -# - -FROM s390x/ubuntu:xenial - -RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libseccomp-dev libsqlite3-dev pkg-config libsystemd-dev vim-common --no-install-recommends && rm -rf /var/lib/apt/lists/* - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-s390x.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux -ENV RUNC_BUILDTAGS apparmor selinux diff --git a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/README.md b/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/README.md deleted file mode 100644 index 5f2e888c7..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# `dockercore/builder-rpm` - -This image's tags contain the dependencies for building Docker `.rpm`s for each of the RPM-based platforms Docker targets. - -To add new tags, see [`contrib/builder/rpm/amd64` in https://github.com/docker/docker](https://github.com/docker/docker/tree/master/contrib/builder/rpm/amd64), specifically the `generate.sh` script, whose usage is described in a comment at the top of the file. diff --git a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/build.sh b/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/build.sh deleted file mode 100755 index 558f7ee0d..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -set -e - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -set -x -./generate.sh -for d in */; do - docker build -t "dockercore/builder-rpm:$(basename "$d")" "$d" -done diff --git a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/centos-7/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/centos-7/Dockerfile deleted file mode 100644 index 1f841631c..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/centos-7/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/rpm/amd64/generate.sh"! -# - -FROM centos:7 - -RUN yum groupinstall -y "Development Tools" -RUN yum -y swap -- remove systemd-container systemd-container-libs -- install systemd systemd-libs -RUN yum install -y btrfs-progs-devel device-mapper-devel glibc-static libseccomp-devel libselinux-devel libtool-ltdl-devel pkgconfig selinux-policy selinux-policy-devel sqlite-devel systemd-devel tar git cmake vim-common - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS seccomp selinux - diff --git a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/fedora-24/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/fedora-24/Dockerfile deleted file mode 100644 index af040c5c9..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/fedora-24/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/rpm/amd64/generate.sh"! -# - -FROM fedora:24 - -RUN dnf -y upgrade -RUN dnf install -y @development-tools fedora-packager -RUN dnf install -y btrfs-progs-devel device-mapper-devel glibc-static libseccomp-devel libselinux-devel libtool-ltdl-devel pkgconfig selinux-policy selinux-policy-devel sqlite-devel systemd-devel tar git cmake vim-common - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS seccomp selinux - diff --git a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/fedora-25/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/fedora-25/Dockerfile deleted file mode 100644 index 98e57a9c4..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/fedora-25/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/rpm/amd64/generate.sh"! -# - -FROM fedora:25 - -RUN dnf -y upgrade -RUN dnf install -y @development-tools fedora-packager -RUN dnf install -y btrfs-progs-devel device-mapper-devel glibc-static libseccomp-devel libselinux-devel libtool-ltdl-devel pkgconfig selinux-policy selinux-policy-devel sqlite-devel systemd-devel tar git cmake vim-common - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS seccomp selinux - diff --git a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/generate.sh b/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/generate.sh deleted file mode 100755 index 6f93afafa..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/generate.sh +++ /dev/null @@ -1,189 +0,0 @@ -#!/bin/bash -set -e - -# usage: ./generate.sh [versions] -# ie: ./generate.sh -# to update all Dockerfiles in this directory -# or: ./generate.sh centos-7 -# to only update centos-7/Dockerfile -# or: ./generate.sh fedora-newversion -# to create a new folder and a Dockerfile within it - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -versions=( "$@" ) -if [ ${#versions[@]} -eq 0 ]; then - versions=( */ ) -fi -versions=( "${versions[@]%/}" ) - -for version in "${versions[@]}"; do - distro="${version%-*}" - suite="${version##*-}" - from="${distro}:${suite}" - installer=yum - - if [[ "$distro" == "fedora" ]]; then - installer=dnf - fi - if [[ "$distro" == "photon" ]]; then - installer=tdnf - fi - - mkdir -p "$version" - echo "$version -> FROM $from" - cat > "$version/Dockerfile" <<-EOF - # - # THIS FILE IS AUTOGENERATED; SEE "contrib/builder/rpm/amd64/generate.sh"! - # - - FROM $from - EOF - - echo >> "$version/Dockerfile" - - extraBuildTags='pkcs11' - runcBuildTags= - - case "$from" in - oraclelinux:6) - # We need a known version of the kernel-uek-devel headers to set CGO_CPPFLAGS, so grab the UEKR4 GA version - # This requires using yum-config-manager from yum-utils to enable the UEKR4 yum repo - echo "RUN yum install -y yum-utils && curl -o /etc/yum.repos.d/public-yum-ol6.repo http://yum.oracle.com/public-yum-ol6.repo && yum-config-manager -q --enable ol6_UEKR4" >> "$version/Dockerfile" - echo "RUN yum install -y kernel-uek-devel-4.1.12-32.el6uek" >> "$version/Dockerfile" - echo >> "$version/Dockerfile" - ;; - fedora:*) - echo "RUN ${installer} -y upgrade" >> "$version/Dockerfile" - ;; - *) ;; - esac - - case "$from" in - centos:*) - # get "Development Tools" packages dependencies - echo 'RUN yum groupinstall -y "Development Tools"' >> "$version/Dockerfile" - - if [[ "$version" == "centos-7" ]]; then - echo 'RUN yum -y swap -- remove systemd-container systemd-container-libs -- install systemd systemd-libs' >> "$version/Dockerfile" - fi - ;; - oraclelinux:*) - # get "Development Tools" packages and dependencies - # we also need yum-utils for yum-config-manager to pull the latest repo file - echo 'RUN yum groupinstall -y "Development Tools"' >> "$version/Dockerfile" - ;; - opensuse:*) - # get rpm-build and curl packages and dependencies - echo 'RUN zypper --non-interactive install ca-certificates* curl gzip rpm-build' >> "$version/Dockerfile" - ;; - photon:*) - echo "RUN ${installer} install -y wget curl ca-certificates gzip make rpm-build sed gcc linux-api-headers glibc-devel binutils libseccomp libltdl-devel elfutils" >> "$version/Dockerfile" - ;; - *) - echo "RUN ${installer} install -y @development-tools fedora-packager" >> "$version/Dockerfile" - ;; - esac - - packages=( - btrfs-progs-devel # for "btrfs/ioctl.h" (and "version.h" if possible) - device-mapper-devel # for "libdevmapper.h" - glibc-static - libseccomp-devel # for "seccomp.h" & "libseccomp.so" - libselinux-devel # for "libselinux.so" - libtool-ltdl-devel # for pkcs11 "ltdl.h" - pkgconfig # for the pkg-config command - selinux-policy - selinux-policy-devel - sqlite-devel # for "sqlite3.h" - systemd-devel # for "sd-journal.h" and libraries - tar # older versions of dev-tools do not have tar - git # required for containerd and runc clone - cmake # tini build - vim-common # tini build - ) - - case "$from" in - oraclelinux:7) - # Enable the optional repository - packages=( --enablerepo=ol7_optional_latest "${packages[*]}" ) - ;; - esac - - case "$from" in - oraclelinux:6) - # doesn't use systemd, doesn't have a devel package for it - packages=( "${packages[@]/systemd-devel}" ) - ;; - esac - - # opensuse & oraclelinx:6 do not have the right libseccomp libs - case "$from" in - opensuse:*|oraclelinux:6) - packages=( "${packages[@]/libseccomp-devel}" ) - runcBuildTags="selinux" - ;; - *) - extraBuildTags+=' seccomp' - runcBuildTags="seccomp selinux" - ;; - esac - - case "$from" in - opensuse:*) - packages=( "${packages[@]/btrfs-progs-devel/libbtrfs-devel}" ) - packages=( "${packages[@]/pkgconfig/pkg-config}" ) - packages=( "${packages[@]/vim-common/vim}" ) - if [[ "$from" == "opensuse:13."* ]]; then - packages+=( systemd-rpm-macros ) - fi - - # use zypper - echo "RUN zypper --non-interactive install ${packages[*]}" >> "$version/Dockerfile" - ;; - photon:*) - packages=( "${packages[@]/pkgconfig/pkg-config}" ) - echo "RUN ${installer} install -y ${packages[*]}" >> "$version/Dockerfile" - ;; - *) - echo "RUN ${installer} install -y ${packages[*]}" >> "$version/Dockerfile" - ;; - esac - - echo >> "$version/Dockerfile" - - - awk '$1 == "ENV" && $2 == "GO_VERSION" { print; exit }' ../../../../Dockerfile >> "$version/Dockerfile" - echo 'RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local' >> "$version/Dockerfile" - echo 'ENV PATH $PATH:/usr/local/go/bin' >> "$version/Dockerfile" - - echo >> "$version/Dockerfile" - - echo 'ENV AUTO_GOPATH 1' >> "$version/Dockerfile" - - echo >> "$version/Dockerfile" - - # print build tags in alphabetical order - buildTags=$( echo "selinux $extraBuildTags" | xargs -n1 | sort -n | tr '\n' ' ' | sed -e 's/[[:space:]]*$//' ) - - echo "ENV DOCKER_BUILDTAGS $buildTags" >> "$version/Dockerfile" - echo "ENV RUNC_BUILDTAGS $runcBuildTags" >> "$version/Dockerfile" - echo >> "$version/Dockerfile" - - case "$from" in - oraclelinux:6) - # We need to set the CGO_CPPFLAGS environment to use the updated UEKR4 headers with all the userns stuff. - # The ordering is very important and should not be changed. - echo 'ENV CGO_CPPFLAGS -D__EXPORTED_HEADERS__ \' >> "$version/Dockerfile" - echo ' -I/usr/src/kernels/4.1.12-32.el6uek.x86_64/arch/x86/include/generated/uapi \' >> "$version/Dockerfile" - echo ' -I/usr/src/kernels/4.1.12-32.el6uek.x86_64/arch/x86/include/uapi \' >> "$version/Dockerfile" - echo ' -I/usr/src/kernels/4.1.12-32.el6uek.x86_64/include/generated/uapi \' >> "$version/Dockerfile" - echo ' -I/usr/src/kernels/4.1.12-32.el6uek.x86_64/include/uapi \' >> "$version/Dockerfile" - echo ' -I/usr/src/kernels/4.1.12-32.el6uek.x86_64/include' >> "$version/Dockerfile" - echo >> "$version/Dockerfile" - ;; - *) ;; - esac - - -done diff --git a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/opensuse-13.2/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/opensuse-13.2/Dockerfile deleted file mode 100644 index addd43150..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/opensuse-13.2/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/rpm/amd64/generate.sh"! -# - -FROM opensuse:13.2 - -RUN zypper --non-interactive install ca-certificates* curl gzip rpm-build -RUN zypper --non-interactive install libbtrfs-devel device-mapper-devel glibc-static libselinux-devel libtool-ltdl-devel pkg-config selinux-policy selinux-policy-devel sqlite-devel systemd-devel tar git cmake vim systemd-rpm-macros - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS pkcs11 selinux -ENV RUNC_BUILDTAGS selinux - diff --git a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/oraclelinux-6/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/oraclelinux-6/Dockerfile deleted file mode 100644 index c34d3046d..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/oraclelinux-6/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/rpm/amd64/generate.sh"! -# - -FROM oraclelinux:6 - -RUN yum install -y yum-utils && curl -o /etc/yum.repos.d/public-yum-ol6.repo http://yum.oracle.com/public-yum-ol6.repo && yum-config-manager -q --enable ol6_UEKR4 -RUN yum install -y kernel-uek-devel-4.1.12-32.el6uek - -RUN yum groupinstall -y "Development Tools" -RUN yum install -y btrfs-progs-devel device-mapper-devel glibc-static libselinux-devel libtool-ltdl-devel pkgconfig selinux-policy selinux-policy-devel sqlite-devel tar git cmake vim-common - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS pkcs11 selinux -ENV RUNC_BUILDTAGS selinux - -ENV CGO_CPPFLAGS -D__EXPORTED_HEADERS__ \ - -I/usr/src/kernels/4.1.12-32.el6uek.x86_64/arch/x86/include/generated/uapi \ - -I/usr/src/kernels/4.1.12-32.el6uek.x86_64/arch/x86/include/uapi \ - -I/usr/src/kernels/4.1.12-32.el6uek.x86_64/include/generated/uapi \ - -I/usr/src/kernels/4.1.12-32.el6uek.x86_64/include/uapi \ - -I/usr/src/kernels/4.1.12-32.el6uek.x86_64/include - diff --git a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/oraclelinux-7/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/oraclelinux-7/Dockerfile deleted file mode 100644 index 378536b64..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/oraclelinux-7/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/rpm/amd64/generate.sh"! -# - -FROM oraclelinux:7 - -RUN yum groupinstall -y "Development Tools" -RUN yum install -y --enablerepo=ol7_optional_latest btrfs-progs-devel device-mapper-devel glibc-static libseccomp-devel libselinux-devel libtool-ltdl-devel pkgconfig selinux-policy selinux-policy-devel sqlite-devel systemd-devel tar git cmake vim-common - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS seccomp selinux - diff --git a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/photon-1.0/Dockerfile b/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/photon-1.0/Dockerfile deleted file mode 100644 index b77d573d9..000000000 --- a/vendor/github.com/docker/docker/contrib/builder/rpm/amd64/photon-1.0/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# -# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/rpm/amd64/generate.sh"! -# - -FROM photon:1.0 - -RUN tdnf install -y wget curl ca-certificates gzip make rpm-build sed gcc linux-api-headers glibc-devel binutils libseccomp libltdl-devel elfutils -RUN tdnf install -y btrfs-progs-devel device-mapper-devel glibc-static libseccomp-devel libselinux-devel libtool-ltdl-devel pkg-config selinux-policy selinux-policy-devel sqlite-devel systemd-devel tar git cmake vim-common - -ENV GO_VERSION 1.7.5 -RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local -ENV PATH $PATH:/usr/local/go/bin - -ENV AUTO_GOPATH 1 - -ENV DOCKER_BUILDTAGS pkcs11 seccomp selinux -ENV RUNC_BUILDTAGS seccomp selinux - diff --git a/vendor/github.com/docker/docker/contrib/check-config.sh b/vendor/github.com/docker/docker/contrib/check-config.sh deleted file mode 100755 index d07e4ce36..000000000 --- a/vendor/github.com/docker/docker/contrib/check-config.sh +++ /dev/null @@ -1,354 +0,0 @@ -#!/usr/bin/env bash -set -e - -EXITCODE=0 - -# bits of this were adapted from lxc-checkconfig -# see also https://github.com/lxc/lxc/blob/lxc-1.0.2/src/lxc/lxc-checkconfig.in - -possibleConfigs=( - '/proc/config.gz' - "/boot/config-$(uname -r)" - "/usr/src/linux-$(uname -r)/.config" - '/usr/src/linux/.config' -) - -if [ $# -gt 0 ]; then - CONFIG="$1" -else - : ${CONFIG:="${possibleConfigs[0]}"} -fi - -if ! command -v zgrep &> /dev/null; then - zgrep() { - zcat "$2" | grep "$1" - } -fi - -kernelVersion="$(uname -r)" -kernelMajor="${kernelVersion%%.*}" -kernelMinor="${kernelVersion#$kernelMajor.}" -kernelMinor="${kernelMinor%%.*}" - -is_set() { - zgrep "CONFIG_$1=[y|m]" "$CONFIG" > /dev/null -} -is_set_in_kernel() { - zgrep "CONFIG_$1=y" "$CONFIG" > /dev/null -} -is_set_as_module() { - zgrep "CONFIG_$1=m" "$CONFIG" > /dev/null -} - -color() { - local codes=() - if [ "$1" = 'bold' ]; then - codes=( "${codes[@]}" '1' ) - shift - fi - if [ "$#" -gt 0 ]; then - local code= - case "$1" in - # see https://en.wikipedia.org/wiki/ANSI_escape_code#Colors - black) code=30 ;; - red) code=31 ;; - green) code=32 ;; - yellow) code=33 ;; - blue) code=34 ;; - magenta) code=35 ;; - cyan) code=36 ;; - white) code=37 ;; - esac - if [ "$code" ]; then - codes=( "${codes[@]}" "$code" ) - fi - fi - local IFS=';' - echo -en '\033['"${codes[*]}"'m' -} -wrap_color() { - text="$1" - shift - color "$@" - echo -n "$text" - color reset - echo -} - -wrap_good() { - echo "$(wrap_color "$1" white): $(wrap_color "$2" green)" -} -wrap_bad() { - echo "$(wrap_color "$1" bold): $(wrap_color "$2" bold red)" -} -wrap_warning() { - wrap_color >&2 "$*" red -} - -check_flag() { - if is_set_in_kernel "$1"; then - wrap_good "CONFIG_$1" 'enabled' - elif is_set_as_module "$1"; then - wrap_good "CONFIG_$1" 'enabled (as module)' - else - wrap_bad "CONFIG_$1" 'missing' - EXITCODE=1 - fi -} - -check_flags() { - for flag in "$@"; do - echo -n "- "; check_flag "$flag" - done -} - -check_command() { - if command -v "$1" >/dev/null 2>&1; then - wrap_good "$1 command" 'available' - else - wrap_bad "$1 command" 'missing' - EXITCODE=1 - fi -} - -check_device() { - if [ -c "$1" ]; then - wrap_good "$1" 'present' - else - wrap_bad "$1" 'missing' - EXITCODE=1 - fi -} - -check_distro_userns() { - source /etc/os-release 2>/dev/null || /bin/true - if [[ "${ID}" =~ ^(centos|rhel)$ && "${VERSION_ID}" =~ ^7 ]]; then - # this is a CentOS7 or RHEL7 system - grep -q "user_namespace.enable=1" /proc/cmdline || { - # no user namespace support enabled - wrap_bad " (RHEL7/CentOS7" "User namespaces disabled; add 'user_namespace.enable=1' to boot command line)" - EXITCODE=1 - } - fi -} - -if [ ! -e "$CONFIG" ]; then - wrap_warning "warning: $CONFIG does not exist, searching other paths for kernel config ..." - for tryConfig in "${possibleConfigs[@]}"; do - if [ -e "$tryConfig" ]; then - CONFIG="$tryConfig" - break - fi - done - if [ ! -e "$CONFIG" ]; then - wrap_warning "error: cannot find kernel config" - wrap_warning " try running this script again, specifying the kernel config:" - wrap_warning " CONFIG=/path/to/kernel/.config $0 or $0 /path/to/kernel/.config" - exit 1 - fi -fi - -wrap_color "info: reading kernel config from $CONFIG ..." white -echo - -echo 'Generally Necessary:' - -echo -n '- ' -cgroupSubsystemDir="$(awk '/[, ](cpu|cpuacct|cpuset|devices|freezer|memory)[, ]/ && $3 == "cgroup" { print $2 }' /proc/mounts | head -n1)" -cgroupDir="$(dirname "$cgroupSubsystemDir")" -if [ -d "$cgroupDir/cpu" -o -d "$cgroupDir/cpuacct" -o -d "$cgroupDir/cpuset" -o -d "$cgroupDir/devices" -o -d "$cgroupDir/freezer" -o -d "$cgroupDir/memory" ]; then - echo "$(wrap_good 'cgroup hierarchy' 'properly mounted') [$cgroupDir]" -else - if [ "$cgroupSubsystemDir" ]; then - echo "$(wrap_bad 'cgroup hierarchy' 'single mountpoint!') [$cgroupSubsystemDir]" - else - echo "$(wrap_bad 'cgroup hierarchy' 'nonexistent??')" - fi - EXITCODE=1 - echo " $(wrap_color '(see https://github.com/tianon/cgroupfs-mount)' yellow)" -fi - -if [ "$(cat /sys/module/apparmor/parameters/enabled 2>/dev/null)" = 'Y' ]; then - echo -n '- ' - if command -v apparmor_parser &> /dev/null; then - echo "$(wrap_good 'apparmor' 'enabled and tools installed')" - else - echo "$(wrap_bad 'apparmor' 'enabled, but apparmor_parser missing')" - echo -n ' ' - if command -v apt-get &> /dev/null; then - echo "$(wrap_color '(use "apt-get install apparmor" to fix this)')" - elif command -v yum &> /dev/null; then - echo "$(wrap_color '(your best bet is "yum install apparmor-parser")')" - else - echo "$(wrap_color '(look for an "apparmor" package for your distribution)')" - fi - EXITCODE=1 - fi -fi - -flags=( - NAMESPACES {NET,PID,IPC,UTS}_NS - CGROUPS CGROUP_CPUACCT CGROUP_DEVICE CGROUP_FREEZER CGROUP_SCHED CPUSETS MEMCG - KEYS - VETH BRIDGE BRIDGE_NETFILTER - NF_NAT_IPV4 IP_NF_FILTER IP_NF_TARGET_MASQUERADE - NETFILTER_XT_MATCH_{ADDRTYPE,CONNTRACK,IPVS} - IP_NF_NAT NF_NAT NF_NAT_NEEDED - - # required for bind-mounting /dev/mqueue into containers - POSIX_MQUEUE -) -check_flags "${flags[@]}" -if [ "$kernelMajor" -lt 4 ] || [ "$kernelMajor" -eq 4 -a "$kernelMinor" -lt 8 ]; then - check_flags DEVPTS_MULTIPLE_INSTANCES -fi - -echo - -echo 'Optional Features:' -{ - check_flags USER_NS - check_distro_userns -} -{ - check_flags SECCOMP -} -{ - check_flags CGROUP_PIDS -} -{ - check_flags MEMCG_SWAP MEMCG_SWAP_ENABLED - if is_set MEMCG_SWAP && ! is_set MEMCG_SWAP_ENABLED; then - echo " $(wrap_color '(note that cgroup swap accounting is not enabled in your kernel config, you can enable it by setting boot option "swapaccount=1")' bold black)" - fi -} -{ - if is_set LEGACY_VSYSCALL_NATIVE; then - echo -n "- "; wrap_bad "CONFIG_LEGACY_VSYSCALL_NATIVE" 'enabled' - echo " $(wrap_color '(dangerous, provides an ASLR-bypassing target with usable ROP gadgets.)' bold black)" - elif is_set LEGACY_VSYSCALL_EMULATE; then - echo -n "- "; wrap_good "CONFIG_LEGACY_VSYSCALL_EMULATE" 'enabled' - elif is_set LEGACY_VSYSCALL_NONE; then - echo -n "- "; wrap_bad "CONFIG_LEGACY_VSYSCALL_NONE" 'enabled' - echo " $(wrap_color '(containers using eglibc <= 2.13 will not work. Switch to' bold black)" - echo " $(wrap_color ' "CONFIG_VSYSCALL_[NATIVE|EMULATE]" or use "vsyscall=[native|emulate]"' bold black)" - echo " $(wrap_color ' on kernel command line. Note that this will disable ASLR for the,' bold black)" - echo " $(wrap_color ' VDSO which may assist in exploiting security vulnerabilities.)' bold black)" - # else Older kernels (prior to 3dc33bd30f3e, released in v4.40-rc1) do - # not have these LEGACY_VSYSCALL options and are effectively - # LEGACY_VSYSCALL_EMULATE. Even older kernels are presumably - # effectively LEGACY_VSYSCALL_NATIVE. - fi -} - -if [ "$kernelMajor" -lt 4 ] || [ "$kernelMajor" -eq 4 -a "$kernelMinor" -le 5 ]; then - check_flags MEMCG_KMEM -fi - -if [ "$kernelMajor" -lt 3 ] || [ "$kernelMajor" -eq 3 -a "$kernelMinor" -le 18 ]; then - check_flags RESOURCE_COUNTERS -fi - -if [ "$kernelMajor" -lt 3 ] || [ "$kernelMajor" -eq 3 -a "$kernelMinor" -le 13 ]; then - netprio=NETPRIO_CGROUP -else - netprio=CGROUP_NET_PRIO -fi - -flags=( - BLK_CGROUP BLK_DEV_THROTTLING IOSCHED_CFQ CFQ_GROUP_IOSCHED - CGROUP_PERF - CGROUP_HUGETLB - NET_CLS_CGROUP $netprio - CFS_BANDWIDTH FAIR_GROUP_SCHED RT_GROUP_SCHED - IP_VS - IP_VS_NFCT - IP_VS_RR -) -check_flags "${flags[@]}" - -if ! is_set EXT4_USE_FOR_EXT2; then - check_flags EXT3_FS EXT3_FS_XATTR EXT3_FS_POSIX_ACL EXT3_FS_SECURITY - if ! is_set EXT3_FS || ! is_set EXT3_FS_XATTR || ! is_set EXT3_FS_POSIX_ACL || ! is_set EXT3_FS_SECURITY; then - echo " $(wrap_color '(enable these ext3 configs if you are using ext3 as backing filesystem)' bold black)" - fi -fi - -check_flags EXT4_FS EXT4_FS_POSIX_ACL EXT4_FS_SECURITY -if ! is_set EXT4_FS || ! is_set EXT4_FS_POSIX_ACL || ! is_set EXT4_FS_SECURITY; then - if is_set EXT4_USE_FOR_EXT2; then - echo " $(wrap_color 'enable these ext4 configs if you are using ext3 or ext4 as backing filesystem' bold black)" - else - echo " $(wrap_color 'enable these ext4 configs if you are using ext4 as backing filesystem' bold black)" - fi -fi - -echo '- Network Drivers:' -echo ' - "'$(wrap_color 'overlay' blue)'":' -check_flags VXLAN | sed 's/^/ /' -echo ' Optional (for encrypted networks):' -check_flags CRYPTO CRYPTO_AEAD CRYPTO_GCM CRYPTO_SEQIV CRYPTO_GHASH \ - XFRM XFRM_USER XFRM_ALGO INET_ESP INET_XFRM_MODE_TRANSPORT | sed 's/^/ /' -echo ' - "'$(wrap_color 'ipvlan' blue)'":' -check_flags IPVLAN | sed 's/^/ /' -echo ' - "'$(wrap_color 'macvlan' blue)'":' -check_flags MACVLAN DUMMY | sed 's/^/ /' - -# only fail if no storage drivers available -CODE=${EXITCODE} -EXITCODE=0 -STORAGE=1 - -echo '- Storage Drivers:' -echo ' - "'$(wrap_color 'aufs' blue)'":' -check_flags AUFS_FS | sed 's/^/ /' -if ! is_set AUFS_FS && grep -q aufs /proc/filesystems; then - echo " $(wrap_color '(note that some kernels include AUFS patches but not the AUFS_FS flag)' bold black)" -fi -[ "$EXITCODE" = 0 ] && STORAGE=0 -EXITCODE=0 - -echo ' - "'$(wrap_color 'btrfs' blue)'":' -check_flags BTRFS_FS | sed 's/^/ /' -check_flags BTRFS_FS_POSIX_ACL | sed 's/^/ /' -[ "$EXITCODE" = 0 ] && STORAGE=0 -EXITCODE=0 - -echo ' - "'$(wrap_color 'devicemapper' blue)'":' -check_flags BLK_DEV_DM DM_THIN_PROVISIONING | sed 's/^/ /' -[ "$EXITCODE" = 0 ] && STORAGE=0 -EXITCODE=0 - -echo ' - "'$(wrap_color 'overlay' blue)'":' -check_flags OVERLAY_FS | sed 's/^/ /' -[ "$EXITCODE" = 0 ] && STORAGE=0 -EXITCODE=0 - -echo ' - "'$(wrap_color 'zfs' blue)'":' -echo -n " - "; check_device /dev/zfs -echo -n " - "; check_command zfs -echo -n " - "; check_command zpool -[ "$EXITCODE" = 0 ] && STORAGE=0 -EXITCODE=0 - -EXITCODE=$CODE -[ "$STORAGE" = 1 ] && EXITCODE=1 - -echo - -check_limit_over() -{ - if [ $(cat "$1") -le "$2" ]; then - wrap_bad "- $1" "$(cat $1)" - wrap_color " This should be set to at least $2, for example set: sysctl -w kernel/keys/root_maxkeys=1000000" bold black - EXITCODE=1 - else - wrap_good "- $1" "$(cat $1)" - fi -} - -echo 'Limits:' -check_limit_over /proc/sys/kernel/keys/root_maxkeys 10000 -echo - -exit $EXITCODE diff --git a/vendor/github.com/docker/docker/contrib/completion/REVIEWERS b/vendor/github.com/docker/docker/contrib/completion/REVIEWERS deleted file mode 100644 index 03ee2dde3..000000000 --- a/vendor/github.com/docker/docker/contrib/completion/REVIEWERS +++ /dev/null @@ -1,2 +0,0 @@ -Tianon Gravi (@tianon) -Jessie Frazelle (@jfrazelle) diff --git a/vendor/github.com/docker/docker/contrib/completion/bash/docker b/vendor/github.com/docker/docker/contrib/completion/bash/docker deleted file mode 100644 index 7ea5d9a9f..000000000 --- a/vendor/github.com/docker/docker/contrib/completion/bash/docker +++ /dev/null @@ -1,4282 +0,0 @@ -#!/bin/bash -# -# bash completion file for core docker commands -# -# This script provides completion of: -# - commands and their options -# - container ids and names -# - image repos and tags -# - filepaths -# -# To enable the completions either: -# - place this file in /etc/bash_completion.d -# or -# - copy this file to e.g. ~/.docker-completion.sh and add the line -# below to your .bashrc after bash completion features are loaded -# . ~/.docker-completion.sh -# -# Configuration: -# -# For several commands, the amount of completions can be configured by -# setting environment variables. -# -# DOCKER_COMPLETION_SHOW_CONTAINER_IDS -# DOCKER_COMPLETION_SHOW_NETWORK_IDS -# DOCKER_COMPLETION_SHOW_NODE_IDS -# DOCKER_COMPLETION_SHOW_PLUGIN_IDS -# DOCKER_COMPLETION_SHOW_SECRET_IDS -# DOCKER_COMPLETION_SHOW_SERVICE_IDS -# "no" - Show names only (default) -# "yes" - Show names and ids -# -# You can tailor completion for the "events", "history", "inspect", "run", -# "rmi" and "save" commands by settings the following environment -# variables: -# -# DOCKER_COMPLETION_SHOW_IMAGE_IDS -# "none" - Show names only (default) -# "non-intermediate" - Show names and ids, but omit intermediate image IDs -# "all" - Show names and ids, including intermediate image IDs -# -# DOCKER_COMPLETION_SHOW_TAGS -# "yes" - include tags in completion options (default) -# "no" - don't include tags in completion options - -# -# Note: -# Currently, the completions will not work if the docker daemon is not -# bound to the default communication port/socket -# If the docker daemon is using a unix socket for communication your user -# must have access to the socket for the completions to function correctly -# -# Note for developers: -# Please arrange options sorted alphabetically by long name with the short -# options immediately following their corresponding long form. -# This order should be applied to lists, alternatives and code blocks. - -__docker_previous_extglob_setting=$(shopt -p extglob) -shopt -s extglob - -__docker_q() { - docker ${host:+-H "$host"} ${config:+--config "$config"} 2>/dev/null "$@" -} - -# __docker_containers returns a list of containers. Additional options to -# `docker ps` may be specified in order to filter the list, e.g. -# `__docker_containers --filter status=running` -# By default, only names are returned. -# Set DOCKER_COMPLETION_SHOW_CONTAINER_IDS=yes to also complete IDs. -# An optional first option `--id|--name` may be used to limit the -# output to the IDs or names of matching items. This setting takes -# precedence over the environment setting. -__docker_containers() { - local format - if [ "$1" = "--id" ] ; then - format='{{.ID}}' - shift - elif [ "$1" = "--name" ] ; then - format='{{.Names}}' - shift - elif [ "${DOCKER_COMPLETION_SHOW_CONTAINER_IDS}" = yes ] ; then - format='{{.ID}} {{.Names}}' - else - format='{{.Names}}' - fi - __docker_q ps --format "$format" "$@" -} - -# __docker_complete_containers applies completion of containers based on the current -# value of `$cur` or the value of the optional first option `--cur`, if given. -# Additional filters may be appended, see `__docker_containers`. -__docker_complete_containers() { - local current="$cur" - if [ "$1" = "--cur" ] ; then - current="$2" - shift 2 - fi - COMPREPLY=( $(compgen -W "$(__docker_containers "$@")" -- "$current") ) -} - -__docker_complete_containers_all() { - __docker_complete_containers "$@" --all -} - -__docker_complete_containers_running() { - __docker_complete_containers "$@" --filter status=running -} - -__docker_complete_containers_stopped() { - __docker_complete_containers "$@" --filter status=exited -} - -__docker_complete_containers_unpauseable() { - __docker_complete_containers "$@" --filter status=paused -} - -__docker_complete_container_names() { - local containers=( $(__docker_q ps -aq --no-trunc) ) - local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") ) - names=( "${names[@]#/}" ) # trim off the leading "/" from the container names - COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") ) -} - -__docker_complete_container_ids() { - local containers=( $(__docker_q ps -aq) ) - COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") ) -} - -__docker_images() { - local images_args="" - - case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in - all) - images_args="--no-trunc -a" - ;; - non-intermediate) - images_args="--no-trunc" - ;; - esac - - local repo_print_command - if [ "${DOCKER_COMPLETION_SHOW_TAGS:-yes}" = "yes" ]; then - repo_print_command='print $1; print $1":"$2' - else - repo_print_command='print $1' - fi - - local awk_script - case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in - all|non-intermediate) - awk_script='NR>1 { print $3; if ($1 != "") { '"$repo_print_command"' } }' - ;; - none|*) - awk_script='NR>1 && $1 != "" { '"$repo_print_command"' }' - ;; - esac - - __docker_q images $images_args | awk "$awk_script" | grep -v '$' -} - -__docker_complete_images() { - COMPREPLY=( $(compgen -W "$(__docker_images)" -- "$cur") ) - __ltrim_colon_completions "$cur" -} - -__docker_complete_image_repos() { - local repos="$(__docker_q images | awk 'NR>1 && $1 != "" { print $1 }')" - COMPREPLY=( $(compgen -W "$repos" -- "$cur") ) -} - -__docker_complete_image_repos_and_tags() { - local reposAndTags="$(__docker_q images | awk 'NR>1 && $1 != "" { print $1; print $1":"$2 }')" - COMPREPLY=( $(compgen -W "$reposAndTags" -- "$cur") ) - __ltrim_colon_completions "$cur" -} - -# __docker_networks returns a list of all networks. Additional options to -# `docker network ls` may be specified in order to filter the list, e.g. -# `__docker_networks --filter type=custom` -# By default, only names are returned. -# Set DOCKER_COMPLETION_SHOW_NETWORK_IDS=yes to also complete IDs. -# An optional first option `--id|--name` may be used to limit the -# output to the IDs or names of matching items. This setting takes -# precedence over the environment setting. -__docker_networks() { - local format - if [ "$1" = "--id" ] ; then - format='{{.ID}}' - shift - elif [ "$1" = "--name" ] ; then - format='{{.Name}}' - shift - elif [ "${DOCKER_COMPLETION_SHOW_NETWORK_IDS}" = yes ] ; then - format='{{.ID}} {{.Name}}' - else - format='{{.Name}}' - fi - __docker_q network ls --format "$format" "$@" -} - -# __docker_complete_networks applies completion of networks based on the current -# value of `$cur` or the value of the optional first option `--cur`, if given. -# Additional filters may be appended, see `__docker_networks`. -__docker_complete_networks() { - local current="$cur" - if [ "$1" = "--cur" ] ; then - current="$2" - shift 2 - fi - COMPREPLY=( $(compgen -W "$(__docker_networks "$@")" -- "$current") ) -} - -__docker_complete_containers_in_network() { - local containers=$(__docker_q network inspect -f '{{range $i, $c := .Containers}}{{$i}} {{$c.Name}} {{end}}' "$1") - COMPREPLY=( $(compgen -W "$containers" -- "$cur") ) -} - -# __docker_volumes returns a list of all volumes. Additional options to -# `docker volume ls` may be specified in order to filter the list, e.g. -# `__docker_volumes --filter dangling=true` -# Because volumes do not have IDs, this function does not distinguish between -# IDs and names. -__docker_volumes() { - __docker_q volume ls -q "$@" -} - -# __docker_complete_volumes applies completion of volumes based on the current -# value of `$cur` or the value of the optional first option `--cur`, if given. -# Additional filters may be appended, see `__docker_volumes`. -__docker_complete_volumes() { - local current="$cur" - if [ "$1" = "--cur" ] ; then - current="$2" - shift 2 - fi - COMPREPLY=( $(compgen -W "$(__docker_volumes "$@")" -- "$current") ) -} - -# __docker_plugins_bundled returns a list of all plugins of a given type. -# The type has to be specified with the mandatory option `--type`. -# Valid types are: Network, Volume, Authorization. -# Completions may be added or removed with `--add` and `--remove` -# This function only deals with plugins that come bundled with Docker. -# For plugins managed by `docker plugin`, see `__docker_plugins_installed`. -__docker_plugins_bundled() { - local type add=() remove=() - while true ; do - case "$1" in - --type) - type="$2" - shift 2 - ;; - --add) - add+=("$2") - shift 2 - ;; - --remove) - remove+=("$2") - shift 2 - ;; - *) - break - ;; - esac - done - - local plugins=($(__docker_q info | sed -n "/^Plugins/,/^[^ ]/s/ $type: //p")) - for del in "${remove[@]}" ; do - plugins=(${plugins[@]/$del/}) - done - echo "${plugins[@]} ${add[@]}" -} - -# __docker_complete_plugins_bundled applies completion of plugins based on the current -# value of `$cur` or the value of the optional first option `--cur`, if given. -# The plugin type has to be specified with the next option `--type`. -# This function only deals with plugins that come bundled with Docker. -# For completion of plugins managed by `docker plugin`, see -# `__docker_complete_plugins_installed`. -__docker_complete_plugins_bundled() { - local current="$cur" - if [ "$1" = "--cur" ] ; then - current="$2" - shift 2 - fi - COMPREPLY=( $(compgen -W "$(__docker_plugins_bundled "$@")" -- "$current") ) -} - -# __docker_plugins_installed returns a list of all plugins that were installed with -# the Docker plugin API. -# By default, only names are returned. -# Set DOCKER_COMPLETION_SHOW_PLUGIN_IDS=yes to also complete IDs. -# For built-in pugins, see `__docker_plugins_bundled`. -__docker_plugins_installed() { - local fields - if [ "$DOCKER_COMPLETION_SHOW_PLUGIN_IDS" = yes ] ; then - fields='$1,$2' - else - fields='$2' - fi - __docker_q plugin ls | awk "NR>1 {print $fields}" -} - -# __docker_complete_plugins_installed applies completion of plugins that were installed -# with the Docker plugin API, based on the current value of `$cur` or the value of -# the optional first option `--cur`, if given. -# For completion of built-in pugins, see `__docker_complete_plugins_bundled`. -__docker_complete_plugins_installed() { - local current="$cur" - if [ "$1" = "--cur" ] ; then - current="$2" - shift 2 - fi - COMPREPLY=( $(compgen -W "$(__docker_plugins_installed "$@")" -- "$current") ) -} - -__docker_runtimes() { - __docker_q info | sed -n 's/^Runtimes: \(.*\)/\1/p' -} - -__docker_complete_runtimes() { - COMPREPLY=( $(compgen -W "$(__docker_runtimes)" -- "$cur") ) -} - -# __docker_secrets returns a list of all secrets. -# By default, only names of secrets are returned. -# Set DOCKER_COMPLETION_SHOW_SECRET_IDS=yes to also complete IDs of secrets. -__docker_secrets() { - local fields='$2' # default: name only - [ "${DOCKER_COMPLETION_SHOW_SECRET_IDS}" = yes ] && fields='$1,$2' # ID and name - - __docker_q secret ls | awk "NR>1 {print $fields}" -} - -# __docker_complete_secrets applies completion of secrets based on the current value -# of `$cur`. -__docker_complete_secrets() { - COMPREPLY=( $(compgen -W "$(__docker_secrets)" -- "$cur") ) -} - -# __docker_stacks returns a list of all stacks. -__docker_stacks() { - __docker_q stack ls | awk 'NR>1 {print $1}' -} - -# __docker_complete_stacks applies completion of stacks based on the current value -# of `$cur` or the value of the optional first option `--cur`, if given. -__docker_complete_stacks() { - local current="$cur" - if [ "$1" = "--cur" ] ; then - current="$2" - shift 2 - fi - COMPREPLY=( $(compgen -W "$(__docker_stacks "$@")" -- "$current") ) -} - -# __docker_nodes returns a list of all nodes. Additional options to -# `docker node ls` may be specified in order to filter the list, e.g. -# `__docker_nodes --filter role=manager` -# By default, only node names are returned. -# Set DOCKER_COMPLETION_SHOW_NODE_IDS=yes to also complete node IDs. -# An optional first option `--id|--name` may be used to limit the -# output to the IDs or names of matching items. This setting takes -# precedence over the environment setting. -# Completions may be added with `--add`, e.g. `--add self`. -__docker_nodes() { - local add=() - local fields='$2' # default: node name only - [ "${DOCKER_COMPLETION_SHOW_NODE_IDS}" = yes ] && fields='$1,$2' # ID and name - - while true ; do - case "$1" in - --id) - fields='$1' # IDs only - shift - ;; - --name) - fields='$2' # names only - shift - ;; - --add) - add+=("$2") - shift 2 - ;; - *) - break - ;; - esac - done - - echo $(__docker_q node ls "$@" | tr -d '*' | awk "NR>1 {print $fields}") "${add[@]}" -} - -# __docker_complete_nodes applies completion of nodes based on the current -# value of `$cur` or the value of the optional first option `--cur`, if given. -# Additional filters may be appended, see `__docker_nodes`. -__docker_complete_nodes() { - local current="$cur" - if [ "$1" = "--cur" ] ; then - current="$2" - shift 2 - fi - COMPREPLY=( $(compgen -W "$(__docker_nodes "$@")" -- "$current") ) -} - -__docker_complete_nodes_plus_self() { - __docker_complete_nodes --add self "$@" -} - -# __docker_services returns a list of all services. Additional options to -# `docker service ls` may be specified in order to filter the list, e.g. -# `__docker_services --filter name=xxx` -# By default, only node names are returned. -# Set DOCKER_COMPLETION_SHOW_SERVICE_IDS=yes to also complete IDs. -# An optional first option `--id|--name` may be used to limit the -# output to the IDs or names of matching items. This setting takes -# precedence over the environment setting. -__docker_services() { - local fields='$2' # default: service name only - [ "${DOCKER_COMPLETION_SHOW_SERVICE_IDS}" = yes ] && fields='$1,$2' # ID & name - - if [ "$1" = "--id" ] ; then - fields='$1' # IDs only - shift - elif [ "$1" = "--name" ] ; then - fields='$2' # names only - shift - fi - __docker_q service ls "$@" | awk "NR>1 {print $fields}" -} - -# __docker_complete_services applies completion of services based on the current -# value of `$cur` or the value of the optional first option `--cur`, if given. -# Additional filters may be appended, see `__docker_services`. -__docker_complete_services() { - local current="$cur" - if [ "$1" = "--cur" ] ; then - current="$2" - shift 2 - fi - COMPREPLY=( $(compgen -W "$(__docker_services "$@")" -- "$current") ) -} - -# __docker_append_to_completions appends the word passed as an argument to every -# word in `$COMPREPLY`. -# Normally you do this with `compgen -S` while generating the completions. -# This function allows you to append a suffix later. It allows you to use -# the __docker_complete_XXX functions in cases where you need a suffix. -__docker_append_to_completions() { - COMPREPLY=( ${COMPREPLY[@]/%/"$1"} ) -} - -# __docker_is_experimental tests whether the currently configured Docker daemon -# runs in experimental mode. If so, the function exits with 0 (true). -# Otherwise, or if the result cannot be determined, the exit value is 1 (false). -__docker_is_experimental() { - [ "$(__docker_q version -f '{{.Server.Experimental}}')" = "true" ] -} - -# __docker_pos_first_nonflag finds the position of the first word that is neither -# option nor an option's argument. If there are options that require arguments, -# you should pass a glob describing those options, e.g. "--option1|-o|--option2" -# Use this function to restrict completions to exact positions after the argument list. -__docker_pos_first_nonflag() { - local argument_flags=$1 - - local counter=$((${subcommand_pos:-${command_pos}} + 1)) - while [ $counter -le $cword ]; do - if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then - (( counter++ )) - # eat "=" in case of --option=arg syntax - [ "${words[$counter]}" = "=" ] && (( counter++ )) - else - case "${words[$counter]}" in - -*) - ;; - *) - break - ;; - esac - fi - - # Bash splits words at "=", retaining "=" as a word, examples: - # "--debug=false" => 3 words, "--log-opt syslog-facility=daemon" => 4 words - while [ "${words[$counter + 1]}" = "=" ] ; do - counter=$(( counter + 2)) - done - - (( counter++ )) - done - - echo $counter -} - -# __docker_map_key_of_current_option returns `key` if we are currently completing the -# value of a map option (`key=value`) which matches the extglob given as an argument. -# This function is needed for key-specific completions. -__docker_map_key_of_current_option() { - local glob="$1" - - local key glob_pos - if [ "$cur" = "=" ] ; then # key= case - key="$prev" - glob_pos=$((cword - 2)) - elif [[ $cur == *=* ]] ; then # key=value case (OSX) - key=${cur%=*} - glob_pos=$((cword - 1)) - elif [ "$prev" = "=" ] ; then - key=${words[$cword - 2]} # key=value case - glob_pos=$((cword - 3)) - else - return - fi - - [ "${words[$glob_pos]}" = "=" ] && ((glob_pos--)) # --option=key=value syntax - - [[ ${words[$glob_pos]} == @($glob) ]] && echo "$key" -} - -# __docker_value_of_option returns the value of the first option matching `option_glob`. -# Valid values for `option_glob` are option names like `--log-level` and globs like -# `--log-level|-l` -# Only positions between the command and the current word are considered. -__docker_value_of_option() { - local option_extglob=$(__docker_to_extglob "$1") - - local counter=$((command_pos + 1)) - while [ $counter -lt $cword ]; do - case ${words[$counter]} in - $option_extglob ) - echo ${words[$counter + 1]} - break - ;; - esac - (( counter++ )) - done -} - -# __docker_to_alternatives transforms a multiline list of strings into a single line -# string with the words separated by `|`. -# This is used to prepare arguments to __docker_pos_first_nonflag(). -__docker_to_alternatives() { - local parts=( $1 ) - local IFS='|' - echo "${parts[*]}" -} - -# __docker_to_extglob transforms a multiline list of options into an extglob pattern -# suitable for use in case statements. -__docker_to_extglob() { - local extglob=$( __docker_to_alternatives "$1" ) - echo "@($extglob)" -} - -# __docker_subcommands processes subcommands -# Locates the first occurrence of any of the subcommands contained in the -# first argument. In case of a match, calls the corresponding completion -# function and returns 0. -# If no match is found, 1 is returned. The calling function can then -# continue processing its completion. -# -# TODO if the preceding command has options that accept arguments and an -# argument is equal ot one of the subcommands, this is falsely detected as -# a match. -__docker_subcommands() { - local subcommands="$1" - - local counter=$(($command_pos + 1)) - while [ $counter -lt $cword ]; do - case "${words[$counter]}" in - $(__docker_to_extglob "$subcommands") ) - subcommand_pos=$counter - local subcommand=${words[$counter]} - local completions_func=_docker_${command}_${subcommand} - declare -F $completions_func >/dev/null && $completions_func - return 0 - ;; - esac - (( counter++ )) - done - return 1 -} - -# __docker_nospace suppresses trailing whitespace -__docker_nospace() { - # compopt is not available in ancient bash versions - type compopt &>/dev/null && compopt -o nospace -} - -__docker_complete_resolved_hostname() { - command -v host >/dev/null 2>&1 || return - COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') ) -} - -__docker_local_interfaces() { - command -v ip >/dev/null 2>&1 || return - ip addr show scope global 2>/dev/null | sed -n 's| \+inet \([0-9.]\+\).* \([^ ]\+\)|\1 \2|p' -} - -__docker_complete_local_interfaces() { - local additional_interface - if [ "$1" = "--add" ] ; then - additional_interface="$2" - fi - - COMPREPLY=( $( compgen -W "$(__docker_local_interfaces) $additional_interface" -- "$cur" ) ) -} - -__docker_complete_capabilities() { - # The list of capabilities is defined in types.go, ALL was added manually. - COMPREPLY=( $( compgen -W " - ALL - AUDIT_CONTROL - AUDIT_WRITE - AUDIT_READ - BLOCK_SUSPEND - CHOWN - DAC_OVERRIDE - DAC_READ_SEARCH - FOWNER - FSETID - IPC_LOCK - IPC_OWNER - KILL - LEASE - LINUX_IMMUTABLE - MAC_ADMIN - MAC_OVERRIDE - MKNOD - NET_ADMIN - NET_BIND_SERVICE - NET_BROADCAST - NET_RAW - SETFCAP - SETGID - SETPCAP - SETUID - SYS_ADMIN - SYS_BOOT - SYS_CHROOT - SYSLOG - SYS_MODULE - SYS_NICE - SYS_PACCT - SYS_PTRACE - SYS_RAWIO - SYS_RESOURCE - SYS_TIME - SYS_TTY_CONFIG - WAKE_ALARM - " -- "$cur" ) ) -} - -__docker_complete_detach-keys() { - case "$prev" in - --detach-keys) - case "$cur" in - *,) - COMPREPLY=( $( compgen -W "${cur}ctrl-" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "ctrl-" -- "$cur" ) ) - ;; - esac - - __docker_nospace - return - ;; - esac - return 1 -} - -__docker_complete_isolation() { - COMPREPLY=( $( compgen -W "default hyperv process" -- "$cur" ) ) -} - -__docker_complete_log_drivers() { - COMPREPLY=( $( compgen -W " - awslogs - etwlogs - fluentd - gcplogs - gelf - journald - json-file - logentries - none - splunk - syslog - " -- "$cur" ) ) -} - -__docker_complete_log_options() { - # see docs/reference/logging/index.md - local awslogs_options="awslogs-region awslogs-group awslogs-stream" - local fluentd_options="env fluentd-address fluentd-async-connect fluentd-buffer-limit fluentd-retry-wait fluentd-max-retries labels tag" - local gcplogs_options="env gcp-log-cmd gcp-project labels" - local gelf_options="env gelf-address gelf-compression-level gelf-compression-type labels tag" - local journald_options="env labels tag" - local json_file_options="env labels max-file max-size" - local logentries_options="logentries-token" - local syslog_options="env labels syslog-address syslog-facility syslog-format syslog-tls-ca-cert syslog-tls-cert syslog-tls-key syslog-tls-skip-verify tag" - local splunk_options="env labels splunk-caname splunk-capath splunk-format splunk-gzip splunk-gzip-level splunk-index splunk-insecureskipverify splunk-source splunk-sourcetype splunk-token splunk-url splunk-verify-connection tag" - - local all_options="$fluentd_options $gcplogs_options $gelf_options $journald_options $logentries_options $json_file_options $syslog_options $splunk_options" - - case $(__docker_value_of_option --log-driver) in - '') - COMPREPLY=( $( compgen -W "$all_options" -S = -- "$cur" ) ) - ;; - awslogs) - COMPREPLY=( $( compgen -W "$awslogs_options" -S = -- "$cur" ) ) - ;; - fluentd) - COMPREPLY=( $( compgen -W "$fluentd_options" -S = -- "$cur" ) ) - ;; - gcplogs) - COMPREPLY=( $( compgen -W "$gcplogs_options" -S = -- "$cur" ) ) - ;; - gelf) - COMPREPLY=( $( compgen -W "$gelf_options" -S = -- "$cur" ) ) - ;; - journald) - COMPREPLY=( $( compgen -W "$journald_options" -S = -- "$cur" ) ) - ;; - json-file) - COMPREPLY=( $( compgen -W "$json_file_options" -S = -- "$cur" ) ) - ;; - logentries) - COMPREPLY=( $( compgen -W "$logentries_options" -S = -- "$cur" ) ) - ;; - syslog) - COMPREPLY=( $( compgen -W "$syslog_options" -S = -- "$cur" ) ) - ;; - splunk) - COMPREPLY=( $( compgen -W "$splunk_options" -S = -- "$cur" ) ) - ;; - *) - return - ;; - esac - - __docker_nospace -} - -__docker_complete_log_driver_options() { - local key=$(__docker_map_key_of_current_option '--log-opt') - case "$key" in - fluentd-async-connect) - COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) ) - return - ;; - gelf-address) - COMPREPLY=( $( compgen -W "udp" -S "://" -- "${cur##*=}" ) ) - __docker_nospace - return - ;; - gelf-compression-level) - COMPREPLY=( $( compgen -W "1 2 3 4 5 6 7 8 9" -- "${cur##*=}" ) ) - return - ;; - gelf-compression-type) - COMPREPLY=( $( compgen -W "gzip none zlib" -- "${cur##*=}" ) ) - return - ;; - syslog-address) - COMPREPLY=( $( compgen -W "tcp:// tcp+tls:// udp:// unix://" -- "${cur##*=}" ) ) - __docker_nospace - __ltrim_colon_completions "${cur}" - return - ;; - syslog-facility) - COMPREPLY=( $( compgen -W " - auth - authpriv - cron - daemon - ftp - kern - local0 - local1 - local2 - local3 - local4 - local5 - local6 - local7 - lpr - mail - news - syslog - user - uucp - " -- "${cur##*=}" ) ) - return - ;; - syslog-format) - COMPREPLY=( $( compgen -W "rfc3164 rfc5424 rfc5424micro" -- "${cur##*=}" ) ) - return - ;; - syslog-tls-ca-cert|syslog-tls-cert|syslog-tls-key) - _filedir - return - ;; - syslog-tls-skip-verify) - COMPREPLY=( $( compgen -W "true" -- "${cur##*=}" ) ) - return - ;; - splunk-url) - COMPREPLY=( $( compgen -W "http:// https://" -- "${cur##*=}" ) ) - __docker_nospace - __ltrim_colon_completions "${cur}" - return - ;; - splunk-gzip|splunk-insecureskipverify|splunk-verify-connection) - COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) ) - return - ;; - splunk-format) - COMPREPLY=( $( compgen -W "inline json raw" -- "${cur##*=}" ) ) - return - ;; - esac - return 1 -} - -__docker_complete_log_levels() { - COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) ) -} - -__docker_complete_restart() { - case "$prev" in - --restart) - case "$cur" in - on-failure:*) - ;; - *) - COMPREPLY=( $( compgen -W "always no on-failure on-failure: unless-stopped" -- "$cur") ) - ;; - esac - return - ;; - esac - return 1 -} - -# __docker_complete_signals returns a subset of the available signals that is most likely -# relevant in the context of docker containers -__docker_complete_signals() { - local signals=( - SIGCONT - SIGHUP - SIGINT - SIGKILL - SIGQUIT - SIGSTOP - SIGTERM - SIGUSR1 - SIGUSR2 - ) - COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo $cur | tr '[:lower:]' '[:upper:]')" ) ) -} - -__docker_complete_user_group() { - if [[ $cur == *:* ]] ; then - COMPREPLY=( $(compgen -g -- "${cur#*:}") ) - else - COMPREPLY=( $(compgen -u -S : -- "$cur") ) - __docker_nospace - fi -} - -_docker_docker() { - # global options that may appear after the docker command - local boolean_options=" - $global_boolean_options - --help - --version -v - " - - case "$prev" in - --config) - _filedir -d - return - ;; - --log-level|-l) - __docker_complete_log_levels - return - ;; - $(__docker_to_extglob "$global_options_with_args") ) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "$boolean_options $global_options_with_args" -- "$cur" ) ) - ;; - *) - local counter=$( __docker_pos_first_nonflag "$(__docker_to_extglob "$global_options_with_args")" ) - if [ $cword -eq $counter ]; then - __docker_is_experimental && commands+=(${experimental_commands[*]}) - COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) ) - fi - ;; - esac -} - -_docker_attach() { - _docker_container_attach -} - -_docker_build() { - _docker_image_build -} - - -_docker_checkpoint() { - local subcommands=" - create - ls - rm - " - local aliases=" - list - remove - " - __docker_subcommands "$subcommands $aliases" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_checkpoint_create() { - case "$prev" in - --checkpoint-dir) - _filedir -d - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--checkpoint-dir --help --leave-running" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--checkpoint-dir') - if [ $cword -eq $counter ]; then - __docker_complete_containers_running - fi - ;; - esac -} - -_docker_checkpoint_ls() { - case "$prev" in - --checkpoint-dir) - _filedir -d - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--checkpoint-dir --help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--checkpoint-dir') - if [ $cword -eq $counter ]; then - __docker_complete_containers_all - fi - ;; - esac -} - -_docker_checkpoint_rm() { - case "$prev" in - --checkpoint-dir) - _filedir -d - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--checkpoint-dir --help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--checkpoint-dir') - if [ $cword -eq $counter ]; then - __docker_complete_containers_all - elif [ $cword -eq $(($counter + 1)) ]; then - COMPREPLY=( $( compgen -W "$(__docker_q checkpoint ls "$prev" | sed 1d)" -- "$cur" ) ) - fi - ;; - esac -} - - -_docker_container() { - local subcommands=" - attach - commit - cp - create - diff - exec - export - inspect - kill - logs - ls - pause - port - prune - rename - restart - rm - run - start - stats - stop - top - unpause - update - wait - " - local aliases=" - list - ps - " - __docker_subcommands "$subcommands $aliases" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_container_attach() { - __docker_complete_detach-keys && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--detach-keys --help --no-stdin --sig-proxy=false" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--detach-keys') - if [ $cword -eq $counter ]; then - __docker_complete_containers_running - fi - ;; - esac -} - -_docker_container_commit() { - case "$prev" in - --author|-a|--change|-c|--message|-m) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause=false -p=false" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m') - - if [ $cword -eq $counter ]; then - __docker_complete_containers_all - return - fi - (( counter++ )) - - if [ $cword -eq $counter ]; then - __docker_complete_image_repos_and_tags - return - fi - ;; - esac -} - -_docker_container_cp() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--follow-link -L --help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - case "$cur" in - *:) - return - ;; - *) - # combined container and filename completion - _filedir - local files=( ${COMPREPLY[@]} ) - - __docker_complete_containers_all - COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) ) - local containers=( ${COMPREPLY[@]} ) - - COMPREPLY=( $( compgen -W "${files[*]} ${containers[*]}" -- "$cur" ) ) - if [[ "$COMPREPLY" == *: ]]; then - __docker_nospace - fi - return - ;; - esac - fi - (( counter++ )) - - if [ $cword -eq $counter ]; then - if [ -e "$prev" ]; then - __docker_complete_containers_all - COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) ) - __docker_nospace - else - _filedir - fi - return - fi - ;; - esac -} - -_docker_container_create() { - _docker_container_run -} - -_docker_container_diff() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_containers_all - fi - ;; - esac -} - -_docker_container_exec() { - __docker_complete_detach-keys && return - - case "$prev" in - --env|-e) - # we do not append a "=" here because "-e VARNAME" is legal systax, too - COMPREPLY=( $( compgen -e -- "$cur" ) ) - __docker_nospace - return - ;; - --user|-u) - __docker_complete_user_group - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--detach -d --detach-keys --env -e --help --interactive -i --privileged -t --tty -u --user" -- "$cur" ) ) - ;; - *) - __docker_complete_containers_running - ;; - esac -} - -_docker_container_export() { - case "$prev" in - --output|-o) - _filedir - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_containers_all - fi - ;; - esac -} - -_docker_container_inspect() { - _docker_inspect --type container -} - -_docker_container_kill() { - case "$prev" in - --signal|-s) - __docker_complete_signals - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) ) - ;; - *) - __docker_complete_containers_running - ;; - esac -} - -_docker_container_logs() { - case "$prev" in - --since|--tail) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--details --follow -f --help --since --tail --timestamps -t" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--since|--tail') - if [ $cword -eq $counter ]; then - __docker_complete_containers_all - fi - ;; - esac -} - -_docker_container_list() { - _docker_container_ls -} - -_docker_container_ls() { - local key=$(__docker_map_key_of_current_option '--filter|-f') - case "$key" in - ancestor) - cur="${cur##*=}" - __docker_complete_images - return - ;; - before) - __docker_complete_containers_all --cur "${cur##*=}" - return - ;; - id) - __docker_complete_containers_all --cur "${cur##*=}" --id - return - ;; - health) - COMPREPLY=( $( compgen -W "healthy starting none unhealthy" -- "${cur##*=}" ) ) - return - ;; - is-task) - COMPREPLY=( $( compgen -W "true false" -- "${cur##*=}" ) ) - return - ;; - name) - __docker_complete_containers_all --cur "${cur##*=}" --name - return - ;; - network) - __docker_complete_networks --cur "${cur##*=}" - return - ;; - since) - __docker_complete_containers_all --cur "${cur##*=}" - return - ;; - status) - COMPREPLY=( $( compgen -W "created dead exited paused restarting running removing" -- "${cur##*=}" ) ) - return - ;; - volume) - __docker_complete_volumes --cur "${cur##*=}" - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -S = -W "ancestor before exited health id is-task label name network since status volume" -- "$cur" ) ) - __docker_nospace - return - ;; - --format|--last|-n) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--all -a --filter -f --format --help --last -n --latest -l --no-trunc --quiet -q --size -s" -- "$cur" ) ) - ;; - esac -} - -_docker_container_pause() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_complete_containers_running - ;; - esac -} - -_docker_container_port() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_containers_all - fi - ;; - esac -} - -_docker_container_prune() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) ) - ;; - esac -} - -_docker_container_ps() { - _docker_container_ls -} - -_docker_container_rename() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_containers_all - fi - ;; - esac -} - -_docker_container_restart() { - case "$prev" in - --time|-t) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) ) - ;; - *) - __docker_complete_containers_all - ;; - esac -} - -_docker_container_rm() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) ) - ;; - *) - for arg in "${COMP_WORDS[@]}"; do - case "$arg" in - --force|-f) - __docker_complete_containers_all - return - ;; - esac - done - __docker_complete_containers_stopped - ;; - esac -} - -_docker_container_run() { - local options_with_args=" - --add-host - --attach -a - --blkio-weight - --blkio-weight-device - --cap-add - --cap-drop - --cgroup-parent - --cidfile - --cpu-period - --cpu-quota - --cpu-rt-period - --cpu-rt-runtime - --cpuset-cpus - --cpus - --cpuset-mems - --cpu-shares -c - --device - --device-read-bps - --device-read-iops - --device-write-bps - --device-write-iops - --dns - --dns-option - --dns-search - --entrypoint - --env -e - --env-file - --expose - --group-add - --hostname -h - --init-path - --ip - --ip6 - --ipc - --isolation - --kernel-memory - --label-file - --label -l - --link - --link-local-ip - --log-driver - --log-opt - --mac-address - --memory -m - --memory-swap - --memory-swappiness - --memory-reservation - --name - --network - --network-alias - --oom-score-adj - --pid - --pids-limit - --publish -p - --restart - --runtime - --security-opt - --shm-size - --stop-signal - --stop-timeout - --storage-opt - --tmpfs - --sysctl - --ulimit - --user -u - --userns - --uts - --volume-driver - --volumes-from - --volume -v - --workdir -w - " - - local boolean_options=" - --disable-content-trust=false - --help - --init - --interactive -i - --oom-kill-disable - --privileged - --publish-all -P - --read-only - --tty -t - " - - if [ "$command" = "run" -o "$subcommand" = "run" ] ; then - options_with_args="$options_with_args - --detach-keys - --health-cmd - --health-interval - --health-retries - --health-timeout - " - boolean_options="$boolean_options - --detach -d - --no-healthcheck - --rm - --sig-proxy=false - " - __docker_complete_detach-keys && return - fi - - local all_options="$options_with_args $boolean_options" - - - __docker_complete_log_driver_options && return - __docker_complete_restart && return - - local key=$(__docker_map_key_of_current_option '--security-opt') - case "$key" in - label) - [[ $cur == *: ]] && return - COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "${cur##*=}") ) - if [ "${COMPREPLY[*]}" != "disable" ] ; then - __docker_nospace - fi - return - ;; - seccomp) - local cur=${cur##*=} - _filedir - COMPREPLY+=( $( compgen -W "unconfined" -- "$cur" ) ) - return - ;; - esac - - case "$prev" in - --add-host) - case "$cur" in - *:) - __docker_complete_resolved_hostname - return - ;; - esac - ;; - --attach|-a) - COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) ) - return - ;; - --cap-add|--cap-drop) - __docker_complete_capabilities - return - ;; - --cidfile|--env-file|--init-path|--label-file) - _filedir - return - ;; - --device|--tmpfs|--volume|-v) - case "$cur" in - *:*) - # TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine) - ;; - '') - COMPREPLY=( $( compgen -W '/' -- "$cur" ) ) - __docker_nospace - ;; - /*) - _filedir - __docker_nospace - ;; - esac - return - ;; - --env|-e) - # we do not append a "=" here because "-e VARNAME" is legal systax, too - COMPREPLY=( $( compgen -e -- "$cur" ) ) - __docker_nospace - return - ;; - --ipc) - case "$cur" in - *:*) - cur="${cur#*:}" - __docker_complete_containers_running - ;; - *) - COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) ) - if [ "$COMPREPLY" = "container:" ]; then - __docker_nospace - fi - ;; - esac - return - ;; - --isolation) - __docker_complete_isolation - return - ;; - --link) - case "$cur" in - *:*) - ;; - *) - __docker_complete_containers_running - COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) ) - __docker_nospace - ;; - esac - return - ;; - --log-driver) - __docker_complete_log_drivers - return - ;; - --log-opt) - __docker_complete_log_options - return - ;; - --network) - case "$cur" in - container:*) - __docker_complete_containers_all --cur "${cur#*:}" - ;; - *) - COMPREPLY=( $( compgen -W "$(__docker_plugins_bundled --type Network) $(__docker_networks) container:" -- "$cur") ) - if [ "${COMPREPLY[*]}" = "container:" ] ; then - __docker_nospace - fi - ;; - esac - return - ;; - --pid) - case "$cur" in - *:*) - __docker_complete_containers_running --cur "${cur#*:}" - ;; - *) - COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) ) - if [ "$COMPREPLY" = "container:" ]; then - __docker_nospace - fi - ;; - esac - return - ;; - --runtime) - __docker_complete_runtimes - return - ;; - --security-opt) - COMPREPLY=( $( compgen -W "apparmor= label= no-new-privileges seccomp=" -- "$cur") ) - if [ "${COMPREPLY[*]}" != "no-new-privileges" ] ; then - __docker_nospace - fi - return - ;; - --storage-opt) - COMPREPLY=( $( compgen -W "size" -S = -- "$cur") ) - __docker_nospace - return - ;; - --user|-u) - __docker_complete_user_group - return - ;; - --userns) - COMPREPLY=( $( compgen -W "host" -- "$cur" ) ) - return - ;; - --volume-driver) - __docker_complete_plugins_bundled --type Volume - return - ;; - --volumes-from) - __docker_complete_containers_all - return - ;; - $(__docker_to_extglob "$options_with_args") ) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) ) - ;; - *) - local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) ) - if [ $cword -eq $counter ]; then - __docker_complete_images - fi - ;; - esac -} - -_docker_container_start() { - __docker_complete_detach-keys && return - - case "$prev" in - --checkpoint) - if [ __docker_is_experimental ] ; then - return - fi - ;; - --checkpoint-dir) - if [ __docker_is_experimental ] ; then - _filedir -d - return - fi - ;; - esac - - case "$cur" in - -*) - local options="--attach -a --detach-keys --help --interactive -i" - __docker_is_experimental && options+=" --checkpoint --checkpoint-dir" - COMPREPLY=( $( compgen -W "$options" -- "$cur" ) ) - ;; - *) - __docker_complete_containers_stopped - ;; - esac -} - -_docker_container_stats() { - case "$prev" in - --format) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--all -a --format --help --no-stream" -- "$cur" ) ) - ;; - *) - __docker_complete_containers_running - ;; - esac -} - -_docker_container_stop() { - case "$prev" in - --time|-t) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) ) - ;; - *) - __docker_complete_containers_running - ;; - esac -} - -_docker_container_top() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_containers_running - fi - ;; - esac -} - -_docker_container_unpause() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_containers_unpauseable - fi - ;; - esac -} - -_docker_container_update() { - local options_with_args=" - --blkio-weight - --cpu-period - --cpu-quota - --cpu-rt-period - --cpu-rt-runtime - --cpuset-cpus - --cpuset-mems - --cpu-shares -c - --kernel-memory - --memory -m - --memory-reservation - --memory-swap - --restart - " - - local boolean_options=" - --help - " - - local all_options="$options_with_args $boolean_options" - - __docker_complete_restart && return - - case "$prev" in - $(__docker_to_extglob "$options_with_args") ) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) ) - ;; - *) - __docker_complete_containers_all - ;; - esac -} - -_docker_container_wait() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_complete_containers_all - ;; - esac -} - - -_docker_commit() { - _docker_container_commit -} - -_docker_cp() { - _docker_container_cp -} - -_docker_create() { - _docker_container_run -} - -_docker_daemon() { - local boolean_options=" - $global_boolean_options - --disable-legacy-registry - --experimental - --help - --icc=false - --init - --ip-forward=false - --ip-masq=false - --iptables=false - --ipv6 - --live-restore - --raw-logs - --selinux-enabled - --userland-proxy=false - " - local options_with_args=" - $global_options_with_args - --add-runtime - --api-cors-header - --authorization-plugin - --bip - --bridge -b - --cgroup-parent - --cluster-advertise - --cluster-store - --cluster-store-opt - --config-file - --containerd - --default-gateway - --default-gateway-v6 - --default-ulimit - --dns - --dns-search - --dns-opt - --exec-opt - --exec-root - --fixed-cidr - --fixed-cidr-v6 - --graph -g - --group -G - --init-path - --insecure-registry - --ip - --label - --log-driver - --log-opt - --max-concurrent-downloads - --max-concurrent-uploads - --mtu - --oom-score-adjust - --pidfile -p - --registry-mirror - --seccomp-profile - --shutdown-timeout - --storage-driver -s - --storage-opt - --userland-proxy-path - --userns-remap - " - - __docker_complete_log_driver_options && return - - key=$(__docker_map_key_of_current_option '--cluster-store-opt') - case "$key" in - kv.*file) - cur=${cur##*=} - _filedir - return - ;; - esac - - local key=$(__docker_map_key_of_current_option '--storage-opt') - case "$key" in - dm.blkdiscard|dm.override_udev_sync_check|dm.use_deferred_removal|dm.use_deferred_deletion) - COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) ) - return - ;; - dm.fs) - COMPREPLY=( $( compgen -W "ext4 xfs" -- "${cur##*=}" ) ) - return - ;; - dm.thinpooldev) - cur=${cur##*=} - _filedir - return - ;; - esac - - case "$prev" in - --authorization-plugin) - __docker_complete_plugins_bundled --type Authorization - return - ;; - --cluster-store) - COMPREPLY=( $( compgen -W "consul etcd zk" -S "://" -- "$cur" ) ) - __docker_nospace - return - ;; - --cluster-store-opt) - COMPREPLY=( $( compgen -W "discovery.heartbeat discovery.ttl kv.cacertfile kv.certfile kv.keyfile kv.path" -S = -- "$cur" ) ) - __docker_nospace - return - ;; - --config-file|--containerd|--init-path|--pidfile|-p|--tlscacert|--tlscert|--tlskey|--userland-proxy-path) - _filedir - return - ;; - --exec-root|--graph|-g) - _filedir -d - return - ;; - --log-driver) - __docker_complete_log_drivers - return - ;; - --storage-driver|-s) - COMPREPLY=( $( compgen -W "aufs btrfs devicemapper overlay overlay2 vfs zfs" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) ) - return - ;; - --storage-opt) - local btrfs_options="btrfs.min_space" - local devicemapper_options=" - dm.basesize - dm.blkdiscard - dm.blocksize - dm.fs - dm.loopdatasize - dm.loopmetadatasize - dm.min_free_space - dm.mkfsarg - dm.mountopt - dm.override_udev_sync_check - dm.thinpooldev - dm.use_deferred_deletion - dm.use_deferred_removal - " - local zfs_options="zfs.fsname" - - case $(__docker_value_of_option '--storage-driver|-s') in - '') - COMPREPLY=( $( compgen -W "$btrfs_options $devicemapper_options $zfs_options" -S = -- "$cur" ) ) - ;; - btrfs) - COMPREPLY=( $( compgen -W "$btrfs_options" -S = -- "$cur" ) ) - ;; - devicemapper) - COMPREPLY=( $( compgen -W "$devicemapper_options" -S = -- "$cur" ) ) - ;; - zfs) - COMPREPLY=( $( compgen -W "$zfs_options" -S = -- "$cur" ) ) - ;; - *) - return - ;; - esac - __docker_nospace - return - ;; - --log-level|-l) - __docker_complete_log_levels - return - ;; - --log-opt) - __docker_complete_log_options - return - ;; - --seccomp-profile) - _filedir json - return - ;; - --userns-remap) - __docker_complete_user_group - return - ;; - $(__docker_to_extglob "$options_with_args") ) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) ) - ;; - esac -} - -_docker_deploy() { - __docker_is_experimental && _docker_stack_deploy -} - -_docker_diff() { - _docker_container_diff -} - -_docker_events() { - _docker_system_events -} - -_docker_exec() { - _docker_container_exec -} - -_docker_export() { - _docker_container_export -} - -_docker_help() { - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) ) - fi -} - -_docker_history() { - _docker_image_history -} - - -_docker_image() { - local subcommands=" - build - history - import - inspect - load - ls - prune - pull - push - rm - save - tag - " - local aliases=" - images - list - remove - rmi - " - __docker_subcommands "$subcommands $aliases" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_image_build() { - local options_with_args=" - --build-arg - --cache-from - --cgroup-parent - --cpuset-cpus - --cpuset-mems - --cpu-shares -c - --cpu-period - --cpu-quota - --file -f - --isolation - --label - --memory -m - --memory-swap - --network - --shm-size - --tag -t - --ulimit - " - - local boolean_options=" - --compress - --disable-content-trust=false - --force-rm - --help - --no-cache - --pull - --quiet -q - --rm - " - __docker_is_experimental && boolean_options+="--squash" - - local all_options="$options_with_args $boolean_options" - - case "$prev" in - --build-arg) - COMPREPLY=( $( compgen -e -- "$cur" ) ) - __docker_nospace - return - ;; - --cache-from) - __docker_complete_image_repos_and_tags - return - ;; - --file|-f) - _filedir - return - ;; - --isolation) - __docker_complete_isolation - return - ;; - --network) - case "$cur" in - container:*) - __docker_complete_containers_all --cur "${cur#*:}" - ;; - *) - COMPREPLY=( $( compgen -W "$(__docker_plugins --type Network) $(__docker_networks) container:" -- "$cur") ) - if [ "${COMPREPLY[*]}" = "container:" ] ; then - __docker_nospace - fi - ;; - esac - return - ;; - --tag|-t) - __docker_complete_image_repos_and_tags - return - ;; - $(__docker_to_extglob "$options_with_args") ) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) ) - ;; - *) - local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) ) - if [ $cword -eq $counter ]; then - _filedir -d - fi - ;; - esac -} - -_docker_image_history() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --human=false -H=false --no-trunc --quiet -q" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_images - fi - ;; - esac -} - -_docker_image_images() { - _docker_image_ls -} - -_docker_image_import() { - case "$prev" in - --change|-c|--message|-m) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--change -c --help --message -m" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--change|-c|--message|-m') - if [ $cword -eq $counter ]; then - return - fi - (( counter++ )) - - if [ $cword -eq $counter ]; then - __docker_complete_image_repos_and_tags - return - fi - ;; - esac -} - -_docker_image_inspect() { - _docker_inspect --type image -} - -_docker_image_load() { - case "$prev" in - --input|-i) - _filedir - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --input -i --quiet -q" -- "$cur" ) ) - ;; - esac -} - -_docker_image_list() { - _docker_image_ls -} - -_docker_image_ls() { - local key=$(__docker_map_key_of_current_option '--filter|-f') - case "$key" in - before|since|reference) - cur="${cur##*=}" - __docker_complete_images - return - ;; - dangling) - COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) ) - return - ;; - label) - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -S = -W "before dangling label reference since" -- "$cur" ) ) - __docker_nospace - return - ;; - --format) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--all -a --digests --filter -f --format --help --no-trunc --quiet -q" -- "$cur" ) ) - ;; - =) - return - ;; - *) - __docker_complete_image_repos - ;; - esac -} - -_docker_image_prune() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--all -a --force -f --help" -- "$cur" ) ) - ;; - esac -} - -_docker_image_pull() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--all-tags -a --disable-content-trust=false --help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - for arg in "${COMP_WORDS[@]}"; do - case "$arg" in - --all-tags|-a) - __docker_complete_image_repos - return - ;; - esac - done - __docker_complete_image_repos_and_tags - fi - ;; - esac -} - -_docker_image_push() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--disable-content-trust=false --help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_image_repos_and_tags - fi - ;; - esac -} - -_docker_image_remove() { - _docker_image_rm -} - -_docker_image_rm() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) ) - ;; - *) - __docker_complete_images - ;; - esac -} - -_docker_image_rmi() { - _docker_image_rm -} - -_docker_image_save() { - case "$prev" in - --output|-o) - _filedir - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) ) - ;; - *) - __docker_complete_images - ;; - esac -} - -_docker_image_tag() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - - if [ $cword -eq $counter ]; then - __docker_complete_image_repos_and_tags - return - fi - (( counter++ )) - - if [ $cword -eq $counter ]; then - __docker_complete_image_repos_and_tags - return - fi - ;; - esac -} - - -_docker_images() { - _docker_image_ls -} - -_docker_import() { - _docker_image_import -} - -_docker_info() { - _docker_system_info -} - -_docker_inspect() { - local preselected_type - local type - - if [ "$1" = "--type" ] ; then - preselected_type=yes - type="$2" - else - type=$(__docker_value_of_option --type) - fi - - case "$prev" in - --format|-f) - return - ;; - --type) - if [ -z "$preselected_type" ] ; then - COMPREPLY=( $( compgen -W "container image network node plugin service volume" -- "$cur" ) ) - return - fi - ;; - esac - - case "$cur" in - -*) - local options="--format -f --help --size -s" - if [ -z "$preselected_type" ] ; then - options+=" --type" - fi - COMPREPLY=( $( compgen -W "$options" -- "$cur" ) ) - ;; - *) - case "$type" in - '') - COMPREPLY=( $( compgen -W " - $(__docker_containers --all) - $(__docker_images) - $(__docker_networks) - $(__docker_nodes) - $(__docker_plugins_installed) - $(__docker_services) - $(__docker_volumes) - " -- "$cur" ) ) - ;; - container) - __docker_complete_containers_all - ;; - image) - __docker_complete_images - ;; - network) - __docker_complete_networks - ;; - node) - __docker_complete_nodes - ;; - plugin) - __docker_complete_plugins_installed - ;; - service) - __docker_complete_services - ;; - volume) - __docker_complete_volumes - ;; - esac - esac -} - -_docker_kill() { - _docker_container_kill -} - -_docker_load() { - _docker_image_load -} - -_docker_login() { - case "$prev" in - --password|-p|--username|-u) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --password -p --username -u" -- "$cur" ) ) - ;; - esac -} - -_docker_logout() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - esac -} - -_docker_logs() { - _docker_container_logs -} - -_docker_network_connect() { - local options_with_args=" - --alias - --ip - --ip6 - --link - --link-local-ip - " - - local boolean_options=" - --help - " - - case "$prev" in - --link) - case "$cur" in - *:*) - ;; - *) - __docker_complete_containers_running - COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) ) - __docker_nospace - ;; - esac - return - ;; - $(__docker_to_extglob "$options_with_args") ) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) ) - ;; - *) - local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) ) - if [ $cword -eq $counter ]; then - __docker_complete_networks - elif [ $cword -eq $(($counter + 1)) ]; then - __docker_complete_containers_all - fi - ;; - esac -} - -_docker_network_create() { - case "$prev" in - --aux-address|--gateway|--internal|--ip-range|--ipam-opt|--ipv6|--opt|-o|--subnet) - return - ;; - --ipam-driver) - COMPREPLY=( $( compgen -W "default" -- "$cur" ) ) - return - ;; - --driver|-d) - # remove drivers that allow one instance only, add drivers missing in `docker info` - __docker_complete_plugins_bundled --type Network --remove host --remove null --add macvlan - return - ;; - --label) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--attachable --aux-address --driver -d --gateway --help --internal --ip-range --ipam-driver --ipam-opt --ipv6 --label --opt -o --subnet" -- "$cur" ) ) - ;; - esac -} - -_docker_network_disconnect() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_networks - elif [ $cword -eq $(($counter + 1)) ]; then - __docker_complete_containers_in_network "$prev" - fi - ;; - esac -} - -_docker_network_inspect() { - case "$prev" in - --format|-f) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) ) - ;; - *) - __docker_complete_networks - esac -} - -_docker_network_ls() { - local key=$(__docker_map_key_of_current_option '--filter|-f') - case "$key" in - driver) - __docker_complete_plugins_bundled --cur "${cur##*=}" --type Network --add macvlan - return - ;; - id) - __docker_complete_networks --cur "${cur##*=}" --id - return - ;; - name) - __docker_complete_networks --cur "${cur##*=}" --name - return - ;; - type) - COMPREPLY=( $( compgen -W "builtin custom" -- "${cur##*=}" ) ) - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -S = -W "driver id label name type" -- "$cur" ) ) - __docker_nospace - return - ;; - --format) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--filter -f --format --help --no-trunc --quiet -q" -- "$cur" ) ) - ;; - esac -} - -_docker_network_prune() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) ) - ;; - esac -} - -_docker_network_rm() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_complete_networks --filter type=custom - esac -} - -_docker_network() { - local subcommands=" - connect - create - disconnect - inspect - ls - prune - rm - " - __docker_subcommands "$subcommands" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_service() { - local subcommands=" - create - inspect - ls list - rm remove - scale - ps - update - " - __docker_daemon_is_experimental && subcommands+="logs" - - __docker_subcommands "$subcommands" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_service_create() { - _docker_service_update -} - -_docker_service_inspect() { - case "$prev" in - --format|-f) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) ) - ;; - *) - __docker_complete_services - esac -} - -_docker_service_logs() { - case "$prev" in - --since|--tail) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--details --follow -f --help --no-resolve --since --tail --timestamps -t" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--since|--tail') - if [ $cword -eq $counter ]; then - __docker_complete_services - fi - ;; - esac -} - -_docker_service_list() { - _docker_service_ls -} - -_docker_service_ls() { - local key=$(__docker_map_key_of_current_option '--filter|-f') - case "$key" in - id) - __docker_complete_services --cur "${cur##*=}" --id - return - ;; - name) - __docker_complete_services --cur "${cur##*=}" --name - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -W "id label name" -S = -- "$cur" ) ) - __docker_nospace - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--filter -f --help --quiet -q" -- "$cur" ) ) - ;; - esac -} - -_docker_service_remove() { - _docker_service_rm -} - -_docker_service_rm() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_complete_services - esac -} - -_docker_service_scale() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_complete_services - __docker_append_to_completions "=" - __docker_nospace - ;; - esac -} - -_docker_service_ps() { - local key=$(__docker_map_key_of_current_option '--filter|-f') - case "$key" in - desired-state) - COMPREPLY=( $( compgen -W "accepted running" -- "${cur##*=}" ) ) - return - ;; - name) - __docker_complete_services --cur "${cur##*=}" --name - return - ;; - node) - __docker_complete_nodes_plus_self --cur "${cur##*=}" - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -W "desired-state id name node" -S = -- "$cur" ) ) - __docker_nospace - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--filter -f --help --no-resolve --no-trunc --quiet -q" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--filter|-f') - if [ $cword -eq $counter ]; then - __docker_complete_services - fi - ;; - esac -} - -_docker_service_update() { - local $subcommand="${words[$subcommand_pos]}" - - local options_with_args=" - --constraint - --endpoint-mode - --env -e - --force - --health-cmd - --health-interval - --health-retries - --health-timeout - --hostname - --label -l - --limit-cpu - --limit-memory - --log-driver - --log-opt - --mount - --network - --no-healthcheck - --replicas - --reserve-cpu - --reserve-memory - --restart-condition - --restart-delay - --restart-max-attempts - --restart-window - --rollback - --stop-grace-period - --update-delay - --update-failure-action - --update-max-failure-ratio - --update-monitor - --update-parallelism - --user -u - --workdir -w - " - - local boolean_options=" - --help - --tty -t - --with-registry-auth - " - - __docker_complete_log_driver_options && return - - if [ "$subcommand" = "create" ] ; then - options_with_args="$options_with_args - --container-label - --dns - --dns-option - --dns-search - --env-file - --group - --host - --mode - --name - --publish -p - --secret - " - - case "$prev" in - --env-file) - _filedir - return - ;; - --host) - case "$cur" in - *:) - __docker_complete_resolved_hostname - return - ;; - esac - ;; - --mode) - COMPREPLY=( $( compgen -W "global replicated" -- "$cur" ) ) - return - ;; - --secret) - __docker_complete_secrets - return - ;; - --group) - COMPREPLY=( $(compgen -g -- "$cur") ) - return - ;; - esac - fi - if [ "$subcommand" = "update" ] ; then - options_with_args="$options_with_args - --arg - --container-label-add - --container-label-rm - --dns-add - --dns-option-add - --dns-option-rm - --dns-rm - --dns-search-add - --dns-search-rm - --group-add - --group-rm - --host-add - --host-rm - --image - --publish-add - --publish-rm - --secret-add - --secret-rm - " - - case "$prev" in - --group-add) - COMPREPLY=( $(compgen -g -- "$cur") ) - return - ;; - --group-rm) - COMPREPLY=( $(compgen -g -- "$cur") ) - return - ;; - --host-add|--host-rm) - case "$cur" in - *:) - __docker_complete_resolved_hostname - return - ;; - esac - ;; - --image) - __docker_complete_image_repos_and_tags - return - ;; - --secret-add|--secret-rm) - __docker_complete_secrets - return - ;; - esac - fi - - case "$prev" in - --endpoint-mode) - COMPREPLY=( $( compgen -W "dnsrr vip" -- "$cur" ) ) - return - ;; - --env|-e) - # we do not append a "=" here because "-e VARNAME" is legal systax, too - COMPREPLY=( $( compgen -e -- "$cur" ) ) - __docker_nospace - return - ;; - --log-driver) - __docker_complete_log_drivers - return - ;; - --log-opt) - __docker_complete_log_options - return - ;; - --network) - __docker_complete_networks - return - ;; - --restart-condition) - COMPREPLY=( $( compgen -W "any none on-failure" -- "$cur" ) ) - return - ;; - --user|-u) - __docker_complete_user_group - return - ;; - $(__docker_to_extglob "$options_with_args") ) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) ) - ;; - *) - local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) ) - if [ "$subcommand" = "update" ] ; then - if [ $cword -eq $counter ]; then - __docker_complete_services - fi - else - if [ $cword -eq $counter ]; then - __docker_complete_images - fi - fi - ;; - esac -} - -_docker_swarm() { - local subcommands=" - init - join - join-token - leave - unlock - unlock-key - update - " - __docker_subcommands "$subcommands" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_swarm_init() { - case "$prev" in - --advertise-addr) - if [[ $cur == *: ]] ; then - COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) ) - else - __docker_complete_local_interfaces - __docker_nospace - fi - return - ;; - --availability) - COMPREPLY=( $( compgen -W "active drain pause" -- "$cur" ) ) - return - ;; - --cert-expiry|--dispatcher-heartbeat|--external-ca|--max-snapshots|--snapshot-interval|--task-history-limit) - return - ;; - --listen-addr) - if [[ $cur == *: ]] ; then - COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) ) - else - __docker_complete_local_interfaces --add 0.0.0.0 - __docker_nospace - fi - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--advertise-addr --autolock --availability --cert-expiry --dispatcher-heartbeat --external-ca --force-new-cluster --help --listen-addr --max-snapshots --snapshot-interval --task-history-limit" -- "$cur" ) ) - ;; - esac -} - -_docker_swarm_join() { - case "$prev" in - --advertise-addr) - if [[ $cur == *: ]] ; then - COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) ) - else - __docker_complete_local_interfaces - __docker_nospace - fi - return - ;; - --listen-addr) - if [[ $cur == *: ]] ; then - COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) ) - else - __docker_complete_local_interfaces --add 0.0.0.0 - __docker_nospace - fi - return - ;; - --token) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--advertise-addr --help --listen-addr --token" -- "$cur" ) ) - ;; - *:) - COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) ) - ;; - esac -} - -_docker_swarm_join-token() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --quiet -q --rotate" -- "$cur" ) ) - ;; - *) - local counter=$( __docker_pos_first_nonflag ) - if [ $cword -eq $counter ]; then - COMPREPLY=( $( compgen -W "manager worker" -- "$cur" ) ) - fi - ;; - esac -} - -_docker_swarm_leave() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) ) - ;; - esac -} - -_docker_swarm_unlock() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - esac -} - -_docker_swarm_unlock-key() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --quiet -q --rotate" -- "$cur" ) ) - ;; - esac -} - -_docker_swarm_update() { - case "$prev" in - --cert-expiry|--dispatcher-heartbeat|--external-ca|--max-snapshots|--snapshot-interval|--task-history-limit) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--autolock --cert-expiry --dispatcher-heartbeat --external-ca --help --max-snapshots --snapshot-interval --task-history-limit" -- "$cur" ) ) - ;; - esac -} - -_docker_node() { - local subcommands=" - demote - inspect - ls list - promote - rm remove - ps - update - " - __docker_subcommands "$subcommands" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_node_demote() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_complete_nodes --filter role=manager - esac -} - -_docker_node_inspect() { - case "$prev" in - --format|-f) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) ) - ;; - *) - __docker_complete_nodes_plus_self - esac -} - -_docker_node_list() { - _docker_node_ls -} - -_docker_node_ls() { - local key=$(__docker_map_key_of_current_option '--filter|-f') - case "$key" in - id) - __docker_complete_nodes --cur "${cur##*=}" --id - return - ;; - name) - __docker_complete_nodes --cur "${cur##*=}" --name - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -W "id label name" -S = -- "$cur" ) ) - __docker_nospace - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--filter -f --help --quiet -q" -- "$cur" ) ) - ;; - esac -} - -_docker_node_promote() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_complete_nodes --filter role=worker - esac -} - -_docker_node_remove() { - _docker_node_rm -} - -_docker_node_rm() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) ) - ;; - *) - __docker_complete_nodes - esac -} - -_docker_node_ps() { - local key=$(__docker_map_key_of_current_option '--filter|-f') - case "$key" in - desired-state) - COMPREPLY=( $( compgen -W "accepted running" -- "${cur##*=}" ) ) - return - ;; - name) - __docker_complete_services --cur "${cur##*=}" --name - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -W "desired-state id label name" -S = -- "$cur" ) ) - __docker_nospace - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--filter -f --help --no-resolve --no-trunc" -- "$cur" ) ) - ;; - *) - __docker_complete_nodes_plus_self - ;; - esac -} - -_docker_node_update() { - case "$prev" in - --availability) - COMPREPLY=( $( compgen -W "active drain pause" -- "$cur" ) ) - return - ;; - --role) - COMPREPLY=( $( compgen -W "manager worker" -- "$cur" ) ) - return - ;; - --label-add|--label-rm) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--availability --help --label-add --label-rm --role" -- "$cur" ) ) - ;; - *) - __docker_complete_nodes - esac -} - -_docker_pause() { - _docker_container_pause -} - -_docker_plugin() { - local subcommands=" - create - disable - enable - inspect - install - ls - push - rm - set - " - local aliases=" - list - remove - " - __docker_subcommands "$subcommands $aliases" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_plugin_create() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--compress --help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - # reponame - return - elif [ $cword -eq $((counter + 1)) ]; then - _filedir -d - fi - ;; - esac -} - -_docker_plugin_disable() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_plugins_installed - fi - ;; - esac -} - -_docker_plugin_enable() { - case "$prev" in - --timeout) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --timeout" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--timeout') - if [ $cword -eq $counter ]; then - __docker_complete_plugins_installed - fi - ;; - esac -} - -_docker_plugin_inspect() { - case "$prev" in - --format|f) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) ) - ;; - *) - __docker_complete_plugins_installed - ;; - esac -} - -_docker_plugin_install() { - case "$prev" in - --alias) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--alias --disable --disable-content-trust=false --grant-all-permissions --help" -- "$cur" ) ) - ;; - esac -} - -_docker_plugin_list() { - _docker_plugin_ls -} - -_docker_plugin_ls() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --no-trunc" -- "$cur" ) ) - ;; - esac -} - -_docker_plugin_push() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_plugins_installed - fi - ;; - esac -} - -_docker_plugin_remove() { - _docker_plugin_rm -} - -_docker_plugin_rm() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) ) - ;; - *) - __docker_complete_plugins_installed - ;; - esac -} - -_docker_plugin_set() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_plugins_installed - fi - ;; - esac -} - - -_docker_port() { - _docker_container_port -} - -_docker_ps() { - _docker_container_ls -} - -_docker_pull() { - _docker_image_pull -} - -_docker_push() { - _docker_image_push -} - -_docker_rename() { - _docker_container_rename -} - -_docker_restart() { - _docker_container_restart -} - -_docker_rm() { - _docker_container_rm -} - -_docker_rmi() { - _docker_image_rm -} - -_docker_run() { - _docker_container_run -} - -_docker_save() { - _docker_image_save -} - - -_docker_secret() { - local subcommands=" - create - inspect - ls - rm - " - local aliases=" - list - remove - " - __docker_subcommands "$subcommands $aliases" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_secret_create() { - case "$prev" in - --label|-l) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --label -l" -- "$cur" ) ) - ;; - esac -} - -_docker_secret_inspect() { - case "$prev" in - --format|-f) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) ) - ;; - *) - __docker_complete_secrets - ;; - esac -} - -_docker_secret_list() { - _docker_secret_ls -} - -_docker_secret_ls() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --quiet -q" -- "$cur" ) ) - ;; - esac -} - -_docker_secret_remove() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - __docker_complete_secrets - ;; - esac -} - -_docker_secret_rm() { - _docker_secret_remove -} - - - -_docker_search() { - local key=$(__docker_map_key_of_current_option '--filter|-f') - case "$key" in - is-automated) - COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) ) - return - ;; - is-official) - COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) ) - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -S = -W "is-automated is-official stars" -- "$cur" ) ) - __docker_nospace - return - ;; - --limit) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--filter --help --limit --no-trunc" -- "$cur" ) ) - ;; - esac -} - - -_docker_stack() { - local subcommands=" - deploy - ls - ps - rm - services - " - local aliases=" - down - list - remove - up - " - __docker_subcommands "$subcommands $aliases" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_stack_deploy() { - case "$prev" in - --bundle-file) - if __docker_is_experimental ; then - _filedir dab - return - fi - ;; - --compose-file|-c) - _filedir yml - return - ;; - esac - - case "$cur" in - -*) - local options="--compose-file -c --help --with-registry-auth" - __docker_is_experimental && options+=" --bundle-file" - COMPREPLY=( $( compgen -W "$options" -- "$cur" ) ) - ;; - esac -} - -_docker_stack_down() { - _docker_stack_rm -} - -_docker_stack_list() { - _docker_stack_ls -} - -_docker_stack_ls() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - esac -} - -_docker_stack_ps() { - local key=$(__docker_map_key_of_current_option '--filter|-f') - case "$key" in - desired-state) - COMPREPLY=( $( compgen -W "accepted running" -- "${cur##*=}" ) ) - return - ;; - id) - __docker_complete_stacks --cur "${cur##*=}" --id - return - ;; - name) - __docker_complete_stacks --cur "${cur##*=}" --name - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -S = -W "id name desired-state" -- "$cur" ) ) - __docker_nospace - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--all -a --filter -f --help --no-resolve --no-trunc" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--filter|-f') - if [ $cword -eq $counter ]; then - __docker_complete_stacks - fi - ;; - esac -} - -_docker_stack_remove() { - _docker_stack_rm -} - -_docker_stack_rm() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag) - if [ $cword -eq $counter ]; then - __docker_complete_stacks - fi - ;; - esac -} - -_docker_stack_services() { - local key=$(__docker_map_key_of_current_option '--filter|-f') - case "$key" in - id) - __docker_complete_services --cur "${cur##*=}" --id - return - ;; - label) - return - ;; - name) - __docker_complete_services --cur "${cur##*=}" --name - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -S = -W "id label name" -- "$cur" ) ) - __docker_nospace - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--filter -f --help --quiet -q" -- "$cur" ) ) - ;; - *) - local counter=$(__docker_pos_first_nonflag '--filter|-f') - if [ $cword -eq $counter ]; then - __docker_complete_stacks - fi - ;; - esac -} - -_docker_stack_up() { - _docker_stack_deploy -} - - -_docker_start() { - _docker_container_start -} - -_docker_stats() { - _docker_container_stats -} - -_docker_stop() { - _docker_container_stop -} - - -_docker_system() { - local subcommands=" - df - events - info - prune - " - __docker_subcommands "$subcommands $aliases" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_system_df() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help --verbose -v" -- "$cur" ) ) - ;; - esac -} - -_docker_system_events() { - local key=$(__docker_map_key_of_current_option '-f|--filter') - case "$key" in - container) - __docker_complete_containers_all --cur "${cur##*=}" - return - ;; - daemon) - local name=$(__docker_q info | sed -n 's/^\(ID\|Name\): //p') - COMPREPLY=( $( compgen -W "$name" -- "${cur##*=}" ) ) - return - ;; - event) - COMPREPLY=( $( compgen -W " - attach - commit - connect - copy - create - delete - destroy - detach - die - disconnect - exec_create - exec_detach - exec_start - export - health_status - import - kill - load - mount - oom - pause - pull - push - reload - rename - resize - restart - save - start - stop - tag - top - unmount - unpause - untag - update - " -- "${cur##*=}" ) ) - return - ;; - image) - cur="${cur##*=}" - __docker_complete_images - return - ;; - network) - __docker_complete_networks --cur "${cur##*=}" - return - ;; - type) - COMPREPLY=( $( compgen -W "container daemon image network volume" -- "${cur##*=}" ) ) - return - ;; - volume) - __docker_complete_volumes --cur "${cur##*=}" - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -S = -W "container daemon event image label network type volume" -- "$cur" ) ) - __docker_nospace - return - ;; - --since|--until) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--filter -f --help --since --until --format" -- "$cur" ) ) - ;; - esac -} - -_docker_system_info() { - case "$prev" in - --format|-f) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) ) - ;; - esac -} - -_docker_system_prune() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--all -a --force -f --help" -- "$cur" ) ) - ;; - esac -} - - -_docker_tag() { - _docker_image_tag -} - -_docker_unpause() { - _docker_container_unpause -} - -_docker_update() { - _docker_container_update -} - -_docker_top() { - _docker_container_top -} - -_docker_version() { - case "$prev" in - --format|-f) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) ) - ;; - esac -} - -_docker_volume_create() { - case "$prev" in - --driver|-d) - __docker_complete_plugins_bundled --type Volume - return - ;; - --label|--opt|-o) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--driver -d --help --label --opt -o" -- "$cur" ) ) - ;; - esac -} - -_docker_volume_inspect() { - case "$prev" in - --format|-f) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) ) - ;; - *) - __docker_complete_volumes - ;; - esac -} - -_docker_volume_ls() { - local key=$(__docker_map_key_of_current_option '--filter|-f') - case "$key" in - dangling) - COMPREPLY=( $( compgen -W "true false" -- "${cur##*=}" ) ) - return - ;; - driver) - __docker_complete_plugins_bundled --cur "${cur##*=}" --type Volume - return - ;; - name) - __docker_complete_volumes --cur "${cur##*=}" - return - ;; - esac - - case "$prev" in - --filter|-f) - COMPREPLY=( $( compgen -S = -W "dangling driver label name" -- "$cur" ) ) - __docker_nospace - return - ;; - --format) - return - ;; - esac - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--filter -f --format --help --quiet -q" -- "$cur" ) ) - ;; - esac -} - -_docker_volume_prune() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) ) - ;; - esac -} - -_docker_volume_rm() { - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) ) - ;; - *) - __docker_complete_volumes - ;; - esac -} - -_docker_volume() { - local subcommands=" - create - inspect - ls - prune - rm - " - __docker_subcommands "$subcommands" && return - - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) - ;; - *) - COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) ) - ;; - esac -} - -_docker_wait() { - _docker_container_wait -} - -_docker() { - local previous_extglob_setting=$(shopt -p extglob) - shopt -s extglob - - local management_commands=( - container - image - network - node - plugin - secret - service - stack - system - volume - ) - - local top_level_commands=( - build - login - logout - run - search - version - ) - - local legacy_commands=( - commit - cp - create - diff - events - exec - export - history - images - import - info - inspect - kill - load - logs - pause - port - ps - pull - push - rename - restart - rm - rmi - save - start - stats - stop - swarm - tag - top - unpause - update - wait - ) - - local experimental_commands=( - checkpoint - deploy - ) - - local commands=(${management_commands[*]} ${top_level_commands[*]}) - [ -z "$DOCKER_HIDE_LEGACY_COMMANDS" ] && commands+=(${legacy_commands[*]}) - - # These options are valid as global options for all client commands - # and valid as command options for `docker daemon` - local global_boolean_options=" - --debug -D - --tls - --tlsverify - " - local global_options_with_args=" - --config - --host -H - --log-level -l - --tlscacert - --tlscert - --tlskey - " - - local host config - - COMPREPLY=() - local cur prev words cword - _get_comp_words_by_ref -n : cur prev words cword - - local command='docker' command_pos=0 subcommand_pos - local counter=1 - while [ $counter -lt $cword ]; do - case "${words[$counter]}" in - # save host so that completion can use custom daemon - --host|-H) - (( counter++ )) - host="${words[$counter]}" - ;; - # save config so that completion can use custom configuration directories - --config) - (( counter++ )) - config="${words[$counter]}" - ;; - $(__docker_to_extglob "$global_options_with_args") ) - (( counter++ )) - ;; - -*) - ;; - =) - (( counter++ )) - ;; - *) - command="${words[$counter]}" - command_pos=$counter - break - ;; - esac - (( counter++ )) - done - - local binary="${words[0]}" - if [[ $binary == ?(*/)dockerd ]] ; then - # for the dockerd binary, we reuse completion of `docker daemon`. - # dockerd does not have subcommands and global options. - command=daemon - command_pos=0 - fi - - local completions_func=_docker_${command} - declare -F $completions_func >/dev/null && $completions_func - - eval "$previous_extglob_setting" - return 0 -} - -eval "$__docker_previous_extglob_setting" -unset __docker_previous_extglob_setting - -complete -F _docker docker dockerd diff --git a/vendor/github.com/docker/docker/contrib/completion/fish/docker.fish b/vendor/github.com/docker/docker/contrib/completion/fish/docker.fish deleted file mode 100644 index 2715cb1aa..000000000 --- a/vendor/github.com/docker/docker/contrib/completion/fish/docker.fish +++ /dev/null @@ -1,405 +0,0 @@ -# docker.fish - docker completions for fish shell -# -# This file is generated by gen_docker_fish_completions.py from: -# https://github.com/barnybug/docker-fish-completion -# -# To install the completions: -# mkdir -p ~/.config/fish/completions -# cp docker.fish ~/.config/fish/completions -# -# Completion supported: -# - parameters -# - commands -# - containers -# - images -# - repositories - -function __fish_docker_no_subcommand --description 'Test if docker has yet to be given the subcommand' - for i in (commandline -opc) - if contains -- $i attach build commit cp create diff events exec export history images import info inspect kill load login logout logs pause port ps pull push rename restart rm rmi run save search start stop tag top unpause version wait stats - return 1 - end - end - return 0 -end - -function __fish_print_docker_containers --description 'Print a list of docker containers' -a select - switch $select - case running - docker ps -a --no-trunc | command awk 'NR>1' | command awk 'BEGIN {FS=" +"}; $5 ~ "^Up" {print $1 "\n" $(NF)}' | tr ',' '\n' - case stopped - docker ps -a --no-trunc | command awk 'NR>1' | command awk 'BEGIN {FS=" +"}; $5 ~ "^Exit" {print $1 "\n" $(NF)}' | tr ',' '\n' - case all - docker ps -a --no-trunc | command awk 'NR>1' | command awk 'BEGIN {FS=" +"}; {print $1 "\n" $(NF)}' | tr ',' '\n' - end -end - -function __fish_print_docker_images --description 'Print a list of docker images' - docker images | command awk 'NR>1' | command grep -v '' | command awk '{print $1":"$2}' -end - -function __fish_print_docker_repositories --description 'Print a list of docker repositories' - docker images | command awk 'NR>1' | command grep -v '' | command awk '{print $1}' | command sort | command uniq -end - -# common options -complete -c docker -f -n '__fish_docker_no_subcommand' -l api-cors-header -d "Set CORS headers in the Engine API. Default is cors disabled" -complete -c docker -f -n '__fish_docker_no_subcommand' -s b -l bridge -d 'Attach containers to a pre-existing network bridge' -complete -c docker -f -n '__fish_docker_no_subcommand' -l bip -d "Use this CIDR notation address for the network bridge's IP, not compatible with -b" -complete -c docker -f -n '__fish_docker_no_subcommand' -s D -l debug -d 'Enable debug mode' -complete -c docker -f -n '__fish_docker_no_subcommand' -s d -l daemon -d 'Enable daemon mode' -complete -c docker -f -n '__fish_docker_no_subcommand' -l dns -d 'Force Docker to use specific DNS servers' -complete -c docker -f -n '__fish_docker_no_subcommand' -l dns-opt -d 'Force Docker to use specific DNS options' -complete -c docker -f -n '__fish_docker_no_subcommand' -l dns-search -d 'Force Docker to use specific DNS search domains' -complete -c docker -f -n '__fish_docker_no_subcommand' -l exec-opt -d 'Set runtime execution options' -complete -c docker -f -n '__fish_docker_no_subcommand' -l fixed-cidr -d 'IPv4 subnet for fixed IPs (e.g. 10.20.0.0/16)' -complete -c docker -f -n '__fish_docker_no_subcommand' -l fixed-cidr-v6 -d 'IPv6 subnet for fixed IPs (e.g.: 2001:a02b/48)' -complete -c docker -f -n '__fish_docker_no_subcommand' -s G -l group -d 'Group to assign the unix socket specified by -H when running in daemon mode' -complete -c docker -f -n '__fish_docker_no_subcommand' -s g -l graph -d 'Path to use as the root of the Docker runtime' -complete -c docker -f -n '__fish_docker_no_subcommand' -s H -l host -d 'The socket(s) to bind to in daemon mode or connect to in client mode, specified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.' -complete -c docker -f -n '__fish_docker_no_subcommand' -s h -l help -d 'Print usage' -complete -c docker -f -n '__fish_docker_no_subcommand' -l icc -d 'Allow unrestricted inter-container and Docker daemon host communication' -complete -c docker -f -n '__fish_docker_no_subcommand' -l insecure-registry -d 'Enable insecure communication with specified registries (no certificate verification for HTTPS and enable HTTP fallback) (e.g., localhost:5000 or 10.20.0.0/16)' -complete -c docker -f -n '__fish_docker_no_subcommand' -l ip -d 'Default IP address to use when binding container ports' -complete -c docker -f -n '__fish_docker_no_subcommand' -l ip-forward -d 'Enable net.ipv4.ip_forward and IPv6 forwarding if --fixed-cidr-v6 is defined. IPv6 forwarding may interfere with your existing IPv6 configuration when using Router Advertisement.' -complete -c docker -f -n '__fish_docker_no_subcommand' -l ip-masq -d "Enable IP masquerading for bridge's IP range" -complete -c docker -f -n '__fish_docker_no_subcommand' -l iptables -d "Enable Docker's addition of iptables rules" -complete -c docker -f -n '__fish_docker_no_subcommand' -l ipv6 -d 'Enable IPv6 networking' -complete -c docker -f -n '__fish_docker_no_subcommand' -s l -l log-level -d 'Set the logging level ("debug", "info", "warn", "error", "fatal")' -complete -c docker -f -n '__fish_docker_no_subcommand' -l label -d 'Set key=value labels to the daemon (displayed in `docker info`)' -complete -c docker -f -n '__fish_docker_no_subcommand' -l mtu -d 'Set the containers network MTU' -complete -c docker -f -n '__fish_docker_no_subcommand' -s p -l pidfile -d 'Path to use for daemon PID file' -complete -c docker -f -n '__fish_docker_no_subcommand' -l registry-mirror -d 'Specify a preferred Docker registry mirror' -complete -c docker -f -n '__fish_docker_no_subcommand' -s s -l storage-driver -d 'Force the Docker runtime to use a specific storage driver' -complete -c docker -f -n '__fish_docker_no_subcommand' -l selinux-enabled -d 'Enable selinux support. SELinux does not presently support the BTRFS storage driver' -complete -c docker -f -n '__fish_docker_no_subcommand' -l storage-opt -d 'Set storage driver options' -complete -c docker -f -n '__fish_docker_no_subcommand' -l tls -d 'Use TLS; implied by --tlsverify' -complete -c docker -f -n '__fish_docker_no_subcommand' -l tlscacert -d 'Trust only remotes providing a certificate signed by the CA given here' -complete -c docker -f -n '__fish_docker_no_subcommand' -l tlscert -d 'Path to TLS certificate file' -complete -c docker -f -n '__fish_docker_no_subcommand' -l tlskey -d 'Path to TLS key file' -complete -c docker -f -n '__fish_docker_no_subcommand' -l tlsverify -d 'Use TLS and verify the remote (daemon: verify client, client: verify daemon)' -complete -c docker -f -n '__fish_docker_no_subcommand' -s v -l version -d 'Print version information and quit' - -# subcommands -# attach -complete -c docker -f -n '__fish_docker_no_subcommand' -a attach -d 'Attach to a running container' -complete -c docker -A -f -n '__fish_seen_subcommand_from attach' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from attach' -l no-stdin -d 'Do not attach STDIN' -complete -c docker -A -f -n '__fish_seen_subcommand_from attach' -l sig-proxy -d 'Proxy all received signals to the process (non-TTY mode only). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.' -complete -c docker -A -f -n '__fish_seen_subcommand_from attach' -a '(__fish_print_docker_containers running)' -d "Container" - -# build -complete -c docker -f -n '__fish_docker_no_subcommand' -a build -d 'Build an image from a Dockerfile' -complete -c docker -A -f -n '__fish_seen_subcommand_from build' -s f -l file -d "Name of the Dockerfile(Default is 'Dockerfile' at context root)" -complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l force-rm -d 'Always remove intermediate containers, even after unsuccessful builds' -complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l no-cache -d 'Do not use cache when building the image' -complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l pull -d 'Always attempt to pull a newer version of the image' -complete -c docker -A -f -n '__fish_seen_subcommand_from build' -s q -l quiet -d 'Suppress the build output and print image ID on success' -complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l rm -d 'Remove intermediate containers after a successful build' -complete -c docker -A -f -n '__fish_seen_subcommand_from build' -s t -l tag -d 'Repository name (and optionally a tag) to be applied to the resulting image in case of success' - -# commit -complete -c docker -f -n '__fish_docker_no_subcommand' -a commit -d "Create a new image from a container's changes" -complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -s a -l author -d 'Author (e.g., "John Hannibal Smith ")' -complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -s m -l message -d 'Commit message' -complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -s p -l pause -d 'Pause container during commit' -complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -a '(__fish_print_docker_containers all)' -d "Container" - -# cp -complete -c docker -f -n '__fish_docker_no_subcommand' -a cp -d "Copy files/folders between a container and the local filesystem" -complete -c docker -A -f -n '__fish_seen_subcommand_from cp' -l help -d 'Print usage' - -# create -complete -c docker -f -n '__fish_docker_no_subcommand' -a create -d 'Create a new container' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s a -l attach -d 'Attach to STDIN, STDOUT or STDERR.' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l add-host -d 'Add a custom host-to-IP mapping (host:ip)' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cpu-shares -d 'CPU shares (relative weight)' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cap-add -d 'Add Linux capabilities' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cap-drop -d 'Drop Linux capabilities' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cidfile -d 'Write the container ID to the file' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cpuset -d 'CPUs in which to allow execution (0-3, 0,1)' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l device -d 'Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm)' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l dns -d 'Set custom DNS servers' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l dns-opt -d "Set custom DNS options (Use --dns-opt='' if you don't wish to set options)" -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l dns-search -d "Set custom DNS search domains (Use --dns-search=. if you don't wish to set the search domain)" -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s e -l env -d 'Set environment variables' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l entrypoint -d 'Overwrite the default ENTRYPOINT of the image' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l env-file -d 'Read in a line delimited file of environment variables' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l expose -d 'Expose a port or a range of ports (e.g. --expose=3300-3310) from the container without publishing it to your host' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l group-add -d 'Add additional groups to run as' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s h -l hostname -d 'Container host name' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s i -l interactive -d 'Keep STDIN open even if not attached' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l ipc -d 'Default is to create a private IPC namespace (POSIX SysV IPC) for the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l link -d 'Add link to another container in the form of :alias' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s m -l memory -d 'Memory limit (format: [], where unit = b, k, m or g)' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l mac-address -d 'Container MAC address (e.g. 92:d0:c6:0a:29:33)' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l memory-swap -d "Total memory usage (memory + swap), set '-1' to disable swap (format: [], where unit = b, k, m or g)" -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l name -d 'Assign a name to the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l net -d 'Set the Network mode for the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s P -l publish-all -d 'Publish all exposed ports to random ports on the host interfaces' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s p -l publish -d "Publish a container's port to the host" -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l pid -d 'Default is to create a private PID namespace for the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l privileged -d 'Give extended privileges to this container' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l read-only -d "Mount the container's root filesystem as read only" -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l restart -d 'Restart policy to apply when a container exits (no, on-failure[:max-retry], always)' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l security-opt -d 'Security Options' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s t -l tty -d 'Allocate a pseudo-TTY' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s u -l user -d 'Username or UID' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s v -l volume -d 'Bind mount a volume (e.g., from the host: -v /host:/container, from Docker: -v /container)' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l volumes-from -d 'Mount volumes from the specified container(s)' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s w -l workdir -d 'Working directory inside the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -a '(__fish_print_docker_images)' -d "Image" - -# diff -complete -c docker -f -n '__fish_docker_no_subcommand' -a diff -d "Inspect changes on a container's filesystem" -complete -c docker -A -f -n '__fish_seen_subcommand_from diff' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from diff' -a '(__fish_print_docker_containers all)' -d "Container" - -# events -complete -c docker -f -n '__fish_docker_no_subcommand' -a events -d 'Get real time events from the server' -complete -c docker -A -f -n '__fish_seen_subcommand_from events' -s f -l filter -d "Provide filter values (i.e., 'event=stop')" -complete -c docker -A -f -n '__fish_seen_subcommand_from events' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from events' -l since -d 'Show all events created since timestamp' -complete -c docker -A -f -n '__fish_seen_subcommand_from events' -l until -d 'Stream events until this timestamp' -complete -c docker -A -f -n '__fish_seen_subcommand_from events' -l format -d 'Format the output using the given go template' - -# exec -complete -c docker -f -n '__fish_docker_no_subcommand' -a exec -d 'Run a command in a running container' -complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -s d -l detach -d 'Detached mode: run command in the background' -complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -s i -l interactive -d 'Keep STDIN open even if not attached' -complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -s t -l tty -d 'Allocate a pseudo-TTY' -complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -a '(__fish_print_docker_containers running)' -d "Container" - -# export -complete -c docker -f -n '__fish_docker_no_subcommand' -a export -d 'Stream the contents of a container as a tar archive' -complete -c docker -A -f -n '__fish_seen_subcommand_from export' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from export' -a '(__fish_print_docker_containers all)' -d "Container" - -# history -complete -c docker -f -n '__fish_docker_no_subcommand' -a history -d 'Show the history of an image' -complete -c docker -A -f -n '__fish_seen_subcommand_from history' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from history' -l no-trunc -d "Don't truncate output" -complete -c docker -A -f -n '__fish_seen_subcommand_from history' -s q -l quiet -d 'Only show numeric IDs' -complete -c docker -A -f -n '__fish_seen_subcommand_from history' -a '(__fish_print_docker_images)' -d "Image" - -# images -complete -c docker -f -n '__fish_docker_no_subcommand' -a images -d 'List images' -complete -c docker -A -f -n '__fish_seen_subcommand_from images' -s a -l all -d 'Show all images (by default filter out the intermediate image layers)' -complete -c docker -A -f -n '__fish_seen_subcommand_from images' -s f -l filter -d "Provide filter values (i.e., 'dangling=true')" -complete -c docker -A -f -n '__fish_seen_subcommand_from images' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from images' -l no-trunc -d "Don't truncate output" -complete -c docker -A -f -n '__fish_seen_subcommand_from images' -s q -l quiet -d 'Only show numeric IDs' -complete -c docker -A -f -n '__fish_seen_subcommand_from images' -a '(__fish_print_docker_repositories)' -d "Repository" - -# import -complete -c docker -f -n '__fish_docker_no_subcommand' -a import -d 'Create a new filesystem image from the contents of a tarball' -complete -c docker -A -f -n '__fish_seen_subcommand_from import' -l help -d 'Print usage' - -# info -complete -c docker -f -n '__fish_docker_no_subcommand' -a info -d 'Display system-wide information' -complete -c docker -A -f -n '__fish_seen_subcommand_from info' -s f -l format -d 'Format the output using the given go template' -complete -c docker -A -f -n '__fish_seen_subcommand_from info' -l help -d 'Print usage' - -# inspect -complete -c docker -f -n '__fish_docker_no_subcommand' -a inspect -d 'Return low-level information on a container or image' -complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -s f -l format -d 'Format the output using the given go template.' -complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -s s -l size -d 'Display total file sizes if the type is container.' -complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -a '(__fish_print_docker_images)' -d "Image" -complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -a '(__fish_print_docker_containers all)' -d "Container" - -# kill -complete -c docker -f -n '__fish_docker_no_subcommand' -a kill -d 'Kill a running container' -complete -c docker -A -f -n '__fish_seen_subcommand_from kill' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from kill' -s s -l signal -d 'Signal to send to the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from kill' -a '(__fish_print_docker_containers running)' -d "Container" - -# load -complete -c docker -f -n '__fish_docker_no_subcommand' -a load -d 'Load an image from a tar archive' -complete -c docker -A -f -n '__fish_seen_subcommand_from load' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from load' -s i -l input -d 'Read from a tar archive file, instead of STDIN' - -# login -complete -c docker -f -n '__fish_docker_no_subcommand' -a login -d 'Log in to a Docker registry server' -complete -c docker -A -f -n '__fish_seen_subcommand_from login' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from login' -s p -l password -d 'Password' -complete -c docker -A -f -n '__fish_seen_subcommand_from login' -s u -l username -d 'Username' - -# logout -complete -c docker -f -n '__fish_docker_no_subcommand' -a logout -d 'Log out from a Docker registry server' - -# logs -complete -c docker -f -n '__fish_docker_no_subcommand' -a logs -d 'Fetch the logs of a container' -complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -s f -l follow -d 'Follow log output' -complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -s t -l timestamps -d 'Show timestamps' -complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -l since -d 'Show logs since timestamp' -complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -l tail -d 'Output the specified number of lines at the end of logs (defaults to all logs)' -complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -a '(__fish_print_docker_containers running)' -d "Container" - -# port -complete -c docker -f -n '__fish_docker_no_subcommand' -a port -d 'Lookup the public-facing port that is NAT-ed to PRIVATE_PORT' -complete -c docker -A -f -n '__fish_seen_subcommand_from port' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from port' -a '(__fish_print_docker_containers running)' -d "Container" - -# pause -complete -c docker -f -n '__fish_docker_no_subcommand' -a pause -d 'Pause all processes within a container' -complete -c docker -A -f -n '__fish_seen_subcommand_from pause' -a '(__fish_print_docker_containers running)' -d "Container" - -# ps -complete -c docker -f -n '__fish_docker_no_subcommand' -a ps -d 'List containers' -complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s a -l all -d 'Show all containers. Only running containers are shown by default.' -complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -l before -d 'Show only container created before Id or Name, include non-running ones.' -complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s f -l filter -d 'Provide filter values. Valid filters:' -complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s l -l latest -d 'Show only the latest created container, include non-running ones.' -complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s n -d 'Show n last created containers, include non-running ones.' -complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -l no-trunc -d "Don't truncate output" -complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s q -l quiet -d 'Only display numeric IDs' -complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s s -l size -d 'Display total file sizes' -complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -l since -d 'Show only containers created since Id or Name, include non-running ones.' - -# pull -complete -c docker -f -n '__fish_docker_no_subcommand' -a pull -d 'Pull an image or a repository from a Docker registry server' -complete -c docker -A -f -n '__fish_seen_subcommand_from pull' -s a -l all-tags -d 'Download all tagged images in the repository' -complete -c docker -A -f -n '__fish_seen_subcommand_from pull' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from pull' -a '(__fish_print_docker_images)' -d "Image" -complete -c docker -A -f -n '__fish_seen_subcommand_from pull' -a '(__fish_print_docker_repositories)' -d "Repository" - -# push -complete -c docker -f -n '__fish_docker_no_subcommand' -a push -d 'Push an image or a repository to a Docker registry server' -complete -c docker -A -f -n '__fish_seen_subcommand_from push' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from push' -a '(__fish_print_docker_images)' -d "Image" -complete -c docker -A -f -n '__fish_seen_subcommand_from push' -a '(__fish_print_docker_repositories)' -d "Repository" - -# rename -complete -c docker -f -n '__fish_docker_no_subcommand' -a rename -d 'Rename an existing container' - -# restart -complete -c docker -f -n '__fish_docker_no_subcommand' -a restart -d 'Restart a container' -complete -c docker -A -f -n '__fish_seen_subcommand_from restart' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from restart' -s t -l time -d 'Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds.' -complete -c docker -A -f -n '__fish_seen_subcommand_from restart' -a '(__fish_print_docker_containers running)' -d "Container" - -# rm -complete -c docker -f -n '__fish_docker_no_subcommand' -a rm -d 'Remove one or more containers' -complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -s f -l force -d 'Force the removal of a running container (uses SIGKILL)' -complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -s l -l link -d 'Remove the specified link and not the underlying container' -complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -s v -l volumes -d 'Remove the volumes associated with the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -a '(__fish_print_docker_containers stopped)' -d "Container" -complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -s f -l force -a '(__fish_print_docker_containers all)' -d "Container" - -# rmi -complete -c docker -f -n '__fish_docker_no_subcommand' -a rmi -d 'Remove one or more images' -complete -c docker -A -f -n '__fish_seen_subcommand_from rmi' -s f -l force -d 'Force removal of the image' -complete -c docker -A -f -n '__fish_seen_subcommand_from rmi' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from rmi' -l no-prune -d 'Do not delete untagged parents' -complete -c docker -A -f -n '__fish_seen_subcommand_from rmi' -a '(__fish_print_docker_images)' -d "Image" - -# run -complete -c docker -f -n '__fish_docker_no_subcommand' -a run -d 'Run a command in a new container' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s a -l attach -d 'Attach to STDIN, STDOUT or STDERR.' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l add-host -d 'Add a custom host-to-IP mapping (host:ip)' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s c -l cpu-shares -d 'CPU shares (relative weight)' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l cap-add -d 'Add Linux capabilities' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l cap-drop -d 'Drop Linux capabilities' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l cidfile -d 'Write the container ID to the file' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l cpuset -d 'CPUs in which to allow execution (0-3, 0,1)' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s d -l detach -d 'Detached mode: run the container in the background and print the new container ID' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l device -d 'Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm)' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l dns -d 'Set custom DNS servers' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l dns-opt -d "Set custom DNS options (Use --dns-opt='' if you don't wish to set options)" -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l dns-search -d "Set custom DNS search domains (Use --dns-search=. if you don't wish to set the search domain)" -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s e -l env -d 'Set environment variables' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l entrypoint -d 'Overwrite the default ENTRYPOINT of the image' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l env-file -d 'Read in a line delimited file of environment variables' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l expose -d 'Expose a port or a range of ports (e.g. --expose=3300-3310) from the container without publishing it to your host' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l group-add -d 'Add additional groups to run as' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s h -l hostname -d 'Container host name' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s i -l interactive -d 'Keep STDIN open even if not attached' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l ipc -d 'Default is to create a private IPC namespace (POSIX SysV IPC) for the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l link -d 'Add link to another container in the form of :alias' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s m -l memory -d 'Memory limit (format: [], where unit = b, k, m or g)' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l mac-address -d 'Container MAC address (e.g. 92:d0:c6:0a:29:33)' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l memory-swap -d "Total memory usage (memory + swap), set '-1' to disable swap (format: [], where unit = b, k, m or g)" -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l name -d 'Assign a name to the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l net -d 'Set the Network mode for the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s P -l publish-all -d 'Publish all exposed ports to random ports on the host interfaces' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s p -l publish -d "Publish a container's port to the host" -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l pid -d 'Default is to create a private PID namespace for the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l privileged -d 'Give extended privileges to this container' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l read-only -d "Mount the container's root filesystem as read only" -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l restart -d 'Restart policy to apply when a container exits (no, on-failure[:max-retry], always)' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l rm -d 'Automatically remove the container when it exits (incompatible with -d)' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l security-opt -d 'Security Options' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l sig-proxy -d 'Proxy received signals to the process (non-TTY mode only). SIGCHLD, SIGSTOP, and SIGKILL are not proxied.' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l stop-signal -d 'Signal to kill a container' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s t -l tty -d 'Allocate a pseudo-TTY' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s u -l user -d 'Username or UID' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l tmpfs -d 'Mount tmpfs on a directory' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s v -l volume -d 'Bind mount a volume (e.g., from the host: -v /host:/container, from Docker: -v /container)' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l volumes-from -d 'Mount volumes from the specified container(s)' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s w -l workdir -d 'Working directory inside the container' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -a '(__fish_print_docker_images)' -d "Image" - -# save -complete -c docker -f -n '__fish_docker_no_subcommand' -a save -d 'Save an image to a tar archive' -complete -c docker -A -f -n '__fish_seen_subcommand_from save' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from save' -s o -l output -d 'Write to an file, instead of STDOUT' -complete -c docker -A -f -n '__fish_seen_subcommand_from save' -a '(__fish_print_docker_images)' -d "Image" - -# search -complete -c docker -f -n '__fish_docker_no_subcommand' -a search -d 'Search for an image on the registry (defaults to the Docker Hub)' -complete -c docker -A -f -n '__fish_seen_subcommand_from search' -l automated -d 'Only show automated builds' -complete -c docker -A -f -n '__fish_seen_subcommand_from search' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from search' -l no-trunc -d "Don't truncate output" -complete -c docker -A -f -n '__fish_seen_subcommand_from search' -s s -l stars -d 'Only displays with at least x stars' - -# start -complete -c docker -f -n '__fish_docker_no_subcommand' -a start -d 'Start a container' -complete -c docker -A -f -n '__fish_seen_subcommand_from start' -s a -l attach -d "Attach container's STDOUT and STDERR and forward all signals to the process" -complete -c docker -A -f -n '__fish_seen_subcommand_from start' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from start' -s i -l interactive -d "Attach container's STDIN" -complete -c docker -A -f -n '__fish_seen_subcommand_from start' -a '(__fish_print_docker_containers stopped)' -d "Container" - -# stats -complete -c docker -f -n '__fish_docker_no_subcommand' -a stats -d "Display a live stream of one or more containers' resource usage statistics" -complete -c docker -A -f -n '__fish_seen_subcommand_from stats' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from stats' -l no-stream -d 'Disable streaming stats and only pull the first result' -complete -c docker -A -f -n '__fish_seen_subcommand_from stats' -a '(__fish_print_docker_containers running)' -d "Container" - -# stop -complete -c docker -f -n '__fish_docker_no_subcommand' -a stop -d 'Stop a container' -complete -c docker -A -f -n '__fish_seen_subcommand_from stop' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from stop' -s t -l time -d 'Number of seconds to wait for the container to stop before killing it. Default is 10 seconds.' -complete -c docker -A -f -n '__fish_seen_subcommand_from stop' -a '(__fish_print_docker_containers running)' -d "Container" - -# tag -complete -c docker -f -n '__fish_docker_no_subcommand' -a tag -d 'Tag an image into a repository' -complete -c docker -A -f -n '__fish_seen_subcommand_from tag' -s f -l force -d 'Force' -complete -c docker -A -f -n '__fish_seen_subcommand_from tag' -l help -d 'Print usage' - -# top -complete -c docker -f -n '__fish_docker_no_subcommand' -a top -d 'Lookup the running processes of a container' -complete -c docker -A -f -n '__fish_seen_subcommand_from top' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from top' -a '(__fish_print_docker_containers running)' -d "Container" - -# unpause -complete -c docker -f -n '__fish_docker_no_subcommand' -a unpause -d 'Unpause a paused container' -complete -c docker -A -f -n '__fish_seen_subcommand_from unpause' -a '(__fish_print_docker_containers running)' -d "Container" - -# version -complete -c docker -f -n '__fish_docker_no_subcommand' -a version -d 'Show the Docker version information' -complete -c docker -A -f -n '__fish_seen_subcommand_from version' -s f -l format -d 'Format the output using the given go template' -complete -c docker -A -f -n '__fish_seen_subcommand_from version' -l help -d 'Print usage' - -# wait -complete -c docker -f -n '__fish_docker_no_subcommand' -a wait -d 'Block until a container stops, then print its exit code' -complete -c docker -A -f -n '__fish_seen_subcommand_from wait' -l help -d 'Print usage' -complete -c docker -A -f -n '__fish_seen_subcommand_from wait' -a '(__fish_print_docker_containers running)' -d "Container" diff --git a/vendor/github.com/docker/docker/contrib/completion/powershell/readme.txt b/vendor/github.com/docker/docker/contrib/completion/powershell/readme.txt deleted file mode 100644 index 18e1b53c1..000000000 --- a/vendor/github.com/docker/docker/contrib/completion/powershell/readme.txt +++ /dev/null @@ -1 +0,0 @@ -See https://github.com/samneirinck/posh-docker \ No newline at end of file diff --git a/vendor/github.com/docker/docker/contrib/completion/zsh/REVIEWERS b/vendor/github.com/docker/docker/contrib/completion/zsh/REVIEWERS deleted file mode 100644 index 03ee2dde3..000000000 --- a/vendor/github.com/docker/docker/contrib/completion/zsh/REVIEWERS +++ /dev/null @@ -1,2 +0,0 @@ -Tianon Gravi (@tianon) -Jessie Frazelle (@jfrazelle) diff --git a/vendor/github.com/docker/docker/contrib/completion/zsh/_docker b/vendor/github.com/docker/docker/contrib/completion/zsh/_docker deleted file mode 100644 index ecae826a4..000000000 --- a/vendor/github.com/docker/docker/contrib/completion/zsh/_docker +++ /dev/null @@ -1,2787 +0,0 @@ -#compdef docker dockerd -# -# zsh completion for docker (http://docker.com) -# -# version: 0.3.0 -# github: https://github.com/felixr/docker-zsh-completion -# -# contributors: -# - Felix Riedel -# - Steve Durrheimer -# - Vincent Bernat -# -# license: -# -# Copyright (c) 2013, Felix Riedel -# 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 the 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 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. -# - -# Short-option stacking can be enabled with: -# zstyle ':completion:*:*:docker:*' option-stacking yes -# zstyle ':completion:*:*:docker-*:*' option-stacking yes -__docker_arguments() { - if zstyle -t ":completion:${curcontext}:" option-stacking; then - print -- -s - fi -} - -__docker_get_containers() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local kind type line s - declare -a running stopped lines args names - - kind=$1; shift - type=$1; shift - [[ $kind = (stopped|all) ]] && args=($args -a) - - lines=(${(f)${:-"$(_call_program commands docker $docker_options ps --format 'table' --no-trunc $args)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 # Last column, should go to the end of the line - lines=(${lines[2,-1]}) - - # Container ID - if [[ $type = (ids|all) ]]; then - for line in $lines; do - s="${${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}[0,12]}" - s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" - s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}" - if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = Exit* ]]; then - stopped=($stopped $s) - else - running=($running $s) - fi - done - fi - - # Names: we only display the one without slash. All other names - # are generated and may clutter the completion. However, with - # Swarm, all names may be prefixed by the swarm node name. - if [[ $type = (names|all) ]]; then - for line in $lines; do - names=(${(ps:,:)${${line[${begin[NAMES]},${end[NAMES]}]}%% *}}) - # First step: find a common prefix and strip it (swarm node case) - (( ${#${(u)names%%/*}} == 1 )) && names=${names#${names[1]%%/*}/} - # Second step: only keep the first name without a / - s=${${names:#*/*}[1]} - # If no name, well give up. - (( $#s != 0 )) || continue - s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" - s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}" - if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = Exit* ]]; then - stopped=($stopped $s) - else - running=($running $s) - fi - done - fi - - [[ $kind = (running|all) ]] && _describe -t containers-running "running containers" running "$@" && ret=0 - [[ $kind = (stopped|all) ]] && _describe -t containers-stopped "stopped containers" stopped "$@" && ret=0 - return ret -} - -__docker_complete_stopped_containers() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_containers stopped all "$@" -} - -__docker_complete_running_containers() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_containers running all "$@" -} - -__docker_complete_containers() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_containers all all "$@" -} - -__docker_complete_containers_ids() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_containers all ids "$@" -} - -__docker_complete_containers_names() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_containers all names "$@" -} - -__docker_complete_info_plugins() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - emulate -L zsh - setopt extendedglob - local -a plugins - plugins=(${(ps: :)${(M)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Plugins:}%%$'\n'^ *}}:# $1: *}## $1: }) - _describe -t plugins "$1 plugins" plugins && ret=0 - return ret -} - -__docker_complete_images() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a images - images=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/(#b)([^ ]##) ##([^ ]##) ##([^ ]##)*/${match[3]}:${(r:15:: :::)match[2]} in ${match[1]}}) - _describe -t docker-images "images" images && ret=0 - __docker_complete_repositories_with_tags && ret=0 - return ret -} - -__docker_complete_repositories() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a repos - repos=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}%% *}[2,-1]}) - repos=(${repos#}) - _describe -t docker-repos "repositories" repos && ret=0 - return ret -} - -__docker_complete_repositories_with_tags() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a repos onlyrepos matched - declare m - repos=(${${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/ ##/:::}%% *}) - repos=(${${repos%:::}#}) - # Check if we have a prefix-match for the current prefix. - onlyrepos=(${repos%::*}) - for m in $onlyrepos; do - [[ ${PREFIX##${~~m}} != ${PREFIX} ]] && { - # Yes, complete with tags - repos=(${${repos/:::/:}/:/\\:}) - _describe -t docker-repos-with-tags "repositories with tags" repos && ret=0 - return ret - } - done - # No, only complete repositories - onlyrepos=(${${repos%:::*}/:/\\:}) - _describe -t docker-repos "repositories" onlyrepos -qS : && ret=0 - - return ret -} - -__docker_search() { - [[ $PREFIX = -* ]] && return 1 - local cache_policy - zstyle -s ":completion:${curcontext}:" cache-policy cache_policy - if [[ -z "$cache_policy" ]]; then - zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy - fi - - local searchterm cachename - searchterm="${words[$CURRENT]%/}" - cachename=_docker-search-$searchterm - - local expl - local -a result - if ( [[ ${(P)+cachename} -eq 0 ]] || _cache_invalid ${cachename#_} ) \ - && ! _retrieve_cache ${cachename#_}; then - _message "Searching for ${searchterm}..." - result=(${${${(f)${:-"$(_call_program commands docker $docker_options search $searchterm)"$'\n'}}%% *}[2,-1]}) - _store_cache ${cachename#_} result - fi - _wanted dockersearch expl 'available images' compadd -a result -} - -__docker_get_log_options() { - [[ $PREFIX = -* ]] && return 1 - - integer ret=1 - local log_driver=${opt_args[--log-driver]:-"all"} - local -a awslogs_options fluentd_options gelf_options journald_options json_file_options logentries_options syslog_options splunk_options - - awslogs_options=("awslogs-region" "awslogs-group" "awslogs-stream") - fluentd_options=("env" "fluentd-address" "fluentd-async-connect" "fluentd-buffer-limit" "fluentd-retry-wait" "fluentd-max-retries" "labels" "tag") - gcplogs_options=("env" "gcp-log-cmd" "gcp-project" "labels") - gelf_options=("env" "gelf-address" "gelf-compression-level" "gelf-compression-type" "labels" "tag") - journald_options=("env" "labels" "tag") - json_file_options=("env" "labels" "max-file" "max-size") - logentries_options=("logentries-token") - syslog_options=("env" "labels" "syslog-address" "syslog-facility" "syslog-format" "syslog-tls-ca-cert" "syslog-tls-cert" "syslog-tls-key" "syslog-tls-skip-verify" "tag") - splunk_options=("env" "labels" "splunk-caname" "splunk-capath" "splunk-format" "splunk-gzip" "splunk-gzip-level" "splunk-index" "splunk-insecureskipverify" "splunk-source" "splunk-sourcetype" "splunk-token" "splunk-url" "splunk-verify-connection" "tag") - - [[ $log_driver = (awslogs|all) ]] && _describe -t awslogs-options "awslogs options" awslogs_options "$@" && ret=0 - [[ $log_driver = (fluentd|all) ]] && _describe -t fluentd-options "fluentd options" fluentd_options "$@" && ret=0 - [[ $log_driver = (gcplogs|all) ]] && _describe -t gcplogs-options "gcplogs options" gcplogs_options "$@" && ret=0 - [[ $log_driver = (gelf|all) ]] && _describe -t gelf-options "gelf options" gelf_options "$@" && ret=0 - [[ $log_driver = (journald|all) ]] && _describe -t journald-options "journald options" journald_options "$@" && ret=0 - [[ $log_driver = (json-file|all) ]] && _describe -t json-file-options "json-file options" json_file_options "$@" && ret=0 - [[ $log_driver = (logentries|all) ]] && _describe -t logentries-options "logentries options" logentries_options "$@" && ret=0 - [[ $log_driver = (syslog|all) ]] && _describe -t syslog-options "syslog options" syslog_options "$@" && ret=0 - [[ $log_driver = (splunk|all) ]] && _describe -t splunk-options "splunk options" splunk_options "$@" && ret=0 - - return ret -} - -__docker_complete_log_drivers() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - drivers=(awslogs etwlogs fluentd gcplogs gelf journald json-file none splunk syslog) - _describe -t log-drivers "log drivers" drivers && ret=0 - return ret -} - -__docker_complete_log_options() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (syslog-format) - syslog_format_opts=('rfc3164' 'rfc5424' 'rfc5424micro') - _describe -t syslog-format-opts "Syslog format Options" syslog_format_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - __docker_get_log_options -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_detach_keys() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - compset -P "*," - keys=(${:-{a-z}}) - ctrl_keys=(${:-ctrl-{{a-z},{@,'[','\\','^',']',_}}}) - _describe -t detach_keys "[a-z]" keys -qS "," && ret=0 - _describe -t detach_keys-ctrl "'ctrl-' + 'a-z @ [ \\\\ ] ^ _'" ctrl_keys -qS "," && ret=0 -} - -__docker_complete_pid() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local -a opts vopts - - opts=('host') - vopts=('container') - - if compset -P '*:'; then - case "${${words[-1]%:*}#*=}" in - (container) - __docker_complete_running_containers && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - _describe -t pid-value-opts "PID Options with value" vopts -qS ":" && ret=0 - _describe -t pid-opts "PID Options" opts && ret=0 - fi - - return ret -} - -__docker_complete_runtimes() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - emulate -L zsh - setopt extendedglob - local -a runtimes_opts - runtimes_opts=(${(ps: :)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Runtimes: }%%$'\n'^ *}}}) - _describe -t runtimes-opts "runtimes options" runtimes_opts && ret=0 -} - -__docker_complete_ps_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (ancestor) - __docker_complete_images && ret=0 - ;; - (before|since) - __docker_complete_containers && ret=0 - ;; - (health) - health_opts=('healthy' 'none' 'starting' 'unhealthy') - _describe -t health-filter-opts "health filter options" health_opts && ret=0 - ;; - (id) - __docker_complete_containers_ids && ret=0 - ;; - (is-task) - _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 - ;; - (name) - __docker_complete_containers_names && ret=0 - ;; - (network) - __docker_complete_networks && ret=0 - ;; - (status) - status_opts=('created' 'dead' 'exited' 'paused' 'restarting' 'running' 'removing') - _describe -t status-filter-opts "status filter options" status_opts && ret=0 - ;; - (volume) - __docker_complete_volumes && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('ancestor' 'before' 'exited' 'health' 'id' 'label' 'name' 'network' 'since' 'status' 'volume') - _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_search_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a boolean_opts opts - - boolean_opts=('true' 'false') - opts=('is-automated' 'is-official' 'stars') - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (is-automated|is-official) - _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_images_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a boolean_opts opts - - boolean_opts=('true' 'false') - opts=('before' 'dangling' 'label' 'reference' 'since') - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (before|reference|since) - __docker_complete_images && ret=0 - ;; - (dangling) - _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_events_filter() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a opts - - opts=('container' 'daemon' 'event' 'image' 'label' 'network' 'type' 'volume') - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (container) - __docker_complete_containers && ret=0 - ;; - (daemon) - emulate -L zsh - setopt extendedglob - local -a daemon_opts - daemon_opts=( - ${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Name: }%%$'\n'^ *}} - ${${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'ID: }%%$'\n'^ *}}//:/\\:} - ) - _describe -t daemon-filter-opts "daemon filter options" daemon_opts && ret=0 - ;; - (event) - local -a event_opts - event_opts=('attach' 'commit' 'connect' 'copy' 'create' 'delete' 'destroy' 'detach' 'die' 'disconnect' 'exec_create' 'exec_detach' - 'exec_start' 'export' 'health_status' 'import' 'kill' 'load' 'mount' 'oom' 'pause' 'pull' 'push' 'reload' 'rename' 'resize' 'restart' 'save' 'start' - 'stop' 'tag' 'top' 'unmount' 'unpause' 'untag' 'update') - _describe -t event-filter-opts "event filter options" event_opts && ret=0 - ;; - (image) - __docker_complete_images && ret=0 - ;; - (network) - __docker_complete_networks && ret=0 - ;; - (type) - local -a type_opts - type_opts=('container' 'daemon' 'image' 'network' 'volume') - _describe -t type-filter-opts "type filter options" type_opts && ret=0 - ;; - (volume) - __docker_complete_volumes && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_prune_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a opts - - opts=('until') - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - *) - _message 'value' && ret=0 - ;; - esac - else - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -# BO container - -__docker_container_commands() { - local -a _docker_container_subcommands - _docker_container_subcommands=( - "attach:Attach to a running container" - "commit:Create a new image from a container's changes" - "cp:Copy files/folders between a container and the local filesystem" - "create:Create a new container" - "diff:Inspect changes on a container's filesystem" - "exec:Run a command in a running container" - "export:Export a container's filesystem as a tar archive" - "inspect:Display detailed information on one or more containers" - "kill:Kill one or more running containers" - "logs:Fetch the logs of a container" - "ls:List containers" - "pause:Pause all processes within one or more containers" - "port:List port mappings or a specific mapping for the container" - "prune:Remove all stopped containers" - "rename:Rename a container" - "restart:Restart one or more containers" - "rm:Remove one or more containers" - "run:Run a command in a new container" - "start:Start one or more stopped containers" - "stats:Display a live stream of container(s) resource usage statistics" - "stop:Stop one or more running containers" - "top:Display the running processes of a container" - "unpause:Unpause all processes within one or more containers" - "update:Update configuration of one or more containers" - "wait:Block until one or more containers stop, then print their exit codes" - ) - _describe -t docker-container-commands "docker container command" _docker_container_subcommands -} - -__docker_container_subcommand() { - local -a _command_args opts_help opts_attach_exec_run_start opts_create_run opts_create_run_update - local expl help="--help" - integer ret=1 - - opts_attach_exec_run_start=( - "($help)--detach-keys=[Escape key sequence used to detach a container]:sequence:__docker_complete_detach_keys" - ) - opts_create_run=( - "($help -a --attach)"{-a=,--attach=}"[Attach to stdin, stdout or stderr]:device:(STDIN STDOUT STDERR)" - "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: " - "($help)*--blkio-weight-device=[Block IO (relative device weight)]:device:Block IO weight: " - "($help)*--cap-add=[Add Linux capabilities]:capability: " - "($help)*--cap-drop=[Drop Linux capabilities]:capability: " - "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " - "($help)--cidfile=[Write the container ID to the file]:CID file:_files" - "($help)--cpus=[Number of CPUs (default 0.000)]:cpus: " - "($help)*--device=[Add a host device to the container]:device:_files" - "($help)*--device-read-bps=[Limit the read rate (bytes per second) from a device]:device:IO rate: " - "($help)*--device-read-iops=[Limit the read rate (IO per second) from a device]:device:IO rate: " - "($help)*--device-write-bps=[Limit the write rate (bytes per second) to a device]:device:IO rate: " - "($help)*--device-write-iops=[Limit the write rate (IO per second) to a device]:device:IO rate: " - "($help)--disable-content-trust[Skip image verification]" - "($help)*--dns=[Custom DNS servers]:DNS server: " - "($help)*--dns-option=[Custom DNS options]:DNS option: " - "($help)*--dns-search=[Custom DNS search domains]:DNS domains: " - "($help)*"{-e=,--env=}"[Environment variables]:environment variable: " - "($help)--entrypoint=[Overwrite the default entrypoint of the image]:entry point: " - "($help)*--env-file=[Read environment variables from a file]:environment file:_files" - "($help)*--expose=[Expose a port from the container without publishing it]: " - "($help)*--group=[Set one or more supplementary user groups for the container]:group:_groups" - "($help -h --hostname)"{-h=,--hostname=}"[Container host name]:hostname:_hosts" - "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" - "($help)--init[Run an init inside the container that forwards signals and reaps processes]" - "($help)--ip=[Container IPv4 address]:IPv4: " - "($help)--ip6=[Container IPv6 address]:IPv6: " - "($help)--ipc=[IPC namespace to use]:IPC namespace: " - "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" - "($help)*--link=[Add link to another container]:link:->link" - "($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " - "($help)*"{-l=,--label=}"[Container metadata]:label: " - "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" - "($help)*--log-opt=[Log driver specific options]:log driver options:__docker_complete_log_options" - "($help)--mac-address=[Container MAC address]:MAC address: " - "($help)--name=[Container name]:name: " - "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" - "($help)*--network-alias=[Add network-scoped alias for the container]:alias: " - "($help)--oom-kill-disable[Disable OOM Killer]" - "($help)--oom-score-adj[Tune the host's OOM preferences for containers (accepts -1000 to 1000)]" - "($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]" - "($help -P --publish-all)"{-P,--publish-all}"[Publish all exposed ports]" - "($help)*"{-p=,--publish=}"[Expose a container's port to the host]:port:_ports" - "($help)--pid=[PID namespace to use]:PID namespace:__docker_complete_pid" - "($help)--privileged[Give extended privileges to this container]" - "($help)--read-only[Mount the container's root filesystem as read only]" - "($help)*--security-opt=[Security options]:security option: " - "($help)*--shm-size=[Size of '/dev/shm' (format is '')]:shm size: " - "($help)--stop-timeout=[Timeout (in seconds) to stop a container]:time: " - "($help)*--sysctl=-[sysctl options]:sysctl: " - "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" - "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" - "($help)*--ulimit=[ulimit options]:ulimit: " - "($help)--userns=[Container user namespace]:user namespace:(host)" - "($help)--tmpfs[mount tmpfs]" - "($help)*-v[Bind mount a volume]:volume: " - "($help)--volume-driver=[Optional volume driver for the container]:volume driver:(local)" - "($help)*--volumes-from=[Mount volumes from the specified container]:volume: " - "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" - ) - opts_create_run_update=( - "($help)--blkio-weight=[Block IO (relative weight), between 10 and 1000]:Block IO weight:(10 100 500 1000)" - "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" - "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " - "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " - "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " - "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " - "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " - "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " - "($help)--kernel-memory=[Kernel memory limit in bytes]:Memory limit: " - "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " - "($help)--memory-reservation=[Memory soft limit]:Memory limit: " - "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " - "($help)--restart=[Restart policy]:restart policy:(no on-failure always unless-stopped)" - ) - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (attach) - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_attach_exec_run_start \ - "($help)--no-stdin[Do not attach stdin]" \ - "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \ - "($help -):containers:__docker_complete_running_containers" && ret=0 - ;; - (commit) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --author)"{-a=,--author=}"[Author]:author: " \ - "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \ - "($help -m --message)"{-m=,--message=}"[Commit message]:message: " \ - "($help -p --pause)"{-p,--pause}"[Pause container during commit]" \ - "($help -):container:__docker_complete_containers" \ - "($help -): :__docker_complete_repositories_with_tags" && ret=0 - ;; - (cp) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -L --follow-link)"{-L,--follow-link}"[Always follow symbol link]" \ - "($help -)1:container:->container" \ - "($help -)2:hostpath:_files" && ret=0 - case $state in - (container) - if compset -P "*:"; then - _files && ret=0 - else - __docker_complete_containers -qS ":" && ret=0 - fi - ;; - esac - ;; - (create) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_create_run \ - $opts_create_run_update \ - "($help -): :__docker_complete_images" \ - "($help -):command: _command_names -e" \ - "($help -)*::arguments: _normal" && ret=0 - case $state in - (link) - if compset -P "*:"; then - _wanted alias expl "Alias" compadd -E "" && ret=0 - else - __docker_complete_running_containers -qS ":" && ret=0 - fi - ;; - esac - ;; - (diff) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:containers:__docker_complete_containers" && ret=0 - ;; - (exec) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_attach_exec_run_start \ - "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \ - "($help)*"{-e=,--env=}"[Set environment variables]:environment variable: " \ - "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" \ - "($help)--privileged[Give extended Linux capabilities to the command]" \ - "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" \ - "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" \ - "($help -):containers:__docker_complete_running_containers" \ - "($help -)*::command:->anycommand" && ret=0 - case $state in - (anycommand) - shift 1 words - (( CURRENT-- )) - _normal && ret=0 - ;; - esac - ;; - (export) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -o --output)"{-o=,--output=}"[Write to a file, instead of stdout]:output file:_files" \ - "($help -)*:containers:__docker_complete_containers" && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help -s --size)"{-s,--size}"[Display total file sizes]" \ - "($help -)*:containers:__docker_complete_containers" && ret=0 - ;; - (kill) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -s --signal)"{-s=,--signal=}"[Signal to send]:signal:_signals" \ - "($help -)*:containers:__docker_complete_running_containers" && ret=0 - ;; - (logs) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--details[Show extra details provided to logs]" \ - "($help -f --follow)"{-f,--follow}"[Follow log output]" \ - "($help -s --since)"{-s=,--since=}"[Show logs since this timestamp]:timestamp: " \ - "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \ - "($help)--tail=[Output the last K lines]:lines:(1 10 20 50 all)" \ - "($help -)*:containers:__docker_complete_containers" && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Show all containers]" \ - "($help)--before=[Show only container created before...]:containers:__docker_complete_containers" \ - "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_ps_filters" \ - "($help)--format=[Pretty-print containers using a Go template]:template: " \ - "($help -l --latest)"{-l,--latest}"[Show only the latest created container]" \ - "($help -n --last)"{-n=,--last=}"[Show n last created containers (includes all states)]:n:(1 5 10 25 50)" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -q --quiet)"{-q,--quiet}"[Only show numeric IDs]" \ - "($help -s --size)"{-s,--size}"[Display total file sizes]" \ - "($help)--since=[Show only containers created since...]:containers:__docker_complete_containers" && ret=0 - ;; - (pause|unpause) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:containers:__docker_complete_running_containers" && ret=0 - ;; - (port) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)1:containers:__docker_complete_running_containers" \ - "($help -)2:port:_ports" && ret=0 - ;; - (prune) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ - "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 - ;; - (rename) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -):old name:__docker_complete_containers" \ - "($help -):new name: " && ret=0 - ;; - (restart) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \ - "($help -)*:containers:__docker_complete_containers_ids" && ret=0 - ;; - (rm) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force removal]" \ - "($help -l --link)"{-l,--link}"[Remove the specified link and not the underlying container]" \ - "($help -v --volumes)"{-v,--volumes}"[Remove the volumes associated to the container]" \ - "($help -)*:containers:->values" && ret=0 - case $state in - (values) - if [[ ${words[(r)-f]} == -f || ${words[(r)--force]} == --force ]]; then - __docker_complete_containers && ret=0 - else - __docker_complete_stopped_containers && ret=0 - fi - ;; - esac - ;; - (run) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_create_run \ - $opts_create_run_update \ - $opts_attach_exec_run_start \ - "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \ - "($help)--health-cmd=[Command to run to check health]:command: " \ - "($help)--health-interval=[Time between running the check]:time: " \ - "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" \ - "($help)--health-timeout=[Maximum time to allow one check to run]:time: " \ - "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" \ - "($help)--rm[Remove intermediate containers when it exits]" \ - "($help)--runtime=[Name of the runtime to be used for that container]:runtime:__docker_complete_runtimes" \ - "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \ - "($help)--stop-signal=[Signal to kill a container]:signal:_signals" \ - "($help)--storage-opt=[Storage driver options for the container]:storage options:->storage-opt" \ - "($help -): :__docker_complete_images" \ - "($help -):command: _command_names -e" \ - "($help -)*::arguments: _normal" && ret=0 - case $state in - (link) - if compset -P "*:"; then - _wanted alias expl "Alias" compadd -E "" && ret=0 - else - __docker_complete_running_containers -qS ":" && ret=0 - fi - ;; - (storage-opt) - if compset -P "*="; then - _message "value" && ret=0 - else - opts=('size') - _describe -t filter-opts "storage options" opts -qS "=" && ret=0 - fi - ;; - esac - ;; - (start) - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_attach_exec_run_start \ - "($help -a --attach)"{-a,--attach}"[Attach container's stdout/stderr and forward all signals]" \ - "($help -i --interactive)"{-i,--interactive}"[Attach container's stding]" \ - "($help -)*:containers:__docker_complete_stopped_containers" && ret=0 - ;; - (stats) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Show all containers (default shows just running)]" \ - "($help)--format=[Pretty-print images using a Go template]:template: " \ - "($help)--no-stream[Disable streaming stats and only pull the first result]" \ - "($help -)*:containers:__docker_complete_running_containers" && ret=0 - ;; - (stop) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \ - "($help -)*:containers:__docker_complete_running_containers" && ret=0 - ;; - (top) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)1:containers:__docker_complete_running_containers" \ - "($help -)*:: :->ps-arguments" && ret=0 - case $state in - (ps-arguments) - _ps && ret=0 - ;; - esac - ;; - (update) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - opts_create_run_update \ - "($help -)*: :->values" && ret=0 - case $state in - (values) - if [[ ${words[(r)--kernel-memory*]} = (--kernel-memory*) ]]; then - __docker_complete_stopped_containers && ret=0 - else - __docker_complete_containers && ret=0 - fi - ;; - esac - ;; - (wait) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:containers:__docker_complete_running_containers" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0 - ;; - esac - - return ret -} - -# EO container - -# BO image - -__docker_image_commands() { - local -a _docker_image_subcommands - _docker_image_subcommands=( - "build:Build an image from a Dockerfile" - "history:Show the history of an image" - "import:Import the contents from a tarball to create a filesystem image" - "inspect:Display detailed information on one or more images" - "load:Load an image from a tar archive or STDIN" - "ls:List images" - "prune:Remove unused images" - "pull:Pull an image or a repository from a registry" - "push:Push an image or a repository to a registry" - "rm:Remove one or more images" - "save:Save one or more images to a tar archive (streamed to STDOUT by default)" - "tag:Tag an image into a repository" - ) - _describe -t docker-image-commands "docker image command" _docker_image_subcommands -} - -__docker_image_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (build) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*--build-arg=[Build-time variables]:=: " \ - "($help)*--cache-from=[Images to consider as cache sources]: :__docker_complete_repositories_with_tags" \ - "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" \ - "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " \ - "($help)--compress[Compress the build context using gzip]" \ - "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " \ - "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " \ - "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " \ - "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " \ - "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " \ - "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " \ - "($help)--disable-content-trust[Skip image verification]" \ - "($help -f --file)"{-f=,--file=}"[Name of the Dockerfile]:Dockerfile:_files" \ - "($help)--force-rm[Always remove intermediate containers]" \ - "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" \ - "($help)*--label=[Set metadata for an image]:label=value: " \ - "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " \ - "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " \ - "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" \ - "($help)--no-cache[Do not use cache when building the image]" \ - "($help)--pull[Attempt to pull a newer version of the image]" \ - "($help -q --quiet)"{-q,--quiet}"[Suppress verbose build output]" \ - "($help)--rm[Remove intermediate containers after a successful build]" \ - "($help)*--shm-size=[Size of '/dev/shm' (format is '')]:shm size: " \ - "($help -t --tag)*"{-t=,--tag=}"[Repository, name and tag for the image]: :__docker_complete_repositories_with_tags" \ - "($help)*--ulimit=[ulimit options]:ulimit: " \ - "($help)--userns=[Container user namespace]:user namespace:(host)" \ - "($help -):path or URL:_directories" && ret=0 - ;; - (history) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -H --human)"{-H,--human}"[Print sizes and dates in human readable format]" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -q --quiet)"{-q,--quiet}"[Only show numeric IDs]" \ - "($help -)*: :__docker_complete_images" && ret=0 - ;; - (import) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \ - "($help -m --message)"{-m=,--message=}"[Commit message for imported image]:message: " \ - "($help -):URL:(- http:// file://)" \ - "($help -): :__docker_complete_repositories_with_tags" && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help -)*:images:__docker_complete_images" && ret=0 - ;; - (load) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -i --input)"{-i=,--input=}"[Read from tar archive file]:archive file:_files -g \"*.((tar|TAR)(.gz|.GZ|.Z|.bz2|.lzma|.xz|)|(tbz|tgz|txz))(-.)\"" \ - "($help -q --quiet)"{-q,--quiet}"[Suppress the load output]" && ret=0 - ;; - (ls|list) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Show all images]" \ - "($help)--digests[Show digests]" \ - "($help)*"{-f=,--filter=}"[Filter values]:filter:->filter-options" \ - "($help)--format=[Pretty-print images using a Go template]:template: " \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -q --quiet)"{-q,--quiet}"[Only show numeric IDs]" \ - "($help -): :__docker_complete_repositories" && ret=0 - case $state in - (filter-options) - __docker_complete_images_filters && ret=0 - ;; - esac - ;; - (prune) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Remove all unused images, not just dangling ones]" \ - "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ - "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 - ;; - (pull) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all-tags)"{-a,--all-tags}"[Download all tagged images]" \ - "($help)--disable-content-trust[Skip image verification]" \ - "($help -):name:__docker_search" && ret=0 - ;; - (push) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--disable-content-trust[Skip image signing]" \ - "($help -): :__docker_complete_images" && ret=0 - ;; - (rm) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force removal]" \ - "($help)--no-prune[Do not delete untagged parents]" \ - "($help -)*: :__docker_complete_images" && ret=0 - ;; - (save) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -o --output)"{-o=,--output=}"[Write to file]:file:_files" \ - "($help -)*: :__docker_complete_images" && ret=0 - ;; - (tag) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -):source:__docker_complete_images"\ - "($help -):destination:__docker_complete_repositories_with_tags" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0 - ;; - esac - - return ret -} - -# EO image - -# BO network - -__docker_network_complete_ls_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (driver) - __docker_complete_info_plugins Network && ret=0 - ;; - (id) - __docker_complete_networks_ids && ret=0 - ;; - (name) - __docker_complete_networks_names && ret=0 - ;; - (type) - type_opts=('builtin' 'custom') - _describe -t type-filter-opts "Type Filter Options" type_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('driver' 'id' 'label' 'name' 'type') - _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_get_networks() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines networks - - type=$1; shift - - lines=(${(f)${:-"$(_call_program commands docker $docker_options network ls)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Network ID - if [[ $type = (ids|all) ]]; then - for line in $lines; do - s="${line[${begin[NETWORK ID]},${end[NETWORK ID]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" - s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}" - networks=($networks $s) - done - fi - - # Names - if [[ $type = (names|all) ]]; then - for line in $lines; do - s="${line[${begin[NAME]},${end[NAME]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" - s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}" - networks=($networks $s) - done - fi - - _describe -t networks-list "networks" networks "$@" && ret=0 - return ret -} - -__docker_complete_networks() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_networks all "$@" -} - -__docker_complete_networks_ids() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_networks ids "$@" -} - -__docker_complete_networks_names() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_networks names "$@" -} - -__docker_network_commands() { - local -a _docker_network_subcommands - _docker_network_subcommands=( - "connect:Connect a container to a network" - "create:Creates a new network with a name specified by the user" - "disconnect:Disconnects a container from a network" - "inspect:Displays detailed information on a network" - "ls:Lists all the networks created by the user" - "prune:Remove all unused networks" - "rm:Deletes one or more networks" - ) - _describe -t docker-network-commands "docker network command" _docker_network_subcommands -} - -__docker_network_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (connect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*--alias=[Add network-scoped alias for the container]:alias: " \ - "($help)--ip=[Container IPv4 address]:IPv4: " \ - "($help)--ip6=[Container IPv6 address]:IPv6: " \ - "($help)*--link=[Add a link to another container]:link:->link" \ - "($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " \ - "($help -)1:network:__docker_complete_networks" \ - "($help -)2:containers:__docker_complete_containers" && ret=0 - - case $state in - (link) - if compset -P "*:"; then - _wanted alias expl "Alias" compadd -E "" && ret=0 - else - __docker_complete_running_containers -qS ":" && ret=0 - fi - ;; - esac - ;; - (create) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help)--attachable[Enable manual container attachment]" \ - "($help)*--aux-address[Auxiliary IPv4 or IPv6 addresses used by network driver]:key=IP: " \ - "($help -d --driver)"{-d=,--driver=}"[Driver to manage the Network]:driver:(null host bridge overlay)" \ - "($help)*--gateway=[IPv4 or IPv6 Gateway for the master subnet]:IP: " \ - "($help)--internal[Restricts external access to the network]" \ - "($help)*--ip-range=[Allocate container ip from a sub-range]:IP/mask: " \ - "($help)--ipam-driver=[IP Address Management Driver]:driver:(default)" \ - "($help)*--ipam-opt=[Custom IPAM plugin options]:opt=value: " \ - "($help)--ipv6[Enable IPv6 networking]" \ - "($help)*--label=[Set metadata on a network]:label=value: " \ - "($help)*"{-o=,--opt=}"[Driver specific options]:opt=value: " \ - "($help)*--subnet=[Subnet in CIDR format that represents a network segment]:IP/mask: " \ - "($help -)1:Network Name: " && ret=0 - ;; - (disconnect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)1:network:__docker_complete_networks" \ - "($help -)2:containers:__docker_complete_containers" && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help -)*:network:__docker_complete_networks" && ret=0 - ;; - (ls) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--no-trunc[Do not truncate the output]" \ - "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ - "($help)--format=[Pretty-print networks using a Go template]:template: " \ - "($help -q --quiet)"{-q,--quiet}"[Only display numeric IDs]" && ret=0 - case $state in - (filter-options) - __docker_network_complete_ls_filters && ret=0 - ;; - esac - ;; - (prune) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ - "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 - ;; - (rm) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:network:__docker_complete_networks" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 - ;; - esac - - return ret -} - -# EO network - -# BO node - -__docker_node_complete_ls_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (id) - __docker_complete_nodes_ids && ret=0 - ;; - (membership) - membership_opts=('accepted' 'pending' 'rejected') - _describe -t membership-opts "membership options" membership_opts && ret=0 - ;; - (name) - __docker_complete_nodes_names && ret=0 - ;; - (role) - role_opts=('manager' 'worker') - _describe -t role-opts "role options" role_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('id' 'label' 'membership' 'name' 'role') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_node_complete_ps_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (desired-state) - state_opts=('accepted' 'running') - _describe -t state-opts "desired state options" state_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('desired-state' 'id' 'label' 'name') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_nodes() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines nodes args - - type=$1; shift - filter=$1; shift - [[ $filter != "none" ]] && args=("-f $filter") - - lines=(${(f)${:-"$(_call_program commands docker $docker_options node ls $args)"$'\n'}}) - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Node ID - if [[ $type = (ids|all) ]]; then - for line in $lines; do - s="${line[${begin[ID]},${end[ID]}]%% ##}" - nodes=($nodes $s) - done - fi - - # Names - if [[ $type = (names|all) ]]; then - for line in $lines; do - s="${line[${begin[NAME]},${end[NAME]}]%% ##}" - nodes=($nodes $s) - done - fi - - _describe -t nodes-list "nodes" nodes "$@" && ret=0 - return ret -} - -__docker_complete_nodes() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes all none "$@" -} - -__docker_complete_nodes_ids() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes ids none "$@" -} - -__docker_complete_nodes_names() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes names none "$@" -} - -__docker_complete_pending_nodes() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes all "membership=pending" "$@" -} - -__docker_complete_manager_nodes() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes all "role=manager" "$@" -} - -__docker_complete_worker_nodes() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes all "role=worker" "$@" -} - -__docker_node_commands() { - local -a _docker_node_subcommands - _docker_node_subcommands=( - "demote:Demote a node as manager in the swarm" - "inspect:Display detailed information on one or more nodes" - "ls:List nodes in the swarm" - "promote:Promote a node as manager in the swarm" - "rm:Remove one or more nodes from the swarm" - "ps:List tasks running on one or more nodes, defaults to current node" - "update:Update a node" - ) - _describe -t docker-node-commands "docker node command" _docker_node_subcommands -} - -__docker_node_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (rm|remove) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force remove a node from the swarm]" \ - "($help -)*:node:__docker_complete_pending_nodes" && ret=0 - ;; - (demote) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:node:__docker_complete_manager_nodes" && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help)--pretty[Print the information in a human friendly format]" \ - "($help -)*:node:__docker_complete_nodes" && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ - "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 - case $state in - (filter-options) - __docker_node_complete_ls_filters && ret=0 - ;; - esac - ;; - (promote) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:node:__docker_complete_worker_nodes" && ret=0 - ;; - (ps) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Display all instances]" \ - "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ - "($help)--no-resolve[Do not map IDs to Names]" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -)*:node:__docker_complete_nodes" && ret=0 - case $state in - (filter-options) - __docker_node_complete_ps_filters && ret=0 - ;; - esac - ;; - (update) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--availability=[Availability of the node]:availability:(active pause drain)" \ - "($help)*--label-add=[Add or update a node label]:key=value: " \ - "($help)*--label-rm=[Remove a node label if exists]:label: " \ - "($help)--role=[Role of the node]:role:(manager worker)" \ - "($help -)1:node:__docker_complete_nodes" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_node_commands" && ret=0 - ;; - esac - - return ret -} - -# EO node - -# BO plugin - -__docker_complete_plugins() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines plugins - - lines=(${(f)${:-"$(_call_program commands docker $docker_options plugin ls)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Name - for line in $lines; do - s="${line[${begin[NAME]},${end[NAME]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[TAG]},${end[TAG]}]}%% ##}}" - plugins=($plugins $s) - done - - _describe -t plugins-list "plugins" plugins "$@" && ret=0 - return ret -} - -__docker_plugin_commands() { - local -a _docker_plugin_subcommands - _docker_plugin_subcommands=( - "disable:Disable a plugin" - "enable:Enable a plugin" - "inspect:Return low-level information about a plugin" - "install:Install a plugin" - "ls:List plugins" - "push:Push a plugin" - "rm:Remove a plugin" - "set:Change settings for a plugin" - ) - _describe -t docker-plugin-commands "docker plugin command" _docker_plugin_subcommands -} - -__docker_plugin_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (disable|enable|inspect|ls|push|rm) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)1:plugin:__docker_complete_plugins" && ret=0 - ;; - (install) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--alias=[Local name for plugin]:alias: " \ - "($help -)1:plugin:__docker_complete_plugins" && ret=0 - ;; - (set) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)1:plugin:__docker_complete_plugins" \ - "($help-)*:key=value: " && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_plugin_commands" && ret=0 - ;; - esac - - return ret -} - -# EO plugin - -# BO secret - -__docker_secrets() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines secrets - - type=$1; shift - - lines=(${(f)${:-"$(_call_program commands docker $docker_options secret ls)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # ID - if [[ $type = (ids|all) ]]; then - for line in $lines; do - s="${line[${begin[ID]},${end[ID]}]%% ##}" - secrets=($secrets $s) - done - fi - - # Names - if [[ $type = (names|all) ]]; then - for line in $lines; do - s="${line[${begin[NAME]},${end[NAME]}]%% ##}" - secrets=($secrets $s) - done - fi - - _describe -t secrets-list "secrets" secrets "$@" && ret=0 - return ret -} - -__docker_complete_secrets() { - [[ $PREFIX = -* ]] && return 1 - __docker_secrets all "$@" -} - -__docker_secret_commands() { - local -a _docker_secret_subcommands - _docker_secret_subcommands=( - "create:Create a secret using stdin as content" - "inspect:Display detailed information on one or more secrets" - "ls:List secrets" - "rm:Remove one or more secrets" - ) - _describe -t docker-secret-commands "docker secret command" _docker_secret_subcommands -} - -__docker_secret_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (create) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help)*"{-l=,--label=}"[Secret labels]:label: " \ - "($help -):secret: " && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \ - "($help -)*:secret:__docker_complete_secrets" && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 - ;; - (rm|remove) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:secret:__docker_complete_secrets" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_secret_commands" && ret=0 - ;; - esac - - return ret -} - -# EO secret - -# BO service - -__docker_service_complete_ls_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (id) - __docker_complete_services_ids && ret=0 - ;; - (name) - __docker_complete_services_names && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('id' 'label' 'name') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_service_complete_ps_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (desired-state) - state_opts=('accepted' 'running') - _describe -t state-opts "desired state options" state_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('desired-state' 'id' 'label' 'name') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_services() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines services - - type=$1; shift - - lines=(${(f)${:-"$(_call_program commands docker $docker_options service ls)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Service ID - if [[ $type = (ids|all) ]]; then - for line in $lines; do - s="${line[${begin[ID]},${end[ID]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" - services=($services $s) - done - fi - - # Names - if [[ $type = (names|all) ]]; then - for line in $lines; do - s="${line[${begin[NAME]},${end[NAME]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" - services=($services $s) - done - fi - - _describe -t services-list "services" services "$@" && ret=0 - return ret -} - -__docker_complete_services() { - [[ $PREFIX = -* ]] && return 1 - __docker_services all "$@" -} - -__docker_complete_services_ids() { - [[ $PREFIX = -* ]] && return 1 - __docker_services ids "$@" -} - -__docker_complete_services_names() { - [[ $PREFIX = -* ]] && return 1 - __docker_services names "$@" -} - -__docker_service_commands() { - local -a _docker_service_subcommands - _docker_service_subcommands=( - "create:Create a new service" - "inspect:Display detailed information on one or more services" - "ls:List services" - "rm:Remove one or more services" - "scale:Scale one or multiple replicated services" - "ps:List the tasks of a service" - "update:Update a service" - ) - _describe -t docker-service-commands "docker service command" _docker_service_subcommands -} - -__docker_service_subcommand() { - local -a _command_args opts_help opts_create_update - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - opts_create_update=( - "($help)*--constraint=[Placement constraints]:constraint: " - "($help)--endpoint-mode=[Placement constraints]:mode:(dnsrr vip)" - "($help)*"{-e=,--env=}"[Set environment variables]:env: " - "($help)--health-cmd=[Command to run to check health]:command: " - "($help)--health-interval=[Time between running the check]:time: " - "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" - "($help)--health-timeout=[Maximum time to allow one check to run]:time: " - "($help)--hostname=[Service container hostname]:hostname: " \ - "($help)*--label=[Service labels]:label: " - "($help)--limit-cpu=[Limit CPUs]:value: " - "($help)--limit-memory=[Limit Memory]:value: " - "($help)--log-driver=[Logging driver for service]:logging driver:__docker_complete_log_drivers" - "($help)*--log-opt=[Logging driver options]:log driver options:__docker_complete_log_options" - "($help)*--mount=[Attach a filesystem mount to the service]:mount: " - "($help)*--network=[Network attachments]:network: " - "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" - "($help)*"{-p=,--publish=}"[Publish a port as a node port]:port: " - "($help)--replicas=[Number of tasks]:replicas: " - "($help)--reserve-cpu=[Reserve CPUs]:value: " - "($help)--reserve-memory=[Reserve Memory]:value: " - "($help)--restart-condition=[Restart when condition is met]:mode:(any none on-failure)" - "($help)--restart-delay=[Delay between restart attempts]:delay: " - "($help)--restart-max-attempts=[Maximum number of restarts before giving up]:max-attempts: " - "($help)--restart-window=[Window used to evaluate the restart policy]:window: " - "($help)*--secret=[Specify secrets to expose to the service]:secret:__docker_complete_secrets" - "($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: " - "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-TTY]" - "($help)--update-delay=[Delay between updates]:delay: " - "($help)--update-failure-action=[Action on update failure]:mode:(pause continue)" - "($help)--update-max-failure-ratio=[Failure rate to tolerate during an update]:fraction: " - "($help)--update-monitor=[Duration after each task update to monitor for failure]:window: " - "($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: " - "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" - "($help)--with-registry-auth[Send registry authentication details to swarm agents]" - "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" - ) - - case "$words[1]" in - (create) - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_create_update \ - "($help)*--container-label=[Container labels]:label: " \ - "($help)*--dns=[Set custom DNS servers]:DNS: " \ - "($help)*--dns-option=[Set DNS options]:DNS option: " \ - "($help)*--dns-search=[Set custom DNS search domains]:DNS search: " \ - "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \ - "($help)--mode=[Service Mode]:mode:(global replicated)" \ - "($help)--name=[Service name]:name: " \ - "($help)*--publish=[Publish a port]:port: " \ - "($help -): :__docker_complete_images" \ - "($help -):command: _command_names -e" \ - "($help -)*::arguments: _normal" && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help)--pretty[Print the information in a human friendly format]" \ - "($help -)*:service:__docker_complete_services" && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:->filter-options" \ - "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 - case $state in - (filter-options) - __docker_service_complete_ls_filters && ret=0 - ;; - esac - ;; - (rm|remove) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:service:__docker_complete_services" && ret=0 - ;; - (scale) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:service:->values" && ret=0 - case $state in - (values) - if compset -P '*='; then - _message 'replicas' && ret=0 - else - __docker_complete_services -qS "=" - fi - ;; - esac - ;; - (ps) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ - "($help)--no-resolve[Do not map IDs to Names]" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \ - "($help -)1:service:__docker_complete_services" && ret=0 - case $state in - (filter-options) - __docker_service_complete_ps_filters && ret=0 - ;; - esac - ;; - (update) - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_create_update \ - "($help)--arg=[Service command args]:arguments: _normal" \ - "($help)*--container-label-add=[Add or update container labels]:label: " \ - "($help)*--container-label-rm=[Remove a container label by its key]:label: " \ - "($help)*--dns-add=[Add or update custom DNS servers]:DNS: " \ - "($help)*--dns-rm=[Remove custom DNS servers]:DNS: " \ - "($help)*--dns-option-add=[Add or update DNS options]:DNS option: " \ - "($help)*--dns-option-rm=[Remove DNS options]:DNS option: " \ - "($help)*--dns-search-add=[Add or update custom DNS search domains]:DNS search: " \ - "($help)*--dns-search-rm=[Remove DNS search domains]:DNS search: " \ - "($help)--force[Force update]" \ - "($help)*--group-add=[Add additional supplementary user groups to the container]:group:_groups" \ - "($help)*--group-rm=[Remove previously added supplementary user groups from the container]:group:_groups" \ - "($help)--image=[Service image tag]:image:__docker_complete_repositories" \ - "($help)*--publish-add=[Add or update a port]:port: " \ - "($help)*--publish-rm=[Remove a port(target-port mandatory)]:port: " \ - "($help)--rollback[Rollback to previous specification]" \ - "($help -)1:service:__docker_complete_services" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_service_commands" && ret=0 - ;; - esac - - return ret -} - -# EO service - -# BO stack - -__docker_stack_complete_ps_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (desired-state) - state_opts=('accepted' 'running') - _describe -t state-opts "desired state options" state_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('desired-state' 'id' 'name') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_stack_complete_services_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('id' 'label' 'name') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_stacks() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines stacks - - lines=(${(f)${:-"$(_call_program commands docker $docker_options stack ls)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Service ID - for line in $lines; do - s="${line[${begin[ID]},${end[ID]}]%% ##}" - stacks=($stacks $s) - done - - _describe -t stacks-list "stacks" stacks "$@" && ret=0 - return ret -} - -__docker_complete_stacks() { - [[ $PREFIX = -* ]] && return 1 - __docker_stacks "$@" -} - -__docker_stack_commands() { - local -a _docker_stack_subcommands - _docker_stack_subcommands=( - "deploy:Deploy a new stack or update an existing stack" - "ls:List stacks" - "ps:List the tasks in the stack" - "rm:Remove the stack" - "services:List the services in the stack" - ) - _describe -t docker-stack-commands "docker stack command" _docker_stack_subcommands -} - -__docker_stack_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (deploy|up) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--bundle-file=[Path to a Distributed Application Bundle file]:dab:_files -g \"*.dab\"" \ - "($help -c --compose-file)"{-c=,--compose-file=}"[Path to a Compose file]:compose file:_files -g \"*.(yml|yaml)\"" \ - "($help)--with-registry-auth[Send registry authentication details to Swarm agents]" \ - "($help -):stack:__docker_complete_stacks" && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help && ret=0 - ;; - (ps) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Display all tasks]" \ - "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_ps_filters" \ - "($help)--no-resolve[Do not map IDs to Names]" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -):stack:__docker_complete_stacks" && ret=0 - ;; - (rm|remove|down) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -):stack:__docker_complete_stacks" && ret=0 - ;; - (services) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_services_filters" \ - "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \ - "($help -):stack:__docker_complete_stacks" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_stack_commands" && ret=0 - ;; - esac - - return ret -} - -# EO stack - -# BO swarm - -__docker_swarm_commands() { - local -a _docker_swarm_subcommands - _docker_swarm_subcommands=( - "init:Initialize a swarm" - "join:Join a swarm as a node and/or manager" - "join-token:Manage join tokens" - "leave:Leave a swarm" - "update:Update the swarm" - ) - _describe -t docker-swarm-commands "docker swarm command" _docker_swarm_subcommands -} - -__docker_swarm_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (init) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--advertise-addr[Advertised address]:ip\:port: " \ - "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ - "($help)--force-new-cluster[Force create a new cluster from current state]" \ - "($help)--listen-addr=[Listen address]:ip\:port: " \ - "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ - "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ - "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 - ;; - (join) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help)--advertise-addr=[Advertised address]:ip\:port: " \ - "($help)--availability=[Availability of the node]:availability:(active drain pause)" \ - "($help)--listen-addr=[Listen address]:ip\:port: " \ - "($help)--token=[Token for entry into the swarm]:secret: " \ - "($help -):host\:port: " && ret=0 - ;; - (join-token) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -q --quiet)"{-q,--quiet}"[Only display token]" \ - "($help)--rotate[Rotate join token]" \ - "($help -):role:(manager worker)" && ret=0 - ;; - (leave) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force this node to leave the swarm, ignoring warnings]" && ret=0 - ;; - (update) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--cert-expiry=[Validity period for node certificates]:duration: " \ - "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ - "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \ - "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ - "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ - "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 - ;; - esac - - return ret -} - -# EO swarm - -# BO system - -__docker_system_commands() { - local -a _docker_system_subcommands - _docker_system_subcommands=( - "df:Show docker filesystem usage" - "events:Get real time events from the server" - "info:Display system-wide information" - "prune:Remove unused data" - ) - _describe -t docker-system-commands "docker system command" _docker_system_subcommands -} - -__docker_system_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (df) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -v --verbose)"{-v,--verbose}"[Show detailed information on space usage]" && ret=0 - ;; - (events) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_events_filter" \ - "($help)--since=[Events created since this timestamp]:timestamp: " \ - "($help)--until=[Events created until this timestamp]:timestamp: " \ - "($help)--format=[Format the output using the given go template]:template: " && ret=0 - ;; - (info) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 - ;; - (prune) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Remove all unused data, not just dangling ones]" \ - "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ - "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 - ;; - esac - - return ret -} - -# EO system - -# BO volume - -__docker_volume_complete_ls_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (dangling) - dangling_opts=('true' 'false') - _describe -t dangling-filter-opts "Dangling Filter Options" dangling_opts && ret=0 - ;; - (driver) - __docker_complete_info_plugins Volume && ret=0 - ;; - (name) - __docker_complete_volumes && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('dangling' 'driver' 'label' 'name') - _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_volumes() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a lines volumes - - lines=(${(f)${:-"$(_call_program commands docker $docker_options volume ls)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Names - local line s - for line in $lines; do - s="${line[${begin[VOLUME NAME]},${end[VOLUME NAME]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" - volumes=($volumes $s) - done - - _describe -t volumes-list "volumes" volumes && ret=0 - return ret -} - -__docker_volume_commands() { - local -a _docker_volume_subcommands - _docker_volume_subcommands=( - "create:Create a volume" - "inspect:Display detailed information on one or more volumes" - "ls:List volumes" - "prune:Remove all unused volumes" - "rm:Remove one or more volumes" - ) - _describe -t docker-volume-commands "docker volume command" _docker_volume_subcommands -} - -__docker_volume_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (create) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help -d --driver)"{-d=,--driver=}"[Volume driver name]:Driver name:(local)" \ - "($help)*--label=[Set metadata for a volume]:label=value: " \ - "($help)*"{-o=,--opt=}"[Driver specific options]:Driver option: " \ - "($help -)1:Volume name: " && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help -)1:volume:__docker_complete_volumes" && ret=0 - ;; - (ls) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Provide filter values]:filter:->filter-options" \ - "($help)--format=[Pretty-print volumes using a Go template]:template: " \ - "($help -q --quiet)"{-q,--quiet}"[Only display volume names]" && ret=0 - case $state in - (filter-options) - __docker_volume_complete_ls_filters && ret=0 - ;; - esac - ;; - (prune) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 - ;; - (rm) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force the removal of one or more volumes]" \ - "($help -):volume:__docker_complete_volumes" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 - ;; - esac - - return ret -} - -# EO volume - -__docker_caching_policy() { - oldp=( "$1"(Nmh+1) ) # 1 hour - (( $#oldp )) -} - -__docker_commands() { - local cache_policy - - zstyle -s ":completion:${curcontext}:" cache-policy cache_policy - if [[ -z "$cache_policy" ]]; then - zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy - fi - - if ( [[ ${+_docker_subcommands} -eq 0 ]] || _cache_invalid docker_subcommands) \ - && ! _retrieve_cache docker_subcommands; - then - local -a lines - lines=(${(f)"$(_call_program commands docker 2>&1)"}) - _docker_subcommands=(${${${(M)${lines[$((${lines[(i)*Commands:]} + 1)),-1]}:# *}## #}/ ##/:}) - _docker_subcommands=($_docker_subcommands 'daemon:Enable daemon mode' 'help:Show help for a command') - (( $#_docker_subcommands > 2 )) && _store_cache docker_subcommands _docker_subcommands - fi - _describe -t docker-commands "docker command" _docker_subcommands -} - -__docker_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (attach|commit|cp|create|diff|exec|export|kill|logs|pause|unpause|port|rename|restart|rm|run|start|stats|stop|top|update|wait) - __docker_container_subcommand && ret=0 - ;; - (build|history|import|load|pull|push|save|tag) - __docker_image_subcommand && ret=0 - ;; - (container) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_container_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_container_subcommand && ret=0 - ;; - esac - ;; - (daemon) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*--add-runtime=[Register an additional OCI compatible runtime]:runtime:__docker_complete_runtimes" \ - "($help)--api-cors-header=[CORS headers in the Engine API]:CORS headers: " \ - "($help)*--authorization-plugin=[Authorization plugins to load]" \ - "($help -b --bridge)"{-b=,--bridge=}"[Attach containers to a network bridge]:bridge:_net_interfaces" \ - "($help)--bip=[Network bridge IP]:IP address: " \ - "($help)--cgroup-parent=[Parent cgroup for all containers]:cgroup: " \ - "($help)--cluster-advertise=[Address or interface name to advertise]:Instance to advertise (host\:port): " \ - "($help)--cluster-store=[URL of the distributed storage backend]:Cluster Store:->cluster-store" \ - "($help)*--cluster-store-opt=[Cluster store options]:Cluster options:->cluster-store-options" \ - "($help)--config-file=[Path to daemon configuration file]:Config File:_files" \ - "($help)--containerd=[Path to containerd socket]:socket:_files -g \"*.sock\"" \ - "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ - "($help)--default-gateway[Container default gateway IPv4 address]:IPv4 address: " \ - "($help)--default-gateway-v6[Container default gateway IPv6 address]:IPv6 address: " \ - "($help)*--default-ulimit=[Default ulimits for containers]:ulimit: " \ - "($help)--disable-legacy-registry[Disable contacting legacy registries]" \ - "($help)*--dns=[DNS server to use]:DNS: " \ - "($help)*--dns-opt=[DNS options to use]:DNS option: " \ - "($help)*--dns-search=[DNS search domains to use]:DNS search: " \ - "($help)*--exec-opt=[Runtime execution options]:runtime execution options: " \ - "($help)--exec-root=[Root directory for execution state files]:path:_directories" \ - "($help)--experimental[Enable experimental features]" \ - "($help)--fixed-cidr=[IPv4 subnet for fixed IPs]:IPv4 subnet: " \ - "($help)--fixed-cidr-v6=[IPv6 subnet for fixed IPs]:IPv6 subnet: " \ - "($help -G --group)"{-G=,--group=}"[Group for the unix socket]:group:_groups" \ - "($help -g --graph)"{-g=,--graph=}"[Root of the Docker runtime]:path:_directories" \ - "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ - "($help)--icc[Enable inter-container communication]" \ - "($help)--init[Run an init inside containers to forward signals and reap processes]" \ - "($help)--init-path=[Path to the docker-init binary]:docker-init binary:_files" \ - "($help)*--insecure-registry=[Enable insecure registry communication]:registry: " \ - "($help)--ip=[Default IP when binding container ports]" \ - "($help)--ip-forward[Enable net.ipv4.ip_forward]" \ - "($help)--ip-masq[Enable IP masquerading]" \ - "($help)--iptables[Enable addition of iptables rules]" \ - "($help)--ipv6[Enable IPv6 networking]" \ - "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ - "($help)*--label=[Key=value labels]:label: " \ - "($help)--live-restore[Enable live restore of docker when containers are still running]" \ - "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" \ - "($help)*--log-opt=[Default log driver options for containers]:log driver options:__docker_complete_log_options" \ - "($help)--max-concurrent-downloads[Set the max concurrent downloads for each pull]" \ - "($help)--max-concurrent-uploads[Set the max concurrent uploads for each push]" \ - "($help)--mtu=[Network MTU]:mtu:(0 576 1420 1500 9000)" \ - "($help)--oom-score-adjust=[Set the oom_score_adj for the daemon]:oom-score:(-500)" \ - "($help -p --pidfile)"{-p=,--pidfile=}"[Path to use for daemon PID file]:PID file:_files" \ - "($help)--raw-logs[Full timestamps without ANSI coloring]" \ - "($help)*--registry-mirror=[Preferred Docker registry mirror]:registry mirror: " \ - "($help)--seccomp-profile=[Path to seccomp profile]:path:_files -g \"*.json\"" \ - "($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(aufs btrfs devicemapper overlay overlay2 vfs zfs)" \ - "($help)--selinux-enabled[Enable selinux support]" \ - "($help)--shutdown-timeout=[Set the shutdown timeout value in seconds]:time: " \ - "($help)*--storage-opt=[Storage driver options]:storage driver options: " \ - "($help)--tls[Use TLS]" \ - "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g \"*.(pem|crt)\"" \ - "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g \"*.(pem|crt)\"" \ - "($help)--tlskey=[Path to TLS key file]:Key file:_files -g \"*.(pem|key)\"" \ - "($help)--tlsverify[Use TLS and verify the remote]" \ - "($help)--userns-remap=[User/Group setting for user namespaces]:user\:group:->users-groups" \ - "($help)--userland-proxy[Use userland proxy for loopback traffic]" \ - "($help)--userland-proxy-path=[Path to the userland proxy binary]:binary:_files" && ret=0 - - case $state in - (cluster-store) - if compset -P '*://'; then - _message 'host:port' && ret=0 - else - store=('consul' 'etcd' 'zk') - _describe -t cluster-store "Cluster Store" store -qS "://" && ret=0 - fi - ;; - (cluster-store-options) - if compset -P '*='; then - _files && ret=0 - else - opts=('discovery.heartbeat' 'discovery.ttl' 'kv.cacertfile' 'kv.certfile' 'kv.keyfile' 'kv.path') - _describe -t cluster-store-opts "Cluster Store Options" opts -qS "=" && ret=0 - fi - ;; - (users-groups) - if compset -P '*:'; then - _groups && ret=0 - else - _describe -t userns-default "default Docker user management" '(default)' && ret=0 - _users && ret=0 - fi - ;; - esac - ;; - (events|info) - __docker_system_subcommand && ret=0 - ;; - (image) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_image_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_image_subcommand && ret=0 - ;; - esac - ;; - (images) - words[1]='ls' - __docker_image_subcommand && ret=0 - ;; - (inspect) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help -s --size)"{-s,--size}"[Display total file sizes if the type is container]" \ - "($help)--type=[Return JSON for specified type]:type:(container image network node plugin service volume)" \ - "($help -)*: :->values" && ret=0 - - case $state in - (values) - if [[ ${words[(r)--type=container]} == --type=container ]]; then - __docker_complete_containers && ret=0 - elif [[ ${words[(r)--type=image]} == --type=image ]]; then - __docker_complete_images && ret=0 - elif [[ ${words[(r)--type=network]} == --type=network ]]; then - __docker_complete_networks && ret=0 - elif [[ ${words[(r)--type=node]} == --type=node ]]; then - __docker_complete_nodes && ret=0 - elif [[ ${words[(r)--type=plugin]} == --type=plugin ]]; then - __docker_complete_plugins && ret=0 - elif [[ ${words[(r)--type=service]} == --type=service ]]; then - __docker_complete_services && ret=0 - elif [[ ${words[(r)--type=volume]} == --type=volume ]]; then - __docker_complete_volumes && ret=0 - else - __docker_complete_containers - __docker_complete_images - __docker_complete_networks - __docker_complete_nodes - __docker_complete_plugins - __docker_complete_services - __docker_complete_volumes && ret=0 - fi - ;; - esac - ;; - (login) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help -p --password)"{-p=,--password=}"[Password]:password: " \ - "($help -u --user)"{-u=,--user=}"[Username]:username: " \ - "($help -)1:server: " && ret=0 - ;; - (logout) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help -)1:server: " && ret=0 - ;; - (network) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_network_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_network_subcommand && ret=0 - ;; - esac - ;; - (node) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_node_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_node_subcommand && ret=0 - ;; - esac - ;; - (plugin) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_plugin_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_plugin_subcommand && ret=0 - ;; - esac - ;; - (ps) - words[1]='ls' - __docker_container_subcommand && ret=0 - ;; - (rmi) - words[1]='rm' - __docker_image_subcommand && ret=0 - ;; - (search) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Filter values]:filter:->filter-options" \ - "($help)--limit=[Maximum returned search results]:limit:(1 5 10 25 50)" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -):term: " && ret=0 - - case $state in - (filter-options) - __docker_complete_search_filters && ret=0 - ;; - esac - ;; - (secret) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_secret_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_secret_subcommand && ret=0 - ;; - esac - ;; - (service) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_service_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_service_subcommand && ret=0 - ;; - esac - ;; - (stack) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_stack_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_stack_subcommand && ret=0 - ;; - esac - ;; - (swarm) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_swarm_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_swarm_subcommand && ret=0 - ;; - esac - ;; - (system) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_system_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_system_subcommand && ret=0 - ;; - esac - ;; - (version) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 - ;; - (volume) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_volume_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_volume_subcommand && ret=0 - ;; - esac - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_commands" && ret=0 - ;; - esac - - return ret -} - -_docker() { - # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`. - # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`. - if [[ $service != docker ]]; then - _call_function - _$service - return - fi - - local curcontext="$curcontext" state line help="-h --help" - integer ret=1 - typeset -A opt_args - - _arguments $(__docker_arguments) -C \ - "(: -)"{-h,--help}"[Print usage]" \ - "($help)--config[Location of client config files]:path:_directories" \ - "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ - "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ - "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ - "($help)--tls[Use TLS]" \ - "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g "*.(pem|crt)"" \ - "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g "*.(pem|crt)"" \ - "($help)--tlskey=[Path to TLS key file]:Key file:_files -g "*.(pem|key)"" \ - "($help)--tlsverify[Use TLS and verify the remote]" \ - "($help)--userland-proxy[Use userland proxy for loopback traffic]" \ - "($help -v --version)"{-v,--version}"[Print version information and quit]" \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - local host=${opt_args[-H]}${opt_args[--host]} - local config=${opt_args[--config]} - local docker_options="${host:+--host $host} ${config:+--config $config}" - - case $state in - (command) - __docker_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-$words[1]: - __docker_subcommand && ret=0 - ;; - esac - - return ret -} - -_dockerd() { - integer ret=1 - words[1]='daemon' - __docker_subcommand && ret=0 - return ret -} - -_docker "$@" - -# Local Variables: -# mode: Shell-Script -# sh-indentation: 4 -# indent-tabs-mode: nil -# sh-basic-offset: 4 -# End: -# vim: ft=zsh sw=4 ts=4 et diff --git a/vendor/github.com/docker/docker/contrib/desktop-integration/README.md b/vendor/github.com/docker/docker/contrib/desktop-integration/README.md deleted file mode 100644 index 85a01b9ee..000000000 --- a/vendor/github.com/docker/docker/contrib/desktop-integration/README.md +++ /dev/null @@ -1,11 +0,0 @@ -Desktop Integration -=================== - -The ./contrib/desktop-integration contains examples of typical dockerized -desktop applications. - -Examples -======== - -* Chromium: ./chromium/Dockerfile shows a way to dockerize a common application -* Gparted: ./gparted/Dockerfile shows a way to dockerize a common application w devices diff --git a/vendor/github.com/docker/docker/contrib/desktop-integration/chromium/Dockerfile b/vendor/github.com/docker/docker/contrib/desktop-integration/chromium/Dockerfile deleted file mode 100644 index 5cacd1f99..000000000 --- a/vendor/github.com/docker/docker/contrib/desktop-integration/chromium/Dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -# VERSION: 0.1 -# DESCRIPTION: Create chromium container with its dependencies -# AUTHOR: Jessica Frazelle -# COMMENTS: -# This file describes how to build a Chromium container with all -# dependencies installed. It uses native X11 unix socket. -# Tested on Debian Jessie -# USAGE: -# # Download Chromium Dockerfile -# wget http://raw.githubusercontent.com/docker/docker/master/contrib/desktop-integration/chromium/Dockerfile -# -# # Build chromium image -# docker build -t chromium . -# -# # Run stateful data-on-host chromium. For ephemeral, remove -v /data/chromium:/data -# docker run -v /data/chromium:/data -v /tmp/.X11-unix:/tmp/.X11-unix \ -# -e DISPLAY=unix$DISPLAY chromium - -# # To run stateful dockerized data containers -# docker run --volumes-from chromium-data -v /tmp/.X11-unix:/tmp/.X11-unix \ -# -e DISPLAY=unix$DISPLAY chromium - -# Base docker image -FROM debian:jessie -MAINTAINER Jessica Frazelle - -# Install Chromium -RUN apt-get update && apt-get install -y \ - chromium \ - chromium-l10n \ - libcanberra-gtk-module \ - libexif-dev \ - --no-install-recommends - -# Autorun chromium -CMD ["/usr/bin/chromium", "--no-sandbox", "--user-data-dir=/data"] diff --git a/vendor/github.com/docker/docker/contrib/desktop-integration/gparted/Dockerfile b/vendor/github.com/docker/docker/contrib/desktop-integration/gparted/Dockerfile deleted file mode 100644 index 3ddb23208..000000000 --- a/vendor/github.com/docker/docker/contrib/desktop-integration/gparted/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -# VERSION: 0.1 -# DESCRIPTION: Create gparted container with its dependencies -# AUTHOR: Jessica Frazelle -# COMMENTS: -# This file describes how to build a gparted container with all -# dependencies installed. It uses native X11 unix socket. -# Tested on Debian Jessie -# USAGE: -# # Download gparted Dockerfile -# wget http://raw.githubusercontent.com/docker/docker/master/contrib/desktop-integration/gparted/Dockerfile -# -# # Build gparted image -# docker build -t gparted . -# -# docker run -v /tmp/.X11-unix:/tmp/.X11-unix \ -# --device=/dev/sda:/dev/sda \ -# -e DISPLAY=unix$DISPLAY gparted -# - -# Base docker image -FROM debian:jessie -MAINTAINER Jessica Frazelle - -# Install Gparted and its dependencies -RUN apt-get update && apt-get install -y \ - gparted \ - libcanberra-gtk-module \ - --no-install-recommends - -# Autorun gparted -CMD ["/usr/sbin/gparted"] diff --git a/vendor/github.com/docker/docker/contrib/docker-device-tool/README.md b/vendor/github.com/docker/docker/contrib/docker-device-tool/README.md deleted file mode 100644 index 6c54d5995..000000000 --- a/vendor/github.com/docker/docker/contrib/docker-device-tool/README.md +++ /dev/null @@ -1,14 +0,0 @@ -Docker device tool for devicemapper storage driver backend -=================== - -The ./contrib/docker-device-tool contains a tool to manipulate devicemapper thin-pool. - -Compile -======== - - $ make shell - ## inside build container - $ go build contrib/docker-device-tool/device_tool.go - - # if devicemapper version is old and compilation fails, compile with `libdm_no_deferred_remove` tag - $ go build -tags libdm_no_deferred_remove contrib/docker-device-tool/device_tool.go diff --git a/vendor/github.com/docker/docker/contrib/docker-device-tool/device_tool.go b/vendor/github.com/docker/docker/contrib/docker-device-tool/device_tool.go deleted file mode 100644 index 906d064df..000000000 --- a/vendor/github.com/docker/docker/contrib/docker-device-tool/device_tool.go +++ /dev/null @@ -1,176 +0,0 @@ -// +build !windows,!solaris - -package main - -import ( - "flag" - "fmt" - "os" - "path" - "sort" - "strconv" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/graphdriver/devmapper" - "github.com/docker/docker/pkg/devicemapper" -) - -func usage() { - fmt.Fprintf(os.Stderr, "Usage: %s [status] | [list] | [device id] | [resize new-pool-size] | [snap new-id base-id] | [remove id] | [mount id mountpoint]\n", os.Args[0]) - flag.PrintDefaults() - os.Exit(1) -} - -func byteSizeFromString(arg string) (int64, error) { - digits := "" - rest := "" - last := strings.LastIndexAny(arg, "0123456789") - if last >= 0 { - digits = arg[:last+1] - rest = arg[last+1:] - } - - val, err := strconv.ParseInt(digits, 10, 64) - if err != nil { - return val, err - } - - rest = strings.ToLower(strings.TrimSpace(rest)) - - var multiplier int64 = 1 - switch rest { - case "": - multiplier = 1 - case "k", "kb": - multiplier = 1024 - case "m", "mb": - multiplier = 1024 * 1024 - case "g", "gb": - multiplier = 1024 * 1024 * 1024 - case "t", "tb": - multiplier = 1024 * 1024 * 1024 * 1024 - default: - return 0, fmt.Errorf("Unknown size unit: %s", rest) - } - - return val * multiplier, nil -} - -func main() { - root := flag.String("r", "/var/lib/docker", "Docker root dir") - flDebug := flag.Bool("D", false, "Debug mode") - - flag.Parse() - - if *flDebug { - os.Setenv("DEBUG", "1") - logrus.SetLevel(logrus.DebugLevel) - } - - if flag.NArg() < 1 { - usage() - } - - args := flag.Args() - - home := path.Join(*root, "devicemapper") - devices, err := devmapper.NewDeviceSet(home, false, nil, nil, nil) - if err != nil { - fmt.Println("Can't initialize device mapper: ", err) - os.Exit(1) - } - - switch args[0] { - case "status": - status := devices.Status() - fmt.Printf("Pool name: %s\n", status.PoolName) - fmt.Printf("Data Loopback file: %s\n", status.DataLoopback) - fmt.Printf("Metadata Loopback file: %s\n", status.MetadataLoopback) - fmt.Printf("Sector size: %d\n", status.SectorSize) - fmt.Printf("Data use: %d of %d (%.1f %%)\n", status.Data.Used, status.Data.Total, 100.0*float64(status.Data.Used)/float64(status.Data.Total)) - fmt.Printf("Metadata use: %d of %d (%.1f %%)\n", status.Metadata.Used, status.Metadata.Total, 100.0*float64(status.Metadata.Used)/float64(status.Metadata.Total)) - break - case "list": - ids := devices.List() - sort.Strings(ids) - for _, id := range ids { - fmt.Println(id) - } - break - case "device": - if flag.NArg() < 2 { - usage() - } - status, err := devices.GetDeviceStatus(args[1]) - if err != nil { - fmt.Println("Can't get device info: ", err) - os.Exit(1) - } - fmt.Printf("Id: %d\n", status.DeviceID) - fmt.Printf("Size: %d\n", status.Size) - fmt.Printf("Transaction Id: %d\n", status.TransactionID) - fmt.Printf("Size in Sectors: %d\n", status.SizeInSectors) - fmt.Printf("Mapped Sectors: %d\n", status.MappedSectors) - fmt.Printf("Highest Mapped Sector: %d\n", status.HighestMappedSector) - break - case "resize": - if flag.NArg() < 2 { - usage() - } - - size, err := byteSizeFromString(args[1]) - if err != nil { - fmt.Println("Invalid size: ", err) - os.Exit(1) - } - - err = devices.ResizePool(size) - if err != nil { - fmt.Println("Error resizing pool: ", err) - os.Exit(1) - } - - break - case "snap": - if flag.NArg() < 3 { - usage() - } - - err := devices.AddDevice(args[1], args[2], nil) - if err != nil { - fmt.Println("Can't create snap device: ", err) - os.Exit(1) - } - break - case "remove": - if flag.NArg() < 2 { - usage() - } - - err := devicemapper.RemoveDevice(args[1]) - if err != nil { - fmt.Println("Can't remove device: ", err) - os.Exit(1) - } - break - case "mount": - if flag.NArg() < 3 { - usage() - } - - err := devices.MountDevice(args[1], args[2], "") - if err != nil { - fmt.Println("Can't create snap device: ", err) - os.Exit(1) - } - break - default: - fmt.Printf("Unknown command %s\n", args[0]) - usage() - - os.Exit(1) - } - - return -} diff --git a/vendor/github.com/docker/docker/contrib/docker-device-tool/device_tool_windows.go b/vendor/github.com/docker/docker/contrib/docker-device-tool/device_tool_windows.go deleted file mode 100644 index da29a2cad..000000000 --- a/vendor/github.com/docker/docker/contrib/docker-device-tool/device_tool_windows.go +++ /dev/null @@ -1,4 +0,0 @@ -package main - -func main() { -} diff --git a/vendor/github.com/docker/docker/contrib/dockerize-disk.sh b/vendor/github.com/docker/docker/contrib/dockerize-disk.sh deleted file mode 100755 index 444e243ab..000000000 --- a/vendor/github.com/docker/docker/contrib/dockerize-disk.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env bash -set -e - -if ! command -v qemu-nbd &> /dev/null; then - echo >&2 'error: "qemu-nbd" not found!' - exit 1 -fi - -usage() { - echo "Convert disk image to docker image" - echo "" - echo "usage: $0 image-name disk-image-file [ base-image ]" - echo " ie: $0 cirros:0.3.3 cirros-0.3.3-x86_64-disk.img" - echo " $0 ubuntu:cloud ubuntu-14.04-server-cloudimg-amd64-disk1.img ubuntu:14.04" -} - -if [ "$#" -lt 2 ]; then - usage - exit 1 -fi - -CURDIR=$(pwd) - -image_name="${1%:*}" -image_tag="${1#*:}" -if [ "$image_tag" == "$1" ]; then - image_tag="latest" -fi - -disk_image_file="$2" -docker_base_image="$3" - -block_device=/dev/nbd0 - -builddir=$(mktemp -d) - -cleanup() { - umount "$builddir/disk_image" || true - umount "$builddir/workdir" || true - qemu-nbd -d $block_device &> /dev/null || true - rm -rf $builddir -} -trap cleanup EXIT - -# Mount disk image -modprobe nbd max_part=63 -qemu-nbd -rc ${block_device} -P 1 "$disk_image_file" -mkdir "$builddir/disk_image" -mount -o ro ${block_device} "$builddir/disk_image" - -mkdir "$builddir/workdir" -mkdir "$builddir/diff" - -base_image_mounts="" - -# Unpack base image -if [ -n "$docker_base_image" ]; then - mkdir -p "$builddir/base" - docker pull "$docker_base_image" - docker save "$docker_base_image" | tar -xC "$builddir/base" - - image_id=$(docker inspect -f "{{.Id}}" "$docker_base_image") - while [ -n "$image_id" ]; do - mkdir -p "$builddir/base/$image_id/layer" - tar -xf "$builddir/base/$image_id/layer.tar" -C "$builddir/base/$image_id/layer" - - base_image_mounts="${base_image_mounts}:$builddir/base/$image_id/layer=ro+wh" - image_id=$(docker inspect -f "{{.Parent}}" "$image_id") - done -fi - -# Mount work directory -mount -t aufs -o "br=$builddir/diff=rw${base_image_mounts},dio,xino=/dev/shm/aufs.xino" none "$builddir/workdir" - -# Update files -cd $builddir -LC_ALL=C diff -rq disk_image workdir \ - | sed -re "s|Only in workdir(.*?): |DEL \1/|g;s|Only in disk_image(.*?): |ADD \1/|g;s|Files disk_image/(.+) and workdir/(.+) differ|UPDATE /\1|g" \ - | while read action entry; do - case "$action" in - ADD|UPDATE) - cp -a "disk_image$entry" "workdir$entry" - ;; - DEL) - rm -rf "workdir$entry" - ;; - *) - echo "Error: unknown diff line: $action $entry" >&2 - ;; - esac - done - -# Pack new image -new_image_id="$(for i in $(seq 1 32); do printf "%02x" $(($RANDOM % 256)); done)" -mkdir -p $builddir/result/$new_image_id -cd diff -tar -cf $builddir/result/$new_image_id/layer.tar * -echo "1.0" > $builddir/result/$new_image_id/VERSION -cat > $builddir/result/$new_image_id/json <<-EOS -{ "docker_version": "1.4.1" -, "id": "$new_image_id" -, "created": "$(date -u +%Y-%m-%dT%H:%M:%S.%NZ)" -EOS - -if [ -n "$docker_base_image" ]; then - image_id=$(docker inspect -f "{{.Id}}" "$docker_base_image") - echo ", \"parent\": \"$image_id\"" >> $builddir/result/$new_image_id/json -fi - -echo "}" >> $builddir/result/$new_image_id/json - -echo "{\"$image_name\":{\"$image_tag\":\"$new_image_id\"}}" > $builddir/result/repositories - -cd $builddir/result - -# mkdir -p $CURDIR/$image_name -# cp -r * $CURDIR/$image_name -tar -c * | docker load diff --git a/vendor/github.com/docker/docker/contrib/download-frozen-image-v1.sh b/vendor/github.com/docker/docker/contrib/download-frozen-image-v1.sh deleted file mode 100755 index 29d7ff59f..000000000 --- a/vendor/github.com/docker/docker/contrib/download-frozen-image-v1.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/bash -set -e - -# hello-world latest ef872312fe1b 3 months ago 910 B -# hello-world latest ef872312fe1bbc5e05aae626791a47ee9b032efa8f3bda39cc0be7b56bfe59b9 3 months ago 910 B - -# debian latest f6fab3b798be 10 weeks ago 85.1 MB -# debian latest f6fab3b798be3174f45aa1eb731f8182705555f89c9026d8c1ef230cbf8301dd 10 weeks ago 85.1 MB - -if ! command -v curl &> /dev/null; then - echo >&2 'error: "curl" not found!' - exit 1 -fi - -usage() { - echo "usage: $0 dir image[:tag][@image-id] ..." - echo " ie: $0 /tmp/hello-world hello-world" - echo " $0 /tmp/debian-jessie debian:jessie" - echo " $0 /tmp/old-hello-world hello-world@ef872312fe1bbc5e05aae626791a47ee9b032efa8f3bda39cc0be7b56bfe59b9" - echo " $0 /tmp/old-debian debian:latest@f6fab3b798be3174f45aa1eb731f8182705555f89c9026d8c1ef230cbf8301dd" - [ -z "$1" ] || exit "$1" -} - -dir="$1" # dir for building tar in -shift || usage 1 >&2 - -[ $# -gt 0 -a "$dir" ] || usage 2 >&2 -mkdir -p "$dir" - -# hacky workarounds for Bash 3 support (no associative arrays) -images=() -rm -f "$dir"/tags-*.tmp -# repositories[busybox]='"latest": "...", "ubuntu-14.04": "..."' - -while [ $# -gt 0 ]; do - imageTag="$1" - shift - image="${imageTag%%[:@]*}" - tag="${imageTag#*:}" - imageId="${tag##*@}" - [ "$imageId" != "$tag" ] || imageId= - [ "$tag" != "$imageTag" ] || tag='latest' - tag="${tag%@*}" - - imageFile="${image//\//_}" # "/" can't be in filenames :) - - token="$(curl -sSL -o /dev/null -D- -H 'X-Docker-Token: true' "https://index.docker.io/v1/repositories/$image/images" | tr -d '\r' | awk -F ': *' '$1 == "X-Docker-Token" { print $2 }')" - - if [ -z "$imageId" ]; then - imageId="$(curl -sSL -H "Authorization: Token $token" "https://registry-1.docker.io/v1/repositories/$image/tags/$tag")" - imageId="${imageId//\"/}" - fi - - ancestryJson="$(curl -sSL -H "Authorization: Token $token" "https://registry-1.docker.io/v1/images/$imageId/ancestry")" - if [ "${ancestryJson:0:1}" != '[' ]; then - echo >&2 "error: /v1/images/$imageId/ancestry returned something unexpected:" - echo >&2 " $ancestryJson" - exit 1 - fi - - IFS=',' - ancestry=( ${ancestryJson//[\[\] \"]/} ) - unset IFS - - if [ -s "$dir/tags-$imageFile.tmp" ]; then - echo -n ', ' >> "$dir/tags-$imageFile.tmp" - else - images=( "${images[@]}" "$image" ) - fi - echo -n '"'"$tag"'": "'"$imageId"'"' >> "$dir/tags-$imageFile.tmp" - - echo "Downloading '$imageTag' (${#ancestry[@]} layers)..." - for imageId in "${ancestry[@]}"; do - mkdir -p "$dir/$imageId" - echo '1.0' > "$dir/$imageId/VERSION" - - curl -sSL -H "Authorization: Token $token" "https://registry-1.docker.io/v1/images/$imageId/json" -o "$dir/$imageId/json" - - # TODO figure out why "-C -" doesn't work here - # "curl: (33) HTTP server doesn't seem to support byte ranges. Cannot resume." - # "HTTP/1.1 416 Requested Range Not Satisfiable" - if [ -f "$dir/$imageId/layer.tar" ]; then - # TODO hackpatch for no -C support :'( - echo "skipping existing ${imageId:0:12}" - continue - fi - curl -SL --progress -H "Authorization: Token $token" "https://registry-1.docker.io/v1/images/$imageId/layer" -o "$dir/$imageId/layer.tar" # -C - - done - echo -done - -echo -n '{' > "$dir/repositories" -firstImage=1 -for image in "${images[@]}"; do - imageFile="${image//\//_}" # "/" can't be in filenames :) - - [ "$firstImage" ] || echo -n ',' >> "$dir/repositories" - firstImage= - echo -n $'\n\t' >> "$dir/repositories" - echo -n '"'"$image"'": { '"$(cat "$dir/tags-$imageFile.tmp")"' }' >> "$dir/repositories" -done -echo -n $'\n}\n' >> "$dir/repositories" - -rm -f "$dir"/tags-*.tmp - -echo "Download of images into '$dir' complete." -echo "Use something like the following to load the result into a Docker daemon:" -echo " tar -cC '$dir' . | docker load" diff --git a/vendor/github.com/docker/docker/contrib/download-frozen-image-v2.sh b/vendor/github.com/docker/docker/contrib/download-frozen-image-v2.sh deleted file mode 100755 index 111e3fa2b..000000000 --- a/vendor/github.com/docker/docker/contrib/download-frozen-image-v2.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/bin/bash -set -e - -# hello-world latest ef872312fe1b 3 months ago 910 B -# hello-world latest ef872312fe1bbc5e05aae626791a47ee9b032efa8f3bda39cc0be7b56bfe59b9 3 months ago 910 B - -# debian latest f6fab3b798be 10 weeks ago 85.1 MB -# debian latest f6fab3b798be3174f45aa1eb731f8182705555f89c9026d8c1ef230cbf8301dd 10 weeks ago 85.1 MB - -if ! command -v curl &> /dev/null; then - echo >&2 'error: "curl" not found!' - exit 1 -fi - -usage() { - echo "usage: $0 dir image[:tag][@digest] ..." - echo " $0 /tmp/old-hello-world hello-world:latest@sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7" - [ -z "$1" ] || exit "$1" -} - -dir="$1" # dir for building tar in -shift || usage 1 >&2 - -[ $# -gt 0 -a "$dir" ] || usage 2 >&2 -mkdir -p "$dir" - -# hacky workarounds for Bash 3 support (no associative arrays) -images=() -rm -f "$dir"/tags-*.tmp -# repositories[busybox]='"latest": "...", "ubuntu-14.04": "..."' - -while [ $# -gt 0 ]; do - imageTag="$1" - shift - image="${imageTag%%[:@]*}" - imageTag="${imageTag#*:}" - digest="${imageTag##*@}" - tag="${imageTag%%@*}" - - # add prefix library if passed official image - if [[ "$image" != *"/"* ]]; then - image="library/$image" - fi - - imageFile="${image//\//_}" # "/" can't be in filenames :) - - token="$(curl -sSL "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$image:pull" | jq --raw-output .token)" - - manifestJson="$(curl -sSL -H "Authorization: Bearer $token" "https://registry-1.docker.io/v2/$image/manifests/$digest")" - if [ "${manifestJson:0:1}" != '{' ]; then - echo >&2 "error: /v2/$image/manifests/$digest returned something unexpected:" - echo >&2 " $manifestJson" - exit 1 - fi - - layersFs=$(echo "$manifestJson" | jq --raw-output '.fsLayers | .[] | .blobSum') - - IFS=$'\n' - # bash v4 on Windows CI requires CRLF separator - if [ "$(go env GOHOSTOS)" = 'windows' ]; then - major=$(echo ${BASH_VERSION%%[^0.9]} | cut -d. -f1) - if [ "$major" -ge 4 ]; then - IFS=$'\r\n' - fi - fi - layers=( ${layersFs} ) - unset IFS - - history=$(echo "$manifestJson" | jq '.history | [.[] | .v1Compatibility]') - imageId=$(echo "$history" | jq --raw-output .[0] | jq --raw-output .id) - - if [ -s "$dir/tags-$imageFile.tmp" ]; then - echo -n ', ' >> "$dir/tags-$imageFile.tmp" - else - images=( "${images[@]}" "$image" ) - fi - echo -n '"'"$tag"'": "'"$imageId"'"' >> "$dir/tags-$imageFile.tmp" - - echo "Downloading '${image}:${tag}@${digest}' (${#layers[@]} layers)..." - for i in "${!layers[@]}"; do - imageJson=$(echo "$history" | jq --raw-output .[${i}]) - imageId=$(echo "$imageJson" | jq --raw-output .id) - imageLayer=${layers[$i]} - - mkdir -p "$dir/$imageId" - echo '1.0' > "$dir/$imageId/VERSION" - - echo "$imageJson" > "$dir/$imageId/json" - - # TODO figure out why "-C -" doesn't work here - # "curl: (33) HTTP server doesn't seem to support byte ranges. Cannot resume." - # "HTTP/1.1 416 Requested Range Not Satisfiable" - if [ -f "$dir/$imageId/layer.tar" ]; then - # TODO hackpatch for no -C support :'( - echo "skipping existing ${imageId:0:12}" - continue - fi - token="$(curl -sSL "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$image:pull" | jq --raw-output .token)" - curl -SL --progress -H "Authorization: Bearer $token" "https://registry-1.docker.io/v2/$image/blobs/$imageLayer" -o "$dir/$imageId/layer.tar" # -C - - done - echo -done - -echo -n '{' > "$dir/repositories" -firstImage=1 -for image in "${images[@]}"; do - imageFile="${image//\//_}" # "/" can't be in filenames :) - image="${image#library\/}" - - [ "$firstImage" ] || echo -n ',' >> "$dir/repositories" - firstImage= - echo -n $'\n\t' >> "$dir/repositories" - echo -n '"'"$image"'": { '"$(cat "$dir/tags-$imageFile.tmp")"' }' >> "$dir/repositories" -done -echo -n $'\n}\n' >> "$dir/repositories" - -rm -f "$dir"/tags-*.tmp - -echo "Download of images into '$dir' complete." -echo "Use something like the following to load the result into a Docker daemon:" -echo " tar -cC '$dir' . | docker load" diff --git a/vendor/github.com/docker/docker/contrib/editorconfig b/vendor/github.com/docker/docker/contrib/editorconfig deleted file mode 100644 index 97eda89a4..000000000 --- a/vendor/github.com/docker/docker/contrib/editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -root = true - -[*] -end_of_line = lf -insert_final_newline = true -charset = utf-8 -indent_style = tab -indent_size = 4 -trim_trailing_whitespace = true - -[*.md] -indent_size = 2 -indent_style = space diff --git a/vendor/github.com/docker/docker/contrib/gitdm/aliases b/vendor/github.com/docker/docker/contrib/gitdm/aliases deleted file mode 100644 index dd5dd3433..000000000 --- a/vendor/github.com/docker/docker/contrib/gitdm/aliases +++ /dev/null @@ -1,148 +0,0 @@ -Danny.Yates@mailonline.co.uk danny@codeaholics.org -KenCochrane@gmail.com kencochrane@gmail.com -LÉVEIL thomasleveil@gmail.com -Vincent.Bernat@exoscale.ch bernat@luffy.cx -acidburn@docker.com jess@docker.com -admin@jtlebi.fr jt@yadutaf.fr -ahmetalpbalkan@gmail.com ahmetb@microsoft.com -aj@gandi.net aj@gandi.net -albers@users.noreply.github.com github@albersweb.de -alexander.larsson@gmail.com alexl@redhat.com -amurdaca@redhat.com antonio.murdaca@gmail.com -amy@gandi.net aj@gandi.net -andrew.weiss@microsoft.com andrew.weiss@outlook.com -angt@users.noreply.github.com adrien@gallouet.fr -ankushagarwal@users.noreply.github.com ankushagarwal11@gmail.com -anonymouse2048@gmail.com lheckemann@twig-world.com -anusha@docker.com anusha.ragunathan@docker.com -asarai@suse.com asarai@suse.de -avi.miller@gmail.com avi.miller@oracle.com -bernat@luffy.cx Vincent.Bernat@exoscale.ch -bgoff@cpuguy83-mbp.home cpuguy83@gmail.com -brandon@ifup.co brandon@ifup.org -brent@docker.com brent.salisbury@docker.com -charmes.guillaume@gmail.com guillaume.charmes@docker.com -chenchun.feed@gmail.com ramichen@tencent.com -chooper@plumata.com charles.hooper@dotcloud.com -crosby.michael@gmail.com michael@docker.com -crosbymichael@gmail.com michael@docker.com -cyphar@cyphar.com asarai@suse.de -daehyeok@daehyeok-ui-MacBook-Air.local daehyeok@gmail.com -daehyeok@daehyeokui-MacBook-Air.local daehyeok@gmail.com -daniel.norberg@gmail.com dano@spotify.com -daniel@dotcloud.com daniel.mizyrycki@dotcloud.com -darren@rancher.com darren.s.shepherd@gmail.com -dave@dtucker.co.uk dt@docker.com -dev@vvieux.com victor.vieux@docker.com -dgasienica@zynga.com daniel@gasienica.ch -dnephin@gmail.com dnephin@docker.com -dominikh@fork-bomb.org dominik@honnef.co -dqminh89@gmail.com dqminh@cloudflare.com -dsxiao@dataman-inc.com dxiao@redhat.com -duglin@users.noreply.github.com dug@us.ibm.com -eric.hanchrow@gmail.com ehanchrow@ine.com -erik+github@hollensbe.org github@hollensbe.org -estesp@gmail.com estesp@linux.vnet.ibm.com -ewindisch@docker.com eric@windisch.us -f.joffrey@gmail.com joffrey@docker.com -fkautz@alumni.cmu.edu fkautz@redhat.com -frank.rosquin@gmail.com frank.rosquin+github@gmail.com -gh@mattyw.net mattyw@me.com -git@julienbordellier.com julienbordellier@gmail.com -github@metaliveblog.com github@developersupport.net -github@srid.name sridharr@activestate.com -guillaume.charmes@dotcloud.com guillaume.charmes@docker.com -guillaume@charmes.net guillaume.charmes@docker.com -guillaume@docker.com guillaume.charmes@docker.com -guillaume@dotcloud.com guillaume.charmes@docker.com -haoshuwei24@gmail.com haosw@cn.ibm.com -hollie.teal@docker.com hollie@docker.com -hollietealok@users.noreply.github.com hollie@docker.com -hsinko@users.noreply.github.com 21551195@zju.edu.cn -iamironbob@gmail.com altsysrq@gmail.com -icecrime@gmail.com arnaud.porterie@docker.com -jatzen@gmail.com jacob@jacobatzen.dk -jeff@allingeek.com jeff.nickoloff@gmail.com -jefferya@programmerq.net jeff@docker.com -jerome.petazzoni@dotcloud.com jerome.petazzoni@dotcloud.com -jfrazelle@users.noreply.github.com jess@docker.com -jhoward@microsoft.com John.Howard@microsoft.com -jlhawn@berkeley.edu josh.hawn@docker.com -joffrey@dotcloud.com joffrey@docker.com -john.howard@microsoft.com John.Howard@microsoft.com -jp@enix.org jerome.petazzoni@dotcloud.com -justin.cormack@unikernel.com justin.cormack@docker.com -justin.simonelis@PTS-JSIMON2.toronto.exclamation.com justin.p.simonelis@gmail.com -justin@specialbusservice.com justin.cormack@docker.com -katsuta_soshi@cyberagent.co.jp soshi.katsuta@gmail.com -kuehnle@online.de git.nivoc@neverbox.com -kwk@users.noreply.github.com konrad.wilhelm.kleine@gmail.com -leijitang@gmail.com leijitang@huawei.com -liubin0329@gmail.com liubin0329@users.noreply.github.com -lk4d4math@gmail.com lk4d4@docker.com -louis@dotcloud.com kalessin@kalessin.fr -lsm5@redhat.com lsm5@fedoraproject.org -lyndaoleary@hotmail.com lyndaoleary29@gmail.com -madhu@socketplane.io madhu@docker.com -martins@noironetworks.com aanm90@gmail.com -mary@docker.com mary.anthony@docker.com -mastahyeti@users.noreply.github.com mastahyeti@gmail.com -maztaim@users.noreply.github.com taim@bosboot.org -me@runcom.ninja antonio.murdaca@gmail.com -mheon@mheonlaptop.redhat.com mheon@redhat.com -michael@crosbymichael.com michael@docker.com -mohitsoni1989@gmail.com mosoni@ebay.com -moxieandmore@gmail.com mary.anthony@docker.com -moyses.furtado@wplex.com.br moysesb@gmail.com -msabramo@gmail.com marc@marc-abramowitz.com -mzdaniel@glidelink.net daniel.mizyrycki@dotcloud.com -nathan.leclaire@gmail.com nathan.leclaire@docker.com -nathanleclaire@gmail.com nathan.leclaire@docker.com -ostezer@users.noreply.github.com ostezer@gmail.com -peter@scraperwiki.com p@pwaller.net -princess@docker.com jess@docker.com -proppy@aminche.com proppy@google.com -qhuang@10.0.2.15 h.huangqiang@huawei.com -resouer@gmail.com resouer@163.com -roberto_hashioka@hotmail.com roberto.hashioka@docker.com -root@vagrant-ubuntu-12.10.vagrantup.com daniel.mizyrycki@dotcloud.com -runcom@linux.com antonio.murdaca@gmail.com -runcom@redhat.com antonio.murdaca@gmail.com -runcom@users.noreply.github.com antonio.murdaca@gmail.com -s@docker.com solomon@docker.com -shawnlandden@gmail.com shawn@churchofgit.com -singh.gurjeet@gmail.com gurjeet@singh.im -sjoerd@byte.nl sjoerd-github@linuxonly.nl -smahajan@redhat.com shishir.mahajan@redhat.com -solomon.hykes@dotcloud.com solomon@docker.com -solomon@dotcloud.com solomon@docker.com -stefanb@us.ibm.com stefanb@linux.vnet.ibm.com -stevvooe@users.noreply.github.com stephen.day@docker.com -superbaloo+registrations.github@superbaloo.net baloo@gandi.net -tangicolin@gmail.com tangicolin@gmail.com -thaJeztah@users.noreply.github.com github@gone.nl -thatcher@dotcloud.com thatcher@docker.com -thatcher@gmx.net thatcher@docker.com -tibor@docker.com teabee89@gmail.com -tiborvass@users.noreply.github.com teabee89@gmail.com -timruffles@googlemail.com oi@truffles.me.uk -tintypemolly@Ohui-MacBook-Pro.local tintypemolly@gmail.com -tj@init.me tejesh.mehta@gmail.com -tristan.carel@gmail.com tristan@cogniteev.com -unclejack@users.noreply.github.com cristian.staretu@gmail.com -unclejacksons@gmail.com cristian.staretu@gmail.com -vbatts@hashbangbash.com vbatts@redhat.com -victor.vieux@dotcloud.com victor.vieux@docker.com -victor@docker.com victor.vieux@docker.com -victor@dotcloud.com victor.vieux@docker.com -victorvieux@gmail.com victor.vieux@docker.com -vieux@docker.com victor.vieux@docker.com -vincent+github@demeester.fr vincent@sbr.pm -vincent@bernat.im bernat@luffy.cx -vojnovski@gmail.com viktor.vojnovski@amadeus.com -whoshuu@gmail.com huu@prismskylabs.com -xiaods@gmail.com dxiao@redhat.com -xlgao@zju.edu.cn xlgao@zju.edu.cn -yestin.sun@polyera.com sunyi0804@gmail.com -yuchangchun1@huawei.com yuchangchun1@huawei.com -zjaffee@us.ibm.com zij@case.edu diff --git a/vendor/github.com/docker/docker/contrib/gitdm/domain-map b/vendor/github.com/docker/docker/contrib/gitdm/domain-map deleted file mode 100644 index 1f1849e4f..000000000 --- a/vendor/github.com/docker/docker/contrib/gitdm/domain-map +++ /dev/null @@ -1,39 +0,0 @@ -# -# Docker -# - -docker.com Docker -dotcloud.com Docker - -aluzzardi@gmail.com Docker -cpuguy83@gmail.com Docker -derek@mcgstyle.net Docker -github@gone.nl Docker -kencochrane@gmail.com Docker -mickael.laventure@gmail.com Docker -sam.alba@gmail.com Docker -svendowideit@fosiki.com Docker -svendowideit@home.org.au Docker -tonistiigi@gmail.com Docker - -cristian.staretu@gmail.com Docker < 2015-01-01 -cristian.staretu@gmail.com Cisco - -github@hollensbe.org Docker < 2015-01-01 -github@hollensbe.org Cisco - -david.calavera@gmail.com Docker < 2016-04-01 -david.calavera@gmail.com Netlify - -# -# Others -# - -cisco.com Cisco -google.com Google -ibm.com IBM -huawei.com Huawei -microsoft.com Microsoft - -redhat.com Red Hat -mrunalp@gmail.com Red Hat diff --git a/vendor/github.com/docker/docker/contrib/gitdm/generate_aliases.sh b/vendor/github.com/docker/docker/contrib/gitdm/generate_aliases.sh deleted file mode 100755 index dd6a56499..000000000 --- a/vendor/github.com/docker/docker/contrib/gitdm/generate_aliases.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# -# This script generates a gitdm compatible email aliases file from a git -# formatted .mailmap file. -# -# Usage: -# $> ./generate_aliases > aliases -# - -cat $1 | \ - grep -v '^#' | \ - sed 's/^[^<]*<\([^>]*\)>/\1/' | \ - grep '<.*>' | sed -e 's/[<>]/ /g' | \ - awk '{if ($3 != "") { print $3" "$1 } else {print $2" "$1}}' | \ - sort | uniq diff --git a/vendor/github.com/docker/docker/contrib/gitdm/gitdm.config b/vendor/github.com/docker/docker/contrib/gitdm/gitdm.config deleted file mode 100644 index d9b62b0b4..000000000 --- a/vendor/github.com/docker/docker/contrib/gitdm/gitdm.config +++ /dev/null @@ -1,17 +0,0 @@ -# -# EmailAliases lets us cope with developers who use more -# than one address. -# -EmailAliases aliases - -# -# EmailMap does the main work of mapping addresses onto -# employers. -# -EmailMap domain-map - -# -# Use GroupMap to map a file full of addresses to the -# same employer -# -# GroupMap company-Docker Docker diff --git a/vendor/github.com/docker/docker/contrib/httpserver/Dockerfile b/vendor/github.com/docker/docker/contrib/httpserver/Dockerfile deleted file mode 100644 index 747dc91bc..000000000 --- a/vendor/github.com/docker/docker/contrib/httpserver/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM busybox -EXPOSE 80/tcp -COPY httpserver . -CMD ["./httpserver"] diff --git a/vendor/github.com/docker/docker/contrib/httpserver/Dockerfile.solaris b/vendor/github.com/docker/docker/contrib/httpserver/Dockerfile.solaris deleted file mode 100644 index 3d0d691c1..000000000 --- a/vendor/github.com/docker/docker/contrib/httpserver/Dockerfile.solaris +++ /dev/null @@ -1,4 +0,0 @@ -FROM solaris -EXPOSE 80/tcp -COPY httpserver . -CMD ["./httpserver"] diff --git a/vendor/github.com/docker/docker/contrib/httpserver/server.go b/vendor/github.com/docker/docker/contrib/httpserver/server.go deleted file mode 100644 index a75d5abb3..000000000 --- a/vendor/github.com/docker/docker/contrib/httpserver/server.go +++ /dev/null @@ -1,12 +0,0 @@ -package main - -import ( - "log" - "net/http" -) - -func main() { - fs := http.FileServer(http.Dir("/static")) - http.Handle("/", fs) - log.Panic(http.ListenAndServe(":80", nil)) -} diff --git a/vendor/github.com/docker/docker/contrib/init/openrc/docker.confd b/vendor/github.com/docker/docker/contrib/init/openrc/docker.confd deleted file mode 100644 index 244403113..000000000 --- a/vendor/github.com/docker/docker/contrib/init/openrc/docker.confd +++ /dev/null @@ -1,13 +0,0 @@ -# /etc/conf.d/docker: config file for /etc/init.d/docker - -# where the docker daemon output gets piped -#DOCKER_LOGFILE="/var/log/docker.log" - -# where docker's pid get stored -#DOCKER_PIDFILE="/run/docker.pid" - -# where the docker daemon itself is run from -#DOCKERD_BINARY="/usr/bin/dockerd" - -# any other random options you want to pass to docker -DOCKER_OPTS="" diff --git a/vendor/github.com/docker/docker/contrib/init/openrc/docker.initd b/vendor/github.com/docker/docker/contrib/init/openrc/docker.initd deleted file mode 100644 index 5d3160338..000000000 --- a/vendor/github.com/docker/docker/contrib/init/openrc/docker.initd +++ /dev/null @@ -1,22 +0,0 @@ -#!/sbin/openrc-run -# Copyright 1999-2013 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 - -command="${DOCKERD_BINARY:-/usr/bin/dockerd}" -pidfile="${DOCKER_PIDFILE:-/run/${RC_SVCNAME}.pid}" -command_args="-p \"${pidfile}\" ${DOCKER_OPTS}" -DOCKER_LOGFILE="${DOCKER_LOGFILE:-/var/log/${RC_SVCNAME}.log}" -start_stop_daemon_args="--background \ - --stderr \"${DOCKER_LOGFILE}\" --stdout \"${DOCKER_LOGFILE}\"" - -start_pre() { - checkpath -f -m 0644 -o root:docker "$DOCKER_LOGFILE" - - ulimit -n 1048576 - - # Having non-zero limits causes performance problems due to accounting overhead - # in the kernel. We recommend using cgroups to do container-local accounting. - ulimit -u unlimited - - return 0 -} diff --git a/vendor/github.com/docker/docker/contrib/init/systemd/REVIEWERS b/vendor/github.com/docker/docker/contrib/init/systemd/REVIEWERS deleted file mode 100644 index b9ba55b3f..000000000 --- a/vendor/github.com/docker/docker/contrib/init/systemd/REVIEWERS +++ /dev/null @@ -1,3 +0,0 @@ -Lokesh Mandvekar (@lsm5) -Brandon Philips (@philips) -Jessie Frazelle (@jfrazelle) diff --git a/vendor/github.com/docker/docker/contrib/init/systemd/docker.service b/vendor/github.com/docker/docker/contrib/init/systemd/docker.service deleted file mode 100644 index 8bfed93c7..000000000 --- a/vendor/github.com/docker/docker/contrib/init/systemd/docker.service +++ /dev/null @@ -1,29 +0,0 @@ -[Unit] -Description=Docker Application Container Engine -Documentation=https://docs.docker.com -After=network.target docker.socket firewalld.service -Requires=docker.socket - -[Service] -Type=notify -# the default is not to use systemd for cgroups because the delegate issues still -# exists and systemd currently does not support the cgroup feature set required -# for containers run by docker -ExecStart=/usr/bin/dockerd -H fd:// -ExecReload=/bin/kill -s HUP $MAINPID -LimitNOFILE=1048576 -# Having non-zero Limit*s causes performance problems due to accounting overhead -# in the kernel. We recommend using cgroups to do container-local accounting. -LimitNPROC=infinity -LimitCORE=infinity -# Uncomment TasksMax if your systemd version supports it. -# Only systemd 226 and above support this version. -#TasksMax=infinity -TimeoutStartSec=0 -# set delegate yes so that systemd does not reset the cgroups of docker containers -Delegate=yes -# kill only the docker process, not all processes in the cgroup -KillMode=process - -[Install] -WantedBy=multi-user.target diff --git a/vendor/github.com/docker/docker/contrib/init/systemd/docker.service.rpm b/vendor/github.com/docker/docker/contrib/init/systemd/docker.service.rpm deleted file mode 100644 index 6e4189239..000000000 --- a/vendor/github.com/docker/docker/contrib/init/systemd/docker.service.rpm +++ /dev/null @@ -1,28 +0,0 @@ -[Unit] -Description=Docker Application Container Engine -Documentation=https://docs.docker.com -After=network.target firewalld.service - -[Service] -Type=notify -# the default is not to use systemd for cgroups because the delegate issues still -# exists and systemd currently does not support the cgroup feature set required -# for containers run by docker -ExecStart=/usr/bin/dockerd -ExecReload=/bin/kill -s HUP $MAINPID -# Having non-zero Limit*s causes performance problems due to accounting overhead -# in the kernel. We recommend using cgroups to do container-local accounting. -LimitNOFILE=infinity -LimitNPROC=infinity -LimitCORE=infinity -# Uncomment TasksMax if your systemd version supports it. -# Only systemd 226 and above support this version. -#TasksMax=infinity -TimeoutStartSec=0 -# set delegate yes so that systemd does not reset the cgroups of docker containers -Delegate=yes -# kill only the docker process, not all processes in the cgroup -KillMode=process - -[Install] -WantedBy=multi-user.target diff --git a/vendor/github.com/docker/docker/contrib/init/systemd/docker.socket b/vendor/github.com/docker/docker/contrib/init/systemd/docker.socket deleted file mode 100644 index 7dd95098e..000000000 --- a/vendor/github.com/docker/docker/contrib/init/systemd/docker.socket +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Description=Docker Socket for the API -PartOf=docker.service - -[Socket] -ListenStream=/var/run/docker.sock -SocketMode=0660 -SocketUser=root -SocketGroup=docker - -[Install] -WantedBy=sockets.target diff --git a/vendor/github.com/docker/docker/contrib/init/sysvinit-debian/docker b/vendor/github.com/docker/docker/contrib/init/sysvinit-debian/docker deleted file mode 100755 index 4f9d38dda..000000000 --- a/vendor/github.com/docker/docker/contrib/init/sysvinit-debian/docker +++ /dev/null @@ -1,152 +0,0 @@ -#!/bin/sh -set -e - -### BEGIN INIT INFO -# Provides: docker -# Required-Start: $syslog $remote_fs -# Required-Stop: $syslog $remote_fs -# Should-Start: cgroupfs-mount cgroup-lite -# Should-Stop: cgroupfs-mount cgroup-lite -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Create lightweight, portable, self-sufficient containers. -# Description: -# Docker is an open-source project to easily create lightweight, portable, -# self-sufficient containers from any application. The same container that a -# developer builds and tests on a laptop can run at scale, in production, on -# VMs, bare metal, OpenStack clusters, public clouds and more. -### END INIT INFO - -export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin - -BASE=docker - -# modify these in /etc/default/$BASE (/etc/default/docker) -DOCKERD=/usr/bin/dockerd -# This is the pid file managed by docker itself -DOCKER_PIDFILE=/var/run/$BASE.pid -# This is the pid file created/managed by start-stop-daemon -DOCKER_SSD_PIDFILE=/var/run/$BASE-ssd.pid -DOCKER_LOGFILE=/var/log/$BASE.log -DOCKER_OPTS= -DOCKER_DESC="Docker" - -# Get lsb functions -. /lib/lsb/init-functions - -if [ -f /etc/default/$BASE ]; then - . /etc/default/$BASE -fi - -# Check docker is present -if [ ! -x $DOCKERD ]; then - log_failure_msg "$DOCKERD not present or not executable" - exit 1 -fi - -check_init() { - # see also init_is_upstart in /lib/lsb/init-functions (which isn't available in Ubuntu 12.04, or we'd use it directly) - if [ -x /sbin/initctl ] && /sbin/initctl version 2>/dev/null | grep -q upstart; then - log_failure_msg "$DOCKER_DESC is managed via upstart, try using service $BASE $1" - exit 1 - fi -} - -fail_unless_root() { - if [ "$(id -u)" != '0' ]; then - log_failure_msg "$DOCKER_DESC must be run as root" - exit 1 - fi -} - -cgroupfs_mount() { - # see also https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount - if grep -v '^#' /etc/fstab | grep -q cgroup \ - || [ ! -e /proc/cgroups ] \ - || [ ! -d /sys/fs/cgroup ]; then - return - fi - if ! mountpoint -q /sys/fs/cgroup; then - mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup - fi - ( - cd /sys/fs/cgroup - for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do - mkdir -p $sys - if ! mountpoint -q $sys; then - if ! mount -n -t cgroup -o $sys cgroup $sys; then - rmdir $sys || true - fi - fi - done - ) -} - -case "$1" in - start) - check_init - - fail_unless_root - - cgroupfs_mount - - touch "$DOCKER_LOGFILE" - chgrp docker "$DOCKER_LOGFILE" - - ulimit -n 1048576 - - # Having non-zero limits causes performance problems due to accounting overhead - # in the kernel. We recommend using cgroups to do container-local accounting. - if [ "$BASH" ]; then - ulimit -u unlimited - else - ulimit -p unlimited - fi - - log_begin_msg "Starting $DOCKER_DESC: $BASE" - start-stop-daemon --start --background \ - --no-close \ - --exec "$DOCKERD" \ - --pidfile "$DOCKER_SSD_PIDFILE" \ - --make-pidfile \ - -- \ - -p "$DOCKER_PIDFILE" \ - $DOCKER_OPTS \ - >> "$DOCKER_LOGFILE" 2>&1 - log_end_msg $? - ;; - - stop) - check_init - fail_unless_root - log_begin_msg "Stopping $DOCKER_DESC: $BASE" - start-stop-daemon --stop --pidfile "$DOCKER_SSD_PIDFILE" --retry 10 - log_end_msg $? - ;; - - restart) - check_init - fail_unless_root - docker_pid=`cat "$DOCKER_SSD_PIDFILE" 2>/dev/null` - [ -n "$docker_pid" ] \ - && ps -p $docker_pid > /dev/null 2>&1 \ - && $0 stop - $0 start - ;; - - force-reload) - check_init - fail_unless_root - $0 restart - ;; - - status) - check_init - status_of_proc -p "$DOCKER_SSD_PIDFILE" "$DOCKERD" "$DOCKER_DESC" - ;; - - *) - echo "Usage: service docker {start|stop|restart|status}" - exit 1 - ;; -esac diff --git a/vendor/github.com/docker/docker/contrib/init/sysvinit-debian/docker.default b/vendor/github.com/docker/docker/contrib/init/sysvinit-debian/docker.default deleted file mode 100644 index c4e93199b..000000000 --- a/vendor/github.com/docker/docker/contrib/init/sysvinit-debian/docker.default +++ /dev/null @@ -1,20 +0,0 @@ -# Docker Upstart and SysVinit configuration file - -# -# THIS FILE DOES NOT APPLY TO SYSTEMD -# -# Please see the documentation for "systemd drop-ins": -# https://docs.docker.com/engine/admin/systemd/ -# - -# Customize location of Docker binary (especially for development testing). -#DOCKERD="/usr/local/bin/dockerd" - -# Use DOCKER_OPTS to modify the daemon startup options. -#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" - -# If you need Docker to use an HTTP proxy, it can also be specified here. -#export http_proxy="http://127.0.0.1:3128/" - -# This is also a handy place to tweak where Docker's temporary files go. -#export DOCKER_TMPDIR="/mnt/bigdrive/docker-tmp" diff --git a/vendor/github.com/docker/docker/contrib/init/sysvinit-redhat/docker b/vendor/github.com/docker/docker/contrib/init/sysvinit-redhat/docker deleted file mode 100755 index df9b02a2a..000000000 --- a/vendor/github.com/docker/docker/contrib/init/sysvinit-redhat/docker +++ /dev/null @@ -1,153 +0,0 @@ -#!/bin/sh -# -# /etc/rc.d/init.d/docker -# -# Daemon for docker.com -# -# chkconfig: 2345 95 95 -# description: Daemon for docker.com - -### BEGIN INIT INFO -# Provides: docker -# Required-Start: $network cgconfig -# Required-Stop: -# Should-Start: -# Should-Stop: -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: start and stop docker -# Description: Daemon for docker.com -### END INIT INFO - -# Source function library. -. /etc/rc.d/init.d/functions - -prog="docker" -unshare=/usr/bin/unshare -exec="/usr/bin/dockerd" -pidfile="/var/run/$prog.pid" -lockfile="/var/lock/subsys/$prog" -logfile="/var/log/$prog" - -[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog - -prestart() { - service cgconfig status > /dev/null - - if [[ $? != 0 ]]; then - service cgconfig start - fi - -} - -start() { - if [ ! -x $exec ]; then - if [ ! -e $exec ]; then - echo "Docker executable $exec not found" - else - echo "You do not have permission to execute the Docker executable $exec" - fi - exit 5 - fi - - check_for_cleanup - - if ! [ -f $pidfile ]; then - prestart - printf "Starting $prog:\t" - echo "\n$(date)\n" >> $logfile - "$unshare" -m -- $exec $other_args >> $logfile 2>&1 & - pid=$! - touch $lockfile - # wait up to 10 seconds for the pidfile to exist. see - # https://github.com/docker/docker/issues/5359 - tries=0 - while [ ! -f $pidfile -a $tries -lt 10 ]; do - sleep 1 - tries=$((tries + 1)) - echo -n '.' - done - if [ ! -f $pidfile ]; then - failure - echo - exit 1 - fi - success - echo - else - failure - echo - printf "$pidfile still exists...\n" - exit 7 - fi -} - -stop() { - echo -n $"Stopping $prog: " - killproc -p $pidfile -d 300 $prog - retval=$? - echo - [ $retval -eq 0 ] && rm -f $lockfile - return $retval -} - -restart() { - stop - start -} - -reload() { - restart -} - -force_reload() { - restart -} - -rh_status() { - status -p $pidfile $prog -} - -rh_status_q() { - rh_status >/dev/null 2>&1 -} - - -check_for_cleanup() { - if [ -f ${pidfile} ]; then - /bin/ps -fp $(cat ${pidfile}) > /dev/null || rm ${pidfile} - fi -} - -case "$1" in - start) - rh_status_q && exit 0 - $1 - ;; - stop) - rh_status_q || exit 0 - $1 - ;; - restart) - $1 - ;; - reload) - rh_status_q || exit 7 - $1 - ;; - force-reload) - force_reload - ;; - status) - rh_status - ;; - condrestart|try-restart) - rh_status_q || exit 0 - restart - ;; - *) - echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" - exit 2 -esac - -exit $? diff --git a/vendor/github.com/docker/docker/contrib/init/sysvinit-redhat/docker.sysconfig b/vendor/github.com/docker/docker/contrib/init/sysvinit-redhat/docker.sysconfig deleted file mode 100644 index 0864b3d77..000000000 --- a/vendor/github.com/docker/docker/contrib/init/sysvinit-redhat/docker.sysconfig +++ /dev/null @@ -1,7 +0,0 @@ -# /etc/sysconfig/docker -# -# Other arguments to pass to the docker daemon process -# These will be parsed by the sysv initscript and appended -# to the arguments list passed to docker daemon - -other_args="" diff --git a/vendor/github.com/docker/docker/contrib/init/upstart/REVIEWERS b/vendor/github.com/docker/docker/contrib/init/upstart/REVIEWERS deleted file mode 100644 index 03ee2dde3..000000000 --- a/vendor/github.com/docker/docker/contrib/init/upstart/REVIEWERS +++ /dev/null @@ -1,2 +0,0 @@ -Tianon Gravi (@tianon) -Jessie Frazelle (@jfrazelle) diff --git a/vendor/github.com/docker/docker/contrib/init/upstart/docker.conf b/vendor/github.com/docker/docker/contrib/init/upstart/docker.conf deleted file mode 100644 index d58f7d6ac..000000000 --- a/vendor/github.com/docker/docker/contrib/init/upstart/docker.conf +++ /dev/null @@ -1,72 +0,0 @@ -description "Docker daemon" - -start on (filesystem and net-device-up IFACE!=lo) -stop on runlevel [!2345] - -limit nofile 524288 1048576 - -# Having non-zero limits causes performance problems due to accounting overhead -# in the kernel. We recommend using cgroups to do container-local accounting. -limit nproc unlimited unlimited - -respawn - -kill timeout 20 - -pre-start script - # see also https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount - if grep -v '^#' /etc/fstab | grep -q cgroup \ - || [ ! -e /proc/cgroups ] \ - || [ ! -d /sys/fs/cgroup ]; then - exit 0 - fi - if ! mountpoint -q /sys/fs/cgroup; then - mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup - fi - ( - cd /sys/fs/cgroup - for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do - mkdir -p $sys - if ! mountpoint -q $sys; then - if ! mount -n -t cgroup -o $sys cgroup $sys; then - rmdir $sys || true - fi - fi - done - ) -end script - -script - # modify these in /etc/default/$UPSTART_JOB (/etc/default/docker) - DOCKERD=/usr/bin/dockerd - DOCKER_OPTS= - if [ -f /etc/default/$UPSTART_JOB ]; then - . /etc/default/$UPSTART_JOB - fi - exec "$DOCKERD" $DOCKER_OPTS --raw-logs -end script - -# Don't emit "started" event until docker.sock is ready. -# See https://github.com/docker/docker/issues/6647 -post-start script - DOCKER_OPTS= - DOCKER_SOCKET= - if [ -f /etc/default/$UPSTART_JOB ]; then - . /etc/default/$UPSTART_JOB - fi - - if ! printf "%s" "$DOCKER_OPTS" | grep -qE -e '-H|--host'; then - DOCKER_SOCKET=/var/run/docker.sock - else - DOCKER_SOCKET=$(printf "%s" "$DOCKER_OPTS" | grep -oP -e '(-H|--host)\W*unix://\K(\S+)' | sed 1q) - fi - - if [ -n "$DOCKER_SOCKET" ]; then - while ! [ -e "$DOCKER_SOCKET" ]; do - initctl status $UPSTART_JOB | grep -qE "(stop|respawn)/" && exit 1 - echo "Waiting for $DOCKER_SOCKET" - sleep 0.1 - done - echo "$DOCKER_SOCKET is up" - fi -end script diff --git a/vendor/github.com/docker/docker/contrib/mac-install-bundle.sh b/vendor/github.com/docker/docker/contrib/mac-install-bundle.sh deleted file mode 100755 index 2110d044d..000000000 --- a/vendor/github.com/docker/docker/contrib/mac-install-bundle.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh - -set -e - -errexit() { - echo "$1" - exit 1 -} - -[ "$(uname -s)" == "Darwin" ] || errexit "This script can only be used on a Mac" - -[ $# -eq 1 ] || errexit "Usage: $0 install|undo" - -BUNDLE="bundles/$(cat VERSION)" -BUNDLE_PATH="$PWD/$BUNDLE" -CLIENT_PATH="$BUNDLE_PATH/cross/darwin/amd64/docker" -DATABASE="$HOME/Library/Containers/com.docker.docker/Data/database" -DATABASE_KEY="$DATABASE/com.docker.driver.amd64-linux/bundle" - -[ -d "$DATABASE" ] || errexit "Docker for Mac must be installed for this script" - -case "$1" in -"install") - [ -d "$BUNDLE" ] || errexit "cannot find bundle $BUNDLE" - [ -e "$CLIENT_PATH" ] || errexit "you need to run make cross first" - [ -e "$BUNDLE/binary-daemon/dockerd" ] || errexit "you need to build binaries first" - [ -f "$BUNDLE/binary-client/docker" ] || errexit "you need to build binaries first" - git -C "$DATABASE" reset --hard >/dev/null - echo "$BUNDLE_PATH" > "$DATABASE_KEY" - git -C "$DATABASE" add "$DATABASE_KEY" - git -C "$DATABASE" commit -m "update bundle to $BUNDLE_PATH" - rm -f /usr/local/bin/docker - cp "$CLIENT_PATH" /usr/local/bin - echo "Bundle installed. Restart Docker to use. To uninstall, reset Docker to factory defaults." - ;; -"undo") - git -C "$DATABASE" reset --hard >/dev/null - [ -f "$DATABASE_KEY" ] || errexit "bundle not set" - git -C "$DATABASE" rm "$DATABASE_KEY" - git -C "$DATABASE" commit -m "remove bundle" - rm -f /usr/local/bin/docker - ln -s "$HOME/Library/Group Containers/group.com.docker/bin/docker" /usr/local/bin - echo "Bundle removed. Using dev versions may cause issues, a reset to factory defaults is recommended." - ;; -esac diff --git a/vendor/github.com/docker/docker/contrib/mkimage-alpine.sh b/vendor/github.com/docker/docker/contrib/mkimage-alpine.sh deleted file mode 100755 index 47cd35ce6..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage-alpine.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/sh - -set -e - -[ $(id -u) -eq 0 ] || { - printf >&2 '%s requires root\n' "$0" - exit 1 -} - -usage() { - printf >&2 '%s: [-r release] [-m mirror] [-s] [-c additional repository]\n' "$0" - exit 1 -} - -tmp() { - TMP=$(mktemp -d ${TMPDIR:-/var/tmp}/alpine-docker-XXXXXXXXXX) - ROOTFS=$(mktemp -d ${TMPDIR:-/var/tmp}/alpine-docker-rootfs-XXXXXXXXXX) - trap "rm -rf $TMP $ROOTFS" EXIT TERM INT -} - -apkv() { - curl -sSL $MAINREPO/$ARCH/APKINDEX.tar.gz | tar -Oxz | - grep --text '^P:apk-tools-static$' -A1 | tail -n1 | cut -d: -f2 -} - -getapk() { - curl -sSL $MAINREPO/$ARCH/apk-tools-static-$(apkv).apk | - tar -xz -C $TMP sbin/apk.static -} - -mkbase() { - $TMP/sbin/apk.static --repository $MAINREPO --update-cache --allow-untrusted \ - --root $ROOTFS --initdb add alpine-base -} - -conf() { - printf '%s\n' $MAINREPO > $ROOTFS/etc/apk/repositories - printf '%s\n' $ADDITIONALREPO >> $ROOTFS/etc/apk/repositories -} - -pack() { - local id - id=$(tar --numeric-owner -C $ROOTFS -c . | docker import - alpine:$REL) - - docker tag $id alpine:latest - docker run -i -t --rm alpine printf 'alpine:%s with id=%s created!\n' $REL $id -} - -save() { - [ $SAVE -eq 1 ] || return - - tar --numeric-owner -C $ROOTFS -c . | xz > rootfs.tar.xz -} - -while getopts "hr:m:s" opt; do - case $opt in - r) - REL=$OPTARG - ;; - m) - MIRROR=$OPTARG - ;; - s) - SAVE=1 - ;; - c) - ADDITIONALREPO=community - ;; - *) - usage - ;; - esac -done - -REL=${REL:-edge} -MIRROR=${MIRROR:-http://nl.alpinelinux.org/alpine} -SAVE=${SAVE:-0} -MAINREPO=$MIRROR/$REL/main -ADDITIONALREPO=$MIRROR/$REL/community -ARCH=${ARCH:-$(uname -m)} - -tmp -getapk -mkbase -conf -pack -save diff --git a/vendor/github.com/docker/docker/contrib/mkimage-arch-pacman.conf b/vendor/github.com/docker/docker/contrib/mkimage-arch-pacman.conf deleted file mode 100644 index 45fe03dc9..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage-arch-pacman.conf +++ /dev/null @@ -1,92 +0,0 @@ -# -# /etc/pacman.conf -# -# See the pacman.conf(5) manpage for option and repository directives - -# -# GENERAL OPTIONS -# -[options] -# The following paths are commented out with their default values listed. -# If you wish to use different paths, uncomment and update the paths. -#RootDir = / -#DBPath = /var/lib/pacman/ -#CacheDir = /var/cache/pacman/pkg/ -#LogFile = /var/log/pacman.log -#GPGDir = /etc/pacman.d/gnupg/ -HoldPkg = pacman glibc -#XferCommand = /usr/bin/curl -C - -f %u > %o -#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u -#CleanMethod = KeepInstalled -#UseDelta = 0.7 -Architecture = auto - -# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup -#IgnorePkg = -#IgnoreGroup = - -#NoUpgrade = -#NoExtract = - -# Misc options -#UseSyslog -#Color -#TotalDownload -# We cannot check disk space from within a chroot environment -#CheckSpace -#VerbosePkgLists - -# By default, pacman accepts packages signed by keys that its local keyring -# trusts (see pacman-key and its man page), as well as unsigned packages. -SigLevel = Required DatabaseOptional -LocalFileSigLevel = Optional -#RemoteFileSigLevel = Required - -# NOTE: You must run `pacman-key --init` before first using pacman; the local -# keyring can then be populated with the keys of all official Arch Linux -# packagers with `pacman-key --populate archlinux`. - -# -# REPOSITORIES -# - can be defined here or included from another file -# - pacman will search repositories in the order defined here -# - local/custom mirrors can be added here or in separate files -# - repositories listed first will take precedence when packages -# have identical names, regardless of version number -# - URLs will have $repo replaced by the name of the current repo -# - URLs will have $arch replaced by the name of the architecture -# -# Repository entries are of the format: -# [repo-name] -# Server = ServerName -# Include = IncludePath -# -# The header [repo-name] is crucial - it must be present and -# uncommented to enable the repo. -# - -# The testing repositories are disabled by default. To enable, uncomment the -# repo name header and Include lines. You can add preferred servers immediately -# after the header, and they will be used before the default mirrors. - -#[testing] -#Include = /etc/pacman.d/mirrorlist - -[core] -Include = /etc/pacman.d/mirrorlist - -[extra] -Include = /etc/pacman.d/mirrorlist - -#[community-testing] -#Include = /etc/pacman.d/mirrorlist - -[community] -Include = /etc/pacman.d/mirrorlist - -# An example of a custom package repository. See the pacman manpage for -# tips on creating your own repositories. -#[custom] -#SigLevel = Optional TrustAll -#Server = file:///home/custompkgs - diff --git a/vendor/github.com/docker/docker/contrib/mkimage-arch.sh b/vendor/github.com/docker/docker/contrib/mkimage-arch.sh deleted file mode 100755 index f94117712..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage-arch.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/env bash -# Generate a minimal filesystem for archlinux and load it into the local -# docker as "archlinux" -# requires root -set -e - -hash pacstrap &>/dev/null || { - echo "Could not find pacstrap. Run pacman -S arch-install-scripts" - exit 1 -} - -hash expect &>/dev/null || { - echo "Could not find expect. Run pacman -S expect" - exit 1 -} - - -export LANG="C.UTF-8" - -ROOTFS=$(mktemp -d ${TMPDIR:-/var/tmp}/rootfs-archlinux-XXXXXXXXXX) -chmod 755 $ROOTFS - -# packages to ignore for space savings -PKGIGNORE=( - cryptsetup - device-mapper - dhcpcd - iproute2 - jfsutils - linux - lvm2 - man-db - man-pages - mdadm - nano - netctl - openresolv - pciutils - pcmciautils - reiserfsprogs - s-nail - systemd-sysvcompat - usbutils - vi - xfsprogs -) -IFS=',' -PKGIGNORE="${PKGIGNORE[*]}" -unset IFS - -arch="$(uname -m)" -case "$arch" in - armv*) - if pacman -Q archlinuxarm-keyring >/dev/null 2>&1; then - pacman-key --init - pacman-key --populate archlinuxarm - else - echo "Could not find archlinuxarm-keyring. Please, install it and run pacman-key --populate archlinuxarm" - exit 1 - fi - PACMAN_CONF=$(mktemp ${TMPDIR:-/var/tmp}/pacman-conf-archlinux-XXXXXXXXX) - version="$(echo $arch | cut -c 5)" - sed "s/Architecture = armv/Architecture = armv${version}h/g" './mkimage-archarm-pacman.conf' > "${PACMAN_CONF}" - PACMAN_MIRRORLIST='Server = http://mirror.archlinuxarm.org/$arch/$repo' - PACMAN_EXTRA_PKGS='archlinuxarm-keyring' - EXPECT_TIMEOUT=1800 # Most armv* based devices can be very slow (e.g. RPiv1) - ARCH_KEYRING=archlinuxarm - DOCKER_IMAGE_NAME="armv${version}h/archlinux" - ;; - *) - PACMAN_CONF='./mkimage-arch-pacman.conf' - PACMAN_MIRRORLIST='Server = https://mirrors.kernel.org/archlinux/$repo/os/$arch' - PACMAN_EXTRA_PKGS='' - EXPECT_TIMEOUT=60 - ARCH_KEYRING=archlinux - DOCKER_IMAGE_NAME=archlinux - ;; -esac - -export PACMAN_MIRRORLIST - -expect < $ROOTFS/etc/locale.gen -arch-chroot $ROOTFS locale-gen -arch-chroot $ROOTFS /bin/sh -c 'echo $PACMAN_MIRRORLIST > /etc/pacman.d/mirrorlist' - -# udev doesn't work in containers, rebuild /dev -DEV=$ROOTFS/dev -rm -rf $DEV -mkdir -p $DEV -mknod -m 666 $DEV/null c 1 3 -mknod -m 666 $DEV/zero c 1 5 -mknod -m 666 $DEV/random c 1 8 -mknod -m 666 $DEV/urandom c 1 9 -mkdir -m 755 $DEV/pts -mkdir -m 1777 $DEV/shm -mknod -m 666 $DEV/tty c 5 0 -mknod -m 600 $DEV/console c 5 1 -mknod -m 666 $DEV/tty0 c 4 0 -mknod -m 666 $DEV/full c 1 7 -mknod -m 600 $DEV/initctl p -mknod -m 666 $DEV/ptmx c 5 2 -ln -sf /proc/self/fd $DEV/fd - -tar --numeric-owner --xattrs --acls -C $ROOTFS -c . | docker import - $DOCKER_IMAGE_NAME -docker run --rm -t $DOCKER_IMAGE_NAME echo Success. -rm -rf $ROOTFS diff --git a/vendor/github.com/docker/docker/contrib/mkimage-archarm-pacman.conf b/vendor/github.com/docker/docker/contrib/mkimage-archarm-pacman.conf deleted file mode 100644 index f4b45f54d..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage-archarm-pacman.conf +++ /dev/null @@ -1,98 +0,0 @@ -# -# /etc/pacman.conf -# -# See the pacman.conf(5) manpage for option and repository directives - -# -# GENERAL OPTIONS -# -[options] -# The following paths are commented out with their default values listed. -# If you wish to use different paths, uncomment and update the paths. -#RootDir = / -#DBPath = /var/lib/pacman/ -#CacheDir = /var/cache/pacman/pkg/ -#LogFile = /var/log/pacman.log -#GPGDir = /etc/pacman.d/gnupg/ -HoldPkg = pacman glibc -#XferCommand = /usr/bin/curl -C - -f %u > %o -#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u -#CleanMethod = KeepInstalled -#UseDelta = 0.7 -Architecture = armv - -# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup -#IgnorePkg = -#IgnoreGroup = - -#NoUpgrade = -#NoExtract = - -# Misc options -#UseSyslog -#Color -#TotalDownload -# We cannot check disk space from within a chroot environment -#CheckSpace -#VerbosePkgLists - -# By default, pacman accepts packages signed by keys that its local keyring -# trusts (see pacman-key and its man page), as well as unsigned packages. -SigLevel = Required DatabaseOptional -LocalFileSigLevel = Optional -#RemoteFileSigLevel = Required - -# NOTE: You must run `pacman-key --init` before first using pacman; the local -# keyring can then be populated with the keys of all official Arch Linux -# packagers with `pacman-key --populate archlinux`. - -# -# REPOSITORIES -# - can be defined here or included from another file -# - pacman will search repositories in the order defined here -# - local/custom mirrors can be added here or in separate files -# - repositories listed first will take precedence when packages -# have identical names, regardless of version number -# - URLs will have $repo replaced by the name of the current repo -# - URLs will have $arch replaced by the name of the architecture -# -# Repository entries are of the format: -# [repo-name] -# Server = ServerName -# Include = IncludePath -# -# The header [repo-name] is crucial - it must be present and -# uncommented to enable the repo. -# - -# The testing repositories are disabled by default. To enable, uncomment the -# repo name header and Include lines. You can add preferred servers immediately -# after the header, and they will be used before the default mirrors. - -#[testing] -#Include = /etc/pacman.d/mirrorlist - -[core] -Include = /etc/pacman.d/mirrorlist - -[extra] -Include = /etc/pacman.d/mirrorlist - -#[community-testing] -#Include = /etc/pacman.d/mirrorlist - -[community] -Include = /etc/pacman.d/mirrorlist - -[alarm] -Include = /etc/pacman.d/mirrorlist - -[aur] -Include = /etc/pacman.d/mirrorlist - -# An example of a custom package repository. See the pacman manpage for -# tips on creating your own repositories. -#[custom] -#SigLevel = Optional TrustAll -#Server = file:///home/custompkgs - diff --git a/vendor/github.com/docker/docker/contrib/mkimage-busybox.sh b/vendor/github.com/docker/docker/contrib/mkimage-busybox.sh deleted file mode 100755 index b11a6bb26..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage-busybox.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env bash -# Generate a very minimal filesystem based on busybox-static, -# and load it into the local docker under the name "busybox". - -echo >&2 -echo >&2 'warning: this script is deprecated - see mkimage.sh and mkimage/busybox-static' -echo >&2 - -BUSYBOX=$(which busybox) -[ "$BUSYBOX" ] || { - echo "Sorry, I could not locate busybox." - echo "Try 'apt-get install busybox-static'?" - exit 1 -} - -set -e -ROOTFS=${TMPDIR:-/var/tmp}/rootfs-busybox-$$-$RANDOM -mkdir $ROOTFS -cd $ROOTFS - -mkdir bin etc dev dev/pts lib proc sys tmp -touch etc/resolv.conf -cp /etc/nsswitch.conf etc/nsswitch.conf -echo root:x:0:0:root:/:/bin/sh > etc/passwd -echo root:x:0: > etc/group -ln -s lib lib64 -ln -s bin sbin -cp $BUSYBOX bin -for X in $(busybox --list) -do - ln -s busybox bin/$X -done -rm bin/init -ln bin/busybox bin/init -cp /lib/x86_64-linux-gnu/lib{pthread,c,dl,nsl,nss_*}.so.* lib -cp /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 lib -for X in console null ptmx random stdin stdout stderr tty urandom zero -do - cp -a /dev/$X dev -done - -tar --numeric-owner -cf- . | docker import - busybox -docker run -i -u root busybox /bin/echo Success. diff --git a/vendor/github.com/docker/docker/contrib/mkimage-crux.sh b/vendor/github.com/docker/docker/contrib/mkimage-crux.sh deleted file mode 100755 index 3f0bdcae3..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage-crux.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env bash -# Generate a minimal filesystem for CRUX/Linux and load it into the local -# docker as "cruxlinux" -# requires root and the crux iso (http://crux.nu) - -set -e - -die () { - echo >&2 "$@" - exit 1 -} - -[ "$#" -eq 1 ] || die "1 argument(s) required, $# provided. Usage: ./mkimage-crux.sh /path/to/iso" - -ISO=${1} - -ROOTFS=$(mktemp -d ${TMPDIR:-/var/tmp}/rootfs-crux-XXXXXXXXXX) -CRUX=$(mktemp -d ${TMPDIR:-/var/tmp}/crux-XXXXXXXXXX) -TMP=$(mktemp -d ${TMPDIR:-/var/tmp}/XXXXXXXXXX) - -VERSION=$(basename --suffix=.iso $ISO | sed 's/[^0-9.]*\([0-9.]*\).*/\1/') - -# Mount the ISO -mount -o ro,loop $ISO $CRUX - -# Extract pkgutils -tar -C $TMP -xf $CRUX/tools/pkgutils#*.pkg.tar.gz - -# Put pkgadd in the $PATH -export PATH="$TMP/usr/bin:$PATH" - -# Install core packages -mkdir -p $ROOTFS/var/lib/pkg -touch $ROOTFS/var/lib/pkg/db -for pkg in $CRUX/crux/core/*; do - pkgadd -r $ROOTFS $pkg -done - -# Remove agetty and inittab config -if (grep agetty ${ROOTFS}/etc/inittab 2>&1 > /dev/null); then - echo "Removing agetty from /etc/inittab ..." - chroot ${ROOTFS} sed -i -e "/agetty/d" /etc/inittab - chroot ${ROOTFS} sed -i -e "/shutdown/d" /etc/inittab - chroot ${ROOTFS} sed -i -e "/^$/N;/^\n$/d" /etc/inittab -fi - -# Remove kernel source -rm -rf $ROOTFS/usr/src/* - -# udev doesn't work in containers, rebuild /dev -DEV=$ROOTFS/dev -rm -rf $DEV -mkdir -p $DEV -mknod -m 666 $DEV/null c 1 3 -mknod -m 666 $DEV/zero c 1 5 -mknod -m 666 $DEV/random c 1 8 -mknod -m 666 $DEV/urandom c 1 9 -mkdir -m 755 $DEV/pts -mkdir -m 1777 $DEV/shm -mknod -m 666 $DEV/tty c 5 0 -mknod -m 600 $DEV/console c 5 1 -mknod -m 666 $DEV/tty0 c 4 0 -mknod -m 666 $DEV/full c 1 7 -mknod -m 600 $DEV/initctl p -mknod -m 666 $DEV/ptmx c 5 2 - -IMAGE_ID=$(tar --numeric-owner -C $ROOTFS -c . | docker import - crux:$VERSION) -docker tag $IMAGE_ID crux:latest -docker run -i -t crux echo Success. - -# Cleanup -umount $CRUX -rm -rf $ROOTFS -rm -rf $CRUX -rm -rf $TMP diff --git a/vendor/github.com/docker/docker/contrib/mkimage-debootstrap.sh b/vendor/github.com/docker/docker/contrib/mkimage-debootstrap.sh deleted file mode 100755 index 412a5ce0a..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage-debootstrap.sh +++ /dev/null @@ -1,297 +0,0 @@ -#!/usr/bin/env bash -set -e - -echo >&2 -echo >&2 'warning: this script is deprecated - see mkimage.sh and mkimage/debootstrap' -echo >&2 - -variant='minbase' -include='iproute,iputils-ping' -arch='amd64' # intentionally undocumented for now -skipDetection= -strictDebootstrap= -justTar= - -usage() { - echo >&2 - - echo >&2 "usage: $0 [options] repo suite [mirror]" - - echo >&2 - echo >&2 'options: (not recommended)' - echo >&2 " -p set an http_proxy for debootstrap" - echo >&2 " -v $variant # change default debootstrap variant" - echo >&2 " -i $include # change default package includes" - echo >&2 " -d # strict debootstrap (do not apply any docker-specific tweaks)" - echo >&2 " -s # skip version detection and tagging (ie, precise also tagged as 12.04)" - echo >&2 " # note that this will also skip adding universe and/or security/updates to sources.list" - echo >&2 " -t # just create a tarball, especially for dockerbrew (uses repo as tarball name)" - - echo >&2 - echo >&2 " ie: $0 username/debian squeeze" - echo >&2 " $0 username/debian squeeze http://ftp.uk.debian.org/debian/" - - echo >&2 - echo >&2 " ie: $0 username/ubuntu precise" - echo >&2 " $0 username/ubuntu precise http://mirrors.melbourne.co.uk/ubuntu/" - - echo >&2 - echo >&2 " ie: $0 -t precise.tar.bz2 precise" - echo >&2 " $0 -t wheezy.tgz wheezy" - echo >&2 " $0 -t wheezy-uk.tar.xz wheezy http://ftp.uk.debian.org/debian/" - - echo >&2 -} - -# these should match the names found at http://www.debian.org/releases/ -debianStable=wheezy -debianUnstable=sid -# this should match the name found at http://releases.ubuntu.com/ -ubuntuLatestLTS=trusty -# this should match the name found at http://releases.tanglu.org/ -tangluLatest=aequorea - -while getopts v:i:a:p:dst name; do - case "$name" in - p) - http_proxy="$OPTARG" - ;; - v) - variant="$OPTARG" - ;; - i) - include="$OPTARG" - ;; - a) - arch="$OPTARG" - ;; - d) - strictDebootstrap=1 - ;; - s) - skipDetection=1 - ;; - t) - justTar=1 - ;; - ?) - usage - exit 0 - ;; - esac -done -shift $(($OPTIND - 1)) - -repo="$1" -suite="$2" -mirror="${3:-}" # stick to the default debootstrap mirror if one is not provided - -if [ ! "$repo" ] || [ ! "$suite" ]; then - usage - exit 1 -fi - -# some rudimentary detection for whether we need to "sudo" our docker calls -docker='' -if docker version > /dev/null 2>&1; then - docker='docker' -elif sudo docker version > /dev/null 2>&1; then - docker='sudo docker' -elif command -v docker > /dev/null 2>&1; then - docker='docker' -else - echo >&2 "warning: either docker isn't installed, or your current user cannot run it;" - echo >&2 " this script is not likely to work as expected" - sleep 3 - docker='docker' # give us a command-not-found later -fi - -# make sure we have an absolute path to our final tarball so we can still reference it properly after we change directory -if [ "$justTar" ]; then - if [ ! -d "$(dirname "$repo")" ]; then - echo >&2 "error: $(dirname "$repo") does not exist" - exit 1 - fi - repo="$(cd "$(dirname "$repo")" && pwd -P)/$(basename "$repo")" -fi - -# will be filled in later, if [ -z "$skipDetection" ] -lsbDist='' - -target="${TMPDIR:-/var/tmp}/docker-rootfs-debootstrap-$suite-$$-$RANDOM" - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" -returnTo="$(pwd -P)" - -if [ "$suite" = 'lucid' ]; then - # lucid fails and doesn't include gpgv in minbase; "apt-get update" fails - include+=',gpgv' -fi - -set -x - -# bootstrap -mkdir -p "$target" -sudo http_proxy=$http_proxy debootstrap --verbose --variant="$variant" --include="$include" --arch="$arch" "$suite" "$target" "$mirror" - -cd "$target" - -if [ -z "$strictDebootstrap" ]; then - # prevent init scripts from running during install/update - # policy-rc.d (for most scripts) - echo $'#!/bin/sh\nexit 101' | sudo tee usr/sbin/policy-rc.d > /dev/null - sudo chmod +x usr/sbin/policy-rc.d - # initctl (for some pesky upstart scripts) - sudo chroot . dpkg-divert --local --rename --add /sbin/initctl - sudo ln -sf /bin/true sbin/initctl - # see https://github.com/docker/docker/issues/446#issuecomment-16953173 - - # shrink the image, since apt makes us fat (wheezy: ~157.5MB vs ~120MB) - sudo chroot . apt-get clean - - if strings usr/bin/dpkg | grep -q unsafe-io; then - # while we're at it, apt is unnecessarily slow inside containers - # this forces dpkg not to call sync() after package extraction and speeds up install - # the benefit is huge on spinning disks, and the penalty is nonexistent on SSD or decent server virtualization - echo 'force-unsafe-io' | sudo tee etc/dpkg/dpkg.cfg.d/02apt-speedup > /dev/null - # we have this wrapped up in an "if" because the "force-unsafe-io" - # option was added in dpkg 1.15.8.6 - # (see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=584254#82), - # and ubuntu lucid/10.04 only has 1.15.5.6 - fi - - # we want to effectively run "apt-get clean" after every install to keep images small (see output of "apt-get clean -s" for context) - { - aptGetClean='"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true";' - echo "DPkg::Post-Invoke { ${aptGetClean} };" - echo "APT::Update::Post-Invoke { ${aptGetClean} };" - echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' - } | sudo tee etc/apt/apt.conf.d/no-cache > /dev/null - - # and remove the translations, too - echo 'Acquire::Languages "none";' | sudo tee etc/apt/apt.conf.d/no-languages > /dev/null - - # helpful undo lines for each the above tweaks (for lack of a better home to keep track of them): - # rm /usr/sbin/policy-rc.d - # rm /sbin/initctl; dpkg-divert --rename --remove /sbin/initctl - # rm /etc/dpkg/dpkg.cfg.d/02apt-speedup - # rm /etc/apt/apt.conf.d/no-cache - # rm /etc/apt/apt.conf.d/no-languages - - if [ -z "$skipDetection" ]; then - # see also rudimentary platform detection in hack/install.sh - lsbDist='' - if [ -r etc/lsb-release ]; then - lsbDist="$(. etc/lsb-release && echo "$DISTRIB_ID")" - fi - if [ -z "$lsbDist" ] && [ -r etc/debian_version ]; then - lsbDist='Debian' - fi - - case "$lsbDist" in - Debian) - # add the updates and security repositories - if [ "$suite" != "$debianUnstable" -a "$suite" != 'unstable' ]; then - # ${suite}-updates only applies to non-unstable - sudo sed -i "p; s/ $suite main$/ ${suite}-updates main/" etc/apt/sources.list - - # same for security updates - echo "deb http://security.debian.org/ $suite/updates main" | sudo tee -a etc/apt/sources.list > /dev/null - fi - ;; - Ubuntu) - # add the universe, updates, and security repositories - sudo sed -i " - s/ $suite main$/ $suite main universe/; p; - s/ $suite main/ ${suite}-updates main/; p; - s/ $suite-updates main/ ${suite}-security main/ - " etc/apt/sources.list - ;; - Tanglu) - # add the updates repository - if [ "$suite" = "$tangluLatest" ]; then - # ${suite}-updates only applies to stable Tanglu versions - sudo sed -i "p; s/ $suite main$/ ${suite}-updates main/" etc/apt/sources.list - fi - ;; - SteamOS) - # add contrib and non-free - sudo sed -i "s/ $suite main$/ $suite main contrib non-free/" etc/apt/sources.list - ;; - esac - fi - - # make sure our packages lists are as up to date as we can get them - sudo chroot . apt-get update - sudo chroot . apt-get dist-upgrade -y -fi - -if [ "$justTar" ]; then - # create the tarball file so it has the right permissions (ie, not root) - touch "$repo" - - # fill the tarball - sudo tar --numeric-owner -caf "$repo" . -else - # create the image (and tag $repo:$suite) - sudo tar --numeric-owner -c . | $docker import - $repo:$suite - - # test the image - $docker run -i -t $repo:$suite echo success - - if [ -z "$skipDetection" ]; then - case "$lsbDist" in - Debian) - if [ "$suite" = "$debianStable" -o "$suite" = 'stable' ] && [ -r etc/debian_version ]; then - # tag latest - $docker tag $repo:$suite $repo:latest - - if [ -r etc/debian_version ]; then - # tag the specific debian release version (which is only reasonable to tag on debian stable) - ver=$(cat etc/debian_version) - $docker tag $repo:$suite $repo:$ver - fi - fi - ;; - Ubuntu) - if [ "$suite" = "$ubuntuLatestLTS" ]; then - # tag latest - $docker tag $repo:$suite $repo:latest - fi - if [ -r etc/lsb-release ]; then - lsbRelease="$(. etc/lsb-release && echo "$DISTRIB_RELEASE")" - if [ "$lsbRelease" ]; then - # tag specific Ubuntu version number, if available (12.04, etc.) - $docker tag $repo:$suite $repo:$lsbRelease - fi - fi - ;; - Tanglu) - if [ "$suite" = "$tangluLatest" ]; then - # tag latest - $docker tag $repo:$suite $repo:latest - fi - if [ -r etc/lsb-release ]; then - lsbRelease="$(. etc/lsb-release && echo "$DISTRIB_RELEASE")" - if [ "$lsbRelease" ]; then - # tag specific Tanglu version number, if available (1.0, 2.0, etc.) - $docker tag $repo:$suite $repo:$lsbRelease - fi - fi - ;; - SteamOS) - if [ -r etc/lsb-release ]; then - lsbRelease="$(. etc/lsb-release && echo "$DISTRIB_RELEASE")" - if [ "$lsbRelease" ]; then - # tag specific SteamOS version number, if available (1.0, 2.0, etc.) - $docker tag $repo:$suite $repo:$lsbRelease - fi - fi - ;; - esac - fi -fi - -# cleanup -cd "$returnTo" -sudo rm -rf "$target" diff --git a/vendor/github.com/docker/docker/contrib/mkimage-pld.sh b/vendor/github.com/docker/docker/contrib/mkimage-pld.sh deleted file mode 100755 index 615c2030a..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage-pld.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/sh -# -# Generate a minimal filesystem for PLD Linux and load it into the local docker as "pld". -# https://www.pld-linux.org/packages/docker -# -set -e - -if [ "$(id -u)" != "0" ]; then - echo >&2 "$0: requires root" - exit 1 -fi - -image_name=pld - -tmpdir=$(mktemp -d ${TMPDIR:-/var/tmp}/pld-docker-XXXXXX) -root=$tmpdir/rootfs -install -d -m 755 $root - -# to clean up: -docker rmi $image_name || : - -# build -rpm -r $root --initdb - -set +e -install -d $root/dev/pts -mknod $root/dev/random c 1 8 -m 644 -mknod $root/dev/urandom c 1 9 -m 644 -mknod $root/dev/full c 1 7 -m 666 -mknod $root/dev/null c 1 3 -m 666 -mknod $root/dev/zero c 1 5 -m 666 -mknod $root/dev/console c 5 1 -m 660 -set -e - -poldek -r $root --up --noask -u \ - --noignore \ - -O 'rpmdef=_install_langs C' \ - -O 'rpmdef=_excludedocs 1' \ - vserver-packages \ - bash iproute2 coreutils grep poldek - -# fix netsharedpath, so containers would be able to install when some paths are mounted -sed -i -e 's;^#%_netsharedpath.*;%_netsharedpath /dev/shm:/sys:/proc:/dev:/etc/hostname;' $root/etc/rpm/macros - -# no need for alternatives -poldek-config -c $root/etc/poldek/poldek.conf ignore systemd-init - -# this makes initscripts to believe network is up -touch $root/var/lock/subsys/network - -# cleanup large optional packages -remove_packages="ca-certificates" -for pkg in $remove_packages; do - rpm -r $root -q $pkg && rpm -r $root -e $pkg --nodeps -done - -# cleanup more -rm -v $root/etc/ld.so.cache -rm -rfv $root/var/cache/hrmib/* -rm -rfv $root/usr/share/man/man?/* -rm -rfv $root/usr/share/locale/*/ -rm -rfv $root/usr/share/help/*/ -rm -rfv $root/usr/share/doc/* -rm -rfv $root/usr/src/examples/* -rm -rfv $root/usr/share/pixmaps/* - -# and import -tar --numeric-owner --xattrs --acls -C $root -c . | docker import - $image_name - -# and test -docker run -i -u root $image_name /bin/echo Success. - -rm -r $tmpdir diff --git a/vendor/github.com/docker/docker/contrib/mkimage-rinse.sh b/vendor/github.com/docker/docker/contrib/mkimage-rinse.sh deleted file mode 100755 index 7e0935062..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage-rinse.sh +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env bash -# -# Create a base CentOS Docker image. - -# This script is useful on systems with rinse available (e.g., -# building a CentOS image on Debian). See contrib/mkimage-yum.sh for -# a way to build CentOS images on systems with yum installed. - -set -e - -echo >&2 -echo >&2 'warning: this script is deprecated - see mkimage.sh and mkimage/rinse' -echo >&2 - -repo="$1" -distro="$2" -mirror="$3" - -if [ ! "$repo" ] || [ ! "$distro" ]; then - self="$(basename $0)" - echo >&2 "usage: $self repo distro [mirror]" - echo >&2 - echo >&2 " ie: $self username/centos centos-5" - echo >&2 " $self username/centos centos-6" - echo >&2 - echo >&2 " ie: $self username/slc slc-5" - echo >&2 " $self username/slc slc-6" - echo >&2 - echo >&2 " ie: $self username/centos centos-5 http://vault.centos.org/5.8/os/x86_64/CentOS/" - echo >&2 " $self username/centos centos-6 http://vault.centos.org/6.3/os/x86_64/Packages/" - echo >&2 - echo >&2 'See /etc/rinse for supported values of "distro" and for examples of' - echo >&2 ' expected values of "mirror".' - echo >&2 - echo >&2 'This script is tested to work with the original upstream version of rinse,' - echo >&2 ' found at http://www.steve.org.uk/Software/rinse/ and also in Debian at' - echo >&2 ' http://packages.debian.org/wheezy/rinse -- as always, YMMV.' - echo >&2 - exit 1 -fi - -target="${TMPDIR:-/var/tmp}/docker-rootfs-rinse-$distro-$$-$RANDOM" - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" -returnTo="$(pwd -P)" - -rinseArgs=( --arch amd64 --distribution "$distro" --directory "$target" ) -if [ "$mirror" ]; then - rinseArgs+=( --mirror "$mirror" ) -fi - -set -x - -mkdir -p "$target" - -sudo rinse "${rinseArgs[@]}" - -cd "$target" - -# rinse fails a little at setting up /dev, so we'll just wipe it out and create our own -sudo rm -rf dev -sudo mkdir -m 755 dev -( - cd dev - sudo ln -sf /proc/self/fd ./ - sudo mkdir -m 755 pts - sudo mkdir -m 1777 shm - sudo mknod -m 600 console c 5 1 - sudo mknod -m 600 initctl p - sudo mknod -m 666 full c 1 7 - sudo mknod -m 666 null c 1 3 - sudo mknod -m 666 ptmx c 5 2 - sudo mknod -m 666 random c 1 8 - sudo mknod -m 666 tty c 5 0 - sudo mknod -m 666 tty0 c 4 0 - sudo mknod -m 666 urandom c 1 9 - sudo mknod -m 666 zero c 1 5 -) - -# effectively: febootstrap-minimize --keep-zoneinfo --keep-rpmdb --keep-services "$target" -# locales -sudo rm -rf usr/{{lib,share}/locale,{lib,lib64}/gconv,bin/localedef,sbin/build-locale-archive} -# docs and man pages -sudo rm -rf usr/share/{man,doc,info,gnome/help} -# cracklib -sudo rm -rf usr/share/cracklib -# i18n -sudo rm -rf usr/share/i18n -# yum cache -sudo rm -rf var/cache/yum -sudo mkdir -p --mode=0755 var/cache/yum -# sln -sudo rm -rf sbin/sln -# ldconfig -#sudo rm -rf sbin/ldconfig -sudo rm -rf etc/ld.so.cache var/cache/ldconfig -sudo mkdir -p --mode=0755 var/cache/ldconfig - -# allow networking init scripts inside the container to work without extra steps -echo 'NETWORKING=yes' | sudo tee etc/sysconfig/network > /dev/null - -# to restore locales later: -# yum reinstall glibc-common - -version= -if [ -r etc/redhat-release ]; then - version="$(sed -E 's/^[^0-9.]*([0-9.]+).*$/\1/' etc/redhat-release)" -elif [ -r etc/SuSE-release ]; then - version="$(awk '/^VERSION/ { print $3 }' etc/SuSE-release)" -fi - -if [ -z "$version" ]; then - echo >&2 "warning: cannot autodetect OS version, using $distro as tag" - sleep 20 - version="$distro" -fi - -sudo tar --numeric-owner -c . | docker import - $repo:$version - -docker run -i -t $repo:$version echo success - -cd "$returnTo" -sudo rm -rf "$target" diff --git a/vendor/github.com/docker/docker/contrib/mkimage-yum.sh b/vendor/github.com/docker/docker/contrib/mkimage-yum.sh deleted file mode 100755 index 29da17048..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage-yum.sh +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env bash -# -# Create a base CentOS Docker image. -# -# This script is useful on systems with yum installed (e.g., building -# a CentOS image on CentOS). See contrib/mkimage-rinse.sh for a way -# to build CentOS images on other systems. - -set -e - -usage() { - cat < -OPTIONS: - -p "" The list of packages to install in the container. - The default is blank. - -g "" The groups of packages to install in the container. - The default is "Core". - -y The path to the yum config to install packages from. The - default is /etc/yum.conf for Centos/RHEL and /etc/dnf/dnf.conf for Fedora -EOOPTS - exit 1 -} - -# option defaults -yum_config=/etc/yum.conf -if [ -f /etc/dnf/dnf.conf ] && command -v dnf &> /dev/null; then - yum_config=/etc/dnf/dnf.conf - alias yum=dnf -fi -install_groups="Core" -while getopts ":y:p:g:h" opt; do - case $opt in - y) - yum_config=$OPTARG - ;; - h) - usage - ;; - p) - install_packages="$OPTARG" - ;; - g) - install_groups="$OPTARG" - ;; - \?) - echo "Invalid option: -$OPTARG" - usage - ;; - esac -done -shift $((OPTIND - 1)) -name=$1 - -if [[ -z $name ]]; then - usage -fi - -target=$(mktemp -d --tmpdir $(basename $0).XXXXXX) - -set -x - -mkdir -m 755 "$target"/dev -mknod -m 600 "$target"/dev/console c 5 1 -mknod -m 600 "$target"/dev/initctl p -mknod -m 666 "$target"/dev/full c 1 7 -mknod -m 666 "$target"/dev/null c 1 3 -mknod -m 666 "$target"/dev/ptmx c 5 2 -mknod -m 666 "$target"/dev/random c 1 8 -mknod -m 666 "$target"/dev/tty c 5 0 -mknod -m 666 "$target"/dev/tty0 c 4 0 -mknod -m 666 "$target"/dev/urandom c 1 9 -mknod -m 666 "$target"/dev/zero c 1 5 - -# amazon linux yum will fail without vars set -if [ -d /etc/yum/vars ]; then - mkdir -p -m 755 "$target"/etc/yum - cp -a /etc/yum/vars "$target"/etc/yum/ -fi - -if [[ -n "$install_groups" ]]; -then - yum -c "$yum_config" --installroot="$target" --releasever=/ --setopt=tsflags=nodocs \ - --setopt=group_package_types=mandatory -y groupinstall $install_groups -fi - -if [[ -n "$install_packages" ]]; -then - yum -c "$yum_config" --installroot="$target" --releasever=/ --setopt=tsflags=nodocs \ - --setopt=group_package_types=mandatory -y install $install_packages -fi - -yum -c "$yum_config" --installroot="$target" -y clean all - -cat > "$target"/etc/sysconfig/network <&2 "warning: cannot autodetect OS version, using '$name' as tag" - version=$name -fi - -tar --numeric-owner -c -C "$target" . | docker import - $name:$version - -docker run -i -t --rm $name:$version /bin/bash -c 'echo success' - -rm -rf "$target" diff --git a/vendor/github.com/docker/docker/contrib/mkimage.sh b/vendor/github.com/docker/docker/contrib/mkimage.sh deleted file mode 100755 index 13298c803..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env bash -set -e - -mkimg="$(basename "$0")" - -usage() { - echo >&2 "usage: $mkimg [-d dir] [-t tag] [--compression algo| --no-compression] script [script-args]" - echo >&2 " ie: $mkimg -t someuser/debian debootstrap --variant=minbase jessie" - echo >&2 " $mkimg -t someuser/ubuntu debootstrap --include=ubuntu-minimal --components=main,universe trusty" - echo >&2 " $mkimg -t someuser/busybox busybox-static" - echo >&2 " $mkimg -t someuser/centos:5 rinse --distribution centos-5" - echo >&2 " $mkimg -t someuser/mageia:4 mageia-urpmi --version=4" - echo >&2 " $mkimg -t someuser/mageia:4 mageia-urpmi --version=4 --mirror=http://somemirror/" - echo >&2 " $mkimg -t someuser/solaris solaris" - exit 1 -} - -scriptDir="$(dirname "$(readlink -f "$BASH_SOURCE")")/mkimage" - -os= -os=$(uname -o) - -# set up path to gnu tools if solaris -[[ $os == "Solaris" ]] && export PATH=/usr/gnu/bin:$PATH -# TODO check for gnu-tar, gnu-getopt - -# TODO requires root/sudo due to some pkg operations. sigh. -[[ $os == "Solaris" && $EUID != "0" ]] && echo >&2 "image create on Solaris requires superuser privilege" - -optTemp=$(getopt --options '+d:t:c:hC' --longoptions 'dir:,tag:,compression:,no-compression,help' --name "$mkimg" -- "$@") -eval set -- "$optTemp" -unset optTemp - -dir= -tag= -compression="auto" -while true; do - case "$1" in - -d|--dir) dir="$2" ; shift 2 ;; - -t|--tag) tag="$2" ; shift 2 ;; - --compression) compression="$2" ; shift 2 ;; - --no-compression) compression="none" ; shift 1 ;; - -h|--help) usage ;; - --) shift ; break ;; - esac -done - -script="$1" -[ "$script" ] || usage -shift - -if [ "$compression" == 'auto' ] || [ -z "$compression" ] -then - compression='xz' -fi - -[ "$compression" == 'none' ] && compression='' - -if [ ! -x "$scriptDir/$script" ]; then - echo >&2 "error: $script does not exist or is not executable" - echo >&2 " see $scriptDir for possible scripts" - exit 1 -fi - -# don't mistake common scripts like .febootstrap-minimize as image-creators -if [[ "$script" == .* ]]; then - echo >&2 "error: $script is a script helper, not a script" - echo >&2 " see $scriptDir for possible scripts" - exit 1 -fi - -delDir= -if [ -z "$dir" ]; then - dir="$(mktemp -d ${TMPDIR:-/var/tmp}/docker-mkimage.XXXXXXXXXX)" - delDir=1 -fi - -rootfsDir="$dir/rootfs" -( set -x; mkdir -p "$rootfsDir" ) - -# pass all remaining arguments to $script -"$scriptDir/$script" "$rootfsDir" "$@" - -# Docker mounts tmpfs at /dev and procfs at /proc so we can remove them -rm -rf "$rootfsDir/dev" "$rootfsDir/proc" -mkdir -p "$rootfsDir/dev" "$rootfsDir/proc" - -# make sure /etc/resolv.conf has something useful in it -mkdir -p "$rootfsDir/etc" -cat > "$rootfsDir/etc/resolv.conf" <<'EOF' -nameserver 8.8.8.8 -nameserver 8.8.4.4 -EOF - -tarFile="$dir/rootfs.tar${compression:+.$compression}" -touch "$tarFile" - -( - set -x - tar --numeric-owner --create --auto-compress --file "$tarFile" --directory "$rootfsDir" --transform='s,^./,,' . -) - -echo >&2 "+ cat > '$dir/Dockerfile'" -cat > "$dir/Dockerfile" <> "$dir/Dockerfile" ) - break - fi -done - -( set -x; rm -rf "$rootfsDir" ) - -if [ "$tag" ]; then - ( set -x; docker build -t "$tag" "$dir" ) -elif [ "$delDir" ]; then - # if we didn't specify a tag and we're going to delete our dir, let's just build an untagged image so that we did _something_ - ( set -x; docker build "$dir" ) -fi - -if [ "$delDir" ]; then - ( set -x; rm -rf "$dir" ) -fi diff --git a/vendor/github.com/docker/docker/contrib/mkimage/.febootstrap-minimize b/vendor/github.com/docker/docker/contrib/mkimage/.febootstrap-minimize deleted file mode 100755 index 7749e63fb..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage/.febootstrap-minimize +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash -set -e - -rootfsDir="$1" -shift - -( - cd "$rootfsDir" - - # effectively: febootstrap-minimize --keep-zoneinfo --keep-rpmdb --keep-services "$target" - # locales - rm -rf usr/{{lib,share}/locale,{lib,lib64}/gconv,bin/localedef,sbin/build-locale-archive} - # docs and man pages - rm -rf usr/share/{man,doc,info,gnome/help} - # cracklib - rm -rf usr/share/cracklib - # i18n - rm -rf usr/share/i18n - # yum cache - rm -rf var/cache/yum - mkdir -p --mode=0755 var/cache/yum - # sln - rm -rf sbin/sln - # ldconfig - #rm -rf sbin/ldconfig - rm -rf etc/ld.so.cache var/cache/ldconfig - mkdir -p --mode=0755 var/cache/ldconfig -) diff --git a/vendor/github.com/docker/docker/contrib/mkimage/busybox-static b/vendor/github.com/docker/docker/contrib/mkimage/busybox-static deleted file mode 100755 index e15322b49..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage/busybox-static +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash -set -e - -rootfsDir="$1" -shift - -busybox="$(which busybox 2>/dev/null || true)" -if [ -z "$busybox" ]; then - echo >&2 'error: busybox: not found' - echo >&2 ' install it with your distribution "busybox-static" package' - exit 1 -fi -if ! ldd "$busybox" 2>&1 | grep -q 'not a dynamic executable'; then - echo >&2 "error: '$busybox' appears to be a dynamic executable" - echo >&2 ' you should install your distribution "busybox-static" package instead' - exit 1 -fi - -mkdir -p "$rootfsDir/bin" -rm -f "$rootfsDir/bin/busybox" # just in case -cp "$busybox" "$rootfsDir/bin/busybox" - -( - cd "$rootfsDir" - - IFS=$'\n' - modules=( $(bin/busybox --list-modules) ) - unset IFS - - for module in "${modules[@]}"; do - mkdir -p "$(dirname "$module")" - ln -sf /bin/busybox "$module" - done -) diff --git a/vendor/github.com/docker/docker/contrib/mkimage/debootstrap b/vendor/github.com/docker/docker/contrib/mkimage/debootstrap deleted file mode 100755 index 7d56d8ea9..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage/debootstrap +++ /dev/null @@ -1,226 +0,0 @@ -#!/usr/bin/env bash -set -e - -rootfsDir="$1" -shift - -# we have to do a little fancy footwork to make sure "rootfsDir" becomes the second non-option argument to debootstrap - -before=() -while [ $# -gt 0 ] && [[ "$1" == -* ]]; do - before+=( "$1" ) - shift -done - -suite="$1" -shift - -# get path to "chroot" in our current PATH -chrootPath="$(type -P chroot)" -rootfs_chroot() { - # "chroot" doesn't set PATH, so we need to set it explicitly to something our new debootstrap chroot can use appropriately! - - # set PATH and chroot away! - PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' \ - "$chrootPath" "$rootfsDir" "$@" -} - -# allow for DEBOOTSTRAP=qemu-debootstrap ./mkimage.sh ... -: ${DEBOOTSTRAP:=debootstrap} - -( - set -x - $DEBOOTSTRAP "${before[@]}" "$suite" "$rootfsDir" "$@" -) - -# now for some Docker-specific tweaks - -# prevent init scripts from running during install/update -echo >&2 "+ echo exit 101 > '$rootfsDir/usr/sbin/policy-rc.d'" -cat > "$rootfsDir/usr/sbin/policy-rc.d" <<-'EOF' - #!/bin/sh - - # For most Docker users, "apt-get install" only happens during "docker build", - # where starting services doesn't work and often fails in humorous ways. This - # prevents those failures by stopping the services from attempting to start. - - exit 101 -EOF -chmod +x "$rootfsDir/usr/sbin/policy-rc.d" - -# prevent upstart scripts from running during install/update -( - set -x - rootfs_chroot dpkg-divert --local --rename --add /sbin/initctl - cp -a "$rootfsDir/usr/sbin/policy-rc.d" "$rootfsDir/sbin/initctl" - sed -i 's/^exit.*/exit 0/' "$rootfsDir/sbin/initctl" -) - -# shrink a little, since apt makes us cache-fat (wheezy: ~157.5MB vs ~120MB) -( set -x; rootfs_chroot apt-get clean ) - -# this file is one APT creates to make sure we don't "autoremove" our currently -# in-use kernel, which doesn't really apply to debootstraps/Docker images that -# don't even have kernels installed -rm -f "$rootfsDir/etc/apt/apt.conf.d/01autoremove-kernels" - -# Ubuntu 10.04 sucks... :) -if strings "$rootfsDir/usr/bin/dpkg" | grep -q unsafe-io; then - # force dpkg not to call sync() after package extraction (speeding up installs) - echo >&2 "+ echo force-unsafe-io > '$rootfsDir/etc/dpkg/dpkg.cfg.d/docker-apt-speedup'" - cat > "$rootfsDir/etc/dpkg/dpkg.cfg.d/docker-apt-speedup" <<-'EOF' - # For most Docker users, package installs happen during "docker build", which - # doesn't survive power loss and gets restarted clean afterwards anyhow, so - # this minor tweak gives us a nice speedup (much nicer on spinning disks, - # obviously). - - force-unsafe-io - EOF -fi - -if [ -d "$rootfsDir/etc/apt/apt.conf.d" ]; then - # _keep_ us lean by effectively running "apt-get clean" after every install - aptGetClean='"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true";' - echo >&2 "+ cat > '$rootfsDir/etc/apt/apt.conf.d/docker-clean'" - cat > "$rootfsDir/etc/apt/apt.conf.d/docker-clean" <<-EOF - # Since for most Docker users, package installs happen in "docker build" steps, - # they essentially become individual layers due to the way Docker handles - # layering, especially using CoW filesystems. What this means for us is that - # the caches that APT keeps end up just wasting space in those layers, making - # our layers unnecessarily large (especially since we'll normally never use - # these caches again and will instead just "docker build" again and make a brand - # new image). - - # Ideally, these would just be invoking "apt-get clean", but in our testing, - # that ended up being cyclic and we got stuck on APT's lock, so we get this fun - # creation that's essentially just "apt-get clean". - DPkg::Post-Invoke { ${aptGetClean} }; - APT::Update::Post-Invoke { ${aptGetClean} }; - - Dir::Cache::pkgcache ""; - Dir::Cache::srcpkgcache ""; - - # Note that we do realize this isn't the ideal way to do this, and are always - # open to better suggestions (https://github.com/docker/docker/issues). - EOF - - # remove apt-cache translations for fast "apt-get update" - echo >&2 "+ echo Acquire::Languages 'none' > '$rootfsDir/etc/apt/apt.conf.d/docker-no-languages'" - cat > "$rootfsDir/etc/apt/apt.conf.d/docker-no-languages" <<-'EOF' - # In Docker, we don't often need the "Translations" files, so we're just wasting - # time and space by downloading them, and this inhibits that. For users that do - # need them, it's a simple matter to delete this file and "apt-get update". :) - - Acquire::Languages "none"; - EOF - - echo >&2 "+ echo Acquire::GzipIndexes 'true' > '$rootfsDir/etc/apt/apt.conf.d/docker-gzip-indexes'" - cat > "$rootfsDir/etc/apt/apt.conf.d/docker-gzip-indexes" <<-'EOF' - # Since Docker users using "RUN apt-get update && apt-get install -y ..." in - # their Dockerfiles don't go delete the lists files afterwards, we want them to - # be as small as possible on-disk, so we explicitly request "gz" versions and - # tell Apt to keep them gzipped on-disk. - - # For comparison, an "apt-get update" layer without this on a pristine - # "debian:wheezy" base image was "29.88 MB", where with this it was only - # "8.273 MB". - - Acquire::GzipIndexes "true"; - Acquire::CompressionTypes::Order:: "gz"; - EOF - - # update "autoremove" configuration to be aggressive about removing suggests deps that weren't manually installed - echo >&2 "+ echo Apt::AutoRemove::SuggestsImportant 'false' > '$rootfsDir/etc/apt/apt.conf.d/docker-autoremove-suggests'" - cat > "$rootfsDir/etc/apt/apt.conf.d/docker-autoremove-suggests" <<-'EOF' - # Since Docker users are looking for the smallest possible final images, the - # following emerges as a very common pattern: - - # RUN apt-get update \ - # && apt-get install -y \ - # && \ - # && apt-get purge -y --auto-remove - - # By default, APT will actually _keep_ packages installed via Recommends or - # Depends if another package Suggests them, even and including if the package - # that originally caused them to be installed is removed. Setting this to - # "false" ensures that APT is appropriately aggressive about removing the - # packages it added. - - # https://aptitude.alioth.debian.org/doc/en/ch02s05s05.html#configApt-AutoRemove-SuggestsImportant - Apt::AutoRemove::SuggestsImportant "false"; - EOF -fi - -if [ -z "$DONT_TOUCH_SOURCES_LIST" ]; then - # tweak sources.list, where appropriate - lsbDist= - if [ -z "$lsbDist" -a -r "$rootfsDir/etc/os-release" ]; then - lsbDist="$(. "$rootfsDir/etc/os-release" && echo "$ID")" - fi - if [ -z "$lsbDist" -a -r "$rootfsDir/etc/lsb-release" ]; then - lsbDist="$(. "$rootfsDir/etc/lsb-release" && echo "$DISTRIB_ID")" - fi - if [ -z "$lsbDist" -a -r "$rootfsDir/etc/debian_version" ]; then - lsbDist='Debian' - fi - # normalize to lowercase for easier matching - lsbDist="$(echo "$lsbDist" | tr '[:upper:]' '[:lower:]')" - case "$lsbDist" in - debian) - # updates and security! - if [ "$suite" != 'sid' -a "$suite" != 'unstable' ]; then - ( - set -x - sed -i " - p; - s/ $suite / ${suite}-updates / - " "$rootfsDir/etc/apt/sources.list" - echo "deb http://security.debian.org $suite/updates main" >> "$rootfsDir/etc/apt/sources.list" - ) - fi - ;; - ubuntu) - # add the updates and security repositories - ( - set -x - sed -i " - p; - s/ $suite / ${suite}-updates /; p; - s/ $suite-updates / ${suite}-security / - " "$rootfsDir/etc/apt/sources.list" - ) - ;; - tanglu) - # add the updates repository - if [ "$suite" != 'devel' ]; then - ( - set -x - sed -i " - p; - s/ $suite / ${suite}-updates / - " "$rootfsDir/etc/apt/sources.list" - ) - fi - ;; - steamos) - # add contrib and non-free if "main" is the only component - ( - set -x - sed -i "s/ $suite main$/ $suite main contrib non-free/" "$rootfsDir/etc/apt/sources.list" - ) - ;; - esac -fi - -( - set -x - - # make sure we're fully up-to-date - rootfs_chroot sh -xc 'apt-get update && apt-get dist-upgrade -y' - - # delete all the apt list files since they're big and get stale quickly - rm -rf "$rootfsDir/var/lib/apt/lists"/* - # this forces "apt-get update" in dependent images, which is also good - - mkdir "$rootfsDir/var/lib/apt/lists/partial" # Lucid... "E: Lists directory /var/lib/apt/lists/partial is missing." -) diff --git a/vendor/github.com/docker/docker/contrib/mkimage/mageia-urpmi b/vendor/github.com/docker/docker/contrib/mkimage/mageia-urpmi deleted file mode 100755 index 93fb289ca..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage/mageia-urpmi +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env bash -# -# Needs to be run from Mageia 4 or greater for kernel support for docker. -# -# Mageia 4 does not have docker available in official repos, so please -# install and run the docker binary manually. -# -# Tested working versions are for Mageia 2 onwards (inc. cauldron). -# -set -e - -rootfsDir="$1" -shift - -optTemp=$(getopt --options '+v:,m:' --longoptions 'version:,mirror:' --name mageia-urpmi -- "$@") -eval set -- "$optTemp" -unset optTemp - -installversion= -mirror= -while true; do - case "$1" in - -v|--version) installversion="$2" ; shift 2 ;; - -m|--mirror) mirror="$2" ; shift 2 ;; - --) shift ; break ;; - esac -done - -if [ -z $installversion ]; then - # Attempt to match host version - if [ -r /etc/mageia-release ]; then - installversion="$(sed 's/^[^0-9\]*\([0-9.]\+\).*$/\1/' /etc/mageia-release)" - else - echo "Error: no version supplied and unable to detect host mageia version" - exit 1 - fi -fi - -if [ -z $mirror ]; then - # No mirror provided, default to mirrorlist - mirror="--mirrorlist https://mirrors.mageia.org/api/mageia.$installversion.x86_64.list" -fi - -( - set -x - urpmi.addmedia --distrib \ - $mirror \ - --urpmi-root "$rootfsDir" - urpmi basesystem-minimal urpmi \ - --auto \ - --no-suggests \ - --urpmi-root "$rootfsDir" \ - --root "$rootfsDir" -) - -"$(dirname "$BASH_SOURCE")/.febootstrap-minimize" "$rootfsDir" - -if [ -d "$rootfsDir/etc/sysconfig" ]; then - # allow networking init scripts inside the container to work without extra steps - echo 'NETWORKING=yes' > "$rootfsDir/etc/sysconfig/network" -fi diff --git a/vendor/github.com/docker/docker/contrib/mkimage/rinse b/vendor/github.com/docker/docker/contrib/mkimage/rinse deleted file mode 100755 index 75eb4f0d9..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage/rinse +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash -set -e - -rootfsDir="$1" -shift - -# specifying --arch below is safe because "$@" can override it and the "latest" one wins :) - -( - set -x - rinse --directory "$rootfsDir" --arch amd64 "$@" -) - -"$(dirname "$BASH_SOURCE")/.febootstrap-minimize" "$rootfsDir" - -if [ -d "$rootfsDir/etc/sysconfig" ]; then - # allow networking init scripts inside the container to work without extra steps - echo 'NETWORKING=yes' > "$rootfsDir/etc/sysconfig/network" -fi - -# make sure we're fully up-to-date, too -( - set -x - chroot "$rootfsDir" yum update -y -) diff --git a/vendor/github.com/docker/docker/contrib/mkimage/solaris b/vendor/github.com/docker/docker/contrib/mkimage/solaris deleted file mode 100755 index 158970e69..000000000 --- a/vendor/github.com/docker/docker/contrib/mkimage/solaris +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env bash -# -# Solaris 12 base image build script. -# -set -e - -# TODO add optional package publisher origin - -rootfsDir="$1" -shift - -# base install -( - set -x - - pkg image-create --full --zone \ - --facet facet.locale.*=false \ - --facet facet.locale.POSIX=true \ - --facet facet.doc=false \ - --facet facet.doc.*=false \ - "$rootfsDir" - - pkg -R "$rootfsDir" set-property use-system-repo true - - pkg -R "$rootfsDir" set-property flush-content-cache-on-success true - - pkg -R "$rootfsDir" install core-os -) - -# Lay in stock configuration, set up milestone -# XXX This all may become optional in a base image -( - # faster to build repository database on tmpfs - REPO_DB=/system/volatile/repository.$$ - export SVCCFG_REPOSITORY=${REPO_DB} - export SVCCFG_DOOR_PATH=$rootfsDir/system/volatile/tmp_repo_door - - # Import base manifests. NOTE These are a combination of basic requirement - # and gleaned from container milestone manifest. They may change. - for m in $rootfsDir/lib/svc/manifest/system/environment.xml \ - $rootfsDir/lib/svc/manifest/system/svc/global.xml \ - $rootfsDir/lib/svc/manifest/system/svc/restarter.xml \ - $rootfsDir/lib/svc/manifest/network/dns/client.xml \ - $rootfsDir/lib/svc/manifest/system/name-service/switch.xml \ - $rootfsDir/lib/svc/manifest/system/name-service/cache.xml \ - $rootfsDir/lib/svc/manifest/milestone/container.xml ; do - svccfg import $m - done - - # Apply system layer profile, deleting unnecessary dependencies - svccfg apply $rootfsDir/etc/svc/profile/generic_container.xml - - # XXX Even if we keep a repo in the base image, this is definitely optional - svccfg apply $rootfsDir/etc/svc/profile/sysconfig/container_sc.xml - - for s in svc:/system/svc/restarter \ - svc:/system/environment \ - svc:/network/dns/client \ - svc:/system/name-service/switch \ - svc:/system/name-service/cache \ - svc:/system/svc/global \ - svc:/milestone/container ;do - svccfg -s $s refresh - done - - # now copy the built up repository into the base rootfs - mv $REPO_DB $rootfsDir/etc/svc/repository.db -) - -# pkg(1) needs the zoneproxy-client running in the container. -# use a simple wrapper to run it as needed. -# XXX maybe we go back to running this in SMF? -mv "$rootfsDir/usr/bin/pkg" "$rootfsDir/usr/bin/wrapped_pkg" -cat > "$rootfsDir/usr/bin/pkg" <<-'EOF' -#!/bin/sh -# -# THIS FILE CREATED DURING DOCKER BASE IMAGE CREATION -# -# The Solaris base image uses the sysrepo proxy mechanism. The -# IPS client pkg(1) requires the zoneproxy-client to reach the -# remote publisher origins through the host. This wrapper script -# enables and disables the proxy client as needed. This is a -# temporary solution. - -/usr/lib/zones/zoneproxy-client -s localhost:1008 -PKG_SYSREPO_URL=http://localhost:1008 /usr/bin/wrapped_pkg "$@" -pkill -9 zoneproxy-client -EOF -chmod +x "$rootfsDir/usr/bin/pkg" diff --git a/vendor/github.com/docker/docker/contrib/nnp-test/Dockerfile b/vendor/github.com/docker/docker/contrib/nnp-test/Dockerfile deleted file mode 100644 index 026d86954..000000000 --- a/vendor/github.com/docker/docker/contrib/nnp-test/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM buildpack-deps:jessie - -COPY . /usr/src/ - -WORKDIR /usr/src/ - -RUN gcc -g -Wall -static nnp-test.c -o /usr/bin/nnp-test - -RUN chmod +s /usr/bin/nnp-test diff --git a/vendor/github.com/docker/docker/contrib/nnp-test/nnp-test.c b/vendor/github.com/docker/docker/contrib/nnp-test/nnp-test.c deleted file mode 100644 index b767da7e1..000000000 --- a/vendor/github.com/docker/docker/contrib/nnp-test/nnp-test.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include - -int main(int argc, char *argv[]) -{ - printf("EUID=%d\n", geteuid()); - return 0; -} - diff --git a/vendor/github.com/docker/docker/contrib/nuke-graph-directory.sh b/vendor/github.com/docker/docker/contrib/nuke-graph-directory.sh deleted file mode 100755 index 5eeb45c8b..000000000 --- a/vendor/github.com/docker/docker/contrib/nuke-graph-directory.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/sh -set -e - -dir="$1" - -if [ -z "$dir" ]; then - { - echo 'This script is for destroying old /var/lib/docker directories more safely than' - echo ' "rm -rf", which can cause data loss or other serious issues.' - echo - echo "usage: $0 directory" - echo " ie: $0 /var/lib/docker" - } >&2 - exit 1 -fi - -if [ "$(id -u)" != 0 ]; then - echo >&2 "error: $0 must be run as root" - exit 1 -fi - -if [ ! -d "$dir" ]; then - echo >&2 "error: $dir is not a directory" - exit 1 -fi - -dir="$(readlink -f "$dir")" - -echo -echo "Nuking $dir ..." -echo ' (if this is wrong, press Ctrl+C NOW!)' -echo - -( set -x; sleep 10 ) -echo - -dir_in_dir() { - inner="$1" - outer="$2" - [ "${inner#$outer}" != "$inner" ] -} - -# let's start by unmounting any submounts in $dir -# (like -v /home:... for example - DON'T DELETE MY HOME DIRECTORY BRU!) -for mount in $(awk '{ print $5 }' /proc/self/mountinfo); do - mount="$(readlink -f "$mount" || true)" - if [ "$dir" != "$mount" ] && dir_in_dir "$mount" "$dir"; then - ( set -x; umount -f "$mount" ) - fi -done - -# now, let's go destroy individual btrfs subvolumes, if any exist -if command -v btrfs > /dev/null 2>&1; then - # Find btrfs subvolumes under $dir checking for inode 256 - # Source: http://stackoverflow.com/a/32865333 - for subvol in $(find "$dir" -type d -inum 256 | sort -r); do - if [ "$dir" != "$subvol" ]; then - ( set -x; btrfs subvolume delete "$subvol" ) - fi - done -fi - -# finally, DESTROY ALL THINGS -( shopt -s dotglob; set -x; rm -rf "$dir"/* ) diff --git a/vendor/github.com/docker/docker/contrib/project-stats.sh b/vendor/github.com/docker/docker/contrib/project-stats.sh deleted file mode 100755 index 2691c72ff..000000000 --- a/vendor/github.com/docker/docker/contrib/project-stats.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -## Run this script from the root of the docker repository -## to query project stats useful to the maintainers. -## You will need to install `pulls` and `issues` from -## https://github.com/crosbymichael/pulls - -set -e - -echo -n "Open pulls: " -PULLS=$(pulls | wc -l); let PULLS=$PULLS-1 -echo $PULLS - -echo -n "Pulls alru: " -pulls alru - -echo -n "Open issues: " -ISSUES=$(issues list | wc -l); let ISSUES=$ISSUES-1 -echo $ISSUES - -echo -n "Issues alru: " -issues alru diff --git a/vendor/github.com/docker/docker/contrib/report-issue.sh b/vendor/github.com/docker/docker/contrib/report-issue.sh deleted file mode 100755 index cb54f1a5b..000000000 --- a/vendor/github.com/docker/docker/contrib/report-issue.sh +++ /dev/null @@ -1,105 +0,0 @@ -#!/bin/sh - -# This is a convenience script for reporting issues that include a base -# template of information. See https://github.com/docker/docker/pull/8845 - -set -e - -DOCKER_ISSUE_URL=${DOCKER_ISSUE_URL:-"https://github.com/docker/docker/issues/new"} -DOCKER_ISSUE_NAME_PREFIX=${DOCKER_ISSUE_NAME_PREFIX:-"Report: "} -DOCKER=${DOCKER:-"docker"} -DOCKER_COMMAND="${DOCKER}" -export DOCKER_COMMAND - -# pulled from https://gist.github.com/cdown/1163649 -function urlencode() { - # urlencode - - local length="${#1}" - for (( i = 0; i < length; i++ )); do - local c="${1:i:1}" - case $c in - [a-zA-Z0-9.~_-]) printf "$c" ;; - *) printf '%%%02X' "'$c" - esac - done -} - -function template() { -# this should always match the template from CONTRIBUTING.md - cat <<- EOM - Description of problem: - - - \`docker version\`: - `${DOCKER_COMMAND} -D version` - - - \`docker info\`: - `${DOCKER_COMMAND} -D info` - - - \`uname -a\`: - `uname -a` - - - Environment details (AWS, VirtualBox, physical, etc.): - - - How reproducible: - - - Steps to Reproduce: - 1. - 2. - 3. - - - Actual Results: - - - Expected Results: - - - Additional info: - - - EOM -} - -function format_issue_url() { - if [ ${#@} -ne 2 ] ; then - return 1 - fi - local issue_name=$(urlencode "${DOCKER_ISSUE_NAME_PREFIX}${1}") - local issue_body=$(urlencode "${2}") - echo "${DOCKER_ISSUE_URL}?title=${issue_name}&body=${issue_body}" -} - - -echo -ne "Do you use \`sudo\` to call docker? [y|N]: " -read -r -n 1 use_sudo -echo "" - -if [ "x${use_sudo}" = "xy" -o "x${use_sudo}" = "xY" ]; then - export DOCKER_COMMAND="sudo ${DOCKER}" -fi - -echo -ne "Title of new issue?: " -read -r issue_title -echo "" - -issue_url=$(format_issue_url "${issue_title}" "$(template)") - -if which xdg-open 2>/dev/null >/dev/null ; then - echo -ne "Would like to launch this report in your browser? [Y|n]: " - read -r -n 1 launch_now - echo "" - - if [ "${launch_now}" != "n" -a "${launch_now}" != "N" ]; then - xdg-open "${issue_url}" - fi -fi - -echo "If you would like to manually open the url, you can open this link if your browser: ${issue_url}" - diff --git a/vendor/github.com/docker/docker/contrib/reprepro/suites.sh b/vendor/github.com/docker/docker/contrib/reprepro/suites.sh deleted file mode 100755 index 9ecf99d46..000000000 --- a/vendor/github.com/docker/docker/contrib/reprepro/suites.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -e - -cd "$(dirname "$BASH_SOURCE")/../.." - -targets_from() { - git fetch -q https://github.com/docker/docker.git "$1" - git ls-tree -r --name-only "$(git rev-parse FETCH_HEAD)" contrib/builder/deb/ | grep '/Dockerfile$' | sed -r 's!^contrib/builder/deb/|^contrib/builder/deb/amd64/|-debootstrap|/Dockerfile$!!g' | grep -v / -} - -release_branch=$(git ls-remote --heads https://github.com/docker/docker.git | awk -F 'refs/heads/' '$2 ~ /^release/ { print $2 }' | sort -V | tail -1) -{ targets_from master; targets_from "$release_branch"; } | sort -u diff --git a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/LICENSE b/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/LICENSE deleted file mode 100644 index d511905c1..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/Makefile b/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/Makefile deleted file mode 100644 index 16df33ef3..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -TARGETS?=docker -MODULES?=${TARGETS:=.pp.bz2} -SHAREDIR?=/usr/share - -all: ${TARGETS:=.pp.bz2} - -%.pp.bz2: %.pp - @echo Compressing $^ -\> $@ - bzip2 -9 $^ - -%.pp: %.te - make -f ${SHAREDIR}/selinux/devel/Makefile $@ - -clean: - rm -f *~ *.tc *.pp *.pp.bz2 - rm -rf tmp *.tar.gz - -man: install - sepolicy manpage --domain ${TARGETS}_t - -install: - semodule -i ${TARGETS} - diff --git a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/README.md b/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/README.md deleted file mode 100644 index 7ea3117a8..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/README.md +++ /dev/null @@ -1 +0,0 @@ -SELinux policy for docker diff --git a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.fc b/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.fc deleted file mode 100644 index d6cb0e579..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.fc +++ /dev/null @@ -1,29 +0,0 @@ -/root/\.docker gen_context(system_u:object_r:docker_home_t,s0) - -/usr/bin/docker -- gen_context(system_u:object_r:docker_exec_t,s0) -/usr/bin/docker-novolume-plugin -- gen_context(system_u:object_r:docker_auth_exec_t,s0) -/usr/lib/docker/docker-novolume-plugin -- gen_context(system_u:object_r:docker_auth_exec_t,s0) - -/usr/lib/systemd/system/docker.service -- gen_context(system_u:object_r:docker_unit_file_t,s0) -/usr/lib/systemd/system/docker-novolume-plugin.service -- gen_context(system_u:object_r:docker_unit_file_t,s0) - -/etc/docker(/.*)? gen_context(system_u:object_r:docker_config_t,s0) - -/var/lib/docker(/.*)? gen_context(system_u:object_r:docker_var_lib_t,s0) -/var/lib/kublet(/.*)? gen_context(system_u:object_r:docker_var_lib_t,s0) -/var/lib/docker/vfs(/.*)? gen_context(system_u:object_r:svirt_sandbox_file_t,s0) - -/var/run/docker(/.*)? gen_context(system_u:object_r:docker_var_run_t,s0) -/var/run/docker\.pid -- gen_context(system_u:object_r:docker_var_run_t,s0) -/var/run/docker\.sock -s gen_context(system_u:object_r:docker_var_run_t,s0) -/var/run/docker-client(/.*)? gen_context(system_u:object_r:docker_var_run_t,s0) -/var/run/docker/plugins(/.*)? gen_context(system_u:object_r:docker_plugin_var_run_t,s0) - -/var/lock/lxc(/.*)? gen_context(system_u:object_r:docker_lock_t,s0) - -/var/log/lxc(/.*)? gen_context(system_u:object_r:docker_log_t,s0) - -/var/lib/docker/init(/.*)? gen_context(system_u:object_r:docker_share_t,s0) -/var/lib/docker/containers/.*/hosts gen_context(system_u:object_r:docker_share_t,s0) -/var/lib/docker/containers/.*/hostname gen_context(system_u:object_r:docker_share_t,s0) -/var/lib/docker/.*/config\.env gen_context(system_u:object_r:docker_share_t,s0) diff --git a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.if b/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.if deleted file mode 100644 index e087e8b98..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.if +++ /dev/null @@ -1,523 +0,0 @@ - -## The open-source application container engine. - -######################################## -## -## Execute docker in the docker domain. -## -## -## -## Domain allowed to transition. -## -## -# -interface(`docker_domtrans',` - gen_require(` - type docker_t, docker_exec_t; - ') - - corecmd_search_bin($1) - domtrans_pattern($1, docker_exec_t, docker_t) -') - -######################################## -## -## Execute docker in the caller domain. -## -## -## -## Domain allowed to transition. -## -## -# -interface(`docker_exec',` - gen_require(` - type docker_exec_t; - ') - - corecmd_search_bin($1) - can_exec($1, docker_exec_t) -') - -######################################## -## -## Search docker lib directories. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_search_lib',` - gen_require(` - type docker_var_lib_t; - ') - - allow $1 docker_var_lib_t:dir search_dir_perms; - files_search_var_lib($1) -') - -######################################## -## -## Execute docker lib directories. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_exec_lib',` - gen_require(` - type docker_var_lib_t; - ') - - allow $1 docker_var_lib_t:dir search_dir_perms; - can_exec($1, docker_var_lib_t) -') - -######################################## -## -## Read docker lib files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_read_lib_files',` - gen_require(` - type docker_var_lib_t; - ') - - files_search_var_lib($1) - read_files_pattern($1, docker_var_lib_t, docker_var_lib_t) -') - -######################################## -## -## Read docker share files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_read_share_files',` - gen_require(` - type docker_share_t; - ') - - files_search_var_lib($1) - list_dirs_pattern($1, docker_share_t, docker_share_t) - read_files_pattern($1, docker_share_t, docker_share_t) - read_lnk_files_pattern($1, docker_share_t, docker_share_t) -') - -###################################### -## -## Allow the specified domain to execute apache -## in the caller domain. -## -## -## -## Domain allowed access. -## -## -# -interface(`apache_exec',` - gen_require(` - type httpd_exec_t; - ') - - can_exec($1, httpd_exec_t) -') - -###################################### -## -## Allow the specified domain to execute docker shared files -## in the caller domain. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_exec_share_files',` - gen_require(` - type docker_share_t; - ') - - can_exec($1, docker_share_t) -') - -######################################## -## -## Manage docker lib files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_manage_lib_files',` - gen_require(` - type docker_var_lib_t; - ') - - files_search_var_lib($1) - manage_files_pattern($1, docker_var_lib_t, docker_var_lib_t) - manage_lnk_files_pattern($1, docker_var_lib_t, docker_var_lib_t) -') - -######################################## -## -## Manage docker lib directories. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_manage_lib_dirs',` - gen_require(` - type docker_var_lib_t; - ') - - files_search_var_lib($1) - manage_dirs_pattern($1, docker_var_lib_t, docker_var_lib_t) -') - -######################################## -## -## Create objects in a docker var lib directory -## with an automatic type transition to -## a specified private type. -## -## -## -## Domain allowed access. -## -## -## -## -## The type of the object to create. -## -## -## -## -## The class of the object to be created. -## -## -## -## -## The name of the object being created. -## -## -# -interface(`docker_lib_filetrans',` - gen_require(` - type docker_var_lib_t; - ') - - filetrans_pattern($1, docker_var_lib_t, $2, $3, $4) -') - -######################################## -## -## Read docker PID files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_read_pid_files',` - gen_require(` - type docker_var_run_t; - ') - - files_search_pids($1) - read_files_pattern($1, docker_var_run_t, docker_var_run_t) -') - -######################################## -## -## Execute docker server in the docker domain. -## -## -## -## Domain allowed to transition. -## -## -# -interface(`docker_systemctl',` - gen_require(` - type docker_t; - type docker_unit_file_t; - ') - - systemd_exec_systemctl($1) - init_reload_services($1) - systemd_read_fifo_file_passwd_run($1) - allow $1 docker_unit_file_t:file read_file_perms; - allow $1 docker_unit_file_t:service manage_service_perms; - - ps_process_pattern($1, docker_t) -') - -######################################## -## -## Read and write docker shared memory. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_rw_sem',` - gen_require(` - type docker_t; - ') - - allow $1 docker_t:sem rw_sem_perms; -') - -####################################### -## -## Read and write the docker pty type. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_use_ptys',` - gen_require(` - type docker_devpts_t; - ') - - allow $1 docker_devpts_t:chr_file rw_term_perms; -') - -####################################### -## -## Allow domain to create docker content -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_filetrans_named_content',` - - gen_require(` - type docker_var_lib_t; - type docker_share_t; - type docker_log_t; - type docker_var_run_t; - type docker_home_t; - ') - - files_pid_filetrans($1, docker_var_run_t, file, "docker.pid") - files_pid_filetrans($1, docker_var_run_t, sock_file, "docker.sock") - files_pid_filetrans($1, docker_var_run_t, dir, "docker-client") - logging_log_filetrans($1, docker_log_t, dir, "lxc") - files_var_lib_filetrans($1, docker_var_lib_t, dir, "docker") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "config.env") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "hosts") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "hostname") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "resolv.conf") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, dir, "init") - userdom_admin_home_dir_filetrans($1, docker_home_t, dir, ".docker") -') - -######################################## -## -## Connect to docker over a unix stream socket. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_stream_connect',` - gen_require(` - type docker_t, docker_var_run_t; - ') - - files_search_pids($1) - stream_connect_pattern($1, docker_var_run_t, docker_var_run_t, docker_t) -') - -######################################## -## -## Connect to SPC containers over a unix stream socket. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_spc_stream_connect',` - gen_require(` - type spc_t, spc_var_run_t; - ') - - files_search_pids($1) - files_write_all_pid_sockets($1) - allow $1 spc_t:unix_stream_socket connectto; -') - -######################################## -## -## All of the rules required to administrate -## an docker environment -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_admin',` - gen_require(` - type docker_t; - type docker_var_lib_t, docker_var_run_t; - type docker_unit_file_t; - type docker_lock_t; - type docker_log_t; - type docker_config_t; - ') - - allow $1 docker_t:process { ptrace signal_perms }; - ps_process_pattern($1, docker_t) - - admin_pattern($1, docker_config_t) - - files_search_var_lib($1) - admin_pattern($1, docker_var_lib_t) - - files_search_pids($1) - admin_pattern($1, docker_var_run_t) - - files_search_locks($1) - admin_pattern($1, docker_lock_t) - - logging_search_logs($1) - admin_pattern($1, docker_log_t) - - docker_systemctl($1) - admin_pattern($1, docker_unit_file_t) - allow $1 docker_unit_file_t:service all_service_perms; - - optional_policy(` - systemd_passwd_agent_exec($1) - systemd_read_fifo_file_passwd_run($1) - ') -') - -######################################## -## -## Execute docker_auth_exec_t in the docker_auth domain. -## -## -## -## Domain allowed to transition. -## -## -# -interface(`docker_auth_domtrans',` - gen_require(` - type docker_auth_t, docker_auth_exec_t; - ') - - corecmd_search_bin($1) - domtrans_pattern($1, docker_auth_exec_t, docker_auth_t) -') - -###################################### -## -## Execute docker_auth in the caller domain. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_auth_exec',` - gen_require(` - type docker_auth_exec_t; - ') - - corecmd_search_bin($1) - can_exec($1, docker_auth_exec_t) -') - -######################################## -## -## Connect to docker_auth over a unix stream socket. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_auth_stream_connect',` - gen_require(` - type docker_auth_t, docker_plugin_var_run_t; - ') - - files_search_pids($1) - stream_connect_pattern($1, docker_plugin_var_run_t, docker_plugin_var_run_t, docker_auth_t) -') - -######################################## -## -## docker domain typebounds calling domain. -## -## -## -## Domain to be typebound. -## -## -# -interface(`docker_typebounds',` - gen_require(` - type docker_t; - ') - - typebounds docker_t $1; -') - -######################################## -## -## Allow any docker_exec_t to be an entrypoint of this domain -## -## -## -## Domain allowed access. -## -## -## -# -interface(`docker_entrypoint',` - gen_require(` - type docker_exec_t; - ') - allow $1 docker_exec_t:file entrypoint; -') diff --git a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.te b/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.te deleted file mode 100644 index 423168838..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-fedora-24/docker-engine-selinux/docker.te +++ /dev/null @@ -1,399 +0,0 @@ -policy_module(docker, 1.0.0) - -######################################## -# -# Declarations -# - -## -##

-## Determine whether docker can -## connect to all TCP ports. -##

-##
-gen_tunable(docker_connect_any, false) - -type docker_t; -type docker_exec_t; -init_daemon_domain(docker_t, docker_exec_t) -domain_subj_id_change_exemption(docker_t) -domain_role_change_exemption(docker_t) - -type spc_t; -domain_type(spc_t) -role system_r types spc_t; - -type docker_auth_t; -type docker_auth_exec_t; -init_daemon_domain(docker_auth_t, docker_auth_exec_t) - -type spc_var_run_t; -files_pid_file(spc_var_run_t) - -type docker_var_lib_t; -files_type(docker_var_lib_t) - -type docker_home_t; -userdom_user_home_content(docker_home_t) - -type docker_config_t; -files_config_file(docker_config_t) - -type docker_lock_t; -files_lock_file(docker_lock_t) - -type docker_log_t; -logging_log_file(docker_log_t) - -type docker_tmp_t; -files_tmp_file(docker_tmp_t) - -type docker_tmpfs_t; -files_tmpfs_file(docker_tmpfs_t) - -type docker_var_run_t; -files_pid_file(docker_var_run_t) - -type docker_plugin_var_run_t; -files_pid_file(docker_plugin_var_run_t) - -type docker_unit_file_t; -systemd_unit_file(docker_unit_file_t) - -type docker_devpts_t; -term_pty(docker_devpts_t) - -type docker_share_t; -files_type(docker_share_t) - -######################################## -# -# docker local policy -# -allow docker_t self:capability { chown kill fowner fsetid mknod net_admin net_bind_service net_raw setfcap }; -allow docker_t self:tun_socket relabelto; -allow docker_t self:process { getattr signal_perms setrlimit setfscreate }; -allow docker_t self:fifo_file rw_fifo_file_perms; -allow docker_t self:unix_stream_socket create_stream_socket_perms; -allow docker_t self:tcp_socket create_stream_socket_perms; -allow docker_t self:udp_socket create_socket_perms; -allow docker_t self:capability2 block_suspend; - -docker_auth_stream_connect(docker_t) - -manage_files_pattern(docker_t, docker_home_t, docker_home_t) -manage_dirs_pattern(docker_t, docker_home_t, docker_home_t) -manage_lnk_files_pattern(docker_t, docker_home_t, docker_home_t) -userdom_admin_home_dir_filetrans(docker_t, docker_home_t, dir, ".docker") - -manage_dirs_pattern(docker_t, docker_config_t, docker_config_t) -manage_files_pattern(docker_t, docker_config_t, docker_config_t) -files_etc_filetrans(docker_t, docker_config_t, dir, "docker") - -manage_dirs_pattern(docker_t, docker_lock_t, docker_lock_t) -manage_files_pattern(docker_t, docker_lock_t, docker_lock_t) -files_lock_filetrans(docker_t, docker_lock_t, { dir file }, "lxc") - -manage_dirs_pattern(docker_t, docker_log_t, docker_log_t) -manage_files_pattern(docker_t, docker_log_t, docker_log_t) -manage_lnk_files_pattern(docker_t, docker_log_t, docker_log_t) -logging_log_filetrans(docker_t, docker_log_t, { dir file lnk_file }) -allow docker_t docker_log_t:dir_file_class_set { relabelfrom relabelto }; - -manage_dirs_pattern(docker_t, docker_tmp_t, docker_tmp_t) -manage_files_pattern(docker_t, docker_tmp_t, docker_tmp_t) -manage_lnk_files_pattern(docker_t, docker_tmp_t, docker_tmp_t) -files_tmp_filetrans(docker_t, docker_tmp_t, { dir file lnk_file }) - -manage_dirs_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_lnk_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_fifo_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_chr_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_blk_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -allow docker_t docker_tmpfs_t:dir relabelfrom; -can_exec(docker_t, docker_tmpfs_t) -fs_tmpfs_filetrans(docker_t, docker_tmpfs_t, { dir file }) -allow docker_t docker_tmpfs_t:chr_file mounton; - -manage_dirs_pattern(docker_t, docker_share_t, docker_share_t) -manage_files_pattern(docker_t, docker_share_t, docker_share_t) -manage_lnk_files_pattern(docker_t, docker_share_t, docker_share_t) -allow docker_t docker_share_t:dir_file_class_set { relabelfrom relabelto }; - -can_exec(docker_t, docker_share_t) -#docker_filetrans_named_content(docker_t) - -manage_dirs_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_chr_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_blk_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_lnk_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -allow docker_t docker_var_lib_t:dir_file_class_set { relabelfrom relabelto }; -files_var_lib_filetrans(docker_t, docker_var_lib_t, { dir file lnk_file }) - -manage_dirs_pattern(docker_t, docker_var_run_t, docker_var_run_t) -manage_files_pattern(docker_t, docker_var_run_t, docker_var_run_t) -manage_sock_files_pattern(docker_t, docker_var_run_t, docker_var_run_t) -manage_lnk_files_pattern(docker_t, docker_var_run_t, docker_var_run_t) -files_pid_filetrans(docker_t, docker_var_run_t, { dir file lnk_file sock_file }) - -allow docker_t docker_devpts_t:chr_file { relabelfrom rw_chr_file_perms setattr_chr_file_perms }; -term_create_pty(docker_t, docker_devpts_t) - -kernel_read_system_state(docker_t) -kernel_read_network_state(docker_t) -kernel_read_all_sysctls(docker_t) -kernel_rw_net_sysctls(docker_t) -kernel_setsched(docker_t) -kernel_read_all_proc(docker_t) - -domain_use_interactive_fds(docker_t) -domain_dontaudit_read_all_domains_state(docker_t) - -corecmd_exec_bin(docker_t) -corecmd_exec_shell(docker_t) - -corenet_tcp_bind_generic_node(docker_t) -corenet_tcp_sendrecv_generic_if(docker_t) -corenet_tcp_sendrecv_generic_node(docker_t) -corenet_tcp_sendrecv_generic_port(docker_t) -corenet_tcp_bind_all_ports(docker_t) -corenet_tcp_connect_http_port(docker_t) -corenet_tcp_connect_commplex_main_port(docker_t) -corenet_udp_sendrecv_generic_if(docker_t) -corenet_udp_sendrecv_generic_node(docker_t) -corenet_udp_sendrecv_all_ports(docker_t) -corenet_udp_bind_generic_node(docker_t) -corenet_udp_bind_all_ports(docker_t) - -files_read_config_files(docker_t) -files_dontaudit_getattr_all_dirs(docker_t) -files_dontaudit_getattr_all_files(docker_t) - -fs_read_cgroup_files(docker_t) -fs_read_tmpfs_symlinks(docker_t) -fs_search_all(docker_t) -fs_getattr_all_fs(docker_t) - -storage_raw_rw_fixed_disk(docker_t) - -auth_use_nsswitch(docker_t) -auth_dontaudit_getattr_shadow(docker_t) - -init_read_state(docker_t) -init_status(docker_t) - -logging_send_audit_msgs(docker_t) -logging_send_syslog_msg(docker_t) - -miscfiles_read_localization(docker_t) - -mount_domtrans(docker_t) - -seutil_read_default_contexts(docker_t) -seutil_read_config(docker_t) - -sysnet_dns_name_resolve(docker_t) -sysnet_exec_ifconfig(docker_t) - -optional_policy(` - rpm_exec(docker_t) - rpm_read_db(docker_t) - rpm_exec(docker_t) -') - -optional_policy(` - fstools_domtrans(docker_t) -') - -optional_policy(` - iptables_domtrans(docker_t) -') - -optional_policy(` - openvswitch_stream_connect(docker_t) -') - -# -# lxc rules -# - -allow docker_t self:capability { dac_override setgid setpcap setuid sys_admin sys_boot sys_chroot sys_ptrace }; - -allow docker_t self:process { getcap setcap setexec setpgid setsched signal_perms }; - -allow docker_t self:netlink_route_socket rw_netlink_socket_perms;; -allow docker_t self:netlink_audit_socket create_netlink_socket_perms; -allow docker_t self:unix_dgram_socket { create_socket_perms sendto }; -allow docker_t self:unix_stream_socket { create_stream_socket_perms connectto }; - -allow docker_t docker_var_lib_t:dir mounton; -allow docker_t docker_var_lib_t:chr_file mounton; -can_exec(docker_t, docker_var_lib_t) - -kernel_dontaudit_setsched(docker_t) -kernel_get_sysvipc_info(docker_t) -kernel_request_load_module(docker_t) -kernel_mounton_messages(docker_t) -kernel_mounton_all_proc(docker_t) -kernel_mounton_all_sysctls(docker_t) -kernel_unlabeled_entry_type(spc_t) -kernel_unlabeled_domtrans(docker_t, spc_t) - -dev_getattr_all(docker_t) -dev_getattr_sysfs_fs(docker_t) -dev_read_urand(docker_t) -dev_read_lvm_control(docker_t) -dev_rw_sysfs(docker_t) -dev_rw_loop_control(docker_t) -dev_rw_lvm_control(docker_t) - -files_getattr_isid_type_dirs(docker_t) -files_manage_isid_type_dirs(docker_t) -files_manage_isid_type_files(docker_t) -files_manage_isid_type_symlinks(docker_t) -files_manage_isid_type_chr_files(docker_t) -files_manage_isid_type_blk_files(docker_t) -files_exec_isid_files(docker_t) -files_mounton_isid(docker_t) -files_mounton_non_security(docker_t) -files_mounton_isid_type_chr_file(docker_t) - -fs_mount_all_fs(docker_t) -fs_unmount_all_fs(docker_t) -fs_remount_all_fs(docker_t) -files_mounton_isid(docker_t) -fs_manage_cgroup_dirs(docker_t) -fs_manage_cgroup_files(docker_t) -fs_relabelfrom_xattr_fs(docker_t) -fs_relabelfrom_tmpfs(docker_t) -fs_read_tmpfs_symlinks(docker_t) -fs_list_hugetlbfs(docker_t) - -term_use_generic_ptys(docker_t) -term_use_ptmx(docker_t) -term_getattr_pty_fs(docker_t) -term_relabel_pty_fs(docker_t) -term_mounton_unallocated_ttys(docker_t) - -modutils_domtrans_insmod(docker_t) - -systemd_status_all_unit_files(docker_t) -systemd_start_systemd_services(docker_t) - -userdom_stream_connect(docker_t) -userdom_search_user_home_content(docker_t) -userdom_read_all_users_state(docker_t) -userdom_relabel_user_home_files(docker_t) -userdom_relabel_user_tmp_files(docker_t) -userdom_relabel_user_tmp_dirs(docker_t) - -optional_policy(` - gpm_getattr_gpmctl(docker_t) -') - -optional_policy(` - dbus_system_bus_client(docker_t) - init_dbus_chat(docker_t) - init_start_transient_unit(docker_t) - - optional_policy(` - systemd_dbus_chat_logind(docker_t) - systemd_dbus_chat_machined(docker_t) - ') - - optional_policy(` - firewalld_dbus_chat(docker_t) - ') -') - -optional_policy(` - udev_read_db(docker_t) -') - -optional_policy(` - unconfined_domain(docker_t) - unconfined_typebounds(docker_t) -') - -optional_policy(` - virt_read_config(docker_t) - virt_exec(docker_t) - virt_stream_connect(docker_t) - virt_stream_connect_sandbox(docker_t) - virt_exec_sandbox_files(docker_t) - virt_manage_sandbox_files(docker_t) - virt_relabel_sandbox_filesystem(docker_t) - # for lxc - virt_transition_svirt_sandbox(docker_t, system_r) - virt_mounton_sandbox_file(docker_t) -# virt_attach_sandbox_tun_iface(docker_t) - allow docker_t svirt_sandbox_domain:tun_socket relabelfrom; - virt_sandbox_entrypoint(docker_t) -') - -tunable_policy(`docker_connect_any',` - corenet_tcp_connect_all_ports(docker_t) - corenet_sendrecv_all_packets(docker_t) - corenet_tcp_sendrecv_all_ports(docker_t) -') - -######################################## -# -# spc local policy -# -allow spc_t { docker_var_lib_t docker_share_t }:file entrypoint; -role system_r types spc_t; - -domtrans_pattern(docker_t, docker_share_t, spc_t) -domtrans_pattern(docker_t, docker_var_lib_t, spc_t) -allow docker_t spc_t:process { setsched signal_perms }; -ps_process_pattern(docker_t, spc_t) -allow docker_t spc_t:socket_class_set { relabelto relabelfrom }; -filetrans_pattern(docker_t, docker_var_lib_t, docker_share_t, dir, "overlay") - -optional_policy(` - systemd_dbus_chat_machined(spc_t) -') - -optional_policy(` - dbus_chat_system_bus(spc_t) -') - -optional_policy(` - unconfined_domain_noaudit(spc_t) -') - -optional_policy(` - virt_transition_svirt_sandbox(spc_t, system_r) - virt_sandbox_entrypoint(spc_t) -') - -######################################## -# -# docker_auth local policy -# -allow docker_auth_t self:fifo_file rw_fifo_file_perms; -allow docker_auth_t self:unix_stream_socket create_stream_socket_perms; -dontaudit docker_auth_t self:capability net_admin; - -docker_stream_connect(docker_auth_t) - -manage_dirs_pattern(docker_auth_t, docker_plugin_var_run_t, docker_plugin_var_run_t) -manage_files_pattern(docker_auth_t, docker_plugin_var_run_t, docker_plugin_var_run_t) -manage_sock_files_pattern(docker_auth_t, docker_plugin_var_run_t, docker_plugin_var_run_t) -manage_lnk_files_pattern(docker_auth_t, docker_plugin_var_run_t, docker_plugin_var_run_t) -files_pid_filetrans(docker_auth_t, docker_plugin_var_run_t, { dir file lnk_file sock_file }) - -domain_use_interactive_fds(docker_auth_t) - -kernel_read_net_sysctls(docker_auth_t) - -auth_use_nsswitch(docker_auth_t) - -files_read_etc_files(docker_auth_t) - -miscfiles_read_localization(docker_auth_t) - -sysnet_dns_name_resolve(docker_auth_t) diff --git a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/LICENSE b/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/LICENSE deleted file mode 100644 index d511905c1..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/Makefile b/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/Makefile deleted file mode 100644 index 16df33ef3..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -TARGETS?=docker -MODULES?=${TARGETS:=.pp.bz2} -SHAREDIR?=/usr/share - -all: ${TARGETS:=.pp.bz2} - -%.pp.bz2: %.pp - @echo Compressing $^ -\> $@ - bzip2 -9 $^ - -%.pp: %.te - make -f ${SHAREDIR}/selinux/devel/Makefile $@ - -clean: - rm -f *~ *.tc *.pp *.pp.bz2 - rm -rf tmp *.tar.gz - -man: install - sepolicy manpage --domain ${TARGETS}_t - -install: - semodule -i ${TARGETS} - diff --git a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/README.md b/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/README.md deleted file mode 100644 index 7ea3117a8..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/README.md +++ /dev/null @@ -1 +0,0 @@ -SELinux policy for docker diff --git a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.fc b/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.fc deleted file mode 100644 index 10b7d52a8..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.fc +++ /dev/null @@ -1,33 +0,0 @@ -/root/\.docker gen_context(system_u:object_r:docker_home_t,s0) - -/usr/bin/docker -- gen_context(system_u:object_r:docker_exec_t,s0) -/usr/bin/docker-novolume-plugin -- gen_context(system_u:object_r:docker_auth_exec_t,s0) -/usr/lib/docker/docker-novolume-plugin -- gen_context(system_u:object_r:docker_auth_exec_t,s0) - -/usr/lib/systemd/system/docker.service -- gen_context(system_u:object_r:docker_unit_file_t,s0) -/usr/lib/systemd/system/docker-novolume-plugin.service -- gen_context(system_u:object_r:docker_unit_file_t,s0) - -/etc/docker(/.*)? gen_context(system_u:object_r:docker_config_t,s0) - -/var/lib/docker(/.*)? gen_context(system_u:object_r:docker_var_lib_t,s0) -/var/lib/kublet(/.*)? gen_context(system_u:object_r:docker_var_lib_t,s0) -/var/lib/docker/vfs(/.*)? gen_context(system_u:object_r:svirt_sandbox_file_t,s0) - -/var/run/docker(/.*)? gen_context(system_u:object_r:docker_var_run_t,s0) -/var/run/docker\.pid -- gen_context(system_u:object_r:docker_var_run_t,s0) -/var/run/docker\.sock -s gen_context(system_u:object_r:docker_var_run_t,s0) -/var/run/docker-client(/.*)? gen_context(system_u:object_r:docker_var_run_t,s0) -/var/run/docker/plugins(/.*)? gen_context(system_u:object_r:docker_plugin_var_run_t,s0) - -/var/lock/lxc(/.*)? gen_context(system_u:object_r:docker_lock_t,s0) - -/var/log/lxc(/.*)? gen_context(system_u:object_r:docker_log_t,s0) - -/var/lib/docker/init(/.*)? gen_context(system_u:object_r:docker_share_t,s0) -/var/lib/docker/containers/.*/hosts gen_context(system_u:object_r:docker_share_t,s0) -/var/lib/docker/containers/.*/hostname gen_context(system_u:object_r:docker_share_t,s0) -/var/lib/docker/.*/config\.env gen_context(system_u:object_r:docker_share_t,s0) - -# OL7.2 systemd selinux update -/var/run/systemd/machines(/.*)? gen_context(system_u:object_r:systemd_machined_var_run_t,s0) -/var/lib/machines(/.*)? gen_context(system_u:object_r:systemd_machined_var_lib_t,s0) diff --git a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.if b/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.if deleted file mode 100644 index 4780af05f..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.if +++ /dev/null @@ -1,659 +0,0 @@ - -## The open-source application container engine. - -######################################## -## -## Execute docker in the docker domain. -## -## -## -## Domain allowed to transition. -## -## -# -interface(`docker_domtrans',` - gen_require(` - type docker_t, docker_exec_t; - ') - - corecmd_search_bin($1) - domtrans_pattern($1, docker_exec_t, docker_t) -') - -######################################## -## -## Execute docker in the caller domain. -## -## -## -## Domain allowed to transition. -## -## -# -interface(`docker_exec',` - gen_require(` - type docker_exec_t; - ') - - corecmd_search_bin($1) - can_exec($1, docker_exec_t) -') - -######################################## -## -## Search docker lib directories. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_search_lib',` - gen_require(` - type docker_var_lib_t; - ') - - allow $1 docker_var_lib_t:dir search_dir_perms; - files_search_var_lib($1) -') - -######################################## -## -## Execute docker lib directories. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_exec_lib',` - gen_require(` - type docker_var_lib_t; - ') - - allow $1 docker_var_lib_t:dir search_dir_perms; - can_exec($1, docker_var_lib_t) -') - -######################################## -## -## Read docker lib files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_read_lib_files',` - gen_require(` - type docker_var_lib_t; - ') - - files_search_var_lib($1) - read_files_pattern($1, docker_var_lib_t, docker_var_lib_t) -') - -######################################## -## -## Read docker share files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_read_share_files',` - gen_require(` - type docker_share_t; - ') - - files_search_var_lib($1) - list_dirs_pattern($1, docker_share_t, docker_share_t) - read_files_pattern($1, docker_share_t, docker_share_t) - read_lnk_files_pattern($1, docker_share_t, docker_share_t) -') - -###################################### -## -## Allow the specified domain to execute docker shared files -## in the caller domain. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_exec_share_files',` - gen_require(` - type docker_share_t; - ') - - can_exec($1, docker_share_t) -') - -######################################## -## -## Manage docker lib files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_manage_lib_files',` - gen_require(` - type docker_var_lib_t; - ') - - files_search_var_lib($1) - manage_files_pattern($1, docker_var_lib_t, docker_var_lib_t) - manage_lnk_files_pattern($1, docker_var_lib_t, docker_var_lib_t) -') - -######################################## -## -## Manage docker lib directories. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_manage_lib_dirs',` - gen_require(` - type docker_var_lib_t; - ') - - files_search_var_lib($1) - manage_dirs_pattern($1, docker_var_lib_t, docker_var_lib_t) -') - -######################################## -## -## Create objects in a docker var lib directory -## with an automatic type transition to -## a specified private type. -## -## -## -## Domain allowed access. -## -## -## -## -## The type of the object to create. -## -## -## -## -## The class of the object to be created. -## -## -## -## -## The name of the object being created. -## -## -# -interface(`docker_lib_filetrans',` - gen_require(` - type docker_var_lib_t; - ') - - filetrans_pattern($1, docker_var_lib_t, $2, $3, $4) -') - -######################################## -## -## Read docker PID files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_read_pid_files',` - gen_require(` - type docker_var_run_t; - ') - - files_search_pids($1) - read_files_pattern($1, docker_var_run_t, docker_var_run_t) -') - -######################################## -## -## Execute docker server in the docker domain. -## -## -## -## Domain allowed to transition. -## -## -# -interface(`docker_systemctl',` - gen_require(` - type docker_t; - type docker_unit_file_t; - ') - - systemd_exec_systemctl($1) - init_reload_services($1) - systemd_read_fifo_file_passwd_run($1) - allow $1 docker_unit_file_t:file read_file_perms; - allow $1 docker_unit_file_t:service manage_service_perms; - - ps_process_pattern($1, docker_t) -') - -######################################## -## -## Read and write docker shared memory. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_rw_sem',` - gen_require(` - type docker_t; - ') - - allow $1 docker_t:sem rw_sem_perms; -') - -####################################### -## -## Read and write the docker pty type. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_use_ptys',` - gen_require(` - type docker_devpts_t; - ') - - allow $1 docker_devpts_t:chr_file rw_term_perms; -') - -####################################### -## -## Allow domain to create docker content -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_filetrans_named_content',` - - gen_require(` - type docker_var_lib_t; - type docker_share_t; - type docker_log_t; - type docker_var_run_t; - type docker_home_t; - ') - - files_pid_filetrans($1, docker_var_run_t, file, "docker.pid") - files_pid_filetrans($1, docker_var_run_t, sock_file, "docker.sock") - files_pid_filetrans($1, docker_var_run_t, dir, "docker-client") - logging_log_filetrans($1, docker_log_t, dir, "lxc") - files_var_lib_filetrans($1, docker_var_lib_t, dir, "docker") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "config.env") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "hosts") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "hostname") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "resolv.conf") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, dir, "init") - userdom_admin_home_dir_filetrans($1, docker_home_t, dir, ".docker") -') - -######################################## -## -## Connect to docker over a unix stream socket. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_stream_connect',` - gen_require(` - type docker_t, docker_var_run_t; - ') - - files_search_pids($1) - stream_connect_pattern($1, docker_var_run_t, docker_var_run_t, docker_t) -') - -######################################## -## -## Connect to SPC containers over a unix stream socket. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_spc_stream_connect',` - gen_require(` - type spc_t, spc_var_run_t; - ') - - files_search_pids($1) - files_write_all_pid_sockets($1) - allow $1 spc_t:unix_stream_socket connectto; -') - -######################################## -## -## All of the rules required to administrate -## an docker environment -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_admin',` - gen_require(` - type docker_t; - type docker_var_lib_t, docker_var_run_t; - type docker_unit_file_t; - type docker_lock_t; - type docker_log_t; - type docker_config_t; - ') - - allow $1 docker_t:process { ptrace signal_perms }; - ps_process_pattern($1, docker_t) - - admin_pattern($1, docker_config_t) - - files_search_var_lib($1) - admin_pattern($1, docker_var_lib_t) - - files_search_pids($1) - admin_pattern($1, docker_var_run_t) - - files_search_locks($1) - admin_pattern($1, docker_lock_t) - - logging_search_logs($1) - admin_pattern($1, docker_log_t) - - docker_systemctl($1) - admin_pattern($1, docker_unit_file_t) - allow $1 docker_unit_file_t:service all_service_perms; - - optional_policy(` - systemd_passwd_agent_exec($1) - systemd_read_fifo_file_passwd_run($1) - ') -') - -######################################## -## -## Execute docker_auth_exec_t in the docker_auth domain. -## -## -## -## Domain allowed to transition. -## -## -# -interface(`docker_auth_domtrans',` - gen_require(` - type docker_auth_t, docker_auth_exec_t; - ') - - corecmd_search_bin($1) - domtrans_pattern($1, docker_auth_exec_t, docker_auth_t) -') - -###################################### -## -## Execute docker_auth in the caller domain. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_auth_exec',` - gen_require(` - type docker_auth_exec_t; - ') - - corecmd_search_bin($1) - can_exec($1, docker_auth_exec_t) -') - -######################################## -## -## Connect to docker_auth over a unix stream socket. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_auth_stream_connect',` - gen_require(` - type docker_auth_t, docker_plugin_var_run_t; - ') - - files_search_pids($1) - stream_connect_pattern($1, docker_plugin_var_run_t, docker_plugin_var_run_t, docker_auth_t) -') - -######################################## -## -## docker domain typebounds calling domain. -## -## -## -## Domain to be typebound. -## -## -# -interface(`docker_typebounds',` - gen_require(` - type docker_t; - ') - - typebounds docker_t $1; -') - -######################################## -## -## Allow any docker_exec_t to be an entrypoint of this domain -## -## -## -## Domain allowed access. -## -## -## -# -interface(`docker_entrypoint',` - gen_require(` - type docker_exec_t; - ') - allow $1 docker_exec_t:file entrypoint; -') - -######################################## -## -## Send and receive messages from -## systemd machined over dbus. -## -## -## -## Domain allowed access. -## -## -# -interface(`systemd_dbus_chat_machined',` - gen_require(` - type systemd_machined_t; - class dbus send_msg; - ') - - allow $1 systemd_machined_t:dbus send_msg; - allow systemd_machined_t $1:dbus send_msg; - ps_process_pattern(systemd_machined_t, $1) -') - -######################################## -## -## Allow any svirt_sandbox_file_t to be an entrypoint of this domain -## -## -## -## Domain allowed access. -## -## -## -# -interface(`virt_sandbox_entrypoint',` - gen_require(` - type svirt_sandbox_file_t; - ') - allow $1 svirt_sandbox_file_t:file entrypoint; -') - -######################################## -## -## Send and receive messages from -## virt over dbus. -## -## -## -## Domain allowed access. -## -## -# -interface(`virt_dbus_chat',` - gen_require(` - type virtd_t; - class dbus send_msg; - ') - - allow $1 virtd_t:dbus send_msg; - allow virtd_t $1:dbus send_msg; - ps_process_pattern(virtd_t, $1) -') - -####################################### -## -## Read the process state of virt sandbox containers -## -## -## -## Domain allowed access. -## -## -# -interface(`virt_sandbox_read_state',` - gen_require(` - attribute svirt_sandbox_domain; - ') - - ps_process_pattern($1, svirt_sandbox_domain) -') - -###################################### -## -## Send a signal to sandbox domains -## -## -## -## Domain allowed access. -## -## -# -interface(`virt_signal_sandbox',` - gen_require(` - attribute svirt_sandbox_domain; - ') - - allow $1 svirt_sandbox_domain:process signal; -') - -####################################### -## -## Getattr Sandbox File systems -## -## -## -## Domain allowed access. -## -## -# -interface(`virt_getattr_sandbox_filesystem',` - gen_require(` - type svirt_sandbox_file_t; - ') - - allow $1 svirt_sandbox_file_t:filesystem getattr; -') - -####################################### -## -## Read Sandbox Files -## -## -## -## Domain allowed access. -## -## -# -interface(`virt_read_sandbox_files',` - gen_require(` - type svirt_sandbox_file_t; - ') - - list_dirs_pattern($1, svirt_sandbox_file_t, svirt_sandbox_file_t) - read_files_pattern($1, svirt_sandbox_file_t, svirt_sandbox_file_t) - read_lnk_files_pattern($1, svirt_sandbox_file_t, svirt_sandbox_file_t) -') - -####################################### -## -## Read the process state of spc containers -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_spc_read_state',` - gen_require(` - type spc_t; - ') - - ps_process_pattern($1, spc_t) -') - diff --git a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.te b/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.te deleted file mode 100644 index d4de36fe4..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux-oraclelinux-7/docker-engine-selinux/docker.te +++ /dev/null @@ -1,465 +0,0 @@ -policy_module(docker, 1.0.0) - -######################################## -# -# Declarations -# - -## -##

-## Determine whether docker can -## connect to all TCP ports. -##

-##
-gen_tunable(docker_connect_any, false) - -type docker_t; -type docker_exec_t; -init_daemon_domain(docker_t, docker_exec_t) -domain_subj_id_change_exemption(docker_t) -domain_role_change_exemption(docker_t) - -type spc_t; -domain_type(spc_t) -role system_r types spc_t; - -type docker_auth_t; -type docker_auth_exec_t; -init_daemon_domain(docker_auth_t, docker_auth_exec_t) - -type spc_var_run_t; -files_pid_file(spc_var_run_t) - -type docker_var_lib_t; -files_type(docker_var_lib_t) - -type docker_home_t; -userdom_user_home_content(docker_home_t) - -type docker_config_t; -files_config_file(docker_config_t) - -type docker_lock_t; -files_lock_file(docker_lock_t) - -type docker_log_t; -logging_log_file(docker_log_t) - -type docker_tmp_t; -files_tmp_file(docker_tmp_t) - -type docker_tmpfs_t; -files_tmpfs_file(docker_tmpfs_t) - -type docker_var_run_t; -files_pid_file(docker_var_run_t) - -type docker_plugin_var_run_t; -files_pid_file(docker_plugin_var_run_t) - -type docker_unit_file_t; -systemd_unit_file(docker_unit_file_t) - -type docker_devpts_t; -term_pty(docker_devpts_t) - -type docker_share_t; -files_type(docker_share_t) - -# OL7 systemd selinux update -type systemd_machined_t; -type systemd_machined_exec_t; -init_daemon_domain(systemd_machined_t, systemd_machined_exec_t) - -# /run/systemd/machines -type systemd_machined_var_run_t; -files_pid_file(systemd_machined_var_run_t) - -# /var/lib/machines -type systemd_machined_var_lib_t; -files_type(systemd_machined_var_lib_t) - - -######################################## -# -# docker local policy -# -allow docker_t self:capability { chown kill fowner fsetid mknod net_admin net_bind_service net_raw setfcap }; -allow docker_t self:tun_socket relabelto; -allow docker_t self:process { getattr signal_perms setrlimit setfscreate }; -allow docker_t self:fifo_file rw_fifo_file_perms; -allow docker_t self:unix_stream_socket create_stream_socket_perms; -allow docker_t self:tcp_socket create_stream_socket_perms; -allow docker_t self:udp_socket create_socket_perms; -allow docker_t self:capability2 block_suspend; - -docker_auth_stream_connect(docker_t) - -manage_files_pattern(docker_t, docker_home_t, docker_home_t) -manage_dirs_pattern(docker_t, docker_home_t, docker_home_t) -manage_lnk_files_pattern(docker_t, docker_home_t, docker_home_t) -userdom_admin_home_dir_filetrans(docker_t, docker_home_t, dir, ".docker") - -manage_dirs_pattern(docker_t, docker_config_t, docker_config_t) -manage_files_pattern(docker_t, docker_config_t, docker_config_t) -files_etc_filetrans(docker_t, docker_config_t, dir, "docker") - -manage_dirs_pattern(docker_t, docker_lock_t, docker_lock_t) -manage_files_pattern(docker_t, docker_lock_t, docker_lock_t) -files_lock_filetrans(docker_t, docker_lock_t, { dir file }, "lxc") - -manage_dirs_pattern(docker_t, docker_log_t, docker_log_t) -manage_files_pattern(docker_t, docker_log_t, docker_log_t) -manage_lnk_files_pattern(docker_t, docker_log_t, docker_log_t) -logging_log_filetrans(docker_t, docker_log_t, { dir file lnk_file }) -allow docker_t docker_log_t:dir_file_class_set { relabelfrom relabelto }; - -manage_dirs_pattern(docker_t, docker_tmp_t, docker_tmp_t) -manage_files_pattern(docker_t, docker_tmp_t, docker_tmp_t) -manage_lnk_files_pattern(docker_t, docker_tmp_t, docker_tmp_t) -files_tmp_filetrans(docker_t, docker_tmp_t, { dir file lnk_file }) - -manage_dirs_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_lnk_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_fifo_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_chr_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_blk_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -allow docker_t docker_tmpfs_t:dir relabelfrom; -can_exec(docker_t, docker_tmpfs_t) -fs_tmpfs_filetrans(docker_t, docker_tmpfs_t, { dir file }) -allow docker_t docker_tmpfs_t:chr_file mounton; - -manage_dirs_pattern(docker_t, docker_share_t, docker_share_t) -manage_files_pattern(docker_t, docker_share_t, docker_share_t) -manage_lnk_files_pattern(docker_t, docker_share_t, docker_share_t) -allow docker_t docker_share_t:dir_file_class_set { relabelfrom relabelto }; - -can_exec(docker_t, docker_share_t) -#docker_filetrans_named_content(docker_t) - -manage_dirs_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_chr_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_blk_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_lnk_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -allow docker_t docker_var_lib_t:dir_file_class_set { relabelfrom relabelto }; -files_var_lib_filetrans(docker_t, docker_var_lib_t, { dir file lnk_file }) - -manage_dirs_pattern(docker_t, docker_var_run_t, docker_var_run_t) -manage_files_pattern(docker_t, docker_var_run_t, docker_var_run_t) -manage_sock_files_pattern(docker_t, docker_var_run_t, docker_var_run_t) -manage_lnk_files_pattern(docker_t, docker_var_run_t, docker_var_run_t) -files_pid_filetrans(docker_t, docker_var_run_t, { dir file lnk_file sock_file }) - -allow docker_t docker_devpts_t:chr_file { relabelfrom rw_chr_file_perms setattr_chr_file_perms }; -term_create_pty(docker_t, docker_devpts_t) - -kernel_read_system_state(docker_t) -kernel_read_network_state(docker_t) -kernel_read_all_sysctls(docker_t) -kernel_rw_net_sysctls(docker_t) -kernel_setsched(docker_t) -kernel_read_all_proc(docker_t) - -domain_use_interactive_fds(docker_t) -domain_dontaudit_read_all_domains_state(docker_t) - -corecmd_exec_bin(docker_t) -corecmd_exec_shell(docker_t) - -corenet_tcp_bind_generic_node(docker_t) -corenet_tcp_sendrecv_generic_if(docker_t) -corenet_tcp_sendrecv_generic_node(docker_t) -corenet_tcp_sendrecv_generic_port(docker_t) -corenet_tcp_bind_all_ports(docker_t) -corenet_tcp_connect_http_port(docker_t) -corenet_tcp_connect_commplex_main_port(docker_t) -corenet_udp_sendrecv_generic_if(docker_t) -corenet_udp_sendrecv_generic_node(docker_t) -corenet_udp_sendrecv_all_ports(docker_t) -corenet_udp_bind_generic_node(docker_t) -corenet_udp_bind_all_ports(docker_t) - -files_read_config_files(docker_t) -files_dontaudit_getattr_all_dirs(docker_t) -files_dontaudit_getattr_all_files(docker_t) - -fs_read_cgroup_files(docker_t) -fs_read_tmpfs_symlinks(docker_t) -fs_search_all(docker_t) -fs_getattr_all_fs(docker_t) - -storage_raw_rw_fixed_disk(docker_t) - -auth_use_nsswitch(docker_t) -auth_dontaudit_getattr_shadow(docker_t) - -init_read_state(docker_t) -init_status(docker_t) - -logging_send_audit_msgs(docker_t) -logging_send_syslog_msg(docker_t) - -miscfiles_read_localization(docker_t) - -mount_domtrans(docker_t) - -seutil_read_default_contexts(docker_t) -seutil_read_config(docker_t) - -sysnet_dns_name_resolve(docker_t) -sysnet_exec_ifconfig(docker_t) - -optional_policy(` - rpm_exec(docker_t) - rpm_read_db(docker_t) - rpm_exec(docker_t) -') - -optional_policy(` - fstools_domtrans(docker_t) -') - -optional_policy(` - iptables_domtrans(docker_t) -') - -optional_policy(` - openvswitch_stream_connect(docker_t) -') - -# -# lxc rules -# - -allow docker_t self:capability { dac_override setgid setpcap setuid sys_admin sys_boot sys_chroot sys_ptrace }; - -allow docker_t self:process { getcap setcap setexec setpgid setsched signal_perms }; - -allow docker_t self:netlink_route_socket rw_netlink_socket_perms;; -allow docker_t self:netlink_audit_socket create_netlink_socket_perms; -allow docker_t self:unix_dgram_socket { create_socket_perms sendto }; -allow docker_t self:unix_stream_socket { create_stream_socket_perms connectto }; - -allow docker_t docker_var_lib_t:dir mounton; -allow docker_t docker_var_lib_t:chr_file mounton; -can_exec(docker_t, docker_var_lib_t) - -kernel_dontaudit_setsched(docker_t) -kernel_get_sysvipc_info(docker_t) -kernel_request_load_module(docker_t) -kernel_mounton_messages(docker_t) -kernel_mounton_all_proc(docker_t) -kernel_mounton_all_sysctls(docker_t) -kernel_unlabeled_entry_type(spc_t) -kernel_unlabeled_domtrans(docker_t, spc_t) - -dev_getattr_all(docker_t) -dev_getattr_sysfs_fs(docker_t) -dev_read_urand(docker_t) -dev_read_lvm_control(docker_t) -dev_rw_sysfs(docker_t) -dev_rw_loop_control(docker_t) -dev_rw_lvm_control(docker_t) - -files_getattr_isid_type_dirs(docker_t) -files_manage_isid_type_dirs(docker_t) -files_manage_isid_type_files(docker_t) -files_manage_isid_type_symlinks(docker_t) -files_manage_isid_type_chr_files(docker_t) -files_manage_isid_type_blk_files(docker_t) -files_exec_isid_files(docker_t) -files_mounton_isid(docker_t) -files_mounton_non_security(docker_t) -files_mounton_isid_type_chr_file(docker_t) - -fs_mount_all_fs(docker_t) -fs_unmount_all_fs(docker_t) -fs_remount_all_fs(docker_t) -files_mounton_isid(docker_t) -fs_manage_cgroup_dirs(docker_t) -fs_manage_cgroup_files(docker_t) -fs_relabelfrom_xattr_fs(docker_t) -fs_relabelfrom_tmpfs(docker_t) -fs_read_tmpfs_symlinks(docker_t) -fs_list_hugetlbfs(docker_t) - -term_use_generic_ptys(docker_t) -term_use_ptmx(docker_t) -term_getattr_pty_fs(docker_t) -term_relabel_pty_fs(docker_t) -term_mounton_unallocated_ttys(docker_t) - -modutils_domtrans_insmod(docker_t) - -systemd_status_all_unit_files(docker_t) -systemd_start_systemd_services(docker_t) - -userdom_stream_connect(docker_t) -userdom_search_user_home_content(docker_t) -userdom_read_all_users_state(docker_t) -userdom_relabel_user_home_files(docker_t) -userdom_relabel_user_tmp_files(docker_t) -userdom_relabel_user_tmp_dirs(docker_t) - -optional_policy(` - gpm_getattr_gpmctl(docker_t) -') - -optional_policy(` - dbus_system_bus_client(docker_t) - init_dbus_chat(docker_t) - init_start_transient_unit(docker_t) - - optional_policy(` - systemd_dbus_chat_logind(docker_t) - systemd_dbus_chat_machined(docker_t) - ') - - optional_policy(` - firewalld_dbus_chat(docker_t) - ') -') - -optional_policy(` - udev_read_db(docker_t) -') - -optional_policy(` - unconfined_domain(docker_t) - # unconfined_typebounds(docker_t) -') - -optional_policy(` - virt_read_config(docker_t) - virt_exec(docker_t) - virt_stream_connect(docker_t) - virt_stream_connect_sandbox(docker_t) - virt_exec_sandbox_files(docker_t) - virt_manage_sandbox_files(docker_t) - virt_relabel_sandbox_filesystem(docker_t) - # for lxc - virt_transition_svirt_sandbox(docker_t, system_r) - virt_mounton_sandbox_file(docker_t) -# virt_attach_sandbox_tun_iface(docker_t) - allow docker_t svirt_sandbox_domain:tun_socket relabelfrom; - virt_sandbox_entrypoint(docker_t) -') - -tunable_policy(`docker_connect_any',` - corenet_tcp_connect_all_ports(docker_t) - corenet_sendrecv_all_packets(docker_t) - corenet_tcp_sendrecv_all_ports(docker_t) -') - -######################################## -# -# spc local policy -# -allow spc_t { docker_var_lib_t docker_share_t }:file entrypoint; -role system_r types spc_t; - -domtrans_pattern(docker_t, docker_share_t, spc_t) -domtrans_pattern(docker_t, docker_var_lib_t, spc_t) -allow docker_t spc_t:process { setsched signal_perms }; -ps_process_pattern(docker_t, spc_t) -allow docker_t spc_t:socket_class_set { relabelto relabelfrom }; -filetrans_pattern(docker_t, docker_var_lib_t, docker_share_t, dir, "overlay") - -optional_policy(` - systemd_dbus_chat_machined(spc_t) -') - -optional_policy(` - dbus_chat_system_bus(spc_t) -') - -optional_policy(` - unconfined_domain_noaudit(spc_t) -') - -optional_policy(` - virt_transition_svirt_sandbox(spc_t, system_r) - virt_sandbox_entrypoint(spc_t) -') - -######################################## -# -# docker_auth local policy -# -allow docker_auth_t self:fifo_file rw_fifo_file_perms; -allow docker_auth_t self:unix_stream_socket create_stream_socket_perms; -dontaudit docker_auth_t self:capability net_admin; - -docker_stream_connect(docker_auth_t) - -manage_dirs_pattern(docker_auth_t, docker_plugin_var_run_t, docker_plugin_var_run_t) -manage_files_pattern(docker_auth_t, docker_plugin_var_run_t, docker_plugin_var_run_t) -manage_sock_files_pattern(docker_auth_t, docker_plugin_var_run_t, docker_plugin_var_run_t) -manage_lnk_files_pattern(docker_auth_t, docker_plugin_var_run_t, docker_plugin_var_run_t) -files_pid_filetrans(docker_auth_t, docker_plugin_var_run_t, { dir file lnk_file sock_file }) - -domain_use_interactive_fds(docker_auth_t) - -kernel_read_net_sysctls(docker_auth_t) - -auth_use_nsswitch(docker_auth_t) - -files_read_etc_files(docker_auth_t) - -miscfiles_read_localization(docker_auth_t) - -sysnet_dns_name_resolve(docker_auth_t) - -######################################## -# -# OL7.2 systemd selinux update -# systemd_machined local policy -# -allow systemd_machined_t self:capability { dac_override setgid sys_admin sys_chroot sys_ptrace }; -allow systemd_machined_t systemd_unit_file_t:service { status start }; -allow systemd_machined_t self:unix_dgram_socket create_socket_perms; - -manage_dirs_pattern(systemd_machined_t, systemd_machined_var_run_t, systemd_machined_var_run_t) -manage_files_pattern(systemd_machined_t, systemd_machined_var_run_t, systemd_machined_var_run_t) -manage_lnk_files_pattern(systemd_machined_t, systemd_machined_var_run_t, systemd_machined_var_run_t) -init_pid_filetrans(systemd_machined_t, systemd_machined_var_run_t, dir, "machines") - -manage_dirs_pattern(systemd_machined_t, systemd_machined_var_lib_t, systemd_machined_var_lib_t) -manage_files_pattern(systemd_machined_t, systemd_machined_var_lib_t, systemd_machined_var_lib_t) -manage_lnk_files_pattern(systemd_machined_t, systemd_machined_var_lib_t, systemd_machined_var_lib_t) -init_var_lib_filetrans(systemd_machined_t, systemd_machined_var_lib_t, dir, "machines") - -kernel_dgram_send(systemd_machined_t) -# This is a bug, but need for now. -kernel_read_unlabeled_state(systemd_machined_t) - -init_dbus_chat(systemd_machined_t) -init_status(systemd_machined_t) - -userdom_dbus_send_all_users(systemd_machined_t) - -term_use_ptmx(systemd_machined_t) - -optional_policy(` - dbus_connect_system_bus(systemd_machined_t) - dbus_system_bus_client(systemd_machined_t) -') - -optional_policy(` - docker_read_share_files(systemd_machined_t) - docker_spc_read_state(systemd_machined_t) -') - -optional_policy(` - virt_dbus_chat(systemd_machined_t) - virt_sandbox_read_state(systemd_machined_t) - virt_signal_sandbox(systemd_machined_t) - virt_stream_connect_sandbox(systemd_machined_t) - virt_rw_svirt_dev(systemd_machined_t) - virt_getattr_sandbox_filesystem(systemd_machined_t) - virt_read_sandbox_files(systemd_machined_t) -') - - diff --git a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/LICENSE b/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/LICENSE deleted file mode 100644 index 5b6e7c66c..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/LICENSE +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/Makefile b/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/Makefile deleted file mode 100644 index 1bdc695af..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -TARGETS?=docker -MODULES?=${TARGETS:=.pp.bz2} -SHAREDIR?=/usr/share - -all: ${TARGETS:=.pp.bz2} - -%.pp.bz2: %.pp - @echo Compressing $^ -\> $@ - bzip2 -9 $^ - -%.pp: %.te - make -f ${SHAREDIR}/selinux/devel/Makefile $@ - -clean: - rm -f *~ *.tc *.pp *.pp.bz2 - rm -rf tmp *.tar.gz diff --git a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.fc b/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.fc deleted file mode 100644 index 467d65960..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.fc +++ /dev/null @@ -1,18 +0,0 @@ -/root/\.docker gen_context(system_u:object_r:docker_home_t,s0) - -/usr/bin/dockerd -- gen_context(system_u:object_r:docker_exec_t,s0) - -/usr/lib/systemd/system/docker.service -- gen_context(system_u:object_r:docker_unit_file_t,s0) - -/etc/docker(/.*)? gen_context(system_u:object_r:docker_config_t,s0) - -/var/lib/docker(/.*)? gen_context(system_u:object_r:docker_var_lib_t,s0) - -/var/run/docker\.pid -- gen_context(system_u:object_r:docker_var_run_t,s0) -/var/run/docker\.sock -s gen_context(system_u:object_r:docker_var_run_t,s0) -/var/run/docker-client(/.*)? gen_context(system_u:object_r:docker_var_run_t,s0) - -/var/lib/docker/init(/.*)? gen_context(system_u:object_r:docker_share_t,s0) -/var/lib/docker/containers/.*/hosts gen_context(system_u:object_r:docker_share_t,s0) -/var/lib/docker/containers/.*/hostname gen_context(system_u:object_r:docker_share_t,s0) -/var/lib/docker/.*/config\.env gen_context(system_u:object_r:docker_share_t,s0) diff --git a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.if b/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.if deleted file mode 100644 index ca075c05c..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.if +++ /dev/null @@ -1,461 +0,0 @@ - -## The open-source application container engine. - -######################################## -## -## Execute docker in the docker domain. -## -## -## -## Domain allowed to transition. -## -## -# -interface(`docker_domtrans',` - gen_require(` - type docker_t, docker_exec_t; - ') - - corecmd_search_bin($1) - domtrans_pattern($1, docker_exec_t, docker_t) -') - -######################################## -## -## Execute docker in the caller domain. -## -## -## -## Domain allowed to transition. -## -## -# -interface(`docker_exec',` - gen_require(` - type docker_exec_t; - ') - - corecmd_search_bin($1) - can_exec($1, docker_exec_t) -') - -######################################## -## -## Search docker lib directories. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_search_lib',` - gen_require(` - type docker_var_lib_t; - ') - - allow $1 docker_var_lib_t:dir search_dir_perms; - files_search_var_lib($1) -') - -######################################## -## -## Execute docker lib directories. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_exec_lib',` - gen_require(` - type docker_var_lib_t; - ') - - allow $1 docker_var_lib_t:dir search_dir_perms; - can_exec($1, docker_var_lib_t) -') - -######################################## -## -## Read docker lib files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_read_lib_files',` - gen_require(` - type docker_var_lib_t; - ') - - files_search_var_lib($1) - read_files_pattern($1, docker_var_lib_t, docker_var_lib_t) -') - -######################################## -## -## Read docker share files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_read_share_files',` - gen_require(` - type docker_share_t; - ') - - files_search_var_lib($1) - read_files_pattern($1, docker_share_t, docker_share_t) -') - -######################################## -## -## Manage docker lib files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_manage_lib_files',` - gen_require(` - type docker_var_lib_t; - ') - - files_search_var_lib($1) - manage_files_pattern($1, docker_var_lib_t, docker_var_lib_t) - manage_lnk_files_pattern($1, docker_var_lib_t, docker_var_lib_t) -') - -######################################## -## -## Manage docker lib directories. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_manage_lib_dirs',` - gen_require(` - type docker_var_lib_t; - ') - - files_search_var_lib($1) - manage_dirs_pattern($1, docker_var_lib_t, docker_var_lib_t) -') - -######################################## -## -## Create objects in a docker var lib directory -## with an automatic type transition to -## a specified private type. -## -## -## -## Domain allowed access. -## -## -## -## -## The type of the object to create. -## -## -## -## -## The class of the object to be created. -## -## -## -## -## The name of the object being created. -## -## -# -interface(`docker_lib_filetrans',` - gen_require(` - type docker_var_lib_t; - ') - - filetrans_pattern($1, docker_var_lib_t, $2, $3, $4) -') - -######################################## -## -## Read docker PID files. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_read_pid_files',` - gen_require(` - type docker_var_run_t; - ') - - files_search_pids($1) - read_files_pattern($1, docker_var_run_t, docker_var_run_t) -') - -######################################## -## -## Execute docker server in the docker domain. -## -## -## -## Domain allowed to transition. -## -## -# -interface(`docker_systemctl',` - gen_require(` - type docker_t; - type docker_unit_file_t; - ') - - systemd_exec_systemctl($1) - init_reload_services($1) - systemd_read_fifo_file_passwd_run($1) - allow $1 docker_unit_file_t:file read_file_perms; - allow $1 docker_unit_file_t:service manage_service_perms; - - ps_process_pattern($1, docker_t) -') - -######################################## -## -## Read and write docker shared memory. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_rw_sem',` - gen_require(` - type docker_t; - ') - - allow $1 docker_t:sem rw_sem_perms; -') - -####################################### -## -## Read and write the docker pty type. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_use_ptys',` - gen_require(` - type docker_devpts_t; - ') - - allow $1 docker_devpts_t:chr_file rw_term_perms; -') - -####################################### -## -## Allow domain to create docker content -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_filetrans_named_content',` - - gen_require(` - type docker_var_lib_t; - type docker_share_t; - type docker_log_t; - type docker_var_run_t; - type docker_home_t; - ') - - files_pid_filetrans($1, docker_var_run_t, file, "docker.pid") - files_pid_filetrans($1, docker_var_run_t, sock_file, "docker.sock") - files_pid_filetrans($1, docker_var_run_t, dir, "docker-client") - files_var_lib_filetrans($1, docker_var_lib_t, dir, "docker") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "config.env") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "hosts") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "hostname") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, file, "resolv.conf") - filetrans_pattern($1, docker_var_lib_t, docker_share_t, dir, "init") - userdom_admin_home_dir_filetrans($1, docker_home_t, dir, ".docker") -') - -######################################## -## -## Connect to docker over a unix stream socket. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_stream_connect',` - gen_require(` - type docker_t, docker_var_run_t; - ') - - files_search_pids($1) - stream_connect_pattern($1, docker_var_run_t, docker_var_run_t, docker_t) -') - -######################################## -## -## Connect to SPC containers over a unix stream socket. -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_spc_stream_connect',` - gen_require(` - type spc_t, spc_var_run_t; - ') - - files_search_pids($1) - files_write_all_pid_sockets($1) - allow $1 spc_t:unix_stream_socket connectto; -') - - -######################################## -## -## All of the rules required to administrate -## an docker environment -## -## -## -## Domain allowed access. -## -## -# -interface(`docker_admin',` - gen_require(` - type docker_t; - type docker_var_lib_t, docker_var_run_t; - type docker_unit_file_t; - type docker_lock_t; - type docker_log_t; - type docker_config_t; - ') - - allow $1 docker_t:process { ptrace signal_perms }; - ps_process_pattern($1, docker_t) - - admin_pattern($1, docker_config_t) - - files_search_var_lib($1) - admin_pattern($1, docker_var_lib_t) - - files_search_pids($1) - admin_pattern($1, docker_var_run_t) - - files_search_locks($1) - admin_pattern($1, docker_lock_t) - - logging_search_logs($1) - admin_pattern($1, docker_log_t) - - docker_systemctl($1) - admin_pattern($1, docker_unit_file_t) - allow $1 docker_unit_file_t:service all_service_perms; - - optional_policy(` - systemd_passwd_agent_exec($1) - systemd_read_fifo_file_passwd_run($1) - ') -') - -interface(`domain_stub_named_filetrans_domain',` - gen_require(` - attribute named_filetrans_domain; - ') -') - -interface(`lvm_stub',` - gen_require(` - type lvm_t; - ') -') -interface(`staff_stub',` - gen_require(` - type staff_t; - ') -') -interface(`virt_stub_svirt_sandbox_domain',` - gen_require(` - attribute svirt_sandbox_domain; - ') -') -interface(`virt_stub_svirt_sandbox_file',` - gen_require(` - type svirt_sandbox_file_t; - ') -') -interface(`fs_dontaudit_remount_tmpfs',` - gen_require(` - type tmpfs_t; - ') - - dontaudit $1 tmpfs_t:filesystem remount; -') -interface(`dev_dontaudit_list_all_dev_nodes',` - gen_require(` - type device_t; - ') - - dontaudit $1 device_t:dir list_dir_perms; -') -interface(`kernel_unlabeled_entry_type',` - gen_require(` - type unlabeled_t; - ') - - domain_entry_file($1, unlabeled_t) -') -interface(`kernel_unlabeled_domtrans',` - gen_require(` - type unlabeled_t; - ') - - read_lnk_files_pattern($1, unlabeled_t, unlabeled_t) - domain_transition_pattern($1, unlabeled_t, $2) - type_transition $1 unlabeled_t:process $2; -') -interface(`files_write_all_pid_sockets',` - gen_require(` - attribute pidfile; - ') - - allow $1 pidfile:sock_file write_sock_file_perms; -') -interface(`dev_dontaudit_mounton_sysfs',` - gen_require(` - type sysfs_t; - ') - - dontaudit $1 sysfs_t:dir mounton; -') diff --git a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.te b/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.te deleted file mode 100644 index bad0bb6e4..000000000 --- a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker.te +++ /dev/null @@ -1,407 +0,0 @@ -policy_module(docker, 1.0.0) - -######################################## -# -# Declarations -# - -## -##

-## Determine whether docker can -## connect to all TCP ports. -##

-##
-gen_tunable(docker_connect_any, false) - -type docker_t; -type docker_exec_t; -init_daemon_domain(docker_t, docker_exec_t) -domain_subj_id_change_exemption(docker_t) -domain_role_change_exemption(docker_t) - -type spc_t; -domain_type(spc_t) -role system_r types spc_t; - -type spc_var_run_t; -files_pid_file(spc_var_run_t) - -type docker_var_lib_t; -files_type(docker_var_lib_t) - -type docker_home_t; -userdom_user_home_content(docker_home_t) - -type docker_config_t; -files_config_file(docker_config_t) - -type docker_lock_t; -files_lock_file(docker_lock_t) - -type docker_log_t; -logging_log_file(docker_log_t) - -type docker_tmp_t; -files_tmp_file(docker_tmp_t) - -type docker_tmpfs_t; -files_tmpfs_file(docker_tmpfs_t) - -type docker_var_run_t; -files_pid_file(docker_var_run_t) - -type docker_unit_file_t; -systemd_unit_file(docker_unit_file_t) - -type docker_devpts_t; -term_pty(docker_devpts_t) - -type docker_share_t; -files_type(docker_share_t) - -######################################## -# -# docker local policy -# -allow docker_t self:capability { chown kill fowner fsetid mknod net_admin net_bind_service net_raw setfcap }; -allow docker_t self:tun_socket relabelto; -allow docker_t self:process { getattr signal_perms setrlimit setfscreate }; -allow docker_t self:fifo_file rw_fifo_file_perms; -allow docker_t self:unix_stream_socket create_stream_socket_perms; -allow docker_t self:tcp_socket create_stream_socket_perms; -allow docker_t self:udp_socket create_socket_perms; -allow docker_t self:capability2 block_suspend; - -manage_files_pattern(docker_t, docker_home_t, docker_home_t) -manage_dirs_pattern(docker_t, docker_home_t, docker_home_t) -manage_lnk_files_pattern(docker_t, docker_home_t, docker_home_t) -userdom_admin_home_dir_filetrans(docker_t, docker_home_t, dir, ".docker") - -manage_dirs_pattern(docker_t, docker_config_t, docker_config_t) -manage_files_pattern(docker_t, docker_config_t, docker_config_t) -files_etc_filetrans(docker_t, docker_config_t, dir, "docker") - -manage_dirs_pattern(docker_t, docker_lock_t, docker_lock_t) -manage_files_pattern(docker_t, docker_lock_t, docker_lock_t) - -manage_dirs_pattern(docker_t, docker_log_t, docker_log_t) -manage_files_pattern(docker_t, docker_log_t, docker_log_t) -manage_lnk_files_pattern(docker_t, docker_log_t, docker_log_t) -logging_log_filetrans(docker_t, docker_log_t, { dir file lnk_file }) -allow docker_t docker_log_t:dir_file_class_set { relabelfrom relabelto }; - -manage_dirs_pattern(docker_t, docker_tmp_t, docker_tmp_t) -manage_files_pattern(docker_t, docker_tmp_t, docker_tmp_t) -manage_lnk_files_pattern(docker_t, docker_tmp_t, docker_tmp_t) -files_tmp_filetrans(docker_t, docker_tmp_t, { dir file lnk_file }) - -manage_dirs_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_lnk_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_fifo_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_chr_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -manage_blk_files_pattern(docker_t, docker_tmpfs_t, docker_tmpfs_t) -allow docker_t docker_tmpfs_t:dir relabelfrom; -can_exec(docker_t, docker_tmpfs_t) -fs_tmpfs_filetrans(docker_t, docker_tmpfs_t, { dir file }) -allow docker_t docker_tmpfs_t:chr_file mounton; - -manage_dirs_pattern(docker_t, docker_share_t, docker_share_t) -manage_files_pattern(docker_t, docker_share_t, docker_share_t) -manage_lnk_files_pattern(docker_t, docker_share_t, docker_share_t) -allow docker_t docker_share_t:dir_file_class_set { relabelfrom relabelto }; - -can_exec(docker_t, docker_share_t) -#docker_filetrans_named_content(docker_t) - -manage_dirs_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_chr_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_blk_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -manage_lnk_files_pattern(docker_t, docker_var_lib_t, docker_var_lib_t) -allow docker_t docker_var_lib_t:dir_file_class_set { relabelfrom relabelto }; -files_var_lib_filetrans(docker_t, docker_var_lib_t, { dir file lnk_file }) - -manage_dirs_pattern(docker_t, docker_var_run_t, docker_var_run_t) -manage_files_pattern(docker_t, docker_var_run_t, docker_var_run_t) -manage_sock_files_pattern(docker_t, docker_var_run_t, docker_var_run_t) -manage_lnk_files_pattern(docker_t, docker_var_run_t, docker_var_run_t) -files_pid_filetrans(docker_t, docker_var_run_t, { dir file lnk_file sock_file }) - -allow docker_t docker_devpts_t:chr_file { relabelfrom rw_chr_file_perms setattr_chr_file_perms }; -term_create_pty(docker_t, docker_devpts_t) - -kernel_read_system_state(docker_t) -kernel_read_network_state(docker_t) -kernel_read_all_sysctls(docker_t) -kernel_rw_net_sysctls(docker_t) -kernel_setsched(docker_t) -kernel_read_all_proc(docker_t) - -domain_use_interactive_fds(docker_t) -domain_dontaudit_read_all_domains_state(docker_t) - -corecmd_exec_bin(docker_t) -corecmd_exec_shell(docker_t) - -corenet_tcp_bind_generic_node(docker_t) -corenet_tcp_sendrecv_generic_if(docker_t) -corenet_tcp_sendrecv_generic_node(docker_t) -corenet_tcp_sendrecv_generic_port(docker_t) -corenet_tcp_bind_all_ports(docker_t) -corenet_tcp_connect_http_port(docker_t) -corenet_tcp_connect_commplex_main_port(docker_t) -corenet_udp_sendrecv_generic_if(docker_t) -corenet_udp_sendrecv_generic_node(docker_t) -corenet_udp_sendrecv_all_ports(docker_t) -corenet_udp_bind_generic_node(docker_t) -corenet_udp_bind_all_ports(docker_t) - -files_read_config_files(docker_t) -files_dontaudit_getattr_all_dirs(docker_t) -files_dontaudit_getattr_all_files(docker_t) - -fs_read_cgroup_files(docker_t) -fs_read_tmpfs_symlinks(docker_t) -fs_search_all(docker_t) -fs_getattr_all_fs(docker_t) - -storage_raw_rw_fixed_disk(docker_t) - -auth_use_nsswitch(docker_t) -auth_dontaudit_getattr_shadow(docker_t) - -init_read_state(docker_t) -init_status(docker_t) - -logging_send_audit_msgs(docker_t) -logging_send_syslog_msg(docker_t) - -miscfiles_read_localization(docker_t) - -mount_domtrans(docker_t) - -seutil_read_default_contexts(docker_t) -seutil_read_config(docker_t) - -sysnet_dns_name_resolve(docker_t) -sysnet_exec_ifconfig(docker_t) - -optional_policy(` - rpm_exec(docker_t) - rpm_read_db(docker_t) - rpm_exec(docker_t) -') - -optional_policy(` - fstools_domtrans(docker_t) -') - -optional_policy(` - iptables_domtrans(docker_t) -') - -optional_policy(` - openvswitch_stream_connect(docker_t) -') - -allow docker_t self:capability { dac_override setgid setpcap setuid sys_admin sys_boot sys_chroot sys_ptrace }; - -allow docker_t self:process { getcap setcap setexec setpgid setsched signal_perms }; - -allow docker_t self:netlink_route_socket rw_netlink_socket_perms;; -allow docker_t self:netlink_audit_socket create_netlink_socket_perms; -allow docker_t self:unix_dgram_socket { create_socket_perms sendto }; -allow docker_t self:unix_stream_socket { create_stream_socket_perms connectto }; - -allow docker_t docker_var_lib_t:dir mounton; -allow docker_t docker_var_lib_t:chr_file mounton; -can_exec(docker_t, docker_var_lib_t) - -kernel_dontaudit_setsched(docker_t) -kernel_get_sysvipc_info(docker_t) -kernel_request_load_module(docker_t) -kernel_mounton_messages(docker_t) -kernel_mounton_all_proc(docker_t) -kernel_mounton_all_sysctls(docker_t) -kernel_unlabeled_entry_type(spc_t) -kernel_unlabeled_domtrans(docker_t, spc_t) - -dev_getattr_all(docker_t) -dev_getattr_sysfs_fs(docker_t) -dev_read_urand(docker_t) -dev_read_lvm_control(docker_t) -dev_rw_sysfs(docker_t) -dev_rw_loop_control(docker_t) -dev_rw_lvm_control(docker_t) - -files_getattr_isid_type_dirs(docker_t) -files_manage_isid_type_dirs(docker_t) -files_manage_isid_type_files(docker_t) -files_manage_isid_type_symlinks(docker_t) -files_manage_isid_type_chr_files(docker_t) -files_manage_isid_type_blk_files(docker_t) -files_exec_isid_files(docker_t) -files_mounton_isid(docker_t) -files_mounton_non_security(docker_t) -files_mounton_isid_type_chr_file(docker_t) - -fs_mount_all_fs(docker_t) -fs_unmount_all_fs(docker_t) -fs_remount_all_fs(docker_t) -files_mounton_isid(docker_t) -fs_manage_cgroup_dirs(docker_t) -fs_manage_cgroup_files(docker_t) -fs_relabelfrom_xattr_fs(docker_t) -fs_relabelfrom_tmpfs(docker_t) -fs_read_tmpfs_symlinks(docker_t) -fs_list_hugetlbfs(docker_t) - -term_use_generic_ptys(docker_t) -term_use_ptmx(docker_t) -term_getattr_pty_fs(docker_t) -term_relabel_pty_fs(docker_t) -term_mounton_unallocated_ttys(docker_t) - -modutils_domtrans_insmod(docker_t) - -systemd_status_all_unit_files(docker_t) -systemd_start_systemd_services(docker_t) - -userdom_stream_connect(docker_t) -userdom_search_user_home_content(docker_t) -userdom_read_all_users_state(docker_t) -userdom_relabel_user_home_files(docker_t) -userdom_relabel_user_tmp_files(docker_t) -userdom_relabel_user_tmp_dirs(docker_t) - -optional_policy(` - gpm_getattr_gpmctl(docker_t) -') - -optional_policy(` - dbus_system_bus_client(docker_t) - init_dbus_chat(docker_t) - init_start_transient_unit(docker_t) - - optional_policy(` - systemd_dbus_chat_logind(docker_t) - ') - - optional_policy(` - firewalld_dbus_chat(docker_t) - ') -') - -optional_policy(` - udev_read_db(docker_t) -') - -optional_policy(` - virt_read_config(docker_t) - virt_exec(docker_t) - virt_stream_connect(docker_t) - virt_stream_connect_sandbox(docker_t) - virt_exec_sandbox_files(docker_t) - virt_manage_sandbox_files(docker_t) - virt_relabel_sandbox_filesystem(docker_t) - virt_transition_svirt_sandbox(docker_t, system_r) - virt_mounton_sandbox_file(docker_t) -# virt_attach_sandbox_tun_iface(docker_t) - allow docker_t svirt_sandbox_domain:tun_socket relabelfrom; -') - -tunable_policy(`docker_connect_any',` - corenet_tcp_connect_all_ports(docker_t) - corenet_sendrecv_all_packets(docker_t) - corenet_tcp_sendrecv_all_ports(docker_t) -') - -######################################## -# -# spc local policy -# -domain_entry_file(spc_t, docker_share_t) -domain_entry_file(spc_t, docker_var_lib_t) -role system_r types spc_t; - -domain_entry_file(spc_t, docker_share_t) -domain_entry_file(spc_t, docker_var_lib_t) -domtrans_pattern(docker_t, docker_share_t, spc_t) -domtrans_pattern(docker_t, docker_var_lib_t, spc_t) -allow docker_t spc_t:process { setsched signal_perms }; -ps_process_pattern(docker_t, spc_t) -allow docker_t spc_t:socket_class_set { relabelto relabelfrom }; - -optional_policy(` - dbus_chat_system_bus(spc_t) -') - -optional_policy(` - unconfined_domain_noaudit(spc_t) -') - -optional_policy(` - unconfined_domain(docker_t) -') - -optional_policy(` - virt_transition_svirt_sandbox(spc_t, system_r) -') - -######################################## -# -# docker upstream policy -# - -optional_policy(` -# domain_stub_named_filetrans_domain() - gen_require(` - attribute named_filetrans_domain; - ') - - docker_filetrans_named_content(named_filetrans_domain) -') - -optional_policy(` - lvm_stub() - docker_rw_sem(lvm_t) -') - -optional_policy(` - staff_stub() - docker_stream_connect(staff_t) - docker_exec(staff_t) -') - -optional_policy(` - virt_stub_svirt_sandbox_domain() - virt_stub_svirt_sandbox_file() - allow svirt_sandbox_domain self:netlink_kobject_uevent_socket create_socket_perms; - docker_read_share_files(svirt_sandbox_domain) - docker_lib_filetrans(svirt_sandbox_domain,svirt_sandbox_file_t, sock_file) - docker_use_ptys(svirt_sandbox_domain) - docker_spc_stream_connect(svirt_sandbox_domain) - fs_list_tmpfs(svirt_sandbox_domain) - fs_rw_hugetlbfs_files(svirt_sandbox_domain) - fs_dontaudit_remount_tmpfs(svirt_sandbox_domain) - dev_dontaudit_mounton_sysfs(svirt_sandbox_domain) - - tunable_policy(`virt_sandbox_use_fusefs',` - fs_manage_fusefs_dirs(svirt_sandbox_domain) - fs_manage_fusefs_files(svirt_sandbox_domain) - fs_manage_fusefs_symlinks(svirt_sandbox_domain) - ') - gen_require(` - attribute domain; - ') - - dontaudit svirt_sandbox_domain domain:key {search link}; -') - -optional_policy(` - gen_require(` - type pcp_pmcd_t; - ') - docker_manage_lib_files(pcp_pmcd_t) -') diff --git a/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker_selinux.8.gz b/vendor/github.com/docker/docker/contrib/selinux/docker-engine-selinux/docker_selinux.8.gz deleted file mode 100644 index ab5d59445ac1601ca378aaa3e71fb9cff43a1592..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2847 zcmV+)3*hu0iwFo7v)okz17vSwYh`j@b7gF4ZgqGrH~__3TaVke5`I4V6@*`!6l=S| zL4lsU6wa>G7)ZQ6Yo}<61q526ZDJ)-B`NQ^I6wZ(@S=+?ue_UwK6D$4GsAB#9L|h1 zT74p9kjmtNshEi^7cAB+)14KO+rU$c!fk;-5#O zmV?vz9JoRUq(p7=UrB&Q;!Mydm$39gew3ZrB;ilS8)GkXHjhLJ~Z zb`9~dA;BW%P_PmCCQFh~L6RLy9thu%13cK#JwqnV8WL401Q%PfK6v5y10~;YJ{0bIQB&IB4h8PX!L;;nhe>W6UN2*vY){HP=m;wW%^*n~)VL%-lM6=;wQLDcf$Tqah4DzZ&A-OQ5 zpk}9!d<;9LGN)V+s;qrrJQSwpk3}bnLm)E<+bWW&HyOZUN+Z8! zrYvwTu1*6Pt*!k*0iAMYb~43Bh141ajx6w1(;G*YMQ=Hqr`EP^4~)I(9~ggC#Eqs? zD{L+egeI(L1_4dCa15BrIqU}t4{6QdV-7S)QIVWJI5#x+uY;!+G9tCH0HBZ%Sxi)C z8$>lWY$jj8Y28@j&axe-pr4r%%d53zgn1bWHS|f79H5xC)H0jgI zs0uU)bj^^I3>RHe-bFS9yYM?pRYwLc4Vmq2q_6juX;@({ab1JGR{4 zfw)WDORWuVA|@%o>a>8w)TaS@706>x{ypfAMZF9;#_*bFSi{*fL({Pf9G43qVP2w% zIefPU=Gn9DQa}6`GQB;xg;6xIw?0G;TbJ9dJ-0w6?P0F2$a6Y?)YuAX#LrY*3cta9 znbBSK62e9L9P1w1f-7Y@QM`a6_IzSR@_3V?)m{U-#s5;+q3R`&mIcd5CTWU?x6D`% zV8;+6L+lw|cO#sY_EKF!`4838h8Nl%`!hOJ>#s0)&D)<2@%Y(r-jGtktqviMNwER^ z48UzB*EEZ@e$}nh;O;eIRpUakf#QQ=iR`XhC_rrG0lrx?CC@<(%RcL-uQ2I}h+fpL z9caOv&z5Hp3f=+ka%(o(UvEx4okAy2e(WgrYB{7zbvTC@2yGVCyZlv@2@b z=9Ay1H{|2&^EC99RZZMk!DF%LI|5gCWOU6CMOBv8JxJALYABUav}-9d4&F+u4l=Z! zt$tIpHaGSo&AtLQ{yMwy<-K68`LOBhW^!G%4q$9F$y%XFlC6?ufnD{##t<;$jUKy4 zmY|~YRRVg>(K3^a{nIz&(T{I`?WEsR6=!_ySm4JPevFGmrwyKZ;Z$C|CJP8Jt~=KX zH>2s6DdEf(n*uUl@{rz-3Z5RXd1H00sjUle)ye1-ZW8H-mPzWaX2Z92 z2)V}{CiL_>nKMVNq%`CEQ5d3}lA>0PK!ac7>?t`f8d{Df`Sy8gn~~aa>{ftd?6kTc zF|j|25>LYg?~WqBj^i1)>7ay0aXYDvzLZeVoOJ<)sByEhPdb$d6PF5P+?nTA#c=PA@scfsdyQ}Y5_8NS&t1%dCZ80_lCjU~9q zjg5~^n4io*sRMUjw&e-&PXRHliX zY20}XrJnZnS;I@=y@9J_Lt)mmQkSDND_Fue2MBz)TLn7JCJNW?r(tTxn%2Mxv7ZB5 zT8-6m%Jsu2I&X4wlF-Qy)}Z;JzP3%3&VP8`3&%{68=F@ZwA>hn8)wGbGNbs`rvOw+Ii6L#f+~(-Xebl9tVa4Q=RZL4J-Fm?7Us&zIL%JG!WlDgL{mh6HshYGQfieib=4EQndS1#f<%XMS1_3R~RknrMThpB*A zCYMWHDccRA1lxy7yBA1<_@xnpti)d@-AL;Gr58s<`kYA`A6_^qr^Q>}F{(R=iy*ms z_mz-vzy~*6=s#M}x=+}dR_%&(wP_tsZHrdF6ek~>)suhy9Ri#~Hp*p+-+449V#y8* z2Vd{B>(20^n+gC1%*l?5Ejz8!n$?sqc{{6|sNQ9TW$Yu)$1I|Q6&gyDs=UJFgs-`Q z0ehv#<~$8HY8O8d4mOJ-J2c8J|4Myuef#ALRG`bj8C+l}nrYeoSfF~{9fp7{rG2HY zM<;c3{cS*>;P9>+Vg|o4pzX0HSg7$y!pS!7-9zUVZUj6|-4GUXvo>%SjTOt~zIt=- z-(4J4q<(_iha62Dz7?pde3zq!?w%O>PqiXYgOcCA&On092;Ebjh1w>3&(N6b`qqva z_kj(bC9a^$msVm=VkX>UOUv6-Ye@!LXc8$>j6$ xb`W`pZ+>}u<]*>" "%[qw]\[[^]]*\]" "%[qw]\$[^$]*\$" "%[qw]\^[^^]*\^" "%[qw]![^!]*!" - -## Strings, double-quoted -color brightwhite ""([^"]|(\\"))*"" "%[QW]?\{[^}]*\}" "%[QW]?\([^)]*\)" "%[QW]?<[^>]*>" "%[QW]?\[[^]]*\]" "%[QW]?\$[^$]*\$" "%[QW]?\^[^^]*\^" "%[QW]?![^!]*!" - -## Single and double quotes -color brightyellow "('|\")" diff --git a/vendor/github.com/docker/docker/contrib/syntax/nano/README.md b/vendor/github.com/docker/docker/contrib/syntax/nano/README.md deleted file mode 100644 index 5985208b0..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/nano/README.md +++ /dev/null @@ -1,32 +0,0 @@ -Dockerfile.nanorc -================= - -Dockerfile syntax highlighting for nano - -Single User Installation ------------------------- -1. Create a nano syntax directory in your home directory: - * `mkdir -p ~/.nano/syntax` - -2. Copy `Dockerfile.nanorc` to` ~/.nano/syntax/` - * `cp Dockerfile.nanorc ~/.nano/syntax/` - -3. Add the following to your `~/.nanorc` to tell nano where to find the `Dockerfile.nanorc` file - ``` -## Dockerfile files -include "~/.nano/syntax/Dockerfile.nanorc" - ``` - -System Wide Installation ------------------------- -1. Create a nano syntax directory: - * `mkdir /usr/local/share/nano` - -2. Copy `Dockerfile.nanorc` to `/usr/local/share/nano` - * `cp Dockerfile.nanorc /usr/local/share/nano/` - -3. Add the following to your `/etc/nanorc`: - ``` -## Dockerfile files -include "/usr/local/share/nano/Dockerfile.nanorc" - ``` diff --git a/vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/Preferences/Dockerfile.tmPreferences b/vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/Preferences/Dockerfile.tmPreferences deleted file mode 100644 index 20f0d04ca..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/Preferences/Dockerfile.tmPreferences +++ /dev/null @@ -1,24 +0,0 @@ - - - - - name - Comments - scope - source.dockerfile - settings - - shellVariables - - - name - TM_COMMENT_START - value - # - - - - uuid - 2B215AC0-A7F3-4090-9FF6-F4842BD56CA7 - - diff --git a/vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage b/vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage deleted file mode 100644 index 948a9bfc2..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage +++ /dev/null @@ -1,143 +0,0 @@ - - - - - fileTypes - - Dockerfile - - name - Dockerfile - patterns - - - captures - - 1 - - name - keyword.control.dockerfile - - 2 - - name - keyword.other.special-method.dockerfile - - - match - ^\s*(?:(ONBUILD)\s+)?(ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)\s - - - captures - - 1 - - name - keyword.operator.dockerfile - - 2 - - name - keyword.other.special-method.dockerfile - - - match - ^\s*(?:(ONBUILD)\s+)?(CMD|ENTRYPOINT)\s - - - begin - " - beginCaptures - - 1 - - name - punctuation.definition.string.begin.dockerfile - - - end - " - endCaptures - - 1 - - name - punctuation.definition.string.end.dockerfile - - - name - string.quoted.double.dockerfile - patterns - - - match - \\. - name - constant.character.escaped.dockerfile - - - - - begin - ' - beginCaptures - - 1 - - name - punctuation.definition.string.begin.dockerfile - - - end - ' - endCaptures - - 1 - - name - punctuation.definition.string.end.dockerfile - - - name - string.quoted.single.dockerfile - patterns - - - match - \\. - name - constant.character.escaped.dockerfile - - - - - captures - - 1 - - name - punctuation.whitespace.comment.leading.dockerfile - - 2 - - name - comment.line.number-sign.dockerfile - - 3 - - name - punctuation.definition.comment.dockerfile - - - comment - comment.line - match - ^(\s*)((#).*$\n?) - - - scopeName - source.dockerfile - uuid - a39d8795-59d2-49af-aa00-fe74ee29576e - - diff --git a/vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/info.plist b/vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/info.plist deleted file mode 100644 index 239f4b0a9..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/textmate/Docker.tmbundle/info.plist +++ /dev/null @@ -1,16 +0,0 @@ - - - - - contactEmailRot13 - germ@andz.com.ar - contactName - GermanDZ - description - Helpers for Docker. - name - Docker - uuid - 8B9DDBAF-E65C-4E12-FFA7-467D4AA535B1 - - diff --git a/vendor/github.com/docker/docker/contrib/syntax/textmate/README.md b/vendor/github.com/docker/docker/contrib/syntax/textmate/README.md deleted file mode 100644 index ce611018e..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/textmate/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Docker.tmbundle - -Dockerfile syntax highlighting for TextMate and Sublime Text. - -## Install - -### Sublime Text - -Available for Sublime Text under [package control](https://sublime.wbond.net/packages/Dockerfile%20Syntax%20Highlighting). -Search for *Dockerfile Syntax Highlighting* - -### TextMate 2 - -You can install this bundle in TextMate by opening the preferences and going to the bundles tab. After installation it will be automatically updated for you. - -enjoy. - diff --git a/vendor/github.com/docker/docker/contrib/syntax/textmate/REVIEWERS b/vendor/github.com/docker/docker/contrib/syntax/textmate/REVIEWERS deleted file mode 100644 index 965743df6..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/textmate/REVIEWERS +++ /dev/null @@ -1 +0,0 @@ -Asbjorn Enge (@asbjornenge) diff --git a/vendor/github.com/docker/docker/contrib/syntax/vim/LICENSE b/vendor/github.com/docker/docker/contrib/syntax/vim/LICENSE deleted file mode 100644 index e67cdabd2..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/vim/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2013 Honza Pokorny -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. 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/docker/docker/contrib/syntax/vim/README.md b/vendor/github.com/docker/docker/contrib/syntax/vim/README.md deleted file mode 100644 index 5aa9bd825..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/vim/README.md +++ /dev/null @@ -1,26 +0,0 @@ -dockerfile.vim -============== - -Syntax highlighting for Dockerfiles - -Installation ------------- -With [pathogen](https://github.com/tpope/vim-pathogen), the usual way... - -With [Vundle](https://github.com/gmarik/Vundle.vim) - - Plugin 'docker/docker' , {'rtp': '/contrib/syntax/vim/'} - -Features --------- - -The syntax highlighting includes: - -* The directives (e.g. `FROM`) -* Strings -* Comments - -License -------- - -BSD, short and sweet diff --git a/vendor/github.com/docker/docker/contrib/syntax/vim/doc/dockerfile.txt b/vendor/github.com/docker/docker/contrib/syntax/vim/doc/dockerfile.txt deleted file mode 100644 index e69e2b7b3..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/vim/doc/dockerfile.txt +++ /dev/null @@ -1,18 +0,0 @@ -*dockerfile.txt* Syntax highlighting for Dockerfiles - -Author: Honza Pokorny -License: BSD - -INSTALLATION *installation* - -Drop it on your Pathogen path and you're all set. - -FEATURES *features* - -The syntax highlighting includes: - -* The directives (e.g. FROM) -* Strings -* Comments - - vim:tw=78:et:ft=help:norl: diff --git a/vendor/github.com/docker/docker/contrib/syntax/vim/ftdetect/dockerfile.vim b/vendor/github.com/docker/docker/contrib/syntax/vim/ftdetect/dockerfile.vim deleted file mode 100644 index ee10e5d6a..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/vim/ftdetect/dockerfile.vim +++ /dev/null @@ -1 +0,0 @@ -au BufNewFile,BufRead [Dd]ockerfile,Dockerfile.* set filetype=dockerfile diff --git a/vendor/github.com/docker/docker/contrib/syntax/vim/syntax/dockerfile.vim b/vendor/github.com/docker/docker/contrib/syntax/vim/syntax/dockerfile.vim deleted file mode 100644 index a067e6ad4..000000000 --- a/vendor/github.com/docker/docker/contrib/syntax/vim/syntax/dockerfile.vim +++ /dev/null @@ -1,31 +0,0 @@ -" dockerfile.vim - Syntax highlighting for Dockerfiles -" Maintainer: Honza Pokorny -" Version: 0.5 - - -if exists("b:current_syntax") - finish -endif - -let b:current_syntax = "dockerfile" - -syntax case ignore - -syntax match dockerfileKeyword /\v^\s*(ONBUILD\s+)?(ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)\s/ -highlight link dockerfileKeyword Keyword - -syntax region dockerfileString start=/\v"/ skip=/\v\\./ end=/\v"/ -highlight link dockerfileString String - -syntax match dockerfileComment "\v^\s*#.*$" -highlight link dockerfileComment Comment - -set commentstring=#\ %s - -" match "RUN", "CMD", and "ENTRYPOINT" lines, and parse them as shell -let s:current_syntax = b:current_syntax -unlet b:current_syntax -syntax include @SH syntax/sh.vim -let b:current_syntax = s:current_syntax -syntax region shLine matchgroup=dockerfileKeyword start=/\v^\s*(RUN|CMD|ENTRYPOINT)\s/ end=/\v$/ contains=@SH -" since @SH will handle "\" as part of the same line automatically, this "just works" for line continuation too, but with the caveat that it will highlight "RUN echo '" followed by a newline as if it were a block because the "'" is shell line continuation... not sure how to fix that just yet (TODO) diff --git a/vendor/github.com/docker/docker/contrib/syscall-test/Dockerfile b/vendor/github.com/docker/docker/contrib/syscall-test/Dockerfile deleted file mode 100644 index f95f1758c..000000000 --- a/vendor/github.com/docker/docker/contrib/syscall-test/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM buildpack-deps:jessie - -COPY . /usr/src/ - -WORKDIR /usr/src/ - -RUN gcc -g -Wall -static userns.c -o /usr/bin/userns-test \ - && gcc -g -Wall -static ns.c -o /usr/bin/ns-test \ - && gcc -g -Wall -static acct.c -o /usr/bin/acct-test \ - && gcc -g -Wall -static setuid.c -o /usr/bin/setuid-test \ - && gcc -g -Wall -static setgid.c -o /usr/bin/setgid-test \ - && gcc -g -Wall -static socket.c -o /usr/bin/socket-test \ - && gcc -g -Wall -static raw.c -o /usr/bin/raw-test - -RUN [ "$(uname -m)" = "x86_64" ] && gcc -s -m32 -nostdlib exit32.s -o /usr/bin/exit32-test || true diff --git a/vendor/github.com/docker/docker/contrib/syscall-test/acct.c b/vendor/github.com/docker/docker/contrib/syscall-test/acct.c deleted file mode 100644 index 88ac28796..000000000 --- a/vendor/github.com/docker/docker/contrib/syscall-test/acct.c +++ /dev/null @@ -1,16 +0,0 @@ -#define _GNU_SOURCE -#include -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - int err = acct("/tmp/t"); - if (err == -1) { - fprintf(stderr, "acct failed: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - exit(EXIT_SUCCESS); -} diff --git a/vendor/github.com/docker/docker/contrib/syscall-test/exit32.s b/vendor/github.com/docker/docker/contrib/syscall-test/exit32.s deleted file mode 100644 index 8bbb5c58b..000000000 --- a/vendor/github.com/docker/docker/contrib/syscall-test/exit32.s +++ /dev/null @@ -1,7 +0,0 @@ -.globl _start -.text -_start: - xorl %eax, %eax - incl %eax - movb $0, %bl - int $0x80 diff --git a/vendor/github.com/docker/docker/contrib/syscall-test/ns.c b/vendor/github.com/docker/docker/contrib/syscall-test/ns.c deleted file mode 100644 index 33684e1c3..000000000 --- a/vendor/github.com/docker/docker/contrib/syscall-test/ns.c +++ /dev/null @@ -1,63 +0,0 @@ -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define STACK_SIZE (1024 * 1024) /* Stack size for cloned child */ - -struct clone_args { - char **argv; -}; - -// child_exec is the func that will be executed as the result of clone -static int child_exec(void *stuff) -{ - struct clone_args *args = (struct clone_args *)stuff; - if (execvp(args->argv[0], args->argv) != 0) { - fprintf(stderr, "failed to execvp argments %s\n", - strerror(errno)); - exit(-1); - } - // we should never reach here! - exit(EXIT_FAILURE); -} - -int main(int argc, char **argv) -{ - struct clone_args args; - args.argv = &argv[1]; - - int clone_flags = CLONE_NEWNS | CLONE_NEWPID | SIGCHLD; - - // allocate stack for child - char *stack; /* Start of stack buffer */ - char *child_stack; /* End of stack buffer */ - stack = - mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_ANON | MAP_STACK, -1, 0); - if (stack == MAP_FAILED) { - fprintf(stderr, "mmap failed: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - child_stack = stack + STACK_SIZE; /* Assume stack grows downward */ - - // the result of this call is that our child_exec will be run in another - // process returning its pid - pid_t pid = clone(child_exec, child_stack, clone_flags, &args); - if (pid < 0) { - fprintf(stderr, "clone failed: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - // lets wait on our child process here before we, the parent, exits - if (waitpid(pid, NULL, 0) == -1) { - fprintf(stderr, "failed to wait pid %d\n", pid); - exit(EXIT_FAILURE); - } - exit(EXIT_SUCCESS); -} diff --git a/vendor/github.com/docker/docker/contrib/syscall-test/raw.c b/vendor/github.com/docker/docker/contrib/syscall-test/raw.c deleted file mode 100644 index 7995a0d3a..000000000 --- a/vendor/github.com/docker/docker/contrib/syscall-test/raw.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include -#include -#include - -int main() { - if (socket(PF_INET, SOCK_RAW, IPPROTO_UDP) == -1) { - perror("socket"); - return 1; - } - - return 0; -} diff --git a/vendor/github.com/docker/docker/contrib/syscall-test/setgid.c b/vendor/github.com/docker/docker/contrib/syscall-test/setgid.c deleted file mode 100644 index df9680c86..000000000 --- a/vendor/github.com/docker/docker/contrib/syscall-test/setgid.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include - -int main() { - if (setgid(1) == -1) { - perror("setgid"); - return 1; - } - return 0; -} diff --git a/vendor/github.com/docker/docker/contrib/syscall-test/setuid.c b/vendor/github.com/docker/docker/contrib/syscall-test/setuid.c deleted file mode 100644 index 5b939677e..000000000 --- a/vendor/github.com/docker/docker/contrib/syscall-test/setuid.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include - -int main() { - if (setuid(1) == -1) { - perror("setuid"); - return 1; - } - return 0; -} diff --git a/vendor/github.com/docker/docker/contrib/syscall-test/socket.c b/vendor/github.com/docker/docker/contrib/syscall-test/socket.c deleted file mode 100644 index d26c82f00..000000000 --- a/vendor/github.com/docker/docker/contrib/syscall-test/socket.c +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include -#include -#include -#include -#include - -int main() { - int s; - struct sockaddr_in sin; - - s = socket(AF_INET, SOCK_STREAM, 0); - if (s == -1) { - perror("socket"); - return 1; - } - - sin.sin_family = AF_INET; - sin.sin_addr.s_addr = INADDR_ANY; - sin.sin_port = htons(80); - - if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == -1) { - perror("bind"); - return 1; - } - - close(s); - - return 0; -} diff --git a/vendor/github.com/docker/docker/contrib/syscall-test/userns.c b/vendor/github.com/docker/docker/contrib/syscall-test/userns.c deleted file mode 100644 index 2af36f422..000000000 --- a/vendor/github.com/docker/docker/contrib/syscall-test/userns.c +++ /dev/null @@ -1,63 +0,0 @@ -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define STACK_SIZE (1024 * 1024) /* Stack size for cloned child */ - -struct clone_args { - char **argv; -}; - -// child_exec is the func that will be executed as the result of clone -static int child_exec(void *stuff) -{ - struct clone_args *args = (struct clone_args *)stuff; - if (execvp(args->argv[0], args->argv) != 0) { - fprintf(stderr, "failed to execvp argments %s\n", - strerror(errno)); - exit(-1); - } - // we should never reach here! - exit(EXIT_FAILURE); -} - -int main(int argc, char **argv) -{ - struct clone_args args; - args.argv = &argv[1]; - - int clone_flags = CLONE_NEWUSER | SIGCHLD; - - // allocate stack for child - char *stack; /* Start of stack buffer */ - char *child_stack; /* End of stack buffer */ - stack = - mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_ANON | MAP_STACK, -1, 0); - if (stack == MAP_FAILED) { - fprintf(stderr, "mmap failed: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - child_stack = stack + STACK_SIZE; /* Assume stack grows downward */ - - // the result of this call is that our child_exec will be run in another - // process returning its pid - pid_t pid = clone(child_exec, child_stack, clone_flags, &args); - if (pid < 0) { - fprintf(stderr, "clone failed: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - // lets wait on our child process here before we, the parent, exits - if (waitpid(pid, NULL, 0) == -1) { - fprintf(stderr, "failed to wait pid %d\n", pid); - exit(EXIT_FAILURE); - } - exit(EXIT_SUCCESS); -} diff --git a/vendor/github.com/docker/docker/contrib/udev/80-docker.rules b/vendor/github.com/docker/docker/contrib/udev/80-docker.rules deleted file mode 100644 index f934c0175..000000000 --- a/vendor/github.com/docker/docker/contrib/udev/80-docker.rules +++ /dev/null @@ -1,3 +0,0 @@ -# hide docker's loopback devices from udisks, and thus from user desktops -SUBSYSTEM=="block", ENV{DM_NAME}=="docker-*", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1" -SUBSYSTEM=="block", DEVPATH=="/devices/virtual/block/loop*", ATTR{loop/backing_file}=="/var/lib/docker/*", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1" diff --git a/vendor/github.com/docker/docker/contrib/vagrant-docker/README.md b/vendor/github.com/docker/docker/contrib/vagrant-docker/README.md deleted file mode 100644 index 286a98504..000000000 --- a/vendor/github.com/docker/docker/contrib/vagrant-docker/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# Vagrant integration - -Currently there are at least 4 different projects that we are aware of that deals -with integration with [Vagrant](http://vagrantup.com/) at different levels. One -approach is to use Docker as a [provisioner](http://docs.vagrantup.com/v2/provisioning/index.html) -which means you can create containers and pull base images on VMs using Docker's -CLI and the other is to use Docker as a [provider](http://docs.vagrantup.com/v2/providers/index.html), -meaning you can use Vagrant to control Docker containers. - - -### Provisioners - -* [Vocker](https://github.com/fgrehm/vocker) -* [Ventriloquist](https://github.com/fgrehm/ventriloquist) - -### Providers - -* [docker-provider](https://github.com/fgrehm/docker-provider) -* [vagrant-shell](https://github.com/destructuring/vagrant-shell) - -## Setting up Vagrant-docker with the Engine API - -The initial Docker upstart script will not work because it runs on `127.0.0.1`, which is not accessible to the host machine. Instead, we need to change the script to connect to `0.0.0.0`. To do this, modify `/etc/init/docker.conf` to look like this: - -``` -description "Docker daemon" - -start on filesystem -stop on runlevel [!2345] - -respawn - -script - /usr/bin/docker daemon -H=tcp://0.0.0.0:2375 -end script -``` - -Once that's done, you need to set up a SSH tunnel between your host machine and the vagrant machine that's running Docker. This can be done by running the following command in a host terminal: - -``` -ssh -L 2375:localhost:2375 -p 2222 vagrant@localhost -``` - -(The first 2375 is what your host can connect to, the second 2375 is what port Docker is running on in the vagrant machine, and the 2222 is the port Vagrant is providing for SSH. If VirtualBox is the VM you're using, you can see what value "2222" should be by going to: Network > Adapter 1 > Advanced > Port Forwarding in the VirtualBox GUI.) - -Note that because the port has been changed, to run docker commands from within the command line you must run them like this: - -``` -sudo docker -H 0.0.0.0:2375 < commands for docker > -``` diff --git a/vendor/github.com/docker/docker/daemon/apparmor_default.go b/vendor/github.com/docker/docker/daemon/apparmor_default.go deleted file mode 100644 index 09dd0541b..000000000 --- a/vendor/github.com/docker/docker/daemon/apparmor_default.go +++ /dev/null @@ -1,36 +0,0 @@ -// +build linux - -package daemon - -import ( - "fmt" - - aaprofile "github.com/docker/docker/profiles/apparmor" - "github.com/opencontainers/runc/libcontainer/apparmor" -) - -// Define constants for native driver -const ( - defaultApparmorProfile = "docker-default" -) - -func ensureDefaultAppArmorProfile() error { - if apparmor.IsEnabled() { - loaded, err := aaprofile.IsLoaded(defaultApparmorProfile) - if err != nil { - return fmt.Errorf("Could not check if %s AppArmor profile was loaded: %s", defaultApparmorProfile, err) - } - - // Nothing to do. - if loaded { - return nil - } - - // Load the profile. - if err := aaprofile.InstallDefault(defaultApparmorProfile); err != nil { - return fmt.Errorf("AppArmor enabled on system but the %s profile could not be loaded.", defaultApparmorProfile) - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/apparmor_default_unsupported.go b/vendor/github.com/docker/docker/daemon/apparmor_default_unsupported.go deleted file mode 100644 index cd2dd9702..000000000 --- a/vendor/github.com/docker/docker/daemon/apparmor_default_unsupported.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !linux - -package daemon - -func ensureDefaultAppArmorProfile() error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/archive.go b/vendor/github.com/docker/docker/daemon/archive.go deleted file mode 100644 index 1999f1243..000000000 --- a/vendor/github.com/docker/docker/daemon/archive.go +++ /dev/null @@ -1,436 +0,0 @@ -package daemon - -import ( - "errors" - "io" - "os" - "path/filepath" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/builder" - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/chrootarchive" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/system" -) - -// ErrExtractPointNotDirectory is used to convey that the operation to extract -// a tar archive to a directory in a container has failed because the specified -// path does not refer to a directory. -var ErrExtractPointNotDirectory = errors.New("extraction point is not a directory") - -// ContainerCopy performs a deprecated operation of archiving the resource at -// the specified path in the container identified by the given name. -func (daemon *Daemon) ContainerCopy(name string, res string) (io.ReadCloser, error) { - container, err := daemon.GetContainer(name) - if err != nil { - return nil, err - } - - if res[0] == '/' || res[0] == '\\' { - res = res[1:] - } - - return daemon.containerCopy(container, res) -} - -// ContainerStatPath stats the filesystem resource at the specified path in the -// container identified by the given name. -func (daemon *Daemon) ContainerStatPath(name string, path string) (stat *types.ContainerPathStat, err error) { - container, err := daemon.GetContainer(name) - if err != nil { - return nil, err - } - - return daemon.containerStatPath(container, path) -} - -// ContainerArchivePath creates an archive of the filesystem resource at the -// specified path in the container identified by the given name. Returns a -// tar archive of the resource and whether it was a directory or a single file. -func (daemon *Daemon) ContainerArchivePath(name string, path string) (content io.ReadCloser, stat *types.ContainerPathStat, err error) { - container, err := daemon.GetContainer(name) - if err != nil { - return nil, nil, err - } - - return daemon.containerArchivePath(container, path) -} - -// ContainerExtractToDir extracts the given archive to the specified location -// in the filesystem of the container identified by the given name. The given -// path must be of a directory in the container. If it is not, the error will -// be ErrExtractPointNotDirectory. If noOverwriteDirNonDir is true then it will -// be an error if unpacking the given content would cause an existing directory -// to be replaced with a non-directory and vice versa. -func (daemon *Daemon) ContainerExtractToDir(name, path string, noOverwriteDirNonDir bool, content io.Reader) error { - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - return daemon.containerExtractToDir(container, path, noOverwriteDirNonDir, content) -} - -// containerStatPath stats the filesystem resource at the specified path in this -// container. Returns stat info about the resource. -func (daemon *Daemon) containerStatPath(container *container.Container, path string) (stat *types.ContainerPathStat, err error) { - container.Lock() - defer container.Unlock() - - if err = daemon.Mount(container); err != nil { - return nil, err - } - defer daemon.Unmount(container) - - err = daemon.mountVolumes(container) - defer container.DetachAndUnmount(daemon.LogVolumeEvent) - if err != nil { - return nil, err - } - - resolvedPath, absPath, err := container.ResolvePath(path) - if err != nil { - return nil, err - } - - return container.StatPath(resolvedPath, absPath) -} - -// containerArchivePath creates an archive of the filesystem resource at the specified -// path in this container. Returns a tar archive of the resource and stat info -// about the resource. -func (daemon *Daemon) containerArchivePath(container *container.Container, path string) (content io.ReadCloser, stat *types.ContainerPathStat, err error) { - container.Lock() - - defer func() { - if err != nil { - // Wait to unlock the container until the archive is fully read - // (see the ReadCloseWrapper func below) or if there is an error - // before that occurs. - container.Unlock() - } - }() - - if err = daemon.Mount(container); err != nil { - return nil, nil, err - } - - defer func() { - if err != nil { - // unmount any volumes - container.DetachAndUnmount(daemon.LogVolumeEvent) - // unmount the container's rootfs - daemon.Unmount(container) - } - }() - - if err = daemon.mountVolumes(container); err != nil { - return nil, nil, err - } - - resolvedPath, absPath, err := container.ResolvePath(path) - if err != nil { - return nil, nil, err - } - - stat, err = container.StatPath(resolvedPath, absPath) - if err != nil { - return nil, nil, err - } - - // We need to rebase the archive entries if the last element of the - // resolved path was a symlink that was evaluated and is now different - // than the requested path. For example, if the given path was "/foo/bar/", - // but it resolved to "/var/lib/docker/containers/{id}/foo/baz/", we want - // to ensure that the archive entries start with "bar" and not "baz". This - // also catches the case when the root directory of the container is - // requested: we want the archive entries to start with "/" and not the - // container ID. - data, err := archive.TarResourceRebase(resolvedPath, filepath.Base(absPath)) - if err != nil { - return nil, nil, err - } - - content = ioutils.NewReadCloserWrapper(data, func() error { - err := data.Close() - container.DetachAndUnmount(daemon.LogVolumeEvent) - daemon.Unmount(container) - container.Unlock() - return err - }) - - daemon.LogContainerEvent(container, "archive-path") - - return content, stat, nil -} - -// containerExtractToDir extracts the given tar archive to the specified location in the -// filesystem of this container. The given path must be of a directory in the -// container. If it is not, the error will be ErrExtractPointNotDirectory. If -// noOverwriteDirNonDir is true then it will be an error if unpacking the -// given content would cause an existing directory to be replaced with a non- -// directory and vice versa. -func (daemon *Daemon) containerExtractToDir(container *container.Container, path string, noOverwriteDirNonDir bool, content io.Reader) (err error) { - container.Lock() - defer container.Unlock() - - if err = daemon.Mount(container); err != nil { - return err - } - defer daemon.Unmount(container) - - err = daemon.mountVolumes(container) - defer container.DetachAndUnmount(daemon.LogVolumeEvent) - if err != nil { - return err - } - - // Check if a drive letter supplied, it must be the system drive. No-op except on Windows - path, err = system.CheckSystemDriveAndRemoveDriveLetter(path) - if err != nil { - return err - } - - // The destination path needs to be resolved to a host path, with all - // symbolic links followed in the scope of the container's rootfs. Note - // that we do not use `container.ResolvePath(path)` here because we need - // to also evaluate the last path element if it is a symlink. This is so - // that you can extract an archive to a symlink that points to a directory. - - // Consider the given path as an absolute path in the container. - absPath := archive.PreserveTrailingDotOrSeparator(filepath.Join(string(filepath.Separator), path), path) - - // This will evaluate the last path element if it is a symlink. - resolvedPath, err := container.GetResourcePath(absPath) - if err != nil { - return err - } - - stat, err := os.Lstat(resolvedPath) - if err != nil { - return err - } - - if !stat.IsDir() { - return ErrExtractPointNotDirectory - } - - // Need to check if the path is in a volume. If it is, it cannot be in a - // read-only volume. If it is not in a volume, the container cannot be - // configured with a read-only rootfs. - - // Use the resolved path relative to the container rootfs as the new - // absPath. This way we fully follow any symlinks in a volume that may - // lead back outside the volume. - // - // The Windows implementation of filepath.Rel in golang 1.4 does not - // support volume style file path semantics. On Windows when using the - // filter driver, we are guaranteed that the path will always be - // a volume file path. - var baseRel string - if strings.HasPrefix(resolvedPath, `\\?\Volume{`) { - if strings.HasPrefix(resolvedPath, container.BaseFS) { - baseRel = resolvedPath[len(container.BaseFS):] - if baseRel[:1] == `\` { - baseRel = baseRel[1:] - } - } - } else { - baseRel, err = filepath.Rel(container.BaseFS, resolvedPath) - } - if err != nil { - return err - } - // Make it an absolute path. - absPath = filepath.Join(string(filepath.Separator), baseRel) - - toVolume, err := checkIfPathIsInAVolume(container, absPath) - if err != nil { - return err - } - - if !toVolume && container.HostConfig.ReadonlyRootfs { - return ErrRootFSReadOnly - } - - uid, gid := daemon.GetRemappedUIDGID() - options := &archive.TarOptions{ - NoOverwriteDirNonDir: noOverwriteDirNonDir, - ChownOpts: &archive.TarChownOptions{ - UID: uid, GID: gid, // TODO: should all ownership be set to root (either real or remapped)? - }, - } - if err := chrootarchive.Untar(content, resolvedPath, options); err != nil { - return err - } - - daemon.LogContainerEvent(container, "extract-to-dir") - - return nil -} - -func (daemon *Daemon) containerCopy(container *container.Container, resource string) (rc io.ReadCloser, err error) { - container.Lock() - - defer func() { - if err != nil { - // Wait to unlock the container until the archive is fully read - // (see the ReadCloseWrapper func below) or if there is an error - // before that occurs. - container.Unlock() - } - }() - - if err := daemon.Mount(container); err != nil { - return nil, err - } - - defer func() { - if err != nil { - // unmount any volumes - container.DetachAndUnmount(daemon.LogVolumeEvent) - // unmount the container's rootfs - daemon.Unmount(container) - } - }() - - if err := daemon.mountVolumes(container); err != nil { - return nil, err - } - - basePath, err := container.GetResourcePath(resource) - if err != nil { - return nil, err - } - stat, err := os.Stat(basePath) - if err != nil { - return nil, err - } - var filter []string - if !stat.IsDir() { - d, f := filepath.Split(basePath) - basePath = d - filter = []string{f} - } else { - filter = []string{filepath.Base(basePath)} - basePath = filepath.Dir(basePath) - } - archive, err := archive.TarWithOptions(basePath, &archive.TarOptions{ - Compression: archive.Uncompressed, - IncludeFiles: filter, - }) - if err != nil { - return nil, err - } - - reader := ioutils.NewReadCloserWrapper(archive, func() error { - err := archive.Close() - container.DetachAndUnmount(daemon.LogVolumeEvent) - daemon.Unmount(container) - container.Unlock() - return err - }) - daemon.LogContainerEvent(container, "copy") - return reader, nil -} - -// CopyOnBuild copies/extracts a source FileInfo to a destination path inside a container -// specified by a container object. -// TODO: make sure callers don't unnecessarily convert destPath with filepath.FromSlash (Copy does it already). -// CopyOnBuild should take in abstract paths (with slashes) and the implementation should convert it to OS-specific paths. -func (daemon *Daemon) CopyOnBuild(cID string, destPath string, src builder.FileInfo, decompress bool) error { - srcPath := src.Path() - destExists := true - destDir := false - rootUID, rootGID := daemon.GetRemappedUIDGID() - - // Work in daemon-local OS specific file paths - destPath = filepath.FromSlash(destPath) - - c, err := daemon.GetContainer(cID) - if err != nil { - return err - } - err = daemon.Mount(c) - if err != nil { - return err - } - defer daemon.Unmount(c) - - dest, err := c.GetResourcePath(destPath) - if err != nil { - return err - } - - // Preserve the trailing slash - // TODO: why are we appending another path separator if there was already one? - if strings.HasSuffix(destPath, string(os.PathSeparator)) || destPath == "." { - destDir = true - dest += string(os.PathSeparator) - } - - destPath = dest - - destStat, err := os.Stat(destPath) - if err != nil { - if !os.IsNotExist(err) { - //logrus.Errorf("Error performing os.Stat on %s. %s", destPath, err) - return err - } - destExists = false - } - - uidMaps, gidMaps := daemon.GetUIDGIDMaps() - archiver := &archive.Archiver{ - Untar: chrootarchive.Untar, - UIDMaps: uidMaps, - GIDMaps: gidMaps, - } - - if src.IsDir() { - // copy as directory - if err := archiver.CopyWithTar(srcPath, destPath); err != nil { - return err - } - return fixPermissions(srcPath, destPath, rootUID, rootGID, destExists) - } - if decompress && archive.IsArchivePath(srcPath) { - // Only try to untar if it is a file and that we've been told to decompress (when ADD-ing a remote file) - - // First try to unpack the source as an archive - // to support the untar feature we need to clean up the path a little bit - // because tar is very forgiving. First we need to strip off the archive's - // filename from the path but this is only added if it does not end in slash - tarDest := destPath - if strings.HasSuffix(tarDest, string(os.PathSeparator)) { - tarDest = filepath.Dir(destPath) - } - - // try to successfully untar the orig - err := archiver.UntarPath(srcPath, tarDest) - /* - if err != nil { - logrus.Errorf("Couldn't untar to %s: %v", tarDest, err) - } - */ - return err - } - - // only needed for fixPermissions, but might as well put it before CopyFileWithTar - if destDir || (destExists && destStat.IsDir()) { - destPath = filepath.Join(destPath, src.Name()) - } - - if err := idtools.MkdirAllNewAs(filepath.Dir(destPath), 0755, rootUID, rootGID); err != nil { - return err - } - if err := archiver.CopyFileWithTar(srcPath, destPath); err != nil { - return err - } - - return fixPermissions(srcPath, destPath, rootUID, rootGID, destExists) -} diff --git a/vendor/github.com/docker/docker/daemon/archive_unix.go b/vendor/github.com/docker/docker/daemon/archive_unix.go deleted file mode 100644 index 47666fe5e..000000000 --- a/vendor/github.com/docker/docker/daemon/archive_unix.go +++ /dev/null @@ -1,58 +0,0 @@ -// +build !windows - -package daemon - -import ( - "os" - "path/filepath" - - "github.com/docker/docker/container" -) - -// checkIfPathIsInAVolume checks if the path is in a volume. If it is, it -// cannot be in a read-only volume. If it is not in a volume, the container -// cannot be configured with a read-only rootfs. -func checkIfPathIsInAVolume(container *container.Container, absPath string) (bool, error) { - var toVolume bool - for _, mnt := range container.MountPoints { - if toVolume = mnt.HasResource(absPath); toVolume { - if mnt.RW { - break - } - return false, ErrVolumeReadonly - } - } - return toVolume, nil -} - -func fixPermissions(source, destination string, uid, gid int, destExisted bool) error { - // If the destination didn't already exist, or the destination isn't a - // directory, then we should Lchown the destination. Otherwise, we shouldn't - // Lchown the destination. - destStat, err := os.Stat(destination) - if err != nil { - // This should *never* be reached, because the destination must've already - // been created while untar-ing the context. - return err - } - doChownDestination := !destExisted || !destStat.IsDir() - - // We Walk on the source rather than on the destination because we don't - // want to change permissions on things we haven't created or modified. - return filepath.Walk(source, func(fullpath string, info os.FileInfo, err error) error { - // Do not alter the walk root iff. it existed before, as it doesn't fall under - // the domain of "things we should chown". - if !doChownDestination && (source == fullpath) { - return nil - } - - // Path is prefixed by source: substitute with destination instead. - cleaned, err := filepath.Rel(source, fullpath) - if err != nil { - return err - } - - fullpath = filepath.Join(destination, cleaned) - return os.Lchown(fullpath, uid, gid) - }) -} diff --git a/vendor/github.com/docker/docker/daemon/archive_windows.go b/vendor/github.com/docker/docker/daemon/archive_windows.go deleted file mode 100644 index b3a104534..000000000 --- a/vendor/github.com/docker/docker/daemon/archive_windows.go +++ /dev/null @@ -1,18 +0,0 @@ -package daemon - -import "github.com/docker/docker/container" - -// checkIfPathIsInAVolume checks if the path is in a volume. If it is, it -// cannot be in a read-only volume. If it is not in a volume, the container -// cannot be configured with a read-only rootfs. -// -// This is a no-op on Windows which does not support read-only volumes, or -// extracting to a mount point inside a volume. TODO Windows: FIXME Post-TP5 -func checkIfPathIsInAVolume(container *container.Container, absPath string) (bool, error) { - return false, nil -} - -func fixPermissions(source, destination string, uid, gid int, destExisted bool) error { - // chown is not supported on Windows - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/attach.go b/vendor/github.com/docker/docker/daemon/attach.go deleted file mode 100644 index 917237dd8..000000000 --- a/vendor/github.com/docker/docker/daemon/attach.go +++ /dev/null @@ -1,147 +0,0 @@ -package daemon - -import ( - "fmt" - "io" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/pkg/stdcopy" - "github.com/docker/docker/pkg/term" -) - -// ContainerAttach attaches to logs according to the config passed in. See ContainerAttachConfig. -func (daemon *Daemon) ContainerAttach(prefixOrName string, c *backend.ContainerAttachConfig) error { - keys := []byte{} - var err error - if c.DetachKeys != "" { - keys, err = term.ToBytes(c.DetachKeys) - if err != nil { - return fmt.Errorf("Invalid escape keys (%s) provided", c.DetachKeys) - } - } - - container, err := daemon.GetContainer(prefixOrName) - if err != nil { - return err - } - if container.IsPaused() { - err := fmt.Errorf("Container %s is paused. Unpause the container before attach", prefixOrName) - return errors.NewRequestConflictError(err) - } - - inStream, outStream, errStream, err := c.GetStreams() - if err != nil { - return err - } - defer inStream.Close() - - if !container.Config.Tty && c.MuxStreams { - errStream = stdcopy.NewStdWriter(errStream, stdcopy.Stderr) - outStream = stdcopy.NewStdWriter(outStream, stdcopy.Stdout) - } - - var stdin io.ReadCloser - var stdout, stderr io.Writer - - if c.UseStdin { - stdin = inStream - } - if c.UseStdout { - stdout = outStream - } - if c.UseStderr { - stderr = errStream - } - - if err := daemon.containerAttach(container, stdin, stdout, stderr, c.Logs, c.Stream, keys); err != nil { - fmt.Fprintf(outStream, "Error attaching: %s\n", err) - } - return nil -} - -// ContainerAttachRaw attaches the provided streams to the container's stdio -func (daemon *Daemon) ContainerAttachRaw(prefixOrName string, stdin io.ReadCloser, stdout, stderr io.Writer, stream bool) error { - container, err := daemon.GetContainer(prefixOrName) - if err != nil { - return err - } - return daemon.containerAttach(container, stdin, stdout, stderr, false, stream, nil) -} - -func (daemon *Daemon) containerAttach(c *container.Container, stdin io.ReadCloser, stdout, stderr io.Writer, logs, stream bool, keys []byte) error { - if logs { - logDriver, err := daemon.getLogger(c) - if err != nil { - return err - } - cLog, ok := logDriver.(logger.LogReader) - if !ok { - return logger.ErrReadLogsNotSupported - } - logs := cLog.ReadLogs(logger.ReadConfig{Tail: -1}) - - LogLoop: - for { - select { - case msg, ok := <-logs.Msg: - if !ok { - break LogLoop - } - if msg.Source == "stdout" && stdout != nil { - stdout.Write(msg.Line) - } - if msg.Source == "stderr" && stderr != nil { - stderr.Write(msg.Line) - } - case err := <-logs.Err: - logrus.Errorf("Error streaming logs: %v", err) - break LogLoop - } - } - } - - daemon.LogContainerEvent(c, "attach") - - //stream - if stream { - var stdinPipe io.ReadCloser - if stdin != nil { - r, w := io.Pipe() - go func() { - defer w.Close() - defer logrus.Debug("Closing buffered stdin pipe") - io.Copy(w, stdin) - }() - stdinPipe = r - } - - waitChan := make(chan struct{}) - if c.Config.StdinOnce && !c.Config.Tty { - go func() { - c.WaitStop(-1 * time.Second) - close(waitChan) - }() - } - - err := <-c.Attach(stdinPipe, stdout, stderr, keys) - if err != nil { - if _, ok := err.(container.DetachError); ok { - daemon.LogContainerEvent(c, "detach") - } else { - logrus.Errorf("attach failed with error: %v", err) - } - } - - // If we are in stdinonce mode, wait for the process to end - // otherwise, simply return - if c.Config.StdinOnce && !c.Config.Tty { - <-waitChan - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/auth.go b/vendor/github.com/docker/docker/daemon/auth.go deleted file mode 100644 index f5f4d7bf2..000000000 --- a/vendor/github.com/docker/docker/daemon/auth.go +++ /dev/null @@ -1,13 +0,0 @@ -package daemon - -import ( - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/dockerversion" -) - -// AuthenticateToRegistry checks the validity of credentials in authConfig -func (daemon *Daemon) AuthenticateToRegistry(ctx context.Context, authConfig *types.AuthConfig) (string, string, error) { - return daemon.RegistryService.Auth(ctx, authConfig, dockerversion.DockerUserAgent(ctx)) -} diff --git a/vendor/github.com/docker/docker/daemon/bindmount_solaris.go b/vendor/github.com/docker/docker/daemon/bindmount_solaris.go deleted file mode 100644 index 87bf3ef72..000000000 --- a/vendor/github.com/docker/docker/daemon/bindmount_solaris.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build solaris - -package daemon - -const bindMountType = "lofs" diff --git a/vendor/github.com/docker/docker/daemon/bindmount_unix.go b/vendor/github.com/docker/docker/daemon/bindmount_unix.go deleted file mode 100644 index 3966babb4..000000000 --- a/vendor/github.com/docker/docker/daemon/bindmount_unix.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build linux freebsd - -package daemon - -const bindMountType = "bind" diff --git a/vendor/github.com/docker/docker/daemon/cache.go b/vendor/github.com/docker/docker/daemon/cache.go deleted file mode 100644 index a2c2c137f..000000000 --- a/vendor/github.com/docker/docker/daemon/cache.go +++ /dev/null @@ -1,254 +0,0 @@ -package daemon - -import ( - "encoding/json" - "fmt" - "reflect" - "strings" - - "github.com/Sirupsen/logrus" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/builder" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/runconfig" - "github.com/pkg/errors" -) - -// getLocalCachedImage returns the most recent created image that is a child -// of the image with imgID, that had the same config when it was -// created. nil is returned if a child cannot be found. An error is -// returned if the parent image cannot be found. -func (daemon *Daemon) getLocalCachedImage(imgID image.ID, config *containertypes.Config) (*image.Image, error) { - // Loop on the children of the given image and check the config - getMatch := func(siblings []image.ID) (*image.Image, error) { - var match *image.Image - for _, id := range siblings { - img, err := daemon.imageStore.Get(id) - if err != nil { - return nil, fmt.Errorf("unable to find image %q", id) - } - - if runconfig.Compare(&img.ContainerConfig, config) { - // check for the most up to date match - if match == nil || match.Created.Before(img.Created) { - match = img - } - } - } - return match, nil - } - - // In this case, this is `FROM scratch`, which isn't an actual image. - if imgID == "" { - images := daemon.imageStore.Map() - var siblings []image.ID - for id, img := range images { - if img.Parent == imgID { - siblings = append(siblings, id) - } - } - return getMatch(siblings) - } - - // find match from child images - siblings := daemon.imageStore.Children(imgID) - return getMatch(siblings) -} - -// MakeImageCache creates a stateful image cache. -func (daemon *Daemon) MakeImageCache(sourceRefs []string) builder.ImageCache { - if len(sourceRefs) == 0 { - return &localImageCache{daemon} - } - - cache := &imageCache{daemon: daemon, localImageCache: &localImageCache{daemon}} - - for _, ref := range sourceRefs { - img, err := daemon.GetImage(ref) - if err != nil { - logrus.Warnf("Could not look up %s for cache resolution, skipping: %+v", ref, err) - continue - } - cache.sources = append(cache.sources, img) - } - - return cache -} - -// localImageCache is cache based on parent chain. -type localImageCache struct { - daemon *Daemon -} - -func (lic *localImageCache) GetCache(imgID string, config *containertypes.Config) (string, error) { - return getImageIDAndError(lic.daemon.getLocalCachedImage(image.ID(imgID), config)) -} - -// imageCache is cache based on history objects. Requires initial set of images. -type imageCache struct { - sources []*image.Image - daemon *Daemon - localImageCache *localImageCache -} - -func (ic *imageCache) restoreCachedImage(parent, target *image.Image, cfg *containertypes.Config) (image.ID, error) { - var history []image.History - rootFS := image.NewRootFS() - lenHistory := 0 - if parent != nil { - history = parent.History - rootFS = parent.RootFS - lenHistory = len(parent.History) - } - history = append(history, target.History[lenHistory]) - if layer := getLayerForHistoryIndex(target, lenHistory); layer != "" { - rootFS.Append(layer) - } - - config, err := json.Marshal(&image.Image{ - V1Image: image.V1Image{ - DockerVersion: dockerversion.Version, - Config: cfg, - Architecture: target.Architecture, - OS: target.OS, - Author: target.Author, - Created: history[len(history)-1].Created, - }, - RootFS: rootFS, - History: history, - OSFeatures: target.OSFeatures, - OSVersion: target.OSVersion, - }) - if err != nil { - return "", errors.Wrap(err, "failed to marshal image config") - } - - imgID, err := ic.daemon.imageStore.Create(config) - if err != nil { - return "", errors.Wrap(err, "failed to create cache image") - } - - if parent != nil { - if err := ic.daemon.imageStore.SetParent(imgID, parent.ID()); err != nil { - return "", errors.Wrapf(err, "failed to set parent for %v to %v", target.ID(), parent.ID()) - } - } - return imgID, nil -} - -func (ic *imageCache) isParent(imgID, parentID image.ID) bool { - nextParent, err := ic.daemon.imageStore.GetParent(imgID) - if err != nil { - return false - } - if nextParent == parentID { - return true - } - return ic.isParent(nextParent, parentID) -} - -func (ic *imageCache) GetCache(parentID string, cfg *containertypes.Config) (string, error) { - imgID, err := ic.localImageCache.GetCache(parentID, cfg) - if err != nil { - return "", err - } - if imgID != "" { - for _, s := range ic.sources { - if ic.isParent(s.ID(), image.ID(imgID)) { - return imgID, nil - } - } - } - - var parent *image.Image - lenHistory := 0 - if parentID != "" { - parent, err = ic.daemon.imageStore.Get(image.ID(parentID)) - if err != nil { - return "", errors.Wrapf(err, "unable to find image %v", parentID) - } - lenHistory = len(parent.History) - } - - for _, target := range ic.sources { - if !isValidParent(target, parent) || !isValidConfig(cfg, target.History[lenHistory]) { - continue - } - - if len(target.History)-1 == lenHistory { // last - if parent != nil { - if err := ic.daemon.imageStore.SetParent(target.ID(), parent.ID()); err != nil { - return "", errors.Wrapf(err, "failed to set parent for %v to %v", target.ID(), parent.ID()) - } - } - return target.ID().String(), nil - } - - imgID, err := ic.restoreCachedImage(parent, target, cfg) - if err != nil { - return "", errors.Wrapf(err, "failed to restore cached image from %q to %v", parentID, target.ID()) - } - - ic.sources = []*image.Image{target} // avoid jumping to different target, tuned for safety atm - return imgID.String(), nil - } - - return "", nil -} - -func getImageIDAndError(img *image.Image, err error) (string, error) { - if img == nil || err != nil { - return "", err - } - return img.ID().String(), nil -} - -func isValidParent(img, parent *image.Image) bool { - if len(img.History) == 0 { - return false - } - if parent == nil || len(parent.History) == 0 && len(parent.RootFS.DiffIDs) == 0 { - return true - } - if len(parent.History) >= len(img.History) { - return false - } - if len(parent.RootFS.DiffIDs) >= len(img.RootFS.DiffIDs) { - return false - } - - for i, h := range parent.History { - if !reflect.DeepEqual(h, img.History[i]) { - return false - } - } - for i, d := range parent.RootFS.DiffIDs { - if d != img.RootFS.DiffIDs[i] { - return false - } - } - return true -} - -func getLayerForHistoryIndex(image *image.Image, index int) layer.DiffID { - layerIndex := 0 - for i, h := range image.History { - if i == index { - if h.EmptyLayer { - return "" - } - break - } - if !h.EmptyLayer { - layerIndex++ - } - } - return image.RootFS.DiffIDs[layerIndex] // validate? -} - -func isValidConfig(cfg *containertypes.Config, h image.History) bool { - // todo: make this format better than join that loses data - return strings.Join(cfg.Cmd, " ") == h.CreatedBy -} diff --git a/vendor/github.com/docker/docker/daemon/caps/utils_unix.go b/vendor/github.com/docker/docker/daemon/caps/utils_unix.go deleted file mode 100644 index c99485f51..000000000 --- a/vendor/github.com/docker/docker/daemon/caps/utils_unix.go +++ /dev/null @@ -1,131 +0,0 @@ -// +build !windows - -package caps - -import ( - "fmt" - "strings" - - "github.com/docker/docker/pkg/stringutils" - "github.com/syndtr/gocapability/capability" -) - -var capabilityList Capabilities - -func init() { - last := capability.CAP_LAST_CAP - // hack for RHEL6 which has no /proc/sys/kernel/cap_last_cap - if last == capability.Cap(63) { - last = capability.CAP_BLOCK_SUSPEND - } - for _, cap := range capability.List() { - if cap > last { - continue - } - capabilityList = append(capabilityList, - &CapabilityMapping{ - Key: "CAP_" + strings.ToUpper(cap.String()), - Value: cap, - }, - ) - } -} - -type ( - // CapabilityMapping maps linux capability name to its value of capability.Cap type - // Capabilities is one of the security systems in Linux Security Module (LSM) - // framework provided by the kernel. - // For more details on capabilities, see http://man7.org/linux/man-pages/man7/capabilities.7.html - CapabilityMapping struct { - Key string `json:"key,omitempty"` - Value capability.Cap `json:"value,omitempty"` - } - // Capabilities contains all CapabilityMapping - Capabilities []*CapabilityMapping -) - -// String returns of CapabilityMapping -func (c *CapabilityMapping) String() string { - return c.Key -} - -// GetCapability returns CapabilityMapping which contains specific key -func GetCapability(key string) *CapabilityMapping { - for _, capp := range capabilityList { - if capp.Key == key { - cpy := *capp - return &cpy - } - } - return nil -} - -// GetAllCapabilities returns all of the capabilities -func GetAllCapabilities() []string { - output := make([]string, len(capabilityList)) - for i, capability := range capabilityList { - output[i] = capability.String() - } - return output -} - -// TweakCapabilities can tweak capabilities by adding or dropping capabilities -// based on the basics capabilities. -func TweakCapabilities(basics, adds, drops []string) ([]string, error) { - var ( - newCaps []string - allCaps = GetAllCapabilities() - ) - - // FIXME(tonistiigi): docker format is without CAP_ prefix, oci is with prefix - // Currently they are mixed in here. We should do conversion in one place. - - // look for invalid cap in the drop list - for _, cap := range drops { - if strings.ToLower(cap) == "all" { - continue - } - - if !stringutils.InSlice(allCaps, "CAP_"+cap) { - return nil, fmt.Errorf("Unknown capability drop: %q", cap) - } - } - - // handle --cap-add=all - if stringutils.InSlice(adds, "all") { - basics = allCaps - } - - if !stringutils.InSlice(drops, "all") { - for _, cap := range basics { - // skip `all` already handled above - if strings.ToLower(cap) == "all" { - continue - } - - // if we don't drop `all`, add back all the non-dropped caps - if !stringutils.InSlice(drops, cap[4:]) { - newCaps = append(newCaps, strings.ToUpper(cap)) - } - } - } - - for _, cap := range adds { - // skip `all` already handled above - if strings.ToLower(cap) == "all" { - continue - } - - cap = "CAP_" + cap - - if !stringutils.InSlice(allCaps, cap) { - return nil, fmt.Errorf("Unknown capability to add: %q", cap) - } - - // add cap if not already in the list - if !stringutils.InSlice(newCaps, cap) { - newCaps = append(newCaps, strings.ToUpper(cap)) - } - } - return newCaps, nil -} diff --git a/vendor/github.com/docker/docker/daemon/changes.go b/vendor/github.com/docker/docker/daemon/changes.go deleted file mode 100644 index fc8cd2752..000000000 --- a/vendor/github.com/docker/docker/daemon/changes.go +++ /dev/null @@ -1,31 +0,0 @@ -package daemon - -import ( - "errors" - "runtime" - "time" - - "github.com/docker/docker/pkg/archive" -) - -// ContainerChanges returns a list of container fs changes -func (daemon *Daemon) ContainerChanges(name string) ([]archive.Change, error) { - start := time.Now() - container, err := daemon.GetContainer(name) - if err != nil { - return nil, err - } - - if runtime.GOOS == "windows" && container.IsRunning() { - return nil, errors.New("Windows does not support diff of a running container") - } - - container.Lock() - defer container.Unlock() - c, err := container.RWLayer.Changes() - if err != nil { - return nil, err - } - containerActions.WithValues("changes").UpdateSince(start) - return c, nil -} diff --git a/vendor/github.com/docker/docker/daemon/checkpoint.go b/vendor/github.com/docker/docker/daemon/checkpoint.go deleted file mode 100644 index 27181743f..000000000 --- a/vendor/github.com/docker/docker/daemon/checkpoint.go +++ /dev/null @@ -1,110 +0,0 @@ -package daemon - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/utils" -) - -var ( - validCheckpointNameChars = utils.RestrictedNameChars - validCheckpointNamePattern = utils.RestrictedNamePattern -) - -// CheckpointCreate checkpoints the process running in a container with CRIU -func (daemon *Daemon) CheckpointCreate(name string, config types.CheckpointCreateOptions) error { - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - if !container.IsRunning() { - return fmt.Errorf("Container %s not running", name) - } - - var checkpointDir string - if config.CheckpointDir != "" { - checkpointDir = config.CheckpointDir - } else { - checkpointDir = container.CheckpointDir() - } - - if !validCheckpointNamePattern.MatchString(config.CheckpointID) { - return fmt.Errorf("Invalid checkpoint ID (%s), only %s are allowed", config.CheckpointID, validCheckpointNameChars) - } - - err = daemon.containerd.CreateCheckpoint(container.ID, config.CheckpointID, checkpointDir, config.Exit) - if err != nil { - return fmt.Errorf("Cannot checkpoint container %s: %s", name, err) - } - - daemon.LogContainerEvent(container, "checkpoint") - - return nil -} - -// CheckpointDelete deletes the specified checkpoint -func (daemon *Daemon) CheckpointDelete(name string, config types.CheckpointDeleteOptions) error { - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - var checkpointDir string - if config.CheckpointDir != "" { - checkpointDir = config.CheckpointDir - } else { - checkpointDir = container.CheckpointDir() - } - - return os.RemoveAll(filepath.Join(checkpointDir, config.CheckpointID)) -} - -// CheckpointList lists all checkpoints of the specified container -func (daemon *Daemon) CheckpointList(name string, config types.CheckpointListOptions) ([]types.Checkpoint, error) { - var out []types.Checkpoint - - container, err := daemon.GetContainer(name) - if err != nil { - return nil, err - } - - var checkpointDir string - if config.CheckpointDir != "" { - checkpointDir = config.CheckpointDir - } else { - checkpointDir = container.CheckpointDir() - } - - if err := os.MkdirAll(checkpointDir, 0755); err != nil { - return nil, err - } - - dirs, err := ioutil.ReadDir(checkpointDir) - if err != nil { - return nil, err - } - - for _, d := range dirs { - if !d.IsDir() { - continue - } - path := filepath.Join(checkpointDir, d.Name(), "config.json") - data, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - var cpt types.Checkpoint - if err := json.Unmarshal(data, &cpt); err != nil { - return nil, err - } - out = append(out, cpt) - } - - return out, nil -} diff --git a/vendor/github.com/docker/docker/daemon/cluster.go b/vendor/github.com/docker/docker/daemon/cluster.go deleted file mode 100644 index 98b2aa1e0..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster.go +++ /dev/null @@ -1,12 +0,0 @@ -package daemon - -import ( - apitypes "github.com/docker/docker/api/types" -) - -// Cluster is the interface for github.com/docker/docker/daemon/cluster.(*Cluster). -type Cluster interface { - GetNetwork(input string) (apitypes.NetworkResource, error) - GetNetworks() ([]apitypes.NetworkResource, error) - RemoveNetwork(input string) error -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/cluster.go b/vendor/github.com/docker/docker/daemon/cluster/cluster.go deleted file mode 100644 index 4af035b52..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/cluster.go +++ /dev/null @@ -1,1973 +0,0 @@ -package cluster - -import ( - "crypto/x509" - "encoding/base64" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net" - "os" - "path/filepath" - "runtime" - "strings" - "sync" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - distreference "github.com/docker/distribution/reference" - apierrors "github.com/docker/docker/api/errors" - apitypes "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/network" - types "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/daemon/cluster/convert" - executorpkg "github.com/docker/docker/daemon/cluster/executor" - "github.com/docker/docker/daemon/cluster/executor/container" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/signal" - "github.com/docker/docker/pkg/stdcopy" - "github.com/docker/docker/reference" - "github.com/docker/docker/runconfig" - swarmapi "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/manager/encryption" - swarmnode "github.com/docker/swarmkit/node" - "github.com/docker/swarmkit/protobuf/ptypes" - "github.com/pkg/errors" - "golang.org/x/net/context" - "google.golang.org/grpc" -) - -const swarmDirName = "swarm" -const controlSocket = "control.sock" -const swarmConnectTimeout = 20 * time.Second -const swarmRequestTimeout = 20 * time.Second -const stateFile = "docker-state.json" -const defaultAddr = "0.0.0.0:2377" - -const ( - initialReconnectDelay = 100 * time.Millisecond - maxReconnectDelay = 30 * time.Second - contextPrefix = "com.docker.swarm" -) - -// ErrNoSwarm is returned on leaving a cluster that was never initialized -var ErrNoSwarm = fmt.Errorf("This node is not part of a swarm") - -// ErrSwarmExists is returned on initialize or join request for a cluster that has already been activated -var ErrSwarmExists = fmt.Errorf("This node is already part of a swarm. Use \"docker swarm leave\" to leave this swarm and join another one.") - -// ErrPendingSwarmExists is returned on initialize or join request for a cluster that is already processing a similar request but has not succeeded yet. -var ErrPendingSwarmExists = fmt.Errorf("This node is processing an existing join request that has not succeeded yet. Use \"docker swarm leave\" to cancel the current request.") - -// ErrSwarmJoinTimeoutReached is returned when cluster join could not complete before timeout was reached. -var ErrSwarmJoinTimeoutReached = fmt.Errorf("Timeout was reached before node was joined. The attempt to join the swarm will continue in the background. Use the \"docker info\" command to see the current swarm status of your node.") - -// ErrSwarmLocked is returned if the swarm is encrypted and needs a key to unlock it. -var ErrSwarmLocked = fmt.Errorf("Swarm is encrypted and needs to be unlocked before it can be used. Please use \"docker swarm unlock\" to unlock it.") - -// ErrSwarmCertificatesExpired is returned if docker was not started for the whole validity period and they had no chance to renew automatically. -var ErrSwarmCertificatesExpired = errors.New("Swarm certificates have expired. To replace them, leave the swarm and join again.") - -// NetworkSubnetsProvider exposes functions for retrieving the subnets -// of networks managed by Docker, so they can be filtered. -type NetworkSubnetsProvider interface { - V4Subnets() []net.IPNet - V6Subnets() []net.IPNet -} - -// Config provides values for Cluster. -type Config struct { - Root string - Name string - Backend executorpkg.Backend - NetworkSubnetsProvider NetworkSubnetsProvider - - // DefaultAdvertiseAddr is the default host/IP or network interface to use - // if no AdvertiseAddr value is specified. - DefaultAdvertiseAddr string - - // path to store runtime state, such as the swarm control socket - RuntimeRoot string -} - -// Cluster provides capabilities to participate in a cluster as a worker or a -// manager. -type Cluster struct { - sync.RWMutex - *node - root string - runtimeRoot string - config Config - configEvent chan struct{} // todo: make this array and goroutine safe - actualLocalAddr string // after resolution, not persisted - stop bool - err error - cancelDelay func() - attachers map[string]*attacher - locked bool - lastNodeConfig *nodeStartConfig -} - -// attacher manages the in-memory attachment state of a container -// attachment to a global scope network managed by swarm manager. It -// helps in identifying the attachment ID via the taskID and the -// corresponding attachment configuration obtained from the manager. -type attacher struct { - taskID string - config *network.NetworkingConfig - attachWaitCh chan *network.NetworkingConfig - attachCompleteCh chan struct{} - detachWaitCh chan struct{} -} - -type node struct { - *swarmnode.Node - done chan struct{} - ready bool - conn *grpc.ClientConn - client swarmapi.ControlClient - logs swarmapi.LogsClient - reconnectDelay time.Duration - config nodeStartConfig -} - -// nodeStartConfig holds configuration needed to start a new node. Exported -// fields of this structure are saved to disk in json. Unexported fields -// contain data that shouldn't be persisted between daemon reloads. -type nodeStartConfig struct { - // LocalAddr is this machine's local IP or hostname, if specified. - LocalAddr string - // RemoteAddr is the address that was given to "swarm join". It is used - // to find LocalAddr if necessary. - RemoteAddr string - // ListenAddr is the address we bind to, including a port. - ListenAddr string - // AdvertiseAddr is the address other nodes should connect to, - // including a port. - AdvertiseAddr string - joinAddr string - forceNewCluster bool - joinToken string - lockKey []byte - autolock bool -} - -// New creates a new Cluster instance using provided config. -func New(config Config) (*Cluster, error) { - root := filepath.Join(config.Root, swarmDirName) - if err := os.MkdirAll(root, 0700); err != nil { - return nil, err - } - if config.RuntimeRoot == "" { - config.RuntimeRoot = root - } - if err := os.MkdirAll(config.RuntimeRoot, 0700); err != nil { - return nil, err - } - c := &Cluster{ - root: root, - config: config, - configEvent: make(chan struct{}, 10), - runtimeRoot: config.RuntimeRoot, - attachers: make(map[string]*attacher), - } - - nodeConfig, err := c.loadState() - if err != nil { - if os.IsNotExist(err) { - return c, nil - } - return nil, err - } - - n, err := c.startNewNode(*nodeConfig) - if err != nil { - return nil, err - } - - select { - case <-time.After(swarmConnectTimeout): - logrus.Error("swarm component could not be started before timeout was reached") - case <-n.Ready(): - case <-n.done: - if errors.Cause(c.err) == ErrSwarmLocked { - return c, nil - } - if err, ok := errors.Cause(c.err).(x509.CertificateInvalidError); ok && err.Reason == x509.Expired { - c.err = ErrSwarmCertificatesExpired - return c, nil - } - return nil, fmt.Errorf("swarm component could not be started: %v", c.err) - } - go c.reconnectOnFailure(n) - return c, nil -} - -func (c *Cluster) loadState() (*nodeStartConfig, error) { - dt, err := ioutil.ReadFile(filepath.Join(c.root, stateFile)) - if err != nil { - return nil, err - } - // missing certificate means no actual state to restore from - if _, err := os.Stat(filepath.Join(c.root, "certificates/swarm-node.crt")); err != nil { - if os.IsNotExist(err) { - c.clearState() - } - return nil, err - } - var st nodeStartConfig - if err := json.Unmarshal(dt, &st); err != nil { - return nil, err - } - return &st, nil -} - -func (c *Cluster) saveState(config nodeStartConfig) error { - dt, err := json.Marshal(config) - if err != nil { - return err - } - return ioutils.AtomicWriteFile(filepath.Join(c.root, stateFile), dt, 0600) -} - -func (c *Cluster) reconnectOnFailure(n *node) { - for { - <-n.done - c.Lock() - if c.stop || c.node != nil { - c.Unlock() - return - } - n.reconnectDelay *= 2 - if n.reconnectDelay > maxReconnectDelay { - n.reconnectDelay = maxReconnectDelay - } - logrus.Warnf("Restarting swarm in %.2f seconds", n.reconnectDelay.Seconds()) - delayCtx, cancel := context.WithTimeout(context.Background(), n.reconnectDelay) - c.cancelDelay = cancel - c.Unlock() - <-delayCtx.Done() - if delayCtx.Err() != context.DeadlineExceeded { - return - } - c.Lock() - if c.node != nil { - c.Unlock() - return - } - var err error - config := n.config - config.RemoteAddr = c.getRemoteAddress() - config.joinAddr = config.RemoteAddr - n, err = c.startNewNode(config) - if err != nil { - c.err = err - close(n.done) - } - c.Unlock() - } -} - -func (c *Cluster) startNewNode(conf nodeStartConfig) (*node, error) { - if err := c.config.Backend.IsSwarmCompatible(); err != nil { - return nil, err - } - - actualLocalAddr := conf.LocalAddr - if actualLocalAddr == "" { - // If localAddr was not specified, resolve it automatically - // based on the route to joinAddr. localAddr can only be left - // empty on "join". - listenHost, _, err := net.SplitHostPort(conf.ListenAddr) - if err != nil { - return nil, fmt.Errorf("could not parse listen address: %v", err) - } - - listenAddrIP := net.ParseIP(listenHost) - if listenAddrIP == nil || !listenAddrIP.IsUnspecified() { - actualLocalAddr = listenHost - } else { - if conf.RemoteAddr == "" { - // Should never happen except using swarms created by - // old versions that didn't save remoteAddr. - conf.RemoteAddr = "8.8.8.8:53" - } - conn, err := net.Dial("udp", conf.RemoteAddr) - if err != nil { - return nil, fmt.Errorf("could not find local IP address: %v", err) - } - localHostPort := conn.LocalAddr().String() - actualLocalAddr, _, _ = net.SplitHostPort(localHostPort) - conn.Close() - } - } - - var control string - if runtime.GOOS == "windows" { - control = `\\.\pipe\` + controlSocket - } else { - control = filepath.Join(c.runtimeRoot, controlSocket) - } - - c.node = nil - c.cancelDelay = nil - c.stop = false - n, err := swarmnode.New(&swarmnode.Config{ - Hostname: c.config.Name, - ForceNewCluster: conf.forceNewCluster, - ListenControlAPI: control, - ListenRemoteAPI: conf.ListenAddr, - AdvertiseRemoteAPI: conf.AdvertiseAddr, - JoinAddr: conf.joinAddr, - StateDir: c.root, - JoinToken: conf.joinToken, - Executor: container.NewExecutor(c.config.Backend), - HeartbeatTick: 1, - ElectionTick: 3, - UnlockKey: conf.lockKey, - AutoLockManagers: conf.autolock, - PluginGetter: c.config.Backend.PluginGetter(), - }) - - if err != nil { - return nil, err - } - ctx := context.Background() - if err := n.Start(ctx); err != nil { - return nil, err - } - node := &node{ - Node: n, - done: make(chan struct{}), - reconnectDelay: initialReconnectDelay, - config: conf, - } - c.node = node - c.actualLocalAddr = actualLocalAddr // not saved - c.saveState(conf) - - c.config.Backend.DaemonJoinsCluster(c) - go func() { - err := detectLockedError(n.Err(ctx)) - if err != nil { - logrus.Errorf("cluster exited with error: %v", err) - } - c.Lock() - c.node = nil - c.err = err - if errors.Cause(err) == ErrSwarmLocked { - c.locked = true - confClone := conf - c.lastNodeConfig = &confClone - } - c.Unlock() - close(node.done) - }() - - go func() { - select { - case <-n.Ready(): - c.Lock() - node.ready = true - c.err = nil - c.Unlock() - case <-ctx.Done(): - } - c.configEvent <- struct{}{} - }() - - go func() { - for conn := range n.ListenControlSocket(ctx) { - c.Lock() - if node.conn != conn { - if conn == nil { - node.client = nil - node.logs = nil - } else { - node.client = swarmapi.NewControlClient(conn) - node.logs = swarmapi.NewLogsClient(conn) - } - } - node.conn = conn - c.Unlock() - c.configEvent <- struct{}{} - } - }() - - return node, nil -} - -// Init initializes new cluster from user provided request. -func (c *Cluster) Init(req types.InitRequest) (string, error) { - c.Lock() - if c.swarmExists() { - if !req.ForceNewCluster { - c.Unlock() - return "", ErrSwarmExists - } - if err := c.stopNode(); err != nil { - c.Unlock() - return "", err - } - } - - if err := validateAndSanitizeInitRequest(&req); err != nil { - c.Unlock() - return "", err - } - - listenHost, listenPort, err := resolveListenAddr(req.ListenAddr) - if err != nil { - c.Unlock() - return "", err - } - - advertiseHost, advertisePort, err := c.resolveAdvertiseAddr(req.AdvertiseAddr, listenPort) - if err != nil { - c.Unlock() - return "", err - } - - localAddr := listenHost - - // If the local address is undetermined, the advertise address - // will be used as local address, if it belongs to this system. - // If the advertise address is not local, then we try to find - // a system address to use as local address. If this fails, - // we give up and ask user to pass the listen address. - if net.ParseIP(localAddr).IsUnspecified() { - advertiseIP := net.ParseIP(advertiseHost) - - found := false - for _, systemIP := range listSystemIPs() { - if systemIP.Equal(advertiseIP) { - localAddr = advertiseIP.String() - found = true - break - } - } - - if !found { - ip, err := c.resolveSystemAddr() - if err != nil { - c.Unlock() - logrus.Warnf("Could not find a local address: %v", err) - return "", errMustSpecifyListenAddr - } - localAddr = ip.String() - } - } - - // todo: check current state existing - n, err := c.startNewNode(nodeStartConfig{ - forceNewCluster: req.ForceNewCluster, - autolock: req.AutoLockManagers, - LocalAddr: localAddr, - ListenAddr: net.JoinHostPort(listenHost, listenPort), - AdvertiseAddr: net.JoinHostPort(advertiseHost, advertisePort), - }) - if err != nil { - c.Unlock() - return "", err - } - c.Unlock() - - select { - case <-n.Ready(): - if err := initClusterSpec(n, req.Spec); err != nil { - return "", err - } - go c.reconnectOnFailure(n) - return n.NodeID(), nil - case <-n.done: - c.RLock() - defer c.RUnlock() - if !req.ForceNewCluster { // if failure on first attempt don't keep state - if err := c.clearState(); err != nil { - return "", err - } - } - return "", c.err - } -} - -// Join makes current Cluster part of an existing swarm cluster. -func (c *Cluster) Join(req types.JoinRequest) error { - c.Lock() - if c.swarmExists() { - c.Unlock() - return ErrSwarmExists - } - if err := validateAndSanitizeJoinRequest(&req); err != nil { - c.Unlock() - return err - } - - listenHost, listenPort, err := resolveListenAddr(req.ListenAddr) - if err != nil { - c.Unlock() - return err - } - - var advertiseAddr string - if req.AdvertiseAddr != "" { - advertiseHost, advertisePort, err := c.resolveAdvertiseAddr(req.AdvertiseAddr, listenPort) - // For joining, we don't need to provide an advertise address, - // since the remote side can detect it. - if err == nil { - advertiseAddr = net.JoinHostPort(advertiseHost, advertisePort) - } - } - - // todo: check current state existing - n, err := c.startNewNode(nodeStartConfig{ - RemoteAddr: req.RemoteAddrs[0], - ListenAddr: net.JoinHostPort(listenHost, listenPort), - AdvertiseAddr: advertiseAddr, - joinAddr: req.RemoteAddrs[0], - joinToken: req.JoinToken, - }) - if err != nil { - c.Unlock() - return err - } - c.Unlock() - - select { - case <-time.After(swarmConnectTimeout): - // attempt to connect will continue in background, but reconnect only if it didn't fail - go func() { - select { - case <-n.Ready(): - c.reconnectOnFailure(n) - case <-n.done: - logrus.Errorf("failed to join the cluster: %+v", c.err) - } - }() - return ErrSwarmJoinTimeoutReached - case <-n.Ready(): - go c.reconnectOnFailure(n) - return nil - case <-n.done: - c.RLock() - defer c.RUnlock() - return c.err - } -} - -// GetUnlockKey returns the unlock key for the swarm. -func (c *Cluster) GetUnlockKey() (string, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return "", c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - client := swarmapi.NewCAClient(c.conn) - - r, err := client.GetUnlockKey(ctx, &swarmapi.GetUnlockKeyRequest{}) - if err != nil { - return "", err - } - - if len(r.UnlockKey) == 0 { - // no key - return "", nil - } - - return encryption.HumanReadableKey(r.UnlockKey), nil -} - -// UnlockSwarm provides a key to decrypt data that is encrypted at rest. -func (c *Cluster) UnlockSwarm(req types.UnlockRequest) error { - c.RLock() - if !c.isActiveManager() { - if err := c.errNoManager(); err != ErrSwarmLocked { - c.RUnlock() - return err - } - } - - if c.node != nil || c.locked != true { - c.RUnlock() - return errors.New("swarm is not locked") - } - c.RUnlock() - - key, err := encryption.ParseHumanReadableKey(req.UnlockKey) - if err != nil { - return err - } - - c.Lock() - config := *c.lastNodeConfig - config.lockKey = key - n, err := c.startNewNode(config) - if err != nil { - c.Unlock() - return err - } - c.Unlock() - select { - case <-n.Ready(): - case <-n.done: - if errors.Cause(c.err) == ErrSwarmLocked { - return errors.New("swarm could not be unlocked: invalid key provided") - } - return fmt.Errorf("swarm component could not be started: %v", c.err) - } - go c.reconnectOnFailure(n) - return nil -} - -// stopNode is a helper that stops the active c.node and waits until it has -// shut down. Call while keeping the cluster lock. -func (c *Cluster) stopNode() error { - if c.node == nil { - return nil - } - c.stop = true - if c.cancelDelay != nil { - c.cancelDelay() - c.cancelDelay = nil - } - node := c.node - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - // TODO: can't hold lock on stop because it calls back to network - c.Unlock() - defer c.Lock() - if err := node.Stop(ctx); err != nil && !strings.Contains(err.Error(), "context canceled") { - return err - } - <-node.done - return nil -} - -func removingManagerCausesLossOfQuorum(reachable, unreachable int) bool { - return reachable-2 <= unreachable -} - -func isLastManager(reachable, unreachable int) bool { - return reachable == 1 && unreachable == 0 -} - -// Leave shuts down Cluster and removes current state. -func (c *Cluster) Leave(force bool) error { - c.Lock() - node := c.node - if node == nil { - if c.locked { - c.locked = false - c.lastNodeConfig = nil - c.Unlock() - } else if c.err == ErrSwarmCertificatesExpired { - c.err = nil - c.Unlock() - } else { - c.Unlock() - return ErrNoSwarm - } - } else { - if node.Manager() != nil && !force { - msg := "You are attempting to leave the swarm on a node that is participating as a manager. " - if c.isActiveManager() { - active, reachable, unreachable, err := c.managerStats() - if err == nil { - if active && removingManagerCausesLossOfQuorum(reachable, unreachable) { - if isLastManager(reachable, unreachable) { - msg += "Removing the last manager erases all current state of the swarm. Use `--force` to ignore this message. " - c.Unlock() - return fmt.Errorf(msg) - } - msg += fmt.Sprintf("Removing this node leaves %v managers out of %v. Without a Raft quorum your swarm will be inaccessible. ", reachable-1, reachable+unreachable) - } - } - } else { - msg += "Doing so may lose the consensus of your cluster. " - } - - msg += "The only way to restore a swarm that has lost consensus is to reinitialize it with `--force-new-cluster`. Use `--force` to suppress this message." - c.Unlock() - return fmt.Errorf(msg) - } - if err := c.stopNode(); err != nil { - logrus.Errorf("failed to shut down cluster node: %v", err) - signal.DumpStacks("") - c.Unlock() - return err - } - c.Unlock() - if nodeID := node.NodeID(); nodeID != "" { - nodeContainers, err := c.listContainerForNode(nodeID) - if err != nil { - return err - } - for _, id := range nodeContainers { - if err := c.config.Backend.ContainerRm(id, &apitypes.ContainerRmConfig{ForceRemove: true}); err != nil { - logrus.Errorf("error removing %v: %v", id, err) - } - } - } - } - c.configEvent <- struct{}{} - // todo: cleanup optional? - if err := c.clearState(); err != nil { - return err - } - - return nil -} - -func (c *Cluster) listContainerForNode(nodeID string) ([]string, error) { - var ids []string - filters := filters.NewArgs() - filters.Add("label", fmt.Sprintf("com.docker.swarm.node.id=%s", nodeID)) - containers, err := c.config.Backend.Containers(&apitypes.ContainerListOptions{ - Filters: filters, - }) - if err != nil { - return []string{}, err - } - for _, c := range containers { - ids = append(ids, c.ID) - } - return ids, nil -} - -func (c *Cluster) clearState() error { - // todo: backup this data instead of removing? - if err := os.RemoveAll(c.root); err != nil { - return err - } - if err := os.MkdirAll(c.root, 0700); err != nil { - return err - } - c.config.Backend.DaemonLeavesCluster() - return nil -} - -func (c *Cluster) getRequestContext() (context.Context, func()) { // TODO: not needed when requests don't block on qourum lost - return context.WithTimeout(context.Background(), swarmRequestTimeout) -} - -// Inspect retrieves the configuration properties of a managed swarm cluster. -func (c *Cluster) Inspect() (types.Swarm, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return types.Swarm{}, c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - swarm, err := getSwarm(ctx, c.client) - if err != nil { - return types.Swarm{}, err - } - - return convert.SwarmFromGRPC(*swarm), nil -} - -// Update updates configuration of a managed swarm cluster. -func (c *Cluster) Update(version uint64, spec types.Spec, flags types.UpdateFlags) error { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - swarm, err := getSwarm(ctx, c.client) - if err != nil { - return err - } - - // In update, client should provide the complete spec of the swarm, including - // Name and Labels. If a field is specified with 0 or nil, then the default value - // will be used to swarmkit. - clusterSpec, err := convert.SwarmSpecToGRPC(spec) - if err != nil { - return err - } - - _, err = c.client.UpdateCluster( - ctx, - &swarmapi.UpdateClusterRequest{ - ClusterID: swarm.ID, - Spec: &clusterSpec, - ClusterVersion: &swarmapi.Version{ - Index: version, - }, - Rotation: swarmapi.KeyRotation{ - WorkerJoinToken: flags.RotateWorkerToken, - ManagerJoinToken: flags.RotateManagerToken, - ManagerUnlockKey: flags.RotateManagerUnlockKey, - }, - }, - ) - return err -} - -// IsManager returns true if Cluster is participating as a manager. -func (c *Cluster) IsManager() bool { - c.RLock() - defer c.RUnlock() - return c.isActiveManager() -} - -// IsAgent returns true if Cluster is participating as a worker/agent. -func (c *Cluster) IsAgent() bool { - c.RLock() - defer c.RUnlock() - return c.node != nil && c.ready -} - -// GetLocalAddress returns the local address. -func (c *Cluster) GetLocalAddress() string { - c.RLock() - defer c.RUnlock() - return c.actualLocalAddr -} - -// GetListenAddress returns the listen address. -func (c *Cluster) GetListenAddress() string { - c.RLock() - defer c.RUnlock() - if c.node != nil { - return c.node.config.ListenAddr - } - return "" -} - -// GetAdvertiseAddress returns the remotely reachable address of this node. -func (c *Cluster) GetAdvertiseAddress() string { - c.RLock() - defer c.RUnlock() - if c.node != nil && c.node.config.AdvertiseAddr != "" { - advertiseHost, _, _ := net.SplitHostPort(c.node.config.AdvertiseAddr) - return advertiseHost - } - return c.actualLocalAddr -} - -// GetRemoteAddress returns a known advertise address of a remote manager if -// available. -// todo: change to array/connect with info -func (c *Cluster) GetRemoteAddress() string { - c.RLock() - defer c.RUnlock() - return c.getRemoteAddress() -} - -func (c *Cluster) getRemoteAddress() string { - if c.node == nil { - return "" - } - nodeID := c.node.NodeID() - for _, r := range c.node.Remotes() { - if r.NodeID != nodeID { - return r.Addr - } - } - return "" -} - -// ListenClusterEvents returns a channel that receives messages on cluster -// participation changes. -// todo: make cancelable and accessible to multiple callers -func (c *Cluster) ListenClusterEvents() <-chan struct{} { - return c.configEvent -} - -// Info returns information about the current cluster state. -func (c *Cluster) Info() types.Info { - info := types.Info{ - NodeAddr: c.GetAdvertiseAddress(), - } - - c.RLock() - defer c.RUnlock() - - if c.node == nil { - info.LocalNodeState = types.LocalNodeStateInactive - if c.cancelDelay != nil { - info.LocalNodeState = types.LocalNodeStateError - } - if c.locked { - info.LocalNodeState = types.LocalNodeStateLocked - } else if c.err == ErrSwarmCertificatesExpired { - info.LocalNodeState = types.LocalNodeStateError - } - } else { - info.LocalNodeState = types.LocalNodeStatePending - if c.ready == true { - info.LocalNodeState = types.LocalNodeStateActive - } else if c.locked { - info.LocalNodeState = types.LocalNodeStateLocked - } - } - if c.err != nil { - info.Error = c.err.Error() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - if c.isActiveManager() { - info.ControlAvailable = true - swarm, err := c.Inspect() - if err != nil { - info.Error = err.Error() - } - - // Strip JoinTokens - info.Cluster = swarm.ClusterInfo - - if r, err := c.client.ListNodes(ctx, &swarmapi.ListNodesRequest{}); err == nil { - info.Nodes = len(r.Nodes) - for _, n := range r.Nodes { - if n.ManagerStatus != nil { - info.Managers = info.Managers + 1 - } - } - } - } - - if c.node != nil { - for _, r := range c.node.Remotes() { - info.RemoteManagers = append(info.RemoteManagers, types.Peer{NodeID: r.NodeID, Addr: r.Addr}) - } - info.NodeID = c.node.NodeID() - } - - return info -} - -// isActiveManager should not be called without a read lock -func (c *Cluster) isActiveManager() bool { - return c.node != nil && c.conn != nil -} - -// swarmExists should not be called without a read lock -func (c *Cluster) swarmExists() bool { - return c.node != nil || c.locked || c.err == ErrSwarmCertificatesExpired -} - -// errNoManager returns error describing why manager commands can't be used. -// Call with read lock. -func (c *Cluster) errNoManager() error { - if c.node == nil { - if c.locked { - return ErrSwarmLocked - } - if c.err == ErrSwarmCertificatesExpired { - return ErrSwarmCertificatesExpired - } - return fmt.Errorf("This node is not a swarm manager. Use \"docker swarm init\" or \"docker swarm join\" to connect this node to swarm and try again.") - } - if c.node.Manager() != nil { - return fmt.Errorf("This node is not a swarm manager. Manager is being prepared or has trouble connecting to the cluster.") - } - return fmt.Errorf("This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.") -} - -// GetServices returns all services of a managed swarm cluster. -func (c *Cluster) GetServices(options apitypes.ServiceListOptions) ([]types.Service, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return nil, c.errNoManager() - } - - filters, err := newListServicesFilters(options.Filters) - if err != nil { - return nil, err - } - ctx, cancel := c.getRequestContext() - defer cancel() - - r, err := c.client.ListServices( - ctx, - &swarmapi.ListServicesRequest{Filters: filters}) - if err != nil { - return nil, err - } - - services := []types.Service{} - - for _, service := range r.Services { - services = append(services, convert.ServiceFromGRPC(*service)) - } - - return services, nil -} - -// imageWithDigestString takes an image such as name or name:tag -// and returns the image pinned to a digest, such as name@sha256:34234... -// Due to the difference between the docker/docker/reference, and the -// docker/distribution/reference packages, we're parsing the image twice. -// As the two packages converge, this function should be simplified. -// TODO(nishanttotla): After the packages converge, the function must -// convert distreference.Named -> distreference.Canonical, and the logic simplified. -func (c *Cluster) imageWithDigestString(ctx context.Context, image string, authConfig *apitypes.AuthConfig) (string, error) { - if _, err := digest.ParseDigest(image); err == nil { - return "", errors.New("image reference is an image ID") - } - ref, err := distreference.ParseNamed(image) - if err != nil { - return "", err - } - // only query registry if not a canonical reference (i.e. with digest) - if _, ok := ref.(distreference.Canonical); !ok { - // create a docker/docker/reference Named object because GetRepository needs it - dockerRef, err := reference.ParseNamed(image) - if err != nil { - return "", err - } - dockerRef = reference.WithDefaultTag(dockerRef) - namedTaggedRef, ok := dockerRef.(reference.NamedTagged) - if !ok { - return "", fmt.Errorf("unable to cast image to NamedTagged reference object") - } - - repo, _, err := c.config.Backend.GetRepository(ctx, namedTaggedRef, authConfig) - if err != nil { - return "", err - } - dscrptr, err := repo.Tags(ctx).Get(ctx, namedTaggedRef.Tag()) - if err != nil { - return "", err - } - - namedDigestedRef, err := distreference.WithDigest(distreference.EnsureTagged(ref), dscrptr.Digest) - if err != nil { - return "", err - } - return namedDigestedRef.String(), nil - } - // reference already contains a digest, so just return it - return ref.String(), nil -} - -// CreateService creates a new service in a managed swarm cluster. -func (c *Cluster) CreateService(s types.ServiceSpec, encodedAuth string) (*apitypes.ServiceCreateResponse, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return nil, c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - err := c.populateNetworkID(ctx, c.client, &s) - if err != nil { - return nil, err - } - - serviceSpec, err := convert.ServiceSpecToGRPC(s) - if err != nil { - return nil, err - } - - ctnr := serviceSpec.Task.GetContainer() - if ctnr == nil { - return nil, fmt.Errorf("service does not use container tasks") - } - - if encodedAuth != "" { - ctnr.PullOptions = &swarmapi.ContainerSpec_PullOptions{RegistryAuth: encodedAuth} - } - - // retrieve auth config from encoded auth - authConfig := &apitypes.AuthConfig{} - if encodedAuth != "" { - if err := json.NewDecoder(base64.NewDecoder(base64.URLEncoding, strings.NewReader(encodedAuth))).Decode(authConfig); err != nil { - logrus.Warnf("invalid authconfig: %v", err) - } - } - - resp := &apitypes.ServiceCreateResponse{} - - // pin image by digest - if os.Getenv("DOCKER_SERVICE_PREFER_OFFLINE_IMAGE") != "1" { - digestImage, err := c.imageWithDigestString(ctx, ctnr.Image, authConfig) - if err != nil { - logrus.Warnf("unable to pin image %s to digest: %s", ctnr.Image, err.Error()) - resp.Warnings = append(resp.Warnings, fmt.Sprintf("unable to pin image %s to digest: %s", ctnr.Image, err.Error())) - } else if ctnr.Image != digestImage { - logrus.Debugf("pinning image %s by digest: %s", ctnr.Image, digestImage) - ctnr.Image = digestImage - } else { - logrus.Debugf("creating service using supplied digest reference %s", ctnr.Image) - } - } - - r, err := c.client.CreateService(ctx, &swarmapi.CreateServiceRequest{Spec: &serviceSpec}) - if err != nil { - return nil, err - } - - resp.ID = r.Service.ID - return resp, nil -} - -// GetService returns a service based on an ID or name. -func (c *Cluster) GetService(input string) (types.Service, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return types.Service{}, c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - service, err := getService(ctx, c.client, input) - if err != nil { - return types.Service{}, err - } - return convert.ServiceFromGRPC(*service), nil -} - -// UpdateService updates existing service to match new properties. -func (c *Cluster) UpdateService(serviceIDOrName string, version uint64, spec types.ServiceSpec, encodedAuth string, registryAuthFrom string) (*apitypes.ServiceUpdateResponse, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return nil, c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - err := c.populateNetworkID(ctx, c.client, &spec) - if err != nil { - return nil, err - } - - serviceSpec, err := convert.ServiceSpecToGRPC(spec) - if err != nil { - return nil, err - } - - currentService, err := getService(ctx, c.client, serviceIDOrName) - if err != nil { - return nil, err - } - - newCtnr := serviceSpec.Task.GetContainer() - if newCtnr == nil { - return nil, fmt.Errorf("service does not use container tasks") - } - - if encodedAuth != "" { - newCtnr.PullOptions = &swarmapi.ContainerSpec_PullOptions{RegistryAuth: encodedAuth} - } else { - // this is needed because if the encodedAuth isn't being updated then we - // shouldn't lose it, and continue to use the one that was already present - var ctnr *swarmapi.ContainerSpec - switch registryAuthFrom { - case apitypes.RegistryAuthFromSpec, "": - ctnr = currentService.Spec.Task.GetContainer() - case apitypes.RegistryAuthFromPreviousSpec: - if currentService.PreviousSpec == nil { - return nil, fmt.Errorf("service does not have a previous spec") - } - ctnr = currentService.PreviousSpec.Task.GetContainer() - default: - return nil, fmt.Errorf("unsupported registryAuthFromValue") - } - if ctnr == nil { - return nil, fmt.Errorf("service does not use container tasks") - } - newCtnr.PullOptions = ctnr.PullOptions - // update encodedAuth so it can be used to pin image by digest - if ctnr.PullOptions != nil { - encodedAuth = ctnr.PullOptions.RegistryAuth - } - } - - // retrieve auth config from encoded auth - authConfig := &apitypes.AuthConfig{} - if encodedAuth != "" { - if err := json.NewDecoder(base64.NewDecoder(base64.URLEncoding, strings.NewReader(encodedAuth))).Decode(authConfig); err != nil { - logrus.Warnf("invalid authconfig: %v", err) - } - } - - resp := &apitypes.ServiceUpdateResponse{} - - // pin image by digest - if os.Getenv("DOCKER_SERVICE_PREFER_OFFLINE_IMAGE") != "1" { - digestImage, err := c.imageWithDigestString(ctx, newCtnr.Image, authConfig) - if err != nil { - logrus.Warnf("unable to pin image %s to digest: %s", newCtnr.Image, err.Error()) - resp.Warnings = append(resp.Warnings, fmt.Sprintf("unable to pin image %s to digest: %s", newCtnr.Image, err.Error())) - } else if newCtnr.Image != digestImage { - logrus.Debugf("pinning image %s by digest: %s", newCtnr.Image, digestImage) - newCtnr.Image = digestImage - } else { - logrus.Debugf("updating service using supplied digest reference %s", newCtnr.Image) - } - } - - _, err = c.client.UpdateService( - ctx, - &swarmapi.UpdateServiceRequest{ - ServiceID: currentService.ID, - Spec: &serviceSpec, - ServiceVersion: &swarmapi.Version{ - Index: version, - }, - }, - ) - - return resp, err -} - -// RemoveService removes a service from a managed swarm cluster. -func (c *Cluster) RemoveService(input string) error { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - service, err := getService(ctx, c.client, input) - if err != nil { - return err - } - - if _, err := c.client.RemoveService(ctx, &swarmapi.RemoveServiceRequest{ServiceID: service.ID}); err != nil { - return err - } - return nil -} - -// ServiceLogs collects service logs and writes them back to `config.OutStream` -func (c *Cluster) ServiceLogs(ctx context.Context, input string, config *backend.ContainerLogsConfig, started chan struct{}) error { - c.RLock() - if !c.isActiveManager() { - c.RUnlock() - return c.errNoManager() - } - - service, err := getService(ctx, c.client, input) - if err != nil { - c.RUnlock() - return err - } - - stream, err := c.logs.SubscribeLogs(ctx, &swarmapi.SubscribeLogsRequest{ - Selector: &swarmapi.LogSelector{ - ServiceIDs: []string{service.ID}, - }, - Options: &swarmapi.LogSubscriptionOptions{ - Follow: config.Follow, - }, - }) - if err != nil { - c.RUnlock() - return err - } - - wf := ioutils.NewWriteFlusher(config.OutStream) - defer wf.Close() - close(started) - wf.Flush() - - outStream := stdcopy.NewStdWriter(wf, stdcopy.Stdout) - errStream := stdcopy.NewStdWriter(wf, stdcopy.Stderr) - - // Release the lock before starting the stream. - c.RUnlock() - for { - // Check the context before doing anything. - select { - case <-ctx.Done(): - return ctx.Err() - default: - } - - subscribeMsg, err := stream.Recv() - if err == io.EOF { - return nil - } - if err != nil { - return err - } - - for _, msg := range subscribeMsg.Messages { - data := []byte{} - - if config.Timestamps { - ts, err := ptypes.Timestamp(msg.Timestamp) - if err != nil { - return err - } - data = append(data, []byte(ts.Format(logger.TimeFormat)+" ")...) - } - - data = append(data, []byte(fmt.Sprintf("%s.node.id=%s,%s.service.id=%s,%s.task.id=%s ", - contextPrefix, msg.Context.NodeID, - contextPrefix, msg.Context.ServiceID, - contextPrefix, msg.Context.TaskID, - ))...) - - data = append(data, msg.Data...) - - switch msg.Stream { - case swarmapi.LogStreamStdout: - outStream.Write(data) - case swarmapi.LogStreamStderr: - errStream.Write(data) - } - } - } -} - -// GetNodes returns a list of all nodes known to a cluster. -func (c *Cluster) GetNodes(options apitypes.NodeListOptions) ([]types.Node, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return nil, c.errNoManager() - } - - filters, err := newListNodesFilters(options.Filters) - if err != nil { - return nil, err - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - r, err := c.client.ListNodes( - ctx, - &swarmapi.ListNodesRequest{Filters: filters}) - if err != nil { - return nil, err - } - - nodes := []types.Node{} - - for _, node := range r.Nodes { - nodes = append(nodes, convert.NodeFromGRPC(*node)) - } - return nodes, nil -} - -// GetNode returns a node based on an ID or name. -func (c *Cluster) GetNode(input string) (types.Node, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return types.Node{}, c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - node, err := getNode(ctx, c.client, input) - if err != nil { - return types.Node{}, err - } - return convert.NodeFromGRPC(*node), nil -} - -// UpdateNode updates existing nodes properties. -func (c *Cluster) UpdateNode(input string, version uint64, spec types.NodeSpec) error { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return c.errNoManager() - } - - nodeSpec, err := convert.NodeSpecToGRPC(spec) - if err != nil { - return err - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - currentNode, err := getNode(ctx, c.client, input) - if err != nil { - return err - } - - _, err = c.client.UpdateNode( - ctx, - &swarmapi.UpdateNodeRequest{ - NodeID: currentNode.ID, - Spec: &nodeSpec, - NodeVersion: &swarmapi.Version{ - Index: version, - }, - }, - ) - return err -} - -// RemoveNode removes a node from a cluster -func (c *Cluster) RemoveNode(input string, force bool) error { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - node, err := getNode(ctx, c.client, input) - if err != nil { - return err - } - - if _, err := c.client.RemoveNode(ctx, &swarmapi.RemoveNodeRequest{NodeID: node.ID, Force: force}); err != nil { - return err - } - return nil -} - -// GetTasks returns a list of tasks matching the filter options. -func (c *Cluster) GetTasks(options apitypes.TaskListOptions) ([]types.Task, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return nil, c.errNoManager() - } - - byName := func(filter filters.Args) error { - if filter.Include("service") { - serviceFilters := filter.Get("service") - for _, serviceFilter := range serviceFilters { - service, err := c.GetService(serviceFilter) - if err != nil { - return err - } - filter.Del("service", serviceFilter) - filter.Add("service", service.ID) - } - } - if filter.Include("node") { - nodeFilters := filter.Get("node") - for _, nodeFilter := range nodeFilters { - node, err := c.GetNode(nodeFilter) - if err != nil { - return err - } - filter.Del("node", nodeFilter) - filter.Add("node", node.ID) - } - } - return nil - } - - filters, err := newListTasksFilters(options.Filters, byName) - if err != nil { - return nil, err - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - r, err := c.client.ListTasks( - ctx, - &swarmapi.ListTasksRequest{Filters: filters}) - if err != nil { - return nil, err - } - - tasks := []types.Task{} - - for _, task := range r.Tasks { - if task.Spec.GetContainer() != nil { - tasks = append(tasks, convert.TaskFromGRPC(*task)) - } - } - return tasks, nil -} - -// GetTask returns a task by an ID. -func (c *Cluster) GetTask(input string) (types.Task, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return types.Task{}, c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - task, err := getTask(ctx, c.client, input) - if err != nil { - return types.Task{}, err - } - return convert.TaskFromGRPC(*task), nil -} - -// GetNetwork returns a cluster network by an ID. -func (c *Cluster) GetNetwork(input string) (apitypes.NetworkResource, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return apitypes.NetworkResource{}, c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - network, err := getNetwork(ctx, c.client, input) - if err != nil { - return apitypes.NetworkResource{}, err - } - return convert.BasicNetworkFromGRPC(*network), nil -} - -func (c *Cluster) getNetworks(filters *swarmapi.ListNetworksRequest_Filters) ([]apitypes.NetworkResource, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return nil, c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - r, err := c.client.ListNetworks(ctx, &swarmapi.ListNetworksRequest{Filters: filters}) - if err != nil { - return nil, err - } - - var networks []apitypes.NetworkResource - - for _, network := range r.Networks { - networks = append(networks, convert.BasicNetworkFromGRPC(*network)) - } - - return networks, nil -} - -// GetNetworks returns all current cluster managed networks. -func (c *Cluster) GetNetworks() ([]apitypes.NetworkResource, error) { - return c.getNetworks(nil) -} - -// GetNetworksByName returns cluster managed networks by name. -// It is ok to have multiple networks here. #18864 -func (c *Cluster) GetNetworksByName(name string) ([]apitypes.NetworkResource, error) { - // Note that swarmapi.GetNetworkRequest.Name is not functional. - // So we cannot just use that with c.GetNetwork. - return c.getNetworks(&swarmapi.ListNetworksRequest_Filters{ - Names: []string{name}, - }) -} - -func attacherKey(target, containerID string) string { - return containerID + ":" + target -} - -// UpdateAttachment signals the attachment config to the attachment -// waiter who is trying to start or attach the container to the -// network. -func (c *Cluster) UpdateAttachment(target, containerID string, config *network.NetworkingConfig) error { - c.RLock() - attacher, ok := c.attachers[attacherKey(target, containerID)] - c.RUnlock() - if !ok || attacher == nil { - return fmt.Errorf("could not find attacher for container %s to network %s", containerID, target) - } - - attacher.attachWaitCh <- config - close(attacher.attachWaitCh) - return nil -} - -// WaitForDetachment waits for the container to stop or detach from -// the network. -func (c *Cluster) WaitForDetachment(ctx context.Context, networkName, networkID, taskID, containerID string) error { - c.RLock() - attacher, ok := c.attachers[attacherKey(networkName, containerID)] - if !ok { - attacher, ok = c.attachers[attacherKey(networkID, containerID)] - } - if c.node == nil || c.node.Agent() == nil { - c.RUnlock() - return fmt.Errorf("invalid cluster node while waiting for detachment") - } - - agent := c.node.Agent() - c.RUnlock() - - if ok && attacher != nil && - attacher.detachWaitCh != nil && - attacher.attachCompleteCh != nil { - // Attachment may be in progress still so wait for - // attachment to complete. - select { - case <-attacher.attachCompleteCh: - case <-ctx.Done(): - return ctx.Err() - } - - if attacher.taskID == taskID { - select { - case <-attacher.detachWaitCh: - case <-ctx.Done(): - return ctx.Err() - } - } - } - - return agent.ResourceAllocator().DetachNetwork(ctx, taskID) -} - -// AttachNetwork generates an attachment request towards the manager. -func (c *Cluster) AttachNetwork(target string, containerID string, addresses []string) (*network.NetworkingConfig, error) { - aKey := attacherKey(target, containerID) - c.Lock() - if c.node == nil || c.node.Agent() == nil { - c.Unlock() - return nil, fmt.Errorf("invalid cluster node while attaching to network") - } - if attacher, ok := c.attachers[aKey]; ok { - c.Unlock() - return attacher.config, nil - } - - agent := c.node.Agent() - attachWaitCh := make(chan *network.NetworkingConfig) - detachWaitCh := make(chan struct{}) - attachCompleteCh := make(chan struct{}) - c.attachers[aKey] = &attacher{ - attachWaitCh: attachWaitCh, - attachCompleteCh: attachCompleteCh, - detachWaitCh: detachWaitCh, - } - c.Unlock() - - ctx, cancel := c.getRequestContext() - defer cancel() - - taskID, err := agent.ResourceAllocator().AttachNetwork(ctx, containerID, target, addresses) - if err != nil { - c.Lock() - delete(c.attachers, aKey) - c.Unlock() - return nil, fmt.Errorf("Could not attach to network %s: %v", target, err) - } - - c.Lock() - c.attachers[aKey].taskID = taskID - close(attachCompleteCh) - c.Unlock() - - logrus.Debugf("Successfully attached to network %s with tid %s", target, taskID) - - var config *network.NetworkingConfig - select { - case config = <-attachWaitCh: - case <-ctx.Done(): - return nil, fmt.Errorf("attaching to network failed, make sure your network options are correct and check manager logs: %v", ctx.Err()) - } - - c.Lock() - c.attachers[aKey].config = config - c.Unlock() - return config, nil -} - -// DetachNetwork unblocks the waiters waiting on WaitForDetachment so -// that a request to detach can be generated towards the manager. -func (c *Cluster) DetachNetwork(target string, containerID string) error { - aKey := attacherKey(target, containerID) - - c.Lock() - attacher, ok := c.attachers[aKey] - delete(c.attachers, aKey) - c.Unlock() - - if !ok { - return fmt.Errorf("could not find network attachment for container %s to network %s", containerID, target) - } - - close(attacher.detachWaitCh) - return nil -} - -// CreateNetwork creates a new cluster managed network. -func (c *Cluster) CreateNetwork(s apitypes.NetworkCreateRequest) (string, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return "", c.errNoManager() - } - - if runconfig.IsPreDefinedNetwork(s.Name) { - err := fmt.Errorf("%s is a pre-defined network and cannot be created", s.Name) - return "", apierrors.NewRequestForbiddenError(err) - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - networkSpec := convert.BasicNetworkCreateToGRPC(s) - r, err := c.client.CreateNetwork(ctx, &swarmapi.CreateNetworkRequest{Spec: &networkSpec}) - if err != nil { - return "", err - } - - return r.Network.ID, nil -} - -// RemoveNetwork removes a cluster network. -func (c *Cluster) RemoveNetwork(input string) error { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - network, err := getNetwork(ctx, c.client, input) - if err != nil { - return err - } - - if _, err := c.client.RemoveNetwork(ctx, &swarmapi.RemoveNetworkRequest{NetworkID: network.ID}); err != nil { - return err - } - return nil -} - -func (c *Cluster) populateNetworkID(ctx context.Context, client swarmapi.ControlClient, s *types.ServiceSpec) error { - // Always prefer NetworkAttachmentConfigs from TaskTemplate - // but fallback to service spec for backward compatibility - networks := s.TaskTemplate.Networks - if len(networks) == 0 { - networks = s.Networks - } - - for i, n := range networks { - apiNetwork, err := getNetwork(ctx, client, n.Target) - if err != nil { - if ln, _ := c.config.Backend.FindNetwork(n.Target); ln != nil && !ln.Info().Dynamic() { - err = fmt.Errorf("The network %s cannot be used with services. Only networks scoped to the swarm can be used, such as those created with the overlay driver.", ln.Name()) - return apierrors.NewRequestForbiddenError(err) - } - return err - } - networks[i].Target = apiNetwork.ID - } - return nil -} - -func getNetwork(ctx context.Context, c swarmapi.ControlClient, input string) (*swarmapi.Network, error) { - // GetNetwork to match via full ID. - rg, err := c.GetNetwork(ctx, &swarmapi.GetNetworkRequest{NetworkID: input}) - if err != nil { - // If any error (including NotFound), ListNetworks to match via ID prefix and full name. - rl, err := c.ListNetworks(ctx, &swarmapi.ListNetworksRequest{Filters: &swarmapi.ListNetworksRequest_Filters{Names: []string{input}}}) - if err != nil || len(rl.Networks) == 0 { - rl, err = c.ListNetworks(ctx, &swarmapi.ListNetworksRequest{Filters: &swarmapi.ListNetworksRequest_Filters{IDPrefixes: []string{input}}}) - } - - if err != nil { - return nil, err - } - - if len(rl.Networks) == 0 { - return nil, fmt.Errorf("network %s not found", input) - } - - if l := len(rl.Networks); l > 1 { - return nil, fmt.Errorf("network %s is ambiguous (%d matches found)", input, l) - } - - return rl.Networks[0], nil - } - return rg.Network, nil -} - -// Cleanup stops active swarm node. This is run before daemon shutdown. -func (c *Cluster) Cleanup() { - c.Lock() - node := c.node - if node == nil { - c.Unlock() - return - } - defer c.Unlock() - if c.isActiveManager() { - active, reachable, unreachable, err := c.managerStats() - if err == nil { - singlenode := active && isLastManager(reachable, unreachable) - if active && !singlenode && removingManagerCausesLossOfQuorum(reachable, unreachable) { - logrus.Errorf("Leaving cluster with %v managers left out of %v. Raft quorum will be lost.", reachable-1, reachable+unreachable) - } - } - } - c.stopNode() -} - -func (c *Cluster) managerStats() (current bool, reachable int, unreachable int, err error) { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - nodes, err := c.client.ListNodes(ctx, &swarmapi.ListNodesRequest{}) - if err != nil { - return false, 0, 0, err - } - for _, n := range nodes.Nodes { - if n.ManagerStatus != nil { - if n.ManagerStatus.Reachability == swarmapi.RaftMemberStatus_REACHABLE { - reachable++ - if n.ID == c.node.NodeID() { - current = true - } - } - if n.ManagerStatus.Reachability == swarmapi.RaftMemberStatus_UNREACHABLE { - unreachable++ - } - } - } - return -} - -func validateAndSanitizeInitRequest(req *types.InitRequest) error { - var err error - req.ListenAddr, err = validateAddr(req.ListenAddr) - if err != nil { - return fmt.Errorf("invalid ListenAddr %q: %v", req.ListenAddr, err) - } - - if req.Spec.Annotations.Name == "" { - req.Spec.Annotations.Name = "default" - } else if req.Spec.Annotations.Name != "default" { - return errors.New(`swarm spec must be named "default"`) - } - - return nil -} - -func validateAndSanitizeJoinRequest(req *types.JoinRequest) error { - var err error - req.ListenAddr, err = validateAddr(req.ListenAddr) - if err != nil { - return fmt.Errorf("invalid ListenAddr %q: %v", req.ListenAddr, err) - } - if len(req.RemoteAddrs) == 0 { - return fmt.Errorf("at least 1 RemoteAddr is required to join") - } - for i := range req.RemoteAddrs { - req.RemoteAddrs[i], err = validateAddr(req.RemoteAddrs[i]) - if err != nil { - return fmt.Errorf("invalid remoteAddr %q: %v", req.RemoteAddrs[i], err) - } - } - return nil -} - -func validateAddr(addr string) (string, error) { - if addr == "" { - return addr, fmt.Errorf("invalid empty address") - } - newaddr, err := opts.ParseTCPAddr(addr, defaultAddr) - if err != nil { - return addr, nil - } - return strings.TrimPrefix(newaddr, "tcp://"), nil -} - -func initClusterSpec(node *node, spec types.Spec) error { - ctx, _ := context.WithTimeout(context.Background(), 5*time.Second) - for conn := range node.ListenControlSocket(ctx) { - if ctx.Err() != nil { - return ctx.Err() - } - if conn != nil { - client := swarmapi.NewControlClient(conn) - var cluster *swarmapi.Cluster - for i := 0; ; i++ { - lcr, err := client.ListClusters(ctx, &swarmapi.ListClustersRequest{}) - if err != nil { - return fmt.Errorf("error on listing clusters: %v", err) - } - if len(lcr.Clusters) == 0 { - if i < 10 { - time.Sleep(200 * time.Millisecond) - continue - } - return fmt.Errorf("empty list of clusters was returned") - } - cluster = lcr.Clusters[0] - break - } - // In init, we take the initial default values from swarmkit, and merge - // any non nil or 0 value from spec to GRPC spec. This will leave the - // default value alone. - // Note that this is different from Update(), as in Update() we expect - // user to specify the complete spec of the cluster (as they already know - // the existing one and knows which field to update) - clusterSpec, err := convert.MergeSwarmSpecToGRPC(spec, cluster.Spec) - if err != nil { - return fmt.Errorf("error updating cluster settings: %v", err) - } - _, err = client.UpdateCluster(ctx, &swarmapi.UpdateClusterRequest{ - ClusterID: cluster.ID, - ClusterVersion: &cluster.Meta.Version, - Spec: &clusterSpec, - }) - if err != nil { - return fmt.Errorf("error updating cluster settings: %v", err) - } - return nil - } - } - return ctx.Err() -} - -func detectLockedError(err error) error { - if err == swarmnode.ErrInvalidUnlockKey { - return errors.WithStack(ErrSwarmLocked) - } - return err -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/convert/container.go b/vendor/github.com/docker/docker/daemon/cluster/convert/container.go deleted file mode 100644 index 10383f749..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/convert/container.go +++ /dev/null @@ -1,235 +0,0 @@ -package convert - -import ( - "fmt" - "strings" - - "github.com/Sirupsen/logrus" - container "github.com/docker/docker/api/types/container" - mounttypes "github.com/docker/docker/api/types/mount" - types "github.com/docker/docker/api/types/swarm" - swarmapi "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/protobuf/ptypes" -) - -func containerSpecFromGRPC(c *swarmapi.ContainerSpec) types.ContainerSpec { - containerSpec := types.ContainerSpec{ - Image: c.Image, - Labels: c.Labels, - Command: c.Command, - Args: c.Args, - Hostname: c.Hostname, - Env: c.Env, - Dir: c.Dir, - User: c.User, - Groups: c.Groups, - TTY: c.TTY, - OpenStdin: c.OpenStdin, - Hosts: c.Hosts, - Secrets: secretReferencesFromGRPC(c.Secrets), - } - - if c.DNSConfig != nil { - containerSpec.DNSConfig = &types.DNSConfig{ - Nameservers: c.DNSConfig.Nameservers, - Search: c.DNSConfig.Search, - Options: c.DNSConfig.Options, - } - } - - // Mounts - for _, m := range c.Mounts { - mount := mounttypes.Mount{ - Target: m.Target, - Source: m.Source, - Type: mounttypes.Type(strings.ToLower(swarmapi.Mount_MountType_name[int32(m.Type)])), - ReadOnly: m.ReadOnly, - } - - if m.BindOptions != nil { - mount.BindOptions = &mounttypes.BindOptions{ - Propagation: mounttypes.Propagation(strings.ToLower(swarmapi.Mount_BindOptions_MountPropagation_name[int32(m.BindOptions.Propagation)])), - } - } - - if m.VolumeOptions != nil { - mount.VolumeOptions = &mounttypes.VolumeOptions{ - NoCopy: m.VolumeOptions.NoCopy, - Labels: m.VolumeOptions.Labels, - } - if m.VolumeOptions.DriverConfig != nil { - mount.VolumeOptions.DriverConfig = &mounttypes.Driver{ - Name: m.VolumeOptions.DriverConfig.Name, - Options: m.VolumeOptions.DriverConfig.Options, - } - } - } - - if m.TmpfsOptions != nil { - mount.TmpfsOptions = &mounttypes.TmpfsOptions{ - SizeBytes: m.TmpfsOptions.SizeBytes, - Mode: m.TmpfsOptions.Mode, - } - } - containerSpec.Mounts = append(containerSpec.Mounts, mount) - } - - if c.StopGracePeriod != nil { - grace, _ := ptypes.Duration(c.StopGracePeriod) - containerSpec.StopGracePeriod = &grace - } - - if c.Healthcheck != nil { - containerSpec.Healthcheck = healthConfigFromGRPC(c.Healthcheck) - } - - return containerSpec -} - -func secretReferencesToGRPC(sr []*types.SecretReference) []*swarmapi.SecretReference { - refs := make([]*swarmapi.SecretReference, 0, len(sr)) - for _, s := range sr { - ref := &swarmapi.SecretReference{ - SecretID: s.SecretID, - SecretName: s.SecretName, - } - if s.File != nil { - ref.Target = &swarmapi.SecretReference_File{ - File: &swarmapi.SecretReference_FileTarget{ - Name: s.File.Name, - UID: s.File.UID, - GID: s.File.GID, - Mode: s.File.Mode, - }, - } - } - - refs = append(refs, ref) - } - - return refs -} -func secretReferencesFromGRPC(sr []*swarmapi.SecretReference) []*types.SecretReference { - refs := make([]*types.SecretReference, 0, len(sr)) - for _, s := range sr { - target := s.GetFile() - if target == nil { - // not a file target - logrus.Warnf("secret target not a file: secret=%s", s.SecretID) - continue - } - refs = append(refs, &types.SecretReference{ - File: &types.SecretReferenceFileTarget{ - Name: target.Name, - UID: target.UID, - GID: target.GID, - Mode: target.Mode, - }, - SecretID: s.SecretID, - SecretName: s.SecretName, - }) - } - - return refs -} - -func containerToGRPC(c types.ContainerSpec) (*swarmapi.ContainerSpec, error) { - containerSpec := &swarmapi.ContainerSpec{ - Image: c.Image, - Labels: c.Labels, - Command: c.Command, - Args: c.Args, - Hostname: c.Hostname, - Env: c.Env, - Dir: c.Dir, - User: c.User, - Groups: c.Groups, - TTY: c.TTY, - OpenStdin: c.OpenStdin, - Hosts: c.Hosts, - Secrets: secretReferencesToGRPC(c.Secrets), - } - - if c.DNSConfig != nil { - containerSpec.DNSConfig = &swarmapi.ContainerSpec_DNSConfig{ - Nameservers: c.DNSConfig.Nameservers, - Search: c.DNSConfig.Search, - Options: c.DNSConfig.Options, - } - } - - if c.StopGracePeriod != nil { - containerSpec.StopGracePeriod = ptypes.DurationProto(*c.StopGracePeriod) - } - - // Mounts - for _, m := range c.Mounts { - mount := swarmapi.Mount{ - Target: m.Target, - Source: m.Source, - ReadOnly: m.ReadOnly, - } - - if mountType, ok := swarmapi.Mount_MountType_value[strings.ToUpper(string(m.Type))]; ok { - mount.Type = swarmapi.Mount_MountType(mountType) - } else if string(m.Type) != "" { - return nil, fmt.Errorf("invalid MountType: %q", m.Type) - } - - if m.BindOptions != nil { - if mountPropagation, ok := swarmapi.Mount_BindOptions_MountPropagation_value[strings.ToUpper(string(m.BindOptions.Propagation))]; ok { - mount.BindOptions = &swarmapi.Mount_BindOptions{Propagation: swarmapi.Mount_BindOptions_MountPropagation(mountPropagation)} - } else if string(m.BindOptions.Propagation) != "" { - return nil, fmt.Errorf("invalid MountPropagation: %q", m.BindOptions.Propagation) - } - } - - if m.VolumeOptions != nil { - mount.VolumeOptions = &swarmapi.Mount_VolumeOptions{ - NoCopy: m.VolumeOptions.NoCopy, - Labels: m.VolumeOptions.Labels, - } - if m.VolumeOptions.DriverConfig != nil { - mount.VolumeOptions.DriverConfig = &swarmapi.Driver{ - Name: m.VolumeOptions.DriverConfig.Name, - Options: m.VolumeOptions.DriverConfig.Options, - } - } - } - - if m.TmpfsOptions != nil { - mount.TmpfsOptions = &swarmapi.Mount_TmpfsOptions{ - SizeBytes: m.TmpfsOptions.SizeBytes, - Mode: m.TmpfsOptions.Mode, - } - } - - containerSpec.Mounts = append(containerSpec.Mounts, mount) - } - - if c.Healthcheck != nil { - containerSpec.Healthcheck = healthConfigToGRPC(c.Healthcheck) - } - - return containerSpec, nil -} - -func healthConfigFromGRPC(h *swarmapi.HealthConfig) *container.HealthConfig { - interval, _ := ptypes.Duration(h.Interval) - timeout, _ := ptypes.Duration(h.Timeout) - return &container.HealthConfig{ - Test: h.Test, - Interval: interval, - Timeout: timeout, - Retries: int(h.Retries), - } -} - -func healthConfigToGRPC(h *container.HealthConfig) *swarmapi.HealthConfig { - return &swarmapi.HealthConfig{ - Test: h.Test, - Interval: ptypes.DurationProto(h.Interval), - Timeout: ptypes.DurationProto(h.Timeout), - Retries: int32(h.Retries), - } -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/convert/network.go b/vendor/github.com/docker/docker/daemon/cluster/convert/network.go deleted file mode 100644 index 4d21b4df0..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/convert/network.go +++ /dev/null @@ -1,210 +0,0 @@ -package convert - -import ( - "strings" - - basictypes "github.com/docker/docker/api/types" - networktypes "github.com/docker/docker/api/types/network" - types "github.com/docker/docker/api/types/swarm" - swarmapi "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/protobuf/ptypes" -) - -func networkAttachementFromGRPC(na *swarmapi.NetworkAttachment) types.NetworkAttachment { - if na != nil { - return types.NetworkAttachment{ - Network: networkFromGRPC(na.Network), - Addresses: na.Addresses, - } - } - return types.NetworkAttachment{} -} - -func networkFromGRPC(n *swarmapi.Network) types.Network { - if n != nil { - network := types.Network{ - ID: n.ID, - Spec: types.NetworkSpec{ - IPv6Enabled: n.Spec.Ipv6Enabled, - Internal: n.Spec.Internal, - Attachable: n.Spec.Attachable, - IPAMOptions: ipamFromGRPC(n.Spec.IPAM), - }, - IPAMOptions: ipamFromGRPC(n.IPAM), - } - - // Meta - network.Version.Index = n.Meta.Version.Index - network.CreatedAt, _ = ptypes.Timestamp(n.Meta.CreatedAt) - network.UpdatedAt, _ = ptypes.Timestamp(n.Meta.UpdatedAt) - - //Annotations - network.Spec.Name = n.Spec.Annotations.Name - network.Spec.Labels = n.Spec.Annotations.Labels - - //DriverConfiguration - if n.Spec.DriverConfig != nil { - network.Spec.DriverConfiguration = &types.Driver{ - Name: n.Spec.DriverConfig.Name, - Options: n.Spec.DriverConfig.Options, - } - } - - //DriverState - if n.DriverState != nil { - network.DriverState = types.Driver{ - Name: n.DriverState.Name, - Options: n.DriverState.Options, - } - } - - return network - } - return types.Network{} -} - -func ipamFromGRPC(i *swarmapi.IPAMOptions) *types.IPAMOptions { - var ipam *types.IPAMOptions - if i != nil { - ipam = &types.IPAMOptions{} - if i.Driver != nil { - ipam.Driver.Name = i.Driver.Name - ipam.Driver.Options = i.Driver.Options - } - - for _, config := range i.Configs { - ipam.Configs = append(ipam.Configs, types.IPAMConfig{ - Subnet: config.Subnet, - Range: config.Range, - Gateway: config.Gateway, - }) - } - } - return ipam -} - -func endpointSpecFromGRPC(es *swarmapi.EndpointSpec) *types.EndpointSpec { - var endpointSpec *types.EndpointSpec - if es != nil { - endpointSpec = &types.EndpointSpec{} - endpointSpec.Mode = types.ResolutionMode(strings.ToLower(es.Mode.String())) - - for _, portState := range es.Ports { - endpointSpec.Ports = append(endpointSpec.Ports, types.PortConfig{ - Name: portState.Name, - Protocol: types.PortConfigProtocol(strings.ToLower(swarmapi.PortConfig_Protocol_name[int32(portState.Protocol)])), - PublishMode: types.PortConfigPublishMode(strings.ToLower(swarmapi.PortConfig_PublishMode_name[int32(portState.PublishMode)])), - TargetPort: portState.TargetPort, - PublishedPort: portState.PublishedPort, - }) - } - } - return endpointSpec -} - -func endpointFromGRPC(e *swarmapi.Endpoint) types.Endpoint { - endpoint := types.Endpoint{} - if e != nil { - if espec := endpointSpecFromGRPC(e.Spec); espec != nil { - endpoint.Spec = *espec - } - - for _, portState := range e.Ports { - endpoint.Ports = append(endpoint.Ports, types.PortConfig{ - Name: portState.Name, - Protocol: types.PortConfigProtocol(strings.ToLower(swarmapi.PortConfig_Protocol_name[int32(portState.Protocol)])), - PublishMode: types.PortConfigPublishMode(strings.ToLower(swarmapi.PortConfig_PublishMode_name[int32(portState.PublishMode)])), - TargetPort: portState.TargetPort, - PublishedPort: portState.PublishedPort, - }) - } - - for _, v := range e.VirtualIPs { - endpoint.VirtualIPs = append(endpoint.VirtualIPs, types.EndpointVirtualIP{ - NetworkID: v.NetworkID, - Addr: v.Addr}) - } - - } - - return endpoint -} - -// BasicNetworkFromGRPC converts a grpc Network to a NetworkResource. -func BasicNetworkFromGRPC(n swarmapi.Network) basictypes.NetworkResource { - spec := n.Spec - var ipam networktypes.IPAM - if spec.IPAM != nil { - if spec.IPAM.Driver != nil { - ipam.Driver = spec.IPAM.Driver.Name - ipam.Options = spec.IPAM.Driver.Options - } - ipam.Config = make([]networktypes.IPAMConfig, 0, len(spec.IPAM.Configs)) - for _, ic := range spec.IPAM.Configs { - ipamConfig := networktypes.IPAMConfig{ - Subnet: ic.Subnet, - IPRange: ic.Range, - Gateway: ic.Gateway, - AuxAddress: ic.Reserved, - } - ipam.Config = append(ipam.Config, ipamConfig) - } - } - - nr := basictypes.NetworkResource{ - ID: n.ID, - Name: n.Spec.Annotations.Name, - Scope: "swarm", - EnableIPv6: spec.Ipv6Enabled, - IPAM: ipam, - Internal: spec.Internal, - Attachable: spec.Attachable, - Labels: n.Spec.Annotations.Labels, - } - - if n.DriverState != nil { - nr.Driver = n.DriverState.Name - nr.Options = n.DriverState.Options - } - - return nr -} - -// BasicNetworkCreateToGRPC converts a NetworkCreateRequest to a grpc NetworkSpec. -func BasicNetworkCreateToGRPC(create basictypes.NetworkCreateRequest) swarmapi.NetworkSpec { - ns := swarmapi.NetworkSpec{ - Annotations: swarmapi.Annotations{ - Name: create.Name, - Labels: create.Labels, - }, - DriverConfig: &swarmapi.Driver{ - Name: create.Driver, - Options: create.Options, - }, - Ipv6Enabled: create.EnableIPv6, - Internal: create.Internal, - Attachable: create.Attachable, - } - if create.IPAM != nil { - driver := create.IPAM.Driver - if driver == "" { - driver = "default" - } - ns.IPAM = &swarmapi.IPAMOptions{ - Driver: &swarmapi.Driver{ - Name: driver, - Options: create.IPAM.Options, - }, - } - ipamSpec := make([]*swarmapi.IPAMConfig, 0, len(create.IPAM.Config)) - for _, ipamConfig := range create.IPAM.Config { - ipamSpec = append(ipamSpec, &swarmapi.IPAMConfig{ - Subnet: ipamConfig.Subnet, - Range: ipamConfig.IPRange, - Gateway: ipamConfig.Gateway, - }) - } - ns.IPAM.Configs = ipamSpec - } - return ns -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/convert/node.go b/vendor/github.com/docker/docker/daemon/cluster/convert/node.go deleted file mode 100644 index 306f34e0b..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/convert/node.go +++ /dev/null @@ -1,89 +0,0 @@ -package convert - -import ( - "fmt" - "strings" - - types "github.com/docker/docker/api/types/swarm" - swarmapi "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/protobuf/ptypes" -) - -// NodeFromGRPC converts a grpc Node to a Node. -func NodeFromGRPC(n swarmapi.Node) types.Node { - node := types.Node{ - ID: n.ID, - Spec: types.NodeSpec{ - Role: types.NodeRole(strings.ToLower(n.Spec.Role.String())), - Availability: types.NodeAvailability(strings.ToLower(n.Spec.Availability.String())), - }, - Status: types.NodeStatus{ - State: types.NodeState(strings.ToLower(n.Status.State.String())), - Message: n.Status.Message, - Addr: n.Status.Addr, - }, - } - - // Meta - node.Version.Index = n.Meta.Version.Index - node.CreatedAt, _ = ptypes.Timestamp(n.Meta.CreatedAt) - node.UpdatedAt, _ = ptypes.Timestamp(n.Meta.UpdatedAt) - - //Annotations - node.Spec.Name = n.Spec.Annotations.Name - node.Spec.Labels = n.Spec.Annotations.Labels - - //Description - if n.Description != nil { - node.Description.Hostname = n.Description.Hostname - if n.Description.Platform != nil { - node.Description.Platform.Architecture = n.Description.Platform.Architecture - node.Description.Platform.OS = n.Description.Platform.OS - } - if n.Description.Resources != nil { - node.Description.Resources.NanoCPUs = n.Description.Resources.NanoCPUs - node.Description.Resources.MemoryBytes = n.Description.Resources.MemoryBytes - } - if n.Description.Engine != nil { - node.Description.Engine.EngineVersion = n.Description.Engine.EngineVersion - node.Description.Engine.Labels = n.Description.Engine.Labels - for _, plugin := range n.Description.Engine.Plugins { - node.Description.Engine.Plugins = append(node.Description.Engine.Plugins, types.PluginDescription{Type: plugin.Type, Name: plugin.Name}) - } - } - } - - //Manager - if n.ManagerStatus != nil { - node.ManagerStatus = &types.ManagerStatus{ - Leader: n.ManagerStatus.Leader, - Reachability: types.Reachability(strings.ToLower(n.ManagerStatus.Reachability.String())), - Addr: n.ManagerStatus.Addr, - } - } - - return node -} - -// NodeSpecToGRPC converts a NodeSpec to a grpc NodeSpec. -func NodeSpecToGRPC(s types.NodeSpec) (swarmapi.NodeSpec, error) { - spec := swarmapi.NodeSpec{ - Annotations: swarmapi.Annotations{ - Name: s.Name, - Labels: s.Labels, - }, - } - if role, ok := swarmapi.NodeRole_value[strings.ToUpper(string(s.Role))]; ok { - spec.Role = swarmapi.NodeRole(role) - } else { - return swarmapi.NodeSpec{}, fmt.Errorf("invalid Role: %q", s.Role) - } - - if availability, ok := swarmapi.NodeSpec_Availability_value[strings.ToUpper(string(s.Availability))]; ok { - spec.Availability = swarmapi.NodeSpec_Availability(availability) - } else { - return swarmapi.NodeSpec{}, fmt.Errorf("invalid Availability: %q", s.Availability) - } - - return spec, nil -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/convert/secret.go b/vendor/github.com/docker/docker/daemon/cluster/convert/secret.go deleted file mode 100644 index 3e966873f..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/convert/secret.go +++ /dev/null @@ -1,64 +0,0 @@ -package convert - -import ( - swarmtypes "github.com/docker/docker/api/types/swarm" - swarmapi "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/protobuf/ptypes" -) - -// SecretFromGRPC converts a grpc Secret to a Secret. -func SecretFromGRPC(s *swarmapi.Secret) swarmtypes.Secret { - secret := swarmtypes.Secret{ - ID: s.ID, - Spec: swarmtypes.SecretSpec{ - Annotations: swarmtypes.Annotations{ - Name: s.Spec.Annotations.Name, - Labels: s.Spec.Annotations.Labels, - }, - Data: s.Spec.Data, - }, - } - - secret.Version.Index = s.Meta.Version.Index - // Meta - secret.CreatedAt, _ = ptypes.Timestamp(s.Meta.CreatedAt) - secret.UpdatedAt, _ = ptypes.Timestamp(s.Meta.UpdatedAt) - - return secret -} - -// SecretSpecToGRPC converts Secret to a grpc Secret. -func SecretSpecToGRPC(s swarmtypes.SecretSpec) swarmapi.SecretSpec { - return swarmapi.SecretSpec{ - Annotations: swarmapi.Annotations{ - Name: s.Name, - Labels: s.Labels, - }, - Data: s.Data, - } -} - -// SecretReferencesFromGRPC converts a slice of grpc SecretReference to SecretReference -func SecretReferencesFromGRPC(s []*swarmapi.SecretReference) []*swarmtypes.SecretReference { - refs := []*swarmtypes.SecretReference{} - - for _, r := range s { - ref := &swarmtypes.SecretReference{ - SecretID: r.SecretID, - SecretName: r.SecretName, - } - - if t, ok := r.Target.(*swarmapi.SecretReference_File); ok { - ref.File = &swarmtypes.SecretReferenceFileTarget{ - Name: t.File.Name, - UID: t.File.UID, - GID: t.File.GID, - Mode: t.File.Mode, - } - } - - refs = append(refs, ref) - } - - return refs -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/convert/service.go b/vendor/github.com/docker/docker/daemon/cluster/convert/service.go deleted file mode 100644 index aa68e01f4..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/convert/service.go +++ /dev/null @@ -1,366 +0,0 @@ -package convert - -import ( - "fmt" - "strings" - - types "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/namesgenerator" - swarmapi "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/protobuf/ptypes" -) - -// ServiceFromGRPC converts a grpc Service to a Service. -func ServiceFromGRPC(s swarmapi.Service) types.Service { - service := types.Service{ - ID: s.ID, - Spec: *serviceSpecFromGRPC(&s.Spec), - PreviousSpec: serviceSpecFromGRPC(s.PreviousSpec), - - Endpoint: endpointFromGRPC(s.Endpoint), - } - - // Meta - service.Version.Index = s.Meta.Version.Index - service.CreatedAt, _ = ptypes.Timestamp(s.Meta.CreatedAt) - service.UpdatedAt, _ = ptypes.Timestamp(s.Meta.UpdatedAt) - - // UpdateStatus - service.UpdateStatus = types.UpdateStatus{} - if s.UpdateStatus != nil { - switch s.UpdateStatus.State { - case swarmapi.UpdateStatus_UPDATING: - service.UpdateStatus.State = types.UpdateStateUpdating - case swarmapi.UpdateStatus_PAUSED: - service.UpdateStatus.State = types.UpdateStatePaused - case swarmapi.UpdateStatus_COMPLETED: - service.UpdateStatus.State = types.UpdateStateCompleted - } - - service.UpdateStatus.StartedAt, _ = ptypes.Timestamp(s.UpdateStatus.StartedAt) - service.UpdateStatus.CompletedAt, _ = ptypes.Timestamp(s.UpdateStatus.CompletedAt) - service.UpdateStatus.Message = s.UpdateStatus.Message - } - - return service -} - -func serviceSpecFromGRPC(spec *swarmapi.ServiceSpec) *types.ServiceSpec { - if spec == nil { - return nil - } - - serviceNetworks := make([]types.NetworkAttachmentConfig, 0, len(spec.Networks)) - for _, n := range spec.Networks { - serviceNetworks = append(serviceNetworks, types.NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases}) - } - - taskNetworks := make([]types.NetworkAttachmentConfig, 0, len(spec.Task.Networks)) - for _, n := range spec.Task.Networks { - taskNetworks = append(taskNetworks, types.NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases}) - } - - containerConfig := spec.Task.Runtime.(*swarmapi.TaskSpec_Container).Container - convertedSpec := &types.ServiceSpec{ - Annotations: types.Annotations{ - Name: spec.Annotations.Name, - Labels: spec.Annotations.Labels, - }, - - TaskTemplate: types.TaskSpec{ - ContainerSpec: containerSpecFromGRPC(containerConfig), - Resources: resourcesFromGRPC(spec.Task.Resources), - RestartPolicy: restartPolicyFromGRPC(spec.Task.Restart), - Placement: placementFromGRPC(spec.Task.Placement), - LogDriver: driverFromGRPC(spec.Task.LogDriver), - Networks: taskNetworks, - ForceUpdate: spec.Task.ForceUpdate, - }, - - Networks: serviceNetworks, - EndpointSpec: endpointSpecFromGRPC(spec.Endpoint), - } - - // UpdateConfig - if spec.Update != nil { - convertedSpec.UpdateConfig = &types.UpdateConfig{ - Parallelism: spec.Update.Parallelism, - MaxFailureRatio: spec.Update.MaxFailureRatio, - } - - convertedSpec.UpdateConfig.Delay, _ = ptypes.Duration(&spec.Update.Delay) - if spec.Update.Monitor != nil { - convertedSpec.UpdateConfig.Monitor, _ = ptypes.Duration(spec.Update.Monitor) - } - - switch spec.Update.FailureAction { - case swarmapi.UpdateConfig_PAUSE: - convertedSpec.UpdateConfig.FailureAction = types.UpdateFailureActionPause - case swarmapi.UpdateConfig_CONTINUE: - convertedSpec.UpdateConfig.FailureAction = types.UpdateFailureActionContinue - } - } - - // Mode - switch t := spec.GetMode().(type) { - case *swarmapi.ServiceSpec_Global: - convertedSpec.Mode.Global = &types.GlobalService{} - case *swarmapi.ServiceSpec_Replicated: - convertedSpec.Mode.Replicated = &types.ReplicatedService{ - Replicas: &t.Replicated.Replicas, - } - } - - return convertedSpec -} - -// ServiceSpecToGRPC converts a ServiceSpec to a grpc ServiceSpec. -func ServiceSpecToGRPC(s types.ServiceSpec) (swarmapi.ServiceSpec, error) { - name := s.Name - if name == "" { - name = namesgenerator.GetRandomName(0) - } - - serviceNetworks := make([]*swarmapi.NetworkAttachmentConfig, 0, len(s.Networks)) - for _, n := range s.Networks { - serviceNetworks = append(serviceNetworks, &swarmapi.NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases}) - } - - taskNetworks := make([]*swarmapi.NetworkAttachmentConfig, 0, len(s.TaskTemplate.Networks)) - for _, n := range s.TaskTemplate.Networks { - taskNetworks = append(taskNetworks, &swarmapi.NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases}) - } - - spec := swarmapi.ServiceSpec{ - Annotations: swarmapi.Annotations{ - Name: name, - Labels: s.Labels, - }, - Task: swarmapi.TaskSpec{ - Resources: resourcesToGRPC(s.TaskTemplate.Resources), - LogDriver: driverToGRPC(s.TaskTemplate.LogDriver), - Networks: taskNetworks, - ForceUpdate: s.TaskTemplate.ForceUpdate, - }, - Networks: serviceNetworks, - } - - containerSpec, err := containerToGRPC(s.TaskTemplate.ContainerSpec) - if err != nil { - return swarmapi.ServiceSpec{}, err - } - spec.Task.Runtime = &swarmapi.TaskSpec_Container{Container: containerSpec} - - restartPolicy, err := restartPolicyToGRPC(s.TaskTemplate.RestartPolicy) - if err != nil { - return swarmapi.ServiceSpec{}, err - } - spec.Task.Restart = restartPolicy - - if s.TaskTemplate.Placement != nil { - spec.Task.Placement = &swarmapi.Placement{ - Constraints: s.TaskTemplate.Placement.Constraints, - } - } - - if s.UpdateConfig != nil { - var failureAction swarmapi.UpdateConfig_FailureAction - switch s.UpdateConfig.FailureAction { - case types.UpdateFailureActionPause, "": - failureAction = swarmapi.UpdateConfig_PAUSE - case types.UpdateFailureActionContinue: - failureAction = swarmapi.UpdateConfig_CONTINUE - default: - return swarmapi.ServiceSpec{}, fmt.Errorf("unrecongized update failure action %s", s.UpdateConfig.FailureAction) - } - spec.Update = &swarmapi.UpdateConfig{ - Parallelism: s.UpdateConfig.Parallelism, - Delay: *ptypes.DurationProto(s.UpdateConfig.Delay), - FailureAction: failureAction, - MaxFailureRatio: s.UpdateConfig.MaxFailureRatio, - } - if s.UpdateConfig.Monitor != 0 { - spec.Update.Monitor = ptypes.DurationProto(s.UpdateConfig.Monitor) - } - } - - if s.EndpointSpec != nil { - if s.EndpointSpec.Mode != "" && - s.EndpointSpec.Mode != types.ResolutionModeVIP && - s.EndpointSpec.Mode != types.ResolutionModeDNSRR { - return swarmapi.ServiceSpec{}, fmt.Errorf("invalid resolution mode: %q", s.EndpointSpec.Mode) - } - - spec.Endpoint = &swarmapi.EndpointSpec{} - - spec.Endpoint.Mode = swarmapi.EndpointSpec_ResolutionMode(swarmapi.EndpointSpec_ResolutionMode_value[strings.ToUpper(string(s.EndpointSpec.Mode))]) - - for _, portConfig := range s.EndpointSpec.Ports { - spec.Endpoint.Ports = append(spec.Endpoint.Ports, &swarmapi.PortConfig{ - Name: portConfig.Name, - Protocol: swarmapi.PortConfig_Protocol(swarmapi.PortConfig_Protocol_value[strings.ToUpper(string(portConfig.Protocol))]), - PublishMode: swarmapi.PortConfig_PublishMode(swarmapi.PortConfig_PublishMode_value[strings.ToUpper(string(portConfig.PublishMode))]), - TargetPort: portConfig.TargetPort, - PublishedPort: portConfig.PublishedPort, - }) - } - } - - // Mode - if s.Mode.Global != nil && s.Mode.Replicated != nil { - return swarmapi.ServiceSpec{}, fmt.Errorf("cannot specify both replicated mode and global mode") - } - - if s.Mode.Global != nil { - spec.Mode = &swarmapi.ServiceSpec_Global{ - Global: &swarmapi.GlobalService{}, - } - } else if s.Mode.Replicated != nil && s.Mode.Replicated.Replicas != nil { - spec.Mode = &swarmapi.ServiceSpec_Replicated{ - Replicated: &swarmapi.ReplicatedService{Replicas: *s.Mode.Replicated.Replicas}, - } - } else { - spec.Mode = &swarmapi.ServiceSpec_Replicated{ - Replicated: &swarmapi.ReplicatedService{Replicas: 1}, - } - } - - return spec, nil -} - -func resourcesFromGRPC(res *swarmapi.ResourceRequirements) *types.ResourceRequirements { - var resources *types.ResourceRequirements - if res != nil { - resources = &types.ResourceRequirements{} - if res.Limits != nil { - resources.Limits = &types.Resources{ - NanoCPUs: res.Limits.NanoCPUs, - MemoryBytes: res.Limits.MemoryBytes, - } - } - if res.Reservations != nil { - resources.Reservations = &types.Resources{ - NanoCPUs: res.Reservations.NanoCPUs, - MemoryBytes: res.Reservations.MemoryBytes, - } - } - } - - return resources -} - -func resourcesToGRPC(res *types.ResourceRequirements) *swarmapi.ResourceRequirements { - var reqs *swarmapi.ResourceRequirements - if res != nil { - reqs = &swarmapi.ResourceRequirements{} - if res.Limits != nil { - reqs.Limits = &swarmapi.Resources{ - NanoCPUs: res.Limits.NanoCPUs, - MemoryBytes: res.Limits.MemoryBytes, - } - } - if res.Reservations != nil { - reqs.Reservations = &swarmapi.Resources{ - NanoCPUs: res.Reservations.NanoCPUs, - MemoryBytes: res.Reservations.MemoryBytes, - } - - } - } - return reqs -} - -func restartPolicyFromGRPC(p *swarmapi.RestartPolicy) *types.RestartPolicy { - var rp *types.RestartPolicy - if p != nil { - rp = &types.RestartPolicy{} - - switch p.Condition { - case swarmapi.RestartOnNone: - rp.Condition = types.RestartPolicyConditionNone - case swarmapi.RestartOnFailure: - rp.Condition = types.RestartPolicyConditionOnFailure - case swarmapi.RestartOnAny: - rp.Condition = types.RestartPolicyConditionAny - default: - rp.Condition = types.RestartPolicyConditionAny - } - - if p.Delay != nil { - delay, _ := ptypes.Duration(p.Delay) - rp.Delay = &delay - } - if p.Window != nil { - window, _ := ptypes.Duration(p.Window) - rp.Window = &window - } - - rp.MaxAttempts = &p.MaxAttempts - } - return rp -} - -func restartPolicyToGRPC(p *types.RestartPolicy) (*swarmapi.RestartPolicy, error) { - var rp *swarmapi.RestartPolicy - if p != nil { - rp = &swarmapi.RestartPolicy{} - - switch p.Condition { - case types.RestartPolicyConditionNone: - rp.Condition = swarmapi.RestartOnNone - case types.RestartPolicyConditionOnFailure: - rp.Condition = swarmapi.RestartOnFailure - case types.RestartPolicyConditionAny: - rp.Condition = swarmapi.RestartOnAny - default: - if string(p.Condition) != "" { - return nil, fmt.Errorf("invalid RestartCondition: %q", p.Condition) - } - rp.Condition = swarmapi.RestartOnAny - } - - if p.Delay != nil { - rp.Delay = ptypes.DurationProto(*p.Delay) - } - if p.Window != nil { - rp.Window = ptypes.DurationProto(*p.Window) - } - if p.MaxAttempts != nil { - rp.MaxAttempts = *p.MaxAttempts - - } - } - return rp, nil -} - -func placementFromGRPC(p *swarmapi.Placement) *types.Placement { - var r *types.Placement - if p != nil { - r = &types.Placement{} - r.Constraints = p.Constraints - } - - return r -} - -func driverFromGRPC(p *swarmapi.Driver) *types.Driver { - if p == nil { - return nil - } - - return &types.Driver{ - Name: p.Name, - Options: p.Options, - } -} - -func driverToGRPC(p *types.Driver) *swarmapi.Driver { - if p == nil { - return nil - } - - return &swarmapi.Driver{ - Name: p.Name, - Options: p.Options, - } -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/convert/swarm.go b/vendor/github.com/docker/docker/daemon/cluster/convert/swarm.go deleted file mode 100644 index 606e00a69..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/convert/swarm.go +++ /dev/null @@ -1,122 +0,0 @@ -package convert - -import ( - "fmt" - "strings" - "time" - - types "github.com/docker/docker/api/types/swarm" - swarmapi "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/protobuf/ptypes" -) - -// SwarmFromGRPC converts a grpc Cluster to a Swarm. -func SwarmFromGRPC(c swarmapi.Cluster) types.Swarm { - swarm := types.Swarm{ - ClusterInfo: types.ClusterInfo{ - ID: c.ID, - Spec: types.Spec{ - Orchestration: types.OrchestrationConfig{ - TaskHistoryRetentionLimit: &c.Spec.Orchestration.TaskHistoryRetentionLimit, - }, - Raft: types.RaftConfig{ - SnapshotInterval: c.Spec.Raft.SnapshotInterval, - KeepOldSnapshots: &c.Spec.Raft.KeepOldSnapshots, - LogEntriesForSlowFollowers: c.Spec.Raft.LogEntriesForSlowFollowers, - HeartbeatTick: int(c.Spec.Raft.HeartbeatTick), - ElectionTick: int(c.Spec.Raft.ElectionTick), - }, - EncryptionConfig: types.EncryptionConfig{ - AutoLockManagers: c.Spec.EncryptionConfig.AutoLockManagers, - }, - }, - }, - JoinTokens: types.JoinTokens{ - Worker: c.RootCA.JoinTokens.Worker, - Manager: c.RootCA.JoinTokens.Manager, - }, - } - - heartbeatPeriod, _ := ptypes.Duration(c.Spec.Dispatcher.HeartbeatPeriod) - swarm.Spec.Dispatcher.HeartbeatPeriod = heartbeatPeriod - - swarm.Spec.CAConfig.NodeCertExpiry, _ = ptypes.Duration(c.Spec.CAConfig.NodeCertExpiry) - - for _, ca := range c.Spec.CAConfig.ExternalCAs { - swarm.Spec.CAConfig.ExternalCAs = append(swarm.Spec.CAConfig.ExternalCAs, &types.ExternalCA{ - Protocol: types.ExternalCAProtocol(strings.ToLower(ca.Protocol.String())), - URL: ca.URL, - Options: ca.Options, - }) - } - - // Meta - swarm.Version.Index = c.Meta.Version.Index - swarm.CreatedAt, _ = ptypes.Timestamp(c.Meta.CreatedAt) - swarm.UpdatedAt, _ = ptypes.Timestamp(c.Meta.UpdatedAt) - - // Annotations - swarm.Spec.Name = c.Spec.Annotations.Name - swarm.Spec.Labels = c.Spec.Annotations.Labels - - return swarm -} - -// SwarmSpecToGRPC converts a Spec to a grpc ClusterSpec. -func SwarmSpecToGRPC(s types.Spec) (swarmapi.ClusterSpec, error) { - return MergeSwarmSpecToGRPC(s, swarmapi.ClusterSpec{}) -} - -// MergeSwarmSpecToGRPC merges a Spec with an initial grpc ClusterSpec -func MergeSwarmSpecToGRPC(s types.Spec, spec swarmapi.ClusterSpec) (swarmapi.ClusterSpec, error) { - // We take the initSpec (either created from scratch, or returned by swarmkit), - // and will only change the value if the one taken from types.Spec is not nil or 0. - // In other words, if the value taken from types.Spec is nil or 0, we will maintain the status quo. - if s.Annotations.Name != "" { - spec.Annotations.Name = s.Annotations.Name - } - if len(s.Annotations.Labels) != 0 { - spec.Annotations.Labels = s.Annotations.Labels - } - - if s.Orchestration.TaskHistoryRetentionLimit != nil { - spec.Orchestration.TaskHistoryRetentionLimit = *s.Orchestration.TaskHistoryRetentionLimit - } - if s.Raft.SnapshotInterval != 0 { - spec.Raft.SnapshotInterval = s.Raft.SnapshotInterval - } - if s.Raft.KeepOldSnapshots != nil { - spec.Raft.KeepOldSnapshots = *s.Raft.KeepOldSnapshots - } - if s.Raft.LogEntriesForSlowFollowers != 0 { - spec.Raft.LogEntriesForSlowFollowers = s.Raft.LogEntriesForSlowFollowers - } - if s.Raft.HeartbeatTick != 0 { - spec.Raft.HeartbeatTick = uint32(s.Raft.HeartbeatTick) - } - if s.Raft.ElectionTick != 0 { - spec.Raft.ElectionTick = uint32(s.Raft.ElectionTick) - } - if s.Dispatcher.HeartbeatPeriod != 0 { - spec.Dispatcher.HeartbeatPeriod = ptypes.DurationProto(time.Duration(s.Dispatcher.HeartbeatPeriod)) - } - if s.CAConfig.NodeCertExpiry != 0 { - spec.CAConfig.NodeCertExpiry = ptypes.DurationProto(s.CAConfig.NodeCertExpiry) - } - - for _, ca := range s.CAConfig.ExternalCAs { - protocol, ok := swarmapi.ExternalCA_CAProtocol_value[strings.ToUpper(string(ca.Protocol))] - if !ok { - return swarmapi.ClusterSpec{}, fmt.Errorf("invalid protocol: %q", ca.Protocol) - } - spec.CAConfig.ExternalCAs = append(spec.CAConfig.ExternalCAs, &swarmapi.ExternalCA{ - Protocol: swarmapi.ExternalCA_CAProtocol(protocol), - URL: ca.URL, - Options: ca.Options, - }) - } - - spec.EncryptionConfig.AutoLockManagers = s.EncryptionConfig.AutoLockManagers - - return spec, nil -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/convert/task.go b/vendor/github.com/docker/docker/daemon/cluster/convert/task.go deleted file mode 100644 index d0cf89c28..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/convert/task.go +++ /dev/null @@ -1,81 +0,0 @@ -package convert - -import ( - "strings" - - types "github.com/docker/docker/api/types/swarm" - swarmapi "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/protobuf/ptypes" -) - -// TaskFromGRPC converts a grpc Task to a Task. -func TaskFromGRPC(t swarmapi.Task) types.Task { - if t.Spec.GetAttachment() != nil { - return types.Task{} - } - containerConfig := t.Spec.Runtime.(*swarmapi.TaskSpec_Container).Container - containerStatus := t.Status.GetContainer() - networks := make([]types.NetworkAttachmentConfig, 0, len(t.Spec.Networks)) - for _, n := range t.Spec.Networks { - networks = append(networks, types.NetworkAttachmentConfig{Target: n.Target, Aliases: n.Aliases}) - } - - task := types.Task{ - ID: t.ID, - Annotations: types.Annotations{ - Name: t.Annotations.Name, - Labels: t.Annotations.Labels, - }, - ServiceID: t.ServiceID, - Slot: int(t.Slot), - NodeID: t.NodeID, - Spec: types.TaskSpec{ - ContainerSpec: containerSpecFromGRPC(containerConfig), - Resources: resourcesFromGRPC(t.Spec.Resources), - RestartPolicy: restartPolicyFromGRPC(t.Spec.Restart), - Placement: placementFromGRPC(t.Spec.Placement), - LogDriver: driverFromGRPC(t.Spec.LogDriver), - Networks: networks, - }, - Status: types.TaskStatus{ - State: types.TaskState(strings.ToLower(t.Status.State.String())), - Message: t.Status.Message, - Err: t.Status.Err, - }, - DesiredState: types.TaskState(strings.ToLower(t.DesiredState.String())), - } - - // Meta - task.Version.Index = t.Meta.Version.Index - task.CreatedAt, _ = ptypes.Timestamp(t.Meta.CreatedAt) - task.UpdatedAt, _ = ptypes.Timestamp(t.Meta.UpdatedAt) - - task.Status.Timestamp, _ = ptypes.Timestamp(t.Status.Timestamp) - - if containerStatus != nil { - task.Status.ContainerStatus.ContainerID = containerStatus.ContainerID - task.Status.ContainerStatus.PID = int(containerStatus.PID) - task.Status.ContainerStatus.ExitCode = int(containerStatus.ExitCode) - } - - // NetworksAttachments - for _, na := range t.Networks { - task.NetworksAttachments = append(task.NetworksAttachments, networkAttachementFromGRPC(na)) - } - - if t.Status.PortStatus == nil { - return task - } - - for _, p := range t.Status.PortStatus.Ports { - task.Status.PortStatus.Ports = append(task.Status.PortStatus.Ports, types.PortConfig{ - Name: p.Name, - Protocol: types.PortConfigProtocol(strings.ToLower(swarmapi.PortConfig_Protocol_name[int32(p.Protocol)])), - PublishMode: types.PortConfigPublishMode(strings.ToLower(swarmapi.PortConfig_PublishMode_name[int32(p.PublishMode)])), - TargetPort: p.TargetPort, - PublishedPort: p.PublishedPort, - }) - } - - return task -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/backend.go b/vendor/github.com/docker/docker/daemon/cluster/executor/backend.go deleted file mode 100644 index 0f1da3855..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/backend.go +++ /dev/null @@ -1,61 +0,0 @@ -package executor - -import ( - "io" - "time" - - "github.com/docker/distribution" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "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" - swarmtypes "github.com/docker/docker/api/types/swarm" - clustertypes "github.com/docker/docker/daemon/cluster/provider" - "github.com/docker/docker/plugin" - "github.com/docker/docker/reference" - "github.com/docker/libnetwork" - "github.com/docker/libnetwork/cluster" - networktypes "github.com/docker/libnetwork/types" - "github.com/docker/swarmkit/agent/exec" - "golang.org/x/net/context" -) - -// Backend defines the executor component for a swarm agent. -type Backend interface { - CreateManagedNetwork(clustertypes.NetworkCreateRequest) error - DeleteManagedNetwork(name string) error - FindNetwork(idName string) (libnetwork.Network, error) - SetupIngress(req clustertypes.NetworkCreateRequest, nodeIP string) error - PullImage(ctx context.Context, image, tag string, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error - CreateManagedContainer(config types.ContainerCreateConfig) (container.ContainerCreateCreatedBody, error) - ContainerStart(name string, hostConfig *container.HostConfig, checkpoint string, checkpointDir string) error - ContainerStop(name string, seconds *int) error - ContainerLogs(context.Context, string, *backend.ContainerLogsConfig, chan struct{}) error - ConnectContainerToNetwork(containerName, networkName string, endpointConfig *network.EndpointSettings) error - ActivateContainerServiceBinding(containerName string) error - DeactivateContainerServiceBinding(containerName string) error - UpdateContainerServiceConfig(containerName string, serviceConfig *clustertypes.ServiceConfig) error - ContainerInspectCurrent(name string, size bool) (*types.ContainerJSON, error) - ContainerWaitWithContext(ctx context.Context, name string) error - ContainerRm(name string, config *types.ContainerRmConfig) error - ContainerKill(name string, sig uint64) error - SetContainerSecretStore(name string, store exec.SecretGetter) error - SetContainerSecretReferences(name string, refs []*swarmtypes.SecretReference) error - SystemInfo() (*types.Info, error) - VolumeCreate(name, driverName string, opts, labels map[string]string) (*types.Volume, error) - Containers(config *types.ContainerListOptions) ([]*types.Container, error) - SetNetworkBootstrapKeys([]*networktypes.EncryptionKey) error - DaemonJoinsCluster(provider cluster.Provider) - DaemonLeavesCluster() - IsSwarmCompatible() error - SubscribeToEvents(since, until time.Time, filter filters.Args) ([]events.Message, chan interface{}) - UnsubscribeFromEvents(listener chan interface{}) - UpdateAttachment(string, string, string, *network.NetworkingConfig) error - WaitForDetachment(context.Context, string, string, string, string) error - GetRepository(context.Context, reference.NamedTagged, *types.AuthConfig) (distribution.Repository, bool, error) - LookupImage(name string) (*types.ImageInspect, error) - PluginManager() *plugin.Manager - PluginGetter() *plugin.Store -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/adapter.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/adapter.go deleted file mode 100644 index f82f8b54d..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/adapter.go +++ /dev/null @@ -1,463 +0,0 @@ -package container - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "io" - "os" - "strings" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/events" - "github.com/docker/docker/daemon/cluster/convert" - executorpkg "github.com/docker/docker/daemon/cluster/executor" - "github.com/docker/docker/reference" - "github.com/docker/libnetwork" - "github.com/docker/swarmkit/agent/exec" - "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/log" - "github.com/docker/swarmkit/protobuf/ptypes" - "golang.org/x/net/context" - "golang.org/x/time/rate" -) - -// containerAdapter conducts remote operations for a container. All calls -// are mostly naked calls to the client API, seeded with information from -// containerConfig. -type containerAdapter struct { - backend executorpkg.Backend - container *containerConfig - secrets exec.SecretGetter -} - -func newContainerAdapter(b executorpkg.Backend, task *api.Task, secrets exec.SecretGetter) (*containerAdapter, error) { - ctnr, err := newContainerConfig(task) - if err != nil { - return nil, err - } - - return &containerAdapter{ - container: ctnr, - backend: b, - secrets: secrets, - }, nil -} - -func (c *containerAdapter) pullImage(ctx context.Context) error { - spec := c.container.spec() - - // Skip pulling if the image is referenced by image ID. - if _, err := digest.ParseDigest(spec.Image); err == nil { - return nil - } - - // Skip pulling if the image is referenced by digest and already - // exists locally. - named, err := reference.ParseNamed(spec.Image) - if err == nil { - if _, ok := named.(reference.Canonical); ok { - _, err := c.backend.LookupImage(spec.Image) - if err == nil { - return nil - } - } - } - - // if the image needs to be pulled, the auth config will be retrieved and updated - var encodedAuthConfig string - if spec.PullOptions != nil { - encodedAuthConfig = spec.PullOptions.RegistryAuth - } - - authConfig := &types.AuthConfig{} - if encodedAuthConfig != "" { - if err := json.NewDecoder(base64.NewDecoder(base64.URLEncoding, strings.NewReader(encodedAuthConfig))).Decode(authConfig); err != nil { - logrus.Warnf("invalid authconfig: %v", err) - } - } - - pr, pw := io.Pipe() - metaHeaders := map[string][]string{} - go func() { - err := c.backend.PullImage(ctx, c.container.image(), "", metaHeaders, authConfig, pw) - pw.CloseWithError(err) - }() - - dec := json.NewDecoder(pr) - dec.UseNumber() - m := map[string]interface{}{} - spamLimiter := rate.NewLimiter(rate.Every(time.Second), 1) - - lastStatus := "" - for { - if err := dec.Decode(&m); err != nil { - if err == io.EOF { - break - } - return err - } - l := log.G(ctx) - // limit pull progress logs unless the status changes - if spamLimiter.Allow() || lastStatus != m["status"] { - // if we have progress details, we have everything we need - if progress, ok := m["progressDetail"].(map[string]interface{}); ok { - // first, log the image and status - l = l.WithFields(logrus.Fields{ - "image": c.container.image(), - "status": m["status"], - }) - // then, if we have progress, log the progress - if progress["current"] != nil && progress["total"] != nil { - l = l.WithFields(logrus.Fields{ - "current": progress["current"], - "total": progress["total"], - }) - } - } - l.Debug("pull in progress") - } - // sometimes, we get no useful information at all, and add no fields - if status, ok := m["status"].(string); ok { - lastStatus = status - } - } - - // if the final stream object contained an error, return it - if errMsg, ok := m["error"]; ok { - return fmt.Errorf("%v", errMsg) - } - return nil -} - -func (c *containerAdapter) createNetworks(ctx context.Context) error { - for _, network := range c.container.networks() { - ncr, err := c.container.networkCreateRequest(network) - if err != nil { - return err - } - - if err := c.backend.CreateManagedNetwork(ncr); err != nil { // todo name missing - if _, ok := err.(libnetwork.NetworkNameError); ok { - continue - } - - return err - } - } - - return nil -} - -func (c *containerAdapter) removeNetworks(ctx context.Context) error { - for _, nid := range c.container.networks() { - if err := c.backend.DeleteManagedNetwork(nid); err != nil { - switch err.(type) { - case *libnetwork.ActiveEndpointsError: - continue - case libnetwork.ErrNoSuchNetwork: - continue - default: - log.G(ctx).Errorf("network %s remove failed: %v", nid, err) - return err - } - } - } - - return nil -} - -func (c *containerAdapter) networkAttach(ctx context.Context) error { - config := c.container.createNetworkingConfig() - - var ( - networkName string - networkID string - ) - - if config != nil { - for n, epConfig := range config.EndpointsConfig { - networkName = n - networkID = epConfig.NetworkID - break - } - } - - return c.backend.UpdateAttachment(networkName, networkID, c.container.id(), config) -} - -func (c *containerAdapter) waitForDetach(ctx context.Context) error { - config := c.container.createNetworkingConfig() - - var ( - networkName string - networkID string - ) - - if config != nil { - for n, epConfig := range config.EndpointsConfig { - networkName = n - networkID = epConfig.NetworkID - break - } - } - - return c.backend.WaitForDetachment(ctx, networkName, networkID, c.container.taskID(), c.container.id()) -} - -func (c *containerAdapter) create(ctx context.Context) error { - var cr containertypes.ContainerCreateCreatedBody - var err error - - if cr, err = c.backend.CreateManagedContainer(types.ContainerCreateConfig{ - Name: c.container.name(), - Config: c.container.config(), - HostConfig: c.container.hostConfig(), - // Use the first network in container create - NetworkingConfig: c.container.createNetworkingConfig(), - }); err != nil { - return err - } - - // Docker daemon currently doesn't support multiple networks in container create - // Connect to all other networks - nc := c.container.connectNetworkingConfig() - - if nc != nil { - for n, ep := range nc.EndpointsConfig { - if err := c.backend.ConnectContainerToNetwork(cr.ID, n, ep); err != nil { - return err - } - } - } - - container := c.container.task.Spec.GetContainer() - if container == nil { - return fmt.Errorf("unable to get container from task spec") - } - - // configure secrets - if err := c.backend.SetContainerSecretStore(cr.ID, c.secrets); err != nil { - return err - } - - refs := convert.SecretReferencesFromGRPC(container.Secrets) - if err := c.backend.SetContainerSecretReferences(cr.ID, refs); err != nil { - return err - } - - if err := c.backend.UpdateContainerServiceConfig(cr.ID, c.container.serviceConfig()); err != nil { - return err - } - - return nil -} - -// checkMounts ensures that the provided mounts won't have any host-specific -// problems at start up. For example, we disallow bind mounts without an -// existing path, which slightly different from the container API. -func (c *containerAdapter) checkMounts() error { - spec := c.container.spec() - for _, mount := range spec.Mounts { - switch mount.Type { - case api.MountTypeBind: - if _, err := os.Stat(mount.Source); os.IsNotExist(err) { - return fmt.Errorf("invalid bind mount source, source path not found: %s", mount.Source) - } - } - } - - return nil -} - -func (c *containerAdapter) start(ctx context.Context) error { - if err := c.checkMounts(); err != nil { - return err - } - - return c.backend.ContainerStart(c.container.name(), nil, "", "") -} - -func (c *containerAdapter) inspect(ctx context.Context) (types.ContainerJSON, error) { - cs, err := c.backend.ContainerInspectCurrent(c.container.name(), false) - if ctx.Err() != nil { - return types.ContainerJSON{}, ctx.Err() - } - if err != nil { - return types.ContainerJSON{}, err - } - return *cs, nil -} - -// events issues a call to the events API and returns a channel with all -// events. The stream of events can be shutdown by cancelling the context. -func (c *containerAdapter) events(ctx context.Context) <-chan events.Message { - log.G(ctx).Debugf("waiting on events") - buffer, l := c.backend.SubscribeToEvents(time.Time{}, time.Time{}, c.container.eventFilter()) - eventsq := make(chan events.Message, len(buffer)) - - for _, event := range buffer { - eventsq <- event - } - - go func() { - defer c.backend.UnsubscribeFromEvents(l) - - for { - select { - case ev := <-l: - jev, ok := ev.(events.Message) - if !ok { - log.G(ctx).Warnf("unexpected event message: %q", ev) - continue - } - select { - case eventsq <- jev: - case <-ctx.Done(): - return - } - case <-ctx.Done(): - return - } - } - }() - - return eventsq -} - -func (c *containerAdapter) wait(ctx context.Context) error { - return c.backend.ContainerWaitWithContext(ctx, c.container.nameOrID()) -} - -func (c *containerAdapter) shutdown(ctx context.Context) error { - // Default stop grace period to nil (daemon will use the stopTimeout of the container) - var stopgrace *int - spec := c.container.spec() - if spec.StopGracePeriod != nil { - stopgraceValue := int(spec.StopGracePeriod.Seconds) - stopgrace = &stopgraceValue - } - return c.backend.ContainerStop(c.container.name(), stopgrace) -} - -func (c *containerAdapter) terminate(ctx context.Context) error { - return c.backend.ContainerKill(c.container.name(), uint64(syscall.SIGKILL)) -} - -func (c *containerAdapter) remove(ctx context.Context) error { - return c.backend.ContainerRm(c.container.name(), &types.ContainerRmConfig{ - RemoveVolume: true, - ForceRemove: true, - }) -} - -func (c *containerAdapter) createVolumes(ctx context.Context) error { - // Create plugin volumes that are embedded inside a Mount - for _, mount := range c.container.task.Spec.GetContainer().Mounts { - if mount.Type != api.MountTypeVolume { - continue - } - - if mount.VolumeOptions == nil { - continue - } - - if mount.VolumeOptions.DriverConfig == nil { - continue - } - - req := c.container.volumeCreateRequest(&mount) - - // Check if this volume exists on the engine - if _, err := c.backend.VolumeCreate(req.Name, req.Driver, req.DriverOpts, req.Labels); err != nil { - // TODO(amitshukla): Today, volume create through the engine api does not return an error - // when the named volume with the same parameters already exists. - // It returns an error if the driver name is different - that is a valid error - return err - } - - } - - return nil -} - -func (c *containerAdapter) activateServiceBinding() error { - return c.backend.ActivateContainerServiceBinding(c.container.name()) -} - -func (c *containerAdapter) deactivateServiceBinding() error { - return c.backend.DeactivateContainerServiceBinding(c.container.name()) -} - -func (c *containerAdapter) logs(ctx context.Context, options api.LogSubscriptionOptions) (io.ReadCloser, error) { - reader, writer := io.Pipe() - - apiOptions := &backend.ContainerLogsConfig{ - ContainerLogsOptions: types.ContainerLogsOptions{ - Follow: options.Follow, - - // TODO(stevvooe): Parse timestamp out of message. This - // absolutely needs to be done before going to production with - // this, at it is completely redundant. - Timestamps: true, - Details: false, // no clue what to do with this, let's just deprecate it. - }, - OutStream: writer, - } - - if options.Since != nil { - since, err := ptypes.Timestamp(options.Since) - if err != nil { - return nil, err - } - apiOptions.Since = since.Format(time.RFC3339Nano) - } - - if options.Tail < 0 { - // See protobuf documentation for details of how this works. - apiOptions.Tail = fmt.Sprint(-options.Tail - 1) - } else if options.Tail > 0 { - return nil, fmt.Errorf("tail relative to start of logs not supported via docker API") - } - - if len(options.Streams) == 0 { - // empty == all - apiOptions.ShowStdout, apiOptions.ShowStderr = true, true - } else { - for _, stream := range options.Streams { - switch stream { - case api.LogStreamStdout: - apiOptions.ShowStdout = true - case api.LogStreamStderr: - apiOptions.ShowStderr = true - } - } - } - - chStarted := make(chan struct{}) - go func() { - defer writer.Close() - c.backend.ContainerLogs(ctx, c.container.name(), apiOptions, chStarted) - }() - - return reader, nil -} - -// todo: typed/wrapped errors -func isContainerCreateNameConflict(err error) bool { - return strings.Contains(err.Error(), "Conflict. The name") -} - -func isUnknownContainer(err error) bool { - return strings.Contains(err.Error(), "No such container:") -} - -func isStoppedContainer(err error) bool { - return strings.Contains(err.Error(), "is already stopped") -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/attachment.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/attachment.go deleted file mode 100644 index e0ee81a8b..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/attachment.go +++ /dev/null @@ -1,81 +0,0 @@ -package container - -import ( - executorpkg "github.com/docker/docker/daemon/cluster/executor" - "github.com/docker/swarmkit/agent/exec" - "github.com/docker/swarmkit/api" - "golang.org/x/net/context" -) - -// networkAttacherController implements agent.Controller against docker's API. -// -// networkAttacherController manages the lifecycle of network -// attachment of a docker unmanaged container managed as a task from -// agent point of view. It provides network attachment information to -// the unmanaged container for it to attach to the network and run. -type networkAttacherController struct { - backend executorpkg.Backend - task *api.Task - adapter *containerAdapter - closed chan struct{} -} - -func newNetworkAttacherController(b executorpkg.Backend, task *api.Task, secrets exec.SecretGetter) (*networkAttacherController, error) { - adapter, err := newContainerAdapter(b, task, secrets) - if err != nil { - return nil, err - } - - return &networkAttacherController{ - backend: b, - task: task, - adapter: adapter, - closed: make(chan struct{}), - }, nil -} - -func (nc *networkAttacherController) Update(ctx context.Context, t *api.Task) error { - return nil -} - -func (nc *networkAttacherController) Prepare(ctx context.Context) error { - // Make sure all the networks that the task needs are created. - if err := nc.adapter.createNetworks(ctx); err != nil { - return err - } - - return nil -} - -func (nc *networkAttacherController) Start(ctx context.Context) error { - return nc.adapter.networkAttach(ctx) -} - -func (nc *networkAttacherController) Wait(pctx context.Context) error { - ctx, cancel := context.WithCancel(pctx) - defer cancel() - - return nc.adapter.waitForDetach(ctx) -} - -func (nc *networkAttacherController) Shutdown(ctx context.Context) error { - return nil -} - -func (nc *networkAttacherController) Terminate(ctx context.Context) error { - return nil -} - -func (nc *networkAttacherController) Remove(ctx context.Context) error { - // Try removing the network referenced in this task in case this - // task is the last one referencing it - if err := nc.adapter.removeNetworks(ctx); err != nil { - return err - } - - return nil -} - -func (nc *networkAttacherController) Close() error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/container.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/container.go deleted file mode 100644 index f033ad545..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/container.go +++ /dev/null @@ -1,598 +0,0 @@ -package container - -import ( - "errors" - "fmt" - "net" - "strconv" - "strings" - "time" - - "github.com/Sirupsen/logrus" - - "github.com/docker/docker/api/types" - enginecontainer "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/events" - "github.com/docker/docker/api/types/filters" - enginemount "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/api/types/network" - volumetypes "github.com/docker/docker/api/types/volume" - clustertypes "github.com/docker/docker/daemon/cluster/provider" - "github.com/docker/docker/reference" - "github.com/docker/go-connections/nat" - "github.com/docker/swarmkit/agent/exec" - "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/protobuf/ptypes" - "github.com/docker/swarmkit/template" -) - -const ( - // Explicitly use the kernel's default setting for CPU quota of 100ms. - // https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt - cpuQuotaPeriod = 100 * time.Millisecond - - // systemLabelPrefix represents the reserved namespace for system labels. - systemLabelPrefix = "com.docker.swarm" -) - -// containerConfig converts task properties into docker container compatible -// components. -type containerConfig struct { - task *api.Task - networksAttachments map[string]*api.NetworkAttachment -} - -// newContainerConfig returns a validated container config. No methods should -// return an error if this function returns without error. -func newContainerConfig(t *api.Task) (*containerConfig, error) { - var c containerConfig - return &c, c.setTask(t) -} - -func (c *containerConfig) setTask(t *api.Task) error { - if t.Spec.GetContainer() == nil && t.Spec.GetAttachment() == nil { - return exec.ErrRuntimeUnsupported - } - - container := t.Spec.GetContainer() - if container != nil { - if container.Image == "" { - return ErrImageRequired - } - - if err := validateMounts(container.Mounts); err != nil { - return err - } - } - - // index the networks by name - c.networksAttachments = make(map[string]*api.NetworkAttachment, len(t.Networks)) - for _, attachment := range t.Networks { - c.networksAttachments[attachment.Network.Spec.Annotations.Name] = attachment - } - - c.task = t - - if t.Spec.GetContainer() != nil { - preparedSpec, err := template.ExpandContainerSpec(t) - if err != nil { - return err - } - c.task.Spec.Runtime = &api.TaskSpec_Container{ - Container: preparedSpec, - } - } - - return nil -} - -func (c *containerConfig) id() string { - attachment := c.task.Spec.GetAttachment() - if attachment == nil { - return "" - } - - return attachment.ContainerID -} - -func (c *containerConfig) taskID() string { - return c.task.ID -} - -func (c *containerConfig) endpoint() *api.Endpoint { - return c.task.Endpoint -} - -func (c *containerConfig) spec() *api.ContainerSpec { - return c.task.Spec.GetContainer() -} - -func (c *containerConfig) nameOrID() string { - if c.task.Spec.GetContainer() != nil { - return c.name() - } - - return c.id() -} - -func (c *containerConfig) name() string { - if c.task.Annotations.Name != "" { - // if set, use the container Annotations.Name field, set in the orchestrator. - return c.task.Annotations.Name - } - - slot := fmt.Sprint(c.task.Slot) - if slot == "" || c.task.Slot == 0 { - slot = c.task.NodeID - } - - // fallback to service.slot.id. - return fmt.Sprintf("%s.%s.%s", c.task.ServiceAnnotations.Name, slot, c.task.ID) -} - -func (c *containerConfig) image() string { - raw := c.spec().Image - ref, err := reference.ParseNamed(raw) - if err != nil { - return raw - } - return reference.WithDefaultTag(ref).String() -} - -func (c *containerConfig) portBindings() nat.PortMap { - portBindings := nat.PortMap{} - if c.task.Endpoint == nil { - return portBindings - } - - for _, portConfig := range c.task.Endpoint.Ports { - if portConfig.PublishMode != api.PublishModeHost { - continue - } - - port := nat.Port(fmt.Sprintf("%d/%s", portConfig.TargetPort, strings.ToLower(portConfig.Protocol.String()))) - binding := []nat.PortBinding{ - {}, - } - - if portConfig.PublishedPort != 0 { - binding[0].HostPort = strconv.Itoa(int(portConfig.PublishedPort)) - } - portBindings[port] = binding - } - - return portBindings -} - -func (c *containerConfig) exposedPorts() map[nat.Port]struct{} { - exposedPorts := make(map[nat.Port]struct{}) - if c.task.Endpoint == nil { - return exposedPorts - } - - for _, portConfig := range c.task.Endpoint.Ports { - if portConfig.PublishMode != api.PublishModeHost { - continue - } - - port := nat.Port(fmt.Sprintf("%d/%s", portConfig.TargetPort, strings.ToLower(portConfig.Protocol.String()))) - exposedPorts[port] = struct{}{} - } - - return exposedPorts -} - -func (c *containerConfig) config() *enginecontainer.Config { - config := &enginecontainer.Config{ - Labels: c.labels(), - Tty: c.spec().TTY, - OpenStdin: c.spec().OpenStdin, - User: c.spec().User, - Env: c.spec().Env, - Hostname: c.spec().Hostname, - WorkingDir: c.spec().Dir, - Image: c.image(), - ExposedPorts: c.exposedPorts(), - Healthcheck: c.healthcheck(), - } - - if len(c.spec().Command) > 0 { - // If Command is provided, we replace the whole invocation with Command - // by replacing Entrypoint and specifying Cmd. Args is ignored in this - // case. - config.Entrypoint = append(config.Entrypoint, c.spec().Command...) - config.Cmd = append(config.Cmd, c.spec().Args...) - } else if len(c.spec().Args) > 0 { - // In this case, we assume the image has an Entrypoint and Args - // specifies the arguments for that entrypoint. - config.Cmd = c.spec().Args - } - - return config -} - -func (c *containerConfig) labels() map[string]string { - var ( - system = map[string]string{ - "task": "", // mark as cluster task - "task.id": c.task.ID, - "task.name": c.name(), - "node.id": c.task.NodeID, - "service.id": c.task.ServiceID, - "service.name": c.task.ServiceAnnotations.Name, - } - labels = make(map[string]string) - ) - - // base labels are those defined in the spec. - for k, v := range c.spec().Labels { - labels[k] = v - } - - // we then apply the overrides from the task, which may be set via the - // orchestrator. - for k, v := range c.task.Annotations.Labels { - labels[k] = v - } - - // finally, we apply the system labels, which override all labels. - for k, v := range system { - labels[strings.Join([]string{systemLabelPrefix, k}, ".")] = v - } - - return labels -} - -func (c *containerConfig) mounts() []enginemount.Mount { - var r []enginemount.Mount - for _, mount := range c.spec().Mounts { - r = append(r, convertMount(mount)) - } - return r -} - -func convertMount(m api.Mount) enginemount.Mount { - mount := enginemount.Mount{ - Source: m.Source, - Target: m.Target, - ReadOnly: m.ReadOnly, - } - - switch m.Type { - case api.MountTypeBind: - mount.Type = enginemount.TypeBind - case api.MountTypeVolume: - mount.Type = enginemount.TypeVolume - case api.MountTypeTmpfs: - mount.Type = enginemount.TypeTmpfs - } - - if m.BindOptions != nil { - mount.BindOptions = &enginemount.BindOptions{} - switch m.BindOptions.Propagation { - case api.MountPropagationRPrivate: - mount.BindOptions.Propagation = enginemount.PropagationRPrivate - case api.MountPropagationPrivate: - mount.BindOptions.Propagation = enginemount.PropagationPrivate - case api.MountPropagationRSlave: - mount.BindOptions.Propagation = enginemount.PropagationRSlave - case api.MountPropagationSlave: - mount.BindOptions.Propagation = enginemount.PropagationSlave - case api.MountPropagationRShared: - mount.BindOptions.Propagation = enginemount.PropagationRShared - case api.MountPropagationShared: - mount.BindOptions.Propagation = enginemount.PropagationShared - } - } - - if m.VolumeOptions != nil { - mount.VolumeOptions = &enginemount.VolumeOptions{ - NoCopy: m.VolumeOptions.NoCopy, - } - if m.VolumeOptions.Labels != nil { - mount.VolumeOptions.Labels = make(map[string]string, len(m.VolumeOptions.Labels)) - for k, v := range m.VolumeOptions.Labels { - mount.VolumeOptions.Labels[k] = v - } - } - if m.VolumeOptions.DriverConfig != nil { - mount.VolumeOptions.DriverConfig = &enginemount.Driver{ - Name: m.VolumeOptions.DriverConfig.Name, - } - if m.VolumeOptions.DriverConfig.Options != nil { - mount.VolumeOptions.DriverConfig.Options = make(map[string]string, len(m.VolumeOptions.DriverConfig.Options)) - for k, v := range m.VolumeOptions.DriverConfig.Options { - mount.VolumeOptions.DriverConfig.Options[k] = v - } - } - } - } - - if m.TmpfsOptions != nil { - mount.TmpfsOptions = &enginemount.TmpfsOptions{ - SizeBytes: m.TmpfsOptions.SizeBytes, - Mode: m.TmpfsOptions.Mode, - } - } - - return mount -} - -func (c *containerConfig) healthcheck() *enginecontainer.HealthConfig { - hcSpec := c.spec().Healthcheck - if hcSpec == nil { - return nil - } - interval, _ := ptypes.Duration(hcSpec.Interval) - timeout, _ := ptypes.Duration(hcSpec.Timeout) - return &enginecontainer.HealthConfig{ - Test: hcSpec.Test, - Interval: interval, - Timeout: timeout, - Retries: int(hcSpec.Retries), - } -} - -func (c *containerConfig) hostConfig() *enginecontainer.HostConfig { - hc := &enginecontainer.HostConfig{ - Resources: c.resources(), - GroupAdd: c.spec().Groups, - PortBindings: c.portBindings(), - Mounts: c.mounts(), - } - - if c.spec().DNSConfig != nil { - hc.DNS = c.spec().DNSConfig.Nameservers - hc.DNSSearch = c.spec().DNSConfig.Search - hc.DNSOptions = c.spec().DNSConfig.Options - } - - // 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...] - // However, the format of ExtraHosts in HostConfig is - // : - // We need to do the conversion here - // (Alias is ignored for now) - for _, entry := range c.spec().Hosts { - parts := strings.Fields(entry) - if len(parts) > 1 { - hc.ExtraHosts = append(hc.ExtraHosts, fmt.Sprintf("%s:%s", parts[1], parts[0])) - } - } - - if c.task.LogDriver != nil { - hc.LogConfig = enginecontainer.LogConfig{ - Type: c.task.LogDriver.Name, - Config: c.task.LogDriver.Options, - } - } - - return hc -} - -// This handles the case of volumes that are defined inside a service Mount -func (c *containerConfig) volumeCreateRequest(mount *api.Mount) *volumetypes.VolumesCreateBody { - var ( - driverName string - driverOpts map[string]string - labels map[string]string - ) - - if mount.VolumeOptions != nil && mount.VolumeOptions.DriverConfig != nil { - driverName = mount.VolumeOptions.DriverConfig.Name - driverOpts = mount.VolumeOptions.DriverConfig.Options - labels = mount.VolumeOptions.Labels - } - - if mount.VolumeOptions != nil { - return &volumetypes.VolumesCreateBody{ - Name: mount.Source, - Driver: driverName, - DriverOpts: driverOpts, - Labels: labels, - } - } - return nil -} - -func (c *containerConfig) resources() enginecontainer.Resources { - resources := enginecontainer.Resources{} - - // If no limits are specified let the engine use its defaults. - // - // TODO(aluzzardi): We might want to set some limits anyway otherwise - // "unlimited" tasks will step over the reservation of other tasks. - r := c.task.Spec.Resources - if r == nil || r.Limits == nil { - return resources - } - - if r.Limits.MemoryBytes > 0 { - resources.Memory = r.Limits.MemoryBytes - } - - if r.Limits.NanoCPUs > 0 { - // CPU Period must be set in microseconds. - resources.CPUPeriod = int64(cpuQuotaPeriod / time.Microsecond) - resources.CPUQuota = r.Limits.NanoCPUs * resources.CPUPeriod / 1e9 - } - - return resources -} - -// Docker daemon supports just 1 network during container create. -func (c *containerConfig) createNetworkingConfig() *network.NetworkingConfig { - var networks []*api.NetworkAttachment - if c.task.Spec.GetContainer() != nil || c.task.Spec.GetAttachment() != nil { - networks = c.task.Networks - } - - epConfig := make(map[string]*network.EndpointSettings) - if len(networks) > 0 { - epConfig[networks[0].Network.Spec.Annotations.Name] = getEndpointConfig(networks[0]) - } - - return &network.NetworkingConfig{EndpointsConfig: epConfig} -} - -// TODO: Merge this function with createNetworkingConfig after daemon supports multiple networks in container create -func (c *containerConfig) connectNetworkingConfig() *network.NetworkingConfig { - var networks []*api.NetworkAttachment - if c.task.Spec.GetContainer() != nil { - networks = c.task.Networks - } - - // First network is used during container create. Other networks are used in "docker network connect" - if len(networks) < 2 { - return nil - } - - epConfig := make(map[string]*network.EndpointSettings) - for _, na := range networks[1:] { - epConfig[na.Network.Spec.Annotations.Name] = getEndpointConfig(na) - } - return &network.NetworkingConfig{EndpointsConfig: epConfig} -} - -func getEndpointConfig(na *api.NetworkAttachment) *network.EndpointSettings { - var ipv4, ipv6 string - for _, addr := range na.Addresses { - ip, _, err := net.ParseCIDR(addr) - if err != nil { - continue - } - - if ip.To4() != nil { - ipv4 = ip.String() - continue - } - - if ip.To16() != nil { - ipv6 = ip.String() - } - } - - return &network.EndpointSettings{ - NetworkID: na.Network.ID, - IPAMConfig: &network.EndpointIPAMConfig{ - IPv4Address: ipv4, - IPv6Address: ipv6, - }, - } -} - -func (c *containerConfig) virtualIP(networkID string) string { - if c.task.Endpoint == nil { - return "" - } - - for _, eVip := range c.task.Endpoint.VirtualIPs { - // We only support IPv4 VIPs for now. - if eVip.NetworkID == networkID { - vip, _, err := net.ParseCIDR(eVip.Addr) - if err != nil { - return "" - } - - return vip.String() - } - } - - return "" -} - -func (c *containerConfig) serviceConfig() *clustertypes.ServiceConfig { - if len(c.task.Networks) == 0 { - return nil - } - - logrus.Debugf("Creating service config in agent for t = %+v", c.task) - svcCfg := &clustertypes.ServiceConfig{ - Name: c.task.ServiceAnnotations.Name, - Aliases: make(map[string][]string), - ID: c.task.ServiceID, - VirtualAddresses: make(map[string]*clustertypes.VirtualAddress), - } - - for _, na := range c.task.Networks { - svcCfg.VirtualAddresses[na.Network.ID] = &clustertypes.VirtualAddress{ - // We support only IPv4 virtual IP for now. - IPv4: c.virtualIP(na.Network.ID), - } - if len(na.Aliases) > 0 { - svcCfg.Aliases[na.Network.ID] = na.Aliases - } - } - - if c.task.Endpoint != nil { - for _, ePort := range c.task.Endpoint.Ports { - if ePort.PublishMode != api.PublishModeIngress { - continue - } - - svcCfg.ExposedPorts = append(svcCfg.ExposedPorts, &clustertypes.PortConfig{ - Name: ePort.Name, - Protocol: int32(ePort.Protocol), - TargetPort: ePort.TargetPort, - PublishedPort: ePort.PublishedPort, - }) - } - } - - return svcCfg -} - -// networks returns a list of network names attached to the container. The -// returned name can be used to lookup the corresponding network create -// options. -func (c *containerConfig) networks() []string { - var networks []string - - for name := range c.networksAttachments { - networks = append(networks, name) - } - - return networks -} - -func (c *containerConfig) networkCreateRequest(name string) (clustertypes.NetworkCreateRequest, error) { - na, ok := c.networksAttachments[name] - if !ok { - return clustertypes.NetworkCreateRequest{}, errors.New("container: unknown network referenced") - } - - options := types.NetworkCreate{ - // ID: na.Network.ID, - Driver: na.Network.DriverState.Name, - IPAM: &network.IPAM{ - Driver: na.Network.IPAM.Driver.Name, - Options: na.Network.IPAM.Driver.Options, - }, - Options: na.Network.DriverState.Options, - Labels: na.Network.Spec.Annotations.Labels, - Internal: na.Network.Spec.Internal, - Attachable: na.Network.Spec.Attachable, - EnableIPv6: na.Network.Spec.Ipv6Enabled, - CheckDuplicate: true, - } - - for _, ic := range na.Network.IPAM.Configs { - c := network.IPAMConfig{ - Subnet: ic.Subnet, - IPRange: ic.Range, - Gateway: ic.Gateway, - } - options.IPAM.Config = append(options.IPAM.Config, c) - } - - return clustertypes.NetworkCreateRequest{na.Network.ID, types.NetworkCreateRequest{Name: name, NetworkCreate: options}}, nil -} - -func (c containerConfig) eventFilter() filters.Args { - filter := filters.NewArgs() - filter.Add("type", events.ContainerEventType) - filter.Add("name", c.name()) - filter.Add("label", fmt.Sprintf("%v.task.id=%v", systemLabelPrefix, c.task.ID)) - return filter -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/controller.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/controller.go deleted file mode 100644 index 75f286a21..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/controller.go +++ /dev/null @@ -1,672 +0,0 @@ -package container - -import ( - "bufio" - "bytes" - "encoding/binary" - "fmt" - "io" - "os" - "strconv" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/events" - executorpkg "github.com/docker/docker/daemon/cluster/executor" - "github.com/docker/go-connections/nat" - "github.com/docker/libnetwork" - "github.com/docker/swarmkit/agent/exec" - "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/log" - "github.com/docker/swarmkit/protobuf/ptypes" - "github.com/pkg/errors" - "golang.org/x/net/context" - "golang.org/x/time/rate" -) - -// controller implements agent.Controller against docker's API. -// -// Most operations against docker's API are done through the container name, -// which is unique to the task. -type controller struct { - task *api.Task - adapter *containerAdapter - closed chan struct{} - err error - - pulled chan struct{} // closed after pull - cancelPull func() // cancels pull context if not nil - pullErr error // pull error, only read after pulled closed -} - -var _ exec.Controller = &controller{} - -// NewController returns a docker exec runner for the provided task. -func newController(b executorpkg.Backend, task *api.Task, secrets exec.SecretGetter) (*controller, error) { - adapter, err := newContainerAdapter(b, task, secrets) - if err != nil { - return nil, err - } - - return &controller{ - task: task, - adapter: adapter, - closed: make(chan struct{}), - }, nil -} - -func (r *controller) Task() (*api.Task, error) { - return r.task, nil -} - -// ContainerStatus returns the container-specific status for the task. -func (r *controller) ContainerStatus(ctx context.Context) (*api.ContainerStatus, error) { - ctnr, err := r.adapter.inspect(ctx) - if err != nil { - if isUnknownContainer(err) { - return nil, nil - } - return nil, err - } - return parseContainerStatus(ctnr) -} - -func (r *controller) PortStatus(ctx context.Context) (*api.PortStatus, error) { - ctnr, err := r.adapter.inspect(ctx) - if err != nil { - if isUnknownContainer(err) { - return nil, nil - } - - return nil, err - } - - return parsePortStatus(ctnr) -} - -// Update tasks a recent task update and applies it to the container. -func (r *controller) Update(ctx context.Context, t *api.Task) error { - // TODO(stevvooe): While assignment of tasks is idempotent, we do allow - // updates of metadata, such as labelling, as well as any other properties - // that make sense. - return nil -} - -// Prepare creates a container and ensures the image is pulled. -// -// If the container has already be created, exec.ErrTaskPrepared is returned. -func (r *controller) Prepare(ctx context.Context) error { - if err := r.checkClosed(); err != nil { - return err - } - - // Make sure all the networks that the task needs are created. - if err := r.adapter.createNetworks(ctx); err != nil { - return err - } - - // Make sure all the volumes that the task needs are created. - if err := r.adapter.createVolumes(ctx); err != nil { - return err - } - - if os.Getenv("DOCKER_SERVICE_PREFER_OFFLINE_IMAGE") != "1" { - if r.pulled == nil { - // Fork the pull to a different context to allow pull to continue - // on re-entrant calls to Prepare. This ensures that Prepare can be - // idempotent and not incur the extra cost of pulling when - // cancelled on updates. - var pctx context.Context - - r.pulled = make(chan struct{}) - pctx, r.cancelPull = context.WithCancel(context.Background()) // TODO(stevvooe): Bind a context to the entire controller. - - go func() { - defer close(r.pulled) - r.pullErr = r.adapter.pullImage(pctx) // protected by closing r.pulled - }() - } - - select { - case <-ctx.Done(): - return ctx.Err() - case <-r.pulled: - if r.pullErr != nil { - // NOTE(stevvooe): We always try to pull the image to make sure we have - // the most up to date version. This will return an error, but we only - // log it. If the image truly doesn't exist, the create below will - // error out. - // - // This gives us some nice behavior where we use up to date versions of - // mutable tags, but will still run if the old image is available but a - // registry is down. - // - // If you don't want this behavior, lock down your image to an - // immutable tag or digest. - log.G(ctx).WithError(r.pullErr).Error("pulling image failed") - } - } - } - - if err := r.adapter.create(ctx); err != nil { - if isContainerCreateNameConflict(err) { - if _, err := r.adapter.inspect(ctx); err != nil { - return err - } - - // container is already created. success! - return exec.ErrTaskPrepared - } - - return err - } - - return nil -} - -// Start the container. An error will be returned if the container is already started. -func (r *controller) Start(ctx context.Context) error { - if err := r.checkClosed(); err != nil { - return err - } - - ctnr, err := r.adapter.inspect(ctx) - if err != nil { - return err - } - - // Detect whether the container has *ever* been started. If so, we don't - // issue the start. - // - // TODO(stevvooe): This is very racy. While reading inspect, another could - // start the process and we could end up starting it twice. - if ctnr.State.Status != "created" { - return exec.ErrTaskStarted - } - - for { - if err := r.adapter.start(ctx); err != nil { - if _, ok := err.(libnetwork.ErrNoSuchNetwork); ok { - // Retry network creation again if we - // failed because some of the networks - // were not found. - if err := r.adapter.createNetworks(ctx); err != nil { - return err - } - - continue - } - - return errors.Wrap(err, "starting container failed") - } - - break - } - - // no health check - if ctnr.Config == nil || ctnr.Config.Healthcheck == nil { - if err := r.adapter.activateServiceBinding(); err != nil { - log.G(ctx).WithError(err).Errorf("failed to activate service binding for container %s which has no healthcheck config", r.adapter.container.name()) - return err - } - return nil - } - - healthCmd := ctnr.Config.Healthcheck.Test - - if len(healthCmd) == 0 || healthCmd[0] == "NONE" { - return nil - } - - // wait for container to be healthy - eventq := r.adapter.events(ctx) - - var healthErr error - for { - select { - case event := <-eventq: - if !r.matchevent(event) { - continue - } - - switch event.Action { - case "die": // exit on terminal events - ctnr, err := r.adapter.inspect(ctx) - if err != nil { - return errors.Wrap(err, "die event received") - } else if ctnr.State.ExitCode != 0 { - return &exitError{code: ctnr.State.ExitCode, cause: healthErr} - } - - return nil - case "destroy": - // If we get here, something has gone wrong but we want to exit - // and report anyways. - return ErrContainerDestroyed - case "health_status: unhealthy": - // in this case, we stop the container and report unhealthy status - if err := r.Shutdown(ctx); err != nil { - return errors.Wrap(err, "unhealthy container shutdown failed") - } - // set health check error, and wait for container to fully exit ("die" event) - healthErr = ErrContainerUnhealthy - case "health_status: healthy": - if err := r.adapter.activateServiceBinding(); err != nil { - log.G(ctx).WithError(err).Errorf("failed to activate service binding for container %s after healthy event", r.adapter.container.name()) - return err - } - return nil - } - case <-ctx.Done(): - return ctx.Err() - case <-r.closed: - return r.err - } - } -} - -// Wait on the container to exit. -func (r *controller) Wait(pctx context.Context) error { - if err := r.checkClosed(); err != nil { - return err - } - - ctx, cancel := context.WithCancel(pctx) - defer cancel() - - healthErr := make(chan error, 1) - go func() { - ectx, cancel := context.WithCancel(ctx) // cancel event context on first event - defer cancel() - if err := r.checkHealth(ectx); err == ErrContainerUnhealthy { - healthErr <- ErrContainerUnhealthy - if err := r.Shutdown(ectx); err != nil { - log.G(ectx).WithError(err).Debug("shutdown failed on unhealthy") - } - } - }() - - err := r.adapter.wait(ctx) - if ctx.Err() != nil { - return ctx.Err() - } - - if err != nil { - ee := &exitError{} - if ec, ok := err.(exec.ExitCoder); ok { - ee.code = ec.ExitCode() - } - select { - case e := <-healthErr: - ee.cause = e - default: - if err.Error() != "" { - ee.cause = err - } - } - return ee - } - - return nil -} - -// Shutdown the container cleanly. -func (r *controller) Shutdown(ctx context.Context) error { - if err := r.checkClosed(); err != nil { - return err - } - - if r.cancelPull != nil { - r.cancelPull() - } - - // remove container from service binding - if err := r.adapter.deactivateServiceBinding(); err != nil { - log.G(ctx).WithError(err).Errorf("failed to deactivate service binding for container %s", r.adapter.container.name()) - return err - } - - if err := r.adapter.shutdown(ctx); err != nil { - if isUnknownContainer(err) || isStoppedContainer(err) { - return nil - } - - return err - } - - return nil -} - -// Terminate the container, with force. -func (r *controller) Terminate(ctx context.Context) error { - if err := r.checkClosed(); err != nil { - return err - } - - if r.cancelPull != nil { - r.cancelPull() - } - - if err := r.adapter.terminate(ctx); err != nil { - if isUnknownContainer(err) { - return nil - } - - return err - } - - return nil -} - -// Remove the container and its resources. -func (r *controller) Remove(ctx context.Context) error { - if err := r.checkClosed(); err != nil { - return err - } - - if r.cancelPull != nil { - r.cancelPull() - } - - // It may be necessary to shut down the task before removing it. - if err := r.Shutdown(ctx); err != nil { - if isUnknownContainer(err) { - return nil - } - // This may fail if the task was already shut down. - log.G(ctx).WithError(err).Debug("shutdown failed on removal") - } - - // Try removing networks referenced in this task in case this - // task is the last one referencing it - if err := r.adapter.removeNetworks(ctx); err != nil { - if isUnknownContainer(err) { - return nil - } - return err - } - - if err := r.adapter.remove(ctx); err != nil { - if isUnknownContainer(err) { - return nil - } - - return err - } - return nil -} - -// waitReady waits for a container to be "ready". -// Ready means it's past the started state. -func (r *controller) waitReady(pctx context.Context) error { - if err := r.checkClosed(); err != nil { - return err - } - - ctx, cancel := context.WithCancel(pctx) - defer cancel() - - eventq := r.adapter.events(ctx) - - ctnr, err := r.adapter.inspect(ctx) - if err != nil { - if !isUnknownContainer(err) { - return errors.Wrap(err, "inspect container failed") - } - } else { - switch ctnr.State.Status { - case "running", "exited", "dead": - return nil - } - } - - for { - select { - case event := <-eventq: - if !r.matchevent(event) { - continue - } - - switch event.Action { - case "start": - return nil - } - case <-ctx.Done(): - return ctx.Err() - case <-r.closed: - return r.err - } - } -} - -func (r *controller) Logs(ctx context.Context, publisher exec.LogPublisher, options api.LogSubscriptionOptions) error { - if err := r.checkClosed(); err != nil { - return err - } - - if err := r.waitReady(ctx); err != nil { - return errors.Wrap(err, "container not ready for logs") - } - - rc, err := r.adapter.logs(ctx, options) - if err != nil { - return errors.Wrap(err, "failed getting container logs") - } - defer rc.Close() - - var ( - // use a rate limiter to keep things under control but also provides some - // ability coalesce messages. - limiter = rate.NewLimiter(rate.Every(time.Second), 10<<20) // 10 MB/s - msgctx = api.LogContext{ - NodeID: r.task.NodeID, - ServiceID: r.task.ServiceID, - TaskID: r.task.ID, - } - ) - - brd := bufio.NewReader(rc) - for { - // so, message header is 8 bytes, treat as uint64, pull stream off MSB - var header uint64 - if err := binary.Read(brd, binary.BigEndian, &header); err != nil { - if err == io.EOF { - return nil - } - - return errors.Wrap(err, "failed reading log header") - } - - stream, size := (header>>(7<<3))&0xFF, header & ^(uint64(0xFF)<<(7<<3)) - - // limit here to decrease allocation back pressure. - if err := limiter.WaitN(ctx, int(size)); err != nil { - return errors.Wrap(err, "failed rate limiter") - } - - buf := make([]byte, size) - _, err := io.ReadFull(brd, buf) - if err != nil { - return errors.Wrap(err, "failed reading buffer") - } - - // Timestamp is RFC3339Nano with 1 space after. Lop, parse, publish - parts := bytes.SplitN(buf, []byte(" "), 2) - if len(parts) != 2 { - return fmt.Errorf("invalid timestamp in log message: %v", buf) - } - - ts, err := time.Parse(time.RFC3339Nano, string(parts[0])) - if err != nil { - return errors.Wrap(err, "failed to parse timestamp") - } - - tsp, err := ptypes.TimestampProto(ts) - if err != nil { - return errors.Wrap(err, "failed to convert timestamp") - } - - if err := publisher.Publish(ctx, api.LogMessage{ - Context: msgctx, - Timestamp: tsp, - Stream: api.LogStream(stream), - - Data: parts[1], - }); err != nil { - return errors.Wrap(err, "failed to publish log message") - } - } -} - -// Close the runner and clean up any ephemeral resources. -func (r *controller) Close() error { - select { - case <-r.closed: - return r.err - default: - if r.cancelPull != nil { - r.cancelPull() - } - - r.err = exec.ErrControllerClosed - close(r.closed) - } - return nil -} - -func (r *controller) matchevent(event events.Message) bool { - if event.Type != events.ContainerEventType { - return false - } - - // TODO(stevvooe): Filter based on ID matching, in addition to name. - - // Make sure the events are for this container. - if event.Actor.Attributes["name"] != r.adapter.container.name() { - return false - } - - return true -} - -func (r *controller) checkClosed() error { - select { - case <-r.closed: - return r.err - default: - return nil - } -} - -func parseContainerStatus(ctnr types.ContainerJSON) (*api.ContainerStatus, error) { - status := &api.ContainerStatus{ - ContainerID: ctnr.ID, - PID: int32(ctnr.State.Pid), - ExitCode: int32(ctnr.State.ExitCode), - } - - return status, nil -} - -func parsePortStatus(ctnr types.ContainerJSON) (*api.PortStatus, error) { - status := &api.PortStatus{} - - if ctnr.NetworkSettings != nil && len(ctnr.NetworkSettings.Ports) > 0 { - exposedPorts, err := parsePortMap(ctnr.NetworkSettings.Ports) - if err != nil { - return nil, err - } - status.Ports = exposedPorts - } - - return status, nil -} - -func parsePortMap(portMap nat.PortMap) ([]*api.PortConfig, error) { - exposedPorts := make([]*api.PortConfig, 0, len(portMap)) - - for portProtocol, mapping := range portMap { - parts := strings.SplitN(string(portProtocol), "/", 2) - if len(parts) != 2 { - return nil, fmt.Errorf("invalid port mapping: %s", portProtocol) - } - - port, err := strconv.ParseUint(parts[0], 10, 16) - if err != nil { - return nil, err - } - - protocol := api.ProtocolTCP - switch strings.ToLower(parts[1]) { - case "tcp": - protocol = api.ProtocolTCP - case "udp": - protocol = api.ProtocolUDP - default: - return nil, fmt.Errorf("invalid protocol: %s", parts[1]) - } - - for _, binding := range mapping { - hostPort, err := strconv.ParseUint(binding.HostPort, 10, 16) - if err != nil { - return nil, err - } - - // TODO(aluzzardi): We're losing the port `name` here since - // there's no way to retrieve it back from the Engine. - exposedPorts = append(exposedPorts, &api.PortConfig{ - PublishMode: api.PublishModeHost, - Protocol: protocol, - TargetPort: uint32(port), - PublishedPort: uint32(hostPort), - }) - } - } - - return exposedPorts, nil -} - -type exitError struct { - code int - cause error -} - -func (e *exitError) Error() string { - if e.cause != nil { - return fmt.Sprintf("task: non-zero exit (%v): %v", e.code, e.cause) - } - - return fmt.Sprintf("task: non-zero exit (%v)", e.code) -} - -func (e *exitError) ExitCode() int { - return int(e.code) -} - -func (e *exitError) Cause() error { - return e.cause -} - -// checkHealth blocks until unhealthy container is detected or ctx exits -func (r *controller) checkHealth(ctx context.Context) error { - eventq := r.adapter.events(ctx) - - for { - select { - case <-ctx.Done(): - return nil - case <-r.closed: - return nil - case event := <-eventq: - if !r.matchevent(event) { - continue - } - - switch event.Action { - case "health_status: unhealthy": - return ErrContainerUnhealthy - } - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/errors.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/errors.go deleted file mode 100644 index 63e123356..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/errors.go +++ /dev/null @@ -1,15 +0,0 @@ -package container - -import "fmt" - -var ( - // ErrImageRequired returned if a task is missing the image definition. - ErrImageRequired = fmt.Errorf("dockerexec: image required") - - // ErrContainerDestroyed returned when a container is prematurely destroyed - // during a wait call. - ErrContainerDestroyed = fmt.Errorf("dockerexec: container destroyed") - - // ErrContainerUnhealthy returned if controller detects the health check failure - ErrContainerUnhealthy = fmt.Errorf("dockerexec: unhealthy container") -) diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/executor.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/executor.go deleted file mode 100644 index f0dedd453..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/executor.go +++ /dev/null @@ -1,194 +0,0 @@ -package container - -import ( - "sort" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/network" - executorpkg "github.com/docker/docker/daemon/cluster/executor" - clustertypes "github.com/docker/docker/daemon/cluster/provider" - networktypes "github.com/docker/libnetwork/types" - "github.com/docker/swarmkit/agent/exec" - "github.com/docker/swarmkit/agent/secrets" - "github.com/docker/swarmkit/api" - "golang.org/x/net/context" -) - -type executor struct { - backend executorpkg.Backend - secrets exec.SecretsManager -} - -// NewExecutor returns an executor from the docker client. -func NewExecutor(b executorpkg.Backend) exec.Executor { - return &executor{ - backend: b, - secrets: secrets.NewManager(), - } -} - -// Describe returns the underlying node description from the docker client. -func (e *executor) Describe(ctx context.Context) (*api.NodeDescription, error) { - info, err := e.backend.SystemInfo() - if err != nil { - return nil, err - } - - plugins := map[api.PluginDescription]struct{}{} - addPlugins := func(typ string, names []string) { - for _, name := range names { - plugins[api.PluginDescription{ - Type: typ, - Name: name, - }] = struct{}{} - } - } - - // add v1 plugins - addPlugins("Volume", info.Plugins.Volume) - // Add builtin driver "overlay" (the only builtin multi-host driver) to - // the plugin list by default. - addPlugins("Network", append([]string{"overlay"}, info.Plugins.Network...)) - addPlugins("Authorization", info.Plugins.Authorization) - - // add v2 plugins - v2Plugins, err := e.backend.PluginManager().List() - if err == nil { - for _, plgn := range v2Plugins { - for _, typ := range plgn.Config.Interface.Types { - if typ.Prefix != "docker" || !plgn.Enabled { - continue - } - plgnTyp := typ.Capability - if typ.Capability == "volumedriver" { - plgnTyp = "Volume" - } else if typ.Capability == "networkdriver" { - plgnTyp = "Network" - } - plugins[api.PluginDescription{ - Type: plgnTyp, - Name: plgn.Name, - }] = struct{}{} - } - } - } - - pluginFields := make([]api.PluginDescription, 0, len(plugins)) - for k := range plugins { - pluginFields = append(pluginFields, k) - } - - sort.Sort(sortedPlugins(pluginFields)) - - // parse []string labels into a map[string]string - labels := map[string]string{} - for _, l := range info.Labels { - stringSlice := strings.SplitN(l, "=", 2) - // this will take the last value in the list for a given key - // ideally, one shouldn't assign multiple values to the same key - if len(stringSlice) > 1 { - labels[stringSlice[0]] = stringSlice[1] - } - } - - description := &api.NodeDescription{ - Hostname: info.Name, - Platform: &api.Platform{ - Architecture: info.Architecture, - OS: info.OSType, - }, - Engine: &api.EngineDescription{ - EngineVersion: info.ServerVersion, - Labels: labels, - Plugins: pluginFields, - }, - Resources: &api.Resources{ - NanoCPUs: int64(info.NCPU) * 1e9, - MemoryBytes: info.MemTotal, - }, - } - - return description, nil -} - -func (e *executor) Configure(ctx context.Context, node *api.Node) error { - na := node.Attachment - if na == nil { - return nil - } - - options := types.NetworkCreate{ - Driver: na.Network.DriverState.Name, - IPAM: &network.IPAM{ - Driver: na.Network.IPAM.Driver.Name, - }, - Options: na.Network.DriverState.Options, - CheckDuplicate: true, - } - - for _, ic := range na.Network.IPAM.Configs { - c := network.IPAMConfig{ - Subnet: ic.Subnet, - IPRange: ic.Range, - Gateway: ic.Gateway, - } - options.IPAM.Config = append(options.IPAM.Config, c) - } - - return e.backend.SetupIngress(clustertypes.NetworkCreateRequest{ - na.Network.ID, - types.NetworkCreateRequest{ - Name: na.Network.Spec.Annotations.Name, - NetworkCreate: options, - }, - }, na.Addresses[0]) -} - -// Controller returns a docker container runner. -func (e *executor) Controller(t *api.Task) (exec.Controller, error) { - if t.Spec.GetAttachment() != nil { - return newNetworkAttacherController(e.backend, t, e.secrets) - } - - ctlr, err := newController(e.backend, t, e.secrets) - if err != nil { - return nil, err - } - - return ctlr, nil -} - -func (e *executor) SetNetworkBootstrapKeys(keys []*api.EncryptionKey) error { - nwKeys := []*networktypes.EncryptionKey{} - for _, key := range keys { - nwKey := &networktypes.EncryptionKey{ - Subsystem: key.Subsystem, - Algorithm: int32(key.Algorithm), - Key: make([]byte, len(key.Key)), - LamportTime: key.LamportTime, - } - copy(nwKey.Key, key.Key) - nwKeys = append(nwKeys, nwKey) - } - e.backend.SetNetworkBootstrapKeys(nwKeys) - - return nil -} - -func (e *executor) Secrets() exec.SecretsManager { - return e.secrets -} - -type sortedPlugins []api.PluginDescription - -func (sp sortedPlugins) Len() int { return len(sp) } - -func (sp sortedPlugins) Swap(i, j int) { sp[i], sp[j] = sp[j], sp[i] } - -func (sp sortedPlugins) Less(i, j int) bool { - if sp[i].Type != sp[j].Type { - return sp[i].Type < sp[j].Type - } - return sp[i].Name < sp[j].Name -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/health_test.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/health_test.go deleted file mode 100644 index 99cf7502a..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/health_test.go +++ /dev/null @@ -1,102 +0,0 @@ -// +build !windows - -package container - -import ( - "testing" - "time" - - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon" - "github.com/docker/docker/daemon/events" - "github.com/docker/swarmkit/api" - "golang.org/x/net/context" -) - -func TestHealthStates(t *testing.T) { - - // set up environment: events, task, container .... - e := events.New() - _, l, _ := e.Subscribe() - defer e.Evict(l) - - task := &api.Task{ - ID: "id", - ServiceID: "sid", - Spec: api.TaskSpec{ - Runtime: &api.TaskSpec_Container{ - Container: &api.ContainerSpec{ - Image: "image_name", - Labels: map[string]string{ - "com.docker.swarm.task.id": "id", - }, - }, - }, - }, - Annotations: api.Annotations{Name: "name"}, - } - - c := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: "id", - Name: "name", - Config: &containertypes.Config{ - Image: "image_name", - Labels: map[string]string{ - "com.docker.swarm.task.id": "id", - }, - }, - }, - } - - daemon := &daemon.Daemon{ - EventsService: e, - } - - controller, err := newController(daemon, task, nil) - if err != nil { - t.Fatalf("create controller fail %v", err) - } - - errChan := make(chan error, 1) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // fire checkHealth - go func() { - err := controller.checkHealth(ctx) - select { - case errChan <- err: - case <-ctx.Done(): - } - }() - - // send an event and expect to get expectedErr - // if expectedErr is nil, shouldn't get any error - logAndExpect := func(msg string, expectedErr error) { - daemon.LogContainerEvent(c, msg) - - timer := time.NewTimer(1 * time.Second) - defer timer.Stop() - - select { - case err := <-errChan: - if err != expectedErr { - t.Fatalf("expect error %v, but get %v", expectedErr, err) - } - case <-timer.C: - if expectedErr != nil { - t.Fatalf("time limit exceeded, didn't get expected error") - } - } - } - - // events that are ignored by checkHealth - logAndExpect("health_status: running", nil) - logAndExpect("health_status: healthy", nil) - logAndExpect("die", nil) - - // unhealthy event will be caught by checkHealth - logAndExpect("health_status: unhealthy", ErrContainerUnhealthy) -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate.go deleted file mode 100644 index 5fda1f2ed..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate.go +++ /dev/null @@ -1,39 +0,0 @@ -package container - -import ( - "fmt" - "path/filepath" - - "github.com/docker/swarmkit/api" -) - -func validateMounts(mounts []api.Mount) error { - for _, mount := range mounts { - // Target must always be absolute - if !filepath.IsAbs(mount.Target) { - return fmt.Errorf("invalid mount target, must be an absolute path: %s", mount.Target) - } - - switch mount.Type { - // The checks on abs paths are required due to the container API confusing - // volume mounts as bind mounts when the source is absolute (and vice-versa) - // See #25253 - // TODO: This is probably not necessary once #22373 is merged - case api.MountTypeBind: - if !filepath.IsAbs(mount.Source) { - return fmt.Errorf("invalid bind mount source, must be an absolute path: %s", mount.Source) - } - case api.MountTypeVolume: - if filepath.IsAbs(mount.Source) { - return fmt.Errorf("invalid volume mount source, must not be an absolute path: %s", mount.Source) - } - case api.MountTypeTmpfs: - if mount.Source != "" { - return fmt.Errorf("invalid tmpfs source, source must be empty") - } - default: - return fmt.Errorf("invalid mount type: %s", mount.Type) - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_test.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_test.go deleted file mode 100644 index 9d98e2c00..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_test.go +++ /dev/null @@ -1,141 +0,0 @@ -package container - -import ( - "io/ioutil" - "os" - "strings" - "testing" - - "github.com/docker/docker/daemon" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/swarmkit/api" -) - -func newTestControllerWithMount(m api.Mount) (*controller, error) { - return newController(&daemon.Daemon{}, &api.Task{ - ID: stringid.GenerateRandomID(), - ServiceID: stringid.GenerateRandomID(), - Spec: api.TaskSpec{ - Runtime: &api.TaskSpec_Container{ - Container: &api.ContainerSpec{ - Image: "image_name", - Labels: map[string]string{ - "com.docker.swarm.task.id": "id", - }, - Mounts: []api.Mount{m}, - }, - }, - }, - }, nil) -} - -func TestControllerValidateMountBind(t *testing.T) { - // with improper source - if _, err := newTestControllerWithMount(api.Mount{ - Type: api.MountTypeBind, - Source: "foo", - Target: testAbsPath, - }); err == nil || !strings.Contains(err.Error(), "invalid bind mount source") { - t.Fatalf("expected error, got: %v", err) - } - - // with non-existing source - if _, err := newTestControllerWithMount(api.Mount{ - Type: api.MountTypeBind, - Source: testAbsNonExistent, - Target: testAbsPath, - }); err != nil { - t.Fatalf("controller should not error at creation: %v", err) - } - - // with proper source - tmpdir, err := ioutil.TempDir("", "TestControllerValidateMountBind") - if err != nil { - t.Fatalf("failed to create temp dir: %v", err) - } - defer os.Remove(tmpdir) - - if _, err := newTestControllerWithMount(api.Mount{ - Type: api.MountTypeBind, - Source: tmpdir, - Target: testAbsPath, - }); err != nil { - t.Fatalf("expected error, got: %v", err) - } -} - -func TestControllerValidateMountVolume(t *testing.T) { - // with improper source - if _, err := newTestControllerWithMount(api.Mount{ - Type: api.MountTypeVolume, - Source: testAbsPath, - Target: testAbsPath, - }); err == nil || !strings.Contains(err.Error(), "invalid volume mount source") { - t.Fatalf("expected error, got: %v", err) - } - - // with proper source - if _, err := newTestControllerWithMount(api.Mount{ - Type: api.MountTypeVolume, - Source: "foo", - Target: testAbsPath, - }); err != nil { - t.Fatalf("expected error, got: %v", err) - } -} - -func TestControllerValidateMountTarget(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestControllerValidateMountTarget") - if err != nil { - t.Fatalf("failed to create temp dir: %v", err) - } - defer os.Remove(tmpdir) - - // with improper target - if _, err := newTestControllerWithMount(api.Mount{ - Type: api.MountTypeBind, - Source: testAbsPath, - Target: "foo", - }); err == nil || !strings.Contains(err.Error(), "invalid mount target") { - t.Fatalf("expected error, got: %v", err) - } - - // with proper target - if _, err := newTestControllerWithMount(api.Mount{ - Type: api.MountTypeBind, - Source: tmpdir, - Target: testAbsPath, - }); err != nil { - t.Fatalf("expected no error, got: %v", err) - } -} - -func TestControllerValidateMountTmpfs(t *testing.T) { - // with improper target - if _, err := newTestControllerWithMount(api.Mount{ - Type: api.MountTypeTmpfs, - Source: "foo", - Target: testAbsPath, - }); err == nil || !strings.Contains(err.Error(), "invalid tmpfs source") { - t.Fatalf("expected error, got: %v", err) - } - - // with proper target - if _, err := newTestControllerWithMount(api.Mount{ - Type: api.MountTypeTmpfs, - Target: testAbsPath, - }); err != nil { - t.Fatalf("expected no error, got: %v", err) - } -} - -func TestControllerValidateMountInvalidType(t *testing.T) { - // with improper target - if _, err := newTestControllerWithMount(api.Mount{ - Type: api.Mount_MountType(9999), - Source: "foo", - Target: testAbsPath, - }); err == nil || !strings.Contains(err.Error(), "invalid mount type") { - t.Fatalf("expected error, got: %v", err) - } -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_unix_test.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_unix_test.go deleted file mode 100644 index c616eeef9..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_unix_test.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !windows - -package container - -const ( - testAbsPath = "/foo" - testAbsNonExistent = "/some-non-existing-host-path/" -) diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_windows_test.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_windows_test.go deleted file mode 100644 index c346451d3..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/validate_windows_test.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build windows - -package container - -const ( - testAbsPath = `c:\foo` - testAbsNonExistent = `c:\some-non-existing-host-path\` -) diff --git a/vendor/github.com/docker/docker/daemon/cluster/filters.go b/vendor/github.com/docker/docker/daemon/cluster/filters.go deleted file mode 100644 index 88668edaa..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/filters.go +++ /dev/null @@ -1,116 +0,0 @@ -package cluster - -import ( - "fmt" - "strings" - - "github.com/docker/docker/api/types/filters" - runconfigopts "github.com/docker/docker/runconfig/opts" - swarmapi "github.com/docker/swarmkit/api" -) - -func newListNodesFilters(filter filters.Args) (*swarmapi.ListNodesRequest_Filters, error) { - accepted := map[string]bool{ - "name": true, - "id": true, - "label": true, - "role": true, - "membership": true, - } - if err := filter.Validate(accepted); err != nil { - return nil, err - } - f := &swarmapi.ListNodesRequest_Filters{ - NamePrefixes: filter.Get("name"), - IDPrefixes: filter.Get("id"), - Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")), - } - - for _, r := range filter.Get("role") { - if role, ok := swarmapi.NodeRole_value[strings.ToUpper(r)]; ok { - f.Roles = append(f.Roles, swarmapi.NodeRole(role)) - } else if r != "" { - return nil, fmt.Errorf("Invalid role filter: '%s'", r) - } - } - - for _, a := range filter.Get("membership") { - if membership, ok := swarmapi.NodeSpec_Membership_value[strings.ToUpper(a)]; ok { - f.Memberships = append(f.Memberships, swarmapi.NodeSpec_Membership(membership)) - } else if a != "" { - return nil, fmt.Errorf("Invalid membership filter: '%s'", a) - } - } - - return f, nil -} - -func newListServicesFilters(filter filters.Args) (*swarmapi.ListServicesRequest_Filters, error) { - accepted := map[string]bool{ - "name": true, - "id": true, - "label": true, - } - if err := filter.Validate(accepted); err != nil { - return nil, err - } - return &swarmapi.ListServicesRequest_Filters{ - NamePrefixes: filter.Get("name"), - IDPrefixes: filter.Get("id"), - Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")), - }, nil -} - -func newListTasksFilters(filter filters.Args, transformFunc func(filters.Args) error) (*swarmapi.ListTasksRequest_Filters, error) { - accepted := map[string]bool{ - "name": true, - "id": true, - "label": true, - "service": true, - "node": true, - "desired-state": true, - } - if err := filter.Validate(accepted); err != nil { - return nil, err - } - if transformFunc != nil { - if err := transformFunc(filter); err != nil { - return nil, err - } - } - f := &swarmapi.ListTasksRequest_Filters{ - NamePrefixes: filter.Get("name"), - IDPrefixes: filter.Get("id"), - Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")), - ServiceIDs: filter.Get("service"), - NodeIDs: filter.Get("node"), - } - - for _, s := range filter.Get("desired-state") { - if state, ok := swarmapi.TaskState_value[strings.ToUpper(s)]; ok { - f.DesiredStates = append(f.DesiredStates, swarmapi.TaskState(state)) - } else if s != "" { - return nil, fmt.Errorf("Invalid desired-state filter: '%s'", s) - } - } - - return f, nil -} - -func newListSecretsFilters(filter filters.Args) (*swarmapi.ListSecretsRequest_Filters, error) { - accepted := map[string]bool{ - "names": true, - "name": true, - "id": true, - "label": true, - } - if err := filter.Validate(accepted); err != nil { - return nil, err - } - return &swarmapi.ListSecretsRequest_Filters{ - Names: filter.Get("names"), - NamePrefixes: filter.Get("name"), - IDPrefixes: filter.Get("id"), - Labels: runconfigopts.ConvertKVStringsToMap(filter.Get("label")), - }, nil -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/helpers.go b/vendor/github.com/docker/docker/daemon/cluster/helpers.go deleted file mode 100644 index be5bf56e8..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/helpers.go +++ /dev/null @@ -1,108 +0,0 @@ -package cluster - -import ( - "fmt" - - swarmapi "github.com/docker/swarmkit/api" - "golang.org/x/net/context" -) - -func getSwarm(ctx context.Context, c swarmapi.ControlClient) (*swarmapi.Cluster, error) { - rl, err := c.ListClusters(ctx, &swarmapi.ListClustersRequest{}) - if err != nil { - return nil, err - } - - if len(rl.Clusters) == 0 { - return nil, fmt.Errorf("swarm not found") - } - - // TODO: assume one cluster only - return rl.Clusters[0], nil -} - -func getNode(ctx context.Context, c swarmapi.ControlClient, input string) (*swarmapi.Node, error) { - // GetNode to match via full ID. - rg, err := c.GetNode(ctx, &swarmapi.GetNodeRequest{NodeID: input}) - if err != nil { - // If any error (including NotFound), ListNodes to match via full name. - rl, err := c.ListNodes(ctx, &swarmapi.ListNodesRequest{Filters: &swarmapi.ListNodesRequest_Filters{Names: []string{input}}}) - - if err != nil || len(rl.Nodes) == 0 { - // If any error or 0 result, ListNodes to match via ID prefix. - rl, err = c.ListNodes(ctx, &swarmapi.ListNodesRequest{Filters: &swarmapi.ListNodesRequest_Filters{IDPrefixes: []string{input}}}) - } - - if err != nil { - return nil, err - } - - if len(rl.Nodes) == 0 { - return nil, fmt.Errorf("node %s not found", input) - } - - if l := len(rl.Nodes); l > 1 { - return nil, fmt.Errorf("node %s is ambiguous (%d matches found)", input, l) - } - - return rl.Nodes[0], nil - } - return rg.Node, nil -} - -func getService(ctx context.Context, c swarmapi.ControlClient, input string) (*swarmapi.Service, error) { - // GetService to match via full ID. - rg, err := c.GetService(ctx, &swarmapi.GetServiceRequest{ServiceID: input}) - if err != nil { - // If any error (including NotFound), ListServices to match via full name. - rl, err := c.ListServices(ctx, &swarmapi.ListServicesRequest{Filters: &swarmapi.ListServicesRequest_Filters{Names: []string{input}}}) - if err != nil || len(rl.Services) == 0 { - // If any error or 0 result, ListServices to match via ID prefix. - rl, err = c.ListServices(ctx, &swarmapi.ListServicesRequest{Filters: &swarmapi.ListServicesRequest_Filters{IDPrefixes: []string{input}}}) - } - - if err != nil { - return nil, err - } - - if len(rl.Services) == 0 { - return nil, fmt.Errorf("service %s not found", input) - } - - if l := len(rl.Services); l > 1 { - return nil, fmt.Errorf("service %s is ambiguous (%d matches found)", input, l) - } - - return rl.Services[0], nil - } - return rg.Service, nil -} - -func getTask(ctx context.Context, c swarmapi.ControlClient, input string) (*swarmapi.Task, error) { - // GetTask to match via full ID. - rg, err := c.GetTask(ctx, &swarmapi.GetTaskRequest{TaskID: input}) - if err != nil { - // If any error (including NotFound), ListTasks to match via full name. - rl, err := c.ListTasks(ctx, &swarmapi.ListTasksRequest{Filters: &swarmapi.ListTasksRequest_Filters{Names: []string{input}}}) - - if err != nil || len(rl.Tasks) == 0 { - // If any error or 0 result, ListTasks to match via ID prefix. - rl, err = c.ListTasks(ctx, &swarmapi.ListTasksRequest{Filters: &swarmapi.ListTasksRequest_Filters{IDPrefixes: []string{input}}}) - } - - if err != nil { - return nil, err - } - - if len(rl.Tasks) == 0 { - return nil, fmt.Errorf("task %s not found", input) - } - - if l := len(rl.Tasks); l > 1 { - return nil, fmt.Errorf("task %s is ambiguous (%d matches found)", input, l) - } - - return rl.Tasks[0], nil - } - return rg.Task, nil -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/listen_addr.go b/vendor/github.com/docker/docker/daemon/cluster/listen_addr.go deleted file mode 100644 index c24d4865b..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/listen_addr.go +++ /dev/null @@ -1,278 +0,0 @@ -package cluster - -import ( - "errors" - "fmt" - "net" -) - -var ( - errNoSuchInterface = errors.New("no such interface") - errNoIP = errors.New("could not find the system's IP address") - errMustSpecifyListenAddr = errors.New("must specify a listening address because the address to advertise is not recognized as a system address, and a system's IP address to use could not be uniquely identified") - errBadListenAddr = errors.New("listen address must be an IP address or network interface (with optional port number)") - errBadAdvertiseAddr = errors.New("advertise address must be a non-zero IP address or network interface (with optional port number)") - errBadDefaultAdvertiseAddr = errors.New("default advertise address must be a non-zero IP address or network interface (without a port number)") -) - -func resolveListenAddr(specifiedAddr string) (string, string, error) { - specifiedHost, specifiedPort, err := net.SplitHostPort(specifiedAddr) - if err != nil { - return "", "", fmt.Errorf("could not parse listen address %s", specifiedAddr) - } - - // Does the host component match any of the interface names on the - // system? If so, use the address from that interface. - interfaceAddr, err := resolveInterfaceAddr(specifiedHost) - if err == nil { - return interfaceAddr.String(), specifiedPort, nil - } - if err != errNoSuchInterface { - return "", "", err - } - - // If it's not an interface, it must be an IP (for now) - if net.ParseIP(specifiedHost) == nil { - return "", "", errBadListenAddr - } - - return specifiedHost, specifiedPort, nil -} - -func (c *Cluster) resolveAdvertiseAddr(advertiseAddr, listenAddrPort string) (string, string, error) { - // Approach: - // - If an advertise address is specified, use that. Resolve the - // interface's address if an interface was specified in - // advertiseAddr. Fill in the port from listenAddrPort if necessary. - // - If DefaultAdvertiseAddr is not empty, use that with the port from - // listenAddrPort. Resolve the interface's address from - // if an interface name was specified in DefaultAdvertiseAddr. - // - Otherwise, try to autodetect the system's address. Use the port in - // listenAddrPort with this address if autodetection succeeds. - - if advertiseAddr != "" { - advertiseHost, advertisePort, err := net.SplitHostPort(advertiseAddr) - if err != nil { - // Not a host:port specification - advertiseHost = advertiseAddr - advertisePort = listenAddrPort - } - - // Does the host component match any of the interface names on the - // system? If so, use the address from that interface. - interfaceAddr, err := resolveInterfaceAddr(advertiseHost) - if err == nil { - return interfaceAddr.String(), advertisePort, nil - } - if err != errNoSuchInterface { - return "", "", err - } - - // If it's not an interface, it must be an IP (for now) - if ip := net.ParseIP(advertiseHost); ip == nil || ip.IsUnspecified() { - return "", "", errBadAdvertiseAddr - } - - return advertiseHost, advertisePort, nil - } - - if c.config.DefaultAdvertiseAddr != "" { - // Does the default advertise address component match any of the - // interface names on the system? If so, use the address from - // that interface. - interfaceAddr, err := resolveInterfaceAddr(c.config.DefaultAdvertiseAddr) - if err == nil { - return interfaceAddr.String(), listenAddrPort, nil - } - if err != errNoSuchInterface { - return "", "", err - } - - // If it's not an interface, it must be an IP (for now) - if ip := net.ParseIP(c.config.DefaultAdvertiseAddr); ip == nil || ip.IsUnspecified() { - return "", "", errBadDefaultAdvertiseAddr - } - - return c.config.DefaultAdvertiseAddr, listenAddrPort, nil - } - - systemAddr, err := c.resolveSystemAddr() - if err != nil { - return "", "", err - } - return systemAddr.String(), listenAddrPort, nil -} - -func resolveInterfaceAddr(specifiedInterface string) (net.IP, error) { - // Use a specific interface's IP address. - intf, err := net.InterfaceByName(specifiedInterface) - if err != nil { - return nil, errNoSuchInterface - } - - addrs, err := intf.Addrs() - if err != nil { - return nil, err - } - - var interfaceAddr4, interfaceAddr6 net.IP - - for _, addr := range addrs { - ipAddr, ok := addr.(*net.IPNet) - - if ok { - if ipAddr.IP.To4() != nil { - // IPv4 - if interfaceAddr4 != nil { - return nil, fmt.Errorf("interface %s has more than one IPv4 address (%s and %s)", specifiedInterface, interfaceAddr4, ipAddr.IP) - } - interfaceAddr4 = ipAddr.IP - } else { - // IPv6 - if interfaceAddr6 != nil { - return nil, fmt.Errorf("interface %s has more than one IPv6 address (%s and %s)", specifiedInterface, interfaceAddr6, ipAddr.IP) - } - interfaceAddr6 = ipAddr.IP - } - } - } - - if interfaceAddr4 == nil && interfaceAddr6 == nil { - return nil, fmt.Errorf("interface %s has no usable IPv4 or IPv6 address", specifiedInterface) - } - - // In the case that there's exactly one IPv4 address - // and exactly one IPv6 address, favor IPv4 over IPv6. - if interfaceAddr4 != nil { - return interfaceAddr4, nil - } - return interfaceAddr6, nil -} - -func (c *Cluster) resolveSystemAddrViaSubnetCheck() (net.IP, error) { - // Use the system's only IP address, or fail if there are - // multiple addresses to choose from. Skip interfaces which - // are managed by docker via subnet check. - interfaces, err := net.Interfaces() - if err != nil { - return nil, err - } - - var systemAddr net.IP - var systemInterface string - - // List Docker-managed subnets - v4Subnets := c.config.NetworkSubnetsProvider.V4Subnets() - v6Subnets := c.config.NetworkSubnetsProvider.V6Subnets() - -ifaceLoop: - for _, intf := range interfaces { - // Skip inactive interfaces and loopback interfaces - if (intf.Flags&net.FlagUp == 0) || (intf.Flags&net.FlagLoopback) != 0 { - continue - } - - addrs, err := intf.Addrs() - if err != nil { - continue - } - - var interfaceAddr4, interfaceAddr6 net.IP - - for _, addr := range addrs { - ipAddr, ok := addr.(*net.IPNet) - - // Skip loopback and link-local addresses - if !ok || !ipAddr.IP.IsGlobalUnicast() { - continue - } - - if ipAddr.IP.To4() != nil { - // IPv4 - - // Ignore addresses in subnets that are managed by Docker. - for _, subnet := range v4Subnets { - if subnet.Contains(ipAddr.IP) { - continue ifaceLoop - } - } - - if interfaceAddr4 != nil { - return nil, errMultipleIPs(intf.Name, intf.Name, interfaceAddr4, ipAddr.IP) - } - - interfaceAddr4 = ipAddr.IP - } else { - // IPv6 - - // Ignore addresses in subnets that are managed by Docker. - for _, subnet := range v6Subnets { - if subnet.Contains(ipAddr.IP) { - continue ifaceLoop - } - } - - if interfaceAddr6 != nil { - return nil, errMultipleIPs(intf.Name, intf.Name, interfaceAddr6, ipAddr.IP) - } - - interfaceAddr6 = ipAddr.IP - } - } - - // In the case that this interface has exactly one IPv4 address - // and exactly one IPv6 address, favor IPv4 over IPv6. - if interfaceAddr4 != nil { - if systemAddr != nil { - return nil, errMultipleIPs(systemInterface, intf.Name, systemAddr, interfaceAddr4) - } - systemAddr = interfaceAddr4 - systemInterface = intf.Name - } else if interfaceAddr6 != nil { - if systemAddr != nil { - return nil, errMultipleIPs(systemInterface, intf.Name, systemAddr, interfaceAddr6) - } - systemAddr = interfaceAddr6 - systemInterface = intf.Name - } - } - - if systemAddr == nil { - return nil, errNoIP - } - - return systemAddr, nil -} - -func listSystemIPs() []net.IP { - interfaces, err := net.Interfaces() - if err != nil { - return nil - } - - var systemAddrs []net.IP - - for _, intf := range interfaces { - addrs, err := intf.Addrs() - if err != nil { - continue - } - - for _, addr := range addrs { - ipAddr, ok := addr.(*net.IPNet) - - if ok { - systemAddrs = append(systemAddrs, ipAddr.IP) - } - } - } - - return systemAddrs -} - -func errMultipleIPs(interfaceA, interfaceB string, addrA, addrB net.IP) error { - if interfaceA == interfaceB { - return fmt.Errorf("could not choose an IP address to advertise since this system has multiple addresses on interface %s (%s and %s)", interfaceA, addrA, addrB) - } - return fmt.Errorf("could not choose an IP address to advertise since this system has multiple addresses on different interfaces (%s on %s and %s on %s)", addrA, interfaceA, addrB, interfaceB) -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/listen_addr_linux.go b/vendor/github.com/docker/docker/daemon/cluster/listen_addr_linux.go deleted file mode 100644 index 3d4f239bd..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/listen_addr_linux.go +++ /dev/null @@ -1,91 +0,0 @@ -// +build linux - -package cluster - -import ( - "net" - - "github.com/vishvananda/netlink" -) - -func (c *Cluster) resolveSystemAddr() (net.IP, error) { - // Use the system's only device IP address, or fail if there are - // multiple addresses to choose from. - interfaces, err := netlink.LinkList() - if err != nil { - return nil, err - } - - var ( - systemAddr net.IP - systemInterface string - deviceFound bool - ) - - for _, intf := range interfaces { - // Skip non device or inactive interfaces - if intf.Type() != "device" || intf.Attrs().Flags&net.FlagUp == 0 { - continue - } - - addrs, err := netlink.AddrList(intf, netlink.FAMILY_ALL) - if err != nil { - continue - } - - var interfaceAddr4, interfaceAddr6 net.IP - - for _, addr := range addrs { - ipAddr := addr.IPNet.IP - - // Skip loopback and link-local addresses - if !ipAddr.IsGlobalUnicast() { - continue - } - - // At least one non-loopback device is found and it is administratively up - deviceFound = true - - if ipAddr.To4() != nil { - if interfaceAddr4 != nil { - return nil, errMultipleIPs(intf.Attrs().Name, intf.Attrs().Name, interfaceAddr4, ipAddr) - } - interfaceAddr4 = ipAddr - } else { - if interfaceAddr6 != nil { - return nil, errMultipleIPs(intf.Attrs().Name, intf.Attrs().Name, interfaceAddr6, ipAddr) - } - interfaceAddr6 = ipAddr - } - } - - // In the case that this interface has exactly one IPv4 address - // and exactly one IPv6 address, favor IPv4 over IPv6. - if interfaceAddr4 != nil { - if systemAddr != nil { - return nil, errMultipleIPs(systemInterface, intf.Attrs().Name, systemAddr, interfaceAddr4) - } - systemAddr = interfaceAddr4 - systemInterface = intf.Attrs().Name - } else if interfaceAddr6 != nil { - if systemAddr != nil { - return nil, errMultipleIPs(systemInterface, intf.Attrs().Name, systemAddr, interfaceAddr6) - } - systemAddr = interfaceAddr6 - systemInterface = intf.Attrs().Name - } - } - - if systemAddr == nil { - if !deviceFound { - // If no non-loopback device type interface is found, - // fall back to the regular auto-detection mechanism. - // This is to cover the case where docker is running - // inside a container (eths are in fact veths). - return c.resolveSystemAddrViaSubnetCheck() - } - return nil, errNoIP - } - - return systemAddr, nil -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/listen_addr_others.go b/vendor/github.com/docker/docker/daemon/cluster/listen_addr_others.go deleted file mode 100644 index 4e845f5c8..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/listen_addr_others.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build !linux,!solaris - -package cluster - -import "net" - -func (c *Cluster) resolveSystemAddr() (net.IP, error) { - return c.resolveSystemAddrViaSubnetCheck() -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/listen_addr_solaris.go b/vendor/github.com/docker/docker/daemon/cluster/listen_addr_solaris.go deleted file mode 100644 index 57a894b25..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/listen_addr_solaris.go +++ /dev/null @@ -1,57 +0,0 @@ -package cluster - -import ( - "bufio" - "fmt" - "net" - "os/exec" - "strings" -) - -func (c *Cluster) resolveSystemAddr() (net.IP, error) { - defRouteCmd := "/usr/sbin/ipadm show-addr -p -o addr " + - "`/usr/sbin/route get default | /usr/bin/grep interface | " + - "/usr/bin/awk '{print $2}'`" - out, err := exec.Command("/usr/bin/bash", "-c", defRouteCmd).Output() - if err != nil { - return nil, fmt.Errorf("cannot get default route: %v", err) - } - - defInterface := strings.SplitN(string(out), "/", 2) - defInterfaceIP := net.ParseIP(defInterface[0]) - - return defInterfaceIP, nil -} - -func listSystemIPs() []net.IP { - var systemAddrs []net.IP - cmd := exec.Command("/usr/sbin/ipadm", "show-addr", "-p", "-o", "addr") - cmdReader, err := cmd.StdoutPipe() - if err != nil { - return nil - } - - if err := cmd.Start(); err != nil { - return nil - } - - scanner := bufio.NewScanner(cmdReader) - go func() { - for scanner.Scan() { - text := scanner.Text() - nameAddrPair := strings.SplitN(text, "/", 2) - // Let go of loopback interfaces and docker interfaces - systemAddrs = append(systemAddrs, net.ParseIP(nameAddrPair[0])) - } - }() - - if err := scanner.Err(); err != nil { - fmt.Printf("scan underwent err: %+v\n", err) - } - - if err := cmd.Wait(); err != nil { - fmt.Printf("run command wait: %+v\n", err) - } - - return systemAddrs -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/provider/network.go b/vendor/github.com/docker/docker/daemon/cluster/provider/network.go deleted file mode 100644 index f4c72ae13..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/provider/network.go +++ /dev/null @@ -1,37 +0,0 @@ -package provider - -import "github.com/docker/docker/api/types" - -// NetworkCreateRequest is a request when creating a network. -type NetworkCreateRequest struct { - ID string - types.NetworkCreateRequest -} - -// NetworkCreateResponse is a response when creating a network. -type NetworkCreateResponse struct { - ID string `json:"Id"` -} - -// VirtualAddress represents a virtual address. -type VirtualAddress struct { - IPv4 string - IPv6 string -} - -// PortConfig represents a port configuration. -type PortConfig struct { - Name string - Protocol int32 - TargetPort uint32 - PublishedPort uint32 -} - -// ServiceConfig represents a service configuration. -type ServiceConfig struct { - ID string - Name string - Aliases map[string][]string - VirtualAddresses map[string]*VirtualAddress - ExposedPorts []*PortConfig -} diff --git a/vendor/github.com/docker/docker/daemon/cluster/secrets.go b/vendor/github.com/docker/docker/daemon/cluster/secrets.go deleted file mode 100644 index 2b9eb5da1..000000000 --- a/vendor/github.com/docker/docker/daemon/cluster/secrets.go +++ /dev/null @@ -1,133 +0,0 @@ -package cluster - -import ( - apitypes "github.com/docker/docker/api/types" - types "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/daemon/cluster/convert" - swarmapi "github.com/docker/swarmkit/api" -) - -// GetSecret returns a secret from a managed swarm cluster -func (c *Cluster) GetSecret(id string) (types.Secret, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return types.Secret{}, c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - r, err := c.node.client.GetSecret(ctx, &swarmapi.GetSecretRequest{SecretID: id}) - if err != nil { - return types.Secret{}, err - } - - return convert.SecretFromGRPC(r.Secret), nil -} - -// GetSecrets returns all secrets of a managed swarm cluster. -func (c *Cluster) GetSecrets(options apitypes.SecretListOptions) ([]types.Secret, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return nil, c.errNoManager() - } - - filters, err := newListSecretsFilters(options.Filters) - if err != nil { - return nil, err - } - ctx, cancel := c.getRequestContext() - defer cancel() - - r, err := c.node.client.ListSecrets(ctx, - &swarmapi.ListSecretsRequest{Filters: filters}) - if err != nil { - return nil, err - } - - secrets := []types.Secret{} - - for _, secret := range r.Secrets { - secrets = append(secrets, convert.SecretFromGRPC(secret)) - } - - return secrets, nil -} - -// CreateSecret creates a new secret in a managed swarm cluster. -func (c *Cluster) CreateSecret(s types.SecretSpec) (string, error) { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return "", c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - secretSpec := convert.SecretSpecToGRPC(s) - - r, err := c.node.client.CreateSecret(ctx, - &swarmapi.CreateSecretRequest{Spec: &secretSpec}) - if err != nil { - return "", err - } - - return r.Secret.ID, nil -} - -// RemoveSecret removes a secret from a managed swarm cluster. -func (c *Cluster) RemoveSecret(id string) error { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - req := &swarmapi.RemoveSecretRequest{ - SecretID: id, - } - - if _, err := c.node.client.RemoveSecret(ctx, req); err != nil { - return err - } - return nil -} - -// UpdateSecret updates a secret in a managed swarm cluster. -// Note: this is not exposed to the CLI but is available from the API only -func (c *Cluster) UpdateSecret(id string, version uint64, spec types.SecretSpec) error { - c.RLock() - defer c.RUnlock() - - if !c.isActiveManager() { - return c.errNoManager() - } - - ctx, cancel := c.getRequestContext() - defer cancel() - - secretSpec := convert.SecretSpecToGRPC(spec) - - if _, err := c.client.UpdateSecret(ctx, - &swarmapi.UpdateSecretRequest{ - SecretID: id, - SecretVersion: &swarmapi.Version{ - Index: version, - }, - Spec: &secretSpec, - }); err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/commit.go b/vendor/github.com/docker/docker/daemon/commit.go deleted file mode 100644 index 1e7bffb1d..000000000 --- a/vendor/github.com/docker/docker/daemon/commit.go +++ /dev/null @@ -1,271 +0,0 @@ -package daemon - -import ( - "encoding/json" - "fmt" - "io" - "runtime" - "strings" - "time" - - "github.com/docker/docker/api/types/backend" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/builder/dockerfile" - "github.com/docker/docker/container" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/reference" -) - -// merge merges two Config, the image container configuration (defaults values), -// and the user container configuration, either passed by the API or generated -// by the cli. -// It will mutate the specified user configuration (userConf) with the image -// configuration where the user configuration is incomplete. -func merge(userConf, imageConf *containertypes.Config) error { - if userConf.User == "" { - userConf.User = imageConf.User - } - if len(userConf.ExposedPorts) == 0 { - userConf.ExposedPorts = imageConf.ExposedPorts - } else if imageConf.ExposedPorts != nil { - for port := range imageConf.ExposedPorts { - if _, exists := userConf.ExposedPorts[port]; !exists { - userConf.ExposedPorts[port] = struct{}{} - } - } - } - - if len(userConf.Env) == 0 { - userConf.Env = imageConf.Env - } else { - for _, imageEnv := range imageConf.Env { - found := false - imageEnvKey := strings.Split(imageEnv, "=")[0] - for _, userEnv := range userConf.Env { - userEnvKey := strings.Split(userEnv, "=")[0] - if runtime.GOOS == "windows" { - // Case insensitive environment variables on Windows - imageEnvKey = strings.ToUpper(imageEnvKey) - userEnvKey = strings.ToUpper(userEnvKey) - } - if imageEnvKey == userEnvKey { - found = true - break - } - } - if !found { - userConf.Env = append(userConf.Env, imageEnv) - } - } - } - - if userConf.Labels == nil { - userConf.Labels = map[string]string{} - } - for l, v := range imageConf.Labels { - if _, ok := userConf.Labels[l]; !ok { - userConf.Labels[l] = v - } - } - - if len(userConf.Entrypoint) == 0 { - if len(userConf.Cmd) == 0 { - userConf.Cmd = imageConf.Cmd - userConf.ArgsEscaped = imageConf.ArgsEscaped - } - - if userConf.Entrypoint == nil { - userConf.Entrypoint = imageConf.Entrypoint - } - } - if imageConf.Healthcheck != nil { - if userConf.Healthcheck == nil { - userConf.Healthcheck = imageConf.Healthcheck - } else { - if len(userConf.Healthcheck.Test) == 0 { - userConf.Healthcheck.Test = imageConf.Healthcheck.Test - } - if userConf.Healthcheck.Interval == 0 { - userConf.Healthcheck.Interval = imageConf.Healthcheck.Interval - } - if userConf.Healthcheck.Timeout == 0 { - userConf.Healthcheck.Timeout = imageConf.Healthcheck.Timeout - } - if userConf.Healthcheck.Retries == 0 { - userConf.Healthcheck.Retries = imageConf.Healthcheck.Retries - } - } - } - - if userConf.WorkingDir == "" { - userConf.WorkingDir = imageConf.WorkingDir - } - if len(userConf.Volumes) == 0 { - userConf.Volumes = imageConf.Volumes - } else { - for k, v := range imageConf.Volumes { - userConf.Volumes[k] = v - } - } - - if userConf.StopSignal == "" { - userConf.StopSignal = imageConf.StopSignal - } - return nil -} - -// Commit creates a new filesystem image from the current state of a container. -// The image can optionally be tagged into a repository. -func (daemon *Daemon) Commit(name string, c *backend.ContainerCommitConfig) (string, error) { - start := time.Now() - container, err := daemon.GetContainer(name) - if err != nil { - return "", err - } - - // It is not possible to commit a running container on Windows and on Solaris. - if (runtime.GOOS == "windows" || runtime.GOOS == "solaris") && container.IsRunning() { - return "", fmt.Errorf("%+v does not support commit of a running container", runtime.GOOS) - } - - if c.Pause && !container.IsPaused() { - daemon.containerPause(container) - defer daemon.containerUnpause(container) - } - - newConfig, err := dockerfile.BuildFromConfig(c.Config, c.Changes) - if err != nil { - return "", err - } - - if c.MergeConfigs { - if err := merge(newConfig, container.Config); err != nil { - return "", err - } - } - - rwTar, err := daemon.exportContainerRw(container) - if err != nil { - return "", err - } - defer func() { - if rwTar != nil { - rwTar.Close() - } - }() - - var history []image.History - rootFS := image.NewRootFS() - osVersion := "" - var osFeatures []string - - if container.ImageID != "" { - img, err := daemon.imageStore.Get(container.ImageID) - if err != nil { - return "", err - } - history = img.History - rootFS = img.RootFS - osVersion = img.OSVersion - osFeatures = img.OSFeatures - } - - l, err := daemon.layerStore.Register(rwTar, rootFS.ChainID()) - if err != nil { - return "", err - } - defer layer.ReleaseAndLog(daemon.layerStore, l) - - h := image.History{ - Author: c.Author, - Created: time.Now().UTC(), - CreatedBy: strings.Join(container.Config.Cmd, " "), - Comment: c.Comment, - EmptyLayer: true, - } - - if diffID := l.DiffID(); layer.DigestSHA256EmptyTar != diffID { - h.EmptyLayer = false - rootFS.Append(diffID) - } - - history = append(history, h) - - config, err := json.Marshal(&image.Image{ - V1Image: image.V1Image{ - DockerVersion: dockerversion.Version, - Config: newConfig, - Architecture: runtime.GOARCH, - OS: runtime.GOOS, - Container: container.ID, - ContainerConfig: *container.Config, - Author: c.Author, - Created: h.Created, - }, - RootFS: rootFS, - History: history, - OSFeatures: osFeatures, - OSVersion: osVersion, - }) - - if err != nil { - return "", err - } - - id, err := daemon.imageStore.Create(config) - if err != nil { - return "", err - } - - if container.ImageID != "" { - if err := daemon.imageStore.SetParent(id, container.ImageID); err != nil { - return "", err - } - } - - imageRef := "" - if c.Repo != "" { - newTag, err := reference.WithName(c.Repo) // todo: should move this to API layer - if err != nil { - return "", err - } - if c.Tag != "" { - if newTag, err = reference.WithTag(newTag, c.Tag); err != nil { - return "", err - } - } - if err := daemon.TagImageWithReference(id, newTag); err != nil { - return "", err - } - imageRef = newTag.String() - } - - attributes := map[string]string{ - "comment": c.Comment, - "imageID": id.String(), - "imageRef": imageRef, - } - daemon.LogContainerEventWithAttributes(container, "commit", attributes) - containerActions.WithValues("commit").UpdateSince(start) - return id.String(), nil -} - -func (daemon *Daemon) exportContainerRw(container *container.Container) (io.ReadCloser, error) { - if err := daemon.Mount(container); err != nil { - return nil, err - } - - archive, err := container.RWLayer.TarStream() - if err != nil { - daemon.Unmount(container) // logging is already handled in the `Unmount` function - return nil, err - } - return ioutils.NewReadCloserWrapper(archive, func() error { - archive.Close() - return container.RWLayer.Unmount() - }), - nil -} diff --git a/vendor/github.com/docker/docker/daemon/config.go b/vendor/github.com/docker/docker/daemon/config.go deleted file mode 100644 index 42ef18f74..000000000 --- a/vendor/github.com/docker/docker/daemon/config.go +++ /dev/null @@ -1,525 +0,0 @@ -package daemon - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "runtime" - "strings" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/discovery" - "github.com/docker/docker/registry" - "github.com/imdario/mergo" - "github.com/spf13/pflag" -) - -const ( - // defaultMaxConcurrentDownloads is the default value for - // maximum number of downloads that - // may take place at a time for each pull. - defaultMaxConcurrentDownloads = 3 - // defaultMaxConcurrentUploads is the default value for - // maximum number of uploads that - // may take place at a time for each push. - defaultMaxConcurrentUploads = 5 - // stockRuntimeName is the reserved name/alias used to represent the - // OCI runtime being shipped with the docker daemon package. - stockRuntimeName = "runc" -) - -const ( - defaultNetworkMtu = 1500 - disableNetworkBridge = "none" -) - -const ( - defaultShutdownTimeout = 15 -) - -// flatOptions contains configuration keys -// that MUST NOT be parsed as deep structures. -// Use this to differentiate these options -// with others like the ones in CommonTLSOptions. -var flatOptions = map[string]bool{ - "cluster-store-opts": true, - "log-opts": true, - "runtimes": true, - "default-ulimits": true, -} - -// LogConfig represents the default log configuration. -// It includes json tags to deserialize configuration from a file -// using the same names that the flags in the command line use. -type LogConfig struct { - Type string `json:"log-driver,omitempty"` - Config map[string]string `json:"log-opts,omitempty"` -} - -// commonBridgeConfig stores all the platform-common bridge driver specific -// configuration. -type commonBridgeConfig struct { - Iface string `json:"bridge,omitempty"` - FixedCIDR string `json:"fixed-cidr,omitempty"` -} - -// CommonTLSOptions defines TLS configuration for the daemon server. -// It includes json tags to deserialize configuration from a file -// using the same names that the flags in the command line use. -type CommonTLSOptions struct { - CAFile string `json:"tlscacert,omitempty"` - CertFile string `json:"tlscert,omitempty"` - KeyFile string `json:"tlskey,omitempty"` -} - -// CommonConfig defines the configuration of a docker daemon which is -// common across platforms. -// It includes json tags to deserialize configuration from a file -// using the same names that the flags in the command line use. -type CommonConfig struct { - AuthorizationPlugins []string `json:"authorization-plugins,omitempty"` // AuthorizationPlugins holds list of authorization plugins - AutoRestart bool `json:"-"` - Context map[string][]string `json:"-"` - DisableBridge bool `json:"-"` - DNS []string `json:"dns,omitempty"` - DNSOptions []string `json:"dns-opts,omitempty"` - DNSSearch []string `json:"dns-search,omitempty"` - ExecOptions []string `json:"exec-opts,omitempty"` - GraphDriver string `json:"storage-driver,omitempty"` - GraphOptions []string `json:"storage-opts,omitempty"` - Labels []string `json:"labels,omitempty"` - Mtu int `json:"mtu,omitempty"` - Pidfile string `json:"pidfile,omitempty"` - RawLogs bool `json:"raw-logs,omitempty"` - Root string `json:"graph,omitempty"` - SocketGroup string `json:"group,omitempty"` - TrustKeyPath string `json:"-"` - CorsHeaders string `json:"api-cors-header,omitempty"` - EnableCors bool `json:"api-enable-cors,omitempty"` - - // LiveRestoreEnabled determines whether we should keep containers - // alive upon daemon shutdown/start - LiveRestoreEnabled bool `json:"live-restore,omitempty"` - - // ClusterStore is the storage backend used for the cluster information. It is used by both - // multihost networking (to store networks and endpoints information) and by the node discovery - // mechanism. - ClusterStore string `json:"cluster-store,omitempty"` - - // ClusterOpts is used to pass options to the discovery package for tuning libkv settings, such - // as TLS configuration settings. - ClusterOpts map[string]string `json:"cluster-store-opts,omitempty"` - - // ClusterAdvertise is the network endpoint that the Engine advertises for the purpose of node - // discovery. This should be a 'host:port' combination on which that daemon instance is - // reachable by other hosts. - ClusterAdvertise string `json:"cluster-advertise,omitempty"` - - // MaxConcurrentDownloads is the maximum number of downloads that - // may take place at a time for each pull. - MaxConcurrentDownloads *int `json:"max-concurrent-downloads,omitempty"` - - // MaxConcurrentUploads is the maximum number of uploads that - // may take place at a time for each push. - MaxConcurrentUploads *int `json:"max-concurrent-uploads,omitempty"` - - // ShutdownTimeout is the timeout value (in seconds) the daemon will wait for the container - // to stop when daemon is being shutdown - ShutdownTimeout int `json:"shutdown-timeout,omitempty"` - - Debug bool `json:"debug,omitempty"` - Hosts []string `json:"hosts,omitempty"` - LogLevel string `json:"log-level,omitempty"` - TLS bool `json:"tls,omitempty"` - TLSVerify bool `json:"tlsverify,omitempty"` - - // Embedded structs that allow config - // deserialization without the full struct. - CommonTLSOptions - - // SwarmDefaultAdvertiseAddr is the default host/IP or network interface - // to use if a wildcard address is specified in the ListenAddr value - // given to the /swarm/init endpoint and no advertise address is - // specified. - SwarmDefaultAdvertiseAddr string `json:"swarm-default-advertise-addr"` - MetricsAddress string `json:"metrics-addr"` - - LogConfig - bridgeConfig // bridgeConfig holds bridge network specific configuration. - registry.ServiceOptions - - reloadLock sync.Mutex - valuesSet map[string]interface{} - - Experimental bool `json:"experimental"` // Experimental indicates whether experimental features should be exposed or not -} - -// InstallCommonFlags adds flags to the pflag.FlagSet to configure the daemon -func (config *Config) InstallCommonFlags(flags *pflag.FlagSet) { - var maxConcurrentDownloads, maxConcurrentUploads int - - config.ServiceOptions.InstallCliFlags(flags) - - flags.Var(opts.NewNamedListOptsRef("storage-opts", &config.GraphOptions, nil), "storage-opt", "Storage driver options") - flags.Var(opts.NewNamedListOptsRef("authorization-plugins", &config.AuthorizationPlugins, nil), "authorization-plugin", "Authorization plugins to load") - flags.Var(opts.NewNamedListOptsRef("exec-opts", &config.ExecOptions, nil), "exec-opt", "Runtime execution options") - flags.StringVarP(&config.Pidfile, "pidfile", "p", defaultPidFile, "Path to use for daemon PID file") - flags.StringVarP(&config.Root, "graph", "g", defaultGraph, "Root of the Docker runtime") - flags.BoolVarP(&config.AutoRestart, "restart", "r", true, "--restart on the daemon has been deprecated in favor of --restart policies on docker run") - flags.MarkDeprecated("restart", "Please use a restart policy on docker run") - flags.StringVarP(&config.GraphDriver, "storage-driver", "s", "", "Storage driver to use") - flags.IntVar(&config.Mtu, "mtu", 0, "Set the containers network MTU") - flags.BoolVar(&config.RawLogs, "raw-logs", false, "Full timestamps without ANSI coloring") - // FIXME: why the inconsistency between "hosts" and "sockets"? - flags.Var(opts.NewListOptsRef(&config.DNS, opts.ValidateIPAddress), "dns", "DNS server to use") - flags.Var(opts.NewNamedListOptsRef("dns-opts", &config.DNSOptions, nil), "dns-opt", "DNS options to use") - flags.Var(opts.NewListOptsRef(&config.DNSSearch, opts.ValidateDNSSearch), "dns-search", "DNS search domains to use") - flags.Var(opts.NewNamedListOptsRef("labels", &config.Labels, opts.ValidateLabel), "label", "Set key=value labels to the daemon") - flags.StringVar(&config.LogConfig.Type, "log-driver", "json-file", "Default driver for container logs") - flags.Var(opts.NewNamedMapOpts("log-opts", config.LogConfig.Config, nil), "log-opt", "Default log driver options for containers") - flags.StringVar(&config.ClusterAdvertise, "cluster-advertise", "", "Address or interface name to advertise") - flags.StringVar(&config.ClusterStore, "cluster-store", "", "URL of the distributed storage backend") - flags.Var(opts.NewNamedMapOpts("cluster-store-opts", config.ClusterOpts, nil), "cluster-store-opt", "Set cluster store options") - flags.StringVar(&config.CorsHeaders, "api-cors-header", "", "Set CORS headers in the Engine API") - flags.IntVar(&maxConcurrentDownloads, "max-concurrent-downloads", defaultMaxConcurrentDownloads, "Set the max concurrent downloads for each pull") - flags.IntVar(&maxConcurrentUploads, "max-concurrent-uploads", defaultMaxConcurrentUploads, "Set the max concurrent uploads for each push") - flags.IntVar(&config.ShutdownTimeout, "shutdown-timeout", defaultShutdownTimeout, "Set the default shutdown timeout") - - flags.StringVar(&config.SwarmDefaultAdvertiseAddr, "swarm-default-advertise-addr", "", "Set default address or interface for swarm advertised address") - flags.BoolVar(&config.Experimental, "experimental", false, "Enable experimental features") - - flags.StringVar(&config.MetricsAddress, "metrics-addr", "", "Set default address and port to serve the metrics api on") - - config.MaxConcurrentDownloads = &maxConcurrentDownloads - config.MaxConcurrentUploads = &maxConcurrentUploads -} - -// IsValueSet returns true if a configuration value -// was explicitly set in the configuration file. -func (config *Config) IsValueSet(name string) bool { - if config.valuesSet == nil { - return false - } - _, ok := config.valuesSet[name] - return ok -} - -// NewConfig returns a new fully initialized Config struct -func NewConfig() *Config { - config := Config{} - config.LogConfig.Config = make(map[string]string) - config.ClusterOpts = make(map[string]string) - - if runtime.GOOS != "linux" { - config.V2Only = true - } - return &config -} - -func parseClusterAdvertiseSettings(clusterStore, clusterAdvertise string) (string, error) { - if runtime.GOOS == "solaris" && (clusterAdvertise != "" || clusterStore != "") { - return "", errors.New("Cluster Advertise Settings not supported on Solaris") - } - if clusterAdvertise == "" { - return "", errDiscoveryDisabled - } - if clusterStore == "" { - return "", fmt.Errorf("invalid cluster configuration. --cluster-advertise must be accompanied by --cluster-store configuration") - } - - advertise, err := discovery.ParseAdvertise(clusterAdvertise) - if err != nil { - return "", fmt.Errorf("discovery advertise parsing failed (%v)", err) - } - return advertise, nil -} - -// GetConflictFreeLabels validate Labels for conflict -// In swarm the duplicates for labels are removed -// so we only take same values here, no conflict values -// If the key-value is the same we will only take the last label -func GetConflictFreeLabels(labels []string) ([]string, error) { - labelMap := map[string]string{} - for _, label := range labels { - stringSlice := strings.SplitN(label, "=", 2) - if len(stringSlice) > 1 { - // If there is a conflict we will return an error - if v, ok := labelMap[stringSlice[0]]; ok && v != stringSlice[1] { - return nil, fmt.Errorf("conflict labels for %s=%s and %s=%s", stringSlice[0], stringSlice[1], stringSlice[0], v) - } - labelMap[stringSlice[0]] = stringSlice[1] - } - } - - newLabels := []string{} - for k, v := range labelMap { - newLabels = append(newLabels, fmt.Sprintf("%s=%s", k, v)) - } - return newLabels, nil -} - -// ReloadConfiguration reads the configuration in the host and reloads the daemon and server. -func ReloadConfiguration(configFile string, flags *pflag.FlagSet, reload func(*Config)) error { - logrus.Infof("Got signal to reload configuration, reloading from: %s", configFile) - newConfig, err := getConflictFreeConfiguration(configFile, flags) - if err != nil { - return err - } - - if err := ValidateConfiguration(newConfig); err != nil { - return fmt.Errorf("file configuration validation failed (%v)", err) - } - - // Labels of the docker engine used to allow multiple values associated with the same key. - // This is deprecated in 1.13, and, be removed after 3 release cycles. - // The following will check the conflict of labels, and report a warning for deprecation. - // - // TODO: After 3 release cycles (1.16) an error will be returned, and labels will be - // sanitized to consolidate duplicate key-value pairs (config.Labels = newLabels): - // - // newLabels, err := GetConflictFreeLabels(newConfig.Labels) - // if err != nil { - // return err - // } - // newConfig.Labels = newLabels - // - if _, err := GetConflictFreeLabels(newConfig.Labels); err != nil { - logrus.Warnf("Engine labels with duplicate keys and conflicting values have been deprecated: %s", err) - } - - reload(newConfig) - return nil -} - -// boolValue is an interface that boolean value flags implement -// to tell the command line how to make -name equivalent to -name=true. -type boolValue interface { - IsBoolFlag() bool -} - -// MergeDaemonConfigurations reads a configuration file, -// loads the file configuration in an isolated structure, -// and merges the configuration provided from flags on top -// if there are no conflicts. -func MergeDaemonConfigurations(flagsConfig *Config, flags *pflag.FlagSet, configFile string) (*Config, error) { - fileConfig, err := getConflictFreeConfiguration(configFile, flags) - if err != nil { - return nil, err - } - - if err := ValidateConfiguration(fileConfig); err != nil { - return nil, fmt.Errorf("file configuration validation failed (%v)", err) - } - - // merge flags configuration on top of the file configuration - if err := mergo.Merge(fileConfig, flagsConfig); err != nil { - return nil, err - } - - // We need to validate again once both fileConfig and flagsConfig - // have been merged - if err := ValidateConfiguration(fileConfig); err != nil { - return nil, fmt.Errorf("file configuration validation failed (%v)", err) - } - - return fileConfig, nil -} - -// getConflictFreeConfiguration loads the configuration from a JSON file. -// It compares that configuration with the one provided by the flags, -// and returns an error if there are conflicts. -func getConflictFreeConfiguration(configFile string, flags *pflag.FlagSet) (*Config, error) { - b, err := ioutil.ReadFile(configFile) - if err != nil { - return nil, err - } - - var config Config - var reader io.Reader - if flags != nil { - var jsonConfig map[string]interface{} - reader = bytes.NewReader(b) - if err := json.NewDecoder(reader).Decode(&jsonConfig); err != nil { - return nil, err - } - - configSet := configValuesSet(jsonConfig) - - if err := findConfigurationConflicts(configSet, flags); err != nil { - return nil, err - } - - // Override flag values to make sure the values set in the config file with nullable values, like `false`, - // are not overridden by default truthy values from the flags that were not explicitly set. - // See https://github.com/docker/docker/issues/20289 for an example. - // - // TODO: Rewrite configuration logic to avoid same issue with other nullable values, like numbers. - namedOptions := make(map[string]interface{}) - for key, value := range configSet { - f := flags.Lookup(key) - if f == nil { // ignore named flags that don't match - namedOptions[key] = value - continue - } - - if _, ok := f.Value.(boolValue); ok { - f.Value.Set(fmt.Sprintf("%v", value)) - } - } - if len(namedOptions) > 0 { - // set also default for mergeVal flags that are boolValue at the same time. - flags.VisitAll(func(f *pflag.Flag) { - if opt, named := f.Value.(opts.NamedOption); named { - v, set := namedOptions[opt.Name()] - _, boolean := f.Value.(boolValue) - if set && boolean { - f.Value.Set(fmt.Sprintf("%v", v)) - } - } - }) - } - - config.valuesSet = configSet - } - - reader = bytes.NewReader(b) - err = json.NewDecoder(reader).Decode(&config) - return &config, err -} - -// configValuesSet returns the configuration values explicitly set in the file. -func configValuesSet(config map[string]interface{}) map[string]interface{} { - flatten := make(map[string]interface{}) - for k, v := range config { - if m, isMap := v.(map[string]interface{}); isMap && !flatOptions[k] { - for km, vm := range m { - flatten[km] = vm - } - continue - } - - flatten[k] = v - } - return flatten -} - -// findConfigurationConflicts iterates over the provided flags searching for -// duplicated configurations and unknown keys. It returns an error with all the conflicts if -// it finds any. -func findConfigurationConflicts(config map[string]interface{}, flags *pflag.FlagSet) error { - // 1. Search keys from the file that we don't recognize as flags. - unknownKeys := make(map[string]interface{}) - for key, value := range config { - if flag := flags.Lookup(key); flag == nil { - unknownKeys[key] = value - } - } - - // 2. Discard values that implement NamedOption. - // Their configuration name differs from their flag name, like `labels` and `label`. - if len(unknownKeys) > 0 { - unknownNamedConflicts := func(f *pflag.Flag) { - if namedOption, ok := f.Value.(opts.NamedOption); ok { - if _, valid := unknownKeys[namedOption.Name()]; valid { - delete(unknownKeys, namedOption.Name()) - } - } - } - flags.VisitAll(unknownNamedConflicts) - } - - if len(unknownKeys) > 0 { - var unknown []string - for key := range unknownKeys { - unknown = append(unknown, key) - } - return fmt.Errorf("the following directives don't match any configuration option: %s", strings.Join(unknown, ", ")) - } - - var conflicts []string - printConflict := func(name string, flagValue, fileValue interface{}) string { - return fmt.Sprintf("%s: (from flag: %v, from file: %v)", name, flagValue, fileValue) - } - - // 3. Search keys that are present as a flag and as a file option. - duplicatedConflicts := func(f *pflag.Flag) { - // search option name in the json configuration payload if the value is a named option - if namedOption, ok := f.Value.(opts.NamedOption); ok { - if optsValue, ok := config[namedOption.Name()]; ok { - conflicts = append(conflicts, printConflict(namedOption.Name(), f.Value.String(), optsValue)) - } - } else { - // search flag name in the json configuration payload - for _, name := range []string{f.Name, f.Shorthand} { - if value, ok := config[name]; ok { - conflicts = append(conflicts, printConflict(name, f.Value.String(), value)) - break - } - } - } - } - - flags.Visit(duplicatedConflicts) - - if len(conflicts) > 0 { - return fmt.Errorf("the following directives are specified both as a flag and in the configuration file: %s", strings.Join(conflicts, ", ")) - } - return nil -} - -// ValidateConfiguration validates some specific configs. -// such as config.DNS, config.Labels, config.DNSSearch, -// as well as config.MaxConcurrentDownloads, config.MaxConcurrentUploads. -func ValidateConfiguration(config *Config) error { - // validate DNS - for _, dns := range config.DNS { - if _, err := opts.ValidateIPAddress(dns); err != nil { - return err - } - } - - // validate DNSSearch - for _, dnsSearch := range config.DNSSearch { - if _, err := opts.ValidateDNSSearch(dnsSearch); err != nil { - return err - } - } - - // validate Labels - for _, label := range config.Labels { - if _, err := opts.ValidateLabel(label); err != nil { - return err - } - } - - // validate MaxConcurrentDownloads - if config.IsValueSet("max-concurrent-downloads") && config.MaxConcurrentDownloads != nil && *config.MaxConcurrentDownloads < 0 { - return fmt.Errorf("invalid max concurrent downloads: %d", *config.MaxConcurrentDownloads) - } - - // validate MaxConcurrentUploads - if config.IsValueSet("max-concurrent-uploads") && config.MaxConcurrentUploads != nil && *config.MaxConcurrentUploads < 0 { - return fmt.Errorf("invalid max concurrent uploads: %d", *config.MaxConcurrentUploads) - } - - // validate that "default" runtime is not reset - if runtimes := config.GetAllRuntimes(); len(runtimes) > 0 { - if _, ok := runtimes[stockRuntimeName]; ok { - return fmt.Errorf("runtime name '%s' is reserved", stockRuntimeName) - } - } - - if defaultRuntime := config.GetDefaultRuntimeName(); defaultRuntime != "" && defaultRuntime != stockRuntimeName { - runtimes := config.GetAllRuntimes() - if _, ok := runtimes[defaultRuntime]; !ok { - return fmt.Errorf("specified default runtime '%s' does not exist", defaultRuntime) - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/config_common_unix.go b/vendor/github.com/docker/docker/daemon/config_common_unix.go deleted file mode 100644 index ab76fe7b1..000000000 --- a/vendor/github.com/docker/docker/daemon/config_common_unix.go +++ /dev/null @@ -1,90 +0,0 @@ -// +build solaris linux freebsd - -package daemon - -import ( - "net" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/opts" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/spf13/pflag" -) - -// CommonUnixConfig defines configuration of a docker daemon that is -// common across Unix platforms. -type CommonUnixConfig struct { - ExecRoot string `json:"exec-root,omitempty"` - ContainerdAddr string `json:"containerd,omitempty"` - Runtimes map[string]types.Runtime `json:"runtimes,omitempty"` - DefaultRuntime string `json:"default-runtime,omitempty"` -} - -type commonUnixBridgeConfig struct { - DefaultIP net.IP `json:"ip,omitempty"` - IP string `json:"bip,omitempty"` - DefaultGatewayIPv4 net.IP `json:"default-gateway,omitempty"` - DefaultGatewayIPv6 net.IP `json:"default-gateway-v6,omitempty"` - InterContainerCommunication bool `json:"icc,omitempty"` -} - -// InstallCommonUnixFlags adds command-line options to the top-level flag parser for -// the current process that are common across Unix platforms. -func (config *Config) InstallCommonUnixFlags(flags *pflag.FlagSet) { - config.Runtimes = make(map[string]types.Runtime) - - flags.StringVarP(&config.SocketGroup, "group", "G", "docker", "Group for the unix socket") - flags.StringVar(&config.bridgeConfig.IP, "bip", "", "Specify network bridge IP") - flags.StringVarP(&config.bridgeConfig.Iface, "bridge", "b", "", "Attach containers to a network bridge") - flags.StringVar(&config.bridgeConfig.FixedCIDR, "fixed-cidr", "", "IPv4 subnet for fixed IPs") - flags.Var(opts.NewIPOpt(&config.bridgeConfig.DefaultGatewayIPv4, ""), "default-gateway", "Container default gateway IPv4 address") - flags.Var(opts.NewIPOpt(&config.bridgeConfig.DefaultGatewayIPv6, ""), "default-gateway-v6", "Container default gateway IPv6 address") - flags.BoolVar(&config.bridgeConfig.InterContainerCommunication, "icc", true, "Enable inter-container communication") - flags.Var(opts.NewIPOpt(&config.bridgeConfig.DefaultIP, "0.0.0.0"), "ip", "Default IP when binding container ports") - flags.Var(runconfigopts.NewNamedRuntimeOpt("runtimes", &config.Runtimes, stockRuntimeName), "add-runtime", "Register an additional OCI compatible runtime") - flags.StringVar(&config.DefaultRuntime, "default-runtime", stockRuntimeName, "Default OCI runtime for containers") - -} - -// GetRuntime returns the runtime path and arguments for a given -// runtime name -func (config *Config) GetRuntime(name string) *types.Runtime { - config.reloadLock.Lock() - defer config.reloadLock.Unlock() - if rt, ok := config.Runtimes[name]; ok { - return &rt - } - return nil -} - -// GetDefaultRuntimeName returns the current default runtime -func (config *Config) GetDefaultRuntimeName() string { - config.reloadLock.Lock() - rt := config.DefaultRuntime - config.reloadLock.Unlock() - - return rt -} - -// GetAllRuntimes returns a copy of the runtimes map -func (config *Config) GetAllRuntimes() map[string]types.Runtime { - config.reloadLock.Lock() - rts := config.Runtimes - config.reloadLock.Unlock() - return rts -} - -// GetExecRoot returns the user configured Exec-root -func (config *Config) GetExecRoot() string { - return config.ExecRoot -} - -// GetInitPath returns the configure docker-init path -func (config *Config) GetInitPath() string { - config.reloadLock.Lock() - defer config.reloadLock.Unlock() - if config.InitPath != "" { - return config.InitPath - } - return DefaultInitBinary -} diff --git a/vendor/github.com/docker/docker/daemon/config_experimental.go b/vendor/github.com/docker/docker/daemon/config_experimental.go deleted file mode 100644 index 963a51e5a..000000000 --- a/vendor/github.com/docker/docker/daemon/config_experimental.go +++ /dev/null @@ -1,8 +0,0 @@ -package daemon - -import ( - "github.com/spf13/pflag" -) - -func (config *Config) attachExperimentalFlags(cmd *pflag.FlagSet) { -} diff --git a/vendor/github.com/docker/docker/daemon/config_solaris.go b/vendor/github.com/docker/docker/daemon/config_solaris.go deleted file mode 100644 index bc18ccd7e..000000000 --- a/vendor/github.com/docker/docker/daemon/config_solaris.go +++ /dev/null @@ -1,47 +0,0 @@ -package daemon - -import ( - "github.com/spf13/pflag" -) - -var ( - defaultPidFile = "/system/volatile/docker/docker.pid" - defaultGraph = "/var/lib/docker" - defaultExec = "zones" -) - -// Config defines the configuration of a docker daemon. -// These are the configuration settings that you pass -// to the docker daemon when you launch it with say: `docker -d -e lxc` -type Config struct { - CommonConfig - - // These fields are common to all unix platforms. - CommonUnixConfig -} - -// bridgeConfig stores all the bridge driver specific -// configuration. -type bridgeConfig struct { - commonBridgeConfig - - // Fields below here are platform specific. - commonUnixBridgeConfig -} - -// InstallFlags adds command-line options to the top-level flag parser for -// the current process. -func (config *Config) InstallFlags(flags *pflag.FlagSet) { - // First handle install flags which are consistent cross-platform - config.InstallCommonFlags(flags) - - // Then install flags common to unix platforms - config.InstallCommonUnixFlags(flags) - - // Then platform-specific install flags - config.attachExperimentalFlags(flags) -} - -func (config *Config) isSwarmCompatible() error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/config_test.go b/vendor/github.com/docker/docker/daemon/config_test.go deleted file mode 100644 index 90f6a1277..000000000 --- a/vendor/github.com/docker/docker/daemon/config_test.go +++ /dev/null @@ -1,229 +0,0 @@ -package daemon - -import ( - "io/ioutil" - "os" - "runtime" - "strings" - "testing" - - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/testutil/assert" - "github.com/spf13/pflag" -) - -func TestDaemonConfigurationNotFound(t *testing.T) { - _, err := MergeDaemonConfigurations(&Config{}, nil, "/tmp/foo-bar-baz-docker") - if err == nil || !os.IsNotExist(err) { - t.Fatalf("expected does not exist error, got %v", err) - } -} - -func TestDaemonBrokenConfiguration(t *testing.T) { - f, err := ioutil.TempFile("", "docker-config-") - if err != nil { - t.Fatal(err) - } - - configFile := f.Name() - f.Write([]byte(`{"Debug": tru`)) - f.Close() - - _, err = MergeDaemonConfigurations(&Config{}, nil, configFile) - if err == nil { - t.Fatalf("expected error, got %v", err) - } -} - -func TestParseClusterAdvertiseSettings(t *testing.T) { - if runtime.GOOS == "solaris" { - t.Skip("ClusterSettings not supported on Solaris\n") - } - _, err := parseClusterAdvertiseSettings("something", "") - if err != errDiscoveryDisabled { - t.Fatalf("expected discovery disabled error, got %v\n", err) - } - - _, err = parseClusterAdvertiseSettings("", "something") - if err == nil { - t.Fatalf("expected discovery store error, got %v\n", err) - } - - _, err = parseClusterAdvertiseSettings("etcd", "127.0.0.1:8080") - if err != nil { - t.Fatal(err) - } -} - -func TestFindConfigurationConflicts(t *testing.T) { - config := map[string]interface{}{"authorization-plugins": "foobar"} - flags := pflag.NewFlagSet("test", pflag.ContinueOnError) - - flags.String("authorization-plugins", "", "") - assert.NilError(t, flags.Set("authorization-plugins", "asdf")) - - assert.Error(t, - findConfigurationConflicts(config, flags), - "authorization-plugins: (from flag: asdf, from file: foobar)") -} - -func TestFindConfigurationConflictsWithNamedOptions(t *testing.T) { - config := map[string]interface{}{"hosts": []string{"qwer"}} - flags := pflag.NewFlagSet("test", pflag.ContinueOnError) - - var hosts []string - flags.VarP(opts.NewNamedListOptsRef("hosts", &hosts, opts.ValidateHost), "host", "H", "Daemon socket(s) to connect to") - assert.NilError(t, flags.Set("host", "tcp://127.0.0.1:4444")) - assert.NilError(t, flags.Set("host", "unix:///var/run/docker.sock")) - - assert.Error(t, findConfigurationConflicts(config, flags), "hosts") -} - -func TestDaemonConfigurationMergeConflicts(t *testing.T) { - f, err := ioutil.TempFile("", "docker-config-") - if err != nil { - t.Fatal(err) - } - - configFile := f.Name() - f.Write([]byte(`{"debug": true}`)) - f.Close() - - flags := pflag.NewFlagSet("test", pflag.ContinueOnError) - flags.Bool("debug", false, "") - flags.Set("debug", "false") - - _, err = MergeDaemonConfigurations(&Config{}, flags, configFile) - if err == nil { - t.Fatal("expected error, got nil") - } - if !strings.Contains(err.Error(), "debug") { - t.Fatalf("expected debug conflict, got %v", err) - } -} - -func TestDaemonConfigurationMergeConflictsWithInnerStructs(t *testing.T) { - f, err := ioutil.TempFile("", "docker-config-") - if err != nil { - t.Fatal(err) - } - - configFile := f.Name() - f.Write([]byte(`{"tlscacert": "/etc/certificates/ca.pem"}`)) - f.Close() - - flags := pflag.NewFlagSet("test", pflag.ContinueOnError) - flags.String("tlscacert", "", "") - flags.Set("tlscacert", "~/.docker/ca.pem") - - _, err = MergeDaemonConfigurations(&Config{}, flags, configFile) - if err == nil { - t.Fatal("expected error, got nil") - } - if !strings.Contains(err.Error(), "tlscacert") { - t.Fatalf("expected tlscacert conflict, got %v", err) - } -} - -func TestFindConfigurationConflictsWithUnknownKeys(t *testing.T) { - config := map[string]interface{}{"tls-verify": "true"} - flags := pflag.NewFlagSet("test", pflag.ContinueOnError) - - flags.Bool("tlsverify", false, "") - err := findConfigurationConflicts(config, flags) - if err == nil { - t.Fatal("expected error, got nil") - } - if !strings.Contains(err.Error(), "the following directives don't match any configuration option: tls-verify") { - t.Fatalf("expected tls-verify conflict, got %v", err) - } -} - -func TestFindConfigurationConflictsWithMergedValues(t *testing.T) { - var hosts []string - config := map[string]interface{}{"hosts": "tcp://127.0.0.1:2345"} - flags := pflag.NewFlagSet("base", pflag.ContinueOnError) - flags.VarP(opts.NewNamedListOptsRef("hosts", &hosts, nil), "host", "H", "") - - err := findConfigurationConflicts(config, flags) - if err != nil { - t.Fatal(err) - } - - flags.Set("host", "unix:///var/run/docker.sock") - err = findConfigurationConflicts(config, flags) - if err == nil { - t.Fatal("expected error, got nil") - } - if !strings.Contains(err.Error(), "hosts: (from flag: [unix:///var/run/docker.sock], from file: tcp://127.0.0.1:2345)") { - t.Fatalf("expected hosts conflict, got %v", err) - } -} - -func TestValidateConfiguration(t *testing.T) { - c1 := &Config{ - CommonConfig: CommonConfig{ - Labels: []string{"one"}, - }, - } - - err := ValidateConfiguration(c1) - if err == nil { - t.Fatal("expected error, got nil") - } - - c2 := &Config{ - CommonConfig: CommonConfig{ - Labels: []string{"one=two"}, - }, - } - - err = ValidateConfiguration(c2) - if err != nil { - t.Fatalf("expected no error, got error %v", err) - } - - c3 := &Config{ - CommonConfig: CommonConfig{ - DNS: []string{"1.1.1.1"}, - }, - } - - err = ValidateConfiguration(c3) - if err != nil { - t.Fatalf("expected no error, got error %v", err) - } - - c4 := &Config{ - CommonConfig: CommonConfig{ - DNS: []string{"1.1.1.1o"}, - }, - } - - err = ValidateConfiguration(c4) - if err == nil { - t.Fatal("expected error, got nil") - } - - c5 := &Config{ - CommonConfig: CommonConfig{ - DNSSearch: []string{"a.b.c"}, - }, - } - - err = ValidateConfiguration(c5) - if err != nil { - t.Fatalf("expected no error, got error %v", err) - } - - c6 := &Config{ - CommonConfig: CommonConfig{ - DNSSearch: []string{"123456"}, - }, - } - - err = ValidateConfiguration(c6) - if err == nil { - t.Fatal("expected error, got nil") - } -} diff --git a/vendor/github.com/docker/docker/daemon/config_unix.go b/vendor/github.com/docker/docker/daemon/config_unix.go deleted file mode 100644 index d0957884b..000000000 --- a/vendor/github.com/docker/docker/daemon/config_unix.go +++ /dev/null @@ -1,104 +0,0 @@ -// +build linux freebsd - -package daemon - -import ( - "fmt" - - runconfigopts "github.com/docker/docker/runconfig/opts" - units "github.com/docker/go-units" - "github.com/spf13/pflag" -) - -var ( - defaultPidFile = "/var/run/docker.pid" - defaultGraph = "/var/lib/docker" - defaultExecRoot = "/var/run/docker" -) - -// Config defines the configuration of a docker daemon. -// It includes json tags to deserialize configuration from a file -// using the same names that the flags in the command line uses. -type Config struct { - CommonConfig - - // These fields are common to all unix platforms. - CommonUnixConfig - - // Fields below here are platform specific. - CgroupParent string `json:"cgroup-parent,omitempty"` - EnableSelinuxSupport bool `json:"selinux-enabled,omitempty"` - RemappedRoot string `json:"userns-remap,omitempty"` - Ulimits map[string]*units.Ulimit `json:"default-ulimits,omitempty"` - CPURealtimePeriod int64 `json:"cpu-rt-period,omitempty"` - CPURealtimeRuntime int64 `json:"cpu-rt-runtime,omitempty"` - OOMScoreAdjust int `json:"oom-score-adjust,omitempty"` - Init bool `json:"init,omitempty"` - InitPath string `json:"init-path,omitempty"` - SeccompProfile string `json:"seccomp-profile,omitempty"` -} - -// bridgeConfig stores all the bridge driver specific -// configuration. -type bridgeConfig struct { - commonBridgeConfig - - // These fields are common to all unix platforms. - commonUnixBridgeConfig - - // Fields below here are platform specific. - EnableIPv6 bool `json:"ipv6,omitempty"` - EnableIPTables bool `json:"iptables,omitempty"` - EnableIPForward bool `json:"ip-forward,omitempty"` - EnableIPMasq bool `json:"ip-masq,omitempty"` - EnableUserlandProxy bool `json:"userland-proxy,omitempty"` - UserlandProxyPath string `json:"userland-proxy-path,omitempty"` - FixedCIDRv6 string `json:"fixed-cidr-v6,omitempty"` -} - -// InstallFlags adds flags to the pflag.FlagSet to configure the daemon -func (config *Config) InstallFlags(flags *pflag.FlagSet) { - // First handle install flags which are consistent cross-platform - config.InstallCommonFlags(flags) - - // Then install flags common to unix platforms - config.InstallCommonUnixFlags(flags) - - config.Ulimits = make(map[string]*units.Ulimit) - - // Then platform-specific install flags - flags.BoolVar(&config.EnableSelinuxSupport, "selinux-enabled", false, "Enable selinux support") - flags.Var(runconfigopts.NewUlimitOpt(&config.Ulimits), "default-ulimit", "Default ulimits for containers") - flags.BoolVar(&config.bridgeConfig.EnableIPTables, "iptables", true, "Enable addition of iptables rules") - flags.BoolVar(&config.bridgeConfig.EnableIPForward, "ip-forward", true, "Enable net.ipv4.ip_forward") - flags.BoolVar(&config.bridgeConfig.EnableIPMasq, "ip-masq", true, "Enable IP masquerading") - flags.BoolVar(&config.bridgeConfig.EnableIPv6, "ipv6", false, "Enable IPv6 networking") - flags.StringVar(&config.ExecRoot, "exec-root", defaultExecRoot, "Root directory for execution state files") - flags.StringVar(&config.bridgeConfig.FixedCIDRv6, "fixed-cidr-v6", "", "IPv6 subnet for fixed IPs") - flags.BoolVar(&config.bridgeConfig.EnableUserlandProxy, "userland-proxy", true, "Use userland proxy for loopback traffic") - flags.StringVar(&config.bridgeConfig.UserlandProxyPath, "userland-proxy-path", "", "Path to the userland proxy binary") - flags.BoolVar(&config.EnableCors, "api-enable-cors", false, "Enable CORS headers in the Engine API, this is deprecated by --api-cors-header") - flags.MarkDeprecated("api-enable-cors", "Please use --api-cors-header") - flags.StringVar(&config.CgroupParent, "cgroup-parent", "", "Set parent cgroup for all containers") - flags.StringVar(&config.RemappedRoot, "userns-remap", "", "User/Group setting for user namespaces") - flags.StringVar(&config.ContainerdAddr, "containerd", "", "Path to containerd socket") - flags.BoolVar(&config.LiveRestoreEnabled, "live-restore", false, "Enable live restore of docker when containers are still running") - flags.IntVar(&config.OOMScoreAdjust, "oom-score-adjust", -500, "Set the oom_score_adj for the daemon") - flags.BoolVar(&config.Init, "init", false, "Run an init in the container to forward signals and reap processes") - flags.StringVar(&config.InitPath, "init-path", "", "Path to the docker-init binary") - flags.Int64Var(&config.CPURealtimePeriod, "cpu-rt-period", 0, "Limit the CPU real-time period in microseconds") - flags.Int64Var(&config.CPURealtimeRuntime, "cpu-rt-runtime", 0, "Limit the CPU real-time runtime in microseconds") - flags.StringVar(&config.SeccompProfile, "seccomp-profile", "", "Path to seccomp profile") - - config.attachExperimentalFlags(flags) -} - -func (config *Config) isSwarmCompatible() error { - if config.ClusterStore != "" || config.ClusterAdvertise != "" { - return fmt.Errorf("--cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode") - } - if config.LiveRestoreEnabled { - return fmt.Errorf("--live-restore daemon configuration is incompatible with swarm mode") - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/config_unix_test.go b/vendor/github.com/docker/docker/daemon/config_unix_test.go deleted file mode 100644 index 86c16f57b..000000000 --- a/vendor/github.com/docker/docker/daemon/config_unix_test.go +++ /dev/null @@ -1,80 +0,0 @@ -// +build !windows - -package daemon - -import ( - "io/ioutil" - "testing" -) - -func TestDaemonConfigurationMerge(t *testing.T) { - f, err := ioutil.TempFile("", "docker-config-") - if err != nil { - t.Fatal(err) - } - - configFile := f.Name() - - f.Write([]byte(` - { - "debug": true, - "default-ulimits": { - "nofile": { - "Name": "nofile", - "Hard": 2048, - "Soft": 1024 - } - }, - "log-opts": { - "tag": "test_tag" - } - }`)) - - f.Close() - - c := &Config{ - CommonConfig: CommonConfig{ - AutoRestart: true, - LogConfig: LogConfig{ - Type: "syslog", - Config: map[string]string{"tag": "test"}, - }, - }, - } - - cc, err := MergeDaemonConfigurations(c, nil, configFile) - if err != nil { - t.Fatal(err) - } - if !cc.Debug { - t.Fatalf("expected %v, got %v\n", true, cc.Debug) - } - if !cc.AutoRestart { - t.Fatalf("expected %v, got %v\n", true, cc.AutoRestart) - } - if cc.LogConfig.Type != "syslog" { - t.Fatalf("expected syslog config, got %q\n", cc.LogConfig) - } - - if configValue, OK := cc.LogConfig.Config["tag"]; !OK { - t.Fatal("expected syslog config attributes, got nil\n") - } else { - if configValue != "test_tag" { - t.Fatalf("expected syslog config attributes 'tag=test_tag', got 'tag=%s'\n", configValue) - } - } - - if cc.Ulimits == nil { - t.Fatal("expected default ulimit config, got nil\n") - } else { - if _, OK := cc.Ulimits["nofile"]; OK { - if cc.Ulimits["nofile"].Name != "nofile" || - cc.Ulimits["nofile"].Hard != 2048 || - cc.Ulimits["nofile"].Soft != 1024 { - t.Fatalf("expected default ulimit name, hard and soft are nofile, 2048, 1024, got %s, %d, %d\n", cc.Ulimits["nofile"].Name, cc.Ulimits["nofile"].Hard, cc.Ulimits["nofile"].Soft) - } - } else { - t.Fatal("expected default ulimit name nofile, got nil\n") - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/config_windows.go b/vendor/github.com/docker/docker/daemon/config_windows.go deleted file mode 100644 index df59dcf30..000000000 --- a/vendor/github.com/docker/docker/daemon/config_windows.go +++ /dev/null @@ -1,71 +0,0 @@ -package daemon - -import ( - "os" - "path/filepath" - - "github.com/docker/docker/api/types" - "github.com/spf13/pflag" -) - -var ( - defaultPidFile string - defaultGraph = filepath.Join(os.Getenv("programdata"), "docker") -) - -// bridgeConfig stores all the bridge driver specific -// configuration. -type bridgeConfig struct { - commonBridgeConfig -} - -// Config defines the configuration of a docker daemon. -// These are the configuration settings that you pass -// to the docker daemon when you launch it with say: `docker daemon -e windows` -type Config struct { - CommonConfig - - // Fields below here are platform specific. (There are none presently - // for the Windows daemon.) -} - -// InstallFlags adds flags to the pflag.FlagSet to configure the daemon -func (config *Config) InstallFlags(flags *pflag.FlagSet) { - // First handle install flags which are consistent cross-platform - config.InstallCommonFlags(flags) - - // Then platform-specific install flags. - flags.StringVar(&config.bridgeConfig.FixedCIDR, "fixed-cidr", "", "IPv4 subnet for fixed IPs") - flags.StringVarP(&config.bridgeConfig.Iface, "bridge", "b", "", "Attach containers to a virtual switch") - flags.StringVarP(&config.SocketGroup, "group", "G", "", "Users or groups that can access the named pipe") -} - -// GetRuntime returns the runtime path and arguments for a given -// runtime name -func (config *Config) GetRuntime(name string) *types.Runtime { - return nil -} - -// GetInitPath returns the configure docker-init path -func (config *Config) GetInitPath() string { - return "" -} - -// GetDefaultRuntimeName returns the current default runtime -func (config *Config) GetDefaultRuntimeName() string { - return stockRuntimeName -} - -// GetAllRuntimes returns a copy of the runtimes map -func (config *Config) GetAllRuntimes() map[string]types.Runtime { - return map[string]types.Runtime{} -} - -// GetExecRoot returns the user configured Exec-root -func (config *Config) GetExecRoot() string { - return "" -} - -func (config *Config) isSwarmCompatible() error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/config_windows_test.go b/vendor/github.com/docker/docker/daemon/config_windows_test.go deleted file mode 100644 index 4a7b95c17..000000000 --- a/vendor/github.com/docker/docker/daemon/config_windows_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// +build windows - -package daemon - -import ( - "io/ioutil" - "testing" -) - -func TestDaemonConfigurationMerge(t *testing.T) { - f, err := ioutil.TempFile("", "docker-config-") - if err != nil { - t.Fatal(err) - } - - configFile := f.Name() - - f.Write([]byte(` - { - "debug": true, - "log-opts": { - "tag": "test_tag" - } - }`)) - - f.Close() - - c := &Config{ - CommonConfig: CommonConfig{ - AutoRestart: true, - LogConfig: LogConfig{ - Type: "syslog", - Config: map[string]string{"tag": "test"}, - }, - }, - } - - cc, err := MergeDaemonConfigurations(c, nil, configFile) - if err != nil { - t.Fatal(err) - } - if !cc.Debug { - t.Fatalf("expected %v, got %v\n", true, cc.Debug) - } - if !cc.AutoRestart { - t.Fatalf("expected %v, got %v\n", true, cc.AutoRestart) - } - if cc.LogConfig.Type != "syslog" { - t.Fatalf("expected syslog config, got %q\n", cc.LogConfig) - } - - if configValue, OK := cc.LogConfig.Config["tag"]; !OK { - t.Fatal("expected syslog config attributes, got nil\n") - } else { - if configValue != "test_tag" { - t.Fatalf("expected syslog config attributes 'tag=test_tag', got 'tag=%s'\n", configValue) - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/container.go b/vendor/github.com/docker/docker/daemon/container.go deleted file mode 100644 index 2a4480009..000000000 --- a/vendor/github.com/docker/docker/daemon/container.go +++ /dev/null @@ -1,282 +0,0 @@ -package daemon - -import ( - "fmt" - "os" - "path/filepath" - "time" - - "github.com/docker/docker/api/errors" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/strslice" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/network" - "github.com/docker/docker/image" - "github.com/docker/docker/pkg/signal" - "github.com/docker/docker/pkg/system" - "github.com/docker/docker/pkg/truncindex" - "github.com/docker/docker/runconfig/opts" - "github.com/docker/go-connections/nat" -) - -// GetContainer looks for a container using the provided information, which could be -// one of the following inputs from the caller: -// - A full container ID, which will exact match a container in daemon's list -// - A container name, which will only exact match via the GetByName() function -// - A partial container ID prefix (e.g. short ID) of any length that is -// unique enough to only return a single container object -// If none of these searches succeed, an error is returned -func (daemon *Daemon) GetContainer(prefixOrName string) (*container.Container, error) { - if len(prefixOrName) == 0 { - return nil, errors.NewBadRequestError(fmt.Errorf("No container name or ID supplied")) - } - - if containerByID := daemon.containers.Get(prefixOrName); containerByID != nil { - // prefix is an exact match to a full container ID - return containerByID, nil - } - - // GetByName will match only an exact name provided; we ignore errors - if containerByName, _ := daemon.GetByName(prefixOrName); containerByName != nil { - // prefix is an exact match to a full container Name - return containerByName, nil - } - - containerID, indexError := daemon.idIndex.Get(prefixOrName) - if indexError != nil { - // When truncindex defines an error type, use that instead - if indexError == truncindex.ErrNotExist { - err := fmt.Errorf("No such container: %s", prefixOrName) - return nil, errors.NewRequestNotFoundError(err) - } - return nil, indexError - } - return daemon.containers.Get(containerID), nil -} - -// Exists returns a true if a container of the specified ID or name exists, -// false otherwise. -func (daemon *Daemon) Exists(id string) bool { - c, _ := daemon.GetContainer(id) - return c != nil -} - -// IsPaused returns a bool indicating if the specified container is paused. -func (daemon *Daemon) IsPaused(id string) bool { - c, _ := daemon.GetContainer(id) - return c.State.IsPaused() -} - -func (daemon *Daemon) containerRoot(id string) string { - return filepath.Join(daemon.repository, id) -} - -// Load reads the contents of a container from disk -// This is typically done at startup. -func (daemon *Daemon) load(id string) (*container.Container, error) { - container := daemon.newBaseContainer(id) - - if err := container.FromDisk(); err != nil { - return nil, err - } - - if container.ID != id { - return container, fmt.Errorf("Container %s is stored at %s", container.ID, id) - } - - return container, nil -} - -// Register makes a container object usable by the daemon as -func (daemon *Daemon) Register(c *container.Container) error { - // Attach to stdout and stderr - if c.Config.OpenStdin { - c.StreamConfig.NewInputPipes() - } else { - c.StreamConfig.NewNopInputPipe() - } - - daemon.containers.Add(c.ID, c) - daemon.idIndex.Add(c.ID) - - return nil -} - -func (daemon *Daemon) newContainer(name string, config *containertypes.Config, hostConfig *containertypes.HostConfig, imgID image.ID, managed bool) (*container.Container, error) { - var ( - id string - err error - noExplicitName = name == "" - ) - id, name, err = daemon.generateIDAndName(name) - if err != nil { - return nil, err - } - - if hostConfig.NetworkMode.IsHost() { - if config.Hostname == "" { - config.Hostname, err = os.Hostname() - if err != nil { - return nil, err - } - } - } else { - daemon.generateHostname(id, config) - } - entrypoint, args := daemon.getEntrypointAndArgs(config.Entrypoint, config.Cmd) - - base := daemon.newBaseContainer(id) - base.Created = time.Now().UTC() - base.Managed = managed - base.Path = entrypoint - base.Args = args //FIXME: de-duplicate from config - base.Config = config - base.HostConfig = &containertypes.HostConfig{} - base.ImageID = imgID - base.NetworkSettings = &network.Settings{IsAnonymousEndpoint: noExplicitName} - base.Name = name - base.Driver = daemon.GraphDriverName() - - return base, err -} - -// GetByName returns a container given a name. -func (daemon *Daemon) GetByName(name string) (*container.Container, error) { - if len(name) == 0 { - return nil, fmt.Errorf("No container name supplied") - } - fullName := name - if name[0] != '/' { - fullName = "/" + name - } - id, err := daemon.nameIndex.Get(fullName) - if err != nil { - return nil, fmt.Errorf("Could not find entity for %s", name) - } - e := daemon.containers.Get(id) - if e == nil { - return nil, fmt.Errorf("Could not find container for entity id %s", id) - } - return e, nil -} - -// newBaseContainer creates a new container with its initial -// configuration based on the root storage from the daemon. -func (daemon *Daemon) newBaseContainer(id string) *container.Container { - return container.NewBaseContainer(id, daemon.containerRoot(id)) -} - -func (daemon *Daemon) getEntrypointAndArgs(configEntrypoint strslice.StrSlice, configCmd strslice.StrSlice) (string, []string) { - if len(configEntrypoint) != 0 { - return configEntrypoint[0], append(configEntrypoint[1:], configCmd...) - } - return configCmd[0], configCmd[1:] -} - -func (daemon *Daemon) generateHostname(id string, config *containertypes.Config) { - // Generate default hostname - if config.Hostname == "" { - config.Hostname = id[:12] - } -} - -func (daemon *Daemon) setSecurityOptions(container *container.Container, hostConfig *containertypes.HostConfig) error { - container.Lock() - defer container.Unlock() - return parseSecurityOpt(container, hostConfig) -} - -func (daemon *Daemon) setHostConfig(container *container.Container, hostConfig *containertypes.HostConfig) error { - // Do not lock while creating volumes since this could be calling out to external plugins - // Don't want to block other actions, like `docker ps` because we're waiting on an external plugin - if err := daemon.registerMountPoints(container, hostConfig); err != nil { - return err - } - - container.Lock() - defer container.Unlock() - - // Register any links from the host config before starting the container - if err := daemon.registerLinks(container, hostConfig); err != nil { - return err - } - - // make sure links is not nil - // this ensures that on the next daemon restart we don't try to migrate from legacy sqlite links - if hostConfig.Links == nil { - hostConfig.Links = []string{} - } - - container.HostConfig = hostConfig - return container.ToDisk() -} - -// verifyContainerSettings performs validation of the hostconfig and config -// structures. -func (daemon *Daemon) verifyContainerSettings(hostConfig *containertypes.HostConfig, config *containertypes.Config, update bool) ([]string, error) { - - // First perform verification of settings common across all platforms. - if config != nil { - if config.WorkingDir != "" { - config.WorkingDir = filepath.FromSlash(config.WorkingDir) // Ensure in platform semantics - if !system.IsAbs(config.WorkingDir) { - return nil, fmt.Errorf("the working directory '%s' is invalid, it needs to be an absolute path", config.WorkingDir) - } - } - - if len(config.StopSignal) > 0 { - _, err := signal.ParseSignal(config.StopSignal) - if err != nil { - return nil, err - } - } - - // Validate if Env contains empty variable or not (e.g., ``, `=foo`) - for _, env := range config.Env { - if _, err := opts.ValidateEnv(env); err != nil { - return nil, err - } - } - } - - if hostConfig == nil { - return nil, nil - } - - if hostConfig.AutoRemove && !hostConfig.RestartPolicy.IsNone() { - return nil, fmt.Errorf("can't create 'AutoRemove' container with restart policy") - } - - for port := range hostConfig.PortBindings { - _, portStr := nat.SplitProtoPort(string(port)) - if _, err := nat.ParsePort(portStr); err != nil { - return nil, fmt.Errorf("invalid port specification: %q", portStr) - } - for _, pb := range hostConfig.PortBindings[port] { - _, err := nat.NewPort(nat.SplitProtoPort(pb.HostPort)) - if err != nil { - return nil, fmt.Errorf("invalid port specification: %q", pb.HostPort) - } - } - } - - p := hostConfig.RestartPolicy - - switch p.Name { - case "always", "unless-stopped", "no": - if p.MaximumRetryCount != 0 { - return nil, fmt.Errorf("maximum retry count cannot be used with restart policy '%s'", p.Name) - } - case "on-failure": - if p.MaximumRetryCount < 0 { - return nil, fmt.Errorf("maximum retry count cannot be negative") - } - case "": - // do nothing - default: - return nil, fmt.Errorf("invalid restart policy '%s'", p.Name) - } - - // Now do platform-specific verification - return verifyPlatformContainerSettings(daemon, hostConfig, config, update) -} diff --git a/vendor/github.com/docker/docker/daemon/container_operations.go b/vendor/github.com/docker/docker/daemon/container_operations.go deleted file mode 100644 index c30250622..000000000 --- a/vendor/github.com/docker/docker/daemon/container_operations.go +++ /dev/null @@ -1,1049 +0,0 @@ -package daemon - -import ( - "errors" - "fmt" - "net" - "os" - "path" - "runtime" - "strings" - "time" - - "github.com/Sirupsen/logrus" - derr "github.com/docker/docker/api/errors" - containertypes "github.com/docker/docker/api/types/container" - networktypes "github.com/docker/docker/api/types/network" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/network" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/runconfig" - "github.com/docker/go-connections/nat" - "github.com/docker/libnetwork" - "github.com/docker/libnetwork/netlabel" - "github.com/docker/libnetwork/options" - "github.com/docker/libnetwork/types" -) - -var ( - // ErrRootFSReadOnly is returned when a container - // rootfs is marked readonly. - ErrRootFSReadOnly = errors.New("container rootfs is marked read-only") - getPortMapInfo = container.GetSandboxPortMapInfo -) - -func (daemon *Daemon) buildSandboxOptions(container *container.Container) ([]libnetwork.SandboxOption, error) { - var ( - sboxOptions []libnetwork.SandboxOption - err error - dns []string - dnsSearch []string - dnsOptions []string - bindings = make(nat.PortMap) - pbList []types.PortBinding - exposeList []types.TransportPort - ) - - defaultNetName := runconfig.DefaultDaemonNetworkMode().NetworkName() - sboxOptions = append(sboxOptions, libnetwork.OptionHostname(container.Config.Hostname), - libnetwork.OptionDomainname(container.Config.Domainname)) - - if container.HostConfig.NetworkMode.IsHost() { - sboxOptions = append(sboxOptions, libnetwork.OptionUseDefaultSandbox()) - if len(container.HostConfig.ExtraHosts) == 0 { - sboxOptions = append(sboxOptions, libnetwork.OptionOriginHostsPath("/etc/hosts")) - } - if len(container.HostConfig.DNS) == 0 && len(daemon.configStore.DNS) == 0 && - len(container.HostConfig.DNSSearch) == 0 && len(daemon.configStore.DNSSearch) == 0 && - len(container.HostConfig.DNSOptions) == 0 && len(daemon.configStore.DNSOptions) == 0 { - sboxOptions = append(sboxOptions, libnetwork.OptionOriginResolvConfPath("/etc/resolv.conf")) - } - } else { - // OptionUseExternalKey is mandatory for userns support. - // But optional for non-userns support - sboxOptions = append(sboxOptions, libnetwork.OptionUseExternalKey()) - } - - if err = setupPathsAndSandboxOptions(container, &sboxOptions); err != nil { - return nil, err - } - - if len(container.HostConfig.DNS) > 0 { - dns = container.HostConfig.DNS - } else if len(daemon.configStore.DNS) > 0 { - dns = daemon.configStore.DNS - } - - for _, d := range dns { - sboxOptions = append(sboxOptions, libnetwork.OptionDNS(d)) - } - - if len(container.HostConfig.DNSSearch) > 0 { - dnsSearch = container.HostConfig.DNSSearch - } else if len(daemon.configStore.DNSSearch) > 0 { - dnsSearch = daemon.configStore.DNSSearch - } - - for _, ds := range dnsSearch { - sboxOptions = append(sboxOptions, libnetwork.OptionDNSSearch(ds)) - } - - if len(container.HostConfig.DNSOptions) > 0 { - dnsOptions = container.HostConfig.DNSOptions - } else if len(daemon.configStore.DNSOptions) > 0 { - dnsOptions = daemon.configStore.DNSOptions - } - - for _, ds := range dnsOptions { - sboxOptions = append(sboxOptions, libnetwork.OptionDNSOptions(ds)) - } - - if container.NetworkSettings.SecondaryIPAddresses != nil { - name := container.Config.Hostname - if container.Config.Domainname != "" { - name = name + "." + container.Config.Domainname - } - - for _, a := range container.NetworkSettings.SecondaryIPAddresses { - sboxOptions = append(sboxOptions, libnetwork.OptionExtraHost(name, a.Addr)) - } - } - - for _, extraHost := range container.HostConfig.ExtraHosts { - // allow IPv6 addresses in extra hosts; only split on first ":" - parts := strings.SplitN(extraHost, ":", 2) - sboxOptions = append(sboxOptions, libnetwork.OptionExtraHost(parts[0], parts[1])) - } - - if container.HostConfig.PortBindings != nil { - for p, b := range container.HostConfig.PortBindings { - bindings[p] = []nat.PortBinding{} - for _, bb := range b { - bindings[p] = append(bindings[p], nat.PortBinding{ - HostIP: bb.HostIP, - HostPort: bb.HostPort, - }) - } - } - } - - portSpecs := container.Config.ExposedPorts - ports := make([]nat.Port, len(portSpecs)) - var i int - for p := range portSpecs { - ports[i] = p - i++ - } - nat.SortPortMap(ports, bindings) - for _, port := range ports { - expose := types.TransportPort{} - expose.Proto = types.ParseProtocol(port.Proto()) - expose.Port = uint16(port.Int()) - exposeList = append(exposeList, expose) - - pb := types.PortBinding{Port: expose.Port, Proto: expose.Proto} - binding := bindings[port] - for i := 0; i < len(binding); i++ { - pbCopy := pb.GetCopy() - newP, err := nat.NewPort(nat.SplitProtoPort(binding[i].HostPort)) - var portStart, portEnd int - if err == nil { - portStart, portEnd, err = newP.Range() - } - if err != nil { - return nil, fmt.Errorf("Error parsing HostPort value(%s):%v", binding[i].HostPort, err) - } - pbCopy.HostPort = uint16(portStart) - pbCopy.HostPortEnd = uint16(portEnd) - pbCopy.HostIP = net.ParseIP(binding[i].HostIP) - pbList = append(pbList, pbCopy) - } - - if container.HostConfig.PublishAllPorts && len(binding) == 0 { - pbList = append(pbList, pb) - } - } - - sboxOptions = append(sboxOptions, - libnetwork.OptionPortMapping(pbList), - libnetwork.OptionExposedPorts(exposeList)) - - // Legacy Link feature is supported only for the default bridge network. - // return if this call to build join options is not for default bridge network - // Legacy Link is only supported by docker run --link - bridgeSettings, ok := container.NetworkSettings.Networks[defaultNetName] - if !ok || bridgeSettings.EndpointSettings == nil { - return sboxOptions, nil - } - - if bridgeSettings.EndpointID == "" { - return sboxOptions, nil - } - - var ( - childEndpoints, parentEndpoints []string - cEndpointID string - ) - - children := daemon.children(container) - for linkAlias, child := range children { - if !isLinkable(child) { - return nil, fmt.Errorf("Cannot link to %s, as it does not belong to the default network", child.Name) - } - _, alias := path.Split(linkAlias) - // allow access to the linked container via the alias, real name, and container hostname - aliasList := alias + " " + child.Config.Hostname - // only add the name if alias isn't equal to the name - if alias != child.Name[1:] { - aliasList = aliasList + " " + child.Name[1:] - } - sboxOptions = append(sboxOptions, libnetwork.OptionExtraHost(aliasList, child.NetworkSettings.Networks[defaultNetName].IPAddress)) - cEndpointID = child.NetworkSettings.Networks[defaultNetName].EndpointID - if cEndpointID != "" { - childEndpoints = append(childEndpoints, cEndpointID) - } - } - - for alias, parent := range daemon.parents(container) { - if daemon.configStore.DisableBridge || !container.HostConfig.NetworkMode.IsPrivate() { - continue - } - - _, alias = path.Split(alias) - logrus.Debugf("Update /etc/hosts of %s for alias %s with ip %s", parent.ID, alias, bridgeSettings.IPAddress) - sboxOptions = append(sboxOptions, libnetwork.OptionParentUpdate( - parent.ID, - alias, - bridgeSettings.IPAddress, - )) - if cEndpointID != "" { - parentEndpoints = append(parentEndpoints, cEndpointID) - } - } - - linkOptions := options.Generic{ - netlabel.GenericData: options.Generic{ - "ParentEndpoints": parentEndpoints, - "ChildEndpoints": childEndpoints, - }, - } - - sboxOptions = append(sboxOptions, libnetwork.OptionGeneric(linkOptions)) - return sboxOptions, nil -} - -func (daemon *Daemon) updateNetworkSettings(container *container.Container, n libnetwork.Network, endpointConfig *networktypes.EndpointSettings) error { - if container.NetworkSettings == nil { - container.NetworkSettings = &network.Settings{Networks: make(map[string]*network.EndpointSettings)} - } - - if !container.HostConfig.NetworkMode.IsHost() && containertypes.NetworkMode(n.Type()).IsHost() { - return runconfig.ErrConflictHostNetwork - } - - for s := range container.NetworkSettings.Networks { - sn, err := daemon.FindNetwork(s) - if err != nil { - continue - } - - if sn.Name() == n.Name() { - // Avoid duplicate config - return nil - } - if !containertypes.NetworkMode(sn.Type()).IsPrivate() || - !containertypes.NetworkMode(n.Type()).IsPrivate() { - return runconfig.ErrConflictSharedNetwork - } - if containertypes.NetworkMode(sn.Name()).IsNone() || - containertypes.NetworkMode(n.Name()).IsNone() { - return runconfig.ErrConflictNoNetwork - } - } - - if _, ok := container.NetworkSettings.Networks[n.Name()]; !ok { - container.NetworkSettings.Networks[n.Name()] = &network.EndpointSettings{ - EndpointSettings: endpointConfig, - } - } - - return nil -} - -func (daemon *Daemon) updateEndpointNetworkSettings(container *container.Container, n libnetwork.Network, ep libnetwork.Endpoint) error { - if err := container.BuildEndpointInfo(n, ep); err != nil { - return err - } - - if container.HostConfig.NetworkMode == runconfig.DefaultDaemonNetworkMode() { - container.NetworkSettings.Bridge = daemon.configStore.bridgeConfig.Iface - } - - return nil -} - -// UpdateNetwork is used to update the container's network (e.g. when linked containers -// get removed/unlinked). -func (daemon *Daemon) updateNetwork(container *container.Container) error { - var ( - start = time.Now() - ctrl = daemon.netController - sid = container.NetworkSettings.SandboxID - ) - - sb, err := ctrl.SandboxByID(sid) - if err != nil { - return fmt.Errorf("error locating sandbox id %s: %v", sid, err) - } - - // Find if container is connected to the default bridge network - var n libnetwork.Network - for name := range container.NetworkSettings.Networks { - sn, err := daemon.FindNetwork(name) - if err != nil { - continue - } - if sn.Name() == runconfig.DefaultDaemonNetworkMode().NetworkName() { - n = sn - break - } - } - - if n == nil { - // Not connected to the default bridge network; Nothing to do - return nil - } - - options, err := daemon.buildSandboxOptions(container) - if err != nil { - return fmt.Errorf("Update network failed: %v", err) - } - - if err := sb.Refresh(options...); err != nil { - return fmt.Errorf("Update network failed: Failure in refresh sandbox %s: %v", sid, err) - } - - networkActions.WithValues("update").UpdateSince(start) - - return nil -} - -func (daemon *Daemon) findAndAttachNetwork(container *container.Container, idOrName string, epConfig *networktypes.EndpointSettings) (libnetwork.Network, *networktypes.NetworkingConfig, error) { - n, err := daemon.FindNetwork(idOrName) - if err != nil { - // We should always be able to find the network for a - // managed container. - if container.Managed { - return nil, nil, err - } - } - - // If we found a network and if it is not dynamically created - // we should never attempt to attach to that network here. - if n != nil { - if container.Managed || !n.Info().Dynamic() { - return n, nil, nil - } - } - - var addresses []string - if epConfig != nil && epConfig.IPAMConfig != nil { - if epConfig.IPAMConfig.IPv4Address != "" { - addresses = append(addresses, epConfig.IPAMConfig.IPv4Address) - } - - if epConfig.IPAMConfig.IPv6Address != "" { - addresses = append(addresses, epConfig.IPAMConfig.IPv6Address) - } - } - - var ( - config *networktypes.NetworkingConfig - retryCount int - ) - - for { - // In all other cases, attempt to attach to the network to - // trigger attachment in the swarm cluster manager. - if daemon.clusterProvider != nil { - var err error - config, err = daemon.clusterProvider.AttachNetwork(idOrName, container.ID, addresses) - if err != nil { - return nil, nil, err - } - } - - n, err = daemon.FindNetwork(idOrName) - if err != nil { - if daemon.clusterProvider != nil { - if err := daemon.clusterProvider.DetachNetwork(idOrName, container.ID); err != nil { - logrus.Warnf("Could not rollback attachment for container %s to network %s: %v", container.ID, idOrName, err) - } - } - - // Retry network attach again if we failed to - // find the network after successfull - // attachment because the only reason that - // would happen is if some other container - // attached to the swarm scope network went down - // and removed the network while we were in - // the process of attaching. - if config != nil { - if _, ok := err.(libnetwork.ErrNoSuchNetwork); ok { - if retryCount >= 5 { - return nil, nil, fmt.Errorf("could not find network %s after successful attachment", idOrName) - } - retryCount++ - continue - } - } - - return nil, nil, err - } - - break - } - - // This container has attachment to a swarm scope - // network. Update the container network settings accordingly. - container.NetworkSettings.HasSwarmEndpoint = true - return n, config, nil -} - -// updateContainerNetworkSettings update the network settings -func (daemon *Daemon) updateContainerNetworkSettings(container *container.Container, endpointsConfig map[string]*networktypes.EndpointSettings) { - var n libnetwork.Network - - mode := container.HostConfig.NetworkMode - if container.Config.NetworkDisabled || mode.IsContainer() { - return - } - - networkName := mode.NetworkName() - if mode.IsDefault() { - networkName = daemon.netController.Config().Daemon.DefaultNetwork - } - - if mode.IsUserDefined() { - var err error - - n, err = daemon.FindNetwork(networkName) - if err == nil { - networkName = n.Name() - } - } - - if container.NetworkSettings == nil { - container.NetworkSettings = &network.Settings{} - } - - if len(endpointsConfig) > 0 { - if container.NetworkSettings.Networks == nil { - container.NetworkSettings.Networks = make(map[string]*network.EndpointSettings) - } - - for name, epConfig := range endpointsConfig { - container.NetworkSettings.Networks[name] = &network.EndpointSettings{ - EndpointSettings: epConfig, - } - } - } - - if container.NetworkSettings.Networks == nil { - container.NetworkSettings.Networks = make(map[string]*network.EndpointSettings) - container.NetworkSettings.Networks[networkName] = &network.EndpointSettings{ - EndpointSettings: &networktypes.EndpointSettings{}, - } - } - - // Convert any settings added by client in default name to - // engine's default network name key - if mode.IsDefault() { - if nConf, ok := container.NetworkSettings.Networks[mode.NetworkName()]; ok { - container.NetworkSettings.Networks[networkName] = nConf - delete(container.NetworkSettings.Networks, mode.NetworkName()) - } - } - - if !mode.IsUserDefined() { - return - } - // Make sure to internally store the per network endpoint config by network name - if _, ok := container.NetworkSettings.Networks[networkName]; ok { - return - } - - if n != nil { - if nwConfig, ok := container.NetworkSettings.Networks[n.ID()]; ok { - container.NetworkSettings.Networks[networkName] = nwConfig - delete(container.NetworkSettings.Networks, n.ID()) - return - } - } -} - -func (daemon *Daemon) allocateNetwork(container *container.Container) error { - start := time.Now() - controller := daemon.netController - - if daemon.netController == nil { - return nil - } - - // Cleanup any stale sandbox left over due to ungraceful daemon shutdown - if err := controller.SandboxDestroy(container.ID); err != nil { - logrus.Errorf("failed to cleanup up stale network sandbox for container %s", container.ID) - } - - updateSettings := false - if len(container.NetworkSettings.Networks) == 0 { - if container.Config.NetworkDisabled || container.HostConfig.NetworkMode.IsContainer() { - return nil - } - - daemon.updateContainerNetworkSettings(container, nil) - updateSettings = true - } - - // always connect default network first since only default - // network mode support link and we need do some setting - // on sandbox initialize for link, but the sandbox only be initialized - // on first network connecting. - defaultNetName := runconfig.DefaultDaemonNetworkMode().NetworkName() - if nConf, ok := container.NetworkSettings.Networks[defaultNetName]; ok { - cleanOperationalData(nConf) - if err := daemon.connectToNetwork(container, defaultNetName, nConf.EndpointSettings, updateSettings); err != nil { - return err - } - - } - - // the intermediate map is necessary because "connectToNetwork" modifies "container.NetworkSettings.Networks" - networks := make(map[string]*network.EndpointSettings) - for n, epConf := range container.NetworkSettings.Networks { - if n == defaultNetName { - continue - } - - networks[n] = epConf - } - - for netName, epConf := range networks { - cleanOperationalData(epConf) - if err := daemon.connectToNetwork(container, netName, epConf.EndpointSettings, updateSettings); err != nil { - return err - } - } - - if err := container.WriteHostConfig(); err != nil { - return err - } - networkActions.WithValues("allocate").UpdateSince(start) - return nil -} - -func (daemon *Daemon) getNetworkSandbox(container *container.Container) libnetwork.Sandbox { - var sb libnetwork.Sandbox - daemon.netController.WalkSandboxes(func(s libnetwork.Sandbox) bool { - if s.ContainerID() == container.ID { - sb = s - return true - } - return false - }) - return sb -} - -// hasUserDefinedIPAddress returns whether the passed endpoint configuration contains IP address configuration -func hasUserDefinedIPAddress(epConfig *networktypes.EndpointSettings) bool { - return epConfig != nil && epConfig.IPAMConfig != nil && (len(epConfig.IPAMConfig.IPv4Address) > 0 || len(epConfig.IPAMConfig.IPv6Address) > 0) -} - -// User specified ip address is acceptable only for networks with user specified subnets. -func validateNetworkingConfig(n libnetwork.Network, epConfig *networktypes.EndpointSettings) error { - if n == nil || epConfig == nil { - return nil - } - if !hasUserDefinedIPAddress(epConfig) { - return nil - } - _, _, nwIPv4Configs, nwIPv6Configs := n.Info().IpamConfig() - for _, s := range []struct { - ipConfigured bool - subnetConfigs []*libnetwork.IpamConf - }{ - { - ipConfigured: len(epConfig.IPAMConfig.IPv4Address) > 0, - subnetConfigs: nwIPv4Configs, - }, - { - ipConfigured: len(epConfig.IPAMConfig.IPv6Address) > 0, - subnetConfigs: nwIPv6Configs, - }, - } { - if s.ipConfigured { - foundSubnet := false - for _, cfg := range s.subnetConfigs { - if len(cfg.PreferredPool) > 0 { - foundSubnet = true - break - } - } - if !foundSubnet { - return runconfig.ErrUnsupportedNetworkNoSubnetAndIP - } - } - } - - return nil -} - -// cleanOperationalData resets the operational data from the passed endpoint settings -func cleanOperationalData(es *network.EndpointSettings) { - es.EndpointID = "" - es.Gateway = "" - es.IPAddress = "" - es.IPPrefixLen = 0 - es.IPv6Gateway = "" - es.GlobalIPv6Address = "" - es.GlobalIPv6PrefixLen = 0 - es.MacAddress = "" - if es.IPAMOperational { - es.IPAMConfig = nil - } -} - -func (daemon *Daemon) updateNetworkConfig(container *container.Container, n libnetwork.Network, endpointConfig *networktypes.EndpointSettings, updateSettings bool) error { - - if !containertypes.NetworkMode(n.Name()).IsUserDefined() { - if hasUserDefinedIPAddress(endpointConfig) && !enableIPOnPredefinedNetwork() { - return runconfig.ErrUnsupportedNetworkAndIP - } - if endpointConfig != nil && len(endpointConfig.Aliases) > 0 && !container.EnableServiceDiscoveryOnDefaultNetwork() { - return runconfig.ErrUnsupportedNetworkAndAlias - } - } else { - addShortID := true - shortID := stringid.TruncateID(container.ID) - for _, alias := range endpointConfig.Aliases { - if alias == shortID { - addShortID = false - break - } - } - if addShortID { - endpointConfig.Aliases = append(endpointConfig.Aliases, shortID) - } - } - - if err := validateNetworkingConfig(n, endpointConfig); err != nil { - return err - } - - if updateSettings { - if err := daemon.updateNetworkSettings(container, n, endpointConfig); err != nil { - return err - } - } - return nil -} - -func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings, updateSettings bool) (err error) { - start := time.Now() - if container.HostConfig.NetworkMode.IsContainer() { - return runconfig.ErrConflictSharedNetwork - } - if containertypes.NetworkMode(idOrName).IsBridge() && - daemon.configStore.DisableBridge { - container.Config.NetworkDisabled = true - return nil - } - if endpointConfig == nil { - endpointConfig = &networktypes.EndpointSettings{} - } - - n, config, err := daemon.findAndAttachNetwork(container, idOrName, endpointConfig) - if err != nil { - return err - } - if n == nil { - return nil - } - - var operIPAM bool - if config != nil { - if epConfig, ok := config.EndpointsConfig[n.Name()]; ok { - if endpointConfig.IPAMConfig == nil || - (endpointConfig.IPAMConfig.IPv4Address == "" && - endpointConfig.IPAMConfig.IPv6Address == "" && - len(endpointConfig.IPAMConfig.LinkLocalIPs) == 0) { - operIPAM = true - } - - // copy IPAMConfig and NetworkID from epConfig via AttachNetwork - endpointConfig.IPAMConfig = epConfig.IPAMConfig - endpointConfig.NetworkID = epConfig.NetworkID - } - } - - err = daemon.updateNetworkConfig(container, n, endpointConfig, updateSettings) - if err != nil { - return err - } - - controller := daemon.netController - sb := daemon.getNetworkSandbox(container) - createOptions, err := container.BuildCreateEndpointOptions(n, endpointConfig, sb, daemon.configStore.DNS) - if err != nil { - return err - } - - endpointName := strings.TrimPrefix(container.Name, "/") - ep, err := n.CreateEndpoint(endpointName, createOptions...) - if err != nil { - return err - } - defer func() { - if err != nil { - if e := ep.Delete(false); e != nil { - logrus.Warnf("Could not rollback container connection to network %s", idOrName) - } - } - }() - container.NetworkSettings.Networks[n.Name()] = &network.EndpointSettings{ - EndpointSettings: endpointConfig, - IPAMOperational: operIPAM, - } - if _, ok := container.NetworkSettings.Networks[n.ID()]; ok { - delete(container.NetworkSettings.Networks, n.ID()) - } - - if err := daemon.updateEndpointNetworkSettings(container, n, ep); err != nil { - return err - } - - if sb == nil { - options, err := daemon.buildSandboxOptions(container) - if err != nil { - return err - } - sb, err = controller.NewSandbox(container.ID, options...) - if err != nil { - return err - } - - container.UpdateSandboxNetworkSettings(sb) - } - - joinOptions, err := container.BuildJoinOptions(n) - if err != nil { - return err - } - - if err := ep.Join(sb, joinOptions...); err != nil { - return err - } - - if !container.Managed { - // add container name/alias to DNS - if err := daemon.ActivateContainerServiceBinding(container.Name); err != nil { - return fmt.Errorf("Activate container service binding for %s failed: %v", container.Name, err) - } - } - - if err := container.UpdateJoinInfo(n, ep); err != nil { - return fmt.Errorf("Updating join info failed: %v", err) - } - - container.NetworkSettings.Ports = getPortMapInfo(sb) - - daemon.LogNetworkEventWithAttributes(n, "connect", map[string]string{"container": container.ID}) - networkActions.WithValues("connect").UpdateSince(start) - return nil -} - -// ForceEndpointDelete deletes an endpoint from a network forcefully -func (daemon *Daemon) ForceEndpointDelete(name string, networkName string) error { - n, err := daemon.FindNetwork(networkName) - if err != nil { - return err - } - - ep, err := n.EndpointByName(name) - if err != nil { - return err - } - return ep.Delete(true) -} - -func (daemon *Daemon) disconnectFromNetwork(container *container.Container, n libnetwork.Network, force bool) error { - var ( - ep libnetwork.Endpoint - sbox libnetwork.Sandbox - ) - - s := func(current libnetwork.Endpoint) bool { - epInfo := current.Info() - if epInfo == nil { - return false - } - if sb := epInfo.Sandbox(); sb != nil { - if sb.ContainerID() == container.ID { - ep = current - sbox = sb - return true - } - } - return false - } - n.WalkEndpoints(s) - - if ep == nil && force { - epName := strings.TrimPrefix(container.Name, "/") - ep, err := n.EndpointByName(epName) - if err != nil { - return err - } - return ep.Delete(force) - } - - if ep == nil { - return fmt.Errorf("container %s is not connected to the network", container.ID) - } - - if err := ep.Leave(sbox); err != nil { - return fmt.Errorf("container %s failed to leave network %s: %v", container.ID, n.Name(), err) - } - - container.NetworkSettings.Ports = getPortMapInfo(sbox) - - if err := ep.Delete(false); err != nil { - return fmt.Errorf("endpoint delete failed for container %s on network %s: %v", container.ID, n.Name(), err) - } - - delete(container.NetworkSettings.Networks, n.Name()) - - if daemon.clusterProvider != nil && n.Info().Dynamic() && !container.Managed { - if err := daemon.clusterProvider.DetachNetwork(n.Name(), container.ID); err != nil { - logrus.Warnf("error detaching from network %s: %v", n.Name(), err) - if err := daemon.clusterProvider.DetachNetwork(n.ID(), container.ID); err != nil { - logrus.Warnf("error detaching from network %s: %v", n.ID(), err) - } - } - } - - return nil -} - -func (daemon *Daemon) initializeNetworking(container *container.Container) error { - var err error - - if container.HostConfig.NetworkMode.IsContainer() { - // we need to get the hosts files from the container to join - nc, err := daemon.getNetworkedContainer(container.ID, container.HostConfig.NetworkMode.ConnectedContainer()) - if err != nil { - return err - } - initializeNetworkingPaths(container, nc) - container.Config.Hostname = nc.Config.Hostname - container.Config.Domainname = nc.Config.Domainname - return nil - } - - if container.HostConfig.NetworkMode.IsHost() { - if container.Config.Hostname == "" { - container.Config.Hostname, err = os.Hostname() - if err != nil { - return err - } - } - } - - if err := daemon.allocateNetwork(container); err != nil { - return err - } - - return container.BuildHostnameFile() -} - -func (daemon *Daemon) getNetworkedContainer(containerID, connectedContainerID string) (*container.Container, error) { - nc, err := daemon.GetContainer(connectedContainerID) - if err != nil { - return nil, err - } - if containerID == nc.ID { - return nil, fmt.Errorf("cannot join own network") - } - if !nc.IsRunning() { - err := fmt.Errorf("cannot join network of a non running container: %s", connectedContainerID) - return nil, derr.NewRequestConflictError(err) - } - if nc.IsRestarting() { - return nil, errContainerIsRestarting(connectedContainerID) - } - return nc, nil -} - -func (daemon *Daemon) releaseNetwork(container *container.Container) { - start := time.Now() - if daemon.netController == nil { - return - } - if container.HostConfig.NetworkMode.IsContainer() || container.Config.NetworkDisabled { - return - } - - sid := container.NetworkSettings.SandboxID - settings := container.NetworkSettings.Networks - container.NetworkSettings.Ports = nil - - if sid == "" || len(settings) == 0 { - return - } - - var networks []libnetwork.Network - for n, epSettings := range settings { - if nw, err := daemon.FindNetwork(n); err == nil { - networks = append(networks, nw) - } - - if epSettings.EndpointSettings == nil { - continue - } - - cleanOperationalData(epSettings) - } - - sb, err := daemon.netController.SandboxByID(sid) - if err != nil { - logrus.Warnf("error locating sandbox id %s: %v", sid, err) - return - } - - if err := sb.Delete(); err != nil { - logrus.Errorf("Error deleting sandbox id %s for container %s: %v", sid, container.ID, err) - } - - for _, nw := range networks { - if daemon.clusterProvider != nil && nw.Info().Dynamic() && !container.Managed { - if err := daemon.clusterProvider.DetachNetwork(nw.Name(), container.ID); err != nil { - logrus.Warnf("error detaching from network %s: %v", nw.Name(), err) - if err := daemon.clusterProvider.DetachNetwork(nw.ID(), container.ID); err != nil { - logrus.Warnf("error detaching from network %s: %v", nw.ID(), err) - } - } - } - - attributes := map[string]string{ - "container": container.ID, - } - daemon.LogNetworkEventWithAttributes(nw, "disconnect", attributes) - } - networkActions.WithValues("release").UpdateSince(start) -} - -func errRemovalContainer(containerID string) error { - return fmt.Errorf("Container %s is marked for removal and cannot be connected or disconnected to the network", containerID) -} - -// ConnectToNetwork connects a container to a network -func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings) error { - if endpointConfig == nil { - endpointConfig = &networktypes.EndpointSettings{} - } - if !container.Running { - if container.RemovalInProgress || container.Dead { - return errRemovalContainer(container.ID) - } - - n, err := daemon.FindNetwork(idOrName) - if err == nil && n != nil { - if err := daemon.updateNetworkConfig(container, n, endpointConfig, true); err != nil { - return err - } - } else { - container.NetworkSettings.Networks[idOrName] = &network.EndpointSettings{ - EndpointSettings: endpointConfig, - } - } - } else if !daemon.isNetworkHotPluggable() { - return fmt.Errorf(runtime.GOOS + " does not support connecting a running container to a network") - } else { - if err := daemon.connectToNetwork(container, idOrName, endpointConfig, true); err != nil { - return err - } - } - if err := container.ToDiskLocking(); err != nil { - return fmt.Errorf("Error saving container to disk: %v", err) - } - return nil -} - -// DisconnectFromNetwork disconnects container from network n. -func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, networkName string, force bool) error { - n, err := daemon.FindNetwork(networkName) - if !container.Running || (err != nil && force) { - if container.RemovalInProgress || container.Dead { - return errRemovalContainer(container.ID) - } - // In case networkName is resolved we will use n.Name() - // this will cover the case where network id is passed. - if n != nil { - networkName = n.Name() - } - if _, ok := container.NetworkSettings.Networks[networkName]; !ok { - return fmt.Errorf("container %s is not connected to the network %s", container.ID, networkName) - } - delete(container.NetworkSettings.Networks, networkName) - } else if err == nil && !daemon.isNetworkHotPluggable() { - return fmt.Errorf(runtime.GOOS + " does not support connecting a running container to a network") - } else if err == nil { - if container.HostConfig.NetworkMode.IsHost() && containertypes.NetworkMode(n.Type()).IsHost() { - return runconfig.ErrConflictHostNetwork - } - - if err := daemon.disconnectFromNetwork(container, n, false); err != nil { - return err - } - } else { - return err - } - - if err := container.ToDiskLocking(); err != nil { - return fmt.Errorf("Error saving container to disk: %v", err) - } - - if n != nil { - attributes := map[string]string{ - "container": container.ID, - } - daemon.LogNetworkEventWithAttributes(n, "disconnect", attributes) - } - return nil -} - -// ActivateContainerServiceBinding puts this container into load balancer active rotation and DNS response -func (daemon *Daemon) ActivateContainerServiceBinding(containerName string) error { - container, err := daemon.GetContainer(containerName) - if err != nil { - return err - } - sb := daemon.getNetworkSandbox(container) - if sb == nil { - return fmt.Errorf("network sandbox does not exist for container %s", containerName) - } - return sb.EnableService() -} - -// DeactivateContainerServiceBinding remove this container fromload balancer active rotation, and DNS response -func (daemon *Daemon) DeactivateContainerServiceBinding(containerName string) error { - container, err := daemon.GetContainer(containerName) - if err != nil { - return err - } - sb := daemon.getNetworkSandbox(container) - if sb == nil { - return fmt.Errorf("network sandbox does not exist for container %s", containerName) - } - return sb.DisableService() -} diff --git a/vendor/github.com/docker/docker/daemon/container_operations_solaris.go b/vendor/github.com/docker/docker/daemon/container_operations_solaris.go deleted file mode 100644 index 1653948de..000000000 --- a/vendor/github.com/docker/docker/daemon/container_operations_solaris.go +++ /dev/null @@ -1,46 +0,0 @@ -// +build solaris - -package daemon - -import ( - "github.com/docker/docker/container" - "github.com/docker/docker/runconfig" - "github.com/docker/libnetwork" -) - -func (daemon *Daemon) setupLinkedContainers(container *container.Container) ([]string, error) { - return nil, nil -} - -func (daemon *Daemon) setupIpcDirs(container *container.Container) error { - return nil -} - -func killProcessDirectly(container *container.Container) error { - return nil -} - -func detachMounted(path string) error { - return nil -} - -func isLinkable(child *container.Container) bool { - // A container is linkable only if it belongs to the default network - _, ok := child.NetworkSettings.Networks[runconfig.DefaultDaemonNetworkMode().NetworkName()] - return ok -} - -func enableIPOnPredefinedNetwork() bool { - return false -} - -func (daemon *Daemon) isNetworkHotPluggable() bool { - return false -} - -func setupPathsAndSandboxOptions(container *container.Container, sboxOptions *[]libnetwork.SandboxOption) error { - return nil -} - -func initializeNetworkingPaths(container *container.Container, nc *container.Container) { -} diff --git a/vendor/github.com/docker/docker/daemon/container_operations_unix.go b/vendor/github.com/docker/docker/daemon/container_operations_unix.go deleted file mode 100644 index 229604576..000000000 --- a/vendor/github.com/docker/docker/daemon/container_operations_unix.go +++ /dev/null @@ -1,281 +0,0 @@ -// +build linux freebsd - -package daemon - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strconv" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - "github.com/cloudflare/cfssl/log" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/links" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/runconfig" - "github.com/docker/libnetwork" - "github.com/opencontainers/runc/libcontainer/label" - "github.com/pkg/errors" -) - -func (daemon *Daemon) setupLinkedContainers(container *container.Container) ([]string, error) { - var env []string - children := daemon.children(container) - - bridgeSettings := container.NetworkSettings.Networks[runconfig.DefaultDaemonNetworkMode().NetworkName()] - if bridgeSettings == nil || bridgeSettings.EndpointSettings == nil { - return nil, nil - } - - for linkAlias, child := range children { - if !child.IsRunning() { - return nil, fmt.Errorf("Cannot link to a non running container: %s AS %s", child.Name, linkAlias) - } - - childBridgeSettings := child.NetworkSettings.Networks[runconfig.DefaultDaemonNetworkMode().NetworkName()] - if childBridgeSettings == nil || childBridgeSettings.EndpointSettings == nil { - return nil, fmt.Errorf("container %s not attached to default bridge network", child.ID) - } - - link := links.NewLink( - bridgeSettings.IPAddress, - childBridgeSettings.IPAddress, - linkAlias, - child.Config.Env, - child.Config.ExposedPorts, - ) - - env = append(env, link.ToEnv()...) - } - - return env, nil -} - -func (daemon *Daemon) getIpcContainer(container *container.Container) (*container.Container, error) { - containerID := container.HostConfig.IpcMode.Container() - c, err := daemon.GetContainer(containerID) - if err != nil { - return nil, err - } - if !c.IsRunning() { - return nil, fmt.Errorf("cannot join IPC of a non running container: %s", containerID) - } - if c.IsRestarting() { - return nil, errContainerIsRestarting(container.ID) - } - return c, nil -} - -func (daemon *Daemon) getPidContainer(container *container.Container) (*container.Container, error) { - containerID := container.HostConfig.PidMode.Container() - c, err := daemon.GetContainer(containerID) - if err != nil { - return nil, err - } - if !c.IsRunning() { - return nil, fmt.Errorf("cannot join PID of a non running container: %s", containerID) - } - if c.IsRestarting() { - return nil, errContainerIsRestarting(container.ID) - } - return c, nil -} - -func (daemon *Daemon) setupIpcDirs(c *container.Container) error { - var err error - - c.ShmPath, err = c.ShmResourcePath() - if err != nil { - return err - } - - if c.HostConfig.IpcMode.IsContainer() { - ic, err := daemon.getIpcContainer(c) - if err != nil { - return err - } - c.ShmPath = ic.ShmPath - } else if c.HostConfig.IpcMode.IsHost() { - if _, err := os.Stat("/dev/shm"); err != nil { - return fmt.Errorf("/dev/shm is not mounted, but must be for --ipc=host") - } - c.ShmPath = "/dev/shm" - } else { - rootUID, rootGID := daemon.GetRemappedUIDGID() - if !c.HasMountFor("/dev/shm") { - shmPath, err := c.ShmResourcePath() - if err != nil { - return err - } - - if err := idtools.MkdirAllAs(shmPath, 0700, rootUID, rootGID); err != nil { - return err - } - - shmSize := container.DefaultSHMSize - if c.HostConfig.ShmSize != 0 { - shmSize = c.HostConfig.ShmSize - } - shmproperty := "mode=1777,size=" + strconv.FormatInt(shmSize, 10) - if err := syscall.Mount("shm", shmPath, "tmpfs", uintptr(syscall.MS_NOEXEC|syscall.MS_NOSUID|syscall.MS_NODEV), label.FormatMountLabel(shmproperty, c.GetMountLabel())); err != nil { - return fmt.Errorf("mounting shm tmpfs: %s", err) - } - if err := os.Chown(shmPath, rootUID, rootGID); err != nil { - return err - } - } - - } - - return nil -} - -func (daemon *Daemon) setupSecretDir(c *container.Container) (setupErr error) { - if len(c.SecretReferences) == 0 { - return nil - } - - localMountPath := c.SecretMountPath() - logrus.Debugf("secrets: setting up secret dir: %s", localMountPath) - - defer func() { - if setupErr != nil { - // cleanup - _ = detachMounted(localMountPath) - - if err := os.RemoveAll(localMountPath); err != nil { - log.Errorf("error cleaning up secret mount: %s", err) - } - } - }() - - // retrieve possible remapped range start for root UID, GID - rootUID, rootGID := daemon.GetRemappedUIDGID() - // create tmpfs - if err := idtools.MkdirAllAs(localMountPath, 0700, rootUID, rootGID); err != nil { - return errors.Wrap(err, "error creating secret local mount path") - } - tmpfsOwnership := fmt.Sprintf("uid=%d,gid=%d", rootUID, rootGID) - if err := mount.Mount("tmpfs", localMountPath, "tmpfs", "nodev,nosuid,noexec,"+tmpfsOwnership); err != nil { - return errors.Wrap(err, "unable to setup secret mount") - } - - for _, s := range c.SecretReferences { - if c.SecretStore == nil { - return fmt.Errorf("secret store is not initialized") - } - - // TODO (ehazlett): use type switch when more are supported - if s.File == nil { - return fmt.Errorf("secret target type is not a file target") - } - - targetPath := filepath.Clean(s.File.Name) - // ensure that the target is a filename only; no paths allowed - if targetPath != filepath.Base(targetPath) { - return fmt.Errorf("error creating secret: secret must not be a path") - } - - fPath := filepath.Join(localMountPath, targetPath) - if err := idtools.MkdirAllAs(filepath.Dir(fPath), 0700, rootUID, rootGID); err != nil { - return errors.Wrap(err, "error creating secret mount path") - } - - logrus.WithFields(logrus.Fields{ - "name": s.File.Name, - "path": fPath, - }).Debug("injecting secret") - secret := c.SecretStore.Get(s.SecretID) - if secret == nil { - return fmt.Errorf("unable to get secret from secret store") - } - if err := ioutil.WriteFile(fPath, secret.Spec.Data, s.File.Mode); err != nil { - return errors.Wrap(err, "error injecting secret") - } - - uid, err := strconv.Atoi(s.File.UID) - if err != nil { - return err - } - gid, err := strconv.Atoi(s.File.GID) - if err != nil { - return err - } - - if err := os.Chown(fPath, rootUID+uid, rootGID+gid); err != nil { - return errors.Wrap(err, "error setting ownership for secret") - } - } - - // remount secrets ro - if err := mount.Mount("tmpfs", localMountPath, "tmpfs", "remount,ro,"+tmpfsOwnership); err != nil { - return errors.Wrap(err, "unable to remount secret dir as readonly") - } - - return nil -} - -func killProcessDirectly(container *container.Container) error { - if _, err := container.WaitStop(10 * time.Second); err != nil { - // Ensure that we don't kill ourselves - if pid := container.GetPID(); pid != 0 { - logrus.Infof("Container %s failed to exit within 10 seconds of kill - trying direct SIGKILL", stringid.TruncateID(container.ID)) - if err := syscall.Kill(pid, 9); err != nil { - if err != syscall.ESRCH { - return err - } - e := errNoSuchProcess{pid, 9} - logrus.Debug(e) - return e - } - } - } - return nil -} - -func detachMounted(path string) error { - return syscall.Unmount(path, syscall.MNT_DETACH) -} - -func isLinkable(child *container.Container) bool { - // A container is linkable only if it belongs to the default network - _, ok := child.NetworkSettings.Networks[runconfig.DefaultDaemonNetworkMode().NetworkName()] - return ok -} - -func enableIPOnPredefinedNetwork() bool { - return false -} - -func (daemon *Daemon) isNetworkHotPluggable() bool { - return true -} - -func setupPathsAndSandboxOptions(container *container.Container, sboxOptions *[]libnetwork.SandboxOption) error { - var err error - - container.HostsPath, err = container.GetRootResourcePath("hosts") - if err != nil { - return err - } - *sboxOptions = append(*sboxOptions, libnetwork.OptionHostsPath(container.HostsPath)) - - container.ResolvConfPath, err = container.GetRootResourcePath("resolv.conf") - if err != nil { - return err - } - *sboxOptions = append(*sboxOptions, libnetwork.OptionResolvConfPath(container.ResolvConfPath)) - return nil -} - -func initializeNetworkingPaths(container *container.Container, nc *container.Container) { - container.HostnamePath = nc.HostnamePath - container.HostsPath = nc.HostsPath - container.ResolvConfPath = nc.ResolvConfPath -} diff --git a/vendor/github.com/docker/docker/daemon/container_operations_windows.go b/vendor/github.com/docker/docker/daemon/container_operations_windows.go deleted file mode 100644 index d05f251e0..000000000 --- a/vendor/github.com/docker/docker/daemon/container_operations_windows.go +++ /dev/null @@ -1,59 +0,0 @@ -// +build windows - -package daemon - -import ( - "github.com/docker/docker/container" - "github.com/docker/libnetwork" -) - -func (daemon *Daemon) setupLinkedContainers(container *container.Container) ([]string, error) { - return nil, nil -} - -// getSize returns real size & virtual size -func (daemon *Daemon) getSize(container *container.Container) (int64, int64) { - // TODO Windows - return 0, 0 -} - -func (daemon *Daemon) setupIpcDirs(container *container.Container) error { - return nil -} - -// TODO Windows: Fix Post-TP5. This is a hack to allow docker cp to work -// against containers which have volumes. You will still be able to cp -// to somewhere on the container drive, but not to any mounted volumes -// inside the container. Without this fix, docker cp is broken to any -// container which has a volume, regardless of where the file is inside the -// container. -func (daemon *Daemon) mountVolumes(container *container.Container) error { - return nil -} - -func detachMounted(path string) error { - return nil -} - -func killProcessDirectly(container *container.Container) error { - return nil -} - -func isLinkable(child *container.Container) bool { - return false -} - -func enableIPOnPredefinedNetwork() bool { - return true -} - -func (daemon *Daemon) isNetworkHotPluggable() bool { - return false -} - -func setupPathsAndSandboxOptions(container *container.Container, sboxOptions *[]libnetwork.SandboxOption) error { - return nil -} - -func initializeNetworkingPaths(container *container.Container, nc *container.Container) { -} diff --git a/vendor/github.com/docker/docker/daemon/create.go b/vendor/github.com/docker/docker/daemon/create.go deleted file mode 100644 index c71d14e5f..000000000 --- a/vendor/github.com/docker/docker/daemon/create.go +++ /dev/null @@ -1,290 +0,0 @@ -package daemon - -import ( - "fmt" - "net" - "runtime" - "strings" - "time" - - "github.com/pkg/errors" - - "github.com/Sirupsen/logrus" - apierrors "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" - networktypes "github.com/docker/docker/api/types/network" - "github.com/docker/docker/container" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/runconfig" - volumestore "github.com/docker/docker/volume/store" - "github.com/opencontainers/runc/libcontainer/label" -) - -// CreateManagedContainer creates a container that is managed by a Service -func (daemon *Daemon) CreateManagedContainer(params types.ContainerCreateConfig) (containertypes.ContainerCreateCreatedBody, error) { - return daemon.containerCreate(params, true) -} - -// ContainerCreate creates a regular container -func (daemon *Daemon) ContainerCreate(params types.ContainerCreateConfig) (containertypes.ContainerCreateCreatedBody, error) { - return daemon.containerCreate(params, false) -} - -func (daemon *Daemon) containerCreate(params types.ContainerCreateConfig, managed bool) (containertypes.ContainerCreateCreatedBody, error) { - start := time.Now() - if params.Config == nil { - return containertypes.ContainerCreateCreatedBody{}, fmt.Errorf("Config cannot be empty in order to create a container") - } - - warnings, err := daemon.verifyContainerSettings(params.HostConfig, params.Config, false) - if err != nil { - return containertypes.ContainerCreateCreatedBody{Warnings: warnings}, err - } - - err = daemon.verifyNetworkingConfig(params.NetworkingConfig) - if err != nil { - return containertypes.ContainerCreateCreatedBody{Warnings: warnings}, err - } - - if params.HostConfig == nil { - params.HostConfig = &containertypes.HostConfig{} - } - err = daemon.adaptContainerSettings(params.HostConfig, params.AdjustCPUShares) - if err != nil { - return containertypes.ContainerCreateCreatedBody{Warnings: warnings}, err - } - - container, err := daemon.create(params, managed) - if err != nil { - return containertypes.ContainerCreateCreatedBody{Warnings: warnings}, daemon.imageNotExistToErrcode(err) - } - containerActions.WithValues("create").UpdateSince(start) - - return containertypes.ContainerCreateCreatedBody{ID: container.ID, Warnings: warnings}, nil -} - -// Create creates a new container from the given configuration with a given name. -func (daemon *Daemon) create(params types.ContainerCreateConfig, managed bool) (retC *container.Container, retErr error) { - var ( - container *container.Container - img *image.Image - imgID image.ID - err error - ) - - if params.Config.Image != "" { - img, err = daemon.GetImage(params.Config.Image) - if err != nil { - return nil, err - } - - if runtime.GOOS == "solaris" && img.OS != "solaris " { - return nil, errors.New("Platform on which parent image was created is not Solaris") - } - imgID = img.ID() - } - - if err := daemon.mergeAndVerifyConfig(params.Config, img); err != nil { - return nil, err - } - - if err := daemon.mergeAndVerifyLogConfig(¶ms.HostConfig.LogConfig); err != nil { - return nil, err - } - - if container, err = daemon.newContainer(params.Name, params.Config, params.HostConfig, imgID, managed); err != nil { - return nil, err - } - defer func() { - if retErr != nil { - if err := daemon.cleanupContainer(container, true, true); err != nil { - logrus.Errorf("failed to cleanup container on create error: %v", err) - } - } - }() - - if err := daemon.setSecurityOptions(container, params.HostConfig); err != nil { - return nil, err - } - - container.HostConfig.StorageOpt = params.HostConfig.StorageOpt - - // Set RWLayer for container after mount labels have been set - if err := daemon.setRWLayer(container); err != nil { - return nil, err - } - - rootUID, rootGID, err := idtools.GetRootUIDGID(daemon.uidMaps, daemon.gidMaps) - if err != nil { - return nil, err - } - if err := idtools.MkdirAs(container.Root, 0700, rootUID, rootGID); err != nil { - return nil, err - } - if err := idtools.MkdirAs(container.CheckpointDir(), 0700, rootUID, rootGID); err != nil { - return nil, err - } - - if err := daemon.setHostConfig(container, params.HostConfig); err != nil { - return nil, err - } - - if err := daemon.createContainerPlatformSpecificSettings(container, params.Config, params.HostConfig); err != nil { - return nil, err - } - - var endpointsConfigs map[string]*networktypes.EndpointSettings - if params.NetworkingConfig != nil { - endpointsConfigs = params.NetworkingConfig.EndpointsConfig - } - // Make sure NetworkMode has an acceptable value. We do this to ensure - // backwards API compatibility. - container.HostConfig = runconfig.SetDefaultNetModeIfBlank(container.HostConfig) - - daemon.updateContainerNetworkSettings(container, endpointsConfigs) - - if err := container.ToDisk(); err != nil { - logrus.Errorf("Error saving new container to disk: %v", err) - return nil, err - } - if err := daemon.Register(container); err != nil { - return nil, err - } - daemon.LogContainerEvent(container, "create") - return container, nil -} - -func (daemon *Daemon) generateSecurityOpt(ipcMode containertypes.IpcMode, pidMode containertypes.PidMode, privileged bool) ([]string, error) { - if ipcMode.IsHost() || pidMode.IsHost() || privileged { - return label.DisableSecOpt(), nil - } - - var ipcLabel []string - var pidLabel []string - ipcContainer := ipcMode.Container() - pidContainer := pidMode.Container() - if ipcContainer != "" { - c, err := daemon.GetContainer(ipcContainer) - if err != nil { - return nil, err - } - ipcLabel = label.DupSecOpt(c.ProcessLabel) - if pidContainer == "" { - return ipcLabel, err - } - } - if pidContainer != "" { - c, err := daemon.GetContainer(pidContainer) - if err != nil { - return nil, err - } - - pidLabel = label.DupSecOpt(c.ProcessLabel) - if ipcContainer == "" { - return pidLabel, err - } - } - - if pidLabel != nil && ipcLabel != nil { - for i := 0; i < len(pidLabel); i++ { - if pidLabel[i] != ipcLabel[i] { - return nil, fmt.Errorf("--ipc and --pid containers SELinux labels aren't the same") - } - } - return pidLabel, nil - } - return nil, nil -} - -func (daemon *Daemon) setRWLayer(container *container.Container) error { - var layerID layer.ChainID - if container.ImageID != "" { - img, err := daemon.imageStore.Get(container.ImageID) - if err != nil { - return err - } - layerID = img.RootFS.ChainID() - } - - rwLayer, err := daemon.layerStore.CreateRWLayer(container.ID, layerID, container.MountLabel, daemon.getLayerInit(), container.HostConfig.StorageOpt) - - if err != nil { - return err - } - container.RWLayer = rwLayer - - return nil -} - -// VolumeCreate creates a volume with the specified name, driver, and opts -// This is called directly from the Engine API -func (daemon *Daemon) VolumeCreate(name, driverName string, opts, labels map[string]string) (*types.Volume, error) { - if name == "" { - name = stringid.GenerateNonCryptoID() - } - - v, err := daemon.volumes.Create(name, driverName, opts, labels) - if err != nil { - if volumestore.IsNameConflict(err) { - return nil, fmt.Errorf("A volume named %s already exists. Choose a different volume name.", name) - } - return nil, err - } - - daemon.LogVolumeEvent(v.Name(), "create", map[string]string{"driver": v.DriverName()}) - apiV := volumeToAPIType(v) - apiV.Mountpoint = v.Path() - return apiV, nil -} - -func (daemon *Daemon) mergeAndVerifyConfig(config *containertypes.Config, img *image.Image) error { - if img != nil && img.Config != nil { - if err := merge(config, img.Config); err != nil { - return err - } - } - // Reset the Entrypoint if it is [""] - if len(config.Entrypoint) == 1 && config.Entrypoint[0] == "" { - config.Entrypoint = nil - } - if len(config.Entrypoint) == 0 && len(config.Cmd) == 0 { - return fmt.Errorf("No command specified") - } - return nil -} - -// Checks if the client set configurations for more than one network while creating a container -// Also checks if the IPAMConfig is valid -func (daemon *Daemon) verifyNetworkingConfig(nwConfig *networktypes.NetworkingConfig) error { - if nwConfig == nil || len(nwConfig.EndpointsConfig) == 0 { - return nil - } - if len(nwConfig.EndpointsConfig) == 1 { - for _, v := range nwConfig.EndpointsConfig { - if v != nil && v.IPAMConfig != nil { - if v.IPAMConfig.IPv4Address != "" && net.ParseIP(v.IPAMConfig.IPv4Address).To4() == nil { - return apierrors.NewBadRequestError(fmt.Errorf("invalid IPv4 address: %s", v.IPAMConfig.IPv4Address)) - } - if v.IPAMConfig.IPv6Address != "" { - n := net.ParseIP(v.IPAMConfig.IPv6Address) - // if the address is an invalid network address (ParseIP == nil) or if it is - // an IPv4 address (To4() != nil), then it is an invalid IPv6 address - if n == nil || n.To4() != nil { - return apierrors.NewBadRequestError(fmt.Errorf("invalid IPv6 address: %s", v.IPAMConfig.IPv6Address)) - } - } - } - } - return nil - } - l := make([]string, 0, len(nwConfig.EndpointsConfig)) - for k := range nwConfig.EndpointsConfig { - l = append(l, k) - } - err := fmt.Errorf("Container cannot be connected to network endpoints: %s", strings.Join(l, ", ")) - return apierrors.NewBadRequestError(err) -} diff --git a/vendor/github.com/docker/docker/daemon/create_unix.go b/vendor/github.com/docker/docker/daemon/create_unix.go deleted file mode 100644 index 2fe5c98a7..000000000 --- a/vendor/github.com/docker/docker/daemon/create_unix.go +++ /dev/null @@ -1,81 +0,0 @@ -// +build !windows - -package daemon - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/Sirupsen/logrus" - containertypes "github.com/docker/docker/api/types/container" - mounttypes "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/stringid" - "github.com/opencontainers/runc/libcontainer/label" -) - -// createContainerPlatformSpecificSettings performs platform specific container create functionality -func (daemon *Daemon) createContainerPlatformSpecificSettings(container *container.Container, config *containertypes.Config, hostConfig *containertypes.HostConfig) error { - if err := daemon.Mount(container); err != nil { - return err - } - defer daemon.Unmount(container) - - rootUID, rootGID := daemon.GetRemappedUIDGID() - if err := container.SetupWorkingDirectory(rootUID, rootGID); err != nil { - return err - } - - for spec := range config.Volumes { - name := stringid.GenerateNonCryptoID() - destination := filepath.Clean(spec) - - // Skip volumes for which we already have something mounted on that - // destination because of a --volume-from. - if container.IsDestinationMounted(destination) { - continue - } - path, err := container.GetResourcePath(destination) - if err != nil { - return err - } - - stat, err := os.Stat(path) - if err == nil && !stat.IsDir() { - return fmt.Errorf("cannot mount volume over existing file, file exists %s", path) - } - - v, err := daemon.volumes.CreateWithRef(name, hostConfig.VolumeDriver, container.ID, nil, nil) - if err != nil { - return err - } - - if err := label.Relabel(v.Path(), container.MountLabel, true); err != nil { - return err - } - - container.AddMountPointWithVolume(destination, v, true) - } - return daemon.populateVolumes(container) -} - -// populateVolumes copies data from the container's rootfs into the volume for non-binds. -// this is only called when the container is created. -func (daemon *Daemon) populateVolumes(c *container.Container) error { - for _, mnt := range c.MountPoints { - if mnt.Volume == nil { - continue - } - - if mnt.Type != mounttypes.TypeVolume || !mnt.CopyData { - continue - } - - logrus.Debugf("copying image data from %s:%s, to %s", c.ID, mnt.Destination, mnt.Name) - if err := c.CopyImagePathContent(mnt.Volume, mnt.Destination); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/create_windows.go b/vendor/github.com/docker/docker/daemon/create_windows.go deleted file mode 100644 index bbf0dbe7b..000000000 --- a/vendor/github.com/docker/docker/daemon/create_windows.go +++ /dev/null @@ -1,80 +0,0 @@ -package daemon - -import ( - "fmt" - - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/volume" -) - -// createContainerPlatformSpecificSettings performs platform specific container create functionality -func (daemon *Daemon) createContainerPlatformSpecificSettings(container *container.Container, config *containertypes.Config, hostConfig *containertypes.HostConfig) error { - // Make sure the host config has the default daemon isolation if not specified by caller. - if containertypes.Isolation.IsDefault(containertypes.Isolation(hostConfig.Isolation)) { - hostConfig.Isolation = daemon.defaultIsolation - } - - for spec := range config.Volumes { - - mp, err := volume.ParseMountRaw(spec, hostConfig.VolumeDriver) - if err != nil { - return fmt.Errorf("Unrecognised volume spec: %v", err) - } - - // If the mountpoint doesn't have a name, generate one. - if len(mp.Name) == 0 { - mp.Name = stringid.GenerateNonCryptoID() - } - - // Skip volumes for which we already have something mounted on that - // destination because of a --volume-from. - if container.IsDestinationMounted(mp.Destination) { - continue - } - - volumeDriver := hostConfig.VolumeDriver - - // Create the volume in the volume driver. If it doesn't exist, - // a new one will be created. - v, err := daemon.volumes.CreateWithRef(mp.Name, volumeDriver, container.ID, nil, nil) - if err != nil { - return err - } - - // FIXME Windows: This code block is present in the Linux version and - // allows the contents to be copied to the container FS prior to it - // being started. However, the function utilizes the FollowSymLinkInScope - // path which does not cope with Windows volume-style file paths. There - // is a separate effort to resolve this (@swernli), so this processing - // is deferred for now. A case where this would be useful is when - // a dockerfile includes a VOLUME statement, but something is created - // in that directory during the dockerfile processing. What this means - // on Windows for TP5 is that in that scenario, the contents will not - // copied, but that's (somewhat) OK as HCS will bomb out soon after - // at it doesn't support mapped directories which have contents in the - // destination path anyway. - // - // Example for repro later: - // FROM windowsservercore - // RUN mkdir c:\myvol - // RUN copy c:\windows\system32\ntdll.dll c:\myvol - // VOLUME "c:\myvol" - // - // Then - // docker build -t vol . - // docker run -it --rm vol cmd <-- This is where HCS will error out. - // - // // never attempt to copy existing content in a container FS to a shared volume - // if v.DriverName() == volume.DefaultDriverName { - // if err := container.CopyImagePathContent(v, mp.Destination); err != nil { - // return err - // } - // } - - // Add it to container.MountPoints - container.AddMountPointWithVolume(mp.Destination, v, mp.RW) - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/daemon.go b/vendor/github.com/docker/docker/daemon/daemon.go deleted file mode 100644 index 55a66aec9..000000000 --- a/vendor/github.com/docker/docker/daemon/daemon.go +++ /dev/null @@ -1,1321 +0,0 @@ -// Package daemon exposes the functions that occur on the host server -// that the Docker daemon is running. -// -// In implementing the various functions of the daemon, there is often -// a method-specific struct for configuring the runtime behavior. -package daemon - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "net" - "os" - "path" - "path/filepath" - "runtime" - "strings" - "sync" - "time" - - "github.com/Sirupsen/logrus" - containerd "github.com/docker/containerd/api/grpc/types" - "github.com/docker/docker/api" - "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/events" - "github.com/docker/docker/daemon/exec" - "github.com/docker/docker/daemon/initlayer" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/plugin" - "github.com/docker/libnetwork/cluster" - // register graph drivers - _ "github.com/docker/docker/daemon/graphdriver/register" - dmetadata "github.com/docker/docker/distribution/metadata" - "github.com/docker/docker/distribution/xfer" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/libcontainerd" - "github.com/docker/docker/migrate/v1" - "github.com/docker/docker/pkg/fileutils" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/plugingetter" - "github.com/docker/docker/pkg/registrar" - "github.com/docker/docker/pkg/signal" - "github.com/docker/docker/pkg/sysinfo" - "github.com/docker/docker/pkg/system" - "github.com/docker/docker/pkg/truncindex" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "github.com/docker/docker/runconfig" - volumedrivers "github.com/docker/docker/volume/drivers" - "github.com/docker/docker/volume/local" - "github.com/docker/docker/volume/store" - "github.com/docker/libnetwork" - nwconfig "github.com/docker/libnetwork/config" - "github.com/docker/libtrust" - "github.com/pkg/errors" -) - -var ( - // DefaultRuntimeBinary is the default runtime to be used by - // containerd if none is specified - DefaultRuntimeBinary = "docker-runc" - - // DefaultInitBinary is the name of the default init binary - DefaultInitBinary = "docker-init" - - errSystemNotSupported = fmt.Errorf("The Docker daemon is not supported on this platform.") -) - -// Daemon holds information about the Docker daemon. -type Daemon struct { - ID string - repository string - containers container.Store - execCommands *exec.Store - referenceStore reference.Store - downloadManager *xfer.LayerDownloadManager - uploadManager *xfer.LayerUploadManager - distributionMetadataStore dmetadata.Store - trustKey libtrust.PrivateKey - idIndex *truncindex.TruncIndex - configStore *Config - statsCollector *statsCollector - defaultLogConfig containertypes.LogConfig - RegistryService registry.Service - EventsService *events.Events - netController libnetwork.NetworkController - volumes *store.VolumeStore - discoveryWatcher discoveryReloader - root string - seccompEnabled bool - shutdown bool - uidMaps []idtools.IDMap - gidMaps []idtools.IDMap - layerStore layer.Store - imageStore image.Store - PluginStore *plugin.Store // todo: remove - pluginManager *plugin.Manager - nameIndex *registrar.Registrar - linkIndex *linkIndex - containerd libcontainerd.Client - containerdRemote libcontainerd.Remote - defaultIsolation containertypes.Isolation // Default isolation mode on Windows - clusterProvider cluster.Provider - cluster Cluster - - seccompProfile []byte - seccompProfilePath string -} - -// HasExperimental returns whether the experimental features of the daemon are enabled or not -func (daemon *Daemon) HasExperimental() bool { - if daemon.configStore != nil && daemon.configStore.Experimental { - return true - } - return false -} - -func (daemon *Daemon) restore() error { - var ( - currentDriver = daemon.GraphDriverName() - containers = make(map[string]*container.Container) - ) - - logrus.Info("Loading containers: start.") - - dir, err := ioutil.ReadDir(daemon.repository) - if err != nil { - return err - } - - for _, v := range dir { - id := v.Name() - container, err := daemon.load(id) - if err != nil { - logrus.Errorf("Failed to load container %v: %v", id, err) - continue - } - - // Ignore the container if it does not support the current driver being used by the graph - if (container.Driver == "" && currentDriver == "aufs") || container.Driver == currentDriver { - rwlayer, err := daemon.layerStore.GetRWLayer(container.ID) - if err != nil { - logrus.Errorf("Failed to load container mount %v: %v", id, err) - continue - } - container.RWLayer = rwlayer - logrus.Debugf("Loaded container %v", container.ID) - - containers[container.ID] = container - } else { - logrus.Debugf("Cannot load container %s because it was created with another graph driver.", container.ID) - } - } - - removeContainers := make(map[string]*container.Container) - restartContainers := make(map[*container.Container]chan struct{}) - activeSandboxes := make(map[string]interface{}) - for id, c := range containers { - if err := daemon.registerName(c); err != nil { - logrus.Errorf("Failed to register container %s: %s", c.ID, err) - delete(containers, id) - continue - } - if err := daemon.Register(c); err != nil { - logrus.Errorf("Failed to register container %s: %s", c.ID, err) - delete(containers, id) - continue - } - - // verify that all volumes valid and have been migrated from the pre-1.7 layout - if err := daemon.verifyVolumesInfo(c); err != nil { - // don't skip the container due to error - logrus.Errorf("Failed to verify volumes for container '%s': %v", c.ID, err) - } - - // The LogConfig.Type is empty if the container was created before docker 1.12 with default log driver. - // We should rewrite it to use the daemon defaults. - // Fixes https://github.com/docker/docker/issues/22536 - if c.HostConfig.LogConfig.Type == "" { - if err := daemon.mergeAndVerifyLogConfig(&c.HostConfig.LogConfig); err != nil { - logrus.Errorf("Failed to verify log config for container %s: %q", c.ID, err) - continue - } - } - } - - var migrateLegacyLinks bool // Not relevant on Windows - var wg sync.WaitGroup - var mapLock sync.Mutex - for _, c := range containers { - wg.Add(1) - go func(c *container.Container) { - defer wg.Done() - if err := backportMountSpec(c); err != nil { - logrus.Error("Failed to migrate old mounts to use new spec format") - } - - if c.IsRunning() || c.IsPaused() { - c.RestartManager().Cancel() // manually start containers because some need to wait for swarm networking - if err := daemon.containerd.Restore(c.ID, c.InitializeStdio); err != nil { - logrus.Errorf("Failed to restore %s with containerd: %s", c.ID, err) - return - } - - // we call Mount and then Unmount to get BaseFs of the container - if err := daemon.Mount(c); err != nil { - // The mount is unlikely to fail. However, in case mount fails - // the container should be allowed to restore here. Some functionalities - // (like docker exec -u user) might be missing but container is able to be - // stopped/restarted/removed. - // See #29365 for related information. - // The error is only logged here. - logrus.Warnf("Failed to mount container on getting BaseFs path %v: %v", c.ID, err) - } else { - // if mount success, then unmount it - if err := daemon.Unmount(c); err != nil { - logrus.Warnf("Failed to umount container on getting BaseFs path %v: %v", c.ID, err) - } - } - - c.ResetRestartManager(false) - if !c.HostConfig.NetworkMode.IsContainer() && c.IsRunning() { - options, err := daemon.buildSandboxOptions(c) - if err != nil { - logrus.Warnf("Failed build sandbox option to restore container %s: %v", c.ID, err) - } - mapLock.Lock() - activeSandboxes[c.NetworkSettings.SandboxID] = options - mapLock.Unlock() - } - - } - // fixme: only if not running - // get list of containers we need to restart - if !c.IsRunning() && !c.IsPaused() { - // Do not autostart containers which - // has endpoints in a swarm scope - // network yet since the cluster is - // not initialized yet. We will start - // it after the cluster is - // initialized. - if daemon.configStore.AutoRestart && c.ShouldRestart() && !c.NetworkSettings.HasSwarmEndpoint { - mapLock.Lock() - restartContainers[c] = make(chan struct{}) - mapLock.Unlock() - } else if c.HostConfig != nil && c.HostConfig.AutoRemove { - mapLock.Lock() - removeContainers[c.ID] = c - mapLock.Unlock() - } - } - - if c.RemovalInProgress { - // We probably crashed in the middle of a removal, reset - // the flag. - // - // We DO NOT remove the container here as we do not - // know if the user had requested for either the - // associated volumes, network links or both to also - // be removed. So we put the container in the "dead" - // state and leave further processing up to them. - logrus.Debugf("Resetting RemovalInProgress flag from %v", c.ID) - c.ResetRemovalInProgress() - c.SetDead() - c.ToDisk() - } - - // if c.hostConfig.Links is nil (not just empty), then it is using the old sqlite links and needs to be migrated - if c.HostConfig != nil && c.HostConfig.Links == nil { - migrateLegacyLinks = true - } - }(c) - } - wg.Wait() - daemon.netController, err = daemon.initNetworkController(daemon.configStore, activeSandboxes) - if err != nil { - return fmt.Errorf("Error initializing network controller: %v", err) - } - - // Perform migration of legacy sqlite links (no-op on Windows) - if migrateLegacyLinks { - if err := daemon.sqliteMigration(containers); err != nil { - return err - } - } - - // Now that all the containers are registered, register the links - for _, c := range containers { - if err := daemon.registerLinks(c, c.HostConfig); err != nil { - logrus.Errorf("failed to register link for container %s: %v", c.ID, err) - } - } - - group := sync.WaitGroup{} - for c, notifier := range restartContainers { - group.Add(1) - - go func(c *container.Container, chNotify chan struct{}) { - defer group.Done() - - logrus.Debugf("Starting container %s", c.ID) - - // ignore errors here as this is a best effort to wait for children to be - // running before we try to start the container - children := daemon.children(c) - timeout := time.After(5 * time.Second) - for _, child := range children { - if notifier, exists := restartContainers[child]; exists { - select { - case <-notifier: - case <-timeout: - } - } - } - - // Make sure networks are available before starting - daemon.waitForNetworks(c) - if err := daemon.containerStart(c, "", "", true); err != nil { - logrus.Errorf("Failed to start container %s: %s", c.ID, err) - } - close(chNotify) - }(c, notifier) - - } - group.Wait() - - removeGroup := sync.WaitGroup{} - for id := range removeContainers { - removeGroup.Add(1) - go func(cid string) { - if err := daemon.ContainerRm(cid, &types.ContainerRmConfig{ForceRemove: true, RemoveVolume: true}); err != nil { - logrus.Errorf("Failed to remove container %s: %s", cid, err) - } - removeGroup.Done() - }(id) - } - removeGroup.Wait() - - // any containers that were started above would already have had this done, - // however we need to now prepare the mountpoints for the rest of the containers as well. - // This shouldn't cause any issue running on the containers that already had this run. - // This must be run after any containers with a restart policy so that containerized plugins - // can have a chance to be running before we try to initialize them. - for _, c := range containers { - // if the container has restart policy, do not - // prepare the mountpoints since it has been done on restarting. - // This is to speed up the daemon start when a restart container - // has a volume and the volume dirver is not available. - if _, ok := restartContainers[c]; ok { - continue - } else if _, ok := removeContainers[c.ID]; ok { - // container is automatically removed, skip it. - continue - } - - group.Add(1) - go func(c *container.Container) { - defer group.Done() - if err := daemon.prepareMountPoints(c); err != nil { - logrus.Error(err) - } - }(c) - } - - group.Wait() - - logrus.Info("Loading containers: done.") - - return nil -} - -// RestartSwarmContainers restarts any autostart container which has a -// swarm endpoint. -func (daemon *Daemon) RestartSwarmContainers() { - group := sync.WaitGroup{} - for _, c := range daemon.List() { - if !c.IsRunning() && !c.IsPaused() { - // Autostart all the containers which has a - // swarm endpoint now that the cluster is - // initialized. - if daemon.configStore.AutoRestart && c.ShouldRestart() && c.NetworkSettings.HasSwarmEndpoint { - group.Add(1) - go func(c *container.Container) { - defer group.Done() - if err := daemon.containerStart(c, "", "", true); err != nil { - logrus.Error(err) - } - }(c) - } - } - - } - group.Wait() -} - -// waitForNetworks is used during daemon initialization when starting up containers -// It ensures that all of a container's networks are available before the daemon tries to start the container. -// In practice it just makes sure the discovery service is available for containers which use a network that require discovery. -func (daemon *Daemon) waitForNetworks(c *container.Container) { - if daemon.discoveryWatcher == nil { - return - } - // Make sure if the container has a network that requires discovery that the discovery service is available before starting - for netName := range c.NetworkSettings.Networks { - // If we get `ErrNoSuchNetwork` here, we can assume that it is due to discovery not being ready - // Most likely this is because the K/V store used for discovery is in a container and needs to be started - if _, err := daemon.netController.NetworkByName(netName); err != nil { - if _, ok := err.(libnetwork.ErrNoSuchNetwork); !ok { - continue - } - // use a longish timeout here due to some slowdowns in libnetwork if the k/v store is on anything other than --net=host - // FIXME: why is this slow??? - logrus.Debugf("Container %s waiting for network to be ready", c.Name) - select { - case <-daemon.discoveryWatcher.ReadyCh(): - case <-time.After(60 * time.Second): - } - return - } - } -} - -func (daemon *Daemon) children(c *container.Container) map[string]*container.Container { - return daemon.linkIndex.children(c) -} - -// parents returns the names of the parent containers of the container -// with the given name. -func (daemon *Daemon) parents(c *container.Container) map[string]*container.Container { - return daemon.linkIndex.parents(c) -} - -func (daemon *Daemon) registerLink(parent, child *container.Container, alias string) error { - fullName := path.Join(parent.Name, alias) - if err := daemon.nameIndex.Reserve(fullName, child.ID); err != nil { - if err == registrar.ErrNameReserved { - logrus.Warnf("error registering link for %s, to %s, as alias %s, ignoring: %v", parent.ID, child.ID, alias, err) - return nil - } - return err - } - daemon.linkIndex.link(parent, child, fullName) - return nil -} - -// DaemonJoinsCluster informs the daemon has joined the cluster and provides -// the handler to query the cluster component -func (daemon *Daemon) DaemonJoinsCluster(clusterProvider cluster.Provider) { - daemon.setClusterProvider(clusterProvider) -} - -// DaemonLeavesCluster informs the daemon has left the cluster -func (daemon *Daemon) DaemonLeavesCluster() { - // Daemon is in charge of removing the attachable networks with - // connected containers when the node leaves the swarm - daemon.clearAttachableNetworks() - daemon.setClusterProvider(nil) -} - -// setClusterProvider sets a component for querying the current cluster state. -func (daemon *Daemon) setClusterProvider(clusterProvider cluster.Provider) { - daemon.clusterProvider = clusterProvider - // call this in a goroutine to allow netcontroller handle this event async - // and not block if it is in the middle of talking with cluster - go daemon.netController.SetClusterProvider(clusterProvider) -} - -// IsSwarmCompatible verifies if the current daemon -// configuration is compatible with the swarm mode -func (daemon *Daemon) IsSwarmCompatible() error { - if daemon.configStore == nil { - return nil - } - return daemon.configStore.isSwarmCompatible() -} - -// NewDaemon sets up everything for the daemon to be able to service -// requests from the webserver. -func NewDaemon(config *Config, registryService registry.Service, containerdRemote libcontainerd.Remote) (daemon *Daemon, err error) { - setDefaultMtu(config) - - // Ensure that we have a correct root key limit for launching containers. - if err := ModifyRootKeyLimit(); err != nil { - logrus.Warnf("unable to modify root key limit, number of containers could be limited by this quota: %v", err) - } - - // Ensure we have compatible and valid configuration options - if err := verifyDaemonSettings(config); err != nil { - return nil, err - } - - // Do we have a disabled network? - config.DisableBridge = isBridgeNetworkDisabled(config) - - // Verify the platform is supported as a daemon - if !platformSupported { - return nil, errSystemNotSupported - } - - // Validate platform-specific requirements - if err := checkSystem(); err != nil { - return nil, err - } - - uidMaps, gidMaps, err := setupRemappedRoot(config) - if err != nil { - return nil, err - } - rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps) - if err != nil { - return nil, err - } - - if err := setupDaemonProcess(config); err != nil { - return nil, err - } - - // set up the tmpDir to use a canonical path - tmp, err := tempDir(config.Root, rootUID, rootGID) - if err != nil { - return nil, fmt.Errorf("Unable to get the TempDir under %s: %s", config.Root, err) - } - realTmp, err := fileutils.ReadSymlinkedDirectory(tmp) - if err != nil { - return nil, fmt.Errorf("Unable to get the full path to the TempDir (%s): %s", tmp, err) - } - os.Setenv("TMPDIR", realTmp) - - d := &Daemon{configStore: config} - // Ensure the daemon is properly shutdown if there is a failure during - // initialization - defer func() { - if err != nil { - if err := d.Shutdown(); err != nil { - logrus.Error(err) - } - } - }() - - if err := d.setupSeccompProfile(); err != nil { - return nil, err - } - - // Set the default isolation mode (only applicable on Windows) - if err := d.setDefaultIsolation(); err != nil { - return nil, fmt.Errorf("error setting default isolation mode: %v", err) - } - - logrus.Debugf("Using default logging driver %s", config.LogConfig.Type) - - if err := configureMaxThreads(config); err != nil { - logrus.Warnf("Failed to configure golang's threads limit: %v", err) - } - - if err := ensureDefaultAppArmorProfile(); err != nil { - logrus.Errorf(err.Error()) - } - - daemonRepo := filepath.Join(config.Root, "containers") - if err := idtools.MkdirAllAs(daemonRepo, 0700, rootUID, rootGID); err != nil && !os.IsExist(err) { - return nil, err - } - - if runtime.GOOS == "windows" { - if err := system.MkdirAll(filepath.Join(config.Root, "credentialspecs"), 0); err != nil && !os.IsExist(err) { - return nil, err - } - } - - driverName := os.Getenv("DOCKER_DRIVER") - if driverName == "" { - driverName = config.GraphDriver - } - - d.RegistryService = registryService - d.PluginStore = plugin.NewStore(config.Root) // todo: remove - // Plugin system initialization should happen before restore. Do not change order. - d.pluginManager, err = plugin.NewManager(plugin.ManagerConfig{ - Root: filepath.Join(config.Root, "plugins"), - ExecRoot: "/run/docker/plugins", // possibly needs fixing - Store: d.PluginStore, - Executor: containerdRemote, - RegistryService: registryService, - LiveRestoreEnabled: config.LiveRestoreEnabled, - LogPluginEvent: d.LogPluginEvent, // todo: make private - }) - if err != nil { - return nil, errors.Wrap(err, "couldn't create plugin manager") - } - - d.layerStore, err = layer.NewStoreFromOptions(layer.StoreOptions{ - StorePath: config.Root, - MetadataStorePathTemplate: filepath.Join(config.Root, "image", "%s", "layerdb"), - GraphDriver: driverName, - GraphDriverOptions: config.GraphOptions, - UIDMaps: uidMaps, - GIDMaps: gidMaps, - PluginGetter: d.PluginStore, - ExperimentalEnabled: config.Experimental, - }) - if err != nil { - return nil, err - } - - graphDriver := d.layerStore.DriverName() - imageRoot := filepath.Join(config.Root, "image", graphDriver) - - // Configure and validate the kernels security support - if err := configureKernelSecuritySupport(config, graphDriver); err != nil { - return nil, err - } - - logrus.Debugf("Max Concurrent Downloads: %d", *config.MaxConcurrentDownloads) - d.downloadManager = xfer.NewLayerDownloadManager(d.layerStore, *config.MaxConcurrentDownloads) - logrus.Debugf("Max Concurrent Uploads: %d", *config.MaxConcurrentUploads) - d.uploadManager = xfer.NewLayerUploadManager(*config.MaxConcurrentUploads) - - ifs, err := image.NewFSStoreBackend(filepath.Join(imageRoot, "imagedb")) - if err != nil { - return nil, err - } - - d.imageStore, err = image.NewImageStore(ifs, d.layerStore) - if err != nil { - return nil, err - } - - // Configure the volumes driver - volStore, err := d.configureVolumes(rootUID, rootGID) - if err != nil { - return nil, err - } - - trustKey, err := api.LoadOrCreateTrustKey(config.TrustKeyPath) - if err != nil { - return nil, err - } - - trustDir := filepath.Join(config.Root, "trust") - - if err := system.MkdirAll(trustDir, 0700); err != nil { - return nil, err - } - - distributionMetadataStore, err := dmetadata.NewFSMetadataStore(filepath.Join(imageRoot, "distribution")) - if err != nil { - return nil, err - } - - eventsService := events.New() - - referenceStore, err := reference.NewReferenceStore(filepath.Join(imageRoot, "repositories.json")) - if err != nil { - return nil, fmt.Errorf("Couldn't create Tag store repositories: %s", err) - } - - migrationStart := time.Now() - if err := v1.Migrate(config.Root, graphDriver, d.layerStore, d.imageStore, referenceStore, distributionMetadataStore); err != nil { - logrus.Errorf("Graph migration failed: %q. Your old graph data was found to be too inconsistent for upgrading to content-addressable storage. Some of the old data was probably not upgraded. We recommend starting over with a clean storage directory if possible.", err) - } - logrus.Infof("Graph migration to content-addressability took %.2f seconds", time.Since(migrationStart).Seconds()) - - // Discovery is only enabled when the daemon is launched with an address to advertise. When - // initialized, the daemon is registered and we can store the discovery backend as its read-only - if err := d.initDiscovery(config); err != nil { - return nil, err - } - - sysInfo := sysinfo.New(false) - // Check if Devices cgroup is mounted, it is hard requirement for container security, - // on Linux. - if runtime.GOOS == "linux" && !sysInfo.CgroupDevicesEnabled { - return nil, fmt.Errorf("Devices cgroup isn't mounted") - } - - d.ID = trustKey.PublicKey().KeyID() - d.repository = daemonRepo - d.containers = container.NewMemoryStore() - d.execCommands = exec.NewStore() - d.referenceStore = referenceStore - d.distributionMetadataStore = distributionMetadataStore - d.trustKey = trustKey - d.idIndex = truncindex.NewTruncIndex([]string{}) - d.statsCollector = d.newStatsCollector(1 * time.Second) - d.defaultLogConfig = containertypes.LogConfig{ - Type: config.LogConfig.Type, - Config: config.LogConfig.Config, - } - d.EventsService = eventsService - d.volumes = volStore - d.root = config.Root - d.uidMaps = uidMaps - d.gidMaps = gidMaps - d.seccompEnabled = sysInfo.Seccomp - - d.nameIndex = registrar.NewRegistrar() - d.linkIndex = newLinkIndex() - d.containerdRemote = containerdRemote - - go d.execCommandGC() - - d.containerd, err = containerdRemote.Client(d) - if err != nil { - return nil, err - } - - if err := d.restore(); err != nil { - return nil, err - } - - // FIXME: this method never returns an error - info, _ := d.SystemInfo() - - engineVersion.WithValues( - dockerversion.Version, - dockerversion.GitCommit, - info.Architecture, - info.Driver, - info.KernelVersion, - info.OperatingSystem, - ).Set(1) - engineCpus.Set(float64(info.NCPU)) - engineMemory.Set(float64(info.MemTotal)) - - // set up SIGUSR1 handler on Unix-like systems, or a Win32 global event - // on Windows to dump Go routine stacks - stackDumpDir := config.Root - if execRoot := config.GetExecRoot(); execRoot != "" { - stackDumpDir = execRoot - } - d.setupDumpStackTrap(stackDumpDir) - - return d, nil -} - -func (daemon *Daemon) shutdownContainer(c *container.Container) error { - stopTimeout := c.StopTimeout() - // TODO(windows): Handle docker restart with paused containers - if c.IsPaused() { - // To terminate a process in freezer cgroup, we should send - // SIGTERM to this process then unfreeze it, and the process will - // force to terminate immediately. - logrus.Debugf("Found container %s is paused, sending SIGTERM before unpausing it", c.ID) - sig, ok := signal.SignalMap["TERM"] - if !ok { - return fmt.Errorf("System does not support SIGTERM") - } - if err := daemon.kill(c, int(sig)); err != nil { - return fmt.Errorf("sending SIGTERM to container %s with error: %v", c.ID, err) - } - if err := daemon.containerUnpause(c); err != nil { - return fmt.Errorf("Failed to unpause container %s with error: %v", c.ID, err) - } - if _, err := c.WaitStop(time.Duration(stopTimeout) * time.Second); err != nil { - logrus.Debugf("container %s failed to exit in %d second of SIGTERM, sending SIGKILL to force", c.ID, stopTimeout) - sig, ok := signal.SignalMap["KILL"] - if !ok { - return fmt.Errorf("System does not support SIGKILL") - } - if err := daemon.kill(c, int(sig)); err != nil { - logrus.Errorf("Failed to SIGKILL container %s", c.ID) - } - c.WaitStop(-1 * time.Second) - return err - } - } - // If container failed to exit in stopTimeout seconds of SIGTERM, then using the force - if err := daemon.containerStop(c, stopTimeout); err != nil { - return fmt.Errorf("Failed to stop container %s with error: %v", c.ID, err) - } - - c.WaitStop(-1 * time.Second) - return nil -} - -// ShutdownTimeout returns the shutdown timeout based on the max stopTimeout of the containers, -// and is limited by daemon's ShutdownTimeout. -func (daemon *Daemon) ShutdownTimeout() int { - // By default we use daemon's ShutdownTimeout. - shutdownTimeout := daemon.configStore.ShutdownTimeout - - graceTimeout := 5 - if daemon.containers != nil { - for _, c := range daemon.containers.List() { - if shutdownTimeout >= 0 { - stopTimeout := c.StopTimeout() - if stopTimeout < 0 { - shutdownTimeout = -1 - } else { - if stopTimeout+graceTimeout > shutdownTimeout { - shutdownTimeout = stopTimeout + graceTimeout - } - } - } - } - } - return shutdownTimeout -} - -// Shutdown stops the daemon. -func (daemon *Daemon) Shutdown() error { - daemon.shutdown = true - // Keep mounts and networking running on daemon shutdown if - // we are to keep containers running and restore them. - - if daemon.configStore.LiveRestoreEnabled && daemon.containers != nil { - // check if there are any running containers, if none we should do some cleanup - if ls, err := daemon.Containers(&types.ContainerListOptions{}); len(ls) != 0 || err != nil { - return nil - } - } - - if daemon.containers != nil { - logrus.Debugf("start clean shutdown of all containers with a %d seconds timeout...", daemon.configStore.ShutdownTimeout) - daemon.containers.ApplyAll(func(c *container.Container) { - if !c.IsRunning() { - return - } - logrus.Debugf("stopping %s", c.ID) - if err := daemon.shutdownContainer(c); err != nil { - logrus.Errorf("Stop container error: %v", err) - return - } - if mountid, err := daemon.layerStore.GetMountID(c.ID); err == nil { - daemon.cleanupMountsByID(mountid) - } - logrus.Debugf("container stopped %s", c.ID) - }) - } - - if daemon.volumes != nil { - if err := daemon.volumes.Shutdown(); err != nil { - logrus.Errorf("Error shutting down volume store: %v", err) - } - } - - if daemon.layerStore != nil { - if err := daemon.layerStore.Cleanup(); err != nil { - logrus.Errorf("Error during layer Store.Cleanup(): %v", err) - } - } - - // Shutdown plugins after containers and layerstore. Don't change the order. - daemon.pluginShutdown() - - // trigger libnetwork Stop only if it's initialized - if daemon.netController != nil { - daemon.netController.Stop() - } - - if err := daemon.cleanupMounts(); err != nil { - return err - } - - return nil -} - -// Mount sets container.BaseFS -// (is it not set coming in? why is it unset?) -func (daemon *Daemon) Mount(container *container.Container) error { - dir, err := container.RWLayer.Mount(container.GetMountLabel()) - if err != nil { - return err - } - logrus.Debugf("container mounted via layerStore: %v", dir) - - if container.BaseFS != dir { - // The mount path reported by the graph driver should always be trusted on Windows, since the - // volume path for a given mounted layer may change over time. This should only be an error - // on non-Windows operating systems. - if container.BaseFS != "" && runtime.GOOS != "windows" { - daemon.Unmount(container) - return fmt.Errorf("Error: driver %s is returning inconsistent paths for container %s ('%s' then '%s')", - daemon.GraphDriverName(), container.ID, container.BaseFS, dir) - } - } - container.BaseFS = dir // TODO: combine these fields - return nil -} - -// Unmount unsets the container base filesystem -func (daemon *Daemon) Unmount(container *container.Container) error { - if err := container.RWLayer.Unmount(); err != nil { - logrus.Errorf("Error unmounting container %s: %s", container.ID, err) - return err - } - - return nil -} - -// V4Subnets returns the IPv4 subnets of networks that are managed by Docker. -func (daemon *Daemon) V4Subnets() []net.IPNet { - var subnets []net.IPNet - - managedNetworks := daemon.netController.Networks() - - for _, managedNetwork := range managedNetworks { - v4Infos, _ := managedNetwork.Info().IpamInfo() - for _, v4Info := range v4Infos { - if v4Info.IPAMData.Pool != nil { - subnets = append(subnets, *v4Info.IPAMData.Pool) - } - } - } - - return subnets -} - -// V6Subnets returns the IPv6 subnets of networks that are managed by Docker. -func (daemon *Daemon) V6Subnets() []net.IPNet { - var subnets []net.IPNet - - managedNetworks := daemon.netController.Networks() - - for _, managedNetwork := range managedNetworks { - _, v6Infos := managedNetwork.Info().IpamInfo() - for _, v6Info := range v6Infos { - if v6Info.IPAMData.Pool != nil { - subnets = append(subnets, *v6Info.IPAMData.Pool) - } - } - } - - return subnets -} - -// GraphDriverName returns the name of the graph driver used by the layer.Store -func (daemon *Daemon) GraphDriverName() string { - return daemon.layerStore.DriverName() -} - -// GetUIDGIDMaps returns the current daemon's user namespace settings -// for the full uid and gid maps which will be applied to containers -// started in this instance. -func (daemon *Daemon) GetUIDGIDMaps() ([]idtools.IDMap, []idtools.IDMap) { - return daemon.uidMaps, daemon.gidMaps -} - -// GetRemappedUIDGID returns the current daemon's uid and gid values -// if user namespaces are in use for this daemon instance. If not -// this function will return "real" root values of 0, 0. -func (daemon *Daemon) GetRemappedUIDGID() (int, int) { - uid, gid, _ := idtools.GetRootUIDGID(daemon.uidMaps, daemon.gidMaps) - return uid, gid -} - -// tempDir returns the default directory to use for temporary files. -func tempDir(rootDir string, rootUID, rootGID int) (string, error) { - var tmpDir string - if tmpDir = os.Getenv("DOCKER_TMPDIR"); tmpDir == "" { - tmpDir = filepath.Join(rootDir, "tmp") - } - return tmpDir, idtools.MkdirAllAs(tmpDir, 0700, rootUID, rootGID) -} - -func (daemon *Daemon) setupInitLayer(initPath string) error { - rootUID, rootGID := daemon.GetRemappedUIDGID() - return initlayer.Setup(initPath, rootUID, rootGID) -} - -func setDefaultMtu(config *Config) { - // do nothing if the config does not have the default 0 value. - if config.Mtu != 0 { - return - } - config.Mtu = defaultNetworkMtu -} - -func (daemon *Daemon) configureVolumes(rootUID, rootGID int) (*store.VolumeStore, error) { - volumesDriver, err := local.New(daemon.configStore.Root, rootUID, rootGID) - if err != nil { - return nil, err - } - - volumedrivers.RegisterPluginGetter(daemon.PluginStore) - - if !volumedrivers.Register(volumesDriver, volumesDriver.Name()) { - return nil, fmt.Errorf("local volume driver could not be registered") - } - return store.New(daemon.configStore.Root) -} - -// IsShuttingDown tells whether the daemon is shutting down or not -func (daemon *Daemon) IsShuttingDown() bool { - return daemon.shutdown -} - -// initDiscovery initializes the discovery watcher for this daemon. -func (daemon *Daemon) initDiscovery(config *Config) error { - advertise, err := parseClusterAdvertiseSettings(config.ClusterStore, config.ClusterAdvertise) - if err != nil { - if err == errDiscoveryDisabled { - return nil - } - return err - } - - config.ClusterAdvertise = advertise - discoveryWatcher, err := initDiscovery(config.ClusterStore, config.ClusterAdvertise, config.ClusterOpts) - if err != nil { - return fmt.Errorf("discovery initialization failed (%v)", err) - } - - daemon.discoveryWatcher = discoveryWatcher - return nil -} - -// Reload reads configuration changes and modifies the -// daemon according to those changes. -// These are the settings that Reload changes: -// - Daemon labels. -// - Daemon debug log level. -// - Daemon insecure registries. -// - Daemon max concurrent downloads -// - Daemon max concurrent uploads -// - Cluster discovery (reconfigure and restart). -// - Daemon live restore -// - Daemon shutdown timeout (in seconds). -func (daemon *Daemon) Reload(config *Config) (err error) { - - daemon.configStore.reloadLock.Lock() - - attributes := daemon.platformReload(config) - - defer func() { - // we're unlocking here, because - // LogDaemonEventWithAttributes() -> SystemInfo() -> GetAllRuntimes() - // holds that lock too. - daemon.configStore.reloadLock.Unlock() - if err == nil { - daemon.LogDaemonEventWithAttributes("reload", attributes) - } - }() - - if err := daemon.reloadClusterDiscovery(config); err != nil { - return err - } - - if config.IsValueSet("labels") { - daemon.configStore.Labels = config.Labels - } - if config.IsValueSet("debug") { - daemon.configStore.Debug = config.Debug - } - if config.IsValueSet("insecure-registries") { - daemon.configStore.InsecureRegistries = config.InsecureRegistries - if err := daemon.RegistryService.LoadInsecureRegistries(config.InsecureRegistries); err != nil { - return err - } - } - if config.IsValueSet("live-restore") { - daemon.configStore.LiveRestoreEnabled = config.LiveRestoreEnabled - if err := daemon.containerdRemote.UpdateOptions(libcontainerd.WithLiveRestore(config.LiveRestoreEnabled)); err != nil { - return err - } - } - - // If no value is set for max-concurrent-downloads we assume it is the default value - // We always "reset" as the cost is lightweight and easy to maintain. - if config.IsValueSet("max-concurrent-downloads") && config.MaxConcurrentDownloads != nil { - *daemon.configStore.MaxConcurrentDownloads = *config.MaxConcurrentDownloads - } else { - maxConcurrentDownloads := defaultMaxConcurrentDownloads - daemon.configStore.MaxConcurrentDownloads = &maxConcurrentDownloads - } - logrus.Debugf("Reset Max Concurrent Downloads: %d", *daemon.configStore.MaxConcurrentDownloads) - if daemon.downloadManager != nil { - daemon.downloadManager.SetConcurrency(*daemon.configStore.MaxConcurrentDownloads) - } - - // If no value is set for max-concurrent-upload we assume it is the default value - // We always "reset" as the cost is lightweight and easy to maintain. - if config.IsValueSet("max-concurrent-uploads") && config.MaxConcurrentUploads != nil { - *daemon.configStore.MaxConcurrentUploads = *config.MaxConcurrentUploads - } else { - maxConcurrentUploads := defaultMaxConcurrentUploads - daemon.configStore.MaxConcurrentUploads = &maxConcurrentUploads - } - logrus.Debugf("Reset Max Concurrent Uploads: %d", *daemon.configStore.MaxConcurrentUploads) - if daemon.uploadManager != nil { - daemon.uploadManager.SetConcurrency(*daemon.configStore.MaxConcurrentUploads) - } - - if config.IsValueSet("shutdown-timeout") { - daemon.configStore.ShutdownTimeout = config.ShutdownTimeout - logrus.Debugf("Reset Shutdown Timeout: %d", daemon.configStore.ShutdownTimeout) - } - - // We emit daemon reload event here with updatable configurations - attributes["debug"] = fmt.Sprintf("%t", daemon.configStore.Debug) - attributes["live-restore"] = fmt.Sprintf("%t", daemon.configStore.LiveRestoreEnabled) - - if daemon.configStore.InsecureRegistries != nil { - insecureRegistries, err := json.Marshal(daemon.configStore.InsecureRegistries) - if err != nil { - return err - } - attributes["insecure-registries"] = string(insecureRegistries) - } else { - attributes["insecure-registries"] = "[]" - } - - attributes["cluster-store"] = daemon.configStore.ClusterStore - if daemon.configStore.ClusterOpts != nil { - opts, err := json.Marshal(daemon.configStore.ClusterOpts) - if err != nil { - return err - } - attributes["cluster-store-opts"] = string(opts) - } else { - attributes["cluster-store-opts"] = "{}" - } - attributes["cluster-advertise"] = daemon.configStore.ClusterAdvertise - - if daemon.configStore.Labels != nil { - labels, err := json.Marshal(daemon.configStore.Labels) - if err != nil { - return err - } - attributes["labels"] = string(labels) - } else { - attributes["labels"] = "[]" - } - - attributes["max-concurrent-downloads"] = fmt.Sprintf("%d", *daemon.configStore.MaxConcurrentDownloads) - attributes["max-concurrent-uploads"] = fmt.Sprintf("%d", *daemon.configStore.MaxConcurrentUploads) - attributes["shutdown-timeout"] = fmt.Sprintf("%d", daemon.configStore.ShutdownTimeout) - - return nil -} - -func (daemon *Daemon) reloadClusterDiscovery(config *Config) error { - var err error - newAdvertise := daemon.configStore.ClusterAdvertise - newClusterStore := daemon.configStore.ClusterStore - if config.IsValueSet("cluster-advertise") { - if config.IsValueSet("cluster-store") { - newClusterStore = config.ClusterStore - } - newAdvertise, err = parseClusterAdvertiseSettings(newClusterStore, config.ClusterAdvertise) - if err != nil && err != errDiscoveryDisabled { - return err - } - } - - if daemon.clusterProvider != nil { - if err := config.isSwarmCompatible(); err != nil { - return err - } - } - - // check discovery modifications - if !modifiedDiscoverySettings(daemon.configStore, newAdvertise, newClusterStore, config.ClusterOpts) { - return nil - } - - // enable discovery for the first time if it was not previously enabled - if daemon.discoveryWatcher == nil { - discoveryWatcher, err := initDiscovery(newClusterStore, newAdvertise, config.ClusterOpts) - if err != nil { - return fmt.Errorf("discovery initialization failed (%v)", err) - } - daemon.discoveryWatcher = discoveryWatcher - } else { - if err == errDiscoveryDisabled { - // disable discovery if it was previously enabled and it's disabled now - daemon.discoveryWatcher.Stop() - } else { - // reload discovery - if err = daemon.discoveryWatcher.Reload(config.ClusterStore, newAdvertise, config.ClusterOpts); err != nil { - return err - } - } - } - - daemon.configStore.ClusterStore = newClusterStore - daemon.configStore.ClusterOpts = config.ClusterOpts - daemon.configStore.ClusterAdvertise = newAdvertise - - if daemon.netController == nil { - return nil - } - netOptions, err := daemon.networkOptions(daemon.configStore, daemon.PluginStore, nil) - if err != nil { - logrus.WithError(err).Warnf("failed to get options with network controller") - return nil - } - err = daemon.netController.ReloadConfiguration(netOptions...) - if err != nil { - logrus.Warnf("Failed to reload configuration with network controller: %v", err) - } - - return nil -} - -func isBridgeNetworkDisabled(config *Config) bool { - return config.bridgeConfig.Iface == disableNetworkBridge -} - -func (daemon *Daemon) networkOptions(dconfig *Config, pg plugingetter.PluginGetter, activeSandboxes map[string]interface{}) ([]nwconfig.Option, error) { - options := []nwconfig.Option{} - if dconfig == nil { - return options, nil - } - - options = append(options, nwconfig.OptionExperimental(dconfig.Experimental)) - options = append(options, nwconfig.OptionDataDir(dconfig.Root)) - options = append(options, nwconfig.OptionExecRoot(dconfig.GetExecRoot())) - - dd := runconfig.DefaultDaemonNetworkMode() - dn := runconfig.DefaultDaemonNetworkMode().NetworkName() - options = append(options, nwconfig.OptionDefaultDriver(string(dd))) - options = append(options, nwconfig.OptionDefaultNetwork(dn)) - - if strings.TrimSpace(dconfig.ClusterStore) != "" { - kv := strings.Split(dconfig.ClusterStore, "://") - if len(kv) != 2 { - return nil, fmt.Errorf("kv store daemon config must be of the form KV-PROVIDER://KV-URL") - } - options = append(options, nwconfig.OptionKVProvider(kv[0])) - options = append(options, nwconfig.OptionKVProviderURL(kv[1])) - } - if len(dconfig.ClusterOpts) > 0 { - options = append(options, nwconfig.OptionKVOpts(dconfig.ClusterOpts)) - } - - if daemon.discoveryWatcher != nil { - options = append(options, nwconfig.OptionDiscoveryWatcher(daemon.discoveryWatcher)) - } - - if dconfig.ClusterAdvertise != "" { - options = append(options, nwconfig.OptionDiscoveryAddress(dconfig.ClusterAdvertise)) - } - - options = append(options, nwconfig.OptionLabels(dconfig.Labels)) - options = append(options, driverOptions(dconfig)...) - - if daemon.configStore != nil && daemon.configStore.LiveRestoreEnabled && len(activeSandboxes) != 0 { - options = append(options, nwconfig.OptionActiveSandboxes(activeSandboxes)) - } - - if pg != nil { - options = append(options, nwconfig.OptionPluginGetter(pg)) - } - - return options, nil -} - -func copyBlkioEntry(entries []*containerd.BlkioStatsEntry) []types.BlkioStatEntry { - out := make([]types.BlkioStatEntry, len(entries)) - for i, re := range entries { - out[i] = types.BlkioStatEntry{ - Major: re.Major, - Minor: re.Minor, - Op: re.Op, - Value: re.Value, - } - } - return out -} - -// GetCluster returns the cluster -func (daemon *Daemon) GetCluster() Cluster { - return daemon.cluster -} - -// SetCluster sets the cluster -func (daemon *Daemon) SetCluster(cluster Cluster) { - daemon.cluster = cluster -} - -func (daemon *Daemon) pluginShutdown() { - manager := daemon.pluginManager - // Check for a valid manager object. In error conditions, daemon init can fail - // and shutdown called, before plugin manager is initialized. - if manager != nil { - manager.Shutdown() - } -} - -// PluginManager returns current pluginManager associated with the daemon -func (daemon *Daemon) PluginManager() *plugin.Manager { // set up before daemon to avoid this method - return daemon.pluginManager -} - -// PluginGetter returns current pluginStore associated with the daemon -func (daemon *Daemon) PluginGetter() *plugin.Store { - return daemon.PluginStore -} - -// CreateDaemonRoot creates the root for the daemon -func CreateDaemonRoot(config *Config) error { - // get the canonical path to the Docker root directory - var realRoot string - if _, err := os.Stat(config.Root); err != nil && os.IsNotExist(err) { - realRoot = config.Root - } else { - realRoot, err = fileutils.ReadSymlinkedDirectory(config.Root) - if err != nil { - return fmt.Errorf("Unable to get the full path to root (%s): %s", config.Root, err) - } - } - - uidMaps, gidMaps, err := setupRemappedRoot(config) - if err != nil { - return err - } - rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps) - if err != nil { - return err - } - - if err := setupDaemonRoot(config, realRoot, rootUID, rootGID); err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/daemon_experimental.go b/vendor/github.com/docker/docker/daemon/daemon_experimental.go deleted file mode 100644 index fb0251d4a..000000000 --- a/vendor/github.com/docker/docker/daemon/daemon_experimental.go +++ /dev/null @@ -1,7 +0,0 @@ -package daemon - -import "github.com/docker/docker/api/types/container" - -func (daemon *Daemon) verifyExperimentalContainerSettings(hostConfig *container.HostConfig, config *container.Config) ([]string, error) { - return nil, nil -} diff --git a/vendor/github.com/docker/docker/daemon/daemon_linux.go b/vendor/github.com/docker/docker/daemon/daemon_linux.go deleted file mode 100644 index 9bdf6e2b7..000000000 --- a/vendor/github.com/docker/docker/daemon/daemon_linux.go +++ /dev/null @@ -1,80 +0,0 @@ -package daemon - -import ( - "bufio" - "fmt" - "io" - "os" - "regexp" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/mount" -) - -func (daemon *Daemon) cleanupMountsByID(id string) error { - logrus.Debugf("Cleaning up old mountid %s: start.", id) - f, err := os.Open("/proc/self/mountinfo") - if err != nil { - return err - } - defer f.Close() - - return daemon.cleanupMountsFromReaderByID(f, id, mount.Unmount) -} - -func (daemon *Daemon) cleanupMountsFromReaderByID(reader io.Reader, id string, unmount func(target string) error) error { - if daemon.root == "" { - return nil - } - var errors []string - - regexps := getCleanPatterns(id) - sc := bufio.NewScanner(reader) - for sc.Scan() { - if fields := strings.Fields(sc.Text()); len(fields) >= 4 { - if mnt := fields[4]; strings.HasPrefix(mnt, daemon.root) { - for _, p := range regexps { - if p.MatchString(mnt) { - if err := unmount(mnt); err != nil { - logrus.Error(err) - errors = append(errors, err.Error()) - } - } - } - } - } - } - - if err := sc.Err(); err != nil { - return err - } - - if len(errors) > 0 { - return fmt.Errorf("Error cleaning up mounts:\n%v", strings.Join(errors, "\n")) - } - - logrus.Debugf("Cleaning up old mountid %v: done.", id) - return nil -} - -// cleanupMounts umounts shm/mqueue mounts for old containers -func (daemon *Daemon) cleanupMounts() error { - return daemon.cleanupMountsByID("") -} - -func getCleanPatterns(id string) (regexps []*regexp.Regexp) { - var patterns []string - if id == "" { - id = "[0-9a-f]{64}" - patterns = append(patterns, "containers/"+id+"/shm") - } - patterns = append(patterns, "aufs/mnt/"+id+"$", "overlay/"+id+"/merged$", "zfs/graph/"+id+"$") - for _, p := range patterns { - r, err := regexp.Compile(p) - if err == nil { - regexps = append(regexps, r) - } - } - return -} diff --git a/vendor/github.com/docker/docker/daemon/daemon_linux_test.go b/vendor/github.com/docker/docker/daemon/daemon_linux_test.go deleted file mode 100644 index c40b13ba4..000000000 --- a/vendor/github.com/docker/docker/daemon/daemon_linux_test.go +++ /dev/null @@ -1,104 +0,0 @@ -// +build linux - -package daemon - -import ( - "strings" - "testing" -) - -const mountsFixture = `142 78 0:38 / / rw,relatime - aufs none rw,si=573b861da0b3a05b,dio -143 142 0:60 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw -144 142 0:67 / /dev rw,nosuid - tmpfs tmpfs rw,mode=755 -145 144 0:78 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 -146 144 0:49 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw -147 142 0:84 / /sys rw,nosuid,nodev,noexec,relatime - sysfs sysfs rw -148 147 0:86 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,mode=755 -149 148 0:22 /docker/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpuset -150 148 0:25 /docker/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a /sys/fs/cgroup/cpu rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpu -151 148 0:27 /docker/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a /sys/fs/cgroup/cpuacct rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpuacct -152 148 0:28 /docker/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,memory -153 148 0:29 /docker/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,devices -154 148 0:30 /docker/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,freezer -155 148 0:31 /docker/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,blkio -156 148 0:32 /docker/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,perf_event -157 148 0:33 /docker/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a /sys/fs/cgroup/hugetlb rw,nosuid,nodev,noexec,relatime - cgroup cgroup rw,hugetlb -158 148 0:35 /docker/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime - cgroup systemd rw,name=systemd -159 142 8:4 /home/mlaventure/gopath /home/mlaventure/gopath rw,relatime - ext4 /dev/disk/by-uuid/d99e196c-1fc4-4b4f-bab9-9962b2b34e99 rw,errors=remount-ro,data=ordered -160 142 8:4 /var/lib/docker/volumes/9a428b651ee4c538130143cad8d87f603a4bf31b928afe7ff3ecd65480692b35/_data /var/lib/docker rw,relatime - ext4 /dev/disk/by-uuid/d99e196c-1fc4-4b4f-bab9-9962b2b34e99 rw,errors=remount-ro,data=ordered -164 142 8:4 /home/mlaventure/gopath/src/github.com/docker/docker /go/src/github.com/docker/docker rw,relatime - ext4 /dev/disk/by-uuid/d99e196c-1fc4-4b4f-bab9-9962b2b34e99 rw,errors=remount-ro,data=ordered -165 142 8:4 /var/lib/docker/containers/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a/resolv.conf /etc/resolv.conf rw,relatime - ext4 /dev/disk/by-uuid/d99e196c-1fc4-4b4f-bab9-9962b2b34e99 rw,errors=remount-ro,data=ordered -166 142 8:4 /var/lib/docker/containers/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a/hostname /etc/hostname rw,relatime - ext4 /dev/disk/by-uuid/d99e196c-1fc4-4b4f-bab9-9962b2b34e99 rw,errors=remount-ro,data=ordered -167 142 8:4 /var/lib/docker/containers/5425782a95e643181d8a485a2bab3c0bb21f51d7dfc03511f0e6fbf3f3aa356a/hosts /etc/hosts rw,relatime - ext4 /dev/disk/by-uuid/d99e196c-1fc4-4b4f-bab9-9962b2b34e99 rw,errors=remount-ro,data=ordered -168 144 0:39 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k -169 144 0:12 /14 /dev/console rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=000 -83 147 0:10 / /sys/kernel/security rw,relatime - securityfs none rw -89 142 0:87 / /tmp rw,relatime - tmpfs none rw -97 142 0:60 / /run/docker/netns/default rw,nosuid,nodev,noexec,relatime - proc proc rw -100 160 8:4 /var/lib/docker/volumes/9a428b651ee4c538130143cad8d87f603a4bf31b928afe7ff3ecd65480692b35/_data/aufs /var/lib/docker/aufs rw,relatime - ext4 /dev/disk/by-uuid/d99e196c-1fc4-4b4f-bab9-9962b2b34e99 rw,errors=remount-ro,data=ordered -115 100 0:102 / /var/lib/docker/aufs/mnt/0ecda1c63e5b58b3d89ff380bf646c95cc980252cf0b52466d43619aec7c8432 rw,relatime - aufs none rw,si=573b861dbc01905b,dio -116 160 0:107 / /var/lib/docker/containers/d045dc441d2e2e1d5b3e328d47e5943811a40819fb47497c5f5a5df2d6d13c37/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k -118 142 0:102 / /run/docker/libcontainerd/d045dc441d2e2e1d5b3e328d47e5943811a40819fb47497c5f5a5df2d6d13c37/rootfs rw,relatime - aufs none rw,si=573b861dbc01905b,dio -242 142 0:60 / /run/docker/netns/c3664df2a0f7 rw,nosuid,nodev,noexec,relatime - proc proc rw -120 100 0:122 / /var/lib/docker/aufs/mnt/03ca4b49e71f1e49a41108829f4d5c70ac95934526e2af8984a1f65f1de0715d rw,relatime - aufs none rw,si=573b861eb147805b,dio -171 142 0:122 / /run/docker/libcontainerd/e406ff6f3e18516d50e03dbca4de54767a69a403a6f7ec1edc2762812824521e/rootfs rw,relatime - aufs none rw,si=573b861eb147805b,dio -310 142 0:60 / /run/docker/netns/71a18572176b rw,nosuid,nodev,noexec,relatime - proc proc rw -` - -func TestCleanupMounts(t *testing.T) { - d := &Daemon{ - root: "/var/lib/docker/", - } - - expected := "/var/lib/docker/containers/d045dc441d2e2e1d5b3e328d47e5943811a40819fb47497c5f5a5df2d6d13c37/shm" - var unmounted int - unmount := func(target string) error { - if target == expected { - unmounted++ - } - return nil - } - - d.cleanupMountsFromReaderByID(strings.NewReader(mountsFixture), "", unmount) - - if unmounted != 1 { - t.Fatalf("Expected to unmount the shm (and the shm only)") - } -} - -func TestCleanupMountsByID(t *testing.T) { - d := &Daemon{ - root: "/var/lib/docker/", - } - - expected := "/var/lib/docker/aufs/mnt/03ca4b49e71f1e49a41108829f4d5c70ac95934526e2af8984a1f65f1de0715d" - var unmounted int - unmount := func(target string) error { - if target == expected { - unmounted++ - } - return nil - } - - d.cleanupMountsFromReaderByID(strings.NewReader(mountsFixture), "03ca4b49e71f1e49a41108829f4d5c70ac95934526e2af8984a1f65f1de0715d", unmount) - - if unmounted != 1 { - t.Fatalf("Expected to unmount the auf root (and that only)") - } -} - -func TestNotCleanupMounts(t *testing.T) { - d := &Daemon{ - repository: "", - } - var unmounted bool - unmount := func(target string) error { - unmounted = true - return nil - } - mountInfo := `234 232 0:59 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k` - d.cleanupMountsFromReaderByID(strings.NewReader(mountInfo), "", unmount) - if unmounted { - t.Fatalf("Expected not to clean up /dev/shm") - } -} diff --git a/vendor/github.com/docker/docker/daemon/daemon_solaris.go b/vendor/github.com/docker/docker/daemon/daemon_solaris.go deleted file mode 100644 index 2b4d8d021..000000000 --- a/vendor/github.com/docker/docker/daemon/daemon_solaris.go +++ /dev/null @@ -1,523 +0,0 @@ -// +build solaris,cgo - -package daemon - -import ( - "fmt" - "net" - "strconv" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/parsers/kernel" - "github.com/docker/docker/pkg/sysinfo" - "github.com/docker/docker/reference" - "github.com/docker/libnetwork" - nwconfig "github.com/docker/libnetwork/config" - "github.com/docker/libnetwork/drivers/solaris/bridge" - "github.com/docker/libnetwork/netlabel" - "github.com/docker/libnetwork/netutils" - lntypes "github.com/docker/libnetwork/types" - "github.com/opencontainers/runc/libcontainer/label" - "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" -) - -//#include -import "C" - -const ( - defaultVirtualSwitch = "Virtual Switch" - platformSupported = true - solarisMinCPUShares = 1 - solarisMaxCPUShares = 65535 -) - -func getMemoryResources(config containertypes.Resources) specs.CappedMemory { - memory := specs.CappedMemory{} - - if config.Memory > 0 { - memory.Physical = strconv.FormatInt(config.Memory, 10) - } - - if config.MemorySwap != 0 { - memory.Swap = strconv.FormatInt(config.MemorySwap, 10) - } - - return memory -} - -func getCPUResources(config containertypes.Resources) specs.CappedCPU { - cpu := specs.CappedCPU{} - - if config.CpusetCpus != "" { - cpu.Ncpus = config.CpusetCpus - } - - return cpu -} - -func (daemon *Daemon) cleanupMountsByID(id string) error { - return nil -} - -func parseSecurityOpt(container *container.Container, config *containertypes.HostConfig) error { - //Since config.SecurityOpt is specifically defined as a "List of string values to - //customize labels for MLs systems, such as SELinux" - //until we figure out how to map to Trusted Extensions - //this is being disabled for now on Solaris - var ( - labelOpts []string - err error - ) - - if len(config.SecurityOpt) > 0 { - return errors.New("Security options are not supported on Solaris") - } - - container.ProcessLabel, container.MountLabel, err = label.InitLabels(labelOpts) - return err -} - -func setupRemappedRoot(config *Config) ([]idtools.IDMap, []idtools.IDMap, error) { - return nil, nil, nil -} - -func setupDaemonRoot(config *Config, rootDir string, rootUID, rootGID int) error { - return nil -} - -func (daemon *Daemon) getLayerInit() func(string) error { - return nil -} - -func checkKernel() error { - // solaris can rely upon checkSystem() below, we don't skew kernel versions - return nil -} - -func (daemon *Daemon) getCgroupDriver() string { - return "" -} - -func (daemon *Daemon) adaptContainerSettings(hostConfig *containertypes.HostConfig, adjustCPUShares bool) error { - if hostConfig.CPUShares < 0 { - logrus.Warnf("Changing requested CPUShares of %d to minimum allowed of %d", hostConfig.CPUShares, solarisMinCPUShares) - hostConfig.CPUShares = solarisMinCPUShares - } else if hostConfig.CPUShares > solarisMaxCPUShares { - logrus.Warnf("Changing requested CPUShares of %d to maximum allowed of %d", hostConfig.CPUShares, solarisMaxCPUShares) - hostConfig.CPUShares = solarisMaxCPUShares - } - - if hostConfig.Memory > 0 && hostConfig.MemorySwap == 0 { - // By default, MemorySwap is set to twice the size of Memory. - hostConfig.MemorySwap = hostConfig.Memory * 2 - } - - if hostConfig.ShmSize != 0 { - hostConfig.ShmSize = container.DefaultSHMSize - } - if hostConfig.OomKillDisable == nil { - defaultOomKillDisable := false - hostConfig.OomKillDisable = &defaultOomKillDisable - } - - return nil -} - -// UsingSystemd returns true if cli option includes native.cgroupdriver=systemd -func UsingSystemd(config *Config) bool { - return false -} - -// verifyPlatformContainerSettings performs platform-specific validation of the -// hostconfig and config structures. -func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *containertypes.HostConfig, config *containertypes.Config, update bool) ([]string, error) { - warnings := []string{} - sysInfo := sysinfo.New(true) - // NOTE: We do not enforce a minimum value for swap limits for zones on Solaris and - // therefore we will not do that for Docker container either. - if hostConfig.Memory > 0 && !sysInfo.MemoryLimit { - warnings = append(warnings, "Your kernel does not support memory limit capabilities. Limitation discarded.") - logrus.Warnf("Your kernel does not support memory limit capabilities. Limitation discarded.") - hostConfig.Memory = 0 - hostConfig.MemorySwap = -1 - } - if hostConfig.Memory > 0 && hostConfig.MemorySwap != -1 && !sysInfo.SwapLimit { - warnings = append(warnings, "Your kernel does not support swap limit capabilities, memory limited without swap.") - logrus.Warnf("Your kernel does not support swap limit capabilities, memory limited without swap.") - hostConfig.MemorySwap = -1 - } - if hostConfig.Memory > 0 && hostConfig.MemorySwap > 0 && hostConfig.MemorySwap < hostConfig.Memory { - return warnings, fmt.Errorf("Minimum memoryswap limit should be larger than memory limit, see usage.") - } - // Solaris NOTE: We allow and encourage setting the swap without setting the memory limit. - - if hostConfig.MemorySwappiness != nil && *hostConfig.MemorySwappiness != -1 && !sysInfo.MemorySwappiness { - warnings = append(warnings, "Your kernel does not support memory swappiness capabilities, memory swappiness discarded.") - logrus.Warnf("Your kernel does not support memory swappiness capabilities, memory swappiness discarded.") - hostConfig.MemorySwappiness = nil - } - if hostConfig.MemoryReservation > 0 && !sysInfo.MemoryReservation { - warnings = append(warnings, "Your kernel does not support memory soft limit capabilities. Limitation discarded.") - logrus.Warnf("Your kernel does not support memory soft limit capabilities. Limitation discarded.") - hostConfig.MemoryReservation = 0 - } - if hostConfig.Memory > 0 && hostConfig.MemoryReservation > 0 && hostConfig.Memory < hostConfig.MemoryReservation { - return warnings, fmt.Errorf("Minimum memory limit should be larger than memory reservation limit, see usage.") - } - if hostConfig.KernelMemory > 0 && !sysInfo.KernelMemory { - warnings = append(warnings, "Your kernel does not support kernel memory limit capabilities. Limitation discarded.") - logrus.Warnf("Your kernel does not support kernel memory limit capabilities. Limitation discarded.") - hostConfig.KernelMemory = 0 - } - if hostConfig.CPUShares != 0 && !sysInfo.CPUShares { - warnings = append(warnings, "Your kernel does not support CPU shares. Shares discarded.") - logrus.Warnf("Your kernel does not support CPU shares. Shares discarded.") - hostConfig.CPUShares = 0 - } - if hostConfig.CPUShares < 0 { - warnings = append(warnings, "Invalid CPUShares value. Must be positive. Discarding.") - logrus.Warnf("Invalid CPUShares value. Must be positive. Discarding.") - hostConfig.CPUQuota = 0 - } - if hostConfig.CPUShares > 0 && !sysinfo.IsCPUSharesAvailable() { - warnings = append(warnings, "Global zone default scheduling class not FSS. Discarding shares.") - logrus.Warnf("Global zone default scheduling class not FSS. Discarding shares.") - hostConfig.CPUShares = 0 - } - - // Solaris NOTE: Linux does not do negative checking for CPUShares and Quota here. But it makes sense to. - if hostConfig.CPUPeriod > 0 && !sysInfo.CPUCfsPeriod { - warnings = append(warnings, "Your kernel does not support CPU cfs period. Period discarded.") - logrus.Warnf("Your kernel does not support CPU cfs period. Period discarded.") - if hostConfig.CPUQuota > 0 { - warnings = append(warnings, "Quota will be applied on default period, not period specified.") - logrus.Warnf("Quota will be applied on default period, not period specified.") - } - hostConfig.CPUPeriod = 0 - } - if hostConfig.CPUQuota != 0 && !sysInfo.CPUCfsQuota { - warnings = append(warnings, "Your kernel does not support CPU cfs quota. Quota discarded.") - logrus.Warnf("Your kernel does not support CPU cfs quota. Quota discarded.") - hostConfig.CPUQuota = 0 - } - if hostConfig.CPUQuota < 0 { - warnings = append(warnings, "Invalid CPUQuota value. Must be positive. Discarding.") - logrus.Warnf("Invalid CPUQuota value. Must be positive. Discarding.") - hostConfig.CPUQuota = 0 - } - if (hostConfig.CpusetCpus != "" || hostConfig.CpusetMems != "") && !sysInfo.Cpuset { - warnings = append(warnings, "Your kernel does not support cpuset. Cpuset discarded.") - logrus.Warnf("Your kernel does not support cpuset. Cpuset discarded.") - hostConfig.CpusetCpus = "" - hostConfig.CpusetMems = "" - } - cpusAvailable, err := sysInfo.IsCpusetCpusAvailable(hostConfig.CpusetCpus) - if err != nil { - return warnings, fmt.Errorf("Invalid value %s for cpuset cpus.", hostConfig.CpusetCpus) - } - if !cpusAvailable { - return warnings, fmt.Errorf("Requested CPUs are not available - requested %s, available: %s.", hostConfig.CpusetCpus, sysInfo.Cpus) - } - memsAvailable, err := sysInfo.IsCpusetMemsAvailable(hostConfig.CpusetMems) - if err != nil { - return warnings, fmt.Errorf("Invalid value %s for cpuset mems.", hostConfig.CpusetMems) - } - if !memsAvailable { - return warnings, fmt.Errorf("Requested memory nodes are not available - requested %s, available: %s.", hostConfig.CpusetMems, sysInfo.Mems) - } - if hostConfig.BlkioWeight > 0 && !sysInfo.BlkioWeight { - warnings = append(warnings, "Your kernel does not support Block I/O weight. Weight discarded.") - logrus.Warnf("Your kernel does not support Block I/O weight. Weight discarded.") - hostConfig.BlkioWeight = 0 - } - if hostConfig.OomKillDisable != nil && !sysInfo.OomKillDisable { - *hostConfig.OomKillDisable = false - // Don't warn; this is the default setting but only applicable to Linux - } - - if sysInfo.IPv4ForwardingDisabled { - warnings = append(warnings, "IPv4 forwarding is disabled. Networking will not work.") - logrus.Warnf("IPv4 forwarding is disabled. Networking will not work") - } - - // Solaris NOTE: We do not allow setting Linux specific options, so check and warn for all of them. - - if hostConfig.CapAdd != nil || hostConfig.CapDrop != nil { - warnings = append(warnings, "Adding or dropping kernel capabilities unsupported on Solaris.Discarding capabilities lists.") - logrus.Warnf("Adding or dropping kernel capabilities unsupported on Solaris.Discarding capabilities lists.") - hostConfig.CapAdd = nil - hostConfig.CapDrop = nil - } - - if hostConfig.GroupAdd != nil { - warnings = append(warnings, "Additional groups unsupported on Solaris.Discarding groups lists.") - logrus.Warnf("Additional groups unsupported on Solaris.Discarding groups lists.") - hostConfig.GroupAdd = nil - } - - if hostConfig.IpcMode != "" { - warnings = append(warnings, "IPC namespace assignment unsupported on Solaris.Discarding IPC setting.") - logrus.Warnf("IPC namespace assignment unsupported on Solaris.Discarding IPC setting.") - hostConfig.IpcMode = "" - } - - if hostConfig.PidMode != "" { - warnings = append(warnings, "PID namespace setting unsupported on Solaris. Running container in host PID namespace.") - logrus.Warnf("PID namespace setting unsupported on Solaris. Running container in host PID namespace.") - hostConfig.PidMode = "" - } - - if hostConfig.Privileged { - warnings = append(warnings, "Privileged mode unsupported on Solaris. Discarding privileged mode setting.") - logrus.Warnf("Privileged mode unsupported on Solaris. Discarding privileged mode setting.") - hostConfig.Privileged = false - } - - if hostConfig.UTSMode != "" { - warnings = append(warnings, "UTS namespace assignment unsupported on Solaris.Discarding UTS setting.") - logrus.Warnf("UTS namespace assignment unsupported on Solaris.Discarding UTS setting.") - hostConfig.UTSMode = "" - } - - if hostConfig.CgroupParent != "" { - warnings = append(warnings, "Specifying Cgroup parent unsupported on Solaris. Discarding cgroup parent setting.") - logrus.Warnf("Specifying Cgroup parent unsupported on Solaris. Discarding cgroup parent setting.") - hostConfig.CgroupParent = "" - } - - if hostConfig.Ulimits != nil { - warnings = append(warnings, "Specifying ulimits unsupported on Solaris. Discarding ulimits setting.") - logrus.Warnf("Specifying ulimits unsupported on Solaris. Discarding ulimits setting.") - hostConfig.Ulimits = nil - } - - return warnings, nil -} - -// platformReload update configuration with platform specific options -func (daemon *Daemon) platformReload(config *Config) map[string]string { - return map[string]string{} -} - -// verifyDaemonSettings performs validation of daemon config struct -func verifyDaemonSettings(config *Config) error { - - if config.DefaultRuntime == "" { - config.DefaultRuntime = stockRuntimeName - } - if config.Runtimes == nil { - config.Runtimes = make(map[string]types.Runtime) - } - stockRuntimeOpts := []string{} - config.Runtimes[stockRuntimeName] = types.Runtime{Path: DefaultRuntimeBinary, Args: stockRuntimeOpts} - - // checkSystem validates platform-specific requirements - return nil -} - -func checkSystem() error { - // check OS version for compatibility, ensure running in global zone - var err error - var id C.zoneid_t - - if id, err = C.getzoneid(); err != nil { - return fmt.Errorf("Exiting. Error getting zone id: %+v", err) - } - if int(id) != 0 { - return fmt.Errorf("Exiting because the Docker daemon is not running in the global zone") - } - - v, err := kernel.GetKernelVersion() - if kernel.CompareKernelVersion(*v, kernel.VersionInfo{Kernel: 5, Major: 12, Minor: 0}) < 0 { - return fmt.Errorf("Your Solaris kernel version: %s doesn't support Docker. Please upgrade to 5.12.0", v.String()) - } - return err -} - -// configureMaxThreads sets the Go runtime max threads threshold -// which is 90% of the kernel setting from /proc/sys/kernel/threads-max -func configureMaxThreads(config *Config) error { - return nil -} - -// configureKernelSecuritySupport configures and validate security support for the kernel -func configureKernelSecuritySupport(config *Config, driverName string) error { - return nil -} - -func (daemon *Daemon) initNetworkController(config *Config, activeSandboxes map[string]interface{}) (libnetwork.NetworkController, error) { - netOptions, err := daemon.networkOptions(config, daemon.PluginStore, activeSandboxes) - if err != nil { - return nil, err - } - - controller, err := libnetwork.New(netOptions...) - if err != nil { - return nil, fmt.Errorf("error obtaining controller instance: %v", err) - } - - // Initialize default network on "null" - if _, err := controller.NewNetwork("null", "none", "", libnetwork.NetworkOptionPersist(false)); err != nil { - return nil, fmt.Errorf("Error creating default 'null' network: %v", err) - } - - if !config.DisableBridge { - // Initialize default driver "bridge" - if err := initBridgeDriver(controller, config); err != nil { - return nil, err - } - } - - return controller, nil -} - -func initBridgeDriver(controller libnetwork.NetworkController, config *Config) error { - if n, err := controller.NetworkByName("bridge"); err == nil { - if err = n.Delete(); err != nil { - return fmt.Errorf("could not delete the default bridge network: %v", err) - } - } - - bridgeName := bridge.DefaultBridgeName - if config.bridgeConfig.Iface != "" { - bridgeName = config.bridgeConfig.Iface - } - netOption := map[string]string{ - bridge.BridgeName: bridgeName, - bridge.DefaultBridge: strconv.FormatBool(true), - netlabel.DriverMTU: strconv.Itoa(config.Mtu), - bridge.EnableICC: strconv.FormatBool(config.bridgeConfig.InterContainerCommunication), - } - - // --ip processing - if config.bridgeConfig.DefaultIP != nil { - netOption[bridge.DefaultBindingIP] = config.bridgeConfig.DefaultIP.String() - } - - var ipamV4Conf *libnetwork.IpamConf - - ipamV4Conf = &libnetwork.IpamConf{AuxAddresses: make(map[string]string)} - - nwList, _, err := netutils.ElectInterfaceAddresses(bridgeName) - if err != nil { - return errors.Wrap(err, "list bridge addresses failed") - } - - nw := nwList[0] - if len(nwList) > 1 && config.bridgeConfig.FixedCIDR != "" { - _, fCIDR, err := net.ParseCIDR(config.bridgeConfig.FixedCIDR) - if err != nil { - return errors.Wrap(err, "parse CIDR failed") - } - // Iterate through in case there are multiple addresses for the bridge - for _, entry := range nwList { - if fCIDR.Contains(entry.IP) { - nw = entry - break - } - } - } - - ipamV4Conf.PreferredPool = lntypes.GetIPNetCanonical(nw).String() - hip, _ := lntypes.GetHostPartIP(nw.IP, nw.Mask) - if hip.IsGlobalUnicast() { - ipamV4Conf.Gateway = nw.IP.String() - } - - if config.bridgeConfig.IP != "" { - ipamV4Conf.PreferredPool = config.bridgeConfig.IP - ip, _, err := net.ParseCIDR(config.bridgeConfig.IP) - if err != nil { - return err - } - ipamV4Conf.Gateway = ip.String() - } else if bridgeName == bridge.DefaultBridgeName && ipamV4Conf.PreferredPool != "" { - logrus.Infof("Default bridge (%s) is assigned with an IP address %s. Daemon option --bip can be used to set a preferred IP address", bridgeName, ipamV4Conf.PreferredPool) - } - - if config.bridgeConfig.FixedCIDR != "" { - _, fCIDR, err := net.ParseCIDR(config.bridgeConfig.FixedCIDR) - if err != nil { - return err - } - - ipamV4Conf.SubPool = fCIDR.String() - } - - if config.bridgeConfig.DefaultGatewayIPv4 != nil { - ipamV4Conf.AuxAddresses["DefaultGatewayIPv4"] = config.bridgeConfig.DefaultGatewayIPv4.String() - } - - v4Conf := []*libnetwork.IpamConf{ipamV4Conf} - v6Conf := []*libnetwork.IpamConf{} - - // Initialize default network on "bridge" with the same name - _, err = controller.NewNetwork("bridge", "bridge", "", - libnetwork.NetworkOptionDriverOpts(netOption), - libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil), - libnetwork.NetworkOptionDeferIPv6Alloc(false)) - if err != nil { - return fmt.Errorf("Error creating default 'bridge' network: %v", err) - } - return nil -} - -// registerLinks sets up links between containers and writes the -// configuration out for persistence. -func (daemon *Daemon) registerLinks(container *container.Container, hostConfig *containertypes.HostConfig) error { - return nil -} - -func (daemon *Daemon) cleanupMounts() error { - return nil -} - -// conditionalMountOnStart is a platform specific helper function during the -// container start to call mount. -func (daemon *Daemon) conditionalMountOnStart(container *container.Container) error { - return daemon.Mount(container) -} - -// conditionalUnmountOnCleanup is a platform specific helper function called -// during the cleanup of a container to unmount. -func (daemon *Daemon) conditionalUnmountOnCleanup(container *container.Container) error { - return daemon.Unmount(container) -} - -func restoreCustomImage(is image.Store, ls layer.Store, rs reference.Store) error { - // Solaris has no custom images to register - return nil -} - -func driverOptions(config *Config) []nwconfig.Option { - return []nwconfig.Option{} -} - -func (daemon *Daemon) stats(c *container.Container) (*types.StatsJSON, error) { - return nil, nil -} - -// setDefaultIsolation determine the default isolation mode for the -// daemon to run in. This is only applicable on Windows -func (daemon *Daemon) setDefaultIsolation() error { - return nil -} - -func rootFSToAPIType(rootfs *image.RootFS) types.RootFS { - return types.RootFS{} -} - -func setupDaemonProcess(config *Config) error { - return nil -} - -func (daemon *Daemon) setupSeccompProfile() error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/daemon_test.go b/vendor/github.com/docker/docker/daemon/daemon_test.go deleted file mode 100644 index 00817bd1b..000000000 --- a/vendor/github.com/docker/docker/daemon/daemon_test.go +++ /dev/null @@ -1,627 +0,0 @@ -// +build !solaris - -package daemon - -import ( - "io/ioutil" - "os" - "path/filepath" - "reflect" - "testing" - "time" - - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/discovery" - _ "github.com/docker/docker/pkg/discovery/memory" - "github.com/docker/docker/pkg/registrar" - "github.com/docker/docker/pkg/truncindex" - "github.com/docker/docker/registry" - "github.com/docker/docker/volume" - volumedrivers "github.com/docker/docker/volume/drivers" - "github.com/docker/docker/volume/local" - "github.com/docker/docker/volume/store" - "github.com/docker/go-connections/nat" -) - -// -// https://github.com/docker/docker/issues/8069 -// - -func TestGetContainer(t *testing.T) { - c1 := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: "5a4ff6a163ad4533d22d69a2b8960bf7fafdcba06e72d2febdba229008b0bf57", - Name: "tender_bardeen", - }, - } - - c2 := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: "3cdbd1aa394fd68559fd1441d6eff2ab7c1e6363582c82febfaa8045df3bd8de", - Name: "drunk_hawking", - }, - } - - c3 := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: "3cdbd1aa394fd68559fd1441d6eff2abfafdcba06e72d2febdba229008b0bf57", - Name: "3cdbd1aa", - }, - } - - c4 := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: "75fb0b800922abdbef2d27e60abcdfaf7fb0698b2a96d22d3354da361a6ff4a5", - Name: "5a4ff6a163ad4533d22d69a2b8960bf7fafdcba06e72d2febdba229008b0bf57", - }, - } - - c5 := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: "d22d69a2b8960bf7fafdcba06e72d2febdba960bf7fafdcba06e72d2f9008b060b", - Name: "d22d69a2b896", - }, - } - - store := container.NewMemoryStore() - store.Add(c1.ID, c1) - store.Add(c2.ID, c2) - store.Add(c3.ID, c3) - store.Add(c4.ID, c4) - store.Add(c5.ID, c5) - - index := truncindex.NewTruncIndex([]string{}) - index.Add(c1.ID) - index.Add(c2.ID) - index.Add(c3.ID) - index.Add(c4.ID) - index.Add(c5.ID) - - daemon := &Daemon{ - containers: store, - idIndex: index, - nameIndex: registrar.NewRegistrar(), - } - - daemon.reserveName(c1.ID, c1.Name) - daemon.reserveName(c2.ID, c2.Name) - daemon.reserveName(c3.ID, c3.Name) - daemon.reserveName(c4.ID, c4.Name) - daemon.reserveName(c5.ID, c5.Name) - - if container, _ := daemon.GetContainer("3cdbd1aa394fd68559fd1441d6eff2ab7c1e6363582c82febfaa8045df3bd8de"); container != c2 { - t.Fatal("Should explicitly match full container IDs") - } - - if container, _ := daemon.GetContainer("75fb0b8009"); container != c4 { - t.Fatal("Should match a partial ID") - } - - if container, _ := daemon.GetContainer("drunk_hawking"); container != c2 { - t.Fatal("Should match a full name") - } - - // c3.Name is a partial match for both c3.ID and c2.ID - if c, _ := daemon.GetContainer("3cdbd1aa"); c != c3 { - t.Fatal("Should match a full name even though it collides with another container's ID") - } - - if container, _ := daemon.GetContainer("d22d69a2b896"); container != c5 { - t.Fatal("Should match a container where the provided prefix is an exact match to the its name, and is also a prefix for its ID") - } - - if _, err := daemon.GetContainer("3cdbd1"); err == nil { - t.Fatal("Should return an error when provided a prefix that partially matches multiple container ID's") - } - - if _, err := daemon.GetContainer("nothing"); err == nil { - t.Fatal("Should return an error when provided a prefix that is neither a name or a partial match to an ID") - } -} - -func initDaemonWithVolumeStore(tmp string) (*Daemon, error) { - var err error - daemon := &Daemon{ - repository: tmp, - root: tmp, - } - daemon.volumes, err = store.New(tmp) - if err != nil { - return nil, err - } - - volumesDriver, err := local.New(tmp, 0, 0) - if err != nil { - return nil, err - } - volumedrivers.Register(volumesDriver, volumesDriver.Name()) - - return daemon, nil -} - -func TestValidContainerNames(t *testing.T) { - invalidNames := []string{"-rm", "&sdfsfd", "safd%sd"} - validNames := []string{"word-word", "word_word", "1weoid"} - - for _, name := range invalidNames { - if validContainerNamePattern.MatchString(name) { - t.Fatalf("%q is not a valid container name and was returned as valid.", name) - } - } - - for _, name := range validNames { - if !validContainerNamePattern.MatchString(name) { - t.Fatalf("%q is a valid container name and was returned as invalid.", name) - } - } -} - -func TestContainerInitDNS(t *testing.T) { - tmp, err := ioutil.TempDir("", "docker-container-test-") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - containerID := "d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e" - containerPath := filepath.Join(tmp, containerID) - if err := os.MkdirAll(containerPath, 0755); err != nil { - t.Fatal(err) - } - - config := `{"State":{"Running":true,"Paused":false,"Restarting":false,"OOMKilled":false,"Dead":false,"Pid":2464,"ExitCode":0, -"Error":"","StartedAt":"2015-05-26T16:48:53.869308965Z","FinishedAt":"0001-01-01T00:00:00Z"}, -"ID":"d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e","Created":"2015-05-26T16:48:53.7987917Z","Path":"top", -"Args":[],"Config":{"Hostname":"d59df5276e7b","Domainname":"","User":"","Memory":0,"MemorySwap":0,"CpuShares":0,"Cpuset":"", -"AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"PortSpecs":null,"ExposedPorts":null,"Tty":true,"OpenStdin":true, -"StdinOnce":false,"Env":null,"Cmd":["top"],"Image":"ubuntu:latest","Volumes":null,"WorkingDir":"","Entrypoint":null, -"NetworkDisabled":false,"MacAddress":"","OnBuild":null,"Labels":{}},"Image":"07f8e8c5e66084bef8f848877857537ffe1c47edd01a93af27e7161672ad0e95", -"NetworkSettings":{"IPAddress":"172.17.0.1","IPPrefixLen":16,"MacAddress":"02:42:ac:11:00:01","LinkLocalIPv6Address":"fe80::42:acff:fe11:1", -"LinkLocalIPv6PrefixLen":64,"GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"Gateway":"172.17.42.1","IPv6Gateway":"","Bridge":"docker0","Ports":{}}, -"ResolvConfPath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/resolv.conf", -"HostnamePath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/hostname", -"HostsPath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/hosts", -"LogPath":"/var/lib/docker/containers/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e/d59df5276e7b219d510fe70565e0404bc06350e0d4b43fe961f22f339980170e-json.log", -"Name":"/ubuntu","Driver":"aufs","MountLabel":"","ProcessLabel":"","AppArmorProfile":"","RestartCount":0, -"UpdateDns":false,"Volumes":{},"VolumesRW":{},"AppliedVolumesFrom":null}` - - // Container struct only used to retrieve path to config file - container := &container.Container{CommonContainer: container.CommonContainer{Root: containerPath}} - configPath, err := container.ConfigPath() - if err != nil { - t.Fatal(err) - } - if err = ioutil.WriteFile(configPath, []byte(config), 0644); err != nil { - t.Fatal(err) - } - - hostConfig := `{"Binds":[],"ContainerIDFile":"","Memory":0,"MemorySwap":0,"CpuShares":0,"CpusetCpus":"", -"Privileged":false,"PortBindings":{},"Links":null,"PublishAllPorts":false,"Dns":null,"DnsOptions":null,"DnsSearch":null,"ExtraHosts":null,"VolumesFrom":null, -"Devices":[],"NetworkMode":"bridge","IpcMode":"","PidMode":"","CapAdd":null,"CapDrop":null,"RestartPolicy":{"Name":"no","MaximumRetryCount":0}, -"SecurityOpt":null,"ReadonlyRootfs":false,"Ulimits":null,"LogConfig":{"Type":"","Config":null},"CgroupParent":""}` - - hostConfigPath, err := container.HostConfigPath() - if err != nil { - t.Fatal(err) - } - if err = ioutil.WriteFile(hostConfigPath, []byte(hostConfig), 0644); err != nil { - t.Fatal(err) - } - - daemon, err := initDaemonWithVolumeStore(tmp) - if err != nil { - t.Fatal(err) - } - defer volumedrivers.Unregister(volume.DefaultDriverName) - - c, err := daemon.load(containerID) - if err != nil { - t.Fatal(err) - } - - if c.HostConfig.DNS == nil { - t.Fatal("Expected container DNS to not be nil") - } - - if c.HostConfig.DNSSearch == nil { - t.Fatal("Expected container DNSSearch to not be nil") - } - - if c.HostConfig.DNSOptions == nil { - t.Fatal("Expected container DNSOptions to not be nil") - } -} - -func newPortNoError(proto, port string) nat.Port { - p, _ := nat.NewPort(proto, port) - return p -} - -func TestMerge(t *testing.T) { - volumesImage := make(map[string]struct{}) - volumesImage["/test1"] = struct{}{} - volumesImage["/test2"] = struct{}{} - portsImage := make(nat.PortSet) - portsImage[newPortNoError("tcp", "1111")] = struct{}{} - portsImage[newPortNoError("tcp", "2222")] = struct{}{} - configImage := &containertypes.Config{ - ExposedPorts: portsImage, - Env: []string{"VAR1=1", "VAR2=2"}, - Volumes: volumesImage, - } - - portsUser := make(nat.PortSet) - portsUser[newPortNoError("tcp", "2222")] = struct{}{} - portsUser[newPortNoError("tcp", "3333")] = struct{}{} - volumesUser := make(map[string]struct{}) - volumesUser["/test3"] = struct{}{} - configUser := &containertypes.Config{ - ExposedPorts: portsUser, - Env: []string{"VAR2=3", "VAR3=3"}, - Volumes: volumesUser, - } - - if err := merge(configUser, configImage); err != nil { - t.Error(err) - } - - if len(configUser.ExposedPorts) != 3 { - t.Fatalf("Expected 3 ExposedPorts, 1111, 2222 and 3333, found %d", len(configUser.ExposedPorts)) - } - for portSpecs := range configUser.ExposedPorts { - if portSpecs.Port() != "1111" && portSpecs.Port() != "2222" && portSpecs.Port() != "3333" { - t.Fatalf("Expected 1111 or 2222 or 3333, found %s", portSpecs) - } - } - if len(configUser.Env) != 3 { - t.Fatalf("Expected 3 env var, VAR1=1, VAR2=3 and VAR3=3, found %d", len(configUser.Env)) - } - for _, env := range configUser.Env { - if env != "VAR1=1" && env != "VAR2=3" && env != "VAR3=3" { - t.Fatalf("Expected VAR1=1 or VAR2=3 or VAR3=3, found %s", env) - } - } - - if len(configUser.Volumes) != 3 { - t.Fatalf("Expected 3 volumes, /test1, /test2 and /test3, found %d", len(configUser.Volumes)) - } - for v := range configUser.Volumes { - if v != "/test1" && v != "/test2" && v != "/test3" { - t.Fatalf("Expected /test1 or /test2 or /test3, found %s", v) - } - } - - ports, _, err := nat.ParsePortSpecs([]string{"0000"}) - if err != nil { - t.Error(err) - } - configImage2 := &containertypes.Config{ - ExposedPorts: ports, - } - - if err := merge(configUser, configImage2); err != nil { - t.Error(err) - } - - if len(configUser.ExposedPorts) != 4 { - t.Fatalf("Expected 4 ExposedPorts, 0000, 1111, 2222 and 3333, found %d", len(configUser.ExposedPorts)) - } - for portSpecs := range configUser.ExposedPorts { - if portSpecs.Port() != "0" && portSpecs.Port() != "1111" && portSpecs.Port() != "2222" && portSpecs.Port() != "3333" { - t.Fatalf("Expected %q or %q or %q or %q, found %s", 0, 1111, 2222, 3333, portSpecs) - } - } -} - -func TestDaemonReloadLabels(t *testing.T) { - daemon := &Daemon{} - daemon.configStore = &Config{ - CommonConfig: CommonConfig{ - Labels: []string{"foo:bar"}, - }, - } - - valuesSets := make(map[string]interface{}) - valuesSets["labels"] = "foo:baz" - newConfig := &Config{ - CommonConfig: CommonConfig{ - Labels: []string{"foo:baz"}, - valuesSet: valuesSets, - }, - } - - if err := daemon.Reload(newConfig); err != nil { - t.Fatal(err) - } - - label := daemon.configStore.Labels[0] - if label != "foo:baz" { - t.Fatalf("Expected daemon label `foo:baz`, got %s", label) - } -} - -func TestDaemonReloadInsecureRegistries(t *testing.T) { - daemon := &Daemon{} - // initialize daemon with existing insecure registries: "127.0.0.0/8", "10.10.1.11:5000", "10.10.1.22:5000" - daemon.RegistryService = registry.NewService(registry.ServiceOptions{ - InsecureRegistries: []string{ - "127.0.0.0/8", - "10.10.1.11:5000", - "10.10.1.22:5000", // this will be removed when reloading - "docker1.com", - "docker2.com", // this will be removed when reloading - }, - }) - - daemon.configStore = &Config{} - - insecureRegistries := []string{ - "127.0.0.0/8", // this will be kept - "10.10.1.11:5000", // this will be kept - "10.10.1.33:5000", // this will be newly added - "docker1.com", // this will be kept - "docker3.com", // this will be newly added - } - - valuesSets := make(map[string]interface{}) - valuesSets["insecure-registries"] = insecureRegistries - - newConfig := &Config{ - CommonConfig: CommonConfig{ - ServiceOptions: registry.ServiceOptions{ - InsecureRegistries: insecureRegistries, - }, - valuesSet: valuesSets, - }, - } - - if err := daemon.Reload(newConfig); err != nil { - t.Fatal(err) - } - - // After Reload, daemon.RegistryService will be changed which is useful - // for registry communication in daemon. - registries := daemon.RegistryService.ServiceConfig() - - // After Reload(), newConfig has come to registries.InsecureRegistryCIDRs and registries.IndexConfigs in daemon. - // Then collect registries.InsecureRegistryCIDRs in dataMap. - // When collecting, we need to convert CIDRS into string as a key, - // while the times of key appears as value. - dataMap := map[string]int{} - for _, value := range registries.InsecureRegistryCIDRs { - if _, ok := dataMap[value.String()]; !ok { - dataMap[value.String()] = 1 - } else { - dataMap[value.String()]++ - } - } - - for _, value := range registries.IndexConfigs { - if _, ok := dataMap[value.Name]; !ok { - dataMap[value.Name] = 1 - } else { - dataMap[value.Name]++ - } - } - - // Finally compare dataMap with the original insecureRegistries. - // Each value in insecureRegistries should appear in daemon's insecure registries, - // and each can only appear exactly ONCE. - for _, r := range insecureRegistries { - if value, ok := dataMap[r]; !ok { - t.Fatalf("Expected daemon insecure registry %s, got none", r) - } else if value != 1 { - t.Fatalf("Expected only 1 daemon insecure registry %s, got %d", r, value) - } - } - - // assert if "10.10.1.22:5000" is removed when reloading - if value, ok := dataMap["10.10.1.22:5000"]; ok { - t.Fatalf("Expected no insecure registry of 10.10.1.22:5000, got %d", value) - } - - // assert if "docker2.com" is removed when reloading - if value, ok := dataMap["docker2.com"]; ok { - t.Fatalf("Expected no insecure registry of docker2.com, got %d", value) - } -} - -func TestDaemonReloadNotAffectOthers(t *testing.T) { - daemon := &Daemon{} - daemon.configStore = &Config{ - CommonConfig: CommonConfig{ - Labels: []string{"foo:bar"}, - Debug: true, - }, - } - - valuesSets := make(map[string]interface{}) - valuesSets["labels"] = "foo:baz" - newConfig := &Config{ - CommonConfig: CommonConfig{ - Labels: []string{"foo:baz"}, - valuesSet: valuesSets, - }, - } - - if err := daemon.Reload(newConfig); err != nil { - t.Fatal(err) - } - - label := daemon.configStore.Labels[0] - if label != "foo:baz" { - t.Fatalf("Expected daemon label `foo:baz`, got %s", label) - } - debug := daemon.configStore.Debug - if !debug { - t.Fatalf("Expected debug 'enabled', got 'disabled'") - } -} - -func TestDaemonDiscoveryReload(t *testing.T) { - daemon := &Daemon{} - daemon.configStore = &Config{ - CommonConfig: CommonConfig{ - ClusterStore: "memory://127.0.0.1", - ClusterAdvertise: "127.0.0.1:3333", - }, - } - - if err := daemon.initDiscovery(daemon.configStore); err != nil { - t.Fatal(err) - } - - expected := discovery.Entries{ - &discovery.Entry{Host: "127.0.0.1", Port: "3333"}, - } - - select { - case <-time.After(10 * time.Second): - t.Fatal("timeout waiting for discovery") - case <-daemon.discoveryWatcher.ReadyCh(): - } - - stopCh := make(chan struct{}) - defer close(stopCh) - ch, errCh := daemon.discoveryWatcher.Watch(stopCh) - - select { - case <-time.After(1 * time.Second): - t.Fatal("failed to get discovery advertisements in time") - case e := <-ch: - if !reflect.DeepEqual(e, expected) { - t.Fatalf("expected %v, got %v\n", expected, e) - } - case e := <-errCh: - t.Fatal(e) - } - - valuesSets := make(map[string]interface{}) - valuesSets["cluster-store"] = "memory://127.0.0.1:2222" - valuesSets["cluster-advertise"] = "127.0.0.1:5555" - newConfig := &Config{ - CommonConfig: CommonConfig{ - ClusterStore: "memory://127.0.0.1:2222", - ClusterAdvertise: "127.0.0.1:5555", - valuesSet: valuesSets, - }, - } - - expected = discovery.Entries{ - &discovery.Entry{Host: "127.0.0.1", Port: "5555"}, - } - - if err := daemon.Reload(newConfig); err != nil { - t.Fatal(err) - } - - select { - case <-time.After(10 * time.Second): - t.Fatal("timeout waiting for discovery") - case <-daemon.discoveryWatcher.ReadyCh(): - } - - ch, errCh = daemon.discoveryWatcher.Watch(stopCh) - - select { - case <-time.After(1 * time.Second): - t.Fatal("failed to get discovery advertisements in time") - case e := <-ch: - if !reflect.DeepEqual(e, expected) { - t.Fatalf("expected %v, got %v\n", expected, e) - } - case e := <-errCh: - t.Fatal(e) - } -} - -func TestDaemonDiscoveryReloadFromEmptyDiscovery(t *testing.T) { - daemon := &Daemon{} - daemon.configStore = &Config{} - - valuesSet := make(map[string]interface{}) - valuesSet["cluster-store"] = "memory://127.0.0.1:2222" - valuesSet["cluster-advertise"] = "127.0.0.1:5555" - newConfig := &Config{ - CommonConfig: CommonConfig{ - ClusterStore: "memory://127.0.0.1:2222", - ClusterAdvertise: "127.0.0.1:5555", - valuesSet: valuesSet, - }, - } - - expected := discovery.Entries{ - &discovery.Entry{Host: "127.0.0.1", Port: "5555"}, - } - - if err := daemon.Reload(newConfig); err != nil { - t.Fatal(err) - } - - select { - case <-time.After(10 * time.Second): - t.Fatal("timeout waiting for discovery") - case <-daemon.discoveryWatcher.ReadyCh(): - } - - stopCh := make(chan struct{}) - defer close(stopCh) - ch, errCh := daemon.discoveryWatcher.Watch(stopCh) - - select { - case <-time.After(1 * time.Second): - t.Fatal("failed to get discovery advertisements in time") - case e := <-ch: - if !reflect.DeepEqual(e, expected) { - t.Fatalf("expected %v, got %v\n", expected, e) - } - case e := <-errCh: - t.Fatal(e) - } -} - -func TestDaemonDiscoveryReloadOnlyClusterAdvertise(t *testing.T) { - daemon := &Daemon{} - daemon.configStore = &Config{ - CommonConfig: CommonConfig{ - ClusterStore: "memory://127.0.0.1", - }, - } - valuesSets := make(map[string]interface{}) - valuesSets["cluster-advertise"] = "127.0.0.1:5555" - newConfig := &Config{ - CommonConfig: CommonConfig{ - ClusterAdvertise: "127.0.0.1:5555", - valuesSet: valuesSets, - }, - } - expected := discovery.Entries{ - &discovery.Entry{Host: "127.0.0.1", Port: "5555"}, - } - - if err := daemon.Reload(newConfig); err != nil { - t.Fatal(err) - } - - select { - case <-daemon.discoveryWatcher.ReadyCh(): - case <-time.After(10 * time.Second): - t.Fatal("Timeout waiting for discovery") - } - stopCh := make(chan struct{}) - defer close(stopCh) - ch, errCh := daemon.discoveryWatcher.Watch(stopCh) - - select { - case <-time.After(1 * time.Second): - t.Fatal("failed to get discovery advertisements in time") - case e := <-ch: - if !reflect.DeepEqual(e, expected) { - t.Fatalf("expected %v, got %v\n", expected, e) - } - case e := <-errCh: - t.Fatal(e) - } - -} diff --git a/vendor/github.com/docker/docker/daemon/daemon_unix.go b/vendor/github.com/docker/docker/daemon/daemon_unix.go deleted file mode 100644 index 5b3ffeb72..000000000 --- a/vendor/github.com/docker/docker/daemon/daemon_unix.go +++ /dev/null @@ -1,1237 +0,0 @@ -// +build linux freebsd - -package daemon - -import ( - "bytes" - "fmt" - "io/ioutil" - "net" - "os" - "path/filepath" - "runtime" - "runtime/debug" - "strconv" - "strings" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/blkiodev" - pblkiodev "github.com/docker/docker/api/types/blkiodev" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/image" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/parsers" - "github.com/docker/docker/pkg/parsers/kernel" - "github.com/docker/docker/pkg/sysinfo" - "github.com/docker/docker/runconfig" - runconfigopts "github.com/docker/docker/runconfig/opts" - "github.com/docker/libnetwork" - nwconfig "github.com/docker/libnetwork/config" - "github.com/docker/libnetwork/drivers/bridge" - "github.com/docker/libnetwork/netlabel" - "github.com/docker/libnetwork/netutils" - "github.com/docker/libnetwork/options" - lntypes "github.com/docker/libnetwork/types" - "github.com/golang/protobuf/ptypes" - "github.com/opencontainers/runc/libcontainer/cgroups" - "github.com/opencontainers/runc/libcontainer/label" - rsystem "github.com/opencontainers/runc/libcontainer/system" - specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" - "github.com/vishvananda/netlink" -) - -const ( - // See https://git.kernel.org/cgit/linux/kernel/git/tip/tip.git/tree/kernel/sched/sched.h?id=8cd9234c64c584432f6992fe944ca9e46ca8ea76#n269 - linuxMinCPUShares = 2 - linuxMaxCPUShares = 262144 - platformSupported = true - // It's not kernel limit, we want this 4M limit to supply a reasonable functional container - linuxMinMemory = 4194304 - // constants for remapped root settings - defaultIDSpecifier string = "default" - defaultRemappedID string = "dockremap" - - // constant for cgroup drivers - cgroupFsDriver = "cgroupfs" - cgroupSystemdDriver = "systemd" -) - -func getMemoryResources(config containertypes.Resources) *specs.Memory { - memory := specs.Memory{} - - if config.Memory > 0 { - limit := uint64(config.Memory) - memory.Limit = &limit - } - - if config.MemoryReservation > 0 { - reservation := uint64(config.MemoryReservation) - memory.Reservation = &reservation - } - - if config.MemorySwap != 0 { - swap := uint64(config.MemorySwap) - memory.Swap = &swap - } - - if config.MemorySwappiness != nil { - swappiness := uint64(*config.MemorySwappiness) - memory.Swappiness = &swappiness - } - - if config.KernelMemory != 0 { - kernelMemory := uint64(config.KernelMemory) - memory.Kernel = &kernelMemory - } - - return &memory -} - -func getCPUResources(config containertypes.Resources) *specs.CPU { - cpu := specs.CPU{} - - if config.CPUShares != 0 { - shares := uint64(config.CPUShares) - cpu.Shares = &shares - } - - if config.CpusetCpus != "" { - cpuset := config.CpusetCpus - cpu.Cpus = &cpuset - } - - if config.CpusetMems != "" { - cpuset := config.CpusetMems - cpu.Mems = &cpuset - } - - if config.NanoCPUs > 0 { - // https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt - period := uint64(100 * time.Millisecond / time.Microsecond) - quota := uint64(config.NanoCPUs) * period / 1e9 - cpu.Period = &period - cpu.Quota = "a - } - - if config.CPUPeriod != 0 { - period := uint64(config.CPUPeriod) - cpu.Period = &period - } - - if config.CPUQuota != 0 { - quota := uint64(config.CPUQuota) - cpu.Quota = "a - } - - if config.CPURealtimePeriod != 0 { - period := uint64(config.CPURealtimePeriod) - cpu.RealtimePeriod = &period - } - - if config.CPURealtimeRuntime != 0 { - runtime := uint64(config.CPURealtimeRuntime) - cpu.RealtimeRuntime = &runtime - } - - return &cpu -} - -func getBlkioWeightDevices(config containertypes.Resources) ([]specs.WeightDevice, error) { - var stat syscall.Stat_t - var blkioWeightDevices []specs.WeightDevice - - for _, weightDevice := range config.BlkioWeightDevice { - if err := syscall.Stat(weightDevice.Path, &stat); err != nil { - return nil, err - } - weight := weightDevice.Weight - d := specs.WeightDevice{Weight: &weight} - d.Major = int64(stat.Rdev / 256) - d.Minor = int64(stat.Rdev % 256) - blkioWeightDevices = append(blkioWeightDevices, d) - } - - return blkioWeightDevices, nil -} - -func parseSecurityOpt(container *container.Container, config *containertypes.HostConfig) error { - var ( - labelOpts []string - err error - ) - - for _, opt := range config.SecurityOpt { - if opt == "no-new-privileges" { - container.NoNewPrivileges = true - continue - } - - var con []string - if strings.Contains(opt, "=") { - con = strings.SplitN(opt, "=", 2) - } else if strings.Contains(opt, ":") { - con = strings.SplitN(opt, ":", 2) - logrus.Warn("Security options with `:` as a separator are deprecated and will be completely unsupported in 1.14, use `=` instead.") - } - - if len(con) != 2 { - return fmt.Errorf("invalid --security-opt 1: %q", opt) - } - - switch con[0] { - case "label": - labelOpts = append(labelOpts, con[1]) - case "apparmor": - container.AppArmorProfile = con[1] - case "seccomp": - container.SeccompProfile = con[1] - default: - return fmt.Errorf("invalid --security-opt 2: %q", opt) - } - } - - container.ProcessLabel, container.MountLabel, err = label.InitLabels(labelOpts) - return err -} - -func getBlkioThrottleDevices(devs []*blkiodev.ThrottleDevice) ([]specs.ThrottleDevice, error) { - var throttleDevices []specs.ThrottleDevice - var stat syscall.Stat_t - - for _, d := range devs { - if err := syscall.Stat(d.Path, &stat); err != nil { - return nil, err - } - rate := d.Rate - d := specs.ThrottleDevice{Rate: &rate} - d.Major = int64(stat.Rdev / 256) - d.Minor = int64(stat.Rdev % 256) - throttleDevices = append(throttleDevices, d) - } - - return throttleDevices, nil -} - -func checkKernel() error { - // Check for unsupported kernel versions - // FIXME: it would be cleaner to not test for specific versions, but rather - // test for specific functionalities. - // Unfortunately we can't test for the feature "does not cause a kernel panic" - // without actually causing a kernel panic, so we need this workaround until - // the circumstances of pre-3.10 crashes are clearer. - // For details see https://github.com/docker/docker/issues/407 - // Docker 1.11 and above doesn't actually run on kernels older than 3.4, - // due to containerd-shim usage of PR_SET_CHILD_SUBREAPER (introduced in 3.4). - if !kernel.CheckKernelVersion(3, 10, 0) { - v, _ := kernel.GetKernelVersion() - if os.Getenv("DOCKER_NOWARN_KERNEL_VERSION") == "" { - logrus.Fatalf("Your Linux kernel version %s is not supported for running docker. Please upgrade your kernel to 3.10.0 or newer.", v.String()) - } - } - return nil -} - -// adaptContainerSettings is called during container creation to modify any -// settings necessary in the HostConfig structure. -func (daemon *Daemon) adaptContainerSettings(hostConfig *containertypes.HostConfig, adjustCPUShares bool) error { - if adjustCPUShares && hostConfig.CPUShares > 0 { - // Handle unsupported CPUShares - if hostConfig.CPUShares < linuxMinCPUShares { - logrus.Warnf("Changing requested CPUShares of %d to minimum allowed of %d", hostConfig.CPUShares, linuxMinCPUShares) - hostConfig.CPUShares = linuxMinCPUShares - } else if hostConfig.CPUShares > linuxMaxCPUShares { - logrus.Warnf("Changing requested CPUShares of %d to maximum allowed of %d", hostConfig.CPUShares, linuxMaxCPUShares) - hostConfig.CPUShares = linuxMaxCPUShares - } - } - if hostConfig.Memory > 0 && hostConfig.MemorySwap == 0 { - // By default, MemorySwap is set to twice the size of Memory. - hostConfig.MemorySwap = hostConfig.Memory * 2 - } - if hostConfig.ShmSize == 0 { - hostConfig.ShmSize = container.DefaultSHMSize - } - var err error - opts, err := daemon.generateSecurityOpt(hostConfig.IpcMode, hostConfig.PidMode, hostConfig.Privileged) - if err != nil { - return err - } - hostConfig.SecurityOpt = append(hostConfig.SecurityOpt, opts...) - if hostConfig.MemorySwappiness == nil { - defaultSwappiness := int64(-1) - hostConfig.MemorySwappiness = &defaultSwappiness - } - if hostConfig.OomKillDisable == nil { - defaultOomKillDisable := false - hostConfig.OomKillDisable = &defaultOomKillDisable - } - - return nil -} - -func verifyContainerResources(resources *containertypes.Resources, sysInfo *sysinfo.SysInfo, update bool) ([]string, error) { - warnings := []string{} - - // memory subsystem checks and adjustments - if resources.Memory != 0 && resources.Memory < linuxMinMemory { - return warnings, fmt.Errorf("Minimum memory limit allowed is 4MB") - } - if resources.Memory > 0 && !sysInfo.MemoryLimit { - warnings = append(warnings, "Your kernel does not support memory limit capabilities or the cgroup is not mounted. Limitation discarded.") - logrus.Warn("Your kernel does not support memory limit capabilities or the cgroup is not mounted. Limitation discarded.") - resources.Memory = 0 - resources.MemorySwap = -1 - } - if resources.Memory > 0 && resources.MemorySwap != -1 && !sysInfo.SwapLimit { - warnings = append(warnings, "Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.") - logrus.Warn("Your kernel does not support swap limit capabilities,or the cgroup is not mounted. Memory limited without swap.") - resources.MemorySwap = -1 - } - if resources.Memory > 0 && resources.MemorySwap > 0 && resources.MemorySwap < resources.Memory { - return warnings, fmt.Errorf("Minimum memoryswap limit should be larger than memory limit, see usage") - } - if resources.Memory == 0 && resources.MemorySwap > 0 && !update { - return warnings, fmt.Errorf("You should always set the Memory limit when using Memoryswap limit, see usage") - } - if resources.MemorySwappiness != nil && *resources.MemorySwappiness != -1 && !sysInfo.MemorySwappiness { - warnings = append(warnings, "Your kernel does not support memory swappiness capabilities or the cgroup is not mounted. Memory swappiness discarded.") - logrus.Warn("Your kernel does not support memory swappiness capabilities, or the cgroup is not mounted. Memory swappiness discarded.") - resources.MemorySwappiness = nil - } - if resources.MemorySwappiness != nil { - swappiness := *resources.MemorySwappiness - if swappiness < -1 || swappiness > 100 { - return warnings, fmt.Errorf("Invalid value: %v, valid memory swappiness range is 0-100", swappiness) - } - } - if resources.MemoryReservation > 0 && !sysInfo.MemoryReservation { - warnings = append(warnings, "Your kernel does not support memory soft limit capabilities or the cgroup is not mounted. Limitation discarded.") - logrus.Warn("Your kernel does not support memory soft limit capabilities or the cgroup is not mounted. Limitation discarded.") - resources.MemoryReservation = 0 - } - if resources.MemoryReservation > 0 && resources.MemoryReservation < linuxMinMemory { - return warnings, fmt.Errorf("Minimum memory reservation allowed is 4MB") - } - if resources.Memory > 0 && resources.MemoryReservation > 0 && resources.Memory < resources.MemoryReservation { - return warnings, fmt.Errorf("Minimum memory limit can not be less than memory reservation limit, see usage") - } - if resources.KernelMemory > 0 && !sysInfo.KernelMemory { - warnings = append(warnings, "Your kernel does not support kernel memory limit capabilities or the cgroup is not mounted. Limitation discarded.") - logrus.Warn("Your kernel does not support kernel memory limit capabilities or the cgroup is not mounted. Limitation discarded.") - resources.KernelMemory = 0 - } - if resources.KernelMemory > 0 && resources.KernelMemory < linuxMinMemory { - return warnings, fmt.Errorf("Minimum kernel memory limit allowed is 4MB") - } - if resources.KernelMemory > 0 && !kernel.CheckKernelVersion(4, 0, 0) { - warnings = append(warnings, "You specified a kernel memory limit on a kernel older than 4.0. Kernel memory limits are experimental on older kernels, it won't work as expected and can cause your system to be unstable.") - logrus.Warn("You specified a kernel memory limit on a kernel older than 4.0. Kernel memory limits are experimental on older kernels, it won't work as expected and can cause your system to be unstable.") - } - if resources.OomKillDisable != nil && !sysInfo.OomKillDisable { - // only produce warnings if the setting wasn't to *disable* the OOM Kill; no point - // warning the caller if they already wanted the feature to be off - if *resources.OomKillDisable { - warnings = append(warnings, "Your kernel does not support OomKillDisable. OomKillDisable discarded.") - logrus.Warn("Your kernel does not support OomKillDisable. OomKillDisable discarded.") - } - resources.OomKillDisable = nil - } - - if resources.PidsLimit != 0 && !sysInfo.PidsLimit { - warnings = append(warnings, "Your kernel does not support pids limit capabilities or the cgroup is not mounted. PIDs limit discarded.") - logrus.Warn("Your kernel does not support pids limit capabilities or the cgroup is not mounted. PIDs limit discarded.") - resources.PidsLimit = 0 - } - - // cpu subsystem checks and adjustments - if resources.NanoCPUs > 0 && resources.CPUPeriod > 0 { - return warnings, fmt.Errorf("Conflicting options: Nano CPUs and CPU Period cannot both be set") - } - if resources.NanoCPUs > 0 && resources.CPUQuota > 0 { - return warnings, fmt.Errorf("Conflicting options: Nano CPUs and CPU Quota cannot both be set") - } - if resources.NanoCPUs > 0 && (!sysInfo.CPUCfsPeriod || !sysInfo.CPUCfsQuota) { - return warnings, fmt.Errorf("NanoCPUs can not be set, as your kernel does not support CPU cfs period/quota or the cgroup is not mounted") - } - // The highest precision we could get on Linux is 0.001, by setting - // cpu.cfs_period_us=1000ms - // cpu.cfs_quota=1ms - // See the following link for details: - // https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt - // Here we don't set the lower limit and it is up to the underlying platform (e.g., Linux) to return an error. - // The error message is 0.01 so that this is consistent with Windows - if resources.NanoCPUs < 0 || resources.NanoCPUs > int64(sysinfo.NumCPU())*1e9 { - return warnings, fmt.Errorf("Range of CPUs is from 0.01 to %d.00, as there are only %d CPUs available", sysinfo.NumCPU(), sysinfo.NumCPU()) - } - - if resources.CPUShares > 0 && !sysInfo.CPUShares { - warnings = append(warnings, "Your kernel does not support CPU shares or the cgroup is not mounted. Shares discarded.") - logrus.Warn("Your kernel does not support CPU shares or the cgroup is not mounted. Shares discarded.") - resources.CPUShares = 0 - } - if resources.CPUPeriod > 0 && !sysInfo.CPUCfsPeriod { - warnings = append(warnings, "Your kernel does not support CPU cfs period or the cgroup is not mounted. Period discarded.") - logrus.Warn("Your kernel does not support CPU cfs period or the cgroup is not mounted. Period discarded.") - resources.CPUPeriod = 0 - } - if resources.CPUPeriod != 0 && (resources.CPUPeriod < 1000 || resources.CPUPeriod > 1000000) { - return warnings, fmt.Errorf("CPU cfs period can not be less than 1ms (i.e. 1000) or larger than 1s (i.e. 1000000)") - } - if resources.CPUQuota > 0 && !sysInfo.CPUCfsQuota { - warnings = append(warnings, "Your kernel does not support CPU cfs quota or the cgroup is not mounted. Quota discarded.") - logrus.Warn("Your kernel does not support CPU cfs quota or the cgroup is not mounted. Quota discarded.") - resources.CPUQuota = 0 - } - if resources.CPUQuota > 0 && resources.CPUQuota < 1000 { - return warnings, fmt.Errorf("CPU cfs quota can not be less than 1ms (i.e. 1000)") - } - if resources.CPUPercent > 0 { - warnings = append(warnings, fmt.Sprintf("%s does not support CPU percent. Percent discarded.", runtime.GOOS)) - logrus.Warnf("%s does not support CPU percent. Percent discarded.", runtime.GOOS) - resources.CPUPercent = 0 - } - - // cpuset subsystem checks and adjustments - if (resources.CpusetCpus != "" || resources.CpusetMems != "") && !sysInfo.Cpuset { - warnings = append(warnings, "Your kernel does not support cpuset or the cgroup is not mounted. Cpuset discarded.") - logrus.Warn("Your kernel does not support cpuset or the cgroup is not mounted. Cpuset discarded.") - resources.CpusetCpus = "" - resources.CpusetMems = "" - } - cpusAvailable, err := sysInfo.IsCpusetCpusAvailable(resources.CpusetCpus) - if err != nil { - return warnings, fmt.Errorf("Invalid value %s for cpuset cpus", resources.CpusetCpus) - } - if !cpusAvailable { - return warnings, fmt.Errorf("Requested CPUs are not available - requested %s, available: %s", resources.CpusetCpus, sysInfo.Cpus) - } - memsAvailable, err := sysInfo.IsCpusetMemsAvailable(resources.CpusetMems) - if err != nil { - return warnings, fmt.Errorf("Invalid value %s for cpuset mems", resources.CpusetMems) - } - if !memsAvailable { - return warnings, fmt.Errorf("Requested memory nodes are not available - requested %s, available: %s", resources.CpusetMems, sysInfo.Mems) - } - - // blkio subsystem checks and adjustments - if resources.BlkioWeight > 0 && !sysInfo.BlkioWeight { - warnings = append(warnings, "Your kernel does not support Block I/O weight or the cgroup is not mounted. Weight discarded.") - logrus.Warn("Your kernel does not support Block I/O weight or the cgroup is not mounted. Weight discarded.") - resources.BlkioWeight = 0 - } - if resources.BlkioWeight > 0 && (resources.BlkioWeight < 10 || resources.BlkioWeight > 1000) { - return warnings, fmt.Errorf("Range of blkio weight is from 10 to 1000") - } - if resources.IOMaximumBandwidth != 0 || resources.IOMaximumIOps != 0 { - return warnings, fmt.Errorf("Invalid QoS settings: %s does not support Maximum IO Bandwidth or Maximum IO IOps", runtime.GOOS) - } - if len(resources.BlkioWeightDevice) > 0 && !sysInfo.BlkioWeightDevice { - warnings = append(warnings, "Your kernel does not support Block I/O weight_device or the cgroup is not mounted. Weight-device discarded.") - logrus.Warn("Your kernel does not support Block I/O weight_device or the cgroup is not mounted. Weight-device discarded.") - resources.BlkioWeightDevice = []*pblkiodev.WeightDevice{} - } - if len(resources.BlkioDeviceReadBps) > 0 && !sysInfo.BlkioReadBpsDevice { - warnings = append(warnings, "Your kernel does not support BPS Block I/O read limit or the cgroup is not mounted. Block I/O BPS read limit discarded.") - logrus.Warn("Your kernel does not support BPS Block I/O read limit or the cgroup is not mounted. Block I/O BPS read limit discarded") - resources.BlkioDeviceReadBps = []*pblkiodev.ThrottleDevice{} - } - if len(resources.BlkioDeviceWriteBps) > 0 && !sysInfo.BlkioWriteBpsDevice { - warnings = append(warnings, "Your kernel does not support BPS Block I/O write limit or the cgroup is not mounted. Block I/O BPS write limit discarded.") - logrus.Warn("Your kernel does not support BPS Block I/O write limit or the cgroup is not mounted. Block I/O BPS write limit discarded.") - resources.BlkioDeviceWriteBps = []*pblkiodev.ThrottleDevice{} - } - if len(resources.BlkioDeviceReadIOps) > 0 && !sysInfo.BlkioReadIOpsDevice { - warnings = append(warnings, "Your kernel does not support IOPS Block read limit or the cgroup is not mounted. Block I/O IOPS read limit discarded.") - logrus.Warn("Your kernel does not support IOPS Block I/O read limit in IO or the cgroup is not mounted. Block I/O IOPS read limit discarded.") - resources.BlkioDeviceReadIOps = []*pblkiodev.ThrottleDevice{} - } - if len(resources.BlkioDeviceWriteIOps) > 0 && !sysInfo.BlkioWriteIOpsDevice { - warnings = append(warnings, "Your kernel does not support IOPS Block write limit or the cgroup is not mounted. Block I/O IOPS write limit discarded.") - logrus.Warn("Your kernel does not support IOPS Block I/O write limit or the cgroup is not mounted. Block I/O IOPS write limit discarded.") - resources.BlkioDeviceWriteIOps = []*pblkiodev.ThrottleDevice{} - } - - return warnings, nil -} - -func (daemon *Daemon) getCgroupDriver() string { - cgroupDriver := cgroupFsDriver - - if UsingSystemd(daemon.configStore) { - cgroupDriver = cgroupSystemdDriver - } - return cgroupDriver -} - -// getCD gets the raw value of the native.cgroupdriver option, if set. -func getCD(config *Config) string { - for _, option := range config.ExecOptions { - key, val, err := parsers.ParseKeyValueOpt(option) - if err != nil || !strings.EqualFold(key, "native.cgroupdriver") { - continue - } - return val - } - return "" -} - -// VerifyCgroupDriver validates native.cgroupdriver -func VerifyCgroupDriver(config *Config) error { - cd := getCD(config) - if cd == "" || cd == cgroupFsDriver || cd == cgroupSystemdDriver { - return nil - } - return fmt.Errorf("native.cgroupdriver option %s not supported", cd) -} - -// UsingSystemd returns true if cli option includes native.cgroupdriver=systemd -func UsingSystemd(config *Config) bool { - return getCD(config) == cgroupSystemdDriver -} - -// verifyPlatformContainerSettings performs platform-specific validation of the -// hostconfig and config structures. -func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *containertypes.HostConfig, config *containertypes.Config, update bool) ([]string, error) { - warnings := []string{} - sysInfo := sysinfo.New(true) - - warnings, err := daemon.verifyExperimentalContainerSettings(hostConfig, config) - if err != nil { - return warnings, err - } - - w, err := verifyContainerResources(&hostConfig.Resources, sysInfo, update) - - // no matter err is nil or not, w could have data in itself. - warnings = append(warnings, w...) - - if err != nil { - return warnings, err - } - - if hostConfig.ShmSize < 0 { - return warnings, fmt.Errorf("SHM size can not be less than 0") - } - - if hostConfig.OomScoreAdj < -1000 || hostConfig.OomScoreAdj > 1000 { - return warnings, fmt.Errorf("Invalid value %d, range for oom score adj is [-1000, 1000]", hostConfig.OomScoreAdj) - } - - // ip-forwarding does not affect container with '--net=host' (or '--net=none') - if sysInfo.IPv4ForwardingDisabled && !(hostConfig.NetworkMode.IsHost() || hostConfig.NetworkMode.IsNone()) { - warnings = append(warnings, "IPv4 forwarding is disabled. Networking will not work.") - logrus.Warn("IPv4 forwarding is disabled. Networking will not work") - } - // check for various conflicting options with user namespaces - if daemon.configStore.RemappedRoot != "" && hostConfig.UsernsMode.IsPrivate() { - if hostConfig.Privileged { - return warnings, fmt.Errorf("Privileged mode is incompatible with user namespaces") - } - if hostConfig.NetworkMode.IsHost() && !hostConfig.UsernsMode.IsHost() { - return warnings, fmt.Errorf("Cannot share the host's network namespace when user namespaces are enabled") - } - if hostConfig.PidMode.IsHost() && !hostConfig.UsernsMode.IsHost() { - return warnings, fmt.Errorf("Cannot share the host PID namespace when user namespaces are enabled") - } - } - if hostConfig.CgroupParent != "" && UsingSystemd(daemon.configStore) { - // CgroupParent for systemd cgroup should be named as "xxx.slice" - if len(hostConfig.CgroupParent) <= 6 || !strings.HasSuffix(hostConfig.CgroupParent, ".slice") { - return warnings, fmt.Errorf("cgroup-parent for systemd cgroup should be a valid slice named as \"xxx.slice\"") - } - } - if hostConfig.Runtime == "" { - hostConfig.Runtime = daemon.configStore.GetDefaultRuntimeName() - } - - if rt := daemon.configStore.GetRuntime(hostConfig.Runtime); rt == nil { - return warnings, fmt.Errorf("Unknown runtime specified %s", hostConfig.Runtime) - } - - return warnings, nil -} - -// platformReload update configuration with platform specific options -func (daemon *Daemon) platformReload(config *Config) map[string]string { - if config.IsValueSet("runtimes") { - daemon.configStore.Runtimes = config.Runtimes - // Always set the default one - daemon.configStore.Runtimes[stockRuntimeName] = types.Runtime{Path: DefaultRuntimeBinary} - } - - if config.DefaultRuntime != "" { - daemon.configStore.DefaultRuntime = config.DefaultRuntime - } - - // Update attributes - var runtimeList bytes.Buffer - for name, rt := range daemon.configStore.Runtimes { - if runtimeList.Len() > 0 { - runtimeList.WriteRune(' ') - } - runtimeList.WriteString(fmt.Sprintf("%s:%s", name, rt)) - } - - return map[string]string{ - "runtimes": runtimeList.String(), - "default-runtime": daemon.configStore.DefaultRuntime, - } -} - -// verifyDaemonSettings performs validation of daemon config struct -func verifyDaemonSettings(config *Config) error { - // Check for mutually incompatible config options - if config.bridgeConfig.Iface != "" && config.bridgeConfig.IP != "" { - return fmt.Errorf("You specified -b & --bip, mutually exclusive options. Please specify only one") - } - if !config.bridgeConfig.EnableIPTables && !config.bridgeConfig.InterContainerCommunication { - return fmt.Errorf("You specified --iptables=false with --icc=false. ICC=false uses iptables to function. Please set --icc or --iptables to true") - } - if !config.bridgeConfig.EnableIPTables && config.bridgeConfig.EnableIPMasq { - config.bridgeConfig.EnableIPMasq = false - } - if err := VerifyCgroupDriver(config); err != nil { - return err - } - if config.CgroupParent != "" && UsingSystemd(config) { - if len(config.CgroupParent) <= 6 || !strings.HasSuffix(config.CgroupParent, ".slice") { - return fmt.Errorf("cgroup-parent for systemd cgroup should be a valid slice named as \"xxx.slice\"") - } - } - - if config.DefaultRuntime == "" { - config.DefaultRuntime = stockRuntimeName - } - if config.Runtimes == nil { - config.Runtimes = make(map[string]types.Runtime) - } - config.Runtimes[stockRuntimeName] = types.Runtime{Path: DefaultRuntimeBinary} - - return nil -} - -// checkSystem validates platform-specific requirements -func checkSystem() error { - if os.Geteuid() != 0 { - return fmt.Errorf("The Docker daemon needs to be run as root") - } - return checkKernel() -} - -// configureMaxThreads sets the Go runtime max threads threshold -// which is 90% of the kernel setting from /proc/sys/kernel/threads-max -func configureMaxThreads(config *Config) error { - mt, err := ioutil.ReadFile("/proc/sys/kernel/threads-max") - if err != nil { - return err - } - mtint, err := strconv.Atoi(strings.TrimSpace(string(mt))) - if err != nil { - return err - } - maxThreads := (mtint / 100) * 90 - debug.SetMaxThreads(maxThreads) - logrus.Debugf("Golang's threads limit set to %d", maxThreads) - return nil -} - -// configureKernelSecuritySupport configures and validates security support for the kernel -func configureKernelSecuritySupport(config *Config, driverName string) error { - if config.EnableSelinuxSupport { - if !selinuxEnabled() { - logrus.Warn("Docker could not enable SELinux on the host system") - } - } else { - selinuxSetDisabled() - } - return nil -} - -func (daemon *Daemon) initNetworkController(config *Config, activeSandboxes map[string]interface{}) (libnetwork.NetworkController, error) { - netOptions, err := daemon.networkOptions(config, daemon.PluginStore, activeSandboxes) - if err != nil { - return nil, err - } - - controller, err := libnetwork.New(netOptions...) - if err != nil { - return nil, fmt.Errorf("error obtaining controller instance: %v", err) - } - - if len(activeSandboxes) > 0 { - logrus.Info("There are old running containers, the network config will not take affect") - return controller, nil - } - - // Initialize default network on "null" - if n, _ := controller.NetworkByName("none"); n == nil { - if _, err := controller.NewNetwork("null", "none", "", libnetwork.NetworkOptionPersist(true)); err != nil { - return nil, fmt.Errorf("Error creating default \"null\" network: %v", err) - } - } - - // Initialize default network on "host" - if n, _ := controller.NetworkByName("host"); n == nil { - if _, err := controller.NewNetwork("host", "host", "", libnetwork.NetworkOptionPersist(true)); err != nil { - return nil, fmt.Errorf("Error creating default \"host\" network: %v", err) - } - } - - // Clear stale bridge network - if n, err := controller.NetworkByName("bridge"); err == nil { - if err = n.Delete(); err != nil { - return nil, fmt.Errorf("could not delete the default bridge network: %v", err) - } - } - - if !config.DisableBridge { - // Initialize default driver "bridge" - if err := initBridgeDriver(controller, config); err != nil { - return nil, err - } - } else { - removeDefaultBridgeInterface() - } - - return controller, nil -} - -func driverOptions(config *Config) []nwconfig.Option { - bridgeConfig := options.Generic{ - "EnableIPForwarding": config.bridgeConfig.EnableIPForward, - "EnableIPTables": config.bridgeConfig.EnableIPTables, - "EnableUserlandProxy": config.bridgeConfig.EnableUserlandProxy, - "UserlandProxyPath": config.bridgeConfig.UserlandProxyPath} - bridgeOption := options.Generic{netlabel.GenericData: bridgeConfig} - - dOptions := []nwconfig.Option{} - dOptions = append(dOptions, nwconfig.OptionDriverConfig("bridge", bridgeOption)) - return dOptions -} - -func initBridgeDriver(controller libnetwork.NetworkController, config *Config) error { - bridgeName := bridge.DefaultBridgeName - if config.bridgeConfig.Iface != "" { - bridgeName = config.bridgeConfig.Iface - } - netOption := map[string]string{ - bridge.BridgeName: bridgeName, - bridge.DefaultBridge: strconv.FormatBool(true), - netlabel.DriverMTU: strconv.Itoa(config.Mtu), - bridge.EnableIPMasquerade: strconv.FormatBool(config.bridgeConfig.EnableIPMasq), - bridge.EnableICC: strconv.FormatBool(config.bridgeConfig.InterContainerCommunication), - } - - // --ip processing - if config.bridgeConfig.DefaultIP != nil { - netOption[bridge.DefaultBindingIP] = config.bridgeConfig.DefaultIP.String() - } - - var ( - ipamV4Conf *libnetwork.IpamConf - ipamV6Conf *libnetwork.IpamConf - ) - - ipamV4Conf = &libnetwork.IpamConf{AuxAddresses: make(map[string]string)} - - nwList, nw6List, err := netutils.ElectInterfaceAddresses(bridgeName) - if err != nil { - return errors.Wrap(err, "list bridge addresses failed") - } - - nw := nwList[0] - if len(nwList) > 1 && config.bridgeConfig.FixedCIDR != "" { - _, fCIDR, err := net.ParseCIDR(config.bridgeConfig.FixedCIDR) - if err != nil { - return errors.Wrap(err, "parse CIDR failed") - } - // Iterate through in case there are multiple addresses for the bridge - for _, entry := range nwList { - if fCIDR.Contains(entry.IP) { - nw = entry - break - } - } - } - - ipamV4Conf.PreferredPool = lntypes.GetIPNetCanonical(nw).String() - hip, _ := lntypes.GetHostPartIP(nw.IP, nw.Mask) - if hip.IsGlobalUnicast() { - ipamV4Conf.Gateway = nw.IP.String() - } - - if config.bridgeConfig.IP != "" { - ipamV4Conf.PreferredPool = config.bridgeConfig.IP - ip, _, err := net.ParseCIDR(config.bridgeConfig.IP) - if err != nil { - return err - } - ipamV4Conf.Gateway = ip.String() - } else if bridgeName == bridge.DefaultBridgeName && ipamV4Conf.PreferredPool != "" { - logrus.Infof("Default bridge (%s) is assigned with an IP address %s. Daemon option --bip can be used to set a preferred IP address", bridgeName, ipamV4Conf.PreferredPool) - } - - if config.bridgeConfig.FixedCIDR != "" { - _, fCIDR, err := net.ParseCIDR(config.bridgeConfig.FixedCIDR) - if err != nil { - return err - } - - ipamV4Conf.SubPool = fCIDR.String() - } - - if config.bridgeConfig.DefaultGatewayIPv4 != nil { - ipamV4Conf.AuxAddresses["DefaultGatewayIPv4"] = config.bridgeConfig.DefaultGatewayIPv4.String() - } - - var deferIPv6Alloc bool - if config.bridgeConfig.FixedCIDRv6 != "" { - _, fCIDRv6, err := net.ParseCIDR(config.bridgeConfig.FixedCIDRv6) - if err != nil { - return err - } - - // In case user has specified the daemon flag --fixed-cidr-v6 and the passed network has - // at least 48 host bits, we need to guarantee the current behavior where the containers' - // IPv6 addresses will be constructed based on the containers' interface MAC address. - // We do so by telling libnetwork to defer the IPv6 address allocation for the endpoints - // on this network until after the driver has created the endpoint and returned the - // constructed address. Libnetwork will then reserve this address with the ipam driver. - ones, _ := fCIDRv6.Mask.Size() - deferIPv6Alloc = ones <= 80 - - if ipamV6Conf == nil { - ipamV6Conf = &libnetwork.IpamConf{AuxAddresses: make(map[string]string)} - } - ipamV6Conf.PreferredPool = fCIDRv6.String() - - // In case the --fixed-cidr-v6 is specified and the current docker0 bridge IPv6 - // address belongs to the same network, we need to inform libnetwork about it, so - // that it can be reserved with IPAM and it will not be given away to somebody else - for _, nw6 := range nw6List { - if fCIDRv6.Contains(nw6.IP) { - ipamV6Conf.Gateway = nw6.IP.String() - break - } - } - } - - if config.bridgeConfig.DefaultGatewayIPv6 != nil { - if ipamV6Conf == nil { - ipamV6Conf = &libnetwork.IpamConf{AuxAddresses: make(map[string]string)} - } - ipamV6Conf.AuxAddresses["DefaultGatewayIPv6"] = config.bridgeConfig.DefaultGatewayIPv6.String() - } - - v4Conf := []*libnetwork.IpamConf{ipamV4Conf} - v6Conf := []*libnetwork.IpamConf{} - if ipamV6Conf != nil { - v6Conf = append(v6Conf, ipamV6Conf) - } - // Initialize default network on "bridge" with the same name - _, err = controller.NewNetwork("bridge", "bridge", "", - libnetwork.NetworkOptionEnableIPv6(config.bridgeConfig.EnableIPv6), - libnetwork.NetworkOptionDriverOpts(netOption), - libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil), - libnetwork.NetworkOptionDeferIPv6Alloc(deferIPv6Alloc)) - if err != nil { - return fmt.Errorf("Error creating default \"bridge\" network: %v", err) - } - return nil -} - -// Remove default bridge interface if present (--bridge=none use case) -func removeDefaultBridgeInterface() { - if lnk, err := netlink.LinkByName(bridge.DefaultBridgeName); err == nil { - if err := netlink.LinkDel(lnk); err != nil { - logrus.Warnf("Failed to remove bridge interface (%s): %v", bridge.DefaultBridgeName, err) - } - } -} - -func (daemon *Daemon) getLayerInit() func(string) error { - return daemon.setupInitLayer -} - -// Parse the remapped root (user namespace) option, which can be one of: -// username - valid username from /etc/passwd -// username:groupname - valid username; valid groupname from /etc/group -// uid - 32-bit unsigned int valid Linux UID value -// uid:gid - uid value; 32-bit unsigned int Linux GID value -// -// If no groupname is specified, and a username is specified, an attempt -// will be made to lookup a gid for that username as a groupname -// -// If names are used, they are verified to exist in passwd/group -func parseRemappedRoot(usergrp string) (string, string, error) { - - var ( - userID, groupID int - username, groupname string - ) - - idparts := strings.Split(usergrp, ":") - if len(idparts) > 2 { - return "", "", fmt.Errorf("Invalid user/group specification in --userns-remap: %q", usergrp) - } - - if uid, err := strconv.ParseInt(idparts[0], 10, 32); err == nil { - // must be a uid; take it as valid - userID = int(uid) - luser, err := idtools.LookupUID(userID) - if err != nil { - return "", "", fmt.Errorf("Uid %d has no entry in /etc/passwd: %v", userID, err) - } - username = luser.Name - if len(idparts) == 1 { - // if the uid was numeric and no gid was specified, take the uid as the gid - groupID = userID - lgrp, err := idtools.LookupGID(groupID) - if err != nil { - return "", "", fmt.Errorf("Gid %d has no entry in /etc/group: %v", groupID, err) - } - groupname = lgrp.Name - } - } else { - lookupName := idparts[0] - // special case: if the user specified "default", they want Docker to create or - // use (after creation) the "dockremap" user/group for root remapping - if lookupName == defaultIDSpecifier { - lookupName = defaultRemappedID - } - luser, err := idtools.LookupUser(lookupName) - if err != nil && idparts[0] != defaultIDSpecifier { - // error if the name requested isn't the special "dockremap" ID - return "", "", fmt.Errorf("Error during uid lookup for %q: %v", lookupName, err) - } else if err != nil { - // special case-- if the username == "default", then we have been asked - // to create a new entry pair in /etc/{passwd,group} for which the /etc/sub{uid,gid} - // ranges will be used for the user and group mappings in user namespaced containers - _, _, err := idtools.AddNamespaceRangesUser(defaultRemappedID) - if err == nil { - return defaultRemappedID, defaultRemappedID, nil - } - return "", "", fmt.Errorf("Error during %q user creation: %v", defaultRemappedID, err) - } - username = luser.Name - if len(idparts) == 1 { - // we only have a string username, and no group specified; look up gid from username as group - group, err := idtools.LookupGroup(lookupName) - if err != nil { - return "", "", fmt.Errorf("Error during gid lookup for %q: %v", lookupName, err) - } - groupID = group.Gid - groupname = group.Name - } - } - - if len(idparts) == 2 { - // groupname or gid is separately specified and must be resolved - // to an unsigned 32-bit gid - if gid, err := strconv.ParseInt(idparts[1], 10, 32); err == nil { - // must be a gid, take it as valid - groupID = int(gid) - lgrp, err := idtools.LookupGID(groupID) - if err != nil { - return "", "", fmt.Errorf("Gid %d has no entry in /etc/passwd: %v", groupID, err) - } - groupname = lgrp.Name - } else { - // not a number; attempt a lookup - if _, err := idtools.LookupGroup(idparts[1]); err != nil { - return "", "", fmt.Errorf("Error during groupname lookup for %q: %v", idparts[1], err) - } - groupname = idparts[1] - } - } - return username, groupname, nil -} - -func setupRemappedRoot(config *Config) ([]idtools.IDMap, []idtools.IDMap, error) { - if runtime.GOOS != "linux" && config.RemappedRoot != "" { - return nil, nil, fmt.Errorf("User namespaces are only supported on Linux") - } - - // if the daemon was started with remapped root option, parse - // the config option to the int uid,gid values - var ( - uidMaps, gidMaps []idtools.IDMap - ) - if config.RemappedRoot != "" { - username, groupname, err := parseRemappedRoot(config.RemappedRoot) - if err != nil { - return nil, nil, err - } - if username == "root" { - // Cannot setup user namespaces with a 1-to-1 mapping; "--root=0:0" is a no-op - // effectively - logrus.Warn("User namespaces: root cannot be remapped with itself; user namespaces are OFF") - return uidMaps, gidMaps, nil - } - logrus.Infof("User namespaces: ID ranges will be mapped to subuid/subgid ranges of: %s:%s", username, groupname) - // update remapped root setting now that we have resolved them to actual names - config.RemappedRoot = fmt.Sprintf("%s:%s", username, groupname) - - uidMaps, gidMaps, err = idtools.CreateIDMappings(username, groupname) - if err != nil { - return nil, nil, fmt.Errorf("Can't create ID mappings: %v", err) - } - } - return uidMaps, gidMaps, nil -} - -func setupDaemonRoot(config *Config, rootDir string, rootUID, rootGID int) error { - config.Root = rootDir - // the docker root metadata directory needs to have execute permissions for all users (g+x,o+x) - // so that syscalls executing as non-root, operating on subdirectories of the graph root - // (e.g. mounted layers of a container) can traverse this path. - // The user namespace support will create subdirectories for the remapped root host uid:gid - // pair owned by that same uid:gid pair for proper write access to those needed metadata and - // layer content subtrees. - if _, err := os.Stat(rootDir); err == nil { - // root current exists; verify the access bits are correct by setting them - if err = os.Chmod(rootDir, 0711); err != nil { - return err - } - } else if os.IsNotExist(err) { - // no root exists yet, create it 0711 with root:root ownership - if err := os.MkdirAll(rootDir, 0711); err != nil { - return err - } - } - - // if user namespaces are enabled we will create a subtree underneath the specified root - // with any/all specified remapped root uid/gid options on the daemon creating - // a new subdirectory with ownership set to the remapped uid/gid (so as to allow - // `chdir()` to work for containers namespaced to that uid/gid) - if config.RemappedRoot != "" { - config.Root = filepath.Join(rootDir, fmt.Sprintf("%d.%d", rootUID, rootGID)) - logrus.Debugf("Creating user namespaced daemon root: %s", config.Root) - // Create the root directory if it doesn't exist - if err := idtools.MkdirAllAs(config.Root, 0700, rootUID, rootGID); err != nil { - return fmt.Errorf("Cannot create daemon root: %s: %v", config.Root, err) - } - // we also need to verify that any pre-existing directories in the path to - // the graphroot won't block access to remapped root--if any pre-existing directory - // has strict permissions that don't allow "x", container start will fail, so - // better to warn and fail now - dirPath := config.Root - for { - dirPath = filepath.Dir(dirPath) - if dirPath == "/" { - break - } - if !idtools.CanAccess(dirPath, rootUID, rootGID) { - return fmt.Errorf("A subdirectory in your graphroot path (%s) restricts access to the remapped root uid/gid; please fix by allowing 'o+x' permissions on existing directories.", config.Root) - } - } - } - return nil -} - -// registerLinks writes the links to a file. -func (daemon *Daemon) registerLinks(container *container.Container, hostConfig *containertypes.HostConfig) error { - if hostConfig == nil || hostConfig.NetworkMode.IsUserDefined() { - return nil - } - - for _, l := range hostConfig.Links { - name, alias, err := runconfigopts.ParseLink(l) - if err != nil { - return err - } - child, err := daemon.GetContainer(name) - if err != nil { - return fmt.Errorf("Could not get container for %s", name) - } - for child.HostConfig.NetworkMode.IsContainer() { - parts := strings.SplitN(string(child.HostConfig.NetworkMode), ":", 2) - child, err = daemon.GetContainer(parts[1]) - if err != nil { - return fmt.Errorf("Could not get container for %s", parts[1]) - } - } - if child.HostConfig.NetworkMode.IsHost() { - return runconfig.ErrConflictHostNetworkAndLinks - } - if err := daemon.registerLink(container, child, alias); err != nil { - return err - } - } - - // After we load all the links into the daemon - // set them to nil on the hostconfig - return container.WriteHostConfig() -} - -// conditionalMountOnStart is a platform specific helper function during the -// container start to call mount. -func (daemon *Daemon) conditionalMountOnStart(container *container.Container) error { - return daemon.Mount(container) -} - -// conditionalUnmountOnCleanup is a platform specific helper function called -// during the cleanup of a container to unmount. -func (daemon *Daemon) conditionalUnmountOnCleanup(container *container.Container) error { - return daemon.Unmount(container) -} - -func (daemon *Daemon) stats(c *container.Container) (*types.StatsJSON, error) { - if !c.IsRunning() { - return nil, errNotRunning{c.ID} - } - stats, err := daemon.containerd.Stats(c.ID) - if err != nil { - return nil, err - } - s := &types.StatsJSON{} - cgs := stats.CgroupStats - if cgs != nil { - s.BlkioStats = types.BlkioStats{ - IoServiceBytesRecursive: copyBlkioEntry(cgs.BlkioStats.IoServiceBytesRecursive), - IoServicedRecursive: copyBlkioEntry(cgs.BlkioStats.IoServicedRecursive), - IoQueuedRecursive: copyBlkioEntry(cgs.BlkioStats.IoQueuedRecursive), - IoServiceTimeRecursive: copyBlkioEntry(cgs.BlkioStats.IoServiceTimeRecursive), - IoWaitTimeRecursive: copyBlkioEntry(cgs.BlkioStats.IoWaitTimeRecursive), - IoMergedRecursive: copyBlkioEntry(cgs.BlkioStats.IoMergedRecursive), - IoTimeRecursive: copyBlkioEntry(cgs.BlkioStats.IoTimeRecursive), - SectorsRecursive: copyBlkioEntry(cgs.BlkioStats.SectorsRecursive), - } - cpu := cgs.CpuStats - s.CPUStats = types.CPUStats{ - CPUUsage: types.CPUUsage{ - TotalUsage: cpu.CpuUsage.TotalUsage, - PercpuUsage: cpu.CpuUsage.PercpuUsage, - UsageInKernelmode: cpu.CpuUsage.UsageInKernelmode, - UsageInUsermode: cpu.CpuUsage.UsageInUsermode, - }, - ThrottlingData: types.ThrottlingData{ - Periods: cpu.ThrottlingData.Periods, - ThrottledPeriods: cpu.ThrottlingData.ThrottledPeriods, - ThrottledTime: cpu.ThrottlingData.ThrottledTime, - }, - } - mem := cgs.MemoryStats.Usage - s.MemoryStats = types.MemoryStats{ - Usage: mem.Usage, - MaxUsage: mem.MaxUsage, - Stats: cgs.MemoryStats.Stats, - Failcnt: mem.Failcnt, - Limit: mem.Limit, - } - // if the container does not set memory limit, use the machineMemory - if mem.Limit > daemon.statsCollector.machineMemory && daemon.statsCollector.machineMemory > 0 { - s.MemoryStats.Limit = daemon.statsCollector.machineMemory - } - if cgs.PidsStats != nil { - s.PidsStats = types.PidsStats{ - Current: cgs.PidsStats.Current, - } - } - } - s.Read, err = ptypes.Timestamp(stats.Timestamp) - if err != nil { - return nil, err - } - return s, nil -} - -// setDefaultIsolation determines the default isolation mode for the -// daemon to run in. This is only applicable on Windows -func (daemon *Daemon) setDefaultIsolation() error { - return nil -} - -func rootFSToAPIType(rootfs *image.RootFS) types.RootFS { - var layers []string - for _, l := range rootfs.DiffIDs { - layers = append(layers, l.String()) - } - return types.RootFS{ - Type: rootfs.Type, - Layers: layers, - } -} - -// setupDaemonProcess sets various settings for the daemon's process -func setupDaemonProcess(config *Config) error { - // setup the daemons oom_score_adj - return setupOOMScoreAdj(config.OOMScoreAdjust) -} - -func setupOOMScoreAdj(score int) error { - f, err := os.OpenFile("/proc/self/oom_score_adj", os.O_WRONLY, 0) - if err != nil { - return err - } - - stringScore := strconv.Itoa(score) - _, err = f.WriteString(stringScore) - if os.IsPermission(err) { - // Setting oom_score_adj does not work in an - // unprivileged container. Ignore the error, but log - // it if we appear not to be in that situation. - if !rsystem.RunningInUserNS() { - logrus.Debugf("Permission denied writing %q to /proc/self/oom_score_adj", stringScore) - } - return nil - } - f.Close() - return err -} - -func (daemon *Daemon) initCgroupsPath(path string) error { - if path == "/" || path == "." { - return nil - } - - if daemon.configStore.CPURealtimePeriod == 0 && daemon.configStore.CPURealtimeRuntime == 0 { - return nil - } - - // Recursively create cgroup to ensure that the system and all parent cgroups have values set - // for the period and runtime as this limits what the children can be set to. - daemon.initCgroupsPath(filepath.Dir(path)) - - _, root, err := cgroups.FindCgroupMountpointAndRoot("cpu") - if err != nil { - return err - } - - path = filepath.Join(root, path) - sysinfo := sysinfo.New(true) - if sysinfo.CPURealtimePeriod && daemon.configStore.CPURealtimePeriod != 0 { - if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) { - return err - } - if err := ioutil.WriteFile(filepath.Join(path, "cpu.rt_period_us"), []byte(strconv.FormatInt(daemon.configStore.CPURealtimePeriod, 10)), 0700); err != nil { - return err - } - } - if sysinfo.CPURealtimeRuntime && daemon.configStore.CPURealtimeRuntime != 0 { - if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) { - return err - } - if err := ioutil.WriteFile(filepath.Join(path, "cpu.rt_runtime_us"), []byte(strconv.FormatInt(daemon.configStore.CPURealtimeRuntime, 10)), 0700); err != nil { - return err - } - } - return nil -} - -func (daemon *Daemon) setupSeccompProfile() error { - if daemon.configStore.SeccompProfile != "" { - daemon.seccompProfilePath = daemon.configStore.SeccompProfile - b, err := ioutil.ReadFile(daemon.configStore.SeccompProfile) - if err != nil { - return fmt.Errorf("opening seccomp profile (%s) failed: %v", daemon.configStore.SeccompProfile, err) - } - daemon.seccompProfile = b - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/daemon_unix_test.go b/vendor/github.com/docker/docker/daemon/daemon_unix_test.go deleted file mode 100644 index 6250d359e..000000000 --- a/vendor/github.com/docker/docker/daemon/daemon_unix_test.go +++ /dev/null @@ -1,283 +0,0 @@ -// +build !windows,!solaris - -package daemon - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" - - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/volume" - "github.com/docker/docker/volume/drivers" - "github.com/docker/docker/volume/local" - "github.com/docker/docker/volume/store" -) - -// Unix test as uses settings which are not available on Windows -func TestAdjustCPUShares(t *testing.T) { - tmp, err := ioutil.TempDir("", "docker-daemon-unix-test-") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - daemon := &Daemon{ - repository: tmp, - root: tmp, - } - - hostConfig := &containertypes.HostConfig{ - Resources: containertypes.Resources{CPUShares: linuxMinCPUShares - 1}, - } - daemon.adaptContainerSettings(hostConfig, true) - if hostConfig.CPUShares != linuxMinCPUShares { - t.Errorf("Expected CPUShares to be %d", linuxMinCPUShares) - } - - hostConfig.CPUShares = linuxMaxCPUShares + 1 - daemon.adaptContainerSettings(hostConfig, true) - if hostConfig.CPUShares != linuxMaxCPUShares { - t.Errorf("Expected CPUShares to be %d", linuxMaxCPUShares) - } - - hostConfig.CPUShares = 0 - daemon.adaptContainerSettings(hostConfig, true) - if hostConfig.CPUShares != 0 { - t.Error("Expected CPUShares to be unchanged") - } - - hostConfig.CPUShares = 1024 - daemon.adaptContainerSettings(hostConfig, true) - if hostConfig.CPUShares != 1024 { - t.Error("Expected CPUShares to be unchanged") - } -} - -// Unix test as uses settings which are not available on Windows -func TestAdjustCPUSharesNoAdjustment(t *testing.T) { - tmp, err := ioutil.TempDir("", "docker-daemon-unix-test-") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - daemon := &Daemon{ - repository: tmp, - root: tmp, - } - - hostConfig := &containertypes.HostConfig{ - Resources: containertypes.Resources{CPUShares: linuxMinCPUShares - 1}, - } - daemon.adaptContainerSettings(hostConfig, false) - if hostConfig.CPUShares != linuxMinCPUShares-1 { - t.Errorf("Expected CPUShares to be %d", linuxMinCPUShares-1) - } - - hostConfig.CPUShares = linuxMaxCPUShares + 1 - daemon.adaptContainerSettings(hostConfig, false) - if hostConfig.CPUShares != linuxMaxCPUShares+1 { - t.Errorf("Expected CPUShares to be %d", linuxMaxCPUShares+1) - } - - hostConfig.CPUShares = 0 - daemon.adaptContainerSettings(hostConfig, false) - if hostConfig.CPUShares != 0 { - t.Error("Expected CPUShares to be unchanged") - } - - hostConfig.CPUShares = 1024 - daemon.adaptContainerSettings(hostConfig, false) - if hostConfig.CPUShares != 1024 { - t.Error("Expected CPUShares to be unchanged") - } -} - -// Unix test as uses settings which are not available on Windows -func TestParseSecurityOptWithDeprecatedColon(t *testing.T) { - container := &container.Container{} - config := &containertypes.HostConfig{} - - // test apparmor - config.SecurityOpt = []string{"apparmor=test_profile"} - if err := parseSecurityOpt(container, config); err != nil { - t.Fatalf("Unexpected parseSecurityOpt error: %v", err) - } - if container.AppArmorProfile != "test_profile" { - t.Fatalf("Unexpected AppArmorProfile, expected: \"test_profile\", got %q", container.AppArmorProfile) - } - - // test seccomp - sp := "/path/to/seccomp_test.json" - config.SecurityOpt = []string{"seccomp=" + sp} - if err := parseSecurityOpt(container, config); err != nil { - t.Fatalf("Unexpected parseSecurityOpt error: %v", err) - } - if container.SeccompProfile != sp { - t.Fatalf("Unexpected AppArmorProfile, expected: %q, got %q", sp, container.SeccompProfile) - } - - // test valid label - config.SecurityOpt = []string{"label=user:USER"} - if err := parseSecurityOpt(container, config); err != nil { - t.Fatalf("Unexpected parseSecurityOpt error: %v", err) - } - - // test invalid label - config.SecurityOpt = []string{"label"} - if err := parseSecurityOpt(container, config); err == nil { - t.Fatal("Expected parseSecurityOpt error, got nil") - } - - // test invalid opt - config.SecurityOpt = []string{"test"} - if err := parseSecurityOpt(container, config); err == nil { - t.Fatal("Expected parseSecurityOpt error, got nil") - } -} - -func TestParseSecurityOpt(t *testing.T) { - container := &container.Container{} - config := &containertypes.HostConfig{} - - // test apparmor - config.SecurityOpt = []string{"apparmor=test_profile"} - if err := parseSecurityOpt(container, config); err != nil { - t.Fatalf("Unexpected parseSecurityOpt error: %v", err) - } - if container.AppArmorProfile != "test_profile" { - t.Fatalf("Unexpected AppArmorProfile, expected: \"test_profile\", got %q", container.AppArmorProfile) - } - - // test seccomp - sp := "/path/to/seccomp_test.json" - config.SecurityOpt = []string{"seccomp=" + sp} - if err := parseSecurityOpt(container, config); err != nil { - t.Fatalf("Unexpected parseSecurityOpt error: %v", err) - } - if container.SeccompProfile != sp { - t.Fatalf("Unexpected SeccompProfile, expected: %q, got %q", sp, container.SeccompProfile) - } - - // test valid label - config.SecurityOpt = []string{"label=user:USER"} - if err := parseSecurityOpt(container, config); err != nil { - t.Fatalf("Unexpected parseSecurityOpt error: %v", err) - } - - // test invalid label - config.SecurityOpt = []string{"label"} - if err := parseSecurityOpt(container, config); err == nil { - t.Fatal("Expected parseSecurityOpt error, got nil") - } - - // test invalid opt - config.SecurityOpt = []string{"test"} - if err := parseSecurityOpt(container, config); err == nil { - t.Fatal("Expected parseSecurityOpt error, got nil") - } -} - -func TestNetworkOptions(t *testing.T) { - daemon := &Daemon{} - dconfigCorrect := &Config{ - CommonConfig: CommonConfig{ - ClusterStore: "consul://localhost:8500", - ClusterAdvertise: "192.168.0.1:8000", - }, - } - - if _, err := daemon.networkOptions(dconfigCorrect, nil, nil); err != nil { - t.Fatalf("Expect networkOptions success, got error: %v", err) - } - - dconfigWrong := &Config{ - CommonConfig: CommonConfig{ - ClusterStore: "consul://localhost:8500://test://bbb", - }, - } - - if _, err := daemon.networkOptions(dconfigWrong, nil, nil); err == nil { - t.Fatalf("Expected networkOptions error, got nil") - } -} - -func TestMigratePre17Volumes(t *testing.T) { - rootDir, err := ioutil.TempDir("", "test-daemon-volumes") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(rootDir) - - volumeRoot := filepath.Join(rootDir, "volumes") - err = os.MkdirAll(volumeRoot, 0755) - if err != nil { - t.Fatal(err) - } - - containerRoot := filepath.Join(rootDir, "containers") - cid := "1234" - err = os.MkdirAll(filepath.Join(containerRoot, cid), 0755) - - vid := "5678" - vfsPath := filepath.Join(rootDir, "vfs", "dir", vid) - err = os.MkdirAll(vfsPath, 0755) - if err != nil { - t.Fatal(err) - } - - config := []byte(` - { - "ID": "` + cid + `", - "Volumes": { - "/foo": "` + vfsPath + `", - "/bar": "/foo", - "/quux": "/quux" - }, - "VolumesRW": { - "/foo": true, - "/bar": true, - "/quux": false - } - } - `) - - volStore, err := store.New(volumeRoot) - if err != nil { - t.Fatal(err) - } - drv, err := local.New(volumeRoot, 0, 0) - if err != nil { - t.Fatal(err) - } - volumedrivers.Register(drv, volume.DefaultDriverName) - - daemon := &Daemon{root: rootDir, repository: containerRoot, volumes: volStore} - err = ioutil.WriteFile(filepath.Join(containerRoot, cid, "config.v2.json"), config, 600) - if err != nil { - t.Fatal(err) - } - c, err := daemon.load(cid) - if err != nil { - t.Fatal(err) - } - if err := daemon.verifyVolumesInfo(c); err != nil { - t.Fatal(err) - } - - expected := map[string]volume.MountPoint{ - "/foo": {Destination: "/foo", RW: true, Name: vid}, - "/bar": {Source: "/foo", Destination: "/bar", RW: true}, - "/quux": {Source: "/quux", Destination: "/quux", RW: false}, - } - for id, mp := range c.MountPoints { - x, exists := expected[id] - if !exists { - t.Fatal("volume not migrated") - } - if mp.Source != x.Source || mp.Destination != x.Destination || mp.RW != x.RW || mp.Name != x.Name { - t.Fatalf("got unexpected mountpoint, expected: %+v, got: %+v", x, mp) - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/daemon_unsupported.go b/vendor/github.com/docker/docker/daemon/daemon_unsupported.go deleted file mode 100644 index cb1acf63d..000000000 --- a/vendor/github.com/docker/docker/daemon/daemon_unsupported.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build !linux,!freebsd,!windows,!solaris - -package daemon - -const platformSupported = false diff --git a/vendor/github.com/docker/docker/daemon/daemon_windows.go b/vendor/github.com/docker/docker/daemon/daemon_windows.go deleted file mode 100644 index 51ad68b35..000000000 --- a/vendor/github.com/docker/docker/daemon/daemon_windows.go +++ /dev/null @@ -1,604 +0,0 @@ -package daemon - -import ( - "fmt" - "os" - "strings" - - "github.com/Microsoft/hcsshim" - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/image" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/parsers" - "github.com/docker/docker/pkg/platform" - "github.com/docker/docker/pkg/sysinfo" - "github.com/docker/docker/pkg/system" - "github.com/docker/docker/runconfig" - "github.com/docker/libnetwork" - nwconfig "github.com/docker/libnetwork/config" - "github.com/docker/libnetwork/datastore" - winlibnetwork "github.com/docker/libnetwork/drivers/windows" - "github.com/docker/libnetwork/netlabel" - "github.com/docker/libnetwork/options" - blkiodev "github.com/opencontainers/runc/libcontainer/configs" - "golang.org/x/sys/windows" -) - -const ( - defaultNetworkSpace = "172.16.0.0/12" - platformSupported = true - windowsMinCPUShares = 1 - windowsMaxCPUShares = 10000 - windowsMinCPUPercent = 1 - windowsMaxCPUPercent = 100 - windowsMinCPUCount = 1 -) - -func getBlkioWeightDevices(config *containertypes.HostConfig) ([]blkiodev.WeightDevice, error) { - return nil, nil -} - -func parseSecurityOpt(container *container.Container, config *containertypes.HostConfig) error { - return nil -} - -func getBlkioReadIOpsDevices(config *containertypes.HostConfig) ([]blkiodev.ThrottleDevice, error) { - return nil, nil -} - -func getBlkioWriteIOpsDevices(config *containertypes.HostConfig) ([]blkiodev.ThrottleDevice, error) { - return nil, nil -} - -func getBlkioReadBpsDevices(config *containertypes.HostConfig) ([]blkiodev.ThrottleDevice, error) { - return nil, nil -} - -func getBlkioWriteBpsDevices(config *containertypes.HostConfig) ([]blkiodev.ThrottleDevice, error) { - return nil, nil -} - -func (daemon *Daemon) getLayerInit() func(string) error { - return nil -} - -func checkKernel() error { - return nil -} - -func (daemon *Daemon) getCgroupDriver() string { - return "" -} - -// adaptContainerSettings is called during container creation to modify any -// settings necessary in the HostConfig structure. -func (daemon *Daemon) adaptContainerSettings(hostConfig *containertypes.HostConfig, adjustCPUShares bool) error { - if hostConfig == nil { - return nil - } - - return nil -} - -func verifyContainerResources(resources *containertypes.Resources, isHyperv bool) ([]string, error) { - warnings := []string{} - - if !isHyperv { - // The processor resource controls are mutually exclusive on - // Windows Server Containers, the order of precedence is - // CPUCount first, then CPUShares, and CPUPercent last. - if resources.CPUCount > 0 { - if resources.CPUShares > 0 { - warnings = append(warnings, "Conflicting options: CPU count takes priority over CPU shares on Windows Server Containers. CPU shares discarded") - logrus.Warn("Conflicting options: CPU count takes priority over CPU shares on Windows Server Containers. CPU shares discarded") - resources.CPUShares = 0 - } - if resources.CPUPercent > 0 { - warnings = append(warnings, "Conflicting options: CPU count takes priority over CPU percent on Windows Server Containers. CPU percent discarded") - logrus.Warn("Conflicting options: CPU count takes priority over CPU percent on Windows Server Containers. CPU percent discarded") - resources.CPUPercent = 0 - } - } else if resources.CPUShares > 0 { - if resources.CPUPercent > 0 { - warnings = append(warnings, "Conflicting options: CPU shares takes priority over CPU percent on Windows Server Containers. CPU percent discarded") - logrus.Warn("Conflicting options: CPU shares takes priority over CPU percent on Windows Server Containers. CPU percent discarded") - resources.CPUPercent = 0 - } - } - } - - if resources.CPUShares < 0 || resources.CPUShares > windowsMaxCPUShares { - return warnings, fmt.Errorf("range of CPUShares is from %d to %d", windowsMinCPUShares, windowsMaxCPUShares) - } - if resources.CPUPercent < 0 || resources.CPUPercent > windowsMaxCPUPercent { - return warnings, fmt.Errorf("range of CPUPercent is from %d to %d", windowsMinCPUPercent, windowsMaxCPUPercent) - } - if resources.CPUCount < 0 { - return warnings, fmt.Errorf("invalid CPUCount: CPUCount cannot be negative") - } - - if resources.NanoCPUs > 0 && resources.CPUPercent > 0 { - return warnings, fmt.Errorf("conflicting options: Nano CPUs and CPU Percent cannot both be set") - } - if resources.NanoCPUs > 0 && resources.CPUShares > 0 { - return warnings, fmt.Errorf("conflicting options: Nano CPUs and CPU Shares cannot both be set") - } - // The precision we could get is 0.01, because on Windows we have to convert to CPUPercent. - // We don't set the lower limit here and it is up to the underlying platform (e.g., Windows) to return an error. - if resources.NanoCPUs < 0 || resources.NanoCPUs > int64(sysinfo.NumCPU())*1e9 { - return warnings, fmt.Errorf("range of CPUs is from 0.01 to %d.00, as there are only %d CPUs available", sysinfo.NumCPU(), sysinfo.NumCPU()) - } - - if len(resources.BlkioDeviceReadBps) > 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support BlkioDeviceReadBps") - } - if len(resources.BlkioDeviceReadIOps) > 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support BlkioDeviceReadIOps") - } - if len(resources.BlkioDeviceWriteBps) > 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support BlkioDeviceWriteBps") - } - if len(resources.BlkioDeviceWriteIOps) > 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support BlkioDeviceWriteIOps") - } - if resources.BlkioWeight > 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support BlkioWeight") - } - if len(resources.BlkioWeightDevice) > 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support BlkioWeightDevice") - } - if resources.CgroupParent != "" { - return warnings, fmt.Errorf("invalid option: Windows does not support CgroupParent") - } - if resources.CPUPeriod != 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support CPUPeriod") - } - if resources.CpusetCpus != "" { - return warnings, fmt.Errorf("invalid option: Windows does not support CpusetCpus") - } - if resources.CpusetMems != "" { - return warnings, fmt.Errorf("invalid option: Windows does not support CpusetMems") - } - if resources.KernelMemory != 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support KernelMemory") - } - if resources.MemoryReservation != 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support MemoryReservation") - } - if resources.MemorySwap != 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support MemorySwap") - } - if resources.MemorySwappiness != nil && *resources.MemorySwappiness != -1 { - return warnings, fmt.Errorf("invalid option: Windows does not support MemorySwappiness") - } - if resources.OomKillDisable != nil && *resources.OomKillDisable { - return warnings, fmt.Errorf("invalid option: Windows does not support OomKillDisable") - } - if resources.PidsLimit != 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support PidsLimit") - } - if len(resources.Ulimits) != 0 { - return warnings, fmt.Errorf("invalid option: Windows does not support Ulimits") - } - return warnings, nil -} - -// verifyPlatformContainerSettings performs platform-specific validation of the -// hostconfig and config structures. -func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *containertypes.HostConfig, config *containertypes.Config, update bool) ([]string, error) { - warnings := []string{} - - hyperv := daemon.runAsHyperVContainer(hostConfig) - if !hyperv && system.IsWindowsClient() { - // @engine maintainers. This block should not be removed. It partially enforces licensing - // restrictions on Windows. Ping @jhowardmsft if there are concerns or PRs to change this. - return warnings, fmt.Errorf("Windows client operating systems only support Hyper-V containers") - } - - w, err := verifyContainerResources(&hostConfig.Resources, hyperv) - warnings = append(warnings, w...) - if err != nil { - return warnings, err - } - return warnings, nil -} - -// platformReload update configuration with platform specific options -func (daemon *Daemon) platformReload(config *Config) map[string]string { - return map[string]string{} -} - -// verifyDaemonSettings performs validation of daemon config struct -func verifyDaemonSettings(config *Config) error { - return nil -} - -// checkSystem validates platform-specific requirements -func checkSystem() error { - // Validate the OS version. Note that docker.exe must be manifested for this - // call to return the correct version. - osv := system.GetOSVersion() - if osv.MajorVersion < 10 { - return fmt.Errorf("This version of Windows does not support the docker daemon") - } - if osv.Build < 14393 { - return fmt.Errorf("The docker daemon requires build 14393 or later of Windows Server 2016 or Windows 10") - } - - vmcompute := windows.NewLazySystemDLL("vmcompute.dll") - if vmcompute.Load() != nil { - return fmt.Errorf("Failed to load vmcompute.dll. Ensure that the Containers role is installed.") - } - return nil -} - -// configureKernelSecuritySupport configures and validate security support for the kernel -func configureKernelSecuritySupport(config *Config, driverName string) error { - return nil -} - -// configureMaxThreads sets the Go runtime max threads threshold -func configureMaxThreads(config *Config) error { - return nil -} - -func (daemon *Daemon) initNetworkController(config *Config, activeSandboxes map[string]interface{}) (libnetwork.NetworkController, error) { - netOptions, err := daemon.networkOptions(config, nil, nil) - if err != nil { - return nil, err - } - controller, err := libnetwork.New(netOptions...) - if err != nil { - return nil, fmt.Errorf("error obtaining controller instance: %v", err) - } - - hnsresponse, err := hcsshim.HNSListNetworkRequest("GET", "", "") - if err != nil { - return nil, err - } - - // Remove networks not present in HNS - for _, v := range controller.Networks() { - options := v.Info().DriverOptions() - hnsid := options[winlibnetwork.HNSID] - found := false - - for _, v := range hnsresponse { - if v.Id == hnsid { - found = true - break - } - } - - if !found { - // global networks should not be deleted by local HNS - if v.Info().Scope() != datastore.GlobalScope { - err = v.Delete() - if err != nil { - logrus.Errorf("Error occurred when removing network %v", err) - } - } - } - } - - _, err = controller.NewNetwork("null", "none", "", libnetwork.NetworkOptionPersist(false)) - if err != nil { - return nil, err - } - - defaultNetworkExists := false - - if network, err := controller.NetworkByName(runconfig.DefaultDaemonNetworkMode().NetworkName()); err == nil { - options := network.Info().DriverOptions() - for _, v := range hnsresponse { - if options[winlibnetwork.HNSID] == v.Id { - defaultNetworkExists = true - break - } - } - } - - // discover and add HNS networks to windows - // network that exist are removed and added again - for _, v := range hnsresponse { - var n libnetwork.Network - s := func(current libnetwork.Network) bool { - options := current.Info().DriverOptions() - if options[winlibnetwork.HNSID] == v.Id { - n = current - return true - } - return false - } - - controller.WalkNetworks(s) - if n != nil { - // global networks should not be deleted by local HNS - if n.Info().Scope() == datastore.GlobalScope { - continue - } - v.Name = n.Name() - // This will not cause network delete from HNS as the network - // is not yet populated in the libnetwork windows driver - n.Delete() - } - - netOption := map[string]string{ - winlibnetwork.NetworkName: v.Name, - winlibnetwork.HNSID: v.Id, - } - - v4Conf := []*libnetwork.IpamConf{} - for _, subnet := range v.Subnets { - ipamV4Conf := libnetwork.IpamConf{} - ipamV4Conf.PreferredPool = subnet.AddressPrefix - ipamV4Conf.Gateway = subnet.GatewayAddress - v4Conf = append(v4Conf, &ipamV4Conf) - } - - name := v.Name - - // If there is no nat network create one from the first NAT network - // encountered - if !defaultNetworkExists && runconfig.DefaultDaemonNetworkMode() == containertypes.NetworkMode(strings.ToLower(v.Type)) { - name = runconfig.DefaultDaemonNetworkMode().NetworkName() - defaultNetworkExists = true - } - - v6Conf := []*libnetwork.IpamConf{} - _, err := controller.NewNetwork(strings.ToLower(v.Type), name, "", - libnetwork.NetworkOptionGeneric(options.Generic{ - netlabel.GenericData: netOption, - }), - libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil), - ) - - if err != nil { - logrus.Errorf("Error occurred when creating network %v", err) - } - } - - if !config.DisableBridge { - // Initialize default driver "bridge" - if err := initBridgeDriver(controller, config); err != nil { - return nil, err - } - } - - return controller, nil -} - -func initBridgeDriver(controller libnetwork.NetworkController, config *Config) error { - if _, err := controller.NetworkByName(runconfig.DefaultDaemonNetworkMode().NetworkName()); err == nil { - return nil - } - - netOption := map[string]string{ - winlibnetwork.NetworkName: runconfig.DefaultDaemonNetworkMode().NetworkName(), - } - - var ipamOption libnetwork.NetworkOption - var subnetPrefix string - - if config.bridgeConfig.FixedCIDR != "" { - subnetPrefix = config.bridgeConfig.FixedCIDR - } else { - // TP5 doesn't support properly detecting subnet - osv := system.GetOSVersion() - if osv.Build < 14360 { - subnetPrefix = defaultNetworkSpace - } - } - - if subnetPrefix != "" { - ipamV4Conf := libnetwork.IpamConf{} - ipamV4Conf.PreferredPool = subnetPrefix - v4Conf := []*libnetwork.IpamConf{&ipamV4Conf} - v6Conf := []*libnetwork.IpamConf{} - ipamOption = libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil) - } - - _, err := controller.NewNetwork(string(runconfig.DefaultDaemonNetworkMode()), runconfig.DefaultDaemonNetworkMode().NetworkName(), "", - libnetwork.NetworkOptionGeneric(options.Generic{ - netlabel.GenericData: netOption, - }), - ipamOption, - ) - - if err != nil { - return fmt.Errorf("Error creating default network: %v", err) - } - - return nil -} - -// registerLinks sets up links between containers and writes the -// configuration out for persistence. As of Windows TP4, links are not supported. -func (daemon *Daemon) registerLinks(container *container.Container, hostConfig *containertypes.HostConfig) error { - return nil -} - -func (daemon *Daemon) cleanupMountsByID(in string) error { - return nil -} - -func (daemon *Daemon) cleanupMounts() error { - return nil -} - -func setupRemappedRoot(config *Config) ([]idtools.IDMap, []idtools.IDMap, error) { - return nil, nil, nil -} - -func setupDaemonRoot(config *Config, rootDir string, rootUID, rootGID int) error { - config.Root = rootDir - // Create the root directory if it doesn't exists - if err := system.MkdirAllWithACL(config.Root, 0); err != nil && !os.IsExist(err) { - return err - } - return nil -} - -// runasHyperVContainer returns true if we are going to run as a Hyper-V container -func (daemon *Daemon) runAsHyperVContainer(hostConfig *containertypes.HostConfig) bool { - if hostConfig.Isolation.IsDefault() { - // Container is set to use the default, so take the default from the daemon configuration - return daemon.defaultIsolation.IsHyperV() - } - - // Container is requesting an isolation mode. Honour it. - return hostConfig.Isolation.IsHyperV() - -} - -// conditionalMountOnStart is a platform specific helper function during the -// container start to call mount. -func (daemon *Daemon) conditionalMountOnStart(container *container.Container) error { - // We do not mount if a Hyper-V container - if !daemon.runAsHyperVContainer(container.HostConfig) { - return daemon.Mount(container) - } - return nil -} - -// conditionalUnmountOnCleanup is a platform specific helper function called -// during the cleanup of a container to unmount. -func (daemon *Daemon) conditionalUnmountOnCleanup(container *container.Container) error { - // We do not unmount if a Hyper-V container - if !daemon.runAsHyperVContainer(container.HostConfig) { - return daemon.Unmount(container) - } - return nil -} - -func driverOptions(config *Config) []nwconfig.Option { - return []nwconfig.Option{} -} - -func (daemon *Daemon) stats(c *container.Container) (*types.StatsJSON, error) { - if !c.IsRunning() { - return nil, errNotRunning{c.ID} - } - - // Obtain the stats from HCS via libcontainerd - stats, err := daemon.containerd.Stats(c.ID) - if err != nil { - return nil, err - } - - // Start with an empty structure - s := &types.StatsJSON{} - - // Populate the CPU/processor statistics - s.CPUStats = types.CPUStats{ - CPUUsage: types.CPUUsage{ - TotalUsage: stats.Processor.TotalRuntime100ns, - UsageInKernelmode: stats.Processor.RuntimeKernel100ns, - UsageInUsermode: stats.Processor.RuntimeKernel100ns, - }, - } - - // Populate the memory statistics - s.MemoryStats = types.MemoryStats{ - Commit: stats.Memory.UsageCommitBytes, - CommitPeak: stats.Memory.UsageCommitPeakBytes, - PrivateWorkingSet: stats.Memory.UsagePrivateWorkingSetBytes, - } - - // Populate the storage statistics - s.StorageStats = types.StorageStats{ - ReadCountNormalized: stats.Storage.ReadCountNormalized, - ReadSizeBytes: stats.Storage.ReadSizeBytes, - WriteCountNormalized: stats.Storage.WriteCountNormalized, - WriteSizeBytes: stats.Storage.WriteSizeBytes, - } - - // Populate the network statistics - s.Networks = make(map[string]types.NetworkStats) - - for _, nstats := range stats.Network { - s.Networks[nstats.EndpointId] = types.NetworkStats{ - RxBytes: nstats.BytesReceived, - RxPackets: nstats.PacketsReceived, - RxDropped: nstats.DroppedPacketsIncoming, - TxBytes: nstats.BytesSent, - TxPackets: nstats.PacketsSent, - TxDropped: nstats.DroppedPacketsOutgoing, - } - } - - // Set the timestamp - s.Stats.Read = stats.Timestamp - s.Stats.NumProcs = platform.NumProcs() - - return s, nil -} - -// setDefaultIsolation determine the default isolation mode for the -// daemon to run in. This is only applicable on Windows -func (daemon *Daemon) setDefaultIsolation() error { - daemon.defaultIsolation = containertypes.Isolation("process") - // On client SKUs, default to Hyper-V - if system.IsWindowsClient() { - daemon.defaultIsolation = containertypes.Isolation("hyperv") - } - for _, option := range daemon.configStore.ExecOptions { - key, val, err := parsers.ParseKeyValueOpt(option) - if err != nil { - return err - } - key = strings.ToLower(key) - switch key { - - case "isolation": - if !containertypes.Isolation(val).IsValid() { - return fmt.Errorf("Invalid exec-opt value for 'isolation':'%s'", val) - } - if containertypes.Isolation(val).IsHyperV() { - daemon.defaultIsolation = containertypes.Isolation("hyperv") - } - if containertypes.Isolation(val).IsProcess() { - if system.IsWindowsClient() { - // @engine maintainers. This block should not be removed. It partially enforces licensing - // restrictions on Windows. Ping @jhowardmsft if there are concerns or PRs to change this. - return fmt.Errorf("Windows client operating systems only support Hyper-V containers") - } - daemon.defaultIsolation = containertypes.Isolation("process") - } - default: - return fmt.Errorf("Unrecognised exec-opt '%s'\n", key) - } - } - - logrus.Infof("Windows default isolation mode: %s", daemon.defaultIsolation) - return nil -} - -func rootFSToAPIType(rootfs *image.RootFS) types.RootFS { - var layers []string - for _, l := range rootfs.DiffIDs { - layers = append(layers, l.String()) - } - return types.RootFS{ - Type: rootfs.Type, - Layers: layers, - } -} - -func setupDaemonProcess(config *Config) error { - return nil -} - -// verifyVolumesInfo is a no-op on windows. -// This is called during daemon initialization to migrate volumes from pre-1.7. -// volumes were not supported on windows pre-1.7 -func (daemon *Daemon) verifyVolumesInfo(container *container.Container) error { - return nil -} - -func (daemon *Daemon) setupSeccompProfile() error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/debugtrap.go b/vendor/github.com/docker/docker/daemon/debugtrap.go deleted file mode 100644 index 209048b58..000000000 --- a/vendor/github.com/docker/docker/daemon/debugtrap.go +++ /dev/null @@ -1,62 +0,0 @@ -package daemon - -import ( - "fmt" - "os" - "path/filepath" - "strings" - "time" - - "github.com/davecgh/go-spew/spew" - "github.com/pkg/errors" -) - -const dataStructuresLogNameTemplate = "daemon-data-%s.log" - -// dumpDaemon appends the daemon datastructures into file in dir and returns full path -// to that file. -func (d *Daemon) dumpDaemon(dir string) (string, error) { - // Ensure we recover from a panic as we are doing this without any locking - defer func() { - recover() - }() - - path := filepath.Join(dir, fmt.Sprintf(dataStructuresLogNameTemplate, strings.Replace(time.Now().Format(time.RFC3339), ":", "", -1))) - f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0666) - if err != nil { - return "", errors.Wrap(err, "failed to open file to write the daemon datastructure dump") - } - defer f.Close() - - dump := struct { - containers interface{} - names interface{} - links interface{} - execs interface{} - volumes interface{} - images interface{} - layers interface{} - imageReferences interface{} - downloads interface{} - uploads interface{} - registry interface{} - plugins interface{} - }{ - containers: d.containers, - execs: d.execCommands, - volumes: d.volumes, - images: d.imageStore, - layers: d.layerStore, - imageReferences: d.referenceStore, - downloads: d.downloadManager, - uploads: d.uploadManager, - registry: d.RegistryService, - plugins: d.PluginStore, - names: d.nameIndex, - links: d.linkIndex, - } - - spew.Fdump(f, dump) // Does not return an error - f.Sync() - return path, nil -} diff --git a/vendor/github.com/docker/docker/daemon/debugtrap_unix.go b/vendor/github.com/docker/docker/daemon/debugtrap_unix.go deleted file mode 100644 index d650eb7f8..000000000 --- a/vendor/github.com/docker/docker/daemon/debugtrap_unix.go +++ /dev/null @@ -1,33 +0,0 @@ -// +build !windows - -package daemon - -import ( - "os" - "os/signal" - "syscall" - - "github.com/Sirupsen/logrus" - stackdump "github.com/docker/docker/pkg/signal" -) - -func (d *Daemon) setupDumpStackTrap(root string) { - c := make(chan os.Signal, 1) - signal.Notify(c, syscall.SIGUSR1) - go func() { - for range c { - path, err := stackdump.DumpStacks(root) - if err != nil { - logrus.WithError(err).Error("failed to write goroutines dump") - } else { - logrus.Infof("goroutine stacks written to %s", path) - } - path, err = d.dumpDaemon(root) - if err != nil { - logrus.WithError(err).Error("failed to write daemon datastructure dump") - } else { - logrus.Infof("daemon datastructure dump written to %s", path) - } - } - }() -} diff --git a/vendor/github.com/docker/docker/daemon/debugtrap_unsupported.go b/vendor/github.com/docker/docker/daemon/debugtrap_unsupported.go deleted file mode 100644 index f5b917090..000000000 --- a/vendor/github.com/docker/docker/daemon/debugtrap_unsupported.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !linux,!darwin,!freebsd,!windows,!solaris - -package daemon - -func (d *Daemon) setupDumpStackTrap(_ string) { - return -} diff --git a/vendor/github.com/docker/docker/daemon/debugtrap_windows.go b/vendor/github.com/docker/docker/daemon/debugtrap_windows.go deleted file mode 100644 index fb20c9d2c..000000000 --- a/vendor/github.com/docker/docker/daemon/debugtrap_windows.go +++ /dev/null @@ -1,52 +0,0 @@ -package daemon - -import ( - "fmt" - "os" - "syscall" - "unsafe" - - winio "github.com/Microsoft/go-winio" - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/signal" - "github.com/docker/docker/pkg/system" -) - -func (d *Daemon) setupDumpStackTrap(root string) { - // Windows does not support signals like *nix systems. So instead of - // trapping on SIGUSR1 to dump stacks, we wait on a Win32 event to be - // signaled. ACL'd to builtin administrators and local system - ev := "Global\\docker-daemon-" + fmt.Sprint(os.Getpid()) - sd, err := winio.SddlToSecurityDescriptor("D:P(A;;GA;;;BA)(A;;GA;;;SY)") - if err != nil { - logrus.Errorf("failed to get security descriptor for debug stackdump event %s: %s", ev, err.Error()) - return - } - var sa syscall.SecurityAttributes - sa.Length = uint32(unsafe.Sizeof(sa)) - sa.InheritHandle = 1 - sa.SecurityDescriptor = uintptr(unsafe.Pointer(&sd[0])) - h, err := system.CreateEvent(&sa, false, false, ev) - if h == 0 || err != nil { - logrus.Errorf("failed to create debug stackdump event %s: %s", ev, err.Error()) - return - } - go func() { - logrus.Debugf("Stackdump - waiting signal at %s", ev) - for { - syscall.WaitForSingleObject(h, syscall.INFINITE) - path, err := signal.DumpStacks(root) - if err != nil { - logrus.WithError(err).Error("failed to write goroutines dump") - } else { - logrus.Infof("goroutine stacks written to %s", path) - } - path, err = d.dumpDaemon(root) - if err != nil { - logrus.WithError(err).Error("failed to write daemon datastructure dump") - } else { - logrus.Infof("daemon datastructure dump written to %s", path) - } - } - }() -} diff --git a/vendor/github.com/docker/docker/daemon/delete.go b/vendor/github.com/docker/docker/daemon/delete.go deleted file mode 100644 index 6b622bde3..000000000 --- a/vendor/github.com/docker/docker/daemon/delete.go +++ /dev/null @@ -1,168 +0,0 @@ -package daemon - -import ( - "fmt" - "os" - "path" - "strings" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/types" - "github.com/docker/docker/container" - "github.com/docker/docker/layer" - volumestore "github.com/docker/docker/volume/store" -) - -// ContainerRm removes the container id from the filesystem. An error -// is returned if the container is not found, or if the remove -// fails. If the remove succeeds, the container name is released, and -// network links are removed. -func (daemon *Daemon) ContainerRm(name string, config *types.ContainerRmConfig) error { - start := time.Now() - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - // Container state RemovalInProgress should be used to avoid races. - if inProgress := container.SetRemovalInProgress(); inProgress { - err := fmt.Errorf("removal of container %s is already in progress", name) - return errors.NewBadRequestError(err) - } - defer container.ResetRemovalInProgress() - - // check if container wasn't deregistered by previous rm since Get - if c := daemon.containers.Get(container.ID); c == nil { - return nil - } - - if config.RemoveLink { - return daemon.rmLink(container, name) - } - - err = daemon.cleanupContainer(container, config.ForceRemove, config.RemoveVolume) - containerActions.WithValues("delete").UpdateSince(start) - - return err -} - -func (daemon *Daemon) rmLink(container *container.Container, name string) error { - if name[0] != '/' { - name = "/" + name - } - parent, n := path.Split(name) - if parent == "/" { - return fmt.Errorf("Conflict, cannot remove the default name of the container") - } - - parent = strings.TrimSuffix(parent, "/") - pe, err := daemon.nameIndex.Get(parent) - if err != nil { - return fmt.Errorf("Cannot get parent %s for name %s", parent, name) - } - - daemon.releaseName(name) - parentContainer, _ := daemon.GetContainer(pe) - if parentContainer != nil { - daemon.linkIndex.unlink(name, container, parentContainer) - if err := daemon.updateNetwork(parentContainer); err != nil { - logrus.Debugf("Could not update network to remove link %s: %v", n, err) - } - } - return nil -} - -// cleanupContainer unregisters a container from the daemon, stops stats -// collection and cleanly removes contents and metadata from the filesystem. -func (daemon *Daemon) cleanupContainer(container *container.Container, forceRemove, removeVolume bool) (err error) { - if container.IsRunning() { - if !forceRemove { - err := fmt.Errorf("You cannot remove a running container %s. Stop the container before attempting removal or use -f", container.ID) - return errors.NewRequestConflictError(err) - } - if err := daemon.Kill(container); err != nil { - return fmt.Errorf("Could not kill running container %s, cannot remove - %v", container.ID, err) - } - } - - // stop collection of stats for the container regardless - // if stats are currently getting collected. - daemon.statsCollector.stopCollection(container) - - if err = daemon.containerStop(container, 3); err != nil { - return err - } - - // Mark container dead. We don't want anybody to be restarting it. - container.SetDead() - - // Save container state to disk. So that if error happens before - // container meta file got removed from disk, then a restart of - // docker should not make a dead container alive. - if err := container.ToDiskLocking(); err != nil && !os.IsNotExist(err) { - logrus.Errorf("Error saving dying container to disk: %v", err) - } - - // If force removal is required, delete container from various - // indexes even if removal failed. - defer func() { - if err == nil || forceRemove { - daemon.nameIndex.Delete(container.ID) - daemon.linkIndex.delete(container) - selinuxFreeLxcContexts(container.ProcessLabel) - daemon.idIndex.Delete(container.ID) - daemon.containers.Delete(container.ID) - if e := daemon.removeMountPoints(container, removeVolume); e != nil { - logrus.Error(e) - } - daemon.LogContainerEvent(container, "destroy") - } - }() - - if err = os.RemoveAll(container.Root); err != nil { - return fmt.Errorf("Unable to remove filesystem for %v: %v", container.ID, err) - } - - // When container creation fails and `RWLayer` has not been created yet, we - // do not call `ReleaseRWLayer` - if container.RWLayer != nil { - metadata, err := daemon.layerStore.ReleaseRWLayer(container.RWLayer) - layer.LogReleaseMetadata(metadata) - if err != nil && err != layer.ErrMountDoesNotExist { - return fmt.Errorf("Driver %s failed to remove root filesystem %s: %s", daemon.GraphDriverName(), container.ID, err) - } - } - - return nil -} - -// VolumeRm removes the volume with the given name. -// If the volume is referenced by a container it is not removed -// This is called directly from the Engine API -func (daemon *Daemon) VolumeRm(name string, force bool) error { - err := daemon.volumeRm(name) - if err == nil || force { - daemon.volumes.Purge(name) - return nil - } - return err -} - -func (daemon *Daemon) volumeRm(name string) error { - v, err := daemon.volumes.Get(name) - if err != nil { - return err - } - - if err := daemon.volumes.Remove(v); err != nil { - if volumestore.IsInUse(err) { - err := fmt.Errorf("Unable to remove volume, volume still in use: %v", err) - return errors.NewRequestConflictError(err) - } - return fmt.Errorf("Error while removing volume %s: %v", name, err) - } - daemon.LogVolumeEvent(v.Name(), "destroy", map[string]string{"driver": v.DriverName()}) - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/delete_test.go b/vendor/github.com/docker/docker/daemon/delete_test.go deleted file mode 100644 index 1fd27e1ff..000000000 --- a/vendor/github.com/docker/docker/daemon/delete_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package daemon - -import ( - "fmt" - "io/ioutil" - "os" - "testing" - - "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" -) - -func TestContainerDoubleDelete(t *testing.T) { - tmp, err := ioutil.TempDir("", "docker-daemon-unix-test-") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - daemon := &Daemon{ - repository: tmp, - root: tmp, - } - daemon.containers = container.NewMemoryStore() - - container := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: "test", - State: container.NewState(), - Config: &containertypes.Config{}, - }, - } - daemon.containers.Add(container.ID, container) - - // Mark the container as having a delete in progress - container.SetRemovalInProgress() - - // Try to remove the container when its state is removalInProgress. - // It should return an error indicating it is under removal progress. - if err := daemon.ContainerRm(container.ID, &types.ContainerRmConfig{ForceRemove: true}); err == nil { - t.Fatalf("expected err: %v, got nil", fmt.Sprintf("removal of container %s is already in progress", container.ID)) - } -} diff --git a/vendor/github.com/docker/docker/daemon/discovery.go b/vendor/github.com/docker/docker/daemon/discovery.go deleted file mode 100644 index ee4ea875b..000000000 --- a/vendor/github.com/docker/docker/daemon/discovery.go +++ /dev/null @@ -1,215 +0,0 @@ -package daemon - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/discovery" - - // Register the libkv backends for discovery. - _ "github.com/docker/docker/pkg/discovery/kv" -) - -const ( - // defaultDiscoveryHeartbeat is the default value for discovery heartbeat interval. - defaultDiscoveryHeartbeat = 20 * time.Second - // defaultDiscoveryTTLFactor is the default TTL factor for discovery - defaultDiscoveryTTLFactor = 3 -) - -var errDiscoveryDisabled = errors.New("discovery is disabled") - -type discoveryReloader interface { - discovery.Watcher - Stop() - Reload(backend, address string, clusterOpts map[string]string) error - ReadyCh() <-chan struct{} -} - -type daemonDiscoveryReloader struct { - backend discovery.Backend - ticker *time.Ticker - term chan bool - readyCh chan struct{} -} - -func (d *daemonDiscoveryReloader) Watch(stopCh <-chan struct{}) (<-chan discovery.Entries, <-chan error) { - return d.backend.Watch(stopCh) -} - -func (d *daemonDiscoveryReloader) ReadyCh() <-chan struct{} { - return d.readyCh -} - -func discoveryOpts(clusterOpts map[string]string) (time.Duration, time.Duration, error) { - var ( - heartbeat = defaultDiscoveryHeartbeat - ttl = defaultDiscoveryTTLFactor * defaultDiscoveryHeartbeat - ) - - if hb, ok := clusterOpts["discovery.heartbeat"]; ok { - h, err := strconv.Atoi(hb) - if err != nil { - return time.Duration(0), time.Duration(0), err - } - - if h <= 0 { - return time.Duration(0), time.Duration(0), - fmt.Errorf("discovery.heartbeat must be positive") - } - - heartbeat = time.Duration(h) * time.Second - ttl = defaultDiscoveryTTLFactor * heartbeat - } - - if tstr, ok := clusterOpts["discovery.ttl"]; ok { - t, err := strconv.Atoi(tstr) - if err != nil { - return time.Duration(0), time.Duration(0), err - } - - if t <= 0 { - return time.Duration(0), time.Duration(0), - fmt.Errorf("discovery.ttl must be positive") - } - - ttl = time.Duration(t) * time.Second - - if _, ok := clusterOpts["discovery.heartbeat"]; !ok { - h := int(t / defaultDiscoveryTTLFactor) - heartbeat = time.Duration(h) * time.Second - } - - if ttl <= heartbeat { - return time.Duration(0), time.Duration(0), - fmt.Errorf("discovery.ttl timer must be greater than discovery.heartbeat") - } - } - - return heartbeat, ttl, nil -} - -// initDiscovery initializes the nodes discovery subsystem by connecting to the specified backend -// and starts a registration loop to advertise the current node under the specified address. -func initDiscovery(backendAddress, advertiseAddress string, clusterOpts map[string]string) (discoveryReloader, error) { - heartbeat, backend, err := parseDiscoveryOptions(backendAddress, clusterOpts) - if err != nil { - return nil, err - } - - reloader := &daemonDiscoveryReloader{ - backend: backend, - ticker: time.NewTicker(heartbeat), - term: make(chan bool), - readyCh: make(chan struct{}), - } - // We call Register() on the discovery backend in a loop for the whole lifetime of the daemon, - // but we never actually Watch() for nodes appearing and disappearing for the moment. - go reloader.advertiseHeartbeat(advertiseAddress) - return reloader, nil -} - -// advertiseHeartbeat registers the current node against the discovery backend using the specified -// address. The function never returns, as registration against the backend comes with a TTL and -// requires regular heartbeats. -func (d *daemonDiscoveryReloader) advertiseHeartbeat(address string) { - var ready bool - if err := d.initHeartbeat(address); err == nil { - ready = true - close(d.readyCh) - } - - for { - select { - case <-d.ticker.C: - if err := d.backend.Register(address); err != nil { - logrus.Warnf("Registering as %q in discovery failed: %v", address, err) - } else { - if !ready { - close(d.readyCh) - ready = true - } - } - case <-d.term: - return - } - } -} - -// initHeartbeat is used to do the first heartbeat. It uses a tight loop until -// either the timeout period is reached or the heartbeat is successful and returns. -func (d *daemonDiscoveryReloader) initHeartbeat(address string) error { - // Setup a short ticker until the first heartbeat has succeeded - t := time.NewTicker(500 * time.Millisecond) - defer t.Stop() - // timeout makes sure that after a period of time we stop being so aggressive trying to reach the discovery service - timeout := time.After(60 * time.Second) - - for { - select { - case <-timeout: - return errors.New("timeout waiting for initial discovery") - case <-d.term: - return errors.New("terminated") - case <-t.C: - if err := d.backend.Register(address); err == nil { - return nil - } - } - } -} - -// Reload makes the watcher to stop advertising and reconfigures it to advertise in a new address. -func (d *daemonDiscoveryReloader) Reload(backendAddress, advertiseAddress string, clusterOpts map[string]string) error { - d.Stop() - - heartbeat, backend, err := parseDiscoveryOptions(backendAddress, clusterOpts) - if err != nil { - return err - } - - d.backend = backend - d.ticker = time.NewTicker(heartbeat) - d.readyCh = make(chan struct{}) - - go d.advertiseHeartbeat(advertiseAddress) - return nil -} - -// Stop terminates the discovery advertising. -func (d *daemonDiscoveryReloader) Stop() { - d.ticker.Stop() - d.term <- true -} - -func parseDiscoveryOptions(backendAddress string, clusterOpts map[string]string) (time.Duration, discovery.Backend, error) { - heartbeat, ttl, err := discoveryOpts(clusterOpts) - if err != nil { - return 0, nil, err - } - - backend, err := discovery.New(backendAddress, heartbeat, ttl, clusterOpts) - if err != nil { - return 0, nil, err - } - return heartbeat, backend, nil -} - -// modifiedDiscoverySettings returns whether the discovery configuration has been modified or not. -func modifiedDiscoverySettings(config *Config, backendType, advertise string, clusterOpts map[string]string) bool { - if config.ClusterStore != backendType || config.ClusterAdvertise != advertise { - return true - } - - if (config.ClusterOpts == nil && clusterOpts == nil) || - (config.ClusterOpts == nil && len(clusterOpts) == 0) || - (len(config.ClusterOpts) == 0 && clusterOpts == nil) { - return false - } - - return !reflect.DeepEqual(config.ClusterOpts, clusterOpts) -} diff --git a/vendor/github.com/docker/docker/daemon/discovery_test.go b/vendor/github.com/docker/docker/daemon/discovery_test.go deleted file mode 100644 index 336973c51..000000000 --- a/vendor/github.com/docker/docker/daemon/discovery_test.go +++ /dev/null @@ -1,164 +0,0 @@ -package daemon - -import ( - "testing" - "time" -) - -func TestDiscoveryOpts(t *testing.T) { - clusterOpts := map[string]string{"discovery.heartbeat": "10", "discovery.ttl": "5"} - heartbeat, ttl, err := discoveryOpts(clusterOpts) - if err == nil { - t.Fatalf("discovery.ttl < discovery.heartbeat must fail") - } - - clusterOpts = map[string]string{"discovery.heartbeat": "10", "discovery.ttl": "10"} - heartbeat, ttl, err = discoveryOpts(clusterOpts) - if err == nil { - t.Fatalf("discovery.ttl == discovery.heartbeat must fail") - } - - clusterOpts = map[string]string{"discovery.heartbeat": "-10", "discovery.ttl": "10"} - heartbeat, ttl, err = discoveryOpts(clusterOpts) - if err == nil { - t.Fatalf("negative discovery.heartbeat must fail") - } - - clusterOpts = map[string]string{"discovery.heartbeat": "10", "discovery.ttl": "-10"} - heartbeat, ttl, err = discoveryOpts(clusterOpts) - if err == nil { - t.Fatalf("negative discovery.ttl must fail") - } - - clusterOpts = map[string]string{"discovery.heartbeat": "invalid"} - heartbeat, ttl, err = discoveryOpts(clusterOpts) - if err == nil { - t.Fatalf("invalid discovery.heartbeat must fail") - } - - clusterOpts = map[string]string{"discovery.ttl": "invalid"} - heartbeat, ttl, err = discoveryOpts(clusterOpts) - if err == nil { - t.Fatalf("invalid discovery.ttl must fail") - } - - clusterOpts = map[string]string{"discovery.heartbeat": "10", "discovery.ttl": "20"} - heartbeat, ttl, err = discoveryOpts(clusterOpts) - if err != nil { - t.Fatal(err) - } - - if heartbeat != 10*time.Second { - t.Fatalf("Heartbeat - Expected : %v, Actual : %v", 10*time.Second, heartbeat) - } - - if ttl != 20*time.Second { - t.Fatalf("TTL - Expected : %v, Actual : %v", 20*time.Second, ttl) - } - - clusterOpts = map[string]string{"discovery.heartbeat": "10"} - heartbeat, ttl, err = discoveryOpts(clusterOpts) - if err != nil { - t.Fatal(err) - } - - if heartbeat != 10*time.Second { - t.Fatalf("Heartbeat - Expected : %v, Actual : %v", 10*time.Second, heartbeat) - } - - expected := 10 * defaultDiscoveryTTLFactor * time.Second - if ttl != expected { - t.Fatalf("TTL - Expected : %v, Actual : %v", expected, ttl) - } - - clusterOpts = map[string]string{"discovery.ttl": "30"} - heartbeat, ttl, err = discoveryOpts(clusterOpts) - if err != nil { - t.Fatal(err) - } - - if ttl != 30*time.Second { - t.Fatalf("TTL - Expected : %v, Actual : %v", 30*time.Second, ttl) - } - - expected = 30 * time.Second / defaultDiscoveryTTLFactor - if heartbeat != expected { - t.Fatalf("Heartbeat - Expected : %v, Actual : %v", expected, heartbeat) - } - - clusterOpts = map[string]string{} - heartbeat, ttl, err = discoveryOpts(clusterOpts) - if err != nil { - t.Fatal(err) - } - - if heartbeat != defaultDiscoveryHeartbeat { - t.Fatalf("Heartbeat - Expected : %v, Actual : %v", defaultDiscoveryHeartbeat, heartbeat) - } - - expected = defaultDiscoveryHeartbeat * defaultDiscoveryTTLFactor - if ttl != expected { - t.Fatalf("TTL - Expected : %v, Actual : %v", expected, ttl) - } -} - -func TestModifiedDiscoverySettings(t *testing.T) { - cases := []struct { - current *Config - modified *Config - expected bool - }{ - { - current: discoveryConfig("foo", "bar", map[string]string{}), - modified: discoveryConfig("foo", "bar", map[string]string{}), - expected: false, - }, - { - current: discoveryConfig("foo", "bar", map[string]string{"foo": "bar"}), - modified: discoveryConfig("foo", "bar", map[string]string{"foo": "bar"}), - expected: false, - }, - { - current: discoveryConfig("foo", "bar", map[string]string{}), - modified: discoveryConfig("foo", "bar", nil), - expected: false, - }, - { - current: discoveryConfig("foo", "bar", nil), - modified: discoveryConfig("foo", "bar", map[string]string{}), - expected: false, - }, - { - current: discoveryConfig("foo", "bar", nil), - modified: discoveryConfig("baz", "bar", nil), - expected: true, - }, - { - current: discoveryConfig("foo", "bar", nil), - modified: discoveryConfig("foo", "baz", nil), - expected: true, - }, - { - current: discoveryConfig("foo", "bar", nil), - modified: discoveryConfig("foo", "bar", map[string]string{"foo": "bar"}), - expected: true, - }, - } - - for _, c := range cases { - got := modifiedDiscoverySettings(c.current, c.modified.ClusterStore, c.modified.ClusterAdvertise, c.modified.ClusterOpts) - if c.expected != got { - t.Fatalf("expected %v, got %v: current config %v, new config %v", c.expected, got, c.current, c.modified) - } - } -} - -func discoveryConfig(backendAddr, advertiseAddr string, opts map[string]string) *Config { - return &Config{ - CommonConfig: CommonConfig{ - ClusterStore: backendAddr, - ClusterAdvertise: advertiseAddr, - ClusterOpts: opts, - }, - } -} diff --git a/vendor/github.com/docker/docker/daemon/disk_usage.go b/vendor/github.com/docker/docker/daemon/disk_usage.go deleted file mode 100644 index c3b918660..000000000 --- a/vendor/github.com/docker/docker/daemon/disk_usage.go +++ /dev/null @@ -1,100 +0,0 @@ -package daemon - -import ( - "fmt" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/directory" - "github.com/docker/docker/volume" -) - -func (daemon *Daemon) getLayerRefs() map[layer.ChainID]int { - tmpImages := daemon.imageStore.Map() - layerRefs := map[layer.ChainID]int{} - for id, img := range tmpImages { - dgst := digest.Digest(id) - if len(daemon.referenceStore.References(dgst)) == 0 && len(daemon.imageStore.Children(id)) != 0 { - continue - } - - rootFS := *img.RootFS - rootFS.DiffIDs = nil - for _, id := range img.RootFS.DiffIDs { - rootFS.Append(id) - chid := rootFS.ChainID() - layerRefs[chid]++ - } - } - - return layerRefs -} - -// SystemDiskUsage returns information about the daemon data disk usage -func (daemon *Daemon) SystemDiskUsage() (*types.DiskUsage, error) { - // Retrieve container list - allContainers, err := daemon.Containers(&types.ContainerListOptions{ - Size: true, - All: true, - }) - if err != nil { - return nil, fmt.Errorf("failed to retrieve container list: %v", err) - } - - // Get all top images with extra attributes - allImages, err := daemon.Images(filters.NewArgs(), false, true) - if err != nil { - return nil, fmt.Errorf("failed to retrieve image list: %v", err) - } - - // Get all local volumes - allVolumes := []*types.Volume{} - getLocalVols := func(v volume.Volume) error { - name := v.Name() - refs := daemon.volumes.Refs(v) - - tv := volumeToAPIType(v) - sz, err := directory.Size(v.Path()) - if err != nil { - logrus.Warnf("failed to determine size of volume %v", name) - sz = -1 - } - tv.UsageData = &types.VolumeUsageData{Size: sz, RefCount: int64(len(refs))} - allVolumes = append(allVolumes, tv) - - return nil - } - - err = daemon.traverseLocalVolumes(getLocalVols) - if err != nil { - return nil, err - } - - // Get total layers size on disk - layerRefs := daemon.getLayerRefs() - allLayers := daemon.layerStore.Map() - var allLayersSize int64 - for _, l := range allLayers { - size, err := l.DiffSize() - if err == nil { - if _, ok := layerRefs[l.ChainID()]; ok { - allLayersSize += size - } else { - logrus.Warnf("found leaked image layer %v", l.ChainID()) - } - } else { - logrus.Warnf("failed to get diff size for layer %v", l.ChainID()) - } - - } - - return &types.DiskUsage{ - LayersSize: allLayersSize, - Containers: allContainers, - Volumes: allVolumes, - Images: allImages, - }, nil -} diff --git a/vendor/github.com/docker/docker/daemon/errors.go b/vendor/github.com/docker/docker/daemon/errors.go deleted file mode 100644 index 566a32f17..000000000 --- a/vendor/github.com/docker/docker/daemon/errors.go +++ /dev/null @@ -1,57 +0,0 @@ -package daemon - -import ( - "fmt" - "strings" - - "github.com/docker/docker/api/errors" - "github.com/docker/docker/reference" -) - -func (d *Daemon) imageNotExistToErrcode(err error) error { - if dne, isDNE := err.(ErrImageDoesNotExist); isDNE { - if strings.Contains(dne.RefOrID, "@") { - e := fmt.Errorf("No such image: %s", dne.RefOrID) - return errors.NewRequestNotFoundError(e) - } - tag := reference.DefaultTag - ref, err := reference.ParseNamed(dne.RefOrID) - if err != nil { - e := fmt.Errorf("No such image: %s:%s", dne.RefOrID, tag) - return errors.NewRequestNotFoundError(e) - } - if tagged, isTagged := ref.(reference.NamedTagged); isTagged { - tag = tagged.Tag() - } - e := fmt.Errorf("No such image: %s:%s", ref.Name(), tag) - return errors.NewRequestNotFoundError(e) - } - return err -} - -type errNotRunning struct { - containerID string -} - -func (e errNotRunning) Error() string { - return fmt.Sprintf("Container %s is not running", e.containerID) -} - -func (e errNotRunning) ContainerIsRunning() bool { - return false -} - -func errContainerIsRestarting(containerID string) error { - err := fmt.Errorf("Container %s is restarting, wait until the container is running", containerID) - return errors.NewRequestConflictError(err) -} - -func errExecNotFound(id string) error { - err := fmt.Errorf("No such exec instance '%s' found in daemon", id) - return errors.NewRequestNotFoundError(err) -} - -func errExecPaused(id string) error { - err := fmt.Errorf("Container %s is paused, unpause the container before exec", id) - return errors.NewRequestConflictError(err) -} diff --git a/vendor/github.com/docker/docker/daemon/events.go b/vendor/github.com/docker/docker/daemon/events.go deleted file mode 100644 index 8fe8e1b64..000000000 --- a/vendor/github.com/docker/docker/daemon/events.go +++ /dev/null @@ -1,132 +0,0 @@ -package daemon - -import ( - "strings" - "time" - - "github.com/docker/docker/api/types/events" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/container" - daemonevents "github.com/docker/docker/daemon/events" - "github.com/docker/libnetwork" -) - -// LogContainerEvent generates an event related to a container with only the default attributes. -func (daemon *Daemon) LogContainerEvent(container *container.Container, action string) { - daemon.LogContainerEventWithAttributes(container, action, map[string]string{}) -} - -// LogContainerEventWithAttributes generates an event related to a container with specific given attributes. -func (daemon *Daemon) LogContainerEventWithAttributes(container *container.Container, action string, attributes map[string]string) { - copyAttributes(attributes, container.Config.Labels) - if container.Config.Image != "" { - attributes["image"] = container.Config.Image - } - attributes["name"] = strings.TrimLeft(container.Name, "/") - - actor := events.Actor{ - ID: container.ID, - Attributes: attributes, - } - daemon.EventsService.Log(action, events.ContainerEventType, actor) -} - -// LogImageEvent generates an event related to an image with only the default attributes. -func (daemon *Daemon) LogImageEvent(imageID, refName, action string) { - daemon.LogImageEventWithAttributes(imageID, refName, action, map[string]string{}) -} - -// LogImageEventWithAttributes generates an event related to an image with specific given attributes. -func (daemon *Daemon) LogImageEventWithAttributes(imageID, refName, action string, attributes map[string]string) { - img, err := daemon.GetImage(imageID) - if err == nil && img.Config != nil { - // image has not been removed yet. - // it could be missing if the event is `delete`. - copyAttributes(attributes, img.Config.Labels) - } - if refName != "" { - attributes["name"] = refName - } - actor := events.Actor{ - ID: imageID, - Attributes: attributes, - } - - daemon.EventsService.Log(action, events.ImageEventType, actor) -} - -// LogPluginEvent generates an event related to a plugin with only the default attributes. -func (daemon *Daemon) LogPluginEvent(pluginID, refName, action string) { - daemon.LogPluginEventWithAttributes(pluginID, refName, action, map[string]string{}) -} - -// LogPluginEventWithAttributes generates an event related to a plugin with specific given attributes. -func (daemon *Daemon) LogPluginEventWithAttributes(pluginID, refName, action string, attributes map[string]string) { - attributes["name"] = refName - actor := events.Actor{ - ID: pluginID, - Attributes: attributes, - } - daemon.EventsService.Log(action, events.PluginEventType, actor) -} - -// LogVolumeEvent generates an event related to a volume. -func (daemon *Daemon) LogVolumeEvent(volumeID, action string, attributes map[string]string) { - actor := events.Actor{ - ID: volumeID, - Attributes: attributes, - } - daemon.EventsService.Log(action, events.VolumeEventType, actor) -} - -// LogNetworkEvent generates an event related to a network with only the default attributes. -func (daemon *Daemon) LogNetworkEvent(nw libnetwork.Network, action string) { - daemon.LogNetworkEventWithAttributes(nw, action, map[string]string{}) -} - -// LogNetworkEventWithAttributes generates an event related to a network with specific given attributes. -func (daemon *Daemon) LogNetworkEventWithAttributes(nw libnetwork.Network, action string, attributes map[string]string) { - attributes["name"] = nw.Name() - attributes["type"] = nw.Type() - actor := events.Actor{ - ID: nw.ID(), - Attributes: attributes, - } - daemon.EventsService.Log(action, events.NetworkEventType, actor) -} - -// LogDaemonEventWithAttributes generates an event related to the daemon itself with specific given attributes. -func (daemon *Daemon) LogDaemonEventWithAttributes(action string, attributes map[string]string) { - if daemon.EventsService != nil { - if info, err := daemon.SystemInfo(); err == nil && info.Name != "" { - attributes["name"] = info.Name - } - actor := events.Actor{ - ID: daemon.ID, - Attributes: attributes, - } - daemon.EventsService.Log(action, events.DaemonEventType, actor) - } -} - -// SubscribeToEvents returns the currently record of events, a channel to stream new events from, and a function to cancel the stream of events. -func (daemon *Daemon) SubscribeToEvents(since, until time.Time, filter filters.Args) ([]events.Message, chan interface{}) { - ef := daemonevents.NewFilter(filter) - return daemon.EventsService.SubscribeTopic(since, until, ef) -} - -// UnsubscribeFromEvents stops the event subscription for a client by closing the -// channel where the daemon sends events to. -func (daemon *Daemon) UnsubscribeFromEvents(listener chan interface{}) { - daemon.EventsService.Evict(listener) -} - -// copyAttributes guarantees that labels are not mutated by event triggers. -func copyAttributes(attributes, labels map[string]string) { - if labels == nil { - return - } - for k, v := range labels { - attributes[k] = v - } -} diff --git a/vendor/github.com/docker/docker/daemon/events/events.go b/vendor/github.com/docker/docker/daemon/events/events.go deleted file mode 100644 index 0bf105f54..000000000 --- a/vendor/github.com/docker/docker/daemon/events/events.go +++ /dev/null @@ -1,158 +0,0 @@ -package events - -import ( - "sync" - "time" - - eventtypes "github.com/docker/docker/api/types/events" - "github.com/docker/docker/pkg/pubsub" -) - -const ( - eventsLimit = 64 - bufferSize = 1024 -) - -// Events is pubsub channel for events generated by the engine. -type Events struct { - mu sync.Mutex - events []eventtypes.Message - pub *pubsub.Publisher -} - -// New returns new *Events instance -func New() *Events { - return &Events{ - events: make([]eventtypes.Message, 0, eventsLimit), - pub: pubsub.NewPublisher(100*time.Millisecond, bufferSize), - } -} - -// Subscribe adds new listener to events, returns slice of 64 stored -// last events, a channel in which you can expect new events (in form -// of interface{}, so you need type assertion), and a function to call -// to stop the stream of events. -func (e *Events) Subscribe() ([]eventtypes.Message, chan interface{}, func()) { - eventSubscribers.Inc() - e.mu.Lock() - current := make([]eventtypes.Message, len(e.events)) - copy(current, e.events) - l := e.pub.Subscribe() - e.mu.Unlock() - - cancel := func() { - e.Evict(l) - } - return current, l, cancel -} - -// SubscribeTopic adds new listener to events, returns slice of 64 stored -// last events, a channel in which you can expect new events (in form -// of interface{}, so you need type assertion). -func (e *Events) SubscribeTopic(since, until time.Time, ef *Filter) ([]eventtypes.Message, chan interface{}) { - eventSubscribers.Inc() - e.mu.Lock() - - var topic func(m interface{}) bool - if ef != nil && ef.filter.Len() > 0 { - topic = func(m interface{}) bool { return ef.Include(m.(eventtypes.Message)) } - } - - buffered := e.loadBufferedEvents(since, until, topic) - - var ch chan interface{} - if topic != nil { - ch = e.pub.SubscribeTopic(topic) - } else { - // Subscribe to all events if there are no filters - ch = e.pub.Subscribe() - } - - e.mu.Unlock() - return buffered, ch -} - -// Evict evicts listener from pubsub -func (e *Events) Evict(l chan interface{}) { - eventSubscribers.Dec() - e.pub.Evict(l) -} - -// Log broadcasts event to listeners. Each listener has 100 millisecond for -// receiving event or it will be skipped. -func (e *Events) Log(action, eventType string, actor eventtypes.Actor) { - eventsCounter.Inc() - now := time.Now().UTC() - jm := eventtypes.Message{ - Action: action, - Type: eventType, - Actor: actor, - Time: now.Unix(), - TimeNano: now.UnixNano(), - } - - // fill deprecated fields for container and images - switch eventType { - case eventtypes.ContainerEventType: - jm.ID = actor.ID - jm.Status = action - jm.From = actor.Attributes["image"] - case eventtypes.ImageEventType: - jm.ID = actor.ID - jm.Status = action - } - - e.mu.Lock() - if len(e.events) == cap(e.events) { - // discard oldest event - copy(e.events, e.events[1:]) - e.events[len(e.events)-1] = jm - } else { - e.events = append(e.events, jm) - } - e.mu.Unlock() - e.pub.Publish(jm) -} - -// SubscribersCount returns number of event listeners -func (e *Events) SubscribersCount() int { - return e.pub.Len() -} - -// loadBufferedEvents iterates over the cached events in the buffer -// and returns those that were emitted between two specific dates. -// It uses `time.Unix(seconds, nanoseconds)` to generate valid dates with those arguments. -// It filters those buffered messages with a topic function if it's not nil, otherwise it adds all messages. -func (e *Events) loadBufferedEvents(since, until time.Time, topic func(interface{}) bool) []eventtypes.Message { - var buffered []eventtypes.Message - if since.IsZero() && until.IsZero() { - return buffered - } - - var sinceNanoUnix int64 - if !since.IsZero() { - sinceNanoUnix = since.UnixNano() - } - - var untilNanoUnix int64 - if !until.IsZero() { - untilNanoUnix = until.UnixNano() - } - - for i := len(e.events) - 1; i >= 0; i-- { - ev := e.events[i] - - if ev.TimeNano < sinceNanoUnix { - break - } - - if untilNanoUnix > 0 && ev.TimeNano > untilNanoUnix { - continue - } - - if topic == nil || topic(ev) { - buffered = append([]eventtypes.Message{ev}, buffered...) - } - } - return buffered -} diff --git a/vendor/github.com/docker/docker/daemon/events/events_test.go b/vendor/github.com/docker/docker/daemon/events/events_test.go deleted file mode 100644 index bbd160f90..000000000 --- a/vendor/github.com/docker/docker/daemon/events/events_test.go +++ /dev/null @@ -1,275 +0,0 @@ -package events - -import ( - "fmt" - "testing" - "time" - - "github.com/docker/docker/api/types/events" - timetypes "github.com/docker/docker/api/types/time" - eventstestutils "github.com/docker/docker/daemon/events/testutils" -) - -func TestEventsLog(t *testing.T) { - e := New() - _, l1, _ := e.Subscribe() - _, l2, _ := e.Subscribe() - defer e.Evict(l1) - defer e.Evict(l2) - count := e.SubscribersCount() - if count != 2 { - t.Fatalf("Must be 2 subscribers, got %d", count) - } - actor := events.Actor{ - ID: "cont", - Attributes: map[string]string{"image": "image"}, - } - e.Log("test", events.ContainerEventType, actor) - select { - case msg := <-l1: - jmsg, ok := msg.(events.Message) - if !ok { - t.Fatalf("Unexpected type %T", msg) - } - if len(e.events) != 1 { - t.Fatalf("Must be only one event, got %d", len(e.events)) - } - if jmsg.Status != "test" { - t.Fatalf("Status should be test, got %s", jmsg.Status) - } - if jmsg.ID != "cont" { - t.Fatalf("ID should be cont, got %s", jmsg.ID) - } - if jmsg.From != "image" { - t.Fatalf("From should be image, got %s", jmsg.From) - } - case <-time.After(1 * time.Second): - t.Fatal("Timeout waiting for broadcasted message") - } - select { - case msg := <-l2: - jmsg, ok := msg.(events.Message) - if !ok { - t.Fatalf("Unexpected type %T", msg) - } - if len(e.events) != 1 { - t.Fatalf("Must be only one event, got %d", len(e.events)) - } - if jmsg.Status != "test" { - t.Fatalf("Status should be test, got %s", jmsg.Status) - } - if jmsg.ID != "cont" { - t.Fatalf("ID should be cont, got %s", jmsg.ID) - } - if jmsg.From != "image" { - t.Fatalf("From should be image, got %s", jmsg.From) - } - case <-time.After(1 * time.Second): - t.Fatal("Timeout waiting for broadcasted message") - } -} - -func TestEventsLogTimeout(t *testing.T) { - e := New() - _, l, _ := e.Subscribe() - defer e.Evict(l) - - c := make(chan struct{}) - go func() { - actor := events.Actor{ - ID: "image", - } - e.Log("test", events.ImageEventType, actor) - close(c) - }() - - select { - case <-c: - case <-time.After(time.Second): - t.Fatal("Timeout publishing message") - } -} - -func TestLogEvents(t *testing.T) { - e := New() - - for i := 0; i < eventsLimit+16; i++ { - action := fmt.Sprintf("action_%d", i) - id := fmt.Sprintf("cont_%d", i) - from := fmt.Sprintf("image_%d", i) - - actor := events.Actor{ - ID: id, - Attributes: map[string]string{"image": from}, - } - e.Log(action, events.ContainerEventType, actor) - } - time.Sleep(50 * time.Millisecond) - current, l, _ := e.Subscribe() - for i := 0; i < 10; i++ { - num := i + eventsLimit + 16 - action := fmt.Sprintf("action_%d", num) - id := fmt.Sprintf("cont_%d", num) - from := fmt.Sprintf("image_%d", num) - - actor := events.Actor{ - ID: id, - Attributes: map[string]string{"image": from}, - } - e.Log(action, events.ContainerEventType, actor) - } - if len(e.events) != eventsLimit { - t.Fatalf("Must be %d events, got %d", eventsLimit, len(e.events)) - } - - var msgs []events.Message - for len(msgs) < 10 { - m := <-l - jm, ok := (m).(events.Message) - if !ok { - t.Fatalf("Unexpected type %T", m) - } - msgs = append(msgs, jm) - } - if len(current) != eventsLimit { - t.Fatalf("Must be %d events, got %d", eventsLimit, len(current)) - } - first := current[0] - if first.Status != "action_16" { - t.Fatalf("First action is %s, must be action_16", first.Status) - } - last := current[len(current)-1] - if last.Status != "action_79" { - t.Fatalf("Last action is %s, must be action_79", last.Status) - } - - firstC := msgs[0] - if firstC.Status != "action_80" { - t.Fatalf("First action is %s, must be action_80", firstC.Status) - } - lastC := msgs[len(msgs)-1] - if lastC.Status != "action_89" { - t.Fatalf("Last action is %s, must be action_89", lastC.Status) - } -} - -// https://github.com/docker/docker/issues/20999 -// Fixtures: -// -//2016-03-07T17:28:03.022433271+02:00 container die 0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079 (image=ubuntu, name=small_hoover) -//2016-03-07T17:28:03.091719377+02:00 network disconnect 19c5ed41acb798f26b751e0035cd7821741ab79e2bbd59a66b5fd8abf954eaa0 (type=bridge, container=0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079, name=bridge) -//2016-03-07T17:28:03.129014751+02:00 container destroy 0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079 (image=ubuntu, name=small_hoover) -func TestLoadBufferedEvents(t *testing.T) { - now := time.Now() - f, err := timetypes.GetTimestamp("2016-03-07T17:28:03.100000000+02:00", now) - if err != nil { - t.Fatal(err) - } - s, sNano, err := timetypes.ParseTimestamps(f, -1) - if err != nil { - t.Fatal(err) - } - - m1, err := eventstestutils.Scan("2016-03-07T17:28:03.022433271+02:00 container die 0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079 (image=ubuntu, name=small_hoover)") - if err != nil { - t.Fatal(err) - } - m2, err := eventstestutils.Scan("2016-03-07T17:28:03.091719377+02:00 network disconnect 19c5ed41acb798f26b751e0035cd7821741ab79e2bbd59a66b5fd8abf954eaa0 (type=bridge, container=0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079, name=bridge)") - if err != nil { - t.Fatal(err) - } - m3, err := eventstestutils.Scan("2016-03-07T17:28:03.129014751+02:00 container destroy 0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079 (image=ubuntu, name=small_hoover)") - if err != nil { - t.Fatal(err) - } - - events := &Events{ - events: []events.Message{*m1, *m2, *m3}, - } - - since := time.Unix(s, sNano) - until := time.Time{} - - out := events.loadBufferedEvents(since, until, nil) - if len(out) != 1 { - t.Fatalf("expected 1 message, got %d: %v", len(out), out) - } -} - -func TestLoadBufferedEventsOnlyFromPast(t *testing.T) { - now := time.Now() - f, err := timetypes.GetTimestamp("2016-03-07T17:28:03.090000000+02:00", now) - if err != nil { - t.Fatal(err) - } - s, sNano, err := timetypes.ParseTimestamps(f, 0) - if err != nil { - t.Fatal(err) - } - - f, err = timetypes.GetTimestamp("2016-03-07T17:28:03.100000000+02:00", now) - if err != nil { - t.Fatal(err) - } - u, uNano, err := timetypes.ParseTimestamps(f, 0) - if err != nil { - t.Fatal(err) - } - - m1, err := eventstestutils.Scan("2016-03-07T17:28:03.022433271+02:00 container die 0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079 (image=ubuntu, name=small_hoover)") - if err != nil { - t.Fatal(err) - } - m2, err := eventstestutils.Scan("2016-03-07T17:28:03.091719377+02:00 network disconnect 19c5ed41acb798f26b751e0035cd7821741ab79e2bbd59a66b5fd8abf954eaa0 (type=bridge, container=0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079, name=bridge)") - if err != nil { - t.Fatal(err) - } - m3, err := eventstestutils.Scan("2016-03-07T17:28:03.129014751+02:00 container destroy 0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079 (image=ubuntu, name=small_hoover)") - if err != nil { - t.Fatal(err) - } - - events := &Events{ - events: []events.Message{*m1, *m2, *m3}, - } - - since := time.Unix(s, sNano) - until := time.Unix(u, uNano) - - out := events.loadBufferedEvents(since, until, nil) - if len(out) != 1 { - t.Fatalf("expected 1 message, got %d: %v", len(out), out) - } - - if out[0].Type != "network" { - t.Fatalf("expected network event, got %s", out[0].Type) - } -} - -// #13753 -func TestIngoreBufferedWhenNoTimes(t *testing.T) { - m1, err := eventstestutils.Scan("2016-03-07T17:28:03.022433271+02:00 container die 0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079 (image=ubuntu, name=small_hoover)") - if err != nil { - t.Fatal(err) - } - m2, err := eventstestutils.Scan("2016-03-07T17:28:03.091719377+02:00 network disconnect 19c5ed41acb798f26b751e0035cd7821741ab79e2bbd59a66b5fd8abf954eaa0 (type=bridge, container=0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079, name=bridge)") - if err != nil { - t.Fatal(err) - } - m3, err := eventstestutils.Scan("2016-03-07T17:28:03.129014751+02:00 container destroy 0b863f2a26c18557fc6cdadda007c459f9ec81b874780808138aea78a3595079 (image=ubuntu, name=small_hoover)") - if err != nil { - t.Fatal(err) - } - - events := &Events{ - events: []events.Message{*m1, *m2, *m3}, - } - - since := time.Time{} - until := time.Time{} - - out := events.loadBufferedEvents(since, until, nil) - if len(out) != 0 { - t.Fatalf("expected 0 buffered events, got %q", out) - } -} diff --git a/vendor/github.com/docker/docker/daemon/events/filter.go b/vendor/github.com/docker/docker/daemon/events/filter.go deleted file mode 100644 index 5c9c52769..000000000 --- a/vendor/github.com/docker/docker/daemon/events/filter.go +++ /dev/null @@ -1,110 +0,0 @@ -package events - -import ( - "github.com/docker/docker/api/types/events" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/reference" -) - -// Filter can filter out docker events from a stream -type Filter struct { - filter filters.Args -} - -// NewFilter creates a new Filter -func NewFilter(filter filters.Args) *Filter { - return &Filter{filter: filter} -} - -// Include returns true when the event ev is included by the filters -func (ef *Filter) Include(ev events.Message) bool { - return ef.matchEvent(ev) && - ef.filter.ExactMatch("type", ev.Type) && - ef.matchDaemon(ev) && - ef.matchContainer(ev) && - ef.matchPlugin(ev) && - ef.matchVolume(ev) && - ef.matchNetwork(ev) && - ef.matchImage(ev) && - ef.matchLabels(ev.Actor.Attributes) -} - -func (ef *Filter) matchEvent(ev events.Message) bool { - // #25798 if an event filter contains either health_status, exec_create or exec_start without a colon - // Let's to a FuzzyMatch instead of an ExactMatch. - if ef.filterContains("event", map[string]struct{}{"health_status": {}, "exec_create": {}, "exec_start": {}}) { - return ef.filter.FuzzyMatch("event", ev.Action) - } - return ef.filter.ExactMatch("event", ev.Action) -} - -func (ef *Filter) filterContains(field string, values map[string]struct{}) bool { - for _, v := range ef.filter.Get(field) { - if _, ok := values[v]; ok { - return true - } - } - return false -} - -func (ef *Filter) matchLabels(attributes map[string]string) bool { - if !ef.filter.Include("label") { - return true - } - return ef.filter.MatchKVList("label", attributes) -} - -func (ef *Filter) matchDaemon(ev events.Message) bool { - return ef.fuzzyMatchName(ev, events.DaemonEventType) -} - -func (ef *Filter) matchContainer(ev events.Message) bool { - return ef.fuzzyMatchName(ev, events.ContainerEventType) -} - -func (ef *Filter) matchPlugin(ev events.Message) bool { - return ef.fuzzyMatchName(ev, events.PluginEventType) -} - -func (ef *Filter) matchVolume(ev events.Message) bool { - return ef.fuzzyMatchName(ev, events.VolumeEventType) -} - -func (ef *Filter) matchNetwork(ev events.Message) bool { - return ef.fuzzyMatchName(ev, events.NetworkEventType) -} - -func (ef *Filter) fuzzyMatchName(ev events.Message, eventType string) bool { - return ef.filter.FuzzyMatch(eventType, ev.Actor.ID) || - ef.filter.FuzzyMatch(eventType, ev.Actor.Attributes["name"]) -} - -// matchImage matches against both event.Actor.ID (for image events) -// and event.Actor.Attributes["image"] (for container events), so that any container that was created -// from an image will be included in the image events. Also compare both -// against the stripped repo name without any tags. -func (ef *Filter) matchImage(ev events.Message) bool { - id := ev.Actor.ID - nameAttr := "image" - var imageName string - - if ev.Type == events.ImageEventType { - nameAttr = "name" - } - - if n, ok := ev.Actor.Attributes[nameAttr]; ok { - imageName = n - } - return ef.filter.ExactMatch("image", id) || - ef.filter.ExactMatch("image", imageName) || - ef.filter.ExactMatch("image", stripTag(id)) || - ef.filter.ExactMatch("image", stripTag(imageName)) -} - -func stripTag(image string) string { - ref, err := reference.ParseNamed(image) - if err != nil { - return image - } - return ref.Name() -} diff --git a/vendor/github.com/docker/docker/daemon/events/metrics.go b/vendor/github.com/docker/docker/daemon/events/metrics.go deleted file mode 100644 index c9a89ec0e..000000000 --- a/vendor/github.com/docker/docker/daemon/events/metrics.go +++ /dev/null @@ -1,15 +0,0 @@ -package events - -import "github.com/docker/go-metrics" - -var ( - eventsCounter metrics.Counter - eventSubscribers metrics.Gauge -) - -func init() { - ns := metrics.NewNamespace("engine", "daemon", nil) - eventsCounter = ns.NewCounter("events", "The number of events logged") - eventSubscribers = ns.NewGauge("events_subscribers", "The number of current subscribers to events", metrics.Total) - metrics.Register(ns) -} diff --git a/vendor/github.com/docker/docker/daemon/events/testutils/testutils.go b/vendor/github.com/docker/docker/daemon/events/testutils/testutils.go deleted file mode 100644 index 3544446e1..000000000 --- a/vendor/github.com/docker/docker/daemon/events/testutils/testutils.go +++ /dev/null @@ -1,76 +0,0 @@ -package testutils - -import ( - "fmt" - "regexp" - "strings" - "time" - - "github.com/docker/docker/api/types/events" - timetypes "github.com/docker/docker/api/types/time" -) - -var ( - reTimestamp = `(?P\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{9}(:?(:?(:?-|\+)\d{2}:\d{2})|Z))` - reEventType = `(?P\w+)` - reAction = `(?P\w+)` - reID = `(?P[^\s]+)` - reAttributes = `(\s\((?P[^\)]+)\))?` - reString = fmt.Sprintf(`\A%s\s%s\s%s\s%s%s\z`, reTimestamp, reEventType, reAction, reID, reAttributes) - - // eventCliRegexp is a regular expression that matches all possible event outputs in the cli - eventCliRegexp = regexp.MustCompile(reString) -) - -// ScanMap turns an event string like the default ones formatted in the cli output -// and turns it into map. -func ScanMap(text string) map[string]string { - matches := eventCliRegexp.FindAllStringSubmatch(text, -1) - md := map[string]string{} - if len(matches) == 0 { - return md - } - - names := eventCliRegexp.SubexpNames() - for i, n := range matches[0] { - md[names[i]] = n - } - return md -} - -// Scan turns an event string like the default ones formatted in the cli output -// and turns it into an event message. -func Scan(text string) (*events.Message, error) { - md := ScanMap(text) - if len(md) == 0 { - return nil, fmt.Errorf("text is not an event: %s", text) - } - - f, err := timetypes.GetTimestamp(md["timestamp"], time.Now()) - if err != nil { - return nil, err - } - - t, tn, err := timetypes.ParseTimestamps(f, -1) - if err != nil { - return nil, err - } - - attrs := make(map[string]string) - for _, a := range strings.SplitN(md["attributes"], ", ", -1) { - kv := strings.SplitN(a, "=", 2) - attrs[kv[0]] = kv[1] - } - - tu := time.Unix(t, tn) - return &events.Message{ - Time: t, - TimeNano: tu.UnixNano(), - Type: md["eventType"], - Action: md["action"], - Actor: events.Actor{ - ID: md["id"], - Attributes: attrs, - }, - }, nil -} diff --git a/vendor/github.com/docker/docker/daemon/events_test.go b/vendor/github.com/docker/docker/daemon/events_test.go deleted file mode 100644 index 2dbcc27df..000000000 --- a/vendor/github.com/docker/docker/daemon/events_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package daemon - -import ( - "testing" - "time" - - containertypes "github.com/docker/docker/api/types/container" - eventtypes "github.com/docker/docker/api/types/events" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/events" -) - -func TestLogContainerEventCopyLabels(t *testing.T) { - e := events.New() - _, l, _ := e.Subscribe() - defer e.Evict(l) - - container := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: "container_id", - Name: "container_name", - Config: &containertypes.Config{ - Image: "image_name", - Labels: map[string]string{ - "node": "1", - "os": "alpine", - }, - }, - }, - } - daemon := &Daemon{ - EventsService: e, - } - daemon.LogContainerEvent(container, "create") - - if _, mutated := container.Config.Labels["image"]; mutated { - t.Fatalf("Expected to not mutate the container labels, got %q", container.Config.Labels) - } - - validateTestAttributes(t, l, map[string]string{ - "node": "1", - "os": "alpine", - }) -} - -func TestLogContainerEventWithAttributes(t *testing.T) { - e := events.New() - _, l, _ := e.Subscribe() - defer e.Evict(l) - - container := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: "container_id", - Name: "container_name", - Config: &containertypes.Config{ - Labels: map[string]string{ - "node": "1", - "os": "alpine", - }, - }, - }, - } - daemon := &Daemon{ - EventsService: e, - } - attributes := map[string]string{ - "node": "2", - "foo": "bar", - } - daemon.LogContainerEventWithAttributes(container, "create", attributes) - - validateTestAttributes(t, l, map[string]string{ - "node": "1", - "foo": "bar", - }) -} - -func validateTestAttributes(t *testing.T, l chan interface{}, expectedAttributesToTest map[string]string) { - select { - case ev := <-l: - event, ok := ev.(eventtypes.Message) - if !ok { - t.Fatalf("Unexpected event message: %q", ev) - } - for key, expected := range expectedAttributesToTest { - actual, ok := event.Actor.Attributes[key] - if !ok || actual != expected { - t.Fatalf("Expected value for key %s to be %s, but was %s (event:%v)", key, expected, actual, event) - } - } - case <-time.After(10 * time.Second): - t.Fatalf("LogEvent test timed out") - } -} diff --git a/vendor/github.com/docker/docker/daemon/exec.go b/vendor/github.com/docker/docker/daemon/exec.go deleted file mode 100644 index 8197426a3..000000000 --- a/vendor/github.com/docker/docker/daemon/exec.go +++ /dev/null @@ -1,280 +0,0 @@ -package daemon - -import ( - "fmt" - "io" - "strings" - "time" - - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/strslice" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/exec" - "github.com/docker/docker/libcontainerd" - "github.com/docker/docker/pkg/pools" - "github.com/docker/docker/pkg/signal" - "github.com/docker/docker/pkg/term" - "github.com/docker/docker/utils" -) - -// Seconds to wait after sending TERM before trying KILL -const termProcessTimeout = 10 - -func (d *Daemon) registerExecCommand(container *container.Container, config *exec.Config) { - // Storing execs in container in order to kill them gracefully whenever the container is stopped or removed. - container.ExecCommands.Add(config.ID, config) - // Storing execs in daemon for easy access via Engine API. - d.execCommands.Add(config.ID, config) -} - -// ExecExists looks up the exec instance and returns a bool if it exists or not. -// It will also return the error produced by `getConfig` -func (d *Daemon) ExecExists(name string) (bool, error) { - if _, err := d.getExecConfig(name); err != nil { - return false, err - } - return true, nil -} - -// getExecConfig looks up the exec instance by name. If the container associated -// with the exec instance is stopped or paused, it will return an error. -func (d *Daemon) getExecConfig(name string) (*exec.Config, error) { - ec := d.execCommands.Get(name) - - // If the exec is found but its container is not in the daemon's list of - // containers then it must have been deleted, in which case instead of - // saying the container isn't running, we should return a 404 so that - // the user sees the same error now that they will after the - // 5 minute clean-up loop is run which erases old/dead execs. - - if ec != nil { - if container := d.containers.Get(ec.ContainerID); container != nil { - if !container.IsRunning() { - return nil, fmt.Errorf("Container %s is not running: %s", container.ID, container.State.String()) - } - if container.IsPaused() { - return nil, errExecPaused(container.ID) - } - if container.IsRestarting() { - return nil, errContainerIsRestarting(container.ID) - } - return ec, nil - } - } - - return nil, errExecNotFound(name) -} - -func (d *Daemon) unregisterExecCommand(container *container.Container, execConfig *exec.Config) { - container.ExecCommands.Delete(execConfig.ID) - d.execCommands.Delete(execConfig.ID) -} - -func (d *Daemon) getActiveContainer(name string) (*container.Container, error) { - container, err := d.GetContainer(name) - if err != nil { - return nil, err - } - - if !container.IsRunning() { - return nil, errNotRunning{container.ID} - } - if container.IsPaused() { - return nil, errExecPaused(name) - } - if container.IsRestarting() { - return nil, errContainerIsRestarting(container.ID) - } - return container, nil -} - -// ContainerExecCreate sets up an exec in a running container. -func (d *Daemon) ContainerExecCreate(name string, config *types.ExecConfig) (string, error) { - container, err := d.getActiveContainer(name) - if err != nil { - return "", err - } - - cmd := strslice.StrSlice(config.Cmd) - entrypoint, args := d.getEntrypointAndArgs(strslice.StrSlice{}, cmd) - - keys := []byte{} - if config.DetachKeys != "" { - keys, err = term.ToBytes(config.DetachKeys) - if err != nil { - err = fmt.Errorf("Invalid escape keys (%s) provided", config.DetachKeys) - return "", err - } - } - - execConfig := exec.NewConfig() - execConfig.OpenStdin = config.AttachStdin - execConfig.OpenStdout = config.AttachStdout - execConfig.OpenStderr = config.AttachStderr - execConfig.ContainerID = container.ID - execConfig.DetachKeys = keys - execConfig.Entrypoint = entrypoint - execConfig.Args = args - execConfig.Tty = config.Tty - execConfig.Privileged = config.Privileged - execConfig.User = config.User - - linkedEnv, err := d.setupLinkedContainers(container) - if err != nil { - return "", err - } - execConfig.Env = utils.ReplaceOrAppendEnvValues(container.CreateDaemonEnvironment(config.Tty, linkedEnv), config.Env) - if len(execConfig.User) == 0 { - execConfig.User = container.Config.User - } - - d.registerExecCommand(container, execConfig) - - d.LogContainerEvent(container, "exec_create: "+execConfig.Entrypoint+" "+strings.Join(execConfig.Args, " ")) - - return execConfig.ID, nil -} - -// ContainerExecStart starts a previously set up exec instance. The -// std streams are set up. -// If ctx is cancelled, the process is terminated. -func (d *Daemon) ContainerExecStart(ctx context.Context, name string, stdin io.ReadCloser, stdout io.Writer, stderr io.Writer) (err error) { - var ( - cStdin io.ReadCloser - cStdout, cStderr io.Writer - ) - - ec, err := d.getExecConfig(name) - if err != nil { - return errExecNotFound(name) - } - - ec.Lock() - if ec.ExitCode != nil { - ec.Unlock() - err := fmt.Errorf("Error: Exec command %s has already run", ec.ID) - return errors.NewRequestConflictError(err) - } - - if ec.Running { - ec.Unlock() - return fmt.Errorf("Error: Exec command %s is already running", ec.ID) - } - ec.Running = true - defer func() { - if err != nil { - ec.Running = false - exitCode := 126 - ec.ExitCode = &exitCode - } - }() - ec.Unlock() - - c := d.containers.Get(ec.ContainerID) - logrus.Debugf("starting exec command %s in container %s", ec.ID, c.ID) - d.LogContainerEvent(c, "exec_start: "+ec.Entrypoint+" "+strings.Join(ec.Args, " ")) - - if ec.OpenStdin && stdin != nil { - r, w := io.Pipe() - go func() { - defer w.Close() - defer logrus.Debug("Closing buffered stdin pipe") - pools.Copy(w, stdin) - }() - cStdin = r - } - if ec.OpenStdout { - cStdout = stdout - } - if ec.OpenStderr { - cStderr = stderr - } - - if ec.OpenStdin { - ec.StreamConfig.NewInputPipes() - } else { - ec.StreamConfig.NewNopInputPipe() - } - - p := libcontainerd.Process{ - Args: append([]string{ec.Entrypoint}, ec.Args...), - Env: ec.Env, - Terminal: ec.Tty, - } - - if err := execSetPlatformOpt(c, ec, &p); err != nil { - return err - } - - attachErr := container.AttachStreams(ctx, ec.StreamConfig, ec.OpenStdin, true, ec.Tty, cStdin, cStdout, cStderr, ec.DetachKeys) - - systemPid, err := d.containerd.AddProcess(ctx, c.ID, name, p, ec.InitializeStdio) - if err != nil { - return err - } - ec.Lock() - ec.Pid = systemPid - ec.Unlock() - - select { - case <-ctx.Done(): - logrus.Debugf("Sending TERM signal to process %v in container %v", name, c.ID) - d.containerd.SignalProcess(c.ID, name, int(signal.SignalMap["TERM"])) - select { - case <-time.After(termProcessTimeout * time.Second): - logrus.Infof("Container %v, process %v failed to exit within %d seconds of signal TERM - using the force", c.ID, name, termProcessTimeout) - d.containerd.SignalProcess(c.ID, name, int(signal.SignalMap["KILL"])) - case <-attachErr: - // TERM signal worked - } - return fmt.Errorf("context cancelled") - case err := <-attachErr: - if err != nil { - if _, ok := err.(container.DetachError); !ok { - return fmt.Errorf("exec attach failed with error: %v", err) - } - d.LogContainerEvent(c, "exec_detach") - } - } - return nil -} - -// execCommandGC runs a ticker to clean up the daemon references -// of exec configs that are no longer part of the container. -func (d *Daemon) execCommandGC() { - for range time.Tick(5 * time.Minute) { - var ( - cleaned int - liveExecCommands = d.containerExecIds() - ) - for id, config := range d.execCommands.Commands() { - if config.CanRemove { - cleaned++ - d.execCommands.Delete(id) - } else { - if _, exists := liveExecCommands[id]; !exists { - config.CanRemove = true - } - } - } - if cleaned > 0 { - logrus.Debugf("clean %d unused exec commands", cleaned) - } - } -} - -// containerExecIds returns a list of all the current exec ids that are in use -// and running inside a container. -func (d *Daemon) containerExecIds() map[string]struct{} { - ids := map[string]struct{}{} - for _, c := range d.containers.List() { - for _, id := range c.ExecCommands.List() { - ids[id] = struct{}{} - } - } - return ids -} diff --git a/vendor/github.com/docker/docker/daemon/exec/exec.go b/vendor/github.com/docker/docker/daemon/exec/exec.go deleted file mode 100644 index 933136f96..000000000 --- a/vendor/github.com/docker/docker/daemon/exec/exec.go +++ /dev/null @@ -1,118 +0,0 @@ -package exec - -import ( - "runtime" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/container/stream" - "github.com/docker/docker/libcontainerd" - "github.com/docker/docker/pkg/stringid" -) - -// Config holds the configurations for execs. The Daemon keeps -// track of both running and finished execs so that they can be -// examined both during and after completion. -type Config struct { - sync.Mutex - StreamConfig *stream.Config - ID string - Running bool - ExitCode *int - OpenStdin bool - OpenStderr bool - OpenStdout bool - CanRemove bool - ContainerID string - DetachKeys []byte - Entrypoint string - Args []string - Tty bool - Privileged bool - User string - Env []string - Pid int -} - -// NewConfig initializes the a new exec configuration -func NewConfig() *Config { - return &Config{ - ID: stringid.GenerateNonCryptoID(), - StreamConfig: stream.NewConfig(), - } -} - -// InitializeStdio is called by libcontainerd to connect the stdio. -func (c *Config) InitializeStdio(iop libcontainerd.IOPipe) error { - c.StreamConfig.CopyToPipe(iop) - - if c.StreamConfig.Stdin() == nil && !c.Tty && runtime.GOOS == "windows" { - if iop.Stdin != nil { - if err := iop.Stdin.Close(); err != nil { - logrus.Errorf("error closing exec stdin: %+v", err) - } - } - } - - return nil -} - -// CloseStreams closes the stdio streams for the exec -func (c *Config) CloseStreams() error { - return c.StreamConfig.CloseStreams() -} - -// Store keeps track of the exec configurations. -type Store struct { - commands map[string]*Config - sync.RWMutex -} - -// NewStore initializes a new exec store. -func NewStore() *Store { - return &Store{commands: make(map[string]*Config, 0)} -} - -// Commands returns the exec configurations in the store. -func (e *Store) Commands() map[string]*Config { - e.RLock() - commands := make(map[string]*Config, len(e.commands)) - for id, config := range e.commands { - commands[id] = config - } - e.RUnlock() - return commands -} - -// Add adds a new exec configuration to the store. -func (e *Store) Add(id string, Config *Config) { - e.Lock() - e.commands[id] = Config - e.Unlock() -} - -// Get returns an exec configuration by its id. -func (e *Store) Get(id string) *Config { - e.RLock() - res := e.commands[id] - e.RUnlock() - return res -} - -// Delete removes an exec configuration from the store. -func (e *Store) Delete(id string) { - e.Lock() - delete(e.commands, id) - e.Unlock() -} - -// List returns the list of exec ids in the store. -func (e *Store) List() []string { - var IDs []string - e.RLock() - for id := range e.commands { - IDs = append(IDs, id) - } - e.RUnlock() - return IDs -} diff --git a/vendor/github.com/docker/docker/daemon/exec_linux.go b/vendor/github.com/docker/docker/daemon/exec_linux.go deleted file mode 100644 index 5aeedc347..000000000 --- a/vendor/github.com/docker/docker/daemon/exec_linux.go +++ /dev/null @@ -1,27 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/caps" - "github.com/docker/docker/daemon/exec" - "github.com/docker/docker/libcontainerd" - "github.com/opencontainers/runtime-spec/specs-go" -) - -func execSetPlatformOpt(c *container.Container, ec *exec.Config, p *libcontainerd.Process) error { - if len(ec.User) > 0 { - uid, gid, additionalGids, err := getUser(c, ec.User) - if err != nil { - return err - } - p.User = &specs.User{ - UID: uid, - GID: gid, - AdditionalGids: additionalGids, - } - } - if ec.Privileged { - p.Capabilities = caps.GetAllCapabilities() - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/exec_solaris.go b/vendor/github.com/docker/docker/daemon/exec_solaris.go deleted file mode 100644 index 7003355d9..000000000 --- a/vendor/github.com/docker/docker/daemon/exec_solaris.go +++ /dev/null @@ -1,11 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/exec" - "github.com/docker/docker/libcontainerd" -) - -func execSetPlatformOpt(c *container.Container, ec *exec.Config, p *libcontainerd.Process) error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/exec_windows.go b/vendor/github.com/docker/docker/daemon/exec_windows.go deleted file mode 100644 index 1d6974cda..000000000 --- a/vendor/github.com/docker/docker/daemon/exec_windows.go +++ /dev/null @@ -1,14 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/exec" - "github.com/docker/docker/libcontainerd" -) - -func execSetPlatformOpt(c *container.Container, ec *exec.Config, p *libcontainerd.Process) error { - // Process arguments need to be escaped before sending to OCI. - p.Args = escapeArgs(p.Args) - p.User.Username = ec.User - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/export.go b/vendor/github.com/docker/docker/daemon/export.go deleted file mode 100644 index 5ef6dbb0e..000000000 --- a/vendor/github.com/docker/docker/daemon/export.go +++ /dev/null @@ -1,60 +0,0 @@ -package daemon - -import ( - "fmt" - "io" - "runtime" - - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/ioutils" -) - -// ContainerExport writes the contents of the container to the given -// writer. An error is returned if the container cannot be found. -func (daemon *Daemon) ContainerExport(name string, out io.Writer) error { - if runtime.GOOS == "windows" { - return fmt.Errorf("the daemon on this platform does not support export of a container") - } - - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - data, err := daemon.containerExport(container) - if err != nil { - return fmt.Errorf("Error exporting container %s: %v", name, err) - } - defer data.Close() - - // Stream the entire contents of the container (basically a volatile snapshot) - if _, err := io.Copy(out, data); err != nil { - return fmt.Errorf("Error exporting container %s: %v", name, err) - } - return nil -} - -func (daemon *Daemon) containerExport(container *container.Container) (io.ReadCloser, error) { - if err := daemon.Mount(container); err != nil { - return nil, err - } - - uidMaps, gidMaps := daemon.GetUIDGIDMaps() - archive, err := archive.TarWithOptions(container.BaseFS, &archive.TarOptions{ - Compression: archive.Uncompressed, - UIDMaps: uidMaps, - GIDMaps: gidMaps, - }) - if err != nil { - daemon.Unmount(container) - return nil, err - } - arch := ioutils.NewReadCloserWrapper(archive, func() error { - err := archive.Close() - daemon.Unmount(container) - return err - }) - daemon.LogContainerEvent(container, "export") - return arch, err -} diff --git a/vendor/github.com/docker/docker/daemon/getsize_unix.go b/vendor/github.com/docker/docker/daemon/getsize_unix.go deleted file mode 100644 index 707323a4b..000000000 --- a/vendor/github.com/docker/docker/daemon/getsize_unix.go +++ /dev/null @@ -1,41 +0,0 @@ -// +build linux freebsd solaris - -package daemon - -import ( - "github.com/Sirupsen/logrus" - "github.com/docker/docker/container" -) - -// getSize returns the real size & virtual size of the container. -func (daemon *Daemon) getSize(container *container.Container) (int64, int64) { - var ( - sizeRw, sizeRootfs int64 - err error - ) - - if err := daemon.Mount(container); err != nil { - logrus.Errorf("Failed to compute size of container rootfs %s: %s", container.ID, err) - return sizeRw, sizeRootfs - } - defer daemon.Unmount(container) - - sizeRw, err = container.RWLayer.Size() - if err != nil { - logrus.Errorf("Driver %s couldn't return diff size of container %s: %s", - daemon.GraphDriverName(), container.ID, err) - // FIXME: GetSize should return an error. Not changing it now in case - // there is a side-effect. - sizeRw = -1 - } - - if parent := container.RWLayer.Parent(); parent != nil { - sizeRootfs, err = parent.Size() - if err != nil { - sizeRootfs = -1 - } else if sizeRw != -1 { - sizeRootfs += sizeRw - } - } - return sizeRw, sizeRootfs -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/aufs.go b/vendor/github.com/docker/docker/daemon/graphdriver/aufs/aufs.go deleted file mode 100644 index ec55ea4cd..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/aufs.go +++ /dev/null @@ -1,669 +0,0 @@ -// +build linux - -/* - -aufs driver directory structure - - . - ├── layers // Metadata of layers - │ ├── 1 - │ ├── 2 - │ └── 3 - ├── diff // Content of the layer - │ ├── 1 // Contains layers that need to be mounted for the id - │ ├── 2 - │ └── 3 - └── mnt // Mount points for the rw layers to be mounted - ├── 1 - ├── 2 - └── 3 - -*/ - -package aufs - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "strings" - "sync" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - "github.com/vbatts/tar-split/tar/storage" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/chrootarchive" - "github.com/docker/docker/pkg/directory" - "github.com/docker/docker/pkg/idtools" - mountpk "github.com/docker/docker/pkg/mount" - - "github.com/opencontainers/runc/libcontainer/label" - rsystem "github.com/opencontainers/runc/libcontainer/system" -) - -var ( - // ErrAufsNotSupported is returned if aufs is not supported by the host. - ErrAufsNotSupported = fmt.Errorf("AUFS was not found in /proc/filesystems") - // ErrAufsNested means aufs cannot be used bc we are in a user namespace - ErrAufsNested = fmt.Errorf("AUFS cannot be used in non-init user namespace") - backingFs = "" - - enableDirpermLock sync.Once - enableDirperm bool -) - -func init() { - graphdriver.Register("aufs", Init) -} - -// Driver contains information about the filesystem mounted. -type Driver struct { - sync.Mutex - root string - uidMaps []idtools.IDMap - gidMaps []idtools.IDMap - ctr *graphdriver.RefCounter - pathCacheLock sync.Mutex - pathCache map[string]string - naiveDiff graphdriver.DiffDriver -} - -// Init returns a new AUFS driver. -// An error is returned if AUFS is not supported. -func Init(root string, options []string, uidMaps, gidMaps []idtools.IDMap) (graphdriver.Driver, error) { - - // Try to load the aufs kernel module - if err := supportsAufs(); err != nil { - return nil, graphdriver.ErrNotSupported - } - - fsMagic, err := graphdriver.GetFSMagic(root) - if err != nil { - return nil, err - } - if fsName, ok := graphdriver.FsNames[fsMagic]; ok { - backingFs = fsName - } - - switch fsMagic { - case graphdriver.FsMagicAufs, graphdriver.FsMagicBtrfs, graphdriver.FsMagicEcryptfs: - logrus.Errorf("AUFS is not supported over %s", backingFs) - return nil, graphdriver.ErrIncompatibleFS - } - - paths := []string{ - "mnt", - "diff", - "layers", - } - - a := &Driver{ - root: root, - uidMaps: uidMaps, - gidMaps: gidMaps, - pathCache: make(map[string]string), - ctr: graphdriver.NewRefCounter(graphdriver.NewFsChecker(graphdriver.FsMagicAufs)), - } - - rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps) - if err != nil { - return nil, err - } - // Create the root aufs driver dir and return - // if it already exists - // If not populate the dir structure - if err := idtools.MkdirAllAs(root, 0700, rootUID, rootGID); err != nil { - if os.IsExist(err) { - return a, nil - } - return nil, err - } - - if err := mountpk.MakePrivate(root); err != nil { - return nil, err - } - - // Populate the dir structure - for _, p := range paths { - if err := idtools.MkdirAllAs(path.Join(root, p), 0700, rootUID, rootGID); err != nil { - return nil, err - } - } - - a.naiveDiff = graphdriver.NewNaiveDiffDriver(a, uidMaps, gidMaps) - return a, nil -} - -// Return a nil error if the kernel supports aufs -// We cannot modprobe because inside dind modprobe fails -// to run -func supportsAufs() error { - // We can try to modprobe aufs first before looking at - // proc/filesystems for when aufs is supported - exec.Command("modprobe", "aufs").Run() - - if rsystem.RunningInUserNS() { - return ErrAufsNested - } - - f, err := os.Open("/proc/filesystems") - if err != nil { - return err - } - defer f.Close() - - s := bufio.NewScanner(f) - for s.Scan() { - if strings.Contains(s.Text(), "aufs") { - return nil - } - } - return ErrAufsNotSupported -} - -func (a *Driver) rootPath() string { - return a.root -} - -func (*Driver) String() string { - return "aufs" -} - -// Status returns current information about the filesystem such as root directory, number of directories mounted, etc. -func (a *Driver) Status() [][2]string { - ids, _ := loadIds(path.Join(a.rootPath(), "layers")) - return [][2]string{ - {"Root Dir", a.rootPath()}, - {"Backing Filesystem", backingFs}, - {"Dirs", fmt.Sprintf("%d", len(ids))}, - {"Dirperm1 Supported", fmt.Sprintf("%v", useDirperm())}, - } -} - -// GetMetadata not implemented -func (a *Driver) GetMetadata(id string) (map[string]string, error) { - return nil, nil -} - -// Exists returns true if the given id is registered with -// this driver -func (a *Driver) Exists(id string) bool { - if _, err := os.Lstat(path.Join(a.rootPath(), "layers", id)); err != nil { - return false - } - return true -} - -// CreateReadWrite creates a layer that is writable for use as a container -// file system. -func (a *Driver) CreateReadWrite(id, parent string, opts *graphdriver.CreateOpts) error { - return a.Create(id, parent, opts) -} - -// Create three folders for each id -// mnt, layers, and diff -func (a *Driver) Create(id, parent string, opts *graphdriver.CreateOpts) error { - - if opts != nil && len(opts.StorageOpt) != 0 { - return fmt.Errorf("--storage-opt is not supported for aufs") - } - - if err := a.createDirsFor(id); err != nil { - return err - } - // Write the layers metadata - f, err := os.Create(path.Join(a.rootPath(), "layers", id)) - if err != nil { - return err - } - defer f.Close() - - if parent != "" { - ids, err := getParentIDs(a.rootPath(), parent) - if err != nil { - return err - } - - if _, err := fmt.Fprintln(f, parent); err != nil { - return err - } - for _, i := range ids { - if _, err := fmt.Fprintln(f, i); err != nil { - return err - } - } - } - - return nil -} - -// createDirsFor creates two directories for the given id. -// mnt and diff -func (a *Driver) createDirsFor(id string) error { - paths := []string{ - "mnt", - "diff", - } - - rootUID, rootGID, err := idtools.GetRootUIDGID(a.uidMaps, a.gidMaps) - if err != nil { - return err - } - // Directory permission is 0755. - // The path of directories are /mnt/ - // and /diff/ - for _, p := range paths { - if err := idtools.MkdirAllAs(path.Join(a.rootPath(), p, id), 0755, rootUID, rootGID); err != nil { - return err - } - } - return nil -} - -// Helper function to debug EBUSY errors on remove. -func debugEBusy(mountPath string) (out []string, err error) { - // lsof is not part of GNU coreutils. This is a best effort - // attempt to detect offending processes. - c := exec.Command("lsof") - - r, err := c.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("Assigning pipes failed with %v", err) - } - - if err := c.Start(); err != nil { - return nil, fmt.Errorf("Starting %s failed with %v", c.Path, err) - } - - defer func() { - waiterr := c.Wait() - if waiterr != nil && err == nil { - err = fmt.Errorf("Waiting for %s failed with %v", c.Path, waiterr) - } - }() - - sc := bufio.NewScanner(r) - for sc.Scan() { - entry := sc.Text() - if strings.Contains(entry, mountPath) { - out = append(out, entry, "\n") - } - } - - return out, nil -} - -// Remove will unmount and remove the given id. -func (a *Driver) Remove(id string) error { - a.pathCacheLock.Lock() - mountpoint, exists := a.pathCache[id] - a.pathCacheLock.Unlock() - if !exists { - mountpoint = a.getMountpoint(id) - } - - var retries int - for { - mounted, err := a.mounted(mountpoint) - if err != nil { - return err - } - if !mounted { - break - } - - if err := a.unmount(mountpoint); err != nil { - if err != syscall.EBUSY { - return fmt.Errorf("aufs: unmount error: %s: %v", mountpoint, err) - } - if retries >= 5 { - out, debugErr := debugEBusy(mountpoint) - if debugErr == nil { - logrus.Warnf("debugEBusy returned %v", out) - } - return fmt.Errorf("aufs: unmount error after retries: %s: %v", mountpoint, err) - } - // If unmount returns EBUSY, it could be a transient error. Sleep and retry. - retries++ - logrus.Warnf("unmount failed due to EBUSY: retry count: %d", retries) - time.Sleep(100 * time.Millisecond) - continue - } - break - } - - // Atomically remove each directory in turn by first moving it out of the - // way (so that docker doesn't find it anymore) before doing removal of - // the whole tree. - tmpMntPath := path.Join(a.mntPath(), fmt.Sprintf("%s-removing", id)) - if err := os.Rename(mountpoint, tmpMntPath); err != nil && !os.IsNotExist(err) { - if err == syscall.EBUSY { - logrus.Warn("os.Rename err due to EBUSY") - out, debugErr := debugEBusy(mountpoint) - if debugErr == nil { - logrus.Warnf("debugEBusy returned %v", out) - } - } - return err - } - defer os.RemoveAll(tmpMntPath) - - tmpDiffpath := path.Join(a.diffPath(), fmt.Sprintf("%s-removing", id)) - if err := os.Rename(a.getDiffPath(id), tmpDiffpath); err != nil && !os.IsNotExist(err) { - return err - } - defer os.RemoveAll(tmpDiffpath) - - // Remove the layers file for the id - if err := os.Remove(path.Join(a.rootPath(), "layers", id)); err != nil && !os.IsNotExist(err) { - return err - } - - a.pathCacheLock.Lock() - delete(a.pathCache, id) - a.pathCacheLock.Unlock() - return nil -} - -// Get returns the rootfs path for the id. -// This will mount the dir at its given path -func (a *Driver) Get(id, mountLabel string) (string, error) { - parents, err := a.getParentLayerPaths(id) - if err != nil && !os.IsNotExist(err) { - return "", err - } - - a.pathCacheLock.Lock() - m, exists := a.pathCache[id] - a.pathCacheLock.Unlock() - - if !exists { - m = a.getDiffPath(id) - if len(parents) > 0 { - m = a.getMountpoint(id) - } - } - if count := a.ctr.Increment(m); count > 1 { - return m, nil - } - - // If a dir does not have a parent ( no layers )do not try to mount - // just return the diff path to the data - if len(parents) > 0 { - if err := a.mount(id, m, mountLabel, parents); err != nil { - return "", err - } - } - - a.pathCacheLock.Lock() - a.pathCache[id] = m - a.pathCacheLock.Unlock() - return m, nil -} - -// Put unmounts and updates list of active mounts. -func (a *Driver) Put(id string) error { - a.pathCacheLock.Lock() - m, exists := a.pathCache[id] - if !exists { - m = a.getMountpoint(id) - a.pathCache[id] = m - } - a.pathCacheLock.Unlock() - if count := a.ctr.Decrement(m); count > 0 { - return nil - } - - err := a.unmount(m) - if err != nil { - logrus.Debugf("Failed to unmount %s aufs: %v", id, err) - } - return err -} - -// isParent returns if the passed in parent is the direct parent of the passed in layer -func (a *Driver) isParent(id, parent string) bool { - parents, _ := getParentIDs(a.rootPath(), id) - if parent == "" && len(parents) > 0 { - return false - } - return !(len(parents) > 0 && parent != parents[0]) -} - -// Diff produces an archive of the changes between the specified -// layer and its parent layer which may be "". -func (a *Driver) Diff(id, parent string) (io.ReadCloser, error) { - if !a.isParent(id, parent) { - return a.naiveDiff.Diff(id, parent) - } - - // AUFS doesn't need the parent layer to produce a diff. - return archive.TarWithOptions(path.Join(a.rootPath(), "diff", id), &archive.TarOptions{ - Compression: archive.Uncompressed, - ExcludePatterns: []string{archive.WhiteoutMetaPrefix + "*", "!" + archive.WhiteoutOpaqueDir}, - UIDMaps: a.uidMaps, - GIDMaps: a.gidMaps, - }) -} - -type fileGetNilCloser struct { - storage.FileGetter -} - -func (f fileGetNilCloser) Close() error { - return nil -} - -// DiffGetter returns a FileGetCloser that can read files from the directory that -// contains files for the layer differences. Used for direct access for tar-split. -func (a *Driver) DiffGetter(id string) (graphdriver.FileGetCloser, error) { - p := path.Join(a.rootPath(), "diff", id) - return fileGetNilCloser{storage.NewPathFileGetter(p)}, nil -} - -func (a *Driver) applyDiff(id string, diff io.Reader) error { - return chrootarchive.UntarUncompressed(diff, path.Join(a.rootPath(), "diff", id), &archive.TarOptions{ - UIDMaps: a.uidMaps, - GIDMaps: a.gidMaps, - }) -} - -// DiffSize calculates the changes between the specified id -// and its parent and returns the size in bytes of the changes -// relative to its base filesystem directory. -func (a *Driver) DiffSize(id, parent string) (size int64, err error) { - if !a.isParent(id, parent) { - return a.naiveDiff.DiffSize(id, parent) - } - // AUFS doesn't need the parent layer to calculate the diff size. - return directory.Size(path.Join(a.rootPath(), "diff", id)) -} - -// ApplyDiff extracts the changeset from the given diff into the -// layer with the specified id and parent, returning the size of the -// new layer in bytes. -func (a *Driver) ApplyDiff(id, parent string, diff io.Reader) (size int64, err error) { - if !a.isParent(id, parent) { - return a.naiveDiff.ApplyDiff(id, parent, diff) - } - - // AUFS doesn't need the parent id to apply the diff if it is the direct parent. - if err = a.applyDiff(id, diff); err != nil { - return - } - - return a.DiffSize(id, parent) -} - -// Changes produces a list of changes between the specified layer -// and its parent layer. If parent is "", then all changes will be ADD changes. -func (a *Driver) Changes(id, parent string) ([]archive.Change, error) { - if !a.isParent(id, parent) { - return a.naiveDiff.Changes(id, parent) - } - - // AUFS doesn't have snapshots, so we need to get changes from all parent - // layers. - layers, err := a.getParentLayerPaths(id) - if err != nil { - return nil, err - } - return archive.Changes(layers, path.Join(a.rootPath(), "diff", id)) -} - -func (a *Driver) getParentLayerPaths(id string) ([]string, error) { - parentIds, err := getParentIDs(a.rootPath(), id) - if err != nil { - return nil, err - } - layers := make([]string, len(parentIds)) - - // Get the diff paths for all the parent ids - for i, p := range parentIds { - layers[i] = path.Join(a.rootPath(), "diff", p) - } - return layers, nil -} - -func (a *Driver) mount(id string, target string, mountLabel string, layers []string) error { - a.Lock() - defer a.Unlock() - - // If the id is mounted or we get an error return - if mounted, err := a.mounted(target); err != nil || mounted { - return err - } - - rw := a.getDiffPath(id) - - if err := a.aufsMount(layers, rw, target, mountLabel); err != nil { - return fmt.Errorf("error creating aufs mount to %s: %v", target, err) - } - return nil -} - -func (a *Driver) unmount(mountPath string) error { - a.Lock() - defer a.Unlock() - - if mounted, err := a.mounted(mountPath); err != nil || !mounted { - return err - } - if err := Unmount(mountPath); err != nil { - return err - } - return nil -} - -func (a *Driver) mounted(mountpoint string) (bool, error) { - return graphdriver.Mounted(graphdriver.FsMagicAufs, mountpoint) -} - -// Cleanup aufs and unmount all mountpoints -func (a *Driver) Cleanup() error { - var dirs []string - if err := filepath.Walk(a.mntPath(), func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if !info.IsDir() { - return nil - } - dirs = append(dirs, path) - return nil - }); err != nil { - return err - } - - for _, m := range dirs { - if err := a.unmount(m); err != nil { - logrus.Debugf("aufs error unmounting %s: %s", m, err) - } - } - return mountpk.Unmount(a.root) -} - -func (a *Driver) aufsMount(ro []string, rw, target, mountLabel string) (err error) { - defer func() { - if err != nil { - Unmount(target) - } - }() - - // Mount options are clipped to page size(4096 bytes). If there are more - // layers then these are remounted individually using append. - - offset := 54 - if useDirperm() { - offset += len("dirperm1") - } - b := make([]byte, syscall.Getpagesize()-len(mountLabel)-offset) // room for xino & mountLabel - bp := copy(b, fmt.Sprintf("br:%s=rw", rw)) - - index := 0 - for ; index < len(ro); index++ { - layer := fmt.Sprintf(":%s=ro+wh", ro[index]) - if bp+len(layer) > len(b) { - break - } - bp += copy(b[bp:], layer) - } - - opts := "dio,xino=/dev/shm/aufs.xino" - if useDirperm() { - opts += ",dirperm1" - } - data := label.FormatMountLabel(fmt.Sprintf("%s,%s", string(b[:bp]), opts), mountLabel) - if err = mount("none", target, "aufs", 0, data); err != nil { - return - } - - for ; index < len(ro); index++ { - layer := fmt.Sprintf(":%s=ro+wh", ro[index]) - data := label.FormatMountLabel(fmt.Sprintf("append%s", layer), mountLabel) - if err = mount("none", target, "aufs", syscall.MS_REMOUNT, data); err != nil { - return - } - } - - return -} - -// useDirperm checks dirperm1 mount option can be used with the current -// version of aufs. -func useDirperm() bool { - enableDirpermLock.Do(func() { - base, err := ioutil.TempDir("", "docker-aufs-base") - if err != nil { - logrus.Errorf("error checking dirperm1: %v", err) - return - } - defer os.RemoveAll(base) - - union, err := ioutil.TempDir("", "docker-aufs-union") - if err != nil { - logrus.Errorf("error checking dirperm1: %v", err) - return - } - defer os.RemoveAll(union) - - opts := fmt.Sprintf("br:%s,dirperm1,xino=/dev/shm/aufs.xino", base) - if err := mount("none", union, "aufs", 0, opts); err != nil { - return - } - enableDirperm = true - if err := Unmount(union); err != nil { - logrus.Errorf("error checking dirperm1: failed to unmount %v", err) - } - }) - return enableDirperm -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/aufs_test.go b/vendor/github.com/docker/docker/daemon/graphdriver/aufs/aufs_test.go deleted file mode 100644 index dc3c6a392..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/aufs_test.go +++ /dev/null @@ -1,802 +0,0 @@ -// +build linux - -package aufs - -import ( - "crypto/sha256" - "encoding/hex" - "fmt" - "io/ioutil" - "os" - "path" - "sync" - "testing" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/reexec" - "github.com/docker/docker/pkg/stringid" -) - -var ( - tmpOuter = path.Join(os.TempDir(), "aufs-tests") - tmp = path.Join(tmpOuter, "aufs") -) - -func init() { - reexec.Init() -} - -func testInit(dir string, t testing.TB) graphdriver.Driver { - d, err := Init(dir, nil, nil, nil) - if err != nil { - if err == graphdriver.ErrNotSupported { - t.Skip(err) - } else { - t.Fatal(err) - } - } - return d -} - -func newDriver(t testing.TB) *Driver { - if err := os.MkdirAll(tmp, 0755); err != nil { - t.Fatal(err) - } - - d := testInit(tmp, t) - return d.(*Driver) -} - -func TestNewDriver(t *testing.T) { - if err := os.MkdirAll(tmp, 0755); err != nil { - t.Fatal(err) - } - - d := testInit(tmp, t) - defer os.RemoveAll(tmp) - if d == nil { - t.Fatalf("Driver should not be nil") - } -} - -func TestAufsString(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if d.String() != "aufs" { - t.Fatalf("Expected aufs got %s", d.String()) - } -} - -func TestCreateDirStructure(t *testing.T) { - newDriver(t) - defer os.RemoveAll(tmp) - - paths := []string{ - "mnt", - "layers", - "diff", - } - - for _, p := range paths { - if _, err := os.Stat(path.Join(tmp, p)); err != nil { - t.Fatal(err) - } - } -} - -// We should be able to create two drivers with the same dir structure -func TestNewDriverFromExistingDir(t *testing.T) { - if err := os.MkdirAll(tmp, 0755); err != nil { - t.Fatal(err) - } - - testInit(tmp, t) - testInit(tmp, t) - os.RemoveAll(tmp) -} - -func TestCreateNewDir(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } -} - -func TestCreateNewDirStructure(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } - - paths := []string{ - "mnt", - "diff", - "layers", - } - - for _, p := range paths { - if _, err := os.Stat(path.Join(tmp, p, "1")); err != nil { - t.Fatal(err) - } - } -} - -func TestRemoveImage(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } - - if err := d.Remove("1"); err != nil { - t.Fatal(err) - } - - paths := []string{ - "mnt", - "diff", - "layers", - } - - for _, p := range paths { - if _, err := os.Stat(path.Join(tmp, p, "1")); err == nil { - t.Fatalf("Error should not be nil because dirs with id 1 should be delted: %s", p) - } - } -} - -func TestGetWithoutParent(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } - - diffPath, err := d.Get("1", "") - if err != nil { - t.Fatal(err) - } - expected := path.Join(tmp, "diff", "1") - if diffPath != expected { - t.Fatalf("Expected path %s got %s", expected, diffPath) - } -} - -func TestCleanupWithNoDirs(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.Cleanup(); err != nil { - t.Fatal(err) - } -} - -func TestCleanupWithDir(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } - - if err := d.Cleanup(); err != nil { - t.Fatal(err) - } -} - -func TestMountedFalseResponse(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } - - response, err := d.mounted(d.getDiffPath("1")) - if err != nil { - t.Fatal(err) - } - - if response != false { - t.Fatalf("Response if dir id 1 is mounted should be false") - } -} - -func TestMountedTrueReponse(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - defer d.Cleanup() - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } - if err := d.Create("2", "1", nil); err != nil { - t.Fatal(err) - } - - _, err := d.Get("2", "") - if err != nil { - t.Fatal(err) - } - - response, err := d.mounted(d.pathCache["2"]) - if err != nil { - t.Fatal(err) - } - - if response != true { - t.Fatalf("Response if dir id 2 is mounted should be true") - } -} - -func TestMountWithParent(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } - if err := d.Create("2", "1", nil); err != nil { - t.Fatal(err) - } - - defer func() { - if err := d.Cleanup(); err != nil { - t.Fatal(err) - } - }() - - mntPath, err := d.Get("2", "") - if err != nil { - t.Fatal(err) - } - if mntPath == "" { - t.Fatal("mntPath should not be empty string") - } - - expected := path.Join(tmp, "mnt", "2") - if mntPath != expected { - t.Fatalf("Expected %s got %s", expected, mntPath) - } -} - -func TestRemoveMountedDir(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } - if err := d.Create("2", "1", nil); err != nil { - t.Fatal(err) - } - - defer func() { - if err := d.Cleanup(); err != nil { - t.Fatal(err) - } - }() - - mntPath, err := d.Get("2", "") - if err != nil { - t.Fatal(err) - } - if mntPath == "" { - t.Fatal("mntPath should not be empty string") - } - - mounted, err := d.mounted(d.pathCache["2"]) - if err != nil { - t.Fatal(err) - } - - if !mounted { - t.Fatalf("Dir id 2 should be mounted") - } - - if err := d.Remove("2"); err != nil { - t.Fatal(err) - } -} - -func TestCreateWithInvalidParent(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.Create("1", "docker", nil); err == nil { - t.Fatalf("Error should not be nil with parent does not exist") - } -} - -func TestGetDiff(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.CreateReadWrite("1", "", nil); err != nil { - t.Fatal(err) - } - - diffPath, err := d.Get("1", "") - if err != nil { - t.Fatal(err) - } - - // Add a file to the diff path with a fixed size - size := int64(1024) - - f, err := os.Create(path.Join(diffPath, "test_file")) - if err != nil { - t.Fatal(err) - } - if err := f.Truncate(size); err != nil { - t.Fatal(err) - } - f.Close() - - a, err := d.Diff("1", "") - if err != nil { - t.Fatal(err) - } - if a == nil { - t.Fatalf("Archive should not be nil") - } -} - -func TestChanges(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } - - if err := d.CreateReadWrite("2", "1", nil); err != nil { - t.Fatal(err) - } - - defer func() { - if err := d.Cleanup(); err != nil { - t.Fatal(err) - } - }() - - mntPoint, err := d.Get("2", "") - if err != nil { - t.Fatal(err) - } - - // Create a file to save in the mountpoint - f, err := os.Create(path.Join(mntPoint, "test.txt")) - if err != nil { - t.Fatal(err) - } - - if _, err := f.WriteString("testline"); err != nil { - t.Fatal(err) - } - if err := f.Close(); err != nil { - t.Fatal(err) - } - - changes, err := d.Changes("2", "") - if err != nil { - t.Fatal(err) - } - if len(changes) != 1 { - t.Fatalf("Dir 2 should have one change from parent got %d", len(changes)) - } - change := changes[0] - - expectedPath := "/test.txt" - if change.Path != expectedPath { - t.Fatalf("Expected path %s got %s", expectedPath, change.Path) - } - - if change.Kind != archive.ChangeAdd { - t.Fatalf("Change kind should be ChangeAdd got %s", change.Kind) - } - - if err := d.CreateReadWrite("3", "2", nil); err != nil { - t.Fatal(err) - } - mntPoint, err = d.Get("3", "") - if err != nil { - t.Fatal(err) - } - - // Create a file to save in the mountpoint - f, err = os.Create(path.Join(mntPoint, "test2.txt")) - if err != nil { - t.Fatal(err) - } - - if _, err := f.WriteString("testline"); err != nil { - t.Fatal(err) - } - if err := f.Close(); err != nil { - t.Fatal(err) - } - - changes, err = d.Changes("3", "2") - if err != nil { - t.Fatal(err) - } - - if len(changes) != 1 { - t.Fatalf("Dir 2 should have one change from parent got %d", len(changes)) - } - change = changes[0] - - expectedPath = "/test2.txt" - if change.Path != expectedPath { - t.Fatalf("Expected path %s got %s", expectedPath, change.Path) - } - - if change.Kind != archive.ChangeAdd { - t.Fatalf("Change kind should be ChangeAdd got %s", change.Kind) - } -} - -func TestDiffSize(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - - if err := d.CreateReadWrite("1", "", nil); err != nil { - t.Fatal(err) - } - - diffPath, err := d.Get("1", "") - if err != nil { - t.Fatal(err) - } - - // Add a file to the diff path with a fixed size - size := int64(1024) - - f, err := os.Create(path.Join(diffPath, "test_file")) - if err != nil { - t.Fatal(err) - } - if err := f.Truncate(size); err != nil { - t.Fatal(err) - } - s, err := f.Stat() - if err != nil { - t.Fatal(err) - } - size = s.Size() - if err := f.Close(); err != nil { - t.Fatal(err) - } - - diffSize, err := d.DiffSize("1", "") - if err != nil { - t.Fatal(err) - } - if diffSize != size { - t.Fatalf("Expected size to be %d got %d", size, diffSize) - } -} - -func TestChildDiffSize(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - defer d.Cleanup() - - if err := d.CreateReadWrite("1", "", nil); err != nil { - t.Fatal(err) - } - - diffPath, err := d.Get("1", "") - if err != nil { - t.Fatal(err) - } - - // Add a file to the diff path with a fixed size - size := int64(1024) - - f, err := os.Create(path.Join(diffPath, "test_file")) - if err != nil { - t.Fatal(err) - } - if err := f.Truncate(size); err != nil { - t.Fatal(err) - } - s, err := f.Stat() - if err != nil { - t.Fatal(err) - } - size = s.Size() - if err := f.Close(); err != nil { - t.Fatal(err) - } - - diffSize, err := d.DiffSize("1", "") - if err != nil { - t.Fatal(err) - } - if diffSize != size { - t.Fatalf("Expected size to be %d got %d", size, diffSize) - } - - if err := d.Create("2", "1", nil); err != nil { - t.Fatal(err) - } - - diffSize, err = d.DiffSize("2", "1") - if err != nil { - t.Fatal(err) - } - // The diff size for the child should be zero - if diffSize != 0 { - t.Fatalf("Expected size to be %d got %d", 0, diffSize) - } -} - -func TestExists(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - defer d.Cleanup() - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } - - if d.Exists("none") { - t.Fatal("id none should not exist in the driver") - } - - if !d.Exists("1") { - t.Fatal("id 1 should exist in the driver") - } -} - -func TestStatus(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - defer d.Cleanup() - - if err := d.Create("1", "", nil); err != nil { - t.Fatal(err) - } - - status := d.Status() - if status == nil || len(status) == 0 { - t.Fatal("Status should not be nil or empty") - } - rootDir := status[0] - dirs := status[2] - if rootDir[0] != "Root Dir" { - t.Fatalf("Expected Root Dir got %s", rootDir[0]) - } - if rootDir[1] != d.rootPath() { - t.Fatalf("Expected %s got %s", d.rootPath(), rootDir[1]) - } - if dirs[0] != "Dirs" { - t.Fatalf("Expected Dirs got %s", dirs[0]) - } - if dirs[1] != "1" { - t.Fatalf("Expected 1 got %s", dirs[1]) - } -} - -func TestApplyDiff(t *testing.T) { - d := newDriver(t) - defer os.RemoveAll(tmp) - defer d.Cleanup() - - if err := d.CreateReadWrite("1", "", nil); err != nil { - t.Fatal(err) - } - - diffPath, err := d.Get("1", "") - if err != nil { - t.Fatal(err) - } - - // Add a file to the diff path with a fixed size - size := int64(1024) - - f, err := os.Create(path.Join(diffPath, "test_file")) - if err != nil { - t.Fatal(err) - } - if err := f.Truncate(size); err != nil { - t.Fatal(err) - } - f.Close() - - diff, err := d.Diff("1", "") - if err != nil { - t.Fatal(err) - } - - if err := d.Create("2", "", nil); err != nil { - t.Fatal(err) - } - if err := d.Create("3", "2", nil); err != nil { - t.Fatal(err) - } - - if err := d.applyDiff("3", diff); err != nil { - t.Fatal(err) - } - - // Ensure that the file is in the mount point for id 3 - - mountPoint, err := d.Get("3", "") - if err != nil { - t.Fatal(err) - } - if _, err := os.Stat(path.Join(mountPoint, "test_file")); err != nil { - t.Fatal(err) - } -} - -func hash(c string) string { - h := sha256.New() - fmt.Fprint(h, c) - return hex.EncodeToString(h.Sum(nil)) -} - -func testMountMoreThan42Layers(t *testing.T, mountPath string) { - if err := os.MkdirAll(mountPath, 0755); err != nil { - t.Fatal(err) - } - - defer os.RemoveAll(mountPath) - d := testInit(mountPath, t).(*Driver) - defer d.Cleanup() - var last string - var expected int - - for i := 1; i < 127; i++ { - expected++ - var ( - parent = fmt.Sprintf("%d", i-1) - current = fmt.Sprintf("%d", i) - ) - - if parent == "0" { - parent = "" - } else { - parent = hash(parent) - } - current = hash(current) - - if err := d.CreateReadWrite(current, parent, nil); err != nil { - t.Logf("Current layer %d", i) - t.Error(err) - } - point, err := d.Get(current, "") - if err != nil { - t.Logf("Current layer %d", i) - t.Error(err) - } - f, err := os.Create(path.Join(point, current)) - if err != nil { - t.Logf("Current layer %d", i) - t.Error(err) - } - f.Close() - - if i%10 == 0 { - if err := os.Remove(path.Join(point, parent)); err != nil { - t.Logf("Current layer %d", i) - t.Error(err) - } - expected-- - } - last = current - } - - // Perform the actual mount for the top most image - point, err := d.Get(last, "") - if err != nil { - t.Error(err) - } - files, err := ioutil.ReadDir(point) - if err != nil { - t.Error(err) - } - if len(files) != expected { - t.Errorf("Expected %d got %d", expected, len(files)) - } -} - -func TestMountMoreThan42Layers(t *testing.T) { - os.RemoveAll(tmpOuter) - testMountMoreThan42Layers(t, tmp) -} - -func TestMountMoreThan42LayersMatchingPathLength(t *testing.T) { - defer os.RemoveAll(tmpOuter) - zeroes := "0" - for { - // This finds a mount path so that when combined into aufs mount options - // 4096 byte boundary would be in between the paths or in permission - // section. For '/tmp' it will use '/tmp/aufs-tests/00000000/aufs' - mountPath := path.Join(tmpOuter, zeroes, "aufs") - pathLength := 77 + len(mountPath) - - if mod := 4095 % pathLength; mod == 0 || mod > pathLength-2 { - t.Logf("Using path: %s", mountPath) - testMountMoreThan42Layers(t, mountPath) - return - } - zeroes += "0" - } -} - -func BenchmarkConcurrentAccess(b *testing.B) { - b.StopTimer() - b.ResetTimer() - - d := newDriver(b) - defer os.RemoveAll(tmp) - defer d.Cleanup() - - numConcurent := 256 - // create a bunch of ids - var ids []string - for i := 0; i < numConcurent; i++ { - ids = append(ids, stringid.GenerateNonCryptoID()) - } - - if err := d.Create(ids[0], "", nil); err != nil { - b.Fatal(err) - } - - if err := d.Create(ids[1], ids[0], nil); err != nil { - b.Fatal(err) - } - - parent := ids[1] - ids = append(ids[2:]) - - chErr := make(chan error, numConcurent) - var outerGroup sync.WaitGroup - outerGroup.Add(len(ids)) - b.StartTimer() - - // here's the actual bench - for _, id := range ids { - go func(id string) { - defer outerGroup.Done() - if err := d.Create(id, parent, nil); err != nil { - b.Logf("Create %s failed", id) - chErr <- err - return - } - var innerGroup sync.WaitGroup - for i := 0; i < b.N; i++ { - innerGroup.Add(1) - go func() { - d.Get(id, "") - d.Put(id) - innerGroup.Done() - }() - } - innerGroup.Wait() - d.Remove(id) - }(id) - } - - outerGroup.Wait() - b.StopTimer() - close(chErr) - for err := range chErr { - if err != nil { - b.Log(err) - b.Fail() - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/dirs.go b/vendor/github.com/docker/docker/daemon/graphdriver/aufs/dirs.go deleted file mode 100644 index d2325fc46..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/dirs.go +++ /dev/null @@ -1,64 +0,0 @@ -// +build linux - -package aufs - -import ( - "bufio" - "io/ioutil" - "os" - "path" -) - -// Return all the directories -func loadIds(root string) ([]string, error) { - dirs, err := ioutil.ReadDir(root) - if err != nil { - return nil, err - } - out := []string{} - for _, d := range dirs { - if !d.IsDir() { - out = append(out, d.Name()) - } - } - return out, nil -} - -// Read the layers file for the current id and return all the -// layers represented by new lines in the file -// -// If there are no lines in the file then the id has no parent -// and an empty slice is returned. -func getParentIDs(root, id string) ([]string, error) { - f, err := os.Open(path.Join(root, "layers", id)) - if err != nil { - return nil, err - } - defer f.Close() - - out := []string{} - s := bufio.NewScanner(f) - - for s.Scan() { - if t := s.Text(); t != "" { - out = append(out, s.Text()) - } - } - return out, s.Err() -} - -func (a *Driver) getMountpoint(id string) string { - return path.Join(a.mntPath(), id) -} - -func (a *Driver) mntPath() string { - return path.Join(a.rootPath(), "mnt") -} - -func (a *Driver) getDiffPath(id string) string { - return path.Join(a.diffPath(), id) -} - -func (a *Driver) diffPath() string { - return path.Join(a.rootPath(), "diff") -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount.go b/vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount.go deleted file mode 100644 index da1e892f4..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount.go +++ /dev/null @@ -1,21 +0,0 @@ -// +build linux - -package aufs - -import ( - "os/exec" - "syscall" - - "github.com/Sirupsen/logrus" -) - -// Unmount the target specified. -func Unmount(target string) error { - if err := exec.Command("auplink", target, "flush").Run(); err != nil { - logrus.Warnf("Couldn't run auplink before unmount %s: %s", target, err) - } - if err := syscall.Unmount(target, 0); err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount_linux.go b/vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount_linux.go deleted file mode 100644 index 8062bae42..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount_linux.go +++ /dev/null @@ -1,7 +0,0 @@ -package aufs - -import "syscall" - -func mount(source string, target string, fstype string, flags uintptr, data string) error { - return syscall.Mount(source, target, fstype, flags, data) -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount_unsupported.go b/vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount_unsupported.go deleted file mode 100644 index d030b0663..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/aufs/mount_unsupported.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !linux - -package aufs - -import "errors" - -// MsRemount declared to specify a non-linux system mount. -const MsRemount = 0 - -func mount(source string, target string, fstype string, flags uintptr, data string) (err error) { - return errors.New("mount is not implemented on this platform") -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/btrfs.go b/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/btrfs.go deleted file mode 100644 index 44420f11a..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/btrfs.go +++ /dev/null @@ -1,530 +0,0 @@ -// +build linux - -package btrfs - -/* -#include -#include -#include -#include - -static void set_name_btrfs_ioctl_vol_args_v2(struct btrfs_ioctl_vol_args_v2* btrfs_struct, const char* value) { - snprintf(btrfs_struct->name, BTRFS_SUBVOL_NAME_MAX, "%s", value); -} -*/ -import "C" - -import ( - "fmt" - "os" - "path" - "path/filepath" - "strings" - "syscall" - "unsafe" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/parsers" - "github.com/docker/go-units" - "github.com/opencontainers/runc/libcontainer/label" -) - -func init() { - graphdriver.Register("btrfs", Init) -} - -var ( - quotaEnabled = false - userDiskQuota = false -) - -type btrfsOptions struct { - minSpace uint64 - size uint64 -} - -// Init returns a new BTRFS driver. -// An error is returned if BTRFS is not supported. -func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (graphdriver.Driver, error) { - - fsMagic, err := graphdriver.GetFSMagic(home) - if err != nil { - return nil, err - } - - if fsMagic != graphdriver.FsMagicBtrfs { - return nil, graphdriver.ErrPrerequisites - } - - rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps) - if err != nil { - return nil, err - } - if err := idtools.MkdirAllAs(home, 0700, rootUID, rootGID); err != nil { - return nil, err - } - - if err := mount.MakePrivate(home); err != nil { - return nil, err - } - - opt, err := parseOptions(options) - if err != nil { - return nil, err - } - - if userDiskQuota { - if err := subvolEnableQuota(home); err != nil { - return nil, err - } - quotaEnabled = true - } - - driver := &Driver{ - home: home, - uidMaps: uidMaps, - gidMaps: gidMaps, - options: opt, - } - - return graphdriver.NewNaiveDiffDriver(driver, uidMaps, gidMaps), nil -} - -func parseOptions(opt []string) (btrfsOptions, error) { - var options btrfsOptions - for _, option := range opt { - key, val, err := parsers.ParseKeyValueOpt(option) - if err != nil { - return options, err - } - key = strings.ToLower(key) - switch key { - case "btrfs.min_space": - minSpace, err := units.RAMInBytes(val) - if err != nil { - return options, err - } - userDiskQuota = true - options.minSpace = uint64(minSpace) - default: - return options, fmt.Errorf("Unknown option %s", key) - } - } - return options, nil -} - -// Driver contains information about the filesystem mounted. -type Driver struct { - //root of the file system - home string - uidMaps []idtools.IDMap - gidMaps []idtools.IDMap - options btrfsOptions -} - -// String prints the name of the driver (btrfs). -func (d *Driver) String() string { - return "btrfs" -} - -// Status returns current driver information in a two dimensional string array. -// Output contains "Build Version" and "Library Version" of the btrfs libraries used. -// Version information can be used to check compatibility with your kernel. -func (d *Driver) Status() [][2]string { - status := [][2]string{} - if bv := btrfsBuildVersion(); bv != "-" { - status = append(status, [2]string{"Build Version", bv}) - } - if lv := btrfsLibVersion(); lv != -1 { - status = append(status, [2]string{"Library Version", fmt.Sprintf("%d", lv)}) - } - return status -} - -// GetMetadata returns empty metadata for this driver. -func (d *Driver) GetMetadata(id string) (map[string]string, error) { - return nil, nil -} - -// Cleanup unmounts the home directory. -func (d *Driver) Cleanup() error { - if quotaEnabled { - if err := subvolDisableQuota(d.home); err != nil { - return err - } - } - - return mount.Unmount(d.home) -} - -func free(p *C.char) { - C.free(unsafe.Pointer(p)) -} - -func openDir(path string) (*C.DIR, error) { - Cpath := C.CString(path) - defer free(Cpath) - - dir := C.opendir(Cpath) - if dir == nil { - return nil, fmt.Errorf("Can't open dir") - } - return dir, nil -} - -func closeDir(dir *C.DIR) { - if dir != nil { - C.closedir(dir) - } -} - -func getDirFd(dir *C.DIR) uintptr { - return uintptr(C.dirfd(dir)) -} - -func subvolCreate(path, name string) error { - dir, err := openDir(path) - if err != nil { - return err - } - defer closeDir(dir) - - var args C.struct_btrfs_ioctl_vol_args - for i, c := range []byte(name) { - args.name[i] = C.char(c) - } - - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, getDirFd(dir), C.BTRFS_IOC_SUBVOL_CREATE, - uintptr(unsafe.Pointer(&args))) - if errno != 0 { - return fmt.Errorf("Failed to create btrfs subvolume: %v", errno.Error()) - } - return nil -} - -func subvolSnapshot(src, dest, name string) error { - srcDir, err := openDir(src) - if err != nil { - return err - } - defer closeDir(srcDir) - - destDir, err := openDir(dest) - if err != nil { - return err - } - defer closeDir(destDir) - - var args C.struct_btrfs_ioctl_vol_args_v2 - args.fd = C.__s64(getDirFd(srcDir)) - - var cs = C.CString(name) - C.set_name_btrfs_ioctl_vol_args_v2(&args, cs) - C.free(unsafe.Pointer(cs)) - - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, getDirFd(destDir), C.BTRFS_IOC_SNAP_CREATE_V2, - uintptr(unsafe.Pointer(&args))) - if errno != 0 { - return fmt.Errorf("Failed to create btrfs snapshot: %v", errno.Error()) - } - return nil -} - -func isSubvolume(p string) (bool, error) { - var bufStat syscall.Stat_t - if err := syscall.Lstat(p, &bufStat); err != nil { - return false, err - } - - // return true if it is a btrfs subvolume - return bufStat.Ino == C.BTRFS_FIRST_FREE_OBJECTID, nil -} - -func subvolDelete(dirpath, name string) error { - dir, err := openDir(dirpath) - if err != nil { - return err - } - defer closeDir(dir) - fullPath := path.Join(dirpath, name) - - var args C.struct_btrfs_ioctl_vol_args - - // walk the btrfs subvolumes - walkSubvolumes := func(p string, f os.FileInfo, err error) error { - if err != nil { - if os.IsNotExist(err) && p != fullPath { - // missing most likely because the path was a subvolume that got removed in the previous iteration - // since it's gone anyway, we don't care - return nil - } - return fmt.Errorf("error walking subvolumes: %v", err) - } - // we want to check children only so skip itself - // it will be removed after the filepath walk anyways - if f.IsDir() && p != fullPath { - sv, err := isSubvolume(p) - if err != nil { - return fmt.Errorf("Failed to test if %s is a btrfs subvolume: %v", p, err) - } - if sv { - if err := subvolDelete(path.Dir(p), f.Name()); err != nil { - return fmt.Errorf("Failed to destroy btrfs child subvolume (%s) of parent (%s): %v", p, dirpath, err) - } - } - } - return nil - } - if err := filepath.Walk(path.Join(dirpath, name), walkSubvolumes); err != nil { - return fmt.Errorf("Recursively walking subvolumes for %s failed: %v", dirpath, err) - } - - // all subvolumes have been removed - // now remove the one originally passed in - for i, c := range []byte(name) { - args.name[i] = C.char(c) - } - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, getDirFd(dir), C.BTRFS_IOC_SNAP_DESTROY, - uintptr(unsafe.Pointer(&args))) - if errno != 0 { - return fmt.Errorf("Failed to destroy btrfs snapshot %s for %s: %v", dirpath, name, errno.Error()) - } - return nil -} - -func subvolEnableQuota(path string) error { - dir, err := openDir(path) - if err != nil { - return err - } - defer closeDir(dir) - - var args C.struct_btrfs_ioctl_quota_ctl_args - args.cmd = C.BTRFS_QUOTA_CTL_ENABLE - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, getDirFd(dir), C.BTRFS_IOC_QUOTA_CTL, - uintptr(unsafe.Pointer(&args))) - if errno != 0 { - return fmt.Errorf("Failed to enable btrfs quota for %s: %v", dir, errno.Error()) - } - - return nil -} - -func subvolDisableQuota(path string) error { - dir, err := openDir(path) - if err != nil { - return err - } - defer closeDir(dir) - - var args C.struct_btrfs_ioctl_quota_ctl_args - args.cmd = C.BTRFS_QUOTA_CTL_DISABLE - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, getDirFd(dir), C.BTRFS_IOC_QUOTA_CTL, - uintptr(unsafe.Pointer(&args))) - if errno != 0 { - return fmt.Errorf("Failed to disable btrfs quota for %s: %v", dir, errno.Error()) - } - - return nil -} - -func subvolRescanQuota(path string) error { - dir, err := openDir(path) - if err != nil { - return err - } - defer closeDir(dir) - - var args C.struct_btrfs_ioctl_quota_rescan_args - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, getDirFd(dir), C.BTRFS_IOC_QUOTA_RESCAN_WAIT, - uintptr(unsafe.Pointer(&args))) - if errno != 0 { - return fmt.Errorf("Failed to rescan btrfs quota for %s: %v", dir, errno.Error()) - } - - return nil -} - -func subvolLimitQgroup(path string, size uint64) error { - dir, err := openDir(path) - if err != nil { - return err - } - defer closeDir(dir) - - var args C.struct_btrfs_ioctl_qgroup_limit_args - args.lim.max_referenced = C.__u64(size) - args.lim.flags = C.BTRFS_QGROUP_LIMIT_MAX_RFER - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, getDirFd(dir), C.BTRFS_IOC_QGROUP_LIMIT, - uintptr(unsafe.Pointer(&args))) - if errno != 0 { - return fmt.Errorf("Failed to limit qgroup for %s: %v", dir, errno.Error()) - } - - return nil -} - -func (d *Driver) subvolumesDir() string { - return path.Join(d.home, "subvolumes") -} - -func (d *Driver) subvolumesDirID(id string) string { - return path.Join(d.subvolumesDir(), id) -} - -// CreateReadWrite creates a layer that is writable for use as a container -// file system. -func (d *Driver) CreateReadWrite(id, parent string, opts *graphdriver.CreateOpts) error { - return d.Create(id, parent, opts) -} - -// Create the filesystem with given id. -func (d *Driver) Create(id, parent string, opts *graphdriver.CreateOpts) error { - subvolumes := path.Join(d.home, "subvolumes") - rootUID, rootGID, err := idtools.GetRootUIDGID(d.uidMaps, d.gidMaps) - if err != nil { - return err - } - if err := idtools.MkdirAllAs(subvolumes, 0700, rootUID, rootGID); err != nil { - return err - } - if parent == "" { - if err := subvolCreate(subvolumes, id); err != nil { - return err - } - } else { - parentDir := d.subvolumesDirID(parent) - st, err := os.Stat(parentDir) - if err != nil { - return err - } - if !st.IsDir() { - return fmt.Errorf("%s: not a directory", parentDir) - } - if err := subvolSnapshot(parentDir, subvolumes, id); err != nil { - return err - } - } - - var storageOpt map[string]string - if opts != nil { - storageOpt = opts.StorageOpt - } - - if _, ok := storageOpt["size"]; ok { - driver := &Driver{} - if err := d.parseStorageOpt(storageOpt, driver); err != nil { - return err - } - if err := d.setStorageSize(path.Join(subvolumes, id), driver); err != nil { - return err - } - } - - // if we have a remapped root (user namespaces enabled), change the created snapshot - // dir ownership to match - if rootUID != 0 || rootGID != 0 { - if err := os.Chown(path.Join(subvolumes, id), rootUID, rootGID); err != nil { - return err - } - } - - mountLabel := "" - if opts != nil { - mountLabel = opts.MountLabel - } - - return label.Relabel(path.Join(subvolumes, id), mountLabel, false) -} - -// Parse btrfs storage options -func (d *Driver) parseStorageOpt(storageOpt map[string]string, driver *Driver) error { - // Read size to change the subvolume disk quota per container - for key, val := range storageOpt { - key := strings.ToLower(key) - switch key { - case "size": - size, err := units.RAMInBytes(val) - if err != nil { - return err - } - driver.options.size = uint64(size) - default: - return fmt.Errorf("Unknown option %s", key) - } - } - - return nil -} - -// Set btrfs storage size -func (d *Driver) setStorageSize(dir string, driver *Driver) error { - if driver.options.size <= 0 { - return fmt.Errorf("btrfs: invalid storage size: %s", units.HumanSize(float64(driver.options.size))) - } - if d.options.minSpace > 0 && driver.options.size < d.options.minSpace { - return fmt.Errorf("btrfs: storage size cannot be less than %s", units.HumanSize(float64(d.options.minSpace))) - } - - if !quotaEnabled { - if err := subvolEnableQuota(d.home); err != nil { - return err - } - quotaEnabled = true - } - - if err := subvolLimitQgroup(dir, driver.options.size); err != nil { - return err - } - - return nil -} - -// Remove the filesystem with given id. -func (d *Driver) Remove(id string) error { - dir := d.subvolumesDirID(id) - if _, err := os.Stat(dir); err != nil { - return err - } - if err := subvolDelete(d.subvolumesDir(), id); err != nil { - return err - } - if err := os.RemoveAll(dir); err != nil && !os.IsNotExist(err) { - return err - } - if err := subvolRescanQuota(d.home); err != nil { - return err - } - return nil -} - -// Get the requested filesystem id. -func (d *Driver) Get(id, mountLabel string) (string, error) { - dir := d.subvolumesDirID(id) - st, err := os.Stat(dir) - if err != nil { - return "", err - } - - if !st.IsDir() { - return "", fmt.Errorf("%s: not a directory", dir) - } - - return dir, nil -} - -// Put is not implemented for BTRFS as there is no cleanup required for the id. -func (d *Driver) Put(id string) error { - // Get() creates no runtime resources (like e.g. mounts) - // so this doesn't need to do anything. - return nil -} - -// Exists checks if the id exists in the filesystem. -func (d *Driver) Exists(id string) bool { - dir := d.subvolumesDirID(id) - _, err := os.Stat(dir) - return err == nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/btrfs_test.go b/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/btrfs_test.go deleted file mode 100644 index 0038dbcdc..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/btrfs_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// +build linux - -package btrfs - -import ( - "os" - "path" - "testing" - - "github.com/docker/docker/daemon/graphdriver/graphtest" -) - -// This avoids creating a new driver for each test if all tests are run -// Make sure to put new tests between TestBtrfsSetup and TestBtrfsTeardown -func TestBtrfsSetup(t *testing.T) { - graphtest.GetDriver(t, "btrfs") -} - -func TestBtrfsCreateEmpty(t *testing.T) { - graphtest.DriverTestCreateEmpty(t, "btrfs") -} - -func TestBtrfsCreateBase(t *testing.T) { - graphtest.DriverTestCreateBase(t, "btrfs") -} - -func TestBtrfsCreateSnap(t *testing.T) { - graphtest.DriverTestCreateSnap(t, "btrfs") -} - -func TestBtrfsSubvolDelete(t *testing.T) { - d := graphtest.GetDriver(t, "btrfs") - if err := d.CreateReadWrite("test", "", nil); err != nil { - t.Fatal(err) - } - defer graphtest.PutDriver(t) - - dir, err := d.Get("test", "") - if err != nil { - t.Fatal(err) - } - defer d.Put("test") - - if err := subvolCreate(dir, "subvoltest"); err != nil { - t.Fatal(err) - } - - if _, err := os.Stat(path.Join(dir, "subvoltest")); err != nil { - t.Fatal(err) - } - - if err := d.Remove("test"); err != nil { - t.Fatal(err) - } - - if _, err := os.Stat(path.Join(dir, "subvoltest")); !os.IsNotExist(err) { - t.Fatalf("expected not exist error on nested subvol, got: %v", err) - } -} - -func TestBtrfsTeardown(t *testing.T) { - graphtest.PutDriver(t) -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/dummy_unsupported.go b/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/dummy_unsupported.go deleted file mode 100644 index f07088887..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/dummy_unsupported.go +++ /dev/null @@ -1,3 +0,0 @@ -// +build !linux !cgo - -package btrfs diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version.go b/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version.go deleted file mode 100644 index 73d90cdd7..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version.go +++ /dev/null @@ -1,26 +0,0 @@ -// +build linux,!btrfs_noversion - -package btrfs - -/* -#include - -// around version 3.16, they did not define lib version yet -#ifndef BTRFS_LIB_VERSION -#define BTRFS_LIB_VERSION -1 -#endif - -// upstream had removed it, but now it will be coming back -#ifndef BTRFS_BUILD_VERSION -#define BTRFS_BUILD_VERSION "-" -#endif -*/ -import "C" - -func btrfsBuildVersion() string { - return string(C.BTRFS_BUILD_VERSION) -} - -func btrfsLibVersion() int { - return int(C.BTRFS_LIB_VERSION) -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version_none.go b/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version_none.go deleted file mode 100644 index f802fbc62..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version_none.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build linux,btrfs_noversion - -package btrfs - -// TODO(vbatts) remove this work-around once supported linux distros are on -// btrfs utilities of >= 3.16.1 - -func btrfsBuildVersion() string { - return "-" -} - -func btrfsLibVersion() int { - return -1 -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version_test.go b/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version_test.go deleted file mode 100644 index 15a6e75cb..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/btrfs/version_test.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build linux,!btrfs_noversion - -package btrfs - -import ( - "testing" -) - -func TestLibVersion(t *testing.T) { - if btrfsLibVersion() <= 0 { - t.Errorf("expected output from btrfs lib version > 0") - } -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/counter.go b/vendor/github.com/docker/docker/daemon/graphdriver/counter.go deleted file mode 100644 index 5ea604f5b..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/counter.go +++ /dev/null @@ -1,67 +0,0 @@ -package graphdriver - -import "sync" - -type minfo struct { - check bool - count int -} - -// RefCounter is a generic counter for use by graphdriver Get/Put calls -type RefCounter struct { - counts map[string]*minfo - mu sync.Mutex - checker Checker -} - -// NewRefCounter returns a new RefCounter -func NewRefCounter(c Checker) *RefCounter { - return &RefCounter{ - checker: c, - counts: make(map[string]*minfo), - } -} - -// Increment increaes the ref count for the given id and returns the current count -func (c *RefCounter) Increment(path string) int { - c.mu.Lock() - m := c.counts[path] - if m == nil { - m = &minfo{} - c.counts[path] = m - } - // if we are checking this path for the first time check to make sure - // if it was already mounted on the system and make sure we have a correct ref - // count if it is mounted as it is in use. - if !m.check { - m.check = true - if c.checker.IsMounted(path) { - m.count++ - } - } - m.count++ - c.mu.Unlock() - return m.count -} - -// Decrement decreases the ref count for the given id and returns the current count -func (c *RefCounter) Decrement(path string) int { - c.mu.Lock() - m := c.counts[path] - if m == nil { - m = &minfo{} - c.counts[path] = m - } - // if we are checking this path for the first time check to make sure - // if it was already mounted on the system and make sure we have a correct ref - // count if it is mounted as it is in use. - if !m.check { - m.check = true - if c.checker.IsMounted(path) { - m.count++ - } - } - m.count-- - c.mu.Unlock() - return m.count -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/README.md b/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/README.md deleted file mode 100644 index b23bbb107..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/README.md +++ /dev/null @@ -1,96 +0,0 @@ -## devicemapper - a storage backend based on Device Mapper - -### Theory of operation - -The device mapper graphdriver uses the device mapper thin provisioning -module (dm-thinp) to implement CoW snapshots. The preferred model is -to have a thin pool reserved outside of Docker and passed to the -daemon via the `--storage-opt dm.thinpooldev` option. - -As a fallback if no thin pool is provided, loopback files will be -created. Loopback is very slow, but can be used without any -pre-configuration of storage. It is strongly recommended that you do -not use loopback in production. Ensure your Docker daemon has a -`--storage-opt dm.thinpooldev` argument provided. - -In loopback, a thin pool is created at `/var/lib/docker/devicemapper` -(devicemapper graph location) based on two block devices, one for -data and one for metadata. By default these block devices are created -automatically by using loopback mounts of automatically created sparse -files. - -The default loopback files used are -`/var/lib/docker/devicemapper/devicemapper/data` and -`/var/lib/docker/devicemapper/devicemapper/metadata`. Additional metadata -required to map from docker entities to the corresponding devicemapper -volumes is stored in the `/var/lib/docker/devicemapper/devicemapper/json` -file (encoded as Json). - -In order to support multiple devicemapper graphs on a system, the thin -pool will be named something like: `docker-0:33-19478248-pool`, where -the `0:33` part is the minor/major device nr and `19478248` is the -inode number of the `/var/lib/docker/devicemapper` directory. - -On the thin pool, docker automatically creates a base thin device, -called something like `docker-0:33-19478248-base` of a fixed -size. This is automatically formatted with an empty filesystem on -creation. This device is the base of all docker images and -containers. All base images are snapshots of this device and those -images are then in turn used as snapshots for other images and -eventually containers. - -### Information on `docker info` - -As of docker-1.4.1, `docker info` when using the `devicemapper` storage driver -will display something like: - - $ sudo docker info - [...] - Storage Driver: devicemapper - Pool Name: docker-253:1-17538953-pool - Pool Blocksize: 65.54 kB - Base Device Size: 107.4 GB - Data file: /dev/loop4 - Metadata file: /dev/loop4 - Data Space Used: 2.536 GB - Data Space Total: 107.4 GB - Data Space Available: 104.8 GB - Metadata Space Used: 7.93 MB - Metadata Space Total: 2.147 GB - Metadata Space Available: 2.14 GB - Udev Sync Supported: true - Data loop file: /home/docker/devicemapper/devicemapper/data - Metadata loop file: /home/docker/devicemapper/devicemapper/metadata - Library Version: 1.02.82-git (2013-10-04) - [...] - -#### status items - -Each item in the indented section under `Storage Driver: devicemapper` are -status information about the driver. - * `Pool Name` name of the devicemapper pool for this driver. - * `Pool Blocksize` tells the blocksize the thin pool was initialized with. This only changes on creation. - * `Base Device Size` tells the maximum size of a container and image - * `Data file` blockdevice file used for the devicemapper data - * `Metadata file` blockdevice file used for the devicemapper metadata - * `Data Space Used` tells how much of `Data file` is currently used - * `Data Space Total` tells max size the `Data file` - * `Data Space Available` tells how much free space there is in the `Data file`. If you are using a loop device this will report the actual space available to the loop device on the underlying filesystem. - * `Metadata Space Used` tells how much of `Metadata file` is currently used - * `Metadata Space Total` tells max size the `Metadata file` - * `Metadata Space Available` tells how much free space there is in the `Metadata file`. If you are using a loop device this will report the actual space available to the loop device on the underlying filesystem. - * `Udev Sync Supported` tells whether devicemapper is able to sync with Udev. Should be `true`. - * `Data loop file` file attached to `Data file`, if loopback device is used - * `Metadata loop file` file attached to `Metadata file`, if loopback device is used - * `Library Version` from the libdevmapper used - -### About the devicemapper options - -The devicemapper backend supports some options that you can specify -when starting the docker daemon using the `--storage-opt` flags. -This uses the `dm` prefix and would be used something like `docker daemon --storage-opt dm.foo=bar`. - -These options are currently documented both in [the man -page](../../../man/docker.1.md) and in [the online -documentation](https://docs.docker.com/engine/reference/commandline/dockerd/#/storage-driver-options). -If you add an options, update both the `man` page and the documentation. diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/deviceset.go b/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/deviceset.go deleted file mode 100644 index b8e762592..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/deviceset.go +++ /dev/null @@ -1,2727 +0,0 @@ -// +build linux - -package devmapper - -import ( - "bufio" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "strconv" - "strings" - "sync" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/pkg/devicemapper" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/loopback" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/parsers" - "github.com/docker/go-units" - - "github.com/opencontainers/runc/libcontainer/label" -) - -var ( - defaultDataLoopbackSize int64 = 100 * 1024 * 1024 * 1024 - defaultMetaDataLoopbackSize int64 = 2 * 1024 * 1024 * 1024 - defaultBaseFsSize uint64 = 10 * 1024 * 1024 * 1024 - defaultThinpBlockSize uint32 = 128 // 64K = 128 512b sectors - defaultUdevSyncOverride = false - maxDeviceID = 0xffffff // 24 bit, pool limit - deviceIDMapSz = (maxDeviceID + 1) / 8 - // We retry device removal so many a times that even error messages - // will fill up console during normal operation. So only log Fatal - // messages by default. - logLevel = devicemapper.LogLevelFatal - driverDeferredRemovalSupport = false - enableDeferredRemoval = false - enableDeferredDeletion = false - userBaseSize = false - defaultMinFreeSpacePercent uint32 = 10 -) - -const deviceSetMetaFile string = "deviceset-metadata" -const transactionMetaFile string = "transaction-metadata" - -type transaction struct { - OpenTransactionID uint64 `json:"open_transaction_id"` - DeviceIDHash string `json:"device_hash"` - DeviceID int `json:"device_id"` -} - -type devInfo struct { - Hash string `json:"-"` - DeviceID int `json:"device_id"` - Size uint64 `json:"size"` - TransactionID uint64 `json:"transaction_id"` - Initialized bool `json:"initialized"` - Deleted bool `json:"deleted"` - devices *DeviceSet - - // The global DeviceSet lock guarantees that we serialize all - // the calls to libdevmapper (which is not threadsafe), but we - // sometimes release that lock while sleeping. In that case - // this per-device lock is still held, protecting against - // other accesses to the device that we're doing the wait on. - // - // WARNING: In order to avoid AB-BA deadlocks when releasing - // the global lock while holding the per-device locks all - // device locks must be acquired *before* the device lock, and - // multiple device locks should be acquired parent before child. - lock sync.Mutex -} - -type metaData struct { - Devices map[string]*devInfo `json:"Devices"` -} - -// DeviceSet holds information about list of devices -type DeviceSet struct { - metaData `json:"-"` - sync.Mutex `json:"-"` // Protects all fields of DeviceSet and serializes calls into libdevmapper - root string - devicePrefix string - TransactionID uint64 `json:"-"` - NextDeviceID int `json:"next_device_id"` - deviceIDMap []byte - - // Options - dataLoopbackSize int64 - metaDataLoopbackSize int64 - baseFsSize uint64 - filesystem string - mountOptions string - mkfsArgs []string - dataDevice string // block or loop dev - dataLoopFile string // loopback file, if used - metadataDevice string // block or loop dev - metadataLoopFile string // loopback file, if used - doBlkDiscard bool - thinpBlockSize uint32 - thinPoolDevice string - transaction `json:"-"` - overrideUdevSyncCheck bool - deferredRemove bool // use deferred removal - deferredDelete bool // use deferred deletion - BaseDeviceUUID string // save UUID of base device - BaseDeviceFilesystem string // save filesystem of base device - nrDeletedDevices uint // number of deleted devices - deletionWorkerTicker *time.Ticker - uidMaps []idtools.IDMap - gidMaps []idtools.IDMap - minFreeSpacePercent uint32 //min free space percentage in thinpool - xfsNospaceRetries string // max retries when xfs receives ENOSPC -} - -// DiskUsage contains information about disk usage and is used when reporting Status of a device. -type DiskUsage struct { - // Used bytes on the disk. - Used uint64 - // Total bytes on the disk. - Total uint64 - // Available bytes on the disk. - Available uint64 -} - -// Status returns the information about the device. -type Status struct { - // PoolName is the name of the data pool. - PoolName string - // DataFile is the actual block device for data. - DataFile string - // DataLoopback loopback file, if used. - DataLoopback string - // MetadataFile is the actual block device for metadata. - MetadataFile string - // MetadataLoopback is the loopback file, if used. - MetadataLoopback string - // Data is the disk used for data. - Data DiskUsage - // Metadata is the disk used for meta data. - Metadata DiskUsage - // BaseDeviceSize is base size of container and image - BaseDeviceSize uint64 - // BaseDeviceFS is backing filesystem. - BaseDeviceFS string - // SectorSize size of the vector. - SectorSize uint64 - // UdevSyncSupported is true if sync is supported. - UdevSyncSupported bool - // DeferredRemoveEnabled is true then the device is not unmounted. - DeferredRemoveEnabled bool - // True if deferred deletion is enabled. This is different from - // deferred removal. "removal" means that device mapper device is - // deactivated. Thin device is still in thin pool and can be activated - // again. But "deletion" means that thin device will be deleted from - // thin pool and it can't be activated again. - DeferredDeleteEnabled bool - DeferredDeletedDeviceCount uint - MinFreeSpace uint64 -} - -// Structure used to export image/container metadata in docker inspect. -type deviceMetadata struct { - deviceID int - deviceSize uint64 // size in bytes - deviceName string // Device name as used during activation -} - -// DevStatus returns information about device mounted containing its id, size and sector information. -type DevStatus struct { - // DeviceID is the id of the device. - DeviceID int - // Size is the size of the filesystem. - Size uint64 - // TransactionID is a unique integer per device set used to identify an operation on the file system, this number is incremental. - TransactionID uint64 - // SizeInSectors indicates the size of the sectors allocated. - SizeInSectors uint64 - // MappedSectors indicates number of mapped sectors. - MappedSectors uint64 - // HighestMappedSector is the pointer to the highest mapped sector. - HighestMappedSector uint64 -} - -func getDevName(name string) string { - return "/dev/mapper/" + name -} - -func (info *devInfo) Name() string { - hash := info.Hash - if hash == "" { - hash = "base" - } - return fmt.Sprintf("%s-%s", info.devices.devicePrefix, hash) -} - -func (info *devInfo) DevName() string { - return getDevName(info.Name()) -} - -func (devices *DeviceSet) loopbackDir() string { - return path.Join(devices.root, "devicemapper") -} - -func (devices *DeviceSet) metadataDir() string { - return path.Join(devices.root, "metadata") -} - -func (devices *DeviceSet) metadataFile(info *devInfo) string { - file := info.Hash - if file == "" { - file = "base" - } - return path.Join(devices.metadataDir(), file) -} - -func (devices *DeviceSet) transactionMetaFile() string { - return path.Join(devices.metadataDir(), transactionMetaFile) -} - -func (devices *DeviceSet) deviceSetMetaFile() string { - return path.Join(devices.metadataDir(), deviceSetMetaFile) -} - -func (devices *DeviceSet) oldMetadataFile() string { - return path.Join(devices.loopbackDir(), "json") -} - -func (devices *DeviceSet) getPoolName() string { - if devices.thinPoolDevice == "" { - return devices.devicePrefix + "-pool" - } - return devices.thinPoolDevice -} - -func (devices *DeviceSet) getPoolDevName() string { - return getDevName(devices.getPoolName()) -} - -func (devices *DeviceSet) hasImage(name string) bool { - dirname := devices.loopbackDir() - filename := path.Join(dirname, name) - - _, err := os.Stat(filename) - return err == nil -} - -// ensureImage creates a sparse file of bytes at the path -// /devicemapper/. -// If the file already exists and new size is larger than its current size, it grows to the new size. -// Either way it returns the full path. -func (devices *DeviceSet) ensureImage(name string, size int64) (string, error) { - dirname := devices.loopbackDir() - filename := path.Join(dirname, name) - - uid, gid, err := idtools.GetRootUIDGID(devices.uidMaps, devices.gidMaps) - if err != nil { - return "", err - } - if err := idtools.MkdirAllAs(dirname, 0700, uid, gid); err != nil && !os.IsExist(err) { - return "", err - } - - if fi, err := os.Stat(filename); err != nil { - if !os.IsNotExist(err) { - return "", err - } - logrus.Debugf("devmapper: Creating loopback file %s for device-manage use", filename) - file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0600) - if err != nil { - return "", err - } - defer file.Close() - - if err := file.Truncate(size); err != nil { - return "", err - } - } else { - if fi.Size() < size { - file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0600) - if err != nil { - return "", err - } - defer file.Close() - if err := file.Truncate(size); err != nil { - return "", fmt.Errorf("devmapper: Unable to grow loopback file %s: %v", filename, err) - } - } else if fi.Size() > size { - logrus.Warnf("devmapper: Can't shrink loopback file %s", filename) - } - } - return filename, nil -} - -func (devices *DeviceSet) allocateTransactionID() uint64 { - devices.OpenTransactionID = devices.TransactionID + 1 - return devices.OpenTransactionID -} - -func (devices *DeviceSet) updatePoolTransactionID() error { - if err := devicemapper.SetTransactionID(devices.getPoolDevName(), devices.TransactionID, devices.OpenTransactionID); err != nil { - return fmt.Errorf("devmapper: Error setting devmapper transaction ID: %s", err) - } - devices.TransactionID = devices.OpenTransactionID - return nil -} - -func (devices *DeviceSet) removeMetadata(info *devInfo) error { - if err := os.RemoveAll(devices.metadataFile(info)); err != nil { - return fmt.Errorf("devmapper: Error removing metadata file %s: %s", devices.metadataFile(info), err) - } - return nil -} - -// Given json data and file path, write it to disk -func (devices *DeviceSet) writeMetaFile(jsonData []byte, filePath string) error { - tmpFile, err := ioutil.TempFile(devices.metadataDir(), ".tmp") - if err != nil { - return fmt.Errorf("devmapper: Error creating metadata file: %s", err) - } - - n, err := tmpFile.Write(jsonData) - if err != nil { - return fmt.Errorf("devmapper: Error writing metadata to %s: %s", tmpFile.Name(), err) - } - if n < len(jsonData) { - return io.ErrShortWrite - } - if err := tmpFile.Sync(); err != nil { - return fmt.Errorf("devmapper: Error syncing metadata file %s: %s", tmpFile.Name(), err) - } - if err := tmpFile.Close(); err != nil { - return fmt.Errorf("devmapper: Error closing metadata file %s: %s", tmpFile.Name(), err) - } - if err := os.Rename(tmpFile.Name(), filePath); err != nil { - return fmt.Errorf("devmapper: Error committing metadata file %s: %s", tmpFile.Name(), err) - } - - return nil -} - -func (devices *DeviceSet) saveMetadata(info *devInfo) error { - jsonData, err := json.Marshal(info) - if err != nil { - return fmt.Errorf("devmapper: Error encoding metadata to json: %s", err) - } - if err := devices.writeMetaFile(jsonData, devices.metadataFile(info)); err != nil { - return err - } - return nil -} - -func (devices *DeviceSet) markDeviceIDUsed(deviceID int) { - var mask byte - i := deviceID % 8 - mask = 1 << uint(i) - devices.deviceIDMap[deviceID/8] = devices.deviceIDMap[deviceID/8] | mask -} - -func (devices *DeviceSet) markDeviceIDFree(deviceID int) { - var mask byte - i := deviceID % 8 - mask = ^(1 << uint(i)) - devices.deviceIDMap[deviceID/8] = devices.deviceIDMap[deviceID/8] & mask -} - -func (devices *DeviceSet) isDeviceIDFree(deviceID int) bool { - var mask byte - i := deviceID % 8 - mask = (1 << uint(i)) - if (devices.deviceIDMap[deviceID/8] & mask) != 0 { - return false - } - return true -} - -// Should be called with devices.Lock() held. -func (devices *DeviceSet) lookupDevice(hash string) (*devInfo, error) { - info := devices.Devices[hash] - if info == nil { - info = devices.loadMetadata(hash) - if info == nil { - return nil, fmt.Errorf("devmapper: Unknown device %s", hash) - } - - devices.Devices[hash] = info - } - return info, nil -} - -func (devices *DeviceSet) lookupDeviceWithLock(hash string) (*devInfo, error) { - devices.Lock() - defer devices.Unlock() - info, err := devices.lookupDevice(hash) - return info, err -} - -// This function relies on that device hash map has been loaded in advance. -// Should be called with devices.Lock() held. -func (devices *DeviceSet) constructDeviceIDMap() { - logrus.Debug("devmapper: constructDeviceIDMap()") - defer logrus.Debug("devmapper: constructDeviceIDMap() END") - - for _, info := range devices.Devices { - devices.markDeviceIDUsed(info.DeviceID) - logrus.Debugf("devmapper: Added deviceId=%d to DeviceIdMap", info.DeviceID) - } -} - -func (devices *DeviceSet) deviceFileWalkFunction(path string, finfo os.FileInfo) error { - - // Skip some of the meta files which are not device files. - if strings.HasSuffix(finfo.Name(), ".migrated") { - logrus.Debugf("devmapper: Skipping file %s", path) - return nil - } - - if strings.HasPrefix(finfo.Name(), ".") { - logrus.Debugf("devmapper: Skipping file %s", path) - return nil - } - - if finfo.Name() == deviceSetMetaFile { - logrus.Debugf("devmapper: Skipping file %s", path) - return nil - } - - if finfo.Name() == transactionMetaFile { - logrus.Debugf("devmapper: Skipping file %s", path) - return nil - } - - logrus.Debugf("devmapper: Loading data for file %s", path) - - hash := finfo.Name() - if hash == "base" { - hash = "" - } - - // Include deleted devices also as cleanup delete device logic - // will go through it and see if there are any deleted devices. - if _, err := devices.lookupDevice(hash); err != nil { - return fmt.Errorf("devmapper: Error looking up device %s:%v", hash, err) - } - - return nil -} - -func (devices *DeviceSet) loadDeviceFilesOnStart() error { - logrus.Debug("devmapper: loadDeviceFilesOnStart()") - defer logrus.Debug("devmapper: loadDeviceFilesOnStart() END") - - var scan = func(path string, info os.FileInfo, err error) error { - if err != nil { - logrus.Debugf("devmapper: Can't walk the file %s", path) - return nil - } - - // Skip any directories - if info.IsDir() { - return nil - } - - return devices.deviceFileWalkFunction(path, info) - } - - return filepath.Walk(devices.metadataDir(), scan) -} - -// Should be called with devices.Lock() held. -func (devices *DeviceSet) unregisterDevice(id int, hash string) error { - logrus.Debugf("devmapper: unregisterDevice(%v, %v)", id, hash) - info := &devInfo{ - Hash: hash, - DeviceID: id, - } - - delete(devices.Devices, hash) - - if err := devices.removeMetadata(info); err != nil { - logrus.Debugf("devmapper: Error removing metadata: %s", err) - return err - } - - return nil -} - -// Should be called with devices.Lock() held. -func (devices *DeviceSet) registerDevice(id int, hash string, size uint64, transactionID uint64) (*devInfo, error) { - logrus.Debugf("devmapper: registerDevice(%v, %v)", id, hash) - info := &devInfo{ - Hash: hash, - DeviceID: id, - Size: size, - TransactionID: transactionID, - Initialized: false, - devices: devices, - } - - devices.Devices[hash] = info - - if err := devices.saveMetadata(info); err != nil { - // Try to remove unused device - delete(devices.Devices, hash) - return nil, err - } - - return info, nil -} - -func (devices *DeviceSet) activateDeviceIfNeeded(info *devInfo, ignoreDeleted bool) error { - logrus.Debugf("devmapper: activateDeviceIfNeeded(%v)", info.Hash) - - if info.Deleted && !ignoreDeleted { - return fmt.Errorf("devmapper: Can't activate device %v as it is marked for deletion", info.Hash) - } - - // Make sure deferred removal on device is canceled, if one was - // scheduled. - if err := devices.cancelDeferredRemovalIfNeeded(info); err != nil { - return fmt.Errorf("devmapper: Device Deferred Removal Cancellation Failed: %s", err) - } - - if devinfo, _ := devicemapper.GetInfo(info.Name()); devinfo != nil && devinfo.Exists != 0 { - return nil - } - - return devicemapper.ActivateDevice(devices.getPoolDevName(), info.Name(), info.DeviceID, info.Size) -} - -// Return true only if kernel supports xfs and mkfs.xfs is available -func xfsSupported() bool { - // Make sure mkfs.xfs is available - if _, err := exec.LookPath("mkfs.xfs"); err != nil { - return false - } - - // Check if kernel supports xfs filesystem or not. - exec.Command("modprobe", "xfs").Run() - - f, err := os.Open("/proc/filesystems") - if err != nil { - logrus.Warnf("devmapper: Could not check if xfs is supported: %v", err) - return false - } - defer f.Close() - - s := bufio.NewScanner(f) - for s.Scan() { - if strings.HasSuffix(s.Text(), "\txfs") { - return true - } - } - - if err := s.Err(); err != nil { - logrus.Warnf("devmapper: Could not check if xfs is supported: %v", err) - } - return false -} - -func determineDefaultFS() string { - if xfsSupported() { - return "xfs" - } - - logrus.Warn("devmapper: XFS is not supported in your system. Either the kernel doesn't support it or mkfs.xfs is not in your PATH. Defaulting to ext4 filesystem") - return "ext4" -} - -func (devices *DeviceSet) createFilesystem(info *devInfo) (err error) { - devname := info.DevName() - - args := []string{} - args = append(args, devices.mkfsArgs...) - - args = append(args, devname) - - if devices.filesystem == "" { - devices.filesystem = determineDefaultFS() - } - if err := devices.saveBaseDeviceFilesystem(devices.filesystem); err != nil { - return err - } - - logrus.Infof("devmapper: Creating filesystem %s on device %s", devices.filesystem, info.Name()) - defer func() { - if err != nil { - logrus.Infof("devmapper: Error while creating filesystem %s on device %s: %v", devices.filesystem, info.Name(), err) - } else { - logrus.Infof("devmapper: Successfully created filesystem %s on device %s", devices.filesystem, info.Name()) - } - }() - - switch devices.filesystem { - case "xfs": - err = exec.Command("mkfs.xfs", args...).Run() - case "ext4": - err = exec.Command("mkfs.ext4", append([]string{"-E", "nodiscard,lazy_itable_init=0,lazy_journal_init=0"}, args...)...).Run() - if err != nil { - err = exec.Command("mkfs.ext4", append([]string{"-E", "nodiscard,lazy_itable_init=0"}, args...)...).Run() - } - if err != nil { - return err - } - err = exec.Command("tune2fs", append([]string{"-c", "-1", "-i", "0"}, devname)...).Run() - default: - err = fmt.Errorf("devmapper: Unsupported filesystem type %s", devices.filesystem) - } - return -} - -func (devices *DeviceSet) migrateOldMetaData() error { - // Migrate old metadata file - jsonData, err := ioutil.ReadFile(devices.oldMetadataFile()) - if err != nil && !os.IsNotExist(err) { - return err - } - - if jsonData != nil { - m := metaData{Devices: make(map[string]*devInfo)} - - if err := json.Unmarshal(jsonData, &m); err != nil { - return err - } - - for hash, info := range m.Devices { - info.Hash = hash - devices.saveMetadata(info) - } - if err := os.Rename(devices.oldMetadataFile(), devices.oldMetadataFile()+".migrated"); err != nil { - return err - } - - } - - return nil -} - -// Cleanup deleted devices. It assumes that all the devices have been -// loaded in the hash table. -func (devices *DeviceSet) cleanupDeletedDevices() error { - devices.Lock() - - // If there are no deleted devices, there is nothing to do. - if devices.nrDeletedDevices == 0 { - devices.Unlock() - return nil - } - - var deletedDevices []*devInfo - - for _, info := range devices.Devices { - if !info.Deleted { - continue - } - logrus.Debugf("devmapper: Found deleted device %s.", info.Hash) - deletedDevices = append(deletedDevices, info) - } - - // Delete the deleted devices. DeleteDevice() first takes the info lock - // and then devices.Lock(). So drop it to avoid deadlock. - devices.Unlock() - - for _, info := range deletedDevices { - // This will again try deferred deletion. - if err := devices.DeleteDevice(info.Hash, false); err != nil { - logrus.Warnf("devmapper: Deletion of device %s, device_id=%v failed:%v", info.Hash, info.DeviceID, err) - } - } - - return nil -} - -func (devices *DeviceSet) countDeletedDevices() { - for _, info := range devices.Devices { - if !info.Deleted { - continue - } - devices.nrDeletedDevices++ - } -} - -func (devices *DeviceSet) startDeviceDeletionWorker() { - // Deferred deletion is not enabled. Don't do anything. - if !devices.deferredDelete { - return - } - - logrus.Debug("devmapper: Worker to cleanup deleted devices started") - for range devices.deletionWorkerTicker.C { - devices.cleanupDeletedDevices() - } -} - -func (devices *DeviceSet) initMetaData() error { - devices.Lock() - defer devices.Unlock() - - if err := devices.migrateOldMetaData(); err != nil { - return err - } - - _, transactionID, _, _, _, _, err := devices.poolStatus() - if err != nil { - return err - } - - devices.TransactionID = transactionID - - if err := devices.loadDeviceFilesOnStart(); err != nil { - return fmt.Errorf("devmapper: Failed to load device files:%v", err) - } - - devices.constructDeviceIDMap() - devices.countDeletedDevices() - - if err := devices.processPendingTransaction(); err != nil { - return err - } - - // Start a goroutine to cleanup Deleted Devices - go devices.startDeviceDeletionWorker() - return nil -} - -func (devices *DeviceSet) incNextDeviceID() { - // IDs are 24bit, so wrap around - devices.NextDeviceID = (devices.NextDeviceID + 1) & maxDeviceID -} - -func (devices *DeviceSet) getNextFreeDeviceID() (int, error) { - devices.incNextDeviceID() - for i := 0; i <= maxDeviceID; i++ { - if devices.isDeviceIDFree(devices.NextDeviceID) { - devices.markDeviceIDUsed(devices.NextDeviceID) - return devices.NextDeviceID, nil - } - devices.incNextDeviceID() - } - - return 0, fmt.Errorf("devmapper: Unable to find a free device ID") -} - -func (devices *DeviceSet) poolHasFreeSpace() error { - if devices.minFreeSpacePercent == 0 { - return nil - } - - _, _, dataUsed, dataTotal, metadataUsed, metadataTotal, err := devices.poolStatus() - if err != nil { - return err - } - - minFreeData := (dataTotal * uint64(devices.minFreeSpacePercent)) / 100 - if minFreeData < 1 { - minFreeData = 1 - } - dataFree := dataTotal - dataUsed - if dataFree < minFreeData { - return fmt.Errorf("devmapper: Thin Pool has %v free data blocks which is less than minimum required %v free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior", (dataTotal - dataUsed), minFreeData) - } - - minFreeMetadata := (metadataTotal * uint64(devices.minFreeSpacePercent)) / 100 - if minFreeMetadata < 1 { - minFreeMetadata = 1 - } - - metadataFree := metadataTotal - metadataUsed - if metadataFree < minFreeMetadata { - return fmt.Errorf("devmapper: Thin Pool has %v free metadata blocks which is less than minimum required %v free metadata blocks. Create more free metadata space in thin pool or use dm.min_free_space option to change behavior", (metadataTotal - metadataUsed), minFreeMetadata) - } - - return nil -} - -func (devices *DeviceSet) createRegisterDevice(hash string) (*devInfo, error) { - devices.Lock() - defer devices.Unlock() - - deviceID, err := devices.getNextFreeDeviceID() - if err != nil { - return nil, err - } - - if err := devices.openTransaction(hash, deviceID); err != nil { - logrus.Debugf("devmapper: Error opening transaction hash = %s deviceID = %d", hash, deviceID) - devices.markDeviceIDFree(deviceID) - return nil, err - } - - for { - if err := devicemapper.CreateDevice(devices.getPoolDevName(), deviceID); err != nil { - if devicemapper.DeviceIDExists(err) { - // Device ID already exists. This should not - // happen. Now we have a mechanism to find - // a free device ID. So something is not right. - // Give a warning and continue. - logrus.Errorf("devmapper: Device ID %d exists in pool but it is supposed to be unused", deviceID) - deviceID, err = devices.getNextFreeDeviceID() - if err != nil { - return nil, err - } - // Save new device id into transaction - devices.refreshTransaction(deviceID) - continue - } - logrus.Debugf("devmapper: Error creating device: %s", err) - devices.markDeviceIDFree(deviceID) - return nil, err - } - break - } - - logrus.Debugf("devmapper: Registering device (id %v) with FS size %v", deviceID, devices.baseFsSize) - info, err := devices.registerDevice(deviceID, hash, devices.baseFsSize, devices.OpenTransactionID) - if err != nil { - _ = devicemapper.DeleteDevice(devices.getPoolDevName(), deviceID) - devices.markDeviceIDFree(deviceID) - return nil, err - } - - if err := devices.closeTransaction(); err != nil { - devices.unregisterDevice(deviceID, hash) - devicemapper.DeleteDevice(devices.getPoolDevName(), deviceID) - devices.markDeviceIDFree(deviceID) - return nil, err - } - return info, nil -} - -func (devices *DeviceSet) takeSnapshot(hash string, baseInfo *devInfo, size uint64) error { - var ( - devinfo *devicemapper.Info - err error - ) - - if err = devices.poolHasFreeSpace(); err != nil { - return err - } - - if devices.deferredRemove { - devinfo, err = devicemapper.GetInfoWithDeferred(baseInfo.Name()) - if err != nil { - return err - } - if devinfo != nil && devinfo.DeferredRemove != 0 { - err = devices.cancelDeferredRemoval(baseInfo) - if err != nil { - // If Error is ErrEnxio. Device is probably already gone. Continue. - if err != devicemapper.ErrEnxio { - return err - } - } else { - defer devices.deactivateDevice(baseInfo) - } - } - } else { - devinfo, err = devicemapper.GetInfo(baseInfo.Name()) - if err != nil { - return err - } - } - - doSuspend := devinfo != nil && devinfo.Exists != 0 - - if doSuspend { - if err = devicemapper.SuspendDevice(baseInfo.Name()); err != nil { - return err - } - defer devicemapper.ResumeDevice(baseInfo.Name()) - } - - if err = devices.createRegisterSnapDevice(hash, baseInfo, size); err != nil { - return err - } - - return nil -} - -func (devices *DeviceSet) createRegisterSnapDevice(hash string, baseInfo *devInfo, size uint64) error { - deviceID, err := devices.getNextFreeDeviceID() - if err != nil { - return err - } - - if err := devices.openTransaction(hash, deviceID); err != nil { - logrus.Debugf("devmapper: Error opening transaction hash = %s deviceID = %d", hash, deviceID) - devices.markDeviceIDFree(deviceID) - return err - } - - for { - if err := devicemapper.CreateSnapDeviceRaw(devices.getPoolDevName(), deviceID, baseInfo.DeviceID); err != nil { - if devicemapper.DeviceIDExists(err) { - // Device ID already exists. This should not - // happen. Now we have a mechanism to find - // a free device ID. So something is not right. - // Give a warning and continue. - logrus.Errorf("devmapper: Device ID %d exists in pool but it is supposed to be unused", deviceID) - deviceID, err = devices.getNextFreeDeviceID() - if err != nil { - return err - } - // Save new device id into transaction - devices.refreshTransaction(deviceID) - continue - } - logrus.Debugf("devmapper: Error creating snap device: %s", err) - devices.markDeviceIDFree(deviceID) - return err - } - break - } - - if _, err := devices.registerDevice(deviceID, hash, size, devices.OpenTransactionID); err != nil { - devicemapper.DeleteDevice(devices.getPoolDevName(), deviceID) - devices.markDeviceIDFree(deviceID) - logrus.Debugf("devmapper: Error registering device: %s", err) - return err - } - - if err := devices.closeTransaction(); err != nil { - devices.unregisterDevice(deviceID, hash) - devicemapper.DeleteDevice(devices.getPoolDevName(), deviceID) - devices.markDeviceIDFree(deviceID) - return err - } - return nil -} - -func (devices *DeviceSet) loadMetadata(hash string) *devInfo { - info := &devInfo{Hash: hash, devices: devices} - - jsonData, err := ioutil.ReadFile(devices.metadataFile(info)) - if err != nil { - logrus.Debugf("devmapper: Failed to read %s with err: %v", devices.metadataFile(info), err) - return nil - } - - if err := json.Unmarshal(jsonData, &info); err != nil { - logrus.Debugf("devmapper: Failed to unmarshal devInfo from %s with err: %v", devices.metadataFile(info), err) - return nil - } - - if info.DeviceID > maxDeviceID { - logrus.Errorf("devmapper: Ignoring Invalid DeviceId=%d", info.DeviceID) - return nil - } - - return info -} - -func getDeviceUUID(device string) (string, error) { - out, err := exec.Command("blkid", "-s", "UUID", "-o", "value", device).Output() - if err != nil { - return "", fmt.Errorf("devmapper: Failed to find uuid for device %s:%v", device, err) - } - - uuid := strings.TrimSuffix(string(out), "\n") - uuid = strings.TrimSpace(uuid) - logrus.Debugf("devmapper: UUID for device: %s is:%s", device, uuid) - return uuid, nil -} - -func (devices *DeviceSet) getBaseDeviceSize() uint64 { - info, _ := devices.lookupDevice("") - if info == nil { - return 0 - } - return info.Size -} - -func (devices *DeviceSet) getBaseDeviceFS() string { - return devices.BaseDeviceFilesystem -} - -func (devices *DeviceSet) verifyBaseDeviceUUIDFS(baseInfo *devInfo) error { - devices.Lock() - defer devices.Unlock() - - if err := devices.activateDeviceIfNeeded(baseInfo, false); err != nil { - return err - } - defer devices.deactivateDevice(baseInfo) - - uuid, err := getDeviceUUID(baseInfo.DevName()) - if err != nil { - return err - } - - if devices.BaseDeviceUUID != uuid { - return fmt.Errorf("devmapper: Current Base Device UUID:%s does not match with stored UUID:%s. Possibly using a different thin pool than last invocation", uuid, devices.BaseDeviceUUID) - } - - if devices.BaseDeviceFilesystem == "" { - fsType, err := ProbeFsType(baseInfo.DevName()) - if err != nil { - return err - } - if err := devices.saveBaseDeviceFilesystem(fsType); err != nil { - return err - } - } - - // If user specified a filesystem using dm.fs option and current - // file system of base image is not same, warn user that dm.fs - // will be ignored. - if devices.BaseDeviceFilesystem != devices.filesystem { - logrus.Warnf("devmapper: Base device already exists and has filesystem %s on it. User specified filesystem %s will be ignored.", devices.BaseDeviceFilesystem, devices.filesystem) - devices.filesystem = devices.BaseDeviceFilesystem - } - return nil -} - -func (devices *DeviceSet) saveBaseDeviceFilesystem(fs string) error { - devices.BaseDeviceFilesystem = fs - return devices.saveDeviceSetMetaData() -} - -func (devices *DeviceSet) saveBaseDeviceUUID(baseInfo *devInfo) error { - devices.Lock() - defer devices.Unlock() - - if err := devices.activateDeviceIfNeeded(baseInfo, false); err != nil { - return err - } - defer devices.deactivateDevice(baseInfo) - - uuid, err := getDeviceUUID(baseInfo.DevName()) - if err != nil { - return err - } - - devices.BaseDeviceUUID = uuid - return devices.saveDeviceSetMetaData() -} - -func (devices *DeviceSet) createBaseImage() error { - logrus.Debug("devmapper: Initializing base device-mapper thin volume") - - // Create initial device - info, err := devices.createRegisterDevice("") - if err != nil { - return err - } - - logrus.Debug("devmapper: Creating filesystem on base device-mapper thin volume") - - if err := devices.activateDeviceIfNeeded(info, false); err != nil { - return err - } - - if err := devices.createFilesystem(info); err != nil { - return err - } - - info.Initialized = true - if err := devices.saveMetadata(info); err != nil { - info.Initialized = false - return err - } - - if err := devices.saveBaseDeviceUUID(info); err != nil { - return fmt.Errorf("devmapper: Could not query and save base device UUID:%v", err) - } - - return nil -} - -// Returns if thin pool device exists or not. If device exists, also makes -// sure it is a thin pool device and not some other type of device. -func (devices *DeviceSet) thinPoolExists(thinPoolDevice string) (bool, error) { - logrus.Debugf("devmapper: Checking for existence of the pool %s", thinPoolDevice) - - info, err := devicemapper.GetInfo(thinPoolDevice) - if err != nil { - return false, fmt.Errorf("devmapper: GetInfo() on device %s failed: %v", thinPoolDevice, err) - } - - // Device does not exist. - if info.Exists == 0 { - return false, nil - } - - _, _, deviceType, _, err := devicemapper.GetStatus(thinPoolDevice) - if err != nil { - return false, fmt.Errorf("devmapper: GetStatus() on device %s failed: %v", thinPoolDevice, err) - } - - if deviceType != "thin-pool" { - return false, fmt.Errorf("devmapper: Device %s is not a thin pool", thinPoolDevice) - } - - return true, nil -} - -func (devices *DeviceSet) checkThinPool() error { - _, transactionID, dataUsed, _, _, _, err := devices.poolStatus() - if err != nil { - return err - } - if dataUsed != 0 { - return fmt.Errorf("devmapper: Unable to take ownership of thin-pool (%s) that already has used data blocks", - devices.thinPoolDevice) - } - if transactionID != 0 { - return fmt.Errorf("devmapper: Unable to take ownership of thin-pool (%s) with non-zero transaction ID", - devices.thinPoolDevice) - } - return nil -} - -// Base image is initialized properly. Either save UUID for first time (for -// upgrade case or verify UUID. -func (devices *DeviceSet) setupVerifyBaseImageUUIDFS(baseInfo *devInfo) error { - // If BaseDeviceUUID is nil (upgrade case), save it and return success. - if devices.BaseDeviceUUID == "" { - if err := devices.saveBaseDeviceUUID(baseInfo); err != nil { - return fmt.Errorf("devmapper: Could not query and save base device UUID:%v", err) - } - return nil - } - - if err := devices.verifyBaseDeviceUUIDFS(baseInfo); err != nil { - return fmt.Errorf("devmapper: Base Device UUID and Filesystem verification failed: %v", err) - } - - return nil -} - -func (devices *DeviceSet) checkGrowBaseDeviceFS(info *devInfo) error { - - if !userBaseSize { - return nil - } - - if devices.baseFsSize < devices.getBaseDeviceSize() { - return fmt.Errorf("devmapper: Base device size cannot be smaller than %s", units.HumanSize(float64(devices.getBaseDeviceSize()))) - } - - if devices.baseFsSize == devices.getBaseDeviceSize() { - return nil - } - - info.lock.Lock() - defer info.lock.Unlock() - - devices.Lock() - defer devices.Unlock() - - info.Size = devices.baseFsSize - - if err := devices.saveMetadata(info); err != nil { - // Try to remove unused device - delete(devices.Devices, info.Hash) - return err - } - - return devices.growFS(info) -} - -func (devices *DeviceSet) growFS(info *devInfo) error { - if err := devices.activateDeviceIfNeeded(info, false); err != nil { - return fmt.Errorf("Error activating devmapper device: %s", err) - } - - defer devices.deactivateDevice(info) - - fsMountPoint := "/run/docker/mnt" - if _, err := os.Stat(fsMountPoint); os.IsNotExist(err) { - if err := os.MkdirAll(fsMountPoint, 0700); err != nil { - return err - } - defer os.RemoveAll(fsMountPoint) - } - - options := "" - if devices.BaseDeviceFilesystem == "xfs" { - // XFS needs nouuid or it can't mount filesystems with the same fs - options = joinMountOptions(options, "nouuid") - } - options = joinMountOptions(options, devices.mountOptions) - - if err := mount.Mount(info.DevName(), fsMountPoint, devices.BaseDeviceFilesystem, options); err != nil { - return fmt.Errorf("Error mounting '%s' on '%s': %s", info.DevName(), fsMountPoint, err) - } - - defer syscall.Unmount(fsMountPoint, syscall.MNT_DETACH) - - switch devices.BaseDeviceFilesystem { - case "ext4": - if out, err := exec.Command("resize2fs", info.DevName()).CombinedOutput(); err != nil { - return fmt.Errorf("Failed to grow rootfs:%v:%s", err, string(out)) - } - case "xfs": - if out, err := exec.Command("xfs_growfs", info.DevName()).CombinedOutput(); err != nil { - return fmt.Errorf("Failed to grow rootfs:%v:%s", err, string(out)) - } - default: - return fmt.Errorf("Unsupported filesystem type %s", devices.BaseDeviceFilesystem) - } - return nil -} - -func (devices *DeviceSet) setupBaseImage() error { - oldInfo, _ := devices.lookupDeviceWithLock("") - - // base image already exists. If it is initialized properly, do UUID - // verification and return. Otherwise remove image and set it up - // fresh. - - if oldInfo != nil { - if oldInfo.Initialized && !oldInfo.Deleted { - if err := devices.setupVerifyBaseImageUUIDFS(oldInfo); err != nil { - return err - } - - if err := devices.checkGrowBaseDeviceFS(oldInfo); err != nil { - return err - } - - return nil - } - - logrus.Debug("devmapper: Removing uninitialized base image") - // If previous base device is in deferred delete state, - // that needs to be cleaned up first. So don't try - // deferred deletion. - if err := devices.DeleteDevice("", true); err != nil { - return err - } - } - - // If we are setting up base image for the first time, make sure - // thin pool is empty. - if devices.thinPoolDevice != "" && oldInfo == nil { - if err := devices.checkThinPool(); err != nil { - return err - } - } - - // Create new base image device - if err := devices.createBaseImage(); err != nil { - return err - } - - return nil -} - -func setCloseOnExec(name string) { - if fileInfos, _ := ioutil.ReadDir("/proc/self/fd"); fileInfos != nil { - for _, i := range fileInfos { - link, _ := os.Readlink(filepath.Join("/proc/self/fd", i.Name())) - if link == name { - fd, err := strconv.Atoi(i.Name()) - if err == nil { - syscall.CloseOnExec(fd) - } - } - } - } -} - -// DMLog implements logging using DevMapperLogger interface. -func (devices *DeviceSet) DMLog(level int, file string, line int, dmError int, message string) { - // By default libdm sends us all the messages including debug ones. - // We need to filter out messages here and figure out which one - // should be printed. - if level > logLevel { - return - } - - // FIXME(vbatts) push this back into ./pkg/devicemapper/ - if level <= devicemapper.LogLevelErr { - logrus.Errorf("libdevmapper(%d): %s:%d (%d) %s", level, file, line, dmError, message) - } else if level <= devicemapper.LogLevelInfo { - logrus.Infof("libdevmapper(%d): %s:%d (%d) %s", level, file, line, dmError, message) - } else { - // FIXME(vbatts) push this back into ./pkg/devicemapper/ - logrus.Debugf("libdevmapper(%d): %s:%d (%d) %s", level, file, line, dmError, message) - } -} - -func major(device uint64) uint64 { - return (device >> 8) & 0xfff -} - -func minor(device uint64) uint64 { - return (device & 0xff) | ((device >> 12) & 0xfff00) -} - -// ResizePool increases the size of the pool. -func (devices *DeviceSet) ResizePool(size int64) error { - dirname := devices.loopbackDir() - datafilename := path.Join(dirname, "data") - if len(devices.dataDevice) > 0 { - datafilename = devices.dataDevice - } - metadatafilename := path.Join(dirname, "metadata") - if len(devices.metadataDevice) > 0 { - metadatafilename = devices.metadataDevice - } - - datafile, err := os.OpenFile(datafilename, os.O_RDWR, 0) - if datafile == nil { - return err - } - defer datafile.Close() - - fi, err := datafile.Stat() - if fi == nil { - return err - } - - if fi.Size() > size { - return fmt.Errorf("devmapper: Can't shrink file") - } - - dataloopback := loopback.FindLoopDeviceFor(datafile) - if dataloopback == nil { - return fmt.Errorf("devmapper: Unable to find loopback mount for: %s", datafilename) - } - defer dataloopback.Close() - - metadatafile, err := os.OpenFile(metadatafilename, os.O_RDWR, 0) - if metadatafile == nil { - return err - } - defer metadatafile.Close() - - metadataloopback := loopback.FindLoopDeviceFor(metadatafile) - if metadataloopback == nil { - return fmt.Errorf("devmapper: Unable to find loopback mount for: %s", metadatafilename) - } - defer metadataloopback.Close() - - // Grow loopback file - if err := datafile.Truncate(size); err != nil { - return fmt.Errorf("devmapper: Unable to grow loopback file: %s", err) - } - - // Reload size for loopback device - if err := loopback.SetCapacity(dataloopback); err != nil { - return fmt.Errorf("Unable to update loopback capacity: %s", err) - } - - // Suspend the pool - if err := devicemapper.SuspendDevice(devices.getPoolName()); err != nil { - return fmt.Errorf("devmapper: Unable to suspend pool: %s", err) - } - - // Reload with the new block sizes - if err := devicemapper.ReloadPool(devices.getPoolName(), dataloopback, metadataloopback, devices.thinpBlockSize); err != nil { - return fmt.Errorf("devmapper: Unable to reload pool: %s", err) - } - - // Resume the pool - if err := devicemapper.ResumeDevice(devices.getPoolName()); err != nil { - return fmt.Errorf("devmapper: Unable to resume pool: %s", err) - } - - return nil -} - -func (devices *DeviceSet) loadTransactionMetaData() error { - jsonData, err := ioutil.ReadFile(devices.transactionMetaFile()) - if err != nil { - // There is no active transaction. This will be the case - // during upgrade. - if os.IsNotExist(err) { - devices.OpenTransactionID = devices.TransactionID - return nil - } - return err - } - - json.Unmarshal(jsonData, &devices.transaction) - return nil -} - -func (devices *DeviceSet) saveTransactionMetaData() error { - jsonData, err := json.Marshal(&devices.transaction) - if err != nil { - return fmt.Errorf("devmapper: Error encoding metadata to json: %s", err) - } - - return devices.writeMetaFile(jsonData, devices.transactionMetaFile()) -} - -func (devices *DeviceSet) removeTransactionMetaData() error { - if err := os.RemoveAll(devices.transactionMetaFile()); err != nil { - return err - } - return nil -} - -func (devices *DeviceSet) rollbackTransaction() error { - logrus.Debugf("devmapper: Rolling back open transaction: TransactionID=%d hash=%s device_id=%d", devices.OpenTransactionID, devices.DeviceIDHash, devices.DeviceID) - - // A device id might have already been deleted before transaction - // closed. In that case this call will fail. Just leave a message - // in case of failure. - if err := devicemapper.DeleteDevice(devices.getPoolDevName(), devices.DeviceID); err != nil { - logrus.Errorf("devmapper: Unable to delete device: %s", err) - } - - dinfo := &devInfo{Hash: devices.DeviceIDHash} - if err := devices.removeMetadata(dinfo); err != nil { - logrus.Errorf("devmapper: Unable to remove metadata: %s", err) - } else { - devices.markDeviceIDFree(devices.DeviceID) - } - - if err := devices.removeTransactionMetaData(); err != nil { - logrus.Errorf("devmapper: Unable to remove transaction meta file %s: %s", devices.transactionMetaFile(), err) - } - - return nil -} - -func (devices *DeviceSet) processPendingTransaction() error { - if err := devices.loadTransactionMetaData(); err != nil { - return err - } - - // If there was open transaction but pool transaction ID is same - // as open transaction ID, nothing to roll back. - if devices.TransactionID == devices.OpenTransactionID { - return nil - } - - // If open transaction ID is less than pool transaction ID, something - // is wrong. Bail out. - if devices.OpenTransactionID < devices.TransactionID { - logrus.Errorf("devmapper: Open Transaction id %d is less than pool transaction id %d", devices.OpenTransactionID, devices.TransactionID) - return nil - } - - // Pool transaction ID is not same as open transaction. There is - // a transaction which was not completed. - if err := devices.rollbackTransaction(); err != nil { - return fmt.Errorf("devmapper: Rolling back open transaction failed: %s", err) - } - - devices.OpenTransactionID = devices.TransactionID - return nil -} - -func (devices *DeviceSet) loadDeviceSetMetaData() error { - jsonData, err := ioutil.ReadFile(devices.deviceSetMetaFile()) - if err != nil { - // For backward compatibility return success if file does - // not exist. - if os.IsNotExist(err) { - return nil - } - return err - } - - return json.Unmarshal(jsonData, devices) -} - -func (devices *DeviceSet) saveDeviceSetMetaData() error { - jsonData, err := json.Marshal(devices) - if err != nil { - return fmt.Errorf("devmapper: Error encoding metadata to json: %s", err) - } - - return devices.writeMetaFile(jsonData, devices.deviceSetMetaFile()) -} - -func (devices *DeviceSet) openTransaction(hash string, DeviceID int) error { - devices.allocateTransactionID() - devices.DeviceIDHash = hash - devices.DeviceID = DeviceID - if err := devices.saveTransactionMetaData(); err != nil { - return fmt.Errorf("devmapper: Error saving transaction metadata: %s", err) - } - return nil -} - -func (devices *DeviceSet) refreshTransaction(DeviceID int) error { - devices.DeviceID = DeviceID - if err := devices.saveTransactionMetaData(); err != nil { - return fmt.Errorf("devmapper: Error saving transaction metadata: %s", err) - } - return nil -} - -func (devices *DeviceSet) closeTransaction() error { - if err := devices.updatePoolTransactionID(); err != nil { - logrus.Debug("devmapper: Failed to close Transaction") - return err - } - return nil -} - -func determineDriverCapabilities(version string) error { - /* - * Driver version 4.27.0 and greater support deferred activation - * feature. - */ - - logrus.Debugf("devicemapper: driver version is %s", version) - - versionSplit := strings.Split(version, ".") - major, err := strconv.Atoi(versionSplit[0]) - if err != nil { - return graphdriver.ErrNotSupported - } - - if major > 4 { - driverDeferredRemovalSupport = true - return nil - } - - if major < 4 { - return nil - } - - minor, err := strconv.Atoi(versionSplit[1]) - if err != nil { - return graphdriver.ErrNotSupported - } - - /* - * If major is 4 and minor is 27, then there is no need to - * check for patch level as it can not be less than 0. - */ - if minor >= 27 { - driverDeferredRemovalSupport = true - return nil - } - - return nil -} - -// Determine the major and minor number of loopback device -func getDeviceMajorMinor(file *os.File) (uint64, uint64, error) { - stat, err := file.Stat() - if err != nil { - return 0, 0, err - } - - dev := stat.Sys().(*syscall.Stat_t).Rdev - majorNum := major(dev) - minorNum := minor(dev) - - logrus.Debugf("devmapper: Major:Minor for device: %s is:%v:%v", file.Name(), majorNum, minorNum) - return majorNum, minorNum, nil -} - -// Given a file which is backing file of a loop back device, find the -// loopback device name and its major/minor number. -func getLoopFileDeviceMajMin(filename string) (string, uint64, uint64, error) { - file, err := os.Open(filename) - if err != nil { - logrus.Debugf("devmapper: Failed to open file %s", filename) - return "", 0, 0, err - } - - defer file.Close() - loopbackDevice := loopback.FindLoopDeviceFor(file) - if loopbackDevice == nil { - return "", 0, 0, fmt.Errorf("devmapper: Unable to find loopback mount for: %s", filename) - } - defer loopbackDevice.Close() - - Major, Minor, err := getDeviceMajorMinor(loopbackDevice) - if err != nil { - return "", 0, 0, err - } - return loopbackDevice.Name(), Major, Minor, nil -} - -// Get the major/minor numbers of thin pool data and metadata devices -func (devices *DeviceSet) getThinPoolDataMetaMajMin() (uint64, uint64, uint64, uint64, error) { - var params, poolDataMajMin, poolMetadataMajMin string - - _, _, _, params, err := devicemapper.GetTable(devices.getPoolName()) - if err != nil { - return 0, 0, 0, 0, err - } - - if _, err = fmt.Sscanf(params, "%s %s", &poolMetadataMajMin, &poolDataMajMin); err != nil { - return 0, 0, 0, 0, err - } - - logrus.Debugf("devmapper: poolDataMajMin=%s poolMetaMajMin=%s\n", poolDataMajMin, poolMetadataMajMin) - - poolDataMajMinorSplit := strings.Split(poolDataMajMin, ":") - poolDataMajor, err := strconv.ParseUint(poolDataMajMinorSplit[0], 10, 32) - if err != nil { - return 0, 0, 0, 0, err - } - - poolDataMinor, err := strconv.ParseUint(poolDataMajMinorSplit[1], 10, 32) - if err != nil { - return 0, 0, 0, 0, err - } - - poolMetadataMajMinorSplit := strings.Split(poolMetadataMajMin, ":") - poolMetadataMajor, err := strconv.ParseUint(poolMetadataMajMinorSplit[0], 10, 32) - if err != nil { - return 0, 0, 0, 0, err - } - - poolMetadataMinor, err := strconv.ParseUint(poolMetadataMajMinorSplit[1], 10, 32) - if err != nil { - return 0, 0, 0, 0, err - } - - return poolDataMajor, poolDataMinor, poolMetadataMajor, poolMetadataMinor, nil -} - -func (devices *DeviceSet) loadThinPoolLoopBackInfo() error { - poolDataMajor, poolDataMinor, poolMetadataMajor, poolMetadataMinor, err := devices.getThinPoolDataMetaMajMin() - if err != nil { - return err - } - - dirname := devices.loopbackDir() - - // data device has not been passed in. So there should be a data file - // which is being mounted as loop device. - if devices.dataDevice == "" { - datafilename := path.Join(dirname, "data") - dataLoopDevice, dataMajor, dataMinor, err := getLoopFileDeviceMajMin(datafilename) - if err != nil { - return err - } - - // Compare the two - if poolDataMajor == dataMajor && poolDataMinor == dataMinor { - devices.dataDevice = dataLoopDevice - devices.dataLoopFile = datafilename - } - - } - - // metadata device has not been passed in. So there should be a - // metadata file which is being mounted as loop device. - if devices.metadataDevice == "" { - metadatafilename := path.Join(dirname, "metadata") - metadataLoopDevice, metadataMajor, metadataMinor, err := getLoopFileDeviceMajMin(metadatafilename) - if err != nil { - return err - } - if poolMetadataMajor == metadataMajor && poolMetadataMinor == metadataMinor { - devices.metadataDevice = metadataLoopDevice - devices.metadataLoopFile = metadatafilename - } - } - - return nil -} - -func (devices *DeviceSet) enableDeferredRemovalDeletion() error { - - // If user asked for deferred removal then check both libdm library - // and kernel driver support deferred removal otherwise error out. - if enableDeferredRemoval { - if !driverDeferredRemovalSupport { - return fmt.Errorf("devmapper: Deferred removal can not be enabled as kernel does not support it") - } - if !devicemapper.LibraryDeferredRemovalSupport { - return fmt.Errorf("devmapper: Deferred removal can not be enabled as libdm does not support it") - } - logrus.Debug("devmapper: Deferred removal support enabled.") - devices.deferredRemove = true - } - - if enableDeferredDeletion { - if !devices.deferredRemove { - return fmt.Errorf("devmapper: Deferred deletion can not be enabled as deferred removal is not enabled. Enable deferred removal using --storage-opt dm.use_deferred_removal=true parameter") - } - logrus.Debug("devmapper: Deferred deletion support enabled.") - devices.deferredDelete = true - } - return nil -} - -func (devices *DeviceSet) initDevmapper(doInit bool) error { - // give ourselves to libdm as a log handler - devicemapper.LogInit(devices) - - version, err := devicemapper.GetDriverVersion() - if err != nil { - // Can't even get driver version, assume not supported - return graphdriver.ErrNotSupported - } - - if err := determineDriverCapabilities(version); err != nil { - return graphdriver.ErrNotSupported - } - - if err := devices.enableDeferredRemovalDeletion(); err != nil { - return err - } - - // https://github.com/docker/docker/issues/4036 - if supported := devicemapper.UdevSetSyncSupport(true); !supported { - if dockerversion.IAmStatic == "true" { - logrus.Error("devmapper: Udev sync is not supported. This will lead to data loss and unexpected behavior. Install a dynamic binary to use devicemapper or select a different storage driver. For more information, see https://docs.docker.com/engine/reference/commandline/daemon/#daemon-storage-driver-option") - } else { - logrus.Error("devmapper: Udev sync is not supported. This will lead to data loss and unexpected behavior. Install a more recent version of libdevmapper or select a different storage driver. For more information, see https://docs.docker.com/engine/reference/commandline/daemon/#daemon-storage-driver-option") - } - - if !devices.overrideUdevSyncCheck { - return graphdriver.ErrNotSupported - } - } - - //create the root dir of the devmapper driver ownership to match this - //daemon's remapped root uid/gid so containers can start properly - uid, gid, err := idtools.GetRootUIDGID(devices.uidMaps, devices.gidMaps) - if err != nil { - return err - } - if err := idtools.MkdirAs(devices.root, 0700, uid, gid); err != nil && !os.IsExist(err) { - return err - } - if err := os.MkdirAll(devices.metadataDir(), 0700); err != nil && !os.IsExist(err) { - return err - } - - // Set the device prefix from the device id and inode of the docker root dir - - st, err := os.Stat(devices.root) - if err != nil { - return fmt.Errorf("devmapper: Error looking up dir %s: %s", devices.root, err) - } - sysSt := st.Sys().(*syscall.Stat_t) - // "reg-" stands for "regular file". - // In the future we might use "dev-" for "device file", etc. - // docker-maj,min[-inode] stands for: - // - Managed by docker - // - The target of this device is at major and minor - // - If is defined, use that file inside the device as a loopback image. Otherwise use the device itself. - devices.devicePrefix = fmt.Sprintf("docker-%d:%d-%d", major(sysSt.Dev), minor(sysSt.Dev), sysSt.Ino) - logrus.Debugf("devmapper: Generated prefix: %s", devices.devicePrefix) - - // Check for the existence of the thin-pool device - poolExists, err := devices.thinPoolExists(devices.getPoolName()) - if err != nil { - return err - } - - // It seems libdevmapper opens this without O_CLOEXEC, and go exec will not close files - // that are not Close-on-exec, - // so we add this badhack to make sure it closes itself - setCloseOnExec("/dev/mapper/control") - - // Make sure the sparse images exist in /devicemapper/data and - // /devicemapper/metadata - - createdLoopback := false - - // If the pool doesn't exist, create it - if !poolExists && devices.thinPoolDevice == "" { - logrus.Debug("devmapper: Pool doesn't exist. Creating it.") - - var ( - dataFile *os.File - metadataFile *os.File - ) - - if devices.dataDevice == "" { - // Make sure the sparse images exist in /devicemapper/data - - hasData := devices.hasImage("data") - - if !doInit && !hasData { - return errors.New("loopback data file not found") - } - - if !hasData { - createdLoopback = true - } - - data, err := devices.ensureImage("data", devices.dataLoopbackSize) - if err != nil { - logrus.Debugf("devmapper: Error device ensureImage (data): %s", err) - return err - } - - dataFile, err = loopback.AttachLoopDevice(data) - if err != nil { - return err - } - devices.dataLoopFile = data - devices.dataDevice = dataFile.Name() - } else { - dataFile, err = os.OpenFile(devices.dataDevice, os.O_RDWR, 0600) - if err != nil { - return err - } - } - defer dataFile.Close() - - if devices.metadataDevice == "" { - // Make sure the sparse images exist in /devicemapper/metadata - - hasMetadata := devices.hasImage("metadata") - - if !doInit && !hasMetadata { - return errors.New("loopback metadata file not found") - } - - if !hasMetadata { - createdLoopback = true - } - - metadata, err := devices.ensureImage("metadata", devices.metaDataLoopbackSize) - if err != nil { - logrus.Debugf("devmapper: Error device ensureImage (metadata): %s", err) - return err - } - - metadataFile, err = loopback.AttachLoopDevice(metadata) - if err != nil { - return err - } - devices.metadataLoopFile = metadata - devices.metadataDevice = metadataFile.Name() - } else { - metadataFile, err = os.OpenFile(devices.metadataDevice, os.O_RDWR, 0600) - if err != nil { - return err - } - } - defer metadataFile.Close() - - if err := devicemapper.CreatePool(devices.getPoolName(), dataFile, metadataFile, devices.thinpBlockSize); err != nil { - return err - } - } - - // Pool already exists and caller did not pass us a pool. That means - // we probably created pool earlier and could not remove it as some - // containers were still using it. Detect some of the properties of - // pool, like is it using loop devices. - if poolExists && devices.thinPoolDevice == "" { - if err := devices.loadThinPoolLoopBackInfo(); err != nil { - logrus.Debugf("devmapper: Failed to load thin pool loopback device information:%v", err) - return err - } - } - - // If we didn't just create the data or metadata image, we need to - // load the transaction id and migrate old metadata - if !createdLoopback { - if err := devices.initMetaData(); err != nil { - return err - } - } - - if devices.thinPoolDevice == "" { - if devices.metadataLoopFile != "" || devices.dataLoopFile != "" { - logrus.Warn("devmapper: Usage of loopback devices is strongly discouraged for production use. Please use `--storage-opt dm.thinpooldev` or use `man docker` to refer to dm.thinpooldev section.") - } - } - - // Right now this loads only NextDeviceID. If there is more metadata - // down the line, we might have to move it earlier. - if err := devices.loadDeviceSetMetaData(); err != nil { - return err - } - - // Setup the base image - if doInit { - if err := devices.setupBaseImage(); err != nil { - logrus.Debugf("devmapper: Error device setupBaseImage: %s", err) - return err - } - } - - return nil -} - -// AddDevice adds a device and registers in the hash. -func (devices *DeviceSet) AddDevice(hash, baseHash string, storageOpt map[string]string) error { - logrus.Debugf("devmapper: AddDevice START(hash=%s basehash=%s)", hash, baseHash) - defer logrus.Debugf("devmapper: AddDevice END(hash=%s basehash=%s)", hash, baseHash) - - // If a deleted device exists, return error. - baseInfo, err := devices.lookupDeviceWithLock(baseHash) - if err != nil { - return err - } - - if baseInfo.Deleted { - return fmt.Errorf("devmapper: Base device %v has been marked for deferred deletion", baseInfo.Hash) - } - - baseInfo.lock.Lock() - defer baseInfo.lock.Unlock() - - devices.Lock() - defer devices.Unlock() - - // Also include deleted devices in case hash of new device is - // same as one of the deleted devices. - if info, _ := devices.lookupDevice(hash); info != nil { - return fmt.Errorf("devmapper: device %s already exists. Deleted=%v", hash, info.Deleted) - } - - size, err := devices.parseStorageOpt(storageOpt) - if err != nil { - return err - } - - if size == 0 { - size = baseInfo.Size - } - - if size < baseInfo.Size { - return fmt.Errorf("devmapper: Container size cannot be smaller than %s", units.HumanSize(float64(baseInfo.Size))) - } - - if err := devices.takeSnapshot(hash, baseInfo, size); err != nil { - return err - } - - // Grow the container rootfs. - if size > baseInfo.Size { - info, err := devices.lookupDevice(hash) - if err != nil { - return err - } - - if err := devices.growFS(info); err != nil { - return err - } - } - - return nil -} - -func (devices *DeviceSet) parseStorageOpt(storageOpt map[string]string) (uint64, error) { - - // Read size to change the block device size per container. - for key, val := range storageOpt { - key := strings.ToLower(key) - switch key { - case "size": - size, err := units.RAMInBytes(val) - if err != nil { - return 0, err - } - return uint64(size), nil - default: - return 0, fmt.Errorf("Unknown option %s", key) - } - } - - return 0, nil -} - -func (devices *DeviceSet) markForDeferredDeletion(info *devInfo) error { - // If device is already in deleted state, there is nothing to be done. - if info.Deleted { - return nil - } - - logrus.Debugf("devmapper: Marking device %s for deferred deletion.", info.Hash) - - info.Deleted = true - - // save device metadata to reflect deleted state. - if err := devices.saveMetadata(info); err != nil { - info.Deleted = false - return err - } - - devices.nrDeletedDevices++ - return nil -} - -// Should be called with devices.Lock() held. -func (devices *DeviceSet) deleteTransaction(info *devInfo, syncDelete bool) error { - if err := devices.openTransaction(info.Hash, info.DeviceID); err != nil { - logrus.Debugf("devmapper: Error opening transaction hash = %s deviceId = %d", "", info.DeviceID) - return err - } - - defer devices.closeTransaction() - - err := devicemapper.DeleteDevice(devices.getPoolDevName(), info.DeviceID) - if err != nil { - // If syncDelete is true, we want to return error. If deferred - // deletion is not enabled, we return an error. If error is - // something other then EBUSY, return an error. - if syncDelete || !devices.deferredDelete || err != devicemapper.ErrBusy { - logrus.Debugf("devmapper: Error deleting device: %s", err) - return err - } - } - - if err == nil { - if err := devices.unregisterDevice(info.DeviceID, info.Hash); err != nil { - return err - } - // If device was already in deferred delete state that means - // deletion was being tried again later. Reduce the deleted - // device count. - if info.Deleted { - devices.nrDeletedDevices-- - } - devices.markDeviceIDFree(info.DeviceID) - } else { - if err := devices.markForDeferredDeletion(info); err != nil { - return err - } - } - - return nil -} - -// Issue discard only if device open count is zero. -func (devices *DeviceSet) issueDiscard(info *devInfo) error { - logrus.Debugf("devmapper: issueDiscard START(device: %s).", info.Hash) - defer logrus.Debugf("devmapper: issueDiscard END(device: %s).", info.Hash) - // This is a workaround for the kernel not discarding block so - // on the thin pool when we remove a thinp device, so we do it - // manually. - // Even if device is deferred deleted, activate it and issue - // discards. - if err := devices.activateDeviceIfNeeded(info, true); err != nil { - return err - } - - devinfo, err := devicemapper.GetInfo(info.Name()) - if err != nil { - return err - } - - if devinfo.OpenCount != 0 { - logrus.Debugf("devmapper: Device: %s is in use. OpenCount=%d. Not issuing discards.", info.Hash, devinfo.OpenCount) - return nil - } - - if err := devicemapper.BlockDeviceDiscard(info.DevName()); err != nil { - logrus.Debugf("devmapper: Error discarding block on device: %s (ignoring)", err) - } - return nil -} - -// Should be called with devices.Lock() held. -func (devices *DeviceSet) deleteDevice(info *devInfo, syncDelete bool) error { - if devices.doBlkDiscard { - devices.issueDiscard(info) - } - - // Try to deactivate device in case it is active. - if err := devices.deactivateDevice(info); err != nil { - logrus.Debugf("devmapper: Error deactivating device: %s", err) - return err - } - - if err := devices.deleteTransaction(info, syncDelete); err != nil { - return err - } - - return nil -} - -// DeleteDevice will return success if device has been marked for deferred -// removal. If one wants to override that and want DeleteDevice() to fail if -// device was busy and could not be deleted, set syncDelete=true. -func (devices *DeviceSet) DeleteDevice(hash string, syncDelete bool) error { - logrus.Debugf("devmapper: DeleteDevice START(hash=%v syncDelete=%v)", hash, syncDelete) - defer logrus.Debugf("devmapper: DeleteDevice END(hash=%v syncDelete=%v)", hash, syncDelete) - info, err := devices.lookupDeviceWithLock(hash) - if err != nil { - return err - } - - info.lock.Lock() - defer info.lock.Unlock() - - devices.Lock() - defer devices.Unlock() - - return devices.deleteDevice(info, syncDelete) -} - -func (devices *DeviceSet) deactivatePool() error { - logrus.Debug("devmapper: deactivatePool() START") - defer logrus.Debug("devmapper: deactivatePool() END") - devname := devices.getPoolDevName() - - devinfo, err := devicemapper.GetInfo(devname) - if err != nil { - return err - } - - if devinfo.Exists == 0 { - return nil - } - if err := devicemapper.RemoveDevice(devname); err != nil { - return err - } - - if d, err := devicemapper.GetDeps(devname); err == nil { - logrus.Warnf("devmapper: device %s still has %d active dependents", devname, d.Count) - } - - return nil -} - -func (devices *DeviceSet) deactivateDevice(info *devInfo) error { - logrus.Debugf("devmapper: deactivateDevice START(%s)", info.Hash) - defer logrus.Debugf("devmapper: deactivateDevice END(%s)", info.Hash) - - devinfo, err := devicemapper.GetInfo(info.Name()) - if err != nil { - return err - } - - if devinfo.Exists == 0 { - return nil - } - - if devices.deferredRemove { - if err := devicemapper.RemoveDeviceDeferred(info.Name()); err != nil { - return err - } - } else { - if err := devices.removeDevice(info.Name()); err != nil { - return err - } - } - return nil -} - -// Issues the underlying dm remove operation. -func (devices *DeviceSet) removeDevice(devname string) error { - var err error - - logrus.Debugf("devmapper: removeDevice START(%s)", devname) - defer logrus.Debugf("devmapper: removeDevice END(%s)", devname) - - for i := 0; i < 200; i++ { - err = devicemapper.RemoveDevice(devname) - if err == nil { - break - } - if err != devicemapper.ErrBusy { - return err - } - - // If we see EBUSY it may be a transient error, - // sleep a bit a retry a few times. - devices.Unlock() - time.Sleep(100 * time.Millisecond) - devices.Lock() - } - - return err -} - -func (devices *DeviceSet) cancelDeferredRemovalIfNeeded(info *devInfo) error { - if !devices.deferredRemove { - return nil - } - - logrus.Debugf("devmapper: cancelDeferredRemovalIfNeeded START(%s)", info.Name()) - defer logrus.Debugf("devmapper: cancelDeferredRemovalIfNeeded END(%s)", info.Name()) - - devinfo, err := devicemapper.GetInfoWithDeferred(info.Name()) - if err != nil { - return err - } - - if devinfo != nil && devinfo.DeferredRemove == 0 { - return nil - } - - // Cancel deferred remove - if err := devices.cancelDeferredRemoval(info); err != nil { - // If Error is ErrEnxio. Device is probably already gone. Continue. - if err != devicemapper.ErrEnxio { - return err - } - } - return nil -} - -func (devices *DeviceSet) cancelDeferredRemoval(info *devInfo) error { - logrus.Debugf("devmapper: cancelDeferredRemoval START(%s)", info.Name()) - defer logrus.Debugf("devmapper: cancelDeferredRemoval END(%s)", info.Name()) - - var err error - - // Cancel deferred remove - for i := 0; i < 100; i++ { - err = devicemapper.CancelDeferredRemove(info.Name()) - if err != nil { - if err == devicemapper.ErrBusy { - // If we see EBUSY it may be a transient error, - // sleep a bit a retry a few times. - devices.Unlock() - time.Sleep(100 * time.Millisecond) - devices.Lock() - continue - } - } - break - } - return err -} - -// Shutdown shuts down the device by unmounting the root. -func (devices *DeviceSet) Shutdown(home string) error { - logrus.Debugf("devmapper: [deviceset %s] Shutdown()", devices.devicePrefix) - logrus.Debugf("devmapper: Shutting down DeviceSet: %s", devices.root) - defer logrus.Debugf("devmapper: [deviceset %s] Shutdown() END", devices.devicePrefix) - - // Stop deletion worker. This should start delivering new events to - // ticker channel. That means no new instance of cleanupDeletedDevice() - // will run after this call. If one instance is already running at - // the time of the call, it must be holding devices.Lock() and - // we will block on this lock till cleanup function exits. - devices.deletionWorkerTicker.Stop() - - devices.Lock() - // Save DeviceSet Metadata first. Docker kills all threads if they - // don't finish in certain time. It is possible that Shutdown() - // routine does not finish in time as we loop trying to deactivate - // some devices while these are busy. In that case shutdown() routine - // will be killed and we will not get a chance to save deviceset - // metadata. Hence save this early before trying to deactivate devices. - devices.saveDeviceSetMetaData() - - // ignore the error since it's just a best effort to not try to unmount something that's mounted - mounts, _ := mount.GetMounts() - mounted := make(map[string]bool, len(mounts)) - for _, mnt := range mounts { - mounted[mnt.Mountpoint] = true - } - - if err := filepath.Walk(path.Join(home, "mnt"), func(p string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if !info.IsDir() { - return nil - } - - if mounted[p] { - // We use MNT_DETACH here in case it is still busy in some running - // container. This means it'll go away from the global scope directly, - // and the device will be released when that container dies. - if err := syscall.Unmount(p, syscall.MNT_DETACH); err != nil { - logrus.Debugf("devmapper: Shutdown unmounting %s, error: %s", p, err) - } - } - - if devInfo, err := devices.lookupDevice(path.Base(p)); err != nil { - logrus.Debugf("devmapper: Shutdown lookup device %s, error: %s", path.Base(p), err) - } else { - if err := devices.deactivateDevice(devInfo); err != nil { - logrus.Debugf("devmapper: Shutdown deactivate %s , error: %s", devInfo.Hash, err) - } - } - - return nil - }); err != nil && !os.IsNotExist(err) { - devices.Unlock() - return err - } - - devices.Unlock() - - info, _ := devices.lookupDeviceWithLock("") - if info != nil { - info.lock.Lock() - devices.Lock() - if err := devices.deactivateDevice(info); err != nil { - logrus.Debugf("devmapper: Shutdown deactivate base , error: %s", err) - } - devices.Unlock() - info.lock.Unlock() - } - - devices.Lock() - if devices.thinPoolDevice == "" { - if err := devices.deactivatePool(); err != nil { - logrus.Debugf("devmapper: Shutdown deactivate pool , error: %s", err) - } - } - devices.Unlock() - - return nil -} - -// Recent XFS changes allow changing behavior of filesystem in case of errors. -// When thin pool gets full and XFS gets ENOSPC error, currently it tries -// IO infinitely and sometimes it can block the container process -// and process can't be killWith 0 value, XFS will not retry upon error -// and instead will shutdown filesystem. - -func (devices *DeviceSet) xfsSetNospaceRetries(info *devInfo) error { - dmDevicePath, err := os.Readlink(info.DevName()) - if err != nil { - return fmt.Errorf("devmapper: readlink failed for device %v:%v", info.DevName(), err) - } - - dmDeviceName := path.Base(dmDevicePath) - filePath := "/sys/fs/xfs/" + dmDeviceName + "/error/metadata/ENOSPC/max_retries" - maxRetriesFile, err := os.OpenFile(filePath, os.O_WRONLY, 0) - if err != nil { - return fmt.Errorf("devmapper: user specified daemon option dm.xfs_nospace_max_retries but it does not seem to be supported on this system :%v", err) - } - defer maxRetriesFile.Close() - - // Set max retries to 0 - _, err = maxRetriesFile.WriteString(devices.xfsNospaceRetries) - if err != nil { - return fmt.Errorf("devmapper: Failed to write string %v to file %v:%v", devices.xfsNospaceRetries, filePath, err) - } - return nil -} - -// MountDevice mounts the device if not already mounted. -func (devices *DeviceSet) MountDevice(hash, path, mountLabel string) error { - info, err := devices.lookupDeviceWithLock(hash) - if err != nil { - return err - } - - if info.Deleted { - return fmt.Errorf("devmapper: Can't mount device %v as it has been marked for deferred deletion", info.Hash) - } - - info.lock.Lock() - defer info.lock.Unlock() - - devices.Lock() - defer devices.Unlock() - - if err := devices.activateDeviceIfNeeded(info, false); err != nil { - return fmt.Errorf("devmapper: Error activating devmapper device for '%s': %s", hash, err) - } - - fstype, err := ProbeFsType(info.DevName()) - if err != nil { - return err - } - - options := "" - - if fstype == "xfs" { - // XFS needs nouuid or it can't mount filesystems with the same fs - options = joinMountOptions(options, "nouuid") - } - - options = joinMountOptions(options, devices.mountOptions) - options = joinMountOptions(options, label.FormatMountLabel("", mountLabel)) - - if err := mount.Mount(info.DevName(), path, fstype, options); err != nil { - return fmt.Errorf("devmapper: Error mounting '%s' on '%s': %s", info.DevName(), path, err) - } - - if fstype == "xfs" && devices.xfsNospaceRetries != "" { - if err := devices.xfsSetNospaceRetries(info); err != nil { - syscall.Unmount(path, syscall.MNT_DETACH) - devices.deactivateDevice(info) - return err - } - } - - return nil -} - -// UnmountDevice unmounts the device and removes it from hash. -func (devices *DeviceSet) UnmountDevice(hash, mountPath string) error { - logrus.Debugf("devmapper: UnmountDevice START(hash=%s)", hash) - defer logrus.Debugf("devmapper: UnmountDevice END(hash=%s)", hash) - - info, err := devices.lookupDeviceWithLock(hash) - if err != nil { - return err - } - - info.lock.Lock() - defer info.lock.Unlock() - - devices.Lock() - defer devices.Unlock() - - logrus.Debugf("devmapper: Unmount(%s)", mountPath) - if err := syscall.Unmount(mountPath, syscall.MNT_DETACH); err != nil { - return err - } - logrus.Debug("devmapper: Unmount done") - - if err := devices.deactivateDevice(info); err != nil { - return err - } - - return nil -} - -// HasDevice returns true if the device metadata exists. -func (devices *DeviceSet) HasDevice(hash string) bool { - info, _ := devices.lookupDeviceWithLock(hash) - return info != nil -} - -// List returns a list of device ids. -func (devices *DeviceSet) List() []string { - devices.Lock() - defer devices.Unlock() - - ids := make([]string, len(devices.Devices)) - i := 0 - for k := range devices.Devices { - ids[i] = k - i++ - } - return ids -} - -func (devices *DeviceSet) deviceStatus(devName string) (sizeInSectors, mappedSectors, highestMappedSector uint64, err error) { - var params string - _, sizeInSectors, _, params, err = devicemapper.GetStatus(devName) - if err != nil { - return - } - if _, err = fmt.Sscanf(params, "%d %d", &mappedSectors, &highestMappedSector); err == nil { - return - } - return -} - -// GetDeviceStatus provides size, mapped sectors -func (devices *DeviceSet) GetDeviceStatus(hash string) (*DevStatus, error) { - info, err := devices.lookupDeviceWithLock(hash) - if err != nil { - return nil, err - } - - info.lock.Lock() - defer info.lock.Unlock() - - devices.Lock() - defer devices.Unlock() - - status := &DevStatus{ - DeviceID: info.DeviceID, - Size: info.Size, - TransactionID: info.TransactionID, - } - - if err := devices.activateDeviceIfNeeded(info, false); err != nil { - return nil, fmt.Errorf("devmapper: Error activating devmapper device for '%s': %s", hash, err) - } - - sizeInSectors, mappedSectors, highestMappedSector, err := devices.deviceStatus(info.DevName()) - - if err != nil { - return nil, err - } - - status.SizeInSectors = sizeInSectors - status.MappedSectors = mappedSectors - status.HighestMappedSector = highestMappedSector - - return status, nil -} - -func (devices *DeviceSet) poolStatus() (totalSizeInSectors, transactionID, dataUsed, dataTotal, metadataUsed, metadataTotal uint64, err error) { - var params string - if _, totalSizeInSectors, _, params, err = devicemapper.GetStatus(devices.getPoolName()); err == nil { - _, err = fmt.Sscanf(params, "%d %d/%d %d/%d", &transactionID, &metadataUsed, &metadataTotal, &dataUsed, &dataTotal) - } - return -} - -// DataDevicePath returns the path to the data storage for this deviceset, -// regardless of loopback or block device -func (devices *DeviceSet) DataDevicePath() string { - return devices.dataDevice -} - -// MetadataDevicePath returns the path to the metadata storage for this deviceset, -// regardless of loopback or block device -func (devices *DeviceSet) MetadataDevicePath() string { - return devices.metadataDevice -} - -func (devices *DeviceSet) getUnderlyingAvailableSpace(loopFile string) (uint64, error) { - buf := new(syscall.Statfs_t) - if err := syscall.Statfs(loopFile, buf); err != nil { - logrus.Warnf("devmapper: Couldn't stat loopfile filesystem %v: %v", loopFile, err) - return 0, err - } - return buf.Bfree * uint64(buf.Bsize), nil -} - -func (devices *DeviceSet) isRealFile(loopFile string) (bool, error) { - if loopFile != "" { - fi, err := os.Stat(loopFile) - if err != nil { - logrus.Warnf("devmapper: Couldn't stat loopfile %v: %v", loopFile, err) - return false, err - } - return fi.Mode().IsRegular(), nil - } - return false, nil -} - -// Status returns the current status of this deviceset -func (devices *DeviceSet) Status() *Status { - devices.Lock() - defer devices.Unlock() - - status := &Status{} - - status.PoolName = devices.getPoolName() - status.DataFile = devices.DataDevicePath() - status.DataLoopback = devices.dataLoopFile - status.MetadataFile = devices.MetadataDevicePath() - status.MetadataLoopback = devices.metadataLoopFile - status.UdevSyncSupported = devicemapper.UdevSyncSupported() - status.DeferredRemoveEnabled = devices.deferredRemove - status.DeferredDeleteEnabled = devices.deferredDelete - status.DeferredDeletedDeviceCount = devices.nrDeletedDevices - status.BaseDeviceSize = devices.getBaseDeviceSize() - status.BaseDeviceFS = devices.getBaseDeviceFS() - - totalSizeInSectors, _, dataUsed, dataTotal, metadataUsed, metadataTotal, err := devices.poolStatus() - if err == nil { - // Convert from blocks to bytes - blockSizeInSectors := totalSizeInSectors / dataTotal - - status.Data.Used = dataUsed * blockSizeInSectors * 512 - status.Data.Total = dataTotal * blockSizeInSectors * 512 - status.Data.Available = status.Data.Total - status.Data.Used - - // metadata blocks are always 4k - status.Metadata.Used = metadataUsed * 4096 - status.Metadata.Total = metadataTotal * 4096 - status.Metadata.Available = status.Metadata.Total - status.Metadata.Used - - status.SectorSize = blockSizeInSectors * 512 - - if check, _ := devices.isRealFile(devices.dataLoopFile); check { - actualSpace, err := devices.getUnderlyingAvailableSpace(devices.dataLoopFile) - if err == nil && actualSpace < status.Data.Available { - status.Data.Available = actualSpace - } - } - - if check, _ := devices.isRealFile(devices.metadataLoopFile); check { - actualSpace, err := devices.getUnderlyingAvailableSpace(devices.metadataLoopFile) - if err == nil && actualSpace < status.Metadata.Available { - status.Metadata.Available = actualSpace - } - } - - minFreeData := (dataTotal * uint64(devices.minFreeSpacePercent)) / 100 - status.MinFreeSpace = minFreeData * blockSizeInSectors * 512 - } - - return status -} - -// Status returns the current status of this deviceset -func (devices *DeviceSet) exportDeviceMetadata(hash string) (*deviceMetadata, error) { - info, err := devices.lookupDeviceWithLock(hash) - if err != nil { - return nil, err - } - - info.lock.Lock() - defer info.lock.Unlock() - - metadata := &deviceMetadata{info.DeviceID, info.Size, info.Name()} - return metadata, nil -} - -// NewDeviceSet creates the device set based on the options provided. -func NewDeviceSet(root string, doInit bool, options []string, uidMaps, gidMaps []idtools.IDMap) (*DeviceSet, error) { - devicemapper.SetDevDir("/dev") - - devices := &DeviceSet{ - root: root, - metaData: metaData{Devices: make(map[string]*devInfo)}, - dataLoopbackSize: defaultDataLoopbackSize, - metaDataLoopbackSize: defaultMetaDataLoopbackSize, - baseFsSize: defaultBaseFsSize, - overrideUdevSyncCheck: defaultUdevSyncOverride, - doBlkDiscard: true, - thinpBlockSize: defaultThinpBlockSize, - deviceIDMap: make([]byte, deviceIDMapSz), - deletionWorkerTicker: time.NewTicker(time.Second * 30), - uidMaps: uidMaps, - gidMaps: gidMaps, - minFreeSpacePercent: defaultMinFreeSpacePercent, - } - - foundBlkDiscard := false - for _, option := range options { - key, val, err := parsers.ParseKeyValueOpt(option) - if err != nil { - return nil, err - } - key = strings.ToLower(key) - switch key { - case "dm.basesize": - size, err := units.RAMInBytes(val) - if err != nil { - return nil, err - } - userBaseSize = true - devices.baseFsSize = uint64(size) - case "dm.loopdatasize": - size, err := units.RAMInBytes(val) - if err != nil { - return nil, err - } - devices.dataLoopbackSize = size - case "dm.loopmetadatasize": - size, err := units.RAMInBytes(val) - if err != nil { - return nil, err - } - devices.metaDataLoopbackSize = size - case "dm.fs": - if val != "ext4" && val != "xfs" { - return nil, fmt.Errorf("devmapper: Unsupported filesystem %s\n", val) - } - devices.filesystem = val - case "dm.mkfsarg": - devices.mkfsArgs = append(devices.mkfsArgs, val) - case "dm.mountopt": - devices.mountOptions = joinMountOptions(devices.mountOptions, val) - case "dm.metadatadev": - devices.metadataDevice = val - case "dm.datadev": - devices.dataDevice = val - case "dm.thinpooldev": - devices.thinPoolDevice = strings.TrimPrefix(val, "/dev/mapper/") - case "dm.blkdiscard": - foundBlkDiscard = true - devices.doBlkDiscard, err = strconv.ParseBool(val) - if err != nil { - return nil, err - } - case "dm.blocksize": - size, err := units.RAMInBytes(val) - if err != nil { - return nil, err - } - // convert to 512b sectors - devices.thinpBlockSize = uint32(size) >> 9 - case "dm.override_udev_sync_check": - devices.overrideUdevSyncCheck, err = strconv.ParseBool(val) - if err != nil { - return nil, err - } - - case "dm.use_deferred_removal": - enableDeferredRemoval, err = strconv.ParseBool(val) - if err != nil { - return nil, err - } - - case "dm.use_deferred_deletion": - enableDeferredDeletion, err = strconv.ParseBool(val) - if err != nil { - return nil, err - } - - case "dm.min_free_space": - if !strings.HasSuffix(val, "%") { - return nil, fmt.Errorf("devmapper: Option dm.min_free_space requires %% suffix") - } - - valstring := strings.TrimSuffix(val, "%") - minFreeSpacePercent, err := strconv.ParseUint(valstring, 10, 32) - if err != nil { - return nil, err - } - - if minFreeSpacePercent >= 100 { - return nil, fmt.Errorf("devmapper: Invalid value %v for option dm.min_free_space", val) - } - - devices.minFreeSpacePercent = uint32(minFreeSpacePercent) - case "dm.xfs_nospace_max_retries": - _, err := strconv.ParseUint(val, 10, 64) - if err != nil { - return nil, err - } - devices.xfsNospaceRetries = val - default: - return nil, fmt.Errorf("devmapper: Unknown option %s\n", key) - } - } - - // By default, don't do blk discard hack on raw devices, its rarely useful and is expensive - if !foundBlkDiscard && (devices.dataDevice != "" || devices.thinPoolDevice != "") { - devices.doBlkDiscard = false - } - - if err := devices.initDevmapper(doInit); err != nil { - return nil, err - } - - return devices, nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/devmapper_doc.go b/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/devmapper_doc.go deleted file mode 100644 index 9ab3e4f86..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/devmapper_doc.go +++ /dev/null @@ -1,106 +0,0 @@ -package devmapper - -// Definition of struct dm_task and sub structures (from lvm2) -// -// struct dm_ioctl { -// /* -// * The version number is made up of three parts: -// * major - no backward or forward compatibility, -// * minor - only backwards compatible, -// * patch - both backwards and forwards compatible. -// * -// * All clients of the ioctl interface should fill in the -// * version number of the interface that they were -// * compiled with. -// * -// * All recognized ioctl commands (ie. those that don't -// * return -ENOTTY) fill out this field, even if the -// * command failed. -// */ -// uint32_t version[3]; /* in/out */ -// uint32_t data_size; /* total size of data passed in -// * including this struct */ - -// uint32_t data_start; /* offset to start of data -// * relative to start of this struct */ - -// uint32_t target_count; /* in/out */ -// int32_t open_count; /* out */ -// uint32_t flags; /* in/out */ - -// /* -// * event_nr holds either the event number (input and output) or the -// * udev cookie value (input only). -// * The DM_DEV_WAIT ioctl takes an event number as input. -// * The DM_SUSPEND, DM_DEV_REMOVE and DM_DEV_RENAME ioctls -// * use the field as a cookie to return in the DM_COOKIE -// * variable with the uevents they issue. -// * For output, the ioctls return the event number, not the cookie. -// */ -// uint32_t event_nr; /* in/out */ -// uint32_t padding; - -// uint64_t dev; /* in/out */ - -// char name[DM_NAME_LEN]; /* device name */ -// char uuid[DM_UUID_LEN]; /* unique identifier for -// * the block device */ -// char data[7]; /* padding or data */ -// }; - -// struct target { -// uint64_t start; -// uint64_t length; -// char *type; -// char *params; - -// struct target *next; -// }; - -// typedef enum { -// DM_ADD_NODE_ON_RESUME, /* add /dev/mapper node with dmsetup resume */ -// DM_ADD_NODE_ON_CREATE /* add /dev/mapper node with dmsetup create */ -// } dm_add_node_t; - -// struct dm_task { -// int type; -// char *dev_name; -// char *mangled_dev_name; - -// struct target *head, *tail; - -// int read_only; -// uint32_t event_nr; -// int major; -// int minor; -// int allow_default_major_fallback; -// uid_t uid; -// gid_t gid; -// mode_t mode; -// uint32_t read_ahead; -// uint32_t read_ahead_flags; -// union { -// struct dm_ioctl *v4; -// } dmi; -// char *newname; -// char *message; -// char *geometry; -// uint64_t sector; -// int no_flush; -// int no_open_count; -// int skip_lockfs; -// int query_inactive_table; -// int suppress_identical_reload; -// dm_add_node_t add_node; -// uint64_t existing_table_size; -// int cookie_set; -// int new_uuid; -// int secure_data; -// int retry_remove; -// int enable_checks; -// int expected_errno; - -// char *uuid; -// char *mangled_uuid; -// }; -// diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/devmapper_test.go b/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/devmapper_test.go deleted file mode 100644 index 5c2abcefc..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/devmapper_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// +build linux - -package devmapper - -import ( - "fmt" - "testing" - "time" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/daemon/graphdriver/graphtest" -) - -func init() { - // Reduce the size the the base fs and loopback for the tests - defaultDataLoopbackSize = 300 * 1024 * 1024 - defaultMetaDataLoopbackSize = 200 * 1024 * 1024 - defaultBaseFsSize = 300 * 1024 * 1024 - defaultUdevSyncOverride = true - if err := graphtest.InitLoopbacks(); err != nil { - panic(err) - } -} - -// This avoids creating a new driver for each test if all tests are run -// Make sure to put new tests between TestDevmapperSetup and TestDevmapperTeardown -func TestDevmapperSetup(t *testing.T) { - graphtest.GetDriver(t, "devicemapper") -} - -func TestDevmapperCreateEmpty(t *testing.T) { - graphtest.DriverTestCreateEmpty(t, "devicemapper") -} - -func TestDevmapperCreateBase(t *testing.T) { - graphtest.DriverTestCreateBase(t, "devicemapper") -} - -func TestDevmapperCreateSnap(t *testing.T) { - graphtest.DriverTestCreateSnap(t, "devicemapper") -} - -func TestDevmapperTeardown(t *testing.T) { - graphtest.PutDriver(t) -} - -func TestDevmapperReduceLoopBackSize(t *testing.T) { - tenMB := int64(10 * 1024 * 1024) - testChangeLoopBackSize(t, -tenMB, defaultDataLoopbackSize, defaultMetaDataLoopbackSize) -} - -func TestDevmapperIncreaseLoopBackSize(t *testing.T) { - tenMB := int64(10 * 1024 * 1024) - testChangeLoopBackSize(t, tenMB, defaultDataLoopbackSize+tenMB, defaultMetaDataLoopbackSize+tenMB) -} - -func testChangeLoopBackSize(t *testing.T, delta, expectDataSize, expectMetaDataSize int64) { - driver := graphtest.GetDriver(t, "devicemapper").(*graphtest.Driver).Driver.(*graphdriver.NaiveDiffDriver).ProtoDriver.(*Driver) - defer graphtest.PutDriver(t) - // make sure data or metadata loopback size are the default size - if s := driver.DeviceSet.Status(); s.Data.Total != uint64(defaultDataLoopbackSize) || s.Metadata.Total != uint64(defaultMetaDataLoopbackSize) { - t.Fatalf("data or metadata loop back size is incorrect") - } - if err := driver.Cleanup(); err != nil { - t.Fatal(err) - } - //Reload - d, err := Init(driver.home, []string{ - fmt.Sprintf("dm.loopdatasize=%d", defaultDataLoopbackSize+delta), - fmt.Sprintf("dm.loopmetadatasize=%d", defaultMetaDataLoopbackSize+delta), - }, nil, nil) - if err != nil { - t.Fatalf("error creating devicemapper driver: %v", err) - } - driver = d.(*graphdriver.NaiveDiffDriver).ProtoDriver.(*Driver) - if s := driver.DeviceSet.Status(); s.Data.Total != uint64(expectDataSize) || s.Metadata.Total != uint64(expectMetaDataSize) { - t.Fatalf("data or metadata loop back size is incorrect") - } - if err := driver.Cleanup(); err != nil { - t.Fatal(err) - } -} - -// Make sure devices.Lock() has been release upon return from cleanupDeletedDevices() function -func TestDevmapperLockReleasedDeviceDeletion(t *testing.T) { - driver := graphtest.GetDriver(t, "devicemapper").(*graphtest.Driver).Driver.(*graphdriver.NaiveDiffDriver).ProtoDriver.(*Driver) - defer graphtest.PutDriver(t) - - // Call cleanupDeletedDevices() and after the call take and release - // DeviceSet Lock. If lock has not been released, this will hang. - driver.DeviceSet.cleanupDeletedDevices() - - doneChan := make(chan bool) - - go func() { - driver.DeviceSet.Lock() - defer driver.DeviceSet.Unlock() - doneChan <- true - }() - - select { - case <-time.After(time.Second * 5): - // Timer expired. That means lock was not released upon - // function return and we are deadlocked. Release lock - // here so that cleanup could succeed and fail the test. - driver.DeviceSet.Unlock() - t.Fatalf("Could not acquire devices lock after call to cleanupDeletedDevices()") - case <-doneChan: - } -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/driver.go b/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/driver.go deleted file mode 100644 index 7cf422ce6..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/driver.go +++ /dev/null @@ -1,231 +0,0 @@ -// +build linux - -package devmapper - -import ( - "fmt" - "io/ioutil" - "os" - "path" - "strconv" - - "github.com/Sirupsen/logrus" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/pkg/devicemapper" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/mount" - "github.com/docker/go-units" -) - -func init() { - graphdriver.Register("devicemapper", Init) -} - -// Driver contains the device set mounted and the home directory -type Driver struct { - *DeviceSet - home string - uidMaps []idtools.IDMap - gidMaps []idtools.IDMap - ctr *graphdriver.RefCounter -} - -// Init creates a driver with the given home and the set of options. -func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (graphdriver.Driver, error) { - deviceSet, err := NewDeviceSet(home, true, options, uidMaps, gidMaps) - if err != nil { - return nil, err - } - - if err := mount.MakePrivate(home); err != nil { - return nil, err - } - - d := &Driver{ - DeviceSet: deviceSet, - home: home, - uidMaps: uidMaps, - gidMaps: gidMaps, - ctr: graphdriver.NewRefCounter(graphdriver.NewDefaultChecker()), - } - - return graphdriver.NewNaiveDiffDriver(d, uidMaps, gidMaps), nil -} - -func (d *Driver) String() string { - return "devicemapper" -} - -// Status returns the status about the driver in a printable format. -// Information returned contains Pool Name, Data File, Metadata file, disk usage by -// the data and metadata, etc. -func (d *Driver) Status() [][2]string { - s := d.DeviceSet.Status() - - status := [][2]string{ - {"Pool Name", s.PoolName}, - {"Pool Blocksize", fmt.Sprintf("%s", units.HumanSize(float64(s.SectorSize)))}, - {"Base Device Size", fmt.Sprintf("%s", units.HumanSize(float64(s.BaseDeviceSize)))}, - {"Backing Filesystem", s.BaseDeviceFS}, - {"Data file", s.DataFile}, - {"Metadata file", s.MetadataFile}, - {"Data Space Used", fmt.Sprintf("%s", units.HumanSize(float64(s.Data.Used)))}, - {"Data Space Total", fmt.Sprintf("%s", units.HumanSize(float64(s.Data.Total)))}, - {"Data Space Available", fmt.Sprintf("%s", units.HumanSize(float64(s.Data.Available)))}, - {"Metadata Space Used", fmt.Sprintf("%s", units.HumanSize(float64(s.Metadata.Used)))}, - {"Metadata Space Total", fmt.Sprintf("%s", units.HumanSize(float64(s.Metadata.Total)))}, - {"Metadata Space Available", fmt.Sprintf("%s", units.HumanSize(float64(s.Metadata.Available)))}, - {"Thin Pool Minimum Free Space", fmt.Sprintf("%s", units.HumanSize(float64(s.MinFreeSpace)))}, - {"Udev Sync Supported", fmt.Sprintf("%v", s.UdevSyncSupported)}, - {"Deferred Removal Enabled", fmt.Sprintf("%v", s.DeferredRemoveEnabled)}, - {"Deferred Deletion Enabled", fmt.Sprintf("%v", s.DeferredDeleteEnabled)}, - {"Deferred Deleted Device Count", fmt.Sprintf("%v", s.DeferredDeletedDeviceCount)}, - } - if len(s.DataLoopback) > 0 { - status = append(status, [2]string{"Data loop file", s.DataLoopback}) - } - if len(s.MetadataLoopback) > 0 { - status = append(status, [2]string{"Metadata loop file", s.MetadataLoopback}) - } - if vStr, err := devicemapper.GetLibraryVersion(); err == nil { - status = append(status, [2]string{"Library Version", vStr}) - } - return status -} - -// GetMetadata returns a map of information about the device. -func (d *Driver) GetMetadata(id string) (map[string]string, error) { - m, err := d.DeviceSet.exportDeviceMetadata(id) - - if err != nil { - return nil, err - } - - metadata := make(map[string]string) - metadata["DeviceId"] = strconv.Itoa(m.deviceID) - metadata["DeviceSize"] = strconv.FormatUint(m.deviceSize, 10) - metadata["DeviceName"] = m.deviceName - return metadata, nil -} - -// Cleanup unmounts a device. -func (d *Driver) Cleanup() error { - err := d.DeviceSet.Shutdown(d.home) - - if err2 := mount.Unmount(d.home); err == nil { - err = err2 - } - - return err -} - -// CreateReadWrite creates a layer that is writable for use as a container -// file system. -func (d *Driver) CreateReadWrite(id, parent string, opts *graphdriver.CreateOpts) error { - return d.Create(id, parent, opts) -} - -// Create adds a device with a given id and the parent. -func (d *Driver) Create(id, parent string, opts *graphdriver.CreateOpts) error { - var storageOpt map[string]string - if opts != nil { - storageOpt = opts.StorageOpt - } - - if err := d.DeviceSet.AddDevice(id, parent, storageOpt); err != nil { - return err - } - - return nil -} - -// Remove removes a device with a given id, unmounts the filesystem. -func (d *Driver) Remove(id string) error { - if !d.DeviceSet.HasDevice(id) { - // Consider removing a non-existing device a no-op - // This is useful to be able to progress on container removal - // if the underlying device has gone away due to earlier errors - return nil - } - - // This assumes the device has been properly Get/Put:ed and thus is unmounted - if err := d.DeviceSet.DeleteDevice(id, false); err != nil { - return err - } - - mp := path.Join(d.home, "mnt", id) - if err := os.RemoveAll(mp); err != nil && !os.IsNotExist(err) { - return err - } - - return nil -} - -// Get mounts a device with given id into the root filesystem -func (d *Driver) Get(id, mountLabel string) (string, error) { - mp := path.Join(d.home, "mnt", id) - rootFs := path.Join(mp, "rootfs") - if count := d.ctr.Increment(mp); count > 1 { - return rootFs, nil - } - - uid, gid, err := idtools.GetRootUIDGID(d.uidMaps, d.gidMaps) - if err != nil { - d.ctr.Decrement(mp) - return "", err - } - - // Create the target directories if they don't exist - if err := idtools.MkdirAllAs(path.Join(d.home, "mnt"), 0755, uid, gid); err != nil && !os.IsExist(err) { - d.ctr.Decrement(mp) - return "", err - } - if err := idtools.MkdirAs(mp, 0755, uid, gid); err != nil && !os.IsExist(err) { - d.ctr.Decrement(mp) - return "", err - } - - // Mount the device - if err := d.DeviceSet.MountDevice(id, mp, mountLabel); err != nil { - d.ctr.Decrement(mp) - return "", err - } - - if err := idtools.MkdirAllAs(rootFs, 0755, uid, gid); err != nil && !os.IsExist(err) { - d.ctr.Decrement(mp) - d.DeviceSet.UnmountDevice(id, mp) - return "", err - } - - idFile := path.Join(mp, "id") - if _, err := os.Stat(idFile); err != nil && os.IsNotExist(err) { - // Create an "id" file with the container/image id in it to help reconstruct this in case - // of later problems - if err := ioutil.WriteFile(idFile, []byte(id), 0600); err != nil { - d.ctr.Decrement(mp) - d.DeviceSet.UnmountDevice(id, mp) - return "", err - } - } - - return rootFs, nil -} - -// Put unmounts a device and removes it. -func (d *Driver) Put(id string) error { - mp := path.Join(d.home, "mnt", id) - if count := d.ctr.Decrement(mp); count > 0 { - return nil - } - err := d.DeviceSet.UnmountDevice(id, mp) - if err != nil { - logrus.Errorf("devmapper: Error unmounting device %s: %s", id, err) - } - return err -} - -// Exists checks to see if the device exists. -func (d *Driver) Exists(id string) bool { - return d.DeviceSet.HasDevice(id) -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/mount.go b/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/mount.go deleted file mode 100644 index cca1fe1b3..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/mount.go +++ /dev/null @@ -1,89 +0,0 @@ -// +build linux - -package devmapper - -import ( - "bytes" - "fmt" - "os" - "path/filepath" - "syscall" -) - -// FIXME: this is copy-pasted from the aufs driver. -// It should be moved into the core. - -// Mounted returns true if a mount point exists. -func Mounted(mountpoint string) (bool, error) { - mntpoint, err := os.Stat(mountpoint) - if err != nil { - if os.IsNotExist(err) { - return false, nil - } - return false, err - } - parent, err := os.Stat(filepath.Join(mountpoint, "..")) - if err != nil { - return false, err - } - mntpointSt := mntpoint.Sys().(*syscall.Stat_t) - parentSt := parent.Sys().(*syscall.Stat_t) - return mntpointSt.Dev != parentSt.Dev, nil -} - -type probeData struct { - fsName string - magic string - offset uint64 -} - -// ProbeFsType returns the filesystem name for the given device id. -func ProbeFsType(device string) (string, error) { - probes := []probeData{ - {"btrfs", "_BHRfS_M", 0x10040}, - {"ext4", "\123\357", 0x438}, - {"xfs", "XFSB", 0}, - } - - maxLen := uint64(0) - for _, p := range probes { - l := p.offset + uint64(len(p.magic)) - if l > maxLen { - maxLen = l - } - } - - file, err := os.Open(device) - if err != nil { - return "", err - } - defer file.Close() - - buffer := make([]byte, maxLen) - l, err := file.Read(buffer) - if err != nil { - return "", err - } - - if uint64(l) != maxLen { - return "", fmt.Errorf("devmapper: unable to detect filesystem type of %s, short read", device) - } - - for _, p := range probes { - if bytes.Equal([]byte(p.magic), buffer[p.offset:p.offset+uint64(len(p.magic))]) { - return p.fsName, nil - } - } - - return "", fmt.Errorf("devmapper: Unknown filesystem type on %s", device) -} - -func joinMountOptions(a, b string) string { - if a == "" { - return b - } - if b == "" { - return a - } - return a + "," + b -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/driver.go b/vendor/github.com/docker/docker/daemon/graphdriver/driver.go deleted file mode 100644 index f0bce562b..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/driver.go +++ /dev/null @@ -1,270 +0,0 @@ -package graphdriver - -import ( - "errors" - "fmt" - "io" - "os" - "path/filepath" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/vbatts/tar-split/tar/storage" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/plugingetter" -) - -// FsMagic unsigned id of the filesystem in use. -type FsMagic uint32 - -const ( - // FsMagicUnsupported is a predefined constant value other than a valid filesystem id. - FsMagicUnsupported = FsMagic(0x00000000) -) - -var ( - // All registered drivers - drivers map[string]InitFunc - - // ErrNotSupported returned when driver is not supported. - ErrNotSupported = errors.New("driver not supported") - // ErrPrerequisites retuned when driver does not meet prerequisites. - ErrPrerequisites = errors.New("prerequisites for driver not satisfied (wrong filesystem?)") - // ErrIncompatibleFS returned when file system is not supported. - ErrIncompatibleFS = fmt.Errorf("backing file system is unsupported for this graph driver") -) - -//CreateOpts contains optional arguments for Create() and CreateReadWrite() -// methods. -type CreateOpts struct { - MountLabel string - StorageOpt map[string]string -} - -// InitFunc initializes the storage driver. -type InitFunc func(root string, options []string, uidMaps, gidMaps []idtools.IDMap) (Driver, error) - -// ProtoDriver defines the basic capabilities of a driver. -// This interface exists solely to be a minimum set of methods -// for client code which choose not to implement the entire Driver -// interface and use the NaiveDiffDriver wrapper constructor. -// -// Use of ProtoDriver directly by client code is not recommended. -type ProtoDriver interface { - // String returns a string representation of this driver. - String() string - // CreateReadWrite creates a new, empty filesystem layer that is ready - // to be used as the storage for a container. Additional options can - // be passed in opts. parent may be "" and opts may be nil. - CreateReadWrite(id, parent string, opts *CreateOpts) error - // Create creates a new, empty, filesystem layer with the - // specified id and parent and options passed in opts. Parent - // may be "" and opts may be nil. - Create(id, parent string, opts *CreateOpts) error - // Remove attempts to remove the filesystem layer with this id. - Remove(id string) error - // Get returns the mountpoint for the layered filesystem referred - // to by this id. You can optionally specify a mountLabel or "". - // Returns the absolute path to the mounted layered filesystem. - Get(id, mountLabel string) (dir string, err error) - // Put releases the system resources for the specified id, - // e.g, unmounting layered filesystem. - Put(id string) error - // Exists returns whether a filesystem layer with the specified - // ID exists on this driver. - Exists(id string) bool - // Status returns a set of key-value pairs which give low - // level diagnostic status about this driver. - Status() [][2]string - // Returns a set of key-value pairs which give low level information - // about the image/container driver is managing. - GetMetadata(id string) (map[string]string, error) - // Cleanup performs necessary tasks to release resources - // held by the driver, e.g., unmounting all layered filesystems - // known to this driver. - Cleanup() error -} - -// DiffDriver is the interface to use to implement graph diffs -type DiffDriver interface { - // Diff produces an archive of the changes between the specified - // layer and its parent layer which may be "". - Diff(id, parent string) (io.ReadCloser, error) - // Changes produces a list of changes between the specified layer - // and its parent layer. If parent is "", then all changes will be ADD changes. - Changes(id, parent string) ([]archive.Change, error) - // ApplyDiff extracts the changeset from the given diff into the - // layer with the specified id and parent, returning the size of the - // new layer in bytes. - // The archive.Reader must be an uncompressed stream. - ApplyDiff(id, parent string, diff io.Reader) (size int64, err error) - // DiffSize calculates the changes between the specified id - // and its parent and returns the size in bytes of the changes - // relative to its base filesystem directory. - DiffSize(id, parent string) (size int64, err error) -} - -// Driver is the interface for layered/snapshot file system drivers. -type Driver interface { - ProtoDriver - DiffDriver -} - -// DiffGetterDriver is the interface for layered file system drivers that -// provide a specialized function for getting file contents for tar-split. -type DiffGetterDriver interface { - Driver - // DiffGetter returns an interface to efficiently retrieve the contents - // of files in a layer. - DiffGetter(id string) (FileGetCloser, error) -} - -// FileGetCloser extends the storage.FileGetter interface with a Close method -// for cleaning up. -type FileGetCloser interface { - storage.FileGetter - // Close cleans up any resources associated with the FileGetCloser. - Close() error -} - -// Checker makes checks on specified filesystems. -type Checker interface { - // IsMounted returns true if the provided path is mounted for the specific checker - IsMounted(path string) bool -} - -func init() { - drivers = make(map[string]InitFunc) -} - -// Register registers an InitFunc for the driver. -func Register(name string, initFunc InitFunc) error { - if _, exists := drivers[name]; exists { - return fmt.Errorf("Name already registered %s", name) - } - drivers[name] = initFunc - - return nil -} - -// GetDriver initializes and returns the registered driver -func GetDriver(name string, pg plugingetter.PluginGetter, config Options) (Driver, error) { - if initFunc, exists := drivers[name]; exists { - return initFunc(filepath.Join(config.Root, name), config.DriverOptions, config.UIDMaps, config.GIDMaps) - } - - pluginDriver, err := lookupPlugin(name, pg, config) - if err == nil { - return pluginDriver, nil - } - logrus.WithError(err).WithField("driver", name).WithField("home-dir", config.Root).Error("Failed to GetDriver graph") - return nil, ErrNotSupported -} - -// getBuiltinDriver initializes and returns the registered driver, but does not try to load from plugins -func getBuiltinDriver(name, home string, options []string, uidMaps, gidMaps []idtools.IDMap) (Driver, error) { - if initFunc, exists := drivers[name]; exists { - return initFunc(filepath.Join(home, name), options, uidMaps, gidMaps) - } - logrus.Errorf("Failed to built-in GetDriver graph %s %s", name, home) - return nil, ErrNotSupported -} - -// Options is used to initialize a graphdriver -type Options struct { - Root string - DriverOptions []string - UIDMaps []idtools.IDMap - GIDMaps []idtools.IDMap - ExperimentalEnabled bool -} - -// New creates the driver and initializes it at the specified root. -func New(name string, pg plugingetter.PluginGetter, config Options) (Driver, error) { - if name != "" { - logrus.Debugf("[graphdriver] trying provided driver: %s", name) // so the logs show specified driver - return GetDriver(name, pg, config) - } - - // Guess for prior driver - driversMap := scanPriorDrivers(config.Root) - for _, name := range priority { - if name == "vfs" { - // don't use vfs even if there is state present. - continue - } - if _, prior := driversMap[name]; prior { - // of the state found from prior drivers, check in order of our priority - // which we would prefer - driver, err := getBuiltinDriver(name, config.Root, config.DriverOptions, config.UIDMaps, config.GIDMaps) - if err != nil { - // unlike below, we will return error here, because there is prior - // state, and now it is no longer supported/prereq/compatible, so - // something changed and needs attention. Otherwise the daemon's - // images would just "disappear". - logrus.Errorf("[graphdriver] prior storage driver %s failed: %s", name, err) - return nil, err - } - - // abort starting when there are other prior configured drivers - // to ensure the user explicitly selects the driver to load - if len(driversMap)-1 > 0 { - var driversSlice []string - for name := range driversMap { - driversSlice = append(driversSlice, name) - } - - return nil, fmt.Errorf("%s contains several valid graphdrivers: %s; Please cleanup or explicitly choose storage driver (-s )", config.Root, strings.Join(driversSlice, ", ")) - } - - logrus.Infof("[graphdriver] using prior storage driver: %s", name) - return driver, nil - } - } - - // Check for priority drivers first - for _, name := range priority { - driver, err := getBuiltinDriver(name, config.Root, config.DriverOptions, config.UIDMaps, config.GIDMaps) - if err != nil { - if isDriverNotSupported(err) { - continue - } - return nil, err - } - return driver, nil - } - - // Check all registered drivers if no priority driver is found - for name, initFunc := range drivers { - driver, err := initFunc(filepath.Join(config.Root, name), config.DriverOptions, config.UIDMaps, config.GIDMaps) - if err != nil { - if isDriverNotSupported(err) { - continue - } - return nil, err - } - return driver, nil - } - return nil, fmt.Errorf("No supported storage backend found") -} - -// isDriverNotSupported returns true if the error initializing -// the graph driver is a non-supported error. -func isDriverNotSupported(err error) bool { - return err == ErrNotSupported || err == ErrPrerequisites || err == ErrIncompatibleFS -} - -// scanPriorDrivers returns an un-ordered scan of directories of prior storage drivers -func scanPriorDrivers(root string) map[string]bool { - driversMap := make(map[string]bool) - - for driver := range drivers { - p := filepath.Join(root, driver) - if _, err := os.Stat(p); err == nil && driver != "vfs" { - driversMap[driver] = true - } - } - return driversMap -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/driver_freebsd.go b/vendor/github.com/docker/docker/daemon/graphdriver/driver_freebsd.go deleted file mode 100644 index 2891a84f3..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/driver_freebsd.go +++ /dev/null @@ -1,19 +0,0 @@ -package graphdriver - -import "syscall" - -var ( - // Slice of drivers that should be used in an order - priority = []string{ - "zfs", - } -) - -// Mounted checks if the given path is mounted as the fs type -func Mounted(fsType FsMagic, mountPath string) (bool, error) { - var buf syscall.Statfs_t - if err := syscall.Statfs(mountPath, &buf); err != nil { - return false, err - } - return FsMagic(buf.Type) == fsType, nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/driver_linux.go b/vendor/github.com/docker/docker/daemon/graphdriver/driver_linux.go deleted file mode 100644 index 5c8d0e230..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/driver_linux.go +++ /dev/null @@ -1,135 +0,0 @@ -// +build linux - -package graphdriver - -import ( - "path/filepath" - "syscall" - - "github.com/docker/docker/pkg/mount" -) - -const ( - // FsMagicAufs filesystem id for Aufs - FsMagicAufs = FsMagic(0x61756673) - // FsMagicBtrfs filesystem id for Btrfs - FsMagicBtrfs = FsMagic(0x9123683E) - // FsMagicCramfs filesystem id for Cramfs - FsMagicCramfs = FsMagic(0x28cd3d45) - // FsMagicEcryptfs filesystem id for eCryptfs - FsMagicEcryptfs = FsMagic(0xf15f) - // FsMagicExtfs filesystem id for Extfs - FsMagicExtfs = FsMagic(0x0000EF53) - // FsMagicF2fs filesystem id for F2fs - FsMagicF2fs = FsMagic(0xF2F52010) - // FsMagicGPFS filesystem id for GPFS - FsMagicGPFS = FsMagic(0x47504653) - // FsMagicJffs2Fs filesystem if for Jffs2Fs - FsMagicJffs2Fs = FsMagic(0x000072b6) - // FsMagicJfs filesystem id for Jfs - FsMagicJfs = FsMagic(0x3153464a) - // FsMagicNfsFs filesystem id for NfsFs - FsMagicNfsFs = FsMagic(0x00006969) - // FsMagicRAMFs filesystem id for RamFs - FsMagicRAMFs = FsMagic(0x858458f6) - // FsMagicReiserFs filesystem id for ReiserFs - FsMagicReiserFs = FsMagic(0x52654973) - // FsMagicSmbFs filesystem id for SmbFs - FsMagicSmbFs = FsMagic(0x0000517B) - // FsMagicSquashFs filesystem id for SquashFs - FsMagicSquashFs = FsMagic(0x73717368) - // FsMagicTmpFs filesystem id for TmpFs - FsMagicTmpFs = FsMagic(0x01021994) - // FsMagicVxFS filesystem id for VxFs - FsMagicVxFS = FsMagic(0xa501fcf5) - // FsMagicXfs filesystem id for Xfs - FsMagicXfs = FsMagic(0x58465342) - // FsMagicZfs filesystem id for Zfs - FsMagicZfs = FsMagic(0x2fc12fc1) - // FsMagicOverlay filesystem id for overlay - FsMagicOverlay = FsMagic(0x794C7630) -) - -var ( - // Slice of drivers that should be used in an order - priority = []string{ - "aufs", - "btrfs", - "zfs", - "overlay2", - "overlay", - "devicemapper", - "vfs", - } - - // FsNames maps filesystem id to name of the filesystem. - FsNames = map[FsMagic]string{ - FsMagicAufs: "aufs", - FsMagicBtrfs: "btrfs", - FsMagicCramfs: "cramfs", - FsMagicExtfs: "extfs", - FsMagicF2fs: "f2fs", - FsMagicGPFS: "gpfs", - FsMagicJffs2Fs: "jffs2", - FsMagicJfs: "jfs", - FsMagicNfsFs: "nfs", - FsMagicOverlay: "overlayfs", - FsMagicRAMFs: "ramfs", - FsMagicReiserFs: "reiserfs", - FsMagicSmbFs: "smb", - FsMagicSquashFs: "squashfs", - FsMagicTmpFs: "tmpfs", - FsMagicUnsupported: "unsupported", - FsMagicVxFS: "vxfs", - FsMagicXfs: "xfs", - FsMagicZfs: "zfs", - } -) - -// GetFSMagic returns the filesystem id given the path. -func GetFSMagic(rootpath string) (FsMagic, error) { - var buf syscall.Statfs_t - if err := syscall.Statfs(filepath.Dir(rootpath), &buf); err != nil { - return 0, err - } - return FsMagic(buf.Type), nil -} - -// NewFsChecker returns a checker configured for the provied FsMagic -func NewFsChecker(t FsMagic) Checker { - return &fsChecker{ - t: t, - } -} - -type fsChecker struct { - t FsMagic -} - -func (c *fsChecker) IsMounted(path string) bool { - m, _ := Mounted(c.t, path) - return m -} - -// NewDefaultChecker returns a check that parses /proc/mountinfo to check -// if the specified path is mounted. -func NewDefaultChecker() Checker { - return &defaultChecker{} -} - -type defaultChecker struct { -} - -func (c *defaultChecker) IsMounted(path string) bool { - m, _ := mount.Mounted(path) - return m -} - -// Mounted checks if the given path is mounted as the fs type -func Mounted(fsType FsMagic, mountPath string) (bool, error) { - var buf syscall.Statfs_t - if err := syscall.Statfs(mountPath, &buf); err != nil { - return false, err - } - return FsMagic(buf.Type) == fsType, nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/driver_solaris.go b/vendor/github.com/docker/docker/daemon/graphdriver/driver_solaris.go deleted file mode 100644 index 7daf01c32..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/driver_solaris.go +++ /dev/null @@ -1,97 +0,0 @@ -// +build solaris,cgo - -package graphdriver - -/* -#include -#include - -static inline struct statvfs *getstatfs(char *s) { - struct statvfs *buf; - int err; - buf = (struct statvfs *)malloc(sizeof(struct statvfs)); - err = statvfs(s, buf); - return buf; -} -*/ -import "C" -import ( - "path/filepath" - "unsafe" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/mount" -) - -const ( - // FsMagicZfs filesystem id for Zfs - FsMagicZfs = FsMagic(0x2fc12fc1) -) - -var ( - // Slice of drivers that should be used in an order - priority = []string{ - "zfs", - } - - // FsNames maps filesystem id to name of the filesystem. - FsNames = map[FsMagic]string{ - FsMagicZfs: "zfs", - } -) - -// GetFSMagic returns the filesystem id given the path. -func GetFSMagic(rootpath string) (FsMagic, error) { - return 0, nil -} - -type fsChecker struct { - t FsMagic -} - -func (c *fsChecker) IsMounted(path string) bool { - m, _ := Mounted(c.t, path) - return m -} - -// NewFsChecker returns a checker configured for the provied FsMagic -func NewFsChecker(t FsMagic) Checker { - return &fsChecker{ - t: t, - } -} - -// NewDefaultChecker returns a check that parses /proc/mountinfo to check -// if the specified path is mounted. -// No-op on Solaris. -func NewDefaultChecker() Checker { - return &defaultChecker{} -} - -type defaultChecker struct { -} - -func (c *defaultChecker) IsMounted(path string) bool { - m, _ := mount.Mounted(path) - return m -} - -// Mounted checks if the given path is mounted as the fs type -//Solaris supports only ZFS for now -func Mounted(fsType FsMagic, mountPath string) (bool, error) { - - cs := C.CString(filepath.Dir(mountPath)) - buf := C.getstatfs(cs) - - // on Solaris buf.f_basetype contains ['z', 'f', 's', 0 ... ] - if (buf.f_basetype[0] != 122) || (buf.f_basetype[1] != 102) || (buf.f_basetype[2] != 115) || - (buf.f_basetype[3] != 0) { - logrus.Debugf("[zfs] no zfs dataset found for rootdir '%s'", mountPath) - C.free(unsafe.Pointer(buf)) - return false, ErrPrerequisites - } - - C.free(unsafe.Pointer(buf)) - C.free(unsafe.Pointer(cs)) - return true, nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/driver_unsupported.go b/vendor/github.com/docker/docker/daemon/graphdriver/driver_unsupported.go deleted file mode 100644 index 4a875608b..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/driver_unsupported.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build !linux,!windows,!freebsd,!solaris - -package graphdriver - -var ( - // Slice of drivers that should be used in an order - priority = []string{ - "unsupported", - } -) - -// GetFSMagic returns the filesystem id given the path. -func GetFSMagic(rootpath string) (FsMagic, error) { - return FsMagicUnsupported, nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/driver_windows.go b/vendor/github.com/docker/docker/daemon/graphdriver/driver_windows.go deleted file mode 100644 index ffd30c295..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/driver_windows.go +++ /dev/null @@ -1,14 +0,0 @@ -package graphdriver - -var ( - // Slice of drivers that should be used in order - priority = []string{ - "windowsfilter", - } -) - -// GetFSMagic returns the filesystem id given the path. -func GetFSMagic(rootpath string) (FsMagic, error) { - // Note it is OK to return FsMagicUnsupported on Windows. - return FsMagicUnsupported, nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/fsdiff.go b/vendor/github.com/docker/docker/daemon/graphdriver/fsdiff.go deleted file mode 100644 index 20826cd7d..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/fsdiff.go +++ /dev/null @@ -1,169 +0,0 @@ -package graphdriver - -import ( - "io" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/chrootarchive" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/ioutils" -) - -var ( - // ApplyUncompressedLayer defines the unpack method used by the graph - // driver. - ApplyUncompressedLayer = chrootarchive.ApplyUncompressedLayer -) - -// NaiveDiffDriver takes a ProtoDriver and adds the -// capability of the Diffing methods which it may or may not -// support on its own. See the comment on the exported -// NewNaiveDiffDriver function below. -// Notably, the AUFS driver doesn't need to be wrapped like this. -type NaiveDiffDriver struct { - ProtoDriver - uidMaps []idtools.IDMap - gidMaps []idtools.IDMap -} - -// NewNaiveDiffDriver returns a fully functional driver that wraps the -// given ProtoDriver and adds the capability of the following methods which -// it may or may not support on its own: -// Diff(id, parent string) (archive.Archive, error) -// Changes(id, parent string) ([]archive.Change, error) -// ApplyDiff(id, parent string, diff archive.Reader) (size int64, err error) -// DiffSize(id, parent string) (size int64, err error) -func NewNaiveDiffDriver(driver ProtoDriver, uidMaps, gidMaps []idtools.IDMap) Driver { - return &NaiveDiffDriver{ProtoDriver: driver, - uidMaps: uidMaps, - gidMaps: gidMaps} -} - -// Diff produces an archive of the changes between the specified -// layer and its parent layer which may be "". -func (gdw *NaiveDiffDriver) Diff(id, parent string) (arch io.ReadCloser, err error) { - startTime := time.Now() - driver := gdw.ProtoDriver - - layerFs, err := driver.Get(id, "") - if err != nil { - return nil, err - } - - defer func() { - if err != nil { - driver.Put(id) - } - }() - - if parent == "" { - archive, err := archive.Tar(layerFs, archive.Uncompressed) - if err != nil { - return nil, err - } - return ioutils.NewReadCloserWrapper(archive, func() error { - err := archive.Close() - driver.Put(id) - return err - }), nil - } - - parentFs, err := driver.Get(parent, "") - if err != nil { - return nil, err - } - defer driver.Put(parent) - - changes, err := archive.ChangesDirs(layerFs, parentFs) - if err != nil { - return nil, err - } - - archive, err := archive.ExportChanges(layerFs, changes, gdw.uidMaps, gdw.gidMaps) - if err != nil { - return nil, err - } - - return ioutils.NewReadCloserWrapper(archive, func() error { - err := archive.Close() - driver.Put(id) - - // NaiveDiffDriver compares file metadata with parent layers. Parent layers - // are extracted from tar's with full second precision on modified time. - // We need this hack here to make sure calls within same second receive - // correct result. - time.Sleep(startTime.Truncate(time.Second).Add(time.Second).Sub(time.Now())) - return err - }), nil -} - -// Changes produces a list of changes between the specified layer -// and its parent layer. If parent is "", then all changes will be ADD changes. -func (gdw *NaiveDiffDriver) Changes(id, parent string) ([]archive.Change, error) { - driver := gdw.ProtoDriver - - layerFs, err := driver.Get(id, "") - if err != nil { - return nil, err - } - defer driver.Put(id) - - parentFs := "" - - if parent != "" { - parentFs, err = driver.Get(parent, "") - if err != nil { - return nil, err - } - defer driver.Put(parent) - } - - return archive.ChangesDirs(layerFs, parentFs) -} - -// ApplyDiff extracts the changeset from the given diff into the -// layer with the specified id and parent, returning the size of the -// new layer in bytes. -func (gdw *NaiveDiffDriver) ApplyDiff(id, parent string, diff io.Reader) (size int64, err error) { - driver := gdw.ProtoDriver - - // Mount the root filesystem so we can apply the diff/layer. - layerFs, err := driver.Get(id, "") - if err != nil { - return - } - defer driver.Put(id) - - options := &archive.TarOptions{UIDMaps: gdw.uidMaps, - GIDMaps: gdw.gidMaps} - start := time.Now().UTC() - logrus.Debug("Start untar layer") - if size, err = ApplyUncompressedLayer(layerFs, diff, options); err != nil { - return - } - logrus.Debugf("Untar time: %vs", time.Now().UTC().Sub(start).Seconds()) - - return -} - -// DiffSize calculates the changes between the specified layer -// and its parent and returns the size in bytes of the changes -// relative to its base filesystem directory. -func (gdw *NaiveDiffDriver) DiffSize(id, parent string) (size int64, err error) { - driver := gdw.ProtoDriver - - changes, err := gdw.Changes(id, parent) - if err != nil { - return - } - - layerFs, err := driver.Get(id, "") - if err != nil { - return - } - defer driver.Put(id) - - return archive.ChangesSize(layerFs, changes), nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphbench_unix.go b/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphbench_unix.go deleted file mode 100644 index def822b9a..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphbench_unix.go +++ /dev/null @@ -1,259 +0,0 @@ -// +build linux freebsd - -package graphtest - -import ( - "bytes" - "io" - "io/ioutil" - "path/filepath" - "testing" - - "github.com/docker/docker/pkg/stringid" -) - -// DriverBenchExists benchmarks calls to exist -func DriverBenchExists(b *testing.B, drivername string, driveroptions ...string) { - driver := GetDriver(b, drivername, driveroptions...) - defer PutDriver(b) - - base := stringid.GenerateRandomID() - - if err := driver.Create(base, "", nil); err != nil { - b.Fatal(err) - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - if !driver.Exists(base) { - b.Fatal("Newly created image doesn't exist") - } - } -} - -// DriverBenchGetEmpty benchmarks calls to get on an empty layer -func DriverBenchGetEmpty(b *testing.B, drivername string, driveroptions ...string) { - driver := GetDriver(b, drivername, driveroptions...) - defer PutDriver(b) - - base := stringid.GenerateRandomID() - - if err := driver.Create(base, "", nil); err != nil { - b.Fatal(err) - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := driver.Get(base, "") - b.StopTimer() - if err != nil { - b.Fatalf("Error getting mount: %s", err) - } - if err := driver.Put(base); err != nil { - b.Fatalf("Error putting mount: %s", err) - } - b.StartTimer() - } -} - -// DriverBenchDiffBase benchmarks calls to diff on a root layer -func DriverBenchDiffBase(b *testing.B, drivername string, driveroptions ...string) { - driver := GetDriver(b, drivername, driveroptions...) - defer PutDriver(b) - - base := stringid.GenerateRandomID() - if err := driver.Create(base, "", nil); err != nil { - b.Fatal(err) - } - - if err := addFiles(driver, base, 3); err != nil { - b.Fatal(err) - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - arch, err := driver.Diff(base, "") - if err != nil { - b.Fatal(err) - } - _, err = io.Copy(ioutil.Discard, arch) - if err != nil { - b.Fatalf("Error copying archive: %s", err) - } - arch.Close() - } -} - -// DriverBenchDiffN benchmarks calls to diff on two layers with -// a provided number of files on the lower and upper layers. -func DriverBenchDiffN(b *testing.B, bottom, top int, drivername string, driveroptions ...string) { - driver := GetDriver(b, drivername, driveroptions...) - defer PutDriver(b) - base := stringid.GenerateRandomID() - upper := stringid.GenerateRandomID() - if err := driver.Create(base, "", nil); err != nil { - b.Fatal(err) - } - - if err := addManyFiles(driver, base, bottom, 3); err != nil { - b.Fatal(err) - } - - if err := driver.Create(upper, base, nil); err != nil { - b.Fatal(err) - } - - if err := addManyFiles(driver, upper, top, 6); err != nil { - b.Fatal(err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - arch, err := driver.Diff(upper, "") - if err != nil { - b.Fatal(err) - } - _, err = io.Copy(ioutil.Discard, arch) - if err != nil { - b.Fatalf("Error copying archive: %s", err) - } - arch.Close() - } -} - -// DriverBenchDiffApplyN benchmarks calls to diff and apply together -func DriverBenchDiffApplyN(b *testing.B, fileCount int, drivername string, driveroptions ...string) { - driver := GetDriver(b, drivername, driveroptions...) - defer PutDriver(b) - base := stringid.GenerateRandomID() - upper := stringid.GenerateRandomID() - if err := driver.Create(base, "", nil); err != nil { - b.Fatal(err) - } - - if err := addManyFiles(driver, base, fileCount, 3); err != nil { - b.Fatal(err) - } - - if err := driver.Create(upper, base, nil); err != nil { - b.Fatal(err) - } - - if err := addManyFiles(driver, upper, fileCount, 6); err != nil { - b.Fatal(err) - } - diffSize, err := driver.DiffSize(upper, "") - if err != nil { - b.Fatal(err) - } - b.ResetTimer() - b.StopTimer() - for i := 0; i < b.N; i++ { - diff := stringid.GenerateRandomID() - if err := driver.Create(diff, base, nil); err != nil { - b.Fatal(err) - } - - if err := checkManyFiles(driver, diff, fileCount, 3); err != nil { - b.Fatal(err) - } - - b.StartTimer() - - arch, err := driver.Diff(upper, "") - if err != nil { - b.Fatal(err) - } - - applyDiffSize, err := driver.ApplyDiff(diff, "", arch) - if err != nil { - b.Fatal(err) - } - - b.StopTimer() - arch.Close() - - if applyDiffSize != diffSize { - // TODO: enforce this - //b.Fatalf("Apply diff size different, got %d, expected %s", applyDiffSize, diffSize) - } - if err := checkManyFiles(driver, diff, fileCount, 6); err != nil { - b.Fatal(err) - } - } -} - -// DriverBenchDeepLayerDiff benchmarks calls to diff on top of a given number of layers. -func DriverBenchDeepLayerDiff(b *testing.B, layerCount int, drivername string, driveroptions ...string) { - driver := GetDriver(b, drivername, driveroptions...) - defer PutDriver(b) - - base := stringid.GenerateRandomID() - if err := driver.Create(base, "", nil); err != nil { - b.Fatal(err) - } - - if err := addFiles(driver, base, 50); err != nil { - b.Fatal(err) - } - - topLayer, err := addManyLayers(driver, base, layerCount) - if err != nil { - b.Fatal(err) - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - arch, err := driver.Diff(topLayer, "") - if err != nil { - b.Fatal(err) - } - _, err = io.Copy(ioutil.Discard, arch) - if err != nil { - b.Fatalf("Error copying archive: %s", err) - } - arch.Close() - } -} - -// DriverBenchDeepLayerRead benchmarks calls to read a file under a given number of layers. -func DriverBenchDeepLayerRead(b *testing.B, layerCount int, drivername string, driveroptions ...string) { - driver := GetDriver(b, drivername, driveroptions...) - defer PutDriver(b) - - base := stringid.GenerateRandomID() - if err := driver.Create(base, "", nil); err != nil { - b.Fatal(err) - } - - content := []byte("test content") - if err := addFile(driver, base, "testfile.txt", content); err != nil { - b.Fatal(err) - } - - topLayer, err := addManyLayers(driver, base, layerCount) - if err != nil { - b.Fatal(err) - } - - root, err := driver.Get(topLayer, "") - if err != nil { - b.Fatal(err) - } - defer driver.Put(topLayer) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - - // Read content - c, err := ioutil.ReadFile(filepath.Join(root, "testfile.txt")) - if err != nil { - b.Fatal(err) - } - - b.StopTimer() - if bytes.Compare(c, content) != 0 { - b.Fatalf("Wrong content in file %v, expected %v", c, content) - } - b.StartTimer() - } -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphtest_unix.go b/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphtest_unix.go deleted file mode 100644 index 6e952de78..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphtest_unix.go +++ /dev/null @@ -1,358 +0,0 @@ -// +build linux freebsd solaris - -package graphtest - -import ( - "bytes" - "io/ioutil" - "math/rand" - "os" - "path" - "reflect" - "syscall" - "testing" - "unsafe" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/go-units" -) - -var ( - drv *Driver -) - -// Driver conforms to graphdriver.Driver interface and -// contains information such as root and reference count of the number of clients using it. -// This helps in testing drivers added into the framework. -type Driver struct { - graphdriver.Driver - root string - refCount int -} - -func newDriver(t testing.TB, name string, options []string) *Driver { - root, err := ioutil.TempDir("", "docker-graphtest-") - if err != nil { - t.Fatal(err) - } - - if err := os.MkdirAll(root, 0755); err != nil { - t.Fatal(err) - } - - d, err := graphdriver.GetDriver(name, nil, graphdriver.Options{DriverOptions: options, Root: root}) - if err != nil { - t.Logf("graphdriver: %v\n", err) - if err == graphdriver.ErrNotSupported || err == graphdriver.ErrPrerequisites || err == graphdriver.ErrIncompatibleFS { - t.Skipf("Driver %s not supported", name) - } - t.Fatal(err) - } - return &Driver{d, root, 1} -} - -func cleanup(t testing.TB, d *Driver) { - if err := drv.Cleanup(); err != nil { - t.Fatal(err) - } - os.RemoveAll(d.root) -} - -// GetDriver create a new driver with given name or return an existing driver with the name updating the reference count. -func GetDriver(t testing.TB, name string, options ...string) graphdriver.Driver { - if drv == nil { - drv = newDriver(t, name, options) - } else { - drv.refCount++ - } - return drv -} - -// PutDriver removes the driver if it is no longer used and updates the reference count. -func PutDriver(t testing.TB) { - if drv == nil { - t.Skip("No driver to put!") - } - drv.refCount-- - if drv.refCount == 0 { - cleanup(t, drv) - drv = nil - } -} - -// DriverTestCreateEmpty creates a new image and verifies it is empty and the right metadata -func DriverTestCreateEmpty(t testing.TB, drivername string, driverOptions ...string) { - driver := GetDriver(t, drivername, driverOptions...) - defer PutDriver(t) - - if err := driver.Create("empty", "", nil); err != nil { - t.Fatal(err) - } - - defer func() { - if err := driver.Remove("empty"); err != nil { - t.Fatal(err) - } - }() - - if !driver.Exists("empty") { - t.Fatal("Newly created image doesn't exist") - } - - dir, err := driver.Get("empty", "") - if err != nil { - t.Fatal(err) - } - - verifyFile(t, dir, 0755|os.ModeDir, 0, 0) - - // Verify that the directory is empty - fis, err := readDir(dir) - if err != nil { - t.Fatal(err) - } - - if len(fis) != 0 { - t.Fatal("New directory not empty") - } - - driver.Put("empty") -} - -// DriverTestCreateBase create a base driver and verify. -func DriverTestCreateBase(t testing.TB, drivername string, driverOptions ...string) { - driver := GetDriver(t, drivername, driverOptions...) - defer PutDriver(t) - - createBase(t, driver, "Base") - defer func() { - if err := driver.Remove("Base"); err != nil { - t.Fatal(err) - } - }() - verifyBase(t, driver, "Base") -} - -// DriverTestCreateSnap Create a driver and snap and verify. -func DriverTestCreateSnap(t testing.TB, drivername string, driverOptions ...string) { - driver := GetDriver(t, drivername, driverOptions...) - defer PutDriver(t) - - createBase(t, driver, "Base") - - defer func() { - if err := driver.Remove("Base"); err != nil { - t.Fatal(err) - } - }() - - if err := driver.Create("Snap", "Base", nil); err != nil { - t.Fatal(err) - } - - defer func() { - if err := driver.Remove("Snap"); err != nil { - t.Fatal(err) - } - }() - - verifyBase(t, driver, "Snap") -} - -// DriverTestDeepLayerRead reads a file from a lower layer under a given number of layers -func DriverTestDeepLayerRead(t testing.TB, layerCount int, drivername string, driverOptions ...string) { - driver := GetDriver(t, drivername, driverOptions...) - defer PutDriver(t) - - base := stringid.GenerateRandomID() - if err := driver.Create(base, "", nil); err != nil { - t.Fatal(err) - } - - content := []byte("test content") - if err := addFile(driver, base, "testfile.txt", content); err != nil { - t.Fatal(err) - } - - topLayer, err := addManyLayers(driver, base, layerCount) - if err != nil { - t.Fatal(err) - } - - err = checkManyLayers(driver, topLayer, layerCount) - if err != nil { - t.Fatal(err) - } - - if err := checkFile(driver, topLayer, "testfile.txt", content); err != nil { - t.Fatal(err) - } -} - -// DriverTestDiffApply tests diffing and applying produces the same layer -func DriverTestDiffApply(t testing.TB, fileCount int, drivername string, driverOptions ...string) { - driver := GetDriver(t, drivername, driverOptions...) - defer PutDriver(t) - base := stringid.GenerateRandomID() - upper := stringid.GenerateRandomID() - deleteFile := "file-remove.txt" - deleteFileContent := []byte("This file should get removed in upper!") - deleteDir := "var/lib" - - if err := driver.Create(base, "", nil); err != nil { - t.Fatal(err) - } - - if err := addManyFiles(driver, base, fileCount, 3); err != nil { - t.Fatal(err) - } - - if err := addFile(driver, base, deleteFile, deleteFileContent); err != nil { - t.Fatal(err) - } - - if err := addDirectory(driver, base, deleteDir); err != nil { - t.Fatal(err) - } - - if err := driver.Create(upper, base, nil); err != nil { - t.Fatal(err) - } - - if err := addManyFiles(driver, upper, fileCount, 6); err != nil { - t.Fatal(err) - } - - if err := removeAll(driver, upper, deleteFile, deleteDir); err != nil { - t.Fatal(err) - } - - diffSize, err := driver.DiffSize(upper, "") - if err != nil { - t.Fatal(err) - } - - diff := stringid.GenerateRandomID() - if err := driver.Create(diff, base, nil); err != nil { - t.Fatal(err) - } - - if err := checkManyFiles(driver, diff, fileCount, 3); err != nil { - t.Fatal(err) - } - - if err := checkFile(driver, diff, deleteFile, deleteFileContent); err != nil { - t.Fatal(err) - } - - arch, err := driver.Diff(upper, base) - if err != nil { - t.Fatal(err) - } - - buf := bytes.NewBuffer(nil) - if _, err := buf.ReadFrom(arch); err != nil { - t.Fatal(err) - } - if err := arch.Close(); err != nil { - t.Fatal(err) - } - - applyDiffSize, err := driver.ApplyDiff(diff, base, bytes.NewReader(buf.Bytes())) - if err != nil { - t.Fatal(err) - } - - if applyDiffSize != diffSize { - t.Fatalf("Apply diff size different, got %d, expected %d", applyDiffSize, diffSize) - } - - if err := checkManyFiles(driver, diff, fileCount, 6); err != nil { - t.Fatal(err) - } - - if err := checkFileRemoved(driver, diff, deleteFile); err != nil { - t.Fatal(err) - } - - if err := checkFileRemoved(driver, diff, deleteDir); err != nil { - t.Fatal(err) - } -} - -// DriverTestChanges tests computed changes on a layer matches changes made -func DriverTestChanges(t testing.TB, drivername string, driverOptions ...string) { - driver := GetDriver(t, drivername, driverOptions...) - defer PutDriver(t) - base := stringid.GenerateRandomID() - upper := stringid.GenerateRandomID() - if err := driver.Create(base, "", nil); err != nil { - t.Fatal(err) - } - - if err := addManyFiles(driver, base, 20, 3); err != nil { - t.Fatal(err) - } - - if err := driver.Create(upper, base, nil); err != nil { - t.Fatal(err) - } - - expectedChanges, err := changeManyFiles(driver, upper, 20, 6) - if err != nil { - t.Fatal(err) - } - - changes, err := driver.Changes(upper, base) - if err != nil { - t.Fatal(err) - } - - if err = checkChanges(expectedChanges, changes); err != nil { - t.Fatal(err) - } -} - -func writeRandomFile(path string, size uint64) error { - buf := make([]int64, size/8) - - r := rand.NewSource(0) - for i := range buf { - buf[i] = r.Int63() - } - - // Cast to []byte - header := *(*reflect.SliceHeader)(unsafe.Pointer(&buf)) - header.Len *= 8 - header.Cap *= 8 - data := *(*[]byte)(unsafe.Pointer(&header)) - - return ioutil.WriteFile(path, data, 0700) -} - -// DriverTestSetQuota Create a driver and test setting quota. -func DriverTestSetQuota(t *testing.T, drivername string) { - driver := GetDriver(t, drivername) - defer PutDriver(t) - - createBase(t, driver, "Base") - createOpts := &graphdriver.CreateOpts{} - createOpts.StorageOpt = make(map[string]string, 1) - createOpts.StorageOpt["size"] = "50M" - if err := driver.Create("zfsTest", "Base", createOpts); err != nil { - t.Fatal(err) - } - - mountPath, err := driver.Get("zfsTest", "") - if err != nil { - t.Fatal(err) - } - - quota := uint64(50 * units.MiB) - err = writeRandomFile(path.Join(mountPath, "file"), quota*2) - if pathError, ok := err.(*os.PathError); ok && pathError.Err != syscall.EDQUOT { - t.Fatalf("expect write() to fail with %v, got %v", syscall.EDQUOT, err) - } - -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphtest_windows.go b/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphtest_windows.go deleted file mode 100644 index a50c5211e..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/graphtest_windows.go +++ /dev/null @@ -1 +0,0 @@ -package graphtest diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/testutil.go b/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/testutil.go deleted file mode 100644 index 35bf6d17b..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/testutil.go +++ /dev/null @@ -1,342 +0,0 @@ -package graphtest - -import ( - "bytes" - "fmt" - "io/ioutil" - "math/rand" - "os" - "path" - "sort" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/stringid" -) - -func randomContent(size int, seed int64) []byte { - s := rand.NewSource(seed) - content := make([]byte, size) - - for i := 0; i < len(content); i += 7 { - val := s.Int63() - for j := 0; i+j < len(content) && j < 7; j++ { - content[i+j] = byte(val) - val >>= 8 - } - } - - return content -} - -func addFiles(drv graphdriver.Driver, layer string, seed int64) error { - root, err := drv.Get(layer, "") - if err != nil { - return err - } - defer drv.Put(layer) - - if err := ioutil.WriteFile(path.Join(root, "file-a"), randomContent(64, seed), 0755); err != nil { - return err - } - if err := os.MkdirAll(path.Join(root, "dir-b"), 0755); err != nil { - return err - } - if err := ioutil.WriteFile(path.Join(root, "dir-b", "file-b"), randomContent(128, seed+1), 0755); err != nil { - return err - } - - return ioutil.WriteFile(path.Join(root, "file-c"), randomContent(128*128, seed+2), 0755) -} - -func checkFile(drv graphdriver.Driver, layer, filename string, content []byte) error { - root, err := drv.Get(layer, "") - if err != nil { - return err - } - defer drv.Put(layer) - - fileContent, err := ioutil.ReadFile(path.Join(root, filename)) - if err != nil { - return err - } - - if bytes.Compare(fileContent, content) != 0 { - return fmt.Errorf("mismatched file content %v, expecting %v", fileContent, content) - } - - return nil -} - -func addFile(drv graphdriver.Driver, layer, filename string, content []byte) error { - root, err := drv.Get(layer, "") - if err != nil { - return err - } - defer drv.Put(layer) - - return ioutil.WriteFile(path.Join(root, filename), content, 0755) -} - -func addDirectory(drv graphdriver.Driver, layer, dir string) error { - root, err := drv.Get(layer, "") - if err != nil { - return err - } - defer drv.Put(layer) - - return os.MkdirAll(path.Join(root, dir), 0755) -} - -func removeAll(drv graphdriver.Driver, layer string, names ...string) error { - root, err := drv.Get(layer, "") - if err != nil { - return err - } - defer drv.Put(layer) - - for _, filename := range names { - if err := os.RemoveAll(path.Join(root, filename)); err != nil { - return err - } - } - return nil -} - -func checkFileRemoved(drv graphdriver.Driver, layer, filename string) error { - root, err := drv.Get(layer, "") - if err != nil { - return err - } - defer drv.Put(layer) - - if _, err := os.Stat(path.Join(root, filename)); err == nil { - return fmt.Errorf("file still exists: %s", path.Join(root, filename)) - } else if !os.IsNotExist(err) { - return err - } - - return nil -} - -func addManyFiles(drv graphdriver.Driver, layer string, count int, seed int64) error { - root, err := drv.Get(layer, "") - if err != nil { - return err - } - defer drv.Put(layer) - - for i := 0; i < count; i += 100 { - dir := path.Join(root, fmt.Sprintf("directory-%d", i)) - if err := os.MkdirAll(dir, 0755); err != nil { - return err - } - for j := 0; i+j < count && j < 100; j++ { - file := path.Join(dir, fmt.Sprintf("file-%d", i+j)) - if err := ioutil.WriteFile(file, randomContent(64, seed+int64(i+j)), 0755); err != nil { - return err - } - } - } - - return nil -} - -func changeManyFiles(drv graphdriver.Driver, layer string, count int, seed int64) ([]archive.Change, error) { - root, err := drv.Get(layer, "") - if err != nil { - return nil, err - } - defer drv.Put(layer) - - changes := []archive.Change{} - for i := 0; i < count; i += 100 { - archiveRoot := fmt.Sprintf("/directory-%d", i) - if err := os.MkdirAll(path.Join(root, archiveRoot), 0755); err != nil { - return nil, err - } - for j := 0; i+j < count && j < 100; j++ { - if j == 0 { - changes = append(changes, archive.Change{ - Path: archiveRoot, - Kind: archive.ChangeModify, - }) - } - var change archive.Change - switch j % 3 { - // Update file - case 0: - change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d", i+j)) - change.Kind = archive.ChangeModify - if err := ioutil.WriteFile(path.Join(root, change.Path), randomContent(64, seed+int64(i+j)), 0755); err != nil { - return nil, err - } - // Add file - case 1: - change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d-%d", seed, i+j)) - change.Kind = archive.ChangeAdd - if err := ioutil.WriteFile(path.Join(root, change.Path), randomContent(64, seed+int64(i+j)), 0755); err != nil { - return nil, err - } - // Remove file - case 2: - change.Path = path.Join(archiveRoot, fmt.Sprintf("file-%d", i+j)) - change.Kind = archive.ChangeDelete - if err := os.Remove(path.Join(root, change.Path)); err != nil { - return nil, err - } - } - changes = append(changes, change) - } - } - - return changes, nil -} - -func checkManyFiles(drv graphdriver.Driver, layer string, count int, seed int64) error { - root, err := drv.Get(layer, "") - if err != nil { - return err - } - defer drv.Put(layer) - - for i := 0; i < count; i += 100 { - dir := path.Join(root, fmt.Sprintf("directory-%d", i)) - for j := 0; i+j < count && j < 100; j++ { - file := path.Join(dir, fmt.Sprintf("file-%d", i+j)) - fileContent, err := ioutil.ReadFile(file) - if err != nil { - return err - } - - content := randomContent(64, seed+int64(i+j)) - - if bytes.Compare(fileContent, content) != 0 { - return fmt.Errorf("mismatched file content %v, expecting %v", fileContent, content) - } - } - } - - return nil -} - -type changeList []archive.Change - -func (c changeList) Less(i, j int) bool { - if c[i].Path == c[j].Path { - return c[i].Kind < c[j].Kind - } - return c[i].Path < c[j].Path -} -func (c changeList) Len() int { return len(c) } -func (c changeList) Swap(i, j int) { c[j], c[i] = c[i], c[j] } - -func checkChanges(expected, actual []archive.Change) error { - if len(expected) != len(actual) { - return fmt.Errorf("unexpected number of changes, expected %d, got %d", len(expected), len(actual)) - } - sort.Sort(changeList(expected)) - sort.Sort(changeList(actual)) - - for i := range expected { - if expected[i] != actual[i] { - return fmt.Errorf("unexpected change, expecting %v, got %v", expected[i], actual[i]) - } - } - - return nil -} - -func addLayerFiles(drv graphdriver.Driver, layer, parent string, i int) error { - root, err := drv.Get(layer, "") - if err != nil { - return err - } - defer drv.Put(layer) - - if err := ioutil.WriteFile(path.Join(root, "top-id"), []byte(layer), 0755); err != nil { - return err - } - layerDir := path.Join(root, fmt.Sprintf("layer-%d", i)) - if err := os.MkdirAll(layerDir, 0755); err != nil { - return err - } - if err := ioutil.WriteFile(path.Join(layerDir, "layer-id"), []byte(layer), 0755); err != nil { - return err - } - if err := ioutil.WriteFile(path.Join(layerDir, "parent-id"), []byte(parent), 0755); err != nil { - return err - } - - return nil -} - -func addManyLayers(drv graphdriver.Driver, baseLayer string, count int) (string, error) { - lastLayer := baseLayer - for i := 1; i <= count; i++ { - nextLayer := stringid.GenerateRandomID() - if err := drv.Create(nextLayer, lastLayer, nil); err != nil { - return "", err - } - if err := addLayerFiles(drv, nextLayer, lastLayer, i); err != nil { - return "", err - } - - lastLayer = nextLayer - - } - return lastLayer, nil -} - -func checkManyLayers(drv graphdriver.Driver, layer string, count int) error { - root, err := drv.Get(layer, "") - if err != nil { - return err - } - defer drv.Put(layer) - - layerIDBytes, err := ioutil.ReadFile(path.Join(root, "top-id")) - if err != nil { - return err - } - - if bytes.Compare(layerIDBytes, []byte(layer)) != 0 { - return fmt.Errorf("mismatched file content %v, expecting %v", layerIDBytes, []byte(layer)) - } - - for i := count; i > 0; i-- { - layerDir := path.Join(root, fmt.Sprintf("layer-%d", i)) - - thisLayerIDBytes, err := ioutil.ReadFile(path.Join(layerDir, "layer-id")) - if err != nil { - return err - } - if bytes.Compare(thisLayerIDBytes, layerIDBytes) != 0 { - return fmt.Errorf("mismatched file content %v, expecting %v", thisLayerIDBytes, layerIDBytes) - } - layerIDBytes, err = ioutil.ReadFile(path.Join(layerDir, "parent-id")) - if err != nil { - return err - } - } - return nil -} - -// readDir reads a directory just like ioutil.ReadDir() -// then hides specific files (currently "lost+found") -// so the tests don't "see" it -func readDir(dir string) ([]os.FileInfo, error) { - a, err := ioutil.ReadDir(dir) - if err != nil { - return nil, err - } - - b := a[:0] - for _, x := range a { - if x.Name() != "lost+found" { // ext4 always have this dir - b = append(b, x) - } - } - - return b, nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/testutil_unix.go b/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/testutil_unix.go deleted file mode 100644 index 49b0c2cc3..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/graphtest/testutil_unix.go +++ /dev/null @@ -1,143 +0,0 @@ -// +build linux freebsd - -package graphtest - -import ( - "fmt" - "io/ioutil" - "os" - "path" - "syscall" - "testing" - - "github.com/docker/docker/daemon/graphdriver" -) - -// InitLoopbacks ensures that the loopback devices are properly created within -// the system running the device mapper tests. -func InitLoopbacks() error { - statT, err := getBaseLoopStats() - if err != nil { - return err - } - // create at least 8 loopback files, ya, that is a good number - for i := 0; i < 8; i++ { - loopPath := fmt.Sprintf("/dev/loop%d", i) - // only create new loopback files if they don't exist - if _, err := os.Stat(loopPath); err != nil { - if mkerr := syscall.Mknod(loopPath, - uint32(statT.Mode|syscall.S_IFBLK), int((7<<8)|(i&0xff)|((i&0xfff00)<<12))); mkerr != nil { - return mkerr - } - os.Chown(loopPath, int(statT.Uid), int(statT.Gid)) - } - } - return nil -} - -// getBaseLoopStats inspects /dev/loop0 to collect uid,gid, and mode for the -// loop0 device on the system. If it does not exist we assume 0,0,0660 for the -// stat data -func getBaseLoopStats() (*syscall.Stat_t, error) { - loop0, err := os.Stat("/dev/loop0") - if err != nil { - if os.IsNotExist(err) { - return &syscall.Stat_t{ - Uid: 0, - Gid: 0, - Mode: 0660, - }, nil - } - return nil, err - } - return loop0.Sys().(*syscall.Stat_t), nil -} - -func verifyFile(t testing.TB, path string, mode os.FileMode, uid, gid uint32) { - fi, err := os.Stat(path) - if err != nil { - t.Fatal(err) - } - - if fi.Mode()&os.ModeType != mode&os.ModeType { - t.Fatalf("Expected %s type 0x%x, got 0x%x", path, mode&os.ModeType, fi.Mode()&os.ModeType) - } - - if fi.Mode()&os.ModePerm != mode&os.ModePerm { - t.Fatalf("Expected %s mode %o, got %o", path, mode&os.ModePerm, fi.Mode()&os.ModePerm) - } - - if fi.Mode()&os.ModeSticky != mode&os.ModeSticky { - t.Fatalf("Expected %s sticky 0x%x, got 0x%x", path, mode&os.ModeSticky, fi.Mode()&os.ModeSticky) - } - - if fi.Mode()&os.ModeSetuid != mode&os.ModeSetuid { - t.Fatalf("Expected %s setuid 0x%x, got 0x%x", path, mode&os.ModeSetuid, fi.Mode()&os.ModeSetuid) - } - - if fi.Mode()&os.ModeSetgid != mode&os.ModeSetgid { - t.Fatalf("Expected %s setgid 0x%x, got 0x%x", path, mode&os.ModeSetgid, fi.Mode()&os.ModeSetgid) - } - - if stat, ok := fi.Sys().(*syscall.Stat_t); ok { - if stat.Uid != uid { - t.Fatalf("%s no owned by uid %d", path, uid) - } - if stat.Gid != gid { - t.Fatalf("%s not owned by gid %d", path, gid) - } - } -} - -func createBase(t testing.TB, driver graphdriver.Driver, name string) { - // We need to be able to set any perms - oldmask := syscall.Umask(0) - defer syscall.Umask(oldmask) - - if err := driver.CreateReadWrite(name, "", nil); err != nil { - t.Fatal(err) - } - - dir, err := driver.Get(name, "") - if err != nil { - t.Fatal(err) - } - defer driver.Put(name) - - subdir := path.Join(dir, "a subdir") - if err := os.Mkdir(subdir, 0705|os.ModeSticky); err != nil { - t.Fatal(err) - } - if err := os.Chown(subdir, 1, 2); err != nil { - t.Fatal(err) - } - - file := path.Join(dir, "a file") - if err := ioutil.WriteFile(file, []byte("Some data"), 0222|os.ModeSetuid); err != nil { - t.Fatal(err) - } -} - -func verifyBase(t testing.TB, driver graphdriver.Driver, name string) { - dir, err := driver.Get(name, "") - if err != nil { - t.Fatal(err) - } - defer driver.Put(name) - - subdir := path.Join(dir, "a subdir") - verifyFile(t, subdir, 0705|os.ModeDir|os.ModeSticky, 1, 2) - - file := path.Join(dir, "a file") - verifyFile(t, file, 0222|os.ModeSetuid, 0, 0) - - fis, err := readDir(dir) - if err != nil { - t.Fatal(err) - } - - if len(fis) != 2 { - t.Fatal("Unexpected files in base image") - } - -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/overlay/copy.go b/vendor/github.com/docker/docker/daemon/graphdriver/overlay/copy.go deleted file mode 100644 index 666a5c0e0..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/overlay/copy.go +++ /dev/null @@ -1,174 +0,0 @@ -// +build linux - -package overlay - -import ( - "fmt" - "os" - "path/filepath" - "syscall" - "time" - - "github.com/docker/docker/pkg/pools" - "github.com/docker/docker/pkg/system" - rsystem "github.com/opencontainers/runc/libcontainer/system" -) - -type copyFlags int - -const ( - copyHardlink copyFlags = 1 << iota -) - -func copyRegular(srcPath, dstPath string, mode os.FileMode) error { - srcFile, err := os.Open(srcPath) - if err != nil { - return err - } - defer srcFile.Close() - - dstFile, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE, mode) - if err != nil { - return err - } - defer dstFile.Close() - - _, err = pools.Copy(dstFile, srcFile) - - return err -} - -func copyXattr(srcPath, dstPath, attr string) error { - data, err := system.Lgetxattr(srcPath, attr) - if err != nil { - return err - } - if data != nil { - if err := system.Lsetxattr(dstPath, attr, data, 0); err != nil { - return err - } - } - return nil -} - -func copyDir(srcDir, dstDir string, flags copyFlags) error { - err := filepath.Walk(srcDir, func(srcPath string, f os.FileInfo, err error) error { - if err != nil { - return err - } - - // Rebase path - relPath, err := filepath.Rel(srcDir, srcPath) - if err != nil { - return err - } - - dstPath := filepath.Join(dstDir, relPath) - if err != nil { - return err - } - - stat, ok := f.Sys().(*syscall.Stat_t) - if !ok { - return fmt.Errorf("Unable to get raw syscall.Stat_t data for %s", srcPath) - } - - isHardlink := false - - switch f.Mode() & os.ModeType { - case 0: // Regular file - if flags©Hardlink != 0 { - isHardlink = true - if err := os.Link(srcPath, dstPath); err != nil { - return err - } - } else { - if err := copyRegular(srcPath, dstPath, f.Mode()); err != nil { - return err - } - } - - case os.ModeDir: - if err := os.Mkdir(dstPath, f.Mode()); err != nil && !os.IsExist(err) { - return err - } - - case os.ModeSymlink: - link, err := os.Readlink(srcPath) - if err != nil { - return err - } - - if err := os.Symlink(link, dstPath); err != nil { - return err - } - - case os.ModeNamedPipe: - fallthrough - case os.ModeSocket: - if rsystem.RunningInUserNS() { - // cannot create a device if running in user namespace - return nil - } - if err := syscall.Mkfifo(dstPath, stat.Mode); err != nil { - return err - } - - case os.ModeDevice: - if err := syscall.Mknod(dstPath, stat.Mode, int(stat.Rdev)); err != nil { - return err - } - - default: - return fmt.Errorf("Unknown file type for %s\n", srcPath) - } - - // Everything below is copying metadata from src to dst. All this metadata - // already shares an inode for hardlinks. - if isHardlink { - return nil - } - - if err := os.Lchown(dstPath, int(stat.Uid), int(stat.Gid)); err != nil { - return err - } - - if err := copyXattr(srcPath, dstPath, "security.capability"); err != nil { - return err - } - - // We need to copy this attribute if it appears in an overlay upper layer, as - // this function is used to copy those. It is set by overlay if a directory - // is removed and then re-created and should not inherit anything from the - // same dir in the lower dir. - if err := copyXattr(srcPath, dstPath, "trusted.overlay.opaque"); err != nil { - return err - } - - isSymlink := f.Mode()&os.ModeSymlink != 0 - - // There is no LChmod, so ignore mode for symlink. Also, this - // must happen after chown, as that can modify the file mode - if !isSymlink { - if err := os.Chmod(dstPath, f.Mode()); err != nil { - return err - } - } - - // system.Chtimes doesn't support a NOFOLLOW flag atm - if !isSymlink { - aTime := time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) - mTime := time.Unix(int64(stat.Mtim.Sec), int64(stat.Mtim.Nsec)) - if err := system.Chtimes(dstPath, aTime, mTime); err != nil { - return err - } - } else { - ts := []syscall.Timespec{stat.Atim, stat.Mtim} - if err := system.LUtimesNano(dstPath, ts); err != nil { - return err - } - } - return nil - }) - return err -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay.go b/vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay.go deleted file mode 100644 index 121b72e2c..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay.go +++ /dev/null @@ -1,462 +0,0 @@ -// +build linux - -package overlay - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path" - "strconv" - "syscall" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/daemon/graphdriver/overlayutils" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/fsutils" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/mount" - "github.com/opencontainers/runc/libcontainer/label" -) - -// This is a small wrapper over the NaiveDiffWriter that lets us have a custom -// implementation of ApplyDiff() - -var ( - // ErrApplyDiffFallback is returned to indicate that a normal ApplyDiff is applied as a fallback from Naive diff writer. - ErrApplyDiffFallback = fmt.Errorf("Fall back to normal ApplyDiff") - backingFs = "" -) - -// ApplyDiffProtoDriver wraps the ProtoDriver by extending the interface with ApplyDiff method. -type ApplyDiffProtoDriver interface { - graphdriver.ProtoDriver - // ApplyDiff writes the diff to the archive for the given id and parent id. - // It returns the size in bytes written if successful, an error ErrApplyDiffFallback is returned otherwise. - ApplyDiff(id, parent string, diff io.Reader) (size int64, err error) -} - -type naiveDiffDriverWithApply struct { - graphdriver.Driver - applyDiff ApplyDiffProtoDriver -} - -// NaiveDiffDriverWithApply returns a NaiveDiff driver with custom ApplyDiff. -func NaiveDiffDriverWithApply(driver ApplyDiffProtoDriver, uidMaps, gidMaps []idtools.IDMap) graphdriver.Driver { - return &naiveDiffDriverWithApply{ - Driver: graphdriver.NewNaiveDiffDriver(driver, uidMaps, gidMaps), - applyDiff: driver, - } -} - -// ApplyDiff creates a diff layer with either the NaiveDiffDriver or with a fallback. -func (d *naiveDiffDriverWithApply) ApplyDiff(id, parent string, diff io.Reader) (int64, error) { - b, err := d.applyDiff.ApplyDiff(id, parent, diff) - if err == ErrApplyDiffFallback { - return d.Driver.ApplyDiff(id, parent, diff) - } - return b, err -} - -// This backend uses the overlay union filesystem for containers -// plus hard link file sharing for images. - -// Each container/image can have a "root" subdirectory which is a plain -// filesystem hierarchy, or they can use overlay. - -// If they use overlay there is a "upper" directory and a "lower-id" -// file, as well as "merged" and "work" directories. The "upper" -// directory has the upper layer of the overlay, and "lower-id" contains -// the id of the parent whose "root" directory shall be used as the lower -// layer in the overlay. The overlay itself is mounted in the "merged" -// directory, and the "work" dir is needed for overlay to work. - -// When an overlay layer is created there are two cases, either the -// parent has a "root" dir, then we start out with an empty "upper" -// directory overlaid on the parents root. This is typically the -// case with the init layer of a container which is based on an image. -// If there is no "root" in the parent, we inherit the lower-id from -// the parent and start by making a copy in the parent's "upper" dir. -// This is typically the case for a container layer which copies -// its parent -init upper layer. - -// Additionally we also have a custom implementation of ApplyLayer -// which makes a recursive copy of the parent "root" layer using -// hardlinks to share file data, and then applies the layer on top -// of that. This means all child images share file (but not directory) -// data with the parent. - -// Driver contains information about the home directory and the list of active mounts that are created using this driver. -type Driver struct { - home string - uidMaps []idtools.IDMap - gidMaps []idtools.IDMap - ctr *graphdriver.RefCounter - supportsDType bool -} - -func init() { - graphdriver.Register("overlay", Init) -} - -// Init returns the NaiveDiffDriver, a native diff driver for overlay filesystem. -// If overlay filesystem is not supported on the host, graphdriver.ErrNotSupported is returned as error. -// If an overlay filesystem is not supported over an existing filesystem then error graphdriver.ErrIncompatibleFS is returned. -func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (graphdriver.Driver, error) { - - if err := supportsOverlay(); err != nil { - return nil, graphdriver.ErrNotSupported - } - - fsMagic, err := graphdriver.GetFSMagic(home) - if err != nil { - return nil, err - } - if fsName, ok := graphdriver.FsNames[fsMagic]; ok { - backingFs = fsName - } - - switch fsMagic { - case graphdriver.FsMagicAufs, graphdriver.FsMagicBtrfs, graphdriver.FsMagicOverlay, graphdriver.FsMagicZfs, graphdriver.FsMagicEcryptfs: - logrus.Errorf("'overlay' is not supported over %s", backingFs) - return nil, graphdriver.ErrIncompatibleFS - } - - rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps) - if err != nil { - return nil, err - } - // Create the driver home dir - if err := idtools.MkdirAllAs(home, 0700, rootUID, rootGID); err != nil && !os.IsExist(err) { - return nil, err - } - - if err := mount.MakePrivate(home); err != nil { - return nil, err - } - - supportsDType, err := fsutils.SupportsDType(home) - if err != nil { - return nil, err - } - if !supportsDType { - // not a fatal error until v1.16 (#27443) - logrus.Warn(overlayutils.ErrDTypeNotSupported("overlay", backingFs)) - } - - d := &Driver{ - home: home, - uidMaps: uidMaps, - gidMaps: gidMaps, - ctr: graphdriver.NewRefCounter(graphdriver.NewFsChecker(graphdriver.FsMagicOverlay)), - supportsDType: supportsDType, - } - - return NaiveDiffDriverWithApply(d, uidMaps, gidMaps), nil -} - -func supportsOverlay() error { - // We can try to modprobe overlay first before looking at - // proc/filesystems for when overlay is supported - exec.Command("modprobe", "overlay").Run() - - f, err := os.Open("/proc/filesystems") - if err != nil { - return err - } - defer f.Close() - - s := bufio.NewScanner(f) - for s.Scan() { - if s.Text() == "nodev\toverlay" { - return nil - } - } - logrus.Error("'overlay' not found as a supported filesystem on this host. Please ensure kernel is new enough and has overlay support loaded.") - return graphdriver.ErrNotSupported -} - -func (d *Driver) String() string { - return "overlay" -} - -// Status returns current driver information in a two dimensional string array. -// Output contains "Backing Filesystem" used in this implementation. -func (d *Driver) Status() [][2]string { - return [][2]string{ - {"Backing Filesystem", backingFs}, - {"Supports d_type", strconv.FormatBool(d.supportsDType)}, - } -} - -// GetMetadata returns meta data about the overlay driver such as root, LowerDir, UpperDir, WorkDir and MergeDir used to store data. -func (d *Driver) GetMetadata(id string) (map[string]string, error) { - dir := d.dir(id) - if _, err := os.Stat(dir); err != nil { - return nil, err - } - - metadata := make(map[string]string) - - // If id has a root, it is an image - rootDir := path.Join(dir, "root") - if _, err := os.Stat(rootDir); err == nil { - metadata["RootDir"] = rootDir - return metadata, nil - } - - lowerID, err := ioutil.ReadFile(path.Join(dir, "lower-id")) - if err != nil { - return nil, err - } - - metadata["LowerDir"] = path.Join(d.dir(string(lowerID)), "root") - metadata["UpperDir"] = path.Join(dir, "upper") - metadata["WorkDir"] = path.Join(dir, "work") - metadata["MergedDir"] = path.Join(dir, "merged") - - return metadata, nil -} - -// Cleanup any state created by overlay which should be cleaned when daemon -// is being shutdown. For now, we just have to unmount the bind mounted -// we had created. -func (d *Driver) Cleanup() error { - return mount.Unmount(d.home) -} - -// CreateReadWrite creates a layer that is writable for use as a container -// file system. -func (d *Driver) CreateReadWrite(id, parent string, opts *graphdriver.CreateOpts) error { - return d.Create(id, parent, opts) -} - -// Create is used to create the upper, lower, and merge directories required for overlay fs for a given id. -// The parent filesystem is used to configure these directories for the overlay. -func (d *Driver) Create(id, parent string, opts *graphdriver.CreateOpts) (retErr error) { - - if opts != nil && len(opts.StorageOpt) != 0 { - return fmt.Errorf("--storage-opt is not supported for overlay") - } - - dir := d.dir(id) - - rootUID, rootGID, err := idtools.GetRootUIDGID(d.uidMaps, d.gidMaps) - if err != nil { - return err - } - if err := idtools.MkdirAllAs(path.Dir(dir), 0700, rootUID, rootGID); err != nil { - return err - } - if err := idtools.MkdirAs(dir, 0700, rootUID, rootGID); err != nil { - return err - } - - defer func() { - // Clean up on failure - if retErr != nil { - os.RemoveAll(dir) - } - }() - - // Toplevel images are just a "root" dir - if parent == "" { - if err := idtools.MkdirAs(path.Join(dir, "root"), 0755, rootUID, rootGID); err != nil { - return err - } - return nil - } - - parentDir := d.dir(parent) - - // Ensure parent exists - if _, err := os.Lstat(parentDir); err != nil { - return err - } - - // If parent has a root, just do an overlay to it - parentRoot := path.Join(parentDir, "root") - - if s, err := os.Lstat(parentRoot); err == nil { - if err := idtools.MkdirAs(path.Join(dir, "upper"), s.Mode(), rootUID, rootGID); err != nil { - return err - } - if err := idtools.MkdirAs(path.Join(dir, "work"), 0700, rootUID, rootGID); err != nil { - return err - } - if err := idtools.MkdirAs(path.Join(dir, "merged"), 0700, rootUID, rootGID); err != nil { - return err - } - if err := ioutil.WriteFile(path.Join(dir, "lower-id"), []byte(parent), 0666); err != nil { - return err - } - return nil - } - - // Otherwise, copy the upper and the lower-id from the parent - - lowerID, err := ioutil.ReadFile(path.Join(parentDir, "lower-id")) - if err != nil { - return err - } - - if err := ioutil.WriteFile(path.Join(dir, "lower-id"), lowerID, 0666); err != nil { - return err - } - - parentUpperDir := path.Join(parentDir, "upper") - s, err := os.Lstat(parentUpperDir) - if err != nil { - return err - } - - upperDir := path.Join(dir, "upper") - if err := idtools.MkdirAs(upperDir, s.Mode(), rootUID, rootGID); err != nil { - return err - } - if err := idtools.MkdirAs(path.Join(dir, "work"), 0700, rootUID, rootGID); err != nil { - return err - } - if err := idtools.MkdirAs(path.Join(dir, "merged"), 0700, rootUID, rootGID); err != nil { - return err - } - - return copyDir(parentUpperDir, upperDir, 0) -} - -func (d *Driver) dir(id string) string { - return path.Join(d.home, id) -} - -// Remove cleans the directories that are created for this id. -func (d *Driver) Remove(id string) error { - if err := os.RemoveAll(d.dir(id)); err != nil && !os.IsNotExist(err) { - return err - } - return nil -} - -// Get creates and mounts the required file system for the given id and returns the mount path. -func (d *Driver) Get(id string, mountLabel string) (s string, err error) { - dir := d.dir(id) - if _, err := os.Stat(dir); err != nil { - return "", err - } - // If id has a root, just return it - rootDir := path.Join(dir, "root") - if _, err := os.Stat(rootDir); err == nil { - return rootDir, nil - } - mergedDir := path.Join(dir, "merged") - if count := d.ctr.Increment(mergedDir); count > 1 { - return mergedDir, nil - } - defer func() { - if err != nil { - if c := d.ctr.Decrement(mergedDir); c <= 0 { - syscall.Unmount(mergedDir, 0) - } - } - }() - lowerID, err := ioutil.ReadFile(path.Join(dir, "lower-id")) - if err != nil { - return "", err - } - var ( - lowerDir = path.Join(d.dir(string(lowerID)), "root") - upperDir = path.Join(dir, "upper") - workDir = path.Join(dir, "work") - opts = fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lowerDir, upperDir, workDir) - ) - if err := syscall.Mount("overlay", mergedDir, "overlay", 0, label.FormatMountLabel(opts, mountLabel)); err != nil { - return "", fmt.Errorf("error creating overlay mount to %s: %v", mergedDir, err) - } - // chown "workdir/work" to the remapped root UID/GID. Overlay fs inside a - // user namespace requires this to move a directory from lower to upper. - rootUID, rootGID, err := idtools.GetRootUIDGID(d.uidMaps, d.gidMaps) - if err != nil { - return "", err - } - if err := os.Chown(path.Join(workDir, "work"), rootUID, rootGID); err != nil { - return "", err - } - return mergedDir, nil -} - -// Put unmounts the mount path created for the give id. -func (d *Driver) Put(id string) error { - // If id has a root, just return - if _, err := os.Stat(path.Join(d.dir(id), "root")); err == nil { - return nil - } - mountpoint := path.Join(d.dir(id), "merged") - if count := d.ctr.Decrement(mountpoint); count > 0 { - return nil - } - if err := syscall.Unmount(mountpoint, 0); err != nil { - logrus.Debugf("Failed to unmount %s overlay: %v", id, err) - } - return nil -} - -// ApplyDiff applies the new layer on top of the root, if parent does not exist with will return an ErrApplyDiffFallback error. -func (d *Driver) ApplyDiff(id string, parent string, diff io.Reader) (size int64, err error) { - dir := d.dir(id) - - if parent == "" { - return 0, ErrApplyDiffFallback - } - - parentRootDir := path.Join(d.dir(parent), "root") - if _, err := os.Stat(parentRootDir); err != nil { - return 0, ErrApplyDiffFallback - } - - // We now know there is a parent, and it has a "root" directory containing - // the full root filesystem. We can just hardlink it and apply the - // layer. This relies on two things: - // 1) ApplyDiff is only run once on a clean (no writes to upper layer) container - // 2) ApplyDiff doesn't do any in-place writes to files (would break hardlinks) - // These are all currently true and are not expected to break - - tmpRootDir, err := ioutil.TempDir(dir, "tmproot") - if err != nil { - return 0, err - } - defer func() { - if err != nil { - os.RemoveAll(tmpRootDir) - } else { - os.RemoveAll(path.Join(dir, "upper")) - os.RemoveAll(path.Join(dir, "work")) - os.RemoveAll(path.Join(dir, "merged")) - os.RemoveAll(path.Join(dir, "lower-id")) - } - }() - - if err = copyDir(parentRootDir, tmpRootDir, copyHardlink); err != nil { - return 0, err - } - - options := &archive.TarOptions{UIDMaps: d.uidMaps, GIDMaps: d.gidMaps} - if size, err = graphdriver.ApplyUncompressedLayer(tmpRootDir, diff, options); err != nil { - return 0, err - } - - rootDir := path.Join(dir, "root") - if err := os.Rename(tmpRootDir, rootDir); err != nil { - return 0, err - } - - return -} - -// Exists checks to see if the id is already mounted. -func (d *Driver) Exists(id string) bool { - _, err := os.Stat(d.dir(id)) - return err == nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay_test.go b/vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay_test.go deleted file mode 100644 index 34b6d801f..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// +build linux - -package overlay - -import ( - "testing" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/daemon/graphdriver/graphtest" - "github.com/docker/docker/pkg/archive" -) - -func init() { - // Do not sure chroot to speed run time and allow archive - // errors or hangs to be debugged directly from the test process. - graphdriver.ApplyUncompressedLayer = archive.ApplyUncompressedLayer -} - -// This avoids creating a new driver for each test if all tests are run -// Make sure to put new tests between TestOverlaySetup and TestOverlayTeardown -func TestOverlaySetup(t *testing.T) { - graphtest.GetDriver(t, "overlay") -} - -func TestOverlayCreateEmpty(t *testing.T) { - graphtest.DriverTestCreateEmpty(t, "overlay") -} - -func TestOverlayCreateBase(t *testing.T) { - graphtest.DriverTestCreateBase(t, "overlay") -} - -func TestOverlayCreateSnap(t *testing.T) { - graphtest.DriverTestCreateSnap(t, "overlay") -} - -func TestOverlay50LayerRead(t *testing.T) { - graphtest.DriverTestDeepLayerRead(t, 50, "overlay") -} - -// Fails due to bug in calculating changes after apply -// likely related to https://github.com/docker/docker/issues/21555 -func TestOverlayDiffApply10Files(t *testing.T) { - t.Skipf("Fails to compute changes after apply intermittently") - graphtest.DriverTestDiffApply(t, 10, "overlay") -} - -func TestOverlayChanges(t *testing.T) { - t.Skipf("Fails to compute changes intermittently") - graphtest.DriverTestChanges(t, "overlay") -} - -func TestOverlayTeardown(t *testing.T) { - graphtest.PutDriver(t) -} - -// Benchmarks should always setup new driver - -func BenchmarkExists(b *testing.B) { - graphtest.DriverBenchExists(b, "overlay") -} - -func BenchmarkGetEmpty(b *testing.B) { - graphtest.DriverBenchGetEmpty(b, "overlay") -} - -func BenchmarkDiffBase(b *testing.B) { - graphtest.DriverBenchDiffBase(b, "overlay") -} - -func BenchmarkDiffSmallUpper(b *testing.B) { - graphtest.DriverBenchDiffN(b, 10, 10, "overlay") -} - -func BenchmarkDiff10KFileUpper(b *testing.B) { - graphtest.DriverBenchDiffN(b, 10, 10000, "overlay") -} - -func BenchmarkDiff10KFilesBottom(b *testing.B) { - graphtest.DriverBenchDiffN(b, 10000, 10, "overlay") -} - -func BenchmarkDiffApply100(b *testing.B) { - graphtest.DriverBenchDiffApplyN(b, 100, "overlay") -} - -func BenchmarkDiff20Layers(b *testing.B) { - graphtest.DriverBenchDeepLayerDiff(b, 20, "overlay") -} - -func BenchmarkRead20Layers(b *testing.B) { - graphtest.DriverBenchDeepLayerRead(b, 20, "overlay") -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay_unsupported.go b/vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay_unsupported.go deleted file mode 100644 index 3dbb4de44..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/overlay/overlay_unsupported.go +++ /dev/null @@ -1,3 +0,0 @@ -// +build !linux - -package overlay diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/check.go b/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/check.go deleted file mode 100644 index 53a719929..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/check.go +++ /dev/null @@ -1,79 +0,0 @@ -// +build linux - -package overlay2 - -import ( - "fmt" - "io/ioutil" - "os" - "path" - "path/filepath" - "syscall" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/system" - "github.com/pkg/errors" -) - -// hasOpaqueCopyUpBug checks whether the filesystem has a bug -// which copies up the opaque flag when copying up an opaque -// directory. When this bug exists naive diff should be used. -func hasOpaqueCopyUpBug(d string) error { - td, err := ioutil.TempDir(d, "opaque-bug-check") - if err != nil { - return err - } - defer func() { - if err := os.RemoveAll(td); err != nil { - logrus.Warnf("Failed to remove check directory %v: %v", td, err) - } - }() - - // Make directories l1/d, l2/d, l3, work, merged - if err := os.MkdirAll(filepath.Join(td, "l1", "d"), 0755); err != nil { - return err - } - if err := os.MkdirAll(filepath.Join(td, "l2", "d"), 0755); err != nil { - return err - } - if err := os.Mkdir(filepath.Join(td, "l3"), 0755); err != nil { - return err - } - if err := os.Mkdir(filepath.Join(td, "work"), 0755); err != nil { - return err - } - if err := os.Mkdir(filepath.Join(td, "merged"), 0755); err != nil { - return err - } - - // Mark l2/d as opaque - if err := system.Lsetxattr(filepath.Join(td, "l2", "d"), "trusted.overlay.opaque", []byte("y"), 0); err != nil { - return errors.Wrap(err, "failed to set opaque flag on middle layer") - } - - opts := fmt.Sprintf("lowerdir=%s:%s,upperdir=%s,workdir=%s", path.Join(td, "l2"), path.Join(td, "l1"), path.Join(td, "l3"), path.Join(td, "work")) - if err := syscall.Mount("overlay", filepath.Join(td, "merged"), "overlay", 0, opts); err != nil { - return errors.Wrap(err, "failed to mount overlay") - } - defer func() { - if err := syscall.Unmount(filepath.Join(td, "merged"), 0); err != nil { - logrus.Warnf("Failed to unmount check directory %v: %v", filepath.Join(td, "merged"), err) - } - }() - - // Touch file in d to force copy up of opaque directory "d" from "l2" to "l3" - if err := ioutil.WriteFile(filepath.Join(td, "merged", "d", "f"), []byte{}, 0644); err != nil { - return errors.Wrap(err, "failed to write to merged directory") - } - - // Check l3/d does not have opaque flag - xattrOpaque, err := system.Lgetxattr(filepath.Join(td, "l3", "d"), "trusted.overlay.opaque") - if err != nil { - return errors.Wrap(err, "failed to read opaque flag on upper layer") - } - if string(xattrOpaque) == "y" { - return errors.New("opaque flag erroneously copied up, consider update to kernel 4.8 or later to fix") - } - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/mount.go b/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/mount.go deleted file mode 100644 index 60e248b6d..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/mount.go +++ /dev/null @@ -1,88 +0,0 @@ -// +build linux - -package overlay2 - -import ( - "bytes" - "encoding/json" - "flag" - "fmt" - "os" - "runtime" - "syscall" - - "github.com/docker/docker/pkg/reexec" -) - -func init() { - reexec.Register("docker-mountfrom", mountFromMain) -} - -func fatal(err error) { - fmt.Fprint(os.Stderr, err) - os.Exit(1) -} - -type mountOptions struct { - Device string - Target string - Type string - Label string - Flag uint32 -} - -func mountFrom(dir, device, target, mType string, flags uintptr, label string) error { - options := &mountOptions{ - Device: device, - Target: target, - Type: mType, - Flag: uint32(flags), - Label: label, - } - - cmd := reexec.Command("docker-mountfrom", dir) - w, err := cmd.StdinPipe() - if err != nil { - return fmt.Errorf("mountfrom error on pipe creation: %v", err) - } - - output := bytes.NewBuffer(nil) - cmd.Stdout = output - cmd.Stderr = output - - if err := cmd.Start(); err != nil { - return fmt.Errorf("mountfrom error on re-exec cmd: %v", err) - } - //write the options to the pipe for the untar exec to read - if err := json.NewEncoder(w).Encode(options); err != nil { - return fmt.Errorf("mountfrom json encode to pipe failed: %v", err) - } - w.Close() - - if err := cmd.Wait(); err != nil { - return fmt.Errorf("mountfrom re-exec error: %v: output: %s", err, output) - } - return nil -} - -// mountfromMain is the entry-point for docker-mountfrom on re-exec. -func mountFromMain() { - runtime.LockOSThread() - flag.Parse() - - var options *mountOptions - - if err := json.NewDecoder(os.Stdin).Decode(&options); err != nil { - fatal(err) - } - - if err := os.Chdir(flag.Arg(0)); err != nil { - fatal(err) - } - - if err := syscall.Mount(options.Device, options.Target, options.Type, uintptr(options.Flag), options.Label); err != nil { - fatal(err) - } - - os.Exit(0) -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay.go b/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay.go deleted file mode 100644 index 65ac6bfae..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay.go +++ /dev/null @@ -1,662 +0,0 @@ -// +build linux - -package overlay2 - -import ( - "bufio" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "strconv" - "strings" - "sync" - "syscall" - - "github.com/Sirupsen/logrus" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/daemon/graphdriver/overlayutils" - "github.com/docker/docker/daemon/graphdriver/quota" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/chrootarchive" - "github.com/docker/docker/pkg/directory" - "github.com/docker/docker/pkg/fsutils" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/parsers" - "github.com/docker/docker/pkg/parsers/kernel" - "github.com/docker/go-units" - - "github.com/opencontainers/runc/libcontainer/label" -) - -var ( - // untar defines the untar method - untar = chrootarchive.UntarUncompressed -) - -// This backend uses the overlay union filesystem for containers -// with diff directories for each layer. - -// This version of the overlay driver requires at least kernel -// 4.0.0 in order to support mounting multiple diff directories. - -// Each container/image has at least a "diff" directory and "link" file. -// If there is also a "lower" file when there are diff layers -// below as well as "merged" and "work" directories. The "diff" directory -// has the upper layer of the overlay and is used to capture any -// changes to the layer. The "lower" file contains all the lower layer -// mounts separated by ":" and ordered from uppermost to lowermost -// layers. The overlay itself is mounted in the "merged" directory, -// and the "work" dir is needed for overlay to work. - -// The "link" file for each layer contains a unique string for the layer. -// Under the "l" directory at the root there will be a symbolic link -// with that unique string pointing the "diff" directory for the layer. -// The symbolic links are used to reference lower layers in the "lower" -// file and on mount. The links are used to shorten the total length -// of a layer reference without requiring changes to the layer identifier -// or root directory. Mounts are always done relative to root and -// referencing the symbolic links in order to ensure the number of -// lower directories can fit in a single page for making the mount -// syscall. A hard upper limit of 128 lower layers is enforced to ensure -// that mounts do not fail due to length. - -const ( - driverName = "overlay2" - linkDir = "l" - lowerFile = "lower" - maxDepth = 128 - - // idLength represents the number of random characters - // which can be used to create the unique link identifer - // for every layer. If this value is too long then the - // page size limit for the mount command may be exceeded. - // The idLength should be selected such that following equation - // is true (512 is a buffer for label metadata). - // ((idLength + len(linkDir) + 1) * maxDepth) <= (pageSize - 512) - idLength = 26 -) - -type overlayOptions struct { - overrideKernelCheck bool - quota quota.Quota -} - -// Driver contains information about the home directory and the list of active mounts that are created using this driver. -type Driver struct { - home string - uidMaps []idtools.IDMap - gidMaps []idtools.IDMap - ctr *graphdriver.RefCounter - quotaCtl *quota.Control - options overlayOptions - naiveDiff graphdriver.DiffDriver - supportsDType bool -} - -var ( - backingFs = "" - projectQuotaSupported = false - - useNaiveDiffLock sync.Once - useNaiveDiffOnly bool -) - -func init() { - graphdriver.Register(driverName, Init) -} - -// Init returns the a native diff driver for overlay filesystem. -// If overlay filesystem is not supported on the host, graphdriver.ErrNotSupported is returned as error. -// If an overlay filesystem is not supported over an existing filesystem then error graphdriver.ErrIncompatibleFS is returned. -func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (graphdriver.Driver, error) { - opts, err := parseOptions(options) - if err != nil { - return nil, err - } - - if err := supportsOverlay(); err != nil { - return nil, graphdriver.ErrNotSupported - } - - // require kernel 4.0.0 to ensure multiple lower dirs are supported - v, err := kernel.GetKernelVersion() - if err != nil { - return nil, err - } - if kernel.CompareKernelVersion(*v, kernel.VersionInfo{Kernel: 4, Major: 0, Minor: 0}) < 0 { - if !opts.overrideKernelCheck { - return nil, graphdriver.ErrNotSupported - } - logrus.Warn("Using pre-4.0.0 kernel for overlay2, mount failures may require kernel update") - } - - fsMagic, err := graphdriver.GetFSMagic(home) - if err != nil { - return nil, err - } - if fsName, ok := graphdriver.FsNames[fsMagic]; ok { - backingFs = fsName - } - - // check if they are running over btrfs, aufs, zfs, overlay, or ecryptfs - switch fsMagic { - case graphdriver.FsMagicBtrfs, graphdriver.FsMagicAufs, graphdriver.FsMagicZfs, graphdriver.FsMagicOverlay, graphdriver.FsMagicEcryptfs: - logrus.Errorf("'overlay2' is not supported over %s", backingFs) - return nil, graphdriver.ErrIncompatibleFS - } - - rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps) - if err != nil { - return nil, err - } - // Create the driver home dir - if err := idtools.MkdirAllAs(path.Join(home, linkDir), 0700, rootUID, rootGID); err != nil && !os.IsExist(err) { - return nil, err - } - - if err := mount.MakePrivate(home); err != nil { - return nil, err - } - - supportsDType, err := fsutils.SupportsDType(home) - if err != nil { - return nil, err - } - if !supportsDType { - // not a fatal error until v1.16 (#27443) - logrus.Warn(overlayutils.ErrDTypeNotSupported("overlay2", backingFs)) - } - - d := &Driver{ - home: home, - uidMaps: uidMaps, - gidMaps: gidMaps, - ctr: graphdriver.NewRefCounter(graphdriver.NewFsChecker(graphdriver.FsMagicOverlay)), - supportsDType: supportsDType, - } - - d.naiveDiff = graphdriver.NewNaiveDiffDriver(d, uidMaps, gidMaps) - - if backingFs == "xfs" { - // Try to enable project quota support over xfs. - if d.quotaCtl, err = quota.NewControl(home); err == nil { - projectQuotaSupported = true - } - } - - logrus.Debugf("backingFs=%s, projectQuotaSupported=%v", backingFs, projectQuotaSupported) - - return d, nil -} - -func parseOptions(options []string) (*overlayOptions, error) { - o := &overlayOptions{} - for _, option := range options { - key, val, err := parsers.ParseKeyValueOpt(option) - if err != nil { - return nil, err - } - key = strings.ToLower(key) - switch key { - case "overlay2.override_kernel_check": - o.overrideKernelCheck, err = strconv.ParseBool(val) - if err != nil { - return nil, err - } - - default: - return nil, fmt.Errorf("overlay2: Unknown option %s\n", key) - } - } - return o, nil -} - -func supportsOverlay() error { - // We can try to modprobe overlay first before looking at - // proc/filesystems for when overlay is supported - exec.Command("modprobe", "overlay").Run() - - f, err := os.Open("/proc/filesystems") - if err != nil { - return err - } - defer f.Close() - - s := bufio.NewScanner(f) - for s.Scan() { - if s.Text() == "nodev\toverlay" { - return nil - } - } - logrus.Error("'overlay' not found as a supported filesystem on this host. Please ensure kernel is new enough and has overlay support loaded.") - return graphdriver.ErrNotSupported -} - -func useNaiveDiff(home string) bool { - useNaiveDiffLock.Do(func() { - if err := hasOpaqueCopyUpBug(home); err != nil { - logrus.Warnf("Not using native diff for overlay2: %v", err) - useNaiveDiffOnly = true - } - }) - return useNaiveDiffOnly -} - -func (d *Driver) String() string { - return driverName -} - -// Status returns current driver information in a two dimensional string array. -// Output contains "Backing Filesystem" used in this implementation. -func (d *Driver) Status() [][2]string { - return [][2]string{ - {"Backing Filesystem", backingFs}, - {"Supports d_type", strconv.FormatBool(d.supportsDType)}, - {"Native Overlay Diff", strconv.FormatBool(!useNaiveDiff(d.home))}, - } -} - -// GetMetadata returns meta data about the overlay driver such as -// LowerDir, UpperDir, WorkDir and MergeDir used to store data. -func (d *Driver) GetMetadata(id string) (map[string]string, error) { - dir := d.dir(id) - if _, err := os.Stat(dir); err != nil { - return nil, err - } - - metadata := map[string]string{ - "WorkDir": path.Join(dir, "work"), - "MergedDir": path.Join(dir, "merged"), - "UpperDir": path.Join(dir, "diff"), - } - - lowerDirs, err := d.getLowerDirs(id) - if err != nil { - return nil, err - } - if len(lowerDirs) > 0 { - metadata["LowerDir"] = strings.Join(lowerDirs, ":") - } - - return metadata, nil -} - -// Cleanup any state created by overlay which should be cleaned when daemon -// is being shutdown. For now, we just have to unmount the bind mounted -// we had created. -func (d *Driver) Cleanup() error { - return mount.Unmount(d.home) -} - -// CreateReadWrite creates a layer that is writable for use as a container -// file system. -func (d *Driver) CreateReadWrite(id, parent string, opts *graphdriver.CreateOpts) error { - return d.Create(id, parent, opts) -} - -// Create is used to create the upper, lower, and merge directories required for overlay fs for a given id. -// The parent filesystem is used to configure these directories for the overlay. -func (d *Driver) Create(id, parent string, opts *graphdriver.CreateOpts) (retErr error) { - - if opts != nil && len(opts.StorageOpt) != 0 && !projectQuotaSupported { - return fmt.Errorf("--storage-opt is supported only for overlay over xfs with 'pquota' mount option") - } - - dir := d.dir(id) - - rootUID, rootGID, err := idtools.GetRootUIDGID(d.uidMaps, d.gidMaps) - if err != nil { - return err - } - if err := idtools.MkdirAllAs(path.Dir(dir), 0700, rootUID, rootGID); err != nil { - return err - } - if err := idtools.MkdirAs(dir, 0700, rootUID, rootGID); err != nil { - return err - } - - defer func() { - // Clean up on failure - if retErr != nil { - os.RemoveAll(dir) - } - }() - - if opts != nil && len(opts.StorageOpt) > 0 { - driver := &Driver{} - if err := d.parseStorageOpt(opts.StorageOpt, driver); err != nil { - return err - } - - if driver.options.quota.Size > 0 { - // Set container disk quota limit - if err := d.quotaCtl.SetQuota(dir, driver.options.quota); err != nil { - return err - } - } - } - - if err := idtools.MkdirAs(path.Join(dir, "diff"), 0755, rootUID, rootGID); err != nil { - return err - } - - lid := generateID(idLength) - if err := os.Symlink(path.Join("..", id, "diff"), path.Join(d.home, linkDir, lid)); err != nil { - return err - } - - // Write link id to link file - if err := ioutil.WriteFile(path.Join(dir, "link"), []byte(lid), 0644); err != nil { - return err - } - - // if no parent directory, done - if parent == "" { - return nil - } - - if err := idtools.MkdirAs(path.Join(dir, "work"), 0700, rootUID, rootGID); err != nil { - return err - } - if err := idtools.MkdirAs(path.Join(dir, "merged"), 0700, rootUID, rootGID); err != nil { - return err - } - - lower, err := d.getLower(parent) - if err != nil { - return err - } - if lower != "" { - if err := ioutil.WriteFile(path.Join(dir, lowerFile), []byte(lower), 0666); err != nil { - return err - } - } - - return nil -} - -// Parse overlay storage options -func (d *Driver) parseStorageOpt(storageOpt map[string]string, driver *Driver) error { - // Read size to set the disk project quota per container - for key, val := range storageOpt { - key := strings.ToLower(key) - switch key { - case "size": - size, err := units.RAMInBytes(val) - if err != nil { - return err - } - driver.options.quota.Size = uint64(size) - default: - return fmt.Errorf("Unknown option %s", key) - } - } - - return nil -} - -func (d *Driver) getLower(parent string) (string, error) { - parentDir := d.dir(parent) - - // Ensure parent exists - if _, err := os.Lstat(parentDir); err != nil { - return "", err - } - - // Read Parent link fileA - parentLink, err := ioutil.ReadFile(path.Join(parentDir, "link")) - if err != nil { - return "", err - } - lowers := []string{path.Join(linkDir, string(parentLink))} - - parentLower, err := ioutil.ReadFile(path.Join(parentDir, lowerFile)) - if err == nil { - parentLowers := strings.Split(string(parentLower), ":") - lowers = append(lowers, parentLowers...) - } - if len(lowers) > maxDepth { - return "", errors.New("max depth exceeded") - } - return strings.Join(lowers, ":"), nil -} - -func (d *Driver) dir(id string) string { - return path.Join(d.home, id) -} - -func (d *Driver) getLowerDirs(id string) ([]string, error) { - var lowersArray []string - lowers, err := ioutil.ReadFile(path.Join(d.dir(id), lowerFile)) - if err == nil { - for _, s := range strings.Split(string(lowers), ":") { - lp, err := os.Readlink(path.Join(d.home, s)) - if err != nil { - return nil, err - } - lowersArray = append(lowersArray, path.Clean(path.Join(d.home, linkDir, lp))) - } - } else if !os.IsNotExist(err) { - return nil, err - } - return lowersArray, nil -} - -// Remove cleans the directories that are created for this id. -func (d *Driver) Remove(id string) error { - dir := d.dir(id) - lid, err := ioutil.ReadFile(path.Join(dir, "link")) - if err == nil { - if err := os.RemoveAll(path.Join(d.home, linkDir, string(lid))); err != nil { - logrus.Debugf("Failed to remove link: %v", err) - } - } - - if err := os.RemoveAll(dir); err != nil && !os.IsNotExist(err) { - return err - } - return nil -} - -// Get creates and mounts the required file system for the given id and returns the mount path. -func (d *Driver) Get(id string, mountLabel string) (s string, err error) { - dir := d.dir(id) - if _, err := os.Stat(dir); err != nil { - return "", err - } - - diffDir := path.Join(dir, "diff") - lowers, err := ioutil.ReadFile(path.Join(dir, lowerFile)) - if err != nil { - // If no lower, just return diff directory - if os.IsNotExist(err) { - return diffDir, nil - } - return "", err - } - - mergedDir := path.Join(dir, "merged") - if count := d.ctr.Increment(mergedDir); count > 1 { - return mergedDir, nil - } - defer func() { - if err != nil { - if c := d.ctr.Decrement(mergedDir); c <= 0 { - syscall.Unmount(mergedDir, 0) - } - } - }() - - workDir := path.Join(dir, "work") - splitLowers := strings.Split(string(lowers), ":") - absLowers := make([]string, len(splitLowers)) - for i, s := range splitLowers { - absLowers[i] = path.Join(d.home, s) - } - opts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", strings.Join(absLowers, ":"), path.Join(dir, "diff"), path.Join(dir, "work")) - mountData := label.FormatMountLabel(opts, mountLabel) - mount := syscall.Mount - mountTarget := mergedDir - - pageSize := syscall.Getpagesize() - - // Go can return a larger page size than supported by the system - // as of go 1.7. This will be fixed in 1.8 and this block can be - // removed when building with 1.8. - // See https://github.com/golang/go/commit/1b9499b06989d2831e5b156161d6c07642926ee1 - // See https://github.com/docker/docker/issues/27384 - if pageSize > 4096 { - pageSize = 4096 - } - - // Use relative paths and mountFrom when the mount data has exceeded - // the page size. The mount syscall fails if the mount data cannot - // fit within a page and relative links make the mount data much - // smaller at the expense of requiring a fork exec to chroot. - if len(mountData) > pageSize { - opts = fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", string(lowers), path.Join(id, "diff"), path.Join(id, "work")) - mountData = label.FormatMountLabel(opts, mountLabel) - if len(mountData) > pageSize { - return "", fmt.Errorf("cannot mount layer, mount label too large %d", len(mountData)) - } - - mount = func(source string, target string, mType string, flags uintptr, label string) error { - return mountFrom(d.home, source, target, mType, flags, label) - } - mountTarget = path.Join(id, "merged") - } - - if err := mount("overlay", mountTarget, "overlay", 0, mountData); err != nil { - return "", fmt.Errorf("error creating overlay mount to %s: %v", mergedDir, err) - } - - // chown "workdir/work" to the remapped root UID/GID. Overlay fs inside a - // user namespace requires this to move a directory from lower to upper. - rootUID, rootGID, err := idtools.GetRootUIDGID(d.uidMaps, d.gidMaps) - if err != nil { - return "", err - } - - if err := os.Chown(path.Join(workDir, "work"), rootUID, rootGID); err != nil { - return "", err - } - - return mergedDir, nil -} - -// Put unmounts the mount path created for the give id. -func (d *Driver) Put(id string) error { - mountpoint := path.Join(d.dir(id), "merged") - if count := d.ctr.Decrement(mountpoint); count > 0 { - return nil - } - if err := syscall.Unmount(mountpoint, 0); err != nil { - logrus.Debugf("Failed to unmount %s overlay: %s - %v", id, mountpoint, err) - } - return nil -} - -// Exists checks to see if the id is already mounted. -func (d *Driver) Exists(id string) bool { - _, err := os.Stat(d.dir(id)) - return err == nil -} - -// isParent returns if the passed in parent is the direct parent of the passed in layer -func (d *Driver) isParent(id, parent string) bool { - lowers, err := d.getLowerDirs(id) - if err != nil { - return false - } - if parent == "" && len(lowers) > 0 { - return false - } - - parentDir := d.dir(parent) - var ld string - if len(lowers) > 0 { - ld = filepath.Dir(lowers[0]) - } - if ld == "" && parent == "" { - return true - } - return ld == parentDir -} - -// ApplyDiff applies the new layer into a root -func (d *Driver) ApplyDiff(id string, parent string, diff io.Reader) (size int64, err error) { - if !d.isParent(id, parent) { - return d.naiveDiff.ApplyDiff(id, parent, diff) - } - - applyDir := d.getDiffPath(id) - - logrus.Debugf("Applying tar in %s", applyDir) - // Overlay doesn't need the parent id to apply the diff - if err := untar(diff, applyDir, &archive.TarOptions{ - UIDMaps: d.uidMaps, - GIDMaps: d.gidMaps, - WhiteoutFormat: archive.OverlayWhiteoutFormat, - }); err != nil { - return 0, err - } - - return directory.Size(applyDir) -} - -func (d *Driver) getDiffPath(id string) string { - dir := d.dir(id) - - return path.Join(dir, "diff") -} - -// DiffSize calculates the changes between the specified id -// and its parent and returns the size in bytes of the changes -// relative to its base filesystem directory. -func (d *Driver) DiffSize(id, parent string) (size int64, err error) { - if useNaiveDiff(d.home) || !d.isParent(id, parent) { - return d.naiveDiff.DiffSize(id, parent) - } - return directory.Size(d.getDiffPath(id)) -} - -// Diff produces an archive of the changes between the specified -// layer and its parent layer which may be "". -func (d *Driver) Diff(id, parent string) (io.ReadCloser, error) { - if useNaiveDiff(d.home) || !d.isParent(id, parent) { - return d.naiveDiff.Diff(id, parent) - } - - diffPath := d.getDiffPath(id) - logrus.Debugf("Tar with options on %s", diffPath) - return archive.TarWithOptions(diffPath, &archive.TarOptions{ - Compression: archive.Uncompressed, - UIDMaps: d.uidMaps, - GIDMaps: d.gidMaps, - WhiteoutFormat: archive.OverlayWhiteoutFormat, - }) -} - -// Changes produces a list of changes between the specified layer -// and its parent layer. If parent is "", then all changes will be ADD changes. -func (d *Driver) Changes(id, parent string) ([]archive.Change, error) { - if useNaiveDiff(d.home) || !d.isParent(id, parent) { - return d.naiveDiff.Changes(id, parent) - } - // Overlay doesn't have snapshots, so we need to get changes from all parent - // layers. - diffPath := d.getDiffPath(id) - layers, err := d.getLowerDirs(id) - if err != nil { - return nil, err - } - - return archive.OverlayChanges(layers, diffPath) -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay_test.go b/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay_test.go deleted file mode 100644 index cf77ff22b..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay_test.go +++ /dev/null @@ -1,121 +0,0 @@ -// +build linux - -package overlay2 - -import ( - "io/ioutil" - "os" - "syscall" - "testing" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/daemon/graphdriver/graphtest" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/reexec" -) - -func init() { - // Do not sure chroot to speed run time and allow archive - // errors or hangs to be debugged directly from the test process. - untar = archive.UntarUncompressed - graphdriver.ApplyUncompressedLayer = archive.ApplyUncompressedLayer - - reexec.Init() -} - -func cdMountFrom(dir, device, target, mType, label string) error { - wd, err := os.Getwd() - if err != nil { - return err - } - os.Chdir(dir) - defer os.Chdir(wd) - - return syscall.Mount(device, target, mType, 0, label) -} - -func skipIfNaive(t *testing.T) { - td, err := ioutil.TempDir("", "naive-check-") - if err != nil { - t.Fatalf("Failed to create temp dir: %v", err) - } - defer os.RemoveAll(td) - - if useNaiveDiff(td) { - t.Skipf("Cannot run test with naive diff") - } -} - -// This avoids creating a new driver for each test if all tests are run -// Make sure to put new tests between TestOverlaySetup and TestOverlayTeardown -func TestOverlaySetup(t *testing.T) { - graphtest.GetDriver(t, driverName) -} - -func TestOverlayCreateEmpty(t *testing.T) { - graphtest.DriverTestCreateEmpty(t, driverName) -} - -func TestOverlayCreateBase(t *testing.T) { - graphtest.DriverTestCreateBase(t, driverName) -} - -func TestOverlayCreateSnap(t *testing.T) { - graphtest.DriverTestCreateSnap(t, driverName) -} - -func TestOverlay128LayerRead(t *testing.T) { - graphtest.DriverTestDeepLayerRead(t, 128, driverName) -} - -func TestOverlayDiffApply10Files(t *testing.T) { - skipIfNaive(t) - graphtest.DriverTestDiffApply(t, 10, driverName) -} - -func TestOverlayChanges(t *testing.T) { - skipIfNaive(t) - graphtest.DriverTestChanges(t, driverName) -} - -func TestOverlayTeardown(t *testing.T) { - graphtest.PutDriver(t) -} - -// Benchmarks should always setup new driver - -func BenchmarkExists(b *testing.B) { - graphtest.DriverBenchExists(b, driverName) -} - -func BenchmarkGetEmpty(b *testing.B) { - graphtest.DriverBenchGetEmpty(b, driverName) -} - -func BenchmarkDiffBase(b *testing.B) { - graphtest.DriverBenchDiffBase(b, driverName) -} - -func BenchmarkDiffSmallUpper(b *testing.B) { - graphtest.DriverBenchDiffN(b, 10, 10, driverName) -} - -func BenchmarkDiff10KFileUpper(b *testing.B) { - graphtest.DriverBenchDiffN(b, 10, 10000, driverName) -} - -func BenchmarkDiff10KFilesBottom(b *testing.B) { - graphtest.DriverBenchDiffN(b, 10000, 10, driverName) -} - -func BenchmarkDiffApply100(b *testing.B) { - graphtest.DriverBenchDiffApplyN(b, 100, driverName) -} - -func BenchmarkDiff20Layers(b *testing.B) { - graphtest.DriverBenchDeepLayerDiff(b, 20, driverName) -} - -func BenchmarkRead20Layers(b *testing.B) { - graphtest.DriverBenchDeepLayerRead(b, 20, driverName) -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay_unsupported.go b/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay_unsupported.go deleted file mode 100644 index e5ac4ca8c..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/overlay_unsupported.go +++ /dev/null @@ -1,3 +0,0 @@ -// +build !linux - -package overlay2 diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/randomid.go b/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/randomid.go deleted file mode 100644 index af5cb659d..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/overlay2/randomid.go +++ /dev/null @@ -1,80 +0,0 @@ -// +build linux - -package overlay2 - -import ( - "crypto/rand" - "encoding/base32" - "fmt" - "io" - "os" - "syscall" - "time" - - "github.com/Sirupsen/logrus" -) - -// generateID creates a new random string identifier with the given length -func generateID(l int) string { - const ( - // ensures we backoff for less than 450ms total. Use the following to - // select new value, in units of 10ms: - // n*(n+1)/2 = d -> n^2 + n - 2d -> n = (sqrt(8d + 1) - 1)/2 - maxretries = 9 - backoff = time.Millisecond * 10 - ) - - var ( - totalBackoff time.Duration - count int - retries int - size = (l*5 + 7) / 8 - u = make([]byte, size) - ) - // TODO: Include time component, counter component, random component - - for { - // This should never block but the read may fail. Because of this, - // we just try to read the random number generator until we get - // something. This is a very rare condition but may happen. - b := time.Duration(retries) * backoff - time.Sleep(b) - totalBackoff += b - - n, err := io.ReadFull(rand.Reader, u[count:]) - if err != nil { - if retryOnError(err) && retries < maxretries { - count += n - retries++ - logrus.Errorf("error generating version 4 uuid, retrying: %v", err) - continue - } - - // Any other errors represent a system problem. What did someone - // do to /dev/urandom? - panic(fmt.Errorf("error reading random number generator, retried for %v: %v", totalBackoff.String(), err)) - } - - break - } - - s := base32.StdEncoding.EncodeToString(u) - - return s[:l] -} - -// retryOnError tries to detect whether or not retrying would be fruitful. -func retryOnError(err error) bool { - switch err := err.(type) { - case *os.PathError: - return retryOnError(err.Err) // unpack the target error - case syscall.Errno: - if err == syscall.EPERM { - // EPERM represents an entropy pool exhaustion, a condition under - // which we backoff and retry. - return true - } - } - - return false -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/overlayutils/overlayutils.go b/vendor/github.com/docker/docker/daemon/graphdriver/overlayutils/overlayutils.go deleted file mode 100644 index 67c6640b4..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/overlayutils/overlayutils.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build linux - -package overlayutils - -import ( - "errors" - "fmt" -) - -// ErrDTypeNotSupported denotes that the backing filesystem doesn't support d_type. -func ErrDTypeNotSupported(driver, backingFs string) error { - msg := fmt.Sprintf("%s: the backing %s filesystem is formatted without d_type support, which leads to incorrect behavior.", driver, backingFs) - if backingFs == "xfs" { - msg += " Reformat the filesystem with ftype=1 to enable d_type support." - } - msg += " Running without d_type support will no longer be supported in Docker 1.16." - return errors.New(msg) -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/plugin.go b/vendor/github.com/docker/docker/daemon/graphdriver/plugin.go deleted file mode 100644 index 7294bcc5f..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/plugin.go +++ /dev/null @@ -1,43 +0,0 @@ -package graphdriver - -import ( - "fmt" - "io" - "path/filepath" - - "github.com/docker/docker/pkg/plugingetter" - "github.com/docker/docker/plugin/v2" -) - -type pluginClient interface { - // Call calls the specified method with the specified arguments for the plugin. - Call(string, interface{}, interface{}) error - // Stream calls the specified method with the specified arguments for the plugin and returns the response IO stream - Stream(string, interface{}) (io.ReadCloser, error) - // SendFile calls the specified method, and passes through the IO stream - SendFile(string, io.Reader, interface{}) error -} - -func lookupPlugin(name string, pg plugingetter.PluginGetter, config Options) (Driver, error) { - if !config.ExperimentalEnabled { - return nil, fmt.Errorf("graphdriver plugins are only supported with experimental mode") - } - pl, err := pg.Get(name, "GraphDriver", plugingetter.ACQUIRE) - if err != nil { - return nil, fmt.Errorf("Error looking up graphdriver plugin %s: %v", name, err) - } - return newPluginDriver(name, pl, config) -} - -func newPluginDriver(name string, pl plugingetter.CompatPlugin, config Options) (Driver, error) { - home := config.Root - if !pl.IsV1() { - if p, ok := pl.(*v2.Plugin); ok { - if p.PropagatedMount != "" { - home = p.PluginObj.Config.PropagatedMount - } - } - } - proxy := &graphDriverProxy{name, pl} - return proxy, proxy.Init(filepath.Join(home, name), config.DriverOptions, config.UIDMaps, config.GIDMaps) -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/proxy.go b/vendor/github.com/docker/docker/daemon/graphdriver/proxy.go deleted file mode 100644 index bfe74cc6f..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/proxy.go +++ /dev/null @@ -1,252 +0,0 @@ -package graphdriver - -import ( - "errors" - "fmt" - "io" - "path/filepath" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/plugingetter" -) - -type graphDriverProxy struct { - name string - p plugingetter.CompatPlugin -} - -type graphDriverRequest struct { - ID string `json:",omitempty"` - Parent string `json:",omitempty"` - MountLabel string `json:",omitempty"` - StorageOpt map[string]string `json:",omitempty"` -} - -type graphDriverResponse struct { - Err string `json:",omitempty"` - Dir string `json:",omitempty"` - Exists bool `json:",omitempty"` - Status [][2]string `json:",omitempty"` - Changes []archive.Change `json:",omitempty"` - Size int64 `json:",omitempty"` - Metadata map[string]string `json:",omitempty"` -} - -type graphDriverInitRequest struct { - Home string - Opts []string `json:"Opts"` - UIDMaps []idtools.IDMap `json:"UIDMaps"` - GIDMaps []idtools.IDMap `json:"GIDMaps"` -} - -func (d *graphDriverProxy) Init(home string, opts []string, uidMaps, gidMaps []idtools.IDMap) error { - if !d.p.IsV1() { - if cp, ok := d.p.(plugingetter.CountedPlugin); ok { - // always acquire here, it will be cleaned up on daemon shutdown - cp.Acquire() - } - } - args := &graphDriverInitRequest{ - Home: home, - Opts: opts, - UIDMaps: uidMaps, - GIDMaps: gidMaps, - } - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.Init", args, &ret); err != nil { - return err - } - if ret.Err != "" { - return errors.New(ret.Err) - } - return nil -} - -func (d *graphDriverProxy) String() string { - return d.name -} - -func (d *graphDriverProxy) CreateReadWrite(id, parent string, opts *CreateOpts) error { - args := &graphDriverRequest{ - ID: id, - Parent: parent, - } - if opts != nil { - args.MountLabel = opts.MountLabel - args.StorageOpt = opts.StorageOpt - } - - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.CreateReadWrite", args, &ret); err != nil { - return err - } - if ret.Err != "" { - return errors.New(ret.Err) - } - return nil -} - -func (d *graphDriverProxy) Create(id, parent string, opts *CreateOpts) error { - args := &graphDriverRequest{ - ID: id, - Parent: parent, - } - if opts != nil { - args.MountLabel = opts.MountLabel - args.StorageOpt = opts.StorageOpt - } - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.Create", args, &ret); err != nil { - return err - } - if ret.Err != "" { - return errors.New(ret.Err) - } - return nil -} - -func (d *graphDriverProxy) Remove(id string) error { - args := &graphDriverRequest{ID: id} - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.Remove", args, &ret); err != nil { - return err - } - if ret.Err != "" { - return errors.New(ret.Err) - } - return nil -} - -func (d *graphDriverProxy) Get(id, mountLabel string) (string, error) { - args := &graphDriverRequest{ - ID: id, - MountLabel: mountLabel, - } - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.Get", args, &ret); err != nil { - return "", err - } - var err error - if ret.Err != "" { - err = errors.New(ret.Err) - } - return filepath.Join(d.p.BasePath(), ret.Dir), err -} - -func (d *graphDriverProxy) Put(id string) error { - args := &graphDriverRequest{ID: id} - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.Put", args, &ret); err != nil { - return err - } - if ret.Err != "" { - return errors.New(ret.Err) - } - return nil -} - -func (d *graphDriverProxy) Exists(id string) bool { - args := &graphDriverRequest{ID: id} - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.Exists", args, &ret); err != nil { - return false - } - return ret.Exists -} - -func (d *graphDriverProxy) Status() [][2]string { - args := &graphDriverRequest{} - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.Status", args, &ret); err != nil { - return nil - } - return ret.Status -} - -func (d *graphDriverProxy) GetMetadata(id string) (map[string]string, error) { - args := &graphDriverRequest{ - ID: id, - } - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.GetMetadata", args, &ret); err != nil { - return nil, err - } - if ret.Err != "" { - return nil, errors.New(ret.Err) - } - return ret.Metadata, nil -} - -func (d *graphDriverProxy) Cleanup() error { - if !d.p.IsV1() { - if cp, ok := d.p.(plugingetter.CountedPlugin); ok { - // always release - defer cp.Release() - } - } - - args := &graphDriverRequest{} - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.Cleanup", args, &ret); err != nil { - return nil - } - if ret.Err != "" { - return errors.New(ret.Err) - } - return nil -} - -func (d *graphDriverProxy) Diff(id, parent string) (io.ReadCloser, error) { - args := &graphDriverRequest{ - ID: id, - Parent: parent, - } - body, err := d.p.Client().Stream("GraphDriver.Diff", args) - if err != nil { - return nil, err - } - return body, nil -} - -func (d *graphDriverProxy) Changes(id, parent string) ([]archive.Change, error) { - args := &graphDriverRequest{ - ID: id, - Parent: parent, - } - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.Changes", args, &ret); err != nil { - return nil, err - } - if ret.Err != "" { - return nil, errors.New(ret.Err) - } - - return ret.Changes, nil -} - -func (d *graphDriverProxy) ApplyDiff(id, parent string, diff io.Reader) (int64, error) { - var ret graphDriverResponse - if err := d.p.Client().SendFile(fmt.Sprintf("GraphDriver.ApplyDiff?id=%s&parent=%s", id, parent), diff, &ret); err != nil { - return -1, err - } - if ret.Err != "" { - return -1, errors.New(ret.Err) - } - return ret.Size, nil -} - -func (d *graphDriverProxy) DiffSize(id, parent string) (int64, error) { - args := &graphDriverRequest{ - ID: id, - Parent: parent, - } - var ret graphDriverResponse - if err := d.p.Client().Call("GraphDriver.DiffSize", args, &ret); err != nil { - return -1, err - } - if ret.Err != "" { - return -1, errors.New(ret.Err) - } - return ret.Size, nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/quota/projectquota.go b/vendor/github.com/docker/docker/daemon/graphdriver/quota/projectquota.go deleted file mode 100644 index e408d5f90..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/quota/projectquota.go +++ /dev/null @@ -1,339 +0,0 @@ -// +build linux - -// -// projectquota.go - implements XFS project quota controls -// for setting quota limits on a newly created directory. -// It currently supports the legacy XFS specific ioctls. -// -// TODO: use generic quota control ioctl FS_IOC_FS{GET,SET}XATTR -// for both xfs/ext4 for kernel version >= v4.5 -// - -package quota - -/* -#include -#include -#include -#include -#include - -#ifndef FS_XFLAG_PROJINHERIT -struct fsxattr { - __u32 fsx_xflags; - __u32 fsx_extsize; - __u32 fsx_nextents; - __u32 fsx_projid; - unsigned char fsx_pad[12]; -}; -#define FS_XFLAG_PROJINHERIT 0x00000200 -#endif -#ifndef FS_IOC_FSGETXATTR -#define FS_IOC_FSGETXATTR _IOR ('X', 31, struct fsxattr) -#endif -#ifndef FS_IOC_FSSETXATTR -#define FS_IOC_FSSETXATTR _IOW ('X', 32, struct fsxattr) -#endif - -#ifndef PRJQUOTA -#define PRJQUOTA 2 -#endif -#ifndef XFS_PROJ_QUOTA -#define XFS_PROJ_QUOTA 2 -#endif -#ifndef Q_XSETPQLIM -#define Q_XSETPQLIM QCMD(Q_XSETQLIM, PRJQUOTA) -#endif -#ifndef Q_XGETPQUOTA -#define Q_XGETPQUOTA QCMD(Q_XGETQUOTA, PRJQUOTA) -#endif -*/ -import "C" -import ( - "fmt" - "io/ioutil" - "os" - "path" - "path/filepath" - "syscall" - "unsafe" - - "github.com/Sirupsen/logrus" -) - -// Quota limit params - currently we only control blocks hard limit -type Quota struct { - Size uint64 -} - -// Control - Context to be used by storage driver (e.g. overlay) -// who wants to apply project quotas to container dirs -type Control struct { - backingFsBlockDev string - nextProjectID uint32 - quotas map[string]uint32 -} - -// NewControl - initialize project quota support. -// Test to make sure that quota can be set on a test dir and find -// the first project id to be used for the next container create. -// -// Returns nil (and error) if project quota is not supported. -// -// First get the project id of the home directory. -// This test will fail if the backing fs is not xfs. -// -// xfs_quota tool can be used to assign a project id to the driver home directory, e.g.: -// echo 999:/var/lib/docker/overlay2 >> /etc/projects -// echo docker:999 >> /etc/projid -// xfs_quota -x -c 'project -s docker' / -// -// In that case, the home directory project id will be used as a "start offset" -// and all containers will be assigned larger project ids (e.g. >= 1000). -// This is a way to prevent xfs_quota management from conflicting with docker. -// -// Then try to create a test directory with the next project id and set a quota -// on it. If that works, continue to scan existing containers to map allocated -// project ids. -// -func NewControl(basePath string) (*Control, error) { - // - // Get project id of parent dir as minimal id to be used by driver - // - minProjectID, err := getProjectID(basePath) - if err != nil { - return nil, err - } - minProjectID++ - - // - // create backing filesystem device node - // - backingFsBlockDev, err := makeBackingFsDev(basePath) - if err != nil { - return nil, err - } - - // - // Test if filesystem supports project quotas by trying to set - // a quota on the first available project id - // - quota := Quota{ - Size: 0, - } - if err := setProjectQuota(backingFsBlockDev, minProjectID, quota); err != nil { - return nil, err - } - - q := Control{ - backingFsBlockDev: backingFsBlockDev, - nextProjectID: minProjectID + 1, - quotas: make(map[string]uint32), - } - - // - // get first project id to be used for next container - // - err = q.findNextProjectID(basePath) - if err != nil { - return nil, err - } - - logrus.Debugf("NewControl(%s): nextProjectID = %d", basePath, q.nextProjectID) - return &q, nil -} - -// SetQuota - assign a unique project id to directory and set the quota limits -// for that project id -func (q *Control) SetQuota(targetPath string, quota Quota) error { - - projectID, ok := q.quotas[targetPath] - if !ok { - projectID = q.nextProjectID - - // - // assign project id to new container directory - // - err := setProjectID(targetPath, projectID) - if err != nil { - return err - } - - q.quotas[targetPath] = projectID - q.nextProjectID++ - } - - // - // set the quota limit for the container's project id - // - logrus.Debugf("SetQuota(%s, %d): projectID=%d", targetPath, quota.Size, projectID) - return setProjectQuota(q.backingFsBlockDev, projectID, quota) -} - -// setProjectQuota - set the quota for project id on xfs block device -func setProjectQuota(backingFsBlockDev string, projectID uint32, quota Quota) error { - var d C.fs_disk_quota_t - d.d_version = C.FS_DQUOT_VERSION - d.d_id = C.__u32(projectID) - d.d_flags = C.XFS_PROJ_QUOTA - - d.d_fieldmask = C.FS_DQ_BHARD | C.FS_DQ_BSOFT - d.d_blk_hardlimit = C.__u64(quota.Size / 512) - d.d_blk_softlimit = d.d_blk_hardlimit - - var cs = C.CString(backingFsBlockDev) - defer C.free(unsafe.Pointer(cs)) - - _, _, errno := syscall.Syscall6(syscall.SYS_QUOTACTL, C.Q_XSETPQLIM, - uintptr(unsafe.Pointer(cs)), uintptr(d.d_id), - uintptr(unsafe.Pointer(&d)), 0, 0) - if errno != 0 { - return fmt.Errorf("Failed to set quota limit for projid %d on %s: %v", - projectID, backingFsBlockDev, errno.Error()) - } - - return nil -} - -// GetQuota - get the quota limits of a directory that was configured with SetQuota -func (q *Control) GetQuota(targetPath string, quota *Quota) error { - - projectID, ok := q.quotas[targetPath] - if !ok { - return fmt.Errorf("quota not found for path : %s", targetPath) - } - - // - // get the quota limit for the container's project id - // - var d C.fs_disk_quota_t - - var cs = C.CString(q.backingFsBlockDev) - defer C.free(unsafe.Pointer(cs)) - - _, _, errno := syscall.Syscall6(syscall.SYS_QUOTACTL, C.Q_XGETPQUOTA, - uintptr(unsafe.Pointer(cs)), uintptr(C.__u32(projectID)), - uintptr(unsafe.Pointer(&d)), 0, 0) - if errno != 0 { - return fmt.Errorf("Failed to get quota limit for projid %d on %s: %v", - projectID, q.backingFsBlockDev, errno.Error()) - } - quota.Size = uint64(d.d_blk_hardlimit) * 512 - - return nil -} - -// getProjectID - get the project id of path on xfs -func getProjectID(targetPath string) (uint32, error) { - dir, err := openDir(targetPath) - if err != nil { - return 0, err - } - defer closeDir(dir) - - var fsx C.struct_fsxattr - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSGETXATTR, - uintptr(unsafe.Pointer(&fsx))) - if errno != 0 { - return 0, fmt.Errorf("Failed to get projid for %s: %v", targetPath, errno.Error()) - } - - return uint32(fsx.fsx_projid), nil -} - -// setProjectID - set the project id of path on xfs -func setProjectID(targetPath string, projectID uint32) error { - dir, err := openDir(targetPath) - if err != nil { - return err - } - defer closeDir(dir) - - var fsx C.struct_fsxattr - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSGETXATTR, - uintptr(unsafe.Pointer(&fsx))) - if errno != 0 { - return fmt.Errorf("Failed to get projid for %s: %v", targetPath, errno.Error()) - } - fsx.fsx_projid = C.__u32(projectID) - fsx.fsx_xflags |= C.FS_XFLAG_PROJINHERIT - _, _, errno = syscall.Syscall(syscall.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSSETXATTR, - uintptr(unsafe.Pointer(&fsx))) - if errno != 0 { - return fmt.Errorf("Failed to set projid for %s: %v", targetPath, errno.Error()) - } - - return nil -} - -// findNextProjectID - find the next project id to be used for containers -// by scanning driver home directory to find used project ids -func (q *Control) findNextProjectID(home string) error { - files, err := ioutil.ReadDir(home) - if err != nil { - return fmt.Errorf("read directory failed : %s", home) - } - for _, file := range files { - if !file.IsDir() { - continue - } - path := filepath.Join(home, file.Name()) - projid, err := getProjectID(path) - if err != nil { - return err - } - if projid > 0 { - q.quotas[path] = projid - } - if q.nextProjectID <= projid { - q.nextProjectID = projid + 1 - } - } - - return nil -} - -func free(p *C.char) { - C.free(unsafe.Pointer(p)) -} - -func openDir(path string) (*C.DIR, error) { - Cpath := C.CString(path) - defer free(Cpath) - - dir := C.opendir(Cpath) - if dir == nil { - return nil, fmt.Errorf("Can't open dir") - } - return dir, nil -} - -func closeDir(dir *C.DIR) { - if dir != nil { - C.closedir(dir) - } -} - -func getDirFd(dir *C.DIR) uintptr { - return uintptr(C.dirfd(dir)) -} - -// Get the backing block device of the driver home directory -// and create a block device node under the home directory -// to be used by quotactl commands -func makeBackingFsDev(home string) (string, error) { - fileinfo, err := os.Stat(home) - if err != nil { - return "", err - } - - backingFsBlockDev := path.Join(home, "backingFsBlockDev") - // Re-create just in case comeone copied the home directory over to a new device - syscall.Unlink(backingFsBlockDev) - stat := fileinfo.Sys().(*syscall.Stat_t) - if err := syscall.Mknod(backingFsBlockDev, syscall.S_IFBLK|0600, int(stat.Dev)); err != nil { - return "", fmt.Errorf("Failed to mknod %s: %v", backingFsBlockDev, err) - } - - return backingFsBlockDev, nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_aufs.go b/vendor/github.com/docker/docker/daemon/graphdriver/register/register_aufs.go deleted file mode 100644 index 262954d6e..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_aufs.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !exclude_graphdriver_aufs,linux - -package register - -import ( - // register the aufs graphdriver - _ "github.com/docker/docker/daemon/graphdriver/aufs" -) diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_btrfs.go b/vendor/github.com/docker/docker/daemon/graphdriver/register/register_btrfs.go deleted file mode 100644 index f456cc5ce..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_btrfs.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !exclude_graphdriver_btrfs,linux - -package register - -import ( - // register the btrfs graphdriver - _ "github.com/docker/docker/daemon/graphdriver/btrfs" -) diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_devicemapper.go b/vendor/github.com/docker/docker/daemon/graphdriver/register/register_devicemapper.go deleted file mode 100644 index bb2e9ef54..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_devicemapper.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !exclude_graphdriver_devicemapper,linux - -package register - -import ( - // register the devmapper graphdriver - _ "github.com/docker/docker/daemon/graphdriver/devmapper" -) diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_overlay.go b/vendor/github.com/docker/docker/daemon/graphdriver/register/register_overlay.go deleted file mode 100644 index 9ba849ced..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_overlay.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build !exclude_graphdriver_overlay,linux - -package register - -import ( - // register the overlay graphdriver - _ "github.com/docker/docker/daemon/graphdriver/overlay" - _ "github.com/docker/docker/daemon/graphdriver/overlay2" -) diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_vfs.go b/vendor/github.com/docker/docker/daemon/graphdriver/register/register_vfs.go deleted file mode 100644 index 98fad23b2..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_vfs.go +++ /dev/null @@ -1,6 +0,0 @@ -package register - -import ( - // register vfs - _ "github.com/docker/docker/daemon/graphdriver/vfs" -) diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_windows.go b/vendor/github.com/docker/docker/daemon/graphdriver/register/register_windows.go deleted file mode 100644 index efaa5005e..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -package register - -import ( - // register the windows graph driver - _ "github.com/docker/docker/daemon/graphdriver/windows" -) diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_zfs.go b/vendor/github.com/docker/docker/daemon/graphdriver/register/register_zfs.go deleted file mode 100644 index 8f34e3553..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/register/register_zfs.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !exclude_graphdriver_zfs,linux !exclude_graphdriver_zfs,freebsd, solaris - -package register - -import ( - // register the zfs driver - _ "github.com/docker/docker/daemon/graphdriver/zfs" -) diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/vfs/driver.go b/vendor/github.com/docker/docker/daemon/graphdriver/vfs/driver.go deleted file mode 100644 index 8832d1153..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/vfs/driver.go +++ /dev/null @@ -1,145 +0,0 @@ -package vfs - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/pkg/chrootarchive" - "github.com/docker/docker/pkg/idtools" - - "github.com/opencontainers/runc/libcontainer/label" -) - -var ( - // CopyWithTar defines the copy method to use. - CopyWithTar = chrootarchive.CopyWithTar -) - -func init() { - graphdriver.Register("vfs", Init) -} - -// Init returns a new VFS driver. -// This sets the home directory for the driver and returns NaiveDiffDriver. -func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (graphdriver.Driver, error) { - d := &Driver{ - home: home, - uidMaps: uidMaps, - gidMaps: gidMaps, - } - rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps) - if err != nil { - return nil, err - } - if err := idtools.MkdirAllAs(home, 0700, rootUID, rootGID); err != nil { - return nil, err - } - return graphdriver.NewNaiveDiffDriver(d, uidMaps, gidMaps), nil -} - -// Driver holds information about the driver, home directory of the driver. -// Driver implements graphdriver.ProtoDriver. It uses only basic vfs operations. -// In order to support layering, files are copied from the parent layer into the new layer. There is no copy-on-write support. -// Driver must be wrapped in NaiveDiffDriver to be used as a graphdriver.Driver -type Driver struct { - home string - uidMaps []idtools.IDMap - gidMaps []idtools.IDMap -} - -func (d *Driver) String() string { - return "vfs" -} - -// Status is used for implementing the graphdriver.ProtoDriver interface. VFS does not currently have any status information. -func (d *Driver) Status() [][2]string { - return nil -} - -// GetMetadata is used for implementing the graphdriver.ProtoDriver interface. VFS does not currently have any meta data. -func (d *Driver) GetMetadata(id string) (map[string]string, error) { - return nil, nil -} - -// Cleanup is used to implement graphdriver.ProtoDriver. There is no cleanup required for this driver. -func (d *Driver) Cleanup() error { - return nil -} - -// CreateReadWrite creates a layer that is writable for use as a container -// file system. -func (d *Driver) CreateReadWrite(id, parent string, opts *graphdriver.CreateOpts) error { - return d.Create(id, parent, opts) -} - -// Create prepares the filesystem for the VFS driver and copies the directory for the given id under the parent. -func (d *Driver) Create(id, parent string, opts *graphdriver.CreateOpts) error { - if opts != nil && len(opts.StorageOpt) != 0 { - return fmt.Errorf("--storage-opt is not supported for vfs") - } - - dir := d.dir(id) - rootUID, rootGID, err := idtools.GetRootUIDGID(d.uidMaps, d.gidMaps) - if err != nil { - return err - } - if err := idtools.MkdirAllAs(filepath.Dir(dir), 0700, rootUID, rootGID); err != nil { - return err - } - if err := idtools.MkdirAs(dir, 0755, rootUID, rootGID); err != nil { - return err - } - labelOpts := []string{"level:s0"} - if _, mountLabel, err := label.InitLabels(labelOpts); err == nil { - label.SetFileLabel(dir, mountLabel) - } - if parent == "" { - return nil - } - parentDir, err := d.Get(parent, "") - if err != nil { - return fmt.Errorf("%s: %s", parent, err) - } - if err := CopyWithTar(parentDir, dir); err != nil { - return err - } - return nil -} - -func (d *Driver) dir(id string) string { - return filepath.Join(d.home, "dir", filepath.Base(id)) -} - -// Remove deletes the content from the directory for a given id. -func (d *Driver) Remove(id string) error { - if err := os.RemoveAll(d.dir(id)); err != nil && !os.IsNotExist(err) { - return err - } - return nil -} - -// Get returns the directory for the given id. -func (d *Driver) Get(id, mountLabel string) (string, error) { - dir := d.dir(id) - if st, err := os.Stat(dir); err != nil { - return "", err - } else if !st.IsDir() { - return "", fmt.Errorf("%s: not a directory", dir) - } - return dir, nil -} - -// Put is a noop for vfs that return nil for the error, since this driver has no runtime resources to clean up. -func (d *Driver) Put(id string) error { - // The vfs driver has no runtime resources (e.g. mounts) - // to clean up, so we don't need anything here - return nil -} - -// Exists checks to see if the directory exists for the given id. -func (d *Driver) Exists(id string) bool { - _, err := os.Stat(d.dir(id)) - return err == nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/vfs/vfs_test.go b/vendor/github.com/docker/docker/daemon/graphdriver/vfs/vfs_test.go deleted file mode 100644 index 9ecf21dba..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/vfs/vfs_test.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build linux - -package vfs - -import ( - "testing" - - "github.com/docker/docker/daemon/graphdriver/graphtest" - - "github.com/docker/docker/pkg/reexec" -) - -func init() { - reexec.Init() -} - -// This avoids creating a new driver for each test if all tests are run -// Make sure to put new tests between TestVfsSetup and TestVfsTeardown -func TestVfsSetup(t *testing.T) { - graphtest.GetDriver(t, "vfs") -} - -func TestVfsCreateEmpty(t *testing.T) { - graphtest.DriverTestCreateEmpty(t, "vfs") -} - -func TestVfsCreateBase(t *testing.T) { - graphtest.DriverTestCreateBase(t, "vfs") -} - -func TestVfsCreateSnap(t *testing.T) { - graphtest.DriverTestCreateSnap(t, "vfs") -} - -func TestVfsTeardown(t *testing.T) { - graphtest.PutDriver(t) -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/windows/windows.go b/vendor/github.com/docker/docker/daemon/graphdriver/windows/windows.go deleted file mode 100644 index beac93ae7..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/windows/windows.go +++ /dev/null @@ -1,886 +0,0 @@ -//+build windows - -package windows - -import ( - "bufio" - "bytes" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "path" - "path/filepath" - "strconv" - "strings" - "sync" - "syscall" - "time" - "unsafe" - - "github.com/Microsoft/go-winio" - "github.com/Microsoft/go-winio/archive/tar" - "github.com/Microsoft/go-winio/backuptar" - "github.com/Microsoft/hcsshim" - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/longpath" - "github.com/docker/docker/pkg/reexec" - units "github.com/docker/go-units" - "golang.org/x/sys/windows" -) - -// filterDriver is an HCSShim driver type for the Windows Filter driver. -const filterDriver = 1 - -var ( - // mutatedFiles is a list of files that are mutated by the import process - // and must be backed up and restored. - mutatedFiles = map[string]string{ - "UtilityVM/Files/EFI/Microsoft/Boot/BCD": "bcd.bak", - "UtilityVM/Files/EFI/Microsoft/Boot/BCD.LOG": "bcd.log.bak", - "UtilityVM/Files/EFI/Microsoft/Boot/BCD.LOG1": "bcd.log1.bak", - "UtilityVM/Files/EFI/Microsoft/Boot/BCD.LOG2": "bcd.log2.bak", - } - noreexec = false -) - -// init registers the windows graph drivers to the register. -func init() { - graphdriver.Register("windowsfilter", InitFilter) - // DOCKER_WINDOWSFILTER_NOREEXEC allows for inline processing which makes - // debugging issues in the re-exec codepath significantly easier. - if os.Getenv("DOCKER_WINDOWSFILTER_NOREEXEC") != "" { - logrus.Warnf("WindowsGraphDriver is set to not re-exec. This is intended for debugging purposes only.") - noreexec = true - } else { - reexec.Register("docker-windows-write-layer", writeLayerReexec) - } -} - -type checker struct { -} - -func (c *checker) IsMounted(path string) bool { - return false -} - -// Driver represents a windows graph driver. -type Driver struct { - // info stores the shim driver information - info hcsshim.DriverInfo - ctr *graphdriver.RefCounter - // it is safe for windows to use a cache here because it does not support - // restoring containers when the daemon dies. - cacheMu sync.Mutex - cache map[string]string -} - -// InitFilter returns a new Windows storage filter driver. -func InitFilter(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (graphdriver.Driver, error) { - logrus.Debugf("WindowsGraphDriver InitFilter at %s", home) - - fsType, err := getFileSystemType(string(home[0])) - if err != nil { - return nil, err - } - if strings.ToLower(fsType) == "refs" { - return nil, fmt.Errorf("%s is on an ReFS volume - ReFS volumes are not supported", home) - } - - d := &Driver{ - info: hcsshim.DriverInfo{ - HomeDir: home, - Flavour: filterDriver, - }, - cache: make(map[string]string), - ctr: graphdriver.NewRefCounter(&checker{}), - } - return d, nil -} - -// win32FromHresult is a helper function to get the win32 error code from an HRESULT -func win32FromHresult(hr uintptr) uintptr { - if hr&0x1fff0000 == 0x00070000 { - return hr & 0xffff - } - return hr -} - -// getFileSystemType obtains the type of a file system through GetVolumeInformation -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364993(v=vs.85).aspx -func getFileSystemType(drive string) (fsType string, hr error) { - var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - procGetVolumeInformation = modkernel32.NewProc("GetVolumeInformationW") - buf = make([]uint16, 255) - size = syscall.MAX_PATH + 1 - ) - if len(drive) != 1 { - hr = errors.New("getFileSystemType must be called with a drive letter") - return - } - drive += `:\` - n := uintptr(unsafe.Pointer(nil)) - r0, _, _ := syscall.Syscall9(procGetVolumeInformation.Addr(), 8, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(drive))), n, n, n, n, n, uintptr(unsafe.Pointer(&buf[0])), uintptr(size), 0) - if int32(r0) < 0 { - hr = syscall.Errno(win32FromHresult(r0)) - } - fsType = syscall.UTF16ToString(buf) - return -} - -// String returns the string representation of a driver. This should match -// the name the graph driver has been registered with. -func (d *Driver) String() string { - return "windowsfilter" -} - -// Status returns the status of the driver. -func (d *Driver) Status() [][2]string { - return [][2]string{ - {"Windows", ""}, - } -} - -// Exists returns true if the given id is registered with this driver. -func (d *Driver) Exists(id string) bool { - rID, err := d.resolveID(id) - if err != nil { - return false - } - result, err := hcsshim.LayerExists(d.info, rID) - if err != nil { - return false - } - return result -} - -// CreateReadWrite creates a layer that is writable for use as a container -// file system. -func (d *Driver) CreateReadWrite(id, parent string, opts *graphdriver.CreateOpts) error { - if opts != nil { - return d.create(id, parent, opts.MountLabel, false, opts.StorageOpt) - } - return d.create(id, parent, "", false, nil) -} - -// Create creates a new read-only layer with the given id. -func (d *Driver) Create(id, parent string, opts *graphdriver.CreateOpts) error { - if opts != nil { - return d.create(id, parent, opts.MountLabel, true, opts.StorageOpt) - } - return d.create(id, parent, "", true, nil) -} - -func (d *Driver) create(id, parent, mountLabel string, readOnly bool, storageOpt map[string]string) error { - rPId, err := d.resolveID(parent) - if err != nil { - return err - } - - parentChain, err := d.getLayerChain(rPId) - if err != nil { - return err - } - - var layerChain []string - - if rPId != "" { - parentPath, err := hcsshim.GetLayerMountPath(d.info, rPId) - if err != nil { - return err - } - if _, err := os.Stat(filepath.Join(parentPath, "Files")); err == nil { - // This is a legitimate parent layer (not the empty "-init" layer), - // so include it in the layer chain. - layerChain = []string{parentPath} - } - } - - layerChain = append(layerChain, parentChain...) - - if readOnly { - if err := hcsshim.CreateLayer(d.info, id, rPId); err != nil { - return err - } - } else { - var parentPath string - if len(layerChain) != 0 { - parentPath = layerChain[0] - } - - if err := hcsshim.CreateSandboxLayer(d.info, id, parentPath, layerChain); err != nil { - return err - } - - storageOptions, err := parseStorageOpt(storageOpt) - if err != nil { - return fmt.Errorf("Failed to parse storage options - %s", err) - } - - if storageOptions.size != 0 { - if err := hcsshim.ExpandSandboxSize(d.info, id, storageOptions.size); err != nil { - return err - } - } - } - - if _, err := os.Lstat(d.dir(parent)); err != nil { - if err2 := hcsshim.DestroyLayer(d.info, id); err2 != nil { - logrus.Warnf("Failed to DestroyLayer %s: %s", id, err2) - } - return fmt.Errorf("Cannot create layer with missing parent %s: %s", parent, err) - } - - if err := d.setLayerChain(id, layerChain); err != nil { - if err2 := hcsshim.DestroyLayer(d.info, id); err2 != nil { - logrus.Warnf("Failed to DestroyLayer %s: %s", id, err2) - } - return err - } - - return nil -} - -// dir returns the absolute path to the layer. -func (d *Driver) dir(id string) string { - return filepath.Join(d.info.HomeDir, filepath.Base(id)) -} - -// Remove unmounts and removes the dir information. -func (d *Driver) Remove(id string) error { - rID, err := d.resolveID(id) - if err != nil { - return err - } - - // This retry loop is due to a bug in Windows (Internal bug #9432268) - // if GetContainers fails with ErrVmcomputeOperationInvalidState - // it is a transient error. Retry until it succeeds. - var computeSystems []hcsshim.ContainerProperties - retryCount := 0 - for { - // Get and terminate any template VMs that are currently using the layer - computeSystems, err = hcsshim.GetContainers(hcsshim.ComputeSystemQuery{}) - if err != nil { - if err == hcsshim.ErrVmcomputeOperationInvalidState { - if retryCount >= 5 { - // If we are unable to get the list of containers - // go ahead and attempt to delete the layer anyway - // as it will most likely work. - break - } - retryCount++ - time.Sleep(2 * time.Second) - continue - } - return err - } - break - } - - for _, computeSystem := range computeSystems { - if strings.Contains(computeSystem.RuntimeImagePath, id) && computeSystem.IsRuntimeTemplate { - container, err := hcsshim.OpenContainer(computeSystem.ID) - if err != nil { - return err - } - defer container.Close() - err = container.Terminate() - if hcsshim.IsPending(err) { - err = container.Wait() - } else if hcsshim.IsAlreadyStopped(err) { - err = nil - } - - if err != nil { - return err - } - } - } - - layerPath := filepath.Join(d.info.HomeDir, rID) - tmpID := fmt.Sprintf("%s-removing", rID) - tmpLayerPath := filepath.Join(d.info.HomeDir, tmpID) - if err := os.Rename(layerPath, tmpLayerPath); err != nil && !os.IsNotExist(err) { - return err - } - if err := hcsshim.DestroyLayer(d.info, tmpID); err != nil { - logrus.Errorf("Failed to DestroyLayer %s: %s", id, err) - } - - return nil -} - -// Get returns the rootfs path for the id. This will mount the dir at its given path. -func (d *Driver) Get(id, mountLabel string) (string, error) { - logrus.Debugf("WindowsGraphDriver Get() id %s mountLabel %s", id, mountLabel) - var dir string - - rID, err := d.resolveID(id) - if err != nil { - return "", err - } - if count := d.ctr.Increment(rID); count > 1 { - return d.cache[rID], nil - } - - // Getting the layer paths must be done outside of the lock. - layerChain, err := d.getLayerChain(rID) - if err != nil { - d.ctr.Decrement(rID) - return "", err - } - - if err := hcsshim.ActivateLayer(d.info, rID); err != nil { - d.ctr.Decrement(rID) - return "", err - } - if err := hcsshim.PrepareLayer(d.info, rID, layerChain); err != nil { - d.ctr.Decrement(rID) - if err2 := hcsshim.DeactivateLayer(d.info, rID); err2 != nil { - logrus.Warnf("Failed to Deactivate %s: %s", id, err) - } - return "", err - } - - mountPath, err := hcsshim.GetLayerMountPath(d.info, rID) - if err != nil { - d.ctr.Decrement(rID) - if err2 := hcsshim.DeactivateLayer(d.info, rID); err2 != nil { - logrus.Warnf("Failed to Deactivate %s: %s", id, err) - } - return "", err - } - d.cacheMu.Lock() - d.cache[rID] = mountPath - d.cacheMu.Unlock() - - // If the layer has a mount path, use that. Otherwise, use the - // folder path. - if mountPath != "" { - dir = mountPath - } else { - dir = d.dir(id) - } - - return dir, nil -} - -// Put adds a new layer to the driver. -func (d *Driver) Put(id string) error { - logrus.Debugf("WindowsGraphDriver Put() id %s", id) - - rID, err := d.resolveID(id) - if err != nil { - return err - } - if count := d.ctr.Decrement(rID); count > 0 { - return nil - } - d.cacheMu.Lock() - delete(d.cache, rID) - d.cacheMu.Unlock() - - if err := hcsshim.UnprepareLayer(d.info, rID); err != nil { - return err - } - return hcsshim.DeactivateLayer(d.info, rID) -} - -// Cleanup ensures the information the driver stores is properly removed. -func (d *Driver) Cleanup() error { - return nil -} - -// Diff produces an archive of the changes between the specified -// layer and its parent layer which may be "". -// The layer should be mounted when calling this function -func (d *Driver) Diff(id, parent string) (_ io.ReadCloser, err error) { - rID, err := d.resolveID(id) - if err != nil { - return - } - - layerChain, err := d.getLayerChain(rID) - if err != nil { - return - } - - // this is assuming that the layer is unmounted - if err := hcsshim.UnprepareLayer(d.info, rID); err != nil { - return nil, err - } - prepare := func() { - if err := hcsshim.PrepareLayer(d.info, rID, layerChain); err != nil { - logrus.Warnf("Failed to Deactivate %s: %s", rID, err) - } - } - - arch, err := d.exportLayer(rID, layerChain) - if err != nil { - prepare() - return - } - return ioutils.NewReadCloserWrapper(arch, func() error { - err := arch.Close() - prepare() - return err - }), nil -} - -// Changes produces a list of changes between the specified layer -// and its parent layer. If parent is "", then all changes will be ADD changes. -// The layer should not be mounted when calling this function. -func (d *Driver) Changes(id, parent string) ([]archive.Change, error) { - rID, err := d.resolveID(id) - if err != nil { - return nil, err - } - parentChain, err := d.getLayerChain(rID) - if err != nil { - return nil, err - } - - if err := hcsshim.ActivateLayer(d.info, rID); err != nil { - return nil, err - } - defer func() { - if err2 := hcsshim.DeactivateLayer(d.info, rID); err2 != nil { - logrus.Errorf("changes() failed to DeactivateLayer %s %s: %s", id, rID, err2) - } - }() - - var changes []archive.Change - err = winio.RunWithPrivilege(winio.SeBackupPrivilege, func() error { - r, err := hcsshim.NewLayerReader(d.info, id, parentChain) - if err != nil { - return err - } - defer r.Close() - - for { - name, _, fileInfo, err := r.Next() - if err == io.EOF { - return nil - } - if err != nil { - return err - } - name = filepath.ToSlash(name) - if fileInfo == nil { - changes = append(changes, archive.Change{Path: name, Kind: archive.ChangeDelete}) - } else { - // Currently there is no way to tell between an add and a modify. - changes = append(changes, archive.Change{Path: name, Kind: archive.ChangeModify}) - } - } - }) - if err != nil { - return nil, err - } - - return changes, nil -} - -// ApplyDiff extracts the changeset from the given diff into the -// layer with the specified id and parent, returning the size of the -// new layer in bytes. -// The layer should not be mounted when calling this function -func (d *Driver) ApplyDiff(id, parent string, diff io.Reader) (int64, error) { - var layerChain []string - if parent != "" { - rPId, err := d.resolveID(parent) - if err != nil { - return 0, err - } - parentChain, err := d.getLayerChain(rPId) - if err != nil { - return 0, err - } - parentPath, err := hcsshim.GetLayerMountPath(d.info, rPId) - if err != nil { - return 0, err - } - layerChain = append(layerChain, parentPath) - layerChain = append(layerChain, parentChain...) - } - - size, err := d.importLayer(id, diff, layerChain) - if err != nil { - return 0, err - } - - if err = d.setLayerChain(id, layerChain); err != nil { - return 0, err - } - - return size, nil -} - -// DiffSize calculates the changes between the specified layer -// and its parent and returns the size in bytes of the changes -// relative to its base filesystem directory. -func (d *Driver) DiffSize(id, parent string) (size int64, err error) { - rPId, err := d.resolveID(parent) - if err != nil { - return - } - - changes, err := d.Changes(id, rPId) - if err != nil { - return - } - - layerFs, err := d.Get(id, "") - if err != nil { - return - } - defer d.Put(id) - - return archive.ChangesSize(layerFs, changes), nil -} - -// GetMetadata returns custom driver information. -func (d *Driver) GetMetadata(id string) (map[string]string, error) { - m := make(map[string]string) - m["dir"] = d.dir(id) - return m, nil -} - -func writeTarFromLayer(r hcsshim.LayerReader, w io.Writer) error { - t := tar.NewWriter(w) - for { - name, size, fileInfo, err := r.Next() - if err == io.EOF { - break - } - if err != nil { - return err - } - if fileInfo == nil { - // Write a whiteout file. - hdr := &tar.Header{ - Name: filepath.ToSlash(filepath.Join(filepath.Dir(name), archive.WhiteoutPrefix+filepath.Base(name))), - } - err := t.WriteHeader(hdr) - if err != nil { - return err - } - } else { - err = backuptar.WriteTarFileFromBackupStream(t, r, name, size, fileInfo) - if err != nil { - return err - } - } - } - return t.Close() -} - -// exportLayer generates an archive from a layer based on the given ID. -func (d *Driver) exportLayer(id string, parentLayerPaths []string) (io.ReadCloser, error) { - archive, w := io.Pipe() - go func() { - err := winio.RunWithPrivilege(winio.SeBackupPrivilege, func() error { - r, err := hcsshim.NewLayerReader(d.info, id, parentLayerPaths) - if err != nil { - return err - } - - err = writeTarFromLayer(r, w) - cerr := r.Close() - if err == nil { - err = cerr - } - return err - }) - w.CloseWithError(err) - }() - - return archive, nil -} - -// writeBackupStreamFromTarAndSaveMutatedFiles reads data from a tar stream and -// writes it to a backup stream, and also saves any files that will be mutated -// by the import layer process to a backup location. -func writeBackupStreamFromTarAndSaveMutatedFiles(buf *bufio.Writer, w io.Writer, t *tar.Reader, hdr *tar.Header, root string) (nextHdr *tar.Header, err error) { - var bcdBackup *os.File - var bcdBackupWriter *winio.BackupFileWriter - if backupPath, ok := mutatedFiles[hdr.Name]; ok { - bcdBackup, err = os.Create(filepath.Join(root, backupPath)) - if err != nil { - return nil, err - } - defer func() { - cerr := bcdBackup.Close() - if err == nil { - err = cerr - } - }() - - bcdBackupWriter = winio.NewBackupFileWriter(bcdBackup, false) - defer func() { - cerr := bcdBackupWriter.Close() - if err == nil { - err = cerr - } - }() - - buf.Reset(io.MultiWriter(w, bcdBackupWriter)) - } else { - buf.Reset(w) - } - - defer func() { - ferr := buf.Flush() - if err == nil { - err = ferr - } - }() - - return backuptar.WriteBackupStreamFromTarFile(buf, t, hdr) -} - -func writeLayerFromTar(r io.Reader, w hcsshim.LayerWriter, root string) (int64, error) { - t := tar.NewReader(r) - hdr, err := t.Next() - totalSize := int64(0) - buf := bufio.NewWriter(nil) - for err == nil { - base := path.Base(hdr.Name) - if strings.HasPrefix(base, archive.WhiteoutPrefix) { - name := path.Join(path.Dir(hdr.Name), base[len(archive.WhiteoutPrefix):]) - err = w.Remove(filepath.FromSlash(name)) - if err != nil { - return 0, err - } - hdr, err = t.Next() - } else if hdr.Typeflag == tar.TypeLink { - err = w.AddLink(filepath.FromSlash(hdr.Name), filepath.FromSlash(hdr.Linkname)) - if err != nil { - return 0, err - } - hdr, err = t.Next() - } else { - var ( - name string - size int64 - fileInfo *winio.FileBasicInfo - ) - name, size, fileInfo, err = backuptar.FileInfoFromHeader(hdr) - if err != nil { - return 0, err - } - err = w.Add(filepath.FromSlash(name), fileInfo) - if err != nil { - return 0, err - } - hdr, err = writeBackupStreamFromTarAndSaveMutatedFiles(buf, w, t, hdr, root) - totalSize += size - } - } - if err != io.EOF { - return 0, err - } - return totalSize, nil -} - -// importLayer adds a new layer to the tag and graph store based on the given data. -func (d *Driver) importLayer(id string, layerData io.Reader, parentLayerPaths []string) (size int64, err error) { - if !noreexec { - cmd := reexec.Command(append([]string{"docker-windows-write-layer", d.info.HomeDir, id}, parentLayerPaths...)...) - output := bytes.NewBuffer(nil) - cmd.Stdin = layerData - cmd.Stdout = output - cmd.Stderr = output - - if err = cmd.Start(); err != nil { - return - } - - if err = cmd.Wait(); err != nil { - return 0, fmt.Errorf("re-exec error: %v: output: %s", err, output) - } - - return strconv.ParseInt(output.String(), 10, 64) - } - return writeLayer(layerData, d.info.HomeDir, id, parentLayerPaths...) -} - -// writeLayerReexec is the re-exec entry point for writing a layer from a tar file -func writeLayerReexec() { - size, err := writeLayer(os.Stdin, os.Args[1], os.Args[2], os.Args[3:]...) - if err != nil { - fmt.Fprint(os.Stderr, err) - os.Exit(1) - } - fmt.Fprint(os.Stdout, size) -} - -// writeLayer writes a layer from a tar file. -func writeLayer(layerData io.Reader, home string, id string, parentLayerPaths ...string) (int64, error) { - err := winio.EnableProcessPrivileges([]string{winio.SeBackupPrivilege, winio.SeRestorePrivilege}) - if err != nil { - return 0, err - } - if noreexec { - defer func() { - if err := winio.DisableProcessPrivileges([]string{winio.SeBackupPrivilege, winio.SeRestorePrivilege}); err != nil { - // This should never happen, but just in case when in debugging mode. - // See https://github.com/docker/docker/pull/28002#discussion_r86259241 for rationale. - panic("Failed to disabled process privileges while in non re-exec mode") - } - }() - } - - info := hcsshim.DriverInfo{ - Flavour: filterDriver, - HomeDir: home, - } - - w, err := hcsshim.NewLayerWriter(info, id, parentLayerPaths) - if err != nil { - return 0, err - } - - size, err := writeLayerFromTar(layerData, w, filepath.Join(home, id)) - if err != nil { - return 0, err - } - - err = w.Close() - if err != nil { - return 0, err - } - - return size, nil -} - -// resolveID computes the layerID information based on the given id. -func (d *Driver) resolveID(id string) (string, error) { - content, err := ioutil.ReadFile(filepath.Join(d.dir(id), "layerID")) - if os.IsNotExist(err) { - return id, nil - } else if err != nil { - return "", err - } - return string(content), nil -} - -// setID stores the layerId in disk. -func (d *Driver) setID(id, altID string) error { - err := ioutil.WriteFile(filepath.Join(d.dir(id), "layerId"), []byte(altID), 0600) - if err != nil { - return err - } - return nil -} - -// getLayerChain returns the layer chain information. -func (d *Driver) getLayerChain(id string) ([]string, error) { - jPath := filepath.Join(d.dir(id), "layerchain.json") - content, err := ioutil.ReadFile(jPath) - if os.IsNotExist(err) { - return nil, nil - } else if err != nil { - return nil, fmt.Errorf("Unable to read layerchain file - %s", err) - } - - var layerChain []string - err = json.Unmarshal(content, &layerChain) - if err != nil { - return nil, fmt.Errorf("Failed to unmarshall layerchain json - %s", err) - } - - return layerChain, nil -} - -// setLayerChain stores the layer chain information in disk. -func (d *Driver) setLayerChain(id string, chain []string) error { - content, err := json.Marshal(&chain) - if err != nil { - return fmt.Errorf("Failed to marshall layerchain json - %s", err) - } - - jPath := filepath.Join(d.dir(id), "layerchain.json") - err = ioutil.WriteFile(jPath, content, 0600) - if err != nil { - return fmt.Errorf("Unable to write layerchain file - %s", err) - } - - return nil -} - -type fileGetCloserWithBackupPrivileges struct { - path string -} - -func (fg *fileGetCloserWithBackupPrivileges) Get(filename string) (io.ReadCloser, error) { - if backupPath, ok := mutatedFiles[filename]; ok { - return os.Open(filepath.Join(fg.path, backupPath)) - } - - var f *os.File - // Open the file while holding the Windows backup privilege. This ensures that the - // file can be opened even if the caller does not actually have access to it according - // to the security descriptor. - err := winio.RunWithPrivilege(winio.SeBackupPrivilege, func() error { - path := longpath.AddPrefix(filepath.Join(fg.path, filename)) - p, err := syscall.UTF16FromString(path) - if err != nil { - return err - } - h, err := syscall.CreateFile(&p[0], syscall.GENERIC_READ, syscall.FILE_SHARE_READ, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS, 0) - if err != nil { - return &os.PathError{Op: "open", Path: path, Err: err} - } - f = os.NewFile(uintptr(h), path) - return nil - }) - return f, err -} - -func (fg *fileGetCloserWithBackupPrivileges) Close() error { - return nil -} - -// DiffGetter returns a FileGetCloser that can read files from the directory that -// contains files for the layer differences. Used for direct access for tar-split. -func (d *Driver) DiffGetter(id string) (graphdriver.FileGetCloser, error) { - id, err := d.resolveID(id) - if err != nil { - return nil, err - } - - return &fileGetCloserWithBackupPrivileges{d.dir(id)}, nil -} - -type storageOptions struct { - size uint64 -} - -func parseStorageOpt(storageOpt map[string]string) (*storageOptions, error) { - options := storageOptions{} - - // Read size to change the block device size per container. - for key, val := range storageOpt { - key := strings.ToLower(key) - switch key { - case "size": - size, err := units.RAMInBytes(val) - if err != nil { - return nil, err - } - options.size = uint64(size) - default: - return nil, fmt.Errorf("Unknown storage option: %s", key) - } - } - return &options, nil -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/MAINTAINERS b/vendor/github.com/docker/docker/daemon/graphdriver/zfs/MAINTAINERS deleted file mode 100644 index 9c270c541..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/MAINTAINERS +++ /dev/null @@ -1,2 +0,0 @@ -Jörg Thalheim (@Mic92) -Arthur Gautier (@baloose) diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs.go b/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs.go deleted file mode 100644 index 8e283ccf4..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs.go +++ /dev/null @@ -1,417 +0,0 @@ -// +build linux freebsd solaris - -package zfs - -import ( - "fmt" - "os" - "os/exec" - "path" - "strconv" - "strings" - "sync" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/parsers" - zfs "github.com/mistifyio/go-zfs" - "github.com/opencontainers/runc/libcontainer/label" -) - -type zfsOptions struct { - fsName string - mountPath string -} - -func init() { - graphdriver.Register("zfs", Init) -} - -// Logger returns a zfs logger implementation. -type Logger struct{} - -// Log wraps log message from ZFS driver with a prefix '[zfs]'. -func (*Logger) Log(cmd []string) { - logrus.Debugf("[zfs] %s", strings.Join(cmd, " ")) -} - -// Init returns a new ZFS driver. -// It takes base mount path and an array of options which are represented as key value pairs. -// Each option is in the for key=value. 'zfs.fsname' is expected to be a valid key in the options. -func Init(base string, opt []string, uidMaps, gidMaps []idtools.IDMap) (graphdriver.Driver, error) { - var err error - - if _, err := exec.LookPath("zfs"); err != nil { - logrus.Debugf("[zfs] zfs command is not available: %v", err) - return nil, graphdriver.ErrPrerequisites - } - - file, err := os.OpenFile("/dev/zfs", os.O_RDWR, 600) - if err != nil { - logrus.Debugf("[zfs] cannot open /dev/zfs: %v", err) - return nil, graphdriver.ErrPrerequisites - } - defer file.Close() - - options, err := parseOptions(opt) - if err != nil { - return nil, err - } - options.mountPath = base - - rootdir := path.Dir(base) - - if options.fsName == "" { - err = checkRootdirFs(rootdir) - if err != nil { - return nil, err - } - } - - if options.fsName == "" { - options.fsName, err = lookupZfsDataset(rootdir) - if err != nil { - return nil, err - } - } - - zfs.SetLogger(new(Logger)) - - filesystems, err := zfs.Filesystems(options.fsName) - if err != nil { - return nil, fmt.Errorf("Cannot find root filesystem %s: %v", options.fsName, err) - } - - filesystemsCache := make(map[string]bool, len(filesystems)) - var rootDataset *zfs.Dataset - for _, fs := range filesystems { - if fs.Name == options.fsName { - rootDataset = fs - } - filesystemsCache[fs.Name] = true - } - - if rootDataset == nil { - return nil, fmt.Errorf("BUG: zfs get all -t filesystem -rHp '%s' should contain '%s'", options.fsName, options.fsName) - } - - rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps) - if err != nil { - return nil, fmt.Errorf("Failed to get root uid/guid: %v", err) - } - if err := idtools.MkdirAllAs(base, 0700, rootUID, rootGID); err != nil { - return nil, fmt.Errorf("Failed to create '%s': %v", base, err) - } - - if err := mount.MakePrivate(base); err != nil { - return nil, err - } - d := &Driver{ - dataset: rootDataset, - options: options, - filesystemsCache: filesystemsCache, - uidMaps: uidMaps, - gidMaps: gidMaps, - ctr: graphdriver.NewRefCounter(graphdriver.NewDefaultChecker()), - } - return graphdriver.NewNaiveDiffDriver(d, uidMaps, gidMaps), nil -} - -func parseOptions(opt []string) (zfsOptions, error) { - var options zfsOptions - options.fsName = "" - for _, option := range opt { - key, val, err := parsers.ParseKeyValueOpt(option) - if err != nil { - return options, err - } - key = strings.ToLower(key) - switch key { - case "zfs.fsname": - options.fsName = val - default: - return options, fmt.Errorf("Unknown option %s", key) - } - } - return options, nil -} - -func lookupZfsDataset(rootdir string) (string, error) { - var stat syscall.Stat_t - if err := syscall.Stat(rootdir, &stat); err != nil { - return "", fmt.Errorf("Failed to access '%s': %s", rootdir, err) - } - wantedDev := stat.Dev - - mounts, err := mount.GetMounts() - if err != nil { - return "", err - } - for _, m := range mounts { - if err := syscall.Stat(m.Mountpoint, &stat); err != nil { - logrus.Debugf("[zfs] failed to stat '%s' while scanning for zfs mount: %v", m.Mountpoint, err) - continue // may fail on fuse file systems - } - - if stat.Dev == wantedDev && m.Fstype == "zfs" { - return m.Source, nil - } - } - - return "", fmt.Errorf("Failed to find zfs dataset mounted on '%s' in /proc/mounts", rootdir) -} - -// Driver holds information about the driver, such as zfs dataset, options and cache. -type Driver struct { - dataset *zfs.Dataset - options zfsOptions - sync.Mutex // protects filesystem cache against concurrent access - filesystemsCache map[string]bool - uidMaps []idtools.IDMap - gidMaps []idtools.IDMap - ctr *graphdriver.RefCounter -} - -func (d *Driver) String() string { - return "zfs" -} - -// Cleanup is used to implement graphdriver.ProtoDriver. There is no cleanup required for this driver. -func (d *Driver) Cleanup() error { - return nil -} - -// Status returns information about the ZFS filesystem. It returns a two dimensional array of information -// such as pool name, dataset name, disk usage, parent quota and compression used. -// Currently it return 'Zpool', 'Zpool Health', 'Parent Dataset', 'Space Used By Parent', -// 'Space Available', 'Parent Quota' and 'Compression'. -func (d *Driver) Status() [][2]string { - parts := strings.Split(d.dataset.Name, "/") - pool, err := zfs.GetZpool(parts[0]) - - var poolName, poolHealth string - if err == nil { - poolName = pool.Name - poolHealth = pool.Health - } else { - poolName = fmt.Sprintf("error while getting pool information %v", err) - poolHealth = "not available" - } - - quota := "no" - if d.dataset.Quota != 0 { - quota = strconv.FormatUint(d.dataset.Quota, 10) - } - - return [][2]string{ - {"Zpool", poolName}, - {"Zpool Health", poolHealth}, - {"Parent Dataset", d.dataset.Name}, - {"Space Used By Parent", strconv.FormatUint(d.dataset.Used, 10)}, - {"Space Available", strconv.FormatUint(d.dataset.Avail, 10)}, - {"Parent Quota", quota}, - {"Compression", d.dataset.Compression}, - } -} - -// GetMetadata returns image/container metadata related to graph driver -func (d *Driver) GetMetadata(id string) (map[string]string, error) { - return nil, nil -} - -func (d *Driver) cloneFilesystem(name, parentName string) error { - snapshotName := fmt.Sprintf("%d", time.Now().Nanosecond()) - parentDataset := zfs.Dataset{Name: parentName} - snapshot, err := parentDataset.Snapshot(snapshotName /*recursive */, false) - if err != nil { - return err - } - - _, err = snapshot.Clone(name, map[string]string{"mountpoint": "legacy"}) - if err == nil { - d.Lock() - d.filesystemsCache[name] = true - d.Unlock() - } - - if err != nil { - snapshot.Destroy(zfs.DestroyDeferDeletion) - return err - } - return snapshot.Destroy(zfs.DestroyDeferDeletion) -} - -func (d *Driver) zfsPath(id string) string { - return d.options.fsName + "/" + id -} - -func (d *Driver) mountPath(id string) string { - return path.Join(d.options.mountPath, "graph", getMountpoint(id)) -} - -// CreateReadWrite creates a layer that is writable for use as a container -// file system. -func (d *Driver) CreateReadWrite(id, parent string, opts *graphdriver.CreateOpts) error { - return d.Create(id, parent, opts) -} - -// Create prepares the dataset and filesystem for the ZFS driver for the given id under the parent. -func (d *Driver) Create(id, parent string, opts *graphdriver.CreateOpts) error { - var storageOpt map[string]string - if opts != nil { - storageOpt = opts.StorageOpt - } - - err := d.create(id, parent, storageOpt) - if err == nil { - return nil - } - if zfsError, ok := err.(*zfs.Error); ok { - if !strings.HasSuffix(zfsError.Stderr, "dataset already exists\n") { - return err - } - // aborted build -> cleanup - } else { - return err - } - - dataset := zfs.Dataset{Name: d.zfsPath(id)} - if err := dataset.Destroy(zfs.DestroyRecursiveClones); err != nil { - return err - } - - // retry - return d.create(id, parent, storageOpt) -} - -func (d *Driver) create(id, parent string, storageOpt map[string]string) error { - name := d.zfsPath(id) - quota, err := parseStorageOpt(storageOpt) - if err != nil { - return err - } - if parent == "" { - mountoptions := map[string]string{"mountpoint": "legacy"} - fs, err := zfs.CreateFilesystem(name, mountoptions) - if err == nil { - err = setQuota(name, quota) - if err == nil { - d.Lock() - d.filesystemsCache[fs.Name] = true - d.Unlock() - } - } - return err - } - err = d.cloneFilesystem(name, d.zfsPath(parent)) - if err == nil { - err = setQuota(name, quota) - } - return err -} - -func parseStorageOpt(storageOpt map[string]string) (string, error) { - // Read size to change the disk quota per container - for k, v := range storageOpt { - key := strings.ToLower(k) - switch key { - case "size": - return v, nil - default: - return "0", fmt.Errorf("Unknown option %s", key) - } - } - return "0", nil -} - -func setQuota(name string, quota string) error { - if quota == "0" { - return nil - } - fs, err := zfs.GetDataset(name) - if err != nil { - return err - } - return fs.SetProperty("quota", quota) -} - -// Remove deletes the dataset, filesystem and the cache for the given id. -func (d *Driver) Remove(id string) error { - name := d.zfsPath(id) - dataset := zfs.Dataset{Name: name} - err := dataset.Destroy(zfs.DestroyRecursive) - if err == nil { - d.Lock() - delete(d.filesystemsCache, name) - d.Unlock() - } - return err -} - -// Get returns the mountpoint for the given id after creating the target directories if necessary. -func (d *Driver) Get(id, mountLabel string) (string, error) { - mountpoint := d.mountPath(id) - if count := d.ctr.Increment(mountpoint); count > 1 { - return mountpoint, nil - } - - filesystem := d.zfsPath(id) - options := label.FormatMountLabel("", mountLabel) - logrus.Debugf(`[zfs] mount("%s", "%s", "%s")`, filesystem, mountpoint, options) - - rootUID, rootGID, err := idtools.GetRootUIDGID(d.uidMaps, d.gidMaps) - if err != nil { - d.ctr.Decrement(mountpoint) - return "", err - } - // Create the target directories if they don't exist - if err := idtools.MkdirAllAs(mountpoint, 0755, rootUID, rootGID); err != nil { - d.ctr.Decrement(mountpoint) - return "", err - } - - if err := mount.Mount(filesystem, mountpoint, "zfs", options); err != nil { - d.ctr.Decrement(mountpoint) - return "", fmt.Errorf("error creating zfs mount of %s to %s: %v", filesystem, mountpoint, err) - } - - // this could be our first mount after creation of the filesystem, and the root dir may still have root - // permissions instead of the remapped root uid:gid (if user namespaces are enabled): - if err := os.Chown(mountpoint, rootUID, rootGID); err != nil { - mount.Unmount(mountpoint) - d.ctr.Decrement(mountpoint) - return "", fmt.Errorf("error modifying zfs mountpoint (%s) directory ownership: %v", mountpoint, err) - } - - return mountpoint, nil -} - -// Put removes the existing mountpoint for the given id if it exists. -func (d *Driver) Put(id string) error { - mountpoint := d.mountPath(id) - if count := d.ctr.Decrement(mountpoint); count > 0 { - return nil - } - mounted, err := graphdriver.Mounted(graphdriver.FsMagicZfs, mountpoint) - if err != nil || !mounted { - return err - } - - logrus.Debugf(`[zfs] unmount("%s")`, mountpoint) - - if err := mount.Unmount(mountpoint); err != nil { - return fmt.Errorf("error unmounting to %s: %v", mountpoint, err) - } - return nil -} - -// Exists checks to see if the cache entry exists for the given id. -func (d *Driver) Exists(id string) bool { - d.Lock() - defer d.Unlock() - return d.filesystemsCache[d.zfsPath(id)] == true -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_freebsd.go b/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_freebsd.go deleted file mode 100644 index 1c05fa794..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_freebsd.go +++ /dev/null @@ -1,38 +0,0 @@ -package zfs - -import ( - "fmt" - "strings" - "syscall" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/graphdriver" -) - -func checkRootdirFs(rootdir string) error { - var buf syscall.Statfs_t - if err := syscall.Statfs(rootdir, &buf); err != nil { - return fmt.Errorf("Failed to access '%s': %s", rootdir, err) - } - - // on FreeBSD buf.Fstypename contains ['z', 'f', 's', 0 ... ] - if (buf.Fstypename[0] != 122) || (buf.Fstypename[1] != 102) || (buf.Fstypename[2] != 115) || (buf.Fstypename[3] != 0) { - logrus.Debugf("[zfs] no zfs dataset found for rootdir '%s'", rootdir) - return graphdriver.ErrPrerequisites - } - - return nil -} - -func getMountpoint(id string) string { - maxlen := 12 - - // we need to preserve filesystem suffix - suffix := strings.SplitN(id, "-", 2) - - if len(suffix) > 1 { - return id[:maxlen] + "-" + suffix[1] - } - - return id[:maxlen] -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_linux.go b/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_linux.go deleted file mode 100644 index 52ed51604..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_linux.go +++ /dev/null @@ -1,27 +0,0 @@ -package zfs - -import ( - "fmt" - "syscall" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/graphdriver" -) - -func checkRootdirFs(rootdir string) error { - var buf syscall.Statfs_t - if err := syscall.Statfs(rootdir, &buf); err != nil { - return fmt.Errorf("Failed to access '%s': %s", rootdir, err) - } - - if graphdriver.FsMagic(buf.Type) != graphdriver.FsMagicZfs { - logrus.Debugf("[zfs] no zfs dataset found for rootdir '%s'", rootdir) - return graphdriver.ErrPrerequisites - } - - return nil -} - -func getMountpoint(id string) string { - return id -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_solaris.go b/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_solaris.go deleted file mode 100644 index bb4a85bd6..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_solaris.go +++ /dev/null @@ -1,59 +0,0 @@ -// +build solaris,cgo - -package zfs - -/* -#include -#include - -static inline struct statvfs *getstatfs(char *s) { - struct statvfs *buf; - int err; - buf = (struct statvfs *)malloc(sizeof(struct statvfs)); - err = statvfs(s, buf); - return buf; -} -*/ -import "C" -import ( - "path/filepath" - "strings" - "unsafe" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/graphdriver" -) - -func checkRootdirFs(rootdir string) error { - - cs := C.CString(filepath.Dir(rootdir)) - buf := C.getstatfs(cs) - - // on Solaris buf.f_basetype contains ['z', 'f', 's', 0 ... ] - if (buf.f_basetype[0] != 122) || (buf.f_basetype[1] != 102) || (buf.f_basetype[2] != 115) || - (buf.f_basetype[3] != 0) { - logrus.Debugf("[zfs] no zfs dataset found for rootdir '%s'", rootdir) - C.free(unsafe.Pointer(buf)) - return graphdriver.ErrPrerequisites - } - - C.free(unsafe.Pointer(buf)) - C.free(unsafe.Pointer(cs)) - return nil -} - -/* rootfs is introduced to comply with the OCI spec -which states that root filesystem must be mounted at /rootfs/ instead of / -*/ -func getMountpoint(id string) string { - maxlen := 12 - - // we need to preserve filesystem suffix - suffix := strings.SplitN(id, "-", 2) - - if len(suffix) > 1 { - return filepath.Join(id[:maxlen]+"-"+suffix[1], "rootfs", "root") - } - - return filepath.Join(id[:maxlen], "rootfs", "root") -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_test.go b/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_test.go deleted file mode 100644 index 3e2292843..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build linux - -package zfs - -import ( - "testing" - - "github.com/docker/docker/daemon/graphdriver/graphtest" -) - -// This avoids creating a new driver for each test if all tests are run -// Make sure to put new tests between TestZfsSetup and TestZfsTeardown -func TestZfsSetup(t *testing.T) { - graphtest.GetDriver(t, "zfs") -} - -func TestZfsCreateEmpty(t *testing.T) { - graphtest.DriverTestCreateEmpty(t, "zfs") -} - -func TestZfsCreateBase(t *testing.T) { - graphtest.DriverTestCreateBase(t, "zfs") -} - -func TestZfsCreateSnap(t *testing.T) { - graphtest.DriverTestCreateSnap(t, "zfs") -} - -func TestZfsSetQuota(t *testing.T) { - graphtest.DriverTestSetQuota(t, "zfs") -} - -func TestZfsTeardown(t *testing.T) { - graphtest.PutDriver(t) -} diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_unsupported.go b/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_unsupported.go deleted file mode 100644 index ce8daadaf..000000000 --- a/vendor/github.com/docker/docker/daemon/graphdriver/zfs/zfs_unsupported.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build !linux,!freebsd,!solaris - -package zfs - -func checkRootdirFs(rootdir string) error { - return nil -} - -func getMountpoint(id string) string { - return id -} diff --git a/vendor/github.com/docker/docker/daemon/health.go b/vendor/github.com/docker/docker/daemon/health.go deleted file mode 100644 index 5b01dc0f4..000000000 --- a/vendor/github.com/docker/docker/daemon/health.go +++ /dev/null @@ -1,341 +0,0 @@ -package daemon - -import ( - "bytes" - "fmt" - "runtime" - "strings" - "sync" - "time" - - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/strslice" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/exec" -) - -const ( - // Longest healthcheck probe output message to store. Longer messages will be truncated. - maxOutputLen = 4096 - - // Default interval between probe runs (from the end of the first to the start of the second). - // Also the time before the first probe. - defaultProbeInterval = 30 * time.Second - - // The maximum length of time a single probe run should take. If the probe takes longer - // than this, the check is considered to have failed. - defaultProbeTimeout = 30 * time.Second - - // Default number of consecutive failures of the health check - // for the container to be considered unhealthy. - defaultProbeRetries = 3 - - // Maximum number of entries to record - maxLogEntries = 5 -) - -const ( - // Exit status codes that can be returned by the probe command. - - exitStatusHealthy = 0 // Container is healthy - exitStatusUnhealthy = 1 // Container is unhealthy -) - -// probe implementations know how to run a particular type of probe. -type probe interface { - // Perform one run of the check. Returns the exit code and an optional - // short diagnostic string. - run(context.Context, *Daemon, *container.Container) (*types.HealthcheckResult, error) -} - -// cmdProbe implements the "CMD" probe type. -type cmdProbe struct { - // Run the command with the system's default shell instead of execing it directly. - shell bool -} - -// exec the healthcheck command in the container. -// Returns the exit code and probe output (if any) -func (p *cmdProbe) run(ctx context.Context, d *Daemon, container *container.Container) (*types.HealthcheckResult, error) { - - cmdSlice := strslice.StrSlice(container.Config.Healthcheck.Test)[1:] - if p.shell { - cmdSlice = append(getShell(container.Config), cmdSlice...) - } - entrypoint, args := d.getEntrypointAndArgs(strslice.StrSlice{}, cmdSlice) - execConfig := exec.NewConfig() - execConfig.OpenStdin = false - execConfig.OpenStdout = true - execConfig.OpenStderr = true - execConfig.ContainerID = container.ID - execConfig.DetachKeys = []byte{} - execConfig.Entrypoint = entrypoint - execConfig.Args = args - execConfig.Tty = false - execConfig.Privileged = false - execConfig.User = container.Config.User - - d.registerExecCommand(container, execConfig) - d.LogContainerEvent(container, "exec_create: "+execConfig.Entrypoint+" "+strings.Join(execConfig.Args, " ")) - - output := &limitedBuffer{} - err := d.ContainerExecStart(ctx, execConfig.ID, nil, output, output) - if err != nil { - return nil, err - } - info, err := d.getExecConfig(execConfig.ID) - if err != nil { - return nil, err - } - if info.ExitCode == nil { - return nil, fmt.Errorf("Healthcheck for container %s has no exit code!", container.ID) - } - // Note: Go's json package will handle invalid UTF-8 for us - out := output.String() - return &types.HealthcheckResult{ - End: time.Now(), - ExitCode: *info.ExitCode, - Output: out, - }, nil -} - -// Update the container's Status.Health struct based on the latest probe's result. -func handleProbeResult(d *Daemon, c *container.Container, result *types.HealthcheckResult, done chan struct{}) { - c.Lock() - defer c.Unlock() - - // probe may have been cancelled while waiting on lock. Ignore result then - select { - case <-done: - return - default: - } - - retries := c.Config.Healthcheck.Retries - if retries <= 0 { - retries = defaultProbeRetries - } - - h := c.State.Health - oldStatus := h.Status - - if len(h.Log) >= maxLogEntries { - h.Log = append(h.Log[len(h.Log)+1-maxLogEntries:], result) - } else { - h.Log = append(h.Log, result) - } - - if result.ExitCode == exitStatusHealthy { - h.FailingStreak = 0 - h.Status = types.Healthy - } else { - // Failure (including invalid exit code) - h.FailingStreak++ - if h.FailingStreak >= retries { - h.Status = types.Unhealthy - } - // Else we're starting or healthy. Stay in that state. - } - - if oldStatus != h.Status { - d.LogContainerEvent(c, "health_status: "+h.Status) - } -} - -// Run the container's monitoring thread until notified via "stop". -// There is never more than one monitor thread running per container at a time. -func monitor(d *Daemon, c *container.Container, stop chan struct{}, probe probe) { - probeTimeout := timeoutWithDefault(c.Config.Healthcheck.Timeout, defaultProbeTimeout) - probeInterval := timeoutWithDefault(c.Config.Healthcheck.Interval, defaultProbeInterval) - for { - select { - case <-stop: - logrus.Debugf("Stop healthcheck monitoring for container %s (received while idle)", c.ID) - return - case <-time.After(probeInterval): - logrus.Debugf("Running health check for container %s ...", c.ID) - startTime := time.Now() - ctx, cancelProbe := context.WithTimeout(context.Background(), probeTimeout) - results := make(chan *types.HealthcheckResult) - go func() { - healthChecksCounter.Inc() - result, err := probe.run(ctx, d, c) - if err != nil { - healthChecksFailedCounter.Inc() - logrus.Warnf("Health check for container %s error: %v", c.ID, err) - results <- &types.HealthcheckResult{ - ExitCode: -1, - Output: err.Error(), - Start: startTime, - End: time.Now(), - } - } else { - result.Start = startTime - logrus.Debugf("Health check for container %s done (exitCode=%d)", c.ID, result.ExitCode) - results <- result - } - close(results) - }() - select { - case <-stop: - logrus.Debugf("Stop healthcheck monitoring for container %s (received while probing)", c.ID) - // Stop timeout and kill probe, but don't wait for probe to exit. - cancelProbe() - return - case result := <-results: - handleProbeResult(d, c, result, stop) - // Stop timeout - cancelProbe() - case <-ctx.Done(): - logrus.Debugf("Health check for container %s taking too long", c.ID) - handleProbeResult(d, c, &types.HealthcheckResult{ - ExitCode: -1, - Output: fmt.Sprintf("Health check exceeded timeout (%v)", probeTimeout), - Start: startTime, - End: time.Now(), - }, stop) - cancelProbe() - // Wait for probe to exit (it might take a while to respond to the TERM - // signal and we don't want dying probes to pile up). - <-results - } - } - } -} - -// Get a suitable probe implementation for the container's healthcheck configuration. -// Nil will be returned if no healthcheck was configured or NONE was set. -func getProbe(c *container.Container) probe { - config := c.Config.Healthcheck - if config == nil || len(config.Test) == 0 { - return nil - } - switch config.Test[0] { - case "CMD": - return &cmdProbe{shell: false} - case "CMD-SHELL": - return &cmdProbe{shell: true} - default: - logrus.Warnf("Unknown healthcheck type '%s' (expected 'CMD') in container %s", config.Test[0], c.ID) - return nil - } -} - -// Ensure the health-check monitor is running or not, depending on the current -// state of the container. -// Called from monitor.go, with c locked. -func (d *Daemon) updateHealthMonitor(c *container.Container) { - h := c.State.Health - if h == nil { - return // No healthcheck configured - } - - probe := getProbe(c) - wantRunning := c.Running && !c.Paused && probe != nil - if wantRunning { - if stop := h.OpenMonitorChannel(); stop != nil { - go monitor(d, c, stop, probe) - } - } else { - h.CloseMonitorChannel() - } -} - -// Reset the health state for a newly-started, restarted or restored container. -// initHealthMonitor is called from monitor.go and we should never be running -// two instances at once. -// Called with c locked. -func (d *Daemon) initHealthMonitor(c *container.Container) { - // If no healthcheck is setup then don't init the monitor - if getProbe(c) == nil { - return - } - - // This is needed in case we're auto-restarting - d.stopHealthchecks(c) - - if h := c.State.Health; h != nil { - h.Status = types.Starting - h.FailingStreak = 0 - } else { - h := &container.Health{} - h.Status = types.Starting - c.State.Health = h - } - - d.updateHealthMonitor(c) -} - -// Called when the container is being stopped (whether because the health check is -// failing or for any other reason). -func (d *Daemon) stopHealthchecks(c *container.Container) { - h := c.State.Health - if h != nil { - h.CloseMonitorChannel() - } -} - -// Buffer up to maxOutputLen bytes. Further data is discarded. -type limitedBuffer struct { - buf bytes.Buffer - mu sync.Mutex - truncated bool // indicates that data has been lost -} - -// Append to limitedBuffer while there is room. -func (b *limitedBuffer) Write(data []byte) (int, error) { - b.mu.Lock() - defer b.mu.Unlock() - - bufLen := b.buf.Len() - dataLen := len(data) - keep := min(maxOutputLen-bufLen, dataLen) - if keep > 0 { - b.buf.Write(data[:keep]) - } - if keep < dataLen { - b.truncated = true - } - return dataLen, nil -} - -// The contents of the buffer, with "..." appended if it overflowed. -func (b *limitedBuffer) String() string { - b.mu.Lock() - defer b.mu.Unlock() - - out := b.buf.String() - if b.truncated { - out = out + "..." - } - return out -} - -// If configuredValue is zero, use defaultValue instead. -func timeoutWithDefault(configuredValue time.Duration, defaultValue time.Duration) time.Duration { - if configuredValue == 0 { - return defaultValue - } - return configuredValue -} - -func min(x, y int) int { - if x < y { - return x - } - return y -} - -func getShell(config *containertypes.Config) []string { - if len(config.Shell) != 0 { - return config.Shell - } - if runtime.GOOS != "windows" { - return []string{"/bin/sh", "-c"} - } - return []string{"cmd", "/S", "/C"} -} diff --git a/vendor/github.com/docker/docker/daemon/health_test.go b/vendor/github.com/docker/docker/daemon/health_test.go deleted file mode 100644 index 7e82115d4..000000000 --- a/vendor/github.com/docker/docker/daemon/health_test.go +++ /dev/null @@ -1,118 +0,0 @@ -package daemon - -import ( - "testing" - "time" - - "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" - eventtypes "github.com/docker/docker/api/types/events" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/events" -) - -func reset(c *container.Container) { - c.State = &container.State{} - c.State.Health = &container.Health{} - c.State.Health.Status = types.Starting -} - -func TestNoneHealthcheck(t *testing.T) { - c := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: "container_id", - Name: "container_name", - Config: &containertypes.Config{ - Image: "image_name", - Healthcheck: &containertypes.HealthConfig{ - Test: []string{"NONE"}, - }, - }, - State: &container.State{}, - }, - } - daemon := &Daemon{} - - daemon.initHealthMonitor(c) - if c.State.Health != nil { - t.Errorf("Expecting Health to be nil, but was not") - } -} - -func TestHealthStates(t *testing.T) { - e := events.New() - _, l, _ := e.Subscribe() - defer e.Evict(l) - - expect := func(expected string) { - select { - case event := <-l: - ev := event.(eventtypes.Message) - if ev.Status != expected { - t.Errorf("Expecting event %#v, but got %#v\n", expected, ev.Status) - } - case <-time.After(1 * time.Second): - t.Errorf("Expecting event %#v, but got nothing\n", expected) - } - } - - c := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: "container_id", - Name: "container_name", - Config: &containertypes.Config{ - Image: "image_name", - }, - }, - } - daemon := &Daemon{ - EventsService: e, - } - - c.Config.Healthcheck = &containertypes.HealthConfig{ - Retries: 1, - } - - reset(c) - - handleResult := func(startTime time.Time, exitCode int) { - handleProbeResult(daemon, c, &types.HealthcheckResult{ - Start: startTime, - End: startTime, - ExitCode: exitCode, - }, nil) - } - - // starting -> failed -> success -> failed - - handleResult(c.State.StartedAt.Add(1*time.Second), 1) - expect("health_status: unhealthy") - - handleResult(c.State.StartedAt.Add(2*time.Second), 0) - expect("health_status: healthy") - - handleResult(c.State.StartedAt.Add(3*time.Second), 1) - expect("health_status: unhealthy") - - // Test retries - - reset(c) - c.Config.Healthcheck.Retries = 3 - - handleResult(c.State.StartedAt.Add(20*time.Second), 1) - handleResult(c.State.StartedAt.Add(40*time.Second), 1) - if c.State.Health.Status != types.Starting { - t.Errorf("Expecting starting, but got %#v\n", c.State.Health.Status) - } - if c.State.Health.FailingStreak != 2 { - t.Errorf("Expecting FailingStreak=2, but got %d\n", c.State.Health.FailingStreak) - } - handleResult(c.State.StartedAt.Add(60*time.Second), 1) - expect("health_status: unhealthy") - - handleResult(c.State.StartedAt.Add(80*time.Second), 0) - expect("health_status: healthy") - if c.State.Health.FailingStreak != 0 { - t.Errorf("Expecting FailingStreak=0, but got %d\n", c.State.Health.FailingStreak) - } -} diff --git a/vendor/github.com/docker/docker/daemon/image.go b/vendor/github.com/docker/docker/daemon/image.go deleted file mode 100644 index 32a8d7743..000000000 --- a/vendor/github.com/docker/docker/daemon/image.go +++ /dev/null @@ -1,76 +0,0 @@ -package daemon - -import ( - "fmt" - - "github.com/docker/docker/builder" - "github.com/docker/docker/image" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/reference" -) - -// ErrImageDoesNotExist is error returned when no image can be found for a reference. -type ErrImageDoesNotExist struct { - RefOrID string -} - -func (e ErrImageDoesNotExist) Error() string { - return fmt.Sprintf("no such id: %s", e.RefOrID) -} - -// GetImageID returns an image ID corresponding to the image referred to by -// refOrID. -func (daemon *Daemon) GetImageID(refOrID string) (image.ID, error) { - id, ref, err := reference.ParseIDOrReference(refOrID) - if err != nil { - return "", err - } - if id != "" { - if _, err := daemon.imageStore.Get(image.IDFromDigest(id)); err != nil { - return "", ErrImageDoesNotExist{refOrID} - } - return image.IDFromDigest(id), nil - } - - if id, err := daemon.referenceStore.Get(ref); err == nil { - return image.IDFromDigest(id), nil - } - - // deprecated: repo:shortid https://github.com/docker/docker/pull/799 - if tagged, ok := ref.(reference.NamedTagged); ok { - if tag := tagged.Tag(); stringid.IsShortID(stringid.TruncateID(tag)) { - if id, err := daemon.imageStore.Search(tag); err == nil { - for _, namedRef := range daemon.referenceStore.References(id.Digest()) { - if namedRef.Name() == ref.Name() { - return id, nil - } - } - } - } - } - - // Search based on ID - if id, err := daemon.imageStore.Search(refOrID); err == nil { - return id, nil - } - - return "", ErrImageDoesNotExist{refOrID} -} - -// GetImage returns an image corresponding to the image referred to by refOrID. -func (daemon *Daemon) GetImage(refOrID string) (*image.Image, error) { - imgID, err := daemon.GetImageID(refOrID) - if err != nil { - return nil, err - } - return daemon.imageStore.Get(imgID) -} - -// GetImageOnBuild looks up a Docker image referenced by `name`. -func (daemon *Daemon) GetImageOnBuild(name string) (builder.Image, error) { - img, err := daemon.GetImage(name) - if err != nil { - return nil, err - } - return img, nil -} diff --git a/vendor/github.com/docker/docker/daemon/image_delete.go b/vendor/github.com/docker/docker/daemon/image_delete.go deleted file mode 100644 index 3e3c142e9..000000000 --- a/vendor/github.com/docker/docker/daemon/image_delete.go +++ /dev/null @@ -1,412 +0,0 @@ -package daemon - -import ( - "fmt" - "strings" - "time" - - "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/types" - "github.com/docker/docker/container" - "github.com/docker/docker/image" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/reference" -) - -type conflictType int - -const ( - conflictDependentChild conflictType = (1 << iota) - conflictRunningContainer - conflictActiveReference - conflictStoppedContainer - conflictHard = conflictDependentChild | conflictRunningContainer - conflictSoft = conflictActiveReference | conflictStoppedContainer -) - -// ImageDelete deletes the image referenced by the given imageRef from this -// daemon. The given imageRef can be an image ID, ID prefix, or a repository -// reference (with an optional tag or digest, defaulting to the tag name -// "latest"). There is differing behavior depending on whether the given -// imageRef is a repository reference or not. -// -// If the given imageRef is a repository reference then that repository -// reference will be removed. However, if there exists any containers which -// were created using the same image reference then the repository reference -// cannot be removed unless either there are other repository references to the -// same image or force is true. Following removal of the repository reference, -// the referenced image itself will attempt to be deleted as described below -// but quietly, meaning any image delete conflicts will cause the image to not -// be deleted and the conflict will not be reported. -// -// There may be conflicts preventing deletion of an image and these conflicts -// are divided into two categories grouped by their severity: -// -// Hard Conflict: -// - a pull or build using the image. -// - any descendant image. -// - any running container using the image. -// -// Soft Conflict: -// - any stopped container using the image. -// - any repository tag or digest references to the image. -// -// The image cannot be removed if there are any hard conflicts and can be -// removed if there are soft conflicts only if force is true. -// -// If prune is true, ancestor images will each attempt to be deleted quietly, -// meaning any delete conflicts will cause the image to not be deleted and the -// conflict will not be reported. -// -// FIXME: remove ImageDelete's dependency on Daemon, then move to the graph -// package. This would require that we no longer need the daemon to determine -// whether images are being used by a stopped or running container. -func (daemon *Daemon) ImageDelete(imageRef string, force, prune bool) ([]types.ImageDelete, error) { - start := time.Now() - records := []types.ImageDelete{} - - imgID, err := daemon.GetImageID(imageRef) - if err != nil { - return nil, daemon.imageNotExistToErrcode(err) - } - - repoRefs := daemon.referenceStore.References(imgID.Digest()) - - var removedRepositoryRef bool - if !isImageIDPrefix(imgID.String(), imageRef) { - // A repository reference was given and should be removed - // first. We can only remove this reference if either force is - // true, there are multiple repository references to this - // image, or there are no containers using the given reference. - if !force && isSingleReference(repoRefs) { - if container := daemon.getContainerUsingImage(imgID); container != nil { - // If we removed the repository reference then - // this image would remain "dangling" and since - // we really want to avoid that the client must - // explicitly force its removal. - err := fmt.Errorf("conflict: unable to remove repository reference %q (must force) - container %s is using its referenced image %s", imageRef, stringid.TruncateID(container.ID), stringid.TruncateID(imgID.String())) - return nil, errors.NewRequestConflictError(err) - } - } - - parsedRef, err := reference.ParseNamed(imageRef) - if err != nil { - return nil, err - } - - parsedRef, err = daemon.removeImageRef(parsedRef) - if err != nil { - return nil, err - } - - untaggedRecord := types.ImageDelete{Untagged: parsedRef.String()} - - daemon.LogImageEvent(imgID.String(), imgID.String(), "untag") - records = append(records, untaggedRecord) - - repoRefs = daemon.referenceStore.References(imgID.Digest()) - - // If a tag reference was removed and the only remaining - // references to the same repository are digest references, - // then clean up those digest references. - if _, isCanonical := parsedRef.(reference.Canonical); !isCanonical { - foundRepoTagRef := false - for _, repoRef := range repoRefs { - if _, repoRefIsCanonical := repoRef.(reference.Canonical); !repoRefIsCanonical && parsedRef.Name() == repoRef.Name() { - foundRepoTagRef = true - break - } - } - if !foundRepoTagRef { - // Remove canonical references from same repository - remainingRefs := []reference.Named{} - for _, repoRef := range repoRefs { - if _, repoRefIsCanonical := repoRef.(reference.Canonical); repoRefIsCanonical && parsedRef.Name() == repoRef.Name() { - if _, err := daemon.removeImageRef(repoRef); err != nil { - return records, err - } - - untaggedRecord := types.ImageDelete{Untagged: repoRef.String()} - records = append(records, untaggedRecord) - } else { - remainingRefs = append(remainingRefs, repoRef) - - } - } - repoRefs = remainingRefs - } - } - - // If it has remaining references then the untag finished the remove - if len(repoRefs) > 0 { - return records, nil - } - - removedRepositoryRef = true - } else { - // If an ID reference was given AND there is at most one tag - // reference to the image AND all references are within one - // repository, then remove all references. - if isSingleReference(repoRefs) { - c := conflictHard - if !force { - c |= conflictSoft &^ conflictActiveReference - } - if conflict := daemon.checkImageDeleteConflict(imgID, c); conflict != nil { - return nil, conflict - } - - for _, repoRef := range repoRefs { - parsedRef, err := daemon.removeImageRef(repoRef) - if err != nil { - return nil, err - } - - untaggedRecord := types.ImageDelete{Untagged: parsedRef.String()} - - daemon.LogImageEvent(imgID.String(), imgID.String(), "untag") - records = append(records, untaggedRecord) - } - } - } - - if err := daemon.imageDeleteHelper(imgID, &records, force, prune, removedRepositoryRef); err != nil { - return nil, err - } - - imageActions.WithValues("delete").UpdateSince(start) - - return records, nil -} - -// isSingleReference returns true when all references are from one repository -// and there is at most one tag. Returns false for empty input. -func isSingleReference(repoRefs []reference.Named) bool { - if len(repoRefs) <= 1 { - return len(repoRefs) == 1 - } - var singleRef reference.Named - canonicalRefs := map[string]struct{}{} - for _, repoRef := range repoRefs { - if _, isCanonical := repoRef.(reference.Canonical); isCanonical { - canonicalRefs[repoRef.Name()] = struct{}{} - } else if singleRef == nil { - singleRef = repoRef - } else { - return false - } - } - if singleRef == nil { - // Just use first canonical ref - singleRef = repoRefs[0] - } - _, ok := canonicalRefs[singleRef.Name()] - return len(canonicalRefs) == 1 && ok -} - -// isImageIDPrefix returns whether the given possiblePrefix is a prefix of the -// given imageID. -func isImageIDPrefix(imageID, possiblePrefix string) bool { - if strings.HasPrefix(imageID, possiblePrefix) { - return true - } - - if i := strings.IndexRune(imageID, ':'); i >= 0 { - return strings.HasPrefix(imageID[i+1:], possiblePrefix) - } - - return false -} - -// getContainerUsingImage returns a container that was created using the given -// imageID. Returns nil if there is no such container. -func (daemon *Daemon) getContainerUsingImage(imageID image.ID) *container.Container { - return daemon.containers.First(func(c *container.Container) bool { - return c.ImageID == imageID - }) -} - -// removeImageRef attempts to parse and remove the given image reference from -// this daemon's store of repository tag/digest references. The given -// repositoryRef must not be an image ID but a repository name followed by an -// optional tag or digest reference. If tag or digest is omitted, the default -// tag is used. Returns the resolved image reference and an error. -func (daemon *Daemon) removeImageRef(ref reference.Named) (reference.Named, error) { - ref = reference.WithDefaultTag(ref) - // Ignore the boolean value returned, as far as we're concerned, this - // is an idempotent operation and it's okay if the reference didn't - // exist in the first place. - _, err := daemon.referenceStore.Delete(ref) - - return ref, err -} - -// removeAllReferencesToImageID attempts to remove every reference to the given -// imgID from this daemon's store of repository tag/digest references. Returns -// on the first encountered error. Removed references are logged to this -// daemon's event service. An "Untagged" types.ImageDelete is added to the -// given list of records. -func (daemon *Daemon) removeAllReferencesToImageID(imgID image.ID, records *[]types.ImageDelete) error { - imageRefs := daemon.referenceStore.References(imgID.Digest()) - - for _, imageRef := range imageRefs { - parsedRef, err := daemon.removeImageRef(imageRef) - if err != nil { - return err - } - - untaggedRecord := types.ImageDelete{Untagged: parsedRef.String()} - - daemon.LogImageEvent(imgID.String(), imgID.String(), "untag") - *records = append(*records, untaggedRecord) - } - - return nil -} - -// ImageDeleteConflict holds a soft or hard conflict and an associated error. -// Implements the error interface. -type imageDeleteConflict struct { - hard bool - used bool - imgID image.ID - message string -} - -func (idc *imageDeleteConflict) Error() string { - var forceMsg string - if idc.hard { - forceMsg = "cannot be forced" - } else { - forceMsg = "must be forced" - } - - return fmt.Sprintf("conflict: unable to delete %s (%s) - %s", stringid.TruncateID(idc.imgID.String()), forceMsg, idc.message) -} - -// imageDeleteHelper attempts to delete the given image from this daemon. If -// the image has any hard delete conflicts (child images or running containers -// using the image) then it cannot be deleted. If the image has any soft delete -// conflicts (any tags/digests referencing the image or any stopped container -// using the image) then it can only be deleted if force is true. If the delete -// succeeds and prune is true, the parent images are also deleted if they do -// not have any soft or hard delete conflicts themselves. Any deleted images -// and untagged references are appended to the given records. If any error or -// conflict is encountered, it will be returned immediately without deleting -// the image. If quiet is true, any encountered conflicts will be ignored and -// the function will return nil immediately without deleting the image. -func (daemon *Daemon) imageDeleteHelper(imgID image.ID, records *[]types.ImageDelete, force, prune, quiet bool) error { - // First, determine if this image has any conflicts. Ignore soft conflicts - // if force is true. - c := conflictHard - if !force { - c |= conflictSoft - } - if conflict := daemon.checkImageDeleteConflict(imgID, c); conflict != nil { - if quiet && (!daemon.imageIsDangling(imgID) || conflict.used) { - // Ignore conflicts UNLESS the image is "dangling" or not being used in - // which case we want the user to know. - return nil - } - - // There was a conflict and it's either a hard conflict OR we are not - // forcing deletion on soft conflicts. - return conflict - } - - parent, err := daemon.imageStore.GetParent(imgID) - if err != nil { - // There may be no parent - parent = "" - } - - // Delete all repository tag/digest references to this image. - if err := daemon.removeAllReferencesToImageID(imgID, records); err != nil { - return err - } - - removedLayers, err := daemon.imageStore.Delete(imgID) - if err != nil { - return err - } - - daemon.LogImageEvent(imgID.String(), imgID.String(), "delete") - *records = append(*records, types.ImageDelete{Deleted: imgID.String()}) - for _, removedLayer := range removedLayers { - *records = append(*records, types.ImageDelete{Deleted: removedLayer.ChainID.String()}) - } - - if !prune || parent == "" { - return nil - } - - // We need to prune the parent image. This means delete it if there are - // no tags/digests referencing it and there are no containers using it ( - // either running or stopped). - // Do not force prunings, but do so quietly (stopping on any encountered - // conflicts). - return daemon.imageDeleteHelper(parent, records, false, true, true) -} - -// checkImageDeleteConflict determines whether there are any conflicts -// preventing deletion of the given image from this daemon. A hard conflict is -// any image which has the given image as a parent or any running container -// using the image. A soft conflict is any tags/digest referencing the given -// image or any stopped container using the image. If ignoreSoftConflicts is -// true, this function will not check for soft conflict conditions. -func (daemon *Daemon) checkImageDeleteConflict(imgID image.ID, mask conflictType) *imageDeleteConflict { - // Check if the image has any descendant images. - if mask&conflictDependentChild != 0 && len(daemon.imageStore.Children(imgID)) > 0 { - return &imageDeleteConflict{ - hard: true, - imgID: imgID, - message: "image has dependent child images", - } - } - - if mask&conflictRunningContainer != 0 { - // Check if any running container is using the image. - running := func(c *container.Container) bool { - return c.IsRunning() && c.ImageID == imgID - } - if container := daemon.containers.First(running); container != nil { - return &imageDeleteConflict{ - imgID: imgID, - hard: true, - used: true, - message: fmt.Sprintf("image is being used by running container %s", stringid.TruncateID(container.ID)), - } - } - } - - // Check if any repository tags/digest reference this image. - if mask&conflictActiveReference != 0 && len(daemon.referenceStore.References(imgID.Digest())) > 0 { - return &imageDeleteConflict{ - imgID: imgID, - message: "image is referenced in multiple repositories", - } - } - - if mask&conflictStoppedContainer != 0 { - // Check if any stopped containers reference this image. - stopped := func(c *container.Container) bool { - return !c.IsRunning() && c.ImageID == imgID - } - if container := daemon.containers.First(stopped); container != nil { - return &imageDeleteConflict{ - imgID: imgID, - used: true, - message: fmt.Sprintf("image is being used by stopped container %s", stringid.TruncateID(container.ID)), - } - } - } - - return nil -} - -// imageIsDangling returns whether the given image is "dangling" which means -// that there are no repository references to the given image and it has no -// child images. -func (daemon *Daemon) imageIsDangling(imgID image.ID) bool { - return !(len(daemon.referenceStore.References(imgID.Digest())) > 0 || len(daemon.imageStore.Children(imgID)) > 0) -} diff --git a/vendor/github.com/docker/docker/daemon/image_exporter.go b/vendor/github.com/docker/docker/daemon/image_exporter.go deleted file mode 100644 index 95d1d3dcd..000000000 --- a/vendor/github.com/docker/docker/daemon/image_exporter.go +++ /dev/null @@ -1,25 +0,0 @@ -package daemon - -import ( - "io" - - "github.com/docker/docker/image/tarexport" -) - -// ExportImage exports a list of images to the given output stream. The -// exported images are archived into a tar when written to the output -// stream. All images with the given tag and all versions containing -// the same tag are exported. names is the set of tags to export, and -// outStream is the writer which the images are written to. -func (daemon *Daemon) ExportImage(names []string, outStream io.Writer) error { - imageExporter := tarexport.NewTarExporter(daemon.imageStore, daemon.layerStore, daemon.referenceStore, daemon) - return imageExporter.Save(names, outStream) -} - -// LoadImage uploads a set of images into the repository. This is the -// complement of ImageExport. The input stream is an uncompressed tar -// ball containing images and metadata. -func (daemon *Daemon) LoadImage(inTar io.ReadCloser, outStream io.Writer, quiet bool) error { - imageExporter := tarexport.NewTarExporter(daemon.imageStore, daemon.layerStore, daemon.referenceStore, daemon) - return imageExporter.Load(inTar, outStream, quiet) -} diff --git a/vendor/github.com/docker/docker/daemon/image_history.go b/vendor/github.com/docker/docker/daemon/image_history.go deleted file mode 100644 index 839dd1283..000000000 --- a/vendor/github.com/docker/docker/daemon/image_history.go +++ /dev/null @@ -1,84 +0,0 @@ -package daemon - -import ( - "fmt" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/layer" - "github.com/docker/docker/reference" -) - -// ImageHistory returns a slice of ImageHistory structures for the specified image -// name by walking the image lineage. -func (daemon *Daemon) ImageHistory(name string) ([]*types.ImageHistory, error) { - start := time.Now() - img, err := daemon.GetImage(name) - if err != nil { - return nil, err - } - - history := []*types.ImageHistory{} - - layerCounter := 0 - rootFS := *img.RootFS - rootFS.DiffIDs = nil - - for _, h := range img.History { - var layerSize int64 - - if !h.EmptyLayer { - if len(img.RootFS.DiffIDs) <= layerCounter { - return nil, fmt.Errorf("too many non-empty layers in History section") - } - - rootFS.Append(img.RootFS.DiffIDs[layerCounter]) - l, err := daemon.layerStore.Get(rootFS.ChainID()) - if err != nil { - return nil, err - } - layerSize, err = l.DiffSize() - layer.ReleaseAndLog(daemon.layerStore, l) - if err != nil { - return nil, err - } - - layerCounter++ - } - - history = append([]*types.ImageHistory{{ - ID: "", - Created: h.Created.Unix(), - CreatedBy: h.CreatedBy, - Comment: h.Comment, - Size: layerSize, - }}, history...) - } - - // Fill in image IDs and tags - histImg := img - id := img.ID() - for _, h := range history { - h.ID = id.String() - - var tags []string - for _, r := range daemon.referenceStore.References(id.Digest()) { - if _, ok := r.(reference.NamedTagged); ok { - tags = append(tags, r.String()) - } - } - - h.Tags = tags - - id = histImg.Parent - if id == "" { - break - } - histImg, err = daemon.GetImage(id.String()) - if err != nil { - break - } - } - imageActions.WithValues("history").UpdateSince(start) - return history, nil -} diff --git a/vendor/github.com/docker/docker/daemon/image_inspect.go b/vendor/github.com/docker/docker/daemon/image_inspect.go deleted file mode 100644 index ebf912469..000000000 --- a/vendor/github.com/docker/docker/daemon/image_inspect.go +++ /dev/null @@ -1,82 +0,0 @@ -package daemon - -import ( - "fmt" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/layer" - "github.com/docker/docker/reference" -) - -// LookupImage looks up an image by name and returns it as an ImageInspect -// structure. -func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) { - img, err := daemon.GetImage(name) - if err != nil { - return nil, fmt.Errorf("No such image: %s", name) - } - - refs := daemon.referenceStore.References(img.ID().Digest()) - repoTags := []string{} - repoDigests := []string{} - for _, ref := range refs { - switch ref.(type) { - case reference.NamedTagged: - repoTags = append(repoTags, ref.String()) - case reference.Canonical: - repoDigests = append(repoDigests, ref.String()) - } - } - - var size int64 - var layerMetadata map[string]string - layerID := img.RootFS.ChainID() - if layerID != "" { - l, err := daemon.layerStore.Get(layerID) - if err != nil { - return nil, err - } - defer layer.ReleaseAndLog(daemon.layerStore, l) - size, err = l.Size() - if err != nil { - return nil, err - } - - layerMetadata, err = l.Metadata() - if err != nil { - return nil, err - } - } - - comment := img.Comment - if len(comment) == 0 && len(img.History) > 0 { - comment = img.History[len(img.History)-1].Comment - } - - imageInspect := &types.ImageInspect{ - ID: img.ID().String(), - RepoTags: repoTags, - RepoDigests: repoDigests, - Parent: img.Parent.String(), - Comment: comment, - Created: img.Created.Format(time.RFC3339Nano), - Container: img.Container, - ContainerConfig: &img.ContainerConfig, - DockerVersion: img.DockerVersion, - Author: img.Author, - Config: img.Config, - Architecture: img.Architecture, - Os: img.OS, - OsVersion: img.OSVersion, - Size: size, - VirtualSize: size, // TODO: field unused, deprecate - RootFS: rootFSToAPIType(img.RootFS), - } - - imageInspect.GraphDriver.Name = daemon.GraphDriverName() - - imageInspect.GraphDriver.Data = layerMetadata - - return imageInspect, nil -} diff --git a/vendor/github.com/docker/docker/daemon/image_pull.go b/vendor/github.com/docker/docker/daemon/image_pull.go deleted file mode 100644 index 2157d1597..000000000 --- a/vendor/github.com/docker/docker/daemon/image_pull.go +++ /dev/null @@ -1,149 +0,0 @@ -package daemon - -import ( - "io" - "strings" - - dist "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/docker/api/types" - "github.com/docker/docker/builder" - "github.com/docker/docker/distribution" - progressutils "github.com/docker/docker/distribution/utils" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "golang.org/x/net/context" -) - -// PullImage initiates a pull operation. image is the repository name to pull, and -// tag may be either empty, or indicate a specific tag to pull. -func (daemon *Daemon) PullImage(ctx context.Context, image, tag string, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error { - // Special case: "pull -a" may send an image name with a - // trailing :. This is ugly, but let's not break API - // compatibility. - image = strings.TrimSuffix(image, ":") - - ref, err := reference.ParseNamed(image) - if err != nil { - return err - } - - if tag != "" { - // The "tag" could actually be a digest. - var dgst digest.Digest - dgst, err = digest.ParseDigest(tag) - if err == nil { - ref, err = reference.WithDigest(reference.TrimNamed(ref), dgst) - } else { - ref, err = reference.WithTag(ref, tag) - } - if err != nil { - return err - } - } - - return daemon.pullImageWithReference(ctx, ref, metaHeaders, authConfig, outStream) -} - -// PullOnBuild tells Docker to pull image referenced by `name`. -func (daemon *Daemon) PullOnBuild(ctx context.Context, name string, authConfigs map[string]types.AuthConfig, output io.Writer) (builder.Image, error) { - ref, err := reference.ParseNamed(name) - if err != nil { - return nil, err - } - ref = reference.WithDefaultTag(ref) - - pullRegistryAuth := &types.AuthConfig{} - if len(authConfigs) > 0 { - // The request came with a full auth config file, we prefer to use that - repoInfo, err := daemon.RegistryService.ResolveRepository(ref) - if err != nil { - return nil, err - } - - resolvedConfig := registry.ResolveAuthConfig( - authConfigs, - repoInfo.Index, - ) - pullRegistryAuth = &resolvedConfig - } - - if err := daemon.pullImageWithReference(ctx, ref, nil, pullRegistryAuth, output); err != nil { - return nil, err - } - return daemon.GetImage(name) -} - -func (daemon *Daemon) pullImageWithReference(ctx context.Context, ref reference.Named, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error { - // Include a buffer so that slow client connections don't affect - // transfer performance. - progressChan := make(chan progress.Progress, 100) - - writesDone := make(chan struct{}) - - ctx, cancelFunc := context.WithCancel(ctx) - - go func() { - progressutils.WriteDistributionProgress(cancelFunc, outStream, progressChan) - close(writesDone) - }() - - imagePullConfig := &distribution.ImagePullConfig{ - Config: distribution.Config{ - MetaHeaders: metaHeaders, - AuthConfig: authConfig, - ProgressOutput: progress.ChanOutput(progressChan), - RegistryService: daemon.RegistryService, - ImageEventLogger: daemon.LogImageEvent, - MetadataStore: daemon.distributionMetadataStore, - ImageStore: distribution.NewImageConfigStoreFromStore(daemon.imageStore), - ReferenceStore: daemon.referenceStore, - }, - DownloadManager: daemon.downloadManager, - Schema2Types: distribution.ImageTypes, - } - - err := distribution.Pull(ctx, ref, imagePullConfig) - close(progressChan) - <-writesDone - return err -} - -// GetRepository returns a repository from the registry. -func (daemon *Daemon) GetRepository(ctx context.Context, ref reference.NamedTagged, authConfig *types.AuthConfig) (dist.Repository, bool, error) { - // get repository info - repoInfo, err := daemon.RegistryService.ResolveRepository(ref) - if err != nil { - return nil, false, err - } - // makes sure name is not empty or `scratch` - if err := distribution.ValidateRepoName(repoInfo.Name()); err != nil { - return nil, false, err - } - - // get endpoints - endpoints, err := daemon.RegistryService.LookupPullEndpoints(repoInfo.Hostname()) - if err != nil { - return nil, false, err - } - - // retrieve repository - var ( - confirmedV2 bool - repository dist.Repository - lastError error - ) - - for _, endpoint := range endpoints { - if endpoint.Version == registry.APIVersion1 { - continue - } - - repository, confirmedV2, lastError = distribution.NewV2Repository(ctx, repoInfo, endpoint, nil, authConfig, "pull") - if lastError == nil && confirmedV2 { - break - } - } - return repository, confirmedV2, lastError -} diff --git a/vendor/github.com/docker/docker/daemon/image_push.go b/vendor/github.com/docker/docker/daemon/image_push.go deleted file mode 100644 index e6382c7f2..000000000 --- a/vendor/github.com/docker/docker/daemon/image_push.go +++ /dev/null @@ -1,63 +0,0 @@ -package daemon - -import ( - "io" - - "github.com/docker/distribution/manifest/schema2" - "github.com/docker/docker/api/types" - "github.com/docker/docker/distribution" - progressutils "github.com/docker/docker/distribution/utils" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/reference" - "golang.org/x/net/context" -) - -// PushImage initiates a push operation on the repository named localName. -func (daemon *Daemon) PushImage(ctx context.Context, image, tag string, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error { - ref, err := reference.ParseNamed(image) - if err != nil { - return err - } - if tag != "" { - // Push by digest is not supported, so only tags are supported. - ref, err = reference.WithTag(ref, tag) - if err != nil { - return err - } - } - - // Include a buffer so that slow client connections don't affect - // transfer performance. - progressChan := make(chan progress.Progress, 100) - - writesDone := make(chan struct{}) - - ctx, cancelFunc := context.WithCancel(ctx) - - go func() { - progressutils.WriteDistributionProgress(cancelFunc, outStream, progressChan) - close(writesDone) - }() - - imagePushConfig := &distribution.ImagePushConfig{ - Config: distribution.Config{ - MetaHeaders: metaHeaders, - AuthConfig: authConfig, - ProgressOutput: progress.ChanOutput(progressChan), - RegistryService: daemon.RegistryService, - ImageEventLogger: daemon.LogImageEvent, - MetadataStore: daemon.distributionMetadataStore, - ImageStore: distribution.NewImageConfigStoreFromStore(daemon.imageStore), - ReferenceStore: daemon.referenceStore, - }, - ConfigMediaType: schema2.MediaTypeImageConfig, - LayerStore: distribution.NewLayerProviderFromStore(daemon.layerStore), - TrustKey: daemon.trustKey, - UploadManager: daemon.uploadManager, - } - - err = distribution.Push(ctx, ref, imagePushConfig) - close(progressChan) - <-writesDone - return err -} diff --git a/vendor/github.com/docker/docker/daemon/image_tag.go b/vendor/github.com/docker/docker/daemon/image_tag.go deleted file mode 100644 index 36fa3b462..000000000 --- a/vendor/github.com/docker/docker/daemon/image_tag.go +++ /dev/null @@ -1,37 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/image" - "github.com/docker/docker/reference" -) - -// TagImage creates the tag specified by newTag, pointing to the image named -// imageName (alternatively, imageName can also be an image ID). -func (daemon *Daemon) TagImage(imageName, repository, tag string) error { - imageID, err := daemon.GetImageID(imageName) - if err != nil { - return err - } - - newTag, err := reference.WithName(repository) - if err != nil { - return err - } - if tag != "" { - if newTag, err = reference.WithTag(newTag, tag); err != nil { - return err - } - } - - return daemon.TagImageWithReference(imageID, newTag) -} - -// TagImageWithReference adds the given reference to the image ID provided. -func (daemon *Daemon) TagImageWithReference(imageID image.ID, newTag reference.Named) error { - if err := daemon.referenceStore.AddTag(newTag, imageID.Digest(), true); err != nil { - return err - } - - daemon.LogImageEvent(imageID.String(), newTag.String(), "tag") - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/images.go b/vendor/github.com/docker/docker/daemon/images.go deleted file mode 100644 index 88fb8f8e9..000000000 --- a/vendor/github.com/docker/docker/daemon/images.go +++ /dev/null @@ -1,331 +0,0 @@ -package daemon - -import ( - "encoding/json" - "fmt" - "sort" - "time" - - "github.com/pkg/errors" - - "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/container" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" -) - -var acceptedImageFilterTags = map[string]bool{ - "dangling": true, - "label": true, - "before": true, - "since": true, - "reference": true, -} - -// byCreated is a temporary type used to sort a list of images by creation -// time. -type byCreated []*types.ImageSummary - -func (r byCreated) Len() int { return len(r) } -func (r byCreated) Swap(i, j int) { r[i], r[j] = r[j], r[i] } -func (r byCreated) Less(i, j int) bool { return r[i].Created < r[j].Created } - -// Map returns a map of all images in the ImageStore -func (daemon *Daemon) Map() map[image.ID]*image.Image { - return daemon.imageStore.Map() -} - -// Images returns a filtered list of images. filterArgs is a JSON-encoded set -// of filter arguments which will be interpreted by api/types/filters. -// filter is a shell glob string applied to repository names. The argument -// named all controls whether all images in the graph are filtered, or just -// the heads. -func (daemon *Daemon) Images(imageFilters filters.Args, all bool, withExtraAttrs bool) ([]*types.ImageSummary, error) { - var ( - allImages map[image.ID]*image.Image - err error - danglingOnly = false - ) - - if err := imageFilters.Validate(acceptedImageFilterTags); err != nil { - return nil, err - } - - if imageFilters.Include("dangling") { - if imageFilters.ExactMatch("dangling", "true") { - danglingOnly = true - } else if !imageFilters.ExactMatch("dangling", "false") { - return nil, fmt.Errorf("Invalid filter 'dangling=%s'", imageFilters.Get("dangling")) - } - } - if danglingOnly { - allImages = daemon.imageStore.Heads() - } else { - allImages = daemon.imageStore.Map() - } - - var beforeFilter, sinceFilter *image.Image - err = imageFilters.WalkValues("before", func(value string) error { - beforeFilter, err = daemon.GetImage(value) - return err - }) - if err != nil { - return nil, err - } - - err = imageFilters.WalkValues("since", func(value string) error { - sinceFilter, err = daemon.GetImage(value) - return err - }) - if err != nil { - return nil, err - } - - images := []*types.ImageSummary{} - var imagesMap map[*image.Image]*types.ImageSummary - var layerRefs map[layer.ChainID]int - var allLayers map[layer.ChainID]layer.Layer - var allContainers []*container.Container - - for id, img := range allImages { - if beforeFilter != nil { - if img.Created.Equal(beforeFilter.Created) || img.Created.After(beforeFilter.Created) { - continue - } - } - - if sinceFilter != nil { - if img.Created.Equal(sinceFilter.Created) || img.Created.Before(sinceFilter.Created) { - continue - } - } - - if imageFilters.Include("label") { - // Very old image that do not have image.Config (or even labels) - if img.Config == nil { - continue - } - // We are now sure image.Config is not nil - if !imageFilters.MatchKVList("label", img.Config.Labels) { - continue - } - } - - layerID := img.RootFS.ChainID() - var size int64 - if layerID != "" { - l, err := daemon.layerStore.Get(layerID) - if err != nil { - return nil, err - } - - size, err = l.Size() - layer.ReleaseAndLog(daemon.layerStore, l) - if err != nil { - return nil, err - } - } - - newImage := newImage(img, size) - - for _, ref := range daemon.referenceStore.References(id.Digest()) { - if imageFilters.Include("reference") { - var found bool - var matchErr error - for _, pattern := range imageFilters.Get("reference") { - found, matchErr = reference.Match(pattern, ref) - if matchErr != nil { - return nil, matchErr - } - } - if !found { - continue - } - } - if _, ok := ref.(reference.Canonical); ok { - newImage.RepoDigests = append(newImage.RepoDigests, ref.String()) - } - if _, ok := ref.(reference.NamedTagged); ok { - newImage.RepoTags = append(newImage.RepoTags, ref.String()) - } - } - if newImage.RepoDigests == nil && newImage.RepoTags == nil { - if all || len(daemon.imageStore.Children(id)) == 0 { - - if imageFilters.Include("dangling") && !danglingOnly { - //dangling=false case, so dangling image is not needed - continue - } - if imageFilters.Include("reference") { // skip images with no references if filtering by reference - continue - } - newImage.RepoDigests = []string{"@"} - newImage.RepoTags = []string{":"} - } else { - continue - } - } else if danglingOnly && len(newImage.RepoTags) > 0 { - continue - } - - if withExtraAttrs { - // lazyly init variables - if imagesMap == nil { - allContainers = daemon.List() - allLayers = daemon.layerStore.Map() - imagesMap = make(map[*image.Image]*types.ImageSummary) - layerRefs = make(map[layer.ChainID]int) - } - - // Get container count - newImage.Containers = 0 - for _, c := range allContainers { - if c.ImageID == id { - newImage.Containers++ - } - } - - // count layer references - rootFS := *img.RootFS - rootFS.DiffIDs = nil - for _, id := range img.RootFS.DiffIDs { - rootFS.Append(id) - chid := rootFS.ChainID() - layerRefs[chid]++ - if _, ok := allLayers[chid]; !ok { - return nil, fmt.Errorf("layer %v was not found (corruption?)", chid) - } - } - imagesMap[img] = newImage - } - - images = append(images, newImage) - } - - if withExtraAttrs { - // Get Shared sizes - for img, newImage := range imagesMap { - rootFS := *img.RootFS - rootFS.DiffIDs = nil - - newImage.SharedSize = 0 - for _, id := range img.RootFS.DiffIDs { - rootFS.Append(id) - chid := rootFS.ChainID() - - diffSize, err := allLayers[chid].DiffSize() - if err != nil { - return nil, err - } - - if layerRefs[chid] > 1 { - newImage.SharedSize += diffSize - } - } - } - } - - sort.Sort(sort.Reverse(byCreated(images))) - - return images, nil -} - -// SquashImage creates a new image with the diff of the specified image and the specified parent. -// This new image contains only the layers from it's parent + 1 extra layer which contains the diff of all the layers in between. -// The existing image(s) is not destroyed. -// If no parent is specified, a new image with the diff of all the specified image's layers merged into a new layer that has no parents. -func (daemon *Daemon) SquashImage(id, parent string) (string, error) { - img, err := daemon.imageStore.Get(image.ID(id)) - if err != nil { - return "", err - } - - var parentImg *image.Image - var parentChainID layer.ChainID - if len(parent) != 0 { - parentImg, err = daemon.imageStore.Get(image.ID(parent)) - if err != nil { - return "", errors.Wrap(err, "error getting specified parent layer") - } - parentChainID = parentImg.RootFS.ChainID() - } else { - rootFS := image.NewRootFS() - parentImg = &image.Image{RootFS: rootFS} - } - - l, err := daemon.layerStore.Get(img.RootFS.ChainID()) - if err != nil { - return "", errors.Wrap(err, "error getting image layer") - } - defer daemon.layerStore.Release(l) - - ts, err := l.TarStreamFrom(parentChainID) - if err != nil { - return "", errors.Wrapf(err, "error getting tar stream to parent") - } - defer ts.Close() - - newL, err := daemon.layerStore.Register(ts, parentChainID) - if err != nil { - return "", errors.Wrap(err, "error registering layer") - } - defer daemon.layerStore.Release(newL) - - var newImage image.Image - newImage = *img - newImage.RootFS = nil - - var rootFS image.RootFS - rootFS = *parentImg.RootFS - rootFS.DiffIDs = append(rootFS.DiffIDs, newL.DiffID()) - newImage.RootFS = &rootFS - - for i, hi := range newImage.History { - if i >= len(parentImg.History) { - hi.EmptyLayer = true - } - newImage.History[i] = hi - } - - now := time.Now() - var historyComment string - if len(parent) > 0 { - historyComment = fmt.Sprintf("merge %s to %s", id, parent) - } else { - historyComment = fmt.Sprintf("create new from %s", id) - } - - newImage.History = append(newImage.History, image.History{ - Created: now, - Comment: historyComment, - }) - newImage.Created = now - - b, err := json.Marshal(&newImage) - if err != nil { - return "", errors.Wrap(err, "error marshalling image config") - } - - newImgID, err := daemon.imageStore.Create(b) - if err != nil { - return "", errors.Wrap(err, "error creating new image after squash") - } - return string(newImgID), nil -} - -func newImage(image *image.Image, virtualSize int64) *types.ImageSummary { - newImage := new(types.ImageSummary) - newImage.ParentID = image.Parent.String() - newImage.ID = image.ID().String() - newImage.Created = image.Created.Unix() - newImage.Size = virtualSize - newImage.VirtualSize = virtualSize - newImage.SharedSize = -1 - newImage.Containers = -1 - if image.Config != nil { - newImage.Labels = image.Config.Labels - } - return newImage -} diff --git a/vendor/github.com/docker/docker/daemon/import.go b/vendor/github.com/docker/docker/daemon/import.go deleted file mode 100644 index c93322b92..000000000 --- a/vendor/github.com/docker/docker/daemon/import.go +++ /dev/null @@ -1,135 +0,0 @@ -package daemon - -import ( - "encoding/json" - "errors" - "io" - "net/http" - "net/url" - "runtime" - "time" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/builder/dockerfile" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/httputils" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/pkg/streamformatter" - "github.com/docker/docker/reference" -) - -// ImportImage imports an image, getting the archived layer data either from -// inConfig (if src is "-"), or from a URI specified in src. Progress output is -// written to outStream. Repository and tag names can optionally be given in -// the repo and tag arguments, respectively. -func (daemon *Daemon) ImportImage(src string, repository, tag string, msg string, inConfig io.ReadCloser, outStream io.Writer, changes []string) error { - var ( - sf = streamformatter.NewJSONStreamFormatter() - rc io.ReadCloser - resp *http.Response - newRef reference.Named - ) - - if repository != "" { - var err error - newRef, err = reference.ParseNamed(repository) - if err != nil { - return err - } - - if _, isCanonical := newRef.(reference.Canonical); isCanonical { - return errors.New("cannot import digest reference") - } - - if tag != "" { - newRef, err = reference.WithTag(newRef, tag) - if err != nil { - return err - } - } - } - - config, err := dockerfile.BuildFromConfig(&container.Config{}, changes) - if err != nil { - return err - } - if src == "-" { - rc = inConfig - } else { - inConfig.Close() - u, err := url.Parse(src) - if err != nil { - return err - } - if u.Scheme == "" { - u.Scheme = "http" - u.Host = src - u.Path = "" - } - outStream.Write(sf.FormatStatus("", "Downloading from %s", u)) - resp, err = httputils.Download(u.String()) - if err != nil { - return err - } - progressOutput := sf.NewProgressOutput(outStream, true) - rc = progress.NewProgressReader(resp.Body, progressOutput, resp.ContentLength, "", "Importing") - } - - defer rc.Close() - if len(msg) == 0 { - msg = "Imported from " + src - } - - inflatedLayerData, err := archive.DecompressStream(rc) - if err != nil { - return err - } - // TODO: support windows baselayer? - l, err := daemon.layerStore.Register(inflatedLayerData, "") - if err != nil { - return err - } - defer layer.ReleaseAndLog(daemon.layerStore, l) - - created := time.Now().UTC() - imgConfig, err := json.Marshal(&image.Image{ - V1Image: image.V1Image{ - DockerVersion: dockerversion.Version, - Config: config, - Architecture: runtime.GOARCH, - OS: runtime.GOOS, - Created: created, - Comment: msg, - }, - RootFS: &image.RootFS{ - Type: "layers", - DiffIDs: []layer.DiffID{l.DiffID()}, - }, - History: []image.History{{ - Created: created, - Comment: msg, - }}, - }) - if err != nil { - return err - } - - id, err := daemon.imageStore.Create(imgConfig) - if err != nil { - return err - } - - // FIXME: connect with commit code and call refstore directly - if newRef != nil { - if err := daemon.TagImageWithReference(id, newRef); err != nil { - return err - } - } - - daemon.LogImageEvent(id.String(), id.String(), "import") - outStream.Write(sf.FormatStatus("", id.String())) - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/info.go b/vendor/github.com/docker/docker/daemon/info.go deleted file mode 100644 index 1ab9f2959..000000000 --- a/vendor/github.com/docker/docker/daemon/info.go +++ /dev/null @@ -1,180 +0,0 @@ -package daemon - -import ( - "fmt" - "os" - "runtime" - "sync/atomic" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api" - "github.com/docker/docker/api/types" - "github.com/docker/docker/container" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/pkg/fileutils" - "github.com/docker/docker/pkg/parsers/kernel" - "github.com/docker/docker/pkg/parsers/operatingsystem" - "github.com/docker/docker/pkg/platform" - "github.com/docker/docker/pkg/sysinfo" - "github.com/docker/docker/pkg/system" - "github.com/docker/docker/registry" - "github.com/docker/docker/utils" - "github.com/docker/docker/volume/drivers" - "github.com/docker/go-connections/sockets" -) - -// SystemInfo returns information about the host server the daemon is running on. -func (daemon *Daemon) SystemInfo() (*types.Info, error) { - kernelVersion := "" - if kv, err := kernel.GetKernelVersion(); err != nil { - logrus.Warnf("Could not get kernel version: %v", err) - } else { - kernelVersion = kv.String() - } - - operatingSystem := "" - if s, err := operatingsystem.GetOperatingSystem(); err != nil { - logrus.Warnf("Could not get operating system name: %v", err) - } else { - operatingSystem = s - } - - // Don't do containerized check on Windows - if runtime.GOOS != "windows" { - if inContainer, err := operatingsystem.IsContainerized(); err != nil { - logrus.Errorf("Could not determine if daemon is containerized: %v", err) - operatingSystem += " (error determining if containerized)" - } else if inContainer { - operatingSystem += " (containerized)" - } - } - - meminfo, err := system.ReadMemInfo() - if err != nil { - logrus.Errorf("Could not read system memory info: %v", err) - meminfo = &system.MemInfo{} - } - - sysInfo := sysinfo.New(true) - - var cRunning, cPaused, cStopped int32 - daemon.containers.ApplyAll(func(c *container.Container) { - switch c.StateString() { - case "paused": - atomic.AddInt32(&cPaused, 1) - case "running": - atomic.AddInt32(&cRunning, 1) - default: - atomic.AddInt32(&cStopped, 1) - } - }) - - securityOptions := []string{} - if sysInfo.AppArmor { - securityOptions = append(securityOptions, "name=apparmor") - } - if sysInfo.Seccomp && supportsSeccomp { - profile := daemon.seccompProfilePath - if profile == "" { - profile = "default" - } - securityOptions = append(securityOptions, fmt.Sprintf("name=seccomp,profile=%s", profile)) - } - if selinuxEnabled() { - securityOptions = append(securityOptions, "name=selinux") - } - uid, gid := daemon.GetRemappedUIDGID() - if uid != 0 || gid != 0 { - securityOptions = append(securityOptions, "name=userns") - } - - v := &types.Info{ - ID: daemon.ID, - Containers: int(cRunning + cPaused + cStopped), - ContainersRunning: int(cRunning), - ContainersPaused: int(cPaused), - ContainersStopped: int(cStopped), - Images: len(daemon.imageStore.Map()), - Driver: daemon.GraphDriverName(), - DriverStatus: daemon.layerStore.DriverStatus(), - Plugins: daemon.showPluginsInfo(), - IPv4Forwarding: !sysInfo.IPv4ForwardingDisabled, - BridgeNfIptables: !sysInfo.BridgeNFCallIPTablesDisabled, - BridgeNfIP6tables: !sysInfo.BridgeNFCallIP6TablesDisabled, - Debug: utils.IsDebugEnabled(), - NFd: fileutils.GetTotalUsedFds(), - NGoroutines: runtime.NumGoroutine(), - SystemTime: time.Now().Format(time.RFC3339Nano), - LoggingDriver: daemon.defaultLogConfig.Type, - CgroupDriver: daemon.getCgroupDriver(), - NEventsListener: daemon.EventsService.SubscribersCount(), - KernelVersion: kernelVersion, - OperatingSystem: operatingSystem, - IndexServerAddress: registry.IndexServer, - OSType: platform.OSType, - Architecture: platform.Architecture, - RegistryConfig: daemon.RegistryService.ServiceConfig(), - NCPU: sysinfo.NumCPU(), - MemTotal: meminfo.MemTotal, - DockerRootDir: daemon.configStore.Root, - Labels: daemon.configStore.Labels, - ExperimentalBuild: daemon.configStore.Experimental, - ServerVersion: dockerversion.Version, - ClusterStore: daemon.configStore.ClusterStore, - ClusterAdvertise: daemon.configStore.ClusterAdvertise, - HTTPProxy: sockets.GetProxyEnv("http_proxy"), - HTTPSProxy: sockets.GetProxyEnv("https_proxy"), - NoProxy: sockets.GetProxyEnv("no_proxy"), - LiveRestoreEnabled: daemon.configStore.LiveRestoreEnabled, - SecurityOptions: securityOptions, - Isolation: daemon.defaultIsolation, - } - - // Retrieve platform specific info - daemon.FillPlatformInfo(v, sysInfo) - - hostname := "" - if hn, err := os.Hostname(); err != nil { - logrus.Warnf("Could not get hostname: %v", err) - } else { - hostname = hn - } - v.Name = hostname - - return v, nil -} - -// SystemVersion returns version information about the daemon. -func (daemon *Daemon) SystemVersion() types.Version { - v := types.Version{ - Version: dockerversion.Version, - GitCommit: dockerversion.GitCommit, - MinAPIVersion: api.MinVersion, - GoVersion: runtime.Version(), - Os: runtime.GOOS, - Arch: runtime.GOARCH, - BuildTime: dockerversion.BuildTime, - Experimental: daemon.configStore.Experimental, - } - - kernelVersion := "" - if kv, err := kernel.GetKernelVersion(); err != nil { - logrus.Warnf("Could not get kernel version: %v", err) - } else { - kernelVersion = kv.String() - } - v.KernelVersion = kernelVersion - - return v -} - -func (daemon *Daemon) showPluginsInfo() types.PluginsInfo { - var pluginsInfo types.PluginsInfo - - pluginsInfo.Volume = volumedrivers.GetDriverList() - pluginsInfo.Network = daemon.GetNetworkDriverList() - pluginsInfo.Authorization = daemon.configStore.AuthorizationPlugins - - return pluginsInfo -} diff --git a/vendor/github.com/docker/docker/daemon/info_unix.go b/vendor/github.com/docker/docker/daemon/info_unix.go deleted file mode 100644 index 9c41c0e4c..000000000 --- a/vendor/github.com/docker/docker/daemon/info_unix.go +++ /dev/null @@ -1,82 +0,0 @@ -// +build !windows - -package daemon - -import ( - "context" - "os/exec" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/pkg/sysinfo" -) - -// FillPlatformInfo fills the platform related info. -func (daemon *Daemon) FillPlatformInfo(v *types.Info, sysInfo *sysinfo.SysInfo) { - v.MemoryLimit = sysInfo.MemoryLimit - v.SwapLimit = sysInfo.SwapLimit - v.KernelMemory = sysInfo.KernelMemory - v.OomKillDisable = sysInfo.OomKillDisable - v.CPUCfsPeriod = sysInfo.CPUCfsPeriod - v.CPUCfsQuota = sysInfo.CPUCfsQuota - v.CPUShares = sysInfo.CPUShares - v.CPUSet = sysInfo.Cpuset - v.Runtimes = daemon.configStore.GetAllRuntimes() - v.DefaultRuntime = daemon.configStore.GetDefaultRuntimeName() - v.InitBinary = daemon.configStore.GetInitPath() - - v.ContainerdCommit.Expected = dockerversion.ContainerdCommitID - if sv, err := daemon.containerd.GetServerVersion(context.Background()); err == nil { - v.ContainerdCommit.ID = sv.Revision - } else { - logrus.Warnf("failed to retrieve containerd version: %v", err) - v.ContainerdCommit.ID = "N/A" - } - - v.RuncCommit.Expected = dockerversion.RuncCommitID - if rv, err := exec.Command(DefaultRuntimeBinary, "--version").Output(); err == nil { - parts := strings.Split(strings.TrimSpace(string(rv)), "\n") - if len(parts) == 3 { - parts = strings.Split(parts[1], ": ") - if len(parts) == 2 { - v.RuncCommit.ID = strings.TrimSpace(parts[1]) - } - } - - if v.RuncCommit.ID == "" { - logrus.Warnf("failed to retrieve %s version: unknown output format: %s", DefaultRuntimeBinary, string(rv)) - v.RuncCommit.ID = "N/A" - } - } else { - logrus.Warnf("failed to retrieve %s version: %v", DefaultRuntimeBinary, err) - v.RuncCommit.ID = "N/A" - } - - v.InitCommit.Expected = dockerversion.InitCommitID - if rv, err := exec.Command(DefaultInitBinary, "--version").Output(); err == nil { - parts := strings.Split(strings.TrimSpace(string(rv)), " - ") - if len(parts) == 2 { - if dockerversion.InitCommitID[0] == 'v' { - vs := strings.TrimPrefix(parts[0], "tini version ") - v.InitCommit.ID = "v" + vs - } else { - // Get the sha1 - gitParts := strings.Split(parts[1], ".") - if len(gitParts) == 2 && gitParts[0] == "git" { - v.InitCommit.ID = gitParts[1] - v.InitCommit.Expected = dockerversion.InitCommitID[0:len(gitParts[1])] - } - } - } - - if v.InitCommit.ID == "" { - logrus.Warnf("failed to retrieve %s version: unknown output format: %s", DefaultInitBinary, string(rv)) - v.InitCommit.ID = "N/A" - } - } else { - logrus.Warnf("failed to retrieve %s version", DefaultInitBinary) - v.InitCommit.ID = "N/A" - } -} diff --git a/vendor/github.com/docker/docker/daemon/info_windows.go b/vendor/github.com/docker/docker/daemon/info_windows.go deleted file mode 100644 index c700911eb..000000000 --- a/vendor/github.com/docker/docker/daemon/info_windows.go +++ /dev/null @@ -1,10 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/sysinfo" -) - -// FillPlatformInfo fills the platform related info. -func (daemon *Daemon) FillPlatformInfo(v *types.Info, sysInfo *sysinfo.SysInfo) { -} diff --git a/vendor/github.com/docker/docker/daemon/initlayer/setup_solaris.go b/vendor/github.com/docker/docker/daemon/initlayer/setup_solaris.go deleted file mode 100644 index 66d53f0ee..000000000 --- a/vendor/github.com/docker/docker/daemon/initlayer/setup_solaris.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build solaris,cgo - -package initlayer - -// Setup populates a directory with mountpoints suitable -// for bind-mounting dockerinit into the container. The mountpoint is simply an -// empty file at /.dockerinit -// -// This extra layer is used by all containers as the top-most ro layer. It protects -// the container from unwanted side-effects on the rw layer. -func Setup(initLayer string, rootUID, rootGID int) error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/initlayer/setup_unix.go b/vendor/github.com/docker/docker/daemon/initlayer/setup_unix.go deleted file mode 100644 index e83c2751e..000000000 --- a/vendor/github.com/docker/docker/daemon/initlayer/setup_unix.go +++ /dev/null @@ -1,69 +0,0 @@ -// +build linux freebsd - -package initlayer - -import ( - "os" - "path/filepath" - "strings" - "syscall" - - "github.com/docker/docker/pkg/idtools" -) - -// Setup populates a directory with mountpoints suitable -// for bind-mounting things into the container. -// -// This extra layer is used by all containers as the top-most ro layer. It protects -// the container from unwanted side-effects on the rw layer. -func Setup(initLayer string, rootUID, rootGID int) error { - for pth, typ := range map[string]string{ - "/dev/pts": "dir", - "/dev/shm": "dir", - "/proc": "dir", - "/sys": "dir", - "/.dockerenv": "file", - "/etc/resolv.conf": "file", - "/etc/hosts": "file", - "/etc/hostname": "file", - "/dev/console": "file", - "/etc/mtab": "/proc/mounts", - } { - parts := strings.Split(pth, "/") - prev := "/" - for _, p := range parts[1:] { - prev = filepath.Join(prev, p) - syscall.Unlink(filepath.Join(initLayer, prev)) - } - - if _, err := os.Stat(filepath.Join(initLayer, pth)); err != nil { - if os.IsNotExist(err) { - if err := idtools.MkdirAllNewAs(filepath.Join(initLayer, filepath.Dir(pth)), 0755, rootUID, rootGID); err != nil { - return err - } - switch typ { - case "dir": - if err := idtools.MkdirAllNewAs(filepath.Join(initLayer, pth), 0755, rootUID, rootGID); err != nil { - return err - } - case "file": - f, err := os.OpenFile(filepath.Join(initLayer, pth), os.O_CREATE, 0755) - if err != nil { - return err - } - f.Chown(rootUID, rootGID) - f.Close() - default: - if err := os.Symlink(typ, filepath.Join(initLayer, pth)); err != nil { - return err - } - } - } else { - return err - } - } - } - - // Layer is ready to use, if it wasn't before. - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/initlayer/setup_windows.go b/vendor/github.com/docker/docker/daemon/initlayer/setup_windows.go deleted file mode 100644 index 48a9d71aa..000000000 --- a/vendor/github.com/docker/docker/daemon/initlayer/setup_windows.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build windows - -package initlayer - -// Setup populates a directory with mountpoints suitable -// for bind-mounting dockerinit into the container. The mountpoint is simply an -// empty file at /.dockerinit -// -// This extra layer is used by all containers as the top-most ro layer. It protects -// the container from unwanted side-effects on the rw layer. -func Setup(initLayer string, rootUID, rootGID int) error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/inspect.go b/vendor/github.com/docker/docker/daemon/inspect.go deleted file mode 100644 index 557f639de..000000000 --- a/vendor/github.com/docker/docker/daemon/inspect.go +++ /dev/null @@ -1,264 +0,0 @@ -package daemon - -import ( - "fmt" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - networktypes "github.com/docker/docker/api/types/network" - "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/api/types/versions/v1p20" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/network" -) - -// ContainerInspect returns low-level information about a -// container. Returns an error if the container cannot be found, or if -// there is an error getting the data. -func (daemon *Daemon) ContainerInspect(name string, size bool, version string) (interface{}, error) { - switch { - case versions.LessThan(version, "1.20"): - return daemon.containerInspectPre120(name) - case versions.Equal(version, "1.20"): - return daemon.containerInspect120(name) - } - return daemon.ContainerInspectCurrent(name, size) -} - -// ContainerInspectCurrent returns low-level information about a -// container in a most recent api version. -func (daemon *Daemon) ContainerInspectCurrent(name string, size bool) (*types.ContainerJSON, error) { - container, err := daemon.GetContainer(name) - if err != nil { - return nil, err - } - - container.Lock() - defer container.Unlock() - - base, err := daemon.getInspectData(container, size) - if err != nil { - return nil, err - } - - apiNetworks := make(map[string]*networktypes.EndpointSettings) - for name, epConf := range container.NetworkSettings.Networks { - if epConf.EndpointSettings != nil { - apiNetworks[name] = epConf.EndpointSettings - } - } - - mountPoints := addMountPoints(container) - networkSettings := &types.NetworkSettings{ - NetworkSettingsBase: types.NetworkSettingsBase{ - Bridge: container.NetworkSettings.Bridge, - SandboxID: container.NetworkSettings.SandboxID, - HairpinMode: container.NetworkSettings.HairpinMode, - LinkLocalIPv6Address: container.NetworkSettings.LinkLocalIPv6Address, - LinkLocalIPv6PrefixLen: container.NetworkSettings.LinkLocalIPv6PrefixLen, - Ports: container.NetworkSettings.Ports, - SandboxKey: container.NetworkSettings.SandboxKey, - SecondaryIPAddresses: container.NetworkSettings.SecondaryIPAddresses, - SecondaryIPv6Addresses: container.NetworkSettings.SecondaryIPv6Addresses, - }, - DefaultNetworkSettings: daemon.getDefaultNetworkSettings(container.NetworkSettings.Networks), - Networks: apiNetworks, - } - - return &types.ContainerJSON{ - ContainerJSONBase: base, - Mounts: mountPoints, - Config: container.Config, - NetworkSettings: networkSettings, - }, nil -} - -// containerInspect120 serializes the master version of a container into a json type. -func (daemon *Daemon) containerInspect120(name string) (*v1p20.ContainerJSON, error) { - container, err := daemon.GetContainer(name) - if err != nil { - return nil, err - } - - container.Lock() - defer container.Unlock() - - base, err := daemon.getInspectData(container, false) - if err != nil { - return nil, err - } - - mountPoints := addMountPoints(container) - config := &v1p20.ContainerConfig{ - Config: container.Config, - MacAddress: container.Config.MacAddress, - NetworkDisabled: container.Config.NetworkDisabled, - ExposedPorts: container.Config.ExposedPorts, - VolumeDriver: container.HostConfig.VolumeDriver, - } - networkSettings := daemon.getBackwardsCompatibleNetworkSettings(container.NetworkSettings) - - return &v1p20.ContainerJSON{ - ContainerJSONBase: base, - Mounts: mountPoints, - Config: config, - NetworkSettings: networkSettings, - }, nil -} - -func (daemon *Daemon) getInspectData(container *container.Container, size bool) (*types.ContainerJSONBase, error) { - // make a copy to play with - hostConfig := *container.HostConfig - - children := daemon.children(container) - hostConfig.Links = nil // do not expose the internal structure - for linkAlias, child := range children { - hostConfig.Links = append(hostConfig.Links, fmt.Sprintf("%s:%s", child.Name, linkAlias)) - } - - // We merge the Ulimits from hostConfig with daemon default - daemon.mergeUlimits(&hostConfig) - - var containerHealth *types.Health - if container.State.Health != nil { - containerHealth = &types.Health{ - Status: container.State.Health.Status, - FailingStreak: container.State.Health.FailingStreak, - Log: append([]*types.HealthcheckResult{}, container.State.Health.Log...), - } - } - - containerState := &types.ContainerState{ - Status: container.State.StateString(), - Running: container.State.Running, - Paused: container.State.Paused, - Restarting: container.State.Restarting, - OOMKilled: container.State.OOMKilled, - Dead: container.State.Dead, - Pid: container.State.Pid, - ExitCode: container.State.ExitCode(), - Error: container.State.Error(), - StartedAt: container.State.StartedAt.Format(time.RFC3339Nano), - FinishedAt: container.State.FinishedAt.Format(time.RFC3339Nano), - Health: containerHealth, - } - - contJSONBase := &types.ContainerJSONBase{ - ID: container.ID, - Created: container.Created.Format(time.RFC3339Nano), - Path: container.Path, - Args: container.Args, - State: containerState, - Image: container.ImageID.String(), - LogPath: container.LogPath, - Name: container.Name, - RestartCount: container.RestartCount, - Driver: container.Driver, - MountLabel: container.MountLabel, - ProcessLabel: container.ProcessLabel, - ExecIDs: container.GetExecIDs(), - HostConfig: &hostConfig, - } - - var ( - sizeRw int64 - sizeRootFs int64 - ) - if size { - sizeRw, sizeRootFs = daemon.getSize(container) - contJSONBase.SizeRw = &sizeRw - contJSONBase.SizeRootFs = &sizeRootFs - } - - // Now set any platform-specific fields - contJSONBase = setPlatformSpecificContainerFields(container, contJSONBase) - - contJSONBase.GraphDriver.Name = container.Driver - - graphDriverData, err := container.RWLayer.Metadata() - // If container is marked as Dead, the container's graphdriver metadata - // could have been removed, it will cause error if we try to get the metadata, - // we can ignore the error if the container is dead. - if err != nil && !container.Dead { - return nil, err - } - contJSONBase.GraphDriver.Data = graphDriverData - - return contJSONBase, nil -} - -// ContainerExecInspect returns low-level information about the exec -// command. An error is returned if the exec cannot be found. -func (daemon *Daemon) ContainerExecInspect(id string) (*backend.ExecInspect, error) { - e, err := daemon.getExecConfig(id) - if err != nil { - return nil, err - } - - pc := inspectExecProcessConfig(e) - - return &backend.ExecInspect{ - ID: e.ID, - Running: e.Running, - ExitCode: e.ExitCode, - ProcessConfig: pc, - OpenStdin: e.OpenStdin, - OpenStdout: e.OpenStdout, - OpenStderr: e.OpenStderr, - CanRemove: e.CanRemove, - ContainerID: e.ContainerID, - DetachKeys: e.DetachKeys, - Pid: e.Pid, - }, nil -} - -// VolumeInspect looks up a volume by name. An error is returned if -// the volume cannot be found. -func (daemon *Daemon) VolumeInspect(name string) (*types.Volume, error) { - v, err := daemon.volumes.Get(name) - if err != nil { - return nil, err - } - apiV := volumeToAPIType(v) - apiV.Mountpoint = v.Path() - apiV.Status = v.Status() - return apiV, nil -} - -func (daemon *Daemon) getBackwardsCompatibleNetworkSettings(settings *network.Settings) *v1p20.NetworkSettings { - result := &v1p20.NetworkSettings{ - NetworkSettingsBase: types.NetworkSettingsBase{ - Bridge: settings.Bridge, - SandboxID: settings.SandboxID, - HairpinMode: settings.HairpinMode, - LinkLocalIPv6Address: settings.LinkLocalIPv6Address, - LinkLocalIPv6PrefixLen: settings.LinkLocalIPv6PrefixLen, - Ports: settings.Ports, - SandboxKey: settings.SandboxKey, - SecondaryIPAddresses: settings.SecondaryIPAddresses, - SecondaryIPv6Addresses: settings.SecondaryIPv6Addresses, - }, - DefaultNetworkSettings: daemon.getDefaultNetworkSettings(settings.Networks), - } - - return result -} - -// getDefaultNetworkSettings creates the deprecated structure that holds the information -// about the bridge network for a container. -func (daemon *Daemon) getDefaultNetworkSettings(networks map[string]*network.EndpointSettings) types.DefaultNetworkSettings { - var settings types.DefaultNetworkSettings - - if defaultNetwork, ok := networks["bridge"]; ok && defaultNetwork.EndpointSettings != nil { - settings.EndpointID = defaultNetwork.EndpointID - settings.Gateway = defaultNetwork.Gateway - settings.GlobalIPv6Address = defaultNetwork.GlobalIPv6Address - settings.GlobalIPv6PrefixLen = defaultNetwork.GlobalIPv6PrefixLen - settings.IPAddress = defaultNetwork.IPAddress - settings.IPPrefixLen = defaultNetwork.IPPrefixLen - settings.IPv6Gateway = defaultNetwork.IPv6Gateway - settings.MacAddress = defaultNetwork.MacAddress - } - return settings -} diff --git a/vendor/github.com/docker/docker/daemon/inspect_solaris.go b/vendor/github.com/docker/docker/daemon/inspect_solaris.go deleted file mode 100644 index 0e3dcc111..000000000 --- a/vendor/github.com/docker/docker/daemon/inspect_solaris.go +++ /dev/null @@ -1,41 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/versions/v1p19" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/exec" -) - -// This sets platform-specific fields -func setPlatformSpecificContainerFields(container *container.Container, contJSONBase *types.ContainerJSONBase) *types.ContainerJSONBase { - return contJSONBase -} - -// containerInspectPre120 get containers for pre 1.20 APIs. -func (daemon *Daemon) containerInspectPre120(name string) (*v1p19.ContainerJSON, error) { - return &v1p19.ContainerJSON{}, nil -} - -func addMountPoints(container *container.Container) []types.MountPoint { - mountPoints := make([]types.MountPoint, 0, len(container.MountPoints)) - for _, m := range container.MountPoints { - mountPoints = append(mountPoints, types.MountPoint{ - Name: m.Name, - Source: m.Path(), - Destination: m.Destination, - Driver: m.Driver, - RW: m.RW, - }) - } - return mountPoints -} - -func inspectExecProcessConfig(e *exec.Config) *backend.ExecProcessConfig { - return &backend.ExecProcessConfig{ - Tty: e.Tty, - Entrypoint: e.Entrypoint, - Arguments: e.Args, - } -} diff --git a/vendor/github.com/docker/docker/daemon/inspect_unix.go b/vendor/github.com/docker/docker/daemon/inspect_unix.go deleted file mode 100644 index 08a82235a..000000000 --- a/vendor/github.com/docker/docker/daemon/inspect_unix.go +++ /dev/null @@ -1,92 +0,0 @@ -// +build !windows,!solaris - -package daemon - -import ( - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/versions/v1p19" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/exec" -) - -// This sets platform-specific fields -func setPlatformSpecificContainerFields(container *container.Container, contJSONBase *types.ContainerJSONBase) *types.ContainerJSONBase { - contJSONBase.AppArmorProfile = container.AppArmorProfile - contJSONBase.ResolvConfPath = container.ResolvConfPath - contJSONBase.HostnamePath = container.HostnamePath - contJSONBase.HostsPath = container.HostsPath - - return contJSONBase -} - -// containerInspectPre120 gets containers for pre 1.20 APIs. -func (daemon *Daemon) containerInspectPre120(name string) (*v1p19.ContainerJSON, error) { - container, err := daemon.GetContainer(name) - if err != nil { - return nil, err - } - - container.Lock() - defer container.Unlock() - - base, err := daemon.getInspectData(container, false) - if err != nil { - return nil, err - } - - volumes := make(map[string]string) - volumesRW := make(map[string]bool) - for _, m := range container.MountPoints { - volumes[m.Destination] = m.Path() - volumesRW[m.Destination] = m.RW - } - - config := &v1p19.ContainerConfig{ - Config: container.Config, - MacAddress: container.Config.MacAddress, - NetworkDisabled: container.Config.NetworkDisabled, - ExposedPorts: container.Config.ExposedPorts, - VolumeDriver: container.HostConfig.VolumeDriver, - Memory: container.HostConfig.Memory, - MemorySwap: container.HostConfig.MemorySwap, - CPUShares: container.HostConfig.CPUShares, - CPUSet: container.HostConfig.CpusetCpus, - } - networkSettings := daemon.getBackwardsCompatibleNetworkSettings(container.NetworkSettings) - - return &v1p19.ContainerJSON{ - ContainerJSONBase: base, - Volumes: volumes, - VolumesRW: volumesRW, - Config: config, - NetworkSettings: networkSettings, - }, nil -} - -func addMountPoints(container *container.Container) []types.MountPoint { - mountPoints := make([]types.MountPoint, 0, len(container.MountPoints)) - for _, m := range container.MountPoints { - mountPoints = append(mountPoints, types.MountPoint{ - Type: m.Type, - Name: m.Name, - Source: m.Path(), - Destination: m.Destination, - Driver: m.Driver, - Mode: m.Mode, - RW: m.RW, - Propagation: m.Propagation, - }) - } - return mountPoints -} - -func inspectExecProcessConfig(e *exec.Config) *backend.ExecProcessConfig { - return &backend.ExecProcessConfig{ - Tty: e.Tty, - Entrypoint: e.Entrypoint, - Arguments: e.Args, - Privileged: &e.Privileged, - User: e.User, - } -} diff --git a/vendor/github.com/docker/docker/daemon/inspect_windows.go b/vendor/github.com/docker/docker/daemon/inspect_windows.go deleted file mode 100644 index b331c83ca..000000000 --- a/vendor/github.com/docker/docker/daemon/inspect_windows.go +++ /dev/null @@ -1,41 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/exec" -) - -// This sets platform-specific fields -func setPlatformSpecificContainerFields(container *container.Container, contJSONBase *types.ContainerJSONBase) *types.ContainerJSONBase { - return contJSONBase -} - -func addMountPoints(container *container.Container) []types.MountPoint { - mountPoints := make([]types.MountPoint, 0, len(container.MountPoints)) - for _, m := range container.MountPoints { - mountPoints = append(mountPoints, types.MountPoint{ - Type: m.Type, - Name: m.Name, - Source: m.Path(), - Destination: m.Destination, - Driver: m.Driver, - RW: m.RW, - }) - } - return mountPoints -} - -// containerInspectPre120 get containers for pre 1.20 APIs. -func (daemon *Daemon) containerInspectPre120(name string) (*types.ContainerJSON, error) { - return daemon.ContainerInspectCurrent(name, false) -} - -func inspectExecProcessConfig(e *exec.Config) *backend.ExecProcessConfig { - return &backend.ExecProcessConfig{ - Tty: e.Tty, - Entrypoint: e.Entrypoint, - Arguments: e.Args, - } -} diff --git a/vendor/github.com/docker/docker/daemon/keys.go b/vendor/github.com/docker/docker/daemon/keys.go deleted file mode 100644 index 055d488a5..000000000 --- a/vendor/github.com/docker/docker/daemon/keys.go +++ /dev/null @@ -1,59 +0,0 @@ -// +build linux - -package daemon - -import ( - "fmt" - "io/ioutil" - "os" - "strconv" - "strings" -) - -const ( - rootKeyFile = "/proc/sys/kernel/keys/root_maxkeys" - rootBytesFile = "/proc/sys/kernel/keys/root_maxbytes" - rootKeyLimit = 1000000 - // it is standard configuration to allocate 25 bytes per key - rootKeyByteMultiplier = 25 -) - -// ModifyRootKeyLimit checks to see if the root key limit is set to -// at least 1000000 and changes it to that limit along with the maxbytes -// allocated to the keys at a 25 to 1 multiplier. -func ModifyRootKeyLimit() error { - value, err := readRootKeyLimit(rootKeyFile) - if err != nil { - return err - } - if value < rootKeyLimit { - return setRootKeyLimit(rootKeyLimit) - } - return nil -} - -func setRootKeyLimit(limit int) error { - keys, err := os.OpenFile(rootKeyFile, os.O_WRONLY, 0) - if err != nil { - return err - } - defer keys.Close() - if _, err := fmt.Fprintf(keys, "%d", limit); err != nil { - return err - } - bytes, err := os.OpenFile(rootBytesFile, os.O_WRONLY, 0) - if err != nil { - return err - } - defer bytes.Close() - _, err = fmt.Fprintf(bytes, "%d", limit*rootKeyByteMultiplier) - return err -} - -func readRootKeyLimit(path string) (int, error) { - data, err := ioutil.ReadFile(path) - if err != nil { - return -1, err - } - return strconv.Atoi(strings.Trim(string(data), "\n")) -} diff --git a/vendor/github.com/docker/docker/daemon/keys_unsupported.go b/vendor/github.com/docker/docker/daemon/keys_unsupported.go deleted file mode 100644 index b17255940..000000000 --- a/vendor/github.com/docker/docker/daemon/keys_unsupported.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !linux - -package daemon - -// ModifyRootKeyLimit is an noop on unsupported platforms. -func ModifyRootKeyLimit() error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/kill.go b/vendor/github.com/docker/docker/daemon/kill.go deleted file mode 100644 index 18d5bbb4e..000000000 --- a/vendor/github.com/docker/docker/daemon/kill.go +++ /dev/null @@ -1,164 +0,0 @@ -package daemon - -import ( - "fmt" - "runtime" - "strings" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/signal" -) - -type errNoSuchProcess struct { - pid int - signal int -} - -func (e errNoSuchProcess) Error() string { - return fmt.Sprintf("Cannot kill process (pid=%d) with signal %d: no such process.", e.pid, e.signal) -} - -// isErrNoSuchProcess returns true if the error -// is an instance of errNoSuchProcess. -func isErrNoSuchProcess(err error) bool { - _, ok := err.(errNoSuchProcess) - return ok -} - -// ContainerKill sends signal to the container -// If no signal is given (sig 0), then Kill with SIGKILL and wait -// for the container to exit. -// If a signal is given, then just send it to the container and return. -func (daemon *Daemon) ContainerKill(name string, sig uint64) error { - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - if sig != 0 && !signal.ValidSignalForPlatform(syscall.Signal(sig)) { - return fmt.Errorf("The %s daemon does not support signal %d", runtime.GOOS, sig) - } - - // If no signal is passed, or SIGKILL, perform regular Kill (SIGKILL + wait()) - if sig == 0 || syscall.Signal(sig) == syscall.SIGKILL { - return daemon.Kill(container) - } - return daemon.killWithSignal(container, int(sig)) -} - -// killWithSignal sends the container the given signal. This wrapper for the -// host specific kill command prepares the container before attempting -// to send the signal. An error is returned if the container is paused -// or not running, or if there is a problem returned from the -// underlying kill command. -func (daemon *Daemon) killWithSignal(container *container.Container, sig int) error { - logrus.Debugf("Sending kill signal %d to container %s", sig, container.ID) - container.Lock() - defer container.Unlock() - - // We could unpause the container for them rather than returning this error - if container.Paused { - return fmt.Errorf("Container %s is paused. Unpause the container before stopping", container.ID) - } - - if !container.Running { - return errNotRunning{container.ID} - } - - if container.Config.StopSignal != "" { - containerStopSignal, err := signal.ParseSignal(container.Config.StopSignal) - if err != nil { - return err - } - if containerStopSignal == syscall.Signal(sig) { - container.ExitOnNext() - } - } else { - container.ExitOnNext() - } - - if !daemon.IsShuttingDown() { - container.HasBeenManuallyStopped = true - } - - // if the container is currently restarting we do not need to send the signal - // to the process. Telling the monitor that it should exit on its next event - // loop is enough - if container.Restarting { - return nil - } - - if err := daemon.kill(container, sig); err != nil { - err = fmt.Errorf("Cannot kill container %s: %s", container.ID, err) - // if container or process not exists, ignore the error - if strings.Contains(err.Error(), "container not found") || - strings.Contains(err.Error(), "no such process") { - logrus.Warnf("container kill failed because of 'container not found' or 'no such process': %s", err.Error()) - } else { - return err - } - } - - attributes := map[string]string{ - "signal": fmt.Sprintf("%d", sig), - } - daemon.LogContainerEventWithAttributes(container, "kill", attributes) - return nil -} - -// Kill forcefully terminates a container. -func (daemon *Daemon) Kill(container *container.Container) error { - if !container.IsRunning() { - return errNotRunning{container.ID} - } - - // 1. Send SIGKILL - if err := daemon.killPossiblyDeadProcess(container, int(syscall.SIGKILL)); err != nil { - // While normally we might "return err" here we're not going to - // because if we can't stop the container by this point then - // its probably because its already stopped. Meaning, between - // the time of the IsRunning() call above and now it stopped. - // Also, since the err return will be environment specific we can't - // look for any particular (common) error that would indicate - // that the process is already dead vs something else going wrong. - // So, instead we'll give it up to 2 more seconds to complete and if - // by that time the container is still running, then the error - // we got is probably valid and so we return it to the caller. - if isErrNoSuchProcess(err) { - return nil - } - - if _, err2 := container.WaitStop(2 * time.Second); err2 != nil { - return err - } - } - - // 2. Wait for the process to die, in last resort, try to kill the process directly - if err := killProcessDirectly(container); err != nil { - if isErrNoSuchProcess(err) { - return nil - } - return err - } - - container.WaitStop(-1 * time.Second) - return nil -} - -// killPossibleDeadProcess is a wrapper around killSig() suppressing "no such process" error. -func (daemon *Daemon) killPossiblyDeadProcess(container *container.Container, sig int) error { - err := daemon.killWithSignal(container, sig) - if err == syscall.ESRCH { - e := errNoSuchProcess{container.GetPID(), sig} - logrus.Debug(e) - return e - } - return err -} - -func (daemon *Daemon) kill(c *container.Container, sig int) error { - return daemon.containerd.Signal(c.ID, sig) -} diff --git a/vendor/github.com/docker/docker/daemon/links.go b/vendor/github.com/docker/docker/daemon/links.go deleted file mode 100644 index 7f691d4f1..000000000 --- a/vendor/github.com/docker/docker/daemon/links.go +++ /dev/null @@ -1,87 +0,0 @@ -package daemon - -import ( - "sync" - - "github.com/docker/docker/container" -) - -// linkIndex stores link relationships between containers, including their specified alias -// The alias is the name the parent uses to reference the child -type linkIndex struct { - // idx maps a parent->alias->child relationship - idx map[*container.Container]map[string]*container.Container - // childIdx maps child->parent->aliases - childIdx map[*container.Container]map[*container.Container]map[string]struct{} - mu sync.Mutex -} - -func newLinkIndex() *linkIndex { - return &linkIndex{ - idx: make(map[*container.Container]map[string]*container.Container), - childIdx: make(map[*container.Container]map[*container.Container]map[string]struct{}), - } -} - -// link adds indexes for the passed in parent/child/alias relationships -func (l *linkIndex) link(parent, child *container.Container, alias string) { - l.mu.Lock() - - if l.idx[parent] == nil { - l.idx[parent] = make(map[string]*container.Container) - } - l.idx[parent][alias] = child - if l.childIdx[child] == nil { - l.childIdx[child] = make(map[*container.Container]map[string]struct{}) - } - if l.childIdx[child][parent] == nil { - l.childIdx[child][parent] = make(map[string]struct{}) - } - l.childIdx[child][parent][alias] = struct{}{} - - l.mu.Unlock() -} - -// unlink removes the requested alias for the given parent/child -func (l *linkIndex) unlink(alias string, child, parent *container.Container) { - l.mu.Lock() - delete(l.idx[parent], alias) - delete(l.childIdx[child], parent) - l.mu.Unlock() -} - -// children maps all the aliases-> children for the passed in parent -// aliases here are the aliases the parent uses to refer to the child -func (l *linkIndex) children(parent *container.Container) map[string]*container.Container { - l.mu.Lock() - children := l.idx[parent] - l.mu.Unlock() - return children -} - -// parents maps all the aliases->parent for the passed in child -// aliases here are the aliases the parents use to refer to the child -func (l *linkIndex) parents(child *container.Container) map[string]*container.Container { - l.mu.Lock() - - parents := make(map[string]*container.Container) - for parent, aliases := range l.childIdx[child] { - for alias := range aliases { - parents[alias] = parent - } - } - - l.mu.Unlock() - return parents -} - -// delete deletes all link relationships referencing this container -func (l *linkIndex) delete(container *container.Container) { - l.mu.Lock() - for _, child := range l.idx[container] { - delete(l.childIdx[child], container) - } - delete(l.idx, container) - delete(l.childIdx, container) - l.mu.Unlock() -} diff --git a/vendor/github.com/docker/docker/daemon/links/links.go b/vendor/github.com/docker/docker/daemon/links/links.go deleted file mode 100644 index af15de046..000000000 --- a/vendor/github.com/docker/docker/daemon/links/links.go +++ /dev/null @@ -1,141 +0,0 @@ -package links - -import ( - "fmt" - "path" - "strings" - - "github.com/docker/go-connections/nat" -) - -// Link struct holds informations about parent/child linked container -type Link struct { - // Parent container IP address - ParentIP string - // Child container IP address - ChildIP string - // Link name - Name string - // Child environments variables - ChildEnvironment []string - // Child exposed ports - Ports []nat.Port -} - -// NewLink initializes a new Link struct with the provided options. -func NewLink(parentIP, childIP, name string, env []string, exposedPorts map[nat.Port]struct{}) *Link { - var ( - i int - ports = make([]nat.Port, len(exposedPorts)) - ) - - for p := range exposedPorts { - ports[i] = p - i++ - } - - return &Link{ - Name: name, - ChildIP: childIP, - ParentIP: parentIP, - ChildEnvironment: env, - Ports: ports, - } -} - -// ToEnv creates a string's slice containing child container informations in -// the form of environment variables which will be later exported on container -// startup. -func (l *Link) ToEnv() []string { - env := []string{} - - _, n := path.Split(l.Name) - alias := strings.Replace(strings.ToUpper(n), "-", "_", -1) - - if p := l.getDefaultPort(); p != nil { - env = append(env, fmt.Sprintf("%s_PORT=%s://%s:%s", alias, p.Proto(), l.ChildIP, p.Port())) - } - - //sort the ports so that we can bulk the continuous ports together - nat.Sort(l.Ports, func(ip, jp nat.Port) bool { - // If the two ports have the same number, tcp takes priority - // Sort in desc order - return ip.Int() < jp.Int() || (ip.Int() == jp.Int() && strings.ToLower(ip.Proto()) == "tcp") - }) - - for i := 0; i < len(l.Ports); { - p := l.Ports[i] - j := nextContiguous(l.Ports, p.Int(), i) - if j > i+1 { - env = append(env, fmt.Sprintf("%s_PORT_%s_%s_START=%s://%s:%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Proto(), l.ChildIP, p.Port())) - env = append(env, fmt.Sprintf("%s_PORT_%s_%s_ADDR=%s", alias, p.Port(), strings.ToUpper(p.Proto()), l.ChildIP)) - env = append(env, fmt.Sprintf("%s_PORT_%s_%s_PROTO=%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Proto())) - env = append(env, fmt.Sprintf("%s_PORT_%s_%s_PORT_START=%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Port())) - - q := l.Ports[j] - env = append(env, fmt.Sprintf("%s_PORT_%s_%s_END=%s://%s:%s", alias, p.Port(), strings.ToUpper(q.Proto()), q.Proto(), l.ChildIP, q.Port())) - env = append(env, fmt.Sprintf("%s_PORT_%s_%s_PORT_END=%s", alias, p.Port(), strings.ToUpper(q.Proto()), q.Port())) - - i = j + 1 - continue - } else { - i++ - } - } - for _, p := range l.Ports { - env = append(env, fmt.Sprintf("%s_PORT_%s_%s=%s://%s:%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Proto(), l.ChildIP, p.Port())) - env = append(env, fmt.Sprintf("%s_PORT_%s_%s_ADDR=%s", alias, p.Port(), strings.ToUpper(p.Proto()), l.ChildIP)) - env = append(env, fmt.Sprintf("%s_PORT_%s_%s_PORT=%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Port())) - env = append(env, fmt.Sprintf("%s_PORT_%s_%s_PROTO=%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Proto())) - } - - // Load the linked container's name into the environment - env = append(env, fmt.Sprintf("%s_NAME=%s", alias, l.Name)) - - if l.ChildEnvironment != nil { - for _, v := range l.ChildEnvironment { - parts := strings.SplitN(v, "=", 2) - if len(parts) < 2 { - continue - } - // Ignore a few variables that are added during docker build (and not really relevant to linked containers) - if parts[0] == "HOME" || parts[0] == "PATH" { - continue - } - env = append(env, fmt.Sprintf("%s_ENV_%s=%s", alias, parts[0], parts[1])) - } - } - return env -} - -func nextContiguous(ports []nat.Port, value int, index int) int { - if index+1 == len(ports) { - return index - } - for i := index + 1; i < len(ports); i++ { - if ports[i].Int() > value+1 { - return i - 1 - } - - value++ - } - return len(ports) - 1 -} - -// Default port rules -func (l *Link) getDefaultPort() *nat.Port { - var p nat.Port - i := len(l.Ports) - - if i == 0 { - return nil - } else if i > 1 { - nat.Sort(l.Ports, func(ip, jp nat.Port) bool { - // If the two ports have the same number, tcp takes priority - // Sort in desc order - return ip.Int() < jp.Int() || (ip.Int() == jp.Int() && strings.ToLower(ip.Proto()) == "tcp") - }) - } - p = l.Ports[0] - return &p -} diff --git a/vendor/github.com/docker/docker/daemon/links/links_test.go b/vendor/github.com/docker/docker/daemon/links/links_test.go deleted file mode 100644 index 0273f13cf..000000000 --- a/vendor/github.com/docker/docker/daemon/links/links_test.go +++ /dev/null @@ -1,213 +0,0 @@ -package links - -import ( - "fmt" - "strings" - "testing" - - "github.com/docker/go-connections/nat" -) - -// Just to make life easier -func newPortNoError(proto, port string) nat.Port { - p, _ := nat.NewPort(proto, port) - return p -} - -func TestLinkNaming(t *testing.T) { - ports := make(nat.PortSet) - ports[newPortNoError("tcp", "6379")] = struct{}{} - - link := NewLink("172.0.17.3", "172.0.17.2", "/db/docker-1", nil, ports) - - rawEnv := link.ToEnv() - env := make(map[string]string, len(rawEnv)) - for _, e := range rawEnv { - parts := strings.Split(e, "=") - if len(parts) != 2 { - t.FailNow() - } - env[parts[0]] = parts[1] - } - - value, ok := env["DOCKER_1_PORT"] - - if !ok { - t.Fatalf("DOCKER_1_PORT not found in env") - } - - if value != "tcp://172.0.17.2:6379" { - t.Fatalf("Expected 172.0.17.2:6379, got %s", env["DOCKER_1_PORT"]) - } -} - -func TestLinkNew(t *testing.T) { - ports := make(nat.PortSet) - ports[newPortNoError("tcp", "6379")] = struct{}{} - - link := NewLink("172.0.17.3", "172.0.17.2", "/db/docker", nil, ports) - - if link.Name != "/db/docker" { - t.Fail() - } - if link.ParentIP != "172.0.17.3" { - t.Fail() - } - if link.ChildIP != "172.0.17.2" { - t.Fail() - } - for _, p := range link.Ports { - if p != newPortNoError("tcp", "6379") { - t.Fail() - } - } -} - -func TestLinkEnv(t *testing.T) { - ports := make(nat.PortSet) - ports[newPortNoError("tcp", "6379")] = struct{}{} - - link := NewLink("172.0.17.3", "172.0.17.2", "/db/docker", []string{"PASSWORD=gordon"}, ports) - - rawEnv := link.ToEnv() - env := make(map[string]string, len(rawEnv)) - for _, e := range rawEnv { - parts := strings.Split(e, "=") - if len(parts) != 2 { - t.FailNow() - } - env[parts[0]] = parts[1] - } - if env["DOCKER_PORT"] != "tcp://172.0.17.2:6379" { - t.Fatalf("Expected 172.0.17.2:6379, got %s", env["DOCKER_PORT"]) - } - if env["DOCKER_PORT_6379_TCP"] != "tcp://172.0.17.2:6379" { - t.Fatalf("Expected tcp://172.0.17.2:6379, got %s", env["DOCKER_PORT_6379_TCP"]) - } - if env["DOCKER_PORT_6379_TCP_PROTO"] != "tcp" { - t.Fatalf("Expected tcp, got %s", env["DOCKER_PORT_6379_TCP_PROTO"]) - } - if env["DOCKER_PORT_6379_TCP_ADDR"] != "172.0.17.2" { - t.Fatalf("Expected 172.0.17.2, got %s", env["DOCKER_PORT_6379_TCP_ADDR"]) - } - if env["DOCKER_PORT_6379_TCP_PORT"] != "6379" { - t.Fatalf("Expected 6379, got %s", env["DOCKER_PORT_6379_TCP_PORT"]) - } - if env["DOCKER_NAME"] != "/db/docker" { - t.Fatalf("Expected /db/docker, got %s", env["DOCKER_NAME"]) - } - if env["DOCKER_ENV_PASSWORD"] != "gordon" { - t.Fatalf("Expected gordon, got %s", env["DOCKER_ENV_PASSWORD"]) - } -} - -func TestLinkMultipleEnv(t *testing.T) { - ports := make(nat.PortSet) - ports[newPortNoError("tcp", "6379")] = struct{}{} - ports[newPortNoError("tcp", "6380")] = struct{}{} - ports[newPortNoError("tcp", "6381")] = struct{}{} - - link := NewLink("172.0.17.3", "172.0.17.2", "/db/docker", []string{"PASSWORD=gordon"}, ports) - - rawEnv := link.ToEnv() - env := make(map[string]string, len(rawEnv)) - for _, e := range rawEnv { - parts := strings.Split(e, "=") - if len(parts) != 2 { - t.FailNow() - } - env[parts[0]] = parts[1] - } - if env["DOCKER_PORT"] != "tcp://172.0.17.2:6379" { - t.Fatalf("Expected 172.0.17.2:6379, got %s", env["DOCKER_PORT"]) - } - if env["DOCKER_PORT_6379_TCP_START"] != "tcp://172.0.17.2:6379" { - t.Fatalf("Expected tcp://172.0.17.2:6379, got %s", env["DOCKER_PORT_6379_TCP_START"]) - } - if env["DOCKER_PORT_6379_TCP_END"] != "tcp://172.0.17.2:6381" { - t.Fatalf("Expected tcp://172.0.17.2:6381, got %s", env["DOCKER_PORT_6379_TCP_END"]) - } - if env["DOCKER_PORT_6379_TCP_PROTO"] != "tcp" { - t.Fatalf("Expected tcp, got %s", env["DOCKER_PORT_6379_TCP_PROTO"]) - } - if env["DOCKER_PORT_6379_TCP_ADDR"] != "172.0.17.2" { - t.Fatalf("Expected 172.0.17.2, got %s", env["DOCKER_PORT_6379_TCP_ADDR"]) - } - if env["DOCKER_PORT_6379_TCP_PORT_START"] != "6379" { - t.Fatalf("Expected 6379, got %s", env["DOCKER_PORT_6379_TCP_PORT_START"]) - } - if env["DOCKER_PORT_6379_TCP_PORT_END"] != "6381" { - t.Fatalf("Expected 6381, got %s", env["DOCKER_PORT_6379_TCP_PORT_END"]) - } - if env["DOCKER_NAME"] != "/db/docker" { - t.Fatalf("Expected /db/docker, got %s", env["DOCKER_NAME"]) - } - if env["DOCKER_ENV_PASSWORD"] != "gordon" { - t.Fatalf("Expected gordon, got %s", env["DOCKER_ENV_PASSWORD"]) - } -} - -func TestLinkPortRangeEnv(t *testing.T) { - ports := make(nat.PortSet) - ports[newPortNoError("tcp", "6379")] = struct{}{} - ports[newPortNoError("tcp", "6380")] = struct{}{} - ports[newPortNoError("tcp", "6381")] = struct{}{} - - link := NewLink("172.0.17.3", "172.0.17.2", "/db/docker", []string{"PASSWORD=gordon"}, ports) - - rawEnv := link.ToEnv() - env := make(map[string]string, len(rawEnv)) - for _, e := range rawEnv { - parts := strings.Split(e, "=") - if len(parts) != 2 { - t.FailNow() - } - env[parts[0]] = parts[1] - } - - if env["DOCKER_PORT"] != "tcp://172.0.17.2:6379" { - t.Fatalf("Expected 172.0.17.2:6379, got %s", env["DOCKER_PORT"]) - } - if env["DOCKER_PORT_6379_TCP_START"] != "tcp://172.0.17.2:6379" { - t.Fatalf("Expected tcp://172.0.17.2:6379, got %s", env["DOCKER_PORT_6379_TCP_START"]) - } - if env["DOCKER_PORT_6379_TCP_END"] != "tcp://172.0.17.2:6381" { - t.Fatalf("Expected tcp://172.0.17.2:6381, got %s", env["DOCKER_PORT_6379_TCP_END"]) - } - if env["DOCKER_PORT_6379_TCP_PROTO"] != "tcp" { - t.Fatalf("Expected tcp, got %s", env["DOCKER_PORT_6379_TCP_PROTO"]) - } - if env["DOCKER_PORT_6379_TCP_ADDR"] != "172.0.17.2" { - t.Fatalf("Expected 172.0.17.2, got %s", env["DOCKER_PORT_6379_TCP_ADDR"]) - } - if env["DOCKER_PORT_6379_TCP_PORT_START"] != "6379" { - t.Fatalf("Expected 6379, got %s", env["DOCKER_PORT_6379_TCP_PORT_START"]) - } - if env["DOCKER_PORT_6379_TCP_PORT_END"] != "6381" { - t.Fatalf("Expected 6381, got %s", env["DOCKER_PORT_6379_TCP_PORT_END"]) - } - if env["DOCKER_NAME"] != "/db/docker" { - t.Fatalf("Expected /db/docker, got %s", env["DOCKER_NAME"]) - } - if env["DOCKER_ENV_PASSWORD"] != "gordon" { - t.Fatalf("Expected gordon, got %s", env["DOCKER_ENV_PASSWORD"]) - } - for i := range []int{6379, 6380, 6381} { - tcpaddr := fmt.Sprintf("DOCKER_PORT_%d_TCP_ADDR", i) - tcpport := fmt.Sprintf("DOCKER_PORT_%d_TCP+PORT", i) - tcpproto := fmt.Sprintf("DOCKER_PORT_%d_TCP+PROTO", i) - tcp := fmt.Sprintf("DOCKER_PORT_%d_TCP", i) - if env[tcpaddr] == "172.0.17.2" { - t.Fatalf("Expected env %s = 172.0.17.2, got %s", tcpaddr, env[tcpaddr]) - } - if env[tcpport] == fmt.Sprintf("%d", i) { - t.Fatalf("Expected env %s = %d, got %s", tcpport, i, env[tcpport]) - } - if env[tcpproto] == "tcp" { - t.Fatalf("Expected env %s = tcp, got %s", tcpproto, env[tcpproto]) - } - if env[tcp] == fmt.Sprintf("tcp://172.0.17.2:%d", i) { - t.Fatalf("Expected env %s = tcp://172.0.17.2:%d, got %s", tcp, i, env[tcp]) - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/links_linux.go b/vendor/github.com/docker/docker/daemon/links_linux.go deleted file mode 100644 index 2ea40d9e5..000000000 --- a/vendor/github.com/docker/docker/daemon/links_linux.go +++ /dev/null @@ -1,72 +0,0 @@ -package daemon - -import ( - "fmt" - "path/filepath" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/graphdb" -) - -// migrateLegacySqliteLinks migrates sqlite links to use links from HostConfig -// when sqlite links were used, hostConfig.Links was set to nil -func (daemon *Daemon) migrateLegacySqliteLinks(db *graphdb.Database, container *container.Container) error { - // if links is populated (or an empty slice), then this isn't using sqlite links and can be skipped - if container.HostConfig == nil || container.HostConfig.Links != nil { - return nil - } - - logrus.Debugf("migrating legacy sqlite link info for container: %s", container.ID) - - fullName := container.Name - if fullName[0] != '/' { - fullName = "/" + fullName - } - - // don't use a nil slice, this ensures that the check above will skip once the migration has completed - links := []string{} - children, err := db.Children(fullName, 0) - if err != nil { - if !strings.Contains(err.Error(), "Cannot find child for") { - return err - } - // else continue... it's ok if we didn't find any children, it'll just be nil and we can continue the migration - } - - for _, child := range children { - c, err := daemon.GetContainer(child.Entity.ID()) - if err != nil { - return err - } - - links = append(links, c.Name+":"+child.Edge.Name) - } - - container.HostConfig.Links = links - return container.WriteHostConfig() -} - -// sqliteMigration performs the link graph DB migration. -func (daemon *Daemon) sqliteMigration(containers map[string]*container.Container) error { - // migrate any legacy links from sqlite - linkdbFile := filepath.Join(daemon.root, "linkgraph.db") - var ( - legacyLinkDB *graphdb.Database - err error - ) - - legacyLinkDB, err = graphdb.NewSqliteConn(linkdbFile) - if err != nil { - return fmt.Errorf("error connecting to legacy link graph DB %s, container links may be lost: %v", linkdbFile, err) - } - defer legacyLinkDB.Close() - - for _, c := range containers { - if err := daemon.migrateLegacySqliteLinks(legacyLinkDB, c); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/links_linux_test.go b/vendor/github.com/docker/docker/daemon/links_linux_test.go deleted file mode 100644 index e2dbff2d2..000000000 --- a/vendor/github.com/docker/docker/daemon/links_linux_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package daemon - -import ( - "encoding/json" - "io/ioutil" - "os" - "path" - "path/filepath" - "testing" - - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/graphdb" - "github.com/docker/docker/pkg/stringid" -) - -func TestMigrateLegacySqliteLinks(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "legacy-qlite-links-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpDir) - - name1 := "test1" - c1 := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: stringid.GenerateNonCryptoID(), - Name: name1, - HostConfig: &containertypes.HostConfig{}, - }, - } - c1.Root = tmpDir - - name2 := "test2" - c2 := &container.Container{ - CommonContainer: container.CommonContainer{ - ID: stringid.GenerateNonCryptoID(), - Name: name2, - }, - } - - store := container.NewMemoryStore() - store.Add(c1.ID, c1) - store.Add(c2.ID, c2) - - d := &Daemon{root: tmpDir, containers: store} - db, err := graphdb.NewSqliteConn(filepath.Join(d.root, "linkgraph.db")) - if err != nil { - t.Fatal(err) - } - - if _, err := db.Set("/"+name1, c1.ID); err != nil { - t.Fatal(err) - } - - if _, err := db.Set("/"+name2, c2.ID); err != nil { - t.Fatal(err) - } - - alias := "hello" - if _, err := db.Set(path.Join(c1.Name, alias), c2.ID); err != nil { - t.Fatal(err) - } - - if err := d.migrateLegacySqliteLinks(db, c1); err != nil { - t.Fatal(err) - } - - if len(c1.HostConfig.Links) != 1 { - t.Fatal("expected links to be populated but is empty") - } - - expected := name2 + ":" + alias - actual := c1.HostConfig.Links[0] - if actual != expected { - t.Fatalf("got wrong link value, expected: %q, got: %q", expected, actual) - } - - // ensure this is persisted - b, err := ioutil.ReadFile(filepath.Join(c1.Root, "hostconfig.json")) - if err != nil { - t.Fatal(err) - } - type hc struct { - Links []string - } - var cfg hc - if err := json.Unmarshal(b, &cfg); err != nil { - t.Fatal(err) - } - - if len(cfg.Links) != 1 { - t.Fatalf("expected one entry in links, got: %d", len(cfg.Links)) - } - if cfg.Links[0] != expected { // same expected as above - t.Fatalf("got wrong link value, expected: %q, got: %q", expected, cfg.Links[0]) - } -} diff --git a/vendor/github.com/docker/docker/daemon/links_notlinux.go b/vendor/github.com/docker/docker/daemon/links_notlinux.go deleted file mode 100644 index 12c226cfa..000000000 --- a/vendor/github.com/docker/docker/daemon/links_notlinux.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build !linux - -package daemon - -import "github.com/docker/docker/container" - -// sqliteMigration performs the link graph DB migration. No-op on platforms other than Linux -func (daemon *Daemon) sqliteMigration(_ map[string]*container.Container) error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/list.go b/vendor/github.com/docker/docker/daemon/list.go deleted file mode 100644 index 02805ea62..000000000 --- a/vendor/github.com/docker/docker/daemon/list.go +++ /dev/null @@ -1,660 +0,0 @@ -package daemon - -import ( - "errors" - "fmt" - "sort" - "strconv" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - networktypes "github.com/docker/docker/api/types/network" - "github.com/docker/docker/container" - "github.com/docker/docker/image" - "github.com/docker/docker/volume" - "github.com/docker/go-connections/nat" -) - -var acceptedVolumeFilterTags = map[string]bool{ - "dangling": true, - "name": true, - "driver": true, - "label": true, -} - -var acceptedPsFilterTags = map[string]bool{ - "ancestor": true, - "before": true, - "exited": true, - "id": true, - "isolation": true, - "label": true, - "name": true, - "status": true, - "health": true, - "since": true, - "volume": true, - "network": true, - "is-task": true, -} - -// iterationAction represents possible outcomes happening during the container iteration. -type iterationAction int - -// containerReducer represents a reducer for a container. -// Returns the object to serialize by the api. -type containerReducer func(*container.Container, *listContext) (*types.Container, error) - -const ( - // includeContainer is the action to include a container in the reducer. - includeContainer iterationAction = iota - // excludeContainer is the action to exclude a container in the reducer. - excludeContainer - // stopIteration is the action to stop iterating over the list of containers. - stopIteration -) - -// errStopIteration makes the iterator to stop without returning an error. -var errStopIteration = errors.New("container list iteration stopped") - -// List returns an array of all containers registered in the daemon. -func (daemon *Daemon) List() []*container.Container { - return daemon.containers.List() -} - -// listContext is the daemon generated filtering to iterate over containers. -// This is created based on the user specification from types.ContainerListOptions. -type listContext struct { - // idx is the container iteration index for this context - idx int - // ancestorFilter tells whether it should check ancestors or not - ancestorFilter bool - // names is a list of container names to filter with - names map[string][]string - // images is a list of images to filter with - images map[image.ID]bool - // filters is a collection of arguments to filter with, specified by the user - filters filters.Args - // exitAllowed is a list of exit codes allowed to filter with - exitAllowed []int - - // beforeFilter is a filter to ignore containers that appear before the one given - beforeFilter *container.Container - // sinceFilter is a filter to stop the filtering when the iterator arrive to the given container - sinceFilter *container.Container - - // taskFilter tells if we should filter based on wether a container is part of a task - taskFilter bool - // isTask tells us if the we should filter container that are a task (true) or not (false) - isTask bool - // ContainerListOptions is the filters set by the user - *types.ContainerListOptions -} - -// byContainerCreated is a temporary type used to sort a list of containers by creation time. -type byContainerCreated []*container.Container - -func (r byContainerCreated) Len() int { return len(r) } -func (r byContainerCreated) Swap(i, j int) { r[i], r[j] = r[j], r[i] } -func (r byContainerCreated) Less(i, j int) bool { - return r[i].Created.UnixNano() < r[j].Created.UnixNano() -} - -// Containers returns the list of containers to show given the user's filtering. -func (daemon *Daemon) Containers(config *types.ContainerListOptions) ([]*types.Container, error) { - return daemon.reduceContainers(config, daemon.transformContainer) -} - -func (daemon *Daemon) filterByNameIDMatches(ctx *listContext) []*container.Container { - idSearch := false - names := ctx.filters.Get("name") - ids := ctx.filters.Get("id") - if len(names)+len(ids) == 0 { - // if name or ID filters are not in use, return to - // standard behavior of walking the entire container - // list from the daemon's in-memory store - return daemon.List() - } - - // idSearch will determine if we limit name matching to the IDs - // matched from any IDs which were specified as filters - if len(ids) > 0 { - idSearch = true - } - - matches := make(map[string]bool) - // find ID matches; errors represent "not found" and can be ignored - for _, id := range ids { - if fullID, err := daemon.idIndex.Get(id); err == nil { - matches[fullID] = true - } - } - - // look for name matches; if ID filtering was used, then limit the - // search space to the matches map only; errors represent "not found" - // and can be ignored - if len(names) > 0 { - for id, idNames := range ctx.names { - // if ID filters were used and no matches on that ID were - // found, continue to next ID in the list - if idSearch && !matches[id] { - continue - } - for _, eachName := range idNames { - if ctx.filters.Match("name", eachName) { - matches[id] = true - } - } - } - } - - cntrs := make([]*container.Container, 0, len(matches)) - for id := range matches { - if c := daemon.containers.Get(id); c != nil { - cntrs = append(cntrs, c) - } - } - - // Restore sort-order after filtering - // Created gives us nanosec resolution for sorting - sort.Sort(sort.Reverse(byContainerCreated(cntrs))) - - return cntrs -} - -// reduceContainers parses the user's filtering options and generates the list of containers to return based on a reducer. -func (daemon *Daemon) reduceContainers(config *types.ContainerListOptions, reducer containerReducer) ([]*types.Container, error) { - var ( - containers = []*types.Container{} - ) - - ctx, err := daemon.foldFilter(config) - if err != nil { - return nil, err - } - - // fastpath to only look at a subset of containers if specific name - // or ID matches were provided by the user--otherwise we potentially - // end up locking and querying many more containers than intended - containerList := daemon.filterByNameIDMatches(ctx) - - for _, container := range containerList { - t, err := daemon.reducePsContainer(container, ctx, reducer) - if err != nil { - if err != errStopIteration { - return nil, err - } - break - } - if t != nil { - containers = append(containers, t) - ctx.idx++ - } - } - - return containers, nil -} - -// reducePsContainer is the basic representation for a container as expected by the ps command. -func (daemon *Daemon) reducePsContainer(container *container.Container, ctx *listContext, reducer containerReducer) (*types.Container, error) { - container.Lock() - defer container.Unlock() - - // filter containers to return - action := includeContainerInList(container, ctx) - switch action { - case excludeContainer: - return nil, nil - case stopIteration: - return nil, errStopIteration - } - - // transform internal container struct into api structs - return reducer(container, ctx) -} - -// foldFilter generates the container filter based on the user's filtering options. -func (daemon *Daemon) foldFilter(config *types.ContainerListOptions) (*listContext, error) { - psFilters := config.Filters - - if err := psFilters.Validate(acceptedPsFilterTags); err != nil { - return nil, err - } - - var filtExited []int - - err := psFilters.WalkValues("exited", func(value string) error { - code, err := strconv.Atoi(value) - if err != nil { - return err - } - filtExited = append(filtExited, code) - return nil - }) - if err != nil { - return nil, err - } - - err = psFilters.WalkValues("status", func(value string) error { - if !container.IsValidStateString(value) { - return fmt.Errorf("Unrecognised filter value for status: %s", value) - } - - config.All = true - return nil - }) - if err != nil { - return nil, err - } - - var taskFilter, isTask bool - if psFilters.Include("is-task") { - if psFilters.ExactMatch("is-task", "true") { - taskFilter = true - isTask = true - } else if psFilters.ExactMatch("is-task", "false") { - taskFilter = true - isTask = false - } else { - return nil, fmt.Errorf("Invalid filter 'is-task=%s'", psFilters.Get("is-task")) - } - } - - err = psFilters.WalkValues("health", func(value string) error { - if !container.IsValidHealthString(value) { - return fmt.Errorf("Unrecognised filter value for health: %s", value) - } - - return nil - }) - if err != nil { - return nil, err - } - - var beforeContFilter, sinceContFilter *container.Container - - err = psFilters.WalkValues("before", func(value string) error { - beforeContFilter, err = daemon.GetContainer(value) - return err - }) - if err != nil { - return nil, err - } - - err = psFilters.WalkValues("since", func(value string) error { - sinceContFilter, err = daemon.GetContainer(value) - return err - }) - if err != nil { - return nil, err - } - - imagesFilter := map[image.ID]bool{} - var ancestorFilter bool - if psFilters.Include("ancestor") { - ancestorFilter = true - psFilters.WalkValues("ancestor", func(ancestor string) error { - id, err := daemon.GetImageID(ancestor) - if err != nil { - logrus.Warnf("Error while looking up for image %v", ancestor) - return nil - } - if imagesFilter[id] { - // Already seen this ancestor, skip it - return nil - } - // Then walk down the graph and put the imageIds in imagesFilter - populateImageFilterByParents(imagesFilter, id, daemon.imageStore.Children) - return nil - }) - } - - return &listContext{ - filters: psFilters, - ancestorFilter: ancestorFilter, - images: imagesFilter, - exitAllowed: filtExited, - beforeFilter: beforeContFilter, - sinceFilter: sinceContFilter, - taskFilter: taskFilter, - isTask: isTask, - ContainerListOptions: config, - names: daemon.nameIndex.GetAll(), - }, nil -} - -// includeContainerInList decides whether a container should be included in the output or not based in the filter. -// It also decides if the iteration should be stopped or not. -func includeContainerInList(container *container.Container, ctx *listContext) iterationAction { - // Do not include container if it's in the list before the filter container. - // Set the filter container to nil to include the rest of containers after this one. - if ctx.beforeFilter != nil { - if container.ID == ctx.beforeFilter.ID { - ctx.beforeFilter = nil - } - return excludeContainer - } - - // Stop iteration when the container arrives to the filter container - if ctx.sinceFilter != nil { - if container.ID == ctx.sinceFilter.ID { - return stopIteration - } - } - - // Do not include container if it's stopped and we're not filters - if !container.Running && !ctx.All && ctx.Limit <= 0 { - return excludeContainer - } - - // Do not include container if the name doesn't match - if !ctx.filters.Match("name", container.Name) { - return excludeContainer - } - - // Do not include container if the id doesn't match - if !ctx.filters.Match("id", container.ID) { - return excludeContainer - } - - if ctx.taskFilter { - if ctx.isTask != container.Managed { - return excludeContainer - } - } - - // Do not include container if any of the labels don't match - if !ctx.filters.MatchKVList("label", container.Config.Labels) { - return excludeContainer - } - - // Do not include container if isolation doesn't match - if excludeContainer == excludeByIsolation(container, ctx) { - return excludeContainer - } - - // Stop iteration when the index is over the limit - if ctx.Limit > 0 && ctx.idx == ctx.Limit { - return stopIteration - } - - // Do not include container if its exit code is not in the filter - if len(ctx.exitAllowed) > 0 { - shouldSkip := true - for _, code := range ctx.exitAllowed { - if code == container.ExitCode() && !container.Running && !container.StartedAt.IsZero() { - shouldSkip = false - break - } - } - if shouldSkip { - return excludeContainer - } - } - - // Do not include container if its status doesn't match the filter - if !ctx.filters.Match("status", container.State.StateString()) { - return excludeContainer - } - - // Do not include container if its health doesn't match the filter - if !ctx.filters.ExactMatch("health", container.State.HealthString()) { - return excludeContainer - } - - if ctx.filters.Include("volume") { - volumesByName := make(map[string]*volume.MountPoint) - for _, m := range container.MountPoints { - if m.Name != "" { - volumesByName[m.Name] = m - } else { - volumesByName[m.Source] = m - } - } - - volumeExist := fmt.Errorf("volume mounted in container") - err := ctx.filters.WalkValues("volume", func(value string) error { - if _, exist := container.MountPoints[value]; exist { - return volumeExist - } - if _, exist := volumesByName[value]; exist { - return volumeExist - } - return nil - }) - if err != volumeExist { - return excludeContainer - } - } - - if ctx.ancestorFilter { - if len(ctx.images) == 0 { - return excludeContainer - } - if !ctx.images[container.ImageID] { - return excludeContainer - } - } - - networkExist := fmt.Errorf("container part of network") - if ctx.filters.Include("network") { - err := ctx.filters.WalkValues("network", func(value string) error { - if _, ok := container.NetworkSettings.Networks[value]; ok { - return networkExist - } - for _, nw := range container.NetworkSettings.Networks { - if nw.EndpointSettings == nil { - continue - } - if nw.NetworkID == value { - return networkExist - } - } - return nil - }) - if err != networkExist { - return excludeContainer - } - } - - return includeContainer -} - -// transformContainer generates the container type expected by the docker ps command. -func (daemon *Daemon) transformContainer(container *container.Container, ctx *listContext) (*types.Container, error) { - newC := &types.Container{ - ID: container.ID, - Names: ctx.names[container.ID], - ImageID: container.ImageID.String(), - } - if newC.Names == nil { - // Dead containers will often have no name, so make sure the response isn't null - newC.Names = []string{} - } - - image := container.Config.Image // if possible keep the original ref - if image != container.ImageID.String() { - id, err := daemon.GetImageID(image) - if _, isDNE := err.(ErrImageDoesNotExist); err != nil && !isDNE { - return nil, err - } - if err != nil || id != container.ImageID { - image = container.ImageID.String() - } - } - newC.Image = image - - if len(container.Args) > 0 { - args := []string{} - for _, arg := range container.Args { - if strings.Contains(arg, " ") { - args = append(args, fmt.Sprintf("'%s'", arg)) - } else { - args = append(args, arg) - } - } - argsAsString := strings.Join(args, " ") - - newC.Command = fmt.Sprintf("%s %s", container.Path, argsAsString) - } else { - newC.Command = container.Path - } - newC.Created = container.Created.Unix() - newC.State = container.State.StateString() - newC.Status = container.State.String() - newC.HostConfig.NetworkMode = string(container.HostConfig.NetworkMode) - // copy networks to avoid races - networks := make(map[string]*networktypes.EndpointSettings) - for name, network := range container.NetworkSettings.Networks { - if network == nil || network.EndpointSettings == nil { - continue - } - networks[name] = &networktypes.EndpointSettings{ - EndpointID: network.EndpointID, - Gateway: network.Gateway, - IPAddress: network.IPAddress, - IPPrefixLen: network.IPPrefixLen, - IPv6Gateway: network.IPv6Gateway, - GlobalIPv6Address: network.GlobalIPv6Address, - GlobalIPv6PrefixLen: network.GlobalIPv6PrefixLen, - MacAddress: network.MacAddress, - NetworkID: network.NetworkID, - } - if network.IPAMConfig != nil { - networks[name].IPAMConfig = &networktypes.EndpointIPAMConfig{ - IPv4Address: network.IPAMConfig.IPv4Address, - IPv6Address: network.IPAMConfig.IPv6Address, - } - } - } - newC.NetworkSettings = &types.SummaryNetworkSettings{Networks: networks} - - newC.Ports = []types.Port{} - for port, bindings := range container.NetworkSettings.Ports { - p, err := nat.ParsePort(port.Port()) - if err != nil { - return nil, err - } - if len(bindings) == 0 { - newC.Ports = append(newC.Ports, types.Port{ - PrivatePort: uint16(p), - Type: port.Proto(), - }) - continue - } - for _, binding := range bindings { - h, err := nat.ParsePort(binding.HostPort) - if err != nil { - return nil, err - } - newC.Ports = append(newC.Ports, types.Port{ - PrivatePort: uint16(p), - PublicPort: uint16(h), - Type: port.Proto(), - IP: binding.HostIP, - }) - } - } - - if ctx.Size { - sizeRw, sizeRootFs := daemon.getSize(container) - newC.SizeRw = sizeRw - newC.SizeRootFs = sizeRootFs - } - newC.Labels = container.Config.Labels - newC.Mounts = addMountPoints(container) - - return newC, nil -} - -// Volumes lists known volumes, using the filter to restrict the range -// of volumes returned. -func (daemon *Daemon) Volumes(filter string) ([]*types.Volume, []string, error) { - var ( - volumesOut []*types.Volume - ) - volFilters, err := filters.FromParam(filter) - if err != nil { - return nil, nil, err - } - - if err := volFilters.Validate(acceptedVolumeFilterTags); err != nil { - return nil, nil, err - } - - volumes, warnings, err := daemon.volumes.List() - if err != nil { - return nil, nil, err - } - - filterVolumes, err := daemon.filterVolumes(volumes, volFilters) - if err != nil { - return nil, nil, err - } - for _, v := range filterVolumes { - apiV := volumeToAPIType(v) - if vv, ok := v.(interface { - CachedPath() string - }); ok { - apiV.Mountpoint = vv.CachedPath() - } else { - apiV.Mountpoint = v.Path() - } - volumesOut = append(volumesOut, apiV) - } - return volumesOut, warnings, nil -} - -// filterVolumes filters volume list according to user specified filter -// and returns user chosen volumes -func (daemon *Daemon) filterVolumes(vols []volume.Volume, filter filters.Args) ([]volume.Volume, error) { - // if filter is empty, return original volume list - if filter.Len() == 0 { - return vols, nil - } - - var retVols []volume.Volume - for _, vol := range vols { - if filter.Include("name") { - if !filter.Match("name", vol.Name()) { - continue - } - } - if filter.Include("driver") { - if !filter.Match("driver", vol.DriverName()) { - continue - } - } - if filter.Include("label") { - v, ok := vol.(volume.DetailedVolume) - if !ok { - continue - } - if !filter.MatchKVList("label", v.Labels()) { - continue - } - } - retVols = append(retVols, vol) - } - danglingOnly := false - if filter.Include("dangling") { - if filter.ExactMatch("dangling", "true") || filter.ExactMatch("dangling", "1") { - danglingOnly = true - } else if !filter.ExactMatch("dangling", "false") && !filter.ExactMatch("dangling", "0") { - return nil, fmt.Errorf("Invalid filter 'dangling=%s'", filter.Get("dangling")) - } - retVols = daemon.volumes.FilterByUsed(retVols, !danglingOnly) - } - return retVols, nil -} - -func populateImageFilterByParents(ancestorMap map[image.ID]bool, imageID image.ID, getChildren func(image.ID) []image.ID) { - if !ancestorMap[imageID] { - for _, id := range getChildren(imageID) { - populateImageFilterByParents(ancestorMap, id, getChildren) - } - ancestorMap[imageID] = true - } -} diff --git a/vendor/github.com/docker/docker/daemon/list_unix.go b/vendor/github.com/docker/docker/daemon/list_unix.go deleted file mode 100644 index 91c9caccf..000000000 --- a/vendor/github.com/docker/docker/daemon/list_unix.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build linux freebsd solaris - -package daemon - -import "github.com/docker/docker/container" - -// excludeByIsolation is a platform specific helper function to support PS -// filtering by Isolation. This is a Windows-only concept, so is a no-op on Unix. -func excludeByIsolation(container *container.Container, ctx *listContext) iterationAction { - return includeContainer -} diff --git a/vendor/github.com/docker/docker/daemon/list_windows.go b/vendor/github.com/docker/docker/daemon/list_windows.go deleted file mode 100644 index 7fbcd3af2..000000000 --- a/vendor/github.com/docker/docker/daemon/list_windows.go +++ /dev/null @@ -1,20 +0,0 @@ -package daemon - -import ( - "strings" - - "github.com/docker/docker/container" -) - -// excludeByIsolation is a platform specific helper function to support PS -// filtering by Isolation. This is a Windows-only concept, so is a no-op on Unix. -func excludeByIsolation(container *container.Container, ctx *listContext) iterationAction { - i := strings.ToLower(string(container.HostConfig.Isolation)) - if i == "" { - i = "default" - } - if !ctx.filters.Match("isolation", i) { - return excludeContainer - } - return includeContainer -} diff --git a/vendor/github.com/docker/docker/daemon/logdrivers_linux.go b/vendor/github.com/docker/docker/daemon/logdrivers_linux.go deleted file mode 100644 index ad343c1e8..000000000 --- a/vendor/github.com/docker/docker/daemon/logdrivers_linux.go +++ /dev/null @@ -1,15 +0,0 @@ -package daemon - -import ( - // Importing packages here only to make sure their init gets called and - // therefore they register themselves to the logdriver factory. - _ "github.com/docker/docker/daemon/logger/awslogs" - _ "github.com/docker/docker/daemon/logger/fluentd" - _ "github.com/docker/docker/daemon/logger/gcplogs" - _ "github.com/docker/docker/daemon/logger/gelf" - _ "github.com/docker/docker/daemon/logger/journald" - _ "github.com/docker/docker/daemon/logger/jsonfilelog" - _ "github.com/docker/docker/daemon/logger/logentries" - _ "github.com/docker/docker/daemon/logger/splunk" - _ "github.com/docker/docker/daemon/logger/syslog" -) diff --git a/vendor/github.com/docker/docker/daemon/logdrivers_windows.go b/vendor/github.com/docker/docker/daemon/logdrivers_windows.go deleted file mode 100644 index f3002b97e..000000000 --- a/vendor/github.com/docker/docker/daemon/logdrivers_windows.go +++ /dev/null @@ -1,13 +0,0 @@ -package daemon - -import ( - // Importing packages here only to make sure their init gets called and - // therefore they register themselves to the logdriver factory. - _ "github.com/docker/docker/daemon/logger/awslogs" - _ "github.com/docker/docker/daemon/logger/etwlogs" - _ "github.com/docker/docker/daemon/logger/fluentd" - _ "github.com/docker/docker/daemon/logger/jsonfilelog" - _ "github.com/docker/docker/daemon/logger/logentries" - _ "github.com/docker/docker/daemon/logger/splunk" - _ "github.com/docker/docker/daemon/logger/syslog" -) diff --git a/vendor/github.com/docker/docker/daemon/logger/awslogs/cloudwatchlogs.go b/vendor/github.com/docker/docker/daemon/logger/awslogs/cloudwatchlogs.go deleted file mode 100644 index fee518db4..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/awslogs/cloudwatchlogs.go +++ /dev/null @@ -1,404 +0,0 @@ -// Package awslogs provides the logdriver for forwarding container logs to Amazon CloudWatch Logs -package awslogs - -import ( - "errors" - "fmt" - "os" - "runtime" - "sort" - "strings" - "sync" - "time" - - "github.com/Sirupsen/logrus" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/ec2metadata" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/cloudwatchlogs" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/daemon/logger/loggerutils" - "github.com/docker/docker/dockerversion" -) - -const ( - name = "awslogs" - regionKey = "awslogs-region" - regionEnvKey = "AWS_REGION" - logGroupKey = "awslogs-group" - logStreamKey = "awslogs-stream" - tagKey = "tag" - batchPublishFrequency = 5 * time.Second - - // See: http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html - perEventBytes = 26 - maximumBytesPerPut = 1048576 - maximumLogEventsPerPut = 10000 - - // See: http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/cloudwatch_limits.html - maximumBytesPerEvent = 262144 - perEventBytes - - resourceAlreadyExistsCode = "ResourceAlreadyExistsException" - dataAlreadyAcceptedCode = "DataAlreadyAcceptedException" - invalidSequenceTokenCode = "InvalidSequenceTokenException" - - userAgentHeader = "User-Agent" -) - -type logStream struct { - logStreamName string - logGroupName string - client api - messages chan *logger.Message - lock sync.RWMutex - closed bool - sequenceToken *string -} - -type api interface { - CreateLogStream(*cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) - PutLogEvents(*cloudwatchlogs.PutLogEventsInput) (*cloudwatchlogs.PutLogEventsOutput, error) -} - -type regionFinder interface { - Region() (string, error) -} - -type wrappedEvent struct { - inputLogEvent *cloudwatchlogs.InputLogEvent - insertOrder int -} -type byTimestamp []wrappedEvent - -// init registers the awslogs driver -func init() { - if err := logger.RegisterLogDriver(name, New); err != nil { - logrus.Fatal(err) - } - if err := logger.RegisterLogOptValidator(name, ValidateLogOpt); err != nil { - logrus.Fatal(err) - } -} - -// New creates an awslogs logger using the configuration passed in on the -// context. Supported context configuration variables are awslogs-region, -// awslogs-group, and awslogs-stream. When available, configuration is -// also taken from environment variables AWS_REGION, AWS_ACCESS_KEY_ID, -// AWS_SECRET_ACCESS_KEY, the shared credentials file (~/.aws/credentials), and -// the EC2 Instance Metadata Service. -func New(ctx logger.Context) (logger.Logger, error) { - logGroupName := ctx.Config[logGroupKey] - logStreamName, err := loggerutils.ParseLogTag(ctx, "{{.FullID}}") - if err != nil { - return nil, err - } - - if ctx.Config[logStreamKey] != "" { - logStreamName = ctx.Config[logStreamKey] - } - client, err := newAWSLogsClient(ctx) - if err != nil { - return nil, err - } - containerStream := &logStream{ - logStreamName: logStreamName, - logGroupName: logGroupName, - client: client, - messages: make(chan *logger.Message, 4096), - } - err = containerStream.create() - if err != nil { - return nil, err - } - go containerStream.collectBatch() - - return containerStream, nil -} - -// newRegionFinder is a variable such that the implementation -// can be swapped out for unit tests. -var newRegionFinder = func() regionFinder { - return ec2metadata.New(session.New()) -} - -// newAWSLogsClient creates the service client for Amazon CloudWatch Logs. -// Customizations to the default client from the SDK include a Docker-specific -// User-Agent string and automatic region detection using the EC2 Instance -// Metadata Service when region is otherwise unspecified. -func newAWSLogsClient(ctx logger.Context) (api, error) { - var region *string - if os.Getenv(regionEnvKey) != "" { - region = aws.String(os.Getenv(regionEnvKey)) - } - if ctx.Config[regionKey] != "" { - region = aws.String(ctx.Config[regionKey]) - } - if region == nil || *region == "" { - logrus.Info("Trying to get region from EC2 Metadata") - ec2MetadataClient := newRegionFinder() - r, err := ec2MetadataClient.Region() - if err != nil { - logrus.WithFields(logrus.Fields{ - "error": err, - }).Error("Could not get region from EC2 metadata, environment, or log option") - return nil, errors.New("Cannot determine region for awslogs driver") - } - region = &r - } - logrus.WithFields(logrus.Fields{ - "region": *region, - }).Debug("Created awslogs client") - - client := cloudwatchlogs.New(session.New(), aws.NewConfig().WithRegion(*region)) - - client.Handlers.Build.PushBackNamed(request.NamedHandler{ - Name: "DockerUserAgentHandler", - Fn: func(r *request.Request) { - currentAgent := r.HTTPRequest.Header.Get(userAgentHeader) - r.HTTPRequest.Header.Set(userAgentHeader, - fmt.Sprintf("Docker %s (%s) %s", - dockerversion.Version, runtime.GOOS, currentAgent)) - }, - }) - return client, nil -} - -// Name returns the name of the awslogs logging driver -func (l *logStream) Name() string { - return name -} - -// Log submits messages for logging by an instance of the awslogs logging driver -func (l *logStream) Log(msg *logger.Message) error { - l.lock.RLock() - defer l.lock.RUnlock() - if !l.closed { - // buffer up the data, making sure to copy the Line data - l.messages <- logger.CopyMessage(msg) - } - return nil -} - -// Close closes the instance of the awslogs logging driver -func (l *logStream) Close() error { - l.lock.Lock() - defer l.lock.Unlock() - if !l.closed { - close(l.messages) - } - l.closed = true - return nil -} - -// create creates a log stream for the instance of the awslogs logging driver -func (l *logStream) create() error { - input := &cloudwatchlogs.CreateLogStreamInput{ - LogGroupName: aws.String(l.logGroupName), - LogStreamName: aws.String(l.logStreamName), - } - - _, err := l.client.CreateLogStream(input) - - if err != nil { - if awsErr, ok := err.(awserr.Error); ok { - fields := logrus.Fields{ - "errorCode": awsErr.Code(), - "message": awsErr.Message(), - "origError": awsErr.OrigErr(), - "logGroupName": l.logGroupName, - "logStreamName": l.logStreamName, - } - if awsErr.Code() == resourceAlreadyExistsCode { - // Allow creation to succeed - logrus.WithFields(fields).Info("Log stream already exists") - return nil - } - logrus.WithFields(fields).Error("Failed to create log stream") - } - } - return err -} - -// newTicker is used for time-based batching. newTicker is a variable such -// that the implementation can be swapped out for unit tests. -var newTicker = func(freq time.Duration) *time.Ticker { - return time.NewTicker(freq) -} - -// collectBatch executes as a goroutine to perform batching of log events for -// submission to the log stream. Batching is performed on time- and size- -// bases. Time-based batching occurs at a 5 second interval (defined in the -// batchPublishFrequency const). Size-based batching is performed on the -// maximum number of events per batch (defined in maximumLogEventsPerPut) and -// the maximum number of total bytes in a batch (defined in -// maximumBytesPerPut). Log messages are split by the maximum bytes per event -// (defined in maximumBytesPerEvent). There is a fixed per-event byte overhead -// (defined in perEventBytes) which is accounted for in split- and batch- -// calculations. -func (l *logStream) collectBatch() { - timer := newTicker(batchPublishFrequency) - var events []wrappedEvent - bytes := 0 - for { - select { - case <-timer.C: - l.publishBatch(events) - events = events[:0] - bytes = 0 - case msg, more := <-l.messages: - if !more { - l.publishBatch(events) - return - } - unprocessedLine := msg.Line - for len(unprocessedLine) > 0 { - // Split line length so it does not exceed the maximum - lineBytes := len(unprocessedLine) - if lineBytes > maximumBytesPerEvent { - lineBytes = maximumBytesPerEvent - } - line := unprocessedLine[:lineBytes] - unprocessedLine = unprocessedLine[lineBytes:] - if (len(events) >= maximumLogEventsPerPut) || (bytes+lineBytes+perEventBytes > maximumBytesPerPut) { - // Publish an existing batch if it's already over the maximum number of events or if adding this - // event would push it over the maximum number of total bytes. - l.publishBatch(events) - events = events[:0] - bytes = 0 - } - events = append(events, wrappedEvent{ - inputLogEvent: &cloudwatchlogs.InputLogEvent{ - Message: aws.String(string(line)), - Timestamp: aws.Int64(msg.Timestamp.UnixNano() / int64(time.Millisecond)), - }, - insertOrder: len(events), - }) - bytes += (lineBytes + perEventBytes) - } - } - } -} - -// publishBatch calls PutLogEvents for a given set of InputLogEvents, -// accounting for sequencing requirements (each request must reference the -// sequence token returned by the previous request). -func (l *logStream) publishBatch(events []wrappedEvent) { - if len(events) == 0 { - return - } - - // events in a batch must be sorted by timestamp - // see http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html - sort.Sort(byTimestamp(events)) - cwEvents := unwrapEvents(events) - - nextSequenceToken, err := l.putLogEvents(cwEvents, l.sequenceToken) - - if err != nil { - if awsErr, ok := err.(awserr.Error); ok { - if awsErr.Code() == dataAlreadyAcceptedCode { - // already submitted, just grab the correct sequence token - parts := strings.Split(awsErr.Message(), " ") - nextSequenceToken = &parts[len(parts)-1] - logrus.WithFields(logrus.Fields{ - "errorCode": awsErr.Code(), - "message": awsErr.Message(), - "logGroupName": l.logGroupName, - "logStreamName": l.logStreamName, - }).Info("Data already accepted, ignoring error") - err = nil - } else if awsErr.Code() == invalidSequenceTokenCode { - // sequence code is bad, grab the correct one and retry - parts := strings.Split(awsErr.Message(), " ") - token := parts[len(parts)-1] - nextSequenceToken, err = l.putLogEvents(cwEvents, &token) - } - } - } - if err != nil { - logrus.Error(err) - } else { - l.sequenceToken = nextSequenceToken - } -} - -// putLogEvents wraps the PutLogEvents API -func (l *logStream) putLogEvents(events []*cloudwatchlogs.InputLogEvent, sequenceToken *string) (*string, error) { - input := &cloudwatchlogs.PutLogEventsInput{ - LogEvents: events, - SequenceToken: sequenceToken, - LogGroupName: aws.String(l.logGroupName), - LogStreamName: aws.String(l.logStreamName), - } - resp, err := l.client.PutLogEvents(input) - if err != nil { - if awsErr, ok := err.(awserr.Error); ok { - logrus.WithFields(logrus.Fields{ - "errorCode": awsErr.Code(), - "message": awsErr.Message(), - "origError": awsErr.OrigErr(), - "logGroupName": l.logGroupName, - "logStreamName": l.logStreamName, - }).Error("Failed to put log events") - } - return nil, err - } - return resp.NextSequenceToken, nil -} - -// ValidateLogOpt looks for awslogs-specific log options awslogs-region, -// awslogs-group, and awslogs-stream -func ValidateLogOpt(cfg map[string]string) error { - for key := range cfg { - switch key { - case logGroupKey: - case logStreamKey: - case regionKey: - case tagKey: - default: - return fmt.Errorf("unknown log opt '%s' for %s log driver", key, name) - } - } - if cfg[logGroupKey] == "" { - return fmt.Errorf("must specify a value for log opt '%s'", logGroupKey) - } - return nil -} - -// Len returns the length of a byTimestamp slice. Len is required by the -// sort.Interface interface. -func (slice byTimestamp) Len() int { - return len(slice) -} - -// Less compares two values in a byTimestamp slice by Timestamp. Less is -// required by the sort.Interface interface. -func (slice byTimestamp) Less(i, j int) bool { - iTimestamp, jTimestamp := int64(0), int64(0) - if slice != nil && slice[i].inputLogEvent.Timestamp != nil { - iTimestamp = *slice[i].inputLogEvent.Timestamp - } - if slice != nil && slice[j].inputLogEvent.Timestamp != nil { - jTimestamp = *slice[j].inputLogEvent.Timestamp - } - if iTimestamp == jTimestamp { - return slice[i].insertOrder < slice[j].insertOrder - } - return iTimestamp < jTimestamp -} - -// Swap swaps two values in a byTimestamp slice with each other. Swap is -// required by the sort.Interface interface. -func (slice byTimestamp) Swap(i, j int) { - slice[i], slice[j] = slice[j], slice[i] -} - -func unwrapEvents(events []wrappedEvent) []*cloudwatchlogs.InputLogEvent { - cwEvents := []*cloudwatchlogs.InputLogEvent{} - for _, input := range events { - cwEvents = append(cwEvents, input.inputLogEvent) - } - return cwEvents -} diff --git a/vendor/github.com/docker/docker/daemon/logger/awslogs/cloudwatchlogs_test.go b/vendor/github.com/docker/docker/daemon/logger/awslogs/cloudwatchlogs_test.go deleted file mode 100644 index d5b1aaef5..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/awslogs/cloudwatchlogs_test.go +++ /dev/null @@ -1,724 +0,0 @@ -package awslogs - -import ( - "errors" - "fmt" - "net/http" - "reflect" - "runtime" - "strings" - "testing" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/service/cloudwatchlogs" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/daemon/logger/loggerutils" - "github.com/docker/docker/dockerversion" -) - -const ( - groupName = "groupName" - streamName = "streamName" - sequenceToken = "sequenceToken" - nextSequenceToken = "nextSequenceToken" - logline = "this is a log line" -) - -func TestNewAWSLogsClientUserAgentHandler(t *testing.T) { - ctx := logger.Context{ - Config: map[string]string{ - regionKey: "us-east-1", - }, - } - - client, err := newAWSLogsClient(ctx) - if err != nil { - t.Fatal(err) - } - realClient, ok := client.(*cloudwatchlogs.CloudWatchLogs) - if !ok { - t.Fatal("Could not cast client to cloudwatchlogs.CloudWatchLogs") - } - buildHandlerList := realClient.Handlers.Build - request := &request.Request{ - HTTPRequest: &http.Request{ - Header: http.Header{}, - }, - } - buildHandlerList.Run(request) - expectedUserAgentString := fmt.Sprintf("Docker %s (%s) %s/%s (%s; %s; %s)", - dockerversion.Version, runtime.GOOS, aws.SDKName, aws.SDKVersion, runtime.Version(), runtime.GOOS, runtime.GOARCH) - userAgent := request.HTTPRequest.Header.Get("User-Agent") - if userAgent != expectedUserAgentString { - t.Errorf("Wrong User-Agent string, expected \"%s\" but was \"%s\"", - expectedUserAgentString, userAgent) - } -} - -func TestNewAWSLogsClientRegionDetect(t *testing.T) { - ctx := logger.Context{ - Config: map[string]string{}, - } - - mockMetadata := newMockMetadataClient() - newRegionFinder = func() regionFinder { - return mockMetadata - } - mockMetadata.regionResult <- ®ionResult{ - successResult: "us-east-1", - } - - _, err := newAWSLogsClient(ctx) - if err != nil { - t.Fatal(err) - } -} - -func TestCreateSuccess(t *testing.T) { - mockClient := newMockClient() - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - } - mockClient.createLogStreamResult <- &createLogStreamResult{} - - err := stream.create() - - if err != nil { - t.Errorf("Received unexpected err: %v\n", err) - } - argument := <-mockClient.createLogStreamArgument - if argument.LogGroupName == nil { - t.Fatal("Expected non-nil LogGroupName") - } - if *argument.LogGroupName != groupName { - t.Errorf("Expected LogGroupName to be %s", groupName) - } - if argument.LogStreamName == nil { - t.Fatal("Expected non-nil LogGroupName") - } - if *argument.LogStreamName != streamName { - t.Errorf("Expected LogStreamName to be %s", streamName) - } -} - -func TestCreateError(t *testing.T) { - mockClient := newMockClient() - stream := &logStream{ - client: mockClient, - } - mockClient.createLogStreamResult <- &createLogStreamResult{ - errorResult: errors.New("Error!"), - } - - err := stream.create() - - if err == nil { - t.Fatal("Expected non-nil err") - } -} - -func TestCreateAlreadyExists(t *testing.T) { - mockClient := newMockClient() - stream := &logStream{ - client: mockClient, - } - mockClient.createLogStreamResult <- &createLogStreamResult{ - errorResult: awserr.New(resourceAlreadyExistsCode, "", nil), - } - - err := stream.create() - - if err != nil { - t.Fatal("Expected nil err") - } -} - -func TestPublishBatchSuccess(t *testing.T) { - mockClient := newMockClient() - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - sequenceToken: aws.String(sequenceToken), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - successResult: &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: aws.String(nextSequenceToken), - }, - } - events := []wrappedEvent{ - { - inputLogEvent: &cloudwatchlogs.InputLogEvent{ - Message: aws.String(logline), - }, - }, - } - - stream.publishBatch(events) - if stream.sequenceToken == nil { - t.Fatal("Expected non-nil sequenceToken") - } - if *stream.sequenceToken != nextSequenceToken { - t.Errorf("Expected sequenceToken to be %s, but was %s", nextSequenceToken, *stream.sequenceToken) - } - argument := <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if argument.SequenceToken == nil { - t.Fatal("Expected non-nil PutLogEventsInput.SequenceToken") - } - if *argument.SequenceToken != sequenceToken { - t.Errorf("Expected PutLogEventsInput.SequenceToken to be %s, but was %s", sequenceToken, *argument.SequenceToken) - } - if len(argument.LogEvents) != 1 { - t.Errorf("Expected LogEvents to contain 1 element, but contains %d", len(argument.LogEvents)) - } - if argument.LogEvents[0] != events[0].inputLogEvent { - t.Error("Expected event to equal input") - } -} - -func TestPublishBatchError(t *testing.T) { - mockClient := newMockClient() - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - sequenceToken: aws.String(sequenceToken), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - errorResult: errors.New("Error!"), - } - - events := []wrappedEvent{ - { - inputLogEvent: &cloudwatchlogs.InputLogEvent{ - Message: aws.String(logline), - }, - }, - } - - stream.publishBatch(events) - if stream.sequenceToken == nil { - t.Fatal("Expected non-nil sequenceToken") - } - if *stream.sequenceToken != sequenceToken { - t.Errorf("Expected sequenceToken to be %s, but was %s", sequenceToken, *stream.sequenceToken) - } -} - -func TestPublishBatchInvalidSeqSuccess(t *testing.T) { - mockClient := newMockClientBuffered(2) - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - sequenceToken: aws.String(sequenceToken), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - errorResult: awserr.New(invalidSequenceTokenCode, "use token token", nil), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - successResult: &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: aws.String(nextSequenceToken), - }, - } - - events := []wrappedEvent{ - { - inputLogEvent: &cloudwatchlogs.InputLogEvent{ - Message: aws.String(logline), - }, - }, - } - - stream.publishBatch(events) - if stream.sequenceToken == nil { - t.Fatal("Expected non-nil sequenceToken") - } - if *stream.sequenceToken != nextSequenceToken { - t.Errorf("Expected sequenceToken to be %s, but was %s", nextSequenceToken, *stream.sequenceToken) - } - - argument := <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if argument.SequenceToken == nil { - t.Fatal("Expected non-nil PutLogEventsInput.SequenceToken") - } - if *argument.SequenceToken != sequenceToken { - t.Errorf("Expected PutLogEventsInput.SequenceToken to be %s, but was %s", sequenceToken, *argument.SequenceToken) - } - if len(argument.LogEvents) != 1 { - t.Errorf("Expected LogEvents to contain 1 element, but contains %d", len(argument.LogEvents)) - } - if argument.LogEvents[0] != events[0].inputLogEvent { - t.Error("Expected event to equal input") - } - - argument = <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if argument.SequenceToken == nil { - t.Fatal("Expected non-nil PutLogEventsInput.SequenceToken") - } - if *argument.SequenceToken != "token" { - t.Errorf("Expected PutLogEventsInput.SequenceToken to be %s, but was %s", "token", *argument.SequenceToken) - } - if len(argument.LogEvents) != 1 { - t.Errorf("Expected LogEvents to contain 1 element, but contains %d", len(argument.LogEvents)) - } - if argument.LogEvents[0] != events[0].inputLogEvent { - t.Error("Expected event to equal input") - } -} - -func TestPublishBatchAlreadyAccepted(t *testing.T) { - mockClient := newMockClient() - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - sequenceToken: aws.String(sequenceToken), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - errorResult: awserr.New(dataAlreadyAcceptedCode, "use token token", nil), - } - - events := []wrappedEvent{ - { - inputLogEvent: &cloudwatchlogs.InputLogEvent{ - Message: aws.String(logline), - }, - }, - } - - stream.publishBatch(events) - if stream.sequenceToken == nil { - t.Fatal("Expected non-nil sequenceToken") - } - if *stream.sequenceToken != "token" { - t.Errorf("Expected sequenceToken to be %s, but was %s", "token", *stream.sequenceToken) - } - - argument := <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if argument.SequenceToken == nil { - t.Fatal("Expected non-nil PutLogEventsInput.SequenceToken") - } - if *argument.SequenceToken != sequenceToken { - t.Errorf("Expected PutLogEventsInput.SequenceToken to be %s, but was %s", sequenceToken, *argument.SequenceToken) - } - if len(argument.LogEvents) != 1 { - t.Errorf("Expected LogEvents to contain 1 element, but contains %d", len(argument.LogEvents)) - } - if argument.LogEvents[0] != events[0].inputLogEvent { - t.Error("Expected event to equal input") - } -} - -func TestCollectBatchSimple(t *testing.T) { - mockClient := newMockClient() - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - sequenceToken: aws.String(sequenceToken), - messages: make(chan *logger.Message), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - successResult: &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: aws.String(nextSequenceToken), - }, - } - ticks := make(chan time.Time) - newTicker = func(_ time.Duration) *time.Ticker { - return &time.Ticker{ - C: ticks, - } - } - - go stream.collectBatch() - - stream.Log(&logger.Message{ - Line: []byte(logline), - Timestamp: time.Time{}, - }) - - ticks <- time.Time{} - stream.Close() - - argument := <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if len(argument.LogEvents) != 1 { - t.Errorf("Expected LogEvents to contain 1 element, but contains %d", len(argument.LogEvents)) - } - if *argument.LogEvents[0].Message != logline { - t.Errorf("Expected message to be %s but was %s", logline, *argument.LogEvents[0].Message) - } -} - -func TestCollectBatchTicker(t *testing.T) { - mockClient := newMockClient() - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - sequenceToken: aws.String(sequenceToken), - messages: make(chan *logger.Message), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - successResult: &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: aws.String(nextSequenceToken), - }, - } - ticks := make(chan time.Time) - newTicker = func(_ time.Duration) *time.Ticker { - return &time.Ticker{ - C: ticks, - } - } - - go stream.collectBatch() - - stream.Log(&logger.Message{ - Line: []byte(logline + " 1"), - Timestamp: time.Time{}, - }) - stream.Log(&logger.Message{ - Line: []byte(logline + " 2"), - Timestamp: time.Time{}, - }) - - ticks <- time.Time{} - - // Verify first batch - argument := <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if len(argument.LogEvents) != 2 { - t.Errorf("Expected LogEvents to contain 2 elements, but contains %d", len(argument.LogEvents)) - } - if *argument.LogEvents[0].Message != logline+" 1" { - t.Errorf("Expected message to be %s but was %s", logline+" 1", *argument.LogEvents[0].Message) - } - if *argument.LogEvents[1].Message != logline+" 2" { - t.Errorf("Expected message to be %s but was %s", logline+" 2", *argument.LogEvents[0].Message) - } - - stream.Log(&logger.Message{ - Line: []byte(logline + " 3"), - Timestamp: time.Time{}, - }) - - ticks <- time.Time{} - argument = <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if len(argument.LogEvents) != 1 { - t.Errorf("Expected LogEvents to contain 1 elements, but contains %d", len(argument.LogEvents)) - } - if *argument.LogEvents[0].Message != logline+" 3" { - t.Errorf("Expected message to be %s but was %s", logline+" 3", *argument.LogEvents[0].Message) - } - - stream.Close() - -} - -func TestCollectBatchClose(t *testing.T) { - mockClient := newMockClient() - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - sequenceToken: aws.String(sequenceToken), - messages: make(chan *logger.Message), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - successResult: &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: aws.String(nextSequenceToken), - }, - } - var ticks = make(chan time.Time) - newTicker = func(_ time.Duration) *time.Ticker { - return &time.Ticker{ - C: ticks, - } - } - - go stream.collectBatch() - - stream.Log(&logger.Message{ - Line: []byte(logline), - Timestamp: time.Time{}, - }) - - // no ticks - stream.Close() - - argument := <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if len(argument.LogEvents) != 1 { - t.Errorf("Expected LogEvents to contain 1 element, but contains %d", len(argument.LogEvents)) - } - if *argument.LogEvents[0].Message != logline { - t.Errorf("Expected message to be %s but was %s", logline, *argument.LogEvents[0].Message) - } -} - -func TestCollectBatchLineSplit(t *testing.T) { - mockClient := newMockClient() - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - sequenceToken: aws.String(sequenceToken), - messages: make(chan *logger.Message), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - successResult: &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: aws.String(nextSequenceToken), - }, - } - var ticks = make(chan time.Time) - newTicker = func(_ time.Duration) *time.Ticker { - return &time.Ticker{ - C: ticks, - } - } - - go stream.collectBatch() - - longline := strings.Repeat("A", maximumBytesPerEvent) - stream.Log(&logger.Message{ - Line: []byte(longline + "B"), - Timestamp: time.Time{}, - }) - - // no ticks - stream.Close() - - argument := <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if len(argument.LogEvents) != 2 { - t.Errorf("Expected LogEvents to contain 2 elements, but contains %d", len(argument.LogEvents)) - } - if *argument.LogEvents[0].Message != longline { - t.Errorf("Expected message to be %s but was %s", longline, *argument.LogEvents[0].Message) - } - if *argument.LogEvents[1].Message != "B" { - t.Errorf("Expected message to be %s but was %s", "B", *argument.LogEvents[1].Message) - } -} - -func TestCollectBatchMaxEvents(t *testing.T) { - mockClient := newMockClientBuffered(1) - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - sequenceToken: aws.String(sequenceToken), - messages: make(chan *logger.Message), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - successResult: &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: aws.String(nextSequenceToken), - }, - } - var ticks = make(chan time.Time) - newTicker = func(_ time.Duration) *time.Ticker { - return &time.Ticker{ - C: ticks, - } - } - - go stream.collectBatch() - - line := "A" - for i := 0; i <= maximumLogEventsPerPut; i++ { - stream.Log(&logger.Message{ - Line: []byte(line), - Timestamp: time.Time{}, - }) - } - - // no ticks - stream.Close() - - argument := <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if len(argument.LogEvents) != maximumLogEventsPerPut { - t.Errorf("Expected LogEvents to contain %d elements, but contains %d", maximumLogEventsPerPut, len(argument.LogEvents)) - } - - argument = <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if len(argument.LogEvents) != 1 { - t.Errorf("Expected LogEvents to contain %d elements, but contains %d", 1, len(argument.LogEvents)) - } -} - -func TestCollectBatchMaxTotalBytes(t *testing.T) { - mockClient := newMockClientBuffered(1) - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - sequenceToken: aws.String(sequenceToken), - messages: make(chan *logger.Message), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - successResult: &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: aws.String(nextSequenceToken), - }, - } - var ticks = make(chan time.Time) - newTicker = func(_ time.Duration) *time.Ticker { - return &time.Ticker{ - C: ticks, - } - } - - go stream.collectBatch() - - longline := strings.Repeat("A", maximumBytesPerPut) - stream.Log(&logger.Message{ - Line: []byte(longline + "B"), - Timestamp: time.Time{}, - }) - - // no ticks - stream.Close() - - argument := <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - bytes := 0 - for _, event := range argument.LogEvents { - bytes += len(*event.Message) - } - if bytes > maximumBytesPerPut { - t.Errorf("Expected <= %d bytes but was %d", maximumBytesPerPut, bytes) - } - - argument = <-mockClient.putLogEventsArgument - if len(argument.LogEvents) != 1 { - t.Errorf("Expected LogEvents to contain 1 elements, but contains %d", len(argument.LogEvents)) - } - message := *argument.LogEvents[0].Message - if message[len(message)-1:] != "B" { - t.Errorf("Expected message to be %s but was %s", "B", message[len(message)-1:]) - } -} - -func TestCollectBatchWithDuplicateTimestamps(t *testing.T) { - mockClient := newMockClient() - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: streamName, - sequenceToken: aws.String(sequenceToken), - messages: make(chan *logger.Message), - } - mockClient.putLogEventsResult <- &putLogEventsResult{ - successResult: &cloudwatchlogs.PutLogEventsOutput{ - NextSequenceToken: aws.String(nextSequenceToken), - }, - } - ticks := make(chan time.Time) - newTicker = func(_ time.Duration) *time.Ticker { - return &time.Ticker{ - C: ticks, - } - } - - go stream.collectBatch() - - times := maximumLogEventsPerPut - expectedEvents := []*cloudwatchlogs.InputLogEvent{} - timestamp := time.Now() - for i := 0; i < times; i++ { - line := fmt.Sprintf("%d", i) - if i%2 == 0 { - timestamp.Add(1 * time.Nanosecond) - } - stream.Log(&logger.Message{ - Line: []byte(line), - Timestamp: timestamp, - }) - expectedEvents = append(expectedEvents, &cloudwatchlogs.InputLogEvent{ - Message: aws.String(line), - Timestamp: aws.Int64(timestamp.UnixNano() / int64(time.Millisecond)), - }) - } - - ticks <- time.Time{} - stream.Close() - - argument := <-mockClient.putLogEventsArgument - if argument == nil { - t.Fatal("Expected non-nil PutLogEventsInput") - } - if len(argument.LogEvents) != times { - t.Errorf("Expected LogEvents to contain %d elements, but contains %d", times, len(argument.LogEvents)) - } - for i := 0; i < times; i++ { - if !reflect.DeepEqual(*argument.LogEvents[i], *expectedEvents[i]) { - t.Errorf("Expected event to be %v but was %v", *expectedEvents[i], *argument.LogEvents[i]) - } - } -} - -func TestCreateTagSuccess(t *testing.T) { - mockClient := newMockClient() - ctx := logger.Context{ - ContainerName: "/test-container", - ContainerID: "container-abcdefghijklmnopqrstuvwxyz01234567890", - Config: map[string]string{"tag": "{{.Name}}/{{.FullID}}"}, - } - logStreamName, e := loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) - if e != nil { - t.Errorf("Error generating tag: %q", e) - } - stream := &logStream{ - client: mockClient, - logGroupName: groupName, - logStreamName: logStreamName, - } - mockClient.createLogStreamResult <- &createLogStreamResult{} - - err := stream.create() - - if err != nil { - t.Errorf("Received unexpected err: %v\n", err) - } - argument := <-mockClient.createLogStreamArgument - - if *argument.LogStreamName != "test-container/container-abcdefghijklmnopqrstuvwxyz01234567890" { - t.Errorf("Expected LogStreamName to be %s", "test-container/container-abcdefghijklmnopqrstuvwxyz01234567890") - } -} diff --git a/vendor/github.com/docker/docker/daemon/logger/awslogs/cwlogsiface_mock_test.go b/vendor/github.com/docker/docker/daemon/logger/awslogs/cwlogsiface_mock_test.go deleted file mode 100644 index b768a3d7e..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/awslogs/cwlogsiface_mock_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package awslogs - -import "github.com/aws/aws-sdk-go/service/cloudwatchlogs" - -type mockcwlogsclient struct { - createLogStreamArgument chan *cloudwatchlogs.CreateLogStreamInput - createLogStreamResult chan *createLogStreamResult - putLogEventsArgument chan *cloudwatchlogs.PutLogEventsInput - putLogEventsResult chan *putLogEventsResult -} - -type createLogStreamResult struct { - successResult *cloudwatchlogs.CreateLogStreamOutput - errorResult error -} - -type putLogEventsResult struct { - successResult *cloudwatchlogs.PutLogEventsOutput - errorResult error -} - -func newMockClient() *mockcwlogsclient { - return &mockcwlogsclient{ - createLogStreamArgument: make(chan *cloudwatchlogs.CreateLogStreamInput, 1), - createLogStreamResult: make(chan *createLogStreamResult, 1), - putLogEventsArgument: make(chan *cloudwatchlogs.PutLogEventsInput, 1), - putLogEventsResult: make(chan *putLogEventsResult, 1), - } -} - -func newMockClientBuffered(buflen int) *mockcwlogsclient { - return &mockcwlogsclient{ - createLogStreamArgument: make(chan *cloudwatchlogs.CreateLogStreamInput, buflen), - createLogStreamResult: make(chan *createLogStreamResult, buflen), - putLogEventsArgument: make(chan *cloudwatchlogs.PutLogEventsInput, buflen), - putLogEventsResult: make(chan *putLogEventsResult, buflen), - } -} - -func (m *mockcwlogsclient) CreateLogStream(input *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) { - m.createLogStreamArgument <- input - output := <-m.createLogStreamResult - return output.successResult, output.errorResult -} - -func (m *mockcwlogsclient) PutLogEvents(input *cloudwatchlogs.PutLogEventsInput) (*cloudwatchlogs.PutLogEventsOutput, error) { - events := make([]*cloudwatchlogs.InputLogEvent, len(input.LogEvents)) - copy(events, input.LogEvents) - m.putLogEventsArgument <- &cloudwatchlogs.PutLogEventsInput{ - LogEvents: events, - SequenceToken: input.SequenceToken, - LogGroupName: input.LogGroupName, - LogStreamName: input.LogStreamName, - } - output := <-m.putLogEventsResult - return output.successResult, output.errorResult -} - -type mockmetadataclient struct { - regionResult chan *regionResult -} - -type regionResult struct { - successResult string - errorResult error -} - -func newMockMetadataClient() *mockmetadataclient { - return &mockmetadataclient{ - regionResult: make(chan *regionResult, 1), - } -} - -func (m *mockmetadataclient) Region() (string, error) { - output := <-m.regionResult - return output.successResult, output.errorResult -} diff --git a/vendor/github.com/docker/docker/daemon/logger/context.go b/vendor/github.com/docker/docker/daemon/logger/context.go deleted file mode 100644 index 085ab01a1..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/context.go +++ /dev/null @@ -1,111 +0,0 @@ -package logger - -import ( - "fmt" - "os" - "strings" - "time" -) - -// Context provides enough information for a logging driver to do its function. -type Context struct { - Config map[string]string - ContainerID string - ContainerName string - ContainerEntrypoint string - ContainerArgs []string - ContainerImageID string - ContainerImageName string - ContainerCreated time.Time - ContainerEnv []string - ContainerLabels map[string]string - LogPath string - DaemonName string -} - -// ExtraAttributes returns the user-defined extra attributes (labels, -// environment variables) in key-value format. This can be used by log drivers -// that support metadata to add more context to a log. -func (ctx *Context) ExtraAttributes(keyMod func(string) string) map[string]string { - extra := make(map[string]string) - labels, ok := ctx.Config["labels"] - if ok && len(labels) > 0 { - for _, l := range strings.Split(labels, ",") { - if v, ok := ctx.ContainerLabels[l]; ok { - if keyMod != nil { - l = keyMod(l) - } - extra[l] = v - } - } - } - - env, ok := ctx.Config["env"] - if ok && len(env) > 0 { - envMapping := make(map[string]string) - for _, e := range ctx.ContainerEnv { - if kv := strings.SplitN(e, "=", 2); len(kv) == 2 { - envMapping[kv[0]] = kv[1] - } - } - for _, l := range strings.Split(env, ",") { - if v, ok := envMapping[l]; ok { - if keyMod != nil { - l = keyMod(l) - } - extra[l] = v - } - } - } - - return extra -} - -// Hostname returns the hostname from the underlying OS. -func (ctx *Context) Hostname() (string, error) { - hostname, err := os.Hostname() - if err != nil { - return "", fmt.Errorf("logger: can not resolve hostname: %v", err) - } - return hostname, nil -} - -// Command returns the command that the container being logged was -// started with. The Entrypoint is prepended to the container -// arguments. -func (ctx *Context) Command() string { - terms := []string{ctx.ContainerEntrypoint} - terms = append(terms, ctx.ContainerArgs...) - command := strings.Join(terms, " ") - return command -} - -// ID Returns the Container ID shortened to 12 characters. -func (ctx *Context) ID() string { - return ctx.ContainerID[:12] -} - -// FullID is an alias of ContainerID. -func (ctx *Context) FullID() string { - return ctx.ContainerID -} - -// Name returns the ContainerName without a preceding '/'. -func (ctx *Context) Name() string { - return ctx.ContainerName[1:] -} - -// ImageID returns the ContainerImageID shortened to 12 characters. -func (ctx *Context) ImageID() string { - return ctx.ContainerImageID[:12] -} - -// ImageFullID is an alias of ContainerImageID. -func (ctx *Context) ImageFullID() string { - return ctx.ContainerImageID -} - -// ImageName is an alias of ContainerImageName -func (ctx *Context) ImageName() string { - return ctx.ContainerImageName -} diff --git a/vendor/github.com/docker/docker/daemon/logger/copier.go b/vendor/github.com/docker/docker/daemon/logger/copier.go deleted file mode 100644 index 10ab46e16..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/copier.go +++ /dev/null @@ -1,131 +0,0 @@ -package logger - -import ( - "bytes" - "io" - "sync" - "time" - - "github.com/Sirupsen/logrus" -) - -const ( - bufSize = 16 * 1024 - readSize = 2 * 1024 -) - -// Copier can copy logs from specified sources to Logger and attach Timestamp. -// Writes are concurrent, so you need implement some sync in your logger. -type Copier struct { - // srcs is map of name -> reader pairs, for example "stdout", "stderr" - srcs map[string]io.Reader - dst Logger - copyJobs sync.WaitGroup - closeOnce sync.Once - closed chan struct{} -} - -// NewCopier creates a new Copier -func NewCopier(srcs map[string]io.Reader, dst Logger) *Copier { - return &Copier{ - srcs: srcs, - dst: dst, - closed: make(chan struct{}), - } -} - -// Run starts logs copying -func (c *Copier) Run() { - for src, w := range c.srcs { - c.copyJobs.Add(1) - go c.copySrc(src, w) - } -} - -func (c *Copier) copySrc(name string, src io.Reader) { - defer c.copyJobs.Done() - buf := make([]byte, bufSize) - n := 0 - eof := false - msg := &Message{Source: name} - - for { - select { - case <-c.closed: - return - default: - // Work out how much more data we are okay with reading this time. - upto := n + readSize - if upto > cap(buf) { - upto = cap(buf) - } - // Try to read that data. - if upto > n { - read, err := src.Read(buf[n:upto]) - if err != nil { - if err != io.EOF { - logrus.Errorf("Error scanning log stream: %s", err) - return - } - eof = true - } - n += read - } - // If we have no data to log, and there's no more coming, we're done. - if n == 0 && eof { - return - } - // Break up the data that we've buffered up into lines, and log each in turn. - p := 0 - for q := bytes.Index(buf[p:n], []byte{'\n'}); q >= 0; q = bytes.Index(buf[p:n], []byte{'\n'}) { - msg.Line = buf[p : p+q] - msg.Timestamp = time.Now().UTC() - msg.Partial = false - select { - case <-c.closed: - return - default: - if logErr := c.dst.Log(msg); logErr != nil { - logrus.Errorf("Failed to log msg %q for logger %s: %s", msg.Line, c.dst.Name(), logErr) - } - } - p += q + 1 - } - // If there's no more coming, or the buffer is full but - // has no newlines, log whatever we haven't logged yet, - // noting that it's a partial log line. - if eof || (p == 0 && n == len(buf)) { - if p < n { - msg.Line = buf[p:n] - msg.Timestamp = time.Now().UTC() - msg.Partial = true - if logErr := c.dst.Log(msg); logErr != nil { - logrus.Errorf("Failed to log msg %q for logger %s: %s", msg.Line, c.dst.Name(), logErr) - } - p = 0 - n = 0 - } - if eof { - return - } - } - // Move any unlogged data to the front of the buffer in preparation for another read. - if p > 0 { - copy(buf[0:], buf[p:n]) - n -= p - } - } - } -} - -// Wait waits until all copying is done -func (c *Copier) Wait() { - c.copyJobs.Wait() -} - -// Close closes the copier -func (c *Copier) Close() { - c.closeOnce.Do(func() { - close(c.closed) - }) -} diff --git a/vendor/github.com/docker/docker/daemon/logger/copier_test.go b/vendor/github.com/docker/docker/daemon/logger/copier_test.go deleted file mode 100644 index cfd816a6e..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/copier_test.go +++ /dev/null @@ -1,296 +0,0 @@ -package logger - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "os" - "strings" - "sync" - "testing" - "time" -) - -type TestLoggerJSON struct { - *json.Encoder - mu sync.Mutex - delay time.Duration -} - -func (l *TestLoggerJSON) Log(m *Message) error { - if l.delay > 0 { - time.Sleep(l.delay) - } - l.mu.Lock() - defer l.mu.Unlock() - return l.Encode(m) -} - -func (l *TestLoggerJSON) Close() error { return nil } - -func (l *TestLoggerJSON) Name() string { return "json" } - -func TestCopier(t *testing.T) { - stdoutLine := "Line that thinks that it is log line from docker stdout" - stderrLine := "Line that thinks that it is log line from docker stderr" - stdoutTrailingLine := "stdout trailing line" - stderrTrailingLine := "stderr trailing line" - - var stdout bytes.Buffer - var stderr bytes.Buffer - for i := 0; i < 30; i++ { - if _, err := stdout.WriteString(stdoutLine + "\n"); err != nil { - t.Fatal(err) - } - if _, err := stderr.WriteString(stderrLine + "\n"); err != nil { - t.Fatal(err) - } - } - - // Test remaining lines without line-endings - if _, err := stdout.WriteString(stdoutTrailingLine); err != nil { - t.Fatal(err) - } - if _, err := stderr.WriteString(stderrTrailingLine); err != nil { - t.Fatal(err) - } - - var jsonBuf bytes.Buffer - - jsonLog := &TestLoggerJSON{Encoder: json.NewEncoder(&jsonBuf)} - - c := NewCopier( - map[string]io.Reader{ - "stdout": &stdout, - "stderr": &stderr, - }, - jsonLog) - c.Run() - wait := make(chan struct{}) - go func() { - c.Wait() - close(wait) - }() - select { - case <-time.After(1 * time.Second): - t.Fatal("Copier failed to do its work in 1 second") - case <-wait: - } - dec := json.NewDecoder(&jsonBuf) - for { - var msg Message - if err := dec.Decode(&msg); err != nil { - if err == io.EOF { - break - } - t.Fatal(err) - } - if msg.Source != "stdout" && msg.Source != "stderr" { - t.Fatalf("Wrong Source: %q, should be %q or %q", msg.Source, "stdout", "stderr") - } - if msg.Source == "stdout" { - if string(msg.Line) != stdoutLine && string(msg.Line) != stdoutTrailingLine { - t.Fatalf("Wrong Line: %q, expected %q or %q", msg.Line, stdoutLine, stdoutTrailingLine) - } - } - if msg.Source == "stderr" { - if string(msg.Line) != stderrLine && string(msg.Line) != stderrTrailingLine { - t.Fatalf("Wrong Line: %q, expected %q or %q", msg.Line, stderrLine, stderrTrailingLine) - } - } - } -} - -// TestCopierLongLines tests long lines without line breaks -func TestCopierLongLines(t *testing.T) { - // Long lines (should be split at "bufSize") - const bufSize = 16 * 1024 - stdoutLongLine := strings.Repeat("a", bufSize) - stderrLongLine := strings.Repeat("b", bufSize) - stdoutTrailingLine := "stdout trailing line" - stderrTrailingLine := "stderr trailing line" - - var stdout bytes.Buffer - var stderr bytes.Buffer - - for i := 0; i < 3; i++ { - if _, err := stdout.WriteString(stdoutLongLine); err != nil { - t.Fatal(err) - } - if _, err := stderr.WriteString(stderrLongLine); err != nil { - t.Fatal(err) - } - } - - if _, err := stdout.WriteString(stdoutTrailingLine); err != nil { - t.Fatal(err) - } - if _, err := stderr.WriteString(stderrTrailingLine); err != nil { - t.Fatal(err) - } - - var jsonBuf bytes.Buffer - - jsonLog := &TestLoggerJSON{Encoder: json.NewEncoder(&jsonBuf)} - - c := NewCopier( - map[string]io.Reader{ - "stdout": &stdout, - "stderr": &stderr, - }, - jsonLog) - c.Run() - wait := make(chan struct{}) - go func() { - c.Wait() - close(wait) - }() - select { - case <-time.After(1 * time.Second): - t.Fatal("Copier failed to do its work in 1 second") - case <-wait: - } - dec := json.NewDecoder(&jsonBuf) - for { - var msg Message - if err := dec.Decode(&msg); err != nil { - if err == io.EOF { - break - } - t.Fatal(err) - } - if msg.Source != "stdout" && msg.Source != "stderr" { - t.Fatalf("Wrong Source: %q, should be %q or %q", msg.Source, "stdout", "stderr") - } - if msg.Source == "stdout" { - if string(msg.Line) != stdoutLongLine && string(msg.Line) != stdoutTrailingLine { - t.Fatalf("Wrong Line: %q, expected 'stdoutLongLine' or 'stdoutTrailingLine'", msg.Line) - } - } - if msg.Source == "stderr" { - if string(msg.Line) != stderrLongLine && string(msg.Line) != stderrTrailingLine { - t.Fatalf("Wrong Line: %q, expected 'stderrLongLine' or 'stderrTrailingLine'", msg.Line) - } - } - } -} - -func TestCopierSlow(t *testing.T) { - stdoutLine := "Line that thinks that it is log line from docker stdout" - var stdout bytes.Buffer - for i := 0; i < 30; i++ { - if _, err := stdout.WriteString(stdoutLine + "\n"); err != nil { - t.Fatal(err) - } - } - - var jsonBuf bytes.Buffer - //encoder := &encodeCloser{Encoder: json.NewEncoder(&jsonBuf)} - jsonLog := &TestLoggerJSON{Encoder: json.NewEncoder(&jsonBuf), delay: 100 * time.Millisecond} - - c := NewCopier(map[string]io.Reader{"stdout": &stdout}, jsonLog) - c.Run() - wait := make(chan struct{}) - go func() { - c.Wait() - close(wait) - }() - <-time.After(150 * time.Millisecond) - c.Close() - select { - case <-time.After(200 * time.Millisecond): - t.Fatalf("failed to exit in time after the copier is closed") - case <-wait: - } -} - -type BenchmarkLoggerDummy struct { -} - -func (l *BenchmarkLoggerDummy) Log(m *Message) error { return nil } - -func (l *BenchmarkLoggerDummy) Close() error { return nil } - -func (l *BenchmarkLoggerDummy) Name() string { return "dummy" } - -func BenchmarkCopier64(b *testing.B) { - benchmarkCopier(b, 1<<6) -} -func BenchmarkCopier128(b *testing.B) { - benchmarkCopier(b, 1<<7) -} -func BenchmarkCopier256(b *testing.B) { - benchmarkCopier(b, 1<<8) -} -func BenchmarkCopier512(b *testing.B) { - benchmarkCopier(b, 1<<9) -} -func BenchmarkCopier1K(b *testing.B) { - benchmarkCopier(b, 1<<10) -} -func BenchmarkCopier2K(b *testing.B) { - benchmarkCopier(b, 1<<11) -} -func BenchmarkCopier4K(b *testing.B) { - benchmarkCopier(b, 1<<12) -} -func BenchmarkCopier8K(b *testing.B) { - benchmarkCopier(b, 1<<13) -} -func BenchmarkCopier16K(b *testing.B) { - benchmarkCopier(b, 1<<14) -} -func BenchmarkCopier32K(b *testing.B) { - benchmarkCopier(b, 1<<15) -} -func BenchmarkCopier64K(b *testing.B) { - benchmarkCopier(b, 1<<16) -} -func BenchmarkCopier128K(b *testing.B) { - benchmarkCopier(b, 1<<17) -} -func BenchmarkCopier256K(b *testing.B) { - benchmarkCopier(b, 1<<18) -} - -func piped(b *testing.B, iterations int, delay time.Duration, buf []byte) io.Reader { - r, w, err := os.Pipe() - if err != nil { - b.Fatal(err) - return nil - } - go func() { - for i := 0; i < iterations; i++ { - time.Sleep(delay) - if n, err := w.Write(buf); err != nil || n != len(buf) { - if err != nil { - b.Fatal(err) - } - b.Fatal(fmt.Errorf("short write")) - } - } - w.Close() - }() - return r -} - -func benchmarkCopier(b *testing.B, length int) { - b.StopTimer() - buf := []byte{'A'} - for len(buf) < length { - buf = append(buf, buf...) - } - buf = append(buf[:length-1], []byte{'\n'}...) - b.StartTimer() - for i := 0; i < b.N; i++ { - c := NewCopier( - map[string]io.Reader{ - "buffer": piped(b, 10, time.Nanosecond, buf), - }, - &BenchmarkLoggerDummy{}) - c.Run() - c.Wait() - c.Close() - } -} diff --git a/vendor/github.com/docker/docker/daemon/logger/etwlogs/etwlogs_windows.go b/vendor/github.com/docker/docker/daemon/logger/etwlogs/etwlogs_windows.go deleted file mode 100644 index f296d7f16..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/etwlogs/etwlogs_windows.go +++ /dev/null @@ -1,170 +0,0 @@ -// Package etwlogs provides a log driver for forwarding container logs -// as ETW events.(ETW stands for Event Tracing for Windows) -// A client can then create an ETW listener to listen for events that are sent -// by the ETW provider that we register, using the provider's GUID "a3693192-9ed6-46d2-a981-f8226c8363bd". -// Here is an example of how to do this using the logman utility: -// 1. logman start -ets DockerContainerLogs -p {a3693192-9ed6-46d2-a981-f8226c8363bd} 0 0 -o trace.etl -// 2. Run container(s) and generate log messages -// 3. logman stop -ets DockerContainerLogs -// 4. You can then convert the etl log file to XML using: tracerpt -y trace.etl -// -// Each container log message generates an ETW event that also contains: -// the container name and ID, the timestamp, and the stream type. -package etwlogs - -import ( - "errors" - "fmt" - "sync" - "syscall" - "unsafe" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/logger" - "golang.org/x/sys/windows" -) - -type etwLogs struct { - containerName string - imageName string - containerID string - imageID string -} - -const ( - name = "etwlogs" - win32CallSuccess = 0 -) - -var ( - modAdvapi32 = windows.NewLazySystemDLL("Advapi32.dll") - procEventRegister = modAdvapi32.NewProc("EventRegister") - procEventWriteString = modAdvapi32.NewProc("EventWriteString") - procEventUnregister = modAdvapi32.NewProc("EventUnregister") -) -var providerHandle syscall.Handle -var refCount int -var mu sync.Mutex - -func init() { - providerHandle = syscall.InvalidHandle - if err := logger.RegisterLogDriver(name, New); err != nil { - logrus.Fatal(err) - } -} - -// New creates a new etwLogs logger for the given container and registers the EWT provider. -func New(ctx logger.Context) (logger.Logger, error) { - if err := registerETWProvider(); err != nil { - return nil, err - } - logrus.Debugf("logging driver etwLogs configured for container: %s.", ctx.ContainerID) - - return &etwLogs{ - containerName: fixContainerName(ctx.ContainerName), - imageName: ctx.ContainerImageName, - containerID: ctx.ContainerID, - imageID: ctx.ContainerImageID, - }, nil -} - -// Log logs the message to the ETW stream. -func (etwLogger *etwLogs) Log(msg *logger.Message) error { - if providerHandle == syscall.InvalidHandle { - // This should never be hit, if it is, it indicates a programming error. - errorMessage := "ETWLogs cannot log the message, because the event provider has not been registered." - logrus.Error(errorMessage) - return errors.New(errorMessage) - } - return callEventWriteString(createLogMessage(etwLogger, msg)) -} - -// Close closes the logger by unregistering the ETW provider. -func (etwLogger *etwLogs) Close() error { - unregisterETWProvider() - return nil -} - -func (etwLogger *etwLogs) Name() string { - return name -} - -func createLogMessage(etwLogger *etwLogs, msg *logger.Message) string { - return fmt.Sprintf("container_name: %s, image_name: %s, container_id: %s, image_id: %s, source: %s, log: %s", - etwLogger.containerName, - etwLogger.imageName, - etwLogger.containerID, - etwLogger.imageID, - msg.Source, - msg.Line) -} - -// fixContainerName removes the initial '/' from the container name. -func fixContainerName(cntName string) string { - if len(cntName) > 0 && cntName[0] == '/' { - cntName = cntName[1:] - } - return cntName -} - -func registerETWProvider() error { - mu.Lock() - defer mu.Unlock() - if refCount == 0 { - var err error - if err = callEventRegister(); err != nil { - return err - } - } - - refCount++ - return nil -} - -func unregisterETWProvider() { - mu.Lock() - defer mu.Unlock() - if refCount == 1 { - if callEventUnregister() { - refCount-- - providerHandle = syscall.InvalidHandle - } - // Not returning an error if EventUnregister fails, because etwLogs will continue to work - } else { - refCount-- - } -} - -func callEventRegister() error { - // The provider's GUID is {a3693192-9ed6-46d2-a981-f8226c8363bd} - guid := syscall.GUID{ - 0xa3693192, 0x9ed6, 0x46d2, - [8]byte{0xa9, 0x81, 0xf8, 0x22, 0x6c, 0x83, 0x63, 0xbd}, - } - - ret, _, _ := procEventRegister.Call(uintptr(unsafe.Pointer(&guid)), 0, 0, uintptr(unsafe.Pointer(&providerHandle))) - if ret != win32CallSuccess { - errorMessage := fmt.Sprintf("Failed to register ETW provider. Error: %d", ret) - logrus.Error(errorMessage) - return errors.New(errorMessage) - } - return nil -} - -func callEventWriteString(message string) error { - ret, _, _ := procEventWriteString.Call(uintptr(providerHandle), 0, 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(message)))) - if ret != win32CallSuccess { - errorMessage := fmt.Sprintf("ETWLogs provider failed to log message. Error: %d", ret) - logrus.Error(errorMessage) - return errors.New(errorMessage) - } - return nil -} - -func callEventUnregister() bool { - ret, _, _ := procEventUnregister.Call(uintptr(providerHandle)) - if ret != win32CallSuccess { - return false - } - return true -} diff --git a/vendor/github.com/docker/docker/daemon/logger/factory.go b/vendor/github.com/docker/docker/daemon/logger/factory.go deleted file mode 100644 index 9cf716b09..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/factory.go +++ /dev/null @@ -1,104 +0,0 @@ -package logger - -import ( - "fmt" - "sync" -) - -// Creator builds a logging driver instance with given context. -type Creator func(Context) (Logger, error) - -// LogOptValidator checks the options specific to the underlying -// logging implementation. -type LogOptValidator func(cfg map[string]string) error - -type logdriverFactory struct { - registry map[string]Creator - optValidator map[string]LogOptValidator - m sync.Mutex -} - -func (lf *logdriverFactory) register(name string, c Creator) error { - if lf.driverRegistered(name) { - return fmt.Errorf("logger: log driver named '%s' is already registered", name) - } - - lf.m.Lock() - lf.registry[name] = c - lf.m.Unlock() - return nil -} - -func (lf *logdriverFactory) driverRegistered(name string) bool { - lf.m.Lock() - _, ok := lf.registry[name] - lf.m.Unlock() - return ok -} - -func (lf *logdriverFactory) registerLogOptValidator(name string, l LogOptValidator) error { - lf.m.Lock() - defer lf.m.Unlock() - - if _, ok := lf.optValidator[name]; ok { - return fmt.Errorf("logger: log validator named '%s' is already registered", name) - } - lf.optValidator[name] = l - return nil -} - -func (lf *logdriverFactory) get(name string) (Creator, error) { - lf.m.Lock() - defer lf.m.Unlock() - - c, ok := lf.registry[name] - if !ok { - return c, fmt.Errorf("logger: no log driver named '%s' is registered", name) - } - return c, nil -} - -func (lf *logdriverFactory) getLogOptValidator(name string) LogOptValidator { - lf.m.Lock() - defer lf.m.Unlock() - - c, _ := lf.optValidator[name] - return c -} - -var factory = &logdriverFactory{registry: make(map[string]Creator), optValidator: make(map[string]LogOptValidator)} // global factory instance - -// RegisterLogDriver registers the given logging driver builder with given logging -// driver name. -func RegisterLogDriver(name string, c Creator) error { - return factory.register(name, c) -} - -// RegisterLogOptValidator registers the logging option validator with -// the given logging driver name. -func RegisterLogOptValidator(name string, l LogOptValidator) error { - return factory.registerLogOptValidator(name, l) -} - -// GetLogDriver provides the logging driver builder for a logging driver name. -func GetLogDriver(name string) (Creator, error) { - return factory.get(name) -} - -// ValidateLogOpts checks the options for the given log driver. The -// options supported are specific to the LogDriver implementation. -func ValidateLogOpts(name string, cfg map[string]string) error { - if name == "none" { - return nil - } - - if !factory.driverRegistered(name) { - return fmt.Errorf("logger: no log driver named '%s' is registered", name) - } - - validator := factory.getLogOptValidator(name) - if validator != nil { - return validator(cfg) - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/logger/fluentd/fluentd.go b/vendor/github.com/docker/docker/daemon/logger/fluentd/fluentd.go deleted file mode 100644 index a8303cf97..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/fluentd/fluentd.go +++ /dev/null @@ -1,246 +0,0 @@ -// Package fluentd provides the log driver for forwarding server logs -// to fluentd endpoints. -package fluentd - -import ( - "fmt" - "math" - "net" - "net/url" - "strconv" - "strings" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/daemon/logger/loggerutils" - "github.com/docker/docker/pkg/urlutil" - "github.com/docker/go-units" - "github.com/fluent/fluent-logger-golang/fluent" - "github.com/pkg/errors" -) - -type fluentd struct { - tag string - containerID string - containerName string - writer *fluent.Fluent - extra map[string]string -} - -type location struct { - protocol string - host string - port int - path string -} - -const ( - name = "fluentd" - - defaultProtocol = "tcp" - defaultHost = "127.0.0.1" - defaultPort = 24224 - defaultBufferLimit = 1024 * 1024 - - // logger tries to reconnect 2**32 - 1 times - // failed (and panic) after 204 years [ 1.5 ** (2**32 - 1) - 1 seconds] - defaultRetryWait = 1000 - defaultMaxRetries = math.MaxInt32 - - addressKey = "fluentd-address" - bufferLimitKey = "fluentd-buffer-limit" - retryWaitKey = "fluentd-retry-wait" - maxRetriesKey = "fluentd-max-retries" - asyncConnectKey = "fluentd-async-connect" -) - -func init() { - if err := logger.RegisterLogDriver(name, New); err != nil { - logrus.Fatal(err) - } - if err := logger.RegisterLogOptValidator(name, ValidateLogOpt); err != nil { - logrus.Fatal(err) - } -} - -// New creates a fluentd logger using the configuration passed in on -// the context. The supported context configuration variable is -// fluentd-address. -func New(ctx logger.Context) (logger.Logger, error) { - loc, err := parseAddress(ctx.Config[addressKey]) - if err != nil { - return nil, err - } - - tag, err := loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) - if err != nil { - return nil, err - } - - extra := ctx.ExtraAttributes(nil) - - bufferLimit := defaultBufferLimit - if ctx.Config[bufferLimitKey] != "" { - bl64, err := units.RAMInBytes(ctx.Config[bufferLimitKey]) - if err != nil { - return nil, err - } - bufferLimit = int(bl64) - } - - retryWait := defaultRetryWait - if ctx.Config[retryWaitKey] != "" { - rwd, err := time.ParseDuration(ctx.Config[retryWaitKey]) - if err != nil { - return nil, err - } - retryWait = int(rwd.Seconds() * 1000) - } - - maxRetries := defaultMaxRetries - if ctx.Config[maxRetriesKey] != "" { - mr64, err := strconv.ParseUint(ctx.Config[maxRetriesKey], 10, strconv.IntSize) - if err != nil { - return nil, err - } - maxRetries = int(mr64) - } - - asyncConnect := false - if ctx.Config[asyncConnectKey] != "" { - if asyncConnect, err = strconv.ParseBool(ctx.Config[asyncConnectKey]); err != nil { - return nil, err - } - } - - fluentConfig := fluent.Config{ - FluentPort: loc.port, - FluentHost: loc.host, - FluentNetwork: loc.protocol, - FluentSocketPath: loc.path, - BufferLimit: bufferLimit, - RetryWait: retryWait, - MaxRetry: maxRetries, - AsyncConnect: asyncConnect, - } - - logrus.WithField("container", ctx.ContainerID).WithField("config", fluentConfig). - Debug("logging driver fluentd configured") - - log, err := fluent.New(fluentConfig) - if err != nil { - return nil, err - } - return &fluentd{ - tag: tag, - containerID: ctx.ContainerID, - containerName: ctx.ContainerName, - writer: log, - extra: extra, - }, nil -} - -func (f *fluentd) Log(msg *logger.Message) error { - data := map[string]string{ - "container_id": f.containerID, - "container_name": f.containerName, - "source": msg.Source, - "log": string(msg.Line), - } - for k, v := range f.extra { - data[k] = v - } - // fluent-logger-golang buffers logs from failures and disconnections, - // and these are transferred again automatically. - return f.writer.PostWithTime(f.tag, msg.Timestamp, data) -} - -func (f *fluentd) Close() error { - return f.writer.Close() -} - -func (f *fluentd) Name() string { - return name -} - -// ValidateLogOpt looks for fluentd specific log option fluentd-address. -func ValidateLogOpt(cfg map[string]string) error { - for key := range cfg { - switch key { - case "env": - case "labels": - case "tag": - case addressKey: - case bufferLimitKey: - case retryWaitKey: - case maxRetriesKey: - case asyncConnectKey: - // Accepted - default: - return fmt.Errorf("unknown log opt '%s' for fluentd log driver", key) - } - } - - if _, err := parseAddress(cfg["fluentd-address"]); err != nil { - return err - } - - return nil -} - -func parseAddress(address string) (*location, error) { - if address == "" { - return &location{ - protocol: defaultProtocol, - host: defaultHost, - port: defaultPort, - path: "", - }, nil - } - - protocol := defaultProtocol - givenAddress := address - if urlutil.IsTransportURL(address) { - url, err := url.Parse(address) - if err != nil { - return nil, errors.Wrapf(err, "invalid fluentd-address %s", givenAddress) - } - // unix and unixgram socket - if url.Scheme == "unix" || url.Scheme == "unixgram" { - return &location{ - protocol: url.Scheme, - host: "", - port: 0, - path: url.Path, - }, nil - } - // tcp|udp - protocol = url.Scheme - address = url.Host - } - - host, port, err := net.SplitHostPort(address) - if err != nil { - if !strings.Contains(err.Error(), "missing port in address") { - return nil, errors.Wrapf(err, "invalid fluentd-address %s", givenAddress) - } - return &location{ - protocol: protocol, - host: host, - port: defaultPort, - path: "", - }, nil - } - - portnum, err := strconv.Atoi(port) - if err != nil { - return nil, errors.Wrapf(err, "invalid fluentd-address %s", givenAddress) - } - return &location{ - protocol: protocol, - host: host, - port: portnum, - path: "", - }, nil -} diff --git a/vendor/github.com/docker/docker/daemon/logger/gcplogs/gcplogging.go b/vendor/github.com/docker/docker/daemon/logger/gcplogs/gcplogging.go deleted file mode 100644 index 9a8c1c903..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/gcplogs/gcplogging.go +++ /dev/null @@ -1,200 +0,0 @@ -package gcplogs - -import ( - "fmt" - "sync" - "sync/atomic" - "time" - - "github.com/docker/docker/daemon/logger" - - "github.com/Sirupsen/logrus" - "golang.org/x/net/context" - "google.golang.org/cloud/compute/metadata" - "google.golang.org/cloud/logging" -) - -const ( - name = "gcplogs" - - projectOptKey = "gcp-project" - logLabelsKey = "labels" - logEnvKey = "env" - logCmdKey = "gcp-log-cmd" - logZoneKey = "gcp-meta-zone" - logNameKey = "gcp-meta-name" - logIDKey = "gcp-meta-id" -) - -var ( - // The number of logs the gcplogs driver has dropped. - droppedLogs uint64 - - onGCE bool - - // instance metadata populated from the metadata server if available - projectID string - zone string - instanceName string - instanceID string -) - -func init() { - - if err := logger.RegisterLogDriver(name, New); err != nil { - logrus.Fatal(err) - } - - if err := logger.RegisterLogOptValidator(name, ValidateLogOpts); err != nil { - logrus.Fatal(err) - } -} - -type gcplogs struct { - client *logging.Client - instance *instanceInfo - container *containerInfo -} - -type dockerLogEntry struct { - Instance *instanceInfo `json:"instance,omitempty"` - Container *containerInfo `json:"container,omitempty"` - Data string `json:"data,omitempty"` -} - -type instanceInfo struct { - Zone string `json:"zone,omitempty"` - Name string `json:"name,omitempty"` - ID string `json:"id,omitempty"` -} - -type containerInfo struct { - Name string `json:"name,omitempty"` - ID string `json:"id,omitempty"` - ImageName string `json:"imageName,omitempty"` - ImageID string `json:"imageId,omitempty"` - Created time.Time `json:"created,omitempty"` - Command string `json:"command,omitempty"` - Metadata map[string]string `json:"metadata,omitempty"` -} - -var initGCPOnce sync.Once - -func initGCP() { - initGCPOnce.Do(func() { - onGCE = metadata.OnGCE() - if onGCE { - // These will fail on instances if the metadata service is - // down or the client is compiled with an API version that - // has been removed. Since these are not vital, let's ignore - // them and make their fields in the dockeLogEntry ,omitempty - projectID, _ = metadata.ProjectID() - zone, _ = metadata.Zone() - instanceName, _ = metadata.InstanceName() - instanceID, _ = metadata.InstanceID() - } - }) -} - -// New creates a new logger that logs to Google Cloud Logging using the application -// default credentials. -// -// See https://developers.google.com/identity/protocols/application-default-credentials -func New(ctx logger.Context) (logger.Logger, error) { - initGCP() - - var project string - if projectID != "" { - project = projectID - } - if projectID, found := ctx.Config[projectOptKey]; found { - project = projectID - } - if project == "" { - return nil, fmt.Errorf("No project was specified and couldn't read project from the meatadata server. Please specify a project") - } - - c, err := logging.NewClient(context.Background(), project, "gcplogs-docker-driver") - if err != nil { - return nil, err - } - - if err := c.Ping(); err != nil { - return nil, fmt.Errorf("unable to connect or authenticate with Google Cloud Logging: %v", err) - } - - l := &gcplogs{ - client: c, - container: &containerInfo{ - Name: ctx.ContainerName, - ID: ctx.ContainerID, - ImageName: ctx.ContainerImageName, - ImageID: ctx.ContainerImageID, - Created: ctx.ContainerCreated, - Metadata: ctx.ExtraAttributes(nil), - }, - } - - if ctx.Config[logCmdKey] == "true" { - l.container.Command = ctx.Command() - } - - if onGCE { - l.instance = &instanceInfo{ - Zone: zone, - Name: instanceName, - ID: instanceID, - } - } else if ctx.Config[logZoneKey] != "" || ctx.Config[logNameKey] != "" || ctx.Config[logIDKey] != "" { - l.instance = &instanceInfo{ - Zone: ctx.Config[logZoneKey], - Name: ctx.Config[logNameKey], - ID: ctx.Config[logIDKey], - } - } - - // The logger "overflows" at a rate of 10,000 logs per second and this - // overflow func is called. We want to surface the error to the user - // without overly spamming /var/log/docker.log so we log the first time - // we overflow and every 1000th time after. - c.Overflow = func(_ *logging.Client, _ logging.Entry) error { - if i := atomic.AddUint64(&droppedLogs, 1); i%1000 == 1 { - logrus.Errorf("gcplogs driver has dropped %v logs", i) - } - return nil - } - - return l, nil -} - -// ValidateLogOpts validates the opts passed to the gcplogs driver. Currently, the gcplogs -// driver doesn't take any arguments. -func ValidateLogOpts(cfg map[string]string) error { - for k := range cfg { - switch k { - case projectOptKey, logLabelsKey, logEnvKey, logCmdKey, logZoneKey, logNameKey, logIDKey: - default: - return fmt.Errorf("%q is not a valid option for the gcplogs driver", k) - } - } - return nil -} - -func (l *gcplogs) Log(m *logger.Message) error { - return l.client.Log(logging.Entry{ - Time: m.Timestamp, - Payload: &dockerLogEntry{ - Instance: l.instance, - Container: l.container, - Data: string(m.Line), - }, - }) -} - -func (l *gcplogs) Close() error { - return l.client.Flush() -} - -func (l *gcplogs) Name() string { - return name -} diff --git a/vendor/github.com/docker/docker/daemon/logger/gelf/gelf.go b/vendor/github.com/docker/docker/daemon/logger/gelf/gelf.go deleted file mode 100644 index 95860ac08..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/gelf/gelf.go +++ /dev/null @@ -1,209 +0,0 @@ -// +build linux - -// Package gelf provides the log driver for forwarding server logs to -// endpoints that support the Graylog Extended Log Format. -package gelf - -import ( - "bytes" - "compress/flate" - "encoding/json" - "fmt" - "net" - "net/url" - "strconv" - "time" - - "github.com/Graylog2/go-gelf/gelf" - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/daemon/logger/loggerutils" - "github.com/docker/docker/pkg/urlutil" -) - -const name = "gelf" - -type gelfLogger struct { - writer *gelf.Writer - ctx logger.Context - hostname string - rawExtra json.RawMessage -} - -func init() { - if err := logger.RegisterLogDriver(name, New); err != nil { - logrus.Fatal(err) - } - if err := logger.RegisterLogOptValidator(name, ValidateLogOpt); err != nil { - logrus.Fatal(err) - } -} - -// New creates a gelf logger using the configuration passed in on the -// context. The supported context configuration variable is gelf-address. -func New(ctx logger.Context) (logger.Logger, error) { - // parse gelf address - address, err := parseAddress(ctx.Config["gelf-address"]) - if err != nil { - return nil, err - } - - // collect extra data for GELF message - hostname, err := ctx.Hostname() - if err != nil { - return nil, fmt.Errorf("gelf: cannot access hostname to set source field") - } - - // remove trailing slash from container name - containerName := bytes.TrimLeft([]byte(ctx.ContainerName), "/") - - // parse log tag - tag, err := loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) - if err != nil { - return nil, err - } - - extra := map[string]interface{}{ - "_container_id": ctx.ContainerID, - "_container_name": string(containerName), - "_image_id": ctx.ContainerImageID, - "_image_name": ctx.ContainerImageName, - "_command": ctx.Command(), - "_tag": tag, - "_created": ctx.ContainerCreated, - } - - extraAttrs := ctx.ExtraAttributes(func(key string) string { - if key[0] == '_' { - return key - } - return "_" + key - }) - for k, v := range extraAttrs { - extra[k] = v - } - - rawExtra, err := json.Marshal(extra) - if err != nil { - return nil, err - } - - // create new gelfWriter - gelfWriter, err := gelf.NewWriter(address) - if err != nil { - return nil, fmt.Errorf("gelf: cannot connect to GELF endpoint: %s %v", address, err) - } - - if v, ok := ctx.Config["gelf-compression-type"]; ok { - switch v { - case "gzip": - gelfWriter.CompressionType = gelf.CompressGzip - case "zlib": - gelfWriter.CompressionType = gelf.CompressZlib - case "none": - gelfWriter.CompressionType = gelf.CompressNone - default: - return nil, fmt.Errorf("gelf: invalid compression type %q", v) - } - } - - if v, ok := ctx.Config["gelf-compression-level"]; ok { - val, err := strconv.Atoi(v) - if err != nil { - return nil, fmt.Errorf("gelf: invalid compression level %s, err %v", v, err) - } - gelfWriter.CompressionLevel = val - } - - return &gelfLogger{ - writer: gelfWriter, - ctx: ctx, - hostname: hostname, - rawExtra: rawExtra, - }, nil -} - -func (s *gelfLogger) Log(msg *logger.Message) error { - level := gelf.LOG_INFO - if msg.Source == "stderr" { - level = gelf.LOG_ERR - } - - m := gelf.Message{ - Version: "1.1", - Host: s.hostname, - Short: string(msg.Line), - TimeUnix: float64(msg.Timestamp.UnixNano()/int64(time.Millisecond)) / 1000.0, - Level: level, - RawExtra: s.rawExtra, - } - - if err := s.writer.WriteMessage(&m); err != nil { - return fmt.Errorf("gelf: cannot send GELF message: %v", err) - } - return nil -} - -func (s *gelfLogger) Close() error { - return s.writer.Close() -} - -func (s *gelfLogger) Name() string { - return name -} - -// ValidateLogOpt looks for gelf specific log option gelf-address. -func ValidateLogOpt(cfg map[string]string) error { - for key, val := range cfg { - switch key { - case "gelf-address": - case "tag": - case "labels": - case "env": - case "gelf-compression-level": - i, err := strconv.Atoi(val) - if err != nil || i < flate.DefaultCompression || i > flate.BestCompression { - return fmt.Errorf("unknown value %q for log opt %q for gelf log driver", val, key) - } - case "gelf-compression-type": - switch val { - case "gzip", "zlib", "none": - default: - return fmt.Errorf("unknown value %q for log opt %q for gelf log driver", val, key) - } - default: - return fmt.Errorf("unknown log opt %q for gelf log driver", key) - } - } - - if _, err := parseAddress(cfg["gelf-address"]); err != nil { - return err - } - - return nil -} - -func parseAddress(address string) (string, error) { - if address == "" { - return "", nil - } - if !urlutil.IsTransportURL(address) { - return "", fmt.Errorf("gelf-address should be in form proto://address, got %v", address) - } - url, err := url.Parse(address) - if err != nil { - return "", err - } - - // we support only udp - if url.Scheme != "udp" { - return "", fmt.Errorf("gelf: endpoint needs to be UDP") - } - - // get host and port - if _, _, err = net.SplitHostPort(url.Host); err != nil { - return "", fmt.Errorf("gelf: please provide gelf-address as udp://host:port") - } - - return url.Host, nil -} diff --git a/vendor/github.com/docker/docker/daemon/logger/gelf/gelf_unsupported.go b/vendor/github.com/docker/docker/daemon/logger/gelf/gelf_unsupported.go deleted file mode 100644 index 266f73b18..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/gelf/gelf_unsupported.go +++ /dev/null @@ -1,3 +0,0 @@ -// +build !linux - -package gelf diff --git a/vendor/github.com/docker/docker/daemon/logger/journald/journald.go b/vendor/github.com/docker/docker/daemon/logger/journald/journald.go deleted file mode 100644 index 956985912..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/journald/journald.go +++ /dev/null @@ -1,122 +0,0 @@ -// +build linux - -// Package journald provides the log driver for forwarding server logs -// to endpoints that receive the systemd format. -package journald - -import ( - "fmt" - "sync" - "unicode" - - "github.com/Sirupsen/logrus" - "github.com/coreos/go-systemd/journal" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/daemon/logger/loggerutils" -) - -const name = "journald" - -type journald struct { - vars map[string]string // additional variables and values to send to the journal along with the log message - readers readerList -} - -type readerList struct { - mu sync.Mutex - readers map[*logger.LogWatcher]*logger.LogWatcher -} - -func init() { - if err := logger.RegisterLogDriver(name, New); err != nil { - logrus.Fatal(err) - } - if err := logger.RegisterLogOptValidator(name, validateLogOpt); err != nil { - logrus.Fatal(err) - } -} - -// sanitizeKeyMode returns the sanitized string so that it could be used in journald. -// In journald log, there are special requirements for fields. -// Fields must be composed of uppercase letters, numbers, and underscores, but must -// not start with an underscore. -func sanitizeKeyMod(s string) string { - n := "" - for _, v := range s { - if 'a' <= v && v <= 'z' { - v = unicode.ToUpper(v) - } else if ('Z' < v || v < 'A') && ('9' < v || v < '0') { - v = '_' - } - // If (n == "" && v == '_'), then we will skip as this is the beginning with '_' - if !(n == "" && v == '_') { - n += string(v) - } - } - return n -} - -// New creates a journald logger using the configuration passed in on -// the context. -func New(ctx logger.Context) (logger.Logger, error) { - if !journal.Enabled() { - return nil, fmt.Errorf("journald is not enabled on this host") - } - // Strip a leading slash so that people can search for - // CONTAINER_NAME=foo rather than CONTAINER_NAME=/foo. - name := ctx.ContainerName - if name[0] == '/' { - name = name[1:] - } - - // parse log tag - tag, err := loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) - if err != nil { - return nil, err - } - - vars := map[string]string{ - "CONTAINER_ID": ctx.ContainerID[:12], - "CONTAINER_ID_FULL": ctx.ContainerID, - "CONTAINER_NAME": name, - "CONTAINER_TAG": tag, - } - extraAttrs := ctx.ExtraAttributes(sanitizeKeyMod) - for k, v := range extraAttrs { - vars[k] = v - } - return &journald{vars: vars, readers: readerList{readers: make(map[*logger.LogWatcher]*logger.LogWatcher)}}, nil -} - -// We don't actually accept any options, but we have to supply a callback for -// the factory to pass the (probably empty) configuration map to. -func validateLogOpt(cfg map[string]string) error { - for key := range cfg { - switch key { - case "labels": - case "env": - case "tag": - default: - return fmt.Errorf("unknown log opt '%s' for journald log driver", key) - } - } - return nil -} - -func (s *journald) Log(msg *logger.Message) error { - vars := map[string]string{} - for k, v := range s.vars { - vars[k] = v - } - if msg.Partial { - vars["CONTAINER_PARTIAL_MESSAGE"] = "true" - } - if msg.Source == "stderr" { - return journal.Send(string(msg.Line), journal.PriErr, vars) - } - return journal.Send(string(msg.Line), journal.PriInfo, vars) -} - -func (s *journald) Name() string { - return name -} diff --git a/vendor/github.com/docker/docker/daemon/logger/journald/journald_test.go b/vendor/github.com/docker/docker/daemon/logger/journald/journald_test.go deleted file mode 100644 index 224423fd0..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/journald/journald_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build linux - -package journald - -import ( - "testing" -) - -func TestSanitizeKeyMod(t *testing.T) { - entries := map[string]string{ - "io.kubernetes.pod.name": "IO_KUBERNETES_POD_NAME", - "io?.kubernetes.pod.name": "IO__KUBERNETES_POD_NAME", - "?io.kubernetes.pod.name": "IO_KUBERNETES_POD_NAME", - "io123.kubernetes.pod.name": "IO123_KUBERNETES_POD_NAME", - "_io123.kubernetes.pod.name": "IO123_KUBERNETES_POD_NAME", - "__io123_kubernetes.pod.name": "IO123_KUBERNETES_POD_NAME", - } - for k, v := range entries { - if sanitizeKeyMod(k) != v { - t.Fatalf("Failed to sanitize %s, got %s, expected %s", k, sanitizeKeyMod(k), v) - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/logger/journald/journald_unsupported.go b/vendor/github.com/docker/docker/daemon/logger/journald/journald_unsupported.go deleted file mode 100644 index d52ca92e4..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/journald/journald_unsupported.go +++ /dev/null @@ -1,6 +0,0 @@ -// +build !linux - -package journald - -type journald struct { -} diff --git a/vendor/github.com/docker/docker/daemon/logger/journald/read.go b/vendor/github.com/docker/docker/daemon/logger/journald/read.go deleted file mode 100644 index d91eb809b..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/journald/read.go +++ /dev/null @@ -1,401 +0,0 @@ -// +build linux,cgo,!static_build,journald - -package journald - -// #include -// #include -// #include -// #include -// #include -// #include -// #include -// #include -// #include -// -//static int get_message(sd_journal *j, const char **msg, size_t *length, int *partial) -//{ -// int rc; -// size_t plength; -// *msg = NULL; -// *length = 0; -// plength = strlen("CONTAINER_PARTIAL_MESSAGE=true"); -// rc = sd_journal_get_data(j, "CONTAINER_PARTIAL_MESSAGE", (const void **) msg, length); -// *partial = ((rc == 0) && (*length == plength) && (memcmp(*msg, "CONTAINER_PARTIAL_MESSAGE=true", plength) == 0)); -// rc = sd_journal_get_data(j, "MESSAGE", (const void **) msg, length); -// if (rc == 0) { -// if (*length > 8) { -// (*msg) += 8; -// *length -= 8; -// } else { -// *msg = NULL; -// *length = 0; -// rc = -ENOENT; -// } -// } -// return rc; -//} -//static int get_priority(sd_journal *j, int *priority) -//{ -// const void *data; -// size_t i, length; -// int rc; -// *priority = -1; -// rc = sd_journal_get_data(j, "PRIORITY", &data, &length); -// if (rc == 0) { -// if ((length > 9) && (strncmp(data, "PRIORITY=", 9) == 0)) { -// *priority = 0; -// for (i = 9; i < length; i++) { -// *priority = *priority * 10 + ((const char *)data)[i] - '0'; -// } -// if (length > 9) { -// rc = 0; -// } -// } -// } -// return rc; -//} -//static int is_attribute_field(const char *msg, size_t length) -//{ -// static const struct known_field { -// const char *name; -// size_t length; -// } fields[] = { -// {"MESSAGE", sizeof("MESSAGE") - 1}, -// {"MESSAGE_ID", sizeof("MESSAGE_ID") - 1}, -// {"PRIORITY", sizeof("PRIORITY") - 1}, -// {"CODE_FILE", sizeof("CODE_FILE") - 1}, -// {"CODE_LINE", sizeof("CODE_LINE") - 1}, -// {"CODE_FUNC", sizeof("CODE_FUNC") - 1}, -// {"ERRNO", sizeof("ERRNO") - 1}, -// {"SYSLOG_FACILITY", sizeof("SYSLOG_FACILITY") - 1}, -// {"SYSLOG_IDENTIFIER", sizeof("SYSLOG_IDENTIFIER") - 1}, -// {"SYSLOG_PID", sizeof("SYSLOG_PID") - 1}, -// {"CONTAINER_NAME", sizeof("CONTAINER_NAME") - 1}, -// {"CONTAINER_ID", sizeof("CONTAINER_ID") - 1}, -// {"CONTAINER_ID_FULL", sizeof("CONTAINER_ID_FULL") - 1}, -// {"CONTAINER_TAG", sizeof("CONTAINER_TAG") - 1}, -// }; -// unsigned int i; -// void *p; -// if ((length < 1) || (msg[0] == '_') || ((p = memchr(msg, '=', length)) == NULL)) { -// return -1; -// } -// length = ((const char *) p) - msg; -// for (i = 0; i < sizeof(fields) / sizeof(fields[0]); i++) { -// if ((fields[i].length == length) && (memcmp(fields[i].name, msg, length) == 0)) { -// return -1; -// } -// } -// return 0; -//} -//static int get_attribute_field(sd_journal *j, const char **msg, size_t *length) -//{ -// int rc; -// *msg = NULL; -// *length = 0; -// while ((rc = sd_journal_enumerate_data(j, (const void **) msg, length)) > 0) { -// if (is_attribute_field(*msg, *length) == 0) { -// break; -// } -// rc = -ENOENT; -// } -// return rc; -//} -//static int wait_for_data_cancelable(sd_journal *j, int pipefd) -//{ -// struct pollfd fds[2]; -// uint64_t when = 0; -// int timeout, jevents, i; -// struct timespec ts; -// uint64_t now; -// -// memset(&fds, 0, sizeof(fds)); -// fds[0].fd = pipefd; -// fds[0].events = POLLHUP; -// fds[1].fd = sd_journal_get_fd(j); -// if (fds[1].fd < 0) { -// return fds[1].fd; -// } -// -// do { -// jevents = sd_journal_get_events(j); -// if (jevents < 0) { -// return jevents; -// } -// fds[1].events = jevents; -// sd_journal_get_timeout(j, &when); -// if (when == -1) { -// timeout = -1; -// } else { -// clock_gettime(CLOCK_MONOTONIC, &ts); -// now = (uint64_t) ts.tv_sec * 1000000 + ts.tv_nsec / 1000; -// timeout = when > now ? (int) ((when - now + 999) / 1000) : 0; -// } -// i = poll(fds, 2, timeout); -// if ((i == -1) && (errno != EINTR)) { -// /* An unexpected error. */ -// return (errno != 0) ? -errno : -EINTR; -// } -// if (fds[0].revents & POLLHUP) { -// /* The close notification pipe was closed. */ -// return 0; -// } -// if (sd_journal_process(j) == SD_JOURNAL_APPEND) { -// /* Data, which we might care about, was appended. */ -// return 1; -// } -// } while ((fds[0].revents & POLLHUP) == 0); -// return 0; -//} -import "C" - -import ( - "fmt" - "strings" - "time" - "unsafe" - - "github.com/Sirupsen/logrus" - "github.com/coreos/go-systemd/journal" - "github.com/docker/docker/daemon/logger" -) - -func (s *journald) Close() error { - s.readers.mu.Lock() - for reader := range s.readers.readers { - reader.Close() - } - s.readers.mu.Unlock() - return nil -} - -func (s *journald) drainJournal(logWatcher *logger.LogWatcher, config logger.ReadConfig, j *C.sd_journal, oldCursor *C.char) *C.char { - var msg, data, cursor *C.char - var length C.size_t - var stamp C.uint64_t - var priority, partial C.int - - // Walk the journal from here forward until we run out of new entries. -drain: - for { - // Try not to send a given entry twice. - if oldCursor != nil { - for C.sd_journal_test_cursor(j, oldCursor) > 0 { - if C.sd_journal_next(j) <= 0 { - break drain - } - } - } - // Read and send the logged message, if there is one to read. - i := C.get_message(j, &msg, &length, &partial) - if i != -C.ENOENT && i != -C.EADDRNOTAVAIL { - // Read the entry's timestamp. - if C.sd_journal_get_realtime_usec(j, &stamp) != 0 { - break - } - // Set up the time and text of the entry. - timestamp := time.Unix(int64(stamp)/1000000, (int64(stamp)%1000000)*1000) - line := C.GoBytes(unsafe.Pointer(msg), C.int(length)) - if partial == 0 { - line = append(line, "\n"...) - } - // Recover the stream name by mapping - // from the journal priority back to - // the stream that we would have - // assigned that value. - source := "" - if C.get_priority(j, &priority) != 0 { - source = "" - } else if priority == C.int(journal.PriErr) { - source = "stderr" - } else if priority == C.int(journal.PriInfo) { - source = "stdout" - } - // Retrieve the values of any variables we're adding to the journal. - attrs := make(map[string]string) - C.sd_journal_restart_data(j) - for C.get_attribute_field(j, &data, &length) > C.int(0) { - kv := strings.SplitN(C.GoStringN(data, C.int(length)), "=", 2) - attrs[kv[0]] = kv[1] - } - if len(attrs) == 0 { - attrs = nil - } - // Send the log message. - logWatcher.Msg <- &logger.Message{ - Line: line, - Source: source, - Timestamp: timestamp.In(time.UTC), - Attrs: attrs, - } - } - // If we're at the end of the journal, we're done (for now). - if C.sd_journal_next(j) <= 0 { - break - } - } - - // free(NULL) is safe - C.free(unsafe.Pointer(oldCursor)) - C.sd_journal_get_cursor(j, &cursor) - return cursor -} - -func (s *journald) followJournal(logWatcher *logger.LogWatcher, config logger.ReadConfig, j *C.sd_journal, pfd [2]C.int, cursor *C.char) *C.char { - s.readers.mu.Lock() - s.readers.readers[logWatcher] = logWatcher - s.readers.mu.Unlock() - go func() { - // Keep copying journal data out until we're notified to stop - // or we hit an error. - status := C.wait_for_data_cancelable(j, pfd[0]) - for status == 1 { - cursor = s.drainJournal(logWatcher, config, j, cursor) - status = C.wait_for_data_cancelable(j, pfd[0]) - } - if status < 0 { - cerrstr := C.strerror(C.int(-status)) - errstr := C.GoString(cerrstr) - fmtstr := "error %q while attempting to follow journal for container %q" - logrus.Errorf(fmtstr, errstr, s.vars["CONTAINER_ID_FULL"]) - } - // Clean up. - C.close(pfd[0]) - s.readers.mu.Lock() - delete(s.readers.readers, logWatcher) - s.readers.mu.Unlock() - C.sd_journal_close(j) - close(logWatcher.Msg) - }() - // Wait until we're told to stop. - select { - case <-logWatcher.WatchClose(): - // Notify the other goroutine that its work is done. - C.close(pfd[1]) - } - - return cursor -} - -func (s *journald) readLogs(logWatcher *logger.LogWatcher, config logger.ReadConfig) { - var j *C.sd_journal - var cmatch, cursor *C.char - var stamp C.uint64_t - var sinceUnixMicro uint64 - var pipes [2]C.int - - // Get a handle to the journal. - rc := C.sd_journal_open(&j, C.int(0)) - if rc != 0 { - logWatcher.Err <- fmt.Errorf("error opening journal") - close(logWatcher.Msg) - return - } - // If we end up following the log, we can set the journal context - // pointer and the channel pointer to nil so that we won't close them - // here, potentially while the goroutine that uses them is still - // running. Otherwise, close them when we return from this function. - following := false - defer func(pfollowing *bool) { - if !*pfollowing { - C.sd_journal_close(j) - close(logWatcher.Msg) - } - }(&following) - // Remove limits on the size of data items that we'll retrieve. - rc = C.sd_journal_set_data_threshold(j, C.size_t(0)) - if rc != 0 { - logWatcher.Err <- fmt.Errorf("error setting journal data threshold") - return - } - // Add a match to have the library do the searching for us. - cmatch = C.CString("CONTAINER_ID_FULL=" + s.vars["CONTAINER_ID_FULL"]) - defer C.free(unsafe.Pointer(cmatch)) - rc = C.sd_journal_add_match(j, unsafe.Pointer(cmatch), C.strlen(cmatch)) - if rc != 0 { - logWatcher.Err <- fmt.Errorf("error setting journal match") - return - } - // If we have a cutoff time, convert it to Unix time once. - if !config.Since.IsZero() { - nano := config.Since.UnixNano() - sinceUnixMicro = uint64(nano / 1000) - } - if config.Tail > 0 { - lines := config.Tail - // Start at the end of the journal. - if C.sd_journal_seek_tail(j) < 0 { - logWatcher.Err <- fmt.Errorf("error seeking to end of journal") - return - } - if C.sd_journal_previous(j) < 0 { - logWatcher.Err <- fmt.Errorf("error backtracking to previous journal entry") - return - } - // Walk backward. - for lines > 0 { - // Stop if the entry time is before our cutoff. - // We'll need the entry time if it isn't, so go - // ahead and parse it now. - if C.sd_journal_get_realtime_usec(j, &stamp) != 0 { - break - } else { - // Compare the timestamp on the entry - // to our threshold value. - if sinceUnixMicro != 0 && sinceUnixMicro > uint64(stamp) { - break - } - } - lines-- - // If we're at the start of the journal, or - // don't need to back up past any more entries, - // stop. - if lines == 0 || C.sd_journal_previous(j) <= 0 { - break - } - } - } else { - // Start at the beginning of the journal. - if C.sd_journal_seek_head(j) < 0 { - logWatcher.Err <- fmt.Errorf("error seeking to start of journal") - return - } - // If we have a cutoff date, fast-forward to it. - if sinceUnixMicro != 0 && C.sd_journal_seek_realtime_usec(j, C.uint64_t(sinceUnixMicro)) != 0 { - logWatcher.Err <- fmt.Errorf("error seeking to start time in journal") - return - } - if C.sd_journal_next(j) < 0 { - logWatcher.Err <- fmt.Errorf("error skipping to next journal entry") - return - } - } - cursor = s.drainJournal(logWatcher, config, j, nil) - if config.Follow { - // Allocate a descriptor for following the journal, if we'll - // need one. Do it here so that we can report if it fails. - if fd := C.sd_journal_get_fd(j); fd < C.int(0) { - logWatcher.Err <- fmt.Errorf("error opening journald follow descriptor: %q", C.GoString(C.strerror(-fd))) - } else { - // Create a pipe that we can poll at the same time as - // the journald descriptor. - if C.pipe(&pipes[0]) == C.int(-1) { - logWatcher.Err <- fmt.Errorf("error opening journald close notification pipe") - } else { - cursor = s.followJournal(logWatcher, config, j, pipes, cursor) - // Let followJournal handle freeing the journal context - // object and closing the channel. - following = true - } - } - } - - C.free(unsafe.Pointer(cursor)) - return -} - -func (s *journald) ReadLogs(config logger.ReadConfig) *logger.LogWatcher { - logWatcher := logger.NewLogWatcher() - go s.readLogs(logWatcher, config) - return logWatcher -} diff --git a/vendor/github.com/docker/docker/daemon/logger/journald/read_native.go b/vendor/github.com/docker/docker/daemon/logger/journald/read_native.go deleted file mode 100644 index bba6de55b..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/journald/read_native.go +++ /dev/null @@ -1,6 +0,0 @@ -// +build linux,cgo,!static_build,journald,!journald_compat - -package journald - -// #cgo pkg-config: libsystemd -import "C" diff --git a/vendor/github.com/docker/docker/daemon/logger/journald/read_native_compat.go b/vendor/github.com/docker/docker/daemon/logger/journald/read_native_compat.go deleted file mode 100644 index 3f7a43c59..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/journald/read_native_compat.go +++ /dev/null @@ -1,6 +0,0 @@ -// +build linux,cgo,!static_build,journald,journald_compat - -package journald - -// #cgo pkg-config: libsystemd-journal -import "C" diff --git a/vendor/github.com/docker/docker/daemon/logger/journald/read_unsupported.go b/vendor/github.com/docker/docker/daemon/logger/journald/read_unsupported.go deleted file mode 100644 index b43abdcaf..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/journald/read_unsupported.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !linux !cgo static_build !journald - -package journald - -func (s *journald) Close() error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonfilelog.go b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonfilelog.go deleted file mode 100644 index a429a08a4..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonfilelog.go +++ /dev/null @@ -1,151 +0,0 @@ -// Package jsonfilelog provides the default Logger implementation for -// Docker logging. This logger logs to files on the host server in the -// JSON format. -package jsonfilelog - -import ( - "bytes" - "encoding/json" - "fmt" - "strconv" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/daemon/logger/loggerutils" - "github.com/docker/docker/pkg/jsonlog" - "github.com/docker/go-units" -) - -// Name is the name of the file that the jsonlogger logs to. -const Name = "json-file" - -// JSONFileLogger is Logger implementation for default Docker logging. -type JSONFileLogger struct { - buf *bytes.Buffer - writer *loggerutils.RotateFileWriter - mu sync.Mutex - readers map[*logger.LogWatcher]struct{} // stores the active log followers - extra []byte // json-encoded extra attributes -} - -func init() { - if err := logger.RegisterLogDriver(Name, New); err != nil { - logrus.Fatal(err) - } - if err := logger.RegisterLogOptValidator(Name, ValidateLogOpt); err != nil { - logrus.Fatal(err) - } -} - -// New creates new JSONFileLogger which writes to filename passed in -// on given context. -func New(ctx logger.Context) (logger.Logger, error) { - var capval int64 = -1 - if capacity, ok := ctx.Config["max-size"]; ok { - var err error - capval, err = units.FromHumanSize(capacity) - if err != nil { - return nil, err - } - } - var maxFiles = 1 - if maxFileString, ok := ctx.Config["max-file"]; ok { - var err error - maxFiles, err = strconv.Atoi(maxFileString) - if err != nil { - return nil, err - } - if maxFiles < 1 { - return nil, fmt.Errorf("max-file cannot be less than 1") - } - } - - writer, err := loggerutils.NewRotateFileWriter(ctx.LogPath, capval, maxFiles) - if err != nil { - return nil, err - } - - var extra []byte - if attrs := ctx.ExtraAttributes(nil); len(attrs) > 0 { - var err error - extra, err = json.Marshal(attrs) - if err != nil { - return nil, err - } - } - - return &JSONFileLogger{ - buf: bytes.NewBuffer(nil), - writer: writer, - readers: make(map[*logger.LogWatcher]struct{}), - extra: extra, - }, nil -} - -// Log converts logger.Message to jsonlog.JSONLog and serializes it to file. -func (l *JSONFileLogger) Log(msg *logger.Message) error { - timestamp, err := jsonlog.FastTimeMarshalJSON(msg.Timestamp) - if err != nil { - return err - } - l.mu.Lock() - logline := msg.Line - if !msg.Partial { - logline = append(msg.Line, '\n') - } - err = (&jsonlog.JSONLogs{ - Log: logline, - Stream: msg.Source, - Created: timestamp, - RawAttrs: l.extra, - }).MarshalJSONBuf(l.buf) - if err != nil { - l.mu.Unlock() - return err - } - - l.buf.WriteByte('\n') - _, err = l.writer.Write(l.buf.Bytes()) - l.buf.Reset() - l.mu.Unlock() - - return err -} - -// ValidateLogOpt looks for json specific log options max-file & max-size. -func ValidateLogOpt(cfg map[string]string) error { - for key := range cfg { - switch key { - case "max-file": - case "max-size": - case "labels": - case "env": - default: - return fmt.Errorf("unknown log opt '%s' for json-file log driver", key) - } - } - return nil -} - -// LogPath returns the location the given json logger logs to. -func (l *JSONFileLogger) LogPath() string { - return l.writer.LogPath() -} - -// Close closes underlying file and signals all readers to stop. -func (l *JSONFileLogger) Close() error { - l.mu.Lock() - err := l.writer.Close() - for r := range l.readers { - r.Close() - delete(l.readers, r) - } - l.mu.Unlock() - return err -} - -// Name returns name of this logger. -func (l *JSONFileLogger) Name() string { - return Name -} diff --git a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonfilelog_test.go b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonfilelog_test.go deleted file mode 100644 index b5b818a8b..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonfilelog_test.go +++ /dev/null @@ -1,248 +0,0 @@ -package jsonfilelog - -import ( - "encoding/json" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "strconv" - "testing" - "time" - - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/pkg/jsonlog" -) - -func TestJSONFileLogger(t *testing.T) { - cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657" - tmp, err := ioutil.TempDir("", "docker-logger-") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - filename := filepath.Join(tmp, "container.log") - l, err := New(logger.Context{ - ContainerID: cid, - LogPath: filename, - }) - if err != nil { - t.Fatal(err) - } - defer l.Close() - - if err := l.Log(&logger.Message{Line: []byte("line1"), Source: "src1"}); err != nil { - t.Fatal(err) - } - if err := l.Log(&logger.Message{Line: []byte("line2"), Source: "src2"}); err != nil { - t.Fatal(err) - } - if err := l.Log(&logger.Message{Line: []byte("line3"), Source: "src3"}); err != nil { - t.Fatal(err) - } - res, err := ioutil.ReadFile(filename) - if err != nil { - t.Fatal(err) - } - expected := `{"log":"line1\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line2\n","stream":"src2","time":"0001-01-01T00:00:00Z"} -{"log":"line3\n","stream":"src3","time":"0001-01-01T00:00:00Z"} -` - - if string(res) != expected { - t.Fatalf("Wrong log content: %q, expected %q", res, expected) - } -} - -func BenchmarkJSONFileLogger(b *testing.B) { - cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657" - tmp, err := ioutil.TempDir("", "docker-logger-") - if err != nil { - b.Fatal(err) - } - defer os.RemoveAll(tmp) - filename := filepath.Join(tmp, "container.log") - l, err := New(logger.Context{ - ContainerID: cid, - LogPath: filename, - }) - if err != nil { - b.Fatal(err) - } - defer l.Close() - - testLine := "Line that thinks that it is log line from docker\n" - msg := &logger.Message{Line: []byte(testLine), Source: "stderr", Timestamp: time.Now().UTC()} - jsonlog, err := (&jsonlog.JSONLog{Log: string(msg.Line) + "\n", Stream: msg.Source, Created: msg.Timestamp}).MarshalJSON() - if err != nil { - b.Fatal(err) - } - b.SetBytes(int64(len(jsonlog)+1) * 30) - b.ResetTimer() - for i := 0; i < b.N; i++ { - for j := 0; j < 30; j++ { - if err := l.Log(msg); err != nil { - b.Fatal(err) - } - } - } -} - -func TestJSONFileLoggerWithOpts(t *testing.T) { - cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657" - tmp, err := ioutil.TempDir("", "docker-logger-") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - filename := filepath.Join(tmp, "container.log") - config := map[string]string{"max-file": "2", "max-size": "1k"} - l, err := New(logger.Context{ - ContainerID: cid, - LogPath: filename, - Config: config, - }) - if err != nil { - t.Fatal(err) - } - defer l.Close() - for i := 0; i < 20; i++ { - if err := l.Log(&logger.Message{Line: []byte("line" + strconv.Itoa(i)), Source: "src1"}); err != nil { - t.Fatal(err) - } - } - res, err := ioutil.ReadFile(filename) - if err != nil { - t.Fatal(err) - } - penUlt, err := ioutil.ReadFile(filename + ".1") - if err != nil { - t.Fatal(err) - } - - expectedPenultimate := `{"log":"line0\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line1\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line2\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line3\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line4\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line5\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line6\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line7\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line8\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line9\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line10\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line11\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line12\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line13\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line14\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line15\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -` - expected := `{"log":"line16\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line17\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line18\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -{"log":"line19\n","stream":"src1","time":"0001-01-01T00:00:00Z"} -` - - if string(res) != expected { - t.Fatalf("Wrong log content: %q, expected %q", res, expected) - } - if string(penUlt) != expectedPenultimate { - t.Fatalf("Wrong log content: %q, expected %q", penUlt, expectedPenultimate) - } - -} - -func TestJSONFileLoggerWithLabelsEnv(t *testing.T) { - cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657" - tmp, err := ioutil.TempDir("", "docker-logger-") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - filename := filepath.Join(tmp, "container.log") - config := map[string]string{"labels": "rack,dc", "env": "environ,debug,ssl"} - l, err := New(logger.Context{ - ContainerID: cid, - LogPath: filename, - Config: config, - ContainerLabels: map[string]string{"rack": "101", "dc": "lhr"}, - ContainerEnv: []string{"environ=production", "debug=false", "port=10001", "ssl=true"}, - }) - if err != nil { - t.Fatal(err) - } - defer l.Close() - if err := l.Log(&logger.Message{Line: []byte("line"), Source: "src1"}); err != nil { - t.Fatal(err) - } - res, err := ioutil.ReadFile(filename) - if err != nil { - t.Fatal(err) - } - - var jsonLog jsonlog.JSONLogs - if err := json.Unmarshal(res, &jsonLog); err != nil { - t.Fatal(err) - } - extra := make(map[string]string) - if err := json.Unmarshal(jsonLog.RawAttrs, &extra); err != nil { - t.Fatal(err) - } - expected := map[string]string{ - "rack": "101", - "dc": "lhr", - "environ": "production", - "debug": "false", - "ssl": "true", - } - if !reflect.DeepEqual(extra, expected) { - t.Fatalf("Wrong log attrs: %q, expected %q", extra, expected) - } -} - -func BenchmarkJSONFileLoggerWithReader(b *testing.B) { - b.StopTimer() - b.ResetTimer() - cid := "a7317399f3f857173c6179d44823594f8294678dea9999662e5c625b5a1c7657" - dir, err := ioutil.TempDir("", "json-logger-bench") - if err != nil { - b.Fatal(err) - } - defer os.RemoveAll(dir) - - l, err := New(logger.Context{ - ContainerID: cid, - LogPath: filepath.Join(dir, "container.log"), - }) - if err != nil { - b.Fatal(err) - } - defer l.Close() - msg := &logger.Message{Line: []byte("line"), Source: "src1"} - jsonlog, err := (&jsonlog.JSONLog{Log: string(msg.Line) + "\n", Stream: msg.Source, Created: msg.Timestamp}).MarshalJSON() - if err != nil { - b.Fatal(err) - } - b.SetBytes(int64(len(jsonlog)+1) * 30) - - b.StartTimer() - - go func() { - for i := 0; i < b.N; i++ { - for j := 0; j < 30; j++ { - l.Log(msg) - } - } - l.Close() - }() - - lw := l.(logger.LogReader).ReadLogs(logger.ReadConfig{Follow: true}) - watchClose := lw.WatchClose() - for { - select { - case <-lw.Msg: - case <-watchClose: - return - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/read.go b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/read.go deleted file mode 100644 index f2f9df188..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/read.go +++ /dev/null @@ -1,319 +0,0 @@ -package jsonfilelog - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "io" - "os" - "time" - - "github.com/fsnotify/fsnotify" - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/pkg/filenotify" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/jsonlog" - "github.com/docker/docker/pkg/tailfile" -) - -const maxJSONDecodeRetry = 20000 - -func decodeLogLine(dec *json.Decoder, l *jsonlog.JSONLog) (*logger.Message, error) { - l.Reset() - if err := dec.Decode(l); err != nil { - return nil, err - } - msg := &logger.Message{ - Source: l.Stream, - Timestamp: l.Created, - Line: []byte(l.Log), - Attrs: l.Attrs, - } - return msg, nil -} - -// ReadLogs implements the logger's LogReader interface for the logs -// created by this driver. -func (l *JSONFileLogger) ReadLogs(config logger.ReadConfig) *logger.LogWatcher { - logWatcher := logger.NewLogWatcher() - - go l.readLogs(logWatcher, config) - return logWatcher -} - -func (l *JSONFileLogger) readLogs(logWatcher *logger.LogWatcher, config logger.ReadConfig) { - defer close(logWatcher.Msg) - - // lock so the read stream doesn't get corrupted due to rotations or other log data written while we read - // This will block writes!!! - l.mu.Lock() - - pth := l.writer.LogPath() - var files []io.ReadSeeker - for i := l.writer.MaxFiles(); i > 1; i-- { - f, err := os.Open(fmt.Sprintf("%s.%d", pth, i-1)) - if err != nil { - if !os.IsNotExist(err) { - logWatcher.Err <- err - break - } - continue - } - defer f.Close() - - files = append(files, f) - } - - latestFile, err := os.Open(pth) - if err != nil { - logWatcher.Err <- err - l.mu.Unlock() - return - } - defer latestFile.Close() - - if config.Tail != 0 { - tailer := ioutils.MultiReadSeeker(append(files, latestFile)...) - tailFile(tailer, logWatcher, config.Tail, config.Since) - } - - // close all the rotated files - for _, f := range files { - if err := f.(io.Closer).Close(); err != nil { - logrus.WithField("logger", "json-file").Warnf("error closing tailed log file: %v", err) - } - } - - if !config.Follow { - if err := latestFile.Close(); err != nil { - logrus.Errorf("Error closing file: %v", err) - } - l.mu.Unlock() - return - } - - if config.Tail >= 0 { - latestFile.Seek(0, os.SEEK_END) - } - - l.readers[logWatcher] = struct{}{} - l.mu.Unlock() - - notifyRotate := l.writer.NotifyRotate() - followLogs(latestFile, logWatcher, notifyRotate, config.Since) - - l.mu.Lock() - delete(l.readers, logWatcher) - l.mu.Unlock() - - l.writer.NotifyRotateEvict(notifyRotate) -} - -func tailFile(f io.ReadSeeker, logWatcher *logger.LogWatcher, tail int, since time.Time) { - var rdr io.Reader - rdr = f - if tail > 0 { - ls, err := tailfile.TailFile(f, tail) - if err != nil { - logWatcher.Err <- err - return - } - rdr = bytes.NewBuffer(bytes.Join(ls, []byte("\n"))) - } - dec := json.NewDecoder(rdr) - l := &jsonlog.JSONLog{} - for { - msg, err := decodeLogLine(dec, l) - if err != nil { - if err != io.EOF { - logWatcher.Err <- err - } - return - } - if !since.IsZero() && msg.Timestamp.Before(since) { - continue - } - logWatcher.Msg <- msg - } -} - -func watchFile(name string) (filenotify.FileWatcher, error) { - fileWatcher, err := filenotify.New() - if err != nil { - return nil, err - } - - if err := fileWatcher.Add(name); err != nil { - logrus.WithField("logger", "json-file").Warnf("falling back to file poller due to error: %v", err) - fileWatcher.Close() - fileWatcher = filenotify.NewPollingWatcher() - - if err := fileWatcher.Add(name); err != nil { - fileWatcher.Close() - logrus.Debugf("error watching log file for modifications: %v", err) - return nil, err - } - } - return fileWatcher, nil -} - -func followLogs(f *os.File, logWatcher *logger.LogWatcher, notifyRotate chan interface{}, since time.Time) { - dec := json.NewDecoder(f) - l := &jsonlog.JSONLog{} - - name := f.Name() - fileWatcher, err := watchFile(name) - if err != nil { - logWatcher.Err <- err - return - } - defer func() { - f.Close() - fileWatcher.Remove(name) - fileWatcher.Close() - }() - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - go func() { - select { - case <-logWatcher.WatchClose(): - fileWatcher.Remove(name) - cancel() - case <-ctx.Done(): - return - } - }() - - var retries int - handleRotate := func() error { - f.Close() - fileWatcher.Remove(name) - - // retry when the file doesn't exist - for retries := 0; retries <= 5; retries++ { - f, err = os.Open(name) - if err == nil || !os.IsNotExist(err) { - break - } - } - if err != nil { - return err - } - if err := fileWatcher.Add(name); err != nil { - return err - } - dec = json.NewDecoder(f) - return nil - } - - errRetry := errors.New("retry") - errDone := errors.New("done") - waitRead := func() error { - select { - case e := <-fileWatcher.Events(): - switch e.Op { - case fsnotify.Write: - dec = json.NewDecoder(f) - return nil - case fsnotify.Rename, fsnotify.Remove: - select { - case <-notifyRotate: - case <-ctx.Done(): - return errDone - } - if err := handleRotate(); err != nil { - return err - } - return nil - } - return errRetry - case err := <-fileWatcher.Errors(): - logrus.Debug("logger got error watching file: %v", err) - // Something happened, let's try and stay alive and create a new watcher - if retries <= 5 { - fileWatcher.Close() - fileWatcher, err = watchFile(name) - if err != nil { - return err - } - retries++ - return errRetry - } - return err - case <-ctx.Done(): - return errDone - } - } - - handleDecodeErr := func(err error) error { - if err == io.EOF { - for err := waitRead(); err != nil; { - if err == errRetry { - // retry the waitRead - continue - } - return err - } - return nil - } - // try again because this shouldn't happen - if _, ok := err.(*json.SyntaxError); ok && retries <= maxJSONDecodeRetry { - dec = json.NewDecoder(f) - retries++ - return nil - } - // io.ErrUnexpectedEOF is returned from json.Decoder when there is - // remaining data in the parser's buffer while an io.EOF occurs. - // If the json logger writes a partial json log entry to the disk - // while at the same time the decoder tries to decode it, the race condition happens. - if err == io.ErrUnexpectedEOF && retries <= maxJSONDecodeRetry { - reader := io.MultiReader(dec.Buffered(), f) - dec = json.NewDecoder(reader) - retries++ - return nil - } - return err - } - - // main loop - for { - msg, err := decodeLogLine(dec, l) - if err != nil { - if err := handleDecodeErr(err); err != nil { - if err == errDone { - return - } - // we got an unrecoverable error, so return - logWatcher.Err <- err - return - } - // ready to try again - continue - } - - retries = 0 // reset retries since we've succeeded - if !since.IsZero() && msg.Timestamp.Before(since) { - continue - } - select { - case logWatcher.Msg <- msg: - case <-ctx.Done(): - logWatcher.Msg <- msg - for { - msg, err := decodeLogLine(dec, l) - if err != nil { - return - } - if !since.IsZero() && msg.Timestamp.Before(since) { - continue - } - logWatcher.Msg <- msg - } - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/logger/logentries/logentries.go b/vendor/github.com/docker/docker/daemon/logger/logentries/logentries.go deleted file mode 100644 index e794b1ed0..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/logentries/logentries.go +++ /dev/null @@ -1,94 +0,0 @@ -// Package logentries provides the log driver for forwarding server logs -// to logentries endpoints. -package logentries - -import ( - "fmt" - - "github.com/Sirupsen/logrus" - "github.com/bsphere/le_go" - "github.com/docker/docker/daemon/logger" -) - -type logentries struct { - tag string - containerID string - containerName string - writer *le_go.Logger - extra map[string]string -} - -const ( - name = "logentries" - token = "logentries-token" -) - -func init() { - if err := logger.RegisterLogDriver(name, New); err != nil { - logrus.Fatal(err) - } - if err := logger.RegisterLogOptValidator(name, ValidateLogOpt); err != nil { - logrus.Fatal(err) - } -} - -// New creates a logentries logger using the configuration passed in on -// the context. The supported context configuration variable is -// logentries-token. -func New(ctx logger.Context) (logger.Logger, error) { - logrus.WithField("container", ctx.ContainerID). - WithField("token", ctx.Config[token]). - Debug("logging driver logentries configured") - - log, err := le_go.Connect(ctx.Config[token]) - if err != nil { - return nil, err - } - return &logentries{ - containerID: ctx.ContainerID, - containerName: ctx.ContainerName, - writer: log, - }, nil -} - -func (f *logentries) Log(msg *logger.Message) error { - data := map[string]string{ - "container_id": f.containerID, - "container_name": f.containerName, - "source": msg.Source, - "log": string(msg.Line), - } - for k, v := range f.extra { - data[k] = v - } - f.writer.Println(f.tag, msg.Timestamp, data) - return nil -} - -func (f *logentries) Close() error { - return f.writer.Close() -} - -func (f *logentries) Name() string { - return name -} - -// ValidateLogOpt looks for logentries specific log option logentries-address. -func ValidateLogOpt(cfg map[string]string) error { - for key := range cfg { - switch key { - case "env": - case "labels": - case "tag": - case key: - default: - return fmt.Errorf("unknown log opt '%s' for logentries log driver", key) - } - } - - if cfg[token] == "" { - return fmt.Errorf("Missing logentries token") - } - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/logger/logger.go b/vendor/github.com/docker/docker/daemon/logger/logger.go deleted file mode 100644 index d09199735..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/logger.go +++ /dev/null @@ -1,134 +0,0 @@ -// Package logger defines interfaces that logger drivers implement to -// log messages. -// -// The other half of a logger driver is the implementation of the -// factory, which holds the contextual instance information that -// allows multiple loggers of the same type to perform different -// actions, such as logging to different locations. -package logger - -import ( - "errors" - "sort" - "strings" - "sync" - "time" - - "github.com/docker/docker/pkg/jsonlog" -) - -// ErrReadLogsNotSupported is returned when the logger does not support reading logs. -var ErrReadLogsNotSupported = errors.New("configured logging reader does not support reading") - -const ( - // TimeFormat is the time format used for timestamps sent to log readers. - TimeFormat = jsonlog.RFC3339NanoFixed - logWatcherBufferSize = 4096 -) - -// Message is datastructure that represents piece of output produced by some -// container. The Line member is a slice of an array whose contents can be -// changed after a log driver's Log() method returns. -type Message struct { - Line []byte - Source string - Timestamp time.Time - Attrs LogAttributes - Partial bool -} - -// CopyMessage creates a copy of the passed-in Message which will remain -// unchanged if the original is changed. Log drivers which buffer Messages -// rather than dispatching them during their Log() method should use this -// function to obtain a Message whose Line member's contents won't change. -func CopyMessage(msg *Message) *Message { - m := new(Message) - m.Line = make([]byte, len(msg.Line)) - copy(m.Line, msg.Line) - m.Source = msg.Source - m.Timestamp = msg.Timestamp - m.Partial = msg.Partial - m.Attrs = make(LogAttributes) - for k, v := range msg.Attrs { - m.Attrs[k] = v - } - return m -} - -// LogAttributes is used to hold the extra attributes available in the log message -// Primarily used for converting the map type to string and sorting. -type LogAttributes map[string]string -type byKey []string - -func (s byKey) Len() int { return len(s) } -func (s byKey) Less(i, j int) bool { - keyI := strings.Split(s[i], "=") - keyJ := strings.Split(s[j], "=") - return keyI[0] < keyJ[0] -} -func (s byKey) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func (a LogAttributes) String() string { - var ss byKey - for k, v := range a { - ss = append(ss, k+"="+v) - } - sort.Sort(ss) - return strings.Join(ss, ",") -} - -// Logger is the interface for docker logging drivers. -type Logger interface { - Log(*Message) error - Name() string - Close() error -} - -// ReadConfig is the configuration passed into ReadLogs. -type ReadConfig struct { - Since time.Time - Tail int - Follow bool -} - -// LogReader is the interface for reading log messages for loggers that support reading. -type LogReader interface { - // Read logs from underlying logging backend - ReadLogs(ReadConfig) *LogWatcher -} - -// LogWatcher is used when consuming logs read from the LogReader interface. -type LogWatcher struct { - // For sending log messages to a reader. - Msg chan *Message - // For sending error messages that occur while while reading logs. - Err chan error - closeOnce sync.Once - closeNotifier chan struct{} -} - -// NewLogWatcher returns a new LogWatcher. -func NewLogWatcher() *LogWatcher { - return &LogWatcher{ - Msg: make(chan *Message, logWatcherBufferSize), - Err: make(chan error, 1), - closeNotifier: make(chan struct{}), - } -} - -// Close notifies the underlying log reader to stop. -func (w *LogWatcher) Close() { - // only close if not already closed - w.closeOnce.Do(func() { - close(w.closeNotifier) - }) -} - -// WatchClose returns a channel receiver that receives notification -// when the watcher has been closed. This should only be called from -// one goroutine. -func (w *LogWatcher) WatchClose() <-chan struct{} { - return w.closeNotifier -} diff --git a/vendor/github.com/docker/docker/daemon/logger/logger_test.go b/vendor/github.com/docker/docker/daemon/logger/logger_test.go deleted file mode 100644 index 16e1514d2..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/logger_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package logger - -import ( - "reflect" - "testing" - "time" -) - -func TestCopyMessage(t *testing.T) { - msg := &Message{ - Line: []byte("test line."), - Source: "stdout", - Timestamp: time.Now(), - Attrs: LogAttributes{ - "key1": "val1", - "key2": "val2", - "key3": "val3", - }, - Partial: true, - } - - m := CopyMessage(msg) - if !reflect.DeepEqual(m, msg) { - t.Fatalf("CopyMessage failed to copy message") - } -} diff --git a/vendor/github.com/docker/docker/daemon/logger/loggerutils/log_tag.go b/vendor/github.com/docker/docker/daemon/logger/loggerutils/log_tag.go deleted file mode 100644 index 4752679c7..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/loggerutils/log_tag.go +++ /dev/null @@ -1,31 +0,0 @@ -package loggerutils - -import ( - "bytes" - - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/utils/templates" -) - -// DefaultTemplate defines the defaults template logger should use. -const DefaultTemplate = "{{.ID}}" - -// ParseLogTag generates a context aware tag for consistency across different -// log drivers based on the context of the running container. -func ParseLogTag(ctx logger.Context, defaultTemplate string) (string, error) { - tagTemplate := ctx.Config["tag"] - if tagTemplate == "" { - tagTemplate = defaultTemplate - } - - tmpl, err := templates.NewParse("log-tag", tagTemplate) - if err != nil { - return "", err - } - buf := new(bytes.Buffer) - if err := tmpl.Execute(buf, &ctx); err != nil { - return "", err - } - - return buf.String(), nil -} diff --git a/vendor/github.com/docker/docker/daemon/logger/loggerutils/log_tag_test.go b/vendor/github.com/docker/docker/daemon/logger/loggerutils/log_tag_test.go deleted file mode 100644 index e2aa4358a..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/loggerutils/log_tag_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package loggerutils - -import ( - "testing" - - "github.com/docker/docker/daemon/logger" -) - -func TestParseLogTagDefaultTag(t *testing.T) { - ctx := buildContext(map[string]string{}) - tag, e := ParseLogTag(ctx, "{{.ID}}") - assertTag(t, e, tag, ctx.ID()) -} - -func TestParseLogTag(t *testing.T) { - ctx := buildContext(map[string]string{"tag": "{{.ImageName}}/{{.Name}}/{{.ID}}"}) - tag, e := ParseLogTag(ctx, "{{.ID}}") - assertTag(t, e, tag, "test-image/test-container/container-ab") -} - -func TestParseLogTagEmptyTag(t *testing.T) { - ctx := buildContext(map[string]string{}) - tag, e := ParseLogTag(ctx, "{{.DaemonName}}/{{.ID}}") - assertTag(t, e, tag, "test-dockerd/container-ab") -} - -// Helpers - -func buildContext(cfg map[string]string) logger.Context { - return logger.Context{ - ContainerID: "container-abcdefghijklmnopqrstuvwxyz01234567890", - ContainerName: "/test-container", - ContainerImageID: "image-abcdefghijklmnopqrstuvwxyz01234567890", - ContainerImageName: "test-image", - Config: cfg, - DaemonName: "test-dockerd", - } -} - -func assertTag(t *testing.T, e error, tag string, expected string) { - if e != nil { - t.Fatalf("Error generating tag: %q", e) - } - if tag != expected { - t.Fatalf("Wrong tag: %q, should be %q", tag, expected) - } -} diff --git a/vendor/github.com/docker/docker/daemon/logger/loggerutils/rotatefilewriter.go b/vendor/github.com/docker/docker/daemon/logger/loggerutils/rotatefilewriter.go deleted file mode 100644 index 99e0964ae..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/loggerutils/rotatefilewriter.go +++ /dev/null @@ -1,124 +0,0 @@ -package loggerutils - -import ( - "os" - "strconv" - "sync" - - "github.com/docker/docker/pkg/pubsub" -) - -// RotateFileWriter is Logger implementation for default Docker logging. -type RotateFileWriter struct { - f *os.File // store for closing - mu sync.Mutex - capacity int64 //maximum size of each file - currentSize int64 // current size of the latest file - maxFiles int //maximum number of files - notifyRotate *pubsub.Publisher -} - -//NewRotateFileWriter creates new RotateFileWriter -func NewRotateFileWriter(logPath string, capacity int64, maxFiles int) (*RotateFileWriter, error) { - log, err := os.OpenFile(logPath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0640) - if err != nil { - return nil, err - } - - size, err := log.Seek(0, os.SEEK_END) - if err != nil { - return nil, err - } - - return &RotateFileWriter{ - f: log, - capacity: capacity, - currentSize: size, - maxFiles: maxFiles, - notifyRotate: pubsub.NewPublisher(0, 1), - }, nil -} - -//WriteLog write log message to File -func (w *RotateFileWriter) Write(message []byte) (int, error) { - w.mu.Lock() - if err := w.checkCapacityAndRotate(); err != nil { - w.mu.Unlock() - return -1, err - } - - n, err := w.f.Write(message) - if err == nil { - w.currentSize += int64(n) - } - w.mu.Unlock() - return n, err -} - -func (w *RotateFileWriter) checkCapacityAndRotate() error { - if w.capacity == -1 { - return nil - } - - if w.currentSize >= w.capacity { - name := w.f.Name() - if err := w.f.Close(); err != nil { - return err - } - if err := rotate(name, w.maxFiles); err != nil { - return err - } - file, err := os.OpenFile(name, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 06400) - if err != nil { - return err - } - w.f = file - w.currentSize = 0 - w.notifyRotate.Publish(struct{}{}) - } - - return nil -} - -func rotate(name string, maxFiles int) error { - if maxFiles < 2 { - return nil - } - for i := maxFiles - 1; i > 1; i-- { - toPath := name + "." + strconv.Itoa(i) - fromPath := name + "." + strconv.Itoa(i-1) - if err := os.Rename(fromPath, toPath); err != nil && !os.IsNotExist(err) { - return err - } - } - - if err := os.Rename(name, name+".1"); err != nil && !os.IsNotExist(err) { - return err - } - return nil -} - -// LogPath returns the location the given writer logs to. -func (w *RotateFileWriter) LogPath() string { - return w.f.Name() -} - -// MaxFiles return maximum number of files -func (w *RotateFileWriter) MaxFiles() int { - return w.maxFiles -} - -//NotifyRotate returns the new subscriber -func (w *RotateFileWriter) NotifyRotate() chan interface{} { - return w.notifyRotate.Subscribe() -} - -//NotifyRotateEvict removes the specified subscriber from receiving any more messages. -func (w *RotateFileWriter) NotifyRotateEvict(sub chan interface{}) { - w.notifyRotate.Evict(sub) -} - -// Close closes underlying file and signals all readers to stop. -func (w *RotateFileWriter) Close() error { - return w.f.Close() -} diff --git a/vendor/github.com/docker/docker/daemon/logger/splunk/splunk.go b/vendor/github.com/docker/docker/daemon/logger/splunk/splunk.go deleted file mode 100644 index f85832681..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/splunk/splunk.go +++ /dev/null @@ -1,621 +0,0 @@ -// Package splunk provides the log driver for forwarding server logs to -// Splunk HTTP Event Collector endpoint. -package splunk - -import ( - "bytes" - "compress/gzip" - "crypto/tls" - "crypto/x509" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "os" - "strconv" - "sync" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/daemon/logger/loggerutils" - "github.com/docker/docker/pkg/urlutil" -) - -const ( - driverName = "splunk" - splunkURLKey = "splunk-url" - splunkTokenKey = "splunk-token" - splunkSourceKey = "splunk-source" - splunkSourceTypeKey = "splunk-sourcetype" - splunkIndexKey = "splunk-index" - splunkCAPathKey = "splunk-capath" - splunkCANameKey = "splunk-caname" - splunkInsecureSkipVerifyKey = "splunk-insecureskipverify" - splunkFormatKey = "splunk-format" - splunkVerifyConnectionKey = "splunk-verify-connection" - splunkGzipCompressionKey = "splunk-gzip" - splunkGzipCompressionLevelKey = "splunk-gzip-level" - envKey = "env" - labelsKey = "labels" - tagKey = "tag" -) - -const ( - // How often do we send messages (if we are not reaching batch size) - defaultPostMessagesFrequency = 5 * time.Second - // How big can be batch of messages - defaultPostMessagesBatchSize = 1000 - // Maximum number of messages we can store in buffer - defaultBufferMaximum = 10 * defaultPostMessagesBatchSize - // Number of messages allowed to be queued in the channel - defaultStreamChannelSize = 4 * defaultPostMessagesBatchSize -) - -const ( - envVarPostMessagesFrequency = "SPLUNK_LOGGING_DRIVER_POST_MESSAGES_FREQUENCY" - envVarPostMessagesBatchSize = "SPLUNK_LOGGING_DRIVER_POST_MESSAGES_BATCH_SIZE" - envVarBufferMaximum = "SPLUNK_LOGGING_DRIVER_BUFFER_MAX" - envVarStreamChannelSize = "SPLUNK_LOGGING_DRIVER_CHANNEL_SIZE" -) - -type splunkLoggerInterface interface { - logger.Logger - worker() -} - -type splunkLogger struct { - client *http.Client - transport *http.Transport - - url string - auth string - nullMessage *splunkMessage - - // http compression - gzipCompression bool - gzipCompressionLevel int - - // Advanced options - postMessagesFrequency time.Duration - postMessagesBatchSize int - bufferMaximum int - - // For synchronization between background worker and logger. - // We use channel to send messages to worker go routine. - // All other variables for blocking Close call before we flush all messages to HEC - stream chan *splunkMessage - lock sync.RWMutex - closed bool - closedCond *sync.Cond -} - -type splunkLoggerInline struct { - *splunkLogger - - nullEvent *splunkMessageEvent -} - -type splunkLoggerJSON struct { - *splunkLoggerInline -} - -type splunkLoggerRaw struct { - *splunkLogger - - prefix []byte -} - -type splunkMessage struct { - Event interface{} `json:"event"` - Time string `json:"time"` - Host string `json:"host"` - Source string `json:"source,omitempty"` - SourceType string `json:"sourcetype,omitempty"` - Index string `json:"index,omitempty"` -} - -type splunkMessageEvent struct { - Line interface{} `json:"line"` - Source string `json:"source"` - Tag string `json:"tag,omitempty"` - Attrs map[string]string `json:"attrs,omitempty"` -} - -const ( - splunkFormatRaw = "raw" - splunkFormatJSON = "json" - splunkFormatInline = "inline" -) - -func init() { - if err := logger.RegisterLogDriver(driverName, New); err != nil { - logrus.Fatal(err) - } - if err := logger.RegisterLogOptValidator(driverName, ValidateLogOpt); err != nil { - logrus.Fatal(err) - } -} - -// New creates splunk logger driver using configuration passed in context -func New(ctx logger.Context) (logger.Logger, error) { - hostname, err := ctx.Hostname() - if err != nil { - return nil, fmt.Errorf("%s: cannot access hostname to set source field", driverName) - } - - // Parse and validate Splunk URL - splunkURL, err := parseURL(ctx) - if err != nil { - return nil, err - } - - // Splunk Token is required parameter - splunkToken, ok := ctx.Config[splunkTokenKey] - if !ok { - return nil, fmt.Errorf("%s: %s is expected", driverName, splunkTokenKey) - } - - tlsConfig := &tls.Config{} - - // Splunk is using autogenerated certificates by default, - // allow users to trust them with skipping verification - if insecureSkipVerifyStr, ok := ctx.Config[splunkInsecureSkipVerifyKey]; ok { - insecureSkipVerify, err := strconv.ParseBool(insecureSkipVerifyStr) - if err != nil { - return nil, err - } - tlsConfig.InsecureSkipVerify = insecureSkipVerify - } - - // If path to the root certificate is provided - load it - if caPath, ok := ctx.Config[splunkCAPathKey]; ok { - caCert, err := ioutil.ReadFile(caPath) - if err != nil { - return nil, err - } - caPool := x509.NewCertPool() - caPool.AppendCertsFromPEM(caCert) - tlsConfig.RootCAs = caPool - } - - if caName, ok := ctx.Config[splunkCANameKey]; ok { - tlsConfig.ServerName = caName - } - - gzipCompression := false - if gzipCompressionStr, ok := ctx.Config[splunkGzipCompressionKey]; ok { - gzipCompression, err = strconv.ParseBool(gzipCompressionStr) - if err != nil { - return nil, err - } - } - - gzipCompressionLevel := gzip.DefaultCompression - if gzipCompressionLevelStr, ok := ctx.Config[splunkGzipCompressionLevelKey]; ok { - var err error - gzipCompressionLevel64, err := strconv.ParseInt(gzipCompressionLevelStr, 10, 32) - if err != nil { - return nil, err - } - gzipCompressionLevel = int(gzipCompressionLevel64) - if gzipCompressionLevel < gzip.DefaultCompression || gzipCompressionLevel > gzip.BestCompression { - err := fmt.Errorf("Not supported level '%s' for %s (supported values between %d and %d).", - gzipCompressionLevelStr, splunkGzipCompressionLevelKey, gzip.DefaultCompression, gzip.BestCompression) - return nil, err - } - } - - transport := &http.Transport{ - TLSClientConfig: tlsConfig, - } - client := &http.Client{ - Transport: transport, - } - - source := ctx.Config[splunkSourceKey] - sourceType := ctx.Config[splunkSourceTypeKey] - index := ctx.Config[splunkIndexKey] - - var nullMessage = &splunkMessage{ - Host: hostname, - Source: source, - SourceType: sourceType, - Index: index, - } - - // Allow user to remove tag from the messages by setting tag to empty string - tag := "" - if tagTemplate, ok := ctx.Config[tagKey]; !ok || tagTemplate != "" { - tag, err = loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) - if err != nil { - return nil, err - } - } - - attrs := ctx.ExtraAttributes(nil) - - var ( - postMessagesFrequency = getAdvancedOptionDuration(envVarPostMessagesFrequency, defaultPostMessagesFrequency) - postMessagesBatchSize = getAdvancedOptionInt(envVarPostMessagesBatchSize, defaultPostMessagesBatchSize) - bufferMaximum = getAdvancedOptionInt(envVarBufferMaximum, defaultBufferMaximum) - streamChannelSize = getAdvancedOptionInt(envVarStreamChannelSize, defaultStreamChannelSize) - ) - - logger := &splunkLogger{ - client: client, - transport: transport, - url: splunkURL.String(), - auth: "Splunk " + splunkToken, - nullMessage: nullMessage, - gzipCompression: gzipCompression, - gzipCompressionLevel: gzipCompressionLevel, - stream: make(chan *splunkMessage, streamChannelSize), - postMessagesFrequency: postMessagesFrequency, - postMessagesBatchSize: postMessagesBatchSize, - bufferMaximum: bufferMaximum, - } - - // By default we verify connection, but we allow use to skip that - verifyConnection := true - if verifyConnectionStr, ok := ctx.Config[splunkVerifyConnectionKey]; ok { - var err error - verifyConnection, err = strconv.ParseBool(verifyConnectionStr) - if err != nil { - return nil, err - } - } - if verifyConnection { - err = verifySplunkConnection(logger) - if err != nil { - return nil, err - } - } - - var splunkFormat string - if splunkFormatParsed, ok := ctx.Config[splunkFormatKey]; ok { - switch splunkFormatParsed { - case splunkFormatInline: - case splunkFormatJSON: - case splunkFormatRaw: - default: - return nil, fmt.Errorf("Unknown format specified %s, supported formats are inline, json and raw", splunkFormat) - } - splunkFormat = splunkFormatParsed - } else { - splunkFormat = splunkFormatInline - } - - var loggerWrapper splunkLoggerInterface - - switch splunkFormat { - case splunkFormatInline: - nullEvent := &splunkMessageEvent{ - Tag: tag, - Attrs: attrs, - } - - loggerWrapper = &splunkLoggerInline{logger, nullEvent} - case splunkFormatJSON: - nullEvent := &splunkMessageEvent{ - Tag: tag, - Attrs: attrs, - } - - loggerWrapper = &splunkLoggerJSON{&splunkLoggerInline{logger, nullEvent}} - case splunkFormatRaw: - var prefix bytes.Buffer - if tag != "" { - prefix.WriteString(tag) - prefix.WriteString(" ") - } - for key, value := range attrs { - prefix.WriteString(key) - prefix.WriteString("=") - prefix.WriteString(value) - prefix.WriteString(" ") - } - - loggerWrapper = &splunkLoggerRaw{logger, prefix.Bytes()} - default: - return nil, fmt.Errorf("Unexpected format %s", splunkFormat) - } - - go loggerWrapper.worker() - - return loggerWrapper, nil -} - -func (l *splunkLoggerInline) Log(msg *logger.Message) error { - message := l.createSplunkMessage(msg) - - event := *l.nullEvent - event.Line = string(msg.Line) - event.Source = msg.Source - - message.Event = &event - - return l.queueMessageAsync(message) -} - -func (l *splunkLoggerJSON) Log(msg *logger.Message) error { - message := l.createSplunkMessage(msg) - event := *l.nullEvent - - var rawJSONMessage json.RawMessage - if err := json.Unmarshal(msg.Line, &rawJSONMessage); err == nil { - event.Line = &rawJSONMessage - } else { - event.Line = string(msg.Line) - } - - event.Source = msg.Source - - message.Event = &event - - return l.queueMessageAsync(message) -} - -func (l *splunkLoggerRaw) Log(msg *logger.Message) error { - message := l.createSplunkMessage(msg) - - message.Event = string(append(l.prefix, msg.Line...)) - - return l.queueMessageAsync(message) -} - -func (l *splunkLogger) queueMessageAsync(message *splunkMessage) error { - l.lock.RLock() - defer l.lock.RUnlock() - if l.closedCond != nil { - return fmt.Errorf("%s: driver is closed", driverName) - } - l.stream <- message - return nil -} - -func (l *splunkLogger) worker() { - timer := time.NewTicker(l.postMessagesFrequency) - var messages []*splunkMessage - for { - select { - case message, open := <-l.stream: - if !open { - l.postMessages(messages, true) - l.lock.Lock() - defer l.lock.Unlock() - l.transport.CloseIdleConnections() - l.closed = true - l.closedCond.Signal() - return - } - messages = append(messages, message) - // Only sending when we get exactly to the batch size, - // This also helps not to fire postMessages on every new message, - // when previous try failed. - if len(messages)%l.postMessagesBatchSize == 0 { - messages = l.postMessages(messages, false) - } - case <-timer.C: - messages = l.postMessages(messages, false) - } - } -} - -func (l *splunkLogger) postMessages(messages []*splunkMessage, lastChance bool) []*splunkMessage { - messagesLen := len(messages) - for i := 0; i < messagesLen; i += l.postMessagesBatchSize { - upperBound := i + l.postMessagesBatchSize - if upperBound > messagesLen { - upperBound = messagesLen - } - if err := l.tryPostMessages(messages[i:upperBound]); err != nil { - logrus.Error(err) - if messagesLen-i >= l.bufferMaximum || lastChance { - // If this is last chance - print them all to the daemon log - if lastChance { - upperBound = messagesLen - } - // Not all sent, but buffer has got to its maximum, let's log all messages - // we could not send and return buffer minus one batch size - for j := i; j < upperBound; j++ { - if jsonEvent, err := json.Marshal(messages[j]); err != nil { - logrus.Error(err) - } else { - logrus.Error(fmt.Errorf("Failed to send a message '%s'", string(jsonEvent))) - } - } - return messages[upperBound:messagesLen] - } - // Not all sent, returning buffer from where we have not sent messages - return messages[i:messagesLen] - } - } - // All sent, return empty buffer - return messages[:0] -} - -func (l *splunkLogger) tryPostMessages(messages []*splunkMessage) error { - if len(messages) == 0 { - return nil - } - var buffer bytes.Buffer - var writer io.Writer - var gzipWriter *gzip.Writer - var err error - // If gzip compression is enabled - create gzip writer with specified compression - // level. If gzip compression is disabled, use standard buffer as a writer - if l.gzipCompression { - gzipWriter, err = gzip.NewWriterLevel(&buffer, l.gzipCompressionLevel) - if err != nil { - return err - } - writer = gzipWriter - } else { - writer = &buffer - } - for _, message := range messages { - jsonEvent, err := json.Marshal(message) - if err != nil { - return err - } - if _, err := writer.Write(jsonEvent); err != nil { - return err - } - } - // If gzip compression is enabled, tell it, that we are done - if l.gzipCompression { - err = gzipWriter.Close() - if err != nil { - return err - } - } - req, err := http.NewRequest("POST", l.url, bytes.NewBuffer(buffer.Bytes())) - if err != nil { - return err - } - req.Header.Set("Authorization", l.auth) - // Tell if we are sending gzip compressed body - if l.gzipCompression { - req.Header.Set("Content-Encoding", "gzip") - } - res, err := l.client.Do(req) - if err != nil { - return err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - var body []byte - body, err = ioutil.ReadAll(res.Body) - if err != nil { - return err - } - return fmt.Errorf("%s: failed to send event - %s - %s", driverName, res.Status, body) - } - io.Copy(ioutil.Discard, res.Body) - return nil -} - -func (l *splunkLogger) Close() error { - l.lock.Lock() - defer l.lock.Unlock() - if l.closedCond == nil { - l.closedCond = sync.NewCond(&l.lock) - close(l.stream) - for !l.closed { - l.closedCond.Wait() - } - } - return nil -} - -func (l *splunkLogger) Name() string { - return driverName -} - -func (l *splunkLogger) createSplunkMessage(msg *logger.Message) *splunkMessage { - message := *l.nullMessage - message.Time = fmt.Sprintf("%f", float64(msg.Timestamp.UnixNano())/float64(time.Second)) - return &message -} - -// ValidateLogOpt looks for all supported by splunk driver options -func ValidateLogOpt(cfg map[string]string) error { - for key := range cfg { - switch key { - case splunkURLKey: - case splunkTokenKey: - case splunkSourceKey: - case splunkSourceTypeKey: - case splunkIndexKey: - case splunkCAPathKey: - case splunkCANameKey: - case splunkInsecureSkipVerifyKey: - case splunkFormatKey: - case splunkVerifyConnectionKey: - case splunkGzipCompressionKey: - case splunkGzipCompressionLevelKey: - case envKey: - case labelsKey: - case tagKey: - default: - return fmt.Errorf("unknown log opt '%s' for %s log driver", key, driverName) - } - } - return nil -} - -func parseURL(ctx logger.Context) (*url.URL, error) { - splunkURLStr, ok := ctx.Config[splunkURLKey] - if !ok { - return nil, fmt.Errorf("%s: %s is expected", driverName, splunkURLKey) - } - - splunkURL, err := url.Parse(splunkURLStr) - if err != nil { - return nil, fmt.Errorf("%s: failed to parse %s as url value in %s", driverName, splunkURLStr, splunkURLKey) - } - - if !urlutil.IsURL(splunkURLStr) || - !splunkURL.IsAbs() || - (splunkURL.Path != "" && splunkURL.Path != "/") || - splunkURL.RawQuery != "" || - splunkURL.Fragment != "" { - return nil, fmt.Errorf("%s: expected format scheme://dns_name_or_ip:port for %s", driverName, splunkURLKey) - } - - splunkURL.Path = "/services/collector/event/1.0" - - return splunkURL, nil -} - -func verifySplunkConnection(l *splunkLogger) error { - req, err := http.NewRequest(http.MethodOptions, l.url, nil) - if err != nil { - return err - } - res, err := l.client.Do(req) - if err != nil { - return err - } - if res.Body != nil { - defer res.Body.Close() - } - if res.StatusCode != http.StatusOK { - var body []byte - body, err = ioutil.ReadAll(res.Body) - if err != nil { - return err - } - return fmt.Errorf("%s: failed to verify connection - %s - %s", driverName, res.Status, body) - } - return nil -} - -func getAdvancedOptionDuration(envName string, defaultValue time.Duration) time.Duration { - valueStr := os.Getenv(envName) - if valueStr == "" { - return defaultValue - } - parsedValue, err := time.ParseDuration(valueStr) - if err != nil { - logrus.Error(fmt.Sprintf("Failed to parse value of %s as duration. Using default %v. %v", envName, defaultValue, err)) - return defaultValue - } - return parsedValue -} - -func getAdvancedOptionInt(envName string, defaultValue int) int { - valueStr := os.Getenv(envName) - if valueStr == "" { - return defaultValue - } - parsedValue, err := strconv.ParseInt(valueStr, 10, 32) - if err != nil { - logrus.Error(fmt.Sprintf("Failed to parse value of %s as integer. Using default %d. %v", envName, defaultValue, err)) - return defaultValue - } - return int(parsedValue) -} diff --git a/vendor/github.com/docker/docker/daemon/logger/splunk/splunk_test.go b/vendor/github.com/docker/docker/daemon/logger/splunk/splunk_test.go deleted file mode 100644 index df74cbad5..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/splunk/splunk_test.go +++ /dev/null @@ -1,1302 +0,0 @@ -package splunk - -import ( - "compress/gzip" - "fmt" - "os" - "testing" - "time" - - "github.com/docker/docker/daemon/logger" -) - -// Validate options -func TestValidateLogOpt(t *testing.T) { - err := ValidateLogOpt(map[string]string{ - splunkURLKey: "http://127.0.0.1", - splunkTokenKey: "2160C7EF-2CE9-4307-A180-F852B99CF417", - splunkSourceKey: "mysource", - splunkSourceTypeKey: "mysourcetype", - splunkIndexKey: "myindex", - splunkCAPathKey: "/usr/cert.pem", - splunkCANameKey: "ca_name", - splunkInsecureSkipVerifyKey: "true", - splunkFormatKey: "json", - splunkVerifyConnectionKey: "true", - splunkGzipCompressionKey: "true", - splunkGzipCompressionLevelKey: "1", - envKey: "a", - labelsKey: "b", - tagKey: "c", - }) - if err != nil { - t.Fatal(err) - } - - err = ValidateLogOpt(map[string]string{ - "not-supported-option": "a", - }) - if err == nil { - t.Fatal("Expecting error on unsupported options") - } -} - -// Driver require user to specify required options -func TestNewMissedConfig(t *testing.T) { - ctx := logger.Context{ - Config: map[string]string{}, - } - _, err := New(ctx) - if err == nil { - t.Fatal("Logger driver should fail when no required parameters specified") - } -} - -// Driver require user to specify splunk-url -func TestNewMissedUrl(t *testing.T) { - ctx := logger.Context{ - Config: map[string]string{ - splunkTokenKey: "4642492F-D8BD-47F1-A005-0C08AE4657DF", - }, - } - _, err := New(ctx) - if err.Error() != "splunk: splunk-url is expected" { - t.Fatal("Logger driver should fail when no required parameters specified") - } -} - -// Driver require user to specify splunk-token -func TestNewMissedToken(t *testing.T) { - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: "http://127.0.0.1:8088", - }, - } - _, err := New(ctx) - if err.Error() != "splunk: splunk-token is expected" { - t.Fatal("Logger driver should fail when no required parameters specified") - } -} - -// Test default settings -func TestDefault(t *testing.T) { - hec := NewHTTPEventCollectorMock(t) - - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - }, - ContainerID: "containeriid", - ContainerName: "container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - hostname, err := ctx.Hostname() - if err != nil { - t.Fatal(err) - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - if loggerDriver.Name() != driverName { - t.Fatal("Unexpected logger driver name") - } - - if !hec.connectionVerified { - t.Fatal("By default connection should be verified") - } - - splunkLoggerDriver, ok := loggerDriver.(*splunkLoggerInline) - if !ok { - t.Fatal("Unexpected Splunk Logging Driver type") - } - - if splunkLoggerDriver.url != hec.URL()+"/services/collector/event/1.0" || - splunkLoggerDriver.auth != "Splunk "+hec.token || - splunkLoggerDriver.nullMessage.Host != hostname || - splunkLoggerDriver.nullMessage.Source != "" || - splunkLoggerDriver.nullMessage.SourceType != "" || - splunkLoggerDriver.nullMessage.Index != "" || - splunkLoggerDriver.gzipCompression != false || - splunkLoggerDriver.postMessagesFrequency != defaultPostMessagesFrequency || - splunkLoggerDriver.postMessagesBatchSize != defaultPostMessagesBatchSize || - splunkLoggerDriver.bufferMaximum != defaultBufferMaximum || - cap(splunkLoggerDriver.stream) != defaultStreamChannelSize { - t.Fatal("Found not default values setup in Splunk Logging Driver.") - } - - message1Time := time.Now() - if err := loggerDriver.Log(&logger.Message{[]byte("{\"a\":\"b\"}"), "stdout", message1Time, nil, false}); err != nil { - t.Fatal(err) - } - message2Time := time.Now() - if err := loggerDriver.Log(&logger.Message{[]byte("notajson"), "stdout", message2Time, nil, false}); err != nil { - t.Fatal(err) - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != 2 { - t.Fatal("Expected two messages") - } - - if *hec.gzipEnabled { - t.Fatal("Gzip should not be used") - } - - message1 := hec.messages[0] - if message1.Time != fmt.Sprintf("%f", float64(message1Time.UnixNano())/float64(time.Second)) || - message1.Host != hostname || - message1.Source != "" || - message1.SourceType != "" || - message1.Index != "" { - t.Fatalf("Unexpected values of message 1 %v", message1) - } - - if event, err := message1.EventAsMap(); err != nil { - t.Fatal(err) - } else { - if event["line"] != "{\"a\":\"b\"}" || - event["source"] != "stdout" || - event["tag"] != "containeriid" || - len(event) != 3 { - t.Fatalf("Unexpected event in message %v", event) - } - } - - message2 := hec.messages[1] - if message2.Time != fmt.Sprintf("%f", float64(message2Time.UnixNano())/float64(time.Second)) || - message2.Host != hostname || - message2.Source != "" || - message2.SourceType != "" || - message2.Index != "" { - t.Fatalf("Unexpected values of message 1 %v", message2) - } - - if event, err := message2.EventAsMap(); err != nil { - t.Fatal(err) - } else { - if event["line"] != "notajson" || - event["source"] != "stdout" || - event["tag"] != "containeriid" || - len(event) != 3 { - t.Fatalf("Unexpected event in message %v", event) - } - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } -} - -// Verify inline format with a not default settings for most of options -func TestInlineFormatWithNonDefaultOptions(t *testing.T) { - hec := NewHTTPEventCollectorMock(t) - - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - splunkSourceKey: "mysource", - splunkSourceTypeKey: "mysourcetype", - splunkIndexKey: "myindex", - splunkFormatKey: splunkFormatInline, - splunkGzipCompressionKey: "true", - tagKey: "{{.ImageName}}/{{.Name}}", - labelsKey: "a", - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - ContainerLabels: map[string]string{ - "a": "b", - }, - } - - hostname, err := ctx.Hostname() - if err != nil { - t.Fatal(err) - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - if !hec.connectionVerified { - t.Fatal("By default connection should be verified") - } - - splunkLoggerDriver, ok := loggerDriver.(*splunkLoggerInline) - if !ok { - t.Fatal("Unexpected Splunk Logging Driver type") - } - - if splunkLoggerDriver.url != hec.URL()+"/services/collector/event/1.0" || - splunkLoggerDriver.auth != "Splunk "+hec.token || - splunkLoggerDriver.nullMessage.Host != hostname || - splunkLoggerDriver.nullMessage.Source != "mysource" || - splunkLoggerDriver.nullMessage.SourceType != "mysourcetype" || - splunkLoggerDriver.nullMessage.Index != "myindex" || - splunkLoggerDriver.gzipCompression != true || - splunkLoggerDriver.gzipCompressionLevel != gzip.DefaultCompression || - splunkLoggerDriver.postMessagesFrequency != defaultPostMessagesFrequency || - splunkLoggerDriver.postMessagesBatchSize != defaultPostMessagesBatchSize || - splunkLoggerDriver.bufferMaximum != defaultBufferMaximum || - cap(splunkLoggerDriver.stream) != defaultStreamChannelSize { - t.Fatal("Values do not match configuration.") - } - - messageTime := time.Now() - if err := loggerDriver.Log(&logger.Message{[]byte("1"), "stdout", messageTime, nil, false}); err != nil { - t.Fatal(err) - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != 1 { - t.Fatal("Expected one message") - } - - if !*hec.gzipEnabled { - t.Fatal("Gzip should be used") - } - - message := hec.messages[0] - if message.Time != fmt.Sprintf("%f", float64(messageTime.UnixNano())/float64(time.Second)) || - message.Host != hostname || - message.Source != "mysource" || - message.SourceType != "mysourcetype" || - message.Index != "myindex" { - t.Fatalf("Unexpected values of message %v", message) - } - - if event, err := message.EventAsMap(); err != nil { - t.Fatal(err) - } else { - if event["line"] != "1" || - event["source"] != "stdout" || - event["tag"] != "container_image_name/container_name" || - event["attrs"].(map[string]interface{})["a"] != "b" || - len(event) != 4 { - t.Fatalf("Unexpected event in message %v", event) - } - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } -} - -// Verify JSON format -func TestJsonFormat(t *testing.T) { - hec := NewHTTPEventCollectorMock(t) - - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - splunkFormatKey: splunkFormatJSON, - splunkGzipCompressionKey: "true", - splunkGzipCompressionLevelKey: "1", - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - hostname, err := ctx.Hostname() - if err != nil { - t.Fatal(err) - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - if !hec.connectionVerified { - t.Fatal("By default connection should be verified") - } - - splunkLoggerDriver, ok := loggerDriver.(*splunkLoggerJSON) - if !ok { - t.Fatal("Unexpected Splunk Logging Driver type") - } - - if splunkLoggerDriver.url != hec.URL()+"/services/collector/event/1.0" || - splunkLoggerDriver.auth != "Splunk "+hec.token || - splunkLoggerDriver.nullMessage.Host != hostname || - splunkLoggerDriver.nullMessage.Source != "" || - splunkLoggerDriver.nullMessage.SourceType != "" || - splunkLoggerDriver.nullMessage.Index != "" || - splunkLoggerDriver.gzipCompression != true || - splunkLoggerDriver.gzipCompressionLevel != gzip.BestSpeed || - splunkLoggerDriver.postMessagesFrequency != defaultPostMessagesFrequency || - splunkLoggerDriver.postMessagesBatchSize != defaultPostMessagesBatchSize || - splunkLoggerDriver.bufferMaximum != defaultBufferMaximum || - cap(splunkLoggerDriver.stream) != defaultStreamChannelSize { - t.Fatal("Values do not match configuration.") - } - - message1Time := time.Now() - if err := loggerDriver.Log(&logger.Message{[]byte("{\"a\":\"b\"}"), "stdout", message1Time, nil, false}); err != nil { - t.Fatal(err) - } - message2Time := time.Now() - if err := loggerDriver.Log(&logger.Message{[]byte("notjson"), "stdout", message2Time, nil, false}); err != nil { - t.Fatal(err) - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != 2 { - t.Fatal("Expected two messages") - } - - message1 := hec.messages[0] - if message1.Time != fmt.Sprintf("%f", float64(message1Time.UnixNano())/float64(time.Second)) || - message1.Host != hostname || - message1.Source != "" || - message1.SourceType != "" || - message1.Index != "" { - t.Fatalf("Unexpected values of message 1 %v", message1) - } - - if event, err := message1.EventAsMap(); err != nil { - t.Fatal(err) - } else { - if event["line"].(map[string]interface{})["a"] != "b" || - event["source"] != "stdout" || - event["tag"] != "containeriid" || - len(event) != 3 { - t.Fatalf("Unexpected event in message 1 %v", event) - } - } - - message2 := hec.messages[1] - if message2.Time != fmt.Sprintf("%f", float64(message2Time.UnixNano())/float64(time.Second)) || - message2.Host != hostname || - message2.Source != "" || - message2.SourceType != "" || - message2.Index != "" { - t.Fatalf("Unexpected values of message 2 %v", message2) - } - - // If message cannot be parsed as JSON - it should be sent as a line - if event, err := message2.EventAsMap(); err != nil { - t.Fatal(err) - } else { - if event["line"] != "notjson" || - event["source"] != "stdout" || - event["tag"] != "containeriid" || - len(event) != 3 { - t.Fatalf("Unexpected event in message 2 %v", event) - } - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } -} - -// Verify raw format -func TestRawFormat(t *testing.T) { - hec := NewHTTPEventCollectorMock(t) - - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - splunkFormatKey: splunkFormatRaw, - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - hostname, err := ctx.Hostname() - if err != nil { - t.Fatal(err) - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - if !hec.connectionVerified { - t.Fatal("By default connection should be verified") - } - - splunkLoggerDriver, ok := loggerDriver.(*splunkLoggerRaw) - if !ok { - t.Fatal("Unexpected Splunk Logging Driver type") - } - - if splunkLoggerDriver.url != hec.URL()+"/services/collector/event/1.0" || - splunkLoggerDriver.auth != "Splunk "+hec.token || - splunkLoggerDriver.nullMessage.Host != hostname || - splunkLoggerDriver.nullMessage.Source != "" || - splunkLoggerDriver.nullMessage.SourceType != "" || - splunkLoggerDriver.nullMessage.Index != "" || - splunkLoggerDriver.gzipCompression != false || - splunkLoggerDriver.postMessagesFrequency != defaultPostMessagesFrequency || - splunkLoggerDriver.postMessagesBatchSize != defaultPostMessagesBatchSize || - splunkLoggerDriver.bufferMaximum != defaultBufferMaximum || - cap(splunkLoggerDriver.stream) != defaultStreamChannelSize || - string(splunkLoggerDriver.prefix) != "containeriid " { - t.Fatal("Values do not match configuration.") - } - - message1Time := time.Now() - if err := loggerDriver.Log(&logger.Message{[]byte("{\"a\":\"b\"}"), "stdout", message1Time, nil, false}); err != nil { - t.Fatal(err) - } - message2Time := time.Now() - if err := loggerDriver.Log(&logger.Message{[]byte("notjson"), "stdout", message2Time, nil, false}); err != nil { - t.Fatal(err) - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != 2 { - t.Fatal("Expected two messages") - } - - message1 := hec.messages[0] - if message1.Time != fmt.Sprintf("%f", float64(message1Time.UnixNano())/float64(time.Second)) || - message1.Host != hostname || - message1.Source != "" || - message1.SourceType != "" || - message1.Index != "" { - t.Fatalf("Unexpected values of message 1 %v", message1) - } - - if event, err := message1.EventAsString(); err != nil { - t.Fatal(err) - } else { - if event != "containeriid {\"a\":\"b\"}" { - t.Fatalf("Unexpected event in message 1 %v", event) - } - } - - message2 := hec.messages[1] - if message2.Time != fmt.Sprintf("%f", float64(message2Time.UnixNano())/float64(time.Second)) || - message2.Host != hostname || - message2.Source != "" || - message2.SourceType != "" || - message2.Index != "" { - t.Fatalf("Unexpected values of message 2 %v", message2) - } - - if event, err := message2.EventAsString(); err != nil { - t.Fatal(err) - } else { - if event != "containeriid notjson" { - t.Fatalf("Unexpected event in message 1 %v", event) - } - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } -} - -// Verify raw format with labels -func TestRawFormatWithLabels(t *testing.T) { - hec := NewHTTPEventCollectorMock(t) - - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - splunkFormatKey: splunkFormatRaw, - labelsKey: "a", - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - ContainerLabels: map[string]string{ - "a": "b", - }, - } - - hostname, err := ctx.Hostname() - if err != nil { - t.Fatal(err) - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - if !hec.connectionVerified { - t.Fatal("By default connection should be verified") - } - - splunkLoggerDriver, ok := loggerDriver.(*splunkLoggerRaw) - if !ok { - t.Fatal("Unexpected Splunk Logging Driver type") - } - - if splunkLoggerDriver.url != hec.URL()+"/services/collector/event/1.0" || - splunkLoggerDriver.auth != "Splunk "+hec.token || - splunkLoggerDriver.nullMessage.Host != hostname || - splunkLoggerDriver.nullMessage.Source != "" || - splunkLoggerDriver.nullMessage.SourceType != "" || - splunkLoggerDriver.nullMessage.Index != "" || - splunkLoggerDriver.gzipCompression != false || - splunkLoggerDriver.postMessagesFrequency != defaultPostMessagesFrequency || - splunkLoggerDriver.postMessagesBatchSize != defaultPostMessagesBatchSize || - splunkLoggerDriver.bufferMaximum != defaultBufferMaximum || - cap(splunkLoggerDriver.stream) != defaultStreamChannelSize || - string(splunkLoggerDriver.prefix) != "containeriid a=b " { - t.Fatal("Values do not match configuration.") - } - - message1Time := time.Now() - if err := loggerDriver.Log(&logger.Message{[]byte("{\"a\":\"b\"}"), "stdout", message1Time, nil, false}); err != nil { - t.Fatal(err) - } - message2Time := time.Now() - if err := loggerDriver.Log(&logger.Message{[]byte("notjson"), "stdout", message2Time, nil, false}); err != nil { - t.Fatal(err) - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != 2 { - t.Fatal("Expected two messages") - } - - message1 := hec.messages[0] - if message1.Time != fmt.Sprintf("%f", float64(message1Time.UnixNano())/float64(time.Second)) || - message1.Host != hostname || - message1.Source != "" || - message1.SourceType != "" || - message1.Index != "" { - t.Fatalf("Unexpected values of message 1 %v", message1) - } - - if event, err := message1.EventAsString(); err != nil { - t.Fatal(err) - } else { - if event != "containeriid a=b {\"a\":\"b\"}" { - t.Fatalf("Unexpected event in message 1 %v", event) - } - } - - message2 := hec.messages[1] - if message2.Time != fmt.Sprintf("%f", float64(message2Time.UnixNano())/float64(time.Second)) || - message2.Host != hostname || - message2.Source != "" || - message2.SourceType != "" || - message2.Index != "" { - t.Fatalf("Unexpected values of message 2 %v", message2) - } - - if event, err := message2.EventAsString(); err != nil { - t.Fatal(err) - } else { - if event != "containeriid a=b notjson" { - t.Fatalf("Unexpected event in message 1 %v", event) - } - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } -} - -// Verify that Splunk Logging Driver can accept tag="" which will allow to send raw messages -// in the same way we get them in stdout/stderr -func TestRawFormatWithoutTag(t *testing.T) { - hec := NewHTTPEventCollectorMock(t) - - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - splunkFormatKey: splunkFormatRaw, - tagKey: "", - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - hostname, err := ctx.Hostname() - if err != nil { - t.Fatal(err) - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - if !hec.connectionVerified { - t.Fatal("By default connection should be verified") - } - - splunkLoggerDriver, ok := loggerDriver.(*splunkLoggerRaw) - if !ok { - t.Fatal("Unexpected Splunk Logging Driver type") - } - - if splunkLoggerDriver.url != hec.URL()+"/services/collector/event/1.0" || - splunkLoggerDriver.auth != "Splunk "+hec.token || - splunkLoggerDriver.nullMessage.Host != hostname || - splunkLoggerDriver.nullMessage.Source != "" || - splunkLoggerDriver.nullMessage.SourceType != "" || - splunkLoggerDriver.nullMessage.Index != "" || - splunkLoggerDriver.gzipCompression != false || - splunkLoggerDriver.postMessagesFrequency != defaultPostMessagesFrequency || - splunkLoggerDriver.postMessagesBatchSize != defaultPostMessagesBatchSize || - splunkLoggerDriver.bufferMaximum != defaultBufferMaximum || - cap(splunkLoggerDriver.stream) != defaultStreamChannelSize || - string(splunkLoggerDriver.prefix) != "" { - t.Log(string(splunkLoggerDriver.prefix) + "a") - t.Fatal("Values do not match configuration.") - } - - message1Time := time.Now() - if err := loggerDriver.Log(&logger.Message{[]byte("{\"a\":\"b\"}"), "stdout", message1Time, nil, false}); err != nil { - t.Fatal(err) - } - message2Time := time.Now() - if err := loggerDriver.Log(&logger.Message{[]byte("notjson"), "stdout", message2Time, nil, false}); err != nil { - t.Fatal(err) - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != 2 { - t.Fatal("Expected two messages") - } - - message1 := hec.messages[0] - if message1.Time != fmt.Sprintf("%f", float64(message1Time.UnixNano())/float64(time.Second)) || - message1.Host != hostname || - message1.Source != "" || - message1.SourceType != "" || - message1.Index != "" { - t.Fatalf("Unexpected values of message 1 %v", message1) - } - - if event, err := message1.EventAsString(); err != nil { - t.Fatal(err) - } else { - if event != "{\"a\":\"b\"}" { - t.Fatalf("Unexpected event in message 1 %v", event) - } - } - - message2 := hec.messages[1] - if message2.Time != fmt.Sprintf("%f", float64(message2Time.UnixNano())/float64(time.Second)) || - message2.Host != hostname || - message2.Source != "" || - message2.SourceType != "" || - message2.Index != "" { - t.Fatalf("Unexpected values of message 2 %v", message2) - } - - if event, err := message2.EventAsString(); err != nil { - t.Fatal(err) - } else { - if event != "notjson" { - t.Fatalf("Unexpected event in message 1 %v", event) - } - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } -} - -// Verify that we will send messages in batches with default batching parameters, -// but change frequency to be sure that numOfRequests will match expected 17 requests -func TestBatching(t *testing.T) { - if err := os.Setenv(envVarPostMessagesFrequency, "10h"); err != nil { - t.Fatal(err) - } - - hec := NewHTTPEventCollectorMock(t) - - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - for i := 0; i < defaultStreamChannelSize*4; i++ { - if err := loggerDriver.Log(&logger.Message{[]byte(fmt.Sprintf("%d", i)), "stdout", time.Now(), nil, false}); err != nil { - t.Fatal(err) - } - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != defaultStreamChannelSize*4 { - t.Fatal("Not all messages delivered") - } - - for i, message := range hec.messages { - if event, err := message.EventAsMap(); err != nil { - t.Fatal(err) - } else { - if event["line"] != fmt.Sprintf("%d", i) { - t.Fatalf("Unexpected event in message %v", event) - } - } - } - - // 1 to verify connection and 16 batches - if hec.numOfRequests != 17 { - t.Fatalf("Unexpected number of requests %d", hec.numOfRequests) - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarPostMessagesFrequency, ""); err != nil { - t.Fatal(err) - } -} - -// Verify that test is using time to fire events not rare than specified frequency -func TestFrequency(t *testing.T) { - if err := os.Setenv(envVarPostMessagesFrequency, "5ms"); err != nil { - t.Fatal(err) - } - - hec := NewHTTPEventCollectorMock(t) - - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - for i := 0; i < 10; i++ { - if err := loggerDriver.Log(&logger.Message{[]byte(fmt.Sprintf("%d", i)), "stdout", time.Now(), nil, false}); err != nil { - t.Fatal(err) - } - time.Sleep(15 * time.Millisecond) - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != 10 { - t.Fatal("Not all messages delivered") - } - - for i, message := range hec.messages { - if event, err := message.EventAsMap(); err != nil { - t.Fatal(err) - } else { - if event["line"] != fmt.Sprintf("%d", i) { - t.Fatalf("Unexpected event in message %v", event) - } - } - } - - // 1 to verify connection and 10 to verify that we have sent messages with required frequency, - // but because frequency is too small (to keep test quick), instead of 11, use 9 if context switches will be slow - if hec.numOfRequests < 9 { - t.Fatalf("Unexpected number of requests %d", hec.numOfRequests) - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarPostMessagesFrequency, ""); err != nil { - t.Fatal(err) - } -} - -// Simulate behavior similar to first version of Splunk Logging Driver, when we were sending one message -// per request -func TestOneMessagePerRequest(t *testing.T) { - if err := os.Setenv(envVarPostMessagesFrequency, "10h"); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarPostMessagesBatchSize, "1"); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarBufferMaximum, "1"); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarStreamChannelSize, "0"); err != nil { - t.Fatal(err) - } - - hec := NewHTTPEventCollectorMock(t) - - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - for i := 0; i < 10; i++ { - if err := loggerDriver.Log(&logger.Message{[]byte(fmt.Sprintf("%d", i)), "stdout", time.Now(), nil, false}); err != nil { - t.Fatal(err) - } - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != 10 { - t.Fatal("Not all messages delivered") - } - - for i, message := range hec.messages { - if event, err := message.EventAsMap(); err != nil { - t.Fatal(err) - } else { - if event["line"] != fmt.Sprintf("%d", i) { - t.Fatalf("Unexpected event in message %v", event) - } - } - } - - // 1 to verify connection and 10 messages - if hec.numOfRequests != 11 { - t.Fatalf("Unexpected number of requests %d", hec.numOfRequests) - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarPostMessagesFrequency, ""); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarPostMessagesBatchSize, ""); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarBufferMaximum, ""); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarStreamChannelSize, ""); err != nil { - t.Fatal(err) - } -} - -// Driver should not be created when HEC is unresponsive -func TestVerify(t *testing.T) { - hec := NewHTTPEventCollectorMock(t) - hec.simulateServerError = true - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - _, err := New(ctx) - if err == nil { - t.Fatal("Expecting driver to fail, when server is unresponsive") - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } -} - -// Verify that user can specify to skip verification that Splunk HEC is working. -// Also in this test we verify retry logic. -func TestSkipVerify(t *testing.T) { - hec := NewHTTPEventCollectorMock(t) - hec.simulateServerError = true - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - splunkVerifyConnectionKey: "false", - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - if hec.connectionVerified { - t.Fatal("Connection should not be verified") - } - - for i := 0; i < defaultStreamChannelSize*2; i++ { - if err := loggerDriver.Log(&logger.Message{[]byte(fmt.Sprintf("%d", i)), "stdout", time.Now(), nil, false}); err != nil { - t.Fatal(err) - } - } - - if len(hec.messages) != 0 { - t.Fatal("No messages should be accepted at this point") - } - - hec.simulateServerError = false - - for i := defaultStreamChannelSize * 2; i < defaultStreamChannelSize*4; i++ { - if err := loggerDriver.Log(&logger.Message{[]byte(fmt.Sprintf("%d", i)), "stdout", time.Now(), nil, false}); err != nil { - t.Fatal(err) - } - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != defaultStreamChannelSize*4 { - t.Fatal("Not all messages delivered") - } - - for i, message := range hec.messages { - if event, err := message.EventAsMap(); err != nil { - t.Fatal(err) - } else { - if event["line"] != fmt.Sprintf("%d", i) { - t.Fatalf("Unexpected event in message %v", event) - } - } - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } -} - -// Verify logic for when we filled whole buffer -func TestBufferMaximum(t *testing.T) { - if err := os.Setenv(envVarPostMessagesBatchSize, "2"); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarBufferMaximum, "10"); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarStreamChannelSize, "0"); err != nil { - t.Fatal(err) - } - - hec := NewHTTPEventCollectorMock(t) - hec.simulateServerError = true - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - splunkVerifyConnectionKey: "false", - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - if hec.connectionVerified { - t.Fatal("Connection should not be verified") - } - - for i := 0; i < 11; i++ { - if err := loggerDriver.Log(&logger.Message{[]byte(fmt.Sprintf("%d", i)), "stdout", time.Now(), nil, false}); err != nil { - t.Fatal(err) - } - } - - if len(hec.messages) != 0 { - t.Fatal("No messages should be accepted at this point") - } - - hec.simulateServerError = false - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != 9 { - t.Fatalf("Expected # of messages %d, got %d", 9, len(hec.messages)) - } - - // First 1000 messages are written to daemon log when buffer was full - for i, message := range hec.messages { - if event, err := message.EventAsMap(); err != nil { - t.Fatal(err) - } else { - if event["line"] != fmt.Sprintf("%d", i+2) { - t.Fatalf("Unexpected event in message %v", event) - } - } - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarPostMessagesBatchSize, ""); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarBufferMaximum, ""); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarStreamChannelSize, ""); err != nil { - t.Fatal(err) - } -} - -// Verify that we are not blocking close when HEC is down for the whole time -func TestServerAlwaysDown(t *testing.T) { - if err := os.Setenv(envVarPostMessagesBatchSize, "2"); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarBufferMaximum, "4"); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarStreamChannelSize, "0"); err != nil { - t.Fatal(err) - } - - hec := NewHTTPEventCollectorMock(t) - hec.simulateServerError = true - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - splunkVerifyConnectionKey: "false", - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - if hec.connectionVerified { - t.Fatal("Connection should not be verified") - } - - for i := 0; i < 5; i++ { - if err := loggerDriver.Log(&logger.Message{[]byte(fmt.Sprintf("%d", i)), "stdout", time.Now(), nil, false}); err != nil { - t.Fatal(err) - } - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if len(hec.messages) != 0 { - t.Fatal("No messages should be sent") - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarPostMessagesBatchSize, ""); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarBufferMaximum, ""); err != nil { - t.Fatal(err) - } - - if err := os.Setenv(envVarStreamChannelSize, ""); err != nil { - t.Fatal(err) - } -} - -// Cannot send messages after we close driver -func TestCannotSendAfterClose(t *testing.T) { - hec := NewHTTPEventCollectorMock(t) - go hec.Serve() - - ctx := logger.Context{ - Config: map[string]string{ - splunkURLKey: hec.URL(), - splunkTokenKey: hec.token, - }, - ContainerID: "containeriid", - ContainerName: "/container_name", - ContainerImageID: "contaimageid", - ContainerImageName: "container_image_name", - } - - loggerDriver, err := New(ctx) - if err != nil { - t.Fatal(err) - } - - if err := loggerDriver.Log(&logger.Message{[]byte("message1"), "stdout", time.Now(), nil, false}); err != nil { - t.Fatal(err) - } - - err = loggerDriver.Close() - if err != nil { - t.Fatal(err) - } - - if err := loggerDriver.Log(&logger.Message{[]byte("message2"), "stdout", time.Now(), nil, false}); err == nil { - t.Fatal("Driver should not allow to send messages after close") - } - - if len(hec.messages) != 1 { - t.Fatal("Only one message should be sent") - } - - message := hec.messages[0] - if event, err := message.EventAsMap(); err != nil { - t.Fatal(err) - } else { - if event["line"] != "message1" { - t.Fatalf("Unexpected event in message %v", event) - } - } - - err = hec.Close() - if err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/docker/daemon/logger/splunk/splunkhecmock_test.go b/vendor/github.com/docker/docker/daemon/logger/splunk/splunkhecmock_test.go deleted file mode 100644 index e50894828..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/splunk/splunkhecmock_test.go +++ /dev/null @@ -1,157 +0,0 @@ -package splunk - -import ( - "compress/gzip" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "testing" -) - -func (message *splunkMessage) EventAsString() (string, error) { - if val, ok := message.Event.(string); ok { - return val, nil - } - return "", fmt.Errorf("Cannot cast Event %v to string", message.Event) -} - -func (message *splunkMessage) EventAsMap() (map[string]interface{}, error) { - if val, ok := message.Event.(map[string]interface{}); ok { - return val, nil - } - return nil, fmt.Errorf("Cannot cast Event %v to map", message.Event) -} - -type HTTPEventCollectorMock struct { - tcpAddr *net.TCPAddr - tcpListener *net.TCPListener - - token string - simulateServerError bool - - test *testing.T - - connectionVerified bool - gzipEnabled *bool - messages []*splunkMessage - numOfRequests int -} - -func NewHTTPEventCollectorMock(t *testing.T) *HTTPEventCollectorMock { - tcpAddr := &net.TCPAddr{IP: []byte{127, 0, 0, 1}, Port: 0, Zone: ""} - tcpListener, err := net.ListenTCP("tcp", tcpAddr) - if err != nil { - t.Fatal(err) - } - return &HTTPEventCollectorMock{ - tcpAddr: tcpAddr, - tcpListener: tcpListener, - token: "4642492F-D8BD-47F1-A005-0C08AE4657DF", - simulateServerError: false, - test: t, - connectionVerified: false} -} - -func (hec *HTTPEventCollectorMock) URL() string { - return "http://" + hec.tcpListener.Addr().String() -} - -func (hec *HTTPEventCollectorMock) Serve() error { - return http.Serve(hec.tcpListener, hec) -} - -func (hec *HTTPEventCollectorMock) Close() error { - return hec.tcpListener.Close() -} - -func (hec *HTTPEventCollectorMock) ServeHTTP(writer http.ResponseWriter, request *http.Request) { - var err error - - hec.numOfRequests++ - - if hec.simulateServerError { - if request.Body != nil { - defer request.Body.Close() - } - writer.WriteHeader(http.StatusInternalServerError) - return - } - - switch request.Method { - case http.MethodOptions: - // Verify that options method is getting called only once - if hec.connectionVerified { - hec.test.Errorf("Connection should not be verified more than once. Got second request with %s method.", request.Method) - } - hec.connectionVerified = true - writer.WriteHeader(http.StatusOK) - case http.MethodPost: - // Always verify that Driver is using correct path to HEC - if request.URL.String() != "/services/collector/event/1.0" { - hec.test.Errorf("Unexpected path %v", request.URL) - } - defer request.Body.Close() - - if authorization, ok := request.Header["Authorization"]; !ok || authorization[0] != ("Splunk "+hec.token) { - hec.test.Error("Authorization header is invalid.") - } - - gzipEnabled := false - if contentEncoding, ok := request.Header["Content-Encoding"]; ok && contentEncoding[0] == "gzip" { - gzipEnabled = true - } - - if hec.gzipEnabled == nil { - hec.gzipEnabled = &gzipEnabled - } else if gzipEnabled != *hec.gzipEnabled { - // Nothing wrong with that, but we just know that Splunk Logging Driver does not do that - hec.test.Error("Driver should not change Content Encoding.") - } - - var gzipReader *gzip.Reader - var reader io.Reader - if gzipEnabled { - gzipReader, err = gzip.NewReader(request.Body) - if err != nil { - hec.test.Fatal(err) - } - reader = gzipReader - } else { - reader = request.Body - } - - // Read body - var body []byte - body, err = ioutil.ReadAll(reader) - if err != nil { - hec.test.Fatal(err) - } - - // Parse message - messageStart := 0 - for i := 0; i < len(body); i++ { - if i == len(body)-1 || (body[i] == '}' && body[i+1] == '{') { - var message splunkMessage - err = json.Unmarshal(body[messageStart:i+1], &message) - if err != nil { - hec.test.Log(string(body[messageStart : i+1])) - hec.test.Fatal(err) - } - hec.messages = append(hec.messages, &message) - messageStart = i + 1 - } - } - - if gzipEnabled { - gzipReader.Close() - } - - writer.WriteHeader(http.StatusOK) - default: - hec.test.Errorf("Unexpected HTTP method %s", http.MethodOptions) - writer.WriteHeader(http.StatusBadRequest) - } -} diff --git a/vendor/github.com/docker/docker/daemon/logger/syslog/syslog.go b/vendor/github.com/docker/docker/daemon/logger/syslog/syslog.go deleted file mode 100644 index fb9e867ff..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/syslog/syslog.go +++ /dev/null @@ -1,262 +0,0 @@ -// Package syslog provides the logdriver for forwarding server logs to syslog endpoints. -package syslog - -import ( - "crypto/tls" - "errors" - "fmt" - "net" - "net/url" - "os" - "strconv" - "strings" - "time" - - syslog "github.com/RackSec/srslog" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/daemon/logger/loggerutils" - "github.com/docker/docker/pkg/urlutil" - "github.com/docker/go-connections/tlsconfig" -) - -const ( - name = "syslog" - secureProto = "tcp+tls" -) - -var facilities = map[string]syslog.Priority{ - "kern": syslog.LOG_KERN, - "user": syslog.LOG_USER, - "mail": syslog.LOG_MAIL, - "daemon": syslog.LOG_DAEMON, - "auth": syslog.LOG_AUTH, - "syslog": syslog.LOG_SYSLOG, - "lpr": syslog.LOG_LPR, - "news": syslog.LOG_NEWS, - "uucp": syslog.LOG_UUCP, - "cron": syslog.LOG_CRON, - "authpriv": syslog.LOG_AUTHPRIV, - "ftp": syslog.LOG_FTP, - "local0": syslog.LOG_LOCAL0, - "local1": syslog.LOG_LOCAL1, - "local2": syslog.LOG_LOCAL2, - "local3": syslog.LOG_LOCAL3, - "local4": syslog.LOG_LOCAL4, - "local5": syslog.LOG_LOCAL5, - "local6": syslog.LOG_LOCAL6, - "local7": syslog.LOG_LOCAL7, -} - -type syslogger struct { - writer *syslog.Writer -} - -func init() { - if err := logger.RegisterLogDriver(name, New); err != nil { - logrus.Fatal(err) - } - if err := logger.RegisterLogOptValidator(name, ValidateLogOpt); err != nil { - logrus.Fatal(err) - } -} - -// rsyslog uses appname part of syslog message to fill in an %syslogtag% template -// attribute in rsyslog.conf. In order to be backward compatible to rfc3164 -// tag will be also used as an appname -func rfc5424formatterWithAppNameAsTag(p syslog.Priority, hostname, tag, content string) string { - timestamp := time.Now().Format(time.RFC3339) - pid := os.Getpid() - msg := fmt.Sprintf("<%d>%d %s %s %s %d %s %s", - p, 1, timestamp, hostname, tag, pid, tag, content) - return msg -} - -// The timestamp field in rfc5424 is derived from rfc3339. Whereas rfc3339 makes allowances -// for multiple syntaxes, there are further restrictions in rfc5424, i.e., the maximium -// resolution is limited to "TIME-SECFRAC" which is 6 (microsecond resolution) -func rfc5424microformatterWithAppNameAsTag(p syslog.Priority, hostname, tag, content string) string { - timestamp := time.Now().Format("2006-01-02T15:04:05.999999Z07:00") - pid := os.Getpid() - msg := fmt.Sprintf("<%d>%d %s %s %s %d %s %s", - p, 1, timestamp, hostname, tag, pid, tag, content) - return msg -} - -// New creates a syslog logger using the configuration passed in on -// the context. Supported context configuration variables are -// syslog-address, syslog-facility, syslog-format. -func New(ctx logger.Context) (logger.Logger, error) { - tag, err := loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) - if err != nil { - return nil, err - } - - proto, address, err := parseAddress(ctx.Config["syslog-address"]) - if err != nil { - return nil, err - } - - facility, err := parseFacility(ctx.Config["syslog-facility"]) - if err != nil { - return nil, err - } - - syslogFormatter, syslogFramer, err := parseLogFormat(ctx.Config["syslog-format"], proto) - if err != nil { - return nil, err - } - - var log *syslog.Writer - if proto == secureProto { - tlsConfig, tlsErr := parseTLSConfig(ctx.Config) - if tlsErr != nil { - return nil, tlsErr - } - log, err = syslog.DialWithTLSConfig(proto, address, facility, tag, tlsConfig) - } else { - log, err = syslog.Dial(proto, address, facility, tag) - } - - if err != nil { - return nil, err - } - - log.SetFormatter(syslogFormatter) - log.SetFramer(syslogFramer) - - return &syslogger{ - writer: log, - }, nil -} - -func (s *syslogger) Log(msg *logger.Message) error { - if msg.Source == "stderr" { - return s.writer.Err(string(msg.Line)) - } - return s.writer.Info(string(msg.Line)) -} - -func (s *syslogger) Close() error { - return s.writer.Close() -} - -func (s *syslogger) Name() string { - return name -} - -func parseAddress(address string) (string, string, error) { - if address == "" { - return "", "", nil - } - if !urlutil.IsTransportURL(address) { - return "", "", fmt.Errorf("syslog-address should be in form proto://address, got %v", address) - } - url, err := url.Parse(address) - if err != nil { - return "", "", err - } - - // unix and unixgram socket validation - if url.Scheme == "unix" || url.Scheme == "unixgram" { - if _, err := os.Stat(url.Path); err != nil { - return "", "", err - } - return url.Scheme, url.Path, nil - } - - // here we process tcp|udp - host := url.Host - if _, _, err := net.SplitHostPort(host); err != nil { - if !strings.Contains(err.Error(), "missing port in address") { - return "", "", err - } - host = host + ":514" - } - - return url.Scheme, host, nil -} - -// ValidateLogOpt looks for syslog specific log options -// syslog-address, syslog-facility. -func ValidateLogOpt(cfg map[string]string) error { - for key := range cfg { - switch key { - case "env": - case "labels": - case "syslog-address": - case "syslog-facility": - case "syslog-tls-ca-cert": - case "syslog-tls-cert": - case "syslog-tls-key": - case "syslog-tls-skip-verify": - case "tag": - case "syslog-format": - default: - return fmt.Errorf("unknown log opt '%s' for syslog log driver", key) - } - } - if _, _, err := parseAddress(cfg["syslog-address"]); err != nil { - return err - } - if _, err := parseFacility(cfg["syslog-facility"]); err != nil { - return err - } - if _, _, err := parseLogFormat(cfg["syslog-format"], ""); err != nil { - return err - } - return nil -} - -func parseFacility(facility string) (syslog.Priority, error) { - if facility == "" { - return syslog.LOG_DAEMON, nil - } - - if syslogFacility, valid := facilities[facility]; valid { - return syslogFacility, nil - } - - fInt, err := strconv.Atoi(facility) - if err == nil && 0 <= fInt && fInt <= 23 { - return syslog.Priority(fInt << 3), nil - } - - return syslog.Priority(0), errors.New("invalid syslog facility") -} - -func parseTLSConfig(cfg map[string]string) (*tls.Config, error) { - _, skipVerify := cfg["syslog-tls-skip-verify"] - - opts := tlsconfig.Options{ - CAFile: cfg["syslog-tls-ca-cert"], - CertFile: cfg["syslog-tls-cert"], - KeyFile: cfg["syslog-tls-key"], - InsecureSkipVerify: skipVerify, - } - - return tlsconfig.Client(opts) -} - -func parseLogFormat(logFormat, proto string) (syslog.Formatter, syslog.Framer, error) { - switch logFormat { - case "": - return syslog.UnixFormatter, syslog.DefaultFramer, nil - case "rfc3164": - return syslog.RFC3164Formatter, syslog.DefaultFramer, nil - case "rfc5424": - if proto == secureProto { - return rfc5424formatterWithAppNameAsTag, syslog.RFC5425MessageLengthFramer, nil - } - return rfc5424formatterWithAppNameAsTag, syslog.DefaultFramer, nil - case "rfc5424micro": - if proto == secureProto { - return rfc5424microformatterWithAppNameAsTag, syslog.RFC5425MessageLengthFramer, nil - } - return rfc5424microformatterWithAppNameAsTag, syslog.DefaultFramer, nil - default: - return nil, nil, errors.New("Invalid syslog format") - } - -} diff --git a/vendor/github.com/docker/docker/daemon/logger/syslog/syslog_test.go b/vendor/github.com/docker/docker/daemon/logger/syslog/syslog_test.go deleted file mode 100644 index 501561064..000000000 --- a/vendor/github.com/docker/docker/daemon/logger/syslog/syslog_test.go +++ /dev/null @@ -1,62 +0,0 @@ -package syslog - -import ( - "reflect" - "testing" - - syslog "github.com/RackSec/srslog" -) - -func functionMatches(expectedFun interface{}, actualFun interface{}) bool { - return reflect.ValueOf(expectedFun).Pointer() == reflect.ValueOf(actualFun).Pointer() -} - -func TestParseLogFormat(t *testing.T) { - formatter, framer, err := parseLogFormat("rfc5424", "udp") - if err != nil || !functionMatches(rfc5424formatterWithAppNameAsTag, formatter) || - !functionMatches(syslog.DefaultFramer, framer) { - t.Fatal("Failed to parse rfc5424 format", err, formatter, framer) - } - - formatter, framer, err = parseLogFormat("rfc5424", "tcp+tls") - if err != nil || !functionMatches(rfc5424formatterWithAppNameAsTag, formatter) || - !functionMatches(syslog.RFC5425MessageLengthFramer, framer) { - t.Fatal("Failed to parse rfc5424 format", err, formatter, framer) - } - - formatter, framer, err = parseLogFormat("rfc5424micro", "udp") - if err != nil || !functionMatches(rfc5424microformatterWithAppNameAsTag, formatter) || - !functionMatches(syslog.DefaultFramer, framer) { - t.Fatal("Failed to parse rfc5424 (microsecond) format", err, formatter, framer) - } - - formatter, framer, err = parseLogFormat("rfc5424micro", "tcp+tls") - if err != nil || !functionMatches(rfc5424microformatterWithAppNameAsTag, formatter) || - !functionMatches(syslog.RFC5425MessageLengthFramer, framer) { - t.Fatal("Failed to parse rfc5424 (microsecond) format", err, formatter, framer) - } - - formatter, framer, err = parseLogFormat("rfc3164", "") - if err != nil || !functionMatches(syslog.RFC3164Formatter, formatter) || - !functionMatches(syslog.DefaultFramer, framer) { - t.Fatal("Failed to parse rfc3164 format", err, formatter, framer) - } - - formatter, framer, err = parseLogFormat("", "") - if err != nil || !functionMatches(syslog.UnixFormatter, formatter) || - !functionMatches(syslog.DefaultFramer, framer) { - t.Fatal("Failed to parse empty format", err, formatter, framer) - } - - formatter, framer, err = parseLogFormat("invalid", "") - if err == nil { - t.Fatal("Failed to parse invalid format", err, formatter, framer) - } -} - -func TestValidateLogOptEmpty(t *testing.T) { - emptyConfig := make(map[string]string) - if err := ValidateLogOpt(emptyConfig); err != nil { - t.Fatal("Failed to parse empty config", err) - } -} diff --git a/vendor/github.com/docker/docker/daemon/logs.go b/vendor/github.com/docker/docker/daemon/logs.go deleted file mode 100644 index cc34b8208..000000000 --- a/vendor/github.com/docker/docker/daemon/logs.go +++ /dev/null @@ -1,142 +0,0 @@ -package daemon - -import ( - "fmt" - "io" - "strconv" - "time" - - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types/backend" - containertypes "github.com/docker/docker/api/types/container" - timetypes "github.com/docker/docker/api/types/time" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/logger" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/stdcopy" -) - -// ContainerLogs hooks up a container's stdout and stderr streams -// configured with the given struct. -func (daemon *Daemon) ContainerLogs(ctx context.Context, containerName string, config *backend.ContainerLogsConfig, started chan struct{}) error { - container, err := daemon.GetContainer(containerName) - if err != nil { - return err - } - - if !(config.ShowStdout || config.ShowStderr) { - return fmt.Errorf("You must choose at least one stream") - } - - cLog, err := daemon.getLogger(container) - if err != nil { - return err - } - logReader, ok := cLog.(logger.LogReader) - if !ok { - return logger.ErrReadLogsNotSupported - } - - follow := config.Follow && container.IsRunning() - tailLines, err := strconv.Atoi(config.Tail) - if err != nil { - tailLines = -1 - } - - logrus.Debug("logs: begin stream") - - var since time.Time - if config.Since != "" { - s, n, err := timetypes.ParseTimestamps(config.Since, 0) - if err != nil { - return err - } - since = time.Unix(s, n) - } - readConfig := logger.ReadConfig{ - Since: since, - Tail: tailLines, - Follow: follow, - } - logs := logReader.ReadLogs(readConfig) - - wf := ioutils.NewWriteFlusher(config.OutStream) - defer wf.Close() - close(started) - wf.Flush() - - var outStream io.Writer - outStream = wf - errStream := outStream - if !container.Config.Tty { - errStream = stdcopy.NewStdWriter(outStream, stdcopy.Stderr) - outStream = stdcopy.NewStdWriter(outStream, stdcopy.Stdout) - } - - for { - select { - case err := <-logs.Err: - logrus.Errorf("Error streaming logs: %v", err) - return nil - case <-ctx.Done(): - logs.Close() - return nil - case msg, ok := <-logs.Msg: - if !ok { - logrus.Debug("logs: end stream") - logs.Close() - if cLog != container.LogDriver { - // Since the logger isn't cached in the container, which occurs if it is running, it - // must get explicitly closed here to avoid leaking it and any file handles it has. - if err := cLog.Close(); err != nil { - logrus.Errorf("Error closing logger: %v", err) - } - } - return nil - } - logLine := msg.Line - if config.Details { - logLine = append([]byte(msg.Attrs.String()+" "), logLine...) - } - if config.Timestamps { - logLine = append([]byte(msg.Timestamp.Format(logger.TimeFormat)+" "), logLine...) - } - if msg.Source == "stdout" && config.ShowStdout { - outStream.Write(logLine) - } - if msg.Source == "stderr" && config.ShowStderr { - errStream.Write(logLine) - } - } - } -} - -func (daemon *Daemon) getLogger(container *container.Container) (logger.Logger, error) { - if container.LogDriver != nil && container.IsRunning() { - return container.LogDriver, nil - } - return container.StartLogger(container.HostConfig.LogConfig) -} - -// mergeLogConfig merges the daemon log config to the container's log config if the container's log driver is not specified. -func (daemon *Daemon) mergeAndVerifyLogConfig(cfg *containertypes.LogConfig) error { - if cfg.Type == "" { - cfg.Type = daemon.defaultLogConfig.Type - } - - if cfg.Config == nil { - cfg.Config = make(map[string]string) - } - - if cfg.Type == daemon.defaultLogConfig.Type { - for k, v := range daemon.defaultLogConfig.Config { - if _, ok := cfg.Config[k]; !ok { - cfg.Config[k] = v - } - } - } - - return logger.ValidateLogOpts(cfg.Type, cfg.Config) -} diff --git a/vendor/github.com/docker/docker/daemon/logs_test.go b/vendor/github.com/docker/docker/daemon/logs_test.go deleted file mode 100644 index 0c36299e0..000000000 --- a/vendor/github.com/docker/docker/daemon/logs_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package daemon - -import ( - "testing" - - containertypes "github.com/docker/docker/api/types/container" -) - -func TestMergeAndVerifyLogConfigNilConfig(t *testing.T) { - d := &Daemon{defaultLogConfig: containertypes.LogConfig{Type: "json-file", Config: map[string]string{"max-file": "1"}}} - cfg := containertypes.LogConfig{Type: d.defaultLogConfig.Type} - if err := d.mergeAndVerifyLogConfig(&cfg); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/docker/daemon/metrics.go b/vendor/github.com/docker/docker/daemon/metrics.go deleted file mode 100644 index 69dbfd937..000000000 --- a/vendor/github.com/docker/docker/daemon/metrics.go +++ /dev/null @@ -1,42 +0,0 @@ -package daemon - -import "github.com/docker/go-metrics" - -var ( - containerActions metrics.LabeledTimer - imageActions metrics.LabeledTimer - networkActions metrics.LabeledTimer - engineVersion metrics.LabeledGauge - engineCpus metrics.Gauge - engineMemory metrics.Gauge - healthChecksCounter metrics.Counter - healthChecksFailedCounter metrics.Counter -) - -func init() { - ns := metrics.NewNamespace("engine", "daemon", nil) - containerActions = ns.NewLabeledTimer("container_actions", "The number of seconds it takes to process each container action", "action") - for _, a := range []string{ - "start", - "changes", - "commit", - "create", - "delete", - } { - containerActions.WithValues(a).Update(0) - } - networkActions = ns.NewLabeledTimer("network_actions", "The number of seconds it takes to process each network action", "action") - engineVersion = ns.NewLabeledGauge("engine", "The version and commit information for the engine process", metrics.Unit("info"), - "version", - "commit", - "architecture", - "graph_driver", "kernel", - "os", - ) - engineCpus = ns.NewGauge("engine_cpus", "The number of cpus that the host system of the engine has", metrics.Unit("cpus")) - engineMemory = ns.NewGauge("engine_memory", "The number of bytes of memory that the host system of the engine has", metrics.Bytes) - healthChecksCounter = ns.NewCounter("health_checks", "The total number of health checks") - healthChecksFailedCounter = ns.NewCounter("health_checks_failed", "The total number of failed health checks") - imageActions = ns.NewLabeledTimer("image_actions", "The number of seconds it takes to process each image action", "action") - metrics.Register(ns) -} diff --git a/vendor/github.com/docker/docker/daemon/monitor.go b/vendor/github.com/docker/docker/daemon/monitor.go deleted file mode 100644 index ee0d1fcce..000000000 --- a/vendor/github.com/docker/docker/daemon/monitor.go +++ /dev/null @@ -1,132 +0,0 @@ -package daemon - -import ( - "errors" - "fmt" - "runtime" - "strconv" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/libcontainerd" - "github.com/docker/docker/restartmanager" -) - -// StateChanged updates daemon state changes from containerd -func (daemon *Daemon) StateChanged(id string, e libcontainerd.StateInfo) error { - c := daemon.containers.Get(id) - if c == nil { - return fmt.Errorf("no such container: %s", id) - } - - switch e.State { - case libcontainerd.StateOOM: - // StateOOM is Linux specific and should never be hit on Windows - if runtime.GOOS == "windows" { - return errors.New("Received StateOOM from libcontainerd on Windows. This should never happen.") - } - daemon.updateHealthMonitor(c) - daemon.LogContainerEvent(c, "oom") - case libcontainerd.StateExit: - // if container's AutoRemove flag is set, remove it after clean up - autoRemove := func() { - if c.HostConfig.AutoRemove { - if err := daemon.ContainerRm(c.ID, &types.ContainerRmConfig{ForceRemove: true, RemoveVolume: true}); err != nil { - logrus.Errorf("can't remove container %s: %v", c.ID, err) - } - } - } - - c.Lock() - c.StreamConfig.Wait() - c.Reset(false) - - restart, wait, err := c.RestartManager().ShouldRestart(e.ExitCode, false, time.Since(c.StartedAt)) - if err == nil && restart { - c.RestartCount++ - c.SetRestarting(platformConstructExitStatus(e)) - } else { - c.SetStopped(platformConstructExitStatus(e)) - defer autoRemove() - } - - daemon.updateHealthMonitor(c) - attributes := map[string]string{ - "exitCode": strconv.Itoa(int(e.ExitCode)), - } - daemon.LogContainerEventWithAttributes(c, "die", attributes) - daemon.Cleanup(c) - - if err == nil && restart { - go func() { - err := <-wait - if err == nil { - if err = daemon.containerStart(c, "", "", false); err != nil { - logrus.Debugf("failed to restart container: %+v", err) - } - } - if err != nil { - c.SetStopped(platformConstructExitStatus(e)) - defer autoRemove() - if err != restartmanager.ErrRestartCanceled { - logrus.Errorf("restartmanger wait error: %+v", err) - } - } - }() - } - - defer c.Unlock() - if err := c.ToDisk(); err != nil { - return err - } - return daemon.postRunProcessing(c, e) - case libcontainerd.StateExitProcess: - if execConfig := c.ExecCommands.Get(e.ProcessID); execConfig != nil { - ec := int(e.ExitCode) - execConfig.Lock() - defer execConfig.Unlock() - execConfig.ExitCode = &ec - execConfig.Running = false - execConfig.StreamConfig.Wait() - if err := execConfig.CloseStreams(); err != nil { - logrus.Errorf("%s: %s", c.ID, err) - } - - // remove the exec command from the container's store only and not the - // daemon's store so that the exec command can be inspected. - c.ExecCommands.Delete(execConfig.ID) - } else { - logrus.Warnf("Ignoring StateExitProcess for %v but no exec command found", e) - } - case libcontainerd.StateStart, libcontainerd.StateRestore: - // Container is already locked in this case - c.SetRunning(int(e.Pid), e.State == libcontainerd.StateStart) - c.HasBeenManuallyStopped = false - c.HasBeenStartedBefore = true - if err := c.ToDisk(); err != nil { - c.Reset(false) - return err - } - daemon.initHealthMonitor(c) - daemon.LogContainerEvent(c, "start") - case libcontainerd.StatePause: - // Container is already locked in this case - c.Paused = true - if err := c.ToDisk(); err != nil { - return err - } - daemon.updateHealthMonitor(c) - daemon.LogContainerEvent(c, "pause") - case libcontainerd.StateResume: - // Container is already locked in this case - c.Paused = false - if err := c.ToDisk(); err != nil { - return err - } - daemon.updateHealthMonitor(c) - daemon.LogContainerEvent(c, "unpause") - } - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/monitor_linux.go b/vendor/github.com/docker/docker/daemon/monitor_linux.go deleted file mode 100644 index 09f5af50c..000000000 --- a/vendor/github.com/docker/docker/daemon/monitor_linux.go +++ /dev/null @@ -1,19 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/container" - "github.com/docker/docker/libcontainerd" -) - -// platformConstructExitStatus returns a platform specific exit status structure -func platformConstructExitStatus(e libcontainerd.StateInfo) *container.ExitStatus { - return &container.ExitStatus{ - ExitCode: int(e.ExitCode), - OOMKilled: e.OOMKilled, - } -} - -// postRunProcessing perfoms any processing needed on the container after it has stopped. -func (daemon *Daemon) postRunProcessing(container *container.Container, e libcontainerd.StateInfo) error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/monitor_solaris.go b/vendor/github.com/docker/docker/daemon/monitor_solaris.go deleted file mode 100644 index 5ccfada76..000000000 --- a/vendor/github.com/docker/docker/daemon/monitor_solaris.go +++ /dev/null @@ -1,18 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/container" - "github.com/docker/docker/libcontainerd" -) - -// platformConstructExitStatus returns a platform specific exit status structure -func platformConstructExitStatus(e libcontainerd.StateInfo) *container.ExitStatus { - return &container.ExitStatus{ - ExitCode: int(e.ExitCode), - } -} - -// postRunProcessing perfoms any processing needed on the container after it has stopped. -func (daemon *Daemon) postRunProcessing(container *container.Container, e libcontainerd.StateInfo) error { - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/monitor_windows.go b/vendor/github.com/docker/docker/daemon/monitor_windows.go deleted file mode 100644 index 9648b1b41..000000000 --- a/vendor/github.com/docker/docker/daemon/monitor_windows.go +++ /dev/null @@ -1,46 +0,0 @@ -package daemon - -import ( - "fmt" - - "github.com/docker/docker/container" - "github.com/docker/docker/libcontainerd" -) - -// platformConstructExitStatus returns a platform specific exit status structure -func platformConstructExitStatus(e libcontainerd.StateInfo) *container.ExitStatus { - return &container.ExitStatus{ - ExitCode: int(e.ExitCode), - } -} - -// postRunProcessing perfoms any processing needed on the container after it has stopped. -func (daemon *Daemon) postRunProcessing(container *container.Container, e libcontainerd.StateInfo) error { - if e.ExitCode == 0 && e.UpdatePending { - spec, err := daemon.createSpec(container) - if err != nil { - return err - } - - newOpts := []libcontainerd.CreateOption{&libcontainerd.ServicingOption{ - IsServicing: true, - }} - - copts, err := daemon.getLibcontainerdCreateOptions(container) - if err != nil { - return err - } - - if copts != nil { - newOpts = append(newOpts, copts...) - } - - // Create a new servicing container, which will start, complete the update, and merge back the - // results if it succeeded, all as part of the below function call. - if err := daemon.containerd.Create((container.ID + "_servicing"), "", "", *spec, container.InitializeStdio, newOpts...); err != nil { - container.SetExitCode(-1) - return fmt.Errorf("Post-run update servicing failed: %s", err) - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/mounts.go b/vendor/github.com/docker/docker/daemon/mounts.go deleted file mode 100644 index 1c11f86a8..000000000 --- a/vendor/github.com/docker/docker/daemon/mounts.go +++ /dev/null @@ -1,48 +0,0 @@ -package daemon - -import ( - "fmt" - "strings" - - "github.com/docker/docker/container" - volumestore "github.com/docker/docker/volume/store" -) - -func (daemon *Daemon) prepareMountPoints(container *container.Container) error { - for _, config := range container.MountPoints { - if err := daemon.lazyInitializeVolume(container.ID, config); err != nil { - return err - } - } - return nil -} - -func (daemon *Daemon) removeMountPoints(container *container.Container, rm bool) error { - var rmErrors []string - for _, m := range container.MountPoints { - if m.Volume == nil { - continue - } - daemon.volumes.Dereference(m.Volume, container.ID) - if rm { - // Do not remove named mountpoints - // these are mountpoints specified like `docker run -v :/foo` - if m.Spec.Source != "" { - continue - } - err := daemon.volumes.Remove(m.Volume) - // Ignore volume in use errors because having this - // volume being referenced by other container is - // not an error, but an implementation detail. - // This prevents docker from logging "ERROR: Volume in use" - // where there is another container using the volume. - if err != nil && !volumestore.IsInUse(err) { - rmErrors = append(rmErrors, err.Error()) - } - } - } - if len(rmErrors) > 0 { - return fmt.Errorf("Error removing volumes:\n%v", strings.Join(rmErrors, "\n")) - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/names.go b/vendor/github.com/docker/docker/daemon/names.go deleted file mode 100644 index 273d55151..000000000 --- a/vendor/github.com/docker/docker/daemon/names.go +++ /dev/null @@ -1,116 +0,0 @@ -package daemon - -import ( - "fmt" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/namesgenerator" - "github.com/docker/docker/pkg/registrar" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/utils" -) - -var ( - validContainerNameChars = utils.RestrictedNameChars - validContainerNamePattern = utils.RestrictedNamePattern -) - -func (daemon *Daemon) registerName(container *container.Container) error { - if daemon.Exists(container.ID) { - return fmt.Errorf("Container is already loaded") - } - if err := validateID(container.ID); err != nil { - return err - } - if container.Name == "" { - name, err := daemon.generateNewName(container.ID) - if err != nil { - return err - } - container.Name = name - - if err := container.ToDiskLocking(); err != nil { - logrus.Errorf("Error saving container name to disk: %v", err) - } - } - return daemon.nameIndex.Reserve(container.Name, container.ID) -} - -func (daemon *Daemon) generateIDAndName(name string) (string, string, error) { - var ( - err error - id = stringid.GenerateNonCryptoID() - ) - - if name == "" { - if name, err = daemon.generateNewName(id); err != nil { - return "", "", err - } - return id, name, nil - } - - if name, err = daemon.reserveName(id, name); err != nil { - return "", "", err - } - - return id, name, nil -} - -func (daemon *Daemon) reserveName(id, name string) (string, error) { - if !validContainerNamePattern.MatchString(strings.TrimPrefix(name, "/")) { - return "", fmt.Errorf("Invalid container name (%s), only %s are allowed", name, validContainerNameChars) - } - if name[0] != '/' { - name = "/" + name - } - - if err := daemon.nameIndex.Reserve(name, id); err != nil { - if err == registrar.ErrNameReserved { - id, err := daemon.nameIndex.Get(name) - if err != nil { - logrus.Errorf("got unexpected error while looking up reserved name: %v", err) - return "", err - } - return "", fmt.Errorf("Conflict. The container name %q is already in use by container %s. You have to remove (or rename) that container to be able to reuse that name.", name, id) - } - return "", fmt.Errorf("error reserving name: %s, error: %v", name, err) - } - return name, nil -} - -func (daemon *Daemon) releaseName(name string) { - daemon.nameIndex.Release(name) -} - -func (daemon *Daemon) generateNewName(id string) (string, error) { - var name string - for i := 0; i < 6; i++ { - name = namesgenerator.GetRandomName(i) - if name[0] != '/' { - name = "/" + name - } - - if err := daemon.nameIndex.Reserve(name, id); err != nil { - if err == registrar.ErrNameReserved { - continue - } - return "", err - } - return name, nil - } - - name = "/" + stringid.TruncateID(id) - if err := daemon.nameIndex.Reserve(name, id); err != nil { - return "", err - } - return name, nil -} - -func validateID(id string) error { - if id == "" { - return fmt.Errorf("Invalid empty id") - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/network.go b/vendor/github.com/docker/docker/daemon/network.go deleted file mode 100644 index ab8fd88da..000000000 --- a/vendor/github.com/docker/docker/daemon/network.go +++ /dev/null @@ -1,498 +0,0 @@ -package daemon - -import ( - "fmt" - "net" - "runtime" - "sort" - "strings" - - "github.com/Sirupsen/logrus" - apierrors "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/network" - clustertypes "github.com/docker/docker/daemon/cluster/provider" - "github.com/docker/docker/pkg/plugingetter" - "github.com/docker/docker/runconfig" - "github.com/docker/libnetwork" - "github.com/docker/libnetwork/driverapi" - "github.com/docker/libnetwork/ipamapi" - networktypes "github.com/docker/libnetwork/types" - "github.com/pkg/errors" - "golang.org/x/net/context" -) - -// NetworkControllerEnabled checks if the networking stack is enabled. -// This feature depends on OS primitives and it's disabled in systems like Windows. -func (daemon *Daemon) NetworkControllerEnabled() bool { - return daemon.netController != nil -} - -// FindNetwork function finds a network for a given string that can represent network name or id -func (daemon *Daemon) FindNetwork(idName string) (libnetwork.Network, error) { - // Find by Name - n, err := daemon.GetNetworkByName(idName) - if err != nil && !isNoSuchNetworkError(err) { - return nil, err - } - - if n != nil { - return n, nil - } - - // Find by id - return daemon.GetNetworkByID(idName) -} - -func isNoSuchNetworkError(err error) bool { - _, ok := err.(libnetwork.ErrNoSuchNetwork) - return ok -} - -// GetNetworkByID function returns a network whose ID begins with the given prefix. -// It fails with an error if no matching, or more than one matching, networks are found. -func (daemon *Daemon) GetNetworkByID(partialID string) (libnetwork.Network, error) { - list := daemon.GetNetworksByID(partialID) - - if len(list) == 0 { - return nil, libnetwork.ErrNoSuchNetwork(partialID) - } - if len(list) > 1 { - return nil, libnetwork.ErrInvalidID(partialID) - } - return list[0], nil -} - -// GetNetworkByName function returns a network for a given network name. -// If no network name is given, the default network is returned. -func (daemon *Daemon) GetNetworkByName(name string) (libnetwork.Network, error) { - c := daemon.netController - if c == nil { - return nil, libnetwork.ErrNoSuchNetwork(name) - } - if name == "" { - name = c.Config().Daemon.DefaultNetwork - } - return c.NetworkByName(name) -} - -// GetNetworksByID returns a list of networks whose ID partially matches zero or more networks -func (daemon *Daemon) GetNetworksByID(partialID string) []libnetwork.Network { - c := daemon.netController - if c == nil { - return nil - } - list := []libnetwork.Network{} - l := func(nw libnetwork.Network) bool { - if strings.HasPrefix(nw.ID(), partialID) { - list = append(list, nw) - } - return false - } - c.WalkNetworks(l) - - return list -} - -// getAllNetworks returns a list containing all networks -func (daemon *Daemon) getAllNetworks() []libnetwork.Network { - c := daemon.netController - list := []libnetwork.Network{} - l := func(nw libnetwork.Network) bool { - list = append(list, nw) - return false - } - c.WalkNetworks(l) - - return list -} - -func isIngressNetwork(name string) bool { - return name == "ingress" -} - -var ingressChan = make(chan struct{}, 1) - -func ingressWait() func() { - ingressChan <- struct{}{} - return func() { <-ingressChan } -} - -// SetupIngress setups ingress networking. -func (daemon *Daemon) SetupIngress(create clustertypes.NetworkCreateRequest, nodeIP string) error { - ip, _, err := net.ParseCIDR(nodeIP) - if err != nil { - return err - } - - go func() { - controller := daemon.netController - controller.AgentInitWait() - - if n, err := daemon.GetNetworkByName(create.Name); err == nil && n != nil && n.ID() != create.ID { - if err := controller.SandboxDestroy("ingress-sbox"); err != nil { - logrus.Errorf("Failed to delete stale ingress sandbox: %v", err) - return - } - - // Cleanup any stale endpoints that might be left over during previous iterations - epList := n.Endpoints() - for _, ep := range epList { - if err := ep.Delete(true); err != nil { - logrus.Errorf("Failed to delete endpoint %s (%s): %v", ep.Name(), ep.ID(), err) - } - } - - if err := n.Delete(); err != nil { - logrus.Errorf("Failed to delete stale ingress network %s: %v", n.ID(), err) - return - } - } - - if _, err := daemon.createNetwork(create.NetworkCreateRequest, create.ID, true); err != nil { - // If it is any other error other than already - // exists error log error and return. - if _, ok := err.(libnetwork.NetworkNameError); !ok { - logrus.Errorf("Failed creating ingress network: %v", err) - return - } - - // Otherwise continue down the call to create or recreate sandbox. - } - - n, err := daemon.GetNetworkByID(create.ID) - if err != nil { - logrus.Errorf("Failed getting ingress network by id after creating: %v", err) - return - } - - sb, err := controller.NewSandbox("ingress-sbox", libnetwork.OptionIngress()) - if err != nil { - if _, ok := err.(networktypes.ForbiddenError); !ok { - logrus.Errorf("Failed creating ingress sandbox: %v", err) - } - return - } - - ep, err := n.CreateEndpoint("ingress-endpoint", libnetwork.CreateOptionIpam(ip, nil, nil, nil)) - if err != nil { - logrus.Errorf("Failed creating ingress endpoint: %v", err) - return - } - - if err := ep.Join(sb, nil); err != nil { - logrus.Errorf("Failed joining ingress sandbox to ingress endpoint: %v", err) - } - - if err := sb.EnableService(); err != nil { - logrus.WithError(err).Error("Failed enabling service for ingress sandbox") - } - }() - - return nil -} - -// SetNetworkBootstrapKeys sets the bootstrap keys. -func (daemon *Daemon) SetNetworkBootstrapKeys(keys []*networktypes.EncryptionKey) error { - return daemon.netController.SetKeys(keys) -} - -// UpdateAttachment notifies the attacher about the attachment config. -func (daemon *Daemon) UpdateAttachment(networkName, networkID, containerID string, config *network.NetworkingConfig) error { - if daemon.clusterProvider == nil { - return fmt.Errorf("cluster provider is not initialized") - } - - if err := daemon.clusterProvider.UpdateAttachment(networkName, containerID, config); err != nil { - return daemon.clusterProvider.UpdateAttachment(networkID, containerID, config) - } - - return nil -} - -// WaitForDetachment makes the cluster manager wait for detachment of -// the container from the network. -func (daemon *Daemon) WaitForDetachment(ctx context.Context, networkName, networkID, taskID, containerID string) error { - if daemon.clusterProvider == nil { - return fmt.Errorf("cluster provider is not initialized") - } - - return daemon.clusterProvider.WaitForDetachment(ctx, networkName, networkID, taskID, containerID) -} - -// CreateManagedNetwork creates an agent network. -func (daemon *Daemon) CreateManagedNetwork(create clustertypes.NetworkCreateRequest) error { - _, err := daemon.createNetwork(create.NetworkCreateRequest, create.ID, true) - return err -} - -// CreateNetwork creates a network with the given name, driver and other optional parameters -func (daemon *Daemon) CreateNetwork(create types.NetworkCreateRequest) (*types.NetworkCreateResponse, error) { - resp, err := daemon.createNetwork(create, "", false) - if err != nil { - return nil, err - } - return resp, err -} - -func (daemon *Daemon) createNetwork(create types.NetworkCreateRequest, id string, agent bool) (*types.NetworkCreateResponse, error) { - // If there is a pending ingress network creation wait here - // since ingress network creation can happen via node download - // from manager or task download. - if isIngressNetwork(create.Name) { - defer ingressWait()() - } - - if runconfig.IsPreDefinedNetwork(create.Name) && !agent { - err := fmt.Errorf("%s is a pre-defined network and cannot be created", create.Name) - return nil, apierrors.NewRequestForbiddenError(err) - } - - var warning string - nw, err := daemon.GetNetworkByName(create.Name) - if err != nil { - if _, ok := err.(libnetwork.ErrNoSuchNetwork); !ok { - return nil, err - } - } - if nw != nil { - if create.CheckDuplicate { - return nil, libnetwork.NetworkNameError(create.Name) - } - warning = fmt.Sprintf("Network with name %s (id : %s) already exists", nw.Name(), nw.ID()) - } - - c := daemon.netController - driver := create.Driver - if driver == "" { - driver = c.Config().Daemon.DefaultDriver - } - - nwOptions := []libnetwork.NetworkOption{ - libnetwork.NetworkOptionEnableIPv6(create.EnableIPv6), - libnetwork.NetworkOptionDriverOpts(create.Options), - libnetwork.NetworkOptionLabels(create.Labels), - libnetwork.NetworkOptionAttachable(create.Attachable), - } - - if create.IPAM != nil { - ipam := create.IPAM - v4Conf, v6Conf, err := getIpamConfig(ipam.Config) - if err != nil { - return nil, err - } - nwOptions = append(nwOptions, libnetwork.NetworkOptionIpam(ipam.Driver, "", v4Conf, v6Conf, ipam.Options)) - } - - if create.Internal { - nwOptions = append(nwOptions, libnetwork.NetworkOptionInternalNetwork()) - } - if agent { - nwOptions = append(nwOptions, libnetwork.NetworkOptionDynamic()) - nwOptions = append(nwOptions, libnetwork.NetworkOptionPersist(false)) - } - - if isIngressNetwork(create.Name) { - nwOptions = append(nwOptions, libnetwork.NetworkOptionIngress()) - } - - n, err := c.NewNetwork(driver, create.Name, id, nwOptions...) - if err != nil { - return nil, err - } - - daemon.pluginRefCount(driver, driverapi.NetworkPluginEndpointType, plugingetter.ACQUIRE) - if create.IPAM != nil { - daemon.pluginRefCount(create.IPAM.Driver, ipamapi.PluginEndpointType, plugingetter.ACQUIRE) - } - daemon.LogNetworkEvent(n, "create") - - return &types.NetworkCreateResponse{ - ID: n.ID(), - Warning: warning, - }, nil -} - -func (daemon *Daemon) pluginRefCount(driver, capability string, mode int) { - var builtinDrivers []string - - if capability == driverapi.NetworkPluginEndpointType { - builtinDrivers = daemon.netController.BuiltinDrivers() - } else if capability == ipamapi.PluginEndpointType { - builtinDrivers = daemon.netController.BuiltinIPAMDrivers() - } - - for _, d := range builtinDrivers { - if d == driver { - return - } - } - - if daemon.PluginStore != nil { - _, err := daemon.PluginStore.Get(driver, capability, mode) - if err != nil { - logrus.WithError(err).WithFields(logrus.Fields{"mode": mode, "driver": driver}).Error("Error handling plugin refcount operation") - } - } -} - -func getIpamConfig(data []network.IPAMConfig) ([]*libnetwork.IpamConf, []*libnetwork.IpamConf, error) { - ipamV4Cfg := []*libnetwork.IpamConf{} - ipamV6Cfg := []*libnetwork.IpamConf{} - for _, d := range data { - iCfg := libnetwork.IpamConf{} - iCfg.PreferredPool = d.Subnet - iCfg.SubPool = d.IPRange - iCfg.Gateway = d.Gateway - iCfg.AuxAddresses = d.AuxAddress - ip, _, err := net.ParseCIDR(d.Subnet) - if err != nil { - return nil, nil, fmt.Errorf("Invalid subnet %s : %v", d.Subnet, err) - } - if ip.To4() != nil { - ipamV4Cfg = append(ipamV4Cfg, &iCfg) - } else { - ipamV6Cfg = append(ipamV6Cfg, &iCfg) - } - } - return ipamV4Cfg, ipamV6Cfg, nil -} - -// UpdateContainerServiceConfig updates a service configuration. -func (daemon *Daemon) UpdateContainerServiceConfig(containerName string, serviceConfig *clustertypes.ServiceConfig) error { - container, err := daemon.GetContainer(containerName) - if err != nil { - return err - } - - container.NetworkSettings.Service = serviceConfig - return nil -} - -// ConnectContainerToNetwork connects the given container to the given -// network. If either cannot be found, an err is returned. If the -// network cannot be set up, an err is returned. -func (daemon *Daemon) ConnectContainerToNetwork(containerName, networkName string, endpointConfig *network.EndpointSettings) error { - if runtime.GOOS == "solaris" { - return errors.New("docker network connect is unsupported on Solaris platform") - } - container, err := daemon.GetContainer(containerName) - if err != nil { - return err - } - return daemon.ConnectToNetwork(container, networkName, endpointConfig) -} - -// DisconnectContainerFromNetwork disconnects the given container from -// the given network. If either cannot be found, an err is returned. -func (daemon *Daemon) DisconnectContainerFromNetwork(containerName string, networkName string, force bool) error { - if runtime.GOOS == "solaris" { - return errors.New("docker network disconnect is unsupported on Solaris platform") - } - container, err := daemon.GetContainer(containerName) - if err != nil { - if force { - return daemon.ForceEndpointDelete(containerName, networkName) - } - return err - } - return daemon.DisconnectFromNetwork(container, networkName, force) -} - -// GetNetworkDriverList returns the list of plugins drivers -// registered for network. -func (daemon *Daemon) GetNetworkDriverList() []string { - if !daemon.NetworkControllerEnabled() { - return nil - } - - pluginList := daemon.netController.BuiltinDrivers() - - managedPlugins := daemon.PluginStore.GetAllManagedPluginsByCap(driverapi.NetworkPluginEndpointType) - - for _, plugin := range managedPlugins { - pluginList = append(pluginList, plugin.Name()) - } - - pluginMap := make(map[string]bool) - for _, plugin := range pluginList { - pluginMap[plugin] = true - } - - networks := daemon.netController.Networks() - - for _, network := range networks { - if !pluginMap[network.Type()] { - pluginList = append(pluginList, network.Type()) - pluginMap[network.Type()] = true - } - } - - sort.Strings(pluginList) - - return pluginList -} - -// DeleteManagedNetwork deletes an agent network. -func (daemon *Daemon) DeleteManagedNetwork(networkID string) error { - return daemon.deleteNetwork(networkID, true) -} - -// DeleteNetwork destroys a network unless it's one of docker's predefined networks. -func (daemon *Daemon) DeleteNetwork(networkID string) error { - return daemon.deleteNetwork(networkID, false) -} - -func (daemon *Daemon) deleteNetwork(networkID string, dynamic bool) error { - nw, err := daemon.FindNetwork(networkID) - if err != nil { - return err - } - - if runconfig.IsPreDefinedNetwork(nw.Name()) && !dynamic { - err := fmt.Errorf("%s is a pre-defined network and cannot be removed", nw.Name()) - return apierrors.NewRequestForbiddenError(err) - } - - if err := nw.Delete(); err != nil { - return err - } - daemon.pluginRefCount(nw.Type(), driverapi.NetworkPluginEndpointType, plugingetter.RELEASE) - ipamType, _, _, _ := nw.Info().IpamConfig() - daemon.pluginRefCount(ipamType, ipamapi.PluginEndpointType, plugingetter.RELEASE) - daemon.LogNetworkEvent(nw, "destroy") - return nil -} - -// GetNetworks returns a list of all networks -func (daemon *Daemon) GetNetworks() []libnetwork.Network { - return daemon.getAllNetworks() -} - -// clearAttachableNetworks removes the attachable networks -// after disconnecting any connected container -func (daemon *Daemon) clearAttachableNetworks() { - for _, n := range daemon.GetNetworks() { - if !n.Info().Attachable() { - continue - } - for _, ep := range n.Endpoints() { - epInfo := ep.Info() - if epInfo == nil { - continue - } - sb := epInfo.Sandbox() - if sb == nil { - continue - } - containerID := sb.ContainerID() - if err := daemon.DisconnectContainerFromNetwork(containerID, n.ID(), true); err != nil { - logrus.Warnf("Failed to disconnect container %s from swarm network %s on cluster leave: %v", - containerID, n.Name(), err) - } - } - if err := daemon.DeleteManagedNetwork(n.ID()); err != nil { - logrus.Warnf("Failed to remove swarm network %s on cluster leave: %v", n.Name(), err) - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/network/settings.go b/vendor/github.com/docker/docker/daemon/network/settings.go deleted file mode 100644 index 8f6b7dd59..000000000 --- a/vendor/github.com/docker/docker/daemon/network/settings.go +++ /dev/null @@ -1,33 +0,0 @@ -package network - -import ( - networktypes "github.com/docker/docker/api/types/network" - clustertypes "github.com/docker/docker/daemon/cluster/provider" - "github.com/docker/go-connections/nat" -) - -// Settings stores configuration details about the daemon network config -// TODO Windows. Many of these fields can be factored out., -type Settings struct { - Bridge string - SandboxID string - HairpinMode bool - LinkLocalIPv6Address string - LinkLocalIPv6PrefixLen int - Networks map[string]*EndpointSettings - Service *clustertypes.ServiceConfig - Ports nat.PortMap - SandboxKey string - SecondaryIPAddresses []networktypes.Address - SecondaryIPv6Addresses []networktypes.Address - IsAnonymousEndpoint bool - HasSwarmEndpoint bool -} - -// EndpointSettings is a package local wrapper for -// networktypes.EndpointSettings which stores Endpoint state that -// needs to be persisted to disk but not exposed in the api. -type EndpointSettings struct { - *networktypes.EndpointSettings - IPAMOperational bool -} diff --git a/vendor/github.com/docker/docker/daemon/oci_linux.go b/vendor/github.com/docker/docker/daemon/oci_linux.go deleted file mode 100644 index a72b0b873..000000000 --- a/vendor/github.com/docker/docker/daemon/oci_linux.go +++ /dev/null @@ -1,790 +0,0 @@ -package daemon - -import ( - "fmt" - "io" - "os" - "os/exec" - "path/filepath" - "sort" - "strconv" - "strings" - - "github.com/Sirupsen/logrus" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/daemon/caps" - "github.com/docker/docker/oci" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/stringutils" - "github.com/docker/docker/pkg/symlink" - "github.com/docker/docker/volume" - "github.com/opencontainers/runc/libcontainer/apparmor" - "github.com/opencontainers/runc/libcontainer/cgroups" - "github.com/opencontainers/runc/libcontainer/devices" - "github.com/opencontainers/runc/libcontainer/user" - specs "github.com/opencontainers/runtime-spec/specs-go" -) - -func setResources(s *specs.Spec, r containertypes.Resources) error { - weightDevices, err := getBlkioWeightDevices(r) - if err != nil { - return err - } - readBpsDevice, err := getBlkioThrottleDevices(r.BlkioDeviceReadBps) - if err != nil { - return err - } - writeBpsDevice, err := getBlkioThrottleDevices(r.BlkioDeviceWriteBps) - if err != nil { - return err - } - readIOpsDevice, err := getBlkioThrottleDevices(r.BlkioDeviceReadIOps) - if err != nil { - return err - } - writeIOpsDevice, err := getBlkioThrottleDevices(r.BlkioDeviceWriteIOps) - if err != nil { - return err - } - - memoryRes := getMemoryResources(r) - cpuRes := getCPUResources(r) - blkioWeight := r.BlkioWeight - - specResources := &specs.Resources{ - Memory: memoryRes, - CPU: cpuRes, - BlockIO: &specs.BlockIO{ - Weight: &blkioWeight, - WeightDevice: weightDevices, - ThrottleReadBpsDevice: readBpsDevice, - ThrottleWriteBpsDevice: writeBpsDevice, - ThrottleReadIOPSDevice: readIOpsDevice, - ThrottleWriteIOPSDevice: writeIOpsDevice, - }, - DisableOOMKiller: r.OomKillDisable, - Pids: &specs.Pids{ - Limit: &r.PidsLimit, - }, - } - - if s.Linux.Resources != nil && len(s.Linux.Resources.Devices) > 0 { - specResources.Devices = s.Linux.Resources.Devices - } - - s.Linux.Resources = specResources - return nil -} - -func setDevices(s *specs.Spec, c *container.Container) error { - // Build lists of devices allowed and created within the container. - var devs []specs.Device - devPermissions := s.Linux.Resources.Devices - if c.HostConfig.Privileged { - hostDevices, err := devices.HostDevices() - if err != nil { - return err - } - for _, d := range hostDevices { - devs = append(devs, oci.Device(d)) - } - rwm := "rwm" - devPermissions = []specs.DeviceCgroup{ - { - Allow: true, - Access: &rwm, - }, - } - } else { - for _, deviceMapping := range c.HostConfig.Devices { - d, dPermissions, err := oci.DevicesFromPath(deviceMapping.PathOnHost, deviceMapping.PathInContainer, deviceMapping.CgroupPermissions) - if err != nil { - return err - } - devs = append(devs, d...) - devPermissions = append(devPermissions, dPermissions...) - } - } - - s.Linux.Devices = append(s.Linux.Devices, devs...) - s.Linux.Resources.Devices = devPermissions - return nil -} - -func setRlimits(daemon *Daemon, s *specs.Spec, c *container.Container) error { - var rlimits []specs.Rlimit - - // We want to leave the original HostConfig alone so make a copy here - hostConfig := *c.HostConfig - // Merge with the daemon defaults - daemon.mergeUlimits(&hostConfig) - for _, ul := range hostConfig.Ulimits { - rlimits = append(rlimits, specs.Rlimit{ - Type: "RLIMIT_" + strings.ToUpper(ul.Name), - Soft: uint64(ul.Soft), - Hard: uint64(ul.Hard), - }) - } - - s.Process.Rlimits = rlimits - return nil -} - -func setUser(s *specs.Spec, c *container.Container) error { - uid, gid, additionalGids, err := getUser(c, c.Config.User) - if err != nil { - return err - } - s.Process.User.UID = uid - s.Process.User.GID = gid - s.Process.User.AdditionalGids = additionalGids - return nil -} - -func readUserFile(c *container.Container, p string) (io.ReadCloser, error) { - fp, err := symlink.FollowSymlinkInScope(filepath.Join(c.BaseFS, p), c.BaseFS) - if err != nil { - return nil, err - } - return os.Open(fp) -} - -func getUser(c *container.Container, username string) (uint32, uint32, []uint32, error) { - passwdPath, err := user.GetPasswdPath() - if err != nil { - return 0, 0, nil, err - } - groupPath, err := user.GetGroupPath() - if err != nil { - return 0, 0, nil, err - } - passwdFile, err := readUserFile(c, passwdPath) - if err == nil { - defer passwdFile.Close() - } - groupFile, err := readUserFile(c, groupPath) - if err == nil { - defer groupFile.Close() - } - - execUser, err := user.GetExecUser(username, nil, passwdFile, groupFile) - if err != nil { - return 0, 0, nil, err - } - - // todo: fix this double read by a change to libcontainer/user pkg - groupFile, err = readUserFile(c, groupPath) - if err == nil { - defer groupFile.Close() - } - var addGroups []int - if len(c.HostConfig.GroupAdd) > 0 { - addGroups, err = user.GetAdditionalGroups(c.HostConfig.GroupAdd, groupFile) - if err != nil { - return 0, 0, nil, err - } - } - uid := uint32(execUser.Uid) - gid := uint32(execUser.Gid) - sgids := append(execUser.Sgids, addGroups...) - var additionalGids []uint32 - for _, g := range sgids { - additionalGids = append(additionalGids, uint32(g)) - } - return uid, gid, additionalGids, nil -} - -func setNamespace(s *specs.Spec, ns specs.Namespace) { - for i, n := range s.Linux.Namespaces { - if n.Type == ns.Type { - s.Linux.Namespaces[i] = ns - return - } - } - s.Linux.Namespaces = append(s.Linux.Namespaces, ns) -} - -func setCapabilities(s *specs.Spec, c *container.Container) error { - var caplist []string - var err error - if c.HostConfig.Privileged { - caplist = caps.GetAllCapabilities() - } else { - caplist, err = caps.TweakCapabilities(s.Process.Capabilities, c.HostConfig.CapAdd, c.HostConfig.CapDrop) - if err != nil { - return err - } - } - s.Process.Capabilities = caplist - return nil -} - -func setNamespaces(daemon *Daemon, s *specs.Spec, c *container.Container) error { - userNS := false - // user - if c.HostConfig.UsernsMode.IsPrivate() { - uidMap, gidMap := daemon.GetUIDGIDMaps() - if uidMap != nil { - userNS = true - ns := specs.Namespace{Type: "user"} - setNamespace(s, ns) - s.Linux.UIDMappings = specMapping(uidMap) - s.Linux.GIDMappings = specMapping(gidMap) - } - } - // network - if !c.Config.NetworkDisabled { - ns := specs.Namespace{Type: "network"} - parts := strings.SplitN(string(c.HostConfig.NetworkMode), ":", 2) - if parts[0] == "container" { - nc, err := daemon.getNetworkedContainer(c.ID, c.HostConfig.NetworkMode.ConnectedContainer()) - if err != nil { - return err - } - ns.Path = fmt.Sprintf("/proc/%d/ns/net", nc.State.GetPID()) - if userNS { - // to share a net namespace, they must also share a user namespace - nsUser := specs.Namespace{Type: "user"} - nsUser.Path = fmt.Sprintf("/proc/%d/ns/user", nc.State.GetPID()) - setNamespace(s, nsUser) - } - } else if c.HostConfig.NetworkMode.IsHost() { - ns.Path = c.NetworkSettings.SandboxKey - } - setNamespace(s, ns) - } - // ipc - if c.HostConfig.IpcMode.IsContainer() { - ns := specs.Namespace{Type: "ipc"} - ic, err := daemon.getIpcContainer(c) - if err != nil { - return err - } - ns.Path = fmt.Sprintf("/proc/%d/ns/ipc", ic.State.GetPID()) - setNamespace(s, ns) - if userNS { - // to share an IPC namespace, they must also share a user namespace - nsUser := specs.Namespace{Type: "user"} - nsUser.Path = fmt.Sprintf("/proc/%d/ns/user", ic.State.GetPID()) - setNamespace(s, nsUser) - } - } else if c.HostConfig.IpcMode.IsHost() { - oci.RemoveNamespace(s, specs.NamespaceType("ipc")) - } else { - ns := specs.Namespace{Type: "ipc"} - setNamespace(s, ns) - } - // pid - if c.HostConfig.PidMode.IsContainer() { - ns := specs.Namespace{Type: "pid"} - pc, err := daemon.getPidContainer(c) - if err != nil { - return err - } - ns.Path = fmt.Sprintf("/proc/%d/ns/pid", pc.State.GetPID()) - setNamespace(s, ns) - if userNS { - // to share a PID namespace, they must also share a user namespace - nsUser := specs.Namespace{Type: "user"} - nsUser.Path = fmt.Sprintf("/proc/%d/ns/user", pc.State.GetPID()) - setNamespace(s, nsUser) - } - } else if c.HostConfig.PidMode.IsHost() { - oci.RemoveNamespace(s, specs.NamespaceType("pid")) - } else { - ns := specs.Namespace{Type: "pid"} - setNamespace(s, ns) - } - // uts - if c.HostConfig.UTSMode.IsHost() { - oci.RemoveNamespace(s, specs.NamespaceType("uts")) - s.Hostname = "" - } - - return nil -} - -func specMapping(s []idtools.IDMap) []specs.IDMapping { - var ids []specs.IDMapping - for _, item := range s { - ids = append(ids, specs.IDMapping{ - HostID: uint32(item.HostID), - ContainerID: uint32(item.ContainerID), - Size: uint32(item.Size), - }) - } - return ids -} - -func getMountInfo(mountinfo []*mount.Info, dir string) *mount.Info { - for _, m := range mountinfo { - if m.Mountpoint == dir { - return m - } - } - return nil -} - -// Get the source mount point of directory passed in as argument. Also return -// optional fields. -func getSourceMount(source string) (string, string, error) { - // Ensure any symlinks are resolved. - sourcePath, err := filepath.EvalSymlinks(source) - if err != nil { - return "", "", err - } - - mountinfos, err := mount.GetMounts() - if err != nil { - return "", "", err - } - - mountinfo := getMountInfo(mountinfos, sourcePath) - if mountinfo != nil { - return sourcePath, mountinfo.Optional, nil - } - - path := sourcePath - for { - path = filepath.Dir(path) - - mountinfo = getMountInfo(mountinfos, path) - if mountinfo != nil { - return path, mountinfo.Optional, nil - } - - if path == "/" { - break - } - } - - // If we are here, we did not find parent mount. Something is wrong. - return "", "", fmt.Errorf("Could not find source mount of %s", source) -} - -// Ensure mount point on which path is mounted, is shared. -func ensureShared(path string) error { - sharedMount := false - - sourceMount, optionalOpts, err := getSourceMount(path) - if err != nil { - return err - } - // Make sure source mount point is shared. - optsSplit := strings.Split(optionalOpts, " ") - for _, opt := range optsSplit { - if strings.HasPrefix(opt, "shared:") { - sharedMount = true - break - } - } - - if !sharedMount { - return fmt.Errorf("Path %s is mounted on %s but it is not a shared mount.", path, sourceMount) - } - return nil -} - -// Ensure mount point on which path is mounted, is either shared or slave. -func ensureSharedOrSlave(path string) error { - sharedMount := false - slaveMount := false - - sourceMount, optionalOpts, err := getSourceMount(path) - if err != nil { - return err - } - // Make sure source mount point is shared. - optsSplit := strings.Split(optionalOpts, " ") - for _, opt := range optsSplit { - if strings.HasPrefix(opt, "shared:") { - sharedMount = true - break - } else if strings.HasPrefix(opt, "master:") { - slaveMount = true - break - } - } - - if !sharedMount && !slaveMount { - return fmt.Errorf("Path %s is mounted on %s but it is not a shared or slave mount.", path, sourceMount) - } - return nil -} - -var ( - mountPropagationMap = map[string]int{ - "private": mount.PRIVATE, - "rprivate": mount.RPRIVATE, - "shared": mount.SHARED, - "rshared": mount.RSHARED, - "slave": mount.SLAVE, - "rslave": mount.RSLAVE, - } - - mountPropagationReverseMap = map[int]string{ - mount.PRIVATE: "private", - mount.RPRIVATE: "rprivate", - mount.SHARED: "shared", - mount.RSHARED: "rshared", - mount.SLAVE: "slave", - mount.RSLAVE: "rslave", - } -) - -func setMounts(daemon *Daemon, s *specs.Spec, c *container.Container, mounts []container.Mount) error { - userMounts := make(map[string]struct{}) - for _, m := range mounts { - userMounts[m.Destination] = struct{}{} - } - - // Filter out mounts that are overridden by user supplied mounts - var defaultMounts []specs.Mount - _, mountDev := userMounts["/dev"] - for _, m := range s.Mounts { - if _, ok := userMounts[m.Destination]; !ok { - if mountDev && strings.HasPrefix(m.Destination, "/dev/") { - continue - } - defaultMounts = append(defaultMounts, m) - } - } - - s.Mounts = defaultMounts - for _, m := range mounts { - for _, cm := range s.Mounts { - if cm.Destination == m.Destination { - return fmt.Errorf("Duplicate mount point '%s'", m.Destination) - } - } - - if m.Source == "tmpfs" { - data := m.Data - options := []string{"noexec", "nosuid", "nodev", string(volume.DefaultPropagationMode)} - if data != "" { - options = append(options, strings.Split(data, ",")...) - } - - merged, err := mount.MergeTmpfsOptions(options) - if err != nil { - return err - } - - s.Mounts = append(s.Mounts, specs.Mount{Destination: m.Destination, Source: m.Source, Type: "tmpfs", Options: merged}) - continue - } - - mt := specs.Mount{Destination: m.Destination, Source: m.Source, Type: "bind"} - - // Determine property of RootPropagation based on volume - // properties. If a volume is shared, then keep root propagation - // shared. This should work for slave and private volumes too. - // - // For slave volumes, it can be either [r]shared/[r]slave. - // - // For private volumes any root propagation value should work. - pFlag := mountPropagationMap[m.Propagation] - if pFlag == mount.SHARED || pFlag == mount.RSHARED { - if err := ensureShared(m.Source); err != nil { - return err - } - rootpg := mountPropagationMap[s.Linux.RootfsPropagation] - if rootpg != mount.SHARED && rootpg != mount.RSHARED { - s.Linux.RootfsPropagation = mountPropagationReverseMap[mount.SHARED] - } - } else if pFlag == mount.SLAVE || pFlag == mount.RSLAVE { - if err := ensureSharedOrSlave(m.Source); err != nil { - return err - } - rootpg := mountPropagationMap[s.Linux.RootfsPropagation] - if rootpg != mount.SHARED && rootpg != mount.RSHARED && rootpg != mount.SLAVE && rootpg != mount.RSLAVE { - s.Linux.RootfsPropagation = mountPropagationReverseMap[mount.RSLAVE] - } - } - - opts := []string{"rbind"} - if !m.Writable { - opts = append(opts, "ro") - } - if pFlag != 0 { - opts = append(opts, mountPropagationReverseMap[pFlag]) - } - - mt.Options = opts - s.Mounts = append(s.Mounts, mt) - } - - if s.Root.Readonly { - for i, m := range s.Mounts { - switch m.Destination { - case "/proc", "/dev/pts", "/dev/mqueue": // /dev is remounted by runc - continue - } - if _, ok := userMounts[m.Destination]; !ok { - if !stringutils.InSlice(m.Options, "ro") { - s.Mounts[i].Options = append(s.Mounts[i].Options, "ro") - } - } - } - } - - if c.HostConfig.Privileged { - if !s.Root.Readonly { - // clear readonly for /sys - for i := range s.Mounts { - if s.Mounts[i].Destination == "/sys" { - clearReadOnly(&s.Mounts[i]) - } - } - } - s.Linux.ReadonlyPaths = nil - s.Linux.MaskedPaths = nil - } - - // TODO: until a kernel/mount solution exists for handling remount in a user namespace, - // we must clear the readonly flag for the cgroups mount (@mrunalp concurs) - if uidMap, _ := daemon.GetUIDGIDMaps(); uidMap != nil || c.HostConfig.Privileged { - for i, m := range s.Mounts { - if m.Type == "cgroup" { - clearReadOnly(&s.Mounts[i]) - } - } - } - - return nil -} - -func (daemon *Daemon) populateCommonSpec(s *specs.Spec, c *container.Container) error { - linkedEnv, err := daemon.setupLinkedContainers(c) - if err != nil { - return err - } - s.Root = specs.Root{ - Path: c.BaseFS, - Readonly: c.HostConfig.ReadonlyRootfs, - } - rootUID, rootGID := daemon.GetRemappedUIDGID() - if err := c.SetupWorkingDirectory(rootUID, rootGID); err != nil { - return err - } - cwd := c.Config.WorkingDir - if len(cwd) == 0 { - cwd = "/" - } - s.Process.Args = append([]string{c.Path}, c.Args...) - - // only add the custom init if it is specified and the container is running in its - // own private pid namespace. It does not make sense to add if it is running in the - // host namespace or another container's pid namespace where we already have an init - if c.HostConfig.PidMode.IsPrivate() { - if (c.HostConfig.Init != nil && *c.HostConfig.Init) || - (c.HostConfig.Init == nil && daemon.configStore.Init) { - s.Process.Args = append([]string{"/dev/init", "--", c.Path}, c.Args...) - var path string - if daemon.configStore.InitPath == "" && c.HostConfig.InitPath == "" { - path, err = exec.LookPath(DefaultInitBinary) - if err != nil { - return err - } - } - if daemon.configStore.InitPath != "" { - path = daemon.configStore.InitPath - } - if c.HostConfig.InitPath != "" { - path = c.HostConfig.InitPath - } - s.Mounts = append(s.Mounts, specs.Mount{ - Destination: "/dev/init", - Type: "bind", - Source: path, - Options: []string{"bind", "ro"}, - }) - } - } - s.Process.Cwd = cwd - s.Process.Env = c.CreateDaemonEnvironment(c.Config.Tty, linkedEnv) - s.Process.Terminal = c.Config.Tty - s.Hostname = c.FullHostname() - - return nil -} - -func (daemon *Daemon) createSpec(c *container.Container) (*specs.Spec, error) { - s := oci.DefaultSpec() - if err := daemon.populateCommonSpec(&s, c); err != nil { - return nil, err - } - - var cgroupsPath string - scopePrefix := "docker" - parent := "/docker" - useSystemd := UsingSystemd(daemon.configStore) - if useSystemd { - parent = "system.slice" - } - - if c.HostConfig.CgroupParent != "" { - parent = c.HostConfig.CgroupParent - } else if daemon.configStore.CgroupParent != "" { - parent = daemon.configStore.CgroupParent - } - - if useSystemd { - cgroupsPath = parent + ":" + scopePrefix + ":" + c.ID - logrus.Debugf("createSpec: cgroupsPath: %s", cgroupsPath) - } else { - cgroupsPath = filepath.Join(parent, c.ID) - } - s.Linux.CgroupsPath = &cgroupsPath - - if err := setResources(&s, c.HostConfig.Resources); err != nil { - return nil, fmt.Errorf("linux runtime spec resources: %v", err) - } - s.Linux.Resources.OOMScoreAdj = &c.HostConfig.OomScoreAdj - s.Linux.Sysctl = c.HostConfig.Sysctls - - p := *s.Linux.CgroupsPath - if useSystemd { - initPath, err := cgroups.GetInitCgroupDir("cpu") - if err != nil { - return nil, err - } - p, _ = cgroups.GetThisCgroupDir("cpu") - if err != nil { - return nil, err - } - p = filepath.Join(initPath, p) - } - - // Clean path to guard against things like ../../../BAD - parentPath := filepath.Dir(p) - if !filepath.IsAbs(parentPath) { - parentPath = filepath.Clean("/" + parentPath) - } - - if err := daemon.initCgroupsPath(parentPath); err != nil { - return nil, fmt.Errorf("linux init cgroups path: %v", err) - } - if err := setDevices(&s, c); err != nil { - return nil, fmt.Errorf("linux runtime spec devices: %v", err) - } - if err := setRlimits(daemon, &s, c); err != nil { - return nil, fmt.Errorf("linux runtime spec rlimits: %v", err) - } - if err := setUser(&s, c); err != nil { - return nil, fmt.Errorf("linux spec user: %v", err) - } - if err := setNamespaces(daemon, &s, c); err != nil { - return nil, fmt.Errorf("linux spec namespaces: %v", err) - } - if err := setCapabilities(&s, c); err != nil { - return nil, fmt.Errorf("linux spec capabilities: %v", err) - } - if err := setSeccomp(daemon, &s, c); err != nil { - return nil, fmt.Errorf("linux seccomp: %v", err) - } - - if err := daemon.setupIpcDirs(c); err != nil { - return nil, err - } - - if err := daemon.setupSecretDir(c); err != nil { - return nil, err - } - - ms, err := daemon.setupMounts(c) - if err != nil { - return nil, err - } - - ms = append(ms, c.IpcMounts()...) - - tmpfsMounts, err := c.TmpfsMounts() - if err != nil { - return nil, err - } - ms = append(ms, tmpfsMounts...) - - if m := c.SecretMount(); m != nil { - ms = append(ms, *m) - } - - sort.Sort(mounts(ms)) - if err := setMounts(daemon, &s, c, ms); err != nil { - return nil, fmt.Errorf("linux mounts: %v", err) - } - - for _, ns := range s.Linux.Namespaces { - if ns.Type == "network" && ns.Path == "" && !c.Config.NetworkDisabled { - target, err := os.Readlink(filepath.Join("/proc", strconv.Itoa(os.Getpid()), "exe")) - if err != nil { - return nil, err - } - - s.Hooks = specs.Hooks{ - Prestart: []specs.Hook{{ - Path: target, // FIXME: cross-platform - Args: []string{"libnetwork-setkey", c.ID, daemon.netController.ID()}, - }}, - } - } - } - - if apparmor.IsEnabled() { - var appArmorProfile string - if c.AppArmorProfile != "" { - appArmorProfile = c.AppArmorProfile - } else if c.HostConfig.Privileged { - appArmorProfile = "unconfined" - } else { - appArmorProfile = "docker-default" - } - - if appArmorProfile == "docker-default" { - // Unattended upgrades and other fun services can unload AppArmor - // profiles inadvertently. Since we cannot store our profile in - // /etc/apparmor.d, nor can we practically add other ways of - // telling the system to keep our profile loaded, in order to make - // sure that we keep the default profile enabled we dynamically - // reload it if necessary. - if err := ensureDefaultAppArmorProfile(); err != nil { - return nil, err - } - } - - s.Process.ApparmorProfile = appArmorProfile - } - s.Process.SelinuxLabel = c.GetProcessLabel() - s.Process.NoNewPrivileges = c.NoNewPrivileges - s.Linux.MountLabel = c.MountLabel - - return (*specs.Spec)(&s), nil -} - -func clearReadOnly(m *specs.Mount) { - var opt []string - for _, o := range m.Options { - if o != "ro" { - opt = append(opt, o) - } - } - m.Options = opt -} - -// mergeUlimits merge the Ulimits from HostConfig with daemon defaults, and update HostConfig -func (daemon *Daemon) mergeUlimits(c *containertypes.HostConfig) { - ulimits := c.Ulimits - // Merge ulimits with daemon defaults - ulIdx := make(map[string]struct{}) - for _, ul := range ulimits { - ulIdx[ul.Name] = struct{}{} - } - for name, ul := range daemon.configStore.Ulimits { - if _, exists := ulIdx[name]; !exists { - ulimits = append(ulimits, ul) - } - } - c.Ulimits = ulimits -} diff --git a/vendor/github.com/docker/docker/daemon/oci_solaris.go b/vendor/github.com/docker/docker/daemon/oci_solaris.go deleted file mode 100644 index 0c757f919..000000000 --- a/vendor/github.com/docker/docker/daemon/oci_solaris.go +++ /dev/null @@ -1,188 +0,0 @@ -package daemon - -import ( - "fmt" - "path/filepath" - "sort" - "strconv" - - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/oci" - "github.com/docker/libnetwork" - "github.com/opencontainers/runtime-spec/specs-go" -) - -func setResources(s *specs.Spec, r containertypes.Resources) error { - mem := getMemoryResources(r) - s.Solaris.CappedMemory = &mem - - capCPU := getCPUResources(r) - s.Solaris.CappedCPU = &capCPU - - return nil -} - -func setUser(s *specs.Spec, c *container.Container) error { - uid, gid, additionalGids, err := getUser(c, c.Config.User) - if err != nil { - return err - } - s.Process.User.UID = uid - s.Process.User.GID = gid - s.Process.User.AdditionalGids = additionalGids - return nil -} - -func getUser(c *container.Container, username string) (uint32, uint32, []uint32, error) { - return 0, 0, nil, nil -} - -func (daemon *Daemon) getRunzAnet(ep libnetwork.Endpoint) (specs.Anet, error) { - var ( - linkName string - lowerLink string - defRouter string - ) - - epInfo := ep.Info() - if epInfo == nil { - return specs.Anet{}, fmt.Errorf("invalid endpoint") - } - - nw, err := daemon.GetNetworkByName(ep.Network()) - if err != nil { - return specs.Anet{}, fmt.Errorf("Failed to get network %s: %v", ep.Network(), err) - } - - // Evaluate default router, linkname and lowerlink for interface endpoint - switch nw.Type() { - case "bridge": - defRouter = epInfo.Gateway().String() - linkName = "net0" // Should always be net0 for a container - - // TODO We construct lowerlink here exactly as done for solaris bridge - // initialization. Need modular code to reuse. - options := nw.Info().DriverOptions() - nwName := options["com.docker.network.bridge.name"] - lastChar := nwName[len(nwName)-1:] - if _, err = strconv.Atoi(lastChar); err != nil { - lowerLink = nwName + "_0" - } else { - lowerLink = nwName - } - - case "overlay": - defRouter = "" - linkName = "net1" - - // TODO Follows generateVxlanName() in solaris overlay. - id := nw.ID() - if len(nw.ID()) > 12 { - id = nw.ID()[:12] - } - lowerLink = "vx_" + id + "_0" - } - - runzanet := specs.Anet{ - Linkname: linkName, - Lowerlink: lowerLink, - Allowedaddr: epInfo.Iface().Address().String(), - Configallowedaddr: "true", - Defrouter: defRouter, - Linkprotection: "mac-nospoof, ip-nospoof", - Macaddress: epInfo.Iface().MacAddress().String(), - } - - return runzanet, nil -} - -func (daemon *Daemon) setNetworkInterface(s *specs.Spec, c *container.Container) error { - var anets []specs.Anet - - sb, err := daemon.netController.SandboxByID(c.NetworkSettings.SandboxID) - if err != nil { - return fmt.Errorf("Could not obtain sandbox for container") - } - - // Populate interfaces required for each endpoint - for _, ep := range sb.Endpoints() { - runzanet, err := daemon.getRunzAnet(ep) - if err != nil { - return fmt.Errorf("Failed to get interface information for endpoint %d: %v", ep.ID(), err) - } - anets = append(anets, runzanet) - } - - s.Solaris.Anet = anets - if anets != nil { - s.Solaris.Milestone = "svc:/milestone/container:default" - } - return nil -} - -func (daemon *Daemon) populateCommonSpec(s *specs.Spec, c *container.Container) error { - linkedEnv, err := daemon.setupLinkedContainers(c) - if err != nil { - return err - } - s.Root = specs.Root{ - Path: filepath.Dir(c.BaseFS), - Readonly: c.HostConfig.ReadonlyRootfs, - } - rootUID, rootGID := daemon.GetRemappedUIDGID() - if err := c.SetupWorkingDirectory(rootUID, rootGID); err != nil { - return err - } - cwd := c.Config.WorkingDir - s.Process.Args = append([]string{c.Path}, c.Args...) - s.Process.Cwd = cwd - s.Process.Env = c.CreateDaemonEnvironment(c.Config.Tty, linkedEnv) - s.Process.Terminal = c.Config.Tty - s.Hostname = c.FullHostname() - - return nil -} - -func (daemon *Daemon) createSpec(c *container.Container) (*specs.Spec, error) { - s := oci.DefaultSpec() - if err := daemon.populateCommonSpec(&s, c); err != nil { - return nil, err - } - - if err := setResources(&s, c.HostConfig.Resources); err != nil { - return nil, fmt.Errorf("runtime spec resources: %v", err) - } - - if err := setUser(&s, c); err != nil { - return nil, fmt.Errorf("spec user: %v", err) - } - - if err := daemon.setNetworkInterface(&s, c); err != nil { - return nil, err - } - - if err := daemon.setupIpcDirs(c); err != nil { - return nil, err - } - - ms, err := daemon.setupMounts(c) - if err != nil { - return nil, err - } - ms = append(ms, c.IpcMounts()...) - tmpfsMounts, err := c.TmpfsMounts() - if err != nil { - return nil, err - } - ms = append(ms, tmpfsMounts...) - sort.Sort(mounts(ms)) - - return (*specs.Spec)(&s), nil -} - -// mergeUlimits merge the Ulimits from HostConfig with daemon defaults, and update HostConfig -// It will do nothing on non-Linux platform -func (daemon *Daemon) mergeUlimits(c *containertypes.HostConfig) { - return -} diff --git a/vendor/github.com/docker/docker/daemon/oci_windows.go b/vendor/github.com/docker/docker/daemon/oci_windows.go deleted file mode 100644 index 6e264243b..000000000 --- a/vendor/github.com/docker/docker/daemon/oci_windows.go +++ /dev/null @@ -1,122 +0,0 @@ -package daemon - -import ( - "syscall" - - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/oci" - "github.com/docker/docker/pkg/sysinfo" - "github.com/opencontainers/runtime-spec/specs-go" -) - -func (daemon *Daemon) createSpec(c *container.Container) (*specs.Spec, error) { - s := oci.DefaultSpec() - - linkedEnv, err := daemon.setupLinkedContainers(c) - if err != nil { - return nil, err - } - - // Note, unlike Unix, we do NOT call into SetupWorkingDirectory as - // this is done in VMCompute. Further, we couldn't do it for Hyper-V - // containers anyway. - - // In base spec - s.Hostname = c.FullHostname() - - // In s.Mounts - mounts, err := daemon.setupMounts(c) - if err != nil { - return nil, err - } - for _, mount := range mounts { - m := specs.Mount{ - Source: mount.Source, - Destination: mount.Destination, - } - if !mount.Writable { - m.Options = append(m.Options, "ro") - } - s.Mounts = append(s.Mounts, m) - } - - // In s.Process - s.Process.Args = append([]string{c.Path}, c.Args...) - if !c.Config.ArgsEscaped { - s.Process.Args = escapeArgs(s.Process.Args) - } - s.Process.Cwd = c.Config.WorkingDir - if len(s.Process.Cwd) == 0 { - // We default to C:\ to workaround the oddity of the case that the - // default directory for cmd running as LocalSystem (or - // ContainerAdministrator) is c:\windows\system32. Hence docker run - // cmd will by default end in c:\windows\system32, rather - // than 'root' (/) on Linux. The oddity is that if you have a dockerfile - // which has no WORKDIR and has a COPY file ., . will be interpreted - // as c:\. Hence, setting it to default of c:\ makes for consistency. - s.Process.Cwd = `C:\` - } - s.Process.Env = c.CreateDaemonEnvironment(c.Config.Tty, linkedEnv) - s.Process.ConsoleSize.Height = c.HostConfig.ConsoleSize[0] - s.Process.ConsoleSize.Width = c.HostConfig.ConsoleSize[1] - s.Process.Terminal = c.Config.Tty - s.Process.User.Username = c.Config.User - - // In spec.Root. This is not set for Hyper-V containers - isHyperV := false - if c.HostConfig.Isolation.IsDefault() { - // Container using default isolation, so take the default from the daemon configuration - isHyperV = daemon.defaultIsolation.IsHyperV() - } else { - // Container may be requesting an explicit isolation mode. - isHyperV = c.HostConfig.Isolation.IsHyperV() - } - if !isHyperV { - s.Root.Path = c.BaseFS - } - s.Root.Readonly = false // Windows does not support a read-only root filesystem - - // In s.Windows.Resources - // @darrenstahlmsft implement these resources - cpuShares := uint16(c.HostConfig.CPUShares) - cpuPercent := uint8(c.HostConfig.CPUPercent) - if c.HostConfig.NanoCPUs > 0 { - cpuPercent = uint8(c.HostConfig.NanoCPUs * 100 / int64(sysinfo.NumCPU()) / 1e9) - } - cpuCount := uint64(c.HostConfig.CPUCount) - memoryLimit := uint64(c.HostConfig.Memory) - s.Windows.Resources = &specs.WindowsResources{ - CPU: &specs.WindowsCPUResources{ - Percent: &cpuPercent, - Shares: &cpuShares, - Count: &cpuCount, - }, - Memory: &specs.WindowsMemoryResources{ - Limit: &memoryLimit, - //TODO Reservation: ..., - }, - Network: &specs.WindowsNetworkResources{ - //TODO Bandwidth: ..., - }, - Storage: &specs.WindowsStorageResources{ - Bps: &c.HostConfig.IOMaximumBandwidth, - Iops: &c.HostConfig.IOMaximumIOps, - }, - } - return (*specs.Spec)(&s), nil -} - -func escapeArgs(args []string) []string { - escapedArgs := make([]string, len(args)) - for i, a := range args { - escapedArgs[i] = syscall.EscapeArg(a) - } - return escapedArgs -} - -// mergeUlimits merge the Ulimits from HostConfig with daemon defaults, and update HostConfig -// It will do nothing on non-Linux platform -func (daemon *Daemon) mergeUlimits(c *containertypes.HostConfig) { - return -} diff --git a/vendor/github.com/docker/docker/daemon/pause.go b/vendor/github.com/docker/docker/daemon/pause.go deleted file mode 100644 index dbfafbc5f..000000000 --- a/vendor/github.com/docker/docker/daemon/pause.go +++ /dev/null @@ -1,49 +0,0 @@ -package daemon - -import ( - "fmt" - - "github.com/docker/docker/container" -) - -// ContainerPause pauses a container -func (daemon *Daemon) ContainerPause(name string) error { - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - if err := daemon.containerPause(container); err != nil { - return err - } - - return nil -} - -// containerPause pauses the container execution without stopping the process. -// The execution can be resumed by calling containerUnpause. -func (daemon *Daemon) containerPause(container *container.Container) error { - container.Lock() - defer container.Unlock() - - // We cannot Pause the container which is not running - if !container.Running { - return errNotRunning{container.ID} - } - - // We cannot Pause the container which is already paused - if container.Paused { - return fmt.Errorf("Container %s is already paused", container.ID) - } - - // We cannot Pause the container which is restarting - if container.Restarting { - return errContainerIsRestarting(container.ID) - } - - if err := daemon.containerd.Pause(container.ID); err != nil { - return fmt.Errorf("Cannot pause container %s: %s", container.ID, err) - } - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/prune.go b/vendor/github.com/docker/docker/daemon/prune.go deleted file mode 100644 index a693beb4e..000000000 --- a/vendor/github.com/docker/docker/daemon/prune.go +++ /dev/null @@ -1,236 +0,0 @@ -package daemon - -import ( - "fmt" - "regexp" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/directory" - "github.com/docker/docker/reference" - "github.com/docker/docker/runconfig" - "github.com/docker/docker/volume" - "github.com/docker/libnetwork" -) - -// ContainersPrune removes unused containers -func (daemon *Daemon) ContainersPrune(pruneFilters filters.Args) (*types.ContainersPruneReport, error) { - rep := &types.ContainersPruneReport{} - - allContainers := daemon.List() - for _, c := range allContainers { - if !c.IsRunning() { - cSize, _ := daemon.getSize(c) - // TODO: sets RmLink to true? - err := daemon.ContainerRm(c.ID, &types.ContainerRmConfig{}) - if err != nil { - logrus.Warnf("failed to prune container %s: %v", c.ID, err) - continue - } - if cSize > 0 { - rep.SpaceReclaimed += uint64(cSize) - } - rep.ContainersDeleted = append(rep.ContainersDeleted, c.ID) - } - } - - return rep, nil -} - -// VolumesPrune removes unused local volumes -func (daemon *Daemon) VolumesPrune(pruneFilters filters.Args) (*types.VolumesPruneReport, error) { - rep := &types.VolumesPruneReport{} - - pruneVols := func(v volume.Volume) error { - name := v.Name() - refs := daemon.volumes.Refs(v) - - if len(refs) == 0 { - vSize, err := directory.Size(v.Path()) - if err != nil { - logrus.Warnf("could not determine size of volume %s: %v", name, err) - } - err = daemon.volumes.Remove(v) - if err != nil { - logrus.Warnf("could not remove volume %s: %v", name, err) - return nil - } - rep.SpaceReclaimed += uint64(vSize) - rep.VolumesDeleted = append(rep.VolumesDeleted, name) - } - - return nil - } - - err := daemon.traverseLocalVolumes(pruneVols) - - return rep, err -} - -// ImagesPrune removes unused images -func (daemon *Daemon) ImagesPrune(pruneFilters filters.Args) (*types.ImagesPruneReport, error) { - rep := &types.ImagesPruneReport{} - - danglingOnly := true - if pruneFilters.Include("dangling") { - if pruneFilters.ExactMatch("dangling", "false") || pruneFilters.ExactMatch("dangling", "0") { - danglingOnly = false - } else if !pruneFilters.ExactMatch("dangling", "true") && !pruneFilters.ExactMatch("dangling", "1") { - return nil, fmt.Errorf("Invalid filter 'dangling=%s'", pruneFilters.Get("dangling")) - } - } - - var allImages map[image.ID]*image.Image - if danglingOnly { - allImages = daemon.imageStore.Heads() - } else { - allImages = daemon.imageStore.Map() - } - allContainers := daemon.List() - imageRefs := map[string]bool{} - for _, c := range allContainers { - imageRefs[c.ID] = true - } - - // Filter intermediary images and get their unique size - allLayers := daemon.layerStore.Map() - topImages := map[image.ID]*image.Image{} - for id, img := range allImages { - dgst := digest.Digest(id) - if len(daemon.referenceStore.References(dgst)) == 0 && len(daemon.imageStore.Children(id)) != 0 { - continue - } - topImages[id] = img - } - - for id := range topImages { - dgst := digest.Digest(id) - hex := dgst.Hex() - if _, ok := imageRefs[hex]; ok { - continue - } - - deletedImages := []types.ImageDelete{} - refs := daemon.referenceStore.References(dgst) - if len(refs) > 0 { - if danglingOnly { - // Not a dangling image - continue - } - - nrRefs := len(refs) - for _, ref := range refs { - // If nrRefs == 1, we have an image marked as myreponame: - // i.e. the tag content was changed - if _, ok := ref.(reference.Canonical); ok && nrRefs > 1 { - continue - } - imgDel, err := daemon.ImageDelete(ref.String(), false, true) - if err != nil { - logrus.Warnf("could not delete reference %s: %v", ref.String(), err) - continue - } - deletedImages = append(deletedImages, imgDel...) - } - } else { - imgDel, err := daemon.ImageDelete(hex, false, true) - if err != nil { - logrus.Warnf("could not delete image %s: %v", hex, err) - continue - } - deletedImages = append(deletedImages, imgDel...) - } - - rep.ImagesDeleted = append(rep.ImagesDeleted, deletedImages...) - } - - // Compute how much space was freed - for _, d := range rep.ImagesDeleted { - if d.Deleted != "" { - chid := layer.ChainID(d.Deleted) - if l, ok := allLayers[chid]; ok { - diffSize, err := l.DiffSize() - if err != nil { - logrus.Warnf("failed to get layer %s size: %v", chid, err) - continue - } - rep.SpaceReclaimed += uint64(diffSize) - } - } - } - - return rep, nil -} - -// localNetworksPrune removes unused local networks -func (daemon *Daemon) localNetworksPrune(pruneFilters filters.Args) (*types.NetworksPruneReport, error) { - rep := &types.NetworksPruneReport{} - var err error - // When the function returns true, the walk will stop. - l := func(nw libnetwork.Network) bool { - nwName := nw.Name() - predefined := runconfig.IsPreDefinedNetwork(nwName) - if !predefined && len(nw.Endpoints()) == 0 { - if err = daemon.DeleteNetwork(nw.ID()); err != nil { - logrus.Warnf("could not remove network %s: %v", nwName, err) - return false - } - rep.NetworksDeleted = append(rep.NetworksDeleted, nwName) - } - return false - } - daemon.netController.WalkNetworks(l) - return rep, err -} - -// clusterNetworksPrune removes unused cluster networks -func (daemon *Daemon) clusterNetworksPrune(pruneFilters filters.Args) (*types.NetworksPruneReport, error) { - rep := &types.NetworksPruneReport{} - cluster := daemon.GetCluster() - networks, err := cluster.GetNetworks() - if err != nil { - return rep, err - } - networkIsInUse := regexp.MustCompile(`network ([[:alnum:]]+) is in use`) - for _, nw := range networks { - if nw.Name == "ingress" { - continue - } - // https://github.com/docker/docker/issues/24186 - // `docker network inspect` unfortunately displays ONLY those containers that are local to that node. - // So we try to remove it anyway and check the error - err = cluster.RemoveNetwork(nw.ID) - if err != nil { - // we can safely ignore the "network .. is in use" error - match := networkIsInUse.FindStringSubmatch(err.Error()) - if len(match) != 2 || match[1] != nw.ID { - logrus.Warnf("could not remove network %s: %v", nw.Name, err) - } - continue - } - rep.NetworksDeleted = append(rep.NetworksDeleted, nw.Name) - } - return rep, nil -} - -// NetworksPrune removes unused networks -func (daemon *Daemon) NetworksPrune(pruneFilters filters.Args) (*types.NetworksPruneReport, error) { - rep := &types.NetworksPruneReport{} - clusterRep, err := daemon.clusterNetworksPrune(pruneFilters) - if err != nil { - logrus.Warnf("could not remove cluster networks: %v", err) - } else { - rep.NetworksDeleted = append(rep.NetworksDeleted, clusterRep.NetworksDeleted...) - } - localRep, err := daemon.localNetworksPrune(pruneFilters) - if err != nil { - logrus.Warnf("could not remove local networks: %v", err) - } else { - rep.NetworksDeleted = append(rep.NetworksDeleted, localRep.NetworksDeleted...) - } - return rep, err -} diff --git a/vendor/github.com/docker/docker/daemon/rename.go b/vendor/github.com/docker/docker/daemon/rename.go deleted file mode 100644 index ffb7715f2..000000000 --- a/vendor/github.com/docker/docker/daemon/rename.go +++ /dev/null @@ -1,122 +0,0 @@ -package daemon - -import ( - "fmt" - "strings" - - "github.com/Sirupsen/logrus" - dockercontainer "github.com/docker/docker/container" - "github.com/docker/libnetwork" -) - -// ContainerRename changes the name of a container, using the oldName -// to find the container. An error is returned if newName is already -// reserved. -func (daemon *Daemon) ContainerRename(oldName, newName string) error { - var ( - sid string - sb libnetwork.Sandbox - ) - - if oldName == "" || newName == "" { - return fmt.Errorf("Neither old nor new names may be empty") - } - - if newName[0] != '/' { - newName = "/" + newName - } - - container, err := daemon.GetContainer(oldName) - if err != nil { - return err - } - - oldName = container.Name - oldIsAnonymousEndpoint := container.NetworkSettings.IsAnonymousEndpoint - - if oldName == newName { - return fmt.Errorf("Renaming a container with the same name as its current name") - } - - container.Lock() - defer container.Unlock() - - links := map[string]*dockercontainer.Container{} - for k, v := range daemon.linkIndex.children(container) { - if !strings.HasPrefix(k, oldName) { - return fmt.Errorf("Linked container %s does not match parent %s", k, oldName) - } - links[strings.TrimPrefix(k, oldName)] = v - } - - if newName, err = daemon.reserveName(container.ID, newName); err != nil { - return fmt.Errorf("Error when allocating new name: %v", err) - } - - for k, v := range links { - daemon.nameIndex.Reserve(newName+k, v.ID) - daemon.linkIndex.link(container, v, newName+k) - } - - container.Name = newName - container.NetworkSettings.IsAnonymousEndpoint = false - - defer func() { - if err != nil { - container.Name = oldName - container.NetworkSettings.IsAnonymousEndpoint = oldIsAnonymousEndpoint - daemon.reserveName(container.ID, oldName) - for k, v := range links { - daemon.nameIndex.Reserve(oldName+k, v.ID) - daemon.linkIndex.link(container, v, oldName+k) - daemon.linkIndex.unlink(newName+k, v, container) - daemon.nameIndex.Release(newName + k) - } - daemon.releaseName(newName) - } - }() - - for k, v := range links { - daemon.linkIndex.unlink(oldName+k, v, container) - daemon.nameIndex.Release(oldName + k) - } - daemon.releaseName(oldName) - if err = container.ToDisk(); err != nil { - return err - } - - attributes := map[string]string{ - "oldName": oldName, - } - - if !container.Running { - daemon.LogContainerEventWithAttributes(container, "rename", attributes) - return nil - } - - defer func() { - if err != nil { - container.Name = oldName - container.NetworkSettings.IsAnonymousEndpoint = oldIsAnonymousEndpoint - if e := container.ToDisk(); e != nil { - logrus.Errorf("%s: Failed in writing to Disk on rename failure: %v", container.ID, e) - } - } - }() - - sid = container.NetworkSettings.SandboxID - if daemon.netController != nil { - sb, err = daemon.netController.SandboxByID(sid) - if err != nil { - return err - } - - err = sb.Rename(strings.TrimPrefix(container.Name, "/")) - if err != nil { - return err - } - } - - daemon.LogContainerEventWithAttributes(container, "rename", attributes) - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/resize.go b/vendor/github.com/docker/docker/daemon/resize.go deleted file mode 100644 index 747353852..000000000 --- a/vendor/github.com/docker/docker/daemon/resize.go +++ /dev/null @@ -1,40 +0,0 @@ -package daemon - -import ( - "fmt" - - "github.com/docker/docker/libcontainerd" -) - -// ContainerResize changes the size of the TTY of the process running -// in the container with the given name to the given height and width. -func (daemon *Daemon) ContainerResize(name string, height, width int) error { - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - if !container.IsRunning() { - return errNotRunning{container.ID} - } - - if err = daemon.containerd.Resize(container.ID, libcontainerd.InitFriendlyName, width, height); err == nil { - attributes := map[string]string{ - "height": fmt.Sprintf("%d", height), - "width": fmt.Sprintf("%d", width), - } - daemon.LogContainerEventWithAttributes(container, "resize", attributes) - } - return err -} - -// ContainerExecResize changes the size of the TTY of the process -// running in the exec with the given name to the given height and -// width. -func (daemon *Daemon) ContainerExecResize(name string, height, width int) error { - ec, err := daemon.getExecConfig(name) - if err != nil { - return err - } - return daemon.containerd.Resize(ec.ContainerID, ec.ID, width, height) -} diff --git a/vendor/github.com/docker/docker/daemon/restart.go b/vendor/github.com/docker/docker/daemon/restart.go deleted file mode 100644 index 79292f375..000000000 --- a/vendor/github.com/docker/docker/daemon/restart.go +++ /dev/null @@ -1,70 +0,0 @@ -package daemon - -import ( - "fmt" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/container" -) - -// ContainerRestart stops and starts a container. It attempts to -// gracefully stop the container within the given timeout, forcefully -// stopping it if the timeout is exceeded. If given a negative -// timeout, ContainerRestart will wait forever until a graceful -// stop. Returns an error if the container cannot be found, or if -// there is an underlying error at any stage of the restart. -func (daemon *Daemon) ContainerRestart(name string, seconds *int) error { - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - if seconds == nil { - stopTimeout := container.StopTimeout() - seconds = &stopTimeout - } - if err := daemon.containerRestart(container, *seconds); err != nil { - return fmt.Errorf("Cannot restart container %s: %v", name, err) - } - return nil - -} - -// containerRestart attempts to gracefully stop and then start the -// container. When stopping, wait for the given duration in seconds to -// gracefully stop, before forcefully terminating the container. If -// given a negative duration, wait forever for a graceful stop. -func (daemon *Daemon) containerRestart(container *container.Container, seconds int) error { - // Avoid unnecessarily unmounting and then directly mounting - // the container when the container stops and then starts - // again - if err := daemon.Mount(container); err == nil { - defer daemon.Unmount(container) - } - - if container.IsRunning() { - // set AutoRemove flag to false before stop so the container won't be - // removed during restart process - autoRemove := container.HostConfig.AutoRemove - - container.HostConfig.AutoRemove = false - err := daemon.containerStop(container, seconds) - // restore AutoRemove irrespective of whether the stop worked or not - container.HostConfig.AutoRemove = autoRemove - // containerStop will write HostConfig to disk, we shall restore AutoRemove - // in disk too - if toDiskErr := container.ToDiskLocking(); toDiskErr != nil { - logrus.Errorf("Write container to disk error: %v", toDiskErr) - } - - if err != nil { - return err - } - } - - if err := daemon.containerStart(container, "", "", true); err != nil { - return err - } - - daemon.LogContainerEvent(container, "restart") - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/search.go b/vendor/github.com/docker/docker/daemon/search.go deleted file mode 100644 index 5d2ac5d22..000000000 --- a/vendor/github.com/docker/docker/daemon/search.go +++ /dev/null @@ -1,94 +0,0 @@ -package daemon - -import ( - "fmt" - "strconv" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/dockerversion" -) - -var acceptedSearchFilterTags = map[string]bool{ - "is-automated": true, - "is-official": true, - "stars": true, -} - -// SearchRegistryForImages queries the registry for images matching -// term. authConfig is used to login. -func (daemon *Daemon) SearchRegistryForImages(ctx context.Context, filtersArgs string, term string, limit int, - authConfig *types.AuthConfig, - headers map[string][]string) (*registrytypes.SearchResults, error) { - - searchFilters, err := filters.FromParam(filtersArgs) - if err != nil { - return nil, err - } - if err := searchFilters.Validate(acceptedSearchFilterTags); err != nil { - return nil, err - } - - var isAutomated, isOfficial bool - var hasStarFilter = 0 - if searchFilters.Include("is-automated") { - if searchFilters.UniqueExactMatch("is-automated", "true") { - isAutomated = true - } else if !searchFilters.UniqueExactMatch("is-automated", "false") { - return nil, fmt.Errorf("Invalid filter 'is-automated=%s'", searchFilters.Get("is-automated")) - } - } - if searchFilters.Include("is-official") { - if searchFilters.UniqueExactMatch("is-official", "true") { - isOfficial = true - } else if !searchFilters.UniqueExactMatch("is-official", "false") { - return nil, fmt.Errorf("Invalid filter 'is-official=%s'", searchFilters.Get("is-official")) - } - } - if searchFilters.Include("stars") { - hasStars := searchFilters.Get("stars") - for _, hasStar := range hasStars { - iHasStar, err := strconv.Atoi(hasStar) - if err != nil { - return nil, fmt.Errorf("Invalid filter 'stars=%s'", hasStar) - } - if iHasStar > hasStarFilter { - hasStarFilter = iHasStar - } - } - } - - unfilteredResult, err := daemon.RegistryService.Search(ctx, term, limit, authConfig, dockerversion.DockerUserAgent(ctx), headers) - if err != nil { - return nil, err - } - - filteredResults := []registrytypes.SearchResult{} - for _, result := range unfilteredResult.Results { - if searchFilters.Include("is-automated") { - if isAutomated != result.IsAutomated { - continue - } - } - if searchFilters.Include("is-official") { - if isOfficial != result.IsOfficial { - continue - } - } - if searchFilters.Include("stars") { - if result.StarCount < hasStarFilter { - continue - } - } - filteredResults = append(filteredResults, result) - } - - return ®istrytypes.SearchResults{ - Query: unfilteredResult.Query, - NumResults: len(filteredResults), - Results: filteredResults, - }, nil -} diff --git a/vendor/github.com/docker/docker/daemon/search_test.go b/vendor/github.com/docker/docker/daemon/search_test.go deleted file mode 100644 index f5aa85a61..000000000 --- a/vendor/github.com/docker/docker/daemon/search_test.go +++ /dev/null @@ -1,358 +0,0 @@ -package daemon - -import ( - "fmt" - "strings" - "testing" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/registry" -) - -type FakeService struct { - registry.DefaultService - - shouldReturnError bool - - term string - results []registrytypes.SearchResult -} - -func (s *FakeService) Search(ctx context.Context, term string, limit int, authConfig *types.AuthConfig, userAgent string, headers map[string][]string) (*registrytypes.SearchResults, error) { - if s.shouldReturnError { - return nil, fmt.Errorf("Search unknown error") - } - return ®istrytypes.SearchResults{ - Query: s.term, - NumResults: len(s.results), - Results: s.results, - }, nil -} - -func TestSearchRegistryForImagesErrors(t *testing.T) { - errorCases := []struct { - filtersArgs string - shouldReturnError bool - expectedError string - }{ - { - expectedError: "Search unknown error", - shouldReturnError: true, - }, - { - filtersArgs: "invalid json", - expectedError: "invalid character 'i' looking for beginning of value", - }, - { - filtersArgs: `{"type":{"custom":true}}`, - expectedError: "Invalid filter 'type'", - }, - { - filtersArgs: `{"is-automated":{"invalid":true}}`, - expectedError: "Invalid filter 'is-automated=[invalid]'", - }, - { - filtersArgs: `{"is-automated":{"true":true,"false":true}}`, - expectedError: "Invalid filter 'is-automated", - }, - { - filtersArgs: `{"is-official":{"invalid":true}}`, - expectedError: "Invalid filter 'is-official=[invalid]'", - }, - { - filtersArgs: `{"is-official":{"true":true,"false":true}}`, - expectedError: "Invalid filter 'is-official", - }, - { - filtersArgs: `{"stars":{"invalid":true}}`, - expectedError: "Invalid filter 'stars=invalid'", - }, - { - filtersArgs: `{"stars":{"1":true,"invalid":true}}`, - expectedError: "Invalid filter 'stars=invalid'", - }, - } - for index, e := range errorCases { - daemon := &Daemon{ - RegistryService: &FakeService{ - shouldReturnError: e.shouldReturnError, - }, - } - _, err := daemon.SearchRegistryForImages(context.Background(), e.filtersArgs, "term", 25, nil, map[string][]string{}) - if err == nil { - t.Errorf("%d: expected an error, got nothing", index) - } - if !strings.Contains(err.Error(), e.expectedError) { - t.Errorf("%d: expected error to contain %s, got %s", index, e.expectedError, err.Error()) - } - } -} - -func TestSearchRegistryForImages(t *testing.T) { - term := "term" - successCases := []struct { - filtersArgs string - registryResults []registrytypes.SearchResult - expectedResults []registrytypes.SearchResult - }{ - { - filtersArgs: "", - registryResults: []registrytypes.SearchResult{}, - expectedResults: []registrytypes.SearchResult{}, - }, - { - filtersArgs: "", - registryResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - }, - }, - expectedResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - }, - }, - }, - { - filtersArgs: `{"is-automated":{"true":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - }, - }, - expectedResults: []registrytypes.SearchResult{}, - }, - { - filtersArgs: `{"is-automated":{"true":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - IsAutomated: true, - }, - }, - expectedResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - IsAutomated: true, - }, - }, - }, - { - filtersArgs: `{"is-automated":{"false":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - IsAutomated: true, - }, - }, - expectedResults: []registrytypes.SearchResult{}, - }, - { - filtersArgs: `{"is-automated":{"false":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - IsAutomated: false, - }, - }, - expectedResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - IsAutomated: false, - }, - }, - }, - { - filtersArgs: `{"is-official":{"true":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - }, - }, - expectedResults: []registrytypes.SearchResult{}, - }, - { - filtersArgs: `{"is-official":{"true":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - IsOfficial: true, - }, - }, - expectedResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - IsOfficial: true, - }, - }, - }, - { - filtersArgs: `{"is-official":{"false":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - IsOfficial: true, - }, - }, - expectedResults: []registrytypes.SearchResult{}, - }, - { - filtersArgs: `{"is-official":{"false":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - IsOfficial: false, - }, - }, - expectedResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - IsOfficial: false, - }, - }, - }, - { - filtersArgs: `{"stars":{"0":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - StarCount: 0, - }, - }, - expectedResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - StarCount: 0, - }, - }, - }, - { - filtersArgs: `{"stars":{"1":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name", - Description: "description", - StarCount: 0, - }, - }, - expectedResults: []registrytypes.SearchResult{}, - }, - { - filtersArgs: `{"stars":{"1":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name0", - Description: "description0", - StarCount: 0, - }, - { - Name: "name1", - Description: "description1", - StarCount: 1, - }, - }, - expectedResults: []registrytypes.SearchResult{ - { - Name: "name1", - Description: "description1", - StarCount: 1, - }, - }, - }, - { - filtersArgs: `{"stars":{"1":true}, "is-official":{"true":true}, "is-automated":{"true":true}}`, - registryResults: []registrytypes.SearchResult{ - { - Name: "name0", - Description: "description0", - StarCount: 0, - IsOfficial: true, - IsAutomated: true, - }, - { - Name: "name1", - Description: "description1", - StarCount: 1, - IsOfficial: false, - IsAutomated: true, - }, - { - Name: "name2", - Description: "description2", - StarCount: 1, - IsOfficial: true, - IsAutomated: false, - }, - { - Name: "name3", - Description: "description3", - StarCount: 2, - IsOfficial: true, - IsAutomated: true, - }, - }, - expectedResults: []registrytypes.SearchResult{ - { - Name: "name3", - Description: "description3", - StarCount: 2, - IsOfficial: true, - IsAutomated: true, - }, - }, - }, - } - for index, s := range successCases { - daemon := &Daemon{ - RegistryService: &FakeService{ - term: term, - results: s.registryResults, - }, - } - results, err := daemon.SearchRegistryForImages(context.Background(), s.filtersArgs, term, 25, nil, map[string][]string{}) - if err != nil { - t.Errorf("%d: %v", index, err) - } - if results.Query != term { - t.Errorf("%d: expected Query to be %s, got %s", index, term, results.Query) - } - if results.NumResults != len(s.expectedResults) { - t.Errorf("%d: expected NumResults to be %d, got %d", index, len(s.expectedResults), results.NumResults) - } - for _, result := range results.Results { - found := false - for _, expectedResult := range s.expectedResults { - if expectedResult.Name == result.Name && - expectedResult.Description == result.Description && - expectedResult.IsAutomated == result.IsAutomated && - expectedResult.IsOfficial == result.IsOfficial && - expectedResult.StarCount == result.StarCount { - found = true - break - } - } - if !found { - t.Errorf("%d: expected results %v, got %v", index, s.expectedResults, results.Results) - } - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/seccomp_disabled.go b/vendor/github.com/docker/docker/daemon/seccomp_disabled.go deleted file mode 100644 index ff1127b6c..000000000 --- a/vendor/github.com/docker/docker/daemon/seccomp_disabled.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build linux,!seccomp - -package daemon - -import ( - "fmt" - - "github.com/docker/docker/container" - "github.com/opencontainers/runtime-spec/specs-go" -) - -var supportsSeccomp = false - -func setSeccomp(daemon *Daemon, rs *specs.Spec, c *container.Container) error { - if c.SeccompProfile != "" && c.SeccompProfile != "unconfined" { - return fmt.Errorf("seccomp profiles are not supported on this daemon, you cannot specify a custom seccomp profile") - } - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/seccomp_linux.go b/vendor/github.com/docker/docker/daemon/seccomp_linux.go deleted file mode 100644 index 7f16733d9..000000000 --- a/vendor/github.com/docker/docker/daemon/seccomp_linux.go +++ /dev/null @@ -1,55 +0,0 @@ -// +build linux,seccomp - -package daemon - -import ( - "fmt" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/container" - "github.com/docker/docker/profiles/seccomp" - "github.com/opencontainers/runtime-spec/specs-go" -) - -var supportsSeccomp = true - -func setSeccomp(daemon *Daemon, rs *specs.Spec, c *container.Container) error { - var profile *specs.Seccomp - var err error - - if c.HostConfig.Privileged { - return nil - } - - if !daemon.seccompEnabled { - if c.SeccompProfile != "" && c.SeccompProfile != "unconfined" { - return fmt.Errorf("Seccomp is not enabled in your kernel, cannot run a custom seccomp profile.") - } - logrus.Warn("Seccomp is not enabled in your kernel, running container without default profile.") - c.SeccompProfile = "unconfined" - } - if c.SeccompProfile == "unconfined" { - return nil - } - if c.SeccompProfile != "" { - profile, err = seccomp.LoadProfile(c.SeccompProfile, rs) - if err != nil { - return err - } - } else { - if daemon.seccompProfile != nil { - profile, err = seccomp.LoadProfile(string(daemon.seccompProfile), rs) - if err != nil { - return err - } - } else { - profile, err = seccomp.GetDefaultProfile(rs) - if err != nil { - return err - } - } - } - - rs.Linux.Seccomp = profile - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/seccomp_unsupported.go b/vendor/github.com/docker/docker/daemon/seccomp_unsupported.go deleted file mode 100644 index b3691e96a..000000000 --- a/vendor/github.com/docker/docker/daemon/seccomp_unsupported.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build !linux - -package daemon - -var supportsSeccomp = false diff --git a/vendor/github.com/docker/docker/daemon/secrets.go b/vendor/github.com/docker/docker/daemon/secrets.go deleted file mode 100644 index 355cb1e13..000000000 --- a/vendor/github.com/docker/docker/daemon/secrets.go +++ /dev/null @@ -1,36 +0,0 @@ -package daemon - -import ( - "github.com/Sirupsen/logrus" - swarmtypes "github.com/docker/docker/api/types/swarm" - "github.com/docker/swarmkit/agent/exec" -) - -// SetContainerSecretStore sets the secret store backend for the container -func (daemon *Daemon) SetContainerSecretStore(name string, store exec.SecretGetter) error { - c, err := daemon.GetContainer(name) - if err != nil { - return err - } - - c.SecretStore = store - - return nil -} - -// SetContainerSecretReferences sets the container secret references needed -func (daemon *Daemon) SetContainerSecretReferences(name string, refs []*swarmtypes.SecretReference) error { - if !secretsSupported() && len(refs) > 0 { - logrus.Warn("secrets are not supported on this platform") - return nil - } - - c, err := daemon.GetContainer(name) - if err != nil { - return err - } - - c.SecretReferences = refs - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/secrets_linux.go b/vendor/github.com/docker/docker/daemon/secrets_linux.go deleted file mode 100644 index fca4e1259..000000000 --- a/vendor/github.com/docker/docker/daemon/secrets_linux.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build linux - -package daemon - -func secretsSupported() bool { - return true -} diff --git a/vendor/github.com/docker/docker/daemon/secrets_unsupported.go b/vendor/github.com/docker/docker/daemon/secrets_unsupported.go deleted file mode 100644 index d6f36fda1..000000000 --- a/vendor/github.com/docker/docker/daemon/secrets_unsupported.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !linux - -package daemon - -func secretsSupported() bool { - return false -} diff --git a/vendor/github.com/docker/docker/daemon/selinux_linux.go b/vendor/github.com/docker/docker/daemon/selinux_linux.go deleted file mode 100644 index 83a344711..000000000 --- a/vendor/github.com/docker/docker/daemon/selinux_linux.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build linux - -package daemon - -import "github.com/opencontainers/runc/libcontainer/selinux" - -func selinuxSetDisabled() { - selinux.SetDisabled() -} - -func selinuxFreeLxcContexts(label string) { - selinux.FreeLxcContexts(label) -} - -func selinuxEnabled() bool { - return selinux.SelinuxEnabled() -} diff --git a/vendor/github.com/docker/docker/daemon/selinux_unsupported.go b/vendor/github.com/docker/docker/daemon/selinux_unsupported.go deleted file mode 100644 index 25a56ad15..000000000 --- a/vendor/github.com/docker/docker/daemon/selinux_unsupported.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build !linux - -package daemon - -func selinuxSetDisabled() { -} - -func selinuxFreeLxcContexts(label string) { -} - -func selinuxEnabled() bool { - return false -} diff --git a/vendor/github.com/docker/docker/daemon/start.go b/vendor/github.com/docker/docker/daemon/start.go deleted file mode 100644 index 6c94fd548..000000000 --- a/vendor/github.com/docker/docker/daemon/start.go +++ /dev/null @@ -1,230 +0,0 @@ -package daemon - -import ( - "fmt" - "net/http" - "runtime" - "strings" - "syscall" - "time" - - "google.golang.org/grpc" - - "github.com/Sirupsen/logrus" - apierrors "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" - "github.com/docker/docker/container" - "github.com/docker/docker/runconfig" -) - -// ContainerStart starts a container. -func (daemon *Daemon) ContainerStart(name string, hostConfig *containertypes.HostConfig, checkpoint string, checkpointDir string) error { - if checkpoint != "" && !daemon.HasExperimental() { - return apierrors.NewBadRequestError(fmt.Errorf("checkpoint is only supported in experimental mode")) - } - - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - if container.IsPaused() { - return fmt.Errorf("Cannot start a paused container, try unpause instead.") - } - - if container.IsRunning() { - err := fmt.Errorf("Container already started") - return apierrors.NewErrorWithStatusCode(err, http.StatusNotModified) - } - - // Windows does not have the backwards compatibility issue here. - if runtime.GOOS != "windows" { - // This is kept for backward compatibility - hostconfig should be passed when - // creating a container, not during start. - if hostConfig != nil { - logrus.Warn("DEPRECATED: Setting host configuration options when the container starts is deprecated and has been removed in Docker 1.12") - oldNetworkMode := container.HostConfig.NetworkMode - if err := daemon.setSecurityOptions(container, hostConfig); err != nil { - return err - } - if err := daemon.mergeAndVerifyLogConfig(&hostConfig.LogConfig); err != nil { - return err - } - if err := daemon.setHostConfig(container, hostConfig); err != nil { - return err - } - newNetworkMode := container.HostConfig.NetworkMode - if string(oldNetworkMode) != string(newNetworkMode) { - // if user has change the network mode on starting, clean up the - // old networks. It is a deprecated feature and has been removed in Docker 1.12 - container.NetworkSettings.Networks = nil - if err := container.ToDisk(); err != nil { - return err - } - } - container.InitDNSHostConfig() - } - } else { - if hostConfig != nil { - return fmt.Errorf("Supplying a hostconfig on start is not supported. It should be supplied on create") - } - } - - // check if hostConfig is in line with the current system settings. - // It may happen cgroups are umounted or the like. - if _, err = daemon.verifyContainerSettings(container.HostConfig, nil, false); err != nil { - return err - } - // Adapt for old containers in case we have updates in this function and - // old containers never have chance to call the new function in create stage. - if hostConfig != nil { - if err := daemon.adaptContainerSettings(container.HostConfig, false); err != nil { - return err - } - } - - return daemon.containerStart(container, checkpoint, checkpointDir, true) -} - -// Start starts a container -func (daemon *Daemon) Start(container *container.Container) error { - return daemon.containerStart(container, "", "", true) -} - -// containerStart prepares the container to run by setting up everything the -// container needs, such as storage and networking, as well as links -// between containers. The container is left waiting for a signal to -// begin running. -func (daemon *Daemon) containerStart(container *container.Container, checkpoint string, checkpointDir string, resetRestartManager bool) (err error) { - start := time.Now() - container.Lock() - defer container.Unlock() - - if resetRestartManager && container.Running { // skip this check if already in restarting step and resetRestartManager==false - return nil - } - - if container.RemovalInProgress || container.Dead { - return fmt.Errorf("Container is marked for removal and cannot be started.") - } - - // if we encounter an error during start we need to ensure that any other - // setup has been cleaned up properly - defer func() { - if err != nil { - container.SetError(err) - // if no one else has set it, make sure we don't leave it at zero - if container.ExitCode() == 0 { - container.SetExitCode(128) - } - container.ToDisk() - - container.Reset(false) - - daemon.Cleanup(container) - // if containers AutoRemove flag is set, remove it after clean up - if container.HostConfig.AutoRemove { - container.Unlock() - if err := daemon.ContainerRm(container.ID, &types.ContainerRmConfig{ForceRemove: true, RemoveVolume: true}); err != nil { - logrus.Errorf("can't remove container %s: %v", container.ID, err) - } - container.Lock() - } - } - }() - - if err := daemon.conditionalMountOnStart(container); err != nil { - return err - } - - // Make sure NetworkMode has an acceptable value. We do this to ensure - // backwards API compatibility. - container.HostConfig = runconfig.SetDefaultNetModeIfBlank(container.HostConfig) - - if err := daemon.initializeNetworking(container); err != nil { - return err - } - - spec, err := daemon.createSpec(container) - if err != nil { - return err - } - - createOptions, err := daemon.getLibcontainerdCreateOptions(container) - if err != nil { - return err - } - - if resetRestartManager { - container.ResetRestartManager(true) - } - - if checkpointDir == "" { - checkpointDir = container.CheckpointDir() - } - - if err := daemon.containerd.Create(container.ID, checkpoint, checkpointDir, *spec, container.InitializeStdio, createOptions...); err != nil { - errDesc := grpc.ErrorDesc(err) - contains := func(s1, s2 string) bool { - return strings.Contains(strings.ToLower(s1), s2) - } - logrus.Errorf("Create container failed with error: %s", errDesc) - // if we receive an internal error from the initial start of a container then lets - // return it instead of entering the restart loop - // set to 127 for container cmd not found/does not exist) - if contains(errDesc, container.Path) && - (contains(errDesc, "executable file not found") || - contains(errDesc, "no such file or directory") || - contains(errDesc, "system cannot find the file specified")) { - container.SetExitCode(127) - } - // set to 126 for container cmd can't be invoked errors - if contains(errDesc, syscall.EACCES.Error()) { - container.SetExitCode(126) - } - - // attempted to mount a file onto a directory, or a directory onto a file, maybe from user specified bind mounts - if contains(errDesc, syscall.ENOTDIR.Error()) { - errDesc += ": Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type" - container.SetExitCode(127) - } - - return fmt.Errorf("%s", errDesc) - } - - containerActions.WithValues("start").UpdateSince(start) - - return nil -} - -// Cleanup releases any network resources allocated to the container along with any rules -// around how containers are linked together. It also unmounts the container's root filesystem. -func (daemon *Daemon) Cleanup(container *container.Container) { - daemon.releaseNetwork(container) - - container.UnmountIpcMounts(detachMounted) - - if err := daemon.conditionalUnmountOnCleanup(container); err != nil { - // FIXME: remove once reference counting for graphdrivers has been refactored - // Ensure that all the mounts are gone - if mountid, err := daemon.layerStore.GetMountID(container.ID); err == nil { - daemon.cleanupMountsByID(mountid) - } - } - - if err := container.UnmountSecrets(); err != nil { - logrus.Warnf("%s cleanup: failed to unmount secrets: %s", container.ID, err) - } - - for _, eConfig := range container.ExecCommands.Commands() { - daemon.unregisterExecCommand(container, eConfig) - } - - if container.BaseFS != "" { - if err := container.UnmountVolumes(daemon.LogVolumeEvent); err != nil { - logrus.Warnf("%s cleanup: Failed to umount volumes: %v", container.ID, err) - } - } - container.CancelAttachContext() -} diff --git a/vendor/github.com/docker/docker/daemon/start_unix.go b/vendor/github.com/docker/docker/daemon/start_unix.go deleted file mode 100644 index 6bbe48507..000000000 --- a/vendor/github.com/docker/docker/daemon/start_unix.go +++ /dev/null @@ -1,31 +0,0 @@ -// +build !windows - -package daemon - -import ( - "fmt" - - "github.com/docker/docker/container" - "github.com/docker/docker/libcontainerd" -) - -func (daemon *Daemon) getLibcontainerdCreateOptions(container *container.Container) ([]libcontainerd.CreateOption, error) { - createOptions := []libcontainerd.CreateOption{} - - // Ensure a runtime has been assigned to this container - if container.HostConfig.Runtime == "" { - container.HostConfig.Runtime = stockRuntimeName - container.ToDisk() - } - - rt := daemon.configStore.GetRuntime(container.HostConfig.Runtime) - if rt == nil { - return nil, fmt.Errorf("no such runtime '%s'", container.HostConfig.Runtime) - } - if UsingSystemd(daemon.configStore) { - rt.Args = append(rt.Args, "--systemd-cgroup=true") - } - createOptions = append(createOptions, libcontainerd.WithRuntime(rt.Path, rt.Args)) - - return createOptions, nil -} diff --git a/vendor/github.com/docker/docker/daemon/start_windows.go b/vendor/github.com/docker/docker/daemon/start_windows.go deleted file mode 100644 index faa757522..000000000 --- a/vendor/github.com/docker/docker/daemon/start_windows.go +++ /dev/null @@ -1,205 +0,0 @@ -package daemon - -import ( - "fmt" - "io/ioutil" - "path/filepath" - "strings" - - "github.com/docker/docker/container" - "github.com/docker/docker/layer" - "github.com/docker/docker/libcontainerd" - "golang.org/x/sys/windows/registry" -) - -const ( - credentialSpecRegistryLocation = `SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs` - credentialSpecFileLocation = "CredentialSpecs" -) - -func (daemon *Daemon) getLibcontainerdCreateOptions(container *container.Container) ([]libcontainerd.CreateOption, error) { - createOptions := []libcontainerd.CreateOption{} - - // Are we going to run as a Hyper-V container? - hvOpts := &libcontainerd.HyperVIsolationOption{} - if container.HostConfig.Isolation.IsDefault() { - // Container is set to use the default, so take the default from the daemon configuration - hvOpts.IsHyperV = daemon.defaultIsolation.IsHyperV() - } else { - // Container is requesting an isolation mode. Honour it. - hvOpts.IsHyperV = container.HostConfig.Isolation.IsHyperV() - } - - // Generate the layer folder of the layer options - layerOpts := &libcontainerd.LayerOption{} - m, err := container.RWLayer.Metadata() - if err != nil { - return nil, fmt.Errorf("failed to get layer metadata - %s", err) - } - if hvOpts.IsHyperV { - hvOpts.SandboxPath = filepath.Dir(m["dir"]) - } - - layerOpts.LayerFolderPath = m["dir"] - - // Generate the layer paths of the layer options - img, err := daemon.imageStore.Get(container.ImageID) - if err != nil { - return nil, fmt.Errorf("failed to graph.Get on ImageID %s - %s", container.ImageID, err) - } - // Get the layer path for each layer. - max := len(img.RootFS.DiffIDs) - for i := 1; i <= max; i++ { - img.RootFS.DiffIDs = img.RootFS.DiffIDs[:i] - layerPath, err := layer.GetLayerPath(daemon.layerStore, img.RootFS.ChainID()) - if err != nil { - return nil, fmt.Errorf("failed to get layer path from graphdriver %s for ImageID %s - %s", daemon.layerStore, img.RootFS.ChainID(), err) - } - // Reverse order, expecting parent most first - layerOpts.LayerPaths = append([]string{layerPath}, layerOpts.LayerPaths...) - } - - // Get endpoints for the libnetwork allocated networks to the container - var epList []string - AllowUnqualifiedDNSQuery := false - gwHNSID := "" - if container.NetworkSettings != nil { - for n := range container.NetworkSettings.Networks { - sn, err := daemon.FindNetwork(n) - if err != nil { - continue - } - - ep, err := container.GetEndpointInNetwork(sn) - if err != nil { - continue - } - - data, err := ep.DriverInfo() - if err != nil { - continue - } - - if data["GW_INFO"] != nil { - gwInfo := data["GW_INFO"].(map[string]interface{}) - if gwInfo["hnsid"] != nil { - gwHNSID = gwInfo["hnsid"].(string) - } - } - - if data["hnsid"] != nil { - epList = append(epList, data["hnsid"].(string)) - } - - if data["AllowUnqualifiedDNSQuery"] != nil { - AllowUnqualifiedDNSQuery = true - } - } - } - - if gwHNSID != "" { - epList = append(epList, gwHNSID) - } - - // Read and add credentials from the security options if a credential spec has been provided. - if container.HostConfig.SecurityOpt != nil { - for _, sOpt := range container.HostConfig.SecurityOpt { - sOpt = strings.ToLower(sOpt) - if !strings.Contains(sOpt, "=") { - return nil, fmt.Errorf("invalid security option: no equals sign in supplied value %s", sOpt) - } - var splitsOpt []string - splitsOpt = strings.SplitN(sOpt, "=", 2) - if len(splitsOpt) != 2 { - return nil, fmt.Errorf("invalid security option: %s", sOpt) - } - if splitsOpt[0] != "credentialspec" { - return nil, fmt.Errorf("security option not supported: %s", splitsOpt[0]) - } - - credentialsOpts := &libcontainerd.CredentialsOption{} - var ( - match bool - csValue string - err error - ) - if match, csValue = getCredentialSpec("file://", splitsOpt[1]); match { - if csValue == "" { - return nil, fmt.Errorf("no value supplied for file:// credential spec security option") - } - if credentialsOpts.Credentials, err = readCredentialSpecFile(container.ID, daemon.root, filepath.Clean(csValue)); err != nil { - return nil, err - } - } else if match, csValue = getCredentialSpec("registry://", splitsOpt[1]); match { - if csValue == "" { - return nil, fmt.Errorf("no value supplied for registry:// credential spec security option") - } - if credentialsOpts.Credentials, err = readCredentialSpecRegistry(container.ID, csValue); err != nil { - return nil, err - } - } else { - return nil, fmt.Errorf("invalid credential spec security option - value must be prefixed file:// or registry:// followed by a value") - } - createOptions = append(createOptions, credentialsOpts) - } - } - - // Now add the remaining options. - createOptions = append(createOptions, &libcontainerd.FlushOption{IgnoreFlushesDuringBoot: !container.HasBeenStartedBefore}) - createOptions = append(createOptions, hvOpts) - createOptions = append(createOptions, layerOpts) - if epList != nil { - createOptions = append(createOptions, &libcontainerd.NetworkEndpointsOption{Endpoints: epList, AllowUnqualifiedDNSQuery: AllowUnqualifiedDNSQuery}) - } - - return createOptions, nil -} - -// getCredentialSpec is a helper function to get the value of a credential spec supplied -// on the CLI, stripping the prefix -func getCredentialSpec(prefix, value string) (bool, string) { - if strings.HasPrefix(value, prefix) { - return true, strings.TrimPrefix(value, prefix) - } - return false, "" -} - -// readCredentialSpecRegistry is a helper function to read a credential spec from -// the registry. If not found, we return an empty string and warn in the log. -// This allows for staging on machines which do not have the necessary components. -func readCredentialSpecRegistry(id, name string) (string, error) { - var ( - k registry.Key - err error - val string - ) - if k, err = registry.OpenKey(registry.LOCAL_MACHINE, credentialSpecRegistryLocation, registry.QUERY_VALUE); err != nil { - return "", fmt.Errorf("failed handling spec %q for container %s - %s could not be opened", name, id, credentialSpecRegistryLocation) - } - if val, _, err = k.GetStringValue(name); err != nil { - if err == registry.ErrNotExist { - return "", fmt.Errorf("credential spec %q for container %s as it was not found", name, id) - } - return "", fmt.Errorf("error %v reading credential spec %q from registry for container %s", err, name, id) - } - return val, nil -} - -// readCredentialSpecFile is a helper function to read a credential spec from -// a file. If not found, we return an empty string and warn in the log. -// This allows for staging on machines which do not have the necessary components. -func readCredentialSpecFile(id, root, location string) (string, error) { - if filepath.IsAbs(location) { - return "", fmt.Errorf("invalid credential spec - file:// path cannot be absolute") - } - base := filepath.Join(root, credentialSpecFileLocation) - full := filepath.Join(base, location) - if !strings.HasPrefix(full, base) { - return "", fmt.Errorf("invalid credential spec - file:// path must be under %s", base) - } - bcontents, err := ioutil.ReadFile(full) - if err != nil { - return "", fmt.Errorf("credential spec '%s' for container %s as the file could not be read: %q", full, id, err) - } - return string(bcontents[:]), nil -} diff --git a/vendor/github.com/docker/docker/daemon/stats.go b/vendor/github.com/docker/docker/daemon/stats.go deleted file mode 100644 index 51f5962d1..000000000 --- a/vendor/github.com/docker/docker/daemon/stats.go +++ /dev/null @@ -1,158 +0,0 @@ -package daemon - -import ( - "encoding/json" - "errors" - "fmt" - "runtime" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/backend" - "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/api/types/versions/v1p20" - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/ioutils" -) - -// ContainerStats writes information about the container to the stream -// given in the config object. -func (daemon *Daemon) ContainerStats(ctx context.Context, prefixOrName string, config *backend.ContainerStatsConfig) error { - if runtime.GOOS == "solaris" { - return fmt.Errorf("%+v does not support stats", runtime.GOOS) - } - // Engine API version (used for backwards compatibility) - apiVersion := config.Version - - container, err := daemon.GetContainer(prefixOrName) - if err != nil { - return err - } - - // If the container is either not running or restarting and requires no stream, return an empty stats. - if (!container.IsRunning() || container.IsRestarting()) && !config.Stream { - return json.NewEncoder(config.OutStream).Encode(&types.Stats{}) - } - - outStream := config.OutStream - if config.Stream { - wf := ioutils.NewWriteFlusher(outStream) - defer wf.Close() - wf.Flush() - outStream = wf - } - - var preCPUStats types.CPUStats - var preRead time.Time - getStatJSON := func(v interface{}) *types.StatsJSON { - ss := v.(types.StatsJSON) - ss.Name = container.Name - ss.ID = container.ID - ss.PreCPUStats = preCPUStats - ss.PreRead = preRead - preCPUStats = ss.CPUStats - preRead = ss.Read - return &ss - } - - enc := json.NewEncoder(outStream) - - updates := daemon.subscribeToContainerStats(container) - defer daemon.unsubscribeToContainerStats(container, updates) - - noStreamFirstFrame := true - for { - select { - case v, ok := <-updates: - if !ok { - return nil - } - - var statsJSON interface{} - statsJSONPost120 := getStatJSON(v) - if versions.LessThan(apiVersion, "1.21") { - if runtime.GOOS == "windows" { - return errors.New("API versions pre v1.21 do not support stats on Windows") - } - var ( - rxBytes uint64 - rxPackets uint64 - rxErrors uint64 - rxDropped uint64 - txBytes uint64 - txPackets uint64 - txErrors uint64 - txDropped uint64 - ) - for _, v := range statsJSONPost120.Networks { - rxBytes += v.RxBytes - rxPackets += v.RxPackets - rxErrors += v.RxErrors - rxDropped += v.RxDropped - txBytes += v.TxBytes - txPackets += v.TxPackets - txErrors += v.TxErrors - txDropped += v.TxDropped - } - statsJSON = &v1p20.StatsJSON{ - Stats: statsJSONPost120.Stats, - Network: types.NetworkStats{ - RxBytes: rxBytes, - RxPackets: rxPackets, - RxErrors: rxErrors, - RxDropped: rxDropped, - TxBytes: txBytes, - TxPackets: txPackets, - TxErrors: txErrors, - TxDropped: txDropped, - }, - } - } else { - statsJSON = statsJSONPost120 - } - - if !config.Stream && noStreamFirstFrame { - // prime the cpu stats so they aren't 0 in the final output - noStreamFirstFrame = false - continue - } - - if err := enc.Encode(statsJSON); err != nil { - return err - } - - if !config.Stream { - return nil - } - case <-ctx.Done(): - return nil - } - } -} - -func (daemon *Daemon) subscribeToContainerStats(c *container.Container) chan interface{} { - return daemon.statsCollector.collect(c) -} - -func (daemon *Daemon) unsubscribeToContainerStats(c *container.Container, ch chan interface{}) { - daemon.statsCollector.unsubscribe(c, ch) -} - -// GetContainerStats collects all the stats published by a container -func (daemon *Daemon) GetContainerStats(container *container.Container) (*types.StatsJSON, error) { - stats, err := daemon.stats(container) - if err != nil { - return nil, err - } - - // We already have the network stats on Windows directly from HCS. - if !container.Config.NetworkDisabled && runtime.GOOS != "windows" { - if stats.Networks, err = daemon.getNetworkStats(container); err != nil { - return nil, err - } - } - - return stats, nil -} diff --git a/vendor/github.com/docker/docker/daemon/stats_collector.go b/vendor/github.com/docker/docker/daemon/stats_collector.go deleted file mode 100644 index dc6825e70..000000000 --- a/vendor/github.com/docker/docker/daemon/stats_collector.go +++ /dev/null @@ -1,132 +0,0 @@ -// +build !solaris - -package daemon - -import ( - "bufio" - "sync" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/pubsub" -) - -type statsSupervisor interface { - // GetContainerStats collects all the stats related to a container - GetContainerStats(container *container.Container) (*types.StatsJSON, error) -} - -// newStatsCollector returns a new statsCollector that collections -// stats for a registered container at the specified interval. -// The collector allows non-running containers to be added -// and will start processing stats when they are started. -func (daemon *Daemon) newStatsCollector(interval time.Duration) *statsCollector { - s := &statsCollector{ - interval: interval, - supervisor: daemon, - publishers: make(map[*container.Container]*pubsub.Publisher), - bufReader: bufio.NewReaderSize(nil, 128), - } - platformNewStatsCollector(s) - go s.run() - return s -} - -// statsCollector manages and provides container resource stats -type statsCollector struct { - m sync.Mutex - supervisor statsSupervisor - interval time.Duration - publishers map[*container.Container]*pubsub.Publisher - bufReader *bufio.Reader - - // The following fields are not set on Windows currently. - clockTicksPerSecond uint64 - machineMemory uint64 -} - -// collect registers the container with the collector and adds it to -// the event loop for collection on the specified interval returning -// a channel for the subscriber to receive on. -func (s *statsCollector) collect(c *container.Container) chan interface{} { - s.m.Lock() - defer s.m.Unlock() - publisher, exists := s.publishers[c] - if !exists { - publisher = pubsub.NewPublisher(100*time.Millisecond, 1024) - s.publishers[c] = publisher - } - return publisher.Subscribe() -} - -// stopCollection closes the channels for all subscribers and removes -// the container from metrics collection. -func (s *statsCollector) stopCollection(c *container.Container) { - s.m.Lock() - if publisher, exists := s.publishers[c]; exists { - publisher.Close() - delete(s.publishers, c) - } - s.m.Unlock() -} - -// unsubscribe removes a specific subscriber from receiving updates for a container's stats. -func (s *statsCollector) unsubscribe(c *container.Container, ch chan interface{}) { - s.m.Lock() - publisher := s.publishers[c] - if publisher != nil { - publisher.Evict(ch) - if publisher.Len() == 0 { - delete(s.publishers, c) - } - } - s.m.Unlock() -} - -func (s *statsCollector) run() { - type publishersPair struct { - container *container.Container - publisher *pubsub.Publisher - } - // we cannot determine the capacity here. - // it will grow enough in first iteration - var pairs []publishersPair - - for range time.Tick(s.interval) { - // it does not make sense in the first iteration, - // but saves allocations in further iterations - pairs = pairs[:0] - - s.m.Lock() - for container, publisher := range s.publishers { - // copy pointers here to release the lock ASAP - pairs = append(pairs, publishersPair{container, publisher}) - } - s.m.Unlock() - if len(pairs) == 0 { - continue - } - - systemUsage, err := s.getSystemCPUUsage() - if err != nil { - logrus.Errorf("collecting system cpu usage: %v", err) - continue - } - - for _, pair := range pairs { - stats, err := s.supervisor.GetContainerStats(pair.container) - if err != nil { - if _, ok := err.(errNotRunning); !ok { - logrus.Errorf("collecting stats for %s: %v", pair.container.ID, err) - } - continue - } - // FIXME: move to containerd on Linux (not Windows) - stats.CPUStats.SystemUsage = systemUsage - - pair.publisher.Publish(*stats) - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/stats_collector_solaris.go b/vendor/github.com/docker/docker/daemon/stats_collector_solaris.go deleted file mode 100644 index 9cf9f0a94..000000000 --- a/vendor/github.com/docker/docker/daemon/stats_collector_solaris.go +++ /dev/null @@ -1,34 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/container" - "time" -) - -// newStatsCollector returns a new statsCollector for collection stats -// for a registered container at the specified interval. The collector allows -// non-running containers to be added and will start processing stats when -// they are started. -func (daemon *Daemon) newStatsCollector(interval time.Duration) *statsCollector { - return &statsCollector{} -} - -// statsCollector manages and provides container resource stats -type statsCollector struct { -} - -// collect registers the container with the collector and adds it to -// the event loop for collection on the specified interval returning -// a channel for the subscriber to receive on. -func (s *statsCollector) collect(c *container.Container) chan interface{} { - return nil -} - -// stopCollection closes the channels for all subscribers and removes -// the container from metrics collection. -func (s *statsCollector) stopCollection(c *container.Container) { -} - -// unsubscribe removes a specific subscriber from receiving updates for a container's stats. -func (s *statsCollector) unsubscribe(c *container.Container, ch chan interface{}) { -} diff --git a/vendor/github.com/docker/docker/daemon/stats_collector_unix.go b/vendor/github.com/docker/docker/daemon/stats_collector_unix.go deleted file mode 100644 index 0fcc9c582..000000000 --- a/vendor/github.com/docker/docker/daemon/stats_collector_unix.go +++ /dev/null @@ -1,71 +0,0 @@ -// +build !windows,!solaris - -package daemon - -import ( - "fmt" - "os" - "strconv" - "strings" - - sysinfo "github.com/docker/docker/pkg/system" - "github.com/opencontainers/runc/libcontainer/system" -) - -// platformNewStatsCollector performs platform specific initialisation of the -// statsCollector structure. -func platformNewStatsCollector(s *statsCollector) { - s.clockTicksPerSecond = uint64(system.GetClockTicks()) - meminfo, err := sysinfo.ReadMemInfo() - if err == nil && meminfo.MemTotal > 0 { - s.machineMemory = uint64(meminfo.MemTotal) - } -} - -const nanoSecondsPerSecond = 1e9 - -// getSystemCPUUsage returns the host system's cpu usage in -// nanoseconds. An error is returned if the format of the underlying -// file does not match. -// -// Uses /proc/stat defined by POSIX. Looks for the cpu -// statistics line and then sums up the first seven fields -// provided. See `man 5 proc` for details on specific field -// information. -func (s *statsCollector) getSystemCPUUsage() (uint64, error) { - var line string - f, err := os.Open("/proc/stat") - if err != nil { - return 0, err - } - defer func() { - s.bufReader.Reset(nil) - f.Close() - }() - s.bufReader.Reset(f) - err = nil - for err == nil { - line, err = s.bufReader.ReadString('\n') - if err != nil { - break - } - parts := strings.Fields(line) - switch parts[0] { - case "cpu": - if len(parts) < 8 { - return 0, fmt.Errorf("invalid number of cpu fields") - } - var totalClockTicks uint64 - for _, i := range parts[1:8] { - v, err := strconv.ParseUint(i, 10, 64) - if err != nil { - return 0, fmt.Errorf("Unable to convert value %s to int: %s", i, err) - } - totalClockTicks += v - } - return (totalClockTicks * nanoSecondsPerSecond) / - s.clockTicksPerSecond, nil - } - } - return 0, fmt.Errorf("invalid stat format. Error trying to parse the '/proc/stat' file") -} diff --git a/vendor/github.com/docker/docker/daemon/stats_collector_windows.go b/vendor/github.com/docker/docker/daemon/stats_collector_windows.go deleted file mode 100644 index 41731b9c1..000000000 --- a/vendor/github.com/docker/docker/daemon/stats_collector_windows.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build windows - -package daemon - -// platformNewStatsCollector performs platform specific initialisation of the -// statsCollector structure. This is a no-op on Windows. -func platformNewStatsCollector(s *statsCollector) { -} - -// getSystemCPUUsage returns the host system's cpu usage in -// nanoseconds. An error is returned if the format of the underlying -// file does not match. This is a no-op on Windows. -func (s *statsCollector) getSystemCPUUsage() (uint64, error) { - return 0, nil -} diff --git a/vendor/github.com/docker/docker/daemon/stats_unix.go b/vendor/github.com/docker/docker/daemon/stats_unix.go deleted file mode 100644 index d875607b3..000000000 --- a/vendor/github.com/docker/docker/daemon/stats_unix.go +++ /dev/null @@ -1,58 +0,0 @@ -// +build !windows - -package daemon - -import ( - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/container" -) - -// Resolve Network SandboxID in case the container reuse another container's network stack -func (daemon *Daemon) getNetworkSandboxID(c *container.Container) (string, error) { - curr := c - for curr.HostConfig.NetworkMode.IsContainer() { - containerID := curr.HostConfig.NetworkMode.ConnectedContainer() - connected, err := daemon.GetContainer(containerID) - if err != nil { - return "", fmt.Errorf("Could not get container for %s", containerID) - } - curr = connected - } - return curr.NetworkSettings.SandboxID, nil -} - -func (daemon *Daemon) getNetworkStats(c *container.Container) (map[string]types.NetworkStats, error) { - sandboxID, err := daemon.getNetworkSandboxID(c) - if err != nil { - return nil, err - } - - sb, err := daemon.netController.SandboxByID(sandboxID) - if err != nil { - return nil, err - } - - lnstats, err := sb.Statistics() - if err != nil { - return nil, err - } - - stats := make(map[string]types.NetworkStats) - // Convert libnetwork nw stats into api stats - for ifName, ifStats := range lnstats { - stats[ifName] = types.NetworkStats{ - RxBytes: ifStats.RxBytes, - RxPackets: ifStats.RxPackets, - RxErrors: ifStats.RxErrors, - RxDropped: ifStats.RxDropped, - TxBytes: ifStats.TxBytes, - TxPackets: ifStats.TxPackets, - TxErrors: ifStats.TxErrors, - TxDropped: ifStats.TxDropped, - } - } - - return stats, nil -} diff --git a/vendor/github.com/docker/docker/daemon/stats_windows.go b/vendor/github.com/docker/docker/daemon/stats_windows.go deleted file mode 100644 index f8e6f6f84..000000000 --- a/vendor/github.com/docker/docker/daemon/stats_windows.go +++ /dev/null @@ -1,11 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/api/types" - "github.com/docker/docker/container" -) - -// Windows network stats are obtained directly through HCS, hence this is a no-op. -func (daemon *Daemon) getNetworkStats(c *container.Container) (map[string]types.NetworkStats, error) { - return make(map[string]types.NetworkStats), nil -} diff --git a/vendor/github.com/docker/docker/daemon/stop.go b/vendor/github.com/docker/docker/daemon/stop.go deleted file mode 100644 index aa7b3820c..000000000 --- a/vendor/github.com/docker/docker/daemon/stop.go +++ /dev/null @@ -1,83 +0,0 @@ -package daemon - -import ( - "fmt" - "net/http" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/errors" - "github.com/docker/docker/container" -) - -// ContainerStop looks for the given container and terminates it, -// waiting the given number of seconds before forcefully killing the -// container. If a negative number of seconds is given, ContainerStop -// will wait for a graceful termination. An error is returned if the -// container is not found, is already stopped, or if there is a -// problem stopping the container. -func (daemon *Daemon) ContainerStop(name string, seconds *int) error { - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - if !container.IsRunning() { - err := fmt.Errorf("Container %s is already stopped", name) - return errors.NewErrorWithStatusCode(err, http.StatusNotModified) - } - if seconds == nil { - stopTimeout := container.StopTimeout() - seconds = &stopTimeout - } - if err := daemon.containerStop(container, *seconds); err != nil { - return fmt.Errorf("Cannot stop container %s: %v", name, err) - } - return nil -} - -// containerStop halts a container by sending a stop signal, waiting for the given -// duration in seconds, and then calling SIGKILL and waiting for the -// process to exit. If a negative duration is given, Stop will wait -// for the initial signal forever. If the container is not running Stop returns -// immediately. -func (daemon *Daemon) containerStop(container *container.Container, seconds int) error { - if !container.IsRunning() { - return nil - } - - daemon.stopHealthchecks(container) - - stopSignal := container.StopSignal() - // 1. Send a stop signal - if err := daemon.killPossiblyDeadProcess(container, stopSignal); err != nil { - // While normally we might "return err" here we're not going to - // because if we can't stop the container by this point then - // its probably because its already stopped. Meaning, between - // the time of the IsRunning() call above and now it stopped. - // Also, since the err return will be environment specific we can't - // look for any particular (common) error that would indicate - // that the process is already dead vs something else going wrong. - // So, instead we'll give it up to 2 more seconds to complete and if - // by that time the container is still running, then the error - // we got is probably valid and so we force kill it. - if _, err := container.WaitStop(2 * time.Second); err != nil { - logrus.Infof("Container failed to stop after sending signal %d to the process, force killing", stopSignal) - if err := daemon.killPossiblyDeadProcess(container, 9); err != nil { - return err - } - } - } - - // 2. Wait for the process to exit on its own - if _, err := container.WaitStop(time.Duration(seconds) * time.Second); err != nil { - logrus.Infof("Container %v failed to exit within %d seconds of signal %d - using the force", container.ID, seconds, stopSignal) - // 3. If it doesn't, then send SIGKILL - if err := daemon.Kill(container); err != nil { - container.WaitStop(-1 * time.Second) - logrus.Warn(err) // Don't return error because we only care that container is stopped, not what function stopped it - } - } - - daemon.LogContainerEvent(container, "stop") - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/top_unix.go b/vendor/github.com/docker/docker/daemon/top_unix.go deleted file mode 100644 index 7fb81d014..000000000 --- a/vendor/github.com/docker/docker/daemon/top_unix.go +++ /dev/null @@ -1,126 +0,0 @@ -//+build !windows - -package daemon - -import ( - "fmt" - "os/exec" - "regexp" - "strconv" - "strings" - - "github.com/docker/docker/api/types" -) - -func validatePSArgs(psArgs string) error { - // NOTE: \\s does not detect unicode whitespaces. - // So we use fieldsASCII instead of strings.Fields in parsePSOutput. - // See https://github.com/docker/docker/pull/24358 - re := regexp.MustCompile("\\s+([^\\s]*)=\\s*(PID[^\\s]*)") - for _, group := range re.FindAllStringSubmatch(psArgs, -1) { - if len(group) >= 3 { - k := group[1] - v := group[2] - if k != "pid" { - return fmt.Errorf("specifying \"%s=%s\" is not allowed", k, v) - } - } - } - return nil -} - -// fieldsASCII is similar to strings.Fields but only allows ASCII whitespaces -func fieldsASCII(s string) []string { - fn := func(r rune) bool { - switch r { - case '\t', '\n', '\f', '\r', ' ': - return true - } - return false - } - return strings.FieldsFunc(s, fn) -} - -func parsePSOutput(output []byte, pids []int) (*types.ContainerProcessList, error) { - procList := &types.ContainerProcessList{} - - lines := strings.Split(string(output), "\n") - procList.Titles = fieldsASCII(lines[0]) - - pidIndex := -1 - for i, name := range procList.Titles { - if name == "PID" { - pidIndex = i - } - } - if pidIndex == -1 { - return nil, fmt.Errorf("Couldn't find PID field in ps output") - } - - // loop through the output and extract the PID from each line - for _, line := range lines[1:] { - if len(line) == 0 { - continue - } - fields := fieldsASCII(line) - p, err := strconv.Atoi(fields[pidIndex]) - if err != nil { - return nil, fmt.Errorf("Unexpected pid '%s': %s", fields[pidIndex], err) - } - - for _, pid := range pids { - if pid == p { - // Make sure number of fields equals number of header titles - // merging "overhanging" fields - process := fields[:len(procList.Titles)-1] - process = append(process, strings.Join(fields[len(procList.Titles)-1:], " ")) - procList.Processes = append(procList.Processes, process) - } - } - } - return procList, nil -} - -// ContainerTop lists the processes running inside of the given -// container by calling ps with the given args, or with the flags -// "-ef" if no args are given. An error is returned if the container -// is not found, or is not running, or if there are any problems -// running ps, or parsing the output. -func (daemon *Daemon) ContainerTop(name string, psArgs string) (*types.ContainerProcessList, error) { - if psArgs == "" { - psArgs = "-ef" - } - - if err := validatePSArgs(psArgs); err != nil { - return nil, err - } - - container, err := daemon.GetContainer(name) - if err != nil { - return nil, err - } - - if !container.IsRunning() { - return nil, errNotRunning{container.ID} - } - - if container.IsRestarting() { - return nil, errContainerIsRestarting(container.ID) - } - - pids, err := daemon.containerd.GetPidsForContainer(container.ID) - if err != nil { - return nil, err - } - - output, err := exec.Command("ps", strings.Split(psArgs, " ")...).Output() - if err != nil { - return nil, fmt.Errorf("Error running ps: %v", err) - } - procList, err := parsePSOutput(output, pids) - if err != nil { - return nil, err - } - daemon.LogContainerEvent(container, "top") - return procList, nil -} diff --git a/vendor/github.com/docker/docker/daemon/top_unix_test.go b/vendor/github.com/docker/docker/daemon/top_unix_test.go deleted file mode 100644 index 269ab6e94..000000000 --- a/vendor/github.com/docker/docker/daemon/top_unix_test.go +++ /dev/null @@ -1,76 +0,0 @@ -//+build !windows - -package daemon - -import ( - "testing" -) - -func TestContainerTopValidatePSArgs(t *testing.T) { - tests := map[string]bool{ - "ae -o uid=PID": true, - "ae -o \"uid= PID\"": true, // ascii space (0x20) - "ae -o \"uid= PID\"": false, // unicode space (U+2003, 0xe2 0x80 0x83) - "ae o uid=PID": true, - "aeo uid=PID": true, - "ae -O uid=PID": true, - "ae -o pid=PID2 -o uid=PID": true, - "ae -o pid=PID": false, - "ae -o pid=PID -o uid=PIDX": true, // FIXME: we do not need to prohibit this - "aeo pid=PID": false, - "ae": false, - "": false, - } - for psArgs, errExpected := range tests { - err := validatePSArgs(psArgs) - t.Logf("tested %q, got err=%v", psArgs, err) - if errExpected && err == nil { - t.Fatalf("expected error, got %v (%q)", err, psArgs) - } - if !errExpected && err != nil { - t.Fatalf("expected nil, got %v (%q)", err, psArgs) - } - } -} - -func TestContainerTopParsePSOutput(t *testing.T) { - tests := []struct { - output []byte - pids []int - errExpected bool - }{ - {[]byte(` PID COMMAND - 42 foo - 43 bar - 100 baz -`), []int{42, 43}, false}, - {[]byte(` UID COMMAND - 42 foo - 43 bar - 100 baz -`), []int{42, 43}, true}, - // unicode space (U+2003, 0xe2 0x80 0x83) - {[]byte(` PID COMMAND - 42 foo - 43 bar - 100 baz -`), []int{42, 43}, true}, - // the first space is U+2003, the second one is ascii. - {[]byte(` PID COMMAND - 42 foo - 43 bar - 100 baz -`), []int{42, 43}, true}, - } - - for _, f := range tests { - _, err := parsePSOutput(f.output, f.pids) - t.Logf("tested %q, got err=%v", string(f.output), err) - if f.errExpected && err == nil { - t.Fatalf("expected error, got %v (%q)", err, string(f.output)) - } - if !f.errExpected && err != nil { - t.Fatalf("expected nil, got %v (%q)", err, string(f.output)) - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/top_windows.go b/vendor/github.com/docker/docker/daemon/top_windows.go deleted file mode 100644 index 3dd8ead46..000000000 --- a/vendor/github.com/docker/docker/daemon/top_windows.go +++ /dev/null @@ -1,53 +0,0 @@ -package daemon - -import ( - "errors" - "fmt" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/go-units" -) - -// ContainerTop handles `docker top` client requests. -// Future considerations: -// -- Windows users are far more familiar with CPU% total. -// Further, users on Windows rarely see user/kernel CPU stats split. -// The kernel returns everything in terms of 100ns. To obtain -// CPU%, we could do something like docker stats does which takes two -// samples, subtract the difference and do the maths. Unfortunately this -// would slow the stat call down and require two kernel calls. So instead, -// we do something similar to linux and display the CPU as combined HH:MM:SS.mmm. -// -- Perhaps we could add an argument to display "raw" stats -// -- "Memory" is an extremely overloaded term in Windows. Hence we do what -// task manager does and use the private working set as the memory counter. -// We could return more info for those who really understand how memory -// management works in Windows if we introduced a "raw" stats (above). -func (daemon *Daemon) ContainerTop(name string, psArgs string) (*types.ContainerProcessList, error) { - // It's not at all an equivalent to linux 'ps' on Windows - if psArgs != "" { - return nil, errors.New("Windows does not support arguments to top") - } - - container, err := daemon.GetContainer(name) - if err != nil { - return nil, err - } - - s, err := daemon.containerd.Summary(container.ID) - if err != nil { - return nil, err - } - procList := &types.ContainerProcessList{} - procList.Titles = []string{"Name", "PID", "CPU", "Private Working Set"} - - for _, j := range s { - d := time.Duration((j.KernelTime100ns + j.UserTime100ns) * 100) // Combined time in nanoseconds - procList.Processes = append(procList.Processes, []string{ - j.ImageName, - fmt.Sprint(j.ProcessId), - fmt.Sprintf("%02d:%02d:%02d.%03d", int(d.Hours()), int(d.Minutes())%60, int(d.Seconds())%60, int(d.Nanoseconds()/1000000)%1000), - units.HumanSize(float64(j.MemoryWorkingSetPrivateBytes))}) - } - return procList, nil -} diff --git a/vendor/github.com/docker/docker/daemon/unpause.go b/vendor/github.com/docker/docker/daemon/unpause.go deleted file mode 100644 index e66b3868d..000000000 --- a/vendor/github.com/docker/docker/daemon/unpause.go +++ /dev/null @@ -1,38 +0,0 @@ -package daemon - -import ( - "fmt" - - "github.com/docker/docker/container" -) - -// ContainerUnpause unpauses a container -func (daemon *Daemon) ContainerUnpause(name string) error { - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - if err := daemon.containerUnpause(container); err != nil { - return err - } - - return nil -} - -// containerUnpause resumes the container execution after the container is paused. -func (daemon *Daemon) containerUnpause(container *container.Container) error { - container.Lock() - defer container.Unlock() - - // We cannot unpause the container which is not paused - if !container.Paused { - return fmt.Errorf("Container %s is not paused", container.ID) - } - - if err := daemon.containerd.Resume(container.ID); err != nil { - return fmt.Errorf("Cannot unpause container %s: %s", container.ID, err) - } - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/update.go b/vendor/github.com/docker/docker/daemon/update.go deleted file mode 100644 index 6e26eeb96..000000000 --- a/vendor/github.com/docker/docker/daemon/update.go +++ /dev/null @@ -1,92 +0,0 @@ -package daemon - -import ( - "fmt" - - "github.com/docker/docker/api/types/container" -) - -// ContainerUpdate updates configuration of the container -func (daemon *Daemon) ContainerUpdate(name string, hostConfig *container.HostConfig) (container.ContainerUpdateOKBody, error) { - var warnings []string - - warnings, err := daemon.verifyContainerSettings(hostConfig, nil, true) - if err != nil { - return container.ContainerUpdateOKBody{Warnings: warnings}, err - } - - if err := daemon.update(name, hostConfig); err != nil { - return container.ContainerUpdateOKBody{Warnings: warnings}, err - } - - return container.ContainerUpdateOKBody{Warnings: warnings}, nil -} - -// ContainerUpdateCmdOnBuild updates Path and Args for the container with ID cID. -func (daemon *Daemon) ContainerUpdateCmdOnBuild(cID string, cmd []string) error { - if len(cmd) == 0 { - return nil - } - c, err := daemon.GetContainer(cID) - if err != nil { - return err - } - c.Path = cmd[0] - c.Args = cmd[1:] - return nil -} - -func (daemon *Daemon) update(name string, hostConfig *container.HostConfig) error { - if hostConfig == nil { - return nil - } - - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - restoreConfig := false - backupHostConfig := *container.HostConfig - defer func() { - if restoreConfig { - container.Lock() - container.HostConfig = &backupHostConfig - container.ToDisk() - container.Unlock() - } - }() - - if container.RemovalInProgress || container.Dead { - return errCannotUpdate(container.ID, fmt.Errorf("Container is marked for removal and cannot be \"update\".")) - } - - if err := container.UpdateContainer(hostConfig); err != nil { - restoreConfig = true - return errCannotUpdate(container.ID, err) - } - - // if Restart Policy changed, we need to update container monitor - if hostConfig.RestartPolicy.Name != "" { - container.UpdateMonitor(hostConfig.RestartPolicy) - } - - // If container is not running, update hostConfig struct is enough, - // resources will be updated when the container is started again. - // If container is running (including paused), we need to update configs - // to the real world. - if container.IsRunning() && !container.IsRestarting() { - if err := daemon.containerd.UpdateResources(container.ID, toContainerdResources(hostConfig.Resources)); err != nil { - restoreConfig = true - return errCannotUpdate(container.ID, err) - } - } - - daemon.LogContainerEvent(container, "update") - - return nil -} - -func errCannotUpdate(containerID string, err error) error { - return fmt.Errorf("Cannot update container %s: %v", containerID, err) -} diff --git a/vendor/github.com/docker/docker/daemon/update_linux.go b/vendor/github.com/docker/docker/daemon/update_linux.go deleted file mode 100644 index f42232527..000000000 --- a/vendor/github.com/docker/docker/daemon/update_linux.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build linux - -package daemon - -import ( - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/libcontainerd" -) - -func toContainerdResources(resources container.Resources) libcontainerd.Resources { - var r libcontainerd.Resources - r.BlkioWeight = uint64(resources.BlkioWeight) - r.CpuShares = uint64(resources.CPUShares) - r.CpuPeriod = uint64(resources.CPUPeriod) - r.CpuQuota = uint64(resources.CPUQuota) - r.CpusetCpus = resources.CpusetCpus - r.CpusetMems = resources.CpusetMems - r.MemoryLimit = uint64(resources.Memory) - if resources.MemorySwap > 0 { - r.MemorySwap = uint64(resources.MemorySwap) - } - r.MemoryReservation = uint64(resources.MemoryReservation) - r.KernelMemoryLimit = uint64(resources.KernelMemory) - return r -} diff --git a/vendor/github.com/docker/docker/daemon/update_solaris.go b/vendor/github.com/docker/docker/daemon/update_solaris.go deleted file mode 100644 index f3b545c5f..000000000 --- a/vendor/github.com/docker/docker/daemon/update_solaris.go +++ /dev/null @@ -1,11 +0,0 @@ -package daemon - -import ( - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/libcontainerd" -) - -func toContainerdResources(resources container.Resources) libcontainerd.Resources { - var r libcontainerd.Resources - return r -} diff --git a/vendor/github.com/docker/docker/daemon/update_windows.go b/vendor/github.com/docker/docker/daemon/update_windows.go deleted file mode 100644 index 01466260b..000000000 --- a/vendor/github.com/docker/docker/daemon/update_windows.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build windows - -package daemon - -import ( - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/libcontainerd" -) - -func toContainerdResources(resources container.Resources) libcontainerd.Resources { - var r libcontainerd.Resources - return r -} diff --git a/vendor/github.com/docker/docker/daemon/volumes.go b/vendor/github.com/docker/docker/daemon/volumes.go deleted file mode 100644 index 10cf78770..000000000 --- a/vendor/github.com/docker/docker/daemon/volumes.go +++ /dev/null @@ -1,303 +0,0 @@ -package daemon - -import ( - "errors" - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/Sirupsen/logrus" - dockererrors "github.com/docker/docker/api/errors" - "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" - mounttypes "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/container" - "github.com/docker/docker/volume" - "github.com/docker/docker/volume/drivers" - "github.com/opencontainers/runc/libcontainer/label" -) - -var ( - // ErrVolumeReadonly is used to signal an error when trying to copy data into - // a volume mount that is not writable. - ErrVolumeReadonly = errors.New("mounted volume is marked read-only") -) - -type mounts []container.Mount - -// volumeToAPIType converts a volume.Volume to the type used by the Engine API -func volumeToAPIType(v volume.Volume) *types.Volume { - tv := &types.Volume{ - Name: v.Name(), - Driver: v.DriverName(), - } - if v, ok := v.(volume.DetailedVolume); ok { - tv.Labels = v.Labels() - tv.Options = v.Options() - tv.Scope = v.Scope() - } - - return tv -} - -// Len returns the number of mounts. Used in sorting. -func (m mounts) Len() int { - return len(m) -} - -// Less returns true if the number of parts (a/b/c would be 3 parts) in the -// mount indexed by parameter 1 is less than that of the mount indexed by -// parameter 2. Used in sorting. -func (m mounts) Less(i, j int) bool { - return m.parts(i) < m.parts(j) -} - -// Swap swaps two items in an array of mounts. Used in sorting -func (m mounts) Swap(i, j int) { - m[i], m[j] = m[j], m[i] -} - -// parts returns the number of parts in the destination of a mount. Used in sorting. -func (m mounts) parts(i int) int { - return strings.Count(filepath.Clean(m[i].Destination), string(os.PathSeparator)) -} - -// registerMountPoints initializes the container mount points with the configured volumes and bind mounts. -// It follows the next sequence to decide what to mount in each final destination: -// -// 1. Select the previously configured mount points for the containers, if any. -// 2. Select the volumes mounted from another containers. Overrides previously configured mount point destination. -// 3. Select the bind mounts set by the client. Overrides previously configured mount point destinations. -// 4. Cleanup old volumes that are about to be reassigned. -func (daemon *Daemon) registerMountPoints(container *container.Container, hostConfig *containertypes.HostConfig) (retErr error) { - binds := map[string]bool{} - mountPoints := map[string]*volume.MountPoint{} - defer func() { - // clean up the container mountpoints once return with error - if retErr != nil { - for _, m := range mountPoints { - if m.Volume == nil { - continue - } - daemon.volumes.Dereference(m.Volume, container.ID) - } - } - }() - - // 1. Read already configured mount points. - for destination, point := range container.MountPoints { - mountPoints[destination] = point - } - - // 2. Read volumes from other containers. - for _, v := range hostConfig.VolumesFrom { - containerID, mode, err := volume.ParseVolumesFrom(v) - if err != nil { - return err - } - - c, err := daemon.GetContainer(containerID) - if err != nil { - return err - } - - for _, m := range c.MountPoints { - cp := &volume.MountPoint{ - Name: m.Name, - Source: m.Source, - RW: m.RW && volume.ReadWrite(mode), - Driver: m.Driver, - Destination: m.Destination, - Propagation: m.Propagation, - Spec: m.Spec, - CopyData: false, - } - - if len(cp.Source) == 0 { - v, err := daemon.volumes.GetWithRef(cp.Name, cp.Driver, container.ID) - if err != nil { - return err - } - cp.Volume = v - } - - mountPoints[cp.Destination] = cp - } - } - - // 3. Read bind mounts - for _, b := range hostConfig.Binds { - bind, err := volume.ParseMountRaw(b, hostConfig.VolumeDriver) - if err != nil { - return err - } - - // #10618 - _, tmpfsExists := hostConfig.Tmpfs[bind.Destination] - if binds[bind.Destination] || tmpfsExists { - return fmt.Errorf("Duplicate mount point '%s'", bind.Destination) - } - - if bind.Type == mounttypes.TypeVolume { - // create the volume - v, err := daemon.volumes.CreateWithRef(bind.Name, bind.Driver, container.ID, nil, nil) - if err != nil { - return err - } - bind.Volume = v - bind.Source = v.Path() - // bind.Name is an already existing volume, we need to use that here - bind.Driver = v.DriverName() - if bind.Driver == volume.DefaultDriverName { - setBindModeIfNull(bind) - } - } - - binds[bind.Destination] = true - mountPoints[bind.Destination] = bind - } - - for _, cfg := range hostConfig.Mounts { - mp, err := volume.ParseMountSpec(cfg) - if err != nil { - return dockererrors.NewBadRequestError(err) - } - - if binds[mp.Destination] { - return fmt.Errorf("Duplicate mount point '%s'", cfg.Target) - } - - if mp.Type == mounttypes.TypeVolume { - var v volume.Volume - if cfg.VolumeOptions != nil { - var driverOpts map[string]string - if cfg.VolumeOptions.DriverConfig != nil { - driverOpts = cfg.VolumeOptions.DriverConfig.Options - } - v, err = daemon.volumes.CreateWithRef(mp.Name, mp.Driver, container.ID, driverOpts, cfg.VolumeOptions.Labels) - } else { - v, err = daemon.volumes.CreateWithRef(mp.Name, mp.Driver, container.ID, nil, nil) - } - if err != nil { - return err - } - - if err := label.Relabel(mp.Source, container.MountLabel, false); err != nil { - return err - } - mp.Volume = v - mp.Name = v.Name() - mp.Driver = v.DriverName() - - // only use the cached path here since getting the path is not necessary right now and calling `Path()` may be slow - if cv, ok := v.(interface { - CachedPath() string - }); ok { - mp.Source = cv.CachedPath() - } - } - - binds[mp.Destination] = true - mountPoints[mp.Destination] = mp - } - - container.Lock() - - // 4. Cleanup old volumes that are about to be reassigned. - for _, m := range mountPoints { - if m.BackwardsCompatible() { - if mp, exists := container.MountPoints[m.Destination]; exists && mp.Volume != nil { - daemon.volumes.Dereference(mp.Volume, container.ID) - } - } - } - container.MountPoints = mountPoints - - container.Unlock() - - return nil -} - -// lazyInitializeVolume initializes a mountpoint's volume if needed. -// This happens after a daemon restart. -func (daemon *Daemon) lazyInitializeVolume(containerID string, m *volume.MountPoint) error { - if len(m.Driver) > 0 && m.Volume == nil { - v, err := daemon.volumes.GetWithRef(m.Name, m.Driver, containerID) - if err != nil { - return err - } - m.Volume = v - } - return nil -} - -func backportMountSpec(container *container.Container) error { - for target, m := range container.MountPoints { - if m.Spec.Type != "" { - // if type is set on even one mount, no need to migrate - return nil - } - if m.Name != "" { - m.Type = mounttypes.TypeVolume - m.Spec.Type = mounttypes.TypeVolume - - // make sure this is not an anyonmous volume before setting the spec source - if _, exists := container.Config.Volumes[target]; !exists { - m.Spec.Source = m.Name - } - if container.HostConfig.VolumeDriver != "" { - m.Spec.VolumeOptions = &mounttypes.VolumeOptions{ - DriverConfig: &mounttypes.Driver{Name: container.HostConfig.VolumeDriver}, - } - } - if strings.Contains(m.Mode, "nocopy") { - if m.Spec.VolumeOptions == nil { - m.Spec.VolumeOptions = &mounttypes.VolumeOptions{} - } - m.Spec.VolumeOptions.NoCopy = true - } - } else { - m.Type = mounttypes.TypeBind - m.Spec.Type = mounttypes.TypeBind - m.Spec.Source = m.Source - if m.Propagation != "" { - m.Spec.BindOptions = &mounttypes.BindOptions{ - Propagation: m.Propagation, - } - } - } - - m.Spec.Target = m.Destination - if !m.RW { - m.Spec.ReadOnly = true - } - } - return container.ToDiskLocking() -} - -func (daemon *Daemon) traverseLocalVolumes(fn func(volume.Volume) error) error { - localVolumeDriver, err := volumedrivers.GetDriver(volume.DefaultDriverName) - if err != nil { - return fmt.Errorf("can't retrieve local volume driver: %v", err) - } - vols, err := localVolumeDriver.List() - if err != nil { - return fmt.Errorf("can't retrieve local volumes: %v", err) - } - - for _, v := range vols { - name := v.Name() - _, err := daemon.volumes.Get(name) - if err != nil { - logrus.Warnf("failed to retrieve volume %s from store: %v", name, err) - } - - err = fn(v) - if err != nil { - return err - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/volumes_unit_test.go b/vendor/github.com/docker/docker/daemon/volumes_unit_test.go deleted file mode 100644 index 450d17f97..000000000 --- a/vendor/github.com/docker/docker/daemon/volumes_unit_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package daemon - -import ( - "testing" - - "github.com/docker/docker/volume" -) - -func TestParseVolumesFrom(t *testing.T) { - cases := []struct { - spec string - expID string - expMode string - fail bool - }{ - {"", "", "", true}, - {"foobar", "foobar", "rw", false}, - {"foobar:rw", "foobar", "rw", false}, - {"foobar:ro", "foobar", "ro", false}, - {"foobar:baz", "", "", true}, - } - - for _, c := range cases { - id, mode, err := volume.ParseVolumesFrom(c.spec) - if c.fail { - if err == nil { - t.Fatalf("Expected error, was nil, for spec %s\n", c.spec) - } - continue - } - - if id != c.expID { - t.Fatalf("Expected id %s, was %s, for spec %s\n", c.expID, id, c.spec) - } - if mode != c.expMode { - t.Fatalf("Expected mode %s, was %s for spec %s\n", c.expMode, mode, c.spec) - } - } -} diff --git a/vendor/github.com/docker/docker/daemon/volumes_unix.go b/vendor/github.com/docker/docker/daemon/volumes_unix.go deleted file mode 100644 index 29dffa9ea..000000000 --- a/vendor/github.com/docker/docker/daemon/volumes_unix.go +++ /dev/null @@ -1,219 +0,0 @@ -// +build !windows - -// TODO(amitkris): We need to split this file for solaris. - -package daemon - -import ( - "encoding/json" - "os" - "path/filepath" - "sort" - "strconv" - "strings" - - "github.com/docker/docker/container" - "github.com/docker/docker/pkg/fileutils" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/volume" - "github.com/docker/docker/volume/drivers" - "github.com/docker/docker/volume/local" - "github.com/pkg/errors" -) - -// setupMounts iterates through each of the mount points for a container and -// calls Setup() on each. It also looks to see if is a network mount such as -// /etc/resolv.conf, and if it is not, appends it to the array of mounts. -func (daemon *Daemon) setupMounts(c *container.Container) ([]container.Mount, error) { - var mounts []container.Mount - // TODO: tmpfs mounts should be part of Mountpoints - tmpfsMounts := make(map[string]bool) - tmpfsMountInfo, err := c.TmpfsMounts() - if err != nil { - return nil, err - } - for _, m := range tmpfsMountInfo { - tmpfsMounts[m.Destination] = true - } - for _, m := range c.MountPoints { - if tmpfsMounts[m.Destination] { - continue - } - if err := daemon.lazyInitializeVolume(c.ID, m); err != nil { - return nil, err - } - rootUID, rootGID := daemon.GetRemappedUIDGID() - path, err := m.Setup(c.MountLabel, rootUID, rootGID) - if err != nil { - return nil, err - } - if !c.TrySetNetworkMount(m.Destination, path) { - mnt := container.Mount{ - Source: path, - Destination: m.Destination, - Writable: m.RW, - Propagation: string(m.Propagation), - } - if m.Volume != nil { - attributes := map[string]string{ - "driver": m.Volume.DriverName(), - "container": c.ID, - "destination": m.Destination, - "read/write": strconv.FormatBool(m.RW), - "propagation": string(m.Propagation), - } - daemon.LogVolumeEvent(m.Volume.Name(), "mount", attributes) - } - mounts = append(mounts, mnt) - } - } - - mounts = sortMounts(mounts) - netMounts := c.NetworkMounts() - // if we are going to mount any of the network files from container - // metadata, the ownership must be set properly for potential container - // remapped root (user namespaces) - rootUID, rootGID := daemon.GetRemappedUIDGID() - for _, mount := range netMounts { - if err := os.Chown(mount.Source, rootUID, rootGID); err != nil { - return nil, err - } - } - return append(mounts, netMounts...), nil -} - -// sortMounts sorts an array of mounts in lexicographic order. This ensure that -// when mounting, the mounts don't shadow other mounts. For example, if mounting -// /etc and /etc/resolv.conf, /etc/resolv.conf must not be mounted first. -func sortMounts(m []container.Mount) []container.Mount { - sort.Sort(mounts(m)) - return m -} - -// setBindModeIfNull is platform specific processing to ensure the -// shared mode is set to 'z' if it is null. This is called in the case -// of processing a named volume and not a typical bind. -func setBindModeIfNull(bind *volume.MountPoint) { - if bind.Mode == "" { - bind.Mode = "z" - } -} - -// migrateVolume links the contents of a volume created pre Docker 1.7 -// into the location expected by the local driver. -// It creates a symlink from DOCKER_ROOT/vfs/dir/VOLUME_ID to DOCKER_ROOT/volumes/VOLUME_ID/_container_data. -// It preserves the volume json configuration generated pre Docker 1.7 to be able to -// downgrade from Docker 1.7 to Docker 1.6 without losing volume compatibility. -func migrateVolume(id, vfs string) error { - l, err := volumedrivers.GetDriver(volume.DefaultDriverName) - if err != nil { - return err - } - - newDataPath := l.(*local.Root).DataPath(id) - fi, err := os.Stat(newDataPath) - if err != nil && !os.IsNotExist(err) { - return err - } - - if fi != nil && fi.IsDir() { - return nil - } - - return os.Symlink(vfs, newDataPath) -} - -// verifyVolumesInfo ports volumes configured for the containers pre docker 1.7. -// It reads the container configuration and creates valid mount points for the old volumes. -func (daemon *Daemon) verifyVolumesInfo(container *container.Container) error { - // Inspect old structures only when we're upgrading from old versions - // to versions >= 1.7 and the MountPoints has not been populated with volumes data. - type volumes struct { - Volumes map[string]string - VolumesRW map[string]bool - } - cfgPath, err := container.ConfigPath() - if err != nil { - return err - } - f, err := os.Open(cfgPath) - if err != nil { - return errors.Wrap(err, "could not open container config") - } - defer f.Close() - var cv volumes - if err := json.NewDecoder(f).Decode(&cv); err != nil { - return errors.Wrap(err, "could not decode container config") - } - - if len(container.MountPoints) == 0 && len(cv.Volumes) > 0 { - for destination, hostPath := range cv.Volumes { - vfsPath := filepath.Join(daemon.root, "vfs", "dir") - rw := cv.VolumesRW != nil && cv.VolumesRW[destination] - - if strings.HasPrefix(hostPath, vfsPath) { - id := filepath.Base(hostPath) - v, err := daemon.volumes.CreateWithRef(id, volume.DefaultDriverName, container.ID, nil, nil) - if err != nil { - return err - } - if err := migrateVolume(id, hostPath); err != nil { - return err - } - container.AddMountPointWithVolume(destination, v, true) - } else { // Bind mount - m := volume.MountPoint{Source: hostPath, Destination: destination, RW: rw} - container.MountPoints[destination] = &m - } - } - return container.ToDisk() - } - return nil -} - -func (daemon *Daemon) mountVolumes(container *container.Container) error { - mounts, err := daemon.setupMounts(container) - if err != nil { - return err - } - - for _, m := range mounts { - dest, err := container.GetResourcePath(m.Destination) - if err != nil { - return err - } - - var stat os.FileInfo - stat, err = os.Stat(m.Source) - if err != nil { - return err - } - if err = fileutils.CreateIfNotExists(dest, stat.IsDir()); err != nil { - return err - } - - opts := "rbind,ro" - if m.Writable { - opts = "rbind,rw" - } - - if err := mount.Mount(m.Source, dest, bindMountType, opts); err != nil { - return err - } - - // mountVolumes() seems to be called for temporary mounts - // outside the container. Soon these will be unmounted with - // lazy unmount option and given we have mounted the rbind, - // all the submounts will propagate if these are shared. If - // daemon is running in host namespace and has / as shared - // then these unmounts will propagate and unmount original - // mount as well. So make all these mounts rprivate. - // Do not use propagation property of volume as that should - // apply only when mounting happen inside the container. - if err := mount.MakeRPrivate(dest); err != nil { - return err - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/daemon/volumes_windows.go b/vendor/github.com/docker/docker/daemon/volumes_windows.go deleted file mode 100644 index bf7fc478a..000000000 --- a/vendor/github.com/docker/docker/daemon/volumes_windows.go +++ /dev/null @@ -1,47 +0,0 @@ -// +build windows - -package daemon - -import ( - "sort" - - "github.com/docker/docker/container" - "github.com/docker/docker/volume" -) - -// setupMounts configures the mount points for a container by appending each -// of the configured mounts on the container to the OCI mount structure -// which will ultimately be passed into the oci runtime during container creation. -// It also ensures each of the mounts are lexographically sorted. - -// BUGBUG TODO Windows containerd. This would be much better if it returned -// an array of runtime spec mounts, not container mounts. Then no need to -// do multiple transitions. - -func (daemon *Daemon) setupMounts(c *container.Container) ([]container.Mount, error) { - var mnts []container.Mount - for _, mount := range c.MountPoints { // type is volume.MountPoint - if err := daemon.lazyInitializeVolume(c.ID, mount); err != nil { - return nil, err - } - s, err := mount.Setup(c.MountLabel, 0, 0) - if err != nil { - return nil, err - } - - mnts = append(mnts, container.Mount{ - Source: s, - Destination: mount.Destination, - Writable: mount.RW, - }) - } - - sort.Sort(mounts(mnts)) - return mnts, nil -} - -// setBindModeIfNull is platform specific processing which is a no-op on -// Windows. -func setBindModeIfNull(bind *volume.MountPoint) { - return -} diff --git a/vendor/github.com/docker/docker/daemon/wait.go b/vendor/github.com/docker/docker/daemon/wait.go deleted file mode 100644 index 2dab22e99..000000000 --- a/vendor/github.com/docker/docker/daemon/wait.go +++ /dev/null @@ -1,32 +0,0 @@ -package daemon - -import ( - "time" - - "golang.org/x/net/context" -) - -// ContainerWait stops processing until the given container is -// stopped. If the container is not found, an error is returned. On a -// successful stop, the exit code of the container is returned. On a -// timeout, an error is returned. If you want to wait forever, supply -// a negative duration for the timeout. -func (daemon *Daemon) ContainerWait(name string, timeout time.Duration) (int, error) { - container, err := daemon.GetContainer(name) - if err != nil { - return -1, err - } - - return container.WaitStop(timeout) -} - -// ContainerWaitWithContext returns a channel where exit code is sent -// when container stops. Channel can be cancelled with a context. -func (daemon *Daemon) ContainerWaitWithContext(ctx context.Context, name string) error { - container, err := daemon.GetContainer(name) - if err != nil { - return err - } - - return container.WaitWithContext(ctx) -} diff --git a/vendor/github.com/docker/docker/daemon/workdir.go b/vendor/github.com/docker/docker/daemon/workdir.go deleted file mode 100644 index 5bd0d0cac..000000000 --- a/vendor/github.com/docker/docker/daemon/workdir.go +++ /dev/null @@ -1,21 +0,0 @@ -package daemon - -// ContainerCreateWorkdir creates the working directory. This is solves the -// issue arising from https://github.com/docker/docker/issues/27545, -// which was initially fixed by https://github.com/docker/docker/pull/27884. But that fix -// was too expensive in terms of performance on Windows. Instead, -// https://github.com/docker/docker/pull/28514 introduces this new functionality -// where the builder calls into the backend here to create the working directory. -func (daemon *Daemon) ContainerCreateWorkdir(cID string) error { - container, err := daemon.GetContainer(cID) - if err != nil { - return err - } - err = daemon.Mount(container) - if err != nil { - return err - } - defer daemon.Unmount(container) - rootUID, rootGID := daemon.GetRemappedUIDGID() - return container.SetupWorkingDirectory(rootUID, rootGID) -} diff --git a/vendor/github.com/docker/docker/distribution/config.go b/vendor/github.com/docker/docker/distribution/config.go deleted file mode 100644 index bfea8b033..000000000 --- a/vendor/github.com/docker/docker/distribution/config.go +++ /dev/null @@ -1,241 +0,0 @@ -package distribution - -import ( - "encoding/json" - "fmt" - "io" - "runtime" - - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/schema2" - "github.com/docker/docker/api/types" - "github.com/docker/docker/distribution/metadata" - "github.com/docker/docker/distribution/xfer" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "github.com/docker/libtrust" - "golang.org/x/net/context" -) - -// Config stores configuration for communicating -// with a registry. -type Config struct { - // MetaHeaders stores HTTP headers with metadata about the image - MetaHeaders map[string][]string - // AuthConfig holds authentication credentials for authenticating with - // the registry. - AuthConfig *types.AuthConfig - // ProgressOutput is the interface for showing the status of the pull - // operation. - ProgressOutput progress.Output - // RegistryService is the registry service to use for TLS configuration - // and endpoint lookup. - RegistryService registry.Service - // ImageEventLogger notifies events for a given image - ImageEventLogger func(id, name, action string) - // MetadataStore is the storage backend for distribution-specific - // metadata. - MetadataStore metadata.Store - // ImageStore manages images. - ImageStore ImageConfigStore - // ReferenceStore manages tags. This value is optional, when excluded - // content will not be tagged. - ReferenceStore reference.Store - // RequireSchema2 ensures that only schema2 manifests are used. - RequireSchema2 bool -} - -// ImagePullConfig stores pull configuration. -type ImagePullConfig struct { - Config - - // DownloadManager manages concurrent pulls. - DownloadManager RootFSDownloadManager - // Schema2Types is the valid schema2 configuration types allowed - // by the pull operation. - Schema2Types []string -} - -// ImagePushConfig stores push configuration. -type ImagePushConfig struct { - Config - - // ConfigMediaType is the configuration media type for - // schema2 manifests. - ConfigMediaType string - // LayerStore manages layers. - LayerStore PushLayerProvider - // TrustKey is the private key for legacy signatures. This is typically - // an ephemeral key, since these signatures are no longer verified. - TrustKey libtrust.PrivateKey - // UploadManager dispatches uploads. - UploadManager *xfer.LayerUploadManager -} - -// ImageConfigStore handles storing and getting image configurations -// by digest. Allows getting an image configurations rootfs from the -// configuration. -type ImageConfigStore interface { - Put([]byte) (digest.Digest, error) - Get(digest.Digest) ([]byte, error) - RootFSFromConfig([]byte) (*image.RootFS, error) -} - -// PushLayerProvider provides layers to be pushed by ChainID. -type PushLayerProvider interface { - Get(layer.ChainID) (PushLayer, error) -} - -// PushLayer is a pushable layer with metadata about the layer -// and access to the content of the layer. -type PushLayer interface { - ChainID() layer.ChainID - DiffID() layer.DiffID - Parent() PushLayer - Open() (io.ReadCloser, error) - Size() (int64, error) - MediaType() string - Release() -} - -// RootFSDownloadManager handles downloading of the rootfs -type RootFSDownloadManager interface { - // Download downloads the layers into the given initial rootfs and - // returns the final rootfs. - // Given progress output to track download progress - // Returns function to release download resources - Download(ctx context.Context, initialRootFS image.RootFS, layers []xfer.DownloadDescriptor, progressOutput progress.Output) (image.RootFS, func(), error) -} - -type imageConfigStore struct { - image.Store -} - -// NewImageConfigStoreFromStore returns an ImageConfigStore backed -// by an image.Store for container images. -func NewImageConfigStoreFromStore(is image.Store) ImageConfigStore { - return &imageConfigStore{ - Store: is, - } -} - -func (s *imageConfigStore) Put(c []byte) (digest.Digest, error) { - id, err := s.Store.Create(c) - return digest.Digest(id), err -} - -func (s *imageConfigStore) Get(d digest.Digest) ([]byte, error) { - img, err := s.Store.Get(image.IDFromDigest(d)) - if err != nil { - return nil, err - } - return img.RawJSON(), nil -} - -func (s *imageConfigStore) RootFSFromConfig(c []byte) (*image.RootFS, error) { - var unmarshalledConfig image.Image - if err := json.Unmarshal(c, &unmarshalledConfig); err != nil { - return nil, err - } - - // fail immediately on windows - if runtime.GOOS == "windows" && unmarshalledConfig.OS == "linux" { - return nil, fmt.Errorf("image operating system %q cannot be used on this platform", unmarshalledConfig.OS) - } - - return unmarshalledConfig.RootFS, nil -} - -type storeLayerProvider struct { - ls layer.Store -} - -// NewLayerProviderFromStore returns a layer provider backed by -// an instance of LayerStore. Only getting layers as gzipped -// tars is supported. -func NewLayerProviderFromStore(ls layer.Store) PushLayerProvider { - return &storeLayerProvider{ - ls: ls, - } -} - -func (p *storeLayerProvider) Get(lid layer.ChainID) (PushLayer, error) { - if lid == "" { - return &storeLayer{ - Layer: layer.EmptyLayer, - }, nil - } - l, err := p.ls.Get(lid) - if err != nil { - return nil, err - } - - sl := storeLayer{ - Layer: l, - ls: p.ls, - } - if d, ok := l.(distribution.Describable); ok { - return &describableStoreLayer{ - storeLayer: sl, - describable: d, - }, nil - } - - return &sl, nil -} - -type storeLayer struct { - layer.Layer - ls layer.Store -} - -func (l *storeLayer) Parent() PushLayer { - p := l.Layer.Parent() - if p == nil { - return nil - } - sl := storeLayer{ - Layer: p, - ls: l.ls, - } - if d, ok := p.(distribution.Describable); ok { - return &describableStoreLayer{ - storeLayer: sl, - describable: d, - } - } - - return &sl -} - -func (l *storeLayer) Open() (io.ReadCloser, error) { - return l.Layer.TarStream() -} - -func (l *storeLayer) Size() (int64, error) { - return l.Layer.DiffSize() -} - -func (l *storeLayer) MediaType() string { - // layer store always returns uncompressed tars - return schema2.MediaTypeUncompressedLayer -} - -func (l *storeLayer) Release() { - if l.ls != nil { - layer.ReleaseAndLog(l.ls, l.Layer) - } -} - -type describableStoreLayer struct { - storeLayer - describable distribution.Describable -} - -func (l *describableStoreLayer) Descriptor() distribution.Descriptor { - return l.describable.Descriptor() -} diff --git a/vendor/github.com/docker/docker/distribution/errors.go b/vendor/github.com/docker/docker/distribution/errors.go deleted file mode 100644 index b8cf9fb9e..000000000 --- a/vendor/github.com/docker/docker/distribution/errors.go +++ /dev/null @@ -1,159 +0,0 @@ -package distribution - -import ( - "net/url" - "strings" - "syscall" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/api/v2" - "github.com/docker/distribution/registry/client" - "github.com/docker/distribution/registry/client/auth" - "github.com/docker/docker/distribution/xfer" - "github.com/docker/docker/reference" - "github.com/pkg/errors" -) - -// ErrNoSupport is an error type used for errors indicating that an operation -// is not supported. It encapsulates a more specific error. -type ErrNoSupport struct{ Err error } - -func (e ErrNoSupport) Error() string { - if e.Err == nil { - return "not supported" - } - return e.Err.Error() -} - -// fallbackError wraps an error that can possibly allow fallback to a different -// endpoint. -type fallbackError struct { - // err is the error being wrapped. - err error - // confirmedV2 is set to true if it was confirmed that the registry - // supports the v2 protocol. This is used to limit fallbacks to the v1 - // protocol. - confirmedV2 bool - // transportOK is set to true if we managed to speak HTTP with the - // registry. This confirms that we're using appropriate TLS settings - // (or lack of TLS). - transportOK bool -} - -// Error renders the FallbackError as a string. -func (f fallbackError) Error() string { - return f.Cause().Error() -} - -func (f fallbackError) Cause() error { - return f.err -} - -// shouldV2Fallback returns true if this error is a reason to fall back to v1. -func shouldV2Fallback(err errcode.Error) bool { - switch err.Code { - case errcode.ErrorCodeUnauthorized, v2.ErrorCodeManifestUnknown, v2.ErrorCodeNameUnknown: - return true - } - return false -} - -// TranslatePullError is used to convert an error from a registry pull -// operation to an error representing the entire pull operation. Any error -// information which is not used by the returned error gets output to -// log at info level. -func TranslatePullError(err error, ref reference.Named) error { - switch v := err.(type) { - case errcode.Errors: - if len(v) != 0 { - for _, extra := range v[1:] { - logrus.Infof("Ignoring extra error returned from registry: %v", extra) - } - return TranslatePullError(v[0], ref) - } - case errcode.Error: - var newErr error - switch v.Code { - case errcode.ErrorCodeDenied: - // ErrorCodeDenied is used when access to the repository was denied - newErr = errors.Errorf("repository %s not found: does not exist or no pull access", ref.Name()) - case v2.ErrorCodeManifestUnknown: - newErr = errors.Errorf("manifest for %s not found", ref.String()) - case v2.ErrorCodeNameUnknown: - newErr = errors.Errorf("repository %s not found", ref.Name()) - } - if newErr != nil { - logrus.Infof("Translating %q to %q", err, newErr) - return newErr - } - case xfer.DoNotRetry: - return TranslatePullError(v.Err, ref) - } - - return err -} - -// continueOnError returns true if we should fallback to the next endpoint -// as a result of this error. -func continueOnError(err error) bool { - switch v := err.(type) { - case errcode.Errors: - if len(v) == 0 { - return true - } - return continueOnError(v[0]) - case ErrNoSupport: - return continueOnError(v.Err) - case errcode.Error: - return shouldV2Fallback(v) - case *client.UnexpectedHTTPResponseError: - return true - case ImageConfigPullError: - return false - case error: - return !strings.Contains(err.Error(), strings.ToLower(syscall.ENOSPC.Error())) - } - // let's be nice and fallback if the error is a completely - // unexpected one. - // If new errors have to be handled in some way, please - // add them to the switch above. - return true -} - -// retryOnError wraps the error in xfer.DoNotRetry if we should not retry the -// operation after this error. -func retryOnError(err error) error { - switch v := err.(type) { - case errcode.Errors: - if len(v) != 0 { - return retryOnError(v[0]) - } - case errcode.Error: - switch v.Code { - case errcode.ErrorCodeUnauthorized, errcode.ErrorCodeUnsupported, errcode.ErrorCodeDenied, errcode.ErrorCodeTooManyRequests, v2.ErrorCodeNameUnknown: - return xfer.DoNotRetry{Err: err} - } - case *url.Error: - switch v.Err { - case auth.ErrNoBasicAuthCredentials, auth.ErrNoToken: - return xfer.DoNotRetry{Err: v.Err} - } - return retryOnError(v.Err) - case *client.UnexpectedHTTPResponseError: - return xfer.DoNotRetry{Err: err} - case error: - if err == distribution.ErrBlobUnknown { - return xfer.DoNotRetry{Err: err} - } - if strings.Contains(err.Error(), strings.ToLower(syscall.ENOSPC.Error())) { - return xfer.DoNotRetry{Err: err} - } - } - // let's be nice and fallback if the error is a completely - // unexpected one. - // If new errors have to be handled in some way, please - // add them to the switch above. - return err -} diff --git a/vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/bad_manifest b/vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/bad_manifest deleted file mode 100644 index a1f02a62a..000000000 --- a/vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/bad_manifest +++ /dev/null @@ -1,38 +0,0 @@ -{ - "schemaVersion": 2, - "name": "library/hello-world", - "tag": "latest", - "architecture": "amd64", - "fsLayers": [ - { - "blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4" - }, - { - "blobSum": "sha256:03f4658f8b782e12230c1783426bd3bacce651ce582a4ffb6fbbfa2079428ecb" - } - ], - "history": [ - { - "v1Compatibility": "{\"id\":\"af340544ed62de0680f441c71fa1a80cb084678fed42bae393e543faea3a572c\",\"parent\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"created\":\"2015-08-06T23:53:22.608577814Z\",\"container\":\"c2b715156f640c7ac7d98472ea24335aba5432a1323a3bb722697e6d37ef794f\",\"container_config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) CMD [\\\"/hello\\\"]\"],\"Image\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":{}},\"docker_version\":\"1.7.1\",\"config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/hello\"],\"Image\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n" - }, - { - "v1Compatibility": "{\"id\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"created\":\"2015-08-06T23:53:22.241352727Z\",\"container\":\"9aeb0006ffa72a8287564caaea87625896853701459261d3b569e320c0c9d5dc\",\"container_config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) COPY file:4abd3bff60458ca3b079d7b131ce26b2719055a030dfa96ff827da2b7c7038a7 in /\"],\"Image\":\"\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":null},\"docker_version\":\"1.7.1\",\"config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":null,\"Image\":\"\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":null},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":960}\n" - } - ], - "signatures": [ - { - "header": { - "jwk": { - "crv": "P-256", - "kid": "OIH7:HQFS:44FK:45VB:3B53:OIAG:TPL4:ATF5:6PNE:MGHN:NHQX:2GE4", - "kty": "EC", - "x": "Cu_UyxwLgHzE9rvlYSmvVdqYCXY42E9eNhBb0xNv0SQ", - "y": "zUsjWJkeKQ5tv7S-hl1Tg71cd-CqnrtiiLxSi6N_yc8" - }, - "alg": "ES256" - }, - "signature": "Y6xaFz9Sy-OtcnKQS1Ilq3Dh8cu4h3nBTJCpOTF1XF7vKtcxxA_xMP8-SgDo869SJ3VsvgPL9-Xn-OoYG2rb1A", - "protected": "eyJmb3JtYXRMZW5ndGgiOjMxOTcsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAxNS0wOS0xMVQwNDoxMzo0OFoifQ" - } - ] -} diff --git a/vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/extra_data_manifest b/vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/extra_data_manifest deleted file mode 100644 index beec19a80..000000000 --- a/vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/extra_data_manifest +++ /dev/null @@ -1,46 +0,0 @@ -{ - "schemaVersion": 1, - "name": "library/hello-world", - "tag": "latest", - "architecture": "amd64", - "fsLayers": [ - { - "blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4" - }, - { - "blobSum": "sha256:03f4658f8b782e12230c1783426bd3bacce651ce582a4ffb6fbbfa2079428ecb" - } - ], - "history": [ - { - "v1Compatibility": "{\"id\":\"af340544ed62de0680f441c71fa1a80cb084678fed42bae393e543faea3a572c\",\"parent\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"created\":\"2015-08-06T23:53:22.608577814Z\",\"container\":\"c2b715156f640c7ac7d98472ea24335aba5432a1323a3bb722697e6d37ef794f\",\"container_config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) CMD [\\\"/hello\\\"]\"],\"Image\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":{}},\"docker_version\":\"1.7.1\",\"config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/hello\"],\"Image\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n" - }, - { - "v1Compatibility": "{\"id\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"created\":\"2015-08-06T23:53:22.241352727Z\",\"container\":\"9aeb0006ffa72a8287564caaea87625896853701459261d3b569e320c0c9d5dc\",\"container_config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) COPY file:4abd3bff60458ca3b079d7b131ce26b2719055a030dfa96ff827da2b7c7038a7 in /\"],\"Image\":\"\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":null},\"docker_version\":\"1.7.1\",\"config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":null,\"Image\":\"\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":null},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":960}\n" - } - ], - "fsLayers": [ - { - "blobSum": "sha256:ffff95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4" - }, - { - "blobSum": "sha256:ffff658f8b782e12230c1783426bd3bacce651ce582a4ffb6fbbfa2079428ecb" - } - ], - "signatures": [ - { - "header": { - "jwk": { - "crv": "P-256", - "kid": "OIH7:HQFS:44FK:45VB:3B53:OIAG:TPL4:ATF5:6PNE:MGHN:NHQX:2GE4", - "kty": "EC", - "x": "Cu_UyxwLgHzE9rvlYSmvVdqYCXY42E9eNhBb0xNv0SQ", - "y": "zUsjWJkeKQ5tv7S-hl1Tg71cd-CqnrtiiLxSi6N_yc8" - }, - "alg": "ES256" - }, - "signature": "Y6xaFz9Sy-OtcnKQS1Ilq3Dh8cu4h3nBTJCpOTF1XF7vKtcxxA_xMP8-SgDo869SJ3VsvgPL9-Xn-OoYG2rb1A", - "protected": "eyJmb3JtYXRMZW5ndGgiOjMxOTcsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAxNS0wOS0xMVQwNDoxMzo0OFoifQ" - } - ] -} diff --git a/vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/good_manifest b/vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/good_manifest deleted file mode 100644 index b107de322..000000000 --- a/vendor/github.com/docker/docker/distribution/fixtures/validate_manifest/good_manifest +++ /dev/null @@ -1,38 +0,0 @@ -{ - "schemaVersion": 1, - "name": "library/hello-world", - "tag": "latest", - "architecture": "amd64", - "fsLayers": [ - { - "blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4" - }, - { - "blobSum": "sha256:03f4658f8b782e12230c1783426bd3bacce651ce582a4ffb6fbbfa2079428ecb" - } - ], - "history": [ - { - "v1Compatibility": "{\"id\":\"af340544ed62de0680f441c71fa1a80cb084678fed42bae393e543faea3a572c\",\"parent\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"created\":\"2015-08-06T23:53:22.608577814Z\",\"container\":\"c2b715156f640c7ac7d98472ea24335aba5432a1323a3bb722697e6d37ef794f\",\"container_config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) CMD [\\\"/hello\\\"]\"],\"Image\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":{}},\"docker_version\":\"1.7.1\",\"config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/hello\"],\"Image\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n" - }, - { - "v1Compatibility": "{\"id\":\"535020c3e8add9d6bb06e5ac15a261e73d9b213d62fb2c14d752b8e189b2b912\",\"created\":\"2015-08-06T23:53:22.241352727Z\",\"container\":\"9aeb0006ffa72a8287564caaea87625896853701459261d3b569e320c0c9d5dc\",\"container_config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) COPY file:4abd3bff60458ca3b079d7b131ce26b2719055a030dfa96ff827da2b7c7038a7 in /\"],\"Image\":\"\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":null},\"docker_version\":\"1.7.1\",\"config\":{\"Hostname\":\"9aeb0006ffa7\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":null,\"Cmd\":null,\"Image\":\"\",\"Volumes\":null,\"VolumeDriver\":\"\",\"WorkingDir\":\"\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":null,\"Labels\":null},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":960}\n" - } - ], - "signatures": [ - { - "header": { - "jwk": { - "crv": "P-256", - "kid": "OIH7:HQFS:44FK:45VB:3B53:OIAG:TPL4:ATF5:6PNE:MGHN:NHQX:2GE4", - "kty": "EC", - "x": "Cu_UyxwLgHzE9rvlYSmvVdqYCXY42E9eNhBb0xNv0SQ", - "y": "zUsjWJkeKQ5tv7S-hl1Tg71cd-CqnrtiiLxSi6N_yc8" - }, - "alg": "ES256" - }, - "signature": "Y6xaFz9Sy-OtcnKQS1Ilq3Dh8cu4h3nBTJCpOTF1XF7vKtcxxA_xMP8-SgDo869SJ3VsvgPL9-Xn-OoYG2rb1A", - "protected": "eyJmb3JtYXRMZW5ndGgiOjMxOTcsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAxNS0wOS0xMVQwNDoxMzo0OFoifQ" - } - ] -} \ No newline at end of file diff --git a/vendor/github.com/docker/docker/distribution/metadata/metadata.go b/vendor/github.com/docker/docker/distribution/metadata/metadata.go deleted file mode 100644 index 05ba4f817..000000000 --- a/vendor/github.com/docker/docker/distribution/metadata/metadata.go +++ /dev/null @@ -1,75 +0,0 @@ -package metadata - -import ( - "io/ioutil" - "os" - "path/filepath" - "sync" - - "github.com/docker/docker/pkg/ioutils" -) - -// Store implements a K/V store for mapping distribution-related IDs -// to on-disk layer IDs and image IDs. The namespace identifies the type of -// mapping (i.e. "v1ids" or "artifacts"). MetadataStore is goroutine-safe. -type Store interface { - // Get retrieves data by namespace and key. - Get(namespace string, key string) ([]byte, error) - // Set writes data indexed by namespace and key. - Set(namespace, key string, value []byte) error - // Delete removes data indexed by namespace and key. - Delete(namespace, key string) error -} - -// FSMetadataStore uses the filesystem to associate metadata with layer and -// image IDs. -type FSMetadataStore struct { - sync.RWMutex - basePath string -} - -// NewFSMetadataStore creates a new filesystem-based metadata store. -func NewFSMetadataStore(basePath string) (*FSMetadataStore, error) { - if err := os.MkdirAll(basePath, 0700); err != nil { - return nil, err - } - return &FSMetadataStore{ - basePath: basePath, - }, nil -} - -func (store *FSMetadataStore) path(namespace, key string) string { - return filepath.Join(store.basePath, namespace, key) -} - -// Get retrieves data by namespace and key. The data is read from a file named -// after the key, stored in the namespace's directory. -func (store *FSMetadataStore) Get(namespace string, key string) ([]byte, error) { - store.RLock() - defer store.RUnlock() - - return ioutil.ReadFile(store.path(namespace, key)) -} - -// Set writes data indexed by namespace and key. The data is written to a file -// named after the key, stored in the namespace's directory. -func (store *FSMetadataStore) Set(namespace, key string, value []byte) error { - store.Lock() - defer store.Unlock() - - path := store.path(namespace, key) - if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { - return err - } - return ioutils.AtomicWriteFile(path, value, 0644) -} - -// Delete removes data indexed by namespace and key. The data file named after -// the key, stored in the namespace's directory is deleted. -func (store *FSMetadataStore) Delete(namespace, key string) error { - store.Lock() - defer store.Unlock() - - path := store.path(namespace, key) - return os.Remove(path) -} diff --git a/vendor/github.com/docker/docker/distribution/metadata/v1_id_service.go b/vendor/github.com/docker/docker/distribution/metadata/v1_id_service.go deleted file mode 100644 index f262d4dc3..000000000 --- a/vendor/github.com/docker/docker/distribution/metadata/v1_id_service.go +++ /dev/null @@ -1,51 +0,0 @@ -package metadata - -import ( - "github.com/docker/docker/image/v1" - "github.com/docker/docker/layer" - "github.com/pkg/errors" -) - -// V1IDService maps v1 IDs to layers on disk. -type V1IDService struct { - store Store -} - -// NewV1IDService creates a new V1 ID mapping service. -func NewV1IDService(store Store) *V1IDService { - return &V1IDService{ - store: store, - } -} - -// namespace returns the namespace used by this service. -func (idserv *V1IDService) namespace() string { - return "v1id" -} - -// Get finds a layer by its V1 ID. -func (idserv *V1IDService) Get(v1ID, registry string) (layer.DiffID, error) { - if idserv.store == nil { - return "", errors.New("no v1IDService storage") - } - if err := v1.ValidateID(v1ID); err != nil { - return layer.DiffID(""), err - } - - idBytes, err := idserv.store.Get(idserv.namespace(), registry+","+v1ID) - if err != nil { - return layer.DiffID(""), err - } - return layer.DiffID(idBytes), nil -} - -// Set associates an image with a V1 ID. -func (idserv *V1IDService) Set(v1ID, registry string, id layer.DiffID) error { - if idserv.store == nil { - return nil - } - if err := v1.ValidateID(v1ID); err != nil { - return err - } - return idserv.store.Set(idserv.namespace(), registry+","+v1ID, []byte(id)) -} diff --git a/vendor/github.com/docker/docker/distribution/metadata/v1_id_service_test.go b/vendor/github.com/docker/docker/distribution/metadata/v1_id_service_test.go deleted file mode 100644 index 556886581..000000000 --- a/vendor/github.com/docker/docker/distribution/metadata/v1_id_service_test.go +++ /dev/null @@ -1,83 +0,0 @@ -package metadata - -import ( - "io/ioutil" - "os" - "testing" - - "github.com/docker/docker/layer" -) - -func TestV1IDService(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "v1-id-service-test") - if err != nil { - t.Fatalf("could not create temp dir: %v", err) - } - defer os.RemoveAll(tmpDir) - - metadataStore, err := NewFSMetadataStore(tmpDir) - if err != nil { - t.Fatalf("could not create metadata store: %v", err) - } - v1IDService := NewV1IDService(metadataStore) - - testVectors := []struct { - registry string - v1ID string - layerID layer.DiffID - }{ - { - registry: "registry1", - v1ID: "f0cd5ca10b07f35512fc2f1cbf9a6cefbdb5cba70ac6b0c9e5988f4497f71937", - layerID: layer.DiffID("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"), - }, - { - registry: "registry2", - v1ID: "9e3447ca24cb96d86ebd5960cb34d1299b07e0a0e03801d90b9969a2c187dd6e", - layerID: layer.DiffID("sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa"), - }, - { - registry: "registry1", - v1ID: "9e3447ca24cb96d86ebd5960cb34d1299b07e0a0e03801d90b9969a2c187dd6e", - layerID: layer.DiffID("sha256:03f4658f8b782e12230c1783426bd3bacce651ce582a4ffb6fbbfa2079428ecb"), - }, - } - - // Set some associations - for _, vec := range testVectors { - err := v1IDService.Set(vec.v1ID, vec.registry, vec.layerID) - if err != nil { - t.Fatalf("error calling Set: %v", err) - } - } - - // Check the correct values are read back - for _, vec := range testVectors { - layerID, err := v1IDService.Get(vec.v1ID, vec.registry) - if err != nil { - t.Fatalf("error calling Get: %v", err) - } - if layerID != vec.layerID { - t.Fatal("Get returned incorrect layer ID") - } - } - - // Test Get on a nonexistent entry - _, err = v1IDService.Get("82379823067823853223359023576437723560923756b03560378f4497753917", "registry1") - if err == nil { - t.Fatal("expected error looking up nonexistent entry") - } - - // Overwrite one of the entries and read it back - err = v1IDService.Set(testVectors[0].v1ID, testVectors[0].registry, testVectors[1].layerID) - if err != nil { - t.Fatalf("error calling Set: %v", err) - } - layerID, err := v1IDService.Get(testVectors[0].v1ID, testVectors[0].registry) - if err != nil { - t.Fatalf("error calling Get: %v", err) - } - if layerID != testVectors[1].layerID { - t.Fatal("Get returned incorrect layer ID") - } -} diff --git a/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service.go b/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service.go deleted file mode 100644 index 02d1b4ad2..000000000 --- a/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service.go +++ /dev/null @@ -1,241 +0,0 @@ -package metadata - -import ( - "crypto/hmac" - "crypto/sha256" - "encoding/hex" - "encoding/json" - "errors" - - "github.com/docker/distribution/digest" - "github.com/docker/docker/api/types" - "github.com/docker/docker/layer" -) - -// V2MetadataService maps layer IDs to a set of known metadata for -// the layer. -type V2MetadataService interface { - GetMetadata(diffID layer.DiffID) ([]V2Metadata, error) - GetDiffID(dgst digest.Digest) (layer.DiffID, error) - Add(diffID layer.DiffID, metadata V2Metadata) error - TagAndAdd(diffID layer.DiffID, hmacKey []byte, metadata V2Metadata) error - Remove(metadata V2Metadata) error -} - -// v2MetadataService implements V2MetadataService -type v2MetadataService struct { - store Store -} - -var _ V2MetadataService = &v2MetadataService{} - -// V2Metadata contains the digest and source repository information for a layer. -type V2Metadata struct { - Digest digest.Digest - SourceRepository string - // HMAC hashes above attributes with recent authconfig digest used as a key in order to determine matching - // metadata entries accompanied by the same credentials without actually exposing them. - HMAC string -} - -// CheckV2MetadataHMAC return true if the given "meta" is tagged with a hmac hashed by the given "key". -func CheckV2MetadataHMAC(meta *V2Metadata, key []byte) bool { - if len(meta.HMAC) == 0 || len(key) == 0 { - return len(meta.HMAC) == 0 && len(key) == 0 - } - mac := hmac.New(sha256.New, key) - mac.Write([]byte(meta.Digest)) - mac.Write([]byte(meta.SourceRepository)) - expectedMac := mac.Sum(nil) - - storedMac, err := hex.DecodeString(meta.HMAC) - if err != nil { - return false - } - - return hmac.Equal(storedMac, expectedMac) -} - -// ComputeV2MetadataHMAC returns a hmac for the given "meta" hash by the given key. -func ComputeV2MetadataHMAC(key []byte, meta *V2Metadata) string { - if len(key) == 0 || meta == nil { - return "" - } - mac := hmac.New(sha256.New, key) - mac.Write([]byte(meta.Digest)) - mac.Write([]byte(meta.SourceRepository)) - return hex.EncodeToString(mac.Sum(nil)) -} - -// ComputeV2MetadataHMACKey returns a key for the given "authConfig" that can be used to hash v2 metadata -// entries. -func ComputeV2MetadataHMACKey(authConfig *types.AuthConfig) ([]byte, error) { - if authConfig == nil { - return nil, nil - } - key := authConfigKeyInput{ - Username: authConfig.Username, - Password: authConfig.Password, - Auth: authConfig.Auth, - IdentityToken: authConfig.IdentityToken, - RegistryToken: authConfig.RegistryToken, - } - buf, err := json.Marshal(&key) - if err != nil { - return nil, err - } - return []byte(digest.FromBytes([]byte(buf))), nil -} - -// authConfigKeyInput is a reduced AuthConfig structure holding just relevant credential data eligible for -// hmac key creation. -type authConfigKeyInput struct { - Username string `json:"username,omitempty"` - Password string `json:"password,omitempty"` - Auth string `json:"auth,omitempty"` - - IdentityToken string `json:"identitytoken,omitempty"` - RegistryToken string `json:"registrytoken,omitempty"` -} - -// maxMetadata is the number of metadata entries to keep per layer DiffID. -const maxMetadata = 50 - -// NewV2MetadataService creates a new diff ID to v2 metadata mapping service. -func NewV2MetadataService(store Store) V2MetadataService { - return &v2MetadataService{ - store: store, - } -} - -func (serv *v2MetadataService) diffIDNamespace() string { - return "v2metadata-by-diffid" -} - -func (serv *v2MetadataService) digestNamespace() string { - return "diffid-by-digest" -} - -func (serv *v2MetadataService) diffIDKey(diffID layer.DiffID) string { - return string(digest.Digest(diffID).Algorithm()) + "/" + digest.Digest(diffID).Hex() -} - -func (serv *v2MetadataService) digestKey(dgst digest.Digest) string { - return string(dgst.Algorithm()) + "/" + dgst.Hex() -} - -// GetMetadata finds the metadata associated with a layer DiffID. -func (serv *v2MetadataService) GetMetadata(diffID layer.DiffID) ([]V2Metadata, error) { - if serv.store == nil { - return nil, errors.New("no metadata storage") - } - jsonBytes, err := serv.store.Get(serv.diffIDNamespace(), serv.diffIDKey(diffID)) - if err != nil { - return nil, err - } - - var metadata []V2Metadata - if err := json.Unmarshal(jsonBytes, &metadata); err != nil { - return nil, err - } - - return metadata, nil -} - -// GetDiffID finds a layer DiffID from a digest. -func (serv *v2MetadataService) GetDiffID(dgst digest.Digest) (layer.DiffID, error) { - if serv.store == nil { - return layer.DiffID(""), errors.New("no metadata storage") - } - diffIDBytes, err := serv.store.Get(serv.digestNamespace(), serv.digestKey(dgst)) - if err != nil { - return layer.DiffID(""), err - } - - return layer.DiffID(diffIDBytes), nil -} - -// Add associates metadata with a layer DiffID. If too many metadata entries are -// present, the oldest one is dropped. -func (serv *v2MetadataService) Add(diffID layer.DiffID, metadata V2Metadata) error { - if serv.store == nil { - // Support a service which has no backend storage, in this case - // an add becomes a no-op. - // TODO: implement in memory storage - return nil - } - oldMetadata, err := serv.GetMetadata(diffID) - if err != nil { - oldMetadata = nil - } - newMetadata := make([]V2Metadata, 0, len(oldMetadata)+1) - - // Copy all other metadata to new slice - for _, oldMeta := range oldMetadata { - if oldMeta != metadata { - newMetadata = append(newMetadata, oldMeta) - } - } - - newMetadata = append(newMetadata, metadata) - - if len(newMetadata) > maxMetadata { - newMetadata = newMetadata[len(newMetadata)-maxMetadata:] - } - - jsonBytes, err := json.Marshal(newMetadata) - if err != nil { - return err - } - - err = serv.store.Set(serv.diffIDNamespace(), serv.diffIDKey(diffID), jsonBytes) - if err != nil { - return err - } - - return serv.store.Set(serv.digestNamespace(), serv.digestKey(metadata.Digest), []byte(diffID)) -} - -// TagAndAdd amends the given "meta" for hmac hashed by the given "hmacKey" and associates it with a layer -// DiffID. If too many metadata entries are present, the oldest one is dropped. -func (serv *v2MetadataService) TagAndAdd(diffID layer.DiffID, hmacKey []byte, meta V2Metadata) error { - meta.HMAC = ComputeV2MetadataHMAC(hmacKey, &meta) - return serv.Add(diffID, meta) -} - -// Remove unassociates a metadata entry from a layer DiffID. -func (serv *v2MetadataService) Remove(metadata V2Metadata) error { - if serv.store == nil { - // Support a service which has no backend storage, in this case - // an remove becomes a no-op. - // TODO: implement in memory storage - return nil - } - diffID, err := serv.GetDiffID(metadata.Digest) - if err != nil { - return err - } - oldMetadata, err := serv.GetMetadata(diffID) - if err != nil { - oldMetadata = nil - } - newMetadata := make([]V2Metadata, 0, len(oldMetadata)) - - // Copy all other metadata to new slice - for _, oldMeta := range oldMetadata { - if oldMeta != metadata { - newMetadata = append(newMetadata, oldMeta) - } - } - - if len(newMetadata) == 0 { - return serv.store.Delete(serv.diffIDNamespace(), serv.diffIDKey(diffID)) - } - - jsonBytes, err := json.Marshal(newMetadata) - if err != nil { - return err - } - - return serv.store.Set(serv.diffIDNamespace(), serv.diffIDKey(diffID), jsonBytes) -} diff --git a/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service_test.go b/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service_test.go deleted file mode 100644 index 7b0ecb157..000000000 --- a/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service_test.go +++ /dev/null @@ -1,115 +0,0 @@ -package metadata - -import ( - "encoding/hex" - "io/ioutil" - "math/rand" - "os" - "reflect" - "testing" - - "github.com/docker/distribution/digest" - "github.com/docker/docker/layer" -) - -func TestV2MetadataService(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "blobsum-storage-service-test") - if err != nil { - t.Fatalf("could not create temp dir: %v", err) - } - defer os.RemoveAll(tmpDir) - - metadataStore, err := NewFSMetadataStore(tmpDir) - if err != nil { - t.Fatalf("could not create metadata store: %v", err) - } - V2MetadataService := NewV2MetadataService(metadataStore) - - tooManyBlobSums := make([]V2Metadata, 100) - for i := range tooManyBlobSums { - randDigest := randomDigest() - tooManyBlobSums[i] = V2Metadata{Digest: randDigest} - } - - testVectors := []struct { - diffID layer.DiffID - metadata []V2Metadata - }{ - { - diffID: layer.DiffID("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"), - metadata: []V2Metadata{ - {Digest: digest.Digest("sha256:f0cd5ca10b07f35512fc2f1cbf9a6cefbdb5cba70ac6b0c9e5988f4497f71937")}, - }, - }, - { - diffID: layer.DiffID("sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa"), - metadata: []V2Metadata{ - {Digest: digest.Digest("sha256:f0cd5ca10b07f35512fc2f1cbf9a6cefbdb5cba70ac6b0c9e5988f4497f71937")}, - {Digest: digest.Digest("sha256:9e3447ca24cb96d86ebd5960cb34d1299b07e0a0e03801d90b9969a2c187dd6e")}, - }, - }, - { - diffID: layer.DiffID("sha256:03f4658f8b782e12230c1783426bd3bacce651ce582a4ffb6fbbfa2079428ecb"), - metadata: tooManyBlobSums, - }, - } - - // Set some associations - for _, vec := range testVectors { - for _, blobsum := range vec.metadata { - err := V2MetadataService.Add(vec.diffID, blobsum) - if err != nil { - t.Fatalf("error calling Set: %v", err) - } - } - } - - // Check the correct values are read back - for _, vec := range testVectors { - metadata, err := V2MetadataService.GetMetadata(vec.diffID) - if err != nil { - t.Fatalf("error calling Get: %v", err) - } - expectedMetadataEntries := len(vec.metadata) - if expectedMetadataEntries > 50 { - expectedMetadataEntries = 50 - } - if !reflect.DeepEqual(metadata, vec.metadata[len(vec.metadata)-expectedMetadataEntries:len(vec.metadata)]) { - t.Fatal("Get returned incorrect layer ID") - } - } - - // Test GetMetadata on a nonexistent entry - _, err = V2MetadataService.GetMetadata(layer.DiffID("sha256:82379823067823853223359023576437723560923756b03560378f4497753917")) - if err == nil { - t.Fatal("expected error looking up nonexistent entry") - } - - // Test GetDiffID on a nonexistent entry - _, err = V2MetadataService.GetDiffID(digest.Digest("sha256:82379823067823853223359023576437723560923756b03560378f4497753917")) - if err == nil { - t.Fatal("expected error looking up nonexistent entry") - } - - // Overwrite one of the entries and read it back - err = V2MetadataService.Add(testVectors[1].diffID, testVectors[0].metadata[0]) - if err != nil { - t.Fatalf("error calling Add: %v", err) - } - diffID, err := V2MetadataService.GetDiffID(testVectors[0].metadata[0].Digest) - if err != nil { - t.Fatalf("error calling GetDiffID: %v", err) - } - if diffID != testVectors[1].diffID { - t.Fatal("GetDiffID returned incorrect diffID") - } -} - -func randomDigest() digest.Digest { - b := [32]byte{} - for i := 0; i < len(b); i++ { - b[i] = byte(rand.Intn(256)) - } - d := hex.EncodeToString(b[:]) - return digest.Digest("sha256:" + d) -} diff --git a/vendor/github.com/docker/docker/distribution/pull.go b/vendor/github.com/docker/docker/distribution/pull.go deleted file mode 100644 index a0acfe5b6..000000000 --- a/vendor/github.com/docker/docker/distribution/pull.go +++ /dev/null @@ -1,200 +0,0 @@ -package distribution - -import ( - "fmt" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/api" - "github.com/docker/docker/distribution/metadata" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "golang.org/x/net/context" -) - -// Puller is an interface that abstracts pulling for different API versions. -type Puller interface { - // Pull tries to pull the image referenced by `tag` - // Pull returns an error if any, as well as a boolean that determines whether to retry Pull on the next configured endpoint. - // - Pull(ctx context.Context, ref reference.Named) error -} - -// newPuller returns a Puller interface that will pull from either a v1 or v2 -// registry. The endpoint argument contains a Version field that determines -// whether a v1 or v2 puller will be created. The other parameters are passed -// through to the underlying puller implementation for use during the actual -// pull operation. -func newPuller(endpoint registry.APIEndpoint, repoInfo *registry.RepositoryInfo, imagePullConfig *ImagePullConfig) (Puller, error) { - switch endpoint.Version { - case registry.APIVersion2: - return &v2Puller{ - V2MetadataService: metadata.NewV2MetadataService(imagePullConfig.MetadataStore), - endpoint: endpoint, - config: imagePullConfig, - repoInfo: repoInfo, - }, nil - case registry.APIVersion1: - return &v1Puller{ - v1IDService: metadata.NewV1IDService(imagePullConfig.MetadataStore), - endpoint: endpoint, - config: imagePullConfig, - repoInfo: repoInfo, - }, nil - } - return nil, fmt.Errorf("unknown version %d for registry %s", endpoint.Version, endpoint.URL) -} - -// Pull initiates a pull operation. image is the repository name to pull, and -// tag may be either empty, or indicate a specific tag to pull. -func Pull(ctx context.Context, ref reference.Named, imagePullConfig *ImagePullConfig) error { - // Resolve the Repository name from fqn to RepositoryInfo - repoInfo, err := imagePullConfig.RegistryService.ResolveRepository(ref) - if err != nil { - return err - } - - // makes sure name is not empty or `scratch` - if err := ValidateRepoName(repoInfo.Name()); err != nil { - return err - } - - endpoints, err := imagePullConfig.RegistryService.LookupPullEndpoints(repoInfo.Hostname()) - if err != nil { - return err - } - - var ( - lastErr error - - // discardNoSupportErrors is used to track whether an endpoint encountered an error of type registry.ErrNoSupport - // By default it is false, which means that if an ErrNoSupport error is encountered, it will be saved in lastErr. - // As soon as another kind of error is encountered, discardNoSupportErrors is set to true, avoiding the saving of - // any subsequent ErrNoSupport errors in lastErr. - // It's needed for pull-by-digest on v1 endpoints: if there are only v1 endpoints configured, the error should be - // returned and displayed, but if there was a v2 endpoint which supports pull-by-digest, then the last relevant - // error is the ones from v2 endpoints not v1. - discardNoSupportErrors bool - - // confirmedV2 is set to true if a pull attempt managed to - // confirm that it was talking to a v2 registry. This will - // prevent fallback to the v1 protocol. - confirmedV2 bool - - // confirmedTLSRegistries is a map indicating which registries - // are known to be using TLS. There should never be a plaintext - // retry for any of these. - confirmedTLSRegistries = make(map[string]struct{}) - ) - for _, endpoint := range endpoints { - if imagePullConfig.RequireSchema2 && endpoint.Version == registry.APIVersion1 { - continue - } - - if confirmedV2 && endpoint.Version == registry.APIVersion1 { - logrus.Debugf("Skipping v1 endpoint %s because v2 registry was detected", endpoint.URL) - continue - } - - if endpoint.URL.Scheme != "https" { - if _, confirmedTLS := confirmedTLSRegistries[endpoint.URL.Host]; confirmedTLS { - logrus.Debugf("Skipping non-TLS endpoint %s for host/port that appears to use TLS", endpoint.URL) - continue - } - } - - logrus.Debugf("Trying to pull %s from %s %s", repoInfo.Name(), endpoint.URL, endpoint.Version) - - puller, err := newPuller(endpoint, repoInfo, imagePullConfig) - if err != nil { - lastErr = err - continue - } - if err := puller.Pull(ctx, ref); err != nil { - // Was this pull cancelled? If so, don't try to fall - // back. - fallback := false - select { - case <-ctx.Done(): - default: - if fallbackErr, ok := err.(fallbackError); ok { - fallback = true - confirmedV2 = confirmedV2 || fallbackErr.confirmedV2 - if fallbackErr.transportOK && endpoint.URL.Scheme == "https" { - confirmedTLSRegistries[endpoint.URL.Host] = struct{}{} - } - err = fallbackErr.err - } - } - if fallback { - if _, ok := err.(ErrNoSupport); !ok { - // Because we found an error that's not ErrNoSupport, discard all subsequent ErrNoSupport errors. - discardNoSupportErrors = true - // append subsequent errors - lastErr = err - } else if !discardNoSupportErrors { - // Save the ErrNoSupport error, because it's either the first error or all encountered errors - // were also ErrNoSupport errors. - // append subsequent errors - lastErr = err - } - logrus.Errorf("Attempting next endpoint for pull after error: %v", err) - continue - } - logrus.Errorf("Not continuing with pull after error: %v", err) - return TranslatePullError(err, ref) - } - - imagePullConfig.ImageEventLogger(ref.String(), repoInfo.Name(), "pull") - return nil - } - - if lastErr == nil { - lastErr = fmt.Errorf("no endpoints found for %s", ref.String()) - } - - return TranslatePullError(lastErr, ref) -} - -// writeStatus writes a status message to out. If layersDownloaded is true, the -// status message indicates that a newer image was downloaded. Otherwise, it -// indicates that the image is up to date. requestedTag is the tag the message -// will refer to. -func writeStatus(requestedTag string, out progress.Output, layersDownloaded bool) { - if layersDownloaded { - progress.Message(out, "", "Status: Downloaded newer image for "+requestedTag) - } else { - progress.Message(out, "", "Status: Image is up to date for "+requestedTag) - } -} - -// ValidateRepoName validates the name of a repository. -func ValidateRepoName(name string) error { - if name == "" { - return fmt.Errorf("Repository name can't be empty") - } - if name == api.NoBaseImageSpecifier { - return fmt.Errorf("'%s' is a reserved name", api.NoBaseImageSpecifier) - } - return nil -} - -func addDigestReference(store reference.Store, ref reference.Named, dgst digest.Digest, id digest.Digest) error { - dgstRef, err := reference.WithDigest(reference.TrimNamed(ref), dgst) - if err != nil { - return err - } - - if oldTagID, err := store.Get(dgstRef); err == nil { - if oldTagID != id { - // Updating digests not supported by reference store - logrus.Errorf("Image ID for digest %s changed from %s to %s, cannot update", dgst.String(), oldTagID, id) - } - return nil - } else if err != reference.ErrDoesNotExist { - return err - } - - return store.AddDigest(dgstRef, id, true) -} diff --git a/vendor/github.com/docker/docker/distribution/pull_v1.go b/vendor/github.com/docker/docker/distribution/pull_v1.go deleted file mode 100644 index f44ed4f37..000000000 --- a/vendor/github.com/docker/docker/distribution/pull_v1.go +++ /dev/null @@ -1,368 +0,0 @@ -package distribution - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "net" - "net/url" - "os" - "strings" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/registry/client/transport" - "github.com/docker/docker/distribution/metadata" - "github.com/docker/docker/distribution/xfer" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/image" - "github.com/docker/docker/image/v1" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "golang.org/x/net/context" -) - -type v1Puller struct { - v1IDService *metadata.V1IDService - endpoint registry.APIEndpoint - config *ImagePullConfig - repoInfo *registry.RepositoryInfo - session *registry.Session -} - -func (p *v1Puller) Pull(ctx context.Context, ref reference.Named) error { - if _, isCanonical := ref.(reference.Canonical); isCanonical { - // Allowing fallback, because HTTPS v1 is before HTTP v2 - return fallbackError{err: ErrNoSupport{Err: errors.New("Cannot pull by digest with v1 registry")}} - } - - tlsConfig, err := p.config.RegistryService.TLSConfig(p.repoInfo.Index.Name) - if err != nil { - return err - } - // Adds Docker-specific headers as well as user-specified headers (metaHeaders) - tr := transport.NewTransport( - // TODO(tiborvass): was ReceiveTimeout - registry.NewTransport(tlsConfig), - registry.DockerHeaders(dockerversion.DockerUserAgent(ctx), p.config.MetaHeaders)..., - ) - client := registry.HTTPClient(tr) - v1Endpoint, err := p.endpoint.ToV1Endpoint(dockerversion.DockerUserAgent(ctx), p.config.MetaHeaders) - if err != nil { - logrus.Debugf("Could not get v1 endpoint: %v", err) - return fallbackError{err: err} - } - p.session, err = registry.NewSession(client, p.config.AuthConfig, v1Endpoint) - if err != nil { - // TODO(dmcgowan): Check if should fallback - logrus.Debugf("Fallback from error: %s", err) - return fallbackError{err: err} - } - if err := p.pullRepository(ctx, ref); err != nil { - // TODO(dmcgowan): Check if should fallback - return err - } - progress.Message(p.config.ProgressOutput, "", p.repoInfo.FullName()+": this image was pulled from a legacy registry. Important: This registry version will not be supported in future versions of docker.") - - return nil -} - -func (p *v1Puller) pullRepository(ctx context.Context, ref reference.Named) error { - progress.Message(p.config.ProgressOutput, "", "Pulling repository "+p.repoInfo.FullName()) - - tagged, isTagged := ref.(reference.NamedTagged) - - repoData, err := p.session.GetRepositoryData(p.repoInfo) - if err != nil { - if strings.Contains(err.Error(), "HTTP code: 404") { - if isTagged { - return fmt.Errorf("Error: image %s:%s not found", p.repoInfo.RemoteName(), tagged.Tag()) - } - return fmt.Errorf("Error: image %s not found", p.repoInfo.RemoteName()) - } - // Unexpected HTTP error - return err - } - - logrus.Debug("Retrieving the tag list") - var tagsList map[string]string - if !isTagged { - tagsList, err = p.session.GetRemoteTags(repoData.Endpoints, p.repoInfo) - } else { - var tagID string - tagsList = make(map[string]string) - tagID, err = p.session.GetRemoteTag(repoData.Endpoints, p.repoInfo, tagged.Tag()) - if err == registry.ErrRepoNotFound { - return fmt.Errorf("Tag %s not found in repository %s", tagged.Tag(), p.repoInfo.FullName()) - } - tagsList[tagged.Tag()] = tagID - } - if err != nil { - logrus.Errorf("unable to get remote tags: %s", err) - return err - } - - for tag, id := range tagsList { - repoData.ImgList[id] = ®istry.ImgData{ - ID: id, - Tag: tag, - Checksum: "", - } - } - - layersDownloaded := false - for _, imgData := range repoData.ImgList { - if isTagged && imgData.Tag != tagged.Tag() { - continue - } - - err := p.downloadImage(ctx, repoData, imgData, &layersDownloaded) - if err != nil { - return err - } - } - - writeStatus(ref.String(), p.config.ProgressOutput, layersDownloaded) - return nil -} - -func (p *v1Puller) downloadImage(ctx context.Context, repoData *registry.RepositoryData, img *registry.ImgData, layersDownloaded *bool) error { - if img.Tag == "" { - logrus.Debugf("Image (id: %s) present in this repository but untagged, skipping", img.ID) - return nil - } - - localNameRef, err := reference.WithTag(p.repoInfo, img.Tag) - if err != nil { - retErr := fmt.Errorf("Image (id: %s) has invalid tag: %s", img.ID, img.Tag) - logrus.Debug(retErr.Error()) - return retErr - } - - if err := v1.ValidateID(img.ID); err != nil { - return err - } - - progress.Updatef(p.config.ProgressOutput, stringid.TruncateID(img.ID), "Pulling image (%s) from %s", img.Tag, p.repoInfo.FullName()) - success := false - var lastErr error - for _, ep := range p.repoInfo.Index.Mirrors { - ep += "v1/" - progress.Updatef(p.config.ProgressOutput, stringid.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s, mirror: %s", img.Tag, p.repoInfo.FullName(), ep)) - if err = p.pullImage(ctx, img.ID, ep, localNameRef, layersDownloaded); err != nil { - // Don't report errors when pulling from mirrors. - logrus.Debugf("Error pulling image (%s) from %s, mirror: %s, %s", img.Tag, p.repoInfo.FullName(), ep, err) - continue - } - success = true - break - } - if !success { - for _, ep := range repoData.Endpoints { - progress.Updatef(p.config.ProgressOutput, stringid.TruncateID(img.ID), "Pulling image (%s) from %s, endpoint: %s", img.Tag, p.repoInfo.FullName(), ep) - if err = p.pullImage(ctx, img.ID, ep, localNameRef, layersDownloaded); err != nil { - // It's not ideal that only the last error is returned, it would be better to concatenate the errors. - // As the error is also given to the output stream the user will see the error. - lastErr = err - progress.Updatef(p.config.ProgressOutput, stringid.TruncateID(img.ID), "Error pulling image (%s) from %s, endpoint: %s, %s", img.Tag, p.repoInfo.FullName(), ep, err) - continue - } - success = true - break - } - } - if !success { - err := fmt.Errorf("Error pulling image (%s) from %s, %v", img.Tag, p.repoInfo.FullName(), lastErr) - progress.Update(p.config.ProgressOutput, stringid.TruncateID(img.ID), err.Error()) - return err - } - return nil -} - -func (p *v1Puller) pullImage(ctx context.Context, v1ID, endpoint string, localNameRef reference.Named, layersDownloaded *bool) (err error) { - var history []string - history, err = p.session.GetRemoteHistory(v1ID, endpoint) - if err != nil { - return err - } - if len(history) < 1 { - return fmt.Errorf("empty history for image %s", v1ID) - } - progress.Update(p.config.ProgressOutput, stringid.TruncateID(v1ID), "Pulling dependent layers") - - var ( - descriptors []xfer.DownloadDescriptor - newHistory []image.History - imgJSON []byte - imgSize int64 - ) - - // Iterate over layers, in order from bottom-most to top-most. Download - // config for all layers and create descriptors. - for i := len(history) - 1; i >= 0; i-- { - v1LayerID := history[i] - imgJSON, imgSize, err = p.downloadLayerConfig(v1LayerID, endpoint) - if err != nil { - return err - } - - // Create a new-style config from the legacy configs - h, err := v1.HistoryFromConfig(imgJSON, false) - if err != nil { - return err - } - newHistory = append(newHistory, h) - - layerDescriptor := &v1LayerDescriptor{ - v1LayerID: v1LayerID, - indexName: p.repoInfo.Index.Name, - endpoint: endpoint, - v1IDService: p.v1IDService, - layersDownloaded: layersDownloaded, - layerSize: imgSize, - session: p.session, - } - - descriptors = append(descriptors, layerDescriptor) - } - - rootFS := image.NewRootFS() - resultRootFS, release, err := p.config.DownloadManager.Download(ctx, *rootFS, descriptors, p.config.ProgressOutput) - if err != nil { - return err - } - defer release() - - config, err := v1.MakeConfigFromV1Config(imgJSON, &resultRootFS, newHistory) - if err != nil { - return err - } - - imageID, err := p.config.ImageStore.Put(config) - if err != nil { - return err - } - - if p.config.ReferenceStore != nil { - if err := p.config.ReferenceStore.AddTag(localNameRef, imageID, true); err != nil { - return err - } - } - - return nil -} - -func (p *v1Puller) downloadLayerConfig(v1LayerID, endpoint string) (imgJSON []byte, imgSize int64, err error) { - progress.Update(p.config.ProgressOutput, stringid.TruncateID(v1LayerID), "Pulling metadata") - - retries := 5 - for j := 1; j <= retries; j++ { - imgJSON, imgSize, err := p.session.GetRemoteImageJSON(v1LayerID, endpoint) - if err != nil && j == retries { - progress.Update(p.config.ProgressOutput, stringid.TruncateID(v1LayerID), "Error pulling layer metadata") - return nil, 0, err - } else if err != nil { - time.Sleep(time.Duration(j) * 500 * time.Millisecond) - continue - } - - return imgJSON, imgSize, nil - } - - // not reached - return nil, 0, nil -} - -type v1LayerDescriptor struct { - v1LayerID string - indexName string - endpoint string - v1IDService *metadata.V1IDService - layersDownloaded *bool - layerSize int64 - session *registry.Session - tmpFile *os.File -} - -func (ld *v1LayerDescriptor) Key() string { - return "v1:" + ld.v1LayerID -} - -func (ld *v1LayerDescriptor) ID() string { - return stringid.TruncateID(ld.v1LayerID) -} - -func (ld *v1LayerDescriptor) DiffID() (layer.DiffID, error) { - return ld.v1IDService.Get(ld.v1LayerID, ld.indexName) -} - -func (ld *v1LayerDescriptor) Download(ctx context.Context, progressOutput progress.Output) (io.ReadCloser, int64, error) { - progress.Update(progressOutput, ld.ID(), "Pulling fs layer") - layerReader, err := ld.session.GetRemoteImageLayer(ld.v1LayerID, ld.endpoint, ld.layerSize) - if err != nil { - progress.Update(progressOutput, ld.ID(), "Error pulling dependent layers") - if uerr, ok := err.(*url.Error); ok { - err = uerr.Err - } - if terr, ok := err.(net.Error); ok && terr.Timeout() { - return nil, 0, err - } - return nil, 0, xfer.DoNotRetry{Err: err} - } - *ld.layersDownloaded = true - - ld.tmpFile, err = ioutil.TempFile("", "GetImageBlob") - if err != nil { - layerReader.Close() - return nil, 0, err - } - - reader := progress.NewProgressReader(ioutils.NewCancelReadCloser(ctx, layerReader), progressOutput, ld.layerSize, ld.ID(), "Downloading") - defer reader.Close() - - _, err = io.Copy(ld.tmpFile, reader) - if err != nil { - ld.Close() - return nil, 0, err - } - - progress.Update(progressOutput, ld.ID(), "Download complete") - - logrus.Debugf("Downloaded %s to tempfile %s", ld.ID(), ld.tmpFile.Name()) - - ld.tmpFile.Seek(0, 0) - - // hand off the temporary file to the download manager, so it will only - // be closed once - tmpFile := ld.tmpFile - ld.tmpFile = nil - - return ioutils.NewReadCloserWrapper(tmpFile, func() error { - tmpFile.Close() - err := os.RemoveAll(tmpFile.Name()) - if err != nil { - logrus.Errorf("Failed to remove temp file: %s", tmpFile.Name()) - } - return err - }), ld.layerSize, nil -} - -func (ld *v1LayerDescriptor) Close() { - if ld.tmpFile != nil { - ld.tmpFile.Close() - if err := os.RemoveAll(ld.tmpFile.Name()); err != nil { - logrus.Errorf("Failed to remove temp file: %s", ld.tmpFile.Name()) - } - ld.tmpFile = nil - } -} - -func (ld *v1LayerDescriptor) Registered(diffID layer.DiffID) { - // Cache mapping from this layer's DiffID to the blobsum - ld.v1IDService.Set(ld.v1LayerID, ld.indexName, diffID) -} diff --git a/vendor/github.com/docker/docker/distribution/pull_v2.go b/vendor/github.com/docker/docker/distribution/pull_v2.go deleted file mode 100644 index 88807edc7..000000000 --- a/vendor/github.com/docker/docker/distribution/pull_v2.go +++ /dev/null @@ -1,878 +0,0 @@ -package distribution - -import ( - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "net/url" - "os" - "runtime" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/manifestlist" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/manifest/schema2" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/distribution/registry/client/auth" - "github.com/docker/distribution/registry/client/transport" - "github.com/docker/docker/distribution/metadata" - "github.com/docker/docker/distribution/xfer" - "github.com/docker/docker/image" - "github.com/docker/docker/image/v1" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "golang.org/x/net/context" -) - -var ( - errRootFSMismatch = errors.New("layers from manifest don't match image configuration") - errRootFSInvalid = errors.New("invalid rootfs in image configuration") -) - -// ImageConfigPullError is an error pulling the image config blob -// (only applies to schema2). -type ImageConfigPullError struct { - Err error -} - -// Error returns the error string for ImageConfigPullError. -func (e ImageConfigPullError) Error() string { - return "error pulling image configuration: " + e.Err.Error() -} - -type v2Puller struct { - V2MetadataService metadata.V2MetadataService - endpoint registry.APIEndpoint - config *ImagePullConfig - repoInfo *registry.RepositoryInfo - repo distribution.Repository - // confirmedV2 is set to true if we confirm we're talking to a v2 - // registry. This is used to limit fallbacks to the v1 protocol. - confirmedV2 bool -} - -func (p *v2Puller) Pull(ctx context.Context, ref reference.Named) (err error) { - // TODO(tiborvass): was ReceiveTimeout - p.repo, p.confirmedV2, err = NewV2Repository(ctx, p.repoInfo, p.endpoint, p.config.MetaHeaders, p.config.AuthConfig, "pull") - if err != nil { - logrus.Warnf("Error getting v2 registry: %v", err) - return err - } - - if err = p.pullV2Repository(ctx, ref); err != nil { - if _, ok := err.(fallbackError); ok { - return err - } - if continueOnError(err) { - logrus.Errorf("Error trying v2 registry: %v", err) - return fallbackError{ - err: err, - confirmedV2: p.confirmedV2, - transportOK: true, - } - } - } - return err -} - -func (p *v2Puller) pullV2Repository(ctx context.Context, ref reference.Named) (err error) { - var layersDownloaded bool - if !reference.IsNameOnly(ref) { - layersDownloaded, err = p.pullV2Tag(ctx, ref) - if err != nil { - return err - } - } else { - tags, err := p.repo.Tags(ctx).All(ctx) - if err != nil { - // If this repository doesn't exist on V2, we should - // permit a fallback to V1. - return allowV1Fallback(err) - } - - // The v2 registry knows about this repository, so we will not - // allow fallback to the v1 protocol even if we encounter an - // error later on. - p.confirmedV2 = true - - for _, tag := range tags { - tagRef, err := reference.WithTag(ref, tag) - if err != nil { - return err - } - pulledNew, err := p.pullV2Tag(ctx, tagRef) - if err != nil { - // Since this is the pull-all-tags case, don't - // allow an error pulling a particular tag to - // make the whole pull fall back to v1. - if fallbackErr, ok := err.(fallbackError); ok { - return fallbackErr.err - } - return err - } - // pulledNew is true if either new layers were downloaded OR if existing images were newly tagged - // TODO(tiborvass): should we change the name of `layersDownload`? What about message in WriteStatus? - layersDownloaded = layersDownloaded || pulledNew - } - } - - writeStatus(ref.String(), p.config.ProgressOutput, layersDownloaded) - - return nil -} - -type v2LayerDescriptor struct { - digest digest.Digest - repoInfo *registry.RepositoryInfo - repo distribution.Repository - V2MetadataService metadata.V2MetadataService - tmpFile *os.File - verifier digest.Verifier - src distribution.Descriptor -} - -func (ld *v2LayerDescriptor) Key() string { - return "v2:" + ld.digest.String() -} - -func (ld *v2LayerDescriptor) ID() string { - return stringid.TruncateID(ld.digest.String()) -} - -func (ld *v2LayerDescriptor) DiffID() (layer.DiffID, error) { - return ld.V2MetadataService.GetDiffID(ld.digest) -} - -func (ld *v2LayerDescriptor) Download(ctx context.Context, progressOutput progress.Output) (io.ReadCloser, int64, error) { - logrus.Debugf("pulling blob %q", ld.digest) - - var ( - err error - offset int64 - ) - - if ld.tmpFile == nil { - ld.tmpFile, err = createDownloadFile() - if err != nil { - return nil, 0, xfer.DoNotRetry{Err: err} - } - } else { - offset, err = ld.tmpFile.Seek(0, os.SEEK_END) - if err != nil { - logrus.Debugf("error seeking to end of download file: %v", err) - offset = 0 - - ld.tmpFile.Close() - if err := os.Remove(ld.tmpFile.Name()); err != nil { - logrus.Errorf("Failed to remove temp file: %s", ld.tmpFile.Name()) - } - ld.tmpFile, err = createDownloadFile() - if err != nil { - return nil, 0, xfer.DoNotRetry{Err: err} - } - } else if offset != 0 { - logrus.Debugf("attempting to resume download of %q from %d bytes", ld.digest, offset) - } - } - - tmpFile := ld.tmpFile - - layerDownload, err := ld.open(ctx) - if err != nil { - logrus.Errorf("Error initiating layer download: %v", err) - return nil, 0, retryOnError(err) - } - - if offset != 0 { - _, err := layerDownload.Seek(offset, os.SEEK_SET) - if err != nil { - if err := ld.truncateDownloadFile(); err != nil { - return nil, 0, xfer.DoNotRetry{Err: err} - } - return nil, 0, err - } - } - size, err := layerDownload.Seek(0, os.SEEK_END) - if err != nil { - // Seek failed, perhaps because there was no Content-Length - // header. This shouldn't fail the download, because we can - // still continue without a progress bar. - size = 0 - } else { - if size != 0 && offset > size { - logrus.Debug("Partial download is larger than full blob. Starting over") - offset = 0 - if err := ld.truncateDownloadFile(); err != nil { - return nil, 0, xfer.DoNotRetry{Err: err} - } - } - - // Restore the seek offset either at the beginning of the - // stream, or just after the last byte we have from previous - // attempts. - _, err = layerDownload.Seek(offset, os.SEEK_SET) - if err != nil { - return nil, 0, err - } - } - - reader := progress.NewProgressReader(ioutils.NewCancelReadCloser(ctx, layerDownload), progressOutput, size-offset, ld.ID(), "Downloading") - defer reader.Close() - - if ld.verifier == nil { - ld.verifier, err = digest.NewDigestVerifier(ld.digest) - if err != nil { - return nil, 0, xfer.DoNotRetry{Err: err} - } - } - - _, err = io.Copy(tmpFile, io.TeeReader(reader, ld.verifier)) - if err != nil { - if err == transport.ErrWrongCodeForByteRange { - if err := ld.truncateDownloadFile(); err != nil { - return nil, 0, xfer.DoNotRetry{Err: err} - } - return nil, 0, err - } - return nil, 0, retryOnError(err) - } - - progress.Update(progressOutput, ld.ID(), "Verifying Checksum") - - if !ld.verifier.Verified() { - err = fmt.Errorf("filesystem layer verification failed for digest %s", ld.digest) - logrus.Error(err) - - // Allow a retry if this digest verification error happened - // after a resumed download. - if offset != 0 { - if err := ld.truncateDownloadFile(); err != nil { - return nil, 0, xfer.DoNotRetry{Err: err} - } - - return nil, 0, err - } - return nil, 0, xfer.DoNotRetry{Err: err} - } - - progress.Update(progressOutput, ld.ID(), "Download complete") - - logrus.Debugf("Downloaded %s to tempfile %s", ld.ID(), tmpFile.Name()) - - _, err = tmpFile.Seek(0, os.SEEK_SET) - if err != nil { - tmpFile.Close() - if err := os.Remove(tmpFile.Name()); err != nil { - logrus.Errorf("Failed to remove temp file: %s", tmpFile.Name()) - } - ld.tmpFile = nil - ld.verifier = nil - return nil, 0, xfer.DoNotRetry{Err: err} - } - - // hand off the temporary file to the download manager, so it will only - // be closed once - ld.tmpFile = nil - - return ioutils.NewReadCloserWrapper(tmpFile, func() error { - tmpFile.Close() - err := os.RemoveAll(tmpFile.Name()) - if err != nil { - logrus.Errorf("Failed to remove temp file: %s", tmpFile.Name()) - } - return err - }), size, nil -} - -func (ld *v2LayerDescriptor) Close() { - if ld.tmpFile != nil { - ld.tmpFile.Close() - if err := os.RemoveAll(ld.tmpFile.Name()); err != nil { - logrus.Errorf("Failed to remove temp file: %s", ld.tmpFile.Name()) - } - } -} - -func (ld *v2LayerDescriptor) truncateDownloadFile() error { - // Need a new hash context since we will be redoing the download - ld.verifier = nil - - if _, err := ld.tmpFile.Seek(0, os.SEEK_SET); err != nil { - logrus.Errorf("error seeking to beginning of download file: %v", err) - return err - } - - if err := ld.tmpFile.Truncate(0); err != nil { - logrus.Errorf("error truncating download file: %v", err) - return err - } - - return nil -} - -func (ld *v2LayerDescriptor) Registered(diffID layer.DiffID) { - // Cache mapping from this layer's DiffID to the blobsum - ld.V2MetadataService.Add(diffID, metadata.V2Metadata{Digest: ld.digest, SourceRepository: ld.repoInfo.FullName()}) -} - -func (p *v2Puller) pullV2Tag(ctx context.Context, ref reference.Named) (tagUpdated bool, err error) { - manSvc, err := p.repo.Manifests(ctx) - if err != nil { - return false, err - } - - var ( - manifest distribution.Manifest - tagOrDigest string // Used for logging/progress only - ) - if tagged, isTagged := ref.(reference.NamedTagged); isTagged { - manifest, err = manSvc.Get(ctx, "", distribution.WithTag(tagged.Tag())) - if err != nil { - return false, allowV1Fallback(err) - } - tagOrDigest = tagged.Tag() - } else if digested, isDigested := ref.(reference.Canonical); isDigested { - manifest, err = manSvc.Get(ctx, digested.Digest()) - if err != nil { - return false, err - } - tagOrDigest = digested.Digest().String() - } else { - return false, fmt.Errorf("internal error: reference has neither a tag nor a digest: %s", ref.String()) - } - - if manifest == nil { - return false, fmt.Errorf("image manifest does not exist for tag or digest %q", tagOrDigest) - } - - if m, ok := manifest.(*schema2.DeserializedManifest); ok { - var allowedMediatype bool - for _, t := range p.config.Schema2Types { - if m.Manifest.Config.MediaType == t { - allowedMediatype = true - break - } - } - if !allowedMediatype { - configClass := mediaTypeClasses[m.Manifest.Config.MediaType] - if configClass == "" { - configClass = "unknown" - } - return false, fmt.Errorf("target is %s", configClass) - } - } - - // If manSvc.Get succeeded, we can be confident that the registry on - // the other side speaks the v2 protocol. - p.confirmedV2 = true - - logrus.Debugf("Pulling ref from V2 registry: %s", ref.String()) - progress.Message(p.config.ProgressOutput, tagOrDigest, "Pulling from "+p.repo.Named().Name()) - - var ( - id digest.Digest - manifestDigest digest.Digest - ) - - switch v := manifest.(type) { - case *schema1.SignedManifest: - if p.config.RequireSchema2 { - return false, fmt.Errorf("invalid manifest: not schema2") - } - id, manifestDigest, err = p.pullSchema1(ctx, ref, v) - if err != nil { - return false, err - } - case *schema2.DeserializedManifest: - id, manifestDigest, err = p.pullSchema2(ctx, ref, v) - if err != nil { - return false, err - } - case *manifestlist.DeserializedManifestList: - id, manifestDigest, err = p.pullManifestList(ctx, ref, v) - if err != nil { - return false, err - } - default: - return false, errors.New("unsupported manifest format") - } - - progress.Message(p.config.ProgressOutput, "", "Digest: "+manifestDigest.String()) - - if p.config.ReferenceStore != nil { - oldTagID, err := p.config.ReferenceStore.Get(ref) - if err == nil { - if oldTagID == id { - return false, addDigestReference(p.config.ReferenceStore, ref, manifestDigest, id) - } - } else if err != reference.ErrDoesNotExist { - return false, err - } - - if canonical, ok := ref.(reference.Canonical); ok { - if err = p.config.ReferenceStore.AddDigest(canonical, id, true); err != nil { - return false, err - } - } else { - if err = addDigestReference(p.config.ReferenceStore, ref, manifestDigest, id); err != nil { - return false, err - } - if err = p.config.ReferenceStore.AddTag(ref, id, true); err != nil { - return false, err - } - } - } - return true, nil -} - -func (p *v2Puller) pullSchema1(ctx context.Context, ref reference.Named, unverifiedManifest *schema1.SignedManifest) (id digest.Digest, manifestDigest digest.Digest, err error) { - var verifiedManifest *schema1.Manifest - verifiedManifest, err = verifySchema1Manifest(unverifiedManifest, ref) - if err != nil { - return "", "", err - } - - rootFS := image.NewRootFS() - - // remove duplicate layers and check parent chain validity - err = fixManifestLayers(verifiedManifest) - if err != nil { - return "", "", err - } - - var descriptors []xfer.DownloadDescriptor - - // Image history converted to the new format - var history []image.History - - // Note that the order of this loop is in the direction of bottom-most - // to top-most, so that the downloads slice gets ordered correctly. - for i := len(verifiedManifest.FSLayers) - 1; i >= 0; i-- { - blobSum := verifiedManifest.FSLayers[i].BlobSum - - var throwAway struct { - ThrowAway bool `json:"throwaway,omitempty"` - } - if err := json.Unmarshal([]byte(verifiedManifest.History[i].V1Compatibility), &throwAway); err != nil { - return "", "", err - } - - h, err := v1.HistoryFromConfig([]byte(verifiedManifest.History[i].V1Compatibility), throwAway.ThrowAway) - if err != nil { - return "", "", err - } - history = append(history, h) - - if throwAway.ThrowAway { - continue - } - - layerDescriptor := &v2LayerDescriptor{ - digest: blobSum, - repoInfo: p.repoInfo, - repo: p.repo, - V2MetadataService: p.V2MetadataService, - } - - descriptors = append(descriptors, layerDescriptor) - } - - resultRootFS, release, err := p.config.DownloadManager.Download(ctx, *rootFS, descriptors, p.config.ProgressOutput) - if err != nil { - return "", "", err - } - defer release() - - config, err := v1.MakeConfigFromV1Config([]byte(verifiedManifest.History[0].V1Compatibility), &resultRootFS, history) - if err != nil { - return "", "", err - } - - imageID, err := p.config.ImageStore.Put(config) - if err != nil { - return "", "", err - } - - manifestDigest = digest.FromBytes(unverifiedManifest.Canonical) - - return imageID, manifestDigest, nil -} - -func (p *v2Puller) pullSchema2(ctx context.Context, ref reference.Named, mfst *schema2.DeserializedManifest) (id digest.Digest, manifestDigest digest.Digest, err error) { - manifestDigest, err = schema2ManifestDigest(ref, mfst) - if err != nil { - return "", "", err - } - - target := mfst.Target() - if _, err := p.config.ImageStore.Get(target.Digest); err == nil { - // If the image already exists locally, no need to pull - // anything. - return target.Digest, manifestDigest, nil - } - - var descriptors []xfer.DownloadDescriptor - - // Note that the order of this loop is in the direction of bottom-most - // to top-most, so that the downloads slice gets ordered correctly. - for _, d := range mfst.Layers { - layerDescriptor := &v2LayerDescriptor{ - digest: d.Digest, - repo: p.repo, - repoInfo: p.repoInfo, - V2MetadataService: p.V2MetadataService, - src: d, - } - - descriptors = append(descriptors, layerDescriptor) - } - - configChan := make(chan []byte, 1) - errChan := make(chan error, 1) - var cancel func() - ctx, cancel = context.WithCancel(ctx) - - // Pull the image config - go func() { - configJSON, err := p.pullSchema2Config(ctx, target.Digest) - if err != nil { - errChan <- ImageConfigPullError{Err: err} - cancel() - return - } - configChan <- configJSON - }() - - var ( - configJSON []byte // raw serialized image config - downloadedRootFS *image.RootFS // rootFS from registered layers - configRootFS *image.RootFS // rootFS from configuration - ) - - // https://github.com/docker/docker/issues/24766 - Err on the side of caution, - // explicitly blocking images intended for linux from the Windows daemon. On - // Windows, we do this before the attempt to download, effectively serialising - // the download slightly slowing it down. We have to do it this way, as - // chances are the download of layers itself would fail due to file names - // which aren't suitable for NTFS. At some point in the future, if a similar - // check to block Windows images being pulled on Linux is implemented, it - // may be necessary to perform the same type of serialisation. - if runtime.GOOS == "windows" { - configJSON, configRootFS, err = receiveConfig(p.config.ImageStore, configChan, errChan) - if err != nil { - return "", "", err - } - - if configRootFS == nil { - return "", "", errRootFSInvalid - } - } - - if p.config.DownloadManager != nil { - downloadRootFS := *image.NewRootFS() - rootFS, release, err := p.config.DownloadManager.Download(ctx, downloadRootFS, descriptors, p.config.ProgressOutput) - if err != nil { - if configJSON != nil { - // Already received the config - return "", "", err - } - select { - case err = <-errChan: - return "", "", err - default: - cancel() - select { - case <-configChan: - case <-errChan: - } - return "", "", err - } - } - if release != nil { - defer release() - } - - downloadedRootFS = &rootFS - } - - if configJSON == nil { - configJSON, configRootFS, err = receiveConfig(p.config.ImageStore, configChan, errChan) - if err != nil { - return "", "", err - } - - if configRootFS == nil { - return "", "", errRootFSInvalid - } - } - - if downloadedRootFS != nil { - // The DiffIDs returned in rootFS MUST match those in the config. - // Otherwise the image config could be referencing layers that aren't - // included in the manifest. - if len(downloadedRootFS.DiffIDs) != len(configRootFS.DiffIDs) { - return "", "", errRootFSMismatch - } - - for i := range downloadedRootFS.DiffIDs { - if downloadedRootFS.DiffIDs[i] != configRootFS.DiffIDs[i] { - return "", "", errRootFSMismatch - } - } - } - - imageID, err := p.config.ImageStore.Put(configJSON) - if err != nil { - return "", "", err - } - - return imageID, manifestDigest, nil -} - -func receiveConfig(s ImageConfigStore, configChan <-chan []byte, errChan <-chan error) ([]byte, *image.RootFS, error) { - select { - case configJSON := <-configChan: - rootfs, err := s.RootFSFromConfig(configJSON) - if err != nil { - return nil, nil, err - } - return configJSON, rootfs, nil - case err := <-errChan: - return nil, nil, err - // Don't need a case for ctx.Done in the select because cancellation - // will trigger an error in p.pullSchema2ImageConfig. - } -} - -// pullManifestList handles "manifest lists" which point to various -// platform-specifc manifests. -func (p *v2Puller) pullManifestList(ctx context.Context, ref reference.Named, mfstList *manifestlist.DeserializedManifestList) (id digest.Digest, manifestListDigest digest.Digest, err error) { - manifestListDigest, err = schema2ManifestDigest(ref, mfstList) - if err != nil { - return "", "", err - } - - var manifestDigest digest.Digest - for _, manifestDescriptor := range mfstList.Manifests { - // TODO(aaronl): The manifest list spec supports optional - // "features" and "variant" fields. These are not yet used. - // Once they are, their values should be interpreted here. - if manifestDescriptor.Platform.Architecture == runtime.GOARCH && manifestDescriptor.Platform.OS == runtime.GOOS { - manifestDigest = manifestDescriptor.Digest - break - } - } - - if manifestDigest == "" { - return "", "", errors.New("no supported platform found in manifest list") - } - - manSvc, err := p.repo.Manifests(ctx) - if err != nil { - return "", "", err - } - - manifest, err := manSvc.Get(ctx, manifestDigest) - if err != nil { - return "", "", err - } - - manifestRef, err := reference.WithDigest(reference.TrimNamed(ref), manifestDigest) - if err != nil { - return "", "", err - } - - switch v := manifest.(type) { - case *schema1.SignedManifest: - id, _, err = p.pullSchema1(ctx, manifestRef, v) - if err != nil { - return "", "", err - } - case *schema2.DeserializedManifest: - id, _, err = p.pullSchema2(ctx, manifestRef, v) - if err != nil { - return "", "", err - } - default: - return "", "", errors.New("unsupported manifest format") - } - - return id, manifestListDigest, err -} - -func (p *v2Puller) pullSchema2Config(ctx context.Context, dgst digest.Digest) (configJSON []byte, err error) { - blobs := p.repo.Blobs(ctx) - configJSON, err = blobs.Get(ctx, dgst) - if err != nil { - return nil, err - } - - // Verify image config digest - verifier, err := digest.NewDigestVerifier(dgst) - if err != nil { - return nil, err - } - if _, err := verifier.Write(configJSON); err != nil { - return nil, err - } - if !verifier.Verified() { - err := fmt.Errorf("image config verification failed for digest %s", dgst) - logrus.Error(err) - return nil, err - } - - return configJSON, nil -} - -// schema2ManifestDigest computes the manifest digest, and, if pulling by -// digest, ensures that it matches the requested digest. -func schema2ManifestDigest(ref reference.Named, mfst distribution.Manifest) (digest.Digest, error) { - _, canonical, err := mfst.Payload() - if err != nil { - return "", err - } - - // If pull by digest, then verify the manifest digest. - if digested, isDigested := ref.(reference.Canonical); isDigested { - verifier, err := digest.NewDigestVerifier(digested.Digest()) - if err != nil { - return "", err - } - if _, err := verifier.Write(canonical); err != nil { - return "", err - } - if !verifier.Verified() { - err := fmt.Errorf("manifest verification failed for digest %s", digested.Digest()) - logrus.Error(err) - return "", err - } - return digested.Digest(), nil - } - - return digest.FromBytes(canonical), nil -} - -// allowV1Fallback checks if the error is a possible reason to fallback to v1 -// (even if confirmedV2 has been set already), and if so, wraps the error in -// a fallbackError with confirmedV2 set to false. Otherwise, it returns the -// error unmodified. -func allowV1Fallback(err error) error { - switch v := err.(type) { - case errcode.Errors: - if len(v) != 0 { - if v0, ok := v[0].(errcode.Error); ok && shouldV2Fallback(v0) { - return fallbackError{ - err: err, - confirmedV2: false, - transportOK: true, - } - } - } - case errcode.Error: - if shouldV2Fallback(v) { - return fallbackError{ - err: err, - confirmedV2: false, - transportOK: true, - } - } - case *url.Error: - if v.Err == auth.ErrNoBasicAuthCredentials { - return fallbackError{err: err, confirmedV2: false} - } - } - - return err -} - -func verifySchema1Manifest(signedManifest *schema1.SignedManifest, ref reference.Named) (m *schema1.Manifest, err error) { - // If pull by digest, then verify the manifest digest. NOTE: It is - // important to do this first, before any other content validation. If the - // digest cannot be verified, don't even bother with those other things. - if digested, isCanonical := ref.(reference.Canonical); isCanonical { - verifier, err := digest.NewDigestVerifier(digested.Digest()) - if err != nil { - return nil, err - } - if _, err := verifier.Write(signedManifest.Canonical); err != nil { - return nil, err - } - if !verifier.Verified() { - err := fmt.Errorf("image verification failed for digest %s", digested.Digest()) - logrus.Error(err) - return nil, err - } - } - m = &signedManifest.Manifest - - if m.SchemaVersion != 1 { - return nil, fmt.Errorf("unsupported schema version %d for %q", m.SchemaVersion, ref.String()) - } - if len(m.FSLayers) != len(m.History) { - return nil, fmt.Errorf("length of history not equal to number of layers for %q", ref.String()) - } - if len(m.FSLayers) == 0 { - return nil, fmt.Errorf("no FSLayers in manifest for %q", ref.String()) - } - return m, nil -} - -// fixManifestLayers removes repeated layers from the manifest and checks the -// correctness of the parent chain. -func fixManifestLayers(m *schema1.Manifest) error { - imgs := make([]*image.V1Image, len(m.FSLayers)) - for i := range m.FSLayers { - img := &image.V1Image{} - - if err := json.Unmarshal([]byte(m.History[i].V1Compatibility), img); err != nil { - return err - } - - imgs[i] = img - if err := v1.ValidateID(img.ID); err != nil { - return err - } - } - - if imgs[len(imgs)-1].Parent != "" && runtime.GOOS != "windows" { - // Windows base layer can point to a base layer parent that is not in manifest. - return errors.New("invalid parent ID in the base layer of the image") - } - - // check general duplicates to error instead of a deadlock - idmap := make(map[string]struct{}) - - var lastID string - for _, img := range imgs { - // skip IDs that appear after each other, we handle those later - if _, exists := idmap[img.ID]; img.ID != lastID && exists { - return fmt.Errorf("ID %+v appears multiple times in manifest", img.ID) - } - lastID = img.ID - idmap[lastID] = struct{}{} - } - - // backwards loop so that we keep the remaining indexes after removing items - for i := len(imgs) - 2; i >= 0; i-- { - if imgs[i].ID == imgs[i+1].ID { // repeated ID. remove and continue - m.FSLayers = append(m.FSLayers[:i], m.FSLayers[i+1:]...) - m.History = append(m.History[:i], m.History[i+1:]...) - } else if imgs[i].Parent != imgs[i+1].ID { - return fmt.Errorf("Invalid parent ID. Expected %v, got %v.", imgs[i+1].ID, imgs[i].Parent) - } - } - - return nil -} - -func createDownloadFile() (*os.File, error) { - return ioutil.TempFile("", "GetImageBlob") -} diff --git a/vendor/github.com/docker/docker/distribution/pull_v2_test.go b/vendor/github.com/docker/docker/distribution/pull_v2_test.go deleted file mode 100644 index b745642e3..000000000 --- a/vendor/github.com/docker/docker/distribution/pull_v2_test.go +++ /dev/null @@ -1,183 +0,0 @@ -package distribution - -import ( - "encoding/json" - "io/ioutil" - "reflect" - "runtime" - "strings" - "testing" - - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/docker/reference" -) - -// TestFixManifestLayers checks that fixManifestLayers removes a duplicate -// layer, and that it makes no changes to the manifest when called a second -// time, after the duplicate is removed. -func TestFixManifestLayers(t *testing.T) { - duplicateLayerManifest := schema1.Manifest{ - FSLayers: []schema1.FSLayer{ - {BlobSum: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {BlobSum: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {BlobSum: digest.Digest("sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa")}, - }, - History: []schema1.History{ - {V1Compatibility: "{\"id\":\"3b38edc92eb7c074812e217b41a6ade66888531009d6286a6f5f36a06f9841b9\",\"parent\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"created\":\"2015-08-19T16:49:11.368300679Z\",\"container\":\"d91be3479d5b1e84b0c00d18eea9dc777ca0ad166d51174b24283e2e6f104253\",\"container_config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) ENTRYPOINT [\\\"/go/bin/dnsdock\\\"]\"],\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"docker_version\":\"1.6.2\",\"config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":null,\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n"}, - {V1Compatibility: "{\"id\":\"3b38edc92eb7c074812e217b41a6ade66888531009d6286a6f5f36a06f9841b9\",\"parent\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"created\":\"2015-08-19T16:49:11.368300679Z\",\"container\":\"d91be3479d5b1e84b0c00d18eea9dc777ca0ad166d51174b24283e2e6f104253\",\"container_config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) ENTRYPOINT [\\\"/go/bin/dnsdock\\\"]\"],\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"docker_version\":\"1.6.2\",\"config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":null,\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n"}, - {V1Compatibility: "{\"id\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"created\":\"2015-08-19T16:49:07.568027497Z\",\"container\":\"fe9e5a5264a843c9292d17b736c92dd19bdb49986a8782d7389964ddaff887cc\",\"container_config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"cd /go/src/github.com/tonistiigi/dnsdock \\u0026\\u0026 go get -v github.com/tools/godep \\u0026\\u0026 godep restore \\u0026\\u0026 go install -ldflags \\\"-X main.version `git describe --tags HEAD``if [[ -n $(command git status --porcelain --untracked-files=no 2\\u003e/dev/null) ]]; then echo \\\"-dirty\\\"; fi`\\\" ./...\"],\"Image\":\"e3b0ff09e647595dafee15c54cd632c900df9e82b1d4d313b1e20639a1461779\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"docker_version\":\"1.6.2\",\"config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/bash\"],\"Image\":\"e3b0ff09e647595dafee15c54cd632c900df9e82b1d4d313b1e20639a1461779\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":118430532}\n"}, - }, - } - - duplicateLayerManifestExpectedOutput := schema1.Manifest{ - FSLayers: []schema1.FSLayer{ - {BlobSum: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {BlobSum: digest.Digest("sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa")}, - }, - History: []schema1.History{ - {V1Compatibility: "{\"id\":\"3b38edc92eb7c074812e217b41a6ade66888531009d6286a6f5f36a06f9841b9\",\"parent\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"created\":\"2015-08-19T16:49:11.368300679Z\",\"container\":\"d91be3479d5b1e84b0c00d18eea9dc777ca0ad166d51174b24283e2e6f104253\",\"container_config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) ENTRYPOINT [\\\"/go/bin/dnsdock\\\"]\"],\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"docker_version\":\"1.6.2\",\"config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":null,\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n"}, - {V1Compatibility: "{\"id\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"created\":\"2015-08-19T16:49:07.568027497Z\",\"container\":\"fe9e5a5264a843c9292d17b736c92dd19bdb49986a8782d7389964ddaff887cc\",\"container_config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"cd /go/src/github.com/tonistiigi/dnsdock \\u0026\\u0026 go get -v github.com/tools/godep \\u0026\\u0026 godep restore \\u0026\\u0026 go install -ldflags \\\"-X main.version `git describe --tags HEAD``if [[ -n $(command git status --porcelain --untracked-files=no 2\\u003e/dev/null) ]]; then echo \\\"-dirty\\\"; fi`\\\" ./...\"],\"Image\":\"e3b0ff09e647595dafee15c54cd632c900df9e82b1d4d313b1e20639a1461779\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"docker_version\":\"1.6.2\",\"config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/bash\"],\"Image\":\"e3b0ff09e647595dafee15c54cd632c900df9e82b1d4d313b1e20639a1461779\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":118430532}\n"}, - }, - } - - if err := fixManifestLayers(&duplicateLayerManifest); err != nil { - t.Fatalf("unexpected error from fixManifestLayers: %v", err) - } - - if !reflect.DeepEqual(duplicateLayerManifest, duplicateLayerManifestExpectedOutput) { - t.Fatal("incorrect output from fixManifestLayers on duplicate layer manifest") - } - - // Run fixManifestLayers again and confirm that it doesn't change the - // manifest (which no longer has duplicate layers). - if err := fixManifestLayers(&duplicateLayerManifest); err != nil { - t.Fatalf("unexpected error from fixManifestLayers: %v", err) - } - - if !reflect.DeepEqual(duplicateLayerManifest, duplicateLayerManifestExpectedOutput) { - t.Fatal("incorrect output from fixManifestLayers on duplicate layer manifest (second pass)") - } -} - -// TestFixManifestLayersBaseLayerParent makes sure that fixManifestLayers fails -// if the base layer configuration specifies a parent. -func TestFixManifestLayersBaseLayerParent(t *testing.T) { - // TODO Windows: Fix this unit text - if runtime.GOOS == "windows" { - t.Skip("Needs fixing on Windows") - } - duplicateLayerManifest := schema1.Manifest{ - FSLayers: []schema1.FSLayer{ - {BlobSum: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {BlobSum: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {BlobSum: digest.Digest("sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa")}, - }, - History: []schema1.History{ - {V1Compatibility: "{\"id\":\"3b38edc92eb7c074812e217b41a6ade66888531009d6286a6f5f36a06f9841b9\",\"parent\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"created\":\"2015-08-19T16:49:11.368300679Z\",\"container\":\"d91be3479d5b1e84b0c00d18eea9dc777ca0ad166d51174b24283e2e6f104253\",\"container_config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) ENTRYPOINT [\\\"/go/bin/dnsdock\\\"]\"],\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"docker_version\":\"1.6.2\",\"config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":null,\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n"}, - {V1Compatibility: "{\"id\":\"3b38edc92eb7c074812e217b41a6ade66888531009d6286a6f5f36a06f9841b9\",\"parent\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"created\":\"2015-08-19T16:49:11.368300679Z\",\"container\":\"d91be3479d5b1e84b0c00d18eea9dc777ca0ad166d51174b24283e2e6f104253\",\"container_config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) ENTRYPOINT [\\\"/go/bin/dnsdock\\\"]\"],\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"docker_version\":\"1.6.2\",\"config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":null,\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n"}, - {V1Compatibility: "{\"id\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"parent\":\"e3b0ff09e647595dafee15c54cd632c900df9e82b1d4d313b1e20639a1461779\",\"created\":\"2015-08-19T16:49:07.568027497Z\",\"container\":\"fe9e5a5264a843c9292d17b736c92dd19bdb49986a8782d7389964ddaff887cc\",\"container_config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"cd /go/src/github.com/tonistiigi/dnsdock \\u0026\\u0026 go get -v github.com/tools/godep \\u0026\\u0026 godep restore \\u0026\\u0026 go install -ldflags \\\"-X main.version `git describe --tags HEAD``if [[ -n $(command git status --porcelain --untracked-files=no 2\\u003e/dev/null) ]]; then echo \\\"-dirty\\\"; fi`\\\" ./...\"],\"Image\":\"e3b0ff09e647595dafee15c54cd632c900df9e82b1d4d313b1e20639a1461779\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"docker_version\":\"1.6.2\",\"config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/bash\"],\"Image\":\"e3b0ff09e647595dafee15c54cd632c900df9e82b1d4d313b1e20639a1461779\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":118430532}\n"}, - }, - } - - if err := fixManifestLayers(&duplicateLayerManifest); err == nil || !strings.Contains(err.Error(), "invalid parent ID in the base layer of the image") { - t.Fatalf("expected an invalid parent ID error from fixManifestLayers") - } -} - -// TestFixManifestLayersBadParent makes sure that fixManifestLayers fails -// if an image configuration specifies a parent that doesn't directly follow -// that (deduplicated) image in the image history. -func TestFixManifestLayersBadParent(t *testing.T) { - duplicateLayerManifest := schema1.Manifest{ - FSLayers: []schema1.FSLayer{ - {BlobSum: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {BlobSum: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - {BlobSum: digest.Digest("sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa")}, - }, - History: []schema1.History{ - {V1Compatibility: "{\"id\":\"3b38edc92eb7c074812e217b41a6ade66888531009d6286a6f5f36a06f9841b9\",\"parent\":\"ac3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"created\":\"2015-08-19T16:49:11.368300679Z\",\"container\":\"d91be3479d5b1e84b0c00d18eea9dc777ca0ad166d51174b24283e2e6f104253\",\"container_config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) ENTRYPOINT [\\\"/go/bin/dnsdock\\\"]\"],\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"docker_version\":\"1.6.2\",\"config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":null,\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n"}, - {V1Compatibility: "{\"id\":\"3b38edc92eb7c074812e217b41a6ade66888531009d6286a6f5f36a06f9841b9\",\"parent\":\"ac3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"created\":\"2015-08-19T16:49:11.368300679Z\",\"container\":\"d91be3479d5b1e84b0c00d18eea9dc777ca0ad166d51174b24283e2e6f104253\",\"container_config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) ENTRYPOINT [\\\"/go/bin/dnsdock\\\"]\"],\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"docker_version\":\"1.6.2\",\"config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":null,\"Image\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":[\"/go/bin/dnsdock\"],\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":0}\n"}, - {V1Compatibility: "{\"id\":\"ec3025ca8cc9bcab039e193e20ec647c2da3c53a74020f2ba611601f9b2c6c02\",\"created\":\"2015-08-19T16:49:07.568027497Z\",\"container\":\"fe9e5a5264a843c9292d17b736c92dd19bdb49986a8782d7389964ddaff887cc\",\"container_config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"cd /go/src/github.com/tonistiigi/dnsdock \\u0026\\u0026 go get -v github.com/tools/godep \\u0026\\u0026 godep restore \\u0026\\u0026 go install -ldflags \\\"-X main.version `git describe --tags HEAD``if [[ -n $(command git status --porcelain --untracked-files=no 2\\u003e/dev/null) ]]; then echo \\\"-dirty\\\"; fi`\\\" ./...\"],\"Image\":\"e3b0ff09e647595dafee15c54cd632c900df9e82b1d4d313b1e20639a1461779\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"docker_version\":\"1.6.2\",\"config\":{\"Hostname\":\"03797203757d\",\"Domainname\":\"\",\"User\":\"\",\"Memory\":0,\"MemorySwap\":0,\"CpuShares\":0,\"Cpuset\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"PortSpecs\":null,\"ExposedPorts\":null,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\"GOLANG_VERSION=1.4.1\",\"GOPATH=/go\"],\"Cmd\":[\"/bin/bash\"],\"Image\":\"e3b0ff09e647595dafee15c54cd632c900df9e82b1d4d313b1e20639a1461779\",\"Volumes\":null,\"WorkingDir\":\"/go\",\"Entrypoint\":null,\"NetworkDisabled\":false,\"MacAddress\":\"\",\"OnBuild\":[],\"Labels\":{}},\"architecture\":\"amd64\",\"os\":\"linux\",\"Size\":118430532}\n"}, - }, - } - - if err := fixManifestLayers(&duplicateLayerManifest); err == nil || !strings.Contains(err.Error(), "Invalid parent ID.") { - t.Fatalf("expected an invalid parent ID error from fixManifestLayers") - } -} - -// TestValidateManifest verifies the validateManifest function -func TestValidateManifest(t *testing.T) { - // TODO Windows: Fix this unit text - if runtime.GOOS == "windows" { - t.Skip("Needs fixing on Windows") - } - expectedDigest, err := reference.ParseNamed("repo@sha256:02fee8c3220ba806531f606525eceb83f4feb654f62b207191b1c9209188dedd") - if err != nil { - t.Fatal("could not parse reference") - } - expectedFSLayer0 := digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4") - - // Good manifest - - goodManifestBytes, err := ioutil.ReadFile("fixtures/validate_manifest/good_manifest") - if err != nil { - t.Fatal("error reading fixture:", err) - } - - var goodSignedManifest schema1.SignedManifest - err = json.Unmarshal(goodManifestBytes, &goodSignedManifest) - if err != nil { - t.Fatal("error unmarshaling manifest:", err) - } - - verifiedManifest, err := verifySchema1Manifest(&goodSignedManifest, expectedDigest) - if err != nil { - t.Fatal("validateManifest failed:", err) - } - - if verifiedManifest.FSLayers[0].BlobSum != expectedFSLayer0 { - t.Fatal("unexpected FSLayer in good manifest") - } - - // "Extra data" manifest - - extraDataManifestBytes, err := ioutil.ReadFile("fixtures/validate_manifest/extra_data_manifest") - if err != nil { - t.Fatal("error reading fixture:", err) - } - - var extraDataSignedManifest schema1.SignedManifest - err = json.Unmarshal(extraDataManifestBytes, &extraDataSignedManifest) - if err != nil { - t.Fatal("error unmarshaling manifest:", err) - } - - verifiedManifest, err = verifySchema1Manifest(&extraDataSignedManifest, expectedDigest) - if err != nil { - t.Fatal("validateManifest failed:", err) - } - - if verifiedManifest.FSLayers[0].BlobSum != expectedFSLayer0 { - t.Fatal("unexpected FSLayer in extra data manifest") - } - - // Bad manifest - - badManifestBytes, err := ioutil.ReadFile("fixtures/validate_manifest/bad_manifest") - if err != nil { - t.Fatal("error reading fixture:", err) - } - - var badSignedManifest schema1.SignedManifest - err = json.Unmarshal(badManifestBytes, &badSignedManifest) - if err != nil { - t.Fatal("error unmarshaling manifest:", err) - } - - verifiedManifest, err = verifySchema1Manifest(&badSignedManifest, expectedDigest) - if err == nil || !strings.HasPrefix(err.Error(), "image verification failed for digest") { - t.Fatal("expected validateManifest to fail with digest error") - } -} diff --git a/vendor/github.com/docker/docker/distribution/pull_v2_unix.go b/vendor/github.com/docker/docker/distribution/pull_v2_unix.go deleted file mode 100644 index 45a7a0c15..000000000 --- a/vendor/github.com/docker/docker/distribution/pull_v2_unix.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build !windows - -package distribution - -import ( - "github.com/docker/distribution" - "github.com/docker/distribution/context" -) - -func (ld *v2LayerDescriptor) open(ctx context.Context) (distribution.ReadSeekCloser, error) { - blobs := ld.repo.Blobs(ctx) - return blobs.Open(ctx, ld.digest) -} diff --git a/vendor/github.com/docker/docker/distribution/pull_v2_windows.go b/vendor/github.com/docker/docker/distribution/pull_v2_windows.go deleted file mode 100644 index aefed8660..000000000 --- a/vendor/github.com/docker/docker/distribution/pull_v2_windows.go +++ /dev/null @@ -1,49 +0,0 @@ -// +build windows - -package distribution - -import ( - "net/http" - "os" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/manifest/schema2" - "github.com/docker/distribution/registry/client/transport" -) - -var _ distribution.Describable = &v2LayerDescriptor{} - -func (ld *v2LayerDescriptor) Descriptor() distribution.Descriptor { - if ld.src.MediaType == schema2.MediaTypeForeignLayer && len(ld.src.URLs) > 0 { - return ld.src - } - return distribution.Descriptor{} -} - -func (ld *v2LayerDescriptor) open(ctx context.Context) (distribution.ReadSeekCloser, error) { - if len(ld.src.URLs) == 0 { - blobs := ld.repo.Blobs(ctx) - return blobs.Open(ctx, ld.digest) - } - - var ( - err error - rsc distribution.ReadSeekCloser - ) - - // Find the first URL that results in a 200 result code. - for _, url := range ld.src.URLs { - logrus.Debugf("Pulling %v from foreign URL %v", ld.digest, url) - rsc = transport.NewHTTPReadSeeker(http.DefaultClient, url, nil) - _, err = rsc.Seek(0, os.SEEK_SET) - if err == nil { - break - } - logrus.Debugf("Download for %v failed: %v", ld.digest, err) - rsc.Close() - rsc = nil - } - return rsc, err -} diff --git a/vendor/github.com/docker/docker/distribution/push.go b/vendor/github.com/docker/docker/distribution/push.go deleted file mode 100644 index d35bdb103..000000000 --- a/vendor/github.com/docker/docker/distribution/push.go +++ /dev/null @@ -1,186 +0,0 @@ -package distribution - -import ( - "bufio" - "compress/gzip" - "fmt" - "io" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/distribution/metadata" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "golang.org/x/net/context" -) - -// Pusher is an interface that abstracts pushing for different API versions. -type Pusher interface { - // Push tries to push the image configured at the creation of Pusher. - // Push returns an error if any, as well as a boolean that determines whether to retry Push on the next configured endpoint. - // - // TODO(tiborvass): have Push() take a reference to repository + tag, so that the pusher itself is repository-agnostic. - Push(ctx context.Context) error -} - -const compressionBufSize = 32768 - -// NewPusher creates a new Pusher interface that will push to either a v1 or v2 -// registry. The endpoint argument contains a Version field that determines -// whether a v1 or v2 pusher will be created. The other parameters are passed -// through to the underlying pusher implementation for use during the actual -// push operation. -func NewPusher(ref reference.Named, endpoint registry.APIEndpoint, repoInfo *registry.RepositoryInfo, imagePushConfig *ImagePushConfig) (Pusher, error) { - switch endpoint.Version { - case registry.APIVersion2: - return &v2Pusher{ - v2MetadataService: metadata.NewV2MetadataService(imagePushConfig.MetadataStore), - ref: ref, - endpoint: endpoint, - repoInfo: repoInfo, - config: imagePushConfig, - }, nil - case registry.APIVersion1: - return &v1Pusher{ - v1IDService: metadata.NewV1IDService(imagePushConfig.MetadataStore), - ref: ref, - endpoint: endpoint, - repoInfo: repoInfo, - config: imagePushConfig, - }, nil - } - return nil, fmt.Errorf("unknown version %d for registry %s", endpoint.Version, endpoint.URL) -} - -// Push initiates a push operation on ref. -// ref is the specific variant of the image to be pushed. -// If no tag is provided, all tags will be pushed. -func Push(ctx context.Context, ref reference.Named, imagePushConfig *ImagePushConfig) error { - // FIXME: Allow to interrupt current push when new push of same image is done. - - // Resolve the Repository name from fqn to RepositoryInfo - repoInfo, err := imagePushConfig.RegistryService.ResolveRepository(ref) - if err != nil { - return err - } - - endpoints, err := imagePushConfig.RegistryService.LookupPushEndpoints(repoInfo.Hostname()) - if err != nil { - return err - } - - progress.Messagef(imagePushConfig.ProgressOutput, "", "The push refers to a repository [%s]", repoInfo.FullName()) - - associations := imagePushConfig.ReferenceStore.ReferencesByName(repoInfo) - if len(associations) == 0 { - return fmt.Errorf("An image does not exist locally with the tag: %s", repoInfo.Name()) - } - - var ( - lastErr error - - // confirmedV2 is set to true if a push attempt managed to - // confirm that it was talking to a v2 registry. This will - // prevent fallback to the v1 protocol. - confirmedV2 bool - - // confirmedTLSRegistries is a map indicating which registries - // are known to be using TLS. There should never be a plaintext - // retry for any of these. - confirmedTLSRegistries = make(map[string]struct{}) - ) - - for _, endpoint := range endpoints { - if imagePushConfig.RequireSchema2 && endpoint.Version == registry.APIVersion1 { - continue - } - if confirmedV2 && endpoint.Version == registry.APIVersion1 { - logrus.Debugf("Skipping v1 endpoint %s because v2 registry was detected", endpoint.URL) - continue - } - - if endpoint.URL.Scheme != "https" { - if _, confirmedTLS := confirmedTLSRegistries[endpoint.URL.Host]; confirmedTLS { - logrus.Debugf("Skipping non-TLS endpoint %s for host/port that appears to use TLS", endpoint.URL) - continue - } - } - - logrus.Debugf("Trying to push %s to %s %s", repoInfo.FullName(), endpoint.URL, endpoint.Version) - - pusher, err := NewPusher(ref, endpoint, repoInfo, imagePushConfig) - if err != nil { - lastErr = err - continue - } - if err := pusher.Push(ctx); err != nil { - // Was this push cancelled? If so, don't try to fall - // back. - select { - case <-ctx.Done(): - default: - if fallbackErr, ok := err.(fallbackError); ok { - confirmedV2 = confirmedV2 || fallbackErr.confirmedV2 - if fallbackErr.transportOK && endpoint.URL.Scheme == "https" { - confirmedTLSRegistries[endpoint.URL.Host] = struct{}{} - } - err = fallbackErr.err - lastErr = err - logrus.Errorf("Attempting next endpoint for push after error: %v", err) - continue - } - } - - logrus.Errorf("Not continuing with push after error: %v", err) - return err - } - - imagePushConfig.ImageEventLogger(ref.String(), repoInfo.Name(), "push") - return nil - } - - if lastErr == nil { - lastErr = fmt.Errorf("no endpoints found for %s", repoInfo.FullName()) - } - return lastErr -} - -// compress returns an io.ReadCloser which will supply a compressed version of -// the provided Reader. The caller must close the ReadCloser after reading the -// compressed data. -// -// Note that this function returns a reader instead of taking a writer as an -// argument so that it can be used with httpBlobWriter's ReadFrom method. -// Using httpBlobWriter's Write method would send a PATCH request for every -// Write call. -// -// The second return value is a channel that gets closed when the goroutine -// is finished. This allows the caller to make sure the goroutine finishes -// before it releases any resources connected with the reader that was -// passed in. -func compress(in io.Reader) (io.ReadCloser, chan struct{}) { - compressionDone := make(chan struct{}) - - pipeReader, pipeWriter := io.Pipe() - // Use a bufio.Writer to avoid excessive chunking in HTTP request. - bufWriter := bufio.NewWriterSize(pipeWriter, compressionBufSize) - compressor := gzip.NewWriter(bufWriter) - - go func() { - _, err := io.Copy(compressor, in) - if err == nil { - err = compressor.Close() - } - if err == nil { - err = bufWriter.Flush() - } - if err != nil { - pipeWriter.CloseWithError(err) - } else { - pipeWriter.Close() - } - close(compressionDone) - }() - - return pipeReader, compressionDone -} diff --git a/vendor/github.com/docker/docker/distribution/push_v1.go b/vendor/github.com/docker/docker/distribution/push_v1.go deleted file mode 100644 index 257ac181e..000000000 --- a/vendor/github.com/docker/docker/distribution/push_v1.go +++ /dev/null @@ -1,463 +0,0 @@ -package distribution - -import ( - "fmt" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/registry/client/transport" - "github.com/docker/docker/distribution/metadata" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/image" - "github.com/docker/docker/image/v1" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "golang.org/x/net/context" -) - -type v1Pusher struct { - v1IDService *metadata.V1IDService - endpoint registry.APIEndpoint - ref reference.Named - repoInfo *registry.RepositoryInfo - config *ImagePushConfig - session *registry.Session -} - -func (p *v1Pusher) Push(ctx context.Context) error { - tlsConfig, err := p.config.RegistryService.TLSConfig(p.repoInfo.Index.Name) - if err != nil { - return err - } - // Adds Docker-specific headers as well as user-specified headers (metaHeaders) - tr := transport.NewTransport( - // TODO(tiborvass): was NoTimeout - registry.NewTransport(tlsConfig), - registry.DockerHeaders(dockerversion.DockerUserAgent(ctx), p.config.MetaHeaders)..., - ) - client := registry.HTTPClient(tr) - v1Endpoint, err := p.endpoint.ToV1Endpoint(dockerversion.DockerUserAgent(ctx), p.config.MetaHeaders) - if err != nil { - logrus.Debugf("Could not get v1 endpoint: %v", err) - return fallbackError{err: err} - } - p.session, err = registry.NewSession(client, p.config.AuthConfig, v1Endpoint) - if err != nil { - // TODO(dmcgowan): Check if should fallback - return fallbackError{err: err} - } - if err := p.pushRepository(ctx); err != nil { - // TODO(dmcgowan): Check if should fallback - return err - } - return nil -} - -// v1Image exposes the configuration, filesystem layer ID, and a v1 ID for an -// image being pushed to a v1 registry. -type v1Image interface { - Config() []byte - Layer() layer.Layer - V1ID() string -} - -type v1ImageCommon struct { - layer layer.Layer - config []byte - v1ID string -} - -func (common *v1ImageCommon) Config() []byte { - return common.config -} - -func (common *v1ImageCommon) V1ID() string { - return common.v1ID -} - -func (common *v1ImageCommon) Layer() layer.Layer { - return common.layer -} - -// v1TopImage defines a runnable (top layer) image being pushed to a v1 -// registry. -type v1TopImage struct { - v1ImageCommon - imageID image.ID -} - -func newV1TopImage(imageID image.ID, img *image.Image, l layer.Layer, parent *v1DependencyImage) (*v1TopImage, error) { - v1ID := imageID.Digest().Hex() - parentV1ID := "" - if parent != nil { - parentV1ID = parent.V1ID() - } - - config, err := v1.MakeV1ConfigFromConfig(img, v1ID, parentV1ID, false) - if err != nil { - return nil, err - } - - return &v1TopImage{ - v1ImageCommon: v1ImageCommon{ - v1ID: v1ID, - config: config, - layer: l, - }, - imageID: imageID, - }, nil -} - -// v1DependencyImage defines a dependency layer being pushed to a v1 registry. -type v1DependencyImage struct { - v1ImageCommon -} - -func newV1DependencyImage(l layer.Layer, parent *v1DependencyImage) (*v1DependencyImage, error) { - v1ID := digest.Digest(l.ChainID()).Hex() - - config := "" - if parent != nil { - config = fmt.Sprintf(`{"id":"%s","parent":"%s"}`, v1ID, parent.V1ID()) - } else { - config = fmt.Sprintf(`{"id":"%s"}`, v1ID) - } - return &v1DependencyImage{ - v1ImageCommon: v1ImageCommon{ - v1ID: v1ID, - config: []byte(config), - layer: l, - }, - }, nil -} - -// Retrieve the all the images to be uploaded in the correct order -func (p *v1Pusher) getImageList() (imageList []v1Image, tagsByImage map[image.ID][]string, referencedLayers []PushLayer, err error) { - tagsByImage = make(map[image.ID][]string) - - // Ignore digest references - if _, isCanonical := p.ref.(reference.Canonical); isCanonical { - return - } - - tagged, isTagged := p.ref.(reference.NamedTagged) - if isTagged { - // Push a specific tag - var imgID image.ID - var dgst digest.Digest - dgst, err = p.config.ReferenceStore.Get(p.ref) - if err != nil { - return - } - imgID = image.IDFromDigest(dgst) - - imageList, err = p.imageListForTag(imgID, nil, &referencedLayers) - if err != nil { - return - } - - tagsByImage[imgID] = []string{tagged.Tag()} - - return - } - - imagesSeen := make(map[digest.Digest]struct{}) - dependenciesSeen := make(map[layer.ChainID]*v1DependencyImage) - - associations := p.config.ReferenceStore.ReferencesByName(p.ref) - for _, association := range associations { - if tagged, isTagged = association.Ref.(reference.NamedTagged); !isTagged { - // Ignore digest references. - continue - } - - imgID := image.IDFromDigest(association.ID) - tagsByImage[imgID] = append(tagsByImage[imgID], tagged.Tag()) - - if _, present := imagesSeen[association.ID]; present { - // Skip generating image list for already-seen image - continue - } - imagesSeen[association.ID] = struct{}{} - - imageListForThisTag, err := p.imageListForTag(imgID, dependenciesSeen, &referencedLayers) - if err != nil { - return nil, nil, nil, err - } - - // append to main image list - imageList = append(imageList, imageListForThisTag...) - } - if len(imageList) == 0 { - return nil, nil, nil, fmt.Errorf("No images found for the requested repository / tag") - } - logrus.Debugf("Image list: %v", imageList) - logrus.Debugf("Tags by image: %v", tagsByImage) - - return -} - -func (p *v1Pusher) imageListForTag(imgID image.ID, dependenciesSeen map[layer.ChainID]*v1DependencyImage, referencedLayers *[]PushLayer) (imageListForThisTag []v1Image, err error) { - ics, ok := p.config.ImageStore.(*imageConfigStore) - if !ok { - return nil, fmt.Errorf("only image store images supported for v1 push") - } - img, err := ics.Store.Get(imgID) - if err != nil { - return nil, err - } - - topLayerID := img.RootFS.ChainID() - - pl, err := p.config.LayerStore.Get(topLayerID) - *referencedLayers = append(*referencedLayers, pl) - if err != nil { - return nil, fmt.Errorf("failed to get top layer from image: %v", err) - } - - // V1 push is deprecated, only support existing layerstore layers - lsl, ok := pl.(*storeLayer) - if !ok { - return nil, fmt.Errorf("only layer store layers supported for v1 push") - } - l := lsl.Layer - - dependencyImages, parent, err := generateDependencyImages(l.Parent(), dependenciesSeen) - if err != nil { - return nil, err - } - - topImage, err := newV1TopImage(imgID, img, l, parent) - if err != nil { - return nil, err - } - - imageListForThisTag = append(dependencyImages, topImage) - - return -} - -func generateDependencyImages(l layer.Layer, dependenciesSeen map[layer.ChainID]*v1DependencyImage) (imageListForThisTag []v1Image, parent *v1DependencyImage, err error) { - if l == nil { - return nil, nil, nil - } - - imageListForThisTag, parent, err = generateDependencyImages(l.Parent(), dependenciesSeen) - - if dependenciesSeen != nil { - if dependencyImage, present := dependenciesSeen[l.ChainID()]; present { - // This layer is already on the list, we can ignore it - // and all its parents. - return imageListForThisTag, dependencyImage, nil - } - } - - dependencyImage, err := newV1DependencyImage(l, parent) - if err != nil { - return nil, nil, err - } - imageListForThisTag = append(imageListForThisTag, dependencyImage) - - if dependenciesSeen != nil { - dependenciesSeen[l.ChainID()] = dependencyImage - } - - return imageListForThisTag, dependencyImage, nil -} - -// createImageIndex returns an index of an image's layer IDs and tags. -func createImageIndex(images []v1Image, tags map[image.ID][]string) []*registry.ImgData { - var imageIndex []*registry.ImgData - for _, img := range images { - v1ID := img.V1ID() - - if topImage, isTopImage := img.(*v1TopImage); isTopImage { - if tags, hasTags := tags[topImage.imageID]; hasTags { - // If an image has tags you must add an entry in the image index - // for each tag - for _, tag := range tags { - imageIndex = append(imageIndex, ®istry.ImgData{ - ID: v1ID, - Tag: tag, - }) - } - continue - } - } - - // If the image does not have a tag it still needs to be sent to the - // registry with an empty tag so that it is associated with the repository - imageIndex = append(imageIndex, ®istry.ImgData{ - ID: v1ID, - Tag: "", - }) - } - return imageIndex -} - -// lookupImageOnEndpoint checks the specified endpoint to see if an image exists -// and if it is absent then it sends the image id to the channel to be pushed. -func (p *v1Pusher) lookupImageOnEndpoint(wg *sync.WaitGroup, endpoint string, images chan v1Image, imagesToPush chan string) { - defer wg.Done() - for image := range images { - v1ID := image.V1ID() - truncID := stringid.TruncateID(image.Layer().DiffID().String()) - if err := p.session.LookupRemoteImage(v1ID, endpoint); err != nil { - logrus.Errorf("Error in LookupRemoteImage: %s", err) - imagesToPush <- v1ID - progress.Update(p.config.ProgressOutput, truncID, "Waiting") - } else { - progress.Update(p.config.ProgressOutput, truncID, "Already exists") - } - } -} - -func (p *v1Pusher) pushImageToEndpoint(ctx context.Context, endpoint string, imageList []v1Image, tags map[image.ID][]string, repo *registry.RepositoryData) error { - workerCount := len(imageList) - // start a maximum of 5 workers to check if images exist on the specified endpoint. - if workerCount > 5 { - workerCount = 5 - } - var ( - wg = &sync.WaitGroup{} - imageData = make(chan v1Image, workerCount*2) - imagesToPush = make(chan string, workerCount*2) - pushes = make(chan map[string]struct{}, 1) - ) - for i := 0; i < workerCount; i++ { - wg.Add(1) - go p.lookupImageOnEndpoint(wg, endpoint, imageData, imagesToPush) - } - // start a go routine that consumes the images to push - go func() { - shouldPush := make(map[string]struct{}) - for id := range imagesToPush { - shouldPush[id] = struct{}{} - } - pushes <- shouldPush - }() - for _, v1Image := range imageList { - imageData <- v1Image - } - // close the channel to notify the workers that there will be no more images to check. - close(imageData) - wg.Wait() - close(imagesToPush) - // wait for all the images that require pushes to be collected into a consumable map. - shouldPush := <-pushes - // finish by pushing any images and tags to the endpoint. The order that the images are pushed - // is very important that is why we are still iterating over the ordered list of imageIDs. - for _, img := range imageList { - v1ID := img.V1ID() - if _, push := shouldPush[v1ID]; push { - if _, err := p.pushImage(ctx, img, endpoint); err != nil { - // FIXME: Continue on error? - return err - } - } - if topImage, isTopImage := img.(*v1TopImage); isTopImage { - for _, tag := range tags[topImage.imageID] { - progress.Messagef(p.config.ProgressOutput, "", "Pushing tag for rev [%s] on {%s}", stringid.TruncateID(v1ID), endpoint+"repositories/"+p.repoInfo.RemoteName()+"/tags/"+tag) - if err := p.session.PushRegistryTag(p.repoInfo, v1ID, tag, endpoint); err != nil { - return err - } - } - } - } - return nil -} - -// pushRepository pushes layers that do not already exist on the registry. -func (p *v1Pusher) pushRepository(ctx context.Context) error { - imgList, tags, referencedLayers, err := p.getImageList() - defer func() { - for _, l := range referencedLayers { - l.Release() - } - }() - if err != nil { - return err - } - - imageIndex := createImageIndex(imgList, tags) - for _, data := range imageIndex { - logrus.Debugf("Pushing ID: %s with Tag: %s", data.ID, data.Tag) - } - - // Register all the images in a repository with the registry - // If an image is not in this list it will not be associated with the repository - repoData, err := p.session.PushImageJSONIndex(p.repoInfo, imageIndex, false, nil) - if err != nil { - return err - } - // push the repository to each of the endpoints only if it does not exist. - for _, endpoint := range repoData.Endpoints { - if err := p.pushImageToEndpoint(ctx, endpoint, imgList, tags, repoData); err != nil { - return err - } - } - _, err = p.session.PushImageJSONIndex(p.repoInfo, imageIndex, true, repoData.Endpoints) - return err -} - -func (p *v1Pusher) pushImage(ctx context.Context, v1Image v1Image, ep string) (checksum string, err error) { - l := v1Image.Layer() - v1ID := v1Image.V1ID() - truncID := stringid.TruncateID(l.DiffID().String()) - - jsonRaw := v1Image.Config() - progress.Update(p.config.ProgressOutput, truncID, "Pushing") - - // General rule is to use ID for graph accesses and compatibilityID for - // calls to session.registry() - imgData := ®istry.ImgData{ - ID: v1ID, - } - - // Send the json - if err := p.session.PushImageJSONRegistry(imgData, jsonRaw, ep); err != nil { - if err == registry.ErrAlreadyExists { - progress.Update(p.config.ProgressOutput, truncID, "Image already pushed, skipping") - return "", nil - } - return "", err - } - - arch, err := l.TarStream() - if err != nil { - return "", err - } - defer arch.Close() - - // don't care if this fails; best effort - size, _ := l.DiffSize() - - // Send the layer - logrus.Debugf("rendered layer for %s of [%d] size", v1ID, size) - - reader := progress.NewProgressReader(ioutils.NewCancelReadCloser(ctx, arch), p.config.ProgressOutput, size, truncID, "Pushing") - defer reader.Close() - - checksum, checksumPayload, err := p.session.PushImageLayerRegistry(v1ID, reader, ep, jsonRaw) - if err != nil { - return "", err - } - imgData.Checksum = checksum - imgData.ChecksumPayload = checksumPayload - // Send the checksum - if err := p.session.PushImageChecksumRegistry(imgData, ep); err != nil { - return "", err - } - - if err := p.v1IDService.Set(v1ID, p.repoInfo.Index.Name, l.DiffID()); err != nil { - logrus.Warnf("Could not set v1 ID mapping: %v", err) - } - - progress.Update(p.config.ProgressOutput, truncID, "Image successfully pushed") - return imgData.Checksum, nil -} diff --git a/vendor/github.com/docker/docker/distribution/push_v2.go b/vendor/github.com/docker/docker/distribution/push_v2.go deleted file mode 100644 index 1f8c822fe..000000000 --- a/vendor/github.com/docker/docker/distribution/push_v2.go +++ /dev/null @@ -1,697 +0,0 @@ -package distribution - -import ( - "errors" - "fmt" - "io" - "runtime" - "sort" - "strings" - "sync" - - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/manifest/schema2" - distreference "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/client" - "github.com/docker/docker/distribution/metadata" - "github.com/docker/docker/distribution/xfer" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" -) - -const ( - smallLayerMaximumSize = 100 * (1 << 10) // 100KB - middleLayerMaximumSize = 10 * (1 << 20) // 10MB -) - -// PushResult contains the tag, manifest digest, and manifest size from the -// push. It's used to signal this information to the trust code in the client -// so it can sign the manifest if necessary. -type PushResult struct { - Tag string - Digest digest.Digest - Size int -} - -type v2Pusher struct { - v2MetadataService metadata.V2MetadataService - ref reference.Named - endpoint registry.APIEndpoint - repoInfo *registry.RepositoryInfo - config *ImagePushConfig - repo distribution.Repository - - // pushState is state built by the Upload functions. - pushState pushState -} - -type pushState struct { - sync.Mutex - // remoteLayers is the set of layers known to exist on the remote side. - // This avoids redundant queries when pushing multiple tags that - // involve the same layers. It is also used to fill in digest and size - // information when building the manifest. - remoteLayers map[layer.DiffID]distribution.Descriptor - // confirmedV2 is set to true if we confirm we're talking to a v2 - // registry. This is used to limit fallbacks to the v1 protocol. - confirmedV2 bool -} - -func (p *v2Pusher) Push(ctx context.Context) (err error) { - p.pushState.remoteLayers = make(map[layer.DiffID]distribution.Descriptor) - - p.repo, p.pushState.confirmedV2, err = NewV2Repository(ctx, p.repoInfo, p.endpoint, p.config.MetaHeaders, p.config.AuthConfig, "push", "pull") - if err != nil { - logrus.Debugf("Error getting v2 registry: %v", err) - return err - } - - if err = p.pushV2Repository(ctx); err != nil { - if continueOnError(err) { - return fallbackError{ - err: err, - confirmedV2: p.pushState.confirmedV2, - transportOK: true, - } - } - } - return err -} - -func (p *v2Pusher) pushV2Repository(ctx context.Context) (err error) { - if namedTagged, isNamedTagged := p.ref.(reference.NamedTagged); isNamedTagged { - imageID, err := p.config.ReferenceStore.Get(p.ref) - if err != nil { - return fmt.Errorf("tag does not exist: %s", p.ref.String()) - } - - return p.pushV2Tag(ctx, namedTagged, imageID) - } - - if !reference.IsNameOnly(p.ref) { - return errors.New("cannot push a digest reference") - } - - // Pull all tags - pushed := 0 - for _, association := range p.config.ReferenceStore.ReferencesByName(p.ref) { - if namedTagged, isNamedTagged := association.Ref.(reference.NamedTagged); isNamedTagged { - pushed++ - if err := p.pushV2Tag(ctx, namedTagged, association.ID); err != nil { - return err - } - } - } - - if pushed == 0 { - return fmt.Errorf("no tags to push for %s", p.repoInfo.Name()) - } - - return nil -} - -func (p *v2Pusher) pushV2Tag(ctx context.Context, ref reference.NamedTagged, id digest.Digest) error { - logrus.Debugf("Pushing repository: %s", ref.String()) - - imgConfig, err := p.config.ImageStore.Get(id) - if err != nil { - return fmt.Errorf("could not find image from tag %s: %v", ref.String(), err) - } - - rootfs, err := p.config.ImageStore.RootFSFromConfig(imgConfig) - if err != nil { - return fmt.Errorf("unable to get rootfs for image %s: %s", ref.String(), err) - } - - l, err := p.config.LayerStore.Get(rootfs.ChainID()) - if err != nil { - return fmt.Errorf("failed to get top layer from image: %v", err) - } - defer l.Release() - - hmacKey, err := metadata.ComputeV2MetadataHMACKey(p.config.AuthConfig) - if err != nil { - return fmt.Errorf("failed to compute hmac key of auth config: %v", err) - } - - var descriptors []xfer.UploadDescriptor - - descriptorTemplate := v2PushDescriptor{ - v2MetadataService: p.v2MetadataService, - hmacKey: hmacKey, - repoInfo: p.repoInfo, - ref: p.ref, - repo: p.repo, - pushState: &p.pushState, - } - - // Loop bounds condition is to avoid pushing the base layer on Windows. - for i := 0; i < len(rootfs.DiffIDs); i++ { - descriptor := descriptorTemplate - descriptor.layer = l - descriptor.checkedDigests = make(map[digest.Digest]struct{}) - descriptors = append(descriptors, &descriptor) - - l = l.Parent() - } - - if err := p.config.UploadManager.Upload(ctx, descriptors, p.config.ProgressOutput); err != nil { - return err - } - - // Try schema2 first - builder := schema2.NewManifestBuilder(p.repo.Blobs(ctx), p.config.ConfigMediaType, imgConfig) - manifest, err := manifestFromBuilder(ctx, builder, descriptors) - if err != nil { - return err - } - - manSvc, err := p.repo.Manifests(ctx) - if err != nil { - return err - } - - putOptions := []distribution.ManifestServiceOption{distribution.WithTag(ref.Tag())} - if _, err = manSvc.Put(ctx, manifest, putOptions...); err != nil { - if runtime.GOOS == "windows" || p.config.TrustKey == nil || p.config.RequireSchema2 { - logrus.Warnf("failed to upload schema2 manifest: %v", err) - return err - } - - logrus.Warnf("failed to upload schema2 manifest: %v - falling back to schema1", err) - - manifestRef, err := distreference.WithTag(p.repo.Named(), ref.Tag()) - if err != nil { - return err - } - builder = schema1.NewConfigManifestBuilder(p.repo.Blobs(ctx), p.config.TrustKey, manifestRef, imgConfig) - manifest, err = manifestFromBuilder(ctx, builder, descriptors) - if err != nil { - return err - } - - if _, err = manSvc.Put(ctx, manifest, putOptions...); err != nil { - return err - } - } - - var canonicalManifest []byte - - switch v := manifest.(type) { - case *schema1.SignedManifest: - canonicalManifest = v.Canonical - case *schema2.DeserializedManifest: - _, canonicalManifest, err = v.Payload() - if err != nil { - return err - } - } - - manifestDigest := digest.FromBytes(canonicalManifest) - progress.Messagef(p.config.ProgressOutput, "", "%s: digest: %s size: %d", ref.Tag(), manifestDigest, len(canonicalManifest)) - - if err := addDigestReference(p.config.ReferenceStore, ref, manifestDigest, id); err != nil { - return err - } - - // Signal digest to the trust client so it can sign the - // push, if appropriate. - progress.Aux(p.config.ProgressOutput, PushResult{Tag: ref.Tag(), Digest: manifestDigest, Size: len(canonicalManifest)}) - - return nil -} - -func manifestFromBuilder(ctx context.Context, builder distribution.ManifestBuilder, descriptors []xfer.UploadDescriptor) (distribution.Manifest, error) { - // descriptors is in reverse order; iterate backwards to get references - // appended in the right order. - for i := len(descriptors) - 1; i >= 0; i-- { - if err := builder.AppendReference(descriptors[i].(*v2PushDescriptor)); err != nil { - return nil, err - } - } - - return builder.Build(ctx) -} - -type v2PushDescriptor struct { - layer PushLayer - v2MetadataService metadata.V2MetadataService - hmacKey []byte - repoInfo reference.Named - ref reference.Named - repo distribution.Repository - pushState *pushState - remoteDescriptor distribution.Descriptor - // a set of digests whose presence has been checked in a target repository - checkedDigests map[digest.Digest]struct{} -} - -func (pd *v2PushDescriptor) Key() string { - return "v2push:" + pd.ref.FullName() + " " + pd.layer.DiffID().String() -} - -func (pd *v2PushDescriptor) ID() string { - return stringid.TruncateID(pd.layer.DiffID().String()) -} - -func (pd *v2PushDescriptor) DiffID() layer.DiffID { - return pd.layer.DiffID() -} - -func (pd *v2PushDescriptor) Upload(ctx context.Context, progressOutput progress.Output) (distribution.Descriptor, error) { - if fs, ok := pd.layer.(distribution.Describable); ok { - if d := fs.Descriptor(); len(d.URLs) > 0 { - progress.Update(progressOutput, pd.ID(), "Skipped foreign layer") - return d, nil - } - } - - diffID := pd.DiffID() - - pd.pushState.Lock() - if descriptor, ok := pd.pushState.remoteLayers[diffID]; ok { - // it is already known that the push is not needed and - // therefore doing a stat is unnecessary - pd.pushState.Unlock() - progress.Update(progressOutput, pd.ID(), "Layer already exists") - return descriptor, nil - } - pd.pushState.Unlock() - - maxMountAttempts, maxExistenceChecks, checkOtherRepositories := getMaxMountAndExistenceCheckAttempts(pd.layer) - - // Do we have any metadata associated with this layer's DiffID? - v2Metadata, err := pd.v2MetadataService.GetMetadata(diffID) - if err == nil { - // check for blob existence in the target repository if we have a mapping with it - descriptor, exists, err := pd.layerAlreadyExists(ctx, progressOutput, diffID, false, 1, v2Metadata) - if exists || err != nil { - return descriptor, err - } - } - - // if digest was empty or not saved, or if blob does not exist on the remote repository, - // then push the blob. - bs := pd.repo.Blobs(ctx) - - var layerUpload distribution.BlobWriter - - // Attempt to find another repository in the same registry to mount the layer from to avoid an unnecessary upload - candidates := getRepositoryMountCandidates(pd.repoInfo, pd.hmacKey, maxMountAttempts, v2Metadata) - for _, mountCandidate := range candidates { - logrus.Debugf("attempting to mount layer %s (%s) from %s", diffID, mountCandidate.Digest, mountCandidate.SourceRepository) - createOpts := []distribution.BlobCreateOption{} - - if len(mountCandidate.SourceRepository) > 0 { - namedRef, err := reference.WithName(mountCandidate.SourceRepository) - if err != nil { - logrus.Errorf("failed to parse source repository reference %v: %v", namedRef.String(), err) - pd.v2MetadataService.Remove(mountCandidate) - continue - } - - // TODO (brianbland): We need to construct a reference where the Name is - // only the full remote name, so clean this up when distribution has a - // richer reference package - remoteRef, err := distreference.WithName(namedRef.RemoteName()) - if err != nil { - logrus.Errorf("failed to make remote reference out of %q: %v", namedRef.RemoteName(), namedRef.RemoteName()) - continue - } - - canonicalRef, err := distreference.WithDigest(distreference.TrimNamed(remoteRef), mountCandidate.Digest) - if err != nil { - logrus.Errorf("failed to make canonical reference: %v", err) - continue - } - - createOpts = append(createOpts, client.WithMountFrom(canonicalRef)) - } - - // send the layer - lu, err := bs.Create(ctx, createOpts...) - switch err := err.(type) { - case nil: - // noop - case distribution.ErrBlobMounted: - progress.Updatef(progressOutput, pd.ID(), "Mounted from %s", err.From.Name()) - - err.Descriptor.MediaType = schema2.MediaTypeLayer - - pd.pushState.Lock() - pd.pushState.confirmedV2 = true - pd.pushState.remoteLayers[diffID] = err.Descriptor - pd.pushState.Unlock() - - // Cache mapping from this layer's DiffID to the blobsum - if err := pd.v2MetadataService.TagAndAdd(diffID, pd.hmacKey, metadata.V2Metadata{ - Digest: err.Descriptor.Digest, - SourceRepository: pd.repoInfo.FullName(), - }); err != nil { - return distribution.Descriptor{}, xfer.DoNotRetry{Err: err} - } - return err.Descriptor, nil - default: - logrus.Infof("failed to mount layer %s (%s) from %s: %v", diffID, mountCandidate.Digest, mountCandidate.SourceRepository, err) - } - - if len(mountCandidate.SourceRepository) > 0 && - (metadata.CheckV2MetadataHMAC(&mountCandidate, pd.hmacKey) || - len(mountCandidate.HMAC) == 0) { - cause := "blob mount failure" - if err != nil { - cause = fmt.Sprintf("an error: %v", err.Error()) - } - logrus.Debugf("removing association between layer %s and %s due to %s", mountCandidate.Digest, mountCandidate.SourceRepository, cause) - pd.v2MetadataService.Remove(mountCandidate) - } - - if lu != nil { - // cancel previous upload - cancelLayerUpload(ctx, mountCandidate.Digest, layerUpload) - layerUpload = lu - } - } - - if maxExistenceChecks-len(pd.checkedDigests) > 0 { - // do additional layer existence checks with other known digests if any - descriptor, exists, err := pd.layerAlreadyExists(ctx, progressOutput, diffID, checkOtherRepositories, maxExistenceChecks-len(pd.checkedDigests), v2Metadata) - if exists || err != nil { - return descriptor, err - } - } - - logrus.Debugf("Pushing layer: %s", diffID) - if layerUpload == nil { - layerUpload, err = bs.Create(ctx) - if err != nil { - return distribution.Descriptor{}, retryOnError(err) - } - } - defer layerUpload.Close() - - // upload the blob - desc, err := pd.uploadUsingSession(ctx, progressOutput, diffID, layerUpload) - if err != nil { - return desc, err - } - - return desc, nil -} - -func (pd *v2PushDescriptor) SetRemoteDescriptor(descriptor distribution.Descriptor) { - pd.remoteDescriptor = descriptor -} - -func (pd *v2PushDescriptor) Descriptor() distribution.Descriptor { - return pd.remoteDescriptor -} - -func (pd *v2PushDescriptor) uploadUsingSession( - ctx context.Context, - progressOutput progress.Output, - diffID layer.DiffID, - layerUpload distribution.BlobWriter, -) (distribution.Descriptor, error) { - var reader io.ReadCloser - - contentReader, err := pd.layer.Open() - size, _ := pd.layer.Size() - - reader = progress.NewProgressReader(ioutils.NewCancelReadCloser(ctx, contentReader), progressOutput, size, pd.ID(), "Pushing") - - switch m := pd.layer.MediaType(); m { - case schema2.MediaTypeUncompressedLayer: - compressedReader, compressionDone := compress(reader) - defer func(closer io.Closer) { - closer.Close() - <-compressionDone - }(reader) - reader = compressedReader - case schema2.MediaTypeLayer: - default: - reader.Close() - return distribution.Descriptor{}, fmt.Errorf("unsupported layer media type %s", m) - } - - digester := digest.Canonical.New() - tee := io.TeeReader(reader, digester.Hash()) - - nn, err := layerUpload.ReadFrom(tee) - reader.Close() - if err != nil { - return distribution.Descriptor{}, retryOnError(err) - } - - pushDigest := digester.Digest() - if _, err := layerUpload.Commit(ctx, distribution.Descriptor{Digest: pushDigest}); err != nil { - return distribution.Descriptor{}, retryOnError(err) - } - - logrus.Debugf("uploaded layer %s (%s), %d bytes", diffID, pushDigest, nn) - progress.Update(progressOutput, pd.ID(), "Pushed") - - // Cache mapping from this layer's DiffID to the blobsum - if err := pd.v2MetadataService.TagAndAdd(diffID, pd.hmacKey, metadata.V2Metadata{ - Digest: pushDigest, - SourceRepository: pd.repoInfo.FullName(), - }); err != nil { - return distribution.Descriptor{}, xfer.DoNotRetry{Err: err} - } - - desc := distribution.Descriptor{ - Digest: pushDigest, - MediaType: schema2.MediaTypeLayer, - Size: nn, - } - - pd.pushState.Lock() - // If Commit succeeded, that's an indication that the remote registry speaks the v2 protocol. - pd.pushState.confirmedV2 = true - pd.pushState.remoteLayers[diffID] = desc - pd.pushState.Unlock() - - return desc, nil -} - -// layerAlreadyExists checks if the registry already knows about any of the metadata passed in the "metadata" -// slice. If it finds one that the registry knows about, it returns the known digest and "true". If -// "checkOtherRepositories" is true, stat will be performed also with digests mapped to any other repository -// (not just the target one). -func (pd *v2PushDescriptor) layerAlreadyExists( - ctx context.Context, - progressOutput progress.Output, - diffID layer.DiffID, - checkOtherRepositories bool, - maxExistenceCheckAttempts int, - v2Metadata []metadata.V2Metadata, -) (desc distribution.Descriptor, exists bool, err error) { - // filter the metadata - candidates := []metadata.V2Metadata{} - for _, meta := range v2Metadata { - if len(meta.SourceRepository) > 0 && !checkOtherRepositories && meta.SourceRepository != pd.repoInfo.FullName() { - continue - } - candidates = append(candidates, meta) - } - // sort the candidates by similarity - sortV2MetadataByLikenessAndAge(pd.repoInfo, pd.hmacKey, candidates) - - digestToMetadata := make(map[digest.Digest]*metadata.V2Metadata) - // an array of unique blob digests ordered from the best mount candidates to worst - layerDigests := []digest.Digest{} - for i := 0; i < len(candidates); i++ { - if len(layerDigests) >= maxExistenceCheckAttempts { - break - } - meta := &candidates[i] - if _, exists := digestToMetadata[meta.Digest]; exists { - // keep reference just to the first mapping (the best mount candidate) - continue - } - if _, exists := pd.checkedDigests[meta.Digest]; exists { - // existence of this digest has already been tested - continue - } - digestToMetadata[meta.Digest] = meta - layerDigests = append(layerDigests, meta.Digest) - } - -attempts: - for _, dgst := range layerDigests { - meta := digestToMetadata[dgst] - logrus.Debugf("Checking for presence of layer %s (%s) in %s", diffID, dgst, pd.repoInfo.FullName()) - desc, err = pd.repo.Blobs(ctx).Stat(ctx, dgst) - pd.checkedDigests[meta.Digest] = struct{}{} - switch err { - case nil: - if m, ok := digestToMetadata[desc.Digest]; !ok || m.SourceRepository != pd.repoInfo.FullName() || !metadata.CheckV2MetadataHMAC(m, pd.hmacKey) { - // cache mapping from this layer's DiffID to the blobsum - if err := pd.v2MetadataService.TagAndAdd(diffID, pd.hmacKey, metadata.V2Metadata{ - Digest: desc.Digest, - SourceRepository: pd.repoInfo.FullName(), - }); err != nil { - return distribution.Descriptor{}, false, xfer.DoNotRetry{Err: err} - } - } - desc.MediaType = schema2.MediaTypeLayer - exists = true - break attempts - case distribution.ErrBlobUnknown: - if meta.SourceRepository == pd.repoInfo.FullName() { - // remove the mapping to the target repository - pd.v2MetadataService.Remove(*meta) - } - default: - logrus.WithError(err).Debugf("Failed to check for presence of layer %s (%s) in %s", diffID, dgst, pd.repoInfo.FullName()) - } - } - - if exists { - progress.Update(progressOutput, pd.ID(), "Layer already exists") - pd.pushState.Lock() - pd.pushState.remoteLayers[diffID] = desc - pd.pushState.Unlock() - } - - return desc, exists, nil -} - -// getMaxMountAndExistenceCheckAttempts returns a maximum number of cross repository mount attempts from -// source repositories of target registry, maximum number of layer existence checks performed on the target -// repository and whether the check shall be done also with digests mapped to different repositories. The -// decision is based on layer size. The smaller the layer, the fewer attempts shall be made because the cost -// of upload does not outweigh a latency. -func getMaxMountAndExistenceCheckAttempts(layer PushLayer) (maxMountAttempts, maxExistenceCheckAttempts int, checkOtherRepositories bool) { - size, err := layer.Size() - switch { - // big blob - case size > middleLayerMaximumSize: - // 1st attempt to mount the blob few times - // 2nd few existence checks with digests associated to any repository - // then fallback to upload - return 4, 3, true - - // middle sized blobs; if we could not get the size, assume we deal with middle sized blob - case size > smallLayerMaximumSize, err != nil: - // 1st attempt to mount blobs of average size few times - // 2nd try at most 1 existence check if there's an existing mapping to the target repository - // then fallback to upload - return 3, 1, false - - // small blobs, do a minimum number of checks - default: - return 1, 1, false - } -} - -// getRepositoryMountCandidates returns an array of v2 metadata items belonging to the given registry. The -// array is sorted from youngest to oldest. If requireReigstryMatch is true, the resulting array will contain -// only metadata entries having registry part of SourceRepository matching the part of repoInfo. -func getRepositoryMountCandidates( - repoInfo reference.Named, - hmacKey []byte, - max int, - v2Metadata []metadata.V2Metadata, -) []metadata.V2Metadata { - candidates := []metadata.V2Metadata{} - for _, meta := range v2Metadata { - sourceRepo, err := reference.ParseNamed(meta.SourceRepository) - if err != nil || repoInfo.Hostname() != sourceRepo.Hostname() { - continue - } - // target repository is not a viable candidate - if meta.SourceRepository == repoInfo.FullName() { - continue - } - candidates = append(candidates, meta) - } - - sortV2MetadataByLikenessAndAge(repoInfo, hmacKey, candidates) - if max >= 0 && len(candidates) > max { - // select the youngest metadata - candidates = candidates[:max] - } - - return candidates -} - -// byLikeness is a sorting container for v2 metadata candidates for cross repository mount. The -// candidate "a" is preferred over "b": -// -// 1. if it was hashed using the same AuthConfig as the one used to authenticate to target repository and the -// "b" was not -// 2. if a number of its repository path components exactly matching path components of target repository is higher -type byLikeness struct { - arr []metadata.V2Metadata - hmacKey []byte - pathComponents []string -} - -func (bla byLikeness) Less(i, j int) bool { - aMacMatch := metadata.CheckV2MetadataHMAC(&bla.arr[i], bla.hmacKey) - bMacMatch := metadata.CheckV2MetadataHMAC(&bla.arr[j], bla.hmacKey) - if aMacMatch != bMacMatch { - return aMacMatch - } - aMatch := numOfMatchingPathComponents(bla.arr[i].SourceRepository, bla.pathComponents) - bMatch := numOfMatchingPathComponents(bla.arr[j].SourceRepository, bla.pathComponents) - return aMatch > bMatch -} -func (bla byLikeness) Swap(i, j int) { - bla.arr[i], bla.arr[j] = bla.arr[j], bla.arr[i] -} -func (bla byLikeness) Len() int { return len(bla.arr) } - -func sortV2MetadataByLikenessAndAge(repoInfo reference.Named, hmacKey []byte, marr []metadata.V2Metadata) { - // reverse the metadata array to shift the newest entries to the beginning - for i := 0; i < len(marr)/2; i++ { - marr[i], marr[len(marr)-i-1] = marr[len(marr)-i-1], marr[i] - } - // keep equal entries ordered from the youngest to the oldest - sort.Stable(byLikeness{ - arr: marr, - hmacKey: hmacKey, - pathComponents: getPathComponents(repoInfo.FullName()), - }) -} - -// numOfMatchingPathComponents returns a number of path components in "pth" that exactly match "matchComponents". -func numOfMatchingPathComponents(pth string, matchComponents []string) int { - pthComponents := getPathComponents(pth) - i := 0 - for ; i < len(pthComponents) && i < len(matchComponents); i++ { - if matchComponents[i] != pthComponents[i] { - return i - } - } - return i -} - -func getPathComponents(path string) []string { - // make sure to add docker.io/ prefix to the path - named, err := reference.ParseNamed(path) - if err == nil { - path = named.FullName() - } - return strings.Split(path, "/") -} - -func cancelLayerUpload(ctx context.Context, dgst digest.Digest, layerUpload distribution.BlobWriter) { - if layerUpload != nil { - logrus.Debugf("cancelling upload of blob %s", dgst) - err := layerUpload.Cancel(ctx) - if err != nil { - logrus.Warnf("failed to cancel upload: %v", err) - } - } -} diff --git a/vendor/github.com/docker/docker/distribution/push_v2_test.go b/vendor/github.com/docker/docker/distribution/push_v2_test.go deleted file mode 100644 index 6a5216b1d..000000000 --- a/vendor/github.com/docker/docker/distribution/push_v2_test.go +++ /dev/null @@ -1,579 +0,0 @@ -package distribution - -import ( - "net/http" - "reflect" - "testing" - - "github.com/docker/distribution" - "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/schema2" - distreference "github.com/docker/distribution/reference" - "github.com/docker/docker/distribution/metadata" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/reference" -) - -func TestGetRepositoryMountCandidates(t *testing.T) { - for _, tc := range []struct { - name string - hmacKey string - targetRepo string - maxCandidates int - metadata []metadata.V2Metadata - candidates []metadata.V2Metadata - }{ - { - name: "empty metadata", - targetRepo: "busybox", - maxCandidates: -1, - metadata: []metadata.V2Metadata{}, - candidates: []metadata.V2Metadata{}, - }, - { - name: "one item not matching", - targetRepo: "busybox", - maxCandidates: -1, - metadata: []metadata.V2Metadata{taggedMetadata("key", "dgst", "127.0.0.1/repo")}, - candidates: []metadata.V2Metadata{}, - }, - { - name: "one item matching", - targetRepo: "busybox", - maxCandidates: -1, - metadata: []metadata.V2Metadata{taggedMetadata("hash", "1", "hello-world")}, - candidates: []metadata.V2Metadata{taggedMetadata("hash", "1", "hello-world")}, - }, - { - name: "allow missing SourceRepository", - targetRepo: "busybox", - maxCandidates: -1, - metadata: []metadata.V2Metadata{ - {Digest: digest.Digest("1")}, - {Digest: digest.Digest("3")}, - {Digest: digest.Digest("2")}, - }, - candidates: []metadata.V2Metadata{}, - }, - { - name: "handle docker.io", - targetRepo: "user/app", - maxCandidates: -1, - metadata: []metadata.V2Metadata{ - {Digest: digest.Digest("1"), SourceRepository: "docker.io/user/foo"}, - {Digest: digest.Digest("3"), SourceRepository: "user/bar"}, - {Digest: digest.Digest("2"), SourceRepository: "app"}, - }, - candidates: []metadata.V2Metadata{ - {Digest: digest.Digest("3"), SourceRepository: "user/bar"}, - {Digest: digest.Digest("1"), SourceRepository: "docker.io/user/foo"}, - {Digest: digest.Digest("2"), SourceRepository: "app"}, - }, - }, - { - name: "sort more items", - hmacKey: "abcd", - targetRepo: "127.0.0.1/foo/bar", - maxCandidates: -1, - metadata: []metadata.V2Metadata{ - taggedMetadata("hash", "1", "hello-world"), - taggedMetadata("efgh", "2", "127.0.0.1/hello-world"), - taggedMetadata("abcd", "3", "busybox"), - taggedMetadata("hash", "4", "busybox"), - taggedMetadata("hash", "5", "127.0.0.1/foo"), - taggedMetadata("hash", "6", "127.0.0.1/bar"), - taggedMetadata("efgh", "7", "127.0.0.1/foo/bar"), - taggedMetadata("abcd", "8", "127.0.0.1/xyz"), - taggedMetadata("hash", "9", "127.0.0.1/foo/app"), - }, - candidates: []metadata.V2Metadata{ - // first by matching hash - taggedMetadata("abcd", "8", "127.0.0.1/xyz"), - // then by longest matching prefix - taggedMetadata("hash", "9", "127.0.0.1/foo/app"), - taggedMetadata("hash", "5", "127.0.0.1/foo"), - // sort the rest of the matching items in reversed order - taggedMetadata("hash", "6", "127.0.0.1/bar"), - taggedMetadata("efgh", "2", "127.0.0.1/hello-world"), - }, - }, - { - name: "limit max candidates", - hmacKey: "abcd", - targetRepo: "user/app", - maxCandidates: 3, - metadata: []metadata.V2Metadata{ - taggedMetadata("abcd", "1", "user/app1"), - taggedMetadata("abcd", "2", "user/app/base"), - taggedMetadata("hash", "3", "user/app"), - taggedMetadata("abcd", "4", "127.0.0.1/user/app"), - taggedMetadata("hash", "5", "user/foo"), - taggedMetadata("hash", "6", "app/bar"), - }, - candidates: []metadata.V2Metadata{ - // first by matching hash - taggedMetadata("abcd", "2", "user/app/base"), - taggedMetadata("abcd", "1", "user/app1"), - // then by longest matching prefix - taggedMetadata("hash", "3", "user/app"), - }, - }, - } { - repoInfo, err := reference.ParseNamed(tc.targetRepo) - if err != nil { - t.Fatalf("[%s] failed to parse reference name: %v", tc.name, err) - } - candidates := getRepositoryMountCandidates(repoInfo, []byte(tc.hmacKey), tc.maxCandidates, tc.metadata) - if len(candidates) != len(tc.candidates) { - t.Errorf("[%s] got unexpected number of candidates: %d != %d", tc.name, len(candidates), len(tc.candidates)) - } - for i := 0; i < len(candidates) && i < len(tc.candidates); i++ { - if !reflect.DeepEqual(candidates[i], tc.candidates[i]) { - t.Errorf("[%s] candidate %d does not match expected: %#+v != %#+v", tc.name, i, candidates[i], tc.candidates[i]) - } - } - for i := len(candidates); i < len(tc.candidates); i++ { - t.Errorf("[%s] missing expected candidate at position %d (%#+v)", tc.name, i, tc.candidates[i]) - } - for i := len(tc.candidates); i < len(candidates); i++ { - t.Errorf("[%s] got unexpected candidate at position %d (%#+v)", tc.name, i, candidates[i]) - } - } -} - -func TestLayerAlreadyExists(t *testing.T) { - for _, tc := range []struct { - name string - metadata []metadata.V2Metadata - targetRepo string - hmacKey string - maxExistenceChecks int - checkOtherRepositories bool - remoteBlobs map[digest.Digest]distribution.Descriptor - remoteErrors map[digest.Digest]error - expectedDescriptor distribution.Descriptor - expectedExists bool - expectedError error - expectedRequests []string - expectedAdditions []metadata.V2Metadata - expectedRemovals []metadata.V2Metadata - }{ - { - name: "empty metadata", - targetRepo: "busybox", - maxExistenceChecks: 3, - checkOtherRepositories: true, - }, - { - name: "single not existent metadata", - targetRepo: "busybox", - metadata: []metadata.V2Metadata{{Digest: digest.Digest("pear"), SourceRepository: "docker.io/library/busybox"}}, - maxExistenceChecks: 3, - expectedRequests: []string{"pear"}, - expectedRemovals: []metadata.V2Metadata{{Digest: digest.Digest("pear"), SourceRepository: "docker.io/library/busybox"}}, - }, - { - name: "access denied", - targetRepo: "busybox", - maxExistenceChecks: 1, - metadata: []metadata.V2Metadata{{Digest: digest.Digest("apple"), SourceRepository: "docker.io/library/busybox"}}, - remoteErrors: map[digest.Digest]error{digest.Digest("apple"): distribution.ErrAccessDenied}, - expectedError: nil, - expectedRequests: []string{"apple"}, - }, - { - name: "not matching reposies", - targetRepo: "busybox", - maxExistenceChecks: 3, - metadata: []metadata.V2Metadata{ - {Digest: digest.Digest("apple"), SourceRepository: "docker.io/library/hello-world"}, - {Digest: digest.Digest("orange"), SourceRepository: "docker.io/library/busybox/subapp"}, - {Digest: digest.Digest("pear"), SourceRepository: "docker.io/busybox"}, - {Digest: digest.Digest("plum"), SourceRepository: "busybox"}, - {Digest: digest.Digest("banana"), SourceRepository: "127.0.0.1/busybox"}, - }, - }, - { - name: "check other repositories", - targetRepo: "busybox", - maxExistenceChecks: 10, - checkOtherRepositories: true, - metadata: []metadata.V2Metadata{ - {Digest: digest.Digest("apple"), SourceRepository: "docker.io/library/hello-world"}, - {Digest: digest.Digest("orange"), SourceRepository: "docker.io/library/busybox/subapp"}, - {Digest: digest.Digest("pear"), SourceRepository: "docker.io/busybox"}, - {Digest: digest.Digest("plum"), SourceRepository: "busybox"}, - {Digest: digest.Digest("banana"), SourceRepository: "127.0.0.1/busybox"}, - }, - expectedRequests: []string{"plum", "pear", "apple", "orange", "banana"}, - }, - { - name: "find existing blob", - targetRepo: "busybox", - metadata: []metadata.V2Metadata{{Digest: digest.Digest("apple"), SourceRepository: "docker.io/library/busybox"}}, - maxExistenceChecks: 3, - remoteBlobs: map[digest.Digest]distribution.Descriptor{digest.Digest("apple"): {Digest: digest.Digest("apple")}}, - expectedDescriptor: distribution.Descriptor{Digest: digest.Digest("apple"), MediaType: schema2.MediaTypeLayer}, - expectedExists: true, - expectedRequests: []string{"apple"}, - }, - { - name: "find existing blob with different hmac", - targetRepo: "busybox", - metadata: []metadata.V2Metadata{{SourceRepository: "docker.io/library/busybox", Digest: digest.Digest("apple"), HMAC: "dummyhmac"}}, - maxExistenceChecks: 3, - remoteBlobs: map[digest.Digest]distribution.Descriptor{digest.Digest("apple"): {Digest: digest.Digest("apple")}}, - expectedDescriptor: distribution.Descriptor{Digest: digest.Digest("apple"), MediaType: schema2.MediaTypeLayer}, - expectedExists: true, - expectedRequests: []string{"apple"}, - expectedAdditions: []metadata.V2Metadata{{Digest: digest.Digest("apple"), SourceRepository: "docker.io/library/busybox"}}, - }, - { - name: "overwrite media types", - targetRepo: "busybox", - metadata: []metadata.V2Metadata{{Digest: digest.Digest("apple"), SourceRepository: "docker.io/library/busybox"}}, - hmacKey: "key", - maxExistenceChecks: 3, - remoteBlobs: map[digest.Digest]distribution.Descriptor{digest.Digest("apple"): {Digest: digest.Digest("apple"), MediaType: "custom-media-type"}}, - expectedDescriptor: distribution.Descriptor{Digest: digest.Digest("apple"), MediaType: schema2.MediaTypeLayer}, - expectedExists: true, - expectedRequests: []string{"apple"}, - expectedAdditions: []metadata.V2Metadata{taggedMetadata("key", "apple", "docker.io/library/busybox")}, - }, - { - name: "find existing blob among many", - targetRepo: "127.0.0.1/myapp", - hmacKey: "key", - metadata: []metadata.V2Metadata{ - taggedMetadata("someotherkey", "pear", "127.0.0.1/myapp"), - taggedMetadata("key", "apple", "127.0.0.1/myapp"), - taggedMetadata("", "plum", "127.0.0.1/myapp"), - }, - maxExistenceChecks: 3, - remoteBlobs: map[digest.Digest]distribution.Descriptor{digest.Digest("pear"): {Digest: digest.Digest("pear")}}, - expectedDescriptor: distribution.Descriptor{Digest: digest.Digest("pear"), MediaType: schema2.MediaTypeLayer}, - expectedExists: true, - expectedRequests: []string{"apple", "plum", "pear"}, - expectedAdditions: []metadata.V2Metadata{taggedMetadata("key", "pear", "127.0.0.1/myapp")}, - expectedRemovals: []metadata.V2Metadata{ - taggedMetadata("key", "apple", "127.0.0.1/myapp"), - {Digest: digest.Digest("plum"), SourceRepository: "127.0.0.1/myapp"}, - }, - }, - { - name: "reach maximum existence checks", - targetRepo: "user/app", - metadata: []metadata.V2Metadata{ - {Digest: digest.Digest("pear"), SourceRepository: "docker.io/user/app"}, - {Digest: digest.Digest("apple"), SourceRepository: "docker.io/user/app"}, - {Digest: digest.Digest("plum"), SourceRepository: "docker.io/user/app"}, - {Digest: digest.Digest("banana"), SourceRepository: "docker.io/user/app"}, - }, - maxExistenceChecks: 3, - remoteBlobs: map[digest.Digest]distribution.Descriptor{digest.Digest("pear"): {Digest: digest.Digest("pear")}}, - expectedExists: false, - expectedRequests: []string{"banana", "plum", "apple"}, - expectedRemovals: []metadata.V2Metadata{ - {Digest: digest.Digest("banana"), SourceRepository: "docker.io/user/app"}, - {Digest: digest.Digest("plum"), SourceRepository: "docker.io/user/app"}, - {Digest: digest.Digest("apple"), SourceRepository: "docker.io/user/app"}, - }, - }, - { - name: "zero allowed existence checks", - targetRepo: "user/app", - metadata: []metadata.V2Metadata{ - {Digest: digest.Digest("pear"), SourceRepository: "docker.io/user/app"}, - {Digest: digest.Digest("apple"), SourceRepository: "docker.io/user/app"}, - {Digest: digest.Digest("plum"), SourceRepository: "docker.io/user/app"}, - {Digest: digest.Digest("banana"), SourceRepository: "docker.io/user/app"}, - }, - maxExistenceChecks: 0, - remoteBlobs: map[digest.Digest]distribution.Descriptor{digest.Digest("pear"): {Digest: digest.Digest("pear")}}, - }, - { - name: "stat single digest just once", - targetRepo: "busybox", - metadata: []metadata.V2Metadata{ - taggedMetadata("key1", "pear", "docker.io/library/busybox"), - taggedMetadata("key2", "apple", "docker.io/library/busybox"), - taggedMetadata("key3", "apple", "docker.io/library/busybox"), - }, - maxExistenceChecks: 3, - remoteBlobs: map[digest.Digest]distribution.Descriptor{digest.Digest("pear"): {Digest: digest.Digest("pear")}}, - expectedDescriptor: distribution.Descriptor{Digest: digest.Digest("pear"), MediaType: schema2.MediaTypeLayer}, - expectedExists: true, - expectedRequests: []string{"apple", "pear"}, - expectedAdditions: []metadata.V2Metadata{{Digest: digest.Digest("pear"), SourceRepository: "docker.io/library/busybox"}}, - expectedRemovals: []metadata.V2Metadata{taggedMetadata("key3", "apple", "docker.io/library/busybox")}, - }, - { - name: "don't stop on first error", - targetRepo: "user/app", - hmacKey: "key", - metadata: []metadata.V2Metadata{ - taggedMetadata("key", "banana", "docker.io/user/app"), - taggedMetadata("key", "orange", "docker.io/user/app"), - taggedMetadata("key", "plum", "docker.io/user/app"), - }, - maxExistenceChecks: 3, - remoteErrors: map[digest.Digest]error{"orange": distribution.ErrAccessDenied}, - remoteBlobs: map[digest.Digest]distribution.Descriptor{digest.Digest("apple"): {}}, - expectedError: nil, - expectedRequests: []string{"plum", "orange", "banana"}, - expectedRemovals: []metadata.V2Metadata{ - taggedMetadata("key", "plum", "docker.io/user/app"), - taggedMetadata("key", "banana", "docker.io/user/app"), - }, - }, - { - name: "remove outdated metadata", - targetRepo: "docker.io/user/app", - metadata: []metadata.V2Metadata{ - {Digest: digest.Digest("plum"), SourceRepository: "docker.io/library/busybox"}, - {Digest: digest.Digest("orange"), SourceRepository: "docker.io/user/app"}, - }, - maxExistenceChecks: 3, - remoteErrors: map[digest.Digest]error{"orange": distribution.ErrBlobUnknown}, - remoteBlobs: map[digest.Digest]distribution.Descriptor{digest.Digest("plum"): {}}, - expectedExists: false, - expectedRequests: []string{"orange"}, - expectedRemovals: []metadata.V2Metadata{{Digest: digest.Digest("orange"), SourceRepository: "docker.io/user/app"}}, - }, - { - name: "missing SourceRepository", - targetRepo: "busybox", - metadata: []metadata.V2Metadata{ - {Digest: digest.Digest("1")}, - {Digest: digest.Digest("3")}, - {Digest: digest.Digest("2")}, - }, - maxExistenceChecks: 3, - expectedExists: false, - expectedRequests: []string{"2", "3", "1"}, - }, - - { - name: "with and without SourceRepository", - targetRepo: "busybox", - metadata: []metadata.V2Metadata{ - {Digest: digest.Digest("1")}, - {Digest: digest.Digest("2"), SourceRepository: "docker.io/library/busybox"}, - {Digest: digest.Digest("3")}, - }, - remoteBlobs: map[digest.Digest]distribution.Descriptor{digest.Digest("1"): {Digest: digest.Digest("1")}}, - maxExistenceChecks: 3, - expectedDescriptor: distribution.Descriptor{Digest: digest.Digest("1"), MediaType: schema2.MediaTypeLayer}, - expectedExists: true, - expectedRequests: []string{"2", "3", "1"}, - expectedAdditions: []metadata.V2Metadata{{Digest: digest.Digest("1"), SourceRepository: "docker.io/library/busybox"}}, - expectedRemovals: []metadata.V2Metadata{ - {Digest: digest.Digest("2"), SourceRepository: "docker.io/library/busybox"}, - }, - }, - } { - repoInfo, err := reference.ParseNamed(tc.targetRepo) - if err != nil { - t.Fatalf("[%s] failed to parse reference name: %v", tc.name, err) - } - repo := &mockRepo{ - t: t, - errors: tc.remoteErrors, - blobs: tc.remoteBlobs, - requests: []string{}, - } - ctx := context.Background() - ms := &mockV2MetadataService{} - pd := &v2PushDescriptor{ - hmacKey: []byte(tc.hmacKey), - repoInfo: repoInfo, - layer: &storeLayer{ - Layer: layer.EmptyLayer, - }, - repo: repo, - v2MetadataService: ms, - pushState: &pushState{remoteLayers: make(map[layer.DiffID]distribution.Descriptor)}, - checkedDigests: make(map[digest.Digest]struct{}), - } - - desc, exists, err := pd.layerAlreadyExists(ctx, &progressSink{t}, layer.EmptyLayer.DiffID(), tc.checkOtherRepositories, tc.maxExistenceChecks, tc.metadata) - - if !reflect.DeepEqual(desc, tc.expectedDescriptor) { - t.Errorf("[%s] got unexpected descriptor: %#+v != %#+v", tc.name, desc, tc.expectedDescriptor) - } - if exists != tc.expectedExists { - t.Errorf("[%s] got unexpected exists: %t != %t", tc.name, exists, tc.expectedExists) - } - if !reflect.DeepEqual(err, tc.expectedError) { - t.Errorf("[%s] got unexpected error: %#+v != %#+v", tc.name, err, tc.expectedError) - } - - if len(repo.requests) != len(tc.expectedRequests) { - t.Errorf("[%s] got unexpected number of requests: %d != %d", tc.name, len(repo.requests), len(tc.expectedRequests)) - } - for i := 0; i < len(repo.requests) && i < len(tc.expectedRequests); i++ { - if repo.requests[i] != tc.expectedRequests[i] { - t.Errorf("[%s] request %d does not match expected: %q != %q", tc.name, i, repo.requests[i], tc.expectedRequests[i]) - } - } - for i := len(repo.requests); i < len(tc.expectedRequests); i++ { - t.Errorf("[%s] missing expected request at position %d (%q)", tc.name, i, tc.expectedRequests[i]) - } - for i := len(tc.expectedRequests); i < len(repo.requests); i++ { - t.Errorf("[%s] got unexpected request at position %d (%q)", tc.name, i, repo.requests[i]) - } - - if len(ms.added) != len(tc.expectedAdditions) { - t.Errorf("[%s] got unexpected number of additions: %d != %d", tc.name, len(ms.added), len(tc.expectedAdditions)) - } - for i := 0; i < len(ms.added) && i < len(tc.expectedAdditions); i++ { - if ms.added[i] != tc.expectedAdditions[i] { - t.Errorf("[%s] added metadata at %d does not match expected: %q != %q", tc.name, i, ms.added[i], tc.expectedAdditions[i]) - } - } - for i := len(ms.added); i < len(tc.expectedAdditions); i++ { - t.Errorf("[%s] missing expected addition at position %d (%q)", tc.name, i, tc.expectedAdditions[i]) - } - for i := len(tc.expectedAdditions); i < len(ms.added); i++ { - t.Errorf("[%s] unexpected metadata addition at position %d (%q)", tc.name, i, ms.added[i]) - } - - if len(ms.removed) != len(tc.expectedRemovals) { - t.Errorf("[%s] got unexpected number of removals: %d != %d", tc.name, len(ms.removed), len(tc.expectedRemovals)) - } - for i := 0; i < len(ms.removed) && i < len(tc.expectedRemovals); i++ { - if ms.removed[i] != tc.expectedRemovals[i] { - t.Errorf("[%s] removed metadata at %d does not match expected: %q != %q", tc.name, i, ms.removed[i], tc.expectedRemovals[i]) - } - } - for i := len(ms.removed); i < len(tc.expectedRemovals); i++ { - t.Errorf("[%s] missing expected removal at position %d (%q)", tc.name, i, tc.expectedRemovals[i]) - } - for i := len(tc.expectedRemovals); i < len(ms.removed); i++ { - t.Errorf("[%s] removed unexpected metadata at position %d (%q)", tc.name, i, ms.removed[i]) - } - } -} - -func taggedMetadata(key string, dgst string, sourceRepo string) metadata.V2Metadata { - meta := metadata.V2Metadata{ - Digest: digest.Digest(dgst), - SourceRepository: sourceRepo, - } - - meta.HMAC = metadata.ComputeV2MetadataHMAC([]byte(key), &meta) - return meta -} - -type mockRepo struct { - t *testing.T - errors map[digest.Digest]error - blobs map[digest.Digest]distribution.Descriptor - requests []string -} - -var _ distribution.Repository = &mockRepo{} - -func (m *mockRepo) Named() distreference.Named { - m.t.Fatalf("Named() not implemented") - return nil -} -func (m *mockRepo) Manifests(ctc context.Context, options ...distribution.ManifestServiceOption) (distribution.ManifestService, error) { - m.t.Fatalf("Manifests() not implemented") - return nil, nil -} -func (m *mockRepo) Tags(ctc context.Context) distribution.TagService { - m.t.Fatalf("Tags() not implemented") - return nil -} -func (m *mockRepo) Blobs(ctx context.Context) distribution.BlobStore { - return &mockBlobStore{ - repo: m, - } -} - -type mockBlobStore struct { - repo *mockRepo -} - -var _ distribution.BlobStore = &mockBlobStore{} - -func (m *mockBlobStore) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { - m.repo.requests = append(m.repo.requests, dgst.String()) - if err, exists := m.repo.errors[dgst]; exists { - return distribution.Descriptor{}, err - } - if desc, exists := m.repo.blobs[dgst]; exists { - return desc, nil - } - return distribution.Descriptor{}, distribution.ErrBlobUnknown -} -func (m *mockBlobStore) Get(ctx context.Context, dgst digest.Digest) ([]byte, error) { - m.repo.t.Fatal("Get() not implemented") - return nil, nil -} - -func (m *mockBlobStore) Open(ctx context.Context, dgst digest.Digest) (distribution.ReadSeekCloser, error) { - m.repo.t.Fatal("Open() not implemented") - return nil, nil -} - -func (m *mockBlobStore) Put(ctx context.Context, mediaType string, p []byte) (distribution.Descriptor, error) { - m.repo.t.Fatal("Put() not implemented") - return distribution.Descriptor{}, nil -} - -func (m *mockBlobStore) Create(ctx context.Context, options ...distribution.BlobCreateOption) (distribution.BlobWriter, error) { - m.repo.t.Fatal("Create() not implemented") - return nil, nil -} -func (m *mockBlobStore) Resume(ctx context.Context, id string) (distribution.BlobWriter, error) { - m.repo.t.Fatal("Resume() not implemented") - return nil, nil -} -func (m *mockBlobStore) Delete(ctx context.Context, dgst digest.Digest) error { - m.repo.t.Fatal("Delete() not implemented") - return nil -} -func (m *mockBlobStore) ServeBlob(ctx context.Context, w http.ResponseWriter, r *http.Request, dgst digest.Digest) error { - m.repo.t.Fatalf("ServeBlob() not implemented") - return nil -} - -type mockV2MetadataService struct { - added []metadata.V2Metadata - removed []metadata.V2Metadata -} - -var _ metadata.V2MetadataService = &mockV2MetadataService{} - -func (*mockV2MetadataService) GetMetadata(diffID layer.DiffID) ([]metadata.V2Metadata, error) { - return nil, nil -} -func (*mockV2MetadataService) GetDiffID(dgst digest.Digest) (layer.DiffID, error) { - return "", nil -} -func (m *mockV2MetadataService) Add(diffID layer.DiffID, metadata metadata.V2Metadata) error { - m.added = append(m.added, metadata) - return nil -} -func (m *mockV2MetadataService) TagAndAdd(diffID layer.DiffID, hmacKey []byte, meta metadata.V2Metadata) error { - meta.HMAC = metadata.ComputeV2MetadataHMAC(hmacKey, &meta) - m.Add(diffID, meta) - return nil -} -func (m *mockV2MetadataService) Remove(metadata metadata.V2Metadata) error { - m.removed = append(m.removed, metadata) - return nil -} - -type progressSink struct { - t *testing.T -} - -func (s *progressSink) WriteProgress(p progress.Progress) error { - s.t.Logf("progress update: %#+v", p) - return nil -} diff --git a/vendor/github.com/docker/docker/distribution/registry.go b/vendor/github.com/docker/docker/distribution/registry.go deleted file mode 100644 index 95e181ded..000000000 --- a/vendor/github.com/docker/docker/distribution/registry.go +++ /dev/null @@ -1,156 +0,0 @@ -package distribution - -import ( - "fmt" - "net" - "net/http" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/manifest/schema2" - distreference "github.com/docker/distribution/reference" - "github.com/docker/distribution/registry/client" - "github.com/docker/distribution/registry/client/auth" - "github.com/docker/distribution/registry/client/transport" - "github.com/docker/docker/api/types" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/registry" - "github.com/docker/go-connections/sockets" - "golang.org/x/net/context" -) - -// ImageTypes represents the schema2 config types for images -var ImageTypes = []string{ - schema2.MediaTypeImageConfig, - // Handle unexpected values from https://github.com/docker/distribution/issues/1621 - // (see also https://github.com/docker/docker/issues/22378, - // https://github.com/docker/docker/issues/30083) - "application/octet-stream", - "application/json", - "text/html", - // Treat defaulted values as images, newer types cannot be implied - "", -} - -// PluginTypes represents the schema2 config types for plugins -var PluginTypes = []string{ - schema2.MediaTypePluginConfig, -} - -var mediaTypeClasses map[string]string - -func init() { - // initialize media type classes with all know types for - // plugin - mediaTypeClasses = map[string]string{} - for _, t := range ImageTypes { - mediaTypeClasses[t] = "image" - } - for _, t := range PluginTypes { - mediaTypeClasses[t] = "plugin" - } -} - -// NewV2Repository returns a repository (v2 only). It creates an HTTP transport -// providing timeout settings and authentication support, and also verifies the -// remote API version. -func NewV2Repository(ctx context.Context, repoInfo *registry.RepositoryInfo, endpoint registry.APIEndpoint, metaHeaders http.Header, authConfig *types.AuthConfig, actions ...string) (repo distribution.Repository, foundVersion bool, err error) { - repoName := repoInfo.FullName() - // If endpoint does not support CanonicalName, use the RemoteName instead - if endpoint.TrimHostname { - repoName = repoInfo.RemoteName() - } - - direct := &net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - DualStack: true, - } - - // TODO(dmcgowan): Call close idle connections when complete, use keep alive - base := &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: direct.Dial, - TLSHandshakeTimeout: 10 * time.Second, - TLSClientConfig: endpoint.TLSConfig, - // TODO(dmcgowan): Call close idle connections when complete and use keep alive - DisableKeepAlives: true, - } - - proxyDialer, err := sockets.DialerFromEnvironment(direct) - if err == nil { - base.Dial = proxyDialer.Dial - } - - modifiers := registry.DockerHeaders(dockerversion.DockerUserAgent(ctx), metaHeaders) - authTransport := transport.NewTransport(base, modifiers...) - - challengeManager, foundVersion, err := registry.PingV2Registry(endpoint.URL, authTransport) - if err != nil { - transportOK := false - if responseErr, ok := err.(registry.PingResponseError); ok { - transportOK = true - err = responseErr.Err - } - return nil, foundVersion, fallbackError{ - err: err, - confirmedV2: foundVersion, - transportOK: transportOK, - } - } - - if authConfig.RegistryToken != "" { - passThruTokenHandler := &existingTokenHandler{token: authConfig.RegistryToken} - modifiers = append(modifiers, auth.NewAuthorizer(challengeManager, passThruTokenHandler)) - } else { - scope := auth.RepositoryScope{ - Repository: repoName, - Actions: actions, - Class: repoInfo.Class, - } - - creds := registry.NewStaticCredentialStore(authConfig) - tokenHandlerOptions := auth.TokenHandlerOptions{ - Transport: authTransport, - Credentials: creds, - Scopes: []auth.Scope{scope}, - ClientID: registry.AuthClientID, - } - tokenHandler := auth.NewTokenHandlerWithOptions(tokenHandlerOptions) - basicHandler := auth.NewBasicHandler(creds) - modifiers = append(modifiers, auth.NewAuthorizer(challengeManager, tokenHandler, basicHandler)) - } - tr := transport.NewTransport(base, modifiers...) - - repoNameRef, err := distreference.ParseNamed(repoName) - if err != nil { - return nil, foundVersion, fallbackError{ - err: err, - confirmedV2: foundVersion, - transportOK: true, - } - } - - repo, err = client.NewRepository(ctx, repoNameRef, endpoint.URL.String(), tr) - if err != nil { - err = fallbackError{ - err: err, - confirmedV2: foundVersion, - transportOK: true, - } - } - return -} - -type existingTokenHandler struct { - token string -} - -func (th *existingTokenHandler) Scheme() string { - return "bearer" -} - -func (th *existingTokenHandler) AuthorizeRequest(req *http.Request, params map[string]string) error { - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", th.token)) - return nil -} diff --git a/vendor/github.com/docker/docker/distribution/registry_unit_test.go b/vendor/github.com/docker/docker/distribution/registry_unit_test.go deleted file mode 100644 index 406de3491..000000000 --- a/vendor/github.com/docker/docker/distribution/registry_unit_test.go +++ /dev/null @@ -1,136 +0,0 @@ -package distribution - -import ( - "net/http" - "net/http/httptest" - "net/url" - "os" - "strings" - "testing" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/api/types" - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "github.com/docker/docker/utils" - "golang.org/x/net/context" -) - -const secretRegistryToken = "mysecrettoken" - -type tokenPassThruHandler struct { - reached bool - gotToken bool - shouldSend401 func(url string) bool -} - -func (h *tokenPassThruHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - h.reached = true - if strings.Contains(r.Header.Get("Authorization"), secretRegistryToken) { - logrus.Debug("Detected registry token in auth header") - h.gotToken = true - } - if h.shouldSend401 == nil || h.shouldSend401(r.RequestURI) { - w.Header().Set("WWW-Authenticate", `Bearer realm="foorealm"`) - w.WriteHeader(401) - } -} - -func testTokenPassThru(t *testing.T, ts *httptest.Server) { - tmp, err := utils.TestDirectory("") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - uri, err := url.Parse(ts.URL) - if err != nil { - t.Fatalf("could not parse url from test server: %v", err) - } - - endpoint := registry.APIEndpoint{ - Mirror: false, - URL: uri, - Version: 2, - Official: false, - TrimHostname: false, - TLSConfig: nil, - //VersionHeader: "verheader", - } - n, _ := reference.ParseNamed("testremotename") - repoInfo := ®istry.RepositoryInfo{ - Named: n, - Index: ®istrytypes.IndexInfo{ - Name: "testrepo", - Mirrors: nil, - Secure: false, - Official: false, - }, - Official: false, - } - imagePullConfig := &ImagePullConfig{ - Config: Config{ - MetaHeaders: http.Header{}, - AuthConfig: &types.AuthConfig{ - RegistryToken: secretRegistryToken, - }, - }, - Schema2Types: ImageTypes, - } - puller, err := newPuller(endpoint, repoInfo, imagePullConfig) - if err != nil { - t.Fatal(err) - } - p := puller.(*v2Puller) - ctx := context.Background() - p.repo, _, err = NewV2Repository(ctx, p.repoInfo, p.endpoint, p.config.MetaHeaders, p.config.AuthConfig, "pull") - if err != nil { - t.Fatal(err) - } - - logrus.Debug("About to pull") - // We expect it to fail, since we haven't mock'd the full registry exchange in our handler above - tag, _ := reference.WithTag(n, "tag_goes_here") - _ = p.pullV2Repository(ctx, tag) -} - -func TestTokenPassThru(t *testing.T) { - handler := &tokenPassThruHandler{shouldSend401: func(url string) bool { return url == "/v2/" }} - ts := httptest.NewServer(handler) - defer ts.Close() - - testTokenPassThru(t, ts) - - if !handler.reached { - t.Fatal("Handler not reached") - } - if !handler.gotToken { - t.Fatal("Failed to receive registry token") - } -} - -func TestTokenPassThruDifferentHost(t *testing.T) { - handler := new(tokenPassThruHandler) - ts := httptest.NewServer(handler) - defer ts.Close() - - tsredirect := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.RequestURI == "/v2/" { - w.Header().Set("WWW-Authenticate", `Bearer realm="foorealm"`) - w.WriteHeader(401) - return - } - http.Redirect(w, r, ts.URL+r.URL.Path, http.StatusMovedPermanently) - })) - defer tsredirect.Close() - - testTokenPassThru(t, tsredirect) - - if !handler.reached { - t.Fatal("Handler not reached") - } - if handler.gotToken { - t.Fatal("Redirect should not forward Authorization header to another host") - } -} diff --git a/vendor/github.com/docker/docker/distribution/utils/progress.go b/vendor/github.com/docker/docker/distribution/utils/progress.go deleted file mode 100644 index ef8ecc89f..000000000 --- a/vendor/github.com/docker/docker/distribution/utils/progress.go +++ /dev/null @@ -1,44 +0,0 @@ -package utils - -import ( - "io" - "net" - "os" - "syscall" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/pkg/streamformatter" -) - -// WriteDistributionProgress is a helper for writing progress from chan to JSON -// stream with an optional cancel function. -func WriteDistributionProgress(cancelFunc func(), outStream io.Writer, progressChan <-chan progress.Progress) { - progressOutput := streamformatter.NewJSONStreamFormatter().NewProgressOutput(outStream, false) - operationCancelled := false - - for prog := range progressChan { - if err := progressOutput.WriteProgress(prog); err != nil && !operationCancelled { - // don't log broken pipe errors as this is the normal case when a client aborts - if isBrokenPipe(err) { - logrus.Info("Pull session cancelled") - } else { - logrus.Errorf("error writing progress to client: %v", err) - } - cancelFunc() - operationCancelled = true - // Don't return, because we need to continue draining - // progressChan until it's closed to avoid a deadlock. - } - } -} - -func isBrokenPipe(e error) bool { - if netErr, ok := e.(*net.OpError); ok { - e = netErr.Err - if sysErr, ok := netErr.Err.(*os.SyscallError); ok { - e = sysErr.Err - } - } - return e == syscall.EPIPE -} diff --git a/vendor/github.com/docker/docker/distribution/xfer/download.go b/vendor/github.com/docker/docker/distribution/xfer/download.go deleted file mode 100644 index 754534221..000000000 --- a/vendor/github.com/docker/docker/distribution/xfer/download.go +++ /dev/null @@ -1,452 +0,0 @@ -package xfer - -import ( - "errors" - "fmt" - "io" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/progress" - "golang.org/x/net/context" -) - -const maxDownloadAttempts = 5 - -// LayerDownloadManager figures out which layers need to be downloaded, then -// registers and downloads those, taking into account dependencies between -// layers. -type LayerDownloadManager struct { - layerStore layer.Store - tm TransferManager -} - -// SetConcurrency set the max concurrent downloads for each pull -func (ldm *LayerDownloadManager) SetConcurrency(concurrency int) { - ldm.tm.SetConcurrency(concurrency) -} - -// NewLayerDownloadManager returns a new LayerDownloadManager. -func NewLayerDownloadManager(layerStore layer.Store, concurrencyLimit int) *LayerDownloadManager { - return &LayerDownloadManager{ - layerStore: layerStore, - tm: NewTransferManager(concurrencyLimit), - } -} - -type downloadTransfer struct { - Transfer - - layerStore layer.Store - layer layer.Layer - err error -} - -// result returns the layer resulting from the download, if the download -// and registration were successful. -func (d *downloadTransfer) result() (layer.Layer, error) { - return d.layer, d.err -} - -// A DownloadDescriptor references a layer that may need to be downloaded. -type DownloadDescriptor interface { - // Key returns the key used to deduplicate downloads. - Key() string - // ID returns the ID for display purposes. - ID() string - // DiffID should return the DiffID for this layer, or an error - // if it is unknown (for example, if it has not been downloaded - // before). - DiffID() (layer.DiffID, error) - // Download is called to perform the download. - Download(ctx context.Context, progressOutput progress.Output) (io.ReadCloser, int64, error) - // Close is called when the download manager is finished with this - // descriptor and will not call Download again or read from the reader - // that Download returned. - Close() -} - -// DownloadDescriptorWithRegistered is a DownloadDescriptor that has an -// additional Registered method which gets called after a downloaded layer is -// registered. This allows the user of the download manager to know the DiffID -// of each registered layer. This method is called if a cast to -// DownloadDescriptorWithRegistered is successful. -type DownloadDescriptorWithRegistered interface { - DownloadDescriptor - Registered(diffID layer.DiffID) -} - -// Download is a blocking function which ensures the requested layers are -// present in the layer store. It uses the string returned by the Key method to -// deduplicate downloads. If a given layer is not already known to present in -// the layer store, and the key is not used by an in-progress download, the -// Download method is called to get the layer tar data. Layers are then -// registered in the appropriate order. The caller must call the returned -// release function once it is is done with the returned RootFS object. -func (ldm *LayerDownloadManager) Download(ctx context.Context, initialRootFS image.RootFS, layers []DownloadDescriptor, progressOutput progress.Output) (image.RootFS, func(), error) { - var ( - topLayer layer.Layer - topDownload *downloadTransfer - watcher *Watcher - missingLayer bool - transferKey = "" - downloadsByKey = make(map[string]*downloadTransfer) - ) - - rootFS := initialRootFS - for _, descriptor := range layers { - key := descriptor.Key() - transferKey += key - - if !missingLayer { - missingLayer = true - diffID, err := descriptor.DiffID() - if err == nil { - getRootFS := rootFS - getRootFS.Append(diffID) - l, err := ldm.layerStore.Get(getRootFS.ChainID()) - if err == nil { - // Layer already exists. - logrus.Debugf("Layer already exists: %s", descriptor.ID()) - progress.Update(progressOutput, descriptor.ID(), "Already exists") - if topLayer != nil { - layer.ReleaseAndLog(ldm.layerStore, topLayer) - } - topLayer = l - missingLayer = false - rootFS.Append(diffID) - continue - } - } - } - - // Does this layer have the same data as a previous layer in - // the stack? If so, avoid downloading it more than once. - var topDownloadUncasted Transfer - if existingDownload, ok := downloadsByKey[key]; ok { - xferFunc := ldm.makeDownloadFuncFromDownload(descriptor, existingDownload, topDownload) - defer topDownload.Transfer.Release(watcher) - topDownloadUncasted, watcher = ldm.tm.Transfer(transferKey, xferFunc, progressOutput) - topDownload = topDownloadUncasted.(*downloadTransfer) - continue - } - - // Layer is not known to exist - download and register it. - progress.Update(progressOutput, descriptor.ID(), "Pulling fs layer") - - var xferFunc DoFunc - if topDownload != nil { - xferFunc = ldm.makeDownloadFunc(descriptor, "", topDownload) - defer topDownload.Transfer.Release(watcher) - } else { - xferFunc = ldm.makeDownloadFunc(descriptor, rootFS.ChainID(), nil) - } - topDownloadUncasted, watcher = ldm.tm.Transfer(transferKey, xferFunc, progressOutput) - topDownload = topDownloadUncasted.(*downloadTransfer) - downloadsByKey[key] = topDownload - } - - if topDownload == nil { - return rootFS, func() { - if topLayer != nil { - layer.ReleaseAndLog(ldm.layerStore, topLayer) - } - }, nil - } - - // Won't be using the list built up so far - will generate it - // from downloaded layers instead. - rootFS.DiffIDs = []layer.DiffID{} - - defer func() { - if topLayer != nil { - layer.ReleaseAndLog(ldm.layerStore, topLayer) - } - }() - - select { - case <-ctx.Done(): - topDownload.Transfer.Release(watcher) - return rootFS, func() {}, ctx.Err() - case <-topDownload.Done(): - break - } - - l, err := topDownload.result() - if err != nil { - topDownload.Transfer.Release(watcher) - return rootFS, func() {}, err - } - - // Must do this exactly len(layers) times, so we don't include the - // base layer on Windows. - for range layers { - if l == nil { - topDownload.Transfer.Release(watcher) - return rootFS, func() {}, errors.New("internal error: too few parent layers") - } - rootFS.DiffIDs = append([]layer.DiffID{l.DiffID()}, rootFS.DiffIDs...) - l = l.Parent() - } - return rootFS, func() { topDownload.Transfer.Release(watcher) }, err -} - -// makeDownloadFunc returns a function that performs the layer download and -// registration. If parentDownload is non-nil, it waits for that download to -// complete before the registration step, and registers the downloaded data -// on top of parentDownload's resulting layer. Otherwise, it registers the -// layer on top of the ChainID given by parentLayer. -func (ldm *LayerDownloadManager) makeDownloadFunc(descriptor DownloadDescriptor, parentLayer layer.ChainID, parentDownload *downloadTransfer) DoFunc { - return func(progressChan chan<- progress.Progress, start <-chan struct{}, inactive chan<- struct{}) Transfer { - d := &downloadTransfer{ - Transfer: NewTransfer(), - layerStore: ldm.layerStore, - } - - go func() { - defer func() { - close(progressChan) - }() - - progressOutput := progress.ChanOutput(progressChan) - - select { - case <-start: - default: - progress.Update(progressOutput, descriptor.ID(), "Waiting") - <-start - } - - if parentDownload != nil { - // Did the parent download already fail or get - // cancelled? - select { - case <-parentDownload.Done(): - _, err := parentDownload.result() - if err != nil { - d.err = err - return - } - default: - } - } - - var ( - downloadReader io.ReadCloser - size int64 - err error - retries int - ) - - defer descriptor.Close() - - for { - downloadReader, size, err = descriptor.Download(d.Transfer.Context(), progressOutput) - if err == nil { - break - } - - // If an error was returned because the context - // was cancelled, we shouldn't retry. - select { - case <-d.Transfer.Context().Done(): - d.err = err - return - default: - } - - retries++ - if _, isDNR := err.(DoNotRetry); isDNR || retries == maxDownloadAttempts { - logrus.Errorf("Download failed: %v", err) - d.err = err - return - } - - logrus.Errorf("Download failed, retrying: %v", err) - delay := retries * 5 - ticker := time.NewTicker(time.Second) - - selectLoop: - for { - progress.Updatef(progressOutput, descriptor.ID(), "Retrying in %d second%s", delay, (map[bool]string{true: "s"})[delay != 1]) - select { - case <-ticker.C: - delay-- - if delay == 0 { - ticker.Stop() - break selectLoop - } - case <-d.Transfer.Context().Done(): - ticker.Stop() - d.err = errors.New("download cancelled during retry delay") - return - } - - } - } - - close(inactive) - - if parentDownload != nil { - select { - case <-d.Transfer.Context().Done(): - d.err = errors.New("layer registration cancelled") - downloadReader.Close() - return - case <-parentDownload.Done(): - } - - l, err := parentDownload.result() - if err != nil { - d.err = err - downloadReader.Close() - return - } - parentLayer = l.ChainID() - } - - reader := progress.NewProgressReader(ioutils.NewCancelReadCloser(d.Transfer.Context(), downloadReader), progressOutput, size, descriptor.ID(), "Extracting") - defer reader.Close() - - inflatedLayerData, err := archive.DecompressStream(reader) - if err != nil { - d.err = fmt.Errorf("could not get decompression stream: %v", err) - return - } - - var src distribution.Descriptor - if fs, ok := descriptor.(distribution.Describable); ok { - src = fs.Descriptor() - } - if ds, ok := d.layerStore.(layer.DescribableStore); ok { - d.layer, err = ds.RegisterWithDescriptor(inflatedLayerData, parentLayer, src) - } else { - d.layer, err = d.layerStore.Register(inflatedLayerData, parentLayer) - } - if err != nil { - select { - case <-d.Transfer.Context().Done(): - d.err = errors.New("layer registration cancelled") - default: - d.err = fmt.Errorf("failed to register layer: %v", err) - } - return - } - - progress.Update(progressOutput, descriptor.ID(), "Pull complete") - withRegistered, hasRegistered := descriptor.(DownloadDescriptorWithRegistered) - if hasRegistered { - withRegistered.Registered(d.layer.DiffID()) - } - - // Doesn't actually need to be its own goroutine, but - // done like this so we can defer close(c). - go func() { - <-d.Transfer.Released() - if d.layer != nil { - layer.ReleaseAndLog(d.layerStore, d.layer) - } - }() - }() - - return d - } -} - -// makeDownloadFuncFromDownload returns a function that performs the layer -// registration when the layer data is coming from an existing download. It -// waits for sourceDownload and parentDownload to complete, and then -// reregisters the data from sourceDownload's top layer on top of -// parentDownload. This function does not log progress output because it would -// interfere with the progress reporting for sourceDownload, which has the same -// Key. -func (ldm *LayerDownloadManager) makeDownloadFuncFromDownload(descriptor DownloadDescriptor, sourceDownload *downloadTransfer, parentDownload *downloadTransfer) DoFunc { - return func(progressChan chan<- progress.Progress, start <-chan struct{}, inactive chan<- struct{}) Transfer { - d := &downloadTransfer{ - Transfer: NewTransfer(), - layerStore: ldm.layerStore, - } - - go func() { - defer func() { - close(progressChan) - }() - - <-start - - close(inactive) - - select { - case <-d.Transfer.Context().Done(): - d.err = errors.New("layer registration cancelled") - return - case <-parentDownload.Done(): - } - - l, err := parentDownload.result() - if err != nil { - d.err = err - return - } - parentLayer := l.ChainID() - - // sourceDownload should have already finished if - // parentDownload finished, but wait for it explicitly - // to be sure. - select { - case <-d.Transfer.Context().Done(): - d.err = errors.New("layer registration cancelled") - return - case <-sourceDownload.Done(): - } - - l, err = sourceDownload.result() - if err != nil { - d.err = err - return - } - - layerReader, err := l.TarStream() - if err != nil { - d.err = err - return - } - defer layerReader.Close() - - var src distribution.Descriptor - if fs, ok := l.(distribution.Describable); ok { - src = fs.Descriptor() - } - if ds, ok := d.layerStore.(layer.DescribableStore); ok { - d.layer, err = ds.RegisterWithDescriptor(layerReader, parentLayer, src) - } else { - d.layer, err = d.layerStore.Register(layerReader, parentLayer) - } - if err != nil { - d.err = fmt.Errorf("failed to register layer: %v", err) - return - } - - withRegistered, hasRegistered := descriptor.(DownloadDescriptorWithRegistered) - if hasRegistered { - withRegistered.Registered(d.layer.DiffID()) - } - - // Doesn't actually need to be its own goroutine, but - // done like this so we can defer close(c). - go func() { - <-d.Transfer.Released() - if d.layer != nil { - layer.ReleaseAndLog(d.layerStore, d.layer) - } - }() - }() - - return d - } -} diff --git a/vendor/github.com/docker/docker/distribution/xfer/download_test.go b/vendor/github.com/docker/docker/distribution/xfer/download_test.go deleted file mode 100644 index bc20e1e7e..000000000 --- a/vendor/github.com/docker/docker/distribution/xfer/download_test.go +++ /dev/null @@ -1,356 +0,0 @@ -package xfer - -import ( - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "runtime" - "sync/atomic" - "testing" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/progress" - "golang.org/x/net/context" -) - -const maxDownloadConcurrency = 3 - -type mockLayer struct { - layerData bytes.Buffer - diffID layer.DiffID - chainID layer.ChainID - parent layer.Layer -} - -func (ml *mockLayer) TarStream() (io.ReadCloser, error) { - return ioutil.NopCloser(bytes.NewBuffer(ml.layerData.Bytes())), nil -} - -func (ml *mockLayer) TarStreamFrom(layer.ChainID) (io.ReadCloser, error) { - return nil, fmt.Errorf("not implemented") -} - -func (ml *mockLayer) ChainID() layer.ChainID { - return ml.chainID -} - -func (ml *mockLayer) DiffID() layer.DiffID { - return ml.diffID -} - -func (ml *mockLayer) Parent() layer.Layer { - return ml.parent -} - -func (ml *mockLayer) Size() (size int64, err error) { - return 0, nil -} - -func (ml *mockLayer) DiffSize() (size int64, err error) { - return 0, nil -} - -func (ml *mockLayer) Metadata() (map[string]string, error) { - return make(map[string]string), nil -} - -type mockLayerStore struct { - layers map[layer.ChainID]*mockLayer -} - -func createChainIDFromParent(parent layer.ChainID, dgsts ...layer.DiffID) layer.ChainID { - if len(dgsts) == 0 { - return parent - } - if parent == "" { - return createChainIDFromParent(layer.ChainID(dgsts[0]), dgsts[1:]...) - } - // H = "H(n-1) SHA256(n)" - dgst := digest.FromBytes([]byte(string(parent) + " " + string(dgsts[0]))) - return createChainIDFromParent(layer.ChainID(dgst), dgsts[1:]...) -} - -func (ls *mockLayerStore) Map() map[layer.ChainID]layer.Layer { - layers := map[layer.ChainID]layer.Layer{} - - for k, v := range ls.layers { - layers[k] = v - } - - return layers -} - -func (ls *mockLayerStore) Register(reader io.Reader, parentID layer.ChainID) (layer.Layer, error) { - return ls.RegisterWithDescriptor(reader, parentID, distribution.Descriptor{}) -} - -func (ls *mockLayerStore) RegisterWithDescriptor(reader io.Reader, parentID layer.ChainID, _ distribution.Descriptor) (layer.Layer, error) { - var ( - parent layer.Layer - err error - ) - - if parentID != "" { - parent, err = ls.Get(parentID) - if err != nil { - return nil, err - } - } - - l := &mockLayer{parent: parent} - _, err = l.layerData.ReadFrom(reader) - if err != nil { - return nil, err - } - l.diffID = layer.DiffID(digest.FromBytes(l.layerData.Bytes())) - l.chainID = createChainIDFromParent(parentID, l.diffID) - - ls.layers[l.chainID] = l - return l, nil -} - -func (ls *mockLayerStore) Get(chainID layer.ChainID) (layer.Layer, error) { - l, ok := ls.layers[chainID] - if !ok { - return nil, layer.ErrLayerDoesNotExist - } - return l, nil -} - -func (ls *mockLayerStore) Release(l layer.Layer) ([]layer.Metadata, error) { - return []layer.Metadata{}, nil -} -func (ls *mockLayerStore) CreateRWLayer(string, layer.ChainID, string, layer.MountInit, map[string]string) (layer.RWLayer, error) { - return nil, errors.New("not implemented") -} - -func (ls *mockLayerStore) GetRWLayer(string) (layer.RWLayer, error) { - return nil, errors.New("not implemented") -} - -func (ls *mockLayerStore) ReleaseRWLayer(layer.RWLayer) ([]layer.Metadata, error) { - return nil, errors.New("not implemented") -} -func (ls *mockLayerStore) GetMountID(string) (string, error) { - return "", errors.New("not implemented") -} - -func (ls *mockLayerStore) Cleanup() error { - return nil -} - -func (ls *mockLayerStore) DriverStatus() [][2]string { - return [][2]string{} -} - -func (ls *mockLayerStore) DriverName() string { - return "mock" -} - -type mockDownloadDescriptor struct { - currentDownloads *int32 - id string - diffID layer.DiffID - registeredDiffID layer.DiffID - expectedDiffID layer.DiffID - simulateRetries int -} - -// Key returns the key used to deduplicate downloads. -func (d *mockDownloadDescriptor) Key() string { - return d.id -} - -// ID returns the ID for display purposes. -func (d *mockDownloadDescriptor) ID() string { - return d.id -} - -// DiffID should return the DiffID for this layer, or an error -// if it is unknown (for example, if it has not been downloaded -// before). -func (d *mockDownloadDescriptor) DiffID() (layer.DiffID, error) { - if d.diffID != "" { - return d.diffID, nil - } - return "", errors.New("no diffID available") -} - -func (d *mockDownloadDescriptor) Registered(diffID layer.DiffID) { - d.registeredDiffID = diffID -} - -func (d *mockDownloadDescriptor) mockTarStream() io.ReadCloser { - // The mock implementation returns the ID repeated 5 times as a tar - // stream instead of actual tar data. The data is ignored except for - // computing IDs. - return ioutil.NopCloser(bytes.NewBuffer([]byte(d.id + d.id + d.id + d.id + d.id))) -} - -// Download is called to perform the download. -func (d *mockDownloadDescriptor) Download(ctx context.Context, progressOutput progress.Output) (io.ReadCloser, int64, error) { - if d.currentDownloads != nil { - defer atomic.AddInt32(d.currentDownloads, -1) - - if atomic.AddInt32(d.currentDownloads, 1) > maxDownloadConcurrency { - return nil, 0, errors.New("concurrency limit exceeded") - } - } - - // Sleep a bit to simulate a time-consuming download. - for i := int64(0); i <= 10; i++ { - select { - case <-ctx.Done(): - return nil, 0, ctx.Err() - case <-time.After(10 * time.Millisecond): - progressOutput.WriteProgress(progress.Progress{ID: d.ID(), Action: "Downloading", Current: i, Total: 10}) - } - } - - if d.simulateRetries != 0 { - d.simulateRetries-- - return nil, 0, errors.New("simulating retry") - } - - return d.mockTarStream(), 0, nil -} - -func (d *mockDownloadDescriptor) Close() { -} - -func downloadDescriptors(currentDownloads *int32) []DownloadDescriptor { - return []DownloadDescriptor{ - &mockDownloadDescriptor{ - currentDownloads: currentDownloads, - id: "id1", - expectedDiffID: layer.DiffID("sha256:68e2c75dc5c78ea9240689c60d7599766c213ae210434c53af18470ae8c53ec1"), - }, - &mockDownloadDescriptor{ - currentDownloads: currentDownloads, - id: "id2", - expectedDiffID: layer.DiffID("sha256:64a636223116aa837973a5d9c2bdd17d9b204e4f95ac423e20e65dfbb3655473"), - }, - &mockDownloadDescriptor{ - currentDownloads: currentDownloads, - id: "id3", - expectedDiffID: layer.DiffID("sha256:58745a8bbd669c25213e9de578c4da5c8ee1c836b3581432c2b50e38a6753300"), - }, - &mockDownloadDescriptor{ - currentDownloads: currentDownloads, - id: "id2", - expectedDiffID: layer.DiffID("sha256:64a636223116aa837973a5d9c2bdd17d9b204e4f95ac423e20e65dfbb3655473"), - }, - &mockDownloadDescriptor{ - currentDownloads: currentDownloads, - id: "id4", - expectedDiffID: layer.DiffID("sha256:0dfb5b9577716cc173e95af7c10289322c29a6453a1718addc00c0c5b1330936"), - simulateRetries: 1, - }, - &mockDownloadDescriptor{ - currentDownloads: currentDownloads, - id: "id5", - expectedDiffID: layer.DiffID("sha256:0a5f25fa1acbc647f6112a6276735d0fa01e4ee2aa7ec33015e337350e1ea23d"), - }, - } -} - -func TestSuccessfulDownload(t *testing.T) { - // TODO Windows: Fix this unit text - if runtime.GOOS == "windows" { - t.Skip("Needs fixing on Windows") - } - layerStore := &mockLayerStore{make(map[layer.ChainID]*mockLayer)} - ldm := NewLayerDownloadManager(layerStore, maxDownloadConcurrency) - - progressChan := make(chan progress.Progress) - progressDone := make(chan struct{}) - receivedProgress := make(map[string]progress.Progress) - - go func() { - for p := range progressChan { - receivedProgress[p.ID] = p - } - close(progressDone) - }() - - var currentDownloads int32 - descriptors := downloadDescriptors(¤tDownloads) - - firstDescriptor := descriptors[0].(*mockDownloadDescriptor) - - // Pre-register the first layer to simulate an already-existing layer - l, err := layerStore.Register(firstDescriptor.mockTarStream(), "") - if err != nil { - t.Fatal(err) - } - firstDescriptor.diffID = l.DiffID() - - rootFS, releaseFunc, err := ldm.Download(context.Background(), *image.NewRootFS(), descriptors, progress.ChanOutput(progressChan)) - if err != nil { - t.Fatalf("download error: %v", err) - } - - releaseFunc() - - close(progressChan) - <-progressDone - - if len(rootFS.DiffIDs) != len(descriptors) { - t.Fatal("got wrong number of diffIDs in rootfs") - } - - for i, d := range descriptors { - descriptor := d.(*mockDownloadDescriptor) - - if descriptor.diffID != "" { - if receivedProgress[d.ID()].Action != "Already exists" { - t.Fatalf("did not get 'Already exists' message for %v", d.ID()) - } - } else if receivedProgress[d.ID()].Action != "Pull complete" { - t.Fatalf("did not get 'Pull complete' message for %v", d.ID()) - } - - if rootFS.DiffIDs[i] != descriptor.expectedDiffID { - t.Fatalf("rootFS item %d has the wrong diffID (expected: %v got: %v)", i, descriptor.expectedDiffID, rootFS.DiffIDs[i]) - } - - if descriptor.diffID == "" && descriptor.registeredDiffID != rootFS.DiffIDs[i] { - t.Fatal("diffID mismatch between rootFS and Registered callback") - } - } -} - -func TestCancelledDownload(t *testing.T) { - ldm := NewLayerDownloadManager(&mockLayerStore{make(map[layer.ChainID]*mockLayer)}, maxDownloadConcurrency) - - progressChan := make(chan progress.Progress) - progressDone := make(chan struct{}) - - go func() { - for range progressChan { - } - close(progressDone) - }() - - ctx, cancel := context.WithCancel(context.Background()) - - go func() { - <-time.After(time.Millisecond) - cancel() - }() - - descriptors := downloadDescriptors(nil) - _, _, err := ldm.Download(ctx, *image.NewRootFS(), descriptors, progress.ChanOutput(progressChan)) - if err != context.Canceled { - t.Fatal("expected download to be cancelled") - } - - close(progressChan) - <-progressDone -} diff --git a/vendor/github.com/docker/docker/distribution/xfer/transfer.go b/vendor/github.com/docker/docker/distribution/xfer/transfer.go deleted file mode 100644 index 14f15660a..000000000 --- a/vendor/github.com/docker/docker/distribution/xfer/transfer.go +++ /dev/null @@ -1,401 +0,0 @@ -package xfer - -import ( - "runtime" - "sync" - - "github.com/docker/docker/pkg/progress" - "golang.org/x/net/context" -) - -// DoNotRetry is an error wrapper indicating that the error cannot be resolved -// with a retry. -type DoNotRetry struct { - Err error -} - -// Error returns the stringified representation of the encapsulated error. -func (e DoNotRetry) Error() string { - return e.Err.Error() -} - -// Watcher is returned by Watch and can be passed to Release to stop watching. -type Watcher struct { - // signalChan is used to signal to the watcher goroutine that - // new progress information is available, or that the transfer - // has finished. - signalChan chan struct{} - // releaseChan signals to the watcher goroutine that the watcher - // should be detached. - releaseChan chan struct{} - // running remains open as long as the watcher is watching the - // transfer. It gets closed if the transfer finishes or the - // watcher is detached. - running chan struct{} -} - -// Transfer represents an in-progress transfer. -type Transfer interface { - Watch(progressOutput progress.Output) *Watcher - Release(*Watcher) - Context() context.Context - Close() - Done() <-chan struct{} - Released() <-chan struct{} - Broadcast(masterProgressChan <-chan progress.Progress) -} - -type transfer struct { - mu sync.Mutex - - ctx context.Context - cancel context.CancelFunc - - // watchers keeps track of the goroutines monitoring progress output, - // indexed by the channels that release them. - watchers map[chan struct{}]*Watcher - - // lastProgress is the most recently received progress event. - lastProgress progress.Progress - // hasLastProgress is true when lastProgress has been set. - hasLastProgress bool - - // running remains open as long as the transfer is in progress. - running chan struct{} - // released stays open until all watchers release the transfer and - // the transfer is no longer tracked by the transfer manager. - released chan struct{} - - // broadcastDone is true if the master progress channel has closed. - broadcastDone bool - // closed is true if Close has been called - closed bool - // broadcastSyncChan allows watchers to "ping" the broadcasting - // goroutine to wait for it for deplete its input channel. This ensures - // a detaching watcher won't miss an event that was sent before it - // started detaching. - broadcastSyncChan chan struct{} -} - -// NewTransfer creates a new transfer. -func NewTransfer() Transfer { - t := &transfer{ - watchers: make(map[chan struct{}]*Watcher), - running: make(chan struct{}), - released: make(chan struct{}), - broadcastSyncChan: make(chan struct{}), - } - - // This uses context.Background instead of a caller-supplied context - // so that a transfer won't be cancelled automatically if the client - // which requested it is ^C'd (there could be other viewers). - t.ctx, t.cancel = context.WithCancel(context.Background()) - - return t -} - -// Broadcast copies the progress and error output to all viewers. -func (t *transfer) Broadcast(masterProgressChan <-chan progress.Progress) { - for { - var ( - p progress.Progress - ok bool - ) - select { - case p, ok = <-masterProgressChan: - default: - // We've depleted the channel, so now we can handle - // reads on broadcastSyncChan to let detaching watchers - // know we're caught up. - select { - case <-t.broadcastSyncChan: - continue - case p, ok = <-masterProgressChan: - } - } - - t.mu.Lock() - if ok { - t.lastProgress = p - t.hasLastProgress = true - for _, w := range t.watchers { - select { - case w.signalChan <- struct{}{}: - default: - } - } - } else { - t.broadcastDone = true - } - t.mu.Unlock() - if !ok { - close(t.running) - return - } - } -} - -// Watch adds a watcher to the transfer. The supplied channel gets progress -// updates and is closed when the transfer finishes. -func (t *transfer) Watch(progressOutput progress.Output) *Watcher { - t.mu.Lock() - defer t.mu.Unlock() - - w := &Watcher{ - releaseChan: make(chan struct{}), - signalChan: make(chan struct{}), - running: make(chan struct{}), - } - - t.watchers[w.releaseChan] = w - - if t.broadcastDone { - close(w.running) - return w - } - - go func() { - defer func() { - close(w.running) - }() - var ( - done bool - lastWritten progress.Progress - hasLastWritten bool - ) - for { - t.mu.Lock() - hasLastProgress := t.hasLastProgress - lastProgress := t.lastProgress - t.mu.Unlock() - - // Make sure we don't write the last progress item - // twice. - if hasLastProgress && (!done || !hasLastWritten || lastProgress != lastWritten) { - progressOutput.WriteProgress(lastProgress) - lastWritten = lastProgress - hasLastWritten = true - } - - if done { - return - } - - select { - case <-w.signalChan: - case <-w.releaseChan: - done = true - // Since the watcher is going to detach, make - // sure the broadcaster is caught up so we - // don't miss anything. - select { - case t.broadcastSyncChan <- struct{}{}: - case <-t.running: - } - case <-t.running: - done = true - } - } - }() - - return w -} - -// Release is the inverse of Watch; indicating that the watcher no longer wants -// to be notified about the progress of the transfer. All calls to Watch must -// be paired with later calls to Release so that the lifecycle of the transfer -// is properly managed. -func (t *transfer) Release(watcher *Watcher) { - t.mu.Lock() - delete(t.watchers, watcher.releaseChan) - - if len(t.watchers) == 0 { - if t.closed { - // released may have been closed already if all - // watchers were released, then another one was added - // while waiting for a previous watcher goroutine to - // finish. - select { - case <-t.released: - default: - close(t.released) - } - } else { - t.cancel() - } - } - t.mu.Unlock() - - close(watcher.releaseChan) - // Block until the watcher goroutine completes - <-watcher.running -} - -// Done returns a channel which is closed if the transfer completes or is -// cancelled. Note that having 0 watchers causes a transfer to be cancelled. -func (t *transfer) Done() <-chan struct{} { - // Note that this doesn't return t.ctx.Done() because that channel will - // be closed the moment Cancel is called, and we need to return a - // channel that blocks until a cancellation is actually acknowledged by - // the transfer function. - return t.running -} - -// Released returns a channel which is closed once all watchers release the -// transfer AND the transfer is no longer tracked by the transfer manager. -func (t *transfer) Released() <-chan struct{} { - return t.released -} - -// Context returns the context associated with the transfer. -func (t *transfer) Context() context.Context { - return t.ctx -} - -// Close is called by the transfer manager when the transfer is no longer -// being tracked. -func (t *transfer) Close() { - t.mu.Lock() - t.closed = true - if len(t.watchers) == 0 { - close(t.released) - } - t.mu.Unlock() -} - -// DoFunc is a function called by the transfer manager to actually perform -// a transfer. It should be non-blocking. It should wait until the start channel -// is closed before transferring any data. If the function closes inactive, that -// signals to the transfer manager that the job is no longer actively moving -// data - for example, it may be waiting for a dependent transfer to finish. -// This prevents it from taking up a slot. -type DoFunc func(progressChan chan<- progress.Progress, start <-chan struct{}, inactive chan<- struct{}) Transfer - -// TransferManager is used by LayerDownloadManager and LayerUploadManager to -// schedule and deduplicate transfers. It is up to the TransferManager -// implementation to make the scheduling and concurrency decisions. -type TransferManager interface { - // Transfer checks if a transfer with the given key is in progress. If - // so, it returns progress and error output from that transfer. - // Otherwise, it will call xferFunc to initiate the transfer. - Transfer(key string, xferFunc DoFunc, progressOutput progress.Output) (Transfer, *Watcher) - // SetConcurrency set the concurrencyLimit so that it is adjustable daemon reload - SetConcurrency(concurrency int) -} - -type transferManager struct { - mu sync.Mutex - - concurrencyLimit int - activeTransfers int - transfers map[string]Transfer - waitingTransfers []chan struct{} -} - -// NewTransferManager returns a new TransferManager. -func NewTransferManager(concurrencyLimit int) TransferManager { - return &transferManager{ - concurrencyLimit: concurrencyLimit, - transfers: make(map[string]Transfer), - } -} - -// SetConcurrency set the concurrencyLimit -func (tm *transferManager) SetConcurrency(concurrency int) { - tm.mu.Lock() - tm.concurrencyLimit = concurrency - tm.mu.Unlock() -} - -// Transfer checks if a transfer matching the given key is in progress. If not, -// it starts one by calling xferFunc. The caller supplies a channel which -// receives progress output from the transfer. -func (tm *transferManager) Transfer(key string, xferFunc DoFunc, progressOutput progress.Output) (Transfer, *Watcher) { - tm.mu.Lock() - defer tm.mu.Unlock() - - for { - xfer, present := tm.transfers[key] - if !present { - break - } - // Transfer is already in progress. - watcher := xfer.Watch(progressOutput) - - select { - case <-xfer.Context().Done(): - // We don't want to watch a transfer that has been cancelled. - // Wait for it to be removed from the map and try again. - xfer.Release(watcher) - tm.mu.Unlock() - // The goroutine that removes this transfer from the - // map is also waiting for xfer.Done(), so yield to it. - // This could be avoided by adding a Closed method - // to Transfer to allow explicitly waiting for it to be - // removed the map, but forcing a scheduling round in - // this very rare case seems better than bloating the - // interface definition. - runtime.Gosched() - <-xfer.Done() - tm.mu.Lock() - default: - return xfer, watcher - } - } - - start := make(chan struct{}) - inactive := make(chan struct{}) - - if tm.concurrencyLimit == 0 || tm.activeTransfers < tm.concurrencyLimit { - close(start) - tm.activeTransfers++ - } else { - tm.waitingTransfers = append(tm.waitingTransfers, start) - } - - masterProgressChan := make(chan progress.Progress) - xfer := xferFunc(masterProgressChan, start, inactive) - watcher := xfer.Watch(progressOutput) - go xfer.Broadcast(masterProgressChan) - tm.transfers[key] = xfer - - // When the transfer is finished, remove from the map. - go func() { - for { - select { - case <-inactive: - tm.mu.Lock() - tm.inactivate(start) - tm.mu.Unlock() - inactive = nil - case <-xfer.Done(): - tm.mu.Lock() - if inactive != nil { - tm.inactivate(start) - } - delete(tm.transfers, key) - tm.mu.Unlock() - xfer.Close() - return - } - } - }() - - return xfer, watcher -} - -func (tm *transferManager) inactivate(start chan struct{}) { - // If the transfer was started, remove it from the activeTransfers - // count. - select { - case <-start: - // Start next transfer if any are waiting - if len(tm.waitingTransfers) != 0 { - close(tm.waitingTransfers[0]) - tm.waitingTransfers = tm.waitingTransfers[1:] - } else { - tm.activeTransfers-- - } - default: - } -} diff --git a/vendor/github.com/docker/docker/distribution/xfer/transfer_test.go b/vendor/github.com/docker/docker/distribution/xfer/transfer_test.go deleted file mode 100644 index 6c50ce352..000000000 --- a/vendor/github.com/docker/docker/distribution/xfer/transfer_test.go +++ /dev/null @@ -1,410 +0,0 @@ -package xfer - -import ( - "sync/atomic" - "testing" - "time" - - "github.com/docker/docker/pkg/progress" -) - -func TestTransfer(t *testing.T) { - makeXferFunc := func(id string) DoFunc { - return func(progressChan chan<- progress.Progress, start <-chan struct{}, inactive chan<- struct{}) Transfer { - select { - case <-start: - default: - t.Fatalf("transfer function not started even though concurrency limit not reached") - } - - xfer := NewTransfer() - go func() { - for i := 0; i <= 10; i++ { - progressChan <- progress.Progress{ID: id, Action: "testing", Current: int64(i), Total: 10} - time.Sleep(10 * time.Millisecond) - } - close(progressChan) - }() - return xfer - } - } - - tm := NewTransferManager(5) - progressChan := make(chan progress.Progress) - progressDone := make(chan struct{}) - receivedProgress := make(map[string]int64) - - go func() { - for p := range progressChan { - val, present := receivedProgress[p.ID] - if present && p.Current <= val { - t.Fatalf("got unexpected progress value: %d (expected %d)", p.Current, val+1) - } - receivedProgress[p.ID] = p.Current - } - close(progressDone) - }() - - // Start a few transfers - ids := []string{"id1", "id2", "id3"} - xfers := make([]Transfer, len(ids)) - watchers := make([]*Watcher, len(ids)) - for i, id := range ids { - xfers[i], watchers[i] = tm.Transfer(id, makeXferFunc(id), progress.ChanOutput(progressChan)) - } - - for i, xfer := range xfers { - <-xfer.Done() - xfer.Release(watchers[i]) - } - close(progressChan) - <-progressDone - - for _, id := range ids { - if receivedProgress[id] != 10 { - t.Fatalf("final progress value %d instead of 10", receivedProgress[id]) - } - } -} - -func TestConcurrencyLimit(t *testing.T) { - concurrencyLimit := 3 - var runningJobs int32 - - makeXferFunc := func(id string) DoFunc { - return func(progressChan chan<- progress.Progress, start <-chan struct{}, inactive chan<- struct{}) Transfer { - xfer := NewTransfer() - go func() { - <-start - totalJobs := atomic.AddInt32(&runningJobs, 1) - if int(totalJobs) > concurrencyLimit { - t.Fatalf("too many jobs running") - } - for i := 0; i <= 10; i++ { - progressChan <- progress.Progress{ID: id, Action: "testing", Current: int64(i), Total: 10} - time.Sleep(10 * time.Millisecond) - } - atomic.AddInt32(&runningJobs, -1) - close(progressChan) - }() - return xfer - } - } - - tm := NewTransferManager(concurrencyLimit) - progressChan := make(chan progress.Progress) - progressDone := make(chan struct{}) - receivedProgress := make(map[string]int64) - - go func() { - for p := range progressChan { - receivedProgress[p.ID] = p.Current - } - close(progressDone) - }() - - // Start more transfers than the concurrency limit - ids := []string{"id1", "id2", "id3", "id4", "id5", "id6", "id7", "id8"} - xfers := make([]Transfer, len(ids)) - watchers := make([]*Watcher, len(ids)) - for i, id := range ids { - xfers[i], watchers[i] = tm.Transfer(id, makeXferFunc(id), progress.ChanOutput(progressChan)) - } - - for i, xfer := range xfers { - <-xfer.Done() - xfer.Release(watchers[i]) - } - close(progressChan) - <-progressDone - - for _, id := range ids { - if receivedProgress[id] != 10 { - t.Fatalf("final progress value %d instead of 10", receivedProgress[id]) - } - } -} - -func TestInactiveJobs(t *testing.T) { - concurrencyLimit := 3 - var runningJobs int32 - testDone := make(chan struct{}) - - makeXferFunc := func(id string) DoFunc { - return func(progressChan chan<- progress.Progress, start <-chan struct{}, inactive chan<- struct{}) Transfer { - xfer := NewTransfer() - go func() { - <-start - totalJobs := atomic.AddInt32(&runningJobs, 1) - if int(totalJobs) > concurrencyLimit { - t.Fatalf("too many jobs running") - } - for i := 0; i <= 10; i++ { - progressChan <- progress.Progress{ID: id, Action: "testing", Current: int64(i), Total: 10} - time.Sleep(10 * time.Millisecond) - } - atomic.AddInt32(&runningJobs, -1) - close(inactive) - <-testDone - close(progressChan) - }() - return xfer - } - } - - tm := NewTransferManager(concurrencyLimit) - progressChan := make(chan progress.Progress) - progressDone := make(chan struct{}) - receivedProgress := make(map[string]int64) - - go func() { - for p := range progressChan { - receivedProgress[p.ID] = p.Current - } - close(progressDone) - }() - - // Start more transfers than the concurrency limit - ids := []string{"id1", "id2", "id3", "id4", "id5", "id6", "id7", "id8"} - xfers := make([]Transfer, len(ids)) - watchers := make([]*Watcher, len(ids)) - for i, id := range ids { - xfers[i], watchers[i] = tm.Transfer(id, makeXferFunc(id), progress.ChanOutput(progressChan)) - } - - close(testDone) - for i, xfer := range xfers { - <-xfer.Done() - xfer.Release(watchers[i]) - } - close(progressChan) - <-progressDone - - for _, id := range ids { - if receivedProgress[id] != 10 { - t.Fatalf("final progress value %d instead of 10", receivedProgress[id]) - } - } -} - -func TestWatchRelease(t *testing.T) { - ready := make(chan struct{}) - - makeXferFunc := func(id string) DoFunc { - return func(progressChan chan<- progress.Progress, start <-chan struct{}, inactive chan<- struct{}) Transfer { - xfer := NewTransfer() - go func() { - defer func() { - close(progressChan) - }() - <-ready - for i := int64(0); ; i++ { - select { - case <-time.After(10 * time.Millisecond): - case <-xfer.Context().Done(): - return - } - progressChan <- progress.Progress{ID: id, Action: "testing", Current: i, Total: 10} - } - }() - return xfer - } - } - - tm := NewTransferManager(5) - - type watcherInfo struct { - watcher *Watcher - progressChan chan progress.Progress - progressDone chan struct{} - receivedFirstProgress chan struct{} - } - - progressConsumer := func(w watcherInfo) { - first := true - for range w.progressChan { - if first { - close(w.receivedFirstProgress) - } - first = false - } - close(w.progressDone) - } - - // Start a transfer - watchers := make([]watcherInfo, 5) - var xfer Transfer - watchers[0].progressChan = make(chan progress.Progress) - watchers[0].progressDone = make(chan struct{}) - watchers[0].receivedFirstProgress = make(chan struct{}) - xfer, watchers[0].watcher = tm.Transfer("id1", makeXferFunc("id1"), progress.ChanOutput(watchers[0].progressChan)) - go progressConsumer(watchers[0]) - - // Give it multiple watchers - for i := 1; i != len(watchers); i++ { - watchers[i].progressChan = make(chan progress.Progress) - watchers[i].progressDone = make(chan struct{}) - watchers[i].receivedFirstProgress = make(chan struct{}) - watchers[i].watcher = xfer.Watch(progress.ChanOutput(watchers[i].progressChan)) - go progressConsumer(watchers[i]) - } - - // Now that the watchers are set up, allow the transfer goroutine to - // proceed. - close(ready) - - // Confirm that each watcher gets progress output. - for _, w := range watchers { - <-w.receivedFirstProgress - } - - // Release one watcher every 5ms - for _, w := range watchers { - xfer.Release(w.watcher) - <-time.After(5 * time.Millisecond) - } - - // Now that all watchers have been released, Released() should - // return a closed channel. - <-xfer.Released() - - // Done() should return a closed channel because the xfer func returned - // due to cancellation. - <-xfer.Done() - - for _, w := range watchers { - close(w.progressChan) - <-w.progressDone - } -} - -func TestWatchFinishedTransfer(t *testing.T) { - makeXferFunc := func(id string) DoFunc { - return func(progressChan chan<- progress.Progress, start <-chan struct{}, inactive chan<- struct{}) Transfer { - xfer := NewTransfer() - go func() { - // Finish immediately - close(progressChan) - }() - return xfer - } - } - - tm := NewTransferManager(5) - - // Start a transfer - watchers := make([]*Watcher, 3) - var xfer Transfer - xfer, watchers[0] = tm.Transfer("id1", makeXferFunc("id1"), progress.ChanOutput(make(chan progress.Progress))) - - // Give it a watcher immediately - watchers[1] = xfer.Watch(progress.ChanOutput(make(chan progress.Progress))) - - // Wait for the transfer to complete - <-xfer.Done() - - // Set up another watcher - watchers[2] = xfer.Watch(progress.ChanOutput(make(chan progress.Progress))) - - // Release the watchers - for _, w := range watchers { - xfer.Release(w) - } - - // Now that all watchers have been released, Released() should - // return a closed channel. - <-xfer.Released() -} - -func TestDuplicateTransfer(t *testing.T) { - ready := make(chan struct{}) - - var xferFuncCalls int32 - - makeXferFunc := func(id string) DoFunc { - return func(progressChan chan<- progress.Progress, start <-chan struct{}, inactive chan<- struct{}) Transfer { - atomic.AddInt32(&xferFuncCalls, 1) - xfer := NewTransfer() - go func() { - defer func() { - close(progressChan) - }() - <-ready - for i := int64(0); ; i++ { - select { - case <-time.After(10 * time.Millisecond): - case <-xfer.Context().Done(): - return - } - progressChan <- progress.Progress{ID: id, Action: "testing", Current: i, Total: 10} - } - }() - return xfer - } - } - - tm := NewTransferManager(5) - - type transferInfo struct { - xfer Transfer - watcher *Watcher - progressChan chan progress.Progress - progressDone chan struct{} - receivedFirstProgress chan struct{} - } - - progressConsumer := func(t transferInfo) { - first := true - for range t.progressChan { - if first { - close(t.receivedFirstProgress) - } - first = false - } - close(t.progressDone) - } - - // Try to start multiple transfers with the same ID - transfers := make([]transferInfo, 5) - for i := range transfers { - t := &transfers[i] - t.progressChan = make(chan progress.Progress) - t.progressDone = make(chan struct{}) - t.receivedFirstProgress = make(chan struct{}) - t.xfer, t.watcher = tm.Transfer("id1", makeXferFunc("id1"), progress.ChanOutput(t.progressChan)) - go progressConsumer(*t) - } - - // Allow the transfer goroutine to proceed. - close(ready) - - // Confirm that each watcher gets progress output. - for _, t := range transfers { - <-t.receivedFirstProgress - } - - // Confirm that the transfer function was called exactly once. - if xferFuncCalls != 1 { - t.Fatal("transfer function wasn't called exactly once") - } - - // Release one watcher every 5ms - for _, t := range transfers { - t.xfer.Release(t.watcher) - <-time.After(5 * time.Millisecond) - } - - for _, t := range transfers { - // Now that all watchers have been released, Released() should - // return a closed channel. - <-t.xfer.Released() - // Done() should return a closed channel because the xfer func returned - // due to cancellation. - <-t.xfer.Done() - } - - for _, t := range transfers { - close(t.progressChan) - <-t.progressDone - } -} diff --git a/vendor/github.com/docker/docker/distribution/xfer/upload.go b/vendor/github.com/docker/docker/distribution/xfer/upload.go deleted file mode 100644 index ad3398369..000000000 --- a/vendor/github.com/docker/docker/distribution/xfer/upload.go +++ /dev/null @@ -1,168 +0,0 @@ -package xfer - -import ( - "errors" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/progress" - "golang.org/x/net/context" -) - -const maxUploadAttempts = 5 - -// LayerUploadManager provides task management and progress reporting for -// uploads. -type LayerUploadManager struct { - tm TransferManager -} - -// SetConcurrency set the max concurrent uploads for each push -func (lum *LayerUploadManager) SetConcurrency(concurrency int) { - lum.tm.SetConcurrency(concurrency) -} - -// NewLayerUploadManager returns a new LayerUploadManager. -func NewLayerUploadManager(concurrencyLimit int) *LayerUploadManager { - return &LayerUploadManager{ - tm: NewTransferManager(concurrencyLimit), - } -} - -type uploadTransfer struct { - Transfer - - remoteDescriptor distribution.Descriptor - err error -} - -// An UploadDescriptor references a layer that may need to be uploaded. -type UploadDescriptor interface { - // Key returns the key used to deduplicate uploads. - Key() string - // ID returns the ID for display purposes. - ID() string - // DiffID should return the DiffID for this layer. - DiffID() layer.DiffID - // Upload is called to perform the Upload. - Upload(ctx context.Context, progressOutput progress.Output) (distribution.Descriptor, error) - // SetRemoteDescriptor provides the distribution.Descriptor that was - // returned by Upload. This descriptor is not to be confused with - // the UploadDescriptor interface, which is used for internally - // identifying layers that are being uploaded. - SetRemoteDescriptor(descriptor distribution.Descriptor) -} - -// Upload is a blocking function which ensures the listed layers are present on -// the remote registry. It uses the string returned by the Key method to -// deduplicate uploads. -func (lum *LayerUploadManager) Upload(ctx context.Context, layers []UploadDescriptor, progressOutput progress.Output) error { - var ( - uploads []*uploadTransfer - dedupDescriptors = make(map[string]*uploadTransfer) - ) - - for _, descriptor := range layers { - progress.Update(progressOutput, descriptor.ID(), "Preparing") - - key := descriptor.Key() - if _, present := dedupDescriptors[key]; present { - continue - } - - xferFunc := lum.makeUploadFunc(descriptor) - upload, watcher := lum.tm.Transfer(descriptor.Key(), xferFunc, progressOutput) - defer upload.Release(watcher) - uploads = append(uploads, upload.(*uploadTransfer)) - dedupDescriptors[key] = upload.(*uploadTransfer) - } - - for _, upload := range uploads { - select { - case <-ctx.Done(): - return ctx.Err() - case <-upload.Transfer.Done(): - if upload.err != nil { - return upload.err - } - } - } - for _, l := range layers { - l.SetRemoteDescriptor(dedupDescriptors[l.Key()].remoteDescriptor) - } - - return nil -} - -func (lum *LayerUploadManager) makeUploadFunc(descriptor UploadDescriptor) DoFunc { - return func(progressChan chan<- progress.Progress, start <-chan struct{}, inactive chan<- struct{}) Transfer { - u := &uploadTransfer{ - Transfer: NewTransfer(), - } - - go func() { - defer func() { - close(progressChan) - }() - - progressOutput := progress.ChanOutput(progressChan) - - select { - case <-start: - default: - progress.Update(progressOutput, descriptor.ID(), "Waiting") - <-start - } - - retries := 0 - for { - remoteDescriptor, err := descriptor.Upload(u.Transfer.Context(), progressOutput) - if err == nil { - u.remoteDescriptor = remoteDescriptor - break - } - - // If an error was returned because the context - // was cancelled, we shouldn't retry. - select { - case <-u.Transfer.Context().Done(): - u.err = err - return - default: - } - - retries++ - if _, isDNR := err.(DoNotRetry); isDNR || retries == maxUploadAttempts { - logrus.Errorf("Upload failed: %v", err) - u.err = err - return - } - - logrus.Errorf("Upload failed, retrying: %v", err) - delay := retries * 5 - ticker := time.NewTicker(time.Second) - - selectLoop: - for { - progress.Updatef(progressOutput, descriptor.ID(), "Retrying in %d second%s", delay, (map[bool]string{true: "s"})[delay != 1]) - select { - case <-ticker.C: - delay-- - if delay == 0 { - ticker.Stop() - break selectLoop - } - case <-u.Transfer.Context().Done(): - ticker.Stop() - u.err = errors.New("upload cancelled during retry delay") - return - } - } - } - }() - - return u - } -} diff --git a/vendor/github.com/docker/docker/distribution/xfer/upload_test.go b/vendor/github.com/docker/docker/distribution/xfer/upload_test.go deleted file mode 100644 index 16bd18733..000000000 --- a/vendor/github.com/docker/docker/distribution/xfer/upload_test.go +++ /dev/null @@ -1,134 +0,0 @@ -package xfer - -import ( - "errors" - "sync/atomic" - "testing" - "time" - - "github.com/docker/distribution" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/progress" - "golang.org/x/net/context" -) - -const maxUploadConcurrency = 3 - -type mockUploadDescriptor struct { - currentUploads *int32 - diffID layer.DiffID - simulateRetries int -} - -// Key returns the key used to deduplicate downloads. -func (u *mockUploadDescriptor) Key() string { - return u.diffID.String() -} - -// ID returns the ID for display purposes. -func (u *mockUploadDescriptor) ID() string { - return u.diffID.String() -} - -// DiffID should return the DiffID for this layer. -func (u *mockUploadDescriptor) DiffID() layer.DiffID { - return u.diffID -} - -// SetRemoteDescriptor is not used in the mock. -func (u *mockUploadDescriptor) SetRemoteDescriptor(remoteDescriptor distribution.Descriptor) { -} - -// Upload is called to perform the upload. -func (u *mockUploadDescriptor) Upload(ctx context.Context, progressOutput progress.Output) (distribution.Descriptor, error) { - if u.currentUploads != nil { - defer atomic.AddInt32(u.currentUploads, -1) - - if atomic.AddInt32(u.currentUploads, 1) > maxUploadConcurrency { - return distribution.Descriptor{}, errors.New("concurrency limit exceeded") - } - } - - // Sleep a bit to simulate a time-consuming upload. - for i := int64(0); i <= 10; i++ { - select { - case <-ctx.Done(): - return distribution.Descriptor{}, ctx.Err() - case <-time.After(10 * time.Millisecond): - progressOutput.WriteProgress(progress.Progress{ID: u.ID(), Current: i, Total: 10}) - } - } - - if u.simulateRetries != 0 { - u.simulateRetries-- - return distribution.Descriptor{}, errors.New("simulating retry") - } - - return distribution.Descriptor{}, nil -} - -func uploadDescriptors(currentUploads *int32) []UploadDescriptor { - return []UploadDescriptor{ - &mockUploadDescriptor{currentUploads, layer.DiffID("sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"), 0}, - &mockUploadDescriptor{currentUploads, layer.DiffID("sha256:1515325234325236634634608943609283523908626098235490238423902343"), 0}, - &mockUploadDescriptor{currentUploads, layer.DiffID("sha256:6929356290463485374960346430698374523437683470934634534953453453"), 0}, - &mockUploadDescriptor{currentUploads, layer.DiffID("sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"), 0}, - &mockUploadDescriptor{currentUploads, layer.DiffID("sha256:8159352387436803946235346346368745389534789534897538734598734987"), 1}, - &mockUploadDescriptor{currentUploads, layer.DiffID("sha256:4637863963478346897346987346987346789346789364879364897364987346"), 0}, - } -} - -func TestSuccessfulUpload(t *testing.T) { - lum := NewLayerUploadManager(maxUploadConcurrency) - - progressChan := make(chan progress.Progress) - progressDone := make(chan struct{}) - receivedProgress := make(map[string]int64) - - go func() { - for p := range progressChan { - receivedProgress[p.ID] = p.Current - } - close(progressDone) - }() - - var currentUploads int32 - descriptors := uploadDescriptors(¤tUploads) - - err := lum.Upload(context.Background(), descriptors, progress.ChanOutput(progressChan)) - if err != nil { - t.Fatalf("upload error: %v", err) - } - - close(progressChan) - <-progressDone -} - -func TestCancelledUpload(t *testing.T) { - lum := NewLayerUploadManager(maxUploadConcurrency) - - progressChan := make(chan progress.Progress) - progressDone := make(chan struct{}) - - go func() { - for range progressChan { - } - close(progressDone) - }() - - ctx, cancel := context.WithCancel(context.Background()) - - go func() { - <-time.After(time.Millisecond) - cancel() - }() - - descriptors := uploadDescriptors(nil) - err := lum.Upload(ctx, descriptors, progress.ChanOutput(progressChan)) - if err != context.Canceled { - t.Fatal("expected upload to be cancelled") - } - - close(progressChan) - <-progressDone -} diff --git a/vendor/github.com/docker/docker/dockerversion/useragent.go b/vendor/github.com/docker/docker/dockerversion/useragent.go deleted file mode 100644 index d2a891c4d..000000000 --- a/vendor/github.com/docker/docker/dockerversion/useragent.go +++ /dev/null @@ -1,74 +0,0 @@ -package dockerversion - -import ( - "fmt" - "runtime" - - "github.com/docker/docker/api/server/httputils" - "github.com/docker/docker/pkg/parsers/kernel" - "github.com/docker/docker/pkg/useragent" - "golang.org/x/net/context" -) - -// DockerUserAgent is the User-Agent the Docker client uses to identify itself. -// In accordance with RFC 7231 (5.5.3) is of the form: -// [docker client's UA] UpstreamClient([upstream client's UA]) -func DockerUserAgent(ctx context.Context) string { - httpVersion := make([]useragent.VersionInfo, 0, 6) - httpVersion = append(httpVersion, useragent.VersionInfo{Name: "docker", Version: Version}) - httpVersion = append(httpVersion, useragent.VersionInfo{Name: "go", Version: runtime.Version()}) - httpVersion = append(httpVersion, useragent.VersionInfo{Name: "git-commit", Version: GitCommit}) - if kernelVersion, err := kernel.GetKernelVersion(); err == nil { - httpVersion = append(httpVersion, useragent.VersionInfo{Name: "kernel", Version: kernelVersion.String()}) - } - httpVersion = append(httpVersion, useragent.VersionInfo{Name: "os", Version: runtime.GOOS}) - httpVersion = append(httpVersion, useragent.VersionInfo{Name: "arch", Version: runtime.GOARCH}) - - dockerUA := useragent.AppendVersions("", httpVersion...) - upstreamUA := getUserAgentFromContext(ctx) - if len(upstreamUA) > 0 { - ret := insertUpstreamUserAgent(upstreamUA, dockerUA) - return ret - } - return dockerUA -} - -// getUserAgentFromContext returns the previously saved user-agent context stored in ctx, if one exists -func getUserAgentFromContext(ctx context.Context) string { - var upstreamUA string - if ctx != nil { - var ki interface{} = ctx.Value(httputils.UAStringKey) - if ki != nil { - upstreamUA = ctx.Value(httputils.UAStringKey).(string) - } - } - return upstreamUA -} - -// escapeStr returns s with every rune in charsToEscape escaped by a backslash -func escapeStr(s string, charsToEscape string) string { - var ret string - for _, currRune := range s { - appended := false - for _, escapeableRune := range charsToEscape { - if currRune == escapeableRune { - ret += `\` + string(currRune) - appended = true - break - } - } - if !appended { - ret += string(currRune) - } - } - return ret -} - -// insertUpstreamUserAgent adds the upstream client useragent to create a user-agent -// string of the form: -// $dockerUA UpstreamClient($upstreamUA) -func insertUpstreamUserAgent(upstreamUA string, dockerUA string) string { - charsToEscape := `();\` - upstreamUAEscaped := escapeStr(upstreamUA, charsToEscape) - return fmt.Sprintf("%s UpstreamClient(%s)", dockerUA, upstreamUAEscaped) -} diff --git a/vendor/github.com/docker/docker/dockerversion/version_lib.go b/vendor/github.com/docker/docker/dockerversion/version_lib.go deleted file mode 100644 index 33f77d3ce..000000000 --- a/vendor/github.com/docker/docker/dockerversion/version_lib.go +++ /dev/null @@ -1,16 +0,0 @@ -// +build !autogen - -// Package dockerversion is auto-generated at build-time -package dockerversion - -// Default build-time variable for library-import. -// This file is overridden on build with build-time informations. -const ( - GitCommit string = "library-import" - Version string = "library-import" - BuildTime string = "library-import" - IAmStatic string = "library-import" - ContainerdCommitID string = "library-import" - RuncCommitID string = "library-import" - InitCommitID string = "library-import" -) diff --git a/vendor/github.com/docker/docker/docs/README.md b/vendor/github.com/docker/docker/docs/README.md deleted file mode 100644 index da9309307..000000000 --- a/vendor/github.com/docker/docker/docs/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# The non-reference docs have been moved! - - - -The documentation for Docker Engine has been merged into -[the general documentation repo](https://github.com/docker/docker.github.io). - -See the [README](https://github.com/docker/docker.github.io/blob/master/README.md) -for instructions on contributing to and building the documentation. - -If you'd like to edit the current published version of the Engine docs, -do it in the master branch here: -https://github.com/docker/docker.github.io/tree/master/engine - -If you need to document the functionality of an upcoming Engine release, -use the `vnext-engine` branch: -https://github.com/docker/docker.github.io/tree/vnext-engine/engine - -The reference docs have been left in docker/docker (this repo), which remains -the place to edit them. - -The docs in the general repo are open-source and we appreciate -your feedback and pull requests! diff --git a/vendor/github.com/docker/docker/docs/api/v1.18.md b/vendor/github.com/docker/docker/docs/api/v1.18.md deleted file mode 100644 index 0db0c0f91..000000000 --- a/vendor/github.com/docker/docker/docs/api/v1.18.md +++ /dev/null @@ -1,2156 +0,0 @@ ---- -title: "Engine API v1.18" -description: "API Documentation for Docker" -keywords: "API, Docker, rcli, REST, documentation" -redirect_from: -- /engine/reference/api/docker_remote_api_v1.18/ -- /reference/api/docker_remote_api_v1.18/ ---- - - - -## 1. Brief introduction - - - The daemon listens on `unix:///var/run/docker.sock` but you can - [Bind Docker to another host/port or a Unix socket](../reference/commandline/dockerd.md#bind-docker-to-another-host-port-or-a-unix-socket). - - The API tends to be REST, but for some complex commands, like `attach` - or `pull`, the HTTP connection is hijacked to transport `STDOUT`, - `STDIN` and `STDERR`. - -## 2. Endpoints - -### 2.1 Containers - -#### List containers - -`GET /containers/json` - -List containers - -**Example request**: - - GET /v1.18/containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "8dfafdbc3a40", - "Names":["/boring_feynman"], - "Image": "ubuntu:latest", - "Command": "echo 1", - "Created": 1367854155, - "Status": "Exit 0", - "Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}], - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "SizeRw": 12288, - "SizeRootFs": 0 - }, - { - "Id": "9cd87474be90", - "Names":["/coolName"], - "Image": "ubuntu:latest", - "Command": "echo 222222", - "Created": 1367854155, - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0 - }, - { - "Id": "3176a2479c92", - "Names":["/sleepy_dog"], - "Image": "ubuntu:latest", - "Command": "echo 3333333333333333", - "Created": 1367854154, - "Status": "Exit 0", - "Ports":[], - "Labels": {}, - "SizeRw":12288, - "SizeRootFs":0 - }, - { - "Id": "4cb07b47f9fb", - "Names":["/running_cat"], - "Image": "ubuntu:latest", - "Command": "echo 444444444444444444444444444444444", - "Created": 1367854152, - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0 - } - ] - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, Show all containers. - Only running containers are shown by default (i.e., this defaults to false) -- **limit** – Show `limit` last created - containers, include non-running ones. -- **since** – Show only containers created since Id, include - non-running ones. -- **before** – Show only containers created before Id, include - non-running ones. -- **size** – 1/True/true or 0/False/false, Show the containers - sizes -- **filters** - a JSON encoded value of the filters (a `map[string][]string`) to process on the containers list. Available filters: - - `exited=`; -- containers with exit code of `` ; - - `status=`(`restarting`|`running`|`paused`|`exited`) - - `label=key` or `label="key=value"` of a container label - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **500** – server error - -#### Create a container - -`POST /containers/create` - -Create a container - -**Example request**: - - POST /v1.18/containers/create HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "FOO=bar", - "BAZ=quux" - ], - "Cmd": [ - "date" - ], - "Entrypoint": null, - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "HostConfig": { - "Binds": ["/tmp:/tmp"], - "Links": ["redis3:redis"], - "LxcConf": {"lxc.utsname":"docker"}, - "Memory": 0, - "MemorySwap": 0, - "CpuShares": 512, - "CpusetCpus": "0,1", - "PidMode": "", - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsSearch": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "NetworkMode": "bridge", - "Devices": [], - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [], - "CgroupParent": "" - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id":"e90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **Hostname** - A string value containing the hostname to use for the - container. -- **Domainname** - A string value containing the domain name to use - for the container. -- **User** - A string value specifying the user inside the container. -- **AttachStdin** - Boolean value, attaches to `stdin`. -- **AttachStdout** - Boolean value, attaches to `stdout`. -- **AttachStderr** - Boolean value, attaches to `stderr`. -- **Tty** - Boolean value, Attach standard streams to a `tty`, including `stdin` if it is not closed. -- **OpenStdin** - Boolean value, opens `stdin`, -- **StdinOnce** - Boolean value, close `stdin` after the 1 attached client disconnects. -- **Env** - A list of environment variables in the form of `["VAR=value", ...]` -- **Labels** - Adds a map of labels to a container. To specify a map: `{"key":"value", ... }` -- **Cmd** - Command to run specified as a string or an array of strings. -- **Entrypoint** - Set the entry point for the container as a string or an array - of strings. -- **Image** - A string specifying the image name to use for the container. -- **Volumes** - An object mapping mount point paths (strings) inside the - container to empty objects. -- **WorkingDir** - A string specifying the working directory for commands to - run in. -- **NetworkDisabled** - Boolean value, when true disables networking for the - container -- **ExposedPorts** - An object mapping ports to an empty object in the form of: - `"ExposedPorts": { "/: {}" }` -- **HostConfig** - - **Binds** – A list of bind-mounts for this container. Each item is a string in one of these forms: - + `host-src:container-dest` to bind-mount a host path into the - container. Both `host-src`, and `container-dest` must be an - _absolute_ path. - + `host-src:container-dest:ro` to make the bind-mount read-only - inside the container. Both `host-src`, and `container-dest` must be - an _absolute_ path. - - **Links** - A list of links for the container. Each link entry should be - in the form of `container_name:alias`. - - **LxcConf** - LXC specific configurations. These configurations only - work when using the `lxc` execution driver. - - **Memory** - Memory limit in bytes. - - **MemorySwap** - Total memory limit (memory + swap); set `-1` to enable unlimited swap. - You must use this with `memory` and make the swap value larger than `memory`. - - **CpuShares** - An integer value containing the container's CPU Shares - (ie. the relative weight vs other containers). - - **CpusetCpus** - String value containing the `cgroups CpusetCpus` to use. - - **PidMode** - Set the PID (Process) Namespace mode for the container; - `"container:"`: joins another container's PID namespace - `"host"`: use the host's PID namespace inside the container - - **PortBindings** - A map of exposed container ports and the host port they - should map to. A JSON object in the form - `{ /: [{ "HostPort": "" }] }` - Take note that `port` is specified as a string and not an integer value. - - **PublishAllPorts** - Allocates a random host port for all of a container's - exposed ports. Specified as a boolean value. - - **Privileged** - Gives the container full access to the host. Specified as - a boolean value. - - **ReadonlyRootfs** - Mount the container's root filesystem as read only. - Specified as a boolean value. - - **Dns** - A list of DNS servers for the container to use. - - **DnsSearch** - A list of DNS search domains - - **ExtraHosts** - A list of hostnames/IP mappings to add to the - container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`. - - **VolumesFrom** - A list of volumes to inherit from another container. - Specified in the form `[:]` - - **CapAdd** - A list of kernel capabilities to add to the container. - - **Capdrop** - A list of kernel capabilities to drop from the container. - - **RestartPolicy** – The behavior to apply when the container exits. The - value is an object with a `Name` property of either `"always"` to - always restart or `"on-failure"` to restart only when the container - exit code is non-zero. If `on-failure` is used, `MaximumRetryCount` - controls the number of times to retry before giving up. - The default is not to restart. (optional) - An ever increasing delay (double the previous delay, starting at 100mS) - is added before each restart to prevent flooding the server. - - **NetworkMode** - Sets the networking mode for the container. Supported - values are: `bridge`, `host`, `none`, and `container:` - - **Devices** - A list of devices to add to the container specified as a JSON object in the - form - `{ "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}` - - **Ulimits** - A list of ulimits to set in the container, specified as - `{ "Name": , "Soft": , "Hard": }`, for example: - `Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }` - - **SecurityOpt**: A list of string values to customize labels for MLS - systems, such as SELinux. - - **LogConfig** - Log configuration for the container, specified as a JSON object in the form - `{ "Type": "", "Config": {"key1": "val1"}}`. - Available types: `json-file`, `syslog`, `journald`, `none`. - `json-file` logging driver. - - **CgroupParent** - Path to `cgroups` under which the container's `cgroup` is created. If the path is not absolute, the path is considered to be relative to the `cgroups` path of the init process. Cgroups are created if they do not already exist. - -**Query parameters**: - -- **name** – Assign the specified name to the container. Must - match `/?[a-zA-Z0-9_-]+`. - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such container -- **406** – impossible to attach (container not running) -- **409** – conflict -- **500** – server error - -#### Inspect a container - -`GET /containers/(id or name)/json` - -Return low-level information on the container `id` - -**Example request**: - - GET /v1.18/containers/4fa6e0f0c678/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "AppArmorProfile": "", - "Args": [ - "-c", - "exit 9" - ], - "Config": { - "AttachStderr": true, - "AttachStdin": false, - "AttachStdout": true, - "Cmd": [ - "/bin/sh", - "-c", - "exit 9" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts": null, - "Hostname": "ba033ac44011", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "MacAddress": "", - "NetworkDisabled": false, - "OnBuild": null, - "OpenStdin": false, - "PortSpecs": null, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": null, - "WorkingDir": "" - }, - "Created": "2015-01-06T15:47:31.485331387Z", - "Driver": "devicemapper", - "ExecDriver": "native-0.2", - "ExecIDs": null, - "HostConfig": { - "Binds": null, - "CapAdd": null, - "CapDrop": null, - "ContainerIDFile": "", - "CpusetCpus": "", - "CpuShares": 0, - "Devices": [], - "Dns": null, - "DnsSearch": null, - "ExtraHosts": null, - "IpcMode": "", - "Links": null, - "LxcConf": [], - "Memory": 0, - "MemorySwap": 0, - "NetworkMode": "bridge", - "PidMode": "", - "PortBindings": {}, - "Privileged": false, - "ReadonlyRootfs": false, - "PublishAllPorts": false, - "RestartPolicy": { - "MaximumRetryCount": 2, - "Name": "on-failure" - }, - "LogConfig": { - "Config": null, - "Type": "json-file" - }, - "SecurityOpt": null, - "VolumesFrom": null, - "Ulimits": [{}] - }, - "HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname", - "HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39", - "Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2", - "MountLabel": "", - "Name": "/boring_euclid", - "NetworkSettings": { - "Bridge": "", - "Gateway": "", - "IPAddress": "", - "IPPrefixLen": 0, - "MacAddress": "", - "PortMapping": null, - "Ports": null - }, - "Path": "/bin/sh", - "ProcessLabel": "", - "ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf", - "RestartCount": 1, - "State": { - "Error": "", - "ExitCode": 9, - "FinishedAt": "2015-01-06T15:47:32.080254511Z", - "OOMKilled": false, - "Paused": false, - "Pid": 0, - "Restarting": false, - "Running": true, - "StartedAt": "2015-01-06T15:47:32.072697474Z" - }, - "Volumes": {}, - "VolumesRW": {} - } - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### List processes running inside a container - -`GET /containers/(id or name)/top` - -List processes running inside the container `id`. On Unix systems this -is done by running the `ps` command. This endpoint is not -supported on Windows. - -**Example request**: - - GET /v1.18/containers/4fa6e0f0c678/top HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "UID", "PID", "PPID", "C", "STIME", "TTY", "TIME", "CMD" - ], - "Processes" : [ - [ - "root", "13642", "882", "0", "17:03", "pts/0", "00:00:00", "/bin/bash" - ], - [ - "root", "13735", "13642", "0", "17:06", "pts/0", "00:00:00", "sleep 10" - ] - ] - } - -**Example request**: - - GET /v1.18/containers/4fa6e0f0c678/top?ps_args=aux HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "USER","PID","%CPU","%MEM","VSZ","RSS","TTY","STAT","START","TIME","COMMAND" - ] - "Processes" : [ - [ - "root","13642","0.0","0.1","18172","3184","pts/0","Ss","17:03","0:00","/bin/bash" - ], - [ - "root","13895","0.0","0.0","4348","692","pts/0","S+","17:15","0:00","sleep 10" - ] - ], - } - -**Query parameters**: - -- **ps_args** – `ps` arguments to use (e.g., `aux`), defaults to `-ef` - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container logs - -`GET /containers/(id or name)/logs` - -Get `stdout` and `stderr` logs from the container ``id`` - -> **Note**: -> This endpoint works only for containers with the `json-file` or `journald` logging drivers. - -**Example request**: - - GET /v1.18/containers/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **follow** – 1/True/true or 0/False/false, return stream. Default `false`. -- **stdout** – 1/True/true or 0/False/false, show `stdout` log. Default `false`. -- **stderr** – 1/True/true or 0/False/false, show `stderr` log. Default `false`. -- **timestamps** – 1/True/true or 0/False/false, print timestamps for - every log line. Default `false`. -- **tail** – Output specified number of lines at the end of logs: `all` or ``. Default all. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **404** – no such container -- **500** – server error - -#### Inspect changes on a container's filesystem - -`GET /containers/(id or name)/changes` - -Inspect changes on container `id`'s filesystem - -**Example request**: - - GET /v1.18/containers/4fa6e0f0c678/changes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Path": "/dev", - "Kind": 0 - }, - { - "Path": "/dev/kmsg", - "Kind": 1 - }, - { - "Path": "/test", - "Kind": 1 - } - ] - -Values for `Kind`: - -- `0`: Modify -- `1`: Add -- `2`: Delete - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Export a container - -`GET /containers/(id or name)/export` - -Export the contents of container `id` - -**Example request**: - - GET /v1.18/containers/4fa6e0f0c678/export HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/octet-stream - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container stats based on resource usage - -`GET /containers/(id or name)/stats` - -This endpoint returns a live stream of a container's resource usage statistics. - -**Example request**: - - GET /v1.18/containers/redis1/stats HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "read" : "2015-01-08T22:57:31.547920715Z", - "network" : { - "rx_dropped" : 0, - "rx_bytes" : 648, - "rx_errors" : 0, - "tx_packets" : 8, - "tx_dropped" : 0, - "rx_packets" : 8, - "tx_errors" : 0, - "tx_bytes" : 648 - }, - "memory_stats" : { - "stats" : { - "total_pgmajfault" : 0, - "cache" : 0, - "mapped_file" : 0, - "total_inactive_file" : 0, - "pgpgout" : 414, - "rss" : 6537216, - "total_mapped_file" : 0, - "writeback" : 0, - "unevictable" : 0, - "pgpgin" : 477, - "total_unevictable" : 0, - "pgmajfault" : 0, - "total_rss" : 6537216, - "total_rss_huge" : 6291456, - "total_writeback" : 0, - "total_inactive_anon" : 0, - "rss_huge" : 6291456, - "hierarchical_memory_limit" : 67108864, - "total_pgfault" : 964, - "total_active_file" : 0, - "active_anon" : 6537216, - "total_active_anon" : 6537216, - "total_pgpgout" : 414, - "total_cache" : 0, - "inactive_anon" : 0, - "active_file" : 0, - "pgfault" : 964, - "inactive_file" : 0, - "total_pgpgin" : 477 - }, - "max_usage" : 6651904, - "usage" : 6537216, - "failcnt" : 0, - "limit" : 67108864 - }, - "blkio_stats" : {}, - "cpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 16970827, - 1839451, - 7107380, - 10571290 - ], - "usage_in_usermode" : 10000000, - "total_usage" : 36488948, - "usage_in_kernelmode" : 20000000 - }, - "system_cpu_usage" : 20091722000000000, - "throttling_data" : {} - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Resize a container TTY - -`POST /containers/(id or name)/resize?h=&w=` - -Resize the TTY for container with `id`. You must restart the container for the resize to take effect. - -**Example request**: - - POST /v1.18/containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **200** – no error -- **404** – No such container -- **500** – Cannot resize container - -#### Start a container - -`POST /containers/(id or name)/start` - -Start the container `id` - -> **Note**: -> For backwards compatibility, this endpoint accepts a `HostConfig` as JSON-encoded request body. -> See [create a container](#create-a-container) for details. - -**Example request**: - - POST /v1.18/containers/e90e34656806/start HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **304** – container already started -- **404** – no such container -- **500** – server error - -#### Stop a container - -`POST /containers/(id or name)/stop` - -Stop the container `id` - -**Example request**: - - POST /v1.18/containers/e90e34656806/stop?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **304** – container already stopped -- **404** – no such container -- **500** – server error - -#### Restart a container - -`POST /containers/(id or name)/restart` - -Restart the container `id` - -**Example request**: - - POST /v1.18/containers/e90e34656806/restart?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Kill a container - -`POST /containers/(id or name)/kill` - -Kill the container `id` - -**Example request**: - - POST /v1.18/containers/e90e34656806/kill HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **signal** - Signal to send to the container: integer or string like `SIGINT`. - When not set, `SIGKILL` is assumed and the call waits for the container to exit. - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Rename a container - -`POST /containers/(id or name)/rename` - -Rename the container `id` to a `new_name` - -**Example request**: - - POST /v1.18/containers/e90e34656806/rename?name=new_name HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **name** – new name for the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **409** - conflict name already assigned -- **500** – server error - -#### Pause a container - -`POST /containers/(id or name)/pause` - -Pause the container `id` - -**Example request**: - - POST /v1.18/containers/e90e34656806/pause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Unpause a container - -`POST /containers/(id or name)/unpause` - -Unpause the container `id` - -**Example request**: - - POST /v1.18/containers/e90e34656806/unpause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Attach to a container - -`POST /containers/(id or name)/attach` - -Attach to the container `id` - -**Example request**: - - POST /v1.18/containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -**Stream details**: - -When using the TTY setting is enabled in -[`POST /containers/create` -](#create-a-container), -the stream is the raw data from the process PTY and client's `stdin`. -When the TTY is disabled, then the stream is multiplexed to separate -`stdout` and `stderr`. - -The format is a **Header** and a **Payload** (frame). - -**HEADER** - -The header contains the information which the stream writes (`stdout` or -`stderr`). It also contains the size of the associated frame encoded in the -last four bytes (`uint32`). - -It is encoded on the first eight bytes like this: - - header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4} - -`STREAM_TYPE` can be: - -- 0: `stdin` (is written on `stdout`) -- 1: `stdout` -- 2: `stderr` - -`SIZE1, SIZE2, SIZE3, SIZE4` are the four bytes of -the `uint32` size encoded as big endian. - -**PAYLOAD** - -The payload is the raw stream. - -**IMPLEMENTATION** - -The simplest way to implement the Attach protocol is the following: - - 1. Read eight bytes. - 2. Choose `stdout` or `stderr` depending on the first byte. - 3. Extract the frame size from the last four bytes. - 4. Read the extracted size and output it on the correct output. - 5. Goto 1. - -#### Attach to a container (websocket) - -`GET /containers/(id or name)/attach/ws` - -Attach to the container `id` via websocket - -Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455) - -**Example request** - - GET /v1.18/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1 - -**Example response** - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -#### Wait a container - -`POST /containers/(id or name)/wait` - -Block until container `id` stops, then returns the exit code - -**Example request**: - - POST /v1.18/containers/16253994b7c4/wait HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"StatusCode": 0} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Remove a container - -`DELETE /containers/(id or name)` - -Remove the container `id` from the filesystem - -**Example request**: - - DELETE /v1.18/containers/16253994b7c4?v=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **v** – 1/True/true or 0/False/false, Remove the volumes - associated to the container. Default `false`. -- **force** - 1/True/true or 0/False/false, Kill then remove the container. - Default `false`. - -**Status codes**: - -- **204** – no error -- **400** – bad parameter -- **404** – no such container -- **409** – conflict -- **500** – server error - -#### Copy files or folders from a container - -`POST /containers/(id or name)/copy` - -Copy files or folders of container `id` - -**Example request**: - - POST /v1.18/containers/4fa6e0f0c678/copy HTTP/1.1 - Content-Type: application/json - - { - "Resource": "test.txt" - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### 2.2 Images - -#### List Images - -`GET /images/json` - -**Example request**: - - GET /v1.18/images/json?all=0 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "RepoTags": [ - "ubuntu:12.04", - "ubuntu:precise", - "ubuntu:latest" - ], - "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c", - "Created": 1365714795, - "Size": 131506275, - "VirtualSize": 131506275 - }, - { - "RepoTags": [ - "ubuntu:12.10", - "ubuntu:quantal" - ], - "ParentId": "27cf784147099545", - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Created": 1364102658, - "Size": 24653, - "VirtualSize": 180116135 - } - ] - -**Example request, with digest information**: - - GET /v1.18/images/json?digests=1 HTTP/1.1 - -**Example response, with digest information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Created": 1420064636, - "Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125", - "ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2", - "RepoDigests": [ - "localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags": [ - "localhost:5000/test/busybox:latest", - "playdate:latest" - ], - "Size": 0, - "VirtualSize": 2429728 - } - ] - -The response shows a single image `Id` associated with two repositories -(`RepoTags`): `localhost:5000/test/busybox`: and `playdate`. A caller can use -either of the `RepoTags` values `localhost:5000/test/busybox:latest` or -`playdate:latest` to reference the image. - -You can also use `RepoDigests` values to reference an image. In this response, -the array has only one reference and that is to the -`localhost:5000/test/busybox` repository; the `playdate` repository has no -digest. You can reference this digest using the value: -`localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...` - -See the `docker run` and `docker build` commands for examples of digest and tag -references on the command line. - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, default false -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `dangling=true` - - `label=key` or `label="key=value"` of an image label -- **filter** - only return images with the specified name - -#### Build image from a Dockerfile - -`POST /build` - -Build an image from a Dockerfile - -**Example request**: - - POST /v1.18/build HTTP/1.1 - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"stream": "Step 1/5..."} - {"stream": "..."} - {"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}} - -The input stream must be a `tar` archive compressed with one of the -following algorithms: `identity` (no compression), `gzip`, `bzip2`, `xz`. - -The archive must include a build instructions file, typically called -`Dockerfile` at the archive's root. The `dockerfile` parameter may be -used to specify a different build instructions file. To do this, its value must be -the path to the alternate build instructions file to use. - -The archive may include any number of other files, -which are accessible in the build context (See the [*ADD build -command*](../reference/builder.md#add)). - -The Docker daemon performs a preliminary validation of the `Dockerfile` before -starting the build, and returns an error if the syntax is incorrect. After that, -each instruction is run one-by-one until the ID of the new image is output. - -The build is canceled if the client drops the connection by quitting -or being killed. - -**Query parameters**: - -- **dockerfile** - Path within the build context to the Dockerfile. This is - ignored if `remote` is specified and points to an individual filename. -- **t** – A name and optional tag to apply to the image in the `name:tag` format. - If you omit the `tag` the default `latest` value is assumed. -- **remote** – A Git repository URI or HTTP/HTTPS context URI. If the - URI points to a single text file, the file's contents are placed into - a file called `Dockerfile` and the image is built from that file. -- **q** – Suppress verbose build output. -- **nocache** – Do not use the cache when building the image. -- **pull** - Attempt to pull the image even if an older image exists locally. -- **rm** - Remove intermediate containers after a successful build (default behavior). -- **forcerm** - Always remove intermediate containers (includes `rm`). -- **memory** - Set memory limit for build. -- **memswap** - Total memory (memory + swap), `-1` to enable unlimited swap. -- **cpushares** - CPU shares (relative weight). -- **cpusetcpus** - CPUs in which to allow execution (e.g., `0-3`, `0,1`). - -**Request Headers**: - -- **Content-type** – Set to `"application/tar"`. -- **X-Registry-Config** – base64-encoded ConfigFile object - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Create an image - -`POST /images/create` - -Create an image either by pulling it from the registry or by importing it - -**Example request**: - - POST /v1.18/images/create?fromImage=busybox&tag=latest HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pulling..."} - {"status": "Pulling", "progress": "1 B/ 100 B", "progressDetail": {"current": 1, "total": 100}} - {"error": "Invalid..."} - ... - -When using this endpoint to pull an image from the registry, the -`X-Registry-Auth` header can be used to include -a base64-encoded AuthConfig object. - -**Query parameters**: - -- **fromImage** – Name of the image to pull. -- **fromSrc** – Source to import. The value may be a URL from which the image - can be retrieved or `-` to read the image from the request body. -- **repo** – Repository name. -- **tag** – Tag. If empty when pulling an image, this causes all tags - for the given image to be pulled. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object - -**Status codes**: - -- **200** – no error -- **404** - repository does not exist or no read access -- **500** – server error - - - -#### Inspect an image - -`GET /images/(name)/json` - -Return low-level information on the image `name` - -**Example request**: - - GET /v1.18/images/ubuntu/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Created": "2013-03-23T22:24:18.818426-07:00", - "Container": "3d67245a8d72ecf13f33dffac9f79dcdf70f75acb84d308770391510e0c23ad0", - "ContainerConfig": { - "Hostname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "Tty": true, - "OpenStdin": true, - "StdinOnce": false, - "Env": null, - "Cmd": ["/bin/bash"], - "Dns": null, - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": null, - "VolumesFrom": "", - "WorkingDir": "" - }, - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Parent": "27cf784147099545", - "Size": 6824592 - } - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Get the history of an image - -`GET /images/(name)/history` - -Return the history of the image `name` - -**Example request**: - - GET /v1.18/images/ubuntu/history HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "b750fe79269d", - "Created": 1364102658, - "CreatedBy": "/bin/bash" - }, - { - "Id": "27cf78414709", - "Created": 1364068391, - "CreatedBy": "" - } - ] - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Push an image on the registry - -`POST /images/(name)/push` - -Push the image `name` on the registry - -**Example request**: - - POST /v1.18/images/test/push HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pushing..."} - {"status": "Pushing", "progress": "1/? (n/a)", "progressDetail": {"current": 1}}} - {"error": "Invalid..."} - ... - -If you wish to push an image on to a private registry, that image must already have a tag -into a repository which references that registry `hostname` and `port`. This repository name should -then be used in the URL. This duplicates the command line's flow. - -**Example request**: - - POST /v1.18/images/registry.acme.com:5000/test/push HTTP/1.1 - - -**Query parameters**: - -- **tag** – The tag to associate with the image on the registry. This is optional. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object. - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Tag an image into a repository - -`POST /images/(name)/tag` - -Tag the image `name` into a repository - -**Example request**: - - POST /v1.18/images/test/tag?repo=myrepo&force=0&tag=v42 HTTP/1.1 - -**Example response**: - - HTTP/1.1 201 Created - -**Query parameters**: - -- **repo** – The repository to tag in -- **force** – 1/True/true or 0/False/false, default false -- **tag** - The new tag name - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Remove an image - -`DELETE /images/(name)` - -Remove the image `name` from the filesystem - -**Example request**: - - DELETE /v1.18/images/test HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-type: application/json - - [ - {"Untagged": "3e2f21a89f"}, - {"Deleted": "3e2f21a89f"}, - {"Deleted": "53b4f83ac9"} - ] - -**Query parameters**: - -- **force** – 1/True/true or 0/False/false, default false -- **noprune** – 1/True/true or 0/False/false, default false - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Search images - -`GET /images/search` - -Search for an image on [Docker Hub](https://hub.docker.com). - -> **Note**: -> The response keys have changed from API v1.6 to reflect the JSON -> sent by the registry server to the docker daemon's request. - -**Example request**: - - GET /v1.18/images/search?term=sshd HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "star_count": 12, - "is_official": false, - "name": "wma55/u1210sshd", - "is_automated": false, - "description": "" - }, - { - "star_count": 10, - "is_official": false, - "name": "jdswinbank/sshd", - "is_automated": false, - "description": "" - }, - { - "star_count": 18, - "is_official": false, - "name": "vgauthier/sshd", - "is_automated": false, - "description": "" - } - ... - ] - -**Query parameters**: - -- **term** – term to search - -**Status codes**: - -- **200** – no error -- **500** – server error - -### 2.3 Misc - -#### Check auth configuration - -`POST /auth` - -Get the default username and email - -**Example request**: - - POST /v1.18/auth HTTP/1.1 - Content-Type: application/json - - { - "username": "hannibal", - "password": "xxxx", - "email": "hannibal@a-team.com", - "serveraddress": "https://index.docker.io/v1/" - } - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – no error -- **204** – no error -- **500** – server error - -#### Display system-wide information - -`GET /info` - -Display system-wide information - -**Example request**: - - GET /v1.18/info HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Containers": 11, - "Debug": 0, - "DockerRootDir": "/var/lib/docker", - "Driver": "btrfs", - "DriverStatus": [[""]], - "ExecutionDriver": "native-0.1", - "HttpProxy": "http://test:test@localhost:8080", - "HttpsProxy": "https://test:test@localhost:8080", - "ID": "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS", - "IPv4Forwarding": 1, - "Images": 16, - "IndexServerAddress": "https://index.docker.io/v1/", - "InitPath": "/usr/bin/docker", - "InitSha1": "", - "KernelVersion": "3.12.0-1-amd64", - "Labels": [ - "storage=ssd" - ], - "MemTotal": 2099236864, - "MemoryLimit": 1, - "NCPU": 1, - "NEventsListener": 0, - "NFd": 11, - "NGoroutines": 21, - "Name": "prod-server-42", - "NoProxy": "9.81.1.160", - "OperatingSystem": "Boot2Docker", - "RegistryConfig": { - "IndexConfigs": { - "docker.io": { - "Mirrors": null, - "Name": "docker.io", - "Official": true, - "Secure": true - } - }, - "InsecureRegistryCIDRs": [ - "127.0.0.0/8" - ] - }, - "SwapLimit": 0, - "SystemTime": "2015-03-10T11:11:23.730591467-07:00" - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Show the docker version information - -`GET /version` - -Show the docker version information - -**Example request**: - - GET /v1.18/version HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Version": "1.5.0", - "Os": "linux", - "KernelVersion": "3.18.5-tinycore64", - "GoVersion": "go1.4.1", - "GitCommit": "a8a31ef", - "Arch": "amd64", - "ApiVersion": "1.18" - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Ping the docker server - -`GET /_ping` - -Ping the docker server - -**Example request**: - - GET /v1.18/_ping HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: text/plain - - OK - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Create a new image from a container's changes - -`POST /commit` - -Create a new image from a container's changes - -**Example request**: - - POST /v1.18/commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "PortSpecs": null, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Volumes": { - "/tmp": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "ExposedPorts": { - "22/tcp": {} - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - {"Id": "596069db4bf5"} - -**JSON parameters**: - -- **config** - the container's configuration - -**Query parameters**: - -- **container** – source container -- **repo** – repository -- **tag** – tag -- **comment** – commit message -- **author** – author (e.g., "John Hannibal Smith - <[hannibal@a-team.com](mailto:hannibal%40a-team.com)>") - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **500** – server error - -#### Monitor Docker's events - -`GET /events` - -Get container events from docker, in real time via streaming. - -Docker containers report the following events: - - create, destroy, die, exec_create, exec_start, export, kill, oom, pause, restart, start, stop, unpause - -Docker images report the following events: - - untag, delete - -**Example request**: - - GET /v1.18/events?since=1374067924 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924} - {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924} - {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966} - {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970} - -**Query parameters**: - -- **since** – Timestamp. Show all events created since timestamp and then stream -- **until** – Timestamp. Show events created until given timestamp and stop streaming -- **filters** – A json encoded value of the filters (a map[string][]string) to process on the event list. Available filters: - - `container=`; -- container to filter - - `event=`; -- event to filter - - `image=`; -- image to filter - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images in a repository - -`GET /images/(name)/get` - -Get a tarball containing all images and metadata for the repository specified -by `name`. - -If `name` is a specific name and tag (e.g. ubuntu:latest), then only that image -(and its parents) are returned. If `name` is an image ID, similarly only that -image (and its parents) are returned, but with the exclusion of the -'repositories' file in the tarball, as there were no image names referenced. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.18/images/ubuntu/get - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images - -`GET /images/get` - -Get a tarball containing all images and metadata for one or more repositories. - -For each value of the `names` parameter: if it is a specific name and tag (e.g. -`ubuntu:latest`), then only that image (and its parents) are returned; if it is -an image ID, similarly only that image (and its parents) are returned and there -would be no names referenced in the 'repositories' file for this image ID. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.18/images/get?names=myname%2Fmyapp%3Alatest&names=busybox - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Load a tarball with a set of images and tags into docker - -`POST /images/load` - -Load a set of images and tags into a Docker repository. -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - POST /v1.18/images/load - Content-Type: application/x-tar - - Tarball in body - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Image tarball format - -An image tarball contains one directory per image layer (named using its long ID), -each containing these files: - -- `VERSION`: currently `1.0` - the file format version -- `json`: detailed layer information, similar to `docker inspect layer_id` -- `layer.tar`: A tarfile containing the filesystem changes in this layer - -The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories -for storing attribute changes and deletions. - -If the tarball defines a repository, the tarball should also include a `repositories` file at -the root that contains a list of repository and tag names mapped to layer IDs. - -``` -{"hello-world": - {"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"} -} -``` - -#### Exec Create - -`POST /containers/(id or name)/exec` - -Sets up an exec instance in a running container `id` - -**Example request**: - - POST /v1.18/containers/e90e34656806/exec HTTP/1.1 - Content-Type: application/json - - { - "AttachStdin": true, - "AttachStdout": true, - "AttachStderr": true, - "Cmd": ["sh"], - "Tty": true - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id": "f90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **AttachStdin** - Boolean value, attaches to `stdin` of the `exec` command. -- **AttachStdout** - Boolean value, attaches to `stdout` of the `exec` command. -- **AttachStderr** - Boolean value, attaches to `stderr` of the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. -- **Cmd** - Command to run specified as a string or an array of strings. - - -**Status codes**: - -- **201** – no error -- **404** – no such container - -#### Exec Start - -`POST /exec/(id)/start` - -Starts a previously set up `exec` instance `id`. If `detach` is true, this API -returns after starting the `exec` command. Otherwise, this API sets up an -interactive session with the `exec` command. - -**Example request**: - - POST /v1.18/exec/e90e34656806/start HTTP/1.1 - Content-Type: application/json - - { - "Detach": false, - "Tty": false - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/vnd.docker.raw-stream - - {% raw %} - {{ STREAM }} - {% endraw %} - -**JSON parameters**: - -- **Detach** - Detach from the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance - -**Stream details**: - -Similar to the stream behavior of `POST /containers/(id or name)/attach` API - -#### Exec Resize - -`POST /exec/(id)/resize` - -Resizes the `tty` session used by the `exec` command `id`. The unit is number of characters. -This API is valid only if `tty` was specified as part of creating and starting the `exec` command. - -**Example request**: - - POST /v1.18/exec/e90e34656806/resize?h=40&w=80 HTTP/1.1 - Content-Type: text/plain - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: text/plain - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **201** – no error -- **404** – no such exec instance - -#### Exec Inspect - -`GET /exec/(id)/json` - -Return low-level information about the `exec` command `id`. - -**Example request**: - - GET /v1.18/exec/11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: plain/text - - { - "ID" : "11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39", - "Running" : false, - "ExitCode" : 2, - "ProcessConfig" : { - "privileged" : false, - "user" : "", - "tty" : false, - "entrypoint" : "sh", - "arguments" : [ - "-c", - "exit 2" - ] - }, - "OpenStdin" : false, - "OpenStderr" : false, - "OpenStdout" : false, - "Container" : { - "State" : { - "Running" : true, - "Paused" : false, - "Restarting" : false, - "OOMKilled" : false, - "Pid" : 3650, - "ExitCode" : 0, - "Error" : "", - "StartedAt" : "2014-11-17T22:26:03.717657531Z", - "FinishedAt" : "0001-01-01T00:00:00Z" - }, - "ID" : "8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c", - "Created" : "2014-11-17T22:26:03.626304998Z", - "Path" : "date", - "Args" : [], - "Config" : { - "Hostname" : "8f177a186b97", - "Domainname" : "", - "User" : "", - "AttachStdin" : false, - "AttachStdout" : false, - "AttachStderr" : false, - "PortSpecs": null, - "ExposedPorts" : null, - "Tty" : false, - "OpenStdin" : false, - "StdinOnce" : false, - "Env" : [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], - "Cmd" : [ - "date" - ], - "Image" : "ubuntu", - "Volumes" : null, - "WorkingDir" : "", - "Entrypoint" : null, - "NetworkDisabled" : false, - "MacAddress" : "", - "OnBuild" : null, - "SecurityOpt" : null - }, - "Image" : "5506de2b643be1e6febbf3b8a240760c6843244c41e12aa2f60ccbb7153d17f5", - "NetworkSettings" : { - "IPAddress" : "172.17.0.2", - "IPPrefixLen" : 16, - "MacAddress" : "02:42:ac:11:00:02", - "Gateway" : "172.17.42.1", - "Bridge" : "docker0", - "PortMapping" : null, - "Ports" : {} - }, - "ResolvConfPath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/resolv.conf", - "HostnamePath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/hostname", - "HostsPath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Name" : "/test", - "Driver" : "aufs", - "ExecDriver" : "native-0.2", - "MountLabel" : "", - "ProcessLabel" : "", - "AppArmorProfile" : "", - "RestartCount" : 0, - "Volumes" : {}, - "VolumesRW" : {} - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **500** - server error - -## 3. Going further - -### 3.1 Inside `docker run` - -As an example, the `docker run` command line makes the following API calls: - -- Create the container - -- If the status code is 404, it means the image doesn't exist: - - Try to pull it. - - Then, retry to create the container. - -- Start the container. - -- If you are not in detached mode: -- Attach to the container, using `logs=1` (to have `stdout` and - `stderr` from the container's start) and `stream=1` - -- If in detached mode or only `stdin` is attached, display the container's id. - -### 3.2 Hijacking - -In this version of the API, `/attach`, uses hijacking to transport `stdin`, -`stdout`, and `stderr` on the same socket. - -To hint potential proxies about connection hijacking, Docker client sends -connection upgrade headers similarly to websocket. - - Upgrade: tcp - Connection: Upgrade - -When Docker daemon detects the `Upgrade` header, it switches its status code -from **200 OK** to **101 UPGRADED** and resends the same headers. - -This might change in the future. - -### 3.3 CORS Requests - -To set cross origin requests to the Engine API please give values to -`--api-cors-header` when running Docker in daemon mode. Set * (asterisk) allows all, -default or blank means CORS disabled - - $ docker -d -H="192.168.1.9:2375" --api-cors-header="http://foo.bar" diff --git a/vendor/github.com/docker/docker/docs/api/v1.19.md b/vendor/github.com/docker/docker/docs/api/v1.19.md deleted file mode 100644 index a1a7280d3..000000000 --- a/vendor/github.com/docker/docker/docs/api/v1.19.md +++ /dev/null @@ -1,2238 +0,0 @@ ---- -title: "Engine API v1.19" -description: "API Documentation for Docker" -keywords: "API, Docker, rcli, REST, documentation" -redirect_from: -- /engine/reference/api/docker_remote_api_v1.19/ -- /reference/api/docker_remote_api_v1.19/ ---- - - - -## 1. Brief introduction - - - The daemon listens on `unix:///var/run/docker.sock` but you can - [Bind Docker to another host/port or a Unix socket](../reference/commandline/dockerd.md#bind-docker-to-another-host-port-or-a-unix-socket). - - The API tends to be REST. However, for some complex commands, like `attach` - or `pull`, the HTTP connection is hijacked to transport `stdout`, - `stdin` and `stderr`. - - When the client API version is newer than the daemon's, these calls return an HTTP - `400 Bad Request` error message. - -## 2. Endpoints - -### 2.1 Containers - -#### List containers - -`GET /containers/json` - -List containers - -**Example request**: - - GET /v1.19/containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "8dfafdbc3a40", - "Names":["/boring_feynman"], - "Image": "ubuntu:latest", - "Command": "echo 1", - "Created": 1367854155, - "Status": "Exit 0", - "Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}], - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "SizeRw": 12288, - "SizeRootFs": 0 - }, - { - "Id": "9cd87474be90", - "Names":["/coolName"], - "Image": "ubuntu:latest", - "Command": "echo 222222", - "Created": 1367854155, - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0 - }, - { - "Id": "3176a2479c92", - "Names":["/sleepy_dog"], - "Image": "ubuntu:latest", - "Command": "echo 3333333333333333", - "Created": 1367854154, - "Status": "Exit 0", - "Ports":[], - "Labels": {}, - "SizeRw":12288, - "SizeRootFs":0 - }, - { - "Id": "4cb07b47f9fb", - "Names":["/running_cat"], - "Image": "ubuntu:latest", - "Command": "echo 444444444444444444444444444444444", - "Created": 1367854152, - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0 - } - ] - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, Show all containers. - Only running containers are shown by default (i.e., this defaults to false) -- **limit** – Show `limit` last created - containers, include non-running ones. -- **since** – Show only containers created since Id, include - non-running ones. -- **before** – Show only containers created before Id, include - non-running ones. -- **size** – 1/True/true or 0/False/false, Show the containers - sizes -- **filters** - a JSON encoded value of the filters (a `map[string][]string`) to process on the containers list. Available filters: - - `exited=`; -- containers with exit code of `` ; - - `status=`(`restarting`|`running`|`paused`|`exited`) - - `label=key` or `label="key=value"` of a container label - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **500** – server error - -#### Create a container - -`POST /containers/create` - -Create a container - -**Example request**: - - POST /v1.19/containers/create HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "FOO=bar", - "BAZ=quux" - ], - "Cmd": [ - "date" - ], - "Entrypoint": null, - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "HostConfig": { - "Binds": ["/tmp:/tmp"], - "Links": ["redis3:redis"], - "LxcConf": {"lxc.utsname":"docker"}, - "Memory": 0, - "MemorySwap": 0, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0,1", - "BlkioWeight": 300, - "OomKillDisable": false, - "PidMode": "", - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsSearch": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "NetworkMode": "bridge", - "Devices": [], - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [], - "CgroupParent": "" - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id":"e90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **Hostname** - A string value containing the hostname to use for the - container. -- **Domainname** - A string value containing the domain name to use - for the container. -- **User** - A string value specifying the user inside the container. -- **AttachStdin** - Boolean value, attaches to `stdin`. -- **AttachStdout** - Boolean value, attaches to `stdout`. -- **AttachStderr** - Boolean value, attaches to `stderr`. -- **Tty** - Boolean value, Attach standard streams to a `tty`, including `stdin` if it is not closed. -- **OpenStdin** - Boolean value, opens `stdin`, -- **StdinOnce** - Boolean value, close `stdin` after the 1 attached client disconnects. -- **Env** - A list of environment variables in the form of `["VAR=value", ...]` -- **Labels** - Adds a map of labels to a container. To specify a map: `{"key":"value", ... }` -- **Cmd** - Command to run specified as a string or an array of strings. -- **Entrypoint** - Set the entry point for the container as a string or an array - of strings. -- **Image** - A string specifying the image name to use for the container. -- **Volumes** - An object mapping mount point paths (strings) inside the - container to empty objects. -- **WorkingDir** - A string specifying the working directory for commands to - run in. -- **NetworkDisabled** - Boolean value, when true disables networking for the - container -- **ExposedPorts** - An object mapping ports to an empty object in the form of: - `"ExposedPorts": { "/: {}" }` -- **HostConfig** - - **Binds** – A list of bind-mounts for this container. Each item is a string in one of these forms: - + `host-src:container-dest` to bind-mount a host path into the - container. Both `host-src`, and `container-dest` must be an - _absolute_ path. - + `host-src:container-dest:ro` to make the bind-mount read-only - inside the container. Both `host-src`, and `container-dest` must be - an _absolute_ path. - - **Links** - A list of links for the container. Each link entry should be - in the form of `container_name:alias`. - - **LxcConf** - LXC specific configurations. These configurations only - work when using the `lxc` execution driver. - - **Memory** - Memory limit in bytes. - - **MemorySwap** - Total memory limit (memory + swap); set `-1` to enable unlimited swap. - You must use this with `memory` and make the swap value larger than `memory`. - - **CpuShares** - An integer value containing the container's CPU Shares - (ie. the relative weight vs other containers). - - **CpuPeriod** - The length of a CPU period in microseconds. - - **CpuQuota** - Microseconds of CPU time that the container can get in a CPU period. - - **CpusetCpus** - String value containing the `cgroups CpusetCpus` to use. - - **CpusetMems** - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - - **BlkioWeight** - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - - **OomKillDisable** - Boolean value, whether to disable OOM Killer for the container or not. - - **PidMode** - Set the PID (Process) Namespace mode for the container; - `"container:"`: joins another container's PID namespace - `"host"`: use the host's PID namespace inside the container - - **PortBindings** - A map of exposed container ports and the host port they - should map to. A JSON object in the form - `{ /: [{ "HostPort": "" }] }` - Take note that `port` is specified as a string and not an integer value. - - **PublishAllPorts** - Allocates a random host port for all of a container's - exposed ports. Specified as a boolean value. - - **Privileged** - Gives the container full access to the host. Specified as - a boolean value. - - **ReadonlyRootfs** - Mount the container's root filesystem as read only. - Specified as a boolean value. - - **Dns** - A list of DNS servers for the container to use. - - **DnsSearch** - A list of DNS search domains - - **ExtraHosts** - A list of hostnames/IP mappings to add to the - container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`. - - **VolumesFrom** - A list of volumes to inherit from another container. - Specified in the form `[:]` - - **CapAdd** - A list of kernel capabilities to add to the container. - - **Capdrop** - A list of kernel capabilities to drop from the container. - - **RestartPolicy** – The behavior to apply when the container exits. The - value is an object with a `Name` property of either `"always"` to - always restart or `"on-failure"` to restart only when the container - exit code is non-zero. If `on-failure` is used, `MaximumRetryCount` - controls the number of times to retry before giving up. - The default is not to restart. (optional) - An ever increasing delay (double the previous delay, starting at 100mS) - is added before each restart to prevent flooding the server. - - **NetworkMode** - Sets the networking mode for the container. Supported - values are: `bridge`, `host`, `none`, and `container:` - - **Devices** - A list of devices to add to the container specified as a JSON object in the - form - `{ "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}` - - **Ulimits** - A list of ulimits to set in the container, specified as - `{ "Name": , "Soft": , "Hard": }`, for example: - `Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }` - - **SecurityOpt**: A list of string values to customize labels for MLS - systems, such as SELinux. - - **LogConfig** - Log configuration for the container, specified as a JSON object in the form - `{ "Type": "", "Config": {"key1": "val1"}}`. - Available types: `json-file`, `syslog`, `journald`, `none`. - `syslog` available options are: `address`. - - **CgroupParent** - Path to `cgroups` under which the container's `cgroup` is created. If the path is not absolute, the path is considered to be relative to the `cgroups` path of the init process. Cgroups are created if they do not already exist. - -**Query parameters**: - -- **name** – Assign the specified name to the container. Must - match `/?[a-zA-Z0-9_-]+`. - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such container -- **406** – impossible to attach (container not running) -- **409** – conflict -- **500** – server error - -#### Inspect a container - -`GET /containers/(id or name)/json` - -Return low-level information on the container `id` - -**Example request**: - - GET /v1.19/containers/4fa6e0f0c678/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "AppArmorProfile": "", - "Args": [ - "-c", - "exit 9" - ], - "Config": { - "AttachStderr": true, - "AttachStdin": false, - "AttachStdout": true, - "Cmd": [ - "/bin/sh", - "-c", - "exit 9" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts": null, - "Hostname": "ba033ac44011", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "MacAddress": "", - "NetworkDisabled": false, - "OnBuild": null, - "OpenStdin": false, - "PortSpecs": null, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": null, - "WorkingDir": "" - }, - "Created": "2015-01-06T15:47:31.485331387Z", - "Driver": "devicemapper", - "ExecDriver": "native-0.2", - "ExecIDs": null, - "HostConfig": { - "Binds": null, - "BlkioWeight": 0, - "CapAdd": null, - "CapDrop": null, - "ContainerIDFile": "", - "CpusetCpus": "", - "CpusetMems": "", - "CpuShares": 0, - "CpuPeriod": 100000, - "Devices": [], - "Dns": null, - "DnsSearch": null, - "ExtraHosts": null, - "IpcMode": "", - "Links": null, - "LxcConf": [], - "Memory": 0, - "MemorySwap": 0, - "OomKillDisable": false, - "NetworkMode": "bridge", - "PidMode": "", - "PortBindings": {}, - "Privileged": false, - "ReadonlyRootfs": false, - "PublishAllPorts": false, - "RestartPolicy": { - "MaximumRetryCount": 2, - "Name": "on-failure" - }, - "LogConfig": { - "Config": null, - "Type": "json-file" - }, - "SecurityOpt": null, - "VolumesFrom": null, - "Ulimits": [{}] - }, - "HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname", - "HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39", - "Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2", - "MountLabel": "", - "Name": "/boring_euclid", - "NetworkSettings": { - "Bridge": "", - "Gateway": "", - "IPAddress": "", - "IPPrefixLen": 0, - "MacAddress": "", - "PortMapping": null, - "Ports": null - }, - "Path": "/bin/sh", - "ProcessLabel": "", - "ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf", - "RestartCount": 1, - "State": { - "Error": "", - "ExitCode": 9, - "FinishedAt": "2015-01-06T15:47:32.080254511Z", - "OOMKilled": false, - "Paused": false, - "Pid": 0, - "Restarting": false, - "Running": true, - "StartedAt": "2015-01-06T15:47:32.072697474Z" - }, - "Volumes": {}, - "VolumesRW": {} - } - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### List processes running inside a container - -`GET /containers/(id or name)/top` - -List processes running inside the container `id`. On Unix systems this -is done by running the `ps` command. This endpoint is not -supported on Windows. - -**Example request**: - - GET /v1.19/containers/4fa6e0f0c678/top HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "UID", "PID", "PPID", "C", "STIME", "TTY", "TIME", "CMD" - ], - "Processes" : [ - [ - "root", "13642", "882", "0", "17:03", "pts/0", "00:00:00", "/bin/bash" - ], - [ - "root", "13735", "13642", "0", "17:06", "pts/0", "00:00:00", "sleep 10" - ] - ] - } - -**Example request**: - - GET /v1.19/containers/4fa6e0f0c678/top?ps_args=aux HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "USER","PID","%CPU","%MEM","VSZ","RSS","TTY","STAT","START","TIME","COMMAND" - ] - "Processes" : [ - [ - "root","13642","0.0","0.1","18172","3184","pts/0","Ss","17:03","0:00","/bin/bash" - ], - [ - "root","13895","0.0","0.0","4348","692","pts/0","S+","17:15","0:00","sleep 10" - ] - ], - } - -**Query parameters**: - -- **ps_args** – `ps` arguments to use (e.g., `aux`), defaults to `-ef` - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container logs - -`GET /containers/(id or name)/logs` - -Get `stdout` and `stderr` logs from the container ``id`` - -> **Note**: -> This endpoint works only for containers with the `json-file` or `journald` logging drivers. - -**Example request**: - - GET /v1.19/containers/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **follow** – 1/True/true or 0/False/false, return stream. Default `false`. -- **stdout** – 1/True/true or 0/False/false, show `stdout` log. Default `false`. -- **stderr** – 1/True/true or 0/False/false, show `stderr` log. Default `false`. -- **since** – UNIX timestamp (integer) to filter logs. Specifying a timestamp - will only output log-entries since that timestamp. Default: 0 (unfiltered) -- **timestamps** – 1/True/true or 0/False/false, print timestamps for - every log line. Default `false`. -- **tail** – Output specified number of lines at the end of logs: `all` or ``. Default all. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **404** – no such container -- **500** – server error - -#### Inspect changes on a container's filesystem - -`GET /containers/(id or name)/changes` - -Inspect changes on container `id`'s filesystem - -**Example request**: - - GET /v1.19/containers/4fa6e0f0c678/changes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Path": "/dev", - "Kind": 0 - }, - { - "Path": "/dev/kmsg", - "Kind": 1 - }, - { - "Path": "/test", - "Kind": 1 - } - ] - -Values for `Kind`: - -- `0`: Modify -- `1`: Add -- `2`: Delete - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Export a container - -`GET /containers/(id or name)/export` - -Export the contents of container `id` - -**Example request**: - - GET /v1.19/containers/4fa6e0f0c678/export HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/octet-stream - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container stats based on resource usage - -`GET /containers/(id or name)/stats` - -This endpoint returns a live stream of a container's resource usage statistics. - -**Example request**: - - GET /v1.19/containers/redis1/stats HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "read" : "2015-01-08T22:57:31.547920715Z", - "network" : { - "rx_dropped" : 0, - "rx_bytes" : 648, - "rx_errors" : 0, - "tx_packets" : 8, - "tx_dropped" : 0, - "rx_packets" : 8, - "tx_errors" : 0, - "tx_bytes" : 648 - }, - "memory_stats" : { - "stats" : { - "total_pgmajfault" : 0, - "cache" : 0, - "mapped_file" : 0, - "total_inactive_file" : 0, - "pgpgout" : 414, - "rss" : 6537216, - "total_mapped_file" : 0, - "writeback" : 0, - "unevictable" : 0, - "pgpgin" : 477, - "total_unevictable" : 0, - "pgmajfault" : 0, - "total_rss" : 6537216, - "total_rss_huge" : 6291456, - "total_writeback" : 0, - "total_inactive_anon" : 0, - "rss_huge" : 6291456, - "hierarchical_memory_limit" : 67108864, - "total_pgfault" : 964, - "total_active_file" : 0, - "active_anon" : 6537216, - "total_active_anon" : 6537216, - "total_pgpgout" : 414, - "total_cache" : 0, - "inactive_anon" : 0, - "active_file" : 0, - "pgfault" : 964, - "inactive_file" : 0, - "total_pgpgin" : 477 - }, - "max_usage" : 6651904, - "usage" : 6537216, - "failcnt" : 0, - "limit" : 67108864 - }, - "blkio_stats" : {}, - "cpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24472255, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100215355, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 739306590000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - }, - "precpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24350896, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100093996, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 9492140000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - } - } - -The precpu_stats is the cpu statistic of last read, which is used for calculating the cpu usage percent. It is not the exact copy of the “cpu_stats” field. - -**Query parameters**: - -- **stream** – 1/True/true or 0/False/false, pull stats once then disconnect. Default `true`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Resize a container TTY - -`POST /containers/(id or name)/resize?h=&w=` - -Resize the TTY for container with `id`. You must restart the container for the resize to take effect. - -**Example request**: - - POST /v1.19/containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **200** – no error -- **404** – No such container -- **500** – Cannot resize container - -#### Start a container - -`POST /containers/(id or name)/start` - -Start the container `id` - -> **Note**: -> For backwards compatibility, this endpoint accepts a `HostConfig` as JSON-encoded request body. -> See [create a container](#create-a-container) for details. - -**Example request**: - - POST /v1.19/containers/e90e34656806/start HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **304** – container already started -- **404** – no such container -- **500** – server error - -#### Stop a container - -`POST /containers/(id or name)/stop` - -Stop the container `id` - -**Example request**: - - POST /v1.19/containers/e90e34656806/stop?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **304** – container already stopped -- **404** – no such container -- **500** – server error - -#### Restart a container - -`POST /containers/(id or name)/restart` - -Restart the container `id` - -**Example request**: - - POST /v1.19/containers/e90e34656806/restart?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Kill a container - -`POST /containers/(id or name)/kill` - -Kill the container `id` - -**Example request**: - - POST /v1.19/containers/e90e34656806/kill HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **signal** - Signal to send to the container: integer or string like `SIGINT`. - When not set, `SIGKILL` is assumed and the call waits for the container to exit. - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Rename a container - -`POST /containers/(id or name)/rename` - -Rename the container `id` to a `new_name` - -**Example request**: - - POST /v1.19/containers/e90e34656806/rename?name=new_name HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **name** – new name for the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **409** - conflict name already assigned -- **500** – server error - -#### Pause a container - -`POST /containers/(id or name)/pause` - -Pause the container `id` - -**Example request**: - - POST /v1.19/containers/e90e34656806/pause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Unpause a container - -`POST /containers/(id or name)/unpause` - -Unpause the container `id` - -**Example request**: - - POST /v1.19/containers/e90e34656806/unpause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Attach to a container - -`POST /containers/(id or name)/attach` - -Attach to the container `id` - -**Example request**: - - POST /v1.19/containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -**Stream details**: - -When using the TTY setting is enabled in -[`POST /containers/create` -](#create-a-container), -the stream is the raw data from the process PTY and client's `stdin`. -When the TTY is disabled, then the stream is multiplexed to separate -`stdout` and `stderr`. - -The format is a **Header** and a **Payload** (frame). - -**HEADER** - -The header contains the information which the stream writes (`stdout` or -`stderr`). It also contains the size of the associated frame encoded in the -last four bytes (`uint32`). - -It is encoded on the first eight bytes like this: - - header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4} - -`STREAM_TYPE` can be: - -- 0: `stdin` (is written on `stdout`) -- 1: `stdout` -- 2: `stderr` - -`SIZE1, SIZE2, SIZE3, SIZE4` are the four bytes of -the `uint32` size encoded as big endian. - -**PAYLOAD** - -The payload is the raw stream. - -**IMPLEMENTATION** - -The simplest way to implement the Attach protocol is the following: - - 1. Read eight bytes. - 2. Choose `stdout` or `stderr` depending on the first byte. - 3. Extract the frame size from the last four bytes. - 4. Read the extracted size and output it on the correct output. - 5. Goto 1. - -#### Attach to a container (websocket) - -`GET /containers/(id or name)/attach/ws` - -Attach to the container `id` via websocket - -Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455) - -**Example request** - - GET /v1.19/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1 - -**Example response** - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -#### Wait a container - -`POST /containers/(id or name)/wait` - -Block until container `id` stops, then returns the exit code - -**Example request**: - - POST /v1.19/containers/16253994b7c4/wait HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"StatusCode": 0} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Remove a container - -`DELETE /containers/(id or name)` - -Remove the container `id` from the filesystem - -**Example request**: - - DELETE /v1.19/containers/16253994b7c4?v=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **v** – 1/True/true or 0/False/false, Remove the volumes - associated to the container. Default `false`. -- **force** - 1/True/true or 0/False/false, Kill then remove the container. - Default `false`. - -**Status codes**: - -- **204** – no error -- **400** – bad parameter -- **404** – no such container -- **409** – conflict -- **500** – server error - -#### Copy files or folders from a container - -`POST /containers/(id or name)/copy` - -Copy files or folders of container `id` - -**Example request**: - - POST /v1.19/containers/4fa6e0f0c678/copy HTTP/1.1 - Content-Type: application/json - - { - "Resource": "test.txt" - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -### 2.2 Images - -#### List Images - -`GET /images/json` - -**Example request**: - - GET /v1.19/images/json?all=0 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "RepoTags": [ - "ubuntu:12.04", - "ubuntu:precise", - "ubuntu:latest" - ], - "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c", - "Created": 1365714795, - "Size": 131506275, - "VirtualSize": 131506275, - "Labels": {} - }, - { - "RepoTags": [ - "ubuntu:12.10", - "ubuntu:quantal" - ], - "ParentId": "27cf784147099545", - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Created": 1364102658, - "Size": 24653, - "VirtualSize": 180116135, - "Labels": { - "com.example.version": "v1" - } - } - ] - -**Example request, with digest information**: - - GET /v1.19/images/json?digests=1 HTTP/1.1 - -**Example response, with digest information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Created": 1420064636, - "Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125", - "ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2", - "RepoDigests": [ - "localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags": [ - "localhost:5000/test/busybox:latest", - "playdate:latest" - ], - "Size": 0, - "VirtualSize": 2429728, - "Labels": {} - } - ] - -The response shows a single image `Id` associated with two repositories -(`RepoTags`): `localhost:5000/test/busybox`: and `playdate`. A caller can use -either of the `RepoTags` values `localhost:5000/test/busybox:latest` or -`playdate:latest` to reference the image. - -You can also use `RepoDigests` values to reference an image. In this response, -the array has only one reference and that is to the -`localhost:5000/test/busybox` repository; the `playdate` repository has no -digest. You can reference this digest using the value: -`localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...` - -See the `docker run` and `docker build` commands for examples of digest and tag -references on the command line. - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, default false -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `dangling=true` - - `label=key` or `label="key=value"` of an image label -- **filter** - only return images with the specified name - -#### Build image from a Dockerfile - -`POST /build` - -Build an image from a Dockerfile - -**Example request**: - - POST /v1.19/build HTTP/1.1 - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"stream": "Step 1/5..."} - {"stream": "..."} - {"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}} - -The input stream must be a `tar` archive compressed with one of the -following algorithms: `identity` (no compression), `gzip`, `bzip2`, `xz`. - -The archive must include a build instructions file, typically called -`Dockerfile` at the archive's root. The `dockerfile` parameter may be -used to specify a different build instructions file. To do this, its value must be -the path to the alternate build instructions file to use. - -The archive may include any number of other files, -which are accessible in the build context (See the [*ADD build -command*](../reference/builder.md#add)). - -The Docker daemon performs a preliminary validation of the `Dockerfile` before -starting the build, and returns an error if the syntax is incorrect. After that, -each instruction is run one-by-one until the ID of the new image is output. - -The build is canceled if the client drops the connection by quitting -or being killed. - -**Query parameters**: - -- **dockerfile** - Path within the build context to the Dockerfile. This is - ignored if `remote` is specified and points to an individual filename. -- **t** – A name and optional tag to apply to the image in the `name:tag` format. - If you omit the `tag` the default `latest` value is assumed. -- **remote** – A Git repository URI or HTTP/HTTPS URI build source. If the - URI specifies a filename, the file's contents are placed into a file - called `Dockerfile`. -- **q** – Suppress verbose build output. -- **nocache** – Do not use the cache when building the image. -- **pull** - Attempt to pull the image even if an older image exists locally. -- **rm** - Remove intermediate containers after a successful build (default behavior). -- **forcerm** - Always remove intermediate containers (includes `rm`). -- **memory** - Set memory limit for build. -- **memswap** - Total memory (memory + swap), `-1` to enable unlimited swap. -- **cpushares** - CPU shares (relative weight). -- **cpusetcpus** - CPUs in which to allow execution (e.g., `0-3`, `0,1`). -- **cpuperiod** - The length of a CPU period in microseconds. -- **cpuquota** - Microseconds of CPU time that the container can get in a CPU period. - -**Request Headers**: - -- **Content-type** – Set to `"application/tar"`. -- **X-Registry-Config** – base64-encoded ConfigFile object - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Create an image - -`POST /images/create` - -Create an image either by pulling it from the registry or by importing it - -**Example request**: - - POST /v1.19/images/create?fromImage=busybox&tag=latest HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pulling..."} - {"status": "Pulling", "progress": "1 B/ 100 B", "progressDetail": {"current": 1, "total": 100}} - {"error": "Invalid..."} - ... - -When using this endpoint to pull an image from the registry, the -`X-Registry-Auth` header can be used to include -a base64-encoded AuthConfig object. - -**Query parameters**: - -- **fromImage** – Name of the image to pull. -- **fromSrc** – Source to import. The value may be a URL from which the image - can be retrieved or `-` to read the image from the request body. -- **repo** – Repository name. -- **tag** – Tag. If empty when pulling an image, this causes all tags - for the given image to be pulled. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object - -**Status codes**: - -- **200** – no error -- **404** - repository does not exist or no read access -- **500** – server error - - - -#### Inspect an image - -`GET /images/(name)/json` - -Return low-level information on the image `name` - -**Example request**: - - GET /v1.19/images/ubuntu/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Created": "2013-03-23T22:24:18.818426-07:00", - "Container": "3d67245a8d72ecf13f33dffac9f79dcdf70f75acb84d308770391510e0c23ad0", - "ContainerConfig": { - "Hostname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "Tty": true, - "OpenStdin": true, - "StdinOnce": false, - "Env": null, - "Cmd": ["/bin/bash"], - "Dns": null, - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": null, - "VolumesFrom": "", - "WorkingDir": "" - }, - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Parent": "27cf784147099545", - "Size": 6824592 - } - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Get the history of an image - -`GET /images/(name)/history` - -Return the history of the image `name` - -**Example request**: - - GET /v1.19/images/ubuntu/history HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710", - "Created": 1398108230, - "CreatedBy": "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /", - "Tags": [ - "ubuntu:lucid", - "ubuntu:10.04" - ], - "Size": 182964289, - "Comment": "" - }, - { - "Id": "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8", - "Created": 1398108222, - "CreatedBy": "/bin/sh -c #(nop) MAINTAINER Tianon Gravi - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/", - "Tags": null, - "Size": 0, - "Comment": "" - }, - { - "Id": "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158", - "Created": 1371157430, - "CreatedBy": "", - "Tags": [ - "scratch12:latest", - "scratch:latest" - ], - "Size": 0, - "Comment": "Imported from -" - } - ] - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Push an image on the registry - -`POST /images/(name)/push` - -Push the image `name` on the registry - -**Example request**: - - POST /v1.19/images/test/push HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pushing..."} - {"status": "Pushing", "progress": "1/? (n/a)", "progressDetail": {"current": 1}}} - {"error": "Invalid..."} - ... - -If you wish to push an image on to a private registry, that image must already have a tag -into a repository which references that registry `hostname` and `port`. This repository name should -then be used in the URL. This duplicates the command line's flow. - -**Example request**: - - POST /v1.19/images/registry.acme.com:5000/test/push HTTP/1.1 - - -**Query parameters**: - -- **tag** – The tag to associate with the image on the registry. This is optional. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object. - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Tag an image into a repository - -`POST /images/(name)/tag` - -Tag the image `name` into a repository - -**Example request**: - - POST /v1.19/images/test/tag?repo=myrepo&force=0&tag=v42 HTTP/1.1 - -**Example response**: - - HTTP/1.1 201 Created - -**Query parameters**: - -- **repo** – The repository to tag in -- **force** – 1/True/true or 0/False/false, default false -- **tag** - The new tag name - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Remove an image - -`DELETE /images/(name)` - -Remove the image `name` from the filesystem - -**Example request**: - - DELETE /v1.19/images/test HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-type: application/json - - [ - {"Untagged": "3e2f21a89f"}, - {"Deleted": "3e2f21a89f"}, - {"Deleted": "53b4f83ac9"} - ] - -**Query parameters**: - -- **force** – 1/True/true or 0/False/false, default false -- **noprune** – 1/True/true or 0/False/false, default false - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Search images - -`GET /images/search` - -Search for an image on [Docker Hub](https://hub.docker.com). This API -returns both `is_trusted` and `is_automated` images. Currently, they -are considered identical. In the future, the `is_trusted` property will -be deprecated and replaced by the `is_automated` property. - -> **Note**: -> The response keys have changed from API v1.6 to reflect the JSON -> sent by the registry server to the docker daemon's request. - -**Example request**: - - GET /v1.19/images/search?term=sshd HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "star_count": 12, - "is_official": false, - "name": "wma55/u1210sshd", - "is_trusted": false, - "is_automated": false, - "description": "" - }, - { - "star_count": 10, - "is_official": false, - "name": "jdswinbank/sshd", - "is_trusted": false, - "is_automated": false, - "description": "" - }, - { - "star_count": 18, - "is_official": false, - "name": "vgauthier/sshd", - "is_trusted": false, - "is_automated": false, - "description": "" - } - ... - ] - -**Query parameters**: - -- **term** – term to search - -**Status codes**: - -- **200** – no error -- **500** – server error - -### 2.3 Misc - -#### Check auth configuration - -`POST /auth` - -Get the default username and email - -**Example request**: - - POST /v1.19/auth HTTP/1.1 - Content-Type: application/json - - { - "username": "hannibal", - "password": "xxxx", - "email": "hannibal@a-team.com", - "serveraddress": "https://index.docker.io/v1/" - } - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – no error -- **204** – no error -- **500** – server error - -#### Display system-wide information - -`GET /info` - -Display system-wide information - -**Example request**: - - GET /v1.19/info HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Containers": 11, - "CpuCfsPeriod": true, - "CpuCfsQuota": true, - "Debug": false, - "DockerRootDir": "/var/lib/docker", - "Driver": "btrfs", - "DriverStatus": [[""]], - "ExecutionDriver": "native-0.1", - "ExperimentalBuild": false, - "HttpProxy": "http://test:test@localhost:8080", - "HttpsProxy": "https://test:test@localhost:8080", - "ID": "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS", - "IPv4Forwarding": true, - "Images": 16, - "IndexServerAddress": "https://index.docker.io/v1/", - "InitPath": "/usr/bin/docker", - "InitSha1": "", - "KernelVersion": "3.12.0-1-amd64", - "Labels": [ - "storage=ssd" - ], - "MemTotal": 2099236864, - "MemoryLimit": true, - "NCPU": 1, - "NEventsListener": 0, - "NFd": 11, - "NGoroutines": 21, - "Name": "prod-server-42", - "NoProxy": "9.81.1.160", - "OomKillDisable": true, - "OperatingSystem": "Boot2Docker", - "RegistryConfig": { - "IndexConfigs": { - "docker.io": { - "Mirrors": null, - "Name": "docker.io", - "Official": true, - "Secure": true - } - }, - "InsecureRegistryCIDRs": [ - "127.0.0.0/8" - ] - }, - "SwapLimit": false, - "SystemTime": "2015-03-10T11:11:23.730591467-07:00" - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Show the docker version information - -`GET /version` - -Show the docker version information - -**Example request**: - - GET /v1.19/version HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Version": "1.5.0", - "Os": "linux", - "KernelVersion": "3.18.5-tinycore64", - "GoVersion": "go1.4.1", - "GitCommit": "a8a31ef", - "Arch": "amd64", - "ApiVersion": "1.19" - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Ping the docker server - -`GET /_ping` - -Ping the docker server - -**Example request**: - - GET /v1.19/_ping HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: text/plain - - OK - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Create a new image from a container's changes - -`POST /commit` - -Create a new image from a container's changes - -**Example request**: - - POST /v1.19/commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "PortSpecs": null, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Volumes": { - "/tmp": {} - }, - "Labels": { - "key1": "value1", - "key2": "value2" - }, - "WorkingDir": "", - "NetworkDisabled": false, - "ExposedPorts": { - "22/tcp": {} - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - {"Id": "596069db4bf5"} - -**JSON parameters**: - -- **config** - the container's configuration - -**Query parameters**: - -- **container** – source container -- **repo** – repository -- **tag** – tag -- **comment** – commit message -- **author** – author (e.g., "John Hannibal Smith - <[hannibal@a-team.com](mailto:hannibal%40a-team.com)>") - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **500** – server error - -#### Monitor Docker's events - -`GET /events` - -Get container events from docker, in real time via streaming. - -Docker containers report the following events: - - attach, commit, copy, create, destroy, die, exec_create, exec_start, export, kill, oom, pause, rename, resize, restart, start, stop, top, unpause - -Docker images report the following events: - - untag, delete - -**Example request**: - - GET /v1.19/events?since=1374067924 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924} - {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924} - {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966} - {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970} - -**Query parameters**: - -- **since** – Timestamp. Show all events created since timestamp and then stream -- **until** – Timestamp. Show events created until given timestamp and stop streaming -- **filters** – A json encoded value of the filters (a map[string][]string) to process on the event list. Available filters: - - `container=`; -- container to filter - - `event=`; -- event to filter - - `image=`; -- image to filter - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images in a repository - -`GET /images/(name)/get` - -Get a tarball containing all images and metadata for the repository specified -by `name`. - -If `name` is a specific name and tag (e.g. ubuntu:latest), then only that image -(and its parents) are returned. If `name` is an image ID, similarly only that -image (and its parents) are returned, but with the exclusion of the -'repositories' file in the tarball, as there were no image names referenced. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.19/images/ubuntu/get - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images - -`GET /images/get` - -Get a tarball containing all images and metadata for one or more repositories. - -For each value of the `names` parameter: if it is a specific name and tag (e.g. -`ubuntu:latest`), then only that image (and its parents) are returned; if it is -an image ID, similarly only that image (and its parents) are returned and there -would be no names referenced in the 'repositories' file for this image ID. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.19/images/get?names=myname%2Fmyapp%3Alatest&names=busybox - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Load a tarball with a set of images and tags into docker - -`POST /images/load` - -Load a set of images and tags into a Docker repository. -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - POST /v1.19/images/load - Content-Type: application/x-tar - - Tarball in body - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Image tarball format - -An image tarball contains one directory per image layer (named using its long ID), -each containing these files: - -- `VERSION`: currently `1.0` - the file format version -- `json`: detailed layer information, similar to `docker inspect layer_id` -- `layer.tar`: A tarfile containing the filesystem changes in this layer - -The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories -for storing attribute changes and deletions. - -If the tarball defines a repository, the tarball should also include a `repositories` file at -the root that contains a list of repository and tag names mapped to layer IDs. - -``` -{"hello-world": - {"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"} -} -``` - -#### Exec Create - -`POST /containers/(id or name)/exec` - -Sets up an exec instance in a running container `id` - -**Example request**: - - POST /v1.19/containers/e90e34656806/exec HTTP/1.1 - Content-Type: application/json - - { - "AttachStdin": true, - "AttachStdout": true, - "AttachStderr": true, - "Cmd": ["sh"], - "Tty": true, - "User": "123:456" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id": "f90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **AttachStdin** - Boolean value, attaches to `stdin` of the `exec` command. -- **AttachStdout** - Boolean value, attaches to `stdout` of the `exec` command. -- **AttachStderr** - Boolean value, attaches to `stderr` of the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. -- **Cmd** - Command to run specified as a string or an array of strings. -- **User** - A string value specifying the user, and optionally, group to run - the exec process inside the container. Format is one of: `"user"`, - `"user:group"`, `"uid"`, or `"uid:gid"`. - -**Status codes**: - -- **201** – no error -- **404** – no such container - -#### Exec Start - -`POST /exec/(id)/start` - -Starts a previously set up `exec` instance `id`. If `detach` is true, this API -returns after starting the `exec` command. Otherwise, this API sets up an -interactive session with the `exec` command. - -**Example request**: - - POST /v1.19/exec/e90e34656806/start HTTP/1.1 - Content-Type: application/json - - { - "Detach": false, - "Tty": false - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/vnd.docker.raw-stream - - {% raw %} - {{ STREAM }} - {% endraw %} - -**JSON parameters**: - -- **Detach** - Detach from the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance - -**Stream details**: - -Similar to the stream behavior of `POST /containers/(id or name)/attach` API - -#### Exec Resize - -`POST /exec/(id)/resize` - -Resizes the `tty` session used by the `exec` command `id`. The unit is number of characters. -This API is valid only if `tty` was specified as part of creating and starting the `exec` command. - -**Example request**: - - POST /v1.19/exec/e90e34656806/resize?h=40&w=80 HTTP/1.1 - Content-Type: text/plain - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: text/plain - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **201** – no error -- **404** – no such exec instance - -#### Exec Inspect - -`GET /exec/(id)/json` - -Return low-level information about the `exec` command `id`. - -**Example request**: - - GET /v1.19/exec/11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: plain/text - - { - "ID" : "11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39", - "Running" : false, - "ExitCode" : 2, - "ProcessConfig" : { - "privileged" : false, - "user" : "", - "tty" : false, - "entrypoint" : "sh", - "arguments" : [ - "-c", - "exit 2" - ] - }, - "OpenStdin" : false, - "OpenStderr" : false, - "OpenStdout" : false, - "Container" : { - "State" : { - "Running" : true, - "Paused" : false, - "Restarting" : false, - "OOMKilled" : false, - "Pid" : 3650, - "ExitCode" : 0, - "Error" : "", - "StartedAt" : "2014-11-17T22:26:03.717657531Z", - "FinishedAt" : "0001-01-01T00:00:00Z" - }, - "ID" : "8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c", - "Created" : "2014-11-17T22:26:03.626304998Z", - "Path" : "date", - "Args" : [], - "Config" : { - "Hostname" : "8f177a186b97", - "Domainname" : "", - "User" : "", - "AttachStdin" : false, - "AttachStdout" : false, - "AttachStderr" : false, - "PortSpecs": null, - "ExposedPorts" : null, - "Tty" : false, - "OpenStdin" : false, - "StdinOnce" : false, - "Env" : [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], - "Cmd" : [ - "date" - ], - "Image" : "ubuntu", - "Volumes" : null, - "WorkingDir" : "", - "Entrypoint" : null, - "NetworkDisabled" : false, - "MacAddress" : "", - "OnBuild" : null, - "SecurityOpt" : null - }, - "Image" : "5506de2b643be1e6febbf3b8a240760c6843244c41e12aa2f60ccbb7153d17f5", - "NetworkSettings" : { - "IPAddress" : "172.17.0.2", - "IPPrefixLen" : 16, - "MacAddress" : "02:42:ac:11:00:02", - "Gateway" : "172.17.42.1", - "Bridge" : "docker0", - "PortMapping" : null, - "Ports" : {} - }, - "ResolvConfPath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/resolv.conf", - "HostnamePath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/hostname", - "HostsPath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Name" : "/test", - "Driver" : "aufs", - "ExecDriver" : "native-0.2", - "MountLabel" : "", - "ProcessLabel" : "", - "AppArmorProfile" : "", - "RestartCount" : 0, - "Volumes" : {}, - "VolumesRW" : {} - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **500** - server error - -## 3. Going further - -### 3.1 Inside `docker run` - -As an example, the `docker run` command line makes the following API calls: - -- Create the container - -- If the status code is 404, it means the image doesn't exist: - - Try to pull it. - - Then, retry to create the container. - -- Start the container. - -- If you are not in detached mode: -- Attach to the container, using `logs=1` (to have `stdout` and - `stderr` from the container's start) and `stream=1` - -- If in detached mode or only `stdin` is attached, display the container's id. - -### 3.2 Hijacking - -In this version of the API, `/attach`, uses hijacking to transport `stdin`, -`stdout`, and `stderr` on the same socket. - -To hint potential proxies about connection hijacking, Docker client sends -connection upgrade headers similarly to websocket. - - Upgrade: tcp - Connection: Upgrade - -When Docker daemon detects the `Upgrade` header, it switches its status code -from **200 OK** to **101 UPGRADED** and resends the same headers. - - -### 3.3 CORS Requests - -To set cross origin requests to the Engine API please give values to -`--api-cors-header` when running Docker in daemon mode. Set * (asterisk) allows all, -default or blank means CORS disabled - - $ docker -d -H="192.168.1.9:2375" --api-cors-header="http://foo.bar" diff --git a/vendor/github.com/docker/docker/docs/api/v1.20.md b/vendor/github.com/docker/docker/docs/api/v1.20.md deleted file mode 100644 index 2532c4995..000000000 --- a/vendor/github.com/docker/docker/docs/api/v1.20.md +++ /dev/null @@ -1,2391 +0,0 @@ ---- -title: "Engine API v1.20" -description: "API Documentation for Docker" -keywords: "API, Docker, rcli, REST, documentation" -redirect_from: -- /engine/reference/api/docker_remote_api_v1.20/ -- /reference/api/docker_remote_api_v1.20/ ---- - - - -## 1. Brief introduction - - - The daemon listens on `unix:///var/run/docker.sock` but you can - [Bind Docker to another host/port or a Unix socket](../reference/commandline/dockerd.md#bind-docker-to-another-host-port-or-a-unix-socket). - - The API tends to be REST. However, for some complex commands, like `attach` - or `pull`, the HTTP connection is hijacked to transport `stdout`, - `stdin` and `stderr`. - -## 2. Endpoints - -### 2.1 Containers - -#### List containers - -`GET /containers/json` - -List containers - -**Example request**: - - GET /v1.20/containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "8dfafdbc3a40", - "Names":["/boring_feynman"], - "Image": "ubuntu:latest", - "Command": "echo 1", - "Created": 1367854155, - "Status": "Exit 0", - "Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}], - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "SizeRw": 12288, - "SizeRootFs": 0 - }, - { - "Id": "9cd87474be90", - "Names":["/coolName"], - "Image": "ubuntu:latest", - "Command": "echo 222222", - "Created": 1367854155, - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0 - }, - { - "Id": "3176a2479c92", - "Names":["/sleepy_dog"], - "Image": "ubuntu:latest", - "Command": "echo 3333333333333333", - "Created": 1367854154, - "Status": "Exit 0", - "Ports":[], - "Labels": {}, - "SizeRw":12288, - "SizeRootFs":0 - }, - { - "Id": "4cb07b47f9fb", - "Names":["/running_cat"], - "Image": "ubuntu:latest", - "Command": "echo 444444444444444444444444444444444", - "Created": 1367854152, - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0 - } - ] - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, Show all containers. - Only running containers are shown by default (i.e., this defaults to false) -- **limit** – Show `limit` last created - containers, include non-running ones. -- **since** – Show only containers created since Id, include - non-running ones. -- **before** – Show only containers created before Id, include - non-running ones. -- **size** – 1/True/true or 0/False/false, Show the containers - sizes -- **filters** - a JSON encoded value of the filters (a `map[string][]string`) to process on the containers list. Available filters: - - `exited=`; -- containers with exit code of `` ; - - `status=`(`created`|`restarting`|`running`|`paused`|`exited`) - - `label=key` or `label="key=value"` of a container label - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **500** – server error - -#### Create a container - -`POST /containers/create` - -Create a container - -**Example request**: - - POST /v1.20/containers/create HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "FOO=bar", - "BAZ=quux" - ], - "Cmd": [ - "date" - ], - "Entrypoint": null, - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "HostConfig": { - "Binds": ["/tmp:/tmp"], - "Links": ["redis3:redis"], - "LxcConf": {"lxc.utsname":"docker"}, - "Memory": 0, - "MemorySwap": 0, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0,1", - "BlkioWeight": 300, - "MemorySwappiness": 60, - "OomKillDisable": false, - "PidMode": "", - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsSearch": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "GroupAdd": ["newgroup"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "NetworkMode": "bridge", - "Devices": [], - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [], - "CgroupParent": "" - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id":"e90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **Hostname** - A string value containing the hostname to use for the - container. -- **Domainname** - A string value containing the domain name to use - for the container. -- **User** - A string value specifying the user inside the container. -- **AttachStdin** - Boolean value, attaches to `stdin`. -- **AttachStdout** - Boolean value, attaches to `stdout`. -- **AttachStderr** - Boolean value, attaches to `stderr`. -- **Tty** - Boolean value, Attach standard streams to a `tty`, including `stdin` if it is not closed. -- **OpenStdin** - Boolean value, opens `stdin`, -- **StdinOnce** - Boolean value, close `stdin` after the 1 attached client disconnects. -- **Env** - A list of environment variables in the form of `["VAR=value", ...]` -- **Labels** - Adds a map of labels to a container. To specify a map: `{"key":"value", ... }` -- **Cmd** - Command to run specified as a string or an array of strings. -- **Entrypoint** - Set the entry point for the container as a string or an array - of strings. -- **Image** - A string specifying the image name to use for the container. -- **Volumes** - An object mapping mount point paths (strings) inside the - container to empty objects. -- **WorkingDir** - A string specifying the working directory for commands to - run in. -- **NetworkDisabled** - Boolean value, when true disables networking for the - container -- **ExposedPorts** - An object mapping ports to an empty object in the form of: - `"ExposedPorts": { "/: {}" }` -- **HostConfig** - - **Binds** – A list of bind-mounts for this container. Each item is a string in one of these forms: - + `host-src:container-dest` to bind-mount a host path into the - container. Both `host-src`, and `container-dest` must be an - _absolute_ path. - + `host-src:container-dest:ro` to make the bind-mount read-only - inside the container. Both `host-src`, and `container-dest` must be - an _absolute_ path. - - **Links** - A list of links for the container. Each link entry should be - in the form of `container_name:alias`. - - **LxcConf** - LXC specific configurations. These configurations only - work when using the `lxc` execution driver. - - **Memory** - Memory limit in bytes. - - **MemorySwap** - Total memory limit (memory + swap); set `-1` to enable unlimited swap. - You must use this with `memory` and make the swap value larger than `memory`. - - **CpuShares** - An integer value containing the container's CPU Shares - (ie. the relative weight vs other containers). - - **CpuPeriod** - The length of a CPU period in microseconds. - - **CpuQuota** - Microseconds of CPU time that the container can get in a CPU period. - - **CpusetCpus** - String value containing the `cgroups CpusetCpus` to use. - - **CpusetMems** - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - - **BlkioWeight** - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - - **MemorySwappiness** - Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100. - - **OomKillDisable** - Boolean value, whether to disable OOM Killer for the container or not. - - **PidMode** - Set the PID (Process) Namespace mode for the container; - `"container:"`: joins another container's PID namespace - `"host"`: use the host's PID namespace inside the container - - **PortBindings** - A map of exposed container ports and the host port they - should map to. A JSON object in the form - `{ /: [{ "HostPort": "" }] }` - Take note that `port` is specified as a string and not an integer value. - - **PublishAllPorts** - Allocates a random host port for all of a container's - exposed ports. Specified as a boolean value. - - **Privileged** - Gives the container full access to the host. Specified as - a boolean value. - - **ReadonlyRootfs** - Mount the container's root filesystem as read only. - Specified as a boolean value. - - **Dns** - A list of DNS servers for the container to use. - - **DnsSearch** - A list of DNS search domains - - **ExtraHosts** - A list of hostnames/IP mappings to add to the - container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`. - - **VolumesFrom** - A list of volumes to inherit from another container. - Specified in the form `[:]` - - **CapAdd** - A list of kernel capabilities to add to the container. - - **Capdrop** - A list of kernel capabilities to drop from the container. - - **GroupAdd** - A list of additional groups that the container process will run as - - **RestartPolicy** – The behavior to apply when the container exits. The - value is an object with a `Name` property of either `"always"` to - always restart or `"on-failure"` to restart only when the container - exit code is non-zero. If `on-failure` is used, `MaximumRetryCount` - controls the number of times to retry before giving up. - The default is not to restart. (optional) - An ever increasing delay (double the previous delay, starting at 100mS) - is added before each restart to prevent flooding the server. - - **NetworkMode** - Sets the networking mode for the container. Supported - values are: `bridge`, `host`, `none`, and `container:` - - **Devices** - A list of devices to add to the container specified as a JSON object in the - form - `{ "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}` - - **Ulimits** - A list of ulimits to set in the container, specified as - `{ "Name": , "Soft": , "Hard": }`, for example: - `Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }` - - **SecurityOpt**: A list of string values to customize labels for MLS - systems, such as SELinux. - - **LogConfig** - Log configuration for the container, specified as a JSON object in the form - `{ "Type": "", "Config": {"key1": "val1"}}`. - Available types: `json-file`, `syslog`, `journald`, `gelf`, `none`. - `json-file` logging driver. - - **CgroupParent** - Path to `cgroups` under which the container's `cgroup` is created. If the path is not absolute, the path is considered to be relative to the `cgroups` path of the init process. Cgroups are created if they do not already exist. - -**Query parameters**: - -- **name** – Assign the specified name to the container. Must - match `/?[a-zA-Z0-9_-]+`. - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such container -- **406** – impossible to attach (container not running) -- **409** – conflict -- **500** – server error - -#### Inspect a container - -`GET /containers/(id or name)/json` - -Return low-level information on the container `id` - -**Example request**: - - GET /v1.20/containers/4fa6e0f0c678/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "AppArmorProfile": "", - "Args": [ - "-c", - "exit 9" - ], - "Config": { - "AttachStderr": true, - "AttachStdin": false, - "AttachStdout": true, - "Cmd": [ - "/bin/sh", - "-c", - "exit 9" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts": null, - "Hostname": "ba033ac44011", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "MacAddress": "", - "NetworkDisabled": false, - "OnBuild": null, - "OpenStdin": false, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": null, - "WorkingDir": "" - }, - "Created": "2015-01-06T15:47:31.485331387Z", - "Driver": "devicemapper", - "ExecDriver": "native-0.2", - "ExecIDs": null, - "HostConfig": { - "Binds": null, - "BlkioWeight": 0, - "CapAdd": null, - "CapDrop": null, - "ContainerIDFile": "", - "CpusetCpus": "", - "CpusetMems": "", - "CpuShares": 0, - "CpuPeriod": 100000, - "Devices": [], - "Dns": null, - "DnsSearch": null, - "ExtraHosts": null, - "IpcMode": "", - "Links": null, - "LxcConf": [], - "Memory": 0, - "MemorySwap": 0, - "OomKillDisable": false, - "NetworkMode": "bridge", - "PidMode": "", - "PortBindings": {}, - "Privileged": false, - "ReadonlyRootfs": false, - "PublishAllPorts": false, - "RestartPolicy": { - "MaximumRetryCount": 2, - "Name": "on-failure" - }, - "LogConfig": { - "Config": null, - "Type": "json-file" - }, - "SecurityOpt": null, - "VolumesFrom": null, - "Ulimits": [{}] - }, - "HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname", - "HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39", - "Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2", - "MountLabel": "", - "Name": "/boring_euclid", - "NetworkSettings": { - "Bridge": "", - "Gateway": "", - "IPAddress": "", - "IPPrefixLen": 0, - "MacAddress": "", - "PortMapping": null, - "Ports": null - }, - "Path": "/bin/sh", - "ProcessLabel": "", - "ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf", - "RestartCount": 1, - "State": { - "Error": "", - "ExitCode": 9, - "FinishedAt": "2015-01-06T15:47:32.080254511Z", - "OOMKilled": false, - "Paused": false, - "Pid": 0, - "Restarting": false, - "Running": true, - "StartedAt": "2015-01-06T15:47:32.072697474Z" - }, - "Mounts": [ - { - "Source": "/data", - "Destination": "/data", - "Mode": "ro,Z", - "RW": false - } - ] - } - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### List processes running inside a container - -`GET /containers/(id or name)/top` - -List processes running inside the container `id`. On Unix systems this -is done by running the `ps` command. This endpoint is not -supported on Windows. - -**Example request**: - - GET /v1.20/containers/4fa6e0f0c678/top HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "UID", "PID", "PPID", "C", "STIME", "TTY", "TIME", "CMD" - ], - "Processes" : [ - [ - "root", "13642", "882", "0", "17:03", "pts/0", "00:00:00", "/bin/bash" - ], - [ - "root", "13735", "13642", "0", "17:06", "pts/0", "00:00:00", "sleep 10" - ] - ] - } - -**Example request**: - - GET /v1.20/containers/4fa6e0f0c678/top?ps_args=aux HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "USER","PID","%CPU","%MEM","VSZ","RSS","TTY","STAT","START","TIME","COMMAND" - ] - "Processes" : [ - [ - "root","13642","0.0","0.1","18172","3184","pts/0","Ss","17:03","0:00","/bin/bash" - ], - [ - "root","13895","0.0","0.0","4348","692","pts/0","S+","17:15","0:00","sleep 10" - ] - ], - } - -**Query parameters**: - -- **ps_args** – `ps` arguments to use (e.g., `aux`), defaults to `-ef` - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container logs - -`GET /containers/(id or name)/logs` - -Get `stdout` and `stderr` logs from the container ``id`` - -> **Note**: -> This endpoint works only for containers with the `json-file` or `journald` logging drivers. - -**Example request**: - - GET /v1.20/containers/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **follow** – 1/True/true or 0/False/false, return stream. Default `false`. -- **stdout** – 1/True/true or 0/False/false, show `stdout` log. Default `false`. -- **stderr** – 1/True/true or 0/False/false, show `stderr` log. Default `false`. -- **since** – UNIX timestamp (integer) to filter logs. Specifying a timestamp - will only output log-entries since that timestamp. Default: 0 (unfiltered) -- **timestamps** – 1/True/true or 0/False/false, print timestamps for - every log line. Default `false`. -- **tail** – Output specified number of lines at the end of logs: `all` or ``. Default all. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **404** – no such container -- **500** – server error - -#### Inspect changes on a container's filesystem - -`GET /containers/(id or name)/changes` - -Inspect changes on container `id`'s filesystem - -**Example request**: - - GET /v1.20/containers/4fa6e0f0c678/changes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Path": "/dev", - "Kind": 0 - }, - { - "Path": "/dev/kmsg", - "Kind": 1 - }, - { - "Path": "/test", - "Kind": 1 - } - ] - -Values for `Kind`: - -- `0`: Modify -- `1`: Add -- `2`: Delete - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Export a container - -`GET /containers/(id or name)/export` - -Export the contents of container `id` - -**Example request**: - - GET /v1.20/containers/4fa6e0f0c678/export HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/octet-stream - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container stats based on resource usage - -`GET /containers/(id or name)/stats` - -This endpoint returns a live stream of a container's resource usage statistics. - -**Example request**: - - GET /v1.20/containers/redis1/stats HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "read" : "2015-01-08T22:57:31.547920715Z", - "network" : { - "rx_dropped" : 0, - "rx_bytes" : 648, - "rx_errors" : 0, - "tx_packets" : 8, - "tx_dropped" : 0, - "rx_packets" : 8, - "tx_errors" : 0, - "tx_bytes" : 648 - }, - "memory_stats" : { - "stats" : { - "total_pgmajfault" : 0, - "cache" : 0, - "mapped_file" : 0, - "total_inactive_file" : 0, - "pgpgout" : 414, - "rss" : 6537216, - "total_mapped_file" : 0, - "writeback" : 0, - "unevictable" : 0, - "pgpgin" : 477, - "total_unevictable" : 0, - "pgmajfault" : 0, - "total_rss" : 6537216, - "total_rss_huge" : 6291456, - "total_writeback" : 0, - "total_inactive_anon" : 0, - "rss_huge" : 6291456, - "hierarchical_memory_limit" : 67108864, - "total_pgfault" : 964, - "total_active_file" : 0, - "active_anon" : 6537216, - "total_active_anon" : 6537216, - "total_pgpgout" : 414, - "total_cache" : 0, - "inactive_anon" : 0, - "active_file" : 0, - "pgfault" : 964, - "inactive_file" : 0, - "total_pgpgin" : 477 - }, - "max_usage" : 6651904, - "usage" : 6537216, - "failcnt" : 0, - "limit" : 67108864 - }, - "blkio_stats" : {}, - "cpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24472255, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100215355, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 739306590000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - }, - "precpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24350896, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100093996, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 9492140000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - } - } - -The precpu_stats is the cpu statistic of last read, which is used for calculating the cpu usage percent. It is not the exact copy of the “cpu_stats” field. - -**Query parameters**: - -- **stream** – 1/True/true or 0/False/false, pull stats once then disconnect. Default `true`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Resize a container TTY - -`POST /containers/(id or name)/resize?h=&w=` - -Resize the TTY for container with `id`. You must restart the container for the resize to take effect. - -**Example request**: - - POST /v1.20/containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **200** – no error -- **404** – No such container -- **500** – Cannot resize container - -#### Start a container - -`POST /containers/(id or name)/start` - -Start the container `id` - -> **Note**: -> For backwards compatibility, this endpoint accepts a `HostConfig` as JSON-encoded request body. -> See [create a container](#create-a-container) for details. - -**Example request**: - - POST /v1.20/containers/e90e34656806/start HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **304** – container already started -- **404** – no such container -- **500** – server error - -#### Stop a container - -`POST /containers/(id or name)/stop` - -Stop the container `id` - -**Example request**: - - POST /v1.20/containers/e90e34656806/stop?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **304** – container already stopped -- **404** – no such container -- **500** – server error - -#### Restart a container - -`POST /containers/(id or name)/restart` - -Restart the container `id` - -**Example request**: - - POST /v1.20/containers/e90e34656806/restart?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Kill a container - -`POST /containers/(id or name)/kill` - -Kill the container `id` - -**Example request**: - - POST /v1.20/containers/e90e34656806/kill HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **signal** - Signal to send to the container: integer or string like `SIGINT`. - When not set, `SIGKILL` is assumed and the call waits for the container to exit. - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Rename a container - -`POST /containers/(id or name)/rename` - -Rename the container `id` to a `new_name` - -**Example request**: - - POST /v1.20/containers/e90e34656806/rename?name=new_name HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **name** – new name for the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **409** - conflict name already assigned -- **500** – server error - -#### Pause a container - -`POST /containers/(id or name)/pause` - -Pause the container `id` - -**Example request**: - - POST /v1.20/containers/e90e34656806/pause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Unpause a container - -`POST /containers/(id or name)/unpause` - -Unpause the container `id` - -**Example request**: - - POST /v1.20/containers/e90e34656806/unpause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Attach to a container - -`POST /containers/(id or name)/attach` - -Attach to the container `id` - -**Example request**: - - POST /v1.20/containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -**Stream details**: - -When using the TTY setting is enabled in -[`POST /containers/create` -](#create-a-container), -the stream is the raw data from the process PTY and client's `stdin`. -When the TTY is disabled, then the stream is multiplexed to separate -`stdout` and `stderr`. - -The format is a **Header** and a **Payload** (frame). - -**HEADER** - -The header contains the information which the stream writes (`stdout` or -`stderr`). It also contains the size of the associated frame encoded in the -last four bytes (`uint32`). - -It is encoded on the first eight bytes like this: - - header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4} - -`STREAM_TYPE` can be: - -- 0: `stdin` (is written on `stdout`) -- 1: `stdout` -- 2: `stderr` - -`SIZE1, SIZE2, SIZE3, SIZE4` are the four bytes of -the `uint32` size encoded as big endian. - -**PAYLOAD** - -The payload is the raw stream. - -**IMPLEMENTATION** - -The simplest way to implement the Attach protocol is the following: - - 1. Read eight bytes. - 2. Choose `stdout` or `stderr` depending on the first byte. - 3. Extract the frame size from the last four bytes. - 4. Read the extracted size and output it on the correct output. - 5. Goto 1. - -#### Attach to a container (websocket) - -`GET /containers/(id or name)/attach/ws` - -Attach to the container `id` via websocket - -Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455) - -**Example request** - - GET /v1.20/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1 - -**Example response** - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -#### Wait a container - -`POST /containers/(id or name)/wait` - -Block until container `id` stops, then returns the exit code - -**Example request**: - - POST /v1.20/containers/16253994b7c4/wait HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"StatusCode": 0} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Remove a container - -`DELETE /containers/(id or name)` - -Remove the container `id` from the filesystem - -**Example request**: - - DELETE /v1.20/containers/16253994b7c4?v=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **v** – 1/True/true or 0/False/false, Remove the volumes - associated to the container. Default `false`. -- **force** - 1/True/true or 0/False/false, Kill then remove the container. - Default `false`. - -**Status codes**: - -- **204** – no error -- **400** – bad parameter -- **404** – no such container -- **409** – conflict -- **500** – server error - -#### Copy files or folders from a container - -`POST /containers/(id or name)/copy` - -Copy files or folders of container `id` - -**Deprecated** in favor of the `archive` endpoint below. - -**Example request**: - - POST /v1.20/containers/4fa6e0f0c678/copy HTTP/1.1 - Content-Type: application/json - - { - "Resource": "test.txt" - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Retrieving information about files and folders in a container - -`HEAD /containers/(id or name)/archive` - -See the description of the `X-Docker-Container-Path-Stat` header in the -following section. - -#### Get an archive of a filesystem resource in a container - -`GET /containers/(id or name)/archive` - -Get a tar archive of a resource in the filesystem of container `id`. - -**Query parameters**: - -- **path** - resource in the container's filesystem to archive. Required. - - If not an absolute path, it is relative to the container's root directory. - The resource specified by **path** must exist. To assert that the resource - is expected to be a directory, **path** should end in `/` or `/.` - (assuming a path separator of `/`). If **path** ends in `/.` then this - indicates that only the contents of the **path** directory should be - copied. A symlink is always resolved to its target. - - > **Note**: It is not possible to copy certain system files such as resources - > under `/proc`, `/sys`, `/dev`, and mounts created by the user in the - > container. - -**Example request**: - - GET /v1.20/containers/8cce319429b2/archive?path=/root HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - X-Docker-Container-Path-Stat: eyJuYW1lIjoicm9vdCIsInNpemUiOjQwOTYsIm1vZGUiOjIxNDc0ODQwOTYsIm10aW1lIjoiMjAxNC0wMi0yN1QyMDo1MToyM1oiLCJsaW5rVGFyZ2V0IjoiIn0= - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -On success, a response header `X-Docker-Container-Path-Stat` will be set to a -base64-encoded JSON object containing some filesystem header information about -the archived resource. The above example value would decode to the following -JSON object (whitespace added for readability): - -```json -{ - "name": "root", - "size": 4096, - "mode": 2147484096, - "mtime": "2014-02-27T20:51:23Z", - "linkTarget": "" -} -``` - -A `HEAD` request can also be made to this endpoint if only this information is -desired. - -**Status codes**: - -- **200** - success, returns archive of copied resource -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** was asserted to be a directory but exists as a - file) -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** does not exist) -- **500** - server error - -#### Extract an archive of files or folders to a directory in a container - -`PUT /containers/(id or name)/archive` - -Upload a tar archive to be extracted to a path in the filesystem of container -`id`. - -**Query parameters**: - -- **path** - path to a directory in the container - to extract the archive's contents into. Required. - - If not an absolute path, it is relative to the container's root directory. - The **path** resource must exist. -- **noOverwriteDirNonDir** - If "1", "true", or "True" then it will be an error - if unpacking the given content would cause an existing directory to be - replaced with a non-directory and vice versa. - -**Example request**: - - PUT /v1.20/containers/8cce319429b2/archive?path=/vol1 HTTP/1.1 - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – the content was extracted successfully -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** should be a directory but exists as a file) - - unable to overwrite existing directory with non-directory - (if **noOverwriteDirNonDir**) - - unable to overwrite existing non-directory with directory - (if **noOverwriteDirNonDir**) -- **403** - client error, permission denied, the volume - or container rootfs is marked as read-only. -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** resource does not exist) -- **500** – server error - -### 2.2 Images - -#### List Images - -`GET /images/json` - -**Example request**: - - GET /v1.20/images/json?all=0 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "RepoTags": [ - "ubuntu:12.04", - "ubuntu:precise", - "ubuntu:latest" - ], - "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c", - "Created": 1365714795, - "Size": 131506275, - "VirtualSize": 131506275, - "Labels": {} - }, - { - "RepoTags": [ - "ubuntu:12.10", - "ubuntu:quantal" - ], - "ParentId": "27cf784147099545", - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Created": 1364102658, - "Size": 24653, - "VirtualSize": 180116135, - "Labels": { - "com.example.version": "v1" - } - } - ] - -**Example request, with digest information**: - - GET /v1.20/images/json?digests=1 HTTP/1.1 - -**Example response, with digest information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Created": 1420064636, - "Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125", - "ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2", - "RepoDigests": [ - "localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags": [ - "localhost:5000/test/busybox:latest", - "playdate:latest" - ], - "Size": 0, - "VirtualSize": 2429728, - "Labels": {} - } - ] - -The response shows a single image `Id` associated with two repositories -(`RepoTags`): `localhost:5000/test/busybox`: and `playdate`. A caller can use -either of the `RepoTags` values `localhost:5000/test/busybox:latest` or -`playdate:latest` to reference the image. - -You can also use `RepoDigests` values to reference an image. In this response, -the array has only one reference and that is to the -`localhost:5000/test/busybox` repository; the `playdate` repository has no -digest. You can reference this digest using the value: -`localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...` - -See the `docker run` and `docker build` commands for examples of digest and tag -references on the command line. - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, default false -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `dangling=true` - - `label=key` or `label="key=value"` of an image label -- **filter** - only return images with the specified name - -#### Build image from a Dockerfile - -`POST /build` - -Build an image from a Dockerfile - -**Example request**: - - POST /v1.20/build HTTP/1.1 - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"stream": "Step 1/5..."} - {"stream": "..."} - {"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}} - -The input stream must be a `tar` archive compressed with one of the -following algorithms: `identity` (no compression), `gzip`, `bzip2`, `xz`. - -The archive must include a build instructions file, typically called -`Dockerfile` at the archive's root. The `dockerfile` parameter may be -used to specify a different build instructions file. To do this, its value must be -the path to the alternate build instructions file to use. - -The archive may include any number of other files, -which are accessible in the build context (See the [*ADD build -command*](../reference/builder.md#add)). - -The Docker daemon performs a preliminary validation of the `Dockerfile` before -starting the build, and returns an error if the syntax is incorrect. After that, -each instruction is run one-by-one until the ID of the new image is output. - -The build is canceled if the client drops the connection by quitting -or being killed. - -**Query parameters**: - -- **dockerfile** - Path within the build context to the `Dockerfile`. This is - ignored if `remote` is specified and points to an external `Dockerfile`. -- **t** – A name and optional tag to apply to the image in the `name:tag` format. - If you omit the `tag` the default `latest` value is assumed. -- **remote** – A Git repository URI or HTTP/HTTPS context URI. If the - URI points to a single text file, the file's contents are placed into - a file called `Dockerfile` and the image is built from that file. If - the URI points to a tarball, the file is downloaded by the daemon and - the contents therein used as the context for the build. If the URI - points to a tarball and the `dockerfile` parameter is also specified, - there must be a file with the corresponding path inside the tarball. -- **q** – Suppress verbose build output. -- **nocache** – Do not use the cache when building the image. -- **pull** - Attempt to pull the image even if an older image exists locally. -- **rm** - Remove intermediate containers after a successful build (default behavior). -- **forcerm** - Always remove intermediate containers (includes `rm`). -- **memory** - Set memory limit for build. -- **memswap** - Total memory (memory + swap), `-1` to enable unlimited swap. -- **cpushares** - CPU shares (relative weight). -- **cpusetcpus** - CPUs in which to allow execution (e.g., `0-3`, `0,1`). -- **cpuperiod** - The length of a CPU period in microseconds. -- **cpuquota** - Microseconds of CPU time that the container can get in a CPU period. - -**Request Headers**: - -- **Content-type** – Set to `"application/tar"`. -- **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON - object with the following structure: - - { - "docker.example.com": { - "username": "janedoe", - "password": "hunter2" - }, - "https://index.docker.io/v1/": { - "username": "mobydock", - "password": "conta1n3rize14" - } - } - - This object maps the hostname of a registry to an object containing the - "username" and "password" for that registry. Multiple registries may - be specified as the build may be based on an image requiring - authentication to pull from any arbitrary registry. Only the registry - domain name (and port if not the default "443") are required. However - (for legacy reasons) the "official" Docker, Inc. hosted registry must - be specified with both a "https://" prefix and a "/v1/" suffix even - though Docker will prefer to use the v2 registry API. - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Create an image - -`POST /images/create` - -Create an image either by pulling it from the registry or by importing it - -**Example request**: - - POST /v1.20/images/create?fromImage=busybox&tag=latest HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pulling..."} - {"status": "Pulling", "progress": "1 B/ 100 B", "progressDetail": {"current": 1, "total": 100}} - {"error": "Invalid..."} - ... - -When using this endpoint to pull an image from the registry, the -`X-Registry-Auth` header can be used to include -a base64-encoded AuthConfig object. - -**Query parameters**: - -- **fromImage** – Name of the image to pull. -- **fromSrc** – Source to import. The value may be a URL from which the image - can be retrieved or `-` to read the image from the request body. -- **repo** – Repository name. -- **tag** – Tag. If empty when pulling an image, this causes all tags - for the given image to be pulled. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object - -**Status codes**: - -- **200** – no error -- **404** - repository does not exist or no read access -- **500** – server error - - - -#### Inspect an image - -`GET /images/(name)/json` - -Return low-level information on the image `name` - -**Example request**: - - GET /v1.20/images/ubuntu/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Created": "2013-03-23T22:24:18.818426-07:00", - "Container": "3d67245a8d72ecf13f33dffac9f79dcdf70f75acb84d308770391510e0c23ad0", - "ContainerConfig": { - "Hostname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "Tty": true, - "OpenStdin": true, - "StdinOnce": false, - "Env": null, - "Cmd": ["/bin/bash"], - "Dns": null, - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": null, - "VolumesFrom": "", - "WorkingDir": "" - }, - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Parent": "27cf784147099545", - "Size": 6824592 - } - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Get the history of an image - -`GET /images/(name)/history` - -Return the history of the image `name` - -**Example request**: - - GET /v1.20/images/ubuntu/history HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710", - "Created": 1398108230, - "CreatedBy": "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /", - "Tags": [ - "ubuntu:lucid", - "ubuntu:10.04" - ], - "Size": 182964289, - "Comment": "" - }, - { - "Id": "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8", - "Created": 1398108222, - "CreatedBy": "/bin/sh -c #(nop) MAINTAINER Tianon Gravi - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/", - "Tags": null, - "Size": 0, - "Comment": "" - }, - { - "Id": "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158", - "Created": 1371157430, - "CreatedBy": "", - "Tags": [ - "scratch12:latest", - "scratch:latest" - ], - "Size": 0, - "Comment": "Imported from -" - } - ] - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Push an image on the registry - -`POST /images/(name)/push` - -Push the image `name` on the registry - -**Example request**: - - POST /v1.20/images/test/push HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pushing..."} - {"status": "Pushing", "progress": "1/? (n/a)", "progressDetail": {"current": 1}}} - {"error": "Invalid..."} - ... - -If you wish to push an image on to a private registry, that image must already have a tag -into a repository which references that registry `hostname` and `port`. This repository name should -then be used in the URL. This duplicates the command line's flow. - -**Example request**: - - POST /v1.20/images/registry.acme.com:5000/test/push HTTP/1.1 - - -**Query parameters**: - -- **tag** – The tag to associate with the image on the registry. This is optional. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object. - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Tag an image into a repository - -`POST /images/(name)/tag` - -Tag the image `name` into a repository - -**Example request**: - - POST /v1.20/images/test/tag?repo=myrepo&force=0&tag=v42 HTTP/1.1 - -**Example response**: - - HTTP/1.1 201 Created - -**Query parameters**: - -- **repo** – The repository to tag in -- **force** – 1/True/true or 0/False/false, default false -- **tag** - The new tag name - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Remove an image - -`DELETE /images/(name)` - -Remove the image `name` from the filesystem - -**Example request**: - - DELETE /v1.20/images/test HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-type: application/json - - [ - {"Untagged": "3e2f21a89f"}, - {"Deleted": "3e2f21a89f"}, - {"Deleted": "53b4f83ac9"} - ] - -**Query parameters**: - -- **force** – 1/True/true or 0/False/false, default false -- **noprune** – 1/True/true or 0/False/false, default false - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Search images - -`GET /images/search` - -Search for an image on [Docker Hub](https://hub.docker.com). - -> **Note**: -> The response keys have changed from API v1.6 to reflect the JSON -> sent by the registry server to the docker daemon's request. - -**Example request**: - - GET /v1.20/images/search?term=sshd HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "wma55/u1210sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "jdswinbank/sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "vgauthier/sshd", - "star_count": 0 - } - ... - ] - -**Query parameters**: - -- **term** – term to search - -**Status codes**: - -- **200** – no error -- **500** – server error - -### 2.3 Misc - -#### Check auth configuration - -`POST /auth` - -Get the default username and email - -**Example request**: - - POST /v1.20/auth HTTP/1.1 - Content-Type: application/json - - { - "username": "hannibal", - "password": "xxxx", - "email": "hannibal@a-team.com", - "serveraddress": "https://index.docker.io/v1/" - } - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – no error -- **204** – no error -- **500** – server error - -#### Display system-wide information - -`GET /info` - -Display system-wide information - -**Example request**: - - GET /v1.20/info HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Containers": 11, - "CpuCfsPeriod": true, - "CpuCfsQuota": true, - "Debug": false, - "DockerRootDir": "/var/lib/docker", - "Driver": "btrfs", - "DriverStatus": [[""]], - "ExecutionDriver": "native-0.1", - "ExperimentalBuild": false, - "HttpProxy": "http://test:test@localhost:8080", - "HttpsProxy": "https://test:test@localhost:8080", - "ID": "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS", - "IPv4Forwarding": true, - "Images": 16, - "IndexServerAddress": "https://index.docker.io/v1/", - "InitPath": "/usr/bin/docker", - "InitSha1": "", - "KernelVersion": "3.12.0-1-amd64", - "Labels": [ - "storage=ssd" - ], - "MemTotal": 2099236864, - "MemoryLimit": true, - "NCPU": 1, - "NEventsListener": 0, - "NFd": 11, - "NGoroutines": 21, - "Name": "prod-server-42", - "NoProxy": "9.81.1.160", - "OomKillDisable": true, - "OperatingSystem": "Boot2Docker", - "RegistryConfig": { - "IndexConfigs": { - "docker.io": { - "Mirrors": null, - "Name": "docker.io", - "Official": true, - "Secure": true - } - }, - "InsecureRegistryCIDRs": [ - "127.0.0.0/8" - ] - }, - "SwapLimit": false, - "SystemTime": "2015-03-10T11:11:23.730591467-07:00" - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Show the docker version information - -`GET /version` - -Show the docker version information - -**Example request**: - - GET /v1.20/version HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Version": "1.5.0", - "Os": "linux", - "KernelVersion": "3.18.5-tinycore64", - "GoVersion": "go1.4.1", - "GitCommit": "a8a31ef", - "Arch": "amd64", - "ApiVersion": "1.20", - "Experimental": false - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Ping the docker server - -`GET /_ping` - -Ping the docker server - -**Example request**: - - GET /v1.20/_ping HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: text/plain - - OK - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Create a new image from a container's changes - -`POST /commit` - -Create a new image from a container's changes - -**Example request**: - - POST /v1.20/commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Mounts": [ - { - "Source": "/data", - "Destination": "/data", - "Mode": "ro,Z", - "RW": false - } - ], - "Labels": { - "key1": "value1", - "key2": "value2" - }, - "WorkingDir": "", - "NetworkDisabled": false, - "ExposedPorts": { - "22/tcp": {} - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - {"Id": "596069db4bf5"} - -**JSON parameters**: - -- **config** - the container's configuration - -**Query parameters**: - -- **container** – source container -- **repo** – repository -- **tag** – tag -- **comment** – commit message -- **author** – author (e.g., "John Hannibal Smith - <[hannibal@a-team.com](mailto:hannibal%40a-team.com)>") -- **pause** – 1/True/true or 0/False/false, whether to pause the container before committing -- **changes** – Dockerfile instructions to apply while committing - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **500** – server error - -#### Monitor Docker's events - -`GET /events` - -Get container events from docker, in real time via streaming. - -Docker containers report the following events: - - attach, commit, copy, create, destroy, die, exec_create, exec_start, export, kill, oom, pause, rename, resize, restart, start, stop, top, unpause - -Docker images report the following events: - - delete, import, pull, push, tag, untag - -**Example request**: - - GET /v1.20/events?since=1374067924 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924} - {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924} - {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966} - {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970} - -**Query parameters**: - -- **since** – Timestamp. Show all events created since timestamp and then stream -- **until** – Timestamp. Show events created until given timestamp and stop streaming -- **filters** – A json encoded value of the filters (a map[string][]string) to process on the event list. Available filters: - - `container=`; -- container to filter - - `event=`; -- event to filter - - `image=`; -- image to filter - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images in a repository - -`GET /images/(name)/get` - -Get a tarball containing all images and metadata for the repository specified -by `name`. - -If `name` is a specific name and tag (e.g. ubuntu:latest), then only that image -(and its parents) are returned. If `name` is an image ID, similarly only that -image (and its parents) are returned, but with the exclusion of the -'repositories' file in the tarball, as there were no image names referenced. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.20/images/ubuntu/get - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images - -`GET /images/get` - -Get a tarball containing all images and metadata for one or more repositories. - -For each value of the `names` parameter: if it is a specific name and tag (e.g. -`ubuntu:latest`), then only that image (and its parents) are returned; if it is -an image ID, similarly only that image (and its parents) are returned and there -would be no names referenced in the 'repositories' file for this image ID. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.20/images/get?names=myname%2Fmyapp%3Alatest&names=busybox - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Load a tarball with a set of images and tags into docker - -`POST /images/load` - -Load a set of images and tags into a Docker repository. -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - POST /v1.20/images/load - Content-Type: application/x-tar - - Tarball in body - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Image tarball format - -An image tarball contains one directory per image layer (named using its long ID), -each containing these files: - -- `VERSION`: currently `1.0` - the file format version -- `json`: detailed layer information, similar to `docker inspect layer_id` -- `layer.tar`: A tarfile containing the filesystem changes in this layer - -The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories -for storing attribute changes and deletions. - -If the tarball defines a repository, the tarball should also include a `repositories` file at -the root that contains a list of repository and tag names mapped to layer IDs. - -``` -{"hello-world": - {"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"} -} -``` - -#### Exec Create - -`POST /containers/(id or name)/exec` - -Sets up an exec instance in a running container `id` - -**Example request**: - - POST /v1.20/containers/e90e34656806/exec HTTP/1.1 - Content-Type: application/json - - { - "AttachStdin": true, - "AttachStdout": true, - "AttachStderr": true, - "Cmd": ["sh"], - "Tty": true, - "User": "123:456" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id": "f90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **AttachStdin** - Boolean value, attaches to `stdin` of the `exec` command. -- **AttachStdout** - Boolean value, attaches to `stdout` of the `exec` command. -- **AttachStderr** - Boolean value, attaches to `stderr` of the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. -- **Cmd** - Command to run specified as a string or an array of strings. -- **User** - A string value specifying the user, and optionally, group to run - the exec process inside the container. Format is one of: `"user"`, - `"user:group"`, `"uid"`, or `"uid:gid"`. - -**Status codes**: - -- **201** – no error -- **404** – no such container - -#### Exec Start - -`POST /exec/(id)/start` - -Starts a previously set up `exec` instance `id`. If `detach` is true, this API -returns after starting the `exec` command. Otherwise, this API sets up an -interactive session with the `exec` command. - -**Example request**: - - POST /v1.20/exec/e90e34656806/start HTTP/1.1 - Content-Type: application/json - - { - "Detach": false, - "Tty": false - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/vnd.docker.raw-stream - - {% raw %} - {{ STREAM }} - {% endraw %} - -**JSON parameters**: - -- **Detach** - Detach from the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance - -**Stream details**: - -Similar to the stream behavior of `POST /containers/(id or name)/attach` API - -#### Exec Resize - -`POST /exec/(id)/resize` - -Resizes the `tty` session used by the `exec` command `id`. The unit is number of characters. -This API is valid only if `tty` was specified as part of creating and starting the `exec` command. - -**Example request**: - - POST /v1.20/exec/e90e34656806/resize?h=40&w=80 HTTP/1.1 - Content-Type: text/plain - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: text/plain - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **201** – no error -- **404** – no such exec instance - -#### Exec Inspect - -`GET /exec/(id)/json` - -Return low-level information about the `exec` command `id`. - -**Example request**: - - GET /v1.20/exec/11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: plain/text - - { - "ID" : "11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39", - "Running" : false, - "ExitCode" : 2, - "ProcessConfig" : { - "privileged" : false, - "user" : "", - "tty" : false, - "entrypoint" : "sh", - "arguments" : [ - "-c", - "exit 2" - ] - }, - "OpenStdin" : false, - "OpenStderr" : false, - "OpenStdout" : false, - "Container" : { - "State" : { - "Running" : true, - "Paused" : false, - "Restarting" : false, - "OOMKilled" : false, - "Pid" : 3650, - "ExitCode" : 0, - "Error" : "", - "StartedAt" : "2014-11-17T22:26:03.717657531Z", - "FinishedAt" : "0001-01-01T00:00:00Z" - }, - "ID" : "8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c", - "Created" : "2014-11-17T22:26:03.626304998Z", - "Path" : "date", - "Args" : [], - "Config" : { - "Hostname" : "8f177a186b97", - "Domainname" : "", - "User" : "", - "AttachStdin" : false, - "AttachStdout" : false, - "AttachStderr" : false, - "ExposedPorts" : null, - "Tty" : false, - "OpenStdin" : false, - "StdinOnce" : false, - "Env" : [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], - "Cmd" : [ - "date" - ], - "Image" : "ubuntu", - "Volumes" : null, - "WorkingDir" : "", - "Entrypoint" : null, - "NetworkDisabled" : false, - "MacAddress" : "", - "OnBuild" : null, - "SecurityOpt" : null - }, - "Image" : "5506de2b643be1e6febbf3b8a240760c6843244c41e12aa2f60ccbb7153d17f5", - "NetworkSettings" : { - "IPAddress" : "172.17.0.2", - "IPPrefixLen" : 16, - "MacAddress" : "02:42:ac:11:00:02", - "Gateway" : "172.17.42.1", - "Bridge" : "docker0", - "PortMapping" : null, - "Ports" : {} - }, - "ResolvConfPath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/resolv.conf", - "HostnamePath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/hostname", - "HostsPath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Name" : "/test", - "Driver" : "aufs", - "ExecDriver" : "native-0.2", - "MountLabel" : "", - "ProcessLabel" : "", - "AppArmorProfile" : "", - "RestartCount" : 0, - "Mounts" : [] - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **500** - server error - -## 3. Going further - -### 3.1 Inside `docker run` - -As an example, the `docker run` command line makes the following API calls: - -- Create the container - -- If the status code is 404, it means the image doesn't exist: - - Try to pull it. - - Then, retry to create the container. - -- Start the container. - -- If you are not in detached mode: -- Attach to the container, using `logs=1` (to have `stdout` and - `stderr` from the container's start) and `stream=1` - -- If in detached mode or only `stdin` is attached, display the container's id. - -### 3.2 Hijacking - -In this version of the API, `/attach`, uses hijacking to transport `stdin`, -`stdout`, and `stderr` on the same socket. - -To hint potential proxies about connection hijacking, Docker client sends -connection upgrade headers similarly to websocket. - - Upgrade: tcp - Connection: Upgrade - -When Docker daemon detects the `Upgrade` header, it switches its status code -from **200 OK** to **101 UPGRADED** and resends the same headers. - - -### 3.3 CORS Requests - -To set cross origin requests to the Engine API please give values to -`--api-cors-header` when running Docker in daemon mode. Set * (asterisk) allows all, -default or blank means CORS disabled - - $ dockerd -H="192.168.1.9:2375" --api-cors-header="http://foo.bar" diff --git a/vendor/github.com/docker/docker/docs/api/v1.21.md b/vendor/github.com/docker/docker/docs/api/v1.21.md deleted file mode 100644 index b4f54b7c4..000000000 --- a/vendor/github.com/docker/docker/docs/api/v1.21.md +++ /dev/null @@ -1,2969 +0,0 @@ ---- -title: "Engine API v1.21" -description: "API Documentation for Docker" -keywords: "API, Docker, rcli, REST, documentation" -redirect_from: -- /engine/reference/api/docker_remote_api_v1.21/ -- /reference/api/docker_remote_api_v1.21/ ---- - - - -## 1. Brief introduction - - - The daemon listens on `unix:///var/run/docker.sock` but you can - [Bind Docker to another host/port or a Unix socket](../reference/commandline/dockerd.md#bind-docker-to-another-host-port-or-a-unix-socket). - - The API tends to be REST. However, for some complex commands, like `attach` - or `pull`, the HTTP connection is hijacked to transport `stdout`, - `stdin` and `stderr`. - - When the client API version is newer than the daemon's, these calls return an HTTP - `400 Bad Request` error message. - -## 2. Endpoints - -### 2.1 Containers - -#### List containers - -`GET /containers/json` - -List containers - -**Example request**: - - GET /v1.21/containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "8dfafdbc3a40", - "Names":["/boring_feynman"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 1", - "Created": 1367854155, - "Status": "Exit 0", - "Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}], - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "SizeRw": 12288, - "SizeRootFs": 0 - }, - { - "Id": "9cd87474be90", - "Names":["/coolName"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 222222", - "Created": 1367854155, - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0 - }, - { - "Id": "3176a2479c92", - "Names":["/sleepy_dog"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 3333333333333333", - "Created": 1367854154, - "Status": "Exit 0", - "Ports":[], - "Labels": {}, - "SizeRw":12288, - "SizeRootFs":0 - }, - { - "Id": "4cb07b47f9fb", - "Names":["/running_cat"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 444444444444444444444444444444444", - "Created": 1367854152, - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0 - } - ] - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, Show all containers. - Only running containers are shown by default (i.e., this defaults to false) -- **limit** – Show `limit` last created - containers, include non-running ones. -- **since** – Show only containers created since Id, include - non-running ones. -- **before** – Show only containers created before Id, include - non-running ones. -- **size** – 1/True/true or 0/False/false, Show the containers - sizes -- **filters** - a JSON encoded value of the filters (a `map[string][]string`) to process on the containers list. Available filters: - - `exited=`; -- containers with exit code of `` ; - - `status=`(`created`|`restarting`|`running`|`paused`|`exited`) - - `label=key` or `label="key=value"` of a container label - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **500** – server error - -#### Create a container - -`POST /containers/create` - -Create a container - -**Example request**: - - POST /v1.21/containers/create HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "FOO=bar", - "BAZ=quux" - ], - "Cmd": [ - "date" - ], - "Entrypoint": null, - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "StopSignal": "SIGTERM", - "HostConfig": { - "Binds": ["/tmp:/tmp"], - "Links": ["redis3:redis"], - "LxcConf": {"lxc.utsname":"docker"}, - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0,1", - "BlkioWeight": 300, - "MemorySwappiness": 60, - "OomKillDisable": false, - "PidMode": "", - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsOptions": [""], - "DnsSearch": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "GroupAdd": ["newgroup"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "NetworkMode": "bridge", - "Devices": [], - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [], - "CgroupParent": "", - "VolumeDriver": "" - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id":"e90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **Hostname** - A string value containing the hostname to use for the - container. -- **Domainname** - A string value containing the domain name to use - for the container. -- **User** - A string value specifying the user inside the container. -- **AttachStdin** - Boolean value, attaches to `stdin`. -- **AttachStdout** - Boolean value, attaches to `stdout`. -- **AttachStderr** - Boolean value, attaches to `stderr`. -- **Tty** - Boolean value, Attach standard streams to a `tty`, including `stdin` if it is not closed. -- **OpenStdin** - Boolean value, opens `stdin`, -- **StdinOnce** - Boolean value, close `stdin` after the 1 attached client disconnects. -- **Env** - A list of environment variables in the form of `["VAR=value", ...]` -- **Labels** - Adds a map of labels to a container. To specify a map: `{"key":"value", ... }` -- **Cmd** - Command to run specified as a string or an array of strings. -- **Entrypoint** - Set the entry point for the container as a string or an array - of strings. -- **Image** - A string specifying the image name to use for the container. -- **Volumes** - An object mapping mount point paths (strings) inside the - container to empty objects. -- **WorkingDir** - A string specifying the working directory for commands to - run in. -- **NetworkDisabled** - Boolean value, when true disables networking for the - container -- **ExposedPorts** - An object mapping ports to an empty object in the form of: - `"ExposedPorts": { "/: {}" }` -- **StopSignal** - Signal to stop a container as a string or unsigned integer. `SIGTERM` by default. -- **HostConfig** - - **Binds** – A list of volume bindings for this container. Each volume binding is a string in one of these forms: - + `host-src:container-dest` to bind-mount a host path into the - container. Both `host-src`, and `container-dest` must be an - _absolute_ path. - + `host-src:container-dest:ro` to make the bind-mount read-only - inside the container. Both `host-src`, and `container-dest` must be - an _absolute_ path. - + `volume-name:container-dest` to bind-mount a volume managed by a - volume driver into the container. `container-dest` must be an - _absolute_ path. - + `volume-name:container-dest:ro` to mount the volume read-only - inside the container. `container-dest` must be an _absolute_ path. - - **Links** - A list of links for the container. Each link entry should be - in the form of `container_name:alias`. - - **LxcConf** - LXC specific configurations. These configurations only - work when using the `lxc` execution driver. - - **Memory** - Memory limit in bytes. - - **MemorySwap** - Total memory limit (memory + swap); set `-1` to enable unlimited swap. - You must use this with `memory` and make the swap value larger than `memory`. - - **MemoryReservation** - Memory soft limit in bytes. - - **KernelMemory** - Kernel memory limit in bytes. - - **CpuShares** - An integer value containing the container's CPU Shares - (ie. the relative weight vs other containers). - - **CpuPeriod** - The length of a CPU period in microseconds. - - **CpuQuota** - Microseconds of CPU time that the container can get in a CPU period. - - **CpusetCpus** - String value containing the `cgroups CpusetCpus` to use. - - **CpusetMems** - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - - **BlkioWeight** - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - - **MemorySwappiness** - Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100. - - **OomKillDisable** - Boolean value, whether to disable OOM Killer for the container or not. - - **PidMode** - Set the PID (Process) Namespace mode for the container; - `"container:"`: joins another container's PID namespace - `"host"`: use the host's PID namespace inside the container - - **PortBindings** - A map of exposed container ports and the host port they - should map to. A JSON object in the form - `{ /: [{ "HostPort": "" }] }` - Take note that `port` is specified as a string and not an integer value. - - **PublishAllPorts** - Allocates a random host port for all of a container's - exposed ports. Specified as a boolean value. - - **Privileged** - Gives the container full access to the host. Specified as - a boolean value. - - **ReadonlyRootfs** - Mount the container's root filesystem as read only. - Specified as a boolean value. - - **Dns** - A list of DNS servers for the container to use. - - **DnsOptions** - A list of DNS options - - **DnsSearch** - A list of DNS search domains - - **ExtraHosts** - A list of hostnames/IP mappings to add to the - container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`. - - **VolumesFrom** - A list of volumes to inherit from another container. - Specified in the form `[:]` - - **CapAdd** - A list of kernel capabilities to add to the container. - - **Capdrop** - A list of kernel capabilities to drop from the container. - - **GroupAdd** - A list of additional groups that the container process will run as - - **RestartPolicy** – The behavior to apply when the container exits. The - value is an object with a `Name` property of either `"always"` to - always restart, `"unless-stopped"` to restart always except when - user has manually stopped the container or `"on-failure"` to restart only when the container - exit code is non-zero. If `on-failure` is used, `MaximumRetryCount` - controls the number of times to retry before giving up. - The default is not to restart. (optional) - An ever increasing delay (double the previous delay, starting at 100mS) - is added before each restart to prevent flooding the server. - - **NetworkMode** - Sets the networking mode for the container. Supported - standard values are: `bridge`, `host`, `none`, and `container:`. Any other value is taken - as a custom network's name to which this container should connect to. - - **Devices** - A list of devices to add to the container specified as a JSON object in the - form - `{ "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}` - - **Ulimits** - A list of ulimits to set in the container, specified as - `{ "Name": , "Soft": , "Hard": }`, for example: - `Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }` - - **SecurityOpt**: A list of string values to customize labels for MLS - systems, such as SELinux. - - **LogConfig** - Log configuration for the container, specified as a JSON object in the form - `{ "Type": "", "Config": {"key1": "val1"}}`. - Available types: `json-file`, `syslog`, `journald`, `gelf`, `awslogs`, `none`. - `json-file` logging driver. - - **CgroupParent** - Path to `cgroups` under which the container's `cgroup` is created. If the path is not absolute, the path is considered to be relative to the `cgroups` path of the init process. Cgroups are created if they do not already exist. - - **VolumeDriver** - Driver that this container users to mount volumes. - -**Query parameters**: - -- **name** – Assign the specified name to the container. Must - match `/?[a-zA-Z0-9_-]+`. - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such container -- **406** – impossible to attach (container not running) -- **409** – conflict -- **500** – server error - -#### Inspect a container - -`GET /containers/(id or name)/json` - -Return low-level information on the container `id` - -**Example request**: - - GET /v1.21/containers/4fa6e0f0c678/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "AppArmorProfile": "", - "Args": [ - "-c", - "exit 9" - ], - "Config": { - "AttachStderr": true, - "AttachStdin": false, - "AttachStdout": true, - "Cmd": [ - "/bin/sh", - "-c", - "exit 9" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts": null, - "Hostname": "ba033ac44011", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "MacAddress": "", - "NetworkDisabled": false, - "OnBuild": null, - "OpenStdin": false, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": null, - "WorkingDir": "", - "StopSignal": "SIGTERM" - }, - "Created": "2015-01-06T15:47:31.485331387Z", - "Driver": "devicemapper", - "ExecDriver": "native-0.2", - "ExecIDs": null, - "HostConfig": { - "Binds": null, - "BlkioWeight": 0, - "CapAdd": null, - "CapDrop": null, - "ContainerIDFile": "", - "CpusetCpus": "", - "CpusetMems": "", - "CpuShares": 0, - "CpuPeriod": 100000, - "Devices": [], - "Dns": null, - "DnsOptions": null, - "DnsSearch": null, - "ExtraHosts": null, - "IpcMode": "", - "Links": null, - "LxcConf": [], - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "OomKillDisable": false, - "NetworkMode": "bridge", - "PidMode": "", - "PortBindings": {}, - "Privileged": false, - "ReadonlyRootfs": false, - "PublishAllPorts": false, - "RestartPolicy": { - "MaximumRetryCount": 2, - "Name": "on-failure" - }, - "LogConfig": { - "Config": null, - "Type": "json-file" - }, - "SecurityOpt": null, - "VolumesFrom": null, - "Ulimits": [{}], - "VolumeDriver": "" - }, - "HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname", - "HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39", - "Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2", - "MountLabel": "", - "Name": "/boring_euclid", - "NetworkSettings": { - "Bridge": "", - "SandboxID": "", - "HairpinMode": false, - "LinkLocalIPv6Address": "", - "LinkLocalIPv6PrefixLen": 0, - "Ports": null, - "SandboxKey": "", - "SecondaryIPAddresses": null, - "SecondaryIPv6Addresses": null, - "EndpointID": "", - "Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "IPAddress": "", - "IPPrefixLen": 0, - "IPv6Gateway": "", - "MacAddress": "", - "Networks": { - "bridge": { - "EndpointID": "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:12:00:02" - } - } - }, - "Path": "/bin/sh", - "ProcessLabel": "", - "ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf", - "RestartCount": 1, - "State": { - "Error": "", - "ExitCode": 9, - "FinishedAt": "2015-01-06T15:47:32.080254511Z", - "OOMKilled": false, - "Paused": false, - "Pid": 0, - "Restarting": false, - "Running": true, - "StartedAt": "2015-01-06T15:47:32.072697474Z", - "Status": "running" - }, - "Mounts": [ - { - "Source": "/data", - "Destination": "/data", - "Mode": "ro,Z", - "RW": false - } - ] - } - -**Example request, with size information**: - - GET /v1.21/containers/4fa6e0f0c678/json?size=1 HTTP/1.1 - -**Example response, with size information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - .... - "SizeRw": 0, - "SizeRootFs": 972, - .... - } - -**Query parameters**: - -- **size** – 1/True/true or 0/False/false, return container size information. Default is `false`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### List processes running inside a container - -`GET /containers/(id or name)/top` - -List processes running inside the container `id`. On Unix systems this -is done by running the `ps` command. This endpoint is not -supported on Windows. - -**Example request**: - - GET /v1.21/containers/4fa6e0f0c678/top HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "UID", "PID", "PPID", "C", "STIME", "TTY", "TIME", "CMD" - ], - "Processes" : [ - [ - "root", "13642", "882", "0", "17:03", "pts/0", "00:00:00", "/bin/bash" - ], - [ - "root", "13735", "13642", "0", "17:06", "pts/0", "00:00:00", "sleep 10" - ] - ] - } - -**Example request**: - - GET /v1.21/containers/4fa6e0f0c678/top?ps_args=aux HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "USER","PID","%CPU","%MEM","VSZ","RSS","TTY","STAT","START","TIME","COMMAND" - ] - "Processes" : [ - [ - "root","13642","0.0","0.1","18172","3184","pts/0","Ss","17:03","0:00","/bin/bash" - ], - [ - "root","13895","0.0","0.0","4348","692","pts/0","S+","17:15","0:00","sleep 10" - ] - ], - } - -**Query parameters**: - -- **ps_args** – `ps` arguments to use (e.g., `aux`), defaults to `-ef` - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container logs - -`GET /containers/(id or name)/logs` - -Get `stdout` and `stderr` logs from the container ``id`` - -> **Note**: -> This endpoint works only for containers with the `json-file` or `journald` logging drivers. - -**Example request**: - - GET /v1.21/containers/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **follow** – 1/True/true or 0/False/false, return stream. Default `false`. -- **stdout** – 1/True/true or 0/False/false, show `stdout` log. Default `false`. -- **stderr** – 1/True/true or 0/False/false, show `stderr` log. Default `false`. -- **since** – UNIX timestamp (integer) to filter logs. Specifying a timestamp - will only output log-entries since that timestamp. Default: 0 (unfiltered) -- **timestamps** – 1/True/true or 0/False/false, print timestamps for - every log line. Default `false`. -- **tail** – Output specified number of lines at the end of logs: `all` or ``. Default all. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **404** – no such container -- **500** – server error - -#### Inspect changes on a container's filesystem - -`GET /containers/(id or name)/changes` - -Inspect changes on container `id`'s filesystem - -**Example request**: - - GET /v1.21/containers/4fa6e0f0c678/changes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Path": "/dev", - "Kind": 0 - }, - { - "Path": "/dev/kmsg", - "Kind": 1 - }, - { - "Path": "/test", - "Kind": 1 - } - ] - -Values for `Kind`: - -- `0`: Modify -- `1`: Add -- `2`: Delete - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Export a container - -`GET /containers/(id or name)/export` - -Export the contents of container `id` - -**Example request**: - - GET /v1.21/containers/4fa6e0f0c678/export HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/octet-stream - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container stats based on resource usage - -`GET /containers/(id or name)/stats` - -This endpoint returns a live stream of a container's resource usage statistics. - -**Example request**: - - GET /v1.21/containers/redis1/stats HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "read" : "2015-01-08T22:57:31.547920715Z", - "networks": { - "eth0": { - "rx_bytes": 5338, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 36, - "tx_bytes": 648, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 8 - }, - "eth5": { - "rx_bytes": 4641, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 26, - "tx_bytes": 690, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 9 - } - }, - "memory_stats" : { - "stats" : { - "total_pgmajfault" : 0, - "cache" : 0, - "mapped_file" : 0, - "total_inactive_file" : 0, - "pgpgout" : 414, - "rss" : 6537216, - "total_mapped_file" : 0, - "writeback" : 0, - "unevictable" : 0, - "pgpgin" : 477, - "total_unevictable" : 0, - "pgmajfault" : 0, - "total_rss" : 6537216, - "total_rss_huge" : 6291456, - "total_writeback" : 0, - "total_inactive_anon" : 0, - "rss_huge" : 6291456, - "hierarchical_memory_limit" : 67108864, - "total_pgfault" : 964, - "total_active_file" : 0, - "active_anon" : 6537216, - "total_active_anon" : 6537216, - "total_pgpgout" : 414, - "total_cache" : 0, - "inactive_anon" : 0, - "active_file" : 0, - "pgfault" : 964, - "inactive_file" : 0, - "total_pgpgin" : 477 - }, - "max_usage" : 6651904, - "usage" : 6537216, - "failcnt" : 0, - "limit" : 67108864 - }, - "blkio_stats" : {}, - "cpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24472255, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100215355, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 739306590000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - }, - "precpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24350896, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100093996, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 9492140000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - } - } - -The precpu_stats is the cpu statistic of last read, which is used for calculating the cpu usage percent. It is not the exact copy of the “cpu_stats” field. - -**Query parameters**: - -- **stream** – 1/True/true or 0/False/false, pull stats once then disconnect. Default `true`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Resize a container TTY - -`POST /containers/(id or name)/resize` - -Resize the TTY for container with `id`. The unit is number of characters. You must restart the container for the resize to take effect. - -**Example request**: - - POST /v1.21/containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **200** – no error -- **404** – No such container -- **500** – Cannot resize container - -#### Start a container - -`POST /containers/(id or name)/start` - -Start the container `id` - -> **Note**: -> For backwards compatibility, this endpoint accepts a `HostConfig` as JSON-encoded request body. -> See [create a container](#create-a-container) for details. - -**Example request**: - - POST /v1.21/containers/e90e34656806/start HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **304** – container already started -- **404** – no such container -- **500** – server error - -#### Stop a container - -`POST /containers/(id or name)/stop` - -Stop the container `id` - -**Example request**: - - POST /v1.21/containers/e90e34656806/stop?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **304** – container already stopped -- **404** – no such container -- **500** – server error - -#### Restart a container - -`POST /containers/(id or name)/restart` - -Restart the container `id` - -**Example request**: - - POST /v1.21/containers/e90e34656806/restart?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Kill a container - -`POST /containers/(id or name)/kill` - -Kill the container `id` - -**Example request**: - - POST /v1.21/containers/e90e34656806/kill HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **signal** - Signal to send to the container: integer or string like `SIGINT`. - When not set, `SIGKILL` is assumed and the call waits for the container to exit. - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Rename a container - -`POST /containers/(id or name)/rename` - -Rename the container `id` to a `new_name` - -**Example request**: - - POST /v1.21/containers/e90e34656806/rename?name=new_name HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **name** – new name for the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **409** - conflict name already assigned -- **500** – server error - -#### Pause a container - -`POST /containers/(id or name)/pause` - -Pause the container `id` - -**Example request**: - - POST /v1.21/containers/e90e34656806/pause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Unpause a container - -`POST /containers/(id or name)/unpause` - -Unpause the container `id` - -**Example request**: - - POST /v1.21/containers/e90e34656806/unpause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Attach to a container - -`POST /containers/(id or name)/attach` - -Attach to the container `id` - -**Example request**: - - POST /v1.21/containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -**Stream details**: - -When using the TTY setting is enabled in -[`POST /containers/create` -](#create-a-container), -the stream is the raw data from the process PTY and client's `stdin`. -When the TTY is disabled, then the stream is multiplexed to separate -`stdout` and `stderr`. - -The format is a **Header** and a **Payload** (frame). - -**HEADER** - -The header contains the information which the stream writes (`stdout` or -`stderr`). It also contains the size of the associated frame encoded in the -last four bytes (`uint32`). - -It is encoded on the first eight bytes like this: - - header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4} - -`STREAM_TYPE` can be: - -- 0: `stdin` (is written on `stdout`) -- 1: `stdout` -- 2: `stderr` - -`SIZE1, SIZE2, SIZE3, SIZE4` are the four bytes of -the `uint32` size encoded as big endian. - -**PAYLOAD** - -The payload is the raw stream. - -**IMPLEMENTATION** - -The simplest way to implement the Attach protocol is the following: - - 1. Read eight bytes. - 2. Choose `stdout` or `stderr` depending on the first byte. - 3. Extract the frame size from the last four bytes. - 4. Read the extracted size and output it on the correct output. - 5. Goto 1. - -#### Attach to a container (websocket) - -`GET /containers/(id or name)/attach/ws` - -Attach to the container `id` via websocket - -Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455) - -**Example request** - - GET /v1.21/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1 - -**Example response** - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -#### Wait a container - -`POST /containers/(id or name)/wait` - -Block until container `id` stops, then returns the exit code - -**Example request**: - - POST /v1.21/containers/16253994b7c4/wait HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"StatusCode": 0} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Remove a container - -`DELETE /containers/(id or name)` - -Remove the container `id` from the filesystem - -**Example request**: - - DELETE /v1.21/containers/16253994b7c4?v=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **v** – 1/True/true or 0/False/false, Remove the volumes - associated to the container. Default `false`. -- **force** - 1/True/true or 0/False/false, Kill then remove the container. - Default `false`. - -**Status codes**: - -- **204** – no error -- **400** – bad parameter -- **404** – no such container -- **409** – conflict -- **500** – server error - -#### Copy files or folders from a container - -`POST /containers/(id or name)/copy` - -Copy files or folders of container `id` - -**Deprecated** in favor of the `archive` endpoint below. - -**Example request**: - - POST /v1.21/containers/4fa6e0f0c678/copy HTTP/1.1 - Content-Type: application/json - - { - "Resource": "test.txt" - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Retrieving information about files and folders in a container - -`HEAD /containers/(id or name)/archive` - -See the description of the `X-Docker-Container-Path-Stat` header in the -following section. - -#### Get an archive of a filesystem resource in a container - -`GET /containers/(id or name)/archive` - -Get a tar archive of a resource in the filesystem of container `id`. - -**Query parameters**: - -- **path** - resource in the container's filesystem to archive. Required. - - If not an absolute path, it is relative to the container's root directory. - The resource specified by **path** must exist. To assert that the resource - is expected to be a directory, **path** should end in `/` or `/.` - (assuming a path separator of `/`). If **path** ends in `/.` then this - indicates that only the contents of the **path** directory should be - copied. A symlink is always resolved to its target. - - > **Note**: It is not possible to copy certain system files such as resources - > under `/proc`, `/sys`, `/dev`, and mounts created by the user in the - > container. - -**Example request**: - - GET /v1.21/containers/8cce319429b2/archive?path=/root HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - X-Docker-Container-Path-Stat: eyJuYW1lIjoicm9vdCIsInNpemUiOjQwOTYsIm1vZGUiOjIxNDc0ODQwOTYsIm10aW1lIjoiMjAxNC0wMi0yN1QyMDo1MToyM1oiLCJsaW5rVGFyZ2V0IjoiIn0= - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -On success, a response header `X-Docker-Container-Path-Stat` will be set to a -base64-encoded JSON object containing some filesystem header information about -the archived resource. The above example value would decode to the following -JSON object (whitespace added for readability): - -```json -{ - "name": "root", - "size": 4096, - "mode": 2147484096, - "mtime": "2014-02-27T20:51:23Z", - "linkTarget": "" -} -``` - -A `HEAD` request can also be made to this endpoint if only this information is -desired. - -**Status codes**: - -- **200** - success, returns archive of copied resource -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** was asserted to be a directory but exists as a - file) -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** does not exist) -- **500** - server error - -#### Extract an archive of files or folders to a directory in a container - -`PUT /containers/(id or name)/archive` - -Upload a tar archive to be extracted to a path in the filesystem of container -`id`. - -**Query parameters**: - -- **path** - path to a directory in the container - to extract the archive's contents into. Required. - - If not an absolute path, it is relative to the container's root directory. - The **path** resource must exist. -- **noOverwriteDirNonDir** - If "1", "true", or "True" then it will be an error - if unpacking the given content would cause an existing directory to be - replaced with a non-directory and vice versa. - -**Example request**: - - PUT /v1.21/containers/8cce319429b2/archive?path=/vol1 HTTP/1.1 - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – the content was extracted successfully -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** should be a directory but exists as a file) - - unable to overwrite existing directory with non-directory - (if **noOverwriteDirNonDir**) - - unable to overwrite existing non-directory with directory - (if **noOverwriteDirNonDir**) -- **403** - client error, permission denied, the volume - or container rootfs is marked as read-only. -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** resource does not exist) -- **500** – server error - -### 2.2 Images - -#### List Images - -`GET /images/json` - -**Example request**: - - GET /v1.21/images/json?all=0 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "RepoTags": [ - "ubuntu:12.04", - "ubuntu:precise", - "ubuntu:latest" - ], - "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c", - "Created": 1365714795, - "Size": 131506275, - "VirtualSize": 131506275, - "Labels": {} - }, - { - "RepoTags": [ - "ubuntu:12.10", - "ubuntu:quantal" - ], - "ParentId": "27cf784147099545", - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Created": 1364102658, - "Size": 24653, - "VirtualSize": 180116135, - "Labels": { - "com.example.version": "v1" - } - } - ] - -**Example request, with digest information**: - - GET /v1.21/images/json?digests=1 HTTP/1.1 - -**Example response, with digest information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Created": 1420064636, - "Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125", - "ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2", - "RepoDigests": [ - "localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags": [ - "localhost:5000/test/busybox:latest", - "playdate:latest" - ], - "Size": 0, - "VirtualSize": 2429728, - "Labels": {} - } - ] - -The response shows a single image `Id` associated with two repositories -(`RepoTags`): `localhost:5000/test/busybox`: and `playdate`. A caller can use -either of the `RepoTags` values `localhost:5000/test/busybox:latest` or -`playdate:latest` to reference the image. - -You can also use `RepoDigests` values to reference an image. In this response, -the array has only one reference and that is to the -`localhost:5000/test/busybox` repository; the `playdate` repository has no -digest. You can reference this digest using the value: -`localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...` - -See the `docker run` and `docker build` commands for examples of digest and tag -references on the command line. - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, default false -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `dangling=true` - - `label=key` or `label="key=value"` of an image label -- **filter** - only return images with the specified name - -#### Build image from a Dockerfile - -`POST /build` - -Build an image from a Dockerfile - -**Example request**: - - POST /v1.21/build HTTP/1.1 - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"stream": "Step 1/5..."} - {"stream": "..."} - {"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}} - -The input stream must be a `tar` archive compressed with one of the -following algorithms: `identity` (no compression), `gzip`, `bzip2`, `xz`. - -The archive must include a build instructions file, typically called -`Dockerfile` at the archive's root. The `dockerfile` parameter may be -used to specify a different build instructions file. To do this, its value must be -the path to the alternate build instructions file to use. - -The archive may include any number of other files, -which are accessible in the build context (See the [*ADD build -command*](../reference/builder.md#add)). - -The Docker daemon performs a preliminary validation of the `Dockerfile` before -starting the build, and returns an error if the syntax is incorrect. After that, -each instruction is run one-by-one until the ID of the new image is output. - -The build is canceled if the client drops the connection by quitting -or being killed. - -**Query parameters**: - -- **dockerfile** - Path within the build context to the `Dockerfile`. This is - ignored if `remote` is specified and points to an external `Dockerfile`. -- **t** – A name and optional tag to apply to the image in the `name:tag` format. - If you omit the `tag` the default `latest` value is assumed. - You can provide one or more `t` parameters. -- **remote** – A Git repository URI or HTTP/HTTPS context URI. If the - URI points to a single text file, the file's contents are placed into - a file called `Dockerfile` and the image is built from that file. If - the URI points to a tarball, the file is downloaded by the daemon and - the contents therein used as the context for the build. If the URI - points to a tarball and the `dockerfile` parameter is also specified, - there must be a file with the corresponding path inside the tarball. -- **q** – Suppress verbose build output. -- **nocache** – Do not use the cache when building the image. -- **pull** - Attempt to pull the image even if an older image exists locally. -- **rm** - Remove intermediate containers after a successful build (default behavior). -- **forcerm** - Always remove intermediate containers (includes `rm`). -- **memory** - Set memory limit for build. -- **memswap** - Total memory (memory + swap), `-1` to enable unlimited swap. -- **cpushares** - CPU shares (relative weight). -- **cpusetcpus** - CPUs in which to allow execution (e.g., `0-3`, `0,1`). -- **cpuperiod** - The length of a CPU period in microseconds. -- **cpuquota** - Microseconds of CPU time that the container can get in a CPU period. -- **buildargs** – JSON map of string pairs for build-time variables. Users pass - these values at build-time. Docker uses the `buildargs` as the environment - context for command(s) run via the Dockerfile's `RUN` instruction or for - variable expansion in other Dockerfile instructions. This is not meant for - passing secret values. [Read more about the buildargs instruction](../reference/builder.md#arg) - -**Request Headers**: - -- **Content-type** – Set to `"application/tar"`. -- **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON - object with the following structure: - - { - "docker.example.com": { - "username": "janedoe", - "password": "hunter2" - }, - "https://index.docker.io/v1/": { - "username": "mobydock", - "password": "conta1n3rize14" - } - } - - This object maps the hostname of a registry to an object containing the - "username" and "password" for that registry. Multiple registries may - be specified as the build may be based on an image requiring - authentication to pull from any arbitrary registry. Only the registry - domain name (and port if not the default "443") are required. However - (for legacy reasons) the "official" Docker, Inc. hosted registry must - be specified with both a "https://" prefix and a "/v1/" suffix even - though Docker will prefer to use the v2 registry API. - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Create an image - -`POST /images/create` - -Create an image either by pulling it from the registry or by importing it - -**Example request**: - - POST /v1.21/images/create?fromImage=busybox&tag=latest HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pulling..."} - {"status": "Pulling", "progress": "1 B/ 100 B", "progressDetail": {"current": 1, "total": 100}} - {"error": "Invalid..."} - ... - -When using this endpoint to pull an image from the registry, the -`X-Registry-Auth` header can be used to include -a base64-encoded AuthConfig object. - -**Query parameters**: - -- **fromImage** – Name of the image to pull. The name may include a tag or - digest. This parameter may only be used when pulling an image. -- **fromSrc** – Source to import. The value may be a URL from which the image - can be retrieved or `-` to read the image from the request body. - This parameter may only be used when importing an image. -- **repo** – Repository name given to an image when it is imported. - The repo may include a tag. This parameter may only be used when importing - an image. -- **tag** – Tag or digest. If empty when pulling an image, this causes all tags - for the given image to be pulled. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object - -**Status codes**: - -- **200** – no error -- **404** - repository does not exist or no read access -- **500** – server error - - - -#### Inspect an image - -`GET /images/(name)/json` - -Return low-level information on the image `name` - -**Example request**: - - GET /v1.21/images/example/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Id" : "85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c", - "Container" : "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a", - "Comment" : "", - "Os" : "linux", - "Architecture" : "amd64", - "Parent" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "ContainerConfig" : { - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Domainname" : "", - "AttachStdout" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "StdinOnce" : false, - "NetworkDisabled" : false, - "OnBuild" : [], - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "User" : "", - "WorkingDir" : "", - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "Labels" : { - "com.example.license" : "GPL", - "com.example.version" : "1.0", - "com.example.vendor" : "Acme" - }, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts" : null, - "Cmd" : [ - "/bin/sh", - "-c", - "#(nop) LABEL com.example.vendor=Acme com.example.license=GPL com.example.version=1.0" - ] - }, - "DockerVersion" : "1.9.0-dev", - "VirtualSize" : 188359297, - "Size" : 0, - "Author" : "", - "Created" : "2015-09-10T08:30:53.26995814Z", - "GraphDriver" : { - "Name" : "aufs", - "Data" : null - }, - "RepoDigests" : [ - "localhost:5000/test/busybox/example@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags" : [ - "example:1.0", - "example:latest", - "example:stable" - ], - "Config" : { - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "NetworkDisabled" : false, - "OnBuild" : [], - "StdinOnce" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "Domainname" : "", - "AttachStdout" : false, - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Cmd" : [ - "/bin/bash" - ], - "ExposedPorts" : null, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "Labels" : { - "com.example.vendor" : "Acme", - "com.example.version" : "1.0", - "com.example.license" : "GPL" - }, - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "WorkingDir" : "", - "User" : "" - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Get the history of an image - -`GET /images/(name)/history` - -Return the history of the image `name` - -**Example request**: - - GET /v1.21/images/ubuntu/history HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710", - "Created": 1398108230, - "CreatedBy": "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /", - "Tags": [ - "ubuntu:lucid", - "ubuntu:10.04" - ], - "Size": 182964289, - "Comment": "" - }, - { - "Id": "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8", - "Created": 1398108222, - "CreatedBy": "/bin/sh -c #(nop) MAINTAINER Tianon Gravi - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/", - "Tags": null, - "Size": 0, - "Comment": "" - }, - { - "Id": "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158", - "Created": 1371157430, - "CreatedBy": "", - "Tags": [ - "scratch12:latest", - "scratch:latest" - ], - "Size": 0, - "Comment": "Imported from -" - } - ] - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Push an image on the registry - -`POST /images/(name)/push` - -Push the image `name` on the registry - -**Example request**: - - POST /v1.21/images/test/push HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pushing..."} - {"status": "Pushing", "progress": "1/? (n/a)", "progressDetail": {"current": 1}}} - {"error": "Invalid..."} - ... - -If you wish to push an image on to a private registry, that image must already have a tag -into a repository which references that registry `hostname` and `port`. This repository name should -then be used in the URL. This duplicates the command line's flow. - -**Example request**: - - POST /v1.21/images/registry.acme.com:5000/test/push HTTP/1.1 - - -**Query parameters**: - -- **tag** – The tag to associate with the image on the registry. This is optional. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object. - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Tag an image into a repository - -`POST /images/(name)/tag` - -Tag the image `name` into a repository - -**Example request**: - - POST /v1.21/images/test/tag?repo=myrepo&force=0&tag=v42 HTTP/1.1 - -**Example response**: - - HTTP/1.1 201 Created - -**Query parameters**: - -- **repo** – The repository to tag in -- **force** – 1/True/true or 0/False/false, default false -- **tag** - The new tag name - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Remove an image - -`DELETE /images/(name)` - -Remove the image `name` from the filesystem - -**Example request**: - - DELETE /v1.21/images/test HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-type: application/json - - [ - {"Untagged": "3e2f21a89f"}, - {"Deleted": "3e2f21a89f"}, - {"Deleted": "53b4f83ac9"} - ] - -**Query parameters**: - -- **force** – 1/True/true or 0/False/false, default false -- **noprune** – 1/True/true or 0/False/false, default false - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Search images - -`GET /images/search` - -Search for an image on [Docker Hub](https://hub.docker.com). - -> **Note**: -> The response keys have changed from API v1.6 to reflect the JSON -> sent by the registry server to the docker daemon's request. - -**Example request**: - - GET /v1.21/images/search?term=sshd HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "wma55/u1210sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "jdswinbank/sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "vgauthier/sshd", - "star_count": 0 - } - ... - ] - -**Query parameters**: - -- **term** – term to search - -**Status codes**: - -- **200** – no error -- **500** – server error - -### 2.3 Misc - -#### Check auth configuration - -`POST /auth` - -Get the default username and email - -**Example request**: - - POST /v1.21/auth HTTP/1.1 - Content-Type: application/json - - { - "username": "hannibal", - "password": "xxxx", - "email": "hannibal@a-team.com", - "serveraddress": "https://index.docker.io/v1/" - } - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – no error -- **204** – no error -- **500** – server error - -#### Display system-wide information - -`GET /info` - -Display system-wide information - -**Example request**: - - GET /v1.21/info HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "ClusterStore": "etcd://localhost:2379", - "Containers": 11, - "CpuCfsPeriod": true, - "CpuCfsQuota": true, - "Debug": false, - "DockerRootDir": "/var/lib/docker", - "Driver": "btrfs", - "DriverStatus": [[""]], - "ExecutionDriver": "native-0.1", - "ExperimentalBuild": false, - "HttpProxy": "http://test:test@localhost:8080", - "HttpsProxy": "https://test:test@localhost:8080", - "ID": "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS", - "IPv4Forwarding": true, - "Images": 16, - "IndexServerAddress": "https://index.docker.io/v1/", - "InitPath": "/usr/bin/docker", - "InitSha1": "", - "KernelVersion": "3.12.0-1-amd64", - "Labels": [ - "storage=ssd" - ], - "MemTotal": 2099236864, - "MemoryLimit": true, - "NCPU": 1, - "NEventsListener": 0, - "NFd": 11, - "NGoroutines": 21, - "Name": "prod-server-42", - "NoProxy": "9.81.1.160", - "OomKillDisable": true, - "OperatingSystem": "Boot2Docker", - "RegistryConfig": { - "IndexConfigs": { - "docker.io": { - "Mirrors": null, - "Name": "docker.io", - "Official": true, - "Secure": true - } - }, - "InsecureRegistryCIDRs": [ - "127.0.0.0/8" - ] - }, - "ServerVersion": "1.9.0", - "SwapLimit": false, - "SystemTime": "2015-03-10T11:11:23.730591467-07:00" - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Show the docker version information - -`GET /version` - -Show the docker version information - -**Example request**: - - GET /v1.21/version HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Version": "1.5.0", - "Os": "linux", - "KernelVersion": "3.18.5-tinycore64", - "GoVersion": "go1.4.1", - "GitCommit": "a8a31ef", - "Arch": "amd64", - "ApiVersion": "1.20", - "Experimental": false - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Ping the docker server - -`GET /_ping` - -Ping the docker server - -**Example request**: - - GET /v1.21/_ping HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: text/plain - - OK - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Create a new image from a container's changes - -`POST /commit` - -Create a new image from a container's changes - -**Example request**: - - POST /v1.21/commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Mounts": [ - { - "Source": "/data", - "Destination": "/data", - "Mode": "ro,Z", - "RW": false - } - ], - "Labels": { - "key1": "value1", - "key2": "value2" - }, - "WorkingDir": "", - "NetworkDisabled": false, - "ExposedPorts": { - "22/tcp": {} - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - {"Id": "596069db4bf5"} - -**JSON parameters**: - -- **config** - the container's configuration - -**Query parameters**: - -- **container** – source container -- **repo** – repository -- **tag** – tag -- **comment** – commit message -- **author** – author (e.g., "John Hannibal Smith - <[hannibal@a-team.com](mailto:hannibal%40a-team.com)>") -- **pause** – 1/True/true or 0/False/false, whether to pause the container before committing -- **changes** – Dockerfile instructions to apply while committing - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **500** – server error - -#### Monitor Docker's events - -`GET /events` - -Get container events from docker, in real time via streaming. - -Docker containers report the following events: - - attach, commit, copy, create, destroy, die, exec_create, exec_start, export, kill, oom, pause, rename, resize, restart, start, stop, top, unpause - -Docker images report the following events: - - delete, import, pull, push, tag, untag - -**Example request**: - - GET /v1.21/events?since=1374067924 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status":"pull","id":"busybox:latest","time":1442421700,"timeNano":1442421700598988358} - {"status":"create","id":"5745704abe9caa5","from":"busybox","time":1442421716,"timeNano":1442421716853979870} - {"status":"attach","id":"5745704abe9caa5","from":"busybox","time":1442421716,"timeNano":1442421716894759198} - {"status":"start","id":"5745704abe9caa5","from":"busybox","time":1442421716,"timeNano":1442421716983607193} - -**Query parameters**: - -- **since** – Timestamp. Show all events created since timestamp and then stream -- **until** – Timestamp. Show events created until given timestamp and stop streaming -- **filters** – A json encoded value of the filters (a map[string][]string) to process on the event list. Available filters: - - `container=`; -- container to filter - - `event=`; -- event to filter - - `image=`; -- image to filter - - `label=`; -- image and container label to filter - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images in a repository - -`GET /images/(name)/get` - -Get a tarball containing all images and metadata for the repository specified -by `name`. - -If `name` is a specific name and tag (e.g. ubuntu:latest), then only that image -(and its parents) are returned. If `name` is an image ID, similarly only that -image (and its parents) are returned, but with the exclusion of the -'repositories' file in the tarball, as there were no image names referenced. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.21/images/ubuntu/get - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images - -`GET /images/get` - -Get a tarball containing all images and metadata for one or more repositories. - -For each value of the `names` parameter: if it is a specific name and tag (e.g. -`ubuntu:latest`), then only that image (and its parents) are returned; if it is -an image ID, similarly only that image (and its parents) are returned and there -would be no names referenced in the 'repositories' file for this image ID. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.21/images/get?names=myname%2Fmyapp%3Alatest&names=busybox - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Load a tarball with a set of images and tags into docker - -`POST /images/load` - -Load a set of images and tags into a Docker repository. -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - POST /v1.21/images/load - Content-Type: application/x-tar - - Tarball in body - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Image tarball format - -An image tarball contains one directory per image layer (named using its long ID), -each containing these files: - -- `VERSION`: currently `1.0` - the file format version -- `json`: detailed layer information, similar to `docker inspect layer_id` -- `layer.tar`: A tarfile containing the filesystem changes in this layer - -The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories -for storing attribute changes and deletions. - -If the tarball defines a repository, the tarball should also include a `repositories` file at -the root that contains a list of repository and tag names mapped to layer IDs. - -``` -{"hello-world": - {"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"} -} -``` - -#### Exec Create - -`POST /containers/(id or name)/exec` - -Sets up an exec instance in a running container `id` - -**Example request**: - - POST /v1.21/containers/e90e34656806/exec HTTP/1.1 - Content-Type: application/json - - { - "AttachStdin": true, - "AttachStdout": true, - "AttachStderr": true, - "Cmd": ["sh"], - "Privileged": true, - "Tty": true, - "User": "123:456" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id": "f90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **AttachStdin** - Boolean value, attaches to `stdin` of the `exec` command. -- **AttachStdout** - Boolean value, attaches to `stdout` of the `exec` command. -- **AttachStderr** - Boolean value, attaches to `stderr` of the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. -- **Cmd** - Command to run specified as a string or an array of strings. -- **Privileged** - Boolean value, runs the exec process with extended privileges. -- **User** - A string value specifying the user, and optionally, group to run - the exec process inside the container. Format is one of: `"user"`, - `"user:group"`, `"uid"`, or `"uid:gid"`. - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **409** - container is paused -- **500** - server error - -#### Exec Start - -`POST /exec/(id)/start` - -Starts a previously set up `exec` instance `id`. If `detach` is true, this API -returns after starting the `exec` command. Otherwise, this API sets up an -interactive session with the `exec` command. - -**Example request**: - - POST /v1.21/exec/e90e34656806/start HTTP/1.1 - Content-Type: application/json - - { - "Detach": false, - "Tty": false - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/vnd.docker.raw-stream - - {% raw %} - {{ STREAM }} - {% endraw %} - -**JSON parameters**: - -- **Detach** - Detach from the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **409** - container is paused - -**Stream details**: - -Similar to the stream behavior of `POST /containers/(id or name)/attach` API - -#### Exec Resize - -`POST /exec/(id)/resize` - -Resizes the `tty` session used by the `exec` command `id`. The unit is number of characters. -This API is valid only if `tty` was specified as part of creating and starting the `exec` command. - -**Example request**: - - POST /v1.21/exec/e90e34656806/resize?h=40&w=80 HTTP/1.1 - Content-Type: text/plain - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: text/plain - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **201** – no error -- **404** – no such exec instance - -#### Exec Inspect - -`GET /exec/(id)/json` - -Return low-level information about the `exec` command `id`. - -**Example request**: - - GET /v1.21/exec/11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: plain/text - - { - "ID" : "11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39", - "Running" : false, - "ExitCode" : 2, - "ProcessConfig" : { - "privileged" : false, - "user" : "", - "tty" : false, - "entrypoint" : "sh", - "arguments" : [ - "-c", - "exit 2" - ] - }, - "OpenStdin" : false, - "OpenStderr" : false, - "OpenStdout" : false, - "Container" : { - "State" : { - "Status" : "running", - "Running" : true, - "Paused" : false, - "Restarting" : false, - "OOMKilled" : false, - "Pid" : 3650, - "ExitCode" : 0, - "Error" : "", - "StartedAt" : "2014-11-17T22:26:03.717657531Z", - "FinishedAt" : "0001-01-01T00:00:00Z" - }, - "ID" : "8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c", - "Created" : "2014-11-17T22:26:03.626304998Z", - "Path" : "date", - "Args" : [], - "Config" : { - "Hostname" : "8f177a186b97", - "Domainname" : "", - "User" : "", - "AttachStdin" : false, - "AttachStdout" : false, - "AttachStderr" : false, - "ExposedPorts" : null, - "Tty" : false, - "OpenStdin" : false, - "StdinOnce" : false, - "Env" : [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], - "Cmd" : [ - "date" - ], - "Image" : "ubuntu", - "Volumes" : null, - "WorkingDir" : "", - "Entrypoint" : null, - "NetworkDisabled" : false, - "MacAddress" : "", - "OnBuild" : null, - "SecurityOpt" : null - }, - "Image" : "5506de2b643be1e6febbf3b8a240760c6843244c41e12aa2f60ccbb7153d17f5", - "NetworkSettings" : { - "Bridge": "", - "SandboxID": "", - "HairpinMode": false, - "LinkLocalIPv6Address": "", - "LinkLocalIPv6PrefixLen": 0, - "Ports": null, - "SandboxKey": "", - "SecondaryIPAddresses": null, - "SecondaryIPv6Addresses": null, - "EndpointID": "", - "Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "IPAddress": "", - "IPPrefixLen": 0, - "IPv6Gateway": "", - "MacAddress": "", - "Networks": { - "bridge": { - "EndpointID": "", - "Gateway": "", - "IPAddress": "", - "IPPrefixLen": 0, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "" - } - } - }, - "ResolvConfPath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/resolv.conf", - "HostnamePath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/hostname", - "HostsPath" : "/var/lib/docker/containers/8f177a186b977fb451136e0fdf182abff5599a08b3c7f6ef0d36a55aaf89634c/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Name" : "/test", - "Driver" : "aufs", - "ExecDriver" : "native-0.2", - "MountLabel" : "", - "ProcessLabel" : "", - "AppArmorProfile" : "", - "RestartCount" : 0, - "Mounts" : [] - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **500** - server error - -### 2.4 Volumes - -#### List volumes - -`GET /volumes` - -**Example request**: - - GET /v1.21/volumes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Volumes": [ - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis" - } - ] - } - -**Query parameters**: - -- **filters** - JSON encoded value of the filters (a `map[string][]string`) to process on the volumes list. There is one available filter: `dangling=true` - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Create a volume - -`POST /volumes/create` - -Create a volume - -**Example request**: - - POST /v1.21/volumes/create HTTP/1.1 - Content-Type: application/json - - { - "Name": "tardis" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis" - } - -**Status codes**: - -- **201** - no error -- **500** - server error - -**JSON parameters**: - -- **Name** - The new volume's name. If not specified, Docker generates a name. -- **Driver** - Name of the volume driver to use. Defaults to `local` for the name. -- **DriverOpts** - A mapping of driver options and values. These options are - passed directly to the driver and are driver specific. - -#### Inspect a volume - -`GET /volumes/(name)` - -Return low-level information on the volume `name` - -**Example request**: - - GET /volumes/tardis - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis" - } - -**Status codes**: - -- **200** - no error -- **404** - no such volume -- **500** - server error - -#### Remove a volume - -`DELETE /volumes/(name)` - -Instruct the driver to remove the volume (`name`). - -**Example request**: - - DELETE /v1.21/volumes/tardis HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** - no error -- **404** - no such volume or volume driver -- **409** - volume is in use and cannot be removed -- **500** - server error - -### 2.5 Networks - -#### List networks - -`GET /networks` - -**Example request**: - - GET /v1.21/networks HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -[ - { - "Name": "bridge", - "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566", - "Scope": "local", - "Driver": "bridge", - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.17.0.0/16" - } - ] - }, - "Containers": { - "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": { - "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda", - "MacAddress": "02:42:ac:11:00:02", - "IPv4Address": "172.17.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - } - }, - { - "Name": "none", - "Id": "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794", - "Scope": "local", - "Driver": "null", - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - }, - { - "Name": "host", - "Id": "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e", - "Scope": "local", - "Driver": "host", - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - } -] -``` - -**Query parameters**: - -- **filters** - JSON encoded value of the filters (a `map[string][]string`) to process on the networks list. Available filters: `name=[network-names]` , `id=[network-ids]` - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Inspect network - -`GET /networks/` - -**Example request**: - - GET /v1.21/networks/f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566 HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -{ - "Name": "bridge", - "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566", - "Scope": "local", - "Driver": "bridge", - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.17.0.0/16" - } - ] - }, - "Containers": { - "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": { - "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda", - "MacAddress": "02:42:ac:11:00:02", - "IPv4Address": "172.17.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - } -} -``` - -**Status codes**: - -- **200** - no error -- **404** - network not found - -#### Create a network - -`POST /networks/create` - -Create a network - -**Example request**: - -``` -POST /v1.21/networks/create HTTP/1.1 -Content-Type: application/json - -{ - "Name":"isolated_nw", - "CheckDuplicate":true, - "Driver":"bridge", - "IPAM":{ - "Driver": "default", - "Config":[ - { - "Subnet":"172.20.0.0/16", - "IPRange":"172.20.10.0/24", - "Gateway":"172.20.10.11" - } - ] - } -} -``` - -**Example response**: - -``` -HTTP/1.1 201 Created -Content-Type: application/json - -{ - "Id": "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30", - "Warning": "" -} -``` - -**Status codes**: - -- **201** - no error -- **404** - plugin not found -- **500** - server error - -**JSON parameters**: - -- **Name** - The new network's name. this is a mandatory field -- **CheckDuplicate** - Requests daemon to check for networks with same name. Defaults to `false` -- **Driver** - Name of the network driver plugin to use. Defaults to `bridge` driver -- **IPAM** - Optional custom IP scheme for the network - - **Driver** - Name of the IPAM driver to use. Defaults to `default` driver - - **Config** - List of IPAM configuration options, specified as a map: - `{"Subnet": , "IPRange": , "Gateway": , "AuxAddress": }` -- **Options** - Network specific options to be used by the drivers - -#### Connect a container to a network - -`POST /networks/(id)/connect` - -Connect a container to a network - -**Example request**: - -``` -POST /v1.21/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/connect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4" -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **404** - network or container is not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **container** - container-id/name to be connected to the network - -#### Disconnect a container from a network - -`POST /networks/(id)/disconnect` - -Disconnect a container from a network - -**Example request**: - -``` -POST /v1.21/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/disconnect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4" -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **404** - network or container not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **Container** - container-id/name to be disconnected from a network - -#### Remove a network - -`DELETE /networks/(id)` - -Instruct the driver to remove the network (`id`). - -**Example request**: - - DELETE /v1.21/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **404** - no such network -- **500** - server error - -## 3. Going further - -### 3.1 Inside `docker run` - -As an example, the `docker run` command line makes the following API calls: - -- Create the container - -- If the status code is 404, it means the image doesn't exist: - - Try to pull it. - - Then, retry to create the container. - -- Start the container. - -- If you are not in detached mode: -- Attach to the container, using `logs=1` (to have `stdout` and - `stderr` from the container's start) and `stream=1` - -- If in detached mode or only `stdin` is attached, display the container's id. - -### 3.2 Hijacking - -In this version of the API, `/attach`, uses hijacking to transport `stdin`, -`stdout`, and `stderr` on the same socket. - -To hint potential proxies about connection hijacking, Docker client sends -connection upgrade headers similarly to websocket. - - Upgrade: tcp - Connection: Upgrade - -When Docker daemon detects the `Upgrade` header, it switches its status code -from **200 OK** to **101 UPGRADED** and resends the same headers. - - -### 3.3 CORS Requests - -To set cross origin requests to the Engine API please give values to -`--api-cors-header` when running Docker in daemon mode. Set * (asterisk) allows all, -default or blank means CORS disabled - - $ dockerd -H="192.168.1.9:2375" --api-cors-header="http://foo.bar" diff --git a/vendor/github.com/docker/docker/docs/api/v1.22.md b/vendor/github.com/docker/docker/docs/api/v1.22.md deleted file mode 100644 index e94081344..000000000 --- a/vendor/github.com/docker/docker/docs/api/v1.22.md +++ /dev/null @@ -1,3307 +0,0 @@ ---- -title: "Engine API v1.22" -description: "API Documentation for Docker" -keywords: "API, Docker, rcli, REST, documentation" -redirect_from: -- /engine/reference/api/docker_remote_api_v1.22/ -- /reference/api/docker_remote_api_v1.22/ ---- - - - -## 1. Brief introduction - - - The daemon listens on `unix:///var/run/docker.sock` but you can - [Bind Docker to another host/port or a Unix socket](../reference/commandline/dockerd.md#bind-docker-to-another-host-port-or-a-unix-socket). - - The API tends to be REST. However, for some complex commands, like `attach` - or `pull`, the HTTP connection is hijacked to transport `stdout`, - `stdin` and `stderr`. - -## 2. Endpoints - -### 2.1 Containers - -#### List containers - -`GET /containers/json` - -List containers - -**Example request**: - - GET /v1.22/containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "8dfafdbc3a40", - "Names":["/boring_feynman"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 1", - "Created": 1367854155, - "Status": "Exit 0", - "Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}], - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "2cdc4edb1ded3631c81f57966563e5c8525b81121bb3706a9a9a3ae102711f3f", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:02" - } - } - } - }, - { - "Id": "9cd87474be90", - "Names":["/coolName"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 222222", - "Created": 1367854155, - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "88eaed7b37b38c2a3f0c4bc796494fdf51b270c2d22656412a2ca5d559a64d7a", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.8", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:08" - } - } - } - }, - { - "Id": "3176a2479c92", - "Names":["/sleepy_dog"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 3333333333333333", - "Created": 1367854154, - "Status": "Exit 0", - "Ports":[], - "Labels": {}, - "SizeRw":12288, - "SizeRootFs":0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "8b27c041c30326d59cd6e6f510d4f8d1d570a228466f956edf7815508f78e30d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.6", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:06" - } - } - } - }, - { - "Id": "4cb07b47f9fb", - "Names":["/running_cat"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 444444444444444444444444444444444", - "Created": 1367854152, - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "d91c7b2f0644403d7ef3095985ea0e2370325cd2332ff3a3225c4247328e66e9", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.5", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:05" - } - } - } - } - ] - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, Show all containers. - Only running containers are shown by default (i.e., this defaults to false) -- **limit** – Show `limit` last created - containers, include non-running ones. -- **since** – Show only containers created since Id, include - non-running ones. -- **before** – Show only containers created before Id, include - non-running ones. -- **size** – 1/True/true or 0/False/false, Show the containers - sizes -- **filters** - a JSON encoded value of the filters (a `map[string][]string`) to process on the containers list. Available filters: - - `exited=`; -- containers with exit code of `` ; - - `status=`(`created`|`restarting`|`running`|`paused`|`exited`|`dead`) - - `label=key` or `label="key=value"` of a container label - - `isolation=`(`default`|`process`|`hyperv`) (Windows daemon only) - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **500** – server error - -#### Create a container - -`POST /containers/create` - -Create a container - -**Example request**: - - POST /v1.22/containers/create HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "FOO=bar", - "BAZ=quux" - ], - "Cmd": [ - "date" - ], - "Entrypoint": null, - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "StopSignal": "SIGTERM", - "HostConfig": { - "Binds": ["/tmp:/tmp"], - "Tmpfs": { "/run": "rw,noexec,nosuid,size=65536k" }, - "Links": ["redis3:redis"], - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0,1", - "BlkioWeight": 300, - "BlkioWeightDevice": [{}], - "BlkioDeviceReadBps": [{}], - "BlkioDeviceReadIOps": [{}], - "BlkioDeviceWriteBps": [{}], - "BlkioDeviceWriteIOps": [{}], - "MemorySwappiness": 60, - "OomKillDisable": false, - "OomScoreAdj": 500, - "PidMode": "", - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsOptions": [""], - "DnsSearch": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "GroupAdd": ["newgroup"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "NetworkMode": "bridge", - "Devices": [], - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [], - "CgroupParent": "", - "VolumeDriver": "", - "ShmSize": 67108864 - }, - "NetworkingConfig": { - "EndpointsConfig": { - "isolated_nw" : { - "IPAMConfig": { - "IPv4Address":"172.20.30.33", - "IPv6Address":"2001:db8:abcd::3033" - }, - "Links":["container_1", "container_2"], - "Aliases":["server_x", "server_y"] - } - } - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id":"e90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **Hostname** - A string value containing the hostname to use for the - container. -- **Domainname** - A string value containing the domain name to use - for the container. -- **User** - A string value specifying the user inside the container. -- **AttachStdin** - Boolean value, attaches to `stdin`. -- **AttachStdout** - Boolean value, attaches to `stdout`. -- **AttachStderr** - Boolean value, attaches to `stderr`. -- **Tty** - Boolean value, Attach standard streams to a `tty`, including `stdin` if it is not closed. -- **OpenStdin** - Boolean value, opens `stdin`, -- **StdinOnce** - Boolean value, close `stdin` after the 1 attached client disconnects. -- **Env** - A list of environment variables in the form of `["VAR=value", ...]` -- **Labels** - Adds a map of labels to a container. To specify a map: `{"key":"value", ... }` -- **Cmd** - Command to run specified as a string or an array of strings. -- **Entrypoint** - Set the entry point for the container as a string or an array - of strings. -- **Image** - A string specifying the image name to use for the container. -- **Volumes** - An object mapping mount point paths (strings) inside the - container to empty objects. -- **WorkingDir** - A string specifying the working directory for commands to - run in. -- **NetworkDisabled** - Boolean value, when true disables networking for the - container -- **ExposedPorts** - An object mapping ports to an empty object in the form of: - `"ExposedPorts": { "/: {}" }` -- **StopSignal** - Signal to stop a container as a string or unsigned integer. `SIGTERM` by default. -- **HostConfig** - - **Binds** – A list of volume bindings for this container. Each volume binding is a string in one of these forms: - + `host-src:container-dest` to bind-mount a host path into the - container. Both `host-src`, and `container-dest` must be an - _absolute_ path. - + `host-src:container-dest:ro` to make the bind-mount read-only - inside the container. Both `host-src`, and `container-dest` must be - an _absolute_ path. - + `volume-name:container-dest` to bind-mount a volume managed by a - volume driver into the container. `container-dest` must be an - _absolute_ path. - + `volume-name:container-dest:ro` to mount the volume read-only - inside the container. `container-dest` must be an _absolute_ path. - - **Tmpfs** – A map of container directories which should be replaced by tmpfs mounts, and their corresponding - mount options. A JSON object in the form `{ "/run": "rw,noexec,nosuid,size=65536k" }`. - - **Links** - A list of links for the container. Each link entry should be - in the form of `container_name:alias`. - - **Memory** - Memory limit in bytes. - - **MemorySwap** - Total memory limit (memory + swap); set `-1` to enable unlimited swap. - You must use this with `memory` and make the swap value larger than `memory`. - - **MemoryReservation** - Memory soft limit in bytes. - - **KernelMemory** - Kernel memory limit in bytes. - - **CpuShares** - An integer value containing the container's CPU Shares - (ie. the relative weight vs other containers). - - **CpuPeriod** - The length of a CPU period in microseconds. - - **CpuQuota** - Microseconds of CPU time that the container can get in a CPU period. - - **CpusetCpus** - String value containing the `cgroups CpusetCpus` to use. - - **CpusetMems** - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - - **BlkioWeight** - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - - **BlkioWeightDevice** - Block IO weight (relative device weight) in the form of: `"BlkioWeightDevice": [{"Path": "device_path", "Weight": weight}]` - - **BlkioDeviceReadBps** - Limit read rate (bytes per second) from a device in the form of: `"BlkioDeviceReadBps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceReadBps": [{"Path": "/dev/sda", "Rate": "1024"}]"` - - **BlkioDeviceWriteBps** - Limit write rate (bytes per second) to a device in the form of: `"BlkioDeviceWriteBps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceWriteBps": [{"Path": "/dev/sda", "Rate": "1024"}]"` - - **BlkioDeviceReadIOps** - Limit read rate (IO per second) from a device in the form of: `"BlkioDeviceReadIOps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceReadIOps": [{"Path": "/dev/sda", "Rate": "1000"}]` - - **BlkioDeviceWiiteIOps** - Limit write rate (IO per second) to a device in the form of: `"BlkioDeviceWriteIOps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceWriteIOps": [{"Path": "/dev/sda", "Rate": "1000"}]` - - **MemorySwappiness** - Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100. - - **OomKillDisable** - Boolean value, whether to disable OOM Killer for the container or not. - - **OomScoreAdj** - An integer value containing the score given to the container in order to tune OOM killer preferences. - - **PidMode** - Set the PID (Process) Namespace mode for the container; - `"container:"`: joins another container's PID namespace - `"host"`: use the host's PID namespace inside the container - - **PortBindings** - A map of exposed container ports and the host port they - should map to. A JSON object in the form - `{ /: [{ "HostPort": "" }] }` - Take note that `port` is specified as a string and not an integer value. - - **PublishAllPorts** - Allocates a random host port for all of a container's - exposed ports. Specified as a boolean value. - - **Privileged** - Gives the container full access to the host. Specified as - a boolean value. - - **ReadonlyRootfs** - Mount the container's root filesystem as read only. - Specified as a boolean value. - - **Dns** - A list of DNS servers for the container to use. - - **DnsOptions** - A list of DNS options - - **DnsSearch** - A list of DNS search domains - - **ExtraHosts** - A list of hostnames/IP mappings to add to the - container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`. - - **VolumesFrom** - A list of volumes to inherit from another container. - Specified in the form `[:]` - - **CapAdd** - A list of kernel capabilities to add to the container. - - **Capdrop** - A list of kernel capabilities to drop from the container. - - **GroupAdd** - A list of additional groups that the container process will run as - - **RestartPolicy** – The behavior to apply when the container exits. The - value is an object with a `Name` property of either `"always"` to - always restart, `"unless-stopped"` to restart always except when - user has manually stopped the container or `"on-failure"` to restart only when the container - exit code is non-zero. If `on-failure` is used, `MaximumRetryCount` - controls the number of times to retry before giving up. - The default is not to restart. (optional) - An ever increasing delay (double the previous delay, starting at 100mS) - is added before each restart to prevent flooding the server. - - **NetworkMode** - Sets the networking mode for the container. Supported - standard values are: `bridge`, `host`, `none`, and `container:`. Any other value is taken - as a custom network's name to which this container should connect to. - - **Devices** - A list of devices to add to the container specified as a JSON object in the - form - `{ "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}` - - **Ulimits** - A list of ulimits to set in the container, specified as - `{ "Name": , "Soft": , "Hard": }`, for example: - `Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }` - - **SecurityOpt**: A list of string values to customize labels for MLS - systems, such as SELinux. - - **LogConfig** - Log configuration for the container, specified as a JSON object in the form - `{ "Type": "", "Config": {"key1": "val1"}}`. - Available types: `json-file`, `syslog`, `journald`, `gelf`, `awslogs`, `splunk`, `none`. - `json-file` logging driver. - - **CgroupParent** - Path to `cgroups` under which the container's `cgroup` is created. If the path is not absolute, the path is considered to be relative to the `cgroups` path of the init process. Cgroups are created if they do not already exist. - - **VolumeDriver** - Driver that this container users to mount volumes. - - **ShmSize** - Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB. - -**Query parameters**: - -- **name** – Assign the specified name to the container. Must - match `/?[a-zA-Z0-9_-]+`. - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such container -- **406** – impossible to attach (container not running) -- **409** – conflict -- **500** – server error - -#### Inspect a container - -`GET /containers/(id or name)/json` - -Return low-level information on the container `id` - -**Example request**: - - GET /v1.22/containers/4fa6e0f0c678/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "AppArmorProfile": "", - "Args": [ - "-c", - "exit 9" - ], - "Config": { - "AttachStderr": true, - "AttachStdin": false, - "AttachStdout": true, - "Cmd": [ - "/bin/sh", - "-c", - "exit 9" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts": null, - "Hostname": "ba033ac44011", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "MacAddress": "", - "NetworkDisabled": false, - "OnBuild": null, - "OpenStdin": false, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "StopSignal": "SIGTERM" - }, - "Created": "2015-01-06T15:47:31.485331387Z", - "Driver": "devicemapper", - "ExecIDs": null, - "HostConfig": { - "Binds": null, - "BlkioWeight": 0, - "BlkioWeightDevice": [{}], - "BlkioDeviceReadBps": [{}], - "BlkioDeviceWriteBps": [{}], - "BlkioDeviceReadIOps": [{}], - "BlkioDeviceWriteIOps": [{}], - "CapAdd": null, - "CapDrop": null, - "ContainerIDFile": "", - "CpusetCpus": "", - "CpusetMems": "", - "CpuShares": 0, - "CpuPeriod": 100000, - "Devices": [], - "Dns": null, - "DnsOptions": null, - "DnsSearch": null, - "ExtraHosts": null, - "IpcMode": "", - "Links": null, - "LxcConf": [], - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "OomKillDisable": false, - "OomScoreAdj": 500, - "NetworkMode": "bridge", - "PidMode": "", - "PortBindings": {}, - "Privileged": false, - "ReadonlyRootfs": false, - "PublishAllPorts": false, - "RestartPolicy": { - "MaximumRetryCount": 2, - "Name": "on-failure" - }, - "LogConfig": { - "Config": null, - "Type": "json-file" - }, - "SecurityOpt": null, - "VolumesFrom": null, - "Ulimits": [{}], - "VolumeDriver": "", - "ShmSize": 67108864 - }, - "HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname", - "HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39", - "Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2", - "MountLabel": "", - "Name": "/boring_euclid", - "NetworkSettings": { - "Bridge": "", - "SandboxID": "", - "HairpinMode": false, - "LinkLocalIPv6Address": "", - "LinkLocalIPv6PrefixLen": 0, - "Ports": null, - "SandboxKey": "", - "SecondaryIPAddresses": null, - "SecondaryIPv6Addresses": null, - "EndpointID": "", - "Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "IPAddress": "", - "IPPrefixLen": 0, - "IPv6Gateway": "", - "MacAddress": "", - "Networks": { - "bridge": { - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:12:00:02" - } - } - }, - "Path": "/bin/sh", - "ProcessLabel": "", - "ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf", - "RestartCount": 1, - "State": { - "Error": "", - "ExitCode": 9, - "FinishedAt": "2015-01-06T15:47:32.080254511Z", - "OOMKilled": false, - "Dead": false, - "Paused": false, - "Pid": 0, - "Restarting": false, - "Running": true, - "StartedAt": "2015-01-06T15:47:32.072697474Z", - "Status": "running" - }, - "Mounts": [ - { - "Name": "fac362...80535", - "Source": "/data", - "Destination": "/data", - "Driver": "local", - "Mode": "ro,Z", - "RW": false, - "Propagation": "" - } - ] - } - -**Example request, with size information**: - - GET /v1.22/containers/4fa6e0f0c678/json?size=1 HTTP/1.1 - -**Example response, with size information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - .... - "SizeRw": 0, - "SizeRootFs": 972, - .... - } - -**Query parameters**: - -- **size** – 1/True/true or 0/False/false, return container size information. Default is `false`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### List processes running inside a container - -`GET /containers/(id or name)/top` - -List processes running inside the container `id`. On Unix systems this -is done by running the `ps` command. This endpoint is not -supported on Windows. - -**Example request**: - - GET /v1.22/containers/4fa6e0f0c678/top HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "UID", "PID", "PPID", "C", "STIME", "TTY", "TIME", "CMD" - ], - "Processes" : [ - [ - "root", "13642", "882", "0", "17:03", "pts/0", "00:00:00", "/bin/bash" - ], - [ - "root", "13735", "13642", "0", "17:06", "pts/0", "00:00:00", "sleep 10" - ] - ] - } - -**Example request**: - - GET /v1.22/containers/4fa6e0f0c678/top?ps_args=aux HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "USER","PID","%CPU","%MEM","VSZ","RSS","TTY","STAT","START","TIME","COMMAND" - ] - "Processes" : [ - [ - "root","13642","0.0","0.1","18172","3184","pts/0","Ss","17:03","0:00","/bin/bash" - ], - [ - "root","13895","0.0","0.0","4348","692","pts/0","S+","17:15","0:00","sleep 10" - ] - ], - } - -**Query parameters**: - -- **ps_args** – `ps` arguments to use (e.g., `aux`), defaults to `-ef` - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container logs - -`GET /containers/(id or name)/logs` - -Get `stdout` and `stderr` logs from the container ``id`` - -> **Note**: -> This endpoint works only for containers with the `json-file` or `journald` logging drivers. - -**Example request**: - - GET /v1.22/containers/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **follow** – 1/True/true or 0/False/false, return stream. Default `false`. -- **stdout** – 1/True/true or 0/False/false, show `stdout` log. Default `false`. -- **stderr** – 1/True/true or 0/False/false, show `stderr` log. Default `false`. -- **since** – UNIX timestamp (integer) to filter logs. Specifying a timestamp - will only output log-entries since that timestamp. Default: 0 (unfiltered) -- **timestamps** – 1/True/true or 0/False/false, print timestamps for - every log line. Default `false`. -- **tail** – Output specified number of lines at the end of logs: `all` or ``. Default all. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **404** – no such container -- **500** – server error - -#### Inspect changes on a container's filesystem - -`GET /containers/(id or name)/changes` - -Inspect changes on container `id`'s filesystem - -**Example request**: - - GET /v1.22/containers/4fa6e0f0c678/changes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Path": "/dev", - "Kind": 0 - }, - { - "Path": "/dev/kmsg", - "Kind": 1 - }, - { - "Path": "/test", - "Kind": 1 - } - ] - -Values for `Kind`: - -- `0`: Modify -- `1`: Add -- `2`: Delete - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Export a container - -`GET /containers/(id or name)/export` - -Export the contents of container `id` - -**Example request**: - - GET /v1.22/containers/4fa6e0f0c678/export HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/octet-stream - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container stats based on resource usage - -`GET /containers/(id or name)/stats` - -This endpoint returns a live stream of a container's resource usage statistics. - -**Example request**: - - GET /v1.22/containers/redis1/stats HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "read" : "2015-01-08T22:57:31.547920715Z", - "networks": { - "eth0": { - "rx_bytes": 5338, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 36, - "tx_bytes": 648, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 8 - }, - "eth5": { - "rx_bytes": 4641, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 26, - "tx_bytes": 690, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 9 - } - }, - "memory_stats" : { - "stats" : { - "total_pgmajfault" : 0, - "cache" : 0, - "mapped_file" : 0, - "total_inactive_file" : 0, - "pgpgout" : 414, - "rss" : 6537216, - "total_mapped_file" : 0, - "writeback" : 0, - "unevictable" : 0, - "pgpgin" : 477, - "total_unevictable" : 0, - "pgmajfault" : 0, - "total_rss" : 6537216, - "total_rss_huge" : 6291456, - "total_writeback" : 0, - "total_inactive_anon" : 0, - "rss_huge" : 6291456, - "hierarchical_memory_limit" : 67108864, - "total_pgfault" : 964, - "total_active_file" : 0, - "active_anon" : 6537216, - "total_active_anon" : 6537216, - "total_pgpgout" : 414, - "total_cache" : 0, - "inactive_anon" : 0, - "active_file" : 0, - "pgfault" : 964, - "inactive_file" : 0, - "total_pgpgin" : 477 - }, - "max_usage" : 6651904, - "usage" : 6537216, - "failcnt" : 0, - "limit" : 67108864 - }, - "blkio_stats" : {}, - "cpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24472255, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100215355, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 739306590000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - }, - "precpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24350896, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100093996, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 9492140000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - } - } - -The precpu_stats is the cpu statistic of last read, which is used for calculating the cpu usage percent. It is not the exact copy of the “cpu_stats” field. - -**Query parameters**: - -- **stream** – 1/True/true or 0/False/false, pull stats once then disconnect. Default `true`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Resize a container TTY - -`POST /containers/(id or name)/resize` - -Resize the TTY for container with `id`. The unit is number of characters. You must restart the container for the resize to take effect. - -**Example request**: - - POST /v1.22/containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **200** – no error -- **404** – No such container -- **500** – Cannot resize container - -#### Start a container - -`POST /containers/(id or name)/start` - -Start the container `id` - -> **Note**: -> For backwards compatibility, this endpoint accepts a `HostConfig` as JSON-encoded request body. -> See [create a container](#create-a-container) for details. - -**Example request**: - - POST /v1.22/containers/e90e34656806/start HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**Status codes**: - -- **204** – no error -- **304** – container already started -- **404** – no such container -- **500** – server error - -#### Stop a container - -`POST /containers/(id or name)/stop` - -Stop the container `id` - -**Example request**: - - POST /v1.22/containers/e90e34656806/stop?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **304** – container already stopped -- **404** – no such container -- **500** – server error - -#### Restart a container - -`POST /containers/(id or name)/restart` - -Restart the container `id` - -**Example request**: - - POST /v1.22/containers/e90e34656806/restart?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Kill a container - -`POST /containers/(id or name)/kill` - -Kill the container `id` - -**Example request**: - - POST /v1.22/containers/e90e34656806/kill HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **signal** - Signal to send to the container: integer or string like `SIGINT`. - When not set, `SIGKILL` is assumed and the call waits for the container to exit. - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Update a container - -`POST /containers/(id or name)/update` - -Update resource configs of one or more containers. - -**Example request**: - - POST /v1.22/containers/e90e34656806/update HTTP/1.1 - Content-Type: application/json - - { - "BlkioWeight": 300, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0", - "Memory": 314572800, - "MemorySwap": 514288000, - "MemoryReservation": 209715200, - "KernelMemory": 52428800, - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Warnings": [] - } - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -#### Rename a container - -`POST /containers/(id or name)/rename` - -Rename the container `id` to a `new_name` - -**Example request**: - - POST /v1.22/containers/e90e34656806/rename?name=new_name HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **name** – new name for the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **409** - conflict name already assigned -- **500** – server error - -#### Pause a container - -`POST /containers/(id or name)/pause` - -Pause the container `id` - -**Example request**: - - POST /v1.22/containers/e90e34656806/pause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Unpause a container - -`POST /containers/(id or name)/unpause` - -Unpause the container `id` - -**Example request**: - - POST /v1.22/containers/e90e34656806/unpause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Attach to a container - -`POST /containers/(id or name)/attach` - -Attach to the container `id` - -**Example request**: - - POST /v1.22/containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **400** – bad parameter -- **404** – no such container -- **409** - container is paused -- **500** – server error - -**Stream details**: - -When using the TTY setting is enabled in -[`POST /containers/create` -](#create-a-container), -the stream is the raw data from the process PTY and client's `stdin`. -When the TTY is disabled, then the stream is multiplexed to separate -`stdout` and `stderr`. - -The format is a **Header** and a **Payload** (frame). - -**HEADER** - -The header contains the information which the stream writes (`stdout` or -`stderr`). It also contains the size of the associated frame encoded in the -last four bytes (`uint32`). - -It is encoded on the first eight bytes like this: - - header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4} - -`STREAM_TYPE` can be: - -- 0: `stdin` (is written on `stdout`) -- 1: `stdout` -- 2: `stderr` - -`SIZE1, SIZE2, SIZE3, SIZE4` are the four bytes of -the `uint32` size encoded as big endian. - -**PAYLOAD** - -The payload is the raw stream. - -**IMPLEMENTATION** - -The simplest way to implement the Attach protocol is the following: - - 1. Read eight bytes. - 2. Choose `stdout` or `stderr` depending on the first byte. - 3. Extract the frame size from the last four bytes. - 4. Read the extracted size and output it on the correct output. - 5. Goto 1. - -#### Attach to a container (websocket) - -`GET /containers/(id or name)/attach/ws` - -Attach to the container `id` via websocket - -Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455) - -**Example request** - - GET /v1.22/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1 - -**Example response** - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -#### Wait a container - -`POST /containers/(id or name)/wait` - -Block until container `id` stops, then returns the exit code - -**Example request**: - - POST /v1.22/containers/16253994b7c4/wait HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"StatusCode": 0} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Remove a container - -`DELETE /containers/(id or name)` - -Remove the container `id` from the filesystem - -**Example request**: - - DELETE /v1.22/containers/16253994b7c4?v=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **v** – 1/True/true or 0/False/false, Remove the volumes - associated to the container. Default `false`. -- **force** - 1/True/true or 0/False/false, Kill then remove the container. - Default `false`. - -**Status codes**: - -- **204** – no error -- **400** – bad parameter -- **404** – no such container -- **409** – conflict -- **500** – server error - -#### Copy files or folders from a container - -`POST /containers/(id or name)/copy` - -Copy files or folders of container `id` - -**Deprecated** in favor of the `archive` endpoint below. - -**Example request**: - - POST /v1.22/containers/4fa6e0f0c678/copy HTTP/1.1 - Content-Type: application/json - - { - "Resource": "test.txt" - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Retrieving information about files and folders in a container - -`HEAD /containers/(id or name)/archive` - -See the description of the `X-Docker-Container-Path-Stat` header in the -following section. - -#### Get an archive of a filesystem resource in a container - -`GET /containers/(id or name)/archive` - -Get a tar archive of a resource in the filesystem of container `id`. - -**Query parameters**: - -- **path** - resource in the container's filesystem to archive. Required. - - If not an absolute path, it is relative to the container's root directory. - The resource specified by **path** must exist. To assert that the resource - is expected to be a directory, **path** should end in `/` or `/.` - (assuming a path separator of `/`). If **path** ends in `/.` then this - indicates that only the contents of the **path** directory should be - copied. A symlink is always resolved to its target. - - > **Note**: It is not possible to copy certain system files such as resources - > under `/proc`, `/sys`, `/dev`, and mounts created by the user in the - > container. - -**Example request**: - - GET /v1.22/containers/8cce319429b2/archive?path=/root HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - X-Docker-Container-Path-Stat: eyJuYW1lIjoicm9vdCIsInNpemUiOjQwOTYsIm1vZGUiOjIxNDc0ODQwOTYsIm10aW1lIjoiMjAxNC0wMi0yN1QyMDo1MToyM1oiLCJsaW5rVGFyZ2V0IjoiIn0= - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -On success, a response header `X-Docker-Container-Path-Stat` will be set to a -base64-encoded JSON object containing some filesystem header information about -the archived resource. The above example value would decode to the following -JSON object (whitespace added for readability): - -```json -{ - "name": "root", - "size": 4096, - "mode": 2147484096, - "mtime": "2014-02-27T20:51:23Z", - "linkTarget": "" -} -``` - -A `HEAD` request can also be made to this endpoint if only this information is -desired. - -**Status codes**: - -- **200** - success, returns archive of copied resource -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** was asserted to be a directory but exists as a - file) -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** does not exist) -- **500** - server error - -#### Extract an archive of files or folders to a directory in a container - -`PUT /containers/(id or name)/archive` - -Upload a tar archive to be extracted to a path in the filesystem of container -`id`. - -**Query parameters**: - -- **path** - path to a directory in the container - to extract the archive's contents into. Required. - - If not an absolute path, it is relative to the container's root directory. - The **path** resource must exist. -- **noOverwriteDirNonDir** - If "1", "true", or "True" then it will be an error - if unpacking the given content would cause an existing directory to be - replaced with a non-directory and vice versa. - -**Example request**: - - PUT /v1.22/containers/8cce319429b2/archive?path=/vol1 HTTP/1.1 - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – the content was extracted successfully -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** should be a directory but exists as a file) - - unable to overwrite existing directory with non-directory - (if **noOverwriteDirNonDir**) - - unable to overwrite existing non-directory with directory - (if **noOverwriteDirNonDir**) -- **403** - client error, permission denied, the volume - or container rootfs is marked as read-only. -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** resource does not exist) -- **500** – server error - -### 2.2 Images - -#### List Images - -`GET /images/json` - -**Example request**: - - GET /v1.22/images/json?all=0 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "RepoTags": [ - "ubuntu:12.04", - "ubuntu:precise", - "ubuntu:latest" - ], - "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c", - "Created": 1365714795, - "Size": 131506275, - "VirtualSize": 131506275, - "Labels": {} - }, - { - "RepoTags": [ - "ubuntu:12.10", - "ubuntu:quantal" - ], - "ParentId": "27cf784147099545", - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Created": 1364102658, - "Size": 24653, - "VirtualSize": 180116135, - "Labels": { - "com.example.version": "v1" - } - } - ] - -**Example request, with digest information**: - - GET /v1.22/images/json?digests=1 HTTP/1.1 - -**Example response, with digest information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Created": 1420064636, - "Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125", - "ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2", - "RepoDigests": [ - "localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags": [ - "localhost:5000/test/busybox:latest", - "playdate:latest" - ], - "Size": 0, - "VirtualSize": 2429728, - "Labels": {} - } - ] - -The response shows a single image `Id` associated with two repositories -(`RepoTags`): `localhost:5000/test/busybox`: and `playdate`. A caller can use -either of the `RepoTags` values `localhost:5000/test/busybox:latest` or -`playdate:latest` to reference the image. - -You can also use `RepoDigests` values to reference an image. In this response, -the array has only one reference and that is to the -`localhost:5000/test/busybox` repository; the `playdate` repository has no -digest. You can reference this digest using the value: -`localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...` - -See the `docker run` and `docker build` commands for examples of digest and tag -references on the command line. - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, default false -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `dangling=true` - - `label=key` or `label="key=value"` of an image label -- **filter** - only return images with the specified name - -#### Build image from a Dockerfile - -`POST /build` - -Build an image from a Dockerfile - -**Example request**: - - POST /v1.22/build HTTP/1.1 - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"stream": "Step 1/5..."} - {"stream": "..."} - {"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}} - -The input stream must be a `tar` archive compressed with one of the -following algorithms: `identity` (no compression), `gzip`, `bzip2`, `xz`. - -The archive must include a build instructions file, typically called -`Dockerfile` at the archive's root. The `dockerfile` parameter may be -used to specify a different build instructions file. To do this, its value must be -the path to the alternate build instructions file to use. - -The archive may include any number of other files, -which are accessible in the build context (See the [*ADD build -command*](../reference/builder.md#add)). - -The Docker daemon performs a preliminary validation of the `Dockerfile` before -starting the build, and returns an error if the syntax is incorrect. After that, -each instruction is run one-by-one until the ID of the new image is output. - -The build is canceled if the client drops the connection by quitting -or being killed. - -**Query parameters**: - -- **dockerfile** - Path within the build context to the `Dockerfile`. This is - ignored if `remote` is specified and points to an external `Dockerfile`. -- **t** – A name and optional tag to apply to the image in the `name:tag` format. - If you omit the `tag` the default `latest` value is assumed. - You can provide one or more `t` parameters. -- **remote** – A Git repository URI or HTTP/HTTPS context URI. If the - URI points to a single text file, the file's contents are placed into - a file called `Dockerfile` and the image is built from that file. If - the URI points to a tarball, the file is downloaded by the daemon and - the contents therein used as the context for the build. If the URI - points to a tarball and the `dockerfile` parameter is also specified, - there must be a file with the corresponding path inside the tarball. -- **q** – Suppress verbose build output. -- **nocache** – Do not use the cache when building the image. -- **pull** - Attempt to pull the image even if an older image exists locally. -- **rm** - Remove intermediate containers after a successful build (default behavior). -- **forcerm** - Always remove intermediate containers (includes `rm`). -- **memory** - Set memory limit for build. -- **memswap** - Total memory (memory + swap), `-1` to enable unlimited swap. -- **cpushares** - CPU shares (relative weight). -- **cpusetcpus** - CPUs in which to allow execution (e.g., `0-3`, `0,1`). -- **cpuperiod** - The length of a CPU period in microseconds. -- **cpuquota** - Microseconds of CPU time that the container can get in a CPU period. -- **buildargs** – JSON map of string pairs for build-time variables. Users pass - these values at build-time. Docker uses the `buildargs` as the environment - context for command(s) run via the Dockerfile's `RUN` instruction or for - variable expansion in other Dockerfile instructions. This is not meant for - passing secret values. [Read more about the buildargs instruction](../reference/builder.md#arg) -- **shmsize** - Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB. - -**Request Headers**: - -- **Content-type** – Set to `"application/tar"`. -- **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON - object with the following structure: - - { - "docker.example.com": { - "username": "janedoe", - "password": "hunter2" - }, - "https://index.docker.io/v1/": { - "username": "mobydock", - "password": "conta1n3rize14" - } - } - - This object maps the hostname of a registry to an object containing the - "username" and "password" for that registry. Multiple registries may - be specified as the build may be based on an image requiring - authentication to pull from any arbitrary registry. Only the registry - domain name (and port if not the default "443") are required. However - (for legacy reasons) the "official" Docker, Inc. hosted registry must - be specified with both a "https://" prefix and a "/v1/" suffix even - though Docker will prefer to use the v2 registry API. - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Create an image - -`POST /images/create` - -Create an image either by pulling it from the registry or by importing it - -**Example request**: - - POST /v1.22/images/create?fromImage=busybox&tag=latest HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pulling..."} - {"status": "Pulling", "progress": "1 B/ 100 B", "progressDetail": {"current": 1, "total": 100}} - {"error": "Invalid..."} - ... - -When using this endpoint to pull an image from the registry, the -`X-Registry-Auth` header can be used to include -a base64-encoded AuthConfig object. - -**Query parameters**: - -- **fromImage** – Name of the image to pull. The name may include a tag or - digest. This parameter may only be used when pulling an image. - The pull is cancelled if the HTTP connection is closed. -- **fromSrc** – Source to import. The value may be a URL from which the image - can be retrieved or `-` to read the image from the request body. - This parameter may only be used when importing an image. -- **repo** – Repository name given to an image when it is imported. - The repo may include a tag. This parameter may only be used when importing - an image. -- **tag** – Tag or digest. If empty when pulling an image, this causes all tags - for the given image to be pulled. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either login information, or a token - - Credential based login: - - ``` - { - "username": "jdoe", - "password": "secret", - "email": "jdoe@acme.com" - } - ``` - - - Token based login: - - ``` - { - "registrytoken": "9cbaf023786cd7..." - } - ``` - -**Status codes**: - -- **200** – no error -- **404** - repository does not exist or no read access -- **500** – server error - - - -#### Inspect an image - -`GET /images/(name)/json` - -Return low-level information on the image `name` - -**Example request**: - - GET /v1.22/images/example/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Id" : "85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c", - "Container" : "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a", - "Comment" : "", - "Os" : "linux", - "Architecture" : "amd64", - "Parent" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "ContainerConfig" : { - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Domainname" : "", - "AttachStdout" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "StdinOnce" : false, - "NetworkDisabled" : false, - "OnBuild" : [], - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "User" : "", - "WorkingDir" : "", - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "Labels" : { - "com.example.license" : "GPL", - "com.example.version" : "1.0", - "com.example.vendor" : "Acme" - }, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts" : null, - "Cmd" : [ - "/bin/sh", - "-c", - "#(nop) LABEL com.example.vendor=Acme com.example.license=GPL com.example.version=1.0" - ] - }, - "DockerVersion" : "1.9.0-dev", - "VirtualSize" : 188359297, - "Size" : 0, - "Author" : "", - "Created" : "2015-09-10T08:30:53.26995814Z", - "GraphDriver" : { - "Name" : "aufs", - "Data" : null - }, - "RepoDigests" : [ - "localhost:5000/test/busybox/example@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags" : [ - "example:1.0", - "example:latest", - "example:stable" - ], - "Config" : { - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "NetworkDisabled" : false, - "OnBuild" : [], - "StdinOnce" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "Domainname" : "", - "AttachStdout" : false, - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Cmd" : [ - "/bin/bash" - ], - "ExposedPorts" : null, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "Labels" : { - "com.example.vendor" : "Acme", - "com.example.version" : "1.0", - "com.example.license" : "GPL" - }, - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "WorkingDir" : "", - "User" : "" - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Get the history of an image - -`GET /images/(name)/history` - -Return the history of the image `name` - -**Example request**: - - GET /v1.22/images/ubuntu/history HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710", - "Created": 1398108230, - "CreatedBy": "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /", - "Tags": [ - "ubuntu:lucid", - "ubuntu:10.04" - ], - "Size": 182964289, - "Comment": "" - }, - { - "Id": "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8", - "Created": 1398108222, - "CreatedBy": "/bin/sh -c #(nop) MAINTAINER Tianon Gravi - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/", - "Tags": null, - "Size": 0, - "Comment": "" - }, - { - "Id": "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158", - "Created": 1371157430, - "CreatedBy": "", - "Tags": [ - "scratch12:latest", - "scratch:latest" - ], - "Size": 0, - "Comment": "Imported from -" - } - ] - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Push an image on the registry - -`POST /images/(name)/push` - -Push the image `name` on the registry - -**Example request**: - - POST /v1.22/images/test/push HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pushing..."} - {"status": "Pushing", "progress": "1/? (n/a)", "progressDetail": {"current": 1}}} - {"error": "Invalid..."} - ... - -If you wish to push an image on to a private registry, that image must already have a tag -into a repository which references that registry `hostname` and `port`. This repository name should -then be used in the URL. This duplicates the command line's flow. - -The push is cancelled if the HTTP connection is closed. - -**Example request**: - - POST /v1.22/images/registry.acme.com:5000/test/push HTTP/1.1 - - -**Query parameters**: - -- **tag** – The tag to associate with the image on the registry. This is optional. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either login information, or a token - - Credential based login: - - ``` - { - "username": "jdoe", - "password": "secret", - "email": "jdoe@acme.com", - } - ``` - - - Token based login: - - ``` - { - "registrytoken": "9cbaf023786cd7..." - } - ``` - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Tag an image into a repository - -`POST /images/(name)/tag` - -Tag the image `name` into a repository - -**Example request**: - - POST /v1.22/images/test/tag?repo=myrepo&force=0&tag=v42 HTTP/1.1 - -**Example response**: - - HTTP/1.1 201 Created - -**Query parameters**: - -- **repo** – The repository to tag in -- **force** – 1/True/true or 0/False/false, default false -- **tag** - The new tag name - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Remove an image - -`DELETE /images/(name)` - -Remove the image `name` from the filesystem - -**Example request**: - - DELETE /v1.22/images/test HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-type: application/json - - [ - {"Untagged": "3e2f21a89f"}, - {"Deleted": "3e2f21a89f"}, - {"Deleted": "53b4f83ac9"} - ] - -**Query parameters**: - -- **force** – 1/True/true or 0/False/false, default false -- **noprune** – 1/True/true or 0/False/false, default false - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Search images - -`GET /images/search` - -Search for an image on [Docker Hub](https://hub.docker.com). - -> **Note**: -> The response keys have changed from API v1.6 to reflect the JSON -> sent by the registry server to the docker daemon's request. - -**Example request**: - - GET /v1.22/images/search?term=sshd HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "wma55/u1210sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "jdswinbank/sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "vgauthier/sshd", - "star_count": 0 - } - ... - ] - -**Query parameters**: - -- **term** – term to search - -**Status codes**: - -- **200** – no error -- **500** – server error - -### 2.3 Misc - -#### Check auth configuration - -`POST /auth` - -Get the default username and email - -**Example request**: - - POST /v1.22/auth HTTP/1.1 - Content-Type: application/json - - { - "username": "hannibal", - "password": "xxxx", - "email": "hannibal@a-team.com", - "serveraddress": "https://index.docker.io/v1/" - } - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – no error -- **204** – no error -- **500** – server error - -#### Display system-wide information - -`GET /info` - -Display system-wide information - -**Example request**: - - GET /v1.22/info HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Architecture": "x86_64", - "ClusterStore": "etcd://localhost:2379", - "Containers": 11, - "ContainersRunning": 7, - "ContainersStopped": 3, - "ContainersPaused": 1, - "CpuCfsPeriod": true, - "CpuCfsQuota": true, - "Debug": false, - "DockerRootDir": "/var/lib/docker", - "Driver": "btrfs", - "DriverStatus": [[""]], - "ExecutionDriver": "native-0.1", - "ExperimentalBuild": false, - "HttpProxy": "http://test:test@localhost:8080", - "HttpsProxy": "https://test:test@localhost:8080", - "ID": "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS", - "IPv4Forwarding": true, - "Images": 16, - "IndexServerAddress": "https://index.docker.io/v1/", - "InitPath": "/usr/bin/docker", - "InitSha1": "", - "KernelVersion": "3.12.0-1-amd64", - "Labels": [ - "storage=ssd" - ], - "MemTotal": 2099236864, - "MemoryLimit": true, - "NCPU": 1, - "NEventsListener": 0, - "NFd": 11, - "NGoroutines": 21, - "Name": "prod-server-42", - "NoProxy": "9.81.1.160", - "OomKillDisable": true, - "OSType": "linux", - "OperatingSystem": "Boot2Docker", - "Plugins": { - "Volume": [ - "local" - ], - "Network": [ - "null", - "host", - "bridge" - ] - }, - "RegistryConfig": { - "IndexConfigs": { - "docker.io": { - "Mirrors": null, - "Name": "docker.io", - "Official": true, - "Secure": true - } - }, - "InsecureRegistryCIDRs": [ - "127.0.0.0/8" - ] - }, - "ServerVersion": "1.9.0", - "SwapLimit": false, - "SystemStatus": [["State", "Healthy"]], - "SystemTime": "2015-03-10T11:11:23.730591467-07:00" - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Show the docker version information - -`GET /version` - -Show the docker version information - -**Example request**: - - GET /v1.22/version HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Version": "1.10.0", - "Os": "linux", - "KernelVersion": "3.19.0-23-generic", - "GoVersion": "go1.4.2", - "GitCommit": "e75da4b", - "Arch": "amd64", - "ApiVersion": "1.22", - "BuildTime": "2015-12-01T07:09:13.444803460+00:00", - "Experimental": true - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Ping the docker server - -`GET /_ping` - -Ping the docker server - -**Example request**: - - GET /v1.22/_ping HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: text/plain - - OK - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Create a new image from a container's changes - -`POST /commit` - -Create a new image from a container's changes - -**Example request**: - - POST /v1.22/commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Mounts": [ - { - "Source": "/data", - "Destination": "/data", - "Mode": "ro,Z", - "RW": false - } - ], - "Labels": { - "key1": "value1", - "key2": "value2" - }, - "WorkingDir": "", - "NetworkDisabled": false, - "ExposedPorts": { - "22/tcp": {} - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - {"Id": "596069db4bf5"} - -**JSON parameters**: - -- **config** - the container's configuration - -**Query parameters**: - -- **container** – source container -- **repo** – repository -- **tag** – tag -- **comment** – commit message -- **author** – author (e.g., "John Hannibal Smith - <[hannibal@a-team.com](mailto:hannibal%40a-team.com)>") -- **pause** – 1/True/true or 0/False/false, whether to pause the container before committing -- **changes** – Dockerfile instructions to apply while committing - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **500** – server error - -#### Monitor Docker's events - -`GET /events` - -Get container events from docker, in real time via streaming. - -Docker containers report the following events: - - attach, commit, copy, create, destroy, die, exec_create, exec_start, export, kill, oom, pause, rename, resize, restart, start, stop, top, unpause, update - -Docker images report the following events: - - delete, import, pull, push, tag, untag - -Docker volumes report the following events: - - create, mount, unmount, destroy - -Docker networks report the following events: - - create, connect, disconnect, destroy - -**Example request**: - - GET /v1.22/events?since=1374067924 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - Server: Docker/1.10.0 (linux) - Date: Fri, 29 Apr 2016 15:18:06 GMT - Transfer-Encoding: chunked - - { - "status": "pull", - "id": "alpine:latest", - "Type": "image", - "Action": "pull", - "Actor": { - "ID": "alpine:latest", - "Attributes": { - "name": "alpine" - } - }, - "time": 1461943101, - "timeNano": 1461943101301854122 - } - { - "status": "create", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "create", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101381709551 - } - { - "status": "attach", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "attach", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101383858412 - } - { - "Type": "network", - "Action": "connect", - "Actor": { - "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474", - "Attributes": { - "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "name": "bridge", - "type": "bridge" - } - }, - "time": 1461943101, - "timeNano": 1461943101394865557 - } - { - "status": "start", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "start", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101607533796 - } - { - "status": "resize", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "resize", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "height": "46", - "image": "alpine", - "name": "my-container", - "width": "204" - } - }, - "time": 1461943101, - "timeNano": 1461943101610269268 - } - { - "status": "die", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "die", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "exitCode": "0", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943105, - "timeNano": 1461943105079144137 - } - { - "Type": "network", - "Action": "disconnect", - "Actor": { - "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474", - "Attributes": { - "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "name": "bridge", - "type": "bridge" - } - }, - "time": 1461943105, - "timeNano": 1461943105230860245 - } - { - "status": "destroy", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "destroy", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943105, - "timeNano": 1461943105338056026 - } - -**Query parameters**: - -- **since** – Timestamp. Show all events created since timestamp and then stream -- **until** – Timestamp. Show events created until given timestamp and stop streaming -- **filters** – A json encoded value of the filters (a map[string][]string) to process on the event list. Available filters: - - `container=`; -- container to filter - - `event=`; -- event to filter - - `image=`; -- image to filter - - `label=`; -- image and container label to filter - - `type=`; -- either `container` or `image` or `volume` or `network` - - `volume=`; -- volume to filter - - `network=`; -- network to filter - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images in a repository - -`GET /images/(name)/get` - -Get a tarball containing all images and metadata for the repository specified -by `name`. - -If `name` is a specific name and tag (e.g. ubuntu:latest), then only that image -(and its parents) are returned. If `name` is an image ID, similarly only that -image (and its parents) are returned, but with the exclusion of the -'repositories' file in the tarball, as there were no image names referenced. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.22/images/ubuntu/get - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images - -`GET /images/get` - -Get a tarball containing all images and metadata for one or more repositories. - -For each value of the `names` parameter: if it is a specific name and tag (e.g. -`ubuntu:latest`), then only that image (and its parents) are returned; if it is -an image ID, similarly only that image (and its parents) are returned and there -would be no names referenced in the 'repositories' file for this image ID. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.22/images/get?names=myname%2Fmyapp%3Alatest&names=busybox - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Load a tarball with a set of images and tags into docker - -`POST /images/load` - -Load a set of images and tags into a Docker repository. -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - POST /v1.22/images/load - Content-Type: application/x-tar - - Tarball in body - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Image tarball format - -An image tarball contains one directory per image layer (named using its long ID), -each containing these files: - -- `VERSION`: currently `1.0` - the file format version -- `json`: detailed layer information, similar to `docker inspect layer_id` -- `layer.tar`: A tarfile containing the filesystem changes in this layer - -The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories -for storing attribute changes and deletions. - -If the tarball defines a repository, the tarball should also include a `repositories` file at -the root that contains a list of repository and tag names mapped to layer IDs. - -``` -{"hello-world": - {"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"} -} -``` - -#### Exec Create - -`POST /containers/(id or name)/exec` - -Sets up an exec instance in a running container `id` - -**Example request**: - - POST /v1.22/containers/e90e34656806/exec HTTP/1.1 - Content-Type: application/json - - { - "AttachStdin": true, - "AttachStdout": true, - "AttachStderr": true, - "Cmd": ["sh"], - "DetachKeys": "ctrl-p,ctrl-q", - "Privileged": true, - "Tty": true, - "User": "123:456" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id": "f90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **AttachStdin** - Boolean value, attaches to `stdin` of the `exec` command. -- **AttachStdout** - Boolean value, attaches to `stdout` of the `exec` command. -- **AttachStderr** - Boolean value, attaches to `stderr` of the `exec` command. -- **DetachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **Tty** - Boolean value to allocate a pseudo-TTY. -- **Cmd** - Command to run specified as a string or an array of strings. -- **Privileged** - Boolean value, runs the exec process with extended privileges. -- **User** - A string value specifying the user, and optionally, group to run - the exec process inside the container. Format is one of: `"user"`, - `"user:group"`, `"uid"`, or `"uid:gid"`. - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **409** - container is paused -- **500** - server error - -#### Exec Start - -`POST /exec/(id)/start` - -Starts a previously set up `exec` instance `id`. If `detach` is true, this API -returns after starting the `exec` command. Otherwise, this API sets up an -interactive session with the `exec` command. - -**Example request**: - - POST /v1.22/exec/e90e34656806/start HTTP/1.1 - Content-Type: application/json - - { - "Detach": false, - "Tty": false - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/vnd.docker.raw-stream - - {% raw %} - {{ STREAM }} - {% endraw %} - -**JSON parameters**: - -- **Detach** - Detach from the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **409** - container is paused - -**Stream details**: - -Similar to the stream behavior of `POST /containers/(id or name)/attach` API - -#### Exec Resize - -`POST /exec/(id)/resize` - -Resizes the `tty` session used by the `exec` command `id`. The unit is number of characters. -This API is valid only if `tty` was specified as part of creating and starting the `exec` command. - -**Example request**: - - POST /v1.22/exec/e90e34656806/resize?h=40&w=80 HTTP/1.1 - Content-Type: text/plain - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: text/plain - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **201** – no error -- **404** – no such exec instance - -#### Exec Inspect - -`GET /exec/(id)/json` - -Return low-level information about the `exec` command `id`. - -**Example request**: - - GET /v1.22/exec/11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "CanRemove": false, - "ContainerID": "b53ee82b53a40c7dca428523e34f741f3abc51d9f297a14ff874bf761b995126", - "DetachKeys": "", - "ExitCode": 2, - "ID": "f33bbfb39f5b142420f4759b2348913bd4a8d1a6d7fd56499cb41a1bb91d7b3b", - "OpenStderr": true, - "OpenStdin": true, - "OpenStdout": true, - "ProcessConfig": { - "arguments": [ - "-c", - "exit 2" - ], - "entrypoint": "sh", - "privileged": false, - "tty": true, - "user": "1000" - }, - "Running": false - } - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **500** - server error - -### 2.4 Volumes - -#### List volumes - -`GET /volumes` - -**Example request**: - - GET /v1.22/volumes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Volumes": [ - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis" - } - ], - "Warnings": [] - } - -**Query parameters**: - -- **filters** - JSON encoded value of the filters (a `map[string][]string`) to process on the volumes list. There is one available filter: `dangling=true` - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Create a volume - -`POST /volumes/create` - -Create a volume - -**Example request**: - - POST /v1.22/volumes/create HTTP/1.1 - Content-Type: application/json - - { - "Name": "tardis" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis" - } - -**Status codes**: - -- **201** - no error -- **500** - server error - -**JSON parameters**: - -- **Name** - The new volume's name. If not specified, Docker generates a name. -- **Driver** - Name of the volume driver to use. Defaults to `local` for the name. -- **DriverOpts** - A mapping of driver options and values. These options are - passed directly to the driver and are driver specific. - -#### Inspect a volume - -`GET /volumes/(name)` - -Return low-level information on the volume `name` - -**Example request**: - - GET /volumes/tardis - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis" - } - -**Status codes**: - -- **200** - no error -- **404** - no such volume -- **500** - server error - -#### Remove a volume - -`DELETE /volumes/(name)` - -Instruct the driver to remove the volume (`name`). - -**Example request**: - - DELETE /v1.22/volumes/tardis HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** - no error -- **404** - no such volume or volume driver -- **409** - volume is in use and cannot be removed -- **500** - server error - -### 2.5 Networks - -#### List networks - -`GET /networks` - -**Example request**: - - GET /v1.22/networks?filters={"type":{"custom":true}} HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -[ - { - "Name": "bridge", - "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566", - "Scope": "local", - "Driver": "bridge", - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.17.0.0/16" - } - ] - }, - "Containers": { - "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": { - "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda", - "MacAddress": "02:42:ac:11:00:02", - "IPv4Address": "172.17.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - } - }, - { - "Name": "none", - "Id": "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794", - "Scope": "local", - "Driver": "null", - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - }, - { - "Name": "host", - "Id": "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e", - "Scope": "local", - "Driver": "host", - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - } -] -``` - -**Query parameters**: - -- **filters** - JSON encoded network list filter. The filter value is one of: - - `id=` Matches all or part of a network id. - - `name=` Matches all or part of a network name. - - `type=["custom"|"builtin"]` Filters networks by type. The `custom` keyword returns all user-defined networks. - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Inspect network - -`GET /networks/` - -**Example request**: - - GET /v1.22/networks/7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99 HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -{ - "Name": "net01", - "Id": "7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99", - "Scope": "local", - "Driver": "bridge", - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.19.0.0/16", - "Gateway": "172.19.0.1/16" - } - ], - "Options": { - "foo": "bar" - } - }, - "Containers": { - "19a4d5d687db25203351ed79d478946f861258f018fe384f229f2efa4b23513c": { - "Name": "test", - "EndpointID": "628cadb8bcb92de107b2a1e516cbffe463e321f548feb37697cce00ad694f21a", - "MacAddress": "02:42:ac:13:00:02", - "IPv4Address": "172.19.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - } -} -``` - -**Status codes**: - -- **200** - no error -- **404** - network not found - -#### Create a network - -`POST /networks/create` - -Create a network - -**Example request**: - -``` -POST /v1.22/networks/create HTTP/1.1 -Content-Type: application/json - -{ - "Name":"isolated_nw", - "CheckDuplicate":true, - "Driver":"bridge", - "IPAM":{ - "Driver": "default", - "Config":[ - { - "Subnet":"172.20.0.0/16", - "IPRange":"172.20.10.0/24", - "Gateway":"172.20.10.11" - }, - { - "Subnet":"2001:db8:abcd::/64", - "Gateway":"2001:db8:abcd::1011" - } - ], - "Options": { - "foo": "bar" - } - }, - "Internal":true -} -``` - -**Example response**: - -``` -HTTP/1.1 201 Created -Content-Type: application/json - -{ - "Id": "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30", - "Warning": "" -} -``` - -**Status codes**: - -- **201** - no error -- **404** - plugin not found -- **500** - server error - -**JSON parameters**: - -- **Name** - The new network's name. this is a mandatory field -- **CheckDuplicate** - Requests daemon to check for networks with same name. Defaults to `false` -- **Driver** - Name of the network driver plugin to use. Defaults to `bridge` driver -- **IPAM** - Optional custom IP scheme for the network - - **Driver** - Name of the IPAM driver to use. Defaults to `default` driver - - **Config** - List of IPAM configuration options, specified as a map: - `{"Subnet": , "IPRange": , "Gateway": , "AuxAddress": }` - - **Options** - Driver-specific options, specified as a map: `{"option":"value" [,"option2":"value2"]}` -- **Options** - Network specific options to be used by the drivers - -#### Connect a container to a network - -`POST /networks/(id)/connect` - -Connect a container to a network - -**Example request**: - -``` -POST /v1.22/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/connect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4", - "EndpointConfig": { - "IPAMConfig": { - "IPv4Address":"172.24.56.89", - "IPv6Address":"2001:db8::5689" - } - } -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **404** - network or container is not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **container** - container-id/name to be connected to the network - -#### Disconnect a container from a network - -`POST /networks/(id)/disconnect` - -Disconnect a container from a network - -**Example request**: - -``` -POST /v1.22/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/disconnect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4", - "Force":false -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **404** - network or container not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **Container** - container-id/name to be disconnected from a network -- **Force** - Force the container to disconnect from a network - -#### Remove a network - -`DELETE /networks/(id)` - -Instruct the driver to remove the network (`id`). - -**Example request**: - - DELETE /v1.22/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **404** - no such network -- **500** - server error - -## 3. Going further - -### 3.1 Inside `docker run` - -As an example, the `docker run` command line makes the following API calls: - -- Create the container - -- If the status code is 404, it means the image doesn't exist: - - Try to pull it. - - Then, retry to create the container. - -- Start the container. - -- If you are not in detached mode: -- Attach to the container, using `logs=1` (to have `stdout` and - `stderr` from the container's start) and `stream=1` - -- If in detached mode or only `stdin` is attached, display the container's id. - -### 3.2 Hijacking - -In this version of the API, `/attach`, uses hijacking to transport `stdin`, -`stdout`, and `stderr` on the same socket. - -To hint potential proxies about connection hijacking, Docker client sends -connection upgrade headers similarly to websocket. - - Upgrade: tcp - Connection: Upgrade - -When Docker daemon detects the `Upgrade` header, it switches its status code -from **200 OK** to **101 UPGRADED** and resends the same headers. - - -### 3.3 CORS Requests - -To set cross origin requests to the Engine API please give values to -`--api-cors-header` when running Docker in daemon mode. Set * (asterisk) allows all, -default or blank means CORS disabled - - $ dockerd -H="192.168.1.9:2375" --api-cors-header="http://foo.bar" diff --git a/vendor/github.com/docker/docker/docs/api/v1.23.md b/vendor/github.com/docker/docker/docs/api/v1.23.md deleted file mode 100644 index e23811bb9..000000000 --- a/vendor/github.com/docker/docker/docs/api/v1.23.md +++ /dev/null @@ -1,3424 +0,0 @@ ---- -title: "Engine API v1.23" -description: "API Documentation for Docker" -keywords: "API, Docker, rcli, REST, documentation" -redirect_from: -- /engine/reference/api/docker_remote_api_v1.23/ -- /reference/api/docker_remote_api_v1.23/ ---- - - - -## 1. Brief introduction - - - The daemon listens on `unix:///var/run/docker.sock` but you can - [Bind Docker to another host/port or a Unix socket](../reference/commandline/dockerd.md#bind-docker-to-another-host-port-or-a-unix-socket). - - The API tends to be REST. However, for some complex commands, like `attach` - or `pull`, the HTTP connection is hijacked to transport `stdout`, - `stdin` and `stderr`. - - When the client API version is newer than the daemon's, these calls return an HTTP - `400 Bad Request` error message. - -## 2. Endpoints - -### 2.1 Containers - -#### List containers - -`GET /containers/json` - -List containers - -**Example request**: - - GET /v1.23/containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "8dfafdbc3a40", - "Names":["/boring_feynman"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 1", - "Created": 1367854155, - "State": "Exited", - "Status": "Exit 0", - "Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}], - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "2cdc4edb1ded3631c81f57966563e5c8525b81121bb3706a9a9a3ae102711f3f", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:02" - } - } - }, - "Mounts": [ - { - "Name": "fac362...80535", - "Source": "/data", - "Destination": "/data", - "Driver": "local", - "Mode": "ro,Z", - "RW": false, - "Propagation": "" - } - ] - }, - { - "Id": "9cd87474be90", - "Names":["/coolName"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 222222", - "Created": 1367854155, - "State": "Exited", - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "88eaed7b37b38c2a3f0c4bc796494fdf51b270c2d22656412a2ca5d559a64d7a", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.8", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:08" - } - } - }, - "Mounts": [] - }, - { - "Id": "3176a2479c92", - "Names":["/sleepy_dog"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 3333333333333333", - "Created": 1367854154, - "State": "Exited", - "Status": "Exit 0", - "Ports":[], - "Labels": {}, - "SizeRw":12288, - "SizeRootFs":0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "8b27c041c30326d59cd6e6f510d4f8d1d570a228466f956edf7815508f78e30d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.6", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:06" - } - } - }, - "Mounts": [] - }, - { - "Id": "4cb07b47f9fb", - "Names":["/running_cat"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 444444444444444444444444444444444", - "Created": 1367854152, - "State": "Exited", - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "d91c7b2f0644403d7ef3095985ea0e2370325cd2332ff3a3225c4247328e66e9", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.5", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:05" - } - } - }, - "Mounts": [] - } - ] - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, Show all containers. - Only running containers are shown by default (i.e., this defaults to false) -- **limit** – Show `limit` last created - containers, include non-running ones. -- **since** – Show only containers created since Id, include - non-running ones. -- **before** – Show only containers created before Id, include - non-running ones. -- **size** – 1/True/true or 0/False/false, Show the containers - sizes -- **filters** - a JSON encoded value of the filters (a `map[string][]string`) to process on the containers list. Available filters: - - `exited=`; -- containers with exit code of `` ; - - `status=`(`created`|`restarting`|`running`|`paused`|`exited`|`dead`) - - `label=key` or `label="key=value"` of a container label - - `isolation=`(`default`|`process`|`hyperv`) (Windows daemon only) - - `ancestor`=(`[:]`, `` or ``) - - `before`=(`` or ``) - - `since`=(`` or ``) - - `volume`=(`` or ``) - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **500** – server error - -#### Create a container - -`POST /containers/create` - -Create a container - -**Example request**: - - POST /v1.23/containers/create HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "FOO=bar", - "BAZ=quux" - ], - "Cmd": [ - "date" - ], - "Entrypoint": "", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "StopSignal": "SIGTERM", - "HostConfig": { - "Binds": ["/tmp:/tmp"], - "Tmpfs": { "/run": "rw,noexec,nosuid,size=65536k" }, - "Links": ["redis3:redis"], - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0,1", - "BlkioWeight": 300, - "BlkioWeightDevice": [{}], - "BlkioDeviceReadBps": [{}], - "BlkioDeviceReadIOps": [{}], - "BlkioDeviceWriteBps": [{}], - "BlkioDeviceWriteIOps": [{}], - "MemorySwappiness": 60, - "OomKillDisable": false, - "OomScoreAdj": 500, - "PidMode": "", - "PidsLimit": -1, - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsOptions": [""], - "DnsSearch": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "GroupAdd": ["newgroup"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "NetworkMode": "bridge", - "Devices": [], - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [], - "CgroupParent": "", - "VolumeDriver": "", - "ShmSize": 67108864 - }, - "NetworkingConfig": { - "EndpointsConfig": { - "isolated_nw" : { - "IPAMConfig": { - "IPv4Address":"172.20.30.33", - "IPv6Address":"2001:db8:abcd::3033" - }, - "Links":["container_1", "container_2"], - "Aliases":["server_x", "server_y"] - } - } - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id":"e90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **Hostname** - A string value containing the hostname to use for the - container. -- **Domainname** - A string value containing the domain name to use - for the container. -- **User** - A string value specifying the user inside the container. -- **AttachStdin** - Boolean value, attaches to `stdin`. -- **AttachStdout** - Boolean value, attaches to `stdout`. -- **AttachStderr** - Boolean value, attaches to `stderr`. -- **Tty** - Boolean value, Attach standard streams to a `tty`, including `stdin` if it is not closed. -- **OpenStdin** - Boolean value, opens `stdin`, -- **StdinOnce** - Boolean value, close `stdin` after the 1 attached client disconnects. -- **Env** - A list of environment variables in the form of `["VAR=value", ...]` -- **Labels** - Adds a map of labels to a container. To specify a map: `{"key":"value", ... }` -- **Cmd** - Command to run specified as a string or an array of strings. -- **Entrypoint** - Set the entry point for the container as a string or an array - of strings. -- **Image** - A string specifying the image name to use for the container. -- **Volumes** - An object mapping mount point paths (strings) inside the - container to empty objects. -- **WorkingDir** - A string specifying the working directory for commands to - run in. -- **NetworkDisabled** - Boolean value, when true disables networking for the - container -- **ExposedPorts** - An object mapping ports to an empty object in the form of: - `"ExposedPorts": { "/: {}" }` -- **StopSignal** - Signal to stop a container as a string or unsigned integer. `SIGTERM` by default. -- **HostConfig** - - **Binds** – A list of volume bindings for this container. Each volume binding is a string in one of these forms: - + `host-src:container-dest` to bind-mount a host path into the - container. Both `host-src`, and `container-dest` must be an - _absolute_ path. - + `host-src:container-dest:ro` to make the bind-mount read-only - inside the container. Both `host-src`, and `container-dest` must be - an _absolute_ path. - + `volume-name:container-dest` to bind-mount a volume managed by a - volume driver into the container. `container-dest` must be an - _absolute_ path. - + `volume-name:container-dest:ro` to mount the volume read-only - inside the container. `container-dest` must be an _absolute_ path. - - **Tmpfs** – A map of container directories which should be replaced by tmpfs mounts, and their corresponding - mount options. A JSON object in the form `{ "/run": "rw,noexec,nosuid,size=65536k" }`. - - **Links** - A list of links for the container. Each link entry should be - in the form of `container_name:alias`. - - **Memory** - Memory limit in bytes. - - **MemorySwap** - Total memory limit (memory + swap); set `-1` to enable unlimited swap. - You must use this with `memory` and make the swap value larger than `memory`. - - **MemoryReservation** - Memory soft limit in bytes. - - **KernelMemory** - Kernel memory limit in bytes. - - **CpuShares** - An integer value containing the container's CPU Shares - (ie. the relative weight vs other containers). - - **CpuPeriod** - The length of a CPU period in microseconds. - - **CpuQuota** - Microseconds of CPU time that the container can get in a CPU period. - - **CpusetCpus** - String value containing the `cgroups CpusetCpus` to use. - - **CpusetMems** - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - - **BlkioWeight** - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - - **BlkioWeightDevice** - Block IO weight (relative device weight) in the form of: `"BlkioWeightDevice": [{"Path": "device_path", "Weight": weight}]` - - **BlkioDeviceReadBps** - Limit read rate (bytes per second) from a device in the form of: `"BlkioDeviceReadBps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceReadBps": [{"Path": "/dev/sda", "Rate": "1024"}]"` - - **BlkioDeviceWriteBps** - Limit write rate (bytes per second) to a device in the form of: `"BlkioDeviceWriteBps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceWriteBps": [{"Path": "/dev/sda", "Rate": "1024"}]"` - - **BlkioDeviceReadIOps** - Limit read rate (IO per second) from a device in the form of: `"BlkioDeviceReadIOps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceReadIOps": [{"Path": "/dev/sda", "Rate": "1000"}]` - - **BlkioDeviceWiiteIOps** - Limit write rate (IO per second) to a device in the form of: `"BlkioDeviceWriteIOps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceWriteIOps": [{"Path": "/dev/sda", "Rate": "1000"}]` - - **MemorySwappiness** - Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100. - - **OomKillDisable** - Boolean value, whether to disable OOM Killer for the container or not. - - **OomScoreAdj** - An integer value containing the score given to the container in order to tune OOM killer preferences. - - **PidMode** - Set the PID (Process) Namespace mode for the container; - `"container:"`: joins another container's PID namespace - `"host"`: use the host's PID namespace inside the container - - **PidsLimit** - Tune a container's pids limit. Set -1 for unlimited. - - **PortBindings** - A map of exposed container ports and the host port they - should map to. A JSON object in the form - `{ /: [{ "HostPort": "" }] }` - Take note that `port` is specified as a string and not an integer value. - - **PublishAllPorts** - Allocates a random host port for all of a container's - exposed ports. Specified as a boolean value. - - **Privileged** - Gives the container full access to the host. Specified as - a boolean value. - - **ReadonlyRootfs** - Mount the container's root filesystem as read only. - Specified as a boolean value. - - **Dns** - A list of DNS servers for the container to use. - - **DnsOptions** - A list of DNS options - - **DnsSearch** - A list of DNS search domains - - **ExtraHosts** - A list of hostnames/IP mappings to add to the - container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`. - - **VolumesFrom** - A list of volumes to inherit from another container. - Specified in the form `[:]` - - **CapAdd** - A list of kernel capabilities to add to the container. - - **Capdrop** - A list of kernel capabilities to drop from the container. - - **GroupAdd** - A list of additional groups that the container process will run as - - **RestartPolicy** – The behavior to apply when the container exits. The - value is an object with a `Name` property of either `"always"` to - always restart, `"unless-stopped"` to restart always except when - user has manually stopped the container or `"on-failure"` to restart only when the container - exit code is non-zero. If `on-failure` is used, `MaximumRetryCount` - controls the number of times to retry before giving up. - The default is not to restart. (optional) - An ever increasing delay (double the previous delay, starting at 100mS) - is added before each restart to prevent flooding the server. - - **UsernsMode** - Sets the usernamespace mode for the container when usernamespace remapping option is enabled. - supported values are: `host`. - - **NetworkMode** - Sets the networking mode for the container. Supported - standard values are: `bridge`, `host`, `none`, and `container:`. Any other value is taken - as a custom network's name to which this container should connect to. - - **Devices** - A list of devices to add to the container specified as a JSON object in the - form - `{ "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}` - - **Ulimits** - A list of ulimits to set in the container, specified as - `{ "Name": , "Soft": , "Hard": }`, for example: - `Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }` - - **SecurityOpt**: A list of string values to customize labels for MLS - systems, such as SELinux. - - **LogConfig** - Log configuration for the container, specified as a JSON object in the form - `{ "Type": "", "Config": {"key1": "val1"}}`. - Available types: `json-file`, `syslog`, `journald`, `gelf`, `fluentd`, `awslogs`, `splunk`, `etwlogs`, `none`. - `json-file` logging driver. - - **CgroupParent** - Path to `cgroups` under which the container's `cgroup` is created. If the path is not absolute, the path is considered to be relative to the `cgroups` path of the init process. Cgroups are created if they do not already exist. - - **VolumeDriver** - Driver that this container users to mount volumes. - - **ShmSize** - Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB. - -**Query parameters**: - -- **name** – Assign the specified name to the container. Must - match `/?[a-zA-Z0-9_-]+`. - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such container -- **406** – impossible to attach (container not running) -- **409** – conflict -- **500** – server error - -#### Inspect a container - -`GET /containers/(id or name)/json` - -Return low-level information on the container `id` - -**Example request**: - - GET /v1.23/containers/4fa6e0f0c678/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "AppArmorProfile": "", - "Args": [ - "-c", - "exit 9" - ], - "Config": { - "AttachStderr": true, - "AttachStdin": false, - "AttachStdout": true, - "Cmd": [ - "/bin/sh", - "-c", - "exit 9" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts": null, - "Hostname": "ba033ac44011", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "MacAddress": "", - "NetworkDisabled": false, - "OnBuild": null, - "OpenStdin": false, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "StopSignal": "SIGTERM" - }, - "Created": "2015-01-06T15:47:31.485331387Z", - "Driver": "devicemapper", - "ExecIDs": null, - "HostConfig": { - "Binds": null, - "BlkioWeight": 0, - "BlkioWeightDevice": [{}], - "BlkioDeviceReadBps": [{}], - "BlkioDeviceWriteBps": [{}], - "BlkioDeviceReadIOps": [{}], - "BlkioDeviceWriteIOps": [{}], - "CapAdd": null, - "CapDrop": null, - "ContainerIDFile": "", - "CpusetCpus": "", - "CpusetMems": "", - "CpuShares": 0, - "CpuPeriod": 100000, - "Devices": [], - "Dns": null, - "DnsOptions": null, - "DnsSearch": null, - "ExtraHosts": null, - "IpcMode": "", - "Links": null, - "LxcConf": [], - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "OomKillDisable": false, - "OomScoreAdj": 500, - "NetworkMode": "bridge", - "PidMode": "", - "PortBindings": {}, - "Privileged": false, - "ReadonlyRootfs": false, - "PublishAllPorts": false, - "RestartPolicy": { - "MaximumRetryCount": 2, - "Name": "on-failure" - }, - "LogConfig": { - "Config": null, - "Type": "json-file" - }, - "SecurityOpt": null, - "VolumesFrom": null, - "Ulimits": [{}], - "VolumeDriver": "", - "ShmSize": 67108864 - }, - "HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname", - "HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39", - "Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2", - "MountLabel": "", - "Name": "/boring_euclid", - "NetworkSettings": { - "Bridge": "", - "SandboxID": "", - "HairpinMode": false, - "LinkLocalIPv6Address": "", - "LinkLocalIPv6PrefixLen": 0, - "Ports": null, - "SandboxKey": "", - "SecondaryIPAddresses": null, - "SecondaryIPv6Addresses": null, - "EndpointID": "", - "Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "IPAddress": "", - "IPPrefixLen": 0, - "IPv6Gateway": "", - "MacAddress": "", - "Networks": { - "bridge": { - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:12:00:02" - } - } - }, - "Path": "/bin/sh", - "ProcessLabel": "", - "ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf", - "RestartCount": 1, - "State": { - "Error": "", - "ExitCode": 9, - "FinishedAt": "2015-01-06T15:47:32.080254511Z", - "OOMKilled": false, - "Dead": false, - "Paused": false, - "Pid": 0, - "Restarting": false, - "Running": true, - "StartedAt": "2015-01-06T15:47:32.072697474Z", - "Status": "running" - }, - "Mounts": [ - { - "Name": "fac362...80535", - "Source": "/data", - "Destination": "/data", - "Driver": "local", - "Mode": "ro,Z", - "RW": false, - "Propagation": "" - } - ] - } - -**Example request, with size information**: - - GET /v1.23/containers/4fa6e0f0c678/json?size=1 HTTP/1.1 - -**Example response, with size information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - .... - "SizeRw": 0, - "SizeRootFs": 972, - .... - } - -**Query parameters**: - -- **size** – 1/True/true or 0/False/false, return container size information. Default is `false`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### List processes running inside a container - -`GET /containers/(id or name)/top` - -List processes running inside the container `id`. On Unix systems this -is done by running the `ps` command. This endpoint is not -supported on Windows. - -**Example request**: - - GET /v1.23/containers/4fa6e0f0c678/top HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "UID", "PID", "PPID", "C", "STIME", "TTY", "TIME", "CMD" - ], - "Processes" : [ - [ - "root", "13642", "882", "0", "17:03", "pts/0", "00:00:00", "/bin/bash" - ], - [ - "root", "13735", "13642", "0", "17:06", "pts/0", "00:00:00", "sleep 10" - ] - ] - } - -**Example request**: - - GET /v1.23/containers/4fa6e0f0c678/top?ps_args=aux HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "USER","PID","%CPU","%MEM","VSZ","RSS","TTY","STAT","START","TIME","COMMAND" - ] - "Processes" : [ - [ - "root","13642","0.0","0.1","18172","3184","pts/0","Ss","17:03","0:00","/bin/bash" - ], - [ - "root","13895","0.0","0.0","4348","692","pts/0","S+","17:15","0:00","sleep 10" - ] - ], - } - -**Query parameters**: - -- **ps_args** – `ps` arguments to use (e.g., `aux`), defaults to `-ef` - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container logs - -`GET /containers/(id or name)/logs` - -Get `stdout` and `stderr` logs from the container ``id`` - -> **Note**: -> This endpoint works only for containers with the `json-file` or `journald` logging drivers. - -**Example request**: - - GET /v1.23/containers/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **follow** – 1/True/true or 0/False/false, return stream. Default `false`. -- **stdout** – 1/True/true or 0/False/false, show `stdout` log. Default `false`. -- **stderr** – 1/True/true or 0/False/false, show `stderr` log. Default `false`. -- **since** – UNIX timestamp (integer) to filter logs. Specifying a timestamp - will only output log-entries since that timestamp. Default: 0 (unfiltered) -- **timestamps** – 1/True/true or 0/False/false, print timestamps for - every log line. Default `false`. -- **tail** – Output specified number of lines at the end of logs: `all` or ``. Default all. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **404** – no such container -- **500** – server error - -#### Inspect changes on a container's filesystem - -`GET /containers/(id or name)/changes` - -Inspect changes on container `id`'s filesystem - -**Example request**: - - GET /v1.23/containers/4fa6e0f0c678/changes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Path": "/dev", - "Kind": 0 - }, - { - "Path": "/dev/kmsg", - "Kind": 1 - }, - { - "Path": "/test", - "Kind": 1 - } - ] - -Values for `Kind`: - -- `0`: Modify -- `1`: Add -- `2`: Delete - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Export a container - -`GET /containers/(id or name)/export` - -Export the contents of container `id` - -**Example request**: - - GET /v1.23/containers/4fa6e0f0c678/export HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/octet-stream - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container stats based on resource usage - -`GET /containers/(id or name)/stats` - -This endpoint returns a live stream of a container's resource usage statistics. - -**Example request**: - - GET /v1.23/containers/redis1/stats HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "read" : "2015-01-08T22:57:31.547920715Z", - "pids_stats": { - "current": 3 - }, - "networks": { - "eth0": { - "rx_bytes": 5338, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 36, - "tx_bytes": 648, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 8 - }, - "eth5": { - "rx_bytes": 4641, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 26, - "tx_bytes": 690, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 9 - } - }, - "memory_stats" : { - "stats" : { - "total_pgmajfault" : 0, - "cache" : 0, - "mapped_file" : 0, - "total_inactive_file" : 0, - "pgpgout" : 414, - "rss" : 6537216, - "total_mapped_file" : 0, - "writeback" : 0, - "unevictable" : 0, - "pgpgin" : 477, - "total_unevictable" : 0, - "pgmajfault" : 0, - "total_rss" : 6537216, - "total_rss_huge" : 6291456, - "total_writeback" : 0, - "total_inactive_anon" : 0, - "rss_huge" : 6291456, - "hierarchical_memory_limit" : 67108864, - "total_pgfault" : 964, - "total_active_file" : 0, - "active_anon" : 6537216, - "total_active_anon" : 6537216, - "total_pgpgout" : 414, - "total_cache" : 0, - "inactive_anon" : 0, - "active_file" : 0, - "pgfault" : 964, - "inactive_file" : 0, - "total_pgpgin" : 477 - }, - "max_usage" : 6651904, - "usage" : 6537216, - "failcnt" : 0, - "limit" : 67108864 - }, - "blkio_stats" : {}, - "cpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24472255, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100215355, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 739306590000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - }, - "precpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24350896, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100093996, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 9492140000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - } - } - -The precpu_stats is the cpu statistic of last read, which is used for calculating the cpu usage percent. It is not the exact copy of the “cpu_stats” field. - -**Query parameters**: - -- **stream** – 1/True/true or 0/False/false, pull stats once then disconnect. Default `true`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Resize a container TTY - -`POST /containers/(id or name)/resize` - -Resize the TTY for container with `id`. The unit is number of characters. You must restart the container for the resize to take effect. - -**Example request**: - - POST /v1.23/containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **200** – no error -- **404** – No such container -- **500** – Cannot resize container - -#### Start a container - -`POST /containers/(id or name)/start` - -Start the container `id` - -> **Note**: -> For backwards compatibility, this endpoint accepts a `HostConfig` as JSON-encoded request body. -> See [create a container](#create-a-container) for details. - -**Example request**: - - POST /v1.23/containers/e90e34656806/start HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**Status codes**: - -- **204** – no error -- **304** – container already started -- **404** – no such container -- **500** – server error - -#### Stop a container - -`POST /containers/(id or name)/stop` - -Stop the container `id` - -**Example request**: - - POST /v1.23/containers/e90e34656806/stop?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **304** – container already stopped -- **404** – no such container -- **500** – server error - -#### Restart a container - -`POST /containers/(id or name)/restart` - -Restart the container `id` - -**Example request**: - - POST /v1.23/containers/e90e34656806/restart?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Kill a container - -`POST /containers/(id or name)/kill` - -Kill the container `id` - -**Example request**: - - POST /v1.23/containers/e90e34656806/kill HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **signal** - Signal to send to the container: integer or string like `SIGINT`. - When not set, `SIGKILL` is assumed and the call waits for the container to exit. - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Update a container - -`POST /containers/(id or name)/update` - -Update configuration of one or more containers. - -**Example request**: - - POST /v1.23/containers/e90e34656806/update HTTP/1.1 - Content-Type: application/json - - { - "BlkioWeight": 300, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0", - "Memory": 314572800, - "MemorySwap": 514288000, - "MemoryReservation": 209715200, - "KernelMemory": 52428800, - "RestartPolicy": { - "MaximumRetryCount": 4, - "Name": "on-failure" - }, - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Warnings": [] - } - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -#### Rename a container - -`POST /containers/(id or name)/rename` - -Rename the container `id` to a `new_name` - -**Example request**: - - POST /v1.23/containers/e90e34656806/rename?name=new_name HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **name** – new name for the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **409** - conflict name already assigned -- **500** – server error - -#### Pause a container - -`POST /containers/(id or name)/pause` - -Pause the container `id` - -**Example request**: - - POST /v1.23/containers/e90e34656806/pause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Unpause a container - -`POST /containers/(id or name)/unpause` - -Unpause the container `id` - -**Example request**: - - POST /v1.23/containers/e90e34656806/unpause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Attach to a container - -`POST /containers/(id or name)/attach` - -Attach to the container `id` - -**Example request**: - - POST /v1.23/containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **400** – bad parameter -- **404** – no such container -- **409** - container is paused -- **500** – server error - -**Stream details**: - -When using the TTY setting is enabled in -[`POST /containers/create` -](#create-a-container), -the stream is the raw data from the process PTY and client's `stdin`. -When the TTY is disabled, then the stream is multiplexed to separate -`stdout` and `stderr`. - -The format is a **Header** and a **Payload** (frame). - -**HEADER** - -The header contains the information which the stream writes (`stdout` or -`stderr`). It also contains the size of the associated frame encoded in the -last four bytes (`uint32`). - -It is encoded on the first eight bytes like this: - - header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4} - -`STREAM_TYPE` can be: - -- 0: `stdin` (is written on `stdout`) -- 1: `stdout` -- 2: `stderr` - -`SIZE1, SIZE2, SIZE3, SIZE4` are the four bytes of -the `uint32` size encoded as big endian. - -**PAYLOAD** - -The payload is the raw stream. - -**IMPLEMENTATION** - -The simplest way to implement the Attach protocol is the following: - - 1. Read eight bytes. - 2. Choose `stdout` or `stderr` depending on the first byte. - 3. Extract the frame size from the last four bytes. - 4. Read the extracted size and output it on the correct output. - 5. Goto 1. - -#### Attach to a container (websocket) - -`GET /containers/(id or name)/attach/ws` - -Attach to the container `id` via websocket - -Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455) - -**Example request** - - GET /v1.23/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1 - -**Example response** - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -#### Wait a container - -`POST /containers/(id or name)/wait` - -Block until container `id` stops, then returns the exit code - -**Example request**: - - POST /v1.23/containers/16253994b7c4/wait HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"StatusCode": 0} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Remove a container - -`DELETE /containers/(id or name)` - -Remove the container `id` from the filesystem - -**Example request**: - - DELETE /v1.23/containers/16253994b7c4?v=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **v** – 1/True/true or 0/False/false, Remove the volumes - associated to the container. Default `false`. -- **force** - 1/True/true or 0/False/false, Kill then remove the container. - Default `false`. - -**Status codes**: - -- **204** – no error -- **400** – bad parameter -- **404** – no such container -- **409** – conflict -- **500** – server error - -#### Copy files or folders from a container - -`POST /containers/(id or name)/copy` - -Copy files or folders of container `id` - -**Deprecated** in favor of the `archive` endpoint below. - -**Example request**: - - POST /v1.23/containers/4fa6e0f0c678/copy HTTP/1.1 - Content-Type: application/json - - { - "Resource": "test.txt" - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Retrieving information about files and folders in a container - -`HEAD /containers/(id or name)/archive` - -See the description of the `X-Docker-Container-Path-Stat` header in the -following section. - -#### Get an archive of a filesystem resource in a container - -`GET /containers/(id or name)/archive` - -Get a tar archive of a resource in the filesystem of container `id`. - -**Query parameters**: - -- **path** - resource in the container's filesystem to archive. Required. - - If not an absolute path, it is relative to the container's root directory. - The resource specified by **path** must exist. To assert that the resource - is expected to be a directory, **path** should end in `/` or `/.` - (assuming a path separator of `/`). If **path** ends in `/.` then this - indicates that only the contents of the **path** directory should be - copied. A symlink is always resolved to its target. - - > **Note**: It is not possible to copy certain system files such as resources - > under `/proc`, `/sys`, `/dev`, and mounts created by the user in the - > container. - -**Example request**: - - GET /v1.23/containers/8cce319429b2/archive?path=/root HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - X-Docker-Container-Path-Stat: eyJuYW1lIjoicm9vdCIsInNpemUiOjQwOTYsIm1vZGUiOjIxNDc0ODQwOTYsIm10aW1lIjoiMjAxNC0wMi0yN1QyMDo1MToyM1oiLCJsaW5rVGFyZ2V0IjoiIn0= - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -On success, a response header `X-Docker-Container-Path-Stat` will be set to a -base64-encoded JSON object containing some filesystem header information about -the archived resource. The above example value would decode to the following -JSON object (whitespace added for readability): - -```json -{ - "name": "root", - "size": 4096, - "mode": 2147484096, - "mtime": "2014-02-27T20:51:23Z", - "linkTarget": "" -} -``` - -A `HEAD` request can also be made to this endpoint if only this information is -desired. - -**Status codes**: - -- **200** - success, returns archive of copied resource -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** was asserted to be a directory but exists as a - file) -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** does not exist) -- **500** - server error - -#### Extract an archive of files or folders to a directory in a container - -`PUT /containers/(id or name)/archive` - -Upload a tar archive to be extracted to a path in the filesystem of container -`id`. - -**Query parameters**: - -- **path** - path to a directory in the container - to extract the archive's contents into. Required. - - If not an absolute path, it is relative to the container's root directory. - The **path** resource must exist. -- **noOverwriteDirNonDir** - If "1", "true", or "True" then it will be an error - if unpacking the given content would cause an existing directory to be - replaced with a non-directory and vice versa. - -**Example request**: - - PUT /v1.23/containers/8cce319429b2/archive?path=/vol1 HTTP/1.1 - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – the content was extracted successfully -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** should be a directory but exists as a file) - - unable to overwrite existing directory with non-directory - (if **noOverwriteDirNonDir**) - - unable to overwrite existing non-directory with directory - (if **noOverwriteDirNonDir**) -- **403** - client error, permission denied, the volume - or container rootfs is marked as read-only. -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** resource does not exist) -- **500** – server error - -### 2.2 Images - -#### List Images - -`GET /images/json` - -**Example request**: - - GET /v1.23/images/json?all=0 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "RepoTags": [ - "ubuntu:12.04", - "ubuntu:precise", - "ubuntu:latest" - ], - "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c", - "Created": 1365714795, - "Size": 131506275, - "VirtualSize": 131506275, - "Labels": {} - }, - { - "RepoTags": [ - "ubuntu:12.10", - "ubuntu:quantal" - ], - "ParentId": "27cf784147099545", - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Created": 1364102658, - "Size": 24653, - "VirtualSize": 180116135, - "Labels": { - "com.example.version": "v1" - } - } - ] - -**Example request, with digest information**: - - GET /v1.23/images/json?digests=1 HTTP/1.1 - -**Example response, with digest information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Created": 1420064636, - "Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125", - "ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2", - "RepoDigests": [ - "localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags": [ - "localhost:5000/test/busybox:latest", - "playdate:latest" - ], - "Size": 0, - "VirtualSize": 2429728, - "Labels": {} - } - ] - -The response shows a single image `Id` associated with two repositories -(`RepoTags`): `localhost:5000/test/busybox`: and `playdate`. A caller can use -either of the `RepoTags` values `localhost:5000/test/busybox:latest` or -`playdate:latest` to reference the image. - -You can also use `RepoDigests` values to reference an image. In this response, -the array has only one reference and that is to the -`localhost:5000/test/busybox` repository; the `playdate` repository has no -digest. You can reference this digest using the value: -`localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...` - -See the `docker run` and `docker build` commands for examples of digest and tag -references on the command line. - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, default false -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `dangling=true` - - `label=key` or `label="key=value"` of an image label -- **filter** - only return images with the specified name - -#### Build image from a Dockerfile - -`POST /build` - -Build an image from a Dockerfile - -**Example request**: - - POST /v1.23/build HTTP/1.1 - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"stream": "Step 1/5..."} - {"stream": "..."} - {"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}} - -The input stream must be a `tar` archive compressed with one of the -following algorithms: `identity` (no compression), `gzip`, `bzip2`, `xz`. - -The archive must include a build instructions file, typically called -`Dockerfile` at the archive's root. The `dockerfile` parameter may be -used to specify a different build instructions file. To do this, its value must be -the path to the alternate build instructions file to use. - -The archive may include any number of other files, -which are accessible in the build context (See the [*ADD build -command*](../reference/builder.md#add)). - -The Docker daemon performs a preliminary validation of the `Dockerfile` before -starting the build, and returns an error if the syntax is incorrect. After that, -each instruction is run one-by-one until the ID of the new image is output. - -The build is canceled if the client drops the connection by quitting -or being killed. - -**Query parameters**: - -- **dockerfile** - Path within the build context to the `Dockerfile`. This is - ignored if `remote` is specified and points to an external `Dockerfile`. -- **t** – A name and optional tag to apply to the image in the `name:tag` format. - If you omit the `tag` the default `latest` value is assumed. - You can provide one or more `t` parameters. -- **remote** – A Git repository URI or HTTP/HTTPS context URI. If the - URI points to a single text file, the file's contents are placed into - a file called `Dockerfile` and the image is built from that file. If - the URI points to a tarball, the file is downloaded by the daemon and - the contents therein used as the context for the build. If the URI - points to a tarball and the `dockerfile` parameter is also specified, - there must be a file with the corresponding path inside the tarball. -- **q** – Suppress verbose build output. -- **nocache** – Do not use the cache when building the image. -- **pull** - Attempt to pull the image even if an older image exists locally. -- **rm** - Remove intermediate containers after a successful build (default behavior). -- **forcerm** - Always remove intermediate containers (includes `rm`). -- **memory** - Set memory limit for build. -- **memswap** - Total memory (memory + swap), `-1` to enable unlimited swap. -- **cpushares** - CPU shares (relative weight). -- **cpusetcpus** - CPUs in which to allow execution (e.g., `0-3`, `0,1`). -- **cpuperiod** - The length of a CPU period in microseconds. -- **cpuquota** - Microseconds of CPU time that the container can get in a CPU period. -- **buildargs** – JSON map of string pairs for build-time variables. Users pass - these values at build-time. Docker uses the `buildargs` as the environment - context for command(s) run via the Dockerfile's `RUN` instruction or for - variable expansion in other Dockerfile instructions. This is not meant for - passing secret values. [Read more about the buildargs instruction](../reference/builder.md#arg) -- **shmsize** - Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB. -- **labels** – JSON map of string pairs for labels to set on the image. - -**Request Headers**: - -- **Content-type** – Set to `"application/tar"`. -- **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON - object with the following structure: - - { - "docker.example.com": { - "username": "janedoe", - "password": "hunter2" - }, - "https://index.docker.io/v1/": { - "username": "mobydock", - "password": "conta1n3rize14" - } - } - - This object maps the hostname of a registry to an object containing the - "username" and "password" for that registry. Multiple registries may - be specified as the build may be based on an image requiring - authentication to pull from any arbitrary registry. Only the registry - domain name (and port if not the default "443") are required. However - (for legacy reasons) the "official" Docker, Inc. hosted registry must - be specified with both a "https://" prefix and a "/v1/" suffix even - though Docker will prefer to use the v2 registry API. - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Create an image - -`POST /images/create` - -Create an image either by pulling it from the registry or by importing it - -**Example request**: - - POST /v1.23/images/create?fromImage=busybox&tag=latest HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pulling..."} - {"status": "Pulling", "progress": "1 B/ 100 B", "progressDetail": {"current": 1, "total": 100}} - {"error": "Invalid..."} - ... - -When using this endpoint to pull an image from the registry, the -`X-Registry-Auth` header can be used to include -a base64-encoded AuthConfig object. - -**Query parameters**: - -- **fromImage** – Name of the image to pull. The name may include a tag or - digest. This parameter may only be used when pulling an image. - The pull is cancelled if the HTTP connection is closed. -- **fromSrc** – Source to import. The value may be a URL from which the image - can be retrieved or `-` to read the image from the request body. - This parameter may only be used when importing an image. -- **repo** – Repository name given to an image when it is imported. - The repo may include a tag. This parameter may only be used when importing - an image. -- **tag** – Tag or digest. If empty when pulling an image, this causes all tags - for the given image to be pulled. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either login information, or a token - - Credential based login: - - ``` - { - "username": "jdoe", - "password": "secret", - "email": "jdoe@acme.com" - } - ``` - - - Token based login: - - ``` - { - "identitytoken": "9cbaf023786cd7..." - } - ``` - -**Status codes**: - -- **200** – no error -- **404** - repository does not exist or no read access -- **500** – server error - - - -#### Inspect an image - -`GET /images/(name)/json` - -Return low-level information on the image `name` - -**Example request**: - - GET /v1.23/images/example/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Id" : "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c", - "Container" : "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a", - "Comment" : "", - "Os" : "linux", - "Architecture" : "amd64", - "Parent" : "sha256:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "ContainerConfig" : { - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Domainname" : "", - "AttachStdout" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "StdinOnce" : false, - "NetworkDisabled" : false, - "OnBuild" : [], - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "User" : "", - "WorkingDir" : "", - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "Labels" : { - "com.example.license" : "GPL", - "com.example.version" : "1.0", - "com.example.vendor" : "Acme" - }, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts" : null, - "Cmd" : [ - "/bin/sh", - "-c", - "#(nop) LABEL com.example.vendor=Acme com.example.license=GPL com.example.version=1.0" - ] - }, - "DockerVersion" : "1.9.0-dev", - "VirtualSize" : 188359297, - "Size" : 0, - "Author" : "", - "Created" : "2015-09-10T08:30:53.26995814Z", - "GraphDriver" : { - "Name" : "aufs", - "Data" : null - }, - "RepoDigests" : [ - "localhost:5000/test/busybox/example@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags" : [ - "example:1.0", - "example:latest", - "example:stable" - ], - "Config" : { - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "NetworkDisabled" : false, - "OnBuild" : [], - "StdinOnce" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "Domainname" : "", - "AttachStdout" : false, - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Cmd" : [ - "/bin/bash" - ], - "ExposedPorts" : null, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "Labels" : { - "com.example.vendor" : "Acme", - "com.example.version" : "1.0", - "com.example.license" : "GPL" - }, - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "WorkingDir" : "", - "User" : "" - }, - "RootFS": { - "Type": "layers", - "Layers": [ - "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6", - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" - ] - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Get the history of an image - -`GET /images/(name)/history` - -Return the history of the image `name` - -**Example request**: - - GET /v1.23/images/ubuntu/history HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710", - "Created": 1398108230, - "CreatedBy": "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /", - "Tags": [ - "ubuntu:lucid", - "ubuntu:10.04" - ], - "Size": 182964289, - "Comment": "" - }, - { - "Id": "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8", - "Created": 1398108222, - "CreatedBy": "/bin/sh -c #(nop) MAINTAINER Tianon Gravi - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/", - "Tags": null, - "Size": 0, - "Comment": "" - }, - { - "Id": "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158", - "Created": 1371157430, - "CreatedBy": "", - "Tags": [ - "scratch12:latest", - "scratch:latest" - ], - "Size": 0, - "Comment": "Imported from -" - } - ] - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Push an image on the registry - -`POST /images/(name)/push` - -Push the image `name` on the registry - -**Example request**: - - POST /v1.23/images/test/push HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pushing..."} - {"status": "Pushing", "progress": "1/? (n/a)", "progressDetail": {"current": 1}}} - {"error": "Invalid..."} - ... - -If you wish to push an image on to a private registry, that image must already have a tag -into a repository which references that registry `hostname` and `port`. This repository name should -then be used in the URL. This duplicates the command line's flow. - -The push is cancelled if the HTTP connection is closed. - -**Example request**: - - POST /v1.23/images/registry.acme.com:5000/test/push HTTP/1.1 - - -**Query parameters**: - -- **tag** – The tag to associate with the image on the registry. This is optional. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either login information, or a token - - Credential based login: - - ``` - { - "username": "jdoe", - "password": "secret", - "email": "jdoe@acme.com", - } - ``` - - - Identity token based login: - - ``` - { - "identitytoken": "9cbaf023786cd7..." - } - ``` - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Tag an image into a repository - -`POST /images/(name)/tag` - -Tag the image `name` into a repository - -**Example request**: - - POST /v1.23/images/test/tag?repo=myrepo&force=0&tag=v42 HTTP/1.1 - -**Example response**: - - HTTP/1.1 201 Created - -**Query parameters**: - -- **repo** – The repository to tag in -- **force** – 1/True/true or 0/False/false, default false -- **tag** - The new tag name - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Remove an image - -`DELETE /images/(name)` - -Remove the image `name` from the filesystem - -**Example request**: - - DELETE /v1.23/images/test HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-type: application/json - - [ - {"Untagged": "3e2f21a89f"}, - {"Deleted": "3e2f21a89f"}, - {"Deleted": "53b4f83ac9"} - ] - -**Query parameters**: - -- **force** – 1/True/true or 0/False/false, default false -- **noprune** – 1/True/true or 0/False/false, default false - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Search images - -`GET /images/search` - -Search for an image on [Docker Hub](https://hub.docker.com). - -> **Note**: -> The response keys have changed from API v1.6 to reflect the JSON -> sent by the registry server to the docker daemon's request. - -**Example request**: - - GET /v1.23/images/search?term=sshd HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "wma55/u1210sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "jdswinbank/sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "vgauthier/sshd", - "star_count": 0 - } - ... - ] - -**Query parameters**: - -- **term** – term to search - -**Status codes**: - -- **200** – no error -- **500** – server error - -### 2.3 Misc - -#### Check auth configuration - -`POST /auth` - -Validate credentials for a registry and get identity token, -if available, for accessing the registry without password. - -**Example request**: - - POST /v1.23/auth HTTP/1.1 - Content-Type: application/json - - { - "username": "hannibal", - "password": "xxxx", - "serveraddress": "https://index.docker.io/v1/" - } - -**Example response**: - - HTTP/1.1 200 OK - - { - "Status": "Login Succeeded", - "IdentityToken": "9cbaf023786cd7..." - } - -**Status codes**: - -- **200** – no error -- **204** – no error -- **500** – server error - -#### Display system-wide information - -`GET /info` - -Display system-wide information - -**Example request**: - - GET /v1.23/info HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Architecture": "x86_64", - "ClusterStore": "etcd://localhost:2379", - "CgroupDriver": "cgroupfs", - "Containers": 11, - "ContainersRunning": 7, - "ContainersStopped": 3, - "ContainersPaused": 1, - "CpuCfsPeriod": true, - "CpuCfsQuota": true, - "Debug": false, - "DockerRootDir": "/var/lib/docker", - "Driver": "btrfs", - "DriverStatus": [[""]], - "ExecutionDriver": "native-0.1", - "ExperimentalBuild": false, - "HttpProxy": "http://test:test@localhost:8080", - "HttpsProxy": "https://test:test@localhost:8080", - "ID": "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS", - "IPv4Forwarding": true, - "Images": 16, - "IndexServerAddress": "https://index.docker.io/v1/", - "InitPath": "/usr/bin/docker", - "InitSha1": "", - "KernelMemory": true, - "KernelVersion": "3.12.0-1-amd64", - "Labels": [ - "storage=ssd" - ], - "MemTotal": 2099236864, - "MemoryLimit": true, - "NCPU": 1, - "NEventsListener": 0, - "NFd": 11, - "NGoroutines": 21, - "Name": "prod-server-42", - "NoProxy": "9.81.1.160", - "OomKillDisable": true, - "OSType": "linux", - "OperatingSystem": "Boot2Docker", - "Plugins": { - "Volume": [ - "local" - ], - "Network": [ - "null", - "host", - "bridge" - ] - }, - "RegistryConfig": { - "IndexConfigs": { - "docker.io": { - "Mirrors": null, - "Name": "docker.io", - "Official": true, - "Secure": true - } - }, - "InsecureRegistryCIDRs": [ - "127.0.0.0/8" - ] - }, - "ServerVersion": "1.9.0", - "SwapLimit": false, - "SystemStatus": [["State", "Healthy"]], - "SystemTime": "2015-03-10T11:11:23.730591467-07:00" - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Show the docker version information - -`GET /version` - -Show the docker version information - -**Example request**: - - GET /v1.23/version HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Version": "1.11.0", - "Os": "linux", - "KernelVersion": "3.19.0-23-generic", - "GoVersion": "go1.4.2", - "GitCommit": "e75da4b", - "Arch": "amd64", - "ApiVersion": "1.23", - "BuildTime": "2015-12-01T07:09:13.444803460+00:00", - "Experimental": true - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Ping the docker server - -`GET /_ping` - -Ping the docker server - -**Example request**: - - GET /v1.23/_ping HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: text/plain - - OK - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Create a new image from a container's changes - -`POST /commit` - -Create a new image from a container's changes - -**Example request**: - - POST /v1.23/commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Mounts": [ - { - "Source": "/data", - "Destination": "/data", - "Mode": "ro,Z", - "RW": false - } - ], - "Labels": { - "key1": "value1", - "key2": "value2" - }, - "WorkingDir": "", - "NetworkDisabled": false, - "ExposedPorts": { - "22/tcp": {} - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - {"Id": "596069db4bf5"} - -**JSON parameters**: - -- **config** - the container's configuration - -**Query parameters**: - -- **container** – source container -- **repo** – repository -- **tag** – tag -- **comment** – commit message -- **author** – author (e.g., "John Hannibal Smith - <[hannibal@a-team.com](mailto:hannibal%40a-team.com)>") -- **pause** – 1/True/true or 0/False/false, whether to pause the container before committing -- **changes** – Dockerfile instructions to apply while committing - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **500** – server error - -#### Monitor Docker's events - -`GET /events` - -Get container events from docker, in real time via streaming. - -Docker containers report the following events: - - attach, commit, copy, create, destroy, die, exec_create, exec_start, export, kill, oom, pause, rename, resize, restart, start, stop, top, unpause, update - -Docker images report the following events: - - delete, import, pull, push, tag, untag - -Docker volumes report the following events: - - create, mount, unmount, destroy - -Docker networks report the following events: - - create, connect, disconnect, destroy - -**Example request**: - - GET /v1.23/events?since=1374067924 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - Server: Docker/1.11.0 (linux) - Date: Fri, 29 Apr 2016 15:18:06 GMT - Transfer-Encoding: chunked - - { - "status": "pull", - "id": "alpine:latest", - "Type": "image", - "Action": "pull", - "Actor": { - "ID": "alpine:latest", - "Attributes": { - "name": "alpine" - } - }, - "time": 1461943101, - "timeNano": 1461943101301854122 - } - { - "status": "create", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "create", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101381709551 - } - { - "status": "attach", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "attach", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101383858412 - } - { - "Type": "network", - "Action": "connect", - "Actor": { - "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474", - "Attributes": { - "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "name": "bridge", - "type": "bridge" - } - }, - "time": 1461943101, - "timeNano": 1461943101394865557 - } - { - "status": "start", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "start", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101607533796 - } - { - "status": "resize", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "resize", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "height": "46", - "image": "alpine", - "name": "my-container", - "width": "204" - } - }, - "time": 1461943101, - "timeNano": 1461943101610269268 - } - { - "status": "die", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "die", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "exitCode": "0", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943105, - "timeNano": 1461943105079144137 - } - { - "Type": "network", - "Action": "disconnect", - "Actor": { - "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474", - "Attributes": { - "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "name": "bridge", - "type": "bridge" - } - }, - "time": 1461943105, - "timeNano": 1461943105230860245 - } - { - "status": "destroy", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "destroy", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943105, - "timeNano": 1461943105338056026 - } - -**Query parameters**: - -- **since** – Timestamp. Show all events created since timestamp and then stream -- **until** – Timestamp. Show events created until given timestamp and stop streaming -- **filters** – A json encoded value of the filters (a map[string][]string) to process on the event list. Available filters: - - `container=`; -- container to filter - - `event=`; -- event to filter - - `image=`; -- image to filter - - `label=`; -- image and container label to filter - - `type=`; -- either `container` or `image` or `volume` or `network` - - `volume=`; -- volume to filter - - `network=`; -- network to filter - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images in a repository - -`GET /images/(name)/get` - -Get a tarball containing all images and metadata for the repository specified -by `name`. - -If `name` is a specific name and tag (e.g. ubuntu:latest), then only that image -(and its parents) are returned. If `name` is an image ID, similarly only that -image (and its parents) are returned, but with the exclusion of the -'repositories' file in the tarball, as there were no image names referenced. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.23/images/ubuntu/get - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images - -`GET /images/get` - -Get a tarball containing all images and metadata for one or more repositories. - -For each value of the `names` parameter: if it is a specific name and tag (e.g. -`ubuntu:latest`), then only that image (and its parents) are returned; if it is -an image ID, similarly only that image (and its parents) are returned and there -would be no names referenced in the 'repositories' file for this image ID. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.23/images/get?names=myname%2Fmyapp%3Alatest&names=busybox - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Load a tarball with a set of images and tags into docker - -`POST /images/load` - -Load a set of images and tags into a Docker repository. -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - POST /v1.23/images/load - Content-Type: application/x-tar - - Tarball in body - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - Transfer-Encoding: chunked - - {"status":"Loading layer","progressDetail":{"current":32768,"total":1292800},"progress":"[= ] 32.77 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":65536,"total":1292800},"progress":"[== ] 65.54 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":98304,"total":1292800},"progress":"[=== ] 98.3 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":131072,"total":1292800},"progress":"[===== ] 131.1 kB/1.293 MB","id":"8ac8bfaff55a"} - ... - {"stream":"Loaded image: busybox:latest\n"} - -**Example response**: - -If the "quiet" query parameter is set to `true` / `1` (`?quiet=1`), progress -details are suppressed, and only a confirmation message is returned once the -action completes. - - HTTP/1.1 200 OK - Content-Type: application/json - Transfer-Encoding: chunked - - {"stream":"Loaded image: busybox:latest\n"} - -**Query parameters**: - -- **quiet** – Boolean value, suppress progress details during load. Defaults - to `0` / `false` if omitted. - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Image tarball format - -An image tarball contains one directory per image layer (named using its long ID), -each containing these files: - -- `VERSION`: currently `1.0` - the file format version -- `json`: detailed layer information, similar to `docker inspect layer_id` -- `layer.tar`: A tarfile containing the filesystem changes in this layer - -The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories -for storing attribute changes and deletions. - -If the tarball defines a repository, the tarball should also include a `repositories` file at -the root that contains a list of repository and tag names mapped to layer IDs. - -``` -{"hello-world": - {"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"} -} -``` - -#### Exec Create - -`POST /containers/(id or name)/exec` - -Sets up an exec instance in a running container `id` - -**Example request**: - - POST /v1.23/containers/e90e34656806/exec HTTP/1.1 - Content-Type: application/json - - { - "AttachStdin": true, - "AttachStdout": true, - "AttachStderr": true, - "Cmd": ["sh"], - "DetachKeys": "ctrl-p,ctrl-q", - "Privileged": true, - "Tty": true, - "User": "123:456" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id": "f90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **AttachStdin** - Boolean value, attaches to `stdin` of the `exec` command. -- **AttachStdout** - Boolean value, attaches to `stdout` of the `exec` command. -- **AttachStderr** - Boolean value, attaches to `stderr` of the `exec` command. -- **DetachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **Tty** - Boolean value to allocate a pseudo-TTY. -- **Cmd** - Command to run specified as a string or an array of strings. -- **Privileged** - Boolean value, runs the exec process with extended privileges. -- **User** - A string value specifying the user, and optionally, group to run - the exec process inside the container. Format is one of: `"user"`, - `"user:group"`, `"uid"`, or `"uid:gid"`. - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **409** - container is paused -- **500** - server error - -#### Exec Start - -`POST /exec/(id)/start` - -Starts a previously set up `exec` instance `id`. If `detach` is true, this API -returns after starting the `exec` command. Otherwise, this API sets up an -interactive session with the `exec` command. - -**Example request**: - - POST /v1.23/exec/e90e34656806/start HTTP/1.1 - Content-Type: application/json - - { - "Detach": false, - "Tty": false - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/vnd.docker.raw-stream - - {% raw %} - {{ STREAM }} - {% endraw %} - -**JSON parameters**: - -- **Detach** - Detach from the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **409** - container is paused - -**Stream details**: - -Similar to the stream behavior of `POST /containers/(id or name)/attach` API - -#### Exec Resize - -`POST /exec/(id)/resize` - -Resizes the `tty` session used by the `exec` command `id`. The unit is number of characters. -This API is valid only if `tty` was specified as part of creating and starting the `exec` command. - -**Example request**: - - POST /v1.23/exec/e90e34656806/resize?h=40&w=80 HTTP/1.1 - Content-Type: text/plain - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: text/plain - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **201** – no error -- **404** – no such exec instance - -#### Exec Inspect - -`GET /exec/(id)/json` - -Return low-level information about the `exec` command `id`. - -**Example request**: - - GET /v1.23/exec/11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "CanRemove": false, - "ContainerID": "b53ee82b53a40c7dca428523e34f741f3abc51d9f297a14ff874bf761b995126", - "DetachKeys": "", - "ExitCode": 2, - "ID": "f33bbfb39f5b142420f4759b2348913bd4a8d1a6d7fd56499cb41a1bb91d7b3b", - "OpenStderr": true, - "OpenStdin": true, - "OpenStdout": true, - "ProcessConfig": { - "arguments": [ - "-c", - "exit 2" - ], - "entrypoint": "sh", - "privileged": false, - "tty": true, - "user": "1000" - }, - "Running": false - } - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **500** - server error - -### 2.4 Volumes - -#### List volumes - -`GET /volumes` - -**Example request**: - - GET /v1.23/volumes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Volumes": [ - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis" - } - ], - "Warnings": [] - } - -**Query parameters**: - -- **filters** - JSON encoded value of the filters (a `map[string][]string`) to process on the volumes list. There is one available filter: `dangling=true` - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Create a volume - -`POST /volumes/create` - -Create a volume - -**Example request**: - - POST /v1.23/volumes/create HTTP/1.1 - Content-Type: application/json - - { - "Name": "tardis", - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis", - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - } - } - -**Status codes**: - -- **201** - no error -- **500** - server error - -**JSON parameters**: - -- **Name** - The new volume's name. If not specified, Docker generates a name. -- **Driver** - Name of the volume driver to use. Defaults to `local` for the name. -- **DriverOpts** - A mapping of driver options and values. These options are - passed directly to the driver and are driver specific. -- **Labels** - Labels to set on the volume, specified as a map: `{"key":"value","key2":"value2"}` - -#### Inspect a volume - -`GET /volumes/(name)` - -Return low-level information on the volume `name` - -**Example request**: - - GET /v1.23/volumes/tardis - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis/_data", - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - } - } - -**Status codes**: - -- **200** - no error -- **404** - no such volume -- **500** - server error - -#### Remove a volume - -`DELETE /volumes/(name)` - -Instruct the driver to remove the volume (`name`). - -**Example request**: - - DELETE /v1.23/volumes/tardis HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** - no error -- **404** - no such volume or volume driver -- **409** - volume is in use and cannot be removed -- **500** - server error - -### 3.5 Networks - -#### List networks - -`GET /networks` - -**Example request**: - - GET /v1.23/networks?filters={"type":{"custom":true}} HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -[ - { - "Name": "bridge", - "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566", - "Scope": "local", - "Driver": "bridge", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.17.0.0/16" - } - ] - }, - "Containers": { - "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": { - "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda", - "MacAddress": "02:42:ac:11:00:02", - "IPv4Address": "172.17.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - } - }, - { - "Name": "none", - "Id": "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794", - "Scope": "local", - "Driver": "null", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - }, - { - "Name": "host", - "Id": "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e", - "Scope": "local", - "Driver": "host", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - } -] -``` - -**Query parameters**: - -- **filters** - JSON encoded network list filter. The filter value is one of: - - `id=` Matches all or part of a network id. - - `name=` Matches all or part of a network name. - - `type=["custom"|"builtin"]` Filters networks by type. The `custom` keyword returns all user-defined networks. - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Inspect network - -`GET /networks/` - -**Example request**: - - GET /v1.23/networks/7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99 HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -{ - "Name": "net01", - "Id": "7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99", - "Scope": "local", - "Driver": "bridge", - "EnableIPv6": false, - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.19.0.0/16", - "Gateway": "172.19.0.1/16" - } - ], - "Options": { - "foo": "bar" - } - }, - "Internal": false, - "Containers": { - "19a4d5d687db25203351ed79d478946f861258f018fe384f229f2efa4b23513c": { - "Name": "test", - "EndpointID": "628cadb8bcb92de107b2a1e516cbffe463e321f548feb37697cce00ad694f21a", - "MacAddress": "02:42:ac:13:00:02", - "IPv4Address": "172.19.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - } -} -``` - -**Status codes**: - -- **200** - no error -- **404** - network not found - -#### Create a network - -`POST /networks/create` - -Create a network - -**Example request**: - -``` -POST /v1.23/networks/create HTTP/1.1 -Content-Type: application/json - -{ - "Name":"isolated_nw", - "CheckDuplicate":true, - "Driver":"bridge", - "EnableIPv6": true, - "IPAM":{ - "Driver": "default", - "Config":[ - { - "Subnet":"172.20.0.0/16", - "IPRange":"172.20.10.0/24", - "Gateway":"172.20.10.11" - }, - { - "Subnet":"2001:db8:abcd::/64", - "Gateway":"2001:db8:abcd::1011" - } - ], - "Options": { - "foo": "bar" - } - }, - "Internal":true, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - } -} -``` - -**Example response**: - -``` -HTTP/1.1 201 Created -Content-Type: application/json - -{ - "Id": "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30", - "Warning": "" -} -``` - -**Status codes**: - -- **201** - no error -- **404** - plugin not found -- **500** - server error - -**JSON parameters**: - -- **Name** - The new network's name. this is a mandatory field -- **CheckDuplicate** - Requests daemon to check for networks with same name. Defaults to `false` -- **Driver** - Name of the network driver plugin to use. Defaults to `bridge` driver -- **Internal** - Restrict external access to the network -- **IPAM** - Optional custom IP scheme for the network - - **Driver** - Name of the IPAM driver to use. Defaults to `default` driver - - **Config** - List of IPAM configuration options, specified as a map: - `{"Subnet": , "IPRange": , "Gateway": , "AuxAddress": }` - - **Options** - Driver-specific options, specified as a map: `{"option":"value" [,"option2":"value2"]}` -- **EnableIPv6** - Enable IPv6 on the network -- **Options** - Network specific options to be used by the drivers -- **Labels** - Labels to set on the network, specified as a map: `{"key":"value" [,"key2":"value2"]}` - -#### Connect a container to a network - -`POST /networks/(id)/connect` - -Connect a container to a network - -**Example request**: - -``` -POST /v1.23/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/connect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4", - "EndpointConfig": { - "IPAMConfig": { - "IPv4Address":"172.24.56.89", - "IPv6Address":"2001:db8::5689" - } - } -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **404** - network or container is not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **container** - container-id/name to be connected to the network - -#### Disconnect a container from a network - -`POST /networks/(id)/disconnect` - -Disconnect a container from a network - -**Example request**: - -``` -POST /v1.23/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/disconnect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4", - "Force":false -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **404** - network or container not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **Container** - container-id/name to be disconnected from a network -- **Force** - Force the container to disconnect from a network - -#### Remove a network - -`DELETE /networks/(id)` - -Instruct the driver to remove the network (`id`). - -**Example request**: - - DELETE /v1.23/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** - no error -- **404** - no such network -- **500** - server error - -## 3. Going further - -### 3.1 Inside `docker run` - -As an example, the `docker run` command line makes the following API calls: - -- Create the container - -- If the status code is 404, it means the image doesn't exist: - - Try to pull it. - - Then, retry to create the container. - -- Start the container. - -- If you are not in detached mode: -- Attach to the container, using `logs=1` (to have `stdout` and - `stderr` from the container's start) and `stream=1` - -- If in detached mode or only `stdin` is attached, display the container's id. - -### 3.2 Hijacking - -In this version of the API, `/attach`, uses hijacking to transport `stdin`, -`stdout`, and `stderr` on the same socket. - -To hint potential proxies about connection hijacking, Docker client sends -connection upgrade headers similarly to websocket. - - Upgrade: tcp - Connection: Upgrade - -When Docker daemon detects the `Upgrade` header, it switches its status code -from **200 OK** to **101 UPGRADED** and resends the same headers. - - -### 3.3 CORS Requests - -To set cross origin requests to the Engine API please give values to -`--api-cors-header` when running Docker in daemon mode. Set * (asterisk) allows all, -default or blank means CORS disabled - - $ dockerd -H="192.168.1.9:2375" --api-cors-header="http://foo.bar" diff --git a/vendor/github.com/docker/docker/docs/api/v1.24.md b/vendor/github.com/docker/docker/docs/api/v1.24.md deleted file mode 100644 index 0cf4e2afa..000000000 --- a/vendor/github.com/docker/docker/docs/api/v1.24.md +++ /dev/null @@ -1,5316 +0,0 @@ ---- -title: "Engine API v1.24" -description: "API Documentation for Docker" -keywords: "API, Docker, rcli, REST, documentation" -redirect_from: -- /engine/reference/api/docker_remote_api_v1.24/ -- /reference/api/docker_remote_api_v1.24/ ---- - - - -## 1. Brief introduction - - - The daemon listens on `unix:///var/run/docker.sock` but you can - [Bind Docker to another host/port or a Unix socket](../reference/commandline/dockerd.md#bind-docker-to-another-host-port-or-a-unix-socket). - - The API tends to be REST. However, for some complex commands, like `attach` - or `pull`, the HTTP connection is hijacked to transport `stdout`, - `stdin` and `stderr`. - -## 2. Errors - -The Engine API uses standard HTTP status codes to indicate the success or failure of the API call. The body of the response will be JSON in the following format: - - { - "message": "page not found" - } - -The status codes that are returned for each endpoint are specified in the endpoint documentation below. - -## 3. Endpoints - -### 3.1 Containers - -#### List containers - -`GET /containers/json` - -List containers - -**Example request**: - - GET /v1.24/containers/json?all=1&before=8dfafdbc3a40&size=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "8dfafdbc3a40", - "Names":["/boring_feynman"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 1", - "Created": 1367854155, - "State": "Exited", - "Status": "Exit 0", - "Ports": [{"PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp"}], - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "2cdc4edb1ded3631c81f57966563e5c8525b81121bb3706a9a9a3ae102711f3f", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:02" - } - } - }, - "Mounts": [ - { - "Name": "fac362...80535", - "Source": "/data", - "Destination": "/data", - "Driver": "local", - "Mode": "ro,Z", - "RW": false, - "Propagation": "" - } - ] - }, - { - "Id": "9cd87474be90", - "Names":["/coolName"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 222222", - "Created": 1367854155, - "State": "Exited", - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "88eaed7b37b38c2a3f0c4bc796494fdf51b270c2d22656412a2ca5d559a64d7a", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.8", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:08" - } - } - }, - "Mounts": [] - }, - { - "Id": "3176a2479c92", - "Names":["/sleepy_dog"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 3333333333333333", - "Created": 1367854154, - "State": "Exited", - "Status": "Exit 0", - "Ports":[], - "Labels": {}, - "SizeRw":12288, - "SizeRootFs":0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "8b27c041c30326d59cd6e6f510d4f8d1d570a228466f956edf7815508f78e30d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.6", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:06" - } - } - }, - "Mounts": [] - }, - { - "Id": "4cb07b47f9fb", - "Names":["/running_cat"], - "Image": "ubuntu:latest", - "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", - "Command": "echo 444444444444444444444444444444444", - "Created": 1367854152, - "State": "Exited", - "Status": "Exit 0", - "Ports": [], - "Labels": {}, - "SizeRw": 12288, - "SizeRootFs": 0, - "HostConfig": { - "NetworkMode": "default" - }, - "NetworkSettings": { - "Networks": { - "bridge": { - "IPAMConfig": null, - "Links": null, - "Aliases": null, - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "d91c7b2f0644403d7ef3095985ea0e2370325cd2332ff3a3225c4247328e66e9", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.5", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:11:00:05" - } - } - }, - "Mounts": [] - } - ] - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, Show all containers. - Only running containers are shown by default (i.e., this defaults to false) -- **limit** – Show `limit` last created - containers, include non-running ones. -- **since** – Show only containers created since Id, include - non-running ones. -- **before** – Show only containers created before Id, include - non-running ones. -- **size** – 1/True/true or 0/False/false, Show the containers - sizes -- **filters** - a JSON encoded value of the filters (a `map[string][]string`) to process on the containers list. Available filters: - - `exited=`; -- containers with exit code of `` ; - - `status=`(`created`|`restarting`|`running`|`paused`|`exited`|`dead`) - - `label=key` or `label="key=value"` of a container label - - `isolation=`(`default`|`process`|`hyperv`) (Windows daemon only) - - `ancestor`=(`[:]`, `` or ``) - - `before`=(`` or ``) - - `since`=(`` or ``) - - `volume`=(`` or ``) - - `network`=(`` or ``) - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **500** – server error - -#### Create a container - -`POST /containers/create` - -Create a container - -**Example request**: - - POST /v1.24/containers/create HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": [ - "FOO=bar", - "BAZ=quux" - ], - "Cmd": [ - "date" - ], - "Entrypoint": "", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "StopSignal": "SIGTERM", - "HostConfig": { - "Binds": ["/tmp:/tmp"], - "Tmpfs": { "/run": "rw,noexec,nosuid,size=65536k" }, - "Links": ["redis3:redis"], - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "CpuPercent": 80, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0,1", - "IOMaximumBandwidth": 0, - "IOMaximumIOps": 0, - "BlkioWeight": 300, - "BlkioWeightDevice": [{}], - "BlkioDeviceReadBps": [{}], - "BlkioDeviceReadIOps": [{}], - "BlkioDeviceWriteBps": [{}], - "BlkioDeviceWriteIOps": [{}], - "MemorySwappiness": 60, - "OomKillDisable": false, - "OomScoreAdj": 500, - "PidMode": "", - "PidsLimit": -1, - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsOptions": [""], - "DnsSearch": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "GroupAdd": ["newgroup"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "NetworkMode": "bridge", - "Devices": [], - "Sysctls": { "net.ipv4.ip_forward": "1" }, - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [], - "StorageOpt": {}, - "CgroupParent": "", - "VolumeDriver": "", - "ShmSize": 67108864 - }, - "NetworkingConfig": { - "EndpointsConfig": { - "isolated_nw" : { - "IPAMConfig": { - "IPv4Address":"172.20.30.33", - "IPv6Address":"2001:db8:abcd::3033", - "LinkLocalIPs":["169.254.34.68", "fe80::3468"] - }, - "Links":["container_1", "container_2"], - "Aliases":["server_x", "server_y"] - } - } - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id":"e90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **Hostname** - A string value containing the hostname to use for the - container. This must be a valid RFC 1123 hostname. -- **Domainname** - A string value containing the domain name to use - for the container. -- **User** - A string value specifying the user inside the container. -- **AttachStdin** - Boolean value, attaches to `stdin`. -- **AttachStdout** - Boolean value, attaches to `stdout`. -- **AttachStderr** - Boolean value, attaches to `stderr`. -- **Tty** - Boolean value, Attach standard streams to a `tty`, including `stdin` if it is not closed. -- **OpenStdin** - Boolean value, opens `stdin`, -- **StdinOnce** - Boolean value, close `stdin` after the 1 attached client disconnects. -- **Env** - A list of environment variables in the form of `["VAR=value", ...]` -- **Labels** - Adds a map of labels to a container. To specify a map: `{"key":"value", ... }` -- **Cmd** - Command to run specified as a string or an array of strings. -- **Entrypoint** - Set the entry point for the container as a string or an array - of strings. -- **Image** - A string specifying the image name to use for the container. -- **Volumes** - An object mapping mount point paths (strings) inside the - container to empty objects. -- **WorkingDir** - A string specifying the working directory for commands to - run in. -- **NetworkDisabled** - Boolean value, when true disables networking for the - container -- **ExposedPorts** - An object mapping ports to an empty object in the form of: - `"ExposedPorts": { "/: {}" }` -- **StopSignal** - Signal to stop a container as a string or unsigned integer. `SIGTERM` by default. -- **HostConfig** - - **Binds** – A list of volume bindings for this container. Each volume binding is a string in one of these forms: - + `host-src:container-dest` to bind-mount a host path into the - container. Both `host-src`, and `container-dest` must be an - _absolute_ path. - + `host-src:container-dest:ro` to make the bind-mount read-only - inside the container. Both `host-src`, and `container-dest` must be - an _absolute_ path. - + `volume-name:container-dest` to bind-mount a volume managed by a - volume driver into the container. `container-dest` must be an - _absolute_ path. - + `volume-name:container-dest:ro` to mount the volume read-only - inside the container. `container-dest` must be an _absolute_ path. - - **Tmpfs** – A map of container directories which should be replaced by tmpfs mounts, and their corresponding - mount options. A JSON object in the form `{ "/run": "rw,noexec,nosuid,size=65536k" }`. - - **Links** - A list of links for the container. Each link entry should be - in the form of `container_name:alias`. - - **Memory** - Memory limit in bytes. - - **MemorySwap** - Total memory limit (memory + swap); set `-1` to enable unlimited swap. - You must use this with `memory` and make the swap value larger than `memory`. - - **MemoryReservation** - Memory soft limit in bytes. - - **KernelMemory** - Kernel memory limit in bytes. - - **CpuPercent** - An integer value containing the usable percentage of the available CPUs. (Windows daemon only) - - **CpuShares** - An integer value containing the container's CPU Shares - (ie. the relative weight vs other containers). - - **CpuPeriod** - The length of a CPU period in microseconds. - - **CpuQuota** - Microseconds of CPU time that the container can get in a CPU period. - - **CpusetCpus** - String value containing the `cgroups CpusetCpus` to use. - - **CpusetMems** - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - - **IOMaximumBandwidth** - Maximum IO absolute rate in terms of IOps. - - **IOMaximumIOps** - Maximum IO absolute rate in terms of bytes per second. - - **BlkioWeight** - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - - **BlkioWeightDevice** - Block IO weight (relative device weight) in the form of: `"BlkioWeightDevice": [{"Path": "device_path", "Weight": weight}]` - - **BlkioDeviceReadBps** - Limit read rate (bytes per second) from a device in the form of: `"BlkioDeviceReadBps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceReadBps": [{"Path": "/dev/sda", "Rate": "1024"}]"` - - **BlkioDeviceWriteBps** - Limit write rate (bytes per second) to a device in the form of: `"BlkioDeviceWriteBps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceWriteBps": [{"Path": "/dev/sda", "Rate": "1024"}]"` - - **BlkioDeviceReadIOps** - Limit read rate (IO per second) from a device in the form of: `"BlkioDeviceReadIOps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceReadIOps": [{"Path": "/dev/sda", "Rate": "1000"}]` - - **BlkioDeviceWiiteIOps** - Limit write rate (IO per second) to a device in the form of: `"BlkioDeviceWriteIOps": [{"Path": "device_path", "Rate": rate}]`, for example: - `"BlkioDeviceWriteIOps": [{"Path": "/dev/sda", "Rate": "1000"}]` - - **MemorySwappiness** - Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100. - - **OomKillDisable** - Boolean value, whether to disable OOM Killer for the container or not. - - **OomScoreAdj** - An integer value containing the score given to the container in order to tune OOM killer preferences. - - **PidMode** - Set the PID (Process) Namespace mode for the container; - `"container:"`: joins another container's PID namespace - `"host"`: use the host's PID namespace inside the container - - **PidsLimit** - Tune a container's pids limit. Set -1 for unlimited. - - **PortBindings** - A map of exposed container ports and the host port they - should map to. A JSON object in the form - `{ /: [{ "HostPort": "" }] }` - Take note that `port` is specified as a string and not an integer value. - - **PublishAllPorts** - Allocates a random host port for all of a container's - exposed ports. Specified as a boolean value. - - **Privileged** - Gives the container full access to the host. Specified as - a boolean value. - - **ReadonlyRootfs** - Mount the container's root filesystem as read only. - Specified as a boolean value. - - **Dns** - A list of DNS servers for the container to use. - - **DnsOptions** - A list of DNS options - - **DnsSearch** - A list of DNS search domains - - **ExtraHosts** - A list of hostnames/IP mappings to add to the - container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`. - - **VolumesFrom** - A list of volumes to inherit from another container. - Specified in the form `[:]` - - **CapAdd** - A list of kernel capabilities to add to the container. - - **Capdrop** - A list of kernel capabilities to drop from the container. - - **GroupAdd** - A list of additional groups that the container process will run as - - **RestartPolicy** – The behavior to apply when the container exits. The - value is an object with a `Name` property of either `"always"` to - always restart, `"unless-stopped"` to restart always except when - user has manually stopped the container or `"on-failure"` to restart only when the container - exit code is non-zero. If `on-failure` is used, `MaximumRetryCount` - controls the number of times to retry before giving up. - The default is not to restart. (optional) - An ever increasing delay (double the previous delay, starting at 100mS) - is added before each restart to prevent flooding the server. - - **UsernsMode** - Sets the usernamespace mode for the container when usernamespace remapping option is enabled. - supported values are: `host`. - - **NetworkMode** - Sets the networking mode for the container. Supported - standard values are: `bridge`, `host`, `none`, and `container:`. Any other value is taken - as a custom network's name to which this container should connect to. - - **Devices** - A list of devices to add to the container specified as a JSON object in the - form - `{ "PathOnHost": "/dev/deviceName", "PathInContainer": "/dev/deviceName", "CgroupPermissions": "mrw"}` - - **Ulimits** - A list of ulimits to set in the container, specified as - `{ "Name": , "Soft": , "Hard": }`, for example: - `Ulimits: { "Name": "nofile", "Soft": 1024, "Hard": 2048 }` - - **Sysctls** - A list of kernel parameters (sysctls) to set in the container, specified as - `{ : }`, for example: - `{ "net.ipv4.ip_forward": "1" }` - - **SecurityOpt**: A list of string values to customize labels for MLS - systems, such as SELinux. - - **StorageOpt**: Storage driver options per container. Options can be passed in the form - `{"size":"120G"}` - - **LogConfig** - Log configuration for the container, specified as a JSON object in the form - `{ "Type": "", "Config": {"key1": "val1"}}`. - Available types: `json-file`, `syslog`, `journald`, `gelf`, `fluentd`, `awslogs`, `splunk`, `etwlogs`, `none`. - `json-file` logging driver. - - **CgroupParent** - Path to `cgroups` under which the container's `cgroup` is created. If the path is not absolute, the path is considered to be relative to the `cgroups` path of the init process. Cgroups are created if they do not already exist. - - **VolumeDriver** - Driver that this container users to mount volumes. - - **ShmSize** - Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB. - -**Query parameters**: - -- **name** – Assign the specified name to the container. Must - match `/?[a-zA-Z0-9_-]+`. - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such container -- **406** – impossible to attach (container not running) -- **409** – conflict -- **500** – server error - -#### Inspect a container - -`GET /containers/(id or name)/json` - -Return low-level information on the container `id` - -**Example request**: - - GET /v1.24/containers/4fa6e0f0c678/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "AppArmorProfile": "", - "Args": [ - "-c", - "exit 9" - ], - "Config": { - "AttachStderr": true, - "AttachStdin": false, - "AttachStdout": true, - "Cmd": [ - "/bin/sh", - "-c", - "exit 9" - ], - "Domainname": "", - "Entrypoint": null, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts": null, - "Hostname": "ba033ac44011", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "MacAddress": "", - "NetworkDisabled": false, - "OnBuild": null, - "OpenStdin": false, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": { - "/volumes/data": {} - }, - "WorkingDir": "", - "StopSignal": "SIGTERM" - }, - "Created": "2015-01-06T15:47:31.485331387Z", - "Driver": "devicemapper", - "ExecIDs": null, - "HostConfig": { - "Binds": null, - "IOMaximumBandwidth": 0, - "IOMaximumIOps": 0, - "BlkioWeight": 0, - "BlkioWeightDevice": [{}], - "BlkioDeviceReadBps": [{}], - "BlkioDeviceWriteBps": [{}], - "BlkioDeviceReadIOps": [{}], - "BlkioDeviceWriteIOps": [{}], - "CapAdd": null, - "CapDrop": null, - "ContainerIDFile": "", - "CpusetCpus": "", - "CpusetMems": "", - "CpuPercent": 80, - "CpuShares": 0, - "CpuPeriod": 100000, - "Devices": [], - "Dns": null, - "DnsOptions": null, - "DnsSearch": null, - "ExtraHosts": null, - "IpcMode": "", - "Links": null, - "LxcConf": [], - "Memory": 0, - "MemorySwap": 0, - "MemoryReservation": 0, - "KernelMemory": 0, - "OomKillDisable": false, - "OomScoreAdj": 500, - "NetworkMode": "bridge", - "PidMode": "", - "PortBindings": {}, - "Privileged": false, - "ReadonlyRootfs": false, - "PublishAllPorts": false, - "RestartPolicy": { - "MaximumRetryCount": 2, - "Name": "on-failure" - }, - "LogConfig": { - "Config": null, - "Type": "json-file" - }, - "SecurityOpt": null, - "Sysctls": { - "net.ipv4.ip_forward": "1" - }, - "StorageOpt": null, - "VolumesFrom": null, - "Ulimits": [{}], - "VolumeDriver": "", - "ShmSize": 67108864 - }, - "HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname", - "HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts", - "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log", - "Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39", - "Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2", - "MountLabel": "", - "Name": "/boring_euclid", - "NetworkSettings": { - "Bridge": "", - "SandboxID": "", - "HairpinMode": false, - "LinkLocalIPv6Address": "", - "LinkLocalIPv6PrefixLen": 0, - "Ports": null, - "SandboxKey": "", - "SecondaryIPAddresses": null, - "SecondaryIPv6Addresses": null, - "EndpointID": "", - "Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "IPAddress": "", - "IPPrefixLen": 0, - "IPv6Gateway": "", - "MacAddress": "", - "Networks": { - "bridge": { - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:12:00:02" - } - } - }, - "Path": "/bin/sh", - "ProcessLabel": "", - "ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf", - "RestartCount": 1, - "State": { - "Error": "", - "ExitCode": 9, - "FinishedAt": "2015-01-06T15:47:32.080254511Z", - "OOMKilled": false, - "Dead": false, - "Paused": false, - "Pid": 0, - "Restarting": false, - "Running": true, - "StartedAt": "2015-01-06T15:47:32.072697474Z", - "Status": "running" - }, - "Mounts": [ - { - "Name": "fac362...80535", - "Source": "/data", - "Destination": "/data", - "Driver": "local", - "Mode": "ro,Z", - "RW": false, - "Propagation": "" - } - ] - } - -**Example request, with size information**: - - GET /v1.24/containers/4fa6e0f0c678/json?size=1 HTTP/1.1 - -**Example response, with size information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - .... - "SizeRw": 0, - "SizeRootFs": 972, - .... - } - -**Query parameters**: - -- **size** – 1/True/true or 0/False/false, return container size information. Default is `false`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### List processes running inside a container - -`GET /containers/(id or name)/top` - -List processes running inside the container `id`. On Unix systems this -is done by running the `ps` command. This endpoint is not -supported on Windows. - -**Example request**: - - GET /v1.24/containers/4fa6e0f0c678/top HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "UID", "PID", "PPID", "C", "STIME", "TTY", "TIME", "CMD" - ], - "Processes" : [ - [ - "root", "13642", "882", "0", "17:03", "pts/0", "00:00:00", "/bin/bash" - ], - [ - "root", "13735", "13642", "0", "17:06", "pts/0", "00:00:00", "sleep 10" - ] - ] - } - -**Example request**: - - GET /v1.24/containers/4fa6e0f0c678/top?ps_args=aux HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Titles" : [ - "USER","PID","%CPU","%MEM","VSZ","RSS","TTY","STAT","START","TIME","COMMAND" - ] - "Processes" : [ - [ - "root","13642","0.0","0.1","18172","3184","pts/0","Ss","17:03","0:00","/bin/bash" - ], - [ - "root","13895","0.0","0.0","4348","692","pts/0","S+","17:15","0:00","sleep 10" - ] - ], - } - -**Query parameters**: - -- **ps_args** – `ps` arguments to use (e.g., `aux`), defaults to `-ef` - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container logs - -`GET /containers/(id or name)/logs` - -Get `stdout` and `stderr` logs from the container ``id`` - -> **Note**: -> This endpoint works only for containers with the `json-file` or `journald` logging drivers. - -**Example request**: - - GET /v1.24/containers/4fa6e0f0c678/logs?stderr=1&stdout=1×tamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **details** - 1/True/true or 0/False/flase, Show extra details provided to logs. Default `false`. -- **follow** – 1/True/true or 0/False/false, return stream. Default `false`. -- **stdout** – 1/True/true or 0/False/false, show `stdout` log. Default `false`. -- **stderr** – 1/True/true or 0/False/false, show `stderr` log. Default `false`. -- **since** – UNIX timestamp (integer) to filter logs. Specifying a timestamp - will only output log-entries since that timestamp. Default: 0 (unfiltered) -- **timestamps** – 1/True/true or 0/False/false, print timestamps for - every log line. Default `false`. -- **tail** – Output specified number of lines at the end of logs: `all` or ``. Default all. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **404** – no such container -- **500** – server error - -#### Inspect changes on a container's filesystem - -`GET /containers/(id or name)/changes` - -Inspect changes on container `id`'s filesystem - -**Example request**: - - GET /v1.24/containers/4fa6e0f0c678/changes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Path": "/dev", - "Kind": 0 - }, - { - "Path": "/dev/kmsg", - "Kind": 1 - }, - { - "Path": "/test", - "Kind": 1 - } - ] - -Values for `Kind`: - -- `0`: Modify -- `1`: Add -- `2`: Delete - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Export a container - -`GET /containers/(id or name)/export` - -Export the contents of container `id` - -**Example request**: - - GET /v1.24/containers/4fa6e0f0c678/export HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/octet-stream - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Get container stats based on resource usage - -`GET /containers/(id or name)/stats` - -This endpoint returns a live stream of a container's resource usage statistics. - -**Example request**: - - GET /v1.24/containers/redis1/stats HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "read" : "2015-01-08T22:57:31.547920715Z", - "pids_stats": { - "current": 3 - }, - "networks": { - "eth0": { - "rx_bytes": 5338, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 36, - "tx_bytes": 648, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 8 - }, - "eth5": { - "rx_bytes": 4641, - "rx_dropped": 0, - "rx_errors": 0, - "rx_packets": 26, - "tx_bytes": 690, - "tx_dropped": 0, - "tx_errors": 0, - "tx_packets": 9 - } - }, - "memory_stats" : { - "stats" : { - "total_pgmajfault" : 0, - "cache" : 0, - "mapped_file" : 0, - "total_inactive_file" : 0, - "pgpgout" : 414, - "rss" : 6537216, - "total_mapped_file" : 0, - "writeback" : 0, - "unevictable" : 0, - "pgpgin" : 477, - "total_unevictable" : 0, - "pgmajfault" : 0, - "total_rss" : 6537216, - "total_rss_huge" : 6291456, - "total_writeback" : 0, - "total_inactive_anon" : 0, - "rss_huge" : 6291456, - "hierarchical_memory_limit" : 67108864, - "total_pgfault" : 964, - "total_active_file" : 0, - "active_anon" : 6537216, - "total_active_anon" : 6537216, - "total_pgpgout" : 414, - "total_cache" : 0, - "inactive_anon" : 0, - "active_file" : 0, - "pgfault" : 964, - "inactive_file" : 0, - "total_pgpgin" : 477 - }, - "max_usage" : 6651904, - "usage" : 6537216, - "failcnt" : 0, - "limit" : 67108864 - }, - "blkio_stats" : {}, - "cpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24472255, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100215355, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 739306590000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - }, - "precpu_stats" : { - "cpu_usage" : { - "percpu_usage" : [ - 8646879, - 24350896, - 36438778, - 30657443 - ], - "usage_in_usermode" : 50000000, - "total_usage" : 100093996, - "usage_in_kernelmode" : 30000000 - }, - "system_cpu_usage" : 9492140000000, - "throttling_data" : {"periods":0,"throttled_periods":0,"throttled_time":0} - } - } - -The precpu_stats is the cpu statistic of last read, which is used for calculating the cpu usage percent. It is not the exact copy of the “cpu_stats” field. - -**Query parameters**: - -- **stream** – 1/True/true or 0/False/false, pull stats once then disconnect. Default `true`. - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Resize a container TTY - -`POST /containers/(id or name)/resize` - -Resize the TTY for container with `id`. The unit is number of characters. You must restart the container for the resize to take effect. - -**Example request**: - - POST /v1.24/containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **200** – no error -- **404** – No such container -- **500** – Cannot resize container - -#### Start a container - -`POST /containers/(id or name)/start` - -Start the container `id` - -**Example request**: - - POST /v1.24/containers/e90e34656806/start HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**Status codes**: - -- **204** – no error -- **304** – container already started -- **404** – no such container -- **500** – server error - -#### Stop a container - -`POST /containers/(id or name)/stop` - -Stop the container `id` - -**Example request**: - - POST /v1.24/containers/e90e34656806/stop?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **304** – container already stopped -- **404** – no such container -- **500** – server error - -#### Restart a container - -`POST /containers/(id or name)/restart` - -Restart the container `id` - -**Example request**: - - POST /v1.24/containers/e90e34656806/restart?t=5 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **t** – number of seconds to wait before killing the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Kill a container - -`POST /containers/(id or name)/kill` - -Kill the container `id` - -**Example request**: - - POST /v1.24/containers/e90e34656806/kill HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **signal** - Signal to send to the container: integer or string like `SIGINT`. - When not set, `SIGKILL` is assumed and the call waits for the container to exit. - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Update a container - -`POST /containers/(id or name)/update` - -Update configuration of one or more containers. - -**Example request**: - - POST /v1.24/containers/e90e34656806/update HTTP/1.1 - Content-Type: application/json - - { - "BlkioWeight": 300, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpuQuota": 50000, - "CpusetCpus": "0,1", - "CpusetMems": "0", - "Memory": 314572800, - "MemorySwap": 514288000, - "MemoryReservation": 209715200, - "KernelMemory": 52428800, - "RestartPolicy": { - "MaximumRetryCount": 4, - "Name": "on-failure" - }, - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Warnings": [] - } - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -#### Rename a container - -`POST /containers/(id or name)/rename` - -Rename the container `id` to a `new_name` - -**Example request**: - - POST /v1.24/containers/e90e34656806/rename?name=new_name HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **name** – new name for the container - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **409** - conflict name already assigned -- **500** – server error - -#### Pause a container - -`POST /containers/(id or name)/pause` - -Pause the container `id` - -**Example request**: - - POST /v1.24/containers/e90e34656806/pause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Unpause a container - -`POST /containers/(id or name)/unpause` - -Unpause the container `id` - -**Example request**: - - POST /v1.24/containers/e90e34656806/unpause HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** – no error -- **404** – no such container -- **500** – server error - -#### Attach to a container - -`POST /containers/(id or name)/attach` - -Attach to the container `id` - -**Example request**: - - POST /v1.24/containers/16253994b7c4/attach?logs=1&stream=0&stdout=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 101 UPGRADED - Content-Type: application/vnd.docker.raw-stream - Connection: Upgrade - Upgrade: tcp - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **101** – no error, hints proxy about hijacking -- **200** – no error, no upgrade header found -- **400** – bad parameter -- **404** – no such container -- **409** - container is paused -- **500** – server error - -**Stream details**: - -When using the TTY setting is enabled in -[`POST /containers/create` -](#create-a-container), -the stream is the raw data from the process PTY and client's `stdin`. -When the TTY is disabled, then the stream is multiplexed to separate -`stdout` and `stderr`. - -The format is a **Header** and a **Payload** (frame). - -**HEADER** - -The header contains the information which the stream writes (`stdout` or -`stderr`). It also contains the size of the associated frame encoded in the -last four bytes (`uint32`). - -It is encoded on the first eight bytes like this: - - header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4} - -`STREAM_TYPE` can be: - -- 0: `stdin` (is written on `stdout`) -- 1: `stdout` -- 2: `stderr` - -`SIZE1, SIZE2, SIZE3, SIZE4` are the four bytes of -the `uint32` size encoded as big endian. - -**PAYLOAD** - -The payload is the raw stream. - -**IMPLEMENTATION** - -The simplest way to implement the Attach protocol is the following: - - 1. Read eight bytes. - 2. Choose `stdout` or `stderr` depending on the first byte. - 3. Extract the frame size from the last four bytes. - 4. Read the extracted size and output it on the correct output. - 5. Goto 1. - -#### Attach to a container (websocket) - -`GET /containers/(id or name)/attach/ws` - -Attach to the container `id` via websocket - -Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455) - -**Example request** - - GET /v1.24/containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1 - -**Example response** - - {% raw %} - {{ STREAM }} - {% endraw %} - -**Query parameters**: - -- **detachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **logs** – 1/True/true or 0/False/false, return logs. Default `false`. -- **stream** – 1/True/true or 0/False/false, return stream. - Default `false`. -- **stdin** – 1/True/true or 0/False/false, if `stream=true`, attach - to `stdin`. Default `false`. -- **stdout** – 1/True/true or 0/False/false, if `logs=true`, return - `stdout` log, if `stream=true`, attach to `stdout`. Default `false`. -- **stderr** – 1/True/true or 0/False/false, if `logs=true`, return - `stderr` log, if `stream=true`, attach to `stderr`. Default `false`. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **404** – no such container -- **500** – server error - -#### Wait a container - -`POST /containers/(id or name)/wait` - -Block until container `id` stops, then returns the exit code - -**Example request**: - - POST /v1.24/containers/16253994b7c4/wait HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"StatusCode": 0} - -**Status codes**: - -- **200** – no error -- **404** – no such container -- **500** – server error - -#### Remove a container - -`DELETE /containers/(id or name)` - -Remove the container `id` from the filesystem - -**Example request**: - - DELETE /v1.24/containers/16253994b7c4?v=1 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Query parameters**: - -- **v** – 1/True/true or 0/False/false, Remove the volumes - associated to the container. Default `false`. -- **force** - 1/True/true or 0/False/false, Kill then remove the container. - Default `false`. - -**Status codes**: - -- **204** – no error -- **400** – bad parameter -- **404** – no such container -- **409** – conflict -- **500** – server error - -#### Retrieving information about files and folders in a container - -`HEAD /containers/(id or name)/archive` - -See the description of the `X-Docker-Container-Path-Stat` header in the -following section. - -#### Get an archive of a filesystem resource in a container - -`GET /containers/(id or name)/archive` - -Get a tar archive of a resource in the filesystem of container `id`. - -**Query parameters**: - -- **path** - resource in the container's filesystem to archive. Required. - - If not an absolute path, it is relative to the container's root directory. - The resource specified by **path** must exist. To assert that the resource - is expected to be a directory, **path** should end in `/` or `/.` - (assuming a path separator of `/`). If **path** ends in `/.` then this - indicates that only the contents of the **path** directory should be - copied. A symlink is always resolved to its target. - - > **Note**: It is not possible to copy certain system files such as resources - > under `/proc`, `/sys`, `/dev`, and mounts created by the user in the - > container. - -**Example request**: - - GET /v1.24/containers/8cce319429b2/archive?path=/root HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - X-Docker-Container-Path-Stat: eyJuYW1lIjoicm9vdCIsInNpemUiOjQwOTYsIm1vZGUiOjIxNDc0ODQwOTYsIm10aW1lIjoiMjAxNC0wMi0yN1QyMDo1MToyM1oiLCJsaW5rVGFyZ2V0IjoiIn0= - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -On success, a response header `X-Docker-Container-Path-Stat` will be set to a -base64-encoded JSON object containing some filesystem header information about -the archived resource. The above example value would decode to the following -JSON object (whitespace added for readability): - -```json -{ - "name": "root", - "size": 4096, - "mode": 2147484096, - "mtime": "2014-02-27T20:51:23Z", - "linkTarget": "" -} -``` - -A `HEAD` request can also be made to this endpoint if only this information is -desired. - -**Status codes**: - -- **200** - success, returns archive of copied resource -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** was asserted to be a directory but exists as a - file) -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** does not exist) -- **500** - server error - -#### Extract an archive of files or folders to a directory in a container - -`PUT /containers/(id or name)/archive` - -Upload a tar archive to be extracted to a path in the filesystem of container -`id`. - -**Query parameters**: - -- **path** - path to a directory in the container - to extract the archive's contents into. Required. - - If not an absolute path, it is relative to the container's root directory. - The **path** resource must exist. -- **noOverwriteDirNonDir** - If "1", "true", or "True" then it will be an error - if unpacking the given content would cause an existing directory to be - replaced with a non-directory and vice versa. - -**Example request**: - - PUT /v1.24/containers/8cce319429b2/archive?path=/vol1 HTTP/1.1 - Content-Type: application/x-tar - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** – the content was extracted successfully -- **400** - client error, bad parameter, details in JSON response body, one of: - - must specify path parameter (**path** cannot be empty) - - not a directory (**path** should be a directory but exists as a file) - - unable to overwrite existing directory with non-directory - (if **noOverwriteDirNonDir**) - - unable to overwrite existing non-directory with directory - (if **noOverwriteDirNonDir**) -- **403** - client error, permission denied, the volume - or container rootfs is marked as read-only. -- **404** - client error, resource not found, one of: - – no such container (container `id` does not exist) - - no such file or directory (**path** resource does not exist) -- **500** – server error - -### 3.2 Images - -#### List Images - -`GET /images/json` - -**Example request**: - - GET /v1.24/images/json?all=0 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "RepoTags": [ - "ubuntu:12.04", - "ubuntu:precise", - "ubuntu:latest" - ], - "Id": "8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c", - "Created": 1365714795, - "Size": 131506275, - "VirtualSize": 131506275, - "Labels": {} - }, - { - "RepoTags": [ - "ubuntu:12.10", - "ubuntu:quantal" - ], - "ParentId": "27cf784147099545", - "Id": "b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc", - "Created": 1364102658, - "Size": 24653, - "VirtualSize": 180116135, - "Labels": { - "com.example.version": "v1" - } - } - ] - -**Example request, with digest information**: - - GET /v1.24/images/json?digests=1 HTTP/1.1 - -**Example response, with digest information**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Created": 1420064636, - "Id": "4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125", - "ParentId": "ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2", - "RepoDigests": [ - "localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags": [ - "localhost:5000/test/busybox:latest", - "playdate:latest" - ], - "Size": 0, - "VirtualSize": 2429728, - "Labels": {} - } - ] - -The response shows a single image `Id` associated with two repositories -(`RepoTags`): `localhost:5000/test/busybox`: and `playdate`. A caller can use -either of the `RepoTags` values `localhost:5000/test/busybox:latest` or -`playdate:latest` to reference the image. - -You can also use `RepoDigests` values to reference an image. In this response, -the array has only one reference and that is to the -`localhost:5000/test/busybox` repository; the `playdate` repository has no -digest. You can reference this digest using the value: -`localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d...` - -See the `docker run` and `docker build` commands for examples of digest and tag -references on the command line. - -**Query parameters**: - -- **all** – 1/True/true or 0/False/false, default false -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `dangling=true` - - `label=key` or `label="key=value"` of an image label - - `before`=(`[:]`, `` or ``) - - `since`=(`[:]`, `` or ``) -- **filter** - only return images with the specified name - -#### Build image from a Dockerfile - -`POST /build` - -Build an image from a Dockerfile - -**Example request**: - - POST /v1.24/build HTTP/1.1 - - {% raw %} - {{ TAR STREAM }} - {% endraw %} - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"stream": "Step 1/5..."} - {"stream": "..."} - {"error": "Error...", "errorDetail": {"code": 123, "message": "Error..."}} - -The input stream must be a `tar` archive compressed with one of the -following algorithms: `identity` (no compression), `gzip`, `bzip2`, `xz`. - -The archive must include a build instructions file, typically called -`Dockerfile` at the archive's root. The `dockerfile` parameter may be -used to specify a different build instructions file. To do this, its value must be -the path to the alternate build instructions file to use. - -The archive may include any number of other files, -which are accessible in the build context (See the [*ADD build -command*](../reference/builder.md#add)). - -The Docker daemon performs a preliminary validation of the `Dockerfile` before -starting the build, and returns an error if the syntax is incorrect. After that, -each instruction is run one-by-one until the ID of the new image is output. - -The build is canceled if the client drops the connection by quitting -or being killed. - -**Query parameters**: - -- **dockerfile** - Path within the build context to the `Dockerfile`. This is - ignored if `remote` is specified and points to an external `Dockerfile`. -- **t** – A name and optional tag to apply to the image in the `name:tag` format. - If you omit the `tag` the default `latest` value is assumed. - You can provide one or more `t` parameters. -- **remote** – A Git repository URI or HTTP/HTTPS context URI. If the - URI points to a single text file, the file's contents are placed into - a file called `Dockerfile` and the image is built from that file. If - the URI points to a tarball, the file is downloaded by the daemon and - the contents therein used as the context for the build. If the URI - points to a tarball and the `dockerfile` parameter is also specified, - there must be a file with the corresponding path inside the tarball. -- **q** – Suppress verbose build output. -- **nocache** – Do not use the cache when building the image. -- **pull** - Attempt to pull the image even if an older image exists locally. -- **rm** - Remove intermediate containers after a successful build (default behavior). -- **forcerm** - Always remove intermediate containers (includes `rm`). -- **memory** - Set memory limit for build. -- **memswap** - Total memory (memory + swap), `-1` to enable unlimited swap. -- **cpushares** - CPU shares (relative weight). -- **cpusetcpus** - CPUs in which to allow execution (e.g., `0-3`, `0,1`). -- **cpuperiod** - The length of a CPU period in microseconds. -- **cpuquota** - Microseconds of CPU time that the container can get in a CPU period. -- **buildargs** – JSON map of string pairs for build-time variables. Users pass - these values at build-time. Docker uses the `buildargs` as the environment - context for command(s) run via the Dockerfile's `RUN` instruction or for - variable expansion in other Dockerfile instructions. This is not meant for - passing secret values. [Read more about the buildargs instruction](../reference/builder.md#arg) -- **shmsize** - Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB. -- **labels** – JSON map of string pairs for labels to set on the image. - -**Request Headers**: - -- **Content-type** – Set to `"application/tar"`. -- **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON - object with the following structure: - - { - "docker.example.com": { - "username": "janedoe", - "password": "hunter2" - }, - "https://index.docker.io/v1/": { - "username": "mobydock", - "password": "conta1n3rize14" - } - } - - This object maps the hostname of a registry to an object containing the - "username" and "password" for that registry. Multiple registries may - be specified as the build may be based on an image requiring - authentication to pull from any arbitrary registry. Only the registry - domain name (and port if not the default "443") are required. However - (for legacy reasons) the "official" Docker, Inc. hosted registry must - be specified with both a "https://" prefix and a "/v1/" suffix even - though Docker will prefer to use the v2 registry API. - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Create an image - -`POST /images/create` - -Create an image either by pulling it from the registry or by importing it - -**Example request**: - - POST /v1.24/images/create?fromImage=busybox&tag=latest HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pulling..."} - {"status": "Pulling", "progress": "1 B/ 100 B", "progressDetail": {"current": 1, "total": 100}} - {"error": "Invalid..."} - ... - -When using this endpoint to pull an image from the registry, the -`X-Registry-Auth` header can be used to include -a base64-encoded AuthConfig object. - -**Query parameters**: - -- **fromImage** – Name of the image to pull. The name may include a tag or - digest. This parameter may only be used when pulling an image. - The pull is cancelled if the HTTP connection is closed. -- **fromSrc** – Source to import. The value may be a URL from which the image - can be retrieved or `-` to read the image from the request body. - This parameter may only be used when importing an image. -- **repo** – Repository name given to an image when it is imported. - The repo may include a tag. This parameter may only be used when importing - an image. -- **tag** – Tag or digest. If empty when pulling an image, this causes all tags - for the given image to be pulled. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either login information, or a token - - Credential based login: - - ``` - { - "username": "jdoe", - "password": "secret", - "email": "jdoe@acme.com" - } - ``` - - - Token based login: - - ``` - { - "identitytoken": "9cbaf023786cd7..." - } - ``` - -**Status codes**: - -- **200** – no error -- **404** - repository does not exist or no read access -- **500** – server error - - - -#### Inspect an image - -`GET /images/(name)/json` - -Return low-level information on the image `name` - -**Example request**: - - GET /v1.24/images/example/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Id" : "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c", - "Container" : "cb91e48a60d01f1e27028b4fc6819f4f290b3cf12496c8176ec714d0d390984a", - "Comment" : "", - "Os" : "linux", - "Architecture" : "amd64", - "Parent" : "sha256:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "ContainerConfig" : { - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Domainname" : "", - "AttachStdout" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "StdinOnce" : false, - "NetworkDisabled" : false, - "OnBuild" : [], - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "User" : "", - "WorkingDir" : "", - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "Labels" : { - "com.example.license" : "GPL", - "com.example.version" : "1.0", - "com.example.vendor" : "Acme" - }, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts" : null, - "Cmd" : [ - "/bin/sh", - "-c", - "#(nop) LABEL com.example.vendor=Acme com.example.license=GPL com.example.version=1.0" - ] - }, - "DockerVersion" : "1.9.0-dev", - "VirtualSize" : 188359297, - "Size" : 0, - "Author" : "", - "Created" : "2015-09-10T08:30:53.26995814Z", - "GraphDriver" : { - "Name" : "aufs", - "Data" : null - }, - "RepoDigests" : [ - "localhost:5000/test/busybox/example@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf" - ], - "RepoTags" : [ - "example:1.0", - "example:latest", - "example:stable" - ], - "Config" : { - "Image" : "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - "NetworkDisabled" : false, - "OnBuild" : [], - "StdinOnce" : false, - "PublishService" : "", - "AttachStdin" : false, - "OpenStdin" : false, - "Domainname" : "", - "AttachStdout" : false, - "Tty" : false, - "Hostname" : "e611e15f9c9d", - "Volumes" : null, - "Cmd" : [ - "/bin/bash" - ], - "ExposedPorts" : null, - "Env" : [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "Labels" : { - "com.example.vendor" : "Acme", - "com.example.version" : "1.0", - "com.example.license" : "GPL" - }, - "Entrypoint" : null, - "MacAddress" : "", - "AttachStderr" : false, - "WorkingDir" : "", - "User" : "" - }, - "RootFS": { - "Type": "layers", - "Layers": [ - "sha256:1834950e52ce4d5a88a1bbd131c537f4d0e56d10ff0dd69e66be3b7dfa9df7e6", - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" - ] - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Get the history of an image - -`GET /images/(name)/history` - -Return the history of the image `name` - -**Example request**: - - GET /v1.24/images/ubuntu/history HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "Id": "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710", - "Created": 1398108230, - "CreatedBy": "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /", - "Tags": [ - "ubuntu:lucid", - "ubuntu:10.04" - ], - "Size": 182964289, - "Comment": "" - }, - { - "Id": "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8", - "Created": 1398108222, - "CreatedBy": "/bin/sh -c #(nop) MAINTAINER Tianon Gravi - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/", - "Tags": null, - "Size": 0, - "Comment": "" - }, - { - "Id": "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158", - "Created": 1371157430, - "CreatedBy": "", - "Tags": [ - "scratch12:latest", - "scratch:latest" - ], - "Size": 0, - "Comment": "Imported from -" - } - ] - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Push an image on the registry - -`POST /images/(name)/push` - -Push the image `name` on the registry - -**Example request**: - - POST /v1.24/images/test/push HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - {"status": "Pushing..."} - {"status": "Pushing", "progress": "1/? (n/a)", "progressDetail": {"current": 1}}} - {"error": "Invalid..."} - ... - -If you wish to push an image on to a private registry, that image must already have a tag -into a repository which references that registry `hostname` and `port`. This repository name should -then be used in the URL. This duplicates the command line's flow. - -The push is cancelled if the HTTP connection is closed. - -**Example request**: - - POST /v1.24/images/registry.acme.com:5000/test/push HTTP/1.1 - - -**Query parameters**: - -- **tag** – The tag to associate with the image on the registry. This is optional. - -**Request Headers**: - -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either login information, or a token - - Credential based login: - - ``` - { - "username": "jdoe", - "password": "secret", - "email": "jdoe@acme.com", - } - ``` - - - Identity token based login: - - ``` - { - "identitytoken": "9cbaf023786cd7..." - } - ``` - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **500** – server error - -#### Tag an image into a repository - -`POST /images/(name)/tag` - -Tag the image `name` into a repository - -**Example request**: - - POST /v1.24/images/test/tag?repo=myrepo&tag=v42 HTTP/1.1 - -**Example response**: - - HTTP/1.1 201 Created - -**Query parameters**: - -- **repo** – The repository to tag in -- **tag** - The new tag name - -**Status codes**: - -- **201** – no error -- **400** – bad parameter -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Remove an image - -`DELETE /images/(name)` - -Remove the image `name` from the filesystem - -**Example request**: - - DELETE /v1.24/images/test HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-type: application/json - - [ - {"Untagged": "3e2f21a89f"}, - {"Deleted": "3e2f21a89f"}, - {"Deleted": "53b4f83ac9"} - ] - -**Query parameters**: - -- **force** – 1/True/true or 0/False/false, default false -- **noprune** – 1/True/true or 0/False/false, default false - -**Status codes**: - -- **200** – no error -- **404** – no such image -- **409** – conflict -- **500** – server error - -#### Search images - -`GET /images/search` - -Search for an image on [Docker Hub](https://hub.docker.com). - -> **Note**: -> The response keys have changed from API v1.6 to reflect the JSON -> sent by the registry server to the docker daemon's request. - -**Example request**: - - GET /v1.24/images/search?term=sshd HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "wma55/u1210sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "jdswinbank/sshd", - "star_count": 0 - }, - { - "description": "", - "is_official": false, - "is_automated": false, - "name": "vgauthier/sshd", - "star_count": 0 - } - ... - ] - -**Query parameters**: - -- **term** – term to search -- **limit** – maximum returned search results -- **filters** – a JSON encoded value of the filters (a map[string][]string) to process on the images list. Available filters: - - `stars=` - - `is-automated=(true|false)` - - `is-official=(true|false)` - -**Status codes**: - -- **200** – no error -- **500** – server error - -### 3.3 Misc - -#### Check auth configuration - -`POST /auth` - -Validate credentials for a registry and get identity token, -if available, for accessing the registry without password. - -**Example request**: - - POST /v1.24/auth HTTP/1.1 - Content-Type: application/json - - { - "username": "hannibal", - "password": "xxxx", - "serveraddress": "https://index.docker.io/v1/" - } - -**Example response**: - - HTTP/1.1 200 OK - - { - "Status": "Login Succeeded", - "IdentityToken": "9cbaf023786cd7..." - } - -**Status codes**: - -- **200** – no error -- **204** – no error -- **500** – server error - -#### Display system-wide information - -`GET /info` - -Display system-wide information - -**Example request**: - - GET /v1.24/info HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Architecture": "x86_64", - "ClusterStore": "etcd://localhost:2379", - "CgroupDriver": "cgroupfs", - "Containers": 11, - "ContainersRunning": 7, - "ContainersStopped": 3, - "ContainersPaused": 1, - "CpuCfsPeriod": true, - "CpuCfsQuota": true, - "Debug": false, - "DockerRootDir": "/var/lib/docker", - "Driver": "btrfs", - "DriverStatus": [[""]], - "ExperimentalBuild": false, - "HttpProxy": "http://test:test@localhost:8080", - "HttpsProxy": "https://test:test@localhost:8080", - "ID": "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS", - "IPv4Forwarding": true, - "Images": 16, - "IndexServerAddress": "https://index.docker.io/v1/", - "InitPath": "/usr/bin/docker", - "InitSha1": "", - "KernelMemory": true, - "KernelVersion": "3.12.0-1-amd64", - "Labels": [ - "storage=ssd" - ], - "MemTotal": 2099236864, - "MemoryLimit": true, - "NCPU": 1, - "NEventsListener": 0, - "NFd": 11, - "NGoroutines": 21, - "Name": "prod-server-42", - "NoProxy": "9.81.1.160", - "OomKillDisable": true, - "OSType": "linux", - "OperatingSystem": "Boot2Docker", - "Plugins": { - "Volume": [ - "local" - ], - "Network": [ - "null", - "host", - "bridge" - ] - }, - "RegistryConfig": { - "IndexConfigs": { - "docker.io": { - "Mirrors": null, - "Name": "docker.io", - "Official": true, - "Secure": true - } - }, - "InsecureRegistryCIDRs": [ - "127.0.0.0/8" - ] - }, - "SecurityOptions": [ - "apparmor", - "seccomp", - "selinux" - ], - "ServerVersion": "1.9.0", - "SwapLimit": false, - "SystemStatus": [["State", "Healthy"]], - "SystemTime": "2015-03-10T11:11:23.730591467-07:00" - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Show the docker version information - -`GET /version` - -Show the docker version information - -**Example request**: - - GET /v1.24/version HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Version": "1.12.0", - "Os": "linux", - "KernelVersion": "3.19.0-23-generic", - "GoVersion": "go1.6.3", - "GitCommit": "deadbee", - "Arch": "amd64", - "ApiVersion": "1.24", - "BuildTime": "2016-06-14T07:09:13.444803460+00:00", - "Experimental": true - } - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Ping the docker server - -`GET /_ping` - -Ping the docker server - -**Example request**: - - GET /v1.24/_ping HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: text/plain - - OK - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Create a new image from a container's changes - -`POST /commit` - -Create a new image from a container's changes - -**Example request**: - - POST /v1.24/commit?container=44c004db4b17&comment=message&repo=myrepo HTTP/1.1 - Content-Type: application/json - - { - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Mounts": [ - { - "Source": "/data", - "Destination": "/data", - "Mode": "ro,Z", - "RW": false - } - ], - "Labels": { - "key1": "value1", - "key2": "value2" - }, - "WorkingDir": "", - "NetworkDisabled": false, - "ExposedPorts": { - "22/tcp": {} - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - {"Id": "596069db4bf5"} - -**JSON parameters**: - -- **config** - the container's configuration - -**Query parameters**: - -- **container** – source container -- **repo** – repository -- **tag** – tag -- **comment** – commit message -- **author** – author (e.g., "John Hannibal Smith - <[hannibal@a-team.com](mailto:hannibal%40a-team.com)>") -- **pause** – 1/True/true or 0/False/false, whether to pause the container before committing -- **changes** – Dockerfile instructions to apply while committing - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **500** – server error - -#### Monitor Docker's events - -`GET /events` - -Get container events from docker, in real time via streaming. - -Docker containers report the following events: - - attach, commit, copy, create, destroy, detach, die, exec_create, exec_detach, exec_start, export, health_status, kill, oom, pause, rename, resize, restart, start, stop, top, unpause, update - -Docker images report the following events: - - delete, import, load, pull, push, save, tag, untag - -Docker volumes report the following events: - - create, mount, unmount, destroy - -Docker networks report the following events: - - create, connect, disconnect, destroy - -Docker daemon report the following event: - - reload - -**Example request**: - - GET /v1.24/events?since=1374067924 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - Server: Docker/1.12.0 (linux) - Date: Fri, 29 Apr 2016 15:18:06 GMT - Transfer-Encoding: chunked - - { - "status": "pull", - "id": "alpine:latest", - "Type": "image", - "Action": "pull", - "Actor": { - "ID": "alpine:latest", - "Attributes": { - "name": "alpine" - } - }, - "time": 1461943101, - "timeNano": 1461943101301854122 - } - { - "status": "create", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "create", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101381709551 - } - { - "status": "attach", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "attach", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101383858412 - } - { - "Type": "network", - "Action": "connect", - "Actor": { - "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474", - "Attributes": { - "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "name": "bridge", - "type": "bridge" - } - }, - "time": 1461943101, - "timeNano": 1461943101394865557 - } - { - "status": "start", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "start", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943101, - "timeNano": 1461943101607533796 - } - { - "status": "resize", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "resize", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "height": "46", - "image": "alpine", - "name": "my-container", - "width": "204" - } - }, - "time": 1461943101, - "timeNano": 1461943101610269268 - } - { - "status": "die", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "die", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "exitCode": "0", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943105, - "timeNano": 1461943105079144137 - } - { - "Type": "network", - "Action": "disconnect", - "Actor": { - "ID": "7dc8ac97d5d29ef6c31b6052f3938c1e8f2749abbd17d1bd1febf2608db1b474", - "Attributes": { - "container": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "name": "bridge", - "type": "bridge" - } - }, - "time": 1461943105, - "timeNano": 1461943105230860245 - } - { - "status": "destroy", - "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "from": "alpine", - "Type": "container", - "Action": "destroy", - "Actor": { - "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743", - "Attributes": { - "com.example.some-label": "some-label-value", - "image": "alpine", - "name": "my-container" - } - }, - "time": 1461943105, - "timeNano": 1461943105338056026 - } - -**Query parameters**: - -- **since** – Timestamp. Show all events created since timestamp and then stream -- **until** – Timestamp. Show events created until given timestamp and stop streaming -- **filters** – A json encoded value of the filters (a map[string][]string) to process on the event list. Available filters: - - `container=`; -- container to filter - - `event=`; -- event to filter - - `image=`; -- image to filter - - `label=`; -- image and container label to filter - - `type=`; -- either `container` or `image` or `volume` or `network` or `daemon` - - `volume=`; -- volume to filter - - `network=`; -- network to filter - - `daemon=`; -- daemon name or id to filter - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images in a repository - -`GET /images/(name)/get` - -Get a tarball containing all images and metadata for the repository specified -by `name`. - -If `name` is a specific name and tag (e.g. ubuntu:latest), then only that image -(and its parents) are returned. If `name` is an image ID, similarly only that -image (and its parents) are returned, but with the exclusion of the -'repositories' file in the tarball, as there were no image names referenced. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.24/images/ubuntu/get - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Get a tarball containing all images - -`GET /images/get` - -Get a tarball containing all images and metadata for one or more repositories. - -For each value of the `names` parameter: if it is a specific name and tag (e.g. -`ubuntu:latest`), then only that image (and its parents) are returned; if it is -an image ID, similarly only that image (and its parents) are returned and there -would be no names referenced in the 'repositories' file for this image ID. - -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - GET /v1.24/images/get?names=myname%2Fmyapp%3Alatest&names=busybox - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/x-tar - - Binary data stream - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Load a tarball with a set of images and tags into docker - -`POST /images/load` - -Load a set of images and tags into a Docker repository. -See the [image tarball format](#image-tarball-format) for more details. - -**Example request** - - POST /v1.24/images/load - Content-Type: application/x-tar - - Tarball in body - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - Transfer-Encoding: chunked - - {"status":"Loading layer","progressDetail":{"current":32768,"total":1292800},"progress":"[= ] 32.77 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":65536,"total":1292800},"progress":"[== ] 65.54 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":98304,"total":1292800},"progress":"[=== ] 98.3 kB/1.293 MB","id":"8ac8bfaff55a"} - {"status":"Loading layer","progressDetail":{"current":131072,"total":1292800},"progress":"[===== ] 131.1 kB/1.293 MB","id":"8ac8bfaff55a"} - ... - {"stream":"Loaded image: busybox:latest\n"} - -**Example response**: - -If the "quiet" query parameter is set to `true` / `1` (`?quiet=1`), progress -details are suppressed, and only a confirmation message is returned once the -action completes. - - HTTP/1.1 200 OK - Content-Type: application/json - Transfer-Encoding: chunked - - {"stream":"Loaded image: busybox:latest\n"} - -**Query parameters**: - -- **quiet** – Boolean value, suppress progress details during load. Defaults - to `0` / `false` if omitted. - -**Status codes**: - -- **200** – no error -- **500** – server error - -#### Image tarball format - -An image tarball contains one directory per image layer (named using its long ID), -each containing these files: - -- `VERSION`: currently `1.0` - the file format version -- `json`: detailed layer information, similar to `docker inspect layer_id` -- `layer.tar`: A tarfile containing the filesystem changes in this layer - -The `layer.tar` file contains `aufs` style `.wh..wh.aufs` files and directories -for storing attribute changes and deletions. - -If the tarball defines a repository, the tarball should also include a `repositories` file at -the root that contains a list of repository and tag names mapped to layer IDs. - -``` -{"hello-world": - {"latest": "565a9d68a73f6706862bfe8409a7f659776d4d60a8d096eb4a3cbce6999cc2a1"} -} -``` - -#### Exec Create - -`POST /containers/(id or name)/exec` - -Sets up an exec instance in a running container `id` - -**Example request**: - - POST /v1.24/containers/e90e34656806/exec HTTP/1.1 - Content-Type: application/json - - { - "AttachStdin": true, - "AttachStdout": true, - "AttachStderr": true, - "Cmd": ["sh"], - "DetachKeys": "ctrl-p,ctrl-q", - "Privileged": true, - "Tty": true, - "User": "123:456" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Id": "f90e34656806", - "Warnings":[] - } - -**JSON parameters**: - -- **AttachStdin** - Boolean value, attaches to `stdin` of the `exec` command. -- **AttachStdout** - Boolean value, attaches to `stdout` of the `exec` command. -- **AttachStderr** - Boolean value, attaches to `stderr` of the `exec` command. -- **DetachKeys** – Override the key sequence for detaching a - container. Format is a single character `[a-Z]` or `ctrl-` - where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. -- **Tty** - Boolean value to allocate a pseudo-TTY. -- **Cmd** - Command to run specified as a string or an array of strings. -- **Privileged** - Boolean value, runs the exec process with extended privileges. -- **User** - A string value specifying the user, and optionally, group to run - the exec process inside the container. Format is one of: `"user"`, - `"user:group"`, `"uid"`, or `"uid:gid"`. - -**Status codes**: - -- **201** – no error -- **404** – no such container -- **409** - container is paused -- **500** - server error - -#### Exec Start - -`POST /exec/(id)/start` - -Starts a previously set up `exec` instance `id`. If `detach` is true, this API -returns after starting the `exec` command. Otherwise, this API sets up an -interactive session with the `exec` command. - -**Example request**: - - POST /v1.24/exec/e90e34656806/start HTTP/1.1 - Content-Type: application/json - - { - "Detach": false, - "Tty": false - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/vnd.docker.raw-stream - - {% raw %} - {{ STREAM }} - {% endraw %} - -**JSON parameters**: - -- **Detach** - Detach from the `exec` command. -- **Tty** - Boolean value to allocate a pseudo-TTY. - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **409** - container is paused - -**Stream details**: - -Similar to the stream behavior of `POST /containers/(id or name)/attach` API - -#### Exec Resize - -`POST /exec/(id)/resize` - -Resizes the `tty` session used by the `exec` command `id`. The unit is number of characters. -This API is valid only if `tty` was specified as part of creating and starting the `exec` command. - -**Example request**: - - POST /v1.24/exec/e90e34656806/resize?h=40&w=80 HTTP/1.1 - Content-Type: text/plain - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: text/plain - -**Query parameters**: - -- **h** – height of `tty` session -- **w** – width - -**Status codes**: - -- **201** – no error -- **404** – no such exec instance - -#### Exec Inspect - -`GET /exec/(id)/json` - -Return low-level information about the `exec` command `id`. - -**Example request**: - - GET /v1.24/exec/11fb006128e8ceb3942e7c58d77750f24210e35f879dd204ac975c184b820b39/json HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "CanRemove": false, - "ContainerID": "b53ee82b53a40c7dca428523e34f741f3abc51d9f297a14ff874bf761b995126", - "DetachKeys": "", - "ExitCode": 2, - "ID": "f33bbfb39f5b142420f4759b2348913bd4a8d1a6d7fd56499cb41a1bb91d7b3b", - "OpenStderr": true, - "OpenStdin": true, - "OpenStdout": true, - "ProcessConfig": { - "arguments": [ - "-c", - "exit 2" - ], - "entrypoint": "sh", - "privileged": false, - "tty": true, - "user": "1000" - }, - "Running": false - } - -**Status codes**: - -- **200** – no error -- **404** – no such exec instance -- **500** - server error - -### 3.4 Volumes - -#### List volumes - -`GET /volumes` - -**Example request**: - - GET /v1.24/volumes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Volumes": [ - { - "Name": "tardis", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/tardis", - "Labels": null, - "Scope": "local" - } - ], - "Warnings": [] - } - -**Query parameters**: - -- **filters** - JSON encoded value of the filters (a `map[string][]string`) to process on the volumes list. Available filters: - - `name=` Matches all or part of a volume name. - - `dangling=` When set to `true` (or `1`), returns all volumes that are "dangling" (not in use by a container). When set to `false` (or `0`), only volumes that are in use by one or more containers are returned. - - `driver=` Matches all or part of a volume driver name. - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Create a volume - -`POST /volumes/create` - -Create a volume - -**Example request**: - - POST /v1.24/volumes/create HTTP/1.1 - Content-Type: application/json - - { - "Name": "tardis", - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - }, - "Driver": "custom" - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "custom", - "Mountpoint": "/var/lib/docker/volumes/tardis", - "Status": { - "hello": "world" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - }, - "Scope": "local" - } - -**Status codes**: - -- **201** - no error -- **500** - server error - -**JSON parameters**: - -- **Name** - The new volume's name. If not specified, Docker generates a name. -- **Driver** - Name of the volume driver to use. Defaults to `local` for the name. -- **DriverOpts** - A mapping of driver options and values. These options are - passed directly to the driver and are driver specific. -- **Labels** - Labels to set on the volume, specified as a map: `{"key":"value","key2":"value2"}` - -**JSON fields in response**: - -Refer to the [inspect a volume](#inspect-a-volume) section or details about the -JSON fields returned in the response. - -#### Inspect a volume - -`GET /volumes/(name)` - -Return low-level information on the volume `name` - -**Example request**: - - GET /v1.24/volumes/tardis - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "Name": "tardis", - "Driver": "custom", - "Mountpoint": "/var/lib/docker/volumes/tardis/_data", - "Status": { - "hello": "world" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - }, - "Scope": "local" - } - -**Status codes**: - -- **200** - no error -- **404** - no such volume -- **500** - server error - -**JSON fields in response**: - -The following fields can be returned in the API response. Empty fields, or -fields that are not supported by the volume's driver may be omitted in the -response. - -- **Name** - Name of the volume. -- **Driver** - Name of the volume driver used by the volume. -- **Mountpoint** - Mount path of the volume on the host. -- **Status** - 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. -- **Labels** - Labels set on the volume, specified as a map: `{"key":"value","key2":"value2"}`. -- **Scope** - Scope describes the level at which the volume exists, can be one of - `global` for cluster-wide or `local` for machine level. The default is `local`. - -#### Remove a volume - -`DELETE /volumes/(name)` - -Instruct the driver to remove the volume (`name`). - -**Example request**: - - DELETE /v1.24/volumes/tardis HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** - no error -- **404** - no such volume or volume driver -- **409** - volume is in use and cannot be removed -- **500** - server error - -### 3.5 Networks - -#### List networks - -`GET /networks` - -**Example request**: - - GET /v1.24/networks?filters={"type":{"custom":true}} HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -[ - { - "Name": "bridge", - "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566", - "Scope": "local", - "Driver": "bridge", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.17.0.0/16" - } - ] - }, - "Containers": { - "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": { - "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda", - "MacAddress": "02:42:ac:11:00:02", - "IPv4Address": "172.17.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - } - }, - { - "Name": "none", - "Id": "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794", - "Scope": "local", - "Driver": "null", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - }, - { - "Name": "host", - "Id": "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e", - "Scope": "local", - "Driver": "host", - "EnableIPv6": false, - "Internal": false, - "IPAM": { - "Driver": "default", - "Config": [] - }, - "Containers": {}, - "Options": {} - } -] -``` - -**Query parameters**: - -- **filters** - JSON encoded network list filter. The filter value is one of: - - `driver=` Matches a network's driver. - - `id=` Matches all or part of a network id. - - `label=` or `label==` of a network label. - - `name=` Matches all or part of a network name. - - `type=["custom"|"builtin"]` Filters networks by type. The `custom` keyword returns all user-defined networks. - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Inspect network - -`GET /networks/` - -**Example request**: - - GET /v1.24/networks/7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99 HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -{ - "Name": "net01", - "Id": "7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99", - "Scope": "local", - "Driver": "bridge", - "EnableIPv6": false, - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.19.0.0/16", - "Gateway": "172.19.0.1" - } - ], - "Options": { - "foo": "bar" - } - }, - "Internal": false, - "Containers": { - "19a4d5d687db25203351ed79d478946f861258f018fe384f229f2efa4b23513c": { - "Name": "test", - "EndpointID": "628cadb8bcb92de107b2a1e516cbffe463e321f548feb37697cce00ad694f21a", - "MacAddress": "02:42:ac:13:00:02", - "IPv4Address": "172.19.0.2/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - } -} -``` - -**Status codes**: - -- **200** - no error -- **404** - network not found - -#### Create a network - -`POST /networks/create` - -Create a network - -**Example request**: - -``` -POST /v1.24/networks/create HTTP/1.1 -Content-Type: application/json - -{ - "Name":"isolated_nw", - "CheckDuplicate":true, - "Driver":"bridge", - "EnableIPv6": true, - "IPAM":{ - "Driver": "default", - "Config":[ - { - "Subnet":"172.20.0.0/16", - "IPRange":"172.20.10.0/24", - "Gateway":"172.20.10.11" - }, - { - "Subnet":"2001:db8:abcd::/64", - "Gateway":"2001:db8:abcd::1011" - } - ], - "Options": { - "foo": "bar" - } - }, - "Internal":true, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - }, - "Labels": { - "com.example.some-label": "some-value", - "com.example.some-other-label": "some-other-value" - } -} -``` - -**Example response**: - -``` -HTTP/1.1 201 Created -Content-Type: application/json - -{ - "Id": "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30", - "Warning": "" -} -``` - -**Status codes**: - -- **201** - no error -- **403** - operation not supported for pre-defined networks -- **404** - plugin not found -- **500** - server error - -**JSON parameters**: - -- **Name** - The new network's name. this is a mandatory field -- **CheckDuplicate** - Requests daemon to check for networks with same name. Defaults to `false` -- **Driver** - Name of the network driver plugin to use. Defaults to `bridge` driver -- **Internal** - Restrict external access to the network -- **IPAM** - Optional custom IP scheme for the network - - **Driver** - Name of the IPAM driver to use. Defaults to `default` driver - - **Config** - List of IPAM configuration options, specified as a map: - `{"Subnet": , "IPRange": , "Gateway": , "AuxAddress": }` - - **Options** - Driver-specific options, specified as a map: `{"option":"value" [,"option2":"value2"]}` -- **EnableIPv6** - Enable IPv6 on the network -- **Options** - Network specific options to be used by the drivers -- **Labels** - Labels to set on the network, specified as a map: `{"key":"value" [,"key2":"value2"]}` - -#### Connect a container to a network - -`POST /networks/(id)/connect` - -Connect a container to a network - -**Example request**: - -``` -POST /v1.24/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/connect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4", - "EndpointConfig": { - "IPAMConfig": { - "IPv4Address":"172.24.56.89", - "IPv6Address":"2001:db8::5689" - } - } -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **403** - operation not supported for swarm scoped networks -- **404** - network or container is not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **container** - container-id/name to be connected to the network - -#### Disconnect a container from a network - -`POST /networks/(id)/disconnect` - -Disconnect a container from a network - -**Example request**: - -``` -POST /v1.24/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30/disconnect HTTP/1.1 -Content-Type: application/json - -{ - "Container":"3613f73ba0e4", - "Force":false -} -``` - -**Example response**: - - HTTP/1.1 200 OK - -**Status codes**: - -- **200** - no error -- **403** - operation not supported for swarm scoped networks -- **404** - network or container not found -- **500** - Internal Server Error - -**JSON parameters**: - -- **Container** - container-id/name to be disconnected from a network -- **Force** - Force the container to disconnect from a network - -#### Remove a network - -`DELETE /networks/(id)` - -Instruct the driver to remove the network (`id`). - -**Example request**: - - DELETE /v1.24/networks/22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30 HTTP/1.1 - -**Example response**: - - HTTP/1.1 204 No Content - -**Status codes**: - -- **204** - no error -- **404** - no such network -- **500** - server error - -### 3.6 Plugins (experimental) - -#### List plugins - -`GET /plugins` - -Returns information about installed plugins. - -**Example request**: - - GET /v1.24/plugins HTTP/1.1 - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -[ - { - "Id": "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078", - "Name": "tiborvass/no-remove", - "Tag": "latest", - "Active": true, - "Config": { - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Env": [ - "DEBUG=1" - ], - "Args": null, - "Devices": null - }, - "Manifest": { - "ManifestVersion": "v0", - "Description": "A test plugin for Docker", - "Documentation": "https://docs.docker.com/engine/extend/plugins/", - "Interface": { - "Types": [ - "docker.volumedriver/1.0" - ], - "Socket": "plugins.sock" - }, - "Entrypoint": [ - "plugin-no-remove", - "/data" - ], - "Workdir": "", - "User": { - }, - "Network": { - "Type": "host" - }, - "Capabilities": null, - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Devices": [ - { - "Name": "device", - "Description": "a host device to mount", - "Settable": null, - "Path": "/dev/cpu_dma_latency" - } - ], - "Env": [ - { - "Name": "DEBUG", - "Description": "If set, prints debug messages", - "Settable": null, - "Value": "1" - } - ], - "Args": { - "Name": "args", - "Description": "command line arguments", - "Settable": null, - "Value": [ - - ] - } - } - } -] -``` - -**Status codes**: - -- **200** - no error -- **500** - server error - -#### Install a plugin - -`POST /plugins/pull?name=` - -Pulls and installs a plugin. After the plugin is installed, it can be enabled -using the [`POST /plugins/(plugin name)/enable` endpoint](#enable-a-plugin). - -**Example request**: - -``` -POST /v1.24/plugins/pull?name=tiborvass/no-remove:latest HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. When using -this endpoint to pull a plugin from the registry, the `X-Registry-Auth` header -can be used to include a base64-encoded AuthConfig object. Refer to the [create -an image](#create-an-image) section for more details. - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json -Content-Length: 175 - -[ - { - "Name": "network", - "Description": "", - "Value": [ - "host" - ] - }, - { - "Name": "mount", - "Description": "", - "Value": [ - "/data" - ] - }, - { - "Name": "device", - "Description": "", - "Value": [ - "/dev/cpu_dma_latency" - ] - } -] -``` - -**Query parameters**: - -- **name** - Name of the plugin to pull. The name may include a tag or digest. - This parameter is required. - -**Status codes**: - -- **200** - no error -- **500** - error parsing reference / not a valid repository/tag: repository - name must have at least one component -- **500** - plugin already exists - -#### Inspect a plugin - -`GET /plugins/(plugin name)` - -Returns detailed information about an installed plugin. - -**Example request**: - -``` -GET /v1.24/plugins/tiborvass/no-remove:latest HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Type: application/json - -{ - "Id": "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078", - "Name": "tiborvass/no-remove", - "Tag": "latest", - "Active": false, - "Config": { - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Env": [ - "DEBUG=1" - ], - "Args": null, - "Devices": null - }, - "Manifest": { - "ManifestVersion": "v0", - "Description": "A test plugin for Docker", - "Documentation": "https://docs.docker.com/engine/extend/plugins/", - "Interface": { - "Types": [ - "docker.volumedriver/1.0" - ], - "Socket": "plugins.sock" - }, - "Entrypoint": [ - "plugin-no-remove", - "/data" - ], - "Workdir": "", - "User": { - }, - "Network": { - "Type": "host" - }, - "Capabilities": null, - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Devices": [ - { - "Name": "device", - "Description": "a host device to mount", - "Settable": null, - "Path": "/dev/cpu_dma_latency" - } - ], - "Env": [ - { - "Name": "DEBUG", - "Description": "If set, prints debug messages", - "Settable": null, - "Value": "1" - } - ], - "Args": { - "Name": "args", - "Description": "command line arguments", - "Settable": null, - "Value": [ - - ] - } - } -} -``` - -**Status codes**: - -- **200** - no error -- **404** - plugin not installed - -#### Enable a plugin - -`POST /plugins/(plugin name)/enable` - -Enables a plugin - -**Example request**: - -``` -POST /v1.24/plugins/tiborvass/no-remove:latest/enable HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Length: 0 -Content-Type: text/plain; charset=utf-8 -``` - -**Status codes**: - -- **200** - no error -- **500** - plugin is already enabled - -#### Disable a plugin - -`POST /plugins/(plugin name)/disable` - -Disables a plugin - -**Example request**: - -``` -POST /v1.24/plugins/tiborvass/no-remove:latest/disable HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Length: 0 -Content-Type: text/plain; charset=utf-8 -``` - -**Status codes**: - -- **200** - no error -- **500** - plugin is already disabled - -#### Remove a plugin - -`DELETE /plugins/(plugin name)` - -Removes a plugin - -**Example request**: - -``` -DELETE /v1.24/plugins/tiborvass/no-remove:latest HTTP/1.1 -``` - -The `:latest` tag is optional, and is used as default if omitted. - -**Example response**: - -``` -HTTP/1.1 200 OK -Content-Length: 0 -Content-Type: text/plain; charset=utf-8 -``` - -**Status codes**: - -- **200** - no error -- **404** - plugin not installed -- **500** - plugin is active - - - -### 3.7 Nodes - -**Note**: Node operations require the engine to be part of a swarm. - -#### List nodes - - -`GET /nodes` - -List nodes - -**Example request**: - - GET /v1.24/nodes HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "ID": "24ifsmvkjbyhk", - "Version": { - "Index": 8 - }, - "CreatedAt": "2016-06-07T20:31:11.853781916Z", - "UpdatedAt": "2016-06-07T20:31:11.999868824Z", - "Spec": { - "Name": "my-node", - "Role": "manager", - "Availability": "active" - "Labels": { - "foo": "bar" - } - }, - "Description": { - "Hostname": "bf3067039e47", - "Platform": { - "Architecture": "x86_64", - "OS": "linux" - }, - "Resources": { - "NanoCPUs": 4000000000, - "MemoryBytes": 8272408576 - }, - "Engine": { - "EngineVersion": "1.12.0", - "Labels": { - "foo": "bar", - } - "Plugins": [ - { - "Type": "Volume", - "Name": "local" - }, - { - "Type": "Network", - "Name": "bridge" - } - { - "Type": "Network", - "Name": "null" - } - { - "Type": "Network", - "Name": "overlay" - } - ] - } - }, - "Status": { - "State": "ready" - }, - "ManagerStatus": { - "Leader": true, - "Reachability": "reachable", - "Addr": "172.17.0.2:2377"" - } - } - ] - -**Query parameters**: - -- **filters** – a JSON encoded value of the filters (a `map[string][]string`) to process on the - nodes list. Available filters: - - `id=` - - `label=` - - `membership=`(`accepted`|`pending`)` - - `name=` - - `role=`(`manager`|`worker`)` - -**Status codes**: - -- **200** – no error -- **406** - node is not part of a swarm -- **500** – server error - -#### Inspect a node - - -`GET /nodes/(id or name)` - -Return low-level information on the node `id` - -**Example request**: - - GET /v1.24/nodes/24ifsmvkjbyhk HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "ID": "24ifsmvkjbyhk", - "Version": { - "Index": 8 - }, - "CreatedAt": "2016-06-07T20:31:11.853781916Z", - "UpdatedAt": "2016-06-07T20:31:11.999868824Z", - "Spec": { - "Name": "my-node", - "Role": "manager", - "Availability": "active" - "Labels": { - "foo": "bar" - } - }, - "Description": { - "Hostname": "bf3067039e47", - "Platform": { - "Architecture": "x86_64", - "OS": "linux" - }, - "Resources": { - "NanoCPUs": 4000000000, - "MemoryBytes": 8272408576 - }, - "Engine": { - "EngineVersion": "1.12.0", - "Labels": { - "foo": "bar", - } - "Plugins": [ - { - "Type": "Volume", - "Name": "local" - }, - { - "Type": "Network", - "Name": "bridge" - } - { - "Type": "Network", - "Name": "null" - } - { - "Type": "Network", - "Name": "overlay" - } - ] - } - }, - "Status": { - "State": "ready" - }, - "ManagerStatus": { - "Leader": true, - "Reachability": "reachable", - "Addr": "172.17.0.2:2377"" - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such node -- **406** – node is not part of a swarm -- **500** – server error - -#### Remove a node - - -`DELETE /nodes/(id or name)` - -Remove a node from the swarm. - -**Example request**: - - DELETE /v1.24/nodes/24ifsmvkjbyhk HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **force** - 1/True/true or 0/False/false, Force remove a node from the swarm. - Default `false`. - -**Status codes**: - -- **200** – no error -- **404** – no such node -- **406** – node is not part of a swarm -- **500** – server error - -#### Update a node - - -`POST /nodes/(id)/update` - -Update a node. - -The payload of the `POST` request is the new `NodeSpec` and -overrides the current `NodeSpec` for the specified node. - -If `Availability` or `Role` are omitted, this returns an -error. Any other field omitted resets the current value to either -an empty value or the default cluster-wide value. - -**Example Request** - - POST /v1.24/nodes/24ifsmvkjbyhk/update?version=8 HTTP/1.1 - Content-Type: application/json - - { - "Availability": "active", - "Name": "node-name", - "Role": "manager", - "Labels": { - "foo": "bar" - } - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **version** – The version number of the node object being updated. This is - required to avoid conflicting writes. - -JSON Parameters: - -- **Annotations** – Optional medata to associate with the node. - - **Name** – User-defined name for the node. - - **Labels** – A map of labels to associate with the node (e.g., - `{"key":"value", "key2":"value2"}`). -- **Role** - Role of the node (worker/manager). -- **Availability** - Availability of the node (active/pause/drain). - - -**Status codes**: - -- **200** – no error -- **404** – no such node -- **406** – node is not part of a swarm -- **500** – server error - -### 3.8 Swarm - -#### Inspect swarm - - -`GET /swarm` - -Inspect swarm - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - { - "CreatedAt" : "2016-08-15T16:00:20.349727406Z", - "Spec" : { - "Dispatcher" : { - "HeartbeatPeriod" : 5000000000 - }, - "Orchestration" : { - "TaskHistoryRetentionLimit" : 10 - }, - "CAConfig" : { - "NodeCertExpiry" : 7776000000000000 - }, - "Raft" : { - "LogEntriesForSlowFollowers" : 500, - "HeartbeatTick" : 1, - "SnapshotInterval" : 10000, - "ElectionTick" : 3 - }, - "TaskDefaults" : {}, - "Name" : "default" - }, - "JoinTokens" : { - "Worker" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-6qmn92w6bu3jdvnglku58u11a", - "Manager" : "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-8llk83c4wm9lwioey2s316r9l" - }, - "ID" : "70ilmkj2f6sp2137c753w2nmt", - "UpdatedAt" : "2016-08-15T16:32:09.623207604Z", - "Version" : { - "Index" : 51 - } - } - -**Status codes**: - -- **200** - no error -- **406** – node is not part of a swarm -- **500** - sever error - -#### Initialize a new swarm - - -`POST /swarm/init` - -Initialize a new swarm. The body of the HTTP response includes the node ID. - -**Example request**: - - POST /v1.24/swarm/init HTTP/1.1 - Content-Type: application/json - - { - "ListenAddr": "0.0.0.0:2377", - "AdvertiseAddr": "192.168.1.1:2377", - "ForceNewCluster": false, - "Spec": { - "Orchestration": {}, - "Raft": {}, - "Dispatcher": {}, - "CAConfig": {} - } - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 28 - Content-Type: application/json - Date: Thu, 01 Sep 2016 21:49:13 GMT - Server: Docker/1.12.0 (linux) - - "7v2t30z9blmxuhnyo6s4cpenp" - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **406** – node is already part of a swarm -- **500** - server error - -JSON Parameters: - -- **ListenAddr** – Listen address used for inter-manager communication, as well as determining - the networking interface used for the VXLAN Tunnel Endpoint (VTEP). This can either be an - address/port combination in the form `192.168.1.1:4567`, or an interface followed by a port - number, like `eth0:4567`. If the port number is omitted, the default swarm listening port is - used. -- **AdvertiseAddr** – Externally reachable address advertised to other nodes. This can either be - an address/port combination in the form `192.168.1.1:4567`, or an interface followed by a port - number, like `eth0:4567`. If the port number is omitted, the port number from the listen - address is used. If `AdvertiseAddr` is not specified, it will be automatically detected when - possible. -- **ForceNewCluster** – Force creation of a new swarm. -- **Spec** – Configuration settings for the new swarm. - - **Orchestration** – Configuration settings for the orchestration aspects of the swarm. - - **TaskHistoryRetentionLimit** – Maximum number of tasks history stored. - - **Raft** – Raft related configuration. - - **SnapshotInterval** – Number of logs entries between snapshot. - - **KeepOldSnapshots** – Number of snapshots to keep beyond the current snapshot. - - **LogEntriesForSlowFollowers** – Number of log entries to keep around to sync up slow - followers after a snapshot is created. - - **HeartbeatTick** – Amount of ticks (in seconds) between each heartbeat. - - **ElectionTick** – Amount of ticks (in seconds) needed without a leader to trigger a new - election. - - **Dispatcher** – Configuration settings for the task dispatcher. - - **HeartbeatPeriod** – The delay for an agent to send a heartbeat to the dispatcher. - - **CAConfig** – Certificate authority configuration. - - **NodeCertExpiry** – Automatic expiry for nodes certificates. - - **ExternalCA** - Configuration for forwarding signing requests to an external - certificate authority. - - **Protocol** - Protocol for communication with the external CA - (currently only "cfssl" is supported). - - **URL** - URL where certificate signing requests should be sent. - - **Options** - An object with key/value pairs that are interpreted - as protocol-specific options for the external CA driver. - -#### Join an existing swarm - -`POST /swarm/join` - -Join an existing swarm - -**Example request**: - - POST /v1.24/swarm/join HTTP/1.1 - Content-Type: application/json - - { - "ListenAddr": "0.0.0.0:2377", - "AdvertiseAddr": "192.168.1.1:2377", - "RemoteAddrs": ["node1:2377"], - "JoinToken": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2" - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **406** – node is already part of a swarm -- **500** - server error - -JSON Parameters: - -- **ListenAddr** – Listen address used for inter-manager communication if the node gets promoted to - manager, as well as determining the networking interface used for the VXLAN Tunnel Endpoint (VTEP). -- **AdvertiseAddr** – Externally reachable address advertised to other nodes. This can either be - an address/port combination in the form `192.168.1.1:4567`, or an interface followed by a port - number, like `eth0:4567`. If the port number is omitted, the port number from the listen - address is used. If `AdvertiseAddr` is not specified, it will be automatically detected when - possible. -- **RemoteAddr** – Address of any manager node already participating in the swarm. -- **JoinToken** – Secret token for joining this swarm. - -#### Leave a swarm - - -`POST /swarm/leave` - -Leave a swarm - -**Example request**: - - POST /v1.24/swarm/leave HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **force** - Boolean (0/1, false/true). Force leave swarm, even if this is the last manager or that it will break the cluster. - -**Status codes**: - -- **200** – no error -- **406** – node is not part of a swarm -- **500** - server error - -#### Update a swarm - - -`POST /swarm/update` - -Update a swarm - -**Example request**: - - POST /v1.24/swarm/update HTTP/1.1 - - { - "Name": "default", - "Orchestration": { - "TaskHistoryRetentionLimit": 10 - }, - "Raft": { - "SnapshotInterval": 10000, - "LogEntriesForSlowFollowers": 500, - "HeartbeatTick": 1, - "ElectionTick": 3 - }, - "Dispatcher": { - "HeartbeatPeriod": 5000000000 - }, - "CAConfig": { - "NodeCertExpiry": 7776000000000000 - }, - "JoinTokens": { - "Worker": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx", - "Manager": "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2" - } - } - - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Query parameters**: - -- **version** – The version number of the swarm object being updated. This is - required to avoid conflicting writes. -- **rotateWorkerToken** - Set to `true` (or `1`) to rotate the worker join token. -- **rotateManagerToken** - Set to `true` (or `1`) to rotate the manager join token. - -**Status codes**: - -- **200** – no error -- **400** – bad parameter -- **406** – node is not part of a swarm -- **500** - server error - -JSON Parameters: - -- **Orchestration** – Configuration settings for the orchestration aspects of the swarm. - - **TaskHistoryRetentionLimit** – Maximum number of tasks history stored. -- **Raft** – Raft related configuration. - - **SnapshotInterval** – Number of logs entries between snapshot. - - **KeepOldSnapshots** – Number of snapshots to keep beyond the current snapshot. - - **LogEntriesForSlowFollowers** – Number of log entries to keep around to sync up slow - followers after a snapshot is created. - - **HeartbeatTick** – Amount of ticks (in seconds) between each heartbeat. - - **ElectionTick** – Amount of ticks (in seconds) needed without a leader to trigger a new - election. -- **Dispatcher** – Configuration settings for the task dispatcher. - - **HeartbeatPeriod** – The delay for an agent to send a heartbeat to the dispatcher. -- **CAConfig** – CA configuration. - - **NodeCertExpiry** – Automatic expiry for nodes certificates. - - **ExternalCA** - Configuration for forwarding signing requests to an external - certificate authority. - - **Protocol** - Protocol for communication with the external CA - (currently only "cfssl" is supported). - - **URL** - URL where certificate signing requests should be sent. - - **Options** - An object with key/value pairs that are interpreted - as protocol-specific options for the external CA driver. -- **JoinTokens** - Tokens that can be used by other nodes to join the swarm. - - **Worker** - Token to use for joining as a worker. - - **Manager** - Token to use for joining as a manager. - -### 3.9 Services - -**Note**: Service operations require to first be part of a swarm. - -#### List services - - -`GET /services` - -List services - -**Example request**: - - GET /v1.24/services HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Type: application/json - - [ - { - "ID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Version": { - "Index": 19 - }, - "CreatedAt": "2016-06-07T21:05:51.880065305Z", - "UpdatedAt": "2016-06-07T21:07:29.962229872Z", - "Spec": { - "Name": "hopeful_cori", - "TaskTemplate": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": { - "Constraints": [ - "node.role == worker" - ] - } - }, - "Mode": { - "Replicated": { - "Replicas": 1 - } - }, - "UpdateConfig": { - "Parallelism": 1, - "FailureAction": "pause" - }, - "EndpointSpec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - } - }, - "Endpoint": { - "Spec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - }, - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ], - "VirtualIPs": [ - { - "NetworkID": "4qvuz4ko70xaltuqbt8956gd1", - "Addr": "10.255.0.2/16" - }, - { - "NetworkID": "4qvuz4ko70xaltuqbt8956gd1", - "Addr": "10.255.0.3/16" - } - ] - } - } - ] - -**Query parameters**: - -- **filters** – a JSON encoded value of the filters (a `map[string][]string`) to process on the - services list. Available filters: - - `id=` - - `label=` - - `name=` - -**Status codes**: - -- **200** – no error -- **406** – node is not part of a swarm -- **500** – server error - -#### Create a service - -`POST /services/create` - -Create a service. When using this endpoint to create a service using a private -repository from the registry, the `X-Registry-Auth` header must be used to -include a base64-encoded AuthConfig object. Refer to the [create an -image](#create-an-image) section for more details. - -**Example request**: - - POST /v1.24/services/create HTTP/1.1 - Content-Type: application/json - - { - "Name": "web", - "TaskTemplate": { - "ContainerSpec": { - "Image": "nginx:alpine", - "Mounts": [ - { - "ReadOnly": true, - "Source": "web-data", - "Target": "/usr/share/nginx/html", - "Type": "volume", - "VolumeOptions": { - "DriverConfig": { - }, - "Labels": { - "com.example.something": "something-value" - } - } - } - ], - "User": "33" - }, - "Networks": [ - { - "Target": "overlay1" - } - ], - "LogDriver": { - "Name": "json-file", - "Options": { - "max-file": "3", - "max-size": "10M" - } - }, - "Placement": { - "Constraints": [ - "node.role == worker" - ] - }, - "Resources": { - "Limits": { - "MemoryBytes": 104857600 - }, - "Reservations": { - } - }, - "RestartPolicy": { - "Condition": "on-failure", - "Delay": 10000000000, - "MaxAttempts": 10 - } - }, - "Mode": { - "Replicated": { - "Replicas": 4 - } - }, - "UpdateConfig": { - "Delay": 30000000000, - "Parallelism": 2, - "FailureAction": "pause" - }, - "EndpointSpec": { - "Ports": [ - { - "Protocol": "tcp", - "PublishedPort": 8080, - "TargetPort": 80 - } - ] - }, - "Labels": { - "foo": "bar" - } - } - -**Example response**: - - HTTP/1.1 201 Created - Content-Type: application/json - - { - "ID":"ak7w3gjqoa3kuz8xcpnyy0pvl" - } - -**Status codes**: - -- **201** – no error -- **403** - network is not eligible for services -- **406** – node is not part of a swarm -- **409** – name conflicts with an existing object -- **500** - server error - -**JSON Parameters**: - -- **Name** – User-defined name for the service. -- **Labels** – A map of labels to associate with the service (e.g., `{"key":"value", "key2":"value2"}`). -- **TaskTemplate** – Specification of the tasks to start as part of the new service. - - **ContainerSpec** - Container settings for containers started as part of this task. - - **Image** – A string specifying the image name to use for the container. - - **Command** – The command to be run in the image. - - **Args** – Arguments to the command. - - **Env** – A list of environment variables in the form of `["VAR=value"[,"VAR2=value2"]]`. - - **Dir** – A string specifying the working directory for commands to run in. - - **User** – A string value specifying the user inside the container. - - **Labels** – A map of labels to associate with the service (e.g., - `{"key":"value", "key2":"value2"}`). - - **Mounts** – Specification for mounts to be added to containers - created as part of the service. - - **Target** – Container path. - - **Source** – Mount source (e.g. a volume name, a host path). - - **Type** – The mount type (`bind`, or `volume`). - - **ReadOnly** – A boolean indicating whether the mount should be read-only. - - **BindOptions** - Optional configuration for the `bind` type. - - **Propagation** – A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`. - - **VolumeOptions** – Optional configuration for the `volume` type. - - **NoCopy** – A boolean indicating if volume should be - populated with the data from the target. (Default false) - - **Labels** – User-defined name and labels for the volume. - - **DriverConfig** – Map of driver-specific options. - - **Name** - Name of the driver to use to create the volume. - - **Options** - key/value map of driver specific options. - - **StopGracePeriod** – Amount of time to wait for the container to terminate before - forcefully killing it. - - **LogDriver** - Log configuration for containers created as part of the - service. - - **Name** - Name of the logging driver to use (`json-file`, `syslog`, - `journald`, `gelf`, `fluentd`, `awslogs`, `splunk`, `etwlogs`, `none`). - - **Options** - Driver-specific options. - - **Resources** – Resource requirements which apply to each individual container created as part - of the service. - - **Limits** – Define resources limits. - - **NanoCPUs** – CPU limit in units of 10-9 CPU shares. - - **MemoryBytes** – Memory limit in Bytes. - - **Reservation** – Define resources reservation. - - **NanoCPUs** – CPU reservation in units of 10-9 CPU shares. - - **MemoryBytes** – Memory reservation in Bytes. - - **RestartPolicy** – Specification for the restart policy which applies to containers created - as part of this service. - - **Condition** – Condition for restart (`none`, `on-failure`, or `any`). - - **Delay** – Delay between restart attempts. - - **Attempts** – Maximum attempts to restart a given container before giving up (default value - is 0, which is ignored). - - **Window** – Windows is the time window used to evaluate the restart policy (default value is - 0, which is unbounded). - - **Placement** – Restrictions on where a service can run. - - **Constraints** – An array of constraints, e.g. `[ "node.role == manager" ]`. -- **Mode** – Scheduling mode for the service (`replicated` or `global`, defaults to `replicated`). -- **UpdateConfig** – Specification for the update strategy of the service. - - **Parallelism** – Maximum number of tasks to be updated in one iteration (0 means unlimited - parallelism). - - **Delay** – Amount of time between updates. - - **FailureAction** - Action to take if an updated task fails to run, or stops running during the - update. Values are `continue` and `pause`. -- **Networks** – Array of network names or IDs to attach the service to. -- **EndpointSpec** – Properties that can be configured to access and load balance a service. - - **Mode** – The mode of resolution to use for internal load balancing - between tasks (`vip` or `dnsrr`). Defaults to `vip` if not provided. - - **Ports** – List of exposed ports that this service is accessible on from - the outside, in the form of: - `{"Protocol": <"tcp"|"udp">, "PublishedPort": , "TargetPort": }`. - Ports can only be provided if `vip` resolution mode is used. - -**Request Headers**: - -- **Content-type** – Set to `"application/json"`. -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either - login information, or a token. Refer to the [create an image](#create-an-image) - section for more details. - - -#### Remove a service - - -`DELETE /services/(id or name)` - -Stop and remove the service `id` - -**Example request**: - - DELETE /v1.24/services/16253994b7c4 HTTP/1.1 - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**Status codes**: - -- **200** – no error -- **404** – no such service -- **406** - node is not part of a swarm -- **500** – server error - -#### Inspect one or more services - - -`GET /services/(id or name)` - -Return information on the service `id`. - -**Example request**: - - GET /v1.24/services/1cb4dnqcyx6m66g2t538x3rxha HTTP/1.1 - -**Example response**: - - { - "ID": "ak7w3gjqoa3kuz8xcpnyy0pvl", - "Version": { - "Index": 95 - }, - "CreatedAt": "2016-06-07T21:10:20.269723157Z", - "UpdatedAt": "2016-06-07T21:10:20.276301259Z", - "Spec": { - "Name": "redis", - "TaskTemplate": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "Mode": { - "Replicated": { - "Replicas": 1 - } - }, - "UpdateConfig": { - "Parallelism": 1, - "FailureAction": "pause" - }, - "EndpointSpec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - } - }, - "Endpoint": { - "Spec": { - "Mode": "vip", - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ] - }, - "Ports": [ - { - "Protocol": "tcp", - "TargetPort": 6379, - "PublishedPort": 30001 - } - ], - "VirtualIPs": [ - { - "NetworkID": "4qvuz4ko70xaltuqbt8956gd1", - "Addr": "10.255.0.4/16" - } - ] - } - } - -**Status codes**: - -- **200** – no error -- **404** – no such service -- **406** - node is not part of a swarm -- **500** – server error - -#### Update a service - -`POST /services/(id or name)/update` - -Update a service. When using this endpoint to create a service using a -private repository from the registry, the `X-Registry-Auth` header can be used -to update the authentication information for that is stored for the service. -The header contains a base64-encoded AuthConfig object. Refer to the [create an -image](#create-an-image) section for more details. - -**Example request**: - - POST /v1.24/services/1cb4dnqcyx6m66g2t538x3rxha/update?version=23 HTTP/1.1 - Content-Type: application/json - - { - "Name": "top", - "TaskTemplate": { - "ContainerSpec": { - "Image": "busybox", - "Args": [ - "top" - ] - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "Mode": { - "Replicated": { - "Replicas": 1 - } - }, - "UpdateConfig": { - "Parallelism": 1 - }, - "EndpointSpec": { - "Mode": "vip" - } - } - -**Example response**: - - HTTP/1.1 200 OK - Content-Length: 0 - Content-Type: text/plain; charset=utf-8 - -**JSON Parameters**: - -- **Name** – User-defined name for the service. Note that renaming services is not supported. -- **Labels** – A map of labels to associate with the service (e.g., `{"key":"value", "key2":"value2"}`). -- **TaskTemplate** – Specification of the tasks to start as part of the new service. - - **ContainerSpec** - Container settings for containers started as part of this task. - - **Image** – A string specifying the image name to use for the container. - - **Command** – The command to be run in the image. - - **Args** – Arguments to the command. - - **Env** – A list of environment variables in the form of `["VAR=value"[,"VAR2=value2"]]`. - - **Dir** – A string specifying the working directory for commands to run in. - - **User** – A string value specifying the user inside the container. - - **Labels** – A map of labels to associate with the service (e.g., - `{"key":"value", "key2":"value2"}`). - - **Mounts** – Specification for mounts to be added to containers created as part of the new - service. - - **Target** – Container path. - - **Source** – Mount source (e.g. a volume name, a host path). - - **Type** – The mount type (`bind`, or `volume`). - - **ReadOnly** – A boolean indicating whether the mount should be read-only. - - **BindOptions** - Optional configuration for the `bind` type - - **Propagation** – A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`. - - **VolumeOptions** – Optional configuration for the `volume` type. - - **NoCopy** – A boolean indicating if volume should be - populated with the data from the target. (Default false) - - **Labels** – User-defined name and labels for the volume. - - **DriverConfig** – Map of driver-specific options. - - **Name** - Name of the driver to use to create the volume - - **Options** - key/value map of driver specific options - - **StopGracePeriod** – Amount of time to wait for the container to terminate before - forcefully killing it. - - **Resources** – Resource requirements which apply to each individual container created as part - of the service. - - **Limits** – Define resources limits. - - **CPU** – CPU limit - - **Memory** – Memory limit - - **Reservation** – Define resources reservation. - - **CPU** – CPU reservation - - **Memory** – Memory reservation - - **RestartPolicy** – Specification for the restart policy which applies to containers created - as part of this service. - - **Condition** – Condition for restart (`none`, `on-failure`, or `any`). - - **Delay** – Delay between restart attempts. - - **MaxAttempts** – Maximum attempts to restart a given container before giving up (default value - is 0, which is ignored). - - **Window** – Windows is the time window used to evaluate the restart policy (default value is - 0, which is unbounded). - - **Placement** – Restrictions on where a service can run. - - **Constraints** – An array of constraints, e.g. `[ "node.role == manager" ]`. -- **Mode** – Scheduling mode for the service (`replicated` or `global`, defaults to `replicated`). -- **UpdateConfig** – Specification for the update strategy of the service. - - **Parallelism** – Maximum number of tasks to be updated in one iteration (0 means unlimited - parallelism). - - **Delay** – Amount of time between updates. -- **Networks** – Array of network names or IDs to attach the service to. -- **EndpointSpec** – Properties that can be configured to access and load balance a service. - - **Mode** – The mode of resolution to use for internal load balancing - between tasks (`vip` or `dnsrr`). Defaults to `vip` if not provided. - - **Ports** – List of exposed ports that this service is accessible on from - the outside, in the form of: - `{"Protocol": <"tcp"|"udp">, "PublishedPort": , "TargetPort": }`. - Ports can only be provided if `vip` resolution mode is used. - -**Query parameters**: - -- **version** – The version number of the service object being updated. This is - required to avoid conflicting writes. - -**Request Headers**: - -- **Content-type** – Set to `"application/json"`. -- **X-Registry-Auth** – base64-encoded AuthConfig object, containing either - login information, or a token. Refer to the [create an image](#create-an-image) - section for more details. - -**Status codes**: - -- **200** – no error -- **404** – no such service -- **406** - node is not part of a swarm -- **500** – server error - -### 3.10 Tasks - -**Note**: Task operations require the engine to be part of a swarm. - -#### List tasks - - -`GET /tasks` - -List tasks - -**Example request**: - - GET /v1.24/tasks HTTP/1.1 - -**Example response**: - - [ - { - "ID": "0kzzo1i0y4jz6027t0k7aezc7", - "Version": { - "Index": 71 - }, - "CreatedAt": "2016-06-07T21:07:31.171892745Z", - "UpdatedAt": "2016-06-07T21:07:31.376370513Z", - "Spec": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Slot": 1, - "NodeID": "60gvrl6tm78dmak4yl7srz94v", - "Status": { - "Timestamp": "2016-06-07T21:07:31.290032978Z", - "State": "running", - "Message": "started", - "ContainerStatus": { - "ContainerID": "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035", - "PID": 677 - } - }, - "DesiredState": "running", - "NetworksAttachments": [ - { - "Network": { - "ID": "4qvuz4ko70xaltuqbt8956gd1", - "Version": { - "Index": 18 - }, - "CreatedAt": "2016-06-07T20:31:11.912919752Z", - "UpdatedAt": "2016-06-07T21:07:29.955277358Z", - "Spec": { - "Name": "ingress", - "Labels": { - "com.docker.swarm.internal": "true" - }, - "DriverConfiguration": {}, - "IPAMOptions": { - "Driver": {}, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "DriverState": { - "Name": "overlay", - "Options": { - "com.docker.network.driver.overlay.vxlanid_list": "256" - } - }, - "IPAMOptions": { - "Driver": { - "Name": "default" - }, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "Addresses": [ - "10.255.0.10/16" - ] - } - ], - }, - { - "ID": "1yljwbmlr8er2waf8orvqpwms", - "Version": { - "Index": 30 - }, - "CreatedAt": "2016-06-07T21:07:30.019104782Z", - "UpdatedAt": "2016-06-07T21:07:30.231958098Z", - "Name": "hopeful_cori", - "Spec": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Slot": 1, - "NodeID": "60gvrl6tm78dmak4yl7srz94v", - "Status": { - "Timestamp": "2016-06-07T21:07:30.202183143Z", - "State": "shutdown", - "Message": "shutdown", - "ContainerStatus": { - "ContainerID": "1cf8d63d18e79668b0004a4be4c6ee58cddfad2dae29506d8781581d0688a213" - } - }, - "DesiredState": "shutdown", - "NetworksAttachments": [ - { - "Network": { - "ID": "4qvuz4ko70xaltuqbt8956gd1", - "Version": { - "Index": 18 - }, - "CreatedAt": "2016-06-07T20:31:11.912919752Z", - "UpdatedAt": "2016-06-07T21:07:29.955277358Z", - "Spec": { - "Name": "ingress", - "Labels": { - "com.docker.swarm.internal": "true" - }, - "DriverConfiguration": {}, - "IPAMOptions": { - "Driver": {}, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "DriverState": { - "Name": "overlay", - "Options": { - "com.docker.network.driver.overlay.vxlanid_list": "256" - } - }, - "IPAMOptions": { - "Driver": { - "Name": "default" - }, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "Addresses": [ - "10.255.0.5/16" - ] - } - ] - } - ] - -**Query parameters**: - -- **filters** – a JSON encoded value of the filters (a `map[string][]string`) to process on the - services list. Available filters: - - `id=` - - `name=` - - `service=` - - `node=` - - `label=key` or `label="key=value"` - - `desired-state=(running | shutdown | accepted)` - -**Status codes**: - -- **200** – no error -- **406** - node is not part of a swarm -- **500** – server error - -#### Inspect a task - - -`GET /tasks/(id)` - -Get details on the task `id` - -**Example request**: - - GET /v1.24/tasks/0kzzo1i0y4jz6027t0k7aezc7 HTTP/1.1 - -**Example response**: - - { - "ID": "0kzzo1i0y4jz6027t0k7aezc7", - "Version": { - "Index": 71 - }, - "CreatedAt": "2016-06-07T21:07:31.171892745Z", - "UpdatedAt": "2016-06-07T21:07:31.376370513Z", - "Spec": { - "ContainerSpec": { - "Image": "redis" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "ServiceID": "9mnpnzenvg8p8tdbtq4wvbkcz", - "Slot": 1, - "NodeID": "60gvrl6tm78dmak4yl7srz94v", - "Status": { - "Timestamp": "2016-06-07T21:07:31.290032978Z", - "State": "running", - "Message": "started", - "ContainerStatus": { - "ContainerID": "e5d62702a1b48d01c3e02ca1e0212a250801fa8d67caca0b6f35919ebc12f035", - "PID": 677 - } - }, - "DesiredState": "running", - "NetworksAttachments": [ - { - "Network": { - "ID": "4qvuz4ko70xaltuqbt8956gd1", - "Version": { - "Index": 18 - }, - "CreatedAt": "2016-06-07T20:31:11.912919752Z", - "UpdatedAt": "2016-06-07T21:07:29.955277358Z", - "Spec": { - "Name": "ingress", - "Labels": { - "com.docker.swarm.internal": "true" - }, - "DriverConfiguration": {}, - "IPAMOptions": { - "Driver": {}, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "DriverState": { - "Name": "overlay", - "Options": { - "com.docker.network.driver.overlay.vxlanid_list": "256" - } - }, - "IPAMOptions": { - "Driver": { - "Name": "default" - }, - "Configs": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - } - }, - "Addresses": [ - "10.255.0.10/16" - ] - } - ] - } - -**Status codes**: - -- **200** – no error -- **404** – unknown task -- **406** - node is not part of a swarm -- **500** – server error - -## 4. Going further - -### 4.1 Inside `docker run` - -As an example, the `docker run` command line makes the following API calls: - -- Create the container - -- If the status code is 404, it means the image doesn't exist: - - Try to pull it. - - Then, retry to create the container. - -- Start the container. - -- If you are not in detached mode: -- Attach to the container, using `logs=1` (to have `stdout` and - `stderr` from the container's start) and `stream=1` - -- If in detached mode or only `stdin` is attached, display the container's id. - -### 4.2 Hijacking - -In this version of the API, `/attach`, uses hijacking to transport `stdin`, -`stdout`, and `stderr` on the same socket. - -To hint potential proxies about connection hijacking, Docker client sends -connection upgrade headers similarly to websocket. - - Upgrade: tcp - Connection: Upgrade - -When Docker daemon detects the `Upgrade` header, it switches its status code -from **200 OK** to **101 UPGRADED** and resends the same headers. - - -### 4.3 CORS Requests - -To set cross origin requests to the Engine API please give values to -`--api-cors-header` when running Docker in daemon mode. Set * (asterisk) allows all, -default or blank means CORS disabled - - $ dockerd -H="192.168.1.9:2375" --api-cors-header="http://foo.bar" diff --git a/vendor/github.com/docker/docker/docs/api/version-history.md b/vendor/github.com/docker/docker/docs/api/version-history.md deleted file mode 100644 index 4363cfbd7..000000000 --- a/vendor/github.com/docker/docker/docs/api/version-history.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -title: "Engine API version history" -description: "Documentation of changes that have been made to Engine API." -keywords: "API, Docker, rcli, REST, documentation" ---- - - - -## v1.26 API changes - -[Docker Engine API v1.26](https://docs.docker.com/engine/api/v1.26/) documentation - -* `POST /plugins/(plugin name)/upgrade` upgrade a plugin. - -## v1.25 API changes - -[Docker Engine API v1.25](https://docs.docker.com/engine/api/v1.25/) documentation - -* The API version is now required in all API calls. Instead of just requesting, for example, the URL `/containers/json`, you must now request `/v1.25/containers/json`. -* `GET /version` now returns `MinAPIVersion`. -* `POST /build` accepts `networkmode` parameter to specify network used during build. -* `GET /images/(name)/json` now returns `OsVersion` if populated -* `GET /info` now returns `Isolation`. -* `POST /containers/create` now takes `AutoRemove` in HostConfig, to enable auto-removal of the container on daemon side when the container's process exits. -* `GET /containers/json` and `GET /containers/(id or name)/json` now return `"removing"` as a value for the `State.Status` field if the container is being removed. Previously, "exited" was returned as status. -* `GET /containers/json` now accepts `removing` as a valid value for the `status` filter. -* `GET /containers/json` now supports filtering containers by `health` status. -* `DELETE /volumes/(name)` now accepts a `force` query parameter to force removal of volumes that were already removed out of band by the volume driver plugin. -* `POST /containers/create/` and `POST /containers/(name)/update` now validates restart policies. -* `POST /containers/create` now validates IPAMConfig in NetworkingConfig, and returns error for invalid IPv4 and IPv6 addresses (`--ip` and `--ip6` in `docker create/run`). -* `POST /containers/create` now takes a `Mounts` field in `HostConfig` which replaces `Binds`, `Volumes`, and `Tmpfs`. *note*: `Binds`, `Volumes`, and `Tmpfs` are still available and can be combined with `Mounts`. -* `POST /build` now performs a preliminary validation of the `Dockerfile` before starting the build, and returns an error if the syntax is incorrect. Note that this change is _unversioned_ and applied to all API versions. -* `POST /build` accepts `cachefrom` parameter to specify images used for build cache. -* `GET /networks/` endpoint now correctly returns a list of *all* networks, - instead of the default network if a trailing slash is provided, but no `name` - or `id`. -* `DELETE /containers/(name)` endpoint now returns an error of `removal of container name is already in progress` with status code of 400, when container name is in a state of removal in progress. -* `GET /containers/json` now supports a `is-task` filter to filter - containers that are tasks (part of a service in swarm mode). -* `POST /containers/create` now takes `StopTimeout` field. -* `POST /services/create` and `POST /services/(id or name)/update` now accept `Monitor` and `MaxFailureRatio` parameters, which control the response to failures during service updates. -* `POST /services/(id or name)/update` now accepts a `ForceUpdate` parameter inside the `TaskTemplate`, which causes the service to be updated even if there are no changes which would ordinarily trigger an update. -* `POST /services/create` and `POST /services/(id or name)/update` now return a `Warnings` array. -* `GET /networks/(name)` now returns field `Created` in response to show network created time. -* `POST /containers/(id or name)/exec` now accepts an `Env` field, which holds a list of environment variables to be set in the context of the command execution. -* `GET /volumes`, `GET /volumes/(name)`, and `POST /volumes/create` now return the `Options` field which holds the driver specific options to use for when creating the volume. -* `GET /exec/(id)/json` now returns `Pid`, which is the system pid for the exec'd process. -* `POST /containers/prune` prunes stopped containers. -* `POST /images/prune` prunes unused images. -* `POST /volumes/prune` prunes unused volumes. -* `POST /networks/prune` prunes unused networks. -* Every API response now includes a `Docker-Experimental` header specifying if experimental features are enabled (value can be `true` or `false`). -* Every API response now includes a `API-Version` header specifying the default API version of the server. -* The `hostConfig` option now accepts the fields `CpuRealtimePeriod` and `CpuRtRuntime` to allocate cpu runtime to rt tasks when `CONFIG_RT_GROUP_SCHED` is enabled in the kernel. -* The `SecurityOptions` field within the `GET /info` response now includes `userns` if user namespaces are enabled in the daemon. -* `GET /nodes` and `GET /node/(id or name)` now return `Addr` as part of a node's `Status`, which is the address that that node connects to the manager from. -* The `HostConfig` field now includes `NanoCPUs` that represents CPU quota in units of 10-9 CPUs. -* `GET /info` now returns more structured information about security options. -* The `HostConfig` field now includes `CpuCount` that represents the number of CPUs available for execution by the container. Windows daemon only. -* `POST /services/create` and `POST /services/(id or name)/update` now accept the `TTY` parameter, which allocate a pseudo-TTY in container. -* `POST /services/create` and `POST /services/(id or name)/update` now accept the `DNSConfig` parameter, which specifies DNS related configurations in resolver configuration file (resolv.conf) through `Nameservers`, `Search`, and `Options`. -* `GET /networks/(id or name)` now includes IP and name of all peers nodes for swarm mode overlay networks. -* `GET /plugins` list plugins. -* `POST /plugins/pull?name=` pulls a plugin. -* `GET /plugins/(plugin name)` inspect a plugin. -* `POST /plugins/(plugin name)/set` configure a plugin. -* `POST /plugins/(plugin name)/enable` enable a plugin. -* `POST /plugins/(plugin name)/disable` disable a plugin. -* `POST /plugins/(plugin name)/push` push a plugin. -* `POST /plugins/create?name=(plugin name)` create a plugin. -* `DELETE /plugins/(plugin name)` delete a plugin. -* `POST /node/(id or name)/update` now accepts both `id` or `name` to identify the node to update. -* `GET /images/json` now support a `reference` filter. -* `GET /secrets` returns information on the secrets. -* `POST /secrets/create` creates a secret. -* `DELETE /secrets/{id}` removes the secret `id`. -* `GET /secrets/{id}` returns information on the secret `id`. -* `POST /secrets/{id}/update` updates the secret `id`. - -## v1.24 API changes - -[Docker Engine API v1.24](v1.24.md) documentation - -* `POST /containers/create` now takes `StorageOpt` field. -* `GET /info` now returns `SecurityOptions` field, showing if `apparmor`, `seccomp`, or `selinux` is supported. -* `GET /info` no longer returns the `ExecutionDriver` property. This property was no longer used after integration - with ContainerD in Docker 1.11. -* `GET /networks` now supports filtering by `label` and `driver`. -* `GET /containers/json` now supports filtering containers by `network` name or id. -* `POST /containers/create` now takes `IOMaximumBandwidth` and `IOMaximumIOps` fields. Windows daemon only. -* `POST /containers/create` now returns an HTTP 400 "bad parameter" message - if no command is specified (instead of an HTTP 500 "server error") -* `GET /images/search` now takes a `filters` query parameter. -* `GET /events` now supports a `reload` event that is emitted when the daemon configuration is reloaded. -* `GET /events` now supports filtering by daemon name or ID. -* `GET /events` now supports a `detach` event that is emitted on detaching from container process. -* `GET /events` now supports an `exec_detach ` event that is emitted on detaching from exec process. -* `GET /images/json` now supports filters `since` and `before`. -* `POST /containers/(id or name)/start` no longer accepts a `HostConfig`. -* `POST /images/(name)/tag` no longer has a `force` query parameter. -* `GET /images/search` now supports maximum returned search results `limit`. -* `POST /containers/{name:.*}/copy` is now removed and errors out starting from this API version. -* API errors are now returned as JSON instead of plain text. -* `POST /containers/create` and `POST /containers/(id)/start` allow you to configure kernel parameters (sysctls) for use in the container. -* `POST /containers//exec` and `POST /exec//start` - no longer expects a "Container" field to be present. This property was not used - and is no longer sent by the docker client. -* `POST /containers/create/` now validates the hostname (should be a valid RFC 1123 hostname). -* `POST /containers/create/` `HostConfig.PidMode` field now accepts `container:`, - to have the container join the PID namespace of an existing container. - -## v1.23 API changes - -[Docker Engine API v1.23](v1.23.md) documentation - -* `GET /containers/json` returns the state of the container, one of `created`, `restarting`, `running`, `paused`, `exited` or `dead`. -* `GET /containers/json` returns the mount points for the container. -* `GET /networks/(name)` now returns an `Internal` field showing whether the network is internal or not. -* `GET /networks/(name)` now returns an `EnableIPv6` field showing whether the network has ipv6 enabled or not. -* `POST /containers/(name)/update` now supports updating container's restart policy. -* `POST /networks/create` now supports enabling ipv6 on the network by setting the `EnableIPv6` field (doing this with a label will no longer work). -* `GET /info` now returns `CgroupDriver` field showing what cgroup driver the daemon is using; `cgroupfs` or `systemd`. -* `GET /info` now returns `KernelMemory` field, showing if "kernel memory limit" is supported. -* `POST /containers/create` now takes `PidsLimit` field, if the kernel is >= 4.3 and the pids cgroup is supported. -* `GET /containers/(id or name)/stats` now returns `pids_stats`, if the kernel is >= 4.3 and the pids cgroup is supported. -* `POST /containers/create` now allows you to override usernamespaces remapping and use privileged options for the container. -* `POST /containers/create` now allows specifying `nocopy` for named volumes, which disables automatic copying from the container path to the volume. -* `POST /auth` now returns an `IdentityToken` when supported by a registry. -* `POST /containers/create` with both `Hostname` and `Domainname` fields specified will result in the container's hostname being set to `Hostname`, rather than `Hostname.Domainname`. -* `GET /volumes` now supports more filters, new added filters are `name` and `driver`. -* `GET /containers/(id or name)/logs` now accepts a `details` query parameter to stream the extra attributes that were provided to the containers `LogOpts`, such as environment variables and labels, with the logs. -* `POST /images/load` now returns progress information as a JSON stream, and has a `quiet` query parameter to suppress progress details. - -## v1.22 API changes - -[Docker Engine API v1.22](v1.22.md) documentation - -* `POST /container/(name)/update` updates the resources of a container. -* `GET /containers/json` supports filter `isolation` on Windows. -* `GET /containers/json` now returns the list of networks of containers. -* `GET /info` Now returns `Architecture` and `OSType` fields, providing information - about the host architecture and operating system type that the daemon runs on. -* `GET /networks/(name)` now returns a `Name` field for each container attached to the network. -* `GET /version` now returns the `BuildTime` field in RFC3339Nano format to make it - consistent with other date/time values returned by the API. -* `AuthConfig` now supports a `registrytoken` for token based authentication -* `POST /containers/create` now has a 4M minimum value limit for `HostConfig.KernelMemory` -* Pushes initiated with `POST /images/(name)/push` and pulls initiated with `POST /images/create` - will be cancelled if the HTTP connection making the API request is closed before - the push or pull completes. -* `POST /containers/create` now allows you to set a read/write rate limit for a - device (in bytes per second or IO per second). -* `GET /networks` now supports filtering by `name`, `id` and `type`. -* `POST /containers/create` now allows you to set the static IPv4 and/or IPv6 address for the container. -* `POST /networks/(id)/connect` now allows you to set the static IPv4 and/or IPv6 address for the container. -* `GET /info` now includes the number of containers running, stopped, and paused. -* `POST /networks/create` now supports restricting external access to the network by setting the `Internal` field. -* `POST /networks/(id)/disconnect` now includes a `Force` option to forcefully disconnect a container from network -* `GET /containers/(id)/json` now returns the `NetworkID` of containers. -* `POST /networks/create` Now supports an options field in the IPAM config that provides options - for custom IPAM plugins. -* `GET /networks/{network-id}` Now returns IPAM config options for custom IPAM plugins if any - are available. -* `GET /networks/` now returns subnets info for user-defined networks. -* `GET /info` can now return a `SystemStatus` field useful for returning additional information about applications - that are built on top of engine. - -## v1.21 API changes - -[Docker Engine API v1.21](v1.21.md) documentation - -* `GET /volumes` lists volumes from all volume drivers. -* `POST /volumes/create` to create a volume. -* `GET /volumes/(name)` get low-level information about a volume. -* `DELETE /volumes/(name)` remove a volume with the specified name. -* `VolumeDriver` was moved from `config` to `HostConfig` to make the configuration portable. -* `GET /images/(name)/json` now returns information about an image's `RepoTags` and `RepoDigests`. -* The `config` option now accepts the field `StopSignal`, which specifies the signal to use to kill a container. -* `GET /containers/(id)/stats` will return networking information respectively for each interface. -* The `HostConfig` option now includes the `DnsOptions` field to configure the container's DNS options. -* `POST /build` now optionally takes a serialized map of build-time variables. -* `GET /events` now includes a `timenano` field, in addition to the existing `time` field. -* `GET /events` now supports filtering by image and container labels. -* `GET /info` now lists engine version information and return the information of `CPUShares` and `Cpuset`. -* `GET /containers/json` will return `ImageID` of the image used by container. -* `POST /exec/(name)/start` will now return an HTTP 409 when the container is either stopped or paused. -* `POST /containers/create` now takes `KernelMemory` in HostConfig to specify kernel memory limit. -* `GET /containers/(name)/json` now accepts a `size` parameter. Setting this parameter to '1' returns container size information in the `SizeRw` and `SizeRootFs` fields. -* `GET /containers/(name)/json` now returns a `NetworkSettings.Networks` field, - detailing network settings per network. This field deprecates the - `NetworkSettings.Gateway`, `NetworkSettings.IPAddress`, - `NetworkSettings.IPPrefixLen`, and `NetworkSettings.MacAddress` fields, which - are still returned for backward-compatibility, but will be removed in a future version. -* `GET /exec/(id)/json` now returns a `NetworkSettings.Networks` field, - detailing networksettings per network. This field deprecates the - `NetworkSettings.Gateway`, `NetworkSettings.IPAddress`, - `NetworkSettings.IPPrefixLen`, and `NetworkSettings.MacAddress` fields, which - are still returned for backward-compatibility, but will be removed in a future version. -* The `HostConfig` option now includes the `OomScoreAdj` field for adjusting the - badness heuristic. This heuristic selects which processes the OOM killer kills - under out-of-memory conditions. - -## v1.20 API changes - -[Docker Engine API v1.20](v1.20.md) documentation - -* `GET /containers/(id)/archive` get an archive of filesystem content from a container. -* `PUT /containers/(id)/archive` upload an archive of content to be extracted to -an existing directory inside a container's filesystem. -* `POST /containers/(id)/copy` is deprecated in favor of the above `archive` -endpoint which can be used to download files and directories from a container. -* The `hostConfig` option now accepts the field `GroupAdd`, which specifies a -list of additional groups that the container process will run as. - -## v1.19 API changes - -[Docker Engine API v1.19](v1.19.md) documentation - -* When the daemon detects a version mismatch with the client, usually when -the client is newer than the daemon, an HTTP 400 is now returned instead -of a 404. -* `GET /containers/(id)/stats` now accepts `stream` bool to get only one set of stats and disconnect. -* `GET /containers/(id)/logs` now accepts a `since` timestamp parameter. -* `GET /info` The fields `Debug`, `IPv4Forwarding`, `MemoryLimit`, and -`SwapLimit` are now returned as boolean instead of as an int. In addition, the -end point now returns the new boolean fields `CpuCfsPeriod`, `CpuCfsQuota`, and -`OomKillDisable`. -* The `hostConfig` option now accepts the fields `CpuPeriod` and `CpuQuota` -* `POST /build` accepts `cpuperiod` and `cpuquota` options - -## v1.18 API changes - -[Docker Engine API v1.18](v1.18.md) documentation - -* `GET /version` now returns `Os`, `Arch` and `KernelVersion`. -* `POST /containers/create` and `POST /containers/(id)/start`allow you to set ulimit settings for use in the container. -* `GET /info` now returns `SystemTime`, `HttpProxy`,`HttpsProxy` and `NoProxy`. -* `GET /images/json` added a `RepoDigests` field to include image digest information. -* `POST /build` can now set resource constraints for all containers created for the build. -* `CgroupParent` can be passed in the host config to setup container cgroups under a specific cgroup. -* `POST /build` closing the HTTP request cancels the build -* `POST /containers/(id)/exec` includes `Warnings` field to response. diff --git a/vendor/github.com/docker/docker/docs/deprecated.md b/vendor/github.com/docker/docker/docs/deprecated.md deleted file mode 100644 index 1298370ba..000000000 --- a/vendor/github.com/docker/docker/docs/deprecated.md +++ /dev/null @@ -1,286 +0,0 @@ ---- -aliases: ["/engine/misc/deprecated/"] -title: "Deprecated Engine Features" -description: "Deprecated Features." -keywords: "docker, documentation, about, technology, deprecate" ---- - - - -# Deprecated Engine Features - -The following list of features are deprecated in Engine. -To learn more about Docker Engine's deprecation policy, -see [Feature Deprecation Policy](https://docs.docker.com/engine/#feature-deprecation-policy). - - -### Top-level network properties in NetworkSettings - -**Deprecated In Release: v1.13.0** - -**Target For Removal In Release: v1.16** - -When inspecting a container, `NetworkSettings` contains top-level information -about the default ("bridge") network; - -`EndpointID`, `Gateway`, `GlobalIPv6Address`, `GlobalIPv6PrefixLen`, `IPAddress`, -`IPPrefixLen`, `IPv6Gateway`, and `MacAddress`. - -These properties are deprecated in favor of per-network properties in -`NetworkSettings.Networks`. These properties were already "deprecated" in -docker 1.9, but kept around for backward compatibility. - -Refer to [#17538](https://github.com/docker/docker/pull/17538) for further -information. - -## `filter` param for `/images/json` endpoint -**Deprecated In Release: [v1.13.0](https://github.com/docker/docker/releases/tag/v1.13.0)** - -**Target For Removal In Release: v1.16** - -The `filter` param to filter the list of image by reference (name or name:tag) is now implemented as a regular filter, named `reference`. - -### `repository:shortid` image references -**Deprecated In Release: [v1.13.0](https://github.com/docker/docker/releases/tag/v1.13.0)** - -**Target For Removal In Release: v1.16** - -`repository:shortid` syntax for referencing images is very little used, collides with tag references can be confused with digest references. - -### `docker daemon` subcommand -**Deprecated In Release: [v1.13.0](https://github.com/docker/docker/releases/tag/v1.13.0)** - -**Target For Removal In Release: v1.16** - -The daemon is moved to a separate binary (`dockerd`), and should be used instead. - -### Duplicate keys with conflicting values in engine labels -**Deprecated In Release: [v1.13.0](https://github.com/docker/docker/releases/tag/v1.13.0)** - -**Target For Removal In Release: v1.16** - -Duplicate keys with conflicting values have been deprecated. A warning is displayed -in the output, and an error will be returned in the future. - -### `MAINTAINER` in Dockerfile -**Deprecated In Release: [v1.13.0](https://github.com/docker/docker/releases/tag/v1.13.0)** - -`MAINTAINER` was an early very limited form of `LABEL` which should be used instead. - -### API calls without a version -**Deprecated In Release: [v1.13.0](https://github.com/docker/docker/releases/tag/v1.13.0)** - -**Target For Removal In Release: v1.16** - -API versions should be supplied to all API calls to ensure compatibility with -future Engine versions. Instead of just requesting, for example, the URL -`/containers/json`, you must now request `/v1.25/containers/json`. - -### Backing filesystem without `d_type` support for overlay/overlay2 -**Deprecated In Release: [v1.13.0](https://github.com/docker/docker/releases/tag/v1.13.0)** - -**Target For Removal In Release: v1.16** - -The overlay and overlay2 storage driver does not work as expected if the backing -filesystem does not support `d_type`. For example, XFS does not support `d_type` -if it is formatted with the `ftype=0` option. - -Please also refer to [#27358](https://github.com/docker/docker/issues/27358) for -further information. - -### Three arguments form in `docker import` -**Deprecated In Release: [v0.6.7](https://github.com/docker/docker/releases/tag/v0.6.7)** - -**Removed In Release: [v1.12.0](https://github.com/docker/docker/releases/tag/v1.12.0)** - -The `docker import` command format `file|URL|- [REPOSITORY [TAG]]` is deprecated since November 2013. It's no more supported. - -### `-h` shorthand for `--help` - -**Deprecated In Release: [v1.12.0](https://github.com/docker/docker/releases/tag/v1.12.0)** - -**Target For Removal In Release: v1.15** - -The shorthand (`-h`) is less common than `--help` on Linux and cannot be used -on all subcommands (due to it conflicting with, e.g. `-h` / `--hostname` on -`docker create`). For this reason, the `-h` shorthand was not printed in the -"usage" output of subcommands, nor documented, and is now marked "deprecated". - -### `-e` and `--email` flags on `docker login` -**Deprecated In Release: [v1.11.0](https://github.com/docker/docker/releases/tag/v1.11.0)** - -**Target For Removal In Release: v1.14** - -The docker login command is removing the ability to automatically register for an account with the target registry if the given username doesn't exist. Due to this change, the email flag is no longer required, and will be deprecated. - -### Separator (`:`) of `--security-opt` flag on `docker run` -**Deprecated In Release: [v1.11.0](https://github.com/docker/docker/releases/tag/v1.11.0)** - -**Target For Removal In Release: v1.14** - -The flag `--security-opt` doesn't use the colon separator(`:`) anymore to divide keys and values, it uses the equal symbol(`=`) for consistency with other similar flags, like `--storage-opt`. - -### `/containers/(id or name)/copy` endpoint - -**Deprecated In Release: [v1.8.0](https://github.com/docker/docker/releases/tag/v1.8.0)** - -**Removed In Release: [v1.12.0](https://github.com/docker/docker/releases/tag/v1.12.0)** - -The endpoint `/containers/(id or name)/copy` is deprecated in favor of `/containers/(id or name)/archive`. - -### Ambiguous event fields in API -**Deprecated In Release: [v1.10.0](https://github.com/docker/docker/releases/tag/v1.10.0)** - -The fields `ID`, `Status` and `From` in the events API have been deprecated in favor of a more rich structure. -See the events API documentation for the new format. - -### `-f` flag on `docker tag` -**Deprecated In Release: [v1.10.0](https://github.com/docker/docker/releases/tag/v1.10.0)** - -**Removed In Release: [v1.12.0](https://github.com/docker/docker/releases/tag/v1.12.0)** - -To make tagging consistent across the various `docker` commands, the `-f` flag on the `docker tag` command is deprecated. It is not longer necessary to specify `-f` to move a tag from one image to another. Nor will `docker` generate an error if the `-f` flag is missing and the specified tag is already in use. - -### HostConfig at API container start -**Deprecated In Release: [v1.10.0](https://github.com/docker/docker/releases/tag/v1.10.0)** - -**Removed In Release: [v1.12.0](https://github.com/docker/docker/releases/tag/v1.12.0)** - -Passing an `HostConfig` to `POST /containers/{name}/start` is deprecated in favor of -defining it at container creation (`POST /containers/create`). - -### `--before` and `--since` flags on `docker ps` - -**Deprecated In Release: [v1.10.0](https://github.com/docker/docker/releases/tag/v1.10.0)** - -**Removed In Release: [v1.12.0](https://github.com/docker/docker/releases/tag/v1.12.0)** - -The `docker ps --before` and `docker ps --since` options are deprecated. -Use `docker ps --filter=before=...` and `docker ps --filter=since=...` instead. - -### `--automated` and `--stars` flags on `docker search` - -**Deprecated in Release: [v1.12.0](https://github.com/docker/docker/releases/tag/v1.12.0)** - -**Target For Removal In Release: v1.15** - -The `docker search --automated` and `docker search --stars` options are deprecated. -Use `docker search --filter=is-automated=...` and `docker search --filter=stars=...` instead. - -### Driver Specific Log Tags -**Deprecated In Release: [v1.9.0](https://github.com/docker/docker/releases/tag/v1.9.0)** - -**Removed In Release: [v1.12.0](https://github.com/docker/docker/releases/tag/v1.12.0)** - -Log tags are now generated in a standard way across different logging drivers. -Because of which, the driver specific log tag options `syslog-tag`, `gelf-tag` and -`fluentd-tag` have been deprecated in favor of the generic `tag` option. - - docker --log-driver=syslog --log-opt tag="{{.ImageName}}/{{.Name}}/{{.ID}}" - -### LXC built-in exec driver -**Deprecated In Release: [v1.8.0](https://github.com/docker/docker/releases/tag/v1.8.0)** - -**Removed In Release: [v1.10.0](https://github.com/docker/docker/releases/tag/v1.10.0)** - -The built-in LXC execution driver, the lxc-conf flag, and API fields have been removed. - -### Old Command Line Options -**Deprecated In Release: [v1.8.0](https://github.com/docker/docker/releases/tag/v1.8.0)** - -**Removed In Release: [v1.10.0](https://github.com/docker/docker/releases/tag/v1.10.0)** - -The flags `-d` and `--daemon` are deprecated in favor of the `daemon` subcommand: - - docker daemon -H ... - -The following single-dash (`-opt`) variant of certain command line options -are deprecated and replaced with double-dash options (`--opt`): - - docker attach -nostdin - docker attach -sig-proxy - docker build -no-cache - docker build -rm - docker commit -author - docker commit -run - docker events -since - docker history -notrunc - docker images -notrunc - docker inspect -format - docker ps -beforeId - docker ps -notrunc - docker ps -sinceId - docker rm -link - docker run -cidfile - docker run -dns - docker run -entrypoint - docker run -expose - docker run -link - docker run -lxc-conf - docker run -n - docker run -privileged - docker run -volumes-from - docker search -notrunc - docker search -stars - docker search -t - docker search -trusted - docker tag -force - -The following double-dash options are deprecated and have no replacement: - - docker run --cpuset - docker run --networking - docker ps --since-id - docker ps --before-id - docker search --trusted - -**Deprecated In Release: [v1.5.0](https://github.com/docker/docker/releases/tag/v1.5.0)** - -**Removed In Release: [v1.12.0](https://github.com/docker/docker/releases/tag/v1.12.0)** - -The single-dash (`-help`) was removed, in favor of the double-dash `--help` - - docker -help - docker [COMMAND] -help - -### `--run` flag on docker commit - -**Deprecated In Release: [v0.10.0](https://github.com/docker/docker/releases/tag/v0.10.0)** - -**Removed In Release: [v1.13.0](https://github.com/docker/docker/releases/tag/v1.13.0)** - -The flag `--run` of the docker commit (and its short version `-run`) were deprecated in favor -of the `--changes` flag that allows to pass `Dockerfile` commands. - - -### Interacting with V1 registries - -**Disabled By Default In Release: v1.14** - -**Target For Removal In Release: v1.17** - -Version 1.9 adds a flag (`--disable-legacy-registry=false`) which prevents the -docker daemon from `pull`, `push`, and `login` operations against v1 -registries. Though enabled by default, this signals the intent to deprecate -the v1 protocol. - -Support for the v1 protocol to the public registry was removed in 1.13. Any -mirror configurations using v1 should be updated to use a -[v2 registry mirror](https://docs.docker.com/registry/recipes/mirror/). - -### Docker Content Trust ENV passphrase variables name change -**Deprecated In Release: [v1.9.0](https://github.com/docker/docker/releases/tag/v1.9.0)** - -**Removed In Release: [v1.12.0](https://github.com/docker/docker/releases/tag/v1.12.0)** - -Since 1.9, Docker Content Trust Offline key has been renamed to Root key and the Tagging key has been renamed to Repository key. Due to this renaming, we're also changing the corresponding environment variables - -- DOCKER_CONTENT_TRUST_OFFLINE_PASSPHRASE is now named DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE -- DOCKER_CONTENT_TRUST_TAGGING_PASSPHRASE is now named DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE diff --git a/vendor/github.com/docker/docker/docs/extend/EBS_volume.md b/vendor/github.com/docker/docker/docs/extend/EBS_volume.md deleted file mode 100644 index 8c64efa16..000000000 --- a/vendor/github.com/docker/docker/docs/extend/EBS_volume.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -description: Volume plugin for Amazon EBS -keywords: "API, Usage, plugins, documentation, developer, amazon, ebs, rexray, volume" -title: Volume plugin for Amazon EBS ---- - - - -# A proof-of-concept Rexray plugin - -In this example, a simple Rexray plugin will be created for the purposes of using -it on an Amazon EC2 instance with EBS. It is not meant to be a complete Rexray plugin. - -The example source is available at [https://github.com/tiborvass/rexray-plugin](https://github.com/tiborvass/rexray-plugin). - -To learn more about Rexray: [https://github.com/codedellemc/rexray](https://github.com/codedellemc/rexray) - -## 1. Make a Docker image - -The following is the Dockerfile used to containerize rexray. - -```Dockerfile -FROM debian:jessie -RUN apt-get update && apt-get install -y --no-install-recommends wget ca-certificates -RUN wget https://dl.bintray.com/emccode/rexray/stable/0.6.4/rexray-Linux-x86_64-0.6.4.tar.gz -O rexray.tar.gz && tar -xvzf rexray.tar.gz -C /usr/bin && rm rexray.tar.gz -RUN mkdir -p /run/docker/plugins /var/lib/libstorage/volumes -ENTRYPOINT ["rexray"] -CMD ["--help"] -``` - -To build it you can run `image=$(cat Dockerfile | docker build -q -)` and `$image` -will reference the containerized rexray image. - -## 2. Extract rootfs - -```sh -$ TMPDIR=/tmp/rexray # for the purpose of this example -$ # create container without running it, to extract the rootfs from image -$ docker create --name rexray "$image" -$ # save the rootfs to a tar archive -$ docker export -o $TMPDIR/rexray.tar rexray -$ # extract rootfs from tar archive to a rootfs folder -$ ( mkdir -p $TMPDIR/rootfs; cd $TMPDIR/rootfs; tar xf ../rexray.tar ) -``` - -## 3. Add plugin configuration - -We have to put the following JSON to `$TMPDIR/config.json`: - -```json -{ - "Args": { - "Description": "", - "Name": "", - "Settable": null, - "Value": null - }, - "Description": "A proof-of-concept EBS plugin (using rexray) for Docker", - "Documentation": "https://github.com/tiborvass/rexray-plugin", - "Entrypoint": [ - "/usr/bin/rexray", "service", "start", "-f" - ], - "Env": [ - { - "Description": "", - "Name": "REXRAY_SERVICE", - "Settable": [ - "value" - ], - "Value": "ebs" - }, - { - "Description": "", - "Name": "EBS_ACCESSKEY", - "Settable": [ - "value" - ], - "Value": "" - }, - { - "Description": "", - "Name": "EBS_SECRETKEY", - "Settable": [ - "value" - ], - "Value": "" - } - ], - "Interface": { - "Socket": "rexray.sock", - "Types": [ - "docker.volumedriver/1.0" - ] - }, - "Linux": { - "AllowAllDevices": true, - "Capabilities": ["CAP_SYS_ADMIN"], - "Devices": null - }, - "Mounts": [ - { - "Source": "/dev", - "Destination": "/dev", - "Type": "bind", - "Options": ["rbind"] - } - ], - "Network": { - "Type": "host" - }, - "PropagatedMount": "/var/lib/libstorage/volumes", - "User": {}, - "WorkDir": "" -} -``` - -Please note a couple of points: -- `PropagatedMount` is needed so that the docker daemon can see mounts done by the -rexray plugin from within the container, otherwise the docker daemon is not able -to mount a docker volume. -- The rexray plugin needs dynamic access to host devices. For that reason, we -have to give it access to all devices under `/dev` and set `AllowAllDevices` to -true for proper access. -- The user of this simple plugin can change only 3 settings: `REXRAY_SERVICE`, -`EBS_ACCESSKEY` and `EBS_SECRETKEY`. This is because of the reduced scope of this -plugin. Ideally other rexray parameters could also be set. - -## 4. Create plugin - -`docker plugin create tiborvass/rexray-plugin "$TMPDIR"` will create the plugin. - -```sh -$ docker plugin ls -ID NAME DESCRIPTION ENABLED -2475a4bd0ca5 tiborvass/rexray-plugin:latest A rexray volume plugin for Docker false -``` - -## 5. Test plugin - -```sh -$ docker plugin set tiborvass/rexray-plugin EBS_ACCESSKEY=$AWS_ACCESSKEY EBS_SECRETKEY=$AWS_SECRETKEY` -$ docker plugin enable tiborvass/rexray-plugin -$ docker volume create -d tiborvass/rexray-plugin my-ebs-volume -$ docker volume ls -DRIVER VOLUME NAME -tiborvass/rexray-plugin:latest my-ebs-volume -$ docker run --rm -v my-ebs-volume:/volume busybox sh -c 'echo bye > /volume/hi' -$ docker run --rm -v my-ebs-volume:/volume busybox cat /volume/hi -bye -``` - -## 6. Push plugin - -First, ensure you are logged in with `docker login`. Then you can run: -`docker plugin push tiborvass/rexray-plugin` to push it like a regular docker -image to a registry, to make it available for others to install via -`docker plugin install tiborvass/rexray-plugin EBS_ACCESSKEY=$AWS_ACCESSKEY EBS_SECRETKEY=$AWS_SECRETKEY`. diff --git a/vendor/github.com/docker/docker/docs/extend/config.md b/vendor/github.com/docker/docker/docs/extend/config.md deleted file mode 100644 index 096d2d082..000000000 --- a/vendor/github.com/docker/docker/docs/extend/config.md +++ /dev/null @@ -1,225 +0,0 @@ ---- -title: "Plugin config" -description: "How develop and use a plugin with the managed plugin system" -keywords: "API, Usage, plugins, documentation, developer" ---- - - - - -# Plugin Config Version 1 of Plugin V2 - -This document outlines the format of the V0 plugin configuration. The plugin -config described herein was introduced in the Docker daemon in the [v1.12.0 -release](https://github.com/docker/docker/commit/f37117045c5398fd3dca8016ea8ca0cb47e7312b). - -Plugin configs describe the various constituents of a docker plugin. Plugin -configs can be serialized to JSON format with the following media types: - -Config Type | Media Type -------------- | ------------- -config | "application/vnd.docker.plugin.v1+json" - - -## *Config* Field Descriptions - -Config provides the base accessible fields for working with V0 plugin format - in the registry. - -- **`description`** *string* - - description of the plugin - -- **`documentation`** *string* - - link to the documentation about the plugin - -- **`interface`** *PluginInterface* - - interface implemented by the plugins, struct consisting of the following fields - - - **`types`** *string array* - - types indicate what interface(s) the plugin currently implements. - - currently supported: - - - **docker.volumedriver/1.0** - - - **docker.authz/1.0** - - - **`socket`** *string* - - socket is the name of the socket the engine should use to communicate with the plugins. - the socket will be created in `/run/docker/plugins`. - - -- **`entrypoint`** *string array* - - entrypoint of the plugin, see [`ENTRYPOINT`](../reference/builder.md#entrypoint) - -- **`workdir`** *string* - - workdir of the plugin, see [`WORKDIR`](../reference/builder.md#workdir) - -- **`network`** *PluginNetwork* - - network of the plugin, struct consisting of the following fields - - - **`type`** *string* - - network type. - - currently supported: - - - **bridge** - - **host** - - **none** - -- **`mounts`** *PluginMount array* - - mount of the plugin, struct consisting of the following fields, see [`MOUNTS`](https://github.com/opencontainers/runtime-spec/blob/master/config.md#mounts) - - - **`name`** *string* - - name of the mount. - - - **`description`** *string* - - description of the mount. - - - **`source`** *string* - - source of the mount. - - - **`destination`** *string* - - destination of the mount. - - - **`type`** *string* - - mount type. - - - **`options`** *string array* - - options of the mount. - -- **`propagatedMount`** *string* - - path to be mounted as rshared, so that mounts under that path are visible to docker. This is useful for volume plugins. - This path will be bind-mounted outisde of the plugin rootfs so it's contents - are preserved on upgrade. - -- **`env`** *PluginEnv array* - - env of the plugin, struct consisting of the following fields - - - **`name`** *string* - - name of the env. - - - **`description`** *string* - - description of the env. - - - **`value`** *string* - - value of the env. - -- **`args`** *PluginArgs* - - args of the plugin, struct consisting of the following fields - - - **`name`** *string* - - name of the args. - - - **`description`** *string* - - description of the args. - - - **`value`** *string array* - - values of the args. - -- **`linux`** *PluginLinux* - - - **`capabilities`** *string array* - - capabilities of the plugin (*Linux only*), see list [`here`](https://github.com/opencontainers/runc/blob/master/libcontainer/SPEC.md#security) - - - **`allowAllDevices`** *boolean* - - If `/dev` is bind mounted from the host, and allowAllDevices is set to true, the plugin will have `rwm` access to all devices on the host. - - - **`devices`** *PluginDevice array* - - device of the plugin, (*Linux only*), struct consisting of the following fields, see [`DEVICES`](https://github.com/opencontainers/runtime-spec/blob/master/config-linux.md#devices) - - - **`name`** *string* - - name of the device. - - - **`description`** *string* - - description of the device. - - - **`path`** *string* - - path of the device. - -## Example Config - -*Example showing the 'tiborvass/sample-volume-plugin' plugin config.* - -```json -{ - "Args": { - "Description": "", - "Name": "", - "Settable": null, - "Value": null - }, - "Description": "A sample volume plugin for Docker", - "Documentation": "https://docs.docker.com/engine/extend/plugins/", - "Entrypoint": [ - "/usr/bin/sample-volume-plugin", - "/data" - ], - "Env": [ - { - "Description": "", - "Name": "DEBUG", - "Settable": [ - "value" - ], - "Value": "0" - } - ], - "Interface": { - "Socket": "plugin.sock", - "Types": [ - "docker.volumedriver/1.0" - ] - }, - "Linux": { - "Capabilities": null, - "AllowAllDevices": false, - "Devices": null - }, - "Mounts": null, - "Network": { - "Type": "" - }, - "PropagatedMount": "/data", - "User": {}, - "Workdir": "" -} -``` diff --git a/vendor/github.com/docker/docker/docs/extend/images/authz_additional_info.png b/vendor/github.com/docker/docker/docs/extend/images/authz_additional_info.png deleted file mode 100644 index 1a6a6d01d2048fcb975b7d2b025cdfabd4c4f5f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45916 zcmd43bx@UE)He)x5RM?JfJle5lt_rQlp>N6($cM@(x9NyQUU^sbT>#NA)(SC4bm-w zNPg=w?&o>uo%!bb^P4&MJ;U}~wXeO`TEAH5*`3>RXU|Zc!N9;cs~|6?8mEj#}{hMznYINBu?&oe6G$A5M8Mr ztp2%?yOZk~NktGSO(E}t`um}Kj_Q>uvLRE#Vv_j#d5(dNzJ`Sk$N2q`=ttiPm#IZt z{P`34KQ{W{zd!!}_0JMA*zHq|{>*G_?Q1M*>9Dh#VM&LRcFg&rSx zqV8j@3jHsWhM6dpm8o)fUw9v_7<@n2sL#1iD7KdpOnpr=U%!@JyZC-ld^Fc=n`(Vf zM)_vzcntLu*&9zJ`cVqiE^F_shw^Vnd;OY=O}q7q&(Hq!q}M^-d*1oauSeN#GtfA# zk7;ij$t%$jUG;sZpjTY`IUxJC_u*EcN>L!KmzLE~zAaVT!R<_nr_a?GDsE&_@Fi0) zP6ZiKT(Jn3mgzU2sByQuS+|h%I9TZ5=Z4@6OjFa=YRMOo=jYgFK8Dl#&*oRJKRBG@ z_I8}AvEDoSIXO@!_2i5&pJ~T8x6MWzY6I`1vQ&e5FZPXG?Gj3b_pTduQ9oglMuoy& zCkj8zwnkoMpS!nhmFGdZ$xQRJ(B*-gYj@1vJ1tQaX2DAceSOW9(*3ISU{|5!cH?dv zt+%?PzS}hR?0d05y!T=k_|2RWuepBSI^6zp?fH3*`3A?ij%ezK^Ig0h-Pc%@lbn96 zj`T%{dwa>naB5Q#iXRr5w1rX=e8P0zWwDv48NsZ6LB_Q#pDb3(sGKAk`rdg(gp5-w zoc&h>qa4-vd*_GWI%B^?2tPE_xU{U2DtlIg`{84{qUgQ#VN{3O#X6@YRZ|m~C5;oz z&gl<<*Df2><)&uZ(j6Yn&FAaieo{^4_T0Wj_Aoi_AbG-jDJ?cpaXVJIGlomUYtLZ3 z(8xd4X{mSFTTob7doH8%1DPk$TFmvwE<2JshbOe6Zrwd;H_7GJ$Ev7d(LNOY{*f`% z`*=I~_U=>zZNAGodH(rc8>fqld3JaPHqKth<O{E%xZw@1v&Si_61$gmMUD=>Y9uD`AKSVZ);YO=~aOVtu2P{+n;3-nzPj= zq^!!r-LRq5JxbRW?`9|`52jQ4bsHROR#xT2suU(rD{t+Dw9#JN`J^&**M3L3o1ONk zTgD);yZhJ9VvqEIL@bVD@X41emc5x_p?8b#E6Dj`VXKRb5&m!w+Q%cmOmXgT&T7cZ zNWHl&&e>YFZ^qct{jSbU-k)lV* zTNPn%C^&YXL{>-d4t5*X^Y{~RrhF+$*>*De@*=JBezPuz6q>?|e%P3k1dY-sr|Py^FNW@{3|+gd_x@e} z!J}b1>N=H074qPY#Tp0x?nch=&9Fk3H65ID0(Di(d&jsWN6G;>XZP$z%RlkjjR`Rl z2ESk2{L!a;alv{ZdrqswEQGy8JxjIK{o!M+kd08K6j68qcEbTZ5%ouF_MvQQ=|Wb6 zxt59cJ#U}n$J5In&e=ansD5+-yLx2noWZ2qVUgodzFz3hN$<(b6*cASb9>)AxzE0_ ziw^U$cx$tX>V&N)a=aDhok?jyQ#tWYfs{G!OQP^><-vOO*^6h$FRu>QKCYN;4Y^2g zNK1cN3^p(y>!OFpj$HLFUMfR6wSn#Qi@bsIUVMLBJhk(|dIn>kJkO<;zhqI?Wc*4& zJhWzeT)+L3#)e|btZms-c6)1}?M~GB1E;#i2Nho@%;t|puZ_{+cV=axNydA|Y*z+y z78*j()BRa$trh76)FMKX-Gq*~q(>oWhX|JDhKbt8A$#>ly9x1pjRM=Jx;t>6o!2Fx z5;8pGf7565aesejr6Xyh{$v8P(U@SiElhC6`+Gaf{7nLHnyW<4B4bq#km9;|J0cNy}-r55^xow;zzj zB^tk6P=EYhjaTzm9BuqY?aw4NeIcI7;7>IWvyRQ6T#jTPRI$fAio%&1dy5V6QJO8T~s7rs(4oNw&7KK${cDNFc4aJ^?&w&$A} zyRzC(u>4)C=$OU%YA)UgN&aZl6f&wI>PDEp@kOIUS;FE6x^? z-S~TE@uMFv@6~x|6VQleex4pjn|8)%9PFvRce0GGcVzIP<|v9pD1^HXtjq1S1ybu8n#%bC+FPfSngyMl&03W^N?PvBi+_( z5*&97vHIivoQ^cO&)c5N(ogZfckzFrU^Z09wcc!@-GaCu@0uBURMexU-S{0-&HjyQ znqsTz_G8Pgs|z0^J_My62;2^MXq&M>p(Y1UV|1#mYa@@C+>{(TpmwMCq z*VVL^o*2&2thSTo{AB(%Yfp>US|?G3GddBmn40vpX~&~qbEGRlP`R-8G&d&9L4wXY zo=TDXwwWbtI-?AIzaUaK;g=cYSEh}ucNJZKPN24>hglm+{pZ@|Q)qMd6VK~9Y&Txh zxFdM9@ z&)XYnrlw-9@T%2^Jh$YqysOeWL}geGVU|=Hzw^FO8RDbcbMkHx822u;FTZf2CbH-i zGVAc*Z25%Qfl*F=#)y|*hC~HSRFUv-Ic_O|2z6cQEC2bl`Y4?$oP=%O4V(u^+{Lys z;2HC`w0C$WLo2ZTvz&H-n55=)nWX<|D|IH5*5HoYH9rlz;&`8a8YwXs+}%pQd&pRQ zAbPwv8_92ed#6>LN$BBxaK!BmNLw-+l)BqW1cYkTc9V5^6ZI)!MPccZ+oEC{LKW79oZM>U8E(-R)DA}A5 zIV7#!Y{DysP}?Z|9s(#k-jRgl<3)$#L-$&18|7p%+f|b`E02t3Nt!rp&N|7e(+?*d zS@J!$Dw;l(t=^$NDDKe}Zv5V!C|uIET04?<5Sh_DJx^&>h1L zIK8w?y%dESx5y$JrRU*tPJv>**U>kBLa{q)bVNdrhM~;VGxiEHj57X`bX_E?XaEb7 zrHgQm*88w0j=eV`Z`iN+((Oc6H?Hq3FUYaWy|!A&t-ikVI@)KyDf({b!7`rYaalX3Equj=e#2 zyz3Re>5s*p@5culoxvCQQO2n0c9vvy-EUjNCSmPwZ@jp_|6^%6dUe^alQ!6R(TBXG zanhva`S}hxspKJD2x4WU6xZWK-HX4AOVmNFs_xuP=!CCq6=6sw3z6|nFs-=$?#5)n z3xaksMm}7_zDh?ENnuEQC0A_kC$+UDFztMr8+V;Ne|^S?j3%yFssUFqS6^ zTLv&bd8wSDQPeSDcf`>B=s?lDqWnxib+rg=vg(@!U$m>fXf2t%DOMg`+8DH3TPqmP zntAd`Z&0bVZbBMM*{tT{t;fA4ujrZ}y=3cuOZ$>gq1EE6!69<5_R+waj!O*==1ts) z!J3Zw;UW_P&N;q?XP%rlTkv`c?Y(&8&+DEhq)B8qcqpuem3wO0uEjwPC_vi)r*fh42NZj=S&#j7%PinPJBl)_@ zTY1AlqP2Oeg&l1*Bq(kUr?ZcqVCsLqPoOoP`YPkyJBrxCbNb0`FP4dNAC&3V^RO?N zwdv~a8C#d-N%fG~Wg8}bZyg_#+o^u#B<1>(m*c15>#&u<4$oFA+7e@f%t~Ebd;W(8 zKQG^PnHDYogo}WRypKNR|HTv+B{qp?mqo3<}UUF>%+W3}v!+a0E z$^ZKHQn}wkCW7Hcl=MX^MWZhZ$=>-k{ktgy_O&}Pl)S$7vQN&OZ_e#E=-heL(}b=HqOsc@BV32x_V&wbFhQ`mPk z(E}?lLnGg1h1_>=^sY#CnFih1^?@EJAk=68m1rJlv9504ugKVTv9?!s*%wJhmCbUf z*4%5`c+lXD^&xOxgJnxq++b%9iqdGhhC<`^NapCmKFdNBxfhdwRXe?IUm8Lm{%u_bi0U2D8)xEB_HOGbkY`631^n91a87 z8ok*X92KA66`tuMj-!0&X{7yw)2#guL-S0kK~s$B8P;{3oo2j+!2$zrH*-7>olOS* zy&S{+(_(^?-Y3^vC=cmOpwG3 zQ3{p&Z33Z!>!3O7P!{k_2L4E6kJ%SS$X$XgRZlr15C_8>7F(Q@9Wu zL6VWDt@ih#gq0_iVr? zg7^pCZpg5WWZ(yS^2_&v(6b{$#&2KQSl{Q|aUPYzFEaW;kLJB&Cijm}GkgtG5kR^Sh!qLnC{QPZ2t{N-GUd=Eb)r^9}DN>495(<;>G?qAQ1$#TmS`Y z3FF^aMpAg&$FEt0KmGR$M5Yjz7xPRc(J51x|Cqf&I7Z97_1u30^p_+gNsLpvLjTc$ z4I-FlNLISy{QeElHN#tx!jBsH`=T+>S}gG1USClAyUsDt0deqVgM9g}{e5qAm@6n7 zHu<`fZ*Et8!H3A_dzTLp0 zXX!4rR2x{JdAwQ_KDV}>)B~GGkCkLYsn~!tMUxzU zID~`?)S3%Iz0%L7>-U<3~m&gnk-Nb>Afk*2&C{j z+PTZDD!#wSs9kCifmD7m-|yci*_6RBuz+1$P)Fo>{A=OCw~xfBC+>=~D;})t7l5`* z9(p`EWZ=yuXg3xPsb1uj$?-|!lhF$MPADYjXixS6_g6xXYYNGFy{GlT+s(Xa^FYHlhMcRn}pjL;ztUac{38b`5xJzDXF`2!QRwD2UHjU!02xKa=l!|beOYEu z;l(P8AE_%%-bxl5pA}aIj`ZD~H&T8^o=^8K`KS~(`r~xMZvEB~&9R(LIVoVa#&E+B zYX8V-AWmG{w5TevdW&vSNzX3oh;G`6^R08&FJM4T2==C%0EKXbOXxBE?NQonauV^O$xeayQs;++Y`Fi{4g(R_qA@UzcjR*bqcc_)IUZh+>ROBY*q zy=N~QF`*xWk5`HH&}Ga1%!sKIT3d&y2FwaV8|7m%irNpJn3lwcRpy4MG}n!Z?2QJw zq|i&y7iLz4uNk zKYMLPiqX9%K#+Fie=W0Kv6y*OU}hlL&9oY7i+biY^@00?t`8|=^9`sIYHsl7Pq$)7 zV$%C39OH4He-b=(V27l|5_2yK4>Q%hlsT9CZ8Wu(6LCXhyTEffbo{e+HbiZ;c6Kn!ckPb`v6 z?b0hD$G1>JOY{5)5mT-A@)UO4Oo@LaWAI^9$U}GYta_kyAb|qRxas$A?W)=8Y)hjR z1wejDrYj{}0tTsm>Zu*U@ehTE9_u)A7^#f7)Yn|pbwyW+d0L1pHW!jGRjMD%Df;qr zc`S6_-Qqdf9ksts_QI0+)?MTG*nXPcD&ON8K0O()cFifd@q*0x;lNk6A9{!O9*0|P zR#6vsTGiPT9rZTK)*qM|xXLm6eip{UXP|h8tM@TkT>Pmh6@-JrsHM~}vFu*G+D95` z)}!TlB4S>Ll_Klo)fFOM5CC3(*DEr9A~Kn!#xm;x#P2{=M$)4Wp}^P37J9t_kK^bC z1oHA2;OLNtZ@!`hM(>QwDT^`6g*xHWhz=)bdbI${9XuoIb?8>G_4vo)o0+_ORjMu4 zW0ggWKp1WT0uW9EO19{^x!vrY9}x(%KQ~%vB;5wwc`#qH_p!UP7jOivRr8+`avmal zk0Ze~&}CE>Xdf-o&(=hXSu&k5X6aue4`35}`Sin}ZiSujne*)5J||*1!Y8am(GCtP6p(s z>}^8PO&_r}huXW=1oJ0KGA^zs0(@v=7OEo_+=p@f(+$#3IQw$2?cv!axE;8SY$?PH876@*NJN5K7F;DadLuIT-8jTRVqJ85cKL~!M6tEJy z5Zpt8y7h_<^;M3C-IxFoBSf0r@ds8MfI-UC3y!BV)bfDUw>-+2Zqqdl!CQmz`b9xI zbv4wy_3BGA%IQ&{zchyp&z)s7#NE_DD$8Y#M?aXT$PAvtrG!11!xxR^i>5q1;?2*`qS_B0Z52 ziQ?2&-N??XQ<$1=frpO0toOhw2XbWg?8Al6?Xc|LH8V}z^-G(@rC655)u8n)z{E-{ z_=L%D5tGB0Xet5Ygyq&+C7#1i_ zE%Z190HY^tiuWess_j>GgE*q4&FK$M;~HWw4;@cO^?29cdR2dC`h`KA$1l_g3sGy_ zXZ)*%a~F>by1W=flsQ$qPw@5=GxDtUhKH_4Jg?s_CuVZU^`nEF8fKVRo8e>6O`+77 zSY3cIiGkYlsR1UNCRKVQ!9T;BN;$N2zH}^%0JHYn-N~-0jIG|A+*z)Ji*qBJ^u2^0 z<1xOw#L90+hH#T<8n;T%NFB&F(za3!vwXVJR6?jy?eXhDwD6(O7}x68u?(Y1*U6=Mo+~~*b7w_W|O1lEpwC6ek*li+0V@pI!Vptc6@7?XQcw8#f8bmLBA8oi# z#+bc#l`z9($cOu;gKDcf9hD&Qj~|INj(wK*u+zk7pL0!wUYJi+SkIA+K7TWikoNLM&35Q_vNnge)(uKj8>bq?aR)yioT0#K z5!A$`zV)fHZv1?X$z~qz@oBBMmduOZsvMRSf}$uM@sOn}xjYgVO*&2)qr9Xj%mi_Q zW9S#{Ur(c#$ z&R4JnkB^TIIzeze^m-OvC3^kJ#?q*d@a3N$q%jy!f(yJRt*pss4p%Y!Tx4Yo_;5Jc zJX#Y(F8=cZ%thbrXRE~*O!RENS3VKg-D;oO5Q_?ZI?wZX*Jg*({)hKngL4l>*8`I< z5i2V7=&Nk7qR9^hDO_2fwRYbK?a6X8AH?0mWa@6GZNBN>Whzo%vz;8*=nP&8}XQ$w6!Siw;ZP<`+ z*gE&&ty{?yC}tZu`mN3$qm7%FYI+21hEwdWQk1ue<41`n_GA5;$Eqfp;;c6NM7bk& z#w$mlFwg^s(EfUTSOj*k&9p9gVhX*)rcZ+vJL<x!Un#tu4m5t{jkG=h0UOt6(V=zo0CZPzLcJa8`e2Qjb(rs8m#xUU2q|WAJ z60PO=_BY*n%y?v+nO@{LsoX>iZiSMK6&5{GXV9UNQ?DBP`ifhyr5f+I)3We%3n)92{igaPb0467W&o`dy%5KLz}{`G!>m+ zpm!o}8jvf!p07LhuKr;CS|gu9|0z!r-CP%+J8XCJ6Rk;T0$*XE(0=--SF(hTT=Z*l z@jY?Xyol)Bo?v)=$GZ8RS0m^kCTY3b9sBW@ZZCGCp?&YhKC%Lt}pFRpOwu z-51QdCIu`gGhWSVqpvrWm6z@n`jMo{QW%|SAw0kA;XhJ*f|BMIwX_wGB1vNByZaj# z`pOeEuoCIFW7HEr^hqX{`tbDZr;I9PtlKD?Iq8}E7YP4=U*qQ(6UEPm_zZh6C&K(9 zNcN%((-@nBex1$d)!?PPNDMHTxUowL`7+%x+K^J_feg?m>RIsRexA|=4%<)dMPFaOdV_kiwr_QLEw^IynLR}Rp++2x?;(Z6%z!8sj! zf^$)S5qtAhK;y%9;yTKIc>qUAIOpZ~i0Hq7-FFxP;KM)?VI9t&wg{N(Gk-(8kY<6a3h)*2o6iSf3DLCE9s=5EDa3?tW2WD7!bMGnA_!VHxc@M(F zqCcaqZ4rhl*PPyEJ}9-R`B`SDP*QOEX801Ll8+cu#HG*Q|06n7iGenH62S7`00T19 zz0KM*{}CPRFp*i|oB!r9T;d&KNQxKg{EzvNzX8XbCrSE``3SlKb1hG5?*1Rqkp)xv zPO6FYzkvv3vMpyg!~P>W&ciY4@^1gbeDuO>Gbkm_{l|Q~V~~)HJcCvq4rxfc8T$>; zl?(ri-9J1?KsYQJT%-LC07UnS0RyV{Y;rV%xOZnkx6F!JK|#Sz94f9<}b z_L_fA)Q)`l(iCdEtd7tpq;2DMI~Wpi#0gGdy-iH=_mZ z_1QFY^KqR+;*b+bq zK*rMPw_j(^0KF;yVBs^@TxV=7zygY`p*&p{jcoM@QTOlizy8q{<8Gs!Euh*q z48W${3r`u-E-^#PYKvmuA~t$=AHYr|z4Yk|eD{OiDJSb^Yv!?o6D!)XFTEY8pm*R< z@;fBv5m5zNN?Dt70sI?tyvoC_-@hpcoB<$DgWxTRcQTAltHUa+if<*8OyNZ`iTFA_ zBcSWu;Z}VY1aw+Y)-cduBGiF1hTvPWT0W)5`f)OWsAujxxBk5~8d0}9q14wdIW!GS z@2-tnEuZdV0fae_F;I@!UE1bP-D;zA>nzc)eZ=Rweox@}_Wnu%hwkK~6)q5fUkK*} zt#TXG-P0+xpx2SO@$L?p)bD^rM@9dv?>2^aaItCUnPxw6V-y9QJ`tS|yGAw>u(5(- zaUG59)VV)?{j5J(lR4WbglpM*m~jpKJAIY;)T*^}Xcqn9_{hk&>AoPgaDu^!KW5*m zI{4OyniA7aGG;{~RT8uAuHPZ}7VNxRJe3EuSQPXPR*7iROSsM0C>#&P)-c+FL%Gk1 z!l|>`nVaOBx&{PNnqi}#D)_Fl4C?C; ztun94*Sif?adZjWp(@x+vQ(vHU_x*3=mltqSr6u_j*uktt zOe&1#`aAEFV?MC6I8!|nKgS%A(#3~FyD4u}B-NwH6Yqr?JNy1jl?T8dT@Ze7e{A3r z!TF|aD$a!gZr2ijCEu@8BG&^{D23Lnl1X;cB-;7(-k}Q%WFY|J#bC(E`!Rp~;i%-p z$m}>?lS_pT_X&YeH=N09@%%bE?gm=(BJbY-l_b%`d2qB|y@ARRq>xfhfhq_~ZpdvO zPo>y#R(8iL$}Qh~@iETB->d!vmnoP|A@=g?M`z!AYf-#FsggSEa4S&zoBxT_Sj^!( zeyGWrt;cNmOj98~89jt+W6xtN_3AuEbjfP|2n$3QnET-Jbt+w+yV8XEzTADo=e?th9G2+s|^GX1gdW8$?xColpkpTwm(f*a%J-OeaB#)8`2 zcuw8&TM$0XD2hPz7GQ8(`zkPd4`jdlz`6CND_s=!+%I)n?pHAToM?G3`KoPv6uX8Z z#Dq(bI${yx)VkVrBL-L(1>jxNJbr!WGik+lreWl$dN3E+lPY%;?jy~j=dG*=I4_vK zR@ieRu297n#IM01+YYo()MY&#voA@u!$n|mj5Ywbs`@d|iNyUM?j{*{?nL+J>E3-X z-^B)Q%a_kcS)PBGCbD;-eDWah&-!72iDmE;E`D+g*hx^q8C}PnV-f!%B9E&sUS@7S;{MS#8`;%pi)&EidcuO z50||#Qs-H{I##7tw>N_)Nu_K`_o?dP!aE4?y>Fy(%IXapv6hAkk`FgO5GsmF_(*)C zn}FE_nd1hSeO3j&K$2v;mh3izHYJ>4B;=|T9m!hx%=KqY+=o>z^Yme}Vx#{fNJUmr zr=HCC9s~2584(~6LcwbsV5t5UOg&cbrV%&Hgqg_wk3~KYtAhko@H*SBf@~z;KR3^A_D=xy^`i zf5PwOWXOWGw0a-k7M+A4D>oIO1J-Ls{#!2$OQ)gozWVuIa#vXTu1F(W7Iq9;E6Tj{T*mWVjC-@Ufm{ET$D(Xvh}Pe;HR_u@3Ue?$nlCO_8x zoXA;T>f8lSUG~zYhe>f>O&^~TXs)e-)D%o5tjbbxM7D-CT@Ju=>1$ce73;xUz;C6< zB(H^J_`dNj? zagBGIsSGoO^M2`wu1n+laRu}P`Ng!!xI9_!Evgyq%z#M}WCZmc@0eSD`s|w!%V2~c z#UY}R+B0OwCVUIEkpjT>=!eU|9Q0rLeE4fSIxO%r9wS|xj&J1_86@X7bW;v)YhoH0FX%P(u4lmK+rdp-Qj<-a&HTXY-CI1*IiJb(GiT(Q@0Dz$3bS zDgkCATZ}^3@Aam+`@(D2cfh@htp&H?I*>i3{RAZ?7dJXgjwY8Ba*8LCQ!=>x%2ABC zo1{RcFgI9H1OYk5j1nm;V=3MZSBS9+a{J(SQn61aQ zg0iXMJ`SOx(5I$ycnPW@&k;vl(xYWIjnkSFh;C)okE*+*wd6m=rW_nVr;N*e>l31y zeII-HB`a(sUFK_>6=QI`l%s#R1Jv_h2?PJn<1eZ`QPk3?lda#$BGmgujqKkuxW$ye(fBSx*=xX6z56JGRdS-_>u%$UcO`uDDKaGXbD6|u`+zE?@- zW=ZDd5b^t7SEXRx|30r8%2*>9338xE(IMRiPzki0dq@dsnP?Ioa;Dl-yPAin!Fs4D z{!$E;mJz?#N+z(a(2*d#bIRXH;sYm=`{)d@5{uCk)TEc#F}>48KtH$f$H}n-e?9{e zIqM@66BBJNj#}U%lWGAE6_2W5nqu*V?cMo(uCq2YoT_4^mPzh{M^o!bnXb zd?Zt3o{=EI7|azf97F%+szyMH=ulcU7FNt#-glyyEM`l-!h9LgLkc6y?YcsY3xiS| zC801Ffz%dky__tU(RZSnO-qVZVNit*2C)}8`Rd@C&37LcUxmRQc;CyzebLWQJY$D|gyL%KwmnJlavmQJWt)S{{JSfBxf3%W?2W2;#*qM1bDh5|OQP(<7)s4LijB-R8w**>n9vlgxW zXt@#qRVt(=c=zE0mESwS$w;!IW;QD~|B@7PLD!NMFcO?XW&<*tA#R{n7D)=dIR zr9dRuqi_EDK4;n*d_nfmd1X)mJkU(gs?nRP&A-(B#vkdE2`7|wy%S16anvY)idws@ z45pC(FJM<$*Z!&-M_YpD`kotm@`3_g4{#bxj|dHqOrA;rZXJj^ldkc@93*6;GFmJn zplGs1anY`rsYD=9#2y{|#FLQ$H{QS^zK0;srz^nt3(P%)CJCh137=X-9rhRtQjY=S zP}$kLGzP5q^?9_fzbKv7?L;B^ftH0TOXtV#=; zi4hsTIfGa*G&H*cQ8ow!Ci^78DBmE68B8`cTK~&`De6ujz)L(?txaD-bjND}>lnkR z7PW?R#IlOzcH`^-fx+APR31vOG^>H^-U@qzS5Pe?t_gPaOuCP>n1l-=&dY8cy+ZX? z1MFe$O?600SBV2V>&G}=6VwcSe$4$bKv{KV!8L*QJZeZ z%-b&}q$E);+Q5o!2pR;aKW??0yuZj2~{ z=k@2e%={}J)Qq_P`fjRGGe29vb=)fbnoaRAt;NlSrGf2Ybp_EHqb~(R_uCtIWt8Sk z0cb2o%tp-Q$gSBnj*|%R8f5kaLt<}-h-(UkY_N0c;z=JWwU2bAehQBihcqKlxN{ngWfFr)Q-rM^E)Dt4D z*L0`8Enjvk`MoM0-n}jKStTmKpM5*{iZ4@O5>tp%J2B_~M$)L8rYc+VKAvo)dCxV3 zwLa$t18N5>-8t~sDthv^ey&V7-Sjbhm(9o^r08^7RTD9Z3l<5TZvZ`p zcuc-tb*rtXuqsJ~QUcNWR62zqGc#rg#}XLa?jO`uMRB+kH}xrCAuuBgpC_&t0FqE-LNHq7`@2h~{*UApL6>4cO8cx>>ohtb0jiuz zG`}~J=5SB>Mn#>Qwuj)arQbMl6HI>&;ioHZjVQFregR^c~IHvSq#vE zggAfb<7|u>xa8!)LubMC`q=?HZE4UqkZs7zOvz=p73Hb8% zAM_^mg`NRL#M&??L&SWJDd`c`mwya>6j~yRQ>Rp3n|R}GfFD!G>yVbe|KuZxwMnah zQjwCJ$s^yS{F^w3eIyuyNY0R4bh;A%FD=&LHdnJw7aJH{_Zj+oO}aBE!~la-(GXRx zMeCQ_XlsMb0_h~7 z{tUWf0C)oh=u|$W!ItC-lGwnbfY%&K@UZ|oa;(~||0dsM60c`&-6@i)l@3PjV7-EL zcgJOQczQej^IiM#k>#vg@3g^127L`Tz^cOt{K89UmHG$)U*k2e4(hZBQkv*}D9RA6 z9Z3COtaDeQu$uYBpSouvEA5Rn!;zyEUS&tpz57eZI zPT!2-R3Y34kE1-|Dgw7$wvGMJ7%|W28DdP`@o4w|mA?(Gp*D#=yZ-%3GF~YSlBJDT z{$}a;lHe6jxMe$i&EKv~shcS<(~(@dS9c%}%c9Lb#WRDqn(xeVUq%=u+eoEjD&oLI zhk(nc^Dm^ovn778%HL?w`GUKSwes}VA5x$g(r}}7Zy^4KxA_`>83lMcH7^b~e>T}$ zAS^IKBa2EZIV;t!+j}#Lh2m7(8zV^_&AKWakkK=*VaduZ_h-#Usx5zzScwqHXcm%| zjHFoW()mrn$>SP!V5>1*b6r>WVx&lG==T#o2YfZP6csQ?9UcnQv?5OO;RI^p^LGI9 zw?}itA`AhLC+WM6!Cydv1SNt|wLt&+t81?Lxq8)_A)$uZ3*dlK9dWBRyWCb&V7sGv zDP8$F8JE@VOQs!Bjv`lS4Mk2j>L&RPTU}6Wi(o*ac#6BnxCsfSwSHJ`p8)w zd-HS!1;!s7?K_($R9j=8Imbh8x@xUUFC-d`P%9bnZyT@NhD^w;6o2ATQ18B-9{*md z^(*}VaK!k#>V(7DYkc@hKGcANBp6GcBb$%tEEa(B=-S6W*%vfL3wg6$E_43+=LPuw z`Pv393gvMXOqkqID#burXT!O>=Xbw7@&-Z($QmF<9{IpP@xyCClyd_ar+GW=Be~~OhouiP^F^on0jxExMvFhDxz-q{zM2Su~` z>ZVwv3>s|Ty}h|CzXNj|hO87%nP1?QfDf=3FN0Ajao>>g^bnZYGd&cNJiaUZn(`;? zzk;t>oNG|856$Up*mz`7V0Xgxvas9RobIi9Xg;U@+yoah(Vvucw^nak!`a@{xP^$y z%!osCx4}FeRxkU_pf}LTnK>Z6`3$J15Z)(qT*?OJGi}@ZKR39c>fJVdGQAhdOS`3rtJ>BA(}xI zyEC{7rH@ED|9Ra>cmVuRuvSX{!(~KVSocgxxxRD8A`1n`XHbuy(3c|ie4V7Oe>AT= z9R>ttObHW`{}5g`f&;mf=l|L2nScO46N!<+i~gHq!X+#q23aOLSRTAO7Vdn4zY~Wg*0a5mpSi-3{XSCPu_;?2F znVA(4zV;}#mumY!W8Hl4pg32*Rzzc@$l)#M-AF1gNC(UI5VB?q92uOqAo@H%0eQ)j zOc=x*$$G@12pTybfaRr`HSda3Ndljx`}7lX(bj2fk|2aX+UkwWmAggS@B!eK z@$ySZ4vqfuw0|YvXu&oJV2MZzAyl_Wt{zkg&hw(!T_4wlT|^JFsj&r{mI;XM7{Cok zhgt9*D4Q=q>yrmQ{vB*fgzdg?%_a9yrty88xkaBI+I!LxBkSLtgsAu|y6M=!_Vw*c zvH_^Ftk55R#}bHLM&OTQz%$Ioo4zezk92TAH5&tbb~|9vbE$$8Zqgv0b0Q%F8UWNL zJb&tC>6B%|4`4{>dmlM7{<>@6$qYC=8fN{BkW!+MieZ?>CE2G8SeOHKo{xV)Op3Zr zfqCKjqf)Sot3e)M2MkOelqr6+r2M_W`{*VT6@h@)&~_`vA*W{@g5DXVrM60F{iVbh zu{^n}fbkP~x(*cRRPSVky37o9-hg#VB%pWgc{VmqOE253&@h$XIfV>JYW!RIeTitr#kVOPt7@NDSJBy(4G!U+5E`I@^ zKo&7JE}3Wz4gpoB7?BvHdQx28AcCL^u0}9r>;|4^`zWD%RRzle{z=h6!e$K++x4!E zx&u4+{iTe7(la)XK)W!7xXA9cJ^u+1KWFy%p(&QiJlDNS2T7$io5?!8XVH&0YVRtI z8^vcCw>($ml(M0MWXt=&{0sjVQAQ9iqQRxf?ieJ5&qP#!1iAvQ&PO+%U^L^_EmfcX zAHYDW+=Z?cqb+Ysz9@|0?724r9Iq)y=$@FF@7s!$!YJ}Tn!5^@n z(v17PaZ&!Yh_k4vWuifuRdk!E(Ik-61O6_cbATOz!k1!;#qiwBsC|7j4vkv_n+VMm zt`6%oMXF#Sbt*j$A&vT53_lD8^iB;tdH)Zz(9#qkDfQ4OnQ4m0<`X6OT@$7A)WF zHWj~43U~sIbE3InP;SU_IK}^wByJ@eer=@ch+;DlbNbr$1LyzX2;y%0=5692lDV4x zI)NdJ&8fQ&8`Mdq;;)?i%74;BOYK0w$O>qCo)?G8l-bG`@67kYiQE+*v1hIdI{=y))L;HhedUl>9VKZ zC7TjT#VA&KXn=Q6e9FdA;?`&SxMY&epN`Jzp+G3E!xR7IB7;geql~uGNaCAtYFQ3PrL)jUeV`^xfSLZOE zviBWe#3dp|T;?1ag&jBqMOxIe9Kb9X&!PV>UEa^trSfzXnwCl^NarjCTD#gM??K!X z+(+QTpQ~C(QllNJso`}Dxwu#)zMGOn6bSp{3!>W>3x-+?TlKU0wjDrTn5~S-)nUSo zJBSqIjl?+7^h>MN!b}Ca0ew8rH)VsDq3tmvJXYx_z5agXvOpR3!d-9ws)GH5r(5!L z@yK>l+ULAxhIS)m>>?JM#)>g{&S@@JxlRb_ox0 zgB5;m`m^#=)^XY7{3FKgmnRGlyib05^O}@sNN+8>?X5MmJ@G}&yvDdY()<{&#EYJ# z5Twau_hk)AF~(LmRBj#8tdgq#0<0l7#-BP+`e?{$o|^C)EiqTlX{Sg=y+y1;R*TvW zxg9)vR~dTM_e1_~-+*j{>&t_ig{fqUqeub)IYJ);da zgx`7uz!V!zP4+R=rghCZ=IQjVL%^#f&!9|TD7(5ssfu-unZBjH3u+LOL>TmQ#n2QN zg2Bcu6Dy>sKJRXhg-YZ)uMYF7YM2WDsnJf5rp(m*LW>>-sKJA4 zcE4H|+l=rDyR60;jYHAVFZc^G;)R7D^3uQ#e*;X}3+*MZgde6mdP2TJ`ecyq3a5<; zJ+R+c-g^vPmUDoH5YGDIg2x)C-g|ZM&agrAR0RBV1_;S|s9i&u(`^W#9zuQ)NqqvO z$26$jA_c591^8wyzsbhZq6wgUiiOm5AsHx5dE^%Y)+#1rAOu;fRsJdDgNS^ch}i>M z_9P7fghCdgty;;i{uUue69L^i24HZT=4Woc2|odF9}ED!nJSFTMB$6jD-;DkkfM)p zI!I~p1dqJqrLtJocYle-%ri1AkkGSaPuHAB_4ro)Kh(W>IMjdpH_SAav5rwuqQTgg z$WmFyzGlr96{2s6P?jOvNTTdZDN9*eM4}``HKG*SktoKRJ(N_BV1fEka{0G!w;_A6|>^ePesiA=o}cnETh1WUiM zx!6w!fTSf7W}~v;&9meRze8{p*%`4pEM@bS{qHJ4AEwqqZC|MAy>r+JNzCX}f@w@n z!$DRZJS&QUu~*+5F+)XafL?HR&j;QgJ!-Sc^j`)q*3sDkBMBXjwbDco3vTm#d|+We zB0iukk$?i~Fsr1En%#B0u?GQ1G2Zw--}D&mAa|1~9JF45ELV)wYCo;E0$InWy|)L= zk~|xvaKD*ju}d)hyPMb_0-~6VK~7e)!Tr0Kc$*0l=7Q@zu=^WgS>_laK5d#jry3)2 zd~~6|eR>bN%9b0hca!!{(hD^}h!*zkjS0&;-CoRz}@JR($N#)Kly=wmjvo%PU`xNflI%Y#~nejihwyS zFzMIaN_`6VB1xTjWtx`wLVEH}vt0*x=1g^d4)HgzQ&yHE(%( ziKV>;A5+8W^+`|NhZ^l;A_Z+f)Q87n2)9pwM=#E5H5*!SOAk$Dok? z%IfQZX75_5XjZ=rt)D+?J!<8_SK*q-kyJj}`=H035G?Yt27KZwC`Q}sCx=Nh_TtHltiqKwBYOO>XOi(dbehjQ< zmxD1JkLVd&f6PX_KQ`iLN0V!$%VtzV*jZpOx3TdOAhzqu3d_2Irk? z*gBnOH|XW|zmEcVeUF48V3m1zUFn?B$n1G3s%0j#F@!myhbU7Kae?sh&V zN@)hrz%-PRw$B&Bi!7X6s|U*lzVK;f7Q zykO|LXR1bQ6>q2UKeS3_oY03D~KH z$S01x^$@&r?XB9u*JQXK5N?$XO8L@KQJA=c$dwR(sej$+rs5hlo?YI6&DX4u{5szaIM9C9O0fJ7o2I{SN)pOqP?SqwKSJe9VOy$Qw}Ko)UDXGRpk zH^7=(fZx_@?FVR>)a;NFxYW6-h_Dg$ThN+VBT2_VG<0#XZ_Wzri?9vg9ze-wJ|$k@ zwnI{PHCgIm_-C`BIc$MD8tV-JkzH~Qe8eW`h{21o_f~9pdOn00L+3wXn-5x}=MY<$ zElsT*e^Y#_#NwP4BKT00i;Tm;5R~V)Fp%^6=;VFg^@1BFV7i7%CZUSY;Y9CaHEN=J zhoyDL)SwcY!HTG$;UPd5)UqnZ_uJt zB7ghNDF(mMqtmn&o4JG7XUL29J*dK7irR*sobzA$bl+4}F2miWj_&N+tW{@rKwIGO zju>#{$=yRq*XzH&)HElfK_W33K$li%y0APIGb~76MN3~>jDoLh#!^JIuQLSph&MP3 zIDBaYpFr`Zoa+q_?;c*>N`2J&N_Ryb5GJG^eAc(J96G$O=-vK}9K2q_5yBIc+3J(2 z_$8{6`N@#|jH9v+^iEY47F}&TNpbW-HL#&dY!ZoH3JjaR_qmv3G!_o&yZT9Gb?rsn-b4g3f zwIC76q*z5TXUf$y2!|BPbqx;`T2JhvNW>8-4 zDfzRT8=nUQD+FdCQt(1B4%OvZ-9*2`-o_Nn@ssa=w*s}@k>C9_buYCof zLGaKsXCwgotj1P@RX{m9zRUY7!!Ni1LePOT_?wyJO@tf(DK_auI70%> znE1j;&&Ybe9`)JaJ>uuJkJqFh0W`)uts0P*l+C&o#Q_YZOcYXCaPo_%lOy>4m!iUr z|8GTwvJV^k(;y%cDZM44mzUnc!1)0np8FvX#R5%JSv>@^A;KGg$m3q4uM1;U+5gi3 zQF#d5U*j9!dVD(wvTM8B2X@NruD-Sky_8lQm*ovB(wUyz#WII{E2iuvoMwt`z%$Yu zu`qATLyHi63&-0FV})iu=P+~JGX}e11uDmn2O_^ux*#*gWZ$EGFbv2?|9W?^1k$vD zf!YYT;l81&W)XWa68JJuhbMt0im@UB13ClypL_2eHNstdk-M!GhCe6-={FH(*U8UJ;;`_7D*ij*2H#r?Bz=+MfYy} zL$W#o(ag!dMn&@A*h(jY&BxT{zy=cD0|T+z4&oew4zD*agvM!9`}gftdK}9eVQMoC zE;($md;tbH3Ol56_z#X^%YXDNyY`|8L~+zgrh_3rVZFFU9}0e&(x-nL@34SW?n_NZ zke-VaLP4Umfz8#c>R^o9gBt+^kPhCv^oFLbH{ej^LsMd_inkyC#xd-lpmh$zlT z%We6=5F##DuT%Z21=w@{+O>ddPp-xD;02%`#wX+ejW+hq=gc4gh#NlRolc?Q3Is>( z?WtGi>OYizP3&ARt{NZ~&x>D!YeHICXMeqJYm6<4X>%&{gS&4r4X`llY=SSJu)T3S z0F0SbY3d1uxt(Tae3q}s@{C3#pQw1{6lzaF?Ok5A(;uf5;SDs^FR}HV;5alXRh2Hiawp^cAWt zwZbbfq1Hh!X1z?#{LR?uRw z(K;l&Wy{;occlBj?JRkIyWWOidUW*8(ZaTl17U!cnbY^^LJDH8i}5kfWTr*CZ?0Ue zp`wPB_gP<7CvN=Ke(v6~px)b}xX2F6_{AzR6r-xw=6`&@OT*;zEVcsWS?R550==R~n zP;d;H;aVI+X2=aP!(aIdzc$@P6bsbqMF>Qc&})!G z0%(E*!@|NyXByp0k`I+`54t=?yuva7W#Hct1=`yOQIk%{9^6)RFt_6 z!HR!hVt@e=)Uve~o^lHooOVG{h&FX$ZjdgRdSUwU;=Oxo&OR&WzcG!v2w)4Xeq%yO z6EESsczeJF&7khbFbm9-D8jjh1U~U0xJ2Go?KimxlaJwXITka+z}tUQ4=cC))fZ+{ z)7OK(@cWcN_1`>0F)OAbFNhbu{?YU_fg>Yfn;Pd|#r<)9kTn`K8R1wGA1q>TtZF@| z*YF9|(uKrCbCugRe+n+4QkM$9t+;q6I{MN{^xEJLo(}`Z5!zFMR$1h?$iWPORMXRs zR-!)KIehNj9UEc5gin*cGI|~8qXeaFpiORAJP6=S{&h+1@Na2Am8*69w8;mF#yYc+ zztR?Et4nZ9#im}xTj}XYIlT=~;dJtoF@0=w_9sIqwuw+1K7So$OoxA;ltE0lsZY+oU5pOHp-`N} z_q{*-lx3Pi!k4v4n`)`cY=Q9*{?rm^{&_HR8SgzlrRGxOdwvtjJZo9y6wKX%Mqlee zLGyL{5yXut0rYhaC;-#{!e!*#6fH*CJmZ}=il=&VS}#L<=I-{|$B#609@ zLNN4a9Tk;*ZjR;7qU&UL*;v8|f4LTP6B9f=cE_l(B(+1g714E2xt-aK0yR_yaO|@t zB4G^P>L6b{2T>YDaovmfd5ey@d+43yoxUC&6J{~s)FFaK zL@@r;iJdu0dfrb?ZpI9PiZ#|l(z>P)brCr1#I2l7 zAc+leJ$*;4J2JU4OqKH!SI58Cyt*S?PB$d}jN5$#C~AZfoqTvhX_b{;#>Olc z#@uhn#QZTIT_2x}ig(mrgEq3a{}5U*kS$OMa1KFOSOFGb$DW5JMGa4Y@q2r{ z7fLnE{|+VaMiJg_!dHpo{T}ZW<8Lx1&a2eU0usnJV2*Z0_I^Lq)7Cd#dx_`U zkkh%@=m?8Z!@0{UD#p(Q(d>(KDW7oz+tcuOsr`J%Gy(_WUPX>9Ime%B-1GR!yE_qF z=Z0S7zTXqltlq_K%@esd31Q~82y28B(SCLFOfq)mIFVrpl5AZrlxD#g(%3WeYqRUe9Acs4r^IvB>3n! zFm&?V8Ur=w_}aPZR~_os6A4cmY}VJCxI?%)L`e%-|2**^KbF)L=c0qoT)6Tnf=Y&i z7w8*kTzqae{lT<+ZOk5JPS(9lZb|4ZDDW$Dul#%!jq*_gx=(IZicpUH6%-r@FZK>_ z$R?3_Tkn@^&9~dzf%I2x2uWXt&y%&-VvRC0@Lp#M3z0q6WefXq(9T}pMjNilWk`g| zme%*>rg#dnHtM0pPH^g&1NNAePigoB8KBsz?Kv`W^Puf3^UL`V=k34f=J&NabKmDzs*#<+-litkb{DXlBTSc~dnKFTKB!ome_B`dmkr(PxpWU9! zoZwc(nN8bp@#-be?AP$&58>=<_!eX7?)fm*l-Ii;Eo|@5H{rHpaUuk%cDL2i%zPY= zRug5LVBe+kE!Bac9VN%kQBKB^gQR7>^H)ng8B-_`!}h?#xf}|T&j?8r>95 zRsT~L(_&sA1b7MS{`IeCU=yO24Ys^qH7pV;cOXFfB9kxUONC#HLq5TPQI_sMjR^pZ zU^?;q${+J$RVPXfAkx^1PyT%lc76=S3CE9%V<4cbubbTflfJy`t&*WtrX_Z}*Z$ZB zqt)hzNPUegk=&u3ep#L7=AXf&-GqzhrWrLi4Oq;b}cGGQ=tM3p+I9W4=By7t2Bh3E&(ZWtM;_Ur<2F|!4p@5wDP@_ zL2eXbnWq)D)yx={NVyCQ4oZM7!44J)AqGP*UKA<`q?=y3wzaYV#%L5;THFRcyJv8l z2~W78GOY+-^Tc;y1zvj$%b;HKN<4P37)S{8_f)hf)E0Ava z31V$wiy9eVh;oi82pK|CAYNra0YC$5^K*&{&mdT0cPRuD&c)JH-ok<+mj~f@=0Ie1 z#~c=UDMH7U4JGwC46Y^68lbkx|H-k<@X;Ewqo+5uk3>9C#8? zllw56l=p;IYbCKCR0i4qywWY%dCLZy7AQwUty>=L8eqm?E+Tx2g7-g5rU7}?B!gCS zNdVa4<7fr?O>a;c`gB@>w6_GvZSy?Xo0AvYl(-T2=$KXkYaaNK|*^BU(S9bU|n@jA6^s(L_hAfocV=Hx((Q!D8VSx}&on zr>Dh!pw;~v8wMhbbjD9uZWno%*uOy!xZ1O)W%P6;;qrVYiWlCo)5F4)7>u(?T1x!^ zm+s7?b>}3wZj8p2)|sNr;UaziQ_s46 zHxHFd^L#n#Ax5U-8y*)e?dSf9MCXNHk3Oip1(#q7>LM>768377G#q1Tro>%X zlnVuFD;|e==xLTDX`(`p(r20K_-So?T3K?El250lyQ0wf#4ZSDUreEwUWgb20w!n% zZ|{L~3LgX?p`J+_hgdeS%O&6CdmxGi&jAk>UV5n^9uE&T1xW~j0{>6U`!tiIejyAoTVde9!uQY}G^z7|spJQnzq$mx!X9-EOH|D}x;j=VpGMu1GdOyaN|=$@)W` z`#C|Q1~=FpBi9e6j2B0O7e{{UA6-FKKDgB$qM$gnZvgs09(x?AYQD*lAEeM8V8 zAsM_2fbry#rsn2W$gOCsYd)BNg6S8mS9y4J^tC9uMfYn8{E^m`o6u@vNzkv`fs+); z$sr@j06gFdU~bAl$>ML$ATkR4lJ5n4W~Xx??XyUzrFa&8oii|9F^6vxTl8`<6Nqp(BF} zS{69y{Pi)2ZP3Zn;%WoVH;LMBQU1ZC4#()8;l%u#A<)`c27w^z%p=k8Fd?Ig zGEPa`(9IU2u)F%T(Y@cxkXz+Ni(x+UB?TPSKhrp z>S+(+K5uvmwD}X11*ZwDGvFN#X3RjK)y{+{{XN3muT0=bMVhu2{@CP|g=XD$9m>9M z8lH|K5i@$!ZCC??+RFYS4v!PNE}O3lzMG;+q3lbm{n4ry7d_Gfd^H&|~*52+U(d_|{lyG$}YiY4>#j!w+au)Voib0J2 z?5^_tnq44<=&L%CeG(=bWXZe?itV`$r+sE{8Qt*Im;%hKl9{>ZXs( z?%D>CQ5$rl>V3N^^>A2<(cH+3GM*EQb!g})zjq`ke^Ua?104XXlnAqO5$ zOOT)z4oEJ^u-WhT*y1)@%Nc+CAzDznUcx4LVSnnjklq&R4ZIhOf4in=uQ?5~A3b-< z1(V;6_)dIK65XY#CjuNFvM(`>Zs`TDqpCN276!>BwCSA8JsgB49(PCX1101nas++g zR2N?fiur|-edW72`?^JZF_rAlcE3S*9&{re^4vowgd(7>Ma|1;i6*$x%6Ygv==yI! z12R8*mDu)FZwF+z-y_&0JctRs3i{BN9zue~QdP5%rvGpZTfL>ABRP+|UJLKKEV<8( z@8Yq+r`*FE^dNY0%^Tcuh*<*51@LI@xzHK{fSz*Hx_fhmE=jcwB1+qM(47e`J4kIkFIBGZ3h*xHLs7Y&Z;@*feUdhxwhsRZ~c zy?ihXk3O-k^U!yMOh?veyJM>b&0eYw$82a|n5$`zp+3uh3{%zCV$XS!;2@$NALID- z-HFB%q#LL=QGw<{^M_7PfhWdst@uIJUbVO%tc({!u0_Mlxq?f=XT{welrgUx;M_z)k#NU)Hc#MYJ1)H|83c!DI=;sw;c{W3*T52s@SQ}VRH87o#Cv%s_IT- zvaZv=^&7-D$jpnN#PAcr&`0ZgvdJ;P2WxnHTIu~Egc*Gz(5ZXBpZ0oH@M&VXy%)zk z*M0b=8FZ-jbv~U8O}!aRV;LmNHbcyc_zVD9tzZ|c=lSsMOW#T~TL1&2H>F82KTTUO zY=RU(OCo?h>j7&5A+`6Wc$JM6=u0Bsg11Hz66UQ|p#t1xo7MFb>yEtf7?@Z|bW@j0 zd!Q5Qx_tEmjJecy$elrmnn@Gkl5}EMg?A%#19qTtG?QKPPjI>kDE{YuWhnr`U=e|(O_v6reEiqb>Y;ER>@|6Y0iPi-MXtx?S{@Szkr7RU z4(&Vyjzk)v&JCPdWi^Azk71ck;Gzr!iY|1g>O;dv4~hW2)@A4ofYHrZ93Nq26jzj5 z?9PASC;9-8=@_B_%B;a)a2bf}lzEU6oxb_IyX2M5Vq4%xs4&^YLlBLM3hqDs+t8<5 z!U0dPtD()@lvs&Hv3+3g+jS8+E`f#@o&dYTx_ygx)J7seVwD9=K`V5S-thbyX9gDm z`a{yZG0=%26*tPz%)SXN9RntJxSnNsLDg({8;PgcaD?1_XU#LX_YyME+zS2Z%d3y$`5X*l6bf#6%g^7(#bRqM~}e$G>PJqqN3D zXwwP&{KeQOkkLB~FgjXQL{$Jpz^>61qK#&p`#@T?>-_YjFYM~<36b;`?;a>k?j1*c zeD>6Z!M^3Q^^1?8>Y)%gil`xu96=RWC>k7>`|mNLdT;gIorM=i4%;E$5XyVr3`bTW{Ha6vPck z(REO{s5Nphd0V@fVjEmO*Il={WTlWJ1f9JA4TE2Nti9{IzZ24qdh&`Pf&IwI3gvHNC4i# za~SbA4U1jsj1Y~lC4Z`=2`KDtPv_-y)`iw}ztG(H+I8zBAhF@=?u*+rgLf=POcY9R zZ42|+Z#Uk)>33;QUMNhVXr^d`;W6SxeY^0*+jO&?1;rsCPeE^**n;Pk@>9iLxVWx*nF z*$)s&S?B4X#T9>h8QMizJ~hCBz4^CZEwQ?rEwNv`sbIatriW&%WD$ZRl&Z(qHNi&Z ze2OXF4W$WyRwN6hO~W%WoPQwh)w5ANKyw!s2=dJZU~G4%Ler!WS2Gd6egLaiKNIJk z!zK`wkOSbl1q6zqjjoSK+JT-wBqAy-&l5|a*#YeWOJOO?x#_>jT$>T*`7=9Mq{3GN}>P3G6$ z!Bkg#V5f#mW zQ!g(Jy|=VBoBJ^PYzCd{BEQLUaHi`UGVz{hOtUAEZcFP0DD&f-6Pf<`;9Pq5;9+O{ z!s;~S;c>&@?TJWUMO7g`-@R)i1*y0Lp3%(GGPy%YfPW!qL zzlN_CIps!lI8Mi3bi*Cgx%K0d-5dk~q8sBy%i-Cp1@&_8!cYnWOO^iDL&b?Sp!d+o zN)Ql`f*?bssj5yfmc%>1&U7-^X&W3}+rY9@%v~@ZL9!@A5u`eI%B4NH67Rg!+|3Y< z!8iPaFD4ZBvKC=Q_~j(wbNar~?{B9dfDx>yx&=~zz%iQ&^rQ%QalkpdWC3_NUtaua zwbIk$V;qo(Aot}EW8y;}$5v)IMBwQz23F@Y!W(Gcu~9#V1vY2|T?75r)3JA;BHIzY zTu<-eNQ`abcwi{B+Og2qP$4dtv)_=j_2BtcOcLU0tsf~ z=}^w&t~OM+*rD&YV~^@t^h5ds zHZcP@L%LZ%cN*!%fti%@fB5rCadJU->LAJ%gl2;QKtWpD5G2WFA=mhR?K^zmkKeMt z`{H`v8%MRgkUw}_+*zhLMy#E|4j|Ff0L^1q2N@Lg9N6B?z+Nx}*|wP|3yt#-fW;C3 z#K1~Jwb*!5ghZ2aA?Dc$~6n2 z?gLLB9`FHlXzT6*FZ~?$rIWw_BGMBGk?E zFr;d%+YZH|7z{X10mDcF=iv6KML_71Ae;G9j!xu#J^_Kx)o9U$F;EuC06qyRD=R;R z1~D1hr;QLX6+HB{=2iOGO%^BDOxMq73vhP?09PjKHb;I-w*?VpqwC^);6i69=xUy7 zeyJb4liWMmK3p5MIPUa*sc`q_wB+DwaRqcLP}BHnX`Jz<&kXvPt z?(6e=6*0LQ$*BGG?OeZe>;Y!Wem}U{O5EXsPJ*JUp`|Fe9%Wu3Z5gZqxE>#Vpe?8H zG=mrpbLqM8QNwn|Dn#K#PR{J?>DXe!;7jy@U9UA-KzA zbJov8CYK|3HaU+ZDS6!^39vu=4=#JRKkIS~AQct{~?k9`l zSdbhWxhF7gux4-p*{Wo|v;w=ZEA2C!Kv{Ib9Y;%uR%@yV(gI=q$+U0#<&XD#KI43J zqJ3D5eI8sh=7ypbSAgUhxbgef_RzlG?*126q24ZsgtSSH;|kpjx^TT1lQnz1vsy^RHBqNoxJ4wCs<($4uC=d>*r3I zS|7$rwaR?0Ptezu3Ff+KDt}KnI07yq(p`2D*m=eDN}_<>Q55cobz%*y=i*{QL{}RI zL)-0=W#8mZ`97YVEZn(z;Jd59k*Yosp#CR$2u{^>rv0XmtDFupfF9J11DO-o=*B!Q z6K;yZW<2>b!oq(^7op}t6Y(#wpUMP$01j`u{;&9plokQc{`{Y2$ZKR&4j91=;fyB} zT^LSv^ixoBe3J4rDmdfDX+dnGUmAy?eo8WhMFL*ECDzNL%8Jg z1elU7A|mP`)ZYQc?1EfoeWOyzDx2WI+W8eOe$WyGXSu+pk@IkX?$76hkGd1t`#(J_ z9`-P&Lr?7C<1+IC1PpoKCO_D72q?;@YRx4;tZnB%mzz_BGvng0Xgf=uZuDMAF%n1B z4!~p!5Mp`3k#{`_(sf!POVAt60-xXT8qr>tLoivs(m?Up#3i_v;-WXd(dUE!?6Iz@ z;*;_`d8J6h3obTO7;zj5(d-LJrJSC|^=S4r1B9OCCrprX$aS|DPchzo_lN>A5%*@m zC}su&2Ez7_j=hyY(msG!U7;hGzCoFWPP397KH4)uYhQ3hgE6MIcpvaa3qnFz&VJ#0 zAyXGXwqyp1uM()dErX~I-Mo_zVSbPjG@ivaF_VYV$BT-Ju%2uMgqa(TH!h$EvsENJ zP$Na|fB5ta$!F4`633@Il>WmJZwDv4C|YMr;Kkz?(CV=#Cn&eEm=TzltX#kxDG%?> z;r7wpHNG-H$2i^&K?DitgzW~r047*VvTCo@$8>_E)^lpPc;16dlQ*u|_eg|w{pE)^ zym(br6=v23-c9pWNO+ioSb-L3QMER90J@BpmeLxJf`14}Ls6s?0014zf;A0E`H1ZT ze=eeE<{*OK9J-Ve({wSB)?psF#}32sP~{l?rdvsztUR}(iLDY7EDGE?6NQXoF!T-I zZ>{37W*^W~a%DBp#uFLmtJmY%94oF@>~_Fb?6SnoA>`ALhdTP~5QnQirqm+Fb11q# zdZGW+%8goikAp^1mYN3)eJ^zuI2`gLDgMkP2^`Lv!$?qClDrs|Y#k1eiK8 zn%O%!bYSTRUF85beA?fU7Ubsgfx~OabSPs!HEh$PVOK?%F3B@iG#SPjsB3YX(yU=E zJMX#C(SuO#Qkun;>*5lz`esb84(kz>U}{3arw-w#L*myl*K56W9ca8?|EB+8JCW%P zz?zO?G?h;C2S%=qu{2=t%dcDs7rHeD44QM7x%i}oJ9sXRLh|k+#=TX+Bu1HZc4F(s zO+FaP(a|EKGbMoZz=zH6bIe&69c_kKIIt2%jn&2O;K0_HQbf8_cpEg;)C8oJe)FmI zDN81>!%AbfP$qaC`uJT_Z$Ds`Alnjb^5j8RO#8D+|*Ihce7U!q>-L zwxCz&jFz^0*QLatl7pP`)sf-==z;{F;5a>eV_w zU4;v6;IJ+Sa$LNd1+gI#E+9e0bXl$tv@_@r(G49CmH$Xu7sx{(h0{gIpf-mHhfNcJ zKp|9c>|*5i^Mkc;%*g2>zwVCU@vN7R{r?t-!%#6qCkr4A47mk6q<{&{0Hs`WI4re& z@;=J%{*HY>OnXDqh~&9wv**i!1)cw9dKiWsXo-M>?}2t#0#=>a{p4;;131nC;!8=8 zI>9jJ0L9gf0u+$C;;%6WC7vQ{LG1pt|Cm6iJ5iX)V!)<)lmBi&_+2n=aQEil@9ZbL_p(j}$j0{a!fiT|#KTtQBNTgRAt7&Z_$_`QL} z^J$<~eFoV7Fnq9R*$3Lyh0;}!`53B$lNd=uV>eh_%i@>}4Iwb4{U2bvuYUx8rCk4Q zk4Dyeps_})RB%ZkjWq-IxE@G#WbX+^yMod1fjj*lEHK6u!rw~b??OOaf7L^f{#@Jo z>B9#Q3*Ma?GXC?8OaOLdXh<{$Kd<1--s3C3e`K35?`8S@{{$DBCp-W#aRyTSfb|$T zZqUMx7L8*gNpm?!CItD>io26WkM@E5=?**fE9eQ(7WwR2X&^WVJEU*J_a=LURecQW zLG9YmWdlo_(7E{j7myJ{Z>;u6KKj$~lv~igix3jhp&|VgTF7m9ZsZR}D8+RQtKqR7 z+bB~@D~|BjH+;VbfrAtXWZe-qSF+Lg&Ejqp&8v$1i4DKK}k$9e>VKq`-%MWnAE2I|F8No!428W8F6 zR%rr_1|ZkU?&@+5mL9Mt1`P}hc+HP@+}}Q*+%LLM|2e|Ag03f^ss(?}lH7Ylg>Hj< zwG+fXqHRw%z=8}8d2LX_5;lP#VQo`9QD;q~Ou|Zx(;5SP=T4m7HHciciDj*lgS+n> zOhTpm@k(cM&I7#n99$DwId7WpEq-?dxbsu?6Td(I3Sc4@ytpUNR;=u}?v=x$XtdgB z!}fqnr{9saUVtQXm*sPCi6i7L_R?F_(*Q*6P|gu+m#(zP+NjJPb8`C|y?VI%GEsbl zp8?qyVRmc=TM7uVG1?uc_A|QeBY(t)l{{3{_=2m4gmZt_fT+JP_Pj7GiMC}fukCrN zlw9^t6RY&nfzM-1mVGDj4U-$O@46+w#dMsA&LV=ce|3|&*zgeG?WSY7%i4xB`unFdx!K!_1T!Qq#&7mKynUuvTvgP@2 z!P0)>m%FBBm6t2J)@Y39N$#}Y^Ma|Zl@bK#8wGrv(D0S$vT1&x?frQYGDm^e_RG zFcBlOOV*-i8FU>yE+gd*J1gDRO33IQa>g*835c%?F;iF^lU)|}m#XLAm56CuF*R#R zWMkWmTl}X?Ry9LpBCg9Zjj6~b3rmn?xOf=d_)Kcd4HlfuA=|e#ey%Ielo`YhdX;1v zJ85w^9AzDV#et$vk^xx#hK?Z;g|#}^lU^W2Bzuw64p=h@E7780`N*+3EkN`LBz^7l`R5N#PdX!R@X zii66%Q{%#m)wzrsfO?9T4-9%%Ybi|O2 z)Ai9Wz1mU*Xn_p0jL)FvbbJTUsB9kXX&>f%+5+S&O3!JKzTmxVL20pJ%MKG zMaw7>JOs_t=$l6%5bPX^&H$)^ku3sBCySt?cS@BvpRSH^6lx~m4&D1==HPL>S3@8VwVIX1+RjKH` zK+bC2`jLO({iEf}^|mvnexRj!xUziw9x!`^o6*ZZucAx^9uck4W%nZz%(^)8&_L0r zoBMRim8_SW%E6*gEwtRr3UX+f8lC|fHH-1n!FkyFw1~D)a;4LywbAPt*&RW-D zZ%_O6zP@nc+kH@EhTr^zbiE-en~13$9}b6`>)N0C9OZSJNSm>-Nb^URt-)@MJ&nsP z`;Mg6AY>cAC<~3<5x&o`-Bd}ELoHQQIQ03a+95=og1z}HkbW{wl5Q(#Km~Yz$2w}2 zTf%vm@r+P}h1$~#u*9qsmi5s-UAKpg9Ycvy1vX^~!3{Z+Xv=-*SIul3%FavK?3rhv z0rRm1piV_@u-m@rrHA$$Lz5y<`!FyCZ5u&BCh;PH6%E=cUF$zm$3YdO zTnahD5uiUtVmIV}(psRO*y`~Z8#Y>a3adLhl9hGrZQjLJ8F8jB>~;WsbZk@nZYt<$ zdc?fNpVe>*SbLU+>V*8pd#BI*gw=Z!RlB+5JZcGz3i#?@#?J?tkA$GS8$Sh5TjxGl z_IrHq%t|tpE150Zx|0icVF&Locixvf|M|YAta|qWl1d`YjIS0vK1XV`&~lca4v;>h zb3LUla4=p28odyo-*CD6Jb<`0pGeTES`A0R;sl@L0GSB)^i&@zuF(doOp2egGu%eq zy}++Ge}@d;Qa_N61^IHe>tFi7+EP)Hr2^{#_k(EC?D>TfEtry>@&LylQ;UYL(%~W4 zWv)lSyJI2uhn~v{r((kCb#PQ2Jk#Lqz zNa!$3#xJ)+SDU$~;*oCnXYk=w{386mnt8R4>r->^c)K!4Kd;{wLW>5xwZL_q;#a|m z)>5|EgEMFlD4>cu?tLq|P-C1{q#!py-CZT)aIV|?V2SDOE@)4@d0RSgey3AYoq9lH zRk}^6;!($i6F;N*&wu*8tifT{ps)1u;@X@>1MWt4Azs|HM!#coP&HY?Fn7Q7wSfM| zn7a>m^jEA4eU1G0z4)&>6puDsg*}ODSm~q`vvwIBpyU=Z*Yp0A8lY0FSQ}kq<3#yO zh6==IPUqNz=D1z9rqSUhZ2B2)7ps>v4LGv}T!o*sJ)b?zTLuS|to1AKjke>dVVhr> zsU*`C8jrQsuTsvlT+&b2S`M^C|&sF~Vo2C^aDi1dA^|r*2%Uhu~ zPUpH5f9*fsmZRJ~SNMsST^I?~56@s8l_u*dL}Tctn5GiJw}kTL!lmWKNG>j>uiVNsv`p%FSK5 zDgGZ(QHrWyDabpmp6DMmG&1@W+8AdEm_TR(?qkrsg3VSezk^l09~M4N-Uk>Sc0~&R zRPd$cp~r38miC<=Gz>bQQ*voV;G4R2Uxi=)z3IeVLw>wMda*QF_6#VZ>?7UB&1;WS zx3TP>en{|KlZIb|mMKu$c)b0s3YG)4Sl(Vp9X@)HeN^VruV${mjawdk%LqS^Tu_iK zC>Gi9KJxs>V@;U{zYq7n6WL^an;7J~cEF=8@pH*}msXDA}UD($H z>!kXRM4Q(fvYpr+uj4cy(j+eWkfm3h5*7L6Q-3YUlENe1Vih$d`hGPWnI0IUs|DTt zv?o&Q{U_V1<{CIq*?Zvw&J3SU*rpd7T@FLJb#K(79~wF9zh^jh*4807_kI1xLwhg_ z9`Pp3xA!O+#@4CkSZ#c-a>sAwZk0LVD{Q~GIw6_btMdGshZQzKAUULO*n+3bwQyU^?Tl%+|yzjMR``uVB_lhL=YYDM1-vofuQSS#;`km_r zGr!{XA8I{<&Jmw}9d7-6MBr|Ej2Iq9rNPT+-5FR=t{n`l<=?{})ikTcv~w4yzvpSMik@;EUO76(hx`uk(x^^oJudl%E-PU#*t+I-M zs$|YIQ5WXstL)$;6?#)8VCr!G`-}csmp9Iez))LhmHb&j;!bjHx}gwM>+pS<#F6T4 za}V=Bk}=VI?75d5xjxWw<$_X708YdU-|tdI&%pxdMvVA?aSB^THd+V22m!y*v+4zY?kG4)Q2#cv5613ZI!Z= zi5SjyYM0dJ-j?$@;ogx4T!qP@#l*8%YW&DIXsk<{DT7O)$wtbb2anQm#8JUVIKjDh zdXp7*=;xK$Psjf-IR0Vgp+X6yZ+%P`{(QbpbRcW_0R2#hwf210>BJM;n%{lBuqhsU zP_)#qDUB=sKHW$^?S@rCN8^kPKSXZe)kO$`r={+Q8Dm3b1I`aH>n`xo;FhOw+?6hn z-wq4g_e~w0Z2rXaF*m_@AE<|ZRZ)9HR+Ma(+3hS|=5tQ!>sL-9XZu%aiqiy5WQN79 zettnmi*v@ezk*ZmHJ(^Yc2{3Vcq#PphG@(>gKaquF|&RjKRmvXbn5K+&6suN$C~)D z6hC4ubk1S(Y3gmS8-6B-UZI<4OT4O^*(G)NxKs?yCeLZ6J$z9+hDd8{d2K>T*l@t1 ze+jwQx_Q!Lq73EJ%G^!I{8{76`V*I8M!CYJU_%o<6{0Tru6ao zfLZARwb|ea-H(=f(Q4sMAm}j=rZ}8*y~*D4GiV{WSF( zG{RCjBWFVBc}?36Xp*mG$-BIr$5*hOXTst#3RovfHGT)})hg%ujE`R;l4sbN>*p}` z_my`g^eJe!7q*&@`NyZ&Q)@d{I13)m>hfJ1vK9)Q_S{b3nu$K$=Ud;!+iJSJ6vEaL zb#}in=Fp7l*`b^>oPk?;cUlG4XgqE41vcvX0log@7nYsk?w6NuXWZ!2pXK=JT!BkJCkk$+sx8VZ! znu2Un)qi9wZaW`)nIJ)`6^0iy#JbC1C@r!gtubb76devNi3FJjOOph?ul#Nb9ZDN> zWno&iV^NVqHd*R3sTdFZ?;=x6D;oc4{g z&H6)sUHz-X=SjJ|7`swDN$h@l@?XyIFjA0&ti1WVJ0yV}25-JM$-ay%CaM|@eV^6yb}|Sc!~cVqyO6Q{^nwcAuFq4kT{?%e`fQ4u{3{2bv{Ja6$yP{|2sy5 zVwQ0D$L1S1sYYzMG~`JEodj=)nv5a<8mIZXA2OBY0ibcsi<3~t4iLnG@>%^G9My3rQ}2vgXj6;DwJ?hbi#iP!Kry(pDXOf4+|yv^0{9 zIQ>`kL}1qeNMe=TA>qGc(H9MZgI9>fNc|AjL3cfQ~JDl zEP(ab`+4e5nerZA`rhO3(}lLUr_8lAigk_Nh|vD13M00RV|mV{6d+lHlN4vbqA~~L z5=xI2gE{IPOc}0U=60)Z1$(R$04@&q7Ic9A7<7IwnhRMKjwlU6u(_#8S`+4-@n?^~ zomc8~vp|;fGv{`+L48UWA}j_#*SpyiELSDa&HB{c-5T5j`(g@zu?C00=m$zDap<^h zLoVr5@00TXeeLV0zyC+Tdn93WJ_q(yY2G&g+HFC*Do;r^E7oI^S2h3E82D6FP#>5A zmZbvdX?VmnG`efSZ`J+%|LW=5t#}G@+>|$LSDvMH*M402Y);0B6m&r6( zOGtyQXz7r0-PW|pamiM0p;;wLE-4c!!Z2j`*RGLDa?_=BZufNRuK9~3Rz2bW8 zC8z^O)}pW?*Kxh3KzMO?Z^%GZJ|F5WHdIPXu*Vsbg-86=etI#yr9ruu0U0`f-=7w2 zP`^wlo6<2Nmn}j7y9qe>UMOffC5TtdKql9{JERjBmbxpW-w)!G)fm8cI$#tUhPDkC zzRkPPanrn>Gvcwf|F#>Zx(&z`3|0{ zZqR#Qvb_>@RhpF|@jf$%XgG~-G=f3I6hKs!69b|aJ|fz74 z`NA{EWP%InF45)F=1ab5LSj zx{P#jvh=3LSNFFviTg1jV(}?stXeK&81e)*EHZ<20Jp}CMN~Dl^R@4OR9Ao|bIy5Y zNkFxr<%Z@#Qan#A>y7W8&?b7C4!x}+adaz$ERA9q8j#WQW%uDKeSKjjT7V5>4+8D~ z(thm1Yv7u*)74ERfLIu_Ej@`xdH_~TkvPE>+gKseg`^n?Uk*zyewgPdDeSTGw_clq zidYf_TYC%a0M8X`pK@Vz#bN||CvsOzG3ws#prLQD>r&CJwl<47{Oa-0RjukHVFG?t zEtq~k-W20mbutk=L-fEw2{37;x=lQpq>7s-GwFmh3Ax%SFVKIx>-V4c_Z~%@T12H(Ar-^1rWx0h24RG zuk%>N1VUWeAqNqf8i5RR(cVLQWJ-#FiO7(IDPec&W32xLYdE#~k0|LzoE%0w<4eBH z>*r@qwN)+Wh#yxR4!>USLZ`GO%Q9bxo2>#k70Y}-6j{bD=j&0|QkmwOL=b|oAh(8W zO-sKmA+&oFxpHaMrsz7TetoTE?%=e5B;mCRuWsI#saWwddqf<35JW`wB)bF*lR(kHd zr{0cl*g^LN2;55T)RwVGffVR7uf#H>u}~i$70ATCZR|+#k$UG|=!z4jFU`rAHG!KU zGraC@f4k2+i^7tKICDe;8DR}X?zI_XByEr9`N6c$nTIulE;th&8>Xr(YkE}AG6)Z? zoH%*qn#B||OTCwK2;Ogv(vVHN`nbX+LU8TjWTmFxt3%_TeM1=ve6c~kzqFLW-B*8# zcaAFwfkFgwXZGW1RGpju9QRbniV`ViW z0?9ptTbPE)Ya@x>JMn=10T_{?+Z$YzOu)Ap#6SCd6sG^1fo!<_ zB2Y%N?(aan&;GDAkVB>QAu3kpzc`no)wZ4u-yp~a*kLP|vkwTi+^?>=rngg%ACD3x zic~IdFfnn@*SwRp2m{T|7;#ZQB#Gi6jmC}x19J$y&;TPCm6ON`vz_hF5=B^DZHT%K z9O@66i*ixgCY?-$mL`V}L&ZTPrcaA(z=ROO7Q-|c+sM)0r8bgQ39r~*htA345(yYnR5`czI#;WUf zbz5I5a~FFHQKnr#|ErraZ()Ct Ol5(_nwX52}O8Ou06wbc@ diff --git a/vendor/github.com/docker/docker/docs/extend/images/authz_allow.png b/vendor/github.com/docker/docker/docs/extend/images/authz_allow.png deleted file mode 100644 index f42108040bbbf9facb9fff0c320428323f061e10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33505 zcmdSB1yEIg6hBBjN;;%dQfW}S1ZgBh8UaD1rBg{Mr4a;_loDxCN>UIMkWxZGLZm?& zY4%+8xBK7!?9S}Y&d%)4ym98ryZ65PjdRW?&V8hn=q!g+ci8JxciMc^7!KkZ>@vJuSY|M72eJ0*RBf^rxl2wv9?-oiI(lUN6 zFTW}e7?N}zG8p>)$&@ceomwRb_4h-s%3R0l@IfsB4KM!BhYN$k&kUDM4g>j2Tfh;H zC||MCpF=t1ZlOD;t;3&{XH}UwaPy)c z8F$#SHy>}Q*9Dx^o2<#69lQG;Z+3qFK~_~|J8;3M>4C4MCgG9zOY@PkTYBQ(s%(fI zd{4!$4aQdJC#H>uqm_$~U)H-unBT8V;e7}Hxr~4PB?0TMq(oj5kvgBv7d;u021+rs z>~>!YVoC%_c}jH)HAA%CJk(o_6v27QB#zNAf1z_slYPL`xp4U0`{6HzTHRxB9foKK z=|qwivI5PV%p3jmP7nG5JGzTZYVLJ3>{VKIPQ==Lex}Dze6uL=aYXm&+YvM2L8+tF zs^!|6gN^&Ye|^fn`Y=x=;le9-ojNz`nk5t~IjJ?3o zd3weAucUs$)B9aCYpBgreWGMPTv9aX`@GP!&MjX@w()N3Hl3Zv{`_<2uV1gVhG4OK zE`LpARVFIZEsX6+6ISNb={#}WxEtZ>MzTBPz}PQ-v^!!xH)LR*EFX66Vy4Aqs}2J9 z>VO)|qLe8DGO-6as|I>ZH39bS|!itj*|`F#IXAkVzVyWC6cZ?&Caw%Y;ATj zsSmx5OzTOK-oHM|o^BGi9-cRKuXCHbu|}X3VtVv)>6}}T5L?W@{#If z(FotI^;#RVUKO?NXEw`t=e1@}fA+iiY|Tqb{VC6~;fKfP^&WgFxE}MSp5Vdyw<=|Z z^`YVv*M=MUY8}<$Yp<=lC%SwN=2999+QjF&Q@n3A_zb8_y|z|Q7IB~NDbq+3qFL}< z8NQzHyE|kMBj)tw@p!!pg7rBp&2*6+%F(#dTz!igB{D^8XQvk30Ps<&+?rWfmv zT>t*A=CRgOp0pL18l{FB!i?dGGC#VJ?%z{^&gou9drk&1v{#~qJS9#DB|XLb58tdL zC^K$8tJcnuFN3AIlvidk&Yg;kS2-d68-EYK0Lh3TvBFCwkJ5rDLp_!T>&ncV%ZQTs zZjJ4?N_nlOiq~;d=S;oxE-$v}%j}4oJX&vFH?F!Hv(gbmcS-9+A%dxAXX(qkjyR_E z!@Y6mTY(4N=F#rYM4j&?$=VIFvC1gN(w7Au&oY&1$)0@GD>c5tI+<>EHp&v1r)=!u zDB?7hx3$Bew9uR3&TClFvSxLf5V$j-OsILqVff~pJoVkr&*sLO{NFjWN0Nr~*5@XX z;5d7=v{Q$?+sk~j_3KguQ-Hv#5(7!V!5kGU z(c0n87cIJ>i+Zn;B*Ir(&1?O3UvVowrnux3LBwFXSn=YanD5pdDha%gR1D}0lfDZK zxjhn|%e74qIff?d+k#_o+p@{>*Uwj!S#SKE>CpX@w+xo@yLjw_YNv618wXtJ zADDLK7Gvy!BQgZ|1^&^GUD^auTsyILU1xfCI%63+hz()=MPo8O*a#+#W8!wlRa$hN ze5sQg-LQdaM|Af#?Pc3|*Tu=k`+Oc!8<@DahpwK*&no+!ot{XH?ZU{@u^OhkPq(0Z z_8eRNhAl+5v>VPZIM}%vqa(i6&gn2*QkE5X`c3S3HcqzwZeQlw){ev?>8)?Ctz+Jt zitWE<9X)*J8*qBCp!AKHN#?T83#$}u+yb*E$KU6f95Z0$7L2YCO(b2^joy=cey1mO z!1L_XpGqRHKBFi1fwSk8!Z4pQlN!xi3M%jJ|Gq~hfiWM?Z!VK8Dy0w6Q<#X?=ym&0 z#chQVhw{b(DKsiRQx|rvOw)X)siwvRBD(rE{MHd))VNve8+FU_6N~ZA(!_~MY4qL! z$vfvdObHutiCyOv?J^|2MG~(+7a`1$vXV8Wd+RVF^19=NT;n;$np2i^ad#zn0Gqcl zZ&KZd(cNc#h=PbxJ9h}?kEP=d#-=K*B0Sb7Z!u_QO4apbN}H%X<*{Sq*DZ+lSRK`Q zb+hQg_CjAulmAf{)9D6|c))S3nmarqt5XG?YU#RFob+9aN4^f9$=yHWg}DrI3wpkn zAP$Y86FoQV>NxgBb?t03E|B8Qr_awt=iaS1J%Qj#Gh{#6P*=I;gz0`7Cv*5x;*IBu zzFmKIu!TQfQ{~gPp2gK~RUyO}^V`BUy^eRjy->tAg6$JcFMi|m_co%Q6V~aynr5HIj|<1)Ci`vSV_RZO*tFRQxMrAXbU@*JNX{{_qMePtrDJ z#Way@z&_~?K_){`9xh#g?Pqk$xa>eNe)A?r`i={neHO9r+~yuH+c60>z@{sABJ5+0sLQS*uS(xNu;6 z=9PivGHQTP(yL^m)>T2;MHOFq3_EJPqJo^^ozr;r#ch@!=ehO2>TMpz#Pqdf$j+jyrz9lD+@x}N`vdhSbjvXV*gS($mmt7n z?oKl_GOc>czettzzQ?LQadDbPGeg4q+HJ)*HZ5vPa+vK5vRi&^usS7uw?B)1*Hl)< zdrzDYp^VNwQAx|B5k<-SYLMe5XAOb0SE8}GyQJ@(HE+@MT{Vr2<>6B9G$HF7B3A5; zdr!X>8)z+$l$ZYybsS~(YftaDH8Wt$Oml8N(cfDeFZ?wsr!1lnPOvO+?JPgVjLh^4 z)II}+A7Ln>ogA4Nls3m!^48ibYiq^k@Dw_`wlTGWY*b!0CJz3a<32x^sY#UBiyH5v z4^@+^)n_Z_XRq#2ZE0M-^O5Arix0flsJ~4sYn@SF;8kkOS4+N8xc058liL6JwqR5S zW5)A1ocat-Eyj!bC8_k%em7&L1?mTWX?lniXlB^o!E)UoxGO0Y=lg4Rn5%Y;bi;yF zm^;G@M#XLGr|R3IF7EP=6}Q`VSUer*yn19O=eICt;=dl!cA)A=9UDVF$q0Iec>jb{ zq+fHh_t_Qo^AY3IYAJlYB=@COW>(6ZMara|FD%>5<|srY6*K8x?UVkU-mp7tviy*U zu>duFrDZLDQTx3@yr{F;?oDM=a-WXSUn+b?udiMIp6%pXoLT4ieY4*>m*A&Sjy%?G ze1S!lRzi}Op!xkVM&~Km0L}*jy-g5E_nhAOJT~%8cVa zEyPu_oM>uf2&i@Xf3JU-C+TKOCor-}tutG%!ZlIv zsqSkLPt+HmDrEgQiAzVGh)KrLV^SbFZ=5>!h*$#nHh9644EIOCy zD+!cKh)mT)TlvjNG=SE6z~8 zd6tLytLtMjcgjdZr9IO~Fj4CpgNn7pR0k$6_5yzo|9z)GjPzV@Ih*SSt*eg#BQ(aw z{*KXkY{nL$*Y1+ih8cvVp2~DROQzAnj5wE){&)2v4)>rS?fXSs_irwB&y+bg&+U?< z8;I#QS%pa|X&TaFQE_GJhYJaq$C3uHVJIcKeE(r|U=c#K*OCb}0NuR@CAcG63>pLx zwqHd@{jj{?rjOFinuWz6-GN+ubRqO6?xMbOYl zI&#%gzII%3JSlZ=U}0L_}3y`&iFiyC%708ZdKcj z24t-P_X)YrYwYqJESf0blPRFBhjku}E0Fp~hlW@>E|7Mu2FH{*s+^lyQ88K>qC94PBvBWm+m+x+UExs zNYH^wOnQ4Z02fzoagDYsnY*wI-;8e0@oGvpJ493bw9N)a`EVf);d8sY)K5qhL)~{O z$F@pD|6q7I4H&h~Yr<8Df2XZdEl8fJn77aG$sd5gP^=eSbGMmty`@$hu1fFg-g!s~hjUoFIQbmU^(?UwWHX^d8TrMD`~D?OyIfx%}$H zeWAB5AHTB~0?wV;j+mK`&wNi)S~h0d^zOfi+2!=z`kBb0fPGQtMd&f0fh8=yuPD7?G6Eh8&-H6VG!IryE(U%CR4zmYV3DA;Lq+x7=Vo zB$nBiJB51mV{V+xtI(59robeK)5aTd!BGv6>0Ud26I%LG7}r;SJyXi4H&dFs&V6Ao zje`QGzv}l6U+4w%`I(HCsnb2tIq6^=>+Si^Ti?B>J`EKc=oM}NoJ@g<=>mMynAKyb zOeTjzY&lwPF1y<-27s1rM3~}igema2(zW!5-<80zH+H$#nr;@|7|c~B7QO#@M6CA! z2!*5?``zWCLvk&rv!q8L+O}18J3ki-MG@%PTGiNZ(=mwZo@9pFMVcmpW@O@ zm8QdG?zs+xDConN0XUNgB}4H2l-6&k>7hqaQBO`!j=D=tYQ7TZR5|pFrQ!9Y3Mv3Z zF9>D)avzXS-4^QE7ehNbhOfU@!vh&d&ir)}MRxEBBm zOfM5QP$DoParT$c%k)jjH@I>d3bO)?`ycHR0JCT-hw=MxdHVf+?c_1Pszd!Y%4mbGN+^T)5@xJ#^lOgAgs=L>X zV6TR>_hrfQBc5a1romcZ zlJe31w)^vm*7BVn2lu;H2IQ=Y3A=F{DR1=LKf*VBfHlyYCEMJ5r$g{qSmEWs)t0!W z;_{|fdxABm?c`dxr|6&2-J4b7)}d}ZS3oX6HBn+D{0*oEHDJgLfH9033y*Kniy*>K z@W7ppIOlXQ?%Yh{6pE#nx*SZkSX7vKV~t3sV8bNZjb|;)7Tp!uT{gP z;nL?VjgKAj?tQO!JKlG_f)(aK$Y)r>&|<3*fv|?jm-Ox&?{D6CW2>|Dt*S7I@0Kx# zW;$2kej5`?_WeA`$18T4O!(u}pIJQ?`>*;dTqB*f*L1}Fc}B}n4`uy1N_5K;k}}T7 zpUtPc{8=9?{m^yQUEbvi7vkW_Xl=Mnw*+Hes+J4JFpI^e3R}S+SqJEvv_P@j@rH_$ z)bEthuRCodSM(BPoIATvq=hy^eLM^}!N4sbLkTZ^K_-2~e54Vw8*V&tlfhQ~GF=Bl&HIsho`9;QWU#;|J zNM=Ud!n-vKEC1$*8?4A%6*R3?nwdxSB+j0WL$8uw;~XppNeq?UGWj42b*jYJ+`;`< z;;CnW@uTC;c?qgyBJW*K*jnkwGwstzrIl1&%6~jf)W#}t{E*bb8YgwZW&IhZk`eVL z5L0q7lb<`MuL$7OE|5$Q+Ej3$H-;P>?yhvnX?(WuFnDXPC;CvZUO8xmo~3dGS7~!z zyV6qeZIn;#LrcK+yU}6s zL0U?9;}x?-qZ05$H}5YGoSyaKey7xLYi+L?Y#k88!KywCgGF%2QsH6i{-T z*!U_Q0816}1gAF~6>6eSCF2E%IRq9z0lPhItW-#%tEEaki0Bn2_LpArDf!fLi0cKGa@n&@aZYG!W=499G?qbYi&siSU9mD?Dz#Vx`HOS_4 z%C;#p`LiKBW5dy}cLAT4%{crHVWICle~PoFjwV|`jc&CoX*x$;Iqmn}_M|-Uq}Xlg zDZjbdcg5fjN`|3%3VG$Eqmk2f^=9L_k{KH=g6*6^MIt^+0*CD(N_|1W7?g6BW7zn; zBs(`B@BLVGmy*<#kfE5Wtzp971sXD&awq(PR-iA+SowQvyTvCHIpxddO%EoC1baJB z@LN+?XvJKz5f-adBdohic)FAHch`>>9sc=vShe2--pk`)@cH!>F5P}BrG%T>_n}m~ z6?GDKzDHbxju9i(r2Wk~ec{}gnZxjpRt(stb@OQJL?Mj9VcWEVDaAG1H(zF#nMaG= zez@QndcTx(qn|5$AN6LOv6(!zZI58%=d@<{!S+ITs-V@)1+6$47Ry?8O&sSq%{@or z43Si4sXFrQrBrj}LLsug9Y|c%*K%TEea9KFdnCSz;GVpyH2N&ansT<)Gmdlew&wZY z54;GtC%Ls^<1lKl@unK@6B*v z>wG)yB*9;FHsTYq05SdLFjni)^hz3YI19@dJetdAt1e74VjiNe=qt$rLm#F!FrLy3 zVDe{1M~M6EjLkf4Q()hSi?T7aYNa=I_EG!Fne~9o#UXovn2J`v2_bV&g6Aq{DA#hGQFQ3cqgGs0lqk#UzE0=&^SHJ51l(HR zOV(~whS0b_p`L5?d=&95l}U=M3^ok=jJ2HdUb2Ci4)J>HV}H{rA2Z2-$R}?6wdFz? zBym_yw)cI`j!*jJZ8u5iT-w{5TsTohCj~S;EEPXgdxwbXz%f5SNT#hN%dBeQCsmb+w_$8FC zvZ;Bh1P10Y|BUx}{;#bf@&e7}Ij^%0LQ~{~q|liK73HSMeC;hCM-{oR_IQ1aXIU=8 zZ3vEU4M53%56J253%FKlBlt_ZbtfXTpr7(b8K;lu<-LYtU5WLGoXk1iB}+w&N9bRDTo z5ZMMk-g|`}Hfgq|=%5PnH?u0L0((&_@bJkY+eOw)M>?Q)YOd=JX#e9Ha5K@uWPI*Q z{YPy$Dg?tPdFb9M+=)2xvr>yTpYQ+5B#Xv!DZYef+X)j1R+qUV!t2?0<=n;AuSV#fLT>!vFCk zB5-cC-6dMJf4Y1td3HZeU$o6%4L?4}372gtU&PhbwYrFlFoqtzfuVcOO|eYwDTNS* zLIhE=_L=#%AFk1MyQ$JlEu$6Di%2$i_AM$JLW>k2kCXtx#a_NQG0MlG4orlTRq?m} zwegzng6q$FbYjP5_)&SWFXA{%^PmV7RTH zg@peb61hbfLWRC0@qfb~WR0u6$oqxja_B!U3Vwk+lV3qk!oOo4WWLi1vRVF{Z$FsN zeqrm_|K^JZ=BxWM7U8DiG-#A=Gw-p?BWSe#{JiN1SPR7I+Du)~t`zf_)(V(a`xKi^ zHTmm3DAq4!1J2$|7D|wW&{)-mO|WjEAMb;aX?{tsMuz8HaQEAVPq&x#OawU<25q*scI(^@%wuvnwHPk zyMYMp(Eqzc^jTrF45NO2Oi(yS$@5YM)asEcxysRCE?9Y!m1?sPxBu9kd>{RyX*$RJ=;V=w~n zgQXz_7Kqx>-kSCP#!SeA=@>b2i58P!D_pK|lT05yPP6;zpyGW3j`eG~x%u9&@5Q}# z-|OF+Hu&gBc&)ya5SK6y_{&kDfahbPE{xA#{#x|Jt+cJNOcp>op3&)~P{>9sov3Cq zPVgS3fPHV$#V3di!Q2b5`^F@yC&sFNrt$ZrZrK@PfT-$|;l{)!0KikG0!YIe$dk#} z9#QYWqR}Tc;3~(sh?_3yt%=BWCx^Sb3;f1!R34oHe) zDf#A0?W=x!s}}(cCIQEz0*DjqfYsu%d9gmPxe@Iq2)x^AoU4-HJJ_P7m+(*l%)~)* zW*bVxAc6ZqhW4is2VT5fEp8rxK}XMsWbpC9wmJaz38K3n<6E6%DI~2rWA*r4Y6laV zWrIiN&I7;U#3&nJ+M6!UYAE%x4H)7ie5QLl7+B{PZFj*~;9BFqO*FBEd%9JEm@k0a z@MW0v|9#7P1=MUVL>IL=pRfjiNgdc4MQ@D@H@NUwAQA-&kWEL*M7!jsU73HUp2WpM zG9!15vHFE>5E=`=Np*>7quSDFdf?f3slCerE1TA7R`(K!%^j|d@xA7m zh7WK}K;6nN!2I#!2iQpXI(R+D_*lOPI6HoOt@ub16`3MeYsD&(ta=sBoWUHG3>2()v#Un<9W=R&y`o6|)3Y>ZMdL&KSpw0!@o(_7d~_ zeUN;M75yWKnVy1wpm+(hcDphr2sh4j$Su zWUlpCx`E{Jo2ABjh(-r{;%4!dV4#fmFVnXwMBAreE783YDi(OSR2X81S#oGzX&GkB z8~5;Zs~tm;XIX(}kt>^?=Y5-qJVeQ#;H`N=%BuA8MCCYVR5?Vb8`4@ND);1U^CtTt{3+)2o)1YD_hsmm*F_>#8%qpf)a9ROVz>Exf(6F#I-its%2y zghTU9B^`#XE>h#|t2-t-$z%|Jr4koo!86J@cL`naWvG|idB}pUG##g|f!fyEa zGl?GtkP>7({q92Mk+ASrhE7g2%WM|QiIC_@;)Ef{x&y9}n{nQ``LDlee(ZW;P! zT~Iv7{Y>RKlDk?sAu4NKmXgDG!8m3G8j8lB|Gfvn-pfI7j7|_^K0(TCtL=~d%!>_z zmR0eNd}PQ-;PFD`s;G}hvOkU&mfBu~t??dC#}l@EOwHONen9QuqMw4I z*94_t1N-i72y6cmBY=KS>;)gGr-=Y2+*5xpWV2OCkvA#a{F9}RXL13mzqmF5Ioeejwbzv!a zORP*Y^HI2jBvl-V+}9$ZijdD{y#+AoV6(&7k||=Pp4=hP;y^AC1$ux<9*evk_B~Q=FlRMv_e#D7 zQ<}K@e00JI1o^MHhd^>DnF2kIgzi5YI(W_yD?@=snk9XfnClA)UgMiWcYC;Qz4J;2 zXIPOH4iSAk1S+*^$8UMS$O?h4sLO#U$N*73S6I!w54+S1Ola{jkoG(;mF0c!jaOf{A1MQy$DITaNxFbn z{4nSCNLDgNzV0fLU`3!9sPV=06ApYIiidE)zCRO`5#ji$mdruB$!j0iMG9b8)xi*u z+kh_7nkjw%4v;}x0AJMsyz+r2kPIx7dahDTo>`-xy(ZIznXc_6^LxU*i!o1`v7U9dTl1FppX3(w9qN#^$q>dp1vFv?i9Dq_F;vd+ zYE|FYk0Y#hE$<#;6Ou*0fRs?I)B%3NsLh?)nyCO2u!*rlV2_6F{DBz{}?6T?*{=(?Y6CrE0i-r~1*|~45yD4)g zCy@O|h;h*>_gST`dh~pyPnpZid!_st#?Hlkq>v`HnGB*EHxJrhjt6m}F7T|09@5Zt zycWgsze&h^U18c2{Dfg3)@ZN$oj@#2Cu7@gg<_)U)@Ytjf=qhA*~JdjdA^&Il}DVGscHJNl<<5KRg`pJtkbrrQ`?!w|gZurWiIb%~-%S-a&jnC+e7}4@N{5~8a&XXnA{6N%0lmgbGa;brtR?`OY z7R~Ltc`MBcB~Efe4&fk8kBNhr8H_0*850G26+& zRQq)k6C#EZVn;N-De8adG1r?V?q2XrVZ^f|l7Y|5gZ4OV{`2!AzCwDnI<^1l-h}OoKVSC~A=lXSff{!~TLXcYh`#bNG`ELc+ z>GYU)gHD9d07WLHb0N%`k*OJgd% zHDn;x(M;jXcmUbWK9o2`YNF22x?BM=*;iX@xBuWaEIJpN;5%iZ9O4Wu7JxVH&(~(m>oEj< zPtbGedK-G>TSS$-3@W82u zHc?Ir!!SEyXrBNANiPHv?*O{0a8iyS#W>`D*euRN$S;0_T6006M?Qe`$e=@|9|Eb1 z2C_`At@7}D3>5R04>cj?pUV6ZTvo00s)?hzT+}g0Mvgi-J$+W0nZa6$y|(jg*_GKu%Ccw94X#Z9(Bi0B#JU;TKsF%Db0np~c00 zSoV|TZFuy0ZtwQkK7uTQ`W8dHzZbE@yku8dfe^2s7T(Gy|w;FUialCeF^!i^` zC9Ou^^T=Bq0#hKyf+nctcee+|Aqe$e1J1tN(leQcn#L|1m8^0y;wE#Ug<9Z?ankN1 zYV^nc?b=n$P+_t`uHr;z)M7_}EM1NyuVO&9CXHdXS#x;WtGrX!V0&9WgPdCMJS&;_ zJe>GaMTiMb)Q0axJmcDqGQu!kwW37h)`Y24g>hCF!H;>(jUIUd$!gVJW(`uJ3p3mq zlP+2BF&}!Q^xt_5gHgN0dsPytM-cQ*0CRUcsEg-6JbDR^_3iM+{^TE6C%2&zAjZ6T z_pgdBhoO()Q8o2`BKXb72Nx5n3F>Si^?%0|=ir`t#vxuXjmSri8t`WuS~4ZS)}kG!3I1kAZPs)4rW+fW;+P$TxR5b zglx*#rnTX@BSd(Lt(`Ey1elCa_`LFDSUq-YNE-13)%zi|qta}TE zVCc60`jQ0-ia3L6h6|Ywwp7102R1WkKJ z9gKzhEg^?!*pqjAS!8%R|_l@Cr7_i9vp0`Ld!rNuuZQab$e>A442M< z);b6U+R&$ggTuo;n}^MA$KMuW;>x!G*Z()cv8k;6;0>8Gj<|m-5UL$=eIk-c7~7&P z=Ke_xrO$|z3i{=__BycSbUhEMbJY-S_&s^QYd7$4$IchzR_m4^bcns@m&V=}^MDuG z}*0iT@*tzpJo`VH01tbStO5$b2YdQBmg02w+O$lRvDt@yG zr>O=^Z}E_3sgCze= zM_!>MU?U-fVX@V=Nn<0qijlg`r}N^PHv9hySI5=7ai!V=AaQM)?z$|ba2seQa-PLi zZ2(rae}?9}6y^a~&Qf8t9=ro}o-0quPQU@eWe^BPprMAq?DLy{SBUra{B^yCdGbi! zmpC6}NN#A5^I>>=kBH*gW=F>%u?5?%afU3EC&9J~9|dh>?Z0wekqv|z^U7fplt?^g z4Teyy723!2VilY#(8?;K{P{UuTo#vXLL0|Zy202eh61XP1BI4)IIbm;hGt^~io zu$J6Nx(n}@aEpLfq=7Dp|5NnRBqh}yHBC=|UCntT8MMM#Tc z?gbM;k;NEV@u@+HVUB+HY<9C$r5tJ0p*FU}IWC;2jf$B5QWH_%wYMX8pcJrY>Z5P@ zA?4hfMR?k^X_Hmsh7prHilg>;N&Y%>n!1*8n1l`foGAE95o0a^qtvLp{s4s}+4S3= z%|jLcQ0~4~#!l|kgYB5ri8@`gz?0oP8_IC{hPwTkjDGjMhRpY98ActfEu{WZY|#*1 zEAY`v$Pw$qnq}GRC#?5PuB5O==l4s#pfSQDi@c8Evrk+=u}b-7bk+z9mccz(1}@}x zPh(jHpjV(~p|ef8yDyO1BJ`w#&N;p_upBRtO17PGgbWie^f{VyIlk!a`E@Z2{^nz$ zk^5q0dTqKa&h9()Y&}B}%Lix@S^-ajL^0?G{&TwFvZ6OKmxF2JHcyz*la@e;iV%fN75i$znEaVs$zJcDnZb%vPyiRU616bBVK)*X0A z3Pg*HKr#<=5sGU|mHp%P6Nvs<6n;`ENH!p2mP^n=BO#8+fJC?&X@sN`9`gRUcQMx3 zCHFl5VB~gZ<-?7{Qqjz6x`%d&?pZv)8AIGtsj4ub0SW1d6gT4I(S6*w6I}7O9}uCt z%Wl1618d0B5)$Q|r;e1gib#%W!kf;|JvMxZK3TH?T>&(Dr4nnhv9$xWd>9EPk5$e)E*p)0&2r@57@=53QDeeO?!B0Z@7fV|NVx(r( zyc*SATnqHC{O2&FWVX<&EbKR#{*jG`j0qHI%od833u~Uewbh3Be^O~M7YWj#<2coH z3;3f6HGXhz@qowobR$CcBNza_$13_o$TQjf;EDT_IU(#L^o>vTRY0mghLGl`tzi@A z4^eR*s4$tqb|c2W`PT~fjs1|?#^(7F=AHE1-$N47f1iLE_As~*vq_Dx{-yE_MJVc{ z2xk8)4Tyv3MDKlsBzv4!(ZO=A@yb}R{-4=b!OerBoR_E#L-4_WmYoK^6qYwANUon= zmcJy z4nh|?cPcyrTZcA77<3k?R$6{QW#BTzn}fnQRBHV%r4}prRG9()&kllYBA7;s%$u85 zzrPc0wURJDS^KPSZv7)2Y+U$eG|#2)dm(N$1RRGGGnFk9tYcFz_Sd>vc@i8oZS5Gu zA(kj06!YQU2#cLj%HDkOe_LodENHGUhUqQ&#H80+R4Cs2?=0#BA0ZiZYr?(n6Zl~6 zoE{$tc`RzPn<1V6j_c33THC>CSCtQG|Bs;zaL|x1*uZqRzv5HzB|*m3x=t$RLd9d4 zjoJa=3kdrB(nxvMrSU02=PM%P=Ul@}C%dGebqVQs6S8PQ3oZq6Lr=t~`wM-_s2>lI z!Jd}DAh7Z`?j(wN{j&22L@K;_Vsdd`59LSMs34L&- zBNiczbTOS${1)A{sH(I%2Dvo;?D+Rtn>fU;8IND(r{eDPwJKRP?;V z(5txw-Q(}=!>j?C!!bGiCN)mBG{}--dyHnf?vlI?M8@ZCtDA&WRpN;IZB5<-8WQYf z^7gdS#aP6MbGNcJwg_oGt-H4f=*~$XP zVOPhLpu70IlT&fC(2Np45IqN%k-oq2CSRO;zNkQ7jt+fy8vSqcPc}>bt7+x0p+OtX zaD8)-xI^gsF#PU%&y|V9_xW)Hvey{jI}uS=${sG}s@(+cW2JhT-tq`)fw#CMbIzj` zR{>b&Uuy=a*|i23yP10&1g#9onmR5klksybzxC$9?D(T@d8U`&pe!9BoCVjwfcKRG zTWA=6>3HrDR!q|}y2;yH;W?Dwrz0m{5Gqvtsq)EC;Cf;Oa#%lVi#c=y0|Cj*J*ni) z(6<%MBy09-s=1tU{&tzP|KZMHgRlD>FE!B6(^8R_=KGYP9rL-UvwqY}JpZ8OCX?yj z=$H_GItZX~k z(I=wt>X~c)Hfphw{{IQF#>x9F>4wc1hJg^?$4M)?S9F|k zhI6oW7a7JXN+qiS#;-xC}ooJ8~Jcp8R_oHWF(nE4W0_qW&d{U>9I&BcAYW z|6yHWGPwYgD%YVKO8v<&Xn3JdAYZ3@r2X}2LmiL?$6bUiKmKJB=5%|2(%Gh7LSwoEv6^&%exs3-r3b*piU*zhlV0kaOvRKKzx{ z;^oAkHfU2#@%`^O38@t((0DRYt8&@UJQ`w<`)jna?ehfKfM4zd0*mw==Oy)qX?cOT z$n}nS(orQ^)Bh6@UD?$723WV27{JhkILNo9@DNY(V=8{W^@inN4e7IR#I4 z9?-#v_x+;L>%3?NN&OAJT`+=lL8uuLAMFFl1)}B1$6Vm;5WBrq79EVYDhQZbw6dAk zF*b1>Cu#-F(lb~A1~Nm!7?uZsbYc?Y3j7Wdi628m2h zzs&R^xOd}0?mFns?1bS8LC6FQ$|s3IvKS=3g)!FzpEdh#7nGd1Y5wO0px`q#ber$F z2uWU_bq7e?BLx;uy-&!Pk)57=u=e1^s$U(S^9f+kA{=etkg$eo(krgDRdG z5$zv6AvhH~wC!@BFbYCNsfjlYw#$`^qmA{ z?q6Wcvax#qp$zk0f&v$mlw=MJ#G8|^t)nJAj}RjC7;N)Orq3?hwX1$%RQgbR6@!ww zg|rciHke~HF6fKmWB{*x6ztmv&;fIFq0NVE<0=|=XJvgRt2R>*HEdXmivS8uUWwaA zGvKm$IM6HyExZ?wmy<^U6_C%!o31Uv$Qhi6JYN`NUyLdSShf?PVme|NSn*v+MYXHp zXdvvT8!V=vFTyN%Y~g6Pem~0Ta0fa}KV!BPA>88Zh)N*X1W5y~SR2rMGiZqdCQrGt z#_)MRJ;a1{h$oYE0#8w7Y;u)aB&5h%Hw=PZixDG7zN#K%={!}PJI6-CjRe%e!4jKM zT40H-Q7KateBM z^P;SMk$5=`v2T)-mXSHQoiu1v7|#EHMtLFE1gci>;tr7idgY`aim&PBsjvV;{{&g6 z(C%iD?3KfC#*S2>G%^or4H#LKqT@@9s?SnL-vLexzSs$-GuRpgE zSac4MAd+C&cR@{o`e6>1b?D#qDKW#ZE*2fD0Q1;?1@_wNpGRgR!NU;b-Vt~E86Sd$ z--Q@@5f>Q}0MDJj#Kz>mlhEpqL3~xP|B{xHsLp4C3`gjJt607 zko^V&G6#x7J?*_I*e5AS9|7{d39wJNNQN_*dzKkizR<{!(96fMc|$CLFY&d+NcV1U zdXe|RpJY_c89%sp1y=`a`n@xFI>;W}!Mhq#0hm}G2^4RMSu$h;n-G8nKZOmtWNvf@ z9&al9&ZpV10lL^4wTc5@h`~?j0}1JEfi~f!c(7jFf;__suhOWJg2HgCQ1(Q%?pXq{ z1Qi5igC)VRpx^1aEF>3kZJ`DJyM4?SY}OYjXP^RKLlZgDD!puI zk+)JFE$5^d99$3QnqmrsGAIuW{W%R5V`@tn^~ zJg#kK%236I&^3BNE=TmOH*k(gsVtZNDRW5Mk!f?lEj&J@S$OY3GQ3_y6^ObyxVgTK zRo*06?9)JerLAM#f)AJ8S;&?2-sF{;4ob|+`%Dc#5LWQu&r#V!!;BDe~7>jS%CV8^sHR$ylQpr)kEK3G-f#I3pAit z7Z$MeYywYu<6UqPX=JIyy4>KQRpIugKEKBcfecHc%m+Q451fvQg$pcOTtQZ{zjL-+ zTz*LlUkc&4Q(%!Db`3}3j00ytcjWc07PvS-<(%MYy9L7YBPnq5dkJQEL5<25EZ5UJ za9`+Q5Fe0rbq%hLP(*Bfv&s4dJ0^L|Gu#{Xh1J}D zH<@%9uY-p!gINtIB1`>6!39Fs z_C*@}8qlvfscBZij7VI1oGdG8l{QoPJ9tfDH=Xa+h5eL&m2=@J%#1AhC?~MUFUQ~CgolF`neL8y3jZ^(1R~Q&H zJ>uHw0V6ySwwnu3<-EK|$@8@Rg=~q<{_%F-kd#P)WICgE;8&Uv2GCZ5w(;6a`mOF! z7Oz&yGh86niFj#ok8uWk3`r1RU(FgyMOdX`c4A1Dyzj(y0dJK3kjP*wgM`a;OLiGG zBy;{~y-64ASsbVrCYQ-IlngWC9w2x~f+KZ2T=WHK$6b;nkA*@ik?}kT!fCkR!f(ZZ z*+90~j-n&`@pzZG#(7Gg)%R!2`Qyc&;J^}8$y>t;i>oC!Q+C;cQ#s;$!py}YBEUBB zGI6y<*#AMh?a?sKB>GO?RAHjM^0`kq0(>H9^X)b z9QKOJv@EFB3(0aAEX>)8GJ-Xj;n_ZS|L9FJaDD$5GoUI(2O0fb+ajUmX&06)6|8tB zbRI^S0sg!;YX9b&5NefcD=5O7bh;7ae8vLpTsOu10kruHli zsaisyYN4P=Q|=*E$&k46L1x}K<2(oYeZ*5!_1*R@78E$V{kWGwrewYfzX?Suh>o|< zAy@hPbGR~0O377F-D145&x^qS)ws?Mc#uV+!}q9d@8}C2qk1fvP6rJ!5PXM1Fsc}L z0ULTV>dk14{ZN;)1S1=Q=~a+tNEGRIllser(wl4PBXCIus;oUbZex3L43hiEz?1#I zDiZ#ynEr~}a5Ll+EC2;(1p1{al+M>Y> z9?jRFLAoc6K?_eM!g)E(#(0CEw0(%A9X1d8G$2HW*N)-+KdRu^yaST-X4hR5(ATSQ z-%d@Fssc(5clT?rSuupG%d-uj-f`zRk5`wbOW)V$oB=Q`7Y#*sr{Tk@ z`eC+sc%>9#S~-N*%IFN{samZre12{KXFFJH8oa)vN&`K+zy>N4(Tin2p`L=b1|@*u zQw`if?C_o?q1*3K$z`|O!V}@WTgY2{kg_b_yUuj5IWQ1$Yap&7cs~a}APYSxGbA}c z*NPXNdY}tgn>9{)FO`5=K+c8e{r>=SgRdimYo`li0|R2c2L44g7y~O0df(jEC#5|n z417P5?{3~Lywu;v^pz%)Twnk_GZ_jY&Uy`Jde6yY4s>o36+0|eTTDE$47ozhjGqS! zS>DAQs8V>d);-spiQrU_0X6G(AgirkS%H7mp~C$MRu(r9ri#oO>vxui)b&dYS!7T5 zbEUR>gw-ZM!o7%3$)k;d@A?Zk(Zdoj@y^{}8Rlir1WM~ER5dE4#&45cMC}HzAr%`^ z#Fm&hn`KNv>!d2Y?^jg=RAXz>ku#tIg z>L~|WKLxh(TbVeA)@k$R7ci%UmGcsX%6tiZ(sEYz(dFs;236(`JPVMMDh?hVY->jV zM}Q}Vv2PK}I0tW9(VITMab7?#DB%Q%6tBl{S_$!6gEG=i6zz2!p}Swd^=;Gz@x&qUQc2R&y! zg&7ik?GGNN{4dpgbx>9NyEot_50XlVgtQ0>qJVTtsDN}y3W79%g0}m%;Xd40h(E4rL?|o01jPQJ z9HBRTe7Bo#q1o+6|LJeBPyb-4NOlaVU~$0E({7obO4A)<`oc-~UKfm_Ec60}z7q|E zEF@Nc;NeA9R@r z??quvcY{KgTmzft8jEpcC14E!a$dqnYt10)mPWOCY7~;;2!__k8W5*RE!=CGGzOq7 zukc>$mC2(p5{&-V-F5bnCuL=*f&>HTn~OSwFta^A9BIOkgTC8^qYY-!WB zhIssd>D;?leSu-gXfX7|y&7Dhh(mq~=sH>65;BTHaqMu>B4J+`&~Hl(!JPUq8pKRW zyc>~Q_7xxbY9g--84Q0OzOFJ{ zQ)PD-^bnjeIu4704pR68%C{rhNFPi#-A8`Enc0nW;V%3C%MHj=?xo^gr?< z(24M>vo?-k0+Y!(qT91Ma+wY9Oc6DRvS@7pZ!6>!RLm+5Jm|3+UB~2;7={-MJ%k~5 ze@EnT?Sq_8>`P9A^GyAb01=8(x~HGi`;$4@i9vzQo|O2I6_ATUSWDc>&+BFXIynf7 zwrLv)k+)5mp!F4;NDjYXjLDC>=XKn_bY?#Qa>!n*xiQY(zDqA}3{rRsYU-H^54LRS zgt%a^T3p65jlw4w*Tqym!ZB;o2nAJ?il|5`Z6;A-M}RBE<~i(=53A;amE6ogt1+JL5%45iJoOCL8haJFyvZ2o}3h3rr2M96K!yBw0LD?W9 zC4WU7B%V>BOM|{J;9(;?weVqXEMC9@WCLAPY+M%*5+*h?yWsMwTko*mCR5Z}GBA@C zH4{jv`Tza;2#=U1thHsd0y4CD*IXV8)ou`|vy!3zB46yH3%K-e-B3vGrEP_X`O|Ba zQ>cYRe@TR4zE}+JN_W&{{rxUU8}dyE&A16GP%O9Z`EnHywS9vx7qH}j3m4+Ud85N~ zfotKf7{^X%SG2lL$iewPMUoHC<2@1|D8Fq_MkmF5l?iE#UcBvt-~zYFVPG>^YzQBe z{98?wWC#JWEJC1Ko;Xa_+JC()HX%yJ0(W6}E?2ki(L!fR;3o-M=PdX&f2jZaiq7;O zl=H#Yw#ofq%`U##!mJCj@Lb5qbnXVGD4u zA5RTQ-xr(*L6Hgq=oZN#o6tU>`A+rr*W_2Br&mG80!nKPDfB}d7-@q~bZ>oO~?0666%~7@3SLX=CmL6V5*#s<%58O*QkA0vcLNJWe z){42m16Uq3;Ir8PZHNcSq{2XfQ32*T)QebgZx3Xh0Sk|8=mg-_NZs6 z2W5$cytEGhMsaqDu7*==K;YhU>T=0>rg&s`d5XAOaksS>3 zfRBTNmF^`7A%`U<`ySo8j9BGI#*_po`g!wxLLrNwyAwU~gf`|IP&o zpkIrm0`cBJ2Ff__d2wfet;>gbt^yX>S&!v0|Cr8EK9(L|K~dXlHi-xO8#S6KD7)_1 zPl)Au2c6sGingyeL$wQ9BR>0P*Ka!N;ClM+3&?IP?q5<=Q z`BgK%4JpaE=zN>oza^BHy$a=_bg#?wzg|I-P%XK)`*HM%mi;q@7-O zN0Y4&VpUH`hw`Y;JZN-AqkIbGOZ{1h-Pn9lBi{A3yvAd*q)*>)JaRHbeCS@H1X}ZS z60j~WIuzCXY@)lJEo!g~Sg00bc$VW!;J8+N4>o*bA;j(vm8ywiMtAp?d>^Bv8(_P6 zpy7)K<)IREXj9;biiQq>h$`p!IYR?LJ6Mr-4xY*_(MM$L6(f}D>?0(>ej-@BJpPRV zWP2!Uw{hpWgu!yPwDkJ2`LlxE_q0!mDYwVDYl+;=MhMPu0L*2B>uebq0gnZ!GIhJx zfJP-7rP&-Lv9cZ)xI`eT^)<7^q>-%iZuZkL}jWucKdh0|hlxWp>dhQah} z->8*-?XW(aVu2)un1s|t=n-x{ra*R}-$UITj7Rzf*DT5Z6pecz5f;D6nfUj$P86VY z9=6gC{(LUeO>`WYmhivF@qpI@)|7g(e|X1Jz{Zi%Dp~w}J-|}CGyCcjd+Bd+#4ZJz z{ym@IE7pSU*FLAt7M(_+5Vk1e(>iy|`@wurKi@d_5)SVdNI3S&8WdW@kj{xO^S}yW z@#r41fFlZ6^Cn&SbHqBB5C6aT|4f$&5#9>?COaVS4lJ;GkstS+>7?hgf5$dK0>i2X z;#|X?2F3ZU6Ao2->!W4O{d@Lf7+CoR1QVzLaIAm}_HKL(-tEVMOiGH-L3~Sb9f<)= z07!doiN?7NgVpn2bq#bq@!%v1Yx@@a-(pgSsyqe%HbgH&}2pkwa}SrgwwGaV}p=VKaJcnV2?oP#?-c#Ie{uWE&vm9}2bB~=IqZABq5m<^D1yW#9_#1XuT@z62uT%bME zN2|be3dhX{i;DI9|5ZDPJi;Ow=O%F=krPXnKH5*?YJH5 z7XeFx?U37r;S(6nUjvr-dVuoA36|SFtTz@_Q--PmZ^mOh^R>7Ree}l|7D6~R>3kwMwI`tZQ-~s zkgS?OAkm!L0Q375WNjDKx;4pTIU@dF7~7F_7yb#3PrJJDO4{#;}kdGab4IY8~l)&Z$ zL}GmuoNIG+i~<21=dXG3He{J^?MqI9xa@U3mCJ{^ ztq=#U>ApkiJzU};R9B8U>V;VRO z@I!t9BacZ51PRU$%k_vo@b}X=D!h<^0)mL_+eEe6zcIVz-!rfRlem8Zl?TrXL_LP8 zG+pLPkOAqktSVI|*ypu9fA{5^zx#5@`65-aEjy4sj^zXsxPI@Id($05)rSEV6+zc8 z)cFpgNMr$YFdu&FA}q2VVHI#sm}$Rt_0}_esUc+42bzh6tR&yFBZV)|BqXl z@&~@2w{Vus9ya})u^82xzbH+R-bmFb7cLc}Z+ZUW{kvTJ>T&UjRJSdUab+{}a6%na z(`C-W9h5HCxDa2K|IKN7)w9XHYGd7K$@}2bf$!+(>ejOFW9LrK&W$G<-kt89&Ykq> zB#sih%Yj@g@B{oaJ;HZzw8R6Nmyhj{dDtiQ{Z|bvEOPE18>8z6W*a5%HTh>UdQl)x zE?o6K<$wt4AA-HB%-{Gm^eTV5$yt|uar{sAsJAfM@AFn6*cn)FWCHBG z@GVel-iE-{>{{A@j9*_KRsq-leewjkyL3^m=UOb^~EIZcg zM&+?ennm{z%Ck?$dnaAcuf~KObHVJB%r~RpTookNv0haH5H(a664D+Ii1aIFj2{?q*Il8i^H|V`2T@<^=FiF1g+<4r(rk^Fg089hWw+VD z>FR3K`qRtDj)ZK?hf~6wb=cII>C7Vs~?tr(I|v4 zQ*2(^PSX-?JJf5E5#wmA)#cuLbZF^gO2g#N9?|>BEpUj^@e-)^;Af`lDjoj5eiUgL zq?U~(pHY7S{Th>`9AmhL#p%Nd2}j8;cQ+vln`rR}P>Eb?x=dky5RfwIWL1^8tjBfl>ctfW^KkXw4r%E}7jDzU3Z zAazp=ItI_z4xvIwY5|+u2$C!EcbH*Nl=v%^{-QnC*3-`v0PD$uGUe2FO|S(jS<9I; zjPRY=w1o+%2pbWSxf{YPEHY0^0EEfyvI3h`pO$U%(e<4VEK!zv>0gB2Qv(ar8h@Gv znzh(ZhMqiMovTKxYy`bUTiTZLq6RJ07;tdKW;oW5Dea;Nbg(Arg!4V0?fKveK^afI ze)uY~3cx-i#-JzM@ zHFq6D6^~Nx9vk_b1{v&t@;EGe*+6g>LkrOz<9^WyrSi5G!g+3=1$BDu}9o zmhw96*N^>AAequ!K^UdJebq&MpJCgRj^bNWlx14p%XRo_6%Ho;xLBjFE8{D-Q>V=n z12$h~U0+lEfjr<`vyefd0I?G#ADcl=!vg@2Hvc|=LG=Qgz@^*(T9K1?No_?CTgPR4 zW9b~2Itq{wbNf{LD4WIiA&jB-y5^l8(*f_-#wnBD8LM^SWz0~PIsh%oA z8LhlegHm~}?xeH!Kk0?gg{f4}#Tb|e^WG4%k3l@_4QLBvcnI6;)8m$5rfI$S$slvp z4AFTI&Y@x4TjI30{;BQh!R{@wpmW&MeUKwzZNDlQMF{+G?Uq}{QC&1u?tWMCRdYUj zSymMfNT=@ajC4)=O?{WUeN;!aZ@4_n(S5FQ+6r1JWwzS>Fahib6sa4*61!3m%i9W< z-l&csAFyd*J((n$@x9H-sKJ1yFYG09M74xJ?xMbMXY{~uIWhngaLLkK?;TbL3kk-D z&o(=-fphk@&`%XZZnkZv>W1H65~2wK9jx`rJwbI&{7S^ZMIoE|R}_?GAu$GmW} zy$5t}$q`Kt)wdDLMUdc#=b&`e^^?wX(14Ox`q|YDoqIpIQPj*pd6mQXYz6S-NWgJ) z`*F>#oX6U1db27k@5l5&$xD|o%jwcL_Q61-OkbByq%Ky7Q)V};H%G68-6yHqo$$4c z!k$j*8J2C9WlzQmM8hh=YK%LrSsDW}uU2UPT!@HlkFx7*k{DmGfccFFf#pbjIQ7K2 zGY0&gS742pf*9p!SZ@f$-`j;|Uwd1RKTebB{({K4FrDCV zNN$p*i%BU0dwOBsjIYWsk1b)iC$S{(ULm>kkPhs5Ww7S=k>U|y4wc@ewIDS z7)tmRK$*VbNyBCSx>;2tb~mXd9a4E0o`T?$MCOh&M5k0x*uo`mYHM%rcLQB?&nlR= zzHjlA4`s~2GvEFQHPq`K0QjfOL1i1T1~sKq{kj*OcX;*kT z`IXUD7+VTF(#as3X{NZ4!wV_|&CdE@(kPm0&>WsXU*|+V9E6>Rr^5?okiiMKJc{*i z<~~OW^g@EfwT$8Wddl6lHmKh*(Y1tdO@J_mq%b`vx>eIQhs&B zc_&)cy#2$6?p>xEXE@b8Jl-1GLsm_2^6_%*A0*dR^z|$*EdcLtj$tURK^(ybO#M# zk`#*J{REqs*w8l3GT`)GVtra2pTu2%F=@*9U`PK7(mIssHzNNFwWtId*l! z?#;sMul?r{+wg++i+7amiqKIVvoS}~HsY6DWSiD^U|+AfzQ|uu&C5#!hD(J^y8d#c z6J_r|?-XjhucN8PfZJZYu5aXi{StWoJ}O~d!QMBy7eOwXbBqZ@&1CI~GnWek2uV5$ z{p#-64? zJF8o6YCYF_b(?hkQ}t(6qWCFRByzTK`S`~9me>Ihhf~0`3@D!%_-Yo)j+xd7F|x(1 zHjoKLyv0q?CeXr@#8r-<33g9gifBs&76t(91$78C4|TJKz+la6MRCsJFa<_(K)FH z<6J=2UIbG}y-8r^9SK8_0$4lz7G3+{*`p;cjR<8>$naf-f z`vfTR`A>8(oAZ#2i{`&tBHTSX^j=`g_rz>>6{ID31h}uL29OLxCi?T$?)1f(>7<2j z_rAh~7Q`jj8%d;Y2r?@6Oqy?ksF#IQY%N-Jb1aa&J2F%_Bke$5`SJzFWUTpW_s+ z)1Atzw*>nBq&r;_2VOViuy3&loziWY69^EMt{hnxka*ok_z(3rS)7F1fe%SCRfH~h z;2yyhLeaYHt)$T%D<3Q+kT&%N|=nd$J4bhu>3H1 zS1s4Ap<3r>gUROxvf3f$9L=$gaN+yk>693JXn4Q9#T}pzq4#Gij;MHQ9d)i^49B*H z#*vwH{Hi1*(sVeK8*q1?b_mV54doi(1w4^zn^KQYH zG+(;xgYdW5zj1|v+vxolS8m&S0-mJWN+Nvvmj&yQ`#+`jpi-VKs9aHMr_-)@dh1&0 zxJT1sp{O!3Hm9qXD%umrdEm1+ttowJ_oJZzb1Areo*EXn4O0wW9_o7CJX>pO1gX3A zTdh1`885bT3H!B_GUpon&kw$nCw`8YdNc`t@X$3j!VxksEw$qj+)Sp8hJi-7u7^tc z+RV3KRZS$RNE2Vfq{H}rfpFqx!?Qr0HiACU98u$SKj*aLn`ca(KZuneWbFuHa4X_x zm>%n~4%Q_}RvK$;WEgNr2>gEZovawxSouETdF=D1*R8I@W(~chnD%nZsaf25M-GlE zx2b<{IBI~rn)SFH`Q9}DQN`;IX>a^4F6&=c5fIG~eH z(Misw@eu_qZgd2fVG%J99jO`waxO1aFn;TthVY2>vR>nT&dsq}jgxln5rPa|&X=)9 zKKzREG}Z`C`M!L;$%3DTelpM;myydR{zx0C=;C;ne@&uahthI$%vf~r+^nQD#mCDw zK9x0_g=j~+fNys=@xQS8j6>LN?VFj@xrq19p+ehJ&Fg}}b9=meqmi+{j*m5U z>4nkOE#XkM===0oPAdeQ6(=uuv`pe0=Xf|sLVI3TTW;(enVMRZ-{|^`t4E&vg)OJ> z<6H^*g?+~af_2t0XYje1eRlnslI`q#27R1lmfVK2PV_K#QAHij_7qZBTK{mXG*wpW zkImt{nJ;b|dhGs$lz{c)NpJD77G?kyq9xTRYxD2wWDo~iyj*Jjz~KB#Ck4Z{G{Sc- z@1OVWjaOmrw9p{_9mATZf;H{1BOgDu8GeJV=m#N5+j3>sgKvI$Dtu*1l5$V=)*FWq z=pmU;P>Vl%pU$q^_l;6WjQV}7nOXIm=Ly#jF&B!Er!c+lw$uCt2Gs7u>sF29{D0$Z ze^RDpL_MW7L+6J+uaztE%CkA(IbG)<5~p{$}ke(8BA}>YDAGe;CgO6*z4l zi}1hcJ*Q>hwfXZf+P?w2n}n)8&0XPqe;7|DNQdotc2$!v^KklRC6j=OdNYylZ`yAb zvA@CIb<|QlyDF8~Q_1326KNja@(zDRv6>tu@i#1OBrVjH{~$Dw4z-N(59DOFVh=XD zse#4jh*^Zjpn)y5HXhh1ZpinzGDewjCxh^U?H3K?)oU~R%-~f=Gb_7m6D5V4XeP&~ zVa)y4Gnz#KOzAT8@RSLp7TsU{DZ$tumW!+MsrbXDM`^QC7TiB@X0*Sq3Ak!u819 zWIQa2Bqy!5U_B5N8lzVC(N0yV}`& z2v`K{v_KuEHu9D3xaTR{5pM3t777B%TJUNFHs!8{T+ zI{pOzq)5m`Z_EKSQr}=ne?-BiqyS)WHjJi_b601hSPjBZj{-=!LZN_zVDfZ6fM+z$ zx$}~I+R*Y4NM|l>WMo%abetG2u7JRf+rOGdsS2l;&>jOFqp$&vQ?GM!vm>9{_T4Wg z^Ph{4U~!oQq?n)5GiCW4&dATJ=lP^tkkkcx=-2@I~YXqb9;bZoeAbhb(2<>*t>(m zjSQpWb9i>Zk5Ov3+zy*tY9XsAaE5(eWA2pzbw41vs&88Hi>;d&vLi5zJF zt3)Kld5uR!siHfW$%Mzes)KPR#eOk+<(W9u^W!?d(|nD>P;EA3B;~;1n#7(kF?2pk(8!JTcvZ4^ z6s%0j!q{G)JB22Rok0Vj$)Fkr7|8`V?cPew0>fdH3H4lKmw1N9?d6u=gr6GXMxU^z z&Hr

n2L|QNjuH0gY?``98dz!+rP4sz-~>n0h2UJ|yt@5G3@|T*xn29kD-R9|CCI9twHC4;H|uCd8~Rv$ z1i0gpqA{5ZL|$$I!iAh?9>Ym}j=j0pSuQTv4^>>h*3HW|X$1PVY;dwU0R*Q6?qQ6D zdxA}U_R*+2SIvxDYn4!7UZqVJ%iiTHaQnecp?sd#B-4k9_pvqzT46?A8mgI2vR>8V00Sy@-%Q0`L7Ra6 z((r}bZ1IWwl|DS#t(R%aLo=YMzMEson@yh2VC%I*7y1?M$%`p{$|4Mf<<@lJMiO$xC-czcN^$OG@a?3J(6b$buiqzR`N zdk7_ik1UJ>v>A_pU-wg@ZXTCDi@xnES-|_0k!>|O__lavyp=AG0Z>V+%sG2jyXC%R z@%l%&ts_b=x1`;KCv|V{LgiIBfde;k9AJRC8NqQ>`w;jl3jtVX5vsrP-BpNV+zh`c z3&mvnKg4F71ySRygix%BRf7K3OL#IB_t9Y5Npx}p03HqiG_->usp~%Bdy{*SJ(i`V zd|`5KqFt>J5;vc&)A;6A7sJen%RyQh+4l88JB=Y;09dSm#au*cY#HxanWfdI7uqVT z)v!czU%d}wdKlabCsrkIgUd)hA7Gv-GR zoj8S{4z4PdYf3tc4&3Ut`Xi;L!mjMtZojd6Md>lvr{j7vw~)9lQfNXsRd43;>{xPe zn0UWi{7|Pi_*@-;PnNxXeI0PR?EuAE!5%p{aWOIJEuSxa1fuzQ;4pX|uK`xtA#t+e z$tf%>95+Q-DUE|Im8u$`d{bubv(QiX^NkWeyU@NWe}%3y3@Ud2EtAND4#Cm(>G0qk z2b_6GoZA+uRV3+*xXU1_w=J;b5K?j;0?E|D^e85`olqdJ`*Rnr2Tgw;Y65~fr-k={zlyfOERWx(D8w-jvNrt5Zvf@F-*aRyT&H&wM4sOv8lGzq$i7_aN|&5s zMhmxh^_PglegVeNKCSZ$kn_3blSB-R>#&UVv`A-_l3PNn^<$l6MqKDYUGgZ`m7xQ` zOkqiN>E9w9`Pn7DWAl0^rnlUk^x15Txac;BmD0j0prYX^J83azNASWTaKV`5Srt5` zb74o4UCT3q9}BnQ&Rh{ap^7rAz9z+=u$5>3_f$}T34aRks0DIq;19X9bq`AmyVmsx-HtJ33JiH40FuiB z1<_X4y*Fp@surD_qlyljW##kOZj)w-lW9_cS-^rh0SNkI@t)w2L%m|Bu9IkL&dyXW t{`B9d77A&U7VZb{!qJ#((6j~HnNeK-%)Zb~CNyMLr_wfZ6Ib^eZ5npA9(WRnkv0@}@nx)!0 zf;6vg_@mLt5TeTB#2`4yzqU$=OGYp4&il*s(vl-A8W)XAhMxBQR#^XS*Y~7vrzzd4 z(rM_O@zCBorxj;c-pDVr1Wbgqs26`<2xQjoykxnG9fk7u&zDY|u_rRh~JfX_t#|MQt`Kc<G$S()49>g@OyT0UJI2b91^yU{%mO~_LA@D+atkfKeEk+0*|Ngl3r)sM6y?)go{-yGX8YgKBFP2-_ z2zgq|Qs%AtB|4S&di={1H6IH!_J04!E_5skC-eLKima-1 zjFnr*=Weu9K9y%478= z{WzJCo5a_gWBKico}t?o2MZ}rb96qK$ua2^3I!E#iMefviyqDqy)&pOqm7``EYOJI zG8VP|QI`9Ayh@pjtK#v9mRQ5=oAZ;rm>T6bq8^E6WS762tUR_@`AGPrjxp!Ft!n*z z)%aZP+)B`CLF1ggT6_AuSvaZx*Oxqe!Og~u)tRx}U{+c`@6#i9Ny*d3lP&qC#ax-_ zdsKa~%#jYBFs}5$cj}ZQE5bXD3*E`>H4PrSYKyrF$ph*I8mtv-&;P(q2;1&U6`W;N z$q+B9=dp~S3NdyMi4-F&WV2K4K&CERhyIG?1J ztOi@cei30-PQTR~{#2im?6nq!fZgvZj-O<&`5(WHuZ*2a#uT;mic) z$D3bhC>IYuMyyXYl`M>!_?^KUyxu2nvnMZ!m?>5}j_1C{+E8vw7iyOzNWCIuWgqVC z_+>Ire(O=x$Y$Q(nwI=f_jw_toDj@C*~x5^`K}IxGEcihZ^>{?ulFW9Cz??RaH7YiU^o z)!ny81Jf-5maD_>ZM;d8u~Y9j+%x&QWKryNZ~W*JzLWDmqt6k2D z`e%P$ZyhMSz9sttkCKV2>7;Corl8StcSW=R^e8vcNUfgJpqlpkTSfIJw2^lAJ97Gh zRHE>PMRe#s2fwQomqZ)Vrr9@S$_X?1JG}=AX+oMWG1spbqrZXuR^WBKzn-XVN~N>>#O9-C*BSn z&bFJ|KU{o6c}yehHZ7aTnMT3$srA9pcApqt7yd9W$L%x|mq*FJOLGFEF)bH6qVLD! zb{!7n%IjV4YxFu6E~SfB=1y>K^gIl6DluxXnfv(U2d{Df2A=TKhTQ~H-Q;9EDxtwU z`;!gNF+TEIc3wLsvXRB?YJMWyw9$(D;I6omlaS9@J+u4P+=?5_X-}}Q$n!moW7CH0 zGi>X}C6^T`&D+CxEcD7OUM`1x$-XH+xErf1x+(M`TxEAYTRM`0w?%ET+97)}QtV7+ zetoQ>%W1xogiE*abWeZwL?Qr#{L8OT#AKf}jp@z5%XxNj@Ap-o<*6!o9(jL_VI;wH z+t?6$OEhY&e0^-I+3yne%6$jjftEAnQ5WNHyH49Ne&!Na`Zf-57UaB$9+XkzpFKU} zif7Z5+qmm>RL-GOD*kM3f;C0psTL`5Z|kE$V~?GF>F}SWg9I+&hYa1?H%zHWvDA8A z^P_L83Q1JLeMxD#box@aoe_VA}MGLJBnvje{i<_=DefQb{x@S5^~?|Wb?~VwpLO}Uku|b zQu=9LQH7rE-+n8rB^hmT1ls2>m8ZU(QwmG#Jv)h94y-0?3tDpbaHH7pAr3v3GH@wd zg*tW_+NZ9KE@?k3ab3*-@%4}L62 zyh&ix@FEZR2D@7>Pbn>otjNS9Xqx||`3l!noBpgI($DK~wO)K1+Qw5(rD;jLzgEOH zmybQfFDG+{Y$`5zC2|?>;n02ji2qrWxo!=&ao1_J(#Lj2i{kbmrBlD#G8*x%2UQ`% z?ZP+DtdS8`4l5_eVYW=}Vb`zDc=iuUpHtJ*SUF)oe>EpwTxTS|rivNcy}OmB{Uw|- zL4mgG&Q*D*ngtJ&s2m~;ZNIId#iWv<f~O%-RCQ5eeQM~V&2@q8bUU1+j+v=u<~EE-7+j3klMt zanB4J&yH4Cm`=O-`tqd}c0z=Um8fMHgwwOmRX07PCnQ~jJP%3Go z`thjIVLF<=ewi&P&?9-92mf}$P5p<$S>{)$ahQy~A{sZ%$A#@j8=hCqcn>c!J;PqL zZ}vr9QDvIrH*3Q(mqRJ}Flas79`2!elVJLLp*Gjy?~i?hJ1^2~ZK*pDTioJU+wP-R zER99oHZpJ`B*jVnt5weNC~vc9?XC=|D`e<&d&<IV7TaE1K9|P_pjO0PE>Y?Uw)x zs^Xn=@1Fl%N~0@j+y|*V<}W6RxywJ|laph9FdOl@5t3!#fD>Qd)AJ-<`Llk^j-tav zwL?~Xq;5@nm0LAtv`O;*Qvdy*gBcl{d)$Uvp4$rDho#S=RPrE%cP_s1;S8~e>{49T zf7^>mO1$tOGs-l`EF=57Q=dql_H0Gq=eOU*&NlJ+F>&UfM$`^}A*%CS$_ySX$4H-- z^1n-@MMp?Cv@5)WFLsjgR&ts#Nz|)WZ6Tj8%XKqMIK~hzKPSTrN@9BHi0i7BI;Yr{ z#_fe7GnV%(L>JU}xWX5sTBPtDdEzrMpZd*(aeWs*)cJ$&LJpUGt>Z=u?oJz#GS=I1 z?$S@^-H>jwB1~0cj`2lKTmEF&+Uk`h6S0PH@F6QU^-Z!ukaF&!N>ZK>* zx|+f~*S_69y1p)G{Tu&*IsUr92AZb96Q{f^4YJwHRvVC#Ke?fpeM?arq${t-esrr%Wu!y^47DBD{RMa(^f&T<-W0omiB8r*#G6)mA6XIev&zhOw{Kv z+HN1Ep@Nncy7t= zJ}5leU1etIk~9pcZNagbYHYCRN>HrX-PB^Qo^`&e!@aKEenN}(!o)9u(@?Kr7pK^3 z&>D($qo+NgCC!g8=fdl0aktRLBy}(;g^8zld2;=%;-XCyo6}w)3aRa$xk+q16l}Xm zJB_I&@|L@sVCGo`|5hMJshsL0eWdU&5{VMT_BQjN7kQsKJq0!OH8X-4wuyt2!|m{9p8Ds>FA*}$A_zC*(vtVq zvg2O{;sxL9e7LvK?=LR#*uJ5q0k`lq@(`-Ohoq@rZpRHwmZ9}Sa5uf|P!r~KIz4jP zJ-E6+$}<(}sxuozY#+cEje=brjIxfqSHXYN`dEjT`5(|+8jq4)XZ!hUw~Q|W`PVFp zrZKSh!9wXDkZi(^%4V(az{~gV@sTL;WP%%`fNubfapN@D!Qe1urQY)4Oc#HIb6 zKH36o6_~CCQJ-bPV!n$5qv5f7iw@pGlmN zYN)5H^I~o#dEsaoJCRPMze{m-2xdCF)?HWd;%FJ<(O=(7|B(H=@L8`>;+-`FxY(sH zj{XWq)7R{>+`YIA4di94ELhH8Y!kX(fOWEOL>piNrB(*t(SOfV zPQ=8gcH6WY%#S|eK25vpI(SBA?5S$|M&$YMYQ4%6&-2s$GWYET6^kC>)2r9`ZQ^Xk z;oIb0fLY{UTqe(P+x)dv)pV+etj7*&V(RFUn?Lr67LFa)ET(^aPjPnU3dLk`XN}vY zS?WBn1mjBq3ujApqRvYy@rg~1ubiOpV-$3pi$ZRTh2FGP&EoZjp4E(S%9(nrF_y~5 zWpc|oukWEYou3`^J{je132x5J>38=zKXv_4q+L5Zai9Hw+7Ck+}vL3lzY^u z$-9A~sKl^NODSF0y4>p?>gZ;Z{s%LuuIJy7n96m1GX9qJfZI#!wYobSkTg4?D4Ux) zKdU;T67|%y#W(@< zMhQ%L@|hGWrrcKSO%TLHpS_R5hHc#%Wgc7fat_dcVZ1{ z9HsEq&JJert;Z|hUl(#_SqpP}F^g^T4P9!u>Z$SW`E39fl3h=}oUbvz@ig0!*tx%5 zV%e1-Cy~gZtLCw@G{aa@v;ONf0BtRIpW*lV%dfX)hmvxhk%IqV%2zBOHFZvh3u1x5P&lD2D*T3e!(7 z2C}4ZYh2gUx2_{xq7|7p)2)d*u3FAsQ{0Xqj^inVBtLCsZTKjW`WniT8re-1OA>#{m*Q_Nym>#X+ip`za_ zg*>S3Wsr!SX`z>=3f5^`?1(#2Rwl#e{Hz_1@KiRh;rYH?-LpS&g~X(|b_ei%&F{=d z*Bio=eI$(UjU!s?1^=I^DLj{!ho%G?<4CLlR<$rF&`rnQ{XRTbk#eE zNJoJ!Yf!?g^zkqxZlQei(d&3m7SJT(JUIUxNWD|G58~TZ8>Q3dL?d+Q+fBIgbwEuN z{JgrZQmA$FN2%%kREEB^yUey@<*NH1zQ!`k|0uJZt#9{4TT_-<5;#*Ubr~F?7Ic&x zt9n|pW=+obkl5fHur7Oz&0v0}GSSrYx8q02sI8gou&R34X6YkrH|}8J>}Lj3mkIUU zdEukRqRZksae^dsD#B~#R)z|3&pvcxZ>QX$=^~(ifMu|ewC;I!xMY=1+(hBGy3+;iDDwEfE*VWP0wTs7oP_LsEJ)F0xFoQY2qc)gk?bI) zx;U2GcEjRf*AK6j7D{Bs%iZzP}j`B6;Yoyd96>1D6dV_ zh(KW2GpM$2VZS?d>??Y3yxznfVUnkwacR?Nq%Ld+ws2k)-xWz$OePdI`-w?Y$-aea*(?Dk$ zgP&RFR%tOQr$K(v!)+d&)dhqr8R5jVLN9X$y$yu$w}GDrF^Wn6!9K^vFQmX;dzcfr zN2b%appkhGz2fDmeZ|TSgy#ZHoe>%P$HjUTa=JqHt|{Lkn!C;uAi3JOS0kR?c&9{@ zc#_XPeMjX&C;W9q59+@$S^XamIiJ0!uce?SPn*7Ze{0ufX?6pRZkoht@fGRKP?G-l zeV-g#1F<`Wf`cMxIP`UT?LX0nQ{C0#mQGCy%rm`ef*VOV@lz;MX@dnLW#U_(zh!jX zBI6$?g}1L~btS4pukHj`W&e>$I3c$utBP-5A{24!7A+*gZ5ZFwNKp)6=iF`7=Q zs6|*w$l+IDritm*gUWF22R?W^Jpo?V7=d{v-ch|g$c+~}8kk4*Ew5+0S4bH#x8j|@ zkFIw#%t&#pn^Ak$y2(85mOoQQ4nDOoiyH=yO6wAZmcYWFUvf#tlC7y*m^7YOH=M(S zdstPNuMihKY)n{{RTdZX&V9<8wC}Z;<~q2&d-OrDjrkE{{y2Z;DdV>cUe1!J%AHG6 zD67@D-6bjN<@?H)%K(oQ6ok2(`d|kX{TZ(+bl3LzLiAA?zsz&{+o|Nb^b^#Dt{DQq zJkDY_3IlaHYyICvH7XZ2;u+h<HcHo!>o%*%p zDAG>OPn*t}12FLufQHlM9ikTtYqaW1w{_>le}IWP!ENeJ*GaKvsYAS^Um9cVwW~SL zc~iSMHFQE61rP19Gmfi|Uzkjz>VzJ(h+AOdS4C`fl?~sPmHR4bPg}*QCESu)#qEh> z(zU)B5qO2Kqe!n;nZLBEBGA|yR9Ak7qJDR)ypw)ZXhni1j2y1-6F|$uyKP=q7^bf= zhP%JHasNffQh&ClGlPM6BenpaF!RgaP%E5SIeYz<*M3{U`s4dIEkion^QoK?+$5Pq zWzRpgEmEXYdY~maeJV#}J?@{hC%Z2}kAZ5Z=HwrYE~_t-`I~FOan}QsDNW-SQds1k z$HeJ1QmtKH6LIB*l>2DiKaQB(9$dw4GHF307qCmEh_Wuk$H9tJT%KF!|InDaTeGSA z>wR#NSi2`LhR2K>*ZoqLz~}&>wb2jsTJhY?{nXhym^GiG5!Z?CV7LlQGQ4oVFWgl7 zeBX}C#7!7AvSRwjL*X;TW0qos00Wxh#*^HVp>WD+{ih9#d{(`ekAf~OY?ZU~eS0+I z$vJXg86}ilpa+n4fuLT!5veRDRi<$=5jBtd{!iB-&Qlo;mg847PZ}cpSSF>zYpfB( z$={*W%`_rX7N2`c1ByV3~cFgDbmB`5m!wn>I?3xoz5HESR+n>rQ(N#_f8C z%TB%5WIy!;C8AE#5U#IE*^?RQy7Be3y(9{F8`givKrN&Z*qZF4FTp89X=L>3hzte` z3%r`Bt5KC6yEeOFMdKXl8I&yxM48`qQW-f^-0qv)pk2Bu2XijDL!XJ?QYIdCZDKMc z|8pu;5qCBEW){JA7yZ2rD`z8@~u72eSVh?JQ^S-FNW6v9RkE|H$mzm1iE~6;%L-$T!@!atMJo z9-QAc4}M1~Q}LL5_QL0~^mhn2$CT_|ZHy4V^R|O_`kFjN^>lh5I%;n4Bk2j}OdV5f zbB*x*yYYD~i*=<}iy=^@pS#$5S=KIO~Y#n}dteXV79fSQl z3=iQ?`$Bfi=_py|yO`J}E;HfA)tkShXiMcB)CaHy=9of64Q9^G?KWKnJ1kIA2W5%XXmk^#M-$omte z5x4)|Ck^yCUh2ZO$3dHqDBs?(KmTTDmZl9?zFRMV@w}D>LoZ8gEdH0e^bVy$wlC_L zwEcS97m?Bk;y2Ip4Y&B-1QN)+V6Gx^WQ|it<5HAyD6VDF8@)m!Y9RG%w(y}sv^4GL z9`0U!2mRF=!dYxg1@cEDjm6mM8Gf#)=~#C~wX(JqyJJqjyiU*NuzsxS9(Ms6uc2*_ zPV;DX-%lYjyB)PMQu1`N#|4wfelWE>Kv4A-5*&tHLvz!=My)C3doz9Ng;cnpjqoxW zx~(^nZktADuD_aWUHOczEg`Mn5+e#(*_jG1n!{$oU15m;6g^3|;MwR8OSzPjuT^D( z6Xo^pm;dVp5RgY=UcV?Jaf2@QlKL#~8(d-NfpI8{Irl>olP?f%lz1y(TIN)$5@1V^ zs=i+o@CR2|jUHZrSaCFLW^u+e`)Bnr|L_g>fPWCmaZ48bhmT-L1svP@V^i+$*HH{-NIYg(~pIzBbm3@ zf3;GCUE{gue@bI@x2`l`RAc^Nhc6{GEdNQ2JE0pU`lyU7QV^jLdpek}niIkSB*Uv~ zx|gtP&A(hZ+;2LkTC#6jk8JZMF<#=g8I1DSUC}in{qyIE?jh}!+RQfyzm}~ylcQuy z3{_9=mIP-8R)Vnm#YPPjB%xd}M|5YK8?T1jymy;!QvUgqI(pXS9i!vF)|l=zux95o zoc?$6np@z~sV43ahhMz>2`_*CJS!5pU}gefCGJ)`uuxpQtb>?E_qKX`9RS6+XC1VGsk?&pCwQGy5^1kLWep_wKryJOVkhx`x4Qg^gm@l*H zqjph*vT+Wiw1G-neSUEs-US@wcqMt@eqgYfc=l(E)%BLaz)=+(A0>AwSJ1Q-p-CNA z*o1h@4^_M4TnB-lneAw4X4x+uvdd(rAm_%{oq)2x)r!m20gz`NfYCsWla+3@eP$C! z!=7Q?vzsRADn}icJVZ1x0TPpqO%aqKl0ox$-++gSMhE??A3 z3}9?fYxHzSIwb%#OCiacNa3vzS|0|Te(*S4iOc=q1GWLw?Lg1P-Zb^$qm}?n%ejtd zw9jc8%b+F`vaRG~^*O?R6sKk6VZieXruL8lx_e&J4fv<}%0Hvm#JuYrDLw{(M1eZu$ zh1jESw2Z4zTC+geC}2fWxr-FsVwn^r@i|(xxN+%_5v~dATTH}OvG3u}U!Py$5m>4XjB){C zyfcWJh=?B04=;7yfFpVG3sa>2E~olE>&m4kq!MThS6@MF1_RKKI@c1Rhw+Or*BU5e znfHSkypDD{=dY068IHax9Bl4pBxJA*?9V+ZD$X&EV4#u{;YQ{nu%kp=tq3=%1Sf}l zy0CkW<9w%DiIE7nkU~Pw+C4V`H*1QMEz}fhy)P&ZGE2K<9n(A%v9vW*s9l)<hCI^vOPT}HI76rue!V84U;u|7N8M*W!eAm{F1+B-1D_c3+L5&S-Sf2%?! z{l=(yB)0$8tTaC2UEtrc(`O>~YF`vraa+OinqXBwkcCaE)-c9B0I$*XLo_`J z`qsNrp~Q9%T52I&2KvE@UZedOvP5g5_026$@M3&OE;k>W?>wJY9G!}!r$a7Eyo~?| z+-j!m<{2h<&+ZpTBtk|Ug7z>&H3O;`B0u9)e1;Q-TMEZrp|l|-eu?NVK@FEYWaYz- z61PCozrXjgcWy9zt9N&r75RCC=_Bn+%VQOVVUz-#MllAp z&a6g@%ySk_s@f` z&hIRLe{n4spGGTT6)5j8uW$Sifg~6f23nK74y@~=bgiTfVR$XQp0ixt9*x`mMN>AW()?{AG zm@KJRod7#bJ3c(>r;9fRf<*HSLJrv=eX(%W(OT0NIF!Xs%N0`Z@UReMd;_ltBa+e5s&0G)v{c#S z5za#(!Ym-I^7@>4)_`;8){{|{bhlsF{K0tWLT(!-F4sp48$2{Qjp|t-Q^f)M*$J93 zViCc1X~dw>Q#ajfPuKcqZH3;OyROAMD?{?$N6XB)Dw%Pa2M&|zBF`-#o|ORr>=KTo z5i6d1^8Iai4CW#|z6cgJLtgRS#J?+Phg?Y}>h`US`YY7J`9-G0xQzQhtlqG`;>$F< zOeLgY(twl_b#t1|jtV!micv3N$P{S2%YjUZWC8t#-V=4U*Si5xo(llPap~I)ua5OC zz%``RO+0TRgn9bvK?b!{72ElCe+&4}F7VX6!@#y?g= zW}ia`@|0>&txZ?uJB7CCB#~5j;npm=byt)IdH_pVQ zkc8lB9Gw)7`^L22rp*dl?TS^3{b5cAXb34BdR6${uJ`o>2)pw%NPt z&lBWd)_ESXcbi#fq4Z3J%MAgveHQWWP!e{Ar<3*V@1SfkL3ip~KnV7XypEKb6~d4) zdDZe6=st7@Y_LUX-O`G8q4R?f#t0$oS{hEei)+uxsEsCVCf_%)I1 z4Gv0*pwnANKj1?3d&pNOOjtkN#0z>F|N547RuP|$g~|cY%W6(dkmf$rDp28SV4#g= zY=HKmZuy=*r0D5XqrbAWnGez@diVM;-$IY;@6j8e%T#oK1ev2ibc0)5sXH=~T0~FC zWra8|wcia5ZHt?$3F=Tcv2?Odye$K5_1RDT`Cqa;VHt!9^eYsD zah7-jw+%8v7KYzJR`2XQI+%^z|#6<0$XgI&=tks5CQEjG=UBSl`V57BztY+mu)Yjik{WuKM}|o9KPrYLokK!H3ixlkg&=#Qm|w zC1#~=C?N0UsB3U9zs&sdShg7-^?kO;Ro2Gq-C&dX}@@?+>zr7t7eEpEy*`yrOro|$B;D=RgK_pwNbSmVN? z-$vw{h1?3Xe*al`KZL>mU;ut?{~}J& zO>!Pg!VqrwZGvGFVu3Pji+?dEAu_FtdL8ATLJm#@_2lqW3hMMus7B@hupJSbyB}yw7OR=pgt z%*tAe{Exngmsxf(f$ulY`ukh*MdUpMv55J{N2^2t0`h<&Ea58rJ*Uyd1%+CWpp#|X zIGs9D8tLc(A{VJ4%L0M%SI>J5(7XdmryOtt+xTW}_KoflJ1@lbAcw_;{oky_-mm#$Eg+I1aSfGz%C& zA=Mn=GOE{MT?5~NELZ^>w!+q5XbNg=WnSl_xh&^AR`34NXg&t<1PCVEyJ`<*(1sBv znyqrT&Zk2w?^f6h$(g*I4HmSHyKCNl*^i%^rKRD@D-Xb=F+wgj5v#s}pa|_=ZzwyMNpRJ5kJk>#A6@B-%5ihbNY4 zn+_F|p!viO@cb+z0kIHaoIO&^p)1Ht&CG`xrR-|JBXa{OnbCdg+@%-H>dH04(TNuj z)!{EhbzB|3nOl0-WhG}~7W6!=?THqxHaQIB)z>-9zF;%j-i$}*RaZS$o2jINSXdcA zw@vHELjNsCmWTvh^x1D6zt$ka_UpSzJm!O*JJ41VKlJ?k%uBb{`Q4L=YE^>fW|XyE z&`%4dKfvzo0z>r>PoZ!Xlpb*t|ADL{xBi8!6xN?!;2~?fLYFBqt&7WlN`6*Zk@a?U zoQ7&m{=dS})z1j-#nAs}F!qu72PH7FPuoa4AA%66sd4*?-uz1wAw)*zWfu3i0AHRW zdY9z^sY&SQID}GQ=yp1*G;MN|1!DkmM;@|&nG%II2aRej9z=}$j)kI`qr*YPr(pa< zq&K0|^wV`t*3YjP(0*&5kLZP9e96{43gS3-Ww`Zt%KP~J?}-}qN%zIHZ^Tz44NhyC zXHdU64gO}{^!=)CPLRP!g^TTqEI`vx7Czr~UYge7u~xlXX-%iZ&9)r!m={L@jlq}f zV>90RTn-6;`dur!{}$8fctK zuh&|GWr;vH?Df!|E&4n21L;QW5l1>8Y zqV$!oH+sI|ArB4VH;AbG*qq25LyL;oa94cbz>IR83p*6W_#q)NQ~F;w+ZlG?Jqi5= z+RshI6O=Y+04-x_d`?u=@|37nvg)_;82k%XiL2p`abErl%#yG7vu$TB4x zK)44MOtB3J@SYHqb^I}5$c?%3g0K(PnHDve-~brfIb;$I{^Ii=mi7}v_!9?c%ZbY& zfpe>!aHRfo?te*IcCd#}%PT@4js`}y+vyt;0YtX zsi(n>@(ueCnLS0kHU0tZLV;Y)(9@y}+$b}ca$_Jtb^)CICH!`KNZzLmgNZY0g(c|h;JGatPYm!~PBSN`Y**b<^ZD(-|z!KKpFP)#1IDPT>$q*78{9q?#B04KY$yLA0=7fX*$@Shf*y^ zhu`IVdhr?^x!Zlc5CE|mfzH(cUiZ`MR6xmdJt-qBInt5TompqdHa5s_a))mri?V4I zu>iNIy6AJdJAzht(jzcMd_CYE(tuKy4=MD98~Or}z=I!PmgNETSpuPALw)_}FMms~ zjcEzsZgR>TRqxDUJ9l60wUX)zExQ!|vg*0WRtLR*EqzNU_!cXbl|Bd%=|zqT2KnH} zJ0B!}{L3%N+(NA`oH3dNs`GX53x3?HB0&-k9TnSqrlhQDZJsi=un`RGsU{W{c7XGf z9WK(H|A!NL>0Vhhc5Gwlg0wvQO+C+OW#mTg8+);9=!VT~`KWYYNW6*~ggD zWDfcEHkoD7W8KWaOYy+jjOnb|RyTv;i2ZBqc}b5u@X7Og((OV^U2MvTDf9wNiy=pH z{}=8-3C>A=AMYTe3YLH$1cOdUq#7vXao390!EA;b$F|^GVo*c(#{1|UlBz(DHnkIk zfVIw#e)bcByet?6bLq z_$Y5W|K`oo(vS659tJEKNJ4Qwwto zsw$Ij$1kW&SIQ0dMz03r>@Gtzc7 zU5#=glcvx;(#kw<>}6*A54F?7PjF4#&^AD_orz%!Dr;C;Q!3E1toau`VFH@EgK~kq zA+9r!pgwSACUH-Y{~ME|9-+A*I9?OoTz+I{ID8=k(q;jml6Kx!bwjQ=t=}Ugfa`hR zRr^oUx&>zpu@l9)i0W5+khrqOMOWbB=n&-5{XNn%7l|n=8JX0pI9DJ1{k^OGa5R1G zA&c*CvfA&gOjZ)C!B>{XfW#5>3FvlIfSfAtV?;1J&N^nRUn_=V2U;x zLbeZ$`7HKQ@svDIYr}&Dkc2Byx^?fNI9k8#Gyushpn&8cbX$VEqhD8cI23VR3Fcx3 zPjXX+_8k_Ig-4o`-QjeWP^yDqwVWaOqtUAlv@_{4i?4J@SP1X|w=vQHY->oqvh&h7 zl79kJd(C~gKvNzZv9?c~f5ZNBIUZupj3k8_XYsGguFN2dQ3{G z*R1@$MA9U}7L@~Q?;O+>NamKD$1D)3s{#o}2ev+K_aA)2#GBmIAKo02L3}WXjfsOkq}UyqJ;#D&>G* zkAYN$-K!kW7OzpHqpI6gngM5KqZF{y(AtG@L4!8uUjjFtT^kvdk*?jZ2{%(T_kGVU#UDUlG99bkY49KyQHyv1N#zx4UvS3@Q?`^rw@f#e> za?sg^xP+oJSX#ucUCe=Ol|@R;$d37v)oLhC#a#uCK_XTXXI}!J{Eu|kJG_CE9&lDz z20~!FH8x+pe5tzKrNt}$jz+{|a5WB8WElYPnzs%BlW@UVHTr)+g%A(MYcJ9wHW-y`mlhOVrj*1Q#-_GyeO>m@du7W7~d#cG;<%{?`;4hK9wjZN6 zgm-&(mUMf?`a zBkq<7zKQWhY%NE?jTS%?HwK5<>U1X=KZv_MF{jcA9KV)WYT)YTBQlOhIbUde40=>& zg@Jwa8%3zKPkt7GTWgc?>P;MqU4Uh-%`2a7z9*v2zQ<-%U#(W|Ax69oNo)7*2rt;G z9k&-0&5dE}FsS9BhsoIo!4?EQ5^IL{vFp_kCiFiMq~yi=L zV?czlD!-H)0OfQx2KJpmnDP4*{$`T+sB9}s*7C!Fh!~`pr&fj16)A_Nrz&kZ zufqyc`mankcNeEO-DqDfR2G}RPsaFvg;A@dt#Vn_vL48J z2_pJ^Xi;W>PU31X?+;Y}0)OBNUm&teb&v7cJhX7I^})tvxXo@2{U7jr2e$r0Nk@zW zw0^MrmK1OUh(|u`LEGio`s7Vyh8+6>VGd|y9LOvvH$T|V+_MJT0g^U@(w7MyY!L-f zPafo93+Ts3E&gSfN1*fZVYu-Agp(Xck@=9h6BN*S7 zM?YkLP%f$8Y^UV)*m>0OF2O!|ZLC5bq5$UZ*H);8o>T2t`9(HoUyiGAT{nXEfdCG@ z@{T(sodrO&Ii4Ii=+-@Zul81Duyk$n_aFGe&>@snT9&PflhA_UzTU7uh`BKHHW-su z1-$1mjx#jSTA-Wgw-sa-ppDwO`QOYU(SP8%B5{m3mLV-jY>EgV?Fbi!hni%sV6R`o zV1&*h?GcQECQWy(T>-?=V{`@Bbu7TmsRfX*EC6L$=yLhGk^4N!XR1pX;$J72(b6v9 z=2baJ?{xktJRFi~$j1mk&qE?Sx@6TbL0)G9NpnK4K6}?D_}nXmjcI-l6(*Kdnht3d zYAJ#&mV?hKPaR4*%(L(*S_{wznAj8k4^m<-@l0(H<2aObvY_=*m}o$YXh+|a9B4*y zQh1isEK^7!2rBTn&))wc6q%mGWkKT(q!yP9>4ieP`I4W|yIBK_;*#NFI&fMHEC`A17+sf zg6pn}RZp2py@57+9AcIXE^Ybh>Gx`I`wf{Edd{?`^FL0Y;AjrzgbtbRWWFyQ@aU3q z;Cfv%luD~JN4>hf++N9zZ93AAw_?oeRp+|#SV1AobL%T}==Zzp_1PGFCKy3fPwq`+ zWL-%h?Sm4nG{v_tzFg~@{g2n`@Z5mGlU306y6c9HsvTzIG_e@%;!R%Cn|kXpS0@E1 zmWCl8yy90;NZ-KYiuagm{0P%^7t--y{p|&ho@FR=7J776;kgCs$3IVAa)CBjksph$k0<6bXi>yuM*qSiTw2VTToZ#vm} zWfp|m3X>sR{um&f1GLFT%bK1%g(u_0wYD_k ziynxxD!&iB#7|u0fMD-Q6;$u}(Th|k{V;^4T*W5(u#5uAp2O`qWD2^eS$npm%9%=Q z(teP^P5nw@mKNAzZ1U9G<1Kn&T8C!E6w@vjkB;0V% zsy3T7JNkRSSqFB+-I;Hv&y}|p`Ll;^|AlOTz-vgtKGDN#94h@|_B4#Cx{z0rsUNO75_z!(AG#is< zAG8T|wq#tgyb1jK`_(5`ck$3eq|-7=fql%FYw;AqV77k@s*;As{@Q!*BOxF8i{ay5 z!jN>Mzp;e3y*uVK{oIawTw}0B<(DAT5zmNZ7B4(H z%3_*J+^uh5F(M?&kbEx>$=HAXMJkxIPpJOjg^VE+9f#3>7hHNvx9K}_F zXn85B&Nbpw_s8hrjctGV$V{ebHb%T8jls+{wf+<_66c-Dn~xu$DKSn9F^0d$$a-eu z>RfD~@vYaEQtkm-ze01o90i`76jjg9vB_FhiSe%38psL=W!T3QA^G_M>nwI6u{dMz zZ}xe_`to5_>&a$gmuEeD;G}|+NARr##pSg@9MaZBg)k_|>F-tt9dns!4H|%EIT!jVV4kjnLC5QLDX4mYZv0WS9jd-#fywVd`tvnG zM$%y(dnDy{3wAMNZYJoNA^m-hq$a;Bi@Cf$_&aa&069;ceWB;8v#_L*4f&KP2rcsO z)N*s|XIi($9+zNqd<3Q6&5+-+6PV$g5R2|4Riv;5rkhw`|Jh$1K(AbT%~)9wI)q>? zB*gkpU6RT{2YoOqmja;Gxf77W;El_q;3%R6K_(Uoq)zCS3zN@y(g}nQc<-X1*p{co zr74^5PFAmVUFQT^BmvT5p+rcNr>WuI|Cz(oNY2OX^nkX9T)UsOThQjz37R6_D`zlX zAt`W(x3A(@RPX(->b^Uk%f9cMpFNVj_g>keNcP@QRz}F?M~F~<_Ff@Mg~$$tl#!KP zl$}k=3`N7J=X2;hulu~N`?~Juy6@NPc|Ff_{&$|8bo`FraeTk;&wG74li4bh%tvNR z<*8jwZ{S44m=qf-_29=dgrBH+1^1=^^fw8p=0Z5c0ss(cf~JBXmnDDURr0Mm`2TNxCYbt*J{h9)m0ld}8J0*s`VKxFZpJ=hB0qy7L+ z!ltDC$@*)%rGhw)8`BLJPP&h?!+0p6ANe?p5@|Fmha9fJIeu4uX89LE(D3E=6MU_v z+31@pZyLYN1cf#J1*hyH5y<}nr{LmH@T-to1L)$VuTk`TKLNa}sX+jn7(Zh3dVbRI zu%h=#=?jiQ8zI~0-izwsYt3XVM?jhJGatuVAQ`=W9DEr_)DbIg!zu!Lv{RuxYd>NP z+Y@2n6|>-#`Q;}W6u;&=*JsmjccYvD-8*67J{ z3;q~*tX5Qd)1numK6e98{qDu3m&96kPuG&tiz%9i0uy`-_-MhxdYC{Rd+OZA^o<|t z3ef*|5DO9AXTVM)SSVJ)VTw^#u-T3TZvlEv&^biD_Od;u?AzyUdw`;_+)xU}Sj*ha z$ET;)Y&nOO`5{6lwv)*};uH&Dsn!N!-bt-7#%Y7r1A^~M4 zRkligw_{W9*i+c~@LkX0TYflNbQfh<=nf^=MBCUYJ*k`Rt7lBzUTgJYEPbX7% z<4Nx~P&AAi1H7fp6jNxZZIFr{Y*MS~53Qsh8uAV(#5aVFJAnPbOZZg3TzT)4w4oe= z(Hr2P<)?8gl_r`FzfP`- zeaN;GUo_(6zrk=8S1=dX<-}xn*v6CS zcbDAEACj&UPrdHzf_#C5QQx;p6KaQ-XK{5}DNr|>K1M*;ti1S*L^gcVlw;@U-#sR1 zN2n$|)FlfnTIuT;d?S*~2h*6Nb(c7K=-bF3hF1HmZ%8~}*rwSErm_d9ytzj#U`u{%XlG=Q zBWt8~jw^uV&HGmFvS9J9#2CNya3z9Xi^hOzi?KkiRVHHcb9O}BM;Kb9X@>0m@ReXK_3PqWa!6vd*w1QN??kBB+|;>5-Z86GYt7*kk-Isx$IynPt&?BVL%n97bLC0o9gKU&@JdM_M_us+YS_ich!udyRdQH? z)FoAn?!1^>PkQKdVv#dc0n^-ibiG;-OxP3s+{nOZO6TkOY@O;ijPm3FwlFjE@|oYr zg)<4*nGR_Nyx$rtngnQvr!`V*TEF>jZ-noD)Wd(|d`me(L6$W;u=N&d-Q-1TDtAwH zB1{>S0J>Ot?<^bb78U?&Nxx6o;Pd&tR>ns_IFxrXq+EwJK^e?g4(2=+j#%6Oj!ChA zE}?7)ls!xV|FhMZ4{=D-Zo`hAaHZCfXcLC%3uKUt7!SJ50QVIB=vSYBWa*)c*aM9Z5# zu!3Af>Px`qno7x|-3`3~;2nV(Hd?u2)hm=d6)IEtCxGb5$G3F81Gh&D5x!^Qo;VHk zBCQP~n0$R0{*kqK?C6CkIbvH-M{LWbf62B09Lxmvy9a5xQiw$K@XE!XCxLz}?Nu~K zT1Ub8)D8abgmZc25TFr6sCGbif{w&$$JST}Ht#_-#9gTUv^C|WHh>-OebcuYs`tla z&d6h7fYrE_UiJ-?r{3qJ>7vw3jl_mYhVC$7r$G*iabo7VpN<$gMxtX5&(nd_f?eh_ zVze&hYdlV$j&S!EnTnB3ab%W!xspa~8q%c0pbm(c{eZ^DLa;)*vfvPq`lPVo1Awq? z0U*Ip>E0jGwuU8hG$!f7)31grV{aC7`eHp=DUHuS1SpWv2H{&(^>Eij;Ofq2E>^zy z=^EIqFb*vnjvno$73V8%LkWo{n{lQ*wM_XU7+p&ak!F*B68$lb13t_s(;X?+Fpa@h zhr+YOgM$jh!)`uo_yO}-52_k-!2E2!4uv%7km41LAI`ad?@MIP^mD(Pa51IWxbo!1 zTn^B$laju z1I&!(Ri%oNw;w-;dt-lcHoZ&Hrt;P@lgaRHe8g2h&kM^XEX`JRA55SfL;BZg!0KN- zYZW}FWF2XgV=Z~64pPO=R!~{>xAK~GvW4uVw!9ljoyls50tx&uyn&Go(<0u#dwU2t zjQ%^-qc?eU9)2}n3R>tO5&)*3QP>uZdO22dj?W$o=fczf;9*{-5j=(t2boOf4=l+3 z>GB$94XLL|TfAj+-KbnlG4v&=C;CSFV;R03?E01vs;@^jv6Fz5>j~@6YY`X^VkNWZ zL&-&PD1ZG`iesdBF(GWhTNvXbIKywYh%N%<uqiP-4X~aO2EoK)6ET39WxEpyozPY$Y!n0uhfHDWudl@;+ftQ*Y z&XUrzGd&cmaZFaC$H#HD?2c*<#geaIJ>)s^di?>+N(w5dYocbrk+)k+b1yz>B+|*1 zLNOAHpE+JgDHWt`Ej6ijmS%`>LtT%D)vZ95E=4SDx-W%!(LmZ=q=-|0HS5^{Pm{hj#Tu6z46MR6W`o zu$B@uvT|DRAhO|XM!(h@??4f z?!Upoc)GZZ{*m2UK$JJDn?|-rd=B0(qfK8WMgjQAiJ(RbznBY5#TlwH%q502TFQ){WX5 ze+hsM7m0ryxWDN)HQNakuqgw-8@OH`+qL7HgPqJJd)&B;-WPtZZjWzH+g%;QZyo+I}{tPwfUE^ObRsB z8Kp+g{};?c<{LM5{YWXI0nsslm8WoD^13FwxM$Oy!hYR8ML33t%ovN%!QUQ2R8 zvfOkw;?4nFU6Vgom2MFjmAV1Og92~dfZ5gOce)E9#k}6($tqPlkJ~mj*Vf0y!Piye zlhJ-LiEV1LDjzD`x$uao2XB?}SZ$pz0a|pm%Cs46KkyfL0$|DBf#iY&K0h=Q{ZnxW zT49kZ-VN<)oNY{M{tteL5?z}%O8oBIhmA=r$a@=osr;Fbfqvkka%Fz+GF%;IqAx?I zTVFD}hdCa+(O@GgzsRzZ_{`00ZG7}>ec84VA#=M`e@mY~3H^tE>UoE@dlXW$UB;>|f6a z=6M+!SyC*B1BqowiLOW^JFkSJF!d5iQDYmSH<3Pc?Rnc-s2|ErFFN0bVI&!qMfH#u z^6~ zIN~x;rEu)P@L$xRfMG&J3{sW~6zc)(s4aO^_?{I*>%wI&Vt< zqMW$vRU)$P<6mmB23R21c-tm|XL;b|28x=)<5>MzUJj(}J{8ueSU3|(j(xgug<^|- z*-Q7%e#Q^xM>j*WvG!xL@y8Z*T1+#2m4%nTqn3WW(F>*Z^L;Anrh(Gu0^%Z(e?gJ9 zW{5HJv+SMF^TUL}zhiEOl$s2^{dd!4?u{f0{kY=Q>31x-iTsgyZ?F3x8-}VLis^nsWY(Y^RKGGZd) zz*y>1V%_w7Z_mtG+xAf&ckYWB>I)3+AL|LX>uE5*W@r2qHB5cy=LwW`3ZglibT+Y7 z_+!O=l`{xA)hJM%VVsN^BK)RG*Nl`m^E5Y`v^QC}+3#WzX>}ibY={p0=s2DEN@U&h z(;2?NO}%GcAMONRar)FG>E>}(va9{>qS^Gu>xw=K^-v153$B@FgYOsbc?RTP zZE>d_88F4!NEZX>^^F6U=3vp6F{=9{l4nzYU&wKK&~}|PM7AJ6fh1H?>OY0xy&RD zxCj%NPo=%1-Kh8pCb?g+kVTIHjwL2pVNWv$7HCaux>^`u6DMH^jNP7G5gK*g(c05fQ+!)}VPGd|0WHPWnc`>WG7lpLugtI>;pJ$A_mAWA^{#E7vC8G8!@oS#RL5m*WImI4FSwlk?FM)dr$$b z22^neDB3GHS9qDHn}i`dk0&n}x<(LB3XyMs?+jdEJg|XraAeGs!%@Mj zs+t;+mzUQ~mvsuvMBRMp3~O+9v?DI4=z5H#&f-Xb0otO3SrvjcZ#Do>i%&@*_Xf?Y zFF`hPh$~c!4%ZwukCmW1;`ZuseeTI#SHV$g!KQk4_*bpx^le;UP$oOTc$ikuxYryn z4}>23#sCbMkIH8Q`0=w*3ue4uWKkR_M3@!lY>fskxOPcmaeZf-C3F;Pi zf!$XSA9!6Ra%wxXq^|#1x>fVp=CMO;z+$3IxuC19ZLaf3X+}(PGT$qVY4&=0OqZ@4 z_6qw+eXbr(PEJ*2Wt86*s8mc9o{%5Jb(hQXP-gK=NSL_5dgdB8bojd&fk)Q(tkO}t zt2eN7+`_gu!$Mzxi0eG|h-D%U@wm-g-}k_#$2!L`6j@sHs&~uNI5H zIh#Aux<3>0?INb9nBx$*T$E5bI8olX63bVk8X(l3RxtW?fIHjjJGO^EpssCDp$LPa z+ZDe51Y+@XUoD-@wn8{XyKj5Z32lI{>|8_ZZ0p$A1&F}C;Y2rVFkB5!2d&If}! z?U!XL+hA1QEIpUoTJdM==e}CL%Y&FsDFXuo%mIvJ1wLR~)#0IvvcK%Q=EO*@e{E4p z*@8%EJn$7oPB=RnFuRvXHf?k=wK8oROZY4}Z`B8?c=o@4Ck!^b78XLa;(Z9kpm-)* zRae0ZWWs#PCn60A7UqMj<(rIQD-|WY`fw~63!kfI4NP3MU&C&a>+%eCeBa+c$JWwv zT#`6K$o*bi+N2Hp;2Rr>%l-V<_cvtTK)Vq3$nRR$4uBp#5#iSfc6r^G%uWaZ6?(fE zYB9baew$T$ldq-*Z<-o_pqG%nR0SRo58vX9`Ow+jm5V=E%bW*;Hk&jq5Gs-nKdDQT zo)zIW2S$+`Z5D1ox<`aN1(T$1Gp%4?mU(VzC$5g(g5G5@N^fASh(o@-l1c2~6(u~x zKlA}uSdgLGWQPiCzcZiZlyJp$)v0rJ)5PwrIwdOJeBTHvPOGIdy}iAAE-}KF{R7rV zejAuwR!#{D#vx^|`U5ZqYPZQqNTju?C@a@&!31V#27OXBVpHW7wQ+6m=$AxlsHz%{ z!nE1 z#Nq`@oNk&I5b^2yvol|pMX|B5JD$SSCm}9w6y#)PMjr|1zvz&-y{i$3gyw2}lJ-}i zHVRD5&f1U|=>Hm)D4gqj_w~uii#~B_DJkqgatk#zHWuvFEiNt=K7IOhXKO137F?~i z*Jx(LRInVdGh^;@o|}EtHU^KNx`syCdoTrVcW_BbnUF{}5*S8YHSVT%@f%o0g>&&osLo57T|8k?6LbF6o^1K( zF0LOPp(~pAqlRMOu)_6&EMk%&{PQ-*gKiv9UaDj$6YjntYIbG~RypmR7<91(4ZL1S zp4HFsl`5VAy=JkZI9*W$%SDPh;(jk!80jjE`bo5bFW->25}Jv^eGv}+RAadk(>hkV zpy~DoMn(p;!AuNkEu$c-g`#X@n}0L(nEwj!E%U8UVmo{9{719A#p6Pjx--` z`aS2|x|7`N6;aca{*1oPYT#Todg^P+CXDY5AC>*|>C;*bwa#zC?g3LR3V*Bq%@gZI zotX;cCK>EOyL96QN@)LKD&9QyfZT9fuShSv;e}2@Cmco7C_ zYedQf53zHyu?S9R3_>|(M#PB-glPUHnXQozc2zg%K}NOLX|*jcsoI>K=*mYl7E}l| zm2{S!vG({zs6xe4IiY*#Zqq}<$n58gqc2(ZvrC@KovR-rbdl9l)I_4$w#V}Y+SVD% zJjXYLDc0lJ$J4>?>nw5V^1W*kBe8m?%2vL7K3vmK^mt($PP*OH3c-rLLui^TY5K9U;WNJ3;NZ;?FJmEiQ{-=A_cEGymq_|W!2x)BTBR~ zIgXDQn8*f`*osE0j+;oaPgDutSZ^}N2@^f_$##?4+=&|NGYU|-rQA^pH?Y5S@P7zCu zref8lM<<~Ko`k)PE0&LnwVueTZND6Q zLZXLbx0Rdkc#)qxs_I#*F!rWJjm+>%^1&^o(Ay>kgH@r!#678pYQL=gY@n`wwa<(q zpEN3jILK2;c8X6r)!5HoIP}$MN-hJ2?*JsmmmuV5Q%TgWhGVtW38-}@#Y%UW7wWyH zDPnEAP8uY^d#!T83g2xlMvZK>9<;+>CPY-sh2nb#+yt^bDE&oQd_Ng|%J6CO{R>FU zk~`Ec2vt{W>m^xt)=t_XHa9Bb0nyjpRC7*9#0?dl6lAEMaHxL5V^{iN56LiSpoUgXnw`X$HmzkU$q!APcdZ4YYm zm$Nj3NuugJLQY?8h(5>Ctd}L2-u}>zrTRXz{tYu8Aw9y^KL}pkKWn3tbn@io585kF zYV#S2q; z2Na=mvb(G0w%IhHzdj-6p?jtoMwuy$29-m`kuHvIf4~-@5RrkG(~Et@4`@he?u#q%)v~hl=5INUNCu{ zCj2AtuXuG)VFt+8V%|A7wtZ$DqtuP{*BJT7G)|7(qhrp>1iXVP~B-vrs~X zhnTnRfuZZAmqLZJj~)lvKQ7wKD-qgz(8PbrPxS?c0grx;sdYS-?OV$k{!{kFO}zub z?keoZfV)qlY3u1MuWJ-BUGk=L2Yp-r-uLgOlDuOoEyzZCca3B2IZr1UK^AGctIY_m zoOABQP~JAyv*+`_KYZVN*d>2Wzc%fpjY*Q@?-{cSAKRIvN{`0h`An-5&Ty_0PKem7 zoH$C~@uvT!oOXP^EVu68zho{SxrP7pUvZKX4Ivkd${olx*m6Y=-}HclPCj(RnasnJNa+ct zIIS~Svc(VK_TdUYIeNs{YdKS3=%Zj|6#t4e&8i2)wLFQ1O)M*dAJUMF9;5&&7}USU(__WlvsO^ zdI0K8K3HWrL7&fullJn#T(JPj5G^wi%esUG`7>wKfZgnX`k9*V;Dm_j4Z5G{JsI;k9hIotR0*q zcp2k^1Z;I~K(5^g&KO#V{E1=)vO{GXj^^TI2HOn}BvE*km6iFYm<>$7L6paEa_%nD zt_N}od2@5K30dRu-3tznSWFrHq@yRnoS_QJsVdB!nm5U5X?ZW%+Y6MPSfZ3|xD$Ky zI0vy0LacrQ!ZDXJvaqmd2;S<&)D6+4Zph5^A{G+FwF0xW@jVRTL1Kcv$l=4F&J6~^t#O1&#W9+U<5-L%olx;i` z62{FCo%#${PMs_dxVT7Gr!n<{=wNFuL_TllKH)Anv3&t$hrDJJ8t^bdj!k=@JNX(Y z{Fd=HRkoNM8822Ml`Hk&LOeL@7(Hl8McR}CBw8l8V2Tssy4Eb^Pn`Ofb50u3T25$ zUgk?1Q0r9T2UOu@QiY5NuE~VqmD>x)2Aqn2=3Tz7Xw$ASlRf8w@xPf{L%d%3ujR)@KbCwuKV$pg>qTSl@tSNE`xph;OdV5zu%( zJdNq7kU~UNbv$PRiT-L3BX>2&Ad>7h0QV`P_&#S%?9Ykzb`?oC#Y4|h7Srp(DTla%x@h_oP1tQCucwC+7T{Bf{y z!~^w6K|#R*UU^aI>f{pM#wUx7jg32T5y+9sGxlq@I50(=ItQi`yYi_Q4o{1VNqi+M zsP3@LP`ZJ4)*jbV8dsK=WcfIdkaY0sa5ko}1~4w<_7;CE+B?=JylwKs#InTc+^+Ok z5_AR{Ppr6-$$aObZ&n$>3$sYAT~fa0&wQ?U8~N_n!xRk-Q^p@Vk`TGbQqRLW9dZd~ z_tms~>rbO~NFbdqu z#C>g!u6o?j0A!WPS8%ww1@1bIp(4rAw78jr<-rg-$OlI?w?oEOTO6YW2Ik-sOcC{` z9(N2`S=)Pmc=txE>C{veqsGM@k0>oGm{Lo;7(PE#sNmZ~c2!Ts{^x zB6mdPq|#qQ))dh7em}CiM5sOtIIIW<}7H~s&cTNzPdDF7ZhEo1b34M z4bDD=iA$yvJ119Q(@7Z`1*1`qof{OrNdOCNamuz#{R~uTsUG62P}qP(DOlvgECyyJNo~(Ay0)hN+>j&hZ6W3U#qb7q^u$ zCh3x=A@U3*Uom7yh7?KX6R-mzTw_7ezpb7RWmRccrJ3K%jpJ5&^DL9U0BX~`&fVO{ zB%JOmB-he9?kraJ9^1Kl9t#VbPfJzF#8X={{H%Nz69@syHHsJ%CE3L|_)WI~VQATs z5j+8deTq|qV1u=0I}_t>*aLRvCD@qXLuPXMZtoh~%u+WAskk>LoQ_wA-Cp?}rGdSl z3}3-E>y-`XarpH9^KE!-)b+5g=mgZZuQ563JbTOjz*NUmzvB-uW{6vL{2H_-IDGV9 zj?alXwcdyBBqk&r)E76T%SZYS5qap-Q^7RoWnwZ}Sf&%R zWWDp9;V3n#^iR8Vn5G7s8%$`TBUq(bOW3l;WI2z2oK;v^MMVvqsmsGpp^oOEh3*cG zliyR;W6gg9+c|{T=da2c*`tmAfMoR8XHdTgjE9x7LPN4EvEUyqHGS1b%C=$u3#2zz AiU0rr diff --git a/vendor/github.com/docker/docker/docs/extend/images/authz_connection_hijack.png b/vendor/github.com/docker/docker/docs/extend/images/authz_connection_hijack.png deleted file mode 100644 index f13a2987b28d70f81bda7096a54ec479f20b2690..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38780 zcmdRWcQlrN{5QHQWZa>Wd6P|cLS$x-WJmTWTSjDrtVC8;86`53k(E6|W|FMz>~$kq z;dx*6UFY}5^T%_Z^PKaX<9p8c+}-zeeXh@Vzu&L%z8+mylP4ymBE-SLAy!n7y@7*+ zrw0GA;-7#|9MZp9Nu8EL$=dljUBrC8qOcZqwAp>oGp5>Y6`LFzYZtTam6~jq zl(O->Yv}U0x4S0Q8_JNEaN@t7u9aS2%^r1;MNd*kcE>vaFz z5`!y2a9wzpAnfBm*HrLpe6;=dC}A)=ihhkB)vv3_{WAtU3bpE!|9-z-9X{|4FysIC zNnSWjiBAaQ9qex>ynipe^-RF}iRHnK42757b01?{H@w+Mb#iW8>t~h;CXy?v@!A#| zE;Mf?No$QjeRCr6Kf|fhR%So)ZE^ao@hDl4(_ChP5&vrOXw|)at|5biD%SkSd0{MB3haB+ zu?K4qm?#;BPH3G{z`Q2VdZVK%dT%w4(xM~&;%j~3(skto?zsLpx&}HtpZ9wV4(NS% zOkdSl_2f85QNz5RfcZRj{IUXOfuO{3+z6X~jm2MKO~P^O!D_`Eiie6I%FhvxCU>(d zl$|lO9+v)9us$IL8z$#QX3X+XvGUuSr51<3b{*b+Dq^_vIU~C6=+MB(bLI@YUf~Oq zI`7?$jrCUgs?65z-dFN*bIWjPD!8EerNH~Oyl8BNWO6$H|*flr<}TKpI@tT-lk7%*fg_D^WJ#G!72ZQ zhC|$g_&mRCzG1~wyx1q9*nccoaHfEc7Ig9x8!xA zC@7Ur?a=r2^(cw(Q4WjYpvF~pgM|&Q@z0qiFnHWl1j6Bxb-o9NjOj+j z);(o;w>G|i?BD%X;X*xk+2Px~QXEH|^V@Ejx}Im3Iuu5Vt<~eWuZ2%B@`*f#Vnd303ey;0#-cUPNOQTi5y4&vQlKu2>sck;hC7b3B`MJy9J5J@w@I%jnI~@r;Yob1TCDB)r zc{-f$eU;xBbjsjsmPtcE{ss9bly2+gDG^kc-gT;PzbrqLky8BFayzs&*edw2^5}5? z;!^G18Kr3s$E~$*6~)dg#t#lGGf2M+%+VJLfZ~CI1p<%M^Shc4d z?RzOawF{Dwu@7ar-jJo$_o++Rch>d_tYCd%l|3GfdrT8ocy7Ml`wIKk@X`gFFWDM$ zqMSURS4PTb;3@FbyCSGBTm0Htm)j$~x>G+WHwF`;u^&pVUu+e@rTPhIXBvy>}WvM6J z>3f|sjr~43tQgCp*q^K2Uu5jNdo9)Hr+%sZ;k4uPAD0eahlDInG(229q!hdzWj9u> zFZYCoJ<-{72W#qo@7nXa74PlQdvPa~jkkY}ICfOJEoI0)BHN3a@yZ_5J9~I^@@Qw8 zG)dSw-Fttfe53Ic52a$3T8fR`$;#7h*6qeEscwE*d6pgV8w17)%-X%>A{|!P9bi&cq}6dT_zs3pLogx-*SUu0NOc zUmaGtuiTxaz5)kz`srmyqYEoRr_P0Y$MYDk=E5<31LuUh_Utd7+fq!0%3apN-`wuEdD{_mRDM(phX&uM^$Bh4wZ~^a{#+TcoNkF| z=k(XYTIdbcY>(N}1YbT?Jc{lK^dP1z<1u{yqRjS7Hbdx2Z*b)qZo@$~8G7~3Dwq%- z>z-8YYxVnY2CEHwK zULTSo3w*BCk@5o3z(h(HYNt=tjvw^qGRJ)~j~24hzORl}afs}lU$+{bun%}yH+lRR z>4TA+P5kfTU+k*;i4W3=jV}ApH@$jxeREsjOk2%&{c|27rErK99XC=?G|G^sif%Q9 z`Afdhd7EM0`efatK4neBFl6Eek%mc|oI(3j_TxN6Cz+J3#Q9f54yZ_J6VF=BzOY8A zc~J#Y1cwJ$)-Jm2ZdkrzBTDk5TFeev7wbvdE~RYdE8gMH>K(b6ZA$Mym}+&^ef672 zPv6uV)zou4N|AoP_V`vmiEe+LyY47(!Fc7%!0`<_8=r^ak@z~pRWug^nyCDPXQ zBv-@w4eHN!CPnnk^`u=c+iF?p%i6NKKIYTU3R_lAMCX)X-8PS;u*fSBnlC z`0H`oW9vPiJvnN0=5$_waqjLarSX}|O_Svbl1AHZ1q^USxl<*bC_D}0%$;31{24zs zur7I3^O0$I4=akCX#4A6k-3j{#GE1~4{DIcu(Y6)k8$wQx6oZ3Jau`8yH^i)rrY~o z){xiIwTvysz%e+3da}7gKq7X%1maK+KGi^L%pNT%`+=swxX*UV{lR&Dz94E&<9+kn z2_p2xIEJ;}6;!nk=T1s(plvBP0!-ORQt|Dvvt7v|nrlic!=(``8N=__YWKtQ1`3QF z?aYtic8Poae9Er*I(zb~R|gx;4eQED*#+NlS{*B4x`V!0UP zPB0RT?=V~~6<=>Aw;?w}1v7jWbz8&_R%TFh8ZD?h%gn*}o;-G-a=dZS zFa@fEoXH>e#ysU|TMFsF9)A_>XHFn2em`aFu{hqWzT08`bYPMrsTkIe?@E?JG-FF8 z?|mPZPRS~t{W3h8)QG?&8LPfxEH-~->ceC1PBrQI*xjJ>R`=z!3$6NhHR(Gu`j*BL zmmY3C#x@q^=@&09dim7d-^!)F>|!)XCw{-g`Jxp~ne9OL+k@F3aU9xrO?}wy{rO1* z59lBKnru%J$g=d|eT8kMfAB@y`S@owLu-d~WqcjzS$mzEH;VbFrix6hURz5nGU;p= zmG2pJ<(~Q>a0cIeGfz}p`3w=KR`!d*X@RN-N4}#JwXuG$@IOs|*Hi2WJ1&jW#7Sus za1y`iMCgGOhPRsJf?W7@eTM8k*o;I>1{W@x*$CMWGmTcdX%;UQ-rcznDVDBtIp3f> zKbl*M`u0ftMS~2P5R#ZnwmO%X9%<+Eg}*-bLPOp-81t>5c25awUk8c7X3M^L`GqP3 zkGlrfsAW&*x0#sxILYo3y?`z5d?S#8iBL!TZ_#pL(<~;cpl5f+t8GvYwI2 z7bJ6H^cQXuX4MIIW5gxHs^O%cXvCM%*?B}PHc@KoiE0)xedI5Bw&}~jrua{ML7OiM zSNE3%`klNNc-19C#i{K02nNX~?xG;q#iM8xO@7Sxwm5p0I*i_Y`!Z1P&GA!bDH|qd zjjQijT+quYB(LXKhYBmcN8-q^|G4tK!~{otujBf-WKI~|`^hwe?0IAaJB)=;uiW{X zmo!lCN|aM2=Iv5Cpzsj+@~?`*zB zZKIc^(4*AoL>s)qTeSeYAmjGk`>dibd=nWS318}b(G;%I$(RB4_aOO;){m*AJu&~F z3_mG9y5D8>-@rzpJ{2b@R-8VS`Cnx75I*q_K#K6c{!G*%G=7w9ApRGL6tYTA zTJ(fiEB5p*2*%^|Zmy~LKUYS-aN@u2^zdJ#wG1$6Xme8k-z)RtXYiIu zzt?yrN1UVmMh9Ox{B3$LG4)vkVs{VQb6k2Dm)XwfyEE+~)vxnXFXOo_eu+LoOyzNf z_LK7%Dek11*(tn+YWj=s<{0Qvjf}~)2R{w&4433Y=B~R+cQUJCdN=TbL;kZUvG6n2)2siv|2aUFM)g?Uf7i)_41UJc=<}cZOT!L0MM=l< z?;sH{nkxHV{onf=;a?Z_#BFN&&ma*<8;igFpZlMJr{yv6Nc?w@Vg#}&PJ4jHW_IV& z5}M!Th(41mp;EDz?7$K8q%p=t0KES4-Uy^C9*{hFP zQ#~3DV*DZv4(e>+AacxgCJ9{K^xByWiSW`MFVr>F1T!v-q5W1mQcO{dp`JmPI78C`ifRUv&~k7mC=;-Hzdt)7JD~JRE&`Am`y#!hUPBQ!l=*tKhco;27k;@Ct49EcIw0J? ztYzv9u&QT_j@{TtdxGm-OL}Wqa&PsP#1NqPq#Ab<{KLIp{7x_ zFFo(q1w`{~hF-+usreDJakJ5-;!YpSE>dg$+TC32Xaby+0oncCy|uBy0J7<~K_2t`ajnHaT@T~x02n@SBfK>B$%OO=R6 zRG$lVEuFlm9M2WQs!rEXcrpUT7>!e%gU}|v2YVlZh3J3COg7RW${Jn|@stYyoOUCD zDIstYFE{F0xym!@2m_Ajk9I;fqI@-Tj~TTez^RvMlcb?V-x+@Whdgvb~u9P0`Y+bKGqbN4x6mI(dnA zFPPuXfJ*=F-j6%wT)bnXy<2l>50st@*?$rC2H=z_7eR%mTVD2r_DVaT)VJ=Z9|t+_ zkNfVcrp;a@H?#+n<{mT;xV|K-X3i*>ik# z8aD46F(`-FA|(#rQ;9ZzB3yOzxT`T{9x2YU^KSYM;6E}CO2RW78Px=B-B&Pg zZ5PkFYY;8JaJ;uN%)GVOPyTBSH|y9*5oOA zgQixjt(@?G%uR-&a_4Kk;%jJgrghq!nHYW$~Rzs2a4C4 zvyUfbiI~k3iKp})B>lMW|KSmEb8lV&cT_G+J;?CQ`27O_D+O{~pB#u>E@Y2x9#w01 zSJS`EmR;x5rBp$wrA_DqWj85(ceL75;Drjr6KA(kh&*51E*g|+?YBnK>+U1f-2Phi z<`aWjh&j5gBc-<1G>(uVMSpe*^iZ}I7TNT3xK+zX(zUDuK7V80_gYop$#L5YgLV(K z3-r3J=Rdv7KRnn!N!$>6`ofn3*j|()Vn80Ie}1c1B%S#NjtM6>clTBksl@wR<+pno z@K@OaoyDrD`<3W7LPEA*Rr*iv+Q>YIl#%m90$YD;8Q@849Osa>lkKD8#~VGoh96 z;8flCu;5h)G>y#>WGbMA>e%=qw^9qWP7*b-7MhIihZg&r-VGkYGM@}idcfN}gIPt( z+}8!^-ca=l`{Ui>=fbZ}kg2?oDO^*r+s%yLHIJIjtr%TrQM#XL7W zj5(s`v6D@~^9|=Td#<{6%pcV`J*#t_>TrHSBZAuImlXu za@$18%m_(5hTa}yMCK}IP7xBNm z@Zp@XmW=RBM}ls##OYsQFZAqR)^2OaC(bR4+@e32L8V&W^v1(K?{|-8>@;f7i>mfI zBZj`I1m7=s;icw^<(C1EFijsZ$~8R$LjUQ=t9#kcgvrCjRyMHZ5jP8`l}qEK2Isn- z4=hqdeqck=Ii)7Om`7nao%qeJPkx*OeOUGLw$CP-0=Fc*&wuOLc}*l0%plU!-@->t zGX4X7Ie`7Ef8wF!$-BgTF_IV*`nf*?XQxhM&EuEcp)AdFrt>X!*xbgF5Dfd8k4we< zD(N7?MHhld{Kbjg-TIpnyj%{-kJTkf`zDX*&HTiOQ{_6f3`=fDBh1C4J1eyQZ1rS# z!+E~Bt;G_q!;)j`kBLL&rM<~y@3Vbv-z<;Vc^4t%Fj98WC>A4HdQxaikuFppPvbPr zlb51-_)i9j^AtBXdnBsd*j~RiyD9k9sPP8Q&g+#9-etdfrM!nz3n`5f8&`ey+JFrB zWmMQ@m`YcP{Yl)K96!Q@#>Wk17JDHVPWjTz7b_skOUoPH6FS5jv9~o~tQ+!U14q$w z?Rm%7k)8C1DgT#*TxxfW6nJx1eRxzgjCj2#J$Gjk z`puFPqeFTw`Z^MmmNn;H`~J4`w(t`i+aKc9tL{gSF@}X~%)(|xN}aB<^xG>Vy0jsQ zxVFu)o`lbv59_2uQDO$@wwoDV=EiStUOJ;Tx#Ep!J$C0pt=+@}@v}TF33lENyqX#h zSkTLA7jRWE9Aav>iGnX+S16=W0^C^O4*gs4$D6UwRTEDvUG&pF##aX-g2BNmZM8mH z#pC*v*VRSO@TSN%W z*~q}{6QnryJFSsHJd@5J!bO{RC(CJyb}+suYTPN|Cp=Vz8I{{^K4RnRFZL!w=usV{ zFKBo2CTRt-Fxg7+TnnBA+tv_2k ztrr=%Q*_Oaj2DDC@ZErg@@n;=<~o%T@xG2%i|E7-*QBREJ!Oj!SJa$b;bM<>vNDF` zjc!ooeKe6No6wgoB4tkt>a)vbK_t{dDqXWQqORHYqN%Pd{wCYTg_|xcrER%qtX`PC z*CbV595yc#s&>K-9-lrL>sI^7bM7FP@_s{wkd2sHLqmh%AEDDM0;k$W@AV01RV$f1 zOdiyevrXTgIOA!MPg6`Ew9Wnju1rxlItMK`E+q;FZe>n*N_Uc5Y0C&E=~AehoUY~y z10Z@$!}=ZjA0!HR37c@JaYu!>G52TU+lWU}iTdZlX2|ghE*0RP!zIjeingx!^VKI9 zzrjz|X+AnNG#U&#jlBq3pINx30W3dRrPF!xH|(uf1hAg`g*xxl->}>76)+znm0o%x|G;k6(=VLv-f%4B z{s&P%VF4cC|IUC+_oK(5YP&*3#3>K?$= zjQ8}f(3&wq?A>RAk7nn06p8@QwZoy#gai_O!*T(b@Rj|lDVEfu^f%Zc7O zPf#KNLJc>Rn-k;<#TE{~g{n`3^jfPw|p^VrtPp zOhWRjohI=LdlXFZs&hEe+kSqsM!7TH?}L){crtvp%vsd50$U|11xU z3M@}UN>lDX4glfDusp?k4@(*TrY@X#VR=s8BYE?W&_2Nh%hSC``Zf5UkoS4Z@SO4vv@EKi?58;M{{`bbdg}RZ_UrreEm^y+nSjZ09~83Hzn{AhLNL?#|6X zQCq5d?jq|!#Ys@MxnOIZ3+)Do(gqAbCNRpME8T4MAs}jj&4S}Uy{{93AAjBVz_&-=eC8@ zf9J=3tSW!At`msq%s0a z)@b{1<0KI!MkjCL8c-RzQ~p2DY|k1%K+ZI*xSPx6RO!9@PJ_o$Eb0Xe_jBEY2N&LY zHhnAC*{%lz!38yQ^z*#Xuf0vmj(y+frNf1sjDQ{kq0+;2%%` zMb&b$F-T6$N(U5iP3b#3*hw4VQvr@3PPe~#=#BYxxK;4rBk06WaUO1;v}!#zCm%t@ zoFeMR-%ey6Y8$IAgBdb4U_#d0lTi)5R-@-_r+l4L4x?8+2zg z-d=wh0Q!K;qcC8S43!eN-v)a-kr+Ki(5yjx%Q}z^_q)jPX1;%nU2Gs)>juosq|bj; za%K4E!S;9ua2O^}&$P8XcdX5ckr7O%2g-&O!BBLi09&(N)Wx@+ssNvL(V&Zvt`d|w zg-2w}PbmXF!LSmj$PPfwj$>7BHIiymNfy?aF>gI)R1N#3D(+kxiJ0p|$o(Dj!*84u zSMGdfDqpTY9zeED7=c7RvlKA&kd5N*Zp>)Pu+A>?Sy0$fOZZk(Z8Uy5zfn%EQn?&( z{8Vn&!;_@#Mdq!jCbi+!ZxyeCm$BEo(>3Y`##4A2(~-BO`!MfJ&~gw0<2L7d zsCkGcO?Bu{&A^M!$l*2J<6U8vE-VwG9kfqirEAOP41Ul1D`b$4NOOT1-?hdyb@tvZ zmgZQY&@(+AH29AY60T%I>L!u$0)JuT4s&wr(x;a)qF1(7*{NJpX1h~3HD9ZoCfc5) z3dQfDwwL3I8xrKaLO1(^U`WoJ!t4WY^}-z}3}YcCaF}NH?79^ArCGf#XsSxBux8fk zT6nLDq=8;Fzee_9uff+oSjKt-e)nZPfBeQKIzDytmT--ARmvyQonL^`?Jqe(D(!Dr z9J#^`fD%vHq(1!w)~jEnN{m62SFH5jnvr4xcM27EGa2DvFoPuBTw!W#Rs(s!Nl`KN zVP3&tN(PT2%nLNp0Wd$=49d-miNsP1l+T(vWl9K|Tf~ zpAKTHJTI+9Fg(QhHr=oR6T@SUb-dT3%uF52t*h$Vne3lf}QwUp>ZF#*b} zUQ>@)zjR(j1zdoo|H(&wdc_Y1ru4NX7b)uej)~5=`1ZF~va)MqHF5L)a|A|}U;&ck zx9-j}YesvJB9D##M81OH5|K+fv0ga=9g7N~B+k_*y8@_1eeNA;F@y6TV$YnRgQ79? z5}q?RZ8Dkd#qHvn#IF%aH#~$}E2W4`l5lH6t+PE%SZIRVup0vt{{AKb=af$g`dqBm z#n%a$`1EuBRU`)~+3VfbXANG#Geo>k!!n6W7ABQyNJ%GwZL@0@TNgOBRnP1NF8JmFX}y85bhh5YZ+AP+@e_EIR;e5eEwmFYNqobjSv zOc6s!a9!}4Y1TVMxDYPXfrOOjc`*Ki7vRfYKHXu$)au?iXG}<{4tC@OhNUXzweBP+*y*fD6E0uQ`J4kM~@%Jf}X?F7{aWmBw%v{bxbWZ^8Q+e;l0(nfFv+9lScPzSpYssM+P<`+XuNQr_ zQ_0~03t{!{?DKc73pYgEmlOR>#%q1rn_QrLo7RIe*y4Lz^k=Y$h=6Ud#CAZ4vQm)*K2U0l4rRv^V{Qa#(#jkn#ncxuN_t|rGqe;yLk6s%m8*O67hcgp39hjVnL~AE{H4rE zsVm+y72w{>fw*ANovaV2n|-=9@*K#&?puO{Gry(pW`G+I#eV78>_N)U^x9s%@!rYQ zbGfMXJHnE@*+uJ%xXeC<$>em5tDT2RA|C27joPC_Fa4VPrCfT2l2AvnL10e+yGwQ= zTj(=DT{)ZYSHT|%#pZcLU0nWFp;`NDLs^Q-(Q@LM%Uri2R79Ded)at_)$uc!IT1DP zX`BD`07{ukC{5cyLAU5lzgFf+C+e!uUksr=_o_mqSPAbB9raOnB>YB6a={i3n;DCY zE|a50xbTYo1nQVJ1*Yi)&m0ycG?fXs3#!Sf}Els7@DChpHnMYMC~~P$Ek$ zs}GLZ?>p<$@tzA0(YBWDPc>+wtRVwr0`TE?nN>-VO*xg33Oa=5O5>$ytWq>%5Cz+H zNsQQK$1%H-=hVpQo_H)tXiVUdiegN`saD0G<<`oM>ZKqGY4F+vU6ZP{lbW*Zoj~Y$ zd+-RxkCZ!hG(0@nkH!RlFBt`;lz3>t2cO0MV=QX|Y@Wqi9oyurYS|~NcfUiCR^YB7 z-)!HY`4kl93OFTNSA6;pU~z2{dy`p%X(u0jK6_gnv9+EDI;8g7`r7o#bwWrv|HPRFt}De250CQ@3?J_qdae5W={%y? z!k}6e7B8yfD>U;b5pM|^+g?2vF@k<;a;jk)D0cj*Z^#*pP_=vxC13!6XZAM9q?BTO zNkfyJ#gD9MTBJ&1T7vtreqo=^LWaeapJUq*)Uy=Lb~tQXpa}Z@mvzBApR-?zc_g7j zN`W;%jJEcvh$yw<&q}f-Tip*1;7kApSC`I55TIQng$sa3I8m*2O>n~m8SGy^ks*9m zoJgW6JuzaVbDh2q+Z3M*y;XT8sOb5E7Zox|-I?C^HBA%F*} zEhaGa-2lBO=T=o25uMl|f6eZTa(>?BkdvYTJsRa%X}&i-lQ^_)F!#R!#tRTAh zOpr7eh1Ji7>KTF_vW-B=<|xBh7S-SWZOeR3E_-u#hUzGEERwOv3NN7NHqM|;@3|2r zgC?E$jQEV=IyK*?i+1S`@nt)#QG7;v>9|EUCD_xU@%!xFDE+%Pz^}ueLm=>g4C5b) z@uR#%RPY%=xAjke!=R;2MT&*zz;>5n@WXij{!sQ9#GBjm z*UJ1+G%7ghh$2gp&+v!rID`Yek#b88$OxF>c-^B)9*kg~LQ0r^$#y{bx8h#uP9cz)oEArGIyvX@U}uLjB1C zp-v!t{0Qcq`Lv#uGG39A-xRx!SLzCj{~-9LD5wuQbz&qH2(F6-QCvO+H^*my;h`I? zG?>uJD7I9yobn+ZvQS!NO8N%u*a-rY{m!a0@FX5b%wCdYurrhx3p?T76Lly|s*v5F zBn=W3(Py9*NKdC8!Y6YQ!VLw_84UYBTL#%~NFl-mUy}|<3i^xv`v2}blAqCkmpXU& zt@Gj0*I}+d$TS{<|DD7{F)N?de`ldsolY%y8{@P8Q@i!~C0iC}XXp3=#%p1r1)FV5 zV7GA?$Wnc-1IB*_sDhs8x--#a8`V@U50`S1<+h8)NNRz6~C|b z?6M;_xJsTPF@4LnGM)jDHDG7qt0_CxQk!5x^7ogj(=6SNW>^9-;)@VhN)>4TN}Dfg|L zQ4&OqQ=qu~jL&rTo@tLW+LS#|OBKthz6nsODx8u}8gnpzn=bUNi9^vP!UqcBk+EVO+L=P>my@ z6-_Kw!j|Pfyd~nk)py+X>izLmTA4)r7Wr^0us}rsZmZXDOdjOSBZr7@ zP9W&;O|Pq#`igs=Bua{sVfGH3B#znz@J+Q}aRm#NewkfTo^hQ~>2Wh+nTJ4o-@u(h zJfBeB=eoFiIt-U6J_?8CHYKF4aAFAVFC>=n6YDk=XB|v1_GS0_xvVjg`e1p{1lb;9 z9oT!uk6B4Zc9p{yk`Y@YyLiKWBnYB#o3Ve02872}f9aC15Z~@J@_LBD#1FFvTmYrpb(3srZTVQ6lYrSZNV_!d9U?unK+7Ql~!; zmB(=FGhO_%<@{BmgK_4%5^wJQ5|>;5&cpuNh0I?#fo{V6##3FSBox0>jHf$_aU-aLRh}cQ!D@)9WOc35~Y8 zDQ5bX3tGgIpwfu-3URyOkI%qsKP*^2{-DW;$oR+-hx8L-SKHV*@@ia-5B6xRfx>_l zF-5Db(td^A6j%>CrAN3Pf8mXjZXZXB;s8OBTEopWrMZvy$nb@bVW~dd{iDmER3uM^ zp5xTvny~f61lzXt&IDW$3PPguWW$k{E_)MG~eCG-p)g=*2~zTQ4H z!mRlPG%)<#N^u>$)+rC>LQq2v4c zbJC3sA?5PL4>WPJx>7x#ym1yiO|Sh%m*#lJkV7)E?1^;E-WLiV|fR1s5; z8rc~gWOQQw5~dhKaGLu7_h|>cQWet>zSiy2_Utcrw`4O~(pyt7jFm7ewBoqF#_!35 zS>wX%WlIJ8zeHzY|Mxx8@nxTTOx;DDcH1v{_vd+-ChYJKs~!MBMd*qc<+zzHOMpZ? zc%W+_U(C33$GF2~a?15||GKo3us`I4Q(wQfL*G&LGxvqh*Ty`iBRpC!EWm;?ZJk|G z`aSECcqFU{(b3TH{92`xS$J%D>WuSW*MP~vLcQ}HH?ZojaUjqQB2(;TelfMbe$IqO z`@?Da2uKaDlI1g*rtr0!kwvwCet>&gA(kbAP)Dww-w5nOaZu8=E%v`T)*kZ6haA%N zec7JG%~9#ogsczP_=tbYd6Kf^J3yU%2kgHXl!Ha9LG+9P;4bf4m8`Q1)_u{pN>T-+ zL7JbU`DOkLH0yL5NMZ=ctU*vdID?~?1`0ZWg|-AzBIbfT$->vS&yluE7WGsvARXdh zPL!aX==cJd?0CQod}*m_tyZ&<6DZpod3t>QY< zz|IWqs5ipEIaJ>#j}k#0}m;Q`DY3!YE_JN5_(lG}x?_4h9W z*L$|h;C6i0ttt^yhZIl8;n^%UDj-`v+7)hnIeT1Bd!%QDB)l zSS6JxKuj>MbYHRQ=Fcr-PfpLhGDP`j1vv5E8kEOFRg`_sEP28WkzanJ+p!w2do!MU zV5>rssS-L9;U9GJ*pQ-b0ihcFw{yXF9N>c1Hz>2yNX-HPhS1l@qTUa8(eOXn{futV znbJxBJ;3*t&7r5;sRJ7|=pE<6+db{(E7R>9EzROqL7qJ|O!BaN0m=St?1v80Bc~;@ z=EbBZDN+vFb^gq4BECsBv5YxnYb|G0?4F6jM>{atXjP&45YaE~#(oG1Etz2mgGBKt zSQBHQ5*6{lzM#3{u3~RaUw|Zm=nL{0I&W_x9m*YW!s5yaWW1p$(jFR25lAo}`|4K8 zN#0}yjL~IdmcOci`Iib+V&pe;UC#FwcEvTldU#GiRHzzemIbk&+@RkXC#L-_?T$7?WVLUHI&+>S9qRGom&8izm-eTV(2Bnxt@B60EPduN&c zu0=y&W;(B(AF0eo%Z;@o{W;UbU8Xzm>D?Hvp$7*n;8VLH6W^wH(tTv+5ssJRisUV~ zn(#2W$rIvg8iP4@WPeUzBS8rW1wU7-Nrd11?FATp6VS}SHIWI*T#4j7=Jh<3cKps$ zvK8R-#9XH-Qi2T<3r2rVN2F`+_<&Rf=I}Pu3hzKKJd+&Z9euW8o-)0uY*fVfZ6PQ5 zx@u^zwAi`DO6XOSK}#!`&EJJw%^~Rxj@aB3wjOSEV>eZ>$D4(0C8zfTDk`-e;{H8n z{;1P_)&w#(XmYeLpnzxyB01-R$DJII8sO^!&@=JB+v6^G8p26W$pe?`-MQ|Iu(8hm znplB~EfY2$hcNX%noBs?#KvwUWwRfril0vg?LU{zX|=)d`VGKZ4&~4?#M?R)5IS@d zI)?dN?<8auR8Glz@Bdi10CoC?_ExAk{oLn=&rXj7X1o<{$%0N%3xxSw|AoO4PxO85B1>yKrzVQuF;PP5d7t0fPOU5gs_dL(lZj z&H$Fd>GVWi<-hh9CbSt|Xiqxx6C821N7Jou{>m3nt%gEGCvp>d{&z%YiV_Cs`Ty=a zhByMwzdU|}>?pru_!HYbAR!RK5MI9MPr-`;iv1d8{>>;R z*Pze~BaHlWLXjH554ik4ZB_q#O9!SWFB?nwdxyeTfWrrT_wN6r3;B`aK^+_qZ8E#7 zRcqgFKo77wE%f|XCYFzqIfnqQH$#XByMdx9cXJHNGel*g!{TV(%Qb=~S5?1iiozJpg3yce@)sc1vSEzBIvEu@`?h}BI zM4UEEU}AJ1+63}SG8BM(5We7J27f&!oL&n1R5Fj}+{U$BNZ5rg9R&#dPfvnL!n5p_ z_r`Zc_M0Wy22{&Ub^n2zZV2B|}%6By) zj(SV*OxVO5Ay5%%a$sD9f<4RW?yDABGJGCnRW_^_n9y;kbPd6muQ1O5?=hoAfQ#TY z0xmxadHcX82gk4PER~0IL~DigQm6s!;Xy3E-q1>g z2rKM2GD6GkJdlt3{j0D+NP>-@)=Vk1s}8g=mHU9 zx%4q_#%p3_!g{5rY%iN5uafYUcy3zNEd5LsvcC!K0b$NukkH6fo08?4-~|w;)%@tP z@Yf`D(oo6LnBi-&n!?3&$k|{963*z5D+QGvfMXSG`jbYSNuxK#4h4~e7-+zu`bmT} zJi_0378YrUt#SZU>@^IOZHrlU-kH;$Wd9lq(brJJ<&He?+LPif;f42UY&JsAV^Ao_ zuPnfWDg-1aF%zId01*c?MOQ>gs*u;`@pFAi1h+@xY<&v|F|rb{IP+`fWl<<;=@-yH zO`*=f&?OBI-U$75?8!g$g$QKNlFSeEgW$59V9gJsHlKmie`h0NIv2dhwa9MP+NgUX0(bJX@cA96fgU& zOMeT6|G9YLA7&BV$(3{t373HgqcHfX*aV?k(CWX*;m{Khq20}|kblN#xntS}&CA+h zDj-b3FsNl|^)cpJFeyDZ5F&9fk;*{X&3t`pfY)&BwC7Cw8MmZc&!LqhJ-;XZ;&Y4y z{`IE=|IunOR^po_=96!YDv6OMXCyI5_)|<4NPizNLEe?oH2po^ZoKvu68V2SwrpzQ zEi>!D?Mb3l5_zSFC*ydG$Gny7)2`f8gLY0fggAtk0NnKbwJz@ojYV-gP)3Jr+&w`0 z9FXR7f&$hw?;DUTSdk7kL(n2`xzRL*qV*8&6sV+jP+b|ezqv$;?JpP0i5$L;&{gd7 z2MwO>tO=f}3nVszKy>?8s{xi!X8cT0^L~q!&6HwyvBMW{Rcc|hpnvq$aL7whdx-Pz zEaBPErjsQK@9UaAhFHQuYd#Ac2-(oMM>bHam!m6~4rZ_cOv>>pp3cA6iBr#cD8esizq>b{ESll$AN7h$ypgYhOk12F#g-awz=qTyd!C``BV|Ps3oH&rO(q&enJ(`yE}W4500e*pjU3Qc9K@JjV(7nBDc}|pjk6tt-QU)!-R;8$5Mg!XpndCrtrSN}ca^ zNKnE3g=*=8C;Q&8c2BnRf}fr008J!R9I>+$_LSZR&f5mh1%Jg7-ck~sEaK7*8*=(g zcp{@mKquaD={NA+n;XzuYtS3mi8ipLi)kzZE`cz34C!%1b|)yc*(>KF7}R!vlx~ zNkK$(k#v-Mc3YZUGedy^kbX40I_DO&ZZJGJ*h(N16b_zPMtW?CXP9w9Fjy+h9ad-+ zEO#6~i_)$`oRLp*z+7NMX$P-n;=rLUQUkb&$ zi6v*0g)n|}W2~VXsDTSO^uhJsL2k12rj^*h4i{xo9>V;Pl2 z3109!za-Sq6e#JaQrF6ttekBsGzdV`67Y?Z3I>OkE(z?U?CM0_Qq?Auxd2i=BWYOa zwr6d=jLKIq8h=?952Z#qpQJLeA9!t@>M6&eo1bSz%IHCxda3!Ispm;Oh}vLmy~=O% zg{?f-?7hGju5TRZK-#b@jHJa`NU*0>G2Jugf1U2_BJiEz)21&@fu`x)V0KD;4;D z^p>2<5`dfh)5kCIlRfp9Uo(@2yk9!|V&zj};2RZiApN5xo0uuo2~e#aj4=p7>Q2oG zPQoY@lwV}H+K;njEgF;+foq&k(|r`${w@X?M^qr{*WTMo@VlxYZZLKb$jEd)BLU@c$D>noQ&uk7Vw4s90q%+(^ zqp{nqvy{Gbwn?nw#S3GKYn_(zZIk%c6OF$m0?MA=?c|?}`Ezl|Rg_~(=~n=Ihhx5& zoZuP<9+Y%!AciF|24QsjA1fWI<)yO+x-7IlO8jAC+(|IWV-QN*9RXj<{KgDl;;fIKt>NOqS zGjt`~DxPDF|7kf0TMwsPK>)p=fvD7{+;?kmOWmok+25);&tEr7Aa0N}8?3`b5+`H) z9MwiAM6`n*H3hFHYuj;xjb9vxQ^!#z|_4I0|0bD}h+FH7Kk=ge6 zW?|vWL%Ls}C>X(;G2e+59eg%3xp`(d!p8vb3Gslus!ID@#%Rx=6Ik^XRydps8n^1^ zeSWi9?x`3y*F{tH37w+JK3TUKU|CHMhxWa^X87y-2jVQ?G!O@4zSA#{0bQLFBp`|K zM8#zi$qpw45Az3yw(<5~hR@8wwg*`UE)e-L$%o=)kvdI%+dXUUY}Hu+`M%b2*b4TD zYwi-Ud3yDsSBDnt7NXvxfwe0%SWJzjdg)tmqwde5UG`W$)%vf-1ust*3SQDpmH?fFY!pO|ABVyN%j%oJ}zeScC65P8OOFVZKp&JO%9On?F4Tm@X zm6qY3O$*~0TWL)=mN8f>Ugy0I>JX{@EZemkJ8Z|%rh9RPzA#))8iIIhxo*a?Rte>w zsMkYteiUfFZ-2B8oSYH7O6KMXLhk|w46cmM(-YhOu(EVGT_^Ue@Sp8ElYHXw$-$2U zPR-fzvPj*s0o6Z7+0!Wi8rC=P!4EgLLr)-6C+|@C2;~)`m+Tc;WW(8$W8a>fndn&} zI)Gh~-tbkm!y8p?<%H|uUeyVUU|{WOCly^rZ8_l#=!Rp#QeJyZIYsqSy|87wWOhEveI8W;W>VvZDC~zN-_K*Y-CdH37JJj&sa}s~ zG#h=~0z^^Aw#(prJOO7etyVzUH8BIQu%2K^$(xzUZ*o>X(PQAwXXGP0`c4RC&S=m- zC>)sliY|dnJGlJs=|5J_o|C-ciiGj`U8dEhN*&v?cdA$o;s_`p+r&*SaTYySp211< zqtm8Px_={LnBmedtUc(Uto^vQS2S*cv+P|w!8PE_7f@U#ur#|6Tr4~~XBV*iS~#*C zqF1Z8YKzM#L$eEJ-vH#2p_{zgGwA*0ia@D`a-kRDb~S1oNvq{BgT^Isk2KNZbLsG-11dZj^xd_db)r$_|3(ZlHzTE!HsUzwcZw!26ExZh9qT?jCxsSRijP!h=sjf5>0FyzR_}O_=?u-1=^R%z-|zB7<2Ij2{`t$hO9m^F$ED=-%jE-$+62ISly*D^&*!*i%(C? z)-FcL?s#=?Px16zmu9_}Ymkp-gMF9b0Y1`WN?q$#O{vq zT~GL#G>IH39B55E%Uz_X+1n+!@%iLY$c0ps^USgj{2#`V5 zksRMr68o`>nX)Hvo;Hnr);KwVeXB~n31HSIz&{Pv8qm3dP$9xQ`BVEmfdK#sot=hVV9w71n>8xz`Cr7gg|HbiO^ zEyxMW0>1@|(ru!F+S#5H$~bE}Frp>FVT}$;G-^Z3zPDMj<4?8AZA5GrPKPPW$ZCg0 zTo}xAPO`m5_ciN9_NvK;A@zq{PTFgy5Dy@Sa{sTV1wH(7)?rOVd}gNdLE%L!EsH5G zh~uupnx%q?;l<7_o=fv=JC(})M2Z;i?kQQA;JnJUY}dNWbD7~ek&bqY)(9>fSO=3q zn+VJcXLVP!8$bE|Aj1l!>o>Nz0gL>x=kRHcVis*RVU%oHMNOiKe15MP*xr^B7Z$p@ za-1toO)XV}LmjQada5C+iB4G{*?E*Sha1a&1Hj;zihF@>LeuCE{x$pDqgOwe5S9;w zX&`-V1{lXodQ}@}^7;ovm~uE93Q--Wn|y5T-E7x-|2EQ(O=25|60bQ8cpXPR1Z4TwGAP$W{J4ecD(duP> z91%gqXFx1my{Ssm z<88_61n_hVMo^tnNTof!5EQ=9S6PI+OOH#U(jMc85YIHw(g4K$9=Ak zt}cA|5^~kOcS;7#I2aTw89y>6e2&m84lu9F_md)2-r6NvnX&vqY9Bqntx8(CDvpCE zLr9Y_@7cwZy@^f9J=NZa_&QfdCkc({`BPoS%XGIIYxLfCZK#?sq057xwDjWBAD$^$ zC{I+KOY_$kHtXcMcT=@|H}qo0gwq5j%tgFGn%yo6t%KA8zYo?Lts%nZE5m{lhltWD z>r=p(L++)!O5OC@EQ^Bl%}kO77SohR3fKqE2{t%>1udBqi>HlaZb1|e>Nt=sM%#W8%qGW5*EDL~rg^TyYhz*I&g3QLVTZ*&?nrUC zrmXfQp0n-`D+Le%H-mvPdg&{#ZL@j6>X$h_y@66>e|w+L8Hbk&qRZz+93k#>w2YD& zZm}zF_(m**0%#vgg?*cMV&}oXg-VDD9Sd8;-&{&8}~13Mg&D+lamIKjO!yn3sg(Db~S`2Hzjb zhh{b7|3uDoJF5X<$EO0wRHQo_VJoKsi))k8Q)HQkt^-MEPmLuc{pkOZm|2kh`Gol9 z%h9O4s?l3_L;<6EZn)@3yE*|NPkei8jGmGhN%g;?oh}LTd<>q&8u$}gc|s^MJvkPI zu)hgF=WT@AeAu(QeFrLg2|1F-^jPz4gw$j37_Y_e=$nfl9R45!>@gat2y>qznr?1v z%_U2Tk#-vN!QEg6!mN5FX~KVb8WXJcdU=LtI-Sc*;>)3azjI3NGjPYd+M$r8+*gPr z<06q2Hk^(elk{T{uP^dGy*4_iQ*jy!m|d41EbOu?4P;C&L|wb%vKtJUi4vy2{n>6| z;lAdaoWfnO(lReQ4;_xVw)bwY;j=4k3vC!LlUfJ$U-$iH+chJFFg4{8MZUr1UQP78 zfbnCHk)^4D87qri{vz@N>6;XGfqvATeV+b7p8vQ2<0vd0fhZG^VfwLw+Bp)arvUG! zVm

#p8!y=e%VSEz5A1!{}AOuQ0US)*&9cEQaDFTK4dXv*Ss2JHEZmqF*js$nh!g z7(PsTXuHQ67S_@q_Z*)uCN6R;d{j;IJ4VvHGM16B>XM=jEF?5eHM4mdr{asBpRXTD z-^GxJxM7R1ouXq#q|^xLGIbCUq(55SXt?xM33H$-@wfl^{X<6I_pCysXP#LpuhxhR zo^%;aF?uNv;)&ky(2Ff<{K}6w{cymn$bDnuNKiS@#<&?6elVBqC{bbw(29dI_9F@R zU|=cxcNhVVYnu2gxNRKb52_ym(j7}$7px`TQ^QsHCkM9oxDa?B7J<#xOKcVI+W9hU ze8-_dm?jN-7W^L4IjFt;pNggR^8T%+@utFqo(7y{VaOFsuU<>q{|-IOTka!)rPCoI zkt^(-YD4E3coMQ|@J;GGd{0n*! zxwy=q?<3)U7VsR^;NT)nPdpFb`Wx2=(GRHE83by29O-%2^d?LAeEi;;ncvg=M=d!{ zQ(5koaBcsL5*Z9)d1= z(}}O&GCvN~-p!C4*%;RdGE-*0RmlKfW!zfl%Uq|4>6hEauJY)E+hV^aE;e2EV2xJi zJ{{5w3ps2rj>EQ8i$>dp!De@!{aNJxI{Z@OrL8uoO&``;SD2tcH+@vtZA#ZMWV6vq=&r;om~9#2cM?*N|YfX zDc%r#TYK`?;9&FJ8_QG7Mwy<^0bNwCaWH)7Kdw#@*kEch!2kAnD2~KGvQ=R}sTIDu z8uE?3d*5_1`i;P37kXVu$zN>W^bmIKfTkXP#u(fgYjfsn&%)d@7AueEIz9QYigh^f z^f{PvOBDAo#Jyjixs*|dfp+EhYQh}Nq;BQ5ue~nvHVvo5M-!0CmHn{=F7z(6_9qk% z`|AW#-FWN&_$(au@|r+XR|oMgh!>omy%MMBsa_9KU_{730g!3FWtoprh>XqV0Wjb z+_-do-4VSP;rg9C^1CYL9#N9YjB*%&H$b48wNjVLxzAdRz7IIW_%CbWp$$m^p*USt zKh*t}YiR0@u$aF#zkao%LWmIO@vfFZQPknl?14^%J_3Ei;*MWhrhCgbq&qH&PNs83EiZkbbD&k2@2Mq`!nf$? zJPl=p{Y%9enL`+)m<)Jy{JAJ%Wn8~~iVEINZ74IU>pwhr*tBkI-QD#cc3GvEJhj^3 zUC?J~oZaU15h7N|?|NOD<6ZrNqPVyFss2mC0y%rZQ}2*7b4~Bm5lYcqRr&4j{gbpo z+czkRo#V!zZ(?o%gy|IH=q`4;{Y||{W+0+jRcd& z)BjldMpEhEUV`3sXzDW<*wqrB2z7N^NHRoz{~EkPat0(sB&Sz^m%}@3y2hN{yNMXY zKx0oSMV>{Qw*bUAM|UDuC1xhn+7rHoNT1Tgf0CjP4X|{nZb5~;Av`jc28i;K*lCx+ zv0NDb=Ga(@#x8D)&p6bO+N>nDA%?_v2E_xBUU>BJrOs4eS+n1SU*%Xb=_$`qcfj}n zE8S6|Nk#T08FFB?AcHKOUH{sqX(QRAgwT(Xl8A23VyaoWt zqeTKIZ!VwdV^11FfP)K<^gBTLUDn{{T-ER?!dbuGZUfkV zkvQW>=vf;+k*wiW71WZJIkq1%bP?a2Av|b{1;KU89V7mnM+s*pYm|?F4wH9&yE4fp z&))VZKoctVwq53~CvU3(PIE3@>I@0+n@3PlO2%8oNxp7hR8%1G;03X#XqrH-d1J*# z?_ax;pd1dens!t7>Z?z)ko@#=UHiSvq?jAqFAVO_JvnBa&~kiKC7QSI?hOmKSN9L5 z{h4OuYfPaw1*PSI8ZQ0p4tUa=kzW=jF9GHo|0zWieCV&d!9Rd%F^}x2ty@Nfl54%) zK;KgF98FcNOy!!fcW`K8SbV1p3T+X@<0vG;8PY{)CdkTLAN_pnMb-A^^2?0d_>PuI zU1W>R)|t-iJ7SU%@g~_&l%%p2XZ-pO+)la7y*eQ-o%zb;TQ~kZP3I(N+E*Ce-bSDK zNLvb75G-2!`v!dd=cM<2ZC|`7`59bVaID0^cu7a${C%Z9>1N*6}@Z^bc^$>cIFmHJ}_FfpH0dc+h*```U|`HCJ$eu;mC(9Wn~(-F@dP9la#bewn5O|XFu6qM>@Ky>DS7_F5)u;qCsInqBDpB;5y_OEYH3mVX-0Sr zdZ~-w-fFjlme0t>c+sbq=R|I|@_MtiDd_0y2ajfcv5ej+IMa?1-HMFXj@15r%r#&_bpC;s2G- zhB&ELl*ligFQ2$DLxXY zcuzaMCQUV1k<#?%*2&$g<5ON8fjQFr-E-idE^FYhoHx@io}e61R(TelD)R4^e6?}g z#|*U1{xk0X!kyUJJ*9LjX#R59NN^Kj)mr;E*85W8Oc4`*w1o)F2Sw#T8dk~w`xnF} zHiTVkU}+hBsP$gW<|k;MW_%kS9=2Eixv88RFm$dsmjBT83!(Umk{A2QZq2SnWqcdN z1HxlUzAUg3y>ek*-1R2<-jz_%2p2NWdHiEfdmtMojE7^W3L<6hfkH~?rhx3Vp?;G^ zw~wQYnha=^xJ8IB_(C2V^tVbx@1jgsz)@VM!j2U(kHD5_bf~*zC~VIFguK$qEgsS^ zG7XI|PKbE25Jn|h-%i0CjTmI9jZ}-0=yDar&9G%E=IG~0z`N%PibffJbV9C>cm#w) zbru{@GAykDf{a8*DlO8z5qw$EQ-sf|qe#nVjDUTTH2@*I7BKv6FmlsPh-?uLH?!BZ z%u;Y*Zex^*|0vxU-~iFX7sh9?IzN;v~?`7_Jc z5T*B7vTh>vD}#t#dYHt+@Mybxq>oGVD>c{Gc)c&ULhVXy)F)tnGoX}5CM>%Bn*xXZ%S=;q5C z8+H`I=iRZpxV~ifi4*rmw&tfxv1FkR_7qovUmDL!8?&rZlz8z3amZ?LMyrrCNcp$G zzB;9|TQ^)%EV2Mw|MqI1%O-T$VjX%(jI8uY(t!HuM9I9C8)!^T*5F)UnR+U*9<9iC zAh+3-_n|GCkLDLYl!&8!O`9D{P6%4}lDS6&hXTSK15%#>Np*0lFo<1l#@S&Wi?5$& z;j1o#;sMHgC&il|I-UonskHmPPDZLl@JsI`wJ&_z{GV}ISM3R94{De@kGVuN9;g%> zaBoC55>v>FhHhx(r=yK?PlQSO zHLk$3cE9@WPA*qYKky@-1G8DBA9t@k;(Yqcbg>0~EiE=Gn3SeqfWjg-m?ovKztcck zjN>&WH=Ska+I>K{ZmHys;GFp`i4$hputQshr^{JbwtS=27HnO0LT{EOw+E zP-SQ>=lc~s{^?lJn?H+VO;;R?dMc4X~uHZS6alTo6a#>JCv{y4{Mh)u(!I3GgOTEkS?>DsTIB;n} z)_Vo#4^eX*nJGLaF9>h<&(C{J9IH#W%QL!FLvQ^eL1R{lktosTy6A%_QFL^5C#Gf5 zUZR{2js&UIv#0KFc`^Oqoy*xDbbrrv_g&(ULW+prZat9kwM6H5;oprV-ix5bCxlwg~>ze4X) zs-(+p)r+s>SVZO-IX>=ANC_rg6YmMX9G-`hKL=z9@s`M0P7q!$XcUGZlRPw6{8-xt^0G?LsobyzoIsguZ^Jj75n?Ocx%Vi^b z6c6KQCL=+l(eYQC>`fvzj=VytYSlX4Q(x1Vx;5q&-!E4pQYrKPsgMz3E}TSV+ag)w zMAQYIKl{JNurJ&QaI!G_od;dO!LIUiPE0wVxu4NZfW952g~TGZWs&f)BXhC-=ei<* zzVa1m%eCW*qu=AukzL>dPQWoRjL7^*g+O8!w!_r+Pa}Xq2s`sqi#7Ecwe+Sw^^(+TtNdrv zKii1uQBFRgpX3~0ZvwTP45kxoxdpUKj6^9gjG6Va=;)1D?Yj>GV4TbB(0aFQfS-v0 z&OS18WCXy@bExzh87v9G4M+L0D#4EdX{6a-yGWbG?K)4TC1u?(Sj-zjk3X0lT>qD{#j<5%lo3DcpsIK7gfHg_xF9If?6(ggMnofwW@HW}_-mn#lqW-i7N@Aoui|@=cvq%wlWC5>`yZQM zj?0w7FKbHknWS?R!|z1zzaXugSwtKZkJZoM;fuxwey{8|$fY+!4PQ7b7RI&b$%19y zX!d_c(jryHTx3O*J183RI+Mij(@(i*oQL$)ErY!dd-*C19<^snB5Vs{xjL~1vQ`k03UusA{>r^ z9Zi`jn>QK=sIO(;@&*TfNnd(wEMK0&wG|hQLl`X9@;~79EeUKoK~3iCm$WO=@4sSl z?xLRWv~wK4jX{M^cnTk>?m5w22>oPqg z+zhOA`#XSsZNH%Wx=NZ7Y1Fleu2r%kCdT15dBb87puBv?*H@g;0K_r8{o{8z!5q>b zocnon9j7%%+e19UiZ?cbut_#Hfrm(f&Q+hUc!LX9_P2N_K1()y?v{gU;v9TYf2#%G z^CWxHacFSgL{Z%LPwTJ*aUr@|FL^lH!1cwyrsEzXTrZb^=~7cej*`s3pQK5*M~D1+ zDRZR-%xk!AQ`i4X<29A>E_=0QOWf`MD+n}D5PU!4@D|;wKLMs#0+)J-&QN~-4gZU~ z|8BDd9}#6NEd8JH@iYl;&%(F;)ji`(y^j0HXB4aWvoQGoqXdMTUk~M-=W7o;ZhSaI z0)M5t_(#9E4X#JZ=;`ZAianNXIQ;(678KYr7i~^$RTP%J*pJFjY<*XV3^vBCYi*n{ zx(V9Fch#dg9QlGcS9S`XdM_d(#w-yuJb&q89R_rSiUvD0;nc$-;mYCsYxF>VTZL`S zCR6Xi2x+G%DuV{J@E%%)kBQLkU>I7SM=yGI%Gh`M+%A#Zj2-;XKzs)mz|ufBc(3vX z(ELRhk2|agy9f5a2^c(Gm3?_8Vv&343iU6AMba5jS`v(??!5+dC)iHyy=yk-5;V8o zl3WPx<<>V%<}dGp7y{_UmmBA{*4*;P8DM3(cbrw7-%`pb9wqgam}CAcVOL<;Ob+q( z&3P4)H^W_`hab~l+-X%U(_-q}>o(DFe@TQ(-`1x49v|D6(t`NRhE=y0oa zY)OB28F`ejeWR`}jF>N_4T}A7tIWz_^LHvty9T$qPe5(HOcthP#;vaGpw8c^FXaXH z-qnLc|J!V^m1OVvmP!5h@l@n|AW{6kyP!v}TwC)U&#PeyrFoH;2jPa2nh`xwIWYdB zklJ|MJkXRLgXGQ7%d4>9BOqS4GYDHbCu)uosWLJv<6|LrjIMCIgVbiFq1)c%bL#!k zV31sN5tv11r@m+qJ<{rw;y(Hn_3)`_l0!3vTguQs=lAa-;;|z01sJnd4|pkcZ??K6 zjQvuvFJ};czFSCt5(-5~2|b8WHH1FPa*laFt9!b_Ma{70OJKN@MRYi&p;b!OO1DJH z6ZNmSgoGYTnOP9`;cUoGs?p(eL_<0sGkOT(1I<)HlP%m=hz1kB2AM@P=Df?8*>}*9 zU;<=XYWnpoTpFdGO^uxQG>nCkloZzuH?@OvvxIm}m1zq{vvxicT5beS>9K#%}ZBI^SO|~JwB#zOx9tg5E z#>HzzO%Tj5(dT!&`OS^=j#2}d^-Ct1Fda5{zmv4#h|=eV$LFiQMrcnHscIC$_aY+) zeagprFa2lzk(>E1>UKcEZJl(P@9|Ekx2HhJCGgzXi0fFN6>)LsZ+j@0pQz*RvWHss zh!2F!$qQG}jlXoRW!QTRiI3-`%w)zy4x}Nq2hjeDBelNmv}$7@ugy641jCZ49pRS& ztIrK7Zw>IHlwPFKvq(xxnzJp($lNhI#wt&MC2WVO?pf^k@OS%EoH&7Q3M+wOv7NXHWVD zDql?Sa!-SoW&7cLft@MJ*Z1}&y5l1eK2zH9rAwH9{KQ4PevOQ52Lp?sYU2-T>C>BK zNN$oLz;c>gc%sx1o-fW#Zm_Xkmb? zo_2>#{=R?Fg^N4qv}7gEFB};MS(09q1uJfm#29&wGX#nmPjS{U+aI+&w2}wffUInW zV-Tf%L&u4s4y|WFy23ufVK!as89g{RP85}fSfYty^}Dn#8>r3*D2a>2&%mnO0}9#3 zQ@@~eA$C(*KVrE%*7MU&Ki|!8|AOiu*oedvs_(QKY7GA=;`HE2yc|@oj;l+y2yHm9 z;xoSLC?%tgb$fX`6q!YP0Y=^1^!Z%b6$Ta|zMbP-v(3+DZolfh4%Wb`lJFyJL-Jal zUZ7Q*Q@t4y$e8UK1C*uHW$l0y&_*?c9QXvr53Da_?&m6T+_n8PWR`I!PbO%1% zBpJp~0P zP?5Ko9x7dZ)92>w8K@qdD(S{571zbJdO!OzZMe^8RKKF4In0t_1>b0%9O^`NZG%cY z&|G3*Yh0FT2Rde1M6%-_uro^g0ptGkAINq+YIb2NK*2`{>gvYOVo!G_0`e~cY{Z2m z``5STy5rvHA@#K)C+>Z`ui5Xzp@9b3OFe(vH4jAi;5E^wfg<^CG*rz;V!q>kEWg5u z>@d!6e$t@bTJ-q%m-G{#i=6e_$yBsUZJ3Yn3180*1#sMwvwd)g-*863XwghsEOl#_ z5&e3fCyXK0nz@hVcqoW>7JvVFcgOPdlhDj1!PQF-oL`n{?~^ECMFC3bA$JW&W5Sbj zX!`q`i=e7(DJ-!G)@A#72_ML(tk%4dpx zZ`gRrHFDXsBx9e>UhA!4%AGDt-muxEJ8dmyVmG428t$YH>|t}?QF;A0A=vj`QejKl z{@HhrGsUP=K2mcNSG{aBT4Fh&6+CP7gdnf&yuDB_frDxl6xmV~u|?u|Do9DH6>dhe zy=I^qyM=6#q8QyLZZS{4I;6i^cEhtzdhM|X5bv!W*n8pA)1R}7)a@a>ZhR``sX}y9 zA5hw+w^~H#P5ZF@zL1;FDjKJ1Cni{OD%z~dA&7?AqvJe=2u!tEH+(%Y9*05p0u`kO zi)W~Gft(UXA}hj#G;BMLM@Rd{G}|Z#a&9+j`s%B?=YdFL@eH3#+K}m$f^Q=(UBTWP zsNKx_ZTdg#)%Rtu#71j04wqin?)x;MW4*tM>w8yKGC@=*-E{h_e=z3)#$+*~3Qg@g zA%yxYX%43CCbZH@wV$U;tpyok)wOan2FvOe(w<-Qf>ut2!Db?u=Gn4wLHkX0yNlHi z#qJAakC>QI5E4zu-Y@pixs_TvdPSv}qj*&EXI=pJ$zy>q3ToTDlI0dq&G$de&*?yr zGt9TaU4G0(TTaUd^U8Ls4j+qyPoLKApo`&YpOY76>gl$x`z?R)s?CAq-x)=Vd*3`< zeeu1}0{LUl-L~?XxN-${-h=sj$r%wpx{uXVRr>aGcC_lt8HToaB4jO)sA>yUp%m26 zsU%JI@>;b@ za?Wi3Tzq=KN6}6g_9SNU#dX!YefIL4HFz6H(t_ZoLD!1*{eh?n#y2{;!k4O309oLtUKF zl;C>itVJf9^oL(JMg0f+RI(z@sFYMIlnqci6ntMF4ZBcW@^M|qSuVDT*gIzzDEi+} zZAuDLjmSBgp3^pb?&<9g<&XCcTHJT7WV>puurVu1sb$!FK(07f4uIA(DckdAblKE6 zYKl5Icmz4#e$(&f&URlp$Nq!<*BO8NP?-77R9;tLQ822R_^x!J$<_T$Ks&=_8%eR= zrK%zxv6m@a8)=I8WAjU$#7B1-xs@F7_gQ}D@C(|cbOz5rVU^!Sk9T_S#P~?J-S#>Z z)$xx)E#DT=UT;%)Z=z}Xrt>$ux@HlrXt+(9GO$+YC$5l2q< z-ea67ms2VhVw^FgHdxr_6ql7U`gi_ zzYPb81~6w~MZVR_^OYYrw=mHhX)U3j}izPk*X~ww&N_5|rl+mNp5iE!nnf(RiM{({(?J z7vm%Qa>kg_SDiz9O52tMW#nBID54JSFm~;zj8r^%-FtTWmp4B}t!nAApv!r5djWa% zoo9R_@aXZ7(t_aU<%Qu|aunrwL|)5*(`668`o1gbG z-7u3$w|LrjowKsPLoJ(ZbVr-t76v0LyW^XF==s+){aRqD8}8qEc7J`MmeU%O%<3}l z^X)sz0#-?%=A@T-!`j?w7yh6s^-0qyPL?HyHZfjk$>fq1d|fG5IOJcz=CClc)AX}* zi`dw2rqx`0@BIBT!$&py2Z6@*m~cv|i!^ha>lYsCc(VNZl277Gf3aH2^qr=A^_@j5 z@z3p-oS=L(*%M+{LBD)C^(56kaGm_rKJLpU3y;|~X}(ARd}#LUbnxqyd}L->Rx;^P z_m#EhK2q^XbjbWztmiv^tBhw;qT>_4ksqpzzBJZLzY49dNL_I9d!;tpb$$C$%q$Ze zs)z`elkW=UbsPFoc0|Sght?E>(z5cSf^q^3Sb_WMMG5X^(?ezK{sW85*xx&km)A=3 zSt8Dly(~S>dEb#qv$to$FR@qfL!PvFEB~83YIJTE)0sO=ZCZ8$OWLn`hHieosqa_J z&m{kw*}t6=O-FY;*|@PUWaey|J+=60;1~Kcc6?O~j2?$uZfo=?U(w__nX~EOm>o5F zW1jS`mzL5Ihb-uyINr?5%X3=0-^eJ;QB_Yh%J;*-{)cM&&6(x0a_M;A#CvWxcaCUk zXcJD@Nqb)$Mk>`PsOx}?f) zg z00;hWT~M;|D#sz`Miw!QH~`0l-iM{rP*_#9)w<%H(4h+cqow`dBRCgP&+%SRU@0@W z#j@|eA?q;ME>0^5Ik0cuThXAH4XeK)tGtmer^C(e7%(Uoc%vpJx%aOJ9#)?zSuP1KySf2M+x#s|7q3>>oQ;{ z!=_xn5yUNv?+ltIh2yFwsqV(~m3-$3qQKHxUHvRohG)FkA!OBKq zWeMfWb+5BJA>Ee0YhoBWpF92iD9vNzHyCJh~NyFilk zk-H6vVj7%{zj&b^PPDao>*G^=pRsR@iReb56GJ32qz8&JD+-*j=Kvm_>YRZlMP@ZB zAYu;i7$&`vXVCLChpVz*p6@Y;62G5gCYJvn8gln&lkr;DK9>$M^?l85_nF;gd`eKw zy$B8H~V|x4-*e4kxoS4J|xx(%OS#a ztEu<`dX1WgcS;|bm4FV&IeR!i?DJa=sqIK|JLoHlC@gC>`p}XtM#eaZOR{XllL4>V z1X@v}o9xws?{Isxb_q}r^62IyO)Ww}`|3Ah<|CNdx+Udxg7te?I6AuU~cGUdl@ z{&cTym~~u!jjl5)8No`3Cc{pDe_X|#+Kn~i0YVlml!FHTnk^x(2J=; zRpSi%lxp6Ef6~e{B#qRSR?8U3L(wabw(0!R-T# zHTr56Xd5o2J{pHOK>#@LmSO9GUe2Lke!LG+s|t`R5QL6zH46ptKqh62TgoxqjEGwP z<&z{i%pXN+g6`Oj<;(Z}eG>Ckjx<`nLc5Y6e@>xnZ%k2FUILS{_1dc?j;WqRIb)oJ zio8ygPHqCm3ReiJkZ6pvzkOX3M<&)e$qa(k;8e?Kv1uHhOV{o}JBXTA6q5!yjLPXDP6yn3>>L9CbEg=cnZeS zCh^GL`=S4wVpGL+8MJ*C1>>h(+Z^{tWf6qNkm2zAOWwiAMMc@fZ%eN1GdChL{3sA z!eHRV2lM*Y;Dotx{7^v0Qelf=yOI0f_g$@KF5{pLn~L#!WS1X9li(BiMXvZ4qaH7d z@+b~CRXq4Rc;u27neJxWu76kU!x7h2xLebQG3xA=yE9I%1TOh1TRrPhN!`nbEW4KQ znW_e+FKKwAveV-4E{N6y;YWP+Y7;<+0+sEcA?<~w73rUtW(}Bp;hg%VB{ecw@NIR8 z6yI`pGK0m(^-!g`=Z~@}xM~lF%wmVe3@_3j0ZLPgVlF!17jfnMO7#zXeaS9gzSe(K z$}||{q&{uOmX2;5pEsQO?$?XNdd07nHC#>rDFGJp zQ^!v*=&F0=rCVn?A+EHyz$R-L4O;;af8>d@rTjobG=h?B@F3(%{Me3)wjMpayy&BQ z_DE8y4v&kK>|SKjFcifkvGmoCwN8y@jwSj|FsZP8)fp0O;fV(}`Wau`gU&-a(;@yf z%>`vzJA&ccQJiX%cT4rG*ZBII*-{#qTfYo(|O!GSu@%Cl^ zC&kl05B0=8h3jEY^ae1}M8P0lzM;!BJA;Hys9(sRKlz+ z?&1Irb}PZ5p{lj*cKZvkGt!%mepc9c(FX`>5=w&F1E82iZ11@fe|ju{E#qBBCQBLd z^R>P3is;K@^e_UD4;rG)t>qWYXeWxz z9Cz7??Y}gGxVs%HY(dG6*#r9|&IKlIsx~!x*Wm2MXU8TvLKtkkXSbia+ZkweAa%*& z1;zYDczPbR z!LxJZOWhH>wIbGSB4Tvj{eaTnGzPN) z-PS&R0`H5u`vw~lBP^01sC|Q<&RqCE!(bO954%^?mbAvk)=5*+m~(^y9Z}eSVb&{~79<=wxrS^Z#E_0V5ay diff --git a/vendor/github.com/docker/docker/docs/extend/images/authz_deny.png b/vendor/github.com/docker/docker/docs/extend/images/authz_deny.png deleted file mode 100644 index fa4a48584abb3db280b8226d18888cb0539de89d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27099 zcmdSBbySsY*Dnf)5~8$(2q@hlA|NS9OM`Tygn}SQH&QM-Rir~Y1VN-Fln`m8B_*Xh z_Po{i+k1awpYz`y`w4>|{)(SmnBm_`vP$p%`-!N8Fx9lYaf;>N>#OjT;s1Lx zpD;Aij7t}k<^H~tPiU0qzn?H4W4u7EAvq-JEXGqk>Gi z80oWdry&CguGZU=9&|Q?1@>}#Eo4UJn`31bFJBtT>(^}eDrlWvy=|))!rnq0)XyxV z#^yfhxo7oI=l#R`) z?Q5OqQKswG{N}J(#MdY~ndle|sWyh7U|Z2E$(U+M4Nq8->25k+U*8!r>iF^gk--?F zax(is{sU)wh4z*t!Dr@;e&^*vC^rS(87+K!>m>T|*}`QjuL*%nbHTg1a*WjRn8Wo= zWjY>LLPL9)(!XCwHuYiDHb(!WgPf^pdgtp~3ew?JEU$PiaG%WQCb|V(zJ}?Y z%kfh!ynnvoSW?pGgpE&M@-1tQn&kaqg+nZS>R1}DeTg8;v8qzxgV~tF{&#|c2Qh#Feh32>)UpQAunIX$j7lRR*`Y)mte)jbLcG{N6trxoib-BB*ddA zZpyEYR5%GJ+i<eGv#=TI>R^!uR?-PY7+XV6U;q3cY^EtGN4WB4W4;CBQ9h_{XoH=eh ztFLn1%Jx`q#B%suyN5d{-It@x^#YfaD6`&m>*3y%!@;J7>)yEYd7IT=M#et;E$=1` z?yB0w1c`ZGG>Pf$zE3SMExNbhRo3>?6_-FIR)da!hNf6b>g@hoALX|;p#k}hj zsJlh>lG>gItLLgQ#3d$LzVKctZF3x6`SCvg@sBc{jcUim^v~N%104=GEp)4%rp-O% z3Ob=Oq3ww0P^aKEe~Kq&(N1#h8yS}J+;_q_HQ)ZB^_tZWqZ$XBb50+}Ix3ADF=EPR zHr9WB&VyS}+0UjB&(3N$Q8RLFLHaVa@H<;rmtK>6K5Eh@Ap6-XU;uLvjtx8giyf;%WV|V4p z3=s!GOO^eM^gyk<^YZnZmfvZ2PWC4ApDlb_SjK^*s)5XVXdyn+3}WE z(iIL}?Slv!u?dH6*imk9_XgT%ybJO)^B;a3{rm>&La&TVK+DSpWwDdYzU|D&a4Ny{ zy5miS1hFIk&2M*pmkSIO8R#v%3|fAa;+Z{Ippy}ZPh%U`Qlq^;J(WwvY@E7Nu@#U$ zQf?JfwD7AZqmWlZ?kL*(bSp(`e`z3}tp>X@Swt_6U8mQflC4#%P}j^VQdW>8+n}Lchp?sL2MlR508JOpRC}c z@J065#>wDF24P@VWQ#Mw>x2Ki54K z#z)_hdc1t&dqhX{>b+`}&aK+C_k41;OAsFCS~q>vboYm`W5_AS0hC-)k{knEQr67R z{=O_Xj~BY$eFza^WL*+!%xo(9al#*-E;20(R$dKc-^8SzQQko%gAt~(vC|rUn`EQZvXD#_9ETz zLZ$O>!)x=0JIh+b;>yu_lcA(+x;my|{p-z#uWmPvOuxGM$T3p4!g|q3pP1UlwsO+z z)5rcc*gV*S>$Jnu{uQiS36YVh- zG3~JM*4a8Cj_rXwlp#!;p8}@iKfcYtiT4x39;AE!sM|Jc`&ULpJG=@PoiysZO+;Fe zv)WO7{fY3$lMal}F_DC+n$};w3o&`@ENMP*wZ7ZH-5S%-Z~>n{Saz(%z=TnTaLUAj zj9Dhw^;fchebZ*3Z_uaVak#&WYpa_+^(}q==cuWS9p>6eS1*1}4WjWHW}x477lo6$ zxz#PEx5mBFK!XZNRg7W%T3CE^!Q*pZZP!@Gqua)QJt3bOroJ+J?KggD!#)iCBoV*y zeyFYLKwY}VQoQuZ=!g4PLz>&#^rX2-Sv3gAtz3y~NIKu%d5~({g~hmD_ChqQ9#DXK zwsHz*p`cn|j@o30Y$|~+ zDzAGaKRsWatr#+V77|W&ky)Pk9!lE;9oI&an?t88^YU`O5+_cz0exlN?sEr)k!1_0 zJnY`ujGr!k*c@ii`|xW*L2Z>!Im=#Q zs-gwDx1Wq;7A9;&Com{nxrXPt`|43L;kJ?cIF!A$XuKwqSj$5f=H<6Zb#r!N%C=_? zzMo%45=;g2&}-K+S*J*^_GAR{%Q;8zn13MUH6%^q5x;>ITlXnB_h5JPChuKwg< z*xJhCaGXEI$&Zs05iXTfpIBB+`RBhUI1*V~u2#GX_4iBWvx<(>I62%YeD=(gE6Dzt zkm)FTw(9j^swa;urjMchm3g0ec|uuNrVw&`w^1gox{FmW;_WQ}*FehzL%5Ouf-qmi zwL94|+Agw^8DvL=g=-mJ-tgj zLc@hV&u|f!qHo?(=J81h+oAE$o$qxP#qVoVevFTItLJ-vOzgbNJT?0UOifAH}tjQ$>^Zkpl^1>I*sRclu~zd%V`C)uJ8Iw zbh}p5=+?7ZQUe9o=-DVacZbk(g-!|Knk9k;8j$W~kJIhKGI? z^_O}R+k_5Zd|CSv%eNj6t1S2?@L&&$l|JZA(64b( zjhH9AY>^~jpB~GiF3o+&$Hkx6dV4jbXXeiDnv5gi!R7T{|L4th(sU8Ro52BP6T21n zy$|DA9;CMQFB$p9-+cHvXreAia2N+g&eK%Zzx?BU&UnY1$G0RwErG;UNhpt*dtMX@ zV$T9t#CEx+M^?Ytj45L-*UGl2?I#bdwB;~7H8h`K__XPH_b>}Pcw zMKJZ->L<;WH!kPet_o()u2s!kCbJQ1>lAS@KE#VpD?w{vK7WBIG1Kbhs>wLSjM{y93*9M|b*!-@mvc3Z3Q{hvqwMo5h68iSuK_GVR& zj~|#`!l#o$;cjGIE59l2n&=kLcyTFN-}ibf53QelOr_UyG8x|Ub&)B?`>$nxHob5X z+P~W)i7%3wqr)T5=XXnJ`*-Dpn}YF}KNmw$(P|~9kpr$~?YULG>=j>XI27k~ zziD4exo~(}i>=!&1`TJQ5$)cS!SFY?Y_j8Ge{17OU_>eS*r1|DpR)_%1fb9cZ<$a% zTN@LsEo?I1-tJR=qfRYHYmM`?nY`kDM`)CIFHXbv*1D9-ECcUUB>^7I^=Pv%3i2@G z1kj)t@dO&ZDUqU&T*55j3=>JyUhwy89tv9@P1g3$h!ig;h8i}am$*ashfiV$qZyrH zG_^GRWrICRKB52nqoiiyRpg0(m@DlFjtY;o`^EQOf1ivFL=+F3>>PX`AfQrr&{OtyoG#~qw_H8&yz8w;C*QI@f82?QG!({7#X!Mbj1EX z*$12cVCdF5+r<70CwWV3JPO`so2J>{q{>n*ht_6BamF<3_kvIBu<0xD59P(wPGXJ= zHIBbCrUhpIINDies`FxuIhOn^nx(dr6XqHB!n1+w`k^}=0ZQ~2$BFE&LcHnr&U&~x zcdpKJ;dPJF9VSKVL0?yQCIZy%MQO?j1-VH}#)i|Gv1)xY$A^+Mf7e7#4>KOf zPb)y2YWn}*2MOXsH-?P7;}(+LmD&@yxBx4~QwciAj#oQbOgD!(Y|Yxdl*X?2ft^Gy$L00sz)O8&4ZX)%fY{2+zuvHDkBtJ* zul3={X#Dh?X<)9*)XyNALC>F2GSoP_*M-M#a_D{NKcEux8ha$_wA5dEn6sFZ9PW>W zKWOE;G=!ZZ>gk5iSYasqyk@O<2_EAqES$*_HL_nHX%f7=Ml3geMX4g7_o&tBpbob!CPBl?IRJIVMv7!yhU{3EsY(v- zslB8@xz8uNuWh*fE(W?(WLV2ear2=gOLnc%=b6^9s}9r6I0uV4Dch4p2A^iTZcjRf ze11vJm>SJ|74D=Ke4qsmlV1enzQ*N7+`Ug(cS=k?J9?7~JWUn7Ov(3!<=y0((q5-ogh=+5 ztfJ!f9S&u5nF#8_K9&bXNkY%&QJ1F+jp!Pp85A@E@hCI^ZV#kM202pgJqpdK@%tIC z*3Ftz7Fc#BFh{|%W^yyG+VkkSE1+Zq)|ELfs^w}GzV29-2hKY?YF9tdmp9WEk?=VP z|I_}Pmq2agLAp8L=My_c(D17U`0wUYesO!tOR^S4_47HS-P)s!zkQiRJBURqo1xgg{nM_R4901+BFT2b5E$c zuT0k0?@USPQTzZ>>-g)tgmQ(&mq-aQ+2w)!oSfSG~dF3tTp@^oAbC+Lbt#!nhU4+_Z;DndM7@6X8@(w?mX}BjxNx7k2`HQUagss z|FG*dV`7z9{xB8?U#=Gse`pUgb-}1BF}bh!S5i*>VLk2+{M*bVS4mi@LqS>U9n!v9 zpqddlm0fmmu%CdsZEwO|dBSa(1f3!D!S~G}uS>E3YjFHMVSu0qircnH zW6qPFeprbH$5!s{`<5bYmV}!T-p7(OX^ynSjEdjeGLN?wk{cDe5%H7z(Dw=YAwg_A zkj!iEn{`c&c2{@shzwmiFXo$J;!^|N=qb7vO0qF^HIev`yrP^l;O1?dj zNAFwJ+gJRP-(~vgsV#W;i-^7DG7_y7eY&$W;1fDqNBtcHwYQfCDXtrQdOk3OhzSbS zTk~CgYpbJ`m1AAHZGFmOPd@(qbBIhnIsdl(c&9Ky8$H^78eh-52~!Qz$cBfp5JV!& zE0Z2uVb865GeZpBk3nixB=9_*e#zx1aHqq#{2uUD$LdRzd@8r?CdxNK`^tH4^wA+} zZm`Dn+3Id17LB&8z`_1ZM1?yPbB;ank%`b)RLtMnQQWk%JfsOHRui^ttWISc<+Ib{ zgB{(ZBcarzlSjRu4=LKQilmd)C_dN0wp$we_>8fN^5#R7QU>g~_%}y#pr|+{y8o_y zU{L4rV_ffGX$SN=~)Yvh^P2Eo<^ebEgHo zR4aRU818PT+9C8a^du)t6fHRU?@Vr*Hvd9XH{i~=9N!>xNxd9l_r{dpImr!-Gq>OZ zEcK*~<7cRSGM2~kV;R&YGh21uUC{}{Q12y|8-vAgT5`Ju7_$;b_kU<$?%~wT)96Wf z+D7sr3RHw8b<~aPiC6SWjD5Xq+BEVElD$t|MK(`1+Guu2(#E+4N2%#Nv@=c1Bcg;b zZ8|}f?R#P=9rOHQqfn40^Fs!dG5>{W(X!j8i55*L^ufE2x|2O$GUVX|%_Q=eZ8MY5 zsUDkP1`*!KcDW9BhN$3xLB?1_%=^@1yplW48q=u>6<1HR?D^eDDGe{7+MW9Gt;8@Qsq<<~&o!ReCg2UPVQO{sLClcnNEH=>o7EqvUA zeJiU^#AIr;ZQL{VxkaqVgn#icgw-~4JK(&~c&F0Hpu=3_xY#?sIUOo~wD-F*meSB` ze6))p?X0$c#OUz`Mlz_`5@#(hiL=jQ*sk(F{(drE7jD@bz>~I^(b~26%P>KE*3G;-&a;p@Zsv-B=+T7D7P+^fU1(Ir^m%&t)^rzDa#C`NL9!fd`O=#Yun8;l{5 zR9#rO#tjRciR0_DYt)yAO2@E7He@eVmZ+k%&5_gN0iviODV@+hv=1W+XsvkU+zo6u zx3XVUjzckazoei%iMdYOgne-^EwQ@Ul3+Ek$2fvoWZO|MOFpjr78l+nV;^JstWgY$ zfGWL|*PDq6*E=;-P9xCbNx47!^;|;5kDcc#;)W0Cv58`@tu)5`wf&!w zbzW|$-h0Va7YUossGjy!&n4=^VN;XlzJ+t+qYVLkA+GzB*U{>2GHveMz*nNX)Ta5E(u{SO zeNVY58>rd$dKjotT=mCgim!NEes?wO9(QUa_l>5BJkCs!q?k70bNr=JJ0IA+D}l1V zFw)7%E$F>kF;pJ&LzJ-nL&?IEZyTmB>^w{h2?NQV9{}OndDQT|du)hx^{43~m9#ooS9CdYF|yLV5$e*$uN`3H)IUxQZl?=>T7 z-|p+lD8`xMQf63_pQG^QI2V7FIZBfDu{26NkZaQT5}{pDVtb>s!5C^^i4M=4+rXbo z(__0w#*4Uhlq=i7xHca2Njo>it+bix`vk3+a;`D=KGJe8>3~r&@rdkF20k<4`)>hJ zSET!0Mqj9skX)w@F4=sM>bV||CwWydw`l}_nVnqKSQqEb@6|Wik^@(&xv5W0NM4c^ zfK{~=aj7Al^aOkIv{{l}@Mu%moUBKQ+gQTgY`%5$1g$0D{+@AA*M7-m=})_heKMaU zb$q!7pN^A0aQIEZo?&brnn1lZJ%f647@%U3aiJ@KVrGFf4}bzg#-FEfU|S;Zgm zjTNOr&@kl2g^BV+xQE|-c>42h?OCoyt{SUZD~c5WT%KXA8}u!?N{@2`o)J+;6SV#K z?!|^~iwv5e=+~0v%SPSE1EJCy8YAbx?W5qaJ!=yhvL#TkJrma9&D8`QW>tpI-Gcf_ zRzIu1|9LQl+c&mxW$$kFZhcjifM%VC>kE;jC8WBWuHd6L5fKr|E^T`8Y}cCy zzpu4Yi*aK;_~cUkC~26^5V0mk1bz<|zEPNzqDVSj*Y`>ET3x)_AmkI|z1B^FiIW+Q zs9rm*@6ji(c+E!1@I8pFu%Btw3SaAHWxA}?O~aN(pPVX8(v8{MAjoof)h!J@d*yG`u7_JWsR2g#+igB!%cNnB_pkl<*)ep&j+@MNcWK2E5GLZDv+}jb<#%R zJzT&eL>48AFnaLr1mL1-u(q1NH5(T31`jG5bs5zqP@!g^j^^89O~n?|CMn&I&a<^NR^rWCT-#XsPZr?+ z^@;!2AEeb0yE9O1B(@N{NbGHJsmNJJEm|4%%)XHF>Kyp}|D=Q+EM6*n)UHf3HwXO*Vu2b#|U7EB!jiC1oh za*F6kEjUJg_*dKy*}!Gr-;}ul{=P#94H+3zh4n!6`HNS^qMhjl`U`Z_`RyjCaPC=9 zAYqAy7Z9Ad7@ldMm?WUO`+KtZ3_vI&zVNz_Q|-ep%8fZYhZE=ug)SWfgWHmmXK z3VKFHd4#{xoryd`V$6KX zeyTcv`px&&#xX1gGv$aybX!KKv%NtId6#2~Pc6(`s9O<@7(^gHv%J0I91k71S3R23 z79g*aB5~*yD{*^jK?kWktwL7Mquqgxh0a$QadWUA=fG{Tmm?+v8M?kD?DC(g!-;8o zF~Kk3nIN~D8&E@o(EYJz-5>R_X3~KlMROVmz3qQ-kt|c(7lYTTm%i~`pB%T-%cvPB zwG5Jhc$=+P?S7?#O&7m5{;31}ZiHVuv|V$??hP_7-v^c>z+m;UJ4I}gr)#3ty`v{X zX6Icw$UwXR4dmVo*6$TWh#tzSh$;%I|G7Y8e=g7sc+2?BxsFc(ozV<0JDj*Vr9mml zq35Xx*{)@giZKF}V|x)^a1Ka1hS_yGP;9=d=OqrZt7Qh;54J(}<&*v>7x#VKjrfPq zuFRMEbKNxV7&o993_4G^$_PDQu~crKIT$R|%X(03h{z|bG7$m4WHIO?Ut=D-w^L7qh8nqr|NaGDv(c$dh2SJV?8HUeNQfd?$!SOS__pclUSw+4Jimi<-d{b8xx3 zHg5;soahZGC2Yr?3tar+b#f>Nno2LpQ3{6P3C$qmte8K{_}8TktQyKn4%i0 zTjmvCzIJxzEG-;0+R5vZfnPu2yeG3`m4_7>s_?^$c5u<*+Rz4Yu=LWzgHVQLp^*F*HI& z(R$uM1-J)lem1l1!+9ki`JT7f#ZU;<-oT$)SBm2;C})v>4(rZ~5hn+s8*ipHWH9}e z(P4=<2B+?FyBh!iDQb}Wzu3GF=CX$f(t#d|a5A(2e$C~Z_@j*+^e)$1%V3dC`Ct5# zi^G<|pyCNM%a?L}^^PQ?##cv#DEKK{IKl}ZcF{jcHu0yho(l;~>VJ)iKab{q_W|!V z#;h&;1>b_oEMX|0B(84=(yYXZ;CM2kzYf{#Rp7$$8hHpby!C6bS=Z}Z76286Rsi8T zQiA!j$5vGDyW&bE@Kk)k{&3sMJHs81ER;{=p_I&@ZGR6IAs67i*vs&W|H*6Nt$v_xy$24n zUyx`;92CKeUWV;@f`y8%cM&V*r<8b$4T?(Y1aoRs&5 z`ynsY50NzX%Iy1Z^5BCmEn}R=eFyc&Fa=!KNuiY(Wzk%vB!M)r0J7oQWq_QU2L@*b z?iKcT6JAG8oFE5LVb#Z|nJG)S11Fu8xENaZ63F(fJUpr(ENXWp^322wBaL`Vz-cM= z8{LBaY%6Tg3K^dS@b|Eq98gl zDICe^H8L08eSzyX3waptug3>l|LHQaAc$u{8lxBTRE@uSu{T?V9!=D^W&sf@1LbdK zZexGkc@igEt5h_Uuhh26VNPDefnC3<CpGp*zNbB(4BL+8pFasQY-s$t~g` z zo)>tnlX4l3g@!G*1K#)|c6OlL(dFf5bhDS z>y&Z{oNqx+?$dV@M*1|MmZfQD5H^-=VhNYC6Q{wDCaCV56~|1a(q`qOm$r* z>pbJtQ|F|lj1F`|g1+Kp=b31{IJE~0p#6c7XI4(u=S&y&3&0UlpvIqITKJiCG=V3? z2sf>Q`~^lm5;iN&m*BaZD_)|M$fC~ZX?t70k@*WvWA%0E$W}j6`w~%{IZLDZ?bvvA zYL(CuwTg?7-?$ zCws)-)IBG>J8Z@a$-G6_-{o3SJ2!maF#!5D?lYA-uW;YF@g2@!hKi}Zz5OPrkjsSh zv7I277w*V5FZX7>tbv#augCt=J#+n{()oS(Fdc||eIA!26470khKji$jPgN2K$%R* z)mZm=Px?Jxn?d$Mv=p}`77_UZ-HJS6=ukrVs4F~v#|H~3JG%7jX4jRhOwEJ&HZXix z`oI&@INd4sUKCTdcu86bRjM5h_x3MAt)))4XmLIQ*>j^AmhXZqg&N4G|I&@$9ONfW z!D!h}GSX~Bk5=BhS(6?au&^l5>K>}JtC`u-HW1Psq2mNZiUWc&2a))Cr>`7Tc1)xN zm4xt$K+d^A_cs8#$DBwC8rvBP_0NgB>?txB+}M6;#4iw=+3!B|wPC4OhF@^RS>`(u zlp!WewONyh4jp0z*bJ(cKjIgqB#Y_Qi*=o5XO`kp4?HdNW-Hz zm?<3>of{8t3{tQ_8H|#ImvtCn%~r5}5DM-eiu_86>er}*Uc_=$W(zFaxrqEp+ zNh%5Qr7?Qsd?w|?zC91y*A+Zz))aUER_tRnuoSHZ^5V9C^+=vI$qOXh9_eVc%L21L zsK^T%Z#aj#5~D8`jmP)p;8O71j=4Q}DQ*hkL^c#+T6#QVBd!j>@jcjDSf-J0wY#VG z2LNZm2hAq2nkVK)e>|1rfJc6n4$uXC4BQ`HbY3@092LR9crJCgnpJUVq%(zzzla`U zzN7kFAfZh~6zl*OSaqVIM@@va&C*J4&>yoY1^#lsl2Bn^4CDD6Hj@XM&!3*t$Ot?A zak?T`CML?E`8N->n3r&-D~~-9t?w{>gD0x=#~Pu54RhN$tjk{@fqJ8wnq3%fuL}_b z8H7h)WNk{IwQu-hQLht*PW(Yn0)R{!UhzNyLVyAZ02tJCtHl8Fp?okgkRXD<&DOtJ z{a{mMnPXK2lz*Q*1qJKeqgF8ck#498N&-*l)dbCdS&1b008^dh{(l1wp~y|MpDDBc z`($4PC?!#tA#VyehzAzIY^$#o_V>vM*73b*hWD3RGb10lC9ESaN<08l7e*BX}Y1ax5;18R%C?Phym9rczE4Amp*IkdUL*fU6>TFMcsl#8=pLQx@vS zjuC`<8KAQaI)OLTl2D(UDxwb+)M9p&t_1O+WXiZ!Ai8(P|u?x2vLDQu_Pvvf!uxt5rh>XJX!`5DsaU+aUSnOxy_Ig_jEJOAbHep7|OuRP-1HA z=a3F(dr(Aj{A=^7UCniH84^H-SAf=M0WcCtIDVW7zk|6bnMw~Vb0#)(P83wpHa^ul z@Zy$K7a^Ey{_A@h2E&!d8^|SkoM0t_$c3cLNkfQ>p?`ZTJw3!(3Dk5fp zEU{ch6Im`gW#;xDFSoWpQhO(sKAS(P?)D4IO;AY_MPX2&m`cb|)|lOV7UB9cBozLXq8}dbUvHw`b2L5q^uPo&mUopg-4#+aR?c4S=jTdatsG!v5m;3dBn@_ z(OGds$VCc!BMJiO!K&qJCNB3e&Va98-El6Wr>Fm=n1zPM_TyHIpAy!zb-69f_?l2HZwaYT0=v_TR3J^%F~5-6Pp`aqRI#R4jB&H z5Vi6plFjH$7fp$!T`Lg#Dn zJARpP!X8CJRaweODXE*Kk@S&5nCqo}vP7R8P?-+z3x3}7QP2H3K+WEDhP_`VPtQ!W z9)y-NbCTA~y@n|ex1WFm=%f9o{LH%D};%Mi^b3%nbpNiuFS_w-LRWA9DgTMW;DZb$x zzA!CIA^h(1hdU+4f4duPWN&*^Xw*sg-*&cwlbPv|X^MBW)_?)m0veu=xI9bSXfOy1 zf7)zQ92)zJ@hk}EY<{7O_%d8-mIdMZwTZ8F*`|v8cNzcmS9$_m3}otTwmoh+KJ(`X z_dQ#kIuAk884kx^|DI5R*&0FfTl;oaEVRSc9x*{`NRM6?Y5hAF7c7Ld@1e{Bg1_w> z!Dfs>)H8pVg!#4s0zca_)BedNDL88XxqhZ^#6h>x7v-e>pQ>;(e_6BBVh=a z%kyyC0Vcv^A!O*d|GVx;iTluFF)IPnOC=o|Yd>Av9|&yXH4}Eb+z1l$S?+slytZQk z63Gx|8KC(j&7|9Q$z%3y*A8=12(D$c2stfP zWjQWes4d&u$g}*u+mg81`3lrI@c^O*4d!f4WcXl+l*jsWY>ELyPO`bu8sy{It@e6{ zK&9`?5K;U(G6$KacmxCf6PFLEhW4+5?Sm*;FeAkT$0-gd>0-}~Y-6#bm78x-x5eB= zcb}Kt$kb$$@Ncq|A56D1NvYK>L>(f@f z*WAVqd06e%?G~hbFO&sL6-}l(p|;TSW0za?Nk3m3%ME*)D!|=N#bX+9`hjV1TPa19 z1LiN&^y|G0u1*^lazh*KO}}?hgc51VwA8T#B$J3zT`6I5?B_^$rByWXZi`^u)uq{m zmsOR*rFFr#)CzLa3qZfFAQ3er;jR$=uO4lnJiEYg-^c=Fr;H-H-J98=@5m$f_g%oI zt0#YFwXLCw+3HS0BrD`AeiT`}Ak~VZ7yv=&+Qo9vdpfV@!T6_+2>|dc>!G5;vPa!T zz!{4`tVxI1TkeVX!5o<;=oPC-Nw@{Xn{5K zavq3TtPpR@gGa5wNfx5+b=rJSbUGQ5QzkSQ!i-4mJD^|ZSofsA0ROz25(Yz*oaNKTc6O4#b=Mjhak7qjREIPRf;7w$1Nzr5=vpmp4F>=5A7l6fbUHK4zx>A%;Xhr4 z9o7HR;0Vt$Hb?!d`CWi^GCn%#-2VGyAB4c5P(ZDb-je?+eAXySm~}uF4vF9WWB;;wiu?D=;C}$F!dj zi6-;khoKw)I3iH`Q%%ij{t`u6^s8X+UByfO+giYJraSu6_n`F+L)RHGUXT6P`e42r z>+f1+|1ZsV)BWjS1t}LH$@~_Yrvl6ma{_aFxe{8s4Yz;=PzujI`kE~Vl+0Lvciu8m(^DtHCLyLc=CT(Rgt^INA8;>p6UnJ~uc03inj2r14XacGzp z{)$ALF7^OJ%7pNNo78_)>D|%yk0JmIsv}b~Na&Y@MNLY`d5s-HUf8_vA*1$6(hpFg-&`7 z-1B1CEM(_yg(b6wPW|}J4je@lPQ4ROB#)W&pX|wPeLPA&*>T80kDNfO$}?{CTLNuc z3uvAuoLDs=MXHltM}>zl*-N^)+Lsei4P(>tii#TGFls^HQ~^Gvg2cDMv=~|hm~r3Y zYjjI>9fSHC|4LzSesi}x=HebWdI7U>`gjVj?N|o{yk~B_#KfPo4|qtN`xr3%VFyhu z&k2vM`>WwXsa{C5bms_Kpa#^30Wd{kD|tB~5)ZSrYS+ZP^bMe#rWM?O&DUe)wso!> zMlIffyLau%5b$g@5EoP-;r9S^M{5xBm%weX2HwvKPtWr{J2mW>R+FG1t2>O0__ZBw zf-#XIs)`X9%Ckw?J1Tieo(GBdK$qeqeWr#&#{ZemqLCDhA2jKxC(1oiTAJqf$7`VH76Rls=!hfvcAX6VaTD5#&5~ z#~~^lZ^~zHfRTGvOpavfYa1@<4;AV?I^Pw?mT(9${2B*eF+*IW6o0TC&$At?GHKbH z4?0$%!6x|)cT_WuRnt)jR9p?vT`PMV<&aFB>2_-egI~l&JI^mN8g6X@zN2?VZde@B z6DVT9%_LR)^j5@OOIh$RX1CO=ZM*z>lWE}wfC9I}Z_Ty#Gl9nP1K8R8VGY3xAV42( z=H?_v!(ClssYj%F@TC>Gi)Fkwn;nY{I(NW-L0qNhT%NUdlcF760TonZO2z@0a&LCe zw3Ny$Iv&38xw^Dah=S7?ldGQ7jwDF?Z9sCFd+R(wsQA)tOCd$HHrX2HM$^B20_(@& z^w?G8lE+j7I*VaVmFDH7SZ39`M(%7c6)+7W#e<v=IB?C5RBx!ld$tX+}my+}I4AqcY(!B|tRvFmAC4TM4(_wAb}9Rn128(luO@ia(P z3BsaTl0laTvGLHo_J3mifN!B79rTJ$5(YJ%?vC>s3He|Hwj~U;@tQVc`5;Wt)6saSA&dhRyKVnUbK6@hg!7&=!>L^&4l2BoMb~Rh6OKwS z1_#}W)O8B{j_m!a)nsW|FnejEGX_ya5&vxUZ9eT-4VI;R-$e<>`*w6K@E2JwZ@j=( z+JrfKy-`v{Nn_ooFlyw+XEo;H$mru_SdcRDtXo8jR`I@Bz*vS1eg}sjQ#L*W)1}t1 z`xr^`VO`H7f_2^1Ls<;aYqU)aHo;#TaKAjh)z*fY?6E25{K)VQ0b&$Ry!mMI`NEUq z_n>y@)Vftn7%dUJ_(mUT3LAP2|shA~$n37lRY(jmrU-hqZyZHW;h0y!l$A#oi z46h)WGdV4d^$3HMO)K{2=O6{>sXLTUK{+}fU-x|3cwu<^y6<-)kc2D`cz5WDumiI! zh~7UeXTCvjj_samzwS?UQl+dwWxW!5TTE(?b%`ejzvdqsn1&JJi~i9gjGai5BgK6H z-<-p2onnzO1`E*bkZ2U+kL@3+1`nu*@@?THqVcb*3tm8lA)qH(4!Zd(GzyV&P}e0p z5^}*M8G{bLp~dKka}z@&++>iJ{W6Y}Afhd)60k*fJsv&qyjqy?uFW?|%+y0<1#0N}u5qNxNs)A!?a)q^VG`{yqm zyIuH?(L&d1Ol;xCa`&&=E*n*oh=cqAB3KvhK78``OJ_U)PHdwG{}JNFF-q^j0zQnq zsrU;U*Cjwb!J9WO2ae3^B%ver7#kQcR=;1JVg6 zil1YWLEmTH?+^Y%p`~mZQu6)d*$MSvge{Z*H+J2dqfC>q4CQ&r^Et5GIH(h{h&qkX z?8~RJn*X|kzu{nAMa(}3O7!gZ7GBg9HD&JtisxStv`Dd8!dQl9`rsN5&O3m_6@dIS=V-ZCqsHRzL zI4+OH1as28p*?y!`ZxCNe@;+)NtwW!ufv-C{K?P>f)8%Bf&(M>{$ZE!4gvIm)YL*SfxF@zLjk!YCmzwWO1hW|dJQqsGvBDJj0Br$J8<*sS<$3VYt z>nxhV+{gBx_5M8_O^M=)Y|?mD>4L3n{;%m4CVEI;rbR;;U8WIb2MpGGKm`svn<(lz9HAna&&)F5qF30fz$O#j zn|Fp7&sP`)<45yD?*^<5o$1!$qvT{zrjXuFtvdZErS5Qv4bjydLu%s~d{}vyk&2Va z>5G~uQq_i&Z7WPp}t)KRT@}nQ!04AMn-mWA4^tH}2zM-c`SSHWl(}(tC zkxzzL&AK$GN5U^E7M`H&K$gmRYclJ1TxmCHd%gpvRe3K+a&IGv%cg2Gs3jUOmq$8? z6E(D4TwiqQkxB~qH2HAHmicN9;CqP-L738=140r9p^qJ~YKH6Oi#99P_?wzy8m62@xQkEkty-vLwEWF)5mR(XhK(am6cY_tXT)% zs3~4<)(&-F>St-3=!D>mFzN)I6^zknTi*`f}h;%@*Y|}qi75q#Xme?XJx7reH zVUm*c$$%-6-!@GY?__QTYwimm(AseFkJ+T6&KO2&O*tIeL`1>2FnHd#27AJ6Ap3Vc zQq#gH9iu<00QwnDGs+Y*8jIS+r@iN_t}*hD^bmt-D$kStBA3dnEaiPK@~f%azKQB6 zTFJRz&S%ErfBK6c22U<|PrF7q&(M&L3G%D;m*SnQ(%;h@w(}#n|7gk0B)*ASC`+ph zDzm%+9i6}LDTBdNOfGSuolvYx>Tj>2^`-ZgO1fGiIqK@+`Pk=JvO|nPZEv8puDwBY z>LtO6C!wq@&32qu<{{H^$L)asQQddHQ~AgLm&|0oDcdm$;n<<z ztYh!&y;s>QTU!d*LK(^4gwONteO=$b;QPbp^MjwxIoEYN_v?PWo{xDLURdqz`QJXt zp2?&xJ{*U)b^d)@Ix&7J#r1sFx2rJh{1~rZ?@2SsV=W94gNDuZ_TzeHtdh>%myNm6 z!xbjH(9K19>kCiDJfxaM#j8YpLB9kz`%)PWksp8_6TqOI@6niS{)@_Eej{ zZcQnmwP{G(ZPBNw_4Y7(7V}TQ{|lc7uwsHN6#JxM^n_kJ4Ie;MDL@1xRP~c)ez)*8 zn*ny);j$D^wz!&b9ab^-mlDt>_YrsatJ|K)UVidtOY>N36E6ELh>mDL#5Rv;qYerv zVbJw~Gw-m+6(~Swz;mT$oVCOq4c4oT3oMm;C-7+gguhteACfG_j>Mz@+_G_Lq(vj8 zEvJAfR1pp!Nunjh9Perj_sc-PGv>hqqef>2#i3|wgf z*b)*XU95KC-3p~+;89oZbMh_lc*jfkglDJB`KlfFQIvK@ z%q+__?P5sCBq7J;=0d*!f;531Xl$vV;nh=XgYGry^6Nf-JS4sLtHNJ5BBUt|j5~s4 z$|U4xai5T~h|0FZ5~SGWgQ%{fmi5&cWejNNvAp`|rSba8wgvDLm03G=R+n*q1xN_| zi|GKz1bpTW(7dbq_fo+G2F*x`h}ul`(kv!`CZxXv<$pn5*gRJnzPBq#&r13YkZM>; zU)=cjNym$`EFY2|?QmwyuK-ueaeA`%IvoxAQ&Fp(qkjqu=_gPMUy=++dtUUg`u;I*$=w}!?d!YT5m+bu5?qx_K>ubudLPXe z=o5_$7Mh-^g7b9BMp^0YwJ=Uy{|NM&3Y@z;gXn^eb`}9GgFqj!+Y<=ruR8x85qb)` zPCjt=0WaA;A{-tVJdFbm$9K^&Ioo(EjZo=l3k8T-r-2`VOp>}vUbxc$sCfAZ&x!41 zLd3xG_gHP|6YVm4-~f#fw4E7`3`Lq!8_#@va6t2|HZ7wwoqnH%uv3=iQ)=I3o7vT= zRwEdfi!v_*;->AMhBF+k4`;f%pp&m&HN|}!tz*u|G`aVr4C=S82;%w2@`5v=9+SxW z(T`3nJ-B7>R0cWCTm zz@|tqjje&?>#al>>21Pco_UXGGYA-c+DUxgF4JR6{3Y->#bBuOf}IC3_ChqE8PSCh z6{!&vCwvOQ=KZg`yXynk$N}~rtf%|IG73v_h_)A{afE%tF!Q7k8tV;Rr9r5J& z+GW+~-mx{%KN$!L@`Pd=;9^WZW44Jqbgpm~+xy?k0nW2HM_?wB=P?KD%!7q=w-f~V z>%hr%JRDi9(<}uoZ`dCQf%}U`q1mjgURr6tO1Z~|mBWpAIC&fhn(@!LD=QxY+{jDs zez-%|@%Tcw_XCGNLhql^pDPRclp%d|QB~(3@;)KU-o<;|N;&&o#N-@`Y8whj_m;ty zYGgas2Uv(E2lJ~##J`@=^ZH&MKFWHXra+H&+mjl3^j!LuV3EHQ(Jq?sX4O2b{>$E7 zm^*_eReMx+50g*(XtHCdFW*Vl_7)ZAWm&C8!}@bEM_OH%mcc9a4xCmMW-L|HR7Q5F zrly3%{ zgkR!PJLS>`6*}vv*_(MFkHk{p>+OituLG^<>S3bvhP*t_5pE?uznem<;Qy}Df2*>7 zEqvheaF`d#a1ClCSRA~#ecwI4z6#eSau?pO?u*!UDNB<3@G;!21)llk*8KT7QiJzm zVSR$CkBlT*IS*bK3Ub`%T2_3e6tSb#-0eI*mv6l~(a1nFd>}<)ibd3oZv#>XTzwx~ zwi^n~52Ky>t_ui0}-pv>G!{?qOzlmV;%-cz6rV7hO3hZnQ z!xQsdy6QK`({ljQaLZLC*LCFh5O(}7hn(#CR`cql4$ZI`?=d81w2^$5e@1n&?52=g z=m2VrEVqM28oRhu2NbcbohcndJ8+nH>IvQvJJrjG{S*?onOvL&ED;|s<~czwBOQMu zsp)<5AJ2+i=wLo~txKU7beb@eze8BQKoGD79VP(-~6OPt;WJ zPr~?y%B-~$iy9`{m`$KQN;od(uxh&72XyX)*5wwRWWzWksU=Ex{LbEeLha(@U+wp4 zciVv=aX?pLw8%ufe@l1kk>J$4ND5{!qJGi_tGTLDbdV2u2=iyybgKW#K}xYyVf{_d z5oOt6;qERQ@Z4cPl4Y(0(#>6{Nio4VpN!d6+H$?}W{p4HY-+iCsg23-h z&@6uS`(La0KkVaH#NRUt%&xnvu{4RU2+z5`&{{obsF|bb= z3nc_bG&Rs~q$|8m~-etE+C*k176>Zd!=5li@NKu;qB$Yq<&QJgRTC!G9E$gtMU`~4t^|k47 zarNL5ephp;KV94x1q`G;cL!M+{ciCdQnek21{*l<{(Sldos*7f57_Pf5K(`0HjE^7 zwSzo$!yFu-h*IVr{1VTsY^I5~;>VPTfl|jC8Ug9~p7$g`7Y*&ihR6A$R{aO51fo5r zzMo_Bi0Ny^Q#Es8ZBGuNK8qjQ^psP_6H_H_58Z9pQz!z?*8%-r7w9@&$m7Ae75C(T zu;hq^W3N@dh;`Sr6$&6q6ho=80(vp*w{(C49s*2aQsS^n)wnj)DT5wFIB@g~GIT(W zCcBF05$vC6pSO+c{|(21qiaE~E50C_m3SR&p7)fH_U70Dkb!7n2us&g4vb3{Aq7hr z+PEQW&vxdh1gX&oi=C(wJQ~(3GceB&jRQ~3vh$qHC9l&>Fy!moxOn}u1xrvL`cHFC zGAg8vv+NzBQscM&wzLR7?AyB)107xCxVXMK;2GR9ZyUIrf*XM5v5$v@@JAj$K0(b^WDx*A6(#xvTZ!}PbI zsvzr@!Nb4-pAKb?&Z;19C-d5fB^wd@$LBAEd*X70W;3Ap(n({8<0wkxq{`6J70v!P z&5aT!#!zt7#imRLi{-?8OZlt*w}U(3fAx$04~|(l+CFKhNaOv;#QyHOY`yF6 zXiJjF@d7&ctP68U@Rt9Y@_{;eex^{1jD+PsDneOK5qu3~|Nngr&uIN23q>kpTm=}a z>Z-oPMJq@)YeAK~Nev>mJ%Iw_+Y%SWa^5NS(B1pk(}@@`{H*a{vyFxEP8E_@(nMLM z)A+GFDiW_<%>Pn6DF0|`KMUXx9hJ9261pWVa0!W4(z%K4Fst(ezxeXkH&C3BIX(4r zN#Pl=;Ud2g;3jSTiHXOkt_=T1T0+OE#vgUo4hrZiMgShdF8~nFcbJ9)_#JH$C%`ki zl_W7cJp@qzlAqdSg&Tg>M6(UM{s17n?fL`2 zQ`z?KuL+LZiESx_$iskC!!8WK7|qb(0NSp)7^PRth=7Z>isHy2!r7XCVJD{Ao zHA%3@c#VWD%Oo`U9Aj-qsU*p1IK{gx9p6P9h?rScNaDPFu+(3Stb?O0WX97 z0NXtQ(|aQf(vdIXokMeA@hgh@1I=C1$Kt8>Z3Z^UtMIm8(6O(LSpS~%%bvDi0Zr;w zbv54H68G*dg>JA%Ukf6}ARGV;U_#T;YO^jdrEamIp`mvab%4tr1kHO8$WmRny*glQ zuSHT^y727}=G+P&got|i;oe#$yr}^3Yah4fd&5AA7z&0U_gf3tOU!;uH2vbN9OBp9 zQfg9qPR?BN-maoG-{GAptf};2*jU{r5rH!oVlXDiPaTv1e*~AMj))pR!I=WlON}E> z)$#b_w_KSzfQR&9f$BpWeAPRI88LC+2T4X_FA(OyQUs)z8@^Hk9YIAJ$xvm!PZB7F z);klo-y`>ch*DS2kTUG)=_y7!*^gLdybKD1uvuilV=arQYwrPuxGIPmDe*&O-3oOWl!pL4ZQqngo|(9JU_>ruvq9PBv5}L2A8(1Y`oSQzeUmoK z3C_aAQ?Oi=3tN3CT9?ZN3JW2<4*_-5$j%~E%+bLeMyHiKG$cqsHqm(_pUykqfu$2n z^!4v#AbO@-`$*S2V!vns91Z-ZaOaIbrb%k^q8yCDcjKu#n!SkAf+lxxS`;B%jY%tZ z=$$n@4<&GfA09%kRf*F+3l) z*5)R(pK7!?9YMpH4j{Q92tt(GaNle?{Wi7JqOcdV!SVWCuZ3_Nd)Q~3jYaI;N3muR ze7Kj@nA<03d3rh{Bh(%lQ1V>M;}*v8$c7Q}Dg{0^#AIJst?&POG*MwYabr!KaV@Q| zVIhOH-}}?T#GaH(#)8Pyj|U}3M$K7@^K=Jk=t^pTvoJY(`*IIY&wmyc7A$;yGZpNi zWrLlP_%1Q+Ovm9NHYPT9Gxs=WChS{eW25AGmxm7@7GGUwlco+0Nlj%m7fvb47)@*_ zE-TBsYbU`}5RFps*{>d7>HO&&IyGe)laYa@ymE_p<;EoDF?$(~60NGMOB-~wZ@Ts< zFVnvN{d?^pR9?uAKgug5E{@}a)vK|o(NUF$&uDiZ_l?+$Gm{f7=_DNU81P*jn4T7B zF|Cxiaf8D+GAb(Qqg5`8hklt}sh>UH(9n>Don5%Y(*3)4v!)oAencj-k`60+W+o;U zJpVv7cKn3-sg&7{BO^UMn{-M_%7h69y)RCAK1k8WM`p-waR2dnZD3+TyS24t;q0u%#Kc6*G1)$|wG}t?MNCXgw>4_#)JTCV zJjSQar1T%lnSHi)?qQM7R(Yv3ipK$M1_2WsX;+v;r-JM1t~oh7D|lqfuH$viMrOop?yq{o*Jp5Kep4{aAv%Brru zx9=t6j6*&AzOcBcTvk~bUQlqw%}RDsQ}<6HWz@;+tcAZe-?f^~PKCp>PWWbGpPvlt z>+6>shKG|nucChaURi;CjfDL(E-H$2yNiUfkeOpr;&QfZMj!PB!bastQgKa9%}2}{ z%zR3Rjnn_?r|qwIiT8{b6H46q{d<;; ztu0$$FZnsH+i5;#W@ba?j%iqnJZ*=^W!GBWaI2NUj2h|5;qD*TJ9s1|Q>MyoOq?c5 zc0fm# zGZtGCpOC<_va*u*+(m(mj7+iUsfWj1Ch}lmQBlPee>uNRSJWpISBMwAGWQ#8h9yGD z;+&j-j3B0;o12@LHp#~150@4fv%L6~g-{|+Ed9!|$BNjL^mJWeVPTyc(VpE> z&CShA$8x?kN%8T~>1u5xK?+i2J<8T)jo$_bxh*X%OUUEz5e*pKuCbfum!4pcAs!`D zljrPAi?JqBA=#{VH^*^KQ@U;@DSqGM@QWZ%y+V5J-@#k&HFsUEr+1@=WH?xk>+9>o z-v4ATd?1_>a{1j468QZMLIQgHNLvi%J88@VEcV4USqa6*0U{zIB_!CUfu+^eNP}$D zmLC&d9q)}xHEX|rbL*8Ryph2~X{f7v+kX4nU+23(m(7a%Ha~CWY%D1$d0ttF4?fAo zM9$mJ#L3(|sev=DGg+qVnC)(ntHT>DDlJttG&0Jy7B-?UGr$o%->*6odqE~k&O%a& zBfWaQVu5ah32wSi{kCIsTiX>i|M1brdhNXgMzov0zwdOmH$*1Bj8l|jM^Wt)QMK>U z=EV-7fbai#n_)Jes=qyv$qFivHO`FbB)MrEGI@!-8@;UeK z-^Abla@yPbeBDE;bH$yD@5)%Hs$R)OGQ&hzP@H%qerHBX_QyUfE*32=FaI+-I=cNW z7>mVHV|IJB - -# Docker Engine managed plugin system - -* [Installing and using a plugin](index.md#installing-and-using-a-plugin) -* [Developing a plugin](index.md#developing-a-plugin) - -Docker Engine's plugins system allows you to install, start, stop, and remove -plugins using Docker Engine. This mechanism is currently only available for -volume drivers, but more plugin driver types will be available in future releases. - -For information about the legacy plugin system available in Docker Engine 1.12 -and earlier, see [Understand legacy Docker Engine plugins](legacy_plugins.md). - -> **Note**: Docker Engine managed plugins are currently not supported -on Windows daemons. - -## Installing and using a plugin - -Plugins are distributed as Docker images and can be hosted on Docker Hub or on -a private registry. - -To install a plugin, use the `docker plugin install` command, which pulls the -plugin from Docker hub or your private registry, prompts you to grant -permissions or capabilities if necessary, and enables the plugin. - -To check the status of installed plugins, use the `docker plugin ls` command. -Plugins that start successfully are listed as enabled in the output. - -After a plugin is installed, you can use it as an option for another Docker -operation, such as creating a volume. - -In the following example, you install the `sshfs` plugin, verify that it is -enabled, and use it to create a volume. - -1. Install the `sshfs` plugin. - - ```bash - $ docker plugin install vieux/sshfs - - Plugin "vieux/sshfs" is requesting the following privileges: - - network: [host] - - capabilities: [CAP_SYS_ADMIN] - Do you grant the above permissions? [y/N] y - - vieux/sshfs - ``` - - The plugin requests 2 privileges: - - It needs access to the `host` network. - - It needs the `CAP_SYS_ADMIN` capability, which allows the plugin to run - the `mount` command. - -2. Check that the plugin is enabled in the output of `docker plugin ls`. - - ```bash - $ docker plugin ls - - ID NAME TAG DESCRIPTION ENABLED - 69553ca1d789 vieux/sshfs latest the `sshfs` plugin true - ``` - -3. Create a volume using the plugin. - This example mounts the `/remote` directory on host `1.2.3.4` into a - volume named `sshvolume`. This volume can now be mounted into containers. - - ```bash - $ docker volume create \ - -d vieux/sshfs \ - --name sshvolume \ - -o sshcmd=user@1.2.3.4:/remote - - sshvolume - ``` -4. Verify that the volume was created successfully. - - ```bash - $ docker volume ls - - DRIVER NAME - vieux/sshfs sshvolume - ``` - -5. Start a container that uses the volume `sshvolume`. - - ```bash - $ docker run -v sshvolume:/data busybox ls /data - - - ``` - -To disable a plugin, use the `docker plugin disable` command. To completely -remove it, use the `docker plugin remove` command. For other available -commands and options, see the -[command line reference](../reference/commandline/index.md). - -## Service creation using plugins - -In swarm mode, it is possible to create a service that allows for attaching -to networks or mounting volumes. Swarm schedules services based on plugin availability -on a node. In this example, a volume plugin is installed on a swarm worker and a volume -is created using the plugin. In the manager, a service is created with the relevant -mount options. It can be observed that the service is scheduled to run on the worker -node with the said volume plugin and volume. - -In the following example, node1 is the manager and node2 is the worker. - -1. Prepare manager. In node 1: - - ```bash - $ docker swarm init - Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager. - ``` - -2. Join swarm, install plugin and create volume on worker. In node 2: - - ```bash - $ docker swarm join \ - --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \ - 192.168.99.100:2377 - ``` - - ```bash - $ docker plugin install tiborvass/sample-volume-plugin - latest: Pulling from tiborvass/sample-volume-plugin - eb9c16fbdc53: Download complete - Digest: sha256:00b42de88f3a3e0342e7b35fa62394b0a9ceb54d37f4c50be5d3167899994639 - Status: Downloaded newer image for tiborvass/sample-volume-plugin:latest - Installed plugin tiborvass/sample-volume-plugin - ``` - - ```bash - $ docker volume create -d tiborvass/sample-volume-plugin --name pluginVol - ``` - -3. Create a service using the plugin and volume. In node1: - - ```bash - $ docker service create --name my-service --mount type=volume,volume-driver=tiborvass/sample-volume-plugin,source=pluginVol,destination=/tmp busybox top - - $ docker service ls - z1sj8bb8jnfn my-service replicated 1/1 busybox:latest - ``` - docker service ls shows service 1 instance of service running. - -4. Observe the task getting scheduled in node 2: - - ```bash - $ docker ps --format '{{.ID}}\t {{.Status}} {{.Names}} {{.Command}}' - 83fc1e842599 Up 2 days my-service.1.9jn59qzn7nbc3m0zt1hij12xs "top" - ``` - -## Developing a plugin - -#### The rootfs directory -The `rootfs` directory represents the root filesystem of the plugin. In this -example, it was created from a Dockerfile: - ->**Note:** The `/run/docker/plugins` directory is mandatory inside of the -plugin's filesystem for docker to communicate with the plugin. - -```bash -$ git clone https://github.com/vieux/docker-volume-sshfs -$ cd docker-volume-sshfs -$ docker build -t rootfsimage . -$ id=$(docker create rootfsimage true) # id was cd851ce43a403 when the image was created -$ sudo mkdir -p myplugin/rootfs -$ sudo docker export "$id" | sudo tar -x -C myplugin/rootfs -$ docker rm -vf "$id" -$ docker rmi rootfsimage -``` - -#### The config.json file - -The `config.json` file describes the plugin. See the [plugins config reference](config.md). - -Consider the following `config.json` file. - -```json -{ - "description": "sshFS plugin for Docker", - "documentation": "https://docs.docker.com/engine/extend/plugins/", - "entrypoint": ["/go/bin/docker-volume-sshfs"], - "network": { - "type": "host" - }, - "interface" : { - "types": ["docker.volumedriver/1.0"], - "socket": "sshfs.sock" - }, - "capabilities": ["CAP_SYS_ADMIN"] -} -``` - -This plugin is a volume driver. It requires a `host` network and the -`CAP_SYS_ADMIN` capability. It depends upon the `/go/bin/docker-volume-sshfs` -entrypoint and uses the `/run/docker/plugins/sshfs.sock` socket to communicate -with Docker Engine. This plugin has no runtime parameters. - -#### Creating the plugin - -A new plugin can be created by running -`docker plugin create ./path/to/plugin/data` where the plugin -data contains a plugin configuration file `config.json` and a root filesystem -in subdirectory `rootfs`. - -After that the plugin `` will show up in `docker plugin ls`. -Plugins can be pushed to remote registries with -`docker plugin push `. diff --git a/vendor/github.com/docker/docker/docs/extend/legacy_plugins.md b/vendor/github.com/docker/docker/docs/extend/legacy_plugins.md deleted file mode 100644 index 6ac914e36..000000000 --- a/vendor/github.com/docker/docker/docs/extend/legacy_plugins.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -redirect_from: -- "/engine/extend/plugins/" -title: "Use Docker Engine plugins" -description: "How to add additional functionality to Docker with plugins extensions" -keywords: "Examples, Usage, plugins, docker, documentation, user guide" ---- - - - -# Use Docker Engine plugins - -This document describes the Docker Engine plugins generally available in Docker -Engine. To view information on plugins managed by Docker, -refer to [Docker Engine plugin system](index.md). - -You can extend the capabilities of the Docker Engine by loading third-party -plugins. This page explains the types of plugins and provides links to several -volume and network plugins for Docker. - -## Types of plugins - -Plugins extend Docker's functionality. They come in specific types. For -example, a [volume plugin](plugins_volume.md) might enable Docker -volumes to persist across multiple Docker hosts and a -[network plugin](plugins_network.md) might provide network plumbing. - -Currently Docker supports authorization, volume and network driver plugins. In the future it -will support additional plugin types. - -## Installing a plugin - -Follow the instructions in the plugin's documentation. - -## Finding a plugin - -The sections below provide an inexhaustive overview of available plugins. - - - -### Network plugins - -Plugin | Description ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -[Contiv Networking](https://github.com/contiv/netplugin) | An open source network plugin to provide infrastructure and security policies for a multi-tenant micro services deployment, while providing an integration to physical network for non-container workload. Contiv Networking implements the remote driver and IPAM APIs available in Docker 1.9 onwards. -[Kuryr Network Plugin](https://github.com/openstack/kuryr) | A network plugin is developed as part of the OpenStack Kuryr project and implements the Docker networking (libnetwork) remote driver API by utilizing Neutron, the OpenStack networking service. It includes an IPAM driver as well. -[Weave Network Plugin](https://www.weave.works/docs/net/latest/introducing-weave/) | A network plugin that creates a virtual network that connects your Docker containers - across multiple hosts or clouds and enables automatic discovery of applications. Weave networks are resilient, partition tolerant, secure and work in partially connected networks, and other adverse environments - all configured with delightful simplicity. - -### Volume plugins - -Plugin | Description ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -[Azure File Storage plugin](https://github.com/Azure/azurefile-dockervolumedriver) | Lets you mount Microsoft [Azure File Storage](https://azure.microsoft.com/blog/azure-file-storage-now-generally-available/) shares to Docker containers as volumes using the SMB 3.0 protocol. [Learn more](https://azure.microsoft.com/blog/persistent-docker-volumes-with-azure-file-storage/). -[Blockbridge plugin](https://github.com/blockbridge/blockbridge-docker-volume) | A volume plugin that provides access to an extensible set of container-based persistent storage options. It supports single and multi-host Docker environments with features that include tenant isolation, automated provisioning, encryption, secure deletion, snapshots and QoS. -[Contiv Volume Plugin](https://github.com/contiv/volplugin) | An open source volume plugin that provides multi-tenant, persistent, distributed storage with intent based consumption. It has support for Ceph and NFS. -[Convoy plugin](https://github.com/rancher/convoy) | A volume plugin for a variety of storage back-ends including device mapper and NFS. It's a simple standalone executable written in Go and provides the framework to support vendor-specific extensions such as snapshots, backups and restore. -[DRBD plugin](https://www.drbd.org/en/supported-projects/docker) | A volume plugin that provides highly available storage replicated by [DRBD](https://www.drbd.org). Data written to the docker volume is replicated in a cluster of DRBD nodes. -[Flocker plugin](https://clusterhq.com/docker-plugin/) | A volume plugin that provides multi-host portable volumes for Docker, enabling you to run databases and other stateful containers and move them around across a cluster of machines. -[gce-docker plugin](https://github.com/mcuadros/gce-docker) | A volume plugin able to attach, format and mount Google Compute [persistent-disks](https://cloud.google.com/compute/docs/disks/persistent-disks). -[GlusterFS plugin](https://github.com/calavera/docker-volume-glusterfs) | A volume plugin that provides multi-host volumes management for Docker using GlusterFS. -[Horcrux Volume Plugin](https://github.com/muthu-r/horcrux) | A volume plugin that allows on-demand, version controlled access to your data. Horcrux is an open-source plugin, written in Go, and supports SCP, [Minio](https://www.minio.io) and Amazon S3. -[HPE 3Par Volume Plugin](https://github.com/hpe-storage/python-hpedockerplugin/) | A volume plugin that supports HPE 3Par and StoreVirtual iSCSI storage arrays. -[IPFS Volume Plugin](http://github.com/vdemeester/docker-volume-ipfs) | An open source volume plugin that allows using an [ipfs](https://ipfs.io/) filesystem as a volume. -[Keywhiz plugin](https://github.com/calavera/docker-volume-keywhiz) | A plugin that provides credentials and secret management using Keywhiz as a central repository. -[Local Persist Plugin](https://github.com/CWSpear/local-persist) | A volume plugin that extends the default `local` driver's functionality by allowing you specify a mountpoint anywhere on the host, which enables the files to *always persist*, even if the volume is removed via `docker volume rm`. -[NetApp Plugin](https://github.com/NetApp/netappdvp) (nDVP) | A volume plugin that provides direct integration with the Docker ecosystem for the NetApp storage portfolio. The nDVP package supports the provisioning and management of storage resources from the storage platform to Docker hosts, with a robust framework for adding additional platforms in the future. -[Netshare plugin](https://github.com/ContainX/docker-volume-netshare) | A volume plugin that provides volume management for NFS 3/4, AWS EFS and CIFS file systems. -[OpenStorage Plugin](https://github.com/libopenstorage/openstorage) | A cluster-aware volume plugin that provides volume management for file and block storage solutions. It implements a vendor neutral specification for implementing extensions such as CoS, encryption, and snapshots. It has example drivers based on FUSE, NFS, NBD and EBS to name a few. -[Portworx Volume Plugin](https://github.com/portworx/px-dev) | A volume plugin that turns any server into a scale-out converged compute/storage node, providing container granular storage and highly available volumes across any node, using a shared-nothing storage backend that works with any docker scheduler. -[Quobyte Volume Plugin](https://github.com/quobyte/docker-volume) | A volume plugin that connects Docker to [Quobyte](http://www.quobyte.com/containers)'s data center file system, a general-purpose scalable and fault-tolerant storage platform. -[REX-Ray plugin](https://github.com/emccode/rexray) | A volume plugin which is written in Go and provides advanced storage functionality for many platforms including VirtualBox, EC2, Google Compute Engine, OpenStack, and EMC. -[Virtuozzo Storage and Ploop plugin](https://github.com/virtuozzo/docker-volume-ploop) | A volume plugin with support for Virtuozzo Storage distributed cloud file system as well as ploop devices. -[VMware vSphere Storage Plugin](https://github.com/vmware/docker-volume-vsphere) | Docker Volume Driver for vSphere enables customers to address persistent storage requirements for Docker containers in vSphere environments. - -### Authorization plugins - - Plugin | Description -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - [Twistlock AuthZ Broker](https://github.com/twistlock/authz) | A basic extendable authorization plugin that runs directly on the host or inside a container. This plugin allows you to define user policies that it evaluates during authorization. Basic authorization is provided if Docker daemon is started with the --tlsverify flag (username is extracted from the certificate common name). - -## Troubleshooting a plugin - -If you are having problems with Docker after loading a plugin, ask the authors -of the plugin for help. The Docker team may not be able to assist you. - -## Writing a plugin - -If you are interested in writing a plugin for Docker, or seeing how they work -under the hood, see the [docker plugins reference](plugin_api.md). diff --git a/vendor/github.com/docker/docker/docs/extend/plugin_api.md b/vendor/github.com/docker/docker/docs/extend/plugin_api.md deleted file mode 100644 index 693b77a2f..000000000 --- a/vendor/github.com/docker/docker/docs/extend/plugin_api.md +++ /dev/null @@ -1,196 +0,0 @@ ---- -title: "Plugins API" -description: "How to write Docker plugins extensions " -keywords: "API, Usage, plugins, documentation, developer" ---- - - - -# Docker Plugin API - -Docker plugins are out-of-process extensions which add capabilities to the -Docker Engine. - -This document describes the Docker Engine plugin API. To view information on -plugins managed by Docker Engine, refer to [Docker Engine plugin system](index.md). - -This page is intended for people who want to develop their own Docker plugin. -If you just want to learn about or use Docker plugins, look -[here](legacy_plugins.md). - -## What plugins are - -A plugin is a process running on the same or a different host as the docker daemon, -which registers itself by placing a file on the same docker host in one of the plugin -directories described in [Plugin discovery](#plugin-discovery). - -Plugins have human-readable names, which are short, lowercase strings. For -example, `flocker` or `weave`. - -Plugins can run inside or outside containers. Currently running them outside -containers is recommended. - -## Plugin discovery - -Docker discovers plugins by looking for them in the plugin directory whenever a -user or container tries to use one by name. - -There are three types of files which can be put in the plugin directory. - -* `.sock` files are UNIX domain sockets. -* `.spec` files are text files containing a URL, such as `unix:///other.sock` or `tcp://localhost:8080`. -* `.json` files are text files containing a full json specification for the plugin. - -Plugins with UNIX domain socket files must run on the same docker host, whereas -plugins with spec or json files can run on a different host if a remote URL is specified. - -UNIX domain socket files must be located under `/run/docker/plugins`, whereas -spec files can be located either under `/etc/docker/plugins` or `/usr/lib/docker/plugins`. - -The name of the file (excluding the extension) determines the plugin name. - -For example, the `flocker` plugin might create a UNIX socket at -`/run/docker/plugins/flocker.sock`. - -You can define each plugin into a separated subdirectory if you want to isolate definitions from each other. -For example, you can create the `flocker` socket under `/run/docker/plugins/flocker/flocker.sock` and only -mount `/run/docker/plugins/flocker` inside the `flocker` container. - -Docker always searches for unix sockets in `/run/docker/plugins` first. It checks for spec or json files under -`/etc/docker/plugins` and `/usr/lib/docker/plugins` if the socket doesn't exist. The directory scan stops as -soon as it finds the first plugin definition with the given name. - -### JSON specification - -This is the JSON format for a plugin: - -```json -{ - "Name": "plugin-example", - "Addr": "https://example.com/docker/plugin", - "TLSConfig": { - "InsecureSkipVerify": false, - "CAFile": "/usr/shared/docker/certs/example-ca.pem", - "CertFile": "/usr/shared/docker/certs/example-cert.pem", - "KeyFile": "/usr/shared/docker/certs/example-key.pem" - } -} -``` - -The `TLSConfig` field is optional and TLS will only be verified if this configuration is present. - -## Plugin lifecycle - -Plugins should be started before Docker, and stopped after Docker. For -example, when packaging a plugin for a platform which supports `systemd`, you -might use [`systemd` dependencies]( -http://www.freedesktop.org/software/systemd/man/systemd.unit.html#Before=) to -manage startup and shutdown order. - -When upgrading a plugin, you should first stop the Docker daemon, upgrade the -plugin, then start Docker again. - -## Plugin activation - -When a plugin is first referred to -- either by a user referring to it by name -(e.g. `docker run --volume-driver=foo`) or a container already configured to -use a plugin being started -- Docker looks for the named plugin in the plugin -directory and activates it with a handshake. See Handshake API below. - -Plugins are *not* activated automatically at Docker daemon startup. Rather, -they are activated only lazily, or on-demand, when they are needed. - -## Systemd socket activation - -Plugins may also be socket activated by `systemd`. The official [Plugins helpers](https://github.com/docker/go-plugins-helpers) -natively supports socket activation. In order for a plugin to be socket activated it needs -a `service` file and a `socket` file. - -The `service` file (for example `/lib/systemd/system/your-plugin.service`): - -``` -[Unit] -Description=Your plugin -Before=docker.service -After=network.target your-plugin.socket -Requires=your-plugin.socket docker.service - -[Service] -ExecStart=/usr/lib/docker/your-plugin - -[Install] -WantedBy=multi-user.target -``` -The `socket` file (for example `/lib/systemd/system/your-plugin.socket`): - -``` -[Unit] -Description=Your plugin - -[Socket] -ListenStream=/run/docker/plugins/your-plugin.sock - -[Install] -WantedBy=sockets.target -``` - -This will allow plugins to be actually started when the Docker daemon connects to -the sockets they're listening on (for instance the first time the daemon uses them -or if one of the plugin goes down accidentally). - -## API design - -The Plugin API is RPC-style JSON over HTTP, much like webhooks. - -Requests flow *from* the Docker daemon *to* the plugin. So the plugin needs to -implement an HTTP server and bind this to the UNIX socket mentioned in the -"plugin discovery" section. - -All requests are HTTP `POST` requests. - -The API is versioned via an Accept header, which currently is always set to -`application/vnd.docker.plugins.v1+json`. - -## Handshake API - -Plugins are activated via the following "handshake" API call. - -### /Plugin.Activate - -**Request:** empty body - -**Response:** -``` -{ - "Implements": ["VolumeDriver"] -} -``` - -Responds with a list of Docker subsystems which this plugin implements. -After activation, the plugin will then be sent events from this subsystem. - -Possible values are: - -* [`authz`](plugins_authorization.md) -* [`NetworkDriver`](plugins_network.md) -* [`VolumeDriver`](plugins_volume.md) - - -## Plugin retries - -Attempts to call a method on a plugin are retried with an exponential backoff -for up to 30 seconds. This may help when packaging plugins as containers, since -it gives plugin containers a chance to start up before failing any user -containers which depend on them. - -## Plugins helpers - -To ease plugins development, we're providing an `sdk` for each kind of plugins -currently supported by Docker at [docker/go-plugins-helpers](https://github.com/docker/go-plugins-helpers). diff --git a/vendor/github.com/docker/docker/docs/extend/plugins_authorization.md b/vendor/github.com/docker/docker/docs/extend/plugins_authorization.md deleted file mode 100644 index ac1837f75..000000000 --- a/vendor/github.com/docker/docker/docs/extend/plugins_authorization.md +++ /dev/null @@ -1,260 +0,0 @@ ---- -title: "Access authorization plugin" -description: "How to create authorization plugins to manage access control to your Docker daemon." -keywords: "security, authorization, authentication, docker, documentation, plugin, extend" -redirect_from: -- "/engine/extend/authorization/" ---- - - - -# Create an authorization plugin - -This document describes the Docker Engine plugins generally available in Docker -Engine. To view information on plugins managed by Docker Engine, -refer to [Docker Engine plugin system](index.md). - -Docker's out-of-the-box authorization model is all or nothing. Any user with -permission to access the Docker daemon can run any Docker client command. The -same is true for callers using Docker's Engine API to contact the daemon. If you -require greater access control, you can create authorization plugins and add -them to your Docker daemon configuration. Using an authorization plugin, a -Docker administrator can configure granular access policies for managing access -to Docker daemon. - -Anyone with the appropriate skills can develop an authorization plugin. These -skills, at their most basic, are knowledge of Docker, understanding of REST, and -sound programming knowledge. This document describes the architecture, state, -and methods information available to an authorization plugin developer. - -## Basic principles - -Docker's [plugin infrastructure](plugin_api.md) enables -extending Docker by loading, removing and communicating with -third-party components using a generic API. The access authorization subsystem -was built using this mechanism. - -Using this subsystem, you don't need to rebuild the Docker daemon to add an -authorization plugin. You can add a plugin to an installed Docker daemon. You do -need to restart the Docker daemon to add a new plugin. - -An authorization plugin approves or denies requests to the Docker daemon based -on both the current authentication context and the command context. The -authentication context contains all user details and the authentication method. -The command context contains all the relevant request data. - -Authorization plugins must follow the rules described in [Docker Plugin API](plugin_api.md). -Each plugin must reside within directories described under the -[Plugin discovery](plugin_api.md#plugin-discovery) section. - -**Note**: the abbreviations `AuthZ` and `AuthN` mean authorization and authentication -respectively. - -## Default user authorization mechanism - -If TLS is enabled in the [Docker daemon](https://docs.docker.com/engine/security/https/), the default user authorization flow extracts the user details from the certificate subject name. -That is, the `User` field is set to the client certificate subject common name, and the `AuthenticationMethod` field is set to `TLS`. - -## Basic architecture - -You are responsible for registering your plugin as part of the Docker daemon -startup. You can install multiple plugins and chain them together. This chain -can be ordered. Each request to the daemon passes in order through the chain. -Only when all the plugins grant access to the resource, is the access granted. - -When an HTTP request is made to the Docker daemon through the CLI or via the -Engine API, the authentication subsystem passes the request to the installed -authentication plugin(s). The request contains the user (caller) and command -context. The plugin is responsible for deciding whether to allow or deny the -request. - -The sequence diagrams below depict an allow and deny authorization flow: - -![Authorization Allow flow](images/authz_allow.png) - -![Authorization Deny flow](images/authz_deny.png) - -Each request sent to the plugin includes the authenticated user, the HTTP -headers, and the request/response body. Only the user name and the -authentication method used are passed to the plugin. Most importantly, no user -credentials or tokens are passed. Finally, not all request/response bodies -are sent to the authorization plugin. Only those request/response bodies where -the `Content-Type` is either `text/*` or `application/json` are sent. - -For commands that can potentially hijack the HTTP connection (`HTTP -Upgrade`), such as `exec`, the authorization plugin is only called for the -initial HTTP requests. Once the plugin approves the command, authorization is -not applied to the rest of the flow. Specifically, the streaming data is not -passed to the authorization plugins. For commands that return chunked HTTP -response, such as `logs` and `events`, only the HTTP request is sent to the -authorization plugins. - -During request/response processing, some authorization flows might -need to do additional queries to the Docker daemon. To complete such flows, -plugins can call the daemon API similar to a regular user. To enable these -additional queries, the plugin must provide the means for an administrator to -configure proper authentication and security policies. - -## Docker client flows - -To enable and configure the authorization plugin, the plugin developer must -support the Docker client interactions detailed in this section. - -### Setting up Docker daemon - -Enable the authorization plugin with a dedicated command line flag in the -`--authorization-plugin=PLUGIN_ID` format. The flag supplies a `PLUGIN_ID` -value. This value can be the plugin’s socket or a path to a specification file. -Authorization plugins can be loaded without restarting the daemon. Refer -to the [`dockerd` documentation](../reference/commandline/dockerd.md#configuration-reloading) for more information. - -```bash -$ dockerd --authorization-plugin=plugin1 --authorization-plugin=plugin2,... -``` - -Docker's authorization subsystem supports multiple `--authorization-plugin` parameters. - -### Calling authorized command (allow) - -```bash -$ docker pull centos -... -f1b10cd84249: Pull complete -... -``` - -### Calling unauthorized command (deny) - -```bash -$ docker pull centos -... -docker: Error response from daemon: authorization denied by plugin PLUGIN_NAME: volumes are not allowed. -``` - -### Error from plugins - -```bash -$ docker pull centos -... -docker: Error response from daemon: plugin PLUGIN_NAME failed with error: AuthZPlugin.AuthZReq: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. -``` - -## API schema and implementation - -In addition to Docker's standard plugin registration method, each plugin -should implement the following two methods: - -* `/AuthZPlugin.AuthZReq` This authorize request method is called before the Docker daemon processes the client request. - -* `/AuthZPlugin.AuthZRes` This authorize response method is called before the response is returned from Docker daemon to the client. - -#### /AuthZPlugin.AuthZReq - -**Request**: - -```json -{ - "User": "The user identification", - "UserAuthNMethod": "The authentication method used", - "RequestMethod": "The HTTP method", - "RequestURI": "The HTTP request URI", - "RequestBody": "Byte array containing the raw HTTP request body", - "RequestHeader": "Byte array containing the raw HTTP request header as a map[string][]string " -} -``` - -**Response**: - -```json -{ - "Allow": "Determined whether the user is allowed or not", - "Msg": "The authorization message", - "Err": "The error message if things go wrong" -} -``` -#### /AuthZPlugin.AuthZRes - -**Request**: - -```json -{ - "User": "The user identification", - "UserAuthNMethod": "The authentication method used", - "RequestMethod": "The HTTP method", - "RequestURI": "The HTTP request URI", - "RequestBody": "Byte array containing the raw HTTP request body", - "RequestHeader": "Byte array containing the raw HTTP request header as a map[string][]string", - "ResponseBody": "Byte array containing the raw HTTP response body", - "ResponseHeader": "Byte array containing the raw HTTP response header as a map[string][]string", - "ResponseStatusCode":"Response status code" -} -``` - -**Response**: - -```json -{ - "Allow": "Determined whether the user is allowed or not", - "Msg": "The authorization message", - "Err": "The error message if things go wrong" -} -``` - -### Request authorization - -Each plugin must support two request authorization messages formats, one from the daemon to the plugin and then from the plugin to the daemon. The tables below detail the content expected in each message. - -#### Daemon -> Plugin - -Name | Type | Description ------------------------|-------------------|------------------------------------------------------- -User | string | The user identification -Authentication method | string | The authentication method used -Request method | enum | The HTTP method (GET/DELETE/POST) -Request URI | string | The HTTP request URI including API version (e.g., v.1.17/containers/json) -Request headers | map[string]string | Request headers as key value pairs (without the authorization header) -Request body | []byte | Raw request body - - -#### Plugin -> Daemon - -Name | Type | Description ---------|--------|---------------------------------------------------------------------------------- -Allow | bool | Boolean value indicating whether the request is allowed or denied -Msg | string | Authorization message (will be returned to the client in case the access is denied) -Err | string | Error message (will be returned to the client in case the plugin encounter an error. The string value supplied may appear in logs, so should not include confidential information) - -### Response authorization - -The plugin must support two authorization messages formats, one from the daemon to the plugin and then from the plugin to the daemon. The tables below detail the content expected in each message. - -#### Daemon -> Plugin - - -Name | Type | Description ------------------------ |------------------ |---------------------------------------------------- -User | string | The user identification -Authentication method | string | The authentication method used -Request method | string | The HTTP method (GET/DELETE/POST) -Request URI | string | The HTTP request URI including API version (e.g., v.1.17/containers/json) -Request headers | map[string]string | Request headers as key value pairs (without the authorization header) -Request body | []byte | Raw request body -Response status code | int | Status code from the docker daemon -Response headers | map[string]string | Response headers as key value pairs -Response body | []byte | Raw docker daemon response body - - -#### Plugin -> Daemon - -Name | Type | Description ---------|--------|---------------------------------------------------------------------------------- -Allow | bool | Boolean value indicating whether the response is allowed or denied -Msg | string | Authorization message (will be returned to the client in case the access is denied) -Err | string | Error message (will be returned to the client in case the plugin encounter an error. The string value supplied may appear in logs, so should not include confidential information) diff --git a/vendor/github.com/docker/docker/docs/extend/plugins_graphdriver.md b/vendor/github.com/docker/docker/docs/extend/plugins_graphdriver.md deleted file mode 100644 index d91c383b5..000000000 --- a/vendor/github.com/docker/docker/docs/extend/plugins_graphdriver.md +++ /dev/null @@ -1,376 +0,0 @@ ---- -title: "Graphdriver plugins" -description: "How to manage image and container filesystems with external plugins" -keywords: "Examples, Usage, storage, image, docker, data, graph, plugin, api" -advisory: experimental ---- - - - - -## Changelog - -### 1.13.0 - -- Support v2 plugins - -# Docker graph driver plugins - -Docker graph driver plugins enable admins to use an external/out-of-process -graph driver for use with Docker engine. This is an alternative to using the -built-in storage drivers, such as aufs/overlay/devicemapper/btrfs. - -You need to install and enable the plugin and then restart the Docker daemon -before using the plugin. See the following example for the correct ordering -of steps. - -``` -$ docker plugin install cpuguy83/docker-overlay2-graphdriver-plugin # this command also enables the driver - -$ pkill dockerd -$ dockerd --experimental -s cpuguy83/docker-overlay2-graphdriver-plugin -``` - -# Write a graph driver plugin - -See the [plugin documentation](/docs/extend/index.md) for detailed information -on the underlying plugin protocol. - - -## Graph Driver plugin protocol - -If a plugin registers itself as a `GraphDriver` when activated, then it is -expected to provide the rootfs for containers as well as image layer storage. - -### /GraphDriver.Init - -**Request**: -```json -{ - "Home": "/graph/home/path", - "Opts": [], - "UIDMaps": [], - "GIDMaps": [] -} -``` - -Initialize the graph driver plugin with a home directory and array of options. -These are passed through from the user, but the plugin is not required to parse -or honor them. - -The request also includes a list of UID and GID mappings, structed as follows: -```json -{ - "ContainerID": 0, - "HostID": 0, - "Size": 0 -} -``` - -**Response**: -```json -{ - "Err": "" -} -``` - -Respond with a non-empty string error if an error occurred. - - -### /GraphDriver.Create - -**Request**: -```json -{ - "ID": "46fe8644f2572fd1e505364f7581e0c9dbc7f14640bd1fb6ce97714fb6fc5187", - "Parent": "2cd9c322cb78a55e8212aa3ea8425a4180236d7106938ec921d0935a4b8ca142", - "MountLabel": "", - "StorageOpt": {} -} -``` - -Create a new, empty, read-only filesystem layer with the specified -`ID`, `Parent` and `MountLabel`. If `Parent` is an empty string, there is no -parent layer. `StorageOpt` is map of strings which indicate storage options. - -**Response**: -```json -{ - "Err": "" -} -``` - -Respond with a non-empty string error if an error occurred. - -### /GraphDriver.CreateReadWrite - -**Request**: -```json -{ - "ID": "46fe8644f2572fd1e505364f7581e0c9dbc7f14640bd1fb6ce97714fb6fc5187", - "Parent": "2cd9c322cb78a55e8212aa3ea8425a4180236d7106938ec921d0935a4b8ca142", - "MountLabel": "", - "StorageOpt": {} -} -``` - -Similar to `/GraphDriver.Create` but creates a read-write filesystem layer. - -### /GraphDriver.Remove - -**Request**: -```json -{ - "ID": "46fe8644f2572fd1e505364f7581e0c9dbc7f14640bd1fb6ce97714fb6fc5187" -} -``` - -Remove the filesystem layer with this given `ID`. - -**Response**: -```json -{ - "Err": "" -} -``` - -Respond with a non-empty string error if an error occurred. - -### /GraphDriver.Get - -**Request**: -```json -{ - "ID": "46fe8644f2572fd1e505364f7581e0c9dbc7f14640bd1fb6ce97714fb6fc5187", - "MountLabel": "" -} -``` - -Get the mountpoint for the layered filesystem referred to by the given `ID`. - -**Response**: -```json -{ - "Dir": "/var/mygraph/46fe8644f2572fd1e505364f7581e0c9dbc7f14640bd1fb6ce97714fb6fc5187", - "Err": "" -} -``` - -Respond with the absolute path to the mounted layered filesystem. -Respond with a non-empty string error if an error occurred. - -### /GraphDriver.Put - -**Request**: -```json -{ - "ID": "46fe8644f2572fd1e505364f7581e0c9dbc7f14640bd1fb6ce97714fb6fc5187" -} -``` - -Release the system resources for the specified `ID`, such as unmounting the -filesystem layer. - -**Response**: -```json -{ - "Err": "" -} -``` - -Respond with a non-empty string error if an error occurred. - -### /GraphDriver.Exists - -**Request**: -```json -{ - "ID": "46fe8644f2572fd1e505364f7581e0c9dbc7f14640bd1fb6ce97714fb6fc5187" -} -``` - -Determine if a filesystem layer with the specified `ID` exists. - -**Response**: -```json -{ - "Exists": true -} -``` - -Respond with a boolean for whether or not the filesystem layer with the specified -`ID` exists. - -### /GraphDriver.Status - -**Request**: -```json -{} -``` - -Get low-level diagnostic information about the graph driver. - -**Response**: -```json -{ - "Status": [[]] -} -``` - -Respond with a 2-D array with key/value pairs for the underlying status -information. - - -### /GraphDriver.GetMetadata - -**Request**: -```json -{ - "ID": "46fe8644f2572fd1e505364f7581e0c9dbc7f14640bd1fb6ce97714fb6fc5187" -} -``` - -Get low-level diagnostic information about the layered filesystem with the -with the specified `ID` - -**Response**: -```json -{ - "Metadata": {}, - "Err": "" -} -``` - -Respond with a set of key/value pairs containing the low-level diagnostic -information about the layered filesystem. -Respond with a non-empty string error if an error occurred. - -### /GraphDriver.Cleanup - -**Request**: -```json -{} -``` - -Perform necessary tasks to release resources help by the plugin, such as -unmounting all the layered file systems. - -**Response**: -```json -{ - "Err": "" -} -``` - -Respond with a non-empty string error if an error occurred. - - -### /GraphDriver.Diff - -**Request**: -```json -{ - "ID": "46fe8644f2572fd1e505364f7581e0c9dbc7f14640bd1fb6ce97714fb6fc5187", - "Parent": "2cd9c322cb78a55e8212aa3ea8425a4180236d7106938ec921d0935a4b8ca142" -} -``` - -Get an archive of the changes between the filesystem layers specified by the `ID` -and `Parent`. `Parent` may be an empty string, in which case there is no parent. - -**Response**: -``` -{{ TAR STREAM }} -``` - -### /GraphDriver.Changes - -**Request**: -```json -{ - "ID": "46fe8644f2572fd1e505364f7581e0c9dbc7f14640bd1fb6ce97714fb6fc5187", - "Parent": "2cd9c322cb78a55e8212aa3ea8425a4180236d7106938ec921d0935a4b8ca142" -} -``` - -Get a list of changes between the filesystem layers specified by the `ID` and -`Parent`. If `Parent` is an empty string, there is no parent. - -**Response**: -```json -{ - "Changes": [{}], - "Err": "" -} -``` - -Respond with a list of changes. The structure of a change is: -```json - "Path": "/some/path", - "Kind": 0, -``` - -Where the `Path` is the filesystem path within the layered filesystem that is -changed and `Kind` is an integer specifying the type of change that occurred: - -- 0 - Modified -- 1 - Added -- 2 - Deleted - -Respond with a non-empty string error if an error occurred. - -### /GraphDriver.ApplyDiff - -**Request**: -``` -{{ TAR STREAM }} -``` - -Extract the changeset from the given diff into the layer with the specified `ID` -and `Parent` - -**Query Parameters**: - -- id (required)- the `ID` of the new filesystem layer to extract the diff to -- parent (required)- the `Parent` of the given `ID` - -**Response**: -```json -{ - "Size": 512366, - "Err": "" -} -``` - -Respond with the size of the new layer in bytes. -Respond with a non-empty string error if an error occurred. - -### /GraphDriver.DiffSize - -**Request**: -```json -{ - "ID": "46fe8644f2572fd1e505364f7581e0c9dbc7f14640bd1fb6ce97714fb6fc5187", - "Parent": "2cd9c322cb78a55e8212aa3ea8425a4180236d7106938ec921d0935a4b8ca142" -} -``` - -Calculate the changes between the specified `ID` - -**Response**: -```json -{ - "Size": 512366, - "Err": "" -} -``` - -Respond with the size changes between the specified `ID` and `Parent` -Respond with a non-empty string error if an error occurred. diff --git a/vendor/github.com/docker/docker/docs/extend/plugins_network.md b/vendor/github.com/docker/docker/docs/extend/plugins_network.md deleted file mode 100644 index a974862fa..000000000 --- a/vendor/github.com/docker/docker/docs/extend/plugins_network.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: "Docker network driver plugins" -description: "Network driver plugins." -keywords: "Examples, Usage, plugins, docker, documentation, user guide" ---- - - - -# Engine network driver plugins - -This document describes Docker Engine network driver plugins generally -available in Docker Engine. To view information on plugins -managed by Docker Engine, refer to [Docker Engine plugin system](index.md). - -Docker Engine network plugins enable Engine deployments to be extended to -support a wide range of networking technologies, such as VXLAN, IPVLAN, MACVLAN -or something completely different. Network driver plugins are supported via the -LibNetwork project. Each plugin is implemented as a "remote driver" for -LibNetwork, which shares plugin infrastructure with Engine. Effectively, network -driver plugins are activated in the same way as other plugins, and use the same -kind of protocol. - -## Network driver plugins and swarm mode - -Docker 1.12 adds support for cluster management and orchestration called -[swarm mode](https://docs.docker.com/engine/swarm/). Docker Engine running in swarm mode currently -only supports the built-in overlay driver for networking. Therefore existing -networking plugins will not work in swarm mode. - -When you run Docker Engine outside of swarm mode, all networking plugins that -worked in Docker 1.11 will continue to function normally. They do not require -any modification. - -## Using network driver plugins - -The means of installing and running a network driver plugin depend on the -particular plugin. So, be sure to install your plugin according to the -instructions obtained from the plugin developer. - -Once running however, network driver plugins are used just like the built-in -network drivers: by being mentioned as a driver in network-oriented Docker -commands. For example, - - $ docker network create --driver weave mynet - -Some network driver plugins are listed in [plugins](legacy_plugins.md) - -The `mynet` network is now owned by `weave`, so subsequent commands -referring to that network will be sent to the plugin, - - $ docker run --network=mynet busybox top - - -## Write a network plugin - -Network plugins implement the [Docker plugin -API](plugin_api.md) and the network plugin protocol - -## Network plugin protocol - -The network driver protocol, in addition to the plugin activation call, is -documented as part of libnetwork: -[https://github.com/docker/libnetwork/blob/master/docs/remote.md](https://github.com/docker/libnetwork/blob/master/docs/remote.md). - -# Related Information - -To interact with the Docker maintainers and other interested users, see the IRC channel `#docker-network`. - -- [Docker networks feature overview](https://docs.docker.com/engine/userguide/networking/) -- The [LibNetwork](https://github.com/docker/libnetwork) project diff --git a/vendor/github.com/docker/docker/docs/extend/plugins_volume.md b/vendor/github.com/docker/docker/docs/extend/plugins_volume.md deleted file mode 100644 index c060bf39b..000000000 --- a/vendor/github.com/docker/docker/docs/extend/plugins_volume.md +++ /dev/null @@ -1,276 +0,0 @@ ---- -title: "Volume plugins" -description: "How to manage data with external volume plugins" -keywords: "Examples, Usage, volume, docker, data, volumes, plugin, api" ---- - - - -# Write a volume plugin - -Docker Engine volume plugins enable Engine deployments to be integrated with -external storage systems, such as Amazon EBS, and enable data volumes to persist -beyond the lifetime of a single Engine host. See the -[plugin documentation](legacy_plugins.md) for more information. - -## Changelog - -### 1.13.0 - -- If used as part of the v2 plugin architecture, mountpoints that are part of paths returned by plugin have to be mounted under the directory specified by PropagatedMount in the plugin configuration [#26398](https://github.com/docker/docker/pull/26398) - -### 1.12.0 - -- Add `Status` field to `VolumeDriver.Get` response ([#21006](https://github.com/docker/docker/pull/21006#)) -- Add `VolumeDriver.Capabilities` to get capabilities of the volume driver([#22077](https://github.com/docker/docker/pull/22077)) - -### 1.10.0 - -- Add `VolumeDriver.Get` which gets the details about the volume ([#16534](https://github.com/docker/docker/pull/16534)) -- Add `VolumeDriver.List` which lists all volumes owned by the driver ([#16534](https://github.com/docker/docker/pull/16534)) - -### 1.8.0 - -- Initial support for volume driver plugins ([#14659](https://github.com/docker/docker/pull/14659)) - -## Command-line changes - -A volume plugin makes use of the `-v`and `--volume-driver` flag on the `docker run` command. The `-v` flag accepts a volume name and the `--volume-driver` flag a driver type, for example: - - $ docker run -ti -v volumename:/data --volume-driver=flocker busybox sh - -This command passes the `volumename` through to the volume plugin as a -user-given name for the volume. The `volumename` must not begin with a `/`. - -By having the user specify a `volumename`, a plugin can associate the volume -with an external volume beyond the lifetime of a single container or container -host. This can be used, for example, to move a stateful container from one -server to another. - -By specifying a `volumedriver` in conjunction with a `volumename`, users can use plugins such as [Flocker](https://clusterhq.com/docker-plugin/) to manage volumes external to a single host, such as those on EBS. - - -## Create a VolumeDriver - -The container creation endpoint (`/containers/create`) accepts a `VolumeDriver` -field of type `string` allowing to specify the name of the driver. It's default -value of `"local"` (the default driver for local volumes). - -## Volume plugin protocol - -If a plugin registers itself as a `VolumeDriver` when activated, then it is -expected to provide writeable paths on the host filesystem for the Docker -daemon to provide to containers to consume. - -The Docker daemon handles bind-mounting the provided paths into user -containers. - -> **Note**: Volume plugins should *not* write data to the `/var/lib/docker/` -> directory, including `/var/lib/docker/volumes`. The `/var/lib/docker/` -> directory is reserved for Docker. - -### /VolumeDriver.Create - -**Request**: -```json -{ - "Name": "volume_name", - "Opts": {} -} -``` - -Instruct the plugin that the user wants to create a volume, given a user -specified volume name. The plugin does not need to actually manifest the -volume on the filesystem yet (until Mount is called). -Opts is a map of driver specific options passed through from the user request. - -**Response**: -```json -{ - "Err": "" -} -``` - -Respond with a string error if an error occurred. - -### /VolumeDriver.Remove - -**Request**: -```json -{ - "Name": "volume_name" -} -``` - -Delete the specified volume from disk. This request is issued when a user invokes `docker rm -v` to remove volumes associated with a container. - -**Response**: -```json -{ - "Err": "" -} -``` - -Respond with a string error if an error occurred. - -### /VolumeDriver.Mount - -**Request**: -```json -{ - "Name": "volume_name", - "ID": "b87d7442095999a92b65b3d9691e697b61713829cc0ffd1bb72e4ccd51aa4d6c" -} -``` - -Docker requires the plugin to provide a volume, given a user specified volume -name. This is called once per container start. If the same volume_name is requested -more than once, the plugin may need to keep track of each new mount request and provision -at the first mount request and deprovision at the last corresponding unmount request. - -`ID` is a unique ID for the caller that is requesting the mount. - -**Response**: -```json -{ - "Mountpoint": "/path/to/directory/on/host", - "Err": "" -} -``` - -Respond with the path on the host filesystem where the volume has been made -available, and/or a string error if an error occurred. - -### /VolumeDriver.Path - -**Request**: -```json -{ - "Name": "volume_name" -} -``` - -Docker needs reminding of the path to the volume on the host. - -**Response**: -```json -{ - "Mountpoint": "/path/to/directory/on/host", - "Err": "" -} -``` - -Respond with the path on the host filesystem where the volume has been made -available, and/or a string error if an error occurred. `Mountpoint` is optional, -however the plugin may be queried again later if one is not provided. - -### /VolumeDriver.Unmount - -**Request**: -```json -{ - "Name": "volume_name", - "ID": "b87d7442095999a92b65b3d9691e697b61713829cc0ffd1bb72e4ccd51aa4d6c" -} -``` - -Indication that Docker no longer is using the named volume. This is called once -per container stop. Plugin may deduce that it is safe to deprovision it at -this point. - -`ID` is a unique ID for the caller that is requesting the mount. - -**Response**: -```json -{ - "Err": "" -} -``` - -Respond with a string error if an error occurred. - - -### /VolumeDriver.Get - -**Request**: -```json -{ - "Name": "volume_name" -} -``` - -Get the volume info. - - -**Response**: -```json -{ - "Volume": { - "Name": "volume_name", - "Mountpoint": "/path/to/directory/on/host", - "Status": {} - }, - "Err": "" -} -``` - -Respond with a string error if an error occurred. `Mountpoint` and `Status` are -optional. - - -### /VolumeDriver.List - -**Request**: -```json -{} -``` - -Get the list of volumes registered with the plugin. - -**Response**: -```json -{ - "Volumes": [ - { - "Name": "volume_name", - "Mountpoint": "/path/to/directory/on/host" - } - ], - "Err": "" -} -``` - -Respond with a string error if an error occurred. `Mountpoint` is optional. - -### /VolumeDriver.Capabilities - -**Request**: -```json -{} -``` - -Get the list of capabilities the driver supports. -The driver is not required to implement this endpoint, however in such cases -the default values will be taken. - -**Response**: -```json -{ - "Capabilities": { - "Scope": "global" - } -} -``` - -Supported scopes are `global` and `local`. Any other value in `Scope` will be -ignored and assumed to be `local`. Scope allows cluster managers to handle the -volume differently, for instance with a scope of `global`, the cluster manager -knows it only needs to create the volume once instead of on every engine. More -capabilities may be added in the future. diff --git a/vendor/github.com/docker/docker/docs/reference/builder.md b/vendor/github.com/docker/docker/docs/reference/builder.md deleted file mode 100644 index 6fa5a2415..000000000 --- a/vendor/github.com/docker/docker/docs/reference/builder.md +++ /dev/null @@ -1,1746 +0,0 @@ ---- -title: "Dockerfile reference" -description: "Dockerfiles use a simple DSL which allows you to automate the steps you would normally manually take to create an image." -keywords: "builder, docker, Dockerfile, automation, image creation" ---- - - - -# Dockerfile reference - -Docker can build images automatically by reading the instructions from a -`Dockerfile`. A `Dockerfile` is a text document that contains all the commands a -user could call on the command line to assemble an image. Using `docker build` -users can create an automated build that executes several command-line -instructions in succession. - -This page describes the commands you can use in a `Dockerfile`. When you are -done reading this page, refer to the [`Dockerfile` Best -Practices](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/) for a tip-oriented guide. - -## Usage - -The [`docker build`](commandline/build.md) command builds an image from -a `Dockerfile` and a *context*. The build's context is the files at a specified -location `PATH` or `URL`. The `PATH` is a directory on your local filesystem. -The `URL` is a Git repository location. - -A context is processed recursively. So, a `PATH` includes any subdirectories and -the `URL` includes the repository and its submodules. A simple build command -that uses the current directory as context: - - $ docker build . - Sending build context to Docker daemon 6.51 MB - ... - -The build is run by the Docker daemon, not by the CLI. The first thing a build -process does is send the entire context (recursively) to the daemon. In most -cases, it's best to start with an empty directory as context and keep your -Dockerfile in that directory. Add only the files needed for building the -Dockerfile. - ->**Warning**: Do not use your root directory, `/`, as the `PATH` as it causes ->the build to transfer the entire contents of your hard drive to the Docker ->daemon. - -To use a file in the build context, the `Dockerfile` refers to the file specified -in an instruction, for example, a `COPY` instruction. To increase the build's -performance, exclude files and directories by adding a `.dockerignore` file to -the context directory. For information about how to [create a `.dockerignore` -file](#dockerignore-file) see the documentation on this page. - -Traditionally, the `Dockerfile` is called `Dockerfile` and located in the root -of the context. You use the `-f` flag with `docker build` to point to a Dockerfile -anywhere in your file system. - - $ docker build -f /path/to/a/Dockerfile . - -You can specify a repository and tag at which to save the new image if -the build succeeds: - - $ docker build -t shykes/myapp . - -To tag the image into multiple repositories after the build, -add multiple `-t` parameters when you run the `build` command: - - $ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest . - -Before the Docker daemon runs the instructions in the `Dockerfile`, it performs -a preliminary validation of the `Dockerfile` and returns an error if the syntax is incorrect: - - $ docker build -t test/myapp . - Sending build context to Docker daemon 2.048 kB - Error response from daemon: Unknown instruction: RUNCMD - -The Docker daemon runs the instructions in the `Dockerfile` one-by-one, -committing the result of each instruction -to a new image if necessary, before finally outputting the ID of your -new image. The Docker daemon will automatically clean up the context you -sent. - -Note that each instruction is run independently, and causes a new image -to be created - so `RUN cd /tmp` will not have any effect on the next -instructions. - -Whenever possible, Docker will re-use the intermediate images (cache), -to accelerate the `docker build` process significantly. This is indicated by -the `Using cache` message in the console output. -(For more information, see the [Build cache section](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#/build-cache)) in the -`Dockerfile` best practices guide: - - $ docker build -t svendowideit/ambassador . - Sending build context to Docker daemon 15.36 kB - Step 1/4 : FROM alpine:3.2 - ---> 31f630c65071 - Step 2/4 : MAINTAINER SvenDowideit@home.org.au - ---> Using cache - ---> 2a1c91448f5f - Step 3/4 : RUN apk update && apk add socat && rm -r /var/cache/ - ---> Using cache - ---> 21ed6e7fbb73 - Step 4/4 : CMD env | grep _TCP= | (sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' && echo wait) | sh - ---> Using cache - ---> 7ea8aef582cc - Successfully built 7ea8aef582cc - -Build cache is only used from images that have a local parent chain. This means -that these images were created by previous builds or the whole chain of images -was loaded with `docker load`. If you wish to use build cache of a specific -image you can specify it with `--cache-from` option. Images specified with -`--cache-from` do not need to have a parent chain and may be pulled from other -registries. - -When you're done with your build, you're ready to look into [*Pushing a -repository to its registry*](https://docs.docker.com/engine/tutorials/dockerrepos/#/contributing-to-docker-hub). - -## Format - -Here is the format of the `Dockerfile`: - -```Dockerfile -# Comment -INSTRUCTION arguments -``` - -The instruction is not case-sensitive. However, convention is for them to -be UPPERCASE to distinguish them from arguments more easily. - - -Docker runs instructions in a `Dockerfile` in order. **The first -instruction must be \`FROM\`** in order to specify the [*Base -Image*](glossary.md#base-image) from which you are building. - -Docker treats lines that *begin* with `#` as a comment, unless the line is -a valid [parser directive](#parser-directives). A `#` marker anywhere -else in a line is treated as an argument. This allows statements like: - -```Dockerfile -# Comment -RUN echo 'we are running some # of cool things' -``` - -Line continuation characters are not supported in comments. - -## Parser directives - -Parser directives are optional, and affect the way in which subsequent lines -in a `Dockerfile` are handled. Parser directives do not add layers to the build, -and will not be shown as a build step. Parser directives are written as a -special type of comment in the form `# directive=value`. A single directive -may only be used once. - -Once a comment, empty line or builder instruction has been processed, Docker -no longer looks for parser directives. Instead it treats anything formatted -as a parser directive as a comment and does not attempt to validate if it might -be a parser directive. Therefore, all parser directives must be at the very -top of a `Dockerfile`. - -Parser directives are not case-sensitive. However, convention is for them to -be lowercase. Convention is also to include a blank line following any -parser directives. Line continuation characters are not supported in parser -directives. - -Due to these rules, the following examples are all invalid: - -Invalid due to line continuation: - -```Dockerfile -# direc \ -tive=value -``` - -Invalid due to appearing twice: - -```Dockerfile -# directive=value1 -# directive=value2 - -FROM ImageName -``` - -Treated as a comment due to appearing after a builder instruction: - -```Dockerfile -FROM ImageName -# directive=value -``` - -Treated as a comment due to appearing after a comment which is not a parser -directive: - -```Dockerfile -# About my dockerfile -FROM ImageName -# directive=value -``` - -The unknown directive is treated as a comment due to not being recognized. In -addition, the known directive is treated as a comment due to appearing after -a comment which is not a parser directive. - -```Dockerfile -# unknowndirective=value -# knowndirective=value -``` - -Non line-breaking whitespace is permitted in a parser directive. Hence, the -following lines are all treated identically: - -```Dockerfile -#directive=value -# directive =value -# directive= value -# directive = value -# dIrEcTiVe=value -``` - -The following parser directive is supported: - -* `escape` - -## escape - - # escape=\ (backslash) - -Or - - # escape=` (backtick) - -The `escape` directive sets the character used to escape characters in a -`Dockerfile`. If not specified, the default escape character is `\`. - -The escape character is used both to escape characters in a line, and to -escape a newline. This allows a `Dockerfile` instruction to -span multiple lines. Note that regardless of whether the `escape` parser -directive is included in a `Dockerfile`, *escaping is not performed in -a `RUN` command, except at the end of a line.* - -Setting the escape character to `` ` `` is especially useful on -`Windows`, where `\` is the directory path separator. `` ` `` is consistent -with [Windows PowerShell](https://technet.microsoft.com/en-us/library/hh847755.aspx). - -Consider the following example which would fail in a non-obvious way on -`Windows`. The second `\` at the end of the second line would be interpreted as an -escape for the newline, instead of a target of the escape from the first `\`. -Similarly, the `\` at the end of the third line would, assuming it was actually -handled as an instruction, cause it be treated as a line continuation. The result -of this dockerfile is that second and third lines are considered a single -instruction: - -```Dockerfile -FROM microsoft/nanoserver -COPY testfile.txt c:\\ -RUN dir c:\ -``` - -Results in: - - PS C:\John> docker build -t cmd . - Sending build context to Docker daemon 3.072 kB - Step 1/2 : FROM microsoft/nanoserver - ---> 22738ff49c6d - Step 2/2 : COPY testfile.txt c:\RUN dir c: - GetFileAttributesEx c:RUN: The system cannot find the file specified. - PS C:\John> - -One solution to the above would be to use `/` as the target of both the `COPY` -instruction, and `dir`. However, this syntax is, at best, confusing as it is not -natural for paths on `Windows`, and at worst, error prone as not all commands on -`Windows` support `/` as the path separator. - -By adding the `escape` parser directive, the following `Dockerfile` succeeds as -expected with the use of natural platform semantics for file paths on `Windows`: - - # escape=` - - FROM microsoft/nanoserver - COPY testfile.txt c:\ - RUN dir c:\ - -Results in: - - PS C:\John> docker build -t succeeds --no-cache=true . - Sending build context to Docker daemon 3.072 kB - Step 1/3 : FROM microsoft/nanoserver - ---> 22738ff49c6d - Step 2/3 : COPY testfile.txt c:\ - ---> 96655de338de - Removing intermediate container 4db9acbb1682 - Step 3/3 : RUN dir c:\ - ---> Running in a2c157f842f5 - Volume in drive C has no label. - Volume Serial Number is 7E6D-E0F7 - - Directory of c:\ - - 10/05/2016 05:04 PM 1,894 License.txt - 10/05/2016 02:22 PM

Program Files - 10/05/2016 02:14 PM Program Files (x86) - 10/28/2016 11:18 AM 62 testfile.txt - 10/28/2016 11:20 AM Users - 10/28/2016 11:20 AM Windows - 2 File(s) 1,956 bytes - 4 Dir(s) 21,259,096,064 bytes free - ---> 01c7f3bef04f - Removing intermediate container a2c157f842f5 - Successfully built 01c7f3bef04f - PS C:\John> - -## Environment replacement - -Environment variables (declared with [the `ENV` statement](#env)) can also be -used in certain instructions as variables to be interpreted by the -`Dockerfile`. Escapes are also handled for including variable-like syntax -into a statement literally. - -Environment variables are notated in the `Dockerfile` either with -`$variable_name` or `${variable_name}`. They are treated equivalently and the -brace syntax is typically used to address issues with variable names with no -whitespace, like `${foo}_bar`. - -The `${variable_name}` syntax also supports a few of the standard `bash` -modifiers as specified below: - -* `${variable:-word}` indicates that if `variable` is set then the result - will be that value. If `variable` is not set then `word` will be the result. -* `${variable:+word}` indicates that if `variable` is set then `word` will be - the result, otherwise the result is the empty string. - -In all cases, `word` can be any string, including additional environment -variables. - -Escaping is possible by adding a `\` before the variable: `\$foo` or `\${foo}`, -for example, will translate to `$foo` and `${foo}` literals respectively. - -Example (parsed representation is displayed after the `#`): - - FROM busybox - ENV foo /bar - WORKDIR ${foo} # WORKDIR /bar - ADD . $foo # ADD . /bar - COPY \$foo /quux # COPY $foo /quux - -Environment variables are supported by the following list of instructions in -the `Dockerfile`: - -* `ADD` -* `COPY` -* `ENV` -* `EXPOSE` -* `LABEL` -* `USER` -* `WORKDIR` -* `VOLUME` -* `STOPSIGNAL` - -as well as: - -* `ONBUILD` (when combined with one of the supported instructions above) - -> **Note**: -> prior to 1.4, `ONBUILD` instructions did **NOT** support environment -> variable, even when combined with any of the instructions listed above. - -Environment variable substitution will use the same value for each variable -throughout the entire command. In other words, in this example: - - ENV abc=hello - ENV abc=bye def=$abc - ENV ghi=$abc - -will result in `def` having a value of `hello`, not `bye`. However, -`ghi` will have a value of `bye` because it is not part of the same command -that set `abc` to `bye`. - -## .dockerignore file - -Before the docker CLI sends the context to the docker daemon, it looks -for a file named `.dockerignore` in the root directory of the context. -If this file exists, the CLI modifies the context to exclude files and -directories that match patterns in it. This helps to avoid -unnecessarily sending large or sensitive files and directories to the -daemon and potentially adding them to images using `ADD` or `COPY`. - -The CLI interprets the `.dockerignore` file as a newline-separated -list of patterns similar to the file globs of Unix shells. For the -purposes of matching, the root of the context is considered to be both -the working and the root directory. For example, the patterns -`/foo/bar` and `foo/bar` both exclude a file or directory named `bar` -in the `foo` subdirectory of `PATH` or in the root of the git -repository located at `URL`. Neither excludes anything else. - -If a line in `.dockerignore` file starts with `#` in column 1, then this line is -considered as a comment and is ignored before interpreted by the CLI. - -Here is an example `.dockerignore` file: - -``` -# comment - */temp* - */*/temp* - temp? -``` - -This file causes the following build behavior: - -| Rule | Behavior | -|----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `# comment` | Ignored. | -| `*/temp*` | Exclude files and directories whose names start with `temp` in any immediate subdirectory of the root. For example, the plain file `/somedir/temporary.txt` is excluded, as is the directory `/somedir/temp`. | -| `*/*/temp*` | Exclude files and directories starting with `temp` from any subdirectory that is two levels below the root. For example, `/somedir/subdir/temporary.txt` is excluded. | -| `temp?` | Exclude files and directories in the root directory whose names are a one-character extension of `temp`. For example, `/tempa` and `/tempb` are excluded. - - -Matching is done using Go's -[filepath.Match](http://golang.org/pkg/path/filepath#Match) rules. A -preprocessing step removes leading and trailing whitespace and -eliminates `.` and `..` elements using Go's -[filepath.Clean](http://golang.org/pkg/path/filepath/#Clean). Lines -that are blank after preprocessing are ignored. - -Beyond Go's filepath.Match rules, Docker also supports a special -wildcard string `**` that matches any number of directories (including -zero). For example, `**/*.go` will exclude all files that end with `.go` -that are found in all directories, including the root of the build context. - -Lines starting with `!` (exclamation mark) can be used to make exceptions -to exclusions. The following is an example `.dockerignore` file that -uses this mechanism: - -``` - *.md - !README.md -``` - -All markdown files *except* `README.md` are excluded from the context. - -The placement of `!` exception rules influences the behavior: the last -line of the `.dockerignore` that matches a particular file determines -whether it is included or excluded. Consider the following example: - -``` - *.md - !README*.md - README-secret.md -``` - -No markdown files are included in the context except README files other than -`README-secret.md`. - -Now consider this example: - -``` - *.md - README-secret.md - !README*.md -``` - -All of the README files are included. The middle line has no effect because -`!README*.md` matches `README-secret.md` and comes last. - -You can even use the `.dockerignore` file to exclude the `Dockerfile` -and `.dockerignore` files. These files are still sent to the daemon -because it needs them to do its job. But the `ADD` and `COPY` commands -do not copy them to the image. - -Finally, you may want to specify which files to include in the -context, rather than which to exclude. To achieve this, specify `*` as -the first pattern, followed by one or more `!` exception patterns. - -**Note**: For historical reasons, the pattern `.` is ignored. - -## FROM - - FROM - -Or - - FROM : - -Or - - FROM @ - -The `FROM` instruction sets the [*Base Image*](glossary.md#base-image) -for subsequent instructions. As such, a valid `Dockerfile` must have `FROM` as -its first instruction. The image can be any valid image – it is especially easy -to start by **pulling an image** from the [*Public Repositories*](https://docs.docker.com/engine/tutorials/dockerrepos/). - -- `FROM` must be the first non-comment instruction in the `Dockerfile`. - -- `FROM` can appear multiple times within a single `Dockerfile` in order to create -multiple images. Simply make a note of the last image ID output by the commit -before each new `FROM` command. - -- The `tag` or `digest` values are optional. If you omit either of them, the builder -assumes a `latest` by default. The builder returns an error if it cannot match -the `tag` value. - -## RUN - -RUN has 2 forms: - -- `RUN ` (*shell* form, the command is run in a shell, which by -default is `/bin/sh -c` on Linux or `cmd /S /C` on Windows) -- `RUN ["executable", "param1", "param2"]` (*exec* form) - -The `RUN` instruction will execute any commands in a new layer on top of the -current image and commit the results. The resulting committed image will be -used for the next step in the `Dockerfile`. - -Layering `RUN` instructions and generating commits conforms to the core -concepts of Docker where commits are cheap and containers can be created from -any point in an image's history, much like source control. - -The *exec* form makes it possible to avoid shell string munging, and to `RUN` -commands using a base image that does not contain the specified shell executable. - -The default shell for the *shell* form can be changed using the `SHELL` -command. - -In the *shell* form you can use a `\` (backslash) to continue a single -RUN instruction onto the next line. For example, consider these two lines: - -``` -RUN /bin/bash -c 'source $HOME/.bashrc; \ -echo $HOME' -``` -Together they are equivalent to this single line: - -``` -RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME' -``` - -> **Note**: -> To use a different shell, other than '/bin/sh', use the *exec* form -> passing in the desired shell. For example, -> `RUN ["/bin/bash", "-c", "echo hello"]` - -> **Note**: -> The *exec* form is parsed as a JSON array, which means that -> you must use double-quotes (") around words not single-quotes ('). - -> **Note**: -> Unlike the *shell* form, the *exec* form does not invoke a command shell. -> This means that normal shell processing does not happen. For example, -> `RUN [ "echo", "$HOME" ]` will not do variable substitution on `$HOME`. -> If you want shell processing then either use the *shell* form or execute -> a shell directly, for example: `RUN [ "sh", "-c", "echo $HOME" ]`. -> When using the exec form and executing a shell directly, as in the case for -> the shell form, it is the shell that is doing the environment variable -> expansion, not docker. -> -> **Note**: -> In the *JSON* form, it is necessary to escape backslashes. This is -> particularly relevant on Windows where the backslash is the path separator. -> The following line would otherwise be treated as *shell* form due to not -> being valid JSON, and fail in an unexpected way: -> `RUN ["c:\windows\system32\tasklist.exe"]` -> The correct syntax for this example is: -> `RUN ["c:\\windows\\system32\\tasklist.exe"]` - -The cache for `RUN` instructions isn't invalidated automatically during -the next build. The cache for an instruction like -`RUN apt-get dist-upgrade -y` will be reused during the next build. The -cache for `RUN` instructions can be invalidated by using the `--no-cache` -flag, for example `docker build --no-cache`. - -See the [`Dockerfile` Best Practices -guide](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#/build-cache) for more information. - -The cache for `RUN` instructions can be invalidated by `ADD` instructions. See -[below](#add) for details. - -### Known issues (RUN) - -- [Issue 783](https://github.com/docker/docker/issues/783) is about file - permissions problems that can occur when using the AUFS file system. You - might notice it during an attempt to `rm` a file, for example. - - For systems that have recent aufs version (i.e., `dirperm1` mount option can - be set), docker will attempt to fix the issue automatically by mounting - the layers with `dirperm1` option. More details on `dirperm1` option can be - found at [`aufs` man page](https://github.com/sfjro/aufs3-linux/tree/aufs3.18/Documentation/filesystems/aufs) - - If your system doesn't have support for `dirperm1`, the issue describes a workaround. - -## CMD - -The `CMD` instruction has three forms: - -- `CMD ["executable","param1","param2"]` (*exec* form, this is the preferred form) -- `CMD ["param1","param2"]` (as *default parameters to ENTRYPOINT*) -- `CMD command param1 param2` (*shell* form) - -There can only be one `CMD` instruction in a `Dockerfile`. If you list more than one `CMD` -then only the last `CMD` will take effect. - -**The main purpose of a `CMD` is to provide defaults for an executing -container.** These defaults can include an executable, or they can omit -the executable, in which case you must specify an `ENTRYPOINT` -instruction as well. - -> **Note**: -> If `CMD` is used to provide default arguments for the `ENTRYPOINT` -> instruction, both the `CMD` and `ENTRYPOINT` instructions should be specified -> with the JSON array format. - -> **Note**: -> The *exec* form is parsed as a JSON array, which means that -> you must use double-quotes (") around words not single-quotes ('). - -> **Note**: -> Unlike the *shell* form, the *exec* form does not invoke a command shell. -> This means that normal shell processing does not happen. For example, -> `CMD [ "echo", "$HOME" ]` will not do variable substitution on `$HOME`. -> If you want shell processing then either use the *shell* form or execute -> a shell directly, for example: `CMD [ "sh", "-c", "echo $HOME" ]`. -> When using the exec form and executing a shell directly, as in the case for -> the shell form, it is the shell that is doing the environment variable -> expansion, not docker. - -When used in the shell or exec formats, the `CMD` instruction sets the command -to be executed when running the image. - -If you use the *shell* form of the `CMD`, then the `` will execute in -`/bin/sh -c`: - - FROM ubuntu - CMD echo "This is a test." | wc - - -If you want to **run your** `` **without a shell** then you must -express the command as a JSON array and give the full path to the executable. -**This array form is the preferred format of `CMD`.** Any additional parameters -must be individually expressed as strings in the array: - - FROM ubuntu - CMD ["/usr/bin/wc","--help"] - -If you would like your container to run the same executable every time, then -you should consider using `ENTRYPOINT` in combination with `CMD`. See -[*ENTRYPOINT*](#entrypoint). - -If the user specifies arguments to `docker run` then they will override the -default specified in `CMD`. - -> **Note**: -> Don't confuse `RUN` with `CMD`. `RUN` actually runs a command and commits -> the result; `CMD` does not execute anything at build time, but specifies -> the intended command for the image. - -## LABEL - - LABEL = = = ... - -The `LABEL` instruction adds metadata to an image. A `LABEL` is a -key-value pair. To include spaces within a `LABEL` value, use quotes and -backslashes as you would in command-line parsing. A few usage examples: - - LABEL "com.example.vendor"="ACME Incorporated" - LABEL com.example.label-with-value="foo" - LABEL version="1.0" - LABEL description="This text illustrates \ - that label-values can span multiple lines." - -An image can have more than one label. To specify multiple labels, -Docker recommends combining labels into a single `LABEL` instruction where -possible. Each `LABEL` instruction produces a new layer which can result in an -inefficient image if you use many labels. This example results in a single image -layer. - - LABEL multi.label1="value1" multi.label2="value2" other="value3" - -The above can also be written as: - - LABEL multi.label1="value1" \ - multi.label2="value2" \ - other="value3" - -Labels are additive including `LABEL`s in `FROM` images. If Docker -encounters a label/key that already exists, the new value overrides any previous -labels with identical keys. - -To view an image's labels, use the `docker inspect` command. - - "Labels": { - "com.example.vendor": "ACME Incorporated" - "com.example.label-with-value": "foo", - "version": "1.0", - "description": "This text illustrates that label-values can span multiple lines.", - "multi.label1": "value1", - "multi.label2": "value2", - "other": "value3" - }, - -## MAINTAINER (deprecated) - - MAINTAINER - -The `MAINTAINER` instruction sets the *Author* field of the generated images. -The `LABEL` instruction is a much more flexible version of this and you should use -it instead, as it enables setting any metadata you require, and can be viewed -easily, for example with `docker inspect`. To set a label corresponding to the -`MAINTAINER` field you could use: - - LABEL maintainer "SvenDowideit@home.org.au" - -This will then be visible from `docker inspect` with the other labels. - -## EXPOSE - - EXPOSE [...] - -The `EXPOSE` instruction informs Docker that the container listens on the -specified network ports at runtime. `EXPOSE` does not make the ports of the -container accessible to the host. To do that, you must use either the `-p` flag -to publish a range of ports or the `-P` flag to publish all of the exposed -ports. You can expose one port number and publish it externally under another -number. - -To set up port redirection on the host system, see [using the -P -flag](run.md#expose-incoming-ports). The Docker network feature supports -creating networks without the need to expose ports within the network, for -detailed information see the [overview of this -feature](https://docs.docker.com/engine/userguide/networking/)). - -## ENV - - ENV - ENV = ... - -The `ENV` instruction sets the environment variable `` to the value -``. This value will be in the environment of all "descendant" -`Dockerfile` commands and can be [replaced inline](#environment-replacement) in -many as well. - -The `ENV` instruction has two forms. The first form, `ENV `, -will set a single variable to a value. The entire string after the first -space will be treated as the `` - including characters such as -spaces and quotes. - -The second form, `ENV = ...`, allows for multiple variables to -be set at one time. Notice that the second form uses the equals sign (=) -in the syntax, while the first form does not. Like command line parsing, -quotes and backslashes can be used to include spaces within values. - -For example: - - ENV myName="John Doe" myDog=Rex\ The\ Dog \ - myCat=fluffy - -and - - ENV myName John Doe - ENV myDog Rex The Dog - ENV myCat fluffy - -will yield the same net results in the final image, but the first form -is preferred because it produces a single cache layer. - -The environment variables set using `ENV` will persist when a container is run -from the resulting image. You can view the values using `docker inspect`, and -change them using `docker run --env =`. - -> **Note**: -> Environment persistence can cause unexpected side effects. For example, -> setting `ENV DEBIAN_FRONTEND noninteractive` may confuse apt-get -> users on a Debian-based image. To set a value for a single command, use -> `RUN = `. - -## ADD - -ADD has two forms: - -- `ADD ... ` -- `ADD ["",... ""]` (this form is required for paths containing -whitespace) - -The `ADD` instruction copies new files, directories or remote file URLs from `` -and adds them to the filesystem of the image at the path ``. - -Multiple `` resource may be specified but if they are files or -directories then they must be relative to the source directory that is -being built (the context of the build). - -Each `` may contain wildcards and matching will be done using Go's -[filepath.Match](http://golang.org/pkg/path/filepath#Match) rules. For example: - - ADD hom* /mydir/ # adds all files starting with "hom" - ADD hom?.txt /mydir/ # ? is replaced with any single character, e.g., "home.txt" - -The `` is an absolute path, or a path relative to `WORKDIR`, into which -the source will be copied inside the destination container. - - ADD test relativeDir/ # adds "test" to `WORKDIR`/relativeDir/ - ADD test /absoluteDir/ # adds "test" to /absoluteDir/ - -All new files and directories are created with a UID and GID of 0. - -In the case where `` is a remote file URL, the destination will -have permissions of 600. If the remote file being retrieved has an HTTP -`Last-Modified` header, the timestamp from that header will be used -to set the `mtime` on the destination file. However, like any other file -processed during an `ADD`, `mtime` will not be included in the determination -of whether or not the file has changed and the cache should be updated. - -> **Note**: -> If you build by passing a `Dockerfile` through STDIN (`docker -> build - < somefile`), there is no build context, so the `Dockerfile` -> can only contain a URL based `ADD` instruction. You can also pass a -> compressed archive through STDIN: (`docker build - < archive.tar.gz`), -> the `Dockerfile` at the root of the archive and the rest of the -> archive will be used as the context of the build. - -> **Note**: -> If your URL files are protected using authentication, you -> will need to use `RUN wget`, `RUN curl` or use another tool from -> within the container as the `ADD` instruction does not support -> authentication. - -> **Note**: -> The first encountered `ADD` instruction will invalidate the cache for all -> following instructions from the Dockerfile if the contents of `` have -> changed. This includes invalidating the cache for `RUN` instructions. -> See the [`Dockerfile` Best Practices -guide](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#/build-cache) for more information. - - -`ADD` obeys the following rules: - -- The `` path must be inside the *context* of the build; - you cannot `ADD ../something /something`, because the first step of a - `docker build` is to send the context directory (and subdirectories) to the - docker daemon. - -- If `` is a URL and `` does not end with a trailing slash, then a - file is downloaded from the URL and copied to ``. - -- If `` is a URL and `` does end with a trailing slash, then the - filename is inferred from the URL and the file is downloaded to - `/`. For instance, `ADD http://example.com/foobar /` would - create the file `/foobar`. The URL must have a nontrivial path so that an - appropriate filename can be discovered in this case (`http://example.com` - will not work). - -- If `` is a directory, the entire contents of the directory are copied, - including filesystem metadata. - -> **Note**: -> The directory itself is not copied, just its contents. - -- If `` is a *local* tar archive in a recognized compression format - (identity, gzip, bzip2 or xz) then it is unpacked as a directory. Resources - from *remote* URLs are **not** decompressed. When a directory is copied or - unpacked, it has the same behavior as `tar -x`, the result is the union of: - - 1. Whatever existed at the destination path and - 2. The contents of the source tree, with conflicts resolved in favor - of "2." on a file-by-file basis. - - > **Note**: - > Whether a file is identified as a recognized compression format or not - > is done solely based on the contents of the file, not the name of the file. - > For example, if an empty file happens to end with `.tar.gz` this will not - > be recognized as a compressed file and **will not** generate any kind of - > decompression error message, rather the file will simply be copied to the - > destination. - -- If `` is any other kind of file, it is copied individually along with - its metadata. In this case, if `` ends with a trailing slash `/`, it - will be considered a directory and the contents of `` will be written - at `/base()`. - -- If multiple `` resources are specified, either directly or due to the - use of a wildcard, then `` must be a directory, and it must end with - a slash `/`. - -- If `` does not end with a trailing slash, it will be considered a - regular file and the contents of `` will be written at ``. - -- If `` doesn't exist, it is created along with all missing directories - in its path. - -## COPY - -COPY has two forms: - -- `COPY ... ` -- `COPY ["",... ""]` (this form is required for paths containing -whitespace) - -The `COPY` instruction copies new files or directories from `` -and adds them to the filesystem of the container at the path ``. - -Multiple `` resource may be specified but they must be relative -to the source directory that is being built (the context of the build). - -Each `` may contain wildcards and matching will be done using Go's -[filepath.Match](http://golang.org/pkg/path/filepath#Match) rules. For example: - - COPY hom* /mydir/ # adds all files starting with "hom" - COPY hom?.txt /mydir/ # ? is replaced with any single character, e.g., "home.txt" - -The `` is an absolute path, or a path relative to `WORKDIR`, into which -the source will be copied inside the destination container. - - COPY test relativeDir/ # adds "test" to `WORKDIR`/relativeDir/ - COPY test /absoluteDir/ # adds "test" to /absoluteDir/ - -All new files and directories are created with a UID and GID of 0. - -> **Note**: -> If you build using STDIN (`docker build - < somefile`), there is no -> build context, so `COPY` can't be used. - -`COPY` obeys the following rules: - -- The `` path must be inside the *context* of the build; - you cannot `COPY ../something /something`, because the first step of a - `docker build` is to send the context directory (and subdirectories) to the - docker daemon. - -- If `` is a directory, the entire contents of the directory are copied, - including filesystem metadata. - -> **Note**: -> The directory itself is not copied, just its contents. - -- If `` is any other kind of file, it is copied individually along with - its metadata. In this case, if `` ends with a trailing slash `/`, it - will be considered a directory and the contents of `` will be written - at `/base()`. - -- If multiple `` resources are specified, either directly or due to the - use of a wildcard, then `` must be a directory, and it must end with - a slash `/`. - -- If `` does not end with a trailing slash, it will be considered a - regular file and the contents of `` will be written at ``. - -- If `` doesn't exist, it is created along with all missing directories - in its path. - -## ENTRYPOINT - -ENTRYPOINT has two forms: - -- `ENTRYPOINT ["executable", "param1", "param2"]` - (*exec* form, preferred) -- `ENTRYPOINT command param1 param2` - (*shell* form) - -An `ENTRYPOINT` allows you to configure a container that will run as an executable. - -For example, the following will start nginx with its default content, listening -on port 80: - - docker run -i -t --rm -p 80:80 nginx - -Command line arguments to `docker run ` will be appended after all -elements in an *exec* form `ENTRYPOINT`, and will override all elements specified -using `CMD`. -This allows arguments to be passed to the entry point, i.e., `docker run -d` -will pass the `-d` argument to the entry point. -You can override the `ENTRYPOINT` instruction using the `docker run --entrypoint` -flag. - -The *shell* form prevents any `CMD` or `run` command line arguments from being -used, but has the disadvantage that your `ENTRYPOINT` will be started as a -subcommand of `/bin/sh -c`, which does not pass signals. -This means that the executable will not be the container's `PID 1` - and -will _not_ receive Unix signals - so your executable will not receive a -`SIGTERM` from `docker stop `. - -Only the last `ENTRYPOINT` instruction in the `Dockerfile` will have an effect. - -### Exec form ENTRYPOINT example - -You can use the *exec* form of `ENTRYPOINT` to set fairly stable default commands -and arguments and then use either form of `CMD` to set additional defaults that -are more likely to be changed. - - FROM ubuntu - ENTRYPOINT ["top", "-b"] - CMD ["-c"] - -When you run the container, you can see that `top` is the only process: - - $ docker run -it --rm --name test top -H - top - 08:25:00 up 7:27, 0 users, load average: 0.00, 0.01, 0.05 - Threads: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie - %Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st - KiB Mem: 2056668 total, 1616832 used, 439836 free, 99352 buffers - KiB Swap: 1441840 total, 0 used, 1441840 free. 1324440 cached Mem - - PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND - 1 root 20 0 19744 2336 2080 R 0.0 0.1 0:00.04 top - -To examine the result further, you can use `docker exec`: - - $ docker exec -it test ps aux - USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND - root 1 2.6 0.1 19752 2352 ? Ss+ 08:24 0:00 top -b -H - root 7 0.0 0.1 15572 2164 ? R+ 08:25 0:00 ps aux - -And you can gracefully request `top` to shut down using `docker stop test`. - -The following `Dockerfile` shows using the `ENTRYPOINT` to run Apache in the -foreground (i.e., as `PID 1`): - -``` -FROM debian:stable -RUN apt-get update && apt-get install -y --force-yes apache2 -EXPOSE 80 443 -VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"] -ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] -``` - -If you need to write a starter script for a single executable, you can ensure that -the final executable receives the Unix signals by using `exec` and `gosu` -commands: - -```bash -#!/bin/bash -set -e - -if [ "$1" = 'postgres' ]; then - chown -R postgres "$PGDATA" - - if [ -z "$(ls -A "$PGDATA")" ]; then - gosu postgres initdb - fi - - exec gosu postgres "$@" -fi - -exec "$@" -``` - -Lastly, if you need to do some extra cleanup (or communicate with other containers) -on shutdown, or are co-ordinating more than one executable, you may need to ensure -that the `ENTRYPOINT` script receives the Unix signals, passes them on, and then -does some more work: - -``` -#!/bin/sh -# Note: I've written this using sh so it works in the busybox container too - -# USE the trap if you need to also do manual cleanup after the service is stopped, -# or need to start multiple services in the one container -trap "echo TRAPed signal" HUP INT QUIT TERM - -# start service in background here -/usr/sbin/apachectl start - -echo "[hit enter key to exit] or run 'docker stop '" -read - -# stop service and clean up here -echo "stopping apache" -/usr/sbin/apachectl stop - -echo "exited $0" -``` - -If you run this image with `docker run -it --rm -p 80:80 --name test apache`, -you can then examine the container's processes with `docker exec`, or `docker top`, -and then ask the script to stop Apache: - -```bash -$ docker exec -it test ps aux -USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND -root 1 0.1 0.0 4448 692 ? Ss+ 00:42 0:00 /bin/sh /run.sh 123 cmd cmd2 -root 19 0.0 0.2 71304 4440 ? Ss 00:42 0:00 /usr/sbin/apache2 -k start -www-data 20 0.2 0.2 360468 6004 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start -www-data 21 0.2 0.2 360468 6000 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start -root 81 0.0 0.1 15572 2140 ? R+ 00:44 0:00 ps aux -$ docker top test -PID USER COMMAND -10035 root {run.sh} /bin/sh /run.sh 123 cmd cmd2 -10054 root /usr/sbin/apache2 -k start -10055 33 /usr/sbin/apache2 -k start -10056 33 /usr/sbin/apache2 -k start -$ /usr/bin/time docker stop test -test -real 0m 0.27s -user 0m 0.03s -sys 0m 0.03s -``` - -> **Note:** you can override the `ENTRYPOINT` setting using `--entrypoint`, -> but this can only set the binary to *exec* (no `sh -c` will be used). - -> **Note**: -> The *exec* form is parsed as a JSON array, which means that -> you must use double-quotes (") around words not single-quotes ('). - -> **Note**: -> Unlike the *shell* form, the *exec* form does not invoke a command shell. -> This means that normal shell processing does not happen. For example, -> `ENTRYPOINT [ "echo", "$HOME" ]` will not do variable substitution on `$HOME`. -> If you want shell processing then either use the *shell* form or execute -> a shell directly, for example: `ENTRYPOINT [ "sh", "-c", "echo $HOME" ]`. -> When using the exec form and executing a shell directly, as in the case for -> the shell form, it is the shell that is doing the environment variable -> expansion, not docker. - -### Shell form ENTRYPOINT example - -You can specify a plain string for the `ENTRYPOINT` and it will execute in `/bin/sh -c`. -This form will use shell processing to substitute shell environment variables, -and will ignore any `CMD` or `docker run` command line arguments. -To ensure that `docker stop` will signal any long running `ENTRYPOINT` executable -correctly, you need to remember to start it with `exec`: - - FROM ubuntu - ENTRYPOINT exec top -b - -When you run this image, you'll see the single `PID 1` process: - - $ docker run -it --rm --name test top - Mem: 1704520K used, 352148K free, 0K shrd, 0K buff, 140368121167873K cached - CPU: 5% usr 0% sys 0% nic 94% idle 0% io 0% irq 0% sirq - Load average: 0.08 0.03 0.05 2/98 6 - PID PPID USER STAT VSZ %VSZ %CPU COMMAND - 1 0 root R 3164 0% 0% top -b - -Which will exit cleanly on `docker stop`: - - $ /usr/bin/time docker stop test - test - real 0m 0.20s - user 0m 0.02s - sys 0m 0.04s - -If you forget to add `exec` to the beginning of your `ENTRYPOINT`: - - FROM ubuntu - ENTRYPOINT top -b - CMD --ignored-param1 - -You can then run it (giving it a name for the next step): - - $ docker run -it --name test top --ignored-param2 - Mem: 1704184K used, 352484K free, 0K shrd, 0K buff, 140621524238337K cached - CPU: 9% usr 2% sys 0% nic 88% idle 0% io 0% irq 0% sirq - Load average: 0.01 0.02 0.05 2/101 7 - PID PPID USER STAT VSZ %VSZ %CPU COMMAND - 1 0 root S 3168 0% 0% /bin/sh -c top -b cmd cmd2 - 7 1 root R 3164 0% 0% top -b - -You can see from the output of `top` that the specified `ENTRYPOINT` is not `PID 1`. - -If you then run `docker stop test`, the container will not exit cleanly - the -`stop` command will be forced to send a `SIGKILL` after the timeout: - - $ docker exec -it test ps aux - PID USER COMMAND - 1 root /bin/sh -c top -b cmd cmd2 - 7 root top -b - 8 root ps aux - $ /usr/bin/time docker stop test - test - real 0m 10.19s - user 0m 0.04s - sys 0m 0.03s - -### Understand how CMD and ENTRYPOINT interact - -Both `CMD` and `ENTRYPOINT` instructions define what command gets executed when running a container. -There are few rules that describe their co-operation. - -1. Dockerfile should specify at least one of `CMD` or `ENTRYPOINT` commands. - -2. `ENTRYPOINT` should be defined when using the container as an executable. - -3. `CMD` should be used as a way of defining default arguments for an `ENTRYPOINT` command -or for executing an ad-hoc command in a container. - -4. `CMD` will be overridden when running the container with alternative arguments. - -The table below shows what command is executed for different `ENTRYPOINT` / `CMD` combinations: - -| | No ENTRYPOINT | ENTRYPOINT exec_entry p1_entry | ENTRYPOINT ["exec_entry", "p1_entry"] | -|--------------------------------|----------------------------|--------------------------------|------------------------------------------------| -| **No CMD** | *error, not allowed* | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry | -| **CMD ["exec_cmd", "p1_cmd"]** | exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry exec_cmd p1_cmd | -| **CMD ["p1_cmd", "p2_cmd"]** | p1_cmd p2_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry p1_cmd p2_cmd | -| **CMD exec_cmd p1_cmd** | /bin/sh -c exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd | - -## VOLUME - - VOLUME ["/data"] - -The `VOLUME` instruction creates a mount point with the specified name -and marks it as holding externally mounted volumes from native host or other -containers. The value can be a JSON array, `VOLUME ["/var/log/"]`, or a plain -string with multiple arguments, such as `VOLUME /var/log` or `VOLUME /var/log -/var/db`. For more information/examples and mounting instructions via the -Docker client, refer to -[*Share Directories via Volumes*](https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-host-directory-as-a-data-volume) -documentation. - -The `docker run` command initializes the newly created volume with any data -that exists at the specified location within the base image. For example, -consider the following Dockerfile snippet: - - FROM ubuntu - RUN mkdir /myvol - RUN echo "hello world" > /myvol/greeting - VOLUME /myvol - -This Dockerfile results in an image that causes `docker run`, to -create a new mount point at `/myvol` and copy the `greeting` file -into the newly created volume. - -> **Note**: -> If any build steps change the data within the volume after it has been -> declared, those changes will be discarded. - -> **Note**: -> The list is parsed as a JSON array, which means that -> you must use double-quotes (") around words not single-quotes ('). - -## USER - - USER daemon - -The `USER` instruction sets the user name or UID to use when running the image -and for any `RUN`, `CMD` and `ENTRYPOINT` instructions that follow it in the -`Dockerfile`. - -## WORKDIR - - WORKDIR /path/to/workdir - -The `WORKDIR` instruction sets the working directory for any `RUN`, `CMD`, -`ENTRYPOINT`, `COPY` and `ADD` instructions that follow it in the `Dockerfile`. -If the `WORKDIR` doesn't exist, it will be created even if it's not used in any -subsequent `Dockerfile` instruction. - -It can be used multiple times in the one `Dockerfile`. If a relative path -is provided, it will be relative to the path of the previous `WORKDIR` -instruction. For example: - - WORKDIR /a - WORKDIR b - WORKDIR c - RUN pwd - -The output of the final `pwd` command in this `Dockerfile` would be -`/a/b/c`. - -The `WORKDIR` instruction can resolve environment variables previously set using -`ENV`. You can only use environment variables explicitly set in the `Dockerfile`. -For example: - - ENV DIRPATH /path - WORKDIR $DIRPATH/$DIRNAME - RUN pwd - -The output of the final `pwd` command in this `Dockerfile` would be -`/path/$DIRNAME` - -## ARG - - ARG [=] - -The `ARG` instruction defines a variable that users can pass at build-time to -the builder with the `docker build` command using the `--build-arg =` -flag. If a user specifies a build argument that was not -defined in the Dockerfile, the build outputs a warning. - -``` -[Warning] One or more build-args [foo] were not consumed. -``` - -The Dockerfile author can define a single variable by specifying `ARG` once or many -variables by specifying `ARG` more than once. For example, a valid Dockerfile: - -``` -FROM busybox -ARG user1 -ARG buildno -... -``` - -A Dockerfile author may optionally specify a default value for an `ARG` instruction: - -``` -FROM busybox -ARG user1=someuser -ARG buildno=1 -... -``` - -If an `ARG` value has a default and if there is no value passed at build-time, the -builder uses the default. - -An `ARG` variable definition comes into effect from the line on which it is -defined in the `Dockerfile` not from the argument's use on the command-line or -elsewhere. For example, consider this Dockerfile: - -``` -1 FROM busybox -2 USER ${user:-some_user} -3 ARG user -4 USER $user -... -``` -A user builds this file by calling: - -``` -$ docker build --build-arg user=what_user Dockerfile -``` - -The `USER` at line 2 evaluates to `some_user` as the `user` variable is defined on the -subsequent line 3. The `USER` at line 4 evaluates to `what_user` as `user` is -defined and the `what_user` value was passed on the command line. Prior to its definition by an -`ARG` instruction, any use of a variable results in an empty string. - -> **Warning:** It is not recommended to use build-time variables for -> passing secrets like github keys, user credentials etc. Build-time variable -> values are visible to any user of the image with the `docker history` command. - -You can use an `ARG` or an `ENV` instruction to specify variables that are -available to the `RUN` instruction. Environment variables defined using the -`ENV` instruction always override an `ARG` instruction of the same name. Consider -this Dockerfile with an `ENV` and `ARG` instruction. - -``` -1 FROM ubuntu -2 ARG CONT_IMG_VER -3 ENV CONT_IMG_VER v1.0.0 -4 RUN echo $CONT_IMG_VER -``` -Then, assume this image is built with this command: - -``` -$ docker build --build-arg CONT_IMG_VER=v2.0.1 Dockerfile -``` - -In this case, the `RUN` instruction uses `v1.0.0` instead of the `ARG` setting -passed by the user:`v2.0.1` This behavior is similar to a shell -script where a locally scoped variable overrides the variables passed as -arguments or inherited from environment, from its point of definition. - -Using the example above but a different `ENV` specification you can create more -useful interactions between `ARG` and `ENV` instructions: - -``` -1 FROM ubuntu -2 ARG CONT_IMG_VER -3 ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0} -4 RUN echo $CONT_IMG_VER -``` - -Unlike an `ARG` instruction, `ENV` values are always persisted in the built -image. Consider a docker build without the `--build-arg` flag: - -``` -$ docker build Dockerfile -``` - -Using this Dockerfile example, `CONT_IMG_VER` is still persisted in the image but -its value would be `v1.0.0` as it is the default set in line 3 by the `ENV` instruction. - -The variable expansion technique in this example allows you to pass arguments -from the command line and persist them in the final image by leveraging the -`ENV` instruction. Variable expansion is only supported for [a limited set of -Dockerfile instructions.](#environment-replacement) - -Docker has a set of predefined `ARG` variables that you can use without a -corresponding `ARG` instruction in the Dockerfile. - -* `HTTP_PROXY` -* `http_proxy` -* `HTTPS_PROXY` -* `https_proxy` -* `FTP_PROXY` -* `ftp_proxy` -* `NO_PROXY` -* `no_proxy` - -To use these, simply pass them on the command line using the flag: - -``` ---build-arg = -``` - -### Impact on build caching - -`ARG` variables are not persisted into the built image as `ENV` variables are. -However, `ARG` variables do impact the build cache in similar ways. If a -Dockerfile defines an `ARG` variable whose value is different from a previous -build, then a "cache miss" occurs upon its first usage, not its definition. In -particular, all `RUN` instructions following an `ARG` instruction use the `ARG` -variable implicitly (as an environment variable), thus can cause a cache miss. - -For example, consider these two Dockerfile: - -``` -1 FROM ubuntu -2 ARG CONT_IMG_VER -3 RUN echo $CONT_IMG_VER -``` - -``` -1 FROM ubuntu -2 ARG CONT_IMG_VER -3 RUN echo hello -``` - -If you specify `--build-arg CONT_IMG_VER=` on the command line, in both -cases, the specification on line 2 does not cause a cache miss; line 3 does -cause a cache miss.`ARG CONT_IMG_VER` causes the RUN line to be identified -as the same as running `CONT_IMG_VER=` echo hello, so if the `` -changes, we get a cache miss. - -Consider another example under the same command line: - -``` -1 FROM ubuntu -2 ARG CONT_IMG_VER -3 ENV CONT_IMG_VER $CONT_IMG_VER -4 RUN echo $CONT_IMG_VER -``` -In this example, the cache miss occurs on line 3. The miss happens because -the variable's value in the `ENV` references the `ARG` variable and that -variable is changed through the command line. In this example, the `ENV` -command causes the image to include the value. - -If an `ENV` instruction overrides an `ARG` instruction of the same name, like -this Dockerfile: - -``` -1 FROM ubuntu -2 ARG CONT_IMG_VER -3 ENV CONT_IMG_VER hello -4 RUN echo $CONT_IMG_VER -``` - -Line 3 does not cause a cache miss because the value of `CONT_IMG_VER` is a -constant (`hello`). As a result, the environment variables and values used on -the `RUN` (line 4) doesn't change between builds. - -## ONBUILD - - ONBUILD [INSTRUCTION] - -The `ONBUILD` instruction adds to the image a *trigger* instruction to -be executed at a later time, when the image is used as the base for -another build. The trigger will be executed in the context of the -downstream build, as if it had been inserted immediately after the -`FROM` instruction in the downstream `Dockerfile`. - -Any build instruction can be registered as a trigger. - -This is useful if you are building an image which will be used as a base -to build other images, for example an application build environment or a -daemon which may be customized with user-specific configuration. - -For example, if your image is a reusable Python application builder, it -will require application source code to be added in a particular -directory, and it might require a build script to be called *after* -that. You can't just call `ADD` and `RUN` now, because you don't yet -have access to the application source code, and it will be different for -each application build. You could simply provide application developers -with a boilerplate `Dockerfile` to copy-paste into their application, but -that is inefficient, error-prone and difficult to update because it -mixes with application-specific code. - -The solution is to use `ONBUILD` to register advance instructions to -run later, during the next build stage. - -Here's how it works: - -1. When it encounters an `ONBUILD` instruction, the builder adds a - trigger to the metadata of the image being built. The instruction - does not otherwise affect the current build. -2. At the end of the build, a list of all triggers is stored in the - image manifest, under the key `OnBuild`. They can be inspected with - the `docker inspect` command. -3. Later the image may be used as a base for a new build, using the - `FROM` instruction. As part of processing the `FROM` instruction, - the downstream builder looks for `ONBUILD` triggers, and executes - them in the same order they were registered. If any of the triggers - fail, the `FROM` instruction is aborted which in turn causes the - build to fail. If all triggers succeed, the `FROM` instruction - completes and the build continues as usual. -4. Triggers are cleared from the final image after being executed. In - other words they are not inherited by "grand-children" builds. - -For example you might add something like this: - - [...] - ONBUILD ADD . /app/src - ONBUILD RUN /usr/local/bin/python-build --dir /app/src - [...] - -> **Warning**: Chaining `ONBUILD` instructions using `ONBUILD ONBUILD` isn't allowed. - -> **Warning**: The `ONBUILD` instruction may not trigger `FROM` or `MAINTAINER` instructions. - -## STOPSIGNAL - - STOPSIGNAL signal - -The `STOPSIGNAL` instruction sets the system call signal that will be sent to the container to exit. -This signal can be a valid unsigned number that matches a position in the kernel's syscall table, for instance 9, -or a signal name in the format SIGNAME, for instance SIGKILL. - -## HEALTHCHECK - -The `HEALTHCHECK` instruction has two forms: - -* `HEALTHCHECK [OPTIONS] CMD command` (check container health by running a command inside the container) -* `HEALTHCHECK NONE` (disable any healthcheck inherited from the base image) - -The `HEALTHCHECK` instruction tells Docker how to test a container to check that -it is still working. This can detect cases such as a web server that is stuck in -an infinite loop and unable to handle new connections, even though the server -process is still running. - -When a container has a healthcheck specified, it has a _health status_ in -addition to its normal status. This status is initially `starting`. Whenever a -health check passes, it becomes `healthy` (whatever state it was previously in). -After a certain number of consecutive failures, it becomes `unhealthy`. - -The options that can appear before `CMD` are: - -* `--interval=DURATION` (default: `30s`) -* `--timeout=DURATION` (default: `30s`) -* `--retries=N` (default: `3`) - -The health check will first run **interval** seconds after the container is -started, and then again **interval** seconds after each previous check completes. - -If a single run of the check takes longer than **timeout** seconds then the check -is considered to have failed. - -It takes **retries** consecutive failures of the health check for the container -to be considered `unhealthy`. - -There can only be one `HEALTHCHECK` instruction in a Dockerfile. If you list -more than one then only the last `HEALTHCHECK` will take effect. - -The command after the `CMD` keyword can be either a shell command (e.g. `HEALTHCHECK -CMD /bin/check-running`) or an _exec_ array (as with other Dockerfile commands; -see e.g. `ENTRYPOINT` for details). - -The command's exit status indicates the health status of the container. -The possible values are: - -- 0: success - the container is healthy and ready for use -- 1: unhealthy - the container is not working correctly -- 2: reserved - do not use this exit code - -For example, to check every five minutes or so that a web-server is able to -serve the site's main page within three seconds: - - HEALTHCHECK --interval=5m --timeout=3s \ - CMD curl -f http://localhost/ || exit 1 - -To help debug failing probes, any output text (UTF-8 encoded) that the command writes -on stdout or stderr will be stored in the health status and can be queried with -`docker inspect`. Such output should be kept short (only the first 4096 bytes -are stored currently). - -When the health status of a container changes, a `health_status` event is -generated with the new status. - -The `HEALTHCHECK` feature was added in Docker 1.12. - - -## SHELL - - SHELL ["executable", "parameters"] - -The `SHELL` instruction allows the default shell used for the *shell* form of -commands to be overridden. The default shell on Linux is `["/bin/sh", "-c"]`, and on -Windows is `["cmd", "/S", "/C"]`. The `SHELL` instruction *must* be written in JSON -form in a Dockerfile. - -The `SHELL` instruction is particularly useful on Windows where there are -two commonly used and quite different native shells: `cmd` and `powershell`, as -well as alternate shells available including `sh`. - -The `SHELL` instruction can appear multiple times. Each `SHELL` instruction overrides -all previous `SHELL` instructions, and affects all subsequent instructions. For example: - - FROM microsoft/windowsservercore - - # Executed as cmd /S /C echo default - RUN echo default - - # Executed as cmd /S /C powershell -command Write-Host default - RUN powershell -command Write-Host default - - # Executed as powershell -command Write-Host hello - SHELL ["powershell", "-command"] - RUN Write-Host hello - - # Executed as cmd /S /C echo hello - SHELL ["cmd", "/S"", "/C"] - RUN echo hello - -The following instructions can be affected by the `SHELL` instruction when the -*shell* form of them is used in a Dockerfile: `RUN`, `CMD` and `ENTRYPOINT`. - -The following example is a common pattern found on Windows which can be -streamlined by using the `SHELL` instruction: - - ... - RUN powershell -command Execute-MyCmdlet -param1 "c:\foo.txt" - ... - -The command invoked by docker will be: - - cmd /S /C powershell -command Execute-MyCmdlet -param1 "c:\foo.txt" - -This is inefficient for two reasons. First, there is an un-necessary cmd.exe command -processor (aka shell) being invoked. Second, each `RUN` instruction in the *shell* -form requires an extra `powershell -command` prefixing the command. - -To make this more efficient, one of two mechanisms can be employed. One is to -use the JSON form of the RUN command such as: - - ... - RUN ["powershell", "-command", "Execute-MyCmdlet", "-param1 \"c:\\foo.txt\""] - ... - -While the JSON form is unambiguous and does not use the un-necessary cmd.exe, -it does require more verbosity through double-quoting and escaping. The alternate -mechanism is to use the `SHELL` instruction and the *shell* form, -making a more natural syntax for Windows users, especially when combined with -the `escape` parser directive: - - # escape=` - - FROM microsoft/nanoserver - SHELL ["powershell","-command"] - RUN New-Item -ItemType Directory C:\Example - ADD Execute-MyCmdlet.ps1 c:\example\ - RUN c:\example\Execute-MyCmdlet -sample 'hello world' - -Resulting in: - - PS E:\docker\build\shell> docker build -t shell . - Sending build context to Docker daemon 4.096 kB - Step 1/5 : FROM microsoft/nanoserver - ---> 22738ff49c6d - Step 2/5 : SHELL powershell -command - ---> Running in 6fcdb6855ae2 - ---> 6331462d4300 - Removing intermediate container 6fcdb6855ae2 - Step 3/5 : RUN New-Item -ItemType Directory C:\Example - ---> Running in d0eef8386e97 - - - Directory: C:\ - - - Mode LastWriteTime Length Name - ---- ------------- ------ ---- - d----- 10/28/2016 11:26 AM Example - - - ---> 3f2fbf1395d9 - Removing intermediate container d0eef8386e97 - Step 4/5 : ADD Execute-MyCmdlet.ps1 c:\example\ - ---> a955b2621c31 - Removing intermediate container b825593d39fc - Step 5/5 : RUN c:\example\Execute-MyCmdlet 'hello world' - ---> Running in be6d8e63fe75 - hello world - ---> 8e559e9bf424 - Removing intermediate container be6d8e63fe75 - Successfully built 8e559e9bf424 - PS E:\docker\build\shell> - -The `SHELL` instruction could also be used to modify the way in which -a shell operates. For example, using `SHELL cmd /S /C /V:ON|OFF` on Windows, delayed -environment variable expansion semantics could be modified. - -The `SHELL` instruction can also be used on Linux should an alternate shell be -required such as `zsh`, `csh`, `tcsh` and others. - -The `SHELL` feature was added in Docker 1.12. - -## Dockerfile examples - -Below you can see some examples of Dockerfile syntax. If you're interested in -something more realistic, take a look at the list of [Dockerization examples](https://docs.docker.com/engine/examples/). - -``` -# Nginx -# -# VERSION 0.0.1 - -FROM ubuntu -LABEL Description="This image is used to start the foobar executable" Vendor="ACME Products" Version="1.0" -RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server -``` - -``` -# Firefox over VNC -# -# VERSION 0.3 - -FROM ubuntu - -# Install vnc, xvfb in order to create a 'fake' display and firefox -RUN apt-get update && apt-get install -y x11vnc xvfb firefox -RUN mkdir ~/.vnc -# Setup a password -RUN x11vnc -storepasswd 1234 ~/.vnc/passwd -# Autostart firefox (might not be the best way, but it does the trick) -RUN bash -c 'echo "firefox" >> /.bashrc' - -EXPOSE 5900 -CMD ["x11vnc", "-forever", "-usepw", "-create"] -``` - -``` -# Multiple images example -# -# VERSION 0.1 - -FROM ubuntu -RUN echo foo > bar -# Will output something like ===> 907ad6c2736f - -FROM ubuntu -RUN echo moo > oink -# Will output something like ===> 695d7793cbe4 - -# You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with -# /oink. -``` diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/attach.md b/vendor/github.com/docker/docker/docs/reference/commandline/attach.md deleted file mode 100644 index 307068a33..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/attach.md +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: "attach" -description: "The attach command description and usage" -keywords: "attach, running, container" ---- - - - -# attach - -```markdown -Usage: docker attach [OPTIONS] CONTAINER - -Attach to a running container - -Options: - --detach-keys string Override the key sequence for detaching a container - --help Print usage - --no-stdin Do not attach STDIN - --sig-proxy Proxy all received signals to the process (default true) -``` - -Use `docker attach` to attach to a running container using the container's ID -or name, either to view its ongoing output or to control it interactively. -You can attach to the same contained process multiple times simultaneously, -screen sharing style, or quickly view the progress of your detached process. - -To stop a container, use `CTRL-c`. This key sequence sends `SIGKILL` to the -container. If `--sig-proxy` is true (the default),`CTRL-c` sends a `SIGINT` to -the container. You can detach from a container and leave it running using the - `CTRL-p CTRL-q` key sequence. - -> **Note:** -> A process running as PID 1 inside a container is treated specially by -> Linux: it ignores any signal with the default action. So, the process -> will not terminate on `SIGINT` or `SIGTERM` unless it is coded to do -> so. - -It is forbidden to redirect the standard input of a `docker attach` command -while attaching to a tty-enabled container (i.e.: launched with `-t`). - -While a client is connected to container's stdio using `docker attach`, Docker -uses a ~1MB memory buffer to maximize the throughput of the application. If -this buffer is filled, the speed of the API connection will start to have an -effect on the process output writing speed. This is similar to other -applications like SSH. Because of this, it is not recommended to run -performance critical applications that generate a lot of output in the -foreground over a slow client connection. Instead, users should use the -`docker logs` command to get access to the logs. - - -## Override the detach sequence - -If you want, you can configure an override the Docker key sequence for detach. -This is useful if the Docker default sequence conflicts with key sequence you -use for other applications. There are two ways to define your own detach key -sequence, as a per-container override or as a configuration property on your -entire configuration. - -To override the sequence for an individual container, use the -`--detach-keys=""` flag with the `docker attach` command. The format of -the `` is either a letter [a-Z], or the `ctrl-` combined with any of -the following: - -* `a-z` (a single lowercase alpha character ) -* `@` (at sign) -* `[` (left bracket) -* `\\` (two backward slashes) -* `_` (underscore) -* `^` (caret) - -These `a`, `ctrl-a`, `X`, or `ctrl-\\` values are all examples of valid key -sequences. To configure a different configuration default key sequence for all -containers, see [**Configuration file** section](cli.md#configuration-files). - -#### Examples - - $ docker run -d --name topdemo ubuntu /usr/bin/top -b - $ docker attach topdemo - top - 02:05:52 up 3:05, 0 users, load average: 0.01, 0.02, 0.05 - Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie - Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st - Mem: 373572k total, 355560k used, 18012k free, 27872k buffers - Swap: 786428k total, 0k used, 786428k free, 221740k cached - - PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND - 1 root 20 0 17200 1116 912 R 0 0.3 0:00.03 top - - top - 02:05:55 up 3:05, 0 users, load average: 0.01, 0.02, 0.05 - Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie - Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st - Mem: 373572k total, 355244k used, 18328k free, 27872k buffers - Swap: 786428k total, 0k used, 786428k free, 221776k cached - - PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND - 1 root 20 0 17208 1144 932 R 0 0.3 0:00.03 top - - - top - 02:05:58 up 3:06, 0 users, load average: 0.01, 0.02, 0.05 - Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie - Cpu(s): 0.2%us, 0.3%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st - Mem: 373572k total, 355780k used, 17792k free, 27880k buffers - Swap: 786428k total, 0k used, 786428k free, 221776k cached - - PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND - 1 root 20 0 17208 1144 932 R 0 0.3 0:00.03 top - ^C$ - $ echo $? - 0 - $ docker ps -a | grep topdemo - 7998ac8581f9 ubuntu:14.04 "/usr/bin/top -b" 38 seconds ago Exited (0) 21 seconds ago topdemo - -And in this second example, you can see the exit code returned by the `bash` -process is returned by the `docker attach` command to its caller too: - - $ docker run --name test -d -it debian - 275c44472aebd77c926d4527885bb09f2f6db21d878c75f0a1c212c03d3bcfab - $ docker attach test - root@f38c87f2a42d:/# exit 13 - exit - $ echo $? - 13 - $ docker ps -a | grep test - 275c44472aeb debian:7 "/bin/bash" 26 seconds ago Exited (13) 17 seconds ago test diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/build.md b/vendor/github.com/docker/docker/docs/reference/commandline/build.md deleted file mode 100644 index 42c3ecf65..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/build.md +++ /dev/null @@ -1,451 +0,0 @@ ---- -title: "build" -description: "The build command description and usage" -keywords: "build, docker, image" ---- - - - -# build - -```markdown -Usage: docker build [OPTIONS] PATH | URL | - - -Build an image from a Dockerfile - -Options: - --build-arg value Set build-time variables (default []) - --cache-from value Images to consider as cache sources (default []) - --cgroup-parent string Optional parent cgroup for the container - --compress Compress the build context using gzip - --cpu-period int Limit the CPU CFS (Completely Fair Scheduler) period - --cpu-quota int Limit the CPU CFS (Completely Fair Scheduler) quota - -c, --cpu-shares int CPU shares (relative weight) - --cpuset-cpus string CPUs in which to allow execution (0-3, 0,1) - --cpuset-mems string MEMs in which to allow execution (0-3, 0,1) - --disable-content-trust Skip image verification (default true) - -f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile') - --force-rm Always remove intermediate containers - --help Print usage - --isolation string Container isolation technology - --label value Set metadata for an image (default []) - -m, --memory string Memory limit - --memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap - --network string Set the networking mode for the RUN instructions during build - 'bridge': use default Docker bridge - 'none': no networking - 'container:': reuse another container's network stack - 'host': use the Docker host network stack - '|': connect to a user-defined network - --no-cache Do not use cache when building the image - --pull Always attempt to pull a newer version of the image - -q, --quiet Suppress the build output and print image ID on success - --rm Remove intermediate containers after a successful build (default true) - --security-opt value Security Options (default []) - --shm-size string Size of /dev/shm, default value is 64MB. - The format is ``. `number` must be greater than `0`. - Unit is optional and can be `b` (bytes), `k` (kilobytes), `m` (megabytes), - or `g` (gigabytes). If you omit the unit, the system uses bytes. - --squash Squash newly built layers into a single new layer (**Experimental Only**) - -t, --tag value Name and optionally a tag in the 'name:tag' format (default []) - --ulimit value Ulimit options (default []) -``` - -Builds Docker images from a Dockerfile and a "context". A build's context is -the files located in the specified `PATH` or `URL`. The build process can refer -to any of the files in the context. For example, your build can use an -[*ADD*](../builder.md#add) instruction to reference a file in the -context. - -The `URL` parameter can refer to three kinds of resources: Git repositories, -pre-packaged tarball contexts and plain text files. - -### Git repositories - -When the `URL` parameter points to the location of a Git repository, the -repository acts as the build context. The system recursively clones the -repository and its submodules using a `git clone --depth 1 --recursive` -command. This command runs in a temporary directory on your local host. After -the command succeeds, the directory is sent to the Docker daemon as the -context. Local clones give you the ability to access private repositories using -local user credentials, VPN's, and so forth. - -Git URLs accept context configuration in their fragment section, separated by a -colon `:`. The first part represents the reference that Git will check out, -this can be either a branch, a tag, or a commit SHA. The second part represents -a subdirectory inside the repository that will be used as a build context. - -For example, run this command to use a directory called `docker` in the branch -`container`: - -```bash -$ docker build https://github.com/docker/rootfs.git#container:docker -``` - -The following table represents all the valid suffixes with their build -contexts: - -Build Syntax Suffix | Commit Used | Build Context Used ---------------------------------|-----------------------|------------------- -`myrepo.git` | `refs/heads/master` | `/` -`myrepo.git#mytag` | `refs/tags/mytag` | `/` -`myrepo.git#mybranch` | `refs/heads/mybranch` | `/` -`myrepo.git#abcdef` | `sha1 = abcdef` | `/` -`myrepo.git#:myfolder` | `refs/heads/master` | `/myfolder` -`myrepo.git#master:myfolder` | `refs/heads/master` | `/myfolder` -`myrepo.git#mytag:myfolder` | `refs/tags/mytag` | `/myfolder` -`myrepo.git#mybranch:myfolder` | `refs/heads/mybranch` | `/myfolder` -`myrepo.git#abcdef:myfolder` | `sha1 = abcdef` | `/myfolder` - - -### Tarball contexts - -If you pass an URL to a remote tarball, the URL itself is sent to the daemon: - -Instead of specifying a context, you can pass a single Dockerfile in the `URL` -or pipe the file in via `STDIN`. To pipe a Dockerfile from `STDIN`: - -```bash -$ docker build http://server/context.tar.gz -``` - -The download operation will be performed on the host the Docker daemon is -running on, which is not necessarily the same host from which the build command -is being issued. The Docker daemon will fetch `context.tar.gz` and use it as the -build context. Tarball contexts must be tar archives conforming to the standard -`tar` UNIX format and can be compressed with any one of the 'xz', 'bzip2', -'gzip' or 'identity' (no compression) formats. - -### Text files - -Instead of specifying a context, you can pass a single `Dockerfile` in the -`URL` or pipe the file in via `STDIN`. To pipe a `Dockerfile` from `STDIN`: - -```bash -$ docker build - < Dockerfile -``` - -With Powershell on Windows, you can run: - -```powershell -Get-Content Dockerfile | docker build - -``` - -If you use `STDIN` or specify a `URL` pointing to a plain text file, the system -places the contents into a file called `Dockerfile`, and any `-f`, `--file` -option is ignored. In this scenario, there is no context. - -By default the `docker build` command will look for a `Dockerfile` at the root -of the build context. The `-f`, `--file`, option lets you specify the path to -an alternative file to use instead. This is useful in cases where the same set -of files are used for multiple builds. The path must be to a file within the -build context. If a relative path is specified then it is interpreted as -relative to the root of the context. - -In most cases, it's best to put each Dockerfile in an empty directory. Then, -add to that directory only the files needed for building the Dockerfile. To -increase the build's performance, you can exclude files and directories by -adding a `.dockerignore` file to that directory as well. For information on -creating one, see the [.dockerignore file](../builder.md#dockerignore-file). - -If the Docker client loses connection to the daemon, the build is canceled. -This happens if you interrupt the Docker client with `CTRL-c` or if the Docker -client is killed for any reason. If the build initiated a pull which is still -running at the time the build is cancelled, the pull is cancelled as well. - -## Return code - -On a successful build, a return code of success `0` will be returned. When the -build fails, a non-zero failure code will be returned. - -There should be informational output of the reason for failure output to -`STDERR`: - -```bash -$ docker build -t fail . - -Sending build context to Docker daemon 2.048 kB -Sending build context to Docker daemon -Step 1/3 : FROM busybox - ---> 4986bf8c1536 -Step 2/3 : RUN exit 13 - ---> Running in e26670ec7a0a -INFO[0000] The command [/bin/sh -c exit 13] returned a non-zero code: 13 -$ echo $? -1 -``` - -See also: - -[*Dockerfile Reference*](../builder.md). - -## Examples - -### Build with PATH - -```bash -$ docker build . - -Uploading context 10240 bytes -Step 1/3 : FROM busybox -Pulling repository busybox - ---> e9aa60c60128MB/2.284 MB (100%) endpoint: https://cdn-registry-1.docker.io/v1/ -Step 2/3 : RUN ls -lh / - ---> Running in 9c9e81692ae9 -total 24 -drwxr-xr-x 2 root root 4.0K Mar 12 2013 bin -drwxr-xr-x 5 root root 4.0K Oct 19 00:19 dev -drwxr-xr-x 2 root root 4.0K Oct 19 00:19 etc -drwxr-xr-x 2 root root 4.0K Nov 15 23:34 lib -lrwxrwxrwx 1 root root 3 Mar 12 2013 lib64 -> lib -dr-xr-xr-x 116 root root 0 Nov 15 23:34 proc -lrwxrwxrwx 1 root root 3 Mar 12 2013 sbin -> bin -dr-xr-xr-x 13 root root 0 Nov 15 23:34 sys -drwxr-xr-x 2 root root 4.0K Mar 12 2013 tmp -drwxr-xr-x 2 root root 4.0K Nov 15 23:34 usr - ---> b35f4035db3f -Step 3/3 : CMD echo Hello world - ---> Running in 02071fceb21b - ---> f52f38b7823e -Successfully built f52f38b7823e -Removing intermediate container 9c9e81692ae9 -Removing intermediate container 02071fceb21b -``` - -This example specifies that the `PATH` is `.`, and so all the files in the -local directory get `tar`d and sent to the Docker daemon. The `PATH` specifies -where to find the files for the "context" of the build on the Docker daemon. -Remember that the daemon could be running on a remote machine and that no -parsing of the Dockerfile happens at the client side (where you're running -`docker build`). That means that *all* the files at `PATH` get sent, not just -the ones listed to [*ADD*](../builder.md#add) in the Dockerfile. - -The transfer of context from the local machine to the Docker daemon is what the -`docker` client means when you see the "Sending build context" message. - -If you wish to keep the intermediate containers after the build is complete, -you must use `--rm=false`. This does not affect the build cache. - -### Build with URL - -```bash -$ docker build github.com/creack/docker-firefox -``` - -This will clone the GitHub repository and use the cloned repository as context. -The Dockerfile at the root of the repository is used as Dockerfile. You can -specify an arbitrary Git repository by using the `git://` or `git@` scheme. - -```bash -$ docker build -f ctx/Dockerfile http://server/ctx.tar.gz - -Downloading context: http://server/ctx.tar.gz [===================>] 240 B/240 B -Step 1/3 : FROM busybox - ---> 8c2e06607696 -Step 2/3 : ADD ctx/container.cfg / - ---> e7829950cee3 -Removing intermediate container b35224abf821 -Step 3/3 : CMD /bin/ls - ---> Running in fbc63d321d73 - ---> 3286931702ad -Removing intermediate container fbc63d321d73 -Successfully built 377c409b35e4 -``` - -This sends the URL `http://server/ctx.tar.gz` to the Docker daemon, which -downloads and extracts the referenced tarball. The `-f ctx/Dockerfile` -parameter specifies a path inside `ctx.tar.gz` to the `Dockerfile` that is used -to build the image. Any `ADD` commands in that `Dockerfile` that refer to local -paths must be relative to the root of the contents inside `ctx.tar.gz`. In the -example above, the tarball contains a directory `ctx/`, so the `ADD -ctx/container.cfg /` operation works as expected. - -### Build with - - -```bash -$ docker build - < Dockerfile -``` - -This will read a Dockerfile from `STDIN` without context. Due to the lack of a -context, no contents of any local directory will be sent to the Docker daemon. -Since there is no context, a Dockerfile `ADD` only works if it refers to a -remote URL. - -```bash -$ docker build - < context.tar.gz -``` - -This will build an image for a compressed context read from `STDIN`. Supported -formats are: bzip2, gzip and xz. - -### Usage of .dockerignore - -```bash -$ docker build . - -Uploading context 18.829 MB -Uploading context -Step 1/2 : FROM busybox - ---> 769b9341d937 -Step 2/2 : CMD echo Hello world - ---> Using cache - ---> 99cc1ad10469 -Successfully built 99cc1ad10469 -$ echo ".git" > .dockerignore -$ docker build . -Uploading context 6.76 MB -Uploading context -Step 1/2 : FROM busybox - ---> 769b9341d937 -Step 2/2 : CMD echo Hello world - ---> Using cache - ---> 99cc1ad10469 -Successfully built 99cc1ad10469 -``` - -This example shows the use of the `.dockerignore` file to exclude the `.git` -directory from the context. Its effect can be seen in the changed size of the -uploaded context. The builder reference contains detailed information on -[creating a .dockerignore file](../builder.md#dockerignore-file) - -### Tag image (-t) - -```bash -$ docker build -t vieux/apache:2.0 . -``` - -This will build like the previous example, but it will then tag the resulting -image. The repository name will be `vieux/apache` and the tag will be `2.0`. -[Read more about valid tags](tag.md). - -You can apply multiple tags to an image. For example, you can apply the `latest` -tag to a newly built image and add another tag that references a specific -version. -For example, to tag an image both as `whenry/fedora-jboss:latest` and -`whenry/fedora-jboss:v2.1`, use the following: - -```bash -$ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 . -``` -### Specify Dockerfile (-f) - -```bash -$ docker build -f Dockerfile.debug . -``` - -This will use a file called `Dockerfile.debug` for the build instructions -instead of `Dockerfile`. - -```bash -$ docker build -f dockerfiles/Dockerfile.debug -t myapp_debug . -$ docker build -f dockerfiles/Dockerfile.prod -t myapp_prod . -``` - -The above commands will build the current build context (as specified by the -`.`) twice, once using a debug version of a `Dockerfile` and once using a -production version. - -```bash -$ cd /home/me/myapp/some/dir/really/deep -$ docker build -f /home/me/myapp/dockerfiles/debug /home/me/myapp -$ docker build -f ../../../../dockerfiles/debug /home/me/myapp -``` - -These two `docker build` commands do the exact same thing. They both use the -contents of the `debug` file instead of looking for a `Dockerfile` and will use -`/home/me/myapp` as the root of the build context. Note that `debug` is in the -directory structure of the build context, regardless of how you refer to it on -the command line. - -> **Note:** -> `docker build` will return a `no such file or directory` error if the -> file or directory does not exist in the uploaded context. This may -> happen if there is no context, or if you specify a file that is -> elsewhere on the Host system. The context is limited to the current -> directory (and its children) for security reasons, and to ensure -> repeatable builds on remote Docker hosts. This is also the reason why -> `ADD ../file` will not work. - -### Optional parent cgroup (--cgroup-parent) - -When `docker build` is run with the `--cgroup-parent` option the containers -used in the build will be run with the [corresponding `docker run` -flag](../run.md#specifying-custom-cgroups). - -### Set ulimits in container (--ulimit) - -Using the `--ulimit` option with `docker build` will cause each build step's -container to be started using those [`--ulimit` -flag values](./run.md#set-ulimits-in-container-ulimit). - -### Set build-time variables (--build-arg) - -You can use `ENV` instructions in a Dockerfile to define variable -values. These values persist in the built image. However, often -persistence is not what you want. Users want to specify variables differently -depending on which host they build an image on. - -A good example is `http_proxy` or source versions for pulling intermediate -files. The `ARG` instruction lets Dockerfile authors define values that users -can set at build-time using the `--build-arg` flag: - -```bash -$ docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 . -``` - -This flag allows you to pass the build-time variables that are -accessed like regular environment variables in the `RUN` instruction of the -Dockerfile. Also, these values don't persist in the intermediate or final images -like `ENV` values do. - -Using this flag will not alter the output you see when the `ARG` lines from the -Dockerfile are echoed during the build process. - -For detailed information on using `ARG` and `ENV` instructions, see the -[Dockerfile reference](../builder.md). - -### Optional security options (--security-opt) - -This flag is only supported on a daemon running on Windows, and only supports -the `credentialspec` option. The `credentialspec` must be in the format -`file://spec.txt` or `registry://keyname`. - -### Specify isolation technology for container (--isolation) - -This option is useful in situations where you are running Docker containers on -Windows. The `--isolation=` option sets a container's isolation -technology. On Linux, the only supported is the `default` option which uses -Linux namespaces. On Microsoft Windows, you can specify these values: - - -| Value | Description | -|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `default` | Use the value specified by the Docker daemon's `--exec-opt` . If the `daemon` does not specify an isolation technology, Microsoft Windows uses `process` as its default value. | -| `process` | Namespace isolation only. | -| `hyperv` | Hyper-V hypervisor partition-based isolation. | - -Specifying the `--isolation` flag without a value is the same as setting `--isolation="default"`. - - -### Squash an image's layers (--squash) **Experimental Only** - -Once the image is built, squash the new layers into a new image with a single -new layer. Squashing does not destroy any existing image, rather it creates a new -image with the content of the squshed layers. This effectively makes it look -like all `Dockerfile` commands were created with a single layer. The build -cache is preserved with this method. - -**Note**: using this option means the new image will not be able to take -advantage of layer sharing with other images and may use significantly more -space. - -**Note**: using this option you may see significantly more space used due to -storing two copies of the image, one for the build cache with all the cache -layers in tact, and one for the squashed version. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/cli.md b/vendor/github.com/docker/docker/docs/reference/commandline/cli.md deleted file mode 100644 index e56fb9f84..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/cli.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -title: "Use the Docker command line" -description: "Docker's CLI command description and usage" -keywords: "Docker, Docker documentation, CLI, command line" ---- - - - -# Use the Docker command line - -To list available commands, either run `docker` with no parameters -or execute `docker help`: - -```bash -$ docker -Usage: docker [OPTIONS] COMMAND [ARG...] - docker [ --help | -v | --version ] - -A self-sufficient runtime for containers. - -Options: - --config string Location of client config files (default "/root/.docker") - -D, --debug Enable debug mode - --help Print usage - -H, --host value Daemon socket(s) to connect to (default []) - -l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info") - --tls Use TLS; implied by --tlsverify - --tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem") - --tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem") - --tlskey string Path to TLS key file (default "/root/.docker/key.pem") - --tlsverify Use TLS and verify the remote - -v, --version Print version information and quit - -Commands: - attach Attach to a running container - # […] -``` - -Depending on your Docker system configuration, you may be required to preface -each `docker` command with `sudo`. To avoid having to use `sudo` with the -`docker` command, your system administrator can create a Unix group called -`docker` and add users to it. - -For more information about installing Docker or `sudo` configuration, refer to -the [installation](https://docs.docker.com/engine/installation/) instructions for your operating system. - -## Environment variables - -For easy reference, the following list of environment variables are supported -by the `docker` command line: - -* `DOCKER_API_VERSION` The API version to use (e.g. `1.19`) -* `DOCKER_CONFIG` The location of your client configuration files. -* `DOCKER_CERT_PATH` The location of your authentication keys. -* `DOCKER_DRIVER` The graph driver to use. -* `DOCKER_HOST` Daemon socket to connect to. -* `DOCKER_NOWARN_KERNEL_VERSION` Prevent warnings that your Linux kernel is - unsuitable for Docker. -* `DOCKER_RAMDISK` If set this will disable 'pivot_root'. -* `DOCKER_TLS_VERIFY` When set Docker uses TLS and verifies the remote. -* `DOCKER_CONTENT_TRUST` When set Docker uses notary to sign and verify images. - Equates to `--disable-content-trust=false` for build, create, pull, push, run. -* `DOCKER_CONTENT_TRUST_SERVER` The URL of the Notary server to use. This defaults - to the same URL as the registry. -* `DOCKER_HIDE_LEGACY_COMMANDS` When set, Docker hides "legacy" top-level commands (such as `docker rm`, and - `docker pull`) in `docker help` output, and only `Management commands` per object-type (e.g., `docker container`) are - printed. This may become the default in a future release, at which point this environment-variable is removed. -* `DOCKER_TMPDIR` Location for temporary Docker files. - -Because Docker is developed using Go, you can also use any environment -variables used by the Go runtime. In particular, you may find these useful: - -* `HTTP_PROXY` -* `HTTPS_PROXY` -* `NO_PROXY` - -These Go environment variables are case-insensitive. See the -[Go specification](http://golang.org/pkg/net/http/) for details on these -variables. - -## Configuration files - -By default, the Docker command line stores its configuration files in a -directory called `.docker` within your `$HOME` directory. However, you can -specify a different location via the `DOCKER_CONFIG` environment variable -or the `--config` command line option. If both are specified, then the -`--config` option overrides the `DOCKER_CONFIG` environment variable. -For example: - - docker --config ~/testconfigs/ ps - -Instructs Docker to use the configuration files in your `~/testconfigs/` -directory when running the `ps` command. - -Docker manages most of the files in the configuration directory -and you should not modify them. However, you *can modify* the -`config.json` file to control certain aspects of how the `docker` -command behaves. - -Currently, you can modify the `docker` command behavior using environment -variables or command-line options. You can also use options within -`config.json` to modify some of the same behavior. When using these -mechanisms, you must keep in mind the order of precedence among them. Command -line options override environment variables and environment variables override -properties you specify in a `config.json` file. - -The `config.json` file stores a JSON encoding of several properties: - -The property `HttpHeaders` specifies a set of headers to include in all messages -sent from the Docker client to the daemon. Docker does not try to interpret or -understand these header; it simply puts them into the messages. Docker does -not allow these headers to change any headers it sets for itself. - -The property `psFormat` specifies the default format for `docker ps` output. -When the `--format` flag is not provided with the `docker ps` command, -Docker's client uses this property. If this property is not set, the client -falls back to the default table format. For a list of supported formatting -directives, see the -[**Formatting** section in the `docker ps` documentation](ps.md) - -The property `imagesFormat` specifies the default format for `docker images` output. -When the `--format` flag is not provided with the `docker images` command, -Docker's client uses this property. If this property is not set, the client -falls back to the default table format. For a list of supported formatting -directives, see the [**Formatting** section in the `docker images` documentation](images.md) - -The property `serviceInspectFormat` specifies the default format for `docker -service inspect` output. When the `--format` flag is not provided with the -`docker service inspect` command, Docker's client uses this property. If this -property is not set, the client falls back to the default json format. For a -list of supported formatting directives, see the -[**Formatting** section in the `docker service inspect` documentation](service_inspect.md) - -The property `statsFormat` specifies the default format for `docker -stats` output. When the `--format` flag is not provided with the -`docker stats` command, Docker's client uses this property. If this -property is not set, the client falls back to the default table -format. For a list of supported formatting directives, see -[**Formatting** section in the `docker stats` documentation](stats.md) - -Once attached to a container, users detach from it and leave it running using -the using `CTRL-p CTRL-q` key sequence. This detach key sequence is customizable -using the `detachKeys` property. Specify a `` value for the -property. The format of the `` is a comma-separated list of either -a letter [a-Z], or the `ctrl-` combined with any of the following: - -* `a-z` (a single lowercase alpha character ) -* `@` (at sign) -* `[` (left bracket) -* `\\` (two backward slashes) -* `_` (underscore) -* `^` (caret) - -Your customization applies to all containers started in with your Docker client. -Users can override your custom or the default key sequence on a per-container -basis. To do this, the user specifies the `--detach-keys` flag with the `docker -attach`, `docker exec`, `docker run` or `docker start` command. - -Following is a sample `config.json` file: - - {% raw %} - { - "HttpHeaders": { - "MyHeader": "MyValue" - }, - "psFormat": "table {{.ID}}\\t{{.Image}}\\t{{.Command}}\\t{{.Labels}}", - "imagesFormat": "table {{.ID}}\\t{{.Repository}}\\t{{.Tag}}\\t{{.CreatedAt}}", - "statsFormat": "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}", - "serviceInspectFormat": "pretty", - "detachKeys": "ctrl-e,e" - } - {% endraw %} - -### Notary - -If using your own notary server and a self-signed certificate or an internal -Certificate Authority, you need to place the certificate at -`tls//ca.crt` in your docker config directory. - -Alternatively you can trust the certificate globally by adding it to your system's -list of root Certificate Authorities. - -## Help - -To list the help on any command just execute the command, followed by the -`--help` option. - - $ docker run --help - - Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] - - Run a command in a new container - - Options: - --add-host value Add a custom host-to-IP mapping (host:ip) (default []) - -a, --attach value Attach to STDIN, STDOUT or STDERR (default []) - ... - -## Option types - -Single character command line options can be combined, so rather than -typing `docker run -i -t --name test busybox sh`, -you can write `docker run -it --name test busybox sh`. - -### Boolean - -Boolean options take the form `-d=false`. The value you see in the help text is -the default value which is set if you do **not** specify that flag. If you -specify a Boolean flag without a value, this will set the flag to `true`, -irrespective of the default value. - -For example, running `docker run -d` will set the value to `true`, so your -container **will** run in "detached" mode, in the background. - -Options which default to `true` (e.g., `docker build --rm=true`) can only be -set to the non-default value by explicitly setting them to `false`: - - $ docker build --rm=false . - -### Multi - -You can specify options like `-a=[]` multiple times in a single command line, -for example in these commands: - - $ docker run -a stdin -a stdout -i -t ubuntu /bin/bash - $ docker run -a stdin -a stdout -a stderr ubuntu /bin/ls - -Sometimes, multiple options can call for a more complex value string as for -`-v`: - - $ docker run -v /host:/container example/mysql - -> **Note:** -> Do not use the `-t` and `-a stderr` options together due to -> limitations in the `pty` implementation. All `stderr` in `pty` mode -> simply goes to `stdout`. - -### Strings and Integers - -Options like `--name=""` expect a string, and they -can only be specified once. Options like `-c=0` -expect an integer, and they can only be specified once. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/commit.md b/vendor/github.com/docker/docker/docs/reference/commandline/commit.md deleted file mode 100644 index 8f971a5d9..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/commit.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: "commit" -description: "The commit command description and usage" -keywords: "commit, file, changes" ---- - - - -# commit - -```markdown -Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] - -Create a new image from a container's changes - -Options: - -a, --author string Author (e.g., "John Hannibal Smith ") - -c, --change value Apply Dockerfile instruction to the created image (default []) - --help Print usage - -m, --message string Commit message - -p, --pause Pause container during commit (default true) -``` - -It can be useful to commit a container's file changes or settings into a new -image. This allows you debug a container by running an interactive shell, or to -export a working dataset to another server. Generally, it is better to use -Dockerfiles to manage your images in a documented and maintainable way. -[Read more about valid image names and tags](tag.md). - -The commit operation will not include any data contained in -volumes mounted inside the container. - -By default, the container being committed and its processes will be paused -while the image is committed. This reduces the likelihood of encountering data -corruption during the process of creating the commit. If this behavior is -undesired, set the `--pause` option to false. - -The `--change` option will apply `Dockerfile` instructions to the image that is -created. Supported `Dockerfile` instructions: -`CMD`|`ENTRYPOINT`|`ENV`|`EXPOSE`|`LABEL`|`ONBUILD`|`USER`|`VOLUME`|`WORKDIR` - -## Commit a container - - $ docker ps - ID IMAGE COMMAND CREATED STATUS PORTS - c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours - 197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours - $ docker commit c3f279d17e0a svendowideit/testimage:version3 - f5283438590d - $ docker images - REPOSITORY TAG ID CREATED SIZE - svendowideit/testimage version3 f5283438590d 16 seconds ago 335.7 MB - -## Commit a container with new configurations - - {% raw %} - $ docker ps - ID IMAGE COMMAND CREATED STATUS PORTS - c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours - 197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours - $ docker inspect -f "{{ .Config.Env }}" c3f279d17e0a - [HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin] - $ docker commit --change "ENV DEBUG true" c3f279d17e0a svendowideit/testimage:version3 - f5283438590d - $ docker inspect -f "{{ .Config.Env }}" f5283438590d - [HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin DEBUG=true] - {% endraw %} - -## Commit a container with new `CMD` and `EXPOSE` instructions - - $ docker ps - ID IMAGE COMMAND CREATED STATUS PORTS - c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours - 197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours - - $ docker commit --change='CMD ["apachectl", "-DFOREGROUND"]' -c "EXPOSE 80" c3f279d17e0a svendowideit/testimage:version4 - f5283438590d - - $ docker run -d svendowideit/testimage:version4 - 89373736e2e7f00bc149bd783073ac43d0507da250e999f3f1036e0db60817c0 - - $ docker ps - ID IMAGE COMMAND CREATED STATUS PORTS - 89373736e2e7 testimage:version4 "apachectl -DFOREGROU" 3 seconds ago Up 2 seconds 80/tcp - c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours - 197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/container_prune.md b/vendor/github.com/docker/docker/docs/reference/commandline/container_prune.md deleted file mode 100644 index 43156406e..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/container_prune.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "container prune" -description: "Remove all stopped containers" -keywords: container, prune, delete, remove ---- - - - -# container prune - -```markdown -Usage: docker container prune [OPTIONS] - -Remove all stopped containers - -Options: - -f, --force Do not prompt for confirmation - --help Print usage -``` - -## Examples - -```bash -$ docker container prune -WARNING! This will remove all stopped containers. -Are you sure you want to continue? [y/N] y -Deleted Containers: -4a7f7eebae0f63178aff7eb0aa39cd3f0627a203ab2df258c1a00b456cf20063 -f98f9c2aa1eaf727e4ec9c0283bc7d4aa4762fbdba7f26191f26c97f64090360 - -Total reclaimed space: 212 B -``` - -## Related information - -* [system df](system_df.md) -* [volume prune](volume_prune.md) -* [image prune](image_prune.md) -* [network prune](network_prune.md) -* [system prune](system_prune.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/cp.md b/vendor/github.com/docker/docker/docs/reference/commandline/cp.md deleted file mode 100644 index fcfd35fce..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/cp.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: "cp" -description: "The cp command description and usage" -keywords: "copy, container, files, folders" ---- - - - -# cp - -```markdown -Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- - docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH - -Copy files/folders between a container and the local filesystem - -Use '-' as the source to read a tar archive from stdin -and extract it to a directory destination in a container. -Use '-' as the destination to stream a tar archive of a -container source to stdout. - -Options: - -L, --follow-link Always follow symbol link in SRC_PATH - --help Print usage -``` - -The `docker cp` utility copies the contents of `SRC_PATH` to the `DEST_PATH`. -You can copy from the container's file system to the local machine or the -reverse, from the local filesystem to the container. If `-` is specified for -either the `SRC_PATH` or `DEST_PATH`, you can also stream a tar archive from -`STDIN` or to `STDOUT`. The `CONTAINER` can be a running or stopped container. -The `SRC_PATH` or `DEST_PATH` can be a file or directory. - -The `docker cp` command assumes container paths are relative to the container's -`/` (root) directory. This means supplying the initial forward slash is optional; -The command sees `compassionate_darwin:/tmp/foo/myfile.txt` and -`compassionate_darwin:tmp/foo/myfile.txt` as identical. Local machine paths can -be an absolute or relative value. The command interprets a local machine's -relative paths as relative to the current working directory where `docker cp` is -run. - -The `cp` command behaves like the Unix `cp -a` command in that directories are -copied recursively with permissions preserved if possible. Ownership is set to -the user and primary group at the destination. For example, files copied to a -container are created with `UID:GID` of the root user. Files copied to the local -machine are created with the `UID:GID` of the user which invoked the `docker cp` -command. If you specify the `-L` option, `docker cp` follows any symbolic link -in the `SRC_PATH`. `docker cp` does *not* create parent directories for -`DEST_PATH` if they do not exist. - -Assuming a path separator of `/`, a first argument of `SRC_PATH` and second -argument of `DEST_PATH`, the behavior is as follows: - -- `SRC_PATH` specifies a file - - `DEST_PATH` does not exist - - the file is saved to a file created at `DEST_PATH` - - `DEST_PATH` does not exist and ends with `/` - - Error condition: the destination directory must exist. - - `DEST_PATH` exists and is a file - - the destination is overwritten with the source file's contents - - `DEST_PATH` exists and is a directory - - the file is copied into this directory using the basename from - `SRC_PATH` -- `SRC_PATH` specifies a directory - - `DEST_PATH` does not exist - - `DEST_PATH` is created as a directory and the *contents* of the source - directory are copied into this directory - - `DEST_PATH` exists and is a file - - Error condition: cannot copy a directory to a file - - `DEST_PATH` exists and is a directory - - `SRC_PATH` does not end with `/.` - - the source directory is copied into this directory - - `SRC_PATH` does end with `/.` - - the *content* of the source directory is copied into this - directory - -The command requires `SRC_PATH` and `DEST_PATH` to exist according to the above -rules. If `SRC_PATH` is local and is a symbolic link, the symbolic link, not -the target, is copied by default. To copy the link target and not the link, specify -the `-L` option. - -A colon (`:`) is used as a delimiter between `CONTAINER` and its path. You can -also use `:` when specifying paths to a `SRC_PATH` or `DEST_PATH` on a local -machine, for example `file:name.txt`. If you use a `:` in a local machine path, -you must be explicit with a relative or absolute path, for example: - - `/path/to/file:name.txt` or `./file:name.txt` - -It is not possible to copy certain system files such as resources under -`/proc`, `/sys`, `/dev`, [tmpfs](run.md#mount-tmpfs-tmpfs), and mounts created by -the user in the container. However, you can still copy such files by manually -running `tar` in `docker exec`. For example (consider `SRC_PATH` and `DEST_PATH` -are directories): - - $ docker exec foo tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | tar Cxf DEST_PATH - - -or - - $ tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | docker exec -i foo tar Cxf DEST_PATH - - - -Using `-` as the `SRC_PATH` streams the contents of `STDIN` as a tar archive. -The command extracts the content of the tar to the `DEST_PATH` in container's -filesystem. In this case, `DEST_PATH` must specify a directory. Using `-` as -the `DEST_PATH` streams the contents of the resource as a tar archive to `STDOUT`. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/create.md b/vendor/github.com/docker/docker/docs/reference/commandline/create.md deleted file mode 100644 index e6582e4a3..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/create.md +++ /dev/null @@ -1,211 +0,0 @@ ---- -title: "create" -description: "The create command description and usage" -keywords: "docker, create, container" ---- - - - -# create - -Creates a new container. - -```markdown -Usage: docker create [OPTIONS] IMAGE [COMMAND] [ARG...] - -Create a new container - -Options: - --add-host value Add a custom host-to-IP mapping (host:ip) (default []) - -a, --attach value Attach to STDIN, STDOUT or STDERR (default []) - --blkio-weight value Block IO (relative weight), between 10 and 1000 - --blkio-weight-device value Block IO weight (relative device weight) (default []) - --cap-add value Add Linux capabilities (default []) - --cap-drop value Drop Linux capabilities (default []) - --cgroup-parent string Optional parent cgroup for the container - --cidfile string Write the container ID to the file - --cpu-count int The number of CPUs available for execution by the container. - Windows daemon only. On Windows Server containers, this is - approximated as a percentage of total CPU usage. - --cpu-percent int CPU percent (Windows only) - --cpu-period int Limit CPU CFS (Completely Fair Scheduler) period - --cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota - -c, --cpu-shares int CPU shares (relative weight) - --cpus NanoCPUs Number of CPUs (default 0.000) - --cpu-rt-period int Limit the CPU real-time period in microseconds - --cpu-rt-runtime int Limit the CPU real-time runtime in microseconds - --cpuset-cpus string CPUs in which to allow execution (0-3, 0,1) - --cpuset-mems string MEMs in which to allow execution (0-3, 0,1) - --device value Add a host device to the container (default []) - --device-read-bps value Limit read rate (bytes per second) from a device (default []) - --device-read-iops value Limit read rate (IO per second) from a device (default []) - --device-write-bps value Limit write rate (bytes per second) to a device (default []) - --device-write-iops value Limit write rate (IO per second) to a device (default []) - --disable-content-trust Skip image verification (default true) - --dns value Set custom DNS servers (default []) - --dns-option value Set DNS options (default []) - --dns-search value Set custom DNS search domains (default []) - --entrypoint string Overwrite the default ENTRYPOINT of the image - -e, --env value Set environment variables (default []) - --env-file value Read in a file of environment variables (default []) - --expose value Expose a port or a range of ports (default []) - --group-add value Add additional groups to join (default []) - --health-cmd string Command to run to check health - --health-interval duration Time between running the check (ns|us|ms|s|m|h) (default 0s) - --health-retries int Consecutive failures needed to report unhealthy - --health-timeout duration Maximum time to allow one check to run (ns|us|ms|s|m|h) (default 0s) - --help Print usage - -h, --hostname string Container host name - --init Run an init inside the container that forwards signals and reaps processes - --init-path string Path to the docker-init binary - -i, --interactive Keep STDIN open even if not attached - --io-maxbandwidth string Maximum IO bandwidth limit for the system drive (Windows only) - --io-maxiops uint Maximum IOps limit for the system drive (Windows only) - --ip string Container IPv4 address (e.g. 172.30.100.104) - --ip6 string Container IPv6 address (e.g. 2001:db8::33) - --ipc string IPC namespace to use - --isolation string Container isolation technology - --kernel-memory string Kernel memory limit - -l, --label value Set meta data on a container (default []) - --label-file value Read in a line delimited file of labels (default []) - --link value Add link to another container (default []) - --link-local-ip value Container IPv4/IPv6 link-local addresses (default []) - --log-driver string Logging driver for the container - --log-opt value Log driver options (default []) - --mac-address string Container MAC address (e.g. 92:d0:c6:0a:29:33) - -m, --memory string Memory limit - --memory-reservation string Memory soft limit - --memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap - --memory-swappiness int Tune container memory swappiness (0 to 100) (default -1) - --name string Assign a name to the container - --network-alias value Add network-scoped alias for the container (default []) - --network string Connect a container to a network (default "default") - 'bridge': create a network stack on the default Docker bridge - 'none': no networking - 'container:': reuse another container's network stack - 'host': use the Docker host network stack - '|': connect to a user-defined network - --no-healthcheck Disable any container-specified HEALTHCHECK - --oom-kill-disable Disable OOM Killer - --oom-score-adj int Tune host's OOM preferences (-1000 to 1000) - --pid string PID namespace to use - --pids-limit int Tune container pids limit (set -1 for unlimited), kernel >= 4.3 - --privileged Give extended privileges to this container - -p, --publish value Publish a container's port(s) to the host (default []) - -P, --publish-all Publish all exposed ports to random ports - --read-only Mount the container's root filesystem as read only - --restart string Restart policy to apply when a container exits (default "no") - Possible values are: no, on-failure[:max-retry], always, unless-stopped - --rm Automatically remove the container when it exits - --runtime string Runtime to use for this container - --security-opt value Security Options (default []) - --shm-size string Size of /dev/shm, default value is 64MB. - The format is ``. `number` must be greater than `0`. - Unit is optional and can be `b` (bytes), `k` (kilobytes), `m` (megabytes), - or `g` (gigabytes). If you omit the unit, the system uses bytes. - --stop-signal string Signal to stop a container, SIGTERM by default (default "SIGTERM") - --stop-timeout=10 Timeout (in seconds) to stop a container - --storage-opt value Storage driver options for the container (default []) - --sysctl value Sysctl options (default map[]) - --tmpfs value Mount a tmpfs directory (default []) - -t, --tty Allocate a pseudo-TTY - --ulimit value Ulimit options (default []) - -u, --user string Username or UID (format: [:]) - --userns string User namespace to use - 'host': Use the Docker host user namespace - '': Use the Docker daemon user namespace specified by `--userns-remap` option. - --uts string UTS namespace to use - -v, --volume value Bind mount a volume (default []). The format - is `[host-src:]container-dest[:]`. - The comma-delimited `options` are [rw|ro], - [z|Z], [[r]shared|[r]slave|[r]private], and - [nocopy]. The 'host-src' is an absolute path - or a name value. - --volume-driver string Optional volume driver for the container - --volumes-from value Mount volumes from the specified container(s) (default []) - -w, --workdir string Working directory inside the container -``` - -The `docker create` command creates a writeable container layer over the -specified image and prepares it for running the specified command. The -container ID is then printed to `STDOUT`. This is similar to `docker run -d` -except the container is never started. You can then use the -`docker start ` command to start the container at any point. - -This is useful when you want to set up a container configuration ahead of time -so that it is ready to start when you need it. The initial status of the -new container is `created`. - -Please see the [run command](run.md) section and the [Docker run reference](../run.md) for more details. - -## Examples - - $ docker create -t -i fedora bash - 6d8af538ec541dd581ebc2a24153a28329acb5268abe5ef868c1f1a261221752 - $ docker start -a -i 6d8af538ec5 - bash-4.2# - -As of v1.4.0 container volumes are initialized during the `docker create` phase -(i.e., `docker run` too). For example, this allows you to `create` the `data` -volume container, and then use it from another container: - - $ docker create -v /data --name data ubuntu - 240633dfbb98128fa77473d3d9018f6123b99c454b3251427ae190a7d951ad57 - $ docker run --rm --volumes-from data ubuntu ls -la /data - total 8 - drwxr-xr-x 2 root root 4096 Dec 5 04:10 . - drwxr-xr-x 48 root root 4096 Dec 5 04:11 .. - -Similarly, `create` a host directory bind mounted volume container, which can -then be used from the subsequent container: - - $ docker create -v /home/docker:/docker --name docker ubuntu - 9aa88c08f319cd1e4515c3c46b0de7cc9aa75e878357b1e96f91e2c773029f03 - $ docker run --rm --volumes-from docker ubuntu ls -la /docker - total 20 - drwxr-sr-x 5 1000 staff 180 Dec 5 04:00 . - drwxr-xr-x 48 root root 4096 Dec 5 04:13 .. - -rw-rw-r-- 1 1000 staff 3833 Dec 5 04:01 .ash_history - -rw-r--r-- 1 1000 staff 446 Nov 28 11:51 .ashrc - -rw-r--r-- 1 1000 staff 25 Dec 5 04:00 .gitconfig - drwxr-sr-x 3 1000 staff 60 Dec 1 03:28 .local - -rw-r--r-- 1 1000 staff 920 Nov 28 11:51 .profile - drwx--S--- 2 1000 staff 460 Dec 5 00:51 .ssh - drwxr-xr-x 32 1000 staff 1140 Dec 5 04:01 docker - -Set storage driver options per container. - - $ docker create -it --storage-opt size=120G fedora /bin/bash - -This (size) will allow to set the container rootfs size to 120G at creation time. -This option is only available for the `devicemapper`, `btrfs`, `overlay2`, -`windowsfilter` and `zfs` graph drivers. -For the `devicemapper`, `btrfs`, `windowsfilter` and `zfs` graph drivers, -user cannot pass a size less than the Default BaseFS Size. -For the `overlay2` storage driver, the size option is only available if the -backing fs is `xfs` and mounted with the `pquota` mount option. -Under these conditions, user can pass any size less then the backing fs size. - -### Specify isolation technology for container (--isolation) - -This option is useful in situations where you are running Docker containers on -Windows. The `--isolation=` option sets a container's isolation -technology. On Linux, the only supported is the `default` option which uses -Linux namespaces. On Microsoft Windows, you can specify these values: - - -| Value | Description | -|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `default` | Use the value specified by the Docker daemon's `--exec-opt` . If the `daemon` does not specify an isolation technology, Microsoft Windows uses `process` as its default value if the -daemon is running on Windows server, or `hyperv` if running on Windows client. | -| `process` | Namespace isolation only. | -| `hyperv` | Hyper-V hypervisor partition-based isolation. | - -Specifying the `--isolation` flag without a value is the same as setting `--isolation="default"`. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/deploy.md b/vendor/github.com/docker/docker/docs/reference/commandline/deploy.md deleted file mode 100644 index 53074b2fd..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/deploy.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: "deploy" -description: "The deploy command description and usage" -keywords: "stack, deploy" -advisory: "experimental" ---- - - - -# deploy (alias for stack deploy) (experimental) - -```markdown -Usage: docker deploy [OPTIONS] STACK - -Deploy a new stack or update an existing stack - -Aliases: - deploy, up - -Options: - --bundle-file string Path to a Distributed Application Bundle file - --compose-file string Path to a Compose file - --help Print usage - --with-registry-auth Send registry authentication details to Swarm agents -``` - -Create and update a stack from a `compose` or a `dab` file on the swarm. This command -has to be run targeting a manager node. - -## Compose file - -The `deploy` command supports compose file version `3.0` and above. - -```bash -$ docker stack deploy --compose-file docker-compose.yml vossibility -Ignoring unsupported options: links - -Creating network vossibility_vossibility -Creating network vossibility_default -Creating service vossibility_nsqd -Creating service vossibility_logstash -Creating service vossibility_elasticsearch -Creating service vossibility_kibana -Creating service vossibility_ghollector -Creating service vossibility_lookupd -``` - -You can verify that the services were correctly created - -``` -$ docker service ls -ID NAME MODE REPLICAS IMAGE -29bv0vnlm903 vossibility_lookupd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662 -4awt47624qwh vossibility_nsqd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662 -4tjx9biia6fs vossibility_elasticsearch replicated 1/1 elasticsearch@sha256:12ac7c6af55d001f71800b83ba91a04f716e58d82e748fa6e5a7359eed2301aa -7563uuzr9eys vossibility_kibana replicated 1/1 kibana@sha256:6995a2d25709a62694a937b8a529ff36da92ebee74bafd7bf00e6caf6db2eb03 -9gc5m4met4he vossibility_logstash replicated 1/1 logstash@sha256:2dc8bddd1bb4a5a34e8ebaf73749f6413c101b2edef6617f2f7713926d2141fe -axqh55ipl40h vossibility_vossibility-collector replicated 1/1 icecrime/vossibility-collector@sha256:f03f2977203ba6253988c18d04061c5ec7aab46bca9dfd89a9a1fa4500989fba -``` - -## DAB file - -```bash -$ docker stack deploy --bundle-file vossibility-stack.dab vossibility -Loading bundle from vossibility-stack.dab -Creating service vossibility_elasticsearch -Creating service vossibility_kibana -Creating service vossibility_logstash -Creating service vossibility_lookupd -Creating service vossibility_nsqd -Creating service vossibility_vossibility-collector -``` - -You can verify that the services were correctly created: - -```bash -$ docker service ls -ID NAME MODE REPLICAS IMAGE -29bv0vnlm903 vossibility_lookupd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662 -4awt47624qwh vossibility_nsqd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662 -4tjx9biia6fs vossibility_elasticsearch replicated 1/1 elasticsearch@sha256:12ac7c6af55d001f71800b83ba91a04f716e58d82e748fa6e5a7359eed2301aa -7563uuzr9eys vossibility_kibana replicated 1/1 kibana@sha256:6995a2d25709a62694a937b8a529ff36da92ebee74bafd7bf00e6caf6db2eb03 -9gc5m4met4he vossibility_logstash replicated 1/1 logstash@sha256:2dc8bddd1bb4a5a34e8ebaf73749f6413c101b2edef6617f2f7713926d2141fe -axqh55ipl40h vossibility_vossibility-collector replicated 1/1 icecrime/vossibility-collector@sha256:f03f2977203ba6253988c18d04061c5ec7aab46bca9dfd89a9a1fa4500989fba -``` - -## Related information - -* [stack config](stack_config.md) -* [stack deploy](stack_deploy.md) -* [stack ls](stack_ls.md) -* [stack ps](stack_ps.md) -* [stack rm](stack_rm.md) -* [stack services](stack_services.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/diff.md b/vendor/github.com/docker/docker/docs/reference/commandline/diff.md deleted file mode 100644 index be27678dc..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/diff.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "diff" -description: "The diff command description and usage" -keywords: "list, changed, files, container" ---- - - - -# diff - -```markdown -Usage: docker diff CONTAINER - -Inspect changes on a container's filesystem - -Options: - --help Print usage -``` - -List the changed files and directories in a container᾿s filesystem. - There are 3 events that are listed in the `diff`: - -1. `A` - Add -2. `D` - Delete -3. `C` - Change - -For example: - - $ docker diff 7bb0e258aefe - - C /dev - A /dev/kmsg - C /etc - A /etc/mtab - A /go - A /go/src - A /go/src/github.com - A /go/src/github.com/docker - A /go/src/github.com/docker/docker - A /go/src/github.com/docker/docker/.git - .... diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/docker_images.gif b/vendor/github.com/docker/docker/docs/reference/commandline/docker_images.gif deleted file mode 100644 index 5894ca270e002758b8f332141e00356e42868880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35785 zcmd3tS6CBW*sj+UAPFD|HS{DP9Sl`K#LzngL_|~wh=>J0Kv6{0(5o7H5isItu^ai_j`|%i=(+kus7_0yaNA47>mV; zii%50N=ZvgDgGCEGFeScO+{N+4I~zJ0sDe?UNh-Oink491>4dt5?8J@)TEc<>-SB4TS))R7}c z0#5#yKqfOd`M>PV%*@Kl3O{@HU~X<+Ufw^&#nBi3%dyJJnwpvuwY8_3nwp!NnU^mo zUHLC*U0uDsy_wgqpX=`*930FU9?l;hpO}~^zIX4!ga2}IX6DJ0Csj|M*3QpAfByX4 zyLXpAd{|yy{`>du|2*{nFBkF;6bpbi(EIO({u>h@vdW|Ct&fR;w$@>qcrXN0&a7xY`c7GB^N@v$7r*be2ujX3j+*UQ5MKnGzH`-P`a-L+DspQgL zGnS{dwQ1K_d+kIKblEGe4Lvr5kv=tL^y+OUu+{sPO3R{P3jf$h&{<^j`b)jGH8?>Uq8E^YhU>-JrYIyO&?{s@*Pn_VvWv z_lWH>Csg%*|HL26QuVrV{m1f~v5S%Y)nhTK7CHdXxe$t5S$_BI-p!k_Hdo!P=s$)1P1V~&Y2{vtmfPxsbkVUvk#Wq3)V zblS@z#%UJ_atYsYPfC=^u`fQ`zwwmz6AA*M20sQ|*mJPFTPjiA=v9PmEZ&PE&>0@3;FcQ8sU0l3ENxQ{Cq1 zaEfgMXRxW=ufe|AwB>E3q;9&P>GJiT0rTrL*vz-B!w1XF7kw0(XM$6gn=kP)Y5&OIDE7?Z1{U%Lq8-P{eJ$w=le*56bfS^m>{D7G4J^t zpKF~q-0t7;hmi^bB z(Fds=Qkkvv%5_?0W%J_abw0*CPgTTnId)vCt+;eRAo-Q!Z&5YKkh}TZoH8W}05v+W zOtGW#lB6~O?oqyi9?b^8dOLr8=r%47pYa~_oEI?$IsL$Tr}-cxP&w1GBzJ?vY}MU$ z$R5%+58k|*;xp1>j>^k164M%*4c5I=9zVDtUoGpsJ=A-|HH!b;h_U6bCvO(kNk%~O zKSJ+BNkAp#ngj|!|5iTG_T>t8W8ibuJjk9_DH`j-L`~RI)&Qhf^rJIR=)dMf)~&d_ zL)7&^MU9yrH%cc!4Pi=#`;)ni0H|{NaYT0euiZ4%*@|{w=PG>C`%RjSQV2o+C?f7Z zijk5WfRBkdkR?C+iKhFf1U{;iY3C^#OyR{e8q7DC<^-9cU|l&C24Mc|=DFQd?hN>K zgcmmY3tf1qYs5N?aZ*-cK!}=*5Po}{A2m{^kf}g4hZ?6~^jy9>=a!faX*D5eD~#)t z9kDQr!dBl_OU(peM4!x1iL+V1VQ5^;#~G_Yl}&MvG}HulZ98i47{G1qky&R~I#*+6 znL&mkS&6325U6-N@mna@R=TU$r18f@;d-{M5RaG=8hQKlhkLeSD|PF=Ww~TdZp8Eu z-BNcdY4}vO-I%Y2S@DTViQ5rHi&jiQc{>n*Tm$rg(I~7HD^OVEh>e+ z%|dv0hK;nn7Z%TZDXDe9Ta(VL)(?kp1{x?xJ}QC|xsvgw_cH@>6NE@RQtsoJ65R`1D9r z!z9=<>Q{YQGS_qWC6^*;o!9ysc2+9RxZ4#^O~0`IMY&yf_Nu(?CERkUq6R)e#4H^W zb>>52_5czlfq>%^PyYQ`cnu~2SQ?)op3Fz}*f#6pBhl|GzU|eShl^vIN;Q=dL`G_%I0; zp3#SOXz(|a7NYoRPWE2u;JZrw!rEMJ(yKj8TryY4f|Ph9t3R2(heLdQR6XD0x2@XjFqUQ1P$@RZSmoeiMSdfK)E#B?4YQY+mAaXq55GJcvRMx zHX%-e#M8m62$Qu@6L8NF_z6Ui{bqtO+i9^rRZWnkn>dXepsBe8{+k7Q(nhbltK3q)wW^O=PidsGa<}juJEZ>PLjLukVzih0RC&hw<~g0FI1&Z)|Rb-^Mc{+%fX)QLmJsaQ>(zHl`DBa_-MGWpV zz)>qybLqyz!x(p#EdYDF?Wu`5NewSfkQ3u|BC9g2`h|q?Tx`g{kpV~E2UrX6}j6qE<=?HzvptZQjSK{nGcQe<;f`OP1QGgx5a`HeWu4b*OLa zL4k|82leWhV&+Rjx?tSLK!=A6Fzp#rzO0fknCsYQwa+0unRsPA9 zD93a(*@^F$xKbt=*QXPjxKqg5(YZBC6y-4;qU;Z21gEBh^Pwme{m5U>r}{F3DxX)= zMMxJ&cvpY&tEBgV{|>Y~-MoL|?m)XO`y#$w>*&cdqN&&&D%TxL`4A`r(uBE$3BZw9na5X5Zh0Q>~Yw;d}>D8(3J&k+H-Vk-RYAA6vacHvXWLbAVZ5O z#-F*h@x&v0r(;)-DLRvXZnXXFbV_>Zj1q+@Q{_A>dGyT}4^<{?N==d`0aNxr@1L(S zPxK=&Lq|Oa#jyb~9IG%BuN3YII2u~TMuH`1{hKr7F0xLzdG}Q^L}Mz1I!NO^=j|Cn zT$(tBXitjKnncBUKui<6SO@)aJfmFf@oQf)#o2vgIeGI`Du^X-U4h<*q7CcexG%1I z9mwmsOp6sc59WbN0UFvFnIu5X@EN%?M>FaBRJaIBD+I4hZ)q7{3_2F9>fQwvzAFg4sW4CzaOvS{f0 zQ5evWcUl-tKI9&WDsrGS4m4$pvEl*1Ot1%_rDIR;w*3Zl$OVt$Nb%};_+c%uEXJ;F zdbbL(i^7^cTM>C0q%q{{DYQ+dDo2EyqtcCFmLNwef)>)g!ceSju0|vEe$6pw4s0?A zwMP5(?%hIh(#6wZT`FAq^=#M1oTHN{U?7!D$n`!-2B5ATvIaW{-26-?ROKJL%>uI> zD}=laeH5LONJB8Z^NGB`4^A;&yoeJo5p_X`H4`Lq5kTK>LIa}0hIjWC4SdHE=}<>_ z%*}RkX@Lbb+P%Ou*RFjPE$AqA$UPZhV^Yb?OyZ(|4HB8Lt`^Bj3{ZtBWD{9*V0bIF zBp)N>LW7}w7;Rc<3Jp%o-F^lu)S`_c@W6Qt$leYe)yBAvovY*)l~Rv%zGCE#$@OgG#87~u85m)Xmh0Oj zIzE{mc`iA!uzg0G=u$j_JuucS`y>X(K7o-Dm?cJ{o>-x}LezzxL+1LYQrSs-czrIc z!im=AXuWX3ymG;~^C3FBVo?qi=9B;yoJ>-s3rMW>sxSPpi{0e~jIv)AI)55v2f|iy z6kJ%j1qSC-rCC)`X;G@HS^3!+6XSS3+ybL$iIMqP`EEZ(od(B@T}b9dc+l2nN5<3j zxJQYx_6-+}ar;b5Wsg}TRN zeBI(caLX^pCbPy_&WFCOyMYtByY@I1n#Dg(6B%GmAtvWm1D&&4W6irXml>Amiji=^ z!2HT2Civ-(Av1u!E4FO5F37c|Gpr@Na!dU(u!mn3Fmf{{yX_O%XP{#v&JBV~2dQ#MqFUD)~t0 zDAp*G+(tQ?7J}+WdX8q~A4_O=8Nlwr?6RxNzc`9s?_}6;D8k@y61y{nkKhD*O5-pm zXHf(8P8Iwmmz|ie;TR`8^ezgPnu+$nt>TutuAC20SABgvbwPjLWRFIcYy|ddJ!5w| zEhwAYoyOf>%|h*nN1X8JvL*KY_nLB62hkSF)m1<6ogzo_R5a?PCiXgMcE*w`WmqkW zImm1O3+H#La}?KWX{#;OlgD(`?wrg|i9(lbU|msy4gIhttLK1u3vr=Cmusrafd$dm zM~yZ`UW?i7MB{Blv>3*l)~X-@yfN}d^mn7cE7!}HEnXlumoDs}GGX3!va{f(F`x2D z@#Y=b)YKdVN$rv&pihsnjYj&2xmp^&8(Z5`Rz6#zv2hoiQuL}I3KgJKGK~)qws*0} ziAE=KkN>HKsm%~-?HRc`pq)+MB!Fn#+hLu%T#D+ zQ#|#)k4BA|{4QhVs}>}!G}m2A?`aymjsN=t4g4Wf}S5ch9$0ceAg=rAk>J5P=k=?%}NDy;#U+ zoDGo=|0rAcI0^>)N3?k(P1GYoAnz50I@0Tgc4ZIDWVa4M9thB(nVK4-RdU&bTJHX_ z*}3n1+`v|&4s@F_YR5(~Rj@4;k>_Zv7wG6yZ9K%M*t_IgM$h9zyV^_F+0zg*^-zfm zYys}nQIAl;O$BDI+S)YvwzjHVjUMN8`J1AVh$D?6%GCBz1M_*0R9wjQ*H&SPP?+BC z7xB_(6KXTBhPEOA%cE;V0(~k%;n9;KY{ur~T^J9;BN8+j2={_`i0l<@eULg4)HUqgCas0)Kx}yavlp;lEOaHMVs>~pF*S@|4x6wUW7KC~K4^S9B~Nh-(MS#Xeb!Hy z)h@$?ZVi{d+#7hQt0kux$#F(>{&Q<=h4N$lhOp`@bg~cVU=MVYJ zS4N$;VeU3ifmHybJ7Z_J0}$?*$4l=*xt9i~fvU>FXiT6L4Xx=F-~9181AfsNb!nOR zGSG89BTx}$|w5O)yi`R4nI9~L-Vk;V!p+zXzSM}d|tN`5Vg$L#_b(PtWllE zug2q*^aK}{7-cz|UT5SUw;g!hmIHV9yg9M%bep1jPqTKnhg$ABMNLxuXHvDXhx)yV zR~P>(kilgEe$ST+H#CM#US8O-OXSAFg&q5fj{VBw{(JD9zy}F@-fN$B)F}kOavDN^qfb5pHr+nR5y&aStYL1A5oBa>q&K&rF>jZb9PJ~ zb2T}`=uK=+8@S^Kobv5Ygh$BkP$uxZ1nhiIue-~~HwbOc#YcbP{MJ!>ldSUWi#+_5 z?`yQRRae=cEL`l|EV4GuAv)}gy}e2n8hSW92?{JFa5N9Ra!N!H`CqZ`PprOQ8Tz8p zbw@7oJ528!SHS?xE^R{keex7g#IfBAb_4@Zcivpx5ZcI>0;r(|N=9 zqt1yc_kKm4`JSw9I@$i6AKLpOANW~)ym}>0!TtS;!?LMopT>p{X)nE|WQ^P=)z-eIrtg!z?{#_4t9b|k#2jE$jXXVV zfmX6uvL~|9Qy++JqG{-76(v)FJN^H~Y+F#njx}amO%^IHauWk0rt;EMPxDn#yaq|5 zhzi3Bn}pQt9s*TIV;Jx@0l3if{?x-6PwdTP5}>SCkal||1QfPpX@Ebxl4t03(w8-m zgPND&c~raMEtT_zpluAq&*{9R zB>^+z%iZLPg@NU}MIm8(W}2r*VwduN%r?gZteC&=8~~?Is_iK^1Qol+iqD8O@W+IJ zq!;l&X8T1;1E3c)e$^y06^i$G?OLs>>3lzGiuz(cj0r<%*7h}MyX$}?aLROA-=_cR z!)soz!4JU>={)g^Cv>0P?K^2e0lBf;OOv=jTDQ76=%Noc6GEf&mm)|jE5BBj({SxB zTgEiBF?gErhTjbP2#iJpKT*u=4L=F*s5PJD_*-Br3}INdQuQVYyD_srG#AnbegKfB z9`^+mC&oXx_rK8AX6x&R z-HQ_Z8($XgvX)PdZ8e#PfC{_eMM=2MUc21=nO*(D!=D*UR>Z^o^^PW($bF~((b3c> z3Hzx1hTSqm1FMz)e(f$V`%GSZQ(e`?1U2K@Jx`^`fMdhXKNhzShl{l=tDXD701!Q+ z=|HKb38!g)P4sv42$A@8@se6DSN?L<@NBsRhCTj{vy#Gu+R}c^K5YS0neVR*Yl~jm zasQYc3X?sW_4gBhcSHnC8=QoJ%*@XZ-TSxE;GTUc?{?#H7^Z0Nm)vPC_G|9TkFnY; z(XbmpwU&m1HgyMD?tuImlh3E@O-M{pZ+dlf89O4pWfAqA| z+G%ce$YUhC^uV^)OIJ@DV0eJAqbOc!Ciqc%$7vU5kI2UaRf5Wst7RX8#9%F&*&JBj zXYlXk(GNkAGJs?D>`UpW_I&e-KIQ2#wQ~l!TP!Ow7br%A6>N^1^`Ui#4pf+zRlLdo z4=W@t?0b8$c^nmfTzR*-^0L>uo~9d++^=Q>V&pIFe7WwpcfH5QZ5#UY?)T<=dA!}K z>XN~h@z0KN7?6Hf%GDN~PJ{b$ZPu0iDe+)M+TslC*-UY(7240GC%QlOl|0kM2A=)* z%9c&-(f8%gGF60XB;E!82R zz0X%EM8ZD_-=7pVCU@BUW@tL@fyjNu9SMB}bc=(T1aN#`|0XCadBdD%2qQFSWm@2Q zJKAqufm(;$rPf4p&7%&w+0cA!ooe3fGYO%u$x#K(83PucTg>YQQv0(q{ME(bpOyU! z9y#=FU$zss^{>Ih`LmJP)k?3OM=WQ(&+QrDDt{jxv6h_27}!6OClpXmT*{I5NVmy4 zIyCBNxs=1oCY%qU-`XdB-&>}4hFn5R+#kvo+Jv_yIJ%7clrH5rxYz1p-T58G+}63Dug>hG+{%1+5KW~w>eiR=N=XcPdG9&c>A?prH~Ny#g&z<)oQD< zEqi4}pG*0FXNAS(mHg&%sSeXO<&~R4EfjZ1m9Uxcd;SH%p*mA(mfJQ%%>+YZh5Mu# z6jkDCeimzp%Z>!7Z~NA%{2Wum!Yhp_1OC$|nGn$7Wm=D5gkwRw7)kBv*Or4$%gJb? z>~$#&10(C9eKeH>;>DYT3>9|WxvycaWmQ?`{zUmqZsq-oaYrf9ulY|xuHLIKJQuTp zLffqT2;f$}G`3YTn^R41$vL#`ccC-0IdYrScMCT$E{WnF8nqPmrPsKegq`-PZ@m`` z;NY_dcatLZ0{6G6magr6`+T>I=|>0~?idj7=}uR@&F7@+4^Vod{E6lvs|0ge|0csW zL^_<`CS{`+V%Urli`l}Kj}x$TAkVnX5Gwns7rvE(%J`?OHv-(X&B_?KckI__^7eL3 ztNBuc3M1xR`*o!1`~SXl(29X2aR6DL&uvVJ(ZK=1PI((S43;N?lLT}EhOd&w9TJ!1 zZnb4>@0}C6g|`RHrOvdL)+ZqkSpn5gT+ay&{J{z>oy01o1Gag%lbaDE8CDA>;JdgK z96iy24hXaoXW?TsDU9GKB<`7vV!V-ja~qKYm&;O)cu=Va4`wmAsR_ZD?{zOg_^Ii2 z5(nBfUNF&Z!}YIh!S+8(#|fLc$r!8mD4}ZxyRgb_!NMR9rWLQR-DUv%DC@YAiG4pw z(K!&~r6OREiW-(EoR&a?AR&0O)mFtME}}R@64E5C5o~4x&V&YGilrb7_3XNHdlXJq zNWs!PCXT^CRPaH#5ataMXlIz+YRgtx$E2bj?BISCkV z38#5}S=q%;47|@2HskcK-bDU>3hZGDMHU*Dt3~cByWtFk!-23Z=Z(^o!ftnt4d$U` zhxE{e=Mo#4u>aXN+v}M^e_p-hMzE5U@MXfnPF?k{cR|Z{daEVtW5r@4KU=>1sUxig zguZ1-F#Puroc$AoKN3JQo!OIx7r|wd*5QAXx>buIyb%>hsS$6FXtbMObx)VWuvJQ# z-20+}^BgB-pkmf9Qpi9t#XmIPz4Bxn`VZ2RMgZrykX0lsH#$4nX`NYn9*=tT@==ur zCaiRhiHT(jt-<}Xgs&*&1yhLJ0Qf>oX20BxNtc=52Bq8@vn|$3Gl|}B?YMB(vz|>` z9&G@*t0xnhFgsAGc@fC39W+RxDxUtfvDmi6GeijR94x`QImxwtc{|V=Sx=%JUKHf3 zYMuD|6-$tHOBT|YzqP5?Ee}=svOCo868K6^f)tK+HeOKU^&6Ziv-AgZM>HskR!ob zu^=-NyMebSnGHW-BDz#DC1=b=Hl!IA?@8OWftX~B0iRGv_YGjjxfx z8Ngtw;}L7XoXbJ2sZ5C(i9jh>vVr-uAGKh?M2;Vfhsb=`italXwTfEtVKN>v2mwSE zY{Btu_D;}?N-(WF6l@0c643b=xj#Z{)j(o08wJcAQvIj$_re;Sn0?2wcI<=606N`; znIcP9eNFH5m4F3M7CrfGp`^1p(S?S1G^7w{un8Uwe535@j68Zy5y!(Ow3LSnup-9~ z!};%!cWmbH$7|5Gy+Dx<+c+r17E7*iT+Jvf1!U??Vmzt4DaQ_J?M)xM7B7{ME**n) zU`7OvsR(I!HjZ zL0Uo@q{l~EwJ2VEM2`vm*_x`&%1&)t&6b+X_9P`*(g>}4k0Kn&d)oumsHbP&ph6^u zCkX*xVLObN7z-2&pc{KpJ09ZLb<_Zxm&^hWoG?|fGPPPV@~@#k%jZW&b#3@CUOrZZ zf%LzTb!R(2V*r)Ntmf!U6|Q&Qm;CVH94;s57c(8N=3c! zq_v8CvmG*%3%@QQ?EYEnpitM#awL$djHFPXBn#yn2Yr)!A$wF@%%I)V+zopRbpj zzam9Wv~`nn<>l<~W*nd2sqBa$6_#;ny$)HcjQmkXAfcm?ZuhUwxOZdpViyroc~Xjd-Yd=P z?K44y=AU3cy~Dm0#c9;0Vjg3g^TIxD>Z8;9bcA~;o9HB z<@XdrP|RbQ-~62cw*p(;Fp9sAx!wxhO}^d$HYxO5^d~4B`h4lOVWWzmuOd>3K0iRS zTYD)wbgq(*>tHz(QvHGz=We6(lFPY~>hI{rde)0sgli;Gi7O38WnIgghAJ3CZe^Et zWp!18nhM5nIdj;|eZM+abvbvnwE|D7B*#^-h}9MmMlw zYwwZcbMOgwj3X<;mI=Syi&qf9j$m|5bJXvZ3W6i_HAf_A^%mg=w)-8*iaezHySx|Z zD1Jr*2g&;t6%q#8B5rdm@HfkO?ZR%xjb&Tc3L8zliEriL!FDR=5ap?&4*G+pkH~Bk zlF2ZtzgX%?9^d2dXFCl(;D zODk4uz^>=4BDx8@)$56+to~9lv9N3I`R{jn$%W0O%V@;ox(5jr2|yccspNNF&q2jW zMBk`wD*N{PR1dDWf$RMx9oe9Zqj7Is)xh+DJN?0yY(NAsU<+N$}1O?>_xTGS27ZY61(M~jc zQci#JLU(7^=9@8_9q;VE>uWb%VkG-#!N)Dh@Af5|>k&7V1|F5OjV}U~cLPfQJ^**h zL~}Owrz=b4cwn+m#TT23=|=Gj`x4(eV-zAYO8PMCD)`mA$BH78w&YBb{Qb$|`2?M{ zmb%|{mRb7GIm+!#V5*%fVN> zC;oBoQ|FCucVKBpqRsLOmpq4`p4{n%Xqr&B`9|rDkhi|tI%L3$w%}2&6cSw6p6zTu z+>ofc;2NE^xS;6J8#uA7_`aO_e)RJD+c$_Z{H~H*r9*!|4E(Fdj$AZWg2r!Xkm+fA zmarO->*)0{ea*o26gzc*O%Nq_>r7DhmuHst!TqI0c&ac}dD0YB0JATKko6r9E z=9SP}$1$FU0y=eos@Q10%u6Q7xPiSI7Gvpg_aqA(0GOo zNTGOdX(O|LxI`-LNx1Xlk4>f5@|O6W{5B#={h&cnF)tj-{JHv~hvV^2pePjmw3Rav zp@fuw`oca#xhx@ciSRKfj56o9qcRlguM{7-|)PG<(w6pYvHm%wD-Wm zt^;qSDzQ`!N~Hr;3xQQFibTr4Y5n{DrexY>e@_||+8A+8Uv60fLlr_?J-3K$^32R6 z0mm#)X$}2+EqvB`Ro2<_S!&oUku9v6+DthW`u~cyEiS?Y4^HQ`W*6A7$qTkB%(VU>mx-FziG(1By+0K)qvN$nX~33CMWa2%}zJeJY9_P4}nh4`=8^Otbb!vT(B= zuE`zc(!;wB#w3EvNu8zkR2Eukw@v-@=J?fcz|2y!Ff04NUTkxUm+F>8;q525oN=c3 zwr9>QIy*kpTn`>T*A@pei<+b~FOo?2buchfO8FI@WZd{5NyVVJbTJgWrV}3sWdpm( zG(^ok9JG(>_+8p{Tp9@aN5vrEu9XPDfZCNE*N$C+*v%AmU17jy+T{p?bg3eYDgPgS ze~O`Zc<{i6ZCe{EEJN>enG$!d#cN^as}j8=GNdlj3u+*M>Z%QyzqVyEg$*#QwX)rm zIZd~{UYCRH%F{5RkalnTb?oC)db~*kmtvo}&C6CRodDa}6%#zW%==$#v*A^Wn`oU^ zDKzDO*r9C0^oLfxwJrsXREXDF9DZuQ_uB5`&)T9Z5)_9xka!cirqLRdtC5cX+jxKH z0m0Y%c?rZJ)__|xo{%W=Zs_$m7H}9L@!q@5wvo5S_~5b)Y$??g6WezCvjzq^&-XeD z(s$_S-dI|bu9N8@IquTwbScT6feO3VS96o{dE-x)Su-MqL=Ehhy*sd?A=G@YG*J5iMaNw}8;L+mc>w!P* z#a?vrbXFzC%J5;WqZ;q%Qkobxs2uN!*19z1ckn}1XW^_p4#urG&17mGGiG~{~ zbVXqId5e#|y&41pEH-d(zWLFs=1({3@fnL!2EJFJtKVd^btEJd_yZTO&$5B}guLG8 z5({6zgh>ik`Ztx1iyiE|MyL8Co6O4Ij|m6@vxLZR~T)~dHe1utjv7j<-Se7-hX}cC-bB|PC}H! ze&8o}JDC<~%7RUd&;Ox9Dl?pz*#)!UB$17}f@9OWlk~erXu1>jVnl8V4P(YWdwjLk zeFhJof{(sg8FI-_^+z-XT*33}*8PLn%L&gDdyPc?eJ&m?{_!Wp@hW?)`tR&JI~;)& z#uYYL!T!9w(8aNF0QRiJ$(ti%2v#D;Vq`4U=;s&tW1ac0)(xJO$)%CPu@CF5zxNz^b4Cjg>HwFXzxlZ4gNX}`)+5~PNhB2J+Cc10wrGQ?lA zP8UWgv_z>z@3<$u{kWd?WZ4#maHjLZI(ItaFmzbRHgaH{A1Be17%b$8hjG8#ktf&r z!bP`VXl!asSD>})8B=XE$&JoythXSO3*qRbYOmDj{7kJ{;MtAYy%bHLn*@Ex9YIxp z8?tPbb|6$dEX!kx*sM@~=HgKm9@~-_PWyGZfoXY*D^hfD&&kD+0db5^>6DVNL^{jU z*DwKd+TG^(PziBg1UFgBw_abP7)Th{0I~E?NQ=H|1Hx$p<2P9pI$#dW(WtsBKxl2U zYJz?UnSpjt7UeP>!|+)|m{KMvyk%a=&NL6VZT4Z>v$;ufLNv#Xvys8l?_r z-qwnaEHOF+6QZdq686m9H{SZ9R6ZnG!xb_lt&@nSC9A1ddW;yRl?}y}nXRA4*b5+u zXj&4nizK9;E?yh222gu0vM>e_C|Y#7en+EB>}zpxHWPD*glaNu{31Bhq*$32y3vT| zZSRK~UtKPlh3krX;uFQ~Y0zEgvsZMO+vVOAw4U1LfYFL93DpUKjGw;2dwNgOU8k@c z8!kz?1E75U7*wBLg+F}Z$>{2D5+Rep4WYdCd1MK7;)Q4|CSZEM@4R+X{3C^8`E*fd zpnGd24dZiA)bQ8?VUVQaT@;XhyX3C?~J$I@mR{bGpOcV3alHW@6pf4!tWLlaV9 zGI`_QxgxSm2v02+_n#ITn%r>4<_OI98SdttO-?CiA|RdHd0P9Uy>c+I=vX9SP`vFh zd2)W#+y=RGHYC-qFWd(aimZxjDND@TEau)i{9_|$sr10BmQW%T+Td2n)JvHfa=fh z-|WyGc*K=8t8HvYzr&mrt1SMk#3J=*yk(bS|h5$1~JRk_Pw zjW;KN34NhJ-hCM*JpgL}n|IO>@+6$5uSQG^m|2kR8m)Z{ldeh48ZfWPkv?uXyRh!C z8IY!PYxg|Ll8WOLiV}k%nAtz~WT~(#d@1!s*zYpcEw^P*l7Wqm19p5erry8j%k(SD z#qH7v2wigU?anzT*^#V#=Z0f>7t<}uMCOTTR7o}WyCzn?v|B7OhZ*b~ALQ~cMP}P~ui^ww>6;t#7BOd?9+Lnq$!0A7 zMe$j$M%?@K(_StGe64fau~Hva3Ocz3Pm2peTn;^HIS#ZDHvAsI2O#^RIR zxj}F9i(HEDn&;X4K!fW1+;eseK_wO4*;X$3T9lv$?GpR_`8L=ypJTF4mXvmNt=~3K zV&h`b z#}+)54+_}9vLOXMPRr|luK4;y!JXwm#3}FN^s3jLALmU3fv(*-2KXS!nLHv0dSsJt zm7`FsRTPU2^2uNc|IC+bC!Z{-faCJ#ONgAY+?ORp5!c+WjTK&RFQiu%^>tgY8u#Cb zx(I74Wqhu%FDd_3QqmZF!G4EQ22?heL42N(cOPH9UAszcPl62>u9yZig&JGS8vB46 z$G95j(i++UMc3IH&!08)0H;li>9XIK;9pG@vdlt}eW^ z?m$nS1_@T>)1;mQ!4Ut(c%&Y@^VXU;FIN@UGBvQ%V{-r85Ml-xDpZD$ z?8WOn&A3~Pny-u>+p1^lecfZ=NgaQjpMP3`f7Y~rd*DjZ@e=6S}ABI@a_P&i%$}!!6Kj>Fof|R_3 zFH9@Hm)VA+1uW$|-5&AOu->>Znrk)z_AXQs*`>f+X(oRQwJ&z?jc|Qp{^~F8W z9wdi4Z+k8=UvwpOLMy(l!ubel2ApqX03r?c7H(%7bJo1QWfoDGRQt#!&?MB(Tzc=^ z&rO@Z*zGg1zj4G!2H^Jgc4hm(FsHpQ8Z`m-noW)toNK322!2x)|22h}-S;1$K%It$ z(q;;2qEj>p`zs|B@rT1*oGdL7e$}^JYf)4V7IZ{mBkX|_f!T`=Z8_3wb*CEKlj^!1 zuz5IZ^Ny1m7;bBuVqei@aId1l=F$pbK4eJm^K(KC`OuIQq{ph4%(IY1Kv~}AkD8V> zNko~*Rm*W7B?ryEFK#koJm|!gjT`rXY@~Zy)?$Tf6f@XUO4$fo)vj;Y7=Og@%%Coj z8}PFo(c-|NhG%q1aHp)h8rRh}1g(>G)e-c2B*O}(_{EwuaKu=VRJ?ECT=D_^ct}n8+W?CPQ*FK1tf$tatMnp1WeaWh z?iS3v@GTY%B59sf;M)`{Z5>{u;F%kQSOX8+LBIi>U2(=|T1I9^M*g@M{cVBx_JCyZ5PLADFQEd2OZa>Le2Xid(I)3|dx^@(?JsH-KQ_ajPj%dpN%M$3K#g|HnMNC z0HmtNLwDn*#13z)`;SVObC9pcp`oMU8)z=Ghj6&vch)3Fne1pIN$)CmeG(O_wMGAA zH1>`n-AT~rLzJO`G{=_Y+Y5T@M&rH}ZV&$91UZeYsPaHq8O>Qwe#$pL`HJM?{@K84CI8bBMo zp_JR1HVi`*?%m6H9hZSeX$?9LA|JGHwOz#Sj=l5|;SI~-N8AL^#rkO$8`<)KUdf%o zcuc3_&s^BNHTu|@@ea%%tH%YGqD=7)@+`V2_aXkzSfu`=3k!Og*;!TIF}k@L2Ym_? z+aJ6Mp81i8s$dXPX7q(aXbK4x<=?Y*94@>%n-e@&nLk&PM0v$!$i!-+37xvS*P0Usoh=b&#OER z1MXbx!%@QUo#}yj2T3$6Y2xAvs>l{A?bpBZwD7ghGu;~-;y=4O0I-4mypBC&ED5g2 zyxQ|OWRvH=4?Um@N-yF+kJ+CN5C7|sl7d~5X{w|NmtUV5X=eG;|Q z(xRd|{CQC#_!%J{beZhJbI_!Xz&a6btw*~n+zJ!mxU_dYp5Xf7lg`}7+djy-Qh|)s zu8Z*iW?>u|2B8Va;N|1-lef$T(BL<0rJzS~-J3UL>8mF-tVt?;N*1N(q;oyrUgo!y z+@O*dU_r0cT(BM;m^wU9-J3ts%o;rYL41eMOeOCMMrv}=q~t?l=~;f+-;68{fZXC4k!{P+EH&K!(kn6Ym$gD|r1Tg=$WG9e|Z zu@p(NZ*61jOBy0OV@;G$WH;87(vU()Ly}5GdsLqJ-S_i6*Yn)htv8-o^d-=g;;jlv`l07B=BsIRsd;~a;C7&G;Q5AFw~fVV5D-yp^}xrG?RJFA(% zz5G_vts{zWEaz^qp_={Jwj4e_l%eEhi9K8Bj3rHWNkHRWaMK@HgQUf7myt{loa1954$ z2t1?cpa8iii3Pp9NHWaN9@rUYA!T8)M6jcT6;{!i(1Q58FRbAWV<~P*(%89 zVkA)3u;GeD+czCnN6|zTs3PgAT23R|^vf9Q2xL$J_7{GMoEKmz+v>1B-!ASsM`2PU zpJoLii67c;aO?5MJD081 zXj7s8q2T0daZuYe0dI|OClut(N4SZ*3;QCIZ8Z1t+T@=BxvAhjOMI=ooeH&1A)$`@ za85@ueKrFC=}xA_kFM9$=E{ndgOK%!8c@UO^!H zA48}O8{w|__2W#CU8g}n?e`#QX#BAUStm~Ye2kYh_FS6dG3U6Jb-eg6bO#3+Wf7nM z{Bz!NCIikHXRC_4$J%_hb~w22X5%wzk`Jlp>uTApS>3}EGd?Zg?%lpjB^mdqPF;BB z>d(cs{?ZI{oUiOXvFF7hXK#>GkCD4F>Rr*|QIPU{b zSi)v4iTwfAO3pZ9M-Gm9ghf4#=VXj1Z~5hr%ya`2kds5FMILYkwUHpVOa#8~SDUyQ zOA5r@78H`jL&{-;yk^l*%r24(DsD>qN|%#d@afFl&f^-fU6;`#Y=S`oG}oLy+R9Jj zU}d0zSPL}-2}1t-6N2XS$6q+0pluLoyuNl=h7l9E?pRI;ba#5V7vMW~x*?`I@2 z4JDUuo_H$lNcJ}#LJ6Gj*tB%YdhF_TA9mGWLK+^i7GkIGt^26XE z&aCIW|D^5=N&RTah_ehbk(9fB;W!c~N;DLsB!69J0H(sw!PctzTQLaepgvE~M7PC8 zx-z6@b0hd*)|`K}lDYAk0McvUi|08fe7Lm;-ZG_Vg&Ry>OJZUm=et*g0r2FGreYP( zUczeu(nfQj&`~l?F5orK9;0T1n2k}5PecHU8$`G4UwEyW*gI{L7+p?*B^X4Wd3Gq@ zNahh?HU;_N>3B&-&r|wXpk=+=sP@+H92giXQ zKk-nt5MVl6>Ojm;!I?6D1(9EkKq?4qWIx_5LgC@8RZkQ$-U_X=drc2TmcDX2zQ>}F z1!#TC-|cf)Vv`6$4fPp@&VEWVF5phWm1|r?{{D!q8Pi9u_1X_bH_r`o9=cn?bMfev z9gQWagcHreILyi^Eei4x7m>R;F&U(YaYLQ$!nmfyQz5^l3}QGEk+YX}v#&r9GRCxk z0bA@Tt$21mhH)z#0jO;Aoc(vEGLR7hJO+S&FB_x#4u6EsNdrsV-#W{QpU<3Qq;gqp zmi@_iPaC*zi7mO=Q9_rymi(NJk#pAC8G+ny*X?@HtO{`7NCbTl&|`E*vnK15f+Dd? zzh4_jZK2YS)c~t8w5#{BE}e`tc$1jZB@9rYkX|Yvk2K*Dz#)nSsjK}l#sR<0e4;NN zK+YZ_MQs25%E+Ru*;K|KH0(j6=q(gu3K`)?*-S5eDFh7dcQ{pwSdw7xz}2Qb3)0wR zVg7W3^f!kDdlPAwj=e_6#?kp!jPp zuRCe3JL1$Yu}6Cgso{Z#I4oPvrlSElX8P_)X9|LX03@__?8;)`$)ApT^z(A|ehv)l z`0(@B+Yc+UPA&Y5O)La9lrGE?BW?vItv`*!uw2B+@p~oWyi$DLdt7{!0$E{vU)?>Q zAa>Xhuyr`(S~wf}j@!rQUW(T!7_dzJlj`c8jy|v!*Y4>m+KE=8o3@Wi<}4|w5yR9E z`B^g|eoLAjJF#OF)+WneTn6_XN_%LBfGlyhM}kwLmHi6P9M;4p3_TZv{%jCptPHuY zCTZbpRc1rhMS%@2uk2MArXSFVjWW9(VHI|Yiv?NWU~D}MXl1$pk(_vkE*-oZlli(1 z;!cGfH_{J2MQF#M57wU<`Q;6B14ayZEqMo8;0BUsk9VYJb+5s_zY?a$&%7i8uUdV_ z?^&j=K~eVU%(oCV2*4B1$&Kq{H&i6TL`DO1yf$HTCM3byubu~q2YE}dBR07rO+Q1u*wFI(n6>*;^@l2!BPKyMLNzULaDO0`pPxdc@)jcEg&* zfcEcPd*Bl*0oRPu(=C(327!|woyR2 z?;G9@*^l$|VY|+BW+aXE|i>SOs z3kIndiqVqy(52UXo>Sn0E;O|(4x&hL#lop7$}nJMOuri0C19No{Z^5nt(Dy3#rS7{ z2umCm18Fc39r2}h3{Ct-PJ%CRgHR~-jF)^+Oay>3=Hrg%g6i>T>lj(@g5u2;pdlc} znT-e`C<6>YmI)ct@pm&k?hit;6qV3-kU6#B?mX<&D&O;4SrkV$z`zb#mv{ewIX(&l zx~gbcB{v!5@ZTg{rIHxPLyxEIhmKqY#IK|22cWh60A>U6($h!uu-N#4^388MAZLIS z_!H)w?QMz`FiVXOm2SMknRN~Ht=t5(3(KtA2cfQk5X zpAj+zgQ|89M9@WI`;qj@)ps?Nle_q|PQE4j%V17dUgxY(qkQqO91zL10X{k@Ys&QJ zZ#la8EnSf3ssktOi-APxe##jDwgt3rtaThcd`5q_0mDfe112Mc%8_PS8B6O`Edg6Gt(Iq% zY>BQ|CT%aDf@$d;rwOrrFYb`6;GtIFz5X4~Q?efqB)h}yY2WYoY_~sVw^L3j3>MbF zVL(u6M{rL^$cv89?T#?%yAh^$qrC6NltvXA*Lru;aNYG2cN$8& zZ@lPk-0o^Fz1<|;bH}@fV%*cQUD8?F)BBHd`uy|2Cdo1**IdiwjD`q#Y= zecJB-@}YavbilxE;792IBWqyGRO-)*0pL&jjxOaZe(^dDv( zW>CmyaGI}Q?A(Av*`SPCkMzRezwMntoY_$Ko*_jarqa0~)jx?MW<%<|Lt1711exK< zjUl~r!(9HuGB<{e7KSgH4x9HP&16QbvxjU#M(oN)$_z$CAC5Tw8Sz4lIIfS7eMZxW zqXOBZp8TVSvzbSFM;-o*!fIm_r;z}DW}wg5-mtINbT=)9FKZ9e(8qzWv5{yo%?4H_e*+_ zg$v`w{G-m=_mOw**Onox7RGBrM)BJBzZ`zhXm&$>cODwv(C=3q9p@jLydln7AD&?EJ1_l+e(q61?jz6M zW@7E5X8y?%ncaqplj9+i55A5S1At7{WXZzhXPFUK7R+(vSQ9zH6WE-MFk>PfXglmI zJl-yQZ14hp$p2W-=kd=QkGB^d@5r!>wOHmYk4Z$Br=0cD`<5})z9pdnMdke0Oeh|i zR(1e1dcexVb^;SksPX~8u|b1=YkNyuxu;pF{7FZ!{8K4#UiG%agG#B>-Fm?_-L-)6 z`+X|sjiqt77fq%_&%=?UurrmFHKmcY|LN%h`1tF`KQlXjcY~n{(;bcgiruU!Rb%yc zI%NWe-b0FE4H@tE?ftv+gn+TX_5dNc=jrJKPqV5VyiPx!OL~0tG=ky`>HqaGeRR$F zBed;xpORILFj4*4)$oW`tN-GGDOX#{bEovoC;A5}45)P><=qYp%{`X2rO#*7fLn$W zCkGHW)iAR~j&;bbQu`NotSN}LsLBKHOW$6fS9%8D55E@gIBRP1ylz)#>&ZgLkJSTt zFCvw98HCk1>@^~=O1gL9J{ecM`Q1SFzP3L9(n1)K*}L$~9`2d}K4bz~de4XcCXO6= z*;n1bS)Z(yS8((cpQ{=~k0X>!I_#J)juQyVEs|@_m$&c>6@&H^_NSYkF$O(?!iJ2!^$EcozOSdYzZ`RjV}aYL<0|)qt%GPsGrQ&ZY9N`LJkalQQ|wK4Cj>z zp3d3fl`nrF&R5 zwK!N7mZgMswILMKt=WNSG1yC{d;JOy2-lxMZI#bQRPR}J?#<>2d zqyIW)Wt4hZxv-LdaDAUkl z1)%837I|ZZmB5Pw9&CcpC_x? zh|}MnliAzM&(bf>U?$JVyi)k*7SV0a#$v;MgbbSHQPsI_zp&P>NDAATua?}z@ZAwa z0>s0H8m^MnwIU5ikD8wO?Cq8l8piLLclDWW3)}R1FY*fpzY58Rod1{OLR1$ zu_<^onUtldTv}dPWo?jBgd&?WQV39HSp~VMY7Xs0e^@*=J3lx)O1?VBCSOl+2AsPa zCGu8u&S4GhGLTYh7Ja_40w-F6JYs555P;tA8d5u66;zJP;O4Wz zJo_w{uM9~sBdZt+=KCRy{{OACm6Qz26-My^6BU?4^;Z-f3&@95rw^vf@d7Wi(I(w( zyQ@SvhzZ@R4fC|tGb=_^w8rvrEw|&S{n-vWD3%qWlKy_m3c(K{TfSmx_5z?{EpH?e zOFhz?z$*z5t7%l^dJcuPl1NmvOWXO{*0VC`v(T056Xd*tpp;J=}QAxzz)fqm~!=LY)ToA4PsQ(vpQMDGCUa?H|{)owzu2} zm62K->z|z5so>{KFtU1Jbeg1;8N`gMMT@Y|0YHW#g-S&`vk)m4Tr$522y!3EYUW_#9_btO9Az%ajVzg?o-q&7Usjx1Tu@cRibjrqB5%$^VNkS zd?FlhQmgW=5|rAE3$`Y2YX>E_l+IJw6X%elRkVi z?hTvwMzTlLNci>hZ6M!It)UNB--|>zre${?MnXw?;4Zq}0m^j6+=(W2LQb5cFxq(< zV73pY{|veFM58SjFRQneox-xjtE*Pi$stXb#!NNoq@ou$dXhabAucR(Pr8EjlC{-P zb@I=}E7kf@XYdjdlvXMrL3!4S^%tVyf#i)VcV!Ud3O|JO@R_$=?+#uhwDq zM4B0o*yiCaES$nM{RI}RA9$CXRpYMl3_B?#7Cv;0p47Xy5$}w|Os5m?(W6UZXRVWg z=w~;6EsGoY0$sY;4S79oNp?Lu%7z>_H|CqS!Rzd&;kNYhqf-n!$;!b*(co{`-NON@vYphk<{DQbk^A8rHTPNkJrLvRw zb|f@4zmPX5R(5JIU+>0rOnx%3%14!Uw#KxWy#6*@`2-7x?R7`?v~EOUgiU$2k%>YJ zD?2%{efu8qW-H3Y+_-f<$sXdBe^UFED_@n5m^$FtFkz0m5x_}>le6}bk%Q>SPAka+I4(6N(W8i*xW=+cH=4oY z*YQB^CH2&eD&P2X4C-Othe`$*=AU)DF`Z?^MXb>kjp-WdqAwGtTqGynC!r?RfdMqv zMLAUX$_42q0uN`^Z*ismXA;{d}GRnmyHwySgbHUeq}9U%!{OY4{qqz4^b4k{)Z)nBo( zBF;RD=+>2B8Ix3AIXw0f0!WepL|WtQQR)<09SAOW3MenhMQW0<*8x>4A>U& zwO7Ji7|mbUYs9bFYY!`c=J1y;HMqKBbkH4;mU`!ec~}ADVSh!T!7f5>FCjIZ2tgj3 z#X65pKKfH7Dn|6UCgBM21to!=@jBdUU(haz-6aaORDp1<4f?IvCEYZS5p`maj_cS$SC$F9+RS}pX2iJ(S`AbAN<`|hhCT* zv~t}TJd@}d5!Unm;u4waz)OO&GSH#>uMMZZqx*lKpT#?R( z1hvwEkbyi2VkjwB?6=cA&lNXsSbtc;ioD_NCi#^yc(R@s} z<1L6f#f4C2kT5qU9^+VS*wbx;dVYf)vGsF=Fqx^hV;Dx0*kBZ%2pPi0VUmPHfI@X^ zApK;^D}L#&t9Gn$ZjlyQGgSbg7?y~(b=s!{4{~cX2wk}?Pv!cF?bCS~&VOfN<%R@X z1J9^xPN&2Fp0Dsa;Anyo%zGFL16+CY<%$EvUrX-y&FhlDTeHWwe+9|{`WUi}Y)PLFHumC@s~Z%ITNeaq3Y1vFQe5;1H#mj-(mTI@uU z_dJvP_G&rbAv#T%V^ZK;S><&;TEd)9Y()y`+GX|$qUnor2c)Hd+Q&o`Tk`1%Pa@(* zJ1B@z;L=Es=0D+l%KNp+tTrePYhEI-v6kRWkG|_YhtT{rD4es=i(xE1 z&jFeSK0;D@TT_oFOroQW3k(>q!JzHMrqe|_Nc*0TxP_l&f@4}p(S^Wuv??mX^O z3EPQX{P6E5dE@V5ir~5D!aJYtX(Sa3{rUe@d63lKP07C-R(6k?7H)v!c_M+CNjS z9ZdBKPh}N~{z*%%daDX-q*m}KO#x{$foZm)33*pxyZ`6fdvVD;#V9?|9=4;y^whLV zvuPJ4(vuFQrxhVG)(}~9>6hnXI5Vt22Enpnfv{bOWL)O8xQND7aM2)KG%$(&E3i@` zbKN$Ro08d3loeZ>89SA!O$@gNvK|+})h7aHJF>>cGL?Z-d^LMW%o9!&$A)k48`7nQ z8F)$}kXD4~>^Kz;8zL#0fvKSUlataCS;02hNZ;&DTj2hj+6$C*{7!j7(qa zbmb|g^Tpetz3c_&Pn^}s6@3Sa6V8Y-a%CJ`=MEh69+NE@hTN61=lzZwFd{OhXn3?ONV{;+K-;FwU-x5X`g|WPDrmGKPqmJzoJ(l z>Rx~sgAWl3ye0GA98e1Mvf#)Zx(l?2hx|O+eUY|D+m0hNd9O-+xf(uyly~at=YYc3 zqTYB$;rt97=5Q3-qDtd+yZ2q@L`>1;`-P2FMSre{Uiw{dS+v+F2*`J^wPQj?4Z0go z5BDD^8T8*Np3^C*yYFLrwWOr0ME|u%s3;_p7|!uF7GL+ck%8|h*6x(dEo?9CD~2#} z#cHjGuDuIMAIpn~6}w^;B*hNs2PvMJ;8O$^)&xjWmr$Fzfw9Ln#o%h$C@OJ44g zhbjzm5o!_A-h~L~8DKV`q8+FNaFvJbDmTI_jeHSzu+V+pD2+N%|Mbe6I0oLGVG+wX z=qIa|=UVYg1kJ8M1)K1+c z!@A$bc)GF%5L{74O}=oi?skj$yKh30;irNgs7fwDp>2C5GUc>etX!!+wQO%r2g^K9O$Yrpy9Z`Yc~%5O0m+QI_C%+s^-;;q`!37LLP8@jzSw(cuArt-i_3XLjq z8l`2x8Qq%EvD_@@m3KyctKb#SC~G>OMQd$cn7F-(Oly*Gj+R!3i2~sXtPDtGF@=gx zddvr-Vy#W?I|6#kDYy5ZX1F0=WH#~nUiBT7nnCe#szIXP9+BTPhBkJbRNsne4kODL zf)q<3PkEFvMZlbLFc(l-$H?v{<*c_E=3o@>VMU{AFhkM2h9FuXGxfJ4egvz=wGYX| zhrLEob)ZVC+2?u6X+Px4{1k^y? zc9L5=Zn!OvVR4!dKt%2fR_yo;GS;ZPLkjI4+k)rL;!m2!MH%rO59d|Bhjb;0mu;Av zlg+oNHK~{!&ky|l-_7emB{eafR4r=qhA>H6M45yb(cU@Lm@jmo3Q58lNwXsq^E;hY z&P93R2mQJpN9bphPzt`tyIFUqG2T9d`>%U@VM&;R6~R#OZZalk>=d@ZhA5R=dYg|= zy-R9Q+h*JN=ywyDPhV8N`656r^E*pI&b3HSjxyl|E(;_3&qnFxl)Rju^k*xWb6ndz zlOD(=u~_2xZ4|1wYQ9w1i7D5)-D@eV#pi_Vn?UmX(cw8KG_(&nnV58)Hqg*=tSDT( zM0?lcX{NJ??{DvbJd)(qTw%l?R83s*K56U2nWCdi`AZyOA5*P}BIdfO*cs3+wKi<~ z-G-89G*TrfCnTRr#x6A~9FeZmAIy||K4d(&Bg6YpH?~v0_mryGLtKj0sAvdE&rR8} zR}N)K6r7edT@YE;9!sO(4u%Mm|Dd#q=+k&r=OqojFEGnjM*oYEM|JQQ%P`KI|A+jp z8^MEuK1j1LLl)i0*#k+HSBV-NOKT%UyWw4W_i5)=MXKFwWY)tTgSUNwB%kpt`gj(T zbEZ5HajH}HCA7LpxK=9_2`SQ?#v$CUkaNnX6NMTd;}sO^8oc}!}|JHVW%*? z6uMr~4b-0}*eCp45L?oj4ZgwK7VZ-?LEO@OIOcXmV3j;&Gzi1w`k7)D-(Hkqg7%dI zDp_Gu*KUkvQKfXxYp?r0$-*EChsJh4ao7|2gqwv8G1ECcIIYo#a%BJ(hlF30$%{c; zvUITuE3C6+n1(N62HPd_TKT2lm=o4Xk=-jwlg<;?yUHA^wlbMHJQnjr;7B81jCzd&5s+Ztufthp;YM#* ziSStyi6}0bFlgR#kRZGRiym*EEVUA`vg#RzP7F?W<{s*2Srjg-ZZSy8gCrej?$-wV zqP@ZT(0rkKZt^bv>(1>5gw0>;c6%Hi6|yG1|2eey1m;*|-?=y3zw{#Z#@>amCkBu3 z*-?O#0mAtsNOLhnYw5_@8M{=fs8_45^~Nb?uBj-XV){g*;e>!4tLUn&c*u%v?#8v4 zryXJs?GuwLxLFIj;SQXRgI1%(H|K@V?R_=ti!|FPf5OM*5nv;+e^AZZzAQmVo6J@O zZLF<{xwZBH=~a2~av{rlTk;7eBnT6VybI6tczEB^Q|w(48pzw9$IW+Vc%OKo)9LV< zCmuJm=&!dDY)QnOvcPxg&8&=%ECY&v> zzG*9BL3AiMwAh)wMgZQ~jlmq$wP^~rGfhi3iIS|)RwKWg;eDUg3f2fj)%_D|_=NiR z+tUOUbi7^S&&jn8tq;oN4;N!TY)j7HzeA%l)h2v7^T`KF|3b*Rnl&8T@8g;mmXY3Yryg#Ma+nl@cK0YqsjITP!52 zP1$o?PnhpE3zp8odo48C?^yXM#y zHf?LUW2=4a(%TNxTa{4jWz{=!TX!#qxUC|3&P3%uM(lcfifOQ&j*HkGxXl+EVf27c zly$n9J5)pbcdzEL`GLO!9pIvC*j=NDB z>iQ!4KQ&~@%WvNozWczbA!B~r{8pF$eTUOS*8FvQ^Y1?hB@=X+LZosFtNw{Su7j3R4(nTairqR=l3arvA1e_FCYp(^c1$RhuisI9mww7+%p!5=OC|+5#AH| zx(B&#{Kl?MGPKVdn3~)<`MAtgS@mYOzWlRezCE6Q71KV-VC5GkHv>A_X8M!TzJLr) z4ViiJp1hmAx2do1ap@gHpX>g<56_Sm+zH=>!a{705(ZNNM;;=>n_CYH%DZ>wgl&p9iqEXi}r1QO4S1|1wsmXXgJ z3Mb42CdC*;1WMZw)y9Uj^$k0+Hmq9zH!+fH(V%}PYYy2r34mVywDx3oz{(Kb) z*eeGdcAg7^xY5@CrL;Zyrr?mH@zJY3G4GD&OO#Qpk`Er|0b=)MiY8y;RNxFEl|~3} z%c7p0d|MtjMxY_%f4qBJsg%tG5u>Lu@PQ9qg-V_d93~CcRa+XV&G!ucj~$`$U42>1 zd&0GS4*?L6Q1pEw?5q_I?_f!H-X{r~ZP16~j7PSDn@E^&SlGF@v%y6V*}@d46g#!v zIUF7A%!HJEjogP&Y|J@)prxk@5MV-fY=BG{7!$7BcH3T5=%|%~2nyv6u*~ z6SH(e*aR$rCf5oj4IhyKv2k=7+B~R_ zgN@J8X*)dFg@ZDXbS-^2)4S9P0qCTi{dL^Jp7pVn`hJoJW z;JOh;+eX)7Onwc9FsZ)*>s^SbRg_#Z!xFi%_~(S1v=ICVz>`IGqNd~};vOK6_RI){ zl4*{TzTCKE(vng;$7)JRE`+L3fz%-fUJ}>J?HO)U`|Co@0P^P+i1MT)@3;&C0AH;Q z#*)L$bg~nijcI&8tf-iVGqmhxyzqYp_B96Unf)tW%-V9KK`RCFc@rmADcOJspvuBQr|M2M~bM6z|#u zrS$?pbr%DH?vWXYJ0MFTnQEp?toF(YgEo_i#ko#g+CPj&Kb0iAMotlFHA2wHtH%G6FAvm=Yp#oJrik0S)t}|2hUX5s4P6oi_ za4r=lzE1DK)BzKYV4+AJMZZVDT2sUvTK02QNEG1$f)F|#s-)_K(-YF5YX2Gv<{;nO-4Sic?+zN-B@dt{@$a>jMG( z?~=J{pYryGEE(BkO!Tm<+?iBpEbG=T)*MI){=+H6} zg`-;N`y(I~prqjC$nm`eWaVu2)WnbLwW^1c95Q~C8kruiKMH`3B<9^1vun{GjjyMf zfV@07fIpZu_Cytd#aA>UkwF%!rzajCbqnhd23zKxBoB&m z9c~G>jl%6ZMY~tpxD%=_XtG2Xz}>NF-kn~+I^x&|^tsq`c-~VkQO%MM3LB3*d=K$d z{v`=SehRf2odANTjYOCCd{rsoIQx#=m^QPw7Lf9=5K|oD(ZIbI4k5mG3p|X;@A!r< zVV|_rs+tkd9l`n$5ejuBhADB;*Let;5b4>&Tw-MX7_XnQ3=tU7p~ZzY(9AmSPP$Ov zki-E1vqs?(Z^?)4PXz(M^tgP{a_g18b-FAt-mV7lhi!n8PMOc2js2*7_-=hS5_o=8 zKuh&k3`$-Fhja}~gtGHtc>FOp_pk4?2Tq*0IOQplK@zUeOUIIwEB|qKGKC50=#?~# zEE$X6DZxPeoocT^IiqnKm&`k$wD3^Bh(NCqAW=4rOjf0Gs{n~+(>}05k#?{q`H+PD z1Ei3O06g-+1rSMaQ$-R>J+%NV8}l~hW&C61?@5BVXKq?WFHf2lf3wRF=i&XuM0HGF z*R1rjmf=Z((s@(3Ly#y5qOiz@XS%YH<8-NMau>HR;1|l|>CdEEyfsJmh;zv5U!Az3 zmc)!rj=cd#6cnwb^M&$4w_OflDY-nY$I93tD^hPgZ0H|5_0G z{hz&8i39S*qgx=7TKJO-yr5F_N>l>Jo^Y3AZasPUu~v(D$xgfTO`ar54FGn3fgji) zjWGyyC{Az4JV{SeXC(R(~Vhs_%tDqDtW0!St&KNyqGKd|AOADz}%Er??K3UYs3idT{1GdmRe9!(vY6cTrF%NB(q zdes1OfAO6Acw&Q?9+qe(i@{r}AaknqbA}MxBqZOmrUK6n5MY^>6qd##1mE;bN#4M7 zWAITDc+S@Yq^14&NqU@720+eephHitr8c~!oi55u_?BA3se`gdnJ$BSZ_B+OhVb-V z+!RHPu;7d7vA67H`VoKw64$f5;;S5C_Z^oHPf6Ug_EYA=jbq_jf^I*z}>#m3PO;vmK<3JsonZ{%tI_Tr}R$ow`!LSYc7VyHl~7NpV0)I1&}aZ0w% z5c%_K+^ry_Z#?obG6g0oiIOu_ypp01W~N}^Xa|&~al!%K!h^*Hsm26v0?LjEe0hs> zWrNZbV;()E8nciVc2!V0!vXKD5a)gue0`wPp#Q7=>8hA&z9p%b%m{4e4Q@C7H z3DqjRV_e_BKP#5J1OW@bt1~e*Wz&HrZ9wl`g8MVV=^u{#2?W!Yn##7iQJdQ9L>SA` z)NmAc($d6IDxDILxD12|B}io>O5Vn8fF~f_hF}jMRJ0H$3a*_E_B_yNMO<}J*7wy1 zb^>%A3043?fgEV6B`aY=Frn0Byt#HR_z3;ErIjO}F-1#}Tor}CpzL13*&zsG$}n$i zq!^&Q7QkrN40+@EUjG2da#3YKn06qq8eFS|yQL28{tm)KJL{j$;kyrbJayrsduv#8 za>Nc?bUPxahpGjk^PM9?fhDzoTW_0sGF_e=zNu4irh|geiHJ*BLKsv7^#>a>$>3-z z;j#|FNI`e)wqwijqaR0r6Hg)dFub;M>k8CzO$07-b`OPUQ)@vc!5_bRVQV`Iapr?> zJANH-jlUBRwT}=p;rQBwU_?1s`@P$SyEEUi$JMj5_)Citk@1PET|AZ0w(WeS=h!iMD$Mby%7)2t6CnZK?p)5H8&5dXb3DFwC-7YA?WQJp&l^V!(`I>(-5u{c z7gKwR@)`!B4);ws@H!H7DDaz!&ePrmC0zVHhPC9h{nMIC>D;||h5>_@IkU}a1O!Ut z56dv40cw*j`?N%=!`(aG*@p?cF;?nC2g%+ekRy0vq!VuzTJ90*0zf&d9FiZ{#l4Rc zr8XsU9tU_I%hpN@R(huNEEtNP8FXnGY>ytkd5{3N)Q)e!=5%Pl3b-*KxpvLj6^E%;xUG=2X)_@@ew!RB2iA1{}jMi!I7Qr0|PO;OaM7ykxg_$7`0HAvo8DLn4aqQ1?__Hx zylC6PsT*_h4`N3^_hH!;zu3(*4P}N#y~8OzBBIvzvH|Of9tMH;S68O0OH)CeBRbE0 zftY(N)H@BlI={j+lYmY-I@63A)U(r4*Q3nX-&FU_05o}JUx#Zs=*Y4+^NLcv)^Na64ihOvvsJXPbQO>u#>($)eSKpjp{y6`t zr~K8H`uv}luVVhb0%WHlbM`YIHh0A+hoGJ5Ve>b42>fGzl3Eh#uNOJGq?xcJQBf+@ zzjR=JN%qqvoa}P2(X!%&1f>hh%&W_)&HieO%TwQ%wVFM2%wJD=yf)As1fPF0YW6v=01Z%R#$F%HI4emuKNw zNBbAY&G!0FvQ7PDs^V9-oE1mG>5vPH{?F&aE7)9LGNJ|8g4OBqvJRZ|QQX(vH1nOc z9T*-_=)I7mb~Qw>!cD(VPkvgL!~uThAEmVm=Ffec6aba(f7Ic`*10}S=D^O@pS1Dj z|FS=I9^Gd%`AHTFz7pV=Dzd+62=P^){WbaC|H<0+CyXMcbDV}yVShgN6w+j#)x||M zH(4%tS}I#xDln~ju35@^5RkXdnj~))=^*w{Esb!Ssgb}-qYddqV77Ee&7Kj;v8Zgq z`{jtB`-6Rk!7gLDLw*4P0r@dMtICcB$ec%g)j3As4Dc`JALAv~m>iQK{LxpU7pvaF z3RagrfI#gDx6(@#nMLN6~XAFw?bM2Eg)LI>B#CvQ5F@c zXXP~!1@+>^`jq1OlY&z^#Z$uEwzlu1liC8lr!1ny(xO@w7wKl?)vut|m${^PH7WS_0u z3J5|@gM@{KhlKz

hX^kC2g)la!T~mzbHFo1C4VpP-?lqok##r91$LtE>yEgg*cx zMgR*+PD2C&MuQqiPD=nShd>7aD1*Vsg*wIn8iytT1h=k*u_A;k001zAAKin}BZkGt zgDWP3v=prFhl;22^Yr!h_xSnx`~01$?*N@Zcr_>%iW>mb4VsbA$%-4vgsm!&AmTDZ zMqJ@I)B->afdrix95jT%3jz(DSR-T%5ye3TE{K?UfI&cj@%ri9|H-qb&!0epq6&HQ zkcN;rJnoRV4nT&IHKNJ@@Sz4TLm~oLTqPuBAtdLH7E1cjNr8_@7y$Soa6ln&g0N~; z0svysn>mH*-OIPH-@kwx{kw|@1%M%h7!INJA<>5&1tLcVAfUiTLoF6;ojB~!0EmVW zFFfpI>5`@;oPYpu)rsNOgfas=M;Pa#z_@ek-p#xBqrtTc(egHEgk~oc4iFj=&Jfc> z5ELp~r6hppLOTZB8cxXgppLB>K;Qxb8S*FJZTaP>V#bSO{&-ylr=AOHXm zlyK1x7XVNI45z&yfB+w$P+%_r3?RY?0TL4AkVWEXx6hEPhglJThMEbX zo0e+osi?*`pQx<1>MEe5rYh^Kw4S=^tGMQ>>u#~u>g%t-x^wHU#1?C8PrU}K?6S2E zd+f8&Mr%s4%vNhHpUz6F?Y7)jLhZHSh8s|}-Ii;v|F++XtM0mlkbCaC@amc_yYzzV zZoK&B`{}&y2%*Ad4%OHputTWuB`ZtZkeYx71Ej+U09$*nz7$uiBfqOG*qlnoIS9e8 zMu@QSDlm@bbcJ*wZq^2wZB3VLc3{-vpo0@Lpg`#kD4>v( z)J8~M(lslfz+ypp1AM~@-Yn6=3S9q?H;cn50fXCxDDi>`HDvws434YNS`AWry&Mc9 zaG1d}FI=Sq&WSpK#Nsm`w!@Y$*tN>bXU8u4|2@4bag+uch%f*(;(V}#5d)?CLI4Ol zp@Is8n4pf(g30t8rq zTM-i1rV~aKFw7D#08qjXw|p=I5E&SNAe69x(`djvKybhSWF#!5&F+B^yoV0}P&!0F zX%Gm3NK#JYg#1Yj0>xv1Xll?NCuG1TFc1I-nF9?ImT&g9Xz9gQ+!8Pj-bU#S~3(sV}%WCI1DZ=CzD4+(2&}NCnh~{5FA*G3kl&y z`INGTd4#1ySaTlqxo!ji*juJHh652q4w2!Yi|Y!3O950UlI~#0C6~#}OhkZ<7W5%4 zh5>*Nm2nVf90UaR2E;??q7b23AOg({s6Zj%0{Fd7ni5F>01S1_P&z>g#dCr}uVbDnmFWWT(||!+Inl(( zQkFH4P%msr2nw81p5Z700O+J4|6mfwWbQFSg&@$Ley(BwE*Pjz1=@s_t|Ay5_!;sT zl7T@OMg)n2{Kp^_*qCv4B zjuHmIA`rCD3FOIRS0J#29e{5MOQ1_*fB+*I(Z~rUxQuL^AhID0A)bXWUlVr9SZ0!d ziiB8#$Ov!)BUEVtY*9e~fVcuNu_&7qAYUO;NEw!vrT`?jS!d`LYW%JimFlPG>BaXVe$)KLwM12 z`NiuhN+19xnD@Y0qyYd9#wQAZpk5Fr%u;B8;0i}@0|T%WVM@@T1aK(AAZEo72CxAO zn|O9lXg~opTomSV;FTecF-Z#0fG3>z#%F6n0|>xi8T*(|c5T37aZKc`LU9N zV;BtBxX4gunhON*+9g{#AT=OsPNU4_r6pkl=QDw5uS{mRn!o@6*gz7x%;u#X;RI-& zh5-&h=Q`W@&UntVp7+e>KKuF4fDW{s4S*5=7~lkyY_p=hoP!v+fCZ3_w4^6Z=}KGr z(wNS)rZ>&$PD|PaCNaptnioy#Qk(kJs7|%2SIz2HyZY6zj - -# daemon - -```markdown -Usage: dockerd [OPTIONS] - -A self-sufficient runtime for containers. - -Options: - --add-runtime value Register an additional OCI compatible runtime (default []) - --api-cors-header string Set CORS headers in the Engine API - --authorization-plugin value Authorization plugins to load (default []) - --bip string Specify network bridge IP - -b, --bridge string Attach containers to a network bridge - --cgroup-parent string Set parent cgroup for all containers - --cluster-advertise string Address or interface name to advertise - --cluster-store string URL of the distributed storage backend - --cluster-store-opt value Set cluster store options (default map[]) - --config-file string Daemon configuration file (default "/etc/docker/daemon.json") - --containerd string Path to containerd socket - -D, --debug Enable debug mode - --default-gateway value Container default gateway IPv4 address - --default-gateway-v6 value Container default gateway IPv6 address - --default-runtime string Default OCI runtime for containers (default "runc") - --default-ulimit value Default ulimits for containers (default []) - --disable-legacy-registry Disable contacting legacy registries - --dns value DNS server to use (default []) - --dns-opt value DNS options to use (default []) - --dns-search value DNS search domains to use (default []) - --exec-opt value Runtime execution options (default []) - --exec-root string Root directory for execution state files (default "/var/run/docker") - --experimental Enable experimental features - --fixed-cidr string IPv4 subnet for fixed IPs - --fixed-cidr-v6 string IPv6 subnet for fixed IPs - -g, --graph string Root of the Docker runtime (default "/var/lib/docker") - -G, --group string Group for the unix socket (default "docker") - --help Print usage - -H, --host value Daemon socket(s) to connect to (default []) - --icc Enable inter-container communication (default true) - --init Run an init in the container to forward signals and reap processes - --init-path string Path to the docker-init binary - --insecure-registry value Enable insecure registry communication (default []) - --ip value Default IP when binding container ports (default 0.0.0.0) - --ip-forward Enable net.ipv4.ip_forward (default true) - --ip-masq Enable IP masquerading (default true) - --iptables Enable addition of iptables rules (default true) - --ipv6 Enable IPv6 networking - --label value Set key=value labels to the daemon (default []) - --live-restore Enable live restore of docker when containers are still running (Linux only) - --log-driver string Default driver for container logs (default "json-file") - -l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info") - --log-opt value Default log driver options for containers (default map[]) - --max-concurrent-downloads int Set the max concurrent downloads for each pull (default 3) - --max-concurrent-uploads int Set the max concurrent uploads for each push (default 5) - --metrics-addr string Set address and port to serve the metrics api (default "") - --mtu int Set the containers network MTU - --oom-score-adjust int Set the oom_score_adj for the daemon (default -500) - -p, --pidfile string Path to use for daemon PID file (default "/var/run/docker.pid") - --raw-logs Full timestamps without ANSI coloring - --registry-mirror value Preferred Docker registry mirror (default []) - --seccomp-profile value Path to seccomp profile - --selinux-enabled Enable selinux support - --shutdown-timeout=15 Set the shutdown timeout value in seconds - -s, --storage-driver string Storage driver to use - --storage-opt value Storage driver options (default []) - --swarm-default-advertise-addr string Set default address or interface for swarm advertised address - --tls Use TLS; implied by --tlsverify - --tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem") - --tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem") - --tlskey string Path to TLS key file (default "/root/.docker/key.pem") - --tlsverify Use TLS and verify the remote - --userland-proxy Use userland proxy for loopback traffic (default true) - --userland-proxy-path string Path to the userland proxy binary - --userns-remap string User/Group setting for user namespaces - -v, --version Print version information and quit -``` - -Options with [] may be specified multiple times. - -dockerd is the persistent process that manages containers. Docker -uses different binaries for the daemon and client. To run the daemon you -type `dockerd`. - -To run the daemon with debug output, use `dockerd -D`. - -## Daemon socket option - -The Docker daemon can listen for [Docker Engine API](../api/) -requests via three different types of Socket: `unix`, `tcp`, and `fd`. - -By default, a `unix` domain socket (or IPC socket) is created at -`/var/run/docker.sock`, requiring either `root` permission, or `docker` group -membership. - -If you need to access the Docker daemon remotely, you need to enable the `tcp` -Socket. Beware that the default setup provides un-encrypted and -un-authenticated direct access to the Docker daemon - and should be secured -either using the [built in HTTPS encrypted socket](https://docs.docker.com/engine/security/https/), or by -putting a secure web proxy in front of it. You can listen on port `2375` on all -network interfaces with `-H tcp://0.0.0.0:2375`, or on a particular network -interface using its IP address: `-H tcp://192.168.59.103:2375`. It is -conventional to use port `2375` for un-encrypted, and port `2376` for encrypted -communication with the daemon. - -> **Note:** -> If you're using an HTTPS encrypted socket, keep in mind that only -> TLS1.0 and greater are supported. Protocols SSLv3 and under are not -> supported anymore for security reasons. - -On Systemd based systems, you can communicate with the daemon via -[Systemd socket activation](http://0pointer.de/blog/projects/socket-activation.html), -use `dockerd -H fd://`. Using `fd://` will work perfectly for most setups but -you can also specify individual sockets: `dockerd -H fd://3`. If the -specified socket activated files aren't found, then Docker will exit. You can -find examples of using Systemd socket activation with Docker and Systemd in the -[Docker source tree](https://github.com/docker/docker/tree/master/contrib/init/systemd/). - -You can configure the Docker daemon to listen to multiple sockets at the same -time using multiple `-H` options: - -```bash -# listen using the default unix socket, and on 2 specific IP addresses on this host. -$ sudo dockerd -H unix:///var/run/docker.sock -H tcp://192.168.59.106 -H tcp://10.10.10.2 -``` - -The Docker client will honor the `DOCKER_HOST` environment variable to set the -`-H` flag for the client. - -```bash -$ docker -H tcp://0.0.0.0:2375 ps -# or -$ export DOCKER_HOST="tcp://0.0.0.0:2375" -$ docker ps -# both are equal -``` - -Setting the `DOCKER_TLS_VERIFY` environment variable to any value other than -the empty string is equivalent to setting the `--tlsverify` flag. The following -are equivalent: - -```bash -$ docker --tlsverify ps -# or -$ export DOCKER_TLS_VERIFY=1 -$ docker ps -``` - -The Docker client will honor the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` -environment variables (or the lowercase versions thereof). `HTTPS_PROXY` takes -precedence over `HTTP_PROXY`. - -### Bind Docker to another host/port or a Unix socket - -> **Warning**: -> Changing the default `docker` daemon binding to a -> TCP port or Unix *docker* user group will increase your security risks -> by allowing non-root users to gain *root* access on the host. Make sure -> you control access to `docker`. If you are binding -> to a TCP port, anyone with access to that port has full Docker access; -> so it is not advisable on an open network. - -With `-H` it is possible to make the Docker daemon to listen on a -specific IP and port. By default, it will listen on -`unix:///var/run/docker.sock` to allow only local connections by the -*root* user. You *could* set it to `0.0.0.0:2375` or a specific host IP -to give access to everybody, but that is **not recommended** because -then it is trivial for someone to gain root access to the host where the -daemon is running. - -Similarly, the Docker client can use `-H` to connect to a custom port. -The Docker client will default to connecting to `unix:///var/run/docker.sock` -on Linux, and `tcp://127.0.0.1:2376` on Windows. - -`-H` accepts host and port assignment in the following format: - - tcp://[host]:[port][path] or unix://path - -For example: - -- `tcp://` -> TCP connection to `127.0.0.1` on either port `2376` when TLS encryption - is on, or port `2375` when communication is in plain text. -- `tcp://host:2375` -> TCP connection on - host:2375 -- `tcp://host:2375/path` -> TCP connection on - host:2375 and prepend path to all requests -- `unix://path/to/socket` -> Unix socket located - at `path/to/socket` - -`-H`, when empty, will default to the same value as -when no `-H` was passed in. - -`-H` also accepts short form for TCP bindings: `host:` or `host:port` or `:port` - -Run Docker in daemon mode: - -```bash -$ sudo /dockerd -H 0.0.0.0:5555 & -``` - -Download an `ubuntu` image: - -```bash -$ docker -H :5555 pull ubuntu -``` - -You can use multiple `-H`, for example, if you want to listen on both -TCP and a Unix socket - -```bash -# Run docker in daemon mode -$ sudo /dockerd -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock & -# Download an ubuntu image, use default Unix socket -$ docker pull ubuntu -# OR use the TCP port -$ docker -H tcp://127.0.0.1:2375 pull ubuntu -``` - -### Daemon storage-driver option - -The Docker daemon has support for several different image layer storage -drivers: `aufs`, `devicemapper`, `btrfs`, `zfs`, `overlay` and `overlay2`. - -The `aufs` driver is the oldest, but is based on a Linux kernel patch-set that -is unlikely to be merged into the main kernel. These are also known to cause -some serious kernel crashes. However, `aufs` allows containers to share -executable and shared library memory, so is a useful choice when running -thousands of containers with the same program or libraries. - -The `devicemapper` driver uses thin provisioning and Copy on Write (CoW) -snapshots. For each devicemapper graph location – typically -`/var/lib/docker/devicemapper` – a thin pool is created based on two block -devices, one for data and one for metadata. By default, these block devices -are created automatically by using loopback mounts of automatically created -sparse files. Refer to [Storage driver options](#storage-driver-options) below -for a way how to customize this setup. -[~jpetazzo/Resizing Docker containers with the Device Mapper plugin](http://jpetazzo.github.io/2014/01/29/docker-device-mapper-resize/) -article explains how to tune your existing setup without the use of options. - -The `btrfs` driver is very fast for `docker build` - but like `devicemapper` -does not share executable memory between devices. Use -`dockerd -s btrfs -g /mnt/btrfs_partition`. - -The `zfs` driver is probably not as fast as `btrfs` but has a longer track record -on stability. Thanks to `Single Copy ARC` shared blocks between clones will be -cached only once. Use `dockerd -s zfs`. To select a different zfs filesystem -set `zfs.fsname` option as described in [Storage driver options](#storage-driver-options). - -The `overlay` is a very fast union filesystem. It is now merged in the main -Linux kernel as of [3.18.0](https://lkml.org/lkml/2014/10/26/137). `overlay` -also supports page cache sharing, this means multiple containers accessing -the same file can share a single page cache entry (or entries), it makes -`overlay` as efficient with memory as `aufs` driver. Call -`dockerd -s overlay` to use it. - -> **Note:** -> As promising as `overlay` is, the feature is still quite young and should not -> be used in production. Most notably, using `overlay` can cause excessive -> inode consumption (especially as the number of images grows), as well as -> being incompatible with the use of RPMs. - -The `overlay2` uses the same fast union filesystem but takes advantage of -[additional features](https://lkml.org/lkml/2015/2/11/106) added in Linux -kernel 4.0 to avoid excessive inode consumption. Call `dockerd -s overlay2` -to use it. - -> **Note:** -> Both `overlay` and `overlay2` are currently unsupported on `btrfs` or any -> Copy on Write filesystem and should only be used over `ext4` partitions. - -### Storage driver options - -Particular storage-driver can be configured with options specified with -`--storage-opt` flags. Options for `devicemapper` are prefixed with `dm`, -options for `zfs` start with `zfs` and options for `btrfs` start with `btrfs`. - -#### Devicemapper options - -* `dm.thinpooldev` - - Specifies a custom block storage device to use for the thin pool. - - If using a block device for device mapper storage, it is best to use `lvm` - to create and manage the thin-pool volume. This volume is then handed to Docker - to exclusively create snapshot volumes needed for images and containers. - - Managing the thin-pool outside of Engine makes for the most feature-rich - method of having Docker utilize device mapper thin provisioning as the - backing storage for Docker containers. The highlights of the lvm-based - thin-pool management feature include: automatic or interactive thin-pool - resize support, dynamically changing thin-pool features, automatic thinp - metadata checking when lvm activates the thin-pool, etc. - - As a fallback if no thin pool is provided, loopback files are - created. Loopback is very slow, but can be used without any - pre-configuration of storage. It is strongly recommended that you do - not use loopback in production. Ensure your Engine daemon has a - `--storage-opt dm.thinpooldev` argument provided. - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.thinpooldev=/dev/mapper/thin-pool - ``` - -* `dm.basesize` - - Specifies the size to use when creating the base device, which limits the - size of images and containers. The default value is 10G. Note, thin devices - are inherently "sparse", so a 10G device which is mostly empty doesn't use - 10 GB of space on the pool. However, the filesystem will use more space for - the empty case the larger the device is. - - The base device size can be increased at daemon restart which will allow - all future images and containers (based on those new images) to be of the - new base device size. - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.basesize=50G - ``` - - This will increase the base device size to 50G. The Docker daemon will throw an - error if existing base device size is larger than 50G. A user can use - this option to expand the base device size however shrinking is not permitted. - - This value affects the system-wide "base" empty filesystem - that may already be initialized and inherited by pulled images. Typically, - a change to this value requires additional steps to take effect: - - ```bash - $ sudo service docker stop - $ sudo rm -rf /var/lib/docker - $ sudo service docker start - ``` - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.basesize=20G - ``` - -* `dm.loopdatasize` - - > **Note**: - > This option configures devicemapper loopback, which should not - > be used in production. - - Specifies the size to use when creating the loopback file for the - "data" device which is used for the thin pool. The default size is - 100G. The file is sparse, so it will not initially take up this - much space. - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.loopdatasize=200G - ``` - -* `dm.loopmetadatasize` - - > **Note**: - > This option configures devicemapper loopback, which should not - > be used in production. - - Specifies the size to use when creating the loopback file for the - "metadata" device which is used for the thin pool. The default size - is 2G. The file is sparse, so it will not initially take up - this much space. - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.loopmetadatasize=4G - ``` - -* `dm.fs` - - Specifies the filesystem type to use for the base device. The supported - options are "ext4" and "xfs". The default is "xfs" - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.fs=ext4 - ``` - -* `dm.mkfsarg` - - Specifies extra mkfs arguments to be used when creating the base device. - - Example use: - - ```bash - $ sudo dockerd --storage-opt "dm.mkfsarg=-O ^has_journal" - ``` - -* `dm.mountopt` - - Specifies extra mount options used when mounting the thin devices. - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.mountopt=nodiscard - ``` - -* `dm.datadev` - - (Deprecated, use `dm.thinpooldev`) - - Specifies a custom blockdevice to use for data for the thin pool. - - If using a block device for device mapper storage, ideally both datadev and - metadatadev should be specified to completely avoid using the loopback - device. - - Example use: - - ```bash - $ sudo dockerd \ - --storage-opt dm.datadev=/dev/sdb1 \ - --storage-opt dm.metadatadev=/dev/sdc1 - ``` - -* `dm.metadatadev` - - (Deprecated, use `dm.thinpooldev`) - - Specifies a custom blockdevice to use for metadata for the thin pool. - - For best performance the metadata should be on a different spindle than the - data, or even better on an SSD. - - If setting up a new metadata pool it is required to be valid. This can be - achieved by zeroing the first 4k to indicate empty metadata, like this: - - ```bash - $ dd if=/dev/zero of=$metadata_dev bs=4096 count=1 - ``` - - Example use: - - ```bash - $ sudo dockerd \ - --storage-opt dm.datadev=/dev/sdb1 \ - --storage-opt dm.metadatadev=/dev/sdc1 - ``` - -* `dm.blocksize` - - Specifies a custom blocksize to use for the thin pool. The default - blocksize is 64K. - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.blocksize=512K - ``` - -* `dm.blkdiscard` - - Enables or disables the use of blkdiscard when removing devicemapper - devices. This is enabled by default (only) if using loopback devices and is - required to resparsify the loopback file on image/container removal. - - Disabling this on loopback can lead to *much* faster container removal - times, but will make the space used in `/var/lib/docker` directory not be - returned to the system for other use when containers are removed. - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.blkdiscard=false - ``` - -* `dm.override_udev_sync_check` - - Overrides the `udev` synchronization checks between `devicemapper` and `udev`. - `udev` is the device manager for the Linux kernel. - - To view the `udev` sync support of a Docker daemon that is using the - `devicemapper` driver, run: - - ```bash - $ docker info - [...] - Udev Sync Supported: true - [...] - ``` - - When `udev` sync support is `true`, then `devicemapper` and udev can - coordinate the activation and deactivation of devices for containers. - - When `udev` sync support is `false`, a race condition occurs between - the`devicemapper` and `udev` during create and cleanup. The race condition - results in errors and failures. (For information on these failures, see - [docker#4036](https://github.com/docker/docker/issues/4036)) - - To allow the `docker` daemon to start, regardless of `udev` sync not being - supported, set `dm.override_udev_sync_check` to true: - - ```bash - $ sudo dockerd --storage-opt dm.override_udev_sync_check=true - ``` - - When this value is `true`, the `devicemapper` continues and simply warns - you the errors are happening. - - > **Note:** - > The ideal is to pursue a `docker` daemon and environment that does - > support synchronizing with `udev`. For further discussion on this - > topic, see [docker#4036](https://github.com/docker/docker/issues/4036). - > Otherwise, set this flag for migrating existing Docker daemons to - > a daemon with a supported environment. - -* `dm.use_deferred_removal` - - Enables use of deferred device removal if `libdm` and the kernel driver - support the mechanism. - - Deferred device removal means that if device is busy when devices are - being removed/deactivated, then a deferred removal is scheduled on - device. And devices automatically go away when last user of the device - exits. - - For example, when a container exits, its associated thin device is removed. - If that device has leaked into some other mount namespace and can't be - removed, the container exit still succeeds and this option causes the - system to schedule the device for deferred removal. It does not wait in a - loop trying to remove a busy device. - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.use_deferred_removal=true - ``` - -* `dm.use_deferred_deletion` - - Enables use of deferred device deletion for thin pool devices. By default, - thin pool device deletion is synchronous. Before a container is deleted, - the Docker daemon removes any associated devices. If the storage driver - can not remove a device, the container deletion fails and daemon returns. - - Error deleting container: Error response from daemon: Cannot destroy container - - To avoid this failure, enable both deferred device deletion and deferred - device removal on the daemon. - - ```bash - $ sudo dockerd \ - --storage-opt dm.use_deferred_deletion=true \ - --storage-opt dm.use_deferred_removal=true - ``` - - With these two options enabled, if a device is busy when the driver is - deleting a container, the driver marks the device as deleted. Later, when - the device isn't in use, the driver deletes it. - - In general it should be safe to enable this option by default. It will help - when unintentional leaking of mount point happens across multiple mount - namespaces. - -* `dm.min_free_space` - - Specifies the min free space percent in a thin pool require for new device - creation to succeed. This check applies to both free data space as well - as free metadata space. Valid values are from 0% - 99%. Value 0% disables - free space checking logic. If user does not specify a value for this option, - the Engine uses a default value of 10%. - - Whenever a new a thin pool device is created (during `docker pull` or during - container creation), the Engine checks if the minimum free space is - available. If sufficient space is unavailable, then device creation fails - and any relevant `docker` operation fails. - - To recover from this error, you must create more free space in the thin pool - to recover from the error. You can create free space by deleting some images - and containers from the thin pool. You can also add more storage to the thin - pool. - - To add more space to a LVM (logical volume management) thin pool, just add - more storage to the volume group container thin pool; this should automatically - resolve any errors. If your configuration uses loop devices, then stop the - Engine daemon, grow the size of loop files and restart the daemon to resolve - the issue. - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.min_free_space=10% - ``` - -* `dm.xfs_nospace_max_retries` - - Specifies the maximum number of retries XFS should attempt to complete - IO when ENOSPC (no space) error is returned by underlying storage device. - - By default XFS retries infinitely for IO to finish and this can result - in unkillable process. To change this behavior one can set - xfs_nospace_max_retries to say 0 and XFS will not retry IO after getting - ENOSPC and will shutdown filesystem. - - Example use: - - ```bash - $ sudo dockerd --storage-opt dm.xfs_nospace_max_retries=0 - ``` - -#### ZFS options - -* `zfs.fsname` - - Set zfs filesystem under which docker will create its own datasets. - By default docker will pick up the zfs filesystem where docker graph - (`/var/lib/docker`) is located. - - Example use: - - ```bash - $ sudo dockerd -s zfs --storage-opt zfs.fsname=zroot/docker - ``` - -#### Btrfs options - -* `btrfs.min_space` - - Specifies the minimum size to use when creating the subvolume which is used - for containers. If user uses disk quota for btrfs when creating or running - a container with **--storage-opt size** option, docker should ensure the - **size** cannot be smaller than **btrfs.min_space**. - - Example use: - - ```bash - $ sudo dockerd -s btrfs --storage-opt btrfs.min_space=10G - ``` - -#### Overlay2 options - -* `overlay2.override_kernel_check` - - Overrides the Linux kernel version check allowing overlay2. Support for - specifying multiple lower directories needed by overlay2 was added to the - Linux kernel in 4.0.0. However some older kernel versions may be patched - to add multiple lower directory support for OverlayFS. This option should - only be used after verifying this support exists in the kernel. Applying - this option on a kernel without this support will cause failures on mount. - -## Docker runtime execution options - -The Docker daemon relies on a -[OCI](https://github.com/opencontainers/runtime-spec) compliant runtime -(invoked via the `containerd` daemon) as its interface to the Linux -kernel `namespaces`, `cgroups`, and `SELinux`. - -By default, the Docker daemon automatically starts `containerd`. If you want to -control `containerd` startup, manually start `containerd` and pass the path to -the `containerd` socket using the `--containerd` flag. For example: - -```bash -$ sudo dockerd --containerd /var/run/dev/docker-containerd.sock -``` - -Runtimes can be registered with the daemon either via the -configuration file or using the `--add-runtime` command line argument. - -The following is an example adding 2 runtimes via the configuration: - -```json -{ - "default-runtime": "runc", - "runtimes": { - "runc": { - "path": "runc" - }, - "custom": { - "path": "/usr/local/bin/my-runc-replacement", - "runtimeArgs": [ - "--debug" - ] - } - } -} -``` - -This is the same example via the command line: - -```bash -$ sudo dockerd --add-runtime runc=runc --add-runtime custom=/usr/local/bin/my-runc-replacement -``` - -> **Note**: defining runtime arguments via the command line is not supported. - -## Options for the runtime - -You can configure the runtime using options specified -with the `--exec-opt` flag. All the flag's options have the `native` prefix. A -single `native.cgroupdriver` option is available. - -The `native.cgroupdriver` option specifies the management of the container's -cgroups. You can specify only specify `cgroupfs` or `systemd`. If you specify -`systemd` and it is not available, the system errors out. If you omit the -`native.cgroupdriver` option,` cgroupfs` is used. - -This example sets the `cgroupdriver` to `systemd`: - -```bash -$ sudo dockerd --exec-opt native.cgroupdriver=systemd -``` - -Setting this option applies to all containers the daemon launches. - -Also Windows Container makes use of `--exec-opt` for special purpose. Docker user -can specify default container isolation technology with this, for example: - -```bash -$ sudo dockerd --exec-opt isolation=hyperv -``` - -Will make `hyperv` the default isolation technology on Windows. If no isolation -value is specified on daemon start, on Windows client, the default is -`hyperv`, and on Windows server, the default is `process`. - -## Daemon DNS options - -To set the DNS server for all Docker containers, use: - -```bash -$ sudo dockerd --dns 8.8.8.8 -``` - - -To set the DNS search domain for all Docker containers, use: - -```bash -$ sudo dockerd --dns-search example.com -``` - - -## Insecure registries - -Docker considers a private registry either secure or insecure. In the rest of -this section, *registry* is used for *private registry*, and `myregistry:5000` -is a placeholder example for a private registry. - -A secure registry uses TLS and a copy of its CA certificate is placed on the -Docker host at `/etc/docker/certs.d/myregistry:5000/ca.crt`. An insecure -registry is either not using TLS (i.e., listening on plain text HTTP), or is -using TLS with a CA certificate not known by the Docker daemon. The latter can -happen when the certificate was not found under -`/etc/docker/certs.d/myregistry:5000/`, or if the certificate verification -failed (i.e., wrong CA). - -By default, Docker assumes all, but local (see local registries below), -registries are secure. Communicating with an insecure registry is not possible -if Docker assumes that registry is secure. In order to communicate with an -insecure registry, the Docker daemon requires `--insecure-registry` in one of -the following two forms: - -* `--insecure-registry myregistry:5000` tells the Docker daemon that - myregistry:5000 should be considered insecure. -* `--insecure-registry 10.1.0.0/16` tells the Docker daemon that all registries - whose domain resolve to an IP address is part of the subnet described by the - CIDR syntax, should be considered insecure. - -The flag can be used multiple times to allow multiple registries to be marked -as insecure. - -If an insecure registry is not marked as insecure, `docker pull`, -`docker push`, and `docker search` will result in an error message prompting -the user to either secure or pass the `--insecure-registry` flag to the Docker -daemon as described above. - -Local registries, whose IP address falls in the 127.0.0.0/8 range, are -automatically marked as insecure as of Docker 1.3.2. It is not recommended to -rely on this, as it may change in the future. - -Enabling `--insecure-registry`, i.e., allowing un-encrypted and/or untrusted -communication, can be useful when running a local registry. However, -because its use creates security vulnerabilities it should ONLY be enabled for -testing purposes. For increased security, users should add their CA to their -system's list of trusted CAs instead of enabling `--insecure-registry`. - -## Legacy Registries - -Enabling `--disable-legacy-registry` forces a docker daemon to only interact with registries which support the V2 protocol. Specifically, the daemon will not attempt `push`, `pull` and `login` to v1 registries. The exception to this is `search` which can still be performed on v1 registries. - -## Running a Docker daemon behind an HTTPS_PROXY - -When running inside a LAN that uses an `HTTPS` proxy, the Docker Hub -certificates will be replaced by the proxy's certificates. These certificates -need to be added to your Docker host's configuration: - -1. Install the `ca-certificates` package for your distribution -2. Ask your network admin for the proxy's CA certificate and append them to - `/etc/pki/tls/certs/ca-bundle.crt` -3. Then start your Docker daemon with `HTTPS_PROXY=http://username:password@proxy:port/ dockerd`. - The `username:` and `password@` are optional - and are only needed if your - proxy is set up to require authentication. - -This will only add the proxy and authentication to the Docker daemon's requests - -your `docker build`s and running containers will need extra configuration to -use the proxy - -## Default Ulimits - -`--default-ulimit` allows you to set the default `ulimit` options to use for -all containers. It takes the same options as `--ulimit` for `docker run`. If -these defaults are not set, `ulimit` settings will be inherited, if not set on -`docker run`, from the Docker daemon. Any `--ulimit` options passed to -`docker run` will overwrite these defaults. - -Be careful setting `nproc` with the `ulimit` flag as `nproc` is designed by Linux to -set the maximum number of processes available to a user, not to a container. For details -please check the [run](run.md) reference. - -## Nodes discovery - -The `--cluster-advertise` option specifies the `host:port` or `interface:port` -combination that this particular daemon instance should use when advertising -itself to the cluster. The daemon is reached by remote hosts through this value. -If you specify an interface, make sure it includes the IP address of the actual -Docker host. For Engine installation created through `docker-machine`, the -interface is typically `eth1`. - -The daemon uses [libkv](https://github.com/docker/libkv/) to advertise -the node within the cluster. Some key-value backends support mutual -TLS. To configure the client TLS settings used by the daemon can be configured -using the `--cluster-store-opt` flag, specifying the paths to PEM encoded -files. For example: - -```bash -$ sudo dockerd \ - --cluster-advertise 192.168.1.2:2376 \ - --cluster-store etcd://192.168.1.2:2379 \ - --cluster-store-opt kv.cacertfile=/path/to/ca.pem \ - --cluster-store-opt kv.certfile=/path/to/cert.pem \ - --cluster-store-opt kv.keyfile=/path/to/key.pem -``` - -The currently supported cluster store options are: - -* `discovery.heartbeat` - - Specifies the heartbeat timer in seconds which is used by the daemon as a - keepalive mechanism to make sure discovery module treats the node as alive - in the cluster. If not configured, the default value is 20 seconds. - -* `discovery.ttl` - - Specifies the ttl (time-to-live) in seconds which is used by the discovery - module to timeout a node if a valid heartbeat is not received within the - configured ttl value. If not configured, the default value is 60 seconds. - -* `kv.cacertfile` - - Specifies the path to a local file with PEM encoded CA certificates to trust - -* `kv.certfile` - - Specifies the path to a local file with a PEM encoded certificate. This - certificate is used as the client cert for communication with the - Key/Value store. - -* `kv.keyfile` - - Specifies the path to a local file with a PEM encoded private key. This - private key is used as the client key for communication with the - Key/Value store. - -* `kv.path` - - Specifies the path in the Key/Value store. If not configured, the default value is 'docker/nodes'. - -## Access authorization - -Docker's access authorization can be extended by authorization plugins that your -organization can purchase or build themselves. You can install one or more -authorization plugins when you start the Docker `daemon` using the -`--authorization-plugin=PLUGIN_ID` option. - -```bash -$ sudo dockerd --authorization-plugin=plugin1 --authorization-plugin=plugin2,... -``` - -The `PLUGIN_ID` value is either the plugin's name or a path to its specification -file. The plugin's implementation determines whether you can specify a name or -path. Consult with your Docker administrator to get information about the -plugins available to you. - -Once a plugin is installed, requests made to the `daemon` through the command -line or Docker's Engine API are allowed or denied by the plugin. If you have -multiple plugins installed, at least one must allow the request for it to -complete. - -For information about how to create an authorization plugin, see [authorization -plugin](../../extend/plugins_authorization.md) section in the Docker extend section of this documentation. - - -## Daemon user namespace options - -The Linux kernel [user namespace support](http://man7.org/linux/man-pages/man7/user_namespaces.7.html) provides additional security by enabling -a process, and therefore a container, to have a unique range of user and -group IDs which are outside the traditional user and group range utilized by -the host system. Potentially the most important security improvement is that, -by default, container processes running as the `root` user will have expected -administrative privilege (with some restrictions) inside the container but will -effectively be mapped to an unprivileged `uid` on the host. - -When user namespace support is enabled, Docker creates a single daemon-wide mapping -for all containers running on the same engine instance. The mappings will -utilize the existing subordinate user and group ID feature available on all modern -Linux distributions. -The [`/etc/subuid`](http://man7.org/linux/man-pages/man5/subuid.5.html) and -[`/etc/subgid`](http://man7.org/linux/man-pages/man5/subgid.5.html) files will be -read for the user, and optional group, specified to the `--userns-remap` -parameter. If you do not wish to specify your own user and/or group, you can -provide `default` as the value to this flag, and a user will be created on your behalf -and provided subordinate uid and gid ranges. This default user will be named -`dockremap`, and entries will be created for it in `/etc/passwd` and -`/etc/group` using your distro's standard user and group creation tools. - -> **Note**: The single mapping per-daemon restriction is in place for now -> because Docker shares image layers from its local cache across all -> containers running on the engine instance. Since file ownership must be -> the same for all containers sharing the same layer content, the decision -> was made to map the file ownership on `docker pull` to the daemon's user and -> group mappings so that there is no delay for running containers once the -> content is downloaded. This design preserves the same performance for `docker -> pull`, `docker push`, and container startup as users expect with -> user namespaces disabled. - -### Starting the daemon with user namespaces enabled - -To enable user namespace support, start the daemon with the -`--userns-remap` flag, which accepts values in the following formats: - - - uid - - uid:gid - - username - - username:groupname - -If numeric IDs are provided, translation back to valid user or group names -will occur so that the subordinate uid and gid information can be read, given -these resources are name-based, not id-based. If the numeric ID information -provided does not exist as entries in `/etc/passwd` or `/etc/group`, daemon -startup will fail with an error message. - -**Example: starting with default Docker user management:** - -```bash -$ sudo dockerd --userns-remap=default -``` - -When `default` is provided, Docker will create - or find the existing - user and group -named `dockremap`. If the user is created, and the Linux distribution has -appropriate support, the `/etc/subuid` and `/etc/subgid` files will be populated -with a contiguous 65536 length range of subordinate user and group IDs, starting -at an offset based on prior entries in those files. For example, Ubuntu will -create the following range, based on an existing user named `user1` already owning -the first 65536 range: - -```bash -$ cat /etc/subuid -user1:100000:65536 -dockremap:165536:65536 -``` - -If you have a preferred/self-managed user with subordinate ID mappings already -configured, you can provide that username or uid to the `--userns-remap` flag. -If you have a group that doesn't match the username, you may provide the `gid` -or group name as well; otherwise the username will be used as the group name -when querying the system for the subordinate group ID range. - -The output of `docker info` can be used to determine if the daemon is running -with user namespaces enabled or not. If the daemon is configured with user -namespaces, the Security Options entry in the response will list "userns" as -one of the enabled security features. - -### Detailed information on `subuid`/`subgid` ranges - -Given potential advanced use of the subordinate ID ranges by power users, the -following paragraphs define how the Docker daemon currently uses the range entries -found within the subordinate range files. - -The simplest case is that only one contiguous range is defined for the -provided user or group. In this case, Docker will use that entire contiguous -range for the mapping of host uids and gids to the container process. This -means that the first ID in the range will be the remapped root user, and the -IDs above that initial ID will map host ID 1 through the end of the range. - -From the example `/etc/subuid` content shown above, the remapped root -user would be uid 165536. - -If the system administrator has set up multiple ranges for a single user or -group, the Docker daemon will read all the available ranges and use the -following algorithm to create the mapping ranges: - -1. The range segments found for the particular user will be sorted by *start ID* ascending. -2. Map segments will be created from each range in increasing value with a length matching the length of each segment. Therefore the range segment with the lowest numeric starting value will be equal to the remapped root, and continue up through host uid/gid equal to the range segment length. As an example, if the lowest segment starts at ID 1000 and has a length of 100, then a map of 1000 -> 0 (the remapped root) up through 1100 -> 100 will be created from this segment. If the next segment starts at ID 10000, then the next map will start with mapping 10000 -> 101 up to the length of this second segment. This will continue until no more segments are found in the subordinate files for this user. -3. If more than five range segments exist for a single user, only the first five will be utilized, matching the kernel's limitation of only five entries in `/proc/self/uid_map` and `proc/self/gid_map`. - -### Disable user namespace for a container - -If you enable user namespaces on the daemon, all containers are started -with user namespaces enabled. In some situations you might want to disable -this feature for a container, for example, to start a privileged container (see -[user namespace known restrictions](#user-namespace-known-restrictions)). -To enable those advanced features for a specific container use `--userns=host` -in the `run/exec/create` command. -This option will completely disable user namespace mapping for the container's user. - -### User namespace known restrictions - -The following standard Docker features are currently incompatible when -running a Docker daemon with user namespaces enabled: - - - sharing PID or NET namespaces with the host (`--pid=host` or `--net=host`) - - Using `--privileged` mode flag on `docker run` (unless also specifying `--userns=host`) - -In general, user namespaces are an advanced feature and will require -coordination with other capabilities. For example, if volumes are mounted from -the host, file ownership will have to be pre-arranged if the user or -administrator wishes the containers to have expected access to the volume -contents. Note that when using external volume or graph driver plugins, those -external software programs must be made aware of user and group mapping ranges -if they are to work seamlessly with user namespace support. - -Finally, while the `root` user inside a user namespaced container process has -many of the expected admin privileges that go along with being the superuser, the -Linux kernel has restrictions based on internal knowledge that this is a user namespaced -process. The most notable restriction that we are aware of at this time is the -inability to use `mknod`. Permission will be denied for device creation even as -container `root` inside a user namespace. - -## Miscellaneous options - -IP masquerading uses address translation to allow containers without a public -IP to talk to other machines on the Internet. This may interfere with some -network topologies and can be disabled with `--ip-masq=false`. - -Docker supports softlinks for the Docker data directory (`/var/lib/docker`) and -for `/var/lib/docker/tmp`. The `DOCKER_TMPDIR` and the data directory can be -set like this: - - DOCKER_TMPDIR=/mnt/disk2/tmp /usr/local/bin/dockerd -D -g /var/lib/docker -H unix:// > /var/lib/docker-machine/docker.log 2>&1 - # or - export DOCKER_TMPDIR=/mnt/disk2/tmp - /usr/local/bin/dockerd -D -g /var/lib/docker -H unix:// > /var/lib/docker-machine/docker.log 2>&1 - -## Default cgroup parent - -The `--cgroup-parent` option allows you to set the default cgroup parent -to use for containers. If this option is not set, it defaults to `/docker` for -fs cgroup driver and `system.slice` for systemd cgroup driver. - -If the cgroup has a leading forward slash (`/`), the cgroup is created -under the root cgroup, otherwise the cgroup is created under the daemon -cgroup. - -Assuming the daemon is running in cgroup `daemoncgroup`, -`--cgroup-parent=/foobar` creates a cgroup in -`/sys/fs/cgroup/memory/foobar`, whereas using `--cgroup-parent=foobar` -creates the cgroup in `/sys/fs/cgroup/memory/daemoncgroup/foobar` - -The systemd cgroup driver has different rules for `--cgroup-parent`. Systemd -represents hierarchy by slice and the name of the slice encodes the location in -the tree. So `--cgroup-parent` for systemd cgroups should be a slice name. A -name can consist of a dash-separated series of names, which describes the path -to the slice from the root slice. For example, `--cgroup-parent=user-a-b.slice` -means the memory cgroup for the container is created in -`/sys/fs/cgroup/memory/user.slice/user-a.slice/user-a-b.slice/docker-.scope`. - -This setting can also be set per container, using the `--cgroup-parent` -option on `docker create` and `docker run`, and takes precedence over -the `--cgroup-parent` option on the daemon. - -## Daemon Metrics - -The `--metrics-addr` option takes a tcp address to serve the metrics API. -This feature is still experimental, therefore, the daemon must be running in experimental -mode for this feature to work. - -To serve the metrics API on localhost:1337 you would specify `--metrics-addr 127.0.0.1:1337` -allowing you to make requests on the API at `127.0.0.1:1337/metrics` to receive metrics in the -[prometheus](https://prometheus.io/docs/instrumenting/exposition_formats/) format. - -If you are running a prometheus server you can add this address to your scrape configs -to have prometheus collect metrics on Docker. For more information -on prometheus you can view the website [here](https://prometheus.io/). - -```yml -scrape_configs: - - job_name: 'docker' - static_configs: - - targets: ['127.0.0.1:1337'] -``` - -Please note that this feature is still marked as experimental as metrics and metric -names could change while this feature is still in experimental. Please provide -feedback on what you would like to see collected in the API. - -## Daemon configuration file - -The `--config-file` option allows you to set any configuration option -for the daemon in a JSON format. This file uses the same flag names as keys, -except for flags that allow several entries, where it uses the plural -of the flag name, e.g., `labels` for the `label` flag. - -The options set in the configuration file must not conflict with options set -via flags. The docker daemon fails to start if an option is duplicated between -the file and the flags, regardless their value. We do this to avoid -silently ignore changes introduced in configuration reloads. -For example, the daemon fails to start if you set daemon labels -in the configuration file and also set daemon labels via the `--label` flag. -Options that are not present in the file are ignored when the daemon starts. - -### Linux configuration file - -The default location of the configuration file on Linux is -`/etc/docker/daemon.json`. The `--config-file` flag can be used to specify a - non-default location. - -This is a full example of the allowed configuration options on Linux: - -```json -{ - "authorization-plugins": [], - "dns": [], - "dns-opts": [], - "dns-search": [], - "exec-opts": [], - "exec-root": "", - "experimental": false, - "storage-driver": "", - "storage-opts": [], - "labels": [], - "live-restore": true, - "log-driver": "", - "log-opts": {}, - "mtu": 0, - "pidfile": "", - "graph": "", - "cluster-store": "", - "cluster-store-opts": {}, - "cluster-advertise": "", - "max-concurrent-downloads": 3, - "max-concurrent-uploads": 5, - "shutdown-timeout": 15, - "debug": true, - "hosts": [], - "log-level": "", - "tls": true, - "tlsverify": true, - "tlscacert": "", - "tlscert": "", - "tlskey": "", - "swarm-default-advertise-addr": "", - "api-cors-header": "", - "selinux-enabled": false, - "userns-remap": "", - "group": "", - "cgroup-parent": "", - "default-ulimits": {}, - "init": false, - "init-path": "/usr/libexec/docker-init", - "ipv6": false, - "iptables": false, - "ip-forward": false, - "ip-masq": false, - "userland-proxy": false, - "userland-proxy-path": "/usr/libexec/docker-proxy", - "ip": "0.0.0.0", - "bridge": "", - "bip": "", - "fixed-cidr": "", - "fixed-cidr-v6": "", - "default-gateway": "", - "default-gateway-v6": "", - "icc": false, - "raw-logs": false, - "registry-mirrors": [], - "seccomp-profile": "", - "insecure-registries": [], - "disable-legacy-registry": false, - "default-runtime": "runc", - "oom-score-adjust": -500, - "runtimes": { - "runc": { - "path": "runc" - }, - "custom": { - "path": "/usr/local/bin/my-runc-replacement", - "runtimeArgs": [ - "--debug" - ] - } - } -} -``` - -### Windows configuration file - -The default location of the configuration file on Windows is - `%programdata%\docker\config\daemon.json`. The `--config-file` flag can be - used to specify a non-default location. - -This is a full example of the allowed configuration options on Windows: - -```json -{ - "authorization-plugins": [], - "dns": [], - "dns-opts": [], - "dns-search": [], - "exec-opts": [], - "experimental": false, - "storage-driver": "", - "storage-opts": [], - "labels": [], - "log-driver": "", - "mtu": 0, - "pidfile": "", - "graph": "", - "cluster-store": "", - "cluster-advertise": "", - "max-concurrent-downloads": 3, - "max-concurrent-uploads": 5, - "shutdown-timeout": 15, - "debug": true, - "hosts": [], - "log-level": "", - "tlsverify": true, - "tlscacert": "", - "tlscert": "", - "tlskey": "", - "swarm-default-advertise-addr": "", - "group": "", - "default-ulimits": {}, - "bridge": "", - "fixed-cidr": "", - "raw-logs": false, - "registry-mirrors": [], - "insecure-registries": [], - "disable-legacy-registry": false -} -``` - -### Configuration reloading - -Some options can be reconfigured when the daemon is running without requiring -to restart the process. We use the `SIGHUP` signal in Linux to reload, and a global event -in Windows with the key `Global\docker-daemon-config-$PID`. The options can -be modified in the configuration file but still will check for conflicts with -the provided flags. The daemon fails to reconfigure itself -if there are conflicts, but it won't stop execution. - -The list of currently supported options that can be reconfigured is this: - -- `debug`: it changes the daemon to debug mode when set to true. -- `cluster-store`: it reloads the discovery store with the new address. -- `cluster-store-opts`: it uses the new options to reload the discovery store. -- `cluster-advertise`: it modifies the address advertised after reloading. -- `labels`: it replaces the daemon labels with a new set of labels. -- `live-restore`: Enables [keeping containers alive during daemon downtime](https://docs.docker.com/engine/admin/live-restore/). -- `max-concurrent-downloads`: it updates the max concurrent downloads for each pull. -- `max-concurrent-uploads`: it updates the max concurrent uploads for each push. -- `default-runtime`: it updates the runtime to be used if not is - specified at container creation. It defaults to "default" which is - the runtime shipped with the official docker packages. -- `runtimes`: it updates the list of available OCI runtimes that can - be used to run containers -- `authorization-plugin`: specifies the authorization plugins to use. -- `insecure-registries`: it replaces the daemon insecure registries with a new set of insecure registries. If some existing insecure registries in daemon's configuration are not in newly reloaded insecure resgitries, these existing ones will be removed from daemon's config. - -Updating and reloading the cluster configurations such as `--cluster-store`, -`--cluster-advertise` and `--cluster-store-opts` will take effect only if -these configurations were not previously configured. If `--cluster-store` -has been provided in flags and `cluster-advertise` not, `cluster-advertise` -can be added in the configuration file without accompanied by `--cluster-store`. -Configuration reload will log a warning message if it detects a change in -previously configured cluster configurations. - - -## Running multiple daemons - -> **Note:** Running multiple daemons on a single host is considered as "experimental". The user should be aware of -> unsolved problems. This solution may not work properly in some cases. Solutions are currently under development -> and will be delivered in the near future. - -This section describes how to run multiple Docker daemons on a single host. To -run multiple daemons, you must configure each daemon so that it does not -conflict with other daemons on the same host. You can set these options either -by providing them as flags, or by using a [daemon configuration file](#daemon-configuration-file). - -The following daemon options must be configured for each daemon: - -```bash --b, --bridge= Attach containers to a network bridge ---exec-root=/var/run/docker Root of the Docker execdriver --g, --graph=/var/lib/docker Root of the Docker runtime --p, --pidfile=/var/run/docker.pid Path to use for daemon PID file --H, --host=[] Daemon socket(s) to connect to ---iptables=true Enable addition of iptables rules ---config-file=/etc/docker/daemon.json Daemon configuration file ---tlscacert="~/.docker/ca.pem" Trust certs signed only by this CA ---tlscert="~/.docker/cert.pem" Path to TLS certificate file ---tlskey="~/.docker/key.pem" Path to TLS key file -``` - -When your daemons use different values for these flags, you can run them on the same host without any problems. -It is very important to properly understand the meaning of those options and to use them correctly. - -- The `-b, --bridge=` flag is set to `docker0` as default bridge network. It is created automatically when you install Docker. -If you are not using the default, you must create and configure the bridge manually or just set it to 'none': `--bridge=none` -- `--exec-root` is the path where the container state is stored. The default value is `/var/run/docker`. Specify the path for -your running daemon here. -- `--graph` is the path where images are stored. The default value is `/var/lib/docker`. To avoid any conflict with other daemons -set this parameter separately for each daemon. -- `-p, --pidfile=/var/run/docker.pid` is the path where the process ID of the daemon is stored. Specify the path for your -pid file here. -- `--host=[]` specifies where the Docker daemon will listen for client connections. If unspecified, it defaults to `/var/run/docker.sock`. -- `--iptables=false` prevents the Docker daemon from adding iptables rules. If -multiple daemons manage iptables rules, they may overwrite rules set by another -daemon. Be aware that disabling this option requires you to manually add -iptables rules to expose container ports. If you prevent Docker from adding -iptables rules, Docker will also not add IP masquerading rules, even if you set -`--ip-masq` to `true`. Without IP masquerading rules, Docker containers will not be -able to connect to external hosts or the internet when using network other than -default bridge. -- `--config-file=/etc/docker/daemon.json` is the path where configuration file is stored. You can use it instead of -daemon flags. Specify the path for each daemon. -- `--tls*` Docker daemon supports `--tlsverify` mode that enforces encrypted and authenticated remote connections. -The `--tls*` options enable use of specific certificates for individual daemons. - -Example script for a separate “bootstrap” instance of the Docker daemon without network: - -```bash -$ sudo dockerd \ - -H unix:///var/run/docker-bootstrap.sock \ - -p /var/run/docker-bootstrap.pid \ - --iptables=false \ - --ip-masq=false \ - --bridge=none \ - --graph=/var/lib/docker-bootstrap \ - --exec-root=/var/run/docker-bootstrap -``` diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/events.md b/vendor/github.com/docker/docker/docs/reference/commandline/events.md deleted file mode 100644 index baa966d62..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/events.md +++ /dev/null @@ -1,217 +0,0 @@ ---- -title: "events" -description: "The events command description and usage" -keywords: "events, container, report" ---- - - - -# events - -```markdown -Usage: docker events [OPTIONS] - -Get real time events from the server - -Options: - -f, --filter value Filter output based on conditions provided (default []) - --format string Format the output using the given Go template - --help Print usage - --since string Show all events created since timestamp - --until string Stream events until this timestamp -``` - -Docker containers report the following events: - - attach, commit, copy, create, destroy, detach, die, exec_create, exec_detach, exec_start, export, health_status, kill, oom, pause, rename, resize, restart, start, stop, top, unpause, update - -Docker images report the following events: - - delete, import, load, pull, push, save, tag, untag - -Docker plugins report the following events: - - install, enable, disable, remove - -Docker volumes report the following events: - - create, mount, unmount, destroy - -Docker networks report the following events: - - create, connect, disconnect, destroy - -Docker daemon report the following events: - - reload - -The `--since` and `--until` parameters can be Unix timestamps, date formatted -timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed -relative to the client machine’s time. If you do not provide the `--since` option, -the command returns only new and/or live events. Supported formats for date -formatted time stamps include RFC3339Nano, RFC3339, `2006-01-02T15:04:05`, -`2006-01-02T15:04:05.999999999`, `2006-01-02Z07:00`, and `2006-01-02`. The local -timezone on the client will be used if you do not provide either a `Z` or a -`+-00:00` timezone offset at the end of the timestamp. When providing Unix -timestamps enter seconds[.nanoseconds], where seconds is the number of seconds -that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap -seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a -fraction of a second no more than nine digits long. - -## Filtering - -The filtering flag (`-f` or `--filter`) format is of "key=value". If you would -like to use multiple filters, pass multiple flags (e.g., -`--filter "foo=bar" --filter "bif=baz"`) - -Using the same filter multiple times will be handled as a *OR*; for example -`--filter container=588a23dac085 --filter container=a8f7720b8c22` will display -events for container 588a23dac085 *OR* container a8f7720b8c22 - -Using multiple filters will be handled as a *AND*; for example -`--filter container=588a23dac085 --filter event=start` will display events for -container container 588a23dac085 *AND* the event type is *start* - -The currently supported filters are: - -* container (`container=`) -* event (`event=`) -* image (`image=`) -* plugin (experimental) (`plugin=`) -* label (`label=` or `label==`) -* type (`type=`) -* volume (`volume=`) -* network (`network=`) -* daemon (`daemon=`) - -## Format - -If a format (`--format`) is specified, the given template will be executed -instead of the default -format. Go's [text/template](http://golang.org/pkg/text/template/) package -describes all the details of the format. - -If a format is set to `{{json .}}`, the events are streamed as valid JSON -Lines. For information about JSON Lines, please refer to http://jsonlines.org/ . - -## Examples - -You'll need two shells for this example. - -**Shell 1: Listening for events:** - - $ docker events - -**Shell 2: Start and Stop containers:** - - $ docker start 4386fb97867d - $ docker stop 4386fb97867d - $ docker stop 7805c1d35632 - -**Shell 1: (Again .. now showing events):** - - 2015-05-12T11:51:30.999999999Z07:00 container start 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T11:51:30.999999999Z07:00 container die 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T15:52:12.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T15:53:45.999999999Z07:00 container die 7805c1d35632 (image=redis:2.8) - 2015-05-12T15:54:03.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - -**Show events in the past from a specified time:** - - $ docker events --since 1378216169 - 2015-05-12T11:51:30.999999999Z07:00 container die 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T15:52:12.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T15:53:45.999999999Z07:00 container die 7805c1d35632 (image=redis:2.8) - 2015-05-12T15:54:03.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - - $ docker events --since '2013-09-03' - 2015-05-12T11:51:30.999999999Z07:00 container start 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T11:51:30.999999999Z07:00 container die 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T15:52:12.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T15:53:45.999999999Z07:00 container die 7805c1d35632 (image=redis:2.8) - 2015-05-12T15:54:03.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - - $ docker events --since '2013-09-03T15:49:29' - 2015-05-12T11:51:30.999999999Z07:00 container die 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T15:52:12.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T15:53:45.999999999Z07:00 container die 7805c1d35632 (image=redis:2.8) - 2015-05-12T15:54:03.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - -This example outputs all events that were generated in the last 3 minutes, -relative to the current time on the client machine: - - $ docker events --since '3m' - 2015-05-12T11:51:30.999999999Z07:00 container die 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T15:52:12.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - 2015-05-12T15:53:45.999999999Z07:00 container die 7805c1d35632 (image=redis:2.8) - 2015-05-12T15:54:03.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - -**Filter events:** - - $ docker events --filter 'event=stop' - 2014-05-10T17:42:14.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - 2014-09-03T17:42:14.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - - $ docker events --filter 'image=ubuntu-1:14.04' - 2014-05-10T17:42:14.999999999Z07:00 container start 4386fb97867d (image=ubuntu-1:14.04) - 2014-05-10T17:42:14.999999999Z07:00 container die 4386fb97867d (image=ubuntu-1:14.04) - 2014-05-10T17:42:14.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - - $ docker events --filter 'container=7805c1d35632' - 2014-05-10T17:42:14.999999999Z07:00 container die 7805c1d35632 (image=redis:2.8) - 2014-09-03T15:49:29.999999999Z07:00 container stop 7805c1d35632 (image= redis:2.8) - - $ docker events --filter 'container=7805c1d35632' --filter 'container=4386fb97867d' - 2014-09-03T15:49:29.999999999Z07:00 container die 4386fb97867d (image=ubuntu-1:14.04) - 2014-05-10T17:42:14.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - 2014-05-10T17:42:14.999999999Z07:00 container die 7805c1d35632 (image=redis:2.8) - 2014-09-03T15:49:29.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - - $ docker events --filter 'container=7805c1d35632' --filter 'event=stop' - 2014-09-03T15:49:29.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - - $ docker events --filter 'container=container_1' --filter 'container=container_2' - 2014-09-03T15:49:29.999999999Z07:00 container die 4386fb97867d (image=ubuntu-1:14.04) - 2014-05-10T17:42:14.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - 2014-05-10T17:42:14.999999999Z07:00 container die 7805c1d35632 (imager=redis:2.8) - 2014-09-03T15:49:29.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - - $ docker events --filter 'type=volume' - 2015-12-23T21:05:28.136212689Z volume create test-event-volume-local (driver=local) - 2015-12-23T21:05:28.383462717Z volume mount test-event-volume-local (read/write=true, container=562fe10671e9273da25eed36cdce26159085ac7ee6707105fd534866340a5025, destination=/foo, driver=local, propagation=rprivate) - 2015-12-23T21:05:28.650314265Z volume unmount test-event-volume-local (container=562fe10671e9273da25eed36cdce26159085ac7ee6707105fd534866340a5025, driver=local) - 2015-12-23T21:05:28.716218405Z volume destroy test-event-volume-local (driver=local) - - $ docker events --filter 'type=network' - 2015-12-23T21:38:24.705709133Z network create 8b111217944ba0ba844a65b13efcd57dc494932ee2527577758f939315ba2c5b (name=test-event-network-local, type=bridge) - 2015-12-23T21:38:25.119625123Z network connect 8b111217944ba0ba844a65b13efcd57dc494932ee2527577758f939315ba2c5b (name=test-event-network-local, container=b4be644031a3d90b400f88ab3d4bdf4dc23adb250e696b6328b85441abe2c54e, type=bridge) - - $ docker events --filter 'type=plugin' (experimental) - 2016-07-25T17:30:14.825557616Z plugin pull ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/sample-volume-plugin:latest) - 2016-07-25T17:30:14.888127370Z plugin enable ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/sample-volume-plugin:latest) - -**Format:** - - $ docker events --filter 'type=container' --format 'Type={{.Type}} Status={{.Status}} ID={{.ID}}' - Type=container Status=create ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - Type=container Status=attach ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - Type=container Status=start ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - Type=container Status=resize ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - Type=container Status=die ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - Type=container Status=destroy ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - -**Format (as JSON Lines):** - - $ docker events --format '{{json .}}' - {"status":"create","id":"196016a57679bf42424484918746a9474cd905dd993c4d0f4.. - {"status":"attach","id":"196016a57679bf42424484918746a9474cd905dd993c4d0f4.. - {"Type":"network","Action":"connect","Actor":{"ID":"1b50a5bf755f6021dfa78e.. - {"status":"start","id":"196016a57679bf42424484918746a9474cd905dd993c4d0f42.. - {"status":"resize","id":"196016a57679bf42424484918746a9474cd905dd993c4d0f4.. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/exec.md b/vendor/github.com/docker/docker/docs/reference/commandline/exec.md deleted file mode 100644 index 38891c9ea..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/exec.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "exec" -description: "The exec command description and usage" -keywords: "command, container, run, execute" ---- - - - -# exec - -```markdown -Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] - -Run a command in a running container - -Options: - -d, --detach Detached mode: run command in the background - --detach-keys Override the key sequence for detaching a container - -e, --env=[] Set environment variables - --help Print usage - -i, --interactive Keep STDIN open even if not attached - --privileged Give extended privileges to the command - -t, --tty Allocate a pseudo-TTY - -u, --user Username or UID (format: [:]) -``` - -The `docker exec` command runs a new command in a running container. - -The command started using `docker exec` only runs while the container's primary -process (`PID 1`) is running, and it is not restarted if the container is -restarted. - -If the container is paused, then the `docker exec` command will fail with an error: - - $ docker pause test - test - $ docker ps - CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES - 1ae3b36715d2 ubuntu:latest "bash" 17 seconds ago Up 16 seconds (Paused) test - $ docker exec test ls - FATA[0000] Error response from daemon: Container test is paused, unpause the container before exec - $ echo $? - 1 - -## Examples - - $ docker run --name ubuntu_bash --rm -i -t ubuntu bash - -This will create a container named `ubuntu_bash` and start a Bash session. - - $ docker exec -d ubuntu_bash touch /tmp/execWorks - -This will create a new file `/tmp/execWorks` inside the running container -`ubuntu_bash`, in the background. - - $ docker exec -it ubuntu_bash bash - -This will create a new Bash session in the container `ubuntu_bash`. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/export.md b/vendor/github.com/docker/docker/docs/reference/commandline/export.md deleted file mode 100644 index 1004fc30c..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/export.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "export" -description: "The export command description and usage" -keywords: "export, file, system, container" ---- - - - -# export - -```markdown -Usage: docker export [OPTIONS] CONTAINER - -Export a container's filesystem as a tar archive - -Options: - --help Print usage - -o, --output string Write to a file, instead of STDOUT -``` - -The `docker export` command does not export the contents of volumes associated -with the container. If a volume is mounted on top of an existing directory in -the container, `docker export` will export the contents of the *underlying* -directory, not the contents of the volume. - -Refer to [Backup, restore, or migrate data -volumes](https://docs.docker.com/engine/tutorials/dockervolumes/#backup-restore-or-migrate-data-volumes) in -the user guide for examples on exporting data in a volume. - -## Examples - - $ docker export red_panda > latest.tar - -Or - - $ docker export --output="latest.tar" red_panda diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/history.md b/vendor/github.com/docker/docker/docs/reference/commandline/history.md deleted file mode 100644 index 00f88db35..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/history.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "history" -description: "The history command description and usage" -keywords: "docker, image, history" ---- - - - -# history - -```markdown -Usage: docker history [OPTIONS] IMAGE - -Show the history of an image - -Options: - --help Print usage - -H, --human Print sizes and dates in human readable format (default true) - --no-trunc Don't truncate output - -q, --quiet Only show numeric IDs -``` - -To see how the `docker:latest` image was built: - - $ docker history docker - IMAGE CREATED CREATED BY SIZE COMMENT - 3e23a5875458 8 days ago /bin/sh -c #(nop) ENV LC_ALL=C.UTF-8 0 B - 8578938dd170 8 days ago /bin/sh -c dpkg-reconfigure locales && loc 1.245 MB - be51b77efb42 8 days ago /bin/sh -c apt-get update && apt-get install 338.3 MB - 4b137612be55 6 weeks ago /bin/sh -c #(nop) ADD jessie.tar.xz in / 121 MB - 750d58736b4b 6 weeks ago /bin/sh -c #(nop) MAINTAINER Tianon Gravi - -# image prune - -```markdown -Usage: docker image prune [OPTIONS] - -Remove unused images - -Options: - -a, --all Remove all unused images, not just dangling ones - -f, --force Do not prompt for confirmation - --help Print usage -``` - -Remove all dangling images. If `-a` is specified, will also remove all images not referenced by any container. - -Example output: - -```bash -$ docker image prune -a -WARNING! This will remove all images without at least one container associated to them. -Are you sure you want to continue? [y/N] y -Deleted Images: -untagged: alpine:latest -untagged: alpine@sha256:3dcdb92d7432d56604d4545cbd324b14e647b313626d99b889d0626de158f73a -deleted: sha256:4e38e38c8ce0b8d9041a9c4fefe786631d1416225e13b0bfe8cfa2321aec4bba -deleted: sha256:4fe15f8d0ae69e169824f25f1d4da3015a48feeeeebb265cd2e328e15c6a869f -untagged: alpine:3.3 -untagged: alpine@sha256:4fa633f4feff6a8f02acfc7424efd5cb3e76686ed3218abf4ca0fa4a2a358423 -untagged: my-jq:latest -deleted: sha256:ae67841be6d008a374eff7c2a974cde3934ffe9536a7dc7ce589585eddd83aff -deleted: sha256:34f6f1261650bc341eb122313372adc4512b4fceddc2a7ecbb84f0958ce5ad65 -deleted: sha256:cf4194e8d8db1cb2d117df33f2c75c0369c3a26d96725efb978cc69e046b87e7 -untagged: my-curl:latest -deleted: sha256:b2789dd875bf427de7f9f6ae001940073b3201409b14aba7e5db71f408b8569e -deleted: sha256:96daac0cb203226438989926fc34dd024f365a9a8616b93e168d303cfe4cb5e9 -deleted: sha256:5cbd97a14241c9cd83250d6b6fc0649833c4a3e84099b968dd4ba403e609945e -deleted: sha256:a0971c4015c1e898c60bf95781c6730a05b5d8a2ae6827f53837e6c9d38efdec -deleted: sha256:d8359ca3b681cc5396a4e790088441673ed3ce90ebc04de388bfcd31a0716b06 -deleted: sha256:83fc9ba8fb70e1da31dfcc3c88d093831dbd4be38b34af998df37e8ac538260c -deleted: sha256:ae7041a4cc625a9c8e6955452f7afe602b401f662671cea3613f08f3d9343b35 -deleted: sha256:35e0f43a37755b832f0bbea91a2360b025ee351d7309dae0d9737bc96b6d0809 -deleted: sha256:0af941dd29f00e4510195dd00b19671bc591e29d1495630e7e0f7c44c1e6a8c0 -deleted: sha256:9fc896fc2013da84f84e45b3096053eb084417b42e6b35ea0cce5a3529705eac -deleted: sha256:47cf20d8c26c46fff71be614d9f54997edacfe8d46d51769706e5aba94b16f2b -deleted: sha256:2c675ee9ed53425e31a13e3390bf3f539bf8637000e4bcfbb85ee03ef4d910a1 - -Total reclaimed space: 16.43 MB -``` - -## Related information - -* [system df](system_df.md) -* [container prune](container_prune.md) -* [volume prune](volume_prune.md) -* [network prune](network_prune.md) -* [system prune](system_prune.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/images.md b/vendor/github.com/docker/docker/docs/reference/commandline/images.md deleted file mode 100644 index 3b9ea1fe1..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/images.md +++ /dev/null @@ -1,304 +0,0 @@ ---- -title: "images" -description: "The images command description and usage" -keywords: "list, docker, images" ---- - - - -# images - -```markdown -Usage: docker images [OPTIONS] [REPOSITORY[:TAG]] - -List images - -Options: - -a, --all Show all images (default hides intermediate images) - --digests Show digests - -f, --filter value Filter output based on conditions provided (default []) - - dangling=(true|false) - - label= or label== - - before=([:tag]||) - - since=([:tag]||) - - reference=(pattern of an image reference) - --format string Pretty-print images using a Go template - --help Print usage - --no-trunc Don't truncate output - -q, --quiet Only show numeric IDs -``` - -The default `docker images` will show all top level -images, their repository and tags, and their size. - -Docker images have intermediate layers that increase reusability, -decrease disk usage, and speed up `docker build` by -allowing each step to be cached. These intermediate layers are not shown -by default. - -The `SIZE` is the cumulative space taken up by the image and all -its parent images. This is also the disk space used by the contents of the -Tar file created when you `docker save` an image. - -An image will be listed more than once if it has multiple repository names -or tags. This single image (identifiable by its matching `IMAGE ID`) -uses up the `SIZE` listed only once. - -### Listing the most recently created images - - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - 77af4d6b9913 19 hours ago 1.089 GB - committ latest b6fa739cedf5 19 hours ago 1.089 GB - 78a85c484f71 19 hours ago 1.089 GB - docker latest 30557a29d5ab 20 hours ago 1.089 GB - 5ed6274db6ce 24 hours ago 1.089 GB - postgres 9 746b819f315e 4 days ago 213.4 MB - postgres 9.3 746b819f315e 4 days ago 213.4 MB - postgres 9.3.5 746b819f315e 4 days ago 213.4 MB - postgres latest 746b819f315e 4 days ago 213.4 MB - -### Listing images by name and tag - -The `docker images` command takes an optional `[REPOSITORY[:TAG]]` argument -that restricts the list to images that match the argument. If you specify -`REPOSITORY`but no `TAG`, the `docker images` command lists all images in the -given repository. - -For example, to list all images in the "java" repository, run this command : - - $ docker images java - REPOSITORY TAG IMAGE ID CREATED SIZE - java 8 308e519aac60 6 days ago 824.5 MB - java 7 493d82594c15 3 months ago 656.3 MB - java latest 2711b1d6f3aa 5 months ago 603.9 MB - -The `[REPOSITORY[:TAG]]` value must be an "exact match". This means that, for example, -`docker images jav` does not match the image `java`. - -If both `REPOSITORY` and `TAG` are provided, only images matching that -repository and tag are listed. To find all local images in the "java" -repository with tag "8" you can use: - - $ docker images java:8 - REPOSITORY TAG IMAGE ID CREATED SIZE - java 8 308e519aac60 6 days ago 824.5 MB - -If nothing matches `REPOSITORY[:TAG]`, the list is empty. - - $ docker images java:0 - REPOSITORY TAG IMAGE ID CREATED SIZE - -## Listing the full length image IDs - - $ docker images --no-trunc - REPOSITORY TAG IMAGE ID CREATED SIZE - sha256:77af4d6b9913e693e8d0b4b294fa62ade6054e6b2f1ffb617ac955dd63fb0182 19 hours ago 1.089 GB - committest latest sha256:b6fa739cedf5ea12a620a439402b6004d057da800f91c7524b5086a5e4749c9f 19 hours ago 1.089 GB - sha256:78a85c484f71509adeaace20e72e941f6bdd2b25b4c75da8693efd9f61a37921 19 hours ago 1.089 GB - docker latest sha256:30557a29d5abc51e5f1d5b472e79b7e296f595abcf19fe6b9199dbbc809c6ff4 20 hours ago 1.089 GB - sha256:0124422dd9f9cf7ef15c0617cda3931ee68346455441d66ab8bdc5b05e9fdce5 20 hours ago 1.089 GB - sha256:18ad6fad340262ac2a636efd98a6d1f0ea775ae3d45240d3418466495a19a81b 22 hours ago 1.082 GB - sha256:f9f1e26352f0a3ba6a0ff68167559f64f3e21ff7ada60366e2d44a04befd1d3a 23 hours ago 1.089 GB - tryout latest sha256:2629d1fa0b81b222fca63371ca16cbf6a0772d07759ff80e8d1369b926940074 23 hours ago 131.5 MB - sha256:5ed6274db6ceb2397844896966ea239290555e74ef307030ebb01ff91b1914df 24 hours ago 1.089 GB - -## Listing image digests - -Images that use the v2 or later format have a content-addressable identifier -called a `digest`. As long as the input used to generate the image is -unchanged, the digest value is predictable. To list image digest values, use -the `--digests` flag: - - $ docker images --digests - REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE - localhost:5000/test/busybox sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 4986bf8c1536 9 weeks ago 2.43 MB - -When pushing or pulling to a 2.0 registry, the `push` or `pull` command -output includes the image digest. You can `pull` using a digest value. You can -also reference by digest in `create`, `run`, and `rmi` commands, as well as the -`FROM` image reference in a Dockerfile. - -## Filtering - -The filtering flag (`-f` or `--filter`) format is of "key=value". If there is more -than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "bif=baz"`) - -The currently supported filters are: - -* dangling (boolean - true or false) -* label (`label=` or `label==`) -* before (`[:]`, `` or ``) - filter images created before given id or references -* since (`[:]`, `` or ``) - filter images created since given id or references - -##### Untagged images (dangling) - - $ docker images --filter "dangling=true" - - REPOSITORY TAG IMAGE ID CREATED SIZE - 8abc22fbb042 4 weeks ago 0 B - 48e5f45168b9 4 weeks ago 2.489 MB - bf747efa0e2f 4 weeks ago 0 B - 980fe10e5736 12 weeks ago 101.4 MB - dea752e4e117 12 weeks ago 101.4 MB - 511136ea3c5a 8 months ago 0 B - -This will display untagged images, that are the leaves of the images tree (not -intermediary layers). These images occur when a new build of an image takes the -`repo:tag` away from the image ID, leaving it as `:` or untagged. -A warning will be issued if trying to remove an image when a container is presently -using it. By having this flag it allows for batch cleanup. - -Ready for use by `docker rmi ...`, like: - - $ docker rmi $(docker images -f "dangling=true" -q) - - 8abc22fbb042 - 48e5f45168b9 - bf747efa0e2f - 980fe10e5736 - dea752e4e117 - 511136ea3c5a - -NOTE: Docker will warn you if any containers exist that are using these untagged images. - - -##### Labeled images - -The `label` filter matches images based on the presence of a `label` alone or a `label` and a -value. - -The following filter matches images with the `com.example.version` label regardless of its value. - - $ docker images --filter "label=com.example.version" - - REPOSITORY TAG IMAGE ID CREATED SIZE - match-me-1 latest eeae25ada2aa About a minute ago 188.3 MB - match-me-2 latest dea752e4e117 About a minute ago 188.3 MB - -The following filter matches images with the `com.example.version` label with the `1.0` value. - - $ docker images --filter "label=com.example.version=1.0" - REPOSITORY TAG IMAGE ID CREATED SIZE - match-me latest 511136ea3c5a About a minute ago 188.3 MB - -In this example, with the `0.1` value, it returns an empty set because no matches were found. - - $ docker images --filter "label=com.example.version=0.1" - REPOSITORY TAG IMAGE ID CREATED SIZE - -#### Before - -The `before` filter shows only images created before the image with -given id or reference. For example, having these images: - - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - image1 latest eeae25ada2aa 4 minutes ago 188.3 MB - image2 latest dea752e4e117 9 minutes ago 188.3 MB - image3 latest 511136ea3c5a 25 minutes ago 188.3 MB - -Filtering with `before` would give: - - $ docker images --filter "before=image1" - REPOSITORY TAG IMAGE ID CREATED SIZE - image2 latest dea752e4e117 9 minutes ago 188.3 MB - image3 latest 511136ea3c5a 25 minutes ago 188.3 MB - -#### Since - -The `since` filter shows only images created after the image with -given id or reference. For example, having these images: - - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - image1 latest eeae25ada2aa 4 minutes ago 188.3 MB - image2 latest dea752e4e117 9 minutes ago 188.3 MB - image3 latest 511136ea3c5a 25 minutes ago 188.3 MB - -Filtering with `since` would give: - - $ docker images --filter "since=image3" - REPOSITORY TAG IMAGE ID CREATED SIZE - image1 latest eeae25ada2aa 4 minutes ago 188.3 MB - image2 latest dea752e4e117 9 minutes ago 188.3 MB - -#### Reference - -The `reference` filter shows only images whose reference matches -the specified pattern. - - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - busybox latest e02e811dd08f 5 weeks ago 1.09 MB - busybox uclibc e02e811dd08f 5 weeks ago 1.09 MB - busybox musl 733eb3059dce 5 weeks ago 1.21 MB - busybox glibc 21c16b6787c6 5 weeks ago 4.19 MB - -Filtering with `reference` would give: - - $ docker images --filter=reference='busy*:*libc' - REPOSITORY TAG IMAGE ID CREATED SIZE - busybox uclibc e02e811dd08f 5 weeks ago 1.09 MB - busybox glibc 21c16b6787c6 5 weeks ago 4.19 MB - -## Formatting - -The formatting option (`--format`) will pretty print container output -using a Go template. - -Valid placeholders for the Go template are listed below: - -Placeholder | Description ----- | ---- -`.ID` | Image ID -`.Repository` | Image repository -`.Tag` | Image tag -`.Digest` | Image digest -`.CreatedSince` | Elapsed time since the image was created -`.CreatedAt` | Time when the image was created -`.Size` | Image disk size - -When using the `--format` option, the `image` command will either -output the data exactly as the template declares or, when using the -`table` directive, will include column headers as well. - -The following example uses a template without headers and outputs the -`ID` and `Repository` entries separated by a colon for all images: - - {% raw %} - $ docker images --format "{{.ID}}: {{.Repository}}" - 77af4d6b9913: - b6fa739cedf5: committ - 78a85c484f71: - 30557a29d5ab: docker - 5ed6274db6ce: - 746b819f315e: postgres - 746b819f315e: postgres - 746b819f315e: postgres - 746b819f315e: postgres - {% endraw %} - -To list all images with their repository and tag in a table format you -can use: - - {% raw %} - $ docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}" - IMAGE ID REPOSITORY TAG - 77af4d6b9913 - b6fa739cedf5 committ latest - 78a85c484f71 - 30557a29d5ab docker latest - 5ed6274db6ce - 746b819f315e postgres 9 - 746b819f315e postgres 9.3 - 746b819f315e postgres 9.3.5 - 746b819f315e postgres latest - {% endraw %} diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/import.md b/vendor/github.com/docker/docker/docs/reference/commandline/import.md deleted file mode 100644 index 20e90a61f..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/import.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "import" -description: "The import command description and usage" -keywords: "import, file, system, container" ---- - - - -# import - -```markdown -Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] - -Import the contents from a tarball to create a filesystem image - -Options: - -c, --change value Apply Dockerfile instruction to the created image (default []) - --help Print usage - -m, --message string Set commit message for imported image -``` - -You can specify a `URL` or `-` (dash) to take data directly from `STDIN`. The -`URL` can point to an archive (.tar, .tar.gz, .tgz, .bzip, .tar.xz, or .txz) -containing a filesystem or to an individual file on the Docker host. If you -specify an archive, Docker untars it in the container relative to the `/` -(root). If you specify an individual file, you must specify the full path within -the host. To import from a remote location, specify a `URI` that begins with the -`http://` or `https://` protocol. - -The `--change` option will apply `Dockerfile` instructions to the image -that is created. -Supported `Dockerfile` instructions: -`CMD`|`ENTRYPOINT`|`ENV`|`EXPOSE`|`ONBUILD`|`USER`|`VOLUME`|`WORKDIR` - -## Examples - -**Import from a remote location:** - -This will create a new untagged image. - - $ docker import http://example.com/exampleimage.tgz - -**Import from a local file:** - -Import to docker via pipe and `STDIN`. - - $ cat exampleimage.tgz | docker import - exampleimagelocal:new - -Import with a commit message. - - $ cat exampleimage.tgz | docker import --message "New image imported from tarball" - exampleimagelocal:new - -Import to docker from a local archive. - - $ docker import /path/to/exampleimage.tgz - -**Import from a local directory:** - - $ sudo tar -c . | docker import - exampleimagedir - -**Import from a local directory with new configurations:** - - $ sudo tar -c . | docker import --change "ENV DEBUG true" - exampleimagedir - -Note the `sudo` in this example – you must preserve -the ownership of the files (especially root ownership) during the -archiving with tar. If you are not root (or the sudo command) when you -tar, then the ownerships might not get preserved. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/index.md b/vendor/github.com/docker/docker/docs/reference/commandline/index.md deleted file mode 100644 index 952fa09df..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/index.md +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: "Docker commands" -description: "Docker's CLI command description and usage" -keywords: "Docker, Docker documentation, CLI, command line" -identifier: "smn_cli_guide" ---- - - - -# The Docker commands - -This section contains reference information on using Docker's command line -client. Each command has a reference page along with samples. If you are -unfamiliar with the command line, you should start by reading about how to [Use -the Docker command line](cli.md). - -You start the Docker daemon with the command line. How you start the daemon -affects your Docker containers. For that reason you should also make sure to -read the [`dockerd`](dockerd.md) reference page. - -### Docker management commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [dockerd](dockerd.md) | Launch the Docker daemon | -| [info](info.md) | Display system-wide information | -| [inspect](inspect.md)| Return low-level information on a container or image | -| [version](version.md) | Show the Docker version information | - - -### Image commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [build](build.md) | Build an image from a Dockerfile | -| [commit](commit.md) | Create a new image from a container's changes | -| [history](history.md) | Show the history of an image | -| [images](images.md) | List images | -| [import](import.md) | Import the contents from a tarball to create a filesystem image | -| [load](load.md) | Load an image from a tar archive or STDIN | -| [rmi](rmi.md) | Remove one or more images | -| [save](save.md) | Save images to a tar archive | -| [tag](tag.md) | Tag an image into a repository | - -### Container commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [attach](attach.md) | Attach to a running container | -| [cp](cp.md) | Copy files/folders from a container to a HOSTDIR or to STDOUT | -| [create](create.md) | Create a new container | -| [diff](diff.md) | Inspect changes on a container's filesystem | -| [events](events.md) | Get real time events from the server | -| [exec](exec.md) | Run a command in a running container | -| [export](export.md) | Export a container's filesystem as a tar archive | -| [kill](kill.md) | Kill a running container | -| [logs](logs.md) | Fetch the logs of a container | -| [pause](pause.md) | Pause all processes within a container | -| [port](port.md) | List port mappings or a specific mapping for the container | -| [ps](ps.md) | List containers | -| [rename](rename.md) | Rename a container | -| [restart](restart.md) | Restart a running container | -| [rm](rm.md) | Remove one or more containers | -| [run](run.md) | Run a command in a new container | -| [start](start.md) | Start one or more stopped containers | -| [stats](stats.md) | Display a live stream of container(s) resource usage statistics | -| [stop](stop.md) | Stop a running container | -| [top](top.md) | Display the running processes of a container | -| [unpause](unpause.md) | Unpause all processes within a container | -| [update](update.md) | Update configuration of one or more containers | -| [wait](wait.md) | Block until a container stops, then print its exit code | - -### Hub and registry commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [login](login.md) | Register or log in to a Docker registry | -| [logout](logout.md) | Log out from a Docker registry | -| [pull](pull.md) | Pull an image or a repository from a Docker registry | -| [push](push.md) | Push an image or a repository to a Docker registry | -| [search](search.md) | Search the Docker Hub for images | - -### Network and connectivity commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [network connect](network_connect.md) | Connect a container to a network | -| [network create](network_create.md) | Create a new network | -| [network disconnect](network_disconnect.md) | Disconnect a container from a network | -| [network inspect](network_inspect.md) | Display information about a network | -| [network ls](network_ls.md) | Lists all the networks the Engine `daemon` knows about | -| [network rm](network_rm.md) | Removes one or more networks | - - -### Shared data volume commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [volume create](volume_create.md) | Creates a new volume where containers can consume and store data | -| [volume inspect](volume_inspect.md) | Display information about a volume | -| [volume ls](volume_ls.md) | Lists all the volumes Docker knows about | -| [volume prune](volume_prune.md) | Remove all unused volumes | -| [volume rm](volume_rm.md) | Remove one or more volumes | - - -### Swarm node commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [node promote](node_promote.md) | Promote a node that is pending a promotion to manager | -| [node demote](node_demote.md) | Demotes an existing manager so that it is no longer a manager | -| [node inspect](node_inspect.md) | Inspect a node in the swarm | -| [node update](node_update.md) | Update attributes for a node | -| [node ps](node_ps.md) | List tasks running on one or more nodes | -| [node ls](node_ls.md) | List nodes in the swarm | -| [node rm](node_rm.md) | Remove one or more nodes from the swarm | - -### Swarm swarm commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [swarm init](swarm_init.md) | Initialize a swarm | -| [swarm join](swarm_join.md) | Join a swarm as a manager node or worker node | -| [swarm leave](swarm_leave.md) | Remove the current node from the swarm | -| [swarm update](swarm_update.md) | Update attributes of a swarm | -| [swarm join-token](swarm_join_token.md) | Display or rotate join tokens | - -### Swarm service commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [service create](service_create.md) | Create a new service | -| [service inspect](service_inspect.md) | Inspect a service | -| [service ls](service_ls.md) | List services in the swarm | -| [service rm](service_rm.md) | Remove a service from the swarm | -| [service scale](service_scale.md) | Set the number of replicas for the desired state of the service | -| [service ps](service_ps.md) | List the tasks of a service | -| [service update](service_update.md) | Update the attributes of a service | - -### Swarm secret commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [secret create](secret_create.md) | Create a secret from a file or STDIN as content | -| [secret inspect](service_inspect.md) | Inspect the specified secret | -| [secret ls](secret_ls.md) | List secrets in the swarm | -| [secret rm](secret_rm.md) | Remove the specified secrets from the swarm | - -### Swarm stack commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [stack deploy](stack_deploy.md) | Deploy a new stack or update an existing stack | -| [stack ls](stack_ls.md) | List stacks in the swarm | -| [stack ps](stack_ps.md) | List the tasks in the stack | -| [stack rm](stack_rm.md) | Remove the stack from the swarm | -| [stack services](stack_services.md) | List the services in the stack | - -### Plugin commands - -| Command | Description | -|:--------|:-------------------------------------------------------------------| -| [plugin create](plugin_create.md) | Create a plugin from a rootfs and configuration | -| [plugin disable](plugin_disable.md) | Disable a plugin | -| [plugin enbale](plugin_enable.md) | Enable a plugin | -| [plugin inspect](plugin_inspect.md) | Display detailed information on a plugin | -| [plugin install](plugin_install.md) | Install a plugin | -| [plugin ls](plugin_ls.md) | List plugins | -| [plugin push](plugin_push.md) | Push a plugin to a registry | -| [plugin rm](plugin_rm.md) | Remove a plugin | -| [plugin set](plugin_set.md) | Change settings for a plugin | diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/info.md b/vendor/github.com/docker/docker/docs/reference/commandline/info.md deleted file mode 100644 index 50a084fcb..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/info.md +++ /dev/null @@ -1,224 +0,0 @@ ---- -title: "info" -description: "The info command description and usage" -keywords: "display, docker, information" ---- - - - -# info - -```markdown -Usage: docker info [OPTIONS] - -Display system-wide information - -Options: - -f, --format string Format the output using the given Go template - --help Print usage -``` - -This command displays system wide information regarding the Docker installation. -Information displayed includes the kernel version, number of containers and images. -The number of images shown is the number of unique images. The same image tagged -under different names is counted only once. - -If a format is specified, the given template will be executed instead of the -default format. Go's [text/template](http://golang.org/pkg/text/template/) package -describes all the details of the format. - -Depending on the storage driver in use, additional information can be shown, such -as pool name, data file, metadata file, data space used, total data space, metadata -space used, and total metadata space. - -The data file is where the images are stored and the metadata file is where the -meta data regarding those images are stored. When run for the first time Docker -allocates a certain amount of data space and meta data space from the space -available on the volume where `/var/lib/docker` is mounted. - -# Examples - -## Display Docker system information - -Here is a sample output for a daemon running on Ubuntu, using the overlay2 -storage driver and a node that is part of a 2-node swarm: - - $ docker -D info - Containers: 14 - Running: 3 - Paused: 1 - Stopped: 10 - Images: 52 - Server Version: 1.13.0 - Storage Driver: overlay2 - Backing Filesystem: extfs - Supports d_type: true - Native Overlay Diff: false - Logging Driver: json-file - Cgroup Driver: cgroupfs - Plugins: - Volume: local - Network: bridge host macvlan null overlay - Swarm: active - NodeID: rdjq45w1op418waxlairloqbm - Is Manager: true - ClusterID: te8kdyw33n36fqiz74bfjeixd - Managers: 1 - Nodes: 2 - Orchestration: - Task History Retention Limit: 5 - Raft: - Snapshot Interval: 10000 - Number of Old Snapshots to Retain: 0 - Heartbeat Tick: 1 - Election Tick: 3 - Dispatcher: - Heartbeat Period: 5 seconds - CA Configuration: - Expiry Duration: 3 months - Node Address: 172.16.66.128 172.16.66.129 - Manager Addresses: - 172.16.66.128:2477 - Runtimes: runc - Default Runtime: runc - Init Binary: docker-init - containerd version: 8517738ba4b82aff5662c97ca4627e7e4d03b531 - runc version: ac031b5bf1cc92239461125f4c1ffb760522bbf2 - init version: N/A (expected: v0.13.0) - Security Options: - apparmor - seccomp - Profile: default - Kernel Version: 4.4.0-31-generic - Operating System: Ubuntu 16.04.1 LTS - OSType: linux - Architecture: x86_64 - CPUs: 2 - Total Memory: 1.937 GiB - Name: ubuntu - ID: H52R:7ZR6:EIIA:76JG:ORIY:BVKF:GSFU:HNPG:B5MK:APSC:SZ3Q:N326 - Docker Root Dir: /var/lib/docker - Debug Mode (client): true - Debug Mode (server): true - File Descriptors: 30 - Goroutines: 123 - System Time: 2016-11-12T17:24:37.955404361-08:00 - EventsListeners: 0 - Http Proxy: http://test:test@proxy.example.com:8080 - Https Proxy: https://test:test@proxy.example.com:8080 - No Proxy: localhost,127.0.0.1,docker-registry.somecorporation.com - Registry: https://index.docker.io/v1/ - WARNING: No swap limit support - Labels: - storage=ssd - staging=true - Experimental: false - Insecure Registries: - 127.0.0.0/8 - Registry Mirrors: - http://192.168.1.2/ - http://registry-mirror.example.com:5000/ - Live Restore Enabled: false - -The global `-D` option tells all `docker` commands to output debug information. - -The example below shows the output for a daemon running on Red Hat Enterprise Linux, -using the devicemapper storage driver. As can be seen in the output, additional -information about the devicemapper storage driver is shown: - - $ docker info - Containers: 14 - Running: 3 - Paused: 1 - Stopped: 10 - Images: 52 - Server Version: 1.10.3 - Storage Driver: devicemapper - Pool Name: docker-202:2-25583803-pool - Pool Blocksize: 65.54 kB - Base Device Size: 10.74 GB - Backing Filesystem: xfs - Data file: /dev/loop0 - Metadata file: /dev/loop1 - Data Space Used: 1.68 GB - Data Space Total: 107.4 GB - Data Space Available: 7.548 GB - Metadata Space Used: 2.322 MB - Metadata Space Total: 2.147 GB - Metadata Space Available: 2.145 GB - Udev Sync Supported: true - Deferred Removal Enabled: false - Deferred Deletion Enabled: false - Deferred Deleted Device Count: 0 - Data loop file: /var/lib/docker/devicemapper/devicemapper/data - Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata - Library Version: 1.02.107-RHEL7 (2015-12-01) - Execution Driver: native-0.2 - Logging Driver: json-file - Plugins: - Volume: local - Network: null host bridge - Kernel Version: 3.10.0-327.el7.x86_64 - Operating System: Red Hat Enterprise Linux Server 7.2 (Maipo) - OSType: linux - Architecture: x86_64 - CPUs: 1 - Total Memory: 991.7 MiB - Name: ip-172-30-0-91.ec2.internal - ID: I54V:OLXT:HVMM:TPKO:JPHQ:CQCD:JNLC:O3BZ:4ZVJ:43XJ:PFHZ:6N2S - Docker Root Dir: /var/lib/docker - Debug mode (client): false - Debug mode (server): false - Username: gordontheturtle - Registry: https://index.docker.io/v1/ - Insecure registries: - myinsecurehost:5000 - 127.0.0.0/8 - -You can also specify the output format: - - $ docker info --format '{{json .}}' - {"ID":"I54V:OLXT:HVMM:TPKO:JPHQ:CQCD:JNLC:O3BZ:4ZVJ:43XJ:PFHZ:6N2S","Containers":14, ...} - -Here is a sample output for a daemon running on Windows Server 2016: - - E:\docker>docker info - Containers: 1 - Running: 0 - Paused: 0 - Stopped: 1 - Images: 17 - Server Version: 1.13.0 - Storage Driver: windowsfilter - Windows: - Logging Driver: json-file - Plugins: - Volume: local - Network: nat null overlay - Swarm: inactive - Default Isolation: process - Kernel Version: 10.0 14393 (14393.206.amd64fre.rs1_release.160912-1937) - Operating System: Windows Server 2016 Datacenter - OSType: windows - Architecture: x86_64 - CPUs: 8 - Total Memory: 3.999 GiB - Name: WIN-V0V70C0LU5P - ID: NYMS:B5VK:UMSL:FVDZ:EWB5:FKVK:LPFL:FJMQ:H6FT:BZJ6:L2TD:XH62 - Docker Root Dir: C:\control - Debug Mode (client): false - Debug Mode (server): false - Registry: https://index.docker.io/v1/ - Insecure Registries: - 127.0.0.0/8 - Registry Mirrors: - http://192.168.1.2/ - http://registry-mirror.example.com:5000/ - Live Restore Enabled: false diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/inspect.md b/vendor/github.com/docker/docker/docs/reference/commandline/inspect.md deleted file mode 100644 index 7a0c3a087..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/inspect.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: "inspect" -description: "The inspect command description and usage" -keywords: "inspect, container, json" ---- - - - -# inspect - -```markdown -Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...] - -Return low-level information on Docker object(s) (e.g. container, image, volume, -network, node, service, or task) identified by name or ID - -Options: - -f, --format Format the output using the given Go template - --help Print usage - -s, --size Display total file sizes if the type is container - --type Return JSON for specified type -``` - -By default, this will render all results in a JSON array. If the container and -image have the same name, this will return container JSON for unspecified type. -If a format is specified, the given template will be executed for each result. - -Go's [text/template](http://golang.org/pkg/text/template/) package -describes all the details of the format. - -## Examples - -**Get an instance's IP address:** - -For the most part, you can pick out any field from the JSON in a fairly -straightforward manner. - - {% raw %} - $ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $INSTANCE_ID - {% endraw %} - -**Get an instance's MAC address:** - -For the most part, you can pick out any field from the JSON in a fairly -straightforward manner. - - {% raw %} - $ docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $INSTANCE_ID - {% endraw %} - -**Get an instance's log path:** - - {% raw %} - $ docker inspect --format='{{.LogPath}}' $INSTANCE_ID - {% endraw %} - -**Get a Task's image name:** - - {% raw %} - $ docker inspect --format='{{.Container.Spec.Image}}' $INSTANCE_ID - {% endraw %} - -**List all port bindings:** - -One can loop over arrays and maps in the results to produce simple text -output: - - {% raw %} - $ docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID - {% endraw %} - -**Find a specific port mapping:** - -The `.Field` syntax doesn't work when the field name begins with a -number, but the template language's `index` function does. The -`.NetworkSettings.Ports` section contains a map of the internal port -mappings to a list of external address/port objects. To grab just the -numeric public port, you use `index` to find the specific port map, and -then `index` 0 contains the first object inside of that. Then we ask for -the `HostPort` field to get the public address. - - {% raw %} - $ docker inspect --format='{{(index (index .NetworkSettings.Ports "8787/tcp") 0).HostPort}}' $INSTANCE_ID - {% endraw %} - -**Get a subsection in JSON format:** - -If you request a field which is itself a structure containing other -fields, by default you get a Go-style dump of the inner values. -Docker adds a template function, `json`, which can be applied to get -results in JSON format. - - {% raw %} - $ docker inspect --format='{{json .Config}}' $INSTANCE_ID - {% endraw %} diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/kill.md b/vendor/github.com/docker/docker/docs/reference/commandline/kill.md deleted file mode 100644 index 32fde3d8b..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/kill.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: "kill" -description: "The kill command description and usage" -keywords: "container, kill, signal" ---- - - - -# kill - -```markdown -Usage: docker kill [OPTIONS] CONTAINER [CONTAINER...] - -Kill one or more running containers - -Options: - --help Print usage - -s, --signal string Signal to send to the container (default "KILL") -``` - -The main process inside the container will be sent `SIGKILL`, or any -signal specified with option `--signal`. - -> **Note:** -> `ENTRYPOINT` and `CMD` in the *shell* form run as a subcommand of `/bin/sh -c`, -> which does not pass signals. This means that the executable is not the container’s PID 1 -> and does not receive Unix signals. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/load.md b/vendor/github.com/docker/docker/docs/reference/commandline/load.md deleted file mode 100644 index 04a5bc7e5..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/load.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "load" -description: "The load command description and usage" -keywords: "stdin, tarred, repository" ---- - - - -# load - -```markdown -Usage: docker load [OPTIONS] - -Load an image from a tar archive or STDIN - -Options: - --help Print usage - -i, --input string Read from tar archive file, instead of STDIN. - The tarball may be compressed with gzip, bzip, or xz - -q, --quiet Suppress the load output but still outputs the imported images -``` - -Loads a tarred repository from a file or the standard input stream. -Restores both images and tags. - - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - $ docker load < busybox.tar.gz - # […] - Loaded image: busybox:latest - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - busybox latest 769b9341d937 7 weeks ago 2.489 MB - $ docker load --input fedora.tar - # […] - Loaded image: fedora:rawhide - # […] - Loaded image: fedora:20 - # […] - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - busybox latest 769b9341d937 7 weeks ago 2.489 MB - fedora rawhide 0d20aec6529d 7 weeks ago 387 MB - fedora 20 58394af37342 7 weeks ago 385.5 MB - fedora heisenbug 58394af37342 7 weeks ago 385.5 MB - fedora latest 58394af37342 7 weeks ago 385.5 MB diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/login.md b/vendor/github.com/docker/docker/docs/reference/commandline/login.md deleted file mode 100644 index a0f35fd4d..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/login.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: "login" -description: "The login command description and usage" -keywords: "registry, login, image" ---- - - - -# login - -```markdown -Usage: docker login [OPTIONS] [SERVER] - -Log in to a Docker registry. -If no server is specified, the default is defined by the daemon. - -Options: - --help Print usage - -p, --password string Password - -u, --username string Username -``` - -If you want to login to a self-hosted registry you can specify this by -adding the server name. - - example: - $ docker login localhost:8080 - - -`docker login` requires user to use `sudo` or be `root`, except when: - -1. connecting to a remote daemon, such as a `docker-machine` provisioned `docker engine`. -2. user is added to the `docker` group. This will impact the security of your system; the `docker` group is `root` equivalent. See [Docker Daemon Attack Surface](https://docs.docker.com/security/security/#docker-daemon-attack-surface) for details. - -You can log into any public or private repository for which you have -credentials. When you log in, the command stores encoded credentials in -`$HOME/.docker/config.json` on Linux or `%USERPROFILE%/.docker/config.json` on Windows. - -## Credentials store - -The Docker Engine can keep user credentials in an external credentials store, -such as the native keychain of the operating system. Using an external store -is more secure than storing credentials in the Docker configuration file. - -To use a credentials store, you need an external helper program to interact -with a specific keychain or external store. Docker requires the helper -program to be in the client's host `$PATH`. - -This is the list of currently available credentials helpers and where -you can download them from: - -- D-Bus Secret Service: https://github.com/docker/docker-credential-helpers/releases -- Apple macOS keychain: https://github.com/docker/docker-credential-helpers/releases -- Microsoft Windows Credential Manager: https://github.com/docker/docker-credential-helpers/releases - -### Usage - -You need to specify the credentials store in `$HOME/.docker/config.json` -to tell the docker engine to use it: - -```json -{ - "credsStore": "osxkeychain" -} -``` - -If you are currently logged in, run `docker logout` to remove -the credentials from the file and run `docker login` again. - -### Protocol - -Credential helpers can be any program or script that follows a very simple protocol. -This protocol is heavily inspired by Git, but it differs in the information shared. - -The helpers always use the first argument in the command to identify the action. -There are only three possible values for that argument: `store`, `get`, and `erase`. - -The `store` command takes a JSON payload from the standard input. That payload carries -the server address, to identify the credential, the user name, and either a password -or an identity token. - -```json -{ - "ServerURL": "https://index.docker.io/v1", - "Username": "david", - "Secret": "passw0rd1" -} -``` - -If the secret being stored is an identity token, the Username should be set to -``. - -The `store` command can write error messages to `STDOUT` that the docker engine -will show if there was an issue. - -The `get` command takes a string payload from the standard input. That payload carries -the server address that the docker engine needs credentials for. This is -an example of that payload: `https://index.docker.io/v1`. - -The `get` command writes a JSON payload to `STDOUT`. Docker reads the user name -and password from this payload: - -```json -{ - "Username": "david", - "Secret": "passw0rd1" -} -``` - -The `erase` command takes a string payload from `STDIN`. That payload carries -the server address that the docker engine wants to remove credentials for. This is -an example of that payload: `https://index.docker.io/v1`. - -The `erase` command can write error messages to `STDOUT` that the docker engine -will show if there was an issue. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/logout.md b/vendor/github.com/docker/docker/docs/reference/commandline/logout.md deleted file mode 100644 index 1635e2244..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/logout.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: "logout" -description: "The logout command description and usage" -keywords: "logout, docker, registry" ---- - - - -# logout - -```markdown -Usage: docker logout [SERVER] - -Log out from a Docker registry. -If no server is specified, the default is defined by the daemon. - -Options: - --help Print usage -``` - -For example: - - $ docker logout localhost:8080 diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/logs.md b/vendor/github.com/docker/docker/docs/reference/commandline/logs.md deleted file mode 100644 index 891e10b55..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/logs.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "logs" -description: "The logs command description and usage" -keywords: "logs, retrieve, docker" ---- - - - -# logs - -```markdown -Usage: docker logs [OPTIONS] CONTAINER - -Fetch the logs of a container - -Options: - --details Show extra details provided to logs - -f, --follow Follow log output - --help Print usage - --since string Show logs since timestamp - --tail string Number of lines to show from the end of the logs (default "all") - -t, --timestamps Show timestamps -``` - -The `docker logs` command batch-retrieves logs present at the time of execution. - -> **Note**: this command is only functional for containers that are started with -> the `json-file` or `journald` logging driver. - -For more information about selecting and configuring logging drivers, refer to -[Configure logging drivers](https://docs.docker.com/engine/admin/logging/overview/). - -The `docker logs --follow` command will continue streaming the new output from -the container's `STDOUT` and `STDERR`. - -Passing a negative number or a non-integer to `--tail` is invalid and the -value is set to `all` in that case. - -The `docker logs --timestamps` command will add an [RFC3339Nano timestamp](https://golang.org/pkg/time/#pkg-constants) -, for example `2014-09-16T06:17:46.000000000Z`, to each -log entry. To ensure that the timestamps are aligned the -nano-second part of the timestamp will be padded with zero when necessary. - -The `docker logs --details` command will add on extra attributes, such as -environment variables and labels, provided to `--log-opt` when creating the -container. - -The `--since` option shows only the container logs generated after -a given date. You can specify the date as an RFC 3339 date, a UNIX -timestamp, or a Go duration string (e.g. `1m30s`, `3h`). Besides RFC3339 date -format you may also use RFC3339Nano, `2006-01-02T15:04:05`, -`2006-01-02T15:04:05.999999999`, `2006-01-02Z07:00`, and `2006-01-02`. The local -timezone on the client will be used if you do not provide either a `Z` or a -`+-00:00` timezone offset at the end of the timestamp. When providing Unix -timestamps enter seconds[.nanoseconds], where seconds is the number of seconds -that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap -seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a -fraction of a second no more than nine digits long. You can combine the -`--since` option with either or both of the `--follow` or `--tail` options. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/menu.md b/vendor/github.com/docker/docker/docs/reference/commandline/menu.md deleted file mode 100644 index d58afacd7..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/menu.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: "Command line reference" -description: "Docker's CLI command description and usage" -keywords: "Docker, Docker documentation, CLI, command line" -identifier: "smn_cli" ---- - - - -# The Docker commands - -This section contains reference information on using Docker's command line -client. Each command has a reference page along with samples. If you are -unfamiliar with the command line, you should start by reading about how to -[Use the Docker command line](cli.md). - -You start the Docker daemon with the command line. How you start the daemon -affects your Docker containers. For that reason you should also make sure to -read the [`dockerd`](dockerd.md) reference page. - -For a list of Docker commands see [Command line reference guide](index.md). diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/network_connect.md b/vendor/github.com/docker/docker/docs/reference/commandline/network_connect.md deleted file mode 100644 index 52459a5d5..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/network_connect.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: "network connect" -description: "The network connect command description and usage" -keywords: "network, connect, user-defined" ---- - - - -# network connect - -```markdown -Usage: docker network connect [OPTIONS] NETWORK CONTAINER - -Connect a container to a network - -Options: - --alias value Add network-scoped alias for the container (default []) - --help Print usage - --ip string IP Address - --ip6 string IPv6 Address - --link value Add link to another container (default []) - --link-local-ip value Add a link-local address for the container (default []) -``` - -Connects a container to a network. You can connect a container by name -or by ID. Once connected, the container can communicate with other containers in -the same network. - -```bash -$ docker network connect multi-host-network container1 -``` - -You can also use the `docker run --network=` option to start a container and immediately connect it to a network. - -```bash -$ docker run -itd --network=multi-host-network busybox -``` - -You can specify the IP address you want to be assigned to the container's interface. - -```bash -$ docker network connect --ip 10.10.36.122 multi-host-network container2 -``` - -You can use `--link` option to link another container with a preferred alias - -```bash -$ docker network connect --link container1:c1 multi-host-network container2 -``` - -`--alias` option can be used to resolve the container by another name in the network -being connected to. - -```bash -$ docker network connect --alias db --alias mysql multi-host-network container2 -``` -You can pause, restart, and stop containers that are connected to a network. -A container connects to its configured networks when it runs. - -If specified, the container's IP address(es) is reapplied when a stopped -container is restarted. If the IP address is no longer available, the container -fails to start. One way to guarantee that the IP address is available is -to specify an `--ip-range` when creating the network, and choose the static IP -address(es) from outside that range. This ensures that the IP address is not -given to another container while this container is not on the network. - -```bash -$ docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 multi-host-network -``` - -```bash -$ docker network connect --ip 172.20.128.2 multi-host-network container2 -``` - -To verify the container is connected, use the `docker network inspect` command. Use `docker network disconnect` to remove a container from the network. - -Once connected in network, containers can communicate using only another -container's IP address or name. For `overlay` networks or custom plugins that -support multi-host connectivity, containers connected to the same multi-host -network but launched from different Engines can also communicate in this way. - -You can connect a container to one or more networks. The networks need not be the same type. For example, you can connect a single container bridge and overlay networks. - -## Related information - -* [network inspect](network_inspect.md) -* [network create](network_create.md) -* [network disconnect](network_disconnect.md) -* [network ls](network_ls.md) -* [network rm](network_rm.md) -* [network prune](network_prune.md) -* [Understand Docker container networks](https://docs.docker.com/engine/userguide/networking/) -* [Work with networks](https://docs.docker.com/engine/userguide/networking/work-with-networks/) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/network_create.md b/vendor/github.com/docker/docker/docs/reference/commandline/network_create.md deleted file mode 100644 index e238217d4..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/network_create.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -title: "network create" -description: "The network create command description and usage" -keywords: "network, create" ---- - - - -# network create - -```markdown -Usage: docker network create [OPTIONS] NETWORK - -Create a network - -Options: - --attachable Enable manual container attachment - --aux-address value Auxiliary IPv4 or IPv6 addresses used by Network - driver (default map[]) - -d, --driver string Driver to manage the Network (default "bridge") - --gateway value IPv4 or IPv6 Gateway for the master subnet (default []) - --help Print usage - --internal Restrict external access to the network - --ip-range value Allocate container ip from a sub-range (default []) - --ipam-driver string IP Address Management Driver (default "default") - --ipam-opt value Set IPAM driver specific options (default map[]) - --ipv6 Enable IPv6 networking - --label value Set metadata on a network (default []) - -o, --opt value Set driver specific options (default map[]) - --subnet value Subnet in CIDR format that represents a - network segment (default []) -``` - -Creates a new network. The `DRIVER` accepts `bridge` or `overlay` which are the -built-in network drivers. If you have installed a third party or your own custom -network driver you can specify that `DRIVER` here also. If you don't specify the -`--driver` option, the command automatically creates a `bridge` network for you. -When you install Docker Engine it creates a `bridge` network automatically. This -network corresponds to the `docker0` bridge that Engine has traditionally relied -on. When you launch a new container with `docker run` it automatically connects to -this bridge network. You cannot remove this default bridge network, but you can -create new ones using the `network create` command. - -```bash -$ docker network create -d bridge my-bridge-network -``` - -Bridge networks are isolated networks on a single Engine installation. If you -want to create a network that spans multiple Docker hosts each running an -Engine, you must create an `overlay` network. Unlike `bridge` networks, overlay -networks require some pre-existing conditions before you can create one. These -conditions are: - -* Access to a key-value store. Engine supports Consul, Etcd, and ZooKeeper (Distributed store) key-value stores. -* A cluster of hosts with connectivity to the key-value store. -* A properly configured Engine `daemon` on each host in the cluster. - -The `dockerd` options that support the `overlay` network are: - -* `--cluster-store` -* `--cluster-store-opt` -* `--cluster-advertise` - -To read more about these options and how to configure them, see ["*Get started -with multi-host network*"](https://docs.docker.com/engine/userguide/networking/get-started-overlay). - -While not required, it is a good idea to install Docker Swarm to -manage the cluster that makes up your network. Swarm provides sophisticated -discovery and server management tools that can assist your implementation. - -Once you have prepared the `overlay` network prerequisites you simply choose a -Docker host in the cluster and issue the following to create the network: - -```bash -$ docker network create -d overlay my-multihost-network -``` - -Network names must be unique. The Docker daemon attempts to identify naming -conflicts but this is not guaranteed. It is the user's responsibility to avoid -name conflicts. - -## Connect containers - -When you start a container, use the `--network` flag to connect it to a network. -This example adds the `busybox` container to the `mynet` network: - -```bash -$ docker run -itd --network=mynet busybox -``` - -If you want to add a container to a network after the container is already -running, use the `docker network connect` subcommand. - -You can connect multiple containers to the same network. Once connected, the -containers can communicate using only another container's IP address or name. -For `overlay` networks or custom plugins that support multi-host connectivity, -containers connected to the same multi-host network but launched from different -Engines can also communicate in this way. - -You can disconnect a container from a network using the `docker network -disconnect` command. - -## Specifying advanced options - -When you create a network, Engine creates a non-overlapping subnetwork for the -network by default. This subnetwork is not a subdivision of an existing -network. It is purely for ip-addressing purposes. You can override this default -and specify subnetwork values directly using the `--subnet` option. On a -`bridge` network you can only create a single subnet: - -```bash -$ docker network create --driver=bridge --subnet=192.168.0.0/16 br0 -``` - -Additionally, you also specify the `--gateway` `--ip-range` and `--aux-address` -options. - -```bash -$ docker network create \ - --driver=bridge \ - --subnet=172.28.0.0/16 \ - --ip-range=172.28.5.0/24 \ - --gateway=172.28.5.254 \ - br0 -``` - -If you omit the `--gateway` flag the Engine selects one for you from inside a -preferred pool. For `overlay` networks and for network driver plugins that -support it you can create multiple subnetworks. - -```bash -$ docker network create -d overlay \ - --subnet=192.168.0.0/16 \ - --subnet=192.170.0.0/16 \ - --gateway=192.168.0.100 \ - --gateway=192.170.0.100 \ - --ip-range=192.168.1.0/24 \ - --aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \ - --aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \ - my-multihost-network -``` - -Be sure that your subnetworks do not overlap. If they do, the network create -fails and Engine returns an error. - -# Bridge driver options - -When creating a custom network, the default network driver (i.e. `bridge`) has -additional options that can be passed. The following are those options and the -equivalent docker daemon flags used for docker0 bridge: - -| Option | Equivalent | Description | -|--------------------------------------------------|-------------|-------------------------------------------------------| -| `com.docker.network.bridge.name` | - | bridge name to be used when creating the Linux bridge | -| `com.docker.network.bridge.enable_ip_masquerade` | `--ip-masq` | Enable IP masquerading | -| `com.docker.network.bridge.enable_icc` | `--icc` | Enable or Disable Inter Container Connectivity | -| `com.docker.network.bridge.host_binding_ipv4` | `--ip` | Default IP when binding container ports | -| `com.docker.network.driver.mtu` | `--mtu` | Set the containers network MTU | - -The following arguments can be passed to `docker network create` for any -network driver, again with their approximate equivalents to `docker daemon`. - -| Argument | Equivalent | Description | -|--------------|----------------|--------------------------------------------| -| `--gateway` | - | IPv4 or IPv6 Gateway for the master subnet | -| `--ip-range` | `--fixed-cidr` | Allocate IPs from a range | -| `--internal` | - | Restrict external access to the network | -| `--ipv6` | `--ipv6` | Enable IPv6 networking | -| `--subnet` | `--bip` | Subnet for network | - -For example, let's use `-o` or `--opt` options to specify an IP address binding -when publishing ports: - -```bash -$ docker network create \ - -o "com.docker.network.bridge.host_binding_ipv4"="172.19.0.1" \ - simple-network -``` - -### Network internal mode - -By default, when you connect a container to an `overlay` network, Docker also -connects a bridge network to it to provide external connectivity. If you want -to create an externally isolated `overlay` network, you can specify the -`--internal` option. - -## Related information - -* [network inspect](network_inspect.md) -* [network connect](network_connect.md) -* [network disconnect](network_disconnect.md) -* [network ls](network_ls.md) -* [network rm](network_rm.md) -* [network prune](network_prune.md) -* [Understand Docker container networks](https://docs.docker.com/engine/userguide/networking/) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/network_disconnect.md b/vendor/github.com/docker/docker/docs/reference/commandline/network_disconnect.md deleted file mode 100644 index 42e976a50..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/network_disconnect.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "network disconnect" -description: "The network disconnect command description and usage" -keywords: "network, disconnect, user-defined" ---- - - - -# network disconnect - -```markdown -Usage: docker network disconnect [OPTIONS] NETWORK CONTAINER - -Disconnect a container from a network - -Options: - -f, --force Force the container to disconnect from a network - --help Print usage -``` - -Disconnects a container from a network. The container must be running to disconnect it from the network. - -```bash - $ docker network disconnect multi-host-network container1 -``` - - -## Related information - -* [network inspect](network_inspect.md) -* [network connect](network_connect.md) -* [network create](network_create.md) -* [network ls](network_ls.md) -* [network rm](network_rm.md) -* [network prune](network_prune.md) -* [Understand Docker container networks](https://docs.docker.com/engine/userguide/networking/) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/network_inspect.md b/vendor/github.com/docker/docker/docs/reference/commandline/network_inspect.md deleted file mode 100644 index bc0005e38..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/network_inspect.md +++ /dev/null @@ -1,192 +0,0 @@ ---- -title: "network inspect" -description: "The network inspect command description and usage" -keywords: "network, inspect, user-defined" ---- - - - -# network inspect - -```markdown -Usage: docker network inspect [OPTIONS] NETWORK [NETWORK...] - -Display detailed information on one or more networks - -Options: - -f, --format string Format the output using the given Go template - --help Print usage -``` - -Returns information about one or more networks. By default, this command renders all results in a JSON object. For example, if you connect two containers to the default `bridge` network: - -```bash -$ sudo docker run -itd --name=container1 busybox -f2870c98fd504370fb86e59f32cd0753b1ac9b69b7d80566ffc7192a82b3ed27 - -$ sudo docker run -itd --name=container2 busybox -bda12f8922785d1f160be70736f26c1e331ab8aaf8ed8d56728508f2e2fd4727 -``` - -The `network inspect` command shows the containers, by id, in its -results. For networks backed by multi-host network driver, such as Overlay, -this command also shows the container endpoints in other hosts in the -cluster. These endpoints are represented as "ep-{endpoint-id}" in the output. -However, for swarm-scoped networks, only the endpoints that are local to the -node are shown. - -You can specify an alternate format to execute a given -template for each result. Go's -[text/template](http://golang.org/pkg/text/template/) package describes all the -details of the format. - -```bash -$ sudo docker network inspect bridge -[ - { - "Name": "bridge", - "Id": "b2b1a2cba717161d984383fd68218cf70bbbd17d328496885f7c921333228b0f", - "Created": "2016-10-19T04:33:30.360899459Z", - "Scope": "local", - "Driver": "bridge", - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.17.42.1/16", - "Gateway": "172.17.42.1" - } - ] - }, - "Internal": false, - "Containers": { - "bda12f8922785d1f160be70736f26c1e331ab8aaf8ed8d56728508f2e2fd4727": { - "Name": "container2", - "EndpointID": "0aebb8fcd2b282abe1365979536f21ee4ceaf3ed56177c628eae9f706e00e019", - "MacAddress": "02:42:ac:11:00:02", - "IPv4Address": "172.17.0.2/16", - "IPv6Address": "" - }, - "f2870c98fd504370fb86e59f32cd0753b1ac9b69b7d80566ffc7192a82b3ed27": { - "Name": "container1", - "EndpointID": "a00676d9c91a96bbe5bcfb34f705387a33d7cc365bac1a29e4e9728df92d10ad", - "MacAddress": "02:42:ac:11:00:01", - "IPv4Address": "172.17.0.1/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - }, - "Labels": {} - } -] -``` - -Returns the information about the user-defined network: - -```bash -$ docker network create simple-network -69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a -$ docker network inspect simple-network -[ - { - "Name": "simple-network", - "Id": "69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a", - "Created": "2016-10-19T04:33:30.360899459Z", - "Scope": "local", - "Driver": "bridge", - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.22.0.0/16", - "Gateway": "172.22.0.1" - } - ] - }, - "Containers": {}, - "Options": {}, - "Labels": {} - } -] -``` - -For swarm mode overlay networks `network inspect` also shows the IP address and node name -of the peers. Peers are the nodes in the swarm cluster which have at least one task attached -to the network. Node name is of the format `-`. - -```bash -$ docker network inspect ingress -[ - { - "Name": "ingress", - "Id": "j0izitrut30h975vk4m1u5kk3", - "Created": "2016-11-08T06:49:59.803387552Z", - "Scope": "swarm", - "Driver": "overlay", - "EnableIPv6": false, - "IPAM": { - "Driver": "default", - "Options": null, - "Config": [ - { - "Subnet": "10.255.0.0/16", - "Gateway": "10.255.0.1" - } - ] - }, - "Internal": false, - "Attachable": false, - "Containers": { - "ingress-sbox": { - "Name": "ingress-endpoint", - "EndpointID": "40e002d27b7e5d75f60bc72199d8cae3344e1896abec5eddae9743755fe09115", - "MacAddress": "02:42:0a:ff:00:03", - "IPv4Address": "10.255.0.3/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.driver.overlay.vxlanid_list": "256" - }, - "Labels": {}, - "Peers": [ - { - "Name": "net-1-1d22adfe4d5c", - "IP": "192.168.33.11" - }, - { - "Name": "net-2-d55d838b34af", - "IP": "192.168.33.12" - }, - { - "Name": "net-3-8473f8140bd9", - "IP": "192.168.33.13" - } - ] - } -] -``` - -## Related information - -* [network disconnect ](network_disconnect.md) -* [network connect](network_connect.md) -* [network create](network_create.md) -* [network ls](network_ls.md) -* [network rm](network_rm.md) -* [network prune](network_prune.md) -* [Understand Docker container networks](https://docs.docker.com/engine/userguide/networking/) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/network_ls.md b/vendor/github.com/docker/docker/docs/reference/commandline/network_ls.md deleted file mode 100644 index a4f671d56..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/network_ls.md +++ /dev/null @@ -1,218 +0,0 @@ ---- -title: "network ls" -description: "The network ls command description and usage" -keywords: "network, list, user-defined" ---- - - - -# docker network ls - -```markdown -Usage: docker network ls [OPTIONS] - -List networks - -Aliases: - ls, list - -Options: - -f, --filter filter Provide filter values (e.g. 'driver=bridge') - --format string Pretty-print networks using a Go template - --help Print usage - --no-trunc Do not truncate the output - -q, --quiet Only display network IDs -``` - -Lists all the networks the Engine `daemon` knows about. This includes the -networks that span across multiple hosts in a cluster, for example: - -```bash -$ sudo docker network ls -NETWORK ID NAME DRIVER SCOPE -7fca4eb8c647 bridge bridge local -9f904ee27bf5 none null local -cf03ee007fb4 host host local -78b03ee04fc4 multi-host overlay swarm -``` - -Use the `--no-trunc` option to display the full network id: - -```bash -$ docker network ls --no-trunc -NETWORK ID NAME DRIVER SCOPE -18a2866682b85619a026c81b98a5e375bd33e1b0936a26cc497c283d27bae9b3 none null local -c288470c46f6c8949c5f7e5099b5b7947b07eabe8d9a27d79a9cbf111adcbf47 host host local -7b369448dccbf865d397c8d2be0cda7cf7edc6b0945f77d2529912ae917a0185 bridge bridge local -95e74588f40db048e86320c6526440c504650a1ff3e9f7d60a497c4d2163e5bd foo bridge local -63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161 dev bridge local -``` - -## Filtering - -The filtering flag (`-f` or `--filter`) format is a `key=value` pair. If there -is more than one filter, then pass multiple flags (e.g. `--filter "foo=bar" --filter "bif=baz"`). -Multiple filter flags are combined as an `OR` filter. For example, -`-f type=custom -f type=builtin` returns both `custom` and `builtin` networks. - -The currently supported filters are: - -* driver -* id (network's id) -* label (`label=` or `label==`) -* name (network's name) -* type (custom|builtin) - -#### Driver - -The `driver` filter matches networks based on their driver. - -The following example matches networks with the `bridge` driver: - -```bash -$ docker network ls --filter driver=bridge -NETWORK ID NAME DRIVER SCOPE -db9db329f835 test1 bridge local -f6e212da9dfd test2 bridge local -``` - -#### ID - -The `id` filter matches on all or part of a network's ID. - -The following filter matches all networks with an ID containing the -`63d1ff1f77b0...` string. - -```bash -$ docker network ls --filter id=63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161 -NETWORK ID NAME DRIVER SCOPE -63d1ff1f77b0 dev bridge local -``` - -You can also filter for a substring in an ID as this shows: - -```bash -$ docker network ls --filter id=95e74588f40d -NETWORK ID NAME DRIVER SCOPE -95e74588f40d foo bridge local - -$ docker network ls --filter id=95e -NETWORK ID NAME DRIVER SCOPE -95e74588f40d foo bridge local -``` - -#### Label - -The `label` filter matches networks based on the presence of a `label` alone or a `label` and a -value. - -The following filter matches networks with the `usage` label regardless of its value. - -```bash -$ docker network ls -f "label=usage" -NETWORK ID NAME DRIVER SCOPE -db9db329f835 test1 bridge local -f6e212da9dfd test2 bridge local -``` - -The following filter matches networks with the `usage` label with the `prod` value. - -```bash -$ docker network ls -f "label=usage=prod" -NETWORK ID NAME DRIVER SCOPE -f6e212da9dfd test2 bridge local -``` - -#### Name - -The `name` filter matches on all or part of a network's name. - -The following filter matches all networks with a name containing the `foobar` string. - -```bash -$ docker network ls --filter name=foobar -NETWORK ID NAME DRIVER SCOPE -06e7eef0a170 foobar bridge local -``` - -You can also filter for a substring in a name as this shows: - -```bash -$ docker network ls --filter name=foo -NETWORK ID NAME DRIVER SCOPE -95e74588f40d foo bridge local -06e7eef0a170 foobar bridge local -``` - -#### Type - -The `type` filter supports two values; `builtin` displays predefined networks -(`bridge`, `none`, `host`), whereas `custom` displays user defined networks. - -The following filter matches all user defined networks: - -```bash -$ docker network ls --filter type=custom -NETWORK ID NAME DRIVER SCOPE -95e74588f40d foo bridge local -63d1ff1f77b0 dev bridge local -``` - -By having this flag it allows for batch cleanup. For example, use this filter -to delete all user defined networks: - -```bash -$ docker network rm `docker network ls --filter type=custom -q` -``` - -A warning will be issued when trying to remove a network that has containers -attached. - -## Formatting - -The formatting options (`--format`) pretty-prints networks output -using a Go template. - -Valid placeholders for the Go template are listed below: - -Placeholder | Description -------------|------------------------------------------------------------------------------------------ -`.ID` | Network ID -`.Name` | Network name -`.Driver` | Network driver -`.Scope` | Network scope (local, global) -`.IPv6` | Whether IPv6 is enabled on the network or not. -`.Internal` | Whether the network is internal or not. -`.Labels` | All labels assigned to the network. -`.Label` | Value of a specific label for this network. For example `{{.Label "project.version"}}` - -When using the `--format` option, the `network ls` command will either -output the data exactly as the template declares or, when using the -`table` directive, includes column headers as well. - -The following example uses a template without headers and outputs the -`ID` and `Driver` entries separated by a colon for all networks: - -```bash -$ docker network ls --format "{{.ID}}: {{.Driver}}" -afaaab448eb2: bridge -d1584f8dc718: host -391df270dc66: null -``` - -## Related information - -* [network disconnect ](network_disconnect.md) -* [network connect](network_connect.md) -* [network create](network_create.md) -* [network inspect](network_inspect.md) -* [network rm](network_rm.md) -* [network prune](network_prune.md) -* [Understand Docker container networks](https://docs.docker.com/engine/userguide/networking/) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/network_prune.md b/vendor/github.com/docker/docker/docs/reference/commandline/network_prune.md deleted file mode 100644 index 5b6546560..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/network_prune.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: "network prune" -description: "Remove unused networks" -keywords: "network, prune, delete" ---- - -# network prune - -```markdown -Usage: docker network prune [OPTIONS] - -Remove all unused networks - -Options: - -f, --force Do not prompt for confirmation - --help Print usage -``` - -Remove all unused networks. Unused networks are those which are not referenced by any containers. - -Example output: - -```bash -$ docker network prune -WARNING! This will remove all networks not used by at least one container. -Are you sure you want to continue? [y/N] y -Deleted Networks: -n1 -n2 -``` - -## Related information - -* [network disconnect ](network_disconnect.md) -* [network connect](network_connect.md) -* [network create](network_create.md) -* [network ls](network_ls.md) -* [network inspect](network_inspect.md) -* [network rm](network_rm.md) -* [Understand Docker container networks](https://docs.docker.com/engine/userguide/networking/) -* [system df](system_df.md) -* [container prune](container_prune.md) -* [image prune](image_prune.md) -* [volume prune](volume_prune.md) -* [system prune](system_prune.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/network_rm.md b/vendor/github.com/docker/docker/docs/reference/commandline/network_rm.md deleted file mode 100644 index f06b4c002..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/network_rm.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: "network rm" -description: "the network rm command description and usage" -keywords: "network, rm, user-defined" ---- - - - -# network rm - -```markdown -Usage: docker network rm NETWORK [NETWORK...] - -Remove one or more networks - -Aliases: - rm, remove - -Options: - --help Print usage -``` - -Removes one or more networks by name or identifier. To remove a network, -you must first disconnect any containers connected to it. -To remove the network named 'my-network': - -```bash - $ docker network rm my-network -``` - -To delete multiple networks in a single `docker network rm` command, provide -multiple network names or ids. The following example deletes a network with id -`3695c422697f` and a network named `my-network`: - -```bash - $ docker network rm 3695c422697f my-network -``` - -When you specify multiple networks, the command attempts to delete each in turn. -If the deletion of one network fails, the command continues to the next on the -list and tries to delete that. The command reports success or failure for each -deletion. - -## Related information - -* [network disconnect ](network_disconnect.md) -* [network connect](network_connect.md) -* [network create](network_create.md) -* [network ls](network_ls.md) -* [network inspect](network_inspect.md) -* [network prune](network_prune.md) -* [Understand Docker container networks](https://docs.docker.com/engine/userguide/networking/) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/node_demote.md b/vendor/github.com/docker/docker/docs/reference/commandline/node_demote.md deleted file mode 100644 index 9a81bb9c0..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/node_demote.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "node demote" -description: "The node demote command description and usage" -keywords: "node, demote" ---- - - - -# node demote - -```markdown -Usage: docker node demote NODE [NODE...] - -Demote one or more nodes from manager in the swarm - -Options: - --help Print usage - -``` - -Demotes an existing manager so that it is no longer a manager. This command targets a docker engine that is a manager in the swarm. - - -```bash -$ docker node demote -``` - -## Related information - -* [node inspect](node_inspect.md) -* [node ls](node_ls.md) -* [node promote](node_promote.md) -* [node ps](node_ps.md) -* [node rm](node_rm.md) -* [node update](node_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/node_inspect.md b/vendor/github.com/docker/docker/docs/reference/commandline/node_inspect.md deleted file mode 100644 index fac688fe4..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/node_inspect.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: "node inspect" -description: "The node inspect command description and usage" -keywords: "node, inspect" ---- - - - -# node inspect - -```markdown -Usage: docker node inspect [OPTIONS] self|NODE [NODE...] - -Display detailed information on one or more nodes - -Options: - -f, --format string Format the output using the given Go template - --help Print usage - --pretty Print the information in a human friendly format. -``` - -Returns information about a node. By default, this command renders all results -in a JSON array. You can specify an alternate format to execute a -given template for each result. Go's -[text/template](http://golang.org/pkg/text/template/) package describes all the -details of the format. - -Example output: - - $ docker node inspect swarm-manager - [ - { - "ID": "e216jshn25ckzbvmwlnh5jr3g", - "Version": { - "Index": 10 - }, - "CreatedAt": "2016-06-16T22:52:44.9910662Z", - "UpdatedAt": "2016-06-16T22:52:45.230878043Z", - "Spec": { - "Role": "manager", - "Availability": "active" - }, - "Description": { - "Hostname": "swarm-manager", - "Platform": { - "Architecture": "x86_64", - "OS": "linux" - }, - "Resources": { - "NanoCPUs": 1000000000, - "MemoryBytes": 1039843328 - }, - "Engine": { - "EngineVersion": "1.12.0", - "Plugins": [ - { - "Type": "Volume", - "Name": "local" - }, - { - "Type": "Network", - "Name": "overlay" - }, - { - "Type": "Network", - "Name": "null" - }, - { - "Type": "Network", - "Name": "host" - }, - { - "Type": "Network", - "Name": "bridge" - }, - { - "Type": "Network", - "Name": "overlay" - } - ] - } - }, - "Status": { - "State": "ready", - "Addr": "168.0.32.137" - }, - "ManagerStatus": { - "Leader": true, - "Reachability": "reachable", - "Addr": "168.0.32.137:2377" - } - } - ] - - {% raw %} - $ docker node inspect --format '{{ .ManagerStatus.Leader }}' self - false - {% endraw %} - - $ docker node inspect --pretty self - ID: e216jshn25ckzbvmwlnh5jr3g - Hostname: swarm-manager - Joined at: 2016-06-16 22:52:44.9910662 +0000 utc - Status: - State: Ready - Availability: Active - Address: 172.17.0.2 - Manager Status: - Address: 172.17.0.2:2377 - Raft Status: Reachable - Leader: Yes - Platform: - Operating System: linux - Architecture: x86_64 - Resources: - CPUs: 4 - Memory: 7.704 GiB - Plugins: - Network: overlay, bridge, null, host, overlay - Volume: local - Engine Version: 1.12.0 - -## Related information - -* [node demote](node_demote.md) -* [node ls](node_ls.md) -* [node promote](node_promote.md) -* [node ps](node_ps.md) -* [node rm](node_rm.md) -* [node update](node_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/node_ls.md b/vendor/github.com/docker/docker/docs/reference/commandline/node_ls.md deleted file mode 100644 index 5f61713c2..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/node_ls.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: "node ls" -description: "The node ls command description and usage" -keywords: "node, list" ---- - - - -# node ls - -```markdown -Usage: docker node ls [OPTIONS] - -List nodes in the swarm - -Aliases: - ls, list - -Options: - -f, --filter value Filter output based on conditions provided - --help Print usage - -q, --quiet Only display IDs -``` - -Lists all the nodes that the Docker Swarm manager knows about. You can filter using the `-f` or `--filter` flag. Refer to the [filtering](#filtering) section for more information about available filter options. - -Example output: - -```bash -$ docker node ls - -ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS -1bcef6utixb0l0ca7gxuivsj0 swarm-worker2 Ready Active -38ciaotwjuritcdtn9npbnkuz swarm-worker1 Ready Active -e216jshn25ckzbvmwlnh5jr3g * swarm-manager1 Ready Active Leader -``` - -## Filtering - -The filtering flag (`-f` or `--filter`) format is of "key=value". If there is more -than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "bif=baz"`) - -The currently supported filters are: - -* [id](node_ls.md#id) -* [label](node_ls.md#label) -* [membership](node_ls.md#membership) -* [name](node_ls.md#name) -* [role](node_ls.md#role) - -#### ID - -The `id` filter matches all or part of a node's id. - -```bash -$ docker node ls -f id=1 - -ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS -1bcef6utixb0l0ca7gxuivsj0 swarm-worker2 Ready Active -``` - -#### Label - -The `label` filter matches nodes based on engine labels and on the presence of a `label` alone or a `label` and a value. Node labels are currently not used for filtering. - -The following filter matches nodes with the `foo` label regardless of its value. - -```bash -$ docker node ls -f "label=foo" - -ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS -1bcef6utixb0l0ca7gxuivsj0 swarm-worker2 Ready Active -``` - -#### Membership - -The `membership` filter matches nodes based on the presence of a `membership` and a value -`accepted` or `pending`. - -The following filter matches nodes with the `membership` of `accepted`. - -```bash -$ docker node ls -f "membership=accepted" - -ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS -1bcef6utixb0l0ca7gxuivsj0 swarm-worker2 Ready Active -38ciaotwjuritcdtn9npbnkuz swarm-worker1 Ready Active -``` - -#### Name - -The `name` filter matches on all or part of a node hostname. - -The following filter matches the nodes with a name equal to `swarm-master` string. - -```bash -$ docker node ls -f name=swarm-manager1 - -ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS -e216jshn25ckzbvmwlnh5jr3g * swarm-manager1 Ready Active Leader -``` - -#### Role - -The `role` filter matches nodes based on the presence of a `role` and a value `worker` or `manager`. - -The following filter matches nodes with the `manager` role. - -```bash -$ docker node ls -f "role=manager" - -ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS -e216jshn25ckzbvmwlnh5jr3g * swarm-manager1 Ready Active Leader -``` - -## Related information - -* [node demote](node_demote.md) -* [node inspect](node_inspect.md) -* [node promote](node_promote.md) -* [node ps](node_ps.md) -* [node rm](node_rm.md) -* [node update](node_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/node_promote.md b/vendor/github.com/docker/docker/docs/reference/commandline/node_promote.md deleted file mode 100644 index 92092a893..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/node_promote.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "node promote" -description: "The node promote command description and usage" -keywords: "node, promote" ---- - - - -# node promote - -```markdown -Usage: docker node promote NODE [NODE...] - -Promote one or more nodes to manager in the swarm - -Options: - --help Print usage -``` - -Promotes a node to manager. This command targets a docker engine that is a manager in the swarm. - - -```bash -$ docker node promote -``` - -## Related information - -* [node demote](node_demote.md) -* [node inspect](node_inspect.md) -* [node ls](node_ls.md) -* [node ps](node_ps.md) -* [node rm](node_rm.md) -* [node update](node_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/node_ps.md b/vendor/github.com/docker/docker/docs/reference/commandline/node_ps.md deleted file mode 100644 index 7f07c5ea6..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/node_ps.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: "node ps" -description: "The node ps command description and usage" -keywords: node, tasks, ps -aliases: ["/engine/reference/commandline/node_tasks/"] ---- - - - -# node ps - -```markdown -Usage: docker node ps [OPTIONS] [NODE...] - -List tasks running on one or more nodes, defaults to current node. - -Options: - -f, --filter value Filter output based on conditions provided - --help Print usage - --no-resolve Do not map IDs to Names - --no-trunc Do not truncate output -``` - -Lists all the tasks on a Node that Docker knows about. You can filter using the `-f` or `--filter` flag. Refer to the [filtering](#filtering) section for more information about available filter options. - -Example output: - - $ docker node ps swarm-manager1 - NAME IMAGE NODE DESIRED STATE CURRENT STATE - redis.1.7q92v0nr1hcgts2amcjyqg3pq redis:3.0.6 swarm-manager1 Running Running 5 hours - redis.6.b465edgho06e318egmgjbqo4o redis:3.0.6 swarm-manager1 Running Running 29 seconds - redis.7.bg8c07zzg87di2mufeq51a2qp redis:3.0.6 swarm-manager1 Running Running 5 seconds - redis.9.dkkual96p4bb3s6b10r7coxxt redis:3.0.6 swarm-manager1 Running Running 5 seconds - redis.10.0tgctg8h8cech4w0k0gwrmr23 redis:3.0.6 swarm-manager1 Running Running 5 seconds - - -## Filtering - -The filtering flag (`-f` or `--filter`) format is of "key=value". If there is more -than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "bif=baz"`) - -The currently supported filters are: - -* [name](#name) -* [id](#id) -* [label](#label) -* [desired-state](#desired-state) - -#### name - -The `name` filter matches on all or part of a task's name. - -The following filter matches all tasks with a name containing the `redis` string. - - $ docker node ps -f name=redis swarm-manager1 - NAME IMAGE NODE DESIRED STATE CURRENT STATE - redis.1.7q92v0nr1hcgts2amcjyqg3pq redis:3.0.6 swarm-manager1 Running Running 5 hours - redis.6.b465edgho06e318egmgjbqo4o redis:3.0.6 swarm-manager1 Running Running 29 seconds - redis.7.bg8c07zzg87di2mufeq51a2qp redis:3.0.6 swarm-manager1 Running Running 5 seconds - redis.9.dkkual96p4bb3s6b10r7coxxt redis:3.0.6 swarm-manager1 Running Running 5 seconds - redis.10.0tgctg8h8cech4w0k0gwrmr23 redis:3.0.6 swarm-manager1 Running Running 5 seconds - - -#### id - -The `id` filter matches a task's id. - - $ docker node ps -f id=bg8c07zzg87di2mufeq51a2qp swarm-manager1 - NAME IMAGE NODE DESIRED STATE CURRENT STATE - redis.7.bg8c07zzg87di2mufeq51a2qp redis:3.0.6 swarm-manager1 Running Running 5 seconds - - -#### label - -The `label` filter matches tasks based on the presence of a `label` alone or a `label` and a -value. - -The following filter matches tasks with the `usage` label regardless of its value. - -```bash -$ docker node ps -f "label=usage" -NAME IMAGE NODE DESIRED STATE CURRENT STATE -redis.6.b465edgho06e318egmgjbqo4o redis:3.0.6 swarm-manager1 Running Running 10 minutes -redis.7.bg8c07zzg87di2mufeq51a2qp redis:3.0.6 swarm-manager1 Running Running 9 minutes -``` - - -#### desired-state - -The `desired-state` filter can take the values `running`, `shutdown`, and `accepted`. - - -## Related information - -* [node demote](node_demote.md) -* [node inspect](node_inspect.md) -* [node ls](node_ls.md) -* [node promote](node_promote.md) -* [node rm](node_rm.md) -* [node update](node_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/node_rm.md b/vendor/github.com/docker/docker/docs/reference/commandline/node_rm.md deleted file mode 100644 index b245d636c..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/node_rm.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: "node rm" -description: "The node rm command description and usage" -keywords: "node, remove" ---- - - - -# node rm - -```markdown -Usage: docker node rm [OPTIONS] NODE [NODE...] - -Remove one or more nodes from the swarm - -Aliases: - rm, remove - -Options: - -f, --force Force remove a node from the swarm - --help Print usage -``` - -When run from a manager node, removes the specified nodes from a swarm. - - -Example output: - -```nohighlight -$ docker node rm swarm-node-02 - -Node swarm-node-02 removed from swarm -``` - -Removes the specified nodes from the swarm, but only if the nodes are in the -down state. If you attempt to remove an active node you will receive an error: - -```nohighlight -$ docker node rm swarm-node-03 - -Error response from daemon: rpc error: code = 9 desc = node swarm-node-03 is not -down and can't be removed -``` - -If you lose access to a worker node or need to shut it down because it has been -compromised or is not behaving as expected, you can use the `--force` option. -This may cause transient errors or interruptions, depending on the type of task -being run on the node. - -```nohighlight -$ docker node rm --force swarm-node-03 - -Node swarm-node-03 removed from swarm -``` - -A manager node must be demoted to a worker node (using `docker node demote`) -before you can remove it from the swarm. - -## Related information - -* [node demote](node_demote.md) -* [node inspect](node_inspect.md) -* [node ls](node_ls.md) -* [node promote](node_promote.md) -* [node ps](node_ps.md) -* [node update](node_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/node_update.md b/vendor/github.com/docker/docker/docs/reference/commandline/node_update.md deleted file mode 100644 index aa65d0309..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/node_update.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "node update" -description: "The node update command description and usage" -keywords: "resources, update, dynamically" ---- - - - -## update - -```markdown -Usage: docker node update [OPTIONS] NODE - -Update a node - -Options: - --availability string Availability of the node (active/pause/drain) - --help Print usage - --label-add value Add or update a node label (key=value) (default []) - --label-rm value Remove a node label if exists (default []) - --role string Role of the node (worker/manager) -``` - -### Add label metadata to a node - -Add metadata to a swarm node using node labels. You can specify a node label as -a key with an empty value: - -``` bash -$ docker node update --label-add foo worker1 -``` - -To add multiple labels to a node, pass the `--label-add` flag for each label: - -``` bash -$ docker node update --label-add foo --label-add bar worker1 -``` - -When you [create a service](service_create.md), -you can use node labels as a constraint. A constraint limits the nodes where the -scheduler deploys tasks for a service. - -For example, to add a `type` label to identify nodes where the scheduler should -deploy message queue service tasks: - -``` bash -$ docker node update --label-add type=queue worker1 -``` - -The labels you set for nodes using `docker node update` apply only to the node -entity within the swarm. Do not confuse them with the docker daemon labels for -[dockerd](https://docs.docker.com/engine/userguide/labels-custom-metadata/#daemon-labels). - -For more information about labels, refer to [apply custom -metadata](https://docs.docker.com/engine/userguide/labels-custom-metadata/). - -## Related information - -* [node demote](node_demote.md) -* [node inspect](node_inspect.md) -* [node ls](node_ls.md) -* [node promote](node_promote.md) -* [node ps](node_ps.md) -* [node rm](node_rm.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/pause.md b/vendor/github.com/docker/docker/docs/reference/commandline/pause.md deleted file mode 100644 index e2dd800d5..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/pause.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "pause" -description: "The pause command description and usage" -keywords: "cgroups, container, suspend, SIGSTOP" ---- - - - -# pause - -```markdown -Usage: docker pause CONTAINER [CONTAINER...] - -Pause all processes within one or more containers - -Options: - --help Print usage -``` - -The `docker pause` command suspends all processes in the specified containers. -On Linux, this uses the cgroups freezer. Traditionally, when suspending a process -the `SIGSTOP` signal is used, which is observable by the process being suspended. -With the cgroups freezer the process is unaware, and unable to capture, -that it is being suspended, and subsequently resumed. On Windows, only Hyper-V -containers can be paused. - -See the -[cgroups freezer documentation](https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt) -for further details. - -## Related information - -* [unpause](unpause.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_create.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_create.md deleted file mode 100644 index 9d4e99e56..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_create.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "plugin create" -description: "the plugin create command description and usage" -keywords: "plugin, create" ---- - - - -# plugin create - -```markdown -Usage: docker plugin create [OPTIONS] PLUGIN PLUGIN-DATA-DIR - -Create a plugin from a rootfs and configuration. Plugin data directory must contain config.json and rootfs directory. - -Options: - --compress Compress the context using gzip - --help Print usage -``` - -Creates a plugin. Before creating the plugin, prepare the plugin's root filesystem as well as -[the config.json](../../extend/config.md) - - -The following example shows how to create a sample `plugin`. - -```bash - -$ ls -ls /home/pluginDir - -4 -rw-r--r-- 1 root root 431 Nov 7 01:40 config.json -0 drwxr-xr-x 19 root root 420 Nov 7 01:40 rootfs - -$ docker plugin create plugin /home/pluginDir -plugin - -NAME TAG DESCRIPTION ENABLED -plugin latest A sample plugin for Docker true -``` - -The plugin can subsequently be enabled for local use or pushed to the public registry. - -## Related information - -* [plugin disable](plugin_disable.md) -* [plugin enable](plugin_enable.md) -* [plugin inspect](plugin_inspect.md) -* [plugin install](plugin_install.md) -* [plugin ls](plugin_ls.md) -* [plugin push](plugin_push.md) -* [plugin rm](plugin_rm.md) -* [plugin set](plugin_set.md) -* [plugin upgrade](plugin_upgrade.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_disable.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_disable.md deleted file mode 100644 index 451f1ace9..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_disable.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "plugin disable" -description: "the plugin disable command description and usage" -keywords: "plugin, disable" ---- - - - -# plugin disable - -```markdown -Usage: docker plugin disable [OPTIONS] PLUGIN - -Disable a plugin - -Options: - -f, --force Force the disable of an active plugin - --help Print usage -``` - -Disables a plugin. The plugin must be installed before it can be disabled, -see [`docker plugin install`](plugin_install.md). Without the `-f` option, -a plugin that has references (eg, volumes, networks) cannot be disabled. - - -The following example shows that the `sample-volume-plugin` plugin is installed -and enabled: - -```bash -$ docker plugin ls - -ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 tiborvass/sample-volume-plugin latest A test plugin for Docker true -``` - -To disable the plugin, use the following command: - -```bash -$ docker plugin disable tiborvass/sample-volume-plugin - -tiborvass/sample-volume-plugin - -$ docker plugin ls - -ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 tiborvass/sample-volume-plugin latest A test plugin for Docker false -``` - -## Related information - -* [plugin create](plugin_create.md) -* [plugin enable](plugin_enable.md) -* [plugin inspect](plugin_inspect.md) -* [plugin install](plugin_install.md) -* [plugin ls](plugin_ls.md) -* [plugin push](plugin_push.md) -* [plugin rm](plugin_rm.md) -* [plugin set](plugin_set.md) -* [plugin upgrade](plugin_upgrade.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_enable.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_enable.md deleted file mode 100644 index df8bee3af..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_enable.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "plugin enable" -description: "the plugin enable command description and usage" -keywords: "plugin, enable" ---- - - - -# plugin enable - -```markdown -Usage: docker plugin enable [OPTIONS] PLUGIN - -Enable a plugin - -Options: - --help Print usage - --timeout int HTTP client timeout (in seconds) -``` - -Enables a plugin. The plugin must be installed before it can be enabled, -see [`docker plugin install`](plugin_install.md). - - -The following example shows that the `sample-volume-plugin` plugin is installed, -but disabled: - -```bash -$ docker plugin ls - -ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 tiborvass/sample-volume-plugin latest A test plugin for Docker false -``` - -To enable the plugin, use the following command: - -```bash -$ docker plugin enable tiborvass/sample-volume-plugin - -tiborvass/sample-volume-plugin - -$ docker plugin ls - -ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 tiborvass/sample-volume-plugin latest A test plugin for Docker true -``` - -## Related information - -* [plugin create](plugin_create.md) -* [plugin disable](plugin_disable.md) -* [plugin inspect](plugin_inspect.md) -* [plugin install](plugin_install.md) -* [plugin ls](plugin_ls.md) -* [plugin push](plugin_push.md) -* [plugin rm](plugin_rm.md) -* [plugin set](plugin_set.md) -* [plugin upgrade](plugin_upgrade.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_inspect.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_inspect.md deleted file mode 100644 index fdcc030c4..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_inspect.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -title: "plugin inspect" -description: "The plugin inspect command description and usage" -keywords: "plugin, inspect" ---- - - - -# plugin inspect - -```markdown -Usage: docker plugin inspect [OPTIONS] PLUGIN [PLUGIN...] - -Display detailed information on one or more plugins - -Options: - -f, --format string Format the output using the given Go template - --help Print usage -``` - -Returns information about a plugin. By default, this command renders all results -in a JSON array. - -Example output: - -```bash -$ docker plugin inspect tiborvass/sample-volume-plugin:latest -``` -```JSON -{ - "Id": "8c74c978c434745c3ade82f1bc0acf38d04990eaf494fa507c16d9f1daa99c21", - "Name": "tiborvass/sample-volume-plugin:latest", - "PluginReference": "tiborvas/sample-volume-plugin:latest", - "Enabled": true, - "Config": { - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Env": [ - "DEBUG=1" - ], - "Args": null, - "Devices": null - }, - "Manifest": { - "ManifestVersion": "v0", - "Description": "A test plugin for Docker", - "Documentation": "https://docs.docker.com/engine/extend/plugins/", - "Interface": { - "Types": [ - "docker.volumedriver/1.0" - ], - "Socket": "plugins.sock" - }, - "Entrypoint": [ - "plugin-sample-volume-plugin", - "/data" - ], - "Workdir": "", - "User": { - }, - "Network": { - "Type": "host" - }, - "Capabilities": null, - "Mounts": [ - { - "Name": "", - "Description": "", - "Settable": null, - "Source": "/data", - "Destination": "/data", - "Type": "bind", - "Options": [ - "shared", - "rbind" - ] - }, - { - "Name": "", - "Description": "", - "Settable": null, - "Source": null, - "Destination": "/foobar", - "Type": "tmpfs", - "Options": null - } - ], - "Devices": [ - { - "Name": "device", - "Description": "a host device to mount", - "Settable": null, - "Path": "/dev/cpu_dma_latency" - } - ], - "Env": [ - { - "Name": "DEBUG", - "Description": "If set, prints debug messages", - "Settable": null, - "Value": "1" - } - ], - "Args": { - "Name": "args", - "Description": "command line arguments", - "Settable": null, - "Value": [ - - ] - } - } -} -``` -(output formatted for readability) - - -```bash -$ docker plugin inspect -f '{{.Id}}' tiborvass/sample-volume-plugin:latest -``` -``` -8c74c978c434745c3ade82f1bc0acf38d04990eaf494fa507c16d9f1daa99c21 -``` - - -## Related information - -* [plugin create](plugin_create.md) -* [plugin enable](plugin_enable.md) -* [plugin disable](plugin_disable.md) -* [plugin install](plugin_install.md) -* [plugin ls](plugin_ls.md) -* [plugin push](plugin_push.md) -* [plugin rm](plugin_rm.md) -* [plugin set](plugin_set.md) -* [plugin upgrade](plugin_upgrade.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_install.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_install.md deleted file mode 100644 index 0601193ce..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_install.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "plugin install" -description: "the plugin install command description and usage" -keywords: "plugin, install" ---- - - - -# plugin install - -```markdown -Usage: docker plugin install [OPTIONS] PLUGIN [KEY=VALUE...] - -Install a plugin - -Options: - --alias string Local name for plugin - --disable Do not enable the plugin on install - --grant-all-permissions Grant all permissions necessary to run the plugin - --help Print usage -``` - -Installs and enables a plugin. Docker looks first for the plugin on your Docker -host. If the plugin does not exist locally, then the plugin is pulled from -the registry. Note that the minimum required registry version to distribute -plugins is 2.3.0 - - -The following example installs `vieus/sshfs` plugin and [set](plugin_set.md) it's env variable -`DEBUG` to 1. Install consists of pulling the plugin from Docker Hub, prompting -the user to accept the list of privileges that the plugin needs, settings parameters - and enabling the plugin. - -```bash -$ docker plugin install vieux/sshfs DEBUG=1 - -Plugin "vieux/sshfs" is requesting the following privileges: - - network: [host] - - device: [/dev/fuse] - - capabilities: [CAP_SYS_ADMIN] -Do you grant the above permissions? [y/N] y -vieux/sshfs -``` - -After the plugin is installed, it appears in the list of plugins: - -```bash -$ docker plugin ls - -ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 vieux/sshfs latest sshFS plugin for Docker true -``` - -## Related information - -* [plugin create](plugin_create.md) -* [plugin disable](plugin_disable.md) -* [plugin enable](plugin_enable.md) -* [plugin inspect](plugin_inspect.md) -* [plugin ls](plugin_ls.md) -* [plugin push](plugin_push.md) -* [plugin rm](plugin_rm.md) -* [plugin set](plugin_set.md) -* [plugin upgrade](plugin_upgrade.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_ls.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_ls.md deleted file mode 100644 index 7a3426d95..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_ls.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "plugin ls" -description: "The plugin ls command description and usage" -keywords: "plugin, list" ---- - - - -# plugin ls - -```markdown -Usage: docker plugin ls [OPTIONS] - -List plugins - -Aliases: - ls, list - -Options: - --help Print usage - --no-trunc Don't truncate output -``` - -Lists all the plugins that are currently installed. You can install plugins -using the [`docker plugin install`](plugin_install.md) command. - -Example output: - -```bash -$ docker plugin ls - -ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 tiborvass/sample-volume-plugin latest A test plugin for Docker true -``` - -## Related information - -* [plugin create](plugin_create.md) -* [plugin disable](plugin_disable.md) -* [plugin enable](plugin_enable.md) -* [plugin inspect](plugin_inspect.md) -* [plugin install](plugin_install.md) -* [plugin push](plugin_push.md) -* [plugin rm](plugin_rm.md) -* [plugin set](plugin_set.md) -* [plugin upgrade](plugin_upgrade.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_push.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_push.md deleted file mode 100644 index e61d10994..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_push.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "plugin push" -description: "the plugin push command description and usage" -keywords: "plugin, push" ---- - - - -```markdown -Usage: docker plugin push [OPTIONS] PLUGIN[:TAG] - -Push a plugin to a registry - -Options: - --help Print usage -``` - -Use `docker plugin create` to create the plugin. Once the plugin is ready for distribution, -use `docker plugin push` to share your images to the Docker Hub registry or to a self-hosted one. - -Registry credentials are managed by [docker login](login.md). - -The following example shows how to push a sample `user/plugin`. - -```bash - -$ docker plugin ls -ID NAME TAG DESCRIPTION ENABLED -69553ca1d456 user/plugin latest A sample plugin for Docker false -$ docker plugin push user/plugin -``` - -## Related information - -* [plugin create](plugin_create.md) -* [plugin disable](plugin_disable.md) -* [plugin enable](plugin_enable.md) -* [plugin inspect](plugin_inspect.md) -* [plugin install](plugin_install.md) -* [plugin ls](plugin_ls.md) -* [plugin rm](plugin_rm.md) -* [plugin set](plugin_set.md) -* [plugin upgrade](plugin_upgrade.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_rm.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_rm.md deleted file mode 100644 index 323ce83f3..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_rm.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "plugin rm" -description: "the plugin rm command description and usage" -keywords: "plugin, rm" ---- - - - -# plugin rm - -```markdown -Usage: docker plugin rm [OPTIONS] PLUGIN [PLUGIN...] - -Remove one or more plugins - -Aliases: - rm, remove - -Options: - -f, --force Force the removal of an active plugin - --help Print usage -``` - -Removes a plugin. You cannot remove a plugin if it is enabled, you must disable -a plugin using the [`docker plugin disable`](plugin_disable.md) before removing -it (or use --force, use of force is not recommended, since it can affect -functioning of running containers using the plugin). - -The following example disables and removes the `sample-volume-plugin:latest` plugin; - -```bash -$ docker plugin disable tiborvass/sample-volume-plugin -tiborvass/sample-volume-plugin - -$ docker plugin rm tiborvass/sample-volume-plugin:latest -tiborvass/sample-volume-plugin -``` - -## Related information - -* [plugin create](plugin_create.md) -* [plugin disable](plugin_disable.md) -* [plugin enable](plugin_enable.md) -* [plugin inspect](plugin_inspect.md) -* [plugin install](plugin_install.md) -* [plugin ls](plugin_ls.md) -* [plugin push](plugin_push.md) -* [plugin set](plugin_set.md) -* [plugin upgrade](plugin_upgrade.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_set.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_set.md deleted file mode 100644 index c206a8a76..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_set.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -title: "plugin set" -description: "the plugin set command description and usage" -keywords: "plugin, set" ---- - - - -# plugin set - -```markdown -Usage: docker plugin set PLUGIN KEY=VALUE [KEY=VALUE...] - -Change settings for a plugin - -Options: - --help Print usage -``` - -Change settings for a plugin. The plugin must be disabled. - -The settings currently supported are: - * env variables - * source of mounts - * path of devices - * args - -The following example change the env variable `DEBUG` on the -`sample-volume-plugin` plugin. - -```bash -$ docker plugin inspect -f {{.Settings.Env}} tiborvass/sample-volume-plugin -[DEBUG=0] - -$ docker plugin set tiborvass/sample-volume-plugin DEBUG=1 - -$ docker plugin inspect -f {{.Settings.Env}} tiborvass/sample-volume-plugin -[DEBUG=1] -``` - -The following example change the source of the `mymount` mount on -the `myplugin` plugin. - -```bash -$ docker plugin inspect -f '{{with $mount := index .Settings.Mounts 0}}{{$mount.Source}}{{end}}' myplugin -/foo - -$ docker plugins set myplugin mymount.source=/bar - -$ docker plugin inspect -f '{{with $mount := index .Settings.Mounts 0}}{{$mount.Source}}{{end}}' myplugin -/bar -``` - -Note: since only `source` is settable in `mymount`, `docker plugins set mymount=/bar myplugin` would work too. - -The following example change the path of the `mydevice` device on -the `myplugin` plugin. - -```bash -$ docker plugin inspect -f '{{with $device := index .Settings.Devices 0}}{{$device.Path}}{{end}}' myplugin -/dev/foo - -$ docker plugins set myplugin mydevice.path=/dev/bar - -$ docker plugin inspect -f '{{with $device := index .Settings.Devices 0}}{{$device.Path}}{{end}}' myplugin -/dev/bar -``` - -Note: since only `path` is settable in `mydevice`, `docker plugins set mydevice=/dev/bar myplugin` would work too. - -The following example change the source of the args on the `myplugin` plugin. - -```bash -$ docker plugin inspect -f '{{.Settings.Args}}' myplugin -["foo", "bar"] - -$ docker plugins set myplugin args="foo bar baz" - -$ docker plugin inspect -f '{{.Settings.Args}}' myplugin -["foo", "bar", "baz"] -``` - -## Related information - -* [plugin create](plugin_create.md) -* [plugin disable](plugin_disable.md) -* [plugin enable](plugin_enable.md) -* [plugin inspect](plugin_inspect.md) -* [plugin install](plugin_install.md) -* [plugin ls](plugin_ls.md) -* [plugin push](plugin_push.md) -* [plugin rm](plugin_rm.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_upgrade.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_upgrade.md deleted file mode 100644 index 20efc577a..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_upgrade.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "plugin upgrade" -description: "the plugin upgrade command description and usage" -keywords: "plugin, upgrade" ---- - - - -# plugin upgrade - -```markdown -Usage: docker plugin upgrade [OPTIONS] PLUGIN [REMOTE] - -Upgrade a plugin - -Options: - --disable-content-trust Skip image verification (default true) - --grant-all-permissions Grant all permissions necessary to run the plugin - --help Print usage - --skip-remote-check Do not check if specified remote plugin matches existing plugin image -``` - -Upgrades an existing plugin to the specified remote plugin image. If no remote -is specified, Docker will re-pull the current image and use the updated version. -All existing references to the plugin will continue to work. -The plugin must be disabled before running the upgrade. - -The following example installs `vieus/sshfs` plugin, uses it to create and use -a volume, then upgrades the plugin. - -```bash -$ docker plugin install vieux/sshfs DEBUG=1 - -Plugin "vieux/sshfs:next" is requesting the following privileges: - - network: [host] - - device: [/dev/fuse] - - capabilities: [CAP_SYS_ADMIN] -Do you grant the above permissions? [y/N] y -vieux/sshfs:next - -$ docker volume create -d vieux/sshfs:next -o sshcmd=root@1.2.3.4:/tmp/shared -o password=XXX sshvolume -sshvolume -$ docker run -it -v sshvolume:/data alpine sh -c "touch /data/hello" -$ docker plugin disable -f vieux/sshfs:next -viex/sshfs:next - -# Here docker volume ls doesn't show 'sshfsvolume', since the plugin is disabled -$ docker volume ls -DRIVER VOLUME NAME - -$ docker plugin upgrade vieux/sshfs:next vieux/sshfs:next -Plugin "vieux/sshfs:next" is requesting the following privileges: - - network: [host] - - device: [/dev/fuse] - - capabilities: [CAP_SYS_ADMIN] -Do you grant the above permissions? [y/N] y -Upgrade plugin vieux/sshfs:next to vieux/sshfs:next -$ docker plugin enable vieux/sshfs:next -viex/sshfs:next -$ docker volume ls -DRIVER VOLUME NAME -viuex/sshfs:next sshvolume -$ docker run -it -v sshvolume:/data alpine sh -c "ls /data" -hello -``` - -## Related information - -* [plugin create](plugin_create.md) -* [plugin disable](plugin_disable.md) -* [plugin enable](plugin_enable.md) -* [plugin inspect](plugin_inspect.md) -* [plugin install](plugin_install.md) -* [plugin ls](plugin_ls.md) -* [plugin push](plugin_push.md) -* [plugin rm](plugin_rm.md) -* [plugin set](plugin_set.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/port.md b/vendor/github.com/docker/docker/docs/reference/commandline/port.md deleted file mode 100644 index bc90b6e78..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/port.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "port" -description: "The port command description and usage" -keywords: "port, mapping, container" ---- - - - -# port - -```markdown -Usage: docker port CONTAINER [PRIVATE_PORT[/PROTO]] - -List port mappings or a specific mapping for the container - -Options: - --help Print usage -``` - -You can find out all the ports mapped by not specifying a `PRIVATE_PORT`, or -just a specific mapping: - - $ docker ps - CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES - b650456536c7 busybox:latest top 54 minutes ago Up 54 minutes 0.0.0.0:1234->9876/tcp, 0.0.0.0:4321->7890/tcp test - $ docker port test - 7890/tcp -> 0.0.0.0:4321 - 9876/tcp -> 0.0.0.0:1234 - $ docker port test 7890/tcp - 0.0.0.0:4321 - $ docker port test 7890/udp - 2014/06/24 11:53:36 Error: No public port '7890/udp' published for test - $ docker port test 7890 - 0.0.0.0:4321 diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/ps.md b/vendor/github.com/docker/docker/docs/reference/commandline/ps.md deleted file mode 100644 index 1d5f31da8..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/ps.md +++ /dev/null @@ -1,384 +0,0 @@ ---- -title: "ps" -description: "The ps command description and usage" -keywords: "container, running, list" ---- - - - -# ps - -```markdown -Usage: docker ps [OPTIONS] - -List containers - -Options: - -a, --all Show all containers (default shows just running) - -f, --filter value Filter output based on conditions provided (default []) - - exited= an exit code of - - label= or label== - - status=(created|restarting|removing|running|paused|exited) - - name= a container's name - - id= a container's ID - - before=(|) - - since=(|) - - ancestor=([:tag]||) - containers created from an image or a descendant. - - is-task=(true|false) - - health=(starting|healthy|unhealthy|none) - --format string Pretty-print containers using a Go template - --help Print usage - -n, --last int Show n last created containers (includes all states) (default -1) - -l, --latest Show the latest created container (includes all states) - --no-trunc Don't truncate output - -q, --quiet Only display numeric IDs - -s, --size Display total file sizes -``` - -Running `docker ps --no-trunc` showing 2 linked containers. - -```bash -$ docker ps - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -4c01db0b339c ubuntu:12.04 bash 17 seconds ago Up 16 seconds 3300-3310/tcp webapp -d7886598dbe2 crosbymichael/redis:latest /redis-server --dir 33 minutes ago Up 33 minutes 6379/tcp redis,webapp/db -``` - -The `docker ps` command only shows running containers by default. To see all -containers, use the `-a` (or `--all`) flag: - -```bash -$ docker ps -a -``` - -`docker ps` groups exposed ports into a single range if possible. E.g., a -container that exposes TCP ports `100, 101, 102` displays `100-102/tcp` in -the `PORTS` column. - -## Filtering - -The filtering flag (`-f` or `--filter`) format is a `key=value` pair. If there is more -than one filter, then pass multiple flags (e.g. `--filter "foo=bar" --filter "bif=baz"`) - -The currently supported filters are: - -* id (container's id) -* label (`label=` or `label==`) -* name (container's name) -* exited (int - the code of exited containers. Only useful with `--all`) -* status (created|restarting|running|removing|paused|exited|dead) -* ancestor (`[:]`, `` or ``) - filters containers that were created from the given image or a descendant. -* before (container's id or name) - filters containers created before given id or name -* since (container's id or name) - filters containers created since given id or name -* isolation (default|process|hyperv) (Windows daemon only) -* volume (volume name or mount point) - filters containers that mount volumes. -* network (network id or name) - filters containers connected to the provided network -* health (starting|healthy|unhealthy|none) - filters containers based on healthcheck status - -#### Label - -The `label` filter matches containers based on the presence of a `label` alone or a `label` and a -value. - -The following filter matches containers with the `color` label regardless of its value. - -```bash -$ docker ps --filter "label=color" - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -673394ef1d4c busybox "top" 47 seconds ago Up 45 seconds nostalgic_shockley -d85756f57265 busybox "top" 52 seconds ago Up 51 seconds high_albattani -``` - -The following filter matches containers with the `color` label with the `blue` value. - -```bash -$ docker ps --filter "label=color=blue" - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -d85756f57265 busybox "top" About a minute ago Up About a minute high_albattani -``` - -#### Name - -The `name` filter matches on all or part of a container's name. - -The following filter matches all containers with a name containing the `nostalgic_stallman` string. - -```bash -$ docker ps --filter "name=nostalgic_stallman" - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -9b6247364a03 busybox "top" 2 minutes ago Up 2 minutes nostalgic_stallman -``` - -You can also filter for a substring in a name as this shows: - -```bash -$ docker ps --filter "name=nostalgic" - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -715ebfcee040 busybox "top" 3 seconds ago Up 1 second i_am_nostalgic -9b6247364a03 busybox "top" 7 minutes ago Up 7 minutes nostalgic_stallman -673394ef1d4c busybox "top" 38 minutes ago Up 38 minutes nostalgic_shockley -``` - -#### Exited - -The `exited` filter matches containers by exist status code. For example, to -filter for containers that have exited successfully: - -```bash -$ docker ps -a --filter 'exited=0' - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -ea09c3c82f6e registry:latest /srv/run.sh 2 weeks ago Exited (0) 2 weeks ago 127.0.0.1:5000->5000/tcp desperate_leakey -106ea823fe4e fedora:latest /bin/sh -c 'bash -l' 2 weeks ago Exited (0) 2 weeks ago determined_albattani -48ee228c9464 fedora:20 bash 2 weeks ago Exited (0) 2 weeks ago tender_torvalds -``` - -#### Killed containers - -You can use a filter to locate containers that exited with status of `137` -meaning a `SIGKILL(9)` killed them. - -```bash -$ docker ps -a --filter 'exited=137' -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -b3e1c0ed5bfe ubuntu:latest "sleep 1000" 12 seconds ago Exited (137) 5 seconds ago grave_kowalevski -a2eb5558d669 redis:latest "/entrypoint.sh redi 2 hours ago Exited (137) 2 hours ago sharp_lalande -``` - -Any of these events result in a `137` status: - -* the `init` process of the container is killed manually -* `docker kill` kills the container -* Docker daemon restarts which kills all running containers - -#### Status - -The `status` filter matches containers by status. You can filter using -`created`, `restarting`, `running`, `removing`, `paused`, `exited` and `dead`. For example, -to filter for `running` containers: - -```bash -$ docker ps --filter status=running - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -715ebfcee040 busybox "top" 16 minutes ago Up 16 minutes i_am_nostalgic -d5c976d3c462 busybox "top" 23 minutes ago Up 23 minutes top -9b6247364a03 busybox "top" 24 minutes ago Up 24 minutes nostalgic_stallman -``` - -To filter for `paused` containers: - -```bash -$ docker ps --filter status=paused - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -673394ef1d4c busybox "top" About an hour ago Up About an hour (Paused) nostalgic_shockley -``` - -#### Ancestor - -The `ancestor` filter matches containers based on its image or a descendant of -it. The filter supports the following image representation: - -- image -- image:tag -- image:tag@digest -- short-id -- full-id - -If you don't specify a `tag`, the `latest` tag is used. For example, to filter -for containers that use the latest `ubuntu` image: - -```bash -$ docker ps --filter ancestor=ubuntu - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -919e1179bdb8 ubuntu-c1 "top" About a minute ago Up About a minute admiring_lovelace -5d1e4a540723 ubuntu-c2 "top" About a minute ago Up About a minute admiring_sammet -82a598284012 ubuntu "top" 3 minutes ago Up 3 minutes sleepy_bose -bab2a34ba363 ubuntu "top" 3 minutes ago Up 3 minutes focused_yonath -``` - -Match containers based on the `ubuntu-c1` image which, in this case, is a child -of `ubuntu`: - -```bash -$ docker ps --filter ancestor=ubuntu-c1 - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -919e1179bdb8 ubuntu-c1 "top" About a minute ago Up About a minute admiring_lovelace -``` - -Match containers based on the `ubuntu` version `12.04.5` image: - -```bash -$ docker ps --filter ancestor=ubuntu:12.04.5 - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -82a598284012 ubuntu:12.04.5 "top" 3 minutes ago Up 3 minutes sleepy_bose -``` - -The following matches containers based on the layer `d0e008c6cf02` or an image -that have this layer in its layer stack. - -```bash -$ docker ps --filter ancestor=d0e008c6cf02 - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -82a598284012 ubuntu:12.04.5 "top" 3 minutes ago Up 3 minutes sleepy_bose -``` - -#### Before - -The `before` filter shows only containers created before the container with -given id or name. For example, having these containers created: - -```bash -$ docker ps - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -9c3527ed70ce busybox "top" 14 seconds ago Up 15 seconds desperate_dubinsky -4aace5031105 busybox "top" 48 seconds ago Up 49 seconds focused_hamilton -6e63f6ff38b0 busybox "top" About a minute ago Up About a minute distracted_fermat -``` - -Filtering with `before` would give: - -```bash -$ docker ps -f before=9c3527ed70ce - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -4aace5031105 busybox "top" About a minute ago Up About a minute focused_hamilton -6e63f6ff38b0 busybox "top" About a minute ago Up About a minute distracted_fermat -``` - -#### Since - -The `since` filter shows only containers created since the container with given -id or name. For example, with the same containers as in `before` filter: - -```bash -$ docker ps -f since=6e63f6ff38b0 - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -9c3527ed70ce busybox "top" 10 minutes ago Up 10 minutes desperate_dubinsky -4aace5031105 busybox "top" 10 minutes ago Up 10 minutes focused_hamilton -``` - -#### Volume - -The `volume` filter shows only containers that mount a specific volume or have -a volume mounted in a specific path: - -```bash{% raw %} -$ docker ps --filter volume=remote-volume --format "table {{.ID}}\t{{.Mounts}}" -CONTAINER ID MOUNTS -9c3527ed70ce remote-volume - -$ docker ps --filter volume=/data --format "table {{.ID}}\t{{.Mounts}}" -CONTAINER ID MOUNTS -9c3527ed70ce remote-volume -{% endraw %}``` - -#### Network - -The `network` filter shows only containers that are connected to a network with -a given name or id. - -The following filter matches all containers that are connected to a network -with a name containing `net1`. - -```bash -$ docker run -d --net=net1 --name=test1 ubuntu top -$ docker run -d --net=net2 --name=test2 ubuntu top - -$ docker ps --filter network=net1 - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -9d4893ed80fe ubuntu "top" 10 minutes ago Up 10 minutes test1 -``` - -The network filter matches on both the network's name and id. The following -example shows all containers that are attached to the `net1` network, using -the network id as a filter; - -```bash -{% raw %} -$ docker network inspect --format "{{.ID}}" net1 -{% endraw %} - -8c0b4110ae930dbe26b258de9bc34a03f98056ed6f27f991d32919bfe401d7c5 - -$ docker ps --filter network=8c0b4110ae930dbe26b258de9bc34a03f98056ed6f27f991d32919bfe401d7c5 - -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -9d4893ed80fe ubuntu "top" 10 minutes ago Up 10 minutes test1 -``` - -## Formatting - -The formatting option (`--format`) pretty-prints container output using a Go -template. - -Valid placeholders for the Go template are listed below: - -Placeholder | Description ---------------|---------------------------------------------------------------------------------------------------- -`.ID` | Container ID -`.Image` | Image ID -`.Command` | Quoted command -`.CreatedAt` | Time when the container was created. -`.RunningFor` | Elapsed time since the container was started. -`.Ports` | Exposed ports. -`.Status` | Container status. -`.Size` | Container disk size. -`.Names` | Container names. -`.Labels` | All labels assigned to the container. -`.Label` | Value of a specific label for this container. For example `'{% raw %}{{.Label "com.docker.swarm.cpu"}}{% endraw %}'` -`.Mounts` | Names of the volumes mounted in this container. -`.Networks` | Names of the networks attached to this container. - -When using the `--format` option, the `ps` command will either output the data -exactly as the template declares or, when using the `table` directive, includes -column headers as well. - -The following example uses a template without headers and outputs the `ID` and -`Command` entries separated by a colon for all running containers: - -```bash -{% raw %} -$ docker ps --format "{{.ID}}: {{.Command}}" -{% endraw %} - -a87ecb4f327c: /bin/sh -c #(nop) MA -01946d9d34d8: /bin/sh -c #(nop) MA -c1d3b0166030: /bin/sh -c yum -y up -41d50ecd2f57: /bin/sh -c #(nop) MA -``` - -To list all running containers with their labels in a table format you can use: - -```bash -{% raw %} -$ docker ps --format "table {{.ID}}\t{{.Labels}}" -{% endraw %} - -CONTAINER ID LABELS -a87ecb4f327c com.docker.swarm.node=ubuntu,com.docker.swarm.storage=ssd -01946d9d34d8 -c1d3b0166030 com.docker.swarm.node=debian,com.docker.swarm.cpu=6 -41d50ecd2f57 com.docker.swarm.node=fedora,com.docker.swarm.cpu=3,com.docker.swarm.storage=ssd -``` diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/pull.md b/vendor/github.com/docker/docker/docs/reference/commandline/pull.md deleted file mode 100644 index 0c960b404..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/pull.md +++ /dev/null @@ -1,252 +0,0 @@ ---- -title: "pull" -description: "The pull command description and usage" -keywords: "pull, image, hub, docker" ---- - - - -# pull - -```markdown -Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST] - -Pull an image or a repository from a registry - -Options: - -a, --all-tags Download all tagged images in the repository - --disable-content-trust Skip image verification (default true) - --help Print usage -``` - -Most of your images will be created on top of a base image from the -[Docker Hub](https://hub.docker.com) registry. - -[Docker Hub](https://hub.docker.com) contains many pre-built images that you -can `pull` and try without needing to define and configure your own. - -To download a particular image, or set of images (i.e., a repository), -use `docker pull`. - -## Proxy configuration - -If you are behind an HTTP proxy server, for example in corporate settings, -before open a connect to registry, you may need to configure the Docker -daemon's proxy settings, using the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` -environment variables. To set these environment variables on a host using -`systemd`, refer to the [control and configure Docker with systemd](https://docs.docker.com/engine/admin/systemd/#http-proxy) -for variables configuration. - -## Concurrent downloads - -By default the Docker daemon will pull three layers of an image at a time. -If you are on a low bandwidth connection this may cause timeout issues and you may want to lower -this via the `--max-concurrent-downloads` daemon option. See the -[daemon documentation](dockerd.md) for more details. - -## Examples - -### Pull an image from Docker Hub - -To download a particular image, or set of images (i.e., a repository), use -`docker pull`. If no tag is provided, Docker Engine uses the `:latest` tag as a -default. This command pulls the `debian:latest` image: - -```bash -$ docker pull debian - -Using default tag: latest -latest: Pulling from library/debian -fdd5d7827f33: Pull complete -a3ed95caeb02: Pull complete -Digest: sha256:e7d38b3517548a1c71e41bffe9c8ae6d6d29546ce46bf62159837aad072c90aa -Status: Downloaded newer image for debian:latest -``` - -Docker images can consist of multiple layers. In the example above, the image -consists of two layers; `fdd5d7827f33` and `a3ed95caeb02`. - -Layers can be reused by images. For example, the `debian:jessie` image shares -both layers with `debian:latest`. Pulling the `debian:jessie` image therefore -only pulls its metadata, but not its layers, because all layers are already -present locally: - -```bash -$ docker pull debian:jessie - -jessie: Pulling from library/debian -fdd5d7827f33: Already exists -a3ed95caeb02: Already exists -Digest: sha256:a9c958be96d7d40df920e7041608f2f017af81800ca5ad23e327bc402626b58e -Status: Downloaded newer image for debian:jessie -``` - -To see which images are present locally, use the [`docker images`](images.md) -command: - -```bash -$ docker images - -REPOSITORY TAG IMAGE ID CREATED SIZE -debian jessie f50f9524513f 5 days ago 125.1 MB -debian latest f50f9524513f 5 days ago 125.1 MB -``` - -Docker uses a content-addressable image store, and the image ID is a SHA256 -digest covering the image's configuration and layers. In the example above, -`debian:jessie` and `debian:latest` have the same image ID because they are -actually the *same* image tagged with different names. Because they are the -same image, their layers are stored only once and do not consume extra disk -space. - -For more information about images, layers, and the content-addressable store, -refer to [understand images, containers, and storage drivers](https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/). - - -## Pull an image by digest (immutable identifier) - -So far, you've pulled images by their name (and "tag"). Using names and tags is -a convenient way to work with images. When using tags, you can `docker pull` an -image again to make sure you have the most up-to-date version of that image. -For example, `docker pull ubuntu:14.04` pulls the latest version of the Ubuntu -14.04 image. - -In some cases you don't want images to be updated to newer versions, but prefer -to use a fixed version of an image. Docker enables you to pull an image by its -*digest*. When pulling an image by digest, you specify *exactly* which version -of an image to pull. Doing so, allows you to "pin" an image to that version, -and guarantee that the image you're using is always the same. - -To know the digest of an image, pull the image first. Let's pull the latest -`ubuntu:14.04` image from Docker Hub: - -```bash -$ docker pull ubuntu:14.04 - -14.04: Pulling from library/ubuntu -5a132a7e7af1: Pull complete -fd2731e4c50c: Pull complete -28a2f68d1120: Pull complete -a3ed95caeb02: Pull complete -Digest: sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 -Status: Downloaded newer image for ubuntu:14.04 -``` - -Docker prints the digest of the image after the pull has finished. In the example -above, the digest of the image is: - - sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 - -Docker also prints the digest of an image when *pushing* to a registry. This -may be useful if you want to pin to a version of the image you just pushed. - -A digest takes the place of the tag when pulling an image, for example, to -pull the above image by digest, run the following command: - -```bash -$ docker pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 - -sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2: Pulling from library/ubuntu -5a132a7e7af1: Already exists -fd2731e4c50c: Already exists -28a2f68d1120: Already exists -a3ed95caeb02: Already exists -Digest: sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 -Status: Downloaded newer image for ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 -``` - -Digest can also be used in the `FROM` of a Dockerfile, for example: - -```Dockerfile -FROM ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 -MAINTAINER some maintainer -``` - -> **Note**: Using this feature "pins" an image to a specific version in time. -> Docker will therefore not pull updated versions of an image, which may include -> security updates. If you want to pull an updated image, you need to change the -> digest accordingly. - - -## Pulling from a different registry - -By default, `docker pull` pulls images from [Docker Hub](https://hub.docker.com). It is also possible to -manually specify the path of a registry to pull from. For example, if you have -set up a local registry, you can specify its path to pull from it. A registry -path is similar to a URL, but does not contain a protocol specifier (`https://`). - -The following command pulls the `testing/test-image` image from a local registry -listening on port 5000 (`myregistry.local:5000`): - -```bash -$ docker pull myregistry.local:5000/testing/test-image -``` - -Registry credentials are managed by [docker login](login.md). - -Docker uses the `https://` protocol to communicate with a registry, unless the -registry is allowed to be accessed over an insecure connection. Refer to the -[insecure registries](dockerd.md#insecure-registries) section for more information. - - -## Pull a repository with multiple images - -By default, `docker pull` pulls a *single* image from the registry. A repository -can contain multiple images. To pull all images from a repository, provide the -`-a` (or `--all-tags`) option when using `docker pull`. - -This command pulls all images from the `fedora` repository: - -```bash -$ docker pull --all-tags fedora - -Pulling repository fedora -ad57ef8d78d7: Download complete -105182bb5e8b: Download complete -511136ea3c5a: Download complete -73bd853d2ea5: Download complete -.... - -Status: Downloaded newer image for fedora -``` - -After the pull has completed use the `docker images` command to see the -images that were pulled. The example below shows all the `fedora` images -that are present locally: - -```bash -$ docker images fedora - -REPOSITORY TAG IMAGE ID CREATED SIZE -fedora rawhide ad57ef8d78d7 5 days ago 359.3 MB -fedora 20 105182bb5e8b 5 days ago 372.7 MB -fedora heisenbug 105182bb5e8b 5 days ago 372.7 MB -fedora latest 105182bb5e8b 5 days ago 372.7 MB -``` - -## Canceling a pull - -Killing the `docker pull` process, for example by pressing `CTRL-c` while it is -running in a terminal, will terminate the pull operation. - -```bash -$ docker pull fedora - -Using default tag: latest -latest: Pulling from library/fedora -a3ed95caeb02: Pulling fs layer -236608c7b546: Pulling fs layer -^C -``` - -> **Note**: Technically, the Engine terminates a pull operation when the -> connection between the Docker Engine daemon and the Docker Engine client -> initiating the pull is lost. If the connection with the Engine daemon is -> lost for other reasons than a manual interaction, the pull is also aborted. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/push.md b/vendor/github.com/docker/docker/docs/reference/commandline/push.md deleted file mode 100644 index e36fd026d..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/push.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "push" -description: "The push command description and usage" -keywords: "share, push, image" ---- - - - -# push - -```markdown -Usage: docker push [OPTIONS] NAME[:TAG] - -Push an image or a repository to a registry - -Options: - --disable-content-trust Skip image verification (default true) - --help Print usage -``` - -Use `docker push` to share your images to the [Docker Hub](https://hub.docker.com) -registry or to a self-hosted one. - -Refer to the [`docker tag`](tag.md) reference for more information about valid -image and tag names. - -Killing the `docker push` process, for example by pressing `CTRL-c` while it is -running in a terminal, terminates the push operation. - -Registry credentials are managed by [docker login](login.md). - -## Concurrent uploads - -By default the Docker daemon will push five layers of an image at a time. -If you are on a low bandwidth connection this may cause timeout issues and you may want to lower -this via the `--max-concurrent-uploads` daemon option. See the -[daemon documentation](dockerd.md) for more details. - -## Examples - -### Pushing a new image to a registry - -First save the new image by finding the container ID (using [`docker ps`](ps.md)) -and then committing it to a new image name. Note that only `a-z0-9-_.` are -allowed when naming images: - -```bash -$ docker commit c16378f943fe rhel-httpd -``` - -Now, push the image to the registry using the image ID. In this example the -registry is on host named `registry-host` and listening on port `5000`. To do -this, tag the image with the host name or IP address, and the port of the -registry: - -```bash -$ docker tag rhel-httpd registry-host:5000/myadmin/rhel-httpd -$ docker push registry-host:5000/myadmin/rhel-httpd -``` - -Check that this worked by running: - -```bash -$ docker images -``` - -You should see both `rhel-httpd` and `registry-host:5000/myadmin/rhel-httpd` -listed. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/rename.md b/vendor/github.com/docker/docker/docs/reference/commandline/rename.md deleted file mode 100644 index be035f1ce..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/rename.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "rename" -description: "The rename command description and usage" -keywords: "rename, docker, container" ---- - - - -# rename - -```markdown -Usage: docker rename CONTAINER NEW_NAME - -Rename a container - -Options: - --help Print usage -``` - -The `docker rename` command allows the container to be renamed to a different name. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/restart.md b/vendor/github.com/docker/docker/docs/reference/commandline/restart.md deleted file mode 100644 index 9f7ed0055..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/restart.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "restart" -description: "The restart command description and usage" -keywords: "restart, container, Docker" ---- - - - -# restart - -```markdown -Usage: docker restart [OPTIONS] CONTAINER [CONTAINER...] - -Restart one or more containers - -Options: - --help Print usage - -t, --time int Seconds to wait for stop before killing the container (default 10) -``` diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/rm.md b/vendor/github.com/docker/docker/docs/reference/commandline/rm.md deleted file mode 100644 index 1c3e79593..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/rm.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "rm" -description: "The rm command description and usage" -keywords: "remove, Docker, container" ---- - - - -# rm - -```markdown -Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...] - -Remove one or more containers - -Options: - -f, --force Force the removal of a running container (uses SIGKILL) - --help Print usage - -l, --link Remove the specified link - -v, --volumes Remove the volumes associated with the container -``` - -## Examples - - $ docker rm /redis - /redis - -This will remove the container referenced under the link -`/redis`. - - $ docker rm --link /webapp/redis - /webapp/redis - -This will remove the underlying link between `/webapp` and the `/redis` -containers removing all network communication. - - $ docker rm --force redis - redis - -The main process inside the container referenced under the link `/redis` will receive -`SIGKILL`, then the container will be removed. - - $ docker rm $(docker ps -a -q) - -This command will delete all stopped containers. The command -`docker ps -a -q` will return all existing container IDs and pass them to -the `rm` command which will delete them. Any running containers will not be -deleted. - - $ docker rm -v redis - redis - -This command will remove the container and any volumes associated with it. -Note that if a volume was specified with a name, it will not be removed. - - $ docker create -v awesome:/foo -v /bar --name hello redis - hello - $ docker rm -v hello - -In this example, the volume for `/foo` will remain intact, but the volume for -`/bar` will be removed. The same behavior holds for volumes inherited with -`--volumes-from`. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/rmi.md b/vendor/github.com/docker/docker/docs/reference/commandline/rmi.md deleted file mode 100644 index 149b7635b..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/rmi.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: "rmi" -description: "The rmi command description and usage" -keywords: "remove, image, Docker" ---- - - - -# rmi - -```markdown -Usage: docker rmi [OPTIONS] IMAGE [IMAGE...] - -Remove one or more images - -Options: - -f, --force Force removal of the image - --help Print usage - --no-prune Do not delete untagged parents -``` - -You can remove an image using its short or long ID, its tag, or its digest. If -an image has one or more tag referencing it, you must remove all of them before -the image is removed. Digest references are removed automatically when an image -is removed by tag. - - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) - test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) - test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) - - $ docker rmi fd484f19954f - Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories, use -f to force - 2013/12/11 05:47:16 Error: failed to remove one or more images - - $ docker rmi test1 - Untagged: test1:latest - $ docker rmi test2 - Untagged: test2:latest - - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) - $ docker rmi test - Untagged: test:latest - Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8 - -If you use the `-f` flag and specify the image's short or long ID, then this -command untags and removes all images that match the specified ID. - - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) - test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) - test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) - - $ docker rmi -f fd484f19954f - Untagged: test1:latest - Untagged: test:latest - Untagged: test2:latest - Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8 - -An image pulled by digest has no tag associated with it: - - $ docker images --digests - REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE - localhost:5000/test/busybox sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 4986bf8c1536 9 weeks ago 2.43 MB - -To remove an image using its digest: - - $ docker rmi localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf - Untagged: localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf - Deleted: 4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125 - Deleted: ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2 - Deleted: df7546f9f060a2268024c8a230d8639878585defcc1bc6f79d2728a13957871b diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/run.md b/vendor/github.com/docker/docker/docs/reference/commandline/run.md deleted file mode 100644 index e57ba4bbe..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/run.md +++ /dev/null @@ -1,732 +0,0 @@ ---- -title: "run" -description: "The run command description and usage" -keywords: "run, command, container" ---- - - - -# run - -```markdown -Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] - -Run a command in a new container - -Options: - --add-host value Add a custom host-to-IP mapping (host:ip) (default []) - -a, --attach value Attach to STDIN, STDOUT or STDERR (default []) - --blkio-weight value Block IO (relative weight), between 10 and 1000 - --blkio-weight-device value Block IO weight (relative device weight) (default []) - --cap-add value Add Linux capabilities (default []) - --cap-drop value Drop Linux capabilities (default []) - --cgroup-parent string Optional parent cgroup for the container - --cidfile string Write the container ID to the file - --cpu-count int The number of CPUs available for execution by the container. - Windows daemon only. On Windows Server containers, this is - approximated as a percentage of total CPU usage. - --cpu-percent int Limit percentage of CPU available for execution - by the container. Windows daemon only. - The processor resource controls are mutually - exclusive, the order of precedence is CPUCount - first, then CPUShares, and CPUPercent last. - --cpu-period int Limit CPU CFS (Completely Fair Scheduler) period - --cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota - -c, --cpu-shares int CPU shares (relative weight) - --cpus NanoCPUs Number of CPUs (default 0.000) - --cpu-rt-period int Limit the CPU real-time period in microseconds - --cpu-rt-runtime int Limit the CPU real-time runtime in microseconds - --cpuset-cpus string CPUs in which to allow execution (0-3, 0,1) - --cpuset-mems string MEMs in which to allow execution (0-3, 0,1) - -d, --detach Run container in background and print container ID - --detach-keys string Override the key sequence for detaching a container - --device value Add a host device to the container (default []) - --device-read-bps value Limit read rate (bytes per second) from a device (default []) - --device-read-iops value Limit read rate (IO per second) from a device (default []) - --device-write-bps value Limit write rate (bytes per second) to a device (default []) - --device-write-iops value Limit write rate (IO per second) to a device (default []) - --disable-content-trust Skip image verification (default true) - --dns value Set custom DNS servers (default []) - --dns-option value Set DNS options (default []) - --dns-search value Set custom DNS search domains (default []) - --entrypoint string Overwrite the default ENTRYPOINT of the image - -e, --env value Set environment variables (default []) - --env-file value Read in a file of environment variables (default []) - --expose value Expose a port or a range of ports (default []) - --group-add value Add additional groups to join (default []) - --health-cmd string Command to run to check health - --health-interval duration Time between running the check (ns|us|ms|s|m|h) (default 0s) - --health-retries int Consecutive failures needed to report unhealthy - --health-timeout duration Maximum time to allow one check to run (ns|us|ms|s|m|h) (default 0s) - --help Print usage - -h, --hostname string Container host name - --init Run an init inside the container that forwards signals and reaps processes - --init-path string Path to the docker-init binary - -i, --interactive Keep STDIN open even if not attached - --io-maxbandwidth string Maximum IO bandwidth limit for the system drive (Windows only) - (Windows only). The format is ``. - Unit is optional and can be `b` (bytes per second), - `k` (kilobytes per second), `m` (megabytes per second), - or `g` (gigabytes per second). If you omit the unit, - the system uses bytes per second. - --io-maxbandwidth and --io-maxiops are mutually exclusive options. - --io-maxiops uint Maximum IOps limit for the system drive (Windows only) - --ip string Container IPv4 address (e.g. 172.30.100.104) - --ip6 string Container IPv6 address (e.g. 2001:db8::33) - --ipc string IPC namespace to use - --isolation string Container isolation technology - --kernel-memory string Kernel memory limit - -l, --label value Set meta data on a container (default []) - --label-file value Read in a line delimited file of labels (default []) - --link value Add link to another container (default []) - --link-local-ip value Container IPv4/IPv6 link-local addresses (default []) - --log-driver string Logging driver for the container - --log-opt value Log driver options (default []) - --mac-address string Container MAC address (e.g. 92:d0:c6:0a:29:33) - -m, --memory string Memory limit - --memory-reservation string Memory soft limit - --memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap - --memory-swappiness int Tune container memory swappiness (0 to 100) (default -1) - --name string Assign a name to the container - --network-alias value Add network-scoped alias for the container (default []) - --network string Connect a container to a network - 'bridge': create a network stack on the default Docker bridge - 'none': no networking - 'container:': reuse another container's network stack - 'host': use the Docker host network stack - '|': connect to a user-defined network - --no-healthcheck Disable any container-specified HEALTHCHECK - --oom-kill-disable Disable OOM Killer - --oom-score-adj int Tune host's OOM preferences (-1000 to 1000) - --pid string PID namespace to use - --pids-limit int Tune container pids limit (set -1 for unlimited) - --privileged Give extended privileges to this container - -p, --publish value Publish a container's port(s) to the host (default []) - -P, --publish-all Publish all exposed ports to random ports - --read-only Mount the container's root filesystem as read only - --restart string Restart policy to apply when a container exits (default "no") - Possible values are : no, on-failure[:max-retry], always, unless-stopped - --rm Automatically remove the container when it exits - --runtime string Runtime to use for this container - --security-opt value Security Options (default []) - --shm-size string Size of /dev/shm, default value is 64MB. - The format is ``. `number` must be greater than `0`. - Unit is optional and can be `b` (bytes), `k` (kilobytes), `m` (megabytes), - or `g` (gigabytes). If you omit the unit, the system uses bytes. - --sig-proxy Proxy received signals to the process (default true) - --stop-signal string Signal to stop a container, SIGTERM by default (default "SIGTERM") - --stop-timeout=10 Timeout (in seconds) to stop a container - --storage-opt value Storage driver options for the container (default []) - --sysctl value Sysctl options (default map[]) - --tmpfs value Mount a tmpfs directory (default []) - -t, --tty Allocate a pseudo-TTY - --ulimit value Ulimit options (default []) - -u, --user string Username or UID (format: [:]) - --userns string User namespace to use - 'host': Use the Docker host user namespace - '': Use the Docker daemon user namespace specified by `--userns-remap` option. - --uts string UTS namespace to use - -v, --volume value Bind mount a volume (default []). The format - is `[host-src:]container-dest[:]`. - The comma-delimited `options` are [rw|ro], - [z|Z], [[r]shared|[r]slave|[r]private], and - [nocopy]. The 'host-src' is an absolute path - or a name value. - --volume-driver string Optional volume driver for the container - --volumes-from value Mount volumes from the specified container(s) (default []) - -w, --workdir string Working directory inside the container -``` - -The `docker run` command first `creates` a writeable container layer over the -specified image, and then `starts` it using the specified command. That is, -`docker run` is equivalent to the API `/containers/create` then -`/containers/(id)/start`. A stopped container can be restarted with all its -previous changes intact using `docker start`. See `docker ps -a` to view a list -of all containers. - -The `docker run` command can be used in combination with `docker commit` to -[*change the command that a container runs*](commit.md). There is additional detailed information about `docker run` in the [Docker run reference](../run.md). - -For information on connecting a container to a network, see the ["*Docker network overview*"](https://docs.docker.com/engine/userguide/networking/). - -## Examples - -### Assign name and allocate pseudo-TTY (--name, -it) - - $ docker run --name test -it debian - root@d6c0fe130dba:/# exit 13 - $ echo $? - 13 - $ docker ps -a | grep test - d6c0fe130dba debian:7 "/bin/bash" 26 seconds ago Exited (13) 17 seconds ago test - -This example runs a container named `test` using the `debian:latest` -image. The `-it` instructs Docker to allocate a pseudo-TTY connected to -the container's stdin; creating an interactive `bash` shell in the container. -In the example, the `bash` shell is quit by entering -`exit 13`. This exit code is passed on to the caller of -`docker run`, and is recorded in the `test` container's metadata. - -### Capture container ID (--cidfile) - - $ docker run --cidfile /tmp/docker_test.cid ubuntu echo "test" - -This will create a container and print `test` to the console. The `cidfile` -flag makes Docker attempt to create a new file and write the container ID to it. -If the file exists already, Docker will return an error. Docker will close this -file when `docker run` exits. - -### Full container capabilities (--privileged) - - $ docker run -t -i --rm ubuntu bash - root@bc338942ef20:/# mount -t tmpfs none /mnt - mount: permission denied - -This will *not* work, because by default, most potentially dangerous kernel -capabilities are dropped; including `cap_sys_admin` (which is required to mount -filesystems). However, the `--privileged` flag will allow it to run: - - $ docker run -t -i --privileged ubuntu bash - root@50e3f57e16e6:/# mount -t tmpfs none /mnt - root@50e3f57e16e6:/# df -h - Filesystem Size Used Avail Use% Mounted on - none 1.9G 0 1.9G 0% /mnt - -The `--privileged` flag gives *all* capabilities to the container, and it also -lifts all the limitations enforced by the `device` cgroup controller. In other -words, the container can then do almost everything that the host can do. This -flag exists to allow special use-cases, like running Docker within Docker. - -### Set working directory (-w) - - $ docker run -w /path/to/dir/ -i -t ubuntu pwd - -The `-w` lets the command being executed inside directory given, here -`/path/to/dir/`. If the path does not exist it is created inside the container. - -### Set storage driver options per container - - $ docker run -it --storage-opt size=120G fedora /bin/bash - -This (size) will allow to set the container rootfs size to 120G at creation time. -This option is only available for the `devicemapper`, `btrfs`, `overlay2`, -`windowsfilter` and `zfs` graph drivers. -For the `devicemapper`, `btrfs`, `windowsfilter` and `zfs` graph drivers, -user cannot pass a size less than the Default BaseFS Size. -For the `overlay2` storage driver, the size option is only available if the -backing fs is `xfs` and mounted with the `pquota` mount option. -Under these conditions, user can pass any size less then the backing fs size. - -### Mount tmpfs (--tmpfs) - - $ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image - -The `--tmpfs` flag mounts an empty tmpfs into the container with the `rw`, -`noexec`, `nosuid`, `size=65536k` options. - -### Mount volume (-v, --read-only) - - $ docker run -v `pwd`:`pwd` -w `pwd` -i -t ubuntu pwd - -The `-v` flag mounts the current working directory into the container. The `-w` -lets the command being executed inside the current working directory, by -changing into the directory to the value returned by `pwd`. So this -combination executes the command using the container, but inside the -current working directory. - - $ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash - -When the host directory of a bind-mounted volume doesn't exist, Docker -will automatically create this directory on the host for you. In the -example above, Docker will create the `/doesnt/exist` -folder before starting your container. - - $ docker run --read-only -v /icanwrite busybox touch /icanwrite/here - -Volumes can be used in combination with `--read-only` to control where -a container writes files. The `--read-only` flag mounts the container's root -filesystem as read only prohibiting writes to locations other than the -specified volumes for the container. - - $ docker run -t -i -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/static-docker-binary:/usr/bin/docker busybox sh - -By bind-mounting the docker unix socket and statically linked docker -binary (refer to [get the linux binary]( -https://docs.docker.com/engine/installation/binaries/#/get-the-linux-binary)), -you give the container the full access to create and manipulate the host's -Docker daemon. - -On Windows, the paths must be specified using Windows-style semantics. - - PS C:\> docker run -v c:\foo:c:\dest microsoft/nanoserver cmd /s /c type c:\dest\somefile.txt - Contents of file - - PS C:\> docker run -v c:\foo:d: microsoft/nanoserver cmd /s /c type d:\somefile.txt - Contents of file - -The following examples will fail when using Windows-based containers, as the -destination of a volume or bind-mount inside the container must be one of: -a non-existing or empty directory; or a drive other than C:. Further, the source -of a bind mount must be a local directory, not a file. - - net use z: \\remotemachine\share - docker run -v z:\foo:c:\dest ... - docker run -v \\uncpath\to\directory:c:\dest ... - docker run -v c:\foo\somefile.txt:c:\dest ... - docker run -v c:\foo:c: ... - docker run -v c:\foo:c:\existing-directory-with-contents ... - -For in-depth information about volumes, refer to [manage data in containers](https://docs.docker.com/engine/tutorials/dockervolumes/) - -### Publish or expose port (-p, --expose) - - $ docker run -p 127.0.0.1:80:8080 ubuntu bash - -This binds port `8080` of the container to port `80` on `127.0.0.1` of the host -machine. The [Docker User -Guide](https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/) -explains in detail how to manipulate ports in Docker. - - $ docker run --expose 80 ubuntu bash - -This exposes port `80` of the container without publishing the port to the host -system's interfaces. - -### Set environment variables (-e, --env, --env-file) - - $ docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash - -This sets simple (non-array) environmental variables in the container. For -illustration all three -flags are shown here. Where `-e`, `--env` take an environment variable and -value, or if no `=` is provided, then that variable's current value, set via -`export`, is passed through (i.e. `$MYVAR1` from the host is set to `$MYVAR1` -in the container). When no `=` is provided and that variable is not defined -in the client's environment then that variable will be removed from the -container's list of environment variables. All three flags, `-e`, `--env` and -`--env-file` can be repeated. - -Regardless of the order of these three flags, the `--env-file` are processed -first, and then `-e`, `--env` flags. This way, the `-e` or `--env` will -override variables as needed. - - $ cat ./env.list - TEST_FOO=BAR - $ docker run --env TEST_FOO="This is a test" --env-file ./env.list busybox env | grep TEST_FOO - TEST_FOO=This is a test - -The `--env-file` flag takes a filename as an argument and expects each line -to be in the `VAR=VAL` format, mimicking the argument passed to `--env`. Comment -lines need only be prefixed with `#` - -An example of a file passed with `--env-file` - - $ cat ./env.list - TEST_FOO=BAR - - # this is a comment - TEST_APP_DEST_HOST=10.10.0.127 - TEST_APP_DEST_PORT=8888 - _TEST_BAR=FOO - TEST_APP_42=magic - helloWorld=true - 123qwe=bar - org.spring.config=something - - # pass through this variable from the caller - TEST_PASSTHROUGH - $ TEST_PASSTHROUGH=howdy docker run --env-file ./env.list busybox env - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - HOSTNAME=5198e0745561 - TEST_FOO=BAR - TEST_APP_DEST_HOST=10.10.0.127 - TEST_APP_DEST_PORT=8888 - _TEST_BAR=FOO - TEST_APP_42=magic - helloWorld=true - TEST_PASSTHROUGH=howdy - HOME=/root - 123qwe=bar - org.spring.config=something - - $ docker run --env-file ./env.list busybox env - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - HOSTNAME=5198e0745561 - TEST_FOO=BAR - TEST_APP_DEST_HOST=10.10.0.127 - TEST_APP_DEST_PORT=8888 - _TEST_BAR=FOO - TEST_APP_42=magic - helloWorld=true - TEST_PASSTHROUGH= - HOME=/root - 123qwe=bar - org.spring.config=something - -### Set metadata on container (-l, --label, --label-file) - -A label is a `key=value` pair that applies metadata to a container. To label a container with two labels: - - $ docker run -l my-label --label com.example.foo=bar ubuntu bash - -The `my-label` key doesn't specify a value so the label defaults to an empty -string(`""`). To add multiple labels, repeat the label flag (`-l` or `--label`). - -The `key=value` must be unique to avoid overwriting the label value. If you -specify labels with identical keys but different values, each subsequent value -overwrites the previous. Docker uses the last `key=value` you supply. - -Use the `--label-file` flag to load multiple labels from a file. Delimit each -label in the file with an EOL mark. The example below loads labels from a -labels file in the current directory: - - $ docker run --label-file ./labels ubuntu bash - -The label-file format is similar to the format for loading environment -variables. (Unlike environment variables, labels are not visible to processes -running inside a container.) The following example illustrates a label-file -format: - - com.example.label1="a label" - - # this is a comment - com.example.label2=another\ label - com.example.label3 - -You can load multiple label-files by supplying multiple `--label-file` flags. - -For additional information on working with labels, see [*Labels - custom -metadata in Docker*](https://docs.docker.com/engine/userguide/labels-custom-metadata/) in the Docker User -Guide. - -### Connect a container to a network (--network) - -When you start a container use the `--network` flag to connect it to a network. -This adds the `busybox` container to the `my-net` network. - -```bash -$ docker run -itd --network=my-net busybox -``` - -You can also choose the IP addresses for the container with `--ip` and `--ip6` -flags when you start the container on a user-defined network. - -```bash -$ docker run -itd --network=my-net --ip=10.10.9.75 busybox -``` - -If you want to add a running container to a network use the `docker network connect` subcommand. - -You can connect multiple containers to the same network. Once connected, the -containers can communicate easily need only another container's IP address -or name. For `overlay` networks or custom plugins that support multi-host -connectivity, containers connected to the same multi-host network but launched -from different Engines can also communicate in this way. - -**Note**: Service discovery is unavailable on the default bridge network. -Containers can communicate via their IP addresses by default. To communicate -by name, they must be linked. - -You can disconnect a container from a network using the `docker network -disconnect` command. - -### Mount volumes from container (--volumes-from) - - $ docker run --volumes-from 777f7dc92da7 --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd - -The `--volumes-from` flag mounts all the defined volumes from the referenced -containers. Containers can be specified by repetitions of the `--volumes-from` -argument. The container ID may be optionally suffixed with `:ro` or `:rw` to -mount the volumes in read-only or read-write mode, respectively. By default, -the volumes are mounted in the same mode (read write or read only) as -the reference container. - -Labeling systems like SELinux require that proper labels are placed on volume -content mounted into a container. Without a label, the security system might -prevent the processes running inside the container from using the content. By -default, Docker does not change the labels set by the OS. - -To change the label in the container context, you can add either of two suffixes -`:z` or `:Z` to the volume mount. These suffixes tell Docker to relabel file -objects on the shared volumes. The `z` option tells Docker that two containers -share the volume content. As a result, Docker labels the content with a shared -content label. Shared volume labels allow all containers to read/write content. -The `Z` option tells Docker to label the content with a private unshared label. -Only the current container can use a private volume. - -### Attach to STDIN/STDOUT/STDERR (-a) - -The `-a` flag tells `docker run` to bind to the container's `STDIN`, `STDOUT` -or `STDERR`. This makes it possible to manipulate the output and input as -needed. - - $ echo "test" | docker run -i -a stdin ubuntu cat - - -This pipes data into a container and prints the container's ID by attaching -only to the container's `STDIN`. - - $ docker run -a stderr ubuntu echo test - -This isn't going to print anything unless there's an error because we've -only attached to the `STDERR` of the container. The container's logs -still store what's been written to `STDERR` and `STDOUT`. - - $ cat somefile | docker run -i -a stdin mybuilder dobuild - -This is how piping a file into a container could be done for a build. -The container's ID will be printed after the build is done and the build -logs could be retrieved using `docker logs`. This is -useful if you need to pipe a file or something else into a container and -retrieve the container's ID once the container has finished running. - -### Add host device to container (--device) - - $ docker run --device=/dev/sdc:/dev/xvdc --device=/dev/sdd --device=/dev/zero:/dev/nulo -i -t ubuntu ls -l /dev/{xvdc,sdd,nulo} - brw-rw---- 1 root disk 8, 2 Feb 9 16:05 /dev/xvdc - brw-rw---- 1 root disk 8, 3 Feb 9 16:05 /dev/sdd - crw-rw-rw- 1 root root 1, 5 Feb 9 16:05 /dev/nulo - -It is often necessary to directly expose devices to a container. The `--device` -option enables that. For example, a specific block storage device or loop -device or audio device can be added to an otherwise unprivileged container -(without the `--privileged` flag) and have the application directly access it. - -By default, the container will be able to `read`, `write` and `mknod` these devices. -This can be overridden using a third `:rwm` set of options to each `--device` -flag: - - - $ docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdc - - Command (m for help): q - $ docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk /dev/xvdc - You will not be able to write the partition table. - - Command (m for help): q - - $ docker run --device=/dev/sda:/dev/xvdc:rw --rm -it ubuntu fdisk /dev/xvdc - - Command (m for help): q - - $ docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc - fdisk: unable to open /dev/xvdc: Operation not permitted - -> **Note:** -> `--device` cannot be safely used with ephemeral devices. Block devices -> that may be removed should not be added to untrusted containers with -> `--device`. - -### Restart policies (--restart) - -Use Docker's `--restart` to specify a container's *restart policy*. A restart -policy controls whether the Docker daemon restarts a container after exit. -Docker supports the following restart policies: - - - - - - - - - - - - - - - - - - - - - - - - - - -
PolicyResult
no - Do not automatically restart the container when it exits. This is the - default. -
- - on-failure[:max-retries] - - - Restart only if the container exits with a non-zero exit status. - Optionally, limit the number of restart retries the Docker - daemon attempts. -
always - Always restart the container regardless of the exit status. - When you specify always, the Docker daemon will try to restart - the container indefinitely. The container will also always start - on daemon startup, regardless of the current state of the container. -
unless-stopped - Always restart the container regardless of the exit status, but - do not start it on daemon startup if the container has been put - to a stopped state before. -
- - $ docker run --restart=always redis - -This will run the `redis` container with a restart policy of **always** -so that if the container exits, Docker will restart it. - -More detailed information on restart policies can be found in the -[Restart Policies (--restart)](../run.md#restart-policies-restart) -section of the Docker run reference page. - -### Add entries to container hosts file (--add-host) - -You can add other hosts into a container's `/etc/hosts` file by using one or -more `--add-host` flags. This example adds a static address for a host named -`docker`: - - $ docker run --add-host=docker:10.180.0.1 --rm -it debian - root@f38c87f2a42d:/# ping docker - PING docker (10.180.0.1): 48 data bytes - 56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms - 56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms - ^C--- docker ping statistics --- - 2 packets transmitted, 2 packets received, 0% packet loss - round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms - -Sometimes you need to connect to the Docker host from within your -container. To enable this, pass the Docker host's IP address to -the container using the `--add-host` flag. To find the host's address, -use the `ip addr show` command. - -The flags you pass to `ip addr show` depend on whether you are -using IPv4 or IPv6 networking in your containers. Use the following -flags for IPv4 address retrieval for a network device named `eth0`: - - $ HOSTIP=`ip -4 addr show scope global dev eth0 | grep inet | awk '{print \$2}' | cut -d / -f 1` - $ docker run --add-host=docker:${HOSTIP} --rm -it debian - -For IPv6 use the `-6` flag instead of the `-4` flag. For other network -devices, replace `eth0` with the correct device name (for example `docker0` -for the bridge device). - -### Set ulimits in container (--ulimit) - -Since setting `ulimit` settings in a container requires extra privileges not -available in the default container, you can set these using the `--ulimit` flag. -`--ulimit` is specified with a soft and hard limit as such: -`=[:]`, for example: - - $ docker run --ulimit nofile=1024:1024 --rm debian sh -c "ulimit -n" - 1024 - -> **Note:** -> If you do not provide a `hard limit`, the `soft limit` will be used -> for both values. If no `ulimits` are set, they will be inherited from -> the default `ulimits` set on the daemon. `as` option is disabled now. -> In other words, the following script is not supported: -> `$ docker run -it --ulimit as=1024 fedora /bin/bash` - -The values are sent to the appropriate `syscall` as they are set. -Docker doesn't perform any byte conversion. Take this into account when setting the values. - -#### For `nproc` usage - -Be careful setting `nproc` with the `ulimit` flag as `nproc` is designed by Linux to set the -maximum number of processes available to a user, not to a container. For example, start four -containers with `daemon` user: - - docker run -d -u daemon --ulimit nproc=3 busybox top - docker run -d -u daemon --ulimit nproc=3 busybox top - docker run -d -u daemon --ulimit nproc=3 busybox top - docker run -d -u daemon --ulimit nproc=3 busybox top - -The 4th container fails and reports "[8] System error: resource temporarily unavailable" error. -This fails because the caller set `nproc=3` resulting in the first three containers using up -the three processes quota set for the `daemon` user. - -### Stop container with signal (--stop-signal) - -The `--stop-signal` flag sets the system call signal that will be sent to the container to exit. -This signal can be a valid unsigned number that matches a position in the kernel's syscall table, for instance 9, -or a signal name in the format SIGNAME, for instance SIGKILL. - -### Optional security options (--security-opt) - -On Windows, this flag can be used to specify the `credentialspec` option. -The `credentialspec` must be in the format `file://spec.txt` or `registry://keyname`. - -### Stop container with timeout (--stop-timeout) - -The `--stop-timeout` flag sets the timeout (in seconds) that a pre-defined (see `--stop-signal`) system call -signal that will be sent to the container to exit. After timeout elapses the container will be killed with SIGKILL. - -### Specify isolation technology for container (--isolation) - -This option is useful in situations where you are running Docker containers on -Microsoft Windows. The `--isolation ` option sets a container's isolation -technology. On Linux, the only supported is the `default` option which uses -Linux namespaces. These two commands are equivalent on Linux: - -``` -$ docker run -d busybox top -$ docker run -d --isolation default busybox top -``` - -On Microsoft Windows, can take any of these values: - - -| Value | Description | -|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `default` | Use the value specified by the Docker daemon's `--exec-opt` . If the `daemon` does not specify an isolation technology, Microsoft Windows uses `process` as its default value. | -| `process` | Namespace isolation only. | -| `hyperv` | Hyper-V hypervisor partition-based isolation. | - -On Windows, the default isolation for client is `hyperv`, and for server is -`process`. Therefore when running on Windows server without a `daemon` option -set, these two commands are equivalent: -``` -$ docker run -d --isolation default busybox top -$ docker run -d --isolation process busybox top -``` - -If you have set the `--exec-opt isolation=hyperv` option on the Docker `daemon`, -if running on Windows server, any of these commands also result in `hyperv` isolation: - -``` -$ docker run -d --isolation default busybox top -$ docker run -d --isolation hyperv busybox top -``` - -### Configure namespaced kernel parameters (sysctls) at runtime - -The `--sysctl` sets namespaced kernel parameters (sysctls) in the -container. For example, to turn on IP forwarding in the containers -network namespace, run this command: - - $ docker run --sysctl net.ipv4.ip_forward=1 someimage - - -> **Note**: Not all sysctls are namespaced. Docker does not support changing sysctls -> inside of a container that also modify the host system. As the kernel -> evolves we expect to see more sysctls become namespaced. - -#### Currently supported sysctls - - `IPC Namespace`: - - kernel.msgmax, kernel.msgmnb, kernel.msgmni, kernel.sem, kernel.shmall, kernel.shmmax, kernel.shmmni, kernel.shm_rmid_forced - Sysctls beginning with fs.mqueue.* - - If you use the `--ipc=host` option these sysctls will not be allowed. - - `Network Namespace`: - Sysctls beginning with net.* - - If you use the `--network=host` option using these sysctls will not be allowed. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/save.md b/vendor/github.com/docker/docker/docs/reference/commandline/save.md deleted file mode 100644 index 88a5fed10..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/save.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: "save" -description: "The save command description and usage" -keywords: "tarred, repository, backup" ---- - - - -# save - -```markdown -Usage: docker save [OPTIONS] IMAGE [IMAGE...] - -Save one or more images to a tar archive (streamed to STDOUT by default) - -Options: - --help Print usage - -o, --output string Write to a file, instead of STDOUT -``` - -Produces a tarred repository to the standard output stream. -Contains all parent layers, and all tags + versions, or specified `repo:tag`, for -each argument provided. - -It is used to create a backup that can then be used with `docker load` - - $ docker save busybox > busybox.tar - $ ls -sh busybox.tar - 2.7M busybox.tar - $ docker save --output busybox.tar busybox - $ ls -sh busybox.tar - 2.7M busybox.tar - $ docker save -o fedora-all.tar fedora - $ docker save -o fedora-latest.tar fedora:latest - -It is even useful to cherry-pick particular tags of an image repository - - $ docker save -o ubuntu.tar ubuntu:lucid ubuntu:saucy diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/search.md b/vendor/github.com/docker/docker/docs/reference/commandline/search.md deleted file mode 100644 index 31faf3737..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/search.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: "search" -description: "The search command description and usage" -keywords: "search, hub, images" ---- - - - -# search - -```markdown -Usage: docker search [OPTIONS] TERM - -Search the Docker Hub for images - -Options: - -f, --filter value Filter output based on conditions provided (default []) - - is-automated=(true|false) - - is-official=(true|false) - - stars= - image has at least 'number' stars - --help Print usage - --limit int Max number of search results (default 25) - --no-trunc Don't truncate output -``` - -Search [Docker Hub](https://hub.docker.com) for images - -See [*Find Public Images on Docker Hub*](https://docs.docker.com/engine/tutorials/dockerrepos/#searching-for-images) for -more details on finding shared images from the command line. - -> **Note:** -> Search queries will only return up to 25 results - -## Examples - -### Search images by name - -This example displays images with a name containing 'busybox': - - $ docker search busybox - NAME DESCRIPTION STARS OFFICIAL AUTOMATED - busybox Busybox base image. 316 [OK] - progrium/busybox 50 [OK] - radial/busyboxplus Full-chain, Internet enabled, busybox made... 8 [OK] - odise/busybox-python 2 [OK] - azukiapp/busybox This image is meant to be used as the base... 2 [OK] - ofayau/busybox-jvm Prepare busybox to install a 32 bits JVM. 1 [OK] - shingonoide/archlinux-busybox Arch Linux, a lightweight and flexible Lin... 1 [OK] - odise/busybox-curl 1 [OK] - ofayau/busybox-libc32 Busybox with 32 bits (and 64 bits) libs 1 [OK] - peelsky/zulu-openjdk-busybox 1 [OK] - skomma/busybox-data Docker image suitable for data volume cont... 1 [OK] - elektritter/busybox-teamspeak Lightweight teamspeak3 container based on... 1 [OK] - socketplane/busybox 1 [OK] - oveits/docker-nginx-busybox This is a tiny NginX docker image based on... 0 [OK] - ggtools/busybox-ubuntu Busybox ubuntu version with extra goodies 0 [OK] - nikfoundas/busybox-confd Minimal busybox based distribution of confd 0 [OK] - openshift/busybox-http-app 0 [OK] - jllopis/busybox 0 [OK] - swyckoff/busybox 0 [OK] - powellquiring/busybox 0 [OK] - williamyeh/busybox-sh Docker image for BusyBox's sh 0 [OK] - simplexsys/busybox-cli-powered Docker busybox images, with a few often us... 0 [OK] - fhisamoto/busybox-java Busybox java 0 [OK] - scottabernethy/busybox 0 [OK] - marclop/busybox-solr - -### Display non-truncated description (--no-trunc) - -This example displays images with a name containing 'busybox', -at least 3 stars and the description isn't truncated in the output: - - $ docker search --stars=3 --no-trunc busybox - NAME DESCRIPTION STARS OFFICIAL AUTOMATED - busybox Busybox base image. 325 [OK] - progrium/busybox 50 [OK] - radial/busyboxplus Full-chain, Internet enabled, busybox made from scratch. Comes in git and cURL flavors. 8 [OK] - -## Limit search results (--limit) - -The flag `--limit` is the maximum number of results returned by a search. This value could -be in the range between 1 and 100. The default value of `--limit` is 25. - - -## Filtering - -The filtering flag (`-f` or `--filter`) format is a `key=value` pair. If there is more -than one filter, then pass multiple flags (e.g. `--filter "foo=bar" --filter "bif=baz"`) - -The currently supported filters are: - -* stars (int - number of stars the image has) -* is-automated (true|false) - is the image automated or not -* is-official (true|false) - is the image official or not - - -### stars - -This example displays images with a name containing 'busybox' and at -least 3 stars: - - $ docker search --filter stars=3 busybox - NAME DESCRIPTION STARS OFFICIAL AUTOMATED - busybox Busybox base image. 325 [OK] - progrium/busybox 50 [OK] - radial/busyboxplus Full-chain, Internet enabled, busybox made... 8 [OK] - - -### is-automated - -This example displays images with a name containing 'busybox' -and are automated builds: - - $ docker search --filter is-automated busybox - NAME DESCRIPTION STARS OFFICIAL AUTOMATED - progrium/busybox 50 [OK] - radial/busyboxplus Full-chain, Internet enabled, busybox made... 8 [OK] - -### is-official - -This example displays images with a name containing 'busybox', at least -3 stars and are official builds: - - $ docker search --filter "is-official=true" --filter "stars=3" busybox - NAME DESCRIPTION STARS OFFICIAL AUTOMATED - progrium/busybox 50 [OK] - radial/busyboxplus Full-chain, Internet enabled, busybox made... 8 [OK] diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/secret_create.md b/vendor/github.com/docker/docker/docs/reference/commandline/secret_create.md deleted file mode 100644 index aebcebbcd..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/secret_create.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: "secret create" -description: "The secret create command description and usage" -keywords: ["secret, create"] ---- - - - -# secret create - -```Markdown -Usage: docker secret create [OPTIONS] SECRET file|- - -Create a secret from a file or STDIN as content - -Options: - --help Print usage - -l, --label list Secret labels (default []) -``` - -Creates a secret using standard input or from a file for the secret content. You must run this -command on a manager node. - -## Examples - -### Create a secret - -```bash -$ echo | docker secret create my_secret - -mhv17xfe3gh6xc4rij5orpfds - -$ docker secret ls -ID NAME CREATED UPDATED SIZE -mhv17xfe3gh6xc4rij5orpfds my_secret 2016-10-27 23:25:43.909181089 +0000 UTC 2016-10-27 23:25:43.909181089 +0000 UTC 1679 -``` - -### Create a secret with a file - -```bash -$ docker secret create my_secret ./secret.json -mhv17xfe3gh6xc4rij5orpfds - -$ docker secret ls -ID NAME CREATED UPDATED SIZE -mhv17xfe3gh6xc4rij5orpfds my_secret 2016-10-27 23:25:43.909181089 +0000 UTC 2016-10-27 23:25:43.909181089 +0000 UTC 1679 -``` - -### Create a secret with labels - -```bash -$ docker secret create --label env=dev --label rev=20161102 my_secret ./secret.json -jtn7g6aukl5ky7nr9gvwafoxh - -$ docker secret inspect my_secret -[ - { - "ID": "jtn7g6aukl5ky7nr9gvwafoxh", - "Version": { - "Index": 541 - }, - "CreatedAt": "2016-11-03T20:54:12.924766548Z", - "UpdatedAt": "2016-11-03T20:54:12.924766548Z", - "Spec": { - "Name": "my_secret", - "Labels": { - "env": "dev", - "rev": "20161102" - }, - "Data": null - }, - "Digest": "sha256:4212a44b14e94154359569333d3fc6a80f6b9959dfdaff26412f4b2796b1f387", - "SecretSize": 1679 - } -] - -``` - - -## Related information - -* [secret inspect](secret_inspect.md) -* [secret ls](secret_ls.md) -* [secret rm](secret_rm.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/secret_inspect.md b/vendor/github.com/docker/docker/docs/reference/commandline/secret_inspect.md deleted file mode 100644 index de878f74e..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/secret_inspect.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: "secret inspect" -description: "The secret inspect command description and usage" -keywords: ["secret, inspect"] ---- - - - -# secret inspect - -```Markdown -Usage: docker secret inspect [OPTIONS] SECRET [SECRET...] - -Display detailed information on one or more secrets - -Options: - -f, --format string Format the output using the given Go template - --help Print usage -``` - - -Inspects the specified secret. This command has to be run targeting a manager -node. - -By default, this renders all results in a JSON array. If a format is specified, -the given template will be executed for each result. - -Go's [text/template](http://golang.org/pkg/text/template/) package -describes all the details of the format. - -## Examples - -### Inspecting a secret by name or ID - -You can inspect a secret, either by its *name*, or *ID* - -For example, given the following secret: - -```bash -$ docker secret ls -ID NAME CREATED UPDATED -mhv17xfe3gh6xc4rij5orpfds secret.json 2016-10-27 23:25:43.909181089 +0000 UTC 2016-10-27 23:25:43.909181089 +0000 UTC -``` - -```bash -$ docker secret inspect secret.json -[ - { - "ID": "mhv17xfe3gh6xc4rij5orpfds", - "Version": { - "Index": 1198 - }, - "CreatedAt": "2016-10-27T23:25:43.909181089Z", - "UpdatedAt": "2016-10-27T23:25:43.909181089Z", - "Spec": { - "Name": "secret.json" - } - } -] -``` - -### Formatting secret output - -You can use the --format option to obtain specific information about a -secret. The following example command outputs the creation time of the -secret. - -```bash{% raw %} -$ docker secret inspect --format='{{.CreatedAt}}' mhv17xfe3gh6xc4rij5orpfds -2016-10-27 23:25:43.909181089 +0000 UTC -{% endraw %}``` - - -## Related information - -* [secret create](secret_create.md) -* [secret ls](secret_ls.md) -* [secret rm](secret_rm.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/secret_ls.md b/vendor/github.com/docker/docker/docs/reference/commandline/secret_ls.md deleted file mode 100644 index 6b34fc214..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/secret_ls.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "secret ls" -description: "The secret ls command description and usage" -keywords: ["secret, ls"] ---- - - - -# secret ls - -```Markdown -Usage: docker secret ls [OPTIONS] - -List secrets - -Aliases: - ls, list - -Options: - -q, --quiet Only display IDs -``` - -Run this command on a manager node to list the secrets in the Swarm. - -## Examples - -```bash -$ docker secret ls -ID NAME CREATED UPDATED -mhv17xfe3gh6xc4rij5orpfds secret.json 2016-10-27 23:25:43.909181089 +0000 UTC 2016-10-27 23:25:43.909181089 +0000 UTC -``` -## Related information - -* [secret create](secret_create.md) -* [secret inspect](secret_inspect.md) -* [secret rm](secret_rm.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/secret_rm.md b/vendor/github.com/docker/docker/docs/reference/commandline/secret_rm.md deleted file mode 100644 index f504b1ba4..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/secret_rm.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "secret rm" -description: "The secret rm command description and usage" -keywords: ["secret, rm"] ---- - - - -# secret rm - -```Markdown -Usage: docker secret rm SECRET [SECRET...] - -Remove one or more secrets - -Aliases: - rm, remove - -Options: - --help Print usage -``` - -Removes the specified secrets from the swarm. This command has to be run -targeting a manager node. - -This example removes a secret: - -```bash -$ docker secret rm secret.json -sapth4csdo5b6wz2p5uimh5xg -``` - -> **Warning**: Unlike `docker rm`, this command does not ask for confirmation -> before removing a secret. - - -## Related information - -* [secret create](secret_create.md) -* [secret inspect](secret_inspect.md) -* [secret ls](secret_ls.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/service_create.md b/vendor/github.com/docker/docker/docs/reference/commandline/service_create.md deleted file mode 100644 index c9e298096..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/service_create.md +++ /dev/null @@ -1,556 +0,0 @@ ---- -title: "service create" -description: "The service create command description and usage" -keywords: "service, create" ---- - - - -# service create - -```Markdown -Usage: docker service create [OPTIONS] IMAGE [COMMAND] [ARG...] - -Create a new service - -Options: - --constraint list Placement constraints (default []) - --container-label list Container labels (default []) - --dns list Set custom DNS servers (default []) - --dns-option list Set DNS options (default []) - --dns-search list Set custom DNS search domains (default []) - --endpoint-mode string Endpoint mode (vip or dnsrr) - -e, --env list Set environment variables (default []) - --env-file list Read in a file of environment variables (default []) - --group list Set one or more supplementary user groups for the container (default []) - --health-cmd string Command to run to check health - --health-interval duration Time between running the check (ns|us|ms|s|m|h) - --health-retries int Consecutive failures needed to report unhealthy - --health-timeout duration Maximum time to allow one check to run (ns|us|ms|s|m|h) - --help Print usage - --host list Set one or more custom host-to-IP mappings (host:ip) (default []) - --hostname string Container hostname - -l, --label list Service labels (default []) - --limit-cpu decimal Limit CPUs (default 0.000) - --limit-memory bytes Limit Memory (default 0 B) - --log-driver string Logging driver for service - --log-opt list Logging driver options (default []) - --mode string Service mode (replicated or global) (default "replicated") - --mount mount Attach a filesystem mount to the service - --name string Service name - --network list Network attachments (default []) - --no-healthcheck Disable any container-specified HEALTHCHECK - -p, --publish port Publish a port as a node port - --replicas uint Number of tasks - --reserve-cpu decimal Reserve CPUs (default 0.000) - --reserve-memory bytes Reserve Memory (default 0 B) - --restart-condition string Restart when condition is met (none, on-failure, or any) - --restart-delay duration Delay between restart attempts (ns|us|ms|s|m|h) - --restart-max-attempts uint Maximum number of restarts before giving up - --restart-window duration Window used to evaluate the restart policy (ns|us|ms|s|m|h) - --secret secret Specify secrets to expose to the service - --stop-grace-period duration Time to wait before force killing a container (ns|us|ms|s|m|h) - -t, --tty Allocate a pseudo-TTY - --update-delay duration Delay between updates (ns|us|ms|s|m|h) (default 0s) - --update-failure-action string Action on update failure (pause|continue) (default "pause") - --update-max-failure-ratio float Failure rate to tolerate during an update - --update-monitor duration Duration after each task update to monitor for failure (ns|us|ms|s|m|h) (default 0s) - --update-parallelism uint Maximum number of tasks updated simultaneously (0 to update all at once) (default 1) - -u, --user string Username or UID (format: [:]) - --with-registry-auth Send registry authentication details to swarm agents - -w, --workdir string Working directory inside the container -``` - -Creates a service as described by the specified parameters. You must run this -command on a manager node. - -## Examples - -### Create a service - -```bash -$ docker service create --name redis redis:3.0.6 -dmu1ept4cxcfe8k8lhtux3ro3 - -$ docker service create --mode global --name redis2 redis:3.0.6 -a8q9dasaafudfs8q8w32udass - -$ docker service ls -ID NAME MODE REPLICAS IMAGE -dmu1ept4cxcf redis replicated 1/1 redis:3.0.6 -a8q9dasaafud redis2 global 1/1 redis:3.0.6 -``` - -### Create a service with 5 replica tasks (--replicas) - -Use the `--replicas` flag to set the number of replica tasks for a replicated -service. The following command creates a `redis` service with `5` replica tasks: - -```bash -$ docker service create --name redis --replicas=5 redis:3.0.6 -4cdgfyky7ozwh3htjfw0d12qv -``` - -The above command sets the *desired* number of tasks for the service. Even -though the command returns immediately, actual scaling of the service may take -some time. The `REPLICAS` column shows both the *actual* and *desired* number -of replica tasks for the service. - -In the following example the desired state is `5` replicas, but the current -number of `RUNNING` tasks is `3`: - -```bash -$ docker service ls -ID NAME MODE REPLICAS IMAGE -4cdgfyky7ozw redis replicated 3/5 redis:3.0.7 -``` - -Once all the tasks are created and `RUNNING`, the actual number of tasks is -equal to the desired number: - -```bash -$ docker service ls -ID NAME MODE REPLICAS IMAGE -4cdgfyky7ozw redis replicated 5/5 redis:3.0.7 -``` - -### Create a service with secrets -Use the `--secret` flag to give a container access to a -[secret](secret_create.md). - -Create a service specifying a secret: - -```bash -$ docker service create --name redis --secret secret.json redis:3.0.6 -4cdgfyky7ozwh3htjfw0d12qv -``` - -Create a service specifying the secret, target, user/group ID and mode: - -```bash -$ docker service create --name redis \ - --secret source=ssh-key,target=ssh \ - --secret source=app-key,target=app,uid=1000,gid=1001,mode=0400 \ - redis:3.0.6 -4cdgfyky7ozwh3htjfw0d12qv -``` - -Secrets are located in `/run/secrets` in the container. If no target is -specified, the name of the secret will be used as the in memory file in the -container. If a target is specified, that will be the filename. In the -example above, two files will be created: `/run/secrets/ssh` and -`/run/secrets/app` for each of the secret targets specified. - -### Create a service with a rolling update policy - -```bash -$ docker service create \ - --replicas 10 \ - --name redis \ - --update-delay 10s \ - --update-parallelism 2 \ - redis:3.0.6 -``` - -When you run a [service update](service_update.md), the scheduler updates a -maximum of 2 tasks at a time, with `10s` between updates. For more information, -refer to the [rolling updates -tutorial](https://docs.docker.com/engine/swarm/swarm-tutorial/rolling-update/). - -### Set environment variables (-e, --env) - -This sets environmental variables for all tasks in a service. For example: - -```bash -$ docker service create --name redis_2 --replicas 5 --env MYVAR=foo redis:3.0.6 -``` - -### Create a docker service with specific hostname (--hostname) - -This option sets the docker service containers hostname to a specific string. For example: -```bash -$ docker service create --name redis --hostname myredis redis:3.0.6 -``` -### Set metadata on a service (-l, --label) - -A label is a `key=value` pair that applies metadata to a service. To label a -service with two labels: - -```bash -$ docker service create \ - --name redis_2 \ - --label com.example.foo="bar" - --label bar=baz \ - redis:3.0.6 -``` - -For more information about labels, refer to [apply custom -metadata](https://docs.docker.com/engine/userguide/labels-custom-metadata/). - -### Add bind-mounts or volumes - -Docker supports two different kinds of mounts, which allow containers to read to -or write from files or directories on other containers or the host operating -system. These types are _data volumes_ (often referred to simply as volumes) and -_bind-mounts_. - -Additionally, Docker also supports tmpfs mounts. - -A **bind-mount** makes a file or directory on the host available to the -container it is mounted within. A bind-mount may be either read-only or -read-write. For example, a container might share its host's DNS information by -means of a bind-mount of the host's `/etc/resolv.conf` or a container might -write logs to its host's `/var/log/myContainerLogs` directory. If you use -bind-mounts and your host and containers have different notions of permissions, -access controls, or other such details, you will run into portability issues. - -A **named volume** is a mechanism for decoupling persistent data needed by your -container from the image used to create the container and from the host machine. -Named volumes are created and managed by Docker, and a named volume persists -even when no container is currently using it. Data in named volumes can be -shared between a container and the host machine, as well as between multiple -containers. Docker uses a _volume driver_ to create, manage, and mount volumes. -You can back up or restore volumes using Docker commands. - -A **tmpfs** mounts a tmpfs inside a container for volatile data. - -Consider a situation where your image starts a lightweight web server. You could -use that image as a base image, copy in your website's HTML files, and package -that into another image. Each time your website changed, you'd need to update -the new image and redeploy all of the containers serving your website. A better -solution is to store the website in a named volume which is attached to each of -your web server containers when they start. To update the website, you just -update the named volume. - -For more information about named volumes, see -[Data Volumes](https://docs.docker.com/engine/tutorials/dockervolumes/). - -The following table describes options which apply to both bind-mounts and named -volumes in a service: - -| Option | Required | Description -|:-----------------------------------------|:--------------------------|:----------------------------------------------------------------------------------------- -| **type** | | The type of mount, can be either `volume`, `bind`, or `tmpfs`. Defaults to `volume` if no type is specified.

  • `volume`: mounts a [managed volume](volume_create.md) into the container.
  • `bind`: bind-mounts a directory or file from the host into the container.
  • `tmpfs`: mount a tmpfs in the container
-| **src** or **source** | for `type=bind` only |
  • `type=volume`: `src` is an optional way to specify the name of the volume (for example, `src=my-volume`). If the named volume does not exist, it is automatically created. If no `src` is specified, the volume is assigned a random name which is guaranteed to be unique on the host, but may not be unique cluster-wide. A randomly-named volume has the same lifecycle as its container and is destroyed when the *container* is destroyed (which is upon `service update`, or when scaling or re-balancing the service).
  • `type=bind`: `src` is required, and specifies an absolute path to the file or directory to bind-mount (for example, `src=/path/on/host/`). An error is produced if the file or directory does not exist.
  • `type=tmpfs`: `src` is not supported.
-| **dst** or **destination** or **target** | yes | Mount path inside the container, for example `/some/path/in/container/`. If the path does not exist in the container's filesystem, the Engine creates a directory at the specified location before mounting the volume or bind-mount. -| **readonly** or **ro** | | The Engine mounts binds and volumes `read-write` unless `readonly` option is given when mounting the bind or volume.

  • `true` or `1` or no value: Mounts the bind or volume read-only.
  • `false` or `0`: Mounts the bind or volume read-write.
- -#### Bind Propagation - -Bind propagation refers to whether or not mounts created within a given -bind-mount or named volume can be propagated to replicas of that mount. Consider -a mount point `/mnt`, which is also mounted on `/tmp`. The propation settings -control whether a mount on `/tmp/a` would also be available on `/mnt/a`. Each -propagation setting has a recursive counterpoint. In the case of recursion, -consider that `/tmp/a` is also mounted as `/foo`. The propagation settings -control whether `/mnt/a` and/or `/tmp/a` would exist. - -The `bind-propagation` option defaults to `rprivate` for both bind-mounts and -volume mounts, and is only configurable for bind-mounts. In other words, named -volumes do not support bind propagation. - -- **`shared`**: Sub-mounts of the original mount are exposed to replica mounts, - and sub-mounts of replica mounts are also propagated to the - original mount. -- **`slave`**: similar to a shared mount, but only in one direction. If the - original mount exposes a sub-mount, the replica mount can see it. - However, if the replica mount exposes a sub-mount, the original - mount cannot see it. -- **`private`**: The mount is private. Sub-mounts within it are not exposed to - replica mounts, and sub-mounts of replica mounts are not - exposed to the original mount. -- **`rshared`**: The same as shared, but the propagation also extends to and from - mount points nested within any of the original or replica mount - points. -- **`rslave`**: The same as `slave`, but the propagation also extends to and from - mount points nested within any of the original or replica mount - points. -- **`rprivate`**: The default. The same as `private`, meaning that no mount points - anywhere within the original or replica mount points propagate - in either direction. - -For more information about bind propagation, see the -[Linux kernel documentation for shared subtree](https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt). - -#### Options for Named Volumes -The following options can only be used for named volumes (`type=volume`); - -| Option | Description -|:----------------------|:-------------------------------------------------------------------------------------------------------------------- -| **volume-driver** | Name of the volume-driver plugin to use for the volume. Defaults to ``"local"``, to use the local volume driver to create the volume if the volume does not exist. -| **volume-label** | One or more custom metadata ("labels") to apply to the volume upon creation. For example, `volume-label=mylabel=hello-world,my-other-label=hello-mars`. For more information about labels, refer to [apply custom metadata](https://docs.docker.com/engine/userguide/labels-custom-metadata/). -| **volume-nocopy** | By default, if you attach an empty volume to a container, and files or directories already existed at the mount-path in the container (`dst`), the Engine copies those files and directories into the volume, allowing the host to access them. Set `volume-nocopy` to disables copying files from the container's filesystem to the volume and mount the empty volume.

A value is optional:
  • `true` or `1`: Default if you do not provide a value. Disables copying.
  • `false` or `0`: Enables copying.
-| **volume-opt** | Options specific to a given volume driver, which will be passed to the driver when creating the volume. Options are provided as a comma-separated list of key/value pairs, for example, `volume-opt=some-option=some-value,some-other-option=some-other-value`. For available options for a given driver, refer to that driver's documentation. - -#### Options for tmpfs -The following options can only be used for tmpfs mounts (`type=tmpfs`); - -| Option | Description -|:----------------------|:-------------------------------------------------------------------------------------------------------------------- -| **tmpfs-size** | Size of the tmpfs mount in bytes. Unlimited by default in Linux. -| **tmpfs-mode** | File mode of the tmpfs in octal. (e.g. `"700"` or `"0700"`.) Defaults to ``"1777"`` in Linux. - -#### Differences between "--mount" and "--volume" - -The `--mount` flag supports most options that are supported by the `-v` -or `--volume` flag for `docker run`, with some important exceptions: - -- The `--mount` flag allows you to specify a volume driver and volume driver - options *per volume*, without creating the volumes in advance. In contrast, - `docker run` allows you to specify a single volume driver which is shared - by all volumes, using the `--volume-driver` flag. - -- The `--mount` flag allows you to specify custom metadata ("labels") for a volume, - before the volume is created. - -- When you use `--mount` with `type=bind`, the host-path must refer to an *existing* - path on the host. The path will not be created for you and the service will fail - with an error if the path does not exist. - -- The `--mount` flag does not allow you to relabel a volume with `Z` or `z` flags, - which are used for `selinux` labeling. - -#### Create a service using a named volume - -The following example creates a service that uses a named volume: - -```bash -$ docker service create \ - --name my-service \ - --replicas 3 \ - --mount type=volume,source=my-volume,destination=/path/in/container,volume-label="color=red",volume-label="shape=round" \ - nginx:alpine -``` - -For each replica of the service, the engine requests a volume named "my-volume" -from the default ("local") volume driver where the task is deployed. If the -volume does not exist, the engine creates a new volume and applies the "color" -and "shape" labels. - -When the task is started, the volume is mounted on `/path/in/container/` inside -the container. - -Be aware that the default ("local") volume is a locally scoped volume driver. -This means that depending on where a task is deployed, either that task gets a -*new* volume named "my-volume", or shares the same "my-volume" with other tasks -of the same service. Multiple containers writing to a single shared volume can -cause data corruption if the software running inside the container is not -designed to handle concurrent processes writing to the same location. Also take -into account that containers can be re-scheduled by the Swarm orchestrator and -be deployed on a different node. - -#### Create a service that uses an anonymous volume - -The following command creates a service with three replicas with an anonymous -volume on `/path/in/container`: - -```bash -$ docker service create \ - --name my-service \ - --replicas 3 \ - --mount type=volume,destination=/path/in/container \ - nginx:alpine -``` - -In this example, no name (`source`) is specified for the volume, so a new volume -is created for each task. This guarantees that each task gets its own volume, -and volumes are not shared between tasks. Anonymous volumes are removed after -the task using them is complete. - -#### Create a service that uses a bind-mounted host directory - -The following example bind-mounts a host directory at `/path/in/container` in -the containers backing the service: - -```bash -$ docker service create \ - --name my-service \ - --mount type=bind,source=/path/on/host,destination=/path/in/container \ - nginx:alpine -``` - -### Set service mode (--mode) - -The service mode determines whether this is a _replicated_ service or a _global_ -service. A replicated service runs as many tasks as specified, while a global -service runs on each active node in the swarm. - -The following command creates a global service: - -```bash -$ docker service create \ - --name redis_2 \ - --mode global \ - redis:3.0.6 -``` - -### Specify service constraints (--constraint) - -You can limit the set of nodes where a task can be scheduled by defining -constraint expressions. Multiple constraints find nodes that satisfy every -expression (AND match). Constraints can match node or Docker Engine labels as -follows: - -| node attribute | matches | example | -|:----------------|:--------------------------|:------------------------------------------------| -| node.id | node ID | `node.id == 2ivku8v2gvtg4` | -| node.hostname | node hostname | `node.hostname != node-2` | -| node.role | node role: manager | `node.role == manager` | -| node.labels | user defined node labels | `node.labels.security == high` | -| engine.labels | Docker Engine's labels | `engine.labels.operatingsystem == ubuntu 14.04` | - -`engine.labels` apply to Docker Engine labels like operating system, -drivers, etc. Swarm administrators add `node.labels` for operational purposes by -using the [`docker node update`](node_update.md) command. - -For example, the following limits tasks for the redis service to nodes where the -node type label equals queue: - -```bash -$ docker service create \ - --name redis_2 \ - --constraint 'node.labels.type == queue' \ - redis:3.0.6 -``` - -### Attach a service to an existing network (--network) - -You can use overlay networks to connect one or more services within the swarm. - -First, create an overlay network on a manager node the docker network create -command: - -```bash -$ docker network create --driver overlay my-network - -etjpu59cykrptrgw0z0hk5snf -``` - -After you create an overlay network in swarm mode, all manager nodes have -access to the network. - -When you create a service and pass the --network flag to attach the service to -the overlay network: - -```bash -$ docker service create \ - --replicas 3 \ - --network my-network \ - --name my-web \ - nginx - -716thylsndqma81j6kkkb5aus -``` - -The swarm extends my-network to each node running the service. - -Containers on the same network can access each other using -[service discovery](https://docs.docker.com/engine/swarm/networking/#use-swarm-mode-service-discovery). - -### Publish service ports externally to the swarm (-p, --publish) - -You can publish service ports to make them available externally to the swarm -using the `--publish` flag: - -```bash -$ docker service create --publish : nginx -``` - -For example: - -```bash -$ docker service create --name my_web --replicas 3 --publish 8080:80 nginx -``` - -When you publish a service port, the swarm routing mesh makes the service -accessible at the target port on every node regardless if there is a task for -the service running on the node. For more information refer to -[Use swarm mode routing mesh](https://docs.docker.com/engine/swarm/ingress/). - -### Publish a port for TCP only or UDP only - -By default, when you publish a port, it is a TCP port. You can -specifically publish a UDP port instead of or in addition to a TCP port. When -you publish both TCP and UDP ports, Docker 1.12.2 and earlier require you to -add the suffix `/tcp` for TCP ports. Otherwise it is optional. - -#### TCP only - -The following two commands are equivalent. - -```bash -$ docker service create --name dns-cache -p 53:53 dns-cache - -$ docker service create --name dns-cache -p 53:53/tcp dns-cache -``` - -#### TCP and UDP - -```bash -$ docker service create --name dns-cache -p 53:53/tcp -p 53:53/udp dns-cache -``` - -#### UDP only - -```bash -$ docker service create --name dns-cache -p 53:53/udp dns-cache -``` - -### Create services using templates - -You can use templates for some flags of `service create`, using the syntax -provided by the Go's [text/template](http://golange.org/pkg/text/template/) package. - -The supported flags are the following : - -- `--hostname` -- `--mount` -- `--env` - -Valid placeholders for the Go template are listed below: - -Placeholder | Description ------------------ | -------------------------------------------- -`.Service.ID` | Service ID -`.Service.Name` | Service name -`.Service.Labels` | Service labels -`.Node.ID` | Node ID -`.Task.ID` | Task ID -`.Task.Name` | Task name -`.Task.Slot` | Task slot - -#### Template example - -In this example, we are going to set the template of the created containers based on the -service's name and the node's ID where it sits. - -```bash -$ docker service create --name hosttempl --hostname={% raw %}"{{.Node.ID}}-{{.Service.Name}}"{% endraw %} busybox top -va8ew30grofhjoychbr6iot8c - -$ docker service ps va8ew30grofhjoychbr6iot8c -ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS -wo41w8hg8qan hosttempl.1 busybox:latest@sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912 2e7a8a9c4da2 Running Running about a minute ago - -$ docker inspect --format={% raw %}"{{.Config.Hostname}}"{% endraw %} hosttempl.1.wo41w8hg8qanxwjwsg4kxpprj -x3ti0erg11rjpg64m75kej2mz-hosttempl -``` - -## Related information - -* [service inspect](service_inspect.md) -* [service logs](service_logs.md) -* [service ls](service_ls.md) -* [service rm](service_rm.md) -* [service scale](service_scale.md) -* [service ps](service_ps.md) -* [service update](service_update.md) - - diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/service_inspect.md b/vendor/github.com/docker/docker/docs/reference/commandline/service_inspect.md deleted file mode 100644 index 8b4ab62d8..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/service_inspect.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: "service inspect" -description: "The service inspect command description and usage" -keywords: "service, inspect" ---- - - - -# service inspect - -```Markdown -Usage: docker service inspect [OPTIONS] SERVICE [SERVICE...] - -Display detailed information on one or more services - -Options: - -f, --format string Format the output using the given Go template - --help Print usage - --pretty Print the information in a human friendly format. -``` - - -Inspects the specified service. This command has to be run targeting a manager -node. - -By default, this renders all results in a JSON array. If a format is specified, -the given template will be executed for each result. - -Go's [text/template](http://golang.org/pkg/text/template/) package -describes all the details of the format. - -## Examples - -### Inspecting a service by name or ID - -You can inspect a service, either by its *name*, or *ID* - -For example, given the following service; - -```bash -$ docker service ls -ID NAME MODE REPLICAS IMAGE -dmu1ept4cxcf redis replicated 3/3 redis:3.0.6 -``` - -Both `docker service inspect redis`, and `docker service inspect dmu1ept4cxcf` -produce the same result: - -```bash -$ docker service inspect redis -[ - { - "ID": "dmu1ept4cxcfe8k8lhtux3ro3", - "Version": { - "Index": 12 - }, - "CreatedAt": "2016-06-17T18:44:02.558012087Z", - "UpdatedAt": "2016-06-17T18:44:02.558012087Z", - "Spec": { - "Name": "redis", - "TaskTemplate": { - "ContainerSpec": { - "Image": "redis:3.0.6" - }, - "Resources": { - "Limits": {}, - "Reservations": {} - }, - "RestartPolicy": { - "Condition": "any", - "MaxAttempts": 0 - }, - "Placement": {} - }, - "Mode": { - "Replicated": { - "Replicas": 1 - } - }, - "UpdateConfig": {}, - "EndpointSpec": { - "Mode": "vip" - } - }, - "Endpoint": { - "Spec": {} - } - } -] -``` - -```bash -$ docker service inspect dmu1ept4cxcf -[ - { - "ID": "dmu1ept4cxcfe8k8lhtux3ro3", - "Version": { - "Index": 12 - }, - ... - } -] -``` - -### Inspect a service using pretty-print - -You can print the inspect output in a human-readable format instead of the default -JSON output, by using the `--pretty` option: - -```bash -$ docker service inspect --pretty frontend -ID: c8wgl7q4ndfd52ni6qftkvnnp -Name: frontend -Labels: - - org.example.projectname=demo-app -Service Mode: REPLICATED - Replicas: 5 -Placement: -UpdateConfig: - Parallelism: 0 -ContainerSpec: - Image: nginx:alpine -Resources: -Endpoint Mode: vip -Ports: - Name = - Protocol = tcp - TargetPort = 443 - PublishedPort = 4443 -``` - -You can also use `--format pretty` for the same effect. - - -### Finding the number of tasks running as part of a service - -The `--format` option can be used to obtain specific information about a -service. For example, the following command outputs the number of replicas -of the "redis" service. - -```bash{% raw %} -$ docker service inspect --format='{{.Spec.Mode.Replicated.Replicas}}' redis -10 -{% endraw %}``` - - -## Related information - -* [service create](service_create.md) -* [service logs](service_logs.md) -* [service ls](service_ls.md) -* [service rm](service_rm.md) -* [service scale](service_scale.md) -* [service ps](service_ps.md) -* [service update](service_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/service_logs.md b/vendor/github.com/docker/docker/docs/reference/commandline/service_logs.md deleted file mode 100644 index fdf6a3a24..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/service_logs.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: "service logs (experimental)" -description: "The service logs command description and usage" -keywords: "service, logs" -advisory: "experimental" ---- - - - -# service logs - -```Markdown -Usage: docker service logs [OPTIONS] SERVICE - -Fetch the logs of a service - -Options: - --details Show extra details provided to logs - -f, --follow Follow log output - --help Print usage - --since string Show logs since timestamp - --tail string Number of lines to show from the end of the logs (default "all") - -t, --timestamps Show timestamps -``` - -The `docker service logs` command batch-retrieves logs present at the time of execution. - -> **Note**: this command is only functional for services that are started with -> the `json-file` or `journald` logging driver. - -For more information about selecting and configuring logging drivers, refer to -[Configure logging drivers](https://docs.docker.com/engine/admin/logging/overview/). - -The `docker service logs --follow` command will continue streaming the new output from -the service's `STDOUT` and `STDERR`. - -Passing a negative number or a non-integer to `--tail` is invalid and the -value is set to `all` in that case. - -The `docker service logs --timestamps` command will add an [RFC3339Nano timestamp](https://golang.org/pkg/time/#pkg-constants) -, for example `2014-09-16T06:17:46.000000000Z`, to each -log entry. To ensure that the timestamps are aligned the -nano-second part of the timestamp will be padded with zero when necessary. - -The `docker service logs --details` command will add on extra attributes, such as -environment variables and labels, provided to `--log-opt` when creating the -service. - -The `--since` option shows only the service logs generated after -a given date. You can specify the date as an RFC 3339 date, a UNIX -timestamp, or a Go duration string (e.g. `1m30s`, `3h`). Besides RFC3339 date -format you may also use RFC3339Nano, `2006-01-02T15:04:05`, -`2006-01-02T15:04:05.999999999`, `2006-01-02Z07:00`, and `2006-01-02`. The local -timezone on the client will be used if you do not provide either a `Z` or a -`+-00:00` timezone offset at the end of the timestamp. When providing Unix -timestamps enter seconds[.nanoseconds], where seconds is the number of seconds -that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap -seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a -fraction of a second no more than nine digits long. You can combine the -`--since` option with either or both of the `--follow` or `--tail` options. - -## Related information - -* [service create](service_create.md) -* [service inspect](service_inspect.md) -* [service ls](service_ls.md) -* [service rm](service_rm.md) -* [service scale](service_scale.md) -* [service ps](service_ps.md) -* [service update](service_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/service_ls.md b/vendor/github.com/docker/docker/docs/reference/commandline/service_ls.md deleted file mode 100644 index ccd68af75..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/service_ls.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: "service ls" -description: "The service ls command description and usage" -keywords: "service, ls" ---- - - - -# service ls - -```Markdown -Usage: docker service ls [OPTIONS] - -List services - -Aliases: - ls, list - -Options: - -f, --filter value Filter output based on conditions provided - --help Print usage - -q, --quiet Only display IDs -``` - -This command when run targeting a manager, lists services are running in the -swarm. - -On a manager node: -```bash -$ docker service ls -ID NAME MODE REPLICAS IMAGE -c8wgl7q4ndfd frontend replicated 5/5 nginx:alpine -dmu1ept4cxcf redis replicated 3/3 redis:3.0.6 -iwe3278osahj mongo global 7/7 mongo:3.3 -``` - -The `REPLICAS` column shows both the *actual* and *desired* number of tasks for -the service. - -## Filtering - -The filtering flag (`-f` or `--filter`) format is of "key=value". If there is more -than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "bif=baz"`) - -The currently supported filters are: - -* [id](service_ls.md#id) -* [label](service_ls.md#label) -* [name](service_ls.md#name) - -#### ID - -The `id` filter matches all or part of a service's id. - -```bash -$ docker service ls -f "id=0bcjw" -ID NAME MODE REPLICAS IMAGE -0bcjwfh8ychr redis replicated 1/1 redis:3.0.6 -``` - -#### Label - -The `label` filter matches services based on the presence of a `label` alone or -a `label` and a value. - -The following filter matches all services with a `project` label regardless of -its value: - -```bash -$ docker service ls --filter label=project -ID NAME MODE REPLICAS IMAGE -01sl1rp6nj5u frontend2 replicated 1/1 nginx:alpine -36xvvwwauej0 frontend replicated 5/5 nginx:alpine -74nzcxxjv6fq backend replicated 3/3 redis:3.0.6 -``` - -The following filter matches only services with the `project` label with the -`project-a` value. - -```bash -$ docker service ls --filter label=project=project-a -ID NAME MODE REPLICAS IMAGE -36xvvwwauej0 frontend replicated 5/5 nginx:alpine -74nzcxxjv6fq backend replicated 3/3 redis:3.0.6 -``` - -#### Name - -The `name` filter matches on all or part of a service's name. - -The following filter matches services with a name containing `redis`. - -```bash -$ docker service ls --filter name=redis -ID NAME MODE REPLICAS IMAGE -0bcjwfh8ychr redis replicated 1/1 redis:3.0.6 -``` - -## Related information - -* [service create](service_create.md) -* [service inspect](service_inspect.md) -* [service logs](service_logs.md) -* [service rm](service_rm.md) -* [service scale](service_scale.md) -* [service ps](service_ps.md) -* [service update](service_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/service_ps.md b/vendor/github.com/docker/docker/docs/reference/commandline/service_ps.md deleted file mode 100644 index 61abb15f6..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/service_ps.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: "service ps" -description: "The service ps command description and usage" -keywords: "service, tasks, ps" -aliases: ["/engine/reference/commandline/service_tasks/"] ---- - - - -# service ps - -```Markdown -Usage: docker service ps [OPTIONS] SERVICE - -List the tasks of a service - -Options: - -f, --filter filter Filter output based on conditions provided - --help Print usage - --no-resolve Do not map IDs to Names - --no-trunc Do not truncate output - -q, --quiet Only display task IDs -``` - -Lists the tasks that are running as part of the specified service. This command -has to be run targeting a manager node. - -## Examples - -### Listing the tasks that are part of a service - -The following command shows all the tasks that are part of the `redis` service: - -```bash -$ docker service ps redis - -ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS -0qihejybwf1x redis.1 redis:3.0.5 manager1 Running Running 8 seconds -bk658fpbex0d redis.2 redis:3.0.5 worker2 Running Running 9 seconds -5ls5s5fldaqg redis.3 redis:3.0.5 worker1 Running Running 9 seconds -8ryt076polmc redis.4 redis:3.0.5 worker1 Running Running 9 seconds -1x0v8yomsncd redis.5 redis:3.0.5 manager1 Running Running 8 seconds -71v7je3el7rr redis.6 redis:3.0.5 worker2 Running Running 9 seconds -4l3zm9b7tfr7 redis.7 redis:3.0.5 worker2 Running Running 9 seconds -9tfpyixiy2i7 redis.8 redis:3.0.5 worker1 Running Running 9 seconds -3w1wu13yupln redis.9 redis:3.0.5 manager1 Running Running 8 seconds -8eaxrb2fqpbn redis.10 redis:3.0.5 manager1 Running Running 8 seconds -``` - -In addition to _running_ tasks, the output also shows the task history. For -example, after updating the service to use the `redis:3.0.6` image, the output -may look like this: - -```bash -$ docker service ps redis - -ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS -50qe8lfnxaxk redis.1 redis:3.0.6 manager1 Running Running 6 seconds ago -ky2re9oz86r9 \_ redis.1 redis:3.0.5 manager1 Shutdown Shutdown 8 seconds ago -3s46te2nzl4i redis.2 redis:3.0.6 worker2 Running Running less than a second ago -nvjljf7rmor4 \_ redis.2 redis:3.0.6 worker2 Shutdown Rejected 23 seconds ago "No such image: redis@sha256:6…" -vtiuz2fpc0yb \_ redis.2 redis:3.0.5 worker2 Shutdown Shutdown 1 second ago -jnarweeha8x4 redis.3 redis:3.0.6 worker1 Running Running 3 seconds ago -vs448yca2nz4 \_ redis.3 redis:3.0.5 worker1 Shutdown Shutdown 4 seconds ago -jf1i992619ir redis.4 redis:3.0.6 worker1 Running Running 10 seconds ago -blkttv7zs8ee \_ redis.4 redis:3.0.5 worker1 Shutdown Shutdown 11 seconds ago -``` - -The number of items in the task history is determined by the -`--task-history-limit` option that was set when initializing the swarm. You can -change the task history retention limit using the -[`docker swarm update`](swarm_update.md) command. - -When deploying a service, docker resolves the digest for the service's -image, and pins the service to that digest. The digest is not shown by -default, but is printed if `--no-trunc` is used. The `--no-trunc` option -also shows the non-truncated task ID, and error-messages, as can be seen below; - -```bash -$ docker service ps --no-trunc redis - -ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS -50qe8lfnxaxksi9w2a704wkp7 redis.1 redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842 manager1 Running Running 5 minutes ago -ky2re9oz86r9556i2szb8a8af \_ redis.1 redis:3.0.5@sha256:f8829e00d95672c48c60f468329d6693c4bdd28d1f057e755f8ba8b40008682e worker2 Shutdown Shutdown 5 minutes ago -bk658fpbex0d57cqcwoe3jthu redis.2 redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842 worker2 Running Running 5 seconds -nvjljf7rmor4htv7l8rwcx7i7 \_ redis.2 redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842 worker2 Shutdown Rejected 5 minutes ago "No such image: redis@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842" -``` - -## Filtering - -The filtering flag (`-f` or `--filter`) format is a `key=value` pair. If there -is more than one filter, then pass multiple flags (e.g. `--filter "foo=bar" --filter "bif=baz"`). -Multiple filter flags are combined as an `OR` filter. For example, -`-f name=redis.1 -f name=redis.7` returns both `redis.1` and `redis.7` tasks. - -The currently supported filters are: - -* [id](#id) -* [name](#name) -* [node](#node) -* [desired-state](#desired-state) - - -#### ID - -The `id` filter matches on all or a prefix of a task's ID. - -```bash -$ docker service ps -f "id=8" redis - -ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS -8ryt076polmc redis.4 redis:3.0.6 worker1 Running Running 9 seconds -8eaxrb2fqpbn redis.10 redis:3.0.6 manager1 Running Running 8 seconds -``` - -#### Name - -The `name` filter matches on task names. - -```bash -$ docker service ps -f "name=redis.1" redis -ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS -qihejybwf1x5 redis.1 redis:3.0.6 manager1 Running Running 8 seconds -``` - - -#### Node - -The `node` filter matches on a node name or a node ID. - -```bash -$ docker service ps -f "node=manager1" redis -ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS -0qihejybwf1x redis.1 redis:3.0.6 manager1 Running Running 8 seconds -1x0v8yomsncd redis.5 redis:3.0.6 manager1 Running Running 8 seconds -3w1wu13yupln redis.9 redis:3.0.6 manager1 Running Running 8 seconds -8eaxrb2fqpbn redis.10 redis:3.0.6 manager1 Running Running 8 seconds -``` - - -#### desired-state - -The `desired-state` filter can take the values `running`, `shutdown`, and `accepted`. - - -## Related information - -* [service create](service_create.md) -* [service inspect](service_inspect.md) -* [service logs](service_logs.md) -* [service ls](service_ls.md) -* [service rm](service_rm.md) -* [service scale](service_scale.md) -* [service update](service_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/service_rm.md b/vendor/github.com/docker/docker/docs/reference/commandline/service_rm.md deleted file mode 100644 index d0ba90b26..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/service_rm.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "service rm" -description: "The service rm command description and usage" -keywords: "service, rm" ---- - - - -# service rm - -```Markdown -Usage: docker service rm SERVICE [SERVICE...] - -Remove one or more services - -Aliases: - rm, remove - -Options: - --help Print usage -``` - -Removes the specified services from the swarm. This command has to be run -targeting a manager node. - -For example, to remove the redis service: - -```bash -$ docker service rm redis -redis -$ docker service ls -ID NAME MODE REPLICAS IMAGE -``` - -> **Warning**: Unlike `docker rm`, this command does not ask for confirmation -> before removing a running service. - - - -## Related information - -* [service create](service_create.md) -* [service inspect](service_inspect.md) -* [service logs](service_logs.md) -* [service ls](service_ls.md) -* [service scale](service_scale.md) -* [service ps](service_ps.md) -* [service update](service_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/service_scale.md b/vendor/github.com/docker/docker/docs/reference/commandline/service_scale.md deleted file mode 100644 index 64075ed09..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/service_scale.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: "service scale" -description: "The service scale command description and usage" -keywords: "service, scale" ---- - - - -# service scale - -```markdown -Usage: docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...] - -Scale one or multiple replicated services - -Options: - --help Print usage -``` - -## Examples - -### Scale a service - -The scale command enables you to scale one or more replicated services either up -or down to the desired number of replicas. This command cannot be applied on -services which are global mode. The command will return immediately, but the -actual scaling of the service may take some time. To stop all replicas of a -service while keeping the service active in the swarm you can set the scale to 0. - -For example, the following command scales the "frontend" service to 50 tasks. - -```bash -$ docker service scale frontend=50 -frontend scaled to 50 -``` - -The following command tries to scale a global service to 10 tasks and returns an error. - -``` -$ docker service create --mode global --name backend backend:latest -b4g08uwuairexjub6ome6usqh -$ docker service scale backend=10 -backend: scale can only be used with replicated mode -``` - -Directly afterwards, run `docker service ls`, to see the actual number of -replicas. - -```bash -$ docker service ls --filter name=frontend - -ID NAME MODE REPLICAS IMAGE -3pr5mlvu3fh9 frontend replicated 15/50 nginx:alpine -``` - -You can also scale a service using the [`docker service update`](service_update.md) -command. The following commands are equivalent: - -```bash -$ docker service scale frontend=50 -$ docker service update --replicas=50 frontend -``` - -### Scale multiple services - -The `docker service scale` command allows you to set the desired number of -tasks for multiple services at once. The following example scales both the -backend and frontend services: - -```bash -$ docker service scale backend=3 frontend=5 -backend scaled to 3 -frontend scaled to 5 - -$ docker service ls -ID NAME MODE REPLICAS IMAGE -3pr5mlvu3fh9 frontend replicated 5/5 nginx:alpine -74nzcxxjv6fq backend replicated 3/3 redis:3.0.6 -``` - -## Related information - -* [service create](service_create.md) -* [service inspect](service_inspect.md) -* [service logs](service_logs.md) -* [service ls](service_ls.md) -* [service rm](service_rm.md) -* [service ps](service_ps.md) -* [service update](service_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/service_update.md b/vendor/github.com/docker/docker/docs/reference/commandline/service_update.md deleted file mode 100644 index 301a0eabe..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/service_update.md +++ /dev/null @@ -1,181 +0,0 @@ ---- -title: "service update" -description: "The service update command description and usage" -keywords: "service, update" ---- - - - -# service update - -```Markdown -Usage: docker service update [OPTIONS] SERVICE - -Update a service - -Options: - --args string Service command args - --constraint-add list Add or update a placement constraint (default []) - --constraint-rm list Remove a constraint (default []) - --container-label-add list Add or update a container label (default []) - --container-label-rm list Remove a container label by its key (default []) - --dns-add list Add or update a custom DNS server (default []) - --dns-option-add list Add or update a DNS option (default []) - --dns-option-rm list Remove a DNS option (default []) - --dns-rm list Remove a custom DNS server (default []) - --dns-search-add list Add or update a custom DNS search domain (default []) - --dns-search-rm list Remove a DNS search domain (default []) - --endpoint-mode string Endpoint mode (vip or dnsrr) - --env-add list Add or update an environment variable (default []) - --env-rm list Remove an environment variable (default []) - --force Force update even if no changes require it - --group-add list Add an additional supplementary user group to the container (default []) - --group-rm list Remove a previously added supplementary user group from the container (default []) - --health-cmd string Command to run to check health - --health-interval duration Time between running the check (ns|us|ms|s|m|h) - --health-retries int Consecutive failures needed to report unhealthy - --health-timeout duration Maximum time to allow one check to run (ns|us|ms|s|m|h) - --help Print usage - --host-add list Add or update a custom host-to-IP mapping (host:ip) (default []) - --host-rm list Remove a custom host-to-IP mapping (host:ip) (default []) - --hostname string Container hostname - --image string Service image tag - --label-add list Add or update a service label (default []) - --label-rm list Remove a label by its key (default []) - --limit-cpu decimal Limit CPUs (default 0.000) - --limit-memory bytes Limit Memory (default 0 B) - --log-driver string Logging driver for service - --log-opt list Logging driver options (default []) - --mount-add mount Add or update a mount on a service - --mount-rm list Remove a mount by its target path (default []) - --no-healthcheck Disable any container-specified HEALTHCHECK - --publish-add port Add or update a published port - --publish-rm port Remove a published port by its target port - --replicas uint Number of tasks - --reserve-cpu decimal Reserve CPUs (default 0.000) - --reserve-memory bytes Reserve Memory (default 0 B) - --restart-condition string Restart when condition is met (none, on-failure, or any) - --restart-delay duration Delay between restart attempts (ns|us|ms|s|m|h) - --restart-max-attempts uint Maximum number of restarts before giving up - --restart-window duration Window used to evaluate the restart policy (ns|us|ms|s|m|h) - --rollback Rollback to previous specification - --secret-add secret Add or update a secret on a service - --secret-rm list Remove a secret (default []) - --stop-grace-period duration Time to wait before force killing a container (ns|us|ms|s|m|h) - -t, --tty Allocate a pseudo-TTY - --update-delay duration Delay between updates (ns|us|ms|s|m|h) (default 0s) - --update-failure-action string Action on update failure (pause|continue) (default "pause") - --update-max-failure-ratio float Failure rate to tolerate during an update - --update-monitor duration Duration after each task update to monitor for failure (ns|us|ms|s|m|h) (default 0s) - --update-parallelism uint Maximum number of tasks updated simultaneously (0 to update all at once) (default 1) - -u, --user string Username or UID (format: [:]) - --with-registry-auth Send registry authentication details to swarm agents - -w, --workdir string Working directory inside the container -``` - -Updates a service as described by the specified parameters. This command has to be run targeting a manager node. -The parameters are the same as [`docker service create`](service_create.md). Please look at the description there -for further information. - -Normally, updating a service will only cause the service's tasks to be replaced with new ones if a change to the -service requires recreating the tasks for it to take effect. For example, only changing the -`--update-parallelism` setting will not recreate the tasks, because the individual tasks are not affected by this -setting. However, the `--force` flag will cause the tasks to be recreated anyway. This can be used to perform a -rolling restart without any changes to the service parameters. - -## Examples - -### Update a service - -```bash -$ docker service update --limit-cpu 2 redis -``` - -### Perform a rolling restart with no parameter changes - -```bash -$ docker service update --force --update-parallelism 1 --update-delay 30s redis -``` - -In this example, the `--force` flag causes the service's tasks to be shut down -and replaced with new ones even though none of the other parameters would -normally cause that to happen. The `--update-parallelism 1` setting ensures -that only one task is replaced at a time (this is the default behavior). The -`--update-delay 30s` setting introduces a 30 second delay between tasks, so -that the rolling restart happens gradually. - -### Adding and removing mounts - -Use the `--mount-add` or `--mount-rm` options add or remove a service's bind-mounts -or volumes. - -The following example creates a service which mounts the `test-data` volume to -`/somewhere`. The next step updates the service to also mount the `other-volume` -volume to `/somewhere-else`volume, The last step unmounts the `/somewhere` mount -point, effectively removing the `test-data` volume. Each command returns the -service name. - -- The `--mount-add` flag takes the same parameters as the `--mount` flag on - `service create`. Refer to the [volumes and - bind-mounts](service_create.md#volumes-and-bind-mounts-mount) section in the - `service create` reference for details. - -- The `--mount-rm` flag takes the `target` path of the mount. - -```bash -$ docker service create \ - --name=myservice \ - --mount \ - type=volume,source=test-data,target=/somewhere \ - nginx:alpine \ - myservice - -myservice - -$ docker service update \ - --mount-add \ - type=volume,source=other-volume,target=/somewhere-else \ - myservice - -myservice - -$ docker service update --mount-rm /somewhere myservice - -myservice -``` - -### Adding and removing secrets - -Use the `--secret-add` or `--secret-rm` options add or remove a service's -secrets. - -The following example adds a secret named `ssh-2` and removes `ssh-1`: - -```bash -$ docker service update \ - --secret-add source=ssh-2,target=ssh-2 \ - --secret-rm ssh-1 \ - myservice -``` - -### Update services using templates - -Some flags of `service update` support the use of templating. -See [`service create`](./service_create.md#templating) for the reference. - -## Related information - -* [service create](service_create.md) -* [service inspect](service_inspect.md) -* [service logs](service_logs.md) -* [service ls](service_ls.md) -* [service ps](service_ps.md) -* [service rm](service_rm.md) -* [service scale](service_scale.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/stack_deploy.md b/vendor/github.com/docker/docker/docs/reference/commandline/stack_deploy.md deleted file mode 100644 index 037feaebd..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/stack_deploy.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: "stack deploy" -description: "The stack deploy command description and usage" -keywords: "stack, deploy, up" ---- - - - -# stack deploy - -```markdown -Usage: docker stack deploy [OPTIONS] STACK - -Deploy a new stack or update an existing stack - -Aliases: - deploy, up - -Options: - --bundle-file string Path to a Distributed Application Bundle file - -c, --compose-file string Path to a Compose file - --help Print usage - --with-registry-auth Send registry authentication details to Swarm agents -``` - -Create and update a stack from a `compose` or a `dab` file on the swarm. This command -has to be run targeting a manager node. - -## Compose file - -The `deploy` command supports compose file version `3.0` and above." - -```bash -$ docker stack deploy --compose-file docker-compose.yml vossibility -Ignoring unsupported options: links - -Creating network vossibility_vossibility -Creating network vossibility_default -Creating service vossibility_nsqd -Creating service vossibility_logstash -Creating service vossibility_elasticsearch -Creating service vossibility_kibana -Creating service vossibility_ghollector -Creating service vossibility_lookupd -``` - -You can verify that the services were correctly created - -``` -$ docker service ls -ID NAME MODE REPLICAS IMAGE -29bv0vnlm903 vossibility_lookupd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662 -4awt47624qwh vossibility_nsqd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662 -4tjx9biia6fs vossibility_elasticsearch replicated 1/1 elasticsearch@sha256:12ac7c6af55d001f71800b83ba91a04f716e58d82e748fa6e5a7359eed2301aa -7563uuzr9eys vossibility_kibana replicated 1/1 kibana@sha256:6995a2d25709a62694a937b8a529ff36da92ebee74bafd7bf00e6caf6db2eb03 -9gc5m4met4he vossibility_logstash replicated 1/1 logstash@sha256:2dc8bddd1bb4a5a34e8ebaf73749f6413c101b2edef6617f2f7713926d2141fe -axqh55ipl40h vossibility_vossibility-collector replicated 1/1 icecrime/vossibility-collector@sha256:f03f2977203ba6253988c18d04061c5ec7aab46bca9dfd89a9a1fa4500989fba -``` - -## DAB file - -```bash -$ docker stack deploy --bundle-file vossibility-stack.dab vossibility -Loading bundle from vossibility-stack.dab -Creating service vossibility_elasticsearch -Creating service vossibility_kibana -Creating service vossibility_logstash -Creating service vossibility_lookupd -Creating service vossibility_nsqd -Creating service vossibility_vossibility-collector -``` - -You can verify that the services were correctly created: - -```bash -$ docker service ls -ID NAME MODE REPLICAS IMAGE -29bv0vnlm903 vossibility_lookupd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662 -4awt47624qwh vossibility_nsqd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662 -4tjx9biia6fs vossibility_elasticsearch replicated 1/1 elasticsearch@sha256:12ac7c6af55d001f71800b83ba91a04f716e58d82e748fa6e5a7359eed2301aa -7563uuzr9eys vossibility_kibana replicated 1/1 kibana@sha256:6995a2d25709a62694a937b8a529ff36da92ebee74bafd7bf00e6caf6db2eb03 -9gc5m4met4he vossibility_logstash replicated 1/1 logstash@sha256:2dc8bddd1bb4a5a34e8ebaf73749f6413c101b2edef6617f2f7713926d2141fe -axqh55ipl40h vossibility_vossibility-collector replicated 1/1 icecrime/vossibility-collector@sha256:f03f2977203ba6253988c18d04061c5ec7aab46bca9dfd89a9a1fa4500989fba -``` - -## Related information - -* [stack ls](stack_ls.md) -* [stack ps](stack_ps.md) -* [stack rm](stack_rm.md) -* [stack services](stack_services.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/stack_ls.md b/vendor/github.com/docker/docker/docs/reference/commandline/stack_ls.md deleted file mode 100644 index 05c721549..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/stack_ls.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "stack ls" -description: "The stack ls command description and usage" -keywords: "stack, ls" ---- - - - -# stack ls - -```markdown -Usage: docker stack ls - -List stacks - -Aliases: - ls, list - -Options: - --help Print usage -``` - -Lists the stacks. - -For example, the following command shows all stacks and some additional information: - -```bash -$ docker stack ls - -ID SERVICES -vossibility-stack 6 -myapp 2 -``` - -## Related information - -* [stack deploy](stack_deploy.md) -* [stack ps](stack_ps.md) -* [stack rm](stack_rm.md) -* [stack services](stack_services.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/stack_ps.md b/vendor/github.com/docker/docker/docs/reference/commandline/stack_ps.md deleted file mode 100644 index 101e9feb1..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/stack_ps.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "stack ps" -description: "The stack ps command description and usage" -keywords: "stack, ps" ---- - - - -# stack ps - -```markdown -Usage: docker stack ps [OPTIONS] STACK - -List the tasks in the stack - -Options: - -f, --filter filter Filter output based on conditions provided - --help Print usage - --no-resolve Do not map IDs to Names - --no-trunc Do not truncate output -``` - -Lists the tasks that are running as part of the specified stack. This -command has to be run targeting a manager node. - -## Filtering - -The filtering flag (`-f` or `--filter`) format is a `key=value` pair. If there -is more than one filter, then pass multiple flags (e.g. `--filter "foo=bar" --filter "bif=baz"`). -Multiple filter flags are combined as an `OR` filter. For example, -`-f name=redis.1 -f name=redis.7` returns both `redis.1` and `redis.7` tasks. - -The currently supported filters are: - -* id -* name -* desired-state - -## Related information - -* [stack deploy](stack_deploy.md) -* [stack ls](stack_ls.md) -* [stack rm](stack_rm.md) -* [stack services](stack_services.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/stack_rm.md b/vendor/github.com/docker/docker/docs/reference/commandline/stack_rm.md deleted file mode 100644 index fd639978e..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/stack_rm.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: "stack rm" -description: "The stack rm command description and usage" -keywords: "stack, rm, remove, down" ---- - - - -# stack rm - -```markdown -Usage: docker stack rm STACK - -Remove the stack - -Aliases: - rm, remove, down - -Options: - --help Print usage -``` - -Remove the stack from the swarm. This command has to be run targeting -a manager node. - -## Related information - -* [stack deploy](stack_deploy.md) -* [stack ls](stack_ls.md) -* [stack ps](stack_ps.md) -* [stack services](stack_services.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/stack_services.md b/vendor/github.com/docker/docker/docs/reference/commandline/stack_services.md deleted file mode 100644 index 62779b4aa..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/stack_services.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: "stack services" -description: "The stack services command description and usage" -keywords: "stack, services" -advisory: "experimental" ---- - - - -# stack services (experimental) - -```markdown -Usage: docker stack services [OPTIONS] STACK - -List the services in the stack - -Options: - -f, --filter value Filter output based on conditions provided - --help Print usage - -q, --quiet Only display IDs -``` - -Lists the services that are running as part of the specified stack. This -command has to be run targeting a manager node. - -For example, the following command shows all services in the `myapp` stack: - -```bash -$ docker stack services myapp - -ID NAME REPLICAS IMAGE COMMAND -7be5ei6sqeye myapp_web 1/1 nginx@sha256:23f809e7fd5952e7d5be065b4d3643fbbceccd349d537b62a123ef2201bc886f -dn7m7nhhfb9y myapp_db 1/1 mysql@sha256:a9a5b559f8821fe73d58c3606c812d1c044868d42c63817fa5125fd9d8b7b539 -``` - -## Filtering - -The filtering flag (`-f` or `--filter`) format is a `key=value` pair. If there -is more than one filter, then pass multiple flags (e.g. `--filter "foo=bar" --filter "bif=baz"`). -Multiple filter flags are combined as an `OR` filter. - -The following command shows both the `web` and `db` services: - -```bash -$ docker stack services --filter name=myapp_web --filter name=myapp_db myapp - -ID NAME REPLICAS IMAGE COMMAND -7be5ei6sqeye myapp_web 1/1 nginx@sha256:23f809e7fd5952e7d5be065b4d3643fbbceccd349d537b62a123ef2201bc886f -dn7m7nhhfb9y myapp_db 1/1 mysql@sha256:a9a5b559f8821fe73d58c3606c812d1c044868d42c63817fa5125fd9d8b7b539 -``` - -The currently supported filters are: - -* id / ID (`--filter id=7be5ei6sqeye`, or `--filter ID=7be5ei6sqeye`) -* name (`--filter name=myapp_web`) -* label (`--filter label=key=value`) - -## Related information - -* [stack deploy](stack_deploy.md) -* [stack ls](stack_ls.md) -* [stack ps](stack_ps.md) -* [stack rm](stack_rm.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/start.md b/vendor/github.com/docker/docker/docs/reference/commandline/start.md deleted file mode 100644 index 980bce958..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/start.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: "start" -description: "The start command description and usage" -keywords: "Start, container, stopped" ---- - - - -# start - -```markdown -Usage: docker start [OPTIONS] CONTAINER [CONTAINER...] - -Start one or more stopped containers - -Options: - -a, --attach Attach STDOUT/STDERR and forward signals - --detach-keys string Override the key sequence for detaching a container - --help Print usage - -i, --interactive Attach container's STDIN -``` diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/stats.md b/vendor/github.com/docker/docker/docs/reference/commandline/stats.md deleted file mode 100644 index f5d0d54f3..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/stats.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: "stats" -description: "The stats command description and usage" -keywords: "container, resource, statistics" ---- - - - -# stats - -```markdown -Usage: docker stats [OPTIONS] [CONTAINER...] - -Display a live stream of container(s) resource usage statistics - -Options: - -a, --all Show all containers (default shows just running) - --format string Pretty-print images using a Go template - --help Print usage - --no-stream Disable streaming stats and only pull the first result -``` - -The `docker stats` command returns a live data stream for running containers. To limit data to one or more specific containers, specify a list of container names or ids separated by a space. You can specify a stopped container but stopped containers do not return any data. - -If you want more detailed information about a container's resource usage, use the `/containers/(id)/stats` API endpoint. - -## Examples - -Running `docker stats` on all running containers against a Linux daemon. - - $ docker stats - CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O - 1285939c1fd3 0.07% 796 KiB / 64 MiB 1.21% 788 B / 648 B 3.568 MB / 512 KB - 9c76f7834ae2 0.07% 2.746 MiB / 64 MiB 4.29% 1.266 KB / 648 B 12.4 MB / 0 B - d1ea048f04e4 0.03% 4.583 MiB / 64 MiB 6.30% 2.854 KB / 648 B 27.7 MB / 0 B - -Running `docker stats` on multiple containers by name and id against a Linux daemon. - - $ docker stats fervent_panini 5acfcb1b4fd1 - CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O - 5acfcb1b4fd1 0.00% 115.2 MiB/1.045 GiB 11.03% 1.422 kB/648 B - fervent_panini 0.02% 11.08 MiB/1.045 GiB 1.06% 648 B/648 B - -Running `docker stats` on all running containers against a Windows daemon. - - PS E:\> docker stats - CONTAINER CPU % PRIV WORKING SET NET I/O BLOCK I/O - 09d3bb5b1604 6.61% 38.21 MiB 17.1 kB / 7.73 kB 10.7 MB / 3.57 MB - 9db7aa4d986d 9.19% 38.26 MiB 15.2 kB / 7.65 kB 10.6 MB / 3.3 MB - 3f214c61ad1d 0.00% 28.64 MiB 64 kB / 6.84 kB 4.42 MB / 6.93 MB - -Running `docker stats` on multiple containers by name and id against a Windows daemon. - - PS E:\> docker ps -a - CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES - 3f214c61ad1d nanoserver "cmd" 2 minutes ago Up 2 minutes big_minsky - 9db7aa4d986d windowsservercore "cmd" 2 minutes ago Up 2 minutes mad_wilson - 09d3bb5b1604 windowsservercore "cmd" 2 minutes ago Up 2 minutes affectionate_easley - - PS E:\> docker stats 3f214c61ad1d mad_wilson - CONTAINER CPU % PRIV WORKING SET NET I/O BLOCK I/O - 3f214c61ad1d 0.00% 46.25 MiB 76.3 kB / 7.92 kB 10.3 MB / 14.7 MB - mad_wilson 9.59% 40.09 MiB 27.6 kB / 8.81 kB 17 MB / 20.1 MB - -## Formatting - -The formatting option (`--format`) pretty prints container output -using a Go template. - -Valid placeholders for the Go template are listed below: - -Placeholder | Description ------------- | -------------------------------------------- -`.Container` | Container name or ID (user input) -`.Name` | Container name -`.ID` | Container ID -`.CPUPerc` | CPU percentage -`.MemUsage` | Memory usage -`.NetIO` | Network IO -`.BlockIO` | Block IO -`.MemPerc` | Memory percentage (Not available on Windows) -`.PIDs` | Number of PIDs (Not available on Windows) - - -When using the `--format` option, the `stats` command either -outputs the data exactly as the template declares or, when using the -`table` directive, includes column headers as well. - -The following example uses a template without headers and outputs the -`Container` and `CPUPerc` entries separated by a colon for all images: - -```bash -$ docker stats --format "{{.Container}}: {{.CPUPerc}}" - -09d3bb5b1604: 6.61% -9db7aa4d986d: 9.19% -3f214c61ad1d: 0.00% -``` - -To list all containers statistics with their name, CPU percentage and memory -usage in a table format you can use: - -```bash -$ docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" - -CONTAINER CPU % PRIV WORKING SET -1285939c1fd3 0.07% 796 KiB / 64 MiB -9c76f7834ae2 0.07% 2.746 MiB / 64 MiB -d1ea048f04e4 0.03% 4.583 MiB / 64 MiB -``` diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/stop.md b/vendor/github.com/docker/docker/docs/reference/commandline/stop.md deleted file mode 100644 index 3090db98a..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/stop.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: "stop" -description: "The stop command description and usage" -keywords: "stop, SIGKILL, SIGTERM" ---- - - - -# stop - -```markdown -Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...] - -Stop one or more running containers - -Options: - --help Print usage - -t, --time int Seconds to wait for stop before killing it (default 10) -``` - -The main process inside the container will receive `SIGTERM`, and after a grace -period, `SIGKILL`. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_init.md b/vendor/github.com/docker/docker/docs/reference/commandline/swarm_init.md deleted file mode 100644 index 44afc2747..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_init.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: "swarm init" -description: "The swarm init command description and usage" -keywords: "swarm, init" ---- - - - -# swarm init - -```markdown -Usage: docker swarm init [OPTIONS] - -Initialize a swarm - -Options: - --advertise-addr string Advertised address (format: [:port]) - --autolock Enable manager autolocking (requiring an unlock key to start a stopped manager) - --cert-expiry duration Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s) - --dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s) - --external-ca external-ca Specifications of one or more certificate signing endpoints - --force-new-cluster Force create a new cluster from current state - --help Print usage - --listen-addr node-addr Listen address (format: [:port]) (default 0.0.0.0:2377) - --max-snapshots uint Number of additional Raft snapshots to retain - --snapshot-interval uint Number of log entries between Raft snapshots (default 10000) - --task-history-limit int Task history retention limit (default 5) -``` - -Initialize a swarm. The docker engine targeted by this command becomes a manager -in the newly created single-node swarm. - - -```bash -$ docker swarm init --advertise-addr 192.168.99.121 -Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager. - -To add a worker to this swarm, run the following command: - - docker swarm join \ - --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \ - 172.17.0.2:2377 - -To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. -``` - -`docker swarm init` generates two random tokens, a worker token and a manager token. When you join -a new node to the swarm, the node joins as a worker or manager node based upon the token you pass -to [swarm join](swarm_join.md). - -After you create the swarm, you can display or rotate the token using -[swarm join-token](swarm_join_token.md). - -### `--autolock` - -This flag enables automatic locking of managers with an encryption key. The -private keys and data stored by all managers will be protected by the -encryption key printed in the output, and will not be accessible without it. -Thus, it is very important to store this key in order to activate a manager -after it restarts. The key can be passed to `docker swarm unlock` to reactivate -the manager. Autolock can be disabled by running -`docker swarm update --autolock=false`. After disabling it, the encryption key -is no longer required to start the manager, and it will start up on its own -without user intervention. - -### `--cert-expiry` - -This flag sets the validity period for node certificates. - -### `--dispatcher-heartbeat` - -This flag sets the frequency with which nodes are told to use as a -period to report their health. - -### `--external-ca` - -This flag sets up the swarm to use an external CA to issue node certificates. The value takes -the form `protocol=X,url=Y`. The value for `protocol` specifies what protocol should be used -to send signing requests to the external CA. Currently, the only supported value is `cfssl`. -The URL specifies the endpoint where signing requests should be submitted. - -### `--force-new-cluster` - -This flag forces an existing node that was part of a quorum that was lost to restart as a single node Manager without losing its data. - -### `--listen-addr` - -The node listens for inbound swarm manager traffic on this address. The default is to listen on -0.0.0.0:2377. It is also possible to specify a network interface to listen on that interface's -address; for example `--listen-addr eth0:2377`. - -Specifying a port is optional. If the value is a bare IP address or interface -name, the default port 2377 will be used. - -### `--advertise-addr` - -This flag specifies the address that will be advertised to other members of the -swarm for API access and overlay networking. If unspecified, Docker will check -if the system has a single IP address, and use that IP address with the -listening port (see `--listen-addr`). If the system has multiple IP addresses, -`--advertise-addr` must be specified so that the correct address is chosen for -inter-manager communication and overlay networking. - -It is also possible to specify a network interface to advertise that interface's address; -for example `--advertise-addr eth0:2377`. - -Specifying a port is optional. If the value is a bare IP address or interface -name, the default port 2377 will be used. - -### `--task-history-limit` - -This flag sets up task history retention limit. - -### `--max-snapshots` - -This flag sets the number of old Raft snapshots to retain in addition to the -current Raft snapshots. By default, no old snapshots are retained. This option -may be used for debugging, or to store old snapshots of the swarm state for -disaster recovery purposes. - -### `--snapshot-interval` - -This flag specifies how many log entries to allow in between Raft snapshots. -Setting this to a higher number will trigger snapshots less frequently. -Snapshots compact the Raft log and allow for more efficient transfer of the -state to new managers. However, there is a performance cost to taking snapshots -frequently. - -## Related information - -* [swarm join](swarm_join.md) -* [swarm leave](swarm_leave.md) -* [swarm update](swarm_update.md) -* [swarm join-token](swarm_join_token.md) -* [node rm](node_rm.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_join.md b/vendor/github.com/docker/docker/docs/reference/commandline/swarm_join.md deleted file mode 100644 index 0cde0d7bc..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_join.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: "swarm join" -description: "The swarm join command description and usage" -keywords: "swarm, join" ---- - - - -# swarm join - -```markdown -Usage: docker swarm join [OPTIONS] HOST:PORT - -Join a swarm as a node and/or manager - -Options: - --advertise-addr string Advertised address (format: [:port]) - --help Print usage - --listen-addr node-addr Listen address (format: [:port]) (default 0.0.0.0:2377) - --token string Token for entry into the swarm -``` - -Join a node to a swarm. The node joins as a manager node or worker node based upon the token you -pass with the `--token` flag. If you pass a manager token, the node joins as a manager. If you -pass a worker token, the node joins as a worker. - -### Join a node to swarm as a manager - -The example below demonstrates joining a manager node using a manager token. - -```bash -$ docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.99.121:2377 -This node joined a swarm as a manager. -$ docker node ls -ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS -dkp8vy1dq1kxleu9g4u78tlag * manager2 Ready Active Reachable -dvfxp4zseq4s0rih1selh0d20 manager1 Ready Active Leader -``` - -A cluster should only have 3-7 managers at most, because a majority of managers must be available -for the cluster to function. Nodes that aren't meant to participate in this management quorum -should join as workers instead. Managers should be stable hosts that have static IP addresses. - -### Join a node to swarm as a worker - -The example below demonstrates joining a worker node using a worker token. - -```bash -$ docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx 192.168.99.121:2377 -This node joined a swarm as a worker. -$ docker node ls -ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS -7ln70fl22uw2dvjn2ft53m3q5 worker2 Ready Active -dkp8vy1dq1kxleu9g4u78tlag worker1 Ready Active Reachable -dvfxp4zseq4s0rih1selh0d20 * manager1 Ready Active Leader -``` - -### `--listen-addr value` - -If the node is a manager, it will listen for inbound swarm manager traffic on this -address. The default is to listen on 0.0.0.0:2377. It is also possible to specify a -network interface to listen on that interface's address; for example `--listen-addr eth0:2377`. - -Specifying a port is optional. If the value is a bare IP address, or interface -name, the default port 2377 will be used. - -This flag is generally not necessary when joining an existing swarm. - -### `--advertise-addr value` - -This flag specifies the address that will be advertised to other members of the -swarm for API access. If unspecified, Docker will check if the system has a -single IP address, and use that IP address with the listening port (see -`--listen-addr`). If the system has multiple IP addresses, `--advertise-addr` -must be specified so that the correct address is chosen for inter-manager -communication and overlay networking. - -It is also possible to specify a network interface to advertise that interface's address; -for example `--advertise-addr eth0:2377`. - -Specifying a port is optional. If the value is a bare IP address, or interface -name, the default port 2377 will be used. - -This flag is generally not necessary when joining an existing swarm. - -### `--token string` - -Secret value required for nodes to join the swarm - - -## Related information - -* [swarm init](swarm_init.md) -* [swarm leave](swarm_leave.md) -* [swarm update](swarm_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_join_token.md b/vendor/github.com/docker/docker/docs/reference/commandline/swarm_join_token.md deleted file mode 100644 index d731f028b..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_join_token.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: "swarm join-token" -description: "The swarm join-token command description and usage" -keywords: "swarm, join-token" ---- - - - -# swarm join-token - -```markdown -Usage: docker swarm join-token [OPTIONS] (worker|manager) - -Manage join tokens - -Options: - --help Print usage - -q, --quiet Only display token - --rotate Rotate join token -``` - -Join tokens are secrets that allow a node to join the swarm. There are two -different join tokens available, one for the worker role and one for the manager -role. You pass the token using the `--token` flag when you run -[swarm join](swarm_join.md). Nodes use the join token only when they join the -swarm. - -You can view or rotate the join tokens using `swarm join-token`. - -As a convenience, you can pass `worker` or `manager` as an argument to -`join-token` to print the full `docker swarm join` command to join a new node to -the swarm: - -```bash -$ docker swarm join-token worker -To add a worker to this swarm, run the following command: - - docker swarm join \ - --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \ - 172.17.0.2:2377 - -$ docker swarm join-token manager -To add a manager to this swarm, run the following command: - - docker swarm join \ - --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 \ - 172.17.0.2:2377 -``` - -Use the `--rotate` flag to generate a new join token for the specified role: - -```bash -$ docker swarm join-token --rotate worker -Successfully rotated worker join token. - -To add a worker to this swarm, run the following command: - - docker swarm join \ - --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-b30ljddcqhef9b9v4rs7mel7t \ - 172.17.0.2:2377 -``` - -After using `--rotate`, only the new token will be valid for joining with the specified role. - -The `-q` (or `--quiet`) flag only prints the token: - -```bash -$ docker swarm join-token -q worker - -SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-b30ljddcqhef9b9v4rs7mel7t -``` - -### `--rotate` - -Because tokens allow new nodes to join the swarm, you should keep them secret. -Be particularly careful with manager tokens since they allow new manager nodes -to join the swarm. A rogue manager has the potential to disrupt the operation of -your swarm. - -Rotate your swarm's join token if a token gets checked-in to version control, -stolen, or a node is compromised. You may also want to periodically rotate the -token to ensure any unknown token leaks do not allow a rogue node to join -the swarm. - -To rotate the join token and print the newly generated token, run -`docker swarm join-token --rotate` and pass the role: `manager` or `worker`. - -Rotating a join-token means that no new nodes will be able to join the swarm -using the old token. Rotation does not affect existing nodes in the swarm -because the join token is only used for authorizing new nodes joining the swarm. - -### `--quiet` - -Only print the token. Do not print a complete command for joining. - -## Related information - -* [swarm join](swarm_join.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_leave.md b/vendor/github.com/docker/docker/docs/reference/commandline/swarm_leave.md deleted file mode 100644 index c0d943781..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_leave.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "swarm leave" -description: "The swarm leave command description and usage" -keywords: "swarm, leave" ---- - - - -# swarm leave - -```markdown -Usage: docker swarm leave [OPTIONS] - -Leave the swarm - -Options: - -f, --force Force this node to leave the swarm, ignoring warnings - --help Print usage -``` - -When you run this command on a worker, that worker leaves the swarm. - -You can use the `--force` option to on a manager to remove it from the swarm. -However, this does not reconfigure the swarm to ensure that there are enough -managers to maintain a quorum in the swarm. The safe way to remove a manager -from a swarm is to demote it to a worker and then direct it to leave the quorum -without using `--force`. Only use `--force` in situations where the swarm will -no longer be used after the manager leaves, such as in a single-node swarm. - -Consider the following swarm, as seen from the manager: -```bash -$ docker node ls -ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS -7ln70fl22uw2dvjn2ft53m3q5 worker2 Ready Active -dkp8vy1dq1kxleu9g4u78tlag worker1 Ready Active -dvfxp4zseq4s0rih1selh0d20 * manager1 Ready Active Leader -``` - -To remove `worker2`, issue the following command from `worker2` itself: -```bash -$ docker swarm leave -Node left the default swarm. -``` -To remove an inactive node, use the [`node rm`](node_rm.md) command instead. - -## Related information - -* [node rm](node_rm.md) -* [swarm init](swarm_init.md) -* [swarm join](swarm_join.md) -* [swarm update](swarm_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_unlock.md b/vendor/github.com/docker/docker/docs/reference/commandline/swarm_unlock.md deleted file mode 100644 index 164b7d35a..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_unlock.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "swarm unlock" -description: "The swarm unlock command description and usage" -keywords: "swarm, unlock" ---- - - - -# swarm unlock - -```markdown -Usage: docker swarm unlock - -Unlock swarm - -Options: - --help Print usage -``` - -Unlocks a locked manager using a user-supplied unlock key. This command must be -used to reactivate a manager after its Docker daemon restarts if the autolock -setting is turned on. The unlock key is printed at the time when autolock is -enabled, and is also available from the `docker swarm unlock-key` command. - - -```bash -$ docker swarm unlock -Please enter unlock key: -``` - -## Related information - -* [swarm init](swarm_init.md) -* [swarm update](swarm_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_unlock_key.md b/vendor/github.com/docker/docker/docs/reference/commandline/swarm_unlock_key.md deleted file mode 100644 index a2597fe9a..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_unlock_key.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "swarm unlock-key" -description: "The swarm unlock-keycommand description and usage" -keywords: "swarm, unlock-key" ---- - - - -# swarm unlock-key - -```markdown -Usage: docker swarm unlock-key [OPTIONS] - -Manage the unlock key - -Options: - --help Print usage - -q, --quiet Only display token - --rotate Rotate unlock key -``` - -An unlock key is a secret key needed to unlock a manager after its Docker daemon -restarts. These keys are only used when the autolock feature is enabled for the -swarm. - -You can view or rotate the unlock key using `swarm unlock-key`. To view the key, -run the `docker swarm unlock-key` command without any arguments: - - -```bash -$ docker swarm unlock-key -To unlock a swarm manager after it restarts, run the `docker swarm unlock` -command and provide the following key: - - SWMKEY-1-fySn8TY4w5lKcWcJPIpKufejh9hxx5KYwx6XZigx3Q4 - -Please remember to store this key in a password manager, since without it you -will not be able to restart the manager. -``` - -Use the `--rotate` flag to rotate the unlock key to a new, randomly-generated -key: - -```bash -$ docker swarm unlock-key --rotate -Successfully rotated manager unlock key. - -To unlock a swarm manager after it restarts, run the `docker swarm unlock` -command and provide the following key: - - SWMKEY-1-7c37Cc8654o6p38HnroywCi19pllOnGtbdZEgtKxZu8 - -Please remember to store this key in a password manager, since without it you -will not be able to restart the manager. -``` - -The `-q` (or `--quiet`) flag only prints the key: - -```bash -$ docker swarm unlock-key -q -SWMKEY-1-7c37Cc8654o6p38HnroywCi19pllOnGtbdZEgtKxZu8 -``` - -### `--rotate` - -This flag rotates the unlock key, replacing it with a new randomly-generated -key. The old unlock key will no longer be accepted. - -### `--quiet` - -Only print the unlock key, without instructions. - -## Related information - -* [swarm unlock](swarm_unlock.md) -* [swarm init](swarm_init.md) -* [swarm update](swarm_update.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_update.md b/vendor/github.com/docker/docker/docs/reference/commandline/swarm_update.md deleted file mode 100644 index 0af63fe3e..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_update.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: "swarm update" -description: "The swarm update command description and usage" -keywords: "swarm, update" ---- - - - -# swarm update - -```markdown -Usage: docker swarm update [OPTIONS] - -Update the swarm - -Options: - --autolock Change manager autolocking setting (true|false) - --cert-expiry duration Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s) - --dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s) - --external-ca external-ca Specifications of one or more certificate signing endpoints - --help Print usage - --max-snapshots uint Number of additional Raft snapshots to retain - --snapshot-interval uint Number of log entries between Raft snapshots (default 10000) - --task-history-limit int Task history retention limit (default 5) -``` - -Updates a swarm with new parameter values. This command must target a manager node. - - -```bash -$ docker swarm update --cert-expiry 720h -``` - -## Related information - -* [swarm init](swarm_init.md) -* [swarm join](swarm_join.md) -* [swarm leave](swarm_leave.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/system_df.md b/vendor/github.com/docker/docker/docs/reference/commandline/system_df.md deleted file mode 100644 index c6e8bbdc6..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/system_df.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: "system df" -description: "The system df command description and usage" -keywords: "system, data, usage, disk" ---- - - - -# system df - -```markdown -Usage: docker system df [OPTIONS] - -Show docker filesystem usage - -Options: - --help Print usage - -v, --verbose Show detailed information on space usage -``` - -The `docker system df` command displays information regarding the -amount of disk space used by the docker daemon. - -By default the command will just show a summary of the data used: -```bash -$ docker system df -TYPE TOTAL ACTIVE SIZE RECLAIMABLE -Images 5 2 16.43 MB 11.63 MB (70%) -Containers 2 0 212 B 212 B (100%) -Local Volumes 2 1 36 B 0 B (0%) -``` - -A more detailed view can be requested using the `-v, --verbose` flag: -```bash -$ docker system df -v -Images space usage: - -REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS -my-curl latest b2789dd875bf 6 minutes ago 11 MB 11 MB 5 B 0 -my-jq latest ae67841be6d0 6 minutes ago 9.623 MB 8.991 MB 632.1 kB 0 - a0971c4015c1 6 minutes ago 11 MB 11 MB 0 B 0 -alpine latest 4e38e38c8ce0 9 weeks ago 4.799 MB 0 B 4.799 MB 1 -alpine 3.3 47cf20d8c26c 9 weeks ago 4.797 MB 4.797 MB 0 B 1 - -Containers space usage: - -CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES -4a7f7eebae0f alpine:latest "sh" 1 0 B 16 minutes ago Exited (0) 5 minutes ago hopeful_yalow -f98f9c2aa1ea alpine:3.3 "sh" 1 212 B 16 minutes ago Exited (0) 48 seconds ago anon-vol - -Local Volumes space usage: - -NAME LINKS SIZE -07c7bdf3e34ab76d921894c2b834f073721fccfbbcba792aa7648e3a7a664c2e 2 36 B -my-named-vol 0 0 B -``` - -* `SHARED SIZE` is the amount of space that an image shares with another one (i.e. their common data) -* `UNIQUE SIZE` is the amount of space that is only used by a given image -* `SIZE` is the virtual size of the image, it is the sum of `SHARED SIZE` and `UNIQUE SIZE` - -Note that network information is not shown because it doesn't consume the disk space. - -## Related Information -* [system prune](system_prune.md) -* [container prune](container_prune.md) -* [volume prune](volume_prune.md) -* [image prune](image_prune.md) -* [network prune](network_prune.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/system_prune.md b/vendor/github.com/docker/docker/docs/reference/commandline/system_prune.md deleted file mode 100644 index 46f8c4364..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/system_prune.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: "system prune" -description: "Remove unused data" -keywords: "system, prune, delete, remove" ---- - - - -# system prune - -```markdown -Usage: docker system prune [OPTIONS] - -Delete unused data - -Options: - -a, --all Remove all unused data not just dangling ones - -f, --force Do not prompt for confirmation - --help Print usage -``` - -Remove all unused containers, volumes, networks and images (both dangling and unreferenced). - -Example output: - -```bash -$ docker system prune -a -WARNING! This will remove: - - all stopped containers - - all volumes not used by at least one container - - all networks not used by at least one container - - all images without at least one container associated to them -Are you sure you want to continue? [y/N] y -Deleted Containers: -0998aa37185a1a7036b0e12cf1ac1b6442dcfa30a5c9650a42ed5010046f195b -73958bfb884fa81fa4cc6baf61055667e940ea2357b4036acbbe25a60f442a4d - -Deleted Volumes: -named-vol - -Deleted Images: -untagged: my-curl:latest -deleted: sha256:7d88582121f2a29031d92017754d62a0d1a215c97e8f0106c586546e7404447d -deleted: sha256:dd14a93d83593d4024152f85d7c63f76aaa4e73e228377ba1d130ef5149f4d8b -untagged: alpine:3.3 -deleted: sha256:695f3d04125db3266d4ab7bbb3c6b23aa4293923e762aa2562c54f49a28f009f -untagged: alpine:latest -deleted: sha256:ee4603260daafe1a8c2f3b78fd760922918ab2441cbb2853ed5c439e59c52f96 -deleted: sha256:9007f5987db353ec398a223bc5a135c5a9601798ba20a1abba537ea2f8ac765f -deleted: sha256:71fa90c8f04769c9721459d5aa0936db640b92c8c91c9b589b54abd412d120ab -deleted: sha256:bb1c3357b3c30ece26e6604aea7d2ec0ace4166ff34c3616701279c22444c0f3 -untagged: my-jq:latest -deleted: sha256:6e66d724542af9bc4c4abf4a909791d7260b6d0110d8e220708b09e4ee1322e1 -deleted: sha256:07b3fa89d4b17009eb3988dfc592c7d30ab3ba52d2007832dffcf6d40e3eda7f -deleted: sha256:3a88a5c81eb5c283e72db2dbc6d65cbfd8e80b6c89bb6e714cfaaa0eed99c548 - -Total reclaimed space: 13.5 MB -``` - -## Related information - -* [volume create](volume_create.md) -* [volume ls](volume_ls.md) -* [volume inspect](volume_inspect.md) -* [volume rm](volume_rm.md) -* [volume prune](volume_prune.md) -* [Understand Data Volumes](https://docs.docker.com/engine/tutorials/dockervolumes/) -* [system df](system_df.md) -* [container prune](container_prune.md) -* [image prune](image_prune.md) -* [network prune](network_prune.md) -* [system prune](system_prune.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/tag.md b/vendor/github.com/docker/docker/docs/reference/commandline/tag.md deleted file mode 100644 index 983bfe27b..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/tag.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: "tag" -description: "The tag command description and usage" -keywords: "tag, name, image" ---- - - - -# tag - -```markdown -Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] - -Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE - -Options: - --help Print usage -``` - -An image name is made up of slash-separated name components, optionally prefixed -by a registry hostname. The hostname must comply with standard DNS rules, but -may not contain underscores. If a hostname is present, it may optionally be -followed by a port number in the format `:8080`. If not present, the command -uses Docker's public registry located at `registry-1.docker.io` by default. Name -components may contain lowercase characters, digits and separators. A separator -is defined as a period, one or two underscores, or one or more dashes. A name -component may not start or end with a separator. - -A tag name may contain lowercase and uppercase characters, digits, underscores, -periods and dashes. A tag name may not start with a period or a dash and may -contain a maximum of 128 characters. - -You can group your images together using names and tags, and then upload them -to [*Share Images via Repositories*](https://docs.docker.com/engine/tutorials/dockerrepos/#/contributing-to-docker-hub). - -# Examples - -## Tagging an image referenced by ID - -To tag a local image with ID "0e5574283393" into the "fedora" repository with -"version1.0": - - docker tag 0e5574283393 fedora/httpd:version1.0 - -## Tagging an image referenced by Name - -To tag a local image with name "httpd" into the "fedora" repository with -"version1.0": - - docker tag httpd fedora/httpd:version1.0 - -Note that since the tag name is not specified, the alias is created for an -existing local version `httpd:latest`. - -## Tagging an image referenced by Name and Tag - -To tag a local image with name "httpd" and tag "test" into the "fedora" -repository with "version1.0.test": - - docker tag httpd:test fedora/httpd:version1.0.test - -## Tagging an image for a private repository - -To push an image to a private registry and not the central Docker -registry you must tag it with the registry hostname and port (if needed). - - docker tag 0e5574283393 myregistryhost:5000/fedora/httpd:version1.0 diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/top.md b/vendor/github.com/docker/docker/docs/reference/commandline/top.md deleted file mode 100644 index 0a0482877..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/top.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "top" -description: "The top command description and usage" -keywords: "container, running, processes" ---- - - - -# top - -```markdown -Usage: docker top CONTAINER [ps OPTIONS] - -Display the running processes of a container - -Options: - --help Print usage -``` diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/unpause.md b/vendor/github.com/docker/docker/docs/reference/commandline/unpause.md deleted file mode 100644 index aa2326fef..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/unpause.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "unpause" -description: "The unpause command description and usage" -keywords: "cgroups, suspend, container" ---- - - - -# unpause - -```markdown -Usage: docker unpause CONTAINER [CONTAINER...] - -Unpause all processes within one or more containers - -Options: - --help Print usage -``` - -The `docker unpause` command un-suspends all processes in the specified containers. -On Linux, it does this using the cgroups freezer. - -See the -[cgroups freezer documentation](https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt) -for further details. - -## Related information - -* [pause](pause.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/update.md b/vendor/github.com/docker/docker/docs/reference/commandline/update.md deleted file mode 100644 index a13900440..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/update.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: "update" -description: "The update command description and usage" -keywords: "resources, update, dynamically" ---- - - - -## update - -```markdown -Usage: docker update [OPTIONS] CONTAINER [CONTAINER...] - -Update configuration of one or more containers - -Options: - --blkio-weight value Block IO (relative weight), between 10 and 1000 - --cpu-period int Limit CPU CFS (Completely Fair Scheduler) period - --cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota - -c, --cpu-shares int CPU shares (relative weight) - --cpu-rt-period int Limit the CPU real-time period in microseconds - --cpu-rt-runtime int Limit the CPU real-time runtime in microseconds - --cpuset-cpus string CPUs in which to allow execution (0-3, 0,1) - --cpuset-mems string MEMs in which to allow execution (0-3, 0,1) - --help Print usage - --kernel-memory string Kernel memory limit - -m, --memory string Memory limit - --memory-reservation string Memory soft limit - --memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap - --restart string Restart policy to apply when a container exits -``` - -The `docker update` command dynamically updates container configuration. -You can use this command to prevent containers from consuming too many -resources from their Docker host. With a single command, you can place -limits on a single container or on many. To specify more than one container, -provide space-separated list of container names or IDs. - -With the exception of the `--kernel-memory` option, you can specify these -options on a running or a stopped container. On kernel version older than -4.6, you can only update `--kernel-memory` on a stopped container or on -a running container with kernel memory initialized. - -## Examples - -The following sections illustrate ways to use this command. - -### Update a container's cpu-shares - -To limit a container's cpu-shares to 512, first identify the container -name or ID. You can use `docker ps` to find these values. You can also -use the ID returned from the `docker run` command. Then, do the following: - -```bash -$ docker update --cpu-shares 512 abebf7571666 -``` - -### Update a container with cpu-shares and memory - -To update multiple resource configurations for multiple containers: - -```bash -$ docker update --cpu-shares 512 -m 300M abebf7571666 hopeful_morse -``` - -### Update a container's kernel memory constraints - -You can update a container's kernel memory limit using the `--kernel-memory` -option. On kernel version older than 4.6, this option can be updated on a -running container only if the container was started with `--kernel-memory`. -If the container was started *without* `--kernel-memory` you need to stop -the container before updating kernel memory. - -For example, if you started a container with this command: - -```bash -$ docker run -dit --name test --kernel-memory 50M ubuntu bash -``` - -You can update kernel memory while the container is running: - -```bash -$ docker update --kernel-memory 80M test -``` - -If you started a container *without* kernel memory initialized: - -```bash -$ docker run -dit --name test2 --memory 300M ubuntu bash -``` - -Update kernel memory of running container `test2` will fail. You need to stop -the container before updating the `--kernel-memory` setting. The next time you -start it, the container uses the new value. - -Kernel version newer than (include) 4.6 does not have this limitation, you -can use `--kernel-memory` the same way as other options. - -### Update a container's restart policy - -You can change a container's restart policy on a running container. The new -restart policy takes effect instantly after you run `docker update` on a -container. - -To update restart policy for one or more containers: - -```bash -$ docker update --restart=on-failure:3 abebf7571666 hopeful_morse -``` - -Note that if the container is started with "--rm" flag, you cannot update the restart -policy for it. The `AutoRemove` and `RestartPolicy` are mutually exclusive for the -container. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/version.md b/vendor/github.com/docker/docker/docs/reference/commandline/version.md deleted file mode 100644 index cb1bcee5b..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/version.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "version" -description: "The version command description and usage" -keywords: "version, architecture, api" ---- - - - -# version - -```markdown -Usage: docker version [OPTIONS] - -Show the Docker version information - -Options: - -f, --format string Format the output using the given Go template - --help Print usage -``` - -By default, this will render all version information in an easy to read -layout. If a format is specified, the given template will be executed instead. - -Go's [text/template](http://golang.org/pkg/text/template/) package -describes all the details of the format. - -## Examples - -**Default output:** - - $ docker version - Client: - Version: 1.8.0 - API version: 1.20 - Go version: go1.4.2 - Git commit: f5bae0a - Built: Tue Jun 23 17:56:00 UTC 2015 - OS/Arch: linux/amd64 - - Server: - Version: 1.8.0 - API version: 1.20 - Go version: go1.4.2 - Git commit: f5bae0a - Built: Tue Jun 23 17:56:00 UTC 2015 - OS/Arch: linux/amd64 - -**Get server version:** - - {% raw %} - $ docker version --format '{{.Server.Version}}' - 1.8.0 - {% endraw %} - -**Dump raw data:** - - {% raw %} - $ docker version --format '{{json .}}' - {"Client":{"Version":"1.8.0","ApiVersion":"1.20","GitCommit":"f5bae0a","GoVersion":"go1.4.2","Os":"linux","Arch":"amd64","BuildTime":"Tue Jun 23 17:56:00 UTC 2015"},"ServerOK":true,"Server":{"Version":"1.8.0","ApiVersion":"1.20","GitCommit":"f5bae0a","GoVersion":"go1.4.2","Os":"linux","Arch":"amd64","KernelVersion":"3.13.2-gentoo","BuildTime":"Tue Jun 23 17:56:00 UTC 2015"}} - {% endraw %} diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/volume_create.md b/vendor/github.com/docker/docker/docs/reference/commandline/volume_create.md deleted file mode 100644 index 9b188a950..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/volume_create.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: "volume create" -description: "The volume create command description and usage" -keywords: "volume, create" ---- - - - -# volume create - -```markdown -Usage: docker volume create [OPTIONS] [VOLUME] - -Create a volume - -Options: - -d, --driver string Specify volume driver name (default "local") - --help Print usage - --label value Set metadata for a volume (default []) - -o, --opt value Set driver specific options (default map[]) -``` - -Creates a new volume that containers can consume and store data in. If a name is not specified, Docker generates a random name. You create a volume and then configure the container to use it, for example: - -```bash -$ docker volume create hello -hello - -$ docker run -d -v hello:/world busybox ls /world -``` - -The mount is created inside the container's `/world` directory. Docker does not support relative paths for mount points inside the container. - -Multiple containers can use the same volume in the same time period. This is useful if two containers need access to shared data. For example, if one container writes and the other reads the data. - -Volume names must be unique among drivers. This means you cannot use the same volume name with two different drivers. If you attempt this `docker` returns an error: - -``` -A volume named "hello" already exists with the "some-other" driver. Choose a different volume name. -``` - -If you specify a volume name already in use on the current driver, Docker assumes you want to re-use the existing volume and does not return an error. - -## Driver specific options - -Some volume drivers may take options to customize the volume creation. Use the `-o` or `--opt` flags to pass driver options: - -```bash -$ docker volume create --driver fake --opt tardis=blue --opt timey=wimey -``` - -These options are passed directly to the volume driver. Options for -different volume drivers may do different things (or nothing at all). - -The built-in `local` driver on Windows does not support any options. - -The built-in `local` driver on Linux accepts options similar to the linux `mount` command. You can provide multiple options by passing the `--opt` flag multiple times. Some `mount` options (such as the `o` option) can take a comma-separated list of options. Complete list of available mount options can be found [here](http://man7.org/linux/man-pages/man8/mount.8.html). - -For example, the following creates a `tmpfs` volume called `foo` with a size of 100 megabyte and `uid` of 1000. - -```bash -$ docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m,uid=1000 foo -``` - -Another example that uses `btrfs`: - -```bash -$ docker volume create --driver local --opt type=btrfs --opt device=/dev/sda2 foo -``` - -Another example that uses `nfs` to mount the `/path/to/dir` in `rw` mode from `192.168.1.1`: - -```bash -$ docker volume create --driver local --opt type=nfs --opt o=addr=192.168.1.1,rw --opt device=:/path/to/dir foo -``` - - -## Related information - -* [volume inspect](volume_inspect.md) -* [volume ls](volume_ls.md) -* [volume rm](volume_rm.md) -* [volume prune](volume_prune.md) -* [Understand Data Volumes](https://docs.docker.com/engine/tutorials/dockervolumes/) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/volume_inspect.md b/vendor/github.com/docker/docker/docs/reference/commandline/volume_inspect.md deleted file mode 100644 index 98e0ee5ab..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/volume_inspect.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: "volume inspect" -description: "The volume inspect command description and usage" -keywords: "volume, inspect" ---- - - - -# volume inspect - -```markdown -Usage: docker volume inspect [OPTIONS] VOLUME [VOLUME...] - -Display detailed information on one or more volumes - -Options: - -f, --format string Format the output using the given Go template - --help Print usage -``` - -Returns information about a volume. By default, this command renders all results -in a JSON array. You can specify an alternate format to execute a -given template for each result. Go's -[text/template](http://golang.org/pkg/text/template/) package describes all the -details of the format. - -Example output: - - $ docker volume create - 85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d - $ docker volume inspect 85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d - [ - { - "Name": "85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d", - "Driver": "local", - "Mountpoint": "/var/lib/docker/volumes/85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d/_data", - "Status": null - } - ] - - {% raw %} - $ docker volume inspect --format '{{ .Mountpoint }}' 85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d - /var/lib/docker/volumes/85bffb0677236974f93955d8ecc4df55ef5070117b0e53333cc1b443777be24d/_data - {% endraw %} - -## Related information - -* [volume create](volume_create.md) -* [volume ls](volume_ls.md) -* [volume rm](volume_rm.md) -* [volume prune](volume_prune.md) -* [Understand Data Volumes](https://docs.docker.com/engine/tutorials/dockervolumes/) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/volume_ls.md b/vendor/github.com/docker/docker/docs/reference/commandline/volume_ls.md deleted file mode 100644 index 90ecef2ab..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/volume_ls.md +++ /dev/null @@ -1,183 +0,0 @@ ---- -title: "volume ls" -description: "The volume ls command description and usage" -keywords: "volume, list" ---- - - - -# volume ls - -```markdown -Usage: docker volume ls [OPTIONS] - -List volumes - -Aliases: - ls, list - -Options: - -f, --filter value Provide filter values (e.g. 'dangling=true') (default []) - - dangling= a volume if referenced or not - - driver= a volume's driver name - - label= or label== - - name= a volume's name - --format string Pretty-print volumes using a Go template - --help Print usage - -q, --quiet Only display volume names -``` - -List all the volumes Docker knows about. You can filter using the `-f` or `--filter` flag. Refer to the [filtering](#filtering) section for more information about available filter options. - -Example output: - -```bash -$ docker volume create rosemary -rosemary -$docker volume create tyler -tyler -$ docker volume ls -DRIVER VOLUME NAME -local rosemary -local tyler -``` - -## Filtering - -The filtering flag (`-f` or `--filter`) format is of "key=value". If there is more -than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "bif=baz"`) - -The currently supported filters are: - -* dangling (boolean - true or false, 0 or 1) -* driver (a volume driver's name) -* label (`label=` or `label==`) -* name (a volume's name) - -### dangling - -The `dangling` filter matches on all volumes not referenced by any containers - -```bash -$ docker run -d -v tyler:/tmpwork busybox - -f86a7dd02898067079c99ceacd810149060a70528eff3754d0b0f1a93bd0af18 -$ docker volume ls -f dangling=true -DRIVER VOLUME NAME -local rosemary -``` - -### driver - -The `driver` filter matches on all or part of a volume's driver name. - -The following filter matches all volumes with a driver name containing the `local` string. - -```bash -$ docker volume ls -f driver=local - -DRIVER VOLUME NAME -local rosemary -local tyler -``` - -#### Label - -The `label` filter matches volumes based on the presence of a `label` alone or -a `label` and a value. - -First, let's create some volumes to illustrate this; - -```bash -$ docker volume create the-doctor --label is-timelord=yes -the-doctor -$ docker volume create daleks --label is-timelord=no -daleks -``` - -The following example filter matches volumes with the `is-timelord` label -regardless of its value. - -```bash -$ docker volume ls --filter label=is-timelord - -DRIVER VOLUME NAME -local daleks -local the-doctor -``` - -As can be seen in the above example, both volumes with `is-timelord=yes`, and -`is-timelord=no` are returned. - -Filtering on both `key` *and* `value` of the label, produces the expected result: - -```bash -$ docker volume ls --filter label=is-timelord=yes - -DRIVER VOLUME NAME -local the-doctor -``` - -Specifying multiple label filter produces an "and" search; all conditions -should be met; - -```bash -$ docker volume ls --filter label=is-timelord=yes --filter label=is-timelord=no - -DRIVER VOLUME NAME -``` - -### name - -The `name` filter matches on all or part of a volume's name. - -The following filter matches all volumes with a name containing the `rose` string. - - $ docker volume ls -f name=rose - DRIVER VOLUME NAME - local rosemary - -## Formatting - -The formatting options (`--format`) pretty-prints volumes output -using a Go template. - -Valid placeholders for the Go template are listed below: - -Placeholder | Description ---------------|------------------------------------------------------------------------------------------ -`.Name` | Network name -`.Driver` | Network driver -`.Scope` | Network scope (local, global) -`.Mountpoint` | Whether the network is internal or not. -`.Labels` | All labels assigned to the volume. -`.Label` | Value of a specific label for this volume. For example `{{.Label "project.version"}}` - -When using the `--format` option, the `volume ls` command will either -output the data exactly as the template declares or, when using the -`table` directive, includes column headers as well. - -The following example uses a template without headers and outputs the -`Name` and `Driver` entries separated by a colon for all volumes: - -```bash -$ docker volume ls --format "{{.Name}}: {{.Driver}}" -vol1: local -vol2: local -vol3: local -``` - -## Related information - -* [volume create](volume_create.md) -* [volume inspect](volume_inspect.md) -* [volume rm](volume_rm.md) -* [volume prune](volume_prune.md) -* [Understand Data Volumes](https://docs.docker.com/engine/tutorials/dockervolumes/) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/volume_prune.md b/vendor/github.com/docker/docker/docs/reference/commandline/volume_prune.md deleted file mode 100644 index d910a49cd..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/volume_prune.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "volume prune" -description: "Remove unused volumes" -keywords: "volume, prune, delete" ---- - - - -# volume prune - -```markdown -Usage: docker volume prune [OPTIONS] - -Remove all unused volumes - -Options: - -f, --force Do not prompt for confirmation - --help Print usage -``` - -Remove all unused volumes. Unused volumes are those which are not referenced by any containers - -Example output: - -```bash -$ docker volume prune -WARNING! This will remove all volumes not used by at least one container. -Are you sure you want to continue? [y/N] y -Deleted Volumes: -07c7bdf3e34ab76d921894c2b834f073721fccfbbcba792aa7648e3a7a664c2e -my-named-vol - -Total reclaimed space: 36 B -``` - -## Related information - -* [volume create](volume_create.md) -* [volume ls](volume_ls.md) -* [volume inspect](volume_inspect.md) -* [volume rm](volume_rm.md) -* [Understand Data Volumes](https://docs.docker.com/engine/tutorials/dockervolumes/) -* [system df](system_df.md) -* [container prune](container_prune.md) -* [image prune](image_prune.md) -* [network prune](network_prune.md) -* [system prune](system_prune.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/volume_rm.md b/vendor/github.com/docker/docker/docs/reference/commandline/volume_rm.md deleted file mode 100644 index 1bf9dba22..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/volume_rm.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "volume rm" -description: "the volume rm command description and usage" -keywords: "volume, rm" ---- - - - -# volume rm - -```markdown -Usage: docker volume rm [OPTIONS] VOLUME [VOLUME...] - -Remove one or more volumes - -Aliases: - rm, remove - -Options: - -f, --force Force the removal of one or more volumes - --help Print usage -``` - -Remove one or more volumes. You cannot remove a volume that is in use by a container. - - $ docker volume rm hello - hello - -## Related information - -* [volume create](volume_create.md) -* [volume inspect](volume_inspect.md) -* [volume ls](volume_ls.md) -* [volume prune](volume_prune.md) -* [Understand Data Volumes](https://docs.docker.com/engine/tutorials/dockervolumes/) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/wait.md b/vendor/github.com/docker/docker/docs/reference/commandline/wait.md deleted file mode 100644 index a07b82b07..000000000 --- a/vendor/github.com/docker/docker/docs/reference/commandline/wait.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "wait" -description: "The wait command description and usage" -keywords: "container, stop, wait" ---- - - - -# wait - -```markdown -Usage: docker wait CONTAINER [CONTAINER...] - -Block until one or more containers stop, then print their exit codes - -Options: - --help Print usage -``` diff --git a/vendor/github.com/docker/docker/docs/reference/glossary.md b/vendor/github.com/docker/docker/docs/reference/glossary.md deleted file mode 100644 index 0bc39a202..000000000 --- a/vendor/github.com/docker/docker/docs/reference/glossary.md +++ /dev/null @@ -1,286 +0,0 @@ ---- -title: "Docker Glossary" -description: "Glossary of terms used around Docker" -keywords: "glossary, docker, terms, definitions" ---- - - - -# Glossary - -A list of terms used around the Docker project. - -## aufs - -aufs (advanced multi layered unification filesystem) is a Linux [filesystem](#filesystem) that -Docker supports as a storage backend. It implements the -[union mount](http://en.wikipedia.org/wiki/Union_mount) for Linux file systems. - -## base image - -An image that has no parent is a **base image**. - -## boot2docker - -[boot2docker](http://boot2docker.io/) is a lightweight Linux distribution made -specifically to run Docker containers. The boot2docker management tool for Mac and Windows was deprecated and replaced by [`docker-machine`](#machine) which you can install with the Docker Toolbox. - -## btrfs - -btrfs (B-tree file system) is a Linux [filesystem](#filesystem) that Docker -supports as a storage backend. It is a [copy-on-write](http://en.wikipedia.org/wiki/Copy-on-write) -filesystem. - -## build - -build is the process of building Docker images using a [Dockerfile](#dockerfile). -The build uses a Dockerfile and a "context". The context is the set of files in the -directory in which the image is built. - -## cgroups - -cgroups is a Linux kernel feature that limits, accounts for, and isolates -the resource usage (CPU, memory, disk I/O, network, etc.) of a collection -of processes. Docker relies on cgroups to control and isolate resource limits. - -*Also known as : control groups* - -## Compose - -[Compose](https://github.com/docker/compose) is a tool for defining and -running complex applications with Docker. With compose, you define a -multi-container application in a single file, then spin your -application up in a single command which does everything that needs to -be done to get it running. - -*Also known as : docker-compose, fig* - -## container - -A container is a runtime instance of a [docker image](#image). - -A Docker container consists of - -- A Docker image -- Execution environment -- A standard set of instructions - -The concept is borrowed from Shipping Containers, which define a standard to ship -goods globally. Docker defines a standard to ship software. - -## data volume - -A data volume is a specially-designated directory within one or more containers -that bypasses the Union File System. Data volumes are designed to persist data, -independent of the container's life cycle. Docker therefore never automatically -delete volumes when you remove a container, nor will it "garbage collect" -volumes that are no longer referenced by a container. - - -## Docker - -The term Docker can refer to - -- The Docker project as a whole, which is a platform for developers and sysadmins to -develop, ship, and run applications -- The docker daemon process running on the host which manages images and containers - - -## Docker Hub - -The [Docker Hub](https://hub.docker.com/) is a centralized resource for working with -Docker and its components. It provides the following services: - -- Docker image hosting -- User authentication -- Automated image builds and work-flow tools such as build triggers and web hooks -- Integration with GitHub and Bitbucket - - -## Dockerfile - -A Dockerfile is a text document that contains all the commands you would -normally execute manually in order to build a Docker image. Docker can -build images automatically by reading the instructions from a Dockerfile. - -## filesystem - -A file system is the method an operating system uses to name files -and assign them locations for efficient storage and retrieval. - -Examples : - -- Linux : ext4, aufs, btrfs, zfs -- Windows : NTFS -- macOS : HFS+ - -## image - -Docker images are the basis of [containers](#container). An Image is an -ordered collection of root filesystem changes and the corresponding -execution parameters for use within a container runtime. An image typically -contains a union of layered filesystems stacked on top of each other. An image -does not have state and it never changes. - -## libcontainer - -libcontainer provides a native Go implementation for creating containers with -namespaces, cgroups, capabilities, and filesystem access controls. It allows -you to manage the lifecycle of the container performing additional operations -after the container is created. - -## libnetwork - -libnetwork provides a native Go implementation for creating and managing container -network namespaces and other network resources. It manage the networking lifecycle -of the container performing additional operations after the container is created. - -## link - -links provide a legacy interface to connect Docker containers running on the -same host to each other without exposing the hosts' network ports. Use the -Docker networks feature instead. - -## Machine - -[Machine](https://github.com/docker/machine) is a Docker tool which -makes it really easy to create Docker hosts on your computer, on -cloud providers and inside your own data center. It creates servers, -installs Docker on them, then configures the Docker client to talk to them. - -*Also known as : docker-machine* - -## node - -A [node](https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/) is a physical or virtual -machine running an instance of the Docker Engine in swarm mode. - -**Manager nodes** perform swarm management and orchestration duties. By default -manager nodes are also worker nodes. - -**Worker nodes** execute tasks. - -## overlay network driver - -Overlay network driver provides out of the box multi-host network connectivity -for docker containers in a cluster. - -## overlay storage driver - -OverlayFS is a [filesystem](#filesystem) service for Linux which implements a -[union mount](http://en.wikipedia.org/wiki/Union_mount) for other file systems. -It is supported by the Docker daemon as a storage driver. - -## registry - -A Registry is a hosted service containing [repositories](#repository) of [images](#image) -which responds to the Registry API. - -The default registry can be accessed using a browser at [Docker Hub](#docker-hub) -or using the `docker search` command. - -## repository - -A repository is a set of Docker images. A repository can be shared by pushing it -to a [registry](#registry) server. The different images in the repository can be -labeled using [tags](#tag). - -Here is an example of the shared [nginx repository](https://hub.docker.com/_/nginx/) -and its [tags](https://hub.docker.com/r/library/nginx/tags/) - - -## service - -A [service](https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/) is the definition of how -you want to run your application containers in a swarm. At the most basic level -a service defines which container image to run in the swarm and which commands -to run in the container. For orchestration purposes, the service defines the -"desired state", meaning how many containers to run as tasks and constraints for -deploying the containers. - -Frequently a service is a microservice within the context of some larger -application. Examples of services might include an HTTP server, a database, or -any other type of executable program that you wish to run in a distributed -environment. - -## service discovery - -Swarm mode [service discovery](https://docs.docker.com/engine/swarm/networking/#use-swarm-mode-service-discovery) is a DNS component -internal to the swarm that automatically assigns each service on an overlay -network in the swarm a VIP and DNS entry. Containers on the network share DNS -mappings for the service via gossip so any container on the network can access -the service via its service name. - -You don’t need to expose service-specific ports to make the service available to -other services on the same overlay network. The swarm’s internal load balancer -automatically distributes requests to the service VIP among the active tasks. - -## swarm - -A [swarm](https://docs.docker.com/engine/swarm/) is a cluster of one or more Docker Engines running in [swarm mode](#swarm-mode). - -## Docker Swarm - -Do not confuse [Docker Swarm](https://github.com/docker/swarm) with the [swarm mode](#swarm-mode) features in Docker Engine. - -Docker Swarm is the name of a standalone native clustering tool for Docker. -Docker Swarm pools together several Docker hosts and exposes them as a single -virtual Docker host. It serves the standard Docker API, so any tool that already -works with Docker can now transparently scale up to multiple hosts. - -*Also known as : docker-swarm* - -## swarm mode - -[Swarm mode](https://docs.docker.com/engine/swarm/) refers to cluster management and orchestration -features embedded in Docker Engine. When you initialize a new swarm (cluster) or -join nodes to a swarm, the Docker Engine runs in swarm mode. - -## tag - -A tag is a label applied to a Docker image in a [repository](#repository). -tags are how various images in a repository are distinguished from each other. - -*Note : This label is not related to the key=value labels set for docker daemon* - -## task - -A [task](https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/#/tasks-and-scheduling) is the -atomic unit of scheduling within a swarm. A task carries a Docker container and -the commands to run inside the container. Manager nodes assign tasks to worker -nodes according to the number of replicas set in the service scale. - -The diagram below illustrates the relationship of services to tasks and -containers. - -![services diagram](https://docs.docker.com/engine/swarm/images/services-diagram.png) - -## Toolbox - -Docker Toolbox is the installer for Mac and Windows users. - - -## Union file system - -Union file systems, or UnionFS, are file systems that operate by creating layers, making them -very lightweight and fast. Docker uses union file systems to provide the building -blocks for containers. - - -## virtual machine - -A virtual machine is a program that emulates a complete computer and imitates dedicated hardware. -It shares physical hardware resources with other users but isolates the operating system. The -end user has the same experience on a Virtual Machine as they would have on dedicated hardware. - -Compared to containers, a virtual machine is heavier to run, provides more isolation, -gets its own set of resources and does minimal sharing. - -*Also known as : VM* diff --git a/vendor/github.com/docker/docker/docs/reference/index.md b/vendor/github.com/docker/docker/docs/reference/index.md deleted file mode 100644 index f24c342df..000000000 --- a/vendor/github.com/docker/docker/docs/reference/index.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "Engine reference" -description: "Docker Engine reference" -keywords: "Engine" ---- - - - -# Engine reference - -* [Dockerfile reference](builder.md) -* [Docker run reference](run.md) -* [Command line reference](commandline/index.md) -* [API Reference](https://docs.docker.com/engine/api/) diff --git a/vendor/github.com/docker/docker/docs/reference/run.md b/vendor/github.com/docker/docker/docs/reference/run.md deleted file mode 100644 index 73769ed61..000000000 --- a/vendor/github.com/docker/docker/docs/reference/run.md +++ /dev/null @@ -1,1555 +0,0 @@ ---- -title: "Docker run reference" -description: "Configure containers at runtime" -keywords: "docker, run, configure, runtime" ---- - - - -# Docker run reference - -Docker runs processes in isolated containers. A container is a process -which runs on a host. The host may be local or remote. When an operator -executes `docker run`, the container process that runs is isolated in -that it has its own file system, its own networking, and its own -isolated process tree separate from the host. - -This page details how to use the `docker run` command to define the -container's resources at runtime. - -## General form - -The basic `docker run` command takes this form: - - $ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...] - -The `docker run` command must specify an [*IMAGE*](glossary.md#image) -to derive the container from. An image developer can define image -defaults related to: - - * detached or foreground running - * container identification - * network settings - * runtime constraints on CPU and memory - -With the `docker run [OPTIONS]` an operator can add to or override the -image defaults set by a developer. And, additionally, operators can -override nearly all the defaults set by the Docker runtime itself. The -operator's ability to override image and Docker runtime defaults is why -[*run*](commandline/run.md) has more options than any -other `docker` command. - -To learn how to interpret the types of `[OPTIONS]`, see [*Option -types*](commandline/cli.md#option-types). - -> **Note**: Depending on your Docker system configuration, you may be -> required to preface the `docker run` command with `sudo`. To avoid -> having to use `sudo` with the `docker` command, your system -> administrator can create a Unix group called `docker` and add users to -> it. For more information about this configuration, refer to the Docker -> installation documentation for your operating system. - - -## Operator exclusive options - -Only the operator (the person executing `docker run`) can set the -following options. - - - [Detached vs foreground](#detached-vs-foreground) - - [Detached (-d)](#detached--d) - - [Foreground](#foreground) - - [Container identification](#container-identification) - - [Name (--name)](#name---name) - - [PID equivalent](#pid-equivalent) - - [IPC settings (--ipc)](#ipc-settings---ipc) - - [Network settings](#network-settings) - - [Restart policies (--restart)](#restart-policies---restart) - - [Clean up (--rm)](#clean-up---rm) - - [Runtime constraints on resources](#runtime-constraints-on-resources) - - [Runtime privilege and Linux capabilities](#runtime-privilege-and-linux-capabilities) - -## Detached vs foreground - -When starting a Docker container, you must first decide if you want to -run the container in the background in a "detached" mode or in the -default foreground mode: - - -d=false: Detached mode: Run container in the background, print new container id - -### Detached (-d) - -To start a container in detached mode, you use `-d=true` or just `-d` option. By -design, containers started in detached mode exit when the root process used to -run the container exits. A container in detached mode cannot be automatically -removed when it stops, this means you cannot use the `--rm` option with `-d` option. - -Do not pass a `service x start` command to a detached container. For example, this -command attempts to start the `nginx` service. - - $ docker run -d -p 80:80 my_image service nginx start - -This succeeds in starting the `nginx` service inside the container. However, it -fails the detached container paradigm in that, the root process (`service nginx -start`) returns and the detached container stops as designed. As a result, the -`nginx` service is started but could not be used. Instead, to start a process -such as the `nginx` web server do the following: - - $ docker run -d -p 80:80 my_image nginx -g 'daemon off;' - -To do input/output with a detached container use network connections or shared -volumes. These are required because the container is no longer listening to the -command line where `docker run` was run. - -To reattach to a detached container, use `docker` -[*attach*](commandline/attach.md) command. - -### Foreground - -In foreground mode (the default when `-d` is not specified), `docker -run` can start the process in the container and attach the console to -the process's standard input, output, and standard error. It can even -pretend to be a TTY (this is what most command line executables expect) -and pass along signals. All of that is configurable: - - -a=[] : Attach to `STDIN`, `STDOUT` and/or `STDERR` - -t : Allocate a pseudo-tty - --sig-proxy=true: Proxy all received signals to the process (non-TTY mode only) - -i : Keep STDIN open even if not attached - -If you do not specify `-a` then Docker will [attach to both stdout and stderr -]( https://github.com/docker/docker/blob/4118e0c9eebda2412a09ae66e90c34b85fae3275/runconfig/opts/parse.go#L267). -You can specify to which of the three standard streams (`STDIN`, `STDOUT`, -`STDERR`) you'd like to connect instead, as in: - - $ docker run -a stdin -a stdout -i -t ubuntu /bin/bash - -For interactive processes (like a shell), you must use `-i -t` together in -order to allocate a tty for the container process. `-i -t` is often written `-it` -as you'll see in later examples. Specifying `-t` is forbidden when the client -standard output is redirected or piped, such as in: - - $ echo test | docker run -i busybox cat - ->**Note**: A process running as PID 1 inside a container is treated ->specially by Linux: it ignores any signal with the default action. ->So, the process will not terminate on `SIGINT` or `SIGTERM` unless it is ->coded to do so. - -## Container identification - -### Name (--name) - -The operator can identify a container in three ways: - -| Identifier type | Example value | -| --------------------- | ------------------------------------------------------------------ | -| UUID long identifier | "f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778" | -| UUID short identifier | "f78375b1c487" | -| Name | "evil_ptolemy" | - -The UUID identifiers come from the Docker daemon. If you do not assign a -container name with the `--name` option, then the daemon generates a random -string name for you. Defining a `name` can be a handy way to add meaning to a -container. If you specify a `name`, you can use it when referencing the -container within a Docker network. This works for both background and foreground -Docker containers. - -> **Note**: Containers on the default bridge network must be linked to -> communicate by name. - -### PID equivalent - -Finally, to help with automation, you can have Docker write the -container ID out to a file of your choosing. This is similar to how some -programs might write out their process ID to a file (you've seen them as -PID files): - - --cidfile="": Write the container ID to the file - -### Image[:tag] - -While not strictly a means of identifying a container, you can specify a version of an -image you'd like to run the container with by adding `image[:tag]` to the command. For -example, `docker run ubuntu:14.04`. - -### Image[@digest] - -Images using the v2 or later image format have a content-addressable identifier -called a digest. As long as the input used to generate the image is unchanged, -the digest value is predictable and referenceable. - -The following example runs a container from the `alpine` image with the -`sha256:9cacb71397b640eca97488cf08582ae4e4068513101088e9f96c9814bfda95e0` digest: - - $ docker run alpine@sha256:9cacb71397b640eca97488cf08582ae4e4068513101088e9f96c9814bfda95e0 date - -## PID settings (--pid) - - --pid="" : Set the PID (Process) Namespace mode for the container, - 'container:': joins another container's PID namespace - 'host': use the host's PID namespace inside the container - -By default, all containers have the PID namespace enabled. - -PID namespace provides separation of processes. The PID Namespace removes the -view of the system processes, and allows process ids to be reused including -pid 1. - -In certain cases you want your container to share the host's process namespace, -basically allowing processes within the container to see all of the processes -on the system. For example, you could build a container with debugging tools -like `strace` or `gdb`, but want to use these tools when debugging processes -within the container. - -### Example: run htop inside a container - -Create this Dockerfile: - -``` -FROM alpine:latest -RUN apk add --update htop && rm -rf /var/cache/apk/* -CMD ["htop"] -``` - -Build the Dockerfile and tag the image as `myhtop`: - -```bash -$ docker build -t myhtop . -``` - -Use the following command to run `htop` inside a container: - -``` -$ docker run -it --rm --pid=host myhtop -``` - -Joining another container's pid namespace can be used for debugging that container. - -### Example - -Start a container running a redis server: - -```bash -$ docker run --name my-redis -d redis -``` - -Debug the redis container by running another container that has strace in it: - -```bash -$ docker run -it --pid=container:my-redis my_strace_docker_image bash -$ strace -p 1 -``` - -## UTS settings (--uts) - - --uts="" : Set the UTS namespace mode for the container, - 'host': use the host's UTS namespace inside the container - -The UTS namespace is for setting the hostname and the domain that is visible -to running processes in that namespace. By default, all containers, including -those with `--network=host`, have their own UTS namespace. The `host` setting will -result in the container using the same UTS namespace as the host. Note that -`--hostname` is invalid in `host` UTS mode. - -You may wish to share the UTS namespace with the host if you would like the -hostname of the container to change as the hostname of the host changes. A -more advanced use case would be changing the host's hostname from a container. - -## IPC settings (--ipc) - - --ipc="" : Set the IPC mode for the container, - 'container:': reuses another container's IPC namespace - 'host': use the host's IPC namespace inside the container - -By default, all containers have the IPC namespace enabled. - -IPC (POSIX/SysV IPC) namespace provides separation of named shared memory -segments, semaphores and message queues. - -Shared memory segments are used to accelerate inter-process communication at -memory speed, rather than through pipes or through the network stack. Shared -memory is commonly used by databases and custom-built (typically C/OpenMPI, -C++/using boost libraries) high performance applications for scientific -computing and financial services industries. If these types of applications -are broken into multiple containers, you might need to share the IPC mechanisms -of the containers. - -## Network settings - - --dns=[] : Set custom dns servers for the container - --network="bridge" : Connect a container to a network - 'bridge': create a network stack on the default Docker bridge - 'none': no networking - 'container:': reuse another container's network stack - 'host': use the Docker host network stack - '|': connect to a user-defined network - --network-alias=[] : Add network-scoped alias for the container - --add-host="" : Add a line to /etc/hosts (host:IP) - --mac-address="" : Sets the container's Ethernet device's MAC address - --ip="" : Sets the container's Ethernet device's IPv4 address - --ip6="" : Sets the container's Ethernet device's IPv6 address - --link-local-ip=[] : Sets one or more container's Ethernet device's link local IPv4/IPv6 addresses - -By default, all containers have networking enabled and they can make any -outgoing connections. The operator can completely disable networking -with `docker run --network none` which disables all incoming and outgoing -networking. In cases like this, you would perform I/O through files or -`STDIN` and `STDOUT` only. - -Publishing ports and linking to other containers only works with the default (bridge). The linking feature is a legacy feature. You should always prefer using Docker network drivers over linking. - -Your container will use the same DNS servers as the host by default, but -you can override this with `--dns`. - -By default, the MAC address is generated using the IP address allocated to the -container. You can set the container's MAC address explicitly by providing a -MAC address via the `--mac-address` parameter (format:`12:34:56:78:9a:bc`).Be -aware that Docker does not check if manually specified MAC addresses are unique. - -Supported networks : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NetworkDescription
none - No networking in the container. -
bridge (default) - Connect the container to the bridge via veth interfaces. -
host - Use the host's network stack inside the container. -
container:<name|id> - Use the network stack of another container, specified via - its name or id. -
NETWORK - Connects the container to a user created network (using docker network create command) -
- -#### Network: none - -With the network is `none` a container will not have -access to any external routes. The container will still have a -`loopback` interface enabled in the container but it does not have any -routes to external traffic. - -#### Network: bridge - -With the network set to `bridge` a container will use docker's -default networking setup. A bridge is setup on the host, commonly named -`docker0`, and a pair of `veth` interfaces will be created for the -container. One side of the `veth` pair will remain on the host attached -to the bridge while the other side of the pair will be placed inside the -container's namespaces in addition to the `loopback` interface. An IP -address will be allocated for containers on the bridge's network and -traffic will be routed though this bridge to the container. - -Containers can communicate via their IP addresses by default. To communicate by -name, they must be linked. - -#### Network: host - -With the network set to `host` a container will share the host's -network stack and all interfaces from the host will be available to the -container. The container's hostname will match the hostname on the host -system. Note that `--mac-address` is invalid in `host` netmode. Even in `host` -network mode a container has its own UTS namespace by default. As such -`--hostname` is allowed in `host` network mode and will only change the -hostname inside the container. -Similar to `--hostname`, the `--add-host`, `--dns`, `--dns-search`, and -`--dns-option` options can be used in `host` network mode. These options update -`/etc/hosts` or `/etc/resolv.conf` inside the container. No change are made to -`/etc/hosts` and `/etc/resolv.conf` on the host. - -Compared to the default `bridge` mode, the `host` mode gives *significantly* -better networking performance since it uses the host's native networking stack -whereas the bridge has to go through one level of virtualization through the -docker daemon. It is recommended to run containers in this mode when their -networking performance is critical, for example, a production Load Balancer -or a High Performance Web Server. - -> **Note**: `--network="host"` gives the container full access to local system -> services such as D-bus and is therefore considered insecure. - -#### Network: container - -With the network set to `container` a container will share the -network stack of another container. The other container's name must be -provided in the format of `--network container:`. Note that `--add-host` -`--hostname` `--dns` `--dns-search` `--dns-option` and `--mac-address` are -invalid in `container` netmode, and `--publish` `--publish-all` `--expose` are -also invalid in `container` netmode. - -Example running a Redis container with Redis binding to `localhost` then -running the `redis-cli` command and connecting to the Redis server over the -`localhost` interface. - - $ docker run -d --name redis example/redis --bind 127.0.0.1 - $ # use the redis container's network stack to access localhost - $ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1 - -#### User-defined network - -You can create a network using a Docker network driver or an external network -driver plugin. You can connect multiple containers to the same network. Once -connected to a user-defined network, the containers can communicate easily using -only another container's IP address or name. - -For `overlay` networks or custom plugins that support multi-host connectivity, -containers connected to the same multi-host network but launched from different -Engines can also communicate in this way. - -The following example creates a network using the built-in `bridge` network -driver and running a container in the created network - -``` -$ docker network create -d bridge my-net -$ docker run --network=my-net -itd --name=container3 busybox -``` - -### Managing /etc/hosts - -Your container will have lines in `/etc/hosts` which define the hostname of the -container itself as well as `localhost` and a few other common things. The -`--add-host` flag can be used to add additional lines to `/etc/hosts`. - - $ docker run -it --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts - 172.17.0.22 09d03f76bf2c - fe00::0 ip6-localnet - ff00::0 ip6-mcastprefix - ff02::1 ip6-allnodes - ff02::2 ip6-allrouters - 127.0.0.1 localhost - ::1 localhost ip6-localhost ip6-loopback - 86.75.30.9 db-static - -If a container is connected to the default bridge network and `linked` -with other containers, then the container's `/etc/hosts` file is updated -with the linked container's name. - -If the container is connected to user-defined network, the container's -`/etc/hosts` file is updated with names of all other containers in that -user-defined network. - -> **Note** Since Docker may live update the container’s `/etc/hosts` file, there -may be situations when processes inside the container can end up reading an -empty or incomplete `/etc/hosts` file. In most cases, retrying the read again -should fix the problem. - -## Restart policies (--restart) - -Using the `--restart` flag on Docker run you can specify a restart policy for -how a container should or should not be restarted on exit. - -When a restart policy is active on a container, it will be shown as either `Up` -or `Restarting` in [`docker ps`](commandline/ps.md). It can also be -useful to use [`docker events`](commandline/events.md) to see the -restart policy in effect. - -Docker supports the following restart policies: - - - - - - - - - - - - - - - - - - - - - - - - - - -
PolicyResult
no - Do not automatically restart the container when it exits. This is the - default. -
- - on-failure[:max-retries] - - - Restart only if the container exits with a non-zero exit status. - Optionally, limit the number of restart retries the Docker - daemon attempts. -
always - Always restart the container regardless of the exit status. - When you specify always, the Docker daemon will try to restart - the container indefinitely. The container will also always start - on daemon startup, regardless of the current state of the container. -
unless-stopped - Always restart the container regardless of the exit status, but - do not start it on daemon startup if the container has been put - to a stopped state before. -
- -An ever increasing delay (double the previous delay, starting at 100 -milliseconds) is added before each restart to prevent flooding the server. -This means the daemon will wait for 100 ms, then 200 ms, 400, 800, 1600, -and so on until either the `on-failure` limit is hit, or when you `docker stop` -or `docker rm -f` the container. - -If a container is successfully restarted (the container is started and runs -for at least 10 seconds), the delay is reset to its default value of 100 ms. - -You can specify the maximum amount of times Docker will try to restart the -container when using the **on-failure** policy. The default is that Docker -will try forever to restart the container. The number of (attempted) restarts -for a container can be obtained via [`docker inspect`](commandline/inspect.md). For example, to get the number of restarts -for container "my-container"; - - {% raw %} - $ docker inspect -f "{{ .RestartCount }}" my-container - # 2 - {% endraw %} - -Or, to get the last time the container was (re)started; - - {% raw %} - $ docker inspect -f "{{ .State.StartedAt }}" my-container - # 2015-03-04T23:47:07.691840179Z - {% endraw %} - - -Combining `--restart` (restart policy) with the `--rm` (clean up) flag results -in an error. On container restart, attached clients are disconnected. See the -examples on using the [`--rm` (clean up)](#clean-up-rm) flag later in this page. - -### Examples - - $ docker run --restart=always redis - -This will run the `redis` container with a restart policy of **always** -so that if the container exits, Docker will restart it. - - $ docker run --restart=on-failure:10 redis - -This will run the `redis` container with a restart policy of **on-failure** -and a maximum restart count of 10. If the `redis` container exits with a -non-zero exit status more than 10 times in a row Docker will abort trying to -restart the container. Providing a maximum restart limit is only valid for the -**on-failure** policy. - -## Exit Status - -The exit code from `docker run` gives information about why the container -failed to run or why it exited. When `docker run` exits with a non-zero code, -the exit codes follow the `chroot` standard, see below: - -**_125_** if the error is with Docker daemon **_itself_** - - $ docker run --foo busybox; echo $? - # flag provided but not defined: --foo - See 'docker run --help'. - 125 - -**_126_** if the **_contained command_** cannot be invoked - - $ docker run busybox /etc; echo $? - # docker: Error response from daemon: Container command '/etc' could not be invoked. - 126 - -**_127_** if the **_contained command_** cannot be found - - $ docker run busybox foo; echo $? - # docker: Error response from daemon: Container command 'foo' not found or does not exist. - 127 - -**_Exit code_** of **_contained command_** otherwise - - $ docker run busybox /bin/sh -c 'exit 3'; echo $? - # 3 - -## Clean up (--rm) - -By default a container's file system persists even after the container -exits. This makes debugging a lot easier (since you can inspect the -final state) and you retain all your data by default. But if you are -running short-term **foreground** processes, these container file -systems can really pile up. If instead you'd like Docker to -**automatically clean up the container and remove the file system when -the container exits**, you can add the `--rm` flag: - - --rm=false: Automatically remove the container when it exits (incompatible with -d) - -> **Note**: When you set the `--rm` flag, Docker also removes the volumes -associated with the container when the container is removed. This is similar -to running `docker rm -v my-container`. Only volumes that are specified without a -name are removed. For example, with -`docker run --rm -v /foo -v awesome:/bar busybox top`, the volume for `/foo` will be removed, -but the volume for `/bar` will not. Volumes inherited via `--volumes-from` will be removed -with the same logic -- if the original volume was specified with a name it will **not** be removed. - -## Security configuration - --security-opt="label=user:USER" : Set the label user for the container - --security-opt="label=role:ROLE" : Set the label role for the container - --security-opt="label=type:TYPE" : Set the label type for the container - --security-opt="label=level:LEVEL" : Set the label level for the container - --security-opt="label=disable" : Turn off label confinement for the container - --security-opt="apparmor=PROFILE" : Set the apparmor profile to be applied to the container - --security-opt="no-new-privileges" : Disable container processes from gaining new privileges - --security-opt="seccomp=unconfined" : Turn off seccomp confinement for the container - --security-opt="seccomp=profile.json": White listed syscalls seccomp Json file to be used as a seccomp filter - - -You can override the default labeling scheme for each container by specifying -the `--security-opt` flag. Specifying the level in the following command -allows you to share the same content between containers. - - $ docker run --security-opt label=level:s0:c100,c200 -it fedora bash - -> **Note**: Automatic translation of MLS labels is not currently supported. - -To disable the security labeling for this container versus running with the -`--privileged` flag, use the following command: - - $ docker run --security-opt label=disable -it fedora bash - -If you want a tighter security policy on the processes within a container, -you can specify an alternate type for the container. You could run a container -that is only allowed to listen on Apache ports by executing the following -command: - - $ docker run --security-opt label=type:svirt_apache_t -it centos bash - -> **Note**: You would have to write policy defining a `svirt_apache_t` type. - -If you want to prevent your container processes from gaining additional -privileges, you can execute the following command: - - $ docker run --security-opt no-new-privileges -it centos bash - -This means that commands that raise privileges such as `su` or `sudo` will no longer work. -It also causes any seccomp filters to be applied later, after privileges have been dropped -which may mean you can have a more restrictive set of filters. -For more details, see the [kernel documentation](https://www.kernel.org/doc/Documentation/prctl/no_new_privs.txt). - -## Specifying custom cgroups - -Using the `--cgroup-parent` flag, you can pass a specific cgroup to run a -container in. This allows you to create and manage cgroups on their own. You can -define custom resources for those cgroups and put containers under a common -parent group. - -## Runtime constraints on resources - -The operator can also adjust the performance parameters of the -container: - -| Option | Description | -| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| `-m`, `--memory=""` | Memory limit (format: `[]`). Number is a positive integer. Unit can be one of `b`, `k`, `m`, or `g`. Minimum is 4M. | -| `--memory-swap=""` | Total memory limit (memory + swap, format: `[]`). Number is a positive integer. Unit can be one of `b`, `k`, `m`, or `g`. | -| `--memory-reservation=""` | Memory soft limit (format: `[]`). Number is a positive integer. Unit can be one of `b`, `k`, `m`, or `g`. | -| `--kernel-memory=""` | Kernel memory limit (format: `[]`). Number is a positive integer. Unit can be one of `b`, `k`, `m`, or `g`. Minimum is 4M. | -| `-c`, `--cpu-shares=0` | CPU shares (relative weight) | -| `--cpus=0.000` | Number of CPUs. Number is a fractional number. 0.000 means no limit. | -| `--cpu-period=0` | Limit the CPU CFS (Completely Fair Scheduler) period | -| `--cpuset-cpus=""` | CPUs in which to allow execution (0-3, 0,1) | -| `--cpuset-mems=""` | Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. | -| `--cpu-quota=0` | Limit the CPU CFS (Completely Fair Scheduler) quota | -| `--cpu-rt-period=0` | Limit the CPU real-time period. In microseconds. Requires parent cgroups be set and cannot be higher than parent. Also check rtprio ulimits. | -| `--cpu-rt-runtime=0` | Limit the CPU real-time runtime. In microseconds. Requires parent cgroups be set and cannot be higher than parent. Also check rtprio ulimits. | -| `--blkio-weight=0` | Block IO weight (relative weight) accepts a weight value between 10 and 1000. | -| `--blkio-weight-device=""` | Block IO weight (relative device weight, format: `DEVICE_NAME:WEIGHT`) | -| `--device-read-bps=""` | Limit read rate from a device (format: `:[]`). Number is a positive integer. Unit can be one of `kb`, `mb`, or `gb`. | -| `--device-write-bps=""` | Limit write rate to a device (format: `:[]`). Number is a positive integer. Unit can be one of `kb`, `mb`, or `gb`. | -| `--device-read-iops="" ` | Limit read rate (IO per second) from a device (format: `:`). Number is a positive integer. | -| `--device-write-iops="" ` | Limit write rate (IO per second) to a device (format: `:`). Number is a positive integer. | -| `--oom-kill-disable=false` | Whether to disable OOM Killer for the container or not. | -| `--oom-score-adj=0` | Tune container's OOM preferences (-1000 to 1000) | -| `--memory-swappiness=""` | Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100. | -| `--shm-size=""` | Size of `/dev/shm`. The format is ``. `number` must be greater than `0`. Unit is optional and can be `b` (bytes), `k` (kilobytes), `m` (megabytes), or `g` (gigabytes). If you omit the unit, the system uses bytes. If you omit the size entirely, the system uses `64m`. | - -### User memory constraints - -We have four ways to set user memory usage: - - - - - - - - - - - - - - - - - - - - - - - - - - -
OptionResult
- memory=inf, memory-swap=inf (default) - - There is no memory limit for the container. The container can use - as much memory as needed. -
memory=L<inf, memory-swap=inf - (specify memory and set memory-swap as -1) The container is - not allowed to use more than L bytes of memory, but can use as much swap - as is needed (if the host supports swap memory). -
memory=L<inf, memory-swap=2*L - (specify memory without memory-swap) The container is not allowed to - use more than L bytes of memory, swap plus memory usage is double - of that. -
- memory=L<inf, memory-swap=S<inf, L<=S - - (specify both memory and memory-swap) The container is not allowed to - use more than L bytes of memory, swap plus memory usage is limited - by S. -
- -Examples: - - $ docker run -it ubuntu:14.04 /bin/bash - -We set nothing about memory, this means the processes in the container can use -as much memory and swap memory as they need. - - $ docker run -it -m 300M --memory-swap -1 ubuntu:14.04 /bin/bash - -We set memory limit and disabled swap memory limit, this means the processes in -the container can use 300M memory and as much swap memory as they need (if the -host supports swap memory). - - $ docker run -it -m 300M ubuntu:14.04 /bin/bash - -We set memory limit only, this means the processes in the container can use -300M memory and 300M swap memory, by default, the total virtual memory size -(--memory-swap) will be set as double of memory, in this case, memory + swap -would be 2*300M, so processes can use 300M swap memory as well. - - $ docker run -it -m 300M --memory-swap 1G ubuntu:14.04 /bin/bash - -We set both memory and swap memory, so the processes in the container can use -300M memory and 700M swap memory. - -Memory reservation is a kind of memory soft limit that allows for greater -sharing of memory. Under normal circumstances, containers can use as much of -the memory as needed and are constrained only by the hard limits set with the -`-m`/`--memory` option. When memory reservation is set, Docker detects memory -contention or low memory and forces containers to restrict their consumption to -a reservation limit. - -Always set the memory reservation value below the hard limit, otherwise the hard -limit takes precedence. A reservation of 0 is the same as setting no -reservation. By default (without reservation set), memory reservation is the -same as the hard memory limit. - -Memory reservation is a soft-limit feature and does not guarantee the limit -won't be exceeded. Instead, the feature attempts to ensure that, when memory is -heavily contended for, memory is allocated based on the reservation hints/setup. - -The following example limits the memory (`-m`) to 500M and sets the memory -reservation to 200M. - -```bash -$ docker run -it -m 500M --memory-reservation 200M ubuntu:14.04 /bin/bash -``` - -Under this configuration, when the container consumes memory more than 200M and -less than 500M, the next system memory reclaim attempts to shrink container -memory below 200M. - -The following example set memory reservation to 1G without a hard memory limit. - -```bash -$ docker run -it --memory-reservation 1G ubuntu:14.04 /bin/bash -``` - -The container can use as much memory as it needs. The memory reservation setting -ensures the container doesn't consume too much memory for long time, because -every memory reclaim shrinks the container's consumption to the reservation. - -By default, kernel kills processes in a container if an out-of-memory (OOM) -error occurs. To change this behaviour, use the `--oom-kill-disable` option. -Only disable the OOM killer on containers where you have also set the -`-m/--memory` option. If the `-m` flag is not set, this can result in the host -running out of memory and require killing the host's system processes to free -memory. - -The following example limits the memory to 100M and disables the OOM killer for -this container: - - $ docker run -it -m 100M --oom-kill-disable ubuntu:14.04 /bin/bash - -The following example, illustrates a dangerous way to use the flag: - - $ docker run -it --oom-kill-disable ubuntu:14.04 /bin/bash - -The container has unlimited memory which can cause the host to run out memory -and require killing system processes to free memory. The `--oom-score-adj` -parameter can be changed to select the priority of which containers will -be killed when the system is out of memory, with negative scores making them -less likely to be killed an positive more likely. - -### Kernel memory constraints - -Kernel memory is fundamentally different than user memory as kernel memory can't -be swapped out. The inability to swap makes it possible for the container to -block system services by consuming too much kernel memory. Kernel memory includes: - - - stack pages - - slab pages - - sockets memory pressure - - tcp memory pressure - -You can setup kernel memory limit to constrain these kinds of memory. For example, -every process consumes some stack pages. By limiting kernel memory, you can -prevent new processes from being created when the kernel memory usage is too high. - -Kernel memory is never completely independent of user memory. Instead, you limit -kernel memory in the context of the user memory limit. Assume "U" is the user memory -limit and "K" the kernel limit. There are three possible ways to set limits: - - - - - - - - - - - - - - - - - - - - - - -
OptionResult
U != 0, K = inf (default) - This is the standard memory limitation mechanism already present before using - kernel memory. Kernel memory is completely ignored. -
U != 0, K < U - Kernel memory is a subset of the user memory. This setup is useful in - deployments where the total amount of memory per-cgroup is overcommitted. - Overcommitting kernel memory limits is definitely not recommended, since the - box can still run out of non-reclaimable memory. - In this case, you can configure K so that the sum of all groups is - never greater than the total memory. Then, freely set U at the expense of - the system's service quality. -
U != 0, K > U - Since kernel memory charges are also fed to the user counter and reclamation - is triggered for the container for both kinds of memory. This configuration - gives the admin a unified view of memory. It is also useful for people - who just want to track kernel memory usage. -
- -Examples: - - $ docker run -it -m 500M --kernel-memory 50M ubuntu:14.04 /bin/bash - -We set memory and kernel memory, so the processes in the container can use -500M memory in total, in this 500M memory, it can be 50M kernel memory tops. - - $ docker run -it --kernel-memory 50M ubuntu:14.04 /bin/bash - -We set kernel memory without **-m**, so the processes in the container can -use as much memory as they want, but they can only use 50M kernel memory. - -### Swappiness constraint - -By default, a container's kernel can swap out a percentage of anonymous pages. -To set this percentage for a container, specify a `--memory-swappiness` value -between 0 and 100. A value of 0 turns off anonymous page swapping. A value of -100 sets all anonymous pages as swappable. By default, if you are not using -`--memory-swappiness`, memory swappiness value will be inherited from the parent. - -For example, you can set: - - $ docker run -it --memory-swappiness=0 ubuntu:14.04 /bin/bash - -Setting the `--memory-swappiness` option is helpful when you want to retain the -container's working set and to avoid swapping performance penalties. - -### CPU share constraint - -By default, all containers get the same proportion of CPU cycles. This proportion -can be modified by changing the container's CPU share weighting relative -to the weighting of all other running containers. - -To modify the proportion from the default of 1024, use the `-c` or `--cpu-shares` -flag to set the weighting to 2 or higher. If 0 is set, the system will ignore the -value and use the default of 1024. - -The proportion will only apply when CPU-intensive processes are running. -When tasks in one container are idle, other containers can use the -left-over CPU time. The actual amount of CPU time will vary depending on -the number of containers running on the system. - -For example, consider three containers, one has a cpu-share of 1024 and -two others have a cpu-share setting of 512. When processes in all three -containers attempt to use 100% of CPU, the first container would receive -50% of the total CPU time. If you add a fourth container with a cpu-share -of 1024, the first container only gets 33% of the CPU. The remaining containers -receive 16.5%, 16.5% and 33% of the CPU. - -On a multi-core system, the shares of CPU time are distributed over all CPU -cores. Even if a container is limited to less than 100% of CPU time, it can -use 100% of each individual CPU core. - -For example, consider a system with more than three cores. If you start one -container `{C0}` with `-c=512` running one process, and another container -`{C1}` with `-c=1024` running two processes, this can result in the following -division of CPU shares: - - PID container CPU CPU share - 100 {C0} 0 100% of CPU0 - 101 {C1} 1 100% of CPU1 - 102 {C1} 2 100% of CPU2 - -### CPU period constraint - -The default CPU CFS (Completely Fair Scheduler) period is 100ms. We can use -`--cpu-period` to set the period of CPUs to limit the container's CPU usage. -And usually `--cpu-period` should work with `--cpu-quota`. - -Examples: - - $ docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:14.04 /bin/bash - -If there is 1 CPU, this means the container can get 50% CPU worth of run-time every 50ms. - -In addition to use `--cpu-period` and `--cpu-quota` for setting CPU period constraints, -it is possible to specify `--cpus` with a float number to achieve the same purpose. -For example, if there is 1 CPU, then `--cpus=0.5` will achieve the same result as -setting `--cpu-period=50000` and `--cpu-quota=25000` (50% CPU). - -The default value for `--cpus` is `0.000`, which means there is no limit. - -For more information, see the [CFS documentation on bandwidth limiting](https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt). - -### Cpuset constraint - -We can set cpus in which to allow execution for containers. - -Examples: - - $ docker run -it --cpuset-cpus="1,3" ubuntu:14.04 /bin/bash - -This means processes in container can be executed on cpu 1 and cpu 3. - - $ docker run -it --cpuset-cpus="0-2" ubuntu:14.04 /bin/bash - -This means processes in container can be executed on cpu 0, cpu 1 and cpu 2. - -We can set mems in which to allow execution for containers. Only effective -on NUMA systems. - -Examples: - - $ docker run -it --cpuset-mems="1,3" ubuntu:14.04 /bin/bash - -This example restricts the processes in the container to only use memory from -memory nodes 1 and 3. - - $ docker run -it --cpuset-mems="0-2" ubuntu:14.04 /bin/bash - -This example restricts the processes in the container to only use memory from -memory nodes 0, 1 and 2. - -### CPU quota constraint - -The `--cpu-quota` flag limits the container's CPU usage. The default 0 value -allows the container to take 100% of a CPU resource (1 CPU). The CFS (Completely Fair -Scheduler) handles resource allocation for executing processes and is default -Linux Scheduler used by the kernel. Set this value to 50000 to limit the container -to 50% of a CPU resource. For multiple CPUs, adjust the `--cpu-quota` as necessary. -For more information, see the [CFS documentation on bandwidth limiting](https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt). - -### Block IO bandwidth (Blkio) constraint - -By default, all containers get the same proportion of block IO bandwidth -(blkio). This proportion is 500. To modify this proportion, change the -container's blkio weight relative to the weighting of all other running -containers using the `--blkio-weight` flag. - -> **Note:** The blkio weight setting is only available for direct IO. Buffered IO -> is not currently supported. - -The `--blkio-weight` flag can set the weighting to a value between 10 to 1000. -For example, the commands below create two containers with different blkio -weight: - - $ docker run -it --name c1 --blkio-weight 300 ubuntu:14.04 /bin/bash - $ docker run -it --name c2 --blkio-weight 600 ubuntu:14.04 /bin/bash - -If you do block IO in the two containers at the same time, by, for example: - - $ time dd if=/mnt/zerofile of=test.out bs=1M count=1024 oflag=direct - -You'll find that the proportion of time is the same as the proportion of blkio -weights of the two containers. - -The `--blkio-weight-device="DEVICE_NAME:WEIGHT"` flag sets a specific device weight. -The `DEVICE_NAME:WEIGHT` is a string containing a colon-separated device name and weight. -For example, to set `/dev/sda` device weight to `200`: - - $ docker run -it \ - --blkio-weight-device "/dev/sda:200" \ - ubuntu - -If you specify both the `--blkio-weight` and `--blkio-weight-device`, Docker -uses the `--blkio-weight` as the default weight and uses `--blkio-weight-device` -to override this default with a new value on a specific device. -The following example uses a default weight of `300` and overrides this default -on `/dev/sda` setting that weight to `200`: - - $ docker run -it \ - --blkio-weight 300 \ - --blkio-weight-device "/dev/sda:200" \ - ubuntu - -The `--device-read-bps` flag limits the read rate (bytes per second) from a device. -For example, this command creates a container and limits the read rate to `1mb` -per second from `/dev/sda`: - - $ docker run -it --device-read-bps /dev/sda:1mb ubuntu - -The `--device-write-bps` flag limits the write rate (bytes per second)to a device. -For example, this command creates a container and limits the write rate to `1mb` -per second for `/dev/sda`: - - $ docker run -it --device-write-bps /dev/sda:1mb ubuntu - -Both flags take limits in the `:[unit]` format. Both read -and write rates must be a positive integer. You can specify the rate in `kb` -(kilobytes), `mb` (megabytes), or `gb` (gigabytes). - -The `--device-read-iops` flag limits read rate (IO per second) from a device. -For example, this command creates a container and limits the read rate to -`1000` IO per second from `/dev/sda`: - - $ docker run -ti --device-read-iops /dev/sda:1000 ubuntu - -The `--device-write-iops` flag limits write rate (IO per second) to a device. -For example, this command creates a container and limits the write rate to -`1000` IO per second to `/dev/sda`: - - $ docker run -ti --device-write-iops /dev/sda:1000 ubuntu - -Both flags take limits in the `:` format. Both read and -write rates must be a positive integer. - -## Additional groups - --group-add: Add additional groups to run as - -By default, the docker container process runs with the supplementary groups looked -up for the specified user. If one wants to add more to that list of groups, then -one can use this flag: - - $ docker run --rm --group-add audio --group-add nogroup --group-add 777 busybox id - uid=0(root) gid=0(root) groups=10(wheel),29(audio),99(nogroup),777 - -## Runtime privilege and Linux capabilities - - --cap-add: Add Linux capabilities - --cap-drop: Drop Linux capabilities - --privileged=false: Give extended privileges to this container - --device=[]: Allows you to run devices inside the container without the --privileged flag. - -By default, Docker containers are "unprivileged" and cannot, for -example, run a Docker daemon inside a Docker container. This is because -by default a container is not allowed to access any devices, but a -"privileged" container is given access to all devices (see -the documentation on [cgroups devices](https://www.kernel.org/doc/Documentation/cgroup-v1/devices.txt)). - -When the operator executes `docker run --privileged`, Docker will enable -to access to all devices on the host as well as set some configuration -in AppArmor or SELinux to allow the container nearly all the same access to the -host as processes running outside containers on the host. Additional -information about running with `--privileged` is available on the -[Docker Blog](http://blog.docker.com/2013/09/docker-can-now-run-within-docker/). - -If you want to limit access to a specific device or devices you can use -the `--device` flag. It allows you to specify one or more devices that -will be accessible within the container. - - $ docker run --device=/dev/snd:/dev/snd ... - -By default, the container will be able to `read`, `write`, and `mknod` these devices. -This can be overridden using a third `:rwm` set of options to each `--device` flag: - - $ docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdc - - Command (m for help): q - $ docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk /dev/xvdc - You will not be able to write the partition table. - - Command (m for help): q - - $ docker run --device=/dev/sda:/dev/xvdc:w --rm -it ubuntu fdisk /dev/xvdc - crash.... - - $ docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc - fdisk: unable to open /dev/xvdc: Operation not permitted - -In addition to `--privileged`, the operator can have fine grain control over the -capabilities using `--cap-add` and `--cap-drop`. By default, Docker has a default -list of capabilities that are kept. The following table lists the Linux capability -options which are allowed by default and can be dropped. - -| Capability Key | Capability Description | -| ---------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| SETPCAP | Modify process capabilities. | -| MKNOD | Create special files using mknod(2). | -| AUDIT_WRITE | Write records to kernel auditing log. | -| CHOWN | Make arbitrary changes to file UIDs and GIDs (see chown(2)). | -| NET_RAW | Use RAW and PACKET sockets. | -| DAC_OVERRIDE | Bypass file read, write, and execute permission checks. | -| FOWNER | Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file. | -| FSETID | Don't clear set-user-ID and set-group-ID permission bits when a file is modified. | -| KILL | Bypass permission checks for sending signals. | -| SETGID | Make arbitrary manipulations of process GIDs and supplementary GID list. | -| SETUID | Make arbitrary manipulations of process UIDs. | -| NET_BIND_SERVICE | Bind a socket to internet domain privileged ports (port numbers less than 1024). | -| SYS_CHROOT | Use chroot(2), change root directory. | -| SETFCAP | Set file capabilities. | - -The next table shows the capabilities which are not granted by default and may be added. - -| Capability Key | Capability Description | -| ---------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| SYS_MODULE | Load and unload kernel modules. | -| SYS_RAWIO | Perform I/O port operations (iopl(2) and ioperm(2)). | -| SYS_PACCT | Use acct(2), switch process accounting on or off. | -| SYS_ADMIN | Perform a range of system administration operations. | -| SYS_NICE | Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. | -| SYS_RESOURCE | Override resource Limits. | -| SYS_TIME | Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. | -| SYS_TTY_CONFIG | Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. | -| AUDIT_CONTROL | Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. | -| MAC_OVERRIDE | Allow MAC configuration or state changes. Implemented for the Smack LSM. | -| MAC_ADMIN | Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). | -| NET_ADMIN | Perform various network-related operations. | -| SYSLOG | Perform privileged syslog(2) operations. | -| DAC_READ_SEARCH | Bypass file read permission checks and directory read and execute permission checks. | -| LINUX_IMMUTABLE | Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. | -| NET_BROADCAST | Make socket broadcasts, and listen to multicasts. | -| IPC_LOCK | Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). | -| IPC_OWNER | Bypass permission checks for operations on System V IPC objects. | -| SYS_PTRACE | Trace arbitrary processes using ptrace(2). | -| SYS_BOOT | Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. | -| LEASE | Establish leases on arbitrary files (see fcntl(2)). | -| WAKE_ALARM | Trigger something that will wake up the system. | -| BLOCK_SUSPEND | Employ features that can block system suspend. | - -Further reference information is available on the [capabilities(7) - Linux man page](http://man7.org/linux/man-pages/man7/capabilities.7.html) - -Both flags support the value `ALL`, so if the -operator wants to have all capabilities but `MKNOD` they could use: - - $ docker run --cap-add=ALL --cap-drop=MKNOD ... - -For interacting with the network stack, instead of using `--privileged` they -should use `--cap-add=NET_ADMIN` to modify the network interfaces. - - $ docker run -it --rm ubuntu:14.04 ip link add dummy0 type dummy - RTNETLINK answers: Operation not permitted - $ docker run -it --rm --cap-add=NET_ADMIN ubuntu:14.04 ip link add dummy0 type dummy - -To mount a FUSE based filesystem, you need to combine both `--cap-add` and -`--device`: - - $ docker run --rm -it --cap-add SYS_ADMIN sshfs sshfs sven@10.10.10.20:/home/sven /mnt - fuse: failed to open /dev/fuse: Operation not permitted - $ docker run --rm -it --device /dev/fuse sshfs sshfs sven@10.10.10.20:/home/sven /mnt - fusermount: mount failed: Operation not permitted - $ docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs - # sshfs sven@10.10.10.20:/home/sven /mnt - The authenticity of host '10.10.10.20 (10.10.10.20)' can't be established. - ECDSA key fingerprint is 25:34:85:75:25:b0:17:46:05:19:04:93:b5:dd:5f:c6. - Are you sure you want to continue connecting (yes/no)? yes - sven@10.10.10.20's password: - root@30aa0cfaf1b5:/# ls -la /mnt/src/docker - total 1516 - drwxrwxr-x 1 1000 1000 4096 Dec 4 06:08 . - drwxrwxr-x 1 1000 1000 4096 Dec 4 11:46 .. - -rw-rw-r-- 1 1000 1000 16 Oct 8 00:09 .dockerignore - -rwxrwxr-x 1 1000 1000 464 Oct 8 00:09 .drone.yml - drwxrwxr-x 1 1000 1000 4096 Dec 4 06:11 .git - -rw-rw-r-- 1 1000 1000 461 Dec 4 06:08 .gitignore - .... - -The default seccomp profile will adjust to the selected capabilities, in order to allow -use of facilities allowed by the capabilities, so you should not have to adjust this, -since Docker 1.12. In Docker 1.10 and 1.11 this did not happen and it may be necessary -to use a custom seccomp profile or use `--security-opt seccomp=unconfined` when adding -capabilities. - -## Logging drivers (--log-driver) - -The container can have a different logging driver than the Docker daemon. Use -the `--log-driver=VALUE` with the `docker run` command to configure the -container's logging driver. The following options are supported: - -| Driver | Description | -| ----------- | ----------------------------------------------------------------------------------------------------------------------------- | -| `none` | Disables any logging for the container. `docker logs` won't be available with this driver. | -| `json-file` | Default logging driver for Docker. Writes JSON messages to file. No logging options are supported for this driver. | -| `syslog` | Syslog logging driver for Docker. Writes log messages to syslog. | -| `journald` | Journald logging driver for Docker. Writes log messages to `journald`. | -| `gelf` | Graylog Extended Log Format (GELF) logging driver for Docker. Writes log messages to a GELF endpoint likeGraylog or Logstash. | -| `fluentd` | Fluentd logging driver for Docker. Writes log messages to `fluentd` (forward input). | -| `awslogs` | Amazon CloudWatch Logs logging driver for Docker. Writes log messages to Amazon CloudWatch Logs | -| `splunk` | Splunk logging driver for Docker. Writes log messages to `splunk` using Event Http Collector. | - -The `docker logs` command is available only for the `json-file` and `journald` -logging drivers. For detailed information on working with logging drivers, see -[Configure a logging driver](https://docs.docker.com/engine/admin/logging/overview/). - - -## Overriding Dockerfile image defaults - -When a developer builds an image from a [*Dockerfile*](builder.md) -or when she commits it, the developer can set a number of default parameters -that take effect when the image starts up as a container. - -Four of the Dockerfile commands cannot be overridden at runtime: `FROM`, -`MAINTAINER`, `RUN`, and `ADD`. Everything else has a corresponding override -in `docker run`. We'll go through what the developer might have set in each -Dockerfile instruction and how the operator can override that setting. - - - [CMD (Default Command or Options)](#cmd-default-command-or-options) - - [ENTRYPOINT (Default Command to Execute at Runtime)]( - #entrypoint-default-command-to-execute-at-runtime) - - [EXPOSE (Incoming Ports)](#expose-incoming-ports) - - [ENV (Environment Variables)](#env-environment-variables) - - [HEALTHCHECK](#healthcheck) - - [VOLUME (Shared Filesystems)](#volume-shared-filesystems) - - [USER](#user) - - [WORKDIR](#workdir) - -### CMD (default command or options) - -Recall the optional `COMMAND` in the Docker -commandline: - - $ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...] - -This command is optional because the person who created the `IMAGE` may -have already provided a default `COMMAND` using the Dockerfile `CMD` -instruction. As the operator (the person running a container from the -image), you can override that `CMD` instruction just by specifying a new -`COMMAND`. - -If the image also specifies an `ENTRYPOINT` then the `CMD` or `COMMAND` -get appended as arguments to the `ENTRYPOINT`. - -### ENTRYPOINT (default command to execute at runtime) - - --entrypoint="": Overwrite the default entrypoint set by the image - -The `ENTRYPOINT` of an image is similar to a `COMMAND` because it -specifies what executable to run when the container starts, but it is -(purposely) more difficult to override. The `ENTRYPOINT` gives a -container its default nature or behavior, so that when you set an -`ENTRYPOINT` you can run the container *as if it were that binary*, -complete with default options, and you can pass in more options via the -`COMMAND`. But, sometimes an operator may want to run something else -inside the container, so you can override the default `ENTRYPOINT` at -runtime by using a string to specify the new `ENTRYPOINT`. Here is an -example of how to run a shell in a container that has been set up to -automatically run something else (like `/usr/bin/redis-server`): - - $ docker run -it --entrypoint /bin/bash example/redis - -or two examples of how to pass more parameters to that ENTRYPOINT: - - $ docker run -it --entrypoint /bin/bash example/redis -c ls -l - $ docker run -it --entrypoint /usr/bin/redis-cli example/redis --help - -You can reset a containers entrypoint by passing an empty string, for example: - - $ docker run -it --entrypoint="" mysql bash - -> **Note**: Passing `--entrypoint` will clear out any default command set on the -> image (i.e. any `CMD` instruction in the Dockerfile used to build it). - -### EXPOSE (incoming ports) - -The following `run` command options work with container networking: - - --expose=[]: Expose a port or a range of ports inside the container. - These are additional to those exposed by the `EXPOSE` instruction - -P : Publish all exposed ports to the host interfaces - -p=[] : Publish a container᾿s port or a range of ports to the host - format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort - Both hostPort and containerPort can be specified as a - range of ports. When specifying ranges for both, the - number of container ports in the range must match the - number of host ports in the range, for example: - -p 1234-1236:1234-1236/tcp - - When specifying a range for hostPort only, the - containerPort must not be a range. In this case the - container port is published somewhere within the - specified hostPort range. (e.g., `-p 1234-1236:1234/tcp`) - - (use 'docker port' to see the actual mapping) - - --link="" : Add link to another container (:alias or ) - -With the exception of the `EXPOSE` directive, an image developer hasn't -got much control over networking. The `EXPOSE` instruction defines the -initial incoming ports that provide services. These ports are available -to processes inside the container. An operator can use the `--expose` -option to add to the exposed ports. - -To expose a container's internal port, an operator can start the -container with the `-P` or `-p` flag. The exposed port is accessible on -the host and the ports are available to any client that can reach the -host. - -The `-P` option publishes all the ports to the host interfaces. Docker -binds each exposed port to a random port on the host. The range of -ports are within an *ephemeral port range* defined by -`/proc/sys/net/ipv4/ip_local_port_range`. Use the `-p` flag to -explicitly map a single port or range of ports. - -The port number inside the container (where the service listens) does -not need to match the port number exposed on the outside of the -container (where clients connect). For example, inside the container an -HTTP service is listening on port 80 (and so the image developer -specifies `EXPOSE 80` in the Dockerfile). At runtime, the port might be -bound to 42800 on the host. To find the mapping between the host ports -and the exposed ports, use `docker port`. - -If the operator uses `--link` when starting a new client container in the -default bridge network, then the client container can access the exposed -port via a private networking interface. -If `--link` is used when starting a container in a user-defined network as -described in [*Docker network overview*](https://docs.docker.com/engine/userguide/networking/), -it will provide a named alias for the container being linked to. - -### ENV (environment variables) - -When a new container is created, Docker will set the following environment -variables automatically: - -| Variable | Value | -| -------- | ----- | -| `HOME` | Set based on the value of `USER` | -| `HOSTNAME` | The hostname associated with the container | -| `PATH` | Includes popular directories, such as `:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` | -| `TERM` | `xterm` if the container is allocated a pseudo-TTY | - -Additionally, the operator can **set any environment variable** in the -container by using one or more `-e` flags, even overriding those mentioned -above, or already defined by the developer with a Dockerfile `ENV`: - - $ docker run -e "deep=purple" --rm ubuntu /bin/bash -c export - declare -x HOME="/" - declare -x HOSTNAME="85bc26a0e200" - declare -x OLDPWD - declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - declare -x PWD="/" - declare -x SHLVL="1" - declare -x deep="purple" - -Similarly the operator can set the **hostname** with `-h`. - -### HEALTHCHECK - -``` - --health-cmd Command to run to check health - --health-interval Time between running the check - --health-retries Consecutive failures needed to report unhealthy - --health-timeout Maximum time to allow one check to run - --no-healthcheck Disable any container-specified HEALTHCHECK -``` - -Example: - - {% raw %} - $ docker run --name=test -d \ - --health-cmd='stat /etc/passwd || exit 1' \ - --health-interval=2s \ - busybox sleep 1d - $ sleep 2; docker inspect --format='{{.State.Health.Status}}' test - healthy - $ docker exec test rm /etc/passwd - $ sleep 2; docker inspect --format='{{json .State.Health}}' test - { - "Status": "unhealthy", - "FailingStreak": 3, - "Log": [ - { - "Start": "2016-05-25T17:22:04.635478668Z", - "End": "2016-05-25T17:22:04.7272552Z", - "ExitCode": 0, - "Output": " File: /etc/passwd\n Size: 334 \tBlocks: 8 IO Block: 4096 regular file\nDevice: 32h/50d\tInode: 12 Links: 1\nAccess: (0664/-rw-rw-r--) Uid: ( 0/ root) Gid: ( 0/ root)\nAccess: 2015-12-05 22:05:32.000000000\nModify: 2015..." - }, - { - "Start": "2016-05-25T17:22:06.732900633Z", - "End": "2016-05-25T17:22:06.822168935Z", - "ExitCode": 0, - "Output": " File: /etc/passwd\n Size: 334 \tBlocks: 8 IO Block: 4096 regular file\nDevice: 32h/50d\tInode: 12 Links: 1\nAccess: (0664/-rw-rw-r--) Uid: ( 0/ root) Gid: ( 0/ root)\nAccess: 2015-12-05 22:05:32.000000000\nModify: 2015..." - }, - { - "Start": "2016-05-25T17:22:08.823956535Z", - "End": "2016-05-25T17:22:08.897359124Z", - "ExitCode": 1, - "Output": "stat: can't stat '/etc/passwd': No such file or directory\n" - }, - { - "Start": "2016-05-25T17:22:10.898802931Z", - "End": "2016-05-25T17:22:10.969631866Z", - "ExitCode": 1, - "Output": "stat: can't stat '/etc/passwd': No such file or directory\n" - }, - { - "Start": "2016-05-25T17:22:12.971033523Z", - "End": "2016-05-25T17:22:13.082015516Z", - "ExitCode": 1, - "Output": "stat: can't stat '/etc/passwd': No such file or directory\n" - } - ] - } - {% endraw %} - -The health status is also displayed in the `docker ps` output. - -### TMPFS (mount tmpfs filesystems) - -```bash ---tmpfs=[]: Create a tmpfs mount with: container-dir[:], - where the options are identical to the Linux - 'mount -t tmpfs -o' command. -``` - -The example below mounts an empty tmpfs into the container with the `rw`, -`noexec`, `nosuid`, and `size=65536k` options. - - $ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image - -### VOLUME (shared filesystems) - - -v, --volume=[host-src:]container-dest[:]: Bind mount a volume. - The comma-delimited `options` are [rw|ro], [z|Z], - [[r]shared|[r]slave|[r]private], and [nocopy]. - The 'host-src' is an absolute path or a name value. - - If neither 'rw' or 'ro' is specified then the volume is mounted in - read-write mode. - - The `nocopy` modes is used to disable automatic copying requested volume - path in the container to the volume storage location. - For named volumes, `copy` is the default mode. Copy modes are not supported - for bind-mounted volumes. - - --volumes-from="": Mount all volumes from the given container(s) - -> **Note**: -> When using systemd to manage the Docker daemon's start and stop, in the systemd -> unit file there is an option to control mount propagation for the Docker daemon -> itself, called `MountFlags`. The value of this setting may cause Docker to not -> see mount propagation changes made on the mount point. For example, if this value -> is `slave`, you may not be able to use the `shared` or `rshared` propagation on -> a volume. - -The volumes commands are complex enough to have their own documentation -in section [*Manage data in -containers*](https://docs.docker.com/engine/tutorials/dockervolumes/). A developer can define -one or more `VOLUME`'s associated with an image, but only the operator -can give access from one container to another (or from a container to a -volume mounted on the host). - -The `container-dest` must always be an absolute path such as `/src/docs`. -The `host-src` can either be an absolute path or a `name` value. If you -supply an absolute path for the `host-dir`, Docker bind-mounts to the path -you specify. If you supply a `name`, Docker creates a named volume by that `name`. - -A `name` value must start with an alphanumeric character, -followed by `a-z0-9`, `_` (underscore), `.` (period) or `-` (hyphen). -An absolute path starts with a `/` (forward slash). - -For example, you can specify either `/foo` or `foo` for a `host-src` value. -If you supply the `/foo` value, Docker creates a bind-mount. If you supply -the `foo` specification, Docker creates a named volume. - -### USER - -`root` (id = 0) is the default user within a container. The image developer can -create additional users. Those users are accessible by name. When passing a numeric -ID, the user does not have to exist in the container. - -The developer can set a default user to run the first process with the -Dockerfile `USER` instruction. When starting a container, the operator can override -the `USER` instruction by passing the `-u` option. - - -u="", --user="": Sets the username or UID used and optionally the groupname or GID for the specified command. - - The followings examples are all valid: - --user=[ user | user:group | uid | uid:gid | user:gid | uid:group ] - -> **Note:** if you pass a numeric uid, it must be in the range of 0-2147483647. - -### WORKDIR - -The default working directory for running binaries within a container is the -root directory (`/`), but the developer can set a different default with the -Dockerfile `WORKDIR` command. The operator can override this with: - - -w="": Working directory inside the container diff --git a/vendor/github.com/docker/docker/docs/static_files/contributors.png b/vendor/github.com/docker/docker/docs/static_files/contributors.png deleted file mode 100644 index 63c0a0c09b58bce2e1ade867760a937612934202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23100 zcmb@OV{j(E_x888ZEbB^Tbp;=t!>=3ZQHint!;a2+qU)J@BCgqZ=W|wCYelTGH1?Q z`J8JKt|%{o0E-Lzo_Y4dhY>#tUQd@oOt3`hoOL|BKcJqN3Vxy$AhV?ax|X zwP7_xdmcs=u4=&I4-7>PVT51Et0V?6adF`Fly>RguBKa_?u?$lQ0phh>{!;bJF?oY zC)U*RkjI zsZ{9ymFQPP=Ffni?-C9P+OC9;+m(1`#sifR2o?cG#SMq<7^FFga@MBPTZc}}8{OtP z!CXnufoQzjhXU6pDu?FO?q?N~x)gG+s5_)nwFPTwBYb7~CibK72sE%1)SrJd^${!^ zEHw&Dtkf^i4vaU^uU^}gy=)4@H#0a?oWg*dF~t!rx~8uPt`)MO;*-1xScpDwk8Yd6 zV|oWAE&v<#MZbeL_k~-u+`8|Wmvs+s;S27t7f}( zmXlHcCaBX3IF<@+Er8_&TT#hEUm$9AWJhM+a2DG>$2af5AN|C9xfYFRFuLL?G1+^h z)!T!@8{JnMuGS?na}ca1a>7RB3N7|6Ju30;Ef@hw{DK01K4-F7z?2a1d z6xYB&;G|Ie<*=I5*<4$#T&O(X^Lx-a9hgg%5-@!cNcW>GOGntHUgUcesfkwoDU2}( zp^XvJc&>8m=-3u88Wgay@j*@{{4f45)4=9Jiy38dDa1naT<3nu?&eE&0d1Rn`W{JW z+U8LtqZPyYp%!)zg2B{3Lbkcu{ZEP<^T>cg)(%UgkghgLTC7~CpI^-|9klpVyAWH7 zHV%sv1WpJwWSw3XfkAq0r09b)a@xX9bKHO9xrn_r-#E&xkbhxq3~^b?MMfTMrD`?h zS1|01CL;=KT9+@O+wU!YZtx6RE#mF=ft=3IwPZU@AV(b-C>&!>dN-kzGwftdTF&rd zV2HwHnX$g0Btk=EJ0UuWB9?h;sVo?F6sphY7i^nLaqx;0#|-1_NIN znQ=;!ID#{lTECe0DwM(&vRwJD*)Gz$_3@es`+CpqM7Q%IYfT1VZ34@S>|}^$zHlkX zqF8IhE*z}@E5)`|)vYmMV8Fuuwl#g)M;dnrznCsx^)FDd&2BGw3%jIv9)+lZGfX0) zYXR{+(nD1^wvq>61Pi@=cYUqu1fPu({)DXZT}E*gsEJb65~g}4&2#wpn~EreB`Aiq zg7Pbi@B7eVz2$nQVzSKlXewM|_q0II6N#6^m%zv+)CQ#e{aek6h^j*oSezfg@@ES8MT#Kt;stNsM)7<|y0gZ}3|BfisAPKfpssv+PnM%1VQY)$rhkVcvBn)CNqo=Dw6JxNoo5 z+?S)IhN;I!PR9W}TV0%Cg%P|=Rwc*vuJcWXX}&i%Q7k8eY_YQNJh(%Oe)&`@<6og9 zh)NBcA`1moGJ-+ovIx@i7-yFFK0~yQnAM8Sr9^6XuoX!AbC?P$q2~6iiAfl=nAEpt ztl<$HhP=f;xkH2R(?;rl($kw#&`v9rb%-xrT#kQOtTDMAWxbBS4HQeav)Z{pn`{*f zNzch%el?n$o;f}o{1b;5TUzc)DubRG z_P6s%V$>GskUzg(#JC12ZBkjI>s2sl+{Py{-jh`1@wQ-7m7=K;DQA=*epw=LFrIgt zbYj&O@gA1R^a2EOt0z3ZbP);;o)nTj2r^hI#QW~6(^`bRt$iy zl()J$C_Q(fa_hBYvjNUJAg)_uN(5Yc^KwcJf^P4KI#lO(yt;Dt%5_C^SN+!I$*8R( z9M?!Cjh>#_`&aK}=msRvaedcGO2XFZhr>Gl8X2nHL0P#*@kV6UApxH+v_8;{N_M0Pl$r%yaDSqn6uqqIJBFa=5ojh-~A-^ zPmeoEHRJI_JUY^dNhY?vAL@v^rHqsPz1_@V2OKVYs(b?9_I#N5q3U0Chzi|5KU0n> zRmfWd!I0N3rM@IH1c^x0U4q4o!Kk0L38x(yTR!)X$*8xmmY-}#7eIVJZkfXzV88`x z!$Al&+Ttx~wK}v8dyHMT_ubr=!e}@<74}62y?&~OkaF>|qt=A81dXQ63s+)pM>@<@++StGdv_h{M{^*6(4wSA?L&`h(vdvy=jjQhB$s3~ob z3Y`hzC%|P0cDQR_1}PGC$1c0J>5p^z_2l~T?oQ@{K_oKU9b&I1Oyd<(gP?o$^i(oi z9e5d7eY~#v%EB)Gf-*+X+6%$qZ+Vc+9vrd(yTQ-(`=Y7~>G&eQq3jTPK z?+SNz?L*%+JQaLZ}9TlRVYrGKEHC-veo<>48F+QB1OX_b-y1 ziFZCun;tAP&7Y0IJMx=&mUN}<`z*`t?N2aY?vk(MCdW=@(=uNkl~T80k&p~)NiMJI z_V}mOu+X9?basLL{_S~lM#kyDMHEU41?1ZZYu1zXWaw)kUC>@9r_yDtAL81{(T__n zc9AR&U8ZH_zL$h_w_(L9u3!zbOuU;*atF*!Dy$yc+6jHptGZq~HnX z=%6U+11T1-&TdgZrFtxrFlCioFmWS8XF@Re;1RY?ajff%ePKRjy6$9|i_b(x*Us2^ z%v;$!7$sR!p8U~Ig?=`jzhrjarKGU>D6stp{3uUyIHUa{YK?X8$H#H%cXf^v!fhH` zd1;q$Ji0XkZSz3MoDGoRY4HrVPP`SD6+hx8B*&} z^G~lwg9($F&bIPYuHK!?;+*1Yn|Z8zXgMP~u^^s+)+BZTyV`i5c+jAnK$g?Dnzz)l z!Lp;k+7bS(+$`DHlDO2k6A{&JPK_#sC_IJ<_YZn9bCeXD@>Dj*oU~^Oipd|a)1j@@ zd9c!{Z-pq$UXCd0r8J=tRefM@qn=`aPczYp}J#$p75w76m2L2&@gGH$xJ5 zEeP7RUtVAh)Jbl6Yn%30+Y`!kdZ6Ddopj|r8m7J_48skVI%iLci*%x^Cd%eekU|aJ za?ga`snZG8h>&sMx#noLwhE~?*DOd#a%inn;Nbr3K6u?*D6_Fo4*LmTtgal6xQ1MT z1fvmX5TVixN1@_b0Lk-qCbFQ0`YXFK?N{fmK3&ch^rVcuNO^sxWLHOilBqsU-jY06u2G0xa-3$+X*yVJf zI~UKD!|JODG?=z?b#@%R)2H;3->;EB5UGT%k572IJ9H)t2rW?e7n=(GlVKcew~ zam>#q{bbEX(IZg%qh}Cl4};R|cEX^#^}ujEn3WWj-=VjnVqeB)6cZ?-M$xdb)@29m z_ufV#^-1gmtJ^Qw-f{Jt@Nxv>aC+H%~G^2VgIo?1)MnmtZ} zMI}6!Tkm&Pk-rA1eY&y+84IJ4bhZc&$fWF6YB3!}hD{c%cKVSh;!zxj<{8y5_Os6v6lFp|HsipZZq#_}(K94RQ%wcq;|?*27TE1D)R4-6exbOcEBS z%I}n{D!QE7d_+oy%BWK3SY(;`3NWvBI}f5(w<3~H%jY>PW<++|`1Y_EEYv@E>|FBc zEpBxzGto3zWkt7uWI}nDJG+c}F8AQ~ug--Ojkl2wf@lG&9pol}ZWNM?@aV(v^eFokThdqjox%^trPxl$6CuYbl8lGynbl3QZ z3|b^N@NV8<$P)TW_=*|bTF4X13gK%)i)@oNh%DHS4h4+3@JM!lRU%NkrgpAinJg%p z+qa_h@kz1s%DxKPs!HgY*4N}qhE0iueK!OWx3xwKQP`Z4B4pdmju_3Md8|mk`Cc%- zYa;n2#lX}yK|c7mT#8@1TY&NeK9!hbYV>XS@%g{uU4GEo&kVQS{-E-?Vm3JG^W~1w zC!8Ud-`K}PlWHPN#=i|nsxXIDk8;#r*=#3GY<<$9w%{2$LIH#tu`su(9oJAnqrfw4 z2B31CsqvQR1`u!wcRiVFFJY2QTH7mv&p0FCxRvc&4P`=p7FV06-O#rf*;`riR2Hen z1j%}T=s42*hZN=hN?|AJ&QSw(pTM;uW#)&wuva7y%?`2+T|(M%dx79#Xr6Tf5EQZneX5 z2P@~l%{-;BRK%8)Gnu9s`b?a}EZWeWB*{-=kM>CA7vs}9+IoD&2L|&IVri>A zKNu&oqw$OineM{b%a(ZL!=TMLe44hW;ClSgZtfDu-Ckdh>m0UO)UTQ@Xl*Q$Va9=y zYRJ(y&SXiWT>*wDSF&~!19j1SQE(K74up4it=ZE9J4HVybMXTlaII>#b~^2i^B{4k}n@Vpf23Wh$D#Ya#JXJ1Q_4S^<1( zeBvx#7Lt$S{5mY>4LYSNp-JyPj)f8Nl!!>RiM{r~r><3RNmkoOaBJhV5071mB<0&6 zMBRb=79(1t*sG{m`7#2S)9&iuYS}3(U$hq&`iCd6TSvwqW)3;&U7gCY ztZY44JH#hvo7gqS=3590X!A|b)PoxmJw%j>qRjFM0gpSCK0d`;XEr16jPQ51fx8Pg zHE3**?VgN+8{s;Q_Xwq`q**R6L}YvGV~&d%YEcmsHyvkY zEt;G0xi+_(@Rs;=y-^647=v$D^kx7XO*I#*?Q74^vu1pOSVT&eYe;;Oxm&_%3dS__ zs%gcJ3XFwo2WK^pr~YD5*6G0vbu;}Ccv>sPJ%&hyooMt)Hz$~RQ-kBPU~E=(0nT5- z*v}0Xo%~=(jxL#S-!KUQrk*}dD_O^@{9r2LkwH7E;&WcsY42>R@ErHV8^YC=r?d?y z>*o$s3jBT#2Z3Rk{rANUiw|L$fsL+2%4DGOYUPpKZ!Xq)d}v0d+p#`1{nQz1MVmSn zXbTQX-;S(NfK1E?Wl2z>fVl6y?utRE&}W| zt>AS>Z!PKGCJRwLEs}cqL*YqtkljsW9JNFS#gM8=6{@E6@B^8@6B!9?`;jdeM`S%w z7^M2f#)~)POPrKF@TOaEl^(IqRJ8k?(rQ(%;~Q(pZdR4HzkM*}5A8#O!n%~$3ozAv zSp+E~WuP?AMQIp{h5@4#!J%U9=W6_vmk|rQ*8a)Yg=UXWtl=)X*R))nDbE0{>1sC} zi3b}oQ_gy-p*=7y;~8;*Vsg&o!(K(Tg(5S?F_9x;(dWg+nze~%qYVG1ZQCQ>BVrWm zCgbrp@g}&O_i-eAkQAAU>aoZZ^LGi8+fz|Crw@SDpfkc0VWK?f3xG zVYb*wPj2A$79(=&ksP?KY>3_)MNsFbgoZp(U=hmM+Z-J>}%+69htY7X}bKOmOd1r0d^CYh6 zkBQB&5v1?nR$AD6KH2T(`_;hnHFoIV`AQ~JMXr4&^(BNg4G;8KIVsUIrMGCEUo`x6 zDBTiM=|!;Z|H;4kAs?mR1Cv}yX6P#{-a6G)-w7F}HTsHYE0zx6AZ z!wcPqXUs@YxXSGgBgcMApzWYs{(4;phk|>E#G{#kPjnc&jp8P5dRd#Io%cSDlzlng z{AhE_^Fcf0^47L~W|bhx1W`NADQjZ9_^#>JJqLWyI}W-hkq0E6s__<1CfV(B6ozE( zJLr?-k4))TjV@qH#IO}MH-XI7y14#Ng$jaCb!7|lCfvK)J|dCKLT$lWu_UI}E7S<=H?DX4tYo#>yf;}>4-2VQy4ce1x&>fn_cLn3eO&nO+_?;#i zw3i(aEh-z&FG}jNXpcJU;%eNMLpxwuqSNXSh&yA&BCXUfAl5O1-lUi4G)SO^1AvJ8{+@GSRJ8mE(5q3!94h^DUc zsr=a9_gw?$ad2Y1Y@1POPgkp0oBiG1WTnHx5?6|LX2{D)66f>f*Q3Vti0qrNAay}C zh%T%?SuzH>n4f<2JNj@Wjs3myLa?dyJSMgBp~-2zxiruG5HA*A9SyZ3o746ncVyUB zr9Z2*CPH_g{xc5N=Ya$YwsAI4P-77_@D(ND{awAZNzpRC! z(eUTAy7E#f%{`!3lImU=oT5I-2KlcfRe)kvr*)18JO{+_enyGJRD_@R}L2D0L**u?*Y(60`!x z*<2sS(;}Aop9kT~WKM610cm6BTlwk|U+)g{D~&%Fsa_7j)V9 zo?I!D6`cW;n~ebDKfE{sc?|SEs}5vlp#k}p-i);>Y43kCC8f86fgaowdl#(exa?0o zh;mM=3V@aE?LPTY5VR5d?CZ)Y&I{J5cCqeX&g?_gF^wg&Z)$WD;jO{K9ui@~Hdj^rxlpf z9Eu+P3O8*wP{yh~-`VZhB!;)-!?ezM{Pkr_BHBZ{w@-!UOb)n_)TB0L@!R$q4^>Yg zt;>bDoi{a{o7x`XuVpZjHDA2aLprmWWd^cfhex7inNuk%{;BKUkSPNRtEc zza-iT|4qj1;R2f=m{ty%pat4qAxH1<*`I~r`uXQf{F}ZnzBbL?E6KIDEzbw}X@C#N zQdK%vM`uA8FrT_Nivxp=Zrj&C^?O=byJN0h$xdf%M@MQoomvB}W=kX66ddBUe9fwD zG=Zxh2c-bo4V|&ZKIM9n_)`^Ty5q0Y{YN~TufSD@@_r;b!8MEl1C}aHRpBKE{wkSQ zIh=c10;>R|62RCSfNm0Bdl_HBR>{wi|HTtoJr1wc^QO{l4I2ukOO*7H?i;kX4S{t< zenI9Nbr@Ll1HLM7Ht4ReF#qL6cnM%m2(C;Tv5ykO#EznYgno$G%mvhivr%s5|O;3m_Q=d@j9rT zYC=+-J@Z!C9qD2FHh!8p1Mia)oXnOOdd*t6GCNqwGR4HrC_&H^oZRR-sZgWwTbj=O z!=0~J4*m{FBDybv(RiiULJ8M5fNf!2g8v?bZ9ywSvj^E(?KyeU8p$Pv#OBihHeBq) zWMM6C$^-$WkbF$@6WfF0YWOJteJ?Pwzx{^{VYtxXU5*=%0mBuQ8=O4~|H7anp)cZ$ z0uTYL;eR|;CVIz(@DOTo^{H01+nVI=hAs;DwN^=jbnIcgOo&L};!2Nk`s%D$iVPGF z-3Nh!pIPV&RqHb0$qkHq*0WJgKe|9$%vAx#?8&{GBxOOgn+v9$!DyXFq{9_l3}j&$ z&d&dVqCWKwqHlHG7)>D3`5}eCDySn zn1R>NqJ45w@Wb40!u`1rM)>4RKIuutkTs+!SVgUV+BCcRHQkN{FkVj|Q}5MC3Mh6w zHq@8pA&j~X?ks$7ZG;V$W1NkFy?v_E--yMa(qO^BJ-f7K&pn(Rd3$uAJfnvwb0_wR zLyuKILd9@=@GNM{qZd7Sk-u-9 z8hnG?8;2d;wu~z9aAgbkitRNa%9#yBeR4pCVMhb62fI@{!@pA3E5W?00%W?<-hTeb zXnt3)qF=5{c=xt{7abojDU8~F!9~(O9G!-mPYuQUT>M+?0c<7J0kkeW8M@=vQEew( z3Jk^Ooge`<)yUQmpGz!H$q;p`ONP!rxNL_Lq)f4PIn;yqOnsv6LK4(;LvT2{K9frj zqBc@E=fP>%qJ!Ts7{?Yn?EUC@MxFf87{&VU`;e1_+JXkqJ#_^!$Jz`(KuMcL7A4(R7Tr8loR1EJ1ZJcFSzl1rW%)Y)3T?Hh{Y+D`UZ25Hre|mZ)23 z=Wl5F(bAXYjh_;At^ar)a3P$^*^YQ8^b!ts(*uO9x=(M)8B;j6A{hr~G$o&V`S#Kobn}9sHW#ioMclp98a; z?N6i`F2enDfUyLe6XgzLH1mmH#vs;j-`sffR8soP>rSG!VK=v_O&gI zgI&!CbG+2p&(uogt>UHN#12YvdgE`X)nNc)o6V6+TIQMP3UKQ_JVt1>(J>iPqSw5o z?+EY5cELRrOysYfHWjLEr&{U_Et9 zBS;@k^qwEsaQFI1*C6-l@EV>-A%_bjq|Z;LYt~#;s@{mcg|Mx#-^9i-?KpktZel32 z(5-QS4&VA|)h3GOf{tlZf08is>8S8^?q&-79$^JC!wYKoe{aLtf*jup$hXJNT-thq z)(Dq%Ph&1*{?k|6?SDPU3g3AawK-cX`OAEK_h_JWx)3@`8E8TcN3;gtaqd>)I9R%=94AHMg1-R3lq_ItzhtX zs@2XwqrcU50Cld9()E{=98uN>?4*<3$=&Jt*=I#M{O7hq(}lm5;4h6OgNF|nI1l_6 zSOZEV!`>JL)jmp#pdugA2g`hftMd`HHl+U?F9Zo-Bgz|7Zx>ARx1!(~lYC(WLQmOR zz40Ifkwe8u8-W_PQj1`Y8+I%pQA%r z*ERO#JtRSRZ22YC1jO9e%2sC4vfi;DCsdJw%r=DyR^Cn<`&m`Fj3*l7`Td4y?-+Zs z6UgzNDDO6sj5vhRNUj5?(K9LWv)2Dk({U7ftADVd{InqJrfH}Qm@Mu(yiXBL8bbyw z?__zMDR%Js2D(_v{yv!2Se(Trd>3>SAXH9Jird_GG0ln#^TSz6Tr+5>(N( zG*L>oEKNiITf^bYBsXMoHrI>vMap2IWREM7f_v5aP7n-1SP}|c-T68l-{5b6oZQUb zf#rC0JH@iUu0yFsgt_gUYcWz{k;3Q_5t z>1{sQXG^SX|G3ENOGAg!obXnMX3JO`P61J)J7U5ziV0`Dt9m&jYaHDMJ)zX3JP%2_W^a*-9oD`JjAwe1U9A|N? zw4O7fOfeGURurS}SI&HQ6@p0Qie-4a*@)Vu-C`r>u5{_b4h<+M4v+{Q?{-OAgmi}~ zLkWK=o68b1DM-A};8tm0s9JlmoRkb`vccCm@+a`?|p2m6%3tek1)wAv zSa1w+Vpxe}Ss~B-lFPh#DiUB|{D@SNZW_^wTL~l*mbv>~>f>l!pxaULpKEw=)qg$Nk9XOZYa0G2t^x+V<4bVRsZwaH)l>g+ zt9F(fdeUuY&9`#q67O4N#lp&p4o0I`h;h~8nD%Y!VOXH11nFhZNF(N2!gf2Ki@*^O zc!w+}zr?24dgV{{jW4j06!46QsxD8>kiKy|T2coVzKR{z8^&;gdKBv?RI~VNRYNda zd)o=b)fVYba=_)__Zg#v!mI%ov5u1dFhn?K3pV+x7}eJWa{bmy%>Hz*yG125JBl{T z0y4rsW1Dfw12$(}+o64>v&Oimt))6>O{WYr!WT){=t?B(hyAnkc2uIh(QKd<&(RY> zNdREH$S)4bcXCL_llWl)#TbELpD;y}%(Hwz)JO`&y7M}*jp$IMR>^)-x~3y?#kQP^ z$c3J+)0Pssgf7!`$Mk$@d8#qM*4rFvy%N+&Q#yiMv#F4d3BQkf4N_@4!((sVyXLA8@w)$&@DoMIpDvLKu>k@E ze2;ItOR)VYr@!35`h2SzmE0*5wMysn z(fd+?#wH#rw-_Quw!}dztCp^KPa$TXl$x4!!8kdyIb`7Z2);G;*s!$k2hB1wRa_VD zLZO*yZb{h|?l-ZkHYx|6%csKFL<>S$eM`b+@*Jo~=DBkS9<~utwZeQN3_>#6ibDBh z(U32@O#U79W_03WUP`mW$8Esvj7=er+iRY;>&r?58Ko#pD>E$Xr?&r1Z|5L|iPvYrRTT=WVsg(!euCvC6uvh>(|SH7tMKxFw@ro?p4Rw4=%LsS5< zKo~laFV)s)e+gu{CqsplvDW8X*XChM5EU@t+mm^5Mbh>6UhEIpQ@A*wiD+`Q2-z|S zONfxkB1I4RrBaaeZI2lJ_M0eo*GU!qV(*VJ--mKto&X2g;VD%+EyP{L0Ndhm$N2)@ zI2@>&i&&htvvfk*6q63hz`!xspc-rkJaSlUroULnDQqaKjpBd8hZ zR&>)cMb4Y$Q`5jmi$wFrQsskEI_XfX4Xx1V<-l=$%PRg$K4YQfca@`wZ)KY>t#7zR z+qI!!jbr65+(blavJ|Iuo~_|TQP%kzq7aBXNAJ5cK&)j8siLY`$SR6)f!VbX*~3f7 zgeWP*E|Kk$?fP}XXAkqwHuDeL?c^1`pF;^{`8XPaB8pTIkc0U}??2l2Bms?ki);ul zl+iT($hNQ_uns6rS6qT_rQA|Kd&plh=u(JbTSX8?r4{BJ@R4^ZGQEt&TElM&IPxvc zkK3^PDYTe5Q}q)cqDlYxq$6|)$m+}`AT1@t19>p$o)BBro?_d&5We2LJ-m z3@9|Sp!rdJ9C~I0qG!sA;JC0Td3JRPAT4QnsQAxrb}m34BH@SEleq0|Q$%CIP!sU3 zP#yg1_u(w9Ltmqy4wK$@Uqw>)w<#I+xkOlR!}9dv#%P{}Jajf$ zkjF|z9$Y*37$OMF1;1AeSQL|b z{1V`=?F*gk=fXn$>uMDvErrzMnKEm?^LAahMRhGzZCQ8hwx4=sR`(T+vBZ?-iA{bD zooqvt>;Tiq+6$u+d4@ZInI{80A}?rz9l?SIH)2ny_-7Sb2N~U`OGzqP5EL2a$287qs^)Tk6Pign6p&L3r?iPUgx7>h)9v&@~SOPb{-r0MD2 zyi1~1dG5c=A9oFa%E9hJ70O*dh8>=<$eQZ(@rIlIk5gqD!2G7gPh(pDfc$s%E14!j zV=q|=9U8IYXHRl&Ag0+-iN5C8$E@NSq{tLxNJ_<*klrU z&%PYkh3%PX1`%*lkJcfa5`eA}6IbuGE-`j(HS+d7-4CME>zu-=Bf{J9nw-Xky*a6+ z-frjGlhPmUkSBxmT#Sok?0-t%QxZDoQM=9^OyybOEH4oiFT4OH}G0 zW|fi!1Wk&~2xn~VaLdqPMJ?(fEWE$L?kDvIsTWv#@5l^M_l13M1coUO8J@WrFF*~} ziWP<YSL&H4` zY;+h5Gz`J+{xMb=EQhZz_Nld(z-{WyIlD$S0l&)lKc*NqmOL7K1?5WYv8|>t9-$2= zJSyqL(K!0PS#loR(<@e?JoqmVW@TEi@ijcYp51_dv68EwV)x>l$dUP*?=p_#C(-dW zW+6n1D`{nI?efj${n?}ZpfoCE?WM0VN2rHoo zV)$feiB2O2&55bEm%i#rGIgC#SvLxp-(x z(3rn7h*CL3`eXe-UqPYb^2!CO5rTs1ngpv)ZC{2OtC{TZK2))j1}aZYcxM9MHEA%K znw;~j%t#WRT1`xK#63Kg5+qu&^^o(Lq=QnMqC@D3FwkIbT}m7BtA|k{l~^238-{nC z=D&w9>hz&h!ZS{Z$_X^B$r_F)%_V&?ieS&O5WDPzusU4FPymx4-j~B8MHCIcTDlmz zoE=L#@gS+g|I2{Yb0 z!!*+l7rs=i@5=Pb6HNiYR!zvcW`HybsPvPvBw~s*iF=);Qj+Z(r!?TV8&2LNKQj*v}$m(Blk*sx4?U4jJAG*7c;0tZh4+Nkv>KUs_#>M zynwKqsv`Tq+2zi*hGv)l(_+g0Kc<=GpV)*!aet}vAnFHugLstX!B10$$U^O)DOW1ntiSk|P0Jp4= zbq5lPxLxa^BWU*>Dc+GIETYL?}JzTo0TzpJGW^&JuRyKiPM=MQjNOf8|6KC3uevYbXv{B+CJ&+%ab}zG91B`AQ z@m-9XDp>rrXCw4OAZR))ggBjWiSLSdj`2ib=-tl@f8R})F>Dxr2;#wkaEDXEx%lmOH z5&H8~CAtDG>y?w&BRTH%0~Nc1^>O2MmDhKjhXPO07YMAE@;o~DQ2hk2FIIiE!00KF zR(yU@MZ(QtWlU)QWkn$Y0ZfN<$h1>>8fSnQRp?Bh`yKYCS<)gt@K3XM6Nom=&cS`@lrzBt3}9YIYsUE(7NkU)jgc#&y+gs)5*$D(>e#e;A$DbNj?Mc68a=3y{JMEPkYd(+8Zt;6>Uq zd_3>Bf9v^Qtd^V}{Y-MP`=!yB7RX-R-R`Cmx0Qg!dex|^!u;T%p=xr|Gp8}5{Ta+*?937 z;X{&jYf)|;yR*&}=#6`$?Fw3VuSCir4w_}pM9c1<68VFYJJml5rZAE zx}^{)x&s6Z0UhN@-Rk8i(9Te86PiarGUl>G?}sO@j4~}qx-`G=-tB$#mYbGV-jkue z{0|4qOsIj+#}y`c2odKwRfZ2oC$aVBPS)feYRr%j@1LPP<-V~m*ROxnXqtqF!Y&iO zlCKrt0TR|5+qfMR&&LQJt?6h8zf&EHX?9*P&Imdf-s>Z$w#%@GJr7V!8a0;Md8zsw z4|TIErPwz{FO;Hu%t;@f_qk_widh?WO1VD!yngw2yx8|RC_W!w3N5DNhn2@4h9>1o^SqS8rFL|ybgPDlmv$-+SFM& zFXM%s^oT-tGNSa0vC#wK_GL1`E0YdrhI)DPm%nlIZa-Ni-hKw*~C4QMvrB z4Xxs*%gvPiM=(<)qX^f=1Gd%^7aZTu%>*_zhHTIcS^&fNWqoXEtuO)i42qf61dG%FEM z5(B^EX(RN)*ElYUhn+=tlsP4JwX}U&$I}^FoDy%j&Cxe;%v>I=I)D7pls9=Bo1gH7 z1p%ppm7S^wKOy5Y?EM3kV6f=uYD<^9q`mE!lsK!@-?&b+ttmB?4nJ&zYLVLHqYCyI(&J5ZU6o;|9a7$ z&@|e$4lCH-fzy%~OFxh<=&P&FU)UEh5wZJyIO4E4wKl#xjb1tddULA0$%DeZjDSqnXc64h?IR+l<+AFuT@!0~16jU$1qnVNJ2l{~?cc=rf@m$ZR)Q z&W?54av*}TKOti+XOH)^SQ9h6A^CizHG#%VulD zqL|#9^9|Ih;!__MpH}{6d3T?j)*Jjf^m0xi-dXaUHxx`6_`5w{dTCdcI`s%GZEf1= zVU3MRKoFuFDti~Ezuywgx>m6c6`YoSMQCV;_KbukvKWPmsTLYNmCcQ0{lOG|bfnPP zqU*`wFg6J8?94pFmNR1T8wyax(N^;EVv?I%cN1mEGU8rR{=Bj~iX^S$HJ6Gs7ZbV=hF7N#Z_rv`I z=j`+BbM}7rTI(z_G^G}9L9;*Jzt1rru~U!RxDK_@Xi8E(;R$+#Omq&uWbT0`x)B)SDNFZobE(jGY{I3MbVf z3G29FiUEJuwGf84-wtMc>-;KJ(h;<3R2gJVl2Xt{Sp8A(9mr*R@0dtZFUZ2m*UIjj z?}Q)FAA3#md$;dtp~u8_P(7TJJEx|Q>mv!U9<;8hRBVyOK-ruqTM{|U`4dkG?j6U$ zk>#qNoM(d%I46G8F1RYSYNMu#bs!4!uR&m9PsPb8`hHM@{P|NcjJToy-v57 z;+sDM*dk_9-1d!HkDnZFoEMUPVM!oOsMlwiwh7wDT`iV zijIsZE9C85w0gZ2;uMCJqo_k9dc_vDf=ysEc0QA}ac5K4{b3`JKf(+DQuOa=LrS+e z%#i;!R8`z$JN^er)%Rs(6o%+Va{Z}HbKIskJ}u^RK|KSq208c(K(G(X&?Ya~{Pn=E z)qp=%k%(6W!Y_Bc;_lmPYg`9MY7>O(a^6J0|8o6Tb>ENSRe0Zr{>{@4ZMN^dRP6AP z)r0yvtM7tw3wI|>+*NnwdF`L%)m64L5SSR?1{VCW8@z1yWT{NVIp8)GmJVsVYFkS% z|HH2xi%-T?O=@rC0^&Y@gwlVUz3A$ zX~`Yu%gPuE`EoMfD02@jLmoFu(}l037@tv}YoZU$o^?Eur*@^$1_`8YJE^g|(H$5< zV%)+26)W1>0OpsXIWmwZRh00zB!NL$_DKzjxN+WO4R>xLIfzr7WA3lBo{S_|{Nh8> zo?oVuRnTWrV@Uw~c*zY!wyx7RL-SjO`?B2ju&L(LBVj_%^NbSSTHsvutI^&P0MQG2 zQljb0aC>4`d_gHB9S)1s7$eSVYXq@cXl&Ir>`Z9xo*;Csw+Tu5cf6$4rR*vvy|Ih? zdq;7+#{{RV2{A?&?-t`eHg6h9$=F(AKJO)!lcy zfJH3h5^qeo&=UPCFO3DIZo-;Z8%227>ML$sO$gmM*u^~Q!oJVi_3wrAReC}Bnl|)$ zX1umAhXIWp6O5v?l@xE0l91=1iYe7cQE!v8ecoQiEY3LQ>$W$O5(4Q>i@Ky5Ic`PI znx#QANYX#|++L$uv=q*GLTNiOI#Kj{!e^(1VbM~}HC;37r{39z-;d`k(a0M*GmU_? z49%Q4son3B$QS~n1(mX-@LgAJqRf>1Fq+TA$sf&5gi*=-U?j{;#02>f?-f>^Su1y> z>je&+`|_`*N$c3A<9@$mY*w=?->DJf83vBd`q7n3MjUsIj?q1M2aJ3Rj;nf>y^)qP zfcqC3Hy7qB_ANG)78E46T4-KYU|DrIn`qxEU2>*9d7;nJeDMeWV~nq65Bp$`$>5## ziJVgM1xtQxnxPb9f?AJu(_1PkYIpMJKV=fN@xqumf=|cqpb@8fL1G%^S=q^Eph#0f z_E(8mc2(p94+THv9GYtK->qC7;gM*|g#vf$(s?~Q>1VXjF=BzwToizePd@VJ2BXnd z9ilh0j-boqjOCw}nQ+Fxi)s>l#n5cIPK*If3LSR0IQ@~BDa#f7<2}VO?lPat3HeoQ zsZ7;Lc!gj172^aDhc!^Xq$E=wwdU0pKSb1MrZy+1;UHS){nx7LTmLd76UFAf0wi$1-K1I3gsV;TzFQe2CaZBl}}= zhK@#=6eAId{*&4KGmia@S0h~W&}Ygt2QfbKgR~kp?M6SqF|JokTcOHa7+U5i2Aiir`qDu869rQnf61M?>DJ^O_2p&hX^B%KX zVk>65tGT;wUg>IadPCWw~=kd0n2Pyw|DVoJ$5byVld5W5^R;Z^0wIDK+e*pe79w z5{Hq-^5>eO<1Wq?G%b3ppF|ZChA*g9@I(JFcZEi`6D&wi2ZS1^*AwE z45YB^7D*Mk=4w-0E8uG=3J-zm5!XUfCo=v{m21{Bl$qt|CWrEgyAuROdvMoVh07dL5ACs{Q02qj_n`z60qB|aqz1~#3v|tRFPJBqD7(l z3k&JyxAoe($X%8_3#-HpYmzrYY$or}pR?|O7yxsI?OBzUnTlSC%J6J^fijDc?PEcG z&d*#GHFY?TNaT-Mo^3FTYJt+UkpZJ1md}fTo>yso3m%)obrXnrE#)@Y7x z&l_KAwbdJX60TsN>R08OOCdU5%04+eQ3I(xEiOc^@O#*VUl>s`*12b#X>egL-t9m> zB-S({5^R5;h#PAzdm;LpPs)sI_Lv%k<`}pb=0C9{#kFF}f++3@P`nA~2z`Nit^y^> zwCZW{bhKfAb{WKGQ?y*|FgI9&MLzed-csc=+;7j$oH@8b#(~c+2gHDkztPsVJ8vJ} z9SC@SV1gM6N08W<{vn^Y)Vo=XFp8cG-MO(fJa|GS;i0>)F}edknqTxCIi~le&z` zQd8cF*5b=}v6?JYAT6MmJSMF7rhC$MF1b()YU5eg`3O#1Y@iyW-+n{ZT0=m^iQqij zIyw1jMCXdpmF*C|fZrv{EpGp`3{i8QF&&6oXx*AV?2p1En;hwdmxfu|7S<3Mu4yC7 z=IYc`4RazPpoKay#hHmUBWWatU*rAEqI|V>=T8!B^z7|RkdeKOu7ksNMN2a}Kc|C6 z)PQ8vez!Q-kcRD6;rGE=hus}7kwN5he1QOfkx6IvGW-^NM&EsE_R9O75A)RiNgJv$ z9XYYIp$kjdn@HQ0z^hF=Kl}0+KfXe{(AFVuW-j!3m6td*?B7N}F;2$z*`Xmkwr>Kf z4$=u64v0-I#=daLpagTMe)HM7B!>>WL zRZHz>*mNF=mF|%&YUR#EbSt8b!#mgDKoo%-w5mSJbQ&+#g!J_EnMudomZ%g|MrN7dfqjJdaV@VbqH=KJ1 z7b+O(6B4*H#^u{C1A<$IGR}ea5Bt9~O+f$s!dB}FDxz}Y&Tn)txOw%qGVaFv6(WC? zz9bYYa>~YTl53*t1N>AsDVm3z&Cf%uL*)UJ3fV;CQe~*jfNTBn4Phx3xCO_gz?^Of zmIuLuqoS>lU{!8d>kcOk5V~sDurFtf&hBbcM0Z8apPYGtyPP_dRc3h;B%YynF@RAz zTB>}f-`xhR#eNT7SP{HW^g;gQ2Y0^Y(0e8U-_cK4Rb`y3R|OSZ@p986A1O|g`UM0o z?jfe#c_A>u4b3()*LWHWW-*Ud^{n?#9~&^g*tm2Ek^n)vJDp5N@nF< z>2L?b4R@?vtbe@@Wrh)NyR!%3qGx#}0UBxx;>_qy{_~t)_Rpg0K9Jy?K~# zT3?=yiHVujuA}-*D5+k&7l@7o^S7QptbGk$X@`-S5i(cXEo;s|(GSbwM@knTDZWkr zZh$*Ui|pd#=O zE|@5YMVWRJYsFUH6vpSd%GmKf3c1v%-R&P__1&R2s@^F2CRpqRU@~G~v0H+MK3y6hTq3hWN>s2!-|q%| zU$!1=64}({#O2x&XY1~ti>rowsSFZd?$AkH^rt4|xBMNvg!`dT@*%RV*d6_biqQls zxvO~VZym74+@nY*Ng6(hCWjjzO)u~`5K2%lN>GoD!U}GA`{nY3H_X4U`+kPcYn>s& z?nmApS0bPl3XU*Xp?WOXYn74gACB$QMV8ZM3rCCS86I`EXdC zU9QycN3MwLTbXKF1GlRDAA^U-O+_^Fl`m9HEr>aVh^#TWYxan~t_?NtcN(zC9fQtz zFS{H}hlMDU9~#Sz?hH8$6nQlEq!UHPi_n*=*>rtn+0U_0=7iPkD%<^ti5*+xhS%Au zy&dZ%4Q;ML^p<(Lm7L@!a(OJnA_Ileo`F25&A~}wbrrET>#0__=XDjV89f8hKFV(d zVYbEsy#GwXmr|1khD!t<#_gVVhiqT}n{=#MtJ?|zYUrCze|>Jm4g_y@Z`atlT22}d zOrj9ONF{oY3etI2BmshHgN1CcpoWb15_YJx?-~H%PVV3Gjtt&`QGK;=5)i$d)yomt z8amgd{-W@)ZCiHK(2yjR7;Zn;kJY>`2!?off#A!TS<7Pnuc3Sz@M70oB5G?_RE?;a*~61G(Z;T@m*MdZH$snsAp4L{~4&3w<;PFiA7crzYB19cr z@;Y8_r+lcnl_lw}`D77jNudxik=@Nif=+DGslF_}ZE8F*J1zXj{b50k@ZkoQqxKM) zYFyfFuQ{J{i7aZIle?xoptdFl*cw<;{`HM6YTZ3;^GUa7;X}Vk3_hMf<2?xi@G=B< zIE}uu_#>bb%{N(GS^Ybl)@ek#Qg69!fFW58OfqCx)YI$2q=fPln?uhm5>V~El3be3 zF^{@nNS-hra8`^pQb487yra7;r5JG`%)xV@BnDVy1x$Z;G_JhI_gEI_G=GCkm1WUC zw4wXmS5X%bmU&OeSb<>^;7@^cQY#W`nF#I$e=AqN#y*yVH$E4n(v)X~^HM;^T?i11 zqdaje=HB2BP&+?O-fh>c< zc*UoO^hPodZ@zNStNQ*66Y?Y^HX`~`qHa5h7_^LhGSQP#@!F zO|Nh2GxrP5M@|}KsDn|rww{nCVaXpJ{?Mcq8Kbc1`jSnl<;6R37R8f%Dh%VMk(K%< zF9kh^yb+)9L@cVsFIU&4N7NQ1Az2)#LgD+_ z;F6z0MW8{6xN4(r513cm`pFEXYUT6~io>~nTTfx6B}6h%T-k~JdarMdSmb4OVHIx z?_;)Mc)dNOujjiEO12~_ARFtj)4IDEo%3}psBt97ooyYA_v`JKA;0(4FE87_9vMl0 z51PI#TJL*HH1oR#Y?INdDP<6h0m+f2H<4bXyh{e<`t%87Ng1mfZyj@Y6h59TRM1wu zbFjOaJt}a`WfmQ;eAdVxz*;+ce z7p)tTw3YS&(`0OJe~^A=p+~XuO{P8V{wYn4q>R*Q4D~)Q>e$U?-!gRVHAC-X)>N3T z*XZywk~H@k&&>YF^6|mq!`zF1knO@A^S*NA$x_{X<`Td13QKR1txaA_Kau}E-N;UF z}_Nd@KmPd)J@GAAJyW1HH|?$Muvj@6BexRYo5)cd~F`_-spS9-Q)8GVMN1)L*T=voe>uY0Uw~F(xk?{pI&ZfN1;Q6M*|@;*?k38mE43V=eHCWpfwx_C#r znAllw?Q*~E6z81p{_Bque~HKLaDi1Q*3|XZtP#Ea-Ut0w_7PG`VGJklvgd1dIu%@Ub#a?BJX7Q2*Nx2x$mJ1*^ja}|1R)=J4Vtiv8$kotL2sflbO>$xT?hsO zuY+Alx)(6`Z%|>0ptQfJN+lq2Q~l089zy4B)UX4LKEKP>ou21e(zDC+-0;~l@Bh{E j`2XOe{3aXi30VC`rN0&MDDi9u{X#`SL%vehEckx_MeJN* diff --git a/vendor/github.com/docker/docker/docs/static_files/docker-logo-compressed.png b/vendor/github.com/docker/docker/docs/static_files/docker-logo-compressed.png deleted file mode 100644 index 717d09d773cc46ff8297d06f66d9aa855453f35a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4972 zcmai&cQD-D+s0R0Yj^ebT|uHmbh}CrD|!v0*I@N7h>`>myRteVy6C-&h-eWTEJBos z9-<^fCwij%@;vj-``7QC_sp5O=f2Ko?rY{;=dTm3uctu`WrKo1AZjg5RYMSn3;=;h zs3By3m9`raW`B#bzK*fl-zuwX{C{n-Y$9*-1}L@}R6Pc&oVoU4=l$%0kfT3mND56# zql9}1Uva-kRFRCXF3fhIFQ&XZ}oXTOFRof05QPgBSL6y@1 zl15u3N2zTTe@FcP3$ULSt)XykoVa5Zj-VooAmOmv9K8eRY%r?F2HGJ->^d)z>(fIs z36C3F!*19iQFc#}ioi8E9r%m^O#b1iB0vWrBehe!28TqDgd?xf{jbPSRx|Sc$2mT7 z&m4NttP7}oTSZqXK&JR-6bJ@`zvwcz;r&N4lZ@wj+)(lm!0-sOe} z(k90<@DUDRX8FZ{eyz|1*xIhv%ID3D&1ChI_x`>`Gg;e4bH{_FXe&)x)O!9J{%Jv8 z10pkYH+EE#h@}O2-tj)+FGjX?9&g?%(*vn1tBCYe=Zl)^89~AWtfi;p zbU;b51Uq2kF^Z?IQ(~B|4Iu3_9+o_vFy7H(O8)Wz`Gex&iU2ojQM<@HGj-r2_lrl0U+sN@`J7yX!f1reW_&hJt$I=ng)fsW zyM^%)1x-`I;ysWvqdO~<8gfwWjnv|tC z>F&Q@wW<xfkQ`kwLi(OUouG{MHZ^K0!I&e+06+Oh!1%0UD4#6)B&= z``nN0G{ydfi6juFE*nQ=srFgEaf7z#zakhZrMDm(byQq_VH7tWltTYlN=oY4G9P+p+<^<4=s4n*Xxg_SIz(Q}^0KKI9uw{k^j_ zMOFA(?j7s1Mr0qqa&JjW$S_+=iVjMEHu(J#Edz5Awt)IziHVMWC}rYDyUnB}>NI<# zKLF`P%aUNM?4SlC+A^yMmOR|c&=!nOH55Aa=uc5HY+X!?0tTkvG_gKm15Ox~Fdtf! z`fTZO5?g@IeWGkTG9~8yHTCN&Lk+vj7dl+F{@7>+SWE(&arXi;Zjn*I0Idx5(r zbR1%nDN3=hhhP{pPVCh2HZ${01N6PkQx$>Q(DEo>A%8Z~_LGqHX1M7Gjec|ij00W? z9s6Kw@f=_mO4WdgEnN*>o&7EeiP-CGIFqfDejyp1b3)v?6sQ@Gj-R`2r}f2WexHb_ z6ZU%agw8y_oqjXM+pQcNXZ89xhKiVi+NZ%!q>v(W#4~)Vp_WWSzPEvw4tg4jmXe!1 zEGE`fmefFeS(Q2mtHEesd0sEZ6^kHPJVgno!@w>h{rP(O<}eGR=yj5=&q36W?!CM* z`T?8NFbF4%Q1FzoiPn2^0xuW6^vgKCZXS>j=P?+byDBuSwi30O@hM`Io%)pfri+5Y zk%Z?h`B58R6PkE_gO=;U7vY~AF~T-80ixA6;^E|7e4im?11VycOmIh|iAjMM&)Qxl z$`YSoFv8BFNMJ67@T|c8x*Ad*k-(%4z-99%C#jV4MOPh6)@gBs{l#(bL#1_bLeuOJ zMadQ+Zrrzkl8n4jImhy}u&$}}svi0_5VZC!&wT8_=OsUE|1OgTR~ncer@z#3)YaYQ*?#WrxabQv(>BcRlJOplPc+`&byEqu zSe;z0F6W5sjW{-LbqNo*Y8cT}Bb@z~yI9DLEWN1oWe59z_@ipp zLstkhb7SjtG)K5p8T!^o*bGI%V$0FtNoMIlpau7F(lUkM%3oy@Jgwn}2mJpbVsv zYUL1a#7{fVYxYs?5QBa>1dF#(YQhTY<{rU_!+3F{U(;V?U7m}mCSv`f%>`KB;P!kz zg}Xt&!&;r5fbo;^e-?ODNKx7pBCMv5#Q=9?Z@%340qiWT_HhME+>aGnjB0hEx9mrZ zIf7LeNftg$1IABOR1cnJ&qr69m%R&KzW)Zx^)>eOoLqsYeKH1V{eGaYc$UzK%N(u$ z8MW|qaibkx?1xOd_cB&)9AYUp%jDLJF*q<0_OQFoT5UI4v*lLd)Ct+4ihEmPIr4mv zT3^spo(F~bh_%?WfMyxf;(r^`B|7|(5^YW+;rXpVt6mmzj@;~|;6wte-q-K0Yp_`( zJ;nRYI;I)n>4&$m?y~DBjcs??K>Dz|ef!&(xG(F?8Kqn13naL`$21$cW{lQy$eZwAn~26|FVhQ)&w*@?T;1__?~Q@@RdnRBxDK)W08rl#y?Q zHt6|Y@KA+1?$y3I0R|XEtQ~@(1K^*1>=HW?FL;Gfrn>2X2{)Pq4;z=^FGBy{4 zfjcO)iMEO5!G5H(2PbPs`79(Gg*|FPTSn##qwNj0e}D*6oWkc+NHkG`3@+qjcLh$g z6T8BcIDh5pr@KhK)%}u<*)k0r-o>NFVRBhT%@AQ;O!g*VVZ;OS{t5M+4pX8jTz!fP zUT2PV&V>2OR%#=s5Hrr=k$-fVU2zn>Jc>pmcCD1_#PBHiv8-}q9RPJ1Z_sK3Y# zA27HxB}mSrs&X~!2ZtFIUal{SOK+u$jHlZ&q4q)-v2%g|cEWybWn=rLZAxos;_5{; z%tB8~2Eq>yW6O^wzAD|gfDOFqkjc0CGjmeiY_{XOG^?&-Q6$HP^*dnBu3^{n^e50%;zmk zwc;)Dh{=LBWv_i3!meuG>@sfew~lS&oWM4(iks3~-(?eX81YZI(rwzn7q8e4y$L78 z`4+D#Dl)qaN59RF&-9O!cN;@5)2r>hJYeq;n$uAs@2Z01pYA*HDdD&aosaAzKvx8E z;z|5zUuN5_;k4*HQvgTq^b((I=_2NFM6PVep|fAkTQCl z&iA*FJ-;u>J+8DJ8E=4sJW@%+GeXvl%);76DFJM__y<;;3%*z(2_yT_d4Q#h(SXz0 z6TG{`sFOjtl5o`&3Ged>L{cVrz63hs^eEUZ6D*s7n5fFr7<#%-3rYTGcaKbhthnSZ zvMn0>usnD8z?m8QpU?lM#i}y)Z0=qUB#J$xgB`xiv%~V#F$kHg5_n%lgUE{WATED9 z5Z37T+_QJI?|5hYlFr(_elO;+!WHpPS#rxhmNpG5SS98N{B=1haE1SAlEl)d)k7SZm;xWjT-*RY{tG zN(H#)Vd*7mhLj(sb8{+v^nR8Rgdr@)pL~OMvWo+jlthKWH_7rkcSK^o7TpqSt26HQ zv9Lq=2#t$3r9$CiI%#aWbC8{!1MS>1 z5UZ`lXyO^rgtvE2oaic!Qw{AkN z6!GotTQ_1whY#DPT1GVMS4Yz^iWhhffQ4ra^;Tj+mN*O>C&wdZ3%T64jdoSXNnenO zea@%o;r3TW=&=scbNiVI5=Rkvf{pY+tp_o;Bx zO6NISp=xBP=3DE}=6hZD-a13GU(KY^;wTpDEg?TV(7+$NWG6Sfq@BBZplR|%&spuHx|0@}%*`RMavjdMgtNFi z?6c5OqGt41{y;bM{lvvxTU*vUA|^2TBJ}1zFE$41^u5>}a$N#EgK7jS@T2(%2G>^u zMG{EO*o?=r8ydTN9h#9jGMgK))f7{VAG*3k1F=q=N+F!wD9-r_E9JenHtxz0L8~e# z@$=-I0ZOD$dj8A3`-#!zl1viIELeCBWT;@>EhpCqK4;Vcq!0WX#j%{b>K6JJiZpFg zLP9l+3-z;xQ$p+im5E|cX$26GUzO;&G zuvt5i4v?-+;G|D!5DyOUcJ{ngAt%H4hV-q0pq0g`pm8KZle(5EB=8fd^L-()yOD^# zcq4HkpO)Razp>a{d64bm$vt2#!sCF0X;V_57i1&Q^k5mQoB|V z<(W__{wk;H!y4gdG!mfR-L1s1{wXPs7V}I*f~fHizL@>v=egE;{|Fp0oP2B3DGsrcsO zmPqMH9F@IC++&PuoY2+6lP~d~ZW&j^aaF|~zOE1X+;!6}6HgrY=xS-#(z$}T{tbV@ z>=beW^pmP-9yg&@(NeWi!rjRfO+zyM)>5|4tnk1d8+ez;yd#xM znmNhT$l%P&D%+dLk>Wa$Q!3^Mn5S5aa?m{%g`Ky@Cq~JA5=UvjEDE+oma&EF1bEdv z&`!H>_o}HyFr4)2gsQ>*``6L#I43*9KSz+?morzu{~h`t6(dL&;hE-9;`#3^Ej2yW IT4fCOKM4~1IsgCw diff --git a/vendor/github.com/docker/docker/experimental/README.md b/vendor/github.com/docker/docker/experimental/README.md deleted file mode 100644 index b57a5d129..000000000 --- a/vendor/github.com/docker/docker/experimental/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Docker Experimental Features - -This page contains a list of features in the Docker engine which are -experimental. Experimental features are **not** ready for production. They are -provided for test and evaluation in your sandbox environments. - -The information below describes each feature and the GitHub pull requests and -issues associated with it. If necessary, links are provided to additional -documentation on an issue. As an active Docker user and community member, -please feel free to provide any feedback on these features you wish. - -## Use Docker experimental - -Experimental features are now included in the standard Docker binaries as of -version 1.13.0. -For enabling experimental features, you need to start the Docker daemon with -`--experimental` flag. -You can also enable the daemon flag via `/etc/docker/daemon.json`. e.g. - -```json -{ - "experimental": true -} -``` - -Then make sure the experimental flag is enabled: - -```bash -$ docker version -f '{{.Server.Experimental}}' -true -``` - -## Current experimental features - - * [External graphdriver plugins](../docs/extend/plugins_graphdriver.md) - * [Ipvlan Network Drivers](vlan-networks.md) - * [Docker Stacks and Distributed Application Bundles](docker-stacks-and-bundles.md) - * [Checkpoint & Restore](checkpoint-restore.md) - -## How to comment on an experimental feature - -Each feature's documentation includes a list of proposal pull requests or PRs associated with the feature. If you want to comment on or suggest a change to a feature, please add it to the existing feature PR. - -Issues or problems with a feature? Inquire for help on the `#docker` IRC channel or on the [Docker Google group](https://groups.google.com/forum/#!forum/docker-user). diff --git a/vendor/github.com/docker/docker/experimental/checkpoint-restore.md b/vendor/github.com/docker/docker/experimental/checkpoint-restore.md deleted file mode 100644 index 7e609b60e..000000000 --- a/vendor/github.com/docker/docker/experimental/checkpoint-restore.md +++ /dev/null @@ -1,88 +0,0 @@ -# Docker Checkpoint & Restore - -Checkpoint & Restore is a new feature that allows you to freeze a running -container by checkpointing it, which turns its state into a collection of files -on disk. Later, the container can be restored from the point it was frozen. - -This is accomplished using a tool called [CRIU](http://criu.org), which is an -external dependency of this feature. A good overview of the history of -checkpoint and restore in Docker is available in this -[Kubernetes blog post](http://blog.kubernetes.io/2015/07/how-did-quake-demo-from-dockercon-work.html). - -## Installing CRIU - -If you use a Debian system, you can add the CRIU PPA and install with apt-get -[from the criu launchpad](https://launchpad.net/~criu/+archive/ubuntu/ppa). - -Alternatively, you can [build CRIU from source](http://criu.org/Installation). - -You need at least version 2.0 of CRIU to run checkpoint/restore in Docker. - -## Use cases for checkpoint & restore - -This feature is currently focused on single-host use cases for checkpoint and -restore. Here are a few: - -- Restarting the host machine without stopping/starting containers -- Speeding up the start time of slow start applications -- "Rewinding" processes to an earlier point in time -- "Forensic debugging" of running processes - -Another primary use case of checkpoint & restore outside of Docker is the live -migration of a server from one machine to another. This is possible with the -current implementation, but not currently a priority (and so the workflow is -not optimized for the task). - -## Using checkpoint & restore - -A new top level command `docker checkpoint` is introduced, with three subcommands: -- `create` (creates a new checkpoint) -- `ls` (lists existing checkpoints) -- `rm` (deletes an existing checkpoint) - -Additionally, a `--checkpoint` flag is added to the container start command. - -The options for checkpoint create: - - Usage: docker checkpoint create [OPTIONS] CONTAINER CHECKPOINT - - Create a checkpoint from a running container - - --leave-running=false Leave the container running after checkpoint - --checkpoint-dir Use a custom checkpoint storage directory - -And to restore a container: - - Usage: docker start --checkpoint CHECKPOINT_ID [OTHER OPTIONS] CONTAINER - - -A simple example of using checkpoint & restore on a container: - - $ docker run --security-opt=seccomp:unconfined --name cr -d busybox /bin/sh -c 'i=0; while true; do echo $i; i=$(expr $i + 1); sleep 1; done' - > abc0123 - - $ docker checkpoint create cr checkpoint1 - - # - $ docker start --checkpoint checkpoint1 cr - > abc0123 - -This process just logs an incrementing counter to stdout. If you `docker logs` -in between running/checkpoint/restoring you should see that the counter -increases while the process is running, stops while it's checkpointed, and -resumes from the point it left off once you restore. - -## Current limitation - -seccomp is only supported by CRIU in very up to date kernels. - -External terminal (i.e. `docker run -t ..`) is not supported at the moment. -If you try to create a checkpoint for a container with an external terminal, -it would fail: - - $ docker checkpoint create cr checkpoint1 - Error response from daemon: Cannot checkpoint container c1: rpc error: code = 2 desc = exit status 1: "criu failed: type NOTIFY errno 0\nlog file: /var/lib/docker/containers/eb62ebdbf237ce1a8736d2ae3c7d88601fc0a50235b0ba767b559a1f3c5a600b/checkpoints/checkpoint1/criu.work/dump.log\n" - - $ cat /var/lib/docker/containers/eb62ebdbf237ce1a8736d2ae3c7d88601fc0a50235b0ba767b559a1f3c5a600b/checkpoints/checkpoint1/criu.work/dump.log - Error (mount.c:740): mnt: 126:./dev/console doesn't have a proper root mount - diff --git a/vendor/github.com/docker/docker/experimental/docker-stacks-and-bundles.md b/vendor/github.com/docker/docker/experimental/docker-stacks-and-bundles.md deleted file mode 100644 index b777c3919..000000000 --- a/vendor/github.com/docker/docker/experimental/docker-stacks-and-bundles.md +++ /dev/null @@ -1,202 +0,0 @@ -# Docker Stacks and Distributed Application Bundles - -## Overview - -Docker Stacks and Distributed Application Bundles are experimental features -introduced in Docker 1.12 and Docker Compose 1.8, alongside the concept of -swarm mode, and Nodes and Services in the Engine API. - -A Dockerfile can be built into an image, and containers can be created from -that image. Similarly, a docker-compose.yml can be built into a **distributed -application bundle**, and **stacks** can be created from that bundle. In that -sense, the bundle is a multi-services distributable image format. - -As of Docker 1.12 and Compose 1.8, the features are experimental. Neither -Docker Engine nor the Docker Registry support distribution of bundles. - -## Producing a bundle - -The easiest way to produce a bundle is to generate it using `docker-compose` -from an existing `docker-compose.yml`. Of course, that's just *one* possible way -to proceed, in the same way that `docker build` isn't the only way to produce a -Docker image. - -From `docker-compose`: - -```bash -$ docker-compose bundle -WARNING: Unsupported key 'network_mode' in services.nsqd - ignoring -WARNING: Unsupported key 'links' in services.nsqd - ignoring -WARNING: Unsupported key 'volumes' in services.nsqd - ignoring -[...] -Wrote bundle to vossibility-stack.dab -``` - -## Creating a stack from a bundle - -A stack is created using the `docker deploy` command: - -```bash -# docker deploy --help - -Usage: docker deploy [OPTIONS] STACK - -Create and update a stack from a Distributed Application Bundle (DAB) - -Options: - --file string Path to a Distributed Application Bundle file (Default: STACK.dab) - --help Print usage - --with-registry-auth Send registry authentication details to Swarm agents -``` - -Let's deploy the stack created before: - -```bash -# docker deploy vossibility-stack -Loading bundle from vossibility-stack.dab -Creating service vossibility-stack_elasticsearch -Creating service vossibility-stack_kibana -Creating service vossibility-stack_logstash -Creating service vossibility-stack_lookupd -Creating service vossibility-stack_nsqd -Creating service vossibility-stack_vossibility-collector -``` - -We can verify that services were correctly created: - -```bash -$ docker service ls -ID NAME MODE REPLICAS IMAGE -29bv0vnlm903 vossibility-stack_lookupd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662 -4awt47624qwh vossibility-stack_nsqd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662 -4tjx9biia6fs vossibility-stack_elasticsearch replicated 1/1 elasticsearch@sha256:12ac7c6af55d001f71800b83ba91a04f716e58d82e748fa6e5a7359eed2301aa -7563uuzr9eys vossibility-stack_kibana replicated 1/1 kibana@sha256:6995a2d25709a62694a937b8a529ff36da92ebee74bafd7bf00e6caf6db2eb03 -9gc5m4met4he vossibility-stack_logstash replicated 1/1 logstash@sha256:2dc8bddd1bb4a5a34e8ebaf73749f6413c101b2edef6617f2f7713926d2141fe -axqh55ipl40h vossibility-stack_vossibility-collector replicated 1/1 icecrime/vossibility-collector@sha256:f03f2977203ba6253988c18d04061c5ec7aab46bca9dfd89a9a1fa4500989fba -``` - -## Managing stacks - -Stacks are managed using the `docker stack` command: - -```bash -# docker stack --help - -Usage: docker stack COMMAND - -Manage Docker stacks - -Options: - --help Print usage - -Commands: - config Print the stack configuration - deploy Create and update a stack - ls List stacks - rm Remove the stack - services List the services in the stack - tasks List the tasks in the stack - -Run 'docker stack COMMAND --help' for more information on a command. -``` - -## Bundle file format - -Distributed application bundles are described in a JSON format. When bundles -are persisted as files, the file extension is `.dab` (Docker 1.12RC2 tools use -`.dsb` for the file extension—this will be updated in the next release client). - -A bundle has two top-level fields: `version` and `services`. The version used -by Docker 1.12 tools is `0.1`. - -`services` in the bundle are the services that comprise the app. They -correspond to the new `Service` object introduced in the 1.12 Docker Engine API. - -A service has the following fields: - -
-
- Image (required) string -
-
- The image that the service will run. Docker images should be referenced - with full content hash to fully specify the deployment artifact for the - service. Example: - postgres@sha256:f76245b04ddbcebab5bb6c28e76947f49222c99fec4aadb0bb - 1c24821a 9e83ef -
-
- Command []string -
-
- Command to run in service containers. -
-
- Args []string -
-
- Arguments passed to the service containers. -
-
- Env []string -
-
- Environment variables. -
-
- Labels map[string]string -
-
- Labels used for setting meta data on services. -
-
- Ports []Port -
-
- Service ports (composed of Port (int) and - Protocol (string). A service description can - only specify the container port to be exposed. These ports can be - mapped on runtime hosts at the operator's discretion. -
- -
- WorkingDir string -
-
- Working directory inside the service containers. -
- -
- User string -
-
- Username or UID (format: <name|uid>[:<group|gid>]). -
- -
- Networks []string -
-
- Networks that the service containers should be connected to. An entity - deploying a bundle should create networks as needed. -
-
- -The following is an example of bundlefile with two services: - -```json -{ - "Version": "0.1", - "Services": { - "redis": { - "Image": "redis@sha256:4b24131101fa0117bcaa18ac37055fffd9176aa1a240392bb8ea85e0be50f2ce", - "Networks": ["default"] - }, - "web": { - "Image": "dockercloud/hello-world@sha256:fe79a2cfbd17eefc344fb8419420808df95a1e22d93b7f621a7399fd1e9dca1d", - "Networks": ["default"], - "User": "web" - } - } -} -``` diff --git a/vendor/github.com/docker/docker/experimental/images/ipvlan-l3.gliffy b/vendor/github.com/docker/docker/experimental/images/ipvlan-l3.gliffy deleted file mode 100644 index bf0512af7..000000000 --- a/vendor/github.com/docker/docker/experimental/images/ipvlan-l3.gliffy +++ /dev/null @@ -1 +0,0 @@ -{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":447,"height":422,"nodeIndex":326,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":false,"drawingGuidesOn":false,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":{"uid":"com.gliffy.theme.beach_day","name":"Beach Day","shape":{"primary":{"strokeWidth":2,"strokeColor":"#00A4DA","fillColor":"#AEE4F4","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#004257"}},"secondary":{"strokeWidth":2,"strokeColor":"#CDB25E","fillColor":"#EACF81","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#332D1A"}},"tertiary":{"strokeWidth":2,"strokeColor":"#FFBE00","fillColor":"#FFF1CB","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#000000"}},"highlight":{"strokeWidth":2,"strokeColor":"#00A4DA","fillColor":"#00A4DA","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#ffffff"}}},"line":{"strokeWidth":2,"strokeColor":"#00A4DA","fillColor":"none","arrowType":2,"interpolationType":"quadratic","cornerRadius":0,"text":{"color":"#002248"}},"text":{"color":"#002248"},"stage":{"color":"#FFFFFF"}},"viewportType":"default","fitBB":{"min":{"x":9,"y":10.461511948529278},"max":{"x":447,"y":421.5}},"printModel":{"pageSize":"a4","portrait":false,"fitToOnePage":false,"displayPageBreaks":false},"objects":[{"x":12.0,"y":200.0,"rotation":0.0,"id":276,"width":434.00000000000006,"height":197.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":10,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#434343","fillColor":"#c5e4fc","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":0.93,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":275.0,"y":8.93295288085936,"rotation":0.0,"id":269,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":14,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":272,"py":0.5,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":290,"py":1.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[82.0,295.5670471191406],[-4.628896294384617,211.06704711914062]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":285.0,"y":18.93295288085936,"rotation":0.0,"id":268,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":15,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":316,"py":0.5,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":290,"py":0.9999999999999996,"px":0.29289321881345254}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-204.0,285.5670471191406],[-100.37110370561533,201.06704711914062]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":8.0,"y":203.5,"rotation":0.0,"id":267,"width":116.0,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":16,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Docker Host

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":10.0,"y":28.93295288085936,"rotation":0.0,"id":278,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":17,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":290,"py":0.5,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":246,"py":0.5,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[217.5,167.06704711914062],[219.11774189711457,53.02855906766992]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":57.51435447730654,"y":10.461511948529278,"rotation":0.0,"id":246,"width":343.20677483961606,"height":143.0,"uid":"com.gliffy.shape.cisco.cisco_v1.storage.cloud","order":18,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.cisco.cisco_v1.storage.cloud","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#434343","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":106.0,"y":55.19999694824217,"rotation":0.0,"id":262,"width":262.0,"height":75.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":22,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Unless notified about the container networks, the physical network does not have a route to their subnets

Who has 10.16.20.0/24?

Who has 10.1.20.0/24?

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":7.0,"y":403.5,"rotation":0.0,"id":282,"width":442.0,"height":18.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":23,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Containers can be on different subnets and reach each other

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":106.0,"y":252.5,"rotation":0.0,"id":288,"width":238.0,"height":22.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":24,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

 Ipvlan L3 Mode

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":124.0,"y":172.0,"rotation":0.0,"id":290,"width":207.0,"height":48.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":25,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#cccccc","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":3.568965517241383,"y":0.0,"rotation":0.0,"id":291,"width":199.86206896551747,"height":42.0,"uid":null,"order":27,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Eth0

192.168.50.10/24

Parent interface acts as a Router

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":29.0,"y":358.1999969482422,"rotation":0.0,"id":304,"width":390.99999999999994,"height":32.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":29,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

All containers can ping each other without a router if

they share the same parent interface (example eth0)

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":24.0,"y":276.0,"rotation":0.0,"id":320,"width":134.0,"height":77.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":48,"lockAspectRatio":false,"lockShape":false,"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":316,"width":114.0,"height":57.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":44,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":0.97,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.279999999999999,"y":0.0,"rotation":0.0,"id":317,"width":109.44000000000001,"height":43.0,"uid":null,"order":47,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Container(s)

Eth0 

172.16.20.x/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":10.0,"y":10.0,"rotation":0.0,"id":318,"width":114.0,"height":57.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":42,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":0.97,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":20.0,"y":20.0,"rotation":0.0,"id":319,"width":114.0,"height":57.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":40,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":0.97,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":300.0,"y":276.0,"rotation":0.0,"id":321,"width":134.0,"height":77.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":49,"lockAspectRatio":false,"lockShape":false,"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":272,"width":114.0,"height":57.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":35,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":0.97,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.279999999999999,"y":0.0,"rotation":0.0,"id":273,"width":109.44000000000001,"height":44.0,"uid":null,"order":38,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Container(s)

Eth0 10.1.20.x/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":10.0,"y":10.0,"rotation":0.0,"id":310,"width":114.0,"height":57.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":33,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":0.97,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":20.0,"y":20.0,"rotation":0.0,"id":312,"width":114.0,"height":57.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":31,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":0.97,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":368.0,"y":85.93295288085938,"rotation":0.0,"id":322,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":50,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#434343","fillColor":"none","dashStyle":"4.0,4.0","startArrow":2,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-191.0,222.06704711914062],[-80.9272967534639,222.06704711914062]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":167.0,"y":25.499999999999986,"rotation":0.0,"id":323,"width":135.0,"height":32.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":51,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Physical Network

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"layers":[{"guid":"9wom3rMkTrb3","order":0,"name":"Layer 0","active":true,"locked":false,"visible":true,"nodeIndex":53}],"shapeStyles":{},"lineStyles":{"global":{"fill":"none","stroke":"#434343","strokeWidth":2,"dashStyle":"4.0,4.0","startArrow":2,"endArrow":2,"orthoMode":2}},"textStyles":{"global":{"face":"Arial","size":"13px","color":"#000000"}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.images","com.gliffy.libraries.network.network_v4.home","com.gliffy.libraries.network.network_v4.business","com.gliffy.libraries.network.network_v4.rack","com.gliffy.libraries.network.network_v3.home","com.gliffy.libraries.network.network_v3.business","com.gliffy.libraries.network.network_v3.rack"],"lastSerialized":1458117032939,"analyticsProduct":"Confluence"},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file diff --git a/vendor/github.com/docker/docker/experimental/images/ipvlan-l3.png b/vendor/github.com/docker/docker/experimental/images/ipvlan-l3.png deleted file mode 100644 index 3227a83ca1541ec68e06b0aa105e22fdf5ae9e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18260 zcmaI6Wl$YmumyT>5AG1$-Q67ydXV7m8r+1pok>`#RfTA-*)bij0K-0C)TQ9yW|^N>XfP5?S3O{d6!$!B8y2koK&0EoKg z14FAa8wP53UX5(L=%bDVL&q0#^aP6T-8%nWjl|N@0|HYEm_x>-zYG8X+2Wz0n@ zzI=J7-uZdIPqutrz|x1Ai?3;VhTlje(*-0XDKBVe#9*5bMa}EV0b?Ns0MG@0Ui2`_ zyA_7pwKNt+WmVFd);j7*KV7ZMKpvgIJVpRB zk%B`-b-EM-07kw-z$Bs2hOsF>sATd?h@Xx{3=r`1M{l@jXOaH_z4MhL$3kWlz_!oll8RWh!Q%ROqdsGnb z(TIUiKA{RJOZ(q_NwQH7TH06B6ls}!%=IAY1^)X7pr@=O1Q$j*e|F|%#TA_w-Y;kC z)_`zJ#`9NCCW{OdMugwWB?QLTkvyi0WxiQ_#T0~ZQXY15j6v3s1PYv2ei$9RP7duU zqHT!9#~0bi?!lGe=?X6%oIH~_-Z`^`G@SyH#Q}0r7>^JBu!Keq-(wCBenOz|2O&fP z%g(=xOm2N&(JGPhAZ&+bB(oa!l?)rZAHYn!%X6=Q?12*Z=-5I<(n;+L6OzT~%aEvO zgv8_ogMJaz{p`T;w{DzN-7~1pVqIlvWlRHg>_wsK z+@e+a#w-GRB!9D%P4X!uI$n1QEJo%7!P9sat=Yi+8?`ar93aXXi7MWN=hA*yn@Ikk z4&`q8r987}hlINhTR;^mdxMx-+>@>TP$>)3LgwW~Dq;mQ#%#p8{3(LFu9AB9%YwlX zX^Jt4C~j&qDj?O8cx?i0hwDmDi>9@%F0a|XWrlKxLu-fY0YY#dF;{(Xz#B^()XVp~ zA+#qOWF3Pblb9U2Xb05_fp~})4vZ# zE$5YiKsXBY*+b>07f3O)+SciM@ArFu`gqLyfO499UTM3S_#0RA)ci8kaC()t{CdH{ zUsheO{k`w`&G72YZ?(N1(zlZBufdwTu4o5M#we0nv6WmAo=8Wu(MTcf4Y?&QG)0oU znn9uhM0uu(8;#a5mXez3LPqk*Z#>J&vJ<;CvtdznTbY7$yAnJkFbEtY;(+bo<^Jk( zA>&D(D;*-QXyd%8x~=Fqj7_gcZx1elO`pe&sgB2$F=5#aF7~q%`{`%x&~7&!Hn|YE;!;Q?f*HvOpP-Tm=35u|Ah?>^rxk9yuVL1k zkP^ZRJesL>xg0b!OlMvo;5~)DutD19qHL%dXWPo&|3$Fk!83qR$Kc!-p}nmF?BkD*xxZZfVH1jrnX&-rzd4 zB9>wgQ1hSXV;Ch*6{l5Ws3&5^Z!QG)EfD;%2R=$vYzyZBIc4%=<%&9Uj*)QAJ~z^( zFcF@R^!oic!@aLO^ zn?UzwRe>!I+wm%NXK&$s=!@y=yA~n?K4GTE9nLwYxBrB5XVLJwnD6h{Z+ixERd5+Q0=_af_Z{pPmwPMNNVo= z^rA8x<0ts<5;8ZH)PoX%ne?R%?CbFx1>|Ft)?W5U-c9Y~dz5En8}m-QISYB@`4mY4 zW9t(O60{?YD}w}=snv7$F%1kM6P(L@8S?sxGEPWj|6uQpuv}y$PXwxizk|Yb$fH2j)Be<57<|=?) z7=toefVrv94SujOJ#Sg}yqaIWaY&Y??*6k$VyYbK8$AKc3jb%HTNw$Jb39d2mjxM@ z=d=|(v4Gd_E2cLLyx|}PT6r4s!8}pN-omkWg$xi>=)Dcr#<%ZPVn6f(SlFy~AHLY}=vShNZvs(>Pq`tkJX`n-95d-;rIln`$j| z`F``ctP$Lp%wj`vVKkAJffxJ%mR%E**F(o4QG1_%i2C!cB_M0?~vd%-A{K#TYrfuY6jxF_V7z1G^W^5 zTkPJ+SUdJ+k0#}#=jb4>-k?DVlkLplLG^rRCC{vgKNjI2DZP{(l3auvN}-9e*HX3E zY|ZkKA5d6X?|Deh9z~GQ@vQf=zMECF6tFx~Cf96uRL2Dyr0O3vRLGz;L)IUN?B zsq%We9EPv;iZn;9Zw!hiW zLd0HaeQ06T&$dp7q5FmKY2{BO06lC!TZ_Ri!ge{a&lmz7vGuv+$C zbi2UsYwN#=!F=TImu$daixwP`59?9biqDER2Aw-gPW8$CFsdmt!!B>PT5w#|C)r}_ z2;_M;_b&-|Y=^zpH(i*;wxxzVY?Or(o&kELz~rcAsz}r4i~dI~HKcqu_#{jl=wi@s6Il?Ufv3kf$F~w?T zXS0y$z?7NWvchoB$7{tI#Ro0uTOhEjvHzIfn}xQ_e1hz7neMVY0$xKoF~@7A9Z6Uv zjoS!uqN>pUm?DoL+82J7uGh=@Y{gT@)8l)~nTHM}BDEce8f#*F&?`G>1XN}0*gkzG zYab%K;%OL+gr5|jq|5GB`|;AA>;DplY!-@Wne1udl)5|VjAOAF3mu&HBp4$r3eWWu zGbk%;Co*CYpfqG1SCJ$%SuWA1I_p-mXg+p95oO_zl%Vn>hFagYp4ls4X0;sVKXL|A z{9GC$LuGOv_`^xGS2dPKM`&)S#B4DZIYEPdjfYgGbCPpwzemhxK>YV6e{jy>o1q zL2V0HFsggj|2)H%xFm=oCa1Iz;*$uC=POKh$r;s;^A6XJ@FF^4mVHxM=l$BmB7biWn!)HR#8Sen(!Q7)C~Ladc&k82OJh>_J?`mN<))eYFWR$j6;7-lu|#i}e*ftl`m>F$2P~R$ zHbl2-&`;>f%_-Duu(o5oF#7o8cgir@y3)Tbnrqf)bYz%&RCY36ECGEAl%NaqW=Z(< znTQ{!!A7)0jX3!%h`PeC$J1#=EG>{YX zf7soO!SffH(yI~zflPj>oQCo@t-lf&W_Z92tQ&ZvF0L$8@B-K(#Ts_P^WjPyv0c~- z^`vN@8u~lK9P`oGLASHezt;*GG*p)HXp+nMY@%4K|HK%qF7io#l|7}S_i&*S7nhUsDyo3PDMlyrL`O?WgU7i!5kUL%_&l&#LbkI zec7`)NhjISeE>!LAyZl@GiVcMQl9)C{q3fOo4?KQB5WK?^6s`oooI@N)o8jP^LKL3hoE+ zf2>c?7s=!J#GA#Bh7D}hhj=I)B!AA^aDSP$wKz9iHAqj~_0J=vviS8#3ET+ThUMYT zu+U#iGfvpVV2rZ+^kxq3EvtV|=*j&3jf|iG5|z7@YE1rCg~eLD;>eYV0^CU4A3-FcXaU4u!CqR>5Hl zd6qua$)>X~Mo4r8?m$#l&>lrw+J|9rK_+EaV|k5i+CJw&@{6QIb9UcoXT-@`LqPX= z@2LgNU;N_jmXq4$R9!QMHq>S?1x%Y5foxeE*GN+gB0nym~A+YzVc9 zU;Eua>iH+B215L3o(BG*_|J$>^?I<$Ih^ZSZyAk`Z(hG^$j>pG>YAN9X-AWrU2TtR zy?oms@-**ya<3-)vVM0v^AHg&4w5HV!?=1k$Qyxe-u6<-NFj9hq`v|6kt#j{|E{9_ z5mekudG@#+N6?+Y0vt8yEfdyhoD&9CN=ba8bfU>rH|CGFbFw$K|t&85e9*)7!M`NgD<&I4y=aaT$oI`wC|^b5mEAEkDqraetCI@ z-+g*2Xo<5lR;PBwMnSn1%pzOnWL-(ZL&Iw(wL0CAAk_YhgLL`<(V!oE+=6=Cq$Q8} zEmZ3n?!2)Zfrt;EIlv{tLhb<7ooMUl(oJEccYX#@?z4vb9Fl(L`x=o-4NV0TQlv)f z_fz9`q{Lo`NhyWhg{gMIl)3%f&fl6e49qG)NS)IJFh~T3otpcK(}T#uIuQPS51t-! z3wF8b-KGC1rEQC79hVisWmDd*0kueu3I~dvL7>}j>@O;qcE^#3$%N4j3VJzuZ$n;s z%ZjphD|29+=ZGDyJL3a?L$ek3D}8+cDS|6VooLE%{DIgSYfX3A?K=ZFltvHJTz~oD zG`L-6cY|6tTYckE3K)(x;F%tbyne&%i3pus>yR1YWX^;>1bc-AB_ESPd00(M2c#!h zQ?E1L?8xmUSjDM5IPe2HM<726F*gMwG8Cpx(*808RW#Hdz0fRYWP<)+7;AL_d=b@d zR>CkiFt3y5YSHER+rM5oUi+zEBt$$EFf_3^V&p5e{{1kZ^1)paM(iYxRPCknIPGuq zMVh#Ym|YQu<8SVpX-77=!cuiq7Q&L(v~EhF{tGM%Au_474&ZX`qAZqOO%j#sI#6crI0s6gy-PogU(m^H|vAak_JK;TY^q>7aM_&(BRmQCRV)If8U`d z(#A2~)7(WLxgH8sWhf&*$6UF%8e1J?M4emU)3>jx+4)9mDI(yRdj8!bzoeR^@}&&W z8{XG7N90j6?hg{g$l=u2#ZJW6C8)4)hT4P<7vM62l55*lO4Xwf+gJql&_Zow2(yrW zWXZ@x%QKs>ISd}n{-$$%X!Jktd{Zh)2hlLlbZgOH?E zBTgBxF*YAQ6uK;4Z)c8hb-)H%|2@s$Bde$U`^#=GHBGz zCI0QztR>93kKu{T-Xq#iY*_%N3aL7i5p0W`x3?zBe7W@e>AZ0m@{ftO<%^T3<3sxZ zH}`TDzmjQywsB6-R0+MQf~477*(IqvA@DkQ4)|zsR|RG4lCU62or*MyO^jX->0X$1T2hUkIC#y*XSfYWY%=xE zjuW;-ifb}QEQVGzFmGhmF`TVaiKE%G)T&KHVj%ohxT-9Bt0&u^O3Ej*luP(^yms7S zOlW>GUo&d)6`7&g(NG7lSN;LQ>-1?J9heLiODulF<0$vH2Ko!`w9$nZ4=$#O|eAS^G53K{9f1SzpXVlAG{i-8;oMhzcstd1R;i$4q{(g5JYjl;B-E>j5?8o_3$B@{1 z9Ghdc!YH9HjFl@-p35w5K-!5-2onQ;j8y_zS@m$uJA?m??<0ZPQkp~gBl^A5TDG?j z>`m11Dl_rq8sJN^*ik~>_F590nK<58GJl8t6r#GxLD3Kdbgo!5<6A>rU08s!-5mi+rT-1Lfs+3qYIZz-) zcm|_FsVog%T{Z9rP?%EyZ;qYAx9mh~XwX8t`)^^#NczBLsoWkv+A@FW)r~QmOz4k0 zqM-`k>IFKf*~FtfJ;Ql0!<3hRd7HzRMp?qd)03tDRo<+@63DwPP$yWrD}@S$~xxJ1zN+vzE@*%OxZUWp`mZKMoZiq^yniF^$sROaAF ztYBOQ5|TB~pOHCO$@^%13XwMcMp>b&PRk%T_JK;tLaJX7o0i>|ywKDkMc*;ZM<*H1 zmVBrLEaRm?0N;gc37I}}%kW6f;#;<{_DAj0I_bHHJ0#=&$2mVEPn#^?q!Q9ckfgX9 zP%3_Ur~@ifD|Mi#To~j{kJSLz*YfnV$c}jA#Ds2TB?CfxduQiO?diuVsJbd6F_5O{ zDVbIEmL2cxqCxdAp_T89V^8_gWXgj6X;(j%%sQVdXDd?&rdbwHK!s?wP{P+3vB=1w zo)2c)9&56^${ZZAUh?YU;Mm5&lAI)zv+MfCz%>VL5WGl><^OgrzsQX45!U>7m4B^U zr;mCfa+_~EI%T@<@@IN{`6B!zT%%-mJ{<6qlSt|Q=U-kmpvrVjv-N5ZKy8YhoSH4$ zZZo+v&13fqqkV06z#%gZXRMnIWcgy^!92-1k!~z2Zm6HOT1^AhO~CP;WQ~^xiB94Ur#J9jM?w@ilch`WKCRsASC>?DCfOaa`ep&u zN&XkzuJDr#I~N-Qe77>Ob?0Qx9avkA#8@Jsw4X~&kr3Jd2+civvp;#?43FNl zS9uG$1$mH#!-K`EWU{f&`wc*dDzcrjB=ktkE^|dimZ$K`6UB50%H80{eo0tsqLmEN zVAhq+mblRz+x520I3^1vI(e)c40TY9{Y!ODmq}-~m+~^{C@~j3`yP`XT}Lv*LrGMR z=FOzdYrIH;P^(>kh7>Ks>3+XGUreeR?9=*R1cn=Kg5t(3cqwX4F0mG998NYSJYNK~ zn!zPCoRaecBNzCtRzy8K-^sZR}uw}W|XmlCUlpf=V}11|M3J|&SfE` z*&G!j*JH{+vfw2?oAdT9(|YaOUYERd`gXohy>oi}$?I4Twz9=K@=OENOvUu+jtfs7rmT}Pfc`gbFw0>?M_G$M0*YhDffOcykB zSUeyro(Z$65FVG3E@<;H@a!vt7qH2B6hVoJ__2H<=3lf?<;0P2Q*ExWQ=C%dZ$FmO z@~j^uP4GIH>?F~Uz0p1|7v5S)rSqIg4&-itkqf`#ZdGNsZ~rk*p$MfSgoo{Mejn_19oQuxL+X}`WXEcb*=12X`_`VjL9XMyel0D{7 zU2&clVO>RzUkHoSrL;#GAnAdNu~H*ZU%~H^n&XFZpJLmpos&nv5$Ir?`ak;-z@v=W z11=VBE>@YanO6!+`;2-t;7omez=@^Rx&iLv8u(W4zd;>=rqZ)O;q}7tY#RowJqfzsqj+eb#%PvYZE* z@vCHaR4TT%LW)K${^f^GA{f6|vdnLIFD6Q@{;SIb{2JW{?nTNM_9~O^jW8ezEo~v- zq$ORU$H?>Gswm;)uhT*wJFL0U5brTnl4;poes2RxUQ*};>2o+swK-xXFGWH7|Yvj5j+X2zTGhw!g@4>Jt#ouOz@UE zZA;qQ2x6`(ZJ{R_=RhB9!5SE2|TG=Nssc!4(zW++6latl&==sNAlf znZp)cO|xFX&E++jiwoWu$E-B!@v_Pc^!dLSr_a3mvSzs0>t+_cDuXP^349L&*oG+_ zJx1Onro!7kZz7MdE4pcFqtjs+?VtDvB}*y<;Wxstw>x%}K7Y(yR5rRB&@;SN1eOy` z+o8s4q6>d&4ocSLT$QtVXjXrSBYQyT*C}5g-k&x{R}g)m0u)?-)POVAN?Pj*F-w;N zAGttpdZni+MLW(hq>_C4CvWRXTQ{B4IQZ};t zfCj7(Xt~%y8XVYU)JZDS?#t7JK=@^t_oIjpOq7f@w z;`p`C26J;3jE#E&7UUdR$$7tB83jcabI@LoQb~`h2GVOxeloh*Uh70KJZOXIt#Lsd zI}m>ETK!y7A{nYF)bd7VjkTqz=nlPo${!xY;d%~37Vem@V5w|a(c-lkrfA7IudAY( zo*8q*XzqbdOG67Z-QdmrO+FgYE+6(~5IRj9&IpNF;%Vo8f@JzD^SxT`%g-Fs`gkTh zutYedybNXt1dEgw01vV(#leHm=fo;8&#vHoz$YtPHo;Uf%p_*V5Z9dyg$JREiCNB5 zA zEO^oEVHdHWj%rt9em85-_mr>9sYRDkP5+LAM=L>>TlOCy!8dviR3$H@IkA%SqrL#4 z8vDx+B?7`b^L4S?8>SCWA6Gx3&(Fw~*VjrS@w?Z_*P354tSs&07D(zM z8aU4Z5@MaWMHDC_iNzTO4t#|f zl=2Iiop^~f*_>Buw0WVxpstXzI*OxmW(1Z436J9twion_%fJg(1_d5q*Yc#3d{nld z-I9UUN0XOkID$A?sM%`HC3X@!Sw`y8w&nA;ak)zInSarJ&Vje8IBPZYs>AHd2f`B= zzgX`{Yd@gzyU-?Nau}u8%*BLSlm}EDH)0J!7l1p4dcINO*vb@s`eqsBqg?7DNEt7> z-|kGbxW~A6t1fU%xyD^5y;|cHmcJ%ip?&$)kYP}u0JYJ{KV(A`DJ{pE3yt4 zM4ilIClq;rW6|wQE#coE#<94s;WMDS2+A^Ie~|u6gfpy#8Q{Vui5|Gf;a5yW;(sb@ zwJ`7nYOpMf6&8Hp5E6euxzALT1kdd?LTJ7IWO2o1ehJ{q>;*00~! z3yo>y5#01Qe-M!v&xyCJZ9(CfyG=xyPtJ`|YShOw){!epHxtNc$4`?y@Urm_H>1`z z^z2KF;odTo(a=dPUlNK}8CKQ*#viT#BTUVyDD4ETA%}MNa(NY9qcCRg2CW;%FzU9b z`Qf}OTbjCfLZN+%u^tu{=G3;{sQ86gE@*LW9yz1n91stI+B7??%F7(KXjah_0%M70w0uw~z4S2K#R-)Ts+r|rV(f=UjY4RAu;`m}7^e3b&LuKoUR{77?`+abD z(a%KcmnY=K_NEL{o^^kw&M~4H--%=mLBL8$yGMPB^4VqzN2Z|$y*ll<(b=jN;Ru9M zmT1ZMGzg!^QcR_#J85JW}m%S{w4tpau3Bh+2cu1 zyLR~C>qvZd-@Jw`!eB+Z!73nlPyb?=J~3Y&1TDbY=@ndKmcoIgmLr?LjVeuJGP>qp zs`eGyyeE0mw<*W*jMK4zfQ(S3AU1)>G>D&MB!ZN&-1BGhLmA~6uRkr)AdrRPXLs1- zb8xym-7@HLbi!xlaHq6#B~DfhD$Cax~r!r@4H&H%%O0YP-No3YXxj;+naW{ zJmtSD9W(Q7GuA6dspe?Pn*J#0wR0Jh7Fj=v_sW1%MOypm+r?<;jdLDqFs({EGc!~! z9N5)K>F)8ez&r)?JrSA#@&a2l^f(pyK$rGuny#z%6zK9)ewBy_?DBrd(?)hZNt%J= zz^^4WD)MkHtAoc~V;BT2i7sg9zOCD6Ez+gvUZTPklb56&U6qU*L(2-}ulpIZ!XS^rYQ83bmQzLzP!)w)4f*^(&}n7_KG z03c8?QdQc;z!FqMf2)MxO_M4in9ZT-L(0j;QeeL})>bzB38xLHt%at5)dlaG7e+s( z>AXiz&-FY7f0c19!qsLZwaC(>iL)VU#OtIAJNmRAO#SSwpM>!E5l>=t6>ezI*ML}s zZGOF;(bK&!1R%=ZOpd@P7(jOLI{NDtx`ENh<`35g$@+)bZq_-uOAoyhN`5}WikFcT zhnc0;p#I2~1wrr913&d&GE}WVc8(Sw>wqUSu4gG0|C(Yn;@*TI;9F*{pW!DvA%#|E z8Cz9z+zhlfA_}_0@7SnCg6xF!+qB3n$ypPypaL;e|{zyvFx*a$Kb>1g5n-WDa`yB;gL<7 z6StQ}cPUw*DSsrE=m*qW(7p)iGRJU+(GMRLN!Nwj_g)Zh?JV$VJ}p03ACgN*oj7J5 zBYojC@=|y}3_cvQoErfwactWc6*g^*giL3!&b)#Q!XhyCVA4^qeSq$t4I)^sKJ1;1 zC4N@1Xd?e*ME_1d`*#l+b`wtCo&gJ(q8M^^E|P=MH4n84Fb*u5ed}b6=0U(;EDbp) z^P`+cR+Zf{k*0uiHnPgHni7>G$q=^^rXT+~H#JT{Q~qC{TlwCzWuQgW-8S4M*NTTEr zaT`Y=a!jhHTVn1OGkuXyR_IUWRF(nnuiNskz$zj!Bs7!M(?6Q0`a}>Y!4N}@9hg@Q zWPxXd#T}1_x1s4b?k*Y`mTD=H)T3V;MdCg1a;MACU;odjaHt{IfJK<$H}$H|D8k}3 zA-`O%5$BH+y@R*kl1ZLwvdS17mdTd)IfZ0;dIg{m7p*hu4bPiL?@a;_>aSnxDn?pr z5|IVfBMZz(Pn_o!Z10Wgm_8SLU6S~ww0m>ET0TG}Di|*Es|LI)lR^JPh%+88%5lX? zCL3k%mf}<#N1R!bUGCpgo}M;Vi@yjb6qH%dLW712_cHCbSK19Cu>eI+erErHh-O-H zG^XT_)Pj|m=zE=gEsZy>Kp6#==aSJ3aFyH%jm-~nl@tkt*#ljYXjmw=k@SR04BgTU zy&ZggKYC^cIr-hxZ$_A|^OyBi>GAd2ThZXS$6yAwshKJEcH~NWWYl$}*RZEF%p!4O z6k|tsWrOX#mFZn4DbHooDZkrb00sQ%{f~wox^)j(PRYv0yB&kX3Fk0)l2z=?#x*m~FXEGfqXoN?@|qa^2Ng$%=Rhy1@K2>B#_6Sf~uG zv?Wpzy38r~U4*S;-jD#v$nbg~)Ds z-V1jS38MSa$3U!PWOv>AG!KB-3!SVD2~@J&Hm$GJ606ezHEt5R!^dP*Sue2R5LlI2 z1-LyCs3tiKBP~1~b7XB;$r2_FqN=cl0N%;V9|aaY?B|!eYOM0-ZbpIf8n<-@TIxp9 z^7c-33NeU<43x4ZFdk1!;pIA|A}N-~J>BmGIIg$RP_gtk#`@VJN5h?>C0I{^b3N~1 zL}T7Y_*AY`dvMB{*^gQSaJ{(MhhL$y<$292A*UFozBZM3~(;sZPVTPX` z;ztmP1_t8Lp6k=iJq^y+;yra(H3?$I`wt!P&D$Rqaw9m~zrI7yN>tnfofCm)94zL< z{8-Whkl46_vzx--yXbF#KUFaL+AsF%slVT0W>T-qm6{TrH%TU1R#Dz#&sIqI^kc9q zw;ri=0GpQBmuLj!F)rno96#NBMH7K1mIV&TBdM=`PwA8(&&;y*v!;cQ2^g}>|7IK& z57obBP%K%COCx4G=d{oLt^#C||MTFtmskAJG=zLftXu-gq5R2!)-dyNzsq;AhpJ*K ztAu{Ph1kAg!;d3$9)mK%N>LoaJ6GW~tMF$LmgWBjvKBQoRUp>PGL|Yg#ahkBU^EbI zCN=B-|3LY1ADW^>m0j6H>nhiv@Dh%uM4VmO^uIyUY7_l5?Qaz;Qx~5a&@|NyX?l; zPWS{aMqby)>DCcpg25VM8%gPd{ z`i70!YNM^ddIOqTtT0OkHEjp@<;h0ZO4uM;keT|rp-APLsivz)9fl6|zTY{|<3`r2 zp2t(8iifGA!(nH(*QDE|&z9Gt;4Rep%U|4mZ@RU#qedH3g)#NR|G8wRR*hT!yYb=O zXDa#S{z1Os6_P4%Hl<$e#142Zt zoR|#2%+LVsMg}7bni>hQ{pP8=FrVA45RMiq8$yvnSL*tL1$I(QfS%M(yfP@iS1AWP z2lIKKPNAM=3+>*#(-?K6gtfuQnxk1THy7?{9n%Sd!kIXmuYZMOhTWt37B?yU#B7r? z=G^ACYZRx!PSFSS6NzhE# z@p9cd3|MUYhbKhOR>}1xDRPICg~677VMF>KM{yOwwG8jd7oE(Rq;LFL?168HD!j6u z)d2J5o;$D6xnA0_@ZFBP_J%DqW3f8XN|uy@{jn%Mm#`VpCJ@E4D1=!QIe1d?Yy(Xc z^!Zww#2ur07i<<=5|fSP_Bw?qoU{lGBg;fMyhdql2A=R4Z6;84N?>%8R+{`C(sL!izbn-3vm$vn0B+f&fsN`3e9f{dyAlRtYQ)7R&;f zo*r*1v&TM6$SXV;|8_Its9kt?6T)TK)NxUS7*1tdO>{+`#NYijV*`DvbsCLSv@;ES zH;(!Dz+Rc`LkCBnZ4O6IIJ}Ij(-iK0oG7sxy3yt99q~GzzL(svlWZs2^>>VrPdQPH zpw8bvR!qC&;aIhf*u`*>;K?rINRW6-(G<<#iDN{W6j1z+D--bGVOxfI!Jd?*GG@HGRC=q%kZm^;YZa#SvWfyxZylM?9sygkg0xe-)JN$i~3j4=>q5^3lW_ zeKCy?#k?>FCGd`ycvAk$(@B1A?dg~tl1$5R1!P?();c;9SYAsr{G;+cQTl-icPs#uf4>R)!KaO&u-5@<9+Qyv2 zgSmcVgp&RhF-Lx9Fr;BoSG%pcxS#E*M)5{$Z{6oiIA)0^`2@ahw9T$?)zep6<8@sN znFvBk8>g@0XERfv;dVO*95Bl7SXK=9|5Ku%R?vlcUbP+!ABR6X`x9tPsM28o9NPb&|y<*Vh|BxTP&W`MwosXwnC$;YCxBRwUUIQMF@s0~s zhMr9cE`1N-j~Lsn*x)W&h%1}OK~Y+-(!IdT4LCYMTgSTKNuLwG#SnV9B^0$o^I-&d zEB_4%Tdej+$XUsazv3nMegSFWg}`zr!-Z`38hLMM_dx=fr$EHXl+Cl~p&_DwluAB{H~tZkx<-hN;&4CCl5*aJQc2qi7WNiE_EbCV{|Mw%gm zU7(B4SKd`!FkvTDi?}!5)_zC(qda#I8p9I+@`^e~n(dK-F%=;)_Ij+JIAnVYBo#AE zNAEvV=szD{AkJY6Lx)#1qa`-2sL7jZM=%W?9RDQ>&TH~rjkqF_X4+h>?2S;6q0mfD z^sL&_!jNx%GMnaAQ=w%3-sXl8aH5+3HF9b5pfq z`C~s?RAg5YSprv)0CvY*>~1o@y6xaU!E9r=hAU!;bt7L&#uJloz7o;bTLQ@hOT*7iQmj=<}S* z8JH^4bM=LI55#zrwlHaIVwK?_g})Rp;Gqjc}(SeJz3?Xs4&({VfvzRl&J?ISrJ82m~9yD z>~4NbSo$qEyF5}p|!AiOZ%uKV{J9q|X2bSTwfkBzp zq@9pkm!7bCcfIRk{sSE0^%U1zxsv*Ssptc7=_tObJsm;QyfBLU=(xs`m9BukN|8_5 zDia)iupL;TlV(JjUiPiS7yqG^P9VU>Z)u3~nGf zJfmNSh;oc(4-Dc>)wXKuuyG=r%n$~OT>B|)nB1$>&&LFm%^LaVf6XBk55vOp;n-8V z>~ICg?cJg8EbAoN-fZZs=`1NYH3}ehhPQ!Ln*2A@%HG&rjQc`)(xNoq7iQoiaZ+Si zGzvHwmCjc<&A1_3Yk-f;*XT~KcR)C3pG75LYWD6m0WWRX51~AhcsY-c zMZP`DQqzpvRmFOpWF~^ljzWxa*@(`&NY$)-{hv)RI(nzPk-Mo451`P@ZA#P|fP&@t z)DqqQR_11mtPm=ESM~X`jTKE3+#*^Gp#Y^+09xTH7FK_C;2m19OdMvPe^Yl;wp5*t!ch-YkD&-ho1 zoI$$7#aIZ&^zJ6!%H*Mli>CcaOPqULQHg^k@gW?ykRae@*v7Pgex5B&-!puyro;E5 zY&Jon-MYCOT?u`(BMS?~j|v=NWq~uFdkSaO%D=@dMP3g^v}IxWy7g)Ic^Y6xu13EJ zQe!HY>%j;7gWQ(FocLV?%oPxptEmq0?EvU$c^&wU+C?xIm$A~h7kXzIycIepNR_u_ zgWyon(Q5ODq@muYEd-&I^w)hdKjn+uAzpj8DyF@x(J~4M9iIpkp0n6rl&Y8Yx*8SSX#4b&t6MtY-+vi9=BG05!BwEc7Z~- zwyE}!zIs(w>9rhNTYsThyfMG|@#yNaw|o)$E^=ru~97`Wc|aHmuv!iaz7SWsgge3Egn&R07)Tuf1jRb-a#<{^6)!Iko7oP}F* z5qbk6nqWmGVs}aGMvZ0X*-MRl*X$|8@IltFJ|Pi=u_WzBTutdTTz@j6Px<> zRukMQ8@8y;1k?ixEt2%P0fzVT^6{HB+G;v)8DLlftHq^IZ5iWC8_#_|>+)Xd>fMlc z;(Cqf=lgW3+Cz`tctK_Z>NE{H>Jp|pMqk|xi@gdByYsc&=n}0Z+(%R2(W`~Lt3#2* zdO)S$L#m*I&Vt&*3g+r9qUoeTgFTe{V@Mw!^`IMhn)SsvQR~5k?4`*B+$kH@C`@oT z^?*W)WPNUc;oVkIw{?*Th9yufNTJ#;w8;{Et#hP)hb|j48~$`KLQ{uLKA1PNdX#k< z(+KCy2%UF{`eT9G$Q8o_{c?l4O<%FsCHO0FZD;3$pxX@V^{hd(@nW=ppxbSrX-xTP zf;x2L;6X(&575D<-fqX{Yio&&E(^7;I6r*q*2vQ=0a1JgYZq|GDH~b@6C7|2D6~lU z+yKKnr(q)l%wK&q;8Lj836t@i+I{)(hYKStSUg|)ZJ|`qi&y<|X*}8{jd!DS15KBh zB^$@01$&gwg+zmiwP3$wtvXkvvkQ}nV$easpaxc=p}#dNmRc{}{P3w;qjt?w3{is9 z47hpG_4^#1EeuBTuswLsYekDWh|x0=UyQqzEP?oci}16k0UxbHl3h z?pe+V!|JPnl*A{(m@!7^EVqp0py&{)@-kH#;Zb?Z(@DN2vu}y6{$!TAk(gyT^Og#B z`wr8ag5jhwiW#8?s6&y>o^3Kmu@@a=7StDkwX+j?01LIg5PA627^7Ep5=@%tiBpZNqnCfvqrQ)xzWwjG|=Qqn)&cF$z9^S{JzWk zygtOc>)O{ulgSEIT!PtXW3x-|6&0188+vC6-}sqN!(1=wP-M3dZT;KB^3g#8)WF)= zE*kxj=p)0_dYh7mPmPhMIW}#g^0gBeSEUQMQ#P~+CM2BtIR}Ln4WAoUop;YhMi^FK z4WuLrW2V5#Q9LPo<;s`*X(l$q#a?lxckao*-sZ`F`1gxXUL*vn|I-_`hu2&{L?`X- z;)?wF-w_kJIuuFtP2CKb;{Y8rKn<*o&lvkFyJPAOG06{~8Y5q`n1QJ19_!f*I$PXn z8(P$60_wLN6k0TVZdi5RErEhF!?60Q#idZKjM*dF-HnZnJ^Kk!-{DockerHostUnlessnotifiedaboutthecontainernetworks,thephysicalnetworkdoesnothavearoutetotheirsubnetsWhohas10.16.20.0/24?Whohas10.1.20.0/24?ContainerscanbeondifferentsubnetsandreacheachotherIpvlanL3ModeEth0192.168.50.10/24ParentinterfaceactsasaRouterAllcontainerscanpingeachotherarouterifwithouttheysharetheparentinterface (sameexampleeth0)Container(s)Eth010.1.20.x/24Container(s)Eth0172.16.20.x/24PhysicalNetwork \ No newline at end of file diff --git a/vendor/github.com/docker/docker/experimental/images/ipvlan_l2_simple.gliffy b/vendor/github.com/docker/docker/experimental/images/ipvlan_l2_simple.gliffy deleted file mode 100644 index 41b0475df..000000000 --- a/vendor/github.com/docker/docker/experimental/images/ipvlan_l2_simple.gliffy +++ /dev/null @@ -1 +0,0 @@ -{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#ffffff","width":323,"height":292,"nodeIndex":211,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":false,"drawingGuidesOn":false,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":16,"y":21.51999694824218},"max":{"x":323,"y":291.5}},"printModel":{"pageSize":"a4","portrait":false,"fitToOnePage":false,"displayPageBreaks":false},"objects":[{"x":241.0,"y":36.0,"rotation":0.0,"id":199,"width":73.00000000000003,"height":40.150000000000006,"uid":"com.gliffy.shape.network.network_v4.business.router","order":41,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.network.network_v4.business.router","strokeWidth":1.0,"strokeColor":"#000000","fillColor":"#3966A0","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":85.0,"y":50.0,"rotation":0.0,"id":150,"width":211.0,"height":31.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":37,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":6.0,"strokeColor":"#999999","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[3.1159999999999997,6.359996948242184],[85.55799999999999,6.359996948242184],[85.55799999999999,62.0],[84.0,62.0]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":22.803646598905374,"y":21.51999694824218,"rotation":0.0,"id":134,"width":64.31235340109463,"height":90.0,"uid":"com.gliffy.shape.cisco.cisco_v1.servers.standard_host","order":43,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.cisco.cisco_v1.servers.standard_host","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#3d85c6","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":87.0,"y":24.199996948242188,"rotation":0.0,"id":187,"width":105.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":39,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

eth0 192.168.1.0/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":147.0,"y":50.0,"rotation":0.0,"id":196,"width":211.0,"height":31.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":40,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":199,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":6.0,"strokeColor":"#999999","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-82.00001598011289,6.075000000000003],[94.0,6.075000000000003]],"lockSegments":{"1":true},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":220.0,"y":79.19999694824219,"rotation":0.0,"id":207,"width":105.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":42,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Network Router

192.168.1.1/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":27.38636363636374,"y":108.14285409109937,"rotation":0.0,"id":129,"width":262.0,"height":124.0,"uid":"com.gliffy.shape.iphone.iphone_ios7.icons_glyphs.glyph_cloud","order":44,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.iphone.iphone_ios7.icons_glyphs.glyph_cloud","strokeWidth":1.0,"strokeColor":"#000000","fillColor":"#929292","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":33.0,"y":157.96785409109907,"rotation":0.0,"id":114,"width":150.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":16,"lockAspectRatio":false,"lockShape":false,"children":[{"x":44.0,"y":2.9951060358893704,"rotation":0.0,"id":95,"width":62.0,"height":36.17618270799329,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":4,"lockAspectRatio":false,"lockShape":false,"children":[{"x":29.139999999999997,"y":3.2300163132136848,"rotation":0.0,"id":96,"width":3.719999999999998,"height":29.7161500815659,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":13,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":99,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":99,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[1.8599999999999994,-1.2920065252854727],[1.8599999999999994,31.0081566068514]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":51.46,"y":3.2300163132136848,"rotation":0.0,"id":97,"width":1.2156862745098034,"height":31.008156606851365,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":10,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-1.4193795664340882,-1.292006525285804],[-1.4193795664340882,31.008156606851536]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":9.919999999999993,"y":1.5073409461663854,"rotation":0.0,"id":98,"width":1.239999999999999,"height":31.008156606851365,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":7,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[2.0393795664339223,0.4306688417619762],[2.0393795664339223,32.73083197389853]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":1.9380097879282103,"rotation":0.0,"id":99,"width":62.0,"height":32.300163132136866,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":2,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#6fa8dc","fillColor":"#3d85c6","gradient":true,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":38.326264274062034,"rotation":0.0,"id":112,"width":150.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":15,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

container1

192.168.1.2/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":124.0,"y":157.96785409109907,"rotation":0.0,"id":115,"width":150.0,"height":58.99999999999999,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":33,"lockAspectRatio":false,"lockShape":false,"children":[{"x":44.0,"y":2.94518760195788,"rotation":0.0,"id":116,"width":62.0,"height":35.573246329526725,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":21,"lockAspectRatio":false,"lockShape":false,"children":[{"x":29.139999999999997,"y":3.1761827079934557,"rotation":0.0,"id":117,"width":3.719999999999998,"height":29.220880913539798,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":30,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":120,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":120,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[1.8600000000000136,-1.2704730831974018],[1.8600000000000136,30.49135399673719]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":51.46,"y":3.1761827079934557,"rotation":0.0,"id":118,"width":1.2156862745098034,"height":30.49135399673717,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":27,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-1.4193795664340882,-1.2704730831977067],[-1.4193795664340882,30.491353996737335]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":9.919999999999993,"y":1.482218597063612,"rotation":0.0,"id":119,"width":1.239999999999999,"height":30.49135399673717,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":24,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[2.0393795664339223,0.42349102773260977],[2.0393795664339223,32.185318107666895]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":1.9057096247960732,"rotation":0.0,"id":120,"width":62.0,"height":31.76182707993458,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":19,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#6fa8dc","fillColor":"#3d85c6","gradient":true,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":36.36247960848299,"rotation":0.0,"id":121,"width":150.0,"height":30.183360522022674,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":32,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

container2

192.168.1.3/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":102.0,"y":130.1999969482422,"rotation":0.0,"id":130,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":34,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

pub_net (eth0)

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":93.0,"y":92.69999694824219,"rotation":0.0,"id":140,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":35,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"


","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":14.0,"y":114.19999694824219,"rotation":0.0,"id":142,"width":78.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":36,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Docker Host

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":71.0,"y":235.5,"rotation":0.0,"id":184,"width":196.0,"height":56.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":38,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

docker network create -d ipvlan \\

    --subnet=192.168.1.0/24 \\

    --gateway=192.168.1.1 \\

    -o parent=eth0 pub_net

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"layers":[{"guid":"9wom3rMkTrb3","order":0,"name":"Layer 0","active":true,"locked":false,"visible":true,"nodeIndex":45}],"shapeStyles":{},"lineStyles":{"global":{"stroke":"#999999","strokeWidth":6,"orthoMode":1}},"textStyles":{"global":{"bold":true,"face":"Arial","size":"12px","color":"#000000"}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.network.network_v4.home","com.gliffy.libraries.network.network_v4.business","com.gliffy.libraries.network.network_v4.rack","com.gliffy.libraries.network.network_v3.home","com.gliffy.libraries.network.network_v3.business","com.gliffy.libraries.network.network_v3.rack"],"lastSerialized":1457584497063,"analyticsProduct":"Confluence"},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file diff --git a/vendor/github.com/docker/docker/experimental/images/ipvlan_l2_simple.png b/vendor/github.com/docker/docker/experimental/images/ipvlan_l2_simple.png deleted file mode 100644 index e489a446ddd255ce9360445f0f895acad31ae214..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20145 zcmcF}Wm_BX)-MEt1b26e7k77e*Wy;ZSn&jRC|X>LyHhNz@S ze8i0cV6p4QB~YT4VUhO25)Fd;Y4*1#ZpvVXQxpL@g=es)ECJoB_ zyXF_<{ZZ+Qd~qMX23VTO0}Ci$EJ^VH|K+bA>SiF`)Q`u6!a+qr=091`>~XaCToMYq z%#PZ)GO53SJ}8O9N}r9aMcoYQQM|NynYTCxUG1+$oqx-fFj)QU^!q?7qhN(_vcsMC~IKT z)i*HpeMViZn9ole+tgKap0V#v_U+Fc?`5d5fT!ue0mC!l_V&Quf=75Qy*au+MC7l- zeCh8?un+IInI*_z|7wZv5M{;bNI>`**5&%Eq!%q41!ycdM7^OH0GJf z#?QYSMbkM*`&<<-gdC^9X2vA8C(zKOe-NE(1VgZ#JZJHk3m!Y(6RbSS8hww*G5t`t zSz6qUA{66ryN~oW1Yk&=qIz5u1wRcy@S@AmY|BSPjXc*BJL9{2X~VRI07TaD;6-ut zO0EEWC8%$xX;5lmLA}upP)&ZthyU*FAaF+2&rpG)o9xT_1osxTGeRG+9>^thtqc?{ zB|`lf3d;R$sPp%6>)a0*^ngtwg*NIi3KA{J4B||mL4-1puMng1JxKL(fVHc34DX*n z$GN^|;Y&9sgHA+;==1OdA9bj879%e!v#`T}*Y}NN%|r=!#L|g;Fs26;L82C|Cajit zRyHwNo;V|V;drzYKZ6;1f-QgFA_$;vTvnDT1l_U}#f@x47rwW^oEo)$P5ogQUi1B(|g0`n?TBSX{|gNu|)%Tz)QCSI{btITmE5X zNJYEcoVGIdrxZV+3Q!)X3`=`{dEO=?rBf>?%E4V>a6Ko+8Q(Ehs-3|UsW2|LwY z+ud(#h@OLgnDwq)Eh9VIH_-+@=cg?)vhTqZfZ&O$WOrJU|rz+4cMZ+(EHf1j|RUrYkwMbbK@;q_D?O0qC2uIm({e-I z8Prm-->~Qq|HP9=?zdH`wQB(L%j2k&?KJRsCxEXwunnL_6PvKP~^+s z<&JOFVhBJhSqz^b7&WD#NSrR&MVv3O8~oHrJbjrXzJwAg*4_ET`TVUoJ^ikQjL{Xe z-=sBrf4LS2v3wi0yuHo6hj_#qMRXfTAOI ze{9uYtqWbo{thk+^c)|}@Po(6y8YSRB+y{)=V7TaS&R&4*F8cy_%1@N^=(e*U(-$? z3?!%Y1~uN?g)IV5b{jGs9sc|2dHu1YQm9%BCMlWo<$WExAKkf?I+RS&iUIm{3O#EK zEu`=PP8HK%HGMLXD;bI+(KWnv)qXt%-ta;fv$DFD+$YNxdAN<|(kIJaV_WS+13kS|OHuZHDuqsV&rZti zUC4?bAHu=keS>z6VY;2p2m&XfvjA*E`;9KVeQxFmagN6l(U{T^Yo%hId!GuUa<5a( zKPX0X@MV%47lw9uad*W|r@m-`{|G#P9W26`izdRAr`AHA*v3j1r5OCgxr`LJ4MT|k zj4m`@Dz8*9m+owX19@VE>8dLS5daXSA%mqb#i2xcg3%&X(;4rn(=4juVbn(M`Ac!4 zW)IBabKS1NDvIV>*k8^Mm%!{8AWDL|=?UO6&BN0l?&sKhk3f!D>DvWlFBf*=xOF)* z2@cX7J^$vdnUS?XYe$2n7AXREUHE*A?#iK>f((Gr7@K)8Sa#|VW-K}qpd=1~C)knR z`5gjXOlRNJ|z{xF1@TC!z z3@>;Tnqyqf8cqhVntIkzbKfy$56 zU2=7{wMW01Y&g5H*3ZL$kUfu!2AeS&)CguhTh@1&?Bh!oabyfQL*4o2(_MPuQ{LV= zJPhY!>4H5oQ8E(!#5FgBH^4ubK>RqsF8^#&HvQwhRnft(#0Mv?9n|xKCgI1SFH602 z5uNdVl_7?Ly6rHeSt40E+YcE$OtSthv8%?maN&iQ9@Jo=T&gN!Tuh)STa6r4xSm(v zZwEiOaD42XeYh*Evi6&DpJfo4A7BL@0T{k;5#&_y&{jrgt$F@PXUQait4|7=NGqWr zZZb|OWde0>UmILF8dqDNsuvVWNPRXVCc0TaU;NbAh~}GnIeY5Pm@JOyWbvbu6|C7u z?lbg9IfZbu@3RA+h8ZhJ9mrw-S1aGe3|9e!it+SxhjfY>U-eqB(J*|H>+GfIU@R@oDe;$GFfr7B9f*qPUV;w0wJ!K2l4 zL+-mP_AThKY}3b--xlc+*k)zhw$WQgEU5uUKjyQ1Kd}8;K^)zRv3)kIxS;OP3b?tx zmQV6<2m^^#S5{VbbdZQOdVj0z=?Rka5sm=h@i_5k-)(<~3m55nG1GA}LcpxobsQ|> za=8E0Q%HQQ|2TNJTadKBAU#bP&g8J1SeO;zrDx*YJ)4dJgkt$qL?98@-V`fywjh{w zBwX&kEHmfuE3U7qa~8&n!Qh%Dw9+K)S+A)6o+yBMp@6rW_$A!C8>W#jL;TU+zPzjq zDNOQFuPizy=Hf_ENojn1{6dMDnK_}xcwu3|>HUU{)_VC3;;j8w%gGO1z?Y{$0l~&_ z#K1HFOsEf1jJpA7`&imyiA@azrS|;gHabV5SV#S}5guvgs~@}DeY>p~I%QtZvP@~z zi)m?8s8Ptx&5e*evkY{V;IT4Y0BDvKB3O|dP>Na#r>>iw`EKA9f-_l0%=^;e(eRZ) zyg?Ci*ApjlmrH&U^!c&w?r6>iQBg?awNMRPA-k6>6!2H^gFr}v6~yYXSp(yqS&SKLpp4OR~pXGlE_ zU`GQP#!S18EqK(-@A5PADxELAUL}%+Ly0!))v7)6QHks2X5SMl8<)Bszh0%V2Z z;BC0huqcb&C-Py48><`jO2tEQn5Ua}^p!TfrkKnOs_;ngt!<5jejKx-+QQapMFJ&1 zbNSZ2gRsD?gvy>Ql>J8@#)FoJed*f4y>@Q!s?b`DvIz*}Dkqsuv^8*I@9ZB2T= zAb$NWBEB-#D-oLX-%JMi{+Ddbu9&1GbyJlxx1 z$YD4LfWX=M*$k>D`@s>q};wwm3lwVnpv|ublV+h!=f&V0w?V~cLakqc_$8RwGp;IL=-RF=K z!NAqiqcbuLEf^&a{i{2vkeOq*Tsd*rP{OB)7@odm@@}%w+9)9I;;hmAplO7ENj{QW z;6DvW0!WT7QknJoaG~6=x;TPafUk#sm3y(?mwQpmWd+_C{^5nDJy*yzUjU%>2h)(~ z*Kh1S4EZoM90XwM3vL0|ou>rmGG?ET zgX|!bKwsE4S&$YCY^UATu&W*qP#s6+)a0KT9yMSfnmV}r-lwEFoDCP!Z$M-IYo~=U z8fGZ+!k>F{4*iN;KK`^LfH#Yw>cd~Zy$f7X`qwhvij1sXj7}3@wyyA|S`|&7K`b(& zxAVXZb;x}yc&3k7FG;=SFKn+b;GX#iHlR!Mb<(d(w-ltOf#99%8z26EXvGBb8t~te zygyMBv7J)+z54NBrDqA_kBxI6*606e^AGNCRoDNjuX_hk9FXNMe?+Fo!ue-Ph)X2E zh!^W$FZWnU@53-4&O08qkbfO{`_TCI@d20869L$?f+|MATFsrI{`cXjhzaymVS8D> zr9WQze(CSI$CrOrIYph}=KjS0&F}hc)Wd&F|4b;%_`M>l6DPhEn6E|+L zN@t|Jz;X@%ErOVseoV8I`e*Dn*5Q!p8 zJ}36X%CP>2Xpcsc(?w4UtS4ze{6Lp&_jA$X=p*BYb6AMOQU|(lEMwJj5W}%TiQWHT z)w6&M6iN6=UEIVDJhoVNQr4`|*Ono`Q|R9bo+#k=cDuuv<;9zyrvI#+tR3E0BVWvH z%dT_lGJg}S_qDA=@k76|Vxh1AlPrJ6k}s)%M!ohCM)Xxh$@ekabu{OR)!KRk!?|jt z8aRxF$41X5TPih=n1_GaY=6yYtgV{Uf&V+{4P*ZI+TU$9oO4#;nUeP3?Sxtmf3{{@ z&>^7e$7gI)CsI1ZXAGjWKuKk!@!D4h^kH{|9$q&HBt8hm4n3u<4s?ohe_=H6bc_aB zevAb4dM@=pylfrh(sNV)BeXtThE|Z)=32VDF7_BMbkHy=`fqU{W6ZM8`*BNW4!i_u zEk(LhK5d=t_F`;eH!$EVUjqLG4Cvm>)cKRw8CBuM!RG6)k>ks|p=<(zC;xdvu^_DW zFL{cSf!ffrn0taGV9##G73eaHR%qiSS!=UeO#fv0am}Et7aB{;bJ6UrA(8LLd(&{9 zK)aP7WLT`L#vLA7F>>d8D^XAW4`{)^YEOA+A;(%7$$dS zZQJwMI!iaVB6Xy>zC)JB<6`?HsA2Y~38QJ)3&WmTE#+anjCS2E;_+ImC^n_=1)h4ZpPV`CxkusY!ON})B=qUH=k+r!BXxp}C> zrkyKz1oukDrpyGd6%NBCxAI18pR-9}K5?$_P!6q`wGhf%0;7$cS2eK&6d-4e!Eu-A zk>n(XBmw7KLK$m~@|0Z5EVN^Hzv0Jhdcl2WQZ#HAuhuF)t(RQgpL}N_&+fb^^ceT??2-7<1H*5jSQ~#&KD4C5{$G= zOvfmmYmL*=Y>G$@dW&XRe%X(Tr?V(4`Qg12wS$S+vr-bXx7c*%JW?U`Jy=W)9*;w{7$2 zT;rd3&aqgp?X-P$=Hu2h=prcY9F27Z$kbDFP6{8=3Xgw6ZPwDYv?Wdp|3$FmOU|hc z7KdHdy7#w0^v-MFpaCDpf-4#S>Aq*ki#VP0-GQ74fxD-O6(_kQ?&m;UXrn(o zCUE&Xn;CJ*ik(a@iUuW8UHwf83FWmFLGDS{;@0r8HB$82C8)HuIFb3Hp*5;5Ik96T10b` zb2&BzJo;l%NOnCeh|qw5RW-jZLfMOLE5n~P)zv2@(LMaF94+WNVeJ-69Cu$Ev{;fh zsYjfCnowV@Ob`*1GM33*IJSTbjW6Pf04`SaNSqrmuIG4Qj%znm3R{))PhSWRQ_ZF4 zvll{b)YoSQg+jscrQn^()>581-UU_{sp&XlK+s=l*}3^(=7nqC6B}u)tmng`;*<+n z_-N~_&oYlR!J0pt>G7gloP0Z;;p4($=a=hAQkK7dh_zJ;EYX;jGTn#dOV`^;*Ad|o zlG4L_umIG2wCu;izsB%VF~;yLXM=qEBV%Pz`S z=g59bi!L;7w<5z}mclTkS%e4q@14v}eCr4WJK+i0akU^DT{@0)XP9(IxN<3T>7UNm zCav!keM_a&3b_KN>5;cu*@}Q*VCCpemqNjby1Ke0B_(~h`v(UCK`)(Bg#qv+rBIh! zmFEqphtk2#bDo~Y`r}zVRnNlpSdCIME|f!hm<~-+Jk@a}H#-|u%k1uSjWAY_wop9c zgbn}*FWp6kZ8kJC{O)m}`4!N>k`Nas@b)IX#`?{(7QI+rs~!@pry&1wNq15zuVllrgDT(P*7rGViL$jB*pruuz<_K z0PmisOiXnin)?MkQ=)JVKE8+zao#MM@pRgQ=es|zrKP7O&F*`utB)7M6bZ4hvGMU1 z(FOV}oI|8PyxwjBwPL@nqLr-N_2{~YF1F?To;5-*FMPZ^Q&Uz(MMceT_7<}(aCf^u zH+Plz<$29W`s20$=60K<*0H*2@)2gg)wILwWP3E(@Amj0(5)|a>tbtoRtqMI^oMRK zOgT;H#Zwpx0Xn(xV%JTR_u218+v(rk0V{8l%V*Vec%M+FG{cQB(|!JOOuvYTUU9eM%@NtStWi59a9L*_U#y(wTk= zVq(S8xvs7*LTCA;>xpSHQqoYj0k$`+Vaj#P4^BtE&{R(yp8e^eK*LA|nhn3*wK}hT zx6Y)q!Q@>;rx5k$=i-8s1*5O`aVaxwelRq(vjxou)@8&f3Us}LQ%+q?Hs^iGs4$aa zVB>L$+tF$m%J#zgFhvn?t>HZfU}U$iJrYbq&T)~}j~&>${OcbSB<4#r`52X|B>j%R znD-k@g32sVE93hq_#;OIMGZd{5$Q@5O>&HQ zXQFmLg(XiaKLu8j&pb1pW^Y^>oPnX>7>XNYI3T02dH0|NM?Sd-7WgsOxfo|BUP*a^ zBjOuV5ALp`!Ny5+`21R^*U7Ty@gfJe@JdUoAr#w};~Whx`IIiy8a>vR^vCOx(Bq$y z8m{=gS_9L$yY!RRCs9T*CoOt|PAw_iIks}Q+})fbPp%f`ZgY>^pZH7ng!fK- zx=Ycjz*gKXS8iBjCOwU*c#>3bDk1qFgH@_;KP9EZ35O;9(Pj%JXVL?GA(r9tVM0;R za5aZTmlt$vV!%hIB#j$3``A&QGfgwAPj;bS90*qxaa$h6{_rDg(4R>)v+QheLY_E+Ka_ z-6snacjq5DjabrSK6mQE+iU+BGsdcuSEa>H!iGIf&| zVpmg-+ohv(!SUjtG4T-JPa>kb;aXDTE?=FK*M56aZV48ALB@%Uex+TWH0*Niu~4oW zE9M!ll(ArCUrzjT4aU+Ke@$hKOVS9xSyollOVI&!)3Kp}@#rpo+={8+wHGCPvT7{f ziWU+YzG;?Z(hFv^GF$VL`>1wgMP}+kl^z$5IwQ9gd6lq4ElVh!3!=YW?uqWIR1P-e( zb)gatU4<;f>yivtJ8oxX$nXPGIl-Fnt)@fk_Qh*&>x?BCZmc6*e&L zvn(^Zw1BqSet$}g zt*LS4?z@3gcXqX;1IOalflV2z{VA@zV0q$huVbnVb3w-5V-+>SX7 zoSflMeMmetKwEl!)5L+0Uw9fFH*gq}`JeJlSUgB{;#lZV8^|0&-ME)EW5O55YC`yU zrT54aHU)3xU|Sx-BO>tpAk~+R|ZI!X-W= z^ms^J!H)EUq!h%=GYApE@S_IU>r7JN_&V#k?>iffLNkL3Qld5wx)zHgw}(@Hbm6M* zDt_}n**q&ANsPL^mDbEmOCf^9>OfZTN#QJkhD2pcVHQT{6y&#iQJ)~87{ozoMaFAV zDE$e*T#Vpt^WCi6TpJLG0->Nb(My1MopnZt3l@|4`X&sK`dK8OEm+Cp#2Uah`AMW- z{ltLZAOZo=dE5A!7b)fBj3N>(JhYbHH-_xEj zN6TjP7-^jmqS7?CGg%HVtNL^4P#VCnlWzn-^Lk=l$A6z=4j^45p4T~3+I`9+`Lv6&q~9~b_$*mQ(C}9|#gX4wiJwgPo*+dTayt5UI(TBJ$+Cs~|9X15|%tnViju(nQj?B<662bBTB=}y08IzTJz>OZ{ zC2({rJG8g2!VH6@1lRRL{kJaJyEa|%z5}q}ps~2gz`_rCF&+8P`=vpnj02dRf{-f* zAWVPv@u#MWFrGI$auVGqhsaj*Afsk&;mFCk6Nfp7bhmxgU7k?f&5-h(shpAJRBUPF z!n{VBk#T)rNc%mQ(xBrD7wNRNJNos{Prguh@{Q4h_1+$J<#t_hlkH{WBK+BnqYm&F ztEmeGwHO?Y~_7q$H%TR(T>v#Z!!=cDEr~*dAhej`#KPXbG+U7ce)1F0Wpk% z#MJL%Q--q<1%?f5iW6es)zSf}Wc1!wrul=8Lt7kgc+y$wF+9F*%lM?_pYL=&$l<@(Jjj(eKT3F9X?J*6ewX-py#=Jj=R zRoB3|4!1=*$7g3!bfmToCHH8EU|zR)vuYp-O^6A?sSp9)7cDfN(vaXFh(TAr=K>pG z{un#VO8zO%8-Y%j)7#Pg!%UYhIL=%3F)QhJ(Cw1#wz1)+86ED&F7?L0*Fa)iBbY#Q z0=mBEg7f!CVF*dp#GQ&%1IA*lR-(}sfmkjlC<2sCoiK8hmNQ|x;8Ee;{vbmNR!LF()|Q{2H#_Z2_Yr%IC!-mQeT5^&)h1kVxk$D14MjjG%5 zD|JkP)&V1EJ|Mu^csd)~N*cUel8v1quPe6$HF_Lg*%Sbm4(!10x@%zbM>?LKuxOPG za)`l>#Paa$?h;7oZOWg&(fO>i2tUhm)o;R&{!sb07Hc?m$@ikH|kfCWHU*tE$) z(Z1gw@{OZ>Ru@9Zu?3nHT*uP7qkbm|#ULDl)YJh&Q3;b>){z&-;?C6d^kMJm(ON?x zFB=^7+wl;15wcx2{hf36edl#1i#3G!WKuX}-{n&T*uGCz9@o%;WD+yrgmFGxHO$@O z+}}Z++mB!OP2kERCjPqZ>BABZxB;jrr<26pWzK7ZUR$fJ52_FOUhN&+QqGGrz)U|m z?AVyaV=+Ts$=HLWM0Zxh(JX<@Rf3-nGFnT6UZy4vrF@be8V=Q8GQ4dPbwp7Lkvth> zJm)5+G>giI&LJ^k^;6HsYFbHo^lYEcf2dV6(jGTbMyp3?YPafBW#b#Q!nW9*7Msi1 zd&Mt9L74E0uLO`yL8xZkwvhWSsulJVhA#Jm(^(Kzvgz@t=*8vzTrFvk^B+=$03WZj zRV^d>MBBTm2c}5s`2yU9Xh(=4T7frJ6VfLy$Ci+BtQdTU3 zd5l&taN}ZRG2w%1x92AITl1^?!BSp|fRA%u_!5E+EB|Lp%ni+E!0%0xi;}t+RGiD7 zzM`~SCP}>2?eKYF%NCiZ#2`R}{&q)wSIp{Asy>C$kZO}yMLs^^;#GzKbS7(k36!uf06Z#|e zx*tAU%1811d|yg?vlD08PR~m&Vb{?O`WG9`)JFNb>-`xHoJ$#1dh#AmT5pVvS0`e8 z>ITWWXd_kNEvsRCPku)X1vCz>><^yk41wTBFa|~A9uTMi zGU*kw3ArXIqqp_#5x){d+Yk1qFh0@VSj$}sC+k}c&tCnz(%Zyl+>H!4t&;l-v^QbC zuFL~^61eSn)YEj;n4T$AMMx<)t19B@yDtn=DE z%d$cD$+cFO%Ok5&N3t2i|DZg6WO(;4Z1R8zUarsw+Gl|DCZ^F!6Ku917=nRUrDaQC;((|5bk3#EuDg(C8dM8zi#N?!^DD*J zl8^t#L-=KQk)_=!qeF097**xENI4nB-Hrk&-+2EcV;|mD$>718qhD&d!sVi^%Z;`e zG->sKZb)9jCZ&4z41z82_sbDph9hBScaTc3ZkzSzw6`LH{Bs@7xCLDQO%m)8o1RsJ zb5OG+`3JFuX&5Ys8_5YA#4=lqhulntMDjTMpJWudYSN1Q&zLa5VGdCzO(VnNW zSaxrcLSi)I@azIDV_5_V5eU<Vxka##r?>5(^|}#>ROKt{QnCU z#DwD6gpTc4zz+kj!7D{9vADZx**ku@&1Dh^vau4`aBsh2fM1-u+iJnet#27HXt0=yjrZf_2bdD{3u0wb1 ztk`VS+>C=nKm@mGQN$~|q%BT9IpW2_ma-laOSD1cW5eAtMxF~NX`&b=y?39O5!V)yk*YUvpXP;-ot zp3XYt^|@o@^!JC(;w8$X7uU!_Z=qk~1gPZ_p6SY63< z-Z5cBjpCHm^%bGrd+%^>m%+Ey)TNbp+o(t3zs8x?f#xPncu37YNd~SIgFY{F$8W22 zn^@u9pNUw1c~;Dzdg*pQQ$76{{X5R@-U$9#HuGkriW#`A~*vshU#7Z zbX?V($VC4>nR04uLJ&LfcFwx^-=S1yC`I^&Pp_{2#NRj@w>_V9;u9fSNUga6heP+mrf=TB-R7JO=w;_ zzhdVV@Tl{l`|E@v3Cb6ExgFu)!Jyi|OIFapuhNF#6S5o(-b!p*-wyr3Tyio({~$l} zCz;NR(U(s$EppiT?MsvYrl-}?CGz-ZDaMC3b5zLNM5r=nx8v2iA;wK^*>I+KRKe() zWhSc+azN zyPPrUXx~AJsk34(T885e&2hgYseccc`*+-?2Fs#S0gLlUqdpWCf|boccW!7GQ1_U z1hr32NThsRGG|^}I9g3ZV`!FqLnZ&=MGDWXc*bqPGU>~RG@&tG{`9m5j5X}-$;xnR zmnNj+^|Q9sFA?5$3zKMy`n*BVzZ5X97##Ra_#bP$Y3}qPuP6F=Sq?)Vt-(CIC#KN5 z(x3Za=uloqyq%ZFXC%?{ssH{aK~3Y@`6R#R zc2?ovyuPvGP5Yu|rRO4gj#eo#R1@Hs^j3a%b`{^LD8YSpL5a1YQWfnB1zrI5^1aRgrX1`-0#0 z@?^eE6Xy1xNP27H6A|AoYiVf-R{@9*dAE)G7C(U(6IfqN9@gP6?&3Tx)8$M{_t#kc z_+1c1>W}{0E_+58F~{^6s>XFT*GEU1VgdYWvmGYU{#7ak&gr7u8~kCQpQaqsE#~pGnDU-zx%p2coe&^WxpC^{J8yg>iUcB z%7KQjsT?Bqdlr`&9xqW?QAb=F-~Fo>p?tUcAn#FZ%zHfHa75l%zM}?u=B`eQLBl``W8T#~K}l2*i);+X6tjk1od`E<Y=KV3#P-k7eqGT4vqwhBlo65 ztTaME%Y#Jh8FkdQJSCx#Hr{%JIXeBPR7JPYBK2Jl#-%6PY5G~ph}q1Wt?czkwS`X{ zyc6%}J&qC-5yAmc{s#k1o`37J4Xe|z&0j{^Wbsn}T(zBQ-+Ay@YOPaH42kKAZQ&~o zB;#$xe&4N1i)V@I25-gNut0?(nZyyoHsN*cK3%6vsLeQdDv^v`n3=ihh{qwe2X-y+ z|FzN;nV|12mLS?6gb7Nm;H%};AHZnUJYw6~Ak#~YsV!^wU)p9i(c;2-41MTa>HF@U zb|^cRS!3_pl~O{)sndA!Gs>b5d+xKweeuF;Mp*FzY9WX{^~bLnFzN&Eyo??MJ1CIW z)+_Lb4_dgOBTwXzsqGPs-Rn1hlBQSq#x(L?H}XiEh<^&NuH^7bVU_2$c%Lf=rdmp3Ika3ZNCpvIcWJ>I;p2pp4KJ*Y$bb5iMrlIp-YpUQ-XPY< zVsD;u#DWo`$DmhnSi+;|o5sRgY-d$gVu&8I6~imjCdd2~-T-1k59YaGA&iaHIi)8SWJp6&U?3zxQ1yobk<|N-nQ1@dcLG>1g#7Lk$$dV7a4riS zs>4Lzu_K-6tmmAPPXBEKlk0x^yd4W-isCyB$!GCO@vaYg+0aDT@fI)NvHW!XA7(0O zL!G1qYjm@LGk1*sHw$`UO3h00EEth@TUG(p5`PLNevikg7>4$TVq+^&&`#BYx^9O}}Dq{44aJB916HfW>L&MNk!s)l$m9J4V|-Yjd2Usct1c*rDSyF z8J#b$#-xF7lKcFs$@;E6d{7&ZWkLp|c*1^iFZew;q;1E8r39VGtvpq1!O;q59g-EM_5M5wJ&jy95n3e11Bjc+k%xM~pQm4C;D9XpYL z^zkQhvUO1=+S^a~@*MMXU(6^8QQ_}bWszEHHs2mlU?DB$hnTbZNvl_Y^{5tmf_kW7 z7>PD>P|{RpgiOT=f`4xi$L>O{N~$sp?L&)Phg>H%Xj+-b>4(QIgl*oh9FvxZmlx=I z?Uki9PNg&Gs%X*JS7fAzIUEVc6U@EnG7n{XI+SSSojGM>U>dA9yO$6a4*Qq)&8XB> z$9LT%ZlUkovhbG!Uf2Z$$|El>$JtN>f#bCMWUTop5^VCCKN_#;98u-Qzf(q>r4UR1 z)mHJyRTTa0HPtjfHZt6Qf|2~O>#xC)uqyq*lkW7O&$F*$B8HKnQsSnoiO(MJPDNmW zXXV$3TkYN3qkZ^lu&f#%#gN|Is@cV|tbrAx*TBWamFItnJT*?UKUf#?q0kh{_H=*W zMvb5p%Y}uYRt_-5e|rc5DAlW+XY=FgYW5nV z>+tU`KO&)l9xAHYuw(I(rp4zVZ}y6}XE1c$hJEF$M<2&Q_O+Oso6}t`2_5js+?WD; z2r)vtP-X%_iA*!^>!RCJD-O_vypBKbr0Nk$?P00TaXSz~|=(@*#;%gqky z)Kv8hX8FEZk=v#vYx1k_F;t1kd@(keVNT3UEMf2P#U zF6jI`E?gig`BmUU)wh~r5DN}_3Up*M3WuI>+1#B_7woHJL1}Jnk*es@^USNzTNT6h z=N*c+xTK_H1voS`R2vo<8Mz#Qjg74dq@_*6QQmr8>aZ{|@;n*4lisAb2Xuq!(0CZ_ z8L6>kG~}feh>PX5aj|@XUnFyL^RNvxjD?G7i1(r%X=}EP+FUn+7js!$&YIhfY64CL z+x_xRsL06Jpg37^hzPr8pZ)Bn0j;c*=7V>`l&+-kJR5&>hr>I(3VUj_csveGTCSez z+>Hf?&@i54Kzz=u6QP4Ri(O_@9zL!|>6zhQ!8OaJDk%W&G^rh0qe!RwFTGZb6|Z){|6HO0lno z_-RWgnH#>kQU5)Ji7Uw7c6qY3>+@5cQRFwJ2K0Dw!cyeL>YX(Nr5|aggseJoPnQuW zDDtcLf^<)D=Pg+$MNK0Xi^&eIAH{5QF@yBZM-9N{0YuD#P3x*TOs;~3nh6m6$*cK& z&9K`5=9>)tP3wb6L&t9E<%yNzpm3W|7i+tg0*{Z^^801*SFx1uj}8YFwj1h(xR|yq zON-+tRS6c7#x|2wb)VLnsd>Q@*h%W$Bn^|rEM_dJI@MY?Rurq&YY3?@QR>cztxq`qR!X0xEi4w z1ZH~?=0G?)ieKqxuZV*f+I}y}$6xV0Je30Pr)gnefX97=q&%OuV%=mp1MKOt=g&RO z2u>v>)?;mT%BC)(P;@fXhB)GgTsF(7&G@ieJ^uJETKAkNks!L=(bSMeNNPk>kb7-q zeae=F{aU2IYSGMu2pM6I_Z&kq&C!k?3|$J<*npK@v>=4TXEw4 zKNc2K^j-Zy!zaxrc~Aw{e9_h3<#nD-;w&7&qRXGLZTf3mxkdLSoNw1N`tL1@3c8#oY zg3t3_PY>%}g;8+#FC)t02H^-fe#REeOti3|FnBq;+rDZ{R?qhT1-F_jwfOlv2xTZ+-Q5bkc}5Rj=YJ(kfT^WMiLmwaxlXw1X~SQaIquj6l%# z$*_!JtuSpLwk-+y{UxD^G+S|wX#FH@m=|OA?iNC_?F#$Skc56=*8ShUUFGT6h_%h3 zDuW+X(^+hcD`-^2oBB zED1w>$or-H8^9bPN(hqe@J4%M4Nws{27yY|*jxlrE)++tg3=2+JbzZ2Ht-15TzK2( zEq@uGva_@>V@*r=f#R=^#tFA#S;+~JCLezy#kdhPvTm=@ZAard>^n4z6qqcAIr~g_ z#zlSVwb9|mvC)lKK8gH<45w_q2$fRdOU>ZG%?fwY1k)=DIMr@iid2LJV%i*cvHJxC zeK-iiNwsjoCc9#5IWhHip{oDWoEzKd$WoG{m^-&B@+J*vHuEXhEED z?|T86vw&w*or*ZAt83}swy@B_|5L@4heN@2@iB+lyphifqZgWQiDiWG7T8 z`#xoC*(Qx8WNT!X$Yh%g4GmdJV;}n(2H8S=qxX;R`|h9TxxahQIrp63xzBT+=WO=Q zvv&xkTVy$y2nDO7>hr(8kj?NYZD5}*E(}&iqqr>BZQ{l-<4a|ZLzRzN`e|QDzCgw6 zfaMiSn!lqWoAY!Rog+XkrjUS?%ah~rWqZN{^AZWtEs-h$=E$*ep^NvYb}u!eHgLjl z{IRL(gGx$XK1gG!i_vv3rw?jw(0%yz+=9LHr{&*^N*uX82v}xIFilM3EqE#Ex_W4P z42NiqPMkynkB`8mg*LM~Cd9L8X8-v#;clUNVMJsUFLrmG$>g@t-Q(RLtt>j0 zz!E`aE|&d;%2fEwG`Y7S27mk{%Ej!}8I$ADwDz)&CvepPARixJ0j*klw1HqLiaLz* zu$|mTqo7W7AJ})o+B`9L53V0O$*IzmZ68%Dbp~8kk>pQmK-R>Fo7=$|wW=)mcnNEX z>TF#uy8Y$~Vt(ohZd9CJ)b6o**~|?SuF4B4ul}C80!~_3Ujr2*?{(!fjSjobZm&5~ zJC1vPed|ZaULhXuN^`*yK0CYn=B#1w6>oKqS+kdSOOWb9dlLjuw&-)R@h#9y)D{gU zW0NLSpF6K|)Xljy0ay}!EaWCFnNqC{*3O+N1Jeq-gekxBj6F!KmdH&0^>9H?hFgTG z!;ODkzV#q=_^Q11$Kr{;nJ>lfyp7DnmQWJ=N#oqo2t;QslVI5Ji2?o}na>QCp@T#V zE69-}5-}tT9hPod_#wgw& zDk*mX;;kBl4Sl)0bO;`w!1Fxbnt752v~PYN%)Z7$>I2P~==T<39(;w5N9(v3WIkmW zd59mlO}#Lz&mZF5o_1Saa?i;A;~6E|(~rvlZV)Bw-t^v_H)E4eu@!t>dDZS+`FE+t z_OhJ-jR9Z>_-<A32giG6D81%G&( zRCAgWi$9i+g-%x_`00^VV7b7zsW-YV`Mf#*1REgaT+!4Ryu^By*bsYkwdcq|pf!iV z7am3P(0ku(1#X-A4OHIQ%8M^b*rV=_67D2WU1vD4y8B3Z;o;8#LIj7kG+5-x&K+O3 zH8!NdfWP}KlT;&Xo@HjyAn=hiLrmu_sm$A_6N5@p#^a@7n11aWHs$hT3#-@?FCB(x zj8Fn3swk#Zk7YotnXl<$P~Is{!cRoT1jX-4l}(eC$BWIS?URCyWfF|LZ0+a#fAJ;i6MTs z2Q&}r{8_BXkVcz<19BRgENIV zybHBb4)gL)Qb>;N-i`i#D{k_u!9|eNiNu5H{mf|@1K-jqn0m z_1xEkjfz@j{&L|h$U?(v-m&(p9$rsHu892_Yc2@g($tEoe`6EoQ80uiFcnrRsHFuy z`1ekO+)nk8FdibDWB0x45%^w@{$!WtkT?5q2BTnh$-mH!+%}X~bkijH$PS0M#oC{z z==v~Ms~TwhA(`apZZqTa^2DIJDLIAx$V$KB_v~)yQX5);1Eyok`VkvmFiBqhFRpy% zQ+4Z)?GGtpYFvk_8>Ug;x0HbJex+umjl!_4SRf0HzQDKBpa9(RJ*FuoYoE3(inCc# z+%Knz9vYVG|FBj$8gf7a-ZB?oA0gaoJD9=T1sXeV`z^%Z8i9Q9pKNqgU9p`Ja$QY+ z2kj`#6k|MRtzno5!Xe0|Y8Wd}EsBX|!aA1; zo+O^W9QW8a#8Il?W+-QS8wfADdFkCioB-boKcPGHGDjrlkY(!|=G#L47oLntB&ad8 zdJfh%-H!`F)_%Rya`|T9Acr2w}sk15+(1H z=E^P#LrFjL-*YYN|3Fhy>)7EA|UOxZ=LwLZUJ;8NyHp6N@5M+40)g1xpq)1b#0CaR41Yb znbX*_ismgYzu4FFOfY%r63M%p>N!iTh`6uuiW@4^gZJk#F1v$8X!JDx;5x(B1aw^B ziv!@%#~}@6r?BJH8Am7P9M|}3rsl54YzxNO@cn5>3Ln`d!;SwRHE21Tk^1x~Pgs*EnrW>_iT99xEcEPiiYM8oqJ9GBrt| zbUs@Lx-}L7tKmRYcontainer1192.168.1.2/24container2192.168.1.3/24pub_net (eth0)DockerHostdockernetworkcreate -dipvlan \--subnet=192.168.1.0/24 \--gateway=192.168.1.1 \-oparent=eth0pub_neteth0192.168.1.0/24NetworkRouter192.168.1.1/24 \ No newline at end of file diff --git a/vendor/github.com/docker/docker/experimental/images/macvlan-bridge-ipvlan-l2.gliffy b/vendor/github.com/docker/docker/experimental/images/macvlan-bridge-ipvlan-l2.gliffy deleted file mode 100644 index eceec778b..000000000 --- a/vendor/github.com/docker/docker/experimental/images/macvlan-bridge-ipvlan-l2.gliffy +++ /dev/null @@ -1 +0,0 @@ -{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":541,"height":352,"nodeIndex":290,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":false,"drawingGuidesOn":false,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":{"uid":"com.gliffy.theme.beach_day","name":"Beach Day","shape":{"primary":{"strokeWidth":2,"strokeColor":"#00A4DA","fillColor":"#AEE4F4","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#004257"}},"secondary":{"strokeWidth":2,"strokeColor":"#CDB25E","fillColor":"#EACF81","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#332D1A"}},"tertiary":{"strokeWidth":2,"strokeColor":"#FFBE00","fillColor":"#FFF1CB","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#000000"}},"highlight":{"strokeWidth":2,"strokeColor":"#00A4DA","fillColor":"#00A4DA","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#ffffff"}}},"line":{"strokeWidth":2,"strokeColor":"#00A4DA","fillColor":"none","arrowType":2,"interpolationType":"quadratic","cornerRadius":0,"text":{"color":"#002248"}},"text":{"color":"#002248"},"stage":{"color":"#FFFFFF"}},"viewportType":"default","fitBB":{"min":{"x":2,"y":6.5},"max":{"x":541,"y":334.5}},"printModel":{"pageSize":"a4","portrait":false,"fitToOnePage":false,"displayPageBreaks":false},"objects":[{"x":2.0,"y":6.5,"rotation":0.0,"id":288,"width":541.0,"height":22.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":31,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Macvlan Bridge Mode & Ipvlan L2 Mode

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":8.0,"y":177.0,"rotation":0.0,"id":234,"width":252.0,"height":129.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":0,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#434343","fillColor":"#c5e4fc","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":0.93,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":16.0,"y":240.0,"rotation":0.0,"id":225,"width":111.0,"height":57.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":1,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.73,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.2199999999999993,"y":0.0,"rotation":0.0,"id":235,"width":106.56,"height":45.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Container #1

eth0

172.16.1.10/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":138.0,"y":240.0,"rotation":0.0,"id":237,"width":111.0,"height":57.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":4,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.73,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.2199999999999993,"y":0.0,"rotation":0.0,"id":238,"width":106.56,"height":44.0,"uid":null,"order":6,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Container #2

eth0 172.16.1.11/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":40.0,"y":-26.067047119140625,"rotation":0.0,"id":258,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":7,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":237,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":241,"py":1.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[153.5,266.0670471191406],[117.36753236814712,224.06704711914062]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":50.0,"y":-16.067047119140625,"rotation":0.0,"id":259,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":8,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":225,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":241,"py":0.9999999999999996,"px":0.29289321881345254}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[21.5,256.0670471191406],[62.632467631852876,214.0670471191406]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":60.0,"y":-6.067047119140625,"rotation":0.0,"id":260,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":9,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":241,"py":0.5,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":246,"py":0.5,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[75.0,180.06704711914062],[215.32345076546227,90.06897143333742]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":3.0,"y":184.5,"rotation":0.0,"id":261,"width":79.0,"height":32.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":10,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Docker

Host #1

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":283.0,"y":177.0,"rotation":0.0,"id":276,"width":252.0,"height":129.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":11,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#434343","fillColor":"#c5e4fc","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":0.93,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":291.0,"y":240.0,"rotation":0.0,"id":274,"width":111.0,"height":57.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":12,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.73,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.2199999999999993,"y":0.0,"rotation":0.0,"id":275,"width":106.56,"height":45.0,"uid":null,"order":14,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Container #3

eth0

172.16.1.12/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":413.0,"y":240.0,"rotation":0.0,"id":272,"width":111.0,"height":57.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":15,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.73,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.2199999999999993,"y":0.0,"rotation":0.0,"id":273,"width":106.56,"height":44.0,"uid":null,"order":17,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Container #4

eth0 172.16.1.13/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":315.0,"y":-26.067047119140625,"rotation":0.0,"id":269,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":18,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":272,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":270,"py":1.0,"px":0.7071067811865476}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[153.5,266.0670471191406],[117.36753236814712,224.06704711914062]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":325.0,"y":-16.067047119140625,"rotation":0.0,"id":268,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":19,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":274,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":270,"py":0.9999999999999996,"px":0.29289321881345254}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[21.5,256.0670471191406],[62.632467631852876,214.0670471191406]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":278.0,"y":184.5,"rotation":0.0,"id":267,"width":79.0,"height":32.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":20,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Docker

Host #2

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":70.0,"y":3.932952880859375,"rotation":0.0,"id":278,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":21,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":270,"py":0.5,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":246,"py":0.5,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[340.0,170.06704711914062],[205.32345076546227,80.06897143333742]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":167.32131882292583,"y":39.0019243141968,"rotation":0.0,"id":246,"width":216.0042638850729,"height":90.0,"uid":"com.gliffy.shape.cisco.cisco_v1.storage.cloud","order":22,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.cisco.cisco_v1.storage.cloud","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#434343","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":356.0,"y":150.0,"rotation":0.0,"id":270,"width":108.0,"height":48.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":23,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#cccccc","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":1.8620689655172418,"y":0.0,"rotation":0.0,"id":271,"width":104.27586206896557,"height":42.0,"uid":null,"order":25,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

(Host) eth0

172.16.1.253/24

(IP Optional)

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":81.0,"y":150.0,"rotation":0.0,"id":241,"width":108.0,"height":48.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":26,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#cccccc","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":1.8620689655172415,"y":0.0,"rotation":0.0,"id":242,"width":104.27586206896555,"height":42.0,"uid":null,"order":28,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

(Host) eth0

172.16.1.254/24

(IP Optional)

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":224.0,"y":64.19999694824219,"rotation":0.0,"id":262,"width":120.00000000000001,"height":32.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":29,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Network Gateway

172.16.1.1/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":307.5,"rotation":0.0,"id":282,"width":541.0,"height":36.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":30,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Containers Attached Directly to Parent Interface. No Bridge Used (Docker0)

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"layers":[{"guid":"9wom3rMkTrb3","order":0,"name":"Layer 0","active":true,"locked":false,"visible":true,"nodeIndex":32}],"shapeStyles":{},"lineStyles":{"global":{"fill":"none","stroke":"#000000","strokeWidth":1,"orthoMode":2}},"textStyles":{"global":{"italic":true,"face":"Arial","size":"20px","color":"#000000","bold":false}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.images","com.gliffy.libraries.network.network_v4.home","com.gliffy.libraries.network.network_v4.business","com.gliffy.libraries.network.network_v4.rack","com.gliffy.libraries.network.network_v3.home","com.gliffy.libraries.network.network_v3.business","com.gliffy.libraries.network.network_v3.rack"],"lastSerialized":1458124258706,"analyticsProduct":"Confluence"},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file diff --git a/vendor/github.com/docker/docker/experimental/images/macvlan-bridge-ipvlan-l2.png b/vendor/github.com/docker/docker/experimental/images/macvlan-bridge-ipvlan-l2.png deleted file mode 100644 index 13aa4f212d9db346f307dfbe111fd657406bb943..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14527 zcmZ8|1yEek(&pf9gS!px9wfL7?(XjHfe_r?o!}4%?(Xgc5AMNT154iS`)haSR-Kye z`MUe-K7G$Qb?Z)ql7bWpA^{=*06>uji>m+tkZb?|gb6&FFcuiA2}u9| zCuqei$M4-5nwr`%i3Np4vgR^5xmi?p#UH=*mV3XyA4*G0x3#x92gWff1cLwoYwwVe zXz=#-mVViE$?s==*J21!?}^c7DO)2a0KlX5gh}1OzpT$YG814}Y}0%tmN+Aryb)z3 zsT@@gAoG`$lpO2IFpREFRt13lD?iI9=-GG+2moqFC%hy9I;nj{27uocPT1D10075u zO@yRFl7errMnFEDh#5#PPuh?-x?z&dII=d^&poRym>Ga5A8o_}h!g_|nSE(VHt%mQ zPqw6czuO|90az5wa0^O8kUNShYVM8{SpWbzzUn>s&g!NPQdUl24Wmw9x|Dc7tCD5i z`~h`8htZ7%KLEg;77+f;xPQ6_tOjVPO#d7)KeD-x!mCj40sbB># zBGK_J+`o&7iG6fe=KSsDW0j8+4tQ zhH*-^spHNug`oyE=L)?pv{pax=*n0-F0Ov#MtGq;M)d`C_0|)mHCU--2WMp&h)U&P zcQv?6T)kMcBJ6c$fMY%x)hr|An5WbgL#Op*Pvno^B*6%cGQulpIp?=Ppr)&ez$$6D z*}MDmX)#sm4Bby&%JvaxP;wzHM8DFF^FHjHwaXuDtd)8S?sxf2d3U>RT&%lJ$$CKm zXh*C8HSbv=U%Mg`XBgyBD%Rl}U!)etqPnI`2p{fA6T+dIgA+kT$S=YKz6gfU{%qvb z7e`jpjWyGn%7K-x9`5=yt$bko+n7@#7IU)OAp}+uF5#D0@BlvI_$(!08p3V=l>$Z3 zlwFz4CPzXyYS1KhRVa3_pd_SxNF|)OT`e>lX_!!Pr15$;eD}>yYE?otTcpveS87|& ztkT$vjWL34w}3#Tgw7O^gpwUU2|(|iPy<+_ncLzhsmGAV&thM_)Q|PylCK^T0QjcK zo)J4y05vSxJZF_EhzlM^A^oT4R?8Dmr zwcQDogw_q@WZCF0mOTbPNpjBRXO@O@nrbl2Vm8jTFDVV77`yjlsDjtincO zM(x$`)?EVqN$)d!m{}ZTC)2AeEw+vI>c6fF??;Ax1Z*Js`7TrxV1fJvHlbX1Hp{=wWxaUkp%r;hrW+LO`2E=(bg%#N+RzoYBK2xv zWVjjX{L3{G28PiMMhX<0`Xnn1r`@t})K`Pv)@qv4v=R5^9oiqikp-o-UU|L*Ja?lK z^~t|nwjE>6J~DcyXdjyY;MzpznqdRM$Q^AYD;i&eSwO;!ow^Zq%U0@9iokAYuN1=0 zgjyk@V*PUkjr8X{l@-*_=Ov5&jCwY{A}H~ahq|QDLtcg)p;~3h3no~JY%&`*vC&7^ z>eEyEgAHMBKM!|f zS^386lj~YFezTObA2o}(5mchyM-Ly|toT6%F z7)_9n2@5gyTM>li#2#N+?(o9x8uvAM9D;G%>ym)K>fPrXn@mRJ#**k+lXkp*hum|c zq-1Zrm(C;xkw(JwzZP&ka;|2lw+qcoTme=rp;XgC*aTN#3s+cEC11-J3o1v9za4Xx~HF`t_^?MsU8C-VhCW<=qT-s%dTMDFKtR?Shvc)nrj6n%d3#Y_z&7J zrn*Ns22|<_(Wc?fCoX+yTbklb3JVSk{~bMgl-KmFC;*#;@%qQDYeOJCLe=MOv&Hw+ zO<(DH8U2Dk^4Basq;cIAD+E;=;f42~rYU3FLb!|ErqsXR$WU_m&VGuc)+^xQrq)=I)A(> z3eq>1S5EZYnb3qc&FEHe!-=MDnrX#aNvg?bf)@Gl85B?bP<6YHD_N=&cfdll0*f672)(R19dd$J@@N{w_z&pMbh5kL5@`Ex& zq&SW}KA<5D|7<)1kw7ZCF3_b&b?Vo#7D!g(=aw2`run#=*WBbN>sO)(Bc-=a0u}hBb$_t3wwW`DS%BKn1z*%{>8}Z zL^-J*dwD-znMzHcwswYp;Xpdcs)spLD?%v%r%!Wm!3~J%y9`ry3lbe=yhWi&noL(O{~pRZ zhF-BaAUy|z^c;yWqTyz(=2#Mc0q>nyb_n^oYH%fyF}#B$-F>b^teXvT)0d6kkIl7z zQ=IXU)dXF)oEt1lrWK3f;E~veRry0233TD7pUIQMkKk268myK!minxp;_1w?wPwNBgq62c=52H1bC>GzD#Q>{GypZ?aN*$R=IJf2|D>8XPCX4HG|$i585Vy$kj zUPg%fSbO5#DUq8|zNayBaW7VF15SxZv&K*w+A#k{w8(fy)U>_#_1o@Auj^W&Une}; z!^!7CPCY#K0Ror^@yBz@1Feq3mD}7}P^iKOFdu5vpq6F2Z#Bit=d8$Z`euV38G8rO zB&WfNKOFBuhr`6eZ{NF{ZqA;<;Qf)La@{W*9qQfT7^7`OhJW}>P`~cZ z@Aq?>q)ssj-FYN)y!}~!-kvXw;uyXs3MKs5u$hG1m-zLw?*(o`Qm(S*-J+QMkN4Jg z6;Hd1JBg|2SF7D)zDmEt{alPVl1Q!U=7!5sAuK9pu3&{O8%QegU0`;e=}Zw*tcuQK zl*FhPZvLrri8@W>1H{>pXNY6T@o_2e=8Q~!I2tu175a>nKu5raW~Tk-FR|1mS`}&asn<@r2JsIP(WHGM-CCu+3#EB7cL+5tY`ZAC|;K@PjgQ^CrJS zoSZig&6L68RPw{CZ-?UHBgAtxF`Dskz;p21CwWf^(x7qD@U#L(@t4Nxgj>hvbDw9k zt3Q+;dfN^3`G1g+vFLwE2QT@C-=ed<i+abt)eg^w7Ps@X*{}DCI9dEmxnBdP?5w=jgEL$wSKvEO?o+=B zAu-?zTrBEeJhd2}5X_u+Z^)DiK6uoSR3ioj=sln8YafL*F2>HC{uYyJ79u`EIP<&e z6`zxVV?9zZ_D562P*iO}qr8B)=!DgeJn`m3Mvj%H!uzVap&K>BWMMSDnb5@_=F9ig zXe8{!h78pn3x>z|{vI#MP{epUyBej~V@|07?X~qOiZGKRjrdTPIE=(W@XENha4pF4 z;5*zkK$WHn@-RQ|+-rFI2QL4H9+Yc!J%Z6{l-`Lz!__pVRA15BgkdZe+(Vbr^E)of zX0dK&SY)66l>%;Q$HT#tZ<{Bhb-`WMe7z+ziQeg_WX|EWqwZuk-F6Ip^JEv~#OK$n z&Of6syLejdEuP3#uXY$)Q@OQMCH&*2te)CT)M0!+LukO&^`p@=1stEB_#-plM$TQg zcY1eJTr<{l?u{B)rf8(+UpF2ee5yT3R+n#*g6dD!6;9um24)Q?LJ8Fn(6FBcZ}jow zhEs)_aHuQS@2l*sGA}zWHt!U0lEesoHXiTw+Sf8X6>tuHBJr}iexg64;e+~ag-l91 zY|rjCS*AZ@vBB+dsp^VPWSn$cc}9_%Jz%l<`5EOwNkTB`eE^SyJj{+e9{&6uDnZ~A z%D9hp#9&k1*!F1tdf`3>as2E$d3<3Yn<$uFObQLoyccw((!rC9 zYeaSDtk!>Zm_wn!lsf#f$`*oV?BsMVi}*D-9)_AODWr@>A&1j1%`d`A( zs0rEAdW(%IiXg0?EGB5N*?tcR*z;&JvOLELo7%Tf}W@Ybq7Kz%Rq z6nkUtzzR)UX1h`NaO7jeGrov$#v-IAnB0bRQIUX2`0{Gwog!&=c7_y;QuU!-7!Ma+P9i0)hk)ZK+qvNG=QPW?#5)*a1&e&L2}m$S6=*ltishAM!VI?EpdD zywb>>t45Z2STvPvvBq^@y>_qPLM>lG$1Q)z=~BH$?j={S3{dmK_k9>;)L%{{TUDPa zE45wz^Ur#>q$P>ggIiADPbU12Kd8c;L%!=RG6bg{4s+Kn^8Q?HEtswg1) zcd|>y>)-E_XP#=c8J%U6Mz3hgppg$K7FNBVL*7C3ZLPGG(L78oB3e=SoW~I)9C!J} z=->~^wYhKN1m7HTUJPfDs5-T|sAGBiV0lU==$dyfsppC(Yt4*mlB{^~$I2bqo?c2h z7Uy^>Ozjw)MUGvGG3>2KX)$l~kH`2CgG>>@pDPPgK_P+&UkAC=s8#6Mer(h0wH!Cr zXIs=*Xl|3i;LCGp)sL?*BhihRWcFsRo2k?jVq|mAS;N|TNUNI_&B=Ymnn&JH;jx-z z4rVsW6wwp8XtM~jh7F0H(XJ<4;N+m^U@ZC-cy04xxXx)x7%#ZTVPZMykUT$O^K1=U z`!h2KO}~dT=oL{PR?OA|zsK65?L!@!%(97#Pg)mX9?Ut9yhG&INaWTnLpqPl9JHc6 zi8_z$=O(}O=?J0(|Mf@*mvz!;a%!6_D>=UuUk}!`TVO^1AI3zVf64vdmz|x=oRnXu z9;%rlRn+Q1u=vrEN-3PU+yUK*(JI03^_FnCF=oz0J%ih_OeWAje;9v(zR1jM``$Ba z^JzWMh09%K_V*oG%mQuOdeLX#u-sW9^`r#mcpU;!xQ^1&e4cJZeLghq{aecTN%ZM2 zul|C=+zHK{r@seq7ySZB(zH!28AGO2ovnCCOz;LYBwS~;V8c;x%i0CI* zAIx_N?q-;{IEV-{?MRVi?C?G}Uk?*mh=?@tE?;65a`46D4_8Doa~rRC+Q_+WYG^dy2hDRGv7A*swCIzA1X;dlV0jQk+;#o~)8RkzCo)X2~5 zT9#uaH)daTwGqG_phR;`H%P-NoLRzGtf)bX(n^vzjgcOfm*bN1?o58bbj^z3>%oj4>6w27DAOwo z02PHPSmM5cwh+L3+s1800uZBzH=G>8aRz8_t)s>*Ql841o0)|z?FY^lIyX1f54?!) zSEJ0x?T$+%xe*ljKw>O&8jKsxwqyu`Q8O0@4_=9d+u5X@mOQk)pPc$!aUA`8mYX!) zfOz=0Pe7i``NPIA%L4GKntifOVp6#Ga{b?`&a?aP(PQ{VC=Jft50aYd65m)4CqNYH zFQO5WL}#Y!$2Y6}9Lk`W&49O5W}b+2IEJH(ORn}*XNA?3otDk+EOL&+T*7HBP8kTw z-pKN+-If1XXoE%!lgRl$@Ka4JIr5DokH0Qv$K4*JXSsNCYj>0v*|}_$nkG!{?Wc~{ zK3FA!{bjjS>H%h}{LbUu45)Q~FcN0!6nHgm4Iw#L(FB;$W#-{%?d5cv=Rz6?8jU=fJ2Qjy8M>%cca~=!gFPIR3H1L z_^kb54*k6U;_t?~&xMb3BF{Vy^(UC_Hu+A07ek~*CfaMEeSsqsf%?c{zi*}SM#iYX zuZ>ZStoiJKIJUXr!fGdZyCwhHAaTQ>)Xb!gZ(iZ`7WiuO%OV98e>)4(I^w*-HBT4t znmyx>Mp>FLg03DLCGD4RQf*>-#a6}N@5wOq93=F7qkT2#B7kI>yt>8# zB!@iOF+roqrTO2_M4HX;ay4qd>c+!+N;+#$9|8QI2dF6)F2~T*Q>qQ+6G+Wi5e$0g~XyMHq)YIIKnBwI!+uG~KC!al$ zks=8q28*I7c?28|K?bGtEl0&8EPigeE~7#&S`nNQ0NI>1hYu(TEN7K*g-vpg-lS>I z8Fzw^YL5vOjr0mMOtY8Oeh<%kvWP778^aj(!bsne5r&3^r~X~@7Z?1NVTvI}_q`rP zJs9~!`s?6@pNL_A6Wl%O@06BA6o=rbO~b%EjxmP}hCoqqR-|_ zr>cCM`X2a5baf8vb8~Gz+QCN>E2);k_?SB;s~qb@$rpC%z$rxBnRK(1_y9n#A zCz*VzEuc_Pbo|-eFjz5ZOh{_9V2=KMCPCnapii}m8g-Y^jJ7x}GxVx=?3b1o4E3I< znrH>vhCjpkE(~-a-Iu}K>D8Je3s{jxJwyDN{0Y%Sbtz;XB+MXesZtt|rJAd~C*6Ho z-NxKAMv0X0hy%-#Q}2DgA#u>N7wQZJ(s6j9-wDL+6ONCSH(B4sSRaB$I~?x1wts~) zkGDi;{s#ee3-nW3LK_f-LvX8}d*pL?6#8Gvu5-Z>gI*$sWRITZq+c%QL?tw5aP0X0 z!&BqKR}Q|Obd1fdhZ;duMAoFsV#^N!ekgs-vcabBzi##5iK zL}9GCcTG!`Slc4pn{RVmw`r_p@kTEcU}j&x@??KYs$Je!sot|G#jD!Qfbg0S?KA#k z$9Go1HR*HKnb_xU6BQ|!jRH2zv!;kcbtwYw$ ze$+TSB-*0A3vR_+zu4=qkTM6`5Cgc?Vu4jsKI-$#d0fxCO^MXy@cG1fxjuF4>m z6!S<({3=7jvd@pfmrfbgf@r*_Vwqke#ardA%Vy0VjD~J6DDnd{S1ULdnZ$*wLO+JZ>1-Ix#p1Jr2he#-T!q!N3^$ zUJe2fRJsZJR%AeN9$%uSZZbx`7^72XtZY(SWFi%XQyIEIKN%Qsx)xwbs7wUsL^Q1v zpi=nbP&y8NOudX>ROIJ!0ah(!D0s!ZSeMMS$qlLOCx=LL06gZbb0uRF1WW25G(}^> zp5Y2t`;BSP(%bntPe-X95^n^4`m!1}hsigEO&hgmK6 z&`Ro8_ubx4-3;UYhrLOaB`QTAP{ay-2@C1p*-g?;RoR#ByCwE8gs|GS7V_$ODB`DL z+|;!3FLDB2iIJC!Qjoy5fu2D>A&ko&wOPyem{;z}XHV_JB=i>-zEv)FJRZ-R-56uW z545gHmb)K_2oktDAcsALslbZZr-(B!J9t@+PBoSO@>7S13s?L&iWaLF*x!h7q_;4f zJIbR{d$}b|Lc$xpp5+b?w!*wwz0_dZhAt!v+sW`?JeV4MkczII8dJQwj`eE3>2p4O zpn{rLFnDQ6x3#Qj)$+Oo&EqZwOw?2A(0@ zcAhkIXw+!OGU$IZk1gW1{6=SmEzf|TPGB;b|D zF41;e6fMG{rgD#DzG@F!8KK=N(bAOvGdX;FN>2>FH9!az41IQb-um`tM077kN8F(Z zL^MAVhzx$C2D*U`d}xuVE@^?!1A9MKLNRuHM?q`s2*5%xx&SAilY5#F$Nv_@`IKmp zG(aC_f^4l8ULVp&BB3LNU|LKlzHLn*2a-J+0vd2Mg~+ASk#PR$K4I&OHx`1oN#faz z`*$VoB;y;}k0$bu9nuB~mcwGn1P*+M6cfLGr=ea+f=B+E4^1K=nuXV%Mr;cl_Wbiv z&d6YDw(po{zw6X55sMY#@iKd6lEf!Wn`;7kab*PJD0*o^4d8t3s+9=Hum8DTX3AhA z_06{v%|{N9N{FW#${m&MQoIVOvkV(51eXC#0~LM=5@7u^C6|fz2Jj`kAb(dX_#i27 zGEv_#;O3JaQdc>gh$j(vn7?HF`{f&^J)W!y7D6suwU{C8hfj3S(C<4pMw~-}gYQZ^ zURcu65fH=!M|V~;sq2(F2!jgGl?^q5$N z7RC!Nm?U>bV1RRqKu&_$8-rrXrZm|_MKv;~G$XEkc4xNA^ttN|8m?xZu!mjyVxc!} zeEZo2C;h>CP4_3hH>32dNgKl`5N)ha8C6OTv|X=mWKjUgajgaXYZ3~Q6Y2@f^Wgd? zo|&AZAJdrhG?%A-m_@j-8L$d?81^xCLAXzhm`b}v9Ruf)+QT|IyzF_=5?y z=N&=@r0yCij?ilEV0y>W(28Vxp_K_!2fGHC84)1GYU7z*pkc+#Wbs({D6E*B^RMaB zexKss0$w^QwC2&O)%_t`WD3vA^Z(eIPFu(1Q6;bEh-g1RPhxnF(2%5k#Q-qljI=o>a_qYk z<+tmM$tR|f`10+gfIs{}jaq$k*|Il21CKzP=t4;Ug1OtfC`aWe2brsB_3TbweLorr ztC)1^ju>mN!AVKCR33|V`0*$Cf#=e&n1;ik&?eY{Iib4IR*48kTaZU(rD;c4C5ZZZ zTZacIC&w&1!I3h+DER3s?c8J>|1zm)LEsn<9N=p+l9EWL{x$GL2vjN&Jtmfpg^_WC zznrtLo9+vK9RiSWAjF}fAOzhsdyo&*1-zlqvjD$l2mL_54}2p43AD%9T0<@W) z#UGCezvUT+2p;$x+Au|{RMutiUZ^LR*TQ|M2YOo;G1)^t(#LWOG0^E#41e8Q+dG>KHf{j z(&ex6wRRV1VDqAchNU>gyAzRq;Ye{F)Gx+?^uT9PZ~EyKpFABJVY?1~m7Y`FONk%Z zl~znQs~}Jk5XpLW=Abgc3Ayk`w#meW`fdtUx|CiqyMjK|F{!8{MlrSG0paNqRKi`_CEB$gv3l})i{pa#+EtuMxyrJoV?qH2gx z#Fd_6mkmxV8s*S_MZZD@s%PIo3qaXatLN-fb_CzRW_PQ}Bfs}J!A$m2zZhxTn)->L zsHp1|;{Iv~hBL$T_+mfdw%Pmi$=!fhu_{5$@dp_LS=MV9vSib zdk0r2#aFq9@9e|%yU2B;v;OK{vtfc6D(Q!X*&}JkT=|)Jx5g^YUpA<_0!==F_YvSC zhZ%NyH3ZW}@8L-_3ecQ+0ChqO>wO{tMrX}@Oc_WrLO{O~2hb@^f>c~K-oqS}7Uk$U z#EWGQ0p)gVzS0KVCqjoLM3#cwVLwe_&*K)I;XSmQjIjz3wE*OOr~?$4bIkI>JZk$b z6je`e(bCX7P|~cg2yDo@F8}K%dYBogh?({;m>I$d&Q?;i>DP!Ubtu}faaLPUh{@lo zO~FNJiQi&XH7p@CJ1F{6jB|fsew*aSCe+XbNO1tqd6+?Hd3f?cS<%`nO>aNJawh-x z6`ORk;Roh>l!i&FrC&=GDPUpi7&OdcwROM+!wFRzu`8Ibv4d}^hZxA;2rt>O640n% zlAQm8q+_d$nbvu=Hj4SWs)51*^Itv9hhE6`%CcgQ>a3(q|G$oD*g9eqNpmV|yLAv2 z*)E1Ec4w>YbYUZM2QIkwIRDLS$}*9b$_IQoNjK6{Bo&DWQ>0Ab)aUQY7r{{mM1LH$Oj%c$f3R z|39dgc~fFAC-6?OORoi4qN*Vxgc4=h zH5DTuM7ktaxzc)R>$M8qXJV?G1a+ zB0sjDRYae&;f{b-tR)B$3{U+^S`a#x424s2LzRp>Y+x*nj3w*qM=mb>`u}X+kJLyx z)QW~mNo)*JUdX@{$MIRqy0^FYUwdh6^eq1jx)NmbM&~ayj>5J79RX;+p5!qn4bQ6y z#r#Ju`&w_MKdygy`?s2L;XOu?mmp50&ezvidk6PGkk_7=KhAoF*CD6tJtsIb_IFm=?WH7%Ma=0B*ym!dx2?0>78N{O28Bpwzl(6Glg@L?$@6e1h{vf2(&> zfLS^tEIwlVOG7tY<8a%n{Z3KZF>@TXv7NlIMbljec{@?&Bo-$^DNWqOxjhpUS^H@@ z4~%>te!18=rad+@AYT96it|I^Ex+efi{^ZPFS7B~RG6aW)Ji7rr?f&oG=fO{n3qPZ zJv3x%eRMgpR*zLYI&>SK<=mr69(iSvYK8s$FUc& z6hi1M83a5IC^#T^TAP^6h=5HP4u0wx%(?|A6cNP(kA&fQ=a>_bZ&ju#hYMJ2MZ+Ta z=kQrrME4>eT(IOvyw(;>pJN)zo|}mYD5da8dZsG9 zhsxe`z)PX3Dk)wERe&Df1#Dvq>_(Qe9on_(!M%gOwL&UXyt$D<_+0*s zR0pSzf!inHI`x6m`Um5rWqYpFJ`m-s2()EC7#vw-NwO%%S zqfilAIDIR9t^nG%P|jIDc5=#|-76N`S`|er9~;XV5WDkWLq#b@8BEg1x9W!Sqs_5K zX=`iM*e0y_ic(O_&Eee(Dm;qKW)Q?Qixu)48y9AIwbq4^a70RI@f5HpOXRsEZzH~q zP4Qmj`1q(;u?U!6@IUY$zMOj>=02=i{E(8H&GJKWGG?H5adxAHJ(QUrgcta-;lTtM zRR~k6@>)#hIl~zkk}LO8-6Qg_uG^zszJi&r%8?N$HjaCN5lo3!SHyfQ70=+b# zOxL=>nj&y8X|N(~L?;`##Rn^iN-ptZJQS?c!>8lTGs_+X=dT^5P?n}n+2L#a zUs*jURphV4i|TREJ~Ms1k++gtIk9ajG5$^+t|HIsv>u^5gLUT|p9R>y*ryP_WYu`q zsp}F9+Tpr3HKN1g!RJMZ@nudS7n?38t-ZXAV)`Ri>Pt(nY$Y(+1mgc;$+fvjetR+W zMP_IqI=4Lavlg&LAiN2pvudu*{US2{=Bi6HmI46##PG(ApBA{FhNvPuzzr+Ye(5Bp z_L0@k`;Yg{el>`=KIhtMLE;{o1~K56jI1OovZXti9jb(_;x^TuT@~5;G*9l$MryM11#KG35vk zS8d*DH9pjk%@Q=rEmkhnIX!58nvVm>iBqK#W-5xaN}dn!AJJiCf~9axN;nYqhG=gP zc%}Fgm!~%_zRmj|_PVORyi;Ff7R6!haSbw9Q^TIq73@~(Y=O+?2yufyU?8Il$*X^P z%{^)ywABSH4}GUzm5wTcegzBYo^7LUWglP(O6Mz=DG+FkrqjN6t>xZ*H8HJ;Mbd>l z_-q&4!O&wW=v&8d0^`{Q{SDM<+^xkd{x~@yDC{3F@6tvTq#VWJ2$%LmG6ylERpe^D zxisET>(V3OLq)Qq!iv{wX`|bOLs~iEWOo8xGIWz#$AwT~IUmWw z)peI#IXY*+DdppYxvBrhG!re;d5F?{J^%nW60d_0Bh^mdN)&F7JSW31pqcCsH&8!& zhOZ=6#S6o7;VsAF(zRMX(268A_qxfBd|kM;ZXd1^_X{!Y%^Ms>Ih(>S=7in-eAb@# z^ELrCZ{4$hnY!yL34+;iqoXxkT4DUy1vzvxg?Phb`KE$j_QKC`c#~; zKCpMB@o`1e%Vvw^sZTg56izHBnX~4j{|6UAmAOm|U7#y=nIW@Legy1i7_SJatl08a zk$?1K_l5n*Hy%$Gl81IhM}+Drny|$ilDH)itON+p4vlUR_poRp$>~_kyk@FjDPF@j zICF)Ej7P?xD~sn>@;4fB6bq(qKpxFmLu)QHDAIrE2xXqYr8C=Y(n6K|jhZdlEK$8D zOuxtb+)##;ij4SwWJvpQF5c#X6X^EvXwn1#}Ki0-R-0D zC;$_4aqjQqjG$>p&mOzWK`xa1m|+sJSf4K|<(f3PWta)P%=9SbQwF;u2rq7 zAbx+Q{KKP}X*IO99wIEIE0cnMwgpk`cCS)A#t&-5n9^mOSK{^5kEPU+pwUorG+n8i zEDr*KIbiMJ*C4d5hy53%nNhC^W#}H)y#ZVR)M9ai2J8JDlfO1)6Pwa%Na=l>jPR~D zWN{*vLsbbD4dTsfEGmV3M#B#Le1IOYXL(x2!24ah0wi4l$dMH)e}51&`xQ%(_tfh& z=hfPOrYt*i3XBZ6$8E7dd2HSIomjl@)@s~qgc~P_p1m6jVG|?bj=5*%X#IL67V*O9 zVZsCxlu+AjnRg8nO%no#Y7K9lPK%Xmaq_I2LwBS-nZ{XNYIb$~7-}Zi$F3v0Xk&Za z8?p}5XBw;Fe@wwB7%CY=6C~Kzv%|p9#5S{9OQ9irqHWy`h{?pnMC{x_6Dn8lKCU)o z2^89UU)i2LnMV3tE_qNa)4O&Gf1c}K`=M)9HK?SCq!?=iR%cUcsuf2ijz`^(uDkDNi?s-lBIv@iG01iz zm7=VyiKc`~djzZ<)D!kSKu&JVd23;0IaEf88fYH$&<6rML5|+!-z4p>1w&UPVQ;|k zs@J0zQ=a9#Mg7q;>{{txEtygSrzContainer #1eth0172.16.1.10/24Container #2eth0172.16.1.11/24DockerHost #1Container #3eth0172.16.1.12/24Container #4eth0172.16.1.13/24DockerHost #2(Host)eth0172.16.1.253/24(IPOptional)(Host)eth0172.16.1.254/24(IPOptional)NetworkGateway172.16.1.1/24ContainersAttachedDirectlytoParentInterface.NoBridgeUsed (Docker0)MacvlanBridgeMode &IpvlanL2Mode \ No newline at end of file diff --git a/vendor/github.com/docker/docker/experimental/images/multi_tenant_8021q_vlans.gliffy b/vendor/github.com/docker/docker/experimental/images/multi_tenant_8021q_vlans.gliffy deleted file mode 100644 index 40eed1727..000000000 --- a/vendor/github.com/docker/docker/experimental/images/multi_tenant_8021q_vlans.gliffy +++ /dev/null @@ -1 +0,0 @@ -{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#ffffff","width":389,"height":213,"nodeIndex":276,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":false,"drawingGuidesOn":false,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":null,"viewportType":"default","fitBB":{"min":{"x":5,"y":6.6999969482421875},"max":{"x":389,"y":212.14285409109937}},"printModel":{"pageSize":"a4","portrait":false,"fitToOnePage":false,"displayPageBreaks":false},"objects":[{"x":64.0,"y":36.0,"rotation":0.0,"id":216,"width":211.0,"height":31.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":10,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":5.0,"strokeColor":"#e69138","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[-12.0,33.0],[84.0,33.0],[84.0,86.0],[120.0,86.0]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":190.0,"y":32.0,"rotation":0.0,"id":254,"width":211.0,"height":31.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":11,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":5.0,"strokeColor":"#f1c232","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[-142.0,16.0],[54.0,16.0],[54.0,115.0],[87.0,115.0]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":133.38636363636374,"y":108.14285409109937,"rotation":0.0,"id":226,"width":123.00000000000001,"height":104.0,"uid":"com.gliffy.shape.iphone.iphone_ios7.icons_glyphs.glyph_cloud","order":12,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.iphone.iphone_ios7.icons_glyphs.glyph_cloud","strokeWidth":1.0,"strokeColor":"#000000","fillColor":"#999999","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":15.147567221510933,"y":139.96785409109907,"rotation":0.0,"id":115,"width":107.40845070422536,"height":49.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":29,"lockAspectRatio":false,"lockShape":false,"children":[{"x":31.506478873239438,"y":2.4460032626429853,"rotation":0.0,"id":116,"width":44.395492957746484,"height":29.54388254486117,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":17,"lockAspectRatio":false,"lockShape":false,"children":[{"x":20.86588169014084,"y":2.637846655791175,"rotation":0.0,"id":117,"width":2.663729577464789,"height":24.268189233278818,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":26,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":120,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":120,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[1.3318647887324033,-1.055138662316466],[1.3318647887324033,25.3233278955953]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":36.84825915492961,"y":2.637846655791175,"rotation":0.0,"id":118,"width":1.0000000000000002,"height":25.323327895595277,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":23,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-0.8875219090985048,-1.0551386623167391],[-0.8875219090985048,25.323327895595412]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":7.103278873239435,"y":1.230995106035881,"rotation":0.0,"id":119,"width":1.0000000000000002,"height":25.323327895595277,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":20,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[1.2752008616871728,0.3517128874389471],[1.2752008616871728,26.73017944535047]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":1.5827079934747048,"rotation":0.0,"id":120,"width":44.395492957746484,"height":26.378466557911768,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":15,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#6fa8dc","fillColor":"#3d85c6","gradient":true,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":37.199347471451986,"rotation":0.0,"id":121,"width":107.40845070422536,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":28,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

container1 - vlan10

192.168.1.2/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":68.0,"y":82.69999694824219,"rotation":0.0,"id":140,"width":150.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":30,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"


","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":71.0,"y":4.1999969482421875,"rotation":0.0,"id":187,"width":108.99999999999999,"height":19.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":31,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

eth0 - 802.1q trunk

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":282.0,"y":8.0,"rotation":0.0,"id":199,"width":73.00000000000003,"height":40.150000000000006,"uid":"com.gliffy.shape.network.network_v4.business.router","order":32,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.network.network_v4.business.router","strokeWidth":1.0,"strokeColor":"#000000","fillColor":"#3966A0","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":62.0,"y":55.0,"rotation":0.0,"id":210,"width":211.0,"height":31.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":34,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":5.0,"strokeColor":"#e06666","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[-8.0,11.0],[-8.0,34.0],[26.0,34.0],[26.0,57.0]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":12.805718530101615,"y":11.940280333547719,"rotation":0.0,"id":134,"width":59.31028146989837,"height":83.0,"uid":"com.gliffy.shape.cisco.cisco_v1.servers.standard_host","order":35,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.cisco.cisco_v1.servers.standard_host","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#3d85c6","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":64.0,"y":73.19999694824219,"rotation":0.0,"id":211,"width":60.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":36,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

eth0.10

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":65.0,"y":52.19999694824219,"rotation":0.0,"id":212,"width":60.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":37,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

eth0.20

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":7.386363636363733,"y":108.14285409109937,"rotation":0.0,"id":219,"width":123.00000000000001,"height":104.0,"uid":"com.gliffy.shape.iphone.iphone_ios7.icons_glyphs.glyph_cloud","order":38,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.iphone.iphone_ios7.icons_glyphs.glyph_cloud","strokeWidth":1.0,"strokeColor":"#000000","fillColor":"#999999","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":139.1475672215109,"y":139.96785409109907,"rotation":0.0,"id":227,"width":107.40845070422536,"height":49.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":55,"lockAspectRatio":false,"lockShape":false,"children":[{"x":31.506478873239438,"y":2.4460032626429853,"rotation":0.0,"id":228,"width":44.395492957746484,"height":29.54388254486117,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":43,"lockAspectRatio":false,"lockShape":false,"children":[{"x":20.86588169014084,"y":2.637846655791175,"rotation":0.0,"id":229,"width":2.663729577464789,"height":24.268189233278818,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":52,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":232,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":232,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[1.3318647887323891,-1.055138662316466],[1.3318647887323891,25.3233278955953]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":36.84825915492961,"y":2.637846655791175,"rotation":0.0,"id":230,"width":1.0000000000000002,"height":25.323327895595277,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":49,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-0.8875219090985048,-1.0551386623167391],[-0.8875219090985048,25.323327895595412]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":7.103278873239435,"y":1.230995106035881,"rotation":0.0,"id":231,"width":1.0000000000000002,"height":25.323327895595277,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":46,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[1.2752008616871728,0.3517128874389471],[1.2752008616871728,26.73017944535047]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":1.5827079934747048,"rotation":0.0,"id":232,"width":44.395492957746484,"height":26.378466557911768,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":41,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#6fa8dc","fillColor":"#3d85c6","gradient":true,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":37.199347471451986,"rotation":0.0,"id":233,"width":107.40845070422536,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":54,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

container2 - vlan20

172.16.1.2/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":259.38636363636374,"y":108.14285409109937,"rotation":0.0,"id":248,"width":123.00000000000001,"height":104.0,"uid":"com.gliffy.shape.iphone.iphone_ios7.icons_glyphs.glyph_cloud","order":56,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.iphone.iphone_ios7.icons_glyphs.glyph_cloud","strokeWidth":1.0,"strokeColor":"#000000","fillColor":"#999999","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":265.14756722151094,"y":139.96785409109907,"rotation":0.0,"id":241,"width":107.40845070422536,"height":49.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":73,"lockAspectRatio":false,"lockShape":false,"children":[{"x":31.506478873239438,"y":2.4460032626429853,"rotation":0.0,"id":242,"width":44.395492957746484,"height":29.54388254486117,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":61,"lockAspectRatio":false,"lockShape":false,"children":[{"x":20.86588169014084,"y":2.637846655791175,"rotation":0.0,"id":243,"width":2.663729577464789,"height":24.268189233278818,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":70,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":246,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":246,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[1.3318647887323891,-1.055138662316466],[1.3318647887323891,25.3233278955953]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":36.84825915492961,"y":2.637846655791175,"rotation":0.0,"id":244,"width":1.0000000000000002,"height":25.323327895595277,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":67,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-0.8875219090985048,-1.0551386623167391],[-0.8875219090985048,25.323327895595412]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":7.103278873239435,"y":1.230995106035881,"rotation":0.0,"id":245,"width":1.0000000000000002,"height":25.323327895595277,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":64,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0b5394","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[1.2752008616871728,0.3517128874389471],[1.2752008616871728,26.73017944535047]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":1.5827079934747048,"rotation":0.0,"id":246,"width":44.395492957746484,"height":26.378466557911768,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":59,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#6fa8dc","fillColor":"#3d85c6","gradient":true,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":37.199347471451986,"rotation":0.0,"id":247,"width":107.40845070422536,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":72,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

container3 - vlan30

10.1.1.2/16

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":65.0,"y":31.199996948242188,"rotation":0.0,"id":253,"width":60.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":74,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

eth0.30

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":44.49612211422149,"y":17.874999999999943,"rotation":0.0,"id":266,"width":275.00609168449375,"height":15.70000000000006,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":75,"lockAspectRatio":false,"lockShape":false,"children":[{"x":68.50387788577851,"y":43.12500000000006,"rotation":0.0,"id":258,"width":211.0,"height":31.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":9,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#999999","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-64.00387788577851,-31.924999999999997],[197.00221379871527,-31.925000000000153]],"lockSegments":{"1":true},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":68.50387788577851,"y":38.55333333333314,"rotation":0.0,"id":262,"width":211.0,"height":33.06666666666631,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":7,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#999999","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-64.00387788577851,-34.053333333332965],[197.00221379871527,-34.05333333333314]],"lockSegments":{"1":true},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":70.50387788577851,"y":40.7533333333331,"rotation":0.0,"id":261,"width":211.0,"height":33.06666666666631,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":5,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#e06666","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-64.00387788577851,-34.053333333332965],[197.00221379871527,-34.05333333333314]],"lockSegments":{"1":true},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":70.50387788577851,"y":42.88666666666643,"rotation":0.0,"id":260,"width":211.0,"height":33.06666666666631,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":3,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#e69138","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-64.00387788577851,-34.053333333332965],[197.00221379871527,-34.05333333333314]],"lockSegments":{"1":true},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":73.50387788577851,"y":43.95333333333309,"rotation":0.0,"id":259,"width":211.0,"height":33.06666666666631,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":1,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#ffe599","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-64.00387788577851,-34.053333333332965],[197.00221379871527,-34.05333333333314]],"lockSegments":{"1":true},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":248.0,"y":51.19999694824219,"rotation":0.0,"id":207,"width":143.0,"height":70.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":33,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Network Router (gateway)

vlan10 - 192.168.1.1/24

vlan20 - 172.16.1.1/24

vlan30 - 10.1.1.1/16

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":3.0,"y":88.19999694824219,"rotation":0.0,"id":272,"width":77.99999999999999,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":76,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Docker Host

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"layers":[{"guid":"9wom3rMkTrb3","order":0,"name":"Layer 0","active":true,"locked":false,"visible":true,"nodeIndex":80}],"shapeStyles":{},"lineStyles":{"global":{"stroke":"#e06666","strokeWidth":2,"orthoMode":1}},"textStyles":{"global":{"bold":true,"face":"Arial","size":"12px","color":"#000000"}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.network.network_v4.home","com.gliffy.libraries.network.network_v4.business","com.gliffy.libraries.network.network_v4.rack","com.gliffy.libraries.network.network_v3.home","com.gliffy.libraries.network.network_v3.business","com.gliffy.libraries.network.network_v3.rack"],"lastSerialized":1457586821719,"analyticsProduct":"Confluence"},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file diff --git a/vendor/github.com/docker/docker/experimental/images/multi_tenant_8021q_vlans.png b/vendor/github.com/docker/docker/experimental/images/multi_tenant_8021q_vlans.png deleted file mode 100644 index a38633cdbc23014364bfc611d650b2a17dc72ae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17879 zcmYhg1yEbx7cE?9f#O>wA2N=k^5TU; zo{GGTp7-KW?!7UgA^9LY@*H}Cd+%K1(B{(ASh93{t=X3Dy466wQ~@&Pj=v%}BW_Tv zbkUAB&>_O7chr-9U4T!T_5s~WI_wo`Hxeo-?Y#yLmK@UoPhtsg``T`mL=N9B!-bsW zgx|Q&gpY0y13~m9EY?WzZE_R{@hs0lpRCMaMHVgp79Xn2Ku{Ma|No98>dQ?kYv>Nv zsWm8Z-;KC6HhR6Lr!VeNd|tr%VOY^m zkwVRr&<8Req~^;ok(4~qc8%?}ztG$_^;BLz`tzB2Oc({;nbWga)0iI=_!KOa4M-C_ ztTazF`Hr*|1=0#(;FjKu?@{<00=iad-;Dj0b?Kb28_=j{!D5U#_8Zd^0xL57Wr;kV zW7Yogi>A0O_xXi?B{b%JsyPNb<9T4@0^Ua9m{`f@Ovrp&86MOYtf-^It+zxU^_2T1@9mNroUAc=~sP<&MwscFUeQ~U<|7u8-^w-37_ z?-JEMYVoHK&{lO$cTS!yzsMU2rqz<^>|956zA~~i8KsrX0scsyr~V=kQBHaJzO|cU zTzmPi`1-h;toXlFvEO)Dhttdt&?@q>Kd)2Vquk7t1{Yd_oSwgUmj1whTCDfD33ck9 z8RJU_(H9rX_0l_CkUw=EALt!#nWmXQAB_t;pO30$=Q^sZZaP`|Lj;nj;8ja2!7oV8 z60r=%w|IV$d3b~n<=QD^cSzQ7Vpm-Q+IaizNe1w?1stu&`ijkMd>wcd20ZSXmE!1I zI8Z;Z4{&eE;orfX6?=uD-Zc^jXFe|_NhE{gSt~z1m@cv{#2Ot7Dt%%N{W=MM*IAB6 zO*h~mm)cFI9OyBP>x`Y6Vxo^NBYlu5a$oT%!`QXsCSLEni?ZE5>9IAgThC|y@b=K) zup@H_BIEF_%5Ob&C2gXbHMgR~wd38|>Y>X)pg^&S(#@Qp{`5}_L)TAjPNKc3{R_Im zSTx*!+wnGYZWnBY3_>`pJ=Dj!#FUC~K^{-G#oe3eQeR|JSmIRTf|KTmOp)u~kKwNy ztr$AvQVd!r-YN-dJzN1!UqQ7M4I_mGlQj}eH&TSJxxDcg!oN~+fq?KYq*czb)8De< z@bw6WQp{wZ*NveGzgX|D9yD6qy=^=-BQVoy8O4?}f=3qpAOvaoMw*+Mnf-ufYlTmy zHG6OWpo!J2Z1iIa~O*@BFdJ2=tR+=&$w0&?W~!n&Tou+fz?XbS5x z?)E3!mMk5G5K4sx%>E`#WAZ0sl3d^Q$J@mmV$t>0g4BG4_>bM64d8oB1YJ65SI|}XnodMBgWbaKzxJQI_?a(SC6hSaSC6PjS3Sys<~Kr(di<~axaTe) za%Hw;r*#TBwCP%3Uo~;Q*)Af+HL~`&f5kcw9!*fzA8$9hki&vnbf2gx1HBGmr|LM$ z`@(Q`VlT9|BD@v0Osq%F*-}u*{5BzxKyc2M9V4oaBegp$`47kKyy)DwQ~J0LHDgA< zWb{EidaHNwHT|vMa~t-2Gd1GWO{fiz5JM=PAwnfkh0g9Ip9Y|WhQKM@UhRN&zPk@N8r}r7J%{fLmcR1XAlPz_PNfc zN|&SLZ2SxtKn_ed>cZM?j3(z@Qm?d4)VR4vJw<`8@OM1x#Ov9;B4#0E z4CVXs=_V=k1>gaGm2iPJZer)vq&w7Rk~oroQIV1gDlmHf{dclgvQ{qtxXoV)uLOSo zX z`CSXah0|4bZk|}UxVTK^cZ*IjP{%t|mFVyBDa8>G@=YnA?} zgD-#oF`fg9bI3JQN;mGX!GD)EonafCDf15VB z)D+V|i~tOxT6z3HYWbn_=c%>V)#cXDDJOGk&}$O{_XS^I7lH zZEVp1(PsD0r`Rw_kove#YX1(JL{n_7*`@jA$u>0>>W$>ND>KqKq}Ht`T13M%;lh2>dyc6VNPYTEIH1cr}Y|Ey8a zfu>QWO3t&dD+t;#Tx*{x3V3SpLH znu1t~d;FK-b@fQC*lQb(x=k21XO9pwH19Lwo9W8IV#p? z)@G&1;m!p8%7LJ(odTd%R+6>fYmz}chCuq(_Lj@nv-j4-x4~*4?9!r|4BSn}f|#r} z757FHa_Ywi5}df-E^S<|xZt8dV3W^5h}cR~{!AaF(d@Kv{RC)ZGv(ZLcp z>sU1pq%7n3Sj+l@fW>QXStG|drHMNll$Zv(q8sCI+I7Mt_aIJ2_zUE0RA#$Sksm8* zLS{KD)hPk)JS<899bTtfq+w`e_-!V{Oi_1@LNp>r$i|;qZ}Bt(@>wcUfsK!QZ^9x9 z_e;2Q>_Fo&8N^H-8 zA7?b&6>{I6&U#vRSdcO|)ETV+wGWAZjIbLuHj?RRL+P;Y)3ybw&ihi0u9rr6AKMkd zba9PkWo4O&L+UclrXF?+$x&-~LB=;Ky?qNcSMUjAX|ZzJY{J+s)~5OZUeu}bcM`9>7?7d0=Zy6~Y5~94 zHqIZ;oY`_Syah{NYlV+)xxLbXQR{atN zIkMpwHgL#z4=J50!Dc?&wXv>)7$HMBt7CZu2jv^_Kczn7(1g|>M9{YLw$Z^$q18?$l*f4Wg2Z`&Fwa|Jt$vzDtSl(R}P5tzI;DyAEYm=!kN>vXVM zxLuUebn3b{#i>s;%+;=b+%mbjhkDqg&Ov{*dEWQmfOm%?U3FWGbGg9R6i{sE`9>gklS7l4J#-RNg@sMFv zFyxqk_j_}|yMn6^V6`9&O%fuBY+4vDglCVl03$43_eIrxG5UqsL_NYGr@W}du2sAA zJIPSItk%GGA%bI~tWpaAC_?AG>x01TfDfNEe%T!jTL)_W>F}(oo@^*Zr>gIt#{R1VDuD*$^ zS|^}(ASNZ!>3VV@mM#QKDN4F}YVQpcARb++%x$%xZut*r`?qmc*7{NQu*dPp?ZHdC zGK#U56sz=K8-&)azkSK-oU`JM1VP{p1EX(}lUClsuKt+=C$BH(#vn=zgRmJ9#-%GE7dn}3|Q3kb|bt{!lG9d=icF zdhScP!jO%;3j8_&aZ$v*7%YL#;q=;{czRtFkMoHc2TCv-1?mGp})8NX4wIBz#d+Vuzl-*M#%(@81e)fgR>XUs^{(gVPM6UW*HV=EHlZO`8neF-+F z(hW;?u>OfdAFfaBd=)8hlv6)C$zs8c*(;jvPyJ+{nks%9>~hZ{=w=++HL-^rG8)8P>9tK$gml8CJrcltW;q!$snXiI{NYh0I8LFyWkilaW; z@n(xXY**z11v*RJ#^7q5{uOjWhH>_QU#F&-eDbtO;{!f6^+>2y56M>*gcftib0;aqY@-M!r#9+Q~ykQjU9PcrZfBmixm0dA| zhBYEv-$N4$8B4%5A5C%1tN>`RDQ5z++>P}43Hn@7$|t>C^=!&3$le`FvShp=u8k#7 zN{MeDNG_)7ywzuBI{@ej5#4bW-sm=1J7#Xb2>~6(o2GPgJ9sxse2D6Aj52kP@q9j* z@+i(ceOU6>SH_J~3H_eldKBhBK9+Tm{KgRYTmH-MquX>Ta8?Xf#F{aE;)lhj z5!JBC9m4*o$!R`{J7JY@D{}dsTJ`%eJTtIh&n1BGbQ*d@tGTHdjH%$z>l+@Sj*-d` zymFLDSD)iZNZ@Bf+=#r`t+hilrAJDneHKuurwiYSXq=pOt$0OS#H6qBhAhQK{u_xbl*gJZZGdYFlkn>Ys&Qn( zYVG5UZw}feXdn&wr!XSdi8}R6Tw|RQ&9Ym6-uHE*0$l}4C*OkIBu??oL7hwdL)IoSBB*R8Npahnzhc4b!tgvLS2o2 zTBl>?8SUah1Zwob3#$ik~fqlk!&e$)ydh zHnA*+)`U5eU8uTZPe!Brw&=-=HbvV(@BX#&|0+KYgLt&BlwC_xy0skCzX znZLO9skp03F}sKHN+&)nN#%<2>#Mvd_*H#E+^iZv0DQ~xx=X$91zn~-pRjz7ygbO< z@;e~+QgB-%6w|9zCs>}dzzLO@ROrm{h(z|W}+I28RQh#bHKL>C$FP( zysKRD(zYLRc|*-ixJb>w_BK*rh{@oK(-X?@sUctdRn{kr-XU2h2^J)?hId$t!WyO> zkMc9?-*Rb*8+%?u0eP$@UB)8jSZ2YU-3L|$(|n7;y!wvKFW0i--cL^O>lgj7YbrWb z42H0h71M5^Gv$0#*&=2<>CG;7au&oY_jAvE{5hMchsalPrjTvNNmS+#DMY^ataq+u z3rh$K|HZ)8_jZGcj5@$k@_U8PMk%!8B&=#ZhPQySrAbD#o`r@v!d!yVh6f+hE*Q^d zI*5Hfp8Q*dpT~zCS+a+aeg}pQuvOqft9ANcf;zSFSI{u;Kd4vJZkfm_%vo&75ekrq z8C{%Xw`uX^w@f-Jh6Ney?6W-R=wQxrwrmlkqBft+F-p4~MF(Jw0uUxr|3$#GLfkXd z^SCZBT{q~*+D1`bAPO`LvG0K0Lh;%i+&qAj9I~?fSOA5Dwo+$2xa9|i+5vB8uRlCP zI-J}J#@zBkU2d*+PdctPS7)>Do0@R0rM`#1f@+2vJud)l$+T@PD*v9}e{SPgYKcW- zdM;)b+%>wc?Cyk|eY!m0Gu}DPsXxA(d$QOq;oitTot7=Gi^IO=6@UhT@?39)uPx-1J`Os4e9@z2rmQrg zpVTmE^QR4wVm04w=`l`?oI})yow?Z+nMs(KTZDBIVxrWM(TB-70AfEliWk0edWuNq z_uDOmr36-nH!}F9_7QLpa)<@`J!fhipPE#LgRRNjnI@;9douW>DUQ!fr5uM@a(H4G zK2~B?@qIt5Skh2=qiPEWWOmA@M9yMzDaXgasOsE%6N50@Iz>@nbiA%E{RMOnWo)$e z5~j|PX&ZuHp`C1p5(1^&=o=e`OTUHQB1m@wMWfeb9}O`1bzVGtEy32|Cgd=#b&f{Oy+ z6*O<2DB!v2`F=S2`Res_Pl3Zi|3a=|UUfKXeVj(wImSB)Iui?yL*B?2;5va-VS|iq z939WEAZONQ1po}Iz<7-Jdp0f$4-8xRD7?_AwqIY5<>L@CGj4tkx~4$NWc)%sPt&N~qvk=b27kYF#3R=f3R6 zjhe(b)T6Z)GfZq-;9;tOnuk{Lp&c%8)(+7g^HwInMm-Q+&W52CNV53x6^5E`lg_B7PDr0APkyIFh-025+IhOK zYF&SH_mRT$qg zLSFMAkW+789n3H3{Ef@PhS>F}E5GQ@`t6lu(_iaVfcU`p(Nentf zA)7yK1krNUjpj0rN!h4!U z-re*S;|zDfG~im$Vcird>%{i*a2RwKRao_B z>B|cbi7kId^Ck5$qXpDyd~)snpTS>Wb||4{PrjTCM%T%6?i}}#Zk;XD*SlI~FyJ-w zGo-~ChiAPO89IyC9CnpbE%gC?RBQ`~8rguj5h$5edOsCl;4b(M@?wze*wp(B21On@kQuRuP$T zcaphyj@XJnKaL+G6ptvpT1FCA@qE~5g&_1)^5Knek^z zK+{*rErU0tCTxq|A?-;pFu;j5Ftg^x<7WW`G0L{>LLYFBcqMn;;eh z1^`+c@er_h3gHM<(|+o-T9#*bNSnd+L zQcN&90+Bz!+c@fD0ARjHi=Jb#m)9RKg4+w&iQ!!)kgIhDg1em?gld-MPfY@D{wURG zGO4*N*h%?q^@QU#HX`bu*1$VSGAiRJ-T;6!$o>U^F!hhUR9QqYnry0u2Gv-`SHK|j5pYZb;ubgZ3QGOtNlN&%6+S$qx&Zl25mP znzw_lw_}Ifntm^_qAaj1&60F^f2p$oa{2>i*Hi0=dGq5wn(+25p4ZKS`M@&0gkY9q zeZL!S^N0lhz41uR$Ka(gx1jru8vpG@>qMC;NNm0F+I=2kgMUp$ew;w<(L#Dn$?4kT z-zn~Ex0OZs2JQv7|HhF0i#Rt7Fgh4L*BmS%d^;MRFLUu>`l*)nwkyn|PxnDuY zGpO}ul99p=s+#_DQ*_U0xa_;JpA|~y!=yR5YJeW#L7)!K#S$Ke*a{m*tlh$Kx*4J} zOOjz$Gn?T@4R~cVH&YKYTU$!5FjVGmcU(u@x#WPr`pK=`D(^U?Oi#*VInO7J6-;$| z=M8R^$6tnW=Ke5VdzPGloQtjD|J#ZA)~0~NvxAfmcih(CQCX5K_F|t2_{ibWB^~-G zI4%f_nIrD>g?+q$~yTO{oSoY&%qqirY5sjACfNXvo8zz

b*{Hq>az{aEwl^vuL-ETW!AsvC0U0rmZ$_<6OOxU4rH z6u*cCCrj%CbZzu?LCU+fGt1_K0=ic0aiH8Tv(d}mzpAB)%@%6-6`Lyn zd;=aEyurlO2oEI|CPfQU*p&b-f0^7f+aySv?;0IYmhE8@&azM@s(W+tZ9c5e4!{sX zfiaPRB-x>31b(-@*OX3SfPO={;5>XR!!5^M3})_?`eW3RYLFL4dn&gCRlddq!UZp3 zAO=>+?ALa2%k{;xrD-8Kl++6_#b$F=O!pn7J1$t#B@!$C5)BfdlU5HN(yJrQ%j!dq}rfM(a$o8fv zTp~yzd4j8p6OX6R;`GAwKclI1Fc=V2d+jG|XGUoRj0-i(!+O4aQ6eJQWJVRWoER@>i z1n>F0IMxw9Tw>{kK1i)xicm&1#D5gu{o>fIFIqAt;KD8L+_HrIBbg;wPdL84HblQ)C+~sF>=()-`U*es#QL*>k3l!ZIIv@K;?LQ#Ty`{4Un&{&BHwE!4CHY8s zb9=V6y1JT|m)G4blMWT&;|nz-WC)pfM6;rDh2LXBA-h@)ttSbpP#BK2EA@3v!))k_I4*8zu-(cSeUL5Bkr5o$S)*>_9hh!9tbP63Ei-@-I*%W`U5q{cz|E*9v&Qg5%&dt z8!AqBkj06l=i^H)WY~-BjUhDa&H65JxDC=MS2hEuZ%EK2A?7il=<>wG#%6A#1e`7} zo5c3NGd9MIpFdt|q97+9fkL^>J9E;~(sFV}If_$KQp(F&<9&f+WOeBp)6DcfK(mM& ze>?Fg>6w+b&jHPHL|?21Nq6=$)R_j15nrFPD&Eh{H+?w}3v;%(RKEj$S!Mmq@NT8ky{N_Eq*cDRbAP`cP^8&pSqLb}@=d)^ojf1TGW= zuDwy*%gkJ?v!NjzhLx@$bKNNM;+5*d$YJ{zRg=C4TI5VM%m4OPr0(G0(9qICd@hXL z6;g5pN&P^^55gwB`9sbgRWKHhJBqdJyXfNrVPqfmezre`PZKHj!qWT@RALZRSPem- z5^p>^3k%wi;p4v4Z=Si@6@b5-guorPcC*_oI4o%WW^tQ)ge-JewU zoM=ex0>Ge^j5r+xnPav+yv)pKieCIzX%!U}w>)7m)}-_ukaFHzgi{wn7|G+5d1`x{ zr0MDDe;+en1TZl%d6)d(P0|sYq|2Usd$A8zE|HZaJf;mTq1MY{WzY(4=jWC?_Z)ui z@>{sQ6=vuSQ-CWdD5!~KaGABg4jtowUSD0oe{hF#+VlZ6_-BZIr3cSO`wR8M!;{5P z&L`WkhATD9p3M{ij5184NkCuY_wR=axPKtim(fa;f|ateva@{@{tu8YWZ2ay=;maF z@I8Y{2+_`OGnrC+00CB2FlwY`K?fuLs|<{990C|AWwK^5>2yB&!-s3o^|_v60eW*D zIjtPRgt>3DR2cA-q_psKZU(LJb|M7&gXFocbeWR(9K=jXv^Lt>+AmBjhJYXLEZjwN z+nG?T)i-~9YWJt}VS|-;lcg9Ywm)@XEfNnH|K<+Qy|wV4V^-iM73T;2p2BISVy&?R z+1aH=A{%|~ffA*ZDM)@p;7A)n;Gi}8<&9~TNoV)C((aRbW?*bgQDa%hL7|zz%%BzP zuZ%##mOR&z{*e+*!tvud{eI$Xe0+SIGM?-7tqIz>evMhj2x3da=m*aUR&H)TZ=~T$ zd9w*K#Vqo7GbmxG5D`KfMypV%*cRFuFp1Th#7&c_utafC6s0V@hnSEh6l=z zyt|W)LV62R*F7WzlgwF660sK-1E$zj*x_n>RjMHUIn zT8DC98iDbqIji4HQ0M-xXPE&3r(Lq+XgHPm=VWNyYhSJuNN)-bXyYYA4KX}?A-WZN zb>rEFp@zUGz?aO1V9cg zUQ<9y0QWk|6g3&X#u-3#Q6+3YbxzWQ4Ypf`Hc&YieLT8y*|r}!5T0qtpq1Oc+OD4C ziyrZ5{q-B}`y>Zb62pg))goLh&hEpb72S9zFOnb6KRi8D{r<8C1+?27}e0s3aI$1Q*m6Z`| z$9mVvQ^)P17IbJq=TXIentF%@*UeafK^jUZM zY%xzfxFw$W;#g%ScC@RLJViv{{DLp_=ziV&AZ?_bDw%!_85R^+K&$c+cC`b7;gf^! zdkf+K++yzA!7U(VlTN^zS(Dh!w$apvnxHq?H_9PLvkrmBv6taxYGR@0E&bY$Jxn`^ z=%9sJCCM_P>1ycq+bfLYH{4p6!&4Tkb*@^gP_cSk(^iEz7E+LhakO54^8zbDujJO_*>BO_v$z zj4LH+Ds`DR|4;;TMfm!oSDjZ-&`LOgx+g|WEv+_0b z`B9yb=ef5Ik~F%XVxI9y;y5N!Nll=ggAuL{8xrbj76_0td5R|R>l;2Cfzn=3!d;Tg zH0#m>fYa6$rzGjzU3HJ%hU1Bn!%yO6*k-7#&+0A@tKgsc{ck9_A!uFh7yJE-kH^XH zthZn0>y9|4+em&Hl=vTnhm_+q(-x^$JEaDWqgv>riK>>G`411%0U!7QNTNZop)^vXVh`0e*yCO;tD%bx59ow#0oplpi`6f zY~gW~ldgiAr6oZJSpww3S40G^TrRSUENHG~msvj@=;JJ-b1j`ZSji?Ee zLTl2nAyhWMHZ3iUzksZ{!}?{2zVfqu5>Y~5@~9WF(^_a;b~E&z=QvCjw|5WNejE?; z{%reMvCHi`dto8d?R}82^=I3&WL#s(LB292YEg%0BERP|DVnt?s>gftiWB$s=Nbvd z=SUbyI<#ttj~x{S{u2T!Q2RFLG*^wk1i9**7zqh7h@5Gl>9xo#|6N~n$3bb;6VgFN zUzJ8^$nWgB*Ikyg?flq8)>h{1cvk?-rpolPY!0(GM!SOzXP)Y2)R$YiF3cd026Zgt zC$-2(vYvx-rJwev4#xy9N*bz{jirO3CfZV~CgeytlXU)Ef;V1Vt6J?s=q7 z=djU<1Y;vHrhH(A>JE~{)8;^F*eLe7O7b%gL#p|Ep;tpwO&~;P>{6;M#4_XfS--bT zEYZIdr}5mCRMMM&O}DlQ6Ni^>a7I$R%&KRyH7)Pr_G{OY?5)>8+e3}RjDg&&Hhxi12ACsFKf`f z7oYv-$yT{+T$4%p1=MQOd3No39a3SnDEYVOLS7{rc{wd@iSWE>-p@m$%r#o02ziO% zxSH&+4z!y~N?Q zoNX(k9_6Cxns2M!L>{r^m_I8Tcf zb}|n5Q3iXZAGJYRPf|ojKYn^}?zDp~9{^7qdg++dm&hou72(25PwkVg{v+vvH1|(V zZTY~N<{za>gyBEcYJXDDYhUqd5=9N`TIFpYkmjC}Wv0L1QF^n3MhFlZVwMZM8>jvG zc8j=_#^DgaDeevn1;A16ClmhZUAZw+BJO|7GvJ0_=j9@hPU0u26PbDX zQwosiGyh(|WsVhbh7B7VSM#^2+bq^7=g9m=hABYDPgecGAu$(OENNcD;k)pY6W93} z{o=)u5!DB6WD$7xgnuu7CS28A_MgzhT{@DDctf8{@&8fwUBv4B?w2@UQwv)(U58s+ z>L-e-FMaZbnb5scP*iU^!5_+F|`*or!y+O+GPRrl6W9d9hq!*i@F(^6WPi+`|1oe#XHM#V8H?3VEHJp-9MA2BWM&*oupsHc!G$ zIl7T+C&KU#W><18`npZ12wP^0?we&E%f*<#SDY9E*M>ei&)MOq5yfCnX@Y`f~9Nw$HcbW(91%)zevdoylqjmA@%P2At{~42)X&EiW?+*+-4v4Ycp!@dWvw zDgBqLm`+2=~Fdb&CFawyt!AknMLEA8XK%Aupv%7KBaJv3dUU~F zDnhkLRK0fs$mi3UOTj*Aqy7ON6&X^UKXq(73j#;3Um*(6a7w=Eb&`O@KbAb|FG5l5 z@1^u!`!0@ondd;Z;zY&k>0abQ{OZ~A%;vBnGk7d#l4-^k?+a$ESC=ES;2A|LIw+sG zov|H??43x6y?*(tHMoJ0&o49co4MN#Rz_Y6vX6e z-(5!8HguEgP@N24RWa6d`e#;0fe(FSLq%Bx^b6%W3e2L;B^-)861&F4|)pMSa)fA5d%70C71M6))P z@6i^+GmhDfM`)-_;NQtQtm#tp>BTTUxJM5ND88t#K~=eB4*1M?e{-tjjU*7!-i@fI z1OK@F9K%`!K$E_XgkzH6ncXhYx+T$6AO;}gM<%e&Bg)$WXxf1q8@o*ynQp zYOfb;D0%56T7))UhDk!_V{bZDXuC|Hatfm5`Sk|heaUkQ4+GhwK!Ady$P(q>(9pkb zXk=u>^>o|eHA?VUb+Q?^S-X9b&=9V~`K1fl4;eWigu`zNPn6y5&tIe;*}Ov(ut@TM zQG6T}*(ppat0YdXMG1(TCjEyY5rKi}HS#1o;&8mf4~Y}wxFj4D1pp`?RzP^Q*`u1^ z+7CH=y)dE^(W%v>rJTa3etdjF^$1sc`vS!2@rb?P}6)hsEi*@mn$*rsZ z*JfPQrK6anuKW4(vrA?lGMd2=a|$k6h-LJAAtTMlC75cSiZj&6P7!sI%c0aCFCn&_ zaw0M}v%sR}WI`hFLD>DRdboJN4l-IZz@+>2#LXSmU)?JFXaW!aQqmm<)w~WAnW$&8 zO06QprL)YG)PHgvYRjT^Cx2nrbs!rfMl1Wtp(E@8wGf-nc%bO#NzDYpej0D?x4Vl5 z>m)%{(S?aP5eP~xF_48ah}6gc{lcH2I-?jlkMGVt+md@3Yx}V)kSbG6R&v++l4&6SN}?GZ zRdZTx5P5hf?(j7jkpe_LZf8E*#8~F#!JL+s`~$ggf;}>kXtlZ;G5`Fg%3Njq=b<&l zU>uvr=7(hE?<{hSeL-8xBbhI9>Yytcel^R1t$?rf&cX~r`L^i=o=O^IOom_Dd{qUJ zail2X-MQHDJkJBL`vp2MOTG)`p?pgp>l(&y%MI_{_LSQNCk`w3YSyDK0DjbJ@_kjH z;~sf4NKJJ26B_xmzpX--4KG(+W{l;!bSMkmne469Ugk|SEIl8^SpJSU@$a*kq(bN30OYWo%wjL35S$m2|v-vCEV z9;fQiEDv%U61L=z%FBOS5sN7^W_wf@xm}`e6~Qx(V3xYgj5KlI_KNU67`+1Y1GMbU zJCM?69K(%tleG#o%!G9113xSRR8o@6+FDyr)PDtYxdf^ND7r|>3+m2t;eOlHAbwrs zbw8)tp{`?#N>Hy>Vw#I7(z02B0x^N^}%SwYLlWp@+i|) zatj!bQnjjCdTV?pg>rnxS44WT0OEQfm>^wgO2=?0i6_}Y_~e$TTEI%|SPD1@R>bq< zg2`!ar%7_C%Kl<)qLZQSw{jsf^Jc+~V#S-%V{$ng&!1vV3q-tD?feCew$g(`diU5! zW=HzyUb}&!#!sNpq;x+tBf*c`0eX-_G$KL-Wq=;r!YaE6?I+d zJP4v zYwZ20rc)i-xvV)D@&Z76bEK3vf9%rU&<65}(H%_@)zH<-)#%-2Dn595eqv$TAnBkM z^?WTC_!ofY$wQ{V_+6uP$VBR2BBM`Sg;4ED@K2Etf1mSu{D-HS(;C?LO{??a92!_V z^fEQ&{q6@vX}el^h4NG4kf=6kDcv)sPjqb5d5K=xaT0#lv=c#($wC>ad^E@~Mm@Gg z*#Dobs?9oLE`6UK;Mo!1-gn+^VhULP-@Na-+)QVz4a;9j(o@sY!kuLImJ|A44rgn` zIu*tSH};M!Wk)1otS&LGhX;^ipQFMHRsVIpn(Nv(l(f-B@=!QB7Ef`Ftz2%qq+RF( z?YerZIHz%hxh0M{&AUy=+ar(f#0%E`)axho@(%&|?>IU;FY$xcE`Odt=|Q8V#;qCF^rc~|!; z$03QC1fa!sN2;rnk3x_e@|#I(4czUYba3DZ(ZWR-w~yzV%!jnS zI=|~Z2r@9^K6cOV9SQpw{wF37N%lAT=kQO~$#=au6eB#p?KtpWTcCmd!iM34ElUM` zT%NWTfA6=o639Q!#xt%X%4G|l@4IemhMEa^QItX%L_qY$Ma<64;qt#U2v=WU9$EjA z9y*uPxeXDO#I3#AAZpSPWa_)nnPJ12t%$=BrW6EHBz%c#iB`PC#H;UpUmx|IqEa}R z7rrqO^$_=QQo2H5f_61(&4qg)TW+IrnFGPhZ{~x4OK4gEcN(vBVXo1T=ck8fCUp6g%z?@m#P*^>KMXZd7=E>JyreSU^X zm&dee)0)ofFnxNm&F9I#?R$;Wa-}&AZ>SGmSY7Xaa?bw=^DkUntS0V%@Z1ESqs_;8 zB%Kt!IXVxTp73@|usNa7{M#zezDcJxbX|GuADdvInV)}7{OoD<@}Bi=_79OW>$m?g z`@eA2+2Y#lhUZV79p>-|Dl~EXVb}it@|S0quN(C$Xw0z|zW3|pzC7=e*S+%Ht15O} z@PGbzli_EFo6LXr8F5J6UioSE_0JD~Z_+CHU^$2X`F*{(@yrtv}nS5&!vBR_42NAzV-A%y8Q(dUenH`-^_q-7HNxz5MeY)8FOa zr*FOXrR@Ixx_i}SR>BV~r~Y)K1J1J{=R9QKWpYm{_9*M9=UPf z#iNJjFFzo6UDuJ@{{7O=r)w`>J9m0ZzP{XlyB||7|J(VuaDhQ-V3hUo-W%6agW2V_ zWJdk46ezQe-oO8ud;g7vb(?Rxn7;qL{e#Wx+}mI`=qZ5}=ncW#H{L8@?Uj_5D>q|nKA5%jk{U=wX7;6)2FF{BBqTqj@vwYd~H*~w%fp*k;|sH>+@1|w*I$?a-V1P zd+48%X}y>+<)EMxODP*S$b{vqQy*sV>MiBYSk->?!91O=^h+_kcTZn8ykpo_c_!IT zX|G7RN!Ox^y1HxWv*+ip+-container1 -vlan10192.168.1.2/24eth0 -802.1qtrunkNetworkRouter (gateway)vlan10 -192.168.1.1/24vlan20172.16.1.1/24vlan3010.1.1.1/16eth0.10eth0.20container2 -vlan20172.16.1.2/24container3 -vlan3010.1.1.2/16eth0.30DockerHost \ No newline at end of file diff --git a/vendor/github.com/docker/docker/experimental/images/vlans-deeper-look.gliffy b/vendor/github.com/docker/docker/experimental/images/vlans-deeper-look.gliffy deleted file mode 100644 index 4d9f2761c..000000000 --- a/vendor/github.com/docker/docker/experimental/images/vlans-deeper-look.gliffy +++ /dev/null @@ -1 +0,0 @@ -{"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":566,"height":581,"nodeIndex":500,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":false,"drawingGuidesOn":false,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"maxWidth":5000,"maxHeight":5000,"themeData":{"uid":"com.gliffy.theme.beach_day","name":"Beach Day","shape":{"primary":{"strokeWidth":2,"strokeColor":"#00A4DA","fillColor":"#AEE4F4","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#004257"}},"secondary":{"strokeWidth":2,"strokeColor":"#CDB25E","fillColor":"#EACF81","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#332D1A"}},"tertiary":{"strokeWidth":2,"strokeColor":"#FFBE00","fillColor":"#FFF1CB","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#000000"}},"highlight":{"strokeWidth":2,"strokeColor":"#00A4DA","fillColor":"#00A4DA","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#ffffff"}}},"line":{"strokeWidth":2,"strokeColor":"#00A4DA","fillColor":"none","arrowType":2,"interpolationType":"quadratic","cornerRadius":0,"text":{"color":"#002248"}},"text":{"color":"#002248"},"stage":{"color":"#FFFFFF"}},"viewportType":"default","fitBB":{"min":{"x":-3,"y":-1.0100878848684474},"max":{"x":566,"y":581}},"printModel":{"pageSize":"a4","portrait":false,"fitToOnePage":false,"displayPageBreaks":false},"objects":[{"x":-5.0,"y":-1.0100878848684474,"rotation":0.0,"id":499,"width":569.0,"height":582.0100878848684,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":103,"lockAspectRatio":false,"lockShape":false,"children":[{"x":374.0,"y":44.510087884868476,"rotation":0.0,"id":497,"width":145.0,"height":32.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":101,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Network & other

Docker Hosts

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":157.40277777777783,"y":108.18042331083174,"rotation":0.0,"id":492,"width":121.19444444444446,"height":256.03113588084784,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":99,"lockAspectRatio":false,"lockShape":false,"children":[{"x":-126.13675213675185,"y":31.971494223140525,"rotation":180.0,"id":453,"width":11.1452323717951,"height":61.19357171974171,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":57,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":6.0,"strokeColor":"#38761d","fillColor":"#38761d","dashStyle":"1.0,1.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[-121.4915197649562,-156.36606993796556],[-121.49151976495622,-99.52846483047983],[-229.68596420939843,-99.52846483047591],[-229.68596420939843,-34.22088765589871]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":289.82598824786317,"y":137.23816896148608,"rotation":180.0,"id":454,"width":11.1452323717951,"height":61.19357171974171,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":55,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":6.0,"strokeColor":"#38761d","fillColor":"#38761d","dashStyle":"1.0,1.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[291.05455395299924,191.93174068122784],[291.05455395299924,106.06051735724502],[186.27677617521402,106.06051735724502],[186.27677617521402,69.78655839914467]],"lockSegments":{},"ortho":true}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":372.0,"y":332.0100878848684,"rotation":0.0,"id":490,"width":144.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":97,"lockAspectRatio":false,"lockShape":false,"children":[{"x":0.0,"y":9.5,"rotation":0.0,"id":365,"width":141.0,"height":40.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":98,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

 Parent: eth0.30

VLAN: 30

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":0.0,"rotation":0.0,"id":342,"width":144.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":96,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#eb6c6c","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.99,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":52.0,"y":332.0100878848684,"rotation":0.0,"id":489,"width":144.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":92,"lockAspectRatio":false,"lockShape":false,"children":[{"x":1.0,"y":10.5,"rotation":0.0,"id":367,"width":138.0,"height":40.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":93,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Parent: eth0.10

VLAN ID: 10

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":0.0,"rotation":0.0,"id":340,"width":144.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":91,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#5fcc5a","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.99,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":289.40277777777794,"y":126.43727235088903,"rotation":0.0,"id":486,"width":121.19444444444446,"height":250.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":88,"lockAspectRatio":false,"lockShape":false,"children":[{"x":236.18596420940128,"y":158.89044937932732,"rotation":0.0,"id":449,"width":11.1452323717951,"height":59.50782702798556,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":53,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":6.0,"strokeColor":"#cc0000","fillColor":"#cc0000","dashStyle":"1.0,1.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[-121.49151976495682,-152.05853787273531],[-121.49151976495682,-81.64750068755309],[-229.68596420940125,-81.64750068755139],[-229.68596420940125,-33.27817949077674]],"lockSegments":{},"ortho":true}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":-179.77677617521388,"y":56.523633779319084,"rotation":0.0,"id":450,"width":11.1452323717951,"height":59.50782702798556,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":51,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":6.0,"strokeColor":"#cc0000","fillColor":"#cc0000","dashStyle":"1.0,1.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":10.0,"controlPath":[[291.0545539529992,186.6444547140887],[291.0545539529992,117.79470574474337],[186.276776175214,117.79470574474337],[186.276776175214,67.8640963321146]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":447.0,"y":150.01008788486848,"rotation":0.0,"id":472,"width":46.99999999999994,"height":27.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":87,"lockAspectRatio":false,"lockShape":false,"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":473,"width":37.09803921568625,"height":18.000000000000004,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":86,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#666666","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":5.485490196078445,"y":5.153846153846132,"rotation":0.0,"id":474,"width":37.09803921568625,"height":18.000000000000004,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":84,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#666666","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":9.901960784313701,"y":9.0,"rotation":0.0,"id":475,"width":37.09803921568625,"height":18.000000000000004,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":82,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#666666","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":368.0,"y":101.71008483311067,"rotation":0.0,"id":477,"width":140.0,"height":56.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":80,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Gateway 10.1.30.1

  and other containers on the same VLAN/subnet

 

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":350.51767083236393,"y":87.47159983339776,"rotation":0.0,"id":478,"width":175.20345848455912,"height":73.0,"uid":"com.gliffy.shape.cisco.cisco_v1.storage.cloud","order":79,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.cisco.cisco_v1.storage.cloud","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#cc0000","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":94.0,"y":155.01008788486848,"rotation":0.0,"id":463,"width":46.99999999999994,"height":27.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":78,"lockAspectRatio":false,"lockShape":false,"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":464,"width":37.09803921568625,"height":18.000000000000004,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":77,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#666666","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":5.485490196078445,"y":5.153846153846132,"rotation":0.0,"id":465,"width":37.09803921568625,"height":18.000000000000004,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":75,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#666666","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":9.901960784313701,"y":9.0,"rotation":0.0,"id":466,"width":37.09803921568625,"height":18.000000000000004,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":73,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#666666","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":80.0,"y":109.71008483311067,"rotation":0.0,"id":468,"width":140.0,"height":56.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":71,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Gateway 10.1.10.1

  and other containers on the same VLAN/subnet

 

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":62.51767083236396,"y":95.47159983339776,"rotation":0.0,"id":469,"width":175.20345848455912,"height":73.0,"uid":"com.gliffy.shape.cisco.cisco_v1.storage.cloud","order":70,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.cisco.cisco_v1.storage.cloud","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#38761d","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":341.0,"y":40.010087884868476,"rotation":0.0,"id":460,"width":46.99999999999994,"height":27.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":69,"lockAspectRatio":false,"lockShape":false,"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":417,"width":37.09803921568625,"height":18.000000000000004,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":68,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#666666","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":5.485490196078445,"y":5.153846153846132,"rotation":0.0,"id":418,"width":37.09803921568625,"height":18.000000000000004,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":66,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#666666","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":9.901960784313701,"y":9.0,"rotation":0.0,"id":419,"width":37.09803921568625,"height":18.000000000000004,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":64,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#666666","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":198.51767083236396,"y":41.471599833397754,"rotation":0.0,"id":459,"width":175.20345848455912,"height":79.73848499971291,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":62,"lockAspectRatio":false,"lockShape":false,"children":[{"x":17.482329167636067,"y":14.23848499971291,"rotation":0.0,"id":458,"width":140.0,"height":56.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":61,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Gateway 10.1.20.1

  and other containers on the same VLAN/subnet

 

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":0.0,"rotation":0.0,"id":330,"width":175.20345848455912,"height":73.0,"uid":"com.gliffy.shape.cisco.cisco_v1.storage.cloud","order":59,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.cisco.cisco_v1.storage.cloud","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#ff9900","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":279.0,"y":129.01008788486848,"rotation":0.0,"id":440,"width":5.0,"height":227.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":49,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":6.0,"strokeColor":"#ff9900","fillColor":"#ff9900","dashStyle":"1.0,1.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[4.000000000000057,-25.08952732449731],[4.000000000000114,176.01117206537933]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":56.0,"y":503.0913886978766,"rotation":0.0,"id":386,"width":135.0,"height":20.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":48,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Frontend

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":62.0,"y":420.0100878848684,"rotation":0.0,"id":381,"width":120.0,"height":74.18803418803415,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":41,"lockAspectRatio":false,"lockShape":false,"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":382,"width":102.08955223880598,"height":54.91841491841488,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":44,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.97,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0417910447761187,"y":0.0,"rotation":0.0,"id":383,"width":98.00597014925374,"height":44.0,"uid":null,"order":47,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Container(s)

Eth0 10.1.10.0/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":8.955223880597016,"y":9.634809634809635,"rotation":0.0,"id":384,"width":102.08955223880598,"height":54.91841491841488,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":42,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.97,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":17.910447761194032,"y":19.26961926961927,"rotation":0.0,"id":385,"width":102.08955223880598,"height":54.91841491841488,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":40,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.97,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":382.0,"y":420.0100878848684,"rotation":0.0,"id":376,"width":120.0,"height":74.18803418803415,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":31,"lockAspectRatio":false,"lockShape":false,"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":377,"width":102.08955223880598,"height":54.91841491841488,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":34,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.97,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0417910447761187,"y":0.0,"rotation":0.0,"id":378,"width":98.00597014925374,"height":44.0,"uid":null,"order":37,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Container(s)

Eth0 10.1.30.0/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":8.955223880597016,"y":9.634809634809635,"rotation":0.0,"id":379,"width":102.08955223880598,"height":54.91841491841488,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":32,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.97,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":17.910447761194032,"y":19.26961926961927,"rotation":0.0,"id":380,"width":102.08955223880598,"height":54.91841491841488,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":30,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.97,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":214.0,"y":503.0100878848685,"rotation":0.0,"id":374,"width":135.0,"height":20.162601626016258,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":27,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Backend

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":376.0,"y":502.0100878848684,"rotation":0.0,"id":373,"width":135.0,"height":20.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":26,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Credit Cards

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":627.0,"y":99.94304076572786,"rotation":0.0,"id":364,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":25,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":363,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":342,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-183.0,310.0670471191406],[-183.0,292.0670471191406]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":372.0,"y":410.0100878848684,"rotation":0.0,"id":363,"width":144.0,"height":117.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":24,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#eb6c6c","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.99,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":218.0,"y":341.5100878848684,"rotation":0.0,"id":366,"width":132.0,"height":40.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":23,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Parent: eth0.20

VLAN ID: 20

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":297.0,"y":89.94304076572786,"rotation":0.0,"id":356,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":22,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":353,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":343,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-13.0,320.0670471191406],[-13.0,302.0670471191406]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":222.0,"y":420.0100878848684,"rotation":0.0,"id":348,"width":120.0,"height":74.18803418803415,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":21,"lockAspectRatio":false,"lockShape":false,"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":349,"width":102.08955223880598,"height":54.91841491841488,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":17,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.97,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[{"x":2.0417910447761187,"y":0.0,"rotation":0.0,"id":350,"width":98.00597014925374,"height":44.0,"uid":null,"order":20,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Container(s)

Eth0 10.1.20.0/24

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":8.955223880597016,"y":9.634809634809635,"rotation":0.0,"id":351,"width":102.08955223880598,"height":54.91841491841488,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":15,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.97,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":17.910447761194032,"y":19.26961926961927,"rotation":0.0,"id":352,"width":102.08955223880598,"height":54.91841491841488,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":13,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#4cacf5","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.97,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":212.0,"y":410.0100878848684,"rotation":0.0,"id":353,"width":144.0,"height":119.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":11,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#fca13f","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.99,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":212.0,"y":332.0100878848684,"rotation":0.0,"id":343,"width":144.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":10,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#fca13f","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.99,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":203.0,"y":307.5100878848684,"rotation":0.0,"id":333,"width":160.0,"height":22.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":9,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

eth0 Interface

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":303.0,"y":240.51008788486845,"rotation":0.0,"id":323,"width":261.0,"height":48.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":8,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

802.1Q Trunk - can be a single Ethernet link or Multiple Bonded Ethernet links

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":36.0,"y":291.0100878848684,"rotation":0.0,"id":290,"width":497.0,"height":80.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":7,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#cccccc","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":1.0,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":0.0,"y":543.5100878848684,"rotation":0.0,"id":282,"width":569.0,"height":32.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":6,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"

Docker Host: Frontend, Backend & Credit Card App Tiers are Isolated but can still communicate inside parent interface or any other Docker hosts using the VLAN ID

","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":-33.0,"y":79.94304076572786,"rotation":0.0,"id":269,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":5,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":345,"py":0.0,"px":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":340,"py":1.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":1.0,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[157.0,330.0670471191406],[157.0,312.0670471191406]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":52.0,"y":410.0100878848684,"rotation":0.0,"id":345,"width":144.0,"height":119.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":4,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1.0,"strokeColor":"#434343","fillColor":"#5fcc5a","gradient":false,"dashStyle":null,"dropShadow":true,"state":0,"opacity":0.99,"shadowX":4.0,"shadowY":4.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":20.0,"y":323.0100878848684,"rotation":0.0,"id":276,"width":531.0,"height":259.0,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","order":3,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#434343","fillColor":"#c5e4fc","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":0.93,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":19.609892022503004,"y":20.27621073737908,"rotation":355.62347411485274,"id":246,"width":540.0106597126834,"height":225.00000000000003,"uid":"com.gliffy.shape.cisco.cisco_v1.storage.cloud","order":2,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.cisco.cisco_v1.storage.cloud","strokeWidth":2.0,"strokeColor":"#333333","fillColor":"#999999","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":1.0,"y":99.94304076572786,"rotation":0.0,"id":394,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":1,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":3.0,"strokeColor":"#666666","fillColor":"#999999","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[261.0,233.5670471191406],[261.0,108.05111187584177]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"},{"x":44.0,"y":90.94304076572786,"rotation":0.0,"id":481,"width":100.0,"height":100.0,"uid":"com.gliffy.shape.uml.uml_v2.sequence.anchor_line","order":0,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Line","Line":{"strokeWidth":3.0,"strokeColor":"#666666","fillColor":"#999999","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[261.0,233.56704711914062],[261.0,108.05111187584174]],"lockSegments":{},"ortho":false}},"linkMap":[],"hidden":false,"layerId":"9wom3rMkTrb3"}],"hidden":false,"layerId":"9wom3rMkTrb3"}],"layers":[{"guid":"9wom3rMkTrb3","order":0,"name":"Layer 0","active":true,"locked":false,"visible":true,"nodeIndex":104}],"shapeStyles":{},"lineStyles":{"global":{"fill":"#999999","stroke":"#38761d","strokeWidth":3,"dashStyle":"1.0,1.0","orthoMode":2}},"textStyles":{"global":{"bold":true,"face":"Arial","size":"14px","color":"#000000"}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default","com.gliffy.libraries.images","com.gliffy.libraries.network.network_v4.home","com.gliffy.libraries.network.network_v4.business","com.gliffy.libraries.network.network_v4.rack","com.gliffy.libraries.network.network_v3.home","com.gliffy.libraries.network.network_v3.business","com.gliffy.libraries.network.network_v3.rack"],"lastSerialized":1458117295143,"analyticsProduct":"Confluence"},"embeddedResources":{"index":0,"resources":[]}} \ No newline at end of file diff --git a/vendor/github.com/docker/docker/experimental/images/vlans-deeper-look.png b/vendor/github.com/docker/docker/experimental/images/vlans-deeper-look.png deleted file mode 100644 index 32d95f600e1d0f028e5a354584d7b3eac1639e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38837 zcmV(?K-a&CP)`~Uy{|NsBV<^9ae%>V!XU&~tip+HNj^66}A$mRQ)nVITrYtHNc(eD3Esqa*> z`kbAd%gf76to6~-(lK|cWX@pB=>GHa@o3Xzg_^4Ws!jc*N5S0jld8K^uJzT`)$ek1 zjEs!W&(7fC;Fgw^`k+76^8b5_oPvUbLqS5dw6u?pkKFqIl9H1A{QJh>@4UUdh>3~o zZf_bI8wCUeRju;(_xAs-RR8+*@o{lbulell>t$t)3OtT%C;^muqGbEMhb*uuoa zthc;2H8U@1m?bADOrYYNL_*Bw_Ge{V*N8X=7YhCG-9?x^NsPS9$HfQ|DjO?231S5M zlL5N}0aL3>H+?Qtsp(QsPhQMaGY|=~Zwi2)wv~;4X@!Z;naVZ8!1Fgf;UAc;zXuVure|>tOWE~Z8pARn$o3h1ObAbNj!%u^* z_5J^CTT#Z>-^Nl<{-!W<+HSAO-u~F8IZIryPE6BPOvND_pf4@y_4@7P*??SStj416 zXk>tnp?7p^5>${_Fg7T04AS7|-0SlB;o#|%K{jY`-gbA9fN4Oe^_8!W{kmp&I5V+7}GvKNhH!eJfrZ;)8=# zpwqakn3Tfhgs;~cM<7#nn}SJ8E;MGj>e#%;Zg8JfSz4 zvp_CT_#;99000DZQchF9>dx@GGiCe$0F;4AL_t(|USeQi8bn|eFfcF!*t2>a$5|-4 zqi+-{DqATiEeu5j0zpGVL+6shegeP$D|}pn2ahA~{O#-}nH(wBHO4^h(YZg#^A+KN z|9(9^qXjyfdTZ6k`BKNgy1XfuI#}PWcKuvVT6W&stlrk;s=3{#zPlN!uhga2huH31 zr`8S1DKDn%eDlluV%M`h{dz*^`D*Y05VF|C*xY@XF0?m}R`!QiLc3?IW1l)P+Mkbp zJBq5g|83EGj)%%QDk1j+RInXOmzz<@tvi4Bp-w>P4brX&x2%xY?$pi^;{7l%Hg?BD zJ55Fi5fg+k(=;FYt{WK}yeAHAS9uWfbzKxoYd3T=I6sC4b7@Z&KojH&aBl%8i9-}- z?#F>Rt(WBXR7!D<-vZ}KCSI)MO^Bvvo}kYOP2n|+wT0-Tfup(p2GARf>`j9s%Aww&IJlPEu;7F=CZlaivP(gV@h;xvwx6ru^ zBi^&_U_fL%zq?{Zo@g+g&zw9$)^C)i6B$@iaQqn!=86J%h^FnBcY0rpJJ~^##7rU? z7Lv=t9CnGVe@zLhxET65jbUYDjyRLi6sJMZk+@VyPOp6Q@%}}Vp)&zXOA9BNYAhHk zPJdsifqsfY+%N|TiD4C?WD`w0`Wlr`!dH43t^GJfZmHyz6Tx(urgNIZIt%KOUYC`PTk=3+Npo2+fSsJMp3%#W~E`ov*Wx}10c*&ublvv zD(EoR5fj}jA^9-=5MTTQ=@$bRPJd^w>3lD^m1R$=xB^95O1JfLE$*m=hd7#awnFfI zD#V+HQuQK@#*E(m9aYYO(j{^!UfN2$gQhf?l2RVc(U;ow-jcc=gjz}}MQNDWSs4iZ z4QaYAlx(tTHvtlGHaP&VI~l3qsOa7lf(Ee)RZ5I*lP$iT6L-Wka{_sTCNl%-ybxkS z{t@#Gc&aLK(%N8{yDNnZLN0Vz8e5P4MVCgHiRyGxA)0AEbR!!|!|8N_D?jwJu5Tw3 zv9+~D;>yZq8tz6Ry2T}RC@Mi5{|t`x9rOAf6MZ*DzETR8mK$;(g!pI|I=C40hySKR ze=5<`MRq%#)fm!_O{IO!P!_lD_6gA)x8?gNGkhtFBlKPW4et}=M9$5q~;`woA^t;vy%i+#cf9f8d^Z zV~m=iGPKnzl@IPxpFdq)BZwWkg2s*;a^6+|hOh!Q3PzYLXneSv>ksi2fn>g0Y58;cav6&vtV5QuTJq=C zm1`|!Ie<(`5OwqQ=`#o6@>%<_hB!pK!*EQz0`XHN1fd_*ht{k7BmmmSpz(ib^o7go zvDk1~Mz#4W4|l7#>`DgLB;>vop=0fFoTu5Qd+vVz2o=M3%K1b(Ft6j^Pl02_e zl{{XD%7=@n;Xj!N;e0IiK{D(!jjy)Rf4VBDuw4Ei7W+k#G9GTKLCEPlP#(xND$UOIFwfcCXm6$eA6lTk6? zgGW%3QCeQ%P;l6+V8SQoKg7*AoY$P$a9HtgvB@6pmUVF)iW8rrDph5@wFx{db^Oj>2+;FE)9P6>}*CMg!%4=uCb!zbdotnVpiV-AAKL4T%m(quY4lYl}fqj z2MGl5-=OqBRY*~y>1&w@%HY6K^{g9{oQ;E)2eSb|VAO+d9(K znF`IM3iN7;?&#}(NjHAfHg&sFm`Ne$)6im&zB&c~;R)vU7ZJP{zPm)O(CJ(%G|@`_ zYbg-lD8(BKw=a@_!JTqz%I8m>5Tr`O>har@O6%@vI;zdK2%d;FL}KuoSH)^6Q{Cwz zL-j6;_Y`3)_Q3L3mo>wUjwvgG(9OdT(niiOZK0W{lV05nlJh~)DN5H%*s^Si;B15< zb9*}hfEJ^Zx!~<505ZJ{Z|IME+o*|tSZNK!C6T^fkj{e&tM03~0G+r(C@$o(xb?gN z9;Wc97`{T7&#BxS%6_vYVn(y4fATDF0B?+~=n+AAl-Crqe~{ z%h1errt?WDcztsr+A$OTr_5A5ajcMwusFR&?*O2!=%Ym@`UoH#U-HaG6TPjIaZHGa z6;kMYSdgCRjpDMY0pcm{q!q$N1cx$CSu|xRGV#0YBu`L>?AU16ZaLOnhAI#o7)=aj z*ny!Q*IH?{Ckx#8?cCfif43i(22Da1Q|Z9$bb3Bcw|wt+R8#?q{fS=7nJA%xwpdbZ}wzdF4J{#GU!eEC=lwfh8mJTOLdHt~K- zHWP0m{A=mbCxP~KAzShbll6&=hXSgXxtf`{H@Xc->AY(IzQ1oT#&b)((IJ3&iN;%? zd_HdHHy8Hd(uFeyA;%AoI%c{3ETEH72v_g-x*g{95SNuZ(jpk72qal`BHVKY+3UFC zr=8n{(Y2Av$e)UC@rkYcOL?J z*((j{Z@c{L^uaI)LAwnP0#sFp($DS>gN=~hjOmRhtX|cKIJgraL`@Jl%=Ew8A0gSJ zJI``ViTrjG(m&)|9KBg^^eu5Nd%Q8%*3er_`9Dg}J4VL69b2yeW96zs$Wj6Te3%db zR1_cn;f{QF5&$w9AqcqfTZ0GT&S1q<2m*p6Nw%u3d0sbLhVFSDfFmjMRE=Ip+6>1R zz3XMs2vEqFFoR8q#X}P6=_4#hK$;2JLx`_uhawioSFZnOgZI~uPEM^6v(71TRqp91 z-rE$frUB#MUv4hET3Mnv76RfL#iJ>@LjC^NCHhK$gH1yrl+|t@|I4+5aA_AI^O7Wq zkH7@#9Y{bGIx+WKVj4^YyiX4JTHfI>2zlqr5eSz-hubDJ7%MA|1fNoMidEZm1SRJ{ zPF$Pa`J=?;#``XQbuY2iPdKk6#Wn2vi(hCB^qlRbrC)8vCn4bMcr%@yprvU+qASE~ z8*GYZTlwzIJv$I{XH7!rN1g>7OV|ZZ8c;#-P`QDGryUAHM;aA8E==z?&jD6~X(}R2 zCLrJvCfS$FI5#Eio!x*5IU$8mR*P3xhg;C+P90&vj#+gY9?r{q?#g&vS;z?W)iMR!cGlMMK%z#b1VvDG{q_PqdDP0Ka#v|GIS{o}hO^0wJtA*LL?QxW_ssJ;I+wf z`Air1{-P!F#py`Xm=^(ZM(w!#Z^5U_#LgA==@nyFINs3sqCuwj7k+88Xw)l+k89MS zyhb6ahh8S9z_G}kt6x3f=>ve+ck>4!AX!ox2KU7d9;mP=vT~9uJS1sI@{4NgG6;Uz z>S{vAoM+B#B0voGfpBC14_dhrCSH6Od)fk0SHimvtF0&bZKx`|K`eq%SA1l* zm(nS;S@qBn;CQ4T;X%K{3h}DF(zGD+4gyA)A5}-JEG?d~>li9VJ`{5Nt!d;KdirW4FckZTRs>=Hm0@mtB#lrUBEul8{DW9ntGP zDs{q|a@M0l4vtBy0HC@D{ zf$-UEBUHqIbs(hnf{5Civf7${gufuC%paVxAtKV+2qejwkeYh=$D~fo2nZ}%tRBZD z559WEmwai?b<<&b;c)bE5xcb-fS|+S9(!R;s6)+xq}$L!yO49rMH~)!+U_{LHEMUK zFZLuIo=r{Tmcu@9Dd-4Q#I1Ix-ti;enAp{=X}9`$KI8J>s|OI22!-ir{3swvqW@C_ zI!My^H9-hN2=R|#@k<8Z69gl?k_6_+#dxrUv|f?+k;Ky3**J^e6tYYoCtP=)=hi$x&zZ z?mcCw=lh#6tNmuuI-)rX(4F3s8vU#~wVJ=kKl$oYc<9>hqYo3g#R{#3B!yA%_yK{H zqWP#%$W-9C1me}azw|ig^tcu2Pj)wSn_%|>06TpkQFW>>q2tm$lTl~%MCA7XCjJ4) zL=^DnQYP38;7vh)>tZB<~al}qRiJy>Jv z>X@LX&d+81F;87JQ4v4~Gj(-r$`cJIHDvshvoYzBd1O6XI$GoBJ$16wG>zT_O@=9t z#}W_oHD0)PyK}!mE9J)%ov0vEnS$1+B#spjwkC^*js(Xl@YjNqRa)Fel0sWaAXd7P z40=W3BM=ZwZV6$$_&gp)0*V3zA#|n0V<od@6h(0fX;{e?9Ujm;lYfGUv#SqC z01wv$6H?sx+}zqClDWC@agKtAz9kq{rA3Hv=OEd)PT|O076j&84h02{U-(-^%n1ZR zm2#xatavm4#trFC3{TMK2fW=6;`QE`Cuh00E)<5-q|ZZe+~E&#S8>6$rMq|kbzxy} zup=jfgM$kT|9W>~ZJZSEry=et6L*1f;lN)z>f|rA&c8`PJ21clz&0 zi~7!h(V&_3(s3h>l?P3&1f?;K1vMtQuGLFxHW&cqFjn zRAro|D=9|4aalIn;mCn^MG=fpf*JRCg+C^E~a7 z`LTNlOK*_Hg^rGerSVd{^7;R@2@J~JHS%!XmsQ3rO|Cdaejp$!MU5D)f3L(^2uV_? z@`mqpQt)lNH+i=@SqHvv^+c7%vw)Vzr@nqs8}}p{`Ay2wGP%)a3Re{%MMuJhQGBZ$%XcR;LO^~XMUw}0$QDtU2-j%mR-pT=zEm)+{O+UA`wuVhM zO@q0Gj=`ll@w^1WKAoB2_~KoJ+}hlnFqfjqcXiby_A2)*9|(v>FB6Dlc$8dUl2DmZ zN1fsO^E3ba@83N8=Gq_U=kE{e+A7Tq-0#k$k!h!;(5+_^{8Qg+x6E+~X-JnZ>e`Gn zgj)Jnsl-Uat+*M$mIEcFZCj(!4eMFJjmm1noG+UBxqr$y+UL7D>gKI=qkX%}aLDPq z;FykI`K{z=OLQh2pIiLfpdi>Th;qK;?p*mYYw$q zml=a*B8H;hgf6@X{ioSj2syquaXxz~?@p{Qu1_q8(43z;!a^{XY`gy1|D7M6RhpSxR|-OH(F~>)#l>-M0$sj^yG!FVO_SmhM3U$^wYUThFQO{tCXcV*9hA&ZiBKk~ zOyPY2fuK!*Rnc}pANArFvop5thcmP9V1(J(`}Swu4G-s4d2_`|gsV^Zy?2sU4Jii= z7Vib|8S$~;^5hQX{*z{6+%b#AJsRv-Sf8UmtT|o5rd1Sf4FNs4c))6tWjqvS0N+ct>0r z*A_a?uaAQqZb*)&M~7(ZA9Zv*BKKcCv{Fgsdjdik1wfD?g2knklzDd8D66jveKr%S z)5?sd+2QNm*JsNF$#NH3b^lrKGmmHHvl&ml%s4!YqXs;N~z zM-}1GA&_bpvbdf^8b|`Lj_=^I?T_IHXy@W!$NIh}7%@_!(2?&Ah^z<@{K(wDZtL!T z=oucKHJe$6q8QeU)Mfbo%rH2L5DbAEf2#0Y&%^Fs>mO$U?7#ErRk2aVEhMkR=lw_j z@to3RysV8{?C4m61?M7e_w8(f#X;F#b*k5r zKk|(3&__>C9qAUC0D_u;}crW0v1pNWW21LB?uw@ zLOah~h}}@za6L}Yhf5uJ^}ndK=>}^TF2J?fiU5J!V8_zFcTlC6K&NGnno26UYGQ(s zTrx~Ez1{O>2+G!FmZ#r~=TfsX-QD-eoUg#~JV!$)+G4~%!hQT9c+iI-Hs-3JVPd`e zE7So+9KMJ*8ZeKn-@11R5OOx6zR`-3usmvqdFoQ4iy1oMQxEvGWMmnDCW0$1wDWA5l*{xgACOWJO=7HbH((6Jx|5lVA@u}yxzR8lfqd9t_Y4L|Jt=h*`z z|L{O({h*<+z}S=XKOsa)=HtsNn)@Ok@j1y+-h-CpQSSED-(fk4`qZEvLEN78UhlZe z6&S?rh&LFDR%*m>O}GQ-WNJS^?gIFZ6-No+k(Vr(uVdLo56+`onEC)$r>x9AlMpEkES*F*`bpeM zpv>xptk5mNUhLZkz7&wHflFN6XWZF{w3sVW?o-Cb*yyHH-Ln^ z(9B3PivD2sO-Mjw2T>xJ1kOLpJ}riKxV?K8>?f$<#;3SphG1Aw3ly=@11AYD^fY^L z5)C;i+KbZg?fBZ=Vs3<7S)JY<(2tJ!mSa=KfiY(b^&iXI4WFc&Rin?hF5bq|QQ_y- z4Qqoxb1ndOFUr#f-fDds3fXL3LG_OyQ3wbG;|s{B)1XwKNDazxF#M<*0tuDHSf7nQ z%EYu`^RogxAYfLkcI#~b(a98gkUoXni>MLK?@sT2`9&ub3}O@?On&)iZn9xD0I)&q zD~^ZFch3}qBvG^dPY^2DFzm_ItVjn?8#8)8b)@Ik7XSeyeDJuszi0m+d72-Y&0=OFGggn7F=%-7upZOcV~tO>N%;`n}m zCN7WEYr8DaFQe)wox)VUSRt3ZuOg9HW>O#<|Z>64|W9s#{lRZS{S6jD}`npzG zfU5`qm^iZqbgpLTJ`T#*`t}!R5bbJ59#X6MtanDd-q?wfQ+RF#{Tld z8(SCvP7{jan7QTYkN^8?=4mH@!ML>qkXZqca+x4Jf}>yLXhB}6M76ii763v= z`asGNjnza3#!~)KgLBmHtZ-;OOi~fr)K%>W7yI=p2ILEY0FOig5_ti0^c{BvMvYz z-ni@LM!yw6$b2{U_zy3>3ny7Xx}vlt47e|!zxmd5qc3Oyysa1z^EIS~Sjq$PYaSd{ z#s>xG>R_%aovRORQ@x{SOl(>hoWc*~g}RGBv_RMjX&-VZKq#fuTvJh_QL<$2g!w*V zH;}z8T(ewm=VQalF#|HOAD6);>Z;kAx~c$|LAos@dHcDi(V>vO2gE!h z0bZ*J13KergegxoP%7$rBCCOzUSHWZmaIo)O3ifGOLNTt%I=QEr2X%+$8Cu77!9tsdbSD&jt*Xmd@ zf47F{5{v3cOchLwc)@!KsnT8VF1Kz$8VNisAdBabf|N*5W?XeDKw6jR1Q9>rCQpNb z#*}}^-yb<)+ZejpW&lX3-vY+j2{NB2T0vSfO~z#r0|KOnPn&OyIH%CAa;kYF3}9jt zZ1sNa-7Ns*Z$+#xqZL!CP8^DUR~hv=I5bTDnc4R4d8Rn^62gL<&!QL)6gMUL@w>tY z@o(=)p`(f&?Diuu$K?UxN;M?W#0)uW!HzDmOu77ko^0f-t(iu{*p}H@#CCLK=e7yxhF5qCH}(2M{H`)Y?aFd!iA&^t0d#Q>YefHY69)JCjz z7?8-=PSoQJUD|R~7=8v|%U3&zEXejUcD1CHvS7(#D+K$jw;Wif4kS5|D*=%e*a--T zYx`}TX_W3ksN?}an-jI@G^bR7U3W%nW-&qm$e2}lkP5)q7$8}>D(Jfnn6_}Rm1Kn+ zky8w8@ilflaA!c z{^0|d&;A#-xEo)?#M$3yX+FY3FwvODDytz(O}&UmWl4?;HG_78C4#HW>e82jMx`6< zR#4#02uRkNTarfacJ+$E81e5QHQrhUWZdB8&S{+9U85Tr7$em z=LNxOFHp*XYHwp0WAle+$!sy~(sBOoA}KjKsw^Ig((o;wAZbW`!ccv&G93s=e?w1V z3e|{v%uhRgH@#rj+WJ_JmL%k}e7@6c8Ddv((BNsOJ>+^G+H70#Zfheg+usF8U4P!H z3uKnJ2ikT*BUE}Lg;+=WadUbq)W=)L3RcSN@6wQd^wS|vIB;m8UUm#3E{n_S1{vB& zwBV9BmKEt#3Xm!m;HI1`fu7=}d&l4f>ClTtJbdR2N?vWa4PCV$^OjI~Ndi*d^ag`N z39J_oDw2+Lf~;T$enPrKD7h)yg8W@=`b9vb5~&)A@+w-gO0Nr@(i%;sFs}2CvkeudabsMCH#XP%yghe~sF-GH!RmL}1)Vf#G6SPpV9x|ghDo??fLMwC{ zbLyv)e$Eug%WIiA*r;Qnd7kGWIJ7`&QOv>Jv$CAk?X;=?51COnRRh3B9OuT;YPAvB zJ-gK%NUJf25M2E&AG-bjdN3vGaaMukja6@?icFh4Q_D#imHBzs=0Ibu>e`svQOo?t zfH#jDcu518`!Ug6M=QONIYiN?`QXJ3;#>9FexQ=D@JU`i7TkMI7Vc0WnKwUgsB~g) zqTotEaEyZUa8be(l)97Y(wn?G=Bvusevj;3%PCf)jCdkHZm$OGTW?H9ngakj8snpZ zKVd*Jj@W7-ZrXX9HWJZG+nmpM=0&gcBl6qPDjoTY3{xL2ep8O4HwpkUa(!HVMa1u%gcl%hzO;S%?Ao*L>%-K$eM%gPI%*9O zSj$T}0j{XCnzQ;{ElGO-Y#EqU!(UE^)SgRk{=n5%kNPv1`r)2hFVTPB)J>BnLJuhzaL$2kZdo0~7VZYSzk`sCe$Z}k*@f352DqIK% zu~WICG$&i)F`mt`WPYtHGacK6(!xXHlcewx!tB$S<22wR5pFqx`Hz90x1 zwSEL^Yfx5iG}WD^jrI6n=;{PX6hXvaF@ED_fOcIOo16T7f7C3~vTf*}z}xkT-}1(q zk-(OABe30YTH2(xKQkXQ{Vq8_dG0TS`SE{JvWL=9QD9+2Qo02t>nA>uMlE#+?t@en zVm@5269`CC83n;I``N>vdV7bZ&Qb%KhMP|}l2((o2f!E2&W)rY<48AoE*c!4<7&;{ z0+2Cy)5~`dAb{REJJd)e9LurEPhM+XBcW+$53lCbH+}!;w?)%=q_B{UUE(Rp{<;@#kGqUiI!4(Mk(`bjDILi<5 zbzwdf?*j1^hs+mcy9$C-^JV)k-+G@V3qT<^eee8sA$7YR4p4Os6_LL zRMQFB>HdrAV3bWNeSb*z^t*Y3Kj}!0(D4k=NA1<7W-A5uevd~8`=*)}Hdes@kqu$2yNf}N3=qr!0(N7@u!>8}&k zP$vQ;xw-4s4}@__pt=X_S`DEMM-Ko#?fugr;ZAi1AJ?w*C7M^%oX_BUz7?f1T34;T zg;O`?*^qWQ_=p09dbaaRi*xjzaUkLNOH9#!_^;d0YpBY7iI&15S(_j`q)``H6MY*5 zoCOR6f*QQ?(``D6Y{OJG$x;*xVw$iR`J(`3K5@dV5?Up)6rj-%Kwwv; z?Gy`DZ6~}O3keES-B3QZx2>G-zJ`h3k0~gF5pjPVFCR@zEUmAtElo^Jpw|=d9Un`X zW5InT#z+-ksFd^(E;G#Um3l$|qz3naFAqqrL`o|M@V}Y69?wRyI1b@~MW@@A0eX^z zlE_G%%#De)Bgx)e2wgX+UO9J{BhF^AdLfn^t~R%VJDlFpVJW2=iUu-V=(!vrAt_qe zN}zRE!2JXJUS=kn?R#&2bjI3GTZHK}olm~s&wJnZ{b8q8a;r8}IbRDiNq5rsJpjK7 z;Gq+GaM2$8cyP2g*T-bBV$W4TwZ59KsUS|@bjfVNTrPm0$|^K zW>%5oAWi}JW)0P>d1;;m%%Azo-XE%?l~82BUetd>qV5eqIMiGHpvr%NAH#ahiCJlm z6Oub7LhSC3U=x(S-UX#U>IkT=F3OpGQP=~c1=OHi4 zi+LVGZAl-E-|;+OeHhA#OAsRZMwq=?_&1$S{{e9|nsf-Q@If?Y*0BLQLf%z%E;}Lw z@M@)AKkKO}z^*+b9!XEE$q8uFn8#vLqnpT<**u42UzeNZRvHbP^{{9=( zriMr~FjE_%4hR7OAjK9jd$IzjL@KZx@JVm0OGbN5a40jkSB^k|A%O!`e_ZL%y!yK`Y3vk=>T2=$?flmB-c~?nPq5%tTM%yjfVwV5>g_FYY6>-s^Dm+jyJxNA5#cf z`0sJ`x#S=$A@^$a;c$3StJP4s`_rbvdwtU03Bl`1QL#K)jJ-LbT8JnXi(>mHT1MJN z%-HHVA|z}a7lvKF|1gb^a$|ux*#zW}!(8jm-bKBFh8V}1O;uB5mUG1h8UP{yUkN$t z_xl4tZZn5z2u4UIcS?Etd?b$TL#Tv+0B>Z|MFYSuLdwj8ott|Fjw4wK>S)Gl%_rYL zyHu}`6X-j)kToF;g^<~l$++xfrw+`*=SVz79eL!Qkn?J{{YC55 z?s~JSs!$`8DMA|R(Ddr_%31Bx;de+c=I3`3HNtZm5FK`HV)11!LmuHePYB+m1Fd?^ zSQZG_k35?BtYCt0{hbLZX39@d7n2%>Ivl!j)>6Zsl-VTYLu$WsZw`0i9ZzZFqwB`#1K`F&wqRV1As{&;1RxOC%s#-lxBvSP z3vf5Dp=OYfrCNw$oXCFSVt$AmF*2NfsY>eKEw*#qZjZW%x1I2 z>@8f<2w|n5;eK2YVmhsOJnW|MObJWXa{{)PL;@kQs;V0A-vbml!DkD(LN3etp7OGC zZ{<8oK$${F!aPxTH9v$)=*4WYh#YW(#7TxBKqOg+Rw|YLl6`xA-=bzGg8!m!d)Y7T zrDG!6q-Cn9&k4@m$Rl1dvWFre-bFO&=EZ|;63WE}PRPMQ2}=_G=$5_qMz`^Mb%ltB zI3cqHheg)y$fML^a5hmD38u5eq{7QbJH)}*m%4?#W$*e~BS*4$B3zM@tEK~mLQ(~d zgoKpT8I%;efjBTIkn$TEe4Mkva~o~6-{6>;J8*Cad<@KGPR<7t3|wFsv*Qo2c(M)e z7?=-m@2RR(wB_ryT4n6r^)GO>)uo2+pI*H`Rqwr<64E^YA-0k2-*IEk+-IlTu} z2{NKHqNl_e+uwcto3BTJYyZAMNON&^cHvnj#Cqt&s%PWX%6wgr>4YF7Otn;C^x^NiTkA^)(eL$ddv)Gr--;B{frJf;(Z9*jO1+?W3m zg0f(>`mWtdNVy1a$0EA_m4n=aA7YaaS6RF}_A$(S5hSiD%9Nyxxr{}R+n=z%A7Y6Q z)t@53Dgjd^#H7LrnR{iB((UrL87|Ou(8+j`2SMMEn;T|?P7LgYPKc9fLbms2F;S7N zC~L)sC`b2CX$rl-QnS}H7iRM4zPU4;qvm-l6*uo(0t787VR~Q zymqlKq9i1@M2LMq1W%njPVl`XQ8}KTjrQH7um7#i2-_p%k@_L_QPn|ea&G4nqAo5A zt4mgRbaeK%v`NUHEE9s;^qDgoWt^zcV3B*yTtdcM!Is(=5-!g%5GyeZ+*ALpz>;}T9YJ@u?y3tb^GV6Ep^Cd7%-RC}6sK%hqQ z#}miN-X0wvVe0z{jF@q9etdj{ajxj>`1p^N<9HWG$Ilu$@mNhfKIxsA=HAXRp28L` z7GKygaVl%-B+zsuZRt4H2_dbDjm6v=AKf7ma&dTwqw^L<%sn`P@fi>jq9qoAUOa{i zKmN;jvP&Z$uZdF~;eZ!$gl|}v5Jbfi zV^7ZqiB8U5M7I!f-f2R*?g$BacGz{HB&0(^`iTU)Wpqf$rXNDyy?>3>0HCc6Xl3~S zJ&f;xkWZkcKL7#OFk+4AcV7Xn`zi~4t+z~1yn^d6k{yCBS?Skq5DabXX=`-3eL|c@ zn{dKX?AGf`bTlXD{Yg0-8v+Etk;X7X6(RTC`8m8%!nX}!tkew+jCuDh=#))D$feT8 z2kIOTc_V*c=Mu(OJs|)fK3onVZ2vW^P zkk*Yi>&xAR5GPcX(9%Lg#EN-o2m8MVsD5}?C>dCz;mws&4Odb%z<8;22t1^i)AsoRH# zjeL7sjB^e=G+~>^f`VM&W|2#^;z(#7ndZLMC1f1gPn7|Y=B4w%$WER;J31d--B?o0 zh!~H~?c)dyV|5(od0f|mGRD$02?AWCOrIOvTotiz(%I}w$QXQ`228D6Zd=+Z9Z>Nd z34vl--=6eKmh7cNGICG)Y6)r~NkC^KQUC+E8VuM$y|IoA8}~0ECZ3#VN*I>upAA1) z>_~`mO|()+J%HKa*1;D+>fQvU6sZ6%ii8OugJ%{M7PNSNsu%!hCCFwWQn@(Nugyr zxIk%Auy|Q ziB{l(2E)S2ih_yUFFj2Pxs!j(%Vua(vflkWnF3~)m^*9F=q0iX7gN4hm60t4Ip$${ zbK>z;-o#7>Zj?MHDXm+-%(j+Y8{RAZyk@2!Uy$>;$ABEGNuNYEMN%++-7SM^0#s}JwMYxa3B|<=g+|1!Ux7gX-y1ovmbpM53PTM8BQc-uhg`gc2)uom zMPPPl!oGxTy-Il0*26DrO!6S1b-ebQCW@-6EIrRF%c_c^rdhVJ0Kp1|TUeUPu@Fr* zNkWVtasVLKBm_r%*qAQT9*l!`_9X-{M?wsEwX9u~4dxDzW+B=meOQ4C(F+jTD4X6b zkV$Ev<1u-;iyvaTBjEA2nSO{;Zeg7cEd!HShlw7)gcwr7TqH%$3UxK`6$7NkwZ&^@ zfh&@_jWWJY^mb<|qjF@DglzgD#>yhQC64l@6{%8=6ok31wD3HB3E7ZwuL@&|@f?tJ z=57T`gCbxQjphDU-z|oCjHG0O4zc2gXf`}QmvMBeqywvh+k<__aQlOh@v>RxwQvKZ zB~g;0kphw=!S`sL51xw*S^|rTsx*$WDOKQ9531RINaj_3jK(4xmeaJx!0peD5W|W7 zW@Y5><#A0}Dv@Y%sEG4+ZyA-wqZ*|@up+3#lIvf5!eMKIe#q7S9f>3Z6P%Y38XF0S zEi+a;U01p)(ZlEv%bOc=`>KM$ga5U2I|lbfp`CxwMIv8D-c)|TC}UaMtALM9^|ES~ zYmi_;85$yqOh=+xG%$`{ah&-JB4oTikULPwLlKx&gQWoyB;xh0j;67)2nxoweMQc_ z5?NTZ$bvM=b?S?DYt_|M#LH4Ex1S#&)`f~MYwgk)hbF*KS>1*h)r)#Rlk*I~&km0c zPh_{~Kkvf@4=N#_%2hIoqQ>`^;U1Du3peefhMJ--*N8Lppe+IMnn|}#Gzr23^)fc9Gp9Gi;3Uik`2F^>0RguzK z#(PFwJP{%}Y1-Hg05?1uhLE;1APHV{U3ZoS|M|m@KYsHZ{{IV@y!DWpQ1ja zNNAle{HWwxmb@oIluP61XgHfRN9t~ZvYrs?eun*!zkd(!zeGY9-PmLW3~msTQ1s>$ z6#|%OP&W-!kS9WZ+NG(QMIH+bl_8`*V;=pp;}g0eI;plsbNiYn>7!4Sba_ zD(X7U+jZzim6uH@xAjEGW;i3`=xMffEdcn`vmQaQ(twJAs}<_(=g*%f3@3;lbrW|%b z_T^Yav{?cuN07Zj;f!9HpQ}%%oNu zp*r?Iuy?X$$1?3Ux``z7p&j3V=Gu|BCkU~>XSi)JrNr-GK zTsg{wE-L^;T#_kfw?nZmX5m{?Ve6Ypp7tvTd2K7VpX2h3D0!wz+0^_uXx2vQmoKPy z=G!joqqpAr4RkKXj{!Ns)T!EgDcikP*?tLtT_0yWr%pL3lnvt2!0_C7~IVu^iTmYbJjK9*;jK#N91VXKn_87t<<)>29b2Tb0 zCUh~Dk@KTEHBHR{Kt1U4^|{OTaEWn5t6V%5cPI@hIY`BpZj4Zl%#?opP7Y94xGZ#h z*Ura}AAioZ04ZDx2A!qgTwQX4u*x_A0YTJ~oOA^MtztkBaMF)KknZ%b(grPVl&-mo z!TWWFk+J|FSbB1RnjW=eDxKi-+X2QEsLTNbq9!7KS4tRaLCDXf7#9Gynk0q`@x)q~ z@Qg;b*{H&eEG`LU_$qt`qe;ghjG^LNCRwhdp5od0Nn{l z`y&Soh_LWAOKq&TEJRq9Tzjon4GV!@Z7q2ShzTF7Kvhd2bvF2*&e%g331~#IP+0vN z(EK_TlQwrMuyf}sfL2jqAt=eR7oVi&JrskFY$_6R7GzRXXYVYpK7z)?giR7DISc^J zZI$~G2wQ2X-d<6FP+}}M=yLL;G>{Y;tliq=VvLwL~!>IRg-BFuI`t2)(^I49KRC zE-yX0opCnbg`xw?8!M_V%DYfLi%)75D6imS=^}hQdHQDKiqeRYtESYw{Iupd6Nn`M zIJrvjJdqBk#Lt9GHa`Ky#X#u$^imi#^O4WE`NVos=^`HT2@dMVzdA8o)=tzOahZwVFpbbC^j>GaYhps6 z=?F43;VV&EGXBWp7w8&5j$iO?W5ZhdIY1ETGP#&*Wyen*b1#`HfDk#W?3F*!s^A}O z70AwZ`;SFge6wR5RDAa!8wq3jh-11Ws`?@sjPSb6$`-^|kZm|? zbd)i%b>c4;c=Wl;_WEO5GAY8_hHodn9@v8nOYEc15 zMNLqC?ek0m0R5!@;`y)SH_p6Qg<7?c;YFo*uHaE;KZq>`m`kKs1=wL0$A_vyyb5En zg|jezt2n9rxuUI|BmEl@FEl340KG)@Psb9oOQ&?{(d=E1hb&hDq6_jjmEv||C{dW4 zo>vgm7ZMp?d>2jsXh)>Z!n07qn*DZ{1uq{U9SaA*doHV;p0|)+-YPkEVv1hLMji;V3qV+i$ySTBvw496q093R9c)8 zBK}Mj@*>Ux?1)KOoXj;m%W)^?A6=K@F?Re3lwzuuysA@aYI!xL0+&Dc<>hq;l)OSb z`$u_B_NF(~ZUcli_QQ7{S-`B5hY&1FumrG#K`jVF%K1p3dDpMF#XiV5RaIn0p22wBvtw5@=Zp(Zx%5sRIL5rA@7=XMper@B(;`mRU0<^S{ z;lY7{F!U*nt4(5Lb})biD1n@XjO2q|FAFD3S*3tkf)xXp17jn==7@EGAaECK5(9@3 zM`CNqfdLBw2!XK)2HKy3N*lKbrNK1+K;Nu3bridm?6BC7uYvE(?3>lFAC2D33aydx zP{aab>{#dQPXidlVgRb-D3Qan8>9v@k{{B|x$j2~gd~Q-xKbE;FCe1efI3wOLLmT9 z72wbT|JWHoM+Y36d|1)c*na)x%YXgiFb=JI1f+?+{74MoAgP-lHiV%7xF{qB-UG-$ z;+kOL2%WJ+xvU}bG0Mzi)SxNnh_N!sK{S<{6p$c~Au<)HF>*f;%t>1Gep5!qUedDn zOAi@h^Tv&|2Tn7cZhDBmx5%HR)9DuVY@}bL8yvCq;zhdYAbLTdcNo}gwpe)Lpt-Su z(*qg0q=f>6GYZo{1M=y12lP8QfED^* zJkznafH3g3iylDh2C0SMDQ_S++vH6Gk|r-Y2u<>P9zsKT3)(ZQ0o0v*8&Qog93d-Q zGd@1`k3NS!jX?-QLm(jL*YsSBG9s&x*BOCOPXTZc66BL60hy$NMnI;?%K)rGu7K33 zLxocZ0;mBaAV0N%kUX+OAon_fpaPQa075zh5(FZu5r!lfyrd1EOMnAoiju^p=>!A7LZRhaUvk3kY@3teIu)8Xr$b%e`E;bxQ70{&KzPAI5exPy>u(f@!1z`cXpz)LDkZ^%OjNa<%N+V#fXhKzJ z*E_tU0Xq&b60$##LweWwTh2QI-gSJ|{@~&v0U2}77Z6c?NJ=1kZyh_dqpRAWaI}8B zqf=C=-Gk78nCA)zqDmHDJIERDys(`7*akn62Q|Oc5pWbwu;)B}Q}}Kn=o~odO=@8u z1Q1d?2jIylG7u1yg>hKKw_;d_Kv2|a#KB7!)%N5=0fI^=>mf`I+Le937eM0Lr48Y? z$F9WScN}I%AEi%bc;9ck?Y!;Tk3>@6Xo3Jej*Ia~H30ASDeyXeo`%3UAH%f(ey-MgKO zKah{q6cM}fwLxtl5S*=p2>9WMWRY6tTdEtXDL4%S6$w2K5RiQ^IYcWb%CVk!VBWIl z$6;N{+)92l5%1+FIDCL<7+a$ zx+$N`0{4N`q;zfhvoVv&_2*?WYwOo*8L8iTAal!m(#~4)ATlG9>zOC)e|pKyls3A( zFb{6MgaU-0$7Qd7PpStX;N8|o@veMLpHj;rFLO6*JMv~;#v>g-ejcfAS*z8ZgMZK6 zS{kXzzj^vUP}Fi$Bb)B*aCN6t)k{l}@1qy=JCTuBnTvvT1#<3|y&nhVp$lOE>2Zc| zu_vV!)#akIm79&^Woq^DT{*h;4iJ68sIDg?ltZd|&ay0-tm#w2*vmaPa4&1wnS-j` zXCR2pjBQ!Ae17IYv{UWW2h@XIhQk2D>eJJcW%8~-Hl=jkYzOAw~H+d>*nH^IYdvV zJrR(h*kIhXEGue52uYorj@ipup_bA2am8IAAbsKukWHD~pOGm*)&a!ZI(R%+S{kn2 z?GJ$b`1l8XW5gpMdTKTDO3&+eMus<|3(&(p#PdAP!VniL6S^L?-1wk5&@+(Xl?kh~ z*iUj90XeIkA>vbMyHbvNTT=Gpp)^)!SsE+St$7|UI3VS4A*InGmyHR)9sAVq# z)Us2CmyJf_EAb6nAs;t9GFn8R^*&_z;_TI{mp}jP`mN|tZyUoEefIKafBEQ>Pd@s4 ze;7baP1DTYMlU!Afhafw68b2GO6U0I$|0aKMvfG!!c|q(sk_630BUDkfPXe2df?%- z8jY~Nq56$hGgd(u2Ey=S&ZSU?<3PuQ3?fA^&|Pp)+#IYvfC$dco%LxP+kbn3&NFX#hFE6nW!+5$#H}w;u2V{R6iwZvw>;Qm5UwaXJ*{71_t4d>T zGzTpJcw1F#7q*8_&|uyn*bU)8qDYLd`%#lX4#&kH5+(kGAWCWvv;HDo5Id>_1Q%__ zOvD;uixESR*OIBWgv`L6N!u!rt#j7>0~0t%hD`1Lg35@%h2@)>dYnogU71P#5=cBxRg(!xp0t%cYui8=$2Ujfh!%@O zAasK+hYv!G!M()@GHCKvgh5?Q10hokp_G_XC>Sb@#Z#f1HbV!00%xeb^%HpM6#7AW zzB|3)sG*JSC%-)YqX)$E^CJl%$G0pP_p(?ObkOfG6h z2#k{b^jpF7D~JDXgXunrAZZqI((q7!UI>iGv)hH?yckzfO`OHzVIEbCz&J~;!= zU2Pu2iV;H2*UK$nK>_9jt-!!`x$Z;K{)P~e-Sa6Ldf=9B=XNxtNYWp|x)3Tb zo1sr6MF*`_)qrv#{fk`4Yb=KYgQuL~dmnu*~2Hg&+31JvdCOD8YR*0gQJ}Z2vC18wq1tMd-oyizukzo!{ zLI%AXV(Sp%3jU(TagGxw?{Gw~+z?U8pcK-p2|?)Uz^YjZq7>D(hsU^#{lg3Hsv`hEs+^Z_M zzdHBabE@cs;w2VMQy3M`G)Ici7R|P)B+%ew6Cem#7lCN8WU*LG4pa>jJ{!7)4r16e zMc>Drs@Bq4$pMVu(n=OvI1y<@Xk!Dw5ReZaViaJv?f3n6Q0i<$R_3z65Z$GL#VLc>9_UBNyeRtQh(Rvj;^EA z3mEGF0LXM0XC-~H1B0nt2L!XMzT~(X=S3A;)n!dM3~qbc5JQDU?FFZ}_XQ127-F@Q zQRYX6==2$@x0bP~Dnlz2jh=%Bh;9YsU*8r;$lNfra(P*D3nLvjyQe2S&m8Hv%>l=Q_ata|h4b@&t6RTTq&{B^&KttO8_~^T5gW5$(YwQ z+jVo+MkQytmX*y~?7+5c@))ShN@p2kc7|CNbMsl2se~2*`McYNQpvK7N*A8;10K?D zZ#o^cXQp#JVuiNJJ7;Zn=%Fcb7!URR^#q2RY^fdaHVC1Q^-IhFkh6s2o+*oW6kXqB z1sy;XpTlsYhZKu7R_{5OQC@t>>cz5i1a*k{J#Fw-)fuYQl!l>YULO`%vB8{S*=gO5_ zSP9oEb7@2jDW9`W(pD25kj2W>gqNJy0J3dmY5wzINkE#F49ori5L(qcrfzN?mjHyf z5g_)CkDY?&w0Aw{Y|%N^6BI<0byhg;v%L}T?0WEm5nqacSTz3$eVy^m36QCW(8ZpL zpgxWvoChs6Ssga`=}TTT&RJua;zw0}YE(IH_)|lrjny)+4Ffi$_yI5YzURPwra+df z0m4b}RzM&>5r`YQ-4j{LHoI0%?lvoPuG{UpZXPfyYhlG*L$JU|1PKd6LaA%zD>V5T zb`gkt6OdnBi6JJcT79Qb-~z}#D?koS=S;`p2_Sa_5R2@H9{}P2*3w8US%^P~_WOM4 zcvlCE5kkpzF(f{YA%lTx^cr-v(=w+2TwHBfUD}C&6qmsxMnINe9|I9k20oT7UQi7~ z>kSN}z>)y+3oThPq-!-dLIEW2h8r6jSqVVoSs?DlMl*W>h;3v3U8ph~NFo~zk(IO@J(thXB-WyN?yEa0Vy>NQbpId0*czDQ(UU+nb|4J8pAF zPu%DsLj(0$_5a!F_dNnKFusFoG>TOx0s=&_R^%Z^MzwKTMo=$DKw3U8QYb%9#eF^; zIP4T2lwu7v{&VfJ-n$-1ZVuBYed&g@WDyW7TN0M6xm-5_5=wcoWPO>l?6ljIb52yj33LMzv2D}sS(sQtRPCyXUJ6?j=G0u70 zb6A14z33S2!@!P}fSG+poyR6;Fz9z?fXoDSQq=EwP;+QKDjMH9yy0^IX#q&0%jD{8w6zMoGwv}JI+oG8fzHm_~gYO+x9}b=%%tlu=;4LJZG$o2Z++ z%(XJI1rLFjbXhnK>bAuY<*`OFd)qoeD|9P^AqO&mV3d?00|sBeWF;0$ZIK`<`$14D zZF+qV$z3T3*7fIoPw{Y^`|bTcxd^@mL0ebWgT7Zo%2Df&bo^=)mcF;%C-Hd9Jz)+{v{1hB_zeySH#jb1Iaqn(o_ zR%`62&{8`pHA7WQEsHjesGtBH*?Tu@O8izuyVHhGUjH}R94Qiae8q^czA4Mr0!^sc5CKbz&C=SR`@0(Pl~~*8_Q%G6gbQTpSmwv`Kk4(&Lv3y=2nJ zFc}%?kqS*48=(J;K;HX>ii6IyO=!O?+~O$@wk= zdH557pdNlL5a~@bF-p?ZE=?>F$<^v3+20-r6=|bJC_>ehv3=T$ghVHq)*{DiR6-bk z6bL@1-VmczhnBCXdKE2G%hX`0!Y4kWv6@)lq6W4pkOi?!LPJ@LC|! zc($h#D?uiog2=^p8fJJ%<8|%rf$WzMw^2Am+8)iTVjg-5?D&LvpWt|TOgE&=y(o}%1CGI4L%hK6{;O7i9%ne+KF?BG``U9`^d>7 zr%~29ci7(UK4*-#m76@|S|H1)BpPw!J3egGMWE1@eWV$2RCUpzQW}qljd5j%JLu?f z#`zIU)APhG1Hnu_{N$U3`P=WZ9^8BVm|m8pSC=jVk>=bSO}VvgTVo*G%)&&c8M86n zmH^`BWZ4aE8+9*Cz8EH@yG-OCZjObr^tK+d=Yw|-sKjDYVn(86TA;0 zm1X9>y2QIahoFTW~dAmZiY|K6Hkoxkmp1-bkF%18f!ckdoPeLAybA(z1P zgT~*0AtKatDJQWo`4w9L0So|XR;U=6$>s+-87CkV8v31)vxfqEp<|ut7lFL-q`t^sJa3nZC!E7~IwL|k1@ije?mrY4`}fCJ zJOqMloaP;Acmza4+j8m#JfwjJnS5$#K=xQ`km7ZaD;oaN>2mD)CF}mDzj=zcBkylL zT75GA0`q&jS{8`>?$yfIAARt_C!aKDUlBoqC%bNC>>;x4<~K0YSr^IqED+Li;f5Ol z3A3&MVpG}oGLSExZGHNIkUx1dE52g#XmOS(*jX{`lF}2cOWjKKxU1nY=>CR1uYwb6zAMumQx;_b5*pJs&wds_n&CG79P# z#2NrHTm}?6)9k4PkdL2z@%Yn^zFt{*wYvJ`$@>p(?I9rY+ZT@>eFbSsGqcxqrN3F( z36L<9;0J`lW_Fr@%#DGNhDxwBi6LVk-K#+UvbBXvk$gd~Wlbfa6gqm)(E&uc10egT z?K!A#^$RFA9s(9y4ItufqLy5ZiTuU)YUPN z(Tu@3R;0KLC$gZF{G3_wIwccQ3stC)>FH|V zm{^%Seh455eV>hENC`l=!&%|%j^9y4^&X>{_mSl2v?gYl|oB*=6h6DY%X1=nGj`7cORAkJ# zYgnl z7zo2trAW0DkBO3|8Bqo{Z;`q%gr!qf!~>Ltr7K-Jbm)SF#D>HR@Bl2(g-75WcnZ$G z94F$afs$kBFU7XbiK^yHe2(>d%wom}BpktyAqprC0>V;p8wh`tTR}}9;Z2QQaF8vl zxf-uYf)yNHK-?1$5)f8Kt0(N8gDRsQtTO7PkQF(Hx`5dKi9pCv%?3udK4SfDHK>Fv z;wHnTX&T0q_&S){^%+=WF=V#>Rw9sT>!u!-)O{en{BR50o~RGRK0^q^^Q^lPMG=fO zCr~$s=ww^;0%7-idwq}*F)gmR$wprg#d?5rs(;8*aV%`M_JPQVa|i-a2&7wVw&sY} zAb=F}#6Z+QZ^+RAVf|#t`jz_~i~k(5HgCfFLxN>WK=i5f{*cM8_yUq%*c`BTqeojv z0fkMLf2R3(8VU$Y=Z~^LlErMEB9M_jTf-bljt9($FRKcHz4jrv3cF5^FIRd zc&KoCzDOcL9>KE62}m42JUh3Jgxu_F2hS|#5H-@peQjS63Ax3tyIEchnA9;9DSh(- zeuP9uQM9_+rdM3UL}GU2;g|Nm4Vm>1~y>j+F5KREP)hbv4j0_ z=wV@Dt9Bxs2uWdc+<_q6D-6DYwJ%_6ZR-n|!($h(n!xU_U;f4BgCq?R*uPy?Y4!S& zj)6H&4&?Tx=SWD$W~e1gb+1+N{q}ksmv^U3gy6cjN_X`3^l>qY`>*E)31MNjqfM9V z&*|!H43DetO^m>AV*~t<&b~qBMu?YnBgR~zC4^9z{<_A-7+aY*pUq<{6uE*;%&Iw%mqS_!0M{XjQO3Iab6mO`UW9Gin(82%viNy zAO^#e=<{w4u28|_BPyRw#_D5x81+L#^ME{l*fhU=XhS_k=*uUSA<6ncp{cP=xwOUS{XID0*xVWbv{e#=4MrLehV~Ljs9U zUV*4wf$+Yc7KrfhM}e08m_eR>WXr<%Kp;sHX0$-?r#d6?MO+0!17^#5yE%~Y{AVC? zUm*MpY3(-5kKr>!0)&m9AwS9kurg(5h{(kZ0XsvkBX+-O%MuV;LdWgsvm0s?`lsVPh?G3rC6t(_!5^`R3Ufk_8|vwE}x64Ip}nv(EgWzYsG z+5tJMLKA*Tcy5gE4>9G&v6=)%AukWYu>=JNFb(Oq=i#S%r7oaVO6xgw&kooOg@9iz zd}W&kMF7_#2aS!uDLiOW>xeZqg`E;d>3l7=J%*;-*R?>F;VQByUzbJEOs)jZ1$AX5 zEPdwNMUb8Dd?QsWSJ$ zJJZMocMfvHHhsc3w!_zDdDH_fqs_`ii3R{IXUy6*5XJGasWRQcA%U^zqo2X>C) zsEb_+#fx~*42BHm3LRV!QK59umeFIuWUw|vhd72V!6anPs2+baB~CKo_nKhyj1KOR}u+uP`0v`Hba8K7vA+E+5KFrEc)eQlhrTxZ6 zR#N}zyd3~yZ85|^gr8pce*;qS_GZf0Pf!JwW>~S3uNszq{ib2je#35_J@by z9GDG9m<-M;fjk$%Cl@>3CP12p>Ao!x1_3XZ3rz-GElQq?0Qr90d=yA=Wa%sKj}F7q zJihYFqAF&;mc-Ec^5*&K9;xYmf3hJEZzq+I@h}a@?Y6UGBXe{T#6W;h69ym*1Kohy z3;-s#kWbPX(^E^N3Z!&o`Fexc)vKuMGStCLR%G&o03Jqk1Jx!#ylF!T(c3#qqynUT zWbNJexSfTO>k^uhBN(ylVOFhVYX9SGpOn7wK_q??`#P?4w&03XisE*H*qa{a4pcJtn z8Uy1#0VKhTx z2w7K=>YXv&Q^zw466DoTzpB@Iez(0t8rSiDQPn03bg8z1_l*E3q$^f zuJtl72p9oTAs_@)nUER=2`CC2kkILpnpKWvGIBL+&kH8_BzL{)-vm#Mn8SuH)BgOsx9J8FSKnpb*HVkvZ>aS$m`Zx zUs}Bqy36cst+nCNiulf@`-iT-_zrIPFe3ymVf*MdJREx^=0jTDSlh&{wrpJl8kiZt zS`lkwDqXD17+YbA`t~26gOQmFcJ2wGam#oWh}^dQ(CThsQ5QzL z-zHBQ{{R!e|I0US^t-Pi7hkY5FNC;#x^=?!ihGFHRz%ZU$C}l_b#mPeMw{3+FO2G> z?yoH`txUL@h_`DXM7ELs^s}GLq%4S#gAkNj9#Vd7S#4CyY;tX6Aln9PGu^DUEXFpM z8rOwPkhHfiX(-lF`wX(y84-dK0}@T0Kkt=D9WqGvXb#v3Mbfejz@lacXV|`Z$z!IqJ zCkt_ZV+Ftx%PR{o)epg-P1h)$!GpEUbW)GpvMRS$RMTA{0F%Ff>#QHIhQI-PBm^SF z(c>bE+bOk7n`jm4u{LckJEnDCP04%twSgTITV4mMxK$IqD_%z5J3;_fC4Yt~`o{tno_9=|xPZQH?g-IACfLXBf|KJKa^}0eKR8(kv@M=U zZHyo0@IxhGAYz@FRm6g93^Orkor%n=>_(YY&vlQygAfh-D0G)MoRqTmsmJIIuZ>}G z&$DLGxyhqOWeLj0!I-?tSZKhB=}9^vd{;;&c=QA&h_ey0r%@Ie-EisZL`G#_MLG1W zk$F#&K8%bJ!3bR%qE(KR!T6pK#?x=ylzrD8cVg&->;nWEB0eIR_>@qL2{h!!?+DgW zSi;lrWIplG=dl&!6(J~qvDWEA9E>82e2fV3C?OR2jzAoYhOi+NBV}MMs_cloSA<9y zYyE7ls2^YyReKo4*ufluAO|DFcU&Z`#{p(~fZZ3uKK_rp?c#BSJX#IeZ@})@z`Ngf z4VL?d+l5FxirqZKdsT@1?vu~nIVEM?haG6gFgFjum?aqB7s5FE_6dBw!n}|J48IPx z-;glbfFI}|enklJKmO`{xG3x7QP%l)ayS-p+z8?bxuXg14lzXT@5W;xFP=Y#%jD*Z z`s-i>VB~+n2rTXkLE@L+K7-r*&DRj`xM75LFuH$)@6agrj)dHN{q>h{f4~b;*5yKo zD$BCn2&NJQkK)#DkayG$Mcs#=nOQ>}d4Ld-v_MO$M)lNX{ML@-bucGHAfW;FTgY0o z5pvY%;9z~&G_G3EN|!wtKWYadsH*ck`Uqx-kC?LNh1539b6>6Mj1yFq(T%})Mu<|P z{`EUYHRLE|9W}JFd7d*l)hk43sBL6@G9yF%37Gi3@<4s%0On`_s~iji3={7}A&|38q}?Vd-wb!0}!%sgZV z+r0|jGtnNlTVP6n=AI!lLS||Rz6T?BVPp?;Yj#V7PZjd0H3W0nV^Rf~o04&s`54v_ zHButd0Amluc|zcMrgBDb7>wkS2;p(ykxFF(UIkT|fcPVF2MAyTh{yv>!laRTLotyF zeuI$NQ5F(`AVlU29MCXe7+~Apgxd|+F^Ov8ydfCL9^)AyXO6O#c(svBx7`GX>7u6|jY|hei>38Q=$I%hfeGuXtIo&g*N_WO z13DH$kELQxwNY?h2*F{rKTopQqi*YCyhCe()F#LUqs~3}6 zjwl3}6QXVPo*4?W2H)4q^UGeRE!tP=+(ymUfF5W)#pAOs_bBTtn&tSIemaA;j$wgb|m^7D4p=tz$bO{@O+4zae4Wbc{Z{sAHbK z6oPmKLR`<}2M~S1LCD&0SsGDx>#m`1H9}rn)IrE_W$JEZ8=is?Hj=6^aEt~wRBDP? zvp?=qmSAWAAr(`aJ@1D1v?@j>9aG%o!&S+KvRp2vHwZbJ7|suS9~dDXDlO*qqF7Z$ z&$H!*uR0Heph_=_BrY14>H`~>izRf=9c}pBl=ablAzT#;TeXI(#mH6XYN|nQ1BR}T zfH`#RgKeP?BTMlmLQ+@Mp+@?xMQqvgxJ%)P>fHvIs$8YZA|LFi0k$H%?)+0z*5ghL zNz5<_rSw86h-f^*8XPtPlS(zTl9;ImF;+E=l(&>HLC&oqKe{6Xvj*cZmOfCaXnX)d zlMFzOA2!vN*@Q8`1i%=%WMYT`fJv+bj~n7Q0{(|WH3WLAU;_j&-5Im2X&g+91kVV0 z+*3&p6GOV2BjMdNcKeu;m+Poo5WJs0kq6AwH;0KK-odD&Y=Ou%x`!Q@TNpimV)(~{ zkS)NYcVN5TY+Y>+S(YS@f2L{P0tT+*V)Ga9HQ_LfqN!?qusrX(X*r5dtS$ zD|9goskbZyzBVK$mu@zSBX!Cs3ob`^io;7`45Be(^FrWq1VJu^RZ;qug}|km2_nS9 z4~-5=(GcY-n~xBev;H0s5>fw;k1R0td%A}*5!9TEjHxNzhG#gHk4F7+NdB$EZ13&ja^DP#;8x|Kqq z(Em`s%Tbk(_}V+{XCnkgJX=rC_wIC`E@px&4?zNMP@#nCjVNTpJkiL!<~T*A+aXZo zTDQ4383P$7Aae->nKA}R zGRJ5y&`bMQJD<)1$w-qVYjp@bvU@vJ#1q2>NE;;^vC>XK;F0s~vmi3)0rejf62LN+#(>R&cVij^XA*hZv8HL|%HM%_YMOKwh~8fk!^_ybUBvsMb!0K$ZU1B!sM$ zQDVZc>I7MB6)s?kqZ^bEQ$Hk$xxK~7KL~;j`)NL4-eeSHG02vtEL-rDrg!Cl29Y6Y z3$>=f#cmZtp3^u4?1T%1U#B4Gj=cX$2O)H{HjTTaOB!|iO0V`yHi$z|m>8K`K~`Jz z*?DAlUa7k9MXfX!Cj8Qef^2rNw^QU=2a#3xWDRo(g3I~)9akp-WWwk{8s-)x{GNJ; z7jO4I+;V?ZNQgt3P`5*{EaAboo5KLI`=rerg4hRPq|?tKWLhXihAoSz-!ve1?0w83 zSfgn4S`c3-gc9?uizOYyPLW?R%vnhGE%bam8jqg29fD^y={AZpZ?Ys83q78iY;EfS?M|BRfGh@G_UC1g zb??mX*$>Uef=cyUd9hOwi>+zg%0lFk>Mu#GP<7-%*>V85yq+h!)3?l=)M zUnEu4drySu%X^c*jvXBTIP!X7I)kV8>bcx*y|Ul$=j9or{J6B^l3}BoBh?N1 zt9^qm(qrJcEB#KFEHc=9ulg(xWDiAsoK|E$eo}pH_IQTB>@C?yk ze9&ac!W?gALf5vD^?Dgt@O%Ew=Kj>_ zO>74y+j#Hz!c+H`KF#cV5Td?V%ZixE7NgmS^KdhwG~BWUQijH6nvbY8W>vycdX1ph zqq9^x{>eEVpNXKHjnHqIUz#Dnqi0Ber3HcRSysQ>agi-SfShq(23J;p)s+TM7~J6K zr7IfkU=0Bwm%GV(+OyX*40&evc*y6wFxzpybGR_oI80V%uicPZg@hE()JY=_&xzFR z)QY1K-IDa=JU)qrxbDeVW(b19u_=Q_JUUOU^9DZ|BB?e*nlETh(lNBZ;3b&lm#nr6 zyj%rVNB7+BAn0EN?u95#fxFV&7lQ!|RtE;J?TWMs^uq~x5>iSn>tk*0Pi=lVv3gS{ z$-;Fq-__>trqg)7LFgNA?*mgcNlk%Wj~ zHj9R%go2QqE$Ei9Fkd7maWsSX7bB$G?_$EO1(r8JJsJ$IK7fe25Bp;fvYgt}HQj|LYoFf|;(X-udAOS-bH4{g;eWM_`x8=CbO^mhZDNg> zUW1TE68^w8`37Bn=U-00Pr8H#cB%uRhc6>QOVRGm)%qH}mElQSux#K+$qDs~Q8X{_z zHI7qgcNm)NhL3a3&s#K3>6ma3LboDC2!`?4ibph$sdX&~X`~3Updn!%^6SPIY6wsc zA)05k2ikX1wN*j{uG^NPz7i!1e*J^nx2)CSgcx;BIj3P}gcQ;}-`!Aj4BngeEZ-3> ze`kRZKDXBvME$^n2j`JaDZQ1L%ML?ZdZNY)G5TW^X zqjd(6Z;j(TV&aSl8dB0s9Z*Xi6+i8j%~3nhG_BojN_gRdrG7`F!ljv6*KP=*?s&k!OrWbXkZ`r@c2-+M7| z0HTow*;ft~rx-T3Z%cWWr5}|EP5YD~PygoF1y@o6Ewua29N5a8**Mogqg8ITpQ_4ax5aWzDqeeq4nORplYL5Ny2IGsriREA`R@A?7bn)*U!R^HfBQT2&7NOQ zga(uVsXNZA+Cu z*T<*LW3?V8zFG6qcP6EzNZoOkul{h_#5Gd?j)c|QzkT~vIrtxKcWA>f5JLeJnVsZP zOP20v3$s9FDd3lQh3*iAhX&sQ9U;SYfmTtXD1mMK;E_+hb?zm0wD|oPu>RF>-_(tOV={cR5ofFR&WGK(>9ql*aQ&^`|7krmK=~9 zzE}Jwn4&B+(lrB(`22bx$yqI=jt&87kcSmd$Y@N~mjiHg$=)uz!j18PPf7EDL4FL7 z?;xH-^6|!i#LM30#2`6+Bk}KmKteEw_@^w|CFKYJI6)D9UYZlwJYy%K&XXIijOzhz zuDcdc;6^~GvPZ7S(JpCprWz~1X=$!4u+*?BR&Lk@+3pI8i2Ceg9#Je(dpyIo6x7dyNFsWU2^M(!qFa4!F$RI8R4F81K5n#3W(33H$Gc0l@`T)6@VFgfUA5jFD05 zBa8^65s)0M^&&c_MTlb*!Hl=+Qw|Y8T~bxO8{)A%C}L+;h>ek?#p3(tA)v#H>5k<^ zn2fC8W>uk>AfPxDx0rtMb%c1-PFr0B6UPghW%U`8nPU9AUq?SFsel4+o$*Kvki>As zT$dwkJ|A#wJ^>F}cPvX)hjulh7{{KNF?Nk~F{VroHOt>IB3=Z77u64xO^Yf6jFPnw zYhH*8)ldWiKH_YEApi+9XvoN6?AYjr#X;^_ZYv}=3kY3&x<4FH4kOmKv@W#; zgVBQP%0xUg!xx*`2pg^~QvwYxJnizt6$rk2Isn>`T^ZSmfMr<`=u#)bjL68Y&11us zPr8WbIeOo7+vP4bfJea({^G6Qbg`_+*kF1X+3uVbB98u4orgP*i~5$E)BTKVa~Z|O zxb4npVcjlwF~mymyED2Ej%08I5Nx>wH>{&csFatY;%teBubvcMj z42_vIO7LE$RBu-RtNZ?Y+}r$-g7d_0!-y6dW@Mqf&xM{>GqUQ)t|^Qw1138Cr7nBt<`c&eqU zs^vqzn3rGdZ)JBw)Y2YP;JGzR>xCcJ^dWOIpd6j+-Rog`l+{k%lBBzwsaHRa(;nOpJM5>qO^kx&{z@%+d3;;QbF;HfWwmQjb5f!b4r^WwdO^Z|G9D zotCuhcN7=0roL;Gy5c=+&5AH`(%=}N>p@cod7hx=Ys)$~$__6obGP5`-#j3aPn**1 zZL@yg402|$>2>b;8c?4ZQZZ+ga?{ZYxvn8B04_rMdS%zYZ_75CN}Fc_cQM zgSO=VuE{f2^ilUIYUzWb#!NrphOrgy||^s6Hazo4yjHXFQO zQ`J*{Q>B!H3<=~$Hu`7=KQ4I}nq;M({4fv^B^)j7Lz2_EB_YH#Ow+1sJtocQJbOplT{AlSKTSMw!3Ob=ev4#e|xi0NF` zvmoeJ^y8hkJ^Z5l7YGPGJB?_wb5VYCygYmxiOrgIKnQX`*8*LDa9r(ULQ6Y*PSYP7 zr4{k}A0F!u3tC$0aKH7$bk@_Al;Pi-5Lrtiy%JUL*}y4 z*;?N@^zPrgkXG71bd8KmNYfjLn0}=P;$fG5Om_z2$yUJ%f8TZPblYXWwFe8>YV7j@ z;qkf^wF-N|-@49W^}jx}(zE%&F9+vUx40~vd=S(9brrAcAtH`CcyVF|6v1A`8|7CI zcJN(2XfN0D{DPiISC(#5LKv@^e%0tXOTDHSyeM_WhDz}lTHjswf-^n3tG#*4gG!*TFn)sLmbB==mQtw^)rZX{Ni%R{ij)U-IOdc~AEnor^t> zO0Q7*w0?XnJ$AIy5TQlWf1(AAZfkkyK^XCG8+g5^?K-8$PgbJu%MnKHmu*P4I77aB zf8#v_FY1ycJw^+fBn`th5IrN^Z%g}SNm>bODu+06S&GDl6tzl{WCh!LN2)a6Nmq?7 zMFrKTJX+Kun$z~Rt+X$e2awYR?O3Z6)$pzwZd&{1Rp}Y#(TwDIQWbsbE$Q7EwcLA@ z4nL}LIbY5<(|#*mY3oC+#}N+Cck;T<9=>&L1)h_mJZ+Y|@?|@n*HkC1YtBrXONm4EyG^)X(dz2moFPz*g471s}aJt z)R($f=ta$PK7Gj%yzoP1QPTAupOYlB`$?DYz{2FIW`0`@6$d;j<#QVlhH1J-nu`$zj4#AERtcrQE(WyQ*|C=Cshxz z;$qu%QYitu3SssX_7~!el5(k0Tva%bmhFg;jLqJ(9h)P>o>hn~7>Zz|d}Lqw*s)PY z;XvGW(g6mkdcCgjG_$&@$i_uQ$k@bCcxN`n!wvLs`;p?Zw|3*=%56gryv(i&)Rqy- ztX2dH{K&BR_G$<|6CT*HUBTrMLlqIjju1y&q4c;|&y@QY_4qhLzygt7>^!RQvW#%% zQANfa8S7#Ofh|NGT(C)FdsQKhLNX}@R-(NcQ5Zl?Kpznfrd+QG*eF(P*-6QWL+#l* zm|V5pjLQQ&!bU*CuFJCQI_}L+>X=dtxZ%cL*;tF=gX12;$$K>cF#>mrp~J*6MIaTA zvKAT`W>j(@VFba9&CELigpFxa3Wg|+1yI6AFvj#^n>cpIw3+b{CNzcx4URR)gqMgS zjwcEH*Z^+nfk@kCB;r^yu@LK{v9XC89Mj1x(8MSuD1nY)hz(;H7^~rtV+2U}M4dqc z5jG8;Ppp9L__}#S6BFg*zaF}|+DW|f2~IK$>KHr#8H2~d8j$>@>2sinm8hz60QGx_7jT8T@< zWKd#xN+ul+k+>uUIycOa>13x@GBQFt;>bK1OT`b|2$Ud@u>#4+EEvLcehKG~hU2sX zaUiGGSQppbM0wi$p+ChofsPOnfW8(rcG8p)y{2q1pi`15OlhV;t_3)8FakJ<0K(VZ zu;~&c$RxwZ=>-l5EC(VP0Z2oD4=fG^-pvC-SPmv%9V~}&l9d=}Rv?IT)tL41ND5)Q zf?^ep#}@%*=?vo-+kFm;h2s$6Nor5NY?$F#4hC`aWrTUu?(YKV)BM>2|AXElX-UBI%fzz(P&?7DWH+{zAk0^+=^q=csanP&hp zwqk25VJ4N55wcg~mj{7`#R1cXttgNQFl1u}PO!nIOE?60!dB_6{Pnj*7h!oUN*`FV z(=dGshA_^g>h!@bwqugQrtFf|a<^y`%qC5pi#oq3^%;{8&aegK3gDDDDdMon8O6FS z6JnGsp*&!27?YsF4?VHHcG;3%5eUy+DSL@qrRLgmYFZQ^spgy z%)yt|8@*D57t@ZE$9F&`LU>Vyk$gB`L4zdY_(1x^z&^N@a6l^#GBk7KrKj@`^SndMF2GD|415J;%g(X9f+ca~j=ESFPuWv`SV8N9C5Z0b!(@ z9Wc#~x&f5q2tNBE#SV~*PoL2n2LvzZQFB#E^y5zb-3LU7aj#xX56)m6^7EH19fG=Uh0S!ZG^EQ9U%U=#p3<<|dO$cjrxMiK z>b@R`KW*H%`1WvJg|*X$c6qmGMF=vaFE*b4zCzAA6%F2zoqX`gN<9M36Fm^iCF|>F;I~fLlr}g*nkU_M_PN-w%3f(45Iuqn z+MqZ6cj`ROSyX&c>x(bub_U|T1M%qD*`LYGkj`A5?L=Sg_&Dd)f0-4}m+gedN-{rcU8mvc7XRC+xSh?HccMd8{Jpo% zYFiMHLN{D|jZZ$DOJ247^>-Wuqgd8n-yQI1Vv5lLqH(g-uMVT(ft>%S96*g6yKnqzZG-kLnxIz2b*^wAi%5C z%)D2P5c+aYl@4%I`i@d@ea$Lod$iOmtYs$|5{U)#8NKNq!s^LzSUr3b7S#O%dJjqv z&(2n-=$*MYm05X~>_b;-^mT>3}DA@$=$t9FT9%J->Os^yg4a4`$40 z5i+DtYbD)pl`5FN-o?2cMe{L_&(;Rb@}Te;fBbATo(^zajcIDZ(ux7KG02cSS}3)3 z5T$dLklD1Ny@z56G9+BA&JJ#MWUWsh+=Hw_Tx%HuvhjP5oOdce2_H?RI>-%L+ACHh z`_R&sw~V8=7kTdI@5IgJ^24SUXGn*Z15vBgRJ`bgh|osXWOdoMwqlpeAO*H&-h2ZUgz$7-dKKcP z4z6_RQWOh&TMZR`DX9>Ug|$@iDGU#8^b_tn1SEciwr!sMVni|m64=KOpv$O?Eepx0 zz++hvsI15WZ@2;@P<#%F6|e)^29tLMf?URfO+AnWjAU1kc|j%^cpR2NMkcb$6Ov(W z44GtH0RRBOtYPLLwvLV1499FDLynL7g6)pLH5)^YjWFmS3GfIw%P20#MA;!h23H6% zn8;ujfGacW&|`B>U}wfZM`1w7n4oH~IRGQZ25_ARDQ6D?0yMZmBR8rBoO!;>>&k9p~*R9^rlY`hu8=1$p;28iH8sYDPUmM!e{(rC5pL;cFYDn z*1#TNMU)XE6R}7l8vEnO*iB-MFcHGV;$&imv;dDI<-lNT@UeyG1X$%)cCYFo!pe9``VxW|5_GAWXZHCAqhIxjC$9KOUX4J zOgdv?8k7+^k{byTOh$uap^4ei-*{;1o12J_`BOc(rXmPW&?L&&VNVzAI?Sm-)=p?{ z!u&tAvx!PvmAGytZl;!!YvOa-Pe_8OBIW*9EbMrTEGUr5^Hzux(A1|L7zLUFaV};$ zmMr*l2n?v@nKjw3*P-+n5Cc@D^DJU}z~t zJ1`0?4FT-iAr1f_2td)o#{F+>V$PyTF}xS4e~d(w-H&0(j3&$tSqIkk0iiCo-SqvCT7M#14aQe6999SUnert*{%Qp N002ovPDHLkV1f$s#LfT! diff --git a/vendor/github.com/docker/docker/experimental/images/vlans-deeper-look.svg b/vendor/github.com/docker/docker/experimental/images/vlans-deeper-look.svg deleted file mode 100644 index 96cd21d52..000000000 --- a/vendor/github.com/docker/docker/experimental/images/vlans-deeper-look.svg +++ /dev/null @@ -1 +0,0 @@ -DockerHost:Frontend,Backend &CreditCardAppTiersareIsolatedbutcanstillcommunicateinsideinterfaceoranyotherDockerhostsusingtheparentVLANID802.1QTrunk -canbeasingleEthernetlinkorMultipleBondedEthernetlinksInterfaceeth0Container(s)Eth010.1.20.0/24Parent:eth0.20VLANID:20CreditCardsBackendContainer(s)Eth010.1.30.0/24Container(s)Eth010.1.10.0/24FrontendGateway10.1.20.1andothercontainersonthesameVLAN/subnetGateway10.1.10.1andothercontainersonthesameVLAN/subnetGateway10.1.30.1andothercontainersonthesameVLAN/subnet:Parenteth0.10VLANID:10Parent:eth0.30VLAN:30NetworkotherDockerHosts \ No newline at end of file diff --git a/vendor/github.com/docker/docker/experimental/vlan-networks.md b/vendor/github.com/docker/docker/experimental/vlan-networks.md deleted file mode 100644 index caec6d6c6..000000000 --- a/vendor/github.com/docker/docker/experimental/vlan-networks.md +++ /dev/null @@ -1,471 +0,0 @@ -# Ipvlan Network Driver - -### Getting Started - -The Ipvlan driver is currently in experimental mode in order to incubate Docker users use cases and vet the implementation to ensure a hardened, production ready driver in a future release. Libnetwork now gives users total control over both IPv4 and IPv6 addressing. The VLAN driver builds on top of that in giving operators complete control of layer 2 VLAN tagging and even Ipvlan L3 routing for users interested in underlay network integration. For overlay deployments that abstract away physical constraints see the [multi-host overlay ](https://docs.docker.com/engine/userguide/networking/get-started-overlay/) driver. - -Ipvlan is a new twist on the tried and true network virtualization technique. The Linux implementations are extremely lightweight because rather than using the traditional Linux bridge for isolation, they are simply associated to a Linux Ethernet interface or sub-interface to enforce separation between networks and connectivity to the physical network. - -Ipvlan offers a number of unique features and plenty of room for further innovations with the various modes. Two high level advantages of these approaches are, the positive performance implications of bypassing the Linux bridge and the simplicity of having less moving parts. Removing the bridge that traditionally resides in between the Docker host NIC and container interface leaves a very simple setup consisting of container interfaces, attached directly to the Docker host interface. This result is easy access for external facing services as there is no port mappings in these scenarios. - -### Pre-Requisites - -- The examples on this page are all single host and setup using Docker experimental builds that can be installed with the following instructions: [Install Docker experimental](https://github.com/docker/docker/tree/master/experimental) - -- All of the examples can be performed on a single host running Docker. Any examples using a sub-interface like `eth0.10` can be replaced with `eth0` or any other valid parent interface on the Docker host. Sub-interfaces with a `.` are created on the fly. `-o parent` interfaces can also be left out of the `docker network create` all together and the driver will create a `dummy` interface that will enable local host connectivity to perform the examples. - -- Kernel requirements: - - - To check your current kernel version, use `uname -r` to display your kernel version - - Ipvlan Linux kernel v4.2+ (support for earlier kernels exists but is buggy) - -### Ipvlan L2 Mode Example Usage - -The ipvlan `L2` mode example is like the following image. The driver is specified with `-d driver_name` option. In this case `-d ipvlan`. - -![Simple Ipvlan L2 Mode Example](images/ipvlan_l2_simple.png) - -The parent interface in the next example `-o parent=eth0` is configured as followed: - -``` -ip addr show eth0 -3: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 - inet 192.168.1.250/24 brd 192.168.1.255 scope global eth0 -``` - -Use the network from the host's interface as the `--subnet` in the `docker network create`. The container will be attached to the same network as the host interface as set via the `-o parent=` option. - -Create the ipvlan network and run a container attaching to it: - -``` -# Ipvlan (-o ipvlan_mode= Defaults to L2 mode if not specified) -docker network create -d ipvlan \ - --subnet=192.168.1.0/24 \ - --gateway=192.168.1.1 \ - -o ipvlan_mode=l2 \ - -o parent=eth0 db_net - -# Start a container on the db_net network -docker run --net=db_net -it --rm alpine /bin/sh - -# NOTE: the containers can NOT ping the underlying host interfaces as -# they are intentionally filtered by Linux for additional isolation. -``` - -The default mode for Ipvlan is `l2`. If `-o ipvlan_mode=` are left unspecified, the default mode will be used. Similarly, if the `--gateway` is left empty, the first usable address on the network will be set as the gateway. For example, if the subnet provided in the network create is `--subnet=192.168.1.0/24` then the gateway the container receives is `192.168.1.1`. - -To help understand how this mode interacts with other hosts, the following figure shows the same layer 2 segment between two Docker hosts that applies to and Ipvlan L2 mode. - -![Multiple Ipvlan Hosts](images/macvlan-bridge-ipvlan-l2.png) - -The following will create the exact same network as the network `db_net` created prior, with the driver defaults for `--gateway=192.168.1.1` and `-o ipvlan_mode=l2`. - -``` -# Ipvlan (-o ipvlan_mode= Defaults to L2 mode if not specified) -docker network create -d ipvlan \ - --subnet=192.168.1.0/24 \ - -o parent=eth0 db_net_ipv - -# Start a container with an explicit name in daemon mode -docker run --net=db_net_ipv --name=ipv1 -itd alpine /bin/sh - -# Start a second container and ping using the container name -# to see the docker included name resolution functionality -docker run --net=db_net_ipv --name=ipv2 -it --rm alpine /bin/sh -ping -c 4 ipv1 - -# NOTE: the containers can NOT ping the underlying host interfaces as -# they are intentionally filtered by Linux for additional isolation. -``` - -The drivers also support the `--internal` flag that will completely isolate containers on a network from any communications external to that network. Since network isolation is tightly coupled to the network's parent interface the result of leaving the `-o parent=` option off of a network create is the exact same as the `--internal` option. If the parent interface is not specified or the `--internal` flag is used, a netlink type `dummy` parent interface is created for the user and used as the parent interface effectively isolating the network completely. - -The following two `docker network create` examples result in identical networks that you can attach container to: - -``` -# Empty '-o parent=' creates an isolated network -docker network create -d ipvlan \ - --subnet=192.168.10.0/24 isolated1 - -# Explicit '--internal' flag is the same: -docker network create -d ipvlan \ - --subnet=192.168.11.0/24 --internal isolated2 - -# Even the '--subnet=' can be left empty and the default -# IPAM subnet of 172.18.0.0/16 will be assigned -docker network create -d ipvlan isolated3 - -docker run --net=isolated1 --name=cid1 -it --rm alpine /bin/sh -docker run --net=isolated2 --name=cid2 -it --rm alpine /bin/sh -docker run --net=isolated3 --name=cid3 -it --rm alpine /bin/sh - -# To attach to any use `docker exec` and start a shell -docker exec -it cid1 /bin/sh -docker exec -it cid2 /bin/sh -docker exec -it cid3 /bin/sh -``` - -### Ipvlan 802.1q Trunk L2 Mode Example Usage - -Architecturally, Ipvlan L2 mode trunking is the same as Macvlan with regard to gateways and L2 path isolation. There are nuances that can be advantageous for CAM table pressure in ToR switches, one MAC per port and MAC exhaustion on a host's parent NIC to name a few. The 802.1q trunk scenario looks the same. Both modes adhere to tagging standards and have seamless integration with the physical network for underlay integration and hardware vendor plugin integrations. - -Hosts on the same VLAN are typically on the same subnet and almost always are grouped together based on their security policy. In most scenarios, a multi-tier application is tiered into different subnets because the security profile of each process requires some form of isolation. For example, hosting your credit card processing on the same virtual network as the frontend webserver would be a regulatory compliance issue, along with circumventing the long standing best practice of layered defense in depth architectures. VLANs or the equivocal VNI (Virtual Network Identifier) when using the Overlay driver, are the first step in isolating tenant traffic. - -![Docker VLANs in Depth](images/vlans-deeper-look.png) - -The Linux sub-interface tagged with a vlan can either already exist or will be created when you call a `docker network create`. `docker network rm` will delete the sub-interface. Parent interfaces such as `eth0` are not deleted, only sub-interfaces with a netlink parent index > 0. - -For the driver to add/delete the vlan sub-interfaces the format needs to be `interface_name.vlan_tag`. Other sub-interface naming can be used as the specified parent, but the link will not be deleted automatically when `docker network rm` is invoked. - -The option to use either existing parent vlan sub-interfaces or let Docker manage them enables the user to either completely manage the Linux interfaces and networking or let Docker create and delete the Vlan parent sub-interfaces (netlink `ip link`) with no effort from the user. - -For example: `eth0.10` to denote a sub-interface of `eth0` tagged with vlan id `10`. The equivalent `ip link` command would be `ip link add link eth0 name eth0.10 type vlan id 10`. - -The example creates the vlan tagged networks and then start two containers to test connectivity between containers. Different Vlans cannot ping one another without a router routing between the two networks. The default namespace is not reachable per ipvlan design in order to isolate container namespaces from the underlying host. - -**Vlan ID 20** - -In the first network tagged and isolated by the Docker host, `eth0.20` is the parent interface tagged with vlan id `20` specified with `-o parent=eth0.20`. Other naming formats can be used, but the links need to be added and deleted manually using `ip link` or Linux configuration files. As long as the `-o parent` exists anything can be used if compliant with Linux netlink. - -``` -# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged -docker network create -d ipvlan \ - --subnet=192.168.20.0/24 \ - --gateway=192.168.20.1 \ - -o parent=eth0.20 ipvlan20 - -# in two separate terminals, start a Docker container and the containers can now ping one another. -docker run --net=ipvlan20 -it --name ivlan_test1 --rm alpine /bin/sh -docker run --net=ipvlan20 -it --name ivlan_test2 --rm alpine /bin/sh -``` - -**Vlan ID 30** - -In the second network, tagged and isolated by the Docker host, `eth0.30` is the parent interface tagged with vlan id `30` specified with `-o parent=eth0.30`. The `ipvlan_mode=` defaults to l2 mode `ipvlan_mode=l2`. It can also be explicitly set with the same result as shown in the next example. - -``` -# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged. -docker network create -d ipvlan \ - --subnet=192.168.30.0/24 \ - --gateway=192.168.30.1 \ - -o parent=eth0.30 \ - -o ipvlan_mode=l2 ipvlan30 - -# in two separate terminals, start a Docker container and the containers can now ping one another. -docker run --net=ipvlan30 -it --name ivlan_test3 --rm alpine /bin/sh -docker run --net=ipvlan30 -it --name ivlan_test4 --rm alpine /bin/sh -``` - -The gateway is set inside of the container as the default gateway. That gateway would typically be an external router on the network. - -``` -$ ip route - default via 192.168.30.1 dev eth0 - 192.168.30.0/24 dev eth0 src 192.168.30.2 -``` - -Example: Multi-Subnet Ipvlan L2 Mode starting two containers on the same subnet and pinging one another. In order for the `192.168.114.0/24` to reach `192.168.116.0/24` it requires an external router in L2 mode. L3 mode can route between subnets that share a common `-o parent=`. - -Secondary addresses on network routers are common as an address space becomes exhausted to add another secondary to a L3 vlan interface or commonly referred to as a "switched virtual interface" (SVI). - -``` -docker network create -d ipvlan \ - --subnet=192.168.114.0/24 --subnet=192.168.116.0/24 \ - --gateway=192.168.114.254 --gateway=192.168.116.254 \ - -o parent=eth0.114 \ - -o ipvlan_mode=l2 ipvlan114 - -docker run --net=ipvlan114 --ip=192.168.114.10 -it --rm alpine /bin/sh -docker run --net=ipvlan114 --ip=192.168.114.11 -it --rm alpine /bin/sh -``` - -A key takeaway is, operators have the ability to map their physical network into their virtual network for integrating containers into their environment with no operational overhauls required. NetOps simply drops an 802.1q trunk into the Docker host. That virtual link would be the `-o parent=` passed in the network creation. For untagged (non-VLAN) links, it is as simple as `-o parent=eth0` or for 802.1q trunks with VLAN IDs each network gets mapped to the corresponding VLAN/Subnet from the network. - -An example being, NetOps provides VLAN ID and the associated subnets for VLANs being passed on the Ethernet link to the Docker host server. Those values are simply plugged into the `docker network create` commands when provisioning the Docker networks. These are persistent configurations that are applied every time the Docker engine starts which alleviates having to manage often complex configuration files. The network interfaces can also be managed manually by being pre-created and docker networking will never modify them, simply use them as parent interfaces. Example mappings from NetOps to Docker network commands are as follows: - -- VLAN: 10, Subnet: 172.16.80.0/24, Gateway: 172.16.80.1 - - - `--subnet=172.16.80.0/24 --gateway=172.16.80.1 -o parent=eth0.10` - -- VLAN: 20, IP subnet: 172.16.50.0/22, Gateway: 172.16.50.1 - - - `--subnet=172.16.50.0/22 --gateway=172.16.50.1 -o parent=eth0.20 ` - -- VLAN: 30, Subnet: 10.1.100.0/16, Gateway: 10.1.100.1 - - - `--subnet=10.1.100.0/16 --gateway=10.1.100.1 -o parent=eth0.30` - -### IPVlan L3 Mode Example - -IPVlan will require routes to be distributed to each endpoint. The driver only builds the Ipvlan L3 mode port and attaches the container to the interface. Route distribution throughout a cluster is beyond the initial implementation of this single host scoped driver. In L3 mode, the Docker host is very similar to a router starting new networks in the container. They are on networks that the upstream network will not know about without route distribution. For those curious how Ipvlan L3 will fit into container networking see the following examples. - -![Docker Ipvlan L2 Mode](images/ipvlan-l3.png) - -Ipvlan L3 mode drops all broadcast and multicast traffic. This reason alone makes Ipvlan L3 mode a prime candidate for those looking for massive scale and predictable network integrations. It is predictable and in turn will lead to greater uptimes because there is no bridging involved. Bridging loops have been responsible for high profile outages that can be hard to pinpoint depending on the size of the failure domain. This is due to the cascading nature of BPDUs (Bridge Port Data Units) that are flooded throughout a broadcast domain (VLAN) to find and block topology loops. Eliminating bridging domains, or at the least, keeping them isolated to a pair of ToRs (top of rack switches) will reduce hard to troubleshoot bridging instabilities. Ipvlan L2 modes is well suited for isolated VLANs only trunked into a pair of ToRs that can provide a loop-free non-blocking fabric. The next step further is to route at the edge via Ipvlan L3 mode that reduces a failure domain to a local host only. - -- L3 mode needs to be on a separate subnet as the default namespace since it requires a netlink route in the default namespace pointing to the Ipvlan parent interface. - -- The parent interface used in this example is `eth0` and it is on the subnet `192.168.1.0/24`. Notice the `docker network` is **not** on the same subnet as `eth0`. - -- Unlike ipvlan l2 modes, different subnets/networks can ping one another as long as they share the same parent interface `-o parent=`. - -``` -ip a show eth0 -3: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 - link/ether 00:50:56:39:45:2e brd ff:ff:ff:ff:ff:ff - inet 192.168.1.250/24 brd 192.168.1.255 scope global eth0 -``` - --A traditional gateway doesn't mean much to an L3 mode Ipvlan interface since there is no broadcast traffic allowed. Because of that, the container default gateway simply point the the containers `eth0` device. See below for CLI output of `ip route` or `ip -6 route` from inside an L3 container for details. - -The mode ` -o ipvlan_mode=l3` must be explicitly specified since the default ipvlan mode is `l2`. - -The following example does not specify a parent interface. The network drivers will create a dummy type link for the user rather then rejecting the network creation and isolating containers from only communicating with one another. - -``` -# Create the Ipvlan L3 network -docker network create -d ipvlan \ - --subnet=192.168.214.0/24 \ - --subnet=10.1.214.0/24 \ - -o ipvlan_mode=l3 ipnet210 - -# Test 192.168.214.0/24 connectivity -docker run --net=ipnet210 --ip=192.168.214.10 -itd alpine /bin/sh -docker run --net=ipnet210 --ip=10.1.214.10 -itd alpine /bin/sh - -# Test L3 connectivity from 10.1.214.0/24 to 192.168.212.0/24 -docker run --net=ipnet210 --ip=192.168.214.9 -it --rm alpine ping -c 2 10.1.214.10 - -# Test L3 connectivity from 192.168.212.0/24 to 10.1.214.0/24 -docker run --net=ipnet210 --ip=10.1.214.9 -it --rm alpine ping -c 2 192.168.214.10 - -``` - -Notice there is no `--gateway=` option in the network create. The field is ignored if one is specified `l3` mode. Take a look at the container routing table from inside of the container: - -``` -# Inside an L3 mode container -$ ip route - default dev eth0 - 192.168.120.0/24 dev eth0 src 192.168.120.2 -``` - -In order to ping the containers from a remote Docker host or the container be able to ping a remote host, the remote host or the physical network in between need to have a route pointing to the host IP address of the container's Docker host eth interface. More on this as we evolve the Ipvlan `L3` story. - -### Dual Stack IPv4 IPv6 Ipvlan L2 Mode - -- Not only does Libnetwork give you complete control over IPv4 addressing, but it also gives you total control over IPv6 addressing as well as feature parity between the two address families. - -- The next example will start with IPv6 only. Start two containers on the same VLAN `139` and ping one another. Since the IPv4 subnet is not specified, the default IPAM will provision a default IPv4 subnet. That subnet is isolated unless the upstream network is explicitly routing it on VLAN `139`. - -``` -# Create a v6 network -docker network create -d ipvlan \ - --subnet=2001:db8:abc2::/64 --gateway=2001:db8:abc2::22 \ - -o parent=eth0.139 v6ipvlan139 - -# Start a container on the network -docker run --net=v6ipvlan139 -it --rm alpine /bin/sh - -``` - -View the container eth0 interface and v6 routing table: - -``` - eth0@if55: mtu 1500 qdisc noqueue state UNKNOWN group default - link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff - inet 172.18.0.2/16 scope global eth0 - valid_lft forever preferred_lft forever - inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link - valid_lft forever preferred_lft forever - inet6 2001:db8:abc2::1/64 scope link nodad - valid_lft forever preferred_lft forever - -root@5c1dc74b1daa:/# ip -6 route -2001:db8:abc4::/64 dev eth0 proto kernel metric 256 -2001:db8:abc2::/64 dev eth0 proto kernel metric 256 -default via 2001:db8:abc2::22 dev eth0 metric 1024 -``` - -Start a second container and ping the first container's v6 address. - -``` -$ docker run --net=v6ipvlan139 -it --rm alpine /bin/sh - -root@b817e42fcc54:/# ip a show eth0 -75: eth0@if55: mtu 1500 qdisc noqueue state UNKNOWN group default - link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff - inet 172.18.0.3/16 scope global eth0 - valid_lft forever preferred_lft forever - inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link tentative dadfailed - valid_lft forever preferred_lft forever - inet6 2001:db8:abc2::2/64 scope link nodad - valid_lft forever preferred_lft forever - -root@b817e42fcc54:/# ping6 2001:db8:abc2::1 -PING 2001:db8:abc2::1 (2001:db8:abc2::1): 56 data bytes -64 bytes from 2001:db8:abc2::1%eth0: icmp_seq=0 ttl=64 time=0.044 ms -64 bytes from 2001:db8:abc2::1%eth0: icmp_seq=1 ttl=64 time=0.058 ms - -2 packets transmitted, 2 packets received, 0% packet loss -round-trip min/avg/max/stddev = 0.044/0.051/0.058/0.000 ms -``` - -The next example with setup a dual stack IPv4/IPv6 network with an example VLAN ID of `140`. - -Next create a network with two IPv4 subnets and one IPv6 subnets, all of which have explicit gateways: - -``` -docker network create -d ipvlan \ - --subnet=192.168.140.0/24 --subnet=192.168.142.0/24 \ - --gateway=192.168.140.1 --gateway=192.168.142.1 \ - --subnet=2001:db8:abc9::/64 --gateway=2001:db8:abc9::22 \ - -o parent=eth0.140 \ - -o ipvlan_mode=l2 ipvlan140 -``` - -Start a container and view eth0 and both v4 & v6 routing tables: - -``` -docker run --net=v6ipvlan139 --ip6=2001:db8:abc2::51 -it --rm alpine /bin/sh - -root@3cce0d3575f3:/# ip a show eth0 -78: eth0@if77: mtu 1500 qdisc noqueue state UNKNOWN group default - link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff - inet 192.168.140.2/24 scope global eth0 - valid_lft forever preferred_lft forever - inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link - valid_lft forever preferred_lft forever - inet6 2001:db8:abc9::1/64 scope link nodad - valid_lft forever preferred_lft forever - -root@3cce0d3575f3:/# ip route -default via 192.168.140.1 dev eth0 -192.168.140.0/24 dev eth0 proto kernel scope link src 192.168.140.2 - -root@3cce0d3575f3:/# ip -6 route -2001:db8:abc4::/64 dev eth0 proto kernel metric 256 -2001:db8:abc9::/64 dev eth0 proto kernel metric 256 -default via 2001:db8:abc9::22 dev eth0 metric 1024 -``` - -Start a second container with a specific `--ip4` address and ping the first host using IPv4 packets: - -``` -docker run --net=ipvlan140 --ip=192.168.140.10 -it --rm alpine /bin/sh -``` - -**Note**: Different subnets on the same parent interface in Ipvlan `L2` mode cannot ping one another. That requires a router to proxy-arp the requests with a secondary subnet. However, Ipvlan `L3` will route the unicast traffic between disparate subnets as long as they share the same `-o parent` parent link. - -### Dual Stack IPv4 IPv6 Ipvlan L3 Mode - -**Example:** IpVlan L3 Mode Dual Stack IPv4/IPv6, Multi-Subnet w/ 802.1q Vlan Tag:118 - -As in all of the examples, a tagged VLAN interface does not have to be used. The sub-interfaces can be swapped with `eth0`, `eth1`, `bond0` or any other valid interface on the host other then the `lo` loopback. - -The primary difference you will see is that L3 mode does not create a default route with a next-hop but rather sets a default route pointing to `dev eth` only since ARP/Broadcasts/Multicast are all filtered by Linux as per the design. Since the parent interface is essentially acting as a router, the parent interface IP and subnet needs to be different from the container networks. That is the opposite of bridge and L2 modes, which need to be on the same subnet (broadcast domain) in order to forward broadcast and multicast packets. - -``` -# Create an IPv6+IPv4 Dual Stack Ipvlan L3 network -# Gateways for both v4 and v6 are set to a dev e.g. 'default dev eth0' -docker network create -d ipvlan \ - --subnet=192.168.110.0/24 \ - --subnet=192.168.112.0/24 \ - --subnet=2001:db8:abc6::/64 \ - -o parent=eth0 \ - -o ipvlan_mode=l3 ipnet110 - - -# Start a few of containers on the network (ipnet110) -# in separate terminals and check connectivity -docker run --net=ipnet110 -it --rm alpine /bin/sh -# Start a second container specifying the v6 address -docker run --net=ipnet110 --ip6=2001:db8:abc6::10 -it --rm alpine /bin/sh -# Start a third specifying the IPv4 address -docker run --net=ipnet110 --ip=192.168.112.50 -it --rm alpine /bin/sh -# Start a 4th specifying both the IPv4 and IPv6 addresses -docker run --net=ipnet110 --ip6=2001:db8:abc6::50 --ip=192.168.112.50 -it --rm alpine /bin/sh -``` - -Interface and routing table outputs are as follows: - -``` -root@3a368b2a982e:/# ip a show eth0 -63: eth0@if59: mtu 1500 qdisc noqueue state UNKNOWN group default - link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff - inet 192.168.112.2/24 scope global eth0 - valid_lft forever preferred_lft forever - inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link - valid_lft forever preferred_lft forever - inet6 2001:db8:abc6::10/64 scope link nodad - valid_lft forever preferred_lft forever - -# Note the default route is simply the eth device because ARPs are filtered. -root@3a368b2a982e:/# ip route - default dev eth0 scope link - 192.168.112.0/24 dev eth0 proto kernel scope link src 192.168.112.2 - -root@3a368b2a982e:/# ip -6 route -2001:db8:abc4::/64 dev eth0 proto kernel metric 256 -2001:db8:abc6::/64 dev eth0 proto kernel metric 256 -default dev eth0 metric 1024 -``` - -*Note:* There may be a bug when specifying `--ip6=` addresses when you delete a container with a specified v6 address and then start a new container with the same v6 address it throws the following like the address isn't properly being released to the v6 pool. It will fail to unmount the container and be left dead. - -``` -docker: Error response from daemon: Address already in use. -``` - -### Manually Creating 802.1q Links - -**Vlan ID 40** - -If a user does not want the driver to create the vlan sub-interface it simply needs to exist prior to the `docker network create`. If you have sub-interface naming that is not `interface.vlan_id` it is honored in the `-o parent=` option again as long as the interface exists and us up. - -Links if manually created can be named anything you want. As long as the exist when the network is created that is all that matters. Manually created links do not get deleted regardless of the name when the network is deleted with `docker network rm`. - -``` -# create a new sub-interface tied to dot1q vlan 40 -ip link add link eth0 name eth0.40 type vlan id 40 - -# enable the new sub-interface -ip link set eth0.40 up - -# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged -docker network create -d ipvlan \ - --subnet=192.168.40.0/24 \ - --gateway=192.168.40.1 \ - -o parent=eth0.40 ipvlan40 - -# in two separate terminals, start a Docker container and the containers can now ping one another. -docker run --net=ipvlan40 -it --name ivlan_test5 --rm alpine /bin/sh -docker run --net=ipvlan40 -it --name ivlan_test6 --rm alpine /bin/sh -``` - -**Example:** Vlan sub-interface manually created with any name: - -``` -# create a new sub interface tied to dot1q vlan 40 -ip link add link eth0 name foo type vlan id 40 - -# enable the new sub-interface -ip link set foo up - -# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged -docker network create -d ipvlan \ - --subnet=192.168.40.0/24 --gateway=192.168.40.1 \ - -o parent=foo ipvlan40 - -# in two separate terminals, start a Docker container and the containers can now ping one another. -docker run --net=ipvlan40 -it --name ivlan_test5 --rm alpine /bin/sh -docker run --net=ipvlan40 -it --name ivlan_test6 --rm alpine /bin/sh -``` - -Manually created links can be cleaned up with: - -``` -ip link del foo -``` - -As with all of the Libnetwork drivers, they can be mixed and matched, even as far as running 3rd party ecosystem drivers in parallel for maximum flexibility to the Docker user. diff --git a/vendor/github.com/docker/docker/hack/Jenkins/W2L/postbuild.sh b/vendor/github.com/docker/docker/hack/Jenkins/W2L/postbuild.sh deleted file mode 100644 index 662e2dcc3..000000000 --- a/vendor/github.com/docker/docker/hack/Jenkins/W2L/postbuild.sh +++ /dev/null @@ -1,35 +0,0 @@ -set +x -set +e - -echo "" -echo "" -echo "---" -echo "Now starting POST-BUILD steps" -echo "---" -echo "" - -echo INFO: Pointing to $DOCKER_HOST - -if [ ! $(docker ps -aq | wc -l) -eq 0 ]; then - echo INFO: Removing containers... - ! docker rm -vf $(docker ps -aq) -fi - -# Remove all images which don't have docker or debian in the name -if [ ! $(docker images | sed -n '1!p' | grep -v 'docker' | grep -v 'debian' | awk '{ print $3 }' | wc -l) -eq 0 ]; then - echo INFO: Removing images... - ! docker rmi -f $(docker images | sed -n '1!p' | grep -v 'docker' | grep -v 'debian' | awk '{ print $3 }') -fi - -# Kill off any instances of git, go and docker, just in case -! taskkill -F -IM git.exe -T >& /dev/null -! taskkill -F -IM go.exe -T >& /dev/null -! taskkill -F -IM docker.exe -T >& /dev/null - -# Remove everything -! cd /c/jenkins/gopath/src/github.com/docker/docker -! rm -rfd * >& /dev/null -! rm -rfd .* >& /dev/null - -echo INFO: Cleanup complete -exit 0 \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/Jenkins/W2L/setup.sh b/vendor/github.com/docker/docker/hack/Jenkins/W2L/setup.sh deleted file mode 100644 index 30e5884d9..000000000 --- a/vendor/github.com/docker/docker/hack/Jenkins/W2L/setup.sh +++ /dev/null @@ -1,309 +0,0 @@ -# Jenkins CI script for Windows to Linux CI. -# Heavily modified by John Howard (@jhowardmsft) December 2015 to try to make it more reliable. -set +xe -SCRIPT_VER="Wed Apr 20 18:30:19 UTC 2016" - -# TODO to make (even) more resilient: -# - Wait for daemon to be running before executing docker commands -# - Check if jq is installed -# - Make sure bash is v4.3 or later. Can't do until all Azure nodes on the latest version -# - Make sure we are not running as local system. Can't do until all Azure nodes are updated. -# - Error if docker versions are not equal. Can't do until all Azure nodes are updated -# - Error if go versions are not equal. Can't do until all Azure nodes are updated. -# - Error if running 32-bit posix tools. Probably can take from bash --version and check contains "x86_64" -# - Warn if the CI directory cannot be deleted afterwards. Otherwise turdlets are left behind -# - Use %systemdrive% ($SYSTEMDRIVE) rather than hard code to c: for TEMP -# - Consider cross builing the Windows binary and copy across. That's a bit of a heavy lift. Only reason -# for doing that is that it mirrors the actual release process for docker.exe which is cross-built. -# However, should absolutely not be a problem if built natively, so nit-picking. -# - Tidy up of images and containers. Either here, or in the teardown script. - -ec=0 -uniques=1 -echo INFO: Started at `date`. Script version $SCRIPT_VER - - -# !README! -# There are two daemons running on the remote Linux host: -# - outer: specified by DOCKER_HOST, this is the daemon that will build and run the inner docker daemon -# from the sources matching the PR. -# - inner: runs on the host network, on a port number similar to that of DOCKER_HOST but the last two digits are inverted -# (2357 if DOCKER_HOST had port 2375; and 2367 if DOCKER_HOST had port 2376). -# The windows integration tests are run against this inner daemon. - -# get the ip, inner and outer ports. -ip="${DOCKER_HOST#*://}" -port_outer="${ip#*:}" -# inner port is like outer port with last two digits inverted. -port_inner=$(echo "$port_outer" | sed -E 's/(.)(.)$/\2\1/') -ip="${ip%%:*}" - -echo "INFO: IP=$ip PORT_OUTER=$port_outer PORT_INNER=$port_inner" - -# If TLS is enabled -if [ -n "$DOCKER_TLS_VERIFY" ]; then - protocol=https - if [ -z "$DOCKER_MACHINE_NAME" ]; then - ec=1 - echo "ERROR: DOCKER_MACHINE_NAME is undefined" - fi - certs=$(echo ~/.docker/machine/machines/$DOCKER_MACHINE_NAME) - curlopts="--cacert $certs/ca.pem --cert $certs/cert.pem --key $certs/key.pem" - run_extra_args="-v tlscerts:/etc/docker" - daemon_extra_args="--tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem" -else - protocol=http -fi - -# Save for use by make.sh and scripts it invokes -export MAIN_DOCKER_HOST="tcp://$ip:$port_inner" - -# Verify we can get the remote node to respond to _ping -if [ $ec -eq 0 ]; then - reply=`curl -s $curlopts $protocol://$ip:$port_outer/_ping` - if [ "$reply" != "OK" ]; then - ec=1 - echo "ERROR: Failed to get an 'OK' response from the docker daemon on the Linux node" - echo " at $ip:$port_outer when called with an http request for '_ping'. This implies that" - echo " either the daemon has crashed/is not running, or the Linux node is unavailable." - echo - echo " A regular ping to the remote Linux node is below. It should reply. If not, the" - echo " machine cannot be reached at all and may have crashed. If it does reply, it is" - echo " likely a case of the Linux daemon not running or having crashed, which requires" - echo " further investigation." - echo - echo " Try re-running this CI job, or ask on #docker-dev or #docker-maintainers" - echo " for someone to perform further diagnostics, or take this node out of rotation." - echo - ping $ip - else - echo "INFO: The Linux nodes outer daemon replied to a ping. Good!" - fi -fi - -# Get the version from the remote node. Note this may fail if jq is not installed. -# That's probably worth checking to make sure, just in case. -if [ $ec -eq 0 ]; then - remoteVersion=`curl -s $curlopts $protocol://$ip:$port_outer/version | jq -c '.Version'` - echo "INFO: Remote daemon is running docker version $remoteVersion" -fi - -# Compare versions. We should really fail if result is no 1. Output at end of script. -if [ $ec -eq 0 ]; then - uniques=`docker version | grep Version | /usr/bin/sort -u | wc -l` -fi - -# Make sure we are in repo -if [ $ec -eq 0 ]; then - if [ ! -d hack ]; then - echo "ERROR: Are you sure this is being launched from a the root of docker repository?" - echo " If this is a Windows CI machine, it should be c:\jenkins\gopath\src\github.com\docker\docker." - echo " Current directory is `pwd`" - ec=1 - fi -fi - -# Are we in split binary mode? -if [ `grep DOCKER_CLIENTONLY Makefile | wc -l` -gt 0 ]; then - splitBinary=0 - echo "INFO: Running in single binary mode" -else - splitBinary=1 - echo "INFO: Running in split binary mode" -fi - - -# Get the commit has and verify we have something -if [ $ec -eq 0 ]; then - export COMMITHASH=$(git rev-parse --short HEAD) - echo INFO: Commmit hash is $COMMITHASH - if [ -z $COMMITHASH ]; then - echo "ERROR: Failed to get commit hash. Are you sure this is a docker repository?" - ec=1 - fi -fi - -# Redirect to a temporary location. Check is here for local runs from Jenkins machines just in case not -# in the right directory where the repo is cloned. We also redirect TEMP to not use the environment -# TEMP as when running as a standard user (not local system), it otherwise exposes a bug in posix tar which -# will cause CI to fail from Windows to Linux. Obviously it's not best practice to ever run as local system... -if [ $ec -eq 0 ]; then - export TEMP=/c/CI/CI-$COMMITHASH - export TMP=$TEMP - /usr/bin/mkdir -p $TEMP # Make sure Linux mkdir for -p -fi - -# Tidy up time -if [ $ec -eq 0 ]; then - echo INFO: Deleting pre-existing containers and images... - - # Force remove all containers based on a previously built image with this commit - ! docker rm -f $(docker ps -aq --filter "ancestor=docker:$COMMITHASH") &>/dev/null - - # Force remove any container with this commithash as a name - ! docker rm -f $(docker ps -aq --filter "name=docker-$COMMITHASH") &>/dev/null - - # This SHOULD never happen, but just in case, also blow away any containers - # that might be around. - ! if [ ! $(docker ps -aq | wc -l) -eq 0 ]; then - echo WARN: There were some leftover containers. Cleaning them up. - ! docker rm -f $(docker ps -aq) - fi - - # Force remove the image if it exists - ! docker rmi -f "docker-$COMMITHASH" &>/dev/null -fi - -# Provide the docker version for debugging purposes. If these fail, game over. -# as the Linux box isn't responding for some reason. -if [ $ec -eq 0 ]; then - echo INFO: Docker version and info of the outer daemon on the Linux node - echo - docker version - ec=$? - if [ 0 -ne $ec ]; then - echo "ERROR: The main linux daemon does not appear to be running. Has the Linux node crashed?" - fi - echo -fi - -# Same as above, but docker info -if [ $ec -eq 0 ]; then - echo - docker info - ec=$? - if [ 0 -ne $ec ]; then - echo "ERROR: The main linux daemon does not appear to be running. Has the Linux node crashed?" - fi - echo -fi - -# build the daemon image -if [ $ec -eq 0 ]; then - echo "INFO: Running docker build on Linux host at $DOCKER_HOST" - if [ $splitBinary -eq 0 ]; then - set -x - docker build --rm --force-rm --build-arg APT_MIRROR=cdn-fastly.deb.debian.org -t "docker:$COMMITHASH" . - cat < -# See the blog post: https://blog.docker.com/2013/09/docker-can-now-run-within-docker/ -# -# This script should be executed inside a docker container in privileged mode -# ('docker run --privileged', introduced in docker 0.6). - -# Usage: dind CMD [ARG...] - -# apparmor sucks and Docker needs to know that it's in a container (c) @tianon -export container=docker - -if [ -d /sys/kernel/security ] && ! mountpoint -q /sys/kernel/security; then - mount -t securityfs none /sys/kernel/security || { - echo >&2 'Could not mount /sys/kernel/security.' - echo >&2 'AppArmor detection and --privileged mode might break.' - } -fi - -# Mount /tmp (conditionally) -if ! mountpoint -q /tmp; then - mount -t tmpfs none /tmp -fi - -if [ $# -gt 0 ]; then - exec "$@" -fi - -echo >&2 'ERROR: No command specified.' -echo >&2 'You probably want to run hack/make.sh, or maybe a shell?' diff --git a/vendor/github.com/docker/docker/hack/dockerfile/binaries-commits b/vendor/github.com/docker/docker/hack/dockerfile/binaries-commits deleted file mode 100755 index 8dfcca394..000000000 --- a/vendor/github.com/docker/docker/hack/dockerfile/binaries-commits +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -TOMLV_COMMIT=9baf8a8a9f2ed20a8e54160840c492f937eeaf9a - -# When updating RUNC_COMMIT, also update runc in vendor.conf accordingly -RUNC_COMMIT=9df8b306d01f59d3a8029be411de015b7304dd8f -CONTAINERD_COMMIT=aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1 -TINI_COMMIT=949e6facb77383876aeff8a6944dde66b3089574 -LIBNETWORK_COMMIT=0f534354b813003a754606689722fe253101bc4e -VNDR_COMMIT=f56bd4504b4fad07a357913687fb652ee54bb3b0 -BINDATA_COMMIT=a0ff2567cfb70903282db057e799fd826784d41d diff --git a/vendor/github.com/docker/docker/hack/dockerfile/install-binaries.sh b/vendor/github.com/docker/docker/hack/dockerfile/install-binaries.sh deleted file mode 100755 index 64f2b57da..000000000 --- a/vendor/github.com/docker/docker/hack/dockerfile/install-binaries.sh +++ /dev/null @@ -1,123 +0,0 @@ -#!/bin/sh -set -e -set -x - -. $(dirname "$0")/binaries-commits - -RM_GOPATH=0 - -TMP_GOPATH=${TMP_GOPATH:-""} - -if [ -z "$TMP_GOPATH" ]; then - export GOPATH="$(mktemp -d)" - RM_GOPATH=1 -else - export GOPATH="$TMP_GOPATH" -fi - -# Do not build with ambient capabilities support -RUNC_BUILDTAGS="${RUNC_BUILDTAGS:-"seccomp apparmor selinux"}" - -install_runc() { - echo "Install runc version $RUNC_COMMIT" - git clone https://github.com/docker/runc.git "$GOPATH/src/github.com/opencontainers/runc" - cd "$GOPATH/src/github.com/opencontainers/runc" - git checkout -q "$RUNC_COMMIT" - make BUILDTAGS="$RUNC_BUILDTAGS" $1 - cp runc /usr/local/bin/docker-runc -} - -install_containerd() { - echo "Install containerd version $CONTAINERD_COMMIT" - git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd" - cd "$GOPATH/src/github.com/docker/containerd" - git checkout -q "$CONTAINERD_COMMIT" - make $1 - cp bin/containerd /usr/local/bin/docker-containerd - cp bin/containerd-shim /usr/local/bin/docker-containerd-shim - cp bin/ctr /usr/local/bin/docker-containerd-ctr -} - -install_proxy() { - echo "Install docker-proxy version $LIBNETWORK_COMMIT" - git clone https://github.com/docker/libnetwork.git "$GOPATH/src/github.com/docker/libnetwork" - cd "$GOPATH/src/github.com/docker/libnetwork" - git checkout -q "$LIBNETWORK_COMMIT" - go build -ldflags="$PROXY_LDFLAGS" -o /usr/local/bin/docker-proxy github.com/docker/libnetwork/cmd/proxy -} - -install_bindata() { - echo "Install go-bindata version $BINDATA_COMMIT" - git clone https://github.com/jteeuwen/go-bindata "$GOPATH/src/github.com/jteeuwen/go-bindata" - cd $GOPATH/src/github.com/jteeuwen/go-bindata - git checkout -q "$BINDATA_COMMIT" - go build -o /usr/local/bin/go-bindata github.com/jteeuwen/go-bindata/go-bindata -} - -for prog in "$@" -do - case $prog in - tomlv) - echo "Install tomlv version $TOMLV_COMMIT" - git clone https://github.com/BurntSushi/toml.git "$GOPATH/src/github.com/BurntSushi/toml" - cd "$GOPATH/src/github.com/BurntSushi/toml" && git checkout -q "$TOMLV_COMMIT" - go build -v -o /usr/local/bin/tomlv github.com/BurntSushi/toml/cmd/tomlv - ;; - - runc) - install_runc static - ;; - - runc-dynamic) - install_runc - ;; - - containerd) - install_containerd static - ;; - - containerd-dynamic) - install_containerd - ;; - - tini) - echo "Install tini version $TINI_COMMIT" - git clone https://github.com/krallin/tini.git "$GOPATH/tini" - cd "$GOPATH/tini" - git checkout -q "$TINI_COMMIT" - cmake . - make tini-static - cp tini-static /usr/local/bin/docker-init - ;; - - proxy) - export CGO_ENABLED=0 - install_proxy - ;; - - proxy-dynamic) - PROXY_LDFLAGS="-linkmode=external" install_proxy - ;; - - vndr) - echo "Install vndr version $VNDR_COMMIT" - git clone https://github.com/LK4D4/vndr.git "$GOPATH/src/github.com/LK4D4/vndr" - cd "$GOPATH/src/github.com/LK4D4/vndr" - git checkout -q "$VNDR_COMMIT" - go build -v -o /usr/local/bin/vndr . - ;; - - bindata) - install_bindata - ;; - - *) - echo echo "Usage: $0 [tomlv|runc|containerd|tini|proxy]" - exit 1 - - esac -done - -if [ $RM_GOPATH -eq 1 ]; then - rm -rf "$GOPATH" -fi diff --git a/vendor/github.com/docker/docker/hack/generate-authors.sh b/vendor/github.com/docker/docker/hack/generate-authors.sh deleted file mode 100755 index e78a97f96..000000000 --- a/vendor/github.com/docker/docker/hack/generate-authors.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -e - -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")/.." - -# see also ".mailmap" for how email addresses and names are deduplicated - -{ - cat <<-'EOH' - # This file lists all individuals having contributed content to the repository. - # For how it is generated, see `hack/generate-authors.sh`. - EOH - echo - git log --format='%aN <%aE>' | LC_ALL=C.UTF-8 sort -uf -} > AUTHORS diff --git a/vendor/github.com/docker/docker/hack/generate-swagger-api.sh b/vendor/github.com/docker/docker/hack/generate-swagger-api.sh deleted file mode 100755 index a8e9f818a..000000000 --- a/vendor/github.com/docker/docker/hack/generate-swagger-api.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -set -eu - -swagger generate model -f api/swagger.yaml \ - -t api -m types --skip-validator -C api/swagger-gen.yaml \ - -n Volume \ - -n Port \ - -n ImageSummary \ - -n Plugin -n PluginDevice -n PluginMount -n PluginEnv -n PluginInterfaceType \ - -n ErrorResponse \ - -n IdResponse \ - -n ServiceUpdateResponse - -swagger generate operation -f api/swagger.yaml \ - -t api -a types -m types -C api/swagger-gen.yaml \ - -T api/templates --skip-responses --skip-parameters --skip-validator \ - -n VolumesList \ - -n VolumesCreate \ - -n ContainerCreate \ - -n ContainerUpdate \ - -n Authenticate \ - -n ContainerWait diff --git a/vendor/github.com/docker/docker/hack/install.sh b/vendor/github.com/docker/docker/hack/install.sh deleted file mode 100644 index cc20d6939..000000000 --- a/vendor/github.com/docker/docker/hack/install.sh +++ /dev/null @@ -1,484 +0,0 @@ -#!/bin/sh -set -e -# -# This script is meant for quick & easy install via: -# 'curl -sSL https://get.docker.com/ | sh' -# or: -# 'wget -qO- https://get.docker.com/ | sh' -# -# For test builds (ie. release candidates): -# 'curl -fsSL https://test.docker.com/ | sh' -# or: -# 'wget -qO- https://test.docker.com/ | sh' -# -# For experimental builds: -# 'curl -fsSL https://experimental.docker.com/ | sh' -# or: -# 'wget -qO- https://experimental.docker.com/ | sh' -# -# Docker Maintainers: -# To update this script on https://get.docker.com, -# use hack/release.sh during a normal release, -# or the following one-liner for script hotfixes: -# aws s3 cp --acl public-read hack/install.sh s3://get.docker.com/index -# - -url="https://get.docker.com/" -apt_url="https://apt.dockerproject.org" -yum_url="https://yum.dockerproject.org" -gpg_fingerprint="58118E89F3A912897C070ADBF76221572C52609D" - -key_servers=" -ha.pool.sks-keyservers.net -pgp.mit.edu -keyserver.ubuntu.com -" - -mirror='' -while [ $# -gt 0 ]; do - case "$1" in - --mirror) - mirror="$2" - shift - ;; - *) - echo "Illegal option $1" - ;; - esac - shift $(( $# > 0 ? 1 : 0 )) -done - -case "$mirror" in - AzureChinaCloud) - apt_url="https://mirror.azure.cn/docker-engine/apt" - yum_url="https://mirror.azure.cn/docker-engine/yum" - ;; -esac - -command_exists() { - command -v "$@" > /dev/null 2>&1 -} - -echo_docker_as_nonroot() { - if command_exists docker && [ -e /var/run/docker.sock ]; then - ( - set -x - $sh_c 'docker version' - ) || true - fi - your_user=your-user - [ "$user" != 'root' ] && your_user="$user" - # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-EOF", spaces are kept in the output - cat <<-EOF - - If you would like to use Docker as a non-root user, you should now consider - adding your user to the "docker" group with something like: - - sudo usermod -aG docker $your_user - - Remember that you will have to log out and back in for this to take effect! - - EOF -} - -# Check if this is a forked Linux distro -check_forked() { - - # Check for lsb_release command existence, it usually exists in forked distros - if command_exists lsb_release; then - # Check if the `-u` option is supported - set +e - lsb_release -a -u > /dev/null 2>&1 - lsb_release_exit_code=$? - set -e - - # Check if the command has exited successfully, it means we're in a forked distro - if [ "$lsb_release_exit_code" = "0" ]; then - # Print info about current distro - cat <<-EOF - You're using '$lsb_dist' version '$dist_version'. - EOF - - # Get the upstream release info - lsb_dist=$(lsb_release -a -u 2>&1 | tr '[:upper:]' '[:lower:]' | grep -E 'id' | cut -d ':' -f 2 | tr -d '[[:space:]]') - dist_version=$(lsb_release -a -u 2>&1 | tr '[:upper:]' '[:lower:]' | grep -E 'codename' | cut -d ':' -f 2 | tr -d '[[:space:]]') - - # Print info about upstream distro - cat <<-EOF - Upstream release is '$lsb_dist' version '$dist_version'. - EOF - else - if [ -r /etc/debian_version ] && [ "$lsb_dist" != "ubuntu" ] && [ "$lsb_dist" != "raspbian" ]; then - # We're Debian and don't even know it! - lsb_dist=debian - dist_version="$(cat /etc/debian_version | sed 's/\/.*//' | sed 's/\..*//')" - case "$dist_version" in - 9) - dist_version="stretch" - ;; - 8|'Kali Linux 2') - dist_version="jessie" - ;; - 7) - dist_version="wheezy" - ;; - esac - fi - fi - fi -} - -rpm_import_repository_key() { - local key=$1; shift - local tmpdir=$(mktemp -d) - chmod 600 "$tmpdir" - for key_server in $key_servers ; do - gpg --homedir "$tmpdir" --keyserver "$key_server" --recv-keys "$key" && break - done - gpg --homedir "$tmpdir" -k "$key" >/dev/null - gpg --homedir "$tmpdir" --export --armor "$key" > "$tmpdir"/repo.key - rpm --import "$tmpdir"/repo.key - rm -rf "$tmpdir" -} - -semverParse() { - major="${1%%.*}" - minor="${1#$major.}" - minor="${minor%%.*}" - patch="${1#$major.$minor.}" - patch="${patch%%[-.]*}" -} - -do_install() { - architecture=$(uname -m) - case $architecture in - # officially supported - amd64|x86_64) - ;; - # unofficially supported with available repositories - armv6l|armv7l) - ;; - # unofficially supported without available repositories - aarch64|arm64|ppc64le|s390x) - cat 1>&2 <<-EOF - Error: Docker doesn't officially support $architecture and no Docker $architecture repository exists. - EOF - exit 1 - ;; - # not supported - *) - cat >&2 <<-EOF - Error: $architecture is not a recognized platform. - EOF - exit 1 - ;; - esac - - if command_exists docker; then - version="$(docker -v | cut -d ' ' -f3 | cut -d ',' -f1)" - MAJOR_W=1 - MINOR_W=10 - - semverParse $version - - shouldWarn=0 - if [ $major -lt $MAJOR_W ]; then - shouldWarn=1 - fi - - if [ $major -le $MAJOR_W ] && [ $minor -lt $MINOR_W ]; then - shouldWarn=1 - fi - - cat >&2 <<-'EOF' - Warning: the "docker" command appears to already exist on this system. - - If you already have Docker installed, this script can cause trouble, which is - why we're displaying this warning and provide the opportunity to cancel the - installation. - - If you installed the current Docker package using this script and are using it - EOF - - if [ $shouldWarn -eq 1 ]; then - cat >&2 <<-'EOF' - again to update Docker, we urge you to migrate your image store before upgrading - to v1.10+. - - You can find instructions for this here: - https://github.com/docker/docker/wiki/Engine-v1.10.0-content-addressability-migration - EOF - else - cat >&2 <<-'EOF' - again to update Docker, you can safely ignore this message. - EOF - fi - - cat >&2 <<-'EOF' - - You may press Ctrl+C now to abort this script. - EOF - ( set -x; sleep 20 ) - fi - - user="$(id -un 2>/dev/null || true)" - - sh_c='sh -c' - if [ "$user" != 'root' ]; then - if command_exists sudo; then - sh_c='sudo -E sh -c' - elif command_exists su; then - sh_c='su -c' - else - cat >&2 <<-'EOF' - Error: this installer needs the ability to run commands as root. - We are unable to find either "sudo" or "su" available to make this happen. - EOF - exit 1 - fi - fi - - curl='' - if command_exists curl; then - curl='curl -sSL' - elif command_exists wget; then - curl='wget -qO-' - elif command_exists busybox && busybox --list-modules | grep -q wget; then - curl='busybox wget -qO-' - fi - - # check to see which repo they are trying to install from - if [ -z "$repo" ]; then - repo='main' - if [ "https://test.docker.com/" = "$url" ]; then - repo='testing' - elif [ "https://experimental.docker.com/" = "$url" ]; then - repo='experimental' - fi - fi - - # perform some very rudimentary platform detection - lsb_dist='' - dist_version='' - if command_exists lsb_release; then - lsb_dist="$(lsb_release -si)" - fi - if [ -z "$lsb_dist" ] && [ -r /etc/lsb-release ]; then - lsb_dist="$(. /etc/lsb-release && echo "$DISTRIB_ID")" - fi - if [ -z "$lsb_dist" ] && [ -r /etc/debian_version ]; then - lsb_dist='debian' - fi - if [ -z "$lsb_dist" ] && [ -r /etc/fedora-release ]; then - lsb_dist='fedora' - fi - if [ -z "$lsb_dist" ] && [ -r /etc/oracle-release ]; then - lsb_dist='oracleserver' - fi - if [ -z "$lsb_dist" ] && [ -r /etc/centos-release ]; then - lsb_dist='centos' - fi - if [ -z "$lsb_dist" ] && [ -r /etc/redhat-release ]; then - lsb_dist='redhat' - fi - if [ -z "$lsb_dist" ] && [ -r /etc/photon-release ]; then - lsb_dist='photon' - fi - if [ -z "$lsb_dist" ] && [ -r /etc/os-release ]; then - lsb_dist="$(. /etc/os-release && echo "$ID")" - fi - - lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')" - - # Special case redhatenterpriseserver - if [ "${lsb_dist}" = "redhatenterpriseserver" ]; then - # Set it to redhat, it will be changed to centos below anyways - lsb_dist='redhat' - fi - - case "$lsb_dist" in - - ubuntu) - if command_exists lsb_release; then - dist_version="$(lsb_release --codename | cut -f2)" - fi - if [ -z "$dist_version" ] && [ -r /etc/lsb-release ]; then - dist_version="$(. /etc/lsb-release && echo "$DISTRIB_CODENAME")" - fi - ;; - - debian|raspbian) - dist_version="$(cat /etc/debian_version | sed 's/\/.*//' | sed 's/\..*//')" - case "$dist_version" in - 8) - dist_version="jessie" - ;; - 7) - dist_version="wheezy" - ;; - esac - ;; - - oracleserver) - # need to switch lsb_dist to match yum repo URL - lsb_dist="oraclelinux" - dist_version="$(rpm -q --whatprovides redhat-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//')" - ;; - - fedora|centos|redhat) - dist_version="$(rpm -q --whatprovides ${lsb_dist}-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//' | sort | tail -1)" - ;; - - "vmware photon") - lsb_dist="photon" - dist_version="$(. /etc/os-release && echo "$VERSION_ID")" - ;; - - *) - if command_exists lsb_release; then - dist_version="$(lsb_release --codename | cut -f2)" - fi - if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then - dist_version="$(. /etc/os-release && echo "$VERSION_ID")" - fi - ;; - - - esac - - # Check if this is a forked Linux distro - check_forked - - # Run setup for each distro accordingly - case "$lsb_dist" in - ubuntu|debian|raspbian) - export DEBIAN_FRONTEND=noninteractive - - did_apt_get_update= - apt_get_update() { - if [ -z "$did_apt_get_update" ]; then - ( set -x; $sh_c 'sleep 3; apt-get update' ) - did_apt_get_update=1 - fi - } - - if [ "$lsb_dist" != "raspbian" ]; then - # aufs is preferred over devicemapper; try to ensure the driver is available. - if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then - if uname -r | grep -q -- '-generic' && dpkg -l 'linux-image-*-generic' | grep -qE '^ii|^hi' 2>/dev/null; then - kern_extras="linux-image-extra-$(uname -r) linux-image-extra-virtual" - - apt_get_update - ( set -x; $sh_c 'sleep 3; apt-get install -y -q '"$kern_extras" ) || true - - if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then - echo >&2 'Warning: tried to install '"$kern_extras"' (for AUFS)' - echo >&2 ' but we still have no AUFS. Docker may not work. Proceeding anyways!' - ( set -x; sleep 10 ) - fi - else - echo >&2 'Warning: current kernel is not supported by the linux-image-extra-virtual' - echo >&2 ' package. We have no AUFS support. Consider installing the packages' - echo >&2 ' linux-image-virtual kernel and linux-image-extra-virtual for AUFS support.' - ( set -x; sleep 10 ) - fi - fi - fi - - # install apparmor utils if they're missing and apparmor is enabled in the kernel - # otherwise Docker will fail to start - if [ "$(cat /sys/module/apparmor/parameters/enabled 2>/dev/null)" = 'Y' ]; then - if command -v apparmor_parser >/dev/null 2>&1; then - echo 'apparmor is enabled in the kernel and apparmor utils were already installed' - else - echo 'apparmor is enabled in the kernel, but apparmor_parser is missing. Trying to install it..' - apt_get_update - ( set -x; $sh_c 'sleep 3; apt-get install -y -q apparmor' ) - fi - fi - - if [ ! -e /usr/lib/apt/methods/https ]; then - apt_get_update - ( set -x; $sh_c 'sleep 3; apt-get install -y -q apt-transport-https ca-certificates' ) - fi - if [ -z "$curl" ]; then - apt_get_update - ( set -x; $sh_c 'sleep 3; apt-get install -y -q curl ca-certificates' ) - curl='curl -sSL' - fi - if ! command -v gpg > /dev/null; then - apt_get_update - ( set -x; $sh_c 'sleep 3; apt-get install -y -q gnupg2 || apt-get install -y -q gnupg' ) - fi - - # dirmngr is a separate package in ubuntu yakkety; see https://bugs.launchpad.net/ubuntu/+source/apt/+bug/1634464 - if ! command -v dirmngr > /dev/null; then - apt_get_update - ( set -x; $sh_c 'sleep 3; apt-get install -y -q dirmngr' ) - fi - - ( - set -x - for key_server in $key_servers ; do - $sh_c "apt-key adv --keyserver hkp://${key_server}:80 --recv-keys ${gpg_fingerprint}" && break - done - $sh_c "apt-key adv -k ${gpg_fingerprint} >/dev/null" - $sh_c "mkdir -p /etc/apt/sources.list.d" - $sh_c "echo deb \[arch=$(dpkg --print-architecture)\] ${apt_url}/repo ${lsb_dist}-${dist_version} ${repo} > /etc/apt/sources.list.d/docker.list" - $sh_c 'sleep 3; apt-get update; apt-get install -y -q docker-engine' - ) - echo_docker_as_nonroot - exit 0 - ;; - - fedora|centos|redhat|oraclelinux|photon) - if [ "${lsb_dist}" = "redhat" ]; then - # we use the centos repository for both redhat and centos releases - lsb_dist='centos' - fi - $sh_c "cat >/etc/yum.repos.d/docker-${repo}.repo" <<-EOF - [docker-${repo}-repo] - name=Docker ${repo} Repository - baseurl=${yum_url}/repo/${repo}/${lsb_dist}/${dist_version} - enabled=1 - gpgcheck=1 - gpgkey=${yum_url}/gpg - EOF - if [ "$lsb_dist" = "fedora" ] && [ "$dist_version" -ge "22" ]; then - ( - set -x - $sh_c 'sleep 3; dnf -y -q install docker-engine' - ) - elif [ "$lsb_dist" = "photon" ]; then - ( - set -x - $sh_c 'sleep 3; tdnf -y install docker-engine' - ) - else - ( - set -x - $sh_c 'sleep 3; yum -y -q install docker-engine' - ) - fi - echo_docker_as_nonroot - exit 0 - ;; - esac - - # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-'EOF'", spaces are kept in the output - cat >&2 <<-'EOF' - - Either your platform is not easily detectable, is not supported by this - installer script (yet - PRs welcome! [hack/install.sh]), or does not yet have - a package for Docker. Please visit the following URL for more detailed - installation instructions: - - https://docs.docker.com/engine/installation/ - - EOF - exit 1 -} - -# wrapped up in a function so that we have some protection against only getting -# half the file during "curl | sh" -do_install diff --git a/vendor/github.com/docker/docker/hack/make.ps1 b/vendor/github.com/docker/docker/hack/make.ps1 deleted file mode 100644 index 14b9603b2..000000000 --- a/vendor/github.com/docker/docker/hack/make.ps1 +++ /dev/null @@ -1,408 +0,0 @@ -<# -.NOTES - Author: @jhowardmsft - - Summary: Windows native build script. This is similar to functionality provided - by hack\make.sh, but uses native Windows PowerShell semantics. It does - not support the full set of options provided by the Linux counterpart. - For example: - - - You can't cross-build Linux docker binaries on Windows - - Hashes aren't generated on binaries - - 'Releasing' isn't supported. - - Integration tests. This is because they currently cannot run inside a container, - and require significant external setup. - - It does however provided the minimum necessary to support parts of local Windows - development and Windows to Windows CI. - - Usage Examples (run from repo root): - "hack\make.ps1 -Binary" to build the binaries - "hack\make.ps1 -Client" to build just the client 64-bit binary - "hack\make.ps1 -TestUnit" to run unit tests - "hack\make.ps1 -Binary -TestUnit" to build the binaries and run unit tests - "hack\make.ps1 -All" to run everything this script knows about - -.PARAMETER Client - Builds the client binaries. - -.PARAMETER Daemon - Builds the daemon binary. - -.PARAMETER Binary - Builds the client binaries and the daemon binary. A convenient shortcut to `make.ps1 -Client -Daemon`. - -.PARAMETER Race - Use -race in go build and go test. - -.PARAMETER Noisy - Use -v in go build. - -.PARAMETER ForceBuildAll - Use -a in go build. - -.PARAMETER NoOpt - Use -gcflags -N -l in go build to disable optimisation (can aide debugging). - -.PARAMETER CommitSuffix - Adds a custom string to be appended to the commit ID (spaces are stripped). - -.PARAMETER DCO - Runs the DCO (Developer Certificate Of Origin) test. - -.PARAMETER PkgImports - Runs the pkg\ directory imports test. - -.PARAMETER GoFormat - Runs the Go formatting test. - -.PARAMETER TestUnit - Runs unit tests. - -.PARAMETER All - Runs everything this script knows about. - - -TODO -- Unify the head commit -- Sort out the GITCOMMIT environment variable in the absense of a .git (longer term) -- Add golint and other checks (swagger maybe?) - -#> - - -param( - [Parameter(Mandatory=$False)][switch]$Client, - [Parameter(Mandatory=$False)][switch]$Daemon, - [Parameter(Mandatory=$False)][switch]$Binary, - [Parameter(Mandatory=$False)][switch]$Race, - [Parameter(Mandatory=$False)][switch]$Noisy, - [Parameter(Mandatory=$False)][switch]$ForceBuildAll, - [Parameter(Mandatory=$False)][switch]$NoOpt, - [Parameter(Mandatory=$False)][string]$CommitSuffix="", - [Parameter(Mandatory=$False)][switch]$DCO, - [Parameter(Mandatory=$False)][switch]$PkgImports, - [Parameter(Mandatory=$False)][switch]$GoFormat, - [Parameter(Mandatory=$False)][switch]$TestUnit, - [Parameter(Mandatory=$False)][switch]$All -) - -$ErrorActionPreference = "Stop" -$pushed=$False # To restore the directory if we have temporarily pushed to one. - -# Utility function to get the commit ID of the repository -Function Get-GitCommit() { - if (-not (Test-Path ".\.git")) { - # If we don't have a .git directory, but we do have the environment - # variable DOCKER_GITCOMMIT set, that can override it. - if ($env:DOCKER_GITCOMMIT.Length -eq 0) { - Throw ".git directory missing and DOCKER_GITCOMMIT environment variable not specified." - } - Write-Host "INFO: Git commit assumed from DOCKER_GITCOMMIT environment variable" - return $env:DOCKER_GITCOMMIT - } - $gitCommit=$(git rev-parse --short HEAD) - if ($(git status --porcelain --untracked-files=no).Length -ne 0) { - $gitCommit="$gitCommit-unsupported" - Write-Host "" - Write-Warning "This version is unsupported because there are uncommitted file(s)." - Write-Warning "Either commit these changes, or add them to .gitignore." - git status --porcelain --untracked-files=no | Write-Warning - Write-Host "" - } - return $gitCommit -} - -# Utility function to get get the current build version of docker -Function Get-DockerVersion() { - if (-not (Test-Path ".\VERSION")) { Throw "VERSION file not found. Is this running from the root of a docker repository?" } - return $(Get-Content ".\VERSION" -raw).ToString().Replace("`n","").Trim() -} - -# Utility function to determine if we are running in a container or not. -# In Windows, we get this through an environment variable set in `Dockerfile.Windows` -Function Check-InContainer() { - if ($env:FROM_DOCKERFILE.Length -eq 0) { - Write-Host "" - Write-Warning "Not running in a container. The result might be an incorrect build." - Write-Host "" - } -} - -# Utility function to get the commit for HEAD -Function Get-HeadCommit() { - $head = Invoke-Expression "git rev-parse --verify HEAD" - if ($LASTEXITCODE -ne 0) { Throw "Failed getting HEAD commit" } - - return $head -} - -# Utility function to get the commit for upstream -Function Get-UpstreamCommit() { - Invoke-Expression "git fetch -q https://github.com/docker/docker.git refs/heads/master" - if ($LASTEXITCODE -ne 0) { Throw "Failed fetching" } - - $upstream = Invoke-Expression "git rev-parse --verify FETCH_HEAD" - if ($LASTEXITCODE -ne 0) { Throw "Failed getting upstream commit" } - - return $upstream -} - -# Build a binary (client or daemon) -Function Execute-Build($type, $additionalBuildTags, $directory) { - # Generate the build flags - $buildTags = "autogen" - if ($Noisy) { $verboseParm=" -v" } - if ($Race) { Write-Warning "Using race detector"; $raceParm=" -race"} - if ($ForceBuildAll) { $allParm=" -a" } - if ($NoOpt) { $optParm=" -gcflags "+""""+"-N -l"+"""" } - if ($addtionalBuildTags -ne "") { $buildTags += $(" " + $additionalBuildTags) } - - # Do the go build in the appropriate directory - # Note -linkmode=internal is required to be able to debug on Windows. - # https://github.com/golang/go/issues/14319#issuecomment-189576638 - Write-Host "INFO: Building $type..." - Push-Location $root\cmd\$directory; $global:pushed=$True - $buildCommand = "go build" + ` - $raceParm + ` - $verboseParm + ` - $allParm + ` - $optParm + ` - " -tags """ + $buildTags + """" + ` - " -ldflags """ + "-linkmode=internal" + """" + ` - " -o $root\bundles\"+$directory+".exe" - Invoke-Expression $buildCommand - if ($LASTEXITCODE -ne 0) { Throw "Failed to compile $type" } - Pop-Location; $global:pushed=$False -} - - -# Validates the DCO marker is present on each commit -Function Validate-DCO($headCommit, $upstreamCommit) { - Write-Host "INFO: Validating Developer Certificate of Origin..." - # Username may only contain alphanumeric characters or dashes and cannot begin with a dash - $usernameRegex='[a-zA-Z0-9][a-zA-Z0-9-]+' - - $dcoPrefix="Signed-off-by:" - $dcoRegex="^(Docker-DCO-1.1-)?$dcoPrefix ([^<]+) <([^<>@]+@[^<>]+)>( \\(github: ($usernameRegex)\\))?$" - - $counts = Invoke-Expression "git diff --numstat $upstreamCommit...$headCommit" - if ($LASTEXITCODE -ne 0) { Throw "Failed git diff --numstat" } - - # Counts of adds and deletes after removing multiple white spaces. AWK anyone? :( - $adds=0; $dels=0; $($counts -replace '\s+', ' ') | %{ - $a=$_.Split(" "); - if ($a[0] -ne "-") { $adds+=[int]$a[0] } - if ($a[1] -ne "-") { $dels+=[int]$a[1] } - } - if (($adds -eq 0) -and ($dels -eq 0)) { - Write-Warning "DCO validation - nothing to validate!" - return - } - - $commits = Invoke-Expression "git log $upstreamCommit..$headCommit --format=format:%H%n" - if ($LASTEXITCODE -ne 0) { Throw "Failed git log --format" } - $commits = $($commits -split '\s+' -match '\S') - $badCommits=@() - $commits | %{ - # Skip commits with no content such as merge commits etc - if ($(git log -1 --format=format: --name-status $_).Length -gt 0) { - # Ignore exit code on next call - always process regardless - $commitMessage = Invoke-Expression "git log -1 --format=format:%B --name-status $_" - if (($commitMessage -match $dcoRegex).Length -eq 0) { $badCommits+=$_ } - } - } - if ($badCommits.Length -eq 0) { - Write-Host "Congratulations! All commits are properly signed with the DCO!" - } else { - $e = "`nThese commits do not have a proper '$dcoPrefix' marker:`n" - $badCommits | %{ $e+=" - $_`n"} - $e += "`nPlease amend each commit to include a properly formatted DCO marker.`n`n" - $e += "Visit the following URL for information about the Docker DCO:`n" - $e += "https://github.com/docker/docker/blob/master/CONTRIBUTING.md#sign-your-work`n" - Throw $e - } -} - -# Validates that .\pkg\... is safely isolated from internal code -Function Validate-PkgImports($headCommit, $upstreamCommit) { - Write-Host "INFO: Validating pkg import isolation..." - - # Get a list of go source-code files which have changed under pkg\. Ignore exit code on next call - always process regardless - $files=@(); $files = Invoke-Expression "git diff $upstreamCommit...$headCommit --diff-filter=ACMR --name-only -- `'pkg\*.go`'" - $badFiles=@(); $files | %{ - $file=$_ - # For the current changed file, get its list of dependencies, sorted and uniqued. - $imports = Invoke-Expression "go list -e -f `'{{ .Deps }}`' $file" - if ($LASTEXITCODE -ne 0) { Throw "Failed go list for dependencies on $file" } - $imports = $imports -Replace "\[" -Replace "\]", "" -Split(" ") | Sort-Object | Get-Unique - # Filter out what we are looking for - $imports = $imports -NotMatch "^github.com/docker/docker/pkg/" ` - -NotMatch "^github.com/docker/docker/vendor" ` - -Match "^github.com/docker/docker" ` - -Replace "`n", "" - $imports | % { $badFiles+="$file imports $_`n" } - } - if ($badFiles.Length -eq 0) { - Write-Host 'Congratulations! ".\pkg\*.go" is safely isolated from internal code.' - } else { - $e = "`nThese files import internal code: (either directly or indirectly)`n" - $badFiles | %{ $e+=" - $_"} - Throw $e - } -} - -# Validates that changed files are correctly go-formatted -Function Validate-GoFormat($headCommit, $upstreamCommit) { - Write-Host "INFO: Validating go formatting on changed files..." - - # Verify gofmt is installed - if ($(Get-Command gofmt -ErrorAction SilentlyContinue) -eq $nil) { Throw "gofmt does not appear to be installed" } - - # Get a list of all go source-code files which have changed. Ignore exit code on next call - always process regardless - $files=@(); $files = Invoke-Expression "git diff $upstreamCommit...$headCommit --diff-filter=ACMR --name-only -- `'*.go`'" - $files = $files | Select-String -NotMatch "^vendor/" | Select-String -NotMatch "^cli/compose/schema/bindata.go" - $badFiles=@(); $files | %{ - # Deliberately ignore error on next line - treat as failed - $content=Invoke-Expression "git show $headCommit`:$_" - - # Next set of hoops are to ensure we have LF not CRLF semantics as otherwise gofmt on Windows will not succeed. - # Also note that gofmt on Windows does not appear to support stdin piping correctly. Hence go through a temporary file. - $content=$content -join "`n" - $content+="`n" - $outputFile=[System.IO.Path]::GetTempFileName() - if (Test-Path $outputFile) { Remove-Item $outputFile } - [System.IO.File]::WriteAllText($outputFile, $content, (New-Object System.Text.UTF8Encoding($False))) - $valid=Invoke-Expression "gofmt -s -l $outputFile" - Write-Host "Checking $outputFile" - if ($valid.Length -ne 0) { $badFiles+=$_ } - if (Test-Path $outputFile) { Remove-Item $outputFile } - } - if ($badFiles.Length -eq 0) { - Write-Host 'Congratulations! All Go source files are properly formatted.' - } else { - $e = "`nThese files are not properly gofmt`'d:`n" - $badFiles | %{ $e+=" - $_`n"} - $e+= "`nPlease reformat the above files using `"gofmt -s -w`" and commit the result." - Throw $e - } -} - -# Run the unit tests -Function Run-UnitTests() { - Write-Host "INFO: Running unit tests..." - $testPath="./..." - $goListCommand = "go list -e -f '{{if ne .Name """ + '\"github.com/docker/docker\"' + """}}{{.ImportPath}}{{end}}' $testPath" - $pkgList = $(Invoke-Expression $goListCommand) - if ($LASTEXITCODE -ne 0) { Throw "go list for unit tests failed" } - $pkgList = $pkgList | Select-String -Pattern "github.com/docker/docker" - $pkgList = $pkgList | Select-String -NotMatch "github.com/docker/docker/vendor" - $pkgList = $pkgList | Select-String -NotMatch "github.com/docker/docker/man" - $pkgList = $pkgList | Select-String -NotMatch "github.com/docker/docker/integration-cli" - $pkgList = $pkgList -replace "`r`n", " " - $goTestCommand = "go test" + $raceParm + " -cover -ldflags -w -tags """ + "autogen daemon" + """ -a """ + "-test.timeout=10m" + """ $pkgList" - Invoke-Expression $goTestCommand - if ($LASTEXITCODE -ne 0) { Throw "Unit tests failed" } -} - -# Start of main code. -Try { - Write-Host -ForegroundColor Cyan "INFO: make.ps1 starting at $(Get-Date)" - $root=$(pwd) - - # Handle the "-All" shortcut to turn on all things we can handle. - if ($All) { $Client=$True; $Daemon=$True; $DCO=$True; $PkgImports=$True; $GoFormat=$True; $TestUnit=$True } - - # Handle the "-Binary" shortcut to build both client and daemon. - if ($Binary) { $Client = $True; $Daemon = $True } - - # Make sure we have something to do - if (-not($Client) -and -not($Daemon) -and -not($DCO) -and -not($PkgImports) -and -not($GoFormat) -and -not($TestUnit)) { Throw 'Nothing to do. Try adding "-All" for everything I can do' } - - # Verify git is installed - if ($(Get-Command git -ErrorAction SilentlyContinue) -eq $nil) { Throw "Git does not appear to be installed" } - - # Verify go is installed - if ($(Get-Command go -ErrorAction SilentlyContinue) -eq $nil) { Throw "GoLang does not appear to be installed" } - - # Get the git commit. This will also verify if we are in a repo or not. Then add a custom string if supplied. - $gitCommit=Get-GitCommit - if ($CommitSuffix -ne "") { $gitCommit += "-"+$CommitSuffix -Replace ' ', '' } - - # Get the version of docker (eg 1.14.0-dev) - $dockerVersion=Get-DockerVersion - - # Give a warning if we are not running in a container and are building binaries or running unit tests. - # Not relevant for validation tests as these are fine to run outside of a container. - if ($Client -or $Daemon -or $TestUnit) { Check-InContainer } - - # Verify GOPATH is set - if ($env:GOPATH.Length -eq 0) { Throw "Missing GOPATH environment variable. See https://golang.org/doc/code.html#GOPATH" } - - # Run autogen if building binaries or running unit tests. - if ($Client -or $Daemon -or $TestUnit) { - Write-Host "INFO: Invoking autogen..." - Try { .\hack\make\.go-autogen.ps1 -CommitString $gitCommit -DockerVersion $dockerVersion } - Catch [Exception] { Throw $_ } - } - - # DCO, Package import and Go formatting tests. - if ($DCO -or $PkgImports -or $GoFormat) { - # We need the head and upstream commits for these - $headCommit=Get-HeadCommit - $upstreamCommit=Get-UpstreamCommit - - # Run DCO validation - if ($DCO) { Validate-DCO $headCommit $upstreamCommit } - - # Run `gofmt` validation - if ($GoFormat) { Validate-GoFormat $headCommit $upstreamCommit } - - # Run pkg isolation validation - if ($PkgImports) { Validate-PkgImports $headCommit $upstreamCommit } - } - - # Build the binaries - if ($Client -or $Daemon) { - # Create the bundles directory if it doesn't exist - if (-not (Test-Path ".\bundles")) { New-Item ".\bundles" -ItemType Directory | Out-Null } - - # Perform the actual build - if ($Daemon) { Execute-Build "daemon" "daemon" "dockerd" } - if ($Client) { Execute-Build "client" "" "docker" } - } - - # Run unit tests - if ($TestUnit) { Run-UnitTests } - - # Gratuitous ASCII art. - if ($Daemon -or $Client) { - Write-Host - Write-Host -ForegroundColor Green " ________ ____ __." - Write-Host -ForegroundColor Green " \_____ \ `| `|/ _`|" - Write-Host -ForegroundColor Green " / `| \`| `<" - Write-Host -ForegroundColor Green " / `| \ `| \" - Write-Host -ForegroundColor Green " \_______ /____`|__ \" - Write-Host -ForegroundColor Green " \/ \/" - Write-Host - } -} -Catch [Exception] { - Write-Host -ForegroundColor Red ("`nERROR: make.ps1 failed:`n$_") - - # More gratuitous ASCII art. - Write-Host - Write-Host -ForegroundColor Red "___________ .__.__ .___" - Write-Host -ForegroundColor Red "\_ _____/____ `|__`| `| ____ __`| _/" - Write-Host -ForegroundColor Red " `| __) \__ \ `| `| `| _/ __ \ / __ `| " - Write-Host -ForegroundColor Red " `| \ / __ \`| `| `|_\ ___// /_/ `| " - Write-Host -ForegroundColor Red " \___ / (____ /__`|____/\___ `>____ `| " - Write-Host -ForegroundColor Red " \/ \/ \/ \/ " - Write-Host - - Throw $_ -} -Finally { - if ($global:pushed) { Pop-Location } - Write-Host -ForegroundColor Cyan "INFO: make.ps1 ended at $(Get-Date)" -} diff --git a/vendor/github.com/docker/docker/hack/make.sh b/vendor/github.com/docker/docker/hack/make.sh deleted file mode 100755 index f0e482fed..000000000 --- a/vendor/github.com/docker/docker/hack/make.sh +++ /dev/null @@ -1,304 +0,0 @@ -#!/usr/bin/env bash -set -e - -# This script builds various binary artifacts from a checkout of the docker -# source code. -# -# Requirements: -# - The current directory should be a checkout of the docker source code -# (https://github.com/docker/docker). Whatever version is checked out -# will be built. -# - The VERSION file, at the root of the repository, should exist, and -# will be used as Docker binary version and package version. -# - The hash of the git commit will also be included in the Docker binary, -# with the suffix -unsupported if the repository isn't clean. -# - The script is intended to be run inside the docker container specified -# in the Dockerfile at the root of the source. In other words: -# DO NOT CALL THIS SCRIPT DIRECTLY. -# - The right way to call this script is to invoke "make" from -# your checkout of the Docker repository. -# the Makefile will do a "docker build -t docker ." and then -# "docker run hack/make.sh" in the resulting image. -# - -set -o pipefail - -export DOCKER_PKG='github.com/docker/docker' -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -export MAKEDIR="$SCRIPTDIR/make" -export PKG_CONFIG=${PKG_CONFIG:-pkg-config} - -# We're a nice, sexy, little shell script, and people might try to run us; -# but really, they shouldn't. We want to be in a container! -inContainer="AssumeSoInitially" -if [ "$(go env GOHOSTOS)" = 'windows' ]; then - if [ -z "$FROM_DOCKERFILE" ]; then - unset inContainer - fi -else - if [ "$PWD" != "/go/src/$DOCKER_PKG" ] || [ -z "$DOCKER_CROSSPLATFORMS" ]; then - unset inContainer - fi -fi - -if [ -z "$inContainer" ]; then - { - echo "# WARNING! I don't seem to be running in a Docker container." - echo "# The result of this command might be an incorrect build, and will not be" - echo "# officially supported." - echo "#" - echo "# Try this instead: make all" - echo "#" - } >&2 -fi - -echo - -# List of bundles to create when no argument is passed -DEFAULT_BUNDLES=( - binary-client - binary-daemon - dynbinary - - test-unit - test-integration-cli - test-docker-py - - cross - tgz -) - -VERSION=$(< ./VERSION) -! BUILDTIME=$(date --rfc-3339 ns 2> /dev/null | sed -e 's/ /T/') -if command -v git &> /dev/null && [ -d .git ] && git rev-parse &> /dev/null; then - GITCOMMIT=$(git rev-parse --short HEAD) - if [ -n "$(git status --porcelain --untracked-files=no)" ]; then - GITCOMMIT="$GITCOMMIT-unsupported" - echo "#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - echo "# GITCOMMIT = $GITCOMMIT" - echo "# The version you are building is listed as unsupported because" - echo "# there are some files in the git repository that are in an uncommitted state." - echo "# Commit these changes, or add to .gitignore to remove the -unsupported from the version." - echo "# Here is the current list:" - git status --porcelain --untracked-files=no - echo "#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - fi -elif [ "$DOCKER_GITCOMMIT" ]; then - GITCOMMIT="$DOCKER_GITCOMMIT" -else - echo >&2 'error: .git directory missing and DOCKER_GITCOMMIT not specified' - echo >&2 ' Please either build with the .git directory accessible, or specify the' - echo >&2 ' exact (--short) commit hash you are building using DOCKER_GITCOMMIT for' - echo >&2 ' future accountability in diagnosing build issues. Thanks!' - exit 1 -fi - -if [ "$AUTO_GOPATH" ]; then - rm -rf .gopath - mkdir -p .gopath/src/"$(dirname "${DOCKER_PKG}")" - ln -sf ../../../.. .gopath/src/"${DOCKER_PKG}" - export GOPATH="${PWD}/.gopath" - - if [ "$(go env GOOS)" = 'solaris' ]; then - # sys/unix is installed outside the standard library on solaris - # TODO need to allow for version change, need to get version from go - export GO_VERSION=${GO_VERSION:-"1.7.1"} - export GOPATH="${GOPATH}:/usr/lib/gocode/${GO_VERSION}" - fi -fi - -if [ ! "$GOPATH" ]; then - echo >&2 'error: missing GOPATH; please see https://golang.org/doc/code.html#GOPATH' - echo >&2 ' alternatively, set AUTO_GOPATH=1' - exit 1 -fi - -DOCKER_BUILDTAGS+=" daemon" -if ${PKG_CONFIG} 'libsystemd >= 209' 2> /dev/null ; then - DOCKER_BUILDTAGS+=" journald" -elif ${PKG_CONFIG} 'libsystemd-journal' 2> /dev/null ; then - DOCKER_BUILDTAGS+=" journald journald_compat" -fi - -# test whether "btrfs/version.h" exists and apply btrfs_noversion appropriately -if \ - command -v gcc &> /dev/null \ - && ! gcc -E - -o /dev/null &> /dev/null <<<'#include ' \ -; then - DOCKER_BUILDTAGS+=' btrfs_noversion' -fi - -# test whether "libdevmapper.h" is new enough to support deferred remove -# functionality. -if \ - command -v gcc &> /dev/null \ - && ! ( echo -e '#include \nint main() { dm_task_deferred_remove(NULL); }'| gcc -xc - -o /dev/null -ldevmapper &> /dev/null ) \ -; then - DOCKER_BUILDTAGS+=' libdm_no_deferred_remove' -fi - -# Use these flags when compiling the tests and final binary - -IAMSTATIC='true' -source "$SCRIPTDIR/make/.go-autogen" -if [ -z "$DOCKER_DEBUG" ]; then - LDFLAGS='-w' -fi - -LDFLAGS_STATIC='' -EXTLDFLAGS_STATIC='-static' -# ORIG_BUILDFLAGS is necessary for the cross target which cannot always build -# with options like -race. -ORIG_BUILDFLAGS=( -tags "autogen netgo static_build sqlite_omit_load_extension $DOCKER_BUILDTAGS" -installsuffix netgo ) -# see https://github.com/golang/go/issues/9369#issuecomment-69864440 for why -installsuffix is necessary here - -# When $DOCKER_INCREMENTAL_BINARY is set in the environment, enable incremental -# builds by installing dependent packages to the GOPATH. -REBUILD_FLAG="-a" -if [ "$DOCKER_INCREMENTAL_BINARY" ]; then - REBUILD_FLAG="-i" -fi -ORIG_BUILDFLAGS+=( $REBUILD_FLAG ) - -BUILDFLAGS=( $BUILDFLAGS "${ORIG_BUILDFLAGS[@]}" ) -# Test timeout. - -if [ "${DOCKER_ENGINE_GOARCH}" == "arm" ]; then - : ${TIMEOUT:=10m} -elif [ "${DOCKER_ENGINE_GOARCH}" == "windows" ]; then - : ${TIMEOUT:=8m} -else - : ${TIMEOUT:=5m} -fi - -LDFLAGS_STATIC_DOCKER=" - $LDFLAGS_STATIC - -extldflags \"$EXTLDFLAGS_STATIC\" -" - -if [ "$(uname -s)" = 'FreeBSD' ]; then - # Tell cgo the compiler is Clang, not GCC - # https://code.google.com/p/go/source/browse/src/cmd/cgo/gcc.go?spec=svne77e74371f2340ee08622ce602e9f7b15f29d8d3&r=e6794866ebeba2bf8818b9261b54e2eef1c9e588#752 - export CC=clang - - # "-extld clang" is a workaround for - # https://code.google.com/p/go/issues/detail?id=6845 - LDFLAGS="$LDFLAGS -extld clang" -fi - -# If sqlite3.h doesn't exist under /usr/include, -# check /usr/local/include also just in case -# (e.g. FreeBSD Ports installs it under the directory) -if [ ! -e /usr/include/sqlite3.h ] && [ -e /usr/local/include/sqlite3.h ]; then - export CGO_CFLAGS='-I/usr/local/include' - export CGO_LDFLAGS='-L/usr/local/lib' -fi - -HAVE_GO_TEST_COVER= -if \ - go help testflag | grep -- -cover > /dev/null \ - && go tool -n cover > /dev/null 2>&1 \ -; then - HAVE_GO_TEST_COVER=1 -fi - -# a helper to provide ".exe" when it's appropriate -binary_extension() { - if [ "$(go env GOOS)" = 'windows' ]; then - echo -n '.exe' - fi -} - -hash_files() { - while [ $# -gt 0 ]; do - f="$1" - shift - dir="$(dirname "$f")" - base="$(basename "$f")" - for hashAlgo in md5 sha256; do - if command -v "${hashAlgo}sum" &> /dev/null; then - ( - # subshell and cd so that we get output files like: - # $HASH docker-$VERSION - # instead of: - # $HASH /go/src/github.com/.../$VERSION/binary/docker-$VERSION - cd "$dir" - "${hashAlgo}sum" "$base" > "$base.$hashAlgo" - ) - fi - done - done -} - -bundle() { - local bundle="$1"; shift - echo "---> Making bundle: $(basename "$bundle") (in $DEST)" - source "$SCRIPTDIR/make/$bundle" "$@" -} - -copy_binaries() { - dir="$1" - # Add nested executables to bundle dir so we have complete set of - # them available, but only if the native OS/ARCH is the same as the - # OS/ARCH of the build target - if [ "$(go env GOOS)/$(go env GOARCH)" == "$(go env GOHOSTOS)/$(go env GOHOSTARCH)" ]; then - if [ -x /usr/local/bin/docker-runc ]; then - echo "Copying nested executables into $dir" - for file in containerd containerd-shim containerd-ctr runc init proxy; do - cp `which "docker-$file"` "$dir/" - if [ "$2" == "hash" ]; then - hash_files "$dir/docker-$file" - fi - done - fi - fi -} - -install_binary() { - file="$1" - target="${DOCKER_MAKE_INSTALL_PREFIX:=/usr/local}/bin/" - if [ "$(go env GOOS)" == "linux" ]; then - echo "Installing $(basename $file) to ${target}" - cp -L "$file" "$target" - else - echo "Install is only supported on linux" - return 1 - fi -} - -main() { - # We want this to fail if the bundles already exist and cannot be removed. - # This is to avoid mixing bundles from different versions of the code. - mkdir -p bundles - if [ -e "bundles/$VERSION" ] && [ -z "$KEEPBUNDLE" ]; then - echo "bundles/$VERSION already exists. Removing." - rm -fr "bundles/$VERSION" && mkdir "bundles/$VERSION" || exit 1 - echo - fi - - if [ "$(go env GOHOSTOS)" != 'windows' ]; then - # Windows and symlinks don't get along well - - rm -f bundles/latest - ln -s "$VERSION" bundles/latest - fi - - if [ $# -lt 1 ]; then - bundles=(${DEFAULT_BUNDLES[@]}) - else - bundles=($@) - fi - for bundle in ${bundles[@]}; do - export DEST="bundles/$VERSION/$(basename "$bundle")" - # Cygdrive paths don't play well with go build -o. - if [[ "$(uname -s)" == CYGWIN* ]]; then - export DEST="$(cygpath -mw "$DEST")" - fi - mkdir -p "$DEST" - ABS_DEST="$(cd "$DEST" && pwd -P)" - bundle "$bundle" - echo - done -} - -main "$@" diff --git a/vendor/github.com/docker/docker/hack/make/.binary b/vendor/github.com/docker/docker/hack/make/.binary deleted file mode 100644 index f5c35c3b7..000000000 --- a/vendor/github.com/docker/docker/hack/make/.binary +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -set -e - -BINARY_NAME="$BINARY_SHORT_NAME-$VERSION" -BINARY_EXTENSION="$(binary_extension)" -BINARY_FULLNAME="$BINARY_NAME$BINARY_EXTENSION" - -source "${MAKEDIR}/.go-autogen" - -( -export GOGC=${DOCKER_BUILD_GOGC:-1000} - -if [ "$(go env GOOS)/$(go env GOARCH)" != "$(go env GOHOSTOS)/$(go env GOHOSTARCH)" ]; then - # must be cross-compiling! - case "$(go env GOOS)/$(go env GOARCH)" in - windows/amd64) - export CC=x86_64-w64-mingw32-gcc - export CGO_ENABLED=1 - ;; - esac -fi - -if [ "$IAMSTATIC" == "true" ] && [ "$(go env GOHOSTOS)" == "linux" ]; then - if [ "${GOOS}/${GOARCH}" == "darwin/amd64" ]; then - export CGO_ENABLED=1 - export CC=o64-clang - export LDFLAGS='-linkmode external -s' - export LDFLAGS_STATIC_DOCKER='-extld='${CC} - else - export BUILDFLAGS=( "${BUILDFLAGS[@]/pkcs11 /}" ) # we cannot dlopen in pkcs11 in a static binary - fi -fi - -echo "Building: $DEST/$BINARY_FULLNAME" -go build \ - -o "$DEST/$BINARY_FULLNAME" \ - "${BUILDFLAGS[@]}" \ - -ldflags " - $LDFLAGS - $LDFLAGS_STATIC_DOCKER - " \ - $GO_PACKAGE -) - -echo "Created binary: $DEST/$BINARY_FULLNAME" -ln -sf "$BINARY_FULLNAME" "$DEST/$BINARY_SHORT_NAME$BINARY_EXTENSION" - -hash_files "$DEST/$BINARY_FULLNAME" diff --git a/vendor/github.com/docker/docker/hack/make/.binary-setup b/vendor/github.com/docker/docker/hack/make/.binary-setup deleted file mode 100644 index b9f8ce251..000000000 --- a/vendor/github.com/docker/docker/hack/make/.binary-setup +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -DOCKER_CLIENT_BINARY_NAME='docker' -DOCKER_DAEMON_BINARY_NAME='dockerd' -DOCKER_RUNC_BINARY_NAME='docker-runc' -DOCKER_CONTAINERD_BINARY_NAME='docker-containerd' -DOCKER_CONTAINERD_CTR_BINARY_NAME='docker-containerd-ctr' -DOCKER_CONTAINERD_SHIM_BINARY_NAME='docker-containerd-shim' -DOCKER_PROXY_BINARY_NAME='docker-proxy' -DOCKER_INIT_BINARY_NAME='docker-init' diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/compat b/vendor/github.com/docker/docker/hack/make/.build-deb/compat deleted file mode 100644 index ec635144f..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/control b/vendor/github.com/docker/docker/hack/make/.build-deb/control deleted file mode 100644 index 0f5439947..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/control +++ /dev/null @@ -1,29 +0,0 @@ -Source: docker-engine -Section: admin -Priority: optional -Maintainer: Docker -Standards-Version: 3.9.6 -Homepage: https://dockerproject.org -Vcs-Browser: https://github.com/docker/docker -Vcs-Git: git://github.com/docker/docker.git - -Package: docker-engine -Architecture: linux-any -Depends: iptables, ${misc:Depends}, ${perl:Depends}, ${shlibs:Depends} -Recommends: aufs-tools, - ca-certificates, - cgroupfs-mount | cgroup-lite, - git, - xz-utils, - ${apparmor:Recommends} -Conflicts: docker (<< 1.5~), docker.io, lxc-docker, lxc-docker-virtual-package, docker-engine-cs -Description: Docker: the open-source application container engine - Docker is an open source project to build, ship and run any application as a - lightweight container - . - Docker containers are both hardware-agnostic and platform-agnostic. This means - they can run anywhere, from your laptop to the largest EC2 compute instance and - everything in between - and they don't require you to use a particular - language, framework or packaging system. That makes them great building blocks - for deploying and scaling web apps, databases, and backend services without - depending on a particular stack or provider. diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.bash-completion b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.bash-completion deleted file mode 100644 index 6ea111930..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.bash-completion +++ /dev/null @@ -1 +0,0 @@ -contrib/completion/bash/docker diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.default b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.default deleted file mode 120000 index 4278533d6..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.default +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/init/sysvinit-debian/docker.default \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.init b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.init deleted file mode 120000 index 8cb89d30d..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.init +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/init/sysvinit-debian/docker \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.upstart b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.upstart deleted file mode 120000 index 7e1b64a3e..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.docker.upstart +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/init/upstart/docker.conf \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.install b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.install deleted file mode 100644 index dc6b25f04..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.install +++ /dev/null @@ -1,12 +0,0 @@ -#contrib/syntax/vim/doc/* /usr/share/vim/vimfiles/doc/ -#contrib/syntax/vim/ftdetect/* /usr/share/vim/vimfiles/ftdetect/ -#contrib/syntax/vim/syntax/* /usr/share/vim/vimfiles/syntax/ -contrib/*-integration usr/share/docker-engine/contrib/ -contrib/check-config.sh usr/share/docker-engine/contrib/ -contrib/completion/fish/docker.fish usr/share/fish/vendor_completions.d/ -contrib/completion/zsh/_docker usr/share/zsh/vendor-completions/ -contrib/init/systemd/docker.service lib/systemd/system/ -contrib/init/systemd/docker.socket lib/systemd/system/ -contrib/mk* usr/share/docker-engine/contrib/ -contrib/nuke-graph-directory.sh usr/share/docker-engine/contrib/ -contrib/syntax/nano/Dockerfile.nanorc usr/share/nano/ diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.manpages b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.manpages deleted file mode 100644 index 1aa62186a..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.manpages +++ /dev/null @@ -1 +0,0 @@ -man/man*/* diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.postinst b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.postinst deleted file mode 100644 index eeef6ca80..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.postinst +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -set -e - -case "$1" in - configure) - if [ -z "$2" ]; then - if ! getent group docker > /dev/null; then - groupadd --system docker - fi - fi - ;; - abort-*) - # How'd we get here?? - exit 1 - ;; - *) - ;; -esac - -#DEBHELPER# diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.udev b/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.udev deleted file mode 120000 index 914a36195..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docker-engine.udev +++ /dev/null @@ -1 +0,0 @@ -../../../contrib/udev/80-docker.rules \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/docs b/vendor/github.com/docker/docker/hack/make/.build-deb/docs deleted file mode 100644 index b43bf86b5..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/docs +++ /dev/null @@ -1 +0,0 @@ -README.md diff --git a/vendor/github.com/docker/docker/hack/make/.build-deb/rules b/vendor/github.com/docker/docker/hack/make/.build-deb/rules deleted file mode 100755 index 6522103e5..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-deb/rules +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/make -f - -VERSION = $(shell cat VERSION) -SYSTEMD_VERSION := $(shell dpkg-query -W -f='$${Version}\n' systemd | cut -d- -f1) -SYSTEMD_GT_227 := $(shell [ '$(SYSTEMD_VERSION)' ] && [ '$(SYSTEMD_VERSION)' -gt 227 ] && echo true ) - -override_dh_gencontrol: - # if we're on Ubuntu, we need to Recommends: apparmor - echo 'apparmor:Recommends=$(shell dpkg-vendor --is Ubuntu && echo apparmor)' >> debian/docker-engine.substvars - dh_gencontrol - -override_dh_auto_build: - ./hack/make.sh dynbinary - # ./man/md2man-all.sh runs outside the build container (if at all), since we don't have go-md2man here - -override_dh_auto_test: - ./bundles/$(VERSION)/dynbinary-daemon/dockerd -v - ./bundles/$(VERSION)/dynbinary-client/docker -v - -override_dh_strip: - # Go has lots of problems with stripping, so just don't - -override_dh_auto_install: - mkdir -p debian/docker-engine/usr/bin - cp -aT "$$(readlink -f bundles/$(VERSION)/dynbinary-client/docker)" debian/docker-engine/usr/bin/docker - cp -aT "$$(readlink -f bundles/$(VERSION)/dynbinary-daemon/dockerd)" debian/docker-engine/usr/bin/dockerd - cp -aT /usr/local/bin/docker-proxy debian/docker-engine/usr/bin/docker-proxy - cp -aT /usr/local/bin/docker-containerd debian/docker-engine/usr/bin/docker-containerd - cp -aT /usr/local/bin/docker-containerd-shim debian/docker-engine/usr/bin/docker-containerd-shim - cp -aT /usr/local/bin/docker-containerd-ctr debian/docker-engine/usr/bin/docker-containerd-ctr - cp -aT /usr/local/bin/docker-runc debian/docker-engine/usr/bin/docker-runc - cp -aT /usr/local/bin/docker-init debian/docker-engine/usr/bin/docker-init - mkdir -p debian/docker-engine/usr/lib/docker - -override_dh_installinit: - # use "docker" as our service name, not "docker-engine" - dh_installinit --name=docker -ifeq (true, $(SYSTEMD_GT_227)) - $(warning "Setting TasksMax=infinity") - sed -i -- 's/#TasksMax=infinity/TasksMax=infinity/' debian/docker-engine/lib/systemd/system/docker.service -endif - -override_dh_installudev: - # match our existing priority - dh_installudev --priority=z80 - -override_dh_install: - dh_install - dh_apparmor --profile-name=docker-engine -pdocker-engine - -override_dh_shlibdeps: - dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info - -%: - dh $@ --with=bash-completion $(shell command -v dh_systemd_enable > /dev/null 2>&1 && echo --with=systemd) diff --git a/vendor/github.com/docker/docker/hack/make/.build-rpm/docker-engine-selinux.spec b/vendor/github.com/docker/docker/hack/make/.build-rpm/docker-engine-selinux.spec deleted file mode 100644 index ae597bd77..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-rpm/docker-engine-selinux.spec +++ /dev/null @@ -1,96 +0,0 @@ -# Some bits borrowed from the openstack-selinux package -Name: docker-engine-selinux -Version: %{_version} -Release: %{_release}%{?dist} -Summary: SELinux Policies for the open-source application container engine -BuildArch: noarch -Group: Tools/Docker - -License: GPLv2 -Source: %{name}.tar.gz - -URL: https://dockerproject.org -Vendor: Docker -Packager: Docker - -%global selinux_policyver 3.13.1-102 -%global selinuxtype targeted -%global moduletype services -%global modulenames docker - -Requires(post): selinux-policy-base >= %{selinux_policyver}, selinux-policy-targeted >= %{selinux_policyver}, policycoreutils, policycoreutils-python libselinux-utils -BuildRequires: selinux-policy selinux-policy-devel - -# conflicting packages -Conflicts: docker-selinux - -# Usage: _format var format -# Expand 'modulenames' into various formats as needed -# Format must contain '$x' somewhere to do anything useful -%global _format() export %1=""; for x in %{modulenames}; do %1+=%2; %1+=" "; done; - -# Relabel files -%global relabel_files() \ - /sbin/restorecon -R %{_bindir}/docker %{_localstatedir}/run/docker.sock %{_localstatedir}/run/docker.pid %{_sysconfdir}/docker %{_localstatedir}/log/docker %{_localstatedir}/log/lxc %{_localstatedir}/lock/lxc %{_usr}/lib/systemd/system/docker.service /root/.docker &> /dev/null || : \ - -%description -SELinux policy modules for use with Docker - -%prep -%if 0%{?centos} <= 6 -%setup -n %{name} -%else -%autosetup -n %{name} -%endif - -%build -make SHARE="%{_datadir}" TARGETS="%{modulenames}" - -%install - -# Install SELinux interfaces -%_format INTERFACES $x.if -install -d %{buildroot}%{_datadir}/selinux/devel/include/%{moduletype} -install -p -m 644 $INTERFACES %{buildroot}%{_datadir}/selinux/devel/include/%{moduletype} - -# Install policy modules -%_format MODULES $x.pp.bz2 -install -d %{buildroot}%{_datadir}/selinux/packages -install -m 0644 $MODULES %{buildroot}%{_datadir}/selinux/packages - -%post -# -# Install all modules in a single transaction -# -if [ $1 -eq 1 ]; then - %{_sbindir}/setsebool -P -N virt_use_nfs=1 virt_sandbox_use_all_caps=1 -fi -%_format MODULES %{_datadir}/selinux/packages/$x.pp.bz2 -%{_sbindir}/semodule -n -s %{selinuxtype} -i $MODULES -if %{_sbindir}/selinuxenabled ; then - %{_sbindir}/load_policy - %relabel_files - if [ $1 -eq 1 ]; then - restorecon -R %{_sharedstatedir}/docker - fi -fi - -%postun -if [ $1 -eq 0 ]; then - %{_sbindir}/semodule -n -r %{modulenames} &> /dev/null || : - if %{_sbindir}/selinuxenabled ; then - %{_sbindir}/load_policy - %relabel_files - fi -fi - -%files -%doc LICENSE -%defattr(-,root,root,0755) -%attr(0644,root,root) %{_datadir}/selinux/packages/*.pp.bz2 -%attr(0644,root,root) %{_datadir}/selinux/devel/include/%{moduletype}/*.if - -%changelog -* Tue Dec 1 2015 Jessica Frazelle 1.9.1-1 -- add licence to rpm -- add selinux-policy and docker-engine-selinux rpm diff --git a/vendor/github.com/docker/docker/hack/make/.build-rpm/docker-engine.spec b/vendor/github.com/docker/docker/hack/make/.build-rpm/docker-engine.spec deleted file mode 100644 index d53e55b6c..000000000 --- a/vendor/github.com/docker/docker/hack/make/.build-rpm/docker-engine.spec +++ /dev/null @@ -1,254 +0,0 @@ -Name: docker-engine -Version: %{_version} -Release: %{_release}%{?dist} -Summary: The open-source application container engine -Group: Tools/Docker - -License: ASL 2.0 -Source: %{name}.tar.gz - -URL: https://dockerproject.org -Vendor: Docker -Packager: Docker - -# is_systemd conditional -%if 0%{?fedora} >= 21 || 0%{?centos} >= 7 || 0%{?rhel} >= 7 || 0%{?suse_version} >= 1210 -%global is_systemd 1 -%endif - -# required packages for build -# most are already in the container (see contrib/builder/rpm/ARCH/generate.sh) -# only require systemd on those systems -%if 0%{?is_systemd} -%if 0%{?suse_version} >= 1210 -BuildRequires: systemd-rpm-macros -%{?systemd_requires} -%else -%if 0%{?fedora} >= 25 -# Systemd 230 and up no longer have libsystemd-journal (see https://bugzilla.redhat.com/show_bug.cgi?id=1350301) -BuildRequires: pkgconfig(systemd) -Requires: systemd-units -%else -BuildRequires: pkgconfig(systemd) -Requires: systemd-units -BuildRequires: pkgconfig(libsystemd-journal) -%endif -%endif -%else -Requires(post): chkconfig -Requires(preun): chkconfig -# This is for /sbin/service -Requires(preun): initscripts -%endif - -# required packages on install -Requires: /bin/sh -Requires: iptables -%if !0%{?suse_version} -Requires: libcgroup -%else -Requires: libcgroup1 -%endif -Requires: tar -Requires: xz -%if 0%{?fedora} >= 21 || 0%{?centos} >= 7 || 0%{?rhel} >= 7 || 0%{?oraclelinux} >= 7 -# Resolves: rhbz#1165615 -Requires: device-mapper-libs >= 1.02.90-1 -%endif -%if 0%{?oraclelinux} >= 6 -# Require Oracle Unbreakable Enterprise Kernel R4 and newer device-mapper -Requires: kernel-uek >= 4.1 -Requires: device-mapper >= 1.02.90-2 -%endif - -# docker-selinux conditional -%if 0%{?fedora} >= 20 || 0%{?centos} >= 7 || 0%{?rhel} >= 7 || 0%{?oraclelinux} >= 7 -%global with_selinux 1 -%endif - -# DWZ problem with multiple golang binary, see bug -# https://bugzilla.redhat.com/show_bug.cgi?id=995136#c12 -%if 0%{?fedora} >= 20 || 0%{?rhel} >= 7 || 0%{?oraclelinux} >= 7 -%global _dwz_low_mem_die_limit 0 -%endif - -# start if with_selinux -%if 0%{?with_selinux} -# Version of SELinux we were using -%if 0%{?fedora} == 20 -%global selinux_policyver 3.12.1-197 -%endif # fedora 20 -%if 0%{?fedora} == 21 -%global selinux_policyver 3.13.1-105 -%endif # fedora 21 -%if 0%{?fedora} >= 22 -%global selinux_policyver 3.13.1-128 -%endif # fedora 22 -%if 0%{?centos} >= 7 || 0%{?rhel} >= 7 || 0%{?oraclelinux} >= 7 -%global selinux_policyver 3.13.1-23 -%endif # centos,oraclelinux 7 -%endif # with_selinux - -# RE: rhbz#1195804 - ensure min NVR for selinux-policy -%if 0%{?with_selinux} -Requires: selinux-policy >= %{selinux_policyver} -Requires(pre): %{name}-selinux >= %{version}-%{release} -%endif # with_selinux - -# conflicting packages -Conflicts: docker -Conflicts: docker-io -Conflicts: docker-engine-cs - -%description -Docker is an open source project to build, ship and run any application as a -lightweight container. - -Docker containers are both hardware-agnostic and platform-agnostic. This means -they can run anywhere, from your laptop to the largest EC2 compute instance and -everything in between - and they don't require you to use a particular -language, framework or packaging system. That makes them great building blocks -for deploying and scaling web apps, databases, and backend services without -depending on a particular stack or provider. - -%prep -%if 0%{?centos} <= 6 || 0%{?oraclelinux} <=6 -%setup -n %{name} -%else -%autosetup -n %{name} -%endif - -%build -export DOCKER_GITCOMMIT=%{_gitcommit} -./hack/make.sh dynbinary -# ./man/md2man-all.sh runs outside the build container (if at all), since we don't have go-md2man here - -%check -./bundles/%{_origversion}/dynbinary-client/docker -v -./bundles/%{_origversion}/dynbinary-daemon/dockerd -v - -%install -# install binary -install -d $RPM_BUILD_ROOT/%{_bindir} -install -p -m 755 bundles/%{_origversion}/dynbinary-client/docker-%{_origversion} $RPM_BUILD_ROOT/%{_bindir}/docker -install -p -m 755 bundles/%{_origversion}/dynbinary-daemon/dockerd-%{_origversion} $RPM_BUILD_ROOT/%{_bindir}/dockerd - -# install proxy -install -p -m 755 /usr/local/bin/docker-proxy $RPM_BUILD_ROOT/%{_bindir}/docker-proxy - -# install containerd -install -p -m 755 /usr/local/bin/docker-containerd $RPM_BUILD_ROOT/%{_bindir}/docker-containerd -install -p -m 755 /usr/local/bin/docker-containerd-shim $RPM_BUILD_ROOT/%{_bindir}/docker-containerd-shim -install -p -m 755 /usr/local/bin/docker-containerd-ctr $RPM_BUILD_ROOT/%{_bindir}/docker-containerd-ctr - -# install runc -install -p -m 755 /usr/local/bin/docker-runc $RPM_BUILD_ROOT/%{_bindir}/docker-runc - -# install tini -install -p -m 755 /usr/local/bin/docker-init $RPM_BUILD_ROOT/%{_bindir}/docker-init - -# install udev rules -install -d $RPM_BUILD_ROOT/%{_sysconfdir}/udev/rules.d -install -p -m 644 contrib/udev/80-docker.rules $RPM_BUILD_ROOT/%{_sysconfdir}/udev/rules.d/80-docker.rules - -# add init scripts -install -d $RPM_BUILD_ROOT/etc/sysconfig -install -d $RPM_BUILD_ROOT/%{_initddir} - - -%if 0%{?is_systemd} -install -d $RPM_BUILD_ROOT/%{_unitdir} -install -p -m 644 contrib/init/systemd/docker.service.rpm $RPM_BUILD_ROOT/%{_unitdir}/docker.service -%else -install -p -m 644 contrib/init/sysvinit-redhat/docker.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/docker -install -p -m 755 contrib/init/sysvinit-redhat/docker $RPM_BUILD_ROOT/%{_initddir}/docker -%endif -# add bash, zsh, and fish completions -install -d $RPM_BUILD_ROOT/usr/share/bash-completion/completions -install -d $RPM_BUILD_ROOT/usr/share/zsh/vendor-completions -install -d $RPM_BUILD_ROOT/usr/share/fish/vendor_completions.d -install -p -m 644 contrib/completion/bash/docker $RPM_BUILD_ROOT/usr/share/bash-completion/completions/docker -install -p -m 644 contrib/completion/zsh/_docker $RPM_BUILD_ROOT/usr/share/zsh/vendor-completions/_docker -install -p -m 644 contrib/completion/fish/docker.fish $RPM_BUILD_ROOT/usr/share/fish/vendor_completions.d/docker.fish - -# install manpages -install -d %{buildroot}%{_mandir}/man1 -install -p -m 644 man/man1/*.1 $RPM_BUILD_ROOT/%{_mandir}/man1 -install -d %{buildroot}%{_mandir}/man5 -install -p -m 644 man/man5/*.5 $RPM_BUILD_ROOT/%{_mandir}/man5 -install -d %{buildroot}%{_mandir}/man8 -install -p -m 644 man/man8/*.8 $RPM_BUILD_ROOT/%{_mandir}/man8 - -# add vimfiles -install -d $RPM_BUILD_ROOT/usr/share/vim/vimfiles/doc -install -d $RPM_BUILD_ROOT/usr/share/vim/vimfiles/ftdetect -install -d $RPM_BUILD_ROOT/usr/share/vim/vimfiles/syntax -install -p -m 644 contrib/syntax/vim/doc/dockerfile.txt $RPM_BUILD_ROOT/usr/share/vim/vimfiles/doc/dockerfile.txt -install -p -m 644 contrib/syntax/vim/ftdetect/dockerfile.vim $RPM_BUILD_ROOT/usr/share/vim/vimfiles/ftdetect/dockerfile.vim -install -p -m 644 contrib/syntax/vim/syntax/dockerfile.vim $RPM_BUILD_ROOT/usr/share/vim/vimfiles/syntax/dockerfile.vim - -# add nano -install -d $RPM_BUILD_ROOT/usr/share/nano -install -p -m 644 contrib/syntax/nano/Dockerfile.nanorc $RPM_BUILD_ROOT/usr/share/nano/Dockerfile.nanorc - -# list files owned by the package here -%files -%doc AUTHORS CHANGELOG.md CONTRIBUTING.md LICENSE MAINTAINERS NOTICE README.md -/%{_bindir}/docker -/%{_bindir}/dockerd -/%{_bindir}/docker-containerd -/%{_bindir}/docker-containerd-shim -/%{_bindir}/docker-containerd-ctr -/%{_bindir}/docker-proxy -/%{_bindir}/docker-runc -/%{_bindir}/docker-init -/%{_sysconfdir}/udev/rules.d/80-docker.rules -%if 0%{?is_systemd} -/%{_unitdir}/docker.service -%else -%config(noreplace,missingok) /etc/sysconfig/docker -/%{_initddir}/docker -%endif -/usr/share/bash-completion/completions/docker -/usr/share/zsh/vendor-completions/_docker -/usr/share/fish/vendor_completions.d/docker.fish -%doc -/%{_mandir}/man1/* -/%{_mandir}/man5/* -/%{_mandir}/man8/* -/usr/share/vim/vimfiles/doc/dockerfile.txt -/usr/share/vim/vimfiles/ftdetect/dockerfile.vim -/usr/share/vim/vimfiles/syntax/dockerfile.vim -/usr/share/nano/Dockerfile.nanorc - -%post -%if 0%{?is_systemd} -%systemd_post docker -%else -# This adds the proper /etc/rc*.d links for the script -/sbin/chkconfig --add docker -%endif -if ! getent group docker > /dev/null; then - groupadd --system docker -fi - -%preun -%if 0%{?is_systemd} -%systemd_preun docker -%else -if [ $1 -eq 0 ] ; then - /sbin/service docker stop >/dev/null 2>&1 - /sbin/chkconfig --del docker -fi -%endif - -%postun -%if 0%{?is_systemd} -%systemd_postun_with_restart docker -%else -if [ "$1" -ge "1" ] ; then - /sbin/service docker condrestart >/dev/null 2>&1 || : -fi -%endif - -%changelog diff --git a/vendor/github.com/docker/docker/hack/make/.detect-daemon-osarch b/vendor/github.com/docker/docker/hack/make/.detect-daemon-osarch deleted file mode 100644 index 73955392d..000000000 --- a/vendor/github.com/docker/docker/hack/make/.detect-daemon-osarch +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash -set -e - -docker-version-osarch() { - local target="$1" # "Client" or "Server" - local fmtStr="{{.${target}.Os}}/{{.${target}.Arch}}" - if docker version -f "$fmtStr" 2>/dev/null; then - # if "docker version -f" works, let's just use that! - return - fi - docker version | awk ' - $1 ~ /^(Client|Server):$/ { section = 0 } - $1 == "'"$target"':" { section = 1; next } - section && $1 == "OS/Arch:" { print $2 } - - # old versions of Docker - $1 == "OS/Arch" && $2 == "('"${target,,}"'):" { print $3 } - ' -} - -# Retrieve OS/ARCH of docker daemon, e.g. linux/amd64 -export DOCKER_ENGINE_OSARCH="$(docker-version-osarch 'Server')" -export DOCKER_ENGINE_GOOS="${DOCKER_ENGINE_OSARCH%/*}" -export DOCKER_ENGINE_GOARCH="${DOCKER_ENGINE_OSARCH##*/}" -DOCKER_ENGINE_GOARCH=${DOCKER_ENGINE_GOARCH:=amd64} - -# and the client, just in case -export DOCKER_CLIENT_OSARCH="$(docker-version-osarch 'Client')" -export DOCKER_CLIENT_GOOS="${DOCKER_CLIENT_OSARCH%/*}" -export DOCKER_CLIENT_GOARCH="${DOCKER_CLIENT_OSARCH##*/}" -DOCKER_CLIENT_GOARCH=${DOCKER_CLIENT_GOARCH:=amd64} - -# Retrieve the architecture used in contrib/builder/(deb|rpm)/$PACKAGE_ARCH/ -PACKAGE_ARCH='amd64' -case "${DOCKER_ENGINE_GOARCH:-$DOCKER_CLIENT_GOARCH}" in - arm) - PACKAGE_ARCH='armhf' - ;; - arm64) - PACKAGE_ARCH='aarch64' - ;; - amd64|ppc64le|s390x) - PACKAGE_ARCH="${DOCKER_ENGINE_GOARCH:-$DOCKER_CLIENT_GOARCH}" - ;; - *) - echo >&2 "warning: not sure how to convert '$DOCKER_ENGINE_GOARCH' to a 'Docker' arch, assuming '$PACKAGE_ARCH'" - ;; -esac -export PACKAGE_ARCH - -DOCKERFILE='Dockerfile' -TEST_IMAGE_NAMESPACE= -case "$PACKAGE_ARCH" in - amd64) - case "${DOCKER_ENGINE_GOOS:-$DOCKER_CLIENT_GOOS}" in - windows) - DOCKERFILE='Dockerfile.windows' - ;; - solaris) - DOCKERFILE='Dockerfile.solaris' - ;; - esac - ;; - *) - DOCKERFILE="Dockerfile.$PACKAGE_ARCH" - TEST_IMAGE_NAMESPACE="$PACKAGE_ARCH" - ;; -esac -export DOCKERFILE TEST_IMAGE_NAMESPACE diff --git a/vendor/github.com/docker/docker/hack/make/.ensure-emptyfs b/vendor/github.com/docker/docker/hack/make/.ensure-emptyfs deleted file mode 100644 index e71a30ae8..000000000 --- a/vendor/github.com/docker/docker/hack/make/.ensure-emptyfs +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -set -e - -if ! docker inspect emptyfs &> /dev/null; then - # let's build a "docker save" tarball for "emptyfs" - # see https://github.com/docker/docker/pull/5262 - # and also https://github.com/docker/docker/issues/4242 - dir="$DEST/emptyfs" - mkdir -p "$dir" - ( - cd "$dir" - echo '{"emptyfs":{"latest":"511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158"}}' > repositories - mkdir -p 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158 - ( - cd 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158 - echo '{"id":"511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158","comment":"Imported from -","created":"2013-06-13T14:03:50.821769-07:00","container_config":{"Hostname":"","Domainname":"","User":"","Memory":0,"MemorySwap":0,"CpuShares":0,"AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"PortSpecs":null,"ExposedPorts":null,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":null,"Image":"","Volumes":null,"WorkingDir":"","Entrypoint":null,"NetworkDisabled":false,"OnBuild":null},"docker_version":"0.4.0","architecture":"x86_64","Size":0}' > json - echo '1.0' > VERSION - tar -cf layer.tar --files-from /dev/null - ) - ) - ( set -x; tar -cC "$dir" . | docker load ) - rm -rf "$dir" -fi diff --git a/vendor/github.com/docker/docker/hack/make/.go-autogen b/vendor/github.com/docker/docker/hack/make/.go-autogen deleted file mode 100644 index 4d26052bb..000000000 --- a/vendor/github.com/docker/docker/hack/make/.go-autogen +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -rm -rf autogen - -source hack/dockerfile/binaries-commits - -cat > dockerversion/version_autogen.go < dockerversion/version_autogen_unix.go < - -param( - [Parameter(Mandatory=$true)][string]$CommitString, - [Parameter(Mandatory=$true)][string]$DockerVersion -) - -$ErrorActionPreference = "Stop" - -# Utility function to get the build date/time in UTC -Function Get-BuildDateTime() { - return $(Get-Date).ToUniversalTime() -} - -try { - $buildDateTime=Get-BuildDateTime - - if (Test-Path ".\autogen") { - Remove-Item ".\autogen" -Recurse -Force | Out-Null - } - - $fileContents = ' -// +build autogen - -// Package dockerversion is auto-generated at build-time -package dockerversion - -// Default build-time variable for library-import. -// This file is overridden on build with build-time informations. -const ( - GitCommit string = "'+$CommitString+'" - Version string = "'+$DockerVersion+'" - BuildTime string = "'+$buildDateTime+'" -) - -// AUTOGENERATED FILE; see hack\make\.go-autogen.ps1 -' - - # Write the file without BOM - $outputFile="$(pwd)\dockerversion\version_autogen.go" - if (Test-Path $outputFile) { Remove-Item $outputFile } - [System.IO.File]::WriteAllText($outputFile, $fileContents, (New-Object System.Text.UTF8Encoding($False))) - - New-Item -ItemType Directory -Path "autogen\winresources\tmp" | Out-Null - New-Item -ItemType Directory -Path "autogen\winresources\docker" | Out-Null - New-Item -ItemType Directory -Path "autogen\winresources\dockerd" | Out-Null - Copy-Item "hack\make\.resources-windows\resources.go" "autogen\winresources\docker" - Copy-Item "hack\make\.resources-windows\resources.go" "autogen\winresources\dockerd" - - # Generate a version in the form major,minor,patch,build - $versionQuad=$DockerVersion -replace "[^0-9.]*" -replace "\.", "," - - # Compile the messages - windmc hack\make\.resources-windows\event_messages.mc -h autogen\winresources\tmp -r autogen\winresources\tmp - if ($LASTEXITCODE -ne 0) { Throw "Failed to compile event message resources" } - - # If you really want to understand this madness below, search the Internet for powershell variables after verbatim arguments... Needed to get double-quotes passed through to the compiler options. - # Generate the .syso files containing all the resources and manifest needed to compile the final docker binaries. Both 32 and 64-bit clients. - $env:_ag_dockerVersion=$DockerVersion - $env:_ag_gitCommit=$CommitString - - windres -i hack/make/.resources-windows/docker.rc -o autogen/winresources/docker/rsrc_amd64.syso -F pe-x86-64 --use-temp-file -I autogen/winresources/tmp -D DOCKER_VERSION_QUAD=$versionQuad --% -D DOCKER_VERSION=\"%_ag_dockerVersion%\" -D DOCKER_COMMIT=\"%_ag_gitCommit%\" - if ($LASTEXITCODE -ne 0) { Throw "Failed to compile client 64-bit resources" } - - windres -i hack/make/.resources-windows/docker.rc -o autogen/winresources/docker/rsrc_386.syso -F pe-i386 --use-temp-file -I autogen/winresources/tmp -D DOCKER_VERSION_QUAD=$versionQuad --% -D DOCKER_VERSION=\"%_ag_dockerVersion%\" -D DOCKER_COMMIT=\"%_ag_gitCommit%\" - if ($LASTEXITCODE -ne 0) { Throw "Failed to compile client 32-bit resources" } - - windres -i hack/make/.resources-windows/dockerd.rc -o autogen/winresources/dockerd/rsrc_amd64.syso -F pe-x86-64 --use-temp-file -I autogen/winresources/tmp -D DOCKER_VERSION_QUAD=$versionQuad --% -D DOCKER_VERSION=\"%_ag_dockerVersion%\" -D DOCKER_COMMIT=\"%_ag_gitCommit%\" - if ($LASTEXITCODE -ne 0) { Throw "Failed to compile daemon resources" } -} -Catch [Exception] { - # Throw the error onto the caller to display errors. We don't expect this script to be called directly - Throw ".go-autogen.ps1 failed with error $_" -} -Finally { - Remove-Item .\autogen\winresources\tmp -Recurse -Force -ErrorAction SilentlyContinue | Out-Null - $env:_ag_dockerVersion="" - $env:_ag_gitCommit="" -} diff --git a/vendor/github.com/docker/docker/hack/make/.integration-daemon-setup b/vendor/github.com/docker/docker/hack/make/.integration-daemon-setup deleted file mode 100644 index 0efde717f..000000000 --- a/vendor/github.com/docker/docker/hack/make/.integration-daemon-setup +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -set -e - -bundle .detect-daemon-osarch -if [ $DOCKER_ENGINE_GOOS != "windows" ]; then - bundle .ensure-emptyfs -fi diff --git a/vendor/github.com/docker/docker/hack/make/.integration-daemon-start b/vendor/github.com/docker/docker/hack/make/.integration-daemon-start deleted file mode 100644 index b96979bdb..000000000 --- a/vendor/github.com/docker/docker/hack/make/.integration-daemon-start +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/bash - -# see test-integration-cli for example usage of this script - -base="$ABS_DEST/.." -export PATH="$base/binary-client:$base/binary-daemon:$base/dynbinary-client:$base/dynbinary-daemon:$PATH" - -if ! command -v docker &> /dev/null; then - echo >&2 'error: binary-client or dynbinary-client must be run before .integration-daemon-start' - false -fi - -# This is a temporary hack for split-binary mode. It can be removed once -# https://github.com/docker/docker/pull/22134 is merged into docker master -if [ "$(go env GOOS)" = 'windows' ]; then - return -fi - -if [ -z "$DOCKER_TEST_HOST" ]; then - if docker version &> /dev/null; then - echo >&2 'skipping daemon start, since daemon appears to be already started' - return - fi -fi - -if ! command -v dockerd &> /dev/null; then - echo >&2 'error: binary-daemon or dynbinary-daemon must be run before .integration-daemon-start' - false -fi - -# intentionally open a couple bogus file descriptors to help test that they get scrubbed in containers -exec 41>&1 42>&2 - -export DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs} -export DOCKER_USERLANDPROXY=${DOCKER_USERLANDPROXY:-true} - -# example usage: DOCKER_STORAGE_OPTS="dm.basesize=20G,dm.loopdatasize=200G" -storage_params="" -if [ -n "$DOCKER_STORAGE_OPTS" ]; then - IFS=',' - for i in ${DOCKER_STORAGE_OPTS}; do - storage_params="--storage-opt $i $storage_params" - done - unset IFS -fi - -# example usage: DOCKER_STORAGE_OPTS="dm.basesize=20G,dm.loopdatasize=200G" -extra_params="" -if [ "$DOCKER_REMAP_ROOT" ]; then - extra_params="--userns-remap $DOCKER_REMAP_ROOT" -fi - -if [ "$DOCKER_EXPERIMENTAL" ]; then - echo >&2 '# DOCKER_EXPERIMENTAL is set: starting daemon with experimental features enabled! ' - extra_params="$extra_params --experimental" -fi - -if [ -z "$DOCKER_TEST_HOST" ]; then - # Start apparmor if it is enabled - if [ -e "/sys/module/apparmor/parameters/enabled" ] && [ "$(cat /sys/module/apparmor/parameters/enabled)" == "Y" ]; then - # reset container variable so apparmor profile is applied to process - # see https://github.com/docker/libcontainer/blob/master/apparmor/apparmor.go#L16 - export container="" - ( - set -x - /etc/init.d/apparmor start - ) - fi - - export DOCKER_HOST="unix://$(cd "$DEST" && pwd)/docker.sock" # "pwd" tricks to make sure $DEST is an absolute path, not a relative one - ( set -x; exec \ - dockerd --debug \ - --host "$DOCKER_HOST" \ - --storage-driver "$DOCKER_GRAPHDRIVER" \ - --pidfile "$DEST/docker.pid" \ - --userland-proxy="$DOCKER_USERLANDPROXY" \ - $storage_params \ - $extra_params \ - &> "$DEST/docker.log" - ) & - # make sure that if the script exits unexpectedly, we stop this daemon we just started - trap 'bundle .integration-daemon-stop' EXIT -else - export DOCKER_HOST="$DOCKER_TEST_HOST" -fi - -# give it a little time to come up so it's "ready" -tries=60 -echo "INFO: Waiting for daemon to start..." -while ! docker version &> /dev/null; do - (( tries-- )) - if [ $tries -le 0 ]; then - printf "\n" - if [ -z "$DOCKER_HOST" ]; then - echo >&2 "error: daemon failed to start" - echo >&2 " check $DEST/docker.log for details" - else - echo >&2 "error: daemon at $DOCKER_HOST fails to 'docker version':" - docker version >&2 || true - # Additional Windows CI debugging as this is a common error as of - # January 2016 - if [ "$(go env GOOS)" = 'windows' ]; then - echo >&2 "Container log below:" - echo >&2 "---" - # Important - use the docker on the CI host, not the one built locally - # which is currently in our path. - ! /c/bin/docker -H=$MAIN_DOCKER_HOST logs docker-$COMMITHASH - echo >&2 "---" - fi - fi - false - fi - printf "." - sleep 2 -done -printf "\n" diff --git a/vendor/github.com/docker/docker/hack/make/.integration-daemon-stop b/vendor/github.com/docker/docker/hack/make/.integration-daemon-stop deleted file mode 100644 index 03c1b1468..000000000 --- a/vendor/github.com/docker/docker/hack/make/.integration-daemon-stop +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -if [ ! "$(go env GOOS)" = 'windows' ]; then - trap - EXIT # reset EXIT trap applied in .integration-daemon-start - - for pidFile in $(find "$DEST" -name docker.pid); do - pid=$(set -x; cat "$pidFile") - ( set -x; kill "$pid" ) - if ! wait "$pid"; then - echo >&2 "warning: PID $pid from $pidFile had a nonzero exit code" - fi - done - - if [ -z "$DOCKER_TEST_HOST" ]; then - # Stop apparmor if it is enabled - if [ -e "/sys/module/apparmor/parameters/enabled" ] && [ "$(cat /sys/module/apparmor/parameters/enabled)" == "Y" ]; then - ( - set -x - /etc/init.d/apparmor stop - ) - fi - fi -else - # Note this script is not actionable on Windows to Linux CI. Instead the - # DIND daemon under test is torn down by the Jenkins tear-down script - echo "INFO: Not stopping daemon on Windows CI" -fi diff --git a/vendor/github.com/docker/docker/hack/make/.integration-test-helpers b/vendor/github.com/docker/docker/hack/make/.integration-test-helpers deleted file mode 100644 index 7b73b2f14..000000000 --- a/vendor/github.com/docker/docker/hack/make/.integration-test-helpers +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash - -: ${TEST_REPEAT:=0} - -bundle_test_integration_cli() { - TESTFLAGS="$TESTFLAGS -check.v -check.timeout=${TIMEOUT} -test.timeout=360m" - go_test_dir integration-cli $DOCKER_INTEGRATION_TESTS_VERIFIED -} - -# If $TESTFLAGS is set in the environment, it is passed as extra arguments to 'go test'. -# You can use this to select certain tests to run, e.g. -# -# TESTFLAGS='-test.run ^TestBuild$' ./hack/make.sh test-unit -# -# For integration-cli test, we use [gocheck](https://labix.org/gocheck), if you want -# to run certain tests on your local host, you should run with command: -# -# TESTFLAGS='-check.f DockerSuite.TestBuild*' ./hack/make.sh binary test-integration-cli -# -go_test_dir() { - dir=$1 - precompiled=$2 - testbinary="$DEST/test.main" - testcover=() - testcoverprofile=() - ( - mkdir -p "$DEST/coverprofiles" - export DEST="$ABS_DEST" # in a subshell this is safe -- our integration-cli tests need DEST, and "cd" screws it up - if [ -z $precompiled ]; then - ensure_test_dir $1 $testbinary - fi - cd "$dir" - i=0 - while ((++i)); do - test_env "$testbinary" $TESTFLAGS - if [ $i -gt "$TEST_REPEAT" ]; then - break - fi - echo "Repeating test ($i)" - done - ) -} - -ensure_test_dir() { - ( - # make sure a test dir will compile - dir="$1" - out="$2" - echo Building test dir: "$dir" - set -xe - cd "$dir" - go test -c -o "$out" -ldflags "$LDFLAGS" "${BUILDFLAGS[@]}" - ) -} - -test_env() { - ( - set -xe - # use "env -i" to tightly control the environment variables that bleed into the tests - env -i \ - DEST="$DEST" \ - DOCKER_TLS_VERIFY="$DOCKER_TEST_TLS_VERIFY" \ - DOCKER_CERT_PATH="$DOCKER_TEST_CERT_PATH" \ - DOCKER_ENGINE_GOARCH="$DOCKER_ENGINE_GOARCH" \ - DOCKER_GRAPHDRIVER="$DOCKER_GRAPHDRIVER" \ - DOCKER_USERLANDPROXY="$DOCKER_USERLANDPROXY" \ - DOCKER_HOST="$DOCKER_HOST" \ - DOCKER_REMAP_ROOT="$DOCKER_REMAP_ROOT" \ - DOCKER_REMOTE_DAEMON="$DOCKER_REMOTE_DAEMON" \ - DOCKERFILE="$DOCKERFILE" \ - GOPATH="$GOPATH" \ - GOTRACEBACK=all \ - HOME="$ABS_DEST/fake-HOME" \ - PATH="$PATH" \ - TEMP="$TEMP" \ - TEST_IMAGE_NAMESPACE="$TEST_IMAGE_NAMESPACE" \ - "$@" - ) -} diff --git a/vendor/github.com/docker/docker/hack/make/.resources-windows/common.rc b/vendor/github.com/docker/docker/hack/make/.resources-windows/common.rc deleted file mode 100644 index 000fb3536..000000000 --- a/vendor/github.com/docker/docker/hack/make/.resources-windows/common.rc +++ /dev/null @@ -1,38 +0,0 @@ -// Application icon -1 ICON "docker.ico" - -// Windows executable manifest -1 24 /* RT_MANIFEST */ "docker.exe.manifest" - -// Version information -1 VERSIONINFO - -#ifdef DOCKER_VERSION_QUAD -FILEVERSION DOCKER_VERSION_QUAD -PRODUCTVERSION DOCKER_VERSION_QUAD -#endif - -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "000004B0" - BEGIN - VALUE "ProductName", DOCKER_NAME - -#ifdef DOCKER_VERSION - VALUE "FileVersion", DOCKER_VERSION - VALUE "ProductVersion", DOCKER_VERSION -#endif - -#ifdef DOCKER_COMMIT - VALUE "OriginalFileName", DOCKER_COMMIT -#endif - - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0000, 0x04B0 - END -END diff --git a/vendor/github.com/docker/docker/hack/make/.resources-windows/docker.exe.manifest b/vendor/github.com/docker/docker/hack/make/.resources-windows/docker.exe.manifest deleted file mode 100644 index 674bc9422..000000000 --- a/vendor/github.com/docker/docker/hack/make/.resources-windows/docker.exe.manifest +++ /dev/null @@ -1,18 +0,0 @@ - - - Docker - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vendor/github.com/docker/docker/hack/make/.resources-windows/docker.ico b/vendor/github.com/docker/docker/hack/make/.resources-windows/docker.ico deleted file mode 100644 index c6506ec8dbd8e295d98a084412e9d2c358a6ba39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370070 zcmeEP2Y405+TL?c0%F4sD!rrFr6_v!{$4AJ1?*S7-fQo@E1)91i}a!b(rX$m0Ro|S zl8_#Huc9K5%>TY~c9PA>Nlzfm^YzX_0Ys1`^UF*YMa1~pn zQjstq44g3rHUvNJ**NcYPxRuB0h?D14oKMWTR>{++JN8Fl)E5}8uGT~8vB{$p7Fiq z3GHSD%>rR6Jw0Ie?|buOFq?qadi(lEl=jLTyr^ZHo z7akkcdFke*UDm`d?HV1stb2UylFl*Mw>EBh&(-lO`z&8Q{gHVQeLchH_qMvv>*e}n zb`R@6u;-^>-%l(WU_HF#C+qHIL#^iPMp?BEgn-W;06W+I1Ne$J)^pInx>VeC~g3qScfHtL7TiJK;c zro@FsC2sibAoeS4E1a*Ay8wPnjH6}NVbS~}?= zHMiddDy*BO!n(Tvrj~*aP;+{E0bihiKd`-Zc6VzT(lGdjX$$&WgBJa0y}Pi#)e_s) zR*keSKCsZL)V-|m<$Jfyd z-o1A7ioUNV$IkjTe$BAx#ElbAr6kOUZO^qaPo*S8*tWem9d>>)HF4pIl*EV=DGA}g zd>)^cf%v&;h$Yguq%KQO*f=45`IJY~X7>zC3+`;Cg?6>lVDqPJoJ4xU#!1WtoC4B; z4BvpVYxOjiWzj9ySk~ zj(}}PoWwS5JlzJ$;2-ocJkEi*xoS)D61{KjocGk+{+Fnb&USy_!wp-`?DzfIHuk04 zFn)qQ!uShQrsyM#pD^(Q(w*=PD-kP9!Cc~th!YyYCtT(f|D>-i*VK-P5qe^taiEMB zoZLvh{4lV2c^`MurtuklJ?{+T@Ou+CP3WDpX;QL|-4nuL&#+y@>4@QJJ&(`1Pa2$OBeT0r57&rJH2VbBt z&#)aa!U*_-k1#*b+*iUO-7F8EIr#3EZDF7+G7!IZxM%mlR9EbhuDY*}jqF%Ee(i|& zF=mfTiJN^qIev~xO~lw-_wC`Zb@uDFAIQnJ^V*MbLTVD{03y|zu(#CgUgxNgA7Jma z`yP4r_xZK=ypA*ez{Cpl4SFmQYR@qsKKKLUhB(9rLos&v=c?h}@q&?aw-+oIVupaF zc=l-aNh%DK1qL>+=z}@@p`PtqmU-=dafj;@H;x~H`T0Z1@p}B8o{|`W{+?rY_VJFG zy(oFu{+8q@l^8ukEgAa{ZTF$wX!nfui@nb;Or7)t977Q1{B({P;0tyDzu?)yODjiM z=NdV~U%0p)0dtKqe`rXNv{W(>z2IXv*5T;*b?R%Dd-Jj$EfUs^o|YUNl*V`*^K`U% z_VLAM^TuD$_EVRu&8vs0@Ike`Iz?gm|(@QtaFN`QW>OC6^eoQHN)Mh3E?_c-8BELrU~mtO-zmr{uBK? z;`;@(dyMIev9C9F&lE8QZGY3^E^1Ei^HgXT+L7mU+jCK`XJP|0caY9G1NeeC_=3Jz zU({47uiaz3;6kk6VN6h=luT~6)G-jf@MAZg*Xg;v^+D|}k6$yiJK}uUI_y4i0sH!* zkLjJZ?whCW`t*Vqksn<1UWzdAZ-(S?-u6ou0xNe=DEUd*l2PwtLg>rz}_N=6wvi zcYB|~m7cMFPPSdp{bml4_h({)&F}+XE*s{3o;c=RtWCxmBg6?351c0bugI6#IPW#r z#<{O*+h055!J6@_hfT!#J=#6S^&H>x*?ck0>E%=p$NRAT_2FN5pTBp{*Yo^>+Fofp zUdIGx?hs>u!+1u}W9bm95%rPpAn=(1)*p! z>{uVRUqa)1UmsxGKF9lE-79(5@SeVBd!@lA=$L@<0DS@04;{fcU@-hZUA4nIM}T=m zJ}(eIP=dBl(W;JH(M|XHk^QYISku!xDK-et@vuHGF`Vml3cgOKFz0Z*k7s%DjmRM$?IRZa=vLwV-D+MR_y#<8=USW$e_%g@D?`3O`vJ6H`vHsr=HY$A>!=Ci z5DUNuNGwozv#1bf;$3?eY+c(v*73cIHGC>1X%YH+zF%8-+c$lDYGOESev#U>ZJEQ? zH>x8CqJd2sw0kc$==}$FuTU$-HAH`J!QKNiY}nXxp;L#SU>%F$6CwwDblfl>K4ETe zuRoyuXZQr<%YZ+~cy@^O1Ha?>;1BD6vCg6bW1H_BN-R(zthwMfnH)D;_YrZchjiex zJ*?%y8s2%F<43=*L0{ktQ)Z``eu8$-^R^~0LjS%@?ccpd+jgd{Z?bLO*nDQnzW?aq z6t#Kbt7_3t7W(x{#b^7DSRjl4@Z%FWj$n+yu|pY)5BS_rzjJ_RhU@W7!@H;voD;xz zjwBW+xOtT8Gg6b6>V5&=*y)rUhj;Xn7N5dAKfblW@9Ow|TPN#xc37Umclx|*{nKIh z@DUMd7{8~%=1(2kzu^@6_*3ZDZ7{y~#`u~2eWvXn-nU*IJ(Qq!Cr?*VBhFKchq_?< z0VQw$e*A(NPtZ?r-huvra|v9hYhr^^921zi0k$_Cw*N!iB=0&xt|i8^Lx}~-wN>Zu z<`UNas`Vf#W@cx`{P-3}T4MARmALUYm9SyVse}zi_;}2sz?;X?A<`L%~+?;;oV9ZJ6PaNL2@g&OA zv-$zV{)gh##?ZE>ukZI``&nWGlp9~bbjeVR6)?Xzzn|Od3+(3&rPLSjU86L{FPIlt ziM2w_s2Ruy;+tmT1M+7k<@%_^b-%b$;^#C-ik(?!^NN0TVxqpUyK&w-bvDd?vG#`9 z|Es-j)?>BS&TLz2-KfG&${phb&ej2 zYqEbwd@Y`-m(9|&F~A+ z^bPa_CyyRZJh?MryjncWea8BIU)%S$ZT!Jv_yRt22=9lu0N)QRrE!6oALO&b!+1vU zsyc4DKD^KSjG$aAx7=Kg4B+{YCmi3s59@3NOvRe=91kpFK|pVJrU zxBz1W_P1Pf!1=>c6c_0ELADKZgCot{ApC*M2^3Ms%i8If6UuR|s5*R$XHR(bb7Ci) zbLpmWRW9E&?ySq#{ZgsU+Mg@cBQ}hwTyxE+v#wY>x@xnHV=inIJE8jJ2f}X2_C4IZ zI2nAa6%aMN=_T6}C!L=d`9{0#vA;~&kuZMt^3fOkv3LmP{D%dkmo{6^t37&r!1)3^ zQ{ego&K;Jrn1Hc>nHyZOe3*4L<%IEoe)f}>%%r^RGk~=r+V(O2dmhh*r$Y7<5Eo8` zUQ9>dFdOqli-FbH7YiiV*ou_jv)hic6g)pqTsl1P;L_m%yMaVJqhE?~@hrr{(-#j3 zn6_kSz|>{KD*d)%MCHM&Mpk}r#fVDv7Y#YL>Z)IBT$&Qr<~*g+{l*)S&sd)2L#nh~ zHazgzs9^!Iw!QiB1Dq2)GxLIZ`2bUHd;!M?^D#bPzgvo)Cu$!6dG5t?!TYGyd_Ex0 z2+O{G=XM9?8xrXM?}Y62yb$}RoZ!?~lMf%@!n}Ouni`|;xu!!sr*O{SQNsfNTt2)~ z!m{B3-QXu)TsgAJvm1Xo{|dHw{mE$Xdet>g>{QgiH#)7X<20=f-|N4BxocrZh_8Gwc zwbS;s{%7k#JOhfRJ;Uz*2G|!kVb+nDHRj$qWPJO6;UIS!^qJ#wU!20elYYSc{>Sk{ zJ?VOF-!M-y?0n&hk(K)|9bT!?+EM3JC)-g&1Dj{qzis0S2U=<|p2aO0Q3XCI0Q2zJ z9*XVaTpv_|{zAtD@LOD;%ymZeyS5y1^uau)1i`fex*x!tz_;Wb-zj(JHa_Gr@+*4` z1b6k$^FYqMZGF-)U|zaK{hZU&rPs*$uBU}<7qstXUrx|hoB-$_OdaX8cf|gwONV

-m7;XQ|EM&#Ha#!_>j8Q`Nqt(JCSGRkd`~Meqs5yhbpyO{Q(dnwqfz z=L_fdIpcmn&k1mRg7M(6#7W*YgYsR0vS;HtwHV)-_r}yeS*jGCU4^y+I4OdZ-Gu6QZN$Sv! zFtuuY<1*(1cz=e|g+F=py9kE!{K%%5kI7gs1RpRhak6zDb&3BAIVYWx{bhpz^S`Xs zZp(wXf01qbjPY~#0lMEWaohLjL+B3>8+hmcBQe(B5i?lr*%PNaeeqxQ;J>a_58i!) zdf={W)rW6Cu96d1sr_4KV7=fu-g$viJ};>KnooRT`~c?)`A*Uqe0Hc~Ld*ruTRYn8 z15DphHnd$@>B|7(I{kbX&v~C_j0d~VSKQBIIcHT2F~2_>&wC%n^jHU=)=X`o{`wWN2gQ;$E~TBrB@-?i$?kDpgZ@V-FI-1ce_<^xX4`vN}p>(8bOvoFIB zV6CzC1N70Se+_}|8{h*LZW?13eqHpJ&`pJ&VBm@n_WbX$P?XMd<&xto&TX$1YaSwEu^qz0>|5d$1MqE!3+o zKBOLbpt)MUG+6D99e{ZX+JDA;Vwuky8Sr@l=U`8>574>-9}tpYzdM9ygEAjbM%;i| z%dzoS{k(6Ztvk8){XAwq#-F9ahV1@7cHWcf@WDj&+J7HVZSQNYo_O>&_3-`8)!+eN zt35kbsrg|e)%I;0Rm$>@^*cjlrt+^!<#j#D4M`;>bA zsk_wA!@pO@4#(l0p%j%E^`Up{kK<2EyGqLE<+on=frW!S`klkm6bqbUAA+?bUsCr& z?6o9i!44{78xi~KIsd4itb6&q-?o1~=OMbE&d@hb?e@PxPF2>gc{D>d#}T zYR@iwS785Ub#V7G6}RwZy%u;0*8w`tDerkBs|c*eK22kSQ_v-aHRR9GrjW`zL#5QY zOz-HmfAsx*ZJW>anIH9s-?%wr&-(JT+W;NgFCBG(T0ip+tOI;nZ3?+pE&sKecioSE zPoQ+a2T)S}$czc*nK3~QK0YVkUx59(AHn+qe_&nEom743m%KY%%6tIE`+9x`?{-$l zdY}Dve3)zB&+k{5{-mVzw5at)aXtWRf%uG%&jq+Pfb#>~U)tXVEb6`I=X}bK&kNZ{ zm*AK{`vB-wD*i8d9jd;0ucVZjL4|D&p7ZN@Kg`oUWY7EMX#4d2y6?xFQhs#o%pZe3 zp7w4~2G{zPB!~0?oWJF_$@DtUl9?aWu_XHbxjSZBfiyJptf|5pT`9V8_+}lGVXkJH z9oyyj%%A;4S?K#q(q_tI-6j^8U2?I&N%kAiv0hYtj0t2MPzrp&GW)x(DO0U;Ap02G z{>}Vfwz)sba8aoq_m`Epr1Z5jGZyf^Pf&nyel|Vvb8b5Njx>%nA_rRSsQOqZB=do1 z*azU7K3WENf4ePwGRJ|8{r$%O?EB}I;yM5F*e{=ndor=W9QgWTewTngfZr6|xpKI7 zE&y{+vOe$(`T)p7+dswt?}Sm_-K`UTe7E-RlwGNN-k;}lfYR5`o(Y>S=rwgLfH@vM ztxmJyk^?_%?1(I-fP5zT;7YTsP7O4Ef?x&%j}i zzx~{QkX0M=GTJ9|e$Ou;uZ06$YUv2B_Z3t$4k-5}_#Z3y{|{=m{S4Tzp5&xI+4pQ+Hr z-01+*YzRhq_`pE5U~tJ|A?nWyCEbRi)Spw^i&AGvpPN&go%`7a?{+0Mr*B|3{qUzV z`Pg?dxSLyr^sJ=E0k1rD?fLE7mYlv9(2i((v_aY;^OpcMfJ=cY#T5gfu6n==z#t$J zI0*2273sj=!0*6e;8-z%^&Pcw?g&bYpVE6u5&b{jc3+fR<4ZHKy$YQ7!%VPsR_^x>A&bzl89dU^z9 z1Z}_x?lXGKV|~vr?6#@*IOq$D4ZVEliuUoTJ;HSvT9ucHe_*-;Xx1J-o*!(0;b_X-B)cuRY4LoP+kZ zz2D2DX)o_T%QXwZGtYN&&AQ1qxnX0R$1zD)_Vr>f8d(ozz0Ap;L_si^PTmeUe0-V z2(zF2m`8dc@H`L#Fcu&`rvUmT`pn#L(mu|Y)4#Ak1z6SopRRPf2V=! z@Mfd*FJEh-K7RRX^~Q78sTUq^t{#2R>mR5;1a$!CLSI^GnK7RmcpS^A>pY)!|Ma7+ z)cgN!t~$SWqZ;_tb!u#vW-6%P)hc30Q?-0lW3_Iq7n{a6QZW;}SU;|@TK#Kde7n1e zS}?S!3hIBgn$Z0kHKNnCs?Vp_s}677q~3k8xqANbmik(}4)GAK`$!wF-^g#9o%ch% zr2dl!-UI8T-MsX4OZD{|H>rM~U$1`Ye65<%=W4ZZSW~s~m&R)Cn8qp^ZI4FVc`w`- zIUH@qJ&x^ijT-pn^{Ug`H>%hF-9pz(KgM=G%68&f+Q;R=tG_n#Jl0{_X*hWHu~zD> z7n-ZD(B7UO-=KzexK{nv^%^y^@6{@Na8nfpPFJCgY%AML&e?t=hZUn6>w60saFrV0 zt(hA9&2_5l2REpXU%FX6*S=MTT-)A{{(}C*mbtTyzIiXN&<(WtVe~Z*-G5s;V04Lk zeE^6776PHbRA3x1(awh|Usu3_(MjdU(x+R3(>do?Njg1Hy&V}1t^1bhPA1vCPxBMvMxv68SDsZpyI&y z68N@Z9j{jJ{^wfw%9e;N@ZB}|0e}5D_wn8sliYvL?OI1(c>Lyc^g*io2lckYcRY>z zydJ0nTmn?~XJ6P)TjX3>HK0Cl8$i3A03-n?0Hcqz3&LzWQ?q|9${zwUu7`XUd*rsi zwv^O9$MyAC!`}W7DeukrG;=Ssb>kB_ZWsYP3S7wcA87T8q}}lYEt$+>^FOTa)Vlg z<7q3@A!FkQ=G52wc8Ao5UfRGhJT5Qn!7&;*PoIx%+CS^0k8ob+5cbjEu~6cg2T>pG z$Z*1Tjzhov9^x1iXZUL$?T0>7l^f{)z zhBt2K#W%}M`zb4)%YCfR_y%5QPsrseVsKT}=aX9M-|buIab&xPyzw8~OSJX&_3EXk zZd5%#s;j2=x=5}0B`_W9&s8e0eTMZI^%ZGGJZ$tA@}kYtCbQ@=%bh=zbH46wpbxfU$etgSn4g$bSdu*u}I9 z+q|bN7~l0$U03vYS55T!sqFWGG^X$aO8W!&gw5kEl{mQyNM*=G`GI)x7e1{=?zubk5{WNUuT=W zHe_tf=xCdJZ&fco*;4nPTM<*R-=?0M`b}EYwwroPN}s}5W@m5%6^!xCo6o_9&=$xp z!%rFCM8EsN|C*~Qy_zY;BD8Pz&1@&zW$JWtvA2ZyHrLu0#&*vZTB`Wxt5THFK|QrD^tzk2ll68Zk!1|G~cYkLO= z+8&wu!00vYL+6d&GsV7(0LBIJfbj!Po9SjB$8%Xnsj++Keb{Z}z3Z4ADdz`yKlEu# zhXb`7$MJr0^kcAd9aA7}2<)NV1KR%WJhmwh!~oOIfv<1q)hp8}sK|FfSt4EtIz z^eXkvf12w#y}@5!r~6{so9;KzUli3=igG^nlWk^7J7Hf%pTM}}qnDcNc|?x8$s_yJ z9vCAh!KP^Uj48~yMQKBR&Nc01zpDM~tOkgyuho8v;}*tKoGWl9>;s4 zZELyU9`kdpk~(H@XhXyY_0+Z*Ra7cs$6vm$uI>ImPuvWIko`Ze#1DycQ>uXsf-2`Ox`}wK+Odo^xniznw zJ?~>LpkpSa#)swkY{GDh^jhEuK>pM1l=%$%-!lDt*ncDFmA7xn&>h;94fb0c&ra*z zOzYnP#I`KUIJTJkp2F6vZOm>nZD&tt12y1_>-Bs%eE{bTj?9CffPc_&?ipyev1R%J z`XJ7WzVJj#{j7uYhN&|eX3Tk*{=Kk#l+1Yz;AJ7(`6T4liB8Q&C*dDg7`*^3# z+q#ye|4D}aT})d;TBQEi*Cw#t65zZdZAX8b5NVLKF+XRKc`x>bBWh5aSl%(%Pjhc{pjznPwo zEG;%gKft*H&ebg)*;IY~=1poFVgknayMv35hmw&~1Ni=in3KIo$N8L3Vt;SzS#GI` z0Y0TJ7L>pxa!^+L#kh z95-&AacO>S->HL)0rcE8(jvtGPMd(8Xn%sVF7Pkgeu}Mr=e0^QkG7k6fIMS;f9(LL zrvJ~?{^=KX%&L}e`_D-a%EJEQo*ygDdoImw%j-Vr1E@osPoh5M17;rTW9qKaReyS1 zn0>Gv^E|Co&-dkaZ@34}aTMBb8BUSr8vj#PJ7!g{5cZ#!9!q)QVqH8RlYF0p^{eZ}Pa_hU|Q zcW@0n^Y`Qx2N+#k2i?@)3_hLqQQoiRu>V@fZ^?)Kr=t%S2nW=GQ#MW_CAggi4m^XfV?y2qTkJeT^P4< z-r4*7pU(gV6`6y*S>$hQp5wy?^a1n-Oif?m*C#Lz*b_n@5SUvWV4ejA+xG8*ZWil2 zKz?kcJRbu--N5z0KY&|-*1p&_JI5p>y$JARF@Z*JfxnS8Q3t{J0?R~7w8Uj27V|czQ=jJ0R3IqVp7Vt9LNBb^FJ8?Yc4d^GtClrLZ zd>#v3(lHs*e*y|fw^QZ|ij(#^TGpwdRja@jHUbJrvs2~^f>ZYKVF|O&(Yk|cyl-FU zR3X~vyvKCd|81lS_Fo6r`MZE^^SzIg_W3;x{b=9MMQm%Def}1tm$P1^B_2m_n|X-~ z&yEB4hc(C&!|a%K>Ft<17_ld`?s3}>&G5>mvx(Iup}1GJ4NfyaR(z)ipx0PU;_Fdc{hE(g{D z!+}cyp7%8Hke&Yzn-xE^N+sAsG_VRd57-Cv0BQq=fR})~0NT;@z^A|gpgJ%f;Ca=6 zL|_5yFP0nrp#jDaBQbx7v4I{7 z&(IuqD z{uu|{0UQEo=dS>YydWJ9gxL8N$oI4J)Ki|<0$~0{?vI;!7VUpCu$0?KcLN;&4{#88 z6le<2)@bLi0sHJ@M<5?%=VOpx%shXn|2_LU)scP#q}uz3AivtqCn4VvI1ixh(5LZu zw(nx#ZRUOKpY729;}$9NZGh_l+J8;pzrbGBk8~Wc#?CKAzCXb64v+26{ruq?V}Rp! z{x{@9?Yu94|3cZ-0R1l0wt(S%6!QCkOYCz`tNrtu=C=cL8nAQBBUICNw`102H(~rg z+nyi59AU$>9YK6wz_0!D88zQmBbax>>^F0U&N__mh{rjDfLl#_kk@kvW?RyNF#w(N z`t(fuzZ?7h51<~_1l|PFSu0ZZL$mGtD&)1EBc)B<1Keuowf)CuxBtDc4cb5b!eO92 za4kSvyBv5OIKcXmjs}+5dHRq@=J~@ljQz8Hp90%}K!EXxvHxV`85>*(u>XGwxB_5X z>DS(2-jDrr{7(PGHa!U30I*N52fP9p|3v#=&-Nf)4h#f1-r=#@FWPOT{r_#}=|6Mg z?|zhB2eALY7T~;rvH#J?mkRsmeekDaf;mk*C)PZ!{Q%w%cpc9W_tOu+KcsJ;$@d1c z`2eR)=a#3v6J{+7eS#TB@I2Yq`*8yGz{Mr99?Eev{4CH42?EiDJ|NBsO4M6*6`WRsB zztr^qzRI;L_zKVO;Wug>+BWmj`j{h(;dp>!0jxdA&BhB;M!RRsVB!JhX8}#wE~JbF zv_JA~r)>LY06Hf24{Gf3KW$#@-@mHlxEFJRdX6x4+PRlvZg81BAAos5d_x4^5%Tj) zpfI-YJjcWaW~}f#?EY;wkoHeMkYi(|APWOx|5@h$#Qw8rN8TG)TdMopq$y`#0^47o zY5SS$1yiP;Qz^5Z4LX>jpUv;P(XU;+yo9OUeh(C(!;m7GOREFy9`MI3T;&vg{H27yHkm z5Cz!4|4`6zKh_R?Y|sCnaN2%mz5%|+T3f$2Y}=@BKVDqhP9IQ-w}R`*d_XQT75f+a z&qY0QEW&)hwySM3E^f3pw2oN=knwInrtN306NaCFo#*>IVukey#s>^x<6-|21LP=0 ziU0jP|C9N@T=c~h!M^ocOneVylx^!-;(lNI=Qf@R;Cr-1dM=nBpJ3($c?!1n^&z|R2J z)p9Lf9N=&LZyj9kGl1)V&jLmOdQCo3uK(=}Tmo?I>@xt@3$v|UH>lST`-%Vi;aXgu z%r>wU`fJOO;iuhHYID=;7UIqWhDF!OfKzMr##51UExV4V zkVXQ1?EU6EzAwnUwtxHmpNw~RU>nH^BAv^#Q&&dl^9c+QB-J4hFQ%BV7mh zd;f>;#=Q?D*zM?t{3<&ikNoEV{Q~_1*VA&{KihX6@CNff_MeXHbhoe1Hu3!*u223Q z;QLAc22A_7{@=XU6p4H<`@CbwJJs=YcgMg8O;rqB@Oah(00kawnhSJ-*pPHb1R>(nx1{&fHNjSyZF^L`_3n=a_s-?smn^FsSuo^8{s zdbZBIC``2M|F(GycnjzN^ag&k!EXh82k?6Wj{`jREGHM(=KDZ0@9!kVPaZmD z?4SJ)ZHD@H5;zE?1IK~=0Ckae#$%X20{mg;SP%(HE2 z0R00~-q$YJ|IKWxz5ag-uERF)`Ue2EkKY7fo<4y0VcK^Td5&RtEZfQZ;<4QBz&iQE zHTnbOl-JCQzf(Adyz^L|LtZHZ=2roi*>#=~`{%cUc>OiMSZD1CtsUiWy`Q6>_t*Dx zAL4)X|G_nN9Lf5UCI{+wcww(adY9LnZ>L#&3a=x-oEd;_oef+KF!m&_0vb8;4UunZ z!{nP_n|X6AkLSB<7w}5S!RNUSEUeW4Xa+R0)2om+w)0JqHnH>E$L*^D9?RoQ{u<=# znAXE)F9xm!8Usy%tL^+%jy(6VjK?(d$!DCmX{uYV7vCFkWuSdcXZzSTXZx6Eo7h%o z`?!zWZ1;6Qb<1lxR`vKej z3o`dd``7UTzA4z1?f*Uerfj|p_N(9FLF)TWK;5TfKU01ykdS`=(AIzXe)Q`^OsLdVD89j}ejT_xCF#p{4Am(Z6tBzc`Q)d!c{59H_Nvs^>~? z>aLNQ_b?Bb@+|q9C?j}YZ9sqfij?hNQ1d*X&VGEe3#fs7EpNVN&8+zv*yb_19LHtk zxlf;mxW6*%jGZ3n!8M%MWSgCBMLV4B(KSrDB0?YvZ1o%v! z&la`<{Jsz88t1E++jLw3`+d*0Y++v%fRl9_T;E5`5;RzvGFN_R;~M zUpN3f0&otDHd76F4bb1$L^>QW=S3sG*xV27*4RJS415HnvJ5HL;OOW7NRxmL0N3R3 z`P}0`b%6GN0q_>{uz&siU)cYZxCYyypX1y4Hb}1p=&R@-{tN8kwUGV>thV#?8T|m> z7oRKW=l|Shd3pI^&cCSkkMTl1g_!>Za)Nk5`u_5w9DeQt`fu!Cum8jLUV!#r31F<< z9=Hym-EnQs>%ak4g>)2P&f~g+NOK9;t+D@F$bSlK0|J5JfVN4b$pD|tUkLCy{Zqgd z0PX*B;9chZ*neMKi+0R5JqX+YFfOPEyaMR&{~;X*thd{`9QlDj6@bTFIv!xwP;k9ood_+LS_cW;?~fqssOwL}^7L`JrfmLCRS2gd&OIyr39{=We@FF^Zm z2k?0zZLK=M{@fcF0cVEX@R$a9R~&;I-1TAZ_E zn;rn@pJ>x{fR_P(_RrY=N1!rLZtWlTs_lRK%*zTh|F56>Vea4uYWRWKjdWe*N89C2 zd>Mc(i2eJLQiiuNXRqV+t9^_P@rq|2)6@;hiU}r|>@mKIQrNKLOJBlZbNu6Zp9 zA+Q3ZV*lmS{{LQlhqhxp%Nt_bzwaC%w)M0AWyzDz((i)enW5Nz1+aPNEsFh@Py5IE zA05ZzJHY?6-veU*Z(;!S`>_4c+KF3dUR;OzVBQ;a>W1XYKLcX_<x*f6V&Y z5!h$Wi$UJs`#)UI`!TSE4MsW`Fzf&M{!d5XJb>RCb-w>|5w>$$|J#do*=^$cKV1LI zcY109{{zhXKV1L6#y)l_@_dhx>zd2$`#-!_=kMtJ8?+C=cL7H5y&k;Jvp99yd3AUU zo)gGizmu#An1?NJ{qF`~H9-5`1M~)(0DS-N4S+Uw3b+N}`?LE1zH2iP;5YB;0tvu; zL!q%j1v$BJNcfE|yd$V%0#hbw#bp5Y#Qy(HpgYhN z=nQlLy4iW|GyA!ZWju!YA8fF^7x2RFaPQhN*zK(Vzah@PpXdy9^U3oYA1vd3mh+q9 z&OEojh5gs0gwX$2#Wgwryq>dtCePHgmG{H8vW?6$jygciw7mQ@CfjUwf@gv|f@ z*^fNu6Zt=W_-#?<4+H%FWz4huIKcVG0|4g|dG0=d)m0x(pZyoD1;SzV?2xe?zpS!aylx z0JiG1f7-nMb~jSy+W^-A{J(#-ftLaOePX1(_WvXH(Qoir{ryj*V*jO3=F%i#z%T$C z^|gQY|D0bm_J2L{jP2_Hw12%m5h?9ofBzRL`+wU1Spbg}`!@tjDh!lj24JiH?B9j` zwEqVH_W${{|H}5UV*jOB=F&7_z%T%N75g`2NGc3eFb2f_E11CLc7*{417iOUG9)Vu zR4@j_{wtWk<#vSu2LodN4l*Pw3{)@%#QrOoz~y#@0S5zO{|+)FD-2XH2E_g=n84+B zg#iZxV*d^@Br6P5Fb4eCe?RQwI)1MIYYXuGAFlu7`#-M%`$-Yf-+&EvemU|#0et^Q z*8f&89g^EEy9~fyo$LSj{$F?7rcWZz^}p8uzXR2P=YZ{YIoJQ|?-L_k1eo`Rjv+7W zf6J~)NXsh_1F%*7jSi$&0(_r81>iS8*#9pDBJBKZr2MupkC_Z?1^7(>e*1&p2;h0s z0G_A6|A|!I|EoZ{B)3}j7=VqM{{J%MR{*r*T|hKI8{cl{cOu;a!~%POL}0U>k3-7; zH?R%haUYTir1JfrvZoT#;tI$BZ581E1>twV&Ic|As@gF53$V>&SkB{2-g(|7*nf5f zq)={I7!U@80bxKGD3c7J-{yP&j01`aJ*Fs=BuJx$0bxKG5C((+VL%uV2801&Ko}4P zgaKhd7!U@80bxKG5C((+VL%uV2801&Ko}4PgaKhd7!U@80bxKG5C((+VL%uV2801& zKo}4PgaKhd7!U@80bxKG5C((+VL%uV2801&Ko}4PgaKhd7!U@80bxKG5C((+VL%uV z2801&Ko}4PgaKhd7!U@80bxKG5C((+VL%uV2801&Ko}4PgaKhd7!U@80bxKG5C((+ zVL%uV2801&Ko}4PgaKhd7!U@80bxKG5C((+VL%uV2801&Ko}4PgaKhd7!U@80bxKG z5C((+VL%uV2801&Ko}4PgaKhd7!U@80bxKG5C((+VL%uV2801&Ko}4PgaKhd7!U@8 z0bxKG5C((+VL%uV2801&Ko}4PgaKio%rT(kCkzM!!hkR!3*9?;BCD=sDr-) zQZvr?e}M&=<$gKJEVlgJL1y!C;2qf;;Ao!ZkD?5AcpX0tNacR>b7il8fhp5zhinIQ z%u-%ETX~k^>*gW1co-k^_o zP(@Y=W-rew!7SRT8<1CdRvSt6Hrn~OgYyRcl;4p@d2MI;0%y(Md=`QVQJ#fBKj&v5 zu%q{y&cAt;XCctf`B@0et=wN(Mnk|-cG+f>dhIlGGh0rRxWMX=tpGb}t5mO}JM2;Z z%TIZ`qvKWmmZR>DT878($f+-Z5%TMZZ{PEX5r+^Am?i8TE^Ybcq z3fSNId6suDcjqUi&~qzSu;@GdoR_)Fr##iF+|jztvUJKbZQ+{}u-~$3u-xPA!H-)P zI8E@tn9znnBN~M42pZ5JWE9S#OT5FJtrW_y2^ujbvz+~f!v?dLr)Kfe*~{s(I%HhH ze|csDvX`TNM?aXod;!Wc8|c40Q^&HGcf|RbI+DE{#d(%z>WKgIGYQC6?(LE?2tqmJ z|%Ltzr4#c$@N#yDW5Km zPQa_5-lMaZHwYNsz}g-#Ag6NZr@ntvo+*6q9;3g-Rqiw&*6CY+ZSRFL{uZ?Sj*K(C znXKohJFQb6;9K4ykMn(secG?Gi9c)oDw}wH%Dd!Ie;?m+`kx^9AA5g_Z+TYz@GV7e zMgMo$Ve{D!Df%ARNv@T^zvfz=d4K*7lX4^fvdK?g^3O|u{NJ_g6$XR>VL%uta||@W zFrlL!D`2=_)nN`lmp75W!hkR!3AWd(%ywLJ5BTdv3-<)dghad)QoC#)UrN?8A^Cpm6Tz?Lm*a+ERK zIk>jvne~!&R>&vrv#0*os|V_hy2wc`wGTD;>HP{EvcDyz9ID0!1#5eS|n|n{8e)7%sI)MgZC!K&q+&;pRH07 z!hH~-wr*Xc5;sj%ODDEbvwK!j@cAmNdv?t3VJQM-$LI94wgK~D`~Bzlww_zi&$@d3 z&-||inZIe@TJAYLtN@gWE@aYDY&rON_qNpK8QjLN8QM50dRk}L_2!iLxsdaGAVR?> zFii(eLjGRF&pV0zr?#XlO~Qb;U-%zwENl9= zmJ9m>7Rfjw-{ObA58%OzhFukyuwiVc^(Jku}X@Wp~45% zRUxqZ**yb_L+<|SpzNs!S#$xmzXAQj%gY8^XY*cW{eT#ur&lMqEkFMZB*jkCvX5Ev zLzATFsjE`r(YGf?(6@fuy)ODq`qW+U~>P?-}bk5tc*jM>{S8s0;K9 z^bgu6K;|jXgV&Z1v(DljQwI=BX2df7S*VzMVdq-*acf3AoD>^$%p1>Xd(Yah+j@`; z-7uhTq$2*?k`$qKZeOcbO?yzyMGPM?AW(((cWKP;=Th_fy42j>E;XlDMvR|TFN!9A zr|y{8(&)iv=)t3u?4+-BY#=eBL(RACjMp{+-~TqoaIpD>wD;pcW-O09om->S-kmGefjw*0!M$tL(ZeZf+oqq?;=z`R8WE_XhI_JM$uN&177z8P$iW`9 z@FzF)1iH}&v0+cI{Tp9V1Yclu!Ndw$4-g-OVw~8Jx6Zf#I#J<$!IoXII=;u4ZUE-; z=;PD$xDLLYv3mw!JkpE|OC<4L4xhxV>XUoo~G)4CzcC3QDJ?-`nhlE zdryp>-Xtk@*6_qlQ@SN?7}ptdb>AcQ`!-?2nC}xePV9_%n;u(}7xdk~Giv7k9SdV2 z=fs1%m;Zin_X>4r-&%EO?^^Zy(XA?B$%pBS23l!R!z<-2d)p8A>V@$cOQ0Kzhj`S2 zfo|;^=nJR|MT{LX^Z;_7jd8&h)C0r?y6hIqX`6P5=(B7?cV^@r+d1~v2) z1;h{30j&##ix*6ss37-U7%%=G?+aW6U=G1AAI|$O5BY`meMSznE`c3{&F<-n#uzPj zPEXIaIlVmlfP=^%UN|t|VAP1p$ADc+hF6YRGOW_ZrNb+&iW(j;3Vr<7kprxDv);FA zO?l9*?Puk%i!Xo=4@J3(9OOE+V1T6-{Aj7g+SZ{HIoN!D_fr>mEc=N0h$T(`P{=re zz91d_K^o$KHz?Pc-&+BT2bO;w2=3zT^C0`7Hg{(HY~m*Ecj<$3mW|WKEANJ#Pg^#k z(gRV$1H&Q*S!&&+`lnK({-+YdA4V*A7JRwO>lccs18k4+36by#9A7|&h4lw|oWS!j zhuD=m5Cm@U{Hfgf0oJkz5dFx>YjfzR;{kDp?)6O zMj;#d8so_+E@_2AvtsxF;gRbe6H)aJPlsf7bEFHnTBL0&q*a-#>FZ=yU4 z=nuR)(90S`9hmW5`5GGzdBfYUK@S!=ZJ!)5uFem?xgA5ZT#;E^1*H$GZ zty6y;T%wkYI9DwhYL5*HVc)r3*Iya+V9{Xjc%gtgz&T|4f$ymUIJaEP4`9wi-v{Qu zZnbS+&xzT3pkwMn_`in0yq{}Jj9Lp zfYU2`r%v(S7$b7bm`@#`ZE$RO0&()~nm5~im@jKT6US_sX$2zgi?`*^cwhICk?@nn zD}VOGoCD-D0HkM7_P%<+=MDMv1)3l5l@c|`x{NYE)8oQ+58dJ_3`Tx+f%g6L`?zl6 zy;HX-d)h*A^!rYZOKYBUQ1k(u)8M=TpEvRTLv0%{w&0VVWI3K!PNw|3zImzV?dO}h z9&g*KP;$sgcC5Q3f9U(Q@5g%Ccd=Gd0VkPa{Vn{oOD!AWR!fKH6Fe5s=h%5}=llG; zuH&q;gz9D6myL8|t^&`ZF=s%VuzB&9YOWUcwO*r)aO@e02cbJ2;BufIPy@IKI2Wi2 zT;K=Xe_s2xx19Ux)7MmG+h=wS96hUxM+J59oDAxU6qrA-64vPeKV?S*_Aej?dsA-D zA6Qw<^TB+atB>VzHn{DtPTzgb^CD1>vwr4zyt56y=lk1s*2(smw)nO?d=TzsKqVF2 z-OB~}mx-M!X!gWe&$YYhJa9|ynHq50?8{9iJmx}xGNdf8 z1Oh3a+sz?V9WK8RX6OQ;)Pzk3QH^J<_J7dJHMIpKsq>z4%0P_1`DGcmermaqi=7 zTV@=~$=XIWB{g0!5)J?pAJg>=XvrZoS4C>^$ zti#mDlx@)0LHXmj_M@B=s=c=BQIvCllpGPDuE zx#>K=-GjFrd$>*OzhF}toRU`?X5T4nlY7d9vT(}f2)20~%R+#Ufm?toxyjzQ49Bzo zsSk7lSU>AzJ4_px{spW6hC%M1KmKs5SH^U%wrhOXOV!9uSETp(q_+C%jb`fQXIiPY z58SHm`B!Vz_WoPJ)vbE_-n(1lzFVnp-n>bT`t~|Cd*Ib-+32Qf!*7jM?8HVYesUuf zH>r_|p3qpW`L&5!JOb-H`!`dgzq?NT@cxbJt>-C+TNLYg;GWjt_*RW}58Vpc+^Y9K zg7m%rwopHPeLc=a{iB+yji`S!>Sf&<$2V5Xam~;luU11kT&F&IskyG>UbL0xvMyaO z(l+h$)F(4m{vefQiB4qAhYTNLDt?SH5T@4xNTOHbdZ{`b_4>)YPnx@Y^gtth+y0?z?2 z0iObcfF-~mfKwJmHpj5P2hbEK@Y)le1F#>^@dxz+`C7mRz+5i|`8NQ)9ykm3j#J3f)!@ z-ghf><7PFfM>Dl)d?U3tw7xoqHn1%`mu)-3x*hFiU8a8Cn`w8_)GO84&eh<1Zq#z8 zU+ML69X0pI^G?P5=2ly$TXV?!!*^$YMuhv)TqC^;XI57S<}}puj zZ>R=*aXsw0vHE*aU6j?=Ta#7> z+A)pQpZ5N}IL@5ouYPB}ye?(-=Yo1FWuGzBpWIOE#BRu@F!l2sp38QoKwnq>(pde4y3Mr; zQ>XL(c>dndM(|%X)sC3~3jEPtG{9M!&EHz2dK`c>L*7OVeQDk>$LBXaQ+4ij+?&6)vOM#cEV@ab0)1#ey-+Dr&-SMS_fl5ivqWvX zIP?K+bOG!G8UYQ7?XxbsVQ0`4H}4F({3aVW?+vMa)#0#4^$vwLtbaHRuv2amM^Lse zq;^vrfAh9!)f#P`a#_7?Q>)eAHlOUCT zpuw)-D{k5`vwAb0XX<2qzIAS&UcCvgzdxjIW8GFq-K@`Chh=+$Yc}Jt_WharbfzuQ zzJKivt@H5iklLRj9kVyIZVYsVzQFcn4d@?ELI={leSypL0eW5-Tm}H-mv93ffcuDI z@9&F4AAIZBIK}HHR!y|(ubpJI0q(YOk0bvt|J&#(AvASr_X!`ct=G*_qjrVwT=#mEiUNP2czG1Q}3Fj@h!Fo-dyw0+XlU<4PhgsDR zN7nro=fwj{f#m?}WnE0UZygZaxxMAWdGmqQJRe})tkdL|A|DHMqI}|}RjC9!$Ngpl zWL?7pyAObz1JLJZlM~8Y?g_0k1wH_M0%F1`IwsU(C~&z3hyYdrD}hL0GSCHR59oIc zjE-QtRQdz(r0*MPU*Kcl9pEeAL*P9-{S4^`>nB+QRs5Z2Lk?qr4}cGW_w4jjd*25K z7S-zZdsKtxmyfk>+c?Gb6V83##-~U>a%_Ky^3e-NTD1=^uJ;wrCq4l_0^YarHPUx& z42_*0coxq81$fJ@hwc0vcpG4QS$_wD+#@Z}8V-z&+=y8M4$ZsHjWM$J9lL_AxE-;= zCin!EIJpx00_uR#1IC0-nEk(F|4iU6TL*L>!F*}@fgdCP{>Xm=P)6U`>6b{q0H_aN zLH>hO;=igu7UO|00LuJxfO6yZmrNo5{*eC*kbi5)cO=fGd`w*?rLKL6^05m>TD2g5 z%DJ;$2kT^A)P?VW&j9Wl89mig8Rv}yC}&gG*T}Qoybjy?EzprXBQ22powC^-Qp*F| z*XO59t6CjCVE3NT+L#aWPzN}cW<21FllDI9gwX}+f&OL*(rkXldCk+E2R}~vlRL_# zlbw=J+CFvQ3oZYI|D*l?X3OMbq(%pfj6Q?>``YrS{SU{vMmDU=)JePj4CP}Wf7(Cg zPgy(lihiIIKs_Lg{Kw+l5A3>FH}!z+W}a>BNRUgUg_b|hKN8Vg`vCL_%$ajEjs8urHvD z_53PQr|eDsZ+k!IkoEWNkm_srZ^7x=>yUpxmzJ|HxnMfV-XZ**$)5OoFKQ(>oXXyV2tN4Gi|7ZNi z{+RM-n$hd;WX#tG? z#{i7=DSOsSz18(0WqiT-r4#u?TB!d2;M^u&-yd3MTn_Tr`hdCAH)4LX{)Kp8BIKD2 z7&|vIXLYTTG59CzqQjAO=r?wt4&ORsu%G)9 zQ8v?Vb12#q1F&7rb~4X>oOAftKDNN}-w{+z`{jw9Ef;+MrmVi-%nj=21`4s@e|epQ zbFbpuUnPKZtp5NW1RetJ1UUDa@qC`gm$o1Hx)5jx)boS7*w+BKnC(v6{>a%X<-V%G z`Hqx%jr7#}t18ve-Jpu)n%K*A{**qJFREgn#`vDDb6KZ4@p=Hxzd)tlZ|Y(FRqgGn zD*4_E)Sf5w_ngp zUSsR@3;cdB!Fhe?0CnVy`+R4c3YySKriH9W_yt@ z(YOhHzLx*4keUrJ1~76rDRn^SF;8@C=d9{=*rr`US8{&U`5ZvY+LpO4<8h_+2Rm{B z?p$E{3HpfzzyyH(@I+t|Fxk#egr5&zGr@Z9ujNf!!EZ;R-<}9e044*I?Cr5g$Dw?M z+R)<4brbcR(`?i+-qd5~SvU8we*N49X>RQ_Wrfxe%<*XX?+LBd0I|N2yGbd3-S@*c zL{Of`>^XwcD%;{{7dY2^BE1wC4RB8P1HjA?GhXEO2ata^*#Gm8f9nGaYYl{)&0H>H zMa~(U?GI2sO0B!GHso*S8BJ`+`U%E%?*g2cW-M7~x#pJ#J{#e&=m+XS#wPC1CV%+; z|M57C6$%_<@Vv70GrS|c1mO6K@}jI5Z*%-*(k~$Y{*eC*w){sx-W`t)%7*D%((C(`1n0O{lA_Af?jM$o>E!I zBRlQm%aS|`+E&9mQrbWLKF3~Wj7ZsM%jX&r!^m)i0-egJ7buA#!GvS9lmwaauo$9u@n58P`$ zkX8u!@0;CF`*isBUbg(XF60FBka-VshGzj4LiW5@ANkY&(>`gFw0qjDNk51E_w(`p zoFAg^H~oN_+xy(d{=fIBi~i-b`+wdq>|4tg^T4;$-XZtDwd_OdO#Sss%k|fy+e*A2 zVmnI94{~tY|IgT_Z|0mEK{-(un0^fT_jJU6gCTd$;}Pr!7y~lT^#dP4{-f>qk1+(F z+tc^6Zi4Y7pGh-iEXcX!)5iOW$bafo4g4!+}s>whuzEy%gjB ze;!|PRXxaf5fBE<_5t_J!JO`FtSLDcb2=~JJgx}~23T*HBjrBMIrJqDNKdQn;aQ)) z9{PJX`i0Ya?K3TRxxQs#4CvzeK+Fe-?7jBKIX2E05*hPt&TZJg>(6CPT=4I1*tvnr zk>@^c>*pd!-vKrN3xUNBaE&SVtp@b-C!`{Wa$=Z}r5AVv!FmE* z7r=eLmXq6-+prmcOpW}1K)wUOu_EUN&0I0}ajuBqT%y>1Ino};)5xFp{w=_H0*(`z zQV%)-)CFP`Ao8ym@;7rtBL8wEZ{J&iJ?CWqB7a}9%Hg(;{2AwQ9Vlh*`~C;x0`dRl zOa~xSWB-irDR=hyjP>|l8P^F=A2>E7h62+6mm?j3JdON0&YKTR1*Y3zeg-fFm<3Gb zts@m3C?`4qS?W1kToVm?S#|i0r+v;ErV0HM_HrvO&+Zh$4dbd5M+}^g#wo(i95gqIu9bMiU z?y$ElOMkU1w$k?`T(QY2j^490OZ8sO?9rOX2+jsbE*Y>-u+0$(z z>6x|bT}oNk>kR+64x@>Yna6t+&N$@UPC*Ts+uj?fS*o z$6eNc&T>KEsooP#rgeDtP#VgPdu4d?>kjW8IMCq^+>4fB#`bY9#g1*=!i;USgcq>4 zJMd2QHtN^)rB>I+^ZMty(74pvEYAF8Yrm9c%;-bA^s?}*v9uXi$Y`&_Rq%#Lj7DWCG=KHDeRUdQimw%741=(cZtzSm33 zXuIPgk}Y`#n!wKQ1UdpPs}BC+cc=asR>15Y zR=}K|mS#__I{_;~?awyeo^zf+>V+f&OWeb<$1@CCR7=GUC#G8 z<2%buKIZi*J^$M`FP>83=Xkbl^WJyNq7I&<=*ib7#m;;ud2{gSq}W-DljFjowOeuy*7{xZjV!#U|)MI`*rSg!w8paiQ9hyhN=EdQr{p5vW4DS}Lr&e}Ip} zKsfICW7tANbFU#?wN8|(Zx$s*Pjl}&{Fl~sjJ0mtwHQ zihv;9LY1P%20P#X%)JW;SfkIp_p!g<|DM^I*_m_Bl-)ZsXGYe|v!KawHeBwsBhGEI zQUimioFQ{{R(jOU%yW^qKp}f%b$;G4>4^6yEYx0Lk?XZs_|GB>Tc?&0vM?ESUgr1F1?fZ9LqL?H zU_^R=4xUNB@Voa{T>kVE+XtRI<}xw)pw-Bfgr#FMPwyO6oFDz|)v|MQuT|!5xLTQ; z@P|k5>v66EbRcrMNq&y4N_I$tL{QR4%mxM5MF`59bV21_2XdVtzcSQ?k)#8}Q=!jn z@V=q2r*Q?LAEI>8Ke>e13;BU|=*L$J+3~JIPQoT3HEyHu$H5IkV63ySF=3PH3;3@& zx~nxy_P4A~+NKK~h-&#|J=CG357JHCCIyRHUt1^Y=zwG=J@9@4JS-tz@QzT%I6ZwG zAV1#bp!@gLJc&}c1J!3Ol%*ExH&N{x#G{@c+o@gcw__rkG5s4B?>UksZ4p?)7R0S1 zcYU{9FXA`fQx7CR^_dJjIm$X9`ZTYd^VB*~fs`aC3AMu-&EW%N&-zKO(xUJEFJ;{xC)xbpI8?K-UAKvAlHK_q=RjX3{)S#|AzSQPhM$Mj=Hi@{D-|FG<|K1qhJ?- z_ZPlR@BF?+!G7PWMv}XN9p2VBe&2#Nk8(fs5b-G;IZaM+&(j7yvK{GzqJLqL!~+0c zr0}(Z1bXYBlQ59viE?}DMn?W%qze4`EvLKwyO*E~b_ zgBjRe-&c`K?qP|M0!n|1tWLLB^v$d8G?@ zHvu{UZAcD)e+qS?5|&B<3>d3w}cD9B-jG>wv)W{f(;s*ws^7@#BlqzSVuCf?#v0BGOE{8f_|F(}3LMSBS7P z`?^VP)_tY1BL_*lSH2+S`dLWjb>dT8y3g~s;OUJUHAr$<+)p~aw>wX}Zd^*AryXU6 zvx8099(xmJHO)eba&5s<_9{wqeT0t0Zzj&u0{;XvU^{Re(5Eoa2C~ck2;==Is3B1E zjdkWXEyHvBg=^^^A}b2%3?9tb)#xtlYE&0i8g9x8LvWsLJrv=-B+QIeM47T{h@0bQ z&gm7zr?9&5>HbQ%8M_{%jz?)%;yHT0eq8yv(r~ltt5GI*E(hvWp=|DCcnU1tLs&<$ z_&c`N-n+6rmlJJRN%Cl9B=>#)Lm*u4Kb1DqyKx<4c#3V1c0TA$oZEY&FvR?JVX)bs zMIq)_ibKt>lxTqSJ+Bvsn3V%pz&D{3{9Z*pxLOu&URo!9InIOqlj3ROmQnnIV6*Gc zLj}bnsM9s8KwO*|Y>KmEImj)MUJ!>Bg<7y|@0L|*`$>MW1bqI3WWDGwh_>HbDBYJC zYHwZMNil0e@B7M4&&U_)Kz0+&@KlOOw?l@9*b(Q~nG^*Z8|C`9eIeafe`JQQ{xD#8 zx=-_wxdCnal|&i8TO8GSWN~EYVW6W+B8^|q^fefi=G}a>Chmv~AN>ysLOb>?iRwHY zaR|fU9#s@(^kSN~{yT`r(@pnnJ}T3<<&dJ_&YcT_I&}d|h~iAmo<$)h?*i7)#ZjE8 zDCPPZ+(8{B9n2!0!LJTc`NF*dxJxcM>`~|`FZH(u=n!BxumNz!*^@g`eYM9{B$)n; z^C&lA58{o$j`D;q^G5PztXuc59)Wc%nd=%5TbI0soXfy00sFqqN+eQX`jvnYQ>hHrCz)*jC1 zeH&->tpMn}-Z`f{g=OdbbiRcAi*Ozel(LH=|Z(uT0R$g!G*vM%JQ&oipxQr6m*^{&QVq1Om!vNo2od> zoVU@!kS?#_zB=oG9_c^=ztkTPWcPl!n``v&*!2K>@jeptp8(0v&lraMOVj*xsQl?X zYC3;{U=10kBWw!dk^CeZ$-e~hk3krnOGNU|gZ#FTe;mT*o;e`W`NgDH(gUU6D8B{4 zow>$4*aTEGVNVHxfho%3%t80UMg)WoB>>wq_iKhTGI zSJldI>Y$PT22s2h7En5<3tT_srVBcF?EX)kLhUb=2cXn|=L2^Kfa)x@-zBKW%kf_L z0p&amZGz68Sc1OcC+K16`GDr*(Jt%}2lYZAP@VsTasbr^&u!0@6o!~^I<@s9UC&-Zd*$2KVU%A!!y zZS;I;c=v~DKNR;#T;Nxhza`w805`xD*oFS=2lVq){<{HJzzu!ChIIdC@1y;%M_XS7 z*aI$z`!?|d`cU#yT$DG@8@hNA-v<2sPX5p8g3P)=bD$ZZk2CC5*OR&_(f*r5_GW-S z3lN! zUZC$F-v5C{~zdY0H50d{a-GBxjnRooI?Q8 z17RreyxdkEy=FB%@!zBYlr{B-crV_CXWoDRH|em6*Cq`#X`o31O&Vy@K$8ZVH1IeY zc=|gL{M8()G~0>fXf|H4Rc`@9+pE|hZQAI>nDW3bAGGmFIsRVjsBd}19MTHzWg1KO zHk!R&2Ftsg7~kUl#)H*+z#t)hPYKcmDz%DhWfN<|q-=@r2m+eTVhuF@nuzg;dpjkY z*@OO>uBJD#ve^l`*U<7fW8BrbBxCiBlwFS+tM8xcFYOc2510Vd>=R**o2IKt15Fxe z(m<02nl#X)fhG+!Y2b-yAmii?G5z>v@p#}k5%v>*`|(cL@Ns+2-0Z`uOGSAN`1Q0F zM6$!c+IViu`FF6r(thC^1u%p}q8^dF{IZ0WmM>ZD5Y&N+Zx?0G9UBDl(%kT%* zVm^(BkJ`;;r$_L)>+{K;WFzJQS#FVSU{-o0%gsK*PDU+cp=-5SFzn)B z4_MdENp_R%-(lFd%z-R?Eo(5^3CU4cuBYLSbMMXbIDgj1ChJ@{c#dFM=Llg{`FY20 zo;kR<3if=};p-Gq_|Ig|NOp}JRVWLx#~>Rel7rip#pPvLRfV}Buup2i;>aEYwn~Y0ZSkB$*e8N-wOu0d zF58@OIly-*%40m~oNR5LvnZ{1&F8eXa61uj=j*j@Ja^ZGkkYihdtDyDU0zrII{S@?~ z=G{T)jeKs9jc@Em5jIf@*ayMp3wA(puHucPUxbw4Z9{HtSUs5?-DAZ46JZZjWAg+% zBH8{c0XBhTA6Z8Z;-A|*L52v}*zt8Pu*G@gx>RRFy-k!{`l) zn}^(0u;Y@URh_U!2R1kY^K~1_+&3>{$2~20J!)XjMD|dCY_~+VjgheDqjU)*1KBu2 zu8`U=$>p#$Tp`l z(BjKcmYt0HjOpM!r`?3T);eU{Q%!b1kuEwc0Jc8dK8S3KG;V(f9TvP^1-m017UiPN zg6hPPZHXc@c0^=PM0QE!FWV=1*lDvp)>_PaxmK0Gy^6Wad2VcL)34fnG3ur6;D>BQ zh%d4g>Y%xASyvAD=>e|+UI2rw(UJH5^``amndbh#SQ)~ur+3waPX|a}jvgR6E_gxm zTH8|!cJ3|(0sGhVlr}7SL7FwmQi2^2>|q8-tLF5TJP{{kLwCv7p$F_<`be-3l0JEV zpfm+^&Dt z0Zs#>fVTDc=j{dlB;WMqKXlcn@H}5(Ilw9+JKs6GuRA-wyBlm(Okv|fAX^tR^*!uv zVDG_v9D1`v_a59&9gpIe!hXe+rF(T{dsg*fSw0rrhK2mEY0@C~pRuOwoTo`u#Kx94 zv%Ca$(O+$^aM)dsw?o)3jR9}35nrIZZy~pQk)P~;a<_^q`ziosK1F~VV+!ov|(NO8)-O|RTMXj)tz zVP5z78)WYS+&~$M{Ol7CZi{f4==R?M5+OVz7?~J6sO#WKj5czCBoOi286<`5WW&=H~i~POX-ZGe6##osjxPY>^2D8HV5l9|3&NdF9!TWUZYQPQ~^XoWquz<2IRx#1Z@Ls z1f0O98`k8{yn4uD3D%&lz*_uuC9y`|VNIshNe^))*5<8E_Et^Rgs-ej;NerjKi1-k z&PZbm@D1?+TBHBc@NV3VHMc>u?wDlA^=-Kodh`LWXMrQYCZGj93;Mt^pm=mqK0ptk z5AZ^=x56khQ2#q%{`o-t#h^nkM6{ihAO75e3*l`SgT8~c#1rAa09bN9u=x)Z;%*&A;h!=w1spAN(28H=ueH zz1Ni!x}q}R-_xMa0am~)$g()qSBu)i9Nr${O@2aqo&x{5Xb)uDM7AqqC@oMGo}qLa zlznMfSDrR>9YFk}PkNi4fejD$C-+~yC^N3@3} z)E-bi>!JTIC~vqM)jx&Fe4-tX1i1Y<_XByt zw}=9Ie`0l}K9BOfrVOYqE6#c=Md)8a>-H!dl-6-B0cHc%0Jm2HeIWmG`p<%bKdygJ z1HcJz0JZ>=G;;l|`ImJDeyJ>a1O0)Q0B-9H+MwT&pJ}2`Rs+yAm4S>Vy+2v?Hl^02 zfhG++V-2VmA*l~i!eLUHHCg`&N{h9S&rMq01zJw4xk9aa{ni#gG;W)w55D4?h zVpe)M_GeCP@W0V}sUXt)9_DFiPv$57{|ED^%AD+^nsg_lE4zNRpm|xrQG?JGf_8m* zpXA=Rzwc9zMW-EJrKjy+_L4IzFO*}y# z%DLZdcC_f?wKi@HWl;VSmBwBp3A_YjIBZE(^%t7V}ZYpAH*n^3S)28tt~y zJLbI#b9YX}a1qV}OsTlYZcChy1r-KfGTjkL@?c-=THIPP^{RZe~B4 zi^G1D7A$GI1q*lS&eqNA%NBgwp9MOp{S)20GS?-2*qm=(Wcyb4WN}-%vZKFRutVFr zvW<&+-dZ-pggGrVc7Nl|w_hDMYQSvF-6kTx;Uhn)-7k)Km^8+c&ruf!3a#^f6?vFj zyICG#QF1-TtmtZ#SxIH2X))%@ipwI*N(zE4ivPr%RAr=D3Fgy^%Hel8i2D^`?yVei zTGudl_Gd+uS=GgWmMqUlI3*o@o|o;wmxt^2=|B9gb^(6G&qoYYy#B^J;_OL1R7u

{U$3Iv~D8^4{;l+zqdvpkHAO zb~)yJ=3?A$KF0X0b3$7EfcYM4jJqxq82vEP&pFsC5; z`N{BGfidlG!6)rmWsPU}yg*)Hd)_}|ta<>=fnw}B1^G`w-mbuWfbR=-FCNIBk01I7 zBGSe_A>smz@h`~^HuxH2o>tJuY|JH5o;3Hu*P6hs1#p=$&dmEAP|aRXrduh^M;ZT= z(*nhqxM)Lj63BlxbiNe%FG}&zo&&uv1Akvr+MqS{3i)z3s0GcNV9zO2ij(c#OdGQE zx=8mAb0L2n;6s%8aOD3g$FmmmIAbZD%pi4n*G&`iA4=?V(YmhR zUv*<1hU*x5p#972F}^#I(yT}{yx0=nn=!yYM< z0PLIB`8#?JWBiTgfjZcz|Gn~hkiR@u3fdm%2Jktv2R-+{7EXEqXdLs2>i2(5Pk(25 zXmsJBE|{`0jFdg}x9CI%Eq%Yd_y zi^eHvSi%IT8K-!p-VqNzqYLMhh-c!KiCE+LNcBH6HAu`kAA6US^xp;Fth6TjzG>kb z8)rJSMH^sktgfsAd^g{7?W>dXTK?SSvP%8@OPTh$=cCRi?C4XBZ{`aj ztHng{uqbSuq8+8>I=`)Q=+Ge|zDYSh@y;Tr_9{Vncz192)R?a>oeCa#G0v?S*1KWN zqKhceH#7d17RNXU?@}5;D{J3}^Cop|rZk$|ddK3HU;C|AvhejnRfv;;z}pxc5L4+pN|+M{xqdmi{6&+4G48^mS=E_+ zJqlAjOv{6v&C8SbnwKBmVO|#I()~)Nw^{Mgon}(lhBjvhy!@(pmmZ^g5ijz^*jr*j zoX*=hK{~5%AL%;(a-`nE%MmRX-a2Z!FfUZK>QY3Dmlzw_tTeLSx;$U4GZ+1Y@8xG_ zPwvUTDGu!x+Me)K{xdVE<-*J$gGE`v20vv4=+8K^M|ky&moDEou{gBrt_uOr?>PCZ z@Mb}Nrs+W4r)0qRRW|&7GUmVlv%S#dMr=2;Vn88wB6Dz`d%HIt`@$JCN0`#sr zLEj~S;!XMPEdI^h2te4?+VHw@{||kfaxDM= diff --git a/vendor/github.com/docker/docker/hack/make/.resources-windows/docker.png b/vendor/github.com/docker/docker/hack/make/.resources-windows/docker.png deleted file mode 100644 index 88df0b66dfcf0b298de8cd296b793b9220c4a914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 658195 zcmeI52VfLM-^S;9dgxUo6akTtgq{#WZz3H8tb`;KDWNHduM$KQ)K9@e6$LBOqzFor zPy}pLL3-~cKzhILKbJeW9LeSS?%qA4!|l#a{mo{dow~Dn_2}&HQ^kid=HInThdzwS zW^?PMCYOZm&Hknz@3CD5O<>HoEVnYY@QX@}`ScvozJ0G=!{aB$PZ%CQHmGa+_CaIE z#}6GbDvq(qCl~h}*01l43av8Ernc)gGvTvt@qNmB1@&q7K|;AXb?VpfF7@=x8cR=< z@4cgR$BxRX`?(x#+r|;dp=fdTNZKnCu9?MF3t&goSA+MH| z`BcqB&2LOL`G~IHd8)o_dRRVNtUp9 zex1H-iINTeD`vSW5tgtxbHN)j_WWlx%FC9_VL@f%W_Do1Te6i0o_)U~ z8yL#U4eho&oE;BlpqF@?FQg{8(u3nKPbb$~V~HeYI*$X74OuQdM06R8F3A~)3z?>Oywui$Z-0RtL7UT=Tbicghm7A=on*rwsm*B4Z7G_6VC z`4p;$C3DJCX;bnh?+;kLe}A)&HU_*Ld~>^6TXV>eOZit0tQgydu?rL5I+WiaWPO!{ zmgMrFMfnVXSz{s#;jVywfGY4z8%t(v-{QiDYGV>?u*clhQGZuU;Q+PinQE7i^?HsP`HgP&aacDs7- z{fq zYklNZalwqt8auiu%Y0Bf=#QD@de`hWr)ih4KJWJn>ffbWa;x$3@b_Nmw0Ta;eXP;j zx$kc69QN6?b-i2t>$jo(re)2mywmAx--EFe!xnyAVacL{ceJBuN_=5Jn-bl zQSJAJCSI?kX}o(>Xv00b+O2KT!28pfzt+}V>9=A}l{L?~XxyvY^LmHz|G6yScaGo!&d^*8Fr?x1Z~5E}gZz(vU`B?+xtI zpw_W6AD0a&^~TKhyPMZ8Gpl{0x|?RpyRQAV-{CTcI~^X=r`C-IKQ3z0rAn<&|2P>t za-Ampvj#y=?VE9V@#S5Y8(*$^xkmEyK8uI68TV~w-;4G7{Q1h$m9Lb#(&UOdZhoV- z{l8h*=ghLD{Yp3e__=ngmTv6xQ}6edm2L9s!tj5lSLoX9yH#I*ex%Cqio-KT{B(Wd z=F(?Af4s-Mg98r#b))n3dDj)Gll=VOEkAwl%whE^FRG-eG_3NZNG$LE@0Xul?%O}5|6lz+{_&;0 zZ?5jtzj5D7KYIT=cSZl@i+kPbTea`7A6qVaZ~3rg@%>tV`_`bmS?WQ%p4rv2{kOfB ztbO^?);&SKF_qU(Zct;S|B82Coz`@Bowfg*_}^>wx6IG0w&jCX%YR%N-oEkEjR&mn zlk(Zn)|yN6$7Oyov4{7ydOyrddF%bNAEk}?L6$`{i?;+`kv@}<_Di2Ds*oZk+!ir0rvVNSgoUZ!aZ$`Aqx|XJ6lTE&H)IL-P9Njn4idt+U@i^?JYB>QjFED@Fd^ zbXzEnOg%A2}VE^Y{T;FNc;#E%^+p=oQ52b(D)Z^10E51B7 zY}cCm8~@n&<1dxhTsf{jwR+>|jc-N|8&YxDFTbzemGtShPv6}9=Ktlj()ho3B49Im;pg$?BA$&nyKw&(Nv+@fJ$3GlkYNK4lsa&{@uiJr|9W!wh{b&u9qBx*;;>B< zrl-vOU{<%c|7tids^Oxld(Q0JcKPXvY2#kJFy(OC;zjEh?Yy(>)K5vxl13!GclxWp zn|$@;mxCHlIJj$H`}4i89BS?R)#srj&#io`XZxPhhHbc3DQ~p>m*@qt{#4j~&!RUyc4?*IRydXS_FKz`LzK8as1fl|y0knoc@&y8VQ69kM&j?QnL{ zu&|!tKLtPCw0_j`hOb1PY`(e4=GJ=}4juIO(SeHxb{*C2vG9iVS2r6o>bG;bcT(QF zxcH*)r8g?h583zP*w>ft-pQFM99A>rP_sibkGFrJ{^LE8yVUPK<&)cUwl;me_V10qYj9=LJ9U4Yz4aOYXU;5& z__D&n*MdejY8A09Z2Bj2W{+#Pyhis=Hx9cw?CQ|h{#qF~V_p95V?OvL7r3 zJ3aYI)%W86+`i!SXFvbAV)v%l149oFy>azy@R!dA%w0b3>b!t4{wGfU?0@drpYNol zcRUp`@1J_7woKpHe$zMGBY)i*_ro9i|7qE}-?#lz`(^iQmUQ^chUot?#~ezk`o`Au zCby5CdVXt0Ueq7Io$4>^-~H&&qj5Q1bJl0HUOj91jm)_@qhDOrWAwN?dliQjd74@Q z8~@w%@6l?9TlMSn@v*0Fbq?5D{kQzZcP9n=H}miRe_!mmSZi#D*Dv45@IIIExPQdS z*FJn>aSHBRxRX}b_R>Q2*gHL_E@r`RS`_H`+7=L$jsfia3chr7xt>xC1 z`(H@@bz<_mQ&-9k_;tX-pCVo!eRJZ?$ox-_^xV7Ui!BRRZ+c<;0}ANvpQ@-1>5An>%e! zv_JFS(bmuBpFV!~^wd`pCoM@ibh>kfddBnv`E$}f4s5Ubc)`biz3cz(tuI?dg@<2k zJwES7?how`#2%>gWySoj^Z#01u|mjOnMZH^xBt-mLrdo+&---y=>L6}cQf%;<)2RN z*}3QO-~O1~IP9g=XLIiCm~?tlwY%S(3+#FMe?e30X@_U6P3wE`hn!C&auIV@AeJ3>p$QY{ZyW zHSccOUNdM!Y^$0BnsyKEKDK?_@DW|6jF0O(rANP*DI;UTV{5jK@`;=rK@p6On;0E5 zdGx3;6Cx(Js;P@Nf{wX!NX;Ofmx&`=)ojZX3>w(IS5W)-@o_;-8#WD&32hV>)I7Xl zSktD>n>T6@)F?EpNl0i|NLb_Gu<(c`O(H@=gY>3mln)(6j*lH0(WgTveR6cxs^;*C z6URn`giM+=so|u?4dcfT3keGk4-W}#6w;_sF!>0c@cNjE(UXJ6OsG{5i6Nd2aT8+3 zj~F{~MEsZ_9&hxJ_*W;ks#%jK^uXxLHG1rWgvLzJvm=TjlcUFmgf$EeDJD?&?&gDy z9$jR}2@^ZMMmf=!tjGi>^m~15Tu7g|3GuIvkBRH}THKh4wTj9_Y|Mjr#=bg!l#Wkq zOi0|QxX~130%bm|$SjOCv_KvNFO-c3my0d^#1TUuR!*U?{7SLG;wFzMCK$g`5KMO~ z6x2{8-G347$Hzraj33`GK7LeG!Cm&S{Y1?tepdz6>mD65VhnFoJsBBd8t7q-Ka4M~ zL-fSBC<@y&IJ8-CXybliP3d-wXiCS;>A)zG0-q*vbf>#NHhN;TC9xFpYZ^~{?1-VS zTNKMfpM~S--aVr0mVQ}ie!KfElllvvZD zEt-T6iES1f8yhn;xJhX2kl^r`A+f>H;mu>CW1EFGj*X5sl%4`$ z(cPwd_VkS#SJ>5XVbloSGh}S^_z7|RPqS4`!{6qEht7j%3J;_E6OV|F;ZL8a7=8oC z#YTn{a($Ss2O;&rMm$=bmLVvJ-za$TX-pa(H^$uUUl5hfSMiZdh#xv}QuO$^w!`QS zvFvZNAl||OO%sR=;m_+)Bb-nb6QW>Vq0zHVrz+d{E=dra>Qu>_2A2#3*|9>oRKM zY!r&?afA+PUwUD@Kt!OQC-kC6w@TSp!|ERrK*HHiy}m;f<<3S8#-m|O)e6CmbK zfy+D}ldHgG0>u0&aGB?0auv8tfS5l8F7td$t^$_{5c8+NWuA}8Rp2rKV*V7k%=0n1 z3S1^Y%%1|6c|Imrfy)Gl`BUIB&&T8{aG3xxe+pdY`IuY3XxXkl0xe8n+K+K;4mw7%W zSAoj}i1}0CGSA24DsY(qF@FkN=J}Xh1uhdH=1+mkJRg&*z-0o&{3&pm=VNjexJ-bU zKQ)WX=izeDxG}T_bP_H0%;}f-4=of8is{m)J7ZIxpj}L+GnS>L-y4j*8p_zs!L-J7 zK4TT*KY980PR#rF?5-W!_M0qYTJj{*@_%7K00ck)1VF$_0&*+;!#fCo00@8p200hJ)YzPDbAOHd&00F^000JNY0w7=$0SJgq*boQ= zKmY_l00M%000ck)1VF$h0uT_Juptl#fB*=900ad000@8p2!Mc11Rx+bVM8Dg009sH z0SE~00T2KI5C8$22tYt=!iGQ~00JNY0uT_~10VnbAOHe35rBZ$gbjf}00ck)1Rx-| z2S5M>KmY`6A^-ug2^#`|00@8p2tYt^4}bs&fB*>CL;wO}6E*|_0T2KI5P*Q-9smIl z009uNi2ww|CTs`<0w4eaAOHcuJpckA00JOj69EW_P1q0!1V8`;KmY=QdjJGL00i8N zfGi<@s_RMw6>%MFqyz#W00M4B00QDx)rrD@00@A9>j*$VT*n$IfdB}AfLjrOfVfq4 zqA(x;0wCZz0uT__u|`TD00JQ3Rs_1jKc$krD`i00_7h0SJg& zRVNAq0w4eat|I^eaUE-<1Ogxc0&YbB0^(NHiNb&Y2!Md=2tYtw#~LYt00@A9TM>YO zxK(wcFdzT|AmBOz5D?d~MoJ(60wCa41Rx-8Rh=jd2!H?xxQ+k>#C5EZ5(t0*2)Gpi z2#8x%Ckg`sAOHfcBLD$$9c!cn0w4eaZbbkB;#Sp(!hiq>fPm`=KtNo_8YzJQ2!McF z5rBZWRdu2;AOHd&;5q^j5ZAFrO2rUJ&`vGp3YKtP-XARywb7vu^AKmY_pPXGcU`YJ*OK>!3mK%4|1 zAmXeSKtP-Xl-6WRCX-p?9ezPT^aQH!Od3L&3~+Hq zzq=4s=9Y`oL~H4(!v2uOs$Ta?f0F3xKrr3V3VF?1y7cmn9c zay(PS2m&Ag0vP%AOHd&U=sldh)viK2n0X?1V8`+f_nf2KmY_lz$O9^5Sy?e5D0((2!H?t1or?4 zfB*=9fK3D-AU0t`AP@in5C8!P2<`z8009sH0hKp+4DAOHdo5ZnVG00JNY z0yYtVfY^i$fj|HRKmY_FAh-uW00ck)1Z*Mz0kH`i0)YSsfB*v)C^@f`AkVRNt9&p7L3pY#Q0yWR+yAlI4FG7s+x{iL8d~Ewbrk{m7Ojn?d#_ zS#Ee7+*~1>OSTMIf3o+<-XrTpwjx<>!Y)LWIaqLre?dSv0@ghLi^?VcV}Sty5Ma!g zAaH9i{B6k~3I@0Gh6DYtcM*QL_!yf&I^h-u1l*1Q1jOyC)L{im&`xz&T%wO?CFQW3 zi*uRe;`ERl2sniR`mvmX6_J7f2!Me23E10@g^_ge*D-Pk0w4eaq9gzT5oNU?Qy>5W zARvAM5D@X#5poCuAOHfQB!H20QC5qSGqv(?BBjvU$*Gt|-<$PoxW?c}b7*_f@lS?x z7ya&_IkasGrM2?#c{(?pa#hHS6Hda21?KWP0W6|)EdjJZT+17&fdB}AfZGs23&d@z z(x!r3pioQ5@|A9r$Z|8S;D_-RLI~MSWcQH`BKtDg8)WB`!W+`uK>-rU8p87xd9%rKGn_16mA91ad9p3Yb|z~`lMdNb{tua1 zWHZSQCRo0$1?2cpW2tYur;|1R!00I&sK!fITAEolmqOvR_#{iXP zB#Fq}qOQZOWC9S7k{Q7V2!Mb@2~fAycomI%n9Dwi$OwptIYPx>gMbvz23J4;1SC#C zqfkt=qzF0@S$BDcC4S-OApr=;Ll!s!0T6H_0yOg~ipD++U-BxkWd3UP6dErXUZO{M zct8LG@&E-6KmY{XiGWfrpJGjU_`o_%^_@#od|O)+&XfH@Ks>qjQFah;V*+Z0!s-Qs ze5$XnQoV@=-wVy!a$`((6%7Jn7d`|A0T2))0cu6Gphbhm-zl~@n<}|nL+eKVvN(VT zdxU^^aOI=uAmFY96f$|7J!SJ&D63Xje`UEnad<*l2#6=tGRg=79!7vxn_JU;m7q0j zg=xykPo?fp&6!@N?l^x)04nm31&%-f1l)uGEdU9!wBu8>P>HQPJeZ<;*yJxb=PA_Y|Bz{>_fxOnl$Ft+^HV>)TMu#z zrDJZnsjc_(c)@9j|MsZ9Gl_>aq!~)*gX!E5-cNtdBPzrHA=8E2g6OvyKOs}w$WMU_ zW6zOWI-OK9IGFi0I)t2Qd9A$&V>jV%Sa~>+O5y4cAM|GZ8m=+WqX&C0I{wLU?xNov z7oy6vDU{aA!{_O|dLcLGpM(*MgU(OJGgGMk%Z(hROzyOoWB$avmzDW=QqO9aq)ynH z=YLUUMHg04RNw{zARt)+^iG`T%*^xGXxg!Hj5E`aO59FUX{iA4(0o2a<#u)5r*)qvSe||dp!^`< zW(2BkxORhPOI2`Yv9j~>QZ99?6yVG>ToE_Auv|eIX@CF-NQOYZR_pW@9u1`XO9qG& zGwSN5yAz9os6hY(K!7n4kSosSz$X;ZdJw}*J7*^++W1}F4=!2|F3H%+!+bjEaF?X@ zFp+yS<7f86Q<`#AFhw@V*v$pU%V-AF@dxRwJj|!H4t#L#nuGJiVu^85#9}O+moj#9 z!SQ@zas5F$D-XAz<1P=*U2|~IcvhTil5|Zf`AmD1Qi^hRYNR2}DUD;!PDjk~LqJ?x zJ6u4fx;9C6fzm4^Aap*MtgEN-9;7rM3J7CdKwQmY2c@}$tg+z&Qr+0W1;=YBjfVol z7#9#%vsg-L@_e|Rp%%yMLy;}{vpK1DY(;Mo(QJ6z|KW_U&tNgCzRobF7 zmY?)y%TGp<9YOYUvRlcXB%4X$lgVBn%j@NUk>&kk7s;lPzq@3Qko}2l0@=P~d6$OZ z2F(z`s{k1Q0T6IBft>vOQ!2TFFZ6Mm(K1H=7h#s4iHQ6w-_B?BO6NTFb zWP6bstiCSAl00w5q50U8JSpSGBBZhJFz zH!G8+=em5%+S+WNrT`194P=df2#7Vb;1>iyKr#fV8|y+wZZ4mxc~9M`Vw{{Bh8UfIxDWFBp#cc6}cf^2#A3M zen9{P+>XGV9@W-UE99ah3P$^+uxsgQe8)ydMCZ&n&Qs)Lotc0kZU~5h1b#sP1l*E9 zR(|dfM?CU*%Y(N-L~i)N%m8YA+;c@fAt0`xj5I(11Oy{Mt&nXrZt;gb8Mu>~A%#J6 zUc{j!9)H?XR%^mSK&+t!zaRhtk|aQ%5$r-!ZfzP+PR`C^_pX$MuXm(jDW>TCNF}U-cfZLOJEEF;`5D+2hBW(}>0YL~{f2K+}b!YujRN^->(phF+Zc&%S z;sRH_SJ3S|}J1o>3m`!r=&geHaZ#6MU3l$gYWb3zM* zQ-A>h5D+1O1g*nIhpFiyr>4jEq#y%iOjfASDb)1fD+Wbo_(#*{k^PX=qNauN+LAd)Z;5J^-MG6@18 zU=0Bhj*2R|d?^V>C%H^kly)%M?_IaxLo3V{yH}_@yUA`Pn@FO;zW^mUBeMoxG4&w1 zLJOARm4`zq?F0JsdDE0n81y2mA}T_%T4bKQDxQ?9MZol5BH*ff6|{D!W+`$>G5<8 z;rR<9?+@mNv*C;k{5U(Ft|3i2e87T-;bD0mcw9S(MH~8kV2H(eI;l?95WXn>hVZ;h z+@G4PH(6ePhAswE{`@-kXDEw-A33owVsVfk=*-H)W9j!}{h1-pw$!S#N?Hob(^|CP<01j#ag`&>8Cz=j-x6Q6ab9oF z(C;C#2gNd`Va@ZO^8JY6H#Lkf1o#8O*zku9x5mcsP%^mjhZ462!yk&KehlJc@MG?` zsPLxo@jn>jKN|jrWa`Ht5{9(6aGClsTr29=G&~mtZViTulxcjX{EAA`Ac}@~%>5P> z-ZV`vaK?uJ{h0bO|VlgZxW3)CHRr-WprUlw(5{^5C8#72$WrWDNG@k zk5bCyok%nuvqm%w@fUoPHq~13xJKcBHpGG7M+u+{>rp0f0Ra#YkN~wZno}#|1zPmi zhFTg=(4e^Sc$n2WGl)l)^_yHRrq&0aC;?Lp0SHJjVBib_AmCgABoq~CyqnLKicl~a zZ)MaW!6-xGVLC8vb4Co}VZ#oIeDIu)kHMHB;JE^_{A6X~(%cN2M=k}bH8p9bNBKuC zzySn6;86lHR+_d9QPZ5La%9WUGJrr5i?U<`6f(KDBZcD8#A&{{{=*(NhzE~uGqpa> z6%{Ys9un|e0b#5yVfgMLijt2s3MKPbna;E=IUIa|00_92fSuyOGyAb?b1co&9M)8n zVDZaJFwe*`2!KEd1RNk9$0&)-B_xB(M8J~;qyp{$5C8%9BH#e=;6P?m_Z1%lfhmE2 zCwF0)t{5%>6)uAS2#A@0jq5y2i*%bDzBP5kdC>$sSwJjWxmq+fxPkx(h>3u1dlFh< z&NoQ3)6ApR2j6oJ#sUJKEFi{vN?Cx4dqJz#LQwDq0xl!KH%8=pTk&5z4c~syP^PYl7`i9;m#;`c=x_l$eMm@!5K-}6{p#oH91VF%Y0;xIK zy5@)3KT6A^<34#4GUrW@qCOZS7(;p%@-M#qNS6PK)`&tt z_O4%bl?ZhwyNbZMsyV_x9cGoW@Ee#`#R<=a324q9WTn=9!erT=H=RFV}aHD5lOG=l2c5_1wkIklzdbyMAP{oUB4wm1m~1 z(rf;YrH6H9X-&E^t;*0yFXYXwPxt~4E*^#@=7HBvv08gpk$BKOlXRJ#iRjPLO7l-M z*lhUH^RqUGc2Gci&hb{p+hoU+HGQdnj@*7HD@r5yhtUaM4I*=tY;jFB-Um2|?Dr%j zyfy0>v;5>Nis&_KBdg{Y!05vu76;?qFus5P!o2@Yq^}ehJs{68%cS0~bf$Ri(aktiDhOxnCo^q+xua3K?Q^W@&WTivP~_Zz(s~n zwOc_j^DOXh-plfnQ^>;%^PV2PTFKj&`C9N{5apdK%=_?m=5_K9#vhi&8Quy>i5kfA z0?QZY#jV^G$+vYaFz=(gtRLf`2L=~h{zjhf6DUb8^7Q-6_n%GlLa~EhD6G4U^Syjo z=2NX$#*;1G`hH2HzZcz1D{Ap;Qt#@7qx6*%#nyK|eXQqpjZk)-1lEcc$(tk|f=u0| z=N@lm^d-xmL7~MK?BNC8trh8vo*2mr2tni@y za{3?Y=eNIKUrP^+%zEK0qhVW?Tc(O6=qQt}G4CUZI`NcI7mU3or*bWpRjV<}su{}i z{L9!IooK?}rGfG!nr+2}qso7~Sw;Q=W`)ouR|wLHNfN!7<#_oOSFY=Hfww-K(KTLN znv9-#{APWL>~ONxi}hIah27-bkDhrqioR@{t0V=4KyuOenyj@DjVbZ&tVFV0gnlNl z=jqpSv;1T?^8B;q0SbKb&k|OkR*23}pS|+dC8oY|lBqBLtNXQY4!?|LS8u>F>a}3m zK@BC_UBUbFxlpJtpCB$r8E=g_%j8t4%`)q@V41ZVF|Ec`Gr%n?4WEkab$UNdn%GAJ z;#Ry+SQh;QU%6$gvg~U0$<||BShT95UvM4-5a9v;W4@hwkEzZdVdc;4XQeM6Cl~H& zqoFUZ->+DM-K$!UCDU&jy=d?*FTEK`;<3nZ;>=%q*70W?f7bLN+m`HuOwh5l<}w9% zk)Cyl)&?xjzoZ0&U_MR-nMQVSaRsu&{S1XoB)f;~-(>$I(8a&%EkD_W{QO1MLc^QW z_gJa>H(15gJ2Xq^0zD*8(Ru~mMd^6M2Til9Jz4Nzp#J~7QWYGZhy!Be-E+!2mvutQ zCkUv>DsR($ZZaV5fTYYvL9Mv#s&!Zv2`}fCSGtmU|4zEfXH==_;ioxwm_*|wlR0L# zkmb3h2WM`%$5>AJ>MXZ>HL{Ph+_H~}_GN@m-Bw=yk7>^yW&y-YPHSPDVe;tjDY-%o zmKjj)TBYNAM#;4KhbW!1^o+1Wr3&Yio^MKWsZX{s*$A?&$krw6Xv1H=-=w@>v^Qc& z2nc~~Km{F5Hkz!fMgemvE#6(pciZXi8S2VY-nmLI8N`gHY74y9 zCzW!4mh2_H=`7t-VS!Zb45j4hUb8ySwRCw3a6J%?Xb=C8YzZ@?i z`xyzzVfwYnh*m&IG+T(z$;4k&I1}#1?-|{FLt{=_dePGI$s=<9lC3wy#d!KL=OO33_%FYI_=g9!B}!p6ltcQzd#MQDkmVDMteRCODghzUXh?;4T5ow1&hq)L@Ko9NKlTO zX33=j649d{UslfthFa@?c^@DQ2!H?xfPnZ3+@dV*Buk5sbfR)-&$^X%O(GC0`cr8pj^Ji*80}w@JU`UAOHep3D9ct{L~C##Dizd+h;Gt!)y)Nb=ww-=9x^T;&Z*NHrkv#n}o;egb)A(BuGG;MO{`Yv{Q)j2BNMmhmX%lHX`D#tCRJl z^gLTYcugynd?Ard2HjXTVM8FP6G+fbHD3fnzg4;bgC52?^Y#6k4G;gq*a^puCjb>u zD7V{+Rhx~$5L?+Hocj^r{Z@I&X-x39E0rpXX}mhRA7Sy82m+!|EU~p(bblx|45HYY z9>RfuSPAfHRt5c5)(TQ%2xIC#JUiw%;>`6p%?IVCO5CgwC+i$Y0EStYht_Y-WXv%2-4+aF>kpORXq|;c37-t^( z`0in&TH(79Hr#g@1F->GkwH}IUy5|M&@mrlAr_K?H>nZevki6AbHykg8ch;YtJ_MA zsk`JCU08;iRHb zy24DBqWHML4FY0-9M|k5y~$YhNiRcC-7o)RqisiFK)@XcXtQaC6(8#mW2=J$=IcFt z{bFgi#FOs8TdHM%fEd@DT5Z?9&wN^=DBskK%ZOtTFh_u|>)>1H@|_UHGQ+B<{QCMW zrL9Vq7Ig`3t|Nd!bYs?E{8f(KyL*#%fwOruT&7krxv!UTtR8pF;XPT}o7MK$Fn_gz zC1>Zc6ZbRONwP5FC7}Co2X94-SvWX8AKK??RI8@qB`KYp**l010Wq!XPj?<=8R_*+ zovk^S(-)^?9{9y6Idv=as$Pl>t5=>?^nP@8{)N_%*Q8)4GX_1h3rZpj}Q=N)Y9zj$t*j|-=3&FX^$)gwLBKJ3Sy1Q7KrA) zJ$u>4pEt1U*RJUhDwRq$>5VC@dQkNTNVi>0W)uIogqFwyBCb8)qM`fFtk}D&3|JJ3 zJQ_3)r*V(J3{Lp9pMbprfOiCUvM6V3+;o4OVx0PDO(87w`+V&(55(h}B}>_t zi@tau9z2RR?b;O*5AN2!N&xFxEs!6=xR8MEQ-SogC%!09^kW?cE^@h+`T4&9@h|`p z&o2a|sJc)nCe!yY?c3mrcMs4UdUrQ!T74f=r(gm9j_rwT*N&Z!6uE4%L&wm0<*Ij0bcldEF0SHJ@y!rQTy?uTv>XJ2X zy1_{|UmMc2ye|u+nO3|hykY&%MdIOITDkNgd4oB6l`-5>y$FI}P; z(07ZB>B9N*?7itT*oJlMb=_N^d_0@+0d{VlEahEf7&zKbz_9V5q{cdoi|yzC6@A!z zvau76#YI3VuIz{?H$$5zvAMf9u+&t$KTgBD4io`2z|5QDZf4483T~m~`^jcYcIo0p z#;w8JCjkkd*;%Ei^#bEq0=kwjpIs&87Z+dOpV=!dhd7oDVskVBw{L+YXs6oAOsN`d z_kak`f_{mwow*TZ@O!jUkQ-mWhjVx>$*8X{ZDC9%CC9$;CQH)t7(X;OTDO#3YJ(l7 z73Ax;m5pp=_uHFkv^aM>0k>BXyO8mwh_}yTyW-FX=C6dh=`W6mOhj>#647QmD*U!IjITSgb|RB}Oh5fw>#SN#DwJ$VMD|0zMzrbSJa-W~y#gphBTw9lLb4sAyfEd0OZ1PF61a_inmHVc@9< z0(^Q^dX|3YLkW(On-$Zw) zSxkxHEK&m45X;hvnUi>(Wo1^h)O$((_^yk5_eFOwK1w~{4Yv~xUUWWR7gMe*xCxx&1p?w6u0_ZC z`R=tWEwx9{7j1KOClTQ-k=VNB+4Hr^GL7QVdCO_k-SySU+wAL8w^=q?9wpx}d~lq% zIOq#cZntw7pV#i|_aTYLt0jYg4`&g8fH;e6QSr{-t6>=#Nh~MZvgt-e#ZiQt+*`wB zUg{#Qh`@=uN)$3hhFq!MDpx39q88X=IoTP1(xa`|Wq`gUBrPlYv)Ta~7C?(VcuRwS z5MTB}(`j9d^BPB;mn_xH3T3auHjrbmASirqGjs63Om|=ru&$P zAHCSSa@jg{CCO#-TxwlhlgpLcWD1>N+$*UxszrMpLy$K3RnL;tmQEjVw1WM!miNO>HVMURWfod?E? zs!WaMI#X-HNIb3=bs28bB!F31w$|H%ePJ}M_h))Ady%F2t6CM)<|}9(tDMg5ezKN0 zE~1;oN&ggdIdOHML}j@$nLJY_m*1n~n@lc0M8|6~UJfgIuUs3-?!EM2hup064f!&y zNC$0fD3l9>=r*h3Gpe!+^$NN$2LdGJ>l-MU1eHX zGPNR(()BYmE^);uj8hN2mmY}C&&f{6%ge2zmGdDI7^?_S>yLL+vRq|-0QpA8LE{$FSruPU_yz2qMrxz1K!DAA(Y&}-SPo$3T@2y-vOEb+A)e9tr9MMcLRX*8N!wEa&6&9uTzBk~)-UI8im zq!4*wkv-c9Y(IbXi5)jHMyX`7j+K0r)hl_cyvup3WZoneCG|;F^3|}&ioR_3jWpXc z;Lag+T~ss$m(Qk>@`pGaQAfVMTbN4Sg$Bz#R6QL5Q95y83`9D0^+-s?x{RQjtGGL2F}6Q)X%iASO@Uwvd}g zpK#HjZ<**s!=2Y{SX#;a6P~_)6R68-wxvPfPj~|Mwm={t4ywc7PMr(P%+vlxkLfVJ zO-DwaR!gg{^K)q%ql{c_9=Y-1(_Ff)n?FU{deH1yS-y-$(&^!@n@LNLBsrgL%d^C% zRe961pC3`HK~9UimEN?vPbFt^H3bONC}rjSePtT8>n1~u+k2jEzwW`U5S?i7mIhh= zp?6(PI_L(Hax@yR8_dhA4Ru)^mvS*YG4Bu%5!E`0h|i6Ty!{ou6?I*eE&d%2UoS7_ z3L&{k-=65S$-}y}4c$|Gl{i`&g>P%#s`d5zmiDuHvG4_)NriyD0)p>>IIyPMJy9c_ z#G}!rwA@n;jMi*ad3kv(IW3Ldp%0CxXJ%4+#(A&B6?`;oKn>Gb$7Zu9$%|TI%2$Tx z)2Ctc?xpI!Bnj~_sY;bPmH7vBf_Rv4@vu{LVL73~sU@O5m7H_ri2zj{Cq!>HO8%`4 zwMxajsB4S=I@+YuTX@vQlkW8$4@1`!AJgEi3@3`PqwB*sz69-5<5MRd^QMQ7?^gO$ zXLlMccgW{DotRrhT>=4n-#VcpB>=YdGAW7TU{coKp=C6ow#H#^IQ|h14Jirl<5DRd zH|uWG#UwWApKJDJPq^@0HE7C|ZrT)A4r+G5SU^CnPGR0Y18KlxqXoX5Sx)H+e=#Y9D;@q9$y z8gqkI7LJ* z98?`jWe)T4na+ksOm|R>h(?42ARr>Fl;W~9WYghZ9V>gUuIQ~4QCpyrvpHgg& z2LUBP00JV3YI>N-*iDD(gqGGEu3uWix8s$(IdLzOjoEdX(W*(^_Y7$fWWiUl%=Xuj zXYQYigT8x7cO&b?Lh?|gS^#gKGfb`K!f{ZlML@o-BLD%hj+ZEWPfa|m&SLTtovQi< zi6TRGW@7Exdu+}jfx5En%sYY;0gWb!c0e3S!m$iIJc|GXM8fqQv-$9%-qn0##X2rx z4chnrxz2vQh<)F!VJ5g=l`5Tt<8AtA$1K6~f(!^k00JTicE=?ev-wEJ@N(*nHT~6& zTd3i<>{%RBE{$1C{QVL;d^^M9Fz_f40hKC?gkuiPl6W0k=L%E@B1skkB9e-*CmSE_ zJ?eEmOM9eq72n!shYsvX#06oKv-8-f9T(Z<)NB`|h9s;epd{h&_FBjk%JEpwVKqIs z3;+RfqiTJ5)8WaTD|x?5AMKFLEG<*~H`8<2=$#kYtqiO;Gi4*#xk{bJyfmNDEVeh; z$W~Z(FIYv0FJTCX`0B*29L?HutV~uu+aFocySiNw2^jc7N;Vs}>ms|Cg=dw3)xZbG z@6sZ`59mW3?+Ka@BraM45D?K;jeQv#y7kDIh_afG9`{pOw?y2&WE~dzTyhqhu=^53 z#9>4&jEMJvdU>6uPXoS5!hu;;7Gm>MZx9eSuKBO_pHTmolDoNWMeo)ch4gy0AR;cj zIr(P+y}WkN0>Du;9ru_EQ$|t}CIA7EaOGK=^_lyQH_9z<8>A6%M6wHUS8Tvk8kR{xQG(`&_*M)xvs#YF`m$ ztHi9_&B|qy_grD8Xw^E50|@ZehQ@0jZL9nS8y24EfEW>lhZ2B*cwoi9z30DiK|acN zAM;guNu~H1x%q6y-`CilYj{bvsm}P=hQ{kMZK1q`wttyHp96#%+XNDUj0r$MjA?k# zF@3N~w*5xtq-x&sw`vEdy`@lezWvo#$8NLlPTbLLg(ZbN3!X=f<_-;rucj`lX*9NR zMezI}18zkC0^(NHX^&Y`PA&gG`i^dC+hTBSs9jf6*!%mhv$P!AZ5O660p8M3 ztM8I%Y@%(CXHXZ_zlA;E3*VFU92ri|n?=8~rju;^GLG|f> zU1i4|y%oG60V)0JL_>3px~G0-O64pX3_l~K>?5zzB_LG+NzhJ}E_6xcocg!|cHheU zxQ4ItxvDoK$&ocb0O=|UVntQu~_QC&z`lzrSrDxp%qA0CY zRYVlIbOk`+_1eS$SIa<*{3A^_hDt zPyeMU5oOQ%tjOj0G?;ON`lbFPyPWI_7SjYPVyq{L5Kbfj0dXQ+ca55h$*Gjwc9+s~ z{#VUg(X6(=+MD;qi@}_|pT%a=7pnffBeA{VRjN$tjyg|Mrhcc7|NcmOiEI%APvijv z%n^Wqn4^Ph77-vpDZBetR=iTC9az;{5%id^N+qz6v`~7RNSIg#c3v2kXXoeFc}HP(B|nb%?lC(0VffF zfH(;(qAg6||NcBt>&U(AI6sA~bvcc^R%LHRDVpJ>a>X}!lc*K)_3=Awl1ThP?tik_rdbY43lV{U2nj$yL|7@Fl%;Wr$Eu!7&FSZ( zkTvsD%IXBFWR**)rtnuOWHeyUln!XX+@vp6@ulp)6elFS)xZa@WwKoQ z%_1R4qu={%?W61<00JOj2LT9(9qI5JlQm;Ye9|S-E1Oy@g z0TBp1k_7<}00F5JfPhH729bXd009sXhyVmcAn-^Q1V8`;q)q?=BJ~!3mK51f)&?0wVPqME*el1VBI_ z0uT^^z#~}@009t?IspiX)N2s=2LTWO0f7iWKm-DhWI+G~KtSpQARtn&LF69DM7j00JNY0)h~LfCz#ei3(33K|59WOdtm!AbkQ*5$V?dd5|BF?0XxIq8}K){U& zKtSBMa#1u8009tiCIJYDGwC935C8!XaAN`x5I3$|6b%GG00f*#00QDnx`-PDKmY{X zm;eOCjVl*L0|5{K0cR3`fH;#b;syZ_00B2900D91%0!3m zz>Nt&K-{=;Q8W+$0T6H|0SJgQ=^}0r009tiV*(HmH?CY14Fo^{1e{3#0^&@%h#Lez z00i8a00hL1D;Grr0T2KIXA*#bIFl~o1_2NN0XHT90deEXMbSV21VF%<1Rx;Jq>H#g z00cn5jR`0T6Iw0uT^4u3Qui1V8`;oJjxz;!L`T z+j;^C+NstDLI@B50l^4BMFc~Sgh2oVKtS3AARyANKja<+KmY^;BLD#r3_TJC0T2KI zX%m2eNW1=!dk_Et5D<(21Vk|ONEie_00g8>00JWI`a|wP00cllFai(|!O$aN5C8!X zkTwAbh_veuxd#Cd00F@WKtKdTkAy)01VBLA1Rx;Nu0P}+1V8`;1S0?e5ez*N1_2NN z0cjI}fJnRkkb4jS0T2+300cxZ^hg*4KmY`!O#lKS?fOIRK>!3mKrjLj5W&zRVGsZT z5Rf(j2#B=n54i^c5C8$e2tYstLyv?(00cll+5{jV(yl+`9t1!D1Oy`h0TB#65(WVf z00C(efPhH5{*ZeR00D^-nB6gcvqZCAINMN>!aQ&W0w4eaAYdT@2#AHC;0**o00cmw zFaZciVIDXG0T2KI5U`K{1jIs6@CE`P00JOTm;eN%Fb|x800@8p2v|q}0%9R3cmn|t z009svOaKB>m 1.5.0~rc1 > 1.5.0~git20150128.112847.17e840a > 1.5.0~dev~git20150128.112847.17e840a - fi - - debSource="$(awk -F ': ' '$1 == "Source" { print $2; exit }' hack/make/.build-deb/control)" - debMaintainer="$(awk -F ': ' '$1 == "Maintainer" { print $2; exit }' hack/make/.build-deb/control)" - debDate="$(date --rfc-2822)" - - # if go-md2man is available, pre-generate the man pages - make manpages - - builderDir="contrib/builder/deb/${PACKAGE_ARCH}" - pkgs=( $(find "${builderDir}/"*/ -type d) ) - if [ ! -z "$DOCKER_BUILD_PKGS" ]; then - pkgs=() - for p in $DOCKER_BUILD_PKGS; do - pkgs+=( "$builderDir/$p" ) - done - fi - for dir in "${pkgs[@]}"; do - [ -d "$dir" ] || { echo >&2 "skipping nonexistent $dir"; continue; } - version="$(basename "$dir")" - suite="${version##*-}" - - image="dockercore/builder-deb:$version" - if ! docker inspect "$image" &> /dev/null; then - ( - # Add the APT_MIRROR args only if the consuming Dockerfile uses it - # Otherwise this will cause the build to fail - if [ "$(grep 'ARG APT_MIRROR=' $dir/Dockerfile)" ] && [ "$BUILD_APT_MIRROR" ]; then - DOCKER_BUILD_ARGS="$DOCKER_BUILD_ARGS $BUILD_APT_MIRROR" - fi - set -x && docker build ${DOCKER_BUILD_ARGS} -t "$image" "$dir" - ) - fi - - mkdir -p "$DEST/$version" - cat > "$DEST/$version/Dockerfile.build" <<-EOF - FROM $image - WORKDIR /usr/src/docker - COPY . /usr/src/docker - ENV DOCKER_GITCOMMIT $GITCOMMIT - RUN mkdir -p /go/src/github.com/docker && mkdir -p /go/src/github.com/opencontainers \ - && ln -snf /usr/src/docker /go/src/github.com/docker/docker - EOF - - cat >> "$DEST/$version/Dockerfile.build" <<-EOF - # Install runc, containerd, proxy and tini - RUN ./hack/dockerfile/install-binaries.sh runc-dynamic containerd-dynamic proxy-dynamic tini - EOF - cat >> "$DEST/$version/Dockerfile.build" <<-EOF - RUN cp -aL hack/make/.build-deb debian - RUN { echo '$debSource (${debVersion}-0~${version}) $suite; urgency=low'; echo; echo ' * Version: $VERSION'; echo; echo " -- $debMaintainer $debDate"; } > debian/changelog && cat >&2 debian/changelog - RUN dpkg-buildpackage -uc -us -I.git - EOF - tempImage="docker-temp/build-deb:$version" - ( set -x && docker build -t "$tempImage" -f "$DEST/$version/Dockerfile.build" . ) - docker run --rm "$tempImage" bash -c 'cd .. && tar -c *_*' | tar -xvC "$DEST/$version" - docker rmi "$tempImage" - done - - bundle .integration-daemon-stop -) 2>&1 | tee -a "$DEST/test.log" diff --git a/vendor/github.com/docker/docker/hack/make/build-integration-test-binary b/vendor/github.com/docker/docker/hack/make/build-integration-test-binary deleted file mode 100644 index 2039be416..000000000 --- a/vendor/github.com/docker/docker/hack/make/build-integration-test-binary +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -set -e - -rm -rf "$DEST" -DEST="$DEST/../test-integration-cli" - -if [ -z $DOCKER_INTEGRATION_TESTS_VERIFIED ]; then - source ${MAKEDIR}/.integration-test-helpers - ensure_test_dir integration-cli "$DEST/test.main" - export DOCKER_INTEGRATION_TESTS_VERIFIED=1 -fi diff --git a/vendor/github.com/docker/docker/hack/make/build-rpm b/vendor/github.com/docker/docker/hack/make/build-rpm deleted file mode 100644 index 7fec05939..000000000 --- a/vendor/github.com/docker/docker/hack/make/build-rpm +++ /dev/null @@ -1,148 +0,0 @@ -#!/bin/bash -set -e - -# subshell so that we can export PATH and TZ without breaking other things -( - export TZ=UTC # make sure our "date" variables are UTC-based - - source "$(dirname "$BASH_SOURCE")/.integration-daemon-start" - source "$(dirname "$BASH_SOURCE")/.detect-daemon-osarch" - - # TODO consider using frozen images for the dockercore/builder-rpm tags - - rpmName=docker-engine - rpmVersion="$VERSION" - rpmRelease=1 - - # rpmRelease versioning is as follows - # Docker 1.7.0: version=1.7.0, release=1 - # Docker 1.7.0-rc1: version=1.7.0, release=0.1.rc1 - # Docker 1.7.0-cs1: version=1.7.0.cs1, release=1 - # Docker 1.7.0-cs1-rc1: version=1.7.0.cs1, release=0.1.rc1 - # Docker 1.7.0-dev nightly: version=1.7.0, release=0.0.YYYYMMDD.HHMMSS.gitHASH - - # if we have a "-rc*" suffix, set appropriate release - if [[ "$rpmVersion" =~ .*-rc[0-9]+$ ]] ; then - rcVersion=${rpmVersion#*-rc} - rpmVersion=${rpmVersion%-rc*} - rpmRelease="0.${rcVersion}.rc${rcVersion}" - fi - - DOCKER_GITCOMMIT=$(git rev-parse --short HEAD) - if [ -n "$(git status --porcelain --untracked-files=no)" ]; then - DOCKER_GITCOMMIT="$DOCKER_GITCOMMIT-unsupported" - fi - - # if we have a "-dev" suffix or have change in Git, let's make this package version more complex so it works better - if [[ "$rpmVersion" == *-dev ]] || [ -n "$(git status --porcelain)" ]; then - gitUnix="$(git log -1 --pretty='%at')" - gitDate="$(date --date "@$gitUnix" +'%Y%m%d.%H%M%S')" - gitCommit="$(git log -1 --pretty='%h')" - gitVersion="${gitDate}.git${gitCommit}" - # gitVersion is now something like '20150128.112847.17e840a' - rpmVersion="${rpmVersion%-dev}" - rpmRelease="0.0.$gitVersion" - fi - - # Replace any other dashes with periods - rpmVersion="${rpmVersion/-/.}" - - rpmPackager="$(awk -F ': ' '$1 == "Packager" { print $2; exit }' hack/make/.build-rpm/${rpmName}.spec)" - rpmDate="$(date +'%a %b %d %Y')" - - # if go-md2man is available, pre-generate the man pages - make manpages - - # Convert the CHANGELOG.md file into RPM changelog format - VERSION_REGEX="^\W\W (.*) \((.*)\)$" - ENTRY_REGEX="^[-+*] (.*)$" - while read -r line || [[ -n "$line" ]]; do - if [ -z "$line" ]; then continue; fi - if [[ "$line" =~ $VERSION_REGEX ]]; then - echo >> contrib/builder/rpm/${PACKAGE_ARCH}/changelog - echo "* `date -d ${BASH_REMATCH[2]} '+%a %b %d %Y'` ${rpmPackager} - ${BASH_REMATCH[1]}" >> contrib/builder/rpm/${PACKAGE_ARCH}/changelog - fi - if [[ "$line" =~ $ENTRY_REGEX ]]; then - echo "- ${BASH_REMATCH[1]//\`}" >> contrib/builder/rpm/${PACKAGE_ARCH}/changelog - fi - done < CHANGELOG.md - - builderDir="contrib/builder/rpm/${PACKAGE_ARCH}" - pkgs=( $(find "${builderDir}/"*/ -type d) ) - if [ ! -z "$DOCKER_BUILD_PKGS" ]; then - pkgs=() - for p in $DOCKER_BUILD_PKGS; do - pkgs+=( "$builderDir/$p" ) - done - fi - for dir in "${pkgs[@]}"; do - [ -d "$dir" ] || { echo >&2 "skipping nonexistent $dir"; continue; } - version="$(basename "$dir")" - suite="${version##*-}" - - image="dockercore/builder-rpm:$version" - if ! docker inspect "$image" &> /dev/null; then - ( set -x && docker build ${DOCKER_BUILD_ARGS} -t "$image" "$dir" ) - fi - - mkdir -p "$DEST/$version" - cat > "$DEST/$version/Dockerfile.build" <<-EOF - FROM $image - COPY . /usr/src/${rpmName} - WORKDIR /usr/src/${rpmName} - RUN mkdir -p /go/src/github.com/docker && mkdir -p /go/src/github.com/opencontainers - EOF - - cat >> "$DEST/$version/Dockerfile.build" <<-EOF - # Install runc, containerd, proxy and tini - RUN TMP_GOPATH="/go" ./hack/dockerfile/install-binaries.sh runc-dynamic containerd-dynamic proxy-dynamic tini - EOF - if [[ "$VERSION" == *-dev ]] || [ -n "$(git status --porcelain)" ]; then - echo 'ENV DOCKER_EXPERIMENTAL 1' >> "$DEST/$version/Dockerfile.build" - fi - cat >> "$DEST/$version/Dockerfile.build" <<-EOF - RUN mkdir -p /root/rpmbuild/SOURCES \ - && echo '%_topdir /root/rpmbuild' > /root/.rpmmacros - WORKDIR /root/rpmbuild - RUN ln -sfv /usr/src/${rpmName}/hack/make/.build-rpm SPECS - WORKDIR /root/rpmbuild/SPECS - RUN tar --exclude .git -r -C /usr/src -f /root/rpmbuild/SOURCES/${rpmName}.tar ${rpmName} - RUN tar --exclude .git -r -C /go/src/github.com/docker -f /root/rpmbuild/SOURCES/${rpmName}.tar containerd - RUN tar --exclude .git -r -C /go/src/github.com/docker/libnetwork/cmd -f /root/rpmbuild/SOURCES/${rpmName}.tar proxy - RUN tar --exclude .git -r -C /go/src/github.com/opencontainers -f /root/rpmbuild/SOURCES/${rpmName}.tar runc - RUN tar --exclude .git -r -C /go/ -f /root/rpmbuild/SOURCES/${rpmName}.tar tini - RUN gzip /root/rpmbuild/SOURCES/${rpmName}.tar - RUN { cat /usr/src/${rpmName}/contrib/builder/rpm/${PACKAGE_ARCH}/changelog; } >> ${rpmName}.spec && tail >&2 ${rpmName}.spec - RUN rpmbuild -ba \ - --define '_gitcommit $DOCKER_GITCOMMIT' \ - --define '_release $rpmRelease' \ - --define '_version $rpmVersion' \ - --define '_origversion $VERSION' \ - --define '_experimental ${DOCKER_EXPERIMENTAL:-0}' \ - ${rpmName}.spec - EOF - # selinux policy referencing systemd things won't work on non-systemd versions - # of centos or rhel, which we don't support anyways - if [ "${suite%.*}" -gt 6 ] && [[ "$version" != opensuse* ]]; then - selinuxDir="selinux" - if [ -d "./contrib/selinux-$version" ]; then - selinuxDir="selinux-${version}" - fi - cat >> "$DEST/$version/Dockerfile.build" <<-EOF - RUN tar -cz -C /usr/src/${rpmName}/contrib/${selinuxDir} -f /root/rpmbuild/SOURCES/${rpmName}-selinux.tar.gz ${rpmName}-selinux - RUN rpmbuild -ba \ - --define '_gitcommit $DOCKER_GITCOMMIT' \ - --define '_release $rpmRelease' \ - --define '_version $rpmVersion' \ - --define '_origversion $VERSION' \ - ${rpmName}-selinux.spec - EOF - fi - tempImage="docker-temp/build-rpm:$version" - ( set -x && docker build -t "$tempImage" -f $DEST/$version/Dockerfile.build . ) - docker run --rm "$tempImage" bash -c 'cd /root/rpmbuild && tar -c *RPMS' | tar -xvC "$DEST/$version" - docker rmi "$tempImage" - done - - source "$(dirname "$BASH_SOURCE")/.integration-daemon-stop" -) 2>&1 | tee -a $DEST/test.log diff --git a/vendor/github.com/docker/docker/hack/make/clean-apt-repo b/vendor/github.com/docker/docker/hack/make/clean-apt-repo deleted file mode 100755 index 1c37d98e4..000000000 --- a/vendor/github.com/docker/docker/hack/make/clean-apt-repo +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -set -e - -# This script cleans the experimental pool for the apt repo. -# This is useful when there are a lot of old experimental debs and you only want to keep the most recent. -# - -: ${DOCKER_RELEASE_DIR:=$DEST} -APTDIR=$DOCKER_RELEASE_DIR/apt/repo/pool/experimental -: ${DOCKER_ARCHIVE_DIR:=$DEST/archive} -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -latest_versions=$(dpkg-scanpackages "$APTDIR" /dev/null 2>/dev/null | awk -F ': ' '$1 == "Filename" { print $2 }') - -# get the latest version -latest_docker_engine_file=$(echo "$latest_versions" | grep docker-engine) -latest_docker_engine_version=$(basename ${latest_docker_engine_file%~*}) - -echo "latest docker-engine version: $latest_docker_engine_version" - -# remove all the files that are not that version in experimental -pool_dir=$(dirname "$latest_docker_engine_file") -old_pkgs=( $(ls "$pool_dir" | grep -v "^${latest_docker_engine_version}" | grep "${latest_docker_engine_version%%~git*}") ) - -echo "${old_pkgs[@]}" - -mkdir -p "$DOCKER_ARCHIVE_DIR" -for old_pkg in "${old_pkgs[@]}"; do - echo "moving ${pool_dir}/${old_pkg} to $DOCKER_ARCHIVE_DIR" - mv "${pool_dir}/${old_pkg}" "$DOCKER_ARCHIVE_DIR" -done - -echo -echo "$pool_dir now has contents:" -ls "$pool_dir" - -# now regenerate release files for experimental -export COMPONENT=experimental -source "${DIR}/update-apt-repo" - -echo "You will now want to: " -echo " - re-sign the repo with hack/make/sign-repo" -echo " - re-generate index files with hack/make/generate-index-listing" diff --git a/vendor/github.com/docker/docker/hack/make/clean-yum-repo b/vendor/github.com/docker/docker/hack/make/clean-yum-repo deleted file mode 100755 index 1cafbbd97..000000000 --- a/vendor/github.com/docker/docker/hack/make/clean-yum-repo +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -set -e - -# This script cleans the experimental pool for the yum repo. -# This is useful when there are a lot of old experimental rpms and you only want to keep the most recent. -# - -: ${DOCKER_RELEASE_DIR:=$DEST} -YUMDIR=$DOCKER_RELEASE_DIR/yum/repo/experimental - -suites=( $(find "$YUMDIR" -mindepth 1 -maxdepth 1 -type d) ) - -for suite in "${suites[@]}"; do - echo "cleanup in: $suite" - ( set -x; repomanage -k2 --old "$suite" | xargs rm -f ) -done - -echo "You will now want to: " -echo " - re-sign the repo with hack/make/sign-repo" -echo " - re-generate index files with hack/make/generate-index-listing" diff --git a/vendor/github.com/docker/docker/hack/make/cover b/vendor/github.com/docker/docker/hack/make/cover deleted file mode 100644 index 08e28e3fe..000000000 --- a/vendor/github.com/docker/docker/hack/make/cover +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -e - -bundle_cover() { - coverprofiles=( "$DEST/../"*"/coverprofiles/"* ) - for p in "${coverprofiles[@]}"; do - echo - ( - set -x - go tool cover -func="$p" - ) - done -} - -bundle_cover 2>&1 | tee "$DEST/report.log" diff --git a/vendor/github.com/docker/docker/hack/make/cross b/vendor/github.com/docker/docker/hack/make/cross deleted file mode 100644 index 6d672b17c..000000000 --- a/vendor/github.com/docker/docker/hack/make/cross +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash -set -e - -# explicit list of os/arch combos that support being a daemon -declare -A daemonSupporting -daemonSupporting=( - [linux/amd64]=1 - [windows/amd64]=1 -) - -# if we have our linux/amd64 version compiled, let's symlink it in -if [ -x "$DEST/../binary-daemon/dockerd-$VERSION" ]; then - arch=$(go env GOHOSTARCH) - mkdir -p "$DEST/linux/${arch}" - ( - cd "$DEST/linux/${arch}" - ln -s ../../../binary-daemon/* ./ - ln -s ../../../binary-client/* ./ - ) - echo "Created symlinks:" "$DEST/linux/${arch}/"* -fi - -for platform in $DOCKER_CROSSPLATFORMS; do - ( - export KEEPDEST=1 - export DEST="$DEST/$platform" # bundles/VERSION/cross/GOOS/GOARCH/docker-VERSION - mkdir -p "$DEST" - ABS_DEST="$(cd "$DEST" && pwd -P)" - export GOOS=${platform%/*} - export GOARCH=${platform##*/} - - if [ "$GOOS" != "solaris" ]; then - # TODO. Solaris cannot be cross build because of CGO calls. - if [ -z "${daemonSupporting[$platform]}" ]; then - # we just need a simple client for these platforms - export LDFLAGS_STATIC_DOCKER="" - # remove the "daemon" build tag from platforms that aren't supported - export BUILDFLAGS=( "${ORIG_BUILDFLAGS[@]/ daemon/}" ) - source "${MAKEDIR}/binary-client" - else - source "${MAKEDIR}/binary-client" - source "${MAKEDIR}/binary-daemon" - fi - fi - ) -done diff --git a/vendor/github.com/docker/docker/hack/make/dynbinary b/vendor/github.com/docker/docker/hack/make/dynbinary deleted file mode 100644 index 1a435dc4b..000000000 --- a/vendor/github.com/docker/docker/hack/make/dynbinary +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -e - -# This script exists as backwards compatibility for CI -( - DEST="${DEST}-client" - ABS_DEST="${ABS_DEST}-client" - . hack/make/dynbinary-client -) -( - - DEST="${DEST}-daemon" - ABS_DEST="${ABS_DEST}-daemon" - . hack/make/dynbinary-daemon -) diff --git a/vendor/github.com/docker/docker/hack/make/dynbinary-client b/vendor/github.com/docker/docker/hack/make/dynbinary-client deleted file mode 100644 index e4b774184..000000000 --- a/vendor/github.com/docker/docker/hack/make/dynbinary-client +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -e - -( - export BINARY_SHORT_NAME='docker' - export GO_PACKAGE='github.com/docker/docker/cmd/docker' - export IAMSTATIC='false' - export LDFLAGS_STATIC_DOCKER='' - export BUILDFLAGS=( "${BUILDFLAGS[@]/netgo /}" ) # disable netgo, since we don't need it for a dynamic binary - export BUILDFLAGS=( "${BUILDFLAGS[@]/static_build /}" ) # we're not building a "static" binary here - source "${MAKEDIR}/.binary" -) diff --git a/vendor/github.com/docker/docker/hack/make/dynbinary-daemon b/vendor/github.com/docker/docker/hack/make/dynbinary-daemon deleted file mode 100644 index 090a916f6..000000000 --- a/vendor/github.com/docker/docker/hack/make/dynbinary-daemon +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -e - -( - export BINARY_SHORT_NAME='dockerd' - export GO_PACKAGE='github.com/docker/docker/cmd/dockerd' - export IAMSTATIC='false' - export LDFLAGS_STATIC_DOCKER='' - export BUILDFLAGS=( "${BUILDFLAGS[@]/netgo /}" ) # disable netgo, since we don't need it for a dynamic binary - export BUILDFLAGS=( "${BUILDFLAGS[@]/static_build /}" ) # we're not building a "static" binary here - source "${MAKEDIR}/.binary" -) diff --git a/vendor/github.com/docker/docker/hack/make/generate-index-listing b/vendor/github.com/docker/docker/hack/make/generate-index-listing deleted file mode 100755 index ec44171f8..000000000 --- a/vendor/github.com/docker/docker/hack/make/generate-index-listing +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/bash -set -e - -# This script generates index files for the directory structure -# of the apt and yum repos - -: ${DOCKER_RELEASE_DIR:=$DEST} -APTDIR=$DOCKER_RELEASE_DIR/apt -YUMDIR=$DOCKER_RELEASE_DIR/yum - -if [ ! -d $APTDIR ] && [ ! -d $YUMDIR ]; then - echo >&2 'release-rpm or release-deb must be run before generate-index-listing' - exit 1 -fi - -create_index() { - local directory=$1 - local original=$2 - local cleaned=${directory#$original} - - # the index file to create - local index_file="${directory}/index" - - # cd into dir & touch the index file - cd $directory - touch $index_file - - # print the html header - cat <<-EOF > "$index_file" - - - Index of ${cleaned}/ - -

Index of ${cleaned}/


-
../
-	EOF
-
-	# start of content output
-	(
-	# change IFS locally within subshell so the for loop saves line correctly to L var
-	IFS=$'\n';
-
-	# pretty sweet, will mimick the normal apache output. skipping "index" and hidden files
-	for L in $(find -L . -mount -depth -maxdepth 1 -type f ! -name 'index' ! -name '.*' -prune -printf "%f|@_@%Td-%Tb-%TY %Tk:%TM  @%f@\n"|sort|column -t -s '|' | sed 's,\([\ ]\+\)@_@,\1,g');
-	do
-		# file
-		F=$(sed -e 's,^.*@\([^@]\+\)@.*$,\1,g'<<<"$L");
-
-		# file with file size
-		F=$(du -bh $F | cut -f1);
-
-		# output with correct format
-		sed -e 's,\ @.*$, '"$F"',g'<<<"$L";
-	done;
-	) >> $index_file;
-
-	# now output a list of all directories in this dir (maxdepth 1) other than '.' outputting in a sorted manner exactly like apache
-	find -L . -mount -depth -maxdepth 1 -type d ! -name '.' -printf "%-43f@_@%Td-%Tb-%TY %Tk:%TM  -\n"|sort -d|sed 's,\([\ ]\+\)@_@,/\1,g' >> $index_file
-
-	# print the footer html
-	echo "

" >> $index_file - -} - -get_dirs() { - local directory=$1 - - for d in `find ${directory} -type d`; do - create_index $d $directory - done -} - -get_dirs $APTDIR -get_dirs $YUMDIR diff --git a/vendor/github.com/docker/docker/hack/make/install-binary b/vendor/github.com/docker/docker/hack/make/install-binary deleted file mode 100644 index 82cbc7993..000000000 --- a/vendor/github.com/docker/docker/hack/make/install-binary +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -set -e -rm -rf "$DEST" - -( - source "${MAKEDIR}/install-binary-client" -) - -( - source "${MAKEDIR}/install-binary-daemon" -) diff --git a/vendor/github.com/docker/docker/hack/make/install-binary-client b/vendor/github.com/docker/docker/hack/make/install-binary-client deleted file mode 100644 index 6c8045265..000000000 --- a/vendor/github.com/docker/docker/hack/make/install-binary-client +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -e -rm -rf "$DEST" - -( - DEST="$(dirname $DEST)/binary-client" - source "${MAKEDIR}/.binary-setup" - install_binary "${DEST}/${DOCKER_CLIENT_BINARY_NAME}" -) diff --git a/vendor/github.com/docker/docker/hack/make/install-binary-daemon b/vendor/github.com/docker/docker/hack/make/install-binary-daemon deleted file mode 100644 index 08a2d69b9..000000000 --- a/vendor/github.com/docker/docker/hack/make/install-binary-daemon +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e -rm -rf "$DEST" - -( - DEST="$(dirname $DEST)/binary-daemon" - source "${MAKEDIR}/.binary-setup" - install_binary "${DEST}/${DOCKER_DAEMON_BINARY_NAME}" - install_binary "${DEST}/${DOCKER_RUNC_BINARY_NAME}" - install_binary "${DEST}/${DOCKER_CONTAINERD_BINARY_NAME}" - install_binary "${DEST}/${DOCKER_CONTAINERD_CTR_BINARY_NAME}" - install_binary "${DEST}/${DOCKER_CONTAINERD_SHIM_BINARY_NAME}" - install_binary "${DEST}/${DOCKER_PROXY_BINARY_NAME}" - install_binary "${DEST}/${DOCKER_INIT_BINARY_NAME}" -) diff --git a/vendor/github.com/docker/docker/hack/make/install-script b/vendor/github.com/docker/docker/hack/make/install-script deleted file mode 100644 index feadac2f3..000000000 --- a/vendor/github.com/docker/docker/hack/make/install-script +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash -set -e - -# This script modifies the install.sh script for domains and keys other than -# those used by the primary opensource releases. -# -# You can provide `url`, `yum_url`, `apt_url` and optionally `gpg_fingerprint` -# or `GPG_KEYID` as environment variables, or the defaults for open source are used. -# -# The lower-case variables are substituted into install.sh. -# -# gpg_fingerprint and GPG_KEYID are optional, defaulting to the opensource release -# key ("releasedocker"). Other GPG_KEYIDs will require you to mount a volume with -# the correct contents to /root/.gnupg. -# -# It outputs the modified `install.sh` file to $DOCKER_RELEASE_DIR (default: $DEST) -# -# Example usage: -# -# docker run \ -# --rm \ -# --privileged \ -# -e "GPG_KEYID=deadbeef" \ -# -e "GNUPGHOME=/root/.gnupg" \ -# -v $HOME/.gnupg:/root/.gnupg \ -# -v $(pwd):/go/src/github.com/docker/docker/bundles \ -# "$IMAGE_DOCKER" \ -# hack/make.sh install-script - -: ${DOCKER_RELEASE_DIR:=$DEST} -: ${GPG_KEYID:=releasedocker} - -DEFAULT_URL="https://get.docker.com/" -DEFAULT_APT_URL="https://apt.dockerproject.org" -DEFAULT_YUM_URL="https://yum.dockerproject.org" -DEFAULT_GPG_FINGERPRINT="58118E89F3A912897C070ADBF76221572C52609D" - -: ${url:=$DEFAULT_URL} -: ${apt_url:=$DEFAULT_APT_URL} -: ${yum_url:=$DEFAULT_YUM_URL} -if [[ "$GPG_KEYID" == "releasedocker" ]] ; then - : ${gpg_fingerprint:=$DEFAULT_GPG_FINGERPRINT} -fi - -DEST_FILE="$DOCKER_RELEASE_DIR/install.sh" - -bundle_install_script() { - mkdir -p "$DOCKER_RELEASE_DIR" - - if [[ -z "$gpg_fingerprint" ]] ; then - # NOTE: if no key matching key is in /root/.gnupg, this will fail - gpg_fingerprint=$(gpg --with-fingerprint -k "$GPG_KEYID" | grep "Key fingerprint" | awk -F "=" '{print $2};' | tr -d ' ') - fi - - cp hack/install.sh "$DEST_FILE" - sed -i.bak 's#^url=".*"$#url="'"$url"'"#' "$DEST_FILE" - sed -i.bak 's#^apt_url=".*"$#apt_url="'"$apt_url"'"#' "$DEST_FILE" - sed -i.bak 's#^yum_url=".*"$#yum_url="'"$yum_url"'"#' "$DEST_FILE" - sed -i.bak 's#^gpg_fingerprint=".*"$#gpg_fingerprint="'"$gpg_fingerprint"'"#' "$DEST_FILE" - rm "${DEST_FILE}.bak" -} - -bundle_install_script diff --git a/vendor/github.com/docker/docker/hack/make/release-deb b/vendor/github.com/docker/docker/hack/make/release-deb deleted file mode 100755 index ed65fe2f5..000000000 --- a/vendor/github.com/docker/docker/hack/make/release-deb +++ /dev/null @@ -1,163 +0,0 @@ -#!/bin/bash -set -e - -# This script creates the apt repos for the .deb files generated by hack/make/build-deb -# -# The following can then be used as apt sources: -# deb http://apt.dockerproject.org/repo $distro-$release $version -# -# For example: -# deb http://apt.dockerproject.org/repo ubuntu-trusty main -# deb http://apt.dockerproject.org/repo ubuntu-trusty testing -# deb http://apt.dockerproject.org/repo debian-wheezy experimental -# deb http://apt.dockerproject.org/repo debian-jessie main -# -# ... and so on and so forth for the builds created by hack/make/build-deb - -: ${DOCKER_RELEASE_DIR:=$DEST} -: ${GPG_KEYID:=releasedocker} -APTDIR=$DOCKER_RELEASE_DIR/apt/repo - -# setup the apt repo (if it does not exist) -mkdir -p "$APTDIR/conf" "$APTDIR/db" "$APTDIR/dists" - -# supported arches/sections -arches=( amd64 i386 armhf ) - -# Preserve existing components but don't add any non-existing ones -for component in main testing experimental ; do - exists=$(find "$APTDIR/dists" -mindepth 2 -maxdepth 2 -type d -name "$component" -print -quit) - if [ -n "$exists" ] ; then - components+=( $component ) - fi -done - -# set the component for the version being released -component="main" - -if [[ "$VERSION" == *-rc* ]]; then - component="testing" -fi - -if [[ "$VERSION" == *-dev ]] || [ -n "$(git status --porcelain)" ]; then - component="experimental" -fi - -# Make sure our component is in the list of components -if [[ ! "${components[*]}" =~ $component ]] ; then - components+=( $component ) -fi - -# create apt-ftparchive file on every run. This is essential to avoid -# using stale versions of the config file that could cause unnecessary -# refreshing of bits for EOL-ed releases. -cat <<-EOF > "$APTDIR/conf/apt-ftparchive.conf" -Dir { - ArchiveDir "${APTDIR}"; - CacheDir "${APTDIR}/db"; -}; - -Default { - Packages::Compress ". gzip bzip2"; - Sources::Compress ". gzip bzip2"; - Contents::Compress ". gzip bzip2"; -}; - -TreeDefault { - BinCacheDB "packages-\$(SECTION)-\$(ARCH).db"; - Directory "pool/\$(SECTION)"; - Packages "\$(DIST)/\$(SECTION)/binary-\$(ARCH)/Packages"; - SrcDirectory "pool/\$(SECTION)"; - Sources "\$(DIST)/\$(SECTION)/source/Sources"; - Contents "\$(DIST)/\$(SECTION)/Contents-\$(ARCH)"; - FileList "$APTDIR/\$(DIST)/\$(SECTION)/filelist"; -}; -EOF - -for dir in bundles/$VERSION/build-deb/*/; do - version="$(basename "$dir")" - suite="${version//debootstrap-}" - - cat <<-EOF - Tree "dists/${suite}" { - Sections "${components[*]}"; - Architectures "${arches[*]}"; - } - - EOF -done >> "$APTDIR/conf/apt-ftparchive.conf" - -cat <<-EOF > "$APTDIR/conf/docker-engine-release.conf" -APT::FTPArchive::Release::Origin "Docker"; -APT::FTPArchive::Release::Components "${components[*]}"; -APT::FTPArchive::Release::Label "Docker APT Repository"; -APT::FTPArchive::Release::Architectures "${arches[*]}"; -EOF - -# release the debs -for dir in bundles/$VERSION/build-deb/*/; do - version="$(basename "$dir")" - codename="${version//debootstrap-}" - - tempdir="$(mktemp -d /tmp/tmp-docker-release-deb.XXXXXXXX)" - DEBFILE=( "$dir/docker-engine"*.deb ) - - # add the deb for each component for the distro version into the - # pool (if it is not there already) - mkdir -p "$APTDIR/pool/$component/d/docker-engine/" - for deb in ${DEBFILE[@]}; do - d=$(basename "$deb") - # We do not want to generate a new deb if it has already been - # copied into the APTDIR - if [ ! -f "$APTDIR/pool/$component/d/docker-engine/$d" ]; then - cp "$deb" "$tempdir/" - # if we have a $GPG_PASSPHRASE we may as well - # dpkg-sign before copying the deb into the pool - if [ ! -z "$GPG_PASSPHRASE" ]; then - dpkg-sig -g "--no-tty --digest-algo 'sha512' --passphrase '$GPG_PASSPHRASE'" \ - -k "$GPG_KEYID" --sign builder "$tempdir/$d" - fi - mv "$tempdir/$d" "$APTDIR/pool/$component/d/docker-engine/" - fi - done - - rm -rf "$tempdir" - - # build the right directory structure, needed for apt-ftparchive - for arch in "${arches[@]}"; do - for c in "${components[@]}"; do - mkdir -p "$APTDIR/dists/$codename/$c/binary-$arch" - done - done - - # update the filelist for this codename/component - find "$APTDIR/pool/$component" \ - -name *~${codename}*.deb -o \ - -name *~${codename#*-}*.deb > "$APTDIR/dists/$codename/$component/filelist" -done - -# run the apt-ftparchive commands so we can have pinning -apt-ftparchive generate "$APTDIR/conf/apt-ftparchive.conf" - -for dir in bundles/$VERSION/build-deb/*/; do - version="$(basename "$dir")" - codename="${version//debootstrap-}" - - apt-ftparchive \ - -c "$APTDIR/conf/docker-engine-release.conf" \ - -o "APT::FTPArchive::Release::Codename=$codename" \ - -o "APT::FTPArchive::Release::Suite=$codename" \ - release \ - "$APTDIR/dists/$codename" > "$APTDIR/dists/$codename/Release" - - for arch in "${arches[@]}"; do - apt-ftparchive \ - -c "$APTDIR/conf/docker-engine-release.conf" \ - -o "APT::FTPArchive::Release::Codename=$codename" \ - -o "APT::FTPArchive::Release::Suite=$codename" \ - -o "APT::FTPArchive::Release::Components=$component" \ - -o "APT::FTPArchive::Release::Architecture=$arch" \ - release \ - "$APTDIR/dists/$codename/$component/binary-$arch" > "$APTDIR/dists/$codename/$component/binary-$arch/Release" - done -done diff --git a/vendor/github.com/docker/docker/hack/make/release-rpm b/vendor/github.com/docker/docker/hack/make/release-rpm deleted file mode 100755 index d7e3ec4f8..000000000 --- a/vendor/github.com/docker/docker/hack/make/release-rpm +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -set -e - -# This script creates the yum repos for the .rpm files generated by hack/make/build-rpm -# -# The following can then be used as a yum repo: -# http://yum.dockerproject.org/repo/$release/$distro/$distro-version -# -# For example: -# http://yum.dockerproject.org/repo/main/fedora/23 -# http://yum.dockerproject.org/repo/testing/centos/7 -# http://yum.dockerproject.org/repo/experimental/fedora/23 -# http://yum.dockerproject.org/repo/main/centos/7 -# -# ... and so on and so forth for the builds created by hack/make/build-rpm - -: ${DOCKER_RELEASE_DIR:=$DEST} -YUMDIR=$DOCKER_RELEASE_DIR/yum/repo -: ${GPG_KEYID:=releasedocker} - -# get the release -release="main" - -if [[ "$VERSION" == *-rc* ]]; then - release="testing" -fi - -if [[ "$VERSION" == *-dev ]] || [ -n "$(git status --porcelain)" ]; then - release="experimental" -fi - -# Setup the yum repo -for dir in bundles/$VERSION/build-rpm/*/; do - version="$(basename "$dir")" - suite="${version##*-}" - distro="${version%-*}" - - REPO=$YUMDIR/$release/$distro - - # if the directory does not exist, initialize the yum repo - if [[ ! -d $REPO/$suite/Packages ]]; then - mkdir -p "$REPO/$suite/Packages" - - createrepo --pretty "$REPO/$suite" - fi - - # path to rpms - RPMFILE=( "bundles/$VERSION/build-rpm/$version/RPMS/"*"/docker-engine"*.rpm "bundles/$VERSION/build-rpm/$version/SRPMS/docker-engine"*.rpm ) - - # if we have a $GPG_PASSPHRASE we may as well - # sign the rpms before adding to repo - if [ ! -z $GPG_PASSPHRASE ]; then - # export our key to rpm import - gpg --armor --export "$GPG_KEYID" > /tmp/gpg - rpm --import /tmp/gpg - - # sign the rpms - echo "yes" | setsid rpm \ - --define "_gpg_name $GPG_KEYID" \ - --define "_signature gpg" \ - --define "__gpg_check_password_cmd /bin/true" \ - --define "__gpg_sign_cmd %{__gpg} gpg --batch --no-armor --digest-algo 'sha512' --passphrase '$GPG_PASSPHRASE' --no-secmem-warning -u '%{_gpg_name}' --sign --detach-sign --output %{__signature_filename} %{__plaintext_filename}" \ - --resign "${RPMFILE[@]}" - fi - - # copy the rpms to the packages folder - cp "${RPMFILE[@]}" "$REPO/$suite/Packages" - - # update the repo - createrepo --pretty --update "$REPO/$suite" -done diff --git a/vendor/github.com/docker/docker/hack/make/run b/vendor/github.com/docker/docker/hack/make/run deleted file mode 100644 index 37cfd53b5..000000000 --- a/vendor/github.com/docker/docker/hack/make/run +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -set -e -rm -rf "$DEST" - -if ! command -v dockerd &> /dev/null; then - echo >&2 'error: binary-daemon or dynbinary-daemon must be run before run' - false -fi - -DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs} -DOCKER_USERLANDPROXY=${DOCKER_USERLANDPROXY:-true} - -# example usage: DOCKER_STORAGE_OPTS="dm.basesize=20G,dm.loopdatasize=200G" -storage_params="" -if [ -n "$DOCKER_STORAGE_OPTS" ]; then - IFS=',' - for i in ${DOCKER_STORAGE_OPTS}; do - storage_params="--storage-opt $i $storage_params" - done - unset IFS -fi - - -listen_port=2375 -if [ -n "$DOCKER_PORT" ]; then - IFS=':' read -r -a ports <<< "$DOCKER_PORT" - listen_port="${ports[-1]}" -fi - -extra_params="" -if [ "$DOCKER_REMAP_ROOT" ]; then - extra_params="--userns-remap $DOCKER_REMAP_ROOT" -fi - -args="--debug \ - --host tcp://0.0.0.0:${listen_port} --host unix:///var/run/docker.sock \ - --storage-driver "$DOCKER_GRAPHDRIVER" \ - --userland-proxy="$DOCKER_USERLANDPROXY" \ - $storage_params \ - $extra_params" - -echo dockerd $args -exec dockerd $args diff --git a/vendor/github.com/docker/docker/hack/make/sign-repos b/vendor/github.com/docker/docker/hack/make/sign-repos deleted file mode 100755 index 6ed160688..000000000 --- a/vendor/github.com/docker/docker/hack/make/sign-repos +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash - -# This script signs the deliverables from release-deb and release-rpm -# with a designated GPG key. - -: ${DOCKER_RELEASE_DIR:=$DEST} -: ${GPG_KEYID:=releasedocker} -APTDIR=$DOCKER_RELEASE_DIR/apt/repo -YUMDIR=$DOCKER_RELEASE_DIR/yum/repo - -if [ -z "$GPG_PASSPHRASE" ]; then - echo >&2 'you need to set GPG_PASSPHRASE in order to sign artifacts' - exit 1 -fi - -if [ ! -d $APTDIR ] && [ ! -d $YUMDIR ]; then - echo >&2 'release-rpm or release-deb must be run before sign-repos' - exit 1 -fi - -sign_packages(){ - # sign apt repo metadata - if [ -d $APTDIR ]; then - # create file with public key - gpg --armor --export "$GPG_KEYID" > "$DOCKER_RELEASE_DIR/apt/gpg" - - # sign the repo metadata - for F in $(find $APTDIR -name Release); do - if test "$F" -nt "$F.gpg" ; then - gpg -u "$GPG_KEYID" --passphrase "$GPG_PASSPHRASE" \ - --digest-algo "sha512" \ - --armor --sign --detach-sign \ - --batch --yes \ - --output "$F.gpg" "$F" - fi - inRelease="$(dirname "$F")/InRelease" - if test "$F" -nt "$inRelease" ; then - gpg -u "$GPG_KEYID" --passphrase "$GPG_PASSPHRASE" \ - --digest-algo "sha512" \ - --clearsign \ - --batch --yes \ - --output "$inRelease" "$F" - fi - done - fi - - # sign yum repo metadata - if [ -d $YUMDIR ]; then - # create file with public key - gpg --armor --export "$GPG_KEYID" > "$DOCKER_RELEASE_DIR/yum/gpg" - - # sign the repo metadata - for F in $(find $YUMDIR -name repomd.xml); do - if test "$F" -nt "$F.asc" ; then - gpg -u "$GPG_KEYID" --passphrase "$GPG_PASSPHRASE" \ - --digest-algo "sha512" \ - --armor --sign --detach-sign \ - --batch --yes \ - --output "$F.asc" "$F" - fi - done - fi -} - -sign_packages diff --git a/vendor/github.com/docker/docker/hack/make/test-deb-install b/vendor/github.com/docker/docker/hack/make/test-deb-install deleted file mode 100755 index aec584760..000000000 --- a/vendor/github.com/docker/docker/hack/make/test-deb-install +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -# This script is used for testing install.sh and that it works for -# each of component of our apt and yum repos -set -e - -: ${DEB_DIR:="$(pwd)/bundles/$(cat VERSION)/build-deb"} - -if [[ ! -d "${DEB_DIR}" ]]; then - echo "you must first run `make deb` or hack/make/build-deb" - exit 1 -fi - -test_deb_install(){ - # test for each Dockerfile in contrib/builder - - builderDir="contrib/builder/deb/${PACKAGE_ARCH}" - pkgs=( $(find "${builderDir}/"*/ -type d) ) - if [ ! -z "$DOCKER_BUILD_PKGS" ]; then - pkgs=() - for p in $DOCKER_BUILD_PKGS; do - pkgs+=( "$builderDir/$p" ) - done - fi - for dir in "${pkgs[@]}"; do - [ -d "$dir" ] || { echo >&2 "skipping nonexistent $dir"; continue; } - local from="$(awk 'toupper($1) == "FROM" { print $2; exit }' "$dir/Dockerfile")" - local dir=$(basename "$dir") - - if [[ ! -d "${DEB_DIR}/${dir}" ]]; then - echo "No deb found for ${dir}" - exit 1 - fi - - local script=$(mktemp /tmp/install-XXXXXXXXXX.sh) - cat <<-EOF > "${script}" - #!/bin/bash - set -e - set -x - - apt-get update && apt-get install -y apparmor - - dpkg -i /root/debs/*.deb || true - - apt-get install -yf - - /etc/init.d/apparmor start - - # this will do everything _except_ load the profile into the kernel - ( - cd /etc/apparmor.d - /sbin/apparmor_parser --skip-kernel-load docker-engine - ) - EOF - - chmod +x "${script}" - - echo "testing deb install for ${from}" - docker run --rm -i --privileged \ - -v ${DEB_DIR}/${dir}:/root/debs \ - -v ${script}:/install.sh \ - ${from} /install.sh - - rm -f ${script} - done -} - -( - bundle .integration-daemon-start - test_deb_install - bundle .integration-daemon-stop -) 2>&1 | tee -a "$DEST/test.log" diff --git a/vendor/github.com/docker/docker/hack/make/test-docker-py b/vendor/github.com/docker/docker/hack/make/test-docker-py deleted file mode 100644 index fcacc1643..000000000 --- a/vendor/github.com/docker/docker/hack/make/test-docker-py +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -set -e - -source hack/make/.integration-test-helpers - -# subshell so that we can export PATH without breaking other things -( - bundle .integration-daemon-start - - dockerPy='/docker-py' - [ -d "$dockerPy" ] || { - dockerPy="$DEST/docker-py" - git clone https://github.com/docker/docker-py.git "$dockerPy" - } - - # exporting PYTHONPATH to import "docker" from our local docker-py - test_env PYTHONPATH="$dockerPy" py.test --junitxml="$DEST/results.xml" "$dockerPy/tests/integration" - - bundle .integration-daemon-stop -) 2>&1 | tee -a "$DEST/test.log" diff --git a/vendor/github.com/docker/docker/hack/make/test-install-script b/vendor/github.com/docker/docker/hack/make/test-install-script deleted file mode 100755 index 4782cbea8..000000000 --- a/vendor/github.com/docker/docker/hack/make/test-install-script +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# This script is used for testing install.sh and that it works for -# each of component of our apt and yum repos -set -e - -test_install_script(){ - # these are equivalent to main, testing, experimental components - # in the repos, but its the url that will do the conversion - components=( experimental test get ) - - for component in "${components[@]}"; do - # change url to specific component for testing - local test_url=https://${component}.docker.com - local script=$(mktemp /tmp/install-XXXXXXXXXX.sh) - sed "s,url='https://get.docker.com/',url='${test_url}/'," hack/install.sh > "${script}" - - chmod +x "${script}" - - # test for each Dockerfile in contrib/builder - for dir in contrib/builder/*/*/; do - local from="$(awk 'toupper($1) == "FROM" { print $2; exit }' "$dir/Dockerfile")" - - echo "running install.sh for ${component} with ${from}" - docker run --rm -i -v ${script}:/install.sh ${from} /install.sh - done - - rm -f ${script} - done -} - -test_install_script diff --git a/vendor/github.com/docker/docker/hack/make/test-integration-cli b/vendor/github.com/docker/docker/hack/make/test-integration-cli deleted file mode 100755 index 689a5285f..000000000 --- a/vendor/github.com/docker/docker/hack/make/test-integration-cli +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -set -e - -source hack/make/.integration-test-helpers - -# subshell so that we can export PATH without breaking other things -( - bundle .integration-daemon-start - - bundle .integration-daemon-setup - - bundle_test_integration_cli - - bundle .integration-daemon-stop - - if [ "$(go env GOOS)" != 'windows' ] - then - leftovers=$(ps -ax -o pid,cmd | awk '$2 == "docker-containerd-shim" && $4 ~ /.*\/bundles\/.*\/test-integration-cli/ { print $1 }') - if [ -n "$leftovers" ] - then - ps aux - kill -9 $leftovers 2> /dev/null - echo "!!!! WARNING you have left over shim(s), Cleanup your test !!!!" - exit 1 - fi - fi - -) 2>&1 | tee -a "$DEST/test.log" diff --git a/vendor/github.com/docker/docker/hack/make/test-integration-shell b/vendor/github.com/docker/docker/hack/make/test-integration-shell deleted file mode 100644 index 86df9654a..000000000 --- a/vendor/github.com/docker/docker/hack/make/test-integration-shell +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -bundle .integration-daemon-start -bundle .integration-daemon-setup - -export ABS_DEST -bash +e diff --git a/vendor/github.com/docker/docker/hack/make/test-old-apt-repo b/vendor/github.com/docker/docker/hack/make/test-old-apt-repo deleted file mode 100755 index bb20128e3..000000000 --- a/vendor/github.com/docker/docker/hack/make/test-old-apt-repo +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -set -e - -versions=( 1.3.3 1.4.1 1.5.0 1.6.2 ) - -install() { - local version=$1 - local tmpdir=$(mktemp -d /tmp/XXXXXXXXXX) - local dockerfile="${tmpdir}/Dockerfile" - cat <<-EOF > "$dockerfile" - FROM debian:jessie - ENV VERSION ${version} - RUN apt-get update && apt-get install -y \ - apt-transport-https \ - ca-certificates \ - --no-install-recommends - RUN echo "deb https://get.docker.com/ubuntu docker main" > /etc/apt/sources.list.d/docker.list - RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 \ - --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 - RUN apt-get update && apt-get install -y \ - lxc-docker-\${VERSION} - EOF - - docker build --rm --force-rm --no-cache -t docker-old-repo:${version} -f $dockerfile $tmpdir -} - -for v in "${versions[@]}"; do - install "$v" -done diff --git a/vendor/github.com/docker/docker/hack/make/test-unit b/vendor/github.com/docker/docker/hack/make/test-unit deleted file mode 100644 index f263345ce..000000000 --- a/vendor/github.com/docker/docker/hack/make/test-unit +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash -set -e - -# Run Docker's test suite, including sub-packages, and store their output as a bundle -# If $TESTFLAGS is set in the environment, it is passed as extra arguments to 'go test'. -# You can use this to select certain tests to run, e.g. -# -# TESTFLAGS='-test.run ^TestBuild$' ./hack/make.sh test-unit -# -bundle_test_unit() { - TESTFLAGS+=" -test.timeout=${TIMEOUT}" - INCBUILD="-i" - count=0 - for flag in "${BUILDFLAGS[@]}"; do - if [ "${flag}" == ${INCBUILD} ]; then - unset BUILDFLAGS[${count}] - break - fi - count=$[ ${count} + 1 ] - done - - date - if [ -z "$TESTDIRS" ]; then - TEST_PATH=./... - else - TEST_PATH=./${TESTDIRS} - fi - - if [ "$(go env GOHOSTOS)" = 'solaris' ]; then - pkg_list=$(go list -e \ - -f '{{if ne .Name "github.com/docker/docker"}} - {{.ImportPath}} - {{end}}' \ - "${BUILDFLAGS[@]}" $TEST_PATH \ - | grep github.com/docker/docker \ - | grep -v github.com/docker/docker/vendor \ - | grep -v github.com/docker/docker/daemon/graphdriver \ - | grep -v github.com/docker/docker/man \ - | grep -v github.com/docker/docker/integration-cli) - else - pkg_list=$(go list -e \ - -f '{{if ne .Name "github.com/docker/docker"}} - {{.ImportPath}} - {{end}}' \ - "${BUILDFLAGS[@]}" $TEST_PATH \ - | grep github.com/docker/docker \ - | grep -v github.com/docker/docker/vendor \ - | grep -v github.com/docker/docker/man \ - | grep -v github.com/docker/docker/integration-cli) - fi - - go test -cover -ldflags "$LDFLAGS" "${BUILDFLAGS[@]}" $TESTFLAGS $pkg_list -} - -bundle_test_unit 2>&1 | tee -a "$DEST/test.log" diff --git a/vendor/github.com/docker/docker/hack/make/tgz b/vendor/github.com/docker/docker/hack/make/tgz deleted file mode 100644 index 3ccd93fa0..000000000 --- a/vendor/github.com/docker/docker/hack/make/tgz +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/bash - -CROSS="$DEST/../cross" - -set -e - -arch=$(go env GOHOSTARCH) -if [ ! -d "$CROSS/linux/${arch}" ]; then - echo >&2 'error: binary and cross must be run before tgz' - false -fi - -( -for d in "$CROSS/"*/*; do - export GOARCH="$(basename "$d")" - export GOOS="$(basename "$(dirname "$d")")" - - source "${MAKEDIR}/.binary-setup" - - BINARY_NAME="${DOCKER_CLIENT_BINARY_NAME}-$VERSION" - DAEMON_BINARY_NAME="${DOCKER_DAEMON_BINARY_NAME}-$VERSION" - PROXY_BINARY_NAME="${DOCKER_PROXY_BINARY_NAME}-$VERSION" - BINARY_EXTENSION="$(export GOOS && binary_extension)" - if [ "$GOOS" = 'windows' ]; then - # if windows use a zip, not tgz - BUNDLE_EXTENSION=".zip" - IS_TAR="false" - elif [ "$GOOS" == "solaris" ]; then - # Solaris bypasses cross due to CGO issues. - continue - else - BUNDLE_EXTENSION=".tgz" - IS_TAR="true" - fi - BINARY_FULLNAME="$BINARY_NAME$BINARY_EXTENSION" - DAEMON_BINARY_FULLNAME="$DAEMON_BINARY_NAME$BINARY_EXTENSION" - PROXY_BINARY_FULLNAME="$PROXY_BINARY_NAME$BINARY_EXTENSION" - mkdir -p "$DEST/$GOOS/$GOARCH" - TGZ="$DEST/$GOOS/$GOARCH/$BINARY_NAME$BUNDLE_EXTENSION" - - # The staging directory for the files in the tgz - BUILD_PATH="$DEST/build" - - # The directory that is at the root of the tar file - TAR_BASE_DIRECTORY="docker" - - # $DEST/build/docker - TAR_PATH="$BUILD_PATH/$TAR_BASE_DIRECTORY" - - # Copy the correct docker binary - mkdir -p $TAR_PATH - cp -L "$d/$BINARY_FULLNAME" "$TAR_PATH/${DOCKER_CLIENT_BINARY_NAME}${BINARY_EXTENSION}" - if [ -f "$d/$DAEMON_BINARY_FULLNAME" ]; then - cp -L "$d/$DAEMON_BINARY_FULLNAME" "$TAR_PATH/${DOCKER_DAEMON_BINARY_NAME}${BINARY_EXTENSION}" - fi - if [ -f "$d/$PROXY_BINARY_FULLNAME" ]; then - cp -L "$d/$PROXY_BINARY_FULLNAME" "$TAR_PATH/${DOCKER_PROXY_BINARY_NAME}${BINARY_EXTENSION}" - fi - - # copy over all the extra binaries - copy_binaries $TAR_PATH - - # add completions - for s in bash fish zsh; do - mkdir -p $TAR_PATH/completion/$s - cp -L contrib/completion/$s/*docker* $TAR_PATH/completion/$s/ - done - - if [ "$IS_TAR" == "true" ]; then - echo "Creating tgz from $BUILD_PATH and naming it $TGZ" - tar --numeric-owner --owner 0 -C "$BUILD_PATH" -czf "$TGZ" $TAR_BASE_DIRECTORY - else - # ZIP needs to full absolute dir path, not the absolute path - ZIP=`pwd`"/$TGZ" - # keep track of where we are, for later. - pushd . - # go into the BUILD_PATH since zip does not have a -C equivalent. - cd $BUILD_PATH - echo "Creating zip from $BUILD_PATH and naming it $ZIP" - zip -q -r $ZIP $TAR_BASE_DIRECTORY - # go back to where we started - popd - fi - - hash_files "$TGZ" - - # cleanup after ourselves - rm -rf "$BUILD_PATH" - - echo "Created tgz: $TGZ" -done -) diff --git a/vendor/github.com/docker/docker/hack/make/ubuntu b/vendor/github.com/docker/docker/hack/make/ubuntu deleted file mode 100644 index 8de5d9cea..000000000 --- a/vendor/github.com/docker/docker/hack/make/ubuntu +++ /dev/null @@ -1,190 +0,0 @@ -#!/bin/bash - -PKGVERSION="${VERSION//-/'~'}" -# if we have a "-dev" suffix or have change in Git, let's make this package version more complex so it works better -if [[ "$VERSION" == *-dev ]] || [ -n "$(git status --porcelain)" ]; then - GIT_UNIX="$(git log -1 --pretty='%at')" - GIT_DATE="$(date --date "@$GIT_UNIX" +'%Y%m%d.%H%M%S')" - GIT_COMMIT="$(git log -1 --pretty='%h')" - GIT_VERSION="git${GIT_DATE}.0.${GIT_COMMIT}" - # GIT_VERSION is now something like 'git20150128.112847.0.17e840a' - PKGVERSION="$PKGVERSION~$GIT_VERSION" -fi - -# $ dpkg --compare-versions 1.5.0 gt 1.5.0~rc1 && echo true || echo false -# true -# $ dpkg --compare-versions 1.5.0~rc1 gt 1.5.0~git20150128.112847.17e840a && echo true || echo false -# true -# $ dpkg --compare-versions 1.5.0~git20150128.112847.17e840a gt 1.5.0~dev~git20150128.112847.17e840a && echo true || echo false -# true - -# ie, 1.5.0 > 1.5.0~rc1 > 1.5.0~git20150128.112847.17e840a > 1.5.0~dev~git20150128.112847.17e840a - -PACKAGE_ARCHITECTURE="$(dpkg-architecture -qDEB_HOST_ARCH)" -PACKAGE_URL="https://www.docker.com/" -PACKAGE_MAINTAINER="support@docker.com" -PACKAGE_DESCRIPTION="Linux container runtime -Docker complements LXC with a high-level API which operates at the process -level. It runs unix processes with strong guarantees of isolation and -repeatability across servers. -Docker is a great building block for automating distributed systems: -large-scale web deployments, database clusters, continuous deployment systems, -private PaaS, service-oriented architectures, etc." -PACKAGE_LICENSE="Apache-2.0" - -# Build docker as an ubuntu package using FPM and REPREPRO (sue me). -# bundle_binary must be called first. -bundle_ubuntu() { - DIR="$ABS_DEST/build" - - # Include our udev rules - mkdir -p "$DIR/etc/udev/rules.d" - cp contrib/udev/80-docker.rules "$DIR/etc/udev/rules.d/" - - # Include our init scripts - mkdir -p "$DIR/etc/init" - cp contrib/init/upstart/docker.conf "$DIR/etc/init/" - mkdir -p "$DIR/etc/init.d" - cp contrib/init/sysvinit-debian/docker "$DIR/etc/init.d/" - mkdir -p "$DIR/etc/default" - cp contrib/init/sysvinit-debian/docker.default "$DIR/etc/default/docker" - mkdir -p "$DIR/lib/systemd/system" - cp contrib/init/systemd/docker.{service,socket} "$DIR/lib/systemd/system/" - - # Include contributed completions - mkdir -p "$DIR/etc/bash_completion.d" - cp contrib/completion/bash/docker "$DIR/etc/bash_completion.d/" - mkdir -p "$DIR/usr/share/zsh/vendor-completions" - cp contrib/completion/zsh/_docker "$DIR/usr/share/zsh/vendor-completions/" - mkdir -p "$DIR/etc/fish/completions" - cp contrib/completion/fish/docker.fish "$DIR/etc/fish/completions/" - - # Include man pages - make manpages - manRoot="$DIR/usr/share/man" - mkdir -p "$manRoot" - for manDir in man/man?; do - manBase="$(basename "$manDir")" # "man1" - for manFile in "$manDir"/*; do - manName="$(basename "$manFile")" # "docker-build.1" - mkdir -p "$manRoot/$manBase" - gzip -c "$manFile" > "$manRoot/$manBase/$manName.gz" - done - done - - # Copy the binary - # This will fail if the binary bundle hasn't been built - mkdir -p "$DIR/usr/bin" - cp "$DEST/../binary/docker-$VERSION" "$DIR/usr/bin/docker" - - # Generate postinst/prerm/postrm scripts - cat > "$DEST/postinst" <<'EOF' -#!/bin/sh -set -e -set -u - -if [ "$1" = 'configure' ] && [ -z "$2" ]; then - if ! getent group docker > /dev/null; then - groupadd --system docker - fi -fi - -if ! { [ -x /sbin/initctl ] && /sbin/initctl version 2>/dev/null | grep -q upstart; }; then - # we only need to do this if upstart isn't in charge - update-rc.d docker defaults > /dev/null || true -fi -if [ -n "$2" ]; then - _dh_action=restart -else - _dh_action=start -fi -service docker $_dh_action 2>/dev/null || true - -#DEBHELPER# -EOF - cat > "$DEST/prerm" <<'EOF' -#!/bin/sh -set -e -set -u - -service docker stop 2>/dev/null || true - -#DEBHELPER# -EOF - cat > "$DEST/postrm" <<'EOF' -#!/bin/sh -set -e -set -u - -if [ "$1" = "purge" ] ; then - update-rc.d docker remove > /dev/null || true -fi - -# In case this system is running systemd, we make systemd reload the unit files -# to pick up changes. -if [ -d /run/systemd/system ] ; then - systemctl --system daemon-reload > /dev/null || true -fi - -#DEBHELPER# -EOF - # TODO swaths of these were borrowed from debhelper's auto-inserted stuff, because we're still using fpm - we need to use debhelper instead, and somehow reconcile Ubuntu that way - chmod +x "$DEST/postinst" "$DEST/prerm" "$DEST/postrm" - - ( - # switch directories so we create *.deb in the right folder - cd "$DEST" - - # create lxc-docker-VERSION package - fpm -s dir -C "$DIR" \ - --name "lxc-docker-$VERSION" --version "$PKGVERSION" \ - --after-install "$ABS_DEST/postinst" \ - --before-remove "$ABS_DEST/prerm" \ - --after-remove "$ABS_DEST/postrm" \ - --architecture "$PACKAGE_ARCHITECTURE" \ - --prefix / \ - --depends iptables \ - --deb-recommends aufs-tools \ - --deb-recommends ca-certificates \ - --deb-recommends git \ - --deb-recommends xz-utils \ - --deb-recommends 'cgroupfs-mount | cgroup-lite' \ - --deb-suggests apparmor \ - --description "$PACKAGE_DESCRIPTION" \ - --maintainer "$PACKAGE_MAINTAINER" \ - --conflicts docker \ - --conflicts docker.io \ - --conflicts lxc-docker-virtual-package \ - --provides lxc-docker \ - --provides lxc-docker-virtual-package \ - --replaces lxc-docker \ - --replaces lxc-docker-virtual-package \ - --url "$PACKAGE_URL" \ - --license "$PACKAGE_LICENSE" \ - --config-files /etc/udev/rules.d/80-docker.rules \ - --config-files /etc/init/docker.conf \ - --config-files /etc/init.d/docker \ - --config-files /etc/default/docker \ - --deb-compression gz \ - -t deb . - # TODO replace "Suggests: cgroup-lite" with "Recommends: cgroupfs-mount | cgroup-lite" once cgroupfs-mount is available - - # create empty lxc-docker wrapper package - fpm -s empty \ - --name lxc-docker --version "$PKGVERSION" \ - --architecture "$PACKAGE_ARCHITECTURE" \ - --depends lxc-docker-$VERSION \ - --description "$PACKAGE_DESCRIPTION" \ - --maintainer "$PACKAGE_MAINTAINER" \ - --url "$PACKAGE_URL" \ - --license "$PACKAGE_LICENSE" \ - --deb-compression gz \ - -t deb - ) - - # clean up after ourselves so we have a clean output directory - rm "$DEST/postinst" "$DEST/prerm" "$DEST/postrm" - rm -r "$DIR" -} - -bundle_ubuntu diff --git a/vendor/github.com/docker/docker/hack/make/update-apt-repo b/vendor/github.com/docker/docker/hack/make/update-apt-repo deleted file mode 100755 index 7354a2ecf..000000000 --- a/vendor/github.com/docker/docker/hack/make/update-apt-repo +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash -set -e - -# This script updates the apt repo in $DOCKER_RELEASE_DIR/apt/repo. -# This script is a "fix all" for any sort of problems that might have occurred with -# the Release or Package files in the repo. -# It should only be used in the rare case of extreme emergencies to regenerate -# Release and Package files for the apt repo. -# -# NOTE: Always be sure to re-sign the repo with hack/make/sign-repos after running -# this script. - -: ${DOCKER_RELEASE_DIR:=$DEST} -APTDIR=$DOCKER_RELEASE_DIR/apt/repo - -# supported arches/sections -arches=( amd64 i386 ) - -# Preserve existing components but don't add any non-existing ones -for component in main testing experimental ; do - if ls "$APTDIR/dists/*/$component" >/dev/null 2>&1 ; then - components+=( $component ) - fi -done - -dists=( $(find "${APTDIR}/dists" -maxdepth 1 -mindepth 1 -type d) ) - -# override component if it is set -if [ "$COMPONENT" ]; then - components=( $COMPONENT ) -fi - -# release the debs -for version in "${dists[@]}"; do - for component in "${components[@]}"; do - codename="${version//debootstrap-}" - - # update the filelist for this codename/component - find "$APTDIR/pool/$component" \ - -name *~${codename#*-}*.deb > "$APTDIR/dists/$codename/$component/filelist" - done -done - -# run the apt-ftparchive commands so we can have pinning -apt-ftparchive generate "$APTDIR/conf/apt-ftparchive.conf" - -for dist in "${dists[@]}"; do - version=$(basename "$dist") - for component in "${components[@]}"; do - codename="${version//debootstrap-}" - - apt-ftparchive \ - -o "APT::FTPArchive::Release::Codename=$codename" \ - -o "APT::FTPArchive::Release::Suite=$codename" \ - -c "$APTDIR/conf/docker-engine-release.conf" \ - release \ - "$APTDIR/dists/$codename" > "$APTDIR/dists/$codename/Release" - - for arch in "${arches[@]}"; do - apt-ftparchive \ - -o "APT::FTPArchive::Release::Codename=$codename" \ - -o "APT::FTPArchive::Release::Suite=$codename" \ - -o "APT::FTPArchive::Release::Component=$component" \ - -o "APT::FTPArchive::Release::Architecture=$arch" \ - -c "$APTDIR/conf/docker-engine-release.conf" \ - release \ - "$APTDIR/dists/$codename/$component/binary-$arch" > "$APTDIR/dists/$codename/$component/binary-$arch/Release" - done - done -done diff --git a/vendor/github.com/docker/docker/hack/make/win b/vendor/github.com/docker/docker/hack/make/win deleted file mode 100644 index f9f411127..000000000 --- a/vendor/github.com/docker/docker/hack/make/win +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -set -e - -# explicit list of os/arch combos that support being a daemon -declare -A daemonSupporting -daemonSupporting=( - [linux/amd64]=1 - [windows/amd64]=1 -) -platform="windows/amd64" -export DEST="$DEST/$platform" # bundles/VERSION/cross/GOOS/GOARCH/docker-VERSION -mkdir -p "$DEST" -ABS_DEST="$(cd "$DEST" && pwd -P)" -export GOOS=${platform%/*} -export GOARCH=${platform##*/} -if [ -z "${daemonSupporting[$platform]}" ]; then - export LDFLAGS_STATIC_DOCKER="" # we just need a simple client for these platforms - export BUILDFLAGS=( "${ORIG_BUILDFLAGS[@]/ daemon/}" ) # remove the "daemon" build tag from platforms that aren't supported -fi -source "${MAKEDIR}/binary" diff --git a/vendor/github.com/docker/docker/hack/release.sh b/vendor/github.com/docker/docker/hack/release.sh deleted file mode 100755 index 4b020537e..000000000 --- a/vendor/github.com/docker/docker/hack/release.sh +++ /dev/null @@ -1,325 +0,0 @@ -#!/usr/bin/env bash -set -e - -# This script looks for bundles built by make.sh, and releases them on a -# public S3 bucket. -# -# Bundles should be available for the VERSION string passed as argument. -# -# The correct way to call this script is inside a container built by the -# official Dockerfile at the root of the Docker source code. The Dockerfile, -# make.sh and release.sh should all be from the same source code revision. - -set -o pipefail - -# Print a usage message and exit. -usage() { - cat >&2 <<'EOF' -To run, I need: -- to be in a container generated by the Dockerfile at the top of the Docker - repository; -- to be provided with the location of an S3 bucket and path, in - environment variables AWS_S3_BUCKET and AWS_S3_BUCKET_PATH (default: ''); -- to be provided with AWS credentials for this S3 bucket, in environment - variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY; -- a generous amount of good will and nice manners. -The canonical way to run me is to run the image produced by the Dockerfile: e.g.:" - -docker run -e AWS_S3_BUCKET=test.docker.com \ - -e AWS_ACCESS_KEY_ID \ - -e AWS_SECRET_ACCESS_KEY \ - -e AWS_DEFAULT_REGION \ - -it --privileged \ - docker ./hack/release.sh -EOF - exit 1 -} - -[ "$AWS_S3_BUCKET" ] || usage -[ "$AWS_ACCESS_KEY_ID" ] || usage -[ "$AWS_SECRET_ACCESS_KEY" ] || usage -[ -d /go/src/github.com/docker/docker ] || usage -cd /go/src/github.com/docker/docker -[ -x hack/make.sh ] || usage - -export AWS_DEFAULT_REGION -: ${AWS_DEFAULT_REGION:=us-west-1} - -AWS_CLI=${AWS_CLI:-'aws'} - -RELEASE_BUNDLES=( - binary - cross - tgz -) - -if [ "$1" != '--release-regardless-of-test-failure' ]; then - RELEASE_BUNDLES=( - test-unit - "${RELEASE_BUNDLES[@]}" - test-integration-cli - ) -fi - -VERSION=$(< VERSION) -BUCKET=$AWS_S3_BUCKET -BUCKET_PATH=$BUCKET -[[ -n "$AWS_S3_BUCKET_PATH" ]] && BUCKET_PATH+=/$AWS_S3_BUCKET_PATH - -if command -v git &> /dev/null && git rev-parse &> /dev/null; then - if [ -n "$(git status --porcelain --untracked-files=no)" ]; then - echo "You cannot run the release script on a repo with uncommitted changes" - usage - fi -fi - -# These are the 2 keys we've used to sign the deb's -# release (get.docker.com) -# GPG_KEY="36A1D7869245C8950F966E92D8576A8BA88D21E9" -# test (test.docker.com) -# GPG_KEY="740B314AE3941731B942C66ADF4FD13717AAD7D6" - -setup_s3() { - echo "Setting up S3" - # Try creating the bucket. Ignore errors (it might already exist). - $AWS_CLI s3 mb "s3://$BUCKET" 2>/dev/null || true - # Check access to the bucket. - $AWS_CLI s3 ls "s3://$BUCKET" >/dev/null - # Make the bucket accessible through website endpoints. - $AWS_CLI s3 website --index-document index --error-document error "s3://$BUCKET" -} - -# write_to_s3 uploads the contents of standard input to the specified S3 url. -write_to_s3() { - DEST=$1 - F=`mktemp` - cat > "$F" - $AWS_CLI s3 cp --acl public-read --content-type 'text/plain' "$F" "$DEST" - rm -f "$F" -} - -s3_url() { - case "$BUCKET" in - get.docker.com|test.docker.com|experimental.docker.com) - echo "https://$BUCKET_PATH" - ;; - *) - BASE_URL="http://${BUCKET}.s3-website-${AWS_DEFAULT_REGION}.amazonaws.com" - if [[ -n "$AWS_S3_BUCKET_PATH" ]] ; then - echo "$BASE_URL/$AWS_S3_BUCKET_PATH" - else - echo "$BASE_URL" - fi - ;; - esac -} - -build_all() { - echo "Building release" - if ! ./hack/make.sh "${RELEASE_BUNDLES[@]}"; then - echo >&2 - echo >&2 'The build or tests appear to have failed.' - echo >&2 - echo >&2 'You, as the release maintainer, now have a couple options:' - echo >&2 '- delay release and fix issues' - echo >&2 '- delay release and fix issues' - echo >&2 '- did we mention how important this is? issues need fixing :)' - echo >&2 - echo >&2 'As a final LAST RESORT, you (because only you, the release maintainer,' - echo >&2 ' really knows all the hairy problems at hand with the current release' - echo >&2 ' issues) may bypass this checking by running this script again with the' - echo >&2 ' single argument of "--release-regardless-of-test-failure", which will skip' - echo >&2 ' running the test suite, and will only build the binaries and packages. Please' - echo >&2 ' avoid using this if at all possible.' - echo >&2 - echo >&2 'Regardless, we cannot stress enough the scarcity with which this bypass' - echo >&2 ' should be used. If there are release issues, we should always err on the' - echo >&2 ' side of caution.' - echo >&2 - exit 1 - fi -} - -upload_release_build() { - src="$1" - dst="$2" - latest="$3" - - echo - echo "Uploading $src" - echo " to $dst" - echo - $AWS_CLI s3 cp --follow-symlinks --acl public-read "$src" "$dst" - if [ "$latest" ]; then - echo - echo "Copying to $latest" - echo - $AWS_CLI s3 cp --acl public-read "$dst" "$latest" - fi - - # get hash files too (see hash_files() in hack/make.sh) - for hashAlgo in md5 sha256; do - if [ -e "$src.$hashAlgo" ]; then - echo - echo "Uploading $src.$hashAlgo" - echo " to $dst.$hashAlgo" - echo - $AWS_CLI s3 cp --follow-symlinks --acl public-read --content-type='text/plain' "$src.$hashAlgo" "$dst.$hashAlgo" - if [ "$latest" ]; then - echo - echo "Copying to $latest.$hashAlgo" - echo - $AWS_CLI s3 cp --acl public-read "$dst.$hashAlgo" "$latest.$hashAlgo" - fi - fi - done -} - -release_build() { - echo "Releasing binaries" - GOOS=$1 - GOARCH=$2 - - binDir=bundles/$VERSION/cross/$GOOS/$GOARCH - tgzDir=bundles/$VERSION/tgz/$GOOS/$GOARCH - binary=docker-$VERSION - zipExt=".tgz" - binaryExt="" - tgz=$binary$zipExt - - latestBase= - if [ -z "$NOLATEST" ]; then - latestBase=docker-latest - fi - - # we need to map our GOOS and GOARCH to uname values - # see https://en.wikipedia.org/wiki/Uname - # ie, GOOS=linux -> "uname -s"=Linux - - s3Os=$GOOS - case "$s3Os" in - darwin) - s3Os=Darwin - ;; - freebsd) - s3Os=FreeBSD - ;; - linux) - s3Os=Linux - ;; - solaris) - echo skipping solaris release - return 0 - ;; - windows) - # this is windows use the .zip and .exe extensions for the files. - s3Os=Windows - zipExt=".zip" - binaryExt=".exe" - tgz=$binary$zipExt - binary+=$binaryExt - ;; - *) - echo >&2 "error: can't convert $s3Os to an appropriate value for 'uname -s'" - exit 1 - ;; - esac - - s3Arch=$GOARCH - case "$s3Arch" in - amd64) - s3Arch=x86_64 - ;; - 386) - s3Arch=i386 - ;; - arm) - s3Arch=armel - # someday, we might potentially support multiple GOARM values, in which case we might get armhf here too - ;; - *) - echo >&2 "error: can't convert $s3Arch to an appropriate value for 'uname -m'" - exit 1 - ;; - esac - - s3Dir="s3://$BUCKET_PATH/builds/$s3Os/$s3Arch" - # latest= - latestTgz= - if [ "$latestBase" ]; then - # commented out since we aren't uploading binaries right now. - # latest="$s3Dir/$latestBase$binaryExt" - # we don't include the $binaryExt because we don't want docker.exe.zip - latestTgz="$s3Dir/$latestBase$zipExt" - fi - - if [ ! -f "$tgzDir/$tgz" ]; then - echo >&2 "error: can't find $tgzDir/$tgz - was it packaged properly?" - exit 1 - fi - # disable binary uploads for now. Only providing tgz downloads - # upload_release_build "$binDir/$binary" "$s3Dir/$binary" "$latest" - upload_release_build "$tgzDir/$tgz" "$s3Dir/$tgz" "$latestTgz" -} - -# Upload binaries and tgz files to S3 -release_binaries() { - [ "$(find bundles/$VERSION -path "bundles/$VERSION/cross/*/*/docker-$VERSION")" != "" ] || { - echo >&2 './hack/make.sh must be run before release_binaries' - exit 1 - } - - for d in bundles/$VERSION/cross/*/*; do - GOARCH="$(basename "$d")" - GOOS="$(basename "$(dirname "$d")")" - release_build "$GOOS" "$GOARCH" - done - - # TODO create redirect from builds/*/i686 to builds/*/i386 - - cat < /dev/null - # Let see if the working directory is clean - diffs="$(git status --porcelain -- cli/compose/schema 2>/dev/null)" - if [ "$diffs" ]; then - { - echo 'The result of `go generate github.com/docker/docker/cli/compose/schema` differs' - echo - echo "$diffs" - echo - echo 'Please run `go generate github.com/docker/docker/cli/compose/schema`' - } >&2 - false - else - echo 'Congratulations! cli/compose/schema/bindata.go is up-to-date.' - fi -else - echo 'No cli/compose/schema/data changes in diff.' -fi diff --git a/vendor/github.com/docker/docker/hack/validate/dco b/vendor/github.com/docker/docker/hack/validate/dco deleted file mode 100755 index 754ce8fae..000000000 --- a/vendor/github.com/docker/docker/hack/validate/dco +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "${SCRIPTDIR}/.validate" - -adds=$(validate_diff --numstat | awk '{ s += $1 } END { print s }') -dels=$(validate_diff --numstat | awk '{ s += $2 } END { print s }') -#notDocs="$(validate_diff --numstat | awk '$3 !~ /^docs\// { print $3 }')" - -: ${adds:=0} -: ${dels:=0} - -# "Username may only contain alphanumeric characters or dashes and cannot begin with a dash" -githubUsernameRegex='[a-zA-Z0-9][a-zA-Z0-9-]+' - -# https://github.com/docker/docker/blob/master/CONTRIBUTING.md#sign-your-work -dcoPrefix='Signed-off-by:' -dcoRegex="^(Docker-DCO-1.1-)?$dcoPrefix ([^<]+) <([^<>@]+@[^<>]+)>( \\(github: ($githubUsernameRegex)\\))?$" - -check_dco() { - grep -qE "$dcoRegex" -} - -if [ $adds -eq 0 -a $dels -eq 0 ]; then - echo '0 adds, 0 deletions; nothing to validate! :)' -else - commits=( $(validate_log --format='format:%H%n') ) - badCommits=() - for commit in "${commits[@]}"; do - if [ -z "$(git log -1 --format='format:' --name-status "$commit")" ]; then - # no content (ie, Merge commit, etc) - continue - fi - if ! git log -1 --format='format:%B' "$commit" | check_dco; then - badCommits+=( "$commit" ) - fi - done - if [ ${#badCommits[@]} -eq 0 ]; then - echo "Congratulations! All commits are properly signed with the DCO!" - else - { - echo "These commits do not have a proper '$dcoPrefix' marker:" - for commit in "${badCommits[@]}"; do - echo " - $commit" - done - echo - echo 'Please amend each commit to include a properly formatted DCO marker.' - echo - echo 'Visit the following URL for information about the Docker DCO:' - echo ' https://github.com/docker/docker/blob/master/CONTRIBUTING.md#sign-your-work' - echo - } >&2 - false - fi -fi diff --git a/vendor/github.com/docker/docker/hack/validate/default b/vendor/github.com/docker/docker/hack/validate/default deleted file mode 100755 index 29b96ca9a..000000000 --- a/vendor/github.com/docker/docker/hack/validate/default +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# -# Run default validation, exclude vendor because it's slow - -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -. $SCRIPTDIR/dco -. $SCRIPTDIR/default-seccomp -. $SCRIPTDIR/gofmt -. $SCRIPTDIR/lint -. $SCRIPTDIR/pkg-imports -. $SCRIPTDIR/swagger -. $SCRIPTDIR/swagger-gen -. $SCRIPTDIR/test-imports -. $SCRIPTDIR/toml -. $SCRIPTDIR/vet diff --git a/vendor/github.com/docker/docker/hack/validate/default-seccomp b/vendor/github.com/docker/docker/hack/validate/default-seccomp deleted file mode 100755 index 8fe843561..000000000 --- a/vendor/github.com/docker/docker/hack/validate/default-seccomp +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "${SCRIPTDIR}/.validate" - -IFS=$'\n' -files=( $(validate_diff --diff-filter=ACMR --name-only -- 'profiles/seccomp' || true) ) -unset IFS - -if [ ${#files[@]} -gt 0 ]; then - # We run 'go generate' and see if we have a diff afterwards - go generate ./profiles/seccomp/ >/dev/null - # Let see if the working directory is clean - diffs="$(git status --porcelain -- profiles/seccomp 2>/dev/null)" - if [ "$diffs" ]; then - { - echo 'The result of go generate ./profiles/seccomp/ differs' - echo - echo "$diffs" - echo - echo 'Please re-run go generate ./profiles/seccomp/' - echo - } >&2 - false - else - echo 'Congratulations! Seccomp profile generation is done correctly.' - fi -fi diff --git a/vendor/github.com/docker/docker/hack/validate/gofmt b/vendor/github.com/docker/docker/hack/validate/gofmt deleted file mode 100755 index 2040afa09..000000000 --- a/vendor/github.com/docker/docker/hack/validate/gofmt +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "${SCRIPTDIR}/.validate" - -IFS=$'\n' -files=( $(validate_diff --diff-filter=ACMR --name-only -- '*.go' | - grep -v '^vendor/' | - grep -v '^cli/compose/schema/bindata.go' || true) ) -unset IFS - -badFiles=() -for f in "${files[@]}"; do - # we use "git show" here to validate that what's committed is formatted - if [ "$(git show "$VALIDATE_HEAD:$f" | gofmt -s -l)" ]; then - badFiles+=( "$f" ) - fi -done - -if [ ${#badFiles[@]} -eq 0 ]; then - echo 'Congratulations! All Go source files are properly formatted.' -else - { - echo "These files are not properly gofmt'd:" - for f in "${badFiles[@]}"; do - echo " - $f" - done - echo - echo 'Please reformat the above files using "gofmt -s -w" and commit the result.' - echo - } >&2 - false -fi diff --git a/vendor/github.com/docker/docker/hack/validate/lint b/vendor/github.com/docker/docker/hack/validate/lint deleted file mode 100755 index 4ac0a33b2..000000000 --- a/vendor/github.com/docker/docker/hack/validate/lint +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "${SCRIPTDIR}/.validate" - -IFS=$'\n' -files=( $(validate_diff --diff-filter=ACMR --name-only -- '*.go' | grep -v '^vendor/' | grep -v '^api/types/container/' | grep -v '^cli/compose/schema/bindata.go' || true) ) -unset IFS - -errors=() -for f in "${files[@]}"; do - failedLint=$(golint "$f") - if [ "$failedLint" ]; then - errors+=( "$failedLint" ) - fi -done - -if [ ${#errors[@]} -eq 0 ]; then - echo 'Congratulations! All Go source files have been linted.' -else - { - echo "Errors from golint:" - for err in "${errors[@]}"; do - echo "$err" - done - echo - echo 'Please fix the above errors. You can test via "golint" and commit the result.' - echo - } >&2 - false -fi diff --git a/vendor/github.com/docker/docker/hack/validate/pkg-imports b/vendor/github.com/docker/docker/hack/validate/pkg-imports deleted file mode 100755 index 9e4ea74da..000000000 --- a/vendor/github.com/docker/docker/hack/validate/pkg-imports +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -set -e - -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "${SCRIPTDIR}/.validate" - -IFS=$'\n' -files=( $(validate_diff --diff-filter=ACMR --name-only -- 'pkg/*.go' || true) ) -unset IFS - -badFiles=() -for f in "${files[@]}"; do - IFS=$'\n' - badImports=( $(go list -e -f '{{ join .Deps "\n" }}' "$f" | sort -u | grep -vE '^github.com/docker/docker/pkg/' | grep -vE '^github.com/docker/docker/vendor' | grep -E '^github.com/docker/docker' || true) ) - unset IFS - - for import in "${badImports[@]}"; do - badFiles+=( "$f imports $import" ) - done -done - -if [ ${#badFiles[@]} -eq 0 ]; then - echo 'Congratulations! "./pkg/..." is safely isolated from internal code.' -else - { - echo 'These files import internal code: (either directly or indirectly)' - for f in "${badFiles[@]}"; do - echo " - $f" - done - echo - } >&2 - false -fi diff --git a/vendor/github.com/docker/docker/hack/validate/swagger b/vendor/github.com/docker/docker/hack/validate/swagger deleted file mode 100755 index e754fb8cb..000000000 --- a/vendor/github.com/docker/docker/hack/validate/swagger +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -set -e -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "${SCRIPTDIR}/.validate" - -IFS=$'\n' -files=( $(validate_diff --diff-filter=ACMR --name-only -- 'api/swagger.yaml' || true) ) -unset IFS - -if [ ${#files[@]} -gt 0 ]; then - yamllint -c ${SCRIPTDIR}/.swagger-yamllint api/swagger.yaml - swagger validate api/swagger.yaml -fi diff --git a/vendor/github.com/docker/docker/hack/validate/swagger-gen b/vendor/github.com/docker/docker/hack/validate/swagger-gen deleted file mode 100755 index 008abc7e0..000000000 --- a/vendor/github.com/docker/docker/hack/validate/swagger-gen +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "${SCRIPTDIR}/.validate" - -IFS=$'\n' -files=( $(validate_diff --diff-filter=ACMR --name-only -- 'api/types/' 'api/swagger.yaml' || true) ) -unset IFS - -if [ ${#files[@]} -gt 0 ]; then - ${SCRIPTDIR}/../generate-swagger-api.sh 2> /dev/null - # Let see if the working directory is clean - diffs="$(git status --porcelain -- api/types/ 2>/dev/null)" - if [ "$diffs" ]; then - { - echo 'The result of hack/generate-swagger-api.sh differs' - echo - echo "$diffs" - echo - echo 'Please update api/swagger.yaml with any api changes, then ' - echo 'run `hack/generate-swagger-api.sh`.' - } >&2 - false - else - echo 'Congratulations! All api changes are done the right way.' - fi -else - echo 'No api/types/ or api/swagger.yaml changes in diff.' -fi diff --git a/vendor/github.com/docker/docker/hack/validate/test-imports b/vendor/github.com/docker/docker/hack/validate/test-imports deleted file mode 100755 index 373caa2f2..000000000 --- a/vendor/github.com/docker/docker/hack/validate/test-imports +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -# Make sure we're not using gos' Testing package any more in integration-cli - -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "${SCRIPTDIR}/.validate" - -IFS=$'\n' -files=( $(validate_diff --diff-filter=ACMR --name-only -- 'integration-cli/*.go' || true) ) -unset IFS - -badFiles=() -for f in "${files[@]}"; do - # skip check_test.go since it *does* use the testing package - if [ "$f" = "integration-cli/check_test.go" ]; then - continue - fi - - # we use "git show" here to validate that what's committed doesn't contain golang built-in testing - if git show "$VALIDATE_HEAD:$f" | grep -q testing.T; then - if [ "$(echo $f | grep '_test')" ]; then - # allow testing.T for non- _test files - badFiles+=( "$f" ) - fi - fi -done - -if [ ${#badFiles[@]} -eq 0 ]; then - echo 'Congratulations! No testing.T found.' -else - { - echo "These files use the wrong testing infrastructure:" - for f in "${badFiles[@]}"; do - echo " - $f" - done - echo - } >&2 - false -fi diff --git a/vendor/github.com/docker/docker/hack/validate/toml b/vendor/github.com/docker/docker/hack/validate/toml deleted file mode 100755 index a0cb158db..000000000 --- a/vendor/github.com/docker/docker/hack/validate/toml +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "${SCRIPTDIR}/.validate" - -IFS=$'\n' -files=( $(validate_diff --diff-filter=ACMR --name-only -- 'MAINTAINERS' || true) ) -unset IFS - -badFiles=() -for f in "${files[@]}"; do - # we use "git show" here to validate that what's committed has valid toml syntax - if ! git show "$VALIDATE_HEAD:$f" | tomlv /proc/self/fd/0 ; then - badFiles+=( "$f" ) - fi -done - -if [ ${#badFiles[@]} -eq 0 ]; then - echo 'Congratulations! All toml source files changed here have valid syntax.' -else - { - echo "These files are not valid toml:" - for f in "${badFiles[@]}"; do - echo " - $f" - done - echo - echo 'Please reformat the above files as valid toml' - echo - } >&2 - false -fi diff --git a/vendor/github.com/docker/docker/hack/validate/vendor b/vendor/github.com/docker/docker/hack/validate/vendor deleted file mode 100755 index 0cb5aabdf..000000000 --- a/vendor/github.com/docker/docker/hack/validate/vendor +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "${SCRIPTDIR}/.validate" - -IFS=$'\n' -files=( $(validate_diff --diff-filter=ACMR --name-only -- 'vendor.conf' 'vendor/' || true) ) -unset IFS - -if [ ${#files[@]} -gt 0 ]; then - # We run vndr to and see if we have a diff afterwards - vndr - # Let see if the working directory is clean - diffs="$(git status --porcelain -- vendor 2>/dev/null)" - if [ "$diffs" ]; then - { - echo 'The result of vndr differs' - echo - echo "$diffs" - echo - echo 'Please vendor your package with github.com/LK4D4/vndr.' - echo - } >&2 - false - else - echo 'Congratulations! All vendoring changes are done the right way.' - fi -else - echo 'No vendor changes in diff.' -fi diff --git a/vendor/github.com/docker/docker/hack/validate/vet b/vendor/github.com/docker/docker/hack/validate/vet deleted file mode 100755 index 64760489e..000000000 --- a/vendor/github.com/docker/docker/hack/validate/vet +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -export SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "${SCRIPTDIR}/.validate" - -IFS=$'\n' -files=( $(validate_diff --diff-filter=ACMR --name-only -- '*.go' | grep -v '^vendor/' | grep -v '^api/types/container/' || true) ) -unset IFS - -errors=() -for f in "${files[@]}"; do - failedVet=$(go vet "$f") - if [ "$failedVet" ]; then - errors+=( "$failedVet" ) - fi -done - - -if [ ${#errors[@]} -eq 0 ]; then - echo 'Congratulations! All Go source files have been vetted.' -else - { - echo "Errors from go vet:" - for err in "${errors[@]}"; do - echo " - $err" - done - echo - echo 'Please fix the above errors. You can test via "go vet" and commit the result.' - echo - } >&2 - false -fi diff --git a/vendor/github.com/docker/docker/hack/vendor.sh b/vendor/github.com/docker/docker/hack/vendor.sh deleted file mode 100755 index 9a4d03853..000000000 --- a/vendor/github.com/docker/docker/hack/vendor.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -# This file is just wrapper around vndr (github.com/LK4D4/vndr) tool. -# For updating dependencies you should change `vendor.conf` file in root of the -# project. Please refer to https://github.com/LK4D4/vndr/blob/master/README.md for -# vndr usage. - -set -e - -if ! hash vndr; then - echo "Please install vndr with \"go get github.com/LK4D4/vndr\" and put it in your \$GOPATH" - exit 1 -fi - -vndr "$@" diff --git a/vendor/github.com/docker/docker/image/fs.go b/vendor/github.com/docker/docker/image/fs.go deleted file mode 100644 index 39cfbf5d7..000000000 --- a/vendor/github.com/docker/docker/image/fs.go +++ /dev/null @@ -1,173 +0,0 @@ -package image - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/pkg/ioutils" -) - -// DigestWalkFunc is function called by StoreBackend.Walk -type DigestWalkFunc func(id digest.Digest) error - -// StoreBackend provides interface for image.Store persistence -type StoreBackend interface { - Walk(f DigestWalkFunc) error - Get(id digest.Digest) ([]byte, error) - Set(data []byte) (digest.Digest, error) - Delete(id digest.Digest) error - SetMetadata(id digest.Digest, key string, data []byte) error - GetMetadata(id digest.Digest, key string) ([]byte, error) - DeleteMetadata(id digest.Digest, key string) error -} - -// fs implements StoreBackend using the filesystem. -type fs struct { - sync.RWMutex - root string -} - -const ( - contentDirName = "content" - metadataDirName = "metadata" -) - -// NewFSStoreBackend returns new filesystem based backend for image.Store -func NewFSStoreBackend(root string) (StoreBackend, error) { - return newFSStore(root) -} - -func newFSStore(root string) (*fs, error) { - s := &fs{ - root: root, - } - if err := os.MkdirAll(filepath.Join(root, contentDirName, string(digest.Canonical)), 0700); err != nil { - return nil, err - } - if err := os.MkdirAll(filepath.Join(root, metadataDirName, string(digest.Canonical)), 0700); err != nil { - return nil, err - } - return s, nil -} - -func (s *fs) contentFile(dgst digest.Digest) string { - return filepath.Join(s.root, contentDirName, string(dgst.Algorithm()), dgst.Hex()) -} - -func (s *fs) metadataDir(dgst digest.Digest) string { - return filepath.Join(s.root, metadataDirName, string(dgst.Algorithm()), dgst.Hex()) -} - -// Walk calls the supplied callback for each image ID in the storage backend. -func (s *fs) Walk(f DigestWalkFunc) error { - // Only Canonical digest (sha256) is currently supported - s.RLock() - dir, err := ioutil.ReadDir(filepath.Join(s.root, contentDirName, string(digest.Canonical))) - s.RUnlock() - if err != nil { - return err - } - for _, v := range dir { - dgst := digest.NewDigestFromHex(string(digest.Canonical), v.Name()) - if err := dgst.Validate(); err != nil { - logrus.Debugf("Skipping invalid digest %s: %s", dgst, err) - continue - } - if err := f(dgst); err != nil { - return err - } - } - return nil -} - -// Get returns the content stored under a given digest. -func (s *fs) Get(dgst digest.Digest) ([]byte, error) { - s.RLock() - defer s.RUnlock() - - return s.get(dgst) -} - -func (s *fs) get(dgst digest.Digest) ([]byte, error) { - content, err := ioutil.ReadFile(s.contentFile(dgst)) - if err != nil { - return nil, err - } - - // todo: maybe optional - if digest.FromBytes(content) != dgst { - return nil, fmt.Errorf("failed to verify: %v", dgst) - } - - return content, nil -} - -// Set stores content by checksum. -func (s *fs) Set(data []byte) (digest.Digest, error) { - s.Lock() - defer s.Unlock() - - if len(data) == 0 { - return "", fmt.Errorf("Invalid empty data") - } - - dgst := digest.FromBytes(data) - if err := ioutils.AtomicWriteFile(s.contentFile(dgst), data, 0600); err != nil { - return "", err - } - - return dgst, nil -} - -// Delete removes content and metadata files associated with the digest. -func (s *fs) Delete(dgst digest.Digest) error { - s.Lock() - defer s.Unlock() - - if err := os.RemoveAll(s.metadataDir(dgst)); err != nil { - return err - } - if err := os.Remove(s.contentFile(dgst)); err != nil { - return err - } - return nil -} - -// SetMetadata sets metadata for a given ID. It fails if there's no base file. -func (s *fs) SetMetadata(dgst digest.Digest, key string, data []byte) error { - s.Lock() - defer s.Unlock() - if _, err := s.get(dgst); err != nil { - return err - } - - baseDir := filepath.Join(s.metadataDir(dgst)) - if err := os.MkdirAll(baseDir, 0700); err != nil { - return err - } - return ioutils.AtomicWriteFile(filepath.Join(s.metadataDir(dgst), key), data, 0600) -} - -// GetMetadata returns metadata for a given digest. -func (s *fs) GetMetadata(dgst digest.Digest, key string) ([]byte, error) { - s.RLock() - defer s.RUnlock() - - if _, err := s.get(dgst); err != nil { - return nil, err - } - return ioutil.ReadFile(filepath.Join(s.metadataDir(dgst), key)) -} - -// DeleteMetadata removes the metadata associated with a digest. -func (s *fs) DeleteMetadata(dgst digest.Digest, key string) error { - s.Lock() - defer s.Unlock() - - return os.RemoveAll(filepath.Join(s.metadataDir(dgst), key)) -} diff --git a/vendor/github.com/docker/docker/image/fs_test.go b/vendor/github.com/docker/docker/image/fs_test.go deleted file mode 100644 index 8d602d97e..000000000 --- a/vendor/github.com/docker/docker/image/fs_test.go +++ /dev/null @@ -1,384 +0,0 @@ -package image - -import ( - "bytes" - "crypto/rand" - "crypto/sha256" - "encoding/hex" - "errors" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/docker/distribution/digest" -) - -func TestFSGetSet(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - fs, err := NewFSStoreBackend(tmpdir) - if err != nil { - t.Fatal(err) - } - - testGetSet(t, fs) -} - -func TestFSGetInvalidData(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - fs, err := NewFSStoreBackend(tmpdir) - if err != nil { - t.Fatal(err) - } - - id, err := fs.Set([]byte("foobar")) - if err != nil { - t.Fatal(err) - } - - dgst := digest.Digest(id) - - if err := ioutil.WriteFile(filepath.Join(tmpdir, contentDirName, string(dgst.Algorithm()), dgst.Hex()), []byte("foobar2"), 0600); err != nil { - t.Fatal(err) - } - - _, err = fs.Get(id) - if err == nil { - t.Fatal("Expected get to fail after data modification.") - } -} - -func TestFSInvalidSet(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - fs, err := NewFSStoreBackend(tmpdir) - if err != nil { - t.Fatal(err) - } - - id := digest.FromBytes([]byte("foobar")) - err = os.Mkdir(filepath.Join(tmpdir, contentDirName, string(id.Algorithm()), id.Hex()), 0700) - if err != nil { - t.Fatal(err) - } - - _, err = fs.Set([]byte("foobar")) - if err == nil { - t.Fatal("Expecting error from invalid filesystem data.") - } -} - -func TestFSInvalidRoot(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - tcases := []struct { - root, invalidFile string - }{ - {"root", "root"}, - {"root", "root/content"}, - {"root", "root/metadata"}, - } - - for _, tc := range tcases { - root := filepath.Join(tmpdir, tc.root) - filePath := filepath.Join(tmpdir, tc.invalidFile) - err := os.MkdirAll(filepath.Dir(filePath), 0700) - if err != nil { - t.Fatal(err) - } - f, err := os.Create(filePath) - if err != nil { - t.Fatal(err) - } - f.Close() - - _, err = NewFSStoreBackend(root) - if err == nil { - t.Fatalf("Expected error from root %q and invlid file %q", tc.root, tc.invalidFile) - } - - os.RemoveAll(root) - } - -} - -func testMetadataGetSet(t *testing.T, store StoreBackend) { - id, err := store.Set([]byte("foo")) - if err != nil { - t.Fatal(err) - } - id2, err := store.Set([]byte("bar")) - if err != nil { - t.Fatal(err) - } - - tcases := []struct { - id digest.Digest - key string - value []byte - }{ - {id, "tkey", []byte("tval1")}, - {id, "tkey2", []byte("tval2")}, - {id2, "tkey", []byte("tval3")}, - } - - for _, tc := range tcases { - err = store.SetMetadata(tc.id, tc.key, tc.value) - if err != nil { - t.Fatal(err) - } - - actual, err := store.GetMetadata(tc.id, tc.key) - if err != nil { - t.Fatal(err) - } - if bytes.Compare(actual, tc.value) != 0 { - t.Fatalf("Metadata expected %q, got %q", tc.value, actual) - } - } - - _, err = store.GetMetadata(id2, "tkey2") - if err == nil { - t.Fatal("Expected error for getting metadata for unknown key") - } - - id3 := digest.FromBytes([]byte("baz")) - err = store.SetMetadata(id3, "tkey", []byte("tval")) - if err == nil { - t.Fatal("Expected error for setting metadata for unknown ID.") - } - - _, err = store.GetMetadata(id3, "tkey") - if err == nil { - t.Fatal("Expected error for getting metadata for unknown ID.") - } -} - -func TestFSMetadataGetSet(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - fs, err := NewFSStoreBackend(tmpdir) - if err != nil { - t.Fatal(err) - } - - testMetadataGetSet(t, fs) -} - -func TestFSDelete(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - fs, err := NewFSStoreBackend(tmpdir) - if err != nil { - t.Fatal(err) - } - - testDelete(t, fs) -} - -func TestFSWalker(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - fs, err := NewFSStoreBackend(tmpdir) - if err != nil { - t.Fatal(err) - } - - testWalker(t, fs) -} - -func TestFSInvalidWalker(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - fs, err := NewFSStoreBackend(tmpdir) - if err != nil { - t.Fatal(err) - } - - fooID, err := fs.Set([]byte("foo")) - if err != nil { - t.Fatal(err) - } - - if err := ioutil.WriteFile(filepath.Join(tmpdir, contentDirName, "sha256/foobar"), []byte("foobar"), 0600); err != nil { - t.Fatal(err) - } - - n := 0 - err = fs.Walk(func(id digest.Digest) error { - if id != fooID { - t.Fatalf("Invalid walker ID %q, expected %q", id, fooID) - } - n++ - return nil - }) - if err != nil { - t.Fatalf("Invalid data should not have caused walker error, got %v", err) - } - if n != 1 { - t.Fatalf("Expected 1 walk initialization, got %d", n) - } -} - -func testGetSet(t *testing.T, store StoreBackend) { - type tcase struct { - input []byte - expected digest.Digest - } - tcases := []tcase{ - {[]byte("foobar"), digest.Digest("sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2")}, - } - - randomInput := make([]byte, 8*1024) - _, err := rand.Read(randomInput) - if err != nil { - t.Fatal(err) - } - // skipping use of digest pkg because its used by the implementation - h := sha256.New() - _, err = h.Write(randomInput) - if err != nil { - t.Fatal(err) - } - tcases = append(tcases, tcase{ - input: randomInput, - expected: digest.Digest("sha256:" + hex.EncodeToString(h.Sum(nil))), - }) - - for _, tc := range tcases { - id, err := store.Set([]byte(tc.input)) - if err != nil { - t.Fatal(err) - } - if id != tc.expected { - t.Fatalf("Expected ID %q, got %q", tc.expected, id) - } - } - - for _, emptyData := range [][]byte{nil, {}} { - _, err := store.Set(emptyData) - if err == nil { - t.Fatal("Expected error for nil input.") - } - } - - for _, tc := range tcases { - data, err := store.Get(tc.expected) - if err != nil { - t.Fatal(err) - } - if bytes.Compare(data, tc.input) != 0 { - t.Fatalf("Expected data %q, got %q", tc.input, data) - } - } - - for _, key := range []digest.Digest{"foobar:abc", "sha256:abc", "sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2a"} { - _, err := store.Get(key) - if err == nil { - t.Fatalf("Expected error for ID %q.", key) - } - } - -} - -func testDelete(t *testing.T, store StoreBackend) { - id, err := store.Set([]byte("foo")) - if err != nil { - t.Fatal(err) - } - id2, err := store.Set([]byte("bar")) - if err != nil { - t.Fatal(err) - } - - err = store.Delete(id) - if err != nil { - t.Fatal(err) - } - - _, err = store.Get(id) - if err == nil { - t.Fatalf("Expected getting deleted item %q to fail", id) - } - _, err = store.Get(id2) - if err != nil { - t.Fatal(err) - } - - err = store.Delete(id2) - if err != nil { - t.Fatal(err) - } - _, err = store.Get(id2) - if err == nil { - t.Fatalf("Expected getting deleted item %q to fail", id2) - } -} - -func testWalker(t *testing.T, store StoreBackend) { - id, err := store.Set([]byte("foo")) - if err != nil { - t.Fatal(err) - } - id2, err := store.Set([]byte("bar")) - if err != nil { - t.Fatal(err) - } - - tcases := make(map[digest.Digest]struct{}) - tcases[id] = struct{}{} - tcases[id2] = struct{}{} - n := 0 - err = store.Walk(func(id digest.Digest) error { - delete(tcases, id) - n++ - return nil - }) - if err != nil { - t.Fatal(err) - } - - if n != 2 { - t.Fatalf("Expected 2 walk initializations, got %d", n) - } - if len(tcases) != 0 { - t.Fatalf("Expected empty unwalked set, got %+v", tcases) - } - - // stop on error - tcases = make(map[digest.Digest]struct{}) - tcases[id] = struct{}{} - err = store.Walk(func(id digest.Digest) error { - return errors.New("") - }) - if err == nil { - t.Fatalf("Exected error from walker.") - } -} diff --git a/vendor/github.com/docker/docker/image/image.go b/vendor/github.com/docker/docker/image/image.go deleted file mode 100644 index 29a990a55..000000000 --- a/vendor/github.com/docker/docker/image/image.go +++ /dev/null @@ -1,150 +0,0 @@ -package image - -import ( - "encoding/json" - "errors" - "io" - "time" - - "github.com/docker/distribution/digest" - "github.com/docker/docker/api/types/container" -) - -// ID is the content-addressable ID of an image. -type ID digest.Digest - -func (id ID) String() string { - return id.Digest().String() -} - -// Digest converts ID into a digest -func (id ID) Digest() digest.Digest { - return digest.Digest(id) -} - -// IDFromDigest creates an ID from a digest -func IDFromDigest(digest digest.Digest) ID { - return ID(digest) -} - -// V1Image stores the V1 image configuration. -type V1Image struct { - // ID a unique 64 character identifier of the image - ID string `json:"id,omitempty"` - // Parent id of the image - Parent string `json:"parent,omitempty"` - // Comment user added comment - Comment string `json:"comment,omitempty"` - // Created timestamp when image was created - Created time.Time `json:"created"` - // Container is the id of the container used to commit - Container string `json:"container,omitempty"` - // ContainerConfig is the configuration of the container that is committed into the image - ContainerConfig container.Config `json:"container_config,omitempty"` - // DockerVersion specifies version on which image is built - DockerVersion string `json:"docker_version,omitempty"` - // Author of the image - Author string `json:"author,omitempty"` - // Config is the configuration of the container received from the client - Config *container.Config `json:"config,omitempty"` - // Architecture is the hardware that the image is build and runs on - Architecture string `json:"architecture,omitempty"` - // OS is the operating system used to build and run the image - OS string `json:"os,omitempty"` - // Size is the total size of the image including all layers it is composed of - Size int64 `json:",omitempty"` -} - -// Image stores the image configuration -type Image struct { - V1Image - Parent ID `json:"parent,omitempty"` - RootFS *RootFS `json:"rootfs,omitempty"` - History []History `json:"history,omitempty"` - OSVersion string `json:"os.version,omitempty"` - OSFeatures []string `json:"os.features,omitempty"` - - // rawJSON caches the immutable JSON associated with this image. - rawJSON []byte - - // computedID is the ID computed from the hash of the image config. - // Not to be confused with the legacy V1 ID in V1Image. - computedID ID -} - -// RawJSON returns the immutable JSON associated with the image. -func (img *Image) RawJSON() []byte { - return img.rawJSON -} - -// ID returns the image's content-addressable ID. -func (img *Image) ID() ID { - return img.computedID -} - -// ImageID stringifies ID. -func (img *Image) ImageID() string { - return img.ID().String() -} - -// RunConfig returns the image's container config. -func (img *Image) RunConfig() *container.Config { - return img.Config -} - -// MarshalJSON serializes the image to JSON. It sorts the top-level keys so -// that JSON that's been manipulated by a push/pull cycle with a legacy -// registry won't end up with a different key order. -func (img *Image) MarshalJSON() ([]byte, error) { - type MarshalImage Image - - pass1, err := json.Marshal(MarshalImage(*img)) - if err != nil { - return nil, err - } - - var c map[string]*json.RawMessage - if err := json.Unmarshal(pass1, &c); err != nil { - return nil, err - } - return json.Marshal(c) -} - -// History stores build commands that were used to create an image -type History struct { - // Created timestamp for build point - Created time.Time `json:"created"` - // Author of the build point - Author string `json:"author,omitempty"` - // CreatedBy keeps the Dockerfile command used while building image. - CreatedBy string `json:"created_by,omitempty"` - // Comment is custom message set by the user when creating the image. - Comment string `json:"comment,omitempty"` - // EmptyLayer is set to true if this history item did not generate a - // layer. Otherwise, the history item is associated with the next - // layer in the RootFS section. - EmptyLayer bool `json:"empty_layer,omitempty"` -} - -// Exporter provides interface for exporting and importing images -type Exporter interface { - Load(io.ReadCloser, io.Writer, bool) error - // TODO: Load(net.Context, io.ReadCloser, <- chan StatusMessage) error - Save([]string, io.Writer) error -} - -// NewFromJSON creates an Image configuration from json. -func NewFromJSON(src []byte) (*Image, error) { - img := &Image{} - - if err := json.Unmarshal(src, img); err != nil { - return nil, err - } - if img.RootFS == nil { - return nil, errors.New("Invalid image JSON, no RootFS key.") - } - - img.rawJSON = src - - return img, nil -} diff --git a/vendor/github.com/docker/docker/image/image_test.go b/vendor/github.com/docker/docker/image/image_test.go deleted file mode 100644 index 525023b81..000000000 --- a/vendor/github.com/docker/docker/image/image_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package image - -import ( - "encoding/json" - "sort" - "strings" - "testing" -) - -const sampleImageJSON = `{ - "architecture": "amd64", - "os": "linux", - "config": {}, - "rootfs": { - "type": "layers", - "diff_ids": [] - } -}` - -func TestJSON(t *testing.T) { - img, err := NewFromJSON([]byte(sampleImageJSON)) - if err != nil { - t.Fatal(err) - } - rawJSON := img.RawJSON() - if string(rawJSON) != sampleImageJSON { - t.Fatalf("Raw JSON of config didn't match: expected %+v, got %v", sampleImageJSON, rawJSON) - } -} - -func TestInvalidJSON(t *testing.T) { - _, err := NewFromJSON([]byte("{}")) - if err == nil { - t.Fatal("Expected JSON parse error") - } -} - -func TestMarshalKeyOrder(t *testing.T) { - b, err := json.Marshal(&Image{ - V1Image: V1Image{ - Comment: "a", - Author: "b", - Architecture: "c", - }, - }) - if err != nil { - t.Fatal(err) - } - - expectedOrder := []string{"architecture", "author", "comment"} - var indexes []int - for _, k := range expectedOrder { - indexes = append(indexes, strings.Index(string(b), k)) - } - - if !sort.IntsAreSorted(indexes) { - t.Fatal("invalid key order in JSON: ", string(b)) - } -} diff --git a/vendor/github.com/docker/docker/image/rootfs.go b/vendor/github.com/docker/docker/image/rootfs.go deleted file mode 100644 index 7b24e3ed1..000000000 --- a/vendor/github.com/docker/docker/image/rootfs.go +++ /dev/null @@ -1,44 +0,0 @@ -package image - -import ( - "runtime" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/layer" -) - -// TypeLayers is used for RootFS.Type for filesystems organized into layers. -const TypeLayers = "layers" - -// typeLayersWithBase is an older format used by Windows up to v1.12. We -// explicitly handle this as an error case to ensure that a daemon which still -// has an older image like this on disk can still start, even though the -// image itself is not usable. See https://github.com/docker/docker/pull/25806. -const typeLayersWithBase = "layers+base" - -// RootFS describes images root filesystem -// This is currently a placeholder that only supports layers. In the future -// this can be made into an interface that supports different implementations. -type RootFS struct { - Type string `json:"type"` - DiffIDs []layer.DiffID `json:"diff_ids,omitempty"` -} - -// NewRootFS returns empty RootFS struct -func NewRootFS() *RootFS { - return &RootFS{Type: TypeLayers} -} - -// Append appends a new diffID to rootfs -func (r *RootFS) Append(id layer.DiffID) { - r.DiffIDs = append(r.DiffIDs, id) -} - -// ChainID returns the ChainID for the top layer in RootFS. -func (r *RootFS) ChainID() layer.ChainID { - if runtime.GOOS == "windows" && r.Type == typeLayersWithBase { - logrus.Warnf("Layer type is unsupported on this platform. DiffIDs: '%v'", r.DiffIDs) - return "" - } - return layer.CreateChainID(r.DiffIDs) -} diff --git a/vendor/github.com/docker/docker/image/spec/v1.1.md b/vendor/github.com/docker/docker/image/spec/v1.1.md deleted file mode 100644 index 83f138011..000000000 --- a/vendor/github.com/docker/docker/image/spec/v1.1.md +++ /dev/null @@ -1,637 +0,0 @@ -# Docker Image Specification v1.1.0 - -An *Image* is an ordered collection of root filesystem changes and the -corresponding execution parameters for use within a container runtime. This -specification outlines the format of these filesystem changes and corresponding -parameters and describes how to create and use them for use with a container -runtime and execution tool. - -This version of the image specification was adopted starting in Docker 1.10. - -## Terminology - -This specification uses the following terms: - -
-
- Layer -
-
- Images are composed of layers. Each layer is a set of filesystem - changes. Layers do not have configuration metadata such as environment - variables or default arguments - these are properties of the image as a - whole rather than any particular layer. -
-
- Image JSON -
-
- Each image has an associated JSON structure which describes some - basic information about the image such as date created, author, and the - ID of its parent image as well as execution/runtime configuration like - its entry point, default arguments, CPU/memory shares, networking, and - volumes. The JSON structure also references a cryptographic hash of - each layer used by the image, and provides history information for - those layers. This JSON is considered to be immutable, because changing - it would change the computed ImageID. Changing it means creating a new - derived image, instead of changing the existing image. -
-
- Image Filesystem Changeset -
-
- Each layer has an archive of the files which have been added, changed, - or deleted relative to its parent layer. Using a layer-based or union - filesystem such as AUFS, or by computing the diff from filesystem - snapshots, the filesystem changeset can be used to present a series of - image layers as if they were one cohesive filesystem. -
-
- Layer DiffID -
-
- Layers are referenced by cryptographic hashes of their serialized - representation. This is a SHA256 digest over the tar archive used to - transport the layer, represented as a hexadecimal encoding of 256 bits, e.g., - sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9. - Layers must be packed and unpacked reproducibly to avoid changing the - layer ID, for example by using tar-split to save the tar headers. Note - that the digest used as the layer ID is taken over an uncompressed - version of the tar. -
-
- Layer ChainID -
-
- For convenience, it is sometimes useful to refer to a stack of layers - with a single identifier. This is called a ChainID. For a - single layer (or the layer at the bottom of a stack), the - ChainID is equal to the layer's DiffID. - Otherwise the ChainID is given by the formula: - ChainID(layerN) = SHA256hex(ChainID(layerN-1) + " " + DiffID(layerN)). -
-
- ImageID -
-
- Each image's ID is given by the SHA256 hash of its configuration JSON. It is - represented as a hexadecimal encoding of 256 bits, e.g., - sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9. - Since the configuration JSON that gets hashed references hashes of each - layer in the image, this formulation of the ImageID makes images - content-addressable. -
-
- Tag -
-
- A tag serves to map a descriptive, user-given name to any single image - ID. Tag values are limited to the set of characters - [a-zA-Z0-9_.-], except they may not start with a . - or - character. Tags are limited to 127 characters. -
-
- Repository -
-
- A collection of tags grouped under a common prefix (the name component - before :). For example, in an image tagged with the name - my-app:3.1.4, my-app is the Repository - component of the name. A repository name is made up of slash-separated - name components, optionally prefixed by a DNS hostname. The hostname - must follow comply with standard DNS rules, but may not contain - _ characters. If a hostname is present, it may optionally - be followed by a port number in the format :8080. - Name components may contain lowercase characters, digits, and - separators. A separator is defined as a period, one or two underscores, - or one or more dashes. A name component may not start or end with - a separator. -
-
- -## Image JSON Description - -Here is an example image JSON file: - -``` -{ - "created": "2015-10-31T22:22:56.015925234Z", - "author": "Alyssa P. Hacker <alyspdev@example.com>", - "architecture": "amd64", - "os": "linux", - "config": { - "User": "alice", - "Memory": 2048, - "MemorySwap": 4096, - "CpuShares": 8, - "ExposedPorts": { - "8080/tcp": {} - }, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "FOO=docker_is_a_really", - "BAR=great_tool_you_know" - ], - "Entrypoint": [ - "/bin/my-app-binary" - ], - "Cmd": [ - "--foreground", - "--config", - "/etc/my-app.d/default.cfg" - ], - "Volumes": { - "/var/job-result-data": {}, - "/var/log/my-app-logs": {}, - }, - "WorkingDir": "/home/alice", - }, - "rootfs": { - "diff_ids": [ - "sha256:c6f988f4874bb0add23a778f753c65efe992244e148a1d2ec2a8b664fb66bbd1", - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" - ], - "type": "layers" - }, - "history": [ - { - "created": "2015-10-31T22:22:54.690851953Z", - "created_by": "/bin/sh -c #(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /" - }, - { - "created": "2015-10-31T22:22:55.613815829Z", - "created_by": "/bin/sh -c #(nop) CMD [\"sh\"]", - "empty_layer": true - } - ] -} -``` - -Note that image JSON files produced by Docker don't contain formatting -whitespace. It has been added to this example for clarity. - -### Image JSON Field Descriptions - -
-
- created string -
-
- ISO-8601 formatted combined date and time at which the image was - created. -
-
- author string -
-
- Gives the name and/or email address of the person or entity which - created and is responsible for maintaining the image. -
-
- architecture string -
-
- The CPU architecture which the binaries in this image are built to run - on. Possible values include: -
    -
  • 386
  • -
  • amd64
  • -
  • arm
  • -
- More values may be supported in the future and any of these may or may - not be supported by a given container runtime implementation. -
-
- os string -
-
- The name of the operating system which the image is built to run on. - Possible values include: -
    -
  • darwin
  • -
  • freebsd
  • -
  • linux
  • -
- More values may be supported in the future and any of these may or may - not be supported by a given container runtime implementation. -
-
- config struct -
-
- The execution parameters which should be used as a base when running a - container using the image. This field can be null, in - which case any execution parameters should be specified at creation of - the container. - -

Container RunConfig Field Descriptions

- -
-
- User string -
-
-

The username or UID which the process in the container should - run as. This acts as a default value to use when the value is - not specified when creating a container.

- -

All of the following are valid:

- -
    -
  • user
  • -
  • uid
  • -
  • user:group
  • -
  • uid:gid
  • -
  • uid:group
  • -
  • user:gid
  • -
- -

If group/gid is not specified, the - default group and supplementary groups of the given - user/uid in /etc/passwd - from the container are applied.

-
-
- Memory integer -
-
- Memory limit (in bytes). This acts as a default value to use - when the value is not specified when creating a container. -
-
- MemorySwap integer -
-
- Total memory usage (memory + swap); set to -1 to - disable swap. This acts as a default value to use when the - value is not specified when creating a container. -
-
- CpuShares integer -
-
- CPU shares (relative weight vs. other containers). This acts as - a default value to use when the value is not specified when - creating a container. -
-
- ExposedPorts struct -
-
- A set of ports to expose from a container running this image. - This JSON structure value is unusual because it is a direct - JSON serialization of the Go type - map[string]struct{} and is represented in JSON as - an object mapping its keys to an empty object. Here is an - example: - -
{
-    "8080": {},
-    "53/udp": {},
-    "2356/tcp": {}
-}
- - Its keys can be in the format of: -
    -
  • - "port/tcp" -
  • -
  • - "port/udp" -
  • -
  • - "port" -
  • -
- with the default protocol being "tcp" if not - specified. - - These values act as defaults and are merged with any specified - when creating a container. -
-
- Env array of strings -
-
- Entries are in the format of VARNAME="var value". - These values act as defaults and are merged with any specified - when creating a container. -
-
- Entrypoint array of strings -
-
- A list of arguments to use as the command to execute when the - container starts. This value acts as a default and is replaced - by an entrypoint specified when creating a container. -
-
- Cmd array of strings -
-
- Default arguments to the entry point of the container. These - values act as defaults and are replaced with any specified when - creating a container. If an Entrypoint value is - not specified, then the first entry of the Cmd - array should be interpreted as the executable to run. -
-
- Volumes struct -
-
- A set of directories which should be created as data volumes in - a container running this image. This JSON structure value is - unusual because it is a direct JSON serialization of the Go - type map[string]struct{} and is represented in - JSON as an object mapping its keys to an empty object. Here is - an example: -
{
-    "/var/my-app-data/": {},
-    "/etc/some-config.d/": {},
-}
-
-
- WorkingDir string -
-
- Sets the current working directory of the entry point process - in the container. This value acts as a default and is replaced - by a working directory specified when creating a container. -
-
-
-
- rootfs struct -
-
- The rootfs key references the layer content addresses used by the - image. This makes the image config hash depend on the filesystem hash. - rootfs has two subkeys: - -
    -
  • - type is usually set to layers. -
  • -
  • - diff_ids is an array of layer content hashes (DiffIDs), in order from bottom-most to top-most. -
  • -
- - - Here is an example rootfs section: - -
"rootfs": {
-  "diff_ids": [
-    "sha256:c6f988f4874bb0add23a778f753c65efe992244e148a1d2ec2a8b664fb66bbd1",
-    "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
-    "sha256:13f53e08df5a220ab6d13c58b2bf83a59cbdc2e04d0a3f041ddf4b0ba4112d49"
-  ],
-  "type": "layers"
-}
-
-
- history struct -
-
- history is an array of objects describing the history of - each layer. The array is ordered from bottom-most layer to top-most - layer. The object has the following fields. - -
    -
  • - created: Creation time, expressed as a ISO-8601 formatted - combined date and time -
  • -
  • - author: The author of the build point -
  • -
  • - created_by: The command which created the layer -
  • -
  • - comment: A custom message set when creating the layer -
  • -
  • - empty_layer: This field is used to mark if the history - item created a filesystem diff. It is set to true if this history - item doesn't correspond to an actual layer in the rootfs section - (for example, a command like ENV which results in no change to the - filesystem). -
  • -
- -Here is an example history section: - -
"history": [
-  {
-    "created": "2015-10-31T22:22:54.690851953Z",
-    "created_by": "/bin/sh -c #(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /"
-  },
-  {
-    "created": "2015-10-31T22:22:55.613815829Z",
-    "created_by": "/bin/sh -c #(nop) CMD [\"sh\"]",
-    "empty_layer": true
-  }
-]
-
-
- -Any extra fields in the Image JSON struct are considered implementation -specific and should be ignored by any implementations which are unable to -interpret them. - -## Creating an Image Filesystem Changeset - -An example of creating an Image Filesystem Changeset follows. - -An image root filesystem is first created as an empty directory. Here is the -initial empty directory structure for the a changeset using the -randomly-generated directory name `c3167915dc9d` ([actual layer DiffIDs are -generated based on the content](#id_desc)). - -``` -c3167915dc9d/ -``` - -Files and directories are then created: - -``` -c3167915dc9d/ - etc/ - my-app-config - bin/ - my-app-binary - my-app-tools -``` - -The `c3167915dc9d` directory is then committed as a plain Tar archive with -entries for the following files: - -``` -etc/my-app-config -bin/my-app-binary -bin/my-app-tools -``` - -To make changes to the filesystem of this container image, create a new -directory, such as `f60c56784b83`, and initialize it with a snapshot of the -parent image's root filesystem, so that the directory is identical to that -of `c3167915dc9d`. NOTE: a copy-on-write or union filesystem can make this very -efficient: - -``` -f60c56784b83/ - etc/ - my-app-config - bin/ - my-app-binary - my-app-tools -``` - -This example change is going add a configuration directory at `/etc/my-app.d` -which contains a default config file. There's also a change to the -`my-app-tools` binary to handle the config layout change. The `f60c56784b83` -directory then looks like this: - -``` -f60c56784b83/ - etc/ - my-app.d/ - default.cfg - bin/ - my-app-binary - my-app-tools -``` - -This reflects the removal of `/etc/my-app-config` and creation of a file and -directory at `/etc/my-app.d/default.cfg`. `/bin/my-app-tools` has also been -replaced with an updated version. Before committing this directory to a -changeset, because it has a parent image, it is first compared with the -directory tree of the parent snapshot, `f60c56784b83`, looking for files and -directories that have been added, modified, or removed. The following changeset -is found: - -``` -Added: /etc/my-app.d/default.cfg -Modified: /bin/my-app-tools -Deleted: /etc/my-app-config -``` - -A Tar Archive is then created which contains *only* this changeset: The added -and modified files and directories in their entirety, and for each deleted item -an entry for an empty file at the same location but with the basename of the -deleted file or directory prefixed with `.wh.`. The filenames prefixed with -`.wh.` are known as "whiteout" files. NOTE: For this reason, it is not possible -to create an image root filesystem which contains a file or directory with a -name beginning with `.wh.`. The resulting Tar archive for `f60c56784b83` has -the following entries: - -``` -/etc/my-app.d/default.cfg -/bin/my-app-tools -/etc/.wh.my-app-config -``` - -Any given image is likely to be composed of several of these Image Filesystem -Changeset tar archives. - -## Combined Image JSON + Filesystem Changeset Format - -There is also a format for a single archive which contains complete information -about an image, including: - - - repository names/tags - - image configuration JSON file - - all tar archives of each layer filesystem changesets - -For example, here's what the full archive of `library/busybox` is (displayed in -`tree` format): - -``` -. -├── 47bcc53f74dc94b1920f0b34f6036096526296767650f223433fe65c35f149eb.json -├── 5f29f704785248ddb9d06b90a11b5ea36c534865e9035e4022bb2e71d4ecbb9a -│   ├── VERSION -│   ├── json -│   └── layer.tar -├── a65da33792c5187473faa80fa3e1b975acba06712852d1dea860692ccddf3198 -│   ├── VERSION -│   ├── json -│   └── layer.tar -├── manifest.json -└── repositories -``` - -There is a directory for each layer in the image. Each directory is named with -a 64 character hex name that is deterministically generated from the layer -information. These names are not necessarily layer DiffIDs or ChainIDs. Each of -these directories contains 3 files: - - * `VERSION` - The schema version of the `json` file - * `json` - The legacy JSON metadata for an image layer. In this version of - the image specification, layers don't have JSON metadata, but in - [version 1](v1.md), they did. A file is created for each layer in the - v1 format for backward compatibility. - * `layer.tar` - The Tar archive of the filesystem changeset for an image - layer. - -Note that this directory layout is only important for backward compatibility. -Current implementations use the paths specified in `manifest.json`. - -The content of the `VERSION` files is simply the semantic version of the JSON -metadata schema: - -``` -1.0 -``` - -The `repositories` file is another JSON file which describes names/tags: - -``` -{ - "busybox":{ - "latest":"5f29f704785248ddb9d06b90a11b5ea36c534865e9035e4022bb2e71d4ecbb9a" - } -} -``` - -Every key in this object is the name of a repository, and maps to a collection -of tag suffixes. Each tag maps to the ID of the image represented by that tag. -This file is only used for backwards compatibility. Current implementations use -the `manifest.json` file instead. - -The `manifest.json` file provides the image JSON for the top-level image, and -optionally for parent images that this image was derived from. It consists of -an array of metadata entries: - -``` -[ - { - "Config": "47bcc53f74dc94b1920f0b34f6036096526296767650f223433fe65c35f149eb.json", - "RepoTags": ["busybox:latest"], - "Layers": [ - "a65da33792c5187473faa80fa3e1b975acba06712852d1dea860692ccddf3198/layer.tar", - "5f29f704785248ddb9d06b90a11b5ea36c534865e9035e4022bb2e71d4ecbb9a/layer.tar" - ] - } -] -``` - -There is an entry in the array for each image. - -The `Config` field references another file in the tar which includes the image -JSON for this image. - -The `RepoTags` field lists references pointing to this image. - -The `Layers` field points to the filesystem changeset tars. - -An optional `Parent` field references the imageID of the parent image. This -parent must be part of the same `manifest.json` file. - -This file shouldn't be confused with the distribution manifest, used to push -and pull images. - -Generally, implementations that support this version of the spec will use -the `manifest.json` file if available, and older implementations will use the -legacy `*/json` files and `repositories`. diff --git a/vendor/github.com/docker/docker/image/spec/v1.2.md b/vendor/github.com/docker/docker/image/spec/v1.2.md deleted file mode 100644 index 6c641cafe..000000000 --- a/vendor/github.com/docker/docker/image/spec/v1.2.md +++ /dev/null @@ -1,696 +0,0 @@ -# Docker Image Specification v1.2.0 - -An *Image* is an ordered collection of root filesystem changes and the -corresponding execution parameters for use within a container runtime. This -specification outlines the format of these filesystem changes and corresponding -parameters and describes how to create and use them for use with a container -runtime and execution tool. - -This version of the image specification was adopted starting in Docker 1.12. - -## Terminology - -This specification uses the following terms: - -
-
- Layer -
-
- Images are composed of layers. Each layer is a set of filesystem - changes. Layers do not have configuration metadata such as environment - variables or default arguments - these are properties of the image as a - whole rather than any particular layer. -
-
- Image JSON -
-
- Each image has an associated JSON structure which describes some - basic information about the image such as date created, author, and the - ID of its parent image as well as execution/runtime configuration like - its entry point, default arguments, CPU/memory shares, networking, and - volumes. The JSON structure also references a cryptographic hash of - each layer used by the image, and provides history information for - those layers. This JSON is considered to be immutable, because changing - it would change the computed ImageID. Changing it means creating a new - derived image, instead of changing the existing image. -
-
- Image Filesystem Changeset -
-
- Each layer has an archive of the files which have been added, changed, - or deleted relative to its parent layer. Using a layer-based or union - filesystem such as AUFS, or by computing the diff from filesystem - snapshots, the filesystem changeset can be used to present a series of - image layers as if they were one cohesive filesystem. -
-
- Layer DiffID -
-
- Layers are referenced by cryptographic hashes of their serialized - representation. This is a SHA256 digest over the tar archive used to - transport the layer, represented as a hexadecimal encoding of 256 bits, e.g., - sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9. - Layers must be packed and unpacked reproducibly to avoid changing the - layer ID, for example by using tar-split to save the tar headers. Note - that the digest used as the layer ID is taken over an uncompressed - version of the tar. -
-
- Layer ChainID -
-
- For convenience, it is sometimes useful to refer to a stack of layers - with a single identifier. This is called a ChainID. For a - single layer (or the layer at the bottom of a stack), the - ChainID is equal to the layer's DiffID. - Otherwise the ChainID is given by the formula: - ChainID(layerN) = SHA256hex(ChainID(layerN-1) + " " + DiffID(layerN)). -
-
- ImageID -
-
- Each image's ID is given by the SHA256 hash of its configuration JSON. It is - represented as a hexadecimal encoding of 256 bits, e.g., - sha256:a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9. - Since the configuration JSON that gets hashed references hashes of each - layer in the image, this formulation of the ImageID makes images - content-addressable. -
-
- Tag -
-
- A tag serves to map a descriptive, user-given name to any single image - ID. Tag values are limited to the set of characters - [a-zA-Z0-9_.-], except they may not start with a . - or - character. Tags are limited to 127 characters. -
-
- Repository -
-
- A collection of tags grouped under a common prefix (the name component - before :). For example, in an image tagged with the name - my-app:3.1.4, my-app is the Repository - component of the name. A repository name is made up of slash-separated - name components, optionally prefixed by a DNS hostname. The hostname - must follow comply with standard DNS rules, but may not contain - _ characters. If a hostname is present, it may optionally - be followed by a port number in the format :8080. - Name components may contain lowercase characters, digits, and - separators. A separator is defined as a period, one or two underscores, - or one or more dashes. A name component may not start or end with - a separator. -
-
- -## Image JSON Description - -Here is an example image JSON file: - -``` -{ - "created": "2015-10-31T22:22:56.015925234Z", - "author": "Alyssa P. Hacker <alyspdev@example.com>", - "architecture": "amd64", - "os": "linux", - "config": { - "User": "alice", - "Memory": 2048, - "MemorySwap": 4096, - "CpuShares": 8, - "ExposedPorts": { - "8080/tcp": {} - }, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "FOO=docker_is_a_really", - "BAR=great_tool_you_know" - ], - "Entrypoint": [ - "/bin/my-app-binary" - ], - "Cmd": [ - "--foreground", - "--config", - "/etc/my-app.d/default.cfg" - ], - "Volumes": { - "/var/job-result-data": {}, - "/var/log/my-app-logs": {}, - }, - "WorkingDir": "/home/alice", - }, - "rootfs": { - "diff_ids": [ - "sha256:c6f988f4874bb0add23a778f753c65efe992244e148a1d2ec2a8b664fb66bbd1", - "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" - ], - "type": "layers" - }, - "history": [ - { - "created": "2015-10-31T22:22:54.690851953Z", - "created_by": "/bin/sh -c #(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /" - }, - { - "created": "2015-10-31T22:22:55.613815829Z", - "created_by": "/bin/sh -c #(nop) CMD [\"sh\"]", - "empty_layer": true - } - ] -} -``` - -Note that image JSON files produced by Docker don't contain formatting -whitespace. It has been added to this example for clarity. - -### Image JSON Field Descriptions - -
-
- created string -
-
- ISO-8601 formatted combined date and time at which the image was - created. -
-
- author string -
-
- Gives the name and/or email address of the person or entity which - created and is responsible for maintaining the image. -
-
- architecture string -
-
- The CPU architecture which the binaries in this image are built to run - on. Possible values include: -
    -
  • 386
  • -
  • amd64
  • -
  • arm
  • -
- More values may be supported in the future and any of these may or may - not be supported by a given container runtime implementation. -
-
- os string -
-
- The name of the operating system which the image is built to run on. - Possible values include: -
    -
  • darwin
  • -
  • freebsd
  • -
  • linux
  • -
- More values may be supported in the future and any of these may or may - not be supported by a given container runtime implementation. -
-
- config struct -
-
- The execution parameters which should be used as a base when running a - container using the image. This field can be null, in - which case any execution parameters should be specified at creation of - the container. - -

Container RunConfig Field Descriptions

- -
-
- User string -
-
-

The username or UID which the process in the container should - run as. This acts as a default value to use when the value is - not specified when creating a container.

- -

All of the following are valid:

- -
    -
  • user
  • -
  • uid
  • -
  • user:group
  • -
  • uid:gid
  • -
  • uid:group
  • -
  • user:gid
  • -
- -

If group/gid is not specified, the - default group and supplementary groups of the given - user/uid in /etc/passwd - from the container are applied.

-
-
- Memory integer -
-
- Memory limit (in bytes). This acts as a default value to use - when the value is not specified when creating a container. -
-
- MemorySwap integer -
-
- Total memory usage (memory + swap); set to -1 to - disable swap. This acts as a default value to use when the - value is not specified when creating a container. -
-
- CpuShares integer -
-
- CPU shares (relative weight vs. other containers). This acts as - a default value to use when the value is not specified when - creating a container. -
-
- ExposedPorts struct -
-
- A set of ports to expose from a container running this image. - This JSON structure value is unusual because it is a direct - JSON serialization of the Go type - map[string]struct{} and is represented in JSON as - an object mapping its keys to an empty object. Here is an - example: - -
{
-    "8080": {},
-    "53/udp": {},
-    "2356/tcp": {}
-}
- - Its keys can be in the format of: -
    -
  • - "port/tcp" -
  • -
  • - "port/udp" -
  • -
  • - "port" -
  • -
- with the default protocol being "tcp" if not - specified. - - These values act as defaults and are merged with any specified - when creating a container. -
-
- Env array of strings -
-
- Entries are in the format of VARNAME="var value". - These values act as defaults and are merged with any specified - when creating a container. -
-
- Entrypoint array of strings -
-
- A list of arguments to use as the command to execute when the - container starts. This value acts as a default and is replaced - by an entrypoint specified when creating a container. -
-
- Cmd array of strings -
-
- Default arguments to the entry point of the container. These - values act as defaults and are replaced with any specified when - creating a container. If an Entrypoint value is - not specified, then the first entry of the Cmd - array should be interpreted as the executable to run. -
-
- Healthcheck struct -
-
- A test to perform to determine whether the container is healthy. - Here is an example: -
{
-  "Test": [
-      "CMD-SHELL",
-      "/usr/bin/check-health localhost"
-  ],
-  "Interval": 30000000000,
-  "Timeout": 10000000000,
-  "Retries": 3
-}
- The object has the following fields. -
-
- Test array of strings -
-
- The test to perform to check that the container is healthy. - The options are: -
    -
  • [] : inherit healthcheck from base image
  • -
  • ["NONE"] : disable healthcheck
  • -
  • ["CMD", arg1, arg2, ...] : exec arguments directly
  • -
  • ["CMD-SHELL", command] : run command with system's default shell
  • -
- - The test command should exit with a status of 0 if the container is healthy, - or with 1 if it is unhealthy. -
-
- Interval integer -
-
- Number of nanoseconds to wait between probe attempts. -
-
- Timeout integer -
-
- Number of nanoseconds to wait before considering the check to have hung. -
-
- Retries integer -
-
- The number of consecutive failures needed to consider a container as unhealthy. -
-
- - In each case, the field can be omitted to indicate that the - value should be inherited from the base layer. - - These values act as defaults and are merged with any specified - when creating a container. -
-
- Volumes struct -
-
- A set of directories which should be created as data volumes in - a container running this image. This JSON structure value is - unusual because it is a direct JSON serialization of the Go - type map[string]struct{} and is represented in - JSON as an object mapping its keys to an empty object. Here is - an example: -
{
-    "/var/my-app-data/": {},
-    "/etc/some-config.d/": {},
-}
-
-
- WorkingDir string -
-
- Sets the current working directory of the entry point process - in the container. This value acts as a default and is replaced - by a working directory specified when creating a container. -
-
-
-
- rootfs struct -
-
- The rootfs key references the layer content addresses used by the - image. This makes the image config hash depend on the filesystem hash. - rootfs has two subkeys: - -
    -
  • - type is usually set to layers. -
  • -
  • - diff_ids is an array of layer content hashes (DiffIDs), in order from bottom-most to top-most. -
  • -
- - - Here is an example rootfs section: - -
"rootfs": {
-  "diff_ids": [
-    "sha256:c6f988f4874bb0add23a778f753c65efe992244e148a1d2ec2a8b664fb66bbd1",
-    "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
-    "sha256:13f53e08df5a220ab6d13c58b2bf83a59cbdc2e04d0a3f041ddf4b0ba4112d49"
-  ],
-  "type": "layers"
-}
-
-
- history struct -
-
- history is an array of objects describing the history of - each layer. The array is ordered from bottom-most layer to top-most - layer. The object has the following fields. - -
    -
  • - created: Creation time, expressed as a ISO-8601 formatted - combined date and time -
  • -
  • - author: The author of the build point -
  • -
  • - created_by: The command which created the layer -
  • -
  • - comment: A custom message set when creating the layer -
  • -
  • - empty_layer: This field is used to mark if the history - item created a filesystem diff. It is set to true if this history - item doesn't correspond to an actual layer in the rootfs section - (for example, a command like ENV which results in no change to the - filesystem). -
  • -
- -Here is an example history section: - -
"history": [
-  {
-    "created": "2015-10-31T22:22:54.690851953Z",
-    "created_by": "/bin/sh -c #(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /"
-  },
-  {
-    "created": "2015-10-31T22:22:55.613815829Z",
-    "created_by": "/bin/sh -c #(nop) CMD [\"sh\"]",
-    "empty_layer": true
-  }
-]
-
-
- -Any extra fields in the Image JSON struct are considered implementation -specific and should be ignored by any implementations which are unable to -interpret them. - -## Creating an Image Filesystem Changeset - -An example of creating an Image Filesystem Changeset follows. - -An image root filesystem is first created as an empty directory. Here is the -initial empty directory structure for the a changeset using the -randomly-generated directory name `c3167915dc9d` ([actual layer DiffIDs are -generated based on the content](#id_desc)). - -``` -c3167915dc9d/ -``` - -Files and directories are then created: - -``` -c3167915dc9d/ - etc/ - my-app-config - bin/ - my-app-binary - my-app-tools -``` - -The `c3167915dc9d` directory is then committed as a plain Tar archive with -entries for the following files: - -``` -etc/my-app-config -bin/my-app-binary -bin/my-app-tools -``` - -To make changes to the filesystem of this container image, create a new -directory, such as `f60c56784b83`, and initialize it with a snapshot of the -parent image's root filesystem, so that the directory is identical to that -of `c3167915dc9d`. NOTE: a copy-on-write or union filesystem can make this very -efficient: - -``` -f60c56784b83/ - etc/ - my-app-config - bin/ - my-app-binary - my-app-tools -``` - -This example change is going add a configuration directory at `/etc/my-app.d` -which contains a default config file. There's also a change to the -`my-app-tools` binary to handle the config layout change. The `f60c56784b83` -directory then looks like this: - -``` -f60c56784b83/ - etc/ - my-app.d/ - default.cfg - bin/ - my-app-binary - my-app-tools -``` - -This reflects the removal of `/etc/my-app-config` and creation of a file and -directory at `/etc/my-app.d/default.cfg`. `/bin/my-app-tools` has also been -replaced with an updated version. Before committing this directory to a -changeset, because it has a parent image, it is first compared with the -directory tree of the parent snapshot, `f60c56784b83`, looking for files and -directories that have been added, modified, or removed. The following changeset -is found: - -``` -Added: /etc/my-app.d/default.cfg -Modified: /bin/my-app-tools -Deleted: /etc/my-app-config -``` - -A Tar Archive is then created which contains *only* this changeset: The added -and modified files and directories in their entirety, and for each deleted item -an entry for an empty file at the same location but with the basename of the -deleted file or directory prefixed with `.wh.`. The filenames prefixed with -`.wh.` are known as "whiteout" files. NOTE: For this reason, it is not possible -to create an image root filesystem which contains a file or directory with a -name beginning with `.wh.`. The resulting Tar archive for `f60c56784b83` has -the following entries: - -``` -/etc/my-app.d/default.cfg -/bin/my-app-tools -/etc/.wh.my-app-config -``` - -Any given image is likely to be composed of several of these Image Filesystem -Changeset tar archives. - -## Combined Image JSON + Filesystem Changeset Format - -There is also a format for a single archive which contains complete information -about an image, including: - - - repository names/tags - - image configuration JSON file - - all tar archives of each layer filesystem changesets - -For example, here's what the full archive of `library/busybox` is (displayed in -`tree` format): - -``` -. -├── 47bcc53f74dc94b1920f0b34f6036096526296767650f223433fe65c35f149eb.json -├── 5f29f704785248ddb9d06b90a11b5ea36c534865e9035e4022bb2e71d4ecbb9a -│   ├── VERSION -│   ├── json -│   └── layer.tar -├── a65da33792c5187473faa80fa3e1b975acba06712852d1dea860692ccddf3198 -│   ├── VERSION -│   ├── json -│   └── layer.tar -├── manifest.json -└── repositories -``` - -There is a directory for each layer in the image. Each directory is named with -a 64 character hex name that is deterministically generated from the layer -information. These names are not necessarily layer DiffIDs or ChainIDs. Each of -these directories contains 3 files: - - * `VERSION` - The schema version of the `json` file - * `json` - The legacy JSON metadata for an image layer. In this version of - the image specification, layers don't have JSON metadata, but in - [version 1](v1.md), they did. A file is created for each layer in the - v1 format for backward compatibility. - * `layer.tar` - The Tar archive of the filesystem changeset for an image - layer. - -Note that this directory layout is only important for backward compatibility. -Current implementations use the paths specified in `manifest.json`. - -The content of the `VERSION` files is simply the semantic version of the JSON -metadata schema: - -``` -1.0 -``` - -The `repositories` file is another JSON file which describes names/tags: - -``` -{ - "busybox":{ - "latest":"5f29f704785248ddb9d06b90a11b5ea36c534865e9035e4022bb2e71d4ecbb9a" - } -} -``` - -Every key in this object is the name of a repository, and maps to a collection -of tag suffixes. Each tag maps to the ID of the image represented by that tag. -This file is only used for backwards compatibility. Current implementations use -the `manifest.json` file instead. - -The `manifest.json` file provides the image JSON for the top-level image, and -optionally for parent images that this image was derived from. It consists of -an array of metadata entries: - -``` -[ - { - "Config": "47bcc53f74dc94b1920f0b34f6036096526296767650f223433fe65c35f149eb.json", - "RepoTags": ["busybox:latest"], - "Layers": [ - "a65da33792c5187473faa80fa3e1b975acba06712852d1dea860692ccddf3198/layer.tar", - "5f29f704785248ddb9d06b90a11b5ea36c534865e9035e4022bb2e71d4ecbb9a/layer.tar" - ] - } -] -``` - -There is an entry in the array for each image. - -The `Config` field references another file in the tar which includes the image -JSON for this image. - -The `RepoTags` field lists references pointing to this image. - -The `Layers` field points to the filesystem changeset tars. - -An optional `Parent` field references the imageID of the parent image. This -parent must be part of the same `manifest.json` file. - -This file shouldn't be confused with the distribution manifest, used to push -and pull images. - -Generally, implementations that support this version of the spec will use -the `manifest.json` file if available, and older implementations will use the -legacy `*/json` files and `repositories`. diff --git a/vendor/github.com/docker/docker/image/spec/v1.md b/vendor/github.com/docker/docker/image/spec/v1.md deleted file mode 100644 index 57a599b8f..000000000 --- a/vendor/github.com/docker/docker/image/spec/v1.md +++ /dev/null @@ -1,573 +0,0 @@ -# Docker Image Specification v1.0.0 - -An *Image* is an ordered collection of root filesystem changes and the -corresponding execution parameters for use within a container runtime. This -specification outlines the format of these filesystem changes and corresponding -parameters and describes how to create and use them for use with a container -runtime and execution tool. - -## Terminology - -This specification uses the following terms: - -
-
- Layer -
-
- Images are composed of layers. Image layer is a general - term which may be used to refer to one or both of the following: - -
    -
  1. The metadata for the layer, described in the JSON format.
  2. -
  3. The filesystem changes described by a layer.
  4. -
- - To refer to the former you may use the term Layer JSON or - Layer Metadata. To refer to the latter you may use the term - Image Filesystem Changeset or Image Diff. -
-
- Image JSON -
-
- Each layer has an associated JSON structure which describes some - basic information about the image such as date created, author, and the - ID of its parent image as well as execution/runtime configuration like - its entry point, default arguments, CPU/memory shares, networking, and - volumes. -
-
- Image Filesystem Changeset -
-
- Each layer has an archive of the files which have been added, changed, - or deleted relative to its parent layer. Using a layer-based or union - filesystem such as AUFS, or by computing the diff from filesystem - snapshots, the filesystem changeset can be used to present a series of - image layers as if they were one cohesive filesystem. -
-
- Image ID -
-
- Each layer is given an ID upon its creation. It is - represented as a hexadecimal encoding of 256 bits, e.g., - a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9. - Image IDs should be sufficiently random so as to be globally unique. - 32 bytes read from /dev/urandom is sufficient for all - practical purposes. Alternatively, an image ID may be derived as a - cryptographic hash of image contents as the result is considered - indistinguishable from random. The choice is left up to implementors. -
-
- Image Parent -
-
- Most layer metadata structs contain a parent field which - refers to the Image from which another directly descends. An image - contains a separate JSON metadata file and set of changes relative to - the filesystem of its parent image. Image Ancestor and - Image Descendant are also common terms. -
-
- Image Checksum -
-
- Layer metadata structs contain a cryptographic hash of the contents of - the layer's filesystem changeset. Though the set of changes exists as a - simple Tar archive, two archives with identical filenames and content - will have different SHA digests if the last-access or last-modified - times of any entries differ. For this reason, image checksums are - generated using the TarSum algorithm which produces a cryptographic - hash of file contents and selected headers only. Details of this - algorithm are described in the separate TarSum specification. -
-
- Tag -
-
- A tag serves to map a descriptive, user-given name to any single image - ID. An image name suffix (the name component after :) is - often referred to as a tag as well, though it strictly refers to the - full name of an image. Acceptable values for a tag suffix are - implementation specific, but they SHOULD be limited to the set of - alphanumeric characters [a-zA-z0-9], punctuation - characters [._-], and MUST NOT contain a : - character. -
-
- Repository -
-
- A collection of tags grouped under a common prefix (the name component - before :). For example, in an image tagged with the name - my-app:3.1.4, my-app is the Repository - component of the name. Acceptable values for repository name are - implementation specific, but they SHOULD be limited to the set of - alphanumeric characters [a-zA-z0-9], and punctuation - characters [._-], however it MAY contain additional - / and : characters for organizational - purposes, with the last : character being interpreted - dividing the repository component of the name from the tag suffix - component. -
-
- -## Image JSON Description - -Here is an example image JSON file: - -``` -{ - "id": "a9561eb1b190625c9adb5a9513e72c4dedafc1cb2d4c5236c9a6957ec7dfd5a9", - "parent": "c6e3cedcda2e3982a1a6760e178355e8e65f7b80e4e5248743fa3549d284e024", - "checksum": "tarsum.v1+sha256:e58fcf7418d2390dec8e8fb69d88c06ec07039d651fedc3aa72af9972e7d046b", - "created": "2014-10-13T21:19:18.674353812Z", - "author": "Alyssa P. Hacker <alyspdev@example.com>", - "architecture": "amd64", - "os": "linux", - "Size": 271828, - "config": { - "User": "alice", - "Memory": 2048, - "MemorySwap": 4096, - "CpuShares": 8, - "ExposedPorts": { - "8080/tcp": {} - }, - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "FOO=docker_is_a_really", - "BAR=great_tool_you_know" - ], - "Entrypoint": [ - "/bin/my-app-binary" - ], - "Cmd": [ - "--foreground", - "--config", - "/etc/my-app.d/default.cfg" - ], - "Volumes": { - "/var/job-result-data": {}, - "/var/log/my-app-logs": {}, - }, - "WorkingDir": "/home/alice", - } -} -``` - -### Image JSON Field Descriptions - -
-
- id string -
-
- Randomly generated, 256-bit, hexadecimal encoded. Uniquely identifies - the image. -
-
- parent string -
-
- ID of the parent image. If there is no parent image then this field - should be omitted. A collection of images may share many of the same - ancestor layers. This organizational structure is strictly a tree with - any one layer having either no parent or a single parent and zero or - more descendant layers. Cycles are not allowed and implementations - should be careful to avoid creating them or iterating through a cycle - indefinitely. -
-
- created string -
-
- ISO-8601 formatted combined date and time at which the image was - created. -
-
- author string -
-
- Gives the name and/or email address of the person or entity which - created and is responsible for maintaining the image. -
-
- architecture string -
-
- The CPU architecture which the binaries in this image are built to run - on. Possible values include: -
    -
  • 386
  • -
  • amd64
  • -
  • arm
  • -
- More values may be supported in the future and any of these may or may - not be supported by a given container runtime implementation. -
-
- os string -
-
- The name of the operating system which the image is built to run on. - Possible values include: -
    -
  • darwin
  • -
  • freebsd
  • -
  • linux
  • -
- More values may be supported in the future and any of these may or may - not be supported by a given container runtime implementation. -
-
- checksum string -
-
- Image Checksum of the filesystem changeset associated with the image - layer. -
-
- Size integer -
-
- The size in bytes of the filesystem changeset associated with the image - layer. -
-
- config struct -
-
- The execution parameters which should be used as a base when running a - container using the image. This field can be null, in - which case any execution parameters should be specified at creation of - the container. - -

Container RunConfig Field Descriptions

- -
-
- User string -
-
-

The username or UID which the process in the container should - run as. This acts as a default value to use when the value is - not specified when creating a container.

- -

All of the following are valid:

- -
    -
  • user
  • -
  • uid
  • -
  • user:group
  • -
  • uid:gid
  • -
  • uid:group
  • -
  • user:gid
  • -
- -

If group/gid is not specified, the - default group and supplementary groups of the given - user/uid in /etc/passwd - from the container are applied.

-
-
- Memory integer -
-
- Memory limit (in bytes). This acts as a default value to use - when the value is not specified when creating a container. -
-
- MemorySwap integer -
-
- Total memory usage (memory + swap); set to -1 to - disable swap. This acts as a default value to use when the - value is not specified when creating a container. -
-
- CpuShares integer -
-
- CPU shares (relative weight vs. other containers). This acts as - a default value to use when the value is not specified when - creating a container. -
-
- ExposedPorts struct -
-
- A set of ports to expose from a container running this image. - This JSON structure value is unusual because it is a direct - JSON serialization of the Go type - map[string]struct{} and is represented in JSON as - an object mapping its keys to an empty object. Here is an - example: - -
{
-    "8080": {},
-    "53/udp": {},
-    "2356/tcp": {}
-}
- - Its keys can be in the format of: -
    -
  • - "port/tcp" -
  • -
  • - "port/udp" -
  • -
  • - "port" -
  • -
- with the default protocol being "tcp" if not - specified. - - These values act as defaults and are merged with any specified - when creating a container. -
-
- Env array of strings -
-
- Entries are in the format of VARNAME="var value". - These values act as defaults and are merged with any specified - when creating a container. -
-
- Entrypoint array of strings -
-
- A list of arguments to use as the command to execute when the - container starts. This value acts as a default and is replaced - by an entrypoint specified when creating a container. -
-
- Cmd array of strings -
-
- Default arguments to the entry point of the container. These - values act as defaults and are replaced with any specified when - creating a container. If an Entrypoint value is - not specified, then the first entry of the Cmd - array should be interpreted as the executable to run. -
-
- Volumes struct -
-
- A set of directories which should be created as data volumes in - a container running this image. This JSON structure value is - unusual because it is a direct JSON serialization of the Go - type map[string]struct{} and is represented in - JSON as an object mapping its keys to an empty object. Here is - an example: -
{
-    "/var/my-app-data/": {},
-    "/etc/some-config.d/": {},
-}
-
-
- WorkingDir string -
-
- Sets the current working directory of the entry point process - in the container. This value acts as a default and is replaced - by a working directory specified when creating a container. -
-
-
-
- -Any extra fields in the Image JSON struct are considered implementation -specific and should be ignored by any implementations which are unable to -interpret them. - -## Creating an Image Filesystem Changeset - -An example of creating an Image Filesystem Changeset follows. - -An image root filesystem is first created as an empty directory named with the -ID of the image being created. Here is the initial empty directory structure -for the changeset for an image with ID `c3167915dc9d` ([real IDs are much -longer](#id_desc), but this example use a truncated one here for brevity. -Implementations need not name the rootfs directory in this way but it may be -convenient for keeping record of a large number of image layers.): - -``` -c3167915dc9d/ -``` - -Files and directories are then created: - -``` -c3167915dc9d/ - etc/ - my-app-config - bin/ - my-app-binary - my-app-tools -``` - -The `c3167915dc9d` directory is then committed as a plain Tar archive with -entries for the following files: - -``` -etc/my-app-config -bin/my-app-binary -bin/my-app-tools -``` - -The TarSum checksum for the archive file is then computed and placed in the -JSON metadata along with the execution parameters. - -To make changes to the filesystem of this container image, create a new -directory named with a new ID, such as `f60c56784b83`, and initialize it with -a snapshot of the parent image's root filesystem, so that the directory is -identical to that of `c3167915dc9d`. NOTE: a copy-on-write or union filesystem -can make this very efficient: - -``` -f60c56784b83/ - etc/ - my-app-config - bin/ - my-app-binary - my-app-tools -``` - -This example change is going add a configuration directory at `/etc/my-app.d` -which contains a default config file. There's also a change to the -`my-app-tools` binary to handle the config layout change. The `f60c56784b83` -directory then looks like this: - -``` -f60c56784b83/ - etc/ - my-app.d/ - default.cfg - bin/ - my-app-binary - my-app-tools -``` - -This reflects the removal of `/etc/my-app-config` and creation of a file and -directory at `/etc/my-app.d/default.cfg`. `/bin/my-app-tools` has also been -replaced with an updated version. Before committing this directory to a -changeset, because it has a parent image, it is first compared with the -directory tree of the parent snapshot, `f60c56784b83`, looking for files and -directories that have been added, modified, or removed. The following changeset -is found: - -``` -Added: /etc/my-app.d/default.cfg -Modified: /bin/my-app-tools -Deleted: /etc/my-app-config -``` - -A Tar Archive is then created which contains *only* this changeset: The added -and modified files and directories in their entirety, and for each deleted item -an entry for an empty file at the same location but with the basename of the -deleted file or directory prefixed with `.wh.`. The filenames prefixed with -`.wh.` are known as "whiteout" files. NOTE: For this reason, it is not possible -to create an image root filesystem which contains a file or directory with a -name beginning with `.wh.`. The resulting Tar archive for `f60c56784b83` has -the following entries: - -``` -/etc/my-app.d/default.cfg -/bin/my-app-tools -/etc/.wh.my-app-config -``` - -Any given image is likely to be composed of several of these Image Filesystem -Changeset tar archives. - -## Combined Image JSON + Filesystem Changeset Format - -There is also a format for a single archive which contains complete information -about an image, including: - - - repository names/tags - - all image layer JSON files - - all tar archives of each layer filesystem changesets - -For example, here's what the full archive of `library/busybox` is (displayed in -`tree` format): - -``` -. -├── 5785b62b697b99a5af6cd5d0aabc804d5748abbb6d3d07da5d1d3795f2dcc83e -│   ├── VERSION -│   ├── json -│   └── layer.tar -├── a7b8b41220991bfc754d7ad445ad27b7f272ab8b4a2c175b9512b97471d02a8a -│   ├── VERSION -│   ├── json -│   └── layer.tar -├── a936027c5ca8bf8f517923169a233e391cbb38469a75de8383b5228dc2d26ceb -│   ├── VERSION -│   ├── json -│   └── layer.tar -├── f60c56784b832dd990022afc120b8136ab3da9528094752ae13fe63a2d28dc8c -│   ├── VERSION -│   ├── json -│   └── layer.tar -└── repositories -``` - -There are one or more directories named with the ID for each layer in a full -image. Each of these directories contains 3 files: - - * `VERSION` - The schema version of the `json` file - * `json` - The JSON metadata for an image layer - * `layer.tar` - The Tar archive of the filesystem changeset for an image - layer. - -The content of the `VERSION` files is simply the semantic version of the JSON -metadata schema: - -``` -1.0 -``` - -And the `repositories` file is another JSON file which describes names/tags: - -``` -{ - "busybox":{ - "latest":"5785b62b697b99a5af6cd5d0aabc804d5748abbb6d3d07da5d1d3795f2dcc83e" - } -} -``` - -Every key in this object is the name of a repository, and maps to a collection -of tag suffixes. Each tag maps to the ID of the image represented by that tag. - -## Loading an Image Filesystem Changeset - -Unpacking a bundle of image layer JSON files and their corresponding filesystem -changesets can be done using a series of steps: - -1. Follow the parent IDs of image layers to find the root ancestor (an image -with no parent ID specified). -2. For every image layer, in order from root ancestor and descending down, -extract the contents of that layer's filesystem changeset archive into a -directory which will be used as the root of a container filesystem. - - - Extract all contents of each archive. - - Walk the directory tree once more, removing any files with the prefix - `.wh.` and the corresponding file or directory named without this prefix. - - -## Implementations - -This specification is an admittedly imperfect description of an -imperfectly-understood problem. The Docker project is, in turn, an attempt to -implement this specification. Our goal and our execution toward it will evolve -over time, but our primary concern in this specification and in our -implementation is compatibility and interoperability. diff --git a/vendor/github.com/docker/docker/image/store.go b/vendor/github.com/docker/docker/image/store.go deleted file mode 100644 index b61c45609..000000000 --- a/vendor/github.com/docker/docker/image/store.go +++ /dev/null @@ -1,295 +0,0 @@ -package image - -import ( - "encoding/json" - "errors" - "fmt" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/layer" -) - -// Store is an interface for creating and accessing images -type Store interface { - Create(config []byte) (ID, error) - Get(id ID) (*Image, error) - Delete(id ID) ([]layer.Metadata, error) - Search(partialID string) (ID, error) - SetParent(id ID, parent ID) error - GetParent(id ID) (ID, error) - Children(id ID) []ID - Map() map[ID]*Image - Heads() map[ID]*Image -} - -// LayerGetReleaser is a minimal interface for getting and releasing images. -type LayerGetReleaser interface { - Get(layer.ChainID) (layer.Layer, error) - Release(layer.Layer) ([]layer.Metadata, error) -} - -type imageMeta struct { - layer layer.Layer - children map[ID]struct{} -} - -type store struct { - sync.Mutex - ls LayerGetReleaser - images map[ID]*imageMeta - fs StoreBackend - digestSet *digest.Set -} - -// NewImageStore returns new store object for given layer store -func NewImageStore(fs StoreBackend, ls LayerGetReleaser) (Store, error) { - is := &store{ - ls: ls, - images: make(map[ID]*imageMeta), - fs: fs, - digestSet: digest.NewSet(), - } - - // load all current images and retain layers - if err := is.restore(); err != nil { - return nil, err - } - - return is, nil -} - -func (is *store) restore() error { - err := is.fs.Walk(func(dgst digest.Digest) error { - img, err := is.Get(IDFromDigest(dgst)) - if err != nil { - logrus.Errorf("invalid image %v, %v", dgst, err) - return nil - } - var l layer.Layer - if chainID := img.RootFS.ChainID(); chainID != "" { - l, err = is.ls.Get(chainID) - if err != nil { - return err - } - } - if err := is.digestSet.Add(dgst); err != nil { - return err - } - - imageMeta := &imageMeta{ - layer: l, - children: make(map[ID]struct{}), - } - - is.images[IDFromDigest(dgst)] = imageMeta - - return nil - }) - if err != nil { - return err - } - - // Second pass to fill in children maps - for id := range is.images { - if parent, err := is.GetParent(id); err == nil { - if parentMeta := is.images[parent]; parentMeta != nil { - parentMeta.children[id] = struct{}{} - } - } - } - - return nil -} - -func (is *store) Create(config []byte) (ID, error) { - var img Image - err := json.Unmarshal(config, &img) - if err != nil { - return "", err - } - - // Must reject any config that references diffIDs from the history - // which aren't among the rootfs layers. - rootFSLayers := make(map[layer.DiffID]struct{}) - for _, diffID := range img.RootFS.DiffIDs { - rootFSLayers[diffID] = struct{}{} - } - - layerCounter := 0 - for _, h := range img.History { - if !h.EmptyLayer { - layerCounter++ - } - } - if layerCounter > len(img.RootFS.DiffIDs) { - return "", errors.New("too many non-empty layers in History section") - } - - dgst, err := is.fs.Set(config) - if err != nil { - return "", err - } - imageID := IDFromDigest(dgst) - - is.Lock() - defer is.Unlock() - - if _, exists := is.images[imageID]; exists { - return imageID, nil - } - - layerID := img.RootFS.ChainID() - - var l layer.Layer - if layerID != "" { - l, err = is.ls.Get(layerID) - if err != nil { - return "", err - } - } - - imageMeta := &imageMeta{ - layer: l, - children: make(map[ID]struct{}), - } - - is.images[imageID] = imageMeta - if err := is.digestSet.Add(imageID.Digest()); err != nil { - delete(is.images, imageID) - return "", err - } - - return imageID, nil -} - -func (is *store) Search(term string) (ID, error) { - is.Lock() - defer is.Unlock() - - dgst, err := is.digestSet.Lookup(term) - if err != nil { - if err == digest.ErrDigestNotFound { - err = fmt.Errorf("No such image: %s", term) - } - return "", err - } - return IDFromDigest(dgst), nil -} - -func (is *store) Get(id ID) (*Image, error) { - // todo: Check if image is in images - // todo: Detect manual insertions and start using them - config, err := is.fs.Get(id.Digest()) - if err != nil { - return nil, err - } - - img, err := NewFromJSON(config) - if err != nil { - return nil, err - } - img.computedID = id - - img.Parent, err = is.GetParent(id) - if err != nil { - img.Parent = "" - } - - return img, nil -} - -func (is *store) Delete(id ID) ([]layer.Metadata, error) { - is.Lock() - defer is.Unlock() - - imageMeta := is.images[id] - if imageMeta == nil { - return nil, fmt.Errorf("unrecognized image ID %s", id.String()) - } - for id := range imageMeta.children { - is.fs.DeleteMetadata(id.Digest(), "parent") - } - if parent, err := is.GetParent(id); err == nil && is.images[parent] != nil { - delete(is.images[parent].children, id) - } - - if err := is.digestSet.Remove(id.Digest()); err != nil { - logrus.Errorf("error removing %s from digest set: %q", id, err) - } - delete(is.images, id) - is.fs.Delete(id.Digest()) - - if imageMeta.layer != nil { - return is.ls.Release(imageMeta.layer) - } - return nil, nil -} - -func (is *store) SetParent(id, parent ID) error { - is.Lock() - defer is.Unlock() - parentMeta := is.images[parent] - if parentMeta == nil { - return fmt.Errorf("unknown parent image ID %s", parent.String()) - } - if parent, err := is.GetParent(id); err == nil && is.images[parent] != nil { - delete(is.images[parent].children, id) - } - parentMeta.children[id] = struct{}{} - return is.fs.SetMetadata(id.Digest(), "parent", []byte(parent)) -} - -func (is *store) GetParent(id ID) (ID, error) { - d, err := is.fs.GetMetadata(id.Digest(), "parent") - if err != nil { - return "", err - } - return ID(d), nil // todo: validate? -} - -func (is *store) Children(id ID) []ID { - is.Lock() - defer is.Unlock() - - return is.children(id) -} - -func (is *store) children(id ID) []ID { - var ids []ID - if is.images[id] != nil { - for id := range is.images[id].children { - ids = append(ids, id) - } - } - return ids -} - -func (is *store) Heads() map[ID]*Image { - return is.imagesMap(false) -} - -func (is *store) Map() map[ID]*Image { - return is.imagesMap(true) -} - -func (is *store) imagesMap(all bool) map[ID]*Image { - is.Lock() - defer is.Unlock() - - images := make(map[ID]*Image) - - for id := range is.images { - if !all && len(is.children(id)) > 0 { - continue - } - img, err := is.Get(id) - if err != nil { - logrus.Errorf("invalid image access: %q, error: %q", id, err) - continue - } - images[id] = img - } - return images -} diff --git a/vendor/github.com/docker/docker/image/store_test.go b/vendor/github.com/docker/docker/image/store_test.go deleted file mode 100644 index 50f8aa8b8..000000000 --- a/vendor/github.com/docker/docker/image/store_test.go +++ /dev/null @@ -1,300 +0,0 @@ -package image - -import ( - "io/ioutil" - "os" - "testing" - - "github.com/docker/distribution/digest" - "github.com/docker/docker/layer" -) - -func TestRestore(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - fs, err := NewFSStoreBackend(tmpdir) - if err != nil { - t.Fatal(err) - } - - id1, err := fs.Set([]byte(`{"comment": "abc", "rootfs": {"type": "layers"}}`)) - if err != nil { - t.Fatal(err) - } - _, err = fs.Set([]byte(`invalid`)) - if err != nil { - t.Fatal(err) - } - id2, err := fs.Set([]byte(`{"comment": "def", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`)) - if err != nil { - t.Fatal(err) - } - err = fs.SetMetadata(id2, "parent", []byte(id1)) - if err != nil { - t.Fatal(err) - } - - is, err := NewImageStore(fs, &mockLayerGetReleaser{}) - if err != nil { - t.Fatal(err) - } - - imgs := is.Map() - if actual, expected := len(imgs), 2; actual != expected { - t.Fatalf("invalid images length, expected 2, got %q", len(imgs)) - } - - img1, err := is.Get(ID(id1)) - if err != nil { - t.Fatal(err) - } - - if actual, expected := img1.computedID, ID(id1); actual != expected { - t.Fatalf("invalid image ID: expected %q, got %q", expected, actual) - } - - if actual, expected := img1.computedID.String(), string(id1); actual != expected { - t.Fatalf("invalid image ID string: expected %q, got %q", expected, actual) - } - - img2, err := is.Get(ID(id2)) - if err != nil { - t.Fatal(err) - } - - if actual, expected := img1.Comment, "abc"; actual != expected { - t.Fatalf("invalid comment for image1: expected %q, got %q", expected, actual) - } - - if actual, expected := img2.Comment, "def"; actual != expected { - t.Fatalf("invalid comment for image2: expected %q, got %q", expected, actual) - } - - p, err := is.GetParent(ID(id1)) - if err == nil { - t.Fatal("expected error for getting parent") - } - - p, err = is.GetParent(ID(id2)) - if err != nil { - t.Fatal(err) - } - if actual, expected := p, ID(id1); actual != expected { - t.Fatalf("invalid parent: expected %q, got %q", expected, actual) - } - - children := is.Children(ID(id1)) - if len(children) != 1 { - t.Fatalf("invalid children length: %q", len(children)) - } - if actual, expected := children[0], ID(id2); actual != expected { - t.Fatalf("invalid child for id1: expected %q, got %q", expected, actual) - } - - heads := is.Heads() - if actual, expected := len(heads), 1; actual != expected { - t.Fatalf("invalid images length: expected %q, got %q", expected, actual) - } - - sid1, err := is.Search(string(id1)[:10]) - if err != nil { - t.Fatal(err) - } - if actual, expected := sid1, ID(id1); actual != expected { - t.Fatalf("searched ID mismatch: expected %q, got %q", expected, actual) - } - - sid1, err = is.Search(digest.Digest(id1).Hex()[:6]) - if err != nil { - t.Fatal(err) - } - if actual, expected := sid1, ID(id1); actual != expected { - t.Fatalf("searched ID mismatch: expected %q, got %q", expected, actual) - } - - invalidPattern := digest.Digest(id1).Hex()[1:6] - _, err = is.Search(invalidPattern) - if err == nil { - t.Fatalf("expected search for %q to fail", invalidPattern) - } - -} - -func TestAddDelete(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - fs, err := NewFSStoreBackend(tmpdir) - if err != nil { - t.Fatal(err) - } - - is, err := NewImageStore(fs, &mockLayerGetReleaser{}) - if err != nil { - t.Fatal(err) - } - - id1, err := is.Create([]byte(`{"comment": "abc", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`)) - if err != nil { - t.Fatal(err) - } - - if actual, expected := id1, ID("sha256:8d25a9c45df515f9d0fe8e4a6b1c64dd3b965a84790ddbcc7954bb9bc89eb993"); actual != expected { - t.Fatalf("create ID mismatch: expected %q, got %q", expected, actual) - } - - img, err := is.Get(id1) - if err != nil { - t.Fatal(err) - } - - if actual, expected := img.Comment, "abc"; actual != expected { - t.Fatalf("invalid comment in image: expected %q, got %q", expected, actual) - } - - id2, err := is.Create([]byte(`{"comment": "def", "rootfs": {"type": "layers", "diff_ids": ["2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"]}}`)) - if err != nil { - t.Fatal(err) - } - - err = is.SetParent(id2, id1) - if err != nil { - t.Fatal(err) - } - - pid1, err := is.GetParent(id2) - if err != nil { - t.Fatal(err) - } - if actual, expected := pid1, id1; actual != expected { - t.Fatalf("invalid parent for image: expected %q, got %q", expected, actual) - } - - _, err = is.Delete(id1) - if err != nil { - t.Fatal(err) - } - _, err = is.Get(id1) - if err == nil { - t.Fatalf("expected get for deleted image %q to fail", id1) - } - _, err = is.Get(id2) - if err != nil { - t.Fatal(err) - } - pid1, err = is.GetParent(id2) - if err == nil { - t.Fatalf("expected parent check for image %q to fail, got %q", id2, pid1) - } - -} - -func TestSearchAfterDelete(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - fs, err := NewFSStoreBackend(tmpdir) - if err != nil { - t.Fatal(err) - } - - is, err := NewImageStore(fs, &mockLayerGetReleaser{}) - if err != nil { - t.Fatal(err) - } - - id, err := is.Create([]byte(`{"comment": "abc", "rootfs": {"type": "layers"}}`)) - if err != nil { - t.Fatal(err) - } - - id1, err := is.Search(string(id)[:15]) - if err != nil { - t.Fatal(err) - } - - if actual, expected := id1, id; expected != actual { - t.Fatalf("wrong id returned from search: expected %q, got %q", expected, actual) - } - - if _, err := is.Delete(id); err != nil { - t.Fatal(err) - } - - if _, err := is.Search(string(id)[:15]); err == nil { - t.Fatal("expected search after deletion to fail") - } -} - -func TestParentReset(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "images-fs-store") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - fs, err := NewFSStoreBackend(tmpdir) - if err != nil { - t.Fatal(err) - } - - is, err := NewImageStore(fs, &mockLayerGetReleaser{}) - if err != nil { - t.Fatal(err) - } - - id, err := is.Create([]byte(`{"comment": "abc1", "rootfs": {"type": "layers"}}`)) - if err != nil { - t.Fatal(err) - } - - id2, err := is.Create([]byte(`{"comment": "abc2", "rootfs": {"type": "layers"}}`)) - if err != nil { - t.Fatal(err) - } - - id3, err := is.Create([]byte(`{"comment": "abc3", "rootfs": {"type": "layers"}}`)) - if err != nil { - t.Fatal(err) - } - - if err := is.SetParent(id, id2); err != nil { - t.Fatal(err) - } - - ids := is.Children(id2) - if actual, expected := len(ids), 1; expected != actual { - t.Fatalf("wrong number of children: %d, got %d", expected, actual) - } - - if err := is.SetParent(id, id3); err != nil { - t.Fatal(err) - } - - ids = is.Children(id2) - if actual, expected := len(ids), 0; expected != actual { - t.Fatalf("wrong number of children after parent reset: %d, got %d", expected, actual) - } - - ids = is.Children(id3) - if actual, expected := len(ids), 1; expected != actual { - t.Fatalf("wrong number of children after parent reset: %d, got %d", expected, actual) - } - -} - -type mockLayerGetReleaser struct{} - -func (ls *mockLayerGetReleaser) Get(layer.ChainID) (layer.Layer, error) { - return nil, nil -} - -func (ls *mockLayerGetReleaser) Release(layer.Layer) ([]layer.Metadata, error) { - return nil, nil -} diff --git a/vendor/github.com/docker/docker/image/tarexport/load.go b/vendor/github.com/docker/docker/image/tarexport/load.go deleted file mode 100644 index 01edd91fb..000000000 --- a/vendor/github.com/docker/docker/image/tarexport/load.go +++ /dev/null @@ -1,390 +0,0 @@ -package tarexport - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "reflect" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/docker/image" - "github.com/docker/docker/image/v1" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/chrootarchive" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/pkg/streamformatter" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/symlink" - "github.com/docker/docker/pkg/system" - "github.com/docker/docker/reference" -) - -func (l *tarexporter) Load(inTar io.ReadCloser, outStream io.Writer, quiet bool) error { - var ( - sf = streamformatter.NewJSONStreamFormatter() - progressOutput progress.Output - ) - if !quiet { - progressOutput = sf.NewProgressOutput(outStream, false) - } - outStream = &streamformatter.StdoutFormatter{Writer: outStream, StreamFormatter: streamformatter.NewJSONStreamFormatter()} - - tmpDir, err := ioutil.TempDir("", "docker-import-") - if err != nil { - return err - } - defer os.RemoveAll(tmpDir) - - if err := chrootarchive.Untar(inTar, tmpDir, nil); err != nil { - return err - } - // read manifest, if no file then load in legacy mode - manifestPath, err := safePath(tmpDir, manifestFileName) - if err != nil { - return err - } - manifestFile, err := os.Open(manifestPath) - if err != nil { - if os.IsNotExist(err) { - return l.legacyLoad(tmpDir, outStream, progressOutput) - } - return err - } - defer manifestFile.Close() - - var manifest []manifestItem - if err := json.NewDecoder(manifestFile).Decode(&manifest); err != nil { - return err - } - - var parentLinks []parentLink - var imageIDsStr string - var imageRefCount int - - for _, m := range manifest { - configPath, err := safePath(tmpDir, m.Config) - if err != nil { - return err - } - config, err := ioutil.ReadFile(configPath) - if err != nil { - return err - } - img, err := image.NewFromJSON(config) - if err != nil { - return err - } - var rootFS image.RootFS - rootFS = *img.RootFS - rootFS.DiffIDs = nil - - if expected, actual := len(m.Layers), len(img.RootFS.DiffIDs); expected != actual { - return fmt.Errorf("invalid manifest, layers length mismatch: expected %q, got %q", expected, actual) - } - - for i, diffID := range img.RootFS.DiffIDs { - layerPath, err := safePath(tmpDir, m.Layers[i]) - if err != nil { - return err - } - r := rootFS - r.Append(diffID) - newLayer, err := l.ls.Get(r.ChainID()) - if err != nil { - newLayer, err = l.loadLayer(layerPath, rootFS, diffID.String(), m.LayerSources[diffID], progressOutput) - if err != nil { - return err - } - } - defer layer.ReleaseAndLog(l.ls, newLayer) - if expected, actual := diffID, newLayer.DiffID(); expected != actual { - return fmt.Errorf("invalid diffID for layer %d: expected %q, got %q", i, expected, actual) - } - rootFS.Append(diffID) - } - - imgID, err := l.is.Create(config) - if err != nil { - return err - } - imageIDsStr += fmt.Sprintf("Loaded image ID: %s\n", imgID) - - imageRefCount = 0 - for _, repoTag := range m.RepoTags { - named, err := reference.ParseNamed(repoTag) - if err != nil { - return err - } - ref, ok := named.(reference.NamedTagged) - if !ok { - return fmt.Errorf("invalid tag %q", repoTag) - } - l.setLoadedTag(ref, imgID.Digest(), outStream) - outStream.Write([]byte(fmt.Sprintf("Loaded image: %s\n", ref))) - imageRefCount++ - } - - parentLinks = append(parentLinks, parentLink{imgID, m.Parent}) - l.loggerImgEvent.LogImageEvent(imgID.String(), imgID.String(), "load") - } - - for _, p := range validatedParentLinks(parentLinks) { - if p.parentID != "" { - if err := l.setParentID(p.id, p.parentID); err != nil { - return err - } - } - } - - if imageRefCount == 0 { - outStream.Write([]byte(imageIDsStr)) - } - - return nil -} - -func (l *tarexporter) setParentID(id, parentID image.ID) error { - img, err := l.is.Get(id) - if err != nil { - return err - } - parent, err := l.is.Get(parentID) - if err != nil { - return err - } - if !checkValidParent(img, parent) { - return fmt.Errorf("image %v is not a valid parent for %v", parent.ID(), img.ID()) - } - return l.is.SetParent(id, parentID) -} - -func (l *tarexporter) loadLayer(filename string, rootFS image.RootFS, id string, foreignSrc distribution.Descriptor, progressOutput progress.Output) (layer.Layer, error) { - // We use system.OpenSequential to use sequential file access on Windows, avoiding - // depleting the standby list. On Linux, this equates to a regular os.Open. - rawTar, err := system.OpenSequential(filename) - if err != nil { - logrus.Debugf("Error reading embedded tar: %v", err) - return nil, err - } - defer rawTar.Close() - - var r io.Reader - if progressOutput != nil { - fileInfo, err := rawTar.Stat() - if err != nil { - logrus.Debugf("Error statting file: %v", err) - return nil, err - } - - r = progress.NewProgressReader(rawTar, progressOutput, fileInfo.Size(), stringid.TruncateID(id), "Loading layer") - } else { - r = rawTar - } - - inflatedLayerData, err := archive.DecompressStream(r) - if err != nil { - return nil, err - } - defer inflatedLayerData.Close() - - if ds, ok := l.ls.(layer.DescribableStore); ok { - return ds.RegisterWithDescriptor(inflatedLayerData, rootFS.ChainID(), foreignSrc) - } - return l.ls.Register(inflatedLayerData, rootFS.ChainID()) -} - -func (l *tarexporter) setLoadedTag(ref reference.NamedTagged, imgID digest.Digest, outStream io.Writer) error { - if prevID, err := l.rs.Get(ref); err == nil && prevID != imgID { - fmt.Fprintf(outStream, "The image %s already exists, renaming the old one with ID %s to empty string\n", ref.String(), string(prevID)) // todo: this message is wrong in case of multiple tags - } - - if err := l.rs.AddTag(ref, imgID, true); err != nil { - return err - } - return nil -} - -func (l *tarexporter) legacyLoad(tmpDir string, outStream io.Writer, progressOutput progress.Output) error { - legacyLoadedMap := make(map[string]image.ID) - - dirs, err := ioutil.ReadDir(tmpDir) - if err != nil { - return err - } - - // every dir represents an image - for _, d := range dirs { - if d.IsDir() { - if err := l.legacyLoadImage(d.Name(), tmpDir, legacyLoadedMap, progressOutput); err != nil { - return err - } - } - } - - // load tags from repositories file - repositoriesPath, err := safePath(tmpDir, legacyRepositoriesFileName) - if err != nil { - return err - } - repositoriesFile, err := os.Open(repositoriesPath) - if err != nil { - return err - } - defer repositoriesFile.Close() - - repositories := make(map[string]map[string]string) - if err := json.NewDecoder(repositoriesFile).Decode(&repositories); err != nil { - return err - } - - for name, tagMap := range repositories { - for tag, oldID := range tagMap { - imgID, ok := legacyLoadedMap[oldID] - if !ok { - return fmt.Errorf("invalid target ID: %v", oldID) - } - named, err := reference.WithName(name) - if err != nil { - return err - } - ref, err := reference.WithTag(named, tag) - if err != nil { - return err - } - l.setLoadedTag(ref, imgID.Digest(), outStream) - } - } - - return nil -} - -func (l *tarexporter) legacyLoadImage(oldID, sourceDir string, loadedMap map[string]image.ID, progressOutput progress.Output) error { - if _, loaded := loadedMap[oldID]; loaded { - return nil - } - configPath, err := safePath(sourceDir, filepath.Join(oldID, legacyConfigFileName)) - if err != nil { - return err - } - imageJSON, err := ioutil.ReadFile(configPath) - if err != nil { - logrus.Debugf("Error reading json: %v", err) - return err - } - - var img struct{ Parent string } - if err := json.Unmarshal(imageJSON, &img); err != nil { - return err - } - - var parentID image.ID - if img.Parent != "" { - for { - var loaded bool - if parentID, loaded = loadedMap[img.Parent]; !loaded { - if err := l.legacyLoadImage(img.Parent, sourceDir, loadedMap, progressOutput); err != nil { - return err - } - } else { - break - } - } - } - - // todo: try to connect with migrate code - rootFS := image.NewRootFS() - var history []image.History - - if parentID != "" { - parentImg, err := l.is.Get(parentID) - if err != nil { - return err - } - - rootFS = parentImg.RootFS - history = parentImg.History - } - - layerPath, err := safePath(sourceDir, filepath.Join(oldID, legacyLayerFileName)) - if err != nil { - return err - } - newLayer, err := l.loadLayer(layerPath, *rootFS, oldID, distribution.Descriptor{}, progressOutput) - if err != nil { - return err - } - rootFS.Append(newLayer.DiffID()) - - h, err := v1.HistoryFromConfig(imageJSON, false) - if err != nil { - return err - } - history = append(history, h) - - config, err := v1.MakeConfigFromV1Config(imageJSON, rootFS, history) - if err != nil { - return err - } - imgID, err := l.is.Create(config) - if err != nil { - return err - } - - metadata, err := l.ls.Release(newLayer) - layer.LogReleaseMetadata(metadata) - if err != nil { - return err - } - - if parentID != "" { - if err := l.is.SetParent(imgID, parentID); err != nil { - return err - } - } - - loadedMap[oldID] = imgID - return nil -} - -func safePath(base, path string) (string, error) { - return symlink.FollowSymlinkInScope(filepath.Join(base, path), base) -} - -type parentLink struct { - id, parentID image.ID -} - -func validatedParentLinks(pl []parentLink) (ret []parentLink) { -mainloop: - for i, p := range pl { - ret = append(ret, p) - for _, p2 := range pl { - if p2.id == p.parentID && p2.id != p.id { - continue mainloop - } - } - ret[i].parentID = "" - } - return -} - -func checkValidParent(img, parent *image.Image) bool { - if len(img.History) == 0 && len(parent.History) == 0 { - return true // having history is not mandatory - } - if len(img.History)-len(parent.History) != 1 { - return false - } - for i, h := range parent.History { - if !reflect.DeepEqual(h, img.History[i]) { - return false - } - } - return true -} diff --git a/vendor/github.com/docker/docker/image/tarexport/save.go b/vendor/github.com/docker/docker/image/tarexport/save.go deleted file mode 100644 index 6e3a5bc58..000000000 --- a/vendor/github.com/docker/docker/image/tarexport/save.go +++ /dev/null @@ -1,355 +0,0 @@ -package tarexport - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "time" - - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/docker/image" - "github.com/docker/docker/image/v1" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/system" - "github.com/docker/docker/reference" -) - -type imageDescriptor struct { - refs []reference.NamedTagged - layers []string -} - -type saveSession struct { - *tarexporter - outDir string - images map[image.ID]*imageDescriptor - savedLayers map[string]struct{} - diffIDPaths map[layer.DiffID]string // cache every diffID blob to avoid duplicates -} - -func (l *tarexporter) Save(names []string, outStream io.Writer) error { - images, err := l.parseNames(names) - if err != nil { - return err - } - - return (&saveSession{tarexporter: l, images: images}).save(outStream) -} - -func (l *tarexporter) parseNames(names []string) (map[image.ID]*imageDescriptor, error) { - imgDescr := make(map[image.ID]*imageDescriptor) - - addAssoc := func(id image.ID, ref reference.Named) { - if _, ok := imgDescr[id]; !ok { - imgDescr[id] = &imageDescriptor{} - } - - if ref != nil { - var tagged reference.NamedTagged - if _, ok := ref.(reference.Canonical); ok { - return - } - var ok bool - if tagged, ok = ref.(reference.NamedTagged); !ok { - var err error - if tagged, err = reference.WithTag(ref, reference.DefaultTag); err != nil { - return - } - } - - for _, t := range imgDescr[id].refs { - if tagged.String() == t.String() { - return - } - } - imgDescr[id].refs = append(imgDescr[id].refs, tagged) - } - } - - for _, name := range names { - id, ref, err := reference.ParseIDOrReference(name) - if err != nil { - return nil, err - } - if id != "" { - _, err := l.is.Get(image.IDFromDigest(id)) - if err != nil { - return nil, err - } - addAssoc(image.IDFromDigest(id), nil) - continue - } - if ref.Name() == string(digest.Canonical) { - imgID, err := l.is.Search(name) - if err != nil { - return nil, err - } - addAssoc(imgID, nil) - continue - } - if reference.IsNameOnly(ref) { - assocs := l.rs.ReferencesByName(ref) - for _, assoc := range assocs { - addAssoc(image.IDFromDigest(assoc.ID), assoc.Ref) - } - if len(assocs) == 0 { - imgID, err := l.is.Search(name) - if err != nil { - return nil, err - } - addAssoc(imgID, nil) - } - continue - } - id, err = l.rs.Get(ref) - if err != nil { - return nil, err - } - addAssoc(image.IDFromDigest(id), ref) - - } - return imgDescr, nil -} - -func (s *saveSession) save(outStream io.Writer) error { - s.savedLayers = make(map[string]struct{}) - s.diffIDPaths = make(map[layer.DiffID]string) - - // get image json - tempDir, err := ioutil.TempDir("", "docker-export-") - if err != nil { - return err - } - defer os.RemoveAll(tempDir) - - s.outDir = tempDir - reposLegacy := make(map[string]map[string]string) - - var manifest []manifestItem - var parentLinks []parentLink - - for id, imageDescr := range s.images { - foreignSrcs, err := s.saveImage(id) - if err != nil { - return err - } - - var repoTags []string - var layers []string - - for _, ref := range imageDescr.refs { - if _, ok := reposLegacy[ref.Name()]; !ok { - reposLegacy[ref.Name()] = make(map[string]string) - } - reposLegacy[ref.Name()][ref.Tag()] = imageDescr.layers[len(imageDescr.layers)-1] - repoTags = append(repoTags, ref.String()) - } - - for _, l := range imageDescr.layers { - layers = append(layers, filepath.Join(l, legacyLayerFileName)) - } - - manifest = append(manifest, manifestItem{ - Config: id.Digest().Hex() + ".json", - RepoTags: repoTags, - Layers: layers, - LayerSources: foreignSrcs, - }) - - parentID, _ := s.is.GetParent(id) - parentLinks = append(parentLinks, parentLink{id, parentID}) - s.tarexporter.loggerImgEvent.LogImageEvent(id.String(), id.String(), "save") - } - - for i, p := range validatedParentLinks(parentLinks) { - if p.parentID != "" { - manifest[i].Parent = p.parentID - } - } - - if len(reposLegacy) > 0 { - reposFile := filepath.Join(tempDir, legacyRepositoriesFileName) - rf, err := os.OpenFile(reposFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { - return err - } - - if err := json.NewEncoder(rf).Encode(reposLegacy); err != nil { - rf.Close() - return err - } - - rf.Close() - - if err := system.Chtimes(reposFile, time.Unix(0, 0), time.Unix(0, 0)); err != nil { - return err - } - } - - manifestFileName := filepath.Join(tempDir, manifestFileName) - f, err := os.OpenFile(manifestFileName, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { - return err - } - - if err := json.NewEncoder(f).Encode(manifest); err != nil { - f.Close() - return err - } - - f.Close() - - if err := system.Chtimes(manifestFileName, time.Unix(0, 0), time.Unix(0, 0)); err != nil { - return err - } - - fs, err := archive.Tar(tempDir, archive.Uncompressed) - if err != nil { - return err - } - defer fs.Close() - - if _, err := io.Copy(outStream, fs); err != nil { - return err - } - return nil -} - -func (s *saveSession) saveImage(id image.ID) (map[layer.DiffID]distribution.Descriptor, error) { - img, err := s.is.Get(id) - if err != nil { - return nil, err - } - - if len(img.RootFS.DiffIDs) == 0 { - return nil, fmt.Errorf("empty export - not implemented") - } - - var parent digest.Digest - var layers []string - var foreignSrcs map[layer.DiffID]distribution.Descriptor - for i := range img.RootFS.DiffIDs { - v1Img := image.V1Image{ - Created: img.Created, - } - if i == len(img.RootFS.DiffIDs)-1 { - v1Img = img.V1Image - } - rootFS := *img.RootFS - rootFS.DiffIDs = rootFS.DiffIDs[:i+1] - v1ID, err := v1.CreateID(v1Img, rootFS.ChainID(), parent) - if err != nil { - return nil, err - } - - v1Img.ID = v1ID.Hex() - if parent != "" { - v1Img.Parent = parent.Hex() - } - - src, err := s.saveLayer(rootFS.ChainID(), v1Img, img.Created) - if err != nil { - return nil, err - } - layers = append(layers, v1Img.ID) - parent = v1ID - if src.Digest != "" { - if foreignSrcs == nil { - foreignSrcs = make(map[layer.DiffID]distribution.Descriptor) - } - foreignSrcs[img.RootFS.DiffIDs[i]] = src - } - } - - configFile := filepath.Join(s.outDir, id.Digest().Hex()+".json") - if err := ioutil.WriteFile(configFile, img.RawJSON(), 0644); err != nil { - return nil, err - } - if err := system.Chtimes(configFile, img.Created, img.Created); err != nil { - return nil, err - } - - s.images[id].layers = layers - return foreignSrcs, nil -} - -func (s *saveSession) saveLayer(id layer.ChainID, legacyImg image.V1Image, createdTime time.Time) (distribution.Descriptor, error) { - if _, exists := s.savedLayers[legacyImg.ID]; exists { - return distribution.Descriptor{}, nil - } - - outDir := filepath.Join(s.outDir, legacyImg.ID) - if err := os.Mkdir(outDir, 0755); err != nil { - return distribution.Descriptor{}, err - } - - // todo: why is this version file here? - if err := ioutil.WriteFile(filepath.Join(outDir, legacyVersionFileName), []byte("1.0"), 0644); err != nil { - return distribution.Descriptor{}, err - } - - imageConfig, err := json.Marshal(legacyImg) - if err != nil { - return distribution.Descriptor{}, err - } - - if err := ioutil.WriteFile(filepath.Join(outDir, legacyConfigFileName), imageConfig, 0644); err != nil { - return distribution.Descriptor{}, err - } - - // serialize filesystem - layerPath := filepath.Join(outDir, legacyLayerFileName) - l, err := s.ls.Get(id) - if err != nil { - return distribution.Descriptor{}, err - } - defer layer.ReleaseAndLog(s.ls, l) - - if oldPath, exists := s.diffIDPaths[l.DiffID()]; exists { - relPath, err := filepath.Rel(outDir, oldPath) - if err != nil { - return distribution.Descriptor{}, err - } - os.Symlink(relPath, layerPath) - } else { - // Use system.CreateSequential rather than os.Create. This ensures sequential - // file access on Windows to avoid eating into MM standby list. - // On Linux, this equates to a regular os.Create. - tarFile, err := system.CreateSequential(layerPath) - if err != nil { - return distribution.Descriptor{}, err - } - defer tarFile.Close() - - arch, err := l.TarStream() - if err != nil { - return distribution.Descriptor{}, err - } - defer arch.Close() - - if _, err := io.Copy(tarFile, arch); err != nil { - return distribution.Descriptor{}, err - } - - for _, fname := range []string{"", legacyVersionFileName, legacyConfigFileName, legacyLayerFileName} { - // todo: maybe save layer created timestamp? - if err := system.Chtimes(filepath.Join(outDir, fname), createdTime, createdTime); err != nil { - return distribution.Descriptor{}, err - } - } - - s.diffIDPaths[l.DiffID()] = layerPath - } - s.savedLayers[legacyImg.ID] = struct{}{} - - var src distribution.Descriptor - if fs, ok := l.(distribution.Describable); ok { - src = fs.Descriptor() - } - return src, nil -} diff --git a/vendor/github.com/docker/docker/image/tarexport/tarexport.go b/vendor/github.com/docker/docker/image/tarexport/tarexport.go deleted file mode 100644 index c0be95480..000000000 --- a/vendor/github.com/docker/docker/image/tarexport/tarexport.go +++ /dev/null @@ -1,47 +0,0 @@ -package tarexport - -import ( - "github.com/docker/distribution" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/reference" -) - -const ( - manifestFileName = "manifest.json" - legacyLayerFileName = "layer.tar" - legacyConfigFileName = "json" - legacyVersionFileName = "VERSION" - legacyRepositoriesFileName = "repositories" -) - -type manifestItem struct { - Config string - RepoTags []string - Layers []string - Parent image.ID `json:",omitempty"` - LayerSources map[layer.DiffID]distribution.Descriptor `json:",omitempty"` -} - -type tarexporter struct { - is image.Store - ls layer.Store - rs reference.Store - loggerImgEvent LogImageEvent -} - -// LogImageEvent defines interface for event generation related to image tar(load and save) operations -type LogImageEvent interface { - //LogImageEvent generates an event related to an image operation - LogImageEvent(imageID, refName, action string) -} - -// NewTarExporter returns new ImageExporter for tar packages -func NewTarExporter(is image.Store, ls layer.Store, rs reference.Store, loggerImgEvent LogImageEvent) image.Exporter { - return &tarexporter{ - is: is, - ls: ls, - rs: rs, - loggerImgEvent: loggerImgEvent, - } -} diff --git a/vendor/github.com/docker/docker/image/v1/imagev1.go b/vendor/github.com/docker/docker/image/v1/imagev1.go deleted file mode 100644 index d498ddbc0..000000000 --- a/vendor/github.com/docker/docker/image/v1/imagev1.go +++ /dev/null @@ -1,156 +0,0 @@ -package v1 - -import ( - "encoding/json" - "fmt" - "reflect" - "regexp" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" -) - -var validHex = regexp.MustCompile(`^([a-f0-9]{64})$`) - -// noFallbackMinVersion is the minimum version for which v1compatibility -// information will not be marshaled through the Image struct to remove -// blank fields. -var noFallbackMinVersion = "1.8.3" - -// HistoryFromConfig creates a History struct from v1 configuration JSON -func HistoryFromConfig(imageJSON []byte, emptyLayer bool) (image.History, error) { - h := image.History{} - var v1Image image.V1Image - if err := json.Unmarshal(imageJSON, &v1Image); err != nil { - return h, err - } - - return image.History{ - Author: v1Image.Author, - Created: v1Image.Created, - CreatedBy: strings.Join(v1Image.ContainerConfig.Cmd, " "), - Comment: v1Image.Comment, - EmptyLayer: emptyLayer, - }, nil -} - -// CreateID creates an ID from v1 image, layerID and parent ID. -// Used for backwards compatibility with old clients. -func CreateID(v1Image image.V1Image, layerID layer.ChainID, parent digest.Digest) (digest.Digest, error) { - v1Image.ID = "" - v1JSON, err := json.Marshal(v1Image) - if err != nil { - return "", err - } - - var config map[string]*json.RawMessage - if err := json.Unmarshal(v1JSON, &config); err != nil { - return "", err - } - - // FIXME: note that this is slightly incompatible with RootFS logic - config["layer_id"] = rawJSON(layerID) - if parent != "" { - config["parent"] = rawJSON(parent) - } - - configJSON, err := json.Marshal(config) - if err != nil { - return "", err - } - logrus.Debugf("CreateV1ID %s", configJSON) - - return digest.FromBytes(configJSON), nil -} - -// MakeConfigFromV1Config creates an image config from the legacy V1 config format. -func MakeConfigFromV1Config(imageJSON []byte, rootfs *image.RootFS, history []image.History) ([]byte, error) { - var dver struct { - DockerVersion string `json:"docker_version"` - } - - if err := json.Unmarshal(imageJSON, &dver); err != nil { - return nil, err - } - - useFallback := versions.LessThan(dver.DockerVersion, noFallbackMinVersion) - - if useFallback { - var v1Image image.V1Image - err := json.Unmarshal(imageJSON, &v1Image) - if err != nil { - return nil, err - } - imageJSON, err = json.Marshal(v1Image) - if err != nil { - return nil, err - } - } - - var c map[string]*json.RawMessage - if err := json.Unmarshal(imageJSON, &c); err != nil { - return nil, err - } - - delete(c, "id") - delete(c, "parent") - delete(c, "Size") // Size is calculated from data on disk and is inconsistent - delete(c, "parent_id") - delete(c, "layer_id") - delete(c, "throwaway") - - c["rootfs"] = rawJSON(rootfs) - c["history"] = rawJSON(history) - - return json.Marshal(c) -} - -// MakeV1ConfigFromConfig creates an legacy V1 image config from an Image struct -func MakeV1ConfigFromConfig(img *image.Image, v1ID, parentV1ID string, throwaway bool) ([]byte, error) { - // Top-level v1compatibility string should be a modified version of the - // image config. - var configAsMap map[string]*json.RawMessage - if err := json.Unmarshal(img.RawJSON(), &configAsMap); err != nil { - return nil, err - } - - // Delete fields that didn't exist in old manifest - imageType := reflect.TypeOf(img).Elem() - for i := 0; i < imageType.NumField(); i++ { - f := imageType.Field(i) - jsonName := strings.Split(f.Tag.Get("json"), ",")[0] - // Parent is handled specially below. - if jsonName != "" && jsonName != "parent" { - delete(configAsMap, jsonName) - } - } - configAsMap["id"] = rawJSON(v1ID) - if parentV1ID != "" { - configAsMap["parent"] = rawJSON(parentV1ID) - } - if throwaway { - configAsMap["throwaway"] = rawJSON(true) - } - - return json.Marshal(configAsMap) -} - -func rawJSON(value interface{}) *json.RawMessage { - jsonval, err := json.Marshal(value) - if err != nil { - return nil - } - return (*json.RawMessage)(&jsonval) -} - -// ValidateID checks whether an ID string is a valid image ID. -func ValidateID(id string) error { - if ok := validHex.MatchString(id); !ok { - return fmt.Errorf("image ID %q is invalid", id) - } - return nil -} diff --git a/vendor/github.com/docker/docker/image/v1/imagev1_test.go b/vendor/github.com/docker/docker/image/v1/imagev1_test.go deleted file mode 100644 index 936c55e4c..000000000 --- a/vendor/github.com/docker/docker/image/v1/imagev1_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package v1 - -import ( - "encoding/json" - "testing" - - "github.com/docker/docker/image" -) - -func TestMakeV1ConfigFromConfig(t *testing.T) { - img := &image.Image{ - V1Image: image.V1Image{ - ID: "v2id", - Parent: "v2parent", - OS: "os", - }, - OSVersion: "osversion", - RootFS: &image.RootFS{ - Type: "layers", - }, - } - v2js, err := json.Marshal(img) - if err != nil { - t.Fatal(err) - } - - // Convert the image back in order to get RawJSON() support. - img, err = image.NewFromJSON(v2js) - if err != nil { - t.Fatal(err) - } - - js, err := MakeV1ConfigFromConfig(img, "v1id", "v1parent", false) - if err != nil { - t.Fatal(err) - } - - newimg := &image.Image{} - err = json.Unmarshal(js, newimg) - if err != nil { - t.Fatal(err) - } - - if newimg.V1Image.ID != "v1id" || newimg.Parent != "v1parent" { - t.Error("ids should have changed", newimg.V1Image.ID, newimg.V1Image.Parent) - } - - if newimg.RootFS != nil { - t.Error("rootfs should have been removed") - } - - if newimg.V1Image.OS != "os" { - t.Error("os should have been preserved") - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/benchmark_test.go b/vendor/github.com/docker/docker/integration-cli/benchmark_test.go deleted file mode 100644 index b87e131b7..000000000 --- a/vendor/github.com/docker/docker/integration-cli/benchmark_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "os" - "runtime" - "strings" - "sync" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) BenchmarkConcurrentContainerActions(c *check.C) { - maxConcurrency := runtime.GOMAXPROCS(0) - numIterations := c.N - outerGroup := &sync.WaitGroup{} - outerGroup.Add(maxConcurrency) - chErr := make(chan error, numIterations*2*maxConcurrency) - - for i := 0; i < maxConcurrency; i++ { - go func() { - defer outerGroup.Done() - innerGroup := &sync.WaitGroup{} - innerGroup.Add(2) - - go func() { - defer innerGroup.Done() - for i := 0; i < numIterations; i++ { - args := []string{"run", "-d", defaultSleepImage} - args = append(args, sleepCommandForDaemonPlatform()...) - out, _, err := dockerCmdWithError(args...) - if err != nil { - chErr <- fmt.Errorf(out) - return - } - - id := strings.TrimSpace(out) - tmpDir, err := ioutil.TempDir("", "docker-concurrent-test-"+id) - if err != nil { - chErr <- err - return - } - defer os.RemoveAll(tmpDir) - out, _, err = dockerCmdWithError("cp", id+":/tmp", tmpDir) - if err != nil { - chErr <- fmt.Errorf(out) - return - } - - out, _, err = dockerCmdWithError("kill", id) - if err != nil { - chErr <- fmt.Errorf(out) - } - - out, _, err = dockerCmdWithError("start", id) - if err != nil { - chErr <- fmt.Errorf(out) - } - - out, _, err = dockerCmdWithError("kill", id) - if err != nil { - chErr <- fmt.Errorf(out) - } - - // don't do an rm -f here since it can potentially ignore errors from the graphdriver - out, _, err = dockerCmdWithError("rm", id) - if err != nil { - chErr <- fmt.Errorf(out) - } - } - }() - - go func() { - defer innerGroup.Done() - for i := 0; i < numIterations; i++ { - out, _, err := dockerCmdWithError("ps") - if err != nil { - chErr <- fmt.Errorf(out) - } - } - }() - - innerGroup.Wait() - }() - } - - outerGroup.Wait() - close(chErr) - - for err := range chErr { - c.Assert(err, checker.IsNil) - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/check_test.go b/vendor/github.com/docker/docker/integration-cli/check_test.go deleted file mode 100644 index 7084d6f8a..000000000 --- a/vendor/github.com/docker/docker/integration-cli/check_test.go +++ /dev/null @@ -1,383 +0,0 @@ -package main - -import ( - "fmt" - "net/http/httptest" - "os" - "path/filepath" - "sync" - "syscall" - "testing" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/cliconfig" - "github.com/docker/docker/pkg/reexec" - "github.com/go-check/check" -) - -func Test(t *testing.T) { - reexec.Init() // This is required for external graphdriver tests - - if !isLocalDaemon { - fmt.Println("INFO: Testing against a remote daemon") - } else { - fmt.Println("INFO: Testing against a local daemon") - } - - if daemonPlatform == "linux" { - ensureFrozenImagesLinux(t) - } - check.TestingT(t) -} - -func init() { - check.Suite(&DockerSuite{}) -} - -type DockerSuite struct { -} - -func (s *DockerSuite) OnTimeout(c *check.C) { - if daemonPid > 0 && isLocalDaemon { - signalDaemonDump(daemonPid) - } -} - -func (s *DockerSuite) TearDownTest(c *check.C) { - unpauseAllContainers() - deleteAllContainers() - deleteAllImages() - deleteAllVolumes() - deleteAllNetworks() - deleteAllPlugins() -} - -func init() { - check.Suite(&DockerRegistrySuite{ - ds: &DockerSuite{}, - }) -} - -type DockerRegistrySuite struct { - ds *DockerSuite - reg *testRegistryV2 - d *Daemon -} - -func (s *DockerRegistrySuite) OnTimeout(c *check.C) { - s.d.DumpStackAndQuit() -} - -func (s *DockerRegistrySuite) SetUpTest(c *check.C) { - testRequires(c, DaemonIsLinux, RegistryHosting) - s.reg = setupRegistry(c, false, "", "") - s.d = NewDaemon(c) -} - -func (s *DockerRegistrySuite) TearDownTest(c *check.C) { - if s.reg != nil { - s.reg.Close() - } - if s.d != nil { - s.d.Stop() - } - s.ds.TearDownTest(c) -} - -func init() { - check.Suite(&DockerSchema1RegistrySuite{ - ds: &DockerSuite{}, - }) -} - -type DockerSchema1RegistrySuite struct { - ds *DockerSuite - reg *testRegistryV2 - d *Daemon -} - -func (s *DockerSchema1RegistrySuite) OnTimeout(c *check.C) { - s.d.DumpStackAndQuit() -} - -func (s *DockerSchema1RegistrySuite) SetUpTest(c *check.C) { - testRequires(c, DaemonIsLinux, RegistryHosting, NotArm64) - s.reg = setupRegistry(c, true, "", "") - s.d = NewDaemon(c) -} - -func (s *DockerSchema1RegistrySuite) TearDownTest(c *check.C) { - if s.reg != nil { - s.reg.Close() - } - if s.d != nil { - s.d.Stop() - } - s.ds.TearDownTest(c) -} - -func init() { - check.Suite(&DockerRegistryAuthHtpasswdSuite{ - ds: &DockerSuite{}, - }) -} - -type DockerRegistryAuthHtpasswdSuite struct { - ds *DockerSuite - reg *testRegistryV2 - d *Daemon -} - -func (s *DockerRegistryAuthHtpasswdSuite) OnTimeout(c *check.C) { - s.d.DumpStackAndQuit() -} - -func (s *DockerRegistryAuthHtpasswdSuite) SetUpTest(c *check.C) { - testRequires(c, DaemonIsLinux, RegistryHosting) - s.reg = setupRegistry(c, false, "htpasswd", "") - s.d = NewDaemon(c) -} - -func (s *DockerRegistryAuthHtpasswdSuite) TearDownTest(c *check.C) { - if s.reg != nil { - out, err := s.d.Cmd("logout", privateRegistryURL) - c.Assert(err, check.IsNil, check.Commentf(out)) - s.reg.Close() - } - if s.d != nil { - s.d.Stop() - } - s.ds.TearDownTest(c) -} - -func init() { - check.Suite(&DockerRegistryAuthTokenSuite{ - ds: &DockerSuite{}, - }) -} - -type DockerRegistryAuthTokenSuite struct { - ds *DockerSuite - reg *testRegistryV2 - d *Daemon -} - -func (s *DockerRegistryAuthTokenSuite) OnTimeout(c *check.C) { - s.d.DumpStackAndQuit() -} - -func (s *DockerRegistryAuthTokenSuite) SetUpTest(c *check.C) { - testRequires(c, DaemonIsLinux, RegistryHosting) - s.d = NewDaemon(c) -} - -func (s *DockerRegistryAuthTokenSuite) TearDownTest(c *check.C) { - if s.reg != nil { - out, err := s.d.Cmd("logout", privateRegistryURL) - c.Assert(err, check.IsNil, check.Commentf(out)) - s.reg.Close() - } - if s.d != nil { - s.d.Stop() - } - s.ds.TearDownTest(c) -} - -func (s *DockerRegistryAuthTokenSuite) setupRegistryWithTokenService(c *check.C, tokenURL string) { - if s == nil { - c.Fatal("registry suite isn't initialized") - } - s.reg = setupRegistry(c, false, "token", tokenURL) -} - -func init() { - check.Suite(&DockerDaemonSuite{ - ds: &DockerSuite{}, - }) -} - -type DockerDaemonSuite struct { - ds *DockerSuite - d *Daemon -} - -func (s *DockerDaemonSuite) OnTimeout(c *check.C) { - s.d.DumpStackAndQuit() -} - -func (s *DockerDaemonSuite) SetUpTest(c *check.C) { - testRequires(c, DaemonIsLinux) - s.d = NewDaemon(c) -} - -func (s *DockerDaemonSuite) TearDownTest(c *check.C) { - testRequires(c, DaemonIsLinux) - if s.d != nil { - s.d.Stop() - } - s.ds.TearDownTest(c) -} - -func (s *DockerDaemonSuite) TearDownSuite(c *check.C) { - filepath.Walk(daemonSockRoot, func(path string, fi os.FileInfo, err error) error { - if err != nil { - // ignore errors here - // not cleaning up sockets is not really an error - return nil - } - if fi.Mode() == os.ModeSocket { - syscall.Unlink(path) - } - return nil - }) - os.RemoveAll(daemonSockRoot) -} - -const defaultSwarmPort = 2477 - -func init() { - check.Suite(&DockerSwarmSuite{ - ds: &DockerSuite{}, - }) -} - -type DockerSwarmSuite struct { - server *httptest.Server - ds *DockerSuite - daemons []*SwarmDaemon - daemonsLock sync.Mutex // protect access to daemons - portIndex int -} - -func (s *DockerSwarmSuite) OnTimeout(c *check.C) { - s.daemonsLock.Lock() - defer s.daemonsLock.Unlock() - for _, d := range s.daemons { - d.DumpStackAndQuit() - } -} - -func (s *DockerSwarmSuite) SetUpTest(c *check.C) { - testRequires(c, DaemonIsLinux) -} - -func (s *DockerSwarmSuite) AddDaemon(c *check.C, joinSwarm, manager bool) *SwarmDaemon { - d := &SwarmDaemon{ - Daemon: NewDaemon(c), - port: defaultSwarmPort + s.portIndex, - } - d.listenAddr = fmt.Sprintf("0.0.0.0:%d", d.port) - args := []string{"--iptables=false", "--swarm-default-advertise-addr=lo"} // avoid networking conflicts - if experimentalDaemon { - args = append(args, "--experimental") - } - err := d.StartWithBusybox(args...) - c.Assert(err, check.IsNil) - - if joinSwarm == true { - if len(s.daemons) > 0 { - tokens := s.daemons[0].joinTokens(c) - token := tokens.Worker - if manager { - token = tokens.Manager - } - c.Assert(d.Join(swarm.JoinRequest{ - RemoteAddrs: []string{s.daemons[0].listenAddr}, - JoinToken: token, - }), check.IsNil) - } else { - c.Assert(d.Init(swarm.InitRequest{}), check.IsNil) - } - } - - s.portIndex++ - s.daemonsLock.Lock() - s.daemons = append(s.daemons, d) - s.daemonsLock.Unlock() - - return d -} - -func (s *DockerSwarmSuite) TearDownTest(c *check.C) { - testRequires(c, DaemonIsLinux) - s.daemonsLock.Lock() - for _, d := range s.daemons { - d.Stop() - // raft state file is quite big (64MB) so remove it after every test - walDir := filepath.Join(d.root, "swarm/raft/wal") - if err := os.RemoveAll(walDir); err != nil { - c.Logf("error removing %v: %v", walDir, err) - } - - cleanupExecRoot(c, d.execRoot) - } - s.daemons = nil - s.daemonsLock.Unlock() - - s.portIndex = 0 - s.ds.TearDownTest(c) -} - -func init() { - check.Suite(&DockerTrustSuite{ - ds: &DockerSuite{}, - }) -} - -type DockerTrustSuite struct { - ds *DockerSuite - reg *testRegistryV2 - not *testNotary -} - -func (s *DockerTrustSuite) SetUpTest(c *check.C) { - testRequires(c, RegistryHosting, NotaryServerHosting) - s.reg = setupRegistry(c, false, "", "") - s.not = setupNotary(c) -} - -func (s *DockerTrustSuite) TearDownTest(c *check.C) { - if s.reg != nil { - s.reg.Close() - } - if s.not != nil { - s.not.Close() - } - - // Remove trusted keys and metadata after test - os.RemoveAll(filepath.Join(cliconfig.ConfigDir(), "trust")) - s.ds.TearDownTest(c) -} - -func init() { - ds := &DockerSuite{} - check.Suite(&DockerTrustedSwarmSuite{ - trustSuite: DockerTrustSuite{ - ds: ds, - }, - swarmSuite: DockerSwarmSuite{ - ds: ds, - }, - }) -} - -type DockerTrustedSwarmSuite struct { - swarmSuite DockerSwarmSuite - trustSuite DockerTrustSuite - reg *testRegistryV2 - not *testNotary -} - -func (s *DockerTrustedSwarmSuite) SetUpTest(c *check.C) { - s.swarmSuite.SetUpTest(c) - s.trustSuite.SetUpTest(c) -} - -func (s *DockerTrustedSwarmSuite) TearDownTest(c *check.C) { - s.trustSuite.TearDownTest(c) - s.swarmSuite.TearDownTest(c) -} - -func (s *DockerTrustedSwarmSuite) OnTimeout(c *check.C) { - s.swarmSuite.OnTimeout(c) -} diff --git a/vendor/github.com/docker/docker/integration-cli/daemon.go b/vendor/github.com/docker/docker/integration-cli/daemon.go deleted file mode 100644 index 9fd3f1e82..000000000 --- a/vendor/github.com/docker/docker/integration-cli/daemon.go +++ /dev/null @@ -1,608 +0,0 @@ -package main - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" - "time" - - "github.com/docker/docker/api/types/events" - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/go-connections/sockets" - "github.com/docker/go-connections/tlsconfig" - "github.com/go-check/check" -) - -var daemonSockRoot = filepath.Join(os.TempDir(), "docker-integration") - -// Daemon represents a Docker daemon for the testing framework. -type Daemon struct { - GlobalFlags []string - - id string - c *check.C - logFile *os.File - folder string - root string - stdin io.WriteCloser - stdout, stderr io.ReadCloser - cmd *exec.Cmd - storageDriver string - wait chan error - userlandProxy bool - useDefaultHost bool - useDefaultTLSHost bool - execRoot string -} - -type clientConfig struct { - transport *http.Transport - scheme string - addr string -} - -// NewDaemon returns a Daemon instance to be used for testing. -// This will create a directory such as d123456789 in the folder specified by $DEST. -// The daemon will not automatically start. -func NewDaemon(c *check.C) *Daemon { - dest := os.Getenv("DEST") - c.Assert(dest, check.Not(check.Equals), "", check.Commentf("Please set the DEST environment variable")) - - err := os.MkdirAll(daemonSockRoot, 0700) - c.Assert(err, checker.IsNil, check.Commentf("could not create daemon socket root")) - - id := fmt.Sprintf("d%s", stringid.TruncateID(stringid.GenerateRandomID())) - dir := filepath.Join(dest, id) - daemonFolder, err := filepath.Abs(dir) - c.Assert(err, check.IsNil, check.Commentf("Could not make %q an absolute path", dir)) - daemonRoot := filepath.Join(daemonFolder, "root") - - c.Assert(os.MkdirAll(daemonRoot, 0755), check.IsNil, check.Commentf("Could not create daemon root %q", dir)) - - userlandProxy := true - if env := os.Getenv("DOCKER_USERLANDPROXY"); env != "" { - if val, err := strconv.ParseBool(env); err != nil { - userlandProxy = val - } - } - - return &Daemon{ - id: id, - c: c, - folder: daemonFolder, - root: daemonRoot, - storageDriver: os.Getenv("DOCKER_GRAPHDRIVER"), - userlandProxy: userlandProxy, - execRoot: filepath.Join(os.TempDir(), "docker-execroot", id), - } -} - -// RootDir returns the root directory of the daemon. -func (d *Daemon) RootDir() string { - return d.root -} - -func (d *Daemon) getClientConfig() (*clientConfig, error) { - var ( - transport *http.Transport - scheme string - addr string - proto string - ) - if d.useDefaultTLSHost { - option := &tlsconfig.Options{ - CAFile: "fixtures/https/ca.pem", - CertFile: "fixtures/https/client-cert.pem", - KeyFile: "fixtures/https/client-key.pem", - } - tlsConfig, err := tlsconfig.Client(*option) - if err != nil { - return nil, err - } - transport = &http.Transport{ - TLSClientConfig: tlsConfig, - } - addr = fmt.Sprintf("%s:%d", opts.DefaultHTTPHost, opts.DefaultTLSHTTPPort) - scheme = "https" - proto = "tcp" - } else if d.useDefaultHost { - addr = opts.DefaultUnixSocket - proto = "unix" - scheme = "http" - transport = &http.Transport{} - } else { - addr = d.sockPath() - proto = "unix" - scheme = "http" - transport = &http.Transport{} - } - - d.c.Assert(sockets.ConfigureTransport(transport, proto, addr), check.IsNil) - - return &clientConfig{ - transport: transport, - scheme: scheme, - addr: addr, - }, nil -} - -// Start will start the daemon and return once it is ready to receive requests. -// You can specify additional daemon flags. -func (d *Daemon) Start(args ...string) error { - logFile, err := os.OpenFile(filepath.Join(d.folder, "docker.log"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600) - d.c.Assert(err, check.IsNil, check.Commentf("[%s] Could not create %s/docker.log", d.id, d.folder)) - - return d.StartWithLogFile(logFile, args...) -} - -// StartWithLogFile will start the daemon and attach its streams to a given file. -func (d *Daemon) StartWithLogFile(out *os.File, providedArgs ...string) error { - dockerdBinary, err := exec.LookPath(dockerdBinary) - d.c.Assert(err, check.IsNil, check.Commentf("[%s] could not find docker binary in $PATH", d.id)) - - args := append(d.GlobalFlags, - "--containerd", "/var/run/docker/libcontainerd/docker-containerd.sock", - "--graph", d.root, - "--exec-root", d.execRoot, - "--pidfile", fmt.Sprintf("%s/docker.pid", d.folder), - fmt.Sprintf("--userland-proxy=%t", d.userlandProxy), - ) - if experimentalDaemon { - args = append(args, "--experimental", "--init") - } - if !(d.useDefaultHost || d.useDefaultTLSHost) { - args = append(args, []string{"--host", d.sock()}...) - } - if root := os.Getenv("DOCKER_REMAP_ROOT"); root != "" { - args = append(args, []string{"--userns-remap", root}...) - } - - // If we don't explicitly set the log-level or debug flag(-D) then - // turn on debug mode - foundLog := false - foundSd := false - for _, a := range providedArgs { - if strings.Contains(a, "--log-level") || strings.Contains(a, "-D") || strings.Contains(a, "--debug") { - foundLog = true - } - if strings.Contains(a, "--storage-driver") { - foundSd = true - } - } - if !foundLog { - args = append(args, "--debug") - } - if d.storageDriver != "" && !foundSd { - args = append(args, "--storage-driver", d.storageDriver) - } - - args = append(args, providedArgs...) - d.cmd = exec.Command(dockerdBinary, args...) - d.cmd.Env = append(os.Environ(), "DOCKER_SERVICE_PREFER_OFFLINE_IMAGE=1") - d.cmd.Stdout = out - d.cmd.Stderr = out - d.logFile = out - - if err := d.cmd.Start(); err != nil { - return fmt.Errorf("[%s] could not start daemon container: %v", d.id, err) - } - - wait := make(chan error) - - go func() { - wait <- d.cmd.Wait() - d.c.Logf("[%s] exiting daemon", d.id) - close(wait) - }() - - d.wait = wait - - tick := time.Tick(500 * time.Millisecond) - // make sure daemon is ready to receive requests - startTime := time.Now().Unix() - for { - d.c.Logf("[%s] waiting for daemon to start", d.id) - if time.Now().Unix()-startTime > 5 { - // After 5 seconds, give up - return fmt.Errorf("[%s] Daemon exited and never started", d.id) - } - select { - case <-time.After(2 * time.Second): - return fmt.Errorf("[%s] timeout: daemon does not respond", d.id) - case <-tick: - clientConfig, err := d.getClientConfig() - if err != nil { - return err - } - - client := &http.Client{ - Transport: clientConfig.transport, - } - - req, err := http.NewRequest("GET", "/_ping", nil) - d.c.Assert(err, check.IsNil, check.Commentf("[%s] could not create new request", d.id)) - req.URL.Host = clientConfig.addr - req.URL.Scheme = clientConfig.scheme - resp, err := client.Do(req) - if err != nil { - continue - } - if resp.StatusCode != http.StatusOK { - d.c.Logf("[%s] received status != 200 OK: %s", d.id, resp.Status) - } - d.c.Logf("[%s] daemon started", d.id) - d.root, err = d.queryRootDir() - if err != nil { - return fmt.Errorf("[%s] error querying daemon for root directory: %v", d.id, err) - } - return nil - case <-d.wait: - return fmt.Errorf("[%s] Daemon exited during startup", d.id) - } - } -} - -// StartWithBusybox will first start the daemon with Daemon.Start() -// then save the busybox image from the main daemon and load it into this Daemon instance. -func (d *Daemon) StartWithBusybox(arg ...string) error { - if err := d.Start(arg...); err != nil { - return err - } - return d.LoadBusybox() -} - -// Kill will send a SIGKILL to the daemon -func (d *Daemon) Kill() error { - if d.cmd == nil || d.wait == nil { - return errors.New("daemon not started") - } - - defer func() { - d.logFile.Close() - d.cmd = nil - }() - - if err := d.cmd.Process.Kill(); err != nil { - d.c.Logf("Could not kill daemon: %v", err) - return err - } - - if err := os.Remove(fmt.Sprintf("%s/docker.pid", d.folder)); err != nil { - return err - } - - return nil -} - -// DumpStackAndQuit sends SIGQUIT to the daemon, which triggers it to dump its -// stack to its log file and exit -// This is used primarily for gathering debug information on test timeout -func (d *Daemon) DumpStackAndQuit() { - if d.cmd == nil || d.cmd.Process == nil { - return - } - signalDaemonDump(d.cmd.Process.Pid) -} - -// Stop will send a SIGINT every second and wait for the daemon to stop. -// If it timeouts, a SIGKILL is sent. -// Stop will not delete the daemon directory. If a purged daemon is needed, -// instantiate a new one with NewDaemon. -func (d *Daemon) Stop() error { - if d.cmd == nil || d.wait == nil { - return errors.New("daemon not started") - } - - defer func() { - d.logFile.Close() - d.cmd = nil - }() - - i := 1 - tick := time.Tick(time.Second) - - if err := d.cmd.Process.Signal(os.Interrupt); err != nil { - return fmt.Errorf("could not send signal: %v", err) - } -out1: - for { - select { - case err := <-d.wait: - return err - case <-time.After(20 * time.Second): - // time for stopping jobs and run onShutdown hooks - d.c.Logf("timeout: %v", d.id) - break out1 - } - } - -out2: - for { - select { - case err := <-d.wait: - return err - case <-tick: - i++ - if i > 5 { - d.c.Logf("tried to interrupt daemon for %d times, now try to kill it", i) - break out2 - } - d.c.Logf("Attempt #%d: daemon is still running with pid %d", i, d.cmd.Process.Pid) - if err := d.cmd.Process.Signal(os.Interrupt); err != nil { - return fmt.Errorf("could not send signal: %v", err) - } - } - } - - if err := d.cmd.Process.Kill(); err != nil { - d.c.Logf("Could not kill daemon: %v", err) - return err - } - - if err := os.Remove(fmt.Sprintf("%s/docker.pid", d.folder)); err != nil { - return err - } - - return nil -} - -// Restart will restart the daemon by first stopping it and then starting it. -func (d *Daemon) Restart(arg ...string) error { - d.Stop() - // in the case of tests running a user namespace-enabled daemon, we have resolved - // d.root to be the actual final path of the graph dir after the "uid.gid" of - // remapped root is added--we need to subtract it from the path before calling - // start or else we will continue making subdirectories rather than truly restarting - // with the same location/root: - if root := os.Getenv("DOCKER_REMAP_ROOT"); root != "" { - d.root = filepath.Dir(d.root) - } - return d.Start(arg...) -} - -// LoadBusybox will load the stored busybox into a newly started daemon -func (d *Daemon) LoadBusybox() error { - bb := filepath.Join(d.folder, "busybox.tar") - if _, err := os.Stat(bb); err != nil { - if !os.IsNotExist(err) { - return fmt.Errorf("unexpected error on busybox.tar stat: %v", err) - } - // saving busybox image from main daemon - if out, err := exec.Command(dockerBinary, "save", "--output", bb, "busybox:latest").CombinedOutput(); err != nil { - imagesOut, _ := exec.Command(dockerBinary, "images", "--format", "{{ .Repository }}:{{ .Tag }}").CombinedOutput() - return fmt.Errorf("could not save busybox image: %s\n%s", string(out), strings.TrimSpace(string(imagesOut))) - } - } - // loading busybox image to this daemon - if out, err := d.Cmd("load", "--input", bb); err != nil { - return fmt.Errorf("could not load busybox image: %s", out) - } - if err := os.Remove(bb); err != nil { - d.c.Logf("could not remove %s: %v", bb, err) - } - return nil -} - -func (d *Daemon) queryRootDir() (string, error) { - // update daemon root by asking /info endpoint (to support user - // namespaced daemon with root remapped uid.gid directory) - clientConfig, err := d.getClientConfig() - if err != nil { - return "", err - } - - client := &http.Client{ - Transport: clientConfig.transport, - } - - req, err := http.NewRequest("GET", "/info", nil) - if err != nil { - return "", err - } - req.Header.Set("Content-Type", "application/json") - req.URL.Host = clientConfig.addr - req.URL.Scheme = clientConfig.scheme - - resp, err := client.Do(req) - if err != nil { - return "", err - } - body := ioutils.NewReadCloserWrapper(resp.Body, func() error { - return resp.Body.Close() - }) - - type Info struct { - DockerRootDir string - } - var b []byte - var i Info - b, err = readBody(body) - if err == nil && resp.StatusCode == http.StatusOK { - // read the docker root dir - if err = json.Unmarshal(b, &i); err == nil { - return i.DockerRootDir, nil - } - } - return "", err -} - -func (d *Daemon) sock() string { - return fmt.Sprintf("unix://" + d.sockPath()) -} - -func (d *Daemon) sockPath() string { - return filepath.Join(daemonSockRoot, d.id+".sock") -} - -func (d *Daemon) waitRun(contID string) error { - args := []string{"--host", d.sock()} - return waitInspectWithArgs(contID, "{{.State.Running}}", "true", 10*time.Second, args...) -} - -func (d *Daemon) getBaseDeviceSize(c *check.C) int64 { - infoCmdOutput, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "-H", d.sock(), "info"), - exec.Command("grep", "Base Device Size"), - ) - c.Assert(err, checker.IsNil) - basesizeSlice := strings.Split(infoCmdOutput, ":") - basesize := strings.Trim(basesizeSlice[1], " ") - basesize = strings.Trim(basesize, "\n")[:len(basesize)-3] - basesizeFloat, err := strconv.ParseFloat(strings.Trim(basesize, " "), 64) - c.Assert(err, checker.IsNil) - basesizeBytes := int64(basesizeFloat) * (1024 * 1024 * 1024) - return basesizeBytes -} - -// Cmd will execute a docker CLI command against this Daemon. -// Example: d.Cmd("version") will run docker -H unix://path/to/unix.sock version -func (d *Daemon) Cmd(args ...string) (string, error) { - b, err := d.command(args...).CombinedOutput() - return string(b), err -} - -func (d *Daemon) command(args ...string) *exec.Cmd { - return exec.Command(dockerBinary, d.prependHostArg(args)...) -} - -func (d *Daemon) prependHostArg(args []string) []string { - for _, arg := range args { - if arg == "--host" || arg == "-H" { - return args - } - } - return append([]string{"--host", d.sock()}, args...) -} - -// SockRequest executes a socket request on a daemon and returns statuscode and output. -func (d *Daemon) SockRequest(method, endpoint string, data interface{}) (int, []byte, error) { - jsonData := bytes.NewBuffer(nil) - if err := json.NewEncoder(jsonData).Encode(data); err != nil { - return -1, nil, err - } - - res, body, err := d.SockRequestRaw(method, endpoint, jsonData, "application/json") - if err != nil { - return -1, nil, err - } - b, err := readBody(body) - return res.StatusCode, b, err -} - -// SockRequestRaw executes a socket request on a daemon and returns an http -// response and a reader for the output data. -func (d *Daemon) SockRequestRaw(method, endpoint string, data io.Reader, ct string) (*http.Response, io.ReadCloser, error) { - return sockRequestRawToDaemon(method, endpoint, data, ct, d.sock()) -} - -// LogFileName returns the path the the daemon's log file -func (d *Daemon) LogFileName() string { - return d.logFile.Name() -} - -func (d *Daemon) getIDByName(name string) (string, error) { - return d.inspectFieldWithError(name, "Id") -} - -func (d *Daemon) activeContainers() (ids []string) { - out, _ := d.Cmd("ps", "-q") - for _, id := range strings.Split(out, "\n") { - if id = strings.TrimSpace(id); id != "" { - ids = append(ids, id) - } - } - return -} - -func (d *Daemon) inspectFilter(name, filter string) (string, error) { - format := fmt.Sprintf("{{%s}}", filter) - out, err := d.Cmd("inspect", "-f", format, name) - if err != nil { - return "", fmt.Errorf("failed to inspect %s: %s", name, out) - } - return strings.TrimSpace(out), nil -} - -func (d *Daemon) inspectFieldWithError(name, field string) (string, error) { - return d.inspectFilter(name, fmt.Sprintf(".%s", field)) -} - -func (d *Daemon) findContainerIP(id string) string { - out, err := d.Cmd("inspect", fmt.Sprintf("--format='{{ .NetworkSettings.Networks.bridge.IPAddress }}'"), id) - if err != nil { - d.c.Log(err) - } - return strings.Trim(out, " \r\n'") -} - -func (d *Daemon) buildImageWithOut(name, dockerfile string, useCache bool, buildFlags ...string) (string, int, error) { - buildCmd := buildImageCmdWithHost(name, dockerfile, d.sock(), useCache, buildFlags...) - return runCommandWithOutput(buildCmd) -} - -func (d *Daemon) checkActiveContainerCount(c *check.C) (interface{}, check.CommentInterface) { - out, err := d.Cmd("ps", "-q") - c.Assert(err, checker.IsNil) - if len(strings.TrimSpace(out)) == 0 { - return 0, nil - } - return len(strings.Split(strings.TrimSpace(out), "\n")), check.Commentf("output: %q", string(out)) -} - -func (d *Daemon) reloadConfig() error { - if d.cmd == nil || d.cmd.Process == nil { - return fmt.Errorf("daemon is not running") - } - - errCh := make(chan error) - started := make(chan struct{}) - go func() { - _, body, err := sockRequestRawToDaemon("GET", "/events", nil, "", d.sock()) - close(started) - if err != nil { - errCh <- err - } - defer body.Close() - dec := json.NewDecoder(body) - for { - var e events.Message - if err := dec.Decode(&e); err != nil { - errCh <- err - return - } - if e.Type != events.DaemonEventType { - continue - } - if e.Action != "reload" { - continue - } - close(errCh) // notify that we are done - return - } - }() - - <-started - if err := signalDaemonReload(d.cmd.Process.Pid); err != nil { - return fmt.Errorf("error signaling daemon reload: %v", err) - } - select { - case err := <-errCh: - if err != nil { - return fmt.Errorf("error waiting for daemon reload event: %v", err) - } - case <-time.After(30 * time.Second): - return fmt.Errorf("timeout waiting for daemon reload event") - } - return nil -} diff --git a/vendor/github.com/docker/docker/integration-cli/daemon_swarm.go b/vendor/github.com/docker/docker/integration-cli/daemon_swarm.go deleted file mode 100644 index 199bce0e7..000000000 --- a/vendor/github.com/docker/docker/integration-cli/daemon_swarm.go +++ /dev/null @@ -1,419 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "net/http" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// SwarmDaemon is a test daemon with helpers for participating in a swarm. -type SwarmDaemon struct { - *Daemon - swarm.Info - port int - listenAddr string -} - -// Init initializes a new swarm cluster. -func (d *SwarmDaemon) Init(req swarm.InitRequest) error { - if req.ListenAddr == "" { - req.ListenAddr = d.listenAddr - } - status, out, err := d.SockRequest("POST", "/swarm/init", req) - if status != http.StatusOK { - return fmt.Errorf("initializing swarm: invalid statuscode %v, %q", status, out) - } - if err != nil { - return fmt.Errorf("initializing swarm: %v", err) - } - info, err := d.info() - if err != nil { - return err - } - d.Info = info - return nil -} - -// Join joins a daemon to an existing cluster. -func (d *SwarmDaemon) Join(req swarm.JoinRequest) error { - if req.ListenAddr == "" { - req.ListenAddr = d.listenAddr - } - status, out, err := d.SockRequest("POST", "/swarm/join", req) - if status != http.StatusOK { - return fmt.Errorf("joining swarm: invalid statuscode %v, %q", status, out) - } - if err != nil { - return fmt.Errorf("joining swarm: %v", err) - } - info, err := d.info() - if err != nil { - return err - } - d.Info = info - return nil -} - -// Leave forces daemon to leave current cluster. -func (d *SwarmDaemon) Leave(force bool) error { - url := "/swarm/leave" - if force { - url += "?force=1" - } - status, out, err := d.SockRequest("POST", url, nil) - if status != http.StatusOK { - return fmt.Errorf("leaving swarm: invalid statuscode %v, %q", status, out) - } - if err != nil { - err = fmt.Errorf("leaving swarm: %v", err) - } - return err -} - -func (d *SwarmDaemon) info() (swarm.Info, error) { - var info struct { - Swarm swarm.Info - } - status, dt, err := d.SockRequest("GET", "/info", nil) - if status != http.StatusOK { - return info.Swarm, fmt.Errorf("get swarm info: invalid statuscode %v", status) - } - if err != nil { - return info.Swarm, fmt.Errorf("get swarm info: %v", err) - } - if err := json.Unmarshal(dt, &info); err != nil { - return info.Swarm, err - } - return info.Swarm, nil -} - -type serviceConstructor func(*swarm.Service) -type nodeConstructor func(*swarm.Node) -type specConstructor func(*swarm.Spec) - -func (d *SwarmDaemon) createService(c *check.C, f ...serviceConstructor) string { - var service swarm.Service - for _, fn := range f { - fn(&service) - } - status, out, err := d.SockRequest("POST", "/services/create", service.Spec) - - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusCreated, check.Commentf("output: %q", string(out))) - - var scr types.ServiceCreateResponse - c.Assert(json.Unmarshal(out, &scr), checker.IsNil) - return scr.ID -} - -func (d *SwarmDaemon) getService(c *check.C, id string) *swarm.Service { - var service swarm.Service - status, out, err := d.SockRequest("GET", "/services/"+id, nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - c.Assert(json.Unmarshal(out, &service), checker.IsNil) - return &service -} - -func (d *SwarmDaemon) getServiceTasks(c *check.C, service string) []swarm.Task { - var tasks []swarm.Task - - filterArgs := filters.NewArgs() - filterArgs.Add("desired-state", "running") - filterArgs.Add("service", service) - filters, err := filters.ToParam(filterArgs) - c.Assert(err, checker.IsNil) - - status, out, err := d.SockRequest("GET", "/tasks?filters="+filters, nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - c.Assert(json.Unmarshal(out, &tasks), checker.IsNil) - return tasks -} - -func (d *SwarmDaemon) checkServiceTasksInState(service string, state swarm.TaskState, message string) func(*check.C) (interface{}, check.CommentInterface) { - return func(c *check.C) (interface{}, check.CommentInterface) { - tasks := d.getServiceTasks(c, service) - var count int - for _, task := range tasks { - if task.Status.State == state { - if message == "" || strings.Contains(task.Status.Message, message) { - count++ - } - } - } - return count, nil - } -} - -func (d *SwarmDaemon) checkServiceRunningTasks(service string) func(*check.C) (interface{}, check.CommentInterface) { - return d.checkServiceTasksInState(service, swarm.TaskStateRunning, "") -} - -func (d *SwarmDaemon) checkServiceUpdateState(service string) func(*check.C) (interface{}, check.CommentInterface) { - return func(c *check.C) (interface{}, check.CommentInterface) { - service := d.getService(c, service) - return service.UpdateStatus.State, nil - } -} - -func (d *SwarmDaemon) checkServiceTasks(service string) func(*check.C) (interface{}, check.CommentInterface) { - return func(c *check.C) (interface{}, check.CommentInterface) { - tasks := d.getServiceTasks(c, service) - return len(tasks), nil - } -} - -func (d *SwarmDaemon) checkRunningTaskImages(c *check.C) (interface{}, check.CommentInterface) { - var tasks []swarm.Task - - filterArgs := filters.NewArgs() - filterArgs.Add("desired-state", "running") - filters, err := filters.ToParam(filterArgs) - c.Assert(err, checker.IsNil) - - status, out, err := d.SockRequest("GET", "/tasks?filters="+filters, nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - c.Assert(json.Unmarshal(out, &tasks), checker.IsNil) - - result := make(map[string]int) - for _, task := range tasks { - if task.Status.State == swarm.TaskStateRunning { - result[task.Spec.ContainerSpec.Image]++ - } - } - return result, nil -} - -func (d *SwarmDaemon) checkNodeReadyCount(c *check.C) (interface{}, check.CommentInterface) { - nodes := d.listNodes(c) - var readyCount int - for _, node := range nodes { - if node.Status.State == swarm.NodeStateReady { - readyCount++ - } - } - return readyCount, nil -} - -func (d *SwarmDaemon) getTask(c *check.C, id string) swarm.Task { - var task swarm.Task - - status, out, err := d.SockRequest("GET", "/tasks/"+id, nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - c.Assert(json.Unmarshal(out, &task), checker.IsNil) - return task -} - -func (d *SwarmDaemon) updateService(c *check.C, service *swarm.Service, f ...serviceConstructor) { - for _, fn := range f { - fn(service) - } - url := fmt.Sprintf("/services/%s/update?version=%d", service.ID, service.Version.Index) - status, out, err := d.SockRequest("POST", url, service.Spec) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) -} - -func (d *SwarmDaemon) removeService(c *check.C, id string) { - status, out, err := d.SockRequest("DELETE", "/services/"+id, nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) -} - -func (d *SwarmDaemon) getNode(c *check.C, id string) *swarm.Node { - var node swarm.Node - status, out, err := d.SockRequest("GET", "/nodes/"+id, nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - c.Assert(json.Unmarshal(out, &node), checker.IsNil) - c.Assert(node.ID, checker.Equals, id) - return &node -} - -func (d *SwarmDaemon) removeNode(c *check.C, id string, force bool) { - url := "/nodes/" + id - if force { - url += "?force=1" - } - - status, out, err := d.SockRequest("DELETE", url, nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) -} - -func (d *SwarmDaemon) updateNode(c *check.C, id string, f ...nodeConstructor) { - for i := 0; ; i++ { - node := d.getNode(c, id) - for _, fn := range f { - fn(node) - } - url := fmt.Sprintf("/nodes/%s/update?version=%d", node.ID, node.Version.Index) - status, out, err := d.SockRequest("POST", url, node.Spec) - if i < 10 && strings.Contains(string(out), "update out of sequence") { - time.Sleep(100 * time.Millisecond) - continue - } - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - return - } -} - -func (d *SwarmDaemon) listNodes(c *check.C) []swarm.Node { - status, out, err := d.SockRequest("GET", "/nodes", nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - - nodes := []swarm.Node{} - c.Assert(json.Unmarshal(out, &nodes), checker.IsNil) - return nodes -} - -func (d *SwarmDaemon) listServices(c *check.C) []swarm.Service { - status, out, err := d.SockRequest("GET", "/services", nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - - services := []swarm.Service{} - c.Assert(json.Unmarshal(out, &services), checker.IsNil) - return services -} - -func (d *SwarmDaemon) createSecret(c *check.C, secretSpec swarm.SecretSpec) string { - status, out, err := d.SockRequest("POST", "/secrets/create", secretSpec) - - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusCreated, check.Commentf("output: %q", string(out))) - - var scr types.SecretCreateResponse - c.Assert(json.Unmarshal(out, &scr), checker.IsNil) - return scr.ID -} - -func (d *SwarmDaemon) listSecrets(c *check.C) []swarm.Secret { - status, out, err := d.SockRequest("GET", "/secrets", nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - - secrets := []swarm.Secret{} - c.Assert(json.Unmarshal(out, &secrets), checker.IsNil) - return secrets -} - -func (d *SwarmDaemon) getSecret(c *check.C, id string) *swarm.Secret { - var secret swarm.Secret - status, out, err := d.SockRequest("GET", "/secrets/"+id, nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - c.Assert(json.Unmarshal(out, &secret), checker.IsNil) - return &secret -} - -func (d *SwarmDaemon) deleteSecret(c *check.C, id string) { - status, out, err := d.SockRequest("DELETE", "/secrets/"+id, nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusNoContent, check.Commentf("output: %q", string(out))) -} - -func (d *SwarmDaemon) getSwarm(c *check.C) swarm.Swarm { - var sw swarm.Swarm - status, out, err := d.SockRequest("GET", "/swarm", nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - c.Assert(json.Unmarshal(out, &sw), checker.IsNil) - return sw -} - -func (d *SwarmDaemon) updateSwarm(c *check.C, f ...specConstructor) { - sw := d.getSwarm(c) - for _, fn := range f { - fn(&sw.Spec) - } - url := fmt.Sprintf("/swarm/update?version=%d", sw.Version.Index) - status, out, err := d.SockRequest("POST", url, sw.Spec) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) -} - -func (d *SwarmDaemon) rotateTokens(c *check.C) { - var sw swarm.Swarm - status, out, err := d.SockRequest("GET", "/swarm", nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - c.Assert(json.Unmarshal(out, &sw), checker.IsNil) - - url := fmt.Sprintf("/swarm/update?version=%d&rotateWorkerToken=true&rotateManagerToken=true", sw.Version.Index) - status, out, err = d.SockRequest("POST", url, sw.Spec) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) -} - -func (d *SwarmDaemon) joinTokens(c *check.C) swarm.JoinTokens { - var sw swarm.Swarm - status, out, err := d.SockRequest("GET", "/swarm", nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - c.Assert(json.Unmarshal(out, &sw), checker.IsNil) - return sw.JoinTokens -} - -func (d *SwarmDaemon) checkLocalNodeState(c *check.C) (interface{}, check.CommentInterface) { - info, err := d.info() - c.Assert(err, checker.IsNil) - return info.LocalNodeState, nil -} - -func (d *SwarmDaemon) checkControlAvailable(c *check.C) (interface{}, check.CommentInterface) { - info, err := d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - return info.ControlAvailable, nil -} - -func (d *SwarmDaemon) checkLeader(c *check.C) (interface{}, check.CommentInterface) { - errList := check.Commentf("could not get node list") - status, out, err := d.SockRequest("GET", "/nodes", nil) - if err != nil { - return err, errList - } - if status != http.StatusOK { - return fmt.Errorf("expected http status OK, got: %d", status), errList - } - - var ls []swarm.Node - if err := json.Unmarshal(out, &ls); err != nil { - return err, errList - } - - for _, node := range ls { - if node.ManagerStatus != nil && node.ManagerStatus.Leader { - return nil, nil - } - } - return fmt.Errorf("no leader"), check.Commentf("could not find leader") -} - -func (d *SwarmDaemon) cmdRetryOutOfSequence(args ...string) (string, error) { - for i := 0; ; i++ { - out, err := d.Cmd(args...) - if err != nil { - if strings.Contains(out, "update out of sequence") { - if i < 10 { - continue - } - } - } - return out, err - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/daemon_swarm_hack.go b/vendor/github.com/docker/docker/integration-cli/daemon_swarm_hack.go deleted file mode 100644 index 0cea90142..000000000 --- a/vendor/github.com/docker/docker/integration-cli/daemon_swarm_hack.go +++ /dev/null @@ -1,20 +0,0 @@ -package main - -import "github.com/go-check/check" - -func (s *DockerSwarmSuite) getDaemon(c *check.C, nodeID string) *SwarmDaemon { - s.daemonsLock.Lock() - defer s.daemonsLock.Unlock() - for _, d := range s.daemons { - if d.NodeID == nodeID { - return d - } - } - c.Fatalf("could not find node with id: %s", nodeID) - return nil -} - -// nodeCmd executes a command on a given node via the normal docker socket -func (s *DockerSwarmSuite) nodeCmd(c *check.C, id string, args ...string) (string, error) { - return s.getDaemon(c, id).Cmd(args...) -} diff --git a/vendor/github.com/docker/docker/integration-cli/daemon_unix.go b/vendor/github.com/docker/docker/integration-cli/daemon_unix.go deleted file mode 100644 index 6ca7daf21..000000000 --- a/vendor/github.com/docker/docker/integration-cli/daemon_unix.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build !windows - -package main - -import ( - "os" - "path/filepath" - "syscall" - - "github.com/go-check/check" -) - -func cleanupExecRoot(c *check.C, execRoot string) { - // Cleanup network namespaces in the exec root of this - // daemon because this exec root is specific to this - // daemon instance and has no chance of getting - // cleaned up when a new daemon is instantiated with a - // new exec root. - netnsPath := filepath.Join(execRoot, "netns") - filepath.Walk(netnsPath, func(path string, info os.FileInfo, err error) error { - if err := syscall.Unmount(path, syscall.MNT_FORCE); err != nil { - c.Logf("unmount of %s failed: %v", path, err) - } - os.Remove(path) - return nil - }) -} - -func signalDaemonDump(pid int) { - syscall.Kill(pid, syscall.SIGQUIT) -} - -func signalDaemonReload(pid int) error { - return syscall.Kill(pid, syscall.SIGHUP) -} diff --git a/vendor/github.com/docker/docker/integration-cli/daemon_windows.go b/vendor/github.com/docker/docker/integration-cli/daemon_windows.go deleted file mode 100644 index 885b703b3..000000000 --- a/vendor/github.com/docker/docker/integration-cli/daemon_windows.go +++ /dev/null @@ -1,53 +0,0 @@ -package main - -import ( - "fmt" - "strconv" - "syscall" - "unsafe" - - "github.com/go-check/check" - "golang.org/x/sys/windows" -) - -func openEvent(desiredAccess uint32, inheritHandle bool, name string, proc *windows.LazyProc) (handle syscall.Handle, err error) { - namep, _ := syscall.UTF16PtrFromString(name) - var _p2 uint32 - if inheritHandle { - _p2 = 1 - } - r0, _, e1 := proc.Call(uintptr(desiredAccess), uintptr(_p2), uintptr(unsafe.Pointer(namep))) - handle = syscall.Handle(r0) - if handle == syscall.InvalidHandle { - err = e1 - } - return -} - -func pulseEvent(handle syscall.Handle, proc *windows.LazyProc) (err error) { - r0, _, _ := proc.Call(uintptr(handle)) - if r0 != 0 { - err = syscall.Errno(r0) - } - return -} - -func signalDaemonDump(pid int) { - modkernel32 := windows.NewLazySystemDLL("kernel32.dll") - procOpenEvent := modkernel32.NewProc("OpenEventW") - procPulseEvent := modkernel32.NewProc("PulseEvent") - - ev := "Global\\docker-daemon-" + strconv.Itoa(pid) - h2, _ := openEvent(0x0002, false, ev, procOpenEvent) - if h2 == 0 { - return - } - pulseEvent(h2, procPulseEvent) -} - -func signalDaemonReload(pid int) error { - return fmt.Errorf("daemon reload not supported") -} - -func cleanupExecRoot(c *check.C, execRoot string) { -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_attach_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_attach_test.go deleted file mode 100644 index d43bf3ab0..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_attach_test.go +++ /dev/null @@ -1,210 +0,0 @@ -package main - -import ( - "bufio" - "bytes" - "context" - "io" - "net" - "net/http" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/stdcopy" - "github.com/go-check/check" - "golang.org/x/net/websocket" -) - -func (s *DockerSuite) TestGetContainersAttachWebsocket(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-dit", "busybox", "cat") - - rwc, err := sockConn(time.Duration(10*time.Second), "") - c.Assert(err, checker.IsNil) - - cleanedContainerID := strings.TrimSpace(out) - config, err := websocket.NewConfig( - "/containers/"+cleanedContainerID+"/attach/ws?stream=1&stdin=1&stdout=1&stderr=1", - "http://localhost", - ) - c.Assert(err, checker.IsNil) - - ws, err := websocket.NewClient(config, rwc) - c.Assert(err, checker.IsNil) - defer ws.Close() - - expected := []byte("hello") - actual := make([]byte, len(expected)) - - outChan := make(chan error) - go func() { - _, err := io.ReadFull(ws, actual) - outChan <- err - close(outChan) - }() - - inChan := make(chan error) - go func() { - _, err := ws.Write(expected) - inChan <- err - close(inChan) - }() - - select { - case err := <-inChan: - c.Assert(err, checker.IsNil) - case <-time.After(5 * time.Second): - c.Fatal("Timeout writing to ws") - } - - select { - case err := <-outChan: - c.Assert(err, checker.IsNil) - case <-time.After(5 * time.Second): - c.Fatal("Timeout reading from ws") - } - - c.Assert(actual, checker.DeepEquals, expected, check.Commentf("Websocket didn't return the expected data")) -} - -// regression gh14320 -func (s *DockerSuite) TestPostContainersAttachContainerNotFound(c *check.C) { - req, client, err := newRequestClient("POST", "/containers/doesnotexist/attach", nil, "", "") - c.Assert(err, checker.IsNil) - - resp, err := client.Do(req) - // connection will shutdown, err should be "persistent connection closed" - c.Assert(err, checker.NotNil) // Server shutdown connection - - body, err := readBody(resp.Body) - c.Assert(err, checker.IsNil) - c.Assert(resp.StatusCode, checker.Equals, http.StatusNotFound) - expected := "No such container: doesnotexist\r\n" - c.Assert(string(body), checker.Equals, expected) -} - -func (s *DockerSuite) TestGetContainersWsAttachContainerNotFound(c *check.C) { - status, body, err := sockRequest("GET", "/containers/doesnotexist/attach/ws", nil) - c.Assert(status, checker.Equals, http.StatusNotFound) - c.Assert(err, checker.IsNil) - expected := "No such container: doesnotexist" - c.Assert(getErrorMessage(c, body), checker.Contains, expected) -} - -func (s *DockerSuite) TestPostContainersAttach(c *check.C) { - testRequires(c, DaemonIsLinux) - - expectSuccess := func(conn net.Conn, br *bufio.Reader, stream string, tty bool) { - defer conn.Close() - expected := []byte("success") - _, err := conn.Write(expected) - c.Assert(err, checker.IsNil) - - conn.SetReadDeadline(time.Now().Add(time.Second)) - lenHeader := 0 - if !tty { - lenHeader = 8 - } - actual := make([]byte, len(expected)+lenHeader) - _, err = io.ReadFull(br, actual) - c.Assert(err, checker.IsNil) - if !tty { - fdMap := map[string]byte{ - "stdin": 0, - "stdout": 1, - "stderr": 2, - } - c.Assert(actual[0], checker.Equals, fdMap[stream]) - } - c.Assert(actual[lenHeader:], checker.DeepEquals, expected, check.Commentf("Attach didn't return the expected data from %s", stream)) - } - - expectTimeout := func(conn net.Conn, br *bufio.Reader, stream string) { - defer conn.Close() - _, err := conn.Write([]byte{'t'}) - c.Assert(err, checker.IsNil) - - conn.SetReadDeadline(time.Now().Add(time.Second)) - actual := make([]byte, 1) - _, err = io.ReadFull(br, actual) - opErr, ok := err.(*net.OpError) - c.Assert(ok, checker.Equals, true, check.Commentf("Error is expected to be *net.OpError, got %v", err)) - c.Assert(opErr.Timeout(), checker.Equals, true, check.Commentf("Read from %s is expected to timeout", stream)) - } - - // Create a container that only emits stdout. - cid, _ := dockerCmd(c, "run", "-di", "busybox", "cat") - cid = strings.TrimSpace(cid) - // Attach to the container's stdout stream. - conn, br, err := sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stdout=1", nil, "text/plain") - c.Assert(err, checker.IsNil) - // Check if the data from stdout can be received. - expectSuccess(conn, br, "stdout", false) - // Attach to the container's stderr stream. - conn, br, err = sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stderr=1", nil, "text/plain") - c.Assert(err, checker.IsNil) - // Since the container only emits stdout, attaching to stderr should return nothing. - expectTimeout(conn, br, "stdout") - - // Test the similar functions of the stderr stream. - cid, _ = dockerCmd(c, "run", "-di", "busybox", "/bin/sh", "-c", "cat >&2") - cid = strings.TrimSpace(cid) - conn, br, err = sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stderr=1", nil, "text/plain") - c.Assert(err, checker.IsNil) - expectSuccess(conn, br, "stderr", false) - conn, br, err = sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stdout=1", nil, "text/plain") - c.Assert(err, checker.IsNil) - expectTimeout(conn, br, "stderr") - - // Test with tty. - cid, _ = dockerCmd(c, "run", "-dit", "busybox", "/bin/sh", "-c", "cat >&2") - cid = strings.TrimSpace(cid) - // Attach to stdout only. - conn, br, err = sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stdout=1", nil, "text/plain") - c.Assert(err, checker.IsNil) - expectSuccess(conn, br, "stdout", true) - - // Attach without stdout stream. - conn, br, err = sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stderr=1", nil, "text/plain") - c.Assert(err, checker.IsNil) - // Nothing should be received because both the stdout and stderr of the container will be - // sent to the client as stdout when tty is enabled. - expectTimeout(conn, br, "stdout") - - // Test the client API - // Make sure we don't see "hello" if Logs is false - client, err := client.NewEnvClient() - c.Assert(err, checker.IsNil) - - cid, _ = dockerCmd(c, "run", "-di", "busybox", "/bin/sh", "-c", "echo hello; cat") - cid = strings.TrimSpace(cid) - - attachOpts := types.ContainerAttachOptions{ - Stream: true, - Stdin: true, - Stdout: true, - } - - resp, err := client.ContainerAttach(context.Background(), cid, attachOpts) - c.Assert(err, checker.IsNil) - expectSuccess(resp.Conn, resp.Reader, "stdout", false) - - // Make sure we do see "hello" if Logs is true - attachOpts.Logs = true - resp, err = client.ContainerAttach(context.Background(), cid, attachOpts) - c.Assert(err, checker.IsNil) - - defer resp.Conn.Close() - resp.Conn.SetReadDeadline(time.Now().Add(time.Second)) - - _, err = resp.Conn.Write([]byte("success")) - c.Assert(err, checker.IsNil) - - actualStdout := new(bytes.Buffer) - actualStderr := new(bytes.Buffer) - stdcopy.StdCopy(actualStdout, actualStderr, resp.Reader) - c.Assert(actualStdout.Bytes(), checker.DeepEquals, []byte("hello\nsuccess"), check.Commentf("Attach didn't return the expected data from stdout")) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_auth_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_auth_test.go deleted file mode 100644 index bfcae31bd..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_auth_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "net/http" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// Test case for #22244 -func (s *DockerSuite) TestAuthAPI(c *check.C) { - testRequires(c, Network) - config := types.AuthConfig{ - Username: "no-user", - Password: "no-password", - } - - expected := "Get https://registry-1.docker.io/v2/: unauthorized: incorrect username or password" - status, body, err := sockRequest("POST", "/auth", config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusUnauthorized) - msg := getErrorMessage(c, body) - c.Assert(msg, checker.Contains, expected, check.Commentf("Expected: %v, got: %v", expected, msg)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_build_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_build_test.go deleted file mode 100644 index 9b069a43a..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_build_test.go +++ /dev/null @@ -1,254 +0,0 @@ -package main - -import ( - "archive/tar" - "bytes" - "net/http" - "regexp" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestBuildAPIDockerFileRemote(c *check.C) { - testRequires(c, NotUserNamespace) - var testD string - if daemonPlatform == "windows" { - testD = `FROM busybox -COPY * /tmp/ -RUN find / -name ba* -RUN find /tmp/` - } else { - // -xdev is required because sysfs can cause EPERM - testD = `FROM busybox -COPY * /tmp/ -RUN find / -xdev -name ba* -RUN find /tmp/` - } - server, err := fakeStorage(map[string]string{"testD": testD}) - c.Assert(err, checker.IsNil) - defer server.Close() - - res, body, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+server.URL()+"/testD", nil, "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - - buf, err := readBody(body) - c.Assert(err, checker.IsNil) - - // Make sure Dockerfile exists. - // Make sure 'baz' doesn't exist ANYWHERE despite being mentioned in the URL - out := string(buf) - c.Assert(out, checker.Contains, "/tmp/Dockerfile") - c.Assert(out, checker.Not(checker.Contains), "baz") -} - -func (s *DockerSuite) TestBuildAPIRemoteTarballContext(c *check.C) { - buffer := new(bytes.Buffer) - tw := tar.NewWriter(buffer) - defer tw.Close() - - dockerfile := []byte("FROM busybox") - err := tw.WriteHeader(&tar.Header{ - Name: "Dockerfile", - Size: int64(len(dockerfile)), - }) - // failed to write tar file header - c.Assert(err, checker.IsNil) - - _, err = tw.Write(dockerfile) - // failed to write tar file content - c.Assert(err, checker.IsNil) - - // failed to close tar archive - c.Assert(tw.Close(), checker.IsNil) - - server, err := fakeBinaryStorage(map[string]*bytes.Buffer{ - "testT.tar": buffer, - }) - c.Assert(err, checker.IsNil) - - defer server.Close() - - res, b, err := sockRequestRaw("POST", "/build?remote="+server.URL()+"/testT.tar", nil, "application/tar") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - b.Close() -} - -func (s *DockerSuite) TestBuildAPIRemoteTarballContextWithCustomDockerfile(c *check.C) { - buffer := new(bytes.Buffer) - tw := tar.NewWriter(buffer) - defer tw.Close() - - dockerfile := []byte(`FROM busybox -RUN echo 'wrong'`) - err := tw.WriteHeader(&tar.Header{ - Name: "Dockerfile", - Size: int64(len(dockerfile)), - }) - // failed to write tar file header - c.Assert(err, checker.IsNil) - - _, err = tw.Write(dockerfile) - // failed to write tar file content - c.Assert(err, checker.IsNil) - - custom := []byte(`FROM busybox -RUN echo 'right' -`) - err = tw.WriteHeader(&tar.Header{ - Name: "custom", - Size: int64(len(custom)), - }) - - // failed to write tar file header - c.Assert(err, checker.IsNil) - - _, err = tw.Write(custom) - // failed to write tar file content - c.Assert(err, checker.IsNil) - - // failed to close tar archive - c.Assert(tw.Close(), checker.IsNil) - - server, err := fakeBinaryStorage(map[string]*bytes.Buffer{ - "testT.tar": buffer, - }) - c.Assert(err, checker.IsNil) - - defer server.Close() - url := "/build?dockerfile=custom&remote=" + server.URL() + "/testT.tar" - res, body, err := sockRequestRaw("POST", url, nil, "application/tar") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - - defer body.Close() - content, err := readBody(body) - c.Assert(err, checker.IsNil) - - // Build used the wrong dockerfile. - c.Assert(string(content), checker.Not(checker.Contains), "wrong") -} - -func (s *DockerSuite) TestBuildAPILowerDockerfile(c *check.C) { - git, err := newFakeGit("repo", map[string]string{ - "dockerfile": `FROM busybox -RUN echo from dockerfile`, - }, false) - c.Assert(err, checker.IsNil) - defer git.Close() - - res, body, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - - buf, err := readBody(body) - c.Assert(err, checker.IsNil) - - out := string(buf) - c.Assert(out, checker.Contains, "from dockerfile") -} - -func (s *DockerSuite) TestBuildAPIBuildGitWithF(c *check.C) { - git, err := newFakeGit("repo", map[string]string{ - "baz": `FROM busybox -RUN echo from baz`, - "Dockerfile": `FROM busybox -RUN echo from Dockerfile`, - }, false) - c.Assert(err, checker.IsNil) - defer git.Close() - - // Make sure it tries to 'dockerfile' query param value - res, body, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+git.RepoURL, nil, "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - - buf, err := readBody(body) - c.Assert(err, checker.IsNil) - - out := string(buf) - c.Assert(out, checker.Contains, "from baz") -} - -func (s *DockerSuite) TestBuildAPIDoubleDockerfile(c *check.C) { - testRequires(c, UnixCli) // dockerfile overwrites Dockerfile on Windows - git, err := newFakeGit("repo", map[string]string{ - "Dockerfile": `FROM busybox -RUN echo from Dockerfile`, - "dockerfile": `FROM busybox -RUN echo from dockerfile`, - }, false) - c.Assert(err, checker.IsNil) - defer git.Close() - - // Make sure it tries to 'dockerfile' query param value - res, body, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - - buf, err := readBody(body) - c.Assert(err, checker.IsNil) - - out := string(buf) - c.Assert(out, checker.Contains, "from Dockerfile") -} - -func (s *DockerSuite) TestBuildAPIUnnormalizedTarPaths(c *check.C) { - // Make sure that build context tars with entries of the form - // x/./y don't cause caching false positives. - - buildFromTarContext := func(fileContents []byte) string { - buffer := new(bytes.Buffer) - tw := tar.NewWriter(buffer) - defer tw.Close() - - dockerfile := []byte(`FROM busybox - COPY dir /dir/`) - err := tw.WriteHeader(&tar.Header{ - Name: "Dockerfile", - Size: int64(len(dockerfile)), - }) - //failed to write tar file header - c.Assert(err, checker.IsNil) - - _, err = tw.Write(dockerfile) - // failed to write Dockerfile in tar file content - c.Assert(err, checker.IsNil) - - err = tw.WriteHeader(&tar.Header{ - Name: "dir/./file", - Size: int64(len(fileContents)), - }) - //failed to write tar file header - c.Assert(err, checker.IsNil) - - _, err = tw.Write(fileContents) - // failed to write file contents in tar file content - c.Assert(err, checker.IsNil) - - // failed to close tar archive - c.Assert(tw.Close(), checker.IsNil) - - res, body, err := sockRequestRaw("POST", "/build", buffer, "application/x-tar") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - - out, err := readBody(body) - c.Assert(err, checker.IsNil) - lines := strings.Split(string(out), "\n") - c.Assert(len(lines), checker.GreaterThan, 1) - c.Assert(lines[len(lines)-2], checker.Matches, ".*Successfully built [0-9a-f]{12}.*") - - re := regexp.MustCompile("Successfully built ([0-9a-f]{12})") - matches := re.FindStringSubmatch(lines[len(lines)-2]) - return matches[1] - } - - imageA := buildFromTarContext([]byte("abc")) - imageB := buildFromTarContext([]byte("def")) - - c.Assert(imageA, checker.Not(checker.Equals), imageB) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_containers_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_containers_test.go deleted file mode 100644 index d046ec068..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_containers_test.go +++ /dev/null @@ -1,1961 +0,0 @@ -package main - -import ( - "archive/tar" - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httputil" - "net/url" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - "time" - - "github.com/docker/docker/api/types" - containertypes "github.com/docker/docker/api/types/container" - mounttypes "github.com/docker/docker/api/types/mount" - networktypes "github.com/docker/docker/api/types/network" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/volume" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestContainerAPIGetAll(c *check.C) { - startCount, err := getContainerCount() - c.Assert(err, checker.IsNil, check.Commentf("Cannot query container count")) - - name := "getall" - dockerCmd(c, "run", "--name", name, "busybox", "true") - - status, body, err := sockRequest("GET", "/containers/json?all=1", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - var inspectJSON []struct { - Names []string - } - err = json.Unmarshal(body, &inspectJSON) - c.Assert(err, checker.IsNil, check.Commentf("unable to unmarshal response body")) - - c.Assert(inspectJSON, checker.HasLen, startCount+1) - - actual := inspectJSON[0].Names[0] - c.Assert(actual, checker.Equals, "/"+name) -} - -// regression test for empty json field being omitted #13691 -func (s *DockerSuite) TestContainerAPIGetJSONNoFieldsOmitted(c *check.C) { - dockerCmd(c, "run", "busybox", "true") - - status, body, err := sockRequest("GET", "/containers/json?all=1", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - // empty Labels field triggered this bug, make sense to check for everything - // cause even Ports for instance can trigger this bug - // better safe than sorry.. - fields := []string{ - "Id", - "Names", - "Image", - "Command", - "Created", - "Ports", - "Labels", - "Status", - "NetworkSettings", - } - - // decoding into types.Container do not work since it eventually unmarshal - // and empty field to an empty go map, so we just check for a string - for _, f := range fields { - if !strings.Contains(string(body), f) { - c.Fatalf("Field %s is missing and it shouldn't", f) - } - } -} - -type containerPs struct { - Names []string - Ports []map[string]interface{} -} - -// regression test for non-empty fields from #13901 -func (s *DockerSuite) TestContainerAPIPsOmitFields(c *check.C) { - // Problematic for Windows porting due to networking not yet being passed back - testRequires(c, DaemonIsLinux) - name := "pstest" - port := 80 - runSleepingContainer(c, "--name", name, "--expose", strconv.Itoa(port)) - - status, body, err := sockRequest("GET", "/containers/json?all=1", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - var resp []containerPs - err = json.Unmarshal(body, &resp) - c.Assert(err, checker.IsNil) - - var foundContainer *containerPs - for _, container := range resp { - for _, testName := range container.Names { - if "/"+name == testName { - foundContainer = &container - break - } - } - } - - c.Assert(foundContainer.Ports, checker.HasLen, 1) - c.Assert(foundContainer.Ports[0]["PrivatePort"], checker.Equals, float64(port)) - _, ok := foundContainer.Ports[0]["PublicPort"] - c.Assert(ok, checker.Not(checker.Equals), true) - _, ok = foundContainer.Ports[0]["IP"] - c.Assert(ok, checker.Not(checker.Equals), true) -} - -func (s *DockerSuite) TestContainerAPIGetExport(c *check.C) { - // Not supported on Windows as Windows does not support docker export - testRequires(c, DaemonIsLinux) - name := "exportcontainer" - dockerCmd(c, "run", "--name", name, "busybox", "touch", "/test") - - status, body, err := sockRequest("GET", "/containers/"+name+"/export", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - found := false - for tarReader := tar.NewReader(bytes.NewReader(body)); ; { - h, err := tarReader.Next() - if err != nil && err == io.EOF { - break - } - if h.Name == "test" { - found = true - break - } - } - c.Assert(found, checker.True, check.Commentf("The created test file has not been found in the exported image")) -} - -func (s *DockerSuite) TestContainerAPIGetChanges(c *check.C) { - // Not supported on Windows as Windows does not support docker diff (/containers/name/changes) - testRequires(c, DaemonIsLinux) - name := "changescontainer" - dockerCmd(c, "run", "--name", name, "busybox", "rm", "/etc/passwd") - - status, body, err := sockRequest("GET", "/containers/"+name+"/changes", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - changes := []struct { - Kind int - Path string - }{} - c.Assert(json.Unmarshal(body, &changes), checker.IsNil, check.Commentf("unable to unmarshal response body")) - - // Check the changelog for removal of /etc/passwd - success := false - for _, elem := range changes { - if elem.Path == "/etc/passwd" && elem.Kind == 2 { - success = true - } - } - c.Assert(success, checker.True, check.Commentf("/etc/passwd has been removed but is not present in the diff")) -} - -func (s *DockerSuite) TestGetContainerStats(c *check.C) { - var ( - name = "statscontainer" - ) - runSleepingContainer(c, "--name", name) - - type b struct { - status int - body []byte - err error - } - bc := make(chan b, 1) - go func() { - status, body, err := sockRequest("GET", "/containers/"+name+"/stats", nil) - bc <- b{status, body, err} - }() - - // allow some time to stream the stats from the container - time.Sleep(4 * time.Second) - dockerCmd(c, "rm", "-f", name) - - // collect the results from the stats stream or timeout and fail - // if the stream was not disconnected. - select { - case <-time.After(2 * time.Second): - c.Fatal("stream was not closed after container was removed") - case sr := <-bc: - c.Assert(sr.err, checker.IsNil) - c.Assert(sr.status, checker.Equals, http.StatusOK) - - dec := json.NewDecoder(bytes.NewBuffer(sr.body)) - var s *types.Stats - // decode only one object from the stream - c.Assert(dec.Decode(&s), checker.IsNil) - } -} - -func (s *DockerSuite) TestGetContainerStatsRmRunning(c *check.C) { - out, _ := runSleepingContainer(c) - id := strings.TrimSpace(out) - - buf := &integration.ChannelBuffer{make(chan []byte, 1)} - defer buf.Close() - - _, body, err := sockRequestRaw("GET", "/containers/"+id+"/stats?stream=1", nil, "application/json") - c.Assert(err, checker.IsNil) - defer body.Close() - - chErr := make(chan error, 1) - go func() { - _, err = io.Copy(buf, body) - chErr <- err - }() - - b := make([]byte, 32) - // make sure we've got some stats - _, err = buf.ReadTimeout(b, 2*time.Second) - c.Assert(err, checker.IsNil) - - // Now remove without `-f` and make sure we are still pulling stats - _, _, err = dockerCmdWithError("rm", id) - c.Assert(err, checker.Not(checker.IsNil), check.Commentf("rm should have failed but didn't")) - _, err = buf.ReadTimeout(b, 2*time.Second) - c.Assert(err, checker.IsNil) - - dockerCmd(c, "rm", "-f", id) - c.Assert(<-chErr, checker.IsNil) -} - -// regression test for gh13421 -// previous test was just checking one stat entry so it didn't fail (stats with -// stream false always return one stat) -func (s *DockerSuite) TestGetContainerStatsStream(c *check.C) { - name := "statscontainer" - runSleepingContainer(c, "--name", name) - - type b struct { - status int - body []byte - err error - } - bc := make(chan b, 1) - go func() { - status, body, err := sockRequest("GET", "/containers/"+name+"/stats", nil) - bc <- b{status, body, err} - }() - - // allow some time to stream the stats from the container - time.Sleep(4 * time.Second) - dockerCmd(c, "rm", "-f", name) - - // collect the results from the stats stream or timeout and fail - // if the stream was not disconnected. - select { - case <-time.After(2 * time.Second): - c.Fatal("stream was not closed after container was removed") - case sr := <-bc: - c.Assert(sr.err, checker.IsNil) - c.Assert(sr.status, checker.Equals, http.StatusOK) - - s := string(sr.body) - // count occurrences of "read" of types.Stats - if l := strings.Count(s, "read"); l < 2 { - c.Fatalf("Expected more than one stat streamed, got %d", l) - } - } -} - -func (s *DockerSuite) TestGetContainerStatsNoStream(c *check.C) { - name := "statscontainer" - runSleepingContainer(c, "--name", name) - - type b struct { - status int - body []byte - err error - } - bc := make(chan b, 1) - go func() { - status, body, err := sockRequest("GET", "/containers/"+name+"/stats?stream=0", nil) - bc <- b{status, body, err} - }() - - // allow some time to stream the stats from the container - time.Sleep(4 * time.Second) - dockerCmd(c, "rm", "-f", name) - - // collect the results from the stats stream or timeout and fail - // if the stream was not disconnected. - select { - case <-time.After(2 * time.Second): - c.Fatal("stream was not closed after container was removed") - case sr := <-bc: - c.Assert(sr.err, checker.IsNil) - c.Assert(sr.status, checker.Equals, http.StatusOK) - - s := string(sr.body) - // count occurrences of `"read"` of types.Stats - c.Assert(strings.Count(s, `"read"`), checker.Equals, 1, check.Commentf("Expected only one stat streamed, got %d", strings.Count(s, `"read"`))) - } -} - -func (s *DockerSuite) TestGetStoppedContainerStats(c *check.C) { - name := "statscontainer" - dockerCmd(c, "create", "--name", name, "busybox", "ps") - - type stats struct { - status int - err error - } - chResp := make(chan stats) - - // We expect an immediate response, but if it's not immediate, the test would hang, so put it in a goroutine - // below we'll check this on a timeout. - go func() { - resp, body, err := sockRequestRaw("GET", "/containers/"+name+"/stats", nil, "") - body.Close() - chResp <- stats{resp.StatusCode, err} - }() - - select { - case r := <-chResp: - c.Assert(r.err, checker.IsNil) - c.Assert(r.status, checker.Equals, http.StatusOK) - case <-time.After(10 * time.Second): - c.Fatal("timeout waiting for stats response for stopped container") - } -} - -func (s *DockerSuite) TestContainerAPIPause(c *check.C) { - // Problematic on Windows as Windows does not support pause - testRequires(c, DaemonIsLinux) - defer unpauseAllContainers() - out, _ := dockerCmd(c, "run", "-d", "busybox", "sleep", "30") - ContainerID := strings.TrimSpace(out) - - status, _, err := sockRequest("POST", "/containers/"+ContainerID+"/pause", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - - pausedContainers, err := getSliceOfPausedContainers() - c.Assert(err, checker.IsNil, check.Commentf("error thrown while checking if containers were paused")) - - if len(pausedContainers) != 1 || stringid.TruncateID(ContainerID) != pausedContainers[0] { - c.Fatalf("there should be one paused container and not %d", len(pausedContainers)) - } - - status, _, err = sockRequest("POST", "/containers/"+ContainerID+"/unpause", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - - pausedContainers, err = getSliceOfPausedContainers() - c.Assert(err, checker.IsNil, check.Commentf("error thrown while checking if containers were paused")) - c.Assert(pausedContainers, checker.IsNil, check.Commentf("There should be no paused container.")) -} - -func (s *DockerSuite) TestContainerAPITop(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "top") - id := strings.TrimSpace(string(out)) - c.Assert(waitRun(id), checker.IsNil) - - type topResp struct { - Titles []string - Processes [][]string - } - var top topResp - status, b, err := sockRequest("GET", "/containers/"+id+"/top?ps_args=aux", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(json.Unmarshal(b, &top), checker.IsNil) - c.Assert(top.Titles, checker.HasLen, 11, check.Commentf("expected 11 titles, found %d: %v", len(top.Titles), top.Titles)) - - if top.Titles[0] != "USER" || top.Titles[10] != "COMMAND" { - c.Fatalf("expected `USER` at `Titles[0]` and `COMMAND` at Titles[10]: %v", top.Titles) - } - c.Assert(top.Processes, checker.HasLen, 2, check.Commentf("expected 2 processes, found %d: %v", len(top.Processes), top.Processes)) - c.Assert(top.Processes[0][10], checker.Equals, "/bin/sh -c top") - c.Assert(top.Processes[1][10], checker.Equals, "top") -} - -func (s *DockerSuite) TestContainerAPITopWindows(c *check.C) { - testRequires(c, DaemonIsWindows) - out, _ := runSleepingContainer(c, "-d") - id := strings.TrimSpace(string(out)) - c.Assert(waitRun(id), checker.IsNil) - - type topResp struct { - Titles []string - Processes [][]string - } - var top topResp - status, b, err := sockRequest("GET", "/containers/"+id+"/top", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(json.Unmarshal(b, &top), checker.IsNil) - c.Assert(top.Titles, checker.HasLen, 4, check.Commentf("expected 4 titles, found %d: %v", len(top.Titles), top.Titles)) - - if top.Titles[0] != "Name" || top.Titles[3] != "Private Working Set" { - c.Fatalf("expected `Name` at `Titles[0]` and `Private Working Set` at Titles[3]: %v", top.Titles) - } - c.Assert(len(top.Processes), checker.GreaterOrEqualThan, 2, check.Commentf("expected at least 2 processes, found %d: %v", len(top.Processes), top.Processes)) - - foundProcess := false - expectedProcess := "busybox.exe" - for _, process := range top.Processes { - if process[0] == expectedProcess { - foundProcess = true - break - } - } - - c.Assert(foundProcess, checker.Equals, true, check.Commentf("expected to find %s: %v", expectedProcess, top.Processes)) -} - -func (s *DockerSuite) TestContainerAPICommit(c *check.C) { - cName := "testapicommit" - dockerCmd(c, "run", "--name="+cName, "busybox", "/bin/sh", "-c", "touch /test") - - name := "testcontainerapicommit" - status, b, err := sockRequest("POST", "/commit?repo="+name+"&testtag=tag&container="+cName, nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - type resp struct { - ID string - } - var img resp - c.Assert(json.Unmarshal(b, &img), checker.IsNil) - - cmd := inspectField(c, img.ID, "Config.Cmd") - c.Assert(cmd, checker.Equals, "[/bin/sh -c touch /test]", check.Commentf("got wrong Cmd from commit: %q", cmd)) - - // sanity check, make sure the image is what we think it is - dockerCmd(c, "run", img.ID, "ls", "/test") -} - -func (s *DockerSuite) TestContainerAPICommitWithLabelInConfig(c *check.C) { - cName := "testapicommitwithconfig" - dockerCmd(c, "run", "--name="+cName, "busybox", "/bin/sh", "-c", "touch /test") - - config := map[string]interface{}{ - "Labels": map[string]string{"key1": "value1", "key2": "value2"}, - } - - name := "testcontainerapicommitwithconfig" - status, b, err := sockRequest("POST", "/commit?repo="+name+"&container="+cName, config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - type resp struct { - ID string - } - var img resp - c.Assert(json.Unmarshal(b, &img), checker.IsNil) - - label1 := inspectFieldMap(c, img.ID, "Config.Labels", "key1") - c.Assert(label1, checker.Equals, "value1") - - label2 := inspectFieldMap(c, img.ID, "Config.Labels", "key2") - c.Assert(label2, checker.Equals, "value2") - - cmd := inspectField(c, img.ID, "Config.Cmd") - c.Assert(cmd, checker.Equals, "[/bin/sh -c touch /test]", check.Commentf("got wrong Cmd from commit: %q", cmd)) - - // sanity check, make sure the image is what we think it is - dockerCmd(c, "run", img.ID, "ls", "/test") -} - -func (s *DockerSuite) TestContainerAPIBadPort(c *check.C) { - // TODO Windows to Windows CI - Port this test - testRequires(c, DaemonIsLinux) - config := map[string]interface{}{ - "Image": "busybox", - "Cmd": []string{"/bin/sh", "-c", "echo test"}, - "PortBindings": map[string]interface{}{ - "8080/tcp": []map[string]interface{}{ - { - "HostIP": "", - "HostPort": "aa80", - }, - }, - }, - } - - jsonData := bytes.NewBuffer(nil) - json.NewEncoder(jsonData).Encode(config) - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError) - c.Assert(getErrorMessage(c, body), checker.Equals, `invalid port specification: "aa80"`, check.Commentf("Incorrect error msg: %s", body)) -} - -func (s *DockerSuite) TestContainerAPICreate(c *check.C) { - config := map[string]interface{}{ - "Image": "busybox", - "Cmd": []string{"/bin/sh", "-c", "touch /test && ls /test"}, - } - - status, b, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - type createResp struct { - ID string - } - var container createResp - c.Assert(json.Unmarshal(b, &container), checker.IsNil) - - out, _ := dockerCmd(c, "start", "-a", container.ID) - c.Assert(strings.TrimSpace(out), checker.Equals, "/test") -} - -func (s *DockerSuite) TestContainerAPICreateEmptyConfig(c *check.C) { - config := map[string]interface{}{} - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError) - - expected := "Config cannot be empty in order to create a container" - c.Assert(getErrorMessage(c, body), checker.Equals, expected) -} - -func (s *DockerSuite) TestContainerAPICreateMultipleNetworksConfig(c *check.C) { - // Container creation must fail if client specified configurations for more than one network - config := map[string]interface{}{ - "Image": "busybox", - "NetworkingConfig": networktypes.NetworkingConfig{ - EndpointsConfig: map[string]*networktypes.EndpointSettings{ - "net1": {}, - "net2": {}, - "net3": {}, - }, - }, - } - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusBadRequest) - msg := getErrorMessage(c, body) - // network name order in error message is not deterministic - c.Assert(msg, checker.Contains, "Container cannot be connected to network endpoints") - c.Assert(msg, checker.Contains, "net1") - c.Assert(msg, checker.Contains, "net2") - c.Assert(msg, checker.Contains, "net3") -} - -func (s *DockerSuite) TestContainerAPICreateWithHostName(c *check.C) { - hostName := "test-host" - config := map[string]interface{}{ - "Image": "busybox", - "Hostname": hostName, - } - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - var container containertypes.ContainerCreateCreatedBody - c.Assert(json.Unmarshal(body, &container), checker.IsNil) - - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - var containerJSON types.ContainerJSON - c.Assert(json.Unmarshal(body, &containerJSON), checker.IsNil) - c.Assert(containerJSON.Config.Hostname, checker.Equals, hostName, check.Commentf("Mismatched Hostname")) -} - -func (s *DockerSuite) TestContainerAPICreateWithDomainName(c *check.C) { - domainName := "test-domain" - config := map[string]interface{}{ - "Image": "busybox", - "Domainname": domainName, - } - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - var container containertypes.ContainerCreateCreatedBody - c.Assert(json.Unmarshal(body, &container), checker.IsNil) - - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - var containerJSON types.ContainerJSON - c.Assert(json.Unmarshal(body, &containerJSON), checker.IsNil) - c.Assert(containerJSON.Config.Domainname, checker.Equals, domainName, check.Commentf("Mismatched Domainname")) -} - -func (s *DockerSuite) TestContainerAPICreateBridgeNetworkMode(c *check.C) { - // Windows does not support bridge - testRequires(c, DaemonIsLinux) - UtilCreateNetworkMode(c, "bridge") -} - -func (s *DockerSuite) TestContainerAPICreateOtherNetworkModes(c *check.C) { - // Windows does not support these network modes - testRequires(c, DaemonIsLinux, NotUserNamespace) - UtilCreateNetworkMode(c, "host") - UtilCreateNetworkMode(c, "container:web1") -} - -func UtilCreateNetworkMode(c *check.C, networkMode string) { - config := map[string]interface{}{ - "Image": "busybox", - "HostConfig": map[string]interface{}{"NetworkMode": networkMode}, - } - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - var container containertypes.ContainerCreateCreatedBody - c.Assert(json.Unmarshal(body, &container), checker.IsNil) - - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - var containerJSON types.ContainerJSON - c.Assert(json.Unmarshal(body, &containerJSON), checker.IsNil) - c.Assert(containerJSON.HostConfig.NetworkMode, checker.Equals, containertypes.NetworkMode(networkMode), check.Commentf("Mismatched NetworkMode")) -} - -func (s *DockerSuite) TestContainerAPICreateWithCpuSharesCpuset(c *check.C) { - // TODO Windows to Windows CI. The CpuShares part could be ported. - testRequires(c, DaemonIsLinux) - config := map[string]interface{}{ - "Image": "busybox", - "CpuShares": 512, - "CpusetCpus": "0", - } - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - var container containertypes.ContainerCreateCreatedBody - c.Assert(json.Unmarshal(body, &container), checker.IsNil) - - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - var containerJSON types.ContainerJSON - - c.Assert(json.Unmarshal(body, &containerJSON), checker.IsNil) - - out := inspectField(c, containerJSON.ID, "HostConfig.CpuShares") - c.Assert(out, checker.Equals, "512") - - outCpuset := inspectField(c, containerJSON.ID, "HostConfig.CpusetCpus") - c.Assert(outCpuset, checker.Equals, "0") -} - -func (s *DockerSuite) TestContainerAPIVerifyHeader(c *check.C) { - config := map[string]interface{}{ - "Image": "busybox", - } - - create := func(ct string) (*http.Response, io.ReadCloser, error) { - jsonData := bytes.NewBuffer(nil) - c.Assert(json.NewEncoder(jsonData).Encode(config), checker.IsNil) - return sockRequestRaw("POST", "/containers/create", jsonData, ct) - } - - // Try with no content-type - res, body, err := create("") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - body.Close() - - // Try with wrong content-type - res, body, err = create("application/xml") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - body.Close() - - // now application/json - res, body, err = create("application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusCreated) - body.Close() -} - -//Issue 14230. daemon should return 500 for invalid port syntax -func (s *DockerSuite) TestContainerAPIInvalidPortSyntax(c *check.C) { - config := `{ - "Image": "busybox", - "HostConfig": { - "NetworkMode": "default", - "PortBindings": { - "19039;1230": [ - {} - ] - } - } - }` - - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - - b, err := readBody(body) - c.Assert(err, checker.IsNil) - c.Assert(string(b[:]), checker.Contains, "invalid port") -} - -func (s *DockerSuite) TestContainerAPIRestartPolicyInvalidPolicyName(c *check.C) { - config := `{ - "Image": "busybox", - "HostConfig": { - "RestartPolicy": { - "Name": "something", - "MaximumRetryCount": 0 - } - } - }` - - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - - b, err := readBody(body) - c.Assert(err, checker.IsNil) - c.Assert(string(b[:]), checker.Contains, "invalid restart policy") -} - -func (s *DockerSuite) TestContainerAPIRestartPolicyRetryMismatch(c *check.C) { - config := `{ - "Image": "busybox", - "HostConfig": { - "RestartPolicy": { - "Name": "always", - "MaximumRetryCount": 2 - } - } - }` - - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - - b, err := readBody(body) - c.Assert(err, checker.IsNil) - c.Assert(string(b[:]), checker.Contains, "maximum retry count cannot be used with restart policy") -} - -func (s *DockerSuite) TestContainerAPIRestartPolicyNegativeRetryCount(c *check.C) { - config := `{ - "Image": "busybox", - "HostConfig": { - "RestartPolicy": { - "Name": "on-failure", - "MaximumRetryCount": -2 - } - } - }` - - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - - b, err := readBody(body) - c.Assert(err, checker.IsNil) - c.Assert(string(b[:]), checker.Contains, "maximum retry count cannot be negative") -} - -func (s *DockerSuite) TestContainerAPIRestartPolicyDefaultRetryCount(c *check.C) { - config := `{ - "Image": "busybox", - "HostConfig": { - "RestartPolicy": { - "Name": "on-failure", - "MaximumRetryCount": 0 - } - } - }` - - res, _, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusCreated) -} - -// Issue 7941 - test to make sure a "null" in JSON is just ignored. -// W/o this fix a null in JSON would be parsed into a string var as "null" -func (s *DockerSuite) TestContainerAPIPostCreateNull(c *check.C) { - config := `{ - "Hostname":"", - "Domainname":"", - "Memory":0, - "MemorySwap":0, - "CpuShares":0, - "Cpuset":null, - "AttachStdin":true, - "AttachStdout":true, - "AttachStderr":true, - "ExposedPorts":{}, - "Tty":true, - "OpenStdin":true, - "StdinOnce":true, - "Env":[], - "Cmd":"ls", - "Image":"busybox", - "Volumes":{}, - "WorkingDir":"", - "Entrypoint":null, - "NetworkDisabled":false, - "OnBuild":null}` - - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusCreated) - - b, err := readBody(body) - c.Assert(err, checker.IsNil) - type createResp struct { - ID string - } - var container createResp - c.Assert(json.Unmarshal(b, &container), checker.IsNil) - out := inspectField(c, container.ID, "HostConfig.CpusetCpus") - c.Assert(out, checker.Equals, "") - - outMemory := inspectField(c, container.ID, "HostConfig.Memory") - c.Assert(outMemory, checker.Equals, "0") - outMemorySwap := inspectField(c, container.ID, "HostConfig.MemorySwap") - c.Assert(outMemorySwap, checker.Equals, "0") -} - -func (s *DockerSuite) TestCreateWithTooLowMemoryLimit(c *check.C) { - // TODO Windows: Port once memory is supported - testRequires(c, DaemonIsLinux) - config := `{ - "Image": "busybox", - "Cmd": "ls", - "OpenStdin": true, - "CpuShares": 100, - "Memory": 524287 - }` - - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - b, err2 := readBody(body) - c.Assert(err2, checker.IsNil) - - c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - c.Assert(string(b), checker.Contains, "Minimum memory limit allowed is 4MB") -} - -func (s *DockerSuite) TestContainerAPIRename(c *check.C) { - out, _ := dockerCmd(c, "run", "--name", "TestContainerAPIRename", "-d", "busybox", "sh") - - containerID := strings.TrimSpace(out) - newName := "TestContainerAPIRenameNew" - statusCode, _, err := sockRequest("POST", "/containers/"+containerID+"/rename?name="+newName, nil) - c.Assert(err, checker.IsNil) - // 204 No Content is expected, not 200 - c.Assert(statusCode, checker.Equals, http.StatusNoContent) - - name := inspectField(c, containerID, "Name") - c.Assert(name, checker.Equals, "/"+newName, check.Commentf("Failed to rename container")) -} - -func (s *DockerSuite) TestContainerAPIKill(c *check.C) { - name := "test-api-kill" - runSleepingContainer(c, "-i", "--name", name) - - status, _, err := sockRequest("POST", "/containers/"+name+"/kill", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - - state := inspectField(c, name, "State.Running") - c.Assert(state, checker.Equals, "false", check.Commentf("got wrong State from container %s: %q", name, state)) -} - -func (s *DockerSuite) TestContainerAPIRestart(c *check.C) { - name := "test-api-restart" - runSleepingContainer(c, "-di", "--name", name) - - status, _, err := sockRequest("POST", "/containers/"+name+"/restart?t=1", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - c.Assert(waitInspect(name, "{{ .State.Restarting }} {{ .State.Running }}", "false true", 15*time.Second), checker.IsNil) -} - -func (s *DockerSuite) TestContainerAPIRestartNotimeoutParam(c *check.C) { - name := "test-api-restart-no-timeout-param" - out, _ := runSleepingContainer(c, "-di", "--name", name) - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - status, _, err := sockRequest("POST", "/containers/"+name+"/restart", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - c.Assert(waitInspect(name, "{{ .State.Restarting }} {{ .State.Running }}", "false true", 15*time.Second), checker.IsNil) -} - -func (s *DockerSuite) TestContainerAPIStart(c *check.C) { - name := "testing-start" - config := map[string]interface{}{ - "Image": "busybox", - "Cmd": append([]string{"/bin/sh", "-c"}, sleepCommandForDaemonPlatform()...), - "OpenStdin": true, - } - - status, _, err := sockRequest("POST", "/containers/create?name="+name, config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - status, _, err = sockRequest("POST", "/containers/"+name+"/start", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - - // second call to start should give 304 - status, _, err = sockRequest("POST", "/containers/"+name+"/start", nil) - c.Assert(err, checker.IsNil) - - // TODO(tibor): figure out why this doesn't work on windows - if isLocalDaemon { - c.Assert(status, checker.Equals, http.StatusNotModified) - } -} - -func (s *DockerSuite) TestContainerAPIStop(c *check.C) { - name := "test-api-stop" - runSleepingContainer(c, "-i", "--name", name) - - status, _, err := sockRequest("POST", "/containers/"+name+"/stop?t=30", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - c.Assert(waitInspect(name, "{{ .State.Running }}", "false", 60*time.Second), checker.IsNil) - - // second call to start should give 304 - status, _, err = sockRequest("POST", "/containers/"+name+"/stop?t=30", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNotModified) -} - -func (s *DockerSuite) TestContainerAPIWait(c *check.C) { - name := "test-api-wait" - - sleepCmd := "/bin/sleep" - if daemonPlatform == "windows" { - sleepCmd = "sleep" - } - dockerCmd(c, "run", "--name", name, "busybox", sleepCmd, "2") - - status, body, err := sockRequest("POST", "/containers/"+name+"/wait", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(waitInspect(name, "{{ .State.Running }}", "false", 60*time.Second), checker.IsNil) - - var waitres containertypes.ContainerWaitOKBody - c.Assert(json.Unmarshal(body, &waitres), checker.IsNil) - c.Assert(waitres.StatusCode, checker.Equals, int64(0)) -} - -func (s *DockerSuite) TestContainerAPICopyNotExistsAnyMore(c *check.C) { - name := "test-container-api-copy" - dockerCmd(c, "run", "--name", name, "busybox", "touch", "/test.txt") - - postData := types.CopyConfig{ - Resource: "/test.txt", - } - - status, _, err := sockRequest("POST", "/containers/"+name+"/copy", postData) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNotFound) -} - -func (s *DockerSuite) TestContainerAPICopyPre124(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows only supports 1.25 or later - name := "test-container-api-copy" - dockerCmd(c, "run", "--name", name, "busybox", "touch", "/test.txt") - - postData := types.CopyConfig{ - Resource: "/test.txt", - } - - status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - found := false - for tarReader := tar.NewReader(bytes.NewReader(body)); ; { - h, err := tarReader.Next() - if err != nil { - if err == io.EOF { - break - } - c.Fatal(err) - } - if h.Name == "test.txt" { - found = true - break - } - } - c.Assert(found, checker.True) -} - -func (s *DockerSuite) TestContainerAPICopyResourcePathEmptyPr124(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows only supports 1.25 or later - name := "test-container-api-copy-resource-empty" - dockerCmd(c, "run", "--name", name, "busybox", "touch", "/test.txt") - - postData := types.CopyConfig{ - Resource: "", - } - - status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError) - c.Assert(string(body), checker.Matches, "Path cannot be empty\n") -} - -func (s *DockerSuite) TestContainerAPICopyResourcePathNotFoundPre124(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows only supports 1.25 or later - name := "test-container-api-copy-resource-not-found" - dockerCmd(c, "run", "--name", name, "busybox") - - postData := types.CopyConfig{ - Resource: "/notexist", - } - - status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError) - c.Assert(string(body), checker.Matches, "Could not find the file /notexist in container "+name+"\n") -} - -func (s *DockerSuite) TestContainerAPICopyContainerNotFoundPr124(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows only supports 1.25 or later - postData := types.CopyConfig{ - Resource: "/something", - } - - status, _, err := sockRequest("POST", "/v1.23/containers/notexists/copy", postData) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNotFound) -} - -func (s *DockerSuite) TestContainerAPIDelete(c *check.C) { - out, _ := runSleepingContainer(c) - - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - dockerCmd(c, "stop", id) - - status, _, err := sockRequest("DELETE", "/containers/"+id, nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) -} - -func (s *DockerSuite) TestContainerAPIDeleteNotExist(c *check.C) { - status, body, err := sockRequest("DELETE", "/containers/doesnotexist", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNotFound) - c.Assert(getErrorMessage(c, body), checker.Matches, "No such container: doesnotexist") -} - -func (s *DockerSuite) TestContainerAPIDeleteForce(c *check.C) { - out, _ := runSleepingContainer(c) - - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - status, _, err := sockRequest("DELETE", "/containers/"+id+"?force=1", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) -} - -func (s *DockerSuite) TestContainerAPIDeleteRemoveLinks(c *check.C) { - // Windows does not support links - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "--name", "tlink1", "busybox", "top") - - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - out, _ = dockerCmd(c, "run", "--link", "tlink1:tlink1", "--name", "tlink2", "-d", "busybox", "top") - - id2 := strings.TrimSpace(out) - c.Assert(waitRun(id2), checker.IsNil) - - links := inspectFieldJSON(c, id2, "HostConfig.Links") - c.Assert(links, checker.Equals, "[\"/tlink1:/tlink2/tlink1\"]", check.Commentf("expected to have links between containers")) - - status, b, err := sockRequest("DELETE", "/containers/tlink2/tlink1?link=1", nil) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusNoContent, check.Commentf(string(b))) - - linksPostRm := inspectFieldJSON(c, id2, "HostConfig.Links") - c.Assert(linksPostRm, checker.Equals, "null", check.Commentf("call to api deleteContainer links should have removed the specified links")) -} - -func (s *DockerSuite) TestContainerAPIDeleteConflict(c *check.C) { - out, _ := runSleepingContainer(c) - - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - status, _, err := sockRequest("DELETE", "/containers/"+id, nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusConflict) -} - -func (s *DockerSuite) TestContainerAPIDeleteRemoveVolume(c *check.C) { - testRequires(c, SameHostDaemon) - - vol := "/testvolume" - if daemonPlatform == "windows" { - vol = `c:\testvolume` - } - - out, _ := runSleepingContainer(c, "-v", vol) - - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - source, err := inspectMountSourceField(id, vol) - _, err = os.Stat(source) - c.Assert(err, checker.IsNil) - - status, _, err := sockRequest("DELETE", "/containers/"+id+"?v=1&force=1", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - _, err = os.Stat(source) - c.Assert(os.IsNotExist(err), checker.True, check.Commentf("expected to get ErrNotExist error, got %v", err)) -} - -// Regression test for https://github.com/docker/docker/issues/6231 -func (s *DockerSuite) TestContainerAPIChunkedEncoding(c *check.C) { - conn, err := sockConn(time.Duration(10*time.Second), "") - c.Assert(err, checker.IsNil) - client := httputil.NewClientConn(conn, nil) - defer client.Close() - - config := map[string]interface{}{ - "Image": "busybox", - "Cmd": append([]string{"/bin/sh", "-c"}, sleepCommandForDaemonPlatform()...), - "OpenStdin": true, - } - b, err := json.Marshal(config) - c.Assert(err, checker.IsNil) - - req, err := http.NewRequest("POST", "/containers/create", bytes.NewBuffer(b)) - c.Assert(err, checker.IsNil) - req.Header.Set("Content-Type", "application/json") - // This is a cheat to make the http request do chunked encoding - // Otherwise (just setting the Content-Encoding to chunked) net/http will overwrite - // https://golang.org/src/pkg/net/http/request.go?s=11980:12172 - req.ContentLength = -1 - - resp, err := client.Do(req) - c.Assert(err, checker.IsNil, check.Commentf("error creating container with chunked encoding")) - resp.Body.Close() - c.Assert(resp.StatusCode, checker.Equals, http.StatusCreated) -} - -func (s *DockerSuite) TestContainerAPIPostContainerStop(c *check.C) { - out, _ := runSleepingContainer(c) - - containerID := strings.TrimSpace(out) - c.Assert(waitRun(containerID), checker.IsNil) - - statusCode, _, err := sockRequest("POST", "/containers/"+containerID+"/stop", nil) - c.Assert(err, checker.IsNil) - // 204 No Content is expected, not 200 - c.Assert(statusCode, checker.Equals, http.StatusNoContent) - c.Assert(waitInspect(containerID, "{{ .State.Running }}", "false", 60*time.Second), checker.IsNil) -} - -// #14170 -func (s *DockerSuite) TestPostContainerAPICreateWithStringOrSliceEntrypoint(c *check.C) { - config := struct { - Image string - Entrypoint string - Cmd []string - }{"busybox", "echo", []string{"hello", "world"}} - _, _, err := sockRequest("POST", "/containers/create?name=echotest", config) - c.Assert(err, checker.IsNil) - out, _ := dockerCmd(c, "start", "-a", "echotest") - c.Assert(strings.TrimSpace(out), checker.Equals, "hello world") - - config2 := struct { - Image string - Entrypoint []string - Cmd []string - }{"busybox", []string{"echo"}, []string{"hello", "world"}} - _, _, err = sockRequest("POST", "/containers/create?name=echotest2", config2) - c.Assert(err, checker.IsNil) - out, _ = dockerCmd(c, "start", "-a", "echotest2") - c.Assert(strings.TrimSpace(out), checker.Equals, "hello world") -} - -// #14170 -func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceCmd(c *check.C) { - config := struct { - Image string - Entrypoint string - Cmd string - }{"busybox", "echo", "hello world"} - _, _, err := sockRequest("POST", "/containers/create?name=echotest", config) - c.Assert(err, checker.IsNil) - out, _ := dockerCmd(c, "start", "-a", "echotest") - c.Assert(strings.TrimSpace(out), checker.Equals, "hello world") - - config2 := struct { - Image string - Cmd []string - }{"busybox", []string{"echo", "hello", "world"}} - _, _, err = sockRequest("POST", "/containers/create?name=echotest2", config2) - c.Assert(err, checker.IsNil) - out, _ = dockerCmd(c, "start", "-a", "echotest2") - c.Assert(strings.TrimSpace(out), checker.Equals, "hello world") -} - -// regression #14318 -func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceCapAddDrop(c *check.C) { - // Windows doesn't support CapAdd/CapDrop - testRequires(c, DaemonIsLinux) - config := struct { - Image string - CapAdd string - CapDrop string - }{"busybox", "NET_ADMIN", "SYS_ADMIN"} - status, _, err := sockRequest("POST", "/containers/create?name=capaddtest0", config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - config2 := struct { - Image string - CapAdd []string - CapDrop []string - }{"busybox", []string{"NET_ADMIN", "SYS_ADMIN"}, []string{"SETGID"}} - status, _, err = sockRequest("POST", "/containers/create?name=capaddtest1", config2) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) -} - -// #14915 -func (s *DockerSuite) TestContainerAPICreateNoHostConfig118(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows only support 1.25 or later - config := struct { - Image string - }{"busybox"} - status, _, err := sockRequest("POST", "/v1.18/containers/create", config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) -} - -// Ensure an error occurs when you have a container read-only rootfs but you -// extract an archive to a symlink in a writable volume which points to a -// directory outside of the volume. -func (s *DockerSuite) TestPutContainerArchiveErrSymlinkInVolumeToReadOnlyRootfs(c *check.C) { - // Windows does not support read-only rootfs - // Requires local volume mount bind. - // --read-only + userns has remount issues - testRequires(c, SameHostDaemon, NotUserNamespace, DaemonIsLinux) - - testVol := getTestDir(c, "test-put-container-archive-err-symlink-in-volume-to-read-only-rootfs-") - defer os.RemoveAll(testVol) - - makeTestContentInDir(c, testVol) - - cID := makeTestContainer(c, testContainerOptions{ - readOnly: true, - volumes: defaultVolumes(testVol), // Our bind mount is at /vol2 - }) - defer deleteContainer(cID) - - // Attempt to extract to a symlink in the volume which points to a - // directory outside the volume. This should cause an error because the - // rootfs is read-only. - query := make(url.Values, 1) - query.Set("path", "/vol2/symlinkToAbsDir") - urlPath := fmt.Sprintf("/v1.20/containers/%s/archive?%s", cID, query.Encode()) - - statusCode, body, err := sockRequest("PUT", urlPath, nil) - c.Assert(err, checker.IsNil) - - if !isCpCannotCopyReadOnly(fmt.Errorf(string(body))) { - c.Fatalf("expected ErrContainerRootfsReadonly error, but got %d: %s", statusCode, string(body)) - } -} - -func (s *DockerSuite) TestContainerAPIGetContainersJSONEmpty(c *check.C) { - status, body, err := sockRequest("GET", "/containers/json?all=1", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(string(body), checker.Equals, "[]\n") -} - -func (s *DockerSuite) TestPostContainersCreateWithWrongCpusetValues(c *check.C) { - // Not supported on Windows - testRequires(c, DaemonIsLinux) - - c1 := struct { - Image string - CpusetCpus string - }{"busybox", "1-42,,"} - name := "wrong-cpuset-cpus" - status, body, err := sockRequest("POST", "/containers/create?name="+name, c1) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError) - expected := "Invalid value 1-42,, for cpuset cpus" - c.Assert(getErrorMessage(c, body), checker.Equals, expected) - - c2 := struct { - Image string - CpusetMems string - }{"busybox", "42-3,1--"} - name = "wrong-cpuset-mems" - status, body, err = sockRequest("POST", "/containers/create?name="+name, c2) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError) - expected = "Invalid value 42-3,1-- for cpuset mems" - c.Assert(getErrorMessage(c, body), checker.Equals, expected) -} - -func (s *DockerSuite) TestPostContainersCreateShmSizeNegative(c *check.C) { - // ShmSize is not supported on Windows - testRequires(c, DaemonIsLinux) - config := map[string]interface{}{ - "Image": "busybox", - "HostConfig": map[string]interface{}{"ShmSize": -1}, - } - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusInternalServerError) - c.Assert(getErrorMessage(c, body), checker.Contains, "SHM size can not be less than 0") -} - -func (s *DockerSuite) TestPostContainersCreateShmSizeHostConfigOmitted(c *check.C) { - // ShmSize is not supported on Windows - testRequires(c, DaemonIsLinux) - var defaultSHMSize int64 = 67108864 - config := map[string]interface{}{ - "Image": "busybox", - "Cmd": "mount", - } - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusCreated) - - var container containertypes.ContainerCreateCreatedBody - c.Assert(json.Unmarshal(body, &container), check.IsNil) - - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusOK) - - var containerJSON types.ContainerJSON - c.Assert(json.Unmarshal(body, &containerJSON), check.IsNil) - - c.Assert(containerJSON.HostConfig.ShmSize, check.Equals, defaultSHMSize) - - out, _ := dockerCmd(c, "start", "-i", containerJSON.ID) - shmRegexp := regexp.MustCompile(`shm on /dev/shm type tmpfs(.*)size=65536k`) - if !shmRegexp.MatchString(out) { - c.Fatalf("Expected shm of 64MB in mount command, got %v", out) - } -} - -func (s *DockerSuite) TestPostContainersCreateShmSizeOmitted(c *check.C) { - // ShmSize is not supported on Windows - testRequires(c, DaemonIsLinux) - config := map[string]interface{}{ - "Image": "busybox", - "HostConfig": map[string]interface{}{}, - "Cmd": "mount", - } - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusCreated) - - var container containertypes.ContainerCreateCreatedBody - c.Assert(json.Unmarshal(body, &container), check.IsNil) - - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusOK) - - var containerJSON types.ContainerJSON - c.Assert(json.Unmarshal(body, &containerJSON), check.IsNil) - - c.Assert(containerJSON.HostConfig.ShmSize, check.Equals, int64(67108864)) - - out, _ := dockerCmd(c, "start", "-i", containerJSON.ID) - shmRegexp := regexp.MustCompile(`shm on /dev/shm type tmpfs(.*)size=65536k`) - if !shmRegexp.MatchString(out) { - c.Fatalf("Expected shm of 64MB in mount command, got %v", out) - } -} - -func (s *DockerSuite) TestPostContainersCreateWithShmSize(c *check.C) { - // ShmSize is not supported on Windows - testRequires(c, DaemonIsLinux) - config := map[string]interface{}{ - "Image": "busybox", - "Cmd": "mount", - "HostConfig": map[string]interface{}{"ShmSize": 1073741824}, - } - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusCreated) - - var container containertypes.ContainerCreateCreatedBody - c.Assert(json.Unmarshal(body, &container), check.IsNil) - - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusOK) - - var containerJSON types.ContainerJSON - c.Assert(json.Unmarshal(body, &containerJSON), check.IsNil) - - c.Assert(containerJSON.HostConfig.ShmSize, check.Equals, int64(1073741824)) - - out, _ := dockerCmd(c, "start", "-i", containerJSON.ID) - shmRegex := regexp.MustCompile(`shm on /dev/shm type tmpfs(.*)size=1048576k`) - if !shmRegex.MatchString(out) { - c.Fatalf("Expected shm of 1GB in mount command, got %v", out) - } -} - -func (s *DockerSuite) TestPostContainersCreateMemorySwappinessHostConfigOmitted(c *check.C) { - // Swappiness is not supported on Windows - testRequires(c, DaemonIsLinux) - config := map[string]interface{}{ - "Image": "busybox", - } - - status, body, err := sockRequest("POST", "/containers/create", config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusCreated) - - var container containertypes.ContainerCreateCreatedBody - c.Assert(json.Unmarshal(body, &container), check.IsNil) - - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusOK) - - var containerJSON types.ContainerJSON - c.Assert(json.Unmarshal(body, &containerJSON), check.IsNil) - - c.Assert(*containerJSON.HostConfig.MemorySwappiness, check.Equals, int64(-1)) -} - -// check validation is done daemon side and not only in cli -func (s *DockerSuite) TestPostContainersCreateWithOomScoreAdjInvalidRange(c *check.C) { - // OomScoreAdj is not supported on Windows - testRequires(c, DaemonIsLinux) - - config := struct { - Image string - OomScoreAdj int - }{"busybox", 1001} - name := "oomscoreadj-over" - status, b, err := sockRequest("POST", "/containers/create?name="+name, config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusInternalServerError) - - expected := "Invalid value 1001, range for oom score adj is [-1000, 1000]" - msg := getErrorMessage(c, b) - if !strings.Contains(msg, expected) { - c.Fatalf("Expected output to contain %q, got %q", expected, msg) - } - - config = struct { - Image string - OomScoreAdj int - }{"busybox", -1001} - name = "oomscoreadj-low" - status, b, err = sockRequest("POST", "/containers/create?name="+name, config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusInternalServerError) - expected = "Invalid value -1001, range for oom score adj is [-1000, 1000]" - msg = getErrorMessage(c, b) - if !strings.Contains(msg, expected) { - c.Fatalf("Expected output to contain %q, got %q", expected, msg) - } -} - -// test case for #22210 where an empty container name caused panic. -func (s *DockerSuite) TestContainerAPIDeleteWithEmptyName(c *check.C) { - status, out, err := sockRequest("DELETE", "/containers/", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusBadRequest) - c.Assert(string(out), checker.Contains, "No container name or ID supplied") -} - -func (s *DockerSuite) TestContainerAPIStatsWithNetworkDisabled(c *check.C) { - // Problematic on Windows as Windows does not support stats - testRequires(c, DaemonIsLinux) - - name := "testing-network-disabled" - config := map[string]interface{}{ - "Image": "busybox", - "Cmd": []string{"top"}, - "NetworkDisabled": true, - } - - status, _, err := sockRequest("POST", "/containers/create?name="+name, config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - status, _, err = sockRequest("POST", "/containers/"+name+"/start", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - - c.Assert(waitRun(name), check.IsNil) - - type b struct { - status int - body []byte - err error - } - bc := make(chan b, 1) - go func() { - status, body, err := sockRequest("GET", "/containers/"+name+"/stats", nil) - bc <- b{status, body, err} - }() - - // allow some time to stream the stats from the container - time.Sleep(4 * time.Second) - dockerCmd(c, "rm", "-f", name) - - // collect the results from the stats stream or timeout and fail - // if the stream was not disconnected. - select { - case <-time.After(2 * time.Second): - c.Fatal("stream was not closed after container was removed") - case sr := <-bc: - c.Assert(sr.err, checker.IsNil) - c.Assert(sr.status, checker.Equals, http.StatusOK) - - // decode only one object from the stream - var s *types.Stats - dec := json.NewDecoder(bytes.NewBuffer(sr.body)) - c.Assert(dec.Decode(&s), checker.IsNil) - } -} - -func (s *DockerSuite) TestContainersAPICreateMountsValidation(c *check.C) { - type m mounttypes.Mount - type hc struct{ Mounts []m } - type cfg struct { - Image string - HostConfig hc - } - type testCase struct { - config cfg - status int - msg string - } - - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - destPath := prefix + slash + "foo" - notExistPath := prefix + slash + "notexist" - - cases := []testCase{ - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "notreal", - Target: destPath}}}}, - status: http.StatusBadRequest, - msg: "mount type unknown", - }, - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "bind"}}}}, - status: http.StatusBadRequest, - msg: "Target must not be empty", - }, - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "bind", - Target: destPath}}}}, - status: http.StatusBadRequest, - msg: "Source must not be empty", - }, - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "bind", - Source: notExistPath, - Target: destPath}}}}, - status: http.StatusBadRequest, - msg: "bind source path does not exist", - }, - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "volume"}}}}, - status: http.StatusBadRequest, - msg: "Target must not be empty", - }, - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "volume", - Source: "hello", - Target: destPath}}}}, - status: http.StatusCreated, - msg: "", - }, - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "volume", - Source: "hello2", - Target: destPath, - VolumeOptions: &mounttypes.VolumeOptions{ - DriverConfig: &mounttypes.Driver{ - Name: "local"}}}}}}, - status: http.StatusCreated, - msg: "", - }, - } - - if SameHostDaemon.Condition() { - tmpDir, err := ioutils.TempDir("", "test-mounts-api") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpDir) - cases = append(cases, []testCase{ - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "bind", - Source: tmpDir, - Target: destPath}}}}, - status: http.StatusCreated, - msg: "", - }, - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "bind", - Source: tmpDir, - Target: destPath, - VolumeOptions: &mounttypes.VolumeOptions{}}}}}, - status: http.StatusBadRequest, - msg: "VolumeOptions must not be specified", - }, - }...) - } - - if DaemonIsLinux.Condition() { - cases = append(cases, []testCase{ - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "volume", - Source: "hello3", - Target: destPath, - VolumeOptions: &mounttypes.VolumeOptions{ - DriverConfig: &mounttypes.Driver{ - Name: "local", - Options: map[string]string{"o": "size=1"}}}}}}}, - status: http.StatusCreated, - msg: "", - }, - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "tmpfs", - Target: destPath}}}}, - status: http.StatusCreated, - msg: "", - }, - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "tmpfs", - Target: destPath, - TmpfsOptions: &mounttypes.TmpfsOptions{ - SizeBytes: 4096 * 1024, - Mode: 0700, - }}}}}, - status: http.StatusCreated, - msg: "", - }, - - { - config: cfg{ - Image: "busybox", - HostConfig: hc{ - Mounts: []m{{ - Type: "tmpfs", - Source: "/shouldnotbespecified", - Target: destPath}}}}, - status: http.StatusBadRequest, - msg: "Source must not be specified", - }, - }...) - - } - - for i, x := range cases { - c.Logf("case %d", i) - status, b, err := sockRequest("POST", "/containers/create", x.config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, x.status, check.Commentf("%s\n%v", string(b), cases[i].config)) - if len(x.msg) > 0 { - c.Assert(string(b), checker.Contains, x.msg, check.Commentf("%v", cases[i].config)) - } - } -} - -func (s *DockerSuite) TestContainerAPICreateMountsBindRead(c *check.C) { - testRequires(c, NotUserNamespace, SameHostDaemon) - // also with data in the host side - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - destPath := prefix + slash + "foo" - tmpDir, err := ioutil.TempDir("", "test-mounts-api-bind") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpDir) - err = ioutil.WriteFile(filepath.Join(tmpDir, "bar"), []byte("hello"), 666) - c.Assert(err, checker.IsNil) - - data := map[string]interface{}{ - "Image": "busybox", - "Cmd": []string{"/bin/sh", "-c", "cat /foo/bar"}, - "HostConfig": map[string]interface{}{"Mounts": []map[string]interface{}{{"Type": "bind", "Source": tmpDir, "Target": destPath}}}, - } - status, resp, err := sockRequest("POST", "/containers/create?name=test", data) - c.Assert(err, checker.IsNil, check.Commentf(string(resp))) - c.Assert(status, checker.Equals, http.StatusCreated, check.Commentf(string(resp))) - - out, _ := dockerCmd(c, "start", "-a", "test") - c.Assert(out, checker.Equals, "hello") -} - -// Test Mounts comes out as expected for the MountPoint -func (s *DockerSuite) TestContainersAPICreateMountsCreate(c *check.C) { - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - destPath := prefix + slash + "foo" - - var ( - err error - testImg string - ) - if daemonPlatform != "windows" { - testImg, err = buildImage("test-mount-config", ` - FROM busybox - RUN mkdir `+destPath+` && touch `+destPath+slash+`bar - CMD cat `+destPath+slash+`bar - `, true) - } else { - testImg = "busybox" - } - c.Assert(err, checker.IsNil) - - type testCase struct { - cfg mounttypes.Mount - expected types.MountPoint - } - - cases := []testCase{ - // use literal strings here for `Type` instead of the defined constants in the volume package to keep this honest - // Validation of the actual `Mount` struct is done in another test is not needed here - {mounttypes.Mount{Type: "volume", Target: destPath}, types.MountPoint{Driver: volume.DefaultDriverName, Type: "volume", RW: true, Destination: destPath}}, - {mounttypes.Mount{Type: "volume", Target: destPath + slash}, types.MountPoint{Driver: volume.DefaultDriverName, Type: "volume", RW: true, Destination: destPath}}, - {mounttypes.Mount{Type: "volume", Target: destPath, Source: "test1"}, types.MountPoint{Type: "volume", Name: "test1", RW: true, Destination: destPath}}, - {mounttypes.Mount{Type: "volume", Target: destPath, ReadOnly: true, Source: "test2"}, types.MountPoint{Type: "volume", Name: "test2", RW: false, Destination: destPath}}, - {mounttypes.Mount{Type: "volume", Target: destPath, Source: "test3", VolumeOptions: &mounttypes.VolumeOptions{DriverConfig: &mounttypes.Driver{Name: volume.DefaultDriverName}}}, types.MountPoint{Driver: volume.DefaultDriverName, Type: "volume", Name: "test3", RW: true, Destination: destPath}}, - } - - if SameHostDaemon.Condition() { - // setup temp dir for testing binds - tmpDir1, err := ioutil.TempDir("", "test-mounts-api-1") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpDir1) - cases = append(cases, []testCase{ - {mounttypes.Mount{Type: "bind", Source: tmpDir1, Target: destPath}, types.MountPoint{Type: "bind", RW: true, Destination: destPath, Source: tmpDir1}}, - {mounttypes.Mount{Type: "bind", Source: tmpDir1, Target: destPath, ReadOnly: true}, types.MountPoint{Type: "bind", RW: false, Destination: destPath, Source: tmpDir1}}, - }...) - - // for modes only supported on Linux - if DaemonIsLinux.Condition() { - tmpDir3, err := ioutils.TempDir("", "test-mounts-api-3") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpDir3) - - c.Assert(mount.Mount(tmpDir3, tmpDir3, "none", "bind,rw"), checker.IsNil) - c.Assert(mount.ForceMount("", tmpDir3, "none", "shared"), checker.IsNil) - - cases = append(cases, []testCase{ - {mounttypes.Mount{Type: "bind", Source: tmpDir3, Target: destPath}, types.MountPoint{Type: "bind", RW: true, Destination: destPath, Source: tmpDir3}}, - {mounttypes.Mount{Type: "bind", Source: tmpDir3, Target: destPath, ReadOnly: true}, types.MountPoint{Type: "bind", RW: false, Destination: destPath, Source: tmpDir3}}, - {mounttypes.Mount{Type: "bind", Source: tmpDir3, Target: destPath, ReadOnly: true, BindOptions: &mounttypes.BindOptions{Propagation: "shared"}}, types.MountPoint{Type: "bind", RW: false, Destination: destPath, Source: tmpDir3, Propagation: "shared"}}, - }...) - } - } - - if daemonPlatform != "windows" { // Windows does not support volume populate - cases = append(cases, []testCase{ - {mounttypes.Mount{Type: "volume", Target: destPath, VolumeOptions: &mounttypes.VolumeOptions{NoCopy: true}}, types.MountPoint{Driver: volume.DefaultDriverName, Type: "volume", RW: true, Destination: destPath}}, - {mounttypes.Mount{Type: "volume", Target: destPath + slash, VolumeOptions: &mounttypes.VolumeOptions{NoCopy: true}}, types.MountPoint{Driver: volume.DefaultDriverName, Type: "volume", RW: true, Destination: destPath}}, - {mounttypes.Mount{Type: "volume", Target: destPath, Source: "test4", VolumeOptions: &mounttypes.VolumeOptions{NoCopy: true}}, types.MountPoint{Type: "volume", Name: "test4", RW: true, Destination: destPath}}, - {mounttypes.Mount{Type: "volume", Target: destPath, Source: "test5", ReadOnly: true, VolumeOptions: &mounttypes.VolumeOptions{NoCopy: true}}, types.MountPoint{Type: "volume", Name: "test5", RW: false, Destination: destPath}}, - }...) - } - - type wrapper struct { - containertypes.Config - HostConfig containertypes.HostConfig - } - type createResp struct { - ID string `json:"Id"` - } - for i, x := range cases { - c.Logf("case %d - config: %v", i, x.cfg) - status, data, err := sockRequest("POST", "/containers/create", wrapper{containertypes.Config{Image: testImg}, containertypes.HostConfig{Mounts: []mounttypes.Mount{x.cfg}}}) - c.Assert(err, checker.IsNil, check.Commentf(string(data))) - c.Assert(status, checker.Equals, http.StatusCreated, check.Commentf(string(data))) - - var resp createResp - err = json.Unmarshal(data, &resp) - c.Assert(err, checker.IsNil, check.Commentf(string(data))) - id := resp.ID - - var mps []types.MountPoint - err = json.NewDecoder(strings.NewReader(inspectFieldJSON(c, id, "Mounts"))).Decode(&mps) - c.Assert(err, checker.IsNil) - c.Assert(mps, checker.HasLen, 1) - c.Assert(mps[0].Destination, checker.Equals, x.expected.Destination) - - if len(x.expected.Source) > 0 { - c.Assert(mps[0].Source, checker.Equals, x.expected.Source) - } - if len(x.expected.Name) > 0 { - c.Assert(mps[0].Name, checker.Equals, x.expected.Name) - } - if len(x.expected.Driver) > 0 { - c.Assert(mps[0].Driver, checker.Equals, x.expected.Driver) - } - c.Assert(mps[0].RW, checker.Equals, x.expected.RW) - c.Assert(mps[0].Type, checker.Equals, x.expected.Type) - c.Assert(mps[0].Mode, checker.Equals, x.expected.Mode) - if len(x.expected.Propagation) > 0 { - c.Assert(mps[0].Propagation, checker.Equals, x.expected.Propagation) - } - - out, _, err := dockerCmdWithError("start", "-a", id) - if (x.cfg.Type != "volume" || (x.cfg.VolumeOptions != nil && x.cfg.VolumeOptions.NoCopy)) && daemonPlatform != "windows" { - c.Assert(err, checker.NotNil, check.Commentf("%s\n%v", out, mps[0])) - } else { - c.Assert(err, checker.IsNil, check.Commentf("%s\n%v", out, mps[0])) - } - - dockerCmd(c, "rm", "-fv", id) - if x.cfg.Type == "volume" && len(x.cfg.Source) > 0 { - // This should still exist even though we removed the container - dockerCmd(c, "volume", "inspect", mps[0].Name) - } else { - // This should be removed automatically when we removed the container - out, _, err := dockerCmdWithError("volume", "inspect", mps[0].Name) - c.Assert(err, checker.NotNil, check.Commentf(out)) - } - } -} - -func (s *DockerSuite) TestContainersAPICreateMountsTmpfs(c *check.C) { - testRequires(c, DaemonIsLinux) - type testCase struct { - cfg map[string]interface{} - expectedOptions []string - } - target := "/foo" - cases := []testCase{ - { - cfg: map[string]interface{}{ - "Type": "tmpfs", - "Target": target}, - expectedOptions: []string{"rw", "nosuid", "nodev", "noexec", "relatime"}, - }, - { - cfg: map[string]interface{}{ - "Type": "tmpfs", - "Target": target, - "TmpfsOptions": map[string]interface{}{ - "SizeBytes": 4096 * 1024, "Mode": 0700}}, - expectedOptions: []string{"rw", "nosuid", "nodev", "noexec", "relatime", "size=4096k", "mode=700"}, - }, - } - - for i, x := range cases { - cName := fmt.Sprintf("test-tmpfs-%d", i) - data := map[string]interface{}{ - "Image": "busybox", - "Cmd": []string{"/bin/sh", "-c", - fmt.Sprintf("mount | grep 'tmpfs on %s'", target)}, - "HostConfig": map[string]interface{}{"Mounts": []map[string]interface{}{x.cfg}}, - } - status, resp, err := sockRequest("POST", "/containers/create?name="+cName, data) - c.Assert(err, checker.IsNil, check.Commentf(string(resp))) - c.Assert(status, checker.Equals, http.StatusCreated, check.Commentf(string(resp))) - out, _ := dockerCmd(c, "start", "-a", cName) - for _, option := range x.expectedOptions { - c.Assert(out, checker.Contains, option) - } - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_create_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_create_test.go deleted file mode 100644 index 41011c315..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_create_test.go +++ /dev/null @@ -1,84 +0,0 @@ -package main - -import ( - "net/http" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestAPICreateWithNotExistImage(c *check.C) { - name := "test" - config := map[string]interface{}{ - "Image": "test456:v1", - "Volumes": map[string]struct{}{"/tmp": {}}, - } - - status, body, err := sockRequest("POST", "/containers/create?name="+name, config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusNotFound) - expected := "No such image: test456:v1" - c.Assert(getErrorMessage(c, body), checker.Contains, expected) - - config2 := map[string]interface{}{ - "Image": "test456", - "Volumes": map[string]struct{}{"/tmp": {}}, - } - - status, body, err = sockRequest("POST", "/containers/create?name="+name, config2) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusNotFound) - expected = "No such image: test456:latest" - c.Assert(getErrorMessage(c, body), checker.Equals, expected) - - config3 := map[string]interface{}{ - "Image": "sha256:0cb40641836c461bc97c793971d84d758371ed682042457523e4ae701efeaaaa", - } - - status, body, err = sockRequest("POST", "/containers/create?name="+name, config3) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusNotFound) - expected = "No such image: sha256:0cb40641836c461bc97c793971d84d758371ed682042457523e4ae701efeaaaa" - c.Assert(getErrorMessage(c, body), checker.Equals, expected) - -} - -// Test for #25099 -func (s *DockerSuite) TestAPICreateEmptyEnv(c *check.C) { - name := "test1" - config := map[string]interface{}{ - "Image": "busybox", - "Env": []string{"", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}, - "Cmd": []string{"true"}, - } - - status, body, err := sockRequest("POST", "/containers/create?name="+name, config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusInternalServerError) - expected := "invalid environment variable:" - c.Assert(getErrorMessage(c, body), checker.Contains, expected) - - name = "test2" - config = map[string]interface{}{ - "Image": "busybox", - "Env": []string{"=", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}, - "Cmd": []string{"true"}, - } - status, body, err = sockRequest("POST", "/containers/create?name="+name, config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusInternalServerError) - expected = "invalid environment variable: =" - c.Assert(getErrorMessage(c, body), checker.Contains, expected) - - name = "test3" - config = map[string]interface{}{ - "Image": "busybox", - "Env": []string{"=foo", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}, - "Cmd": []string{"true"}, - } - status, body, err = sockRequest("POST", "/containers/create?name="+name, config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusInternalServerError) - expected = "invalid environment variable: =foo" - c.Assert(getErrorMessage(c, body), checker.Contains, expected) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_events_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_events_test.go deleted file mode 100644 index 3891c8737..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_events_test.go +++ /dev/null @@ -1,73 +0,0 @@ -package main - -import ( - "encoding/json" - "io" - "net/http" - "net/url" - "strconv" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/jsonmessage" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestEventsAPIEmptyOutput(c *check.C) { - type apiResp struct { - resp *http.Response - err error - } - chResp := make(chan *apiResp) - go func() { - resp, body, err := sockRequestRaw("GET", "/events", nil, "") - body.Close() - chResp <- &apiResp{resp, err} - }() - - select { - case r := <-chResp: - c.Assert(r.err, checker.IsNil) - c.Assert(r.resp.StatusCode, checker.Equals, http.StatusOK) - case <-time.After(3 * time.Second): - c.Fatal("timeout waiting for events api to respond, should have responded immediately") - } -} - -func (s *DockerSuite) TestEventsAPIBackwardsCompatible(c *check.C) { - since := daemonTime(c).Unix() - ts := strconv.FormatInt(since, 10) - - out, _ := runSleepingContainer(c, "--name=foo", "-d") - containerID := strings.TrimSpace(out) - c.Assert(waitRun(containerID), checker.IsNil) - - q := url.Values{} - q.Set("since", ts) - - _, body, err := sockRequestRaw("GET", "/events?"+q.Encode(), nil, "") - c.Assert(err, checker.IsNil) - defer body.Close() - - dec := json.NewDecoder(body) - var containerCreateEvent *jsonmessage.JSONMessage - for { - var event jsonmessage.JSONMessage - if err := dec.Decode(&event); err != nil { - if err == io.EOF { - break - } - c.Fatal(err) - } - if event.Status == "create" && event.ID == containerID { - containerCreateEvent = &event - break - } - } - - c.Assert(containerCreateEvent, checker.Not(checker.IsNil)) - c.Assert(containerCreateEvent.Status, checker.Equals, "create") - c.Assert(containerCreateEvent.ID, checker.Equals, containerID) - c.Assert(containerCreateEvent.From, checker.Equals, "busybox") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_exec_resize_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_exec_resize_test.go deleted file mode 100644 index cf4dded48..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_exec_resize_test.go +++ /dev/null @@ -1,103 +0,0 @@ -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - "sync" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestExecResizeAPIHeightWidthNoInt(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - cleanedContainerID := strings.TrimSpace(out) - - endpoint := "/exec/" + cleanedContainerID + "/resize?h=foo&w=bar" - status, _, err := sockRequest("POST", endpoint, nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError) -} - -// Part of #14845 -func (s *DockerSuite) TestExecResizeImmediatelyAfterExecStart(c *check.C) { - name := "exec_resize_test" - dockerCmd(c, "run", "-d", "-i", "-t", "--name", name, "--restart", "always", "busybox", "/bin/sh") - - testExecResize := func() error { - data := map[string]interface{}{ - "AttachStdin": true, - "Cmd": []string{"/bin/sh"}, - } - uri := fmt.Sprintf("/containers/%s/exec", name) - status, body, err := sockRequest("POST", uri, data) - if err != nil { - return err - } - if status != http.StatusCreated { - return fmt.Errorf("POST %s is expected to return %d, got %d", uri, http.StatusCreated, status) - } - - out := map[string]string{} - err = json.Unmarshal(body, &out) - if err != nil { - return fmt.Errorf("ExecCreate returned invalid json. Error: %q", err.Error()) - } - - execID := out["Id"] - if len(execID) < 1 { - return fmt.Errorf("ExecCreate got invalid execID") - } - - payload := bytes.NewBufferString(`{"Tty":true}`) - conn, _, err := sockRequestHijack("POST", fmt.Sprintf("/exec/%s/start", execID), payload, "application/json") - if err != nil { - return fmt.Errorf("Failed to start the exec: %q", err.Error()) - } - defer conn.Close() - - _, rc, err := sockRequestRaw("POST", fmt.Sprintf("/exec/%s/resize?h=24&w=80", execID), nil, "text/plain") - // It's probably a panic of the daemon if io.ErrUnexpectedEOF is returned. - if err == io.ErrUnexpectedEOF { - return fmt.Errorf("The daemon might have crashed.") - } - - if err == nil { - rc.Close() - } - - // We only interested in the io.ErrUnexpectedEOF error, so we return nil otherwise. - return nil - } - - // The panic happens when daemon.ContainerExecStart is called but the - // container.Exec is not called. - // Because the panic is not 100% reproducible, we send the requests concurrently - // to increase the probability that the problem is triggered. - var ( - n = 10 - ch = make(chan error, n) - wg sync.WaitGroup - ) - for i := 0; i < n; i++ { - wg.Add(1) - go func() { - defer wg.Done() - if err := testExecResize(); err != nil { - ch <- err - } - }() - } - - wg.Wait() - select { - case err := <-ch: - c.Fatal(err.Error()) - default: - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_exec_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_exec_test.go deleted file mode 100644 index 716e9ac68..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_exec_test.go +++ /dev/null @@ -1,198 +0,0 @@ -// +build !test_no_exec - -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "net/http" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// Regression test for #9414 -func (s *DockerSuite) TestExecAPICreateNoCmd(c *check.C) { - name := "exec_test" - dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "/bin/sh") - - status, body, err := sockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": nil}) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError) - - comment := check.Commentf("Expected message when creating exec command with no Cmd specified") - c.Assert(getErrorMessage(c, body), checker.Contains, "No exec command specified", comment) -} - -func (s *DockerSuite) TestExecAPICreateNoValidContentType(c *check.C) { - name := "exec_test" - dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "/bin/sh") - - jsonData := bytes.NewBuffer(nil) - if err := json.NewEncoder(jsonData).Encode(map[string]interface{}{"Cmd": nil}); err != nil { - c.Fatalf("Can not encode data to json %s", err) - } - - res, body, err := sockRequestRaw("POST", fmt.Sprintf("/containers/%s/exec", name), jsonData, "text/plain") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - - b, err := readBody(body) - c.Assert(err, checker.IsNil) - - comment := check.Commentf("Expected message when creating exec command with invalid Content-Type specified") - c.Assert(getErrorMessage(c, b), checker.Contains, "Content-Type specified", comment) -} - -func (s *DockerSuite) TestExecAPICreateContainerPaused(c *check.C) { - // Not relevant on Windows as Windows containers cannot be paused - testRequires(c, DaemonIsLinux) - name := "exec_create_test" - dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "/bin/sh") - - dockerCmd(c, "pause", name) - status, body, err := sockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": []string{"true"}}) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusConflict) - - comment := check.Commentf("Expected message when creating exec command with Container %s is paused", name) - c.Assert(getErrorMessage(c, body), checker.Contains, "Container "+name+" is paused, unpause the container before exec", comment) -} - -func (s *DockerSuite) TestExecAPIStart(c *check.C) { - testRequires(c, DaemonIsLinux) // Uses pause/unpause but bits may be salvagable to Windows to Windows CI - dockerCmd(c, "run", "-d", "--name", "test", "busybox", "top") - - id := createExec(c, "test") - startExec(c, id, http.StatusOK) - - var execJSON struct{ PID int } - inspectExec(c, id, &execJSON) - c.Assert(execJSON.PID, checker.GreaterThan, 1) - - id = createExec(c, "test") - dockerCmd(c, "stop", "test") - - startExec(c, id, http.StatusNotFound) - - dockerCmd(c, "start", "test") - startExec(c, id, http.StatusNotFound) - - // make sure exec is created before pausing - id = createExec(c, "test") - dockerCmd(c, "pause", "test") - startExec(c, id, http.StatusConflict) - dockerCmd(c, "unpause", "test") - startExec(c, id, http.StatusOK) -} - -func (s *DockerSuite) TestExecAPIStartEnsureHeaders(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--name", "test", "busybox", "top") - - id := createExec(c, "test") - resp, _, err := sockRequestRaw("POST", fmt.Sprintf("/exec/%s/start", id), strings.NewReader(`{"Detach": true}`), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(resp.Header.Get("Server"), checker.Not(checker.Equals), "") -} - -func (s *DockerSuite) TestExecAPIStartBackwardsCompatible(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows only supports 1.25 or later - runSleepingContainer(c, "-d", "--name", "test") - id := createExec(c, "test") - - resp, body, err := sockRequestRaw("POST", fmt.Sprintf("/v1.20/exec/%s/start", id), strings.NewReader(`{"Detach": true}`), "text/plain") - c.Assert(err, checker.IsNil) - - b, err := readBody(body) - comment := check.Commentf("response body: %s", b) - c.Assert(err, checker.IsNil, comment) - c.Assert(resp.StatusCode, checker.Equals, http.StatusOK, comment) -} - -// #19362 -func (s *DockerSuite) TestExecAPIStartMultipleTimesError(c *check.C) { - runSleepingContainer(c, "-d", "--name", "test") - execID := createExec(c, "test") - startExec(c, execID, http.StatusOK) - - timeout := time.After(60 * time.Second) - var execJSON struct{ Running bool } - for { - select { - case <-timeout: - c.Fatal("timeout waiting for exec to start") - default: - } - - inspectExec(c, execID, &execJSON) - if !execJSON.Running { - break - } - } - - startExec(c, execID, http.StatusConflict) -} - -// #20638 -func (s *DockerSuite) TestExecAPIStartWithDetach(c *check.C) { - name := "foo" - runSleepingContainer(c, "-d", "-t", "--name", name) - data := map[string]interface{}{ - "cmd": []string{"true"}, - "AttachStdin": true, - } - _, b, err := sockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), data) - c.Assert(err, checker.IsNil, check.Commentf(string(b))) - - createResp := struct { - ID string `json:"Id"` - }{} - c.Assert(json.Unmarshal(b, &createResp), checker.IsNil, check.Commentf(string(b))) - - _, body, err := sockRequestRaw("POST", fmt.Sprintf("/exec/%s/start", createResp.ID), strings.NewReader(`{"Detach": true}`), "application/json") - c.Assert(err, checker.IsNil) - - b, err = readBody(body) - comment := check.Commentf("response body: %s", b) - c.Assert(err, checker.IsNil, comment) - - resp, _, err := sockRequestRaw("GET", "/_ping", nil, "") - c.Assert(err, checker.IsNil) - if resp.StatusCode != http.StatusOK { - c.Fatal("daemon is down, it should alive") - } -} - -func createExec(c *check.C, name string) string { - _, b, err := sockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": []string{"true"}}) - c.Assert(err, checker.IsNil, check.Commentf(string(b))) - - createResp := struct { - ID string `json:"Id"` - }{} - c.Assert(json.Unmarshal(b, &createResp), checker.IsNil, check.Commentf(string(b))) - return createResp.ID -} - -func startExec(c *check.C, id string, code int) { - resp, body, err := sockRequestRaw("POST", fmt.Sprintf("/exec/%s/start", id), strings.NewReader(`{"Detach": true}`), "application/json") - c.Assert(err, checker.IsNil) - - b, err := readBody(body) - comment := check.Commentf("response body: %s", b) - c.Assert(err, checker.IsNil, comment) - c.Assert(resp.StatusCode, checker.Equals, code, comment) -} - -func inspectExec(c *check.C, id string, out interface{}) { - resp, body, err := sockRequestRaw("GET", fmt.Sprintf("/exec/%s/json", id), nil, "") - c.Assert(err, checker.IsNil) - defer body.Close() - c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) - err = json.NewDecoder(body).Decode(out) - c.Assert(err, checker.IsNil) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_images_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_images_test.go deleted file mode 100644 index b7617eae2..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_images_test.go +++ /dev/null @@ -1,165 +0,0 @@ -package main - -import ( - "encoding/json" - "net/http" - "net/url" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestAPIImagesFilter(c *check.C) { - name := "utest:tag1" - name2 := "utest/docker:tag2" - name3 := "utest:5000/docker:tag3" - for _, n := range []string{name, name2, name3} { - dockerCmd(c, "tag", "busybox", n) - } - type image types.ImageSummary - getImages := func(filter string) []image { - v := url.Values{} - v.Set("filter", filter) - status, b, err := sockRequest("GET", "/images/json?"+v.Encode(), nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - var images []image - err = json.Unmarshal(b, &images) - c.Assert(err, checker.IsNil) - - return images - } - - //incorrect number of matches returned - images := getImages("utest*/*") - c.Assert(images[0].RepoTags, checker.HasLen, 2) - - images = getImages("utest") - c.Assert(images[0].RepoTags, checker.HasLen, 1) - - images = getImages("utest*") - c.Assert(images[0].RepoTags, checker.HasLen, 1) - - images = getImages("*5000*/*") - c.Assert(images[0].RepoTags, checker.HasLen, 1) -} - -func (s *DockerSuite) TestAPIImagesSaveAndLoad(c *check.C) { - // TODO Windows to Windows CI: Investigate further why this test fails. - testRequires(c, Network) - testRequires(c, DaemonIsLinux) - out, err := buildImage("saveandload", "FROM busybox\nENV FOO bar", false) - c.Assert(err, checker.IsNil) - id := strings.TrimSpace(out) - - res, body, err := sockRequestRaw("GET", "/images/"+id+"/get", nil, "") - c.Assert(err, checker.IsNil) - defer body.Close() - c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - - dockerCmd(c, "rmi", id) - - res, loadBody, err := sockRequestRaw("POST", "/images/load", body, "application/x-tar") - c.Assert(err, checker.IsNil) - defer loadBody.Close() - c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - - inspectOut := inspectField(c, id, "Id") - c.Assert(strings.TrimSpace(string(inspectOut)), checker.Equals, id, check.Commentf("load did not work properly")) -} - -func (s *DockerSuite) TestAPIImagesDelete(c *check.C) { - if daemonPlatform != "windows" { - testRequires(c, Network) - } - name := "test-api-images-delete" - out, err := buildImage(name, "FROM busybox\nENV FOO bar", false) - c.Assert(err, checker.IsNil) - id := strings.TrimSpace(out) - - dockerCmd(c, "tag", name, "test:tag1") - - status, _, err := sockRequest("DELETE", "/images/"+id, nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusConflict) - - status, _, err = sockRequest("DELETE", "/images/test:noexist", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNotFound) //Status Codes:404 – no such image - - status, _, err = sockRequest("DELETE", "/images/test:tag1", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) -} - -func (s *DockerSuite) TestAPIImagesHistory(c *check.C) { - if daemonPlatform != "windows" { - testRequires(c, Network) - } - name := "test-api-images-history" - out, err := buildImage(name, "FROM busybox\nENV FOO bar", false) - c.Assert(err, checker.IsNil) - - id := strings.TrimSpace(out) - - status, body, err := sockRequest("GET", "/images/"+id+"/history", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - var historydata []types.ImageHistory - err = json.Unmarshal(body, &historydata) - c.Assert(err, checker.IsNil, check.Commentf("Error on unmarshal")) - - c.Assert(historydata, checker.Not(checker.HasLen), 0) - c.Assert(historydata[0].Tags[0], checker.Equals, "test-api-images-history:latest") -} - -// #14846 -func (s *DockerSuite) TestAPIImagesSearchJSONContentType(c *check.C) { - testRequires(c, Network) - - res, b, err := sockRequestRaw("GET", "/images/search?term=test", nil, "application/json") - c.Assert(err, check.IsNil) - b.Close() - c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - c.Assert(res.Header.Get("Content-Type"), checker.Equals, "application/json") -} - -// Test case for 30027: image size reported as -1 in v1.12 client against v1.13 daemon. -// This test checks to make sure both v1.12 and v1.13 client against v1.13 daemon get correct `Size` after the fix. -func (s *DockerSuite) TestAPIImagesSizeCompatibility(c *check.C) { - status, b, err := sockRequest("GET", "/images/json", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - var images []types.ImageSummary - err = json.Unmarshal(b, &images) - c.Assert(err, checker.IsNil) - c.Assert(len(images), checker.Not(checker.Equals), 0) - for _, image := range images { - c.Assert(image.Size, checker.Not(checker.Equals), int64(-1)) - } - - type v124Image struct { - ID string `json:"Id"` - ParentID string `json:"ParentId"` - RepoTags []string - RepoDigests []string - Created int64 - Size int64 - VirtualSize int64 - Labels map[string]string - } - status, b, err = sockRequest("GET", "/v1.24/images/json", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - var v124Images []v124Image - err = json.Unmarshal(b, &v124Images) - c.Assert(err, checker.IsNil) - c.Assert(len(v124Images), checker.Not(checker.Equals), 0) - for _, image := range v124Images { - c.Assert(image.Size, checker.Not(checker.Equals), int64(-1)) - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_info_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_info_test.go deleted file mode 100644 index 155609973..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_info_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package main - -import ( - "net/http" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestInfoAPI(c *check.C) { - endpoint := "/info" - - status, body, err := sockRequest("GET", endpoint, nil) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(err, checker.IsNil) - - // always shown fields - stringsToCheck := []string{ - "ID", - "Containers", - "ContainersRunning", - "ContainersPaused", - "ContainersStopped", - "Images", - "LoggingDriver", - "OperatingSystem", - "NCPU", - "OSType", - "Architecture", - "MemTotal", - "KernelVersion", - "Driver", - "ServerVersion", - "SecurityOptions"} - - out := string(body) - for _, linePrefix := range stringsToCheck { - c.Assert(out, checker.Contains, linePrefix) - } -} - -func (s *DockerSuite) TestInfoAPIVersioned(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows only supports 1.25 or later - endpoint := "/v1.20/info" - - status, body, err := sockRequest("GET", endpoint, nil) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(err, checker.IsNil) - - out := string(body) - c.Assert(out, checker.Contains, "ExecutionDriver") - c.Assert(out, checker.Contains, "not supported") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_test.go deleted file mode 100644 index 546b224c9..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_test.go +++ /dev/null @@ -1,183 +0,0 @@ -package main - -import ( - "encoding/json" - "net/http" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/versions/v1p20" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/stringutils" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestInspectAPIContainerResponse(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - - cleanedContainerID := strings.TrimSpace(out) - keysBase := []string{"Id", "State", "Created", "Path", "Args", "Config", "Image", "NetworkSettings", - "ResolvConfPath", "HostnamePath", "HostsPath", "LogPath", "Name", "Driver", "MountLabel", "ProcessLabel", "GraphDriver"} - - type acase struct { - version string - keys []string - } - - var cases []acase - - if daemonPlatform == "windows" { - cases = []acase{ - {"v1.25", append(keysBase, "Mounts")}, - } - - } else { - cases = []acase{ - {"v1.20", append(keysBase, "Mounts")}, - {"v1.19", append(keysBase, "Volumes", "VolumesRW")}, - } - } - - for _, cs := range cases { - body := getInspectBody(c, cs.version, cleanedContainerID) - - var inspectJSON map[string]interface{} - err := json.Unmarshal(body, &inspectJSON) - c.Assert(err, checker.IsNil, check.Commentf("Unable to unmarshal body for version %s", cs.version)) - - for _, key := range cs.keys { - _, ok := inspectJSON[key] - c.Check(ok, checker.True, check.Commentf("%s does not exist in response for version %s", key, cs.version)) - } - - //Issue #6830: type not properly converted to JSON/back - _, ok := inspectJSON["Path"].(bool) - c.Assert(ok, checker.False, check.Commentf("Path of `true` should not be converted to boolean `true` via JSON marshalling")) - } -} - -func (s *DockerSuite) TestInspectAPIContainerVolumeDriverLegacy(c *check.C) { - // No legacy implications for Windows - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - - cleanedContainerID := strings.TrimSpace(out) - - cases := []string{"v1.19", "v1.20"} - for _, version := range cases { - body := getInspectBody(c, version, cleanedContainerID) - - var inspectJSON map[string]interface{} - err := json.Unmarshal(body, &inspectJSON) - c.Assert(err, checker.IsNil, check.Commentf("Unable to unmarshal body for version %s", version)) - - config, ok := inspectJSON["Config"] - c.Assert(ok, checker.True, check.Commentf("Unable to find 'Config'")) - cfg := config.(map[string]interface{}) - _, ok = cfg["VolumeDriver"] - c.Assert(ok, checker.True, check.Commentf("API version %s expected to include VolumeDriver in 'Config'", version)) - } -} - -func (s *DockerSuite) TestInspectAPIContainerVolumeDriver(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "--volume-driver", "local", "busybox", "true") - - cleanedContainerID := strings.TrimSpace(out) - - body := getInspectBody(c, "v1.25", cleanedContainerID) - - var inspectJSON map[string]interface{} - err := json.Unmarshal(body, &inspectJSON) - c.Assert(err, checker.IsNil, check.Commentf("Unable to unmarshal body for version 1.25")) - - config, ok := inspectJSON["Config"] - c.Assert(ok, checker.True, check.Commentf("Unable to find 'Config'")) - cfg := config.(map[string]interface{}) - _, ok = cfg["VolumeDriver"] - c.Assert(ok, checker.False, check.Commentf("API version 1.25 expected to not include VolumeDriver in 'Config'")) - - config, ok = inspectJSON["HostConfig"] - c.Assert(ok, checker.True, check.Commentf("Unable to find 'HostConfig'")) - cfg = config.(map[string]interface{}) - _, ok = cfg["VolumeDriver"] - c.Assert(ok, checker.True, check.Commentf("API version 1.25 expected to include VolumeDriver in 'HostConfig'")) -} - -func (s *DockerSuite) TestInspectAPIImageResponse(c *check.C) { - dockerCmd(c, "tag", "busybox:latest", "busybox:mytag") - - endpoint := "/images/busybox/json" - status, body, err := sockRequest("GET", endpoint, nil) - - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - var imageJSON types.ImageInspect - err = json.Unmarshal(body, &imageJSON) - c.Assert(err, checker.IsNil, check.Commentf("Unable to unmarshal body for latest version")) - c.Assert(imageJSON.RepoTags, checker.HasLen, 2) - - c.Assert(stringutils.InSlice(imageJSON.RepoTags, "busybox:latest"), checker.Equals, true) - c.Assert(stringutils.InSlice(imageJSON.RepoTags, "busybox:mytag"), checker.Equals, true) -} - -// #17131, #17139, #17173 -func (s *DockerSuite) TestInspectAPIEmptyFieldsInConfigPre121(c *check.C) { - // Not relevant on Windows - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - - cleanedContainerID := strings.TrimSpace(out) - - cases := []string{"v1.19", "v1.20"} - for _, version := range cases { - body := getInspectBody(c, version, cleanedContainerID) - - var inspectJSON map[string]interface{} - err := json.Unmarshal(body, &inspectJSON) - c.Assert(err, checker.IsNil, check.Commentf("Unable to unmarshal body for version %s", version)) - config, ok := inspectJSON["Config"] - c.Assert(ok, checker.True, check.Commentf("Unable to find 'Config'")) - cfg := config.(map[string]interface{}) - for _, f := range []string{"MacAddress", "NetworkDisabled", "ExposedPorts"} { - _, ok := cfg[f] - c.Check(ok, checker.True, check.Commentf("API version %s expected to include %s in 'Config'", version, f)) - } - } -} - -func (s *DockerSuite) TestInspectAPIBridgeNetworkSettings120(c *check.C) { - // Not relevant on Windows, and besides it doesn't have any bridge network settings - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - containerID := strings.TrimSpace(out) - waitRun(containerID) - - body := getInspectBody(c, "v1.20", containerID) - - var inspectJSON v1p20.ContainerJSON - err := json.Unmarshal(body, &inspectJSON) - c.Assert(err, checker.IsNil) - - settings := inspectJSON.NetworkSettings - c.Assert(settings.IPAddress, checker.Not(checker.HasLen), 0) -} - -func (s *DockerSuite) TestInspectAPIBridgeNetworkSettings121(c *check.C) { - // Windows doesn't have any bridge network settings - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - containerID := strings.TrimSpace(out) - waitRun(containerID) - - body := getInspectBody(c, "v1.21", containerID) - - var inspectJSON types.ContainerJSON - err := json.Unmarshal(body, &inspectJSON) - c.Assert(err, checker.IsNil) - - settings := inspectJSON.NetworkSettings - c.Assert(settings.IPAddress, checker.Not(checker.HasLen), 0) - c.Assert(settings.Networks["bridge"], checker.Not(checker.IsNil)) - c.Assert(settings.IPAddress, checker.Equals, settings.Networks["bridge"].IPAddress) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_unix_test.go deleted file mode 100644 index f49a139c2..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_unix_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - "fmt" - "net/http" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// #16665 -func (s *DockerSuite) TestInspectAPICpusetInConfigPre120(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, cgroupCpuset) - - name := "cpusetinconfig-pre120" - dockerCmd(c, "run", "--name", name, "--cpuset-cpus", "0", "busybox", "true") - - status, body, err := sockRequest("GET", fmt.Sprintf("/v1.19/containers/%s/json", name), nil) - c.Assert(status, check.Equals, http.StatusOK) - c.Assert(err, check.IsNil) - - var inspectJSON map[string]interface{} - err = json.Unmarshal(body, &inspectJSON) - c.Assert(err, checker.IsNil, check.Commentf("unable to unmarshal body for version 1.19")) - - config, ok := inspectJSON["Config"] - c.Assert(ok, checker.True, check.Commentf("Unable to find 'Config'")) - cfg := config.(map[string]interface{}) - _, ok = cfg["Cpuset"] - c.Assert(ok, checker.True, check.Commentf("API version 1.19 expected to include Cpuset in 'Config'")) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_logs_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_logs_test.go deleted file mode 100644 index 2e8ffa9bd..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_logs_test.go +++ /dev/null @@ -1,87 +0,0 @@ -package main - -import ( - "bufio" - "bytes" - "fmt" - "net/http" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestLogsAPIWithStdout(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "-t", "busybox", "/bin/sh", "-c", "while true; do echo hello; sleep 1; done") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - type logOut struct { - out string - res *http.Response - err error - } - chLog := make(chan logOut) - - go func() { - res, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/logs?follow=1&stdout=1×tamps=1", id), nil, "") - if err != nil { - chLog <- logOut{"", nil, err} - return - } - defer body.Close() - out, err := bufio.NewReader(body).ReadString('\n') - if err != nil { - chLog <- logOut{"", nil, err} - return - } - chLog <- logOut{strings.TrimSpace(out), res, err} - }() - - select { - case l := <-chLog: - c.Assert(l.err, checker.IsNil) - c.Assert(l.res.StatusCode, checker.Equals, http.StatusOK) - if !strings.HasSuffix(l.out, "hello") { - c.Fatalf("expected log output to container 'hello', but it does not") - } - case <-time.After(20 * time.Second): - c.Fatal("timeout waiting for logs to exit") - } -} - -func (s *DockerSuite) TestLogsAPINoStdoutNorStderr(c *check.C) { - name := "logs_test" - dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "/bin/sh") - - status, body, err := sockRequest("GET", fmt.Sprintf("/containers/%s/logs", name), nil) - c.Assert(status, checker.Equals, http.StatusBadRequest) - c.Assert(err, checker.IsNil) - - expected := "Bad parameters: you must choose at least one stream" - c.Assert(getErrorMessage(c, body), checker.Contains, expected) -} - -// Regression test for #12704 -func (s *DockerSuite) TestLogsAPIFollowEmptyOutput(c *check.C) { - name := "logs_test" - t0 := time.Now() - dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "sleep", "10") - - _, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/logs?follow=1&stdout=1&stderr=1&tail=all", name), bytes.NewBuffer(nil), "") - t1 := time.Now() - c.Assert(err, checker.IsNil) - body.Close() - elapsed := t1.Sub(t0).Seconds() - if elapsed > 20.0 { - c.Fatalf("HTTP response was not immediate (elapsed %.1fs)", elapsed) - } -} - -func (s *DockerSuite) TestLogsAPIContainerNotFound(c *check.C) { - name := "nonExistentContainer" - resp, _, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/logs?follow=1&stdout=1&stderr=1&tail=all", name), bytes.NewBuffer(nil), "") - c.Assert(err, checker.IsNil) - c.Assert(resp.StatusCode, checker.Equals, http.StatusNotFound) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_network_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_network_test.go deleted file mode 100644 index 1cc66f090..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_network_test.go +++ /dev/null @@ -1,353 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "net" - "net/http" - "net/url" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/network" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestAPINetworkGetDefaults(c *check.C) { - testRequires(c, DaemonIsLinux) - // By default docker daemon creates 3 networks. check if they are present - defaults := []string{"bridge", "host", "none"} - for _, nn := range defaults { - c.Assert(isNetworkAvailable(c, nn), checker.Equals, true) - } -} - -func (s *DockerSuite) TestAPINetworkCreateDelete(c *check.C) { - testRequires(c, DaemonIsLinux) - // Create a network - name := "testnetwork" - config := types.NetworkCreateRequest{ - Name: name, - NetworkCreate: types.NetworkCreate{ - CheckDuplicate: true, - }, - } - id := createNetwork(c, config, true) - c.Assert(isNetworkAvailable(c, name), checker.Equals, true) - - // delete the network and make sure it is deleted - deleteNetwork(c, id, true) - c.Assert(isNetworkAvailable(c, name), checker.Equals, false) -} - -func (s *DockerSuite) TestAPINetworkCreateCheckDuplicate(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testcheckduplicate" - configOnCheck := types.NetworkCreateRequest{ - Name: name, - NetworkCreate: types.NetworkCreate{ - CheckDuplicate: true, - }, - } - configNotCheck := types.NetworkCreateRequest{ - Name: name, - NetworkCreate: types.NetworkCreate{ - CheckDuplicate: false, - }, - } - - // Creating a new network first - createNetwork(c, configOnCheck, true) - c.Assert(isNetworkAvailable(c, name), checker.Equals, true) - - // Creating another network with same name and CheckDuplicate must fail - createNetwork(c, configOnCheck, false) - - // Creating another network with same name and not CheckDuplicate must succeed - createNetwork(c, configNotCheck, true) -} - -func (s *DockerSuite) TestAPINetworkFilter(c *check.C) { - testRequires(c, DaemonIsLinux) - nr := getNetworkResource(c, getNetworkIDByName(c, "bridge")) - c.Assert(nr.Name, checker.Equals, "bridge") -} - -func (s *DockerSuite) TestAPINetworkInspect(c *check.C) { - testRequires(c, DaemonIsLinux) - // Inspect default bridge network - nr := getNetworkResource(c, "bridge") - c.Assert(nr.Name, checker.Equals, "bridge") - - // run a container and attach it to the default bridge network - out, _ := dockerCmd(c, "run", "-d", "--name", "test", "busybox", "top") - containerID := strings.TrimSpace(out) - containerIP := findContainerIP(c, "test", "bridge") - - // inspect default bridge network again and make sure the container is connected - nr = getNetworkResource(c, nr.ID) - c.Assert(nr.Driver, checker.Equals, "bridge") - c.Assert(nr.Scope, checker.Equals, "local") - c.Assert(nr.Internal, checker.Equals, false) - c.Assert(nr.EnableIPv6, checker.Equals, false) - c.Assert(nr.IPAM.Driver, checker.Equals, "default") - c.Assert(len(nr.Containers), checker.Equals, 1) - c.Assert(nr.Containers[containerID], checker.NotNil) - - ip, _, err := net.ParseCIDR(nr.Containers[containerID].IPv4Address) - c.Assert(err, checker.IsNil) - c.Assert(ip.String(), checker.Equals, containerIP) - - // IPAM configuration inspect - ipam := &network.IPAM{ - Driver: "default", - Config: []network.IPAMConfig{{Subnet: "172.28.0.0/16", IPRange: "172.28.5.0/24", Gateway: "172.28.5.254"}}, - } - config := types.NetworkCreateRequest{ - Name: "br0", - NetworkCreate: types.NetworkCreate{ - Driver: "bridge", - IPAM: ipam, - Options: map[string]string{"foo": "bar", "opts": "dopts"}, - }, - } - id0 := createNetwork(c, config, true) - c.Assert(isNetworkAvailable(c, "br0"), checker.Equals, true) - - nr = getNetworkResource(c, id0) - c.Assert(len(nr.IPAM.Config), checker.Equals, 1) - c.Assert(nr.IPAM.Config[0].Subnet, checker.Equals, "172.28.0.0/16") - c.Assert(nr.IPAM.Config[0].IPRange, checker.Equals, "172.28.5.0/24") - c.Assert(nr.IPAM.Config[0].Gateway, checker.Equals, "172.28.5.254") - c.Assert(nr.Options["foo"], checker.Equals, "bar") - c.Assert(nr.Options["opts"], checker.Equals, "dopts") - - // delete the network and make sure it is deleted - deleteNetwork(c, id0, true) - c.Assert(isNetworkAvailable(c, "br0"), checker.Equals, false) -} - -func (s *DockerSuite) TestAPINetworkConnectDisconnect(c *check.C) { - testRequires(c, DaemonIsLinux) - // Create test network - name := "testnetwork" - config := types.NetworkCreateRequest{ - Name: name, - } - id := createNetwork(c, config, true) - nr := getNetworkResource(c, id) - c.Assert(nr.Name, checker.Equals, name) - c.Assert(nr.ID, checker.Equals, id) - c.Assert(len(nr.Containers), checker.Equals, 0) - - // run a container - out, _ := dockerCmd(c, "run", "-d", "--name", "test", "busybox", "top") - containerID := strings.TrimSpace(out) - - // connect the container to the test network - connectNetwork(c, nr.ID, containerID) - - // inspect the network to make sure container is connected - nr = getNetworkResource(c, nr.ID) - c.Assert(len(nr.Containers), checker.Equals, 1) - c.Assert(nr.Containers[containerID], checker.NotNil) - - // check if container IP matches network inspect - ip, _, err := net.ParseCIDR(nr.Containers[containerID].IPv4Address) - c.Assert(err, checker.IsNil) - containerIP := findContainerIP(c, "test", "testnetwork") - c.Assert(ip.String(), checker.Equals, containerIP) - - // disconnect container from the network - disconnectNetwork(c, nr.ID, containerID) - nr = getNetworkResource(c, nr.ID) - c.Assert(nr.Name, checker.Equals, name) - c.Assert(len(nr.Containers), checker.Equals, 0) - - // delete the network - deleteNetwork(c, nr.ID, true) -} - -func (s *DockerSuite) TestAPINetworkIPAMMultipleBridgeNetworks(c *check.C) { - testRequires(c, DaemonIsLinux) - // test0 bridge network - ipam0 := &network.IPAM{ - Driver: "default", - Config: []network.IPAMConfig{{Subnet: "192.178.0.0/16", IPRange: "192.178.128.0/17", Gateway: "192.178.138.100"}}, - } - config0 := types.NetworkCreateRequest{ - Name: "test0", - NetworkCreate: types.NetworkCreate{ - Driver: "bridge", - IPAM: ipam0, - }, - } - id0 := createNetwork(c, config0, true) - c.Assert(isNetworkAvailable(c, "test0"), checker.Equals, true) - - ipam1 := &network.IPAM{ - Driver: "default", - Config: []network.IPAMConfig{{Subnet: "192.178.128.0/17", Gateway: "192.178.128.1"}}, - } - // test1 bridge network overlaps with test0 - config1 := types.NetworkCreateRequest{ - Name: "test1", - NetworkCreate: types.NetworkCreate{ - Driver: "bridge", - IPAM: ipam1, - }, - } - createNetwork(c, config1, false) - c.Assert(isNetworkAvailable(c, "test1"), checker.Equals, false) - - ipam2 := &network.IPAM{ - Driver: "default", - Config: []network.IPAMConfig{{Subnet: "192.169.0.0/16", Gateway: "192.169.100.100"}}, - } - // test2 bridge network does not overlap - config2 := types.NetworkCreateRequest{ - Name: "test2", - NetworkCreate: types.NetworkCreate{ - Driver: "bridge", - IPAM: ipam2, - }, - } - createNetwork(c, config2, true) - c.Assert(isNetworkAvailable(c, "test2"), checker.Equals, true) - - // remove test0 and retry to create test1 - deleteNetwork(c, id0, true) - createNetwork(c, config1, true) - c.Assert(isNetworkAvailable(c, "test1"), checker.Equals, true) - - // for networks w/o ipam specified, docker will choose proper non-overlapping subnets - createNetwork(c, types.NetworkCreateRequest{Name: "test3"}, true) - c.Assert(isNetworkAvailable(c, "test3"), checker.Equals, true) - createNetwork(c, types.NetworkCreateRequest{Name: "test4"}, true) - c.Assert(isNetworkAvailable(c, "test4"), checker.Equals, true) - createNetwork(c, types.NetworkCreateRequest{Name: "test5"}, true) - c.Assert(isNetworkAvailable(c, "test5"), checker.Equals, true) - - for i := 1; i < 6; i++ { - deleteNetwork(c, fmt.Sprintf("test%d", i), true) - } -} - -func (s *DockerSuite) TestAPICreateDeletePredefinedNetworks(c *check.C) { - testRequires(c, DaemonIsLinux) - createDeletePredefinedNetwork(c, "bridge") - createDeletePredefinedNetwork(c, "none") - createDeletePredefinedNetwork(c, "host") -} - -func createDeletePredefinedNetwork(c *check.C, name string) { - // Create pre-defined network - config := types.NetworkCreateRequest{ - Name: name, - NetworkCreate: types.NetworkCreate{ - CheckDuplicate: true, - }, - } - shouldSucceed := false - createNetwork(c, config, shouldSucceed) - deleteNetwork(c, name, shouldSucceed) -} - -func isNetworkAvailable(c *check.C, name string) bool { - status, body, err := sockRequest("GET", "/networks", nil) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(err, checker.IsNil) - - nJSON := []types.NetworkResource{} - err = json.Unmarshal(body, &nJSON) - c.Assert(err, checker.IsNil) - - for _, n := range nJSON { - if n.Name == name { - return true - } - } - return false -} - -func getNetworkIDByName(c *check.C, name string) string { - var ( - v = url.Values{} - filterArgs = filters.NewArgs() - ) - filterArgs.Add("name", name) - filterJSON, err := filters.ToParam(filterArgs) - c.Assert(err, checker.IsNil) - v.Set("filters", filterJSON) - - status, body, err := sockRequest("GET", "/networks?"+v.Encode(), nil) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(err, checker.IsNil) - - nJSON := []types.NetworkResource{} - err = json.Unmarshal(body, &nJSON) - c.Assert(err, checker.IsNil) - c.Assert(len(nJSON), checker.Equals, 1) - - return nJSON[0].ID -} - -func getNetworkResource(c *check.C, id string) *types.NetworkResource { - _, obj, err := sockRequest("GET", "/networks/"+id, nil) - c.Assert(err, checker.IsNil) - - nr := types.NetworkResource{} - err = json.Unmarshal(obj, &nr) - c.Assert(err, checker.IsNil) - - return &nr -} - -func createNetwork(c *check.C, config types.NetworkCreateRequest, shouldSucceed bool) string { - status, resp, err := sockRequest("POST", "/networks/create", config) - if !shouldSucceed { - c.Assert(status, checker.Not(checker.Equals), http.StatusCreated) - return "" - } - - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - var nr types.NetworkCreateResponse - err = json.Unmarshal(resp, &nr) - c.Assert(err, checker.IsNil) - - return nr.ID -} - -func connectNetwork(c *check.C, nid, cid string) { - config := types.NetworkConnect{ - Container: cid, - } - - status, _, err := sockRequest("POST", "/networks/"+nid+"/connect", config) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(err, checker.IsNil) -} - -func disconnectNetwork(c *check.C, nid, cid string) { - config := types.NetworkConnect{ - Container: cid, - } - - status, _, err := sockRequest("POST", "/networks/"+nid+"/disconnect", config) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(err, checker.IsNil) -} - -func deleteNetwork(c *check.C, id string, shouldSucceed bool) { - status, _, err := sockRequest("DELETE", "/networks/"+id, nil) - if !shouldSucceed { - c.Assert(status, checker.Not(checker.Equals), http.StatusOK) - return - } - c.Assert(status, checker.Equals, http.StatusNoContent) - c.Assert(err, checker.IsNil) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_resize_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_resize_test.go deleted file mode 100644 index daf1b05d2..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_resize_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package main - -import ( - "net/http" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestResizeAPIResponse(c *check.C) { - out, _ := runSleepingContainer(c, "-d") - cleanedContainerID := strings.TrimSpace(out) - - endpoint := "/containers/" + cleanedContainerID + "/resize?h=40&w=40" - status, _, err := sockRequest("POST", endpoint, nil) - c.Assert(status, check.Equals, http.StatusOK) - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestResizeAPIHeightWidthNoInt(c *check.C) { - out, _ := runSleepingContainer(c, "-d") - cleanedContainerID := strings.TrimSpace(out) - - endpoint := "/containers/" + cleanedContainerID + "/resize?h=foo&w=bar" - status, _, err := sockRequest("POST", endpoint, nil) - c.Assert(status, check.Equals, http.StatusInternalServerError) - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestResizeAPIResponseWhenContainerNotStarted(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - cleanedContainerID := strings.TrimSpace(out) - - // make sure the exited container is not running - dockerCmd(c, "wait", cleanedContainerID) - - endpoint := "/containers/" + cleanedContainerID + "/resize?h=40&w=40" - status, body, err := sockRequest("POST", endpoint, nil) - c.Assert(status, check.Equals, http.StatusInternalServerError) - c.Assert(err, check.IsNil) - - c.Assert(getErrorMessage(c, body), checker.Contains, "is not running", check.Commentf("resize should fail with message 'Container is not running'")) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_service_update_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_service_update_test.go deleted file mode 100644 index 15a21e579..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_service_update_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// +build !windows - -package main - -import ( - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func setPortConfig(portConfig []swarm.PortConfig) serviceConstructor { - return func(s *swarm.Service) { - if s.Spec.EndpointSpec == nil { - s.Spec.EndpointSpec = &swarm.EndpointSpec{} - } - s.Spec.EndpointSpec.Ports = portConfig - } -} - -func (s *DockerSwarmSuite) TestAPIServiceUpdatePort(c *check.C) { - d := s.AddDaemon(c, true, true) - - // Create a service with a port mapping of 8080:8081. - portConfig := []swarm.PortConfig{{TargetPort: 8081, PublishedPort: 8080}} - serviceID := d.createService(c, simpleTestService, setInstances(1), setPortConfig(portConfig)) - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - // Update the service: changed the port mapping from 8080:8081 to 8082:8083. - updatedPortConfig := []swarm.PortConfig{{TargetPort: 8083, PublishedPort: 8082}} - remoteService := d.getService(c, serviceID) - d.updateService(c, remoteService, setPortConfig(updatedPortConfig)) - - // Inspect the service and verify port mapping. - updatedService := d.getService(c, serviceID) - c.Assert(updatedService.Spec.EndpointSpec, check.NotNil) - c.Assert(len(updatedService.Spec.EndpointSpec.Ports), check.Equals, 1) - c.Assert(updatedService.Spec.EndpointSpec.Ports[0].TargetPort, check.Equals, uint32(8083)) - c.Assert(updatedService.Spec.EndpointSpec.Ports[0].PublishedPort, check.Equals, uint32(8082)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_stats_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_stats_test.go deleted file mode 100644 index 23fbdbb74..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_stats_test.go +++ /dev/null @@ -1,310 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "net/http" - "os/exec" - "runtime" - "strconv" - "strings" - "sync" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -var expectedNetworkInterfaceStats = strings.Split("rx_bytes rx_dropped rx_errors rx_packets tx_bytes tx_dropped tx_errors tx_packets", " ") - -func (s *DockerSuite) TestAPIStatsNoStreamGetCpu(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "while true;do echo 'Hello'; usleep 100000; done") - - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - resp, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id), nil, "") - c.Assert(err, checker.IsNil) - c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) - c.Assert(resp.Header.Get("Content-Type"), checker.Equals, "application/json") - - var v *types.Stats - err = json.NewDecoder(body).Decode(&v) - c.Assert(err, checker.IsNil) - body.Close() - - var cpuPercent = 0.0 - - if daemonPlatform != "windows" { - cpuDelta := float64(v.CPUStats.CPUUsage.TotalUsage - v.PreCPUStats.CPUUsage.TotalUsage) - systemDelta := float64(v.CPUStats.SystemUsage - v.PreCPUStats.SystemUsage) - cpuPercent = (cpuDelta / systemDelta) * float64(len(v.CPUStats.CPUUsage.PercpuUsage)) * 100.0 - } else { - // Max number of 100ns intervals between the previous time read and now - possIntervals := uint64(v.Read.Sub(v.PreRead).Nanoseconds()) // Start with number of ns intervals - possIntervals /= 100 // Convert to number of 100ns intervals - possIntervals *= uint64(v.NumProcs) // Multiple by the number of processors - - // Intervals used - intervalsUsed := v.CPUStats.CPUUsage.TotalUsage - v.PreCPUStats.CPUUsage.TotalUsage - - // Percentage avoiding divide-by-zero - if possIntervals > 0 { - cpuPercent = float64(intervalsUsed) / float64(possIntervals) * 100.0 - } - } - - c.Assert(cpuPercent, check.Not(checker.Equals), 0.0, check.Commentf("docker stats with no-stream get cpu usage failed: was %v", cpuPercent)) -} - -func (s *DockerSuite) TestAPIStatsStoppedContainerInGoroutines(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "echo 1") - id := strings.TrimSpace(out) - - getGoRoutines := func() int { - _, body, err := sockRequestRaw("GET", fmt.Sprintf("/info"), nil, "") - c.Assert(err, checker.IsNil) - info := types.Info{} - err = json.NewDecoder(body).Decode(&info) - c.Assert(err, checker.IsNil) - body.Close() - return info.NGoroutines - } - - // When the HTTP connection is closed, the number of goroutines should not increase. - routines := getGoRoutines() - _, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats", id), nil, "") - c.Assert(err, checker.IsNil) - body.Close() - - t := time.After(30 * time.Second) - for { - select { - case <-t: - c.Assert(getGoRoutines(), checker.LessOrEqualThan, routines) - return - default: - if n := getGoRoutines(); n <= routines { - return - } - time.Sleep(200 * time.Millisecond) - } - } -} - -func (s *DockerSuite) TestAPIStatsNetworkStats(c *check.C) { - testRequires(c, SameHostDaemon) - - out, _ := runSleepingContainer(c) - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - // Retrieve the container address - net := "bridge" - if daemonPlatform == "windows" { - net = "nat" - } - contIP := findContainerIP(c, id, net) - numPings := 1 - - var preRxPackets uint64 - var preTxPackets uint64 - var postRxPackets uint64 - var postTxPackets uint64 - - // Get the container networking stats before and after pinging the container - nwStatsPre := getNetworkStats(c, id) - for _, v := range nwStatsPre { - preRxPackets += v.RxPackets - preTxPackets += v.TxPackets - } - - countParam := "-c" - if runtime.GOOS == "windows" { - countParam = "-n" // Ping count parameter is -n on Windows - } - pingout, err := exec.Command("ping", contIP, countParam, strconv.Itoa(numPings)).CombinedOutput() - if err != nil && runtime.GOOS == "linux" { - // If it fails then try a work-around, but just for linux. - // If this fails too then go back to the old error for reporting. - // - // The ping will sometimes fail due to an apparmor issue where it - // denies access to the libc.so.6 shared library - running it - // via /lib64/ld-linux-x86-64.so.2 seems to work around it. - pingout2, err2 := exec.Command("/lib64/ld-linux-x86-64.so.2", "/bin/ping", contIP, "-c", strconv.Itoa(numPings)).CombinedOutput() - if err2 == nil { - pingout = pingout2 - err = err2 - } - } - c.Assert(err, checker.IsNil) - pingouts := string(pingout[:]) - nwStatsPost := getNetworkStats(c, id) - for _, v := range nwStatsPost { - postRxPackets += v.RxPackets - postTxPackets += v.TxPackets - } - - // Verify the stats contain at least the expected number of packets - // On Linux, account for ARP. - expRxPkts := preRxPackets + uint64(numPings) - expTxPkts := preTxPackets + uint64(numPings) - if daemonPlatform != "windows" { - expRxPkts++ - expTxPkts++ - } - c.Assert(postTxPackets, checker.GreaterOrEqualThan, expTxPkts, - check.Commentf("Reported less TxPackets than expected. Expected >= %d. Found %d. %s", expTxPkts, postTxPackets, pingouts)) - c.Assert(postRxPackets, checker.GreaterOrEqualThan, expRxPkts, - check.Commentf("Reported less Txbytes than expected. Expected >= %d. Found %d. %s", expRxPkts, postRxPackets, pingouts)) -} - -func (s *DockerSuite) TestAPIStatsNetworkStatsVersioning(c *check.C) { - // Windows doesn't support API versions less than 1.25, so no point testing 1.17 .. 1.21 - testRequires(c, SameHostDaemon, DaemonIsLinux) - - out, _ := runSleepingContainer(c) - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - wg := sync.WaitGroup{} - - for i := 17; i <= 21; i++ { - wg.Add(1) - go func(i int) { - defer wg.Done() - apiVersion := fmt.Sprintf("v1.%d", i) - statsJSONBlob := getVersionedStats(c, id, apiVersion) - if versions.LessThan(apiVersion, "v1.21") { - c.Assert(jsonBlobHasLTv121NetworkStats(statsJSONBlob), checker.Equals, true, - check.Commentf("Stats JSON blob from API %s %#v does not look like a =v1.21 API stats structure", apiVersion, statsJSONBlob)) - } - }(i) - } - wg.Wait() -} - -func getNetworkStats(c *check.C, id string) map[string]types.NetworkStats { - var st *types.StatsJSON - - _, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id), nil, "") - c.Assert(err, checker.IsNil) - - err = json.NewDecoder(body).Decode(&st) - c.Assert(err, checker.IsNil) - body.Close() - - return st.Networks -} - -// getVersionedStats returns stats result for the -// container with id using an API call with version apiVersion. Since the -// stats result type differs between API versions, we simply return -// map[string]interface{}. -func getVersionedStats(c *check.C, id string, apiVersion string) map[string]interface{} { - stats := make(map[string]interface{}) - - _, body, err := sockRequestRaw("GET", fmt.Sprintf("/%s/containers/%s/stats?stream=false", apiVersion, id), nil, "") - c.Assert(err, checker.IsNil) - defer body.Close() - - err = json.NewDecoder(body).Decode(&stats) - c.Assert(err, checker.IsNil, check.Commentf("failed to decode stat: %s", err)) - - return stats -} - -func jsonBlobHasLTv121NetworkStats(blob map[string]interface{}) bool { - networkStatsIntfc, ok := blob["network"] - if !ok { - return false - } - networkStats, ok := networkStatsIntfc.(map[string]interface{}) - if !ok { - return false - } - for _, expectedKey := range expectedNetworkInterfaceStats { - if _, ok := networkStats[expectedKey]; !ok { - return false - } - } - return true -} - -func jsonBlobHasGTE121NetworkStats(blob map[string]interface{}) bool { - networksStatsIntfc, ok := blob["networks"] - if !ok { - return false - } - networksStats, ok := networksStatsIntfc.(map[string]interface{}) - if !ok { - return false - } - for _, networkInterfaceStatsIntfc := range networksStats { - networkInterfaceStats, ok := networkInterfaceStatsIntfc.(map[string]interface{}) - if !ok { - return false - } - for _, expectedKey := range expectedNetworkInterfaceStats { - if _, ok := networkInterfaceStats[expectedKey]; !ok { - return false - } - } - } - return true -} - -func (s *DockerSuite) TestAPIStatsContainerNotFound(c *check.C) { - testRequires(c, DaemonIsLinux) - - status, _, err := sockRequest("GET", "/containers/nonexistent/stats", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNotFound) - - status, _, err = sockRequest("GET", "/containers/nonexistent/stats?stream=0", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNotFound) -} - -func (s *DockerSuite) TestAPIStatsNoStreamConnectedContainers(c *check.C) { - testRequires(c, DaemonIsLinux) - - out1, _ := runSleepingContainer(c) - id1 := strings.TrimSpace(out1) - c.Assert(waitRun(id1), checker.IsNil) - - out2, _ := runSleepingContainer(c, "--net", "container:"+id1) - id2 := strings.TrimSpace(out2) - c.Assert(waitRun(id2), checker.IsNil) - - ch := make(chan error) - go func() { - resp, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id2), nil, "") - defer body.Close() - if err != nil { - ch <- err - } - if resp.StatusCode != http.StatusOK { - ch <- fmt.Errorf("Invalid StatusCode %v", resp.StatusCode) - } - if resp.Header.Get("Content-Type") != "application/json" { - ch <- fmt.Errorf("Invalid 'Content-Type' %v", resp.Header.Get("Content-Type")) - } - var v *types.Stats - if err := json.NewDecoder(body).Decode(&v); err != nil { - ch <- err - } - ch <- nil - }() - - select { - case err := <-ch: - c.Assert(err, checker.IsNil, check.Commentf("Error in stats Engine API: %v", err)) - case <-time.After(15 * time.Second): - c.Fatalf("Stats did not return after timeout") - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_stats_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_stats_unix_test.go deleted file mode 100644 index 0995ce383..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_stats_unix_test.go +++ /dev/null @@ -1,41 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - "fmt" - "net/http" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestAPIStatsContainerGetMemoryLimit(c *check.C) { - testRequires(c, DaemonIsLinux, memoryLimitSupport) - - resp, body, err := sockRequestRaw("GET", "/info", nil, "application/json") - c.Assert(err, checker.IsNil) - c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) - var info types.Info - err = json.NewDecoder(body).Decode(&info) - c.Assert(err, checker.IsNil) - body.Close() - - // don't set a memory limit, the memory limit should be system memory - conName := "foo" - dockerCmd(c, "run", "-d", "--name", conName, "busybox", "top") - c.Assert(waitRun(conName), checker.IsNil) - - resp, body, err = sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", conName), nil, "") - c.Assert(err, checker.IsNil) - c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) - c.Assert(resp.Header.Get("Content-Type"), checker.Equals, "application/json") - - var v *types.Stats - err = json.NewDecoder(body).Decode(&v) - c.Assert(err, checker.IsNil) - body.Close() - c.Assert(fmt.Sprintf("%d", v.MemoryStats.Limit), checker.Equals, fmt.Sprintf("%d", info.MemTotal)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_swarm_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_swarm_test.go deleted file mode 100644 index 1f8eaec6d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_swarm_test.go +++ /dev/null @@ -1,1367 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - "fmt" - "net/http" - "os" - "path/filepath" - "strconv" - "strings" - "sync" - "syscall" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -var defaultReconciliationTimeout = 30 * time.Second - -func (s *DockerSwarmSuite) TestAPISwarmInit(c *check.C) { - // todo: should find a better way to verify that components are running than /info - d1 := s.AddDaemon(c, true, true) - info, err := d1.info() - c.Assert(err, checker.IsNil) - c.Assert(info.ControlAvailable, checker.True) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - - d2 := s.AddDaemon(c, true, false) - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.ControlAvailable, checker.False) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - - // Leaving cluster - c.Assert(d2.Leave(false), checker.IsNil) - - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.ControlAvailable, checker.False) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - - c.Assert(d2.Join(swarm.JoinRequest{JoinToken: d1.joinTokens(c).Worker, RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil) - - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.ControlAvailable, checker.False) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - - // Current state restoring after restarts - err = d1.Stop() - c.Assert(err, checker.IsNil) - err = d2.Stop() - c.Assert(err, checker.IsNil) - - err = d1.Start() - c.Assert(err, checker.IsNil) - err = d2.Start() - c.Assert(err, checker.IsNil) - - info, err = d1.info() - c.Assert(err, checker.IsNil) - c.Assert(info.ControlAvailable, checker.True) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.ControlAvailable, checker.False) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) -} - -func (s *DockerSwarmSuite) TestAPISwarmJoinToken(c *check.C) { - d1 := s.AddDaemon(c, false, false) - c.Assert(d1.Init(swarm.InitRequest{}), checker.IsNil) - - d2 := s.AddDaemon(c, false, false) - err := d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}}) - c.Assert(err, checker.NotNil) - c.Assert(err.Error(), checker.Contains, "join token is necessary") - info, err := d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - - err = d2.Join(swarm.JoinRequest{JoinToken: "foobaz", RemoteAddrs: []string{d1.listenAddr}}) - c.Assert(err, checker.NotNil) - c.Assert(err.Error(), checker.Contains, "join token is necessary") - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - - workerToken := d1.joinTokens(c).Worker - - c.Assert(d2.Join(swarm.JoinRequest{JoinToken: workerToken, RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil) - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - c.Assert(d2.Leave(false), checker.IsNil) - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - - // change tokens - d1.rotateTokens(c) - - err = d2.Join(swarm.JoinRequest{JoinToken: workerToken, RemoteAddrs: []string{d1.listenAddr}}) - c.Assert(err, checker.NotNil) - c.Assert(err.Error(), checker.Contains, "join token is necessary") - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - - workerToken = d1.joinTokens(c).Worker - - c.Assert(d2.Join(swarm.JoinRequest{JoinToken: workerToken, RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil) - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - c.Assert(d2.Leave(false), checker.IsNil) - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - - // change spec, don't change tokens - d1.updateSwarm(c, func(s *swarm.Spec) {}) - - err = d2.Join(swarm.JoinRequest{RemoteAddrs: []string{d1.listenAddr}}) - c.Assert(err, checker.NotNil) - c.Assert(err.Error(), checker.Contains, "join token is necessary") - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - - c.Assert(d2.Join(swarm.JoinRequest{JoinToken: workerToken, RemoteAddrs: []string{d1.listenAddr}}), checker.IsNil) - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - c.Assert(d2.Leave(false), checker.IsNil) - info, err = d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) -} - -func (s *DockerSwarmSuite) TestAPISwarmCAHash(c *check.C) { - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, false, false) - splitToken := strings.Split(d1.joinTokens(c).Worker, "-") - splitToken[2] = "1kxftv4ofnc6mt30lmgipg6ngf9luhwqopfk1tz6bdmnkubg0e" - replacementToken := strings.Join(splitToken, "-") - err := d2.Join(swarm.JoinRequest{JoinToken: replacementToken, RemoteAddrs: []string{d1.listenAddr}}) - c.Assert(err, checker.NotNil) - c.Assert(err.Error(), checker.Contains, "remote CA does not match fingerprint") -} - -func (s *DockerSwarmSuite) TestAPISwarmPromoteDemote(c *check.C) { - d1 := s.AddDaemon(c, false, false) - c.Assert(d1.Init(swarm.InitRequest{}), checker.IsNil) - d2 := s.AddDaemon(c, true, false) - - info, err := d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.ControlAvailable, checker.False) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - - d1.updateNode(c, d2.NodeID, func(n *swarm.Node) { - n.Spec.Role = swarm.NodeRoleManager - }) - - waitAndAssert(c, defaultReconciliationTimeout, d2.checkControlAvailable, checker.True) - - d1.updateNode(c, d2.NodeID, func(n *swarm.Node) { - n.Spec.Role = swarm.NodeRoleWorker - }) - - waitAndAssert(c, defaultReconciliationTimeout, d2.checkControlAvailable, checker.False) - - // Demoting last node should fail - node := d1.getNode(c, d1.NodeID) - node.Spec.Role = swarm.NodeRoleWorker - url := fmt.Sprintf("/nodes/%s/update?version=%d", node.ID, node.Version.Index) - status, out, err := d1.SockRequest("POST", url, node.Spec) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError, check.Commentf("output: %q", string(out))) - c.Assert(string(out), checker.Contains, "last manager of the swarm") - info, err = d1.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - c.Assert(info.ControlAvailable, checker.True) - - // Promote already demoted node - d1.updateNode(c, d2.NodeID, func(n *swarm.Node) { - n.Spec.Role = swarm.NodeRoleManager - }) - - waitAndAssert(c, defaultReconciliationTimeout, d2.checkControlAvailable, checker.True) -} - -func (s *DockerSwarmSuite) TestAPISwarmServicesEmptyList(c *check.C) { - d := s.AddDaemon(c, true, true) - - services := d.listServices(c) - c.Assert(services, checker.NotNil) - c.Assert(len(services), checker.Equals, 0, check.Commentf("services: %#v", services)) -} - -func (s *DockerSwarmSuite) TestAPISwarmServicesCreate(c *check.C) { - d := s.AddDaemon(c, true, true) - - instances := 2 - id := d.createService(c, simpleTestService, setInstances(instances)) - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, instances) - - service := d.getService(c, id) - instances = 5 - d.updateService(c, service, setInstances(instances)) - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, instances) - - d.removeService(c, service.ID) - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 0) -} - -func (s *DockerSwarmSuite) TestAPISwarmServicesMultipleAgents(c *check.C) { - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, true, false) - d3 := s.AddDaemon(c, true, false) - - time.Sleep(1 * time.Second) // make sure all daemons are ready to accept tasks - - instances := 9 - id := d1.createService(c, simpleTestService, setInstances(instances)) - - waitAndAssert(c, defaultReconciliationTimeout, d1.checkActiveContainerCount, checker.GreaterThan, 0) - waitAndAssert(c, defaultReconciliationTimeout, d2.checkActiveContainerCount, checker.GreaterThan, 0) - waitAndAssert(c, defaultReconciliationTimeout, d3.checkActiveContainerCount, checker.GreaterThan, 0) - - waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.checkActiveContainerCount, d2.checkActiveContainerCount, d3.checkActiveContainerCount), checker.Equals, instances) - - // reconciliation on d2 node down - c.Assert(d2.Stop(), checker.IsNil) - - waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.checkActiveContainerCount, d3.checkActiveContainerCount), checker.Equals, instances) - - // test downscaling - instances = 5 - d1.updateService(c, d1.getService(c, id), setInstances(instances)) - waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.checkActiveContainerCount, d3.checkActiveContainerCount), checker.Equals, instances) - -} - -func (s *DockerSwarmSuite) TestAPISwarmServicesCreateGlobal(c *check.C) { - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, true, false) - d3 := s.AddDaemon(c, true, false) - - d1.createService(c, simpleTestService, setGlobalMode) - - waitAndAssert(c, defaultReconciliationTimeout, d1.checkActiveContainerCount, checker.Equals, 1) - waitAndAssert(c, defaultReconciliationTimeout, d2.checkActiveContainerCount, checker.Equals, 1) - waitAndAssert(c, defaultReconciliationTimeout, d3.checkActiveContainerCount, checker.Equals, 1) - - d4 := s.AddDaemon(c, true, false) - d5 := s.AddDaemon(c, true, false) - - waitAndAssert(c, defaultReconciliationTimeout, d4.checkActiveContainerCount, checker.Equals, 1) - waitAndAssert(c, defaultReconciliationTimeout, d5.checkActiveContainerCount, checker.Equals, 1) -} - -func (s *DockerSwarmSuite) TestAPISwarmServicesUpdate(c *check.C) { - const nodeCount = 3 - var daemons [nodeCount]*SwarmDaemon - for i := 0; i < nodeCount; i++ { - daemons[i] = s.AddDaemon(c, true, i == 0) - } - // wait for nodes ready - waitAndAssert(c, 5*time.Second, daemons[0].checkNodeReadyCount, checker.Equals, nodeCount) - - // service image at start - image1 := "busybox:latest" - // target image in update - image2 := "busybox:test" - - // create a different tag - for _, d := range daemons { - out, err := d.Cmd("tag", image1, image2) - c.Assert(err, checker.IsNil, check.Commentf(out)) - } - - // create service - instances := 5 - parallelism := 2 - id := daemons[0].createService(c, serviceForUpdate, setInstances(instances)) - - // wait for tasks ready - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkRunningTaskImages, checker.DeepEquals, - map[string]int{image1: instances}) - - // issue service update - service := daemons[0].getService(c, id) - daemons[0].updateService(c, service, setImage(image2)) - - // first batch - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkRunningTaskImages, checker.DeepEquals, - map[string]int{image1: instances - parallelism, image2: parallelism}) - - // 2nd batch - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkRunningTaskImages, checker.DeepEquals, - map[string]int{image1: instances - 2*parallelism, image2: 2 * parallelism}) - - // 3nd batch - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkRunningTaskImages, checker.DeepEquals, - map[string]int{image2: instances}) - - // Roll back to the previous version. This uses the CLI because - // rollback is a client-side operation. - out, err := daemons[0].Cmd("service", "update", "--rollback", id) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // first batch - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkRunningTaskImages, checker.DeepEquals, - map[string]int{image2: instances - parallelism, image1: parallelism}) - - // 2nd batch - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkRunningTaskImages, checker.DeepEquals, - map[string]int{image2: instances - 2*parallelism, image1: 2 * parallelism}) - - // 3nd batch - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkRunningTaskImages, checker.DeepEquals, - map[string]int{image1: instances}) -} - -func (s *DockerSwarmSuite) TestAPISwarmServicesFailedUpdate(c *check.C) { - const nodeCount = 3 - var daemons [nodeCount]*SwarmDaemon - for i := 0; i < nodeCount; i++ { - daemons[i] = s.AddDaemon(c, true, i == 0) - } - // wait for nodes ready - waitAndAssert(c, 5*time.Second, daemons[0].checkNodeReadyCount, checker.Equals, nodeCount) - - // service image at start - image1 := "busybox:latest" - // target image in update - image2 := "busybox:badtag" - - // create service - instances := 5 - id := daemons[0].createService(c, serviceForUpdate, setInstances(instances)) - - // wait for tasks ready - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkRunningTaskImages, checker.DeepEquals, - map[string]int{image1: instances}) - - // issue service update - service := daemons[0].getService(c, id) - daemons[0].updateService(c, service, setImage(image2), setFailureAction(swarm.UpdateFailureActionPause), setMaxFailureRatio(0.25), setParallelism(1)) - - // should update 2 tasks and then pause - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkServiceUpdateState(id), checker.Equals, swarm.UpdateStatePaused) - v, _ := daemons[0].checkServiceRunningTasks(id)(c) - c.Assert(v, checker.Equals, instances-2) - - // Roll back to the previous version. This uses the CLI because - // rollback is a client-side operation. - out, err := daemons[0].Cmd("service", "update", "--rollback", id) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkRunningTaskImages, checker.DeepEquals, - map[string]int{image1: instances}) -} - -func (s *DockerSwarmSuite) TestAPISwarmServiceConstraintRole(c *check.C) { - const nodeCount = 3 - var daemons [nodeCount]*SwarmDaemon - for i := 0; i < nodeCount; i++ { - daemons[i] = s.AddDaemon(c, true, i == 0) - } - // wait for nodes ready - waitAndAssert(c, 5*time.Second, daemons[0].checkNodeReadyCount, checker.Equals, nodeCount) - - // create service - constraints := []string{"node.role==worker"} - instances := 3 - id := daemons[0].createService(c, simpleTestService, setConstraints(constraints), setInstances(instances)) - // wait for tasks ready - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkServiceRunningTasks(id), checker.Equals, instances) - // validate tasks are running on worker nodes - tasks := daemons[0].getServiceTasks(c, id) - for _, task := range tasks { - node := daemons[0].getNode(c, task.NodeID) - c.Assert(node.Spec.Role, checker.Equals, swarm.NodeRoleWorker) - } - //remove service - daemons[0].removeService(c, id) - - // create service - constraints = []string{"node.role!=worker"} - id = daemons[0].createService(c, simpleTestService, setConstraints(constraints), setInstances(instances)) - // wait for tasks ready - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkServiceRunningTasks(id), checker.Equals, instances) - tasks = daemons[0].getServiceTasks(c, id) - // validate tasks are running on manager nodes - for _, task := range tasks { - node := daemons[0].getNode(c, task.NodeID) - c.Assert(node.Spec.Role, checker.Equals, swarm.NodeRoleManager) - } - //remove service - daemons[0].removeService(c, id) - - // create service - constraints = []string{"node.role==nosuchrole"} - id = daemons[0].createService(c, simpleTestService, setConstraints(constraints), setInstances(instances)) - // wait for tasks created - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkServiceTasks(id), checker.Equals, instances) - // let scheduler try - time.Sleep(250 * time.Millisecond) - // validate tasks are not assigned to any node - tasks = daemons[0].getServiceTasks(c, id) - for _, task := range tasks { - c.Assert(task.NodeID, checker.Equals, "") - } -} - -func (s *DockerSwarmSuite) TestAPISwarmServiceConstraintLabel(c *check.C) { - const nodeCount = 3 - var daemons [nodeCount]*SwarmDaemon - for i := 0; i < nodeCount; i++ { - daemons[i] = s.AddDaemon(c, true, i == 0) - } - // wait for nodes ready - waitAndAssert(c, 5*time.Second, daemons[0].checkNodeReadyCount, checker.Equals, nodeCount) - nodes := daemons[0].listNodes(c) - c.Assert(len(nodes), checker.Equals, nodeCount) - - // add labels to nodes - daemons[0].updateNode(c, nodes[0].ID, func(n *swarm.Node) { - n.Spec.Annotations.Labels = map[string]string{ - "security": "high", - } - }) - for i := 1; i < nodeCount; i++ { - daemons[0].updateNode(c, nodes[i].ID, func(n *swarm.Node) { - n.Spec.Annotations.Labels = map[string]string{ - "security": "low", - } - }) - } - - // create service - instances := 3 - constraints := []string{"node.labels.security==high"} - id := daemons[0].createService(c, simpleTestService, setConstraints(constraints), setInstances(instances)) - // wait for tasks ready - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkServiceRunningTasks(id), checker.Equals, instances) - tasks := daemons[0].getServiceTasks(c, id) - // validate all tasks are running on nodes[0] - for _, task := range tasks { - c.Assert(task.NodeID, checker.Equals, nodes[0].ID) - } - //remove service - daemons[0].removeService(c, id) - - // create service - constraints = []string{"node.labels.security!=high"} - id = daemons[0].createService(c, simpleTestService, setConstraints(constraints), setInstances(instances)) - // wait for tasks ready - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkServiceRunningTasks(id), checker.Equals, instances) - tasks = daemons[0].getServiceTasks(c, id) - // validate all tasks are NOT running on nodes[0] - for _, task := range tasks { - c.Assert(task.NodeID, checker.Not(checker.Equals), nodes[0].ID) - } - //remove service - daemons[0].removeService(c, id) - - constraints = []string{"node.labels.security==medium"} - id = daemons[0].createService(c, simpleTestService, setConstraints(constraints), setInstances(instances)) - // wait for tasks created - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkServiceTasks(id), checker.Equals, instances) - // let scheduler try - time.Sleep(250 * time.Millisecond) - tasks = daemons[0].getServiceTasks(c, id) - // validate tasks are not assigned - for _, task := range tasks { - c.Assert(task.NodeID, checker.Equals, "") - } - //remove service - daemons[0].removeService(c, id) - - // multiple constraints - constraints = []string{ - "node.labels.security==high", - fmt.Sprintf("node.id==%s", nodes[1].ID), - } - id = daemons[0].createService(c, simpleTestService, setConstraints(constraints), setInstances(instances)) - // wait for tasks created - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkServiceTasks(id), checker.Equals, instances) - // let scheduler try - time.Sleep(250 * time.Millisecond) - tasks = daemons[0].getServiceTasks(c, id) - // validate tasks are not assigned - for _, task := range tasks { - c.Assert(task.NodeID, checker.Equals, "") - } - // make nodes[1] fulfills the constraints - daemons[0].updateNode(c, nodes[1].ID, func(n *swarm.Node) { - n.Spec.Annotations.Labels = map[string]string{ - "security": "high", - } - }) - // wait for tasks ready - waitAndAssert(c, defaultReconciliationTimeout, daemons[0].checkServiceRunningTasks(id), checker.Equals, instances) - tasks = daemons[0].getServiceTasks(c, id) - for _, task := range tasks { - c.Assert(task.NodeID, checker.Equals, nodes[1].ID) - } -} - -func (s *DockerSwarmSuite) TestAPISwarmServicesStateReporting(c *check.C) { - testRequires(c, SameHostDaemon) - testRequires(c, DaemonIsLinux) - - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, true, true) - d3 := s.AddDaemon(c, true, false) - - time.Sleep(1 * time.Second) // make sure all daemons are ready to accept - - instances := 9 - d1.createService(c, simpleTestService, setInstances(instances)) - - waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.checkActiveContainerCount, d2.checkActiveContainerCount, d3.checkActiveContainerCount), checker.Equals, instances) - - getContainers := func() map[string]*SwarmDaemon { - m := make(map[string]*SwarmDaemon) - for _, d := range []*SwarmDaemon{d1, d2, d3} { - for _, id := range d.activeContainers() { - m[id] = d - } - } - return m - } - - containers := getContainers() - c.Assert(containers, checker.HasLen, instances) - var toRemove string - for i := range containers { - toRemove = i - } - - _, err := containers[toRemove].Cmd("stop", toRemove) - c.Assert(err, checker.IsNil) - - waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.checkActiveContainerCount, d2.checkActiveContainerCount, d3.checkActiveContainerCount), checker.Equals, instances) - - containers2 := getContainers() - c.Assert(containers2, checker.HasLen, instances) - for i := range containers { - if i == toRemove { - c.Assert(containers2[i], checker.IsNil) - } else { - c.Assert(containers2[i], checker.NotNil) - } - } - - containers = containers2 - for i := range containers { - toRemove = i - } - - // try with killing process outside of docker - pidStr, err := containers[toRemove].Cmd("inspect", "-f", "{{.State.Pid}}", toRemove) - c.Assert(err, checker.IsNil) - pid, err := strconv.Atoi(strings.TrimSpace(pidStr)) - c.Assert(err, checker.IsNil) - c.Assert(syscall.Kill(pid, syscall.SIGKILL), checker.IsNil) - - time.Sleep(time.Second) // give some time to handle the signal - - waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.checkActiveContainerCount, d2.checkActiveContainerCount, d3.checkActiveContainerCount), checker.Equals, instances) - - containers2 = getContainers() - c.Assert(containers2, checker.HasLen, instances) - for i := range containers { - if i == toRemove { - c.Assert(containers2[i], checker.IsNil) - } else { - c.Assert(containers2[i], checker.NotNil) - } - } -} - -func (s *DockerSwarmSuite) TestAPISwarmLeaderProxy(c *check.C) { - // add three managers, one of these is leader - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, true, true) - d3 := s.AddDaemon(c, true, true) - - // start a service by hitting each of the 3 managers - d1.createService(c, simpleTestService, func(s *swarm.Service) { - s.Spec.Name = "test1" - }) - d2.createService(c, simpleTestService, func(s *swarm.Service) { - s.Spec.Name = "test2" - }) - d3.createService(c, simpleTestService, func(s *swarm.Service) { - s.Spec.Name = "test3" - }) - - // 3 services should be started now, because the requests were proxied to leader - // query each node and make sure it returns 3 services - for _, d := range []*SwarmDaemon{d1, d2, d3} { - services := d.listServices(c) - c.Assert(services, checker.HasLen, 3) - } -} - -func (s *DockerSwarmSuite) TestAPISwarmLeaderElection(c *check.C) { - // Create 3 nodes - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, true, true) - d3 := s.AddDaemon(c, true, true) - - // assert that the first node we made is the leader, and the other two are followers - c.Assert(d1.getNode(c, d1.NodeID).ManagerStatus.Leader, checker.True) - c.Assert(d1.getNode(c, d2.NodeID).ManagerStatus.Leader, checker.False) - c.Assert(d1.getNode(c, d3.NodeID).ManagerStatus.Leader, checker.False) - - d1.Stop() // stop the leader - - var ( - leader *SwarmDaemon // keep track of leader - followers []*SwarmDaemon // keep track of followers - ) - checkLeader := func(nodes ...*SwarmDaemon) checkF { - return func(c *check.C) (interface{}, check.CommentInterface) { - // clear these out before each run - leader = nil - followers = nil - for _, d := range nodes { - if d.getNode(c, d.NodeID).ManagerStatus.Leader { - leader = d - } else { - followers = append(followers, d) - } - } - - if leader == nil { - return false, check.Commentf("no leader elected") - } - - return true, check.Commentf("elected %v", leader.id) - } - } - - // wait for an election to occur - waitAndAssert(c, defaultReconciliationTimeout, checkLeader(d2, d3), checker.True) - - // assert that we have a new leader - c.Assert(leader, checker.NotNil) - - // Keep track of the current leader, since we want that to be chosen. - stableleader := leader - - // add the d1, the initial leader, back - d1.Start() - - // TODO(stevvooe): may need to wait for rejoin here - - // wait for possible election - waitAndAssert(c, defaultReconciliationTimeout, checkLeader(d1, d2, d3), checker.True) - // pick out the leader and the followers again - - // verify that we still only have 1 leader and 2 followers - c.Assert(leader, checker.NotNil) - c.Assert(followers, checker.HasLen, 2) - // and that after we added d1 back, the leader hasn't changed - c.Assert(leader.NodeID, checker.Equals, stableleader.NodeID) -} - -func (s *DockerSwarmSuite) TestAPISwarmRaftQuorum(c *check.C) { - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, true, true) - d3 := s.AddDaemon(c, true, true) - - d1.createService(c, simpleTestService) - - c.Assert(d2.Stop(), checker.IsNil) - - // make sure there is a leader - waitAndAssert(c, defaultReconciliationTimeout, d1.checkLeader, checker.IsNil) - - d1.createService(c, simpleTestService, func(s *swarm.Service) { - s.Spec.Name = "top1" - }) - - c.Assert(d3.Stop(), checker.IsNil) - - // make sure there is a leader - waitAndAssert(c, defaultReconciliationTimeout, d1.checkLeader, checker.IsNil) - - var service swarm.Service - simpleTestService(&service) - service.Spec.Name = "top2" - status, out, err := d1.SockRequest("POST", "/services/create", service.Spec) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError, check.Commentf("deadline exceeded", string(out))) - - c.Assert(d2.Start(), checker.IsNil) - - // make sure there is a leader - waitAndAssert(c, defaultReconciliationTimeout, d1.checkLeader, checker.IsNil) - - d1.createService(c, simpleTestService, func(s *swarm.Service) { - s.Spec.Name = "top3" - }) -} - -func (s *DockerSwarmSuite) TestAPISwarmListNodes(c *check.C) { - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, true, false) - d3 := s.AddDaemon(c, true, false) - - nodes := d1.listNodes(c) - c.Assert(len(nodes), checker.Equals, 3, check.Commentf("nodes: %#v", nodes)) - -loop0: - for _, n := range nodes { - for _, d := range []*SwarmDaemon{d1, d2, d3} { - if n.ID == d.NodeID { - continue loop0 - } - } - c.Errorf("unknown nodeID %v", n.ID) - } -} - -func (s *DockerSwarmSuite) TestAPISwarmNodeUpdate(c *check.C) { - d := s.AddDaemon(c, true, true) - - nodes := d.listNodes(c) - - d.updateNode(c, nodes[0].ID, func(n *swarm.Node) { - n.Spec.Availability = swarm.NodeAvailabilityPause - }) - - n := d.getNode(c, nodes[0].ID) - c.Assert(n.Spec.Availability, checker.Equals, swarm.NodeAvailabilityPause) -} - -func (s *DockerSwarmSuite) TestAPISwarmNodeRemove(c *check.C) { - testRequires(c, Network) - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, true, false) - _ = s.AddDaemon(c, true, false) - - nodes := d1.listNodes(c) - c.Assert(len(nodes), checker.Equals, 3, check.Commentf("nodes: %#v", nodes)) - - // Getting the info so we can take the NodeID - d2Info, err := d2.info() - c.Assert(err, checker.IsNil) - - // forceful removal of d2 should work - d1.removeNode(c, d2Info.NodeID, true) - - nodes = d1.listNodes(c) - c.Assert(len(nodes), checker.Equals, 2, check.Commentf("nodes: %#v", nodes)) - - // Restart the node that was removed - err = d2.Restart() - c.Assert(err, checker.IsNil) - - // Give some time for the node to rejoin - time.Sleep(1 * time.Second) - - // Make sure the node didn't rejoin - nodes = d1.listNodes(c) - c.Assert(len(nodes), checker.Equals, 2, check.Commentf("nodes: %#v", nodes)) -} - -func (s *DockerSwarmSuite) TestAPISwarmNodeDrainPause(c *check.C) { - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, true, false) - - time.Sleep(1 * time.Second) // make sure all daemons are ready to accept tasks - - // start a service, expect balanced distribution - instances := 8 - id := d1.createService(c, simpleTestService, setInstances(instances)) - - waitAndAssert(c, defaultReconciliationTimeout, d1.checkActiveContainerCount, checker.GreaterThan, 0) - waitAndAssert(c, defaultReconciliationTimeout, d2.checkActiveContainerCount, checker.GreaterThan, 0) - waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.checkActiveContainerCount, d2.checkActiveContainerCount), checker.Equals, instances) - - // drain d2, all containers should move to d1 - d1.updateNode(c, d2.NodeID, func(n *swarm.Node) { - n.Spec.Availability = swarm.NodeAvailabilityDrain - }) - waitAndAssert(c, defaultReconciliationTimeout, d1.checkActiveContainerCount, checker.Equals, instances) - waitAndAssert(c, defaultReconciliationTimeout, d2.checkActiveContainerCount, checker.Equals, 0) - - // set d2 back to active - d1.updateNode(c, d2.NodeID, func(n *swarm.Node) { - n.Spec.Availability = swarm.NodeAvailabilityActive - }) - - instances = 1 - d1.updateService(c, d1.getService(c, id), setInstances(instances)) - - waitAndAssert(c, defaultReconciliationTimeout*2, reducedCheck(sumAsIntegers, d1.checkActiveContainerCount, d2.checkActiveContainerCount), checker.Equals, instances) - - instances = 8 - d1.updateService(c, d1.getService(c, id), setInstances(instances)) - - // drained node first so we don't get any old containers - waitAndAssert(c, defaultReconciliationTimeout, d2.checkActiveContainerCount, checker.GreaterThan, 0) - waitAndAssert(c, defaultReconciliationTimeout, d1.checkActiveContainerCount, checker.GreaterThan, 0) - waitAndAssert(c, defaultReconciliationTimeout*2, reducedCheck(sumAsIntegers, d1.checkActiveContainerCount, d2.checkActiveContainerCount), checker.Equals, instances) - - d2ContainerCount := len(d2.activeContainers()) - - // set d2 to paused, scale service up, only d1 gets new tasks - d1.updateNode(c, d2.NodeID, func(n *swarm.Node) { - n.Spec.Availability = swarm.NodeAvailabilityPause - }) - - instances = 14 - d1.updateService(c, d1.getService(c, id), setInstances(instances)) - - waitAndAssert(c, defaultReconciliationTimeout, d1.checkActiveContainerCount, checker.Equals, instances-d2ContainerCount) - waitAndAssert(c, defaultReconciliationTimeout, d2.checkActiveContainerCount, checker.Equals, d2ContainerCount) - -} - -func (s *DockerSwarmSuite) TestAPISwarmLeaveRemovesContainer(c *check.C) { - d := s.AddDaemon(c, true, true) - - instances := 2 - d.createService(c, simpleTestService, setInstances(instances)) - - id, err := d.Cmd("run", "-d", "busybox", "top") - c.Assert(err, checker.IsNil) - id = strings.TrimSpace(id) - - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, instances+1) - - c.Assert(d.Leave(false), checker.NotNil) - c.Assert(d.Leave(true), checker.IsNil) - - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - id2, err := d.Cmd("ps", "-q") - c.Assert(err, checker.IsNil) - c.Assert(id, checker.HasPrefix, strings.TrimSpace(id2)) -} - -// #23629 -func (s *DockerSwarmSuite) TestAPISwarmLeaveOnPendingJoin(c *check.C) { - testRequires(c, Network) - s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, false, false) - - id, err := d2.Cmd("run", "-d", "busybox", "top") - c.Assert(err, checker.IsNil) - id = strings.TrimSpace(id) - - err = d2.Join(swarm.JoinRequest{ - RemoteAddrs: []string{"123.123.123.123:1234"}, - }) - c.Assert(err, check.NotNil) - c.Assert(err.Error(), checker.Contains, "Timeout was reached") - - info, err := d2.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStatePending) - - c.Assert(d2.Leave(true), checker.IsNil) - - waitAndAssert(c, defaultReconciliationTimeout, d2.checkActiveContainerCount, checker.Equals, 1) - - id2, err := d2.Cmd("ps", "-q") - c.Assert(err, checker.IsNil) - c.Assert(id, checker.HasPrefix, strings.TrimSpace(id2)) -} - -// #23705 -func (s *DockerSwarmSuite) TestAPISwarmRestoreOnPendingJoin(c *check.C) { - testRequires(c, Network) - d := s.AddDaemon(c, false, false) - err := d.Join(swarm.JoinRequest{ - RemoteAddrs: []string{"123.123.123.123:1234"}, - }) - c.Assert(err, check.NotNil) - c.Assert(err.Error(), checker.Contains, "Timeout was reached") - - waitAndAssert(c, defaultReconciliationTimeout, d.checkLocalNodeState, checker.Equals, swarm.LocalNodeStatePending) - - c.Assert(d.Stop(), checker.IsNil) - c.Assert(d.Start(), checker.IsNil) - - info, err := d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) -} - -func (s *DockerSwarmSuite) TestAPISwarmManagerRestore(c *check.C) { - d1 := s.AddDaemon(c, true, true) - - instances := 2 - id := d1.createService(c, simpleTestService, setInstances(instances)) - - d1.getService(c, id) - d1.Stop() - d1.Start() - d1.getService(c, id) - - d2 := s.AddDaemon(c, true, true) - d2.getService(c, id) - d2.Stop() - d2.Start() - d2.getService(c, id) - - d3 := s.AddDaemon(c, true, true) - d3.getService(c, id) - d3.Stop() - d3.Start() - d3.getService(c, id) - - d3.Kill() - time.Sleep(1 * time.Second) // time to handle signal - d3.Start() - d3.getService(c, id) -} - -func (s *DockerSwarmSuite) TestAPISwarmScaleNoRollingUpdate(c *check.C) { - d := s.AddDaemon(c, true, true) - - instances := 2 - id := d.createService(c, simpleTestService, setInstances(instances)) - - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, instances) - containers := d.activeContainers() - instances = 4 - d.updateService(c, d.getService(c, id), setInstances(instances)) - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, instances) - containers2 := d.activeContainers() - -loop0: - for _, c1 := range containers { - for _, c2 := range containers2 { - if c1 == c2 { - continue loop0 - } - } - c.Errorf("container %v not found in new set %#v", c1, containers2) - } -} - -func (s *DockerSwarmSuite) TestAPISwarmInvalidAddress(c *check.C) { - d := s.AddDaemon(c, false, false) - req := swarm.InitRequest{ - ListenAddr: "", - } - status, _, err := d.SockRequest("POST", "/swarm/init", req) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError) - - req2 := swarm.JoinRequest{ - ListenAddr: "0.0.0.0:2377", - RemoteAddrs: []string{""}, - } - status, _, err = d.SockRequest("POST", "/swarm/join", req2) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError) -} - -func (s *DockerSwarmSuite) TestAPISwarmForceNewCluster(c *check.C) { - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, true, true) - - instances := 2 - id := d1.createService(c, simpleTestService, setInstances(instances)) - waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.checkActiveContainerCount, d2.checkActiveContainerCount), checker.Equals, instances) - - // drain d2, all containers should move to d1 - d1.updateNode(c, d2.NodeID, func(n *swarm.Node) { - n.Spec.Availability = swarm.NodeAvailabilityDrain - }) - waitAndAssert(c, defaultReconciliationTimeout, d1.checkActiveContainerCount, checker.Equals, instances) - waitAndAssert(c, defaultReconciliationTimeout, d2.checkActiveContainerCount, checker.Equals, 0) - - c.Assert(d2.Stop(), checker.IsNil) - - c.Assert(d1.Init(swarm.InitRequest{ - ForceNewCluster: true, - Spec: swarm.Spec{}, - }), checker.IsNil) - - waitAndAssert(c, defaultReconciliationTimeout, d1.checkActiveContainerCount, checker.Equals, instances) - - d3 := s.AddDaemon(c, true, true) - info, err := d3.info() - c.Assert(err, checker.IsNil) - c.Assert(info.ControlAvailable, checker.True) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - - instances = 4 - d3.updateService(c, d3.getService(c, id), setInstances(instances)) - - waitAndAssert(c, defaultReconciliationTimeout, reducedCheck(sumAsIntegers, d1.checkActiveContainerCount, d3.checkActiveContainerCount), checker.Equals, instances) -} - -func simpleTestService(s *swarm.Service) { - ureplicas := uint64(1) - restartDelay := time.Duration(100 * time.Millisecond) - - s.Spec = swarm.ServiceSpec{ - TaskTemplate: swarm.TaskSpec{ - ContainerSpec: swarm.ContainerSpec{ - Image: "busybox:latest", - Command: []string{"/bin/top"}, - }, - RestartPolicy: &swarm.RestartPolicy{ - Delay: &restartDelay, - }, - }, - Mode: swarm.ServiceMode{ - Replicated: &swarm.ReplicatedService{ - Replicas: &ureplicas, - }, - }, - } - s.Spec.Name = "top" -} - -func serviceForUpdate(s *swarm.Service) { - ureplicas := uint64(1) - restartDelay := time.Duration(100 * time.Millisecond) - - s.Spec = swarm.ServiceSpec{ - TaskTemplate: swarm.TaskSpec{ - ContainerSpec: swarm.ContainerSpec{ - Image: "busybox:latest", - Command: []string{"/bin/top"}, - }, - RestartPolicy: &swarm.RestartPolicy{ - Delay: &restartDelay, - }, - }, - Mode: swarm.ServiceMode{ - Replicated: &swarm.ReplicatedService{ - Replicas: &ureplicas, - }, - }, - UpdateConfig: &swarm.UpdateConfig{ - Parallelism: 2, - Delay: 4 * time.Second, - FailureAction: swarm.UpdateFailureActionContinue, - }, - } - s.Spec.Name = "updatetest" -} - -func setInstances(replicas int) serviceConstructor { - ureplicas := uint64(replicas) - return func(s *swarm.Service) { - s.Spec.Mode = swarm.ServiceMode{ - Replicated: &swarm.ReplicatedService{ - Replicas: &ureplicas, - }, - } - } -} - -func setImage(image string) serviceConstructor { - return func(s *swarm.Service) { - s.Spec.TaskTemplate.ContainerSpec.Image = image - } -} - -func setFailureAction(failureAction string) serviceConstructor { - return func(s *swarm.Service) { - s.Spec.UpdateConfig.FailureAction = failureAction - } -} - -func setMaxFailureRatio(maxFailureRatio float32) serviceConstructor { - return func(s *swarm.Service) { - s.Spec.UpdateConfig.MaxFailureRatio = maxFailureRatio - } -} - -func setParallelism(parallelism uint64) serviceConstructor { - return func(s *swarm.Service) { - s.Spec.UpdateConfig.Parallelism = parallelism - } -} - -func setConstraints(constraints []string) serviceConstructor { - return func(s *swarm.Service) { - if s.Spec.TaskTemplate.Placement == nil { - s.Spec.TaskTemplate.Placement = &swarm.Placement{} - } - s.Spec.TaskTemplate.Placement.Constraints = constraints - } -} - -func setGlobalMode(s *swarm.Service) { - s.Spec.Mode = swarm.ServiceMode{ - Global: &swarm.GlobalService{}, - } -} - -func checkClusterHealth(c *check.C, cl []*SwarmDaemon, managerCount, workerCount int) { - var totalMCount, totalWCount int - - for _, d := range cl { - var ( - info swarm.Info - err error - ) - - // check info in a waitAndAssert, because if the cluster doesn't have a leader, `info` will return an error - checkInfo := func(c *check.C) (interface{}, check.CommentInterface) { - info, err = d.info() - return err, check.Commentf("cluster not ready in time") - } - waitAndAssert(c, defaultReconciliationTimeout, checkInfo, checker.IsNil) - if !info.ControlAvailable { - totalWCount++ - continue - } - - var leaderFound bool - totalMCount++ - var mCount, wCount int - - for _, n := range d.listNodes(c) { - waitReady := func(c *check.C) (interface{}, check.CommentInterface) { - if n.Status.State == swarm.NodeStateReady { - return true, nil - } - nn := d.getNode(c, n.ID) - n = *nn - return n.Status.State == swarm.NodeStateReady, check.Commentf("state of node %s, reported by %s", n.ID, d.Info.NodeID) - } - waitAndAssert(c, defaultReconciliationTimeout, waitReady, checker.True) - - waitActive := func(c *check.C) (interface{}, check.CommentInterface) { - if n.Spec.Availability == swarm.NodeAvailabilityActive { - return true, nil - } - nn := d.getNode(c, n.ID) - n = *nn - return n.Spec.Availability == swarm.NodeAvailabilityActive, check.Commentf("availability of node %s, reported by %s", n.ID, d.Info.NodeID) - } - waitAndAssert(c, defaultReconciliationTimeout, waitActive, checker.True) - - if n.Spec.Role == swarm.NodeRoleManager { - c.Assert(n.ManagerStatus, checker.NotNil, check.Commentf("manager status of node %s (manager), reported by %s", n.ID, d.Info.NodeID)) - if n.ManagerStatus.Leader { - leaderFound = true - } - mCount++ - } else { - c.Assert(n.ManagerStatus, checker.IsNil, check.Commentf("manager status of node %s (worker), reported by %s", n.ID, d.Info.NodeID)) - wCount++ - } - } - c.Assert(leaderFound, checker.True, check.Commentf("lack of leader reported by node %s", info.NodeID)) - c.Assert(mCount, checker.Equals, managerCount, check.Commentf("managers count reported by node %s", info.NodeID)) - c.Assert(wCount, checker.Equals, workerCount, check.Commentf("workers count reported by node %s", info.NodeID)) - } - c.Assert(totalMCount, checker.Equals, managerCount) - c.Assert(totalWCount, checker.Equals, workerCount) -} - -func (s *DockerSwarmSuite) TestAPISwarmRestartCluster(c *check.C) { - mCount, wCount := 5, 1 - - var nodes []*SwarmDaemon - for i := 0; i < mCount; i++ { - manager := s.AddDaemon(c, true, true) - info, err := manager.info() - c.Assert(err, checker.IsNil) - c.Assert(info.ControlAvailable, checker.True) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - nodes = append(nodes, manager) - } - - for i := 0; i < wCount; i++ { - worker := s.AddDaemon(c, true, false) - info, err := worker.info() - c.Assert(err, checker.IsNil) - c.Assert(info.ControlAvailable, checker.False) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - nodes = append(nodes, worker) - } - - // stop whole cluster - { - var wg sync.WaitGroup - wg.Add(len(nodes)) - errs := make(chan error, len(nodes)) - - for _, d := range nodes { - go func(daemon *SwarmDaemon) { - defer wg.Done() - if err := daemon.Stop(); err != nil { - errs <- err - } - if root := os.Getenv("DOCKER_REMAP_ROOT"); root != "" { - daemon.root = filepath.Dir(daemon.root) - } - }(d) - } - wg.Wait() - close(errs) - for err := range errs { - c.Assert(err, check.IsNil) - } - } - - // start whole cluster - { - var wg sync.WaitGroup - wg.Add(len(nodes)) - errs := make(chan error, len(nodes)) - - for _, d := range nodes { - go func(daemon *SwarmDaemon) { - defer wg.Done() - if err := daemon.Start("--iptables=false"); err != nil { - errs <- err - } - }(d) - } - wg.Wait() - close(errs) - for err := range errs { - c.Assert(err, check.IsNil) - } - } - - checkClusterHealth(c, nodes, mCount, wCount) -} - -func (s *DockerSwarmSuite) TestAPISwarmServicesUpdateWithName(c *check.C) { - d := s.AddDaemon(c, true, true) - - instances := 2 - id := d.createService(c, simpleTestService, setInstances(instances)) - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, instances) - - service := d.getService(c, id) - instances = 5 - - setInstances(instances)(service) - url := fmt.Sprintf("/services/%s/update?version=%d", service.Spec.Name, service.Version.Index) - status, out, err := d.SockRequest("POST", url, service.Spec) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf("output: %q", string(out))) - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, instances) -} - -func (s *DockerSwarmSuite) TestAPISwarmSecretsEmptyList(c *check.C) { - d := s.AddDaemon(c, true, true) - - secrets := d.listSecrets(c) - c.Assert(secrets, checker.NotNil) - c.Assert(len(secrets), checker.Equals, 0, check.Commentf("secrets: %#v", secrets)) -} - -func (s *DockerSwarmSuite) TestAPISwarmSecretsCreate(c *check.C) { - d := s.AddDaemon(c, true, true) - - testName := "test_secret" - id := d.createSecret(c, swarm.SecretSpec{ - swarm.Annotations{ - Name: testName, - }, - []byte("TESTINGDATA"), - }) - c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) - - secrets := d.listSecrets(c) - c.Assert(len(secrets), checker.Equals, 1, check.Commentf("secrets: %#v", secrets)) - name := secrets[0].Spec.Annotations.Name - c.Assert(name, checker.Equals, testName, check.Commentf("secret: %s", name)) -} - -func (s *DockerSwarmSuite) TestAPISwarmSecretsDelete(c *check.C) { - d := s.AddDaemon(c, true, true) - - testName := "test_secret" - id := d.createSecret(c, swarm.SecretSpec{ - swarm.Annotations{ - Name: testName, - }, - []byte("TESTINGDATA"), - }) - c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) - - secret := d.getSecret(c, id) - c.Assert(secret.ID, checker.Equals, id, check.Commentf("secret: %v", secret)) - - d.deleteSecret(c, secret.ID) - status, out, err := d.SockRequest("GET", "/secrets/"+id, nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNotFound, check.Commentf("secret delete: %s", string(out))) -} - -// Test case for 30242, where duplicate networks, with different drivers `bridge` and `overlay`, -// caused both scopes to be `swarm` for `docker network inspect` and `docker network ls`. -// This test makes sure the fixes correctly output scopes instead. -func (s *DockerSwarmSuite) TestAPIDuplicateNetworks(c *check.C) { - d := s.AddDaemon(c, true, true) - - name := "foo" - networkCreateRequest := types.NetworkCreateRequest{ - Name: name, - NetworkCreate: types.NetworkCreate{ - CheckDuplicate: false, - }, - } - - var n1 types.NetworkCreateResponse - networkCreateRequest.NetworkCreate.Driver = "bridge" - - status, out, err := d.SockRequest("POST", "/networks/create", networkCreateRequest) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusCreated, check.Commentf(string(out))) - - c.Assert(json.Unmarshal(out, &n1), checker.IsNil) - - var n2 types.NetworkCreateResponse - networkCreateRequest.NetworkCreate.Driver = "overlay" - - status, out, err = d.SockRequest("POST", "/networks/create", networkCreateRequest) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusCreated, check.Commentf(string(out))) - - c.Assert(json.Unmarshal(out, &n2), checker.IsNil) - - var r1 types.NetworkResource - - status, out, err = d.SockRequest("GET", "/networks/"+n1.ID, nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf(string(out))) - - c.Assert(json.Unmarshal(out, &r1), checker.IsNil) - - c.Assert(r1.Scope, checker.Equals, "local") - - var r2 types.NetworkResource - - status, out, err = d.SockRequest("GET", "/networks/"+n2.ID, nil) - c.Assert(err, checker.IsNil, check.Commentf(string(out))) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf(string(out))) - - c.Assert(json.Unmarshal(out, &r2), checker.IsNil) - - c.Assert(r2.Scope, checker.Equals, "swarm") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_test.go deleted file mode 100644 index 3b38ba96f..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_test.go +++ /dev/null @@ -1,118 +0,0 @@ -package main - -import ( - "fmt" - "net/http" - "net/http/httptest" - "runtime" - "strconv" - "strings" - - "github.com/docker/docker/api" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestAPIOptionsRoute(c *check.C) { - status, _, err := sockRequest("OPTIONS", "/", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) -} - -func (s *DockerSuite) TestAPIGetEnabledCORS(c *check.C) { - res, body, err := sockRequestRaw("GET", "/version", nil, "") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - body.Close() - // TODO: @runcom incomplete tests, why old integration tests had this headers - // and here none of the headers below are in the response? - //c.Log(res.Header) - //c.Assert(res.Header.Get("Access-Control-Allow-Origin"), check.Equals, "*") - //c.Assert(res.Header.Get("Access-Control-Allow-Headers"), check.Equals, "Origin, X-Requested-With, Content-Type, Accept, X-Registry-Auth") -} - -func (s *DockerSuite) TestAPIClientVersionOldNotSupported(c *check.C) { - if daemonPlatform != runtime.GOOS { - c.Skip("Daemon platform doesn't match test platform") - } - if api.MinVersion == api.DefaultVersion { - c.Skip("API MinVersion==DefaultVersion") - } - v := strings.Split(api.MinVersion, ".") - vMinInt, err := strconv.Atoi(v[1]) - c.Assert(err, checker.IsNil) - vMinInt-- - v[1] = strconv.Itoa(vMinInt) - version := strings.Join(v, ".") - - status, body, err := sockRequest("GET", "/v"+version+"/version", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusBadRequest) - expected := fmt.Sprintf("client version %s is too old. Minimum supported API version is %s, please upgrade your client to a newer version", version, api.MinVersion) - c.Assert(strings.TrimSpace(string(body)), checker.Contains, expected) -} - -func (s *DockerSuite) TestAPIDockerAPIVersion(c *check.C) { - var svrVersion string - - server := httptest.NewServer(http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("API-Version", api.DefaultVersion) - url := r.URL.Path - svrVersion = url - })) - defer server.Close() - - // Test using the env var first - result := icmd.RunCmd(icmd.Cmd{ - Command: binaryWithArgs("-H="+server.URL[7:], "version"), - Env: appendBaseEnv(false, "DOCKER_API_VERSION=xxx"), - }) - c.Assert(result, icmd.Matches, icmd.Expected{Out: "API version: xxx", ExitCode: 1}) - c.Assert(svrVersion, check.Equals, "/vxxx/version", check.Commentf("%s", result.Compare(icmd.Success))) -} - -func (s *DockerSuite) TestAPIErrorJSON(c *check.C) { - httpResp, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(`{}`), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(httpResp.StatusCode, checker.Equals, http.StatusInternalServerError) - c.Assert(httpResp.Header.Get("Content-Type"), checker.Equals, "application/json") - b, err := readBody(body) - c.Assert(err, checker.IsNil) - c.Assert(getErrorMessage(c, b), checker.Equals, "Config cannot be empty in order to create a container") -} - -func (s *DockerSuite) TestAPIErrorPlainText(c *check.C) { - // Windows requires API 1.25 or later. This test is validating a behaviour which was present - // in v1.23, but changed in 1.24, hence not applicable on Windows. See apiVersionSupportsJSONErrors - testRequires(c, DaemonIsLinux) - httpResp, body, err := sockRequestRaw("POST", "/v1.23/containers/create", strings.NewReader(`{}`), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(httpResp.StatusCode, checker.Equals, http.StatusInternalServerError) - c.Assert(httpResp.Header.Get("Content-Type"), checker.Contains, "text/plain") - b, err := readBody(body) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(string(b)), checker.Equals, "Config cannot be empty in order to create a container") -} - -func (s *DockerSuite) TestAPIErrorNotFoundJSON(c *check.C) { - // 404 is a different code path to normal errors, so test separately - httpResp, body, err := sockRequestRaw("GET", "/notfound", nil, "application/json") - c.Assert(err, checker.IsNil) - c.Assert(httpResp.StatusCode, checker.Equals, http.StatusNotFound) - c.Assert(httpResp.Header.Get("Content-Type"), checker.Equals, "application/json") - b, err := readBody(body) - c.Assert(err, checker.IsNil) - c.Assert(getErrorMessage(c, b), checker.Equals, "page not found") -} - -func (s *DockerSuite) TestAPIErrorNotFoundPlainText(c *check.C) { - httpResp, body, err := sockRequestRaw("GET", "/v1.23/notfound", nil, "application/json") - c.Assert(err, checker.IsNil) - c.Assert(httpResp.StatusCode, checker.Equals, http.StatusNotFound) - c.Assert(httpResp.Header.Get("Content-Type"), checker.Contains, "text/plain") - b, err := readBody(body) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(string(b)), checker.Equals, "page not found") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_update_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_update_unix_test.go deleted file mode 100644 index dfe14ec7b..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_update_unix_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build !windows - -package main - -import ( - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestAPIUpdateContainer(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - testRequires(c, swapMemorySupport) - - name := "apiUpdateContainer" - hostConfig := map[string]interface{}{ - "Memory": 314572800, - "MemorySwap": 524288000, - } - dockerCmd(c, "run", "-d", "--name", name, "-m", "200M", "busybox", "top") - _, _, err := sockRequest("POST", "/containers/"+name+"/update", hostConfig) - c.Assert(err, check.IsNil) - - c.Assert(inspectField(c, name, "HostConfig.Memory"), checker.Equals, "314572800") - file := "/sys/fs/cgroup/memory/memory.limit_in_bytes" - out, _ := dockerCmd(c, "exec", name, "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "314572800") - - c.Assert(inspectField(c, name, "HostConfig.MemorySwap"), checker.Equals, "524288000") - file = "/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes" - out, _ = dockerCmd(c, "exec", name, "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "524288000") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_version_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_version_test.go deleted file mode 100644 index eb2de5904..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_version_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -import ( - "encoding/json" - "net/http" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestGetVersion(c *check.C) { - status, body, err := sockRequest("GET", "/version", nil) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(err, checker.IsNil) - - var v types.Version - - c.Assert(json.Unmarshal(body, &v), checker.IsNil) - - c.Assert(v.Version, checker.Equals, dockerversion.Version, check.Commentf("Version mismatch")) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_volumes_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_volumes_test.go deleted file mode 100644 index d1d44005e..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_volumes_test.go +++ /dev/null @@ -1,89 +0,0 @@ -package main - -import ( - "encoding/json" - "net/http" - "path/filepath" - - "github.com/docker/docker/api/types" - volumetypes "github.com/docker/docker/api/types/volume" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestVolumesAPIList(c *check.C) { - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - dockerCmd(c, "run", "-v", prefix+"/foo", "busybox") - - status, b, err := sockRequest("GET", "/volumes", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - var volumes volumetypes.VolumesListOKBody - c.Assert(json.Unmarshal(b, &volumes), checker.IsNil) - - c.Assert(len(volumes.Volumes), checker.Equals, 1, check.Commentf("\n%v", volumes.Volumes)) -} - -func (s *DockerSuite) TestVolumesAPICreate(c *check.C) { - config := volumetypes.VolumesCreateBody{ - Name: "test", - } - status, b, err := sockRequest("POST", "/volumes/create", config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusCreated, check.Commentf(string(b))) - - var vol types.Volume - err = json.Unmarshal(b, &vol) - c.Assert(err, checker.IsNil) - - c.Assert(filepath.Base(filepath.Dir(vol.Mountpoint)), checker.Equals, config.Name) -} - -func (s *DockerSuite) TestVolumesAPIRemove(c *check.C) { - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - dockerCmd(c, "run", "-v", prefix+"/foo", "--name=test", "busybox") - - status, b, err := sockRequest("GET", "/volumes", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) - - var volumes volumetypes.VolumesListOKBody - c.Assert(json.Unmarshal(b, &volumes), checker.IsNil) - c.Assert(len(volumes.Volumes), checker.Equals, 1, check.Commentf("\n%v", volumes.Volumes)) - - v := volumes.Volumes[0] - status, _, err = sockRequest("DELETE", "/volumes/"+v.Name, nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusConflict, check.Commentf("Should not be able to remove a volume that is in use")) - - dockerCmd(c, "rm", "-f", "test") - status, data, err := sockRequest("DELETE", "/volumes/"+v.Name, nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent, check.Commentf(string(data))) - -} - -func (s *DockerSuite) TestVolumesAPIInspect(c *check.C) { - config := volumetypes.VolumesCreateBody{ - Name: "test", - } - status, b, err := sockRequest("POST", "/volumes/create", config) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusCreated, check.Commentf(string(b))) - - status, b, err = sockRequest("GET", "/volumes", nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf(string(b))) - - var volumes volumetypes.VolumesListOKBody - c.Assert(json.Unmarshal(b, &volumes), checker.IsNil) - c.Assert(len(volumes.Volumes), checker.Equals, 1, check.Commentf("\n%v", volumes.Volumes)) - - var vol types.Volume - status, b, err = sockRequest("GET", "/volumes/"+config.Name, nil) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK, check.Commentf(string(b))) - c.Assert(json.Unmarshal(b, &vol), checker.IsNil) - c.Assert(vol.Name, checker.Equals, config.Name) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_test.go deleted file mode 100644 index 2df4fdc4d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_test.go +++ /dev/null @@ -1,168 +0,0 @@ -package main - -import ( - "bufio" - "fmt" - "io" - "os/exec" - "runtime" - "strings" - "sync" - "time" - - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/go-check/check" -) - -const attachWait = 5 * time.Second - -func (s *DockerSuite) TestAttachMultipleAndRestart(c *check.C) { - endGroup := &sync.WaitGroup{} - startGroup := &sync.WaitGroup{} - endGroup.Add(3) - startGroup.Add(3) - - err := waitForContainer("attacher", "-d", "busybox", "/bin/sh", "-c", "while true; do sleep 1; echo hello; done") - c.Assert(err, check.IsNil) - - startDone := make(chan struct{}) - endDone := make(chan struct{}) - - go func() { - endGroup.Wait() - close(endDone) - }() - - go func() { - startGroup.Wait() - close(startDone) - }() - - for i := 0; i < 3; i++ { - go func() { - cmd := exec.Command(dockerBinary, "attach", "attacher") - - defer func() { - cmd.Wait() - endGroup.Done() - }() - - out, err := cmd.StdoutPipe() - if err != nil { - c.Fatal(err) - } - defer out.Close() - - if err := cmd.Start(); err != nil { - c.Fatal(err) - } - - buf := make([]byte, 1024) - - if _, err := out.Read(buf); err != nil && err != io.EOF { - c.Fatal(err) - } - - startGroup.Done() - - if !strings.Contains(string(buf), "hello") { - c.Fatalf("unexpected output %s expected hello\n", string(buf)) - } - }() - } - - select { - case <-startDone: - case <-time.After(attachWait): - c.Fatalf("Attaches did not initialize properly") - } - - dockerCmd(c, "kill", "attacher") - - select { - case <-endDone: - case <-time.After(attachWait): - c.Fatalf("Attaches did not finish properly") - } -} - -func (s *DockerSuite) TestAttachTTYWithoutStdin(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "-ti", "busybox") - - id := strings.TrimSpace(out) - c.Assert(waitRun(id), check.IsNil) - - done := make(chan error) - go func() { - defer close(done) - - cmd := exec.Command(dockerBinary, "attach", id) - if _, err := cmd.StdinPipe(); err != nil { - done <- err - return - } - - expected := "the input device is not a TTY" - if runtime.GOOS == "windows" { - expected += ". If you are using mintty, try prefixing the command with 'winpty'" - } - if out, _, err := runCommandWithOutput(cmd); err == nil { - done <- fmt.Errorf("attach should have failed") - return - } else if !strings.Contains(out, expected) { - done <- fmt.Errorf("attach failed with error %q: expected %q", out, expected) - return - } - }() - - select { - case err := <-done: - c.Assert(err, check.IsNil) - case <-time.After(attachWait): - c.Fatal("attach is running but should have failed") - } -} - -func (s *DockerSuite) TestAttachDisconnect(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-di", "busybox", "/bin/cat") - id := strings.TrimSpace(out) - - cmd := exec.Command(dockerBinary, "attach", id) - stdin, err := cmd.StdinPipe() - if err != nil { - c.Fatal(err) - } - defer stdin.Close() - stdout, err := cmd.StdoutPipe() - c.Assert(err, check.IsNil) - defer stdout.Close() - c.Assert(cmd.Start(), check.IsNil) - defer cmd.Process.Kill() - - _, err = stdin.Write([]byte("hello\n")) - c.Assert(err, check.IsNil) - out, err = bufio.NewReader(stdout).ReadString('\n') - c.Assert(err, check.IsNil) - c.Assert(strings.TrimSpace(out), check.Equals, "hello") - - c.Assert(stdin.Close(), check.IsNil) - - // Expect container to still be running after stdin is closed - running := inspectField(c, id, "State.Running") - c.Assert(running, check.Equals, "true") -} - -func (s *DockerSuite) TestAttachPausedContainer(c *check.C) { - testRequires(c, IsPausable) - defer unpauseAllContainers() - runSleepingContainer(c, "-d", "--name=test") - dockerCmd(c, "pause", "test") - - result := dockerCmdWithResult("attach", "test") - c.Assert(result, icmd.Matches, icmd.Expected{ - Error: "exit status 1", - ExitCode: 1, - Err: "You cannot attach to a paused container, unpause it first", - }) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_unix_test.go deleted file mode 100644 index fb794ccc4..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_unix_test.go +++ /dev/null @@ -1,237 +0,0 @@ -// +build !windows - -package main - -import ( - "bufio" - "io/ioutil" - "os/exec" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/stringid" - "github.com/go-check/check" - "github.com/kr/pty" -) - -// #9860 Make sure attach ends when container ends (with no errors) -func (s *DockerSuite) TestAttachClosedOnContainerStop(c *check.C) { - testRequires(c, SameHostDaemon) - - out, _ := dockerCmd(c, "run", "-dti", "busybox", "/bin/sh", "-c", `trap 'exit 0' SIGTERM; while true; do sleep 1; done`) - - id := strings.TrimSpace(out) - c.Assert(waitRun(id), check.IsNil) - - pty, tty, err := pty.Open() - c.Assert(err, check.IsNil) - - attachCmd := exec.Command(dockerBinary, "attach", id) - attachCmd.Stdin = tty - attachCmd.Stdout = tty - attachCmd.Stderr = tty - err = attachCmd.Start() - c.Assert(err, check.IsNil) - - errChan := make(chan error) - go func() { - time.Sleep(300 * time.Millisecond) - defer close(errChan) - // Container is waiting for us to signal it to stop - dockerCmd(c, "stop", id) - // And wait for the attach command to end - errChan <- attachCmd.Wait() - }() - - // Wait for the docker to end (should be done by the - // stop command in the go routine) - dockerCmd(c, "wait", id) - - select { - case err := <-errChan: - tty.Close() - out, _ := ioutil.ReadAll(pty) - c.Assert(err, check.IsNil, check.Commentf("out: %v", string(out))) - case <-time.After(attachWait): - c.Fatal("timed out without attach returning") - } - -} - -func (s *DockerSuite) TestAttachAfterDetach(c *check.C) { - name := "detachtest" - - cpty, tty, err := pty.Open() - c.Assert(err, checker.IsNil, check.Commentf("Could not open pty: %v", err)) - cmd := exec.Command(dockerBinary, "run", "-ti", "--name", name, "busybox") - cmd.Stdin = tty - cmd.Stdout = tty - cmd.Stderr = tty - - errChan := make(chan error) - go func() { - errChan <- cmd.Run() - close(errChan) - }() - - c.Assert(waitRun(name), check.IsNil) - - cpty.Write([]byte{16}) - time.Sleep(100 * time.Millisecond) - cpty.Write([]byte{17}) - - select { - case err := <-errChan: - if err != nil { - buff := make([]byte, 200) - tty.Read(buff) - c.Fatalf("%s: %s", err, buff) - } - case <-time.After(5 * time.Second): - c.Fatal("timeout while detaching") - } - - cpty, tty, err = pty.Open() - c.Assert(err, checker.IsNil, check.Commentf("Could not open pty: %v", err)) - - cmd = exec.Command(dockerBinary, "attach", name) - cmd.Stdin = tty - cmd.Stdout = tty - cmd.Stderr = tty - - err = cmd.Start() - c.Assert(err, checker.IsNil) - - bytes := make([]byte, 10) - var nBytes int - readErr := make(chan error, 1) - - go func() { - time.Sleep(500 * time.Millisecond) - cpty.Write([]byte("\n")) - time.Sleep(500 * time.Millisecond) - - nBytes, err = cpty.Read(bytes) - cpty.Close() - readErr <- err - }() - - select { - case err := <-readErr: - c.Assert(err, check.IsNil) - case <-time.After(2 * time.Second): - c.Fatal("timeout waiting for attach read") - } - - err = cmd.Wait() - c.Assert(err, checker.IsNil) - - c.Assert(string(bytes[:nBytes]), checker.Contains, "/ #") - -} - -// TestAttachDetach checks that attach in tty mode can be detached using the long container ID -func (s *DockerSuite) TestAttachDetach(c *check.C) { - out, _ := dockerCmd(c, "run", "-itd", "busybox", "cat") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), check.IsNil) - - cpty, tty, err := pty.Open() - c.Assert(err, check.IsNil) - defer cpty.Close() - - cmd := exec.Command(dockerBinary, "attach", id) - cmd.Stdin = tty - stdout, err := cmd.StdoutPipe() - c.Assert(err, check.IsNil) - defer stdout.Close() - err = cmd.Start() - c.Assert(err, check.IsNil) - c.Assert(waitRun(id), check.IsNil) - - _, err = cpty.Write([]byte("hello\n")) - c.Assert(err, check.IsNil) - out, err = bufio.NewReader(stdout).ReadString('\n') - c.Assert(err, check.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, "hello", check.Commentf("expected 'hello', got %q", out)) - - // escape sequence - _, err = cpty.Write([]byte{16}) - c.Assert(err, checker.IsNil) - time.Sleep(100 * time.Millisecond) - _, err = cpty.Write([]byte{17}) - c.Assert(err, checker.IsNil) - - ch := make(chan struct{}) - go func() { - cmd.Wait() - ch <- struct{}{} - }() - - running := inspectField(c, id, "State.Running") - c.Assert(running, checker.Equals, "true", check.Commentf("expected container to still be running")) - - go func() { - dockerCmd(c, "kill", id) - }() - - select { - case <-ch: - case <-time.After(10 * time.Millisecond): - c.Fatal("timed out waiting for container to exit") - } - -} - -// TestAttachDetachTruncatedID checks that attach in tty mode can be detached -func (s *DockerSuite) TestAttachDetachTruncatedID(c *check.C) { - out, _ := dockerCmd(c, "run", "-itd", "busybox", "cat") - id := stringid.TruncateID(strings.TrimSpace(out)) - c.Assert(waitRun(id), check.IsNil) - - cpty, tty, err := pty.Open() - c.Assert(err, checker.IsNil) - defer cpty.Close() - - cmd := exec.Command(dockerBinary, "attach", id) - cmd.Stdin = tty - stdout, err := cmd.StdoutPipe() - c.Assert(err, checker.IsNil) - defer stdout.Close() - err = cmd.Start() - c.Assert(err, checker.IsNil) - - _, err = cpty.Write([]byte("hello\n")) - c.Assert(err, checker.IsNil) - out, err = bufio.NewReader(stdout).ReadString('\n') - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, "hello", check.Commentf("expected 'hello', got %q", out)) - - // escape sequence - _, err = cpty.Write([]byte{16}) - c.Assert(err, checker.IsNil) - time.Sleep(100 * time.Millisecond) - _, err = cpty.Write([]byte{17}) - c.Assert(err, checker.IsNil) - - ch := make(chan struct{}) - go func() { - cmd.Wait() - ch <- struct{}{} - }() - - running := inspectField(c, id, "State.Running") - c.Assert(running, checker.Equals, "true", check.Commentf("expected container to still be running")) - - go func() { - dockerCmd(c, "kill", id) - }() - - select { - case <-ch: - case <-time.After(10 * time.Millisecond): - c.Fatal("timed out waiting for container to exit") - } - -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_plugin_v2_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_plugin_v2_test.go deleted file mode 100644 index 8a669fb37..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_plugin_v2_test.go +++ /dev/null @@ -1,133 +0,0 @@ -// +build !windows - -package main - -import ( - "fmt" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -var ( - authzPluginName = "riyaz/authz-no-volume-plugin" - authzPluginTag = "latest" - authzPluginNameWithTag = authzPluginName + ":" + authzPluginTag - authzPluginBadManifestName = "riyaz/authz-plugin-bad-manifest" - nonexistentAuthzPluginName = "riyaz/nonexistent-authz-plugin" -) - -func init() { - check.Suite(&DockerAuthzV2Suite{ - ds: &DockerSuite{}, - }) -} - -type DockerAuthzV2Suite struct { - ds *DockerSuite - d *Daemon -} - -func (s *DockerAuthzV2Suite) SetUpTest(c *check.C) { - testRequires(c, DaemonIsLinux, Network) - s.d = NewDaemon(c) - c.Assert(s.d.Start(), check.IsNil) -} - -func (s *DockerAuthzV2Suite) TearDownTest(c *check.C) { - s.d.Stop() - s.ds.TearDownTest(c) -} - -func (s *DockerAuthzV2Suite) TestAuthZPluginAllowNonVolumeRequest(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - // Install authz plugin - _, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", authzPluginNameWithTag) - c.Assert(err, checker.IsNil) - // start the daemon with the plugin and load busybox, --net=none build fails otherwise - // because it needs to pull busybox - c.Assert(s.d.Restart("--authorization-plugin="+authzPluginNameWithTag), check.IsNil) - c.Assert(s.d.LoadBusybox(), check.IsNil) - - // defer disabling the plugin - defer func() { - c.Assert(s.d.Restart(), check.IsNil) - _, err = s.d.Cmd("plugin", "disable", authzPluginNameWithTag) - c.Assert(err, checker.IsNil) - _, err = s.d.Cmd("plugin", "rm", authzPluginNameWithTag) - c.Assert(err, checker.IsNil) - }() - - // Ensure docker run command and accompanying docker ps are successful - out, err := s.d.Cmd("run", "-d", "busybox", "top") - c.Assert(err, check.IsNil) - - id := strings.TrimSpace(out) - - out, err = s.d.Cmd("ps") - c.Assert(err, check.IsNil) - c.Assert(assertContainerList(out, []string{id}), check.Equals, true) -} - -func (s *DockerAuthzV2Suite) TestAuthZPluginRejectVolumeRequests(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - // Install authz plugin - _, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", authzPluginNameWithTag) - c.Assert(err, checker.IsNil) - - // restart the daemon with the plugin - c.Assert(s.d.Restart("--authorization-plugin="+authzPluginNameWithTag), check.IsNil) - - // defer disabling the plugin - defer func() { - c.Assert(s.d.Restart(), check.IsNil) - _, err = s.d.Cmd("plugin", "disable", authzPluginNameWithTag) - c.Assert(err, checker.IsNil) - _, err = s.d.Cmd("plugin", "rm", authzPluginNameWithTag) - c.Assert(err, checker.IsNil) - }() - - out, err := s.d.Cmd("volume", "create") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag)) - - out, err = s.d.Cmd("volume", "ls") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag)) - - // The plugin will block the command before it can determine the volume does not exist - out, err = s.d.Cmd("volume", "rm", "test") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag)) - - out, err = s.d.Cmd("volume", "inspect", "test") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag)) - - out, err = s.d.Cmd("volume", "prune", "-f") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag)) -} - -func (s *DockerAuthzV2Suite) TestAuthZPluginBadManifestFailsDaemonStart(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - // Install authz plugin with bad manifest - _, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", authzPluginBadManifestName) - c.Assert(err, checker.IsNil) - - // start the daemon with the plugin, it will error - c.Assert(s.d.Restart("--authorization-plugin="+authzPluginBadManifestName), check.NotNil) - - // restarting the daemon without requiring the plugin will succeed - c.Assert(s.d.Restart(), check.IsNil) -} - -func (s *DockerAuthzV2Suite) TestNonexistentAuthZPluginFailsDaemonStart(c *check.C) { - testRequires(c, DaemonIsLinux, Network) - // start the daemon with a non-existent authz plugin, it will error - c.Assert(s.d.Restart("--authorization-plugin="+nonexistentAuthzPluginName), check.NotNil) - - // restarting the daemon without requiring the plugin will succeed - c.Assert(s.d.Restart(), check.IsNil) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_unix_test.go deleted file mode 100644 index a826249e2..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_unix_test.go +++ /dev/null @@ -1,477 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "path/filepath" - "strings" - - "bufio" - "bytes" - "os/exec" - "strconv" - "time" - - "net" - "net/http/httputil" - "net/url" - - "github.com/docker/docker/pkg/authorization" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/plugins" - "github.com/go-check/check" -) - -const ( - testAuthZPlugin = "authzplugin" - unauthorizedMessage = "User unauthorized authz plugin" - errorMessage = "something went wrong..." - containerListAPI = "/containers/json" -) - -var ( - alwaysAllowed = []string{"/_ping", "/info"} -) - -func init() { - check.Suite(&DockerAuthzSuite{ - ds: &DockerSuite{}, - }) -} - -type DockerAuthzSuite struct { - server *httptest.Server - ds *DockerSuite - d *Daemon - ctrl *authorizationController -} - -type authorizationController struct { - reqRes authorization.Response // reqRes holds the plugin response to the initial client request - resRes authorization.Response // resRes holds the plugin response to the daemon response - psRequestCnt int // psRequestCnt counts the number of calls to list container request api - psResponseCnt int // psResponseCnt counts the number of calls to list containers response API - requestsURIs []string // requestsURIs stores all request URIs that are sent to the authorization controller - reqUser string - resUser string -} - -func (s *DockerAuthzSuite) SetUpTest(c *check.C) { - s.d = NewDaemon(c) - s.ctrl = &authorizationController{} -} - -func (s *DockerAuthzSuite) TearDownTest(c *check.C) { - s.d.Stop() - s.ds.TearDownTest(c) - s.ctrl = nil -} - -func (s *DockerAuthzSuite) SetUpSuite(c *check.C) { - mux := http.NewServeMux() - s.server = httptest.NewServer(mux) - - mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) { - b, err := json.Marshal(plugins.Manifest{Implements: []string{authorization.AuthZApiImplements}}) - c.Assert(err, check.IsNil) - w.Write(b) - }) - - mux.HandleFunc("/AuthZPlugin.AuthZReq", func(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - body, err := ioutil.ReadAll(r.Body) - c.Assert(err, check.IsNil) - authReq := authorization.Request{} - err = json.Unmarshal(body, &authReq) - c.Assert(err, check.IsNil) - - assertBody(c, authReq.RequestURI, authReq.RequestHeaders, authReq.RequestBody) - assertAuthHeaders(c, authReq.RequestHeaders) - - // Count only container list api - if strings.HasSuffix(authReq.RequestURI, containerListAPI) { - s.ctrl.psRequestCnt++ - } - - s.ctrl.requestsURIs = append(s.ctrl.requestsURIs, authReq.RequestURI) - - reqRes := s.ctrl.reqRes - if isAllowed(authReq.RequestURI) { - reqRes = authorization.Response{Allow: true} - } - if reqRes.Err != "" { - w.WriteHeader(http.StatusInternalServerError) - } - b, err := json.Marshal(reqRes) - c.Assert(err, check.IsNil) - s.ctrl.reqUser = authReq.User - w.Write(b) - }) - - mux.HandleFunc("/AuthZPlugin.AuthZRes", func(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - body, err := ioutil.ReadAll(r.Body) - c.Assert(err, check.IsNil) - authReq := authorization.Request{} - err = json.Unmarshal(body, &authReq) - c.Assert(err, check.IsNil) - - assertBody(c, authReq.RequestURI, authReq.ResponseHeaders, authReq.ResponseBody) - assertAuthHeaders(c, authReq.ResponseHeaders) - - // Count only container list api - if strings.HasSuffix(authReq.RequestURI, containerListAPI) { - s.ctrl.psResponseCnt++ - } - resRes := s.ctrl.resRes - if isAllowed(authReq.RequestURI) { - resRes = authorization.Response{Allow: true} - } - if resRes.Err != "" { - w.WriteHeader(http.StatusInternalServerError) - } - b, err := json.Marshal(resRes) - c.Assert(err, check.IsNil) - s.ctrl.resUser = authReq.User - w.Write(b) - }) - - err := os.MkdirAll("/etc/docker/plugins", 0755) - c.Assert(err, checker.IsNil) - - fileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", testAuthZPlugin) - err = ioutil.WriteFile(fileName, []byte(s.server.URL), 0644) - c.Assert(err, checker.IsNil) -} - -// check for always allowed endpoints to not inhibit test framework functions -func isAllowed(reqURI string) bool { - for _, endpoint := range alwaysAllowed { - if strings.HasSuffix(reqURI, endpoint) { - return true - } - } - return false -} - -// assertAuthHeaders validates authentication headers are removed -func assertAuthHeaders(c *check.C, headers map[string]string) error { - for k := range headers { - if strings.Contains(strings.ToLower(k), "auth") || strings.Contains(strings.ToLower(k), "x-registry") { - c.Errorf("Found authentication headers in request '%v'", headers) - } - } - return nil -} - -// assertBody asserts that body is removed for non text/json requests -func assertBody(c *check.C, requestURI string, headers map[string]string, body []byte) { - if strings.Contains(strings.ToLower(requestURI), "auth") && len(body) > 0 { - //return fmt.Errorf("Body included for authentication endpoint %s", string(body)) - c.Errorf("Body included for authentication endpoint %s", string(body)) - } - - for k, v := range headers { - if strings.EqualFold(k, "Content-Type") && strings.HasPrefix(v, "text/") || v == "application/json" { - return - } - } - if len(body) > 0 { - c.Errorf("Body included while it should not (Headers: '%v')", headers) - } -} - -func (s *DockerAuthzSuite) TearDownSuite(c *check.C) { - if s.server == nil { - return - } - - s.server.Close() - - err := os.RemoveAll("/etc/docker/plugins") - c.Assert(err, checker.IsNil) -} - -func (s *DockerAuthzSuite) TestAuthZPluginAllowRequest(c *check.C) { - // start the daemon and load busybox, --net=none build fails otherwise - // cause it needs to pull busybox - c.Assert(s.d.Start("--authorization-plugin="+testAuthZPlugin), check.IsNil) - s.ctrl.reqRes.Allow = true - s.ctrl.resRes.Allow = true - c.Assert(s.d.LoadBusybox(), check.IsNil) - - // Ensure command successful - out, err := s.d.Cmd("run", "-d", "busybox", "top") - c.Assert(err, check.IsNil) - - id := strings.TrimSpace(out) - assertURIRecorded(c, s.ctrl.requestsURIs, "/containers/create") - assertURIRecorded(c, s.ctrl.requestsURIs, fmt.Sprintf("/containers/%s/start", id)) - - out, err = s.d.Cmd("ps") - c.Assert(err, check.IsNil) - c.Assert(assertContainerList(out, []string{id}), check.Equals, true) - c.Assert(s.ctrl.psRequestCnt, check.Equals, 1) - c.Assert(s.ctrl.psResponseCnt, check.Equals, 1) -} - -func (s *DockerAuthzSuite) TestAuthZPluginTls(c *check.C) { - - const testDaemonHTTPSAddr = "tcp://localhost:4271" - // start the daemon and load busybox, --net=none build fails otherwise - // cause it needs to pull busybox - if err := s.d.Start( - "--authorization-plugin="+testAuthZPlugin, - "--tlsverify", - "--tlscacert", - "fixtures/https/ca.pem", - "--tlscert", - "fixtures/https/server-cert.pem", - "--tlskey", - "fixtures/https/server-key.pem", - "-H", testDaemonHTTPSAddr); err != nil { - c.Fatalf("Could not start daemon with busybox: %v", err) - } - - s.ctrl.reqRes.Allow = true - s.ctrl.resRes.Allow = true - - out, _ := dockerCmd( - c, - "--tlsverify", - "--tlscacert", "fixtures/https/ca.pem", - "--tlscert", "fixtures/https/client-cert.pem", - "--tlskey", "fixtures/https/client-key.pem", - "-H", - testDaemonHTTPSAddr, - "version", - ) - if !strings.Contains(out, "Server") { - c.Fatalf("docker version should return information of server side") - } - - c.Assert(s.ctrl.reqUser, check.Equals, "client") - c.Assert(s.ctrl.resUser, check.Equals, "client") -} - -func (s *DockerAuthzSuite) TestAuthZPluginDenyRequest(c *check.C) { - err := s.d.Start("--authorization-plugin=" + testAuthZPlugin) - c.Assert(err, check.IsNil) - s.ctrl.reqRes.Allow = false - s.ctrl.reqRes.Msg = unauthorizedMessage - - // Ensure command is blocked - res, err := s.d.Cmd("ps") - c.Assert(err, check.NotNil) - c.Assert(s.ctrl.psRequestCnt, check.Equals, 1) - c.Assert(s.ctrl.psResponseCnt, check.Equals, 0) - - // Ensure unauthorized message appears in response - c.Assert(res, check.Equals, fmt.Sprintf("Error response from daemon: authorization denied by plugin %s: %s\n", testAuthZPlugin, unauthorizedMessage)) -} - -// TestAuthZPluginAPIDenyResponse validates that when authorization plugin deny the request, the status code is forbidden -func (s *DockerAuthzSuite) TestAuthZPluginAPIDenyResponse(c *check.C) { - err := s.d.Start("--authorization-plugin=" + testAuthZPlugin) - c.Assert(err, check.IsNil) - s.ctrl.reqRes.Allow = false - s.ctrl.resRes.Msg = unauthorizedMessage - - daemonURL, err := url.Parse(s.d.sock()) - - conn, err := net.DialTimeout(daemonURL.Scheme, daemonURL.Path, time.Second*10) - c.Assert(err, check.IsNil) - client := httputil.NewClientConn(conn, nil) - req, err := http.NewRequest("GET", "/version", nil) - c.Assert(err, check.IsNil) - resp, err := client.Do(req) - - c.Assert(err, check.IsNil) - c.Assert(resp.StatusCode, checker.Equals, http.StatusForbidden) - c.Assert(err, checker.IsNil) -} - -func (s *DockerAuthzSuite) TestAuthZPluginDenyResponse(c *check.C) { - err := s.d.Start("--authorization-plugin=" + testAuthZPlugin) - c.Assert(err, check.IsNil) - s.ctrl.reqRes.Allow = true - s.ctrl.resRes.Allow = false - s.ctrl.resRes.Msg = unauthorizedMessage - - // Ensure command is blocked - res, err := s.d.Cmd("ps") - c.Assert(err, check.NotNil) - c.Assert(s.ctrl.psRequestCnt, check.Equals, 1) - c.Assert(s.ctrl.psResponseCnt, check.Equals, 1) - - // Ensure unauthorized message appears in response - c.Assert(res, check.Equals, fmt.Sprintf("Error response from daemon: authorization denied by plugin %s: %s\n", testAuthZPlugin, unauthorizedMessage)) -} - -// TestAuthZPluginAllowEventStream verifies event stream propagates correctly after request pass through by the authorization plugin -func (s *DockerAuthzSuite) TestAuthZPluginAllowEventStream(c *check.C) { - testRequires(c, DaemonIsLinux) - - // start the daemon and load busybox to avoid pulling busybox from Docker Hub - c.Assert(s.d.Start("--authorization-plugin="+testAuthZPlugin), check.IsNil) - s.ctrl.reqRes.Allow = true - s.ctrl.resRes.Allow = true - c.Assert(s.d.LoadBusybox(), check.IsNil) - - startTime := strconv.FormatInt(daemonTime(c).Unix(), 10) - // Add another command to to enable event pipelining - eventsCmd := exec.Command(dockerBinary, "--host", s.d.sock(), "events", "--since", startTime) - stdout, err := eventsCmd.StdoutPipe() - if err != nil { - c.Assert(err, check.IsNil) - } - - observer := eventObserver{ - buffer: new(bytes.Buffer), - command: eventsCmd, - scanner: bufio.NewScanner(stdout), - startTime: startTime, - } - - err = observer.Start() - c.Assert(err, checker.IsNil) - defer observer.Stop() - - // Create a container and wait for the creation events - out, err := s.d.Cmd("run", "-d", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf(out)) - containerID := strings.TrimSpace(out) - c.Assert(s.d.waitRun(containerID), checker.IsNil) - - events := map[string]chan bool{ - "create": make(chan bool, 1), - "start": make(chan bool, 1), - } - - matcher := matchEventLine(containerID, "container", events) - processor := processEventMatch(events) - go observer.Match(matcher, processor) - - // Ensure all events are received - for event, eventChannel := range events { - - select { - case <-time.After(30 * time.Second): - // Fail the test - observer.CheckEventError(c, containerID, event, matcher) - c.FailNow() - case <-eventChannel: - // Ignore, event received - } - } - - // Ensure both events and container endpoints are passed to the authorization plugin - assertURIRecorded(c, s.ctrl.requestsURIs, "/events") - assertURIRecorded(c, s.ctrl.requestsURIs, "/containers/create") - assertURIRecorded(c, s.ctrl.requestsURIs, fmt.Sprintf("/containers/%s/start", containerID)) -} - -func (s *DockerAuthzSuite) TestAuthZPluginErrorResponse(c *check.C) { - err := s.d.Start("--authorization-plugin=" + testAuthZPlugin) - c.Assert(err, check.IsNil) - s.ctrl.reqRes.Allow = true - s.ctrl.resRes.Err = errorMessage - - // Ensure command is blocked - res, err := s.d.Cmd("ps") - c.Assert(err, check.NotNil) - - c.Assert(res, check.Equals, fmt.Sprintf("Error response from daemon: plugin %s failed with error: %s: %s\n", testAuthZPlugin, authorization.AuthZApiResponse, errorMessage)) -} - -func (s *DockerAuthzSuite) TestAuthZPluginErrorRequest(c *check.C) { - err := s.d.Start("--authorization-plugin=" + testAuthZPlugin) - c.Assert(err, check.IsNil) - s.ctrl.reqRes.Err = errorMessage - - // Ensure command is blocked - res, err := s.d.Cmd("ps") - c.Assert(err, check.NotNil) - - c.Assert(res, check.Equals, fmt.Sprintf("Error response from daemon: plugin %s failed with error: %s: %s\n", testAuthZPlugin, authorization.AuthZApiRequest, errorMessage)) -} - -func (s *DockerAuthzSuite) TestAuthZPluginEnsureNoDuplicatePluginRegistration(c *check.C) { - c.Assert(s.d.Start("--authorization-plugin="+testAuthZPlugin, "--authorization-plugin="+testAuthZPlugin), check.IsNil) - - s.ctrl.reqRes.Allow = true - s.ctrl.resRes.Allow = true - - out, err := s.d.Cmd("ps") - c.Assert(err, check.IsNil, check.Commentf(out)) - - // assert plugin is only called once.. - c.Assert(s.ctrl.psRequestCnt, check.Equals, 1) - c.Assert(s.ctrl.psResponseCnt, check.Equals, 1) -} - -func (s *DockerAuthzSuite) TestAuthZPluginEnsureLoadImportWorking(c *check.C) { - c.Assert(s.d.Start("--authorization-plugin="+testAuthZPlugin, "--authorization-plugin="+testAuthZPlugin), check.IsNil) - s.ctrl.reqRes.Allow = true - s.ctrl.resRes.Allow = true - c.Assert(s.d.LoadBusybox(), check.IsNil) - - tmp, err := ioutil.TempDir("", "test-authz-load-import") - c.Assert(err, check.IsNil) - defer os.RemoveAll(tmp) - - savedImagePath := filepath.Join(tmp, "save.tar") - - out, err := s.d.Cmd("save", "-o", savedImagePath, "busybox") - c.Assert(err, check.IsNil, check.Commentf(out)) - out, err = s.d.Cmd("load", "--input", savedImagePath) - c.Assert(err, check.IsNil, check.Commentf(out)) - - exportedImagePath := filepath.Join(tmp, "export.tar") - - out, err = s.d.Cmd("run", "-d", "--name", "testexport", "busybox") - c.Assert(err, check.IsNil, check.Commentf(out)) - out, err = s.d.Cmd("export", "-o", exportedImagePath, "testexport") - c.Assert(err, check.IsNil, check.Commentf(out)) - out, err = s.d.Cmd("import", exportedImagePath) - c.Assert(err, check.IsNil, check.Commentf(out)) -} - -func (s *DockerAuthzSuite) TestAuthZPluginHeader(c *check.C) { - c.Assert(s.d.Start("--debug", "--authorization-plugin="+testAuthZPlugin), check.IsNil) - s.ctrl.reqRes.Allow = true - s.ctrl.resRes.Allow = true - c.Assert(s.d.LoadBusybox(), check.IsNil) - - daemonURL, err := url.Parse(s.d.sock()) - - conn, err := net.DialTimeout(daemonURL.Scheme, daemonURL.Path, time.Second*10) - c.Assert(err, check.IsNil) - client := httputil.NewClientConn(conn, nil) - req, err := http.NewRequest("GET", "/version", nil) - c.Assert(err, check.IsNil) - resp, err := client.Do(req) - - c.Assert(err, check.IsNil) - c.Assert(resp.Header["Content-Type"][0], checker.Equals, "application/json") -} - -// assertURIRecorded verifies that the given URI was sent and recorded in the authz plugin -func assertURIRecorded(c *check.C, uris []string, uri string) { - var found bool - for _, u := range uris { - if strings.Contains(u, uri) { - found = true - break - } - } - if !found { - c.Fatalf("Expected to find URI '%s', recorded uris '%s'", uri, strings.Join(uris, ",")) - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_build_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_build_test.go deleted file mode 100644 index 49c1062c2..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_build_test.go +++ /dev/null @@ -1,7392 +0,0 @@ -package main - -import ( - "archive/tar" - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "reflect" - "regexp" - "runtime" - "strconv" - "strings" - "text/template" - "time" - - "github.com/docker/docker/builder/dockerfile/command" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/docker/docker/pkg/stringutils" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestBuildJSONEmptyRun(c *check.C) { - name := "testbuildjsonemptyrun" - - _, err := buildImage( - name, - ` - FROM busybox - RUN [] - `, - true) - - if err != nil { - c.Fatal("error when dealing with a RUN statement with empty JSON array") - } - -} - -func (s *DockerSuite) TestBuildShCmdJSONEntrypoint(c *check.C) { - name := "testbuildshcmdjsonentrypoint" - - _, err := buildImage( - name, - ` - FROM busybox - ENTRYPOINT ["echo"] - CMD echo test - `, - true) - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "run", "--rm", name) - - if daemonPlatform == "windows" { - if !strings.Contains(out, "cmd /S /C echo test") { - c.Fatalf("CMD did not contain cmd /S /C echo test : %q", out) - } - } else { - if strings.TrimSpace(out) != "/bin/sh -c echo test" { - c.Fatalf("CMD did not contain /bin/sh -c : %q", out) - } - } - -} - -func (s *DockerSuite) TestBuildEnvironmentReplacementUser(c *check.C) { - // Windows does not support FROM scratch or the USER command - testRequires(c, DaemonIsLinux) - name := "testbuildenvironmentreplacement" - - _, err := buildImage(name, ` - FROM scratch - ENV user foo - USER ${user} - `, true) - if err != nil { - c.Fatal(err) - } - - res := inspectFieldJSON(c, name, "Config.User") - - if res != `"foo"` { - c.Fatal("User foo from environment not in Config.User on image") - } - -} - -func (s *DockerSuite) TestBuildEnvironmentReplacementVolume(c *check.C) { - name := "testbuildenvironmentreplacement" - - var volumePath string - - if daemonPlatform == "windows" { - volumePath = "c:/quux" - } else { - volumePath = "/quux" - } - - _, err := buildImage(name, ` - FROM `+minimalBaseImage()+` - ENV volume `+volumePath+` - VOLUME ${volume} - `, true) - if err != nil { - c.Fatal(err) - } - - res := inspectFieldJSON(c, name, "Config.Volumes") - - var volumes map[string]interface{} - - if err := json.Unmarshal([]byte(res), &volumes); err != nil { - c.Fatal(err) - } - - if _, ok := volumes[volumePath]; !ok { - c.Fatal("Volume " + volumePath + " from environment not in Config.Volumes on image") - } - -} - -func (s *DockerSuite) TestBuildEnvironmentReplacementExpose(c *check.C) { - // Windows does not support FROM scratch or the EXPOSE command - testRequires(c, DaemonIsLinux) - name := "testbuildenvironmentreplacement" - - _, err := buildImage(name, ` - FROM scratch - ENV port 80 - EXPOSE ${port} - ENV ports " 99 100 " - EXPOSE ${ports} - `, true) - if err != nil { - c.Fatal(err) - } - - res := inspectFieldJSON(c, name, "Config.ExposedPorts") - - var exposedPorts map[string]interface{} - - if err := json.Unmarshal([]byte(res), &exposedPorts); err != nil { - c.Fatal(err) - } - - exp := []int{80, 99, 100} - - for _, p := range exp { - tmp := fmt.Sprintf("%d/tcp", p) - if _, ok := exposedPorts[tmp]; !ok { - c.Fatalf("Exposed port %d from environment not in Config.ExposedPorts on image", p) - } - } - -} - -func (s *DockerSuite) TestBuildEnvironmentReplacementWorkdir(c *check.C) { - name := "testbuildenvironmentreplacement" - - _, err := buildImage(name, ` - FROM busybox - ENV MYWORKDIR /work - RUN mkdir ${MYWORKDIR} - WORKDIR ${MYWORKDIR} - `, true) - - if err != nil { - c.Fatal(err) - } - -} - -func (s *DockerSuite) TestBuildEnvironmentReplacementAddCopy(c *check.C) { - name := "testbuildenvironmentreplacement" - - ctx, err := fakeContext(` - FROM `+minimalBaseImage()+` - ENV baz foo - ENV quux bar - ENV dot . - ENV fee fff - ENV gee ggg - - ADD ${baz} ${dot} - COPY ${quux} ${dot} - ADD ${zzz:-${fee}} ${dot} - COPY ${zzz:-${gee}} ${dot} - `, - map[string]string{ - "foo": "test1", - "bar": "test2", - "fff": "test3", - "ggg": "test4", - }) - - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } - -} - -func (s *DockerSuite) TestBuildEnvironmentReplacementEnv(c *check.C) { - // ENV expansions work differently in Windows - testRequires(c, DaemonIsLinux) - name := "testbuildenvironmentreplacement" - - _, err := buildImage(name, - ` - FROM busybox - ENV foo zzz - ENV bar ${foo} - ENV abc1='$foo' - ENV env1=$foo env2=${foo} env3="$foo" env4="${foo}" - RUN [ "$abc1" = '$foo' ] && (echo "$abc1" | grep -q foo) - ENV abc2="\$foo" - RUN [ "$abc2" = '$foo' ] && (echo "$abc2" | grep -q foo) - ENV abc3 '$foo' - RUN [ "$abc3" = '$foo' ] && (echo "$abc3" | grep -q foo) - ENV abc4 "\$foo" - RUN [ "$abc4" = '$foo' ] && (echo "$abc4" | grep -q foo) - `, true) - - if err != nil { - c.Fatal(err) - } - - res := inspectFieldJSON(c, name, "Config.Env") - - envResult := []string{} - - if err = json.Unmarshal([]byte(res), &envResult); err != nil { - c.Fatal(err) - } - - found := false - envCount := 0 - - for _, env := range envResult { - parts := strings.SplitN(env, "=", 2) - if parts[0] == "bar" { - found = true - if parts[1] != "zzz" { - c.Fatalf("Could not find replaced var for env `bar`: got %q instead of `zzz`", parts[1]) - } - } else if strings.HasPrefix(parts[0], "env") { - envCount++ - if parts[1] != "zzz" { - c.Fatalf("%s should be 'foo' but instead its %q", parts[0], parts[1]) - } - } else if strings.HasPrefix(parts[0], "env") { - envCount++ - if parts[1] != "foo" { - c.Fatalf("%s should be 'foo' but instead its %q", parts[0], parts[1]) - } - } - } - - if !found { - c.Fatal("Never found the `bar` env variable") - } - - if envCount != 4 { - c.Fatalf("Didn't find all env vars - only saw %d\n%s", envCount, envResult) - } - -} - -func (s *DockerSuite) TestBuildHandleEscapes(c *check.C) { - // The volume paths used in this test are invalid on Windows - testRequires(c, DaemonIsLinux) - name := "testbuildhandleescapes" - - _, err := buildImage(name, - ` - FROM scratch - ENV FOO bar - VOLUME ${FOO} - `, true) - - if err != nil { - c.Fatal(err) - } - - var result map[string]map[string]struct{} - - res := inspectFieldJSON(c, name, "Config.Volumes") - - if err = json.Unmarshal([]byte(res), &result); err != nil { - c.Fatal(err) - } - - if _, ok := result["bar"]; !ok { - c.Fatalf("Could not find volume bar set from env foo in volumes table, got %q", result) - } - - deleteImages(name) - - _, err = buildImage(name, - ` - FROM scratch - ENV FOO bar - VOLUME \${FOO} - `, true) - - if err != nil { - c.Fatal(err) - } - - res = inspectFieldJSON(c, name, "Config.Volumes") - - if err = json.Unmarshal([]byte(res), &result); err != nil { - c.Fatal(err) - } - - if _, ok := result["${FOO}"]; !ok { - c.Fatalf("Could not find volume ${FOO} set from env foo in volumes table, got %q", result) - } - - deleteImages(name) - - // this test in particular provides *7* backslashes and expects 6 to come back. - // Like above, the first escape is swallowed and the rest are treated as - // literals, this one is just less obvious because of all the character noise. - - _, err = buildImage(name, - ` - FROM scratch - ENV FOO bar - VOLUME \\\\\\\${FOO} - `, true) - - if err != nil { - c.Fatal(err) - } - - res = inspectFieldJSON(c, name, "Config.Volumes") - - if err = json.Unmarshal([]byte(res), &result); err != nil { - c.Fatal(err) - } - - if _, ok := result[`\\\${FOO}`]; !ok { - c.Fatalf(`Could not find volume \\\${FOO} set from env foo in volumes table, got %q`, result) - } - -} - -func (s *DockerSuite) TestBuildOnBuildLowercase(c *check.C) { - name := "testbuildonbuildlowercase" - name2 := "testbuildonbuildlowercase2" - - _, err := buildImage(name, - ` - FROM busybox - onbuild run echo quux - `, true) - - if err != nil { - c.Fatal(err) - } - - _, out, err := buildImageWithOut(name2, fmt.Sprintf(` - FROM %s - `, name), true) - - if err != nil { - c.Fatal(err) - } - - if !strings.Contains(out, "quux") { - c.Fatalf("Did not receive the expected echo text, got %s", out) - } - - if strings.Contains(out, "ONBUILD ONBUILD") { - c.Fatalf("Got an ONBUILD ONBUILD error with no error: got %s", out) - } - -} - -func (s *DockerSuite) TestBuildEnvEscapes(c *check.C) { - // ENV expansions work differently in Windows - testRequires(c, DaemonIsLinux) - name := "testbuildenvescapes" - _, err := buildImage(name, - ` - FROM busybox - ENV TEST foo - CMD echo \$ - `, - true) - - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "run", "-t", name) - - if strings.TrimSpace(out) != "$" { - c.Fatalf("Env TEST was not overwritten with bar when foo was supplied to dockerfile: was %q", strings.TrimSpace(out)) - } - -} - -func (s *DockerSuite) TestBuildEnvOverwrite(c *check.C) { - // ENV expansions work differently in Windows - testRequires(c, DaemonIsLinux) - name := "testbuildenvoverwrite" - - _, err := buildImage(name, - ` - FROM busybox - ENV TEST foo - CMD echo ${TEST} - `, - true) - - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "run", "-e", "TEST=bar", "-t", name) - - if strings.TrimSpace(out) != "bar" { - c.Fatalf("Env TEST was not overwritten with bar when foo was supplied to dockerfile: was %q", strings.TrimSpace(out)) - } - -} - -func (s *DockerSuite) TestBuildOnBuildCmdEntrypointJSON(c *check.C) { - name1 := "onbuildcmd" - name2 := "onbuildgenerated" - - _, err := buildImage(name1, ` -FROM busybox -ONBUILD CMD ["hello world"] -ONBUILD ENTRYPOINT ["echo"] -ONBUILD RUN ["true"]`, - false) - - if err != nil { - c.Fatal(err) - } - - _, err = buildImage(name2, fmt.Sprintf(`FROM %s`, name1), false) - - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "run", name2) - - if !regexp.MustCompile(`(?m)^hello world`).MatchString(out) { - c.Fatalf("did not get echo output from onbuild. Got: %q", out) - } - -} - -func (s *DockerSuite) TestBuildOnBuildEntrypointJSON(c *check.C) { - name1 := "onbuildcmd" - name2 := "onbuildgenerated" - - _, err := buildImage(name1, ` -FROM busybox -ONBUILD ENTRYPOINT ["echo"]`, - false) - - if err != nil { - c.Fatal(err) - } - - _, err = buildImage(name2, fmt.Sprintf("FROM %s\nCMD [\"hello world\"]\n", name1), false) - - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "run", name2) - - if !regexp.MustCompile(`(?m)^hello world`).MatchString(out) { - c.Fatal("got malformed output from onbuild", out) - } - -} - -func (s *DockerSuite) TestBuildCacheAdd(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows doesn't have httpserver image yet - name := "testbuildtwoimageswithadd" - server, err := fakeStorage(map[string]string{ - "robots.txt": "hello", - "index.html": "world", - }) - if err != nil { - c.Fatal(err) - } - defer server.Close() - - if _, err := buildImage(name, - fmt.Sprintf(`FROM scratch - ADD %s/robots.txt /`, server.URL()), - true); err != nil { - c.Fatal(err) - } - if err != nil { - c.Fatal(err) - } - deleteImages(name) - _, out, err := buildImageWithOut(name, - fmt.Sprintf(`FROM scratch - ADD %s/index.html /`, server.URL()), - true) - if err != nil { - c.Fatal(err) - } - if strings.Contains(out, "Using cache") { - c.Fatal("2nd build used cache on ADD, it shouldn't") - } - -} - -func (s *DockerSuite) TestBuildLastModified(c *check.C) { - name := "testbuildlastmodified" - - server, err := fakeStorage(map[string]string{ - "file": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer server.Close() - - var out, out2 string - - dFmt := `FROM busybox -ADD %s/file /` - - dockerfile := fmt.Sprintf(dFmt, server.URL()) - - if _, _, err = buildImageWithOut(name, dockerfile, false); err != nil { - c.Fatal(err) - } - - out, _ = dockerCmd(c, "run", name, "ls", "-le", "/file") - - // Build it again and make sure the mtime of the file didn't change. - // Wait a few seconds to make sure the time changed enough to notice - time.Sleep(2 * time.Second) - - if _, _, err = buildImageWithOut(name, dockerfile, false); err != nil { - c.Fatal(err) - } - out2, _ = dockerCmd(c, "run", name, "ls", "-le", "/file") - - if out != out2 { - c.Fatalf("MTime changed:\nOrigin:%s\nNew:%s", out, out2) - } - - // Now 'touch' the file and make sure the timestamp DID change this time - // Create a new fakeStorage instead of just using Add() to help windows - server, err = fakeStorage(map[string]string{ - "file": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer server.Close() - - dockerfile = fmt.Sprintf(dFmt, server.URL()) - - if _, _, err = buildImageWithOut(name, dockerfile, false); err != nil { - c.Fatal(err) - } - out2, _ = dockerCmd(c, "run", name, "ls", "-le", "/file") - - if out == out2 { - c.Fatalf("MTime didn't change:\nOrigin:%s\nNew:%s", out, out2) - } - -} - -// Regression for https://github.com/docker/docker/pull/27805 -// Makes sure that we don't use the cache if the contents of -// a file in a subfolder of the context is modified and we re-build. -func (s *DockerSuite) TestBuildModifyFileInFolder(c *check.C) { - name := "testbuildmodifyfileinfolder" - - ctx, err := fakeContext(`FROM busybox -RUN ["mkdir", "/test"] -ADD folder/file /test/changetarget`, - map[string]string{}) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - if err := ctx.Add("folder/file", "first"); err != nil { - c.Fatal(err) - } - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - if err := ctx.Add("folder/file", "second"); err != nil { - c.Fatal(err) - } - id2, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - if id1 == id2 { - c.Fatal("cache was used even though file contents in folder was changed") - } -} - -func (s *DockerSuite) TestBuildAddSingleFileToRoot(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testaddimg" - ctx, err := fakeContext(fmt.Sprintf(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN touch /exists -RUN chown dockerio.dockerio /exists -ADD test_file / -RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /test_file | awk '{print $1}') = '%s' ] -RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod), - map[string]string{ - "test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -// Issue #3960: "ADD src ." hangs -func (s *DockerSuite) TestBuildAddSingleFileToWorkdir(c *check.C) { - name := "testaddsinglefiletoworkdir" - ctx, err := fakeContext(`FROM busybox -ADD test_file .`, - map[string]string{ - "test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - errChan := make(chan error) - go func() { - _, err := buildImageFromContext(name, ctx, true) - errChan <- err - close(errChan) - }() - select { - case <-time.After(15 * time.Second): - c.Fatal("Build with adding to workdir timed out") - case err := <-errChan: - c.Assert(err, check.IsNil) - } -} - -func (s *DockerSuite) TestBuildAddSingleFileToExistDir(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testaddsinglefiletoexistdir" - ctx, err := fakeContext(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN mkdir /exists -RUN touch /exists/exists_file -RUN chown -R dockerio.dockerio /exists -ADD test_file /exists/ -RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ] -RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, - map[string]string{ - "test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildCopyAddMultipleFiles(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - server, err := fakeStorage(map[string]string{ - "robots.txt": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer server.Close() - - name := "testcopymultiplefilestofile" - ctx, err := fakeContext(fmt.Sprintf(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN mkdir /exists -RUN touch /exists/exists_file -RUN chown -R dockerio.dockerio /exists -COPY test_file1 test_file2 /exists/ -ADD test_file3 test_file4 %s/robots.txt /exists/ -RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ] -RUN [ $(ls -l /exists/test_file1 | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /exists/test_file2 | awk '{print $3":"$4}') = 'root:root' ] - -RUN [ $(ls -l /exists/test_file3 | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /exists/test_file4 | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /exists/robots.txt | awk '{print $3":"$4}') = 'root:root' ] - -RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ] -`, server.URL()), - map[string]string{ - "test_file1": "test1", - "test_file2": "test2", - "test_file3": "test3", - "test_file4": "test4", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -// This test is mainly for user namespaces to verify that new directories -// are created as the remapped root uid/gid pair -func (s *DockerSuite) TestBuildAddToNewDestination(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testaddtonewdest" - ctx, err := fakeContext(`FROM busybox -ADD . /new_dir -RUN ls -l / -RUN [ $(ls -l / | grep new_dir | awk '{print $3":"$4}') = 'root:root' ]`, - map[string]string{ - "test_dir/test_file": "test file", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -// This test is mainly for user namespaces to verify that new directories -// are created as the remapped root uid/gid pair -func (s *DockerSuite) TestBuildCopyToNewParentDirectory(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testcopytonewdir" - ctx, err := fakeContext(`FROM busybox -COPY test_dir /new_dir -RUN ls -l /new_dir -RUN [ $(ls -l / | grep new_dir | awk '{print $3":"$4}') = 'root:root' ]`, - map[string]string{ - "test_dir/test_file": "test file", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -// This test is mainly for user namespaces to verify that new directories -// are created as the remapped root uid/gid pair -func (s *DockerSuite) TestBuildWorkdirIsContainerRoot(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testworkdirownership" - if _, err := buildImage(name, `FROM busybox -WORKDIR /new_dir -RUN ls -l / -RUN [ $(ls -l / | grep new_dir | awk '{print $3":"$4}') = 'root:root' ]`, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildAddFileWithWhitespace(c *check.C) { - testRequires(c, DaemonIsLinux) // Not currently passing on Windows - name := "testaddfilewithwhitespace" - ctx, err := fakeContext(`FROM busybox -RUN mkdir "/test dir" -RUN mkdir "/test_dir" -ADD [ "test file1", "/test_file1" ] -ADD [ "test_file2", "/test file2" ] -ADD [ "test file3", "/test file3" ] -ADD [ "test dir/test_file4", "/test_dir/test_file4" ] -ADD [ "test_dir/test_file5", "/test dir/test_file5" ] -ADD [ "test dir/test_file6", "/test dir/test_file6" ] -RUN [ $(cat "/test_file1") = 'test1' ] -RUN [ $(cat "/test file2") = 'test2' ] -RUN [ $(cat "/test file3") = 'test3' ] -RUN [ $(cat "/test_dir/test_file4") = 'test4' ] -RUN [ $(cat "/test dir/test_file5") = 'test5' ] -RUN [ $(cat "/test dir/test_file6") = 'test6' ]`, - map[string]string{ - "test file1": "test1", - "test_file2": "test2", - "test file3": "test3", - "test dir/test_file4": "test4", - "test_dir/test_file5": "test5", - "test dir/test_file6": "test6", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildCopyFileWithWhitespace(c *check.C) { - dockerfile := `FROM busybox -RUN mkdir "/test dir" -RUN mkdir "/test_dir" -COPY [ "test file1", "/test_file1" ] -COPY [ "test_file2", "/test file2" ] -COPY [ "test file3", "/test file3" ] -COPY [ "test dir/test_file4", "/test_dir/test_file4" ] -COPY [ "test_dir/test_file5", "/test dir/test_file5" ] -COPY [ "test dir/test_file6", "/test dir/test_file6" ] -RUN [ $(cat "/test_file1") = 'test1' ] -RUN [ $(cat "/test file2") = 'test2' ] -RUN [ $(cat "/test file3") = 'test3' ] -RUN [ $(cat "/test_dir/test_file4") = 'test4' ] -RUN [ $(cat "/test dir/test_file5") = 'test5' ] -RUN [ $(cat "/test dir/test_file6") = 'test6' ]` - - if daemonPlatform == "windows" { - dockerfile = `FROM ` + WindowsBaseImage + ` -RUN mkdir "C:/test dir" -RUN mkdir "C:/test_dir" -COPY [ "test file1", "/test_file1" ] -COPY [ "test_file2", "/test file2" ] -COPY [ "test file3", "/test file3" ] -COPY [ "test dir/test_file4", "/test_dir/test_file4" ] -COPY [ "test_dir/test_file5", "/test dir/test_file5" ] -COPY [ "test dir/test_file6", "/test dir/test_file6" ] -RUN find "test1" "C:/test_file1" -RUN find "test2" "C:/test file2" -RUN find "test3" "C:/test file3" -RUN find "test4" "C:/test_dir/test_file4" -RUN find "test5" "C:/test dir/test_file5" -RUN find "test6" "C:/test dir/test_file6"` - } - - name := "testcopyfilewithwhitespace" - ctx, err := fakeContext(dockerfile, - map[string]string{ - "test file1": "test1", - "test_file2": "test2", - "test file3": "test3", - "test dir/test_file4": "test4", - "test_dir/test_file5": "test5", - "test dir/test_file6": "test6", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildCopyWildcard(c *check.C) { - name := "testcopywildcard" - server, err := fakeStorage(map[string]string{ - "robots.txt": "hello", - "index.html": "world", - }) - if err != nil { - c.Fatal(err) - } - defer server.Close() - - ctx, err := fakeContext(fmt.Sprintf(`FROM busybox - COPY file*.txt /tmp/ - RUN ls /tmp/file1.txt /tmp/file2.txt - RUN [ "mkdir", "/tmp1" ] - COPY dir* /tmp1/ - RUN ls /tmp1/dirt /tmp1/nested_file /tmp1/nested_dir/nest_nest_file - RUN [ "mkdir", "/tmp2" ] - ADD dir/*dir %s/robots.txt /tmp2/ - RUN ls /tmp2/nest_nest_file /tmp2/robots.txt - `, server.URL()), - map[string]string{ - "file1.txt": "test1", - "file2.txt": "test2", - "dir/nested_file": "nested file", - "dir/nested_dir/nest_nest_file": "2 times nested", - "dirt": "dirty", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - - // Now make sure we use a cache the 2nd time - id2, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - - if id1 != id2 { - c.Fatal("didn't use the cache") - } - -} - -func (s *DockerSuite) TestBuildCopyWildcardInName(c *check.C) { - name := "testcopywildcardinname" - ctx, err := fakeContext(`FROM busybox - COPY *.txt /tmp/ - RUN [ "$(cat /tmp/\*.txt)" = 'hi there' ] - `, map[string]string{"*.txt": "hi there"}) - - if err != nil { - // Normally we would do c.Fatal(err) here but given that - // the odds of this failing are so rare, it must be because - // the OS we're running the client on doesn't support * in - // filenames (like windows). So, instead of failing the test - // just let it pass. Then we don't need to explicitly - // say which OSs this works on or not. - return - } - defer ctx.Close() - - _, err = buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatalf("should have built: %q", err) - } -} - -func (s *DockerSuite) TestBuildCopyWildcardCache(c *check.C) { - name := "testcopywildcardcache" - ctx, err := fakeContext(`FROM busybox - COPY file1.txt /tmp/`, - map[string]string{ - "file1.txt": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - - // Now make sure we use a cache the 2nd time even with wild cards. - // Use the same context so the file is the same and the checksum will match - ctx.Add("Dockerfile", `FROM busybox - COPY file*.txt /tmp/`) - - id2, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - - if id1 != id2 { - c.Fatal("didn't use the cache") - } - -} - -func (s *DockerSuite) TestBuildAddSingleFileToNonExistingDir(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testaddsinglefiletononexistingdir" - ctx, err := fakeContext(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN touch /exists -RUN chown dockerio.dockerio /exists -ADD test_file /test_dir/ -RUN [ $(ls -l / | grep test_dir | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, - map[string]string{ - "test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } - -} - -func (s *DockerSuite) TestBuildAddDirContentToRoot(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testadddircontenttoroot" - ctx, err := fakeContext(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN touch /exists -RUN chown dockerio.dockerio exists -ADD test_dir / -RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, - map[string]string{ - "test_dir/test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildAddDirContentToExistingDir(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testadddircontenttoexistingdir" - ctx, err := fakeContext(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN mkdir /exists -RUN touch /exists/exists_file -RUN chown -R dockerio.dockerio /exists -ADD test_dir/ /exists/ -RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ] -RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ] -RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ]`, - map[string]string{ - "test_dir/test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildAddWholeDirToRoot(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testaddwholedirtoroot" - ctx, err := fakeContext(fmt.Sprintf(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN touch /exists -RUN chown dockerio.dockerio exists -ADD test_dir /test_dir -RUN [ $(ls -l / | grep test_dir | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l / | grep test_dir | awk '{print $1}') = 'drwxr-xr-x' ] -RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /test_dir/test_file | awk '{print $1}') = '%s' ] -RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod), - map[string]string{ - "test_dir/test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -// Testing #5941 -func (s *DockerSuite) TestBuildAddEtcToRoot(c *check.C) { - name := "testaddetctoroot" - - ctx, err := fakeContext(`FROM `+minimalBaseImage()+` -ADD . /`, - map[string]string{ - "etc/test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -// Testing #9401 -func (s *DockerSuite) TestBuildAddPreservesFilesSpecialBits(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testaddpreservesfilesspecialbits" - ctx, err := fakeContext(`FROM busybox -ADD suidbin /usr/bin/suidbin -RUN chmod 4755 /usr/bin/suidbin -RUN [ $(ls -l /usr/bin/suidbin | awk '{print $1}') = '-rwsr-xr-x' ] -ADD ./data/ / -RUN [ $(ls -l /usr/bin/suidbin | awk '{print $1}') = '-rwsr-xr-x' ]`, - map[string]string{ - "suidbin": "suidbin", - "/data/usr/test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildCopySingleFileToRoot(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testcopysinglefiletoroot" - ctx, err := fakeContext(fmt.Sprintf(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN touch /exists -RUN chown dockerio.dockerio /exists -COPY test_file / -RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /test_file | awk '{print $1}') = '%s' ] -RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod), - map[string]string{ - "test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -// Issue #3960: "ADD src ." hangs - adapted for COPY -func (s *DockerSuite) TestBuildCopySingleFileToWorkdir(c *check.C) { - name := "testcopysinglefiletoworkdir" - ctx, err := fakeContext(`FROM busybox -COPY test_file .`, - map[string]string{ - "test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - errChan := make(chan error) - go func() { - _, err := buildImageFromContext(name, ctx, true) - errChan <- err - close(errChan) - }() - select { - case <-time.After(15 * time.Second): - c.Fatal("Build with adding to workdir timed out") - case err := <-errChan: - c.Assert(err, check.IsNil) - } -} - -func (s *DockerSuite) TestBuildCopySingleFileToExistDir(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testcopysinglefiletoexistdir" - ctx, err := fakeContext(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN mkdir /exists -RUN touch /exists/exists_file -RUN chown -R dockerio.dockerio /exists -COPY test_file /exists/ -RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ] -RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, - map[string]string{ - "test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildCopySingleFileToNonExistDir(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testcopysinglefiletononexistdir" - ctx, err := fakeContext(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN touch /exists -RUN chown dockerio.dockerio /exists -COPY test_file /test_dir/ -RUN [ $(ls -l / | grep test_dir | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, - map[string]string{ - "test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildCopyDirContentToRoot(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testcopydircontenttoroot" - ctx, err := fakeContext(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN touch /exists -RUN chown dockerio.dockerio exists -COPY test_dir / -RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, - map[string]string{ - "test_dir/test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildCopyDirContentToExistDir(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testcopydircontenttoexistdir" - ctx, err := fakeContext(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN mkdir /exists -RUN touch /exists/exists_file -RUN chown -R dockerio.dockerio /exists -COPY test_dir/ /exists/ -RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ] -RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ] -RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ]`, - map[string]string{ - "test_dir/test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildCopyWholeDirToRoot(c *check.C) { - testRequires(c, DaemonIsLinux) // Linux specific test - name := "testcopywholedirtoroot" - ctx, err := fakeContext(fmt.Sprintf(`FROM busybox -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd -RUN echo 'dockerio:x:1001:' >> /etc/group -RUN touch /exists -RUN chown dockerio.dockerio exists -COPY test_dir /test_dir -RUN [ $(ls -l / | grep test_dir | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l / | grep test_dir | awk '{print $1}') = 'drwxr-xr-x' ] -RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ] -RUN [ $(ls -l /test_dir/test_file | awk '{print $1}') = '%s' ] -RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`, expectedFileChmod), - map[string]string{ - "test_dir/test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildCopyEtcToRoot(c *check.C) { - name := "testcopyetctoroot" - - ctx, err := fakeContext(`FROM `+minimalBaseImage()+` -COPY . /`, - map[string]string{ - "etc/test_file": "test1", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildAddBadLinks(c *check.C) { - testRequires(c, DaemonIsLinux) // Not currently working on Windows - - dockerfile := ` - FROM scratch - ADD links.tar / - ADD foo.txt /symlink/ - ` - targetFile := "foo.txt" - var ( - name = "test-link-absolute" - ) - ctx, err := fakeContext(dockerfile, nil) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - tempDir, err := ioutil.TempDir("", "test-link-absolute-temp-") - if err != nil { - c.Fatalf("failed to create temporary directory: %s", tempDir) - } - defer os.RemoveAll(tempDir) - - var symlinkTarget string - if runtime.GOOS == "windows" { - var driveLetter string - if abs, err := filepath.Abs(tempDir); err != nil { - c.Fatal(err) - } else { - driveLetter = abs[:1] - } - tempDirWithoutDrive := tempDir[2:] - symlinkTarget = fmt.Sprintf(`%s:\..\..\..\..\..\..\..\..\..\..\..\..%s`, driveLetter, tempDirWithoutDrive) - } else { - symlinkTarget = fmt.Sprintf("/../../../../../../../../../../../..%s", tempDir) - } - - tarPath := filepath.Join(ctx.Dir, "links.tar") - nonExistingFile := filepath.Join(tempDir, targetFile) - fooPath := filepath.Join(ctx.Dir, targetFile) - - tarOut, err := os.Create(tarPath) - if err != nil { - c.Fatal(err) - } - - tarWriter := tar.NewWriter(tarOut) - - header := &tar.Header{ - Name: "symlink", - Typeflag: tar.TypeSymlink, - Linkname: symlinkTarget, - Mode: 0755, - Uid: 0, - Gid: 0, - } - - err = tarWriter.WriteHeader(header) - if err != nil { - c.Fatal(err) - } - - tarWriter.Close() - tarOut.Close() - - foo, err := os.Create(fooPath) - if err != nil { - c.Fatal(err) - } - defer foo.Close() - - if _, err := foo.WriteString("test"); err != nil { - c.Fatal(err) - } - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } - - if _, err := os.Stat(nonExistingFile); err == nil || err != nil && !os.IsNotExist(err) { - c.Fatalf("%s shouldn't have been written and it shouldn't exist", nonExistingFile) - } - -} - -func (s *DockerSuite) TestBuildAddBadLinksVolume(c *check.C) { - testRequires(c, DaemonIsLinux) // ln not implemented on Windows busybox - const ( - dockerfileTemplate = ` - FROM busybox - RUN ln -s /../../../../../../../../%s /x - VOLUME /x - ADD foo.txt /x/` - targetFile = "foo.txt" - ) - var ( - name = "test-link-absolute-volume" - dockerfile = "" - ) - - tempDir, err := ioutil.TempDir("", "test-link-absolute-volume-temp-") - if err != nil { - c.Fatalf("failed to create temporary directory: %s", tempDir) - } - defer os.RemoveAll(tempDir) - - dockerfile = fmt.Sprintf(dockerfileTemplate, tempDir) - nonExistingFile := filepath.Join(tempDir, targetFile) - - ctx, err := fakeContext(dockerfile, nil) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - fooPath := filepath.Join(ctx.Dir, targetFile) - - foo, err := os.Create(fooPath) - if err != nil { - c.Fatal(err) - } - defer foo.Close() - - if _, err := foo.WriteString("test"); err != nil { - c.Fatal(err) - } - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } - - if _, err := os.Stat(nonExistingFile); err == nil || err != nil && !os.IsNotExist(err) { - c.Fatalf("%s shouldn't have been written and it shouldn't exist", nonExistingFile) - } - -} - -// Issue #5270 - ensure we throw a better error than "unexpected EOF" -// when we can't access files in the context. -func (s *DockerSuite) TestBuildWithInaccessibleFilesInContext(c *check.C) { - testRequires(c, DaemonIsLinux, UnixCli) // test uses chown/chmod: not available on windows - - { - name := "testbuildinaccessiblefiles" - ctx, err := fakeContext("FROM scratch\nADD . /foo/", map[string]string{"fileWithoutReadAccess": "foo"}) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - // This is used to ensure we detect inaccessible files early during build in the cli client - pathToFileWithoutReadAccess := filepath.Join(ctx.Dir, "fileWithoutReadAccess") - - if err = os.Chown(pathToFileWithoutReadAccess, 0, 0); err != nil { - c.Fatalf("failed to chown file to root: %s", err) - } - if err = os.Chmod(pathToFileWithoutReadAccess, 0700); err != nil { - c.Fatalf("failed to chmod file to 700: %s", err) - } - buildCmd := exec.Command("su", "unprivilegeduser", "-c", fmt.Sprintf("%s build -t %s .", dockerBinary, name)) - buildCmd.Dir = ctx.Dir - out, _, err := runCommandWithOutput(buildCmd) - if err == nil { - c.Fatalf("build should have failed: %s %s", err, out) - } - - // check if we've detected the failure before we started building - if !strings.Contains(out, "no permission to read from ") { - c.Fatalf("output should've contained the string: no permission to read from but contained: %s", out) - } - - if !strings.Contains(out, "Error checking context") { - c.Fatalf("output should've contained the string: Error checking context") - } - } - { - name := "testbuildinaccessibledirectory" - ctx, err := fakeContext("FROM scratch\nADD . /foo/", map[string]string{"directoryWeCantStat/bar": "foo"}) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - // This is used to ensure we detect inaccessible directories early during build in the cli client - pathToDirectoryWithoutReadAccess := filepath.Join(ctx.Dir, "directoryWeCantStat") - pathToFileInDirectoryWithoutReadAccess := filepath.Join(pathToDirectoryWithoutReadAccess, "bar") - - if err = os.Chown(pathToDirectoryWithoutReadAccess, 0, 0); err != nil { - c.Fatalf("failed to chown directory to root: %s", err) - } - if err = os.Chmod(pathToDirectoryWithoutReadAccess, 0444); err != nil { - c.Fatalf("failed to chmod directory to 444: %s", err) - } - if err = os.Chmod(pathToFileInDirectoryWithoutReadAccess, 0700); err != nil { - c.Fatalf("failed to chmod file to 700: %s", err) - } - - buildCmd := exec.Command("su", "unprivilegeduser", "-c", fmt.Sprintf("%s build -t %s .", dockerBinary, name)) - buildCmd.Dir = ctx.Dir - out, _, err := runCommandWithOutput(buildCmd) - if err == nil { - c.Fatalf("build should have failed: %s %s", err, out) - } - - // check if we've detected the failure before we started building - if !strings.Contains(out, "can't stat") { - c.Fatalf("output should've contained the string: can't access %s", out) - } - - if !strings.Contains(out, "Error checking context") { - c.Fatalf("output should've contained the string: Error checking context\ngot:%s", out) - } - - } - { - name := "testlinksok" - ctx, err := fakeContext("FROM scratch\nADD . /foo/", nil) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - target := "../../../../../../../../../../../../../../../../../../../azA" - if err := os.Symlink(filepath.Join(ctx.Dir, "g"), target); err != nil { - c.Fatal(err) - } - defer os.Remove(target) - // This is used to ensure we don't follow links when checking if everything in the context is accessible - // This test doesn't require that we run commands as an unprivileged user - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } - } - { - name := "testbuildignoredinaccessible" - ctx, err := fakeContext("FROM scratch\nADD . /foo/", - map[string]string{ - "directoryWeCantStat/bar": "foo", - ".dockerignore": "directoryWeCantStat", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - // This is used to ensure we don't try to add inaccessible files when they are ignored by a .dockerignore pattern - pathToDirectoryWithoutReadAccess := filepath.Join(ctx.Dir, "directoryWeCantStat") - pathToFileInDirectoryWithoutReadAccess := filepath.Join(pathToDirectoryWithoutReadAccess, "bar") - if err = os.Chown(pathToDirectoryWithoutReadAccess, 0, 0); err != nil { - c.Fatalf("failed to chown directory to root: %s", err) - } - if err = os.Chmod(pathToDirectoryWithoutReadAccess, 0444); err != nil { - c.Fatalf("failed to chmod directory to 444: %s", err) - } - if err = os.Chmod(pathToFileInDirectoryWithoutReadAccess, 0700); err != nil { - c.Fatalf("failed to chmod file to 700: %s", err) - } - - result := icmd.RunCmd(icmd.Cmd{ - Dir: ctx.Dir, - Command: []string{"su", "unprivilegeduser", "-c", - fmt.Sprintf("%s build -t %s .", dockerBinary, name)}, - }) - result.Assert(c, icmd.Expected{}) - } -} - -func (s *DockerSuite) TestBuildForceRm(c *check.C) { - containerCountBefore, err := getContainerCount() - if err != nil { - c.Fatalf("failed to get the container count: %s", err) - } - name := "testbuildforcerm" - - ctx, err := fakeContext(`FROM `+minimalBaseImage()+` - RUN true - RUN thiswillfail`, nil) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - dockerCmdInDir(c, ctx.Dir, "build", "-t", name, "--force-rm", ".") - - containerCountAfter, err := getContainerCount() - if err != nil { - c.Fatalf("failed to get the container count: %s", err) - } - - if containerCountBefore != containerCountAfter { - c.Fatalf("--force-rm shouldn't have left containers behind") - } - -} - -func (s *DockerSuite) TestBuildRm(c *check.C) { - name := "testbuildrm" - - ctx, err := fakeContext(`FROM `+minimalBaseImage()+` - ADD foo / - ADD foo /`, map[string]string{"foo": "bar"}) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - { - containerCountBefore, err := getContainerCount() - if err != nil { - c.Fatalf("failed to get the container count: %s", err) - } - - out, _, err := dockerCmdInDir(c, ctx.Dir, "build", "--rm", "-t", name, ".") - - if err != nil { - c.Fatal("failed to build the image", out) - } - - containerCountAfter, err := getContainerCount() - if err != nil { - c.Fatalf("failed to get the container count: %s", err) - } - - if containerCountBefore != containerCountAfter { - c.Fatalf("-rm shouldn't have left containers behind") - } - deleteImages(name) - } - - { - containerCountBefore, err := getContainerCount() - if err != nil { - c.Fatalf("failed to get the container count: %s", err) - } - - out, _, err := dockerCmdInDir(c, ctx.Dir, "build", "-t", name, ".") - - if err != nil { - c.Fatal("failed to build the image", out) - } - - containerCountAfter, err := getContainerCount() - if err != nil { - c.Fatalf("failed to get the container count: %s", err) - } - - if containerCountBefore != containerCountAfter { - c.Fatalf("--rm shouldn't have left containers behind") - } - deleteImages(name) - } - - { - containerCountBefore, err := getContainerCount() - if err != nil { - c.Fatalf("failed to get the container count: %s", err) - } - - out, _, err := dockerCmdInDir(c, ctx.Dir, "build", "--rm=false", "-t", name, ".") - - if err != nil { - c.Fatal("failed to build the image", out) - } - - containerCountAfter, err := getContainerCount() - if err != nil { - c.Fatalf("failed to get the container count: %s", err) - } - - if containerCountBefore == containerCountAfter { - c.Fatalf("--rm=false should have left containers behind") - } - deleteImages(name) - - } - -} - -func (s *DockerSuite) TestBuildWithVolumes(c *check.C) { - testRequires(c, DaemonIsLinux) // Invalid volume paths on Windows - var ( - result map[string]map[string]struct{} - name = "testbuildvolumes" - emptyMap = make(map[string]struct{}) - expected = map[string]map[string]struct{}{ - "/test1": emptyMap, - "/test2": emptyMap, - "/test3": emptyMap, - "/test4": emptyMap, - "/test5": emptyMap, - "/test6": emptyMap, - "[/test7": emptyMap, - "/test8]": emptyMap, - } - ) - _, err := buildImage(name, - `FROM scratch - VOLUME /test1 - VOLUME /test2 - VOLUME /test3 /test4 - VOLUME ["/test5", "/test6"] - VOLUME [/test7 /test8] - `, - true) - if err != nil { - c.Fatal(err) - } - res := inspectFieldJSON(c, name, "Config.Volumes") - - err = json.Unmarshal([]byte(res), &result) - if err != nil { - c.Fatal(err) - } - - equal := reflect.DeepEqual(&result, &expected) - - if !equal { - c.Fatalf("Volumes %s, expected %s", result, expected) - } - -} - -func (s *DockerSuite) TestBuildMaintainer(c *check.C) { - name := "testbuildmaintainer" - - expected := "dockerio" - _, err := buildImage(name, - `FROM `+minimalBaseImage()+` - MAINTAINER dockerio`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Author") - if res != expected { - c.Fatalf("Maintainer %s, expected %s", res, expected) - } -} - -func (s *DockerSuite) TestBuildUser(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuilduser" - expected := "dockerio" - _, err := buildImage(name, - `FROM busybox - RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd - USER dockerio - RUN [ $(whoami) = 'dockerio' ]`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.User") - if res != expected { - c.Fatalf("User %s, expected %s", res, expected) - } -} - -func (s *DockerSuite) TestBuildRelativeWorkdir(c *check.C) { - name := "testbuildrelativeworkdir" - - var ( - expected1 string - expected2 string - expected3 string - expected4 string - expectedFinal string - ) - - if daemonPlatform == "windows" { - expected1 = `C:/` - expected2 = `C:/test1` - expected3 = `C:/test2` - expected4 = `C:/test2/test3` - expectedFinal = `C:\test2\test3` // Note inspect is going to return Windows paths, as it's not in busybox - } else { - expected1 = `/` - expected2 = `/test1` - expected3 = `/test2` - expected4 = `/test2/test3` - expectedFinal = `/test2/test3` - } - - _, err := buildImage(name, - `FROM busybox - RUN sh -c "[ "$PWD" = "`+expected1+`" ]" - WORKDIR test1 - RUN sh -c "[ "$PWD" = "`+expected2+`" ]" - WORKDIR /test2 - RUN sh -c "[ "$PWD" = "`+expected3+`" ]" - WORKDIR test3 - RUN sh -c "[ "$PWD" = "`+expected4+`" ]"`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.WorkingDir") - if res != expectedFinal { - c.Fatalf("Workdir %s, expected %s", res, expectedFinal) - } -} - -// #22181 Regression test. Single end-to-end test of using -// Windows semantics. Most path handling verifications are in unit tests -func (s *DockerSuite) TestBuildWindowsWorkdirProcessing(c *check.C) { - testRequires(c, DaemonIsWindows) - name := "testbuildwindowsworkdirprocessing" - _, err := buildImage(name, - `FROM busybox - WORKDIR C:\\foo - WORKDIR bar - RUN sh -c "[ "$PWD" = "C:/foo/bar" ]" - `, - true) - if err != nil { - c.Fatal(err) - } -} - -// #22181 Regression test. Most paths handling verifications are in unit test. -// One functional test for end-to-end -func (s *DockerSuite) TestBuildWindowsAddCopyPathProcessing(c *check.C) { - testRequires(c, DaemonIsWindows) - name := "testbuildwindowsaddcopypathprocessing" - // TODO Windows (@jhowardmsft). Needs a follow-up PR to 22181 to - // support backslash such as .\\ being equivalent to ./ and c:\\ being - // equivalent to c:/. This is not currently (nor ever has been) supported - // by docker on the Windows platform. - dockerfile := ` - FROM busybox - # No trailing slash on COPY/ADD - # Results in dir being changed to a file - WORKDIR /wc1 - COPY wc1 c:/wc1 - WORKDIR /wc2 - ADD wc2 c:/wc2 - WORKDIR c:/ - RUN sh -c "[ $(cat c:/wc1/wc1) = 'hellowc1' ]" - RUN sh -c "[ $(cat c:/wc2/wc2) = 'worldwc2' ]" - - # Trailing slash on COPY/ADD, Windows-style path. - WORKDIR /wd1 - COPY wd1 c:/wd1/ - WORKDIR /wd2 - ADD wd2 c:/wd2/ - RUN sh -c "[ $(cat c:/wd1/wd1) = 'hellowd1' ]" - RUN sh -c "[ $(cat c:/wd2/wd2) = 'worldwd2' ]" - ` - ctx, err := fakeContext(dockerfile, map[string]string{ - "wc1": "hellowc1", - "wc2": "worldwc2", - "wd1": "hellowd1", - "wd2": "worldwd2", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - _, err = buildImageFromContext(name, ctx, false) - if err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildWorkdirWithEnvVariables(c *check.C) { - name := "testbuildworkdirwithenvvariables" - - var expected string - if daemonPlatform == "windows" { - expected = `C:\test1\test2` - } else { - expected = `/test1/test2` - } - - _, err := buildImage(name, - `FROM busybox - ENV DIRPATH /test1 - ENV SUBDIRNAME test2 - WORKDIR $DIRPATH - WORKDIR $SUBDIRNAME/$MISSING_VAR`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.WorkingDir") - if res != expected { - c.Fatalf("Workdir %s, expected %s", res, expected) - } -} - -func (s *DockerSuite) TestBuildRelativeCopy(c *check.C) { - // cat /test1/test2/foo gets permission denied for the user - testRequires(c, NotUserNamespace) - - var expected string - if daemonPlatform == "windows" { - expected = `C:/test1/test2` - } else { - expected = `/test1/test2` - } - - name := "testbuildrelativecopy" - dockerfile := ` - FROM busybox - WORKDIR /test1 - WORKDIR test2 - RUN sh -c "[ "$PWD" = '` + expected + `' ]" - COPY foo ./ - RUN sh -c "[ $(cat /test1/test2/foo) = 'hello' ]" - ADD foo ./bar/baz - RUN sh -c "[ $(cat /test1/test2/bar/baz) = 'hello' ]" - COPY foo ./bar/baz2 - RUN sh -c "[ $(cat /test1/test2/bar/baz2) = 'hello' ]" - WORKDIR .. - COPY foo ./ - RUN sh -c "[ $(cat /test1/foo) = 'hello' ]" - COPY foo /test3/ - RUN sh -c "[ $(cat /test3/foo) = 'hello' ]" - WORKDIR /test4 - COPY . . - RUN sh -c "[ $(cat /test4/foo) = 'hello' ]" - WORKDIR /test5/test6 - COPY foo ../ - RUN sh -c "[ $(cat /test5/foo) = 'hello' ]" - ` - ctx, err := fakeContext(dockerfile, map[string]string{ - "foo": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - _, err = buildImageFromContext(name, ctx, false) - if err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildBlankName(c *check.C) { - name := "testbuildblankname" - _, _, stderr, err := buildImageWithStdoutStderr(name, - `FROM busybox - ENV =`, - true) - if err == nil { - c.Fatal("Build was supposed to fail but didn't") - } - if !strings.Contains(stderr, "ENV names can not be blank") { - c.Fatalf("Missing error message, got: %s", stderr) - } - - _, _, stderr, err = buildImageWithStdoutStderr(name, - `FROM busybox - LABEL =`, - true) - if err == nil { - c.Fatal("Build was supposed to fail but didn't") - } - if !strings.Contains(stderr, "LABEL names can not be blank") { - c.Fatalf("Missing error message, got: %s", stderr) - } - - _, _, stderr, err = buildImageWithStdoutStderr(name, - `FROM busybox - ARG =foo`, - true) - if err == nil { - c.Fatal("Build was supposed to fail but didn't") - } - if !strings.Contains(stderr, "ARG names can not be blank") { - c.Fatalf("Missing error message, got: %s", stderr) - } -} - -func (s *DockerSuite) TestBuildEnv(c *check.C) { - testRequires(c, DaemonIsLinux) // ENV expansion is different in Windows - name := "testbuildenv" - expected := "[PATH=/test:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PORT=2375]" - _, err := buildImage(name, - `FROM busybox - ENV PATH /test:$PATH - ENV PORT 2375 - RUN [ $(env | grep PORT) = 'PORT=2375' ]`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.Env") - if res != expected { - c.Fatalf("Env %s, expected %s", res, expected) - } -} - -func (s *DockerSuite) TestBuildPATH(c *check.C) { - testRequires(c, DaemonIsLinux) // ENV expansion is different in Windows - - defPath := "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - - fn := func(dockerfile string, exp string) { - _, err := buildImage("testbldpath", dockerfile, true) - c.Assert(err, check.IsNil) - - res := inspectField(c, "testbldpath", "Config.Env") - - if res != exp { - c.Fatalf("Env %q, expected %q for dockerfile:%q", res, exp, dockerfile) - } - } - - tests := []struct{ dockerfile, exp string }{ - {"FROM scratch\nMAINTAINER me", "[PATH=" + defPath + "]"}, - {"FROM busybox\nMAINTAINER me", "[PATH=" + defPath + "]"}, - {"FROM scratch\nENV FOO=bar", "[PATH=" + defPath + " FOO=bar]"}, - {"FROM busybox\nENV FOO=bar", "[PATH=" + defPath + " FOO=bar]"}, - {"FROM scratch\nENV PATH=/test", "[PATH=/test]"}, - {"FROM busybox\nENV PATH=/test", "[PATH=/test]"}, - {"FROM scratch\nENV PATH=''", "[PATH=]"}, - {"FROM busybox\nENV PATH=''", "[PATH=]"}, - } - - for _, test := range tests { - fn(test.dockerfile, test.exp) - } -} - -func (s *DockerSuite) TestBuildContextCleanup(c *check.C) { - testRequires(c, SameHostDaemon) - - name := "testbuildcontextcleanup" - entries, err := ioutil.ReadDir(filepath.Join(dockerBasePath, "tmp")) - if err != nil { - c.Fatalf("failed to list contents of tmp dir: %s", err) - } - _, err = buildImage(name, - `FROM `+minimalBaseImage()+` - ENTRYPOINT ["/bin/echo"]`, - true) - if err != nil { - c.Fatal(err) - } - entriesFinal, err := ioutil.ReadDir(filepath.Join(dockerBasePath, "tmp")) - if err != nil { - c.Fatalf("failed to list contents of tmp dir: %s", err) - } - if err = compareDirectoryEntries(entries, entriesFinal); err != nil { - c.Fatalf("context should have been deleted, but wasn't") - } - -} - -func (s *DockerSuite) TestBuildContextCleanupFailedBuild(c *check.C) { - testRequires(c, SameHostDaemon) - - name := "testbuildcontextcleanup" - entries, err := ioutil.ReadDir(filepath.Join(dockerBasePath, "tmp")) - if err != nil { - c.Fatalf("failed to list contents of tmp dir: %s", err) - } - _, err = buildImage(name, - `FROM `+minimalBaseImage()+` - RUN /non/existing/command`, - true) - if err == nil { - c.Fatalf("expected build to fail, but it didn't") - } - entriesFinal, err := ioutil.ReadDir(filepath.Join(dockerBasePath, "tmp")) - if err != nil { - c.Fatalf("failed to list contents of tmp dir: %s", err) - } - if err = compareDirectoryEntries(entries, entriesFinal); err != nil { - c.Fatalf("context should have been deleted, but wasn't") - } - -} - -func (s *DockerSuite) TestBuildCmd(c *check.C) { - name := "testbuildcmd" - - expected := "[/bin/echo Hello World]" - _, err := buildImage(name, - `FROM `+minimalBaseImage()+` - CMD ["/bin/echo", "Hello World"]`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.Cmd") - if res != expected { - c.Fatalf("Cmd %s, expected %s", res, expected) - } -} - -func (s *DockerSuite) TestBuildExpose(c *check.C) { - testRequires(c, DaemonIsLinux) // Expose not implemented on Windows - name := "testbuildexpose" - expected := "map[2375/tcp:{}]" - _, err := buildImage(name, - `FROM scratch - EXPOSE 2375`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.ExposedPorts") - if res != expected { - c.Fatalf("Exposed ports %s, expected %s", res, expected) - } -} - -func (s *DockerSuite) TestBuildExposeMorePorts(c *check.C) { - testRequires(c, DaemonIsLinux) // Expose not implemented on Windows - // start building docker file with a large number of ports - portList := make([]string, 50) - line := make([]string, 100) - expectedPorts := make([]int, len(portList)*len(line)) - for i := 0; i < len(portList); i++ { - for j := 0; j < len(line); j++ { - p := i*len(line) + j + 1 - line[j] = strconv.Itoa(p) - expectedPorts[p-1] = p - } - if i == len(portList)-1 { - portList[i] = strings.Join(line, " ") - } else { - portList[i] = strings.Join(line, " ") + ` \` - } - } - - dockerfile := `FROM scratch - EXPOSE {{range .}} {{.}} - {{end}}` - tmpl := template.Must(template.New("dockerfile").Parse(dockerfile)) - buf := bytes.NewBuffer(nil) - tmpl.Execute(buf, portList) - - name := "testbuildexpose" - _, err := buildImage(name, buf.String(), true) - if err != nil { - c.Fatal(err) - } - - // check if all the ports are saved inside Config.ExposedPorts - res := inspectFieldJSON(c, name, "Config.ExposedPorts") - var exposedPorts map[string]interface{} - if err := json.Unmarshal([]byte(res), &exposedPorts); err != nil { - c.Fatal(err) - } - - for _, p := range expectedPorts { - ep := fmt.Sprintf("%d/tcp", p) - if _, ok := exposedPorts[ep]; !ok { - c.Errorf("Port(%s) is not exposed", ep) - } else { - delete(exposedPorts, ep) - } - } - if len(exposedPorts) != 0 { - c.Errorf("Unexpected extra exposed ports %v", exposedPorts) - } -} - -func (s *DockerSuite) TestBuildExposeOrder(c *check.C) { - testRequires(c, DaemonIsLinux) // Expose not implemented on Windows - buildID := func(name, exposed string) string { - _, err := buildImage(name, fmt.Sprintf(`FROM scratch - EXPOSE %s`, exposed), true) - if err != nil { - c.Fatal(err) - } - id := inspectField(c, name, "Id") - return id - } - - id1 := buildID("testbuildexpose1", "80 2375") - id2 := buildID("testbuildexpose2", "2375 80") - if id1 != id2 { - c.Errorf("EXPOSE should invalidate the cache only when ports actually changed") - } -} - -func (s *DockerSuite) TestBuildExposeUpperCaseProto(c *check.C) { - testRequires(c, DaemonIsLinux) // Expose not implemented on Windows - name := "testbuildexposeuppercaseproto" - expected := "map[5678/udp:{}]" - _, err := buildImage(name, - `FROM scratch - EXPOSE 5678/UDP`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.ExposedPorts") - if res != expected { - c.Fatalf("Exposed ports %s, expected %s", res, expected) - } -} - -func (s *DockerSuite) TestBuildEmptyEntrypointInheritance(c *check.C) { - name := "testbuildentrypointinheritance" - name2 := "testbuildentrypointinheritance2" - - _, err := buildImage(name, - `FROM busybox - ENTRYPOINT ["/bin/echo"]`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.Entrypoint") - - expected := "[/bin/echo]" - if res != expected { - c.Fatalf("Entrypoint %s, expected %s", res, expected) - } - - _, err = buildImage(name2, - fmt.Sprintf(`FROM %s - ENTRYPOINT []`, name), - true) - if err != nil { - c.Fatal(err) - } - res = inspectField(c, name2, "Config.Entrypoint") - - expected = "[]" - - if res != expected { - c.Fatalf("Entrypoint %s, expected %s", res, expected) - } - -} - -func (s *DockerSuite) TestBuildEmptyEntrypoint(c *check.C) { - name := "testbuildentrypoint" - expected := "[]" - - _, err := buildImage(name, - `FROM busybox - ENTRYPOINT []`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.Entrypoint") - if res != expected { - c.Fatalf("Entrypoint %s, expected %s", res, expected) - } - -} - -func (s *DockerSuite) TestBuildEntrypoint(c *check.C) { - name := "testbuildentrypoint" - - expected := "[/bin/echo]" - _, err := buildImage(name, - `FROM `+minimalBaseImage()+` - ENTRYPOINT ["/bin/echo"]`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.Entrypoint") - if res != expected { - c.Fatalf("Entrypoint %s, expected %s", res, expected) - } - -} - -// #6445 ensure ONBUILD triggers aren't committed to grandchildren -func (s *DockerSuite) TestBuildOnBuildLimitedInheritence(c *check.C) { - var ( - out2, out3 string - ) - { - name1 := "testonbuildtrigger1" - dockerfile1 := ` - FROM busybox - RUN echo "GRANDPARENT" - ONBUILD RUN echo "ONBUILD PARENT" - ` - ctx, err := fakeContext(dockerfile1, nil) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - out1, _, err := dockerCmdInDir(c, ctx.Dir, "build", "-t", name1, ".") - if err != nil { - c.Fatalf("build failed to complete: %s, %v", out1, err) - } - } - { - name2 := "testonbuildtrigger2" - dockerfile2 := ` - FROM testonbuildtrigger1 - ` - ctx, err := fakeContext(dockerfile2, nil) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - out2, _, err = dockerCmdInDir(c, ctx.Dir, "build", "-t", name2, ".") - if err != nil { - c.Fatalf("build failed to complete: %s, %v", out2, err) - } - } - { - name3 := "testonbuildtrigger3" - dockerfile3 := ` - FROM testonbuildtrigger2 - ` - ctx, err := fakeContext(dockerfile3, nil) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - out3, _, err = dockerCmdInDir(c, ctx.Dir, "build", "-t", name3, ".") - if err != nil { - c.Fatalf("build failed to complete: %s, %v", out3, err) - } - - } - - // ONBUILD should be run in second build. - if !strings.Contains(out2, "ONBUILD PARENT") { - c.Fatalf("ONBUILD instruction did not run in child of ONBUILD parent") - } - - // ONBUILD should *not* be run in third build. - if strings.Contains(out3, "ONBUILD PARENT") { - c.Fatalf("ONBUILD instruction ran in grandchild of ONBUILD parent") - } - -} - -func (s *DockerSuite) TestBuildWithCache(c *check.C) { - testRequires(c, DaemonIsLinux) // Expose not implemented on Windows - name := "testbuildwithcache" - id1, err := buildImage(name, - `FROM scratch - MAINTAINER dockerio - EXPOSE 5432 - ENTRYPOINT ["/bin/echo"]`, - true) - if err != nil { - c.Fatal(err) - } - id2, err := buildImage(name, - `FROM scratch - MAINTAINER dockerio - EXPOSE 5432 - ENTRYPOINT ["/bin/echo"]`, - true) - if err != nil { - c.Fatal(err) - } - if id1 != id2 { - c.Fatal("The cache should have been used but hasn't.") - } -} - -func (s *DockerSuite) TestBuildWithoutCache(c *check.C) { - testRequires(c, DaemonIsLinux) // Expose not implemented on Windows - name := "testbuildwithoutcache" - name2 := "testbuildwithoutcache2" - id1, err := buildImage(name, - `FROM scratch - MAINTAINER dockerio - EXPOSE 5432 - ENTRYPOINT ["/bin/echo"]`, - true) - if err != nil { - c.Fatal(err) - } - - id2, err := buildImage(name2, - `FROM scratch - MAINTAINER dockerio - EXPOSE 5432 - ENTRYPOINT ["/bin/echo"]`, - false) - if err != nil { - c.Fatal(err) - } - if id1 == id2 { - c.Fatal("The cache should have been invalided but hasn't.") - } -} - -func (s *DockerSuite) TestBuildConditionalCache(c *check.C) { - name := "testbuildconditionalcache" - - dockerfile := ` - FROM busybox - ADD foo /tmp/` - ctx, err := fakeContext(dockerfile, map[string]string{ - "foo": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatalf("Error building #1: %s", err) - } - - if err := ctx.Add("foo", "bye"); err != nil { - c.Fatalf("Error modifying foo: %s", err) - } - - id2, err := buildImageFromContext(name, ctx, false) - if err != nil { - c.Fatalf("Error building #2: %s", err) - } - if id2 == id1 { - c.Fatal("Should not have used the cache") - } - - id3, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatalf("Error building #3: %s", err) - } - if id3 != id2 { - c.Fatal("Should have used the cache") - } -} - -func (s *DockerSuite) TestBuildAddLocalFileWithCache(c *check.C) { - // local files are not owned by the correct user - testRequires(c, NotUserNamespace) - name := "testbuildaddlocalfilewithcache" - name2 := "testbuildaddlocalfilewithcache2" - dockerfile := ` - FROM busybox - MAINTAINER dockerio - ADD foo /usr/lib/bla/bar - RUN sh -c "[ $(cat /usr/lib/bla/bar) = "hello" ]"` - ctx, err := fakeContext(dockerfile, map[string]string{ - "foo": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - id2, err := buildImageFromContext(name2, ctx, true) - if err != nil { - c.Fatal(err) - } - if id1 != id2 { - c.Fatal("The cache should have been used but hasn't.") - } -} - -func (s *DockerSuite) TestBuildAddMultipleLocalFileWithCache(c *check.C) { - name := "testbuildaddmultiplelocalfilewithcache" - name2 := "testbuildaddmultiplelocalfilewithcache2" - dockerfile := ` - FROM busybox - MAINTAINER dockerio - ADD foo Dockerfile /usr/lib/bla/ - RUN sh -c "[ $(cat /usr/lib/bla/foo) = "hello" ]"` - ctx, err := fakeContext(dockerfile, map[string]string{ - "foo": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - id2, err := buildImageFromContext(name2, ctx, true) - if err != nil { - c.Fatal(err) - } - if id1 != id2 { - c.Fatal("The cache should have been used but hasn't.") - } -} - -func (s *DockerSuite) TestBuildAddLocalFileWithoutCache(c *check.C) { - // local files are not owned by the correct user - testRequires(c, NotUserNamespace) - name := "testbuildaddlocalfilewithoutcache" - name2 := "testbuildaddlocalfilewithoutcache2" - dockerfile := ` - FROM busybox - MAINTAINER dockerio - ADD foo /usr/lib/bla/bar - RUN sh -c "[ $(cat /usr/lib/bla/bar) = "hello" ]"` - ctx, err := fakeContext(dockerfile, map[string]string{ - "foo": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - id2, err := buildImageFromContext(name2, ctx, false) - if err != nil { - c.Fatal(err) - } - if id1 == id2 { - c.Fatal("The cache should have been invalided but hasn't.") - } -} - -func (s *DockerSuite) TestBuildCopyDirButNotFile(c *check.C) { - name := "testbuildcopydirbutnotfile" - name2 := "testbuildcopydirbutnotfile2" - - dockerfile := ` - FROM ` + minimalBaseImage() + ` - COPY dir /tmp/` - ctx, err := fakeContext(dockerfile, map[string]string{ - "dir/foo": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - // Check that adding file with similar name doesn't mess with cache - if err := ctx.Add("dir_file", "hello2"); err != nil { - c.Fatal(err) - } - id2, err := buildImageFromContext(name2, ctx, true) - if err != nil { - c.Fatal(err) - } - if id1 != id2 { - c.Fatal("The cache should have been used but wasn't") - } -} - -func (s *DockerSuite) TestBuildAddCurrentDirWithCache(c *check.C) { - name := "testbuildaddcurrentdirwithcache" - name2 := name + "2" - name3 := name + "3" - name4 := name + "4" - dockerfile := ` - FROM ` + minimalBaseImage() + ` - MAINTAINER dockerio - ADD . /usr/lib/bla` - ctx, err := fakeContext(dockerfile, map[string]string{ - "foo": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - // Check that adding file invalidate cache of "ADD ." - if err := ctx.Add("bar", "hello2"); err != nil { - c.Fatal(err) - } - id2, err := buildImageFromContext(name2, ctx, true) - if err != nil { - c.Fatal(err) - } - if id1 == id2 { - c.Fatal("The cache should have been invalided but hasn't.") - } - // Check that changing file invalidate cache of "ADD ." - if err := ctx.Add("foo", "hello1"); err != nil { - c.Fatal(err) - } - id3, err := buildImageFromContext(name3, ctx, true) - if err != nil { - c.Fatal(err) - } - if id2 == id3 { - c.Fatal("The cache should have been invalided but hasn't.") - } - // Check that changing file to same content with different mtime does not - // invalidate cache of "ADD ." - time.Sleep(1 * time.Second) // wait second because of mtime precision - if err := ctx.Add("foo", "hello1"); err != nil { - c.Fatal(err) - } - id4, err := buildImageFromContext(name4, ctx, true) - if err != nil { - c.Fatal(err) - } - if id3 != id4 { - c.Fatal("The cache should have been used but hasn't.") - } -} - -func (s *DockerSuite) TestBuildAddCurrentDirWithoutCache(c *check.C) { - name := "testbuildaddcurrentdirwithoutcache" - name2 := "testbuildaddcurrentdirwithoutcache2" - dockerfile := ` - FROM ` + minimalBaseImage() + ` - MAINTAINER dockerio - ADD . /usr/lib/bla` - ctx, err := fakeContext(dockerfile, map[string]string{ - "foo": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - id2, err := buildImageFromContext(name2, ctx, false) - if err != nil { - c.Fatal(err) - } - if id1 == id2 { - c.Fatal("The cache should have been invalided but hasn't.") - } -} - -func (s *DockerSuite) TestBuildAddRemoteFileWithCache(c *check.C) { - name := "testbuildaddremotefilewithcache" - server, err := fakeStorage(map[string]string{ - "baz": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer server.Close() - - id1, err := buildImage(name, - fmt.Sprintf(`FROM `+minimalBaseImage()+` - MAINTAINER dockerio - ADD %s/baz /usr/lib/baz/quux`, server.URL()), - true) - if err != nil { - c.Fatal(err) - } - id2, err := buildImage(name, - fmt.Sprintf(`FROM `+minimalBaseImage()+` - MAINTAINER dockerio - ADD %s/baz /usr/lib/baz/quux`, server.URL()), - true) - if err != nil { - c.Fatal(err) - } - if id1 != id2 { - c.Fatal("The cache should have been used but hasn't.") - } -} - -func (s *DockerSuite) TestBuildAddRemoteFileWithoutCache(c *check.C) { - name := "testbuildaddremotefilewithoutcache" - name2 := "testbuildaddremotefilewithoutcache2" - server, err := fakeStorage(map[string]string{ - "baz": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer server.Close() - - id1, err := buildImage(name, - fmt.Sprintf(`FROM `+minimalBaseImage()+` - MAINTAINER dockerio - ADD %s/baz /usr/lib/baz/quux`, server.URL()), - true) - if err != nil { - c.Fatal(err) - } - id2, err := buildImage(name2, - fmt.Sprintf(`FROM `+minimalBaseImage()+` - MAINTAINER dockerio - ADD %s/baz /usr/lib/baz/quux`, server.URL()), - false) - if err != nil { - c.Fatal(err) - } - if id1 == id2 { - c.Fatal("The cache should have been invalided but hasn't.") - } -} - -func (s *DockerSuite) TestBuildAddRemoteFileMTime(c *check.C) { - name := "testbuildaddremotefilemtime" - name2 := name + "2" - name3 := name + "3" - - files := map[string]string{"baz": "hello"} - server, err := fakeStorage(files) - if err != nil { - c.Fatal(err) - } - defer server.Close() - - ctx, err := fakeContext(fmt.Sprintf(`FROM `+minimalBaseImage()+` - MAINTAINER dockerio - ADD %s/baz /usr/lib/baz/quux`, server.URL()), nil) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - - id2, err := buildImageFromContext(name2, ctx, true) - if err != nil { - c.Fatal(err) - } - if id1 != id2 { - c.Fatal("The cache should have been used but wasn't - #1") - } - - // Now create a different server with same contents (causes different mtime) - // The cache should still be used - - // allow some time for clock to pass as mtime precision is only 1s - time.Sleep(2 * time.Second) - - server2, err := fakeStorage(files) - if err != nil { - c.Fatal(err) - } - defer server2.Close() - - ctx2, err := fakeContext(fmt.Sprintf(`FROM `+minimalBaseImage()+` - MAINTAINER dockerio - ADD %s/baz /usr/lib/baz/quux`, server2.URL()), nil) - if err != nil { - c.Fatal(err) - } - defer ctx2.Close() - id3, err := buildImageFromContext(name3, ctx2, true) - if err != nil { - c.Fatal(err) - } - if id1 != id3 { - c.Fatal("The cache should have been used but wasn't") - } -} - -func (s *DockerSuite) TestBuildAddLocalAndRemoteFilesWithCache(c *check.C) { - name := "testbuildaddlocalandremotefilewithcache" - server, err := fakeStorage(map[string]string{ - "baz": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer server.Close() - - ctx, err := fakeContext(fmt.Sprintf(`FROM `+minimalBaseImage()+` - MAINTAINER dockerio - ADD foo /usr/lib/bla/bar - ADD %s/baz /usr/lib/baz/quux`, server.URL()), - map[string]string{ - "foo": "hello world", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - id2, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - if id1 != id2 { - c.Fatal("The cache should have been used but hasn't.") - } -} - -func testContextTar(c *check.C, compression archive.Compression) { - ctx, err := fakeContext( - `FROM busybox -ADD foo /foo -CMD ["cat", "/foo"]`, - map[string]string{ - "foo": "bar", - }, - ) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - context, err := archive.Tar(ctx.Dir, compression) - if err != nil { - c.Fatalf("failed to build context tar: %v", err) - } - name := "contexttar" - buildCmd := exec.Command(dockerBinary, "build", "-t", name, "-") - buildCmd.Stdin = context - - if out, _, err := runCommandWithOutput(buildCmd); err != nil { - c.Fatalf("build failed to complete: %v %v", out, err) - } -} - -func (s *DockerSuite) TestBuildContextTarGzip(c *check.C) { - testContextTar(c, archive.Gzip) -} - -func (s *DockerSuite) TestBuildContextTarNoCompression(c *check.C) { - testContextTar(c, archive.Uncompressed) -} - -func (s *DockerSuite) TestBuildNoContext(c *check.C) { - buildCmd := exec.Command(dockerBinary, "build", "-t", "nocontext", "-") - buildCmd.Stdin = strings.NewReader( - `FROM busybox - CMD ["echo", "ok"]`) - - if out, _, err := runCommandWithOutput(buildCmd); err != nil { - c.Fatalf("build failed to complete: %v %v", out, err) - } - - if out, _ := dockerCmd(c, "run", "--rm", "nocontext"); out != "ok\n" { - c.Fatalf("run produced invalid output: %q, expected %q", out, "ok") - } -} - -// TODO: TestCaching -func (s *DockerSuite) TestBuildAddLocalAndRemoteFilesWithoutCache(c *check.C) { - name := "testbuildaddlocalandremotefilewithoutcache" - name2 := "testbuildaddlocalandremotefilewithoutcache2" - server, err := fakeStorage(map[string]string{ - "baz": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer server.Close() - - ctx, err := fakeContext(fmt.Sprintf(`FROM `+minimalBaseImage()+` - MAINTAINER dockerio - ADD foo /usr/lib/bla/bar - ADD %s/baz /usr/lib/baz/quux`, server.URL()), - map[string]string{ - "foo": "hello world", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - id1, err := buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } - id2, err := buildImageFromContext(name2, ctx, false) - if err != nil { - c.Fatal(err) - } - if id1 == id2 { - c.Fatal("The cache should have been invalidated but hasn't.") - } -} - -func (s *DockerSuite) TestBuildWithVolumeOwnership(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuildimg" - - _, err := buildImage(name, - `FROM busybox:latest - RUN mkdir /test && chown daemon:daemon /test && chmod 0600 /test - VOLUME /test`, - true) - - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "run", "--rm", "testbuildimg", "ls", "-la", "/test") - - if expected := "drw-------"; !strings.Contains(out, expected) { - c.Fatalf("expected %s received %s", expected, out) - } - - if expected := "daemon daemon"; !strings.Contains(out, expected) { - c.Fatalf("expected %s received %s", expected, out) - } - -} - -// testing #1405 - config.Cmd does not get cleaned up if -// utilizing cache -func (s *DockerSuite) TestBuildEntrypointRunCleanup(c *check.C) { - name := "testbuildcmdcleanup" - if _, err := buildImage(name, - `FROM busybox - RUN echo "hello"`, - true); err != nil { - c.Fatal(err) - } - - ctx, err := fakeContext(`FROM busybox - RUN echo "hello" - ADD foo /foo - ENTRYPOINT ["/bin/echo"]`, - map[string]string{ - "foo": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.Cmd") - // Cmd must be cleaned up - if res != "[]" { - c.Fatalf("Cmd %s, expected nil", res) - } -} - -func (s *DockerSuite) TestBuildAddFileNotFound(c *check.C) { - name := "testbuildaddnotfound" - expected := "foo: no such file or directory" - - if daemonPlatform == "windows" { - expected = "foo: The system cannot find the file specified" - } - - ctx, err := fakeContext(`FROM `+minimalBaseImage()+` - ADD foo /usr/local/bar`, - map[string]string{"bar": "hello"}) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - if _, err := buildImageFromContext(name, ctx, true); err != nil { - if !strings.Contains(err.Error(), expected) { - c.Fatalf("Wrong error %v, must be about missing foo file or directory", err) - } - } else { - c.Fatal("Error must not be nil") - } -} - -func (s *DockerSuite) TestBuildInheritance(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuildinheritance" - - _, err := buildImage(name, - `FROM scratch - EXPOSE 2375`, - true) - if err != nil { - c.Fatal(err) - } - ports1 := inspectField(c, name, "Config.ExposedPorts") - - _, err = buildImage(name, - fmt.Sprintf(`FROM %s - ENTRYPOINT ["/bin/echo"]`, name), - true) - if err != nil { - c.Fatal(err) - } - - res := inspectField(c, name, "Config.Entrypoint") - if expected := "[/bin/echo]"; res != expected { - c.Fatalf("Entrypoint %s, expected %s", res, expected) - } - ports2 := inspectField(c, name, "Config.ExposedPorts") - if ports1 != ports2 { - c.Fatalf("Ports must be same: %s != %s", ports1, ports2) - } -} - -func (s *DockerSuite) TestBuildFails(c *check.C) { - name := "testbuildfails" - _, err := buildImage(name, - `FROM busybox - RUN sh -c "exit 23"`, - true) - if err != nil { - if !strings.Contains(err.Error(), "returned a non-zero code: 23") { - c.Fatalf("Wrong error %v, must be about non-zero code 23", err) - } - } else { - c.Fatal("Error must not be nil") - } -} - -func (s *DockerSuite) TestBuildOnBuild(c *check.C) { - name := "testbuildonbuild" - _, err := buildImage(name, - `FROM busybox - ONBUILD RUN touch foobar`, - true) - if err != nil { - c.Fatal(err) - } - _, err = buildImage(name, - fmt.Sprintf(`FROM %s - RUN [ -f foobar ]`, name), - true) - if err != nil { - c.Fatal(err) - } -} - -// gh #2446 -func (s *DockerSuite) TestBuildAddToSymlinkDest(c *check.C) { - makeLink := `ln -s /foo /bar` - if daemonPlatform == "windows" { - makeLink = `mklink /D C:\bar C:\foo` - } - name := "testbuildaddtosymlinkdest" - ctx, err := fakeContext(`FROM busybox - RUN sh -c "mkdir /foo" - RUN `+makeLink+` - ADD foo /bar/ - RUN sh -c "[ -f /bar/foo ]" - RUN sh -c "[ -f /foo/foo ]"`, - map[string]string{ - "foo": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildEscapeWhitespace(c *check.C) { - name := "testbuildescapewhitespace" - - _, err := buildImage(name, ` - # ESCAPE=\ - FROM busybox - MAINTAINER "Docker \ -IO " - `, true) - if err != nil { - c.Fatal(err) - } - - res := inspectField(c, name, "Author") - - if res != "\"Docker IO \"" { - c.Fatalf("Parsed string did not match the escaped string. Got: %q", res) - } - -} - -func (s *DockerSuite) TestBuildVerifyIntString(c *check.C) { - // Verify that strings that look like ints are still passed as strings - name := "testbuildstringing" - - _, err := buildImage(name, ` - FROM busybox - MAINTAINER 123 - `, true) - - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "inspect", name) - - if !strings.Contains(out, "\"123\"") { - c.Fatalf("Output does not contain the int as a string:\n%s", out) - } - -} - -func (s *DockerSuite) TestBuildDockerignore(c *check.C) { - name := "testbuilddockerignore" - dockerfile := ` - FROM busybox - ADD . /bla - RUN sh -c "[[ -f /bla/src/x.go ]]" - RUN sh -c "[[ -f /bla/Makefile ]]" - RUN sh -c "[[ ! -e /bla/src/_vendor ]]" - RUN sh -c "[[ ! -e /bla/.gitignore ]]" - RUN sh -c "[[ ! -e /bla/README.md ]]" - RUN sh -c "[[ ! -e /bla/dir/foo ]]" - RUN sh -c "[[ ! -e /bla/foo ]]" - RUN sh -c "[[ ! -e /bla/.git ]]" - RUN sh -c "[[ ! -e v.cc ]]" - RUN sh -c "[[ ! -e src/v.cc ]]" - RUN sh -c "[[ ! -e src/_vendor/v.cc ]]"` - ctx, err := fakeContext(dockerfile, map[string]string{ - "Makefile": "all:", - ".git/HEAD": "ref: foo", - "src/x.go": "package main", - "src/_vendor/v.go": "package main", - "src/_vendor/v.cc": "package main", - "src/v.cc": "package main", - "v.cc": "package main", - "dir/foo": "", - ".gitignore": "", - "README.md": "readme", - ".dockerignore": ` -.git -pkg -.gitignore -src/_vendor -*.md -**/*.cc -dir`, - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildDockerignoreCleanPaths(c *check.C) { - name := "testbuilddockerignorecleanpaths" - dockerfile := ` - FROM busybox - ADD . /tmp/ - RUN sh -c "(! ls /tmp/foo) && (! ls /tmp/foo2) && (! ls /tmp/dir1/foo)"` - ctx, err := fakeContext(dockerfile, map[string]string{ - "foo": "foo", - "foo2": "foo2", - "dir1/foo": "foo in dir1", - ".dockerignore": "./foo\ndir1//foo\n./dir1/../foo2", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildDockerignoreExceptions(c *check.C) { - name := "testbuilddockerignoreexceptions" - dockerfile := ` - FROM busybox - ADD . /bla - RUN sh -c "[[ -f /bla/src/x.go ]]" - RUN sh -c "[[ -f /bla/Makefile ]]" - RUN sh -c "[[ ! -e /bla/src/_vendor ]]" - RUN sh -c "[[ ! -e /bla/.gitignore ]]" - RUN sh -c "[[ ! -e /bla/README.md ]]" - RUN sh -c "[[ -e /bla/dir/dir/foo ]]" - RUN sh -c "[[ ! -e /bla/dir/foo1 ]]" - RUN sh -c "[[ -f /bla/dir/e ]]" - RUN sh -c "[[ -f /bla/dir/e-dir/foo ]]" - RUN sh -c "[[ ! -e /bla/foo ]]" - RUN sh -c "[[ ! -e /bla/.git ]]" - RUN sh -c "[[ -e /bla/dir/a.cc ]]"` - ctx, err := fakeContext(dockerfile, map[string]string{ - "Makefile": "all:", - ".git/HEAD": "ref: foo", - "src/x.go": "package main", - "src/_vendor/v.go": "package main", - "dir/foo": "", - "dir/foo1": "", - "dir/dir/f1": "", - "dir/dir/foo": "", - "dir/e": "", - "dir/e-dir/foo": "", - ".gitignore": "", - "README.md": "readme", - "dir/a.cc": "hello", - ".dockerignore": ` -.git -pkg -.gitignore -src/_vendor -*.md -dir -!dir/e* -!dir/dir/foo -**/*.cc -!**/*.cc`, - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildDockerignoringDockerfile(c *check.C) { - name := "testbuilddockerignoredockerfile" - dockerfile := ` - FROM busybox - ADD . /tmp/ - RUN sh -c "! ls /tmp/Dockerfile" - RUN ls /tmp/.dockerignore` - ctx, err := fakeContext(dockerfile, map[string]string{ - "Dockerfile": dockerfile, - ".dockerignore": "Dockerfile\n", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("Didn't ignore Dockerfile correctly:%s", err) - } - - // now try it with ./Dockerfile - ctx.Add(".dockerignore", "./Dockerfile\n") - if _, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("Didn't ignore ./Dockerfile correctly:%s", err) - } - -} - -func (s *DockerSuite) TestBuildDockerignoringRenamedDockerfile(c *check.C) { - name := "testbuilddockerignoredockerfile" - dockerfile := ` - FROM busybox - ADD . /tmp/ - RUN ls /tmp/Dockerfile - RUN sh -c "! ls /tmp/MyDockerfile" - RUN ls /tmp/.dockerignore` - ctx, err := fakeContext(dockerfile, map[string]string{ - "Dockerfile": "Should not use me", - "MyDockerfile": dockerfile, - ".dockerignore": "MyDockerfile\n", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("Didn't ignore MyDockerfile correctly:%s", err) - } - - // now try it with ./MyDockerfile - ctx.Add(".dockerignore", "./MyDockerfile\n") - if _, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("Didn't ignore ./MyDockerfile correctly:%s", err) - } - -} - -func (s *DockerSuite) TestBuildDockerignoringDockerignore(c *check.C) { - name := "testbuilddockerignoredockerignore" - dockerfile := ` - FROM busybox - ADD . /tmp/ - RUN sh -c "! ls /tmp/.dockerignore" - RUN ls /tmp/Dockerfile` - ctx, err := fakeContext(dockerfile, map[string]string{ - "Dockerfile": dockerfile, - ".dockerignore": ".dockerignore\n", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - if _, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("Didn't ignore .dockerignore correctly:%s", err) - } -} - -func (s *DockerSuite) TestBuildDockerignoreTouchDockerfile(c *check.C) { - var id1 string - var id2 string - - name := "testbuilddockerignoretouchdockerfile" - dockerfile := ` - FROM busybox - ADD . /tmp/` - ctx, err := fakeContext(dockerfile, map[string]string{ - "Dockerfile": dockerfile, - ".dockerignore": "Dockerfile\n", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if id1, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("Didn't build it correctly:%s", err) - } - - if id2, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("Didn't build it correctly:%s", err) - } - if id1 != id2 { - c.Fatalf("Didn't use the cache - 1") - } - - // Now make sure touching Dockerfile doesn't invalidate the cache - if err = ctx.Add("Dockerfile", dockerfile+"\n# hi"); err != nil { - c.Fatalf("Didn't add Dockerfile: %s", err) - } - if id2, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("Didn't build it correctly:%s", err) - } - if id1 != id2 { - c.Fatalf("Didn't use the cache - 2") - } - - // One more time but just 'touch' it instead of changing the content - if err = ctx.Add("Dockerfile", dockerfile+"\n# hi"); err != nil { - c.Fatalf("Didn't add Dockerfile: %s", err) - } - if id2, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("Didn't build it correctly:%s", err) - } - if id1 != id2 { - c.Fatalf("Didn't use the cache - 3") - } - -} - -func (s *DockerSuite) TestBuildDockerignoringWholeDir(c *check.C) { - name := "testbuilddockerignorewholedir" - dockerfile := ` - FROM busybox - COPY . / - RUN sh -c "[[ ! -e /.gitignore ]]" - RUN sh -c "[[ -f /Makefile ]]"` - ctx, err := fakeContext(dockerfile, map[string]string{ - "Dockerfile": "FROM scratch", - "Makefile": "all:", - ".gitignore": "", - ".dockerignore": ".*\n", - }) - c.Assert(err, check.IsNil) - defer ctx.Close() - if _, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } - - c.Assert(ctx.Add(".dockerfile", "*"), check.IsNil) - if _, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } - - c.Assert(ctx.Add(".dockerfile", "."), check.IsNil) - if _, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } - - c.Assert(ctx.Add(".dockerfile", "?"), check.IsNil) - if _, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildDockerignoringBadExclusion(c *check.C) { - name := "testbuilddockerignorebadexclusion" - dockerfile := ` - FROM busybox - COPY . / - RUN sh -c "[[ ! -e /.gitignore ]]" - RUN sh -c "[[ -f /Makefile ]]"` - ctx, err := fakeContext(dockerfile, map[string]string{ - "Dockerfile": "FROM scratch", - "Makefile": "all:", - ".gitignore": "", - ".dockerignore": "!\n", - }) - c.Assert(err, check.IsNil) - defer ctx.Close() - if _, err = buildImageFromContext(name, ctx, true); err == nil { - c.Fatalf("Build was supposed to fail but didn't") - } - - if err.Error() != "failed to build the image: Error checking context: 'Illegal exclusion pattern: !'.\n" { - c.Fatalf("Incorrect output, got:%q", err.Error()) - } -} - -func (s *DockerSuite) TestBuildDockerignoringWildTopDir(c *check.C) { - dockerfile := ` - FROM busybox - COPY . / - RUN sh -c "[[ ! -e /.dockerignore ]]" - RUN sh -c "[[ ! -e /Dockerfile ]]" - RUN sh -c "[[ ! -e /file1 ]]" - RUN sh -c "[[ ! -e /dir ]]"` - - ctx, err := fakeContext(dockerfile, map[string]string{ - "Dockerfile": "FROM scratch", - "file1": "", - "dir/dfile1": "", - }) - c.Assert(err, check.IsNil) - defer ctx.Close() - - // All of these should result in ignoring all files - for _, variant := range []string{"**", "**/", "**/**", "*"} { - ctx.Add(".dockerignore", variant) - _, err = buildImageFromContext("noname", ctx, true) - c.Assert(err, check.IsNil, check.Commentf("variant: %s", variant)) - } -} - -func (s *DockerSuite) TestBuildDockerignoringWildDirs(c *check.C) { - dockerfile := ` - FROM busybox - COPY . / - #RUN sh -c "[[ -e /.dockerignore ]]" - RUN sh -c "[[ -e /Dockerfile ]] && \ - [[ ! -e /file0 ]] && \ - [[ ! -e /dir1/file0 ]] && \ - [[ ! -e /dir2/file0 ]] && \ - [[ ! -e /file1 ]] && \ - [[ ! -e /dir1/file1 ]] && \ - [[ ! -e /dir1/dir2/file1 ]] && \ - [[ ! -e /dir1/file2 ]] && \ - [[ -e /dir1/dir2/file2 ]] && \ - [[ ! -e /dir1/dir2/file4 ]] && \ - [[ ! -e /dir1/dir2/file5 ]] && \ - [[ ! -e /dir1/dir2/file6 ]] && \ - [[ ! -e /dir1/dir3/file7 ]] && \ - [[ ! -e /dir1/dir3/file8 ]] && \ - [[ -e /dir1/dir3 ]] && \ - [[ -e /dir1/dir4 ]] && \ - [[ ! -e 'dir1/dir5/fileAA' ]] && \ - [[ -e 'dir1/dir5/fileAB' ]] && \ - [[ -e 'dir1/dir5/fileB' ]]" # "." in pattern means nothing - - RUN echo all done!` - - ctx, err := fakeContext(dockerfile, map[string]string{ - "Dockerfile": "FROM scratch", - "file0": "", - "dir1/file0": "", - "dir1/dir2/file0": "", - - "file1": "", - "dir1/file1": "", - "dir1/dir2/file1": "", - - "dir1/file2": "", - "dir1/dir2/file2": "", // remains - - "dir1/dir2/file4": "", - "dir1/dir2/file5": "", - "dir1/dir2/file6": "", - "dir1/dir3/file7": "", - "dir1/dir3/file8": "", - "dir1/dir4/file9": "", - - "dir1/dir5/fileAA": "", - "dir1/dir5/fileAB": "", - "dir1/dir5/fileB": "", - - ".dockerignore": ` -**/file0 -**/*file1 -**/dir1/file2 -dir1/**/file4 -**/dir2/file5 -**/dir1/dir2/file6 -dir1/dir3/** -**/dir4/** -**/file?A -**/file\?B -**/dir5/file. -`, - }) - c.Assert(err, check.IsNil) - defer ctx.Close() - - _, err = buildImageFromContext("noname", ctx, true) - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestBuildLineBreak(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuildlinebreak" - _, err := buildImage(name, - `FROM busybox -RUN sh -c 'echo root:testpass \ - > /tmp/passwd' -RUN mkdir -p /var/run/sshd -RUN sh -c "[ "$(cat /tmp/passwd)" = "root:testpass" ]" -RUN sh -c "[ "$(ls -d /var/run/sshd)" = "/var/run/sshd" ]"`, - true) - if err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildEOLInLine(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuildeolinline" - _, err := buildImage(name, - `FROM busybox -RUN sh -c 'echo root:testpass > /tmp/passwd' -RUN echo "foo \n bar"; echo "baz" -RUN mkdir -p /var/run/sshd -RUN sh -c "[ "$(cat /tmp/passwd)" = "root:testpass" ]" -RUN sh -c "[ "$(ls -d /var/run/sshd)" = "/var/run/sshd" ]"`, - true) - if err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildCommentsShebangs(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuildcomments" - _, err := buildImage(name, - `FROM busybox -# This is an ordinary comment. -RUN { echo '#!/bin/sh'; echo 'echo hello world'; } > /hello.sh -RUN [ ! -x /hello.sh ] -# comment with line break \ -RUN chmod +x /hello.sh -RUN [ -x /hello.sh ] -RUN [ "$(cat /hello.sh)" = $'#!/bin/sh\necho hello world' ] -RUN [ "$(/hello.sh)" = "hello world" ]`, - true) - if err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildUsersAndGroups(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuildusers" - _, err := buildImage(name, - `FROM busybox - -# Make sure our defaults work -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)" = '0:0/root:root' ] - -# TODO decide if "args.user = strconv.Itoa(syscall.Getuid())" is acceptable behavior for changeUser in sysvinit instead of "return nil" when "USER" isn't specified (so that we get the proper group list even if that is the empty list, even in the default case of not supplying an explicit USER to run as, which implies USER 0) -USER root -RUN [ "$(id -G):$(id -Gn)" = '0 10:root wheel' ] - -# Setup dockerio user and group -RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd && \ - echo 'dockerio:x:1001:' >> /etc/group - -# Make sure we can switch to our user and all the information is exactly as we expect it to be -USER dockerio -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1001:1001/dockerio:dockerio/1001:dockerio' ] - -# Switch back to root and double check that worked exactly as we might expect it to -USER root -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '0:0/root:root/0 10:root wheel' ] && \ - # Add a "supplementary" group for our dockerio user - echo 'supplementary:x:1002:dockerio' >> /etc/group - -# ... and then go verify that we get it like we expect -USER dockerio -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1001:1001/dockerio:dockerio/1001 1002:dockerio supplementary' ] -USER 1001 -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1001:1001/dockerio:dockerio/1001 1002:dockerio supplementary' ] - -# super test the new "user:group" syntax -USER dockerio:dockerio -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1001:1001/dockerio:dockerio/1001:dockerio' ] -USER 1001:dockerio -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1001:1001/dockerio:dockerio/1001:dockerio' ] -USER dockerio:1001 -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1001:1001/dockerio:dockerio/1001:dockerio' ] -USER 1001:1001 -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1001:1001/dockerio:dockerio/1001:dockerio' ] -USER dockerio:supplementary -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1001:1002/dockerio:supplementary/1002:supplementary' ] -USER dockerio:1002 -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1001:1002/dockerio:supplementary/1002:supplementary' ] -USER 1001:supplementary -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1001:1002/dockerio:supplementary/1002:supplementary' ] -USER 1001:1002 -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1001:1002/dockerio:supplementary/1002:supplementary' ] - -# make sure unknown uid/gid still works properly -USER 1042:1043 -RUN [ "$(id -u):$(id -g)/$(id -un):$(id -gn)/$(id -G):$(id -Gn)" = '1042:1043/1042:1043/1043:1043' ]`, - true) - if err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildEnvUsage(c *check.C) { - // /docker/world/hello is not owned by the correct user - testRequires(c, NotUserNamespace) - testRequires(c, DaemonIsLinux) - name := "testbuildenvusage" - dockerfile := `FROM busybox -ENV HOME /root -ENV PATH $HOME/bin:$PATH -ENV PATH /tmp:$PATH -RUN [ "$PATH" = "/tmp:$HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ] -ENV FOO /foo/baz -ENV BAR /bar -ENV BAZ $BAR -ENV FOOPATH $PATH:$FOO -RUN [ "$BAR" = "$BAZ" ] -RUN [ "$FOOPATH" = "$PATH:/foo/baz" ] -ENV FROM hello/docker/world -ENV TO /docker/world/hello -ADD $FROM $TO -RUN [ "$(cat $TO)" = "hello" ] -ENV abc=def -ENV ghi=$abc -RUN [ "$ghi" = "def" ] -` - ctx, err := fakeContext(dockerfile, map[string]string{ - "hello/docker/world": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - _, err = buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildEnvUsage2(c *check.C) { - // /docker/world/hello is not owned by the correct user - testRequires(c, NotUserNamespace) - testRequires(c, DaemonIsLinux) - name := "testbuildenvusage2" - dockerfile := `FROM busybox -ENV abc=def def="hello world" -RUN [ "$abc,$def" = "def,hello world" ] -ENV def=hello\ world v1=abc v2="hi there" v3='boogie nights' v4="with'quotes too" -RUN [ "$def,$v1,$v2,$v3,$v4" = "hello world,abc,hi there,boogie nights,with'quotes too" ] -ENV abc=zzz FROM=hello/docker/world -ENV abc=zzz TO=/docker/world/hello -ADD $FROM $TO -RUN [ "$abc,$(cat $TO)" = "zzz,hello" ] -ENV abc 'yyy' -RUN [ $abc = 'yyy' ] -ENV abc= -RUN [ "$abc" = "" ] - -# use grep to make sure if the builder substitutes \$foo by mistake -# we don't get a false positive -ENV abc=\$foo -RUN [ "$abc" = "\$foo" ] && (echo "$abc" | grep foo) -ENV abc \$foo -RUN [ "$abc" = "\$foo" ] && (echo "$abc" | grep foo) - -ENV abc=\'foo\' abc2=\"foo\" -RUN [ "$abc,$abc2" = "'foo',\"foo\"" ] -ENV abc "foo" -RUN [ "$abc" = "foo" ] -ENV abc 'foo' -RUN [ "$abc" = 'foo' ] -ENV abc \'foo\' -RUN [ "$abc" = "'foo'" ] -ENV abc \"foo\" -RUN [ "$abc" = '"foo"' ] - -ENV abc=ABC -RUN [ "$abc" = "ABC" ] -ENV def1=${abc:-DEF} def2=${ccc:-DEF} -ENV def3=${ccc:-${def2}xx} def4=${abc:+ALT} def5=${def2:+${abc}:} def6=${ccc:-\$abc:} def7=${ccc:-\${abc}:} -RUN [ "$def1,$def2,$def3,$def4,$def5,$def6,$def7" = 'ABC,DEF,DEFxx,ALT,ABC:,$abc:,${abc:}' ] -ENV mypath=${mypath:+$mypath:}/home -ENV mypath=${mypath:+$mypath:}/away -RUN [ "$mypath" = '/home:/away' ] - -ENV e1=bar -ENV e2=$e1 e3=$e11 e4=\$e1 e5=\$e11 -RUN [ "$e0,$e1,$e2,$e3,$e4,$e5" = ',bar,bar,,$e1,$e11' ] - -ENV ee1 bar -ENV ee2 $ee1 -ENV ee3 $ee11 -ENV ee4 \$ee1 -ENV ee5 \$ee11 -RUN [ "$ee1,$ee2,$ee3,$ee4,$ee5" = 'bar,bar,,$ee1,$ee11' ] - -ENV eee1="foo" eee2='foo' -ENV eee3 "foo" -ENV eee4 'foo' -RUN [ "$eee1,$eee2,$eee3,$eee4" = 'foo,foo,foo,foo' ] - -` - ctx, err := fakeContext(dockerfile, map[string]string{ - "hello/docker/world": "hello", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - _, err = buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildAddScript(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuildaddscript" - dockerfile := ` -FROM busybox -ADD test /test -RUN ["chmod","+x","/test"] -RUN ["/test"] -RUN [ "$(cat /testfile)" = 'test!' ]` - ctx, err := fakeContext(dockerfile, map[string]string{ - "test": "#!/bin/sh\necho 'test!' > /testfile", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - _, err = buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildAddTar(c *check.C) { - // /test/foo is not owned by the correct user - testRequires(c, NotUserNamespace) - name := "testbuildaddtar" - - ctx := func() *FakeContext { - dockerfile := ` -FROM busybox -ADD test.tar / -RUN cat /test/foo | grep Hi -ADD test.tar /test.tar -RUN cat /test.tar/test/foo | grep Hi -ADD test.tar /unlikely-to-exist -RUN cat /unlikely-to-exist/test/foo | grep Hi -ADD test.tar /unlikely-to-exist-trailing-slash/ -RUN cat /unlikely-to-exist-trailing-slash/test/foo | grep Hi -RUN sh -c "mkdir /existing-directory" #sh -c is needed on Windows to use the correct mkdir -ADD test.tar /existing-directory -RUN cat /existing-directory/test/foo | grep Hi -ADD test.tar /existing-directory-trailing-slash/ -RUN cat /existing-directory-trailing-slash/test/foo | grep Hi` - tmpDir, err := ioutil.TempDir("", "fake-context") - c.Assert(err, check.IsNil) - testTar, err := os.Create(filepath.Join(tmpDir, "test.tar")) - if err != nil { - c.Fatalf("failed to create test.tar archive: %v", err) - } - defer testTar.Close() - - tw := tar.NewWriter(testTar) - - if err := tw.WriteHeader(&tar.Header{ - Name: "test/foo", - Size: 2, - }); err != nil { - c.Fatalf("failed to write tar file header: %v", err) - } - if _, err := tw.Write([]byte("Hi")); err != nil { - c.Fatalf("failed to write tar file content: %v", err) - } - if err := tw.Close(); err != nil { - c.Fatalf("failed to close tar archive: %v", err) - } - - if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil { - c.Fatalf("failed to open destination dockerfile: %v", err) - } - return fakeContextFromDir(tmpDir) - }() - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("build failed to complete for TestBuildAddTar: %v", err) - } - -} - -func (s *DockerSuite) TestBuildAddBrokenTar(c *check.C) { - name := "testbuildaddbrokentar" - - ctx := func() *FakeContext { - dockerfile := ` -FROM busybox -ADD test.tar /` - tmpDir, err := ioutil.TempDir("", "fake-context") - c.Assert(err, check.IsNil) - testTar, err := os.Create(filepath.Join(tmpDir, "test.tar")) - if err != nil { - c.Fatalf("failed to create test.tar archive: %v", err) - } - defer testTar.Close() - - tw := tar.NewWriter(testTar) - - if err := tw.WriteHeader(&tar.Header{ - Name: "test/foo", - Size: 2, - }); err != nil { - c.Fatalf("failed to write tar file header: %v", err) - } - if _, err := tw.Write([]byte("Hi")); err != nil { - c.Fatalf("failed to write tar file content: %v", err) - } - if err := tw.Close(); err != nil { - c.Fatalf("failed to close tar archive: %v", err) - } - - // Corrupt the tar by removing one byte off the end - stat, err := testTar.Stat() - if err != nil { - c.Fatalf("failed to stat tar archive: %v", err) - } - if err := testTar.Truncate(stat.Size() - 1); err != nil { - c.Fatalf("failed to truncate tar archive: %v", err) - } - - if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil { - c.Fatalf("failed to open destination dockerfile: %v", err) - } - return fakeContextFromDir(tmpDir) - }() - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err == nil { - c.Fatalf("build should have failed for TestBuildAddBrokenTar") - } -} - -func (s *DockerSuite) TestBuildAddNonTar(c *check.C) { - name := "testbuildaddnontar" - - // Should not try to extract test.tar - ctx, err := fakeContext(` - FROM busybox - ADD test.tar / - RUN test -f /test.tar`, - map[string]string{"test.tar": "not_a_tar_file"}) - - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("build failed for TestBuildAddNonTar") - } -} - -func (s *DockerSuite) TestBuildAddTarXz(c *check.C) { - // /test/foo is not owned by the correct user - testRequires(c, NotUserNamespace) - testRequires(c, DaemonIsLinux) - name := "testbuildaddtarxz" - - ctx := func() *FakeContext { - dockerfile := ` - FROM busybox - ADD test.tar.xz / - RUN cat /test/foo | grep Hi` - tmpDir, err := ioutil.TempDir("", "fake-context") - c.Assert(err, check.IsNil) - testTar, err := os.Create(filepath.Join(tmpDir, "test.tar")) - if err != nil { - c.Fatalf("failed to create test.tar archive: %v", err) - } - defer testTar.Close() - - tw := tar.NewWriter(testTar) - - if err := tw.WriteHeader(&tar.Header{ - Name: "test/foo", - Size: 2, - }); err != nil { - c.Fatalf("failed to write tar file header: %v", err) - } - if _, err := tw.Write([]byte("Hi")); err != nil { - c.Fatalf("failed to write tar file content: %v", err) - } - if err := tw.Close(); err != nil { - c.Fatalf("failed to close tar archive: %v", err) - } - - xzCompressCmd := exec.Command("xz", "-k", "test.tar") - xzCompressCmd.Dir = tmpDir - out, _, err := runCommandWithOutput(xzCompressCmd) - if err != nil { - c.Fatal(err, out) - } - - if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil { - c.Fatalf("failed to open destination dockerfile: %v", err) - } - return fakeContextFromDir(tmpDir) - }() - - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err) - } - -} - -func (s *DockerSuite) TestBuildAddTarXzGz(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuildaddtarxzgz" - - ctx := func() *FakeContext { - dockerfile := ` - FROM busybox - ADD test.tar.xz.gz / - RUN ls /test.tar.xz.gz` - tmpDir, err := ioutil.TempDir("", "fake-context") - c.Assert(err, check.IsNil) - testTar, err := os.Create(filepath.Join(tmpDir, "test.tar")) - if err != nil { - c.Fatalf("failed to create test.tar archive: %v", err) - } - defer testTar.Close() - - tw := tar.NewWriter(testTar) - - if err := tw.WriteHeader(&tar.Header{ - Name: "test/foo", - Size: 2, - }); err != nil { - c.Fatalf("failed to write tar file header: %v", err) - } - if _, err := tw.Write([]byte("Hi")); err != nil { - c.Fatalf("failed to write tar file content: %v", err) - } - if err := tw.Close(); err != nil { - c.Fatalf("failed to close tar archive: %v", err) - } - - xzCompressCmd := exec.Command("xz", "-k", "test.tar") - xzCompressCmd.Dir = tmpDir - out, _, err := runCommandWithOutput(xzCompressCmd) - if err != nil { - c.Fatal(err, out) - } - - gzipCompressCmd := exec.Command("gzip", "test.tar.xz") - gzipCompressCmd.Dir = tmpDir - out, _, err = runCommandWithOutput(gzipCompressCmd) - if err != nil { - c.Fatal(err, out) - } - - if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil { - c.Fatalf("failed to open destination dockerfile: %v", err) - } - return fakeContextFromDir(tmpDir) - }() - - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("build failed to complete for TestBuildAddTarXz: %v", err) - } - -} - -func (s *DockerSuite) TestBuildFromGit(c *check.C) { - name := "testbuildfromgit" - git, err := newFakeGit("repo", map[string]string{ - "Dockerfile": `FROM busybox - ADD first /first - RUN [ -f /first ] - MAINTAINER docker`, - "first": "test git data", - }, true) - if err != nil { - c.Fatal(err) - } - defer git.Close() - - _, err = buildImageFromPath(name, git.RepoURL, true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Author") - if res != "docker" { - c.Fatalf("Maintainer should be docker, got %s", res) - } -} - -func (s *DockerSuite) TestBuildFromGitWithContext(c *check.C) { - name := "testbuildfromgit" - git, err := newFakeGit("repo", map[string]string{ - "docker/Dockerfile": `FROM busybox - ADD first /first - RUN [ -f /first ] - MAINTAINER docker`, - "docker/first": "test git data", - }, true) - if err != nil { - c.Fatal(err) - } - defer git.Close() - - u := fmt.Sprintf("%s#master:docker", git.RepoURL) - _, err = buildImageFromPath(name, u, true) - if err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Author") - if res != "docker" { - c.Fatalf("Maintainer should be docker, got %s", res) - } -} - -func (s *DockerSuite) TestBuildFromGitwithF(c *check.C) { - name := "testbuildfromgitwithf" - git, err := newFakeGit("repo", map[string]string{ - "myApp/myDockerfile": `FROM busybox - RUN echo hi from Dockerfile`, - }, true) - if err != nil { - c.Fatal(err) - } - defer git.Close() - - out, _, err := dockerCmdWithError("build", "-t", name, "--no-cache", "-f", "myApp/myDockerfile", git.RepoURL) - if err != nil { - c.Fatalf("Error on build. Out: %s\nErr: %v", out, err) - } - - if !strings.Contains(out, "hi from Dockerfile") { - c.Fatalf("Missing expected output, got:\n%s", out) - } -} - -func (s *DockerSuite) TestBuildFromRemoteTarball(c *check.C) { - name := "testbuildfromremotetarball" - - buffer := new(bytes.Buffer) - tw := tar.NewWriter(buffer) - defer tw.Close() - - dockerfile := []byte(`FROM busybox - MAINTAINER docker`) - if err := tw.WriteHeader(&tar.Header{ - Name: "Dockerfile", - Size: int64(len(dockerfile)), - }); err != nil { - c.Fatalf("failed to write tar file header: %v", err) - } - if _, err := tw.Write(dockerfile); err != nil { - c.Fatalf("failed to write tar file content: %v", err) - } - if err := tw.Close(); err != nil { - c.Fatalf("failed to close tar archive: %v", err) - } - - server, err := fakeBinaryStorage(map[string]*bytes.Buffer{ - "testT.tar": buffer, - }) - c.Assert(err, check.IsNil) - - defer server.Close() - - _, err = buildImageFromPath(name, server.URL()+"/testT.tar", true) - c.Assert(err, check.IsNil) - - res := inspectField(c, name, "Author") - - if res != "docker" { - c.Fatalf("Maintainer should be docker, got %s", res) - } -} - -func (s *DockerSuite) TestBuildCleanupCmdOnEntrypoint(c *check.C) { - name := "testbuildcmdcleanuponentrypoint" - if _, err := buildImage(name, - `FROM `+minimalBaseImage()+` - CMD ["test"] - ENTRYPOINT ["echo"]`, - true); err != nil { - c.Fatal(err) - } - if _, err := buildImage(name, - fmt.Sprintf(`FROM %s - ENTRYPOINT ["cat"]`, name), - true); err != nil { - c.Fatal(err) - } - res := inspectField(c, name, "Config.Cmd") - if res != "[]" { - c.Fatalf("Cmd %s, expected nil", res) - } - - res = inspectField(c, name, "Config.Entrypoint") - if expected := "[cat]"; res != expected { - c.Fatalf("Entrypoint %s, expected %s", res, expected) - } -} - -func (s *DockerSuite) TestBuildClearCmd(c *check.C) { - name := "testbuildclearcmd" - _, err := buildImage(name, - `From `+minimalBaseImage()+` - ENTRYPOINT ["/bin/bash"] - CMD []`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectFieldJSON(c, name, "Config.Cmd") - if res != "[]" { - c.Fatalf("Cmd %s, expected %s", res, "[]") - } -} - -func (s *DockerSuite) TestBuildEmptyCmd(c *check.C) { - // Skip on Windows. Base image on Windows has a CMD set in the image. - testRequires(c, DaemonIsLinux) - - name := "testbuildemptycmd" - if _, err := buildImage(name, "FROM "+minimalBaseImage()+"\nMAINTAINER quux\n", true); err != nil { - c.Fatal(err) - } - res := inspectFieldJSON(c, name, "Config.Cmd") - if res != "null" { - c.Fatalf("Cmd %s, expected %s", res, "null") - } -} - -func (s *DockerSuite) TestBuildOnBuildOutput(c *check.C) { - name := "testbuildonbuildparent" - if _, err := buildImage(name, "FROM busybox\nONBUILD RUN echo foo\n", true); err != nil { - c.Fatal(err) - } - - _, out, err := buildImageWithOut(name, "FROM "+name+"\nMAINTAINER quux\n", true) - if err != nil { - c.Fatal(err) - } - - if !strings.Contains(out, "# Executing 1 build trigger") { - c.Fatal("failed to find the build trigger output", out) - } -} - -func (s *DockerSuite) TestBuildInvalidTag(c *check.C) { - name := "abcd:" + stringutils.GenerateRandomAlphaOnlyString(200) - _, out, err := buildImageWithOut(name, "FROM "+minimalBaseImage()+"\nMAINTAINER quux\n", true) - // if the error doesn't check for illegal tag name, or the image is built - // then this should fail - if !strings.Contains(out, "Error parsing reference") || strings.Contains(out, "Sending build context to Docker daemon") { - c.Fatalf("failed to stop before building. Error: %s, Output: %s", err, out) - } -} - -func (s *DockerSuite) TestBuildCmdShDashC(c *check.C) { - name := "testbuildcmdshc" - if _, err := buildImage(name, "FROM busybox\nCMD echo cmd\n", true); err != nil { - c.Fatal(err) - } - - res := inspectFieldJSON(c, name, "Config.Cmd") - - expected := `["/bin/sh","-c","echo cmd"]` - if daemonPlatform == "windows" { - expected = `["cmd","/S","/C","echo cmd"]` - } - - if res != expected { - c.Fatalf("Expected value %s not in Config.Cmd: %s", expected, res) - } - -} - -func (s *DockerSuite) TestBuildCmdSpaces(c *check.C) { - // Test to make sure that when we strcat arrays we take into account - // the arg separator to make sure ["echo","hi"] and ["echo hi"] don't - // look the same - name := "testbuildcmdspaces" - var id1 string - var id2 string - var err error - - if id1, err = buildImage(name, "FROM busybox\nCMD [\"echo hi\"]\n", true); err != nil { - c.Fatal(err) - } - - if id2, err = buildImage(name, "FROM busybox\nCMD [\"echo\", \"hi\"]\n", true); err != nil { - c.Fatal(err) - } - - if id1 == id2 { - c.Fatal("Should not have resulted in the same CMD") - } - - // Now do the same with ENTRYPOINT - if id1, err = buildImage(name, "FROM busybox\nENTRYPOINT [\"echo hi\"]\n", true); err != nil { - c.Fatal(err) - } - - if id2, err = buildImage(name, "FROM busybox\nENTRYPOINT [\"echo\", \"hi\"]\n", true); err != nil { - c.Fatal(err) - } - - if id1 == id2 { - c.Fatal("Should not have resulted in the same ENTRYPOINT") - } - -} - -func (s *DockerSuite) TestBuildCmdJSONNoShDashC(c *check.C) { - name := "testbuildcmdjson" - if _, err := buildImage(name, "FROM busybox\nCMD [\"echo\", \"cmd\"]", true); err != nil { - c.Fatal(err) - } - - res := inspectFieldJSON(c, name, "Config.Cmd") - - expected := `["echo","cmd"]` - - if res != expected { - c.Fatalf("Expected value %s not in Config.Cmd: %s", expected, res) - } - -} - -func (s *DockerSuite) TestBuildEntrypointInheritance(c *check.C) { - - if _, err := buildImage("parent", ` - FROM busybox - ENTRYPOINT exit 130 - `, true); err != nil { - c.Fatal(err) - } - - if _, status, _ := dockerCmdWithError("run", "parent"); status != 130 { - c.Fatalf("expected exit code 130 but received %d", status) - } - - if _, err := buildImage("child", ` - FROM parent - ENTRYPOINT exit 5 - `, true); err != nil { - c.Fatal(err) - } - - if _, status, _ := dockerCmdWithError("run", "child"); status != 5 { - c.Fatalf("expected exit code 5 but received %d", status) - } - -} - -func (s *DockerSuite) TestBuildEntrypointInheritanceInspect(c *check.C) { - var ( - name = "testbuildepinherit" - name2 = "testbuildepinherit2" - expected = `["/bin/sh","-c","echo quux"]` - ) - - if daemonPlatform == "windows" { - expected = `["cmd","/S","/C","echo quux"]` - } - - if _, err := buildImage(name, "FROM busybox\nENTRYPOINT /foo/bar", true); err != nil { - c.Fatal(err) - } - - if _, err := buildImage(name2, fmt.Sprintf("FROM %s\nENTRYPOINT echo quux", name), true); err != nil { - c.Fatal(err) - } - - res := inspectFieldJSON(c, name2, "Config.Entrypoint") - - if res != expected { - c.Fatalf("Expected value %s not in Config.Entrypoint: %s", expected, res) - } - - out, _ := dockerCmd(c, "run", name2) - - expected = "quux" - - if strings.TrimSpace(out) != expected { - c.Fatalf("Expected output is %s, got %s", expected, out) - } - -} - -func (s *DockerSuite) TestBuildRunShEntrypoint(c *check.C) { - name := "testbuildentrypoint" - _, err := buildImage(name, - `FROM busybox - ENTRYPOINT echo`, - true) - if err != nil { - c.Fatal(err) - } - - dockerCmd(c, "run", "--rm", name) -} - -func (s *DockerSuite) TestBuildExoticShellInterpolation(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuildexoticshellinterpolation" - - _, err := buildImage(name, ` - FROM busybox - - ENV SOME_VAR a.b.c - - RUN [ "$SOME_VAR" = 'a.b.c' ] - RUN [ "${SOME_VAR}" = 'a.b.c' ] - RUN [ "${SOME_VAR%.*}" = 'a.b' ] - RUN [ "${SOME_VAR%%.*}" = 'a' ] - RUN [ "${SOME_VAR#*.}" = 'b.c' ] - RUN [ "${SOME_VAR##*.}" = 'c' ] - RUN [ "${SOME_VAR/c/d}" = 'a.b.d' ] - RUN [ "${#SOME_VAR}" = '5' ] - - RUN [ "${SOME_UNSET_VAR:-$SOME_VAR}" = 'a.b.c' ] - RUN [ "${SOME_VAR:+Version: ${SOME_VAR}}" = 'Version: a.b.c' ] - RUN [ "${SOME_UNSET_VAR:+${SOME_VAR}}" = '' ] - RUN [ "${SOME_UNSET_VAR:-${SOME_VAR:-d.e.f}}" = 'a.b.c' ] - `, false) - if err != nil { - c.Fatal(err) - } - -} - -func (s *DockerSuite) TestBuildVerifySingleQuoteFails(c *check.C) { - // This testcase is supposed to generate an error because the - // JSON array we're passing in on the CMD uses single quotes instead - // of double quotes (per the JSON spec). This means we interpret it - // as a "string" instead of "JSON array" and pass it on to "sh -c" and - // it should barf on it. - name := "testbuildsinglequotefails" - - if _, err := buildImage(name, - `FROM busybox - CMD [ '/bin/sh', '-c', 'echo hi' ]`, - true); err != nil { - c.Fatal(err) - } - - if _, _, err := dockerCmdWithError("run", "--rm", name); err == nil { - c.Fatal("The image was not supposed to be able to run") - } - -} - -func (s *DockerSuite) TestBuildVerboseOut(c *check.C) { - name := "testbuildverboseout" - expected := "\n123\n" - - if daemonPlatform == "windows" { - expected = "\n123\r\n" - } - - _, out, err := buildImageWithOut(name, - `FROM busybox -RUN echo 123`, - false) - - if err != nil { - c.Fatal(err) - } - if !strings.Contains(out, expected) { - c.Fatalf("Output should contain %q: %q", "123", out) - } - -} - -func (s *DockerSuite) TestBuildWithTabs(c *check.C) { - name := "testbuildwithtabs" - _, err := buildImage(name, - "FROM busybox\nRUN echo\tone\t\ttwo", true) - if err != nil { - c.Fatal(err) - } - res := inspectFieldJSON(c, name, "ContainerConfig.Cmd") - expected1 := `["/bin/sh","-c","echo\tone\t\ttwo"]` - expected2 := `["/bin/sh","-c","echo\u0009one\u0009\u0009two"]` // syntactically equivalent, and what Go 1.3 generates - if daemonPlatform == "windows" { - expected1 = `["cmd","/S","/C","echo\tone\t\ttwo"]` - expected2 = `["cmd","/S","/C","echo\u0009one\u0009\u0009two"]` // syntactically equivalent, and what Go 1.3 generates - } - if res != expected1 && res != expected2 { - c.Fatalf("Missing tabs.\nGot: %s\nExp: %s or %s", res, expected1, expected2) - } -} - -func (s *DockerSuite) TestBuildLabels(c *check.C) { - name := "testbuildlabel" - expected := `{"License":"GPL","Vendor":"Acme"}` - _, err := buildImage(name, - `FROM busybox - LABEL Vendor=Acme - LABEL License GPL`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectFieldJSON(c, name, "Config.Labels") - if res != expected { - c.Fatalf("Labels %s, expected %s", res, expected) - } -} - -func (s *DockerSuite) TestBuildLabelsCache(c *check.C) { - name := "testbuildlabelcache" - - id1, err := buildImage(name, - `FROM busybox - LABEL Vendor=Acme`, false) - if err != nil { - c.Fatalf("Build 1 should have worked: %v", err) - } - - id2, err := buildImage(name, - `FROM busybox - LABEL Vendor=Acme`, true) - if err != nil || id1 != id2 { - c.Fatalf("Build 2 should have worked & used cache(%s,%s): %v", id1, id2, err) - } - - id2, err = buildImage(name, - `FROM busybox - LABEL Vendor=Acme1`, true) - if err != nil || id1 == id2 { - c.Fatalf("Build 3 should have worked & NOT used cache(%s,%s): %v", id1, id2, err) - } - - id2, err = buildImage(name, - `FROM busybox - LABEL Vendor Acme`, true) // Note: " " and "=" should be same - if err != nil || id1 != id2 { - c.Fatalf("Build 4 should have worked & used cache(%s,%s): %v", id1, id2, err) - } - - // Now make sure the cache isn't used by mistake - id1, err = buildImage(name, - `FROM busybox - LABEL f1=b1 f2=b2`, false) - if err != nil { - c.Fatalf("Build 5 should have worked: %q", err) - } - - id2, err = buildImage(name, - `FROM busybox - LABEL f1="b1 f2=b2"`, true) - if err != nil || id1 == id2 { - c.Fatalf("Build 6 should have worked & NOT used the cache(%s,%s): %q", id1, id2, err) - } - -} - -func (s *DockerSuite) TestBuildNotVerboseSuccess(c *check.C) { - // This test makes sure that -q works correctly when build is successful: - // stdout has only the image ID (long image ID) and stderr is empty. - var stdout, stderr string - var err error - outRegexp := regexp.MustCompile("^(sha256:|)[a-z0-9]{64}\\n$") - - tt := []struct { - Name string - BuildFunc func(string) - }{ - { - Name: "quiet_build_stdin_success", - BuildFunc: func(name string) { - _, stdout, stderr, err = buildImageWithStdoutStderr(name, "FROM busybox", true, "-q", "--force-rm", "--rm") - }, - }, - { - Name: "quiet_build_ctx_success", - BuildFunc: func(name string) { - ctx, err := fakeContext("FROM busybox", map[string]string{ - "quiet_build_success_fctx": "test", - }) - if err != nil { - c.Fatalf("Failed to create context: %s", err.Error()) - } - defer ctx.Close() - _, stdout, stderr, err = buildImageFromContextWithStdoutStderr(name, ctx, true, "-q", "--force-rm", "--rm") - }, - }, - { - Name: "quiet_build_git_success", - BuildFunc: func(name string) { - git, err := newFakeGit("repo", map[string]string{ - "Dockerfile": "FROM busybox", - }, true) - if err != nil { - c.Fatalf("Failed to create the git repo: %s", err.Error()) - } - defer git.Close() - _, stdout, stderr, err = buildImageFromGitWithStdoutStderr(name, git, true, "-q", "--force-rm", "--rm") - - }, - }, - } - - for _, te := range tt { - te.BuildFunc(te.Name) - if err != nil { - c.Fatalf("Test %s shouldn't fail, but got the following error: %s", te.Name, err.Error()) - } - if outRegexp.Find([]byte(stdout)) == nil { - c.Fatalf("Test %s expected stdout to match the [%v] regexp, but it is [%v]", te.Name, outRegexp, stdout) - } - - if stderr != "" { - c.Fatalf("Test %s expected stderr to be empty, but it is [%#v]", te.Name, stderr) - } - } - -} - -func (s *DockerSuite) TestBuildNotVerboseFailureWithNonExistImage(c *check.C) { - // This test makes sure that -q works correctly when build fails by - // comparing between the stderr output in quiet mode and in stdout - // and stderr output in verbose mode - testRequires(c, Network) - testName := "quiet_build_not_exists_image" - buildCmd := "FROM busybox11" - _, _, qstderr, qerr := buildImageWithStdoutStderr(testName, buildCmd, false, "-q", "--force-rm", "--rm") - _, vstdout, vstderr, verr := buildImageWithStdoutStderr(testName, buildCmd, false, "--force-rm", "--rm") - if verr == nil || qerr == nil { - c.Fatal(fmt.Errorf("Test [%s] expected to fail but didn't", testName)) - } - if qstderr != vstdout+vstderr { - c.Fatal(fmt.Errorf("Test[%s] expected that quiet stderr and verbose stdout are equal; quiet [%v], verbose [%v]", testName, qstderr, vstdout+vstderr)) - } -} - -func (s *DockerSuite) TestBuildNotVerboseFailure(c *check.C) { - // This test makes sure that -q works correctly when build fails by - // comparing between the stderr output in quiet mode and in stdout - // and stderr output in verbose mode - tt := []struct { - TestName string - BuildCmds string - }{ - {"quiet_build_no_from_at_the_beginning", "RUN whoami"}, - {"quiet_build_unknown_instr", "FROMD busybox"}, - } - - for _, te := range tt { - _, _, qstderr, qerr := buildImageWithStdoutStderr(te.TestName, te.BuildCmds, false, "-q", "--force-rm", "--rm") - _, vstdout, vstderr, verr := buildImageWithStdoutStderr(te.TestName, te.BuildCmds, false, "--force-rm", "--rm") - if verr == nil || qerr == nil { - c.Fatal(fmt.Errorf("Test [%s] expected to fail but didn't", te.TestName)) - } - if qstderr != vstdout+vstderr { - c.Fatal(fmt.Errorf("Test[%s] expected that quiet stderr and verbose stdout are equal; quiet [%v], verbose [%v]", te.TestName, qstderr, vstdout+vstderr)) - } - } -} - -func (s *DockerSuite) TestBuildNotVerboseFailureRemote(c *check.C) { - // This test ensures that when given a wrong URL, stderr in quiet mode and - // stderr in verbose mode are identical. - // TODO(vdemeester) with cobra, stdout has a carriage return too much so this test should not check stdout - URL := "http://something.invalid" - Name := "quiet_build_wrong_remote" - _, _, qstderr, qerr := buildImageWithStdoutStderr(Name, "", false, "-q", "--force-rm", "--rm", URL) - _, _, vstderr, verr := buildImageWithStdoutStderr(Name, "", false, "--force-rm", "--rm", URL) - if qerr == nil || verr == nil { - c.Fatal(fmt.Errorf("Test [%s] expected to fail but didn't", Name)) - } - if qstderr != vstderr { - c.Fatal(fmt.Errorf("Test[%s] expected that quiet stderr and verbose stdout are equal; quiet [%v], verbose [%v]", Name, qstderr, vstderr)) - } -} - -func (s *DockerSuite) TestBuildStderr(c *check.C) { - // This test just makes sure that no non-error output goes - // to stderr - name := "testbuildstderr" - _, _, stderr, err := buildImageWithStdoutStderr(name, - "FROM busybox\nRUN echo one", true) - if err != nil { - c.Fatal(err) - } - - if runtime.GOOS == "windows" && - daemonPlatform != "windows" { - // Windows to non-Windows should have a security warning - if !strings.Contains(stderr, "SECURITY WARNING:") { - c.Fatalf("Stderr contains unexpected output: %q", stderr) - } - } else { - // Other platform combinations should have no stderr written too - if stderr != "" { - c.Fatalf("Stderr should have been empty, instead it's: %q", stderr) - } - } -} - -func (s *DockerSuite) TestBuildChownSingleFile(c *check.C) { - testRequires(c, UnixCli) // test uses chown: not available on windows - testRequires(c, DaemonIsLinux) - - name := "testbuildchownsinglefile" - - ctx, err := fakeContext(` -FROM busybox -COPY test / -RUN ls -l /test -RUN [ $(ls -l /test | awk '{print $3":"$4}') = 'root:root' ] -`, map[string]string{ - "test": "test", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if err := os.Chown(filepath.Join(ctx.Dir, "test"), 4242, 4242); err != nil { - c.Fatal(err) - } - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } - -} - -func (s *DockerSuite) TestBuildSymlinkBreakout(c *check.C) { - name := "testbuildsymlinkbreakout" - tmpdir, err := ioutil.TempDir("", name) - c.Assert(err, check.IsNil) - defer os.RemoveAll(tmpdir) - ctx := filepath.Join(tmpdir, "context") - if err := os.MkdirAll(ctx, 0755); err != nil { - c.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(ctx, "Dockerfile"), []byte(` - from busybox - add symlink.tar / - add inject /symlink/ - `), 0644); err != nil { - c.Fatal(err) - } - inject := filepath.Join(ctx, "inject") - if err := ioutil.WriteFile(inject, nil, 0644); err != nil { - c.Fatal(err) - } - f, err := os.Create(filepath.Join(ctx, "symlink.tar")) - if err != nil { - c.Fatal(err) - } - w := tar.NewWriter(f) - w.WriteHeader(&tar.Header{ - Name: "symlink2", - Typeflag: tar.TypeSymlink, - Linkname: "/../../../../../../../../../../../../../../", - Uid: os.Getuid(), - Gid: os.Getgid(), - }) - w.WriteHeader(&tar.Header{ - Name: "symlink", - Typeflag: tar.TypeSymlink, - Linkname: filepath.Join("symlink2", tmpdir), - Uid: os.Getuid(), - Gid: os.Getgid(), - }) - w.Close() - f.Close() - if _, err := buildImageFromContext(name, fakeContextFromDir(ctx), false); err != nil { - c.Fatal(err) - } - if _, err := os.Lstat(filepath.Join(tmpdir, "inject")); err == nil { - c.Fatal("symlink breakout - inject") - } else if !os.IsNotExist(err) { - c.Fatalf("unexpected error: %v", err) - } -} - -func (s *DockerSuite) TestBuildXZHost(c *check.C) { - // /usr/local/sbin/xz gets permission denied for the user - testRequires(c, NotUserNamespace) - testRequires(c, DaemonIsLinux) - name := "testbuildxzhost" - - ctx, err := fakeContext(` -FROM busybox -ADD xz /usr/local/sbin/ -RUN chmod 755 /usr/local/sbin/xz -ADD test.xz / -RUN [ ! -e /injected ]`, - map[string]string{ - "test.xz": "\xfd\x37\x7a\x58\x5a\x00\x00\x04\xe6\xd6\xb4\x46\x02\x00" + - "\x21\x01\x16\x00\x00\x00\x74\x2f\xe5\xa3\x01\x00\x3f\xfd" + - "\x37\x7a\x58\x5a\x00\x00\x04\xe6\xd6\xb4\x46\x02\x00\x21", - "xz": "#!/bin/sh\ntouch /injected", - }) - - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } - -} - -func (s *DockerSuite) TestBuildVolumesRetainContents(c *check.C) { - // /foo/file gets permission denied for the user - testRequires(c, NotUserNamespace) - testRequires(c, DaemonIsLinux) // TODO Windows: Issue #20127 - var ( - name = "testbuildvolumescontent" - expected = "some text" - volName = "/foo" - ) - - if daemonPlatform == "windows" { - volName = "C:/foo" - } - - ctx, err := fakeContext(` -FROM busybox -COPY content /foo/file -VOLUME `+volName+` -CMD cat /foo/file`, - map[string]string{ - "content": expected, - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, false); err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "run", "--rm", name) - if out != expected { - c.Fatalf("expected file contents for /foo/file to be %q but received %q", expected, out) - } - -} - -func (s *DockerSuite) TestBuildRenamedDockerfile(c *check.C) { - - ctx, err := fakeContext(`FROM busybox - RUN echo from Dockerfile`, - map[string]string{ - "Dockerfile": "FROM busybox\nRUN echo from Dockerfile", - "files/Dockerfile": "FROM busybox\nRUN echo from files/Dockerfile", - "files/dFile": "FROM busybox\nRUN echo from files/dFile", - "dFile": "FROM busybox\nRUN echo from dFile", - "files/dFile2": "FROM busybox\nRUN echo from files/dFile2", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - out, _, err := dockerCmdInDir(c, ctx.Dir, "build", "-t", "test1", ".") - if err != nil { - c.Fatalf("Failed to build: %s\n%s", out, err) - } - if !strings.Contains(out, "from Dockerfile") { - c.Fatalf("test1 should have used Dockerfile, output:%s", out) - } - - out, _, err = dockerCmdInDir(c, ctx.Dir, "build", "-f", filepath.Join("files", "Dockerfile"), "-t", "test2", ".") - if err != nil { - c.Fatal(err) - } - if !strings.Contains(out, "from files/Dockerfile") { - c.Fatalf("test2 should have used files/Dockerfile, output:%s", out) - } - - out, _, err = dockerCmdInDir(c, ctx.Dir, "build", fmt.Sprintf("--file=%s", filepath.Join("files", "dFile")), "-t", "test3", ".") - if err != nil { - c.Fatal(err) - } - if !strings.Contains(out, "from files/dFile") { - c.Fatalf("test3 should have used files/dFile, output:%s", out) - } - - out, _, err = dockerCmdInDir(c, ctx.Dir, "build", "--file=dFile", "-t", "test4", ".") - if err != nil { - c.Fatal(err) - } - if !strings.Contains(out, "from dFile") { - c.Fatalf("test4 should have used dFile, output:%s", out) - } - - dirWithNoDockerfile, err := ioutil.TempDir(os.TempDir(), "test5") - c.Assert(err, check.IsNil) - nonDockerfileFile := filepath.Join(dirWithNoDockerfile, "notDockerfile") - if _, err = os.Create(nonDockerfileFile); err != nil { - c.Fatal(err) - } - out, _, err = dockerCmdInDir(c, ctx.Dir, "build", fmt.Sprintf("--file=%s", nonDockerfileFile), "-t", "test5", ".") - - if err == nil { - c.Fatalf("test5 was supposed to fail to find passwd") - } - - if expected := fmt.Sprintf("The Dockerfile (%s) must be within the build context (.)", nonDockerfileFile); !strings.Contains(out, expected) { - c.Fatalf("wrong error message:%v\nexpected to contain=%v", out, expected) - } - - out, _, err = dockerCmdInDir(c, filepath.Join(ctx.Dir, "files"), "build", "-f", filepath.Join("..", "Dockerfile"), "-t", "test6", "..") - if err != nil { - c.Fatalf("test6 failed: %s", err) - } - if !strings.Contains(out, "from Dockerfile") { - c.Fatalf("test6 should have used root Dockerfile, output:%s", out) - } - - out, _, err = dockerCmdInDir(c, filepath.Join(ctx.Dir, "files"), "build", "-f", filepath.Join(ctx.Dir, "files", "Dockerfile"), "-t", "test7", "..") - if err != nil { - c.Fatalf("test7 failed: %s", err) - } - if !strings.Contains(out, "from files/Dockerfile") { - c.Fatalf("test7 should have used files Dockerfile, output:%s", out) - } - - out, _, err = dockerCmdInDir(c, filepath.Join(ctx.Dir, "files"), "build", "-f", filepath.Join("..", "Dockerfile"), "-t", "test8", ".") - if err == nil || !strings.Contains(out, "must be within the build context") { - c.Fatalf("test8 should have failed with Dockerfile out of context: %s", err) - } - - tmpDir := os.TempDir() - out, _, err = dockerCmdInDir(c, tmpDir, "build", "-t", "test9", ctx.Dir) - if err != nil { - c.Fatalf("test9 - failed: %s", err) - } - if !strings.Contains(out, "from Dockerfile") { - c.Fatalf("test9 should have used root Dockerfile, output:%s", out) - } - - out, _, err = dockerCmdInDir(c, filepath.Join(ctx.Dir, "files"), "build", "-f", "dFile2", "-t", "test10", ".") - if err != nil { - c.Fatalf("test10 should have worked: %s", err) - } - if !strings.Contains(out, "from files/dFile2") { - c.Fatalf("test10 should have used files/dFile2, output:%s", out) - } - -} - -func (s *DockerSuite) TestBuildFromMixedcaseDockerfile(c *check.C) { - testRequires(c, UnixCli) // Dockerfile overwrites dockerfile on windows - testRequires(c, DaemonIsLinux) - - ctx, err := fakeContext(`FROM busybox - RUN echo from dockerfile`, - map[string]string{ - "dockerfile": "FROM busybox\nRUN echo from dockerfile", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - out, _, err := dockerCmdInDir(c, ctx.Dir, "build", "-t", "test1", ".") - if err != nil { - c.Fatalf("Failed to build: %s\n%s", out, err) - } - - if !strings.Contains(out, "from dockerfile") { - c.Fatalf("Missing proper output: %s", out) - } - -} - -func (s *DockerSuite) TestBuildWithTwoDockerfiles(c *check.C) { - testRequires(c, UnixCli) // Dockerfile overwrites dockerfile on windows - testRequires(c, DaemonIsLinux) - - ctx, err := fakeContext(`FROM busybox -RUN echo from Dockerfile`, - map[string]string{ - "dockerfile": "FROM busybox\nRUN echo from dockerfile", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - out, _, err := dockerCmdInDir(c, ctx.Dir, "build", "-t", "test1", ".") - if err != nil { - c.Fatalf("Failed to build: %s\n%s", out, err) - } - - if !strings.Contains(out, "from Dockerfile") { - c.Fatalf("Missing proper output: %s", out) - } - -} - -func (s *DockerSuite) TestBuildFromURLWithF(c *check.C) { - server, err := fakeStorage(map[string]string{"baz": `FROM busybox -RUN echo from baz -COPY * /tmp/ -RUN find /tmp/`}) - if err != nil { - c.Fatal(err) - } - defer server.Close() - - ctx, err := fakeContext(`FROM busybox -RUN echo from Dockerfile`, - map[string]string{}) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - // Make sure that -f is ignored and that we don't use the Dockerfile - // that's in the current dir - out, _, err := dockerCmdInDir(c, ctx.Dir, "build", "-f", "baz", "-t", "test1", server.URL()+"/baz") - if err != nil { - c.Fatalf("Failed to build: %s\n%s", out, err) - } - - if !strings.Contains(out, "from baz") || - strings.Contains(out, "/tmp/baz") || - !strings.Contains(out, "/tmp/Dockerfile") { - c.Fatalf("Missing proper output: %s", out) - } - -} - -func (s *DockerSuite) TestBuildFromStdinWithF(c *check.C) { - testRequires(c, DaemonIsLinux) // TODO Windows: This test is flaky; no idea why - ctx, err := fakeContext(`FROM busybox -RUN echo "from Dockerfile"`, - map[string]string{}) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - // Make sure that -f is ignored and that we don't use the Dockerfile - // that's in the current dir - dockerCommand := exec.Command(dockerBinary, "build", "-f", "baz", "-t", "test1", "-") - dockerCommand.Dir = ctx.Dir - dockerCommand.Stdin = strings.NewReader(`FROM busybox -RUN echo "from baz" -COPY * /tmp/ -RUN sh -c "find /tmp/" # sh -c is needed on Windows to use the correct find`) - out, status, err := runCommandWithOutput(dockerCommand) - if err != nil || status != 0 { - c.Fatalf("Error building: %s", err) - } - - if !strings.Contains(out, "from baz") || - strings.Contains(out, "/tmp/baz") || - !strings.Contains(out, "/tmp/Dockerfile") { - c.Fatalf("Missing proper output: %s", out) - } - -} - -func (s *DockerSuite) TestBuildFromOfficialNames(c *check.C) { - name := "testbuildfromofficial" - fromNames := []string{ - "busybox", - "docker.io/busybox", - "index.docker.io/busybox", - "library/busybox", - "docker.io/library/busybox", - "index.docker.io/library/busybox", - } - for idx, fromName := range fromNames { - imgName := fmt.Sprintf("%s%d", name, idx) - _, err := buildImage(imgName, "FROM "+fromName, true) - if err != nil { - c.Errorf("Build failed using FROM %s: %s", fromName, err) - } - deleteImages(imgName) - } -} - -func (s *DockerSuite) TestBuildDockerfileOutsideContext(c *check.C) { - testRequires(c, UnixCli) // uses os.Symlink: not implemented in windows at the time of writing (go-1.4.2) - testRequires(c, DaemonIsLinux) - - name := "testbuilddockerfileoutsidecontext" - tmpdir, err := ioutil.TempDir("", name) - c.Assert(err, check.IsNil) - defer os.RemoveAll(tmpdir) - ctx := filepath.Join(tmpdir, "context") - if err := os.MkdirAll(ctx, 0755); err != nil { - c.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(ctx, "Dockerfile"), []byte("FROM scratch\nENV X Y"), 0644); err != nil { - c.Fatal(err) - } - wd, err := os.Getwd() - if err != nil { - c.Fatal(err) - } - defer os.Chdir(wd) - if err := os.Chdir(ctx); err != nil { - c.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(tmpdir, "outsideDockerfile"), []byte("FROM scratch\nENV x y"), 0644); err != nil { - c.Fatal(err) - } - if err := os.Symlink(filepath.Join("..", "outsideDockerfile"), filepath.Join(ctx, "dockerfile1")); err != nil { - c.Fatal(err) - } - if err := os.Symlink(filepath.Join(tmpdir, "outsideDockerfile"), filepath.Join(ctx, "dockerfile2")); err != nil { - c.Fatal(err) - } - - for _, dockerfilePath := range []string{ - filepath.Join("..", "outsideDockerfile"), - filepath.Join(ctx, "dockerfile1"), - filepath.Join(ctx, "dockerfile2"), - } { - result := dockerCmdWithResult("build", "-t", name, "--no-cache", "-f", dockerfilePath, ".") - c.Assert(result, icmd.Matches, icmd.Expected{ - Err: "must be within the build context", - ExitCode: 1, - }) - deleteImages(name) - } - - os.Chdir(tmpdir) - - // Path to Dockerfile should be resolved relative to working directory, not relative to context. - // There is a Dockerfile in the context, but since there is no Dockerfile in the current directory, the following should fail - out, _, err := dockerCmdWithError("build", "-t", name, "--no-cache", "-f", "Dockerfile", ctx) - if err == nil { - c.Fatalf("Expected error. Out: %s", out) - } -} - -func (s *DockerSuite) TestBuildSpaces(c *check.C) { - // Test to make sure that leading/trailing spaces on a command - // doesn't change the error msg we get - var ( - err1 error - err2 error - ) - - name := "testspaces" - ctx, err := fakeContext("FROM busybox\nCOPY\n", - map[string]string{ - "Dockerfile": "FROM busybox\nCOPY\n", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err1 = buildImageFromContext(name, ctx, false); err1 == nil { - c.Fatal("Build 1 was supposed to fail, but didn't") - } - - ctx.Add("Dockerfile", "FROM busybox\nCOPY ") - if _, err2 = buildImageFromContext(name, ctx, false); err2 == nil { - c.Fatal("Build 2 was supposed to fail, but didn't") - } - - removeLogTimestamps := func(s string) string { - return regexp.MustCompile(`time="(.*?)"`).ReplaceAllString(s, `time=[TIMESTAMP]`) - } - - // Skip over the times - e1 := removeLogTimestamps(err1.Error()) - e2 := removeLogTimestamps(err2.Error()) - - // Ignore whitespace since that's what were verifying doesn't change stuff - if strings.Replace(e1, " ", "", -1) != strings.Replace(e2, " ", "", -1) { - c.Fatalf("Build 2's error wasn't the same as build 1's\n1:%s\n2:%s", err1, err2) - } - - ctx.Add("Dockerfile", "FROM busybox\n COPY") - if _, err2 = buildImageFromContext(name, ctx, false); err2 == nil { - c.Fatal("Build 3 was supposed to fail, but didn't") - } - - // Skip over the times - e1 = removeLogTimestamps(err1.Error()) - e2 = removeLogTimestamps(err2.Error()) - - // Ignore whitespace since that's what were verifying doesn't change stuff - if strings.Replace(e1, " ", "", -1) != strings.Replace(e2, " ", "", -1) { - c.Fatalf("Build 3's error wasn't the same as build 1's\n1:%s\n3:%s", err1, err2) - } - - ctx.Add("Dockerfile", "FROM busybox\n COPY ") - if _, err2 = buildImageFromContext(name, ctx, false); err2 == nil { - c.Fatal("Build 4 was supposed to fail, but didn't") - } - - // Skip over the times - e1 = removeLogTimestamps(err1.Error()) - e2 = removeLogTimestamps(err2.Error()) - - // Ignore whitespace since that's what were verifying doesn't change stuff - if strings.Replace(e1, " ", "", -1) != strings.Replace(e2, " ", "", -1) { - c.Fatalf("Build 4's error wasn't the same as build 1's\n1:%s\n4:%s", err1, err2) - } - -} - -func (s *DockerSuite) TestBuildSpacesWithQuotes(c *check.C) { - // Test to make sure that spaces in quotes aren't lost - name := "testspacesquotes" - - dockerfile := `FROM busybox -RUN echo " \ - foo "` - - _, out, err := buildImageWithOut(name, dockerfile, false) - if err != nil { - c.Fatal("Build failed:", err) - } - - expecting := "\n foo \n" - // Windows uses the builtin echo, which preserves quotes - if daemonPlatform == "windows" { - expecting = "\" foo \"" - } - if !strings.Contains(out, expecting) { - c.Fatalf("Bad output: %q expecting to contain %q", out, expecting) - } - -} - -// #4393 -func (s *DockerSuite) TestBuildVolumeFileExistsinContainer(c *check.C) { - testRequires(c, DaemonIsLinux) // TODO Windows: This should error out - buildCmd := exec.Command(dockerBinary, "build", "-t", "docker-test-errcreatevolumewithfile", "-") - buildCmd.Stdin = strings.NewReader(` - FROM busybox - RUN touch /foo - VOLUME /foo - `) - - out, _, err := runCommandWithOutput(buildCmd) - if err == nil || !strings.Contains(out, "file exists") { - c.Fatalf("expected build to fail when file exists in container at requested volume path") - } - -} - -func (s *DockerSuite) TestBuildMissingArgs(c *check.C) { - // Test to make sure that all Dockerfile commands (except the ones listed - // in skipCmds) will generate an error if no args are provided. - // Note: INSERT is deprecated so we exclude it because of that. - skipCmds := map[string]struct{}{ - "CMD": {}, - "RUN": {}, - "ENTRYPOINT": {}, - "INSERT": {}, - } - - if daemonPlatform == "windows" { - skipCmds = map[string]struct{}{ - "CMD": {}, - "RUN": {}, - "ENTRYPOINT": {}, - "INSERT": {}, - "STOPSIGNAL": {}, - "ARG": {}, - "USER": {}, - "EXPOSE": {}, - } - } - - for cmd := range command.Commands { - cmd = strings.ToUpper(cmd) - if _, ok := skipCmds[cmd]; ok { - continue - } - - var dockerfile string - if cmd == "FROM" { - dockerfile = cmd - } else { - // Add FROM to make sure we don't complain about it missing - dockerfile = "FROM busybox\n" + cmd - } - - ctx, err := fakeContext(dockerfile, map[string]string{}) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - var out string - if out, err = buildImageFromContext("args", ctx, true); err == nil { - c.Fatalf("%s was supposed to fail. Out:%s", cmd, out) - } - if !strings.Contains(err.Error(), cmd+" requires") { - c.Fatalf("%s returned the wrong type of error:%s", cmd, err) - } - } - -} - -func (s *DockerSuite) TestBuildEmptyScratch(c *check.C) { - testRequires(c, DaemonIsLinux) - _, out, err := buildImageWithOut("sc", "FROM scratch", true) - if err == nil { - c.Fatalf("Build was supposed to fail") - } - if !strings.Contains(out, "No image was generated") { - c.Fatalf("Wrong error message: %v", out) - } -} - -func (s *DockerSuite) TestBuildDotDotFile(c *check.C) { - ctx, err := fakeContext("FROM busybox\n", - map[string]string{ - "..gitme": "", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err = buildImageFromContext("sc", ctx, false); err != nil { - c.Fatalf("Build was supposed to work: %s", err) - } -} - -func (s *DockerSuite) TestBuildRUNoneJSON(c *check.C) { - testRequires(c, DaemonIsLinux) // No hello-world Windows image - name := "testbuildrunonejson" - - ctx, err := fakeContext(`FROM hello-world:frozen -RUN [ "/hello" ]`, map[string]string{}) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - out, _, err := dockerCmdInDir(c, ctx.Dir, "build", "--no-cache", "-t", name, ".") - if err != nil { - c.Fatalf("failed to build the image: %s, %v", out, err) - } - - if !strings.Contains(out, "Hello from Docker") { - c.Fatalf("bad output: %s", out) - } - -} - -func (s *DockerSuite) TestBuildEmptyStringVolume(c *check.C) { - name := "testbuildemptystringvolume" - - _, err := buildImage(name, ` - FROM busybox - ENV foo="" - VOLUME $foo - `, false) - if err == nil { - c.Fatal("Should have failed to build") - } - -} - -func (s *DockerSuite) TestBuildContainerWithCgroupParent(c *check.C) { - testRequires(c, SameHostDaemon) - testRequires(c, DaemonIsLinux) - - cgroupParent := "test" - data, err := ioutil.ReadFile("/proc/self/cgroup") - if err != nil { - c.Fatalf("failed to read '/proc/self/cgroup - %v", err) - } - selfCgroupPaths := parseCgroupPaths(string(data)) - _, found := selfCgroupPaths["memory"] - if !found { - c.Fatalf("unable to find self memory cgroup path. CgroupsPath: %v", selfCgroupPaths) - } - cmd := exec.Command(dockerBinary, "build", "--cgroup-parent", cgroupParent, "-") - cmd.Stdin = strings.NewReader(` -FROM busybox -RUN cat /proc/self/cgroup -`) - - out, _, err := runCommandWithOutput(cmd) - if err != nil { - c.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err) - } - m, err := regexp.MatchString(fmt.Sprintf("memory:.*/%s/.*", cgroupParent), out) - c.Assert(err, check.IsNil) - if !m { - c.Fatalf("There is no expected memory cgroup with parent /%s/: %s", cgroupParent, out) - } -} - -func (s *DockerSuite) TestBuildNoDupOutput(c *check.C) { - // Check to make sure our build output prints the Dockerfile cmd - // property - there was a bug that caused it to be duplicated on the - // Step X line - name := "testbuildnodupoutput" - - _, out, err := buildImageWithOut(name, ` - FROM busybox - RUN env`, false) - if err != nil { - c.Fatalf("Build should have worked: %q", err) - } - - exp := "\nStep 2/2 : RUN env\n" - if !strings.Contains(out, exp) { - c.Fatalf("Bad output\nGot:%s\n\nExpected to contain:%s\n", out, exp) - } -} - -// GH15826 -func (s *DockerSuite) TestBuildStartsFromOne(c *check.C) { - // Explicit check to ensure that build starts from step 1 rather than 0 - name := "testbuildstartsfromone" - - _, out, err := buildImageWithOut(name, ` - FROM busybox`, false) - if err != nil { - c.Fatalf("Build should have worked: %q", err) - } - - exp := "\nStep 1/1 : FROM busybox\n" - if !strings.Contains(out, exp) { - c.Fatalf("Bad output\nGot:%s\n\nExpected to contain:%s\n", out, exp) - } -} - -func (s *DockerSuite) TestBuildRUNErrMsg(c *check.C) { - // Test to make sure the bad command is quoted with just "s and - // not as a Go []string - name := "testbuildbadrunerrmsg" - _, out, err := buildImageWithOut(name, ` - FROM busybox - RUN badEXE a1 \& a2 a3`, false) // tab between a2 and a3 - if err == nil { - c.Fatal("Should have failed to build") - } - shell := "/bin/sh -c" - exitCode := "127" - if daemonPlatform == "windows" { - shell = "cmd /S /C" - // architectural - Windows has to start the container to determine the exe is bad, Linux does not - exitCode = "1" - } - exp := `The command '` + shell + ` badEXE a1 \& a2 a3' returned a non-zero code: ` + exitCode - if !strings.Contains(out, exp) { - c.Fatalf("RUN doesn't have the correct output:\nGot:%s\nExpected:%s", out, exp) - } -} - -func (s *DockerTrustSuite) TestTrustedBuild(c *check.C) { - repoName := s.setupTrustedImage(c, "trusted-build") - dockerFile := fmt.Sprintf(` - FROM %s - RUN [] - `, repoName) - - name := "testtrustedbuild" - - buildCmd := buildImageCmd(name, dockerFile, true) - s.trustedCmd(buildCmd) - out, _, err := runCommandWithOutput(buildCmd) - if err != nil { - c.Fatalf("Error running trusted build: %s\n%s", err, out) - } - - if !strings.Contains(out, fmt.Sprintf("FROM %s@sha", repoName[:len(repoName)-7])) { - c.Fatalf("Unexpected output on trusted build:\n%s", out) - } - - // We should also have a tag reference for the image. - if out, exitCode := dockerCmd(c, "inspect", repoName); exitCode != 0 { - c.Fatalf("unexpected exit code inspecting image %q: %d: %s", repoName, exitCode, out) - } - - // We should now be able to remove the tag reference. - if out, exitCode := dockerCmd(c, "rmi", repoName); exitCode != 0 { - c.Fatalf("unexpected exit code inspecting image %q: %d: %s", repoName, exitCode, out) - } -} - -func (s *DockerTrustSuite) TestTrustedBuildUntrustedTag(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/build-untrusted-tag:latest", privateRegistryURL) - dockerFile := fmt.Sprintf(` - FROM %s - RUN [] - `, repoName) - - name := "testtrustedbuilduntrustedtag" - - buildCmd := buildImageCmd(name, dockerFile, true) - s.trustedCmd(buildCmd) - out, _, err := runCommandWithOutput(buildCmd) - if err == nil { - c.Fatalf("Expected error on trusted build with untrusted tag: %s\n%s", err, out) - } - - if !strings.Contains(out, "does not have trust data for") { - c.Fatalf("Unexpected output on trusted build with untrusted tag:\n%s", out) - } -} - -func (s *DockerTrustSuite) TestBuildContextDirIsSymlink(c *check.C) { - testRequires(c, DaemonIsLinux) - tempDir, err := ioutil.TempDir("", "test-build-dir-is-symlink-") - c.Assert(err, check.IsNil) - defer os.RemoveAll(tempDir) - - // Make a real context directory in this temp directory with a simple - // Dockerfile. - realContextDirname := filepath.Join(tempDir, "context") - if err := os.Mkdir(realContextDirname, os.FileMode(0755)); err != nil { - c.Fatal(err) - } - - if err = ioutil.WriteFile( - filepath.Join(realContextDirname, "Dockerfile"), - []byte(` - FROM busybox - RUN echo hello world - `), - os.FileMode(0644), - ); err != nil { - c.Fatal(err) - } - - // Make a symlink to the real context directory. - contextSymlinkName := filepath.Join(tempDir, "context_link") - if err := os.Symlink(realContextDirname, contextSymlinkName); err != nil { - c.Fatal(err) - } - - // Executing the build with the symlink as the specified context should - // *not* fail. - if out, exitStatus := dockerCmd(c, "build", contextSymlinkName); exitStatus != 0 { - c.Fatalf("build failed with exit status %d: %s", exitStatus, out) - } -} - -func (s *DockerTrustSuite) TestTrustedBuildTagFromReleasesRole(c *check.C) { - testRequires(c, NotaryHosting) - - latestTag := s.setupTrustedImage(c, "trusted-build-releases-role") - repoName := strings.TrimSuffix(latestTag, ":latest") - - // Now create the releases role - s.notaryCreateDelegation(c, repoName, "targets/releases", s.not.keys[0].Public) - s.notaryImportKey(c, repoName, "targets/releases", s.not.keys[0].Private) - s.notaryPublish(c, repoName) - - // push a different tag to the releases role - otherTag := fmt.Sprintf("%s:other", repoName) - dockerCmd(c, "tag", "busybox", otherTag) - - pushCmd := exec.Command(dockerBinary, "push", otherTag) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("Trusted push failed: %s", out)) - s.assertTargetInRoles(c, repoName, "other", "targets/releases") - s.assertTargetNotInRoles(c, repoName, "other", "targets") - - out, status := dockerCmd(c, "rmi", otherTag) - c.Assert(status, check.Equals, 0, check.Commentf("docker rmi failed: %s", out)) - - dockerFile := fmt.Sprintf(` - FROM %s - RUN [] - `, otherTag) - - name := "testtrustedbuildreleasesrole" - - buildCmd := buildImageCmd(name, dockerFile, true) - s.trustedCmd(buildCmd) - out, _, err = runCommandWithOutput(buildCmd) - c.Assert(err, check.IsNil, check.Commentf("Trusted build failed: %s", out)) - c.Assert(out, checker.Contains, fmt.Sprintf("FROM %s@sha", repoName)) -} - -func (s *DockerTrustSuite) TestTrustedBuildTagIgnoresOtherDelegationRoles(c *check.C) { - testRequires(c, NotaryHosting) - - latestTag := s.setupTrustedImage(c, "trusted-build-releases-role") - repoName := strings.TrimSuffix(latestTag, ":latest") - - // Now create a non-releases delegation role - s.notaryCreateDelegation(c, repoName, "targets/other", s.not.keys[0].Public) - s.notaryImportKey(c, repoName, "targets/other", s.not.keys[0].Private) - s.notaryPublish(c, repoName) - - // push a different tag to the other role - otherTag := fmt.Sprintf("%s:other", repoName) - dockerCmd(c, "tag", "busybox", otherTag) - - pushCmd := exec.Command(dockerBinary, "push", otherTag) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("Trusted push failed: %s", out)) - s.assertTargetInRoles(c, repoName, "other", "targets/other") - s.assertTargetNotInRoles(c, repoName, "other", "targets") - - out, status := dockerCmd(c, "rmi", otherTag) - c.Assert(status, check.Equals, 0, check.Commentf("docker rmi failed: %s", out)) - - dockerFile := fmt.Sprintf(` - FROM %s - RUN [] - `, otherTag) - - name := "testtrustedbuildotherrole" - - buildCmd := buildImageCmd(name, dockerFile, true) - s.trustedCmd(buildCmd) - out, _, err = runCommandWithOutput(buildCmd) - c.Assert(err, check.NotNil, check.Commentf("Trusted build expected to fail: %s", out)) -} - -// Issue #15634: COPY fails when path starts with "null" -func (s *DockerSuite) TestBuildNullStringInAddCopyVolume(c *check.C) { - name := "testbuildnullstringinaddcopyvolume" - - volName := "nullvolume" - - if daemonPlatform == "windows" { - volName = `C:\\nullvolume` - } - - ctx, err := fakeContext(` - FROM busybox - - ADD null / - COPY nullfile / - VOLUME `+volName+` - `, - map[string]string{ - "null": "test1", - "nullfile": "test2", - }, - ) - c.Assert(err, check.IsNil) - defer ctx.Close() - - _, err = buildImageFromContext(name, ctx, true) - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestBuildStopSignal(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support STOPSIGNAL yet - imgName := "test_build_stop_signal" - _, err := buildImage(imgName, - `FROM busybox - STOPSIGNAL SIGKILL`, - true) - c.Assert(err, check.IsNil) - res := inspectFieldJSON(c, imgName, "Config.StopSignal") - if res != `"SIGKILL"` { - c.Fatalf("Signal %s, expected SIGKILL", res) - } - - containerName := "test-container-stop-signal" - dockerCmd(c, "run", "-d", "--name", containerName, imgName, "top") - - res = inspectFieldJSON(c, containerName, "Config.StopSignal") - if res != `"SIGKILL"` { - c.Fatalf("Signal %s, expected SIGKILL", res) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArg(c *check.C) { - imgName := "bldargtest" - envKey := "foo" - envVal := "bar" - args := []string{"--build-arg", fmt.Sprintf("%s=%s", envKey, envVal)} - var dockerfile string - if daemonPlatform == "windows" { - // Bugs in Windows busybox port - use the default base image and native cmd stuff - dockerfile = fmt.Sprintf(`FROM `+minimalBaseImage()+` - ARG %s - RUN echo %%%s%% - CMD setlocal enableextensions && if defined %s (echo %%%s%%)`, envKey, envKey, envKey, envKey) - } else { - dockerfile = fmt.Sprintf(`FROM busybox - ARG %s - RUN echo $%s - CMD echo $%s`, envKey, envKey, envKey) - - } - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil || !strings.Contains(out, envVal) { - if err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } - c.Fatalf("failed to access environment variable in output: %q expected: %q", out, envVal) - } - - containerName := "bldargCont" - out, _ := dockerCmd(c, "run", "--name", containerName, imgName) - out = strings.Trim(out, " \r\n'") - if out != "" { - c.Fatalf("run produced invalid output: %q, expected empty string", out) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgHistory(c *check.C) { - imgName := "bldargtest" - envKey := "foo" - envVal := "bar" - envDef := "bar1" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), - } - dockerfile := fmt.Sprintf(`FROM busybox - ARG %s=%s`, envKey, envDef) - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil || !strings.Contains(out, envVal) { - if err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } - c.Fatalf("failed to access environment variable in output: %q expected: %q", out, envVal) - } - - out, _ := dockerCmd(c, "history", "--no-trunc", imgName) - outputTabs := strings.Split(out, "\n")[1] - if !strings.Contains(outputTabs, envDef) { - c.Fatalf("failed to find arg default in image history output: %q expected: %q", outputTabs, envDef) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgCacheHit(c *check.C) { - imgName := "bldargtest" - envKey := "foo" - envVal := "bar" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), - } - dockerfile := fmt.Sprintf(`FROM busybox - ARG %s - RUN echo $%s`, envKey, envKey) - - origImgID := "" - var err error - if origImgID, err = buildImage(imgName, dockerfile, true, args...); err != nil { - c.Fatal(err) - } - - imgNameCache := "bldargtestcachehit" - if newImgID, err := buildImage(imgNameCache, dockerfile, true, args...); err != nil || newImgID != origImgID { - if err != nil { - c.Fatal(err) - } - c.Fatalf("build didn't use cache! expected image id: %q built image id: %q", origImgID, newImgID) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgCacheMissExtraArg(c *check.C) { - imgName := "bldargtest" - envKey := "foo" - envVal := "bar" - extraEnvKey := "foo1" - extraEnvVal := "bar1" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), - } - - dockerfile := fmt.Sprintf(`FROM busybox - ARG %s - ARG %s - RUN echo $%s`, envKey, extraEnvKey, envKey) - - origImgID := "" - var err error - if origImgID, err = buildImage(imgName, dockerfile, true, args...); err != nil { - c.Fatal(err) - } - - imgNameCache := "bldargtestcachemiss" - args = append(args, "--build-arg", fmt.Sprintf("%s=%s", extraEnvKey, extraEnvVal)) - if newImgID, err := buildImage(imgNameCache, dockerfile, true, args...); err != nil || newImgID == origImgID { - if err != nil { - c.Fatal(err) - } - c.Fatalf("build used cache, expected a miss!") - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgCacheMissSameArgDiffVal(c *check.C) { - imgName := "bldargtest" - envKey := "foo" - envVal := "bar" - newEnvVal := "bar1" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), - } - - dockerfile := fmt.Sprintf(`FROM busybox - ARG %s - RUN echo $%s`, envKey, envKey) - - origImgID := "" - var err error - if origImgID, err = buildImage(imgName, dockerfile, true, args...); err != nil { - c.Fatal(err) - } - - imgNameCache := "bldargtestcachemiss" - args = []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, newEnvVal), - } - if newImgID, err := buildImage(imgNameCache, dockerfile, true, args...); err != nil || newImgID == origImgID { - if err != nil { - c.Fatal(err) - } - c.Fatalf("build used cache, expected a miss!") - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgOverrideArgDefinedBeforeEnv(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support ARG - imgName := "bldargtest" - envKey := "foo" - envVal := "bar" - envValOveride := "barOverride" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), - } - dockerfile := fmt.Sprintf(`FROM busybox - ARG %s - ENV %s %s - RUN echo $%s - CMD echo $%s - `, envKey, envKey, envValOveride, envKey, envKey) - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil || strings.Count(out, envValOveride) != 2 { - if err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } - c.Fatalf("failed to access environment variable in output: %q expected: %q", out, envValOveride) - } - - containerName := "bldargCont" - if out, _ := dockerCmd(c, "run", "--name", containerName, imgName); !strings.Contains(out, envValOveride) { - c.Fatalf("run produced invalid output: %q, expected %q", out, envValOveride) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgOverrideEnvDefinedBeforeArg(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support ARG - imgName := "bldargtest" - envKey := "foo" - envVal := "bar" - envValOveride := "barOverride" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), - } - dockerfile := fmt.Sprintf(`FROM busybox - ENV %s %s - ARG %s - RUN echo $%s - CMD echo $%s - `, envKey, envValOveride, envKey, envKey, envKey) - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil || strings.Count(out, envValOveride) != 2 { - if err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } - c.Fatalf("failed to access environment variable in output: %q expected: %q", out, envValOveride) - } - - containerName := "bldargCont" - if out, _ := dockerCmd(c, "run", "--name", containerName, imgName); !strings.Contains(out, envValOveride) { - c.Fatalf("run produced invalid output: %q, expected %q", out, envValOveride) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgExpansion(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support ARG - imgName := "bldvarstest" - - wdVar := "WDIR" - wdVal := "/tmp/" - addVar := "AFILE" - addVal := "addFile" - copyVar := "CFILE" - copyVal := "copyFile" - envVar := "foo" - envVal := "bar" - exposeVar := "EPORT" - exposeVal := "9999" - userVar := "USER" - userVal := "testUser" - volVar := "VOL" - volVal := "/testVol/" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", wdVar, wdVal), - "--build-arg", fmt.Sprintf("%s=%s", addVar, addVal), - "--build-arg", fmt.Sprintf("%s=%s", copyVar, copyVal), - "--build-arg", fmt.Sprintf("%s=%s", envVar, envVal), - "--build-arg", fmt.Sprintf("%s=%s", exposeVar, exposeVal), - "--build-arg", fmt.Sprintf("%s=%s", userVar, userVal), - "--build-arg", fmt.Sprintf("%s=%s", volVar, volVal), - } - ctx, err := fakeContext(fmt.Sprintf(`FROM busybox - ARG %s - WORKDIR ${%s} - ARG %s - ADD ${%s} testDir/ - ARG %s - COPY $%s testDir/ - ARG %s - ENV %s=${%s} - ARG %s - EXPOSE $%s - ARG %s - USER $%s - ARG %s - VOLUME ${%s}`, - wdVar, wdVar, addVar, addVar, copyVar, copyVar, envVar, envVar, - envVar, exposeVar, exposeVar, userVar, userVar, volVar, volVar), - map[string]string{ - addVal: "some stuff", - copyVal: "some stuff", - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if _, err := buildImageFromContext(imgName, ctx, true, args...); err != nil { - c.Fatal(err) - } - - var resMap map[string]interface{} - var resArr []string - res := "" - res = inspectField(c, imgName, "Config.WorkingDir") - if res != filepath.ToSlash(filepath.Clean(wdVal)) { - c.Fatalf("Config.WorkingDir value mismatch. Expected: %s, got: %s", filepath.ToSlash(filepath.Clean(wdVal)), res) - } - - inspectFieldAndMarshall(c, imgName, "Config.Env", &resArr) - - found := false - for _, v := range resArr { - if fmt.Sprintf("%s=%s", envVar, envVal) == v { - found = true - break - } - } - if !found { - c.Fatalf("Config.Env value mismatch. Expected to exist: %s=%s, got: %v", - envVar, envVal, resArr) - } - - inspectFieldAndMarshall(c, imgName, "Config.ExposedPorts", &resMap) - if _, ok := resMap[fmt.Sprintf("%s/tcp", exposeVal)]; !ok { - c.Fatalf("Config.ExposedPorts value mismatch. Expected exposed port: %s/tcp, got: %v", exposeVal, resMap) - } - - res = inspectField(c, imgName, "Config.User") - if res != userVal { - c.Fatalf("Config.User value mismatch. Expected: %s, got: %s", userVal, res) - } - - inspectFieldAndMarshall(c, imgName, "Config.Volumes", &resMap) - if _, ok := resMap[volVal]; !ok { - c.Fatalf("Config.Volumes value mismatch. Expected volume: %s, got: %v", volVal, resMap) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgExpansionOverride(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support ARG - imgName := "bldvarstest" - envKey := "foo" - envVal := "bar" - envKey1 := "foo1" - envValOveride := "barOverride" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), - } - dockerfile := fmt.Sprintf(`FROM busybox - ARG %s - ENV %s %s - ENV %s ${%s} - RUN echo $%s - CMD echo $%s`, envKey, envKey, envValOveride, envKey1, envKey, envKey1, envKey1) - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil || strings.Count(out, envValOveride) != 2 { - if err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } - c.Fatalf("failed to access environment variable in output: %q expected: %q", out, envValOveride) - } - - containerName := "bldargCont" - if out, _ := dockerCmd(c, "run", "--name", containerName, imgName); !strings.Contains(out, envValOveride) { - c.Fatalf("run produced invalid output: %q, expected %q", out, envValOveride) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgUntrustedDefinedAfterUse(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support ARG - imgName := "bldargtest" - envKey := "foo" - envVal := "bar" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), - } - dockerfile := fmt.Sprintf(`FROM busybox - RUN echo $%s - ARG %s - CMD echo $%s`, envKey, envKey, envKey) - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil || strings.Contains(out, envVal) { - if err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } - c.Fatalf("able to access environment variable in output: %q expected to be missing", out) - } - - containerName := "bldargCont" - if out, _ := dockerCmd(c, "run", "--name", containerName, imgName); out != "\n" { - c.Fatalf("run produced invalid output: %q, expected empty string", out) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgBuiltinArg(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support --build-arg - imgName := "bldargtest" - envKey := "HTTP_PROXY" - envVal := "bar" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), - } - dockerfile := fmt.Sprintf(`FROM busybox - RUN echo $%s - CMD echo $%s`, envKey, envKey) - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil || !strings.Contains(out, envVal) { - if err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } - c.Fatalf("failed to access environment variable in output: %q expected: %q", out, envVal) - } - - containerName := "bldargCont" - if out, _ := dockerCmd(c, "run", "--name", containerName, imgName); out != "\n" { - c.Fatalf("run produced invalid output: %q, expected empty string", out) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgDefaultOverride(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support ARG - imgName := "bldargtest" - envKey := "foo" - envVal := "bar" - envValOveride := "barOverride" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envValOveride), - } - dockerfile := fmt.Sprintf(`FROM busybox - ARG %s=%s - ENV %s $%s - RUN echo $%s - CMD echo $%s`, envKey, envVal, envKey, envKey, envKey, envKey) - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil || strings.Count(out, envValOveride) != 1 { - if err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } - c.Fatalf("failed to access environment variable in output: %q expected: %q", out, envValOveride) - } - - containerName := "bldargCont" - if out, _ := dockerCmd(c, "run", "--name", containerName, imgName); !strings.Contains(out, envValOveride) { - c.Fatalf("run produced invalid output: %q, expected %q", out, envValOveride) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgUnconsumedArg(c *check.C) { - imgName := "bldargtest" - envKey := "foo" - envVal := "bar" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), - } - dockerfile := fmt.Sprintf(`FROM busybox - RUN echo $%s - CMD echo $%s`, envKey, envKey) - - warnStr := "[Warning] One or more build-args" - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); !strings.Contains(out, warnStr) { - c.Fatalf("build completed without warning: %q %q", out, err) - } else if err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } - -} - -func (s *DockerSuite) TestBuildBuildTimeArgEnv(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support ARG - args := []string{ - "build", - "--build-arg", fmt.Sprintf("FOO1=fromcmd"), - "--build-arg", fmt.Sprintf("FOO2="), - "--build-arg", fmt.Sprintf("FOO3"), // set in env - "--build-arg", fmt.Sprintf("FOO4"), // not set in env - "--build-arg", fmt.Sprintf("FOO5=fromcmd"), - // FOO6 is not set at all - "--build-arg", fmt.Sprintf("FOO7=fromcmd"), // should produce a warning - "--build-arg", fmt.Sprintf("FOO8="), // should produce a warning - "--build-arg", fmt.Sprintf("FOO9"), // should produce a warning - ".", - } - - dockerfile := fmt.Sprintf(`FROM busybox - ARG FOO1=fromfile - ARG FOO2=fromfile - ARG FOO3=fromfile - ARG FOO4=fromfile - ARG FOO5 - ARG FOO6 - RUN env - RUN [ "$FOO1" == "fromcmd" ] - RUN [ "$FOO2" == "" ] - RUN [ "$FOO3" == "fromenv" ] - RUN [ "$FOO4" == "fromfile" ] - RUN [ "$FOO5" == "fromcmd" ] - # The following should not exist at all in the env - RUN [ "$(env | grep FOO6)" == "" ] - RUN [ "$(env | grep FOO7)" == "" ] - RUN [ "$(env | grep FOO8)" == "" ] - RUN [ "$(env | grep FOO9)" == "" ] - `) - - ctx, err := fakeContext(dockerfile, nil) - c.Assert(err, check.IsNil) - defer ctx.Close() - - cmd := exec.Command(dockerBinary, args...) - cmd.Dir = ctx.Dir - cmd.Env = append(os.Environ(), - "FOO1=fromenv", - "FOO2=fromenv", - "FOO3=fromenv") - out, _, err := runCommandWithOutput(cmd) - if err != nil { - c.Fatal(err, out) - } - - // Now check to make sure we got a warning msg about unused build-args - i := strings.Index(out, "[Warning]") - if i < 0 { - c.Fatalf("Missing the build-arg warning in %q", out) - } - - out = out[i:] // "out" should contain just the warning message now - - // These were specified on a --build-arg but no ARG was in the Dockerfile - c.Assert(out, checker.Contains, "FOO7") - c.Assert(out, checker.Contains, "FOO8") - c.Assert(out, checker.Contains, "FOO9") -} - -func (s *DockerSuite) TestBuildBuildTimeArgQuotedValVariants(c *check.C) { - imgName := "bldargtest" - envKey := "foo" - envKey1 := "foo1" - envKey2 := "foo2" - envKey3 := "foo3" - args := []string{} - dockerfile := fmt.Sprintf(`FROM busybox - ARG %s="" - ARG %s='' - ARG %s="''" - ARG %s='""' - RUN [ "$%s" != "$%s" ] - RUN [ "$%s" != "$%s" ] - RUN [ "$%s" != "$%s" ] - RUN [ "$%s" != "$%s" ] - RUN [ "$%s" != "$%s" ]`, envKey, envKey1, envKey2, envKey3, - envKey, envKey2, envKey, envKey3, envKey1, envKey2, envKey1, envKey3, - envKey2, envKey3) - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgEmptyValVariants(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support ARG - imgName := "bldargtest" - envKey := "foo" - envKey1 := "foo1" - envKey2 := "foo2" - args := []string{} - dockerfile := fmt.Sprintf(`FROM busybox - ARG %s= - ARG %s="" - ARG %s='' - RUN [ "$%s" == "$%s" ] - RUN [ "$%s" == "$%s" ] - RUN [ "$%s" == "$%s" ]`, envKey, envKey1, envKey2, envKey, envKey1, envKey1, envKey2, envKey, envKey2) - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } -} - -func (s *DockerSuite) TestBuildBuildTimeArgDefintionWithNoEnvInjection(c *check.C) { - imgName := "bldargtest" - envKey := "foo" - args := []string{} - dockerfile := fmt.Sprintf(`FROM busybox - ARG %s - RUN env`, envKey) - - if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil || strings.Count(out, envKey) != 1 { - if err != nil { - c.Fatalf("build failed to complete: %q %q", out, err) - } - c.Fatalf("unexpected number of occurrences of the arg in output: %q expected: 1", out) - } -} - -func (s *DockerSuite) TestBuildNoNamedVolume(c *check.C) { - volName := "testname:/foo" - - if daemonPlatform == "windows" { - volName = "testname:C:\\foo" - } - dockerCmd(c, "run", "-v", volName, "busybox", "sh", "-c", "touch /foo/oops") - - dockerFile := `FROM busybox - VOLUME ` + volName + ` - RUN ls /foo/oops - ` - _, err := buildImage("test", dockerFile, false) - c.Assert(err, check.NotNil, check.Commentf("image build should have failed")) -} - -func (s *DockerSuite) TestBuildTagEvent(c *check.C) { - since := daemonUnixTime(c) - - dockerFile := `FROM busybox - RUN echo events - ` - _, err := buildImage("test", dockerFile, false) - c.Assert(err, check.IsNil) - - until := daemonUnixTime(c) - out, _ := dockerCmd(c, "events", "--since", since, "--until", until, "--filter", "type=image") - events := strings.Split(strings.TrimSpace(out), "\n") - actions := eventActionsByIDAndType(c, events, "test:latest", "image") - var foundTag bool - for _, a := range actions { - if a == "tag" { - foundTag = true - break - } - } - - c.Assert(foundTag, checker.True, check.Commentf("No tag event found:\n%s", out)) -} - -// #15780 -func (s *DockerSuite) TestBuildMultipleTags(c *check.C) { - dockerfile := ` - FROM busybox - MAINTAINER test-15780 - ` - cmd := exec.Command(dockerBinary, "build", "-t", "tag1", "-t", "tag2:v2", - "-t", "tag1:latest", "-t", "tag1", "--no-cache", "-") - cmd.Stdin = strings.NewReader(dockerfile) - _, err := runCommand(cmd) - c.Assert(err, check.IsNil) - - id1, err := getIDByName("tag1") - c.Assert(err, check.IsNil) - id2, err := getIDByName("tag2:v2") - c.Assert(err, check.IsNil) - c.Assert(id1, check.Equals, id2) -} - -// #17290 -func (s *DockerSuite) TestBuildCacheBrokenSymlink(c *check.C) { - name := "testbuildbrokensymlink" - ctx, err := fakeContext(` - FROM busybox - COPY . ./`, - map[string]string{ - "foo": "bar", - }) - c.Assert(err, checker.IsNil) - defer ctx.Close() - - err = os.Symlink(filepath.Join(ctx.Dir, "nosuchfile"), filepath.Join(ctx.Dir, "asymlink")) - c.Assert(err, checker.IsNil) - - // warm up cache - _, err = buildImageFromContext(name, ctx, true) - c.Assert(err, checker.IsNil) - - // add new file to context, should invalidate cache - err = ioutil.WriteFile(filepath.Join(ctx.Dir, "newfile"), []byte("foo"), 0644) - c.Assert(err, checker.IsNil) - - _, out, err := buildImageFromContextWithOut(name, ctx, true) - c.Assert(err, checker.IsNil) - - c.Assert(out, checker.Not(checker.Contains), "Using cache") - -} - -func (s *DockerSuite) TestBuildFollowSymlinkToFile(c *check.C) { - name := "testbuildbrokensymlink" - ctx, err := fakeContext(` - FROM busybox - COPY asymlink target`, - map[string]string{ - "foo": "bar", - }) - c.Assert(err, checker.IsNil) - defer ctx.Close() - - err = os.Symlink("foo", filepath.Join(ctx.Dir, "asymlink")) - c.Assert(err, checker.IsNil) - - id, err := buildImageFromContext(name, ctx, true) - c.Assert(err, checker.IsNil) - - out, _ := dockerCmd(c, "run", "--rm", id, "cat", "target") - c.Assert(out, checker.Matches, "bar") - - // change target file should invalidate cache - err = ioutil.WriteFile(filepath.Join(ctx.Dir, "foo"), []byte("baz"), 0644) - c.Assert(err, checker.IsNil) - - id, out, err = buildImageFromContextWithOut(name, ctx, true) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), "Using cache") - - out, _ = dockerCmd(c, "run", "--rm", id, "cat", "target") - c.Assert(out, checker.Matches, "baz") -} - -func (s *DockerSuite) TestBuildFollowSymlinkToDir(c *check.C) { - name := "testbuildbrokensymlink" - ctx, err := fakeContext(` - FROM busybox - COPY asymlink /`, - map[string]string{ - "foo/abc": "bar", - "foo/def": "baz", - }) - c.Assert(err, checker.IsNil) - defer ctx.Close() - - err = os.Symlink("foo", filepath.Join(ctx.Dir, "asymlink")) - c.Assert(err, checker.IsNil) - - id, err := buildImageFromContext(name, ctx, true) - c.Assert(err, checker.IsNil) - - out, _ := dockerCmd(c, "run", "--rm", id, "cat", "abc", "def") - c.Assert(out, checker.Matches, "barbaz") - - // change target file should invalidate cache - err = ioutil.WriteFile(filepath.Join(ctx.Dir, "foo/def"), []byte("bax"), 0644) - c.Assert(err, checker.IsNil) - - id, out, err = buildImageFromContextWithOut(name, ctx, true) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), "Using cache") - - out, _ = dockerCmd(c, "run", "--rm", id, "cat", "abc", "def") - c.Assert(out, checker.Matches, "barbax") - -} - -// TestBuildSymlinkBasename tests that target file gets basename from symlink, -// not from the target file. -func (s *DockerSuite) TestBuildSymlinkBasename(c *check.C) { - name := "testbuildbrokensymlink" - ctx, err := fakeContext(` - FROM busybox - COPY asymlink /`, - map[string]string{ - "foo": "bar", - }) - c.Assert(err, checker.IsNil) - defer ctx.Close() - - err = os.Symlink("foo", filepath.Join(ctx.Dir, "asymlink")) - c.Assert(err, checker.IsNil) - - id, err := buildImageFromContext(name, ctx, true) - c.Assert(err, checker.IsNil) - - out, _ := dockerCmd(c, "run", "--rm", id, "cat", "asymlink") - c.Assert(out, checker.Matches, "bar") - -} - -// #17827 -func (s *DockerSuite) TestBuildCacheRootSource(c *check.C) { - name := "testbuildrootsource" - ctx, err := fakeContext(` - FROM busybox - COPY / /data`, - map[string]string{ - "foo": "bar", - }) - c.Assert(err, checker.IsNil) - defer ctx.Close() - - // warm up cache - _, err = buildImageFromContext(name, ctx, true) - c.Assert(err, checker.IsNil) - - // change file, should invalidate cache - err = ioutil.WriteFile(filepath.Join(ctx.Dir, "foo"), []byte("baz"), 0644) - c.Assert(err, checker.IsNil) - - _, out, err := buildImageFromContextWithOut(name, ctx, true) - c.Assert(err, checker.IsNil) - - c.Assert(out, checker.Not(checker.Contains), "Using cache") -} - -// #19375 -func (s *DockerSuite) TestBuildFailsGitNotCallable(c *check.C) { - cmd := exec.Command(dockerBinary, "build", "github.com/docker/v1.10-migrator.git") - cmd.Env = append(cmd.Env, "PATH=") - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "unable to prepare context: unable to find 'git': ") - - cmd = exec.Command(dockerBinary, "build", "https://github.com/docker/v1.10-migrator.git") - cmd.Env = append(cmd.Env, "PATH=") - out, _, err = runCommandWithOutput(cmd) - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "unable to prepare context: unable to find 'git': ") -} - -// TestBuildWorkdirWindowsPath tests that a Windows style path works as a workdir -func (s *DockerSuite) TestBuildWorkdirWindowsPath(c *check.C) { - testRequires(c, DaemonIsWindows) - name := "testbuildworkdirwindowspath" - - _, err := buildImage(name, ` - FROM `+WindowsBaseImage+` - RUN mkdir C:\\work - WORKDIR C:\\work - RUN if "%CD%" NEQ "C:\work" exit -1 - `, true) - - if err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestBuildLabel(c *check.C) { - name := "testbuildlabel" - testLabel := "foo" - - _, err := buildImage(name, ` - FROM `+minimalBaseImage()+` - LABEL default foo -`, false, "--label", testLabel) - - c.Assert(err, checker.IsNil) - - res := inspectFieldJSON(c, name, "Config.Labels") - - var labels map[string]string - - if err := json.Unmarshal([]byte(res), &labels); err != nil { - c.Fatal(err) - } - - if _, ok := labels[testLabel]; !ok { - c.Fatal("label not found in image") - } -} - -func (s *DockerSuite) TestBuildLabelOneNode(c *check.C) { - name := "testbuildlabel" - - _, err := buildImage(name, "FROM busybox", false, "--label", "foo=bar") - - c.Assert(err, checker.IsNil) - - res, err := inspectImage(name, "json .Config.Labels") - c.Assert(err, checker.IsNil) - var labels map[string]string - - if err := json.Unmarshal([]byte(res), &labels); err != nil { - c.Fatal(err) - } - - v, ok := labels["foo"] - if !ok { - c.Fatal("label `foo` not found in image") - } - c.Assert(v, checker.Equals, "bar") -} - -func (s *DockerSuite) TestBuildLabelCacheCommit(c *check.C) { - name := "testbuildlabelcachecommit" - testLabel := "foo" - - if _, err := buildImage(name, ` - FROM `+minimalBaseImage()+` - LABEL default foo - `, false); err != nil { - c.Fatal(err) - } - - _, err := buildImage(name, ` - FROM `+minimalBaseImage()+` - LABEL default foo -`, true, "--label", testLabel) - - c.Assert(err, checker.IsNil) - - res := inspectFieldJSON(c, name, "Config.Labels") - - var labels map[string]string - - if err := json.Unmarshal([]byte(res), &labels); err != nil { - c.Fatal(err) - } - - if _, ok := labels[testLabel]; !ok { - c.Fatal("label not found in image") - } -} - -func (s *DockerSuite) TestBuildLabelMultiple(c *check.C) { - name := "testbuildlabelmultiple" - testLabels := map[string]string{ - "foo": "bar", - "123": "456", - } - - labelArgs := []string{} - - for k, v := range testLabels { - labelArgs = append(labelArgs, "--label", k+"="+v) - } - - _, err := buildImage(name, ` - FROM `+minimalBaseImage()+` - LABEL default foo -`, false, labelArgs...) - - if err != nil { - c.Fatal("error building image with labels", err) - } - - res := inspectFieldJSON(c, name, "Config.Labels") - - var labels map[string]string - - if err := json.Unmarshal([]byte(res), &labels); err != nil { - c.Fatal(err) - } - - for k, v := range testLabels { - if x, ok := labels[k]; !ok || x != v { - c.Fatalf("label %s=%s not found in image", k, v) - } - } -} - -func (s *DockerSuite) TestBuildLabelOverwrite(c *check.C) { - name := "testbuildlabeloverwrite" - testLabel := "foo" - testValue := "bar" - - _, err := buildImage(name, ` - FROM `+minimalBaseImage()+` - LABEL `+testLabel+`+ foo -`, false, []string{"--label", testLabel + "=" + testValue}...) - - if err != nil { - c.Fatal("error building image with labels", err) - } - - res := inspectFieldJSON(c, name, "Config.Labels") - - var labels map[string]string - - if err := json.Unmarshal([]byte(res), &labels); err != nil { - c.Fatal(err) - } - - v, ok := labels[testLabel] - if !ok { - c.Fatal("label not found in image") - } - - if v != testValue { - c.Fatal("label not overwritten") - } -} - -func (s *DockerRegistryAuthHtpasswdSuite) TestBuildFromAuthenticatedRegistry(c *check.C) { - dockerCmd(c, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) - - baseImage := privateRegistryURL + "/baseimage" - - _, err := buildImage(baseImage, ` - FROM busybox - ENV env1 val1 - `, true) - - c.Assert(err, checker.IsNil) - - dockerCmd(c, "push", baseImage) - dockerCmd(c, "rmi", baseImage) - - _, err = buildImage(baseImage, fmt.Sprintf(` - FROM %s - ENV env2 val2 - `, baseImage), true) - - c.Assert(err, checker.IsNil) -} - -func (s *DockerRegistryAuthHtpasswdSuite) TestBuildWithExternalAuth(c *check.C) { - osPath := os.Getenv("PATH") - defer os.Setenv("PATH", osPath) - - workingDir, err := os.Getwd() - c.Assert(err, checker.IsNil) - absolute, err := filepath.Abs(filepath.Join(workingDir, "fixtures", "auth")) - c.Assert(err, checker.IsNil) - testPath := fmt.Sprintf("%s%c%s", osPath, filepath.ListSeparator, absolute) - - os.Setenv("PATH", testPath) - - repoName := fmt.Sprintf("%v/dockercli/busybox:authtest", privateRegistryURL) - - tmp, err := ioutil.TempDir("", "integration-cli-") - c.Assert(err, checker.IsNil) - - externalAuthConfig := `{ "credsStore": "shell-test" }` - - configPath := filepath.Join(tmp, "config.json") - err = ioutil.WriteFile(configPath, []byte(externalAuthConfig), 0644) - c.Assert(err, checker.IsNil) - - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) - - b, err := ioutil.ReadFile(configPath) - c.Assert(err, checker.IsNil) - c.Assert(string(b), checker.Not(checker.Contains), "\"auth\":") - - dockerCmd(c, "--config", tmp, "tag", "busybox", repoName) - dockerCmd(c, "--config", tmp, "push", repoName) - - // make sure the image is pulled when building - dockerCmd(c, "rmi", repoName) - - buildCmd := exec.Command(dockerBinary, "--config", tmp, "build", "-") - buildCmd.Stdin = strings.NewReader(fmt.Sprintf("FROM %s", repoName)) - - out, _, err := runCommandWithOutput(buildCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) -} - -// Test cases in #22036 -func (s *DockerSuite) TestBuildLabelsOverride(c *check.C) { - // Command line option labels will always override - name := "scratchy" - expected := `{"bar":"from-flag","foo":"from-flag"}` - _, err := buildImage(name, - `FROM `+minimalBaseImage()+` - LABEL foo=from-dockerfile`, - true, "--label", "foo=from-flag", "--label", "bar=from-flag") - c.Assert(err, check.IsNil) - - res := inspectFieldJSON(c, name, "Config.Labels") - if res != expected { - c.Fatalf("Labels %s, expected %s", res, expected) - } - - name = "from" - expected = `{"foo":"from-dockerfile"}` - _, err = buildImage(name, - `FROM `+minimalBaseImage()+` - LABEL foo from-dockerfile`, - true) - c.Assert(err, check.IsNil) - - res = inspectFieldJSON(c, name, "Config.Labels") - if res != expected { - c.Fatalf("Labels %s, expected %s", res, expected) - } - - // Command line option label will override even via `FROM` - name = "new" - expected = `{"bar":"from-dockerfile2","foo":"new"}` - _, err = buildImage(name, - `FROM from - LABEL bar from-dockerfile2`, - true, "--label", "foo=new") - c.Assert(err, check.IsNil) - - res = inspectFieldJSON(c, name, "Config.Labels") - if res != expected { - c.Fatalf("Labels %s, expected %s", res, expected) - } - - // Command line option without a value set (--label foo, --label bar=) - // will be treated as --label foo="", --label bar="" - name = "scratchy2" - expected = `{"bar":"","foo":""}` - _, err = buildImage(name, - `FROM `+minimalBaseImage()+` - LABEL foo=from-dockerfile`, - true, "--label", "foo", "--label", "bar=") - c.Assert(err, check.IsNil) - - res = inspectFieldJSON(c, name, "Config.Labels") - if res != expected { - c.Fatalf("Labels %s, expected %s", res, expected) - } - - // Command line option without a value set (--label foo, --label bar=) - // will be treated as --label foo="", --label bar="" - // This time is for inherited images - name = "new2" - expected = `{"bar":"","foo":""}` - _, err = buildImage(name, - `FROM from - LABEL bar from-dockerfile2`, - true, "--label", "foo=", "--label", "bar") - c.Assert(err, check.IsNil) - - res = inspectFieldJSON(c, name, "Config.Labels") - if res != expected { - c.Fatalf("Labels %s, expected %s", res, expected) - } - - // Command line option labels with only `FROM` - name = "scratchy" - expected = `{"bar":"from-flag","foo":"from-flag"}` - _, err = buildImage(name, - `FROM `+minimalBaseImage(), - true, "--label", "foo=from-flag", "--label", "bar=from-flag") - c.Assert(err, check.IsNil) - - res = inspectFieldJSON(c, name, "Config.Labels") - if res != expected { - c.Fatalf("Labels %s, expected %s", res, expected) - } - - // Command line option labels with env var - name = "scratchz" - expected = `{"bar":"$PATH"}` - _, err = buildImage(name, - `FROM `+minimalBaseImage(), - true, "--label", "bar=$PATH") - c.Assert(err, check.IsNil) - - res = inspectFieldJSON(c, name, "Config.Labels") - if res != expected { - c.Fatalf("Labels %s, expected %s", res, expected) - } - -} - -// Test case for #22855 -func (s *DockerSuite) TestBuildDeleteCommittedFile(c *check.C) { - name := "test-delete-committed-file" - - _, err := buildImage(name, - `FROM busybox - RUN echo test > file - RUN test -e file - RUN rm file - RUN sh -c "! test -e file"`, false) - if err != nil { - c.Fatal(err) - } -} - -// #20083 -func (s *DockerSuite) TestBuildDockerignoreComment(c *check.C) { - // TODO Windows: Figure out why this test is flakey on TP5. If you add - // something like RUN sleep 5, or even RUN ls /tmp after the ADD line, - // it is more reliable, but that's not a good fix. - testRequires(c, DaemonIsLinux) - - name := "testbuilddockerignorecleanpaths" - dockerfile := ` - FROM busybox - ADD . /tmp/ - RUN sh -c "(ls -la /tmp/#1)" - RUN sh -c "(! ls -la /tmp/#2)" - RUN sh -c "(! ls /tmp/foo) && (! ls /tmp/foo2) && (ls /tmp/dir1/foo)"` - ctx, err := fakeContext(dockerfile, map[string]string{ - "foo": "foo", - "foo2": "foo2", - "dir1/foo": "foo in dir1", - "#1": "# file 1", - "#2": "# file 2", - ".dockerignore": `# Visual C++ cache files -# because we have git ;-) -# The above comment is from #20083 -foo -#dir1/foo -foo2 -# The following is considered as comment as # is at the beginning -#1 -# The following is not considered as comment as # is not at the beginning - #2 -`, - }) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -// Test case for #23221 -func (s *DockerSuite) TestBuildWithUTF8BOM(c *check.C) { - name := "test-with-utf8-bom" - dockerfile := []byte(`FROM busybox`) - bomDockerfile := append([]byte{0xEF, 0xBB, 0xBF}, dockerfile...) - ctx, err := fakeContextFromNewTempDir() - c.Assert(err, check.IsNil) - defer ctx.Close() - err = ctx.addFile("Dockerfile", bomDockerfile) - c.Assert(err, check.IsNil) - _, err = buildImageFromContext(name, ctx, true) - c.Assert(err, check.IsNil) -} - -// Test case for UTF-8 BOM in .dockerignore, related to #23221 -func (s *DockerSuite) TestBuildWithUTF8BOMDockerignore(c *check.C) { - name := "test-with-utf8-bom-dockerignore" - dockerfile := ` - FROM busybox - ADD . /tmp/ - RUN ls -la /tmp - RUN sh -c "! ls /tmp/Dockerfile" - RUN ls /tmp/.dockerignore` - dockerignore := []byte("./Dockerfile\n") - bomDockerignore := append([]byte{0xEF, 0xBB, 0xBF}, dockerignore...) - ctx, err := fakeContext(dockerfile, map[string]string{ - "Dockerfile": dockerfile, - }) - c.Assert(err, check.IsNil) - defer ctx.Close() - err = ctx.addFile(".dockerignore", bomDockerignore) - c.Assert(err, check.IsNil) - _, err = buildImageFromContext(name, ctx, true) - if err != nil { - c.Fatal(err) - } -} - -// #22489 Shell test to confirm config gets updated correctly -func (s *DockerSuite) TestBuildShellUpdatesConfig(c *check.C) { - name := "testbuildshellupdatesconfig" - - expected := `["foo","-bar","#(nop) ","SHELL [foo -bar]"]` - _, err := buildImage(name, - `FROM `+minimalBaseImage()+` - SHELL ["foo", "-bar"]`, - true) - if err != nil { - c.Fatal(err) - } - res := inspectFieldJSON(c, name, "ContainerConfig.Cmd") - if res != expected { - c.Fatalf("%s, expected %s", res, expected) - } - res = inspectFieldJSON(c, name, "ContainerConfig.Shell") - if res != `["foo","-bar"]` { - c.Fatalf(`%s, expected ["foo","-bar"]`, res) - } -} - -// #22489 Changing the shell multiple times and CMD after. -func (s *DockerSuite) TestBuildShellMultiple(c *check.C) { - name := "testbuildshellmultiple" - - _, out, _, err := buildImageWithStdoutStderr(name, - `FROM busybox - RUN echo defaultshell - SHELL ["echo"] - RUN echoshell - SHELL ["ls"] - RUN -l - CMD -l`, - true) - if err != nil { - c.Fatal(err) - } - - // Must contain 'defaultshell' twice - if len(strings.Split(out, "defaultshell")) != 3 { - c.Fatalf("defaultshell should have appeared twice in %s", out) - } - - // Must contain 'echoshell' twice - if len(strings.Split(out, "echoshell")) != 3 { - c.Fatalf("echoshell should have appeared twice in %s", out) - } - - // Must contain "total " (part of ls -l) - if !strings.Contains(out, "total ") { - c.Fatalf("%s should have contained 'total '", out) - } - - // A container started from the image uses the shell-form CMD. - // Last shell is ls. CMD is -l. So should contain 'total '. - outrun, _ := dockerCmd(c, "run", "--rm", name) - if !strings.Contains(outrun, "total ") { - c.Fatalf("Expected started container to run ls -l. %s", outrun) - } -} - -// #22489. Changed SHELL with ENTRYPOINT -func (s *DockerSuite) TestBuildShellEntrypoint(c *check.C) { - name := "testbuildshellentrypoint" - - _, err := buildImage(name, - `FROM busybox - SHELL ["ls"] - ENTRYPOINT -l`, - true) - if err != nil { - c.Fatal(err) - } - - // A container started from the image uses the shell-form ENTRYPOINT. - // Shell is ls. ENTRYPOINT is -l. So should contain 'total '. - outrun, _ := dockerCmd(c, "run", "--rm", name) - if !strings.Contains(outrun, "total ") { - c.Fatalf("Expected started container to run ls -l. %s", outrun) - } -} - -// #22489 Shell test to confirm shell is inherited in a subsequent build -func (s *DockerSuite) TestBuildShellInherited(c *check.C) { - name1 := "testbuildshellinherited1" - _, err := buildImage(name1, - `FROM busybox - SHELL ["ls"]`, - true) - if err != nil { - c.Fatal(err) - } - - name2 := "testbuildshellinherited2" - _, out, _, err := buildImageWithStdoutStderr(name2, - `FROM `+name1+` - RUN -l`, - true) - if err != nil { - c.Fatal(err) - } - - // ls -l has "total " followed by some number in it, ls without -l does not. - if !strings.Contains(out, "total ") { - c.Fatalf("Should have seen total in 'ls -l'.\n%s", out) - } -} - -// #22489 Shell test to confirm non-JSON doesn't work -func (s *DockerSuite) TestBuildShellNotJSON(c *check.C) { - name := "testbuildshellnotjson" - - _, err := buildImage(name, - `FROM `+minimalBaseImage()+` - sHeLl exec -form`, // Casing explicit to ensure error is upper-cased. - true) - if err == nil { - c.Fatal("Image build should have failed") - } - if !strings.Contains(err.Error(), "SHELL requires the arguments to be in JSON form") { - c.Fatal("Error didn't indicate that arguments must be in JSON form") - } -} - -// #22489 Windows shell test to confirm native is powershell if executing a PS command -// This would error if the default shell were still cmd. -func (s *DockerSuite) TestBuildShellWindowsPowershell(c *check.C) { - testRequires(c, DaemonIsWindows) - name := "testbuildshellpowershell" - _, out, err := buildImageWithOut(name, - `FROM `+minimalBaseImage()+` - SHELL ["powershell", "-command"] - RUN Write-Host John`, - true) - if err != nil { - c.Fatal(err) - } - if !strings.Contains(out, "\nJohn\n") { - c.Fatalf("Line with 'John' not found in output %q", out) - } -} - -// Verify that escape is being correctly applied to words when escape directive is not \. -// Tests WORKDIR, ADD -func (s *DockerSuite) TestBuildEscapeNotBackslashWordTest(c *check.C) { - testRequires(c, DaemonIsWindows) - name := "testbuildescapenotbackslashwordtesta" - _, out, err := buildImageWithOut(name, - `# escape= `+"`"+` - FROM `+minimalBaseImage()+` - WORKDIR c:\windows - RUN dir /w`, - true) - if err != nil { - c.Fatal(err) - } - if !strings.Contains(strings.ToLower(out), "[system32]") { - c.Fatalf("Line with '[windows]' not found in output %q", out) - } - - name = "testbuildescapenotbackslashwordtestb" - _, out, err = buildImageWithOut(name, - `# escape= `+"`"+` - FROM `+minimalBaseImage()+` - SHELL ["powershell.exe"] - WORKDIR c:\foo - ADD Dockerfile c:\foo\ - RUN dir Dockerfile`, - true) - if err != nil { - c.Fatal(err) - } - if !strings.Contains(strings.ToLower(out), "-a----") { - c.Fatalf("Line with '-a----' not found in output %q", out) - } - -} - -// #22868. Make sure shell-form CMD is marked as escaped in the config of the image -func (s *DockerSuite) TestBuildCmdShellArgsEscaped(c *check.C) { - testRequires(c, DaemonIsWindows) - name := "testbuildcmdshellescaped" - _, err := buildImage(name, ` - FROM `+minimalBaseImage()+` - CMD "ipconfig" - `, true) - if err != nil { - c.Fatal(err) - } - res := inspectFieldJSON(c, name, "Config.ArgsEscaped") - if res != "true" { - c.Fatalf("CMD did not update Config.ArgsEscaped on image: %v", res) - } - dockerCmd(c, "run", "--name", "inspectme", name) - dockerCmd(c, "wait", "inspectme") - res = inspectFieldJSON(c, name, "Config.Cmd") - - if res != `["cmd","/S","/C","\"ipconfig\""]` { - c.Fatalf("CMD was not escaped Config.Cmd: got %v", res) - } -} - -// Test case for #24912. -func (s *DockerSuite) TestBuildStepsWithProgress(c *check.C) { - name := "testbuildstepswithprogress" - - totalRun := 5 - _, out, err := buildImageWithOut(name, "FROM busybox\n"+strings.Repeat("RUN echo foo\n", totalRun), true) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, fmt.Sprintf("Step 1/%d : FROM busybox", 1+totalRun)) - for i := 2; i <= 1+totalRun; i++ { - c.Assert(out, checker.Contains, fmt.Sprintf("Step %d/%d : RUN echo foo", i, 1+totalRun)) - } -} - -func (s *DockerSuite) TestBuildWithFailure(c *check.C) { - name := "testbuildwithfailure" - - // First test case can only detect `nobody` in runtime so all steps will show up - buildCmd := "FROM busybox\nRUN nobody" - _, stdout, _, err := buildImageWithStdoutStderr(name, buildCmd, false, "--force-rm", "--rm") - c.Assert(err, checker.NotNil) - c.Assert(stdout, checker.Contains, "Step 1/2 : FROM busybox") - c.Assert(stdout, checker.Contains, "Step 2/2 : RUN nobody") - - // Second test case `FFOM` should have been detected before build runs so no steps - buildCmd = "FFOM nobody\nRUN nobody" - _, stdout, _, err = buildImageWithStdoutStderr(name, buildCmd, false, "--force-rm", "--rm") - c.Assert(err, checker.NotNil) - c.Assert(stdout, checker.Not(checker.Contains), "Step 1/2 : FROM busybox") - c.Assert(stdout, checker.Not(checker.Contains), "Step 2/2 : RUN nobody") -} - -func (s *DockerSuite) TestBuildCacheFrom(c *check.C) { - testRequires(c, DaemonIsLinux) // All tests that do save are skipped in windows - dockerfile := ` - FROM busybox - ENV FOO=bar - ADD baz / - RUN touch bax` - ctx, err := fakeContext(dockerfile, map[string]string{ - "Dockerfile": dockerfile, - "baz": "baz", - }) - c.Assert(err, checker.IsNil) - defer ctx.Close() - - id1, err := buildImageFromContext("build1", ctx, true) - c.Assert(err, checker.IsNil) - - // rebuild with cache-from - id2, out, err := buildImageFromContextWithOut("build2", ctx, true, "--cache-from=build1") - c.Assert(err, checker.IsNil) - c.Assert(id1, checker.Equals, id2) - c.Assert(strings.Count(out, "Using cache"), checker.Equals, 3) - dockerCmd(c, "rmi", "build2") - - // no cache match with unknown source - id2, out, err = buildImageFromContextWithOut("build2", ctx, true, "--cache-from=nosuchtag") - c.Assert(err, checker.IsNil) - c.Assert(id1, checker.Not(checker.Equals), id2) - c.Assert(strings.Count(out, "Using cache"), checker.Equals, 0) - dockerCmd(c, "rmi", "build2") - - // clear parent images - tempDir, err := ioutil.TempDir("", "test-build-cache-from-") - if err != nil { - c.Fatalf("failed to create temporary directory: %s", tempDir) - } - defer os.RemoveAll(tempDir) - tempFile := filepath.Join(tempDir, "img.tar") - dockerCmd(c, "save", "-o", tempFile, "build1") - dockerCmd(c, "rmi", "build1") - dockerCmd(c, "load", "-i", tempFile) - parentID, _ := dockerCmd(c, "inspect", "-f", "{{.Parent}}", "build1") - c.Assert(strings.TrimSpace(parentID), checker.Equals, "") - - // cache still applies without parents - id2, out, err = buildImageFromContextWithOut("build2", ctx, true, "--cache-from=build1") - c.Assert(err, checker.IsNil) - c.Assert(id1, checker.Equals, id2) - c.Assert(strings.Count(out, "Using cache"), checker.Equals, 3) - history1, _ := dockerCmd(c, "history", "-q", "build2") - - // Retry, no new intermediate images - id3, out, err := buildImageFromContextWithOut("build3", ctx, true, "--cache-from=build1") - c.Assert(err, checker.IsNil) - c.Assert(id1, checker.Equals, id3) - c.Assert(strings.Count(out, "Using cache"), checker.Equals, 3) - history2, _ := dockerCmd(c, "history", "-q", "build3") - - c.Assert(history1, checker.Equals, history2) - dockerCmd(c, "rmi", "build2") - dockerCmd(c, "rmi", "build3") - dockerCmd(c, "rmi", "build1") - dockerCmd(c, "load", "-i", tempFile) - - // Modify file, everything up to last command and layers are reused - dockerfile = ` - FROM busybox - ENV FOO=bar - ADD baz / - RUN touch newfile` - err = ioutil.WriteFile(filepath.Join(ctx.Dir, "Dockerfile"), []byte(dockerfile), 0644) - c.Assert(err, checker.IsNil) - - id2, out, err = buildImageFromContextWithOut("build2", ctx, true, "--cache-from=build1") - c.Assert(err, checker.IsNil) - c.Assert(id1, checker.Not(checker.Equals), id2) - c.Assert(strings.Count(out, "Using cache"), checker.Equals, 2) - - layers1Str, _ := dockerCmd(c, "inspect", "-f", "{{json .RootFS.Layers}}", "build1") - layers2Str, _ := dockerCmd(c, "inspect", "-f", "{{json .RootFS.Layers}}", "build2") - - var layers1 []string - var layers2 []string - c.Assert(json.Unmarshal([]byte(layers1Str), &layers1), checker.IsNil) - c.Assert(json.Unmarshal([]byte(layers2Str), &layers2), checker.IsNil) - - c.Assert(len(layers1), checker.Equals, len(layers2)) - for i := 0; i < len(layers1)-1; i++ { - c.Assert(layers1[i], checker.Equals, layers2[i]) - } - c.Assert(layers1[len(layers1)-1], checker.Not(checker.Equals), layers2[len(layers1)-1]) -} - -func (s *DockerSuite) TestBuildNetNone(c *check.C) { - testRequires(c, DaemonIsLinux) - - name := "testbuildnetnone" - _, out, err := buildImageWithOut(name, ` - FROM busybox - RUN ping -c 1 8.8.8.8 - `, true, "--network=none") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "unreachable") -} - -func (s *DockerSuite) TestBuildNetContainer(c *check.C) { - testRequires(c, DaemonIsLinux) - - id, _ := dockerCmd(c, "run", "--hostname", "foobar", "-d", "busybox", "nc", "-ll", "-p", "1234", "-e", "hostname") - - name := "testbuildnetcontainer" - out, err := buildImage(name, ` - FROM busybox - RUN nc localhost 1234 > /otherhost - `, true, "--network=container:"+strings.TrimSpace(id)) - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - - host, _ := dockerCmd(c, "run", "testbuildnetcontainer", "cat", "/otherhost") - c.Assert(strings.TrimSpace(host), check.Equals, "foobar") -} - -func (s *DockerSuite) TestBuildSquashParent(c *check.C) { - testRequires(c, ExperimentalDaemon) - dockerFile := ` - FROM busybox - RUN echo hello > /hello - RUN echo world >> /hello - RUN echo hello > /remove_me - ENV HELLO world - RUN rm /remove_me - ` - // build and get the ID that we can use later for history comparison - origID, err := buildImage("test", dockerFile, false) - c.Assert(err, checker.IsNil) - - // build with squash - id, err := buildImage("test", dockerFile, true, "--squash") - c.Assert(err, checker.IsNil) - - out, _ := dockerCmd(c, "run", "--rm", id, "/bin/sh", "-c", "cat /hello") - c.Assert(strings.TrimSpace(out), checker.Equals, "hello\nworld") - - dockerCmd(c, "run", "--rm", id, "/bin/sh", "-c", "[ ! -f /remove_me ]") - dockerCmd(c, "run", "--rm", id, "/bin/sh", "-c", `[ "$(echo $HELLO)" == "world" ]`) - - // make sure the ID produced is the ID of the tag we specified - inspectID, err := inspectImage("test", ".ID") - c.Assert(err, checker.IsNil) - c.Assert(inspectID, checker.Equals, id) - - origHistory, _ := dockerCmd(c, "history", origID) - testHistory, _ := dockerCmd(c, "history", "test") - - splitOrigHistory := strings.Split(strings.TrimSpace(origHistory), "\n") - splitTestHistory := strings.Split(strings.TrimSpace(testHistory), "\n") - c.Assert(len(splitTestHistory), checker.Equals, len(splitOrigHistory)+1) - - out, err = inspectImage(id, "len .RootFS.Layers") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, "3") -} - -func (s *DockerSuite) TestBuildContChar(c *check.C) { - name := "testbuildcontchar" - - _, out, err := buildImageWithOut(name, - `FROM busybox\`, true) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "Step 1/1 : FROM busybox") - - _, out, err = buildImageWithOut(name, - `FROM busybox - RUN echo hi \`, true) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "Step 1/2 : FROM busybox") - c.Assert(out, checker.Contains, "Step 2/2 : RUN echo hi\n") - - _, out, err = buildImageWithOut(name, - `FROM busybox - RUN echo hi \\`, true) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "Step 1/2 : FROM busybox") - c.Assert(out, checker.Contains, "Step 2/2 : RUN echo hi \\\n") - - _, out, err = buildImageWithOut(name, - `FROM busybox - RUN echo hi \\\`, true) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "Step 1/2 : FROM busybox") - c.Assert(out, checker.Contains, "Step 2/2 : RUN echo hi \\\\\n") -} - -// TestBuildOpaqueDirectory tests that a build succeeds which -// creates opaque directories. -// See https://github.com/docker/docker/issues/25244 -func (s *DockerSuite) TestBuildOpaqueDirectory(c *check.C) { - testRequires(c, DaemonIsLinux) - - dockerFile := ` - FROM busybox - RUN mkdir /dir1 && touch /dir1/f1 - RUN rm -rf /dir1 && mkdir /dir1 && touch /dir1/f2 - RUN touch /dir1/f3 - RUN [ -f /dir1/f2 ] - ` - - // Test that build succeeds, last command fails if opaque directory - // was not handled correctly - _, err := buildImage("testopaquedirectory", dockerFile, false) - c.Assert(err, checker.IsNil) -} - -// Windows test for USER in dockerfile -func (s *DockerSuite) TestBuildWindowsUser(c *check.C) { - testRequires(c, DaemonIsWindows) - name := "testbuildwindowsuser" - _, out, err := buildImageWithOut(name, - `FROM `+WindowsBaseImage+` - RUN net user user /add - USER user - RUN set username - `, - true) - if err != nil { - c.Fatal(err) - } - c.Assert(strings.ToLower(out), checker.Contains, "username=user") -} - -// Verifies if COPY file . when WORKDIR is set to a non-existing directory, -// the directory is created and the file is copied into the directory, -// as opposed to the file being copied as a file with the name of the -// directory. Fix for 27545 (found on Windows, but regression good for Linux too). -// Note 27545 was reverted in 28505, but a new fix was added subsequently in 28514. -func (s *DockerSuite) TestBuildCopyFileDotWithWorkdir(c *check.C) { - name := "testbuildcopyfiledotwithworkdir" - ctx, err := fakeContext(`FROM busybox -WORKDIR /foo -COPY file . -RUN ["cat", "/foo/file"] -`, - map[string]string{}) - - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - if err := ctx.Add("file", "content"); err != nil { - c.Fatal(err) - } - - if _, err = buildImageFromContext(name, ctx, true); err != nil { - c.Fatal(err) - } -} - -// Case-insensitive environment variables on Windows -func (s *DockerSuite) TestBuildWindowsEnvCaseInsensitive(c *check.C) { - testRequires(c, DaemonIsWindows) - name := "testbuildwindowsenvcaseinsensitive" - if _, err := buildImage(name, ` - FROM `+WindowsBaseImage+` - ENV FOO=bar foo=bar - `, true); err != nil { - c.Fatal(err) - } - res := inspectFieldJSON(c, name, "Config.Env") - if res != `["foo=bar"]` { // Should not have FOO=bar in it - takes the last one processed. And only one entry as deduped. - c.Fatalf("Case insensitive environment variables on Windows failed. Got %s", res) - } -} - -// Test case for 29667 -func (s *DockerSuite) TestBuildWorkdirImageCmd(c *check.C) { - testRequires(c, DaemonIsLinux) - - image := "testworkdirimagecmd" - dockerfile := ` -FROM busybox -WORKDIR /foo/bar -` - out, err := buildImage(image, dockerfile, true) - c.Assert(err, checker.IsNil, check.Commentf("Output: %s", out)) - - out, _ = dockerCmd(c, "inspect", "--format", "{{ json .Config.Cmd }}", image) - c.Assert(strings.TrimSpace(out), checker.Equals, `["sh"]`) - - image = "testworkdirlabelimagecmd" - dockerfile = ` -FROM busybox -WORKDIR /foo/bar -LABEL a=b -` - out, err = buildImage(image, dockerfile, true) - c.Assert(err, checker.IsNil, check.Commentf("Output: %s", out)) - - out, _ = dockerCmd(c, "inspect", "--format", "{{ json .Config.Cmd }}", image) - c.Assert(strings.TrimSpace(out), checker.Equals, `["sh"]`) -} - -// Test case for 28902/28090 -func (s *DockerSuite) TestBuildWorkdirCmd(c *check.C) { - testRequires(c, DaemonIsLinux) - - dockerFile := ` - FROM golang:1.7-alpine - WORKDIR / - ` - _, err := buildImage("testbuildworkdircmd", dockerFile, true) - c.Assert(err, checker.IsNil) - - _, out, err := buildImageWithOut("testbuildworkdircmd", dockerFile, true) - c.Assert(err, checker.IsNil) - c.Assert(strings.Count(out, "Using cache"), checker.Equals, 1) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_build_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_build_unix_test.go deleted file mode 100644 index 0205a927d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_build_unix_test.go +++ /dev/null @@ -1,207 +0,0 @@ -// +build !windows - -package main - -import ( - "bufio" - "bytes" - "encoding/json" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "regexp" - "strings" - "time" - - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/go-units" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestBuildResourceConstraintsAreUsed(c *check.C) { - testRequires(c, cpuCfsQuota) - name := "testbuildresourceconstraints" - - ctx, err := fakeContext(` - FROM hello-world:frozen - RUN ["/hello"] - `, map[string]string{}) - c.Assert(err, checker.IsNil) - - _, _, err = dockerCmdInDir(c, ctx.Dir, "build", "--no-cache", "--rm=false", "--memory=64m", "--memory-swap=-1", "--cpuset-cpus=0", "--cpuset-mems=0", "--cpu-shares=100", "--cpu-quota=8000", "--ulimit", "nofile=42", "-t", name, ".") - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "ps", "-lq") - cID := strings.TrimSpace(out) - - type hostConfig struct { - Memory int64 - MemorySwap int64 - CpusetCpus string - CpusetMems string - CPUShares int64 - CPUQuota int64 - Ulimits []*units.Ulimit - } - - cfg := inspectFieldJSON(c, cID, "HostConfig") - - var c1 hostConfig - err = json.Unmarshal([]byte(cfg), &c1) - c.Assert(err, checker.IsNil, check.Commentf(cfg)) - - c.Assert(c1.Memory, checker.Equals, int64(64*1024*1024), check.Commentf("resource constraints not set properly for Memory")) - c.Assert(c1.MemorySwap, checker.Equals, int64(-1), check.Commentf("resource constraints not set properly for MemorySwap")) - c.Assert(c1.CpusetCpus, checker.Equals, "0", check.Commentf("resource constraints not set properly for CpusetCpus")) - c.Assert(c1.CpusetMems, checker.Equals, "0", check.Commentf("resource constraints not set properly for CpusetMems")) - c.Assert(c1.CPUShares, checker.Equals, int64(100), check.Commentf("resource constraints not set properly for CPUShares")) - c.Assert(c1.CPUQuota, checker.Equals, int64(8000), check.Commentf("resource constraints not set properly for CPUQuota")) - c.Assert(c1.Ulimits[0].Name, checker.Equals, "nofile", check.Commentf("resource constraints not set properly for Ulimits")) - c.Assert(c1.Ulimits[0].Hard, checker.Equals, int64(42), check.Commentf("resource constraints not set properly for Ulimits")) - - // Make sure constraints aren't saved to image - dockerCmd(c, "run", "--name=test", name) - - cfg = inspectFieldJSON(c, "test", "HostConfig") - - var c2 hostConfig - err = json.Unmarshal([]byte(cfg), &c2) - c.Assert(err, checker.IsNil, check.Commentf(cfg)) - - c.Assert(c2.Memory, check.Not(checker.Equals), int64(64*1024*1024), check.Commentf("resource leaked from build for Memory")) - c.Assert(c2.MemorySwap, check.Not(checker.Equals), int64(-1), check.Commentf("resource leaked from build for MemorySwap")) - c.Assert(c2.CpusetCpus, check.Not(checker.Equals), "0", check.Commentf("resource leaked from build for CpusetCpus")) - c.Assert(c2.CpusetMems, check.Not(checker.Equals), "0", check.Commentf("resource leaked from build for CpusetMems")) - c.Assert(c2.CPUShares, check.Not(checker.Equals), int64(100), check.Commentf("resource leaked from build for CPUShares")) - c.Assert(c2.CPUQuota, check.Not(checker.Equals), int64(8000), check.Commentf("resource leaked from build for CPUQuota")) - c.Assert(c2.Ulimits, checker.IsNil, check.Commentf("resource leaked from build for Ulimits")) -} - -func (s *DockerSuite) TestBuildAddChangeOwnership(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuildaddown" - - ctx := func() *FakeContext { - dockerfile := ` - FROM busybox - ADD foo /bar/ - RUN [ $(stat -c %U:%G "/bar") = 'root:root' ] - RUN [ $(stat -c %U:%G "/bar/foo") = 'root:root' ] - ` - tmpDir, err := ioutil.TempDir("", "fake-context") - c.Assert(err, check.IsNil) - testFile, err := os.Create(filepath.Join(tmpDir, "foo")) - if err != nil { - c.Fatalf("failed to create foo file: %v", err) - } - defer testFile.Close() - - chownCmd := exec.Command("chown", "daemon:daemon", "foo") - chownCmd.Dir = tmpDir - out, _, err := runCommandWithOutput(chownCmd) - if err != nil { - c.Fatal(err, out) - } - - if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil { - c.Fatalf("failed to open destination dockerfile: %v", err) - } - return fakeContextFromDir(tmpDir) - }() - - defer ctx.Close() - - if _, err := buildImageFromContext(name, ctx, true); err != nil { - c.Fatalf("build failed to complete for TestBuildAddChangeOwnership: %v", err) - } -} - -// Test that an infinite sleep during a build is killed if the client disconnects. -// This test is fairly hairy because there are lots of ways to race. -// Strategy: -// * Monitor the output of docker events starting from before -// * Run a 1-year-long sleep from a docker build. -// * When docker events sees container start, close the "docker build" command -// * Wait for docker events to emit a dying event. -func (s *DockerSuite) TestBuildCancellationKillsSleep(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testbuildcancellation" - - observer, err := newEventObserver(c) - c.Assert(err, checker.IsNil) - err = observer.Start() - c.Assert(err, checker.IsNil) - defer observer.Stop() - - // (Note: one year, will never finish) - ctx, err := fakeContext("FROM busybox\nRUN sleep 31536000", nil) - if err != nil { - c.Fatal(err) - } - defer ctx.Close() - - buildCmd := exec.Command(dockerBinary, "build", "-t", name, ".") - buildCmd.Dir = ctx.Dir - - stdoutBuild, err := buildCmd.StdoutPipe() - if err := buildCmd.Start(); err != nil { - c.Fatalf("failed to run build: %s", err) - } - - matchCID := regexp.MustCompile("Running in (.+)") - scanner := bufio.NewScanner(stdoutBuild) - - outputBuffer := new(bytes.Buffer) - var buildID string - for scanner.Scan() { - line := scanner.Text() - outputBuffer.WriteString(line) - outputBuffer.WriteString("\n") - if matches := matchCID.FindStringSubmatch(line); len(matches) > 0 { - buildID = matches[1] - break - } - } - - if buildID == "" { - c.Fatalf("Unable to find build container id in build output:\n%s", outputBuffer.String()) - } - - testActions := map[string]chan bool{ - "start": make(chan bool, 1), - "die": make(chan bool, 1), - } - - matcher := matchEventLine(buildID, "container", testActions) - processor := processEventMatch(testActions) - go observer.Match(matcher, processor) - - select { - case <-time.After(10 * time.Second): - observer.CheckEventError(c, buildID, "start", matcher) - case <-testActions["start"]: - // ignore, done - } - - // Send a kill to the `docker build` command. - // Causes the underlying build to be cancelled due to socket close. - if err := buildCmd.Process.Kill(); err != nil { - c.Fatalf("error killing build command: %s", err) - } - - // Get the exit status of `docker build`, check it exited because killed. - if err := buildCmd.Wait(); err != nil && !integration.IsKilled(err) { - c.Fatalf("wait failed during build run: %T %s", err, err) - } - - select { - case <-time.After(10 * time.Second): - observer.CheckEventError(c, buildID, "die", matcher) - case <-testActions["die"]: - // ignore, done - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_by_digest_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_by_digest_test.go deleted file mode 100644 index c2d85461a..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_by_digest_test.go +++ /dev/null @@ -1,693 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "regexp" - "strings" - - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/schema1" - "github.com/docker/distribution/manifest/schema2" - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/stringutils" - "github.com/go-check/check" -) - -var ( - remoteRepoName = "dockercli/busybox-by-dgst" - repoName = fmt.Sprintf("%s/%s", privateRegistryURL, remoteRepoName) - pushDigestRegex = regexp.MustCompile("[\\S]+: digest: ([\\S]+) size: [0-9]+") - digestRegex = regexp.MustCompile("Digest: ([\\S]+)") -) - -func setupImage(c *check.C) (digest.Digest, error) { - return setupImageWithTag(c, "latest") -} - -func setupImageWithTag(c *check.C, tag string) (digest.Digest, error) { - containerName := "busyboxbydigest" - - dockerCmd(c, "run", "-e", "digest=1", "--name", containerName, "busybox") - - // tag the image to upload it to the private registry - repoAndTag := repoName + ":" + tag - out, _, err := dockerCmdWithError("commit", containerName, repoAndTag) - c.Assert(err, checker.IsNil, check.Commentf("image tagging failed: %s", out)) - - // delete the container as we don't need it any more - err = deleteContainer(containerName) - c.Assert(err, checker.IsNil) - - // push the image - out, _, err = dockerCmdWithError("push", repoAndTag) - c.Assert(err, checker.IsNil, check.Commentf("pushing the image to the private registry has failed: %s", out)) - - // delete our local repo that we previously tagged - rmiout, _, err := dockerCmdWithError("rmi", repoAndTag) - c.Assert(err, checker.IsNil, check.Commentf("error deleting images prior to real test: %s", rmiout)) - - matches := pushDigestRegex.FindStringSubmatch(out) - c.Assert(matches, checker.HasLen, 2, check.Commentf("unable to parse digest from push output: %s", out)) - pushDigest := matches[1] - - return digest.Digest(pushDigest), nil -} - -func testPullByTagDisplaysDigest(c *check.C) { - testRequires(c, DaemonIsLinux) - pushDigest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - // pull from the registry using the tag - out, _ := dockerCmd(c, "pull", repoName) - - // the pull output includes "Digest: ", so find that - matches := digestRegex.FindStringSubmatch(out) - c.Assert(matches, checker.HasLen, 2, check.Commentf("unable to parse digest from pull output: %s", out)) - pullDigest := matches[1] - - // make sure the pushed and pull digests match - c.Assert(pushDigest.String(), checker.Equals, pullDigest) -} - -func (s *DockerRegistrySuite) TestPullByTagDisplaysDigest(c *check.C) { - testPullByTagDisplaysDigest(c) -} - -func (s *DockerSchema1RegistrySuite) TestPullByTagDisplaysDigest(c *check.C) { - testPullByTagDisplaysDigest(c) -} - -func testPullByDigest(c *check.C) { - testRequires(c, DaemonIsLinux) - pushDigest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - // pull from the registry using the @ reference - imageReference := fmt.Sprintf("%s@%s", repoName, pushDigest) - out, _ := dockerCmd(c, "pull", imageReference) - - // the pull output includes "Digest: ", so find that - matches := digestRegex.FindStringSubmatch(out) - c.Assert(matches, checker.HasLen, 2, check.Commentf("unable to parse digest from pull output: %s", out)) - pullDigest := matches[1] - - // make sure the pushed and pull digests match - c.Assert(pushDigest.String(), checker.Equals, pullDigest) -} - -func (s *DockerRegistrySuite) TestPullByDigest(c *check.C) { - testPullByDigest(c) -} - -func (s *DockerSchema1RegistrySuite) TestPullByDigest(c *check.C) { - testPullByDigest(c) -} - -func testPullByDigestNoFallback(c *check.C) { - testRequires(c, DaemonIsLinux) - // pull from the registry using the @ reference - imageReference := fmt.Sprintf("%s@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", repoName) - out, _, err := dockerCmdWithError("pull", imageReference) - c.Assert(err, checker.NotNil, check.Commentf("expected non-zero exit status and correct error message when pulling non-existing image")) - c.Assert(out, checker.Contains, fmt.Sprintf("manifest for %s not found", imageReference), check.Commentf("expected non-zero exit status and correct error message when pulling non-existing image")) -} - -func (s *DockerRegistrySuite) TestPullByDigestNoFallback(c *check.C) { - testPullByDigestNoFallback(c) -} - -func (s *DockerSchema1RegistrySuite) TestPullByDigestNoFallback(c *check.C) { - testPullByDigestNoFallback(c) -} - -func (s *DockerRegistrySuite) TestCreateByDigest(c *check.C) { - pushDigest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - imageReference := fmt.Sprintf("%s@%s", repoName, pushDigest) - - containerName := "createByDigest" - dockerCmd(c, "create", "--name", containerName, imageReference) - - res := inspectField(c, containerName, "Config.Image") - c.Assert(res, checker.Equals, imageReference) -} - -func (s *DockerRegistrySuite) TestRunByDigest(c *check.C) { - pushDigest, err := setupImage(c) - c.Assert(err, checker.IsNil) - - imageReference := fmt.Sprintf("%s@%s", repoName, pushDigest) - - containerName := "runByDigest" - out, _ := dockerCmd(c, "run", "--name", containerName, imageReference, "sh", "-c", "echo found=$digest") - - foundRegex := regexp.MustCompile("found=([^\n]+)") - matches := foundRegex.FindStringSubmatch(out) - c.Assert(matches, checker.HasLen, 2, check.Commentf("unable to parse digest from pull output: %s", out)) - c.Assert(matches[1], checker.Equals, "1", check.Commentf("Expected %q, got %q", "1", matches[1])) - - res := inspectField(c, containerName, "Config.Image") - c.Assert(res, checker.Equals, imageReference) -} - -func (s *DockerRegistrySuite) TestRemoveImageByDigest(c *check.C) { - digest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - imageReference := fmt.Sprintf("%s@%s", repoName, digest) - - // pull from the registry using the @ reference - dockerCmd(c, "pull", imageReference) - - // make sure inspect runs ok - inspectField(c, imageReference, "Id") - - // do the delete - err = deleteImages(imageReference) - c.Assert(err, checker.IsNil, check.Commentf("unexpected error deleting image")) - - // try to inspect again - it should error this time - _, err = inspectFieldWithError(imageReference, "Id") - //unexpected nil err trying to inspect what should be a non-existent image - c.Assert(err, checker.NotNil) - c.Assert(err.Error(), checker.Contains, "No such object") -} - -func (s *DockerRegistrySuite) TestBuildByDigest(c *check.C) { - digest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - imageReference := fmt.Sprintf("%s@%s", repoName, digest) - - // pull from the registry using the @ reference - dockerCmd(c, "pull", imageReference) - - // get the image id - imageID := inspectField(c, imageReference, "Id") - - // do the build - name := "buildbydigest" - _, err = buildImage(name, fmt.Sprintf( - `FROM %s - CMD ["/bin/echo", "Hello World"]`, imageReference), - true) - c.Assert(err, checker.IsNil) - - // get the build's image id - res := inspectField(c, name, "Config.Image") - // make sure they match - c.Assert(res, checker.Equals, imageID) -} - -func (s *DockerRegistrySuite) TestTagByDigest(c *check.C) { - digest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - imageReference := fmt.Sprintf("%s@%s", repoName, digest) - - // pull from the registry using the @ reference - dockerCmd(c, "pull", imageReference) - - // tag it - tag := "tagbydigest" - dockerCmd(c, "tag", imageReference, tag) - - expectedID := inspectField(c, imageReference, "Id") - - tagID := inspectField(c, tag, "Id") - c.Assert(tagID, checker.Equals, expectedID) -} - -func (s *DockerRegistrySuite) TestListImagesWithoutDigests(c *check.C) { - digest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - imageReference := fmt.Sprintf("%s@%s", repoName, digest) - - // pull from the registry using the @ reference - dockerCmd(c, "pull", imageReference) - - out, _ := dockerCmd(c, "images") - c.Assert(out, checker.Not(checker.Contains), "DIGEST", check.Commentf("list output should not have contained DIGEST header")) -} - -func (s *DockerRegistrySuite) TestListImagesWithDigests(c *check.C) { - - // setup image1 - digest1, err := setupImageWithTag(c, "tag1") - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - imageReference1 := fmt.Sprintf("%s@%s", repoName, digest1) - c.Logf("imageReference1 = %s", imageReference1) - - // pull image1 by digest - dockerCmd(c, "pull", imageReference1) - - // list images - out, _ := dockerCmd(c, "images", "--digests") - - // make sure repo shown, tag=, digest = $digest1 - re1 := regexp.MustCompile(`\s*` + repoName + `\s*\s*` + digest1.String() + `\s`) - c.Assert(re1.MatchString(out), checker.True, check.Commentf("expected %q: %s", re1.String(), out)) - // setup image2 - digest2, err := setupImageWithTag(c, "tag2") - //error setting up image - c.Assert(err, checker.IsNil) - imageReference2 := fmt.Sprintf("%s@%s", repoName, digest2) - c.Logf("imageReference2 = %s", imageReference2) - - // pull image1 by digest - dockerCmd(c, "pull", imageReference1) - - // pull image2 by digest - dockerCmd(c, "pull", imageReference2) - - // list images - out, _ = dockerCmd(c, "images", "--digests") - - // make sure repo shown, tag=, digest = $digest1 - c.Assert(re1.MatchString(out), checker.True, check.Commentf("expected %q: %s", re1.String(), out)) - - // make sure repo shown, tag=, digest = $digest2 - re2 := regexp.MustCompile(`\s*` + repoName + `\s*\s*` + digest2.String() + `\s`) - c.Assert(re2.MatchString(out), checker.True, check.Commentf("expected %q: %s", re2.String(), out)) - - // pull tag1 - dockerCmd(c, "pull", repoName+":tag1") - - // list images - out, _ = dockerCmd(c, "images", "--digests") - - // make sure image 1 has repo, tag, AND repo, , digest - reWithDigest1 := regexp.MustCompile(`\s*` + repoName + `\s*tag1\s*` + digest1.String() + `\s`) - c.Assert(reWithDigest1.MatchString(out), checker.True, check.Commentf("expected %q: %s", reWithDigest1.String(), out)) - // make sure image 2 has repo, , digest - c.Assert(re2.MatchString(out), checker.True, check.Commentf("expected %q: %s", re2.String(), out)) - - // pull tag 2 - dockerCmd(c, "pull", repoName+":tag2") - - // list images - out, _ = dockerCmd(c, "images", "--digests") - - // make sure image 1 has repo, tag, digest - c.Assert(reWithDigest1.MatchString(out), checker.True, check.Commentf("expected %q: %s", reWithDigest1.String(), out)) - - // make sure image 2 has repo, tag, digest - reWithDigest2 := regexp.MustCompile(`\s*` + repoName + `\s*tag2\s*` + digest2.String() + `\s`) - c.Assert(reWithDigest2.MatchString(out), checker.True, check.Commentf("expected %q: %s", reWithDigest2.String(), out)) - - // list images - out, _ = dockerCmd(c, "images", "--digests") - - // make sure image 1 has repo, tag, digest - c.Assert(reWithDigest1.MatchString(out), checker.True, check.Commentf("expected %q: %s", reWithDigest1.String(), out)) - // make sure image 2 has repo, tag, digest - c.Assert(reWithDigest2.MatchString(out), checker.True, check.Commentf("expected %q: %s", reWithDigest2.String(), out)) - // make sure busybox has tag, but not digest - busyboxRe := regexp.MustCompile(`\s*busybox\s*latest\s*\s`) - c.Assert(busyboxRe.MatchString(out), checker.True, check.Commentf("expected %q: %s", busyboxRe.String(), out)) -} - -func (s *DockerRegistrySuite) TestListDanglingImagesWithDigests(c *check.C) { - // setup image1 - digest1, err := setupImageWithTag(c, "dangle1") - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - imageReference1 := fmt.Sprintf("%s@%s", repoName, digest1) - c.Logf("imageReference1 = %s", imageReference1) - - // pull image1 by digest - dockerCmd(c, "pull", imageReference1) - - // list images - out, _ := dockerCmd(c, "images", "--digests") - - // make sure repo shown, tag=, digest = $digest1 - re1 := regexp.MustCompile(`\s*` + repoName + `\s*\s*` + digest1.String() + `\s`) - c.Assert(re1.MatchString(out), checker.True, check.Commentf("expected %q: %s", re1.String(), out)) - // setup image2 - digest2, err := setupImageWithTag(c, "dangle2") - //error setting up image - c.Assert(err, checker.IsNil) - imageReference2 := fmt.Sprintf("%s@%s", repoName, digest2) - c.Logf("imageReference2 = %s", imageReference2) - - // pull image1 by digest - dockerCmd(c, "pull", imageReference1) - - // pull image2 by digest - dockerCmd(c, "pull", imageReference2) - - // list images - out, _ = dockerCmd(c, "images", "--digests", "--filter=dangling=true") - - // make sure repo shown, tag=, digest = $digest1 - c.Assert(re1.MatchString(out), checker.True, check.Commentf("expected %q: %s", re1.String(), out)) - - // make sure repo shown, tag=, digest = $digest2 - re2 := regexp.MustCompile(`\s*` + repoName + `\s*\s*` + digest2.String() + `\s`) - c.Assert(re2.MatchString(out), checker.True, check.Commentf("expected %q: %s", re2.String(), out)) - - // pull dangle1 tag - dockerCmd(c, "pull", repoName+":dangle1") - - // list images - out, _ = dockerCmd(c, "images", "--digests", "--filter=dangling=true") - - // make sure image 1 has repo, tag, AND repo, , digest - reWithDigest1 := regexp.MustCompile(`\s*` + repoName + `\s*dangle1\s*` + digest1.String() + `\s`) - c.Assert(reWithDigest1.MatchString(out), checker.False, check.Commentf("unexpected %q: %s", reWithDigest1.String(), out)) - // make sure image 2 has repo, , digest - c.Assert(re2.MatchString(out), checker.True, check.Commentf("expected %q: %s", re2.String(), out)) - - // pull dangle2 tag - dockerCmd(c, "pull", repoName+":dangle2") - - // list images, show tagged images - out, _ = dockerCmd(c, "images", "--digests") - - // make sure image 1 has repo, tag, digest - c.Assert(reWithDigest1.MatchString(out), checker.True, check.Commentf("expected %q: %s", reWithDigest1.String(), out)) - - // make sure image 2 has repo, tag, digest - reWithDigest2 := regexp.MustCompile(`\s*` + repoName + `\s*dangle2\s*` + digest2.String() + `\s`) - c.Assert(reWithDigest2.MatchString(out), checker.True, check.Commentf("expected %q: %s", reWithDigest2.String(), out)) - - // list images, no longer dangling, should not match - out, _ = dockerCmd(c, "images", "--digests", "--filter=dangling=true") - - // make sure image 1 has repo, tag, digest - c.Assert(reWithDigest1.MatchString(out), checker.False, check.Commentf("unexpected %q: %s", reWithDigest1.String(), out)) - // make sure image 2 has repo, tag, digest - c.Assert(reWithDigest2.MatchString(out), checker.False, check.Commentf("unexpected %q: %s", reWithDigest2.String(), out)) -} - -func (s *DockerRegistrySuite) TestInspectImageWithDigests(c *check.C) { - digest, err := setupImage(c) - c.Assert(err, check.IsNil, check.Commentf("error setting up image")) - - imageReference := fmt.Sprintf("%s@%s", repoName, digest) - - // pull from the registry using the @ reference - dockerCmd(c, "pull", imageReference) - - out, _ := dockerCmd(c, "inspect", imageReference) - - var imageJSON []types.ImageInspect - err = json.Unmarshal([]byte(out), &imageJSON) - c.Assert(err, checker.IsNil) - c.Assert(imageJSON, checker.HasLen, 1) - c.Assert(imageJSON[0].RepoDigests, checker.HasLen, 1) - c.Assert(stringutils.InSlice(imageJSON[0].RepoDigests, imageReference), checker.Equals, true) -} - -func (s *DockerRegistrySuite) TestPsListContainersFilterAncestorImageByDigest(c *check.C) { - digest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - imageReference := fmt.Sprintf("%s@%s", repoName, digest) - - // pull from the registry using the @ reference - dockerCmd(c, "pull", imageReference) - - // build an image from it - imageName1 := "images_ps_filter_test" - _, err = buildImage(imageName1, fmt.Sprintf( - `FROM %s - LABEL match me 1`, imageReference), true) - c.Assert(err, checker.IsNil) - - // run a container based on that - dockerCmd(c, "run", "--name=test1", imageReference, "echo", "hello") - expectedID, err := getIDByName("test1") - c.Assert(err, check.IsNil) - - // run a container based on the a descendant of that too - dockerCmd(c, "run", "--name=test2", imageName1, "echo", "hello") - expectedID1, err := getIDByName("test2") - c.Assert(err, check.IsNil) - - expectedIDs := []string{expectedID, expectedID1} - - // Invalid imageReference - out, _ := dockerCmd(c, "ps", "-a", "-q", "--no-trunc", fmt.Sprintf("--filter=ancestor=busybox@%s", digest)) - // Filter container for ancestor filter should be empty - c.Assert(strings.TrimSpace(out), checker.Equals, "") - - // Valid imageReference - out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=ancestor="+imageReference) - checkPsAncestorFilterOutput(c, out, imageReference, expectedIDs) -} - -func (s *DockerRegistrySuite) TestDeleteImageByIDOnlyPulledByDigest(c *check.C) { - pushDigest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - // pull from the registry using the @ reference - imageReference := fmt.Sprintf("%s@%s", repoName, pushDigest) - dockerCmd(c, "pull", imageReference) - // just in case... - - dockerCmd(c, "tag", imageReference, repoName+":sometag") - - imageID := inspectField(c, imageReference, "Id") - - dockerCmd(c, "rmi", imageID) - - _, err = inspectFieldWithError(imageID, "Id") - c.Assert(err, checker.NotNil, check.Commentf("image should have been deleted")) -} - -func (s *DockerRegistrySuite) TestDeleteImageWithDigestAndTag(c *check.C) { - pushDigest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - // pull from the registry using the @ reference - imageReference := fmt.Sprintf("%s@%s", repoName, pushDigest) - dockerCmd(c, "pull", imageReference) - - imageID := inspectField(c, imageReference, "Id") - - repoTag := repoName + ":sometag" - repoTag2 := repoName + ":othertag" - dockerCmd(c, "tag", imageReference, repoTag) - dockerCmd(c, "tag", imageReference, repoTag2) - - dockerCmd(c, "rmi", repoTag2) - - // rmi should have deleted only repoTag2, because there's another tag - inspectField(c, repoTag, "Id") - - dockerCmd(c, "rmi", repoTag) - - // rmi should have deleted the tag, the digest reference, and the image itself - _, err = inspectFieldWithError(imageID, "Id") - c.Assert(err, checker.NotNil, check.Commentf("image should have been deleted")) -} - -func (s *DockerRegistrySuite) TestDeleteImageWithDigestAndMultiRepoTag(c *check.C) { - pushDigest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - repo2 := fmt.Sprintf("%s/%s", repoName, "repo2") - - // pull from the registry using the @ reference - imageReference := fmt.Sprintf("%s@%s", repoName, pushDigest) - dockerCmd(c, "pull", imageReference) - - imageID := inspectField(c, imageReference, "Id") - - repoTag := repoName + ":sometag" - repoTag2 := repo2 + ":othertag" - dockerCmd(c, "tag", imageReference, repoTag) - dockerCmd(c, "tag", imageReference, repoTag2) - - dockerCmd(c, "rmi", repoTag) - - // rmi should have deleted repoTag and image reference, but left repoTag2 - inspectField(c, repoTag2, "Id") - _, err = inspectFieldWithError(imageReference, "Id") - c.Assert(err, checker.NotNil, check.Commentf("image digest reference should have been removed")) - - _, err = inspectFieldWithError(repoTag, "Id") - c.Assert(err, checker.NotNil, check.Commentf("image tag reference should have been removed")) - - dockerCmd(c, "rmi", repoTag2) - - // rmi should have deleted the tag, the digest reference, and the image itself - _, err = inspectFieldWithError(imageID, "Id") - c.Assert(err, checker.NotNil, check.Commentf("image should have been deleted")) -} - -// TestPullFailsWithAlteredManifest tests that a `docker pull` fails when -// we have modified a manifest blob and its digest cannot be verified. -// This is the schema2 version of the test. -func (s *DockerRegistrySuite) TestPullFailsWithAlteredManifest(c *check.C) { - testRequires(c, DaemonIsLinux) - manifestDigest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - // Load the target manifest blob. - manifestBlob := s.reg.readBlobContents(c, manifestDigest) - - var imgManifest schema2.Manifest - err = json.Unmarshal(manifestBlob, &imgManifest) - c.Assert(err, checker.IsNil, check.Commentf("unable to decode image manifest from blob")) - - // Change a layer in the manifest. - imgManifest.Layers[0].Digest = digest.Digest("sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef") - - // Move the existing data file aside, so that we can replace it with a - // malicious blob of data. NOTE: we defer the returned undo func. - undo := s.reg.tempMoveBlobData(c, manifestDigest) - defer undo() - - alteredManifestBlob, err := json.MarshalIndent(imgManifest, "", " ") - c.Assert(err, checker.IsNil, check.Commentf("unable to encode altered image manifest to JSON")) - - s.reg.writeBlobContents(c, manifestDigest, alteredManifestBlob) - - // Now try pulling that image by digest. We should get an error about - // digest verification for the manifest digest. - - // Pull from the registry using the @ reference. - imageReference := fmt.Sprintf("%s@%s", repoName, manifestDigest) - out, exitStatus, _ := dockerCmdWithError("pull", imageReference) - c.Assert(exitStatus, checker.Not(check.Equals), 0) - - expectedErrorMsg := fmt.Sprintf("manifest verification failed for digest %s", manifestDigest) - c.Assert(out, checker.Contains, expectedErrorMsg) -} - -// TestPullFailsWithAlteredManifest tests that a `docker pull` fails when -// we have modified a manifest blob and its digest cannot be verified. -// This is the schema1 version of the test. -func (s *DockerSchema1RegistrySuite) TestPullFailsWithAlteredManifest(c *check.C) { - testRequires(c, DaemonIsLinux) - manifestDigest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - // Load the target manifest blob. - manifestBlob := s.reg.readBlobContents(c, manifestDigest) - - var imgManifest schema1.Manifest - err = json.Unmarshal(manifestBlob, &imgManifest) - c.Assert(err, checker.IsNil, check.Commentf("unable to decode image manifest from blob")) - - // Change a layer in the manifest. - imgManifest.FSLayers[0] = schema1.FSLayer{ - BlobSum: digest.Digest("sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"), - } - - // Move the existing data file aside, so that we can replace it with a - // malicious blob of data. NOTE: we defer the returned undo func. - undo := s.reg.tempMoveBlobData(c, manifestDigest) - defer undo() - - alteredManifestBlob, err := json.MarshalIndent(imgManifest, "", " ") - c.Assert(err, checker.IsNil, check.Commentf("unable to encode altered image manifest to JSON")) - - s.reg.writeBlobContents(c, manifestDigest, alteredManifestBlob) - - // Now try pulling that image by digest. We should get an error about - // digest verification for the manifest digest. - - // Pull from the registry using the @ reference. - imageReference := fmt.Sprintf("%s@%s", repoName, manifestDigest) - out, exitStatus, _ := dockerCmdWithError("pull", imageReference) - c.Assert(exitStatus, checker.Not(check.Equals), 0) - - expectedErrorMsg := fmt.Sprintf("image verification failed for digest %s", manifestDigest) - c.Assert(out, checker.Contains, expectedErrorMsg) -} - -// TestPullFailsWithAlteredLayer tests that a `docker pull` fails when -// we have modified a layer blob and its digest cannot be verified. -// This is the schema2 version of the test. -func (s *DockerRegistrySuite) TestPullFailsWithAlteredLayer(c *check.C) { - testRequires(c, DaemonIsLinux) - manifestDigest, err := setupImage(c) - c.Assert(err, checker.IsNil) - - // Load the target manifest blob. - manifestBlob := s.reg.readBlobContents(c, manifestDigest) - - var imgManifest schema2.Manifest - err = json.Unmarshal(manifestBlob, &imgManifest) - c.Assert(err, checker.IsNil) - - // Next, get the digest of one of the layers from the manifest. - targetLayerDigest := imgManifest.Layers[0].Digest - - // Move the existing data file aside, so that we can replace it with a - // malicious blob of data. NOTE: we defer the returned undo func. - undo := s.reg.tempMoveBlobData(c, targetLayerDigest) - defer undo() - - // Now make a fake data blob in this directory. - s.reg.writeBlobContents(c, targetLayerDigest, []byte("This is not the data you are looking for.")) - - // Now try pulling that image by digest. We should get an error about - // digest verification for the target layer digest. - - // Remove distribution cache to force a re-pull of the blobs - if err := os.RemoveAll(filepath.Join(dockerBasePath, "image", s.d.storageDriver, "distribution")); err != nil { - c.Fatalf("error clearing distribution cache: %v", err) - } - - // Pull from the registry using the @ reference. - imageReference := fmt.Sprintf("%s@%s", repoName, manifestDigest) - out, exitStatus, _ := dockerCmdWithError("pull", imageReference) - c.Assert(exitStatus, checker.Not(check.Equals), 0, check.Commentf("expected a non-zero exit status")) - - expectedErrorMsg := fmt.Sprintf("filesystem layer verification failed for digest %s", targetLayerDigest) - c.Assert(out, checker.Contains, expectedErrorMsg, check.Commentf("expected error message in output: %s", out)) -} - -// TestPullFailsWithAlteredLayer tests that a `docker pull` fails when -// we have modified a layer blob and its digest cannot be verified. -// This is the schema1 version of the test. -func (s *DockerSchema1RegistrySuite) TestPullFailsWithAlteredLayer(c *check.C) { - testRequires(c, DaemonIsLinux) - manifestDigest, err := setupImage(c) - c.Assert(err, checker.IsNil) - - // Load the target manifest blob. - manifestBlob := s.reg.readBlobContents(c, manifestDigest) - - var imgManifest schema1.Manifest - err = json.Unmarshal(manifestBlob, &imgManifest) - c.Assert(err, checker.IsNil) - - // Next, get the digest of one of the layers from the manifest. - targetLayerDigest := imgManifest.FSLayers[0].BlobSum - - // Move the existing data file aside, so that we can replace it with a - // malicious blob of data. NOTE: we defer the returned undo func. - undo := s.reg.tempMoveBlobData(c, targetLayerDigest) - defer undo() - - // Now make a fake data blob in this directory. - s.reg.writeBlobContents(c, targetLayerDigest, []byte("This is not the data you are looking for.")) - - // Now try pulling that image by digest. We should get an error about - // digest verification for the target layer digest. - - // Remove distribution cache to force a re-pull of the blobs - if err := os.RemoveAll(filepath.Join(dockerBasePath, "image", s.d.storageDriver, "distribution")); err != nil { - c.Fatalf("error clearing distribution cache: %v", err) - } - - // Pull from the registry using the @ reference. - imageReference := fmt.Sprintf("%s@%s", repoName, manifestDigest) - out, exitStatus, _ := dockerCmdWithError("pull", imageReference) - c.Assert(exitStatus, checker.Not(check.Equals), 0, check.Commentf("expected a non-zero exit status")) - - expectedErrorMsg := fmt.Sprintf("filesystem layer verification failed for digest %s", targetLayerDigest) - c.Assert(out, checker.Contains, expectedErrorMsg, check.Commentf("expected error message in output: %s", out)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_commit_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_commit_test.go deleted file mode 100644 index 8008ae171..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_commit_test.go +++ /dev/null @@ -1,157 +0,0 @@ -package main - -import ( - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestCommitAfterContainerIsDone(c *check.C) { - out, _ := dockerCmd(c, "run", "-i", "-a", "stdin", "busybox", "echo", "foo") - - cleanedContainerID := strings.TrimSpace(out) - - dockerCmd(c, "wait", cleanedContainerID) - - out, _ = dockerCmd(c, "commit", cleanedContainerID) - - cleanedImageID := strings.TrimSpace(out) - - dockerCmd(c, "inspect", cleanedImageID) -} - -func (s *DockerSuite) TestCommitWithoutPause(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-i", "-a", "stdin", "busybox", "echo", "foo") - - cleanedContainerID := strings.TrimSpace(out) - - dockerCmd(c, "wait", cleanedContainerID) - - out, _ = dockerCmd(c, "commit", "-p=false", cleanedContainerID) - - cleanedImageID := strings.TrimSpace(out) - - dockerCmd(c, "inspect", cleanedImageID) -} - -//test commit a paused container should not unpause it after commit -func (s *DockerSuite) TestCommitPausedContainer(c *check.C) { - testRequires(c, DaemonIsLinux) - defer unpauseAllContainers() - out, _ := dockerCmd(c, "run", "-i", "-d", "busybox") - - cleanedContainerID := strings.TrimSpace(out) - - dockerCmd(c, "pause", cleanedContainerID) - - out, _ = dockerCmd(c, "commit", cleanedContainerID) - - out = inspectField(c, cleanedContainerID, "State.Paused") - // commit should not unpause a paused container - c.Assert(out, checker.Contains, "true") -} - -func (s *DockerSuite) TestCommitNewFile(c *check.C) { - dockerCmd(c, "run", "--name", "commiter", "busybox", "/bin/sh", "-c", "echo koye > /foo") - - imageID, _ := dockerCmd(c, "commit", "commiter") - imageID = strings.TrimSpace(imageID) - - out, _ := dockerCmd(c, "run", imageID, "cat", "/foo") - actual := strings.TrimSpace(out) - c.Assert(actual, checker.Equals, "koye") -} - -func (s *DockerSuite) TestCommitHardlink(c *check.C) { - testRequires(c, DaemonIsLinux) - firstOutput, _ := dockerCmd(c, "run", "-t", "--name", "hardlinks", "busybox", "sh", "-c", "touch file1 && ln file1 file2 && ls -di file1 file2") - - chunks := strings.Split(strings.TrimSpace(firstOutput), " ") - inode := chunks[0] - chunks = strings.SplitAfterN(strings.TrimSpace(firstOutput), " ", 2) - c.Assert(chunks[1], checker.Contains, chunks[0], check.Commentf("Failed to create hardlink in a container. Expected to find %q in %q", inode, chunks[1:])) - - imageID, _ := dockerCmd(c, "commit", "hardlinks", "hardlinks") - imageID = strings.TrimSpace(imageID) - - secondOutput, _ := dockerCmd(c, "run", "-t", "hardlinks", "ls", "-di", "file1", "file2") - - chunks = strings.Split(strings.TrimSpace(secondOutput), " ") - inode = chunks[0] - chunks = strings.SplitAfterN(strings.TrimSpace(secondOutput), " ", 2) - c.Assert(chunks[1], checker.Contains, chunks[0], check.Commentf("Failed to create hardlink in a container. Expected to find %q in %q", inode, chunks[1:])) -} - -func (s *DockerSuite) TestCommitTTY(c *check.C) { - dockerCmd(c, "run", "-t", "--name", "tty", "busybox", "/bin/ls") - - imageID, _ := dockerCmd(c, "commit", "tty", "ttytest") - imageID = strings.TrimSpace(imageID) - - dockerCmd(c, "run", "ttytest", "/bin/ls") -} - -func (s *DockerSuite) TestCommitWithHostBindMount(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "--name", "bind-commit", "-v", "/dev/null:/winning", "busybox", "true") - - imageID, _ := dockerCmd(c, "commit", "bind-commit", "bindtest") - imageID = strings.TrimSpace(imageID) - - dockerCmd(c, "run", "bindtest", "true") -} - -func (s *DockerSuite) TestCommitChange(c *check.C) { - dockerCmd(c, "run", "--name", "test", "busybox", "true") - - imageID, _ := dockerCmd(c, "commit", - "--change", "EXPOSE 8080", - "--change", "ENV DEBUG true", - "--change", "ENV test 1", - "--change", "ENV PATH /foo", - "--change", "LABEL foo bar", - "--change", "CMD [\"/bin/sh\"]", - "--change", "WORKDIR /opt", - "--change", "ENTRYPOINT [\"/bin/sh\"]", - "--change", "USER testuser", - "--change", "VOLUME /var/lib/docker", - "--change", "ONBUILD /usr/local/bin/python-build --dir /app/src", - "test", "test-commit") - imageID = strings.TrimSpace(imageID) - - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - prefix = strings.ToUpper(prefix) // Force C: as that's how WORKDIR is normalised on Windows - expected := map[string]string{ - "Config.ExposedPorts": "map[8080/tcp:{}]", - "Config.Env": "[DEBUG=true test=1 PATH=/foo]", - "Config.Labels": "map[foo:bar]", - "Config.Cmd": "[/bin/sh]", - "Config.WorkingDir": prefix + slash + "opt", - "Config.Entrypoint": "[/bin/sh]", - "Config.User": "testuser", - "Config.Volumes": "map[/var/lib/docker:{}]", - "Config.OnBuild": "[/usr/local/bin/python-build --dir /app/src]", - } - - for conf, value := range expected { - res := inspectField(c, imageID, conf) - if res != value { - c.Errorf("%s('%s'), expected %s", conf, res, value) - } - } -} - -func (s *DockerSuite) TestCommitChangeLabels(c *check.C) { - dockerCmd(c, "run", "--name", "test", "--label", "some=label", "busybox", "true") - - imageID, _ := dockerCmd(c, "commit", - "--change", "LABEL some=label2", - "test", "test-commit") - imageID = strings.TrimSpace(imageID) - - c.Assert(inspectField(c, imageID, "Config.Labels"), checker.Equals, "map[some:label2]") - // check that container labels didn't change - c.Assert(inspectField(c, "test", "Config.Labels"), checker.Equals, "map[some:label]") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_config_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_config_test.go deleted file mode 100644 index 1d5e5ad3d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_config_test.go +++ /dev/null @@ -1,140 +0,0 @@ -package main - -import ( - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "os/exec" - "path/filepath" - "runtime" - - "github.com/docker/docker/api" - "github.com/docker/docker/dockerversion" - "github.com/docker/docker/pkg/homedir" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestConfigHTTPHeader(c *check.C) { - testRequires(c, UnixCli) // Can't set/unset HOME on windows right now - // We either need a level of Go that supports Unsetenv (for cases - // when HOME/USERPROFILE isn't set), or we need to be able to use - // os/user but user.Current() only works if we aren't statically compiling - - var headers map[string][]string - - server := httptest.NewServer(http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("API-Version", api.DefaultVersion) - headers = r.Header - })) - defer server.Close() - - homeKey := homedir.Key() - homeVal := homedir.Get() - tmpDir, err := ioutil.TempDir("", "fake-home") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpDir) - - dotDocker := filepath.Join(tmpDir, ".docker") - os.Mkdir(dotDocker, 0600) - tmpCfg := filepath.Join(dotDocker, "config.json") - - defer func() { os.Setenv(homeKey, homeVal) }() - os.Setenv(homeKey, tmpDir) - - data := `{ - "HttpHeaders": { "MyHeader": "MyValue" } - }` - - err = ioutil.WriteFile(tmpCfg, []byte(data), 0600) - c.Assert(err, checker.IsNil) - - cmd := exec.Command(dockerBinary, "-H="+server.URL[7:], "ps") - out, _, _ := runCommandWithOutput(cmd) - - c.Assert(headers["User-Agent"], checker.NotNil, check.Commentf("Missing User-Agent")) - - c.Assert(headers["User-Agent"][0], checker.Equals, "Docker-Client/"+dockerversion.Version+" ("+runtime.GOOS+")", check.Commentf("Badly formatted User-Agent,out:%v", out)) - - c.Assert(headers["Myheader"], checker.NotNil) - c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("Missing/bad header,out:%v", out)) - -} - -func (s *DockerSuite) TestConfigDir(c *check.C) { - cDir, err := ioutil.TempDir("", "fake-home") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(cDir) - - // First make sure pointing to empty dir doesn't generate an error - dockerCmd(c, "--config", cDir, "ps") - - // Test with env var too - cmd := exec.Command(dockerBinary, "ps") - cmd.Env = appendBaseEnv(true, "DOCKER_CONFIG="+cDir) - out, _, err := runCommandWithOutput(cmd) - - c.Assert(err, checker.IsNil, check.Commentf("ps2 didn't work,out:%v", out)) - - // Start a server so we can check to see if the config file was - // loaded properly - var headers map[string][]string - - server := httptest.NewServer(http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - headers = r.Header - })) - defer server.Close() - - // Create a dummy config file in our new config dir - data := `{ - "HttpHeaders": { "MyHeader": "MyValue" } - }` - - tmpCfg := filepath.Join(cDir, "config.json") - err = ioutil.WriteFile(tmpCfg, []byte(data), 0600) - c.Assert(err, checker.IsNil, check.Commentf("Err creating file")) - - env := appendBaseEnv(false) - - cmd = exec.Command(dockerBinary, "--config", cDir, "-H="+server.URL[7:], "ps") - cmd.Env = env - out, _, err = runCommandWithOutput(cmd) - - c.Assert(err, checker.NotNil, check.Commentf("out:%v", out)) - c.Assert(headers["Myheader"], checker.NotNil) - c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps3 - Missing header,out:%v", out)) - - // Reset headers and try again using env var this time - headers = map[string][]string{} - cmd = exec.Command(dockerBinary, "-H="+server.URL[7:], "ps") - cmd.Env = append(env, "DOCKER_CONFIG="+cDir) - out, _, err = runCommandWithOutput(cmd) - - c.Assert(err, checker.NotNil, check.Commentf("%v", out)) - c.Assert(headers["Myheader"], checker.NotNil) - c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps4 - Missing header,out:%v", out)) - - // Reset headers and make sure flag overrides the env var - headers = map[string][]string{} - cmd = exec.Command(dockerBinary, "--config", cDir, "-H="+server.URL[7:], "ps") - cmd.Env = append(env, "DOCKER_CONFIG=MissingDir") - out, _, err = runCommandWithOutput(cmd) - - c.Assert(err, checker.NotNil, check.Commentf("out:%v", out)) - c.Assert(headers["Myheader"], checker.NotNil) - c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps5 - Missing header,out:%v", out)) - - // Reset headers and make sure flag overrides the env var. - // Almost same as previous but make sure the "MissingDir" isn't - // ignore - we don't want to default back to the env var. - headers = map[string][]string{} - cmd = exec.Command(dockerBinary, "--config", "MissingDir", "-H="+server.URL[7:], "ps") - cmd.Env = append(env, "DOCKER_CONFIG="+cDir) - out, _, err = runCommandWithOutput(cmd) - - c.Assert(err, checker.NotNil, check.Commentf("out:%v", out)) - c.Assert(headers["Myheader"], checker.IsNil, check.Commentf("ps6 - Headers shouldn't be the expected value,out:%v", out)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_from_container_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_from_container_test.go deleted file mode 100644 index 9ed7e8c72..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_from_container_test.go +++ /dev/null @@ -1,488 +0,0 @@ -package main - -import ( - "os" - "path/filepath" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// docker cp CONTAINER:PATH LOCALPATH - -// Try all of the test cases from the archive package which implements the -// internals of `docker cp` and ensure that the behavior matches when actually -// copying to and from containers. - -// Basic assumptions about SRC and DST: -// 1. SRC must exist. -// 2. If SRC ends with a trailing separator, it must be a directory. -// 3. DST parent directory must exist. -// 4. If DST exists as a file, it must not end with a trailing separator. - -// First get these easy error cases out of the way. - -// Test for error when SRC does not exist. -func (s *DockerSuite) TestCpFromErrSrcNotExists(c *check.C) { - containerID := makeTestContainer(c, testContainerOptions{}) - - tmpDir := getTestDir(c, "test-cp-from-err-src-not-exists") - defer os.RemoveAll(tmpDir) - - err := runDockerCp(c, containerCpPath(containerID, "file1"), tmpDir) - c.Assert(err, checker.NotNil) - - c.Assert(isCpNotExist(err), checker.True, check.Commentf("expected IsNotExist error, but got %T: %s", err, err)) -} - -// Test for error when SRC ends in a trailing -// path separator but it exists as a file. -func (s *DockerSuite) TestCpFromErrSrcNotDir(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{addContent: true}) - - tmpDir := getTestDir(c, "test-cp-from-err-src-not-dir") - defer os.RemoveAll(tmpDir) - - err := runDockerCp(c, containerCpPathTrailingSep(containerID, "file1"), tmpDir) - c.Assert(err, checker.NotNil) - - c.Assert(isCpNotDir(err), checker.True, check.Commentf("expected IsNotDir error, but got %T: %s", err, err)) -} - -// Test for error when SRC is a valid file or directory, -// bu the DST parent directory does not exist. -func (s *DockerSuite) TestCpFromErrDstParentNotExists(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{addContent: true}) - - tmpDir := getTestDir(c, "test-cp-from-err-dst-parent-not-exists") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - // Try with a file source. - srcPath := containerCpPath(containerID, "/file1") - dstPath := cpPath(tmpDir, "notExists", "file1") - - err := runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.NotNil) - - c.Assert(isCpNotExist(err), checker.True, check.Commentf("expected IsNotExist error, but got %T: %s", err, err)) - - // Try with a directory source. - srcPath = containerCpPath(containerID, "/dir1") - - err = runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.NotNil) - - c.Assert(isCpNotExist(err), checker.True, check.Commentf("expected IsNotExist error, but got %T: %s", err, err)) -} - -// Test for error when DST ends in a trailing -// path separator but exists as a file. -func (s *DockerSuite) TestCpFromErrDstNotDir(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{addContent: true}) - - tmpDir := getTestDir(c, "test-cp-from-err-dst-not-dir") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - // Try with a file source. - srcPath := containerCpPath(containerID, "/file1") - dstPath := cpPathTrailingSep(tmpDir, "file1") - - err := runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.NotNil) - - c.Assert(isCpNotDir(err), checker.True, check.Commentf("expected IsNotDir error, but got %T: %s", err, err)) - - // Try with a directory source. - srcPath = containerCpPath(containerID, "/dir1") - - err = runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.NotNil) - - c.Assert(isCpNotDir(err), checker.True, check.Commentf("expected IsNotDir error, but got %T: %s", err, err)) -} - -// Check that copying from a container to a local symlink copies to the symlink -// target and does not overwrite the local symlink itself. -func (s *DockerSuite) TestCpFromSymlinkDestination(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{addContent: true}) - - tmpDir := getTestDir(c, "test-cp-from-err-dst-not-dir") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - // First, copy a file from the container to a symlink to a file. This - // should overwrite the symlink target contents with the source contents. - srcPath := containerCpPath(containerID, "/file2") - dstPath := cpPath(tmpDir, "symlinkToFile1") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - // The symlink should not have been modified. - c.Assert(symlinkTargetEquals(c, dstPath, "file1"), checker.IsNil) - - // The file should have the contents of "file2" now. - c.Assert(fileContentEquals(c, cpPath(tmpDir, "file1"), "file2\n"), checker.IsNil) - - // Next, copy a file from the container to a symlink to a directory. This - // should copy the file into the symlink target directory. - dstPath = cpPath(tmpDir, "symlinkToDir1") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - // The symlink should not have been modified. - c.Assert(symlinkTargetEquals(c, dstPath, "dir1"), checker.IsNil) - - // The file should have the contents of "file2" now. - c.Assert(fileContentEquals(c, cpPath(tmpDir, "file2"), "file2\n"), checker.IsNil) - - // Next, copy a file from the container to a symlink to a file that does - // not exist (a broken symlink). This should create the target file with - // the contents of the source file. - dstPath = cpPath(tmpDir, "brokenSymlinkToFileX") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - // The symlink should not have been modified. - c.Assert(symlinkTargetEquals(c, dstPath, "fileX"), checker.IsNil) - - // The file should have the contents of "file2" now. - c.Assert(fileContentEquals(c, cpPath(tmpDir, "fileX"), "file2\n"), checker.IsNil) - - // Next, copy a directory from the container to a symlink to a local - // directory. This should copy the directory into the symlink target - // directory and not modify the symlink. - srcPath = containerCpPath(containerID, "/dir2") - dstPath = cpPath(tmpDir, "symlinkToDir1") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - // The symlink should not have been modified. - c.Assert(symlinkTargetEquals(c, dstPath, "dir1"), checker.IsNil) - - // The directory should now contain a copy of "dir2". - c.Assert(fileContentEquals(c, cpPath(tmpDir, "dir1/dir2/file2-1"), "file2-1\n"), checker.IsNil) - - // Next, copy a directory from the container to a symlink to a local - // directory that does not exist (a broken symlink). This should create - // the target as a directory with the contents of the source directory. It - // should not modify the symlink. - dstPath = cpPath(tmpDir, "brokenSymlinkToDirX") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - // The symlink should not have been modified. - c.Assert(symlinkTargetEquals(c, dstPath, "dirX"), checker.IsNil) - - // The "dirX" directory should now be a copy of "dir2". - c.Assert(fileContentEquals(c, cpPath(tmpDir, "dirX/file2-1"), "file2-1\n"), checker.IsNil) -} - -// Possibilities are reduced to the remaining 10 cases: -// -// case | srcIsDir | onlyDirContents | dstExists | dstIsDir | dstTrSep | action -// =================================================================================================== -// A | no | - | no | - | no | create file -// B | no | - | no | - | yes | error -// C | no | - | yes | no | - | overwrite file -// D | no | - | yes | yes | - | create file in dst dir -// E | yes | no | no | - | - | create dir, copy contents -// F | yes | no | yes | no | - | error -// G | yes | no | yes | yes | - | copy dir and contents -// H | yes | yes | no | - | - | create dir, copy contents -// I | yes | yes | yes | no | - | error -// J | yes | yes | yes | yes | - | copy dir contents -// - -// A. SRC specifies a file and DST (no trailing path separator) doesn't -// exist. This should create a file with the name DST and copy the -// contents of the source file into it. -func (s *DockerSuite) TestCpFromCaseA(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, workDir: "/root", - }) - - tmpDir := getTestDir(c, "test-cp-from-case-a") - defer os.RemoveAll(tmpDir) - - srcPath := containerCpPath(containerID, "/root/file1") - dstPath := cpPath(tmpDir, "itWorks.txt") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1\n"), checker.IsNil) -} - -// B. SRC specifies a file and DST (with trailing path separator) doesn't -// exist. This should cause an error because the copy operation cannot -// create a directory when copying a single file. -func (s *DockerSuite) TestCpFromCaseB(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{addContent: true}) - - tmpDir := getTestDir(c, "test-cp-from-case-b") - defer os.RemoveAll(tmpDir) - - srcPath := containerCpPath(containerID, "/file1") - dstDir := cpPathTrailingSep(tmpDir, "testDir") - - err := runDockerCp(c, srcPath, dstDir) - c.Assert(err, checker.NotNil) - - c.Assert(isCpDirNotExist(err), checker.True, check.Commentf("expected DirNotExists error, but got %T: %s", err, err)) -} - -// C. SRC specifies a file and DST exists as a file. This should overwrite -// the file at DST with the contents of the source file. -func (s *DockerSuite) TestCpFromCaseC(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, workDir: "/root", - }) - - tmpDir := getTestDir(c, "test-cp-from-case-c") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcPath := containerCpPath(containerID, "/root/file1") - dstPath := cpPath(tmpDir, "file2") - - // Ensure the local file starts with different content. - c.Assert(fileContentEquals(c, dstPath, "file2\n"), checker.IsNil) - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1\n"), checker.IsNil) -} - -// D. SRC specifies a file and DST exists as a directory. This should place -// a copy of the source file inside it using the basename from SRC. Ensure -// this works whether DST has a trailing path separator or not. -func (s *DockerSuite) TestCpFromCaseD(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{addContent: true}) - - tmpDir := getTestDir(c, "test-cp-from-case-d") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcPath := containerCpPath(containerID, "/file1") - dstDir := cpPath(tmpDir, "dir1") - dstPath := filepath.Join(dstDir, "file1") - - // Ensure that dstPath doesn't exist. - _, err := os.Stat(dstPath) - c.Assert(os.IsNotExist(err), checker.True, check.Commentf("did not expect dstPath %q to exist", dstPath)) - - c.Assert(runDockerCp(c, srcPath, dstDir), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1\n"), checker.IsNil) - - // Now try again but using a trailing path separator for dstDir. - - // unable to remove dstDir - c.Assert(os.RemoveAll(dstDir), checker.IsNil) - - // unable to make dstDir - c.Assert(os.MkdirAll(dstDir, os.FileMode(0755)), checker.IsNil) - - dstDir = cpPathTrailingSep(tmpDir, "dir1") - - c.Assert(runDockerCp(c, srcPath, dstDir), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1\n"), checker.IsNil) -} - -// E. SRC specifies a directory and DST does not exist. This should create a -// directory at DST and copy the contents of the SRC directory into the DST -// directory. Ensure this works whether DST has a trailing path separator or -// not. -func (s *DockerSuite) TestCpFromCaseE(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{addContent: true}) - - tmpDir := getTestDir(c, "test-cp-from-case-e") - defer os.RemoveAll(tmpDir) - - srcDir := containerCpPath(containerID, "dir1") - dstDir := cpPath(tmpDir, "testDir") - dstPath := filepath.Join(dstDir, "file1-1") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1-1\n"), checker.IsNil) - - // Now try again but using a trailing path separator for dstDir. - - // unable to remove dstDir - c.Assert(os.RemoveAll(dstDir), checker.IsNil) - - dstDir = cpPathTrailingSep(tmpDir, "testDir") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1-1\n"), checker.IsNil) -} - -// F. SRC specifies a directory and DST exists as a file. This should cause an -// error as it is not possible to overwrite a file with a directory. -func (s *DockerSuite) TestCpFromCaseF(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, workDir: "/root", - }) - - tmpDir := getTestDir(c, "test-cp-from-case-f") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcDir := containerCpPath(containerID, "/root/dir1") - dstFile := cpPath(tmpDir, "file1") - - err := runDockerCp(c, srcDir, dstFile) - c.Assert(err, checker.NotNil) - - c.Assert(isCpCannotCopyDir(err), checker.True, check.Commentf("expected ErrCannotCopyDir error, but got %T: %s", err, err)) -} - -// G. SRC specifies a directory and DST exists as a directory. This should copy -// the SRC directory and all its contents to the DST directory. Ensure this -// works whether DST has a trailing path separator or not. -func (s *DockerSuite) TestCpFromCaseG(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, workDir: "/root", - }) - - tmpDir := getTestDir(c, "test-cp-from-case-g") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcDir := containerCpPath(containerID, "/root/dir1") - dstDir := cpPath(tmpDir, "dir2") - resultDir := filepath.Join(dstDir, "dir1") - dstPath := filepath.Join(resultDir, "file1-1") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1-1\n"), checker.IsNil) - - // Now try again but using a trailing path separator for dstDir. - - // unable to remove dstDir - c.Assert(os.RemoveAll(dstDir), checker.IsNil) - - // unable to make dstDir - c.Assert(os.MkdirAll(dstDir, os.FileMode(0755)), checker.IsNil) - - dstDir = cpPathTrailingSep(tmpDir, "dir2") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1-1\n"), checker.IsNil) -} - -// H. SRC specifies a directory's contents only and DST does not exist. This -// should create a directory at DST and copy the contents of the SRC -// directory (but not the directory itself) into the DST directory. Ensure -// this works whether DST has a trailing path separator or not. -func (s *DockerSuite) TestCpFromCaseH(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{addContent: true}) - - tmpDir := getTestDir(c, "test-cp-from-case-h") - defer os.RemoveAll(tmpDir) - - srcDir := containerCpPathTrailingSep(containerID, "dir1") + "." - dstDir := cpPath(tmpDir, "testDir") - dstPath := filepath.Join(dstDir, "file1-1") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1-1\n"), checker.IsNil) - - // Now try again but using a trailing path separator for dstDir. - - // unable to remove resultDir - c.Assert(os.RemoveAll(dstDir), checker.IsNil) - - dstDir = cpPathTrailingSep(tmpDir, "testDir") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1-1\n"), checker.IsNil) -} - -// I. SRC specifies a directory's contents only and DST exists as a file. This -// should cause an error as it is not possible to overwrite a file with a -// directory. -func (s *DockerSuite) TestCpFromCaseI(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, workDir: "/root", - }) - - tmpDir := getTestDir(c, "test-cp-from-case-i") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcDir := containerCpPathTrailingSep(containerID, "/root/dir1") + "." - dstFile := cpPath(tmpDir, "file1") - - err := runDockerCp(c, srcDir, dstFile) - c.Assert(err, checker.NotNil) - - c.Assert(isCpCannotCopyDir(err), checker.True, check.Commentf("expected ErrCannotCopyDir error, but got %T: %s", err, err)) -} - -// J. SRC specifies a directory's contents only and DST exists as a directory. -// This should copy the contents of the SRC directory (but not the directory -// itself) into the DST directory. Ensure this works whether DST has a -// trailing path separator or not. -func (s *DockerSuite) TestCpFromCaseJ(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, workDir: "/root", - }) - - tmpDir := getTestDir(c, "test-cp-from-case-j") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcDir := containerCpPathTrailingSep(containerID, "/root/dir1") + "." - dstDir := cpPath(tmpDir, "dir2") - dstPath := filepath.Join(dstDir, "file1-1") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1-1\n"), checker.IsNil) - - // Now try again but using a trailing path separator for dstDir. - - // unable to remove dstDir - c.Assert(os.RemoveAll(dstDir), checker.IsNil) - - // unable to make dstDir - c.Assert(os.MkdirAll(dstDir, os.FileMode(0755)), checker.IsNil) - - dstDir = cpPathTrailingSep(tmpDir, "dir2") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - c.Assert(fileContentEquals(c, dstPath, "file1-1\n"), checker.IsNil) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_test.go deleted file mode 100644 index 4e5c39e99..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_test.go +++ /dev/null @@ -1,660 +0,0 @@ -package main - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/go-check/check" -) - -const ( - cpTestPathParent = "/some" - cpTestPath = "/some/path" - cpTestName = "test" - cpFullPath = "/some/path/test" - - cpContainerContents = "holla, i am the container" - cpHostContents = "hello, i am the host" -) - -// Ensure that an all-local path case returns an error. -func (s *DockerSuite) TestCpLocalOnly(c *check.C) { - err := runDockerCp(c, "foo", "bar") - c.Assert(err, checker.NotNil) - - c.Assert(err.Error(), checker.Contains, "must specify at least one container source") -} - -// Test for #5656 -// Check that garbage paths don't escape the container's rootfs -func (s *DockerSuite) TestCpGarbagePath(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "mkdir -p '"+cpTestPath+"' && echo -n '"+cpContainerContents+"' > "+cpFullPath) - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - c.Assert(os.MkdirAll(cpTestPath, os.ModeDir), checker.IsNil) - - hostFile, err := os.Create(cpFullPath) - c.Assert(err, checker.IsNil) - defer hostFile.Close() - defer os.RemoveAll(cpTestPathParent) - - fmt.Fprintf(hostFile, "%s", cpHostContents) - - tmpdir, err := ioutil.TempDir("", "docker-integration") - c.Assert(err, checker.IsNil) - - tmpname := filepath.Join(tmpdir, cpTestName) - defer os.RemoveAll(tmpdir) - - path := path.Join("../../../../../../../../../../../../", cpFullPath) - - dockerCmd(c, "cp", containerID+":"+path, tmpdir) - - file, _ := os.Open(tmpname) - defer file.Close() - - test, err := ioutil.ReadAll(file) - c.Assert(err, checker.IsNil) - - // output matched host file -- garbage path can escape container rootfs - c.Assert(string(test), checker.Not(checker.Equals), cpHostContents) - - // output doesn't match the input for garbage path - c.Assert(string(test), checker.Equals, cpContainerContents) -} - -// Check that relative paths are relative to the container's rootfs -func (s *DockerSuite) TestCpRelativePath(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "mkdir -p '"+cpTestPath+"' && echo -n '"+cpContainerContents+"' > "+cpFullPath) - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - c.Assert(os.MkdirAll(cpTestPath, os.ModeDir), checker.IsNil) - - hostFile, err := os.Create(cpFullPath) - c.Assert(err, checker.IsNil) - defer hostFile.Close() - defer os.RemoveAll(cpTestPathParent) - - fmt.Fprintf(hostFile, "%s", cpHostContents) - - tmpdir, err := ioutil.TempDir("", "docker-integration") - c.Assert(err, checker.IsNil) - - tmpname := filepath.Join(tmpdir, cpTestName) - defer os.RemoveAll(tmpdir) - - var relPath string - if path.IsAbs(cpFullPath) { - // normally this is `filepath.Rel("/", cpFullPath)` but we cannot - // get this unix-path manipulation on windows with filepath. - relPath = cpFullPath[1:] - } - c.Assert(path.IsAbs(cpFullPath), checker.True, check.Commentf("path %s was assumed to be an absolute path", cpFullPath)) - - dockerCmd(c, "cp", containerID+":"+relPath, tmpdir) - - file, _ := os.Open(tmpname) - defer file.Close() - - test, err := ioutil.ReadAll(file) - c.Assert(err, checker.IsNil) - - // output matched host file -- relative path can escape container rootfs - c.Assert(string(test), checker.Not(checker.Equals), cpHostContents) - - // output doesn't match the input for relative path - c.Assert(string(test), checker.Equals, cpContainerContents) -} - -// Check that absolute paths are relative to the container's rootfs -func (s *DockerSuite) TestCpAbsolutePath(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "mkdir -p '"+cpTestPath+"' && echo -n '"+cpContainerContents+"' > "+cpFullPath) - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - c.Assert(os.MkdirAll(cpTestPath, os.ModeDir), checker.IsNil) - - hostFile, err := os.Create(cpFullPath) - c.Assert(err, checker.IsNil) - defer hostFile.Close() - defer os.RemoveAll(cpTestPathParent) - - fmt.Fprintf(hostFile, "%s", cpHostContents) - - tmpdir, err := ioutil.TempDir("", "docker-integration") - c.Assert(err, checker.IsNil) - - tmpname := filepath.Join(tmpdir, cpTestName) - defer os.RemoveAll(tmpdir) - - path := cpFullPath - - dockerCmd(c, "cp", containerID+":"+path, tmpdir) - - file, _ := os.Open(tmpname) - defer file.Close() - - test, err := ioutil.ReadAll(file) - c.Assert(err, checker.IsNil) - - // output matched host file -- absolute path can escape container rootfs - c.Assert(string(test), checker.Not(checker.Equals), cpHostContents) - - // output doesn't match the input for absolute path - c.Assert(string(test), checker.Equals, cpContainerContents) -} - -// Test for #5619 -// Check that absolute symlinks are still relative to the container's rootfs -func (s *DockerSuite) TestCpAbsoluteSymlink(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "mkdir -p '"+cpTestPath+"' && echo -n '"+cpContainerContents+"' > "+cpFullPath+" && ln -s "+cpFullPath+" container_path") - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - c.Assert(os.MkdirAll(cpTestPath, os.ModeDir), checker.IsNil) - - hostFile, err := os.Create(cpFullPath) - c.Assert(err, checker.IsNil) - defer hostFile.Close() - defer os.RemoveAll(cpTestPathParent) - - fmt.Fprintf(hostFile, "%s", cpHostContents) - - tmpdir, err := ioutil.TempDir("", "docker-integration") - c.Assert(err, checker.IsNil) - - tmpname := filepath.Join(tmpdir, "container_path") - defer os.RemoveAll(tmpdir) - - path := path.Join("/", "container_path") - - dockerCmd(c, "cp", containerID+":"+path, tmpdir) - - // We should have copied a symlink *NOT* the file itself! - linkTarget, err := os.Readlink(tmpname) - c.Assert(err, checker.IsNil) - - c.Assert(linkTarget, checker.Equals, filepath.FromSlash(cpFullPath)) -} - -// Check that symlinks to a directory behave as expected when copying one from -// a container. -func (s *DockerSuite) TestCpFromSymlinkToDirectory(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "mkdir -p '"+cpTestPath+"' && echo -n '"+cpContainerContents+"' > "+cpFullPath+" && ln -s "+cpTestPathParent+" /dir_link") - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - testDir, err := ioutil.TempDir("", "test-cp-from-symlink-to-dir-") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(testDir) - - // This copy command should copy the symlink, not the target, into the - // temporary directory. - dockerCmd(c, "cp", containerID+":"+"/dir_link", testDir) - - expectedPath := filepath.Join(testDir, "dir_link") - linkTarget, err := os.Readlink(expectedPath) - c.Assert(err, checker.IsNil) - - c.Assert(linkTarget, checker.Equals, filepath.FromSlash(cpTestPathParent)) - - os.Remove(expectedPath) - - // This copy command should resolve the symlink (note the trailing - // separator), copying the target into the temporary directory. - dockerCmd(c, "cp", containerID+":"+"/dir_link/", testDir) - - // It *should not* have copied the directory using the target's name, but - // used the given name instead. - unexpectedPath := filepath.Join(testDir, cpTestPathParent) - stat, err := os.Lstat(unexpectedPath) - if err == nil { - out = fmt.Sprintf("target name was copied: %q - %q", stat.Mode(), stat.Name()) - } - c.Assert(err, checker.NotNil, check.Commentf(out)) - - // It *should* have copied the directory using the asked name "dir_link". - stat, err = os.Lstat(expectedPath) - c.Assert(err, checker.IsNil, check.Commentf("unable to stat resource at %q", expectedPath)) - - c.Assert(stat.IsDir(), checker.True, check.Commentf("should have copied a directory but got %q instead", stat.Mode())) -} - -// Check that symlinks to a directory behave as expected when copying one to a -// container. -func (s *DockerSuite) TestCpToSymlinkToDirectory(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, SameHostDaemon) // Requires local volume mount bind. - - testVol, err := ioutil.TempDir("", "test-cp-to-symlink-to-dir-") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(testVol) - - // Create a test container with a local volume. We will test by copying - // to the volume path in the container which we can then verify locally. - out, _ := dockerCmd(c, "create", "-v", testVol+":/testVol", "busybox") - - containerID := strings.TrimSpace(out) - - // Create a temp directory to hold a test file nested in a directory. - testDir, err := ioutil.TempDir("", "test-cp-to-symlink-to-dir-") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(testDir) - - // This file will be at "/testDir/some/path/test" and will be copied into - // the test volume later. - hostTestFilename := filepath.Join(testDir, cpFullPath) - c.Assert(os.MkdirAll(filepath.Dir(hostTestFilename), os.FileMode(0700)), checker.IsNil) - c.Assert(ioutil.WriteFile(hostTestFilename, []byte(cpHostContents), os.FileMode(0600)), checker.IsNil) - - // Now create another temp directory to hold a symlink to the - // "/testDir/some" directory. - linkDir, err := ioutil.TempDir("", "test-cp-to-symlink-to-dir-") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(linkDir) - - // Then symlink "/linkDir/dir_link" to "/testdir/some". - linkTarget := filepath.Join(testDir, cpTestPathParent) - localLink := filepath.Join(linkDir, "dir_link") - c.Assert(os.Symlink(linkTarget, localLink), checker.IsNil) - - // Now copy that symlink into the test volume in the container. - dockerCmd(c, "cp", localLink, containerID+":/testVol") - - // This copy command should have copied the symlink *not* the target. - expectedPath := filepath.Join(testVol, "dir_link") - actualLinkTarget, err := os.Readlink(expectedPath) - c.Assert(err, checker.IsNil, check.Commentf("unable to read symlink at %q", expectedPath)) - - c.Assert(actualLinkTarget, checker.Equals, linkTarget) - - // Good, now remove that copied link for the next test. - os.Remove(expectedPath) - - // This copy command should resolve the symlink (note the trailing - // separator), copying the target into the test volume directory in the - // container. - dockerCmd(c, "cp", localLink+"/", containerID+":/testVol") - - // It *should not* have copied the directory using the target's name, but - // used the given name instead. - unexpectedPath := filepath.Join(testVol, cpTestPathParent) - stat, err := os.Lstat(unexpectedPath) - if err == nil { - out = fmt.Sprintf("target name was copied: %q - %q", stat.Mode(), stat.Name()) - } - c.Assert(err, checker.NotNil, check.Commentf(out)) - - // It *should* have copied the directory using the asked name "dir_link". - stat, err = os.Lstat(expectedPath) - c.Assert(err, checker.IsNil, check.Commentf("unable to stat resource at %q", expectedPath)) - - c.Assert(stat.IsDir(), checker.True, check.Commentf("should have copied a directory but got %q instead", stat.Mode())) - - // And this directory should contain the file copied from the host at the - // expected location: "/testVol/dir_link/path/test" - expectedFilepath := filepath.Join(testVol, "dir_link/path/test") - fileContents, err := ioutil.ReadFile(expectedFilepath) - c.Assert(err, checker.IsNil) - - c.Assert(string(fileContents), checker.Equals, cpHostContents) -} - -// Test for #5619 -// Check that symlinks which are part of the resource path are still relative to the container's rootfs -func (s *DockerSuite) TestCpSymlinkComponent(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "mkdir -p '"+cpTestPath+"' && echo -n '"+cpContainerContents+"' > "+cpFullPath+" && ln -s "+cpTestPath+" container_path") - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - c.Assert(os.MkdirAll(cpTestPath, os.ModeDir), checker.IsNil) - - hostFile, err := os.Create(cpFullPath) - c.Assert(err, checker.IsNil) - defer hostFile.Close() - defer os.RemoveAll(cpTestPathParent) - - fmt.Fprintf(hostFile, "%s", cpHostContents) - - tmpdir, err := ioutil.TempDir("", "docker-integration") - - c.Assert(err, checker.IsNil) - - tmpname := filepath.Join(tmpdir, cpTestName) - defer os.RemoveAll(tmpdir) - - path := path.Join("/", "container_path", cpTestName) - - dockerCmd(c, "cp", containerID+":"+path, tmpdir) - - file, _ := os.Open(tmpname) - defer file.Close() - - test, err := ioutil.ReadAll(file) - c.Assert(err, checker.IsNil) - - // output matched host file -- symlink path component can escape container rootfs - c.Assert(string(test), checker.Not(checker.Equals), cpHostContents) - - // output doesn't match the input for symlink path component - c.Assert(string(test), checker.Equals, cpContainerContents) -} - -// Check that cp with unprivileged user doesn't return any error -func (s *DockerSuite) TestCpUnprivilegedUser(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, UnixCli) // uses chmod/su: not available on windows - - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "touch "+cpTestName) - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - tmpdir, err := ioutil.TempDir("", "docker-integration") - c.Assert(err, checker.IsNil) - - defer os.RemoveAll(tmpdir) - - c.Assert(os.Chmod(tmpdir, 0777), checker.IsNil) - - result := icmd.RunCommand("su", "unprivilegeduser", "-c", - fmt.Sprintf("%s cp %s:%s %s", dockerBinary, containerID, cpTestName, tmpdir)) - result.Assert(c, icmd.Expected{}) -} - -func (s *DockerSuite) TestCpSpecialFiles(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, SameHostDaemon) - - outDir, err := ioutil.TempDir("", "cp-test-special-files") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(outDir) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "touch /foo") - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - // Copy actual /etc/resolv.conf - dockerCmd(c, "cp", containerID+":/etc/resolv.conf", outDir) - - expected, err := readContainerFile(containerID, "resolv.conf") - actual, err := ioutil.ReadFile(outDir + "/resolv.conf") - - // Expected copied file to be duplicate of the container resolvconf - c.Assert(bytes.Equal(actual, expected), checker.True) - - // Copy actual /etc/hosts - dockerCmd(c, "cp", containerID+":/etc/hosts", outDir) - - expected, err = readContainerFile(containerID, "hosts") - actual, err = ioutil.ReadFile(outDir + "/hosts") - - // Expected copied file to be duplicate of the container hosts - c.Assert(bytes.Equal(actual, expected), checker.True) - - // Copy actual /etc/resolv.conf - dockerCmd(c, "cp", containerID+":/etc/hostname", outDir) - - expected, err = readContainerFile(containerID, "hostname") - actual, err = ioutil.ReadFile(outDir + "/hostname") - - // Expected copied file to be duplicate of the container resolvconf - c.Assert(bytes.Equal(actual, expected), checker.True) -} - -func (s *DockerSuite) TestCpVolumePath(c *check.C) { - // stat /tmp/cp-test-volumepath851508420/test gets permission denied for the user - testRequires(c, NotUserNamespace) - testRequires(c, DaemonIsLinux) - testRequires(c, SameHostDaemon) - - tmpDir, err := ioutil.TempDir("", "cp-test-volumepath") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpDir) - outDir, err := ioutil.TempDir("", "cp-test-volumepath-out") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(outDir) - _, err = os.Create(tmpDir + "/test") - c.Assert(err, checker.IsNil) - - out, _ := dockerCmd(c, "run", "-d", "-v", "/foo", "-v", tmpDir+"/test:/test", "-v", tmpDir+":/baz", "busybox", "/bin/sh", "-c", "touch /foo/bar") - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - // Copy actual volume path - dockerCmd(c, "cp", containerID+":/foo", outDir) - - stat, err := os.Stat(outDir + "/foo") - c.Assert(err, checker.IsNil) - // expected copied content to be dir - c.Assert(stat.IsDir(), checker.True) - stat, err = os.Stat(outDir + "/foo/bar") - c.Assert(err, checker.IsNil) - // Expected file `bar` to be a file - c.Assert(stat.IsDir(), checker.False) - - // Copy file nested in volume - dockerCmd(c, "cp", containerID+":/foo/bar", outDir) - - stat, err = os.Stat(outDir + "/bar") - c.Assert(err, checker.IsNil) - // Expected file `bar` to be a file - c.Assert(stat.IsDir(), checker.False) - - // Copy Bind-mounted dir - dockerCmd(c, "cp", containerID+":/baz", outDir) - stat, err = os.Stat(outDir + "/baz") - c.Assert(err, checker.IsNil) - // Expected `baz` to be a dir - c.Assert(stat.IsDir(), checker.True) - - // Copy file nested in bind-mounted dir - dockerCmd(c, "cp", containerID+":/baz/test", outDir) - fb, err := ioutil.ReadFile(outDir + "/baz/test") - c.Assert(err, checker.IsNil) - fb2, err := ioutil.ReadFile(tmpDir + "/test") - c.Assert(err, checker.IsNil) - // Expected copied file to be duplicate of bind-mounted file - c.Assert(bytes.Equal(fb, fb2), checker.True) - - // Copy bind-mounted file - dockerCmd(c, "cp", containerID+":/test", outDir) - fb, err = ioutil.ReadFile(outDir + "/test") - c.Assert(err, checker.IsNil) - fb2, err = ioutil.ReadFile(tmpDir + "/test") - c.Assert(err, checker.IsNil) - // Expected copied file to be duplicate of bind-mounted file - c.Assert(bytes.Equal(fb, fb2), checker.True) -} - -func (s *DockerSuite) TestCpToDot(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "echo lololol > /test") - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - tmpdir, err := ioutil.TempDir("", "docker-integration") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpdir) - cwd, err := os.Getwd() - c.Assert(err, checker.IsNil) - defer os.Chdir(cwd) - c.Assert(os.Chdir(tmpdir), checker.IsNil) - dockerCmd(c, "cp", containerID+":/test", ".") - content, err := ioutil.ReadFile("./test") - c.Assert(string(content), checker.Equals, "lololol\n") -} - -func (s *DockerSuite) TestCpToStdout(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "echo lololol > /test") - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - out, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "cp", containerID+":/test", "-"), - exec.Command("tar", "-vtf", "-")) - - c.Assert(err, checker.IsNil) - - c.Assert(out, checker.Contains, "test") - c.Assert(out, checker.Contains, "-rw") -} - -func (s *DockerSuite) TestCpNameHasColon(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "echo lololol > /te:s:t") - - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - tmpdir, err := ioutil.TempDir("", "docker-integration") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpdir) - dockerCmd(c, "cp", containerID+":/te:s:t", tmpdir) - content, err := ioutil.ReadFile(tmpdir + "/te:s:t") - c.Assert(string(content), checker.Equals, "lololol\n") -} - -func (s *DockerSuite) TestCopyAndRestart(c *check.C) { - testRequires(c, DaemonIsLinux) - expectedMsg := "hello" - out, _ := dockerCmd(c, "run", "-d", "busybox", "echo", expectedMsg) - containerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - // failed to set up container - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - tmpDir, err := ioutil.TempDir("", "test-docker-restart-after-copy-") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpDir) - - dockerCmd(c, "cp", fmt.Sprintf("%s:/etc/group", containerID), tmpDir) - - out, _ = dockerCmd(c, "start", "-a", containerID) - - c.Assert(strings.TrimSpace(out), checker.Equals, expectedMsg) -} - -func (s *DockerSuite) TestCopyCreatedContainer(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "create", "--name", "test_cp", "-v", "/test", "busybox") - - tmpDir, err := ioutil.TempDir("", "test") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpDir) - dockerCmd(c, "cp", "test_cp:/bin/sh", tmpDir) -} - -// test copy with option `-L`: following symbol link -// Check that symlinks to a file behave as expected when copying one from -// a container to host following symbol link -func (s *DockerSuite) TestCpSymlinkFromConToHostFollowSymlink(c *check.C) { - testRequires(c, DaemonIsLinux) - out, exitCode := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "mkdir -p '"+cpTestPath+"' && echo -n '"+cpContainerContents+"' > "+cpFullPath+" && ln -s "+cpFullPath+" /dir_link") - if exitCode != 0 { - c.Fatal("failed to create a container", out) - } - - cleanedContainerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", cleanedContainerID) - if strings.TrimSpace(out) != "0" { - c.Fatal("failed to set up container", out) - } - - testDir, err := ioutil.TempDir("", "test-cp-symlink-container-to-host-follow-symlink") - if err != nil { - c.Fatal(err) - } - defer os.RemoveAll(testDir) - - // This copy command should copy the symlink, not the target, into the - // temporary directory. - dockerCmd(c, "cp", "-L", cleanedContainerID+":"+"/dir_link", testDir) - - expectedPath := filepath.Join(testDir, "dir_link") - - expected := []byte(cpContainerContents) - actual, err := ioutil.ReadFile(expectedPath) - - if !bytes.Equal(actual, expected) { - c.Fatalf("Expected copied file to be duplicate of the container symbol link target") - } - os.Remove(expectedPath) - - // now test copy symbol link to a non-existing file in host - expectedPath = filepath.Join(testDir, "somefile_host") - // expectedPath shouldn't exist, if exists, remove it - if _, err := os.Lstat(expectedPath); err == nil { - os.Remove(expectedPath) - } - - dockerCmd(c, "cp", "-L", cleanedContainerID+":"+"/dir_link", expectedPath) - - actual, err = ioutil.ReadFile(expectedPath) - - if !bytes.Equal(actual, expected) { - c.Fatalf("Expected copied file to be duplicate of the container symbol link target") - } - defer os.Remove(expectedPath) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_test.go deleted file mode 100644 index f981cb8f8..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_test.go +++ /dev/null @@ -1,599 +0,0 @@ -package main - -import ( - "os" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// docker cp LOCALPATH CONTAINER:PATH - -// Try all of the test cases from the archive package which implements the -// internals of `docker cp` and ensure that the behavior matches when actually -// copying to and from containers. - -// Basic assumptions about SRC and DST: -// 1. SRC must exist. -// 2. If SRC ends with a trailing separator, it must be a directory. -// 3. DST parent directory must exist. -// 4. If DST exists as a file, it must not end with a trailing separator. - -// First get these easy error cases out of the way. - -// Test for error when SRC does not exist. -func (s *DockerSuite) TestCpToErrSrcNotExists(c *check.C) { - containerID := makeTestContainer(c, testContainerOptions{}) - - tmpDir := getTestDir(c, "test-cp-to-err-src-not-exists") - defer os.RemoveAll(tmpDir) - - srcPath := cpPath(tmpDir, "file1") - dstPath := containerCpPath(containerID, "file1") - - err := runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.NotNil) - - c.Assert(isCpNotExist(err), checker.True, check.Commentf("expected IsNotExist error, but got %T: %s", err, err)) -} - -// Test for error when SRC ends in a trailing -// path separator but it exists as a file. -func (s *DockerSuite) TestCpToErrSrcNotDir(c *check.C) { - containerID := makeTestContainer(c, testContainerOptions{}) - - tmpDir := getTestDir(c, "test-cp-to-err-src-not-dir") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcPath := cpPathTrailingSep(tmpDir, "file1") - dstPath := containerCpPath(containerID, "testDir") - - err := runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.NotNil) - - c.Assert(isCpNotDir(err), checker.True, check.Commentf("expected IsNotDir error, but got %T: %s", err, err)) -} - -// Test for error when SRC is a valid file or directory, -// bu the DST parent directory does not exist. -func (s *DockerSuite) TestCpToErrDstParentNotExists(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{addContent: true}) - - tmpDir := getTestDir(c, "test-cp-to-err-dst-parent-not-exists") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - // Try with a file source. - srcPath := cpPath(tmpDir, "file1") - dstPath := containerCpPath(containerID, "/notExists", "file1") - - err := runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.NotNil) - - c.Assert(isCpNotExist(err), checker.True, check.Commentf("expected IsNotExist error, but got %T: %s", err, err)) - - // Try with a directory source. - srcPath = cpPath(tmpDir, "dir1") - - c.Assert(err, checker.NotNil) - - c.Assert(isCpNotExist(err), checker.True, check.Commentf("expected IsNotExist error, but got %T: %s", err, err)) -} - -// Test for error when DST ends in a trailing path separator but exists as a -// file. Also test that we cannot overwrite an existing directory with a -// non-directory and cannot overwrite an existing -func (s *DockerSuite) TestCpToErrDstNotDir(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{addContent: true}) - - tmpDir := getTestDir(c, "test-cp-to-err-dst-not-dir") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - // Try with a file source. - srcPath := cpPath(tmpDir, "dir1/file1-1") - dstPath := containerCpPathTrailingSep(containerID, "file1") - - // The client should encounter an error trying to stat the destination - // and then be unable to copy since the destination is asserted to be a - // directory but does not exist. - err := runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.NotNil) - - c.Assert(isCpDirNotExist(err), checker.True, check.Commentf("expected DirNotExist error, but got %T: %s", err, err)) - - // Try with a directory source. - srcPath = cpPath(tmpDir, "dir1") - - // The client should encounter an error trying to stat the destination and - // then decide to extract to the parent directory instead with a rebased - // name in the source archive, but this directory would overwrite the - // existing file with the same name. - err = runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.NotNil) - - c.Assert(isCannotOverwriteNonDirWithDir(err), checker.True, check.Commentf("expected CannotOverwriteNonDirWithDir error, but got %T: %s", err, err)) -} - -// Check that copying from a local path to a symlink in a container copies to -// the symlink target and does not overwrite the container symlink itself. -func (s *DockerSuite) TestCpToSymlinkDestination(c *check.C) { - // stat /tmp/test-cp-to-symlink-destination-262430901/vol3 gets permission denied for the user - testRequires(c, NotUserNamespace) - testRequires(c, DaemonIsLinux) - testRequires(c, SameHostDaemon) // Requires local volume mount bind. - - testVol := getTestDir(c, "test-cp-to-symlink-destination-") - defer os.RemoveAll(testVol) - - makeTestContentInDir(c, testVol) - - containerID := makeTestContainer(c, testContainerOptions{ - volumes: defaultVolumes(testVol), // Our bind mount is at /vol2 - }) - - // First, copy a local file to a symlink to a file in the container. This - // should overwrite the symlink target contents with the source contents. - srcPath := cpPath(testVol, "file2") - dstPath := containerCpPath(containerID, "/vol2/symlinkToFile1") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - // The symlink should not have been modified. - c.Assert(symlinkTargetEquals(c, cpPath(testVol, "symlinkToFile1"), "file1"), checker.IsNil) - - // The file should have the contents of "file2" now. - c.Assert(fileContentEquals(c, cpPath(testVol, "file1"), "file2\n"), checker.IsNil) - - // Next, copy a local file to a symlink to a directory in the container. - // This should copy the file into the symlink target directory. - dstPath = containerCpPath(containerID, "/vol2/symlinkToDir1") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - // The symlink should not have been modified. - c.Assert(symlinkTargetEquals(c, cpPath(testVol, "symlinkToDir1"), "dir1"), checker.IsNil) - - // The file should have the contents of "file2" now. - c.Assert(fileContentEquals(c, cpPath(testVol, "file2"), "file2\n"), checker.IsNil) - - // Next, copy a file to a symlink to a file that does not exist (a broken - // symlink) in the container. This should create the target file with the - // contents of the source file. - dstPath = containerCpPath(containerID, "/vol2/brokenSymlinkToFileX") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - // The symlink should not have been modified. - c.Assert(symlinkTargetEquals(c, cpPath(testVol, "brokenSymlinkToFileX"), "fileX"), checker.IsNil) - - // The file should have the contents of "file2" now. - c.Assert(fileContentEquals(c, cpPath(testVol, "fileX"), "file2\n"), checker.IsNil) - - // Next, copy a local directory to a symlink to a directory in the - // container. This should copy the directory into the symlink target - // directory and not modify the symlink. - srcPath = cpPath(testVol, "/dir2") - dstPath = containerCpPath(containerID, "/vol2/symlinkToDir1") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - // The symlink should not have been modified. - c.Assert(symlinkTargetEquals(c, cpPath(testVol, "symlinkToDir1"), "dir1"), checker.IsNil) - - // The directory should now contain a copy of "dir2". - c.Assert(fileContentEquals(c, cpPath(testVol, "dir1/dir2/file2-1"), "file2-1\n"), checker.IsNil) - - // Next, copy a local directory to a symlink to a local directory that does - // not exist (a broken symlink) in the container. This should create the - // target as a directory with the contents of the source directory. It - // should not modify the symlink. - dstPath = containerCpPath(containerID, "/vol2/brokenSymlinkToDirX") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - // The symlink should not have been modified. - c.Assert(symlinkTargetEquals(c, cpPath(testVol, "brokenSymlinkToDirX"), "dirX"), checker.IsNil) - - // The "dirX" directory should now be a copy of "dir2". - c.Assert(fileContentEquals(c, cpPath(testVol, "dirX/file2-1"), "file2-1\n"), checker.IsNil) -} - -// Possibilities are reduced to the remaining 10 cases: -// -// case | srcIsDir | onlyDirContents | dstExists | dstIsDir | dstTrSep | action -// =================================================================================================== -// A | no | - | no | - | no | create file -// B | no | - | no | - | yes | error -// C | no | - | yes | no | - | overwrite file -// D | no | - | yes | yes | - | create file in dst dir -// E | yes | no | no | - | - | create dir, copy contents -// F | yes | no | yes | no | - | error -// G | yes | no | yes | yes | - | copy dir and contents -// H | yes | yes | no | - | - | create dir, copy contents -// I | yes | yes | yes | no | - | error -// J | yes | yes | yes | yes | - | copy dir contents -// - -// A. SRC specifies a file and DST (no trailing path separator) doesn't -// exist. This should create a file with the name DST and copy the -// contents of the source file into it. -func (s *DockerSuite) TestCpToCaseA(c *check.C) { - containerID := makeTestContainer(c, testContainerOptions{ - workDir: "/root", command: makeCatFileCommand("itWorks.txt"), - }) - - tmpDir := getTestDir(c, "test-cp-to-case-a") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcPath := cpPath(tmpDir, "file1") - dstPath := containerCpPath(containerID, "/root/itWorks.txt") - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - c.Assert(containerStartOutputEquals(c, containerID, "file1\n"), checker.IsNil) -} - -// B. SRC specifies a file and DST (with trailing path separator) doesn't -// exist. This should cause an error because the copy operation cannot -// create a directory when copying a single file. -func (s *DockerSuite) TestCpToCaseB(c *check.C) { - containerID := makeTestContainer(c, testContainerOptions{ - command: makeCatFileCommand("testDir/file1"), - }) - - tmpDir := getTestDir(c, "test-cp-to-case-b") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcPath := cpPath(tmpDir, "file1") - dstDir := containerCpPathTrailingSep(containerID, "testDir") - - err := runDockerCp(c, srcPath, dstDir) - c.Assert(err, checker.NotNil) - - c.Assert(isCpDirNotExist(err), checker.True, check.Commentf("expected DirNotExists error, but got %T: %s", err, err)) -} - -// C. SRC specifies a file and DST exists as a file. This should overwrite -// the file at DST with the contents of the source file. -func (s *DockerSuite) TestCpToCaseC(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, workDir: "/root", - command: makeCatFileCommand("file2"), - }) - - tmpDir := getTestDir(c, "test-cp-to-case-c") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcPath := cpPath(tmpDir, "file1") - dstPath := containerCpPath(containerID, "/root/file2") - - // Ensure the container's file starts with the original content. - c.Assert(containerStartOutputEquals(c, containerID, "file2\n"), checker.IsNil) - - c.Assert(runDockerCp(c, srcPath, dstPath), checker.IsNil) - - // Should now contain file1's contents. - c.Assert(containerStartOutputEquals(c, containerID, "file1\n"), checker.IsNil) -} - -// D. SRC specifies a file and DST exists as a directory. This should place -// a copy of the source file inside it using the basename from SRC. Ensure -// this works whether DST has a trailing path separator or not. -func (s *DockerSuite) TestCpToCaseD(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, - command: makeCatFileCommand("/dir1/file1"), - }) - - tmpDir := getTestDir(c, "test-cp-to-case-d") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcPath := cpPath(tmpDir, "file1") - dstDir := containerCpPath(containerID, "dir1") - - // Ensure that dstPath doesn't exist. - c.Assert(containerStartOutputEquals(c, containerID, ""), checker.IsNil) - - c.Assert(runDockerCp(c, srcPath, dstDir), checker.IsNil) - - // Should now contain file1's contents. - c.Assert(containerStartOutputEquals(c, containerID, "file1\n"), checker.IsNil) - - // Now try again but using a trailing path separator for dstDir. - - // Make new destination container. - containerID = makeTestContainer(c, testContainerOptions{ - addContent: true, - command: makeCatFileCommand("/dir1/file1"), - }) - - dstDir = containerCpPathTrailingSep(containerID, "dir1") - - // Ensure that dstPath doesn't exist. - c.Assert(containerStartOutputEquals(c, containerID, ""), checker.IsNil) - - c.Assert(runDockerCp(c, srcPath, dstDir), checker.IsNil) - - // Should now contain file1's contents. - c.Assert(containerStartOutputEquals(c, containerID, "file1\n"), checker.IsNil) -} - -// E. SRC specifies a directory and DST does not exist. This should create a -// directory at DST and copy the contents of the SRC directory into the DST -// directory. Ensure this works whether DST has a trailing path separator or -// not. -func (s *DockerSuite) TestCpToCaseE(c *check.C) { - containerID := makeTestContainer(c, testContainerOptions{ - command: makeCatFileCommand("/testDir/file1-1"), - }) - - tmpDir := getTestDir(c, "test-cp-to-case-e") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcDir := cpPath(tmpDir, "dir1") - dstDir := containerCpPath(containerID, "testDir") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - // Should now contain file1-1's contents. - c.Assert(containerStartOutputEquals(c, containerID, "file1-1\n"), checker.IsNil) - - // Now try again but using a trailing path separator for dstDir. - - // Make new destination container. - containerID = makeTestContainer(c, testContainerOptions{ - command: makeCatFileCommand("/testDir/file1-1"), - }) - - dstDir = containerCpPathTrailingSep(containerID, "testDir") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - // Should now contain file1-1's contents. - c.Assert(containerStartOutputEquals(c, containerID, "file1-1\n"), checker.IsNil) -} - -// F. SRC specifies a directory and DST exists as a file. This should cause an -// error as it is not possible to overwrite a file with a directory. -func (s *DockerSuite) TestCpToCaseF(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, workDir: "/root", - }) - - tmpDir := getTestDir(c, "test-cp-to-case-f") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcDir := cpPath(tmpDir, "dir1") - dstFile := containerCpPath(containerID, "/root/file1") - - err := runDockerCp(c, srcDir, dstFile) - c.Assert(err, checker.NotNil) - - c.Assert(isCpCannotCopyDir(err), checker.True, check.Commentf("expected ErrCannotCopyDir error, but got %T: %s", err, err)) -} - -// G. SRC specifies a directory and DST exists as a directory. This should copy -// the SRC directory and all its contents to the DST directory. Ensure this -// works whether DST has a trailing path separator or not. -func (s *DockerSuite) TestCpToCaseG(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, workDir: "/root", - command: makeCatFileCommand("dir2/dir1/file1-1"), - }) - - tmpDir := getTestDir(c, "test-cp-to-case-g") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcDir := cpPath(tmpDir, "dir1") - dstDir := containerCpPath(containerID, "/root/dir2") - - // Ensure that dstPath doesn't exist. - c.Assert(containerStartOutputEquals(c, containerID, ""), checker.IsNil) - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - // Should now contain file1-1's contents. - c.Assert(containerStartOutputEquals(c, containerID, "file1-1\n"), checker.IsNil) - - // Now try again but using a trailing path separator for dstDir. - - // Make new destination container. - containerID = makeTestContainer(c, testContainerOptions{ - addContent: true, - command: makeCatFileCommand("/dir2/dir1/file1-1"), - }) - - dstDir = containerCpPathTrailingSep(containerID, "/dir2") - - // Ensure that dstPath doesn't exist. - c.Assert(containerStartOutputEquals(c, containerID, ""), checker.IsNil) - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - // Should now contain file1-1's contents. - c.Assert(containerStartOutputEquals(c, containerID, "file1-1\n"), checker.IsNil) -} - -// H. SRC specifies a directory's contents only and DST does not exist. This -// should create a directory at DST and copy the contents of the SRC -// directory (but not the directory itself) into the DST directory. Ensure -// this works whether DST has a trailing path separator or not. -func (s *DockerSuite) TestCpToCaseH(c *check.C) { - containerID := makeTestContainer(c, testContainerOptions{ - command: makeCatFileCommand("/testDir/file1-1"), - }) - - tmpDir := getTestDir(c, "test-cp-to-case-h") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcDir := cpPathTrailingSep(tmpDir, "dir1") + "." - dstDir := containerCpPath(containerID, "testDir") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - // Should now contain file1-1's contents. - c.Assert(containerStartOutputEquals(c, containerID, "file1-1\n"), checker.IsNil) - - // Now try again but using a trailing path separator for dstDir. - - // Make new destination container. - containerID = makeTestContainer(c, testContainerOptions{ - command: makeCatFileCommand("/testDir/file1-1"), - }) - - dstDir = containerCpPathTrailingSep(containerID, "testDir") - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - // Should now contain file1-1's contents. - c.Assert(containerStartOutputEquals(c, containerID, "file1-1\n"), checker.IsNil) -} - -// I. SRC specifies a directory's contents only and DST exists as a file. This -// should cause an error as it is not possible to overwrite a file with a -// directory. -func (s *DockerSuite) TestCpToCaseI(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, workDir: "/root", - }) - - tmpDir := getTestDir(c, "test-cp-to-case-i") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcDir := cpPathTrailingSep(tmpDir, "dir1") + "." - dstFile := containerCpPath(containerID, "/root/file1") - - err := runDockerCp(c, srcDir, dstFile) - c.Assert(err, checker.NotNil) - - c.Assert(isCpCannotCopyDir(err), checker.True, check.Commentf("expected ErrCannotCopyDir error, but got %T: %s", err, err)) -} - -// J. SRC specifies a directory's contents only and DST exists as a directory. -// This should copy the contents of the SRC directory (but not the directory -// itself) into the DST directory. Ensure this works whether DST has a -// trailing path separator or not. -func (s *DockerSuite) TestCpToCaseJ(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := makeTestContainer(c, testContainerOptions{ - addContent: true, workDir: "/root", - command: makeCatFileCommand("/dir2/file1-1"), - }) - - tmpDir := getTestDir(c, "test-cp-to-case-j") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcDir := cpPathTrailingSep(tmpDir, "dir1") + "." - dstDir := containerCpPath(containerID, "/dir2") - - // Ensure that dstPath doesn't exist. - c.Assert(containerStartOutputEquals(c, containerID, ""), checker.IsNil) - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - // Should now contain file1-1's contents. - c.Assert(containerStartOutputEquals(c, containerID, "file1-1\n"), checker.IsNil) - - // Now try again but using a trailing path separator for dstDir. - - // Make new destination container. - containerID = makeTestContainer(c, testContainerOptions{ - command: makeCatFileCommand("/dir2/file1-1"), - }) - - dstDir = containerCpPathTrailingSep(containerID, "/dir2") - - // Ensure that dstPath doesn't exist. - c.Assert(containerStartOutputEquals(c, containerID, ""), checker.IsNil) - - c.Assert(runDockerCp(c, srcDir, dstDir), checker.IsNil) - - // Should now contain file1-1's contents. - c.Assert(containerStartOutputEquals(c, containerID, "file1-1\n"), checker.IsNil) -} - -// The `docker cp` command should also ensure that you cannot -// write to a container rootfs that is marked as read-only. -func (s *DockerSuite) TestCpToErrReadOnlyRootfs(c *check.C) { - // --read-only + userns has remount issues - testRequires(c, DaemonIsLinux, NotUserNamespace) - tmpDir := getTestDir(c, "test-cp-to-err-read-only-rootfs") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - containerID := makeTestContainer(c, testContainerOptions{ - readOnly: true, workDir: "/root", - command: makeCatFileCommand("shouldNotExist"), - }) - - srcPath := cpPath(tmpDir, "file1") - dstPath := containerCpPath(containerID, "/root/shouldNotExist") - - err := runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.NotNil) - - c.Assert(isCpCannotCopyReadOnly(err), checker.True, check.Commentf("expected ErrContainerRootfsReadonly error, but got %T: %s", err, err)) - - // Ensure that dstPath doesn't exist. - c.Assert(containerStartOutputEquals(c, containerID, ""), checker.IsNil) -} - -// The `docker cp` command should also ensure that you -// cannot write to a volume that is mounted as read-only. -func (s *DockerSuite) TestCpToErrReadOnlyVolume(c *check.C) { - // --read-only + userns has remount issues - testRequires(c, DaemonIsLinux, NotUserNamespace) - tmpDir := getTestDir(c, "test-cp-to-err-read-only-volume") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - containerID := makeTestContainer(c, testContainerOptions{ - volumes: defaultVolumes(tmpDir), workDir: "/root", - command: makeCatFileCommand("/vol_ro/shouldNotExist"), - }) - - srcPath := cpPath(tmpDir, "file1") - dstPath := containerCpPath(containerID, "/vol_ro/shouldNotExist") - - err := runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.NotNil) - - c.Assert(isCpCannotCopyReadOnly(err), checker.True, check.Commentf("expected ErrVolumeReadonly error, but got %T: %s", err, err)) - - // Ensure that dstPath doesn't exist. - c.Assert(containerStartOutputEquals(c, containerID, ""), checker.IsNil) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_unix_test.go deleted file mode 100644 index 45d85ba5d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_unix_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// +build !windows - -package main - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/system" - "github.com/go-check/check" -) - -// Check ownership is root, both in non-userns and userns enabled modes -func (s *DockerSuite) TestCpCheckDestOwnership(c *check.C) { - testRequires(c, DaemonIsLinux, SameHostDaemon) - tmpVolDir := getTestDir(c, "test-cp-tmpvol") - containerID := makeTestContainer(c, - testContainerOptions{volumes: []string{fmt.Sprintf("%s:/tmpvol", tmpVolDir)}}) - - tmpDir := getTestDir(c, "test-cp-to-check-ownership") - defer os.RemoveAll(tmpDir) - - makeTestContentInDir(c, tmpDir) - - srcPath := cpPath(tmpDir, "file1") - dstPath := containerCpPath(containerID, "/tmpvol", "file1") - - err := runDockerCp(c, srcPath, dstPath) - c.Assert(err, checker.IsNil) - - stat, err := system.Stat(filepath.Join(tmpVolDir, "file1")) - c.Assert(err, checker.IsNil) - uid, gid, err := getRootUIDGID() - c.Assert(err, checker.IsNil) - c.Assert(stat.UID(), checker.Equals, uint32(uid), check.Commentf("Copied file not owned by container root UID")) - c.Assert(stat.GID(), checker.Equals, uint32(gid), check.Commentf("Copied file not owned by container root GID")) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_utils.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_utils.go deleted file mode 100644 index 0501c5d73..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_utils.go +++ /dev/null @@ -1,303 +0,0 @@ -package main - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -type fileType uint32 - -const ( - ftRegular fileType = iota - ftDir - ftSymlink -) - -type fileData struct { - filetype fileType - path string - contents string -} - -func (fd fileData) creationCommand() string { - var command string - - switch fd.filetype { - case ftRegular: - // Don't overwrite the file if it already exists! - command = fmt.Sprintf("if [ ! -f %s ]; then echo %q > %s; fi", fd.path, fd.contents, fd.path) - case ftDir: - command = fmt.Sprintf("mkdir -p %s", fd.path) - case ftSymlink: - command = fmt.Sprintf("ln -fs %s %s", fd.contents, fd.path) - } - - return command -} - -func mkFilesCommand(fds []fileData) string { - commands := make([]string, len(fds)) - - for i, fd := range fds { - commands[i] = fd.creationCommand() - } - - return strings.Join(commands, " && ") -} - -var defaultFileData = []fileData{ - {ftRegular, "file1", "file1"}, - {ftRegular, "file2", "file2"}, - {ftRegular, "file3", "file3"}, - {ftRegular, "file4", "file4"}, - {ftRegular, "file5", "file5"}, - {ftRegular, "file6", "file6"}, - {ftRegular, "file7", "file7"}, - {ftDir, "dir1", ""}, - {ftRegular, "dir1/file1-1", "file1-1"}, - {ftRegular, "dir1/file1-2", "file1-2"}, - {ftDir, "dir2", ""}, - {ftRegular, "dir2/file2-1", "file2-1"}, - {ftRegular, "dir2/file2-2", "file2-2"}, - {ftDir, "dir3", ""}, - {ftRegular, "dir3/file3-1", "file3-1"}, - {ftRegular, "dir3/file3-2", "file3-2"}, - {ftDir, "dir4", ""}, - {ftRegular, "dir4/file3-1", "file4-1"}, - {ftRegular, "dir4/file3-2", "file4-2"}, - {ftDir, "dir5", ""}, - {ftSymlink, "symlinkToFile1", "file1"}, - {ftSymlink, "symlinkToDir1", "dir1"}, - {ftSymlink, "brokenSymlinkToFileX", "fileX"}, - {ftSymlink, "brokenSymlinkToDirX", "dirX"}, - {ftSymlink, "symlinkToAbsDir", "/root"}, -} - -func defaultMkContentCommand() string { - return mkFilesCommand(defaultFileData) -} - -func makeTestContentInDir(c *check.C, dir string) { - for _, fd := range defaultFileData { - path := filepath.Join(dir, filepath.FromSlash(fd.path)) - switch fd.filetype { - case ftRegular: - c.Assert(ioutil.WriteFile(path, []byte(fd.contents+"\n"), os.FileMode(0666)), checker.IsNil) - case ftDir: - c.Assert(os.Mkdir(path, os.FileMode(0777)), checker.IsNil) - case ftSymlink: - c.Assert(os.Symlink(fd.contents, path), checker.IsNil) - } - } -} - -type testContainerOptions struct { - addContent bool - readOnly bool - volumes []string - workDir string - command string -} - -func makeTestContainer(c *check.C, options testContainerOptions) (containerID string) { - if options.addContent { - mkContentCmd := defaultMkContentCommand() - if options.command == "" { - options.command = mkContentCmd - } else { - options.command = fmt.Sprintf("%s && %s", defaultMkContentCommand(), options.command) - } - } - - if options.command == "" { - options.command = "#(nop)" - } - - args := []string{"run", "-d"} - - for _, volume := range options.volumes { - args = append(args, "-v", volume) - } - - if options.workDir != "" { - args = append(args, "-w", options.workDir) - } - - if options.readOnly { - args = append(args, "--read-only") - } - - args = append(args, "busybox", "/bin/sh", "-c", options.command) - - out, _ := dockerCmd(c, args...) - - containerID = strings.TrimSpace(out) - - out, _ = dockerCmd(c, "wait", containerID) - - exitCode := strings.TrimSpace(out) - if exitCode != "0" { - out, _ = dockerCmd(c, "logs", containerID) - } - c.Assert(exitCode, checker.Equals, "0", check.Commentf("failed to make test container: %s", out)) - - return -} - -func makeCatFileCommand(path string) string { - return fmt.Sprintf("if [ -f %s ]; then cat %s; fi", path, path) -} - -func cpPath(pathElements ...string) string { - localizedPathElements := make([]string, len(pathElements)) - for i, path := range pathElements { - localizedPathElements[i] = filepath.FromSlash(path) - } - return strings.Join(localizedPathElements, string(filepath.Separator)) -} - -func cpPathTrailingSep(pathElements ...string) string { - return fmt.Sprintf("%s%c", cpPath(pathElements...), filepath.Separator) -} - -func containerCpPath(containerID string, pathElements ...string) string { - joined := strings.Join(pathElements, "/") - return fmt.Sprintf("%s:%s", containerID, joined) -} - -func containerCpPathTrailingSep(containerID string, pathElements ...string) string { - return fmt.Sprintf("%s/", containerCpPath(containerID, pathElements...)) -} - -func runDockerCp(c *check.C, src, dst string) (err error) { - c.Logf("running `docker cp %s %s`", src, dst) - - args := []string{"cp", src, dst} - - out, _, err := runCommandWithOutput(exec.Command(dockerBinary, args...)) - if err != nil { - err = fmt.Errorf("error executing `docker cp` command: %s: %s", err, out) - } - - return -} - -func startContainerGetOutput(c *check.C, containerID string) (out string, err error) { - c.Logf("running `docker start -a %s`", containerID) - - args := []string{"start", "-a", containerID} - - out, _, err = runCommandWithOutput(exec.Command(dockerBinary, args...)) - if err != nil { - err = fmt.Errorf("error executing `docker start` command: %s: %s", err, out) - } - - return -} - -func getTestDir(c *check.C, label string) (tmpDir string) { - var err error - - tmpDir, err = ioutil.TempDir("", label) - // unable to make temporary directory - c.Assert(err, checker.IsNil) - - return -} - -func isCpNotExist(err error) bool { - return strings.Contains(err.Error(), "no such file or directory") || strings.Contains(err.Error(), "cannot find the file specified") -} - -func isCpDirNotExist(err error) bool { - return strings.Contains(err.Error(), archive.ErrDirNotExists.Error()) -} - -func isCpNotDir(err error) bool { - return strings.Contains(err.Error(), archive.ErrNotDirectory.Error()) || strings.Contains(err.Error(), "filename, directory name, or volume label syntax is incorrect") -} - -func isCpCannotCopyDir(err error) bool { - return strings.Contains(err.Error(), archive.ErrCannotCopyDir.Error()) -} - -func isCpCannotCopyReadOnly(err error) bool { - return strings.Contains(err.Error(), "marked read-only") -} - -func isCannotOverwriteNonDirWithDir(err error) bool { - return strings.Contains(err.Error(), "cannot overwrite non-directory") -} - -func fileContentEquals(c *check.C, filename, contents string) (err error) { - c.Logf("checking that file %q contains %q\n", filename, contents) - - fileBytes, err := ioutil.ReadFile(filename) - if err != nil { - return - } - - expectedBytes, err := ioutil.ReadAll(strings.NewReader(contents)) - if err != nil { - return - } - - if !bytes.Equal(fileBytes, expectedBytes) { - err = fmt.Errorf("file content not equal - expected %q, got %q", string(expectedBytes), string(fileBytes)) - } - - return -} - -func symlinkTargetEquals(c *check.C, symlink, expectedTarget string) (err error) { - c.Logf("checking that the symlink %q points to %q\n", symlink, expectedTarget) - - actualTarget, err := os.Readlink(symlink) - if err != nil { - return - } - - if actualTarget != expectedTarget { - err = fmt.Errorf("symlink target points to %q not %q", actualTarget, expectedTarget) - } - - return -} - -func containerStartOutputEquals(c *check.C, containerID, contents string) (err error) { - c.Logf("checking that container %q start output contains %q\n", containerID, contents) - - out, err := startContainerGetOutput(c, containerID) - if err != nil { - return - } - - if out != contents { - err = fmt.Errorf("output contents not equal - expected %q, got %q", contents, out) - } - - return -} - -func defaultVolumes(tmpDir string) []string { - if SameHostDaemon.Condition() { - return []string{ - "/vol1", - fmt.Sprintf("%s:/vol2", tmpDir), - fmt.Sprintf("%s:/vol3", filepath.Join(tmpDir, "vol3")), - fmt.Sprintf("%s:/vol_ro:ro", filepath.Join(tmpDir, "vol_ro")), - } - } - - // Can't bind-mount volumes with separate host daemon. - return []string{"/vol1", "/vol2", "/vol3", "/vol_ro:/vol_ro:ro"} -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_create_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_create_test.go deleted file mode 100644 index 515a34097..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_create_test.go +++ /dev/null @@ -1,513 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "os" - "reflect" - "strings" - "time" - - "os/exec" - - "io/ioutil" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/go-connections/nat" - "github.com/go-check/check" -) - -// Make sure we can create a simple container with some args -func (s *DockerSuite) TestCreateArgs(c *check.C) { - // Intentionally clear entrypoint, as the Windows busybox image needs an entrypoint, which breaks this test - out, _ := dockerCmd(c, "create", "--entrypoint=", "busybox", "command", "arg1", "arg2", "arg with space", "-c", "flags") - - cleanedContainerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "inspect", cleanedContainerID) - - containers := []struct { - ID string - Created time.Time - Path string - Args []string - Image string - }{} - - err := json.Unmarshal([]byte(out), &containers) - c.Assert(err, check.IsNil, check.Commentf("Error inspecting the container: %s", err)) - c.Assert(containers, checker.HasLen, 1) - - cont := containers[0] - c.Assert(string(cont.Path), checker.Equals, "command", check.Commentf("Unexpected container path. Expected command, received: %s", cont.Path)) - - b := false - expected := []string{"arg1", "arg2", "arg with space", "-c", "flags"} - for i, arg := range expected { - if arg != cont.Args[i] { - b = true - break - } - } - if len(cont.Args) != len(expected) || b { - c.Fatalf("Unexpected args. Expected %v, received: %v", expected, cont.Args) - } - -} - -// Make sure we can grow the container's rootfs at creation time. -func (s *DockerSuite) TestCreateGrowRootfs(c *check.C) { - // Windows and Devicemapper support growing the rootfs - if daemonPlatform != "windows" { - testRequires(c, Devicemapper) - } - out, _ := dockerCmd(c, "create", "--storage-opt", "size=120G", "busybox") - - cleanedContainerID := strings.TrimSpace(out) - - inspectOut := inspectField(c, cleanedContainerID, "HostConfig.StorageOpt") - c.Assert(inspectOut, checker.Equals, "map[size:120G]") -} - -// Make sure we cannot shrink the container's rootfs at creation time. -func (s *DockerSuite) TestCreateShrinkRootfs(c *check.C) { - testRequires(c, Devicemapper) - - // Ensure this fails because of the defaultBaseFsSize is 10G - out, _, err := dockerCmdWithError("create", "--storage-opt", "size=5G", "busybox") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Container size cannot be smaller than") -} - -// Make sure we can set hostconfig options too -func (s *DockerSuite) TestCreateHostConfig(c *check.C) { - out, _ := dockerCmd(c, "create", "-P", "busybox", "echo") - - cleanedContainerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "inspect", cleanedContainerID) - - containers := []struct { - HostConfig *struct { - PublishAllPorts bool - } - }{} - - err := json.Unmarshal([]byte(out), &containers) - c.Assert(err, check.IsNil, check.Commentf("Error inspecting the container: %s", err)) - c.Assert(containers, checker.HasLen, 1) - - cont := containers[0] - c.Assert(cont.HostConfig, check.NotNil, check.Commentf("Expected HostConfig, got none")) - c.Assert(cont.HostConfig.PublishAllPorts, check.NotNil, check.Commentf("Expected PublishAllPorts, got false")) -} - -func (s *DockerSuite) TestCreateWithPortRange(c *check.C) { - out, _ := dockerCmd(c, "create", "-p", "3300-3303:3300-3303/tcp", "busybox", "echo") - - cleanedContainerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "inspect", cleanedContainerID) - - containers := []struct { - HostConfig *struct { - PortBindings map[nat.Port][]nat.PortBinding - } - }{} - err := json.Unmarshal([]byte(out), &containers) - c.Assert(err, check.IsNil, check.Commentf("Error inspecting the container: %s", err)) - c.Assert(containers, checker.HasLen, 1) - - cont := containers[0] - - c.Assert(cont.HostConfig, check.NotNil, check.Commentf("Expected HostConfig, got none")) - c.Assert(cont.HostConfig.PortBindings, checker.HasLen, 4, check.Commentf("Expected 4 ports bindings, got %d", len(cont.HostConfig.PortBindings))) - - for k, v := range cont.HostConfig.PortBindings { - c.Assert(v, checker.HasLen, 1, check.Commentf("Expected 1 ports binding, for the port %s but found %s", k, v)) - c.Assert(k.Port(), checker.Equals, v[0].HostPort, check.Commentf("Expected host port %s to match published port %s", k.Port(), v[0].HostPort)) - - } - -} - -func (s *DockerSuite) TestCreateWithLargePortRange(c *check.C) { - out, _ := dockerCmd(c, "create", "-p", "1-65535:1-65535/tcp", "busybox", "echo") - - cleanedContainerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "inspect", cleanedContainerID) - - containers := []struct { - HostConfig *struct { - PortBindings map[nat.Port][]nat.PortBinding - } - }{} - - err := json.Unmarshal([]byte(out), &containers) - c.Assert(err, check.IsNil, check.Commentf("Error inspecting the container: %s", err)) - c.Assert(containers, checker.HasLen, 1) - - cont := containers[0] - c.Assert(cont.HostConfig, check.NotNil, check.Commentf("Expected HostConfig, got none")) - c.Assert(cont.HostConfig.PortBindings, checker.HasLen, 65535) - - for k, v := range cont.HostConfig.PortBindings { - c.Assert(v, checker.HasLen, 1) - c.Assert(k.Port(), checker.Equals, v[0].HostPort, check.Commentf("Expected host port %s to match published port %s", k.Port(), v[0].HostPort)) - } - -} - -// "test123" should be printed by docker create + start -func (s *DockerSuite) TestCreateEchoStdout(c *check.C) { - out, _ := dockerCmd(c, "create", "busybox", "echo", "test123") - - cleanedContainerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "start", "-ai", cleanedContainerID) - c.Assert(out, checker.Equals, "test123\n", check.Commentf("container should've printed 'test123', got %q", out)) - -} - -func (s *DockerSuite) TestCreateVolumesCreated(c *check.C) { - testRequires(c, SameHostDaemon) - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - - name := "test_create_volume" - dockerCmd(c, "create", "--name", name, "-v", prefix+slash+"foo", "busybox") - - dir, err := inspectMountSourceField(name, prefix+slash+"foo") - c.Assert(err, check.IsNil, check.Commentf("Error getting volume host path: %q", err)) - - if _, err := os.Stat(dir); err != nil && os.IsNotExist(err) { - c.Fatalf("Volume was not created") - } - if err != nil { - c.Fatalf("Error statting volume host path: %q", err) - } - -} - -func (s *DockerSuite) TestCreateLabels(c *check.C) { - name := "test_create_labels" - expected := map[string]string{"k1": "v1", "k2": "v2"} - dockerCmd(c, "create", "--name", name, "-l", "k1=v1", "--label", "k2=v2", "busybox") - - actual := make(map[string]string) - inspectFieldAndMarshall(c, name, "Config.Labels", &actual) - - if !reflect.DeepEqual(expected, actual) { - c.Fatalf("Expected %s got %s", expected, actual) - } -} - -func (s *DockerSuite) TestCreateLabelFromImage(c *check.C) { - imageName := "testcreatebuildlabel" - _, err := buildImage(imageName, - `FROM busybox - LABEL k1=v1 k2=v2`, - true) - - c.Assert(err, check.IsNil) - - name := "test_create_labels_from_image" - expected := map[string]string{"k2": "x", "k3": "v3", "k1": "v1"} - dockerCmd(c, "create", "--name", name, "-l", "k2=x", "--label", "k3=v3", imageName) - - actual := make(map[string]string) - inspectFieldAndMarshall(c, name, "Config.Labels", &actual) - - if !reflect.DeepEqual(expected, actual) { - c.Fatalf("Expected %s got %s", expected, actual) - } -} - -func (s *DockerSuite) TestCreateHostnameWithNumber(c *check.C) { - image := "busybox" - // Busybox on Windows does not implement hostname command - if daemonPlatform == "windows" { - image = WindowsBaseImage - } - out, _ := dockerCmd(c, "run", "-h", "web.0", image, "hostname") - c.Assert(strings.TrimSpace(out), checker.Equals, "web.0", check.Commentf("hostname not set, expected `web.0`, got: %s", out)) - -} - -func (s *DockerSuite) TestCreateRM(c *check.C) { - // Test to make sure we can 'rm' a new container that is in - // "Created" state, and has ever been run. Test "rm -f" too. - - // create a container - out, _ := dockerCmd(c, "create", "busybox") - cID := strings.TrimSpace(out) - - dockerCmd(c, "rm", cID) - - // Now do it again so we can "rm -f" this time - out, _ = dockerCmd(c, "create", "busybox") - - cID = strings.TrimSpace(out) - dockerCmd(c, "rm", "-f", cID) -} - -func (s *DockerSuite) TestCreateModeIpcContainer(c *check.C) { - // Uses Linux specific functionality (--ipc) - testRequires(c, DaemonIsLinux, SameHostDaemon) - - out, _ := dockerCmd(c, "create", "busybox") - id := strings.TrimSpace(out) - - dockerCmd(c, "create", fmt.Sprintf("--ipc=container:%s", id), "busybox") -} - -func (s *DockerSuite) TestCreateByImageID(c *check.C) { - imageName := "testcreatebyimageid" - imageID, err := buildImage(imageName, - `FROM busybox - MAINTAINER dockerio`, - true) - if err != nil { - c.Fatal(err) - } - truncatedImageID := stringid.TruncateID(imageID) - - dockerCmd(c, "create", imageID) - dockerCmd(c, "create", truncatedImageID) - dockerCmd(c, "create", fmt.Sprintf("%s:%s", imageName, truncatedImageID)) - - // Ensure this fails - out, exit, _ := dockerCmdWithError("create", fmt.Sprintf("%s:%s", imageName, imageID)) - if exit == 0 { - c.Fatalf("expected non-zero exit code; received %d", exit) - } - - if expected := "Error parsing reference"; !strings.Contains(out, expected) { - c.Fatalf(`Expected %q in output; got: %s`, expected, out) - } - - out, exit, _ = dockerCmdWithError("create", fmt.Sprintf("%s:%s", "wrongimage", truncatedImageID)) - if exit == 0 { - c.Fatalf("expected non-zero exit code; received %d", exit) - } - - if expected := "Unable to find image"; !strings.Contains(out, expected) { - c.Fatalf(`Expected %q in output; got: %s`, expected, out) - } -} - -func (s *DockerTrustSuite) TestTrustedCreate(c *check.C) { - repoName := s.setupTrustedImage(c, "trusted-create") - - // Try create - createCmd := exec.Command(dockerBinary, "create", repoName) - s.trustedCmd(createCmd) - out, _, err := runCommandWithOutput(createCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf("Missing expected output on trusted push:\n%s", out)) - - dockerCmd(c, "rmi", repoName) - - // Try untrusted create to ensure we pushed the tag to the registry - createCmd = exec.Command(dockerBinary, "create", "--disable-content-trust=true", repoName) - s.trustedCmd(createCmd) - out, _, err = runCommandWithOutput(createCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Status: Downloaded", check.Commentf("Missing expected output on trusted create with --disable-content-trust:\n%s", out)) - -} - -func (s *DockerTrustSuite) TestUntrustedCreate(c *check.C) { - repoName := fmt.Sprintf("%v/dockercliuntrusted/createtest", privateRegistryURL) - withTagName := fmt.Sprintf("%s:latest", repoName) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", withTagName) - dockerCmd(c, "push", withTagName) - dockerCmd(c, "rmi", withTagName) - - // Try trusted create on untrusted tag - createCmd := exec.Command(dockerBinary, "create", withTagName) - s.trustedCmd(createCmd) - out, _, err := runCommandWithOutput(createCmd) - c.Assert(err, check.Not(check.IsNil)) - c.Assert(string(out), checker.Contains, fmt.Sprintf("does not have trust data for %s", repoName), check.Commentf("Missing expected output on trusted create:\n%s", out)) - -} - -func (s *DockerTrustSuite) TestTrustedIsolatedCreate(c *check.C) { - repoName := s.setupTrustedImage(c, "trusted-isolated-create") - - // Try create - createCmd := exec.Command(dockerBinary, "--config", "/tmp/docker-isolated-create", "create", repoName) - s.trustedCmd(createCmd) - out, _, err := runCommandWithOutput(createCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf("Missing expected output on trusted push:\n%s", out)) - - dockerCmd(c, "rmi", repoName) -} - -func (s *DockerTrustSuite) TestCreateWhenCertExpired(c *check.C) { - c.Skip("Currently changes system time, causing instability") - repoName := s.setupTrustedImage(c, "trusted-create-expired") - - // Certificates have 10 years of expiration - elevenYearsFromNow := time.Now().Add(time.Hour * 24 * 365 * 11) - - runAtDifferentDate(elevenYearsFromNow, func() { - // Try create - createCmd := exec.Command(dockerBinary, "create", repoName) - s.trustedCmd(createCmd) - out, _, err := runCommandWithOutput(createCmd) - c.Assert(err, check.Not(check.IsNil)) - c.Assert(string(out), checker.Contains, "could not validate the path to a trusted root", check.Commentf("Missing expected output on trusted create in the distant future:\n%s", out)) - }) - - runAtDifferentDate(elevenYearsFromNow, func() { - // Try create - createCmd := exec.Command(dockerBinary, "create", "--disable-content-trust", repoName) - s.trustedCmd(createCmd) - out, _, err := runCommandWithOutput(createCmd) - c.Assert(err, check.Not(check.IsNil)) - c.Assert(string(out), checker.Contains, "Status: Downloaded", check.Commentf("Missing expected output on trusted create in the distant future:\n%s", out)) - - }) -} - -func (s *DockerTrustSuite) TestTrustedCreateFromBadTrustServer(c *check.C) { - repoName := fmt.Sprintf("%v/dockerclievilcreate/trusted:latest", privateRegistryURL) - evilLocalConfigDir, err := ioutil.TempDir("", "evilcreate-local-config-dir") - c.Assert(err, check.IsNil) - - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push:\n%s", out)) - - dockerCmd(c, "rmi", repoName) - - // Try create - createCmd := exec.Command(dockerBinary, "create", repoName) - s.trustedCmd(createCmd) - out, _, err = runCommandWithOutput(createCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf("Missing expected output on trusted push:\n%s", out)) - - dockerCmd(c, "rmi", repoName) - - // Kill the notary server, start a new "evil" one. - s.not.Close() - s.not, err = newTestNotary(c) - c.Assert(err, check.IsNil) - - // In order to make an evil server, lets re-init a client (with a different trust dir) and push new data. - // tag an image and upload it to the private registry - dockerCmd(c, "--config", evilLocalConfigDir, "tag", "busybox", repoName) - - // Push up to the new server - pushCmd = exec.Command(dockerBinary, "--config", evilLocalConfigDir, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push:\n%s", out)) - - // Now, try creating with the original client from this new trust server. This should fail because the new root is invalid. - createCmd = exec.Command(dockerBinary, "create", repoName) - s.trustedCmd(createCmd) - out, _, err = runCommandWithOutput(createCmd) - if err == nil { - c.Fatalf("Continuing with cached data even though it's an invalid root rotation: %s\n%s", err, out) - } - if !strings.Contains(out, "could not rotate trust to a new trusted root") { - c.Fatalf("Missing expected output on trusted create:\n%s", out) - } - -} - -func (s *DockerSuite) TestCreateStopSignal(c *check.C) { - name := "test_create_stop_signal" - dockerCmd(c, "create", "--name", name, "--stop-signal", "9", "busybox") - - res := inspectFieldJSON(c, name, "Config.StopSignal") - c.Assert(res, checker.Contains, "9") - -} - -func (s *DockerSuite) TestCreateWithWorkdir(c *check.C) { - name := "foo" - - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - dir := prefix + slash + "home" + slash + "foo" + slash + "bar" - - dockerCmd(c, "create", "--name", name, "-w", dir, "busybox") - // Windows does not create the workdir until the container is started - if daemonPlatform == "windows" { - dockerCmd(c, "start", name) - } - dockerCmd(c, "cp", fmt.Sprintf("%s:%s", name, dir), prefix+slash+"tmp") -} - -func (s *DockerSuite) TestCreateWithInvalidLogOpts(c *check.C) { - name := "test-invalidate-log-opts" - out, _, err := dockerCmdWithError("create", "--name", name, "--log-opt", "invalid=true", "busybox") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "unknown log opt") - - out, _ = dockerCmd(c, "ps", "-a") - c.Assert(out, checker.Not(checker.Contains), name) -} - -// #20972 -func (s *DockerSuite) TestCreate64ByteHexID(c *check.C) { - out := inspectField(c, "busybox", "Id") - imageID := strings.TrimPrefix(strings.TrimSpace(string(out)), "sha256:") - - dockerCmd(c, "create", imageID) -} - -// Test case for #23498 -func (s *DockerSuite) TestCreateUnsetEntrypoint(c *check.C) { - name := "test-entrypoint" - dockerfile := `FROM busybox -ADD entrypoint.sh /entrypoint.sh -RUN chmod 755 /entrypoint.sh -ENTRYPOINT ["/entrypoint.sh"] -CMD echo foobar` - - ctx, err := fakeContext(dockerfile, map[string]string{ - "entrypoint.sh": `#!/bin/sh -echo "I am an entrypoint" -exec "$@"`, - }) - c.Assert(err, check.IsNil) - defer ctx.Close() - - _, err = buildImageFromContext(name, ctx, true) - c.Assert(err, check.IsNil) - - out, _ := dockerCmd(c, "create", "--entrypoint=", name, "echo", "foo") - id := strings.TrimSpace(out) - c.Assert(id, check.Not(check.Equals), "") - out, _ = dockerCmd(c, "start", "-a", id) - c.Assert(strings.TrimSpace(out), check.Equals, "foo") -} - -// #22471 -func (s *DockerSuite) TestCreateStopTimeout(c *check.C) { - name1 := "test_create_stop_timeout_1" - dockerCmd(c, "create", "--name", name1, "--stop-timeout", "15", "busybox") - - res := inspectFieldJSON(c, name1, "Config.StopTimeout") - c.Assert(res, checker.Contains, "15") - - name2 := "test_create_stop_timeout_2" - dockerCmd(c, "create", "--name", name2, "busybox") - - res = inspectFieldJSON(c, name2, "Config.StopTimeout") - c.Assert(res, checker.Contains, "null") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_plugins_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_plugins_test.go deleted file mode 100644 index f91edc655..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_plugins_test.go +++ /dev/null @@ -1,317 +0,0 @@ -// +build linux - -package main - -import ( - "os" - "os/exec" - "path/filepath" - "strings" - "syscall" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/mount" - "github.com/go-check/check" -) - -// TestDaemonRestartWithPluginEnabled tests state restore for an enabled plugin -func (s *DockerDaemonSuite) TestDaemonRestartWithPluginEnabled(c *check.C) { - testRequires(c, IsAmd64, Network) - - if err := s.d.Start(); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - - if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { - c.Fatalf("Could not install plugin: %v %s", err, out) - } - - defer func() { - if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { - c.Fatalf("Could not disable plugin: %v %s", err, out) - } - if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { - c.Fatalf("Could not remove plugin: %v %s", err, out) - } - }() - - if err := s.d.Restart(); err != nil { - c.Fatalf("Could not restart daemon: %v", err) - } - - out, err := s.d.Cmd("plugin", "ls") - if err != nil { - c.Fatalf("Could not list plugins: %v %s", err, out) - } - c.Assert(out, checker.Contains, pName) - c.Assert(out, checker.Contains, "true") -} - -// TestDaemonRestartWithPluginDisabled tests state restore for a disabled plugin -func (s *DockerDaemonSuite) TestDaemonRestartWithPluginDisabled(c *check.C) { - testRequires(c, IsAmd64, Network) - - if err := s.d.Start(); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - - if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName, "--disable"); err != nil { - c.Fatalf("Could not install plugin: %v %s", err, out) - } - - defer func() { - if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { - c.Fatalf("Could not remove plugin: %v %s", err, out) - } - }() - - if err := s.d.Restart(); err != nil { - c.Fatalf("Could not restart daemon: %v", err) - } - - out, err := s.d.Cmd("plugin", "ls") - if err != nil { - c.Fatalf("Could not list plugins: %v %s", err, out) - } - c.Assert(out, checker.Contains, pName) - c.Assert(out, checker.Contains, "false") -} - -// TestDaemonKillLiveRestoreWithPlugins SIGKILLs daemon started with --live-restore. -// Plugins should continue to run. -func (s *DockerDaemonSuite) TestDaemonKillLiveRestoreWithPlugins(c *check.C) { - testRequires(c, IsAmd64, Network) - - if err := s.d.Start("--live-restore"); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { - c.Fatalf("Could not install plugin: %v %s", err, out) - } - defer func() { - if err := s.d.Restart("--live-restore"); err != nil { - c.Fatalf("Could not restart daemon: %v", err) - } - if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { - c.Fatalf("Could not disable plugin: %v %s", err, out) - } - if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { - c.Fatalf("Could not remove plugin: %v %s", err, out) - } - }() - - if err := s.d.Kill(); err != nil { - c.Fatalf("Could not kill daemon: %v", err) - } - - cmd := exec.Command("pgrep", "-f", pluginProcessName) - if out, ec, err := runCommandWithOutput(cmd); ec != 0 { - c.Fatalf("Expected exit code '0', got %d err: %v output: %s ", ec, err, out) - } -} - -// TestDaemonShutdownLiveRestoreWithPlugins SIGTERMs daemon started with --live-restore. -// Plugins should continue to run. -func (s *DockerDaemonSuite) TestDaemonShutdownLiveRestoreWithPlugins(c *check.C) { - testRequires(c, IsAmd64, Network) - - if err := s.d.Start("--live-restore"); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { - c.Fatalf("Could not install plugin: %v %s", err, out) - } - defer func() { - if err := s.d.Restart("--live-restore"); err != nil { - c.Fatalf("Could not restart daemon: %v", err) - } - if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { - c.Fatalf("Could not disable plugin: %v %s", err, out) - } - if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { - c.Fatalf("Could not remove plugin: %v %s", err, out) - } - }() - - if err := s.d.cmd.Process.Signal(os.Interrupt); err != nil { - c.Fatalf("Could not kill daemon: %v", err) - } - - cmd := exec.Command("pgrep", "-f", pluginProcessName) - if out, ec, err := runCommandWithOutput(cmd); ec != 0 { - c.Fatalf("Expected exit code '0', got %d err: %v output: %s ", ec, err, out) - } -} - -// TestDaemonShutdownWithPlugins shuts down running plugins. -func (s *DockerDaemonSuite) TestDaemonShutdownWithPlugins(c *check.C) { - testRequires(c, IsAmd64, Network, SameHostDaemon) - - if err := s.d.Start(); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - if out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName); err != nil { - c.Fatalf("Could not install plugin: %v %s", err, out) - } - - defer func() { - if err := s.d.Restart(); err != nil { - c.Fatalf("Could not restart daemon: %v", err) - } - if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { - c.Fatalf("Could not disable plugin: %v %s", err, out) - } - if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { - c.Fatalf("Could not remove plugin: %v %s", err, out) - } - }() - - if err := s.d.cmd.Process.Signal(os.Interrupt); err != nil { - c.Fatalf("Could not kill daemon: %v", err) - } - - for { - if err := syscall.Kill(s.d.cmd.Process.Pid, 0); err == syscall.ESRCH { - break - } - } - - cmd := exec.Command("pgrep", "-f", pluginProcessName) - if out, ec, err := runCommandWithOutput(cmd); ec != 1 { - c.Fatalf("Expected exit code '1', got %d err: %v output: %s ", ec, err, out) - } - - s.d.Start("--live-restore") - cmd = exec.Command("pgrep", "-f", pluginProcessName) - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil, check.Commentf(out)) -} - -// TestVolumePlugin tests volume creation using a plugin. -func (s *DockerDaemonSuite) TestVolumePlugin(c *check.C) { - testRequires(c, IsAmd64, Network) - - volName := "plugin-volume" - destDir := "/tmp/data/" - destFile := "foo" - - if err := s.d.Start(); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - out, err := s.d.Cmd("plugin", "install", pName, "--grant-all-permissions") - if err != nil { - c.Fatalf("Could not install plugin: %v %s", err, out) - } - pluginID, err := s.d.Cmd("plugin", "inspect", "-f", "{{.Id}}", pName) - pluginID = strings.TrimSpace(pluginID) - if err != nil { - c.Fatalf("Could not retrieve plugin ID: %v %s", err, pluginID) - } - mountpointPrefix := filepath.Join(s.d.RootDir(), "plugins", pluginID, "rootfs") - defer func() { - if out, err := s.d.Cmd("plugin", "disable", pName); err != nil { - c.Fatalf("Could not disable plugin: %v %s", err, out) - } - - if out, err := s.d.Cmd("plugin", "remove", pName); err != nil { - c.Fatalf("Could not remove plugin: %v %s", err, out) - } - - exists, err := existsMountpointWithPrefix(mountpointPrefix) - c.Assert(err, checker.IsNil) - c.Assert(exists, checker.Equals, false) - - }() - - out, err = s.d.Cmd("volume", "create", "-d", pName, volName) - if err != nil { - c.Fatalf("Could not create volume: %v %s", err, out) - } - defer func() { - if out, err := s.d.Cmd("volume", "remove", volName); err != nil { - c.Fatalf("Could not remove volume: %v %s", err, out) - } - }() - - out, err = s.d.Cmd("volume", "ls") - if err != nil { - c.Fatalf("Could not list volume: %v %s", err, out) - } - c.Assert(out, checker.Contains, volName) - c.Assert(out, checker.Contains, pName) - - mountPoint, err := s.d.Cmd("volume", "inspect", volName, "--format", "{{.Mountpoint}}") - if err != nil { - c.Fatalf("Could not inspect volume: %v %s", err, mountPoint) - } - mountPoint = strings.TrimSpace(mountPoint) - - out, err = s.d.Cmd("run", "--rm", "-v", volName+":"+destDir, "busybox", "touch", destDir+destFile) - c.Assert(err, checker.IsNil, check.Commentf(out)) - path := filepath.Join(s.d.RootDir(), "plugins", pluginID, "rootfs", mountPoint, destFile) - _, err = os.Lstat(path) - c.Assert(err, checker.IsNil) - - exists, err := existsMountpointWithPrefix(mountpointPrefix) - c.Assert(err, checker.IsNil) - c.Assert(exists, checker.Equals, true) -} - -func (s *DockerDaemonSuite) TestGraphdriverPlugin(c *check.C) { - testRequires(c, Network, IsAmd64, DaemonIsLinux, overlay2Supported, ExperimentalDaemon) - - s.d.Start() - - // install the plugin - plugin := "cpuguy83/docker-overlay2-graphdriver-plugin" - out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", plugin) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // restart the daemon with the plugin set as the storage driver - s.d.Restart("-s", plugin, "--storage-opt", "overlay2.override_kernel_check=1") - - // run a container - out, err = s.d.Cmd("run", "--rm", "busybox", "true") // this will pull busybox using the plugin - c.Assert(err, checker.IsNil, check.Commentf(out)) -} - -func (s *DockerDaemonSuite) TestPluginVolumeRemoveOnRestart(c *check.C) { - testRequires(c, DaemonIsLinux, Network, IsAmd64) - - s.d.Start("--live-restore=true") - - out, err := s.d.Cmd("plugin", "install", "--grant-all-permissions", pName) - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Contains, pName) - - out, err = s.d.Cmd("volume", "create", "--driver", pName, "test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - s.d.Restart("--live-restore=true") - - out, err = s.d.Cmd("plugin", "disable", pName) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "in use") - - out, err = s.d.Cmd("volume", "rm", "test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("plugin", "disable", pName) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("plugin", "rm", pName) - c.Assert(err, checker.IsNil, check.Commentf(out)) -} - -func existsMountpointWithPrefix(mountpointPrefix string) (bool, error) { - mounts, err := mount.GetMounts() - if err != nil { - return false, err - } - for _, mnt := range mounts { - if strings.HasPrefix(mnt.Mountpoint, mountpointPrefix) { - return true, nil - } - } - return false, nil -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_test.go deleted file mode 100644 index 3a74fe215..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_test.go +++ /dev/null @@ -1,2988 +0,0 @@ -// +build linux - -package main - -import ( - "bufio" - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net" - "os" - "os/exec" - "path" - "path/filepath" - "regexp" - "strconv" - "strings" - "sync" - "syscall" - "time" - - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/go-units" - "github.com/docker/libnetwork/iptables" - "github.com/docker/libtrust" - "github.com/go-check/check" - "github.com/kr/pty" -) - -// TestLegacyDaemonCommand test starting docker daemon using "deprecated" docker daemon -// command. Remove this test when we remove this. -func (s *DockerDaemonSuite) TestLegacyDaemonCommand(c *check.C) { - cmd := exec.Command(dockerBinary, "daemon", "--storage-driver=vfs", "--debug") - err := cmd.Start() - c.Assert(err, checker.IsNil, check.Commentf("could not start daemon using 'docker daemon'")) - - c.Assert(cmd.Process.Kill(), checker.IsNil) -} - -func (s *DockerDaemonSuite) TestDaemonRestartWithRunningContainersPorts(c *check.C) { - if err := s.d.StartWithBusybox(); err != nil { - c.Fatalf("Could not start daemon with busybox: %v", err) - } - - if out, err := s.d.Cmd("run", "-d", "--name", "top1", "-p", "1234:80", "--restart", "always", "busybox:latest", "top"); err != nil { - c.Fatalf("Could not run top1: err=%v\n%s", err, out) - } - // --restart=no by default - if out, err := s.d.Cmd("run", "-d", "--name", "top2", "-p", "80", "busybox:latest", "top"); err != nil { - c.Fatalf("Could not run top2: err=%v\n%s", err, out) - } - - testRun := func(m map[string]bool, prefix string) { - var format string - for cont, shouldRun := range m { - out, err := s.d.Cmd("ps") - if err != nil { - c.Fatalf("Could not run ps: err=%v\n%q", err, out) - } - if shouldRun { - format = "%scontainer %q is not running" - } else { - format = "%scontainer %q is running" - } - if shouldRun != strings.Contains(out, cont) { - c.Fatalf(format, prefix, cont) - } - } - } - - testRun(map[string]bool{"top1": true, "top2": true}, "") - - if err := s.d.Restart(); err != nil { - c.Fatalf("Could not restart daemon: %v", err) - } - testRun(map[string]bool{"top1": true, "top2": false}, "After daemon restart: ") -} - -func (s *DockerDaemonSuite) TestDaemonRestartWithVolumesRefs(c *check.C) { - if err := s.d.StartWithBusybox(); err != nil { - c.Fatal(err) - } - - if out, err := s.d.Cmd("run", "--name", "volrestarttest1", "-v", "/foo", "busybox"); err != nil { - c.Fatal(err, out) - } - - if err := s.d.Restart(); err != nil { - c.Fatal(err) - } - - if _, err := s.d.Cmd("run", "-d", "--volumes-from", "volrestarttest1", "--name", "volrestarttest2", "busybox", "top"); err != nil { - c.Fatal(err) - } - - if out, err := s.d.Cmd("rm", "-fv", "volrestarttest2"); err != nil { - c.Fatal(err, out) - } - - out, err := s.d.Cmd("inspect", "-f", "{{json .Mounts}}", "volrestarttest1") - c.Assert(err, check.IsNil) - - if _, err := inspectMountPointJSON(out, "/foo"); err != nil { - c.Fatalf("Expected volume to exist: /foo, error: %v\n", err) - } -} - -// #11008 -func (s *DockerDaemonSuite) TestDaemonRestartUnlessStopped(c *check.C) { - err := s.d.StartWithBusybox() - c.Assert(err, check.IsNil) - - out, err := s.d.Cmd("run", "-d", "--name", "top1", "--restart", "always", "busybox:latest", "top") - c.Assert(err, check.IsNil, check.Commentf("run top1: %v", out)) - - out, err = s.d.Cmd("run", "-d", "--name", "top2", "--restart", "unless-stopped", "busybox:latest", "top") - c.Assert(err, check.IsNil, check.Commentf("run top2: %v", out)) - - testRun := func(m map[string]bool, prefix string) { - var format string - for name, shouldRun := range m { - out, err := s.d.Cmd("ps") - c.Assert(err, check.IsNil, check.Commentf("run ps: %v", out)) - if shouldRun { - format = "%scontainer %q is not running" - } else { - format = "%scontainer %q is running" - } - c.Assert(strings.Contains(out, name), check.Equals, shouldRun, check.Commentf(format, prefix, name)) - } - } - - // both running - testRun(map[string]bool{"top1": true, "top2": true}, "") - - out, err = s.d.Cmd("stop", "top1") - c.Assert(err, check.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("stop", "top2") - c.Assert(err, check.IsNil, check.Commentf(out)) - - // both stopped - testRun(map[string]bool{"top1": false, "top2": false}, "") - - err = s.d.Restart() - c.Assert(err, check.IsNil) - - // restart=always running - testRun(map[string]bool{"top1": true, "top2": false}, "After daemon restart: ") - - out, err = s.d.Cmd("start", "top2") - c.Assert(err, check.IsNil, check.Commentf("start top2: %v", out)) - - err = s.d.Restart() - c.Assert(err, check.IsNil) - - // both running - testRun(map[string]bool{"top1": true, "top2": true}, "After second daemon restart: ") - -} - -func (s *DockerDaemonSuite) TestDaemonRestartOnFailure(c *check.C) { - err := s.d.StartWithBusybox() - c.Assert(err, check.IsNil) - - out, err := s.d.Cmd("run", "-d", "--name", "test1", "--restart", "on-failure:3", "busybox:latest", "false") - c.Assert(err, check.IsNil, check.Commentf("run top1: %v", out)) - - // wait test1 to stop - hostArgs := []string{"--host", s.d.sock()} - err = waitInspectWithArgs("test1", "{{.State.Running}} {{.State.Restarting}}", "false false", 10*time.Second, hostArgs...) - c.Assert(err, checker.IsNil, check.Commentf("test1 should exit but not")) - - // record last start time - out, err = s.d.Cmd("inspect", "-f={{.State.StartedAt}}", "test1") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - lastStartTime := out - - err = s.d.Restart() - c.Assert(err, check.IsNil) - - // test1 shouldn't restart at all - err = waitInspectWithArgs("test1", "{{.State.Running}} {{.State.Restarting}}", "false false", 0, hostArgs...) - c.Assert(err, checker.IsNil, check.Commentf("test1 should exit but not")) - - // make sure test1 isn't restarted when daemon restart - // if "StartAt" time updates, means test1 was once restarted. - out, err = s.d.Cmd("inspect", "-f={{.State.StartedAt}}", "test1") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - c.Assert(out, checker.Equals, lastStartTime, check.Commentf("test1 shouldn't start after daemon restarts")) -} - -func (s *DockerDaemonSuite) TestDaemonStartIptablesFalse(c *check.C) { - if err := s.d.Start("--iptables=false"); err != nil { - c.Fatalf("we should have been able to start the daemon with passing iptables=false: %v", err) - } -} - -// Make sure we cannot shrink base device at daemon restart. -func (s *DockerDaemonSuite) TestDaemonRestartWithInvalidBasesize(c *check.C) { - testRequires(c, Devicemapper) - c.Assert(s.d.Start(), check.IsNil) - - oldBasesizeBytes := s.d.getBaseDeviceSize(c) - var newBasesizeBytes int64 = 1073741824 //1GB in bytes - - if newBasesizeBytes < oldBasesizeBytes { - err := s.d.Restart("--storage-opt", fmt.Sprintf("dm.basesize=%d", newBasesizeBytes)) - c.Assert(err, check.IsNil, check.Commentf("daemon should not have started as new base device size is less than existing base device size: %v", err)) - } - c.Assert(s.d.Stop(), check.IsNil) -} - -// Make sure we can grow base device at daemon restart. -func (s *DockerDaemonSuite) TestDaemonRestartWithIncreasedBasesize(c *check.C) { - testRequires(c, Devicemapper) - c.Assert(s.d.Start(), check.IsNil) - - oldBasesizeBytes := s.d.getBaseDeviceSize(c) - - var newBasesizeBytes int64 = 53687091200 //50GB in bytes - - if newBasesizeBytes < oldBasesizeBytes { - c.Skip(fmt.Sprintf("New base device size (%v) must be greater than (%s)", units.HumanSize(float64(newBasesizeBytes)), units.HumanSize(float64(oldBasesizeBytes)))) - } - - err := s.d.Restart("--storage-opt", fmt.Sprintf("dm.basesize=%d", newBasesizeBytes)) - c.Assert(err, check.IsNil, check.Commentf("we should have been able to start the daemon with increased base device size: %v", err)) - - basesizeAfterRestart := s.d.getBaseDeviceSize(c) - newBasesize, err := convertBasesize(newBasesizeBytes) - c.Assert(err, check.IsNil, check.Commentf("Error in converting base device size: %v", err)) - c.Assert(newBasesize, check.Equals, basesizeAfterRestart, check.Commentf("Basesize passed is not equal to Basesize set")) - c.Assert(s.d.Stop(), check.IsNil) -} - -// Issue #8444: If docker0 bridge is modified (intentionally or unintentionally) and -// no longer has an IP associated, we should gracefully handle that case and associate -// an IP with it rather than fail daemon start -func (s *DockerDaemonSuite) TestDaemonStartBridgeWithoutIPAssociation(c *check.C) { - // rather than depending on brctl commands to verify docker0 is created and up - // let's start the daemon and stop it, and then make a modification to run the - // actual test - if err := s.d.Start(); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - if err := s.d.Stop(); err != nil { - c.Fatalf("Could not stop daemon: %v", err) - } - - // now we will remove the ip from docker0 and then try starting the daemon - ipCmd := exec.Command("ip", "addr", "flush", "dev", "docker0") - stdout, stderr, _, err := runCommandWithStdoutStderr(ipCmd) - if err != nil { - c.Fatalf("failed to remove docker0 IP association: %v, stdout: %q, stderr: %q", err, stdout, stderr) - } - - if err := s.d.Start(); err != nil { - warning := "**WARNING: Docker bridge network in bad state--delete docker0 bridge interface to fix" - c.Fatalf("Could not start daemon when docker0 has no IP address: %v\n%s", err, warning) - } -} - -func (s *DockerDaemonSuite) TestDaemonIptablesClean(c *check.C) { - if err := s.d.StartWithBusybox(); err != nil { - c.Fatalf("Could not start daemon with busybox: %v", err) - } - - if out, err := s.d.Cmd("run", "-d", "--name", "top", "-p", "80", "busybox:latest", "top"); err != nil { - c.Fatalf("Could not run top: %s, %v", out, err) - } - - // get output from iptables with container running - ipTablesSearchString := "tcp dpt:80" - ipTablesCmd := exec.Command("iptables", "-nvL") - out, _, err := runCommandWithOutput(ipTablesCmd) - if err != nil { - c.Fatalf("Could not run iptables -nvL: %s, %v", out, err) - } - - if !strings.Contains(out, ipTablesSearchString) { - c.Fatalf("iptables output should have contained %q, but was %q", ipTablesSearchString, out) - } - - if err := s.d.Stop(); err != nil { - c.Fatalf("Could not stop daemon: %v", err) - } - - // get output from iptables after restart - ipTablesCmd = exec.Command("iptables", "-nvL") - out, _, err = runCommandWithOutput(ipTablesCmd) - if err != nil { - c.Fatalf("Could not run iptables -nvL: %s, %v", out, err) - } - - if strings.Contains(out, ipTablesSearchString) { - c.Fatalf("iptables output should not have contained %q, but was %q", ipTablesSearchString, out) - } -} - -func (s *DockerDaemonSuite) TestDaemonIptablesCreate(c *check.C) { - if err := s.d.StartWithBusybox(); err != nil { - c.Fatalf("Could not start daemon with busybox: %v", err) - } - - if out, err := s.d.Cmd("run", "-d", "--name", "top", "--restart=always", "-p", "80", "busybox:latest", "top"); err != nil { - c.Fatalf("Could not run top: %s, %v", out, err) - } - - // get output from iptables with container running - ipTablesSearchString := "tcp dpt:80" - ipTablesCmd := exec.Command("iptables", "-nvL") - out, _, err := runCommandWithOutput(ipTablesCmd) - if err != nil { - c.Fatalf("Could not run iptables -nvL: %s, %v", out, err) - } - - if !strings.Contains(out, ipTablesSearchString) { - c.Fatalf("iptables output should have contained %q, but was %q", ipTablesSearchString, out) - } - - if err := s.d.Restart(); err != nil { - c.Fatalf("Could not restart daemon: %v", err) - } - - // make sure the container is not running - runningOut, err := s.d.Cmd("inspect", "--format={{.State.Running}}", "top") - if err != nil { - c.Fatalf("Could not inspect on container: %s, %v", out, err) - } - if strings.TrimSpace(runningOut) != "true" { - c.Fatalf("Container should have been restarted after daemon restart. Status running should have been true but was: %q", strings.TrimSpace(runningOut)) - } - - // get output from iptables after restart - ipTablesCmd = exec.Command("iptables", "-nvL") - out, _, err = runCommandWithOutput(ipTablesCmd) - if err != nil { - c.Fatalf("Could not run iptables -nvL: %s, %v", out, err) - } - - if !strings.Contains(out, ipTablesSearchString) { - c.Fatalf("iptables output after restart should have contained %q, but was %q", ipTablesSearchString, out) - } -} - -// TestDaemonIPv6Enabled checks that when the daemon is started with --ipv6=true that the docker0 bridge -// has the fe80::1 address and that a container is assigned a link-local address -func (s *DockerDaemonSuite) TestDaemonIPv6Enabled(c *check.C) { - testRequires(c, IPv6) - - setupV6(c) - defer teardownV6(c) - - if err := s.d.StartWithBusybox("--ipv6"); err != nil { - c.Fatal(err) - } - - iface, err := net.InterfaceByName("docker0") - if err != nil { - c.Fatalf("Error getting docker0 interface: %v", err) - } - - addrs, err := iface.Addrs() - if err != nil { - c.Fatalf("Error getting addresses for docker0 interface: %v", err) - } - - var found bool - expected := "fe80::1/64" - - for i := range addrs { - if addrs[i].String() == expected { - found = true - break - } - } - - if !found { - c.Fatalf("Bridge does not have an IPv6 Address") - } - - if out, err := s.d.Cmd("run", "-itd", "--name=ipv6test", "busybox:latest"); err != nil { - c.Fatalf("Could not run container: %s, %v", out, err) - } - - out, err := s.d.Cmd("inspect", "--format", "'{{.NetworkSettings.Networks.bridge.LinkLocalIPv6Address}}'", "ipv6test") - out = strings.Trim(out, " \r\n'") - - if err != nil { - c.Fatalf("Error inspecting container: %s, %v", out, err) - } - - if ip := net.ParseIP(out); ip == nil { - c.Fatalf("Container should have a link-local IPv6 address") - } - - out, err = s.d.Cmd("inspect", "--format", "'{{.NetworkSettings.Networks.bridge.GlobalIPv6Address}}'", "ipv6test") - out = strings.Trim(out, " \r\n'") - - if err != nil { - c.Fatalf("Error inspecting container: %s, %v", out, err) - } - - if ip := net.ParseIP(out); ip != nil { - c.Fatalf("Container should not have a global IPv6 address: %v", out) - } -} - -// TestDaemonIPv6FixedCIDR checks that when the daemon is started with --ipv6=true and a fixed CIDR -// that running containers are given a link-local and global IPv6 address -func (s *DockerDaemonSuite) TestDaemonIPv6FixedCIDR(c *check.C) { - // IPv6 setup is messing with local bridge address. - testRequires(c, SameHostDaemon) - setupV6(c) - defer teardownV6(c) - - err := s.d.StartWithBusybox("--ipv6", "--fixed-cidr-v6=2001:db8:2::/64", "--default-gateway-v6=2001:db8:2::100") - c.Assert(err, checker.IsNil, check.Commentf("Could not start daemon with busybox: %v", err)) - - out, err := s.d.Cmd("run", "-itd", "--name=ipv6test", "busybox:latest") - c.Assert(err, checker.IsNil, check.Commentf("Could not run container: %s, %v", out, err)) - - out, err = s.d.Cmd("inspect", "--format", "{{.NetworkSettings.Networks.bridge.GlobalIPv6Address}}", "ipv6test") - out = strings.Trim(out, " \r\n'") - - c.Assert(err, checker.IsNil, check.Commentf(out)) - - ip := net.ParseIP(out) - c.Assert(ip, checker.NotNil, check.Commentf("Container should have a global IPv6 address")) - - out, err = s.d.Cmd("inspect", "--format", "{{.NetworkSettings.Networks.bridge.IPv6Gateway}}", "ipv6test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - c.Assert(strings.Trim(out, " \r\n'"), checker.Equals, "2001:db8:2::100", check.Commentf("Container should have a global IPv6 gateway")) -} - -// TestDaemonIPv6FixedCIDRAndMac checks that when the daemon is started with ipv6 fixed CIDR -// the running containers are given an IPv6 address derived from the MAC address and the ipv6 fixed CIDR -func (s *DockerDaemonSuite) TestDaemonIPv6FixedCIDRAndMac(c *check.C) { - // IPv6 setup is messing with local bridge address. - testRequires(c, SameHostDaemon) - setupV6(c) - defer teardownV6(c) - - err := s.d.StartWithBusybox("--ipv6", "--fixed-cidr-v6=2001:db8:1::/64") - c.Assert(err, checker.IsNil) - - out, err := s.d.Cmd("run", "-itd", "--name=ipv6test", "--mac-address", "AA:BB:CC:DD:EE:FF", "busybox") - c.Assert(err, checker.IsNil) - - out, err = s.d.Cmd("inspect", "--format", "{{.NetworkSettings.Networks.bridge.GlobalIPv6Address}}", "ipv6test") - c.Assert(err, checker.IsNil) - c.Assert(strings.Trim(out, " \r\n'"), checker.Equals, "2001:db8:1::aabb:ccdd:eeff") -} - -func (s *DockerDaemonSuite) TestDaemonLogLevelWrong(c *check.C) { - c.Assert(s.d.Start("--log-level=bogus"), check.NotNil, check.Commentf("Daemon shouldn't start with wrong log level")) -} - -func (s *DockerDaemonSuite) TestDaemonLogLevelDebug(c *check.C) { - if err := s.d.Start("--log-level=debug"); err != nil { - c.Fatal(err) - } - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - if !strings.Contains(string(content), `level=debug`) { - c.Fatalf(`Missing level="debug" in log file:\n%s`, string(content)) - } -} - -func (s *DockerDaemonSuite) TestDaemonLogLevelFatal(c *check.C) { - // we creating new daemons to create new logFile - if err := s.d.Start("--log-level=fatal"); err != nil { - c.Fatal(err) - } - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - if strings.Contains(string(content), `level=debug`) { - c.Fatalf(`Should not have level="debug" in log file:\n%s`, string(content)) - } -} - -func (s *DockerDaemonSuite) TestDaemonFlagD(c *check.C) { - if err := s.d.Start("-D"); err != nil { - c.Fatal(err) - } - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - if !strings.Contains(string(content), `level=debug`) { - c.Fatalf(`Should have level="debug" in log file using -D:\n%s`, string(content)) - } -} - -func (s *DockerDaemonSuite) TestDaemonFlagDebug(c *check.C) { - if err := s.d.Start("--debug"); err != nil { - c.Fatal(err) - } - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - if !strings.Contains(string(content), `level=debug`) { - c.Fatalf(`Should have level="debug" in log file using --debug:\n%s`, string(content)) - } -} - -func (s *DockerDaemonSuite) TestDaemonFlagDebugLogLevelFatal(c *check.C) { - if err := s.d.Start("--debug", "--log-level=fatal"); err != nil { - c.Fatal(err) - } - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - if !strings.Contains(string(content), `level=debug`) { - c.Fatalf(`Should have level="debug" in log file when using both --debug and --log-level=fatal:\n%s`, string(content)) - } -} - -func (s *DockerDaemonSuite) TestDaemonAllocatesListeningPort(c *check.C) { - listeningPorts := [][]string{ - {"0.0.0.0", "0.0.0.0", "5678"}, - {"127.0.0.1", "127.0.0.1", "1234"}, - {"localhost", "127.0.0.1", "1235"}, - } - - cmdArgs := make([]string, 0, len(listeningPorts)*2) - for _, hostDirective := range listeningPorts { - cmdArgs = append(cmdArgs, "--host", fmt.Sprintf("tcp://%s:%s", hostDirective[0], hostDirective[2])) - } - - if err := s.d.StartWithBusybox(cmdArgs...); err != nil { - c.Fatalf("Could not start daemon with busybox: %v", err) - } - - for _, hostDirective := range listeningPorts { - output, err := s.d.Cmd("run", "-p", fmt.Sprintf("%s:%s:80", hostDirective[1], hostDirective[2]), "busybox", "true") - if err == nil { - c.Fatalf("Container should not start, expected port already allocated error: %q", output) - } else if !strings.Contains(output, "port is already allocated") { - c.Fatalf("Expected port is already allocated error: %q", output) - } - } -} - -func (s *DockerDaemonSuite) TestDaemonKeyGeneration(c *check.C) { - // TODO: skip or update for Windows daemon - os.Remove("/etc/docker/key.json") - if err := s.d.Start(); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - s.d.Stop() - - k, err := libtrust.LoadKeyFile("/etc/docker/key.json") - if err != nil { - c.Fatalf("Error opening key file") - } - kid := k.KeyID() - // Test Key ID is a valid fingerprint (e.g. QQXN:JY5W:TBXI:MK3X:GX6P:PD5D:F56N:NHCS:LVRZ:JA46:R24J:XEFF) - if len(kid) != 59 { - c.Fatalf("Bad key ID: %s", kid) - } -} - -func (s *DockerDaemonSuite) TestDaemonKeyMigration(c *check.C) { - // TODO: skip or update for Windows daemon - os.Remove("/etc/docker/key.json") - k1, err := libtrust.GenerateECP256PrivateKey() - if err != nil { - c.Fatalf("Error generating private key: %s", err) - } - if err := os.MkdirAll(filepath.Join(os.Getenv("HOME"), ".docker"), 0755); err != nil { - c.Fatalf("Error creating .docker directory: %s", err) - } - if err := libtrust.SaveKey(filepath.Join(os.Getenv("HOME"), ".docker", "key.json"), k1); err != nil { - c.Fatalf("Error saving private key: %s", err) - } - - if err := s.d.Start(); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - s.d.Stop() - - k2, err := libtrust.LoadKeyFile("/etc/docker/key.json") - if err != nil { - c.Fatalf("Error opening key file") - } - if k1.KeyID() != k2.KeyID() { - c.Fatalf("Key not migrated") - } -} - -// GH#11320 - verify that the daemon exits on failure properly -// Note that this explicitly tests the conflict of {-b,--bridge} and {--bip} options as the means -// to get a daemon init failure; no other tests for -b/--bip conflict are therefore required -func (s *DockerDaemonSuite) TestDaemonExitOnFailure(c *check.C) { - //attempt to start daemon with incorrect flags (we know -b and --bip conflict) - if err := s.d.Start("--bridge", "nosuchbridge", "--bip", "1.1.1.1"); err != nil { - //verify we got the right error - if !strings.Contains(err.Error(), "Daemon exited") { - c.Fatalf("Expected daemon not to start, got %v", err) - } - // look in the log and make sure we got the message that daemon is shutting down - runCmd := exec.Command("grep", "Error starting daemon", s.d.LogFileName()) - if out, _, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("Expected 'Error starting daemon' message; but doesn't exist in log: %q, err: %v", out, err) - } - } else { - //if we didn't get an error and the daemon is running, this is a failure - c.Fatal("Conflicting options should cause the daemon to error out with a failure") - } -} - -func (s *DockerDaemonSuite) TestDaemonBridgeExternal(c *check.C) { - d := s.d - err := d.Start("--bridge", "nosuchbridge") - c.Assert(err, check.NotNil, check.Commentf("--bridge option with an invalid bridge should cause the daemon to fail")) - defer d.Restart() - - bridgeName := "external-bridge" - bridgeIP := "192.169.1.1/24" - _, bridgeIPNet, _ := net.ParseCIDR(bridgeIP) - - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) - defer deleteInterface(c, bridgeName) - - err = d.StartWithBusybox("--bridge", bridgeName) - c.Assert(err, check.IsNil) - - ipTablesSearchString := bridgeIPNet.String() - ipTablesCmd := exec.Command("iptables", "-t", "nat", "-nvL") - out, _, err = runCommandWithOutput(ipTablesCmd) - c.Assert(err, check.IsNil) - - c.Assert(strings.Contains(out, ipTablesSearchString), check.Equals, true, - check.Commentf("iptables output should have contained %q, but was %q", - ipTablesSearchString, out)) - - _, err = d.Cmd("run", "-d", "--name", "ExtContainer", "busybox", "top") - c.Assert(err, check.IsNil) - - containerIP := d.findContainerIP("ExtContainer") - ip := net.ParseIP(containerIP) - c.Assert(bridgeIPNet.Contains(ip), check.Equals, true, - check.Commentf("Container IP-Address must be in the same subnet range : %s", - containerIP)) -} - -func (s *DockerDaemonSuite) TestDaemonBridgeNone(c *check.C) { - // start with bridge none - d := s.d - err := d.StartWithBusybox("--bridge", "none") - c.Assert(err, check.IsNil) - defer d.Restart() - - // verify docker0 iface is not there - out, _, err := runCommandWithOutput(exec.Command("ifconfig", "docker0")) - c.Assert(err, check.NotNil, check.Commentf("docker0 should not be present if daemon started with --bridge=none")) - c.Assert(strings.Contains(out, "Device not found"), check.Equals, true) - - // verify default "bridge" network is not there - out, err = d.Cmd("network", "inspect", "bridge") - c.Assert(err, check.NotNil, check.Commentf("\"bridge\" network should not be present if daemon started with --bridge=none")) - c.Assert(strings.Contains(out, "No such network"), check.Equals, true) -} - -func createInterface(c *check.C, ifType string, ifName string, ipNet string) (string, error) { - args := []string{"link", "add", "name", ifName, "type", ifType} - ipLinkCmd := exec.Command("ip", args...) - out, _, err := runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } - - ifCfgCmd := exec.Command("ifconfig", ifName, ipNet, "up") - out, _, err = runCommandWithOutput(ifCfgCmd) - return out, err -} - -func deleteInterface(c *check.C, ifName string) { - ifCmd := exec.Command("ip", "link", "delete", ifName) - out, _, err := runCommandWithOutput(ifCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - - flushCmd := exec.Command("iptables", "-t", "nat", "--flush") - out, _, err = runCommandWithOutput(flushCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - - flushCmd = exec.Command("iptables", "--flush") - out, _, err = runCommandWithOutput(flushCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) -} - -func (s *DockerDaemonSuite) TestDaemonBridgeIP(c *check.C) { - // TestDaemonBridgeIP Steps - // 1. Delete the existing docker0 Bridge - // 2. Set --bip daemon configuration and start the new Docker Daemon - // 3. Check if the bip config has taken effect using ifconfig and iptables commands - // 4. Launch a Container and make sure the IP-Address is in the expected subnet - // 5. Delete the docker0 Bridge - // 6. Restart the Docker Daemon (via deferred action) - // This Restart takes care of bringing docker0 interface back to auto-assigned IP - - defaultNetworkBridge := "docker0" - deleteInterface(c, defaultNetworkBridge) - - d := s.d - - bridgeIP := "192.169.1.1/24" - ip, bridgeIPNet, _ := net.ParseCIDR(bridgeIP) - - err := d.StartWithBusybox("--bip", bridgeIP) - c.Assert(err, check.IsNil) - defer d.Restart() - - ifconfigSearchString := ip.String() - ifconfigCmd := exec.Command("ifconfig", defaultNetworkBridge) - out, _, _, err := runCommandWithStdoutStderr(ifconfigCmd) - c.Assert(err, check.IsNil) - - c.Assert(strings.Contains(out, ifconfigSearchString), check.Equals, true, - check.Commentf("ifconfig output should have contained %q, but was %q", - ifconfigSearchString, out)) - - ipTablesSearchString := bridgeIPNet.String() - ipTablesCmd := exec.Command("iptables", "-t", "nat", "-nvL") - out, _, err = runCommandWithOutput(ipTablesCmd) - c.Assert(err, check.IsNil) - - c.Assert(strings.Contains(out, ipTablesSearchString), check.Equals, true, - check.Commentf("iptables output should have contained %q, but was %q", - ipTablesSearchString, out)) - - out, err = d.Cmd("run", "-d", "--name", "test", "busybox", "top") - c.Assert(err, check.IsNil) - - containerIP := d.findContainerIP("test") - ip = net.ParseIP(containerIP) - c.Assert(bridgeIPNet.Contains(ip), check.Equals, true, - check.Commentf("Container IP-Address must be in the same subnet range : %s", - containerIP)) - deleteInterface(c, defaultNetworkBridge) -} - -func (s *DockerDaemonSuite) TestDaemonRestartWithBridgeIPChange(c *check.C) { - if err := s.d.Start(); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - defer s.d.Restart() - if err := s.d.Stop(); err != nil { - c.Fatalf("Could not stop daemon: %v", err) - } - - // now we will change the docker0's IP and then try starting the daemon - bridgeIP := "192.169.100.1/24" - _, bridgeIPNet, _ := net.ParseCIDR(bridgeIP) - - ipCmd := exec.Command("ifconfig", "docker0", bridgeIP) - stdout, stderr, _, err := runCommandWithStdoutStderr(ipCmd) - if err != nil { - c.Fatalf("failed to change docker0's IP association: %v, stdout: %q, stderr: %q", err, stdout, stderr) - } - - if err := s.d.Start("--bip", bridgeIP); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - - //check if the iptables contains new bridgeIP MASQUERADE rule - ipTablesSearchString := bridgeIPNet.String() - ipTablesCmd := exec.Command("iptables", "-t", "nat", "-nvL") - out, _, err := runCommandWithOutput(ipTablesCmd) - if err != nil { - c.Fatalf("Could not run iptables -nvL: %s, %v", out, err) - } - if !strings.Contains(out, ipTablesSearchString) { - c.Fatalf("iptables output should have contained new MASQUERADE rule with IP %q, but was %q", ipTablesSearchString, out) - } -} - -func (s *DockerDaemonSuite) TestDaemonBridgeFixedCidr(c *check.C) { - d := s.d - - bridgeName := "external-bridge" - bridgeIP := "192.169.1.1/24" - - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) - defer deleteInterface(c, bridgeName) - - args := []string{"--bridge", bridgeName, "--fixed-cidr", "192.169.1.0/30"} - err = d.StartWithBusybox(args...) - c.Assert(err, check.IsNil) - defer d.Restart() - - for i := 0; i < 4; i++ { - cName := "Container" + strconv.Itoa(i) - out, err := d.Cmd("run", "-d", "--name", cName, "busybox", "top") - if err != nil { - c.Assert(strings.Contains(out, "no available IPv4 addresses"), check.Equals, true, - check.Commentf("Could not run a Container : %s %s", err.Error(), out)) - } - } -} - -func (s *DockerDaemonSuite) TestDaemonBridgeFixedCidr2(c *check.C) { - d := s.d - - bridgeName := "external-bridge" - bridgeIP := "10.2.2.1/16" - - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) - defer deleteInterface(c, bridgeName) - - err = d.StartWithBusybox("--bip", bridgeIP, "--fixed-cidr", "10.2.2.0/24") - c.Assert(err, check.IsNil) - defer s.d.Restart() - - out, err = d.Cmd("run", "-d", "--name", "bb", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - defer d.Cmd("stop", "bb") - - out, err = d.Cmd("exec", "bb", "/bin/sh", "-c", "ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'") - c.Assert(out, checker.Equals, "10.2.2.0\n") - - out, err = d.Cmd("run", "--rm", "busybox", "/bin/sh", "-c", "ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(out, checker.Equals, "10.2.2.2\n") -} - -func (s *DockerDaemonSuite) TestDaemonBridgeFixedCIDREqualBridgeNetwork(c *check.C) { - d := s.d - - bridgeName := "external-bridge" - bridgeIP := "172.27.42.1/16" - - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) - defer deleteInterface(c, bridgeName) - - err = d.StartWithBusybox("--bridge", bridgeName, "--fixed-cidr", bridgeIP) - c.Assert(err, check.IsNil) - defer s.d.Restart() - - out, err = d.Cmd("run", "-d", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf(out)) - cid1 := strings.TrimSpace(out) - defer d.Cmd("stop", cid1) -} - -func (s *DockerDaemonSuite) TestDaemonDefaultGatewayIPv4Implicit(c *check.C) { - defaultNetworkBridge := "docker0" - deleteInterface(c, defaultNetworkBridge) - - d := s.d - - bridgeIP := "192.169.1.1" - bridgeIPNet := fmt.Sprintf("%s/24", bridgeIP) - - err := d.StartWithBusybox("--bip", bridgeIPNet) - c.Assert(err, check.IsNil) - defer d.Restart() - - expectedMessage := fmt.Sprintf("default via %s dev", bridgeIP) - out, err := d.Cmd("run", "busybox", "ip", "-4", "route", "list", "0/0") - c.Assert(strings.Contains(out, expectedMessage), check.Equals, true, - check.Commentf("Implicit default gateway should be bridge IP %s, but default route was '%s'", - bridgeIP, strings.TrimSpace(out))) - deleteInterface(c, defaultNetworkBridge) -} - -func (s *DockerDaemonSuite) TestDaemonDefaultGatewayIPv4Explicit(c *check.C) { - defaultNetworkBridge := "docker0" - deleteInterface(c, defaultNetworkBridge) - - d := s.d - - bridgeIP := "192.169.1.1" - bridgeIPNet := fmt.Sprintf("%s/24", bridgeIP) - gatewayIP := "192.169.1.254" - - err := d.StartWithBusybox("--bip", bridgeIPNet, "--default-gateway", gatewayIP) - c.Assert(err, check.IsNil) - defer d.Restart() - - expectedMessage := fmt.Sprintf("default via %s dev", gatewayIP) - out, err := d.Cmd("run", "busybox", "ip", "-4", "route", "list", "0/0") - c.Assert(strings.Contains(out, expectedMessage), check.Equals, true, - check.Commentf("Explicit default gateway should be %s, but default route was '%s'", - gatewayIP, strings.TrimSpace(out))) - deleteInterface(c, defaultNetworkBridge) -} - -func (s *DockerDaemonSuite) TestDaemonDefaultGatewayIPv4ExplicitOutsideContainerSubnet(c *check.C) { - defaultNetworkBridge := "docker0" - deleteInterface(c, defaultNetworkBridge) - - // Program a custom default gateway outside of the container subnet, daemon should accept it and start - err := s.d.StartWithBusybox("--bip", "172.16.0.10/16", "--fixed-cidr", "172.16.1.0/24", "--default-gateway", "172.16.0.254") - c.Assert(err, check.IsNil) - - deleteInterface(c, defaultNetworkBridge) - s.d.Restart() -} - -func (s *DockerDaemonSuite) TestDaemonDefaultNetworkInvalidClusterConfig(c *check.C) { - testRequires(c, DaemonIsLinux, SameHostDaemon) - - // Start daemon without docker0 bridge - defaultNetworkBridge := "docker0" - deleteInterface(c, defaultNetworkBridge) - - discoveryBackend := "consul://consuladdr:consulport/some/path" - err := s.d.Start(fmt.Sprintf("--cluster-store=%s", discoveryBackend)) - c.Assert(err, checker.IsNil) - - // Start daemon with docker0 bridge - result := icmd.RunCommand("ifconfig", defaultNetworkBridge) - c.Assert(result, icmd.Matches, icmd.Success) - - err = s.d.Restart(fmt.Sprintf("--cluster-store=%s", discoveryBackend)) - c.Assert(err, checker.IsNil) -} - -func (s *DockerDaemonSuite) TestDaemonIP(c *check.C) { - d := s.d - - ipStr := "192.170.1.1/24" - ip, _, _ := net.ParseCIDR(ipStr) - args := []string{"--ip", ip.String()} - err := d.StartWithBusybox(args...) - c.Assert(err, check.IsNil) - defer d.Restart() - - out, err := d.Cmd("run", "-d", "-p", "8000:8000", "busybox", "top") - c.Assert(err, check.NotNil, - check.Commentf("Running a container must fail with an invalid --ip option")) - c.Assert(strings.Contains(out, "Error starting userland proxy"), check.Equals, true) - - ifName := "dummy" - out, err = createInterface(c, "dummy", ifName, ipStr) - c.Assert(err, check.IsNil, check.Commentf(out)) - defer deleteInterface(c, ifName) - - _, err = d.Cmd("run", "-d", "-p", "8000:8000", "busybox", "top") - c.Assert(err, check.IsNil) - - ipTablesCmd := exec.Command("iptables", "-t", "nat", "-nvL") - out, _, err = runCommandWithOutput(ipTablesCmd) - c.Assert(err, check.IsNil) - - regex := fmt.Sprintf("DNAT.*%s.*dpt:8000", ip.String()) - matched, _ := regexp.MatchString(regex, out) - c.Assert(matched, check.Equals, true, - check.Commentf("iptables output should have contained %q, but was %q", regex, out)) -} - -func (s *DockerDaemonSuite) TestDaemonICCPing(c *check.C) { - testRequires(c, bridgeNfIptables) - d := s.d - - bridgeName := "external-bridge" - bridgeIP := "192.169.1.1/24" - - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) - defer deleteInterface(c, bridgeName) - - args := []string{"--bridge", bridgeName, "--icc=false"} - err = d.StartWithBusybox(args...) - c.Assert(err, check.IsNil) - defer d.Restart() - - ipTablesCmd := exec.Command("iptables", "-nvL", "FORWARD") - out, _, err = runCommandWithOutput(ipTablesCmd) - c.Assert(err, check.IsNil) - - regex := fmt.Sprintf("DROP.*all.*%s.*%s", bridgeName, bridgeName) - matched, _ := regexp.MatchString(regex, out) - c.Assert(matched, check.Equals, true, - check.Commentf("iptables output should have contained %q, but was %q", regex, out)) - - // Pinging another container must fail with --icc=false - pingContainers(c, d, true) - - ipStr := "192.171.1.1/24" - ip, _, _ := net.ParseCIDR(ipStr) - ifName := "icc-dummy" - - createInterface(c, "dummy", ifName, ipStr) - - // But, Pinging external or a Host interface must succeed - pingCmd := fmt.Sprintf("ping -c 1 %s -W 1", ip.String()) - runArgs := []string{"run", "--rm", "busybox", "sh", "-c", pingCmd} - _, err = d.Cmd(runArgs...) - c.Assert(err, check.IsNil) -} - -func (s *DockerDaemonSuite) TestDaemonICCLinkExpose(c *check.C) { - d := s.d - - bridgeName := "external-bridge" - bridgeIP := "192.169.1.1/24" - - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) - defer deleteInterface(c, bridgeName) - - args := []string{"--bridge", bridgeName, "--icc=false"} - err = d.StartWithBusybox(args...) - c.Assert(err, check.IsNil) - defer d.Restart() - - ipTablesCmd := exec.Command("iptables", "-nvL", "FORWARD") - out, _, err = runCommandWithOutput(ipTablesCmd) - c.Assert(err, check.IsNil) - - regex := fmt.Sprintf("DROP.*all.*%s.*%s", bridgeName, bridgeName) - matched, _ := regexp.MatchString(regex, out) - c.Assert(matched, check.Equals, true, - check.Commentf("iptables output should have contained %q, but was %q", regex, out)) - - out, err = d.Cmd("run", "-d", "--expose", "4567", "--name", "icc1", "busybox", "nc", "-l", "-p", "4567") - c.Assert(err, check.IsNil, check.Commentf(out)) - - out, err = d.Cmd("run", "--link", "icc1:icc1", "busybox", "nc", "icc1", "4567") - c.Assert(err, check.IsNil, check.Commentf(out)) -} - -func (s *DockerDaemonSuite) TestDaemonLinksIpTablesRulesWhenLinkAndUnlink(c *check.C) { - bridgeName := "external-bridge" - bridgeIP := "192.169.1.1/24" - - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) - defer deleteInterface(c, bridgeName) - - err = s.d.StartWithBusybox("--bridge", bridgeName, "--icc=false") - c.Assert(err, check.IsNil) - defer s.d.Restart() - - _, err = s.d.Cmd("run", "-d", "--name", "child", "--publish", "8080:80", "busybox", "top") - c.Assert(err, check.IsNil) - _, err = s.d.Cmd("run", "-d", "--name", "parent", "--link", "child:http", "busybox", "top") - c.Assert(err, check.IsNil) - - childIP := s.d.findContainerIP("child") - parentIP := s.d.findContainerIP("parent") - - sourceRule := []string{"-i", bridgeName, "-o", bridgeName, "-p", "tcp", "-s", childIP, "--sport", "80", "-d", parentIP, "-j", "ACCEPT"} - destinationRule := []string{"-i", bridgeName, "-o", bridgeName, "-p", "tcp", "-s", parentIP, "--dport", "80", "-d", childIP, "-j", "ACCEPT"} - if !iptables.Exists("filter", "DOCKER", sourceRule...) || !iptables.Exists("filter", "DOCKER", destinationRule...) { - c.Fatal("Iptables rules not found") - } - - s.d.Cmd("rm", "--link", "parent/http") - if iptables.Exists("filter", "DOCKER", sourceRule...) || iptables.Exists("filter", "DOCKER", destinationRule...) { - c.Fatal("Iptables rules should be removed when unlink") - } - - s.d.Cmd("kill", "child") - s.d.Cmd("kill", "parent") -} - -func (s *DockerDaemonSuite) TestDaemonUlimitDefaults(c *check.C) { - testRequires(c, DaemonIsLinux) - - if err := s.d.StartWithBusybox("--default-ulimit", "nofile=42:42", "--default-ulimit", "nproc=1024:1024"); err != nil { - c.Fatal(err) - } - - out, err := s.d.Cmd("run", "--ulimit", "nproc=2048", "--name=test", "busybox", "/bin/sh", "-c", "echo $(ulimit -n); echo $(ulimit -p)") - if err != nil { - c.Fatal(out, err) - } - - outArr := strings.Split(out, "\n") - if len(outArr) < 2 { - c.Fatalf("got unexpected output: %s", out) - } - nofile := strings.TrimSpace(outArr[0]) - nproc := strings.TrimSpace(outArr[1]) - - if nofile != "42" { - c.Fatalf("expected `ulimit -n` to be `42`, got: %s", nofile) - } - if nproc != "2048" { - c.Fatalf("exepcted `ulimit -p` to be 2048, got: %s", nproc) - } - - // Now restart daemon with a new default - if err := s.d.Restart("--default-ulimit", "nofile=43"); err != nil { - c.Fatal(err) - } - - out, err = s.d.Cmd("start", "-a", "test") - if err != nil { - c.Fatal(err) - } - - outArr = strings.Split(out, "\n") - if len(outArr) < 2 { - c.Fatalf("got unexpected output: %s", out) - } - nofile = strings.TrimSpace(outArr[0]) - nproc = strings.TrimSpace(outArr[1]) - - if nofile != "43" { - c.Fatalf("expected `ulimit -n` to be `43`, got: %s", nofile) - } - if nproc != "2048" { - c.Fatalf("exepcted `ulimit -p` to be 2048, got: %s", nproc) - } -} - -// #11315 -func (s *DockerDaemonSuite) TestDaemonRestartRenameContainer(c *check.C) { - if err := s.d.StartWithBusybox(); err != nil { - c.Fatal(err) - } - - if out, err := s.d.Cmd("run", "--name=test", "busybox"); err != nil { - c.Fatal(err, out) - } - - if out, err := s.d.Cmd("rename", "test", "test2"); err != nil { - c.Fatal(err, out) - } - - if err := s.d.Restart(); err != nil { - c.Fatal(err) - } - - if out, err := s.d.Cmd("start", "test2"); err != nil { - c.Fatal(err, out) - } -} - -func (s *DockerDaemonSuite) TestDaemonLoggingDriverDefault(c *check.C) { - if err := s.d.StartWithBusybox(); err != nil { - c.Fatal(err) - } - - out, err := s.d.Cmd("run", "--name=test", "busybox", "echo", "testline") - c.Assert(err, check.IsNil, check.Commentf(out)) - id, err := s.d.getIDByName("test") - c.Assert(err, check.IsNil) - - logPath := filepath.Join(s.d.root, "containers", id, id+"-json.log") - - if _, err := os.Stat(logPath); err != nil { - c.Fatal(err) - } - f, err := os.Open(logPath) - if err != nil { - c.Fatal(err) - } - defer f.Close() - - var res struct { - Log string `json:"log"` - Stream string `json:"stream"` - Time time.Time `json:"time"` - } - if err := json.NewDecoder(f).Decode(&res); err != nil { - c.Fatal(err) - } - if res.Log != "testline\n" { - c.Fatalf("Unexpected log line: %q, expected: %q", res.Log, "testline\n") - } - if res.Stream != "stdout" { - c.Fatalf("Unexpected stream: %q, expected: %q", res.Stream, "stdout") - } - if !time.Now().After(res.Time) { - c.Fatalf("Log time %v in future", res.Time) - } -} - -func (s *DockerDaemonSuite) TestDaemonLoggingDriverDefaultOverride(c *check.C) { - if err := s.d.StartWithBusybox(); err != nil { - c.Fatal(err) - } - - out, err := s.d.Cmd("run", "--name=test", "--log-driver=none", "busybox", "echo", "testline") - if err != nil { - c.Fatal(out, err) - } - id, err := s.d.getIDByName("test") - c.Assert(err, check.IsNil) - - logPath := filepath.Join(s.d.root, "containers", id, id+"-json.log") - - if _, err := os.Stat(logPath); err == nil || !os.IsNotExist(err) { - c.Fatalf("%s shouldn't exits, error on Stat: %s", logPath, err) - } -} - -func (s *DockerDaemonSuite) TestDaemonLoggingDriverNone(c *check.C) { - if err := s.d.StartWithBusybox("--log-driver=none"); err != nil { - c.Fatal(err) - } - - out, err := s.d.Cmd("run", "--name=test", "busybox", "echo", "testline") - if err != nil { - c.Fatal(out, err) - } - id, err := s.d.getIDByName("test") - c.Assert(err, check.IsNil) - - logPath := filepath.Join(s.d.folder, "graph", "containers", id, id+"-json.log") - - if _, err := os.Stat(logPath); err == nil || !os.IsNotExist(err) { - c.Fatalf("%s shouldn't exits, error on Stat: %s", logPath, err) - } -} - -func (s *DockerDaemonSuite) TestDaemonLoggingDriverNoneOverride(c *check.C) { - if err := s.d.StartWithBusybox("--log-driver=none"); err != nil { - c.Fatal(err) - } - - out, err := s.d.Cmd("run", "--name=test", "--log-driver=json-file", "busybox", "echo", "testline") - if err != nil { - c.Fatal(out, err) - } - id, err := s.d.getIDByName("test") - c.Assert(err, check.IsNil) - - logPath := filepath.Join(s.d.root, "containers", id, id+"-json.log") - - if _, err := os.Stat(logPath); err != nil { - c.Fatal(err) - } - f, err := os.Open(logPath) - if err != nil { - c.Fatal(err) - } - defer f.Close() - - var res struct { - Log string `json:"log"` - Stream string `json:"stream"` - Time time.Time `json:"time"` - } - if err := json.NewDecoder(f).Decode(&res); err != nil { - c.Fatal(err) - } - if res.Log != "testline\n" { - c.Fatalf("Unexpected log line: %q, expected: %q", res.Log, "testline\n") - } - if res.Stream != "stdout" { - c.Fatalf("Unexpected stream: %q, expected: %q", res.Stream, "stdout") - } - if !time.Now().After(res.Time) { - c.Fatalf("Log time %v in future", res.Time) - } -} - -func (s *DockerDaemonSuite) TestDaemonLoggingDriverNoneLogsError(c *check.C) { - c.Assert(s.d.StartWithBusybox("--log-driver=none"), checker.IsNil) - - out, err := s.d.Cmd("run", "--name=test", "busybox", "echo", "testline") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("logs", "test") - c.Assert(err, check.NotNil, check.Commentf("Logs should fail with 'none' driver")) - expected := `"logs" command is supported only for "json-file" and "journald" logging drivers (got: none)` - c.Assert(out, checker.Contains, expected) -} - -func (s *DockerDaemonSuite) TestDaemonUnixSockCleanedUp(c *check.C) { - dir, err := ioutil.TempDir("", "socket-cleanup-test") - if err != nil { - c.Fatal(err) - } - defer os.RemoveAll(dir) - - sockPath := filepath.Join(dir, "docker.sock") - if err := s.d.Start("--host", "unix://"+sockPath); err != nil { - c.Fatal(err) - } - - if _, err := os.Stat(sockPath); err != nil { - c.Fatal("socket does not exist") - } - - if err := s.d.Stop(); err != nil { - c.Fatal(err) - } - - if _, err := os.Stat(sockPath); err == nil || !os.IsNotExist(err) { - c.Fatal("unix socket is not cleaned up") - } -} - -func (s *DockerDaemonSuite) TestDaemonWithWrongkey(c *check.C) { - type Config struct { - Crv string `json:"crv"` - D string `json:"d"` - Kid string `json:"kid"` - Kty string `json:"kty"` - X string `json:"x"` - Y string `json:"y"` - } - - os.Remove("/etc/docker/key.json") - if err := s.d.Start(); err != nil { - c.Fatalf("Failed to start daemon: %v", err) - } - - if err := s.d.Stop(); err != nil { - c.Fatalf("Could not stop daemon: %v", err) - } - - config := &Config{} - bytes, err := ioutil.ReadFile("/etc/docker/key.json") - if err != nil { - c.Fatalf("Error reading key.json file: %s", err) - } - - // byte[] to Data-Struct - if err := json.Unmarshal(bytes, &config); err != nil { - c.Fatalf("Error Unmarshal: %s", err) - } - - //replace config.Kid with the fake value - config.Kid = "VSAJ:FUYR:X3H2:B2VZ:KZ6U:CJD5:K7BX:ZXHY:UZXT:P4FT:MJWG:HRJ4" - - // NEW Data-Struct to byte[] - newBytes, err := json.Marshal(&config) - if err != nil { - c.Fatalf("Error Marshal: %s", err) - } - - // write back - if err := ioutil.WriteFile("/etc/docker/key.json", newBytes, 0400); err != nil { - c.Fatalf("Error ioutil.WriteFile: %s", err) - } - - defer os.Remove("/etc/docker/key.json") - - if err := s.d.Start(); err == nil { - c.Fatalf("It should not be successful to start daemon with wrong key: %v", err) - } - - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - - if !strings.Contains(string(content), "Public Key ID does not match") { - c.Fatalf("Missing KeyID message from daemon logs: %s", string(content)) - } -} - -func (s *DockerDaemonSuite) TestDaemonRestartKillWait(c *check.C) { - if err := s.d.StartWithBusybox(); err != nil { - c.Fatalf("Could not start daemon with busybox: %v", err) - } - - out, err := s.d.Cmd("run", "-id", "busybox", "/bin/cat") - if err != nil { - c.Fatalf("Could not run /bin/cat: err=%v\n%s", err, out) - } - containerID := strings.TrimSpace(out) - - if out, err := s.d.Cmd("kill", containerID); err != nil { - c.Fatalf("Could not kill %s: err=%v\n%s", containerID, err, out) - } - - if err := s.d.Restart(); err != nil { - c.Fatalf("Could not restart daemon: %v", err) - } - - errchan := make(chan error) - go func() { - if out, err := s.d.Cmd("wait", containerID); err != nil { - errchan <- fmt.Errorf("%v:\n%s", err, out) - } - close(errchan) - }() - - select { - case <-time.After(5 * time.Second): - c.Fatal("Waiting on a stopped (killed) container timed out") - case err := <-errchan: - if err != nil { - c.Fatal(err) - } - } -} - -// TestHTTPSInfo connects via two-way authenticated HTTPS to the info endpoint -func (s *DockerDaemonSuite) TestHTTPSInfo(c *check.C) { - const ( - testDaemonHTTPSAddr = "tcp://localhost:4271" - ) - - if err := s.d.Start("--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/server-cert.pem", - "--tlskey", "fixtures/https/server-key.pem", "-H", testDaemonHTTPSAddr); err != nil { - c.Fatalf("Could not start daemon with busybox: %v", err) - } - - args := []string{ - "--host", testDaemonHTTPSAddr, - "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", - "--tlscert", "fixtures/https/client-cert.pem", - "--tlskey", "fixtures/https/client-key.pem", - "info", - } - out, err := s.d.Cmd(args...) - if err != nil { - c.Fatalf("Error Occurred: %s and output: %s", err, out) - } -} - -// TestHTTPSRun connects via two-way authenticated HTTPS to the create, attach, start, and wait endpoints. -// https://github.com/docker/docker/issues/19280 -func (s *DockerDaemonSuite) TestHTTPSRun(c *check.C) { - const ( - testDaemonHTTPSAddr = "tcp://localhost:4271" - ) - - if err := s.d.StartWithBusybox("--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/server-cert.pem", - "--tlskey", "fixtures/https/server-key.pem", "-H", testDaemonHTTPSAddr); err != nil { - c.Fatalf("Could not start daemon with busybox: %v", err) - } - - args := []string{ - "--host", testDaemonHTTPSAddr, - "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", - "--tlscert", "fixtures/https/client-cert.pem", - "--tlskey", "fixtures/https/client-key.pem", - "run", "busybox", "echo", "TLS response", - } - out, err := s.d.Cmd(args...) - if err != nil { - c.Fatalf("Error Occurred: %s and output: %s", err, out) - } - - if !strings.Contains(out, "TLS response") { - c.Fatalf("expected output to include `TLS response`, got %v", out) - } -} - -// TestTLSVerify verifies that --tlsverify=false turns on tls -func (s *DockerDaemonSuite) TestTLSVerify(c *check.C) { - out, err := exec.Command(dockerdBinary, "--tlsverify=false").CombinedOutput() - if err == nil || !strings.Contains(string(out), "Could not load X509 key pair") { - c.Fatalf("Daemon should not have started due to missing certs: %v\n%s", err, string(out)) - } -} - -// TestHTTPSInfoRogueCert connects via two-way authenticated HTTPS to the info endpoint -// by using a rogue client certificate and checks that it fails with the expected error. -func (s *DockerDaemonSuite) TestHTTPSInfoRogueCert(c *check.C) { - const ( - errBadCertificate = "bad certificate" - testDaemonHTTPSAddr = "tcp://localhost:4271" - ) - - if err := s.d.Start("--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/server-cert.pem", - "--tlskey", "fixtures/https/server-key.pem", "-H", testDaemonHTTPSAddr); err != nil { - c.Fatalf("Could not start daemon with busybox: %v", err) - } - - args := []string{ - "--host", testDaemonHTTPSAddr, - "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", - "--tlscert", "fixtures/https/client-rogue-cert.pem", - "--tlskey", "fixtures/https/client-rogue-key.pem", - "info", - } - out, err := s.d.Cmd(args...) - if err == nil || !strings.Contains(out, errBadCertificate) { - c.Fatalf("Expected err: %s, got instead: %s and output: %s", errBadCertificate, err, out) - } -} - -// TestHTTPSInfoRogueServerCert connects via two-way authenticated HTTPS to the info endpoint -// which provides a rogue server certificate and checks that it fails with the expected error -func (s *DockerDaemonSuite) TestHTTPSInfoRogueServerCert(c *check.C) { - const ( - errCaUnknown = "x509: certificate signed by unknown authority" - testDaemonRogueHTTPSAddr = "tcp://localhost:4272" - ) - if err := s.d.Start("--tlsverify", "--tlscacert", "fixtures/https/ca.pem", "--tlscert", "fixtures/https/server-rogue-cert.pem", - "--tlskey", "fixtures/https/server-rogue-key.pem", "-H", testDaemonRogueHTTPSAddr); err != nil { - c.Fatalf("Could not start daemon with busybox: %v", err) - } - - args := []string{ - "--host", testDaemonRogueHTTPSAddr, - "--tlsverify", "--tlscacert", "fixtures/https/ca.pem", - "--tlscert", "fixtures/https/client-rogue-cert.pem", - "--tlskey", "fixtures/https/client-rogue-key.pem", - "info", - } - out, err := s.d.Cmd(args...) - if err == nil || !strings.Contains(out, errCaUnknown) { - c.Fatalf("Expected err: %s, got instead: %s and output: %s", errCaUnknown, err, out) - } -} - -func pingContainers(c *check.C, d *Daemon, expectFailure bool) { - var dargs []string - if d != nil { - dargs = []string{"--host", d.sock()} - } - - args := append(dargs, "run", "-d", "--name", "container1", "busybox", "top") - dockerCmd(c, args...) - - args = append(dargs, "run", "--rm", "--link", "container1:alias1", "busybox", "sh", "-c") - pingCmd := "ping -c 1 %s -W 1" - args = append(args, fmt.Sprintf(pingCmd, "alias1")) - _, _, err := dockerCmdWithError(args...) - - if expectFailure { - c.Assert(err, check.NotNil) - } else { - c.Assert(err, check.IsNil) - } - - args = append(dargs, "rm", "-f", "container1") - dockerCmd(c, args...) -} - -func (s *DockerDaemonSuite) TestDaemonRestartWithSocketAsVolume(c *check.C) { - c.Assert(s.d.StartWithBusybox(), check.IsNil) - - socket := filepath.Join(s.d.folder, "docker.sock") - - out, err := s.d.Cmd("run", "--restart=always", "-v", socket+":/sock", "busybox") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - c.Assert(s.d.Restart(), check.IsNil) -} - -// os.Kill should kill daemon ungracefully, leaving behind container mounts. -// A subsequent daemon restart shoud clean up said mounts. -func (s *DockerDaemonSuite) TestCleanupMountsAfterDaemonAndContainerKill(c *check.C) { - c.Assert(s.d.StartWithBusybox(), check.IsNil) - - out, err := s.d.Cmd("run", "-d", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - id := strings.TrimSpace(out) - c.Assert(s.d.cmd.Process.Signal(os.Kill), check.IsNil) - mountOut, err := ioutil.ReadFile("/proc/self/mountinfo") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", mountOut)) - - // container mounts should exist even after daemon has crashed. - comment := check.Commentf("%s should stay mounted from older daemon start:\nDaemon root repository %s\n%s", id, s.d.folder, mountOut) - c.Assert(strings.Contains(string(mountOut), id), check.Equals, true, comment) - - // kill the container - runCmd := exec.Command(ctrBinary, "--address", "unix:///var/run/docker/libcontainerd/docker-containerd.sock", "containers", "kill", id) - if out, ec, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("Failed to run ctr, ExitCode: %d, err: %v output: %s id: %s\n", ec, err, out, id) - } - - // restart daemon. - if err := s.d.Restart(); err != nil { - c.Fatal(err) - } - - // Now, container mounts should be gone. - mountOut, err = ioutil.ReadFile("/proc/self/mountinfo") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", mountOut)) - comment = check.Commentf("%s is still mounted from older daemon start:\nDaemon root repository %s\n%s", id, s.d.folder, mountOut) - c.Assert(strings.Contains(string(mountOut), id), check.Equals, false, comment) -} - -// os.Interrupt should perform a graceful daemon shutdown and hence cleanup mounts. -func (s *DockerDaemonSuite) TestCleanupMountsAfterGracefulShutdown(c *check.C) { - c.Assert(s.d.StartWithBusybox(), check.IsNil) - - out, err := s.d.Cmd("run", "-d", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - id := strings.TrimSpace(out) - - // Send SIGINT and daemon should clean up - c.Assert(s.d.cmd.Process.Signal(os.Interrupt), check.IsNil) - // Wait for the daemon to stop. - c.Assert(<-s.d.wait, checker.IsNil) - - mountOut, err := ioutil.ReadFile("/proc/self/mountinfo") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", mountOut)) - - comment := check.Commentf("%s is still mounted from older daemon start:\nDaemon root repository %s\n%s", id, s.d.folder, mountOut) - c.Assert(strings.Contains(string(mountOut), id), check.Equals, false, comment) -} - -func (s *DockerDaemonSuite) TestRunContainerWithBridgeNone(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - c.Assert(s.d.StartWithBusybox("-b", "none"), check.IsNil) - - out, err := s.d.Cmd("run", "--rm", "busybox", "ip", "l") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - c.Assert(strings.Contains(out, "eth0"), check.Equals, false, - check.Commentf("There shouldn't be eth0 in container in default(bridge) mode when bridge network is disabled: %s", out)) - - out, err = s.d.Cmd("run", "--rm", "--net=bridge", "busybox", "ip", "l") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - c.Assert(strings.Contains(out, "eth0"), check.Equals, false, - check.Commentf("There shouldn't be eth0 in container in bridge mode when bridge network is disabled: %s", out)) - // the extra grep and awk clean up the output of `ip` to only list the number and name of - // interfaces, allowing for different versions of ip (e.g. inside and outside the container) to - // be used while still verifying that the interface list is the exact same - cmd := exec.Command("sh", "-c", "ip l | grep -E '^[0-9]+:' | awk -F: ' { print $1\":\"$2 } '") - stdout := bytes.NewBuffer(nil) - cmd.Stdout = stdout - if err := cmd.Run(); err != nil { - c.Fatal("Failed to get host network interface") - } - out, err = s.d.Cmd("run", "--rm", "--net=host", "busybox", "sh", "-c", "ip l | grep -E '^[0-9]+:' | awk -F: ' { print $1\":\"$2 } '") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - c.Assert(out, check.Equals, fmt.Sprintf("%s", stdout), - check.Commentf("The network interfaces in container should be the same with host when --net=host when bridge network is disabled: %s", out)) -} - -func (s *DockerDaemonSuite) TestDaemonRestartWithContainerRunning(t *check.C) { - if err := s.d.StartWithBusybox(); err != nil { - t.Fatal(err) - } - if out, err := s.d.Cmd("run", "-d", "--name", "test", "busybox", "top"); err != nil { - t.Fatal(out, err) - } - - if err := s.d.Restart(); err != nil { - t.Fatal(err) - } - // Container 'test' should be removed without error - if out, err := s.d.Cmd("rm", "test"); err != nil { - t.Fatal(out, err) - } -} - -func (s *DockerDaemonSuite) TestDaemonRestartCleanupNetns(c *check.C) { - if err := s.d.StartWithBusybox(); err != nil { - c.Fatal(err) - } - out, err := s.d.Cmd("run", "--name", "netns", "-d", "busybox", "top") - if err != nil { - c.Fatal(out, err) - } - - // Get sandbox key via inspect - out, err = s.d.Cmd("inspect", "--format", "'{{.NetworkSettings.SandboxKey}}'", "netns") - if err != nil { - c.Fatalf("Error inspecting container: %s, %v", out, err) - } - fileName := strings.Trim(out, " \r\n'") - - if out, err := s.d.Cmd("stop", "netns"); err != nil { - c.Fatal(out, err) - } - - // Test if the file still exists - out, _, err = runCommandWithOutput(exec.Command("stat", "-c", "%n", fileName)) - out = strings.TrimSpace(out) - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - c.Assert(out, check.Equals, fileName, check.Commentf("Output: %s", out)) - - // Remove the container and restart the daemon - if out, err := s.d.Cmd("rm", "netns"); err != nil { - c.Fatal(out, err) - } - - if err := s.d.Restart(); err != nil { - c.Fatal(err) - } - - // Test again and see now the netns file does not exist - out, _, err = runCommandWithOutput(exec.Command("stat", "-c", "%n", fileName)) - out = strings.TrimSpace(out) - c.Assert(err, check.Not(check.IsNil), check.Commentf("Output: %s", out)) -} - -// tests regression detailed in #13964 where DOCKER_TLS_VERIFY env is ignored -func (s *DockerDaemonSuite) TestDaemonTLSVerifyIssue13964(c *check.C) { - host := "tcp://localhost:4271" - c.Assert(s.d.Start("-H", host), check.IsNil) - cmd := exec.Command(dockerBinary, "-H", host, "info") - cmd.Env = []string{"DOCKER_TLS_VERIFY=1", "DOCKER_CERT_PATH=fixtures/https"} - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, check.Not(check.IsNil), check.Commentf("%s", out)) - c.Assert(strings.Contains(out, "error during connect"), check.Equals, true) - -} - -func setupV6(c *check.C) { - // Hack to get the right IPv6 address on docker0, which has already been created - result := icmd.RunCommand("ip", "addr", "add", "fe80::1/64", "dev", "docker0") - result.Assert(c, icmd.Expected{}) -} - -func teardownV6(c *check.C) { - result := icmd.RunCommand("ip", "addr", "del", "fe80::1/64", "dev", "docker0") - result.Assert(c, icmd.Expected{}) -} - -func (s *DockerDaemonSuite) TestDaemonRestartWithContainerWithRestartPolicyAlways(c *check.C) { - c.Assert(s.d.StartWithBusybox(), check.IsNil) - - out, err := s.d.Cmd("run", "-d", "--restart", "always", "busybox", "top") - c.Assert(err, check.IsNil) - id := strings.TrimSpace(out) - - _, err = s.d.Cmd("stop", id) - c.Assert(err, check.IsNil) - _, err = s.d.Cmd("wait", id) - c.Assert(err, check.IsNil) - - out, err = s.d.Cmd("ps", "-q") - c.Assert(err, check.IsNil) - c.Assert(out, check.Equals, "") - - c.Assert(s.d.Restart(), check.IsNil) - - out, err = s.d.Cmd("ps", "-q") - c.Assert(err, check.IsNil) - c.Assert(strings.TrimSpace(out), check.Equals, id[:12]) -} - -func (s *DockerDaemonSuite) TestDaemonWideLogConfig(c *check.C) { - if err := s.d.StartWithBusybox("--log-opt=max-size=1k"); err != nil { - c.Fatal(err) - } - name := "logtest" - out, err := s.d.Cmd("run", "-d", "--log-opt=max-file=5", "--name", name, "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf("Output: %s, err: %v", out, err)) - - out, err = s.d.Cmd("inspect", "-f", "{{ .HostConfig.LogConfig.Config }}", name) - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - c.Assert(out, checker.Contains, "max-size:1k") - c.Assert(out, checker.Contains, "max-file:5") - - out, err = s.d.Cmd("inspect", "-f", "{{ .HostConfig.LogConfig.Type }}", name) - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - c.Assert(strings.TrimSpace(out), checker.Equals, "json-file") -} - -func (s *DockerDaemonSuite) TestDaemonRestartWithPausedContainer(c *check.C) { - if err := s.d.StartWithBusybox(); err != nil { - c.Fatal(err) - } - if out, err := s.d.Cmd("run", "-i", "-d", "--name", "test", "busybox", "top"); err != nil { - c.Fatal(err, out) - } - if out, err := s.d.Cmd("pause", "test"); err != nil { - c.Fatal(err, out) - } - if err := s.d.Restart(); err != nil { - c.Fatal(err) - } - - errchan := make(chan error) - go func() { - out, err := s.d.Cmd("start", "test") - if err != nil { - errchan <- fmt.Errorf("%v:\n%s", err, out) - } - name := strings.TrimSpace(out) - if name != "test" { - errchan <- fmt.Errorf("Paused container start error on docker daemon restart, expected 'test' but got '%s'", name) - } - close(errchan) - }() - - select { - case <-time.After(5 * time.Second): - c.Fatal("Waiting on start a container timed out") - case err := <-errchan: - if err != nil { - c.Fatal(err) - } - } -} - -func (s *DockerDaemonSuite) TestDaemonRestartRmVolumeInUse(c *check.C) { - c.Assert(s.d.StartWithBusybox(), check.IsNil) - - out, err := s.d.Cmd("create", "-v", "test:/foo", "busybox") - c.Assert(err, check.IsNil, check.Commentf(out)) - - c.Assert(s.d.Restart(), check.IsNil) - - out, err = s.d.Cmd("volume", "rm", "test") - c.Assert(err, check.NotNil, check.Commentf("should not be able to remove in use volume after daemon restart")) - c.Assert(out, checker.Contains, "in use") -} - -func (s *DockerDaemonSuite) TestDaemonRestartLocalVolumes(c *check.C) { - c.Assert(s.d.Start(), check.IsNil) - - _, err := s.d.Cmd("volume", "create", "test") - c.Assert(err, check.IsNil) - c.Assert(s.d.Restart(), check.IsNil) - - _, err = s.d.Cmd("volume", "inspect", "test") - c.Assert(err, check.IsNil) -} - -func (s *DockerDaemonSuite) TestDaemonCorruptedLogDriverAddress(c *check.C) { - c.Assert(s.d.Start("--log-driver=syslog", "--log-opt", "syslog-address=corrupted:42"), check.NotNil) - expected := "Failed to set log opts: syslog-address should be in form proto://address" - runCmd := exec.Command("grep", expected, s.d.LogFileName()) - if out, _, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("Expected %q message; but doesn't exist in log: %q, err: %v", expected, out, err) - } -} - -func (s *DockerDaemonSuite) TestDaemonCorruptedFluentdAddress(c *check.C) { - c.Assert(s.d.Start("--log-driver=fluentd", "--log-opt", "fluentd-address=corrupted:c"), check.NotNil) - expected := "Failed to set log opts: invalid fluentd-address corrupted:c: " - runCmd := exec.Command("grep", expected, s.d.LogFileName()) - if out, _, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("Expected %q message; but doesn't exist in log: %q, err: %v", expected, out, err) - } -} - -func (s *DockerDaemonSuite) TestDaemonStartWithoutHost(c *check.C) { - s.d.useDefaultHost = true - defer func() { - s.d.useDefaultHost = false - }() - c.Assert(s.d.Start(), check.IsNil) -} - -func (s *DockerDaemonSuite) TestDaemonStartWithDefalutTLSHost(c *check.C) { - s.d.useDefaultTLSHost = true - defer func() { - s.d.useDefaultTLSHost = false - }() - if err := s.d.Start( - "--tlsverify", - "--tlscacert", "fixtures/https/ca.pem", - "--tlscert", "fixtures/https/server-cert.pem", - "--tlskey", "fixtures/https/server-key.pem"); err != nil { - c.Fatalf("Could not start daemon: %v", err) - } - - // The client with --tlsverify should also use default host localhost:2376 - tmpHost := os.Getenv("DOCKER_HOST") - defer func() { - os.Setenv("DOCKER_HOST", tmpHost) - }() - - os.Setenv("DOCKER_HOST", "") - - out, _ := dockerCmd( - c, - "--tlsverify", - "--tlscacert", "fixtures/https/ca.pem", - "--tlscert", "fixtures/https/client-cert.pem", - "--tlskey", "fixtures/https/client-key.pem", - "version", - ) - if !strings.Contains(out, "Server") { - c.Fatalf("docker version should return information of server side") - } -} - -func (s *DockerDaemonSuite) TestBridgeIPIsExcludedFromAllocatorPool(c *check.C) { - defaultNetworkBridge := "docker0" - deleteInterface(c, defaultNetworkBridge) - - bridgeIP := "192.169.1.1" - bridgeRange := bridgeIP + "/30" - - err := s.d.StartWithBusybox("--bip", bridgeRange) - c.Assert(err, check.IsNil) - defer s.d.Restart() - - var cont int - for { - contName := fmt.Sprintf("container%d", cont) - _, err = s.d.Cmd("run", "--name", contName, "-d", "busybox", "/bin/sleep", "2") - if err != nil { - // pool exhausted - break - } - ip, err := s.d.Cmd("inspect", "--format", "'{{.NetworkSettings.IPAddress}}'", contName) - c.Assert(err, check.IsNil) - - c.Assert(ip, check.Not(check.Equals), bridgeIP) - cont++ - } -} - -// Test daemon for no space left on device error -func (s *DockerDaemonSuite) TestDaemonNoSpaceLeftOnDeviceError(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux, Network) - - testDir, err := ioutil.TempDir("", "no-space-left-on-device-test") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(testDir) - c.Assert(mount.MakeRShared(testDir), checker.IsNil) - defer mount.Unmount(testDir) - - // create a 2MiB image and mount it as graph root - // Why in a container? Because `mount` sometimes behaves weirdly and often fails outright on this test in debian:jessie (which is what the test suite runs under if run from the Makefile) - dockerCmd(c, "run", "--rm", "-v", testDir+":/test", "busybox", "sh", "-c", "dd of=/test/testfs.img bs=1M seek=2 count=0") - out, _, err := runCommandWithOutput(exec.Command("mkfs.ext4", "-F", filepath.Join(testDir, "testfs.img"))) // `mkfs.ext4` is not in busybox - c.Assert(err, checker.IsNil, check.Commentf(out)) - - cmd := exec.Command("losetup", "-f", "--show", filepath.Join(testDir, "testfs.img")) - loout, err := cmd.CombinedOutput() - c.Assert(err, checker.IsNil) - loopname := strings.TrimSpace(string(loout)) - defer exec.Command("losetup", "-d", loopname).Run() - - dockerCmd(c, "run", "--privileged", "--rm", "-v", testDir+":/test:shared", "busybox", "sh", "-c", fmt.Sprintf("mkdir -p /test/test-mount && mount -t ext4 -no loop,rw %v /test/test-mount", loopname)) - defer mount.Unmount(filepath.Join(testDir, "test-mount")) - - err = s.d.Start("--graph", filepath.Join(testDir, "test-mount")) - defer s.d.Stop() - c.Assert(err, check.IsNil) - - // pull a repository large enough to fill the mount point - pullOut, err := s.d.Cmd("pull", "registry:2") - c.Assert(err, checker.NotNil, check.Commentf(pullOut)) - c.Assert(pullOut, checker.Contains, "no space left on device") -} - -// Test daemon restart with container links + auto restart -func (s *DockerDaemonSuite) TestDaemonRestartContainerLinksRestart(c *check.C) { - err := s.d.StartWithBusybox() - c.Assert(err, checker.IsNil) - - parent1Args := []string{} - parent2Args := []string{} - wg := sync.WaitGroup{} - maxChildren := 10 - chErr := make(chan error, maxChildren) - - for i := 0; i < maxChildren; i++ { - wg.Add(1) - name := fmt.Sprintf("test%d", i) - - if i < maxChildren/2 { - parent1Args = append(parent1Args, []string{"--link", name}...) - } else { - parent2Args = append(parent2Args, []string{"--link", name}...) - } - - go func() { - _, err = s.d.Cmd("run", "-d", "--name", name, "--restart=always", "busybox", "top") - chErr <- err - wg.Done() - }() - } - - wg.Wait() - close(chErr) - for err := range chErr { - c.Assert(err, check.IsNil) - } - - parent1Args = append([]string{"run", "-d"}, parent1Args...) - parent1Args = append(parent1Args, []string{"--name=parent1", "--restart=always", "busybox", "top"}...) - parent2Args = append([]string{"run", "-d"}, parent2Args...) - parent2Args = append(parent2Args, []string{"--name=parent2", "--restart=always", "busybox", "top"}...) - - _, err = s.d.Cmd(parent1Args...) - c.Assert(err, check.IsNil) - _, err = s.d.Cmd(parent2Args...) - c.Assert(err, check.IsNil) - - err = s.d.Stop() - c.Assert(err, check.IsNil) - // clear the log file -- we don't need any of it but may for the next part - // can ignore the error here, this is just a cleanup - os.Truncate(s.d.LogFileName(), 0) - err = s.d.Start() - c.Assert(err, check.IsNil) - - for _, num := range []string{"1", "2"} { - out, err := s.d.Cmd("inspect", "-f", "{{ .State.Running }}", "parent"+num) - c.Assert(err, check.IsNil) - if strings.TrimSpace(out) != "true" { - log, _ := ioutil.ReadFile(s.d.LogFileName()) - c.Fatalf("parent container is not running\n%s", string(log)) - } - } -} - -func (s *DockerDaemonSuite) TestDaemonCgroupParent(c *check.C) { - testRequires(c, DaemonIsLinux) - - cgroupParent := "test" - name := "cgroup-test" - - err := s.d.StartWithBusybox("--cgroup-parent", cgroupParent) - c.Assert(err, check.IsNil) - defer s.d.Restart() - - out, err := s.d.Cmd("run", "--name", name, "busybox", "cat", "/proc/self/cgroup") - c.Assert(err, checker.IsNil) - cgroupPaths := parseCgroupPaths(string(out)) - c.Assert(len(cgroupPaths), checker.Not(checker.Equals), 0, check.Commentf("unexpected output - %q", string(out))) - out, err = s.d.Cmd("inspect", "-f", "{{.Id}}", name) - c.Assert(err, checker.IsNil) - id := strings.TrimSpace(string(out)) - expectedCgroup := path.Join(cgroupParent, id) - found := false - for _, path := range cgroupPaths { - if strings.HasSuffix(path, expectedCgroup) { - found = true - break - } - } - c.Assert(found, checker.True, check.Commentf("Cgroup path for container (%s) doesn't found in cgroups file: %s", expectedCgroup, cgroupPaths)) -} - -func (s *DockerDaemonSuite) TestDaemonRestartWithLinks(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support links - err := s.d.StartWithBusybox() - c.Assert(err, check.IsNil) - - out, err := s.d.Cmd("run", "-d", "--name=test", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("run", "--name=test2", "--link", "test:abc", "busybox", "sh", "-c", "ping -c 1 -w 1 abc") - c.Assert(err, check.IsNil, check.Commentf(out)) - - c.Assert(s.d.Restart(), check.IsNil) - - // should fail since test is not running yet - out, err = s.d.Cmd("start", "test2") - c.Assert(err, check.NotNil, check.Commentf(out)) - - out, err = s.d.Cmd("start", "test") - c.Assert(err, check.IsNil, check.Commentf(out)) - out, err = s.d.Cmd("start", "-a", "test2") - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(strings.Contains(out, "1 packets transmitted, 1 packets received"), check.Equals, true, check.Commentf(out)) -} - -func (s *DockerDaemonSuite) TestDaemonRestartWithNames(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support links - err := s.d.StartWithBusybox() - c.Assert(err, check.IsNil) - - out, err := s.d.Cmd("create", "--name=test", "busybox") - c.Assert(err, check.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("run", "-d", "--name=test2", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf(out)) - test2ID := strings.TrimSpace(out) - - out, err = s.d.Cmd("run", "-d", "--name=test3", "--link", "test2:abc", "busybox", "top") - test3ID := strings.TrimSpace(out) - - c.Assert(s.d.Restart(), check.IsNil) - - out, err = s.d.Cmd("create", "--name=test", "busybox") - c.Assert(err, check.NotNil, check.Commentf("expected error trying to create container with duplicate name")) - // this one is no longer needed, removing simplifies the remainder of the test - out, err = s.d.Cmd("rm", "-f", "test") - c.Assert(err, check.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("ps", "-a", "--no-trunc") - c.Assert(err, check.IsNil, check.Commentf(out)) - - lines := strings.Split(strings.TrimSpace(out), "\n")[1:] - - test2validated := false - test3validated := false - for _, line := range lines { - fields := strings.Fields(line) - names := fields[len(fields)-1] - switch fields[0] { - case test2ID: - c.Assert(names, check.Equals, "test2,test3/abc") - test2validated = true - case test3ID: - c.Assert(names, check.Equals, "test3") - test3validated = true - } - } - - c.Assert(test2validated, check.Equals, true) - c.Assert(test3validated, check.Equals, true) -} - -// TestDaemonRestartWithKilledRunningContainer requires live restore of running containers -func (s *DockerDaemonSuite) TestDaemonRestartWithKilledRunningContainer(t *check.C) { - // TODO(mlaventure): Not sure what would the exit code be on windows - testRequires(t, DaemonIsLinux) - if err := s.d.StartWithBusybox(); err != nil { - t.Fatal(err) - } - - cid, err := s.d.Cmd("run", "-d", "--name", "test", "busybox", "top") - defer s.d.Stop() - if err != nil { - t.Fatal(cid, err) - } - cid = strings.TrimSpace(cid) - - pid, err := s.d.Cmd("inspect", "-f", "{{.State.Pid}}", cid) - t.Assert(err, check.IsNil) - pid = strings.TrimSpace(pid) - - // Kill the daemon - if err := s.d.Kill(); err != nil { - t.Fatal(err) - } - - // kill the container - runCmd := exec.Command(ctrBinary, "--address", "unix:///var/run/docker/libcontainerd/docker-containerd.sock", "containers", "kill", cid) - if out, ec, err := runCommandWithOutput(runCmd); err != nil { - t.Fatalf("Failed to run ctr, ExitCode: %d, err: '%v' output: '%s' cid: '%s'\n", ec, err, out, cid) - } - - // Give time to containerd to process the command if we don't - // the exit event might be received after we do the inspect - pidCmd := exec.Command("kill", "-0", pid) - _, ec, _ := runCommandWithOutput(pidCmd) - for ec == 0 { - time.Sleep(1 * time.Second) - _, ec, _ = runCommandWithOutput(pidCmd) - } - - // restart the daemon - if err := s.d.Start(); err != nil { - t.Fatal(err) - } - - // Check that we've got the correct exit code - out, err := s.d.Cmd("inspect", "-f", "{{.State.ExitCode}}", cid) - t.Assert(err, check.IsNil) - - out = strings.TrimSpace(out) - if out != "143" { - t.Fatalf("Expected exit code '%s' got '%s' for container '%s'\n", "143", out, cid) - } - -} - -// os.Kill should kill daemon ungracefully, leaving behind live containers. -// The live containers should be known to the restarted daemon. Stopping -// them now, should remove the mounts. -func (s *DockerDaemonSuite) TestCleanupMountsAfterDaemonCrash(c *check.C) { - testRequires(c, DaemonIsLinux) - c.Assert(s.d.StartWithBusybox("--live-restore"), check.IsNil) - - out, err := s.d.Cmd("run", "-d", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - id := strings.TrimSpace(out) - - c.Assert(s.d.cmd.Process.Signal(os.Kill), check.IsNil) - mountOut, err := ioutil.ReadFile("/proc/self/mountinfo") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", mountOut)) - - // container mounts should exist even after daemon has crashed. - comment := check.Commentf("%s should stay mounted from older daemon start:\nDaemon root repository %s\n%s", id, s.d.folder, mountOut) - c.Assert(strings.Contains(string(mountOut), id), check.Equals, true, comment) - - // restart daemon. - if err := s.d.Restart("--live-restore"); err != nil { - c.Fatal(err) - } - - // container should be running. - out, err = s.d.Cmd("inspect", "--format={{.State.Running}}", id) - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - out = strings.TrimSpace(out) - if out != "true" { - c.Fatalf("Container %s expected to stay alive after daemon restart", id) - } - - // 'docker stop' should work. - out, err = s.d.Cmd("stop", id) - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - - // Now, container mounts should be gone. - mountOut, err = ioutil.ReadFile("/proc/self/mountinfo") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", mountOut)) - comment = check.Commentf("%s is still mounted from older daemon start:\nDaemon root repository %s\n%s", id, s.d.folder, mountOut) - c.Assert(strings.Contains(string(mountOut), id), check.Equals, false, comment) -} - -// TestDaemonRestartWithUnpausedRunningContainer requires live restore of running containers. -func (s *DockerDaemonSuite) TestDaemonRestartWithUnpausedRunningContainer(t *check.C) { - // TODO(mlaventure): Not sure what would the exit code be on windows - testRequires(t, DaemonIsLinux) - if err := s.d.StartWithBusybox("--live-restore"); err != nil { - t.Fatal(err) - } - - cid, err := s.d.Cmd("run", "-d", "--name", "test", "busybox", "top") - defer s.d.Stop() - if err != nil { - t.Fatal(cid, err) - } - cid = strings.TrimSpace(cid) - - pid, err := s.d.Cmd("inspect", "-f", "{{.State.Pid}}", cid) - t.Assert(err, check.IsNil) - - // pause the container - if _, err := s.d.Cmd("pause", cid); err != nil { - t.Fatal(cid, err) - } - - // Kill the daemon - if err := s.d.Kill(); err != nil { - t.Fatal(err) - } - - // resume the container - result := icmd.RunCommand( - ctrBinary, - "--address", "unix:///var/run/docker/libcontainerd/docker-containerd.sock", - "containers", "resume", cid) - t.Assert(result, icmd.Matches, icmd.Success) - - // Give time to containerd to process the command if we don't - // the resume event might be received after we do the inspect - waitAndAssert(t, defaultReconciliationTimeout, func(*check.C) (interface{}, check.CommentInterface) { - result := icmd.RunCommand("kill", "-0", strings.TrimSpace(pid)) - return result.ExitCode, nil - }, checker.Equals, 0) - - // restart the daemon - if err := s.d.Start("--live-restore"); err != nil { - t.Fatal(err) - } - - // Check that we've got the correct status - out, err := s.d.Cmd("inspect", "-f", "{{.State.Status}}", cid) - t.Assert(err, check.IsNil) - - out = strings.TrimSpace(out) - if out != "running" { - t.Fatalf("Expected exit code '%s' got '%s' for container '%s'\n", "running", out, cid) - } - if _, err := s.d.Cmd("kill", cid); err != nil { - t.Fatal(err) - } -} - -// TestRunLinksChanged checks that creating a new container with the same name does not update links -// this ensures that the old, pre gh#16032 functionality continues on -func (s *DockerDaemonSuite) TestRunLinksChanged(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support links - err := s.d.StartWithBusybox() - c.Assert(err, check.IsNil) - - out, err := s.d.Cmd("run", "-d", "--name=test", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("run", "--name=test2", "--link=test:abc", "busybox", "sh", "-c", "ping -c 1 abc") - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "1 packets transmitted, 1 packets received") - - out, err = s.d.Cmd("rm", "-f", "test") - c.Assert(err, check.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("run", "-d", "--name=test", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf(out)) - out, err = s.d.Cmd("start", "-a", "test2") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, check.Not(checker.Contains), "1 packets transmitted, 1 packets received") - - err = s.d.Restart() - c.Assert(err, check.IsNil) - out, err = s.d.Cmd("start", "-a", "test2") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, check.Not(checker.Contains), "1 packets transmitted, 1 packets received") -} - -func (s *DockerDaemonSuite) TestDaemonStartWithoutColors(c *check.C) { - testRequires(c, DaemonIsLinux, NotPpc64le) - - infoLog := "\x1b[34mINFO\x1b" - - p, tty, err := pty.Open() - c.Assert(err, checker.IsNil) - defer func() { - tty.Close() - p.Close() - }() - - b := bytes.NewBuffer(nil) - go io.Copy(b, p) - - // Enable coloring explicitly - s.d.StartWithLogFile(tty, "--raw-logs=false") - s.d.Stop() - c.Assert(b.String(), checker.Contains, infoLog) - - b.Reset() - - // Disable coloring explicitly - s.d.StartWithLogFile(tty, "--raw-logs=true") - s.d.Stop() - c.Assert(b.String(), check.Not(checker.Contains), infoLog) -} - -func (s *DockerDaemonSuite) TestDaemonDebugLog(c *check.C) { - testRequires(c, DaemonIsLinux, NotPpc64le) - - debugLog := "\x1b[37mDEBU\x1b" - - p, tty, err := pty.Open() - c.Assert(err, checker.IsNil) - defer func() { - tty.Close() - p.Close() - }() - - b := bytes.NewBuffer(nil) - go io.Copy(b, p) - - s.d.StartWithLogFile(tty, "--debug") - s.d.Stop() - c.Assert(b.String(), checker.Contains, debugLog) -} - -func (s *DockerDaemonSuite) TestDaemonDiscoveryBackendConfigReload(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - // daemon config file - daemonConfig := `{ "debug" : false }` - configFile, err := ioutil.TempFile("", "test-daemon-discovery-backend-config-reload-config") - c.Assert(err, checker.IsNil, check.Commentf("could not create temp file for config reload")) - configFilePath := configFile.Name() - defer func() { - configFile.Close() - os.RemoveAll(configFile.Name()) - }() - - _, err = configFile.Write([]byte(daemonConfig)) - c.Assert(err, checker.IsNil) - - // --log-level needs to be set so that d.Start() doesn't add --debug causing - // a conflict with the config - err = s.d.Start("--config-file", configFilePath, "--log-level=info") - c.Assert(err, checker.IsNil) - - // daemon config file - daemonConfig = `{ - "cluster-store": "consul://consuladdr:consulport/some/path", - "cluster-advertise": "192.168.56.100:0", - "debug" : false - }` - - err = configFile.Truncate(0) - c.Assert(err, checker.IsNil) - _, err = configFile.Seek(0, os.SEEK_SET) - c.Assert(err, checker.IsNil) - - _, err = configFile.Write([]byte(daemonConfig)) - c.Assert(err, checker.IsNil) - - err = s.d.reloadConfig() - c.Assert(err, checker.IsNil, check.Commentf("error reloading daemon config")) - - out, err := s.d.Cmd("info") - c.Assert(err, checker.IsNil) - - c.Assert(out, checker.Contains, fmt.Sprintf("Cluster Store: consul://consuladdr:consulport/some/path")) - c.Assert(out, checker.Contains, fmt.Sprintf("Cluster Advertise: 192.168.56.100:0")) -} - -// Test for #21956 -func (s *DockerDaemonSuite) TestDaemonLogOptions(c *check.C) { - err := s.d.StartWithBusybox("--log-driver=syslog", "--log-opt=syslog-address=udp://127.0.0.1:514") - c.Assert(err, check.IsNil) - - out, err := s.d.Cmd("run", "-d", "--log-driver=json-file", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf(out)) - id := strings.TrimSpace(out) - - out, err = s.d.Cmd("inspect", "--format='{{.HostConfig.LogConfig}}'", id) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "{json-file map[]}") -} - -// Test case for #20936, #22443 -func (s *DockerDaemonSuite) TestDaemonMaxConcurrency(c *check.C) { - c.Assert(s.d.Start("--max-concurrent-uploads=6", "--max-concurrent-downloads=8"), check.IsNil) - - expectedMaxConcurrentUploads := `level=debug msg="Max Concurrent Uploads: 6"` - expectedMaxConcurrentDownloads := `level=debug msg="Max Concurrent Downloads: 8"` - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentUploads) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentDownloads) -} - -// Test case for #20936, #22443 -func (s *DockerDaemonSuite) TestDaemonMaxConcurrencyWithConfigFile(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - // daemon config file - configFilePath := "test.json" - configFile, err := os.Create(configFilePath) - c.Assert(err, checker.IsNil) - defer os.Remove(configFilePath) - - daemonConfig := `{ "max-concurrent-downloads" : 8 }` - fmt.Fprintf(configFile, "%s", daemonConfig) - configFile.Close() - c.Assert(s.d.Start(fmt.Sprintf("--config-file=%s", configFilePath)), check.IsNil) - - expectedMaxConcurrentUploads := `level=debug msg="Max Concurrent Uploads: 5"` - expectedMaxConcurrentDownloads := `level=debug msg="Max Concurrent Downloads: 8"` - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentUploads) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentDownloads) - - configFile, err = os.Create(configFilePath) - c.Assert(err, checker.IsNil) - daemonConfig = `{ "max-concurrent-uploads" : 7, "max-concurrent-downloads" : 9 }` - fmt.Fprintf(configFile, "%s", daemonConfig) - configFile.Close() - - syscall.Kill(s.d.cmd.Process.Pid, syscall.SIGHUP) - - time.Sleep(3 * time.Second) - - expectedMaxConcurrentUploads = `level=debug msg="Reset Max Concurrent Uploads: 7"` - expectedMaxConcurrentDownloads = `level=debug msg="Reset Max Concurrent Downloads: 9"` - content, _ = ioutil.ReadFile(s.d.logFile.Name()) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentUploads) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentDownloads) -} - -// Test case for #20936, #22443 -func (s *DockerDaemonSuite) TestDaemonMaxConcurrencyWithConfigFileReload(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - // daemon config file - configFilePath := "test.json" - configFile, err := os.Create(configFilePath) - c.Assert(err, checker.IsNil) - defer os.Remove(configFilePath) - - daemonConfig := `{ "max-concurrent-uploads" : null }` - fmt.Fprintf(configFile, "%s", daemonConfig) - configFile.Close() - c.Assert(s.d.Start(fmt.Sprintf("--config-file=%s", configFilePath)), check.IsNil) - - expectedMaxConcurrentUploads := `level=debug msg="Max Concurrent Uploads: 5"` - expectedMaxConcurrentDownloads := `level=debug msg="Max Concurrent Downloads: 3"` - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentUploads) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentDownloads) - - configFile, err = os.Create(configFilePath) - c.Assert(err, checker.IsNil) - daemonConfig = `{ "max-concurrent-uploads" : 1, "max-concurrent-downloads" : null }` - fmt.Fprintf(configFile, "%s", daemonConfig) - configFile.Close() - - syscall.Kill(s.d.cmd.Process.Pid, syscall.SIGHUP) - - time.Sleep(3 * time.Second) - - expectedMaxConcurrentUploads = `level=debug msg="Reset Max Concurrent Uploads: 1"` - expectedMaxConcurrentDownloads = `level=debug msg="Reset Max Concurrent Downloads: 3"` - content, _ = ioutil.ReadFile(s.d.logFile.Name()) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentUploads) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentDownloads) - - configFile, err = os.Create(configFilePath) - c.Assert(err, checker.IsNil) - daemonConfig = `{ "labels":["foo=bar"] }` - fmt.Fprintf(configFile, "%s", daemonConfig) - configFile.Close() - - syscall.Kill(s.d.cmd.Process.Pid, syscall.SIGHUP) - - time.Sleep(3 * time.Second) - - expectedMaxConcurrentUploads = `level=debug msg="Reset Max Concurrent Uploads: 5"` - expectedMaxConcurrentDownloads = `level=debug msg="Reset Max Concurrent Downloads: 3"` - content, _ = ioutil.ReadFile(s.d.logFile.Name()) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentUploads) - c.Assert(string(content), checker.Contains, expectedMaxConcurrentDownloads) -} - -func (s *DockerDaemonSuite) TestBuildOnDisabledBridgeNetworkDaemon(c *check.C) { - err := s.d.StartWithBusybox("-b=none", "--iptables=false") - c.Assert(err, check.IsNil) - s.d.c.Logf("dockerBinary %s", dockerBinary) - out, code, err := s.d.buildImageWithOut("busyboxs", - `FROM busybox - RUN cat /etc/hosts`, false) - comment := check.Commentf("Failed to build image. output %s, exitCode %d, err %v", out, code, err) - c.Assert(err, check.IsNil, comment) - c.Assert(code, check.Equals, 0, comment) -} - -// Test case for #21976 -func (s *DockerDaemonSuite) TestDaemonDNSInHostMode(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - err := s.d.StartWithBusybox("--dns", "1.2.3.4") - c.Assert(err, checker.IsNil) - - expectedOutput := "nameserver 1.2.3.4" - out, _ := s.d.Cmd("run", "--net=host", "busybox", "cat", "/etc/resolv.conf") - c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out)) -} - -// Test case for #21976 -func (s *DockerDaemonSuite) TestDaemonDNSSearchInHostMode(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - err := s.d.StartWithBusybox("--dns-search", "example.com") - c.Assert(err, checker.IsNil) - - expectedOutput := "search example.com" - out, _ := s.d.Cmd("run", "--net=host", "busybox", "cat", "/etc/resolv.conf") - c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out)) -} - -// Test case for #21976 -func (s *DockerDaemonSuite) TestDaemonDNSOptionsInHostMode(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - err := s.d.StartWithBusybox("--dns-opt", "timeout:3") - c.Assert(err, checker.IsNil) - - expectedOutput := "options timeout:3" - out, _ := s.d.Cmd("run", "--net=host", "busybox", "cat", "/etc/resolv.conf") - c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out)) -} - -func (s *DockerDaemonSuite) TestRunWithRuntimeFromConfigFile(c *check.C) { - conf, err := ioutil.TempFile("", "config-file-") - c.Assert(err, check.IsNil) - configName := conf.Name() - conf.Close() - defer os.Remove(configName) - - config := ` -{ - "runtimes": { - "oci": { - "path": "docker-runc" - }, - "vm": { - "path": "/usr/local/bin/vm-manager", - "runtimeArgs": [ - "--debug" - ] - } - } -} -` - ioutil.WriteFile(configName, []byte(config), 0644) - err = s.d.StartWithBusybox("--config-file", configName) - c.Assert(err, check.IsNil) - - // Run with default runtime - out, err := s.d.Cmd("run", "--rm", "busybox", "ls") - c.Assert(err, check.IsNil, check.Commentf(out)) - - // Run with default runtime explicitly - out, err = s.d.Cmd("run", "--rm", "--runtime=runc", "busybox", "ls") - c.Assert(err, check.IsNil, check.Commentf(out)) - - // Run with oci (same path as default) but keep it around - out, err = s.d.Cmd("run", "--name", "oci-runtime-ls", "--runtime=oci", "busybox", "ls") - c.Assert(err, check.IsNil, check.Commentf(out)) - - // Run with "vm" - out, err = s.d.Cmd("run", "--rm", "--runtime=vm", "busybox", "ls") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "/usr/local/bin/vm-manager: no such file or directory") - - // Reset config to only have the default - config = ` -{ - "runtimes": { - } -} -` - ioutil.WriteFile(configName, []byte(config), 0644) - syscall.Kill(s.d.cmd.Process.Pid, syscall.SIGHUP) - // Give daemon time to reload config - <-time.After(1 * time.Second) - - // Run with default runtime - out, err = s.d.Cmd("run", "--rm", "--runtime=runc", "busybox", "ls") - c.Assert(err, check.IsNil, check.Commentf(out)) - - // Run with "oci" - out, err = s.d.Cmd("run", "--rm", "--runtime=oci", "busybox", "ls") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Unknown runtime specified oci") - - // Start previously created container with oci - out, err = s.d.Cmd("start", "oci-runtime-ls") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Unknown runtime specified oci") - - // Check that we can't override the default runtime - config = ` -{ - "runtimes": { - "runc": { - "path": "my-runc" - } - } -} -` - ioutil.WriteFile(configName, []byte(config), 0644) - syscall.Kill(s.d.cmd.Process.Pid, syscall.SIGHUP) - // Give daemon time to reload config - <-time.After(1 * time.Second) - - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - c.Assert(string(content), checker.Contains, `file configuration validation failed (runtime name 'runc' is reserved)`) - - // Check that we can select a default runtime - config = ` -{ - "default-runtime": "vm", - "runtimes": { - "oci": { - "path": "docker-runc" - }, - "vm": { - "path": "/usr/local/bin/vm-manager", - "runtimeArgs": [ - "--debug" - ] - } - } -} -` - ioutil.WriteFile(configName, []byte(config), 0644) - syscall.Kill(s.d.cmd.Process.Pid, syscall.SIGHUP) - // Give daemon time to reload config - <-time.After(1 * time.Second) - - out, err = s.d.Cmd("run", "--rm", "busybox", "ls") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "/usr/local/bin/vm-manager: no such file or directory") - - // Run with default runtime explicitly - out, err = s.d.Cmd("run", "--rm", "--runtime=runc", "busybox", "ls") - c.Assert(err, check.IsNil, check.Commentf(out)) -} - -func (s *DockerDaemonSuite) TestRunWithRuntimeFromCommandLine(c *check.C) { - err := s.d.StartWithBusybox("--add-runtime", "oci=docker-runc", "--add-runtime", "vm=/usr/local/bin/vm-manager") - c.Assert(err, check.IsNil) - - // Run with default runtime - out, err := s.d.Cmd("run", "--rm", "busybox", "ls") - c.Assert(err, check.IsNil, check.Commentf(out)) - - // Run with default runtime explicitly - out, err = s.d.Cmd("run", "--rm", "--runtime=runc", "busybox", "ls") - c.Assert(err, check.IsNil, check.Commentf(out)) - - // Run with oci (same path as default) but keep it around - out, err = s.d.Cmd("run", "--name", "oci-runtime-ls", "--runtime=oci", "busybox", "ls") - c.Assert(err, check.IsNil, check.Commentf(out)) - - // Run with "vm" - out, err = s.d.Cmd("run", "--rm", "--runtime=vm", "busybox", "ls") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "/usr/local/bin/vm-manager: no such file or directory") - - // Start a daemon without any extra runtimes - s.d.Stop() - err = s.d.StartWithBusybox() - c.Assert(err, check.IsNil) - - // Run with default runtime - out, err = s.d.Cmd("run", "--rm", "--runtime=runc", "busybox", "ls") - c.Assert(err, check.IsNil, check.Commentf(out)) - - // Run with "oci" - out, err = s.d.Cmd("run", "--rm", "--runtime=oci", "busybox", "ls") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Unknown runtime specified oci") - - // Start previously created container with oci - out, err = s.d.Cmd("start", "oci-runtime-ls") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Unknown runtime specified oci") - - // Check that we can't override the default runtime - s.d.Stop() - err = s.d.Start("--add-runtime", "runc=my-runc") - c.Assert(err, check.NotNil) - - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - c.Assert(string(content), checker.Contains, `runtime name 'runc' is reserved`) - - // Check that we can select a default runtime - s.d.Stop() - err = s.d.StartWithBusybox("--default-runtime=vm", "--add-runtime", "oci=docker-runc", "--add-runtime", "vm=/usr/local/bin/vm-manager") - c.Assert(err, check.IsNil) - - out, err = s.d.Cmd("run", "--rm", "busybox", "ls") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "/usr/local/bin/vm-manager: no such file or directory") - - // Run with default runtime explicitly - out, err = s.d.Cmd("run", "--rm", "--runtime=runc", "busybox", "ls") - c.Assert(err, check.IsNil, check.Commentf(out)) -} - -func (s *DockerDaemonSuite) TestDaemonRestartWithAutoRemoveContainer(c *check.C) { - err := s.d.StartWithBusybox() - c.Assert(err, checker.IsNil) - - // top1 will exist after daemon restarts - out, err := s.d.Cmd("run", "-d", "--name", "top1", "busybox:latest", "top") - c.Assert(err, checker.IsNil, check.Commentf("run top1: %v", out)) - // top2 will be removed after daemon restarts - out, err = s.d.Cmd("run", "-d", "--rm", "--name", "top2", "busybox:latest", "top") - c.Assert(err, checker.IsNil, check.Commentf("run top2: %v", out)) - - out, err = s.d.Cmd("ps") - c.Assert(out, checker.Contains, "top1", check.Commentf("top1 should be running")) - c.Assert(out, checker.Contains, "top2", check.Commentf("top2 should be running")) - - // now restart daemon gracefully - err = s.d.Restart() - c.Assert(err, checker.IsNil) - - out, err = s.d.Cmd("ps", "-a") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - c.Assert(out, checker.Contains, "top1", check.Commentf("top1 should exist after daemon restarts")) - c.Assert(out, checker.Not(checker.Contains), "top2", check.Commentf("top2 should be removed after daemon restarts")) -} - -func (s *DockerDaemonSuite) TestDaemonRestartSaveContainerExitCode(c *check.C) { - err := s.d.StartWithBusybox() - c.Assert(err, checker.IsNil) - - containerName := "error-values" - // Make a container with both a non 0 exit code and an error message - out, err := s.d.Cmd("run", "--name", containerName, "busybox", "toto") - c.Assert(err, checker.NotNil) - - // Check that those values were saved on disk - out, err = s.d.Cmd("inspect", "-f", "{{.State.ExitCode}}", containerName) - out = strings.TrimSpace(out) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Equals, "127") - - out, err = s.d.Cmd("inspect", "-f", "{{.State.Error}}", containerName) - out = strings.TrimSpace(out) - c.Assert(err, checker.IsNil) - - // now restart daemon - err = s.d.Restart() - c.Assert(err, checker.IsNil) - - // Check that those values are still around - out, err = s.d.Cmd("inspect", "-f", "{{.State.ExitCode}}", containerName) - out = strings.TrimSpace(out) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Equals, "127") - - out, err = s.d.Cmd("inspect", "-f", "{{.State.Error}}", containerName) - out = strings.TrimSpace(out) - c.Assert(err, checker.IsNil) -} - -func (s *DockerDaemonSuite) TestDaemonBackcompatPre17Volumes(c *check.C) { - testRequires(c, SameHostDaemon) - d := s.d - err := d.StartWithBusybox() - c.Assert(err, checker.IsNil) - - // hack to be able to side-load a container config - out, err := d.Cmd("create", "busybox:latest") - c.Assert(err, checker.IsNil, check.Commentf(out)) - id := strings.TrimSpace(out) - - out, err = d.Cmd("inspect", "--type=image", "--format={{.ID}}", "busybox:latest") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(d.Stop(), checker.IsNil) - <-d.wait - - imageID := strings.TrimSpace(out) - volumeID := stringid.GenerateNonCryptoID() - vfsPath := filepath.Join(d.root, "vfs", "dir", volumeID) - c.Assert(os.MkdirAll(vfsPath, 0755), checker.IsNil) - - config := []byte(` - { - "ID": "` + id + `", - "Name": "hello", - "Driver": "` + d.storageDriver + `", - "Image": "` + imageID + `", - "Config": {"Image": "busybox:latest"}, - "NetworkSettings": {}, - "Volumes": { - "/bar":"/foo", - "/foo": "` + vfsPath + `", - "/quux":"/quux" - }, - "VolumesRW": { - "/bar": true, - "/foo": true, - "/quux": false - } - } - `) - - configPath := filepath.Join(d.root, "containers", id, "config.v2.json") - err = ioutil.WriteFile(configPath, config, 600) - err = d.Start() - c.Assert(err, checker.IsNil) - - out, err = d.Cmd("inspect", "--type=container", "--format={{ json .Mounts }}", id) - c.Assert(err, checker.IsNil, check.Commentf(out)) - type mount struct { - Name string - Source string - Destination string - Driver string - RW bool - } - - ls := []mount{} - err = json.NewDecoder(strings.NewReader(out)).Decode(&ls) - c.Assert(err, checker.IsNil) - - expected := []mount{ - {Source: "/foo", Destination: "/bar", RW: true}, - {Name: volumeID, Destination: "/foo", RW: true}, - {Source: "/quux", Destination: "/quux", RW: false}, - } - c.Assert(ls, checker.HasLen, len(expected)) - - for _, m := range ls { - var matched bool - for _, x := range expected { - if m.Source == x.Source && m.Destination == x.Destination && m.RW == x.RW || m.Name != x.Name { - matched = true - break - } - } - c.Assert(matched, checker.True, check.Commentf("did find match for %+v", m)) - } -} - -func (s *DockerDaemonSuite) TestDaemonWithUserlandProxyPath(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - dockerProxyPath, err := exec.LookPath("docker-proxy") - c.Assert(err, checker.IsNil) - tmpDir, err := ioutil.TempDir("", "test-docker-proxy") - c.Assert(err, checker.IsNil) - - newProxyPath := filepath.Join(tmpDir, "docker-proxy") - cmd := exec.Command("cp", dockerProxyPath, newProxyPath) - c.Assert(cmd.Run(), checker.IsNil) - - // custom one - c.Assert(s.d.StartWithBusybox("--userland-proxy-path", newProxyPath), checker.IsNil) - out, err := s.d.Cmd("run", "-p", "5000:5000", "busybox:latest", "true") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // try with the original one - c.Assert(s.d.Restart("--userland-proxy-path", dockerProxyPath), checker.IsNil) - out, err = s.d.Cmd("run", "-p", "5000:5000", "busybox:latest", "true") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // not exist - c.Assert(s.d.Restart("--userland-proxy-path", "/does/not/exist"), checker.IsNil) - out, err = s.d.Cmd("run", "-p", "5000:5000", "busybox:latest", "true") - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "driver failed programming external connectivity on endpoint") - c.Assert(out, checker.Contains, "/does/not/exist: no such file or directory") -} - -// Test case for #22471 -func (s *DockerDaemonSuite) TestDaemonShutdownTimeout(c *check.C) { - testRequires(c, SameHostDaemon) - - c.Assert(s.d.StartWithBusybox("--shutdown-timeout=3"), check.IsNil) - - _, err := s.d.Cmd("run", "-d", "busybox", "top") - c.Assert(err, check.IsNil) - - syscall.Kill(s.d.cmd.Process.Pid, syscall.SIGINT) - - select { - case <-s.d.wait: - case <-time.After(5 * time.Second): - } - - expectedMessage := `level=debug msg="start clean shutdown of all containers with a 3 seconds timeout..."` - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - c.Assert(string(content), checker.Contains, expectedMessage) -} - -// Test case for #22471 -func (s *DockerDaemonSuite) TestDaemonShutdownTimeoutWithConfigFile(c *check.C) { - testRequires(c, SameHostDaemon) - - // daemon config file - configFilePath := "test.json" - configFile, err := os.Create(configFilePath) - c.Assert(err, checker.IsNil) - defer os.Remove(configFilePath) - - daemonConfig := `{ "shutdown-timeout" : 8 }` - fmt.Fprintf(configFile, "%s", daemonConfig) - configFile.Close() - c.Assert(s.d.Start(fmt.Sprintf("--config-file=%s", configFilePath)), check.IsNil) - - configFile, err = os.Create(configFilePath) - c.Assert(err, checker.IsNil) - daemonConfig = `{ "shutdown-timeout" : 5 }` - fmt.Fprintf(configFile, "%s", daemonConfig) - configFile.Close() - - syscall.Kill(s.d.cmd.Process.Pid, syscall.SIGHUP) - - select { - case <-s.d.wait: - case <-time.After(3 * time.Second): - } - - expectedMessage := `level=debug msg="Reset Shutdown Timeout: 5"` - content, _ := ioutil.ReadFile(s.d.logFile.Name()) - c.Assert(string(content), checker.Contains, expectedMessage) -} - -// Test case for 29342 -func (s *DockerDaemonSuite) TestExecWithUserAfterLiveRestore(c *check.C) { - testRequires(c, DaemonIsLinux) - s.d.StartWithBusybox("--live-restore") - - out, err := s.d.Cmd("run", "-d", "--name=top", "busybox", "sh", "-c", "addgroup -S test && adduser -S -G test test -D -s /bin/sh && top") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - - s.d.waitRun("top") - - out1, err := s.d.Cmd("exec", "-u", "test", "top", "id") - // uid=100(test) gid=101(test) groups=101(test) - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out1)) - - // restart daemon. - s.d.Restart("--live-restore") - - out2, err := s.d.Cmd("exec", "-u", "test", "top", "id") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out2)) - c.Assert(out1, check.Equals, out2, check.Commentf("Output: before restart '%s', after restart '%s'", out1, out2)) - - out, err = s.d.Cmd("stop", "top") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) -} - -func (s *DockerDaemonSuite) TestRemoveContainerAfterLiveRestore(c *check.C) { - testRequires(c, DaemonIsLinux, overlayFSSupported, SameHostDaemon) - s.d.StartWithBusybox("--live-restore", "--storage-driver", "overlay") - out, err := s.d.Cmd("run", "-d", "--name=top", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - - s.d.waitRun("top") - - // restart daemon. - s.d.Restart("--live-restore", "--storage-driver", "overlay") - - out, err = s.d.Cmd("stop", "top") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - - // test if the rootfs mountpoint still exist - mountpoint, err := s.d.inspectFilter("top", ".GraphDriver.Data.MergedDir") - c.Assert(err, check.IsNil) - f, err := os.Open("/proc/self/mountinfo") - c.Assert(err, check.IsNil) - defer f.Close() - sc := bufio.NewScanner(f) - for sc.Scan() { - line := sc.Text() - if strings.Contains(line, mountpoint) { - c.Fatalf("mountinfo should not include the mountpoint of stop container") - } - } - - out, err = s.d.Cmd("rm", "top") - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_diff_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_diff_test.go deleted file mode 100644 index 08cf6e1ca..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_diff_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package main - -import ( - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// ensure that an added file shows up in docker diff -func (s *DockerSuite) TestDiffFilenameShownInOutput(c *check.C) { - containerCmd := `mkdir /foo; echo xyzzy > /foo/bar` - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", containerCmd) - - // Wait for it to exit as cannot diff a running container on Windows, and - // it will take a few seconds to exit. Also there's no way in Windows to - // differentiate between an Add or a Modify, and all files are under - // a "Files/" prefix. - containerID := strings.TrimSpace(out) - lookingFor := "A /foo/bar" - if daemonPlatform == "windows" { - err := waitExited(containerID, 60*time.Second) - c.Assert(err, check.IsNil) - lookingFor = "C Files/foo/bar" - } - - cleanCID := strings.TrimSpace(out) - out, _ = dockerCmd(c, "diff", cleanCID) - - found := false - for _, line := range strings.Split(out, "\n") { - if strings.Contains(line, lookingFor) { - found = true - break - } - } - c.Assert(found, checker.True) -} - -// test to ensure GH #3840 doesn't occur any more -func (s *DockerSuite) TestDiffEnsureInitLayerFilesAreIgnored(c *check.C) { - testRequires(c, DaemonIsLinux) - // this is a list of files which shouldn't show up in `docker diff` - initLayerFiles := []string{"/etc/resolv.conf", "/etc/hostname", "/etc/hosts", "/.dockerenv"} - containerCount := 5 - - // we might not run into this problem from the first run, so start a few containers - for i := 0; i < containerCount; i++ { - containerCmd := `echo foo > /root/bar` - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", containerCmd) - - cleanCID := strings.TrimSpace(out) - out, _ = dockerCmd(c, "diff", cleanCID) - - for _, filename := range initLayerFiles { - c.Assert(out, checker.Not(checker.Contains), filename) - } - } -} - -func (s *DockerSuite) TestDiffEnsureDefaultDevs(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "sleep", "0") - - cleanCID := strings.TrimSpace(out) - out, _ = dockerCmd(c, "diff", cleanCID) - - expected := map[string]bool{ - "C /dev": true, - "A /dev/full": true, // busybox - "C /dev/ptmx": true, // libcontainer - "A /dev/mqueue": true, - "A /dev/kmsg": true, - "A /dev/fd": true, - "A /dev/ptmx": true, - "A /dev/null": true, - "A /dev/random": true, - "A /dev/stdout": true, - "A /dev/stderr": true, - "A /dev/tty1": true, - "A /dev/stdin": true, - "A /dev/tty": true, - "A /dev/urandom": true, - "A /dev/zero": true, - } - - for _, line := range strings.Split(out, "\n") { - c.Assert(line == "" || expected[line], checker.True, check.Commentf(line)) - } -} - -// https://github.com/docker/docker/pull/14381#discussion_r33859347 -func (s *DockerSuite) TestDiffEmptyArgClientError(c *check.C) { - out, _, err := dockerCmdWithError("diff", "") - c.Assert(err, checker.NotNil) - c.Assert(strings.TrimSpace(out), checker.Contains, "Container name cannot be empty") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_events_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_events_test.go deleted file mode 100644 index 1fbfc742d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_events_test.go +++ /dev/null @@ -1,794 +0,0 @@ -package main - -import ( - "bufio" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "os/exec" - "strings" - "time" - - eventtypes "github.com/docker/docker/api/types/events" - eventstestutils "github.com/docker/docker/daemon/events/testutils" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestEventsTimestampFormats(c *check.C) { - name := "events-time-format-test" - - // Start stopwatch, generate an event - start := daemonTime(c) - time.Sleep(1100 * time.Millisecond) // so that first event occur in different second from since (just for the case) - dockerCmd(c, "run", "--rm", "--name", name, "busybox", "true") - time.Sleep(1100 * time.Millisecond) // so that until > since - end := daemonTime(c) - - // List of available time formats to --since - unixTs := func(t time.Time) string { return fmt.Sprintf("%v", t.Unix()) } - rfc3339 := func(t time.Time) string { return t.Format(time.RFC3339) } - duration := func(t time.Time) string { return time.Now().Sub(t).String() } - - // --since=$start must contain only the 'untag' event - for _, f := range []func(time.Time) string{unixTs, rfc3339, duration} { - since, until := f(start), f(end) - out, _ := dockerCmd(c, "events", "--since="+since, "--until="+until) - events := strings.Split(out, "\n") - events = events[:len(events)-1] - - nEvents := len(events) - c.Assert(nEvents, checker.GreaterOrEqualThan, 5) //Missing expected event - containerEvents := eventActionsByIDAndType(c, events, name, "container") - c.Assert(containerEvents, checker.HasLen, 5, check.Commentf("events: %v", events)) - - c.Assert(containerEvents[0], checker.Equals, "create", check.Commentf(out)) - c.Assert(containerEvents[1], checker.Equals, "attach", check.Commentf(out)) - c.Assert(containerEvents[2], checker.Equals, "start", check.Commentf(out)) - c.Assert(containerEvents[3], checker.Equals, "die", check.Commentf(out)) - c.Assert(containerEvents[4], checker.Equals, "destroy", check.Commentf(out)) - } -} - -func (s *DockerSuite) TestEventsUntag(c *check.C) { - image := "busybox" - dockerCmd(c, "tag", image, "utest:tag1") - dockerCmd(c, "tag", image, "utest:tag2") - dockerCmd(c, "rmi", "utest:tag1") - dockerCmd(c, "rmi", "utest:tag2") - - result := icmd.RunCmd(icmd.Cmd{ - Command: []string{dockerBinary, "events", "--since=1"}, - Timeout: time.Millisecond * 2500, - }) - c.Assert(result, icmd.Matches, icmd.Expected{Timeout: true}) - - events := strings.Split(result.Stdout(), "\n") - nEvents := len(events) - // The last element after the split above will be an empty string, so we - // get the two elements before the last, which are the untags we're - // looking for. - for _, v := range events[nEvents-3 : nEvents-1] { - c.Assert(v, checker.Contains, "untag", check.Commentf("event should be untag")) - } -} - -func (s *DockerSuite) TestEventsLimit(c *check.C) { - // Limit to 8 goroutines creating containers in order to prevent timeouts - // creating so many containers simultaneously on Windows - sem := make(chan bool, 8) - numContainers := 17 - errChan := make(chan error, numContainers) - - args := []string{"run", "--rm", "busybox", "true"} - for i := 0; i < numContainers; i++ { - sem <- true - go func() { - defer func() { <-sem }() - out, err := exec.Command(dockerBinary, args...).CombinedOutput() - if err != nil { - err = fmt.Errorf("%v: %s", err, string(out)) - } - errChan <- err - }() - } - - // Wait for all goroutines to finish - for i := 0; i < cap(sem); i++ { - sem <- true - } - close(errChan) - - for err := range errChan { - c.Assert(err, checker.IsNil, check.Commentf("%q failed with error", strings.Join(args, " "))) - } - - out, _ := dockerCmd(c, "events", "--since=0", "--until", daemonUnixTime(c)) - events := strings.Split(out, "\n") - nEvents := len(events) - 1 - c.Assert(nEvents, checker.Equals, 64, check.Commentf("events should be limited to 64, but received %d", nEvents)) -} - -func (s *DockerSuite) TestEventsContainerEvents(c *check.C) { - dockerCmd(c, "run", "--rm", "--name", "container-events-test", "busybox", "true") - - out, _ := dockerCmd(c, "events", "--until", daemonUnixTime(c)) - events := strings.Split(out, "\n") - events = events[:len(events)-1] - - nEvents := len(events) - c.Assert(nEvents, checker.GreaterOrEqualThan, 5) //Missing expected event - containerEvents := eventActionsByIDAndType(c, events, "container-events-test", "container") - c.Assert(containerEvents, checker.HasLen, 5, check.Commentf("events: %v", events)) - - c.Assert(containerEvents[0], checker.Equals, "create", check.Commentf(out)) - c.Assert(containerEvents[1], checker.Equals, "attach", check.Commentf(out)) - c.Assert(containerEvents[2], checker.Equals, "start", check.Commentf(out)) - c.Assert(containerEvents[3], checker.Equals, "die", check.Commentf(out)) - c.Assert(containerEvents[4], checker.Equals, "destroy", check.Commentf(out)) -} - -func (s *DockerSuite) TestEventsContainerEventsAttrSort(c *check.C) { - since := daemonUnixTime(c) - dockerCmd(c, "run", "--rm", "--name", "container-events-test", "busybox", "true") - - out, _ := dockerCmd(c, "events", "--filter", "container=container-events-test", "--since", since, "--until", daemonUnixTime(c)) - events := strings.Split(out, "\n") - - nEvents := len(events) - c.Assert(nEvents, checker.GreaterOrEqualThan, 3) //Missing expected event - matchedEvents := 0 - for _, event := range events { - matches := eventstestutils.ScanMap(event) - if matches["eventType"] == "container" && matches["action"] == "create" { - matchedEvents++ - c.Assert(out, checker.Contains, "(image=busybox, name=container-events-test)", check.Commentf("Event attributes not sorted")) - } else if matches["eventType"] == "container" && matches["action"] == "start" { - matchedEvents++ - c.Assert(out, checker.Contains, "(image=busybox, name=container-events-test)", check.Commentf("Event attributes not sorted")) - } - } - c.Assert(matchedEvents, checker.Equals, 2, check.Commentf("missing events for container container-events-test:\n%s", out)) -} - -func (s *DockerSuite) TestEventsContainerEventsSinceUnixEpoch(c *check.C) { - dockerCmd(c, "run", "--rm", "--name", "since-epoch-test", "busybox", "true") - timeBeginning := time.Unix(0, 0).Format(time.RFC3339Nano) - timeBeginning = strings.Replace(timeBeginning, "Z", ".000000000Z", -1) - out, _ := dockerCmd(c, "events", "--since", timeBeginning, "--until", daemonUnixTime(c)) - events := strings.Split(out, "\n") - events = events[:len(events)-1] - - nEvents := len(events) - c.Assert(nEvents, checker.GreaterOrEqualThan, 5) //Missing expected event - containerEvents := eventActionsByIDAndType(c, events, "since-epoch-test", "container") - c.Assert(containerEvents, checker.HasLen, 5, check.Commentf("events: %v", events)) - - c.Assert(containerEvents[0], checker.Equals, "create", check.Commentf(out)) - c.Assert(containerEvents[1], checker.Equals, "attach", check.Commentf(out)) - c.Assert(containerEvents[2], checker.Equals, "start", check.Commentf(out)) - c.Assert(containerEvents[3], checker.Equals, "die", check.Commentf(out)) - c.Assert(containerEvents[4], checker.Equals, "destroy", check.Commentf(out)) -} - -func (s *DockerSuite) TestEventsImageTag(c *check.C) { - time.Sleep(1 * time.Second) // because API has seconds granularity - since := daemonUnixTime(c) - image := "testimageevents:tag" - dockerCmd(c, "tag", "busybox", image) - - out, _ := dockerCmd(c, "events", - "--since", since, "--until", daemonUnixTime(c)) - - events := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(events, checker.HasLen, 1, check.Commentf("was expecting 1 event. out=%s", out)) - event := strings.TrimSpace(events[0]) - - matches := eventstestutils.ScanMap(event) - c.Assert(matchEventID(matches, image), checker.True, check.Commentf("matches: %v\nout:\n%s", matches, out)) - c.Assert(matches["action"], checker.Equals, "tag") -} - -func (s *DockerSuite) TestEventsImagePull(c *check.C) { - // TODO Windows: Enable this test once pull and reliable image names are available - testRequires(c, DaemonIsLinux) - since := daemonUnixTime(c) - testRequires(c, Network) - - dockerCmd(c, "pull", "hello-world") - - out, _ := dockerCmd(c, "events", - "--since", since, "--until", daemonUnixTime(c)) - - events := strings.Split(strings.TrimSpace(out), "\n") - event := strings.TrimSpace(events[len(events)-1]) - matches := eventstestutils.ScanMap(event) - c.Assert(matches["id"], checker.Equals, "hello-world:latest") - c.Assert(matches["action"], checker.Equals, "pull") - -} - -func (s *DockerSuite) TestEventsImageImport(c *check.C) { - // TODO Windows CI. This should be portable once export/import are - // more reliable (@swernli) - testRequires(c, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - cleanedContainerID := strings.TrimSpace(out) - - since := daemonUnixTime(c) - out, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "export", cleanedContainerID), - exec.Command(dockerBinary, "import", "-"), - ) - c.Assert(err, checker.IsNil, check.Commentf("import failed with output: %q", out)) - imageRef := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "events", "--since", since, "--until", daemonUnixTime(c), "--filter", "event=import") - events := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(events, checker.HasLen, 1) - matches := eventstestutils.ScanMap(events[0]) - c.Assert(matches["id"], checker.Equals, imageRef, check.Commentf("matches: %v\nout:\n%s\n", matches, out)) - c.Assert(matches["action"], checker.Equals, "import", check.Commentf("matches: %v\nout:\n%s\n", matches, out)) -} - -func (s *DockerSuite) TestEventsImageLoad(c *check.C) { - testRequires(c, DaemonIsLinux) - myImageName := "footest:v1" - dockerCmd(c, "tag", "busybox", myImageName) - since := daemonUnixTime(c) - - out, _ := dockerCmd(c, "images", "-q", "--no-trunc", myImageName) - longImageID := strings.TrimSpace(out) - c.Assert(longImageID, checker.Not(check.Equals), "", check.Commentf("Id should not be empty")) - - dockerCmd(c, "save", "-o", "saveimg.tar", myImageName) - dockerCmd(c, "rmi", myImageName) - out, _ = dockerCmd(c, "images", "-q", myImageName) - noImageID := strings.TrimSpace(out) - c.Assert(noImageID, checker.Equals, "", check.Commentf("Should not have any image")) - dockerCmd(c, "load", "-i", "saveimg.tar") - - result := icmd.RunCommand("rm", "-rf", "saveimg.tar") - c.Assert(result, icmd.Matches, icmd.Success) - - out, _ = dockerCmd(c, "images", "-q", "--no-trunc", myImageName) - imageID := strings.TrimSpace(out) - c.Assert(imageID, checker.Equals, longImageID, check.Commentf("Should have same image id as before")) - - out, _ = dockerCmd(c, "events", "--since", since, "--until", daemonUnixTime(c), "--filter", "event=load") - events := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(events, checker.HasLen, 1) - matches := eventstestutils.ScanMap(events[0]) - c.Assert(matches["id"], checker.Equals, imageID, check.Commentf("matches: %v\nout:\n%s\n", matches, out)) - c.Assert(matches["action"], checker.Equals, "load", check.Commentf("matches: %v\nout:\n%s\n", matches, out)) - - out, _ = dockerCmd(c, "events", "--since", since, "--until", daemonUnixTime(c), "--filter", "event=save") - events = strings.Split(strings.TrimSpace(out), "\n") - c.Assert(events, checker.HasLen, 1) - matches = eventstestutils.ScanMap(events[0]) - c.Assert(matches["id"], checker.Equals, imageID, check.Commentf("matches: %v\nout:\n%s\n", matches, out)) - c.Assert(matches["action"], checker.Equals, "save", check.Commentf("matches: %v\nout:\n%s\n", matches, out)) -} - -func (s *DockerSuite) TestEventsPluginOps(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - - since := daemonUnixTime(c) - - dockerCmd(c, "plugin", "install", pNameWithTag, "--grant-all-permissions") - dockerCmd(c, "plugin", "disable", pNameWithTag) - dockerCmd(c, "plugin", "remove", pNameWithTag) - - out, _ := dockerCmd(c, "events", "--since", since, "--until", daemonUnixTime(c)) - events := strings.Split(out, "\n") - events = events[:len(events)-1] - - nEvents := len(events) - c.Assert(nEvents, checker.GreaterOrEqualThan, 4) - - pluginEvents := eventActionsByIDAndType(c, events, pNameWithTag, "plugin") - c.Assert(pluginEvents, checker.HasLen, 4, check.Commentf("events: %v", events)) - - c.Assert(pluginEvents[0], checker.Equals, "pull", check.Commentf(out)) - c.Assert(pluginEvents[1], checker.Equals, "enable", check.Commentf(out)) - c.Assert(pluginEvents[2], checker.Equals, "disable", check.Commentf(out)) - c.Assert(pluginEvents[3], checker.Equals, "remove", check.Commentf(out)) -} - -func (s *DockerSuite) TestEventsFilters(c *check.C) { - since := daemonUnixTime(c) - dockerCmd(c, "run", "--rm", "busybox", "true") - dockerCmd(c, "run", "--rm", "busybox", "true") - out, _ := dockerCmd(c, "events", "--since", since, "--until", daemonUnixTime(c), "--filter", "event=die") - parseEvents(c, out, "die") - - out, _ = dockerCmd(c, "events", "--since", since, "--until", daemonUnixTime(c), "--filter", "event=die", "--filter", "event=start") - parseEvents(c, out, "die|start") - - // make sure we at least got 2 start events - count := strings.Count(out, "start") - c.Assert(strings.Count(out, "start"), checker.GreaterOrEqualThan, 2, check.Commentf("should have had 2 start events but had %d, out: %s", count, out)) - -} - -func (s *DockerSuite) TestEventsFilterImageName(c *check.C) { - since := daemonUnixTime(c) - - out, _ := dockerCmd(c, "run", "--name", "container_1", "-d", "busybox:latest", "true") - container1 := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "run", "--name", "container_2", "-d", "busybox", "true") - container2 := strings.TrimSpace(out) - - name := "busybox" - out, _ = dockerCmd(c, "events", "--since", since, "--until", daemonUnixTime(c), "--filter", fmt.Sprintf("image=%s", name)) - events := strings.Split(out, "\n") - events = events[:len(events)-1] - c.Assert(events, checker.Not(checker.HasLen), 0) //Expected events but found none for the image busybox:latest - count1 := 0 - count2 := 0 - - for _, e := range events { - if strings.Contains(e, container1) { - count1++ - } else if strings.Contains(e, container2) { - count2++ - } - } - c.Assert(count1, checker.Not(checker.Equals), 0, check.Commentf("Expected event from container but got %d from %s", count1, container1)) - c.Assert(count2, checker.Not(checker.Equals), 0, check.Commentf("Expected event from container but got %d from %s", count2, container2)) - -} - -func (s *DockerSuite) TestEventsFilterLabels(c *check.C) { - since := daemonUnixTime(c) - label := "io.docker.testing=foo" - - out, _ := dockerCmd(c, "run", "-d", "-l", label, "busybox:latest", "true") - container1 := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "run", "-d", "busybox", "true") - container2 := strings.TrimSpace(out) - - out, _ = dockerCmd( - c, - "events", - "--since", since, - "--until", daemonUnixTime(c), - "--filter", fmt.Sprintf("label=%s", label)) - - events := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(events), checker.Equals, 3) - - for _, e := range events { - c.Assert(e, checker.Contains, container1) - c.Assert(e, checker.Not(checker.Contains), container2) - } -} - -func (s *DockerSuite) TestEventsFilterImageLabels(c *check.C) { - since := daemonUnixTime(c) - name := "labelfiltertest" - label := "io.docker.testing=image" - - // Build a test image. - _, err := buildImage(name, fmt.Sprintf(` - FROM busybox:latest - LABEL %s`, label), true) - c.Assert(err, checker.IsNil, check.Commentf("Couldn't create image")) - - dockerCmd(c, "tag", name, "labelfiltertest:tag1") - dockerCmd(c, "tag", name, "labelfiltertest:tag2") - dockerCmd(c, "tag", "busybox:latest", "labelfiltertest:tag3") - - out, _ := dockerCmd( - c, - "events", - "--since", since, - "--until", daemonUnixTime(c), - "--filter", fmt.Sprintf("label=%s", label), - "--filter", "type=image") - - events := strings.Split(strings.TrimSpace(out), "\n") - - // 2 events from the "docker tag" command, another one is from "docker build" - c.Assert(events, checker.HasLen, 3, check.Commentf("Events == %s", events)) - for _, e := range events { - c.Assert(e, checker.Contains, "labelfiltertest") - } -} - -func (s *DockerSuite) TestEventsFilterContainer(c *check.C) { - since := daemonUnixTime(c) - nameID := make(map[string]string) - - for _, name := range []string{"container_1", "container_2"} { - dockerCmd(c, "run", "--name", name, "busybox", "true") - id := inspectField(c, name, "Id") - nameID[name] = id - } - - until := daemonUnixTime(c) - - checkEvents := func(id string, events []string) error { - if len(events) != 4 { // create, attach, start, die - return fmt.Errorf("expected 4 events, got %v", events) - } - for _, event := range events { - matches := eventstestutils.ScanMap(event) - if !matchEventID(matches, id) { - return fmt.Errorf("expected event for container id %s: %s - parsed container id: %s", id, event, matches["id"]) - } - } - return nil - } - - for name, ID := range nameID { - // filter by names - out, _ := dockerCmd(c, "events", "--since", since, "--until", until, "--filter", "container="+name) - events := strings.Split(strings.TrimSuffix(out, "\n"), "\n") - c.Assert(checkEvents(ID, events), checker.IsNil) - - // filter by ID's - out, _ = dockerCmd(c, "events", "--since", since, "--until", until, "--filter", "container="+ID) - events = strings.Split(strings.TrimSuffix(out, "\n"), "\n") - c.Assert(checkEvents(ID, events), checker.IsNil) - } -} - -func (s *DockerSuite) TestEventsCommit(c *check.C) { - // Problematic on Windows as cannot commit a running container - testRequires(c, DaemonIsLinux) - - out, _ := runSleepingContainer(c) - cID := strings.TrimSpace(out) - c.Assert(waitRun(cID), checker.IsNil) - - dockerCmd(c, "commit", "-m", "test", cID) - dockerCmd(c, "stop", cID) - c.Assert(waitExited(cID, 5*time.Second), checker.IsNil) - - until := daemonUnixTime(c) - out, _ = dockerCmd(c, "events", "-f", "container="+cID, "--until="+until) - c.Assert(out, checker.Contains, "commit", check.Commentf("Missing 'commit' log event")) -} - -func (s *DockerSuite) TestEventsCopy(c *check.C) { - // Build a test image. - id, err := buildImage("cpimg", ` - FROM busybox - RUN echo HI > /file`, true) - c.Assert(err, checker.IsNil, check.Commentf("Couldn't create image")) - - // Create an empty test file. - tempFile, err := ioutil.TempFile("", "test-events-copy-") - c.Assert(err, checker.IsNil) - defer os.Remove(tempFile.Name()) - - c.Assert(tempFile.Close(), checker.IsNil) - - dockerCmd(c, "create", "--name=cptest", id) - - dockerCmd(c, "cp", "cptest:/file", tempFile.Name()) - - until := daemonUnixTime(c) - out, _ := dockerCmd(c, "events", "--since=0", "-f", "container=cptest", "--until="+until) - c.Assert(out, checker.Contains, "archive-path", check.Commentf("Missing 'archive-path' log event\n")) - - dockerCmd(c, "cp", tempFile.Name(), "cptest:/filecopy") - - until = daemonUnixTime(c) - out, _ = dockerCmd(c, "events", "-f", "container=cptest", "--until="+until) - c.Assert(out, checker.Contains, "extract-to-dir", check.Commentf("Missing 'extract-to-dir' log event")) -} - -func (s *DockerSuite) TestEventsResize(c *check.C) { - out, _ := runSleepingContainer(c, "-d") - cID := strings.TrimSpace(out) - c.Assert(waitRun(cID), checker.IsNil) - - endpoint := "/containers/" + cID + "/resize?h=80&w=24" - status, _, err := sockRequest("POST", endpoint, nil) - c.Assert(status, checker.Equals, http.StatusOK) - c.Assert(err, checker.IsNil) - - dockerCmd(c, "stop", cID) - - until := daemonUnixTime(c) - out, _ = dockerCmd(c, "events", "-f", "container="+cID, "--until="+until) - c.Assert(out, checker.Contains, "resize", check.Commentf("Missing 'resize' log event")) -} - -func (s *DockerSuite) TestEventsAttach(c *check.C) { - // TODO Windows CI: Figure out why this test fails intermittently (TP5). - testRequires(c, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-di", "busybox", "cat") - cID := strings.TrimSpace(out) - c.Assert(waitRun(cID), checker.IsNil) - - cmd := exec.Command(dockerBinary, "attach", cID) - stdin, err := cmd.StdinPipe() - c.Assert(err, checker.IsNil) - defer stdin.Close() - stdout, err := cmd.StdoutPipe() - c.Assert(err, checker.IsNil) - defer stdout.Close() - c.Assert(cmd.Start(), checker.IsNil) - defer cmd.Process.Kill() - - // Make sure we're done attaching by writing/reading some stuff - _, err = stdin.Write([]byte("hello\n")) - c.Assert(err, checker.IsNil) - out, err = bufio.NewReader(stdout).ReadString('\n') - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, "hello", check.Commentf("expected 'hello'")) - - c.Assert(stdin.Close(), checker.IsNil) - - dockerCmd(c, "kill", cID) - c.Assert(waitExited(cID, 5*time.Second), checker.IsNil) - - until := daemonUnixTime(c) - out, _ = dockerCmd(c, "events", "-f", "container="+cID, "--until="+until) - c.Assert(out, checker.Contains, "attach", check.Commentf("Missing 'attach' log event")) -} - -func (s *DockerSuite) TestEventsRename(c *check.C) { - out, _ := dockerCmd(c, "run", "--name", "oldName", "busybox", "true") - cID := strings.TrimSpace(out) - dockerCmd(c, "rename", "oldName", "newName") - - until := daemonUnixTime(c) - // filter by the container id because the name in the event will be the new name. - out, _ = dockerCmd(c, "events", "-f", "container="+cID, "--until", until) - c.Assert(out, checker.Contains, "rename", check.Commentf("Missing 'rename' log event\n")) -} - -func (s *DockerSuite) TestEventsTop(c *check.C) { - // Problematic on Windows as Windows does not support top - testRequires(c, DaemonIsLinux) - - out, _ := runSleepingContainer(c, "-d") - cID := strings.TrimSpace(out) - c.Assert(waitRun(cID), checker.IsNil) - - dockerCmd(c, "top", cID) - dockerCmd(c, "stop", cID) - - until := daemonUnixTime(c) - out, _ = dockerCmd(c, "events", "-f", "container="+cID, "--until="+until) - c.Assert(out, checker.Contains, " top", check.Commentf("Missing 'top' log event")) -} - -// #14316 -func (s *DockerRegistrySuite) TestEventsImageFilterPush(c *check.C) { - // Problematic to port for Windows CI during TP5 timeframe until - // supporting push - testRequires(c, DaemonIsLinux) - testRequires(c, Network) - repoName := fmt.Sprintf("%v/dockercli/testf", privateRegistryURL) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - cID := strings.TrimSpace(out) - c.Assert(waitRun(cID), checker.IsNil) - - dockerCmd(c, "commit", cID, repoName) - dockerCmd(c, "stop", cID) - dockerCmd(c, "push", repoName) - - until := daemonUnixTime(c) - out, _ = dockerCmd(c, "events", "-f", "image="+repoName, "-f", "event=push", "--until", until) - c.Assert(out, checker.Contains, repoName, check.Commentf("Missing 'push' log event for %s", repoName)) -} - -func (s *DockerSuite) TestEventsFilterType(c *check.C) { - since := daemonUnixTime(c) - name := "labelfiltertest" - label := "io.docker.testing=image" - - // Build a test image. - _, err := buildImage(name, fmt.Sprintf(` - FROM busybox:latest - LABEL %s`, label), true) - c.Assert(err, checker.IsNil, check.Commentf("Couldn't create image")) - - dockerCmd(c, "tag", name, "labelfiltertest:tag1") - dockerCmd(c, "tag", name, "labelfiltertest:tag2") - dockerCmd(c, "tag", "busybox:latest", "labelfiltertest:tag3") - - out, _ := dockerCmd( - c, - "events", - "--since", since, - "--until", daemonUnixTime(c), - "--filter", fmt.Sprintf("label=%s", label), - "--filter", "type=image") - - events := strings.Split(strings.TrimSpace(out), "\n") - - // 2 events from the "docker tag" command, another one is from "docker build" - c.Assert(events, checker.HasLen, 3, check.Commentf("Events == %s", events)) - for _, e := range events { - c.Assert(e, checker.Contains, "labelfiltertest") - } - - out, _ = dockerCmd( - c, - "events", - "--since", since, - "--until", daemonUnixTime(c), - "--filter", fmt.Sprintf("label=%s", label), - "--filter", "type=container") - events = strings.Split(strings.TrimSpace(out), "\n") - - // Events generated by the container that builds the image - c.Assert(events, checker.HasLen, 3, check.Commentf("Events == %s", events)) - - out, _ = dockerCmd( - c, - "events", - "--since", since, - "--until", daemonUnixTime(c), - "--filter", "type=network") - events = strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(events), checker.GreaterOrEqualThan, 1, check.Commentf("Events == %s", events)) -} - -// #25798 -func (s *DockerSuite) TestEventsSpecialFiltersWithExecCreate(c *check.C) { - since := daemonUnixTime(c) - runSleepingContainer(c, "--name", "test-container", "-d") - waitRun("test-container") - - dockerCmd(c, "exec", "test-container", "echo", "hello-world") - - out, _ := dockerCmd( - c, - "events", - "--since", since, - "--until", daemonUnixTime(c), - "--filter", - "event='exec_create: echo hello-world'", - ) - - events := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(events), checker.Equals, 1, check.Commentf(out)) - - out, _ = dockerCmd( - c, - "events", - "--since", since, - "--until", daemonUnixTime(c), - "--filter", - "event=exec_create", - ) - c.Assert(len(events), checker.Equals, 1, check.Commentf(out)) -} - -func (s *DockerSuite) TestEventsFilterImageInContainerAction(c *check.C) { - since := daemonUnixTime(c) - dockerCmd(c, "run", "--name", "test-container", "-d", "busybox", "true") - waitRun("test-container") - - out, _ := dockerCmd(c, "events", "--filter", "image=busybox", "--since", since, "--until", daemonUnixTime(c)) - events := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(events), checker.GreaterThan, 1, check.Commentf(out)) -} - -func (s *DockerSuite) TestEventsContainerRestart(c *check.C) { - dockerCmd(c, "run", "-d", "--name=testEvent", "--restart=on-failure:3", "busybox", "false") - - // wait until test2 is auto removed. - waitTime := 10 * time.Second - if daemonPlatform == "windows" { - // Windows takes longer... - waitTime = 90 * time.Second - } - - err := waitInspect("testEvent", "{{ .State.Restarting }} {{ .State.Running }}", "false false", waitTime) - c.Assert(err, checker.IsNil) - - var ( - createCount int - startCount int - dieCount int - ) - out, _ := dockerCmd(c, "events", "--since=0", "--until", daemonUnixTime(c), "-f", "container=testEvent") - events := strings.Split(strings.TrimSpace(out), "\n") - - nEvents := len(events) - c.Assert(nEvents, checker.GreaterOrEqualThan, 1) //Missing expected event - actions := eventActionsByIDAndType(c, events, "testEvent", "container") - - for _, a := range actions { - switch a { - case "create": - createCount++ - case "start": - startCount++ - case "die": - dieCount++ - } - } - c.Assert(createCount, checker.Equals, 1, check.Commentf("testEvent should be created 1 times: %v", actions)) - c.Assert(startCount, checker.Equals, 4, check.Commentf("testEvent should start 4 times: %v", actions)) - c.Assert(dieCount, checker.Equals, 4, check.Commentf("testEvent should die 4 times: %v", actions)) -} - -func (s *DockerSuite) TestEventsSinceInTheFuture(c *check.C) { - dockerCmd(c, "run", "--name", "test-container", "-d", "busybox", "true") - waitRun("test-container") - - since := daemonTime(c) - until := since.Add(time.Duration(-24) * time.Hour) - out, _, err := dockerCmdWithError("events", "--filter", "image=busybox", "--since", parseEventTime(since), "--until", parseEventTime(until)) - - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "cannot be after `until`") -} - -func (s *DockerSuite) TestEventsUntilInThePast(c *check.C) { - since := daemonUnixTime(c) - - dockerCmd(c, "run", "--name", "test-container", "-d", "busybox", "true") - waitRun("test-container") - - until := daemonUnixTime(c) - - dockerCmd(c, "run", "--name", "test-container2", "-d", "busybox", "true") - waitRun("test-container2") - - out, _ := dockerCmd(c, "events", "--filter", "image=busybox", "--since", since, "--until", until) - - c.Assert(out, checker.Not(checker.Contains), "test-container2") - c.Assert(out, checker.Contains, "test-container") -} - -func (s *DockerSuite) TestEventsFormat(c *check.C) { - since := daemonUnixTime(c) - dockerCmd(c, "run", "--rm", "busybox", "true") - dockerCmd(c, "run", "--rm", "busybox", "true") - out, _ := dockerCmd(c, "events", "--since", since, "--until", daemonUnixTime(c), "--format", "{{json .}}") - dec := json.NewDecoder(strings.NewReader(out)) - // make sure we got 2 start events - startCount := 0 - for { - var err error - var ev eventtypes.Message - if err = dec.Decode(&ev); err == io.EOF { - break - } - c.Assert(err, checker.IsNil) - if ev.Status == "start" { - startCount++ - } - } - - c.Assert(startCount, checker.Equals, 2, check.Commentf("should have had 2 start events but had %d, out: %s", startCount, out)) -} - -func (s *DockerSuite) TestEventsFormatBadFunc(c *check.C) { - // make sure it fails immediately, without receiving any event - result := dockerCmdWithResult("events", "--format", "{{badFuncString .}}") - c.Assert(result, icmd.Matches, icmd.Expected{ - Error: "exit status 64", - ExitCode: 64, - Err: "Error parsing format: template: :1: function \"badFuncString\" not defined", - }) -} - -func (s *DockerSuite) TestEventsFormatBadField(c *check.C) { - // make sure it fails immediately, without receiving any event - result := dockerCmdWithResult("events", "--format", "{{.badFieldString}}") - c.Assert(result, icmd.Matches, icmd.Expected{ - Error: "exit status 64", - ExitCode: 64, - Err: "Error parsing format: template: :1:2: executing \"\" at <.badFieldString>: can't evaluate field badFieldString in type *events.Message", - }) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_events_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_events_unix_test.go deleted file mode 100644 index dc9166711..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_events_unix_test.go +++ /dev/null @@ -1,486 +0,0 @@ -// +build !windows - -package main - -import ( - "bufio" - "bytes" - "fmt" - "io/ioutil" - "os" - "os/exec" - "strings" - "syscall" - "time" - "unicode" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" - "github.com/kr/pty" -) - -// #5979 -func (s *DockerSuite) TestEventsRedirectStdout(c *check.C) { - since := daemonUnixTime(c) - dockerCmd(c, "run", "busybox", "true") - - file, err := ioutil.TempFile("", "") - c.Assert(err, checker.IsNil, check.Commentf("could not create temp file")) - defer os.Remove(file.Name()) - - command := fmt.Sprintf("%s events --since=%s --until=%s > %s", dockerBinary, since, daemonUnixTime(c), file.Name()) - _, tty, err := pty.Open() - c.Assert(err, checker.IsNil, check.Commentf("Could not open pty")) - cmd := exec.Command("sh", "-c", command) - cmd.Stdin = tty - cmd.Stdout = tty - cmd.Stderr = tty - c.Assert(cmd.Run(), checker.IsNil, check.Commentf("run err for command %q", command)) - - scanner := bufio.NewScanner(file) - for scanner.Scan() { - for _, ch := range scanner.Text() { - c.Assert(unicode.IsControl(ch), checker.False, check.Commentf("found control character %v", []byte(string(ch)))) - } - } - c.Assert(scanner.Err(), checker.IsNil, check.Commentf("Scan err for command %q", command)) - -} - -func (s *DockerSuite) TestEventsOOMDisableFalse(c *check.C) { - testRequires(c, DaemonIsLinux, oomControl, memoryLimitSupport, swapMemorySupport) - - errChan := make(chan error) - go func() { - defer close(errChan) - out, exitCode, _ := dockerCmdWithError("run", "--name", "oomFalse", "-m", "10MB", "busybox", "sh", "-c", "x=a; while true; do x=$x$x$x$x; done") - if expected := 137; exitCode != expected { - errChan <- fmt.Errorf("wrong exit code for OOM container: expected %d, got %d (output: %q)", expected, exitCode, out) - } - }() - select { - case err := <-errChan: - c.Assert(err, checker.IsNil) - case <-time.After(30 * time.Second): - c.Fatal("Timeout waiting for container to die on OOM") - } - - out, _ := dockerCmd(c, "events", "--since=0", "-f", "container=oomFalse", "--until", daemonUnixTime(c)) - events := strings.Split(strings.TrimSuffix(out, "\n"), "\n") - nEvents := len(events) - - c.Assert(nEvents, checker.GreaterOrEqualThan, 5) //Missing expected event - c.Assert(parseEventAction(c, events[nEvents-5]), checker.Equals, "create") - c.Assert(parseEventAction(c, events[nEvents-4]), checker.Equals, "attach") - c.Assert(parseEventAction(c, events[nEvents-3]), checker.Equals, "start") - c.Assert(parseEventAction(c, events[nEvents-2]), checker.Equals, "oom") - c.Assert(parseEventAction(c, events[nEvents-1]), checker.Equals, "die") -} - -func (s *DockerSuite) TestEventsOOMDisableTrue(c *check.C) { - testRequires(c, DaemonIsLinux, oomControl, memoryLimitSupport, NotArm, swapMemorySupport) - - errChan := make(chan error) - observer, err := newEventObserver(c) - c.Assert(err, checker.IsNil) - err = observer.Start() - c.Assert(err, checker.IsNil) - defer observer.Stop() - - go func() { - defer close(errChan) - out, exitCode, _ := dockerCmdWithError("run", "--oom-kill-disable=true", "--name", "oomTrue", "-m", "10MB", "busybox", "sh", "-c", "x=a; while true; do x=$x$x$x$x; done") - if expected := 137; exitCode != expected { - errChan <- fmt.Errorf("wrong exit code for OOM container: expected %d, got %d (output: %q)", expected, exitCode, out) - } - }() - - c.Assert(waitRun("oomTrue"), checker.IsNil) - defer dockerCmd(c, "kill", "oomTrue") - containerID := inspectField(c, "oomTrue", "Id") - - testActions := map[string]chan bool{ - "oom": make(chan bool), - } - - matcher := matchEventLine(containerID, "container", testActions) - processor := processEventMatch(testActions) - go observer.Match(matcher, processor) - - select { - case <-time.After(20 * time.Second): - observer.CheckEventError(c, containerID, "oom", matcher) - case <-testActions["oom"]: - // ignore, done - case errRun := <-errChan: - if errRun != nil { - c.Fatalf("%v", errRun) - } else { - c.Fatalf("container should be still running but it's not") - } - } - - status := inspectField(c, "oomTrue", "State.Status") - c.Assert(strings.TrimSpace(status), checker.Equals, "running", check.Commentf("container should be still running")) -} - -// #18453 -func (s *DockerSuite) TestEventsContainerFilterByName(c *check.C) { - testRequires(c, DaemonIsLinux) - cOut, _ := dockerCmd(c, "run", "--name=foo", "-d", "busybox", "top") - c1 := strings.TrimSpace(cOut) - waitRun("foo") - cOut, _ = dockerCmd(c, "run", "--name=bar", "-d", "busybox", "top") - c2 := strings.TrimSpace(cOut) - waitRun("bar") - out, _ := dockerCmd(c, "events", "-f", "container=foo", "--since=0", "--until", daemonUnixTime(c)) - c.Assert(out, checker.Contains, c1, check.Commentf(out)) - c.Assert(out, checker.Not(checker.Contains), c2, check.Commentf(out)) -} - -// #18453 -func (s *DockerSuite) TestEventsContainerFilterBeforeCreate(c *check.C) { - testRequires(c, DaemonIsLinux) - buf := &bytes.Buffer{} - cmd := exec.Command(dockerBinary, "events", "-f", "container=foo", "--since=0") - cmd.Stdout = buf - c.Assert(cmd.Start(), check.IsNil) - defer cmd.Wait() - defer cmd.Process.Kill() - - // Sleep for a second to make sure we are testing the case where events are listened before container starts. - time.Sleep(time.Second) - id, _ := dockerCmd(c, "run", "--name=foo", "-d", "busybox", "top") - cID := strings.TrimSpace(id) - for i := 0; ; i++ { - out := buf.String() - if strings.Contains(out, cID) { - break - } - if i > 30 { - c.Fatalf("Missing event of container (foo, %v), got %q", cID, out) - } - time.Sleep(500 * time.Millisecond) - } -} - -func (s *DockerSuite) TestVolumeEvents(c *check.C) { - testRequires(c, DaemonIsLinux) - - since := daemonUnixTime(c) - - // Observe create/mount volume actions - dockerCmd(c, "volume", "create", "test-event-volume-local") - dockerCmd(c, "run", "--name", "test-volume-container", "--volume", "test-event-volume-local:/foo", "-d", "busybox", "true") - waitRun("test-volume-container") - - // Observe unmount/destroy volume actions - dockerCmd(c, "rm", "-f", "test-volume-container") - dockerCmd(c, "volume", "rm", "test-event-volume-local") - - until := daemonUnixTime(c) - out, _ := dockerCmd(c, "events", "--since", since, "--until", until) - events := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(events), checker.GreaterThan, 4) - - volumeEvents := eventActionsByIDAndType(c, events, "test-event-volume-local", "volume") - c.Assert(volumeEvents, checker.HasLen, 4) - c.Assert(volumeEvents[0], checker.Equals, "create") - c.Assert(volumeEvents[1], checker.Equals, "mount") - c.Assert(volumeEvents[2], checker.Equals, "unmount") - c.Assert(volumeEvents[3], checker.Equals, "destroy") -} - -func (s *DockerSuite) TestNetworkEvents(c *check.C) { - testRequires(c, DaemonIsLinux) - - since := daemonUnixTime(c) - - // Observe create/connect network actions - dockerCmd(c, "network", "create", "test-event-network-local") - dockerCmd(c, "run", "--name", "test-network-container", "--net", "test-event-network-local", "-d", "busybox", "true") - waitRun("test-network-container") - - // Observe disconnect/destroy network actions - dockerCmd(c, "rm", "-f", "test-network-container") - dockerCmd(c, "network", "rm", "test-event-network-local") - - until := daemonUnixTime(c) - out, _ := dockerCmd(c, "events", "--since", since, "--until", until) - events := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(events), checker.GreaterThan, 4) - - netEvents := eventActionsByIDAndType(c, events, "test-event-network-local", "network") - c.Assert(netEvents, checker.HasLen, 4) - c.Assert(netEvents[0], checker.Equals, "create") - c.Assert(netEvents[1], checker.Equals, "connect") - c.Assert(netEvents[2], checker.Equals, "disconnect") - c.Assert(netEvents[3], checker.Equals, "destroy") -} - -func (s *DockerSuite) TestEventsContainerWithMultiNetwork(c *check.C) { - testRequires(c, DaemonIsLinux) - - // Observe create/connect network actions - dockerCmd(c, "network", "create", "test-event-network-local-1") - dockerCmd(c, "network", "create", "test-event-network-local-2") - dockerCmd(c, "run", "--name", "test-network-container", "--net", "test-event-network-local-1", "-td", "busybox", "sh") - waitRun("test-network-container") - dockerCmd(c, "network", "connect", "test-event-network-local-2", "test-network-container") - - since := daemonUnixTime(c) - - dockerCmd(c, "stop", "-t", "1", "test-network-container") - - until := daemonUnixTime(c) - out, _ := dockerCmd(c, "events", "--since", since, "--until", until, "-f", "type=network") - netEvents := strings.Split(strings.TrimSpace(out), "\n") - - // received two network disconnect events - c.Assert(len(netEvents), checker.Equals, 2) - c.Assert(netEvents[0], checker.Contains, "disconnect") - c.Assert(netEvents[1], checker.Contains, "disconnect") - - //both networks appeared in the network event output - c.Assert(out, checker.Contains, "test-event-network-local-1") - c.Assert(out, checker.Contains, "test-event-network-local-2") -} - -func (s *DockerSuite) TestEventsStreaming(c *check.C) { - testRequires(c, DaemonIsLinux) - - observer, err := newEventObserver(c) - c.Assert(err, checker.IsNil) - err = observer.Start() - c.Assert(err, checker.IsNil) - defer observer.Stop() - - out, _ := dockerCmd(c, "run", "-d", "busybox:latest", "true") - containerID := strings.TrimSpace(out) - - testActions := map[string]chan bool{ - "create": make(chan bool, 1), - "start": make(chan bool, 1), - "die": make(chan bool, 1), - "destroy": make(chan bool, 1), - } - - matcher := matchEventLine(containerID, "container", testActions) - processor := processEventMatch(testActions) - go observer.Match(matcher, processor) - - select { - case <-time.After(5 * time.Second): - observer.CheckEventError(c, containerID, "create", matcher) - case <-testActions["create"]: - // ignore, done - } - - select { - case <-time.After(5 * time.Second): - observer.CheckEventError(c, containerID, "start", matcher) - case <-testActions["start"]: - // ignore, done - } - - select { - case <-time.After(5 * time.Second): - observer.CheckEventError(c, containerID, "die", matcher) - case <-testActions["die"]: - // ignore, done - } - - dockerCmd(c, "rm", containerID) - - select { - case <-time.After(5 * time.Second): - observer.CheckEventError(c, containerID, "destroy", matcher) - case <-testActions["destroy"]: - // ignore, done - } -} - -func (s *DockerSuite) TestEventsImageUntagDelete(c *check.C) { - testRequires(c, DaemonIsLinux) - - observer, err := newEventObserver(c) - c.Assert(err, checker.IsNil) - err = observer.Start() - c.Assert(err, checker.IsNil) - defer observer.Stop() - - name := "testimageevents" - imageID, err := buildImage(name, - `FROM scratch - MAINTAINER "docker"`, - true) - c.Assert(err, checker.IsNil) - c.Assert(deleteImages(name), checker.IsNil) - - testActions := map[string]chan bool{ - "untag": make(chan bool, 1), - "delete": make(chan bool, 1), - } - - matcher := matchEventLine(imageID, "image", testActions) - processor := processEventMatch(testActions) - go observer.Match(matcher, processor) - - select { - case <-time.After(10 * time.Second): - observer.CheckEventError(c, imageID, "untag", matcher) - case <-testActions["untag"]: - // ignore, done - } - - select { - case <-time.After(10 * time.Second): - observer.CheckEventError(c, imageID, "delete", matcher) - case <-testActions["delete"]: - // ignore, done - } -} - -func (s *DockerSuite) TestEventsFilterVolumeAndNetworkType(c *check.C) { - testRequires(c, DaemonIsLinux) - - since := daemonUnixTime(c) - - dockerCmd(c, "network", "create", "test-event-network-type") - dockerCmd(c, "volume", "create", "test-event-volume-type") - - out, _ := dockerCmd(c, "events", "--filter", "type=volume", "--filter", "type=network", "--since", since, "--until", daemonUnixTime(c)) - events := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(events), checker.GreaterOrEqualThan, 2, check.Commentf(out)) - - networkActions := eventActionsByIDAndType(c, events, "test-event-network-type", "network") - volumeActions := eventActionsByIDAndType(c, events, "test-event-volume-type", "volume") - - c.Assert(volumeActions[0], checker.Equals, "create") - c.Assert(networkActions[0], checker.Equals, "create") -} - -func (s *DockerSuite) TestEventsFilterVolumeID(c *check.C) { - testRequires(c, DaemonIsLinux) - - since := daemonUnixTime(c) - - dockerCmd(c, "volume", "create", "test-event-volume-id") - out, _ := dockerCmd(c, "events", "--filter", "volume=test-event-volume-id", "--since", since, "--until", daemonUnixTime(c)) - events := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(events, checker.HasLen, 1) - - c.Assert(events[0], checker.Contains, "test-event-volume-id") - c.Assert(events[0], checker.Contains, "driver=local") -} - -func (s *DockerSuite) TestEventsFilterNetworkID(c *check.C) { - testRequires(c, DaemonIsLinux) - - since := daemonUnixTime(c) - - dockerCmd(c, "network", "create", "test-event-network-local") - out, _ := dockerCmd(c, "events", "--filter", "network=test-event-network-local", "--since", since, "--until", daemonUnixTime(c)) - events := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(events, checker.HasLen, 1) - - c.Assert(events[0], checker.Contains, "test-event-network-local") - c.Assert(events[0], checker.Contains, "type=bridge") -} - -func (s *DockerDaemonSuite) TestDaemonEvents(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - // daemon config file - configFilePath := "test.json" - configFile, err := os.Create(configFilePath) - c.Assert(err, checker.IsNil) - defer os.Remove(configFilePath) - - daemonConfig := `{"labels":["foo=bar"]}` - fmt.Fprintf(configFile, "%s", daemonConfig) - configFile.Close() - c.Assert(s.d.Start(fmt.Sprintf("--config-file=%s", configFilePath)), check.IsNil) - - // Get daemon ID - out, err := s.d.Cmd("info") - c.Assert(err, checker.IsNil) - daemonID := "" - daemonName := "" - for _, line := range strings.Split(out, "\n") { - if strings.HasPrefix(line, "ID: ") { - daemonID = strings.TrimPrefix(line, "ID: ") - } else if strings.HasPrefix(line, "Name: ") { - daemonName = strings.TrimPrefix(line, "Name: ") - } - } - c.Assert(daemonID, checker.Not(checker.Equals), "") - - configFile, err = os.Create(configFilePath) - c.Assert(err, checker.IsNil) - daemonConfig = `{"max-concurrent-downloads":1,"labels":["bar=foo"], "shutdown-timeout": 10}` - fmt.Fprintf(configFile, "%s", daemonConfig) - configFile.Close() - - syscall.Kill(s.d.cmd.Process.Pid, syscall.SIGHUP) - - time.Sleep(3 * time.Second) - - out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c)) - c.Assert(err, checker.IsNil) - - c.Assert(out, checker.Contains, fmt.Sprintf("daemon reload %s (cluster-advertise=, cluster-store=, cluster-store-opts={}, debug=true, default-runtime=runc, insecure-registries=[], labels=[\"bar=foo\"], live-restore=false, max-concurrent-downloads=1, max-concurrent-uploads=5, name=%s, runtimes=runc:{docker-runc []}, shutdown-timeout=10)", daemonID, daemonName)) -} - -func (s *DockerDaemonSuite) TestDaemonEventsWithFilters(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - // daemon config file - configFilePath := "test.json" - configFile, err := os.Create(configFilePath) - c.Assert(err, checker.IsNil) - defer os.Remove(configFilePath) - - daemonConfig := `{"labels":["foo=bar"]}` - fmt.Fprintf(configFile, "%s", daemonConfig) - configFile.Close() - c.Assert(s.d.Start(fmt.Sprintf("--config-file=%s", configFilePath)), check.IsNil) - - // Get daemon ID - out, err := s.d.Cmd("info") - c.Assert(err, checker.IsNil) - daemonID := "" - daemonName := "" - for _, line := range strings.Split(out, "\n") { - if strings.HasPrefix(line, "ID: ") { - daemonID = strings.TrimPrefix(line, "ID: ") - } else if strings.HasPrefix(line, "Name: ") { - daemonName = strings.TrimPrefix(line, "Name: ") - } - } - c.Assert(daemonID, checker.Not(checker.Equals), "") - - syscall.Kill(s.d.cmd.Process.Pid, syscall.SIGHUP) - - time.Sleep(3 * time.Second) - - out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c), "--filter", fmt.Sprintf("daemon=%s", daemonID)) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, fmt.Sprintf("daemon reload %s", daemonID)) - - out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c), "--filter", fmt.Sprintf("daemon=%s", daemonName)) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, fmt.Sprintf("daemon reload %s", daemonID)) - - out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c), "--filter", "daemon=foo") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), fmt.Sprintf("daemon reload %s", daemonID)) - - out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c), "--filter", "type=daemon") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, fmt.Sprintf("daemon reload %s", daemonID)) - - out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c), "--filter", "type=container") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), fmt.Sprintf("daemon reload %s", daemonID)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_test.go deleted file mode 100644 index cac76d96a..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_test.go +++ /dev/null @@ -1,601 +0,0 @@ -// +build !test_no_exec - -package main - -import ( - "bufio" - "fmt" - "net/http" - "os" - "os/exec" - "reflect" - "runtime" - "sort" - "strings" - "sync" - "time" - - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestExec(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "--name", "testing", "busybox", "sh", "-c", "echo test > /tmp/file && top") - c.Assert(waitRun(strings.TrimSpace(out)), check.IsNil) - - out, _ = dockerCmd(c, "exec", "testing", "cat", "/tmp/file") - out = strings.Trim(out, "\r\n") - c.Assert(out, checker.Equals, "test") - -} - -func (s *DockerSuite) TestExecInteractive(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--name", "testing", "busybox", "sh", "-c", "echo test > /tmp/file && top") - - execCmd := exec.Command(dockerBinary, "exec", "-i", "testing", "sh") - stdin, err := execCmd.StdinPipe() - c.Assert(err, checker.IsNil) - stdout, err := execCmd.StdoutPipe() - c.Assert(err, checker.IsNil) - - err = execCmd.Start() - c.Assert(err, checker.IsNil) - _, err = stdin.Write([]byte("cat /tmp/file\n")) - c.Assert(err, checker.IsNil) - - r := bufio.NewReader(stdout) - line, err := r.ReadString('\n') - c.Assert(err, checker.IsNil) - line = strings.TrimSpace(line) - c.Assert(line, checker.Equals, "test") - err = stdin.Close() - c.Assert(err, checker.IsNil) - errChan := make(chan error) - go func() { - errChan <- execCmd.Wait() - close(errChan) - }() - select { - case err := <-errChan: - c.Assert(err, checker.IsNil) - case <-time.After(1 * time.Second): - c.Fatal("docker exec failed to exit on stdin close") - } - -} - -func (s *DockerSuite) TestExecAfterContainerRestart(c *check.C) { - out, _ := runSleepingContainer(c) - cleanedContainerID := strings.TrimSpace(out) - c.Assert(waitRun(cleanedContainerID), check.IsNil) - dockerCmd(c, "restart", cleanedContainerID) - c.Assert(waitRun(cleanedContainerID), check.IsNil) - - out, _ = dockerCmd(c, "exec", cleanedContainerID, "echo", "hello") - outStr := strings.TrimSpace(out) - c.Assert(outStr, checker.Equals, "hello") -} - -func (s *DockerDaemonSuite) TestExecAfterDaemonRestart(c *check.C) { - // TODO Windows CI: Requires a little work to get this ported. - testRequires(c, DaemonIsLinux) - testRequires(c, SameHostDaemon) - - err := s.d.StartWithBusybox() - c.Assert(err, checker.IsNil) - - out, err := s.d.Cmd("run", "-d", "--name", "top", "-p", "80", "busybox:latest", "top") - c.Assert(err, checker.IsNil, check.Commentf("Could not run top: %s", out)) - - err = s.d.Restart() - c.Assert(err, checker.IsNil, check.Commentf("Could not restart daemon")) - - out, err = s.d.Cmd("start", "top") - c.Assert(err, checker.IsNil, check.Commentf("Could not start top after daemon restart: %s", out)) - - out, err = s.d.Cmd("exec", "top", "echo", "hello") - c.Assert(err, checker.IsNil, check.Commentf("Could not exec on container top: %s", out)) - - outStr := strings.TrimSpace(string(out)) - c.Assert(outStr, checker.Equals, "hello") -} - -// Regression test for #9155, #9044 -func (s *DockerSuite) TestExecEnv(c *check.C) { - // TODO Windows CI: This one is interesting and may just end up being a feature - // difference between Windows and Linux. On Windows, the environment is passed - // into the process that is launched, not into the machine environment. Hence - // a subsequent exec will not have LALA set/ - testRequires(c, DaemonIsLinux) - runSleepingContainer(c, "-e", "LALA=value1", "-e", "LALA=value2", "-d", "--name", "testing") - c.Assert(waitRun("testing"), check.IsNil) - - out, _ := dockerCmd(c, "exec", "testing", "env") - c.Assert(out, checker.Not(checker.Contains), "LALA=value1") - c.Assert(out, checker.Contains, "LALA=value2") - c.Assert(out, checker.Contains, "HOME=/root") -} - -func (s *DockerSuite) TestExecSetEnv(c *check.C) { - testRequires(c, DaemonIsLinux) - runSleepingContainer(c, "-e", "HOME=/root", "-d", "--name", "testing") - c.Assert(waitRun("testing"), check.IsNil) - - out, _ := dockerCmd(c, "exec", "-e", "HOME=/another", "-e", "ABC=xyz", "testing", "env") - c.Assert(out, checker.Not(checker.Contains), "HOME=/root") - c.Assert(out, checker.Contains, "HOME=/another") - c.Assert(out, checker.Contains, "ABC=xyz") -} - -func (s *DockerSuite) TestExecExitStatus(c *check.C) { - runSleepingContainer(c, "-d", "--name", "top") - - result := icmd.RunCommand(dockerBinary, "exec", "top", "sh", "-c", "exit 23") - c.Assert(result, icmd.Matches, icmd.Expected{ExitCode: 23, Error: "exit status 23"}) -} - -func (s *DockerSuite) TestExecPausedContainer(c *check.C) { - testRequires(c, IsPausable) - defer unpauseAllContainers() - - out, _ := runSleepingContainer(c, "-d", "--name", "testing") - ContainerID := strings.TrimSpace(out) - - dockerCmd(c, "pause", "testing") - out, _, err := dockerCmdWithError("exec", "-i", "-t", ContainerID, "echo", "hello") - c.Assert(err, checker.NotNil, check.Commentf("container should fail to exec new conmmand if it is paused")) - - expected := ContainerID + " is paused, unpause the container before exec" - c.Assert(out, checker.Contains, expected, check.Commentf("container should not exec new command if it is paused")) -} - -// regression test for #9476 -func (s *DockerSuite) TestExecTTYCloseStdin(c *check.C) { - // TODO Windows CI: This requires some work to port to Windows. - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "-it", "--name", "exec_tty_stdin", "busybox") - - cmd := exec.Command(dockerBinary, "exec", "-i", "exec_tty_stdin", "cat") - stdinRw, err := cmd.StdinPipe() - c.Assert(err, checker.IsNil) - - stdinRw.Write([]byte("test")) - stdinRw.Close() - - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, _ = dockerCmd(c, "top", "exec_tty_stdin") - outArr := strings.Split(out, "\n") - c.Assert(len(outArr), checker.LessOrEqualThan, 3, check.Commentf("exec process left running")) - c.Assert(out, checker.Not(checker.Contains), "nsenter-exec") -} - -func (s *DockerSuite) TestExecTTYWithoutStdin(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "-ti", "busybox") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - errChan := make(chan error) - go func() { - defer close(errChan) - - cmd := exec.Command(dockerBinary, "exec", "-ti", id, "true") - if _, err := cmd.StdinPipe(); err != nil { - errChan <- err - return - } - - expected := "the input device is not a TTY" - if runtime.GOOS == "windows" { - expected += ". If you are using mintty, try prefixing the command with 'winpty'" - } - if out, _, err := runCommandWithOutput(cmd); err == nil { - errChan <- fmt.Errorf("exec should have failed") - return - } else if !strings.Contains(out, expected) { - errChan <- fmt.Errorf("exec failed with error %q: expected %q", out, expected) - return - } - }() - - select { - case err := <-errChan: - c.Assert(err, check.IsNil) - case <-time.After(3 * time.Second): - c.Fatal("exec is running but should have failed") - } -} - -func (s *DockerSuite) TestExecParseError(c *check.C) { - // TODO Windows CI: Requires some extra work. Consider copying the - // runSleepingContainer helper to have an exec version. - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--name", "top", "busybox", "top") - - // Test normal (non-detached) case first - cmd := exec.Command(dockerBinary, "exec", "top") - _, stderr, _, err := runCommandWithStdoutStderr(cmd) - c.Assert(err, checker.NotNil) - c.Assert(stderr, checker.Contains, "See 'docker exec --help'") -} - -func (s *DockerSuite) TestExecStopNotHanging(c *check.C) { - // TODO Windows CI: Requires some extra work. Consider copying the - // runSleepingContainer helper to have an exec version. - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--name", "testing", "busybox", "top") - - err := exec.Command(dockerBinary, "exec", "testing", "top").Start() - c.Assert(err, checker.IsNil) - - type dstop struct { - out []byte - err error - } - - ch := make(chan dstop) - go func() { - out, err := exec.Command(dockerBinary, "stop", "testing").CombinedOutput() - ch <- dstop{out, err} - close(ch) - }() - select { - case <-time.After(3 * time.Second): - c.Fatal("Container stop timed out") - case s := <-ch: - c.Assert(s.err, check.IsNil) - } -} - -func (s *DockerSuite) TestExecCgroup(c *check.C) { - // Not applicable on Windows - using Linux specific functionality - testRequires(c, NotUserNamespace) - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--name", "testing", "busybox", "top") - - out, _ := dockerCmd(c, "exec", "testing", "cat", "/proc/1/cgroup") - containerCgroups := sort.StringSlice(strings.Split(out, "\n")) - - var wg sync.WaitGroup - var mu sync.Mutex - execCgroups := []sort.StringSlice{} - errChan := make(chan error) - // exec a few times concurrently to get consistent failure - for i := 0; i < 5; i++ { - wg.Add(1) - go func() { - out, _, err := dockerCmdWithError("exec", "testing", "cat", "/proc/self/cgroup") - if err != nil { - errChan <- err - return - } - cg := sort.StringSlice(strings.Split(out, "\n")) - - mu.Lock() - execCgroups = append(execCgroups, cg) - mu.Unlock() - wg.Done() - }() - } - wg.Wait() - close(errChan) - - for err := range errChan { - c.Assert(err, checker.IsNil) - } - - for _, cg := range execCgroups { - if !reflect.DeepEqual(cg, containerCgroups) { - fmt.Println("exec cgroups:") - for _, name := range cg { - fmt.Printf(" %s\n", name) - } - - fmt.Println("container cgroups:") - for _, name := range containerCgroups { - fmt.Printf(" %s\n", name) - } - c.Fatal("cgroups mismatched") - } - } -} - -func (s *DockerSuite) TestExecInspectID(c *check.C) { - out, _ := runSleepingContainer(c, "-d") - id := strings.TrimSuffix(out, "\n") - - out = inspectField(c, id, "ExecIDs") - c.Assert(out, checker.Equals, "[]", check.Commentf("ExecIDs should be empty, got: %s", out)) - - // Start an exec, have it block waiting so we can do some checking - cmd := exec.Command(dockerBinary, "exec", id, "sh", "-c", - "while ! test -e /execid1; do sleep 1; done") - - err := cmd.Start() - c.Assert(err, checker.IsNil, check.Commentf("failed to start the exec cmd")) - - // Give the exec 10 chances/seconds to start then give up and stop the test - tries := 10 - for i := 0; i < tries; i++ { - // Since its still running we should see exec as part of the container - out = strings.TrimSpace(inspectField(c, id, "ExecIDs")) - - if out != "[]" && out != "" { - break - } - c.Assert(i+1, checker.Not(checker.Equals), tries, check.Commentf("ExecIDs still empty after 10 second")) - time.Sleep(1 * time.Second) - } - - // Save execID for later - execID, err := inspectFilter(id, "index .ExecIDs 0") - c.Assert(err, checker.IsNil, check.Commentf("failed to get the exec id")) - - // End the exec by creating the missing file - err = exec.Command(dockerBinary, "exec", id, - "sh", "-c", "touch /execid1").Run() - - c.Assert(err, checker.IsNil, check.Commentf("failed to run the 2nd exec cmd")) - - // Wait for 1st exec to complete - cmd.Wait() - - // Give the exec 10 chances/seconds to stop then give up and stop the test - for i := 0; i < tries; i++ { - // Since its still running we should see exec as part of the container - out = strings.TrimSpace(inspectField(c, id, "ExecIDs")) - - if out == "[]" { - break - } - c.Assert(i+1, checker.Not(checker.Equals), tries, check.Commentf("ExecIDs still not empty after 10 second")) - time.Sleep(1 * time.Second) - } - - // But we should still be able to query the execID - sc, body, err := sockRequest("GET", "/exec/"+execID+"/json", nil) - c.Assert(sc, checker.Equals, http.StatusOK, check.Commentf("received status != 200 OK: %d\n%s", sc, body)) - - // Now delete the container and then an 'inspect' on the exec should - // result in a 404 (not 'container not running') - out, ec := dockerCmd(c, "rm", "-f", id) - c.Assert(ec, checker.Equals, 0, check.Commentf("error removing container: %s", out)) - sc, body, err = sockRequest("GET", "/exec/"+execID+"/json", nil) - c.Assert(sc, checker.Equals, http.StatusNotFound, check.Commentf("received status != 404: %d\n%s", sc, body)) -} - -func (s *DockerSuite) TestLinksPingLinkedContainersOnRename(c *check.C) { - // Problematic on Windows as Windows does not support links - testRequires(c, DaemonIsLinux) - var out string - out, _ = dockerCmd(c, "run", "-d", "--name", "container1", "busybox", "top") - idA := strings.TrimSpace(out) - c.Assert(idA, checker.Not(checker.Equals), "", check.Commentf("%s, id should not be nil", out)) - out, _ = dockerCmd(c, "run", "-d", "--link", "container1:alias1", "--name", "container2", "busybox", "top") - idB := strings.TrimSpace(out) - c.Assert(idB, checker.Not(checker.Equals), "", check.Commentf("%s, id should not be nil", out)) - - dockerCmd(c, "exec", "container2", "ping", "-c", "1", "alias1", "-W", "1") - dockerCmd(c, "rename", "container1", "container_new") - dockerCmd(c, "exec", "container2", "ping", "-c", "1", "alias1", "-W", "1") -} - -func (s *DockerSuite) TestRunMutableNetworkFiles(c *check.C) { - // Not applicable on Windows to Windows CI. - testRequires(c, SameHostDaemon, DaemonIsLinux) - for _, fn := range []string{"resolv.conf", "hosts"} { - deleteAllContainers() - - content, err := runCommandAndReadContainerFile(fn, exec.Command(dockerBinary, "run", "-d", "--name", "c1", "busybox", "sh", "-c", fmt.Sprintf("echo success >/etc/%s && top", fn))) - c.Assert(err, checker.IsNil) - - c.Assert(strings.TrimSpace(string(content)), checker.Equals, "success", check.Commentf("Content was not what was modified in the container", string(content))) - - out, _ := dockerCmd(c, "run", "-d", "--name", "c2", "busybox", "top") - contID := strings.TrimSpace(out) - netFilePath := containerStorageFile(contID, fn) - - f, err := os.OpenFile(netFilePath, os.O_WRONLY|os.O_SYNC|os.O_APPEND, 0644) - c.Assert(err, checker.IsNil) - - if _, err := f.Seek(0, 0); err != nil { - f.Close() - c.Fatal(err) - } - - if err := f.Truncate(0); err != nil { - f.Close() - c.Fatal(err) - } - - if _, err := f.Write([]byte("success2\n")); err != nil { - f.Close() - c.Fatal(err) - } - f.Close() - - res, _ := dockerCmd(c, "exec", contID, "cat", "/etc/"+fn) - c.Assert(res, checker.Equals, "success2\n") - } -} - -func (s *DockerSuite) TestExecWithUser(c *check.C) { - // TODO Windows CI: This may be fixable in the future once Windows - // supports users - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--name", "parent", "busybox", "top") - - out, _ := dockerCmd(c, "exec", "-u", "1", "parent", "id") - c.Assert(out, checker.Contains, "uid=1(daemon) gid=1(daemon)") - - out, _ = dockerCmd(c, "exec", "-u", "root", "parent", "id") - c.Assert(out, checker.Contains, "uid=0(root) gid=0(root)", check.Commentf("exec with user by id expected daemon user got %s", out)) -} - -func (s *DockerSuite) TestExecWithPrivileged(c *check.C) { - // Not applicable on Windows - testRequires(c, DaemonIsLinux, NotUserNamespace) - // Start main loop which attempts mknod repeatedly - dockerCmd(c, "run", "-d", "--name", "parent", "--cap-drop=ALL", "busybox", "sh", "-c", `while (true); do if [ -e /exec_priv ]; then cat /exec_priv && mknod /tmp/sda b 8 0 && echo "Success"; else echo "Privileged exec has not run yet"; fi; usleep 10000; done`) - - // Check exec mknod doesn't work - cmd := exec.Command(dockerBinary, "exec", "parent", "sh", "-c", "mknod /tmp/sdb b 8 16") - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.NotNil, check.Commentf("exec mknod in --cap-drop=ALL container without --privileged should fail")) - c.Assert(out, checker.Contains, "Operation not permitted", check.Commentf("exec mknod in --cap-drop=ALL container without --privileged should fail")) - - // Check exec mknod does work with --privileged - cmd = exec.Command(dockerBinary, "exec", "--privileged", "parent", "sh", "-c", `echo "Running exec --privileged" > /exec_priv && mknod /tmp/sdb b 8 16 && usleep 50000 && echo "Finished exec --privileged" > /exec_priv && echo ok`) - out, _, err = runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil) - - actual := strings.TrimSpace(out) - c.Assert(actual, checker.Equals, "ok", check.Commentf("exec mknod in --cap-drop=ALL container with --privileged failed, output: %q", out)) - - // Check subsequent unprivileged exec cannot mknod - cmd = exec.Command(dockerBinary, "exec", "parent", "sh", "-c", "mknod /tmp/sdc b 8 32") - out, _, err = runCommandWithOutput(cmd) - c.Assert(err, checker.NotNil, check.Commentf("repeating exec mknod in --cap-drop=ALL container after --privileged without --privileged should fail")) - c.Assert(out, checker.Contains, "Operation not permitted", check.Commentf("repeating exec mknod in --cap-drop=ALL container after --privileged without --privileged should fail")) - - // Confirm at no point was mknod allowed - logCmd := exec.Command(dockerBinary, "logs", "parent") - out, _, err = runCommandWithOutput(logCmd) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), "Success") - -} - -func (s *DockerSuite) TestExecWithImageUser(c *check.C) { - // Not applicable on Windows - testRequires(c, DaemonIsLinux) - name := "testbuilduser" - _, err := buildImage(name, - `FROM busybox - RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd - USER dockerio`, - true) - c.Assert(err, checker.IsNil) - - dockerCmd(c, "run", "-d", "--name", "dockerioexec", name, "top") - - out, _ := dockerCmd(c, "exec", "dockerioexec", "whoami") - c.Assert(out, checker.Contains, "dockerio", check.Commentf("exec with user by id expected dockerio user got %s", out)) -} - -func (s *DockerSuite) TestExecOnReadonlyContainer(c *check.C) { - // Windows does not support read-only - // --read-only + userns has remount issues - testRequires(c, DaemonIsLinux, NotUserNamespace) - dockerCmd(c, "run", "-d", "--read-only", "--name", "parent", "busybox", "top") - dockerCmd(c, "exec", "parent", "true") -} - -func (s *DockerSuite) TestExecUlimits(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "testexeculimits" - runSleepingContainer(c, "-d", "--ulimit", "nproc=21", "--name", name) - c.Assert(waitRun(name), checker.IsNil) - - out, _, err := dockerCmdWithError("exec", name, "sh", "-c", "ulimit -p") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, "21") -} - -// #15750 -func (s *DockerSuite) TestExecStartFails(c *check.C) { - // TODO Windows CI. This test should be portable. Figure out why it fails - // currently. - testRequires(c, DaemonIsLinux) - name := "exec-15750" - runSleepingContainer(c, "-d", "--name", name) - c.Assert(waitRun(name), checker.IsNil) - - out, _, err := dockerCmdWithError("exec", name, "no-such-cmd") - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "executable file not found") -} - -// Fix regression in https://github.com/docker/docker/pull/26461#issuecomment-250287297 -func (s *DockerSuite) TestExecWindowsPathNotWiped(c *check.C) { - testRequires(c, DaemonIsWindows) - out, _ := dockerCmd(c, "run", "-d", "--name", "testing", minimalBaseImage(), "powershell", "start-sleep", "60") - c.Assert(waitRun(strings.TrimSpace(out)), check.IsNil) - - out, _ = dockerCmd(c, "exec", "testing", "powershell", "write-host", "$env:PATH") - out = strings.ToLower(strings.Trim(out, "\r\n")) - c.Assert(out, checker.Contains, `windowspowershell\v1.0`) -} - -func (s *DockerSuite) TestExecEnvLinksHost(c *check.C) { - testRequires(c, DaemonIsLinux) - runSleepingContainer(c, "-d", "--name", "foo") - runSleepingContainer(c, "-d", "--link", "foo:db", "--hostname", "myhost", "--name", "bar") - out, _ := dockerCmd(c, "exec", "bar", "env") - c.Assert(out, checker.Contains, "HOSTNAME=myhost") - c.Assert(out, checker.Contains, "DB_NAME=/bar/db") -} - -func (s *DockerSuite) TestExecWindowsOpenHandles(c *check.C) { - testRequires(c, DaemonIsWindows) - runSleepingContainer(c, "-d", "--name", "test") - exec := make(chan bool) - go func() { - dockerCmd(c, "exec", "test", "cmd", "/c", "start sleep 10") - exec <- true - }() - - for { - top := make(chan string) - var out string - go func() { - out, _ := dockerCmd(c, "top", "test") - top <- out - }() - - select { - case <-time.After(time.Second * 5): - c.Error("timed out waiting for top while exec is exiting") - case out = <-top: - break - } - - if strings.Count(out, "busybox.exe") == 2 && !strings.Contains(out, "cmd.exe") { - // The initial exec process (cmd.exe) has exited, and both sleeps are currently running - break - } - time.Sleep(1 * time.Second) - } - - inspect := make(chan bool) - go func() { - dockerCmd(c, "inspect", "test") - inspect <- true - }() - - select { - case <-time.After(time.Second * 5): - c.Error("timed out waiting for inspect while exec is exiting") - case <-inspect: - break - } - - // Ensure the background sleep is still running - out, _ := dockerCmd(c, "top", "test") - c.Assert(strings.Count(out, "busybox.exe"), checker.Equals, 2) - - // The exec should exit when the background sleep exits - select { - case <-time.After(time.Second * 15): - c.Error("timed out waiting for async exec to exit") - case <-exec: - // Ensure the background sleep has actually exited - out, _ := dockerCmd(c, "top", "test") - c.Assert(strings.Count(out, "busybox.exe"), checker.Equals, 1) - break - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_unix_test.go deleted file mode 100644 index 5f691196f..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_unix_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// +build !windows,!test_no_exec - -package main - -import ( - "bytes" - "io" - "os/exec" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" - "github.com/kr/pty" -) - -// regression test for #12546 -func (s *DockerSuite) TestExecInteractiveStdinClose(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-itd", "busybox", "/bin/cat") - contID := strings.TrimSpace(out) - - cmd := exec.Command(dockerBinary, "exec", "-i", contID, "echo", "-n", "hello") - p, err := pty.Start(cmd) - c.Assert(err, checker.IsNil) - - b := bytes.NewBuffer(nil) - go io.Copy(b, p) - - ch := make(chan error) - go func() { ch <- cmd.Wait() }() - - select { - case err := <-ch: - c.Assert(err, checker.IsNil) - output := b.String() - c.Assert(strings.TrimSpace(output), checker.Equals, "hello") - case <-time.After(5 * time.Second): - c.Fatal("timed out running docker exec") - } -} - -func (s *DockerSuite) TestExecTTY(c *check.C) { - testRequires(c, DaemonIsLinux, SameHostDaemon) - dockerCmd(c, "run", "-d", "--name=test", "busybox", "sh", "-c", "echo hello > /foo && top") - - cmd := exec.Command(dockerBinary, "exec", "-it", "test", "sh") - p, err := pty.Start(cmd) - c.Assert(err, checker.IsNil) - defer p.Close() - - _, err = p.Write([]byte("cat /foo && exit\n")) - c.Assert(err, checker.IsNil) - - chErr := make(chan error) - go func() { - chErr <- cmd.Wait() - }() - select { - case err := <-chErr: - c.Assert(err, checker.IsNil) - case <-time.After(3 * time.Second): - c.Fatal("timeout waiting for exec to exit") - } - - buf := make([]byte, 256) - read, err := p.Read(buf) - c.Assert(err, checker.IsNil) - c.Assert(bytes.Contains(buf, []byte("hello")), checker.Equals, true, check.Commentf(string(buf[:read]))) -} - -// Test the the TERM env var is set when -t is provided on exec -func (s *DockerSuite) TestExecWithTERM(c *check.C) { - testRequires(c, DaemonIsLinux, SameHostDaemon) - out, _ := dockerCmd(c, "run", "-id", "busybox", "/bin/cat") - contID := strings.TrimSpace(out) - cmd := exec.Command(dockerBinary, "exec", "-t", contID, "sh", "-c", "if [ -z $TERM ]; then exit 1; else exit 0; fi") - if err := cmd.Run(); err != nil { - c.Assert(err, checker.IsNil) - } -} - -// Test that the TERM env var is not set on exec when -t is not provided, even if it was set -// on run -func (s *DockerSuite) TestExecWithNoTERM(c *check.C) { - testRequires(c, DaemonIsLinux, SameHostDaemon) - out, _ := dockerCmd(c, "run", "-itd", "busybox", "/bin/cat") - contID := strings.TrimSpace(out) - cmd := exec.Command(dockerBinary, "exec", contID, "sh", "-c", "if [ -z $TERM ]; then exit 0; else exit 1; fi") - if err := cmd.Run(); err != nil { - c.Assert(err, checker.IsNil) - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_experimental_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_experimental_test.go deleted file mode 100644 index 6a49cc8cb..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_experimental_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package main - -import ( - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestExperimentalVersionTrue(c *check.C) { - testRequires(c, ExperimentalDaemon) - - out, _ := dockerCmd(c, "version") - for _, line := range strings.Split(out, "\n") { - if strings.HasPrefix(strings.TrimSpace(line), "Experimental:") { - c.Assert(line, checker.Matches, "*true") - return - } - } - - c.Fatal(`"Experimental" not found in version output`) -} - -func (s *DockerSuite) TestExperimentalVersionFalse(c *check.C) { - testRequires(c, NotExperimentalDaemon) - - out, _ := dockerCmd(c, "version") - for _, line := range strings.Split(out, "\n") { - if strings.HasPrefix(strings.TrimSpace(line), "Experimental:") { - c.Assert(line, checker.Matches, "*false") - return - } - } - - c.Fatal(`"Experimental" not found in version output`) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_export_import_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_export_import_test.go deleted file mode 100644 index 069dc0816..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_export_import_test.go +++ /dev/null @@ -1,49 +0,0 @@ -package main - -import ( - "os" - "os/exec" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// export an image and try to import it into a new one -func (s *DockerSuite) TestExportContainerAndImportImage(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := "testexportcontainerandimportimage" - - dockerCmd(c, "run", "--name", containerID, "busybox", "true") - - out, _ := dockerCmd(c, "export", containerID) - - importCmd := exec.Command(dockerBinary, "import", "-", "repo/testexp:v1") - importCmd.Stdin = strings.NewReader(out) - out, _, err := runCommandWithOutput(importCmd) - c.Assert(err, checker.IsNil, check.Commentf("failed to import image repo/testexp:v1: %s", out)) - - cleanedImageID := strings.TrimSpace(out) - c.Assert(cleanedImageID, checker.Not(checker.Equals), "", check.Commentf("output should have been an image id")) -} - -// Used to test output flag in the export command -func (s *DockerSuite) TestExportContainerWithOutputAndImportImage(c *check.C) { - testRequires(c, DaemonIsLinux) - containerID := "testexportcontainerwithoutputandimportimage" - - dockerCmd(c, "run", "--name", containerID, "busybox", "true") - dockerCmd(c, "export", "--output=testexp.tar", containerID) - defer os.Remove("testexp.tar") - - out, _, err := runCommandWithOutput(exec.Command("cat", "testexp.tar")) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - importCmd := exec.Command(dockerBinary, "import", "-", "repo/testexp:v1") - importCmd.Stdin = strings.NewReader(out) - out, _, err = runCommandWithOutput(importCmd) - c.Assert(err, checker.IsNil, check.Commentf("failed to import image repo/testexp:v1: %s", out)) - - cleanedImageID := strings.TrimSpace(out) - c.Assert(cleanedImageID, checker.Not(checker.Equals), "", check.Commentf("output should have been an image id")) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_external_graphdriver_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_external_graphdriver_unix_test.go deleted file mode 100644 index a794ca742..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_external_graphdriver_unix_test.go +++ /dev/null @@ -1,405 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "strings" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/daemon/graphdriver/vfs" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/plugins" - "github.com/go-check/check" -) - -func init() { - check.Suite(&DockerExternalGraphdriverSuite{ - ds: &DockerSuite{}, - }) -} - -type DockerExternalGraphdriverSuite struct { - server *httptest.Server - jserver *httptest.Server - ds *DockerSuite - d *Daemon - ec map[string]*graphEventsCounter -} - -type graphEventsCounter struct { - activations int - creations int - removals int - gets int - puts int - stats int - cleanups int - exists int - init int - metadata int - diff int - applydiff int - changes int - diffsize int -} - -func (s *DockerExternalGraphdriverSuite) SetUpTest(c *check.C) { - s.d = NewDaemon(c) -} - -func (s *DockerExternalGraphdriverSuite) OnTimeout(c *check.C) { - s.d.DumpStackAndQuit() -} - -func (s *DockerExternalGraphdriverSuite) TearDownTest(c *check.C) { - s.d.Stop() - s.ds.TearDownTest(c) -} - -func (s *DockerExternalGraphdriverSuite) SetUpSuite(c *check.C) { - s.ec = make(map[string]*graphEventsCounter) - s.setUpPluginViaSpecFile(c) - s.setUpPluginViaJSONFile(c) -} - -func (s *DockerExternalGraphdriverSuite) setUpPluginViaSpecFile(c *check.C) { - mux := http.NewServeMux() - s.server = httptest.NewServer(mux) - - s.setUpPlugin(c, "test-external-graph-driver", "spec", mux, []byte(s.server.URL)) -} - -func (s *DockerExternalGraphdriverSuite) setUpPluginViaJSONFile(c *check.C) { - mux := http.NewServeMux() - s.jserver = httptest.NewServer(mux) - - p := plugins.NewLocalPlugin("json-external-graph-driver", s.jserver.URL) - b, err := json.Marshal(p) - c.Assert(err, check.IsNil) - - s.setUpPlugin(c, "json-external-graph-driver", "json", mux, b) -} - -func (s *DockerExternalGraphdriverSuite) setUpPlugin(c *check.C, name string, ext string, mux *http.ServeMux, b []byte) { - type graphDriverRequest struct { - ID string `json:",omitempty"` - Parent string `json:",omitempty"` - MountLabel string `json:",omitempty"` - ReadOnly bool `json:",omitempty"` - } - - type graphDriverResponse struct { - Err error `json:",omitempty"` - Dir string `json:",omitempty"` - Exists bool `json:",omitempty"` - Status [][2]string `json:",omitempty"` - Metadata map[string]string `json:",omitempty"` - Changes []archive.Change `json:",omitempty"` - Size int64 `json:",omitempty"` - } - - respond := func(w http.ResponseWriter, data interface{}) { - w.Header().Set("Content-Type", "appplication/vnd.docker.plugins.v1+json") - switch t := data.(type) { - case error: - fmt.Fprintln(w, fmt.Sprintf(`{"Err": %q}`, t.Error())) - case string: - fmt.Fprintln(w, t) - default: - json.NewEncoder(w).Encode(&data) - } - } - - decReq := func(b io.ReadCloser, out interface{}, w http.ResponseWriter) error { - defer b.Close() - if err := json.NewDecoder(b).Decode(&out); err != nil { - http.Error(w, fmt.Sprintf("error decoding json: %s", err.Error()), 500) - } - return nil - } - - base, err := ioutil.TempDir("", name) - c.Assert(err, check.IsNil) - vfsProto, err := vfs.Init(base, []string{}, nil, nil) - c.Assert(err, check.IsNil, check.Commentf("error initializing graph driver")) - driver := graphdriver.NewNaiveDiffDriver(vfsProto, nil, nil) - - s.ec[ext] = &graphEventsCounter{} - mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].activations++ - respond(w, `{"Implements": ["GraphDriver"]}`) - }) - - mux.HandleFunc("/GraphDriver.Init", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].init++ - respond(w, "{}") - }) - - mux.HandleFunc("/GraphDriver.CreateReadWrite", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].creations++ - - var req graphDriverRequest - if err := decReq(r.Body, &req, w); err != nil { - return - } - if err := driver.CreateReadWrite(req.ID, req.Parent, nil); err != nil { - respond(w, err) - return - } - respond(w, "{}") - }) - - mux.HandleFunc("/GraphDriver.Create", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].creations++ - - var req graphDriverRequest - if err := decReq(r.Body, &req, w); err != nil { - return - } - if err := driver.Create(req.ID, req.Parent, nil); err != nil { - respond(w, err) - return - } - respond(w, "{}") - }) - - mux.HandleFunc("/GraphDriver.Remove", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].removals++ - - var req graphDriverRequest - if err := decReq(r.Body, &req, w); err != nil { - return - } - - if err := driver.Remove(req.ID); err != nil { - respond(w, err) - return - } - respond(w, "{}") - }) - - mux.HandleFunc("/GraphDriver.Get", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].gets++ - - var req graphDriverRequest - if err := decReq(r.Body, &req, w); err != nil { - return - } - - dir, err := driver.Get(req.ID, req.MountLabel) - if err != nil { - respond(w, err) - return - } - respond(w, &graphDriverResponse{Dir: dir}) - }) - - mux.HandleFunc("/GraphDriver.Put", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].puts++ - - var req graphDriverRequest - if err := decReq(r.Body, &req, w); err != nil { - return - } - - if err := driver.Put(req.ID); err != nil { - respond(w, err) - return - } - respond(w, "{}") - }) - - mux.HandleFunc("/GraphDriver.Exists", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].exists++ - - var req graphDriverRequest - if err := decReq(r.Body, &req, w); err != nil { - return - } - respond(w, &graphDriverResponse{Exists: driver.Exists(req.ID)}) - }) - - mux.HandleFunc("/GraphDriver.Status", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].stats++ - respond(w, &graphDriverResponse{Status: driver.Status()}) - }) - - mux.HandleFunc("/GraphDriver.Cleanup", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].cleanups++ - err := driver.Cleanup() - if err != nil { - respond(w, err) - return - } - respond(w, `{}`) - }) - - mux.HandleFunc("/GraphDriver.GetMetadata", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].metadata++ - - var req graphDriverRequest - if err := decReq(r.Body, &req, w); err != nil { - return - } - - data, err := driver.GetMetadata(req.ID) - if err != nil { - respond(w, err) - return - } - respond(w, &graphDriverResponse{Metadata: data}) - }) - - mux.HandleFunc("/GraphDriver.Diff", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].diff++ - - var req graphDriverRequest - if err := decReq(r.Body, &req, w); err != nil { - return - } - - diff, err := driver.Diff(req.ID, req.Parent) - if err != nil { - respond(w, err) - return - } - io.Copy(w, diff) - }) - - mux.HandleFunc("/GraphDriver.Changes", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].changes++ - var req graphDriverRequest - if err := decReq(r.Body, &req, w); err != nil { - return - } - - changes, err := driver.Changes(req.ID, req.Parent) - if err != nil { - respond(w, err) - return - } - respond(w, &graphDriverResponse{Changes: changes}) - }) - - mux.HandleFunc("/GraphDriver.ApplyDiff", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].applydiff++ - diff := r.Body - defer r.Body.Close() - - id := r.URL.Query().Get("id") - parent := r.URL.Query().Get("parent") - - if id == "" { - http.Error(w, fmt.Sprintf("missing id"), 409) - } - - size, err := driver.ApplyDiff(id, parent, diff) - if err != nil { - respond(w, err) - return - } - respond(w, &graphDriverResponse{Size: size}) - }) - - mux.HandleFunc("/GraphDriver.DiffSize", func(w http.ResponseWriter, r *http.Request) { - s.ec[ext].diffsize++ - - var req graphDriverRequest - if err := decReq(r.Body, &req, w); err != nil { - return - } - - size, err := driver.DiffSize(req.ID, req.Parent) - if err != nil { - respond(w, err) - return - } - respond(w, &graphDriverResponse{Size: size}) - }) - - err = os.MkdirAll("/etc/docker/plugins", 0755) - c.Assert(err, check.IsNil, check.Commentf("error creating /etc/docker/plugins")) - - specFile := "/etc/docker/plugins/" + name + "." + ext - err = ioutil.WriteFile(specFile, b, 0644) - c.Assert(err, check.IsNil, check.Commentf("error writing to %s", specFile)) -} - -func (s *DockerExternalGraphdriverSuite) TearDownSuite(c *check.C) { - s.server.Close() - s.jserver.Close() - - err := os.RemoveAll("/etc/docker/plugins") - c.Assert(err, check.IsNil, check.Commentf("error removing /etc/docker/plugins")) -} - -func (s *DockerExternalGraphdriverSuite) TestExternalGraphDriver(c *check.C) { - testRequires(c, ExperimentalDaemon) - - s.testExternalGraphDriver("test-external-graph-driver", "spec", c) - s.testExternalGraphDriver("json-external-graph-driver", "json", c) -} - -func (s *DockerExternalGraphdriverSuite) testExternalGraphDriver(name string, ext string, c *check.C) { - if err := s.d.StartWithBusybox("-s", name); err != nil { - b, _ := ioutil.ReadFile(s.d.LogFileName()) - c.Assert(err, check.IsNil, check.Commentf("\n%s", string(b))) - } - - out, err := s.d.Cmd("run", "--name=graphtest", "busybox", "sh", "-c", "echo hello > /hello") - c.Assert(err, check.IsNil, check.Commentf(out)) - - err = s.d.Restart("-s", name) - - out, err = s.d.Cmd("inspect", "--format={{.GraphDriver.Name}}", "graphtest") - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), check.Equals, name) - - out, err = s.d.Cmd("diff", "graphtest") - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(strings.Contains(out, "A /hello"), check.Equals, true, check.Commentf("diff output: %s", out)) - - out, err = s.d.Cmd("rm", "-f", "graphtest") - c.Assert(err, check.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("info") - c.Assert(err, check.IsNil, check.Commentf(out)) - - err = s.d.Stop() - c.Assert(err, check.IsNil) - - // Don't check s.ec.exists, because the daemon no longer calls the - // Exists function. - c.Assert(s.ec[ext].activations, check.Equals, 2) - c.Assert(s.ec[ext].init, check.Equals, 2) - c.Assert(s.ec[ext].creations >= 1, check.Equals, true) - c.Assert(s.ec[ext].removals >= 1, check.Equals, true) - c.Assert(s.ec[ext].gets >= 1, check.Equals, true) - c.Assert(s.ec[ext].puts >= 1, check.Equals, true) - c.Assert(s.ec[ext].stats, check.Equals, 5) - c.Assert(s.ec[ext].cleanups, check.Equals, 2) - c.Assert(s.ec[ext].applydiff >= 1, check.Equals, true) - c.Assert(s.ec[ext].changes, check.Equals, 1) - c.Assert(s.ec[ext].diffsize, check.Equals, 0) - c.Assert(s.ec[ext].diff, check.Equals, 0) - c.Assert(s.ec[ext].metadata, check.Equals, 1) -} - -func (s *DockerExternalGraphdriverSuite) TestExternalGraphDriverPull(c *check.C) { - testRequires(c, Network, ExperimentalDaemon) - - c.Assert(s.d.Start(), check.IsNil) - - out, err := s.d.Cmd("pull", "busybox:latest") - c.Assert(err, check.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("run", "-d", "busybox", "top") - c.Assert(err, check.IsNil, check.Commentf(out)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_external_volume_driver_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_external_volume_driver_unix_test.go deleted file mode 100644 index 806d87ec7..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_external_volume_driver_unix_test.go +++ /dev/null @@ -1,627 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "os/exec" - "path/filepath" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/volume" - "github.com/go-check/check" -) - -const volumePluginName = "test-external-volume-driver" - -func init() { - check.Suite(&DockerExternalVolumeSuite{ - ds: &DockerSuite{}, - }) -} - -type eventCounter struct { - activations int - creations int - removals int - mounts int - unmounts int - paths int - lists int - gets int - caps int -} - -type DockerExternalVolumeSuite struct { - ds *DockerSuite - d *Daemon - *volumePlugin -} - -func (s *DockerExternalVolumeSuite) SetUpTest(c *check.C) { - s.d = NewDaemon(c) - s.ec = &eventCounter{} -} - -func (s *DockerExternalVolumeSuite) TearDownTest(c *check.C) { - s.d.Stop() - s.ds.TearDownTest(c) -} - -func (s *DockerExternalVolumeSuite) SetUpSuite(c *check.C) { - s.volumePlugin = newVolumePlugin(c, volumePluginName) -} - -type volumePlugin struct { - ec *eventCounter - *httptest.Server - vols map[string]vol -} - -type vol struct { - Name string - Mountpoint string - Ninja bool // hack used to trigger a null volume return on `Get` - Status map[string]interface{} - Options map[string]string -} - -func (p *volumePlugin) Close() { - p.Server.Close() -} - -func newVolumePlugin(c *check.C, name string) *volumePlugin { - mux := http.NewServeMux() - s := &volumePlugin{Server: httptest.NewServer(mux), ec: &eventCounter{}, vols: make(map[string]vol)} - - type pluginRequest struct { - Name string - Opts map[string]string - ID string - } - - type pluginResp struct { - Mountpoint string `json:",omitempty"` - Err string `json:",omitempty"` - } - - read := func(b io.ReadCloser) (pluginRequest, error) { - defer b.Close() - var pr pluginRequest - if err := json.NewDecoder(b).Decode(&pr); err != nil { - return pr, err - } - return pr, nil - } - - send := func(w http.ResponseWriter, data interface{}) { - switch t := data.(type) { - case error: - http.Error(w, t.Error(), 500) - case string: - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintln(w, t) - default: - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - json.NewEncoder(w).Encode(&data) - } - } - - mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) { - s.ec.activations++ - send(w, `{"Implements": ["VolumeDriver"]}`) - }) - - mux.HandleFunc("/VolumeDriver.Create", func(w http.ResponseWriter, r *http.Request) { - s.ec.creations++ - pr, err := read(r.Body) - if err != nil { - send(w, err) - return - } - _, isNinja := pr.Opts["ninja"] - status := map[string]interface{}{"Hello": "world"} - s.vols[pr.Name] = vol{Name: pr.Name, Ninja: isNinja, Status: status, Options: pr.Opts} - send(w, nil) - }) - - mux.HandleFunc("/VolumeDriver.List", func(w http.ResponseWriter, r *http.Request) { - s.ec.lists++ - vols := make([]vol, 0, len(s.vols)) - for _, v := range s.vols { - if v.Ninja { - continue - } - vols = append(vols, v) - } - send(w, map[string][]vol{"Volumes": vols}) - }) - - mux.HandleFunc("/VolumeDriver.Get", func(w http.ResponseWriter, r *http.Request) { - s.ec.gets++ - pr, err := read(r.Body) - if err != nil { - send(w, err) - return - } - - v, exists := s.vols[pr.Name] - if !exists { - send(w, `{"Err": "no such volume"}`) - } - - if v.Ninja { - send(w, map[string]vol{}) - return - } - - v.Mountpoint = hostVolumePath(pr.Name) - send(w, map[string]vol{"Volume": v}) - return - }) - - mux.HandleFunc("/VolumeDriver.Remove", func(w http.ResponseWriter, r *http.Request) { - s.ec.removals++ - pr, err := read(r.Body) - if err != nil { - send(w, err) - return - } - - v, ok := s.vols[pr.Name] - if !ok { - send(w, nil) - return - } - - if err := os.RemoveAll(hostVolumePath(v.Name)); err != nil { - send(w, &pluginResp{Err: err.Error()}) - return - } - delete(s.vols, v.Name) - send(w, nil) - }) - - mux.HandleFunc("/VolumeDriver.Path", func(w http.ResponseWriter, r *http.Request) { - s.ec.paths++ - - pr, err := read(r.Body) - if err != nil { - send(w, err) - return - } - p := hostVolumePath(pr.Name) - send(w, &pluginResp{Mountpoint: p}) - }) - - mux.HandleFunc("/VolumeDriver.Mount", func(w http.ResponseWriter, r *http.Request) { - s.ec.mounts++ - - pr, err := read(r.Body) - if err != nil { - send(w, err) - return - } - - if v, exists := s.vols[pr.Name]; exists { - // Use this to simulate a mount failure - if _, exists := v.Options["invalidOption"]; exists { - send(w, fmt.Errorf("invalid argument")) - return - } - } - - p := hostVolumePath(pr.Name) - if err := os.MkdirAll(p, 0755); err != nil { - send(w, &pluginResp{Err: err.Error()}) - return - } - - if err := ioutil.WriteFile(filepath.Join(p, "test"), []byte(s.Server.URL), 0644); err != nil { - send(w, err) - return - } - - if err := ioutil.WriteFile(filepath.Join(p, "mountID"), []byte(pr.ID), 0644); err != nil { - send(w, err) - return - } - - send(w, &pluginResp{Mountpoint: p}) - }) - - mux.HandleFunc("/VolumeDriver.Unmount", func(w http.ResponseWriter, r *http.Request) { - s.ec.unmounts++ - - _, err := read(r.Body) - if err != nil { - send(w, err) - return - } - - send(w, nil) - }) - - mux.HandleFunc("/VolumeDriver.Capabilities", func(w http.ResponseWriter, r *http.Request) { - s.ec.caps++ - - _, err := read(r.Body) - if err != nil { - send(w, err) - return - } - - send(w, `{"Capabilities": { "Scope": "global" }}`) - }) - - err := os.MkdirAll("/etc/docker/plugins", 0755) - c.Assert(err, checker.IsNil) - - err = ioutil.WriteFile("/etc/docker/plugins/"+name+".spec", []byte(s.Server.URL), 0644) - c.Assert(err, checker.IsNil) - return s -} - -func (s *DockerExternalVolumeSuite) TearDownSuite(c *check.C) { - s.volumePlugin.Close() - - err := os.RemoveAll("/etc/docker/plugins") - c.Assert(err, checker.IsNil) -} - -func (s *DockerExternalVolumeSuite) TestVolumeCLICreateOptionConflict(c *check.C) { - dockerCmd(c, "volume", "create", "test") - - out, _, err := dockerCmdWithError("volume", "create", "test", "--driver", volumePluginName) - c.Assert(err, check.NotNil, check.Commentf("volume create exception name already in use with another driver")) - c.Assert(out, checker.Contains, "A volume named test already exists") - - out, _ = dockerCmd(c, "volume", "inspect", "--format={{ .Driver }}", "test") - _, _, err = dockerCmdWithError("volume", "create", "test", "--driver", strings.TrimSpace(out)) - c.Assert(err, check.IsNil) - - // make sure hidden --name option conflicts with positional arg name - out, _, err = dockerCmdWithError("volume", "create", "--name", "test2", "test2") - c.Assert(err, check.NotNil, check.Commentf("Conflicting options: either specify --name or provide positional arg, not both")) -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverNamed(c *check.C) { - err := s.d.StartWithBusybox() - c.Assert(err, checker.IsNil) - - out, err := s.d.Cmd("run", "--rm", "--name", "test-data", "-v", "external-volume-test:/tmp/external-volume-test", "--volume-driver", volumePluginName, "busybox:latest", "cat", "/tmp/external-volume-test/test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, s.Server.URL) - - _, err = s.d.Cmd("volume", "rm", "external-volume-test") - c.Assert(err, checker.IsNil) - - p := hostVolumePath("external-volume-test") - _, err = os.Lstat(p) - c.Assert(err, checker.NotNil) - c.Assert(os.IsNotExist(err), checker.True, check.Commentf("Expected volume path in host to not exist: %s, %v\n", p, err)) - - c.Assert(s.ec.activations, checker.Equals, 1) - c.Assert(s.ec.creations, checker.Equals, 1) - c.Assert(s.ec.removals, checker.Equals, 1) - c.Assert(s.ec.mounts, checker.Equals, 1) - c.Assert(s.ec.unmounts, checker.Equals, 1) -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverUnnamed(c *check.C) { - err := s.d.StartWithBusybox() - c.Assert(err, checker.IsNil) - - out, err := s.d.Cmd("run", "--rm", "--name", "test-data", "-v", "/tmp/external-volume-test", "--volume-driver", volumePluginName, "busybox:latest", "cat", "/tmp/external-volume-test/test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, s.Server.URL) - - c.Assert(s.ec.activations, checker.Equals, 1) - c.Assert(s.ec.creations, checker.Equals, 1) - c.Assert(s.ec.removals, checker.Equals, 1) - c.Assert(s.ec.mounts, checker.Equals, 1) - c.Assert(s.ec.unmounts, checker.Equals, 1) -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverVolumesFrom(c *check.C) { - err := s.d.StartWithBusybox() - c.Assert(err, checker.IsNil) - - out, err := s.d.Cmd("run", "--name", "vol-test1", "-v", "/foo", "--volume-driver", volumePluginName, "busybox:latest") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("run", "--rm", "--volumes-from", "vol-test1", "--name", "vol-test2", "busybox", "ls", "/tmp") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("rm", "-fv", "vol-test1") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - c.Assert(s.ec.activations, checker.Equals, 1) - c.Assert(s.ec.creations, checker.Equals, 1) - c.Assert(s.ec.removals, checker.Equals, 1) - c.Assert(s.ec.mounts, checker.Equals, 2) - c.Assert(s.ec.unmounts, checker.Equals, 2) -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverDeleteContainer(c *check.C) { - err := s.d.StartWithBusybox() - c.Assert(err, checker.IsNil) - - out, err := s.d.Cmd("run", "--name", "vol-test1", "-v", "/foo", "--volume-driver", volumePluginName, "busybox:latest") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("rm", "-fv", "vol-test1") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - c.Assert(s.ec.activations, checker.Equals, 1) - c.Assert(s.ec.creations, checker.Equals, 1) - c.Assert(s.ec.removals, checker.Equals, 1) - c.Assert(s.ec.mounts, checker.Equals, 1) - c.Assert(s.ec.unmounts, checker.Equals, 1) -} - -func hostVolumePath(name string) string { - return fmt.Sprintf("/var/lib/docker/volumes/%s", name) -} - -// Make sure a request to use a down driver doesn't block other requests -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverLookupNotBlocked(c *check.C) { - specPath := "/etc/docker/plugins/down-driver.spec" - err := ioutil.WriteFile(specPath, []byte("tcp://127.0.0.7:9999"), 0644) - c.Assert(err, check.IsNil) - defer os.RemoveAll(specPath) - - chCmd1 := make(chan struct{}) - chCmd2 := make(chan error) - cmd1 := exec.Command(dockerBinary, "volume", "create", "-d", "down-driver") - cmd2 := exec.Command(dockerBinary, "volume", "create") - - c.Assert(cmd1.Start(), checker.IsNil) - defer cmd1.Process.Kill() - time.Sleep(100 * time.Millisecond) // ensure API has been called - c.Assert(cmd2.Start(), checker.IsNil) - - go func() { - cmd1.Wait() - close(chCmd1) - }() - go func() { - chCmd2 <- cmd2.Wait() - }() - - select { - case <-chCmd1: - cmd2.Process.Kill() - c.Fatalf("volume create with down driver finished unexpectedly") - case err := <-chCmd2: - c.Assert(err, checker.IsNil) - case <-time.After(5 * time.Second): - cmd2.Process.Kill() - c.Fatal("volume creates are blocked by previous create requests when previous driver is down") - } -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverRetryNotImmediatelyExists(c *check.C) { - err := s.d.StartWithBusybox() - c.Assert(err, checker.IsNil) - - specPath := "/etc/docker/plugins/test-external-volume-driver-retry.spec" - os.RemoveAll(specPath) - defer os.RemoveAll(specPath) - - errchan := make(chan error) - go func() { - if out, err := s.d.Cmd("run", "--rm", "--name", "test-data-retry", "-v", "external-volume-test:/tmp/external-volume-test", "--volume-driver", "test-external-volume-driver-retry", "busybox:latest"); err != nil { - errchan <- fmt.Errorf("%v:\n%s", err, out) - } - close(errchan) - }() - go func() { - // wait for a retry to occur, then create spec to allow plugin to register - time.Sleep(2000 * time.Millisecond) - // no need to check for an error here since it will get picked up by the timeout later - ioutil.WriteFile(specPath, []byte(s.Server.URL), 0644) - }() - - select { - case err := <-errchan: - c.Assert(err, checker.IsNil) - case <-time.After(8 * time.Second): - c.Fatal("volume creates fail when plugin not immediately available") - } - - _, err = s.d.Cmd("volume", "rm", "external-volume-test") - c.Assert(err, checker.IsNil) - - c.Assert(s.ec.activations, checker.Equals, 1) - c.Assert(s.ec.creations, checker.Equals, 1) - c.Assert(s.ec.removals, checker.Equals, 1) - c.Assert(s.ec.mounts, checker.Equals, 1) - c.Assert(s.ec.unmounts, checker.Equals, 1) -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverBindExternalVolume(c *check.C) { - dockerCmd(c, "volume", "create", "-d", volumePluginName, "foo") - dockerCmd(c, "run", "-d", "--name", "testing", "-v", "foo:/bar", "busybox", "top") - - var mounts []struct { - Name string - Driver string - } - out := inspectFieldJSON(c, "testing", "Mounts") - c.Assert(json.NewDecoder(strings.NewReader(out)).Decode(&mounts), checker.IsNil) - c.Assert(len(mounts), checker.Equals, 1, check.Commentf(out)) - c.Assert(mounts[0].Name, checker.Equals, "foo") - c.Assert(mounts[0].Driver, checker.Equals, volumePluginName) -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverList(c *check.C) { - dockerCmd(c, "volume", "create", "-d", volumePluginName, "abc3") - out, _ := dockerCmd(c, "volume", "ls") - ls := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(ls), check.Equals, 2, check.Commentf("\n%s", out)) - - vol := strings.Fields(ls[len(ls)-1]) - c.Assert(len(vol), check.Equals, 2, check.Commentf("%v", vol)) - c.Assert(vol[0], check.Equals, volumePluginName) - c.Assert(vol[1], check.Equals, "abc3") - - c.Assert(s.ec.lists, check.Equals, 1) -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverGet(c *check.C) { - out, _, err := dockerCmdWithError("volume", "inspect", "dummy") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "No such volume") - c.Assert(s.ec.gets, check.Equals, 1) - - dockerCmd(c, "volume", "create", "test", "-d", volumePluginName) - out, _ = dockerCmd(c, "volume", "inspect", "test") - - type vol struct { - Status map[string]string - } - var st []vol - - c.Assert(json.Unmarshal([]byte(out), &st), checker.IsNil) - c.Assert(st, checker.HasLen, 1) - c.Assert(st[0].Status, checker.HasLen, 1, check.Commentf("%v", st[0])) - c.Assert(st[0].Status["Hello"], checker.Equals, "world", check.Commentf("%v", st[0].Status)) -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverWithDaemonRestart(c *check.C) { - dockerCmd(c, "volume", "create", "-d", volumePluginName, "abc1") - err := s.d.Restart() - c.Assert(err, checker.IsNil) - - dockerCmd(c, "run", "--name=test", "-v", "abc1:/foo", "busybox", "true") - var mounts []types.MountPoint - inspectFieldAndMarshall(c, "test", "Mounts", &mounts) - c.Assert(mounts, checker.HasLen, 1) - c.Assert(mounts[0].Driver, checker.Equals, volumePluginName) -} - -// Ensures that the daemon handles when the plugin responds to a `Get` request with a null volume and a null error. -// Prior the daemon would panic in this scenario. -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverGetEmptyResponse(c *check.C) { - c.Assert(s.d.Start(), checker.IsNil) - - out, err := s.d.Cmd("volume", "create", "-d", volumePluginName, "abc2", "--opt", "ninja=1") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("volume", "inspect", "abc2") - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "No such volume") -} - -// Ensure only cached paths are used in volume list to prevent N+1 calls to `VolumeDriver.Path` -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverPathCalls(c *check.C) { - c.Assert(s.d.Start(), checker.IsNil) - c.Assert(s.ec.paths, checker.Equals, 0) - - out, err := s.d.Cmd("volume", "create", "test", "--driver=test-external-volume-driver") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(s.ec.paths, checker.Equals, 1) - - out, err = s.d.Cmd("volume", "ls") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(s.ec.paths, checker.Equals, 1) - - out, err = s.d.Cmd("volume", "inspect", "--format='{{.Mountpoint}}'", "test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - c.Assert(s.ec.paths, checker.Equals, 1) -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverMountID(c *check.C) { - err := s.d.StartWithBusybox() - c.Assert(err, checker.IsNil) - - out, err := s.d.Cmd("run", "--rm", "-v", "external-volume-test:/tmp/external-volume-test", "--volume-driver", volumePluginName, "busybox:latest", "cat", "/tmp/external-volume-test/test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") -} - -// Check that VolumeDriver.Capabilities gets called, and only called once -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverCapabilities(c *check.C) { - c.Assert(s.d.Start(), checker.IsNil) - c.Assert(s.ec.caps, checker.Equals, 0) - - for i := 0; i < 3; i++ { - out, err := s.d.Cmd("volume", "create", "-d", volumePluginName, fmt.Sprintf("test%d", i)) - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(s.ec.caps, checker.Equals, 1) - out, err = s.d.Cmd("volume", "inspect", "--format={{.Scope}}", fmt.Sprintf("test%d", i)) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, volume.GlobalScope) - } -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverOutOfBandDelete(c *check.C) { - driverName := stringid.GenerateNonCryptoID() - p := newVolumePlugin(c, driverName) - defer p.Close() - - c.Assert(s.d.StartWithBusybox(), checker.IsNil) - - out, err := s.d.Cmd("volume", "create", "-d", driverName, "--name", "test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("volume", "create", "-d", "local", "--name", "test") - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "volume named test already exists") - - // simulate out of band volume deletion on plugin level - delete(p.vols, "test") - - // test re-create with same driver - out, err = s.d.Cmd("volume", "create", "-d", driverName, "--opt", "foo=bar", "--name", "test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - out, err = s.d.Cmd("volume", "inspect", "test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - var vs []types.Volume - err = json.Unmarshal([]byte(out), &vs) - c.Assert(err, checker.IsNil) - c.Assert(vs, checker.HasLen, 1) - c.Assert(vs[0].Driver, checker.Equals, driverName) - c.Assert(vs[0].Options, checker.NotNil) - c.Assert(vs[0].Options["foo"], checker.Equals, "bar") - c.Assert(vs[0].Driver, checker.Equals, driverName) - - // simulate out of band volume deletion on plugin level - delete(p.vols, "test") - - // test create with different driver - out, err = s.d.Cmd("volume", "create", "-d", "local", "--name", "test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = s.d.Cmd("volume", "inspect", "test") - c.Assert(err, checker.IsNil, check.Commentf(out)) - vs = nil - err = json.Unmarshal([]byte(out), &vs) - c.Assert(err, checker.IsNil) - c.Assert(vs, checker.HasLen, 1) - c.Assert(vs[0].Options, checker.HasLen, 0) - c.Assert(vs[0].Driver, checker.Equals, "local") -} - -func (s *DockerExternalVolumeSuite) TestExternalVolumeDriverUnmountOnMountFail(c *check.C) { - c.Assert(s.d.StartWithBusybox(), checker.IsNil) - s.d.Cmd("volume", "create", "-d", "test-external-volume-driver", "--opt=invalidOption=1", "--name=testumount") - - out, _ := s.d.Cmd("run", "-v", "testumount:/foo", "busybox", "true") - c.Assert(s.ec.unmounts, checker.Equals, 0, check.Commentf(out)) - out, _ = s.d.Cmd("run", "-w", "/foo", "-v", "testumount:/foo", "busybox", "true") - c.Assert(s.ec.unmounts, checker.Equals, 0, check.Commentf(out)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_health_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_health_test.go deleted file mode 100644 index 6b7baebd0..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_health_test.go +++ /dev/null @@ -1,169 +0,0 @@ -package main - -import ( - "encoding/json" - - "strconv" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func waitForStatus(c *check.C, name string, prev string, expected string) { - prev = prev + "\n" - expected = expected + "\n" - for { - out, _ := dockerCmd(c, "inspect", "--format={{.State.Status}}", name) - if out == expected { - return - } - c.Check(out, checker.Equals, prev) - if out != prev { - return - } - time.Sleep(100 * time.Millisecond) - } -} - -func waitForHealthStatus(c *check.C, name string, prev string, expected string) { - prev = prev + "\n" - expected = expected + "\n" - for { - out, _ := dockerCmd(c, "inspect", "--format={{.State.Health.Status}}", name) - if out == expected { - return - } - c.Check(out, checker.Equals, prev) - if out != prev { - return - } - time.Sleep(100 * time.Millisecond) - } -} - -func getHealth(c *check.C, name string) *types.Health { - out, _ := dockerCmd(c, "inspect", "--format={{json .State.Health}}", name) - var health types.Health - err := json.Unmarshal([]byte(out), &health) - c.Check(err, checker.Equals, nil) - return &health -} - -func (s *DockerSuite) TestHealth(c *check.C) { - testRequires(c, DaemonIsLinux) // busybox doesn't work on Windows - - imageName := "testhealth" - _, err := buildImage(imageName, - `FROM busybox - RUN echo OK > /status - CMD ["/bin/sleep", "120"] - STOPSIGNAL SIGKILL - HEALTHCHECK --interval=1s --timeout=30s \ - CMD cat /status`, - true) - - c.Check(err, check.IsNil) - - // No health status before starting - name := "test_health" - dockerCmd(c, "create", "--name", name, imageName) - out, _ := dockerCmd(c, "ps", "-a", "--format={{.Status}}") - c.Check(out, checker.Equals, "Created\n") - - // Inspect the options - out, _ = dockerCmd(c, "inspect", - "--format=timeout={{.Config.Healthcheck.Timeout}} "+ - "interval={{.Config.Healthcheck.Interval}} "+ - "retries={{.Config.Healthcheck.Retries}} "+ - "test={{.Config.Healthcheck.Test}}", name) - c.Check(out, checker.Equals, "timeout=30s interval=1s retries=0 test=[CMD-SHELL cat /status]\n") - - // Start - dockerCmd(c, "start", name) - waitForHealthStatus(c, name, "starting", "healthy") - - // Make it fail - dockerCmd(c, "exec", name, "rm", "/status") - waitForHealthStatus(c, name, "healthy", "unhealthy") - - // Inspect the status - out, _ = dockerCmd(c, "inspect", "--format={{.State.Health.Status}}", name) - c.Check(out, checker.Equals, "unhealthy\n") - - // Make it healthy again - dockerCmd(c, "exec", name, "touch", "/status") - waitForHealthStatus(c, name, "unhealthy", "healthy") - - // Remove container - dockerCmd(c, "rm", "-f", name) - - // Disable the check from the CLI - out, _ = dockerCmd(c, "create", "--name=noh", "--no-healthcheck", imageName) - out, _ = dockerCmd(c, "inspect", "--format={{.Config.Healthcheck.Test}}", "noh") - c.Check(out, checker.Equals, "[NONE]\n") - dockerCmd(c, "rm", "noh") - - // Disable the check with a new build - _, err = buildImage("no_healthcheck", - `FROM testhealth - HEALTHCHECK NONE`, true) - c.Check(err, check.IsNil) - - out, _ = dockerCmd(c, "inspect", "--format={{.ContainerConfig.Healthcheck.Test}}", "no_healthcheck") - c.Check(out, checker.Equals, "[NONE]\n") - - // Enable the checks from the CLI - _, _ = dockerCmd(c, "run", "-d", "--name=fatal_healthcheck", - "--health-interval=0.5s", - "--health-retries=3", - "--health-cmd=cat /status", - "no_healthcheck") - waitForHealthStatus(c, "fatal_healthcheck", "starting", "healthy") - health := getHealth(c, "fatal_healthcheck") - c.Check(health.Status, checker.Equals, "healthy") - c.Check(health.FailingStreak, checker.Equals, 0) - last := health.Log[len(health.Log)-1] - c.Check(last.ExitCode, checker.Equals, 0) - c.Check(last.Output, checker.Equals, "OK\n") - - // Fail the check - dockerCmd(c, "exec", "fatal_healthcheck", "rm", "/status") - waitForHealthStatus(c, "fatal_healthcheck", "healthy", "unhealthy") - - failsStr, _ := dockerCmd(c, "inspect", "--format={{.State.Health.FailingStreak}}", "fatal_healthcheck") - fails, err := strconv.Atoi(strings.TrimSpace(failsStr)) - c.Check(err, check.IsNil) - c.Check(fails >= 3, checker.Equals, true) - dockerCmd(c, "rm", "-f", "fatal_healthcheck") - - // Check timeout - // Note: if the interval is too small, it seems that Docker spends all its time running health - // checks and never gets around to killing it. - _, _ = dockerCmd(c, "run", "-d", "--name=test", - "--health-interval=1s", "--health-cmd=sleep 5m", "--health-timeout=1ms", imageName) - waitForHealthStatus(c, "test", "starting", "unhealthy") - health = getHealth(c, "test") - last = health.Log[len(health.Log)-1] - c.Check(health.Status, checker.Equals, "unhealthy") - c.Check(last.ExitCode, checker.Equals, -1) - c.Check(last.Output, checker.Equals, "Health check exceeded timeout (1ms)") - dockerCmd(c, "rm", "-f", "test") - - // Check JSON-format - _, err = buildImage(imageName, - `FROM busybox - RUN echo OK > /status - CMD ["/bin/sleep", "120"] - STOPSIGNAL SIGKILL - HEALTHCHECK --interval=1s --timeout=30s \ - CMD ["cat", "/my status"]`, - true) - c.Check(err, check.IsNil) - out, _ = dockerCmd(c, "inspect", - "--format={{.Config.Healthcheck.Test}}", imageName) - c.Check(out, checker.Equals, "[CMD cat /my status]\n") - -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_help_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_help_test.go deleted file mode 100644 index 29b6553fc..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_help_test.go +++ /dev/null @@ -1,321 +0,0 @@ -package main - -import ( - "fmt" - "os/exec" - "runtime" - "strings" - "unicode" - - "github.com/docker/docker/pkg/homedir" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestHelpTextVerify(c *check.C) { - testRequires(c, DaemonIsLinux) - - // Make sure main help text fits within 80 chars and that - // on non-windows system we use ~ when possible (to shorten things). - // Test for HOME set to its default value and set to "/" on linux - // Yes on windows setting up an array and looping (right now) isn't - // necessary because we just have one value, but we'll need the - // array/loop on linux so we might as well set it up so that we can - // test any number of home dirs later on and all we need to do is - // modify the array - the rest of the testing infrastructure should work - homes := []string{homedir.Get()} - - // Non-Windows machines need to test for this special case of $HOME - if runtime.GOOS != "windows" { - homes = append(homes, "/") - } - - homeKey := homedir.Key() - baseEnvs := appendBaseEnv(true) - - // Remove HOME env var from list so we can add a new value later. - for i, env := range baseEnvs { - if strings.HasPrefix(env, homeKey+"=") { - baseEnvs = append(baseEnvs[:i], baseEnvs[i+1:]...) - break - } - } - - for _, home := range homes { - - // Dup baseEnvs and add our new HOME value - newEnvs := make([]string, len(baseEnvs)+1) - copy(newEnvs, baseEnvs) - newEnvs[len(newEnvs)-1] = homeKey + "=" + home - - scanForHome := runtime.GOOS != "windows" && home != "/" - - // Check main help text to make sure its not over 80 chars - helpCmd := exec.Command(dockerBinary, "help") - helpCmd.Env = newEnvs - out, _, err := runCommandWithOutput(helpCmd) - c.Assert(err, checker.IsNil, check.Commentf(out)) - lines := strings.Split(out, "\n") - for _, line := range lines { - // All lines should not end with a space - c.Assert(line, checker.Not(checker.HasSuffix), " ", check.Commentf("Line should not end with a space")) - - if scanForHome && strings.Contains(line, `=`+home) { - c.Fatalf("Line should use '%q' instead of %q:\n%s", homedir.GetShortcutString(), home, line) - } - if runtime.GOOS != "windows" { - i := strings.Index(line, homedir.GetShortcutString()) - if i >= 0 && i != len(line)-1 && line[i+1] != '/' { - c.Fatalf("Main help should not have used home shortcut:\n%s", line) - } - } - } - - // Make sure each cmd's help text fits within 90 chars and that - // on non-windows system we use ~ when possible (to shorten things). - // Pull the list of commands from the "Commands:" section of docker help - helpCmd = exec.Command(dockerBinary, "help") - helpCmd.Env = newEnvs - out, _, err = runCommandWithOutput(helpCmd) - c.Assert(err, checker.IsNil, check.Commentf(out)) - i := strings.Index(out, "Commands:") - c.Assert(i, checker.GreaterOrEqualThan, 0, check.Commentf("Missing 'Commands:' in:\n%s", out)) - - cmds := []string{} - // Grab all chars starting at "Commands:" - helpOut := strings.Split(out[i:], "\n") - // Skip first line, it is just "Commands:" - helpOut = helpOut[1:] - - // Create the list of commands we want to test - cmdsToTest := []string{} - for _, cmd := range helpOut { - // Stop on blank line or non-idented line - if cmd == "" || !unicode.IsSpace(rune(cmd[0])) { - break - } - - // Grab just the first word of each line - cmd = strings.Split(strings.TrimSpace(cmd), " ")[0] - cmds = append(cmds, cmd) // Saving count for later - - cmdsToTest = append(cmdsToTest, cmd) - } - - // Add some 'two word' commands - would be nice to automatically - // calculate this list - somehow - cmdsToTest = append(cmdsToTest, "volume create") - cmdsToTest = append(cmdsToTest, "volume inspect") - cmdsToTest = append(cmdsToTest, "volume ls") - cmdsToTest = append(cmdsToTest, "volume rm") - cmdsToTest = append(cmdsToTest, "network connect") - cmdsToTest = append(cmdsToTest, "network create") - cmdsToTest = append(cmdsToTest, "network disconnect") - cmdsToTest = append(cmdsToTest, "network inspect") - cmdsToTest = append(cmdsToTest, "network ls") - cmdsToTest = append(cmdsToTest, "network rm") - - if experimentalDaemon { - cmdsToTest = append(cmdsToTest, "checkpoint create") - cmdsToTest = append(cmdsToTest, "checkpoint ls") - cmdsToTest = append(cmdsToTest, "checkpoint rm") - } - - // Divide the list of commands into go routines and run the func testcommand on the commands in parallel - // to save runtime of test - - errChan := make(chan error) - - for index := 0; index < len(cmdsToTest); index++ { - go func(index int) { - errChan <- testCommand(cmdsToTest[index], newEnvs, scanForHome, home) - }(index) - } - - for index := 0; index < len(cmdsToTest); index++ { - err := <-errChan - if err != nil { - c.Fatal(err) - } - } - } -} - -func (s *DockerSuite) TestHelpExitCodesHelpOutput(c *check.C) { - // Test to make sure the exit code and output (stdout vs stderr) of - // various good and bad cases are what we expect - - // docker : stdout=all, stderr=empty, rc=0 - out, _, err := dockerCmdWithError() - c.Assert(err, checker.IsNil, check.Commentf(out)) - // Be really pick - c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker'\n")) - - // docker help: stdout=all, stderr=empty, rc=0 - out, _, err = dockerCmdWithError("help") - c.Assert(err, checker.IsNil, check.Commentf(out)) - // Be really pick - c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker help'\n")) - - // docker --help: stdout=all, stderr=empty, rc=0 - out, _, err = dockerCmdWithError("--help") - c.Assert(err, checker.IsNil, check.Commentf(out)) - // Be really pick - c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker --help'\n")) - - // docker inspect busybox: stdout=all, stderr=empty, rc=0 - // Just making sure stderr is empty on valid cmd - out, _, err = dockerCmdWithError("inspect", "busybox") - c.Assert(err, checker.IsNil, check.Commentf(out)) - // Be really pick - c.Assert(out, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker inspect busyBox'\n")) - - // docker rm: stdout=empty, stderr=all, rc!=0 - // testing the min arg error msg - cmd := exec.Command(dockerBinary, "rm") - stdout, stderr, _, err := runCommandWithStdoutStderr(cmd) - c.Assert(err, checker.NotNil) - c.Assert(stdout, checker.Equals, "") - // Should not contain full help text but should contain info about - // # of args and Usage line - c.Assert(stderr, checker.Contains, "requires at least 1 argument", check.Commentf("Missing # of args text from 'docker rm'\n")) - - // docker rm NoSuchContainer: stdout=empty, stderr=all, rc=0 - // testing to make sure no blank line on error - cmd = exec.Command(dockerBinary, "rm", "NoSuchContainer") - stdout, stderr, _, err = runCommandWithStdoutStderr(cmd) - c.Assert(err, checker.NotNil) - c.Assert(len(stderr), checker.Not(checker.Equals), 0) - c.Assert(stdout, checker.Equals, "") - // Be really picky - c.Assert(stderr, checker.Not(checker.HasSuffix), "\n\n", check.Commentf("Should not have a blank line at the end of 'docker rm'\n")) - - // docker BadCmd: stdout=empty, stderr=all, rc=0 - cmd = exec.Command(dockerBinary, "BadCmd") - stdout, stderr, _, err = runCommandWithStdoutStderr(cmd) - c.Assert(err, checker.NotNil) - c.Assert(stdout, checker.Equals, "") - c.Assert(stderr, checker.Equals, "docker: 'BadCmd' is not a docker command.\nSee 'docker --help'\n", check.Commentf("Unexcepted output for 'docker badCmd'\n")) -} - -func testCommand(cmd string, newEnvs []string, scanForHome bool, home string) error { - - args := strings.Split(cmd+" --help", " ") - - // Check the full usage text - helpCmd := exec.Command(dockerBinary, args...) - helpCmd.Env = newEnvs - out, stderr, _, err := runCommandWithStdoutStderr(helpCmd) - if len(stderr) != 0 { - return fmt.Errorf("Error on %q help. non-empty stderr:%q\n", cmd, stderr) - } - if strings.HasSuffix(out, "\n\n") { - return fmt.Errorf("Should not have blank line on %q\n", cmd) - } - if !strings.Contains(out, "--help") { - return fmt.Errorf("All commands should mention '--help'. Command '%v' did not.\n", cmd) - } - - if err != nil { - return fmt.Errorf(out) - } - - // Check each line for lots of stuff - lines := strings.Split(out, "\n") - for _, line := range lines { - i := strings.Index(line, "~") - if i >= 0 && i != len(line)-1 && line[i+1] != '/' { - return fmt.Errorf("Help for %q should not have used ~:\n%s", cmd, line) - } - - // If a line starts with 4 spaces then assume someone - // added a multi-line description for an option and we need - // to flag it - if strings.HasPrefix(line, " ") && - !strings.HasPrefix(strings.TrimLeft(line, " "), "--") { - return fmt.Errorf("Help for %q should not have a multi-line option", cmd) - } - - // Options should NOT end with a period - if strings.HasPrefix(line, " -") && strings.HasSuffix(line, ".") { - return fmt.Errorf("Help for %q should not end with a period: %s", cmd, line) - } - - // Options should NOT end with a space - if strings.HasSuffix(line, " ") { - return fmt.Errorf("Help for %q should not end with a space: %s", cmd, line) - } - - } - - // For each command make sure we generate an error - // if we give a bad arg - args = strings.Split(cmd+" --badArg", " ") - - out, _, err = dockerCmdWithError(args...) - if err == nil { - return fmt.Errorf(out) - } - - // Be really picky - if strings.HasSuffix(stderr, "\n\n") { - return fmt.Errorf("Should not have a blank line at the end of 'docker rm'\n") - } - - // Now make sure that each command will print a short-usage - // (not a full usage - meaning no opts section) if we - // are missing a required arg or pass in a bad arg - - // These commands will never print a short-usage so don't test - noShortUsage := map[string]string{ - "images": "", - "login": "", - "logout": "", - "network": "", - "stats": "", - "volume create": "", - } - - if _, ok := noShortUsage[cmd]; !ok { - // skipNoArgs are ones that we don't want to try w/o - // any args. Either because it'll hang the test or - // lead to incorrect test result (like false negative). - // Whatever the reason, skip trying to run w/o args and - // jump to trying with a bogus arg. - skipNoArgs := map[string]struct{}{ - "daemon": {}, - "events": {}, - "load": {}, - } - - var result *icmd.Result - if _, ok := skipNoArgs[cmd]; !ok { - result = dockerCmdWithResult(strings.Split(cmd, " ")...) - } - - // If its ok w/o any args then try again with an arg - if result == nil || result.ExitCode == 0 { - result = dockerCmdWithResult(strings.Split(cmd+" badArg", " ")...) - } - - if err := result.Compare(icmd.Expected{ - Out: icmd.None, - Err: "\nUsage:", - ExitCode: 1, - }); err != nil { - return err - } - - stderr := result.Stderr() - // Shouldn't have full usage - if strings.Contains(stderr, "--help=false") { - return fmt.Errorf("Should not have full usage on %q:%v", result.Cmd.Args, stderr) - } - if strings.HasSuffix(stderr, "\n\n") { - return fmt.Errorf("Should not have a blank line on %q\n%v", result.Cmd.Args, stderr) - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_history_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_history_test.go deleted file mode 100644 index 9979080b1..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_history_test.go +++ /dev/null @@ -1,121 +0,0 @@ -package main - -import ( - "fmt" - "regexp" - "strconv" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// This is a heisen-test. Because the created timestamp of images and the behavior of -// sort is not predictable it doesn't always fail. -func (s *DockerSuite) TestBuildHistory(c *check.C) { - name := "testbuildhistory" - _, err := buildImage(name, `FROM `+minimalBaseImage()+` -LABEL label.A="A" -LABEL label.B="B" -LABEL label.C="C" -LABEL label.D="D" -LABEL label.E="E" -LABEL label.F="F" -LABEL label.G="G" -LABEL label.H="H" -LABEL label.I="I" -LABEL label.J="J" -LABEL label.K="K" -LABEL label.L="L" -LABEL label.M="M" -LABEL label.N="N" -LABEL label.O="O" -LABEL label.P="P" -LABEL label.Q="Q" -LABEL label.R="R" -LABEL label.S="S" -LABEL label.T="T" -LABEL label.U="U" -LABEL label.V="V" -LABEL label.W="W" -LABEL label.X="X" -LABEL label.Y="Y" -LABEL label.Z="Z"`, - true) - - c.Assert(err, checker.IsNil) - - out, _ := dockerCmd(c, "history", "testbuildhistory") - actualValues := strings.Split(out, "\n")[1:27] - expectedValues := [26]string{"Z", "Y", "X", "W", "V", "U", "T", "S", "R", "Q", "P", "O", "N", "M", "L", "K", "J", "I", "H", "G", "F", "E", "D", "C", "B", "A"} - - for i := 0; i < 26; i++ { - echoValue := fmt.Sprintf("LABEL label.%s=%s", expectedValues[i], expectedValues[i]) - actualValue := actualValues[i] - c.Assert(actualValue, checker.Contains, echoValue) - } - -} - -func (s *DockerSuite) TestHistoryExistentImage(c *check.C) { - dockerCmd(c, "history", "busybox") -} - -func (s *DockerSuite) TestHistoryNonExistentImage(c *check.C) { - _, _, err := dockerCmdWithError("history", "testHistoryNonExistentImage") - c.Assert(err, checker.NotNil, check.Commentf("history on a non-existent image should fail.")) -} - -func (s *DockerSuite) TestHistoryImageWithComment(c *check.C) { - name := "testhistoryimagewithcomment" - - // make an image through docker commit [ -m messages ] - - dockerCmd(c, "run", "--name", name, "busybox", "true") - dockerCmd(c, "wait", name) - - comment := "This_is_a_comment" - dockerCmd(c, "commit", "-m="+comment, name, name) - - // test docker history to check comment messages - - out, _ := dockerCmd(c, "history", name) - outputTabs := strings.Fields(strings.Split(out, "\n")[1]) - actualValue := outputTabs[len(outputTabs)-1] - c.Assert(actualValue, checker.Contains, comment) -} - -func (s *DockerSuite) TestHistoryHumanOptionFalse(c *check.C) { - out, _ := dockerCmd(c, "history", "--human=false", "busybox") - lines := strings.Split(out, "\n") - sizeColumnRegex, _ := regexp.Compile("SIZE +") - indices := sizeColumnRegex.FindStringIndex(lines[0]) - startIndex := indices[0] - endIndex := indices[1] - for i := 1; i < len(lines)-1; i++ { - if endIndex > len(lines[i]) { - endIndex = len(lines[i]) - } - sizeString := lines[i][startIndex:endIndex] - - _, err := strconv.Atoi(strings.TrimSpace(sizeString)) - c.Assert(err, checker.IsNil, check.Commentf("The size '%s' was not an Integer", sizeString)) - } -} - -func (s *DockerSuite) TestHistoryHumanOptionTrue(c *check.C) { - out, _ := dockerCmd(c, "history", "--human=true", "busybox") - lines := strings.Split(out, "\n") - sizeColumnRegex, _ := regexp.Compile("SIZE +") - humanSizeRegexRaw := "\\d+.*B" // Matches human sizes like 10 MB, 3.2 KB, etc - indices := sizeColumnRegex.FindStringIndex(lines[0]) - startIndex := indices[0] - endIndex := indices[1] - for i := 1; i < len(lines)-1; i++ { - if endIndex > len(lines[i]) { - endIndex = len(lines[i]) - } - sizeString := lines[i][startIndex:endIndex] - c.Assert(strings.TrimSpace(sizeString), checker.Matches, humanSizeRegexRaw, check.Commentf("The size '%s' was not in human format", sizeString)) - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_images_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_images_test.go deleted file mode 100644 index 3b678a258..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_images_test.go +++ /dev/null @@ -1,364 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "sort" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/stringid" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestImagesEnsureImageIsListed(c *check.C) { - imagesOut, _ := dockerCmd(c, "images") - c.Assert(imagesOut, checker.Contains, "busybox") -} - -func (s *DockerSuite) TestImagesEnsureImageWithTagIsListed(c *check.C) { - name := "imagewithtag" - dockerCmd(c, "tag", "busybox", name+":v1") - dockerCmd(c, "tag", "busybox", name+":v1v1") - dockerCmd(c, "tag", "busybox", name+":v2") - - imagesOut, _ := dockerCmd(c, "images", name+":v1") - c.Assert(imagesOut, checker.Contains, name) - c.Assert(imagesOut, checker.Contains, "v1") - c.Assert(imagesOut, checker.Not(checker.Contains), "v2") - c.Assert(imagesOut, checker.Not(checker.Contains), "v1v1") - - imagesOut, _ = dockerCmd(c, "images", name) - c.Assert(imagesOut, checker.Contains, name) - c.Assert(imagesOut, checker.Contains, "v1") - c.Assert(imagesOut, checker.Contains, "v1v1") - c.Assert(imagesOut, checker.Contains, "v2") -} - -func (s *DockerSuite) TestImagesEnsureImageWithBadTagIsNotListed(c *check.C) { - imagesOut, _ := dockerCmd(c, "images", "busybox:nonexistent") - c.Assert(imagesOut, checker.Not(checker.Contains), "busybox") -} - -func (s *DockerSuite) TestImagesOrderedByCreationDate(c *check.C) { - id1, err := buildImage("order:test_a", - `FROM busybox - MAINTAINER dockerio1`, true) - c.Assert(err, checker.IsNil) - time.Sleep(1 * time.Second) - id2, err := buildImage("order:test_c", - `FROM busybox - MAINTAINER dockerio2`, true) - c.Assert(err, checker.IsNil) - time.Sleep(1 * time.Second) - id3, err := buildImage("order:test_b", - `FROM busybox - MAINTAINER dockerio3`, true) - c.Assert(err, checker.IsNil) - - out, _ := dockerCmd(c, "images", "-q", "--no-trunc") - imgs := strings.Split(out, "\n") - c.Assert(imgs[0], checker.Equals, id3, check.Commentf("First image must be %s, got %s", id3, imgs[0])) - c.Assert(imgs[1], checker.Equals, id2, check.Commentf("First image must be %s, got %s", id2, imgs[1])) - c.Assert(imgs[2], checker.Equals, id1, check.Commentf("First image must be %s, got %s", id1, imgs[2])) -} - -func (s *DockerSuite) TestImagesErrorWithInvalidFilterNameTest(c *check.C) { - out, _, err := dockerCmdWithError("images", "-f", "FOO=123") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "Invalid filter") -} - -func (s *DockerSuite) TestImagesFilterLabelMatch(c *check.C) { - imageName1 := "images_filter_test1" - imageName2 := "images_filter_test2" - imageName3 := "images_filter_test3" - image1ID, err := buildImage(imageName1, - `FROM busybox - LABEL match me`, true) - c.Assert(err, check.IsNil) - - image2ID, err := buildImage(imageName2, - `FROM busybox - LABEL match="me too"`, true) - c.Assert(err, check.IsNil) - - image3ID, err := buildImage(imageName3, - `FROM busybox - LABEL nomatch me`, true) - c.Assert(err, check.IsNil) - - out, _ := dockerCmd(c, "images", "--no-trunc", "-q", "-f", "label=match") - out = strings.TrimSpace(out) - c.Assert(out, check.Matches, fmt.Sprintf("[\\s\\w:]*%s[\\s\\w:]*", image1ID)) - c.Assert(out, check.Matches, fmt.Sprintf("[\\s\\w:]*%s[\\s\\w:]*", image2ID)) - c.Assert(out, check.Not(check.Matches), fmt.Sprintf("[\\s\\w:]*%s[\\s\\w:]*", image3ID)) - - out, _ = dockerCmd(c, "images", "--no-trunc", "-q", "-f", "label=match=me too") - out = strings.TrimSpace(out) - c.Assert(out, check.Equals, image2ID) -} - -// Regression : #15659 -func (s *DockerSuite) TestImagesFilterLabelWithCommit(c *check.C) { - // Create a container - dockerCmd(c, "run", "--name", "bar", "busybox", "/bin/sh") - // Commit with labels "using changes" - out, _ := dockerCmd(c, "commit", "-c", "LABEL foo.version=1.0.0-1", "-c", "LABEL foo.name=bar", "-c", "LABEL foo.author=starlord", "bar", "bar:1.0.0-1") - imageID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "images", "--no-trunc", "-q", "-f", "label=foo.version=1.0.0-1") - out = strings.TrimSpace(out) - c.Assert(out, check.Equals, imageID) -} - -func (s *DockerSuite) TestImagesFilterSinceAndBefore(c *check.C) { - imageID1, err := buildImage("image:1", `FROM `+minimalBaseImage()+` -LABEL number=1`, true) - c.Assert(err, checker.IsNil) - imageID2, err := buildImage("image:2", `FROM `+minimalBaseImage()+` -LABEL number=2`, true) - c.Assert(err, checker.IsNil) - imageID3, err := buildImage("image:3", `FROM `+minimalBaseImage()+` -LABEL number=3`, true) - c.Assert(err, checker.IsNil) - - expected := []string{imageID3, imageID2} - - out, _ := dockerCmd(c, "images", "-f", "since=image:1", "image") - c.Assert(assertImageList(out, expected), checker.Equals, true, check.Commentf("SINCE filter: Image list is not in the correct order: %v\n%s", expected, out)) - - out, _ = dockerCmd(c, "images", "-f", "since="+imageID1, "image") - c.Assert(assertImageList(out, expected), checker.Equals, true, check.Commentf("SINCE filter: Image list is not in the correct order: %v\n%s", expected, out)) - - expected = []string{imageID3} - - out, _ = dockerCmd(c, "images", "-f", "since=image:2", "image") - c.Assert(assertImageList(out, expected), checker.Equals, true, check.Commentf("SINCE filter: Image list is not in the correct order: %v\n%s", expected, out)) - - out, _ = dockerCmd(c, "images", "-f", "since="+imageID2, "image") - c.Assert(assertImageList(out, expected), checker.Equals, true, check.Commentf("SINCE filter: Image list is not in the correct order: %v\n%s", expected, out)) - - expected = []string{imageID2, imageID1} - - out, _ = dockerCmd(c, "images", "-f", "before=image:3", "image") - c.Assert(assertImageList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter: Image list is not in the correct order: %v\n%s", expected, out)) - - out, _ = dockerCmd(c, "images", "-f", "before="+imageID3, "image") - c.Assert(assertImageList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter: Image list is not in the correct order: %v\n%s", expected, out)) - - expected = []string{imageID1} - - out, _ = dockerCmd(c, "images", "-f", "before=image:2", "image") - c.Assert(assertImageList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter: Image list is not in the correct order: %v\n%s", expected, out)) - - out, _ = dockerCmd(c, "images", "-f", "before="+imageID2, "image") - c.Assert(assertImageList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter: Image list is not in the correct order: %v\n%s", expected, out)) -} - -func assertImageList(out string, expected []string) bool { - lines := strings.Split(strings.Trim(out, "\n "), "\n") - - if len(lines)-1 != len(expected) { - return false - } - - imageIDIndex := strings.Index(lines[0], "IMAGE ID") - for i := 0; i < len(expected); i++ { - imageID := lines[i+1][imageIDIndex : imageIDIndex+12] - found := false - for _, e := range expected { - if imageID == e[7:19] { - found = true - break - } - } - if !found { - return false - } - } - - return true -} - -func (s *DockerSuite) TestImagesFilterSpaceTrimCase(c *check.C) { - imageName := "images_filter_test" - buildImage(imageName, - `FROM busybox - RUN touch /test/foo - RUN touch /test/bar - RUN touch /test/baz`, true) - - filters := []string{ - "dangling=true", - "Dangling=true", - " dangling=true", - "dangling=true ", - "dangling = true", - } - - imageListings := make([][]string, 5, 5) - for idx, filter := range filters { - out, _ := dockerCmd(c, "images", "-q", "-f", filter) - listing := strings.Split(out, "\n") - sort.Strings(listing) - imageListings[idx] = listing - } - - for idx, listing := range imageListings { - if idx < 4 && !reflect.DeepEqual(listing, imageListings[idx+1]) { - for idx, errListing := range imageListings { - fmt.Printf("out %d\n", idx) - for _, image := range errListing { - fmt.Print(image) - } - fmt.Print("") - } - c.Fatalf("All output must be the same") - } - } -} - -func (s *DockerSuite) TestImagesEnsureDanglingImageOnlyListedOnce(c *check.C) { - testRequires(c, DaemonIsLinux) - // create container 1 - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - containerID1 := strings.TrimSpace(out) - - // tag as foobox - out, _ = dockerCmd(c, "commit", containerID1, "foobox") - imageID := stringid.TruncateID(strings.TrimSpace(out)) - - // overwrite the tag, making the previous image dangling - dockerCmd(c, "tag", "busybox", "foobox") - - out, _ = dockerCmd(c, "images", "-q", "-f", "dangling=true") - // Expect one dangling image - c.Assert(strings.Count(out, imageID), checker.Equals, 1) - - out, _ = dockerCmd(c, "images", "-q", "-f", "dangling=false") - //dangling=false would not include dangling images - c.Assert(out, checker.Not(checker.Contains), imageID) - - out, _ = dockerCmd(c, "images") - //docker images still include dangling images - c.Assert(out, checker.Contains, imageID) - -} - -func (s *DockerSuite) TestImagesWithIncorrectFilter(c *check.C) { - out, _, err := dockerCmdWithError("images", "-f", "dangling=invalid") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, "Invalid filter") -} - -func (s *DockerSuite) TestImagesEnsureOnlyHeadsImagesShown(c *check.C) { - dockerfile := ` - FROM busybox - MAINTAINER docker - ENV foo bar` - - head, out, err := buildImageWithOut("scratch-image", dockerfile, false) - c.Assert(err, check.IsNil) - - // this is just the output of docker build - // we're interested in getting the image id of the MAINTAINER instruction - // and that's located at output, line 5, from 7 to end - split := strings.Split(out, "\n") - intermediate := strings.TrimSpace(split[5][7:]) - - out, _ = dockerCmd(c, "images") - // images shouldn't show non-heads images - c.Assert(out, checker.Not(checker.Contains), intermediate) - // images should contain final built images - c.Assert(out, checker.Contains, stringid.TruncateID(head)) -} - -func (s *DockerSuite) TestImagesEnsureImagesFromScratchShown(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support FROM scratch - - dockerfile := ` - FROM scratch - MAINTAINER docker` - - id, _, err := buildImageWithOut("scratch-image", dockerfile, false) - c.Assert(err, check.IsNil) - - out, _ := dockerCmd(c, "images") - // images should contain images built from scratch - c.Assert(out, checker.Contains, stringid.TruncateID(id)) -} - -// For W2W - equivalent to TestImagesEnsureImagesFromScratchShown but Windows -// doesn't support from scratch -func (s *DockerSuite) TestImagesEnsureImagesFromBusyboxShown(c *check.C) { - dockerfile := ` - FROM busybox - MAINTAINER docker` - - id, _, err := buildImageWithOut("busybox-image", dockerfile, false) - c.Assert(err, check.IsNil) - - out, _ := dockerCmd(c, "images") - // images should contain images built from busybox - c.Assert(out, checker.Contains, stringid.TruncateID(id)) -} - -// #18181 -func (s *DockerSuite) TestImagesFilterNameWithPort(c *check.C) { - tag := "a.b.c.d:5000/hello" - dockerCmd(c, "tag", "busybox", tag) - out, _ := dockerCmd(c, "images", tag) - c.Assert(out, checker.Contains, tag) - - out, _ = dockerCmd(c, "images", tag+":latest") - c.Assert(out, checker.Contains, tag) - - out, _ = dockerCmd(c, "images", tag+":no-such-tag") - c.Assert(out, checker.Not(checker.Contains), tag) -} - -func (s *DockerSuite) TestImagesFormat(c *check.C) { - // testRequires(c, DaemonIsLinux) - tag := "myimage" - dockerCmd(c, "tag", "busybox", tag+":v1") - dockerCmd(c, "tag", "busybox", tag+":v2") - - out, _ := dockerCmd(c, "images", "--format", "{{.Repository}}", tag) - lines := strings.Split(strings.TrimSpace(string(out)), "\n") - - expected := []string{"myimage", "myimage"} - var names []string - names = append(names, lines...) - c.Assert(expected, checker.DeepEquals, names, check.Commentf("Expected array with truncated names: %v, got: %v", expected, names)) -} - -// ImagesDefaultFormatAndQuiet -func (s *DockerSuite) TestImagesFormatDefaultFormat(c *check.C) { - testRequires(c, DaemonIsLinux) - - // create container 1 - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - containerID1 := strings.TrimSpace(out) - - // tag as foobox - out, _ = dockerCmd(c, "commit", containerID1, "myimage") - imageID := stringid.TruncateID(strings.TrimSpace(out)) - - config := `{ - "imagesFormat": "{{ .ID }} default" -}` - d, err := ioutil.TempDir("", "integration-cli-") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(d) - - err = ioutil.WriteFile(filepath.Join(d, "config.json"), []byte(config), 0644) - c.Assert(err, checker.IsNil) - - out, _ = dockerCmd(c, "--config", d, "images", "-q", "myimage") - c.Assert(out, checker.Equals, imageID+"\n", check.Commentf("Expected to print only the image id, got %v\n", out)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_import_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_import_test.go deleted file mode 100644 index 57dc2a669..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_import_test.go +++ /dev/null @@ -1,150 +0,0 @@ -package main - -import ( - "bufio" - "compress/gzip" - "io/ioutil" - "os" - "os/exec" - "regexp" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestImportDisplay(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - cleanedContainerID := strings.TrimSpace(out) - - out, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "export", cleanedContainerID), - exec.Command(dockerBinary, "import", "-"), - ) - c.Assert(err, checker.IsNil) - - c.Assert(out, checker.Count, "\n", 1, check.Commentf("display is expected 1 '\\n' but didn't")) - - image := strings.TrimSpace(out) - out, _ = dockerCmd(c, "run", "--rm", image, "true") - c.Assert(out, checker.Equals, "", check.Commentf("command output should've been nothing.")) -} - -func (s *DockerSuite) TestImportBadURL(c *check.C) { - out, _, err := dockerCmdWithError("import", "http://nourl/bad") - c.Assert(err, checker.NotNil, check.Commentf("import was supposed to fail but didn't")) - // Depending on your system you can get either of these errors - if !strings.Contains(out, "dial tcp") && - !strings.Contains(out, "ApplyLayer exit status 1 stdout: stderr: archive/tar: invalid tar header") && - !strings.Contains(out, "Error processing tar file") { - c.Fatalf("expected an error msg but didn't get one.\nErr: %v\nOut: %v", err, out) - } -} - -func (s *DockerSuite) TestImportFile(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "--name", "test-import", "busybox", "true") - - temporaryFile, err := ioutil.TempFile("", "exportImportTest") - c.Assert(err, checker.IsNil, check.Commentf("failed to create temporary file")) - defer os.Remove(temporaryFile.Name()) - - runCmd := exec.Command(dockerBinary, "export", "test-import") - runCmd.Stdout = bufio.NewWriter(temporaryFile) - - _, err = runCommand(runCmd) - c.Assert(err, checker.IsNil, check.Commentf("failed to export a container")) - - out, _ := dockerCmd(c, "import", temporaryFile.Name()) - c.Assert(out, checker.Count, "\n", 1, check.Commentf("display is expected 1 '\\n' but didn't")) - image := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "run", "--rm", image, "true") - c.Assert(out, checker.Equals, "", check.Commentf("command output should've been nothing.")) -} - -func (s *DockerSuite) TestImportGzipped(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "--name", "test-import", "busybox", "true") - - temporaryFile, err := ioutil.TempFile("", "exportImportTest") - c.Assert(err, checker.IsNil, check.Commentf("failed to create temporary file")) - defer os.Remove(temporaryFile.Name()) - - runCmd := exec.Command(dockerBinary, "export", "test-import") - w := gzip.NewWriter(temporaryFile) - runCmd.Stdout = w - - _, err = runCommand(runCmd) - c.Assert(err, checker.IsNil, check.Commentf("failed to export a container")) - err = w.Close() - c.Assert(err, checker.IsNil, check.Commentf("failed to close gzip writer")) - temporaryFile.Close() - out, _ := dockerCmd(c, "import", temporaryFile.Name()) - c.Assert(out, checker.Count, "\n", 1, check.Commentf("display is expected 1 '\\n' but didn't")) - image := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "run", "--rm", image, "true") - c.Assert(out, checker.Equals, "", check.Commentf("command output should've been nothing.")) -} - -func (s *DockerSuite) TestImportFileWithMessage(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "--name", "test-import", "busybox", "true") - - temporaryFile, err := ioutil.TempFile("", "exportImportTest") - c.Assert(err, checker.IsNil, check.Commentf("failed to create temporary file")) - defer os.Remove(temporaryFile.Name()) - - runCmd := exec.Command(dockerBinary, "export", "test-import") - runCmd.Stdout = bufio.NewWriter(temporaryFile) - - _, err = runCommand(runCmd) - c.Assert(err, checker.IsNil, check.Commentf("failed to export a container")) - - message := "Testing commit message" - out, _ := dockerCmd(c, "import", "-m", message, temporaryFile.Name()) - c.Assert(out, checker.Count, "\n", 1, check.Commentf("display is expected 1 '\\n' but didn't")) - image := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "history", image) - split := strings.Split(out, "\n") - - c.Assert(split, checker.HasLen, 3, check.Commentf("expected 3 lines from image history")) - r := regexp.MustCompile("[\\s]{2,}") - split = r.Split(split[1], -1) - - c.Assert(message, checker.Equals, split[3], check.Commentf("didn't get expected value in commit message")) - - out, _ = dockerCmd(c, "run", "--rm", image, "true") - c.Assert(out, checker.Equals, "", check.Commentf("command output should've been nothing")) -} - -func (s *DockerSuite) TestImportFileNonExistentFile(c *check.C) { - _, _, err := dockerCmdWithError("import", "example.com/myImage.tar") - c.Assert(err, checker.NotNil, check.Commentf("import non-existing file must failed")) -} - -func (s *DockerSuite) TestImportWithQuotedChanges(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "--name", "test-import", "busybox", "true") - - temporaryFile, err := ioutil.TempFile("", "exportImportTest") - c.Assert(err, checker.IsNil, check.Commentf("failed to create temporary file")) - defer os.Remove(temporaryFile.Name()) - - result := icmd.RunCmd(icmd.Cmd{ - Command: binaryWithArgs("export", "test-import"), - Stdout: bufio.NewWriter(temporaryFile), - }) - c.Assert(result, icmd.Matches, icmd.Success) - - result = dockerCmdWithResult("import", "-c", `ENTRYPOINT ["/bin/sh", "-c"]`, temporaryFile.Name()) - c.Assert(result, icmd.Matches, icmd.Success) - image := strings.TrimSpace(result.Stdout()) - - result = dockerCmdWithResult("run", "--rm", image, "true") - c.Assert(result, icmd.Matches, icmd.Expected{Out: icmd.None}) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_info_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_info_test.go deleted file mode 100644 index 62ce7e22f..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_info_test.go +++ /dev/null @@ -1,234 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "net" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// ensure docker info succeeds -func (s *DockerSuite) TestInfoEnsureSucceeds(c *check.C) { - out, _ := dockerCmd(c, "info") - - // always shown fields - stringsToCheck := []string{ - "ID:", - "Containers:", - " Running:", - " Paused:", - " Stopped:", - "Images:", - "OSType:", - "Architecture:", - "Logging Driver:", - "Operating System:", - "CPUs:", - "Total Memory:", - "Kernel Version:", - "Storage Driver:", - "Volume:", - "Network:", - "Live Restore Enabled:", - } - - if daemonPlatform == "linux" { - stringsToCheck = append(stringsToCheck, "Init Binary:", "Security Options:", "containerd version:", "runc version:", "init version:") - } - - if DaemonIsLinux.Condition() { - stringsToCheck = append(stringsToCheck, "Runtimes:", "Default Runtime: runc") - } - - if experimentalDaemon { - stringsToCheck = append(stringsToCheck, "Experimental: true") - } else { - stringsToCheck = append(stringsToCheck, "Experimental: false") - } - - for _, linePrefix := range stringsToCheck { - c.Assert(out, checker.Contains, linePrefix, check.Commentf("couldn't find string %v in output", linePrefix)) - } -} - -// TestInfoFormat tests `docker info --format` -func (s *DockerSuite) TestInfoFormat(c *check.C) { - out, status := dockerCmd(c, "info", "--format", "{{json .}}") - c.Assert(status, checker.Equals, 0) - var m map[string]interface{} - err := json.Unmarshal([]byte(out), &m) - c.Assert(err, checker.IsNil) - _, _, err = dockerCmdWithError("info", "--format", "{{.badString}}") - c.Assert(err, checker.NotNil) -} - -// TestInfoDiscoveryBackend verifies that a daemon run with `--cluster-advertise` and -// `--cluster-store` properly show the backend's endpoint in info output. -func (s *DockerSuite) TestInfoDiscoveryBackend(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - d := NewDaemon(c) - discoveryBackend := "consul://consuladdr:consulport/some/path" - discoveryAdvertise := "1.1.1.1:2375" - err := d.Start(fmt.Sprintf("--cluster-store=%s", discoveryBackend), fmt.Sprintf("--cluster-advertise=%s", discoveryAdvertise)) - c.Assert(err, checker.IsNil) - defer d.Stop() - - out, err := d.Cmd("info") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, fmt.Sprintf("Cluster Store: %s\n", discoveryBackend)) - c.Assert(out, checker.Contains, fmt.Sprintf("Cluster Advertise: %s\n", discoveryAdvertise)) -} - -// TestInfoDiscoveryInvalidAdvertise verifies that a daemon run with -// an invalid `--cluster-advertise` configuration -func (s *DockerSuite) TestInfoDiscoveryInvalidAdvertise(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - d := NewDaemon(c) - discoveryBackend := "consul://consuladdr:consulport/some/path" - - // --cluster-advertise with an invalid string is an error - err := d.Start(fmt.Sprintf("--cluster-store=%s", discoveryBackend), "--cluster-advertise=invalid") - c.Assert(err, checker.Not(checker.IsNil)) - - // --cluster-advertise without --cluster-store is also an error - err = d.Start("--cluster-advertise=1.1.1.1:2375") - c.Assert(err, checker.Not(checker.IsNil)) -} - -// TestInfoDiscoveryAdvertiseInterfaceName verifies that a daemon run with `--cluster-advertise` -// configured with interface name properly show the advertise ip-address in info output. -func (s *DockerSuite) TestInfoDiscoveryAdvertiseInterfaceName(c *check.C) { - testRequires(c, SameHostDaemon, Network, DaemonIsLinux) - - d := NewDaemon(c) - discoveryBackend := "consul://consuladdr:consulport/some/path" - discoveryAdvertise := "eth0" - - err := d.Start(fmt.Sprintf("--cluster-store=%s", discoveryBackend), fmt.Sprintf("--cluster-advertise=%s:2375", discoveryAdvertise)) - c.Assert(err, checker.IsNil) - defer d.Stop() - - iface, err := net.InterfaceByName(discoveryAdvertise) - c.Assert(err, checker.IsNil) - addrs, err := iface.Addrs() - c.Assert(err, checker.IsNil) - c.Assert(len(addrs), checker.GreaterThan, 0) - ip, _, err := net.ParseCIDR(addrs[0].String()) - c.Assert(err, checker.IsNil) - - out, err := d.Cmd("info") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, fmt.Sprintf("Cluster Store: %s\n", discoveryBackend)) - c.Assert(out, checker.Contains, fmt.Sprintf("Cluster Advertise: %s:2375\n", ip.String())) -} - -func (s *DockerSuite) TestInfoDisplaysRunningContainers(c *check.C) { - testRequires(c, DaemonIsLinux) - - dockerCmd(c, "run", "-d", "busybox", "top") - out, _ := dockerCmd(c, "info") - c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", 1)) - c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", 1)) - c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", 0)) - c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", 0)) -} - -func (s *DockerSuite) TestInfoDisplaysPausedContainers(c *check.C) { - testRequires(c, IsPausable) - - out, _ := runSleepingContainer(c, "-d") - cleanedContainerID := strings.TrimSpace(out) - - dockerCmd(c, "pause", cleanedContainerID) - - out, _ = dockerCmd(c, "info") - c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", 1)) - c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", 0)) - c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", 1)) - c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", 0)) -} - -func (s *DockerSuite) TestInfoDisplaysStoppedContainers(c *check.C) { - testRequires(c, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - cleanedContainerID := strings.TrimSpace(out) - - dockerCmd(c, "stop", cleanedContainerID) - - out, _ = dockerCmd(c, "info") - c.Assert(out, checker.Contains, fmt.Sprintf("Containers: %d\n", 1)) - c.Assert(out, checker.Contains, fmt.Sprintf(" Running: %d\n", 0)) - c.Assert(out, checker.Contains, fmt.Sprintf(" Paused: %d\n", 0)) - c.Assert(out, checker.Contains, fmt.Sprintf(" Stopped: %d\n", 1)) -} - -func (s *DockerSuite) TestInfoDebug(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - d := NewDaemon(c) - err := d.Start("--debug") - c.Assert(err, checker.IsNil) - defer d.Stop() - - out, err := d.Cmd("--debug", "info") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "Debug Mode (client): true\n") - c.Assert(out, checker.Contains, "Debug Mode (server): true\n") - c.Assert(out, checker.Contains, "File Descriptors") - c.Assert(out, checker.Contains, "Goroutines") - c.Assert(out, checker.Contains, "System Time") - c.Assert(out, checker.Contains, "EventsListeners") - c.Assert(out, checker.Contains, "Docker Root Dir") -} - -func (s *DockerSuite) TestInsecureRegistries(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - registryCIDR := "192.168.1.0/24" - registryHost := "insecurehost.com:5000" - - d := NewDaemon(c) - err := d.Start("--insecure-registry="+registryCIDR, "--insecure-registry="+registryHost) - c.Assert(err, checker.IsNil) - defer d.Stop() - - out, err := d.Cmd("info") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "Insecure Registries:\n") - c.Assert(out, checker.Contains, fmt.Sprintf(" %s\n", registryHost)) - c.Assert(out, checker.Contains, fmt.Sprintf(" %s\n", registryCIDR)) -} - -func (s *DockerDaemonSuite) TestRegistryMirrors(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - registryMirror1 := "https://192.168.1.2" - registryMirror2 := "http://registry.mirror.com:5000" - - err := s.d.Start("--registry-mirror="+registryMirror1, "--registry-mirror="+registryMirror2) - c.Assert(err, checker.IsNil) - - out, err := s.d.Cmd("info") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "Registry Mirrors:\n") - c.Assert(out, checker.Contains, fmt.Sprintf(" %s", registryMirror1)) - c.Assert(out, checker.Contains, fmt.Sprintf(" %s", registryMirror2)) -} - -// Test case for #24392 -func (s *DockerDaemonSuite) TestInfoLabels(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - err := s.d.Start("--label", `test.empty=`, "--label", `test.empty=`, "--label", `test.label="1"`, "--label", `test.label="2"`) - c.Assert(err, checker.IsNil) - - out, err := s.d.Cmd("info") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "WARNING: labels with duplicate keys and conflicting values have been deprecated") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_info_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_info_unix_test.go deleted file mode 100644 index b9323060d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_info_unix_test.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build !windows - -package main - -import ( - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestInfoSecurityOptions(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled, Apparmor, DaemonIsLinux) - - out, _ := dockerCmd(c, "info") - c.Assert(out, checker.Contains, "Security Options:\n apparmor\n seccomp\n Profile: default\n") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_inspect_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_inspect_test.go deleted file mode 100644 index 32ed28afe..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_inspect_test.go +++ /dev/null @@ -1,466 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "os" - "os/exec" - "strconv" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func checkValidGraphDriver(c *check.C, name string) { - if name != "devicemapper" && name != "overlay" && name != "vfs" && name != "zfs" && name != "btrfs" && name != "aufs" { - c.Fatalf("%v is not a valid graph driver name", name) - } -} - -func (s *DockerSuite) TestInspectImage(c *check.C) { - testRequires(c, DaemonIsLinux) - imageTest := "emptyfs" - // It is important that this ID remain stable. If a code change causes - // it to be different, this is equivalent to a cache bust when pulling - // a legacy-format manifest. If the check at the end of this function - // fails, fix the difference in the image serialization instead of - // updating this hash. - imageTestID := "sha256:11f64303f0f7ffdc71f001788132bca5346831939a956e3e975c93267d89a16d" - id := inspectField(c, imageTest, "Id") - - c.Assert(id, checker.Equals, imageTestID) -} - -func (s *DockerSuite) TestInspectInt64(c *check.C) { - dockerCmd(c, "run", "-d", "-m=300M", "--name", "inspectTest", "busybox", "true") - inspectOut := inspectField(c, "inspectTest", "HostConfig.Memory") - c.Assert(inspectOut, checker.Equals, "314572800") -} - -func (s *DockerSuite) TestInspectDefault(c *check.C) { - //Both the container and image are named busybox. docker inspect will fetch the container JSON. - //If the container JSON is not available, it will go for the image JSON. - - out, _ := dockerCmd(c, "run", "--name=busybox", "-d", "busybox", "true") - containerID := strings.TrimSpace(out) - - inspectOut := inspectField(c, "busybox", "Id") - c.Assert(strings.TrimSpace(inspectOut), checker.Equals, containerID) -} - -func (s *DockerSuite) TestInspectStatus(c *check.C) { - if daemonPlatform != "windows" { - defer unpauseAllContainers() - } - out, _ := runSleepingContainer(c, "-d") - out = strings.TrimSpace(out) - - inspectOut := inspectField(c, out, "State.Status") - c.Assert(inspectOut, checker.Equals, "running") - - // Windows does not support pause/unpause on Windows Server Containers. - // (RS1 does for Hyper-V Containers, but production CI is not setup for that) - if daemonPlatform != "windows" { - dockerCmd(c, "pause", out) - inspectOut = inspectField(c, out, "State.Status") - c.Assert(inspectOut, checker.Equals, "paused") - - dockerCmd(c, "unpause", out) - inspectOut = inspectField(c, out, "State.Status") - c.Assert(inspectOut, checker.Equals, "running") - } - - dockerCmd(c, "stop", out) - inspectOut = inspectField(c, out, "State.Status") - c.Assert(inspectOut, checker.Equals, "exited") - -} - -func (s *DockerSuite) TestInspectTypeFlagContainer(c *check.C) { - //Both the container and image are named busybox. docker inspect will fetch container - //JSON State.Running field. If the field is true, it's a container. - runSleepingContainer(c, "--name=busybox", "-d") - - formatStr := "--format={{.State.Running}}" - out, _ := dockerCmd(c, "inspect", "--type=container", formatStr, "busybox") - c.Assert(out, checker.Equals, "true\n") // not a container JSON -} - -func (s *DockerSuite) TestInspectTypeFlagWithNoContainer(c *check.C) { - //Run this test on an image named busybox. docker inspect will try to fetch container - //JSON. Since there is no container named busybox and --type=container, docker inspect will - //not try to get the image JSON. It will throw an error. - - dockerCmd(c, "run", "-d", "busybox", "true") - - _, _, err := dockerCmdWithError("inspect", "--type=container", "busybox") - // docker inspect should fail, as there is no container named busybox - c.Assert(err, checker.NotNil) -} - -func (s *DockerSuite) TestInspectTypeFlagWithImage(c *check.C) { - //Both the container and image are named busybox. docker inspect will fetch image - //JSON as --type=image. if there is no image with name busybox, docker inspect - //will throw an error. - - dockerCmd(c, "run", "--name=busybox", "-d", "busybox", "true") - - out, _ := dockerCmd(c, "inspect", "--type=image", "busybox") - c.Assert(out, checker.Not(checker.Contains), "State") // not an image JSON -} - -func (s *DockerSuite) TestInspectTypeFlagWithInvalidValue(c *check.C) { - //Both the container and image are named busybox. docker inspect will fail - //as --type=foobar is not a valid value for the flag. - - dockerCmd(c, "run", "--name=busybox", "-d", "busybox", "true") - - out, exitCode, err := dockerCmdWithError("inspect", "--type=foobar", "busybox") - c.Assert(err, checker.NotNil, check.Commentf("%s", exitCode)) - c.Assert(exitCode, checker.Equals, 1, check.Commentf("%s", err)) - c.Assert(out, checker.Contains, "not a valid value for --type") -} - -func (s *DockerSuite) TestInspectImageFilterInt(c *check.C) { - testRequires(c, DaemonIsLinux) - imageTest := "emptyfs" - out := inspectField(c, imageTest, "Size") - - size, err := strconv.Atoi(out) - c.Assert(err, checker.IsNil, check.Commentf("failed to inspect size of the image: %s, %v", out, err)) - - //now see if the size turns out to be the same - formatStr := fmt.Sprintf("--format={{eq .Size %d}}", size) - out, _ = dockerCmd(c, "inspect", formatStr, imageTest) - result, err := strconv.ParseBool(strings.TrimSuffix(out, "\n")) - c.Assert(err, checker.IsNil) - c.Assert(result, checker.Equals, true) -} - -func (s *DockerSuite) TestInspectContainerFilterInt(c *check.C) { - runCmd := exec.Command(dockerBinary, "run", "-i", "-a", "stdin", "busybox", "cat") - runCmd.Stdin = strings.NewReader("blahblah") - out, _, _, err := runCommandWithStdoutStderr(runCmd) - c.Assert(err, checker.IsNil, check.Commentf("failed to run container: %v, output: %q", err, out)) - - id := strings.TrimSpace(out) - - out = inspectField(c, id, "State.ExitCode") - - exitCode, err := strconv.Atoi(out) - c.Assert(err, checker.IsNil, check.Commentf("failed to inspect exitcode of the container: %s, %v", out, err)) - - //now get the exit code to verify - formatStr := fmt.Sprintf("--format={{eq .State.ExitCode %d}}", exitCode) - out, _ = dockerCmd(c, "inspect", formatStr, id) - result, err := strconv.ParseBool(strings.TrimSuffix(out, "\n")) - c.Assert(err, checker.IsNil) - c.Assert(result, checker.Equals, true) -} - -func (s *DockerSuite) TestInspectImageGraphDriver(c *check.C) { - testRequires(c, DaemonIsLinux, Devicemapper) - imageTest := "emptyfs" - name := inspectField(c, imageTest, "GraphDriver.Name") - - checkValidGraphDriver(c, name) - - deviceID := inspectField(c, imageTest, "GraphDriver.Data.DeviceId") - - _, err := strconv.Atoi(deviceID) - c.Assert(err, checker.IsNil, check.Commentf("failed to inspect DeviceId of the image: %s, %v", deviceID, err)) - - deviceSize := inspectField(c, imageTest, "GraphDriver.Data.DeviceSize") - - _, err = strconv.ParseUint(deviceSize, 10, 64) - c.Assert(err, checker.IsNil, check.Commentf("failed to inspect DeviceSize of the image: %s, %v", deviceSize, err)) -} - -func (s *DockerSuite) TestInspectContainerGraphDriver(c *check.C) { - testRequires(c, DaemonIsLinux, Devicemapper) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - out = strings.TrimSpace(out) - - name := inspectField(c, out, "GraphDriver.Name") - - checkValidGraphDriver(c, name) - - imageDeviceID := inspectField(c, "busybox", "GraphDriver.Data.DeviceId") - - deviceID := inspectField(c, out, "GraphDriver.Data.DeviceId") - - c.Assert(imageDeviceID, checker.Not(checker.Equals), deviceID) - - _, err := strconv.Atoi(deviceID) - c.Assert(err, checker.IsNil, check.Commentf("failed to inspect DeviceId of the image: %s, %v", deviceID, err)) - - deviceSize := inspectField(c, out, "GraphDriver.Data.DeviceSize") - - _, err = strconv.ParseUint(deviceSize, 10, 64) - c.Assert(err, checker.IsNil, check.Commentf("failed to inspect DeviceSize of the image: %s, %v", deviceSize, err)) -} - -func (s *DockerSuite) TestInspectBindMountPoint(c *check.C) { - modifier := ",z" - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - if daemonPlatform == "windows" { - modifier = "" - // TODO Windows: Temporary check - remove once TP5 support is dropped - if windowsDaemonKV < 14350 { - c.Skip("Needs later Windows build for RO volumes") - } - // Linux creates the host directory if it doesn't exist. Windows does not. - os.Mkdir(`c:\data`, os.ModeDir) - } - - dockerCmd(c, "run", "-d", "--name", "test", "-v", prefix+slash+"data:"+prefix+slash+"data:ro"+modifier, "busybox", "cat") - - vol := inspectFieldJSON(c, "test", "Mounts") - - var mp []types.MountPoint - err := json.Unmarshal([]byte(vol), &mp) - c.Assert(err, checker.IsNil) - - // check that there is only one mountpoint - c.Assert(mp, check.HasLen, 1) - - m := mp[0] - - c.Assert(m.Name, checker.Equals, "") - c.Assert(m.Driver, checker.Equals, "") - c.Assert(m.Source, checker.Equals, prefix+slash+"data") - c.Assert(m.Destination, checker.Equals, prefix+slash+"data") - if daemonPlatform != "windows" { // Windows does not set mode - c.Assert(m.Mode, checker.Equals, "ro"+modifier) - } - c.Assert(m.RW, checker.Equals, false) -} - -func (s *DockerSuite) TestInspectNamedMountPoint(c *check.C) { - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - - dockerCmd(c, "run", "-d", "--name", "test", "-v", "data:"+prefix+slash+"data", "busybox", "cat") - - vol := inspectFieldJSON(c, "test", "Mounts") - - var mp []types.MountPoint - err := json.Unmarshal([]byte(vol), &mp) - c.Assert(err, checker.IsNil) - - // check that there is only one mountpoint - c.Assert(mp, checker.HasLen, 1) - - m := mp[0] - - c.Assert(m.Name, checker.Equals, "data") - c.Assert(m.Driver, checker.Equals, "local") - c.Assert(m.Source, checker.Not(checker.Equals), "") - c.Assert(m.Destination, checker.Equals, prefix+slash+"data") - c.Assert(m.RW, checker.Equals, true) -} - -// #14947 -func (s *DockerSuite) TestInspectTimesAsRFC3339Nano(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - id := strings.TrimSpace(out) - startedAt := inspectField(c, id, "State.StartedAt") - finishedAt := inspectField(c, id, "State.FinishedAt") - created := inspectField(c, id, "Created") - - _, err := time.Parse(time.RFC3339Nano, startedAt) - c.Assert(err, checker.IsNil) - _, err = time.Parse(time.RFC3339Nano, finishedAt) - c.Assert(err, checker.IsNil) - _, err = time.Parse(time.RFC3339Nano, created) - c.Assert(err, checker.IsNil) - - created = inspectField(c, "busybox", "Created") - - _, err = time.Parse(time.RFC3339Nano, created) - c.Assert(err, checker.IsNil) -} - -// #15633 -func (s *DockerSuite) TestInspectLogConfigNoType(c *check.C) { - dockerCmd(c, "create", "--name=test", "--log-opt", "max-file=42", "busybox") - var logConfig container.LogConfig - - out := inspectFieldJSON(c, "test", "HostConfig.LogConfig") - - err := json.NewDecoder(strings.NewReader(out)).Decode(&logConfig) - c.Assert(err, checker.IsNil, check.Commentf("%v", out)) - - c.Assert(logConfig.Type, checker.Equals, "json-file") - c.Assert(logConfig.Config["max-file"], checker.Equals, "42", check.Commentf("%v", logConfig)) -} - -func (s *DockerSuite) TestInspectNoSizeFlagContainer(c *check.C) { - - //Both the container and image are named busybox. docker inspect will fetch container - //JSON SizeRw and SizeRootFs field. If there is no flag --size/-s, there are no size fields. - - runSleepingContainer(c, "--name=busybox", "-d") - - formatStr := "--format={{.SizeRw}},{{.SizeRootFs}}" - out, _ := dockerCmd(c, "inspect", "--type=container", formatStr, "busybox") - c.Assert(strings.TrimSpace(out), check.Equals, ",", check.Commentf("Exepcted not to display size info: %s", out)) -} - -func (s *DockerSuite) TestInspectSizeFlagContainer(c *check.C) { - runSleepingContainer(c, "--name=busybox", "-d") - - formatStr := "--format='{{.SizeRw}},{{.SizeRootFs}}'" - out, _ := dockerCmd(c, "inspect", "-s", "--type=container", formatStr, "busybox") - sz := strings.Split(out, ",") - - c.Assert(strings.TrimSpace(sz[0]), check.Not(check.Equals), "") - c.Assert(strings.TrimSpace(sz[1]), check.Not(check.Equals), "") -} - -func (s *DockerSuite) TestInspectTemplateError(c *check.C) { - // Template parsing error for both the container and image. - - runSleepingContainer(c, "--name=container1", "-d") - - out, _, err := dockerCmdWithError("inspect", "--type=container", "--format='Format container: {{.ThisDoesNotExist}}'", "container1") - c.Assert(err, check.Not(check.IsNil)) - c.Assert(out, checker.Contains, "Template parsing error") - - out, _, err = dockerCmdWithError("inspect", "--type=image", "--format='Format container: {{.ThisDoesNotExist}}'", "busybox") - c.Assert(err, check.Not(check.IsNil)) - c.Assert(out, checker.Contains, "Template parsing error") -} - -func (s *DockerSuite) TestInspectJSONFields(c *check.C) { - runSleepingContainer(c, "--name=busybox", "-d") - out, _, err := dockerCmdWithError("inspect", "--type=container", "--format={{.HostConfig.Dns}}", "busybox") - - c.Assert(err, check.IsNil) - c.Assert(out, checker.Equals, "[]\n") -} - -func (s *DockerSuite) TestInspectByPrefix(c *check.C) { - id := inspectField(c, "busybox", "Id") - c.Assert(id, checker.HasPrefix, "sha256:") - - id2 := inspectField(c, id[:12], "Id") - c.Assert(id, checker.Equals, id2) - - id3 := inspectField(c, strings.TrimPrefix(id, "sha256:")[:12], "Id") - c.Assert(id, checker.Equals, id3) -} - -func (s *DockerSuite) TestInspectStopWhenNotFound(c *check.C) { - runSleepingContainer(c, "--name=busybox", "-d") - runSleepingContainer(c, "--name=not-shown", "-d") - out, _, err := dockerCmdWithError("inspect", "--type=container", "--format='{{.Name}}'", "busybox", "missing", "not-shown") - - c.Assert(err, checker.Not(check.IsNil)) - c.Assert(out, checker.Contains, "busybox") - c.Assert(out, checker.Not(checker.Contains), "not-shown") - c.Assert(out, checker.Contains, "Error: No such container: missing") -} - -func (s *DockerSuite) TestInspectHistory(c *check.C) { - dockerCmd(c, "run", "--name=testcont", "busybox", "echo", "hello") - dockerCmd(c, "commit", "-m", "test comment", "testcont", "testimg") - out, _, err := dockerCmdWithError("inspect", "--format='{{.Comment}}'", "testimg") - c.Assert(err, check.IsNil) - c.Assert(out, checker.Contains, "test comment") -} - -func (s *DockerSuite) TestInspectContainerNetworkDefault(c *check.C) { - testRequires(c, DaemonIsLinux) - - contName := "test1" - dockerCmd(c, "run", "--name", contName, "-d", "busybox", "top") - netOut, _ := dockerCmd(c, "network", "inspect", "--format={{.ID}}", "bridge") - out := inspectField(c, contName, "NetworkSettings.Networks") - c.Assert(out, checker.Contains, "bridge") - out = inspectField(c, contName, "NetworkSettings.Networks.bridge.NetworkID") - c.Assert(strings.TrimSpace(out), checker.Equals, strings.TrimSpace(netOut)) -} - -func (s *DockerSuite) TestInspectContainerNetworkCustom(c *check.C) { - testRequires(c, DaemonIsLinux) - - netOut, _ := dockerCmd(c, "network", "create", "net1") - dockerCmd(c, "run", "--name=container1", "--net=net1", "-d", "busybox", "top") - out := inspectField(c, "container1", "NetworkSettings.Networks") - c.Assert(out, checker.Contains, "net1") - out = inspectField(c, "container1", "NetworkSettings.Networks.net1.NetworkID") - c.Assert(strings.TrimSpace(out), checker.Equals, strings.TrimSpace(netOut)) -} - -func (s *DockerSuite) TestInspectRootFS(c *check.C) { - out, _, err := dockerCmdWithError("inspect", "busybox") - c.Assert(err, check.IsNil) - - var imageJSON []types.ImageInspect - err = json.Unmarshal([]byte(out), &imageJSON) - c.Assert(err, checker.IsNil) - - c.Assert(len(imageJSON[0].RootFS.Layers), checker.GreaterOrEqualThan, 1) -} - -func (s *DockerSuite) TestInspectAmpersand(c *check.C) { - testRequires(c, DaemonIsLinux) - - name := "test" - out, _ := dockerCmd(c, "run", "--name", name, "--env", `TEST_ENV="soanni&rtr"`, "busybox", "env") - c.Assert(out, checker.Contains, `soanni&rtr`) - out, _ = dockerCmd(c, "inspect", name) - c.Assert(out, checker.Contains, `soanni&rtr`) -} - -func (s *DockerSuite) TestInspectPlugin(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - _, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", pNameWithTag) - c.Assert(err, checker.IsNil) - - out, _, err := dockerCmdWithError("inspect", "--type", "plugin", "--format", "{{.Name}}", pNameWithTag) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, pNameWithTag) - - out, _, err = dockerCmdWithError("inspect", "--format", "{{.Name}}", pNameWithTag) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, pNameWithTag) - - // Even without tag the inspect still work - out, _, err = dockerCmdWithError("inspect", "--type", "plugin", "--format", "{{.Name}}", pNameWithTag) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, pNameWithTag) - - out, _, err = dockerCmdWithError("inspect", "--format", "{{.Name}}", pNameWithTag) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, pNameWithTag) - - _, _, err = dockerCmdWithError("plugin", "disable", pNameWithTag) - c.Assert(err, checker.IsNil) - - out, _, err = dockerCmdWithError("plugin", "remove", pNameWithTag) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, pNameWithTag) -} - -// Test case for 29185 -func (s *DockerSuite) TestInspectUnknownObject(c *check.C) { - // This test should work on both Windows and Linux - out, _, err := dockerCmdWithError("inspect", "foobar") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "Error: No such object: foobar") - c.Assert(err.Error(), checker.Contains, "Error: No such object: foobar") -} - -func (s *DockerSuite) TestInpectInvalidReference(c *check.C) { - // This test should work on both Windows and Linux - out, _, err := dockerCmdWithError("inspect", "FooBar") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "Error: No such object: FooBar") - c.Assert(err.Error(), checker.Contains, "Error: No such object: FooBar") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_kill_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_kill_test.go deleted file mode 100644 index 43164801d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_kill_test.go +++ /dev/null @@ -1,134 +0,0 @@ -package main - -import ( - "fmt" - "net/http" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestKillContainer(c *check.C) { - out, _ := runSleepingContainer(c, "-d") - cleanedContainerID := strings.TrimSpace(out) - c.Assert(waitRun(cleanedContainerID), check.IsNil) - - dockerCmd(c, "kill", cleanedContainerID) - c.Assert(waitExited(cleanedContainerID, 10*time.Second), check.IsNil) - - out, _ = dockerCmd(c, "ps", "-q") - c.Assert(out, checker.Not(checker.Contains), cleanedContainerID, check.Commentf("killed container is still running")) - -} - -func (s *DockerSuite) TestKillOffStoppedContainer(c *check.C) { - out, _ := runSleepingContainer(c, "-d") - cleanedContainerID := strings.TrimSpace(out) - - dockerCmd(c, "stop", cleanedContainerID) - c.Assert(waitExited(cleanedContainerID, 10*time.Second), check.IsNil) - - _, _, err := dockerCmdWithError("kill", "-s", "30", cleanedContainerID) - c.Assert(err, check.Not(check.IsNil), check.Commentf("Container %s is not running", cleanedContainerID)) -} - -func (s *DockerSuite) TestKillDifferentUserContainer(c *check.C) { - // TODO Windows: Windows does not yet support -u (Feb 2016). - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-u", "daemon", "-d", "busybox", "top") - cleanedContainerID := strings.TrimSpace(out) - c.Assert(waitRun(cleanedContainerID), check.IsNil) - - dockerCmd(c, "kill", cleanedContainerID) - c.Assert(waitExited(cleanedContainerID, 10*time.Second), check.IsNil) - - out, _ = dockerCmd(c, "ps", "-q") - c.Assert(out, checker.Not(checker.Contains), cleanedContainerID, check.Commentf("killed container is still running")) - -} - -// regression test about correct signal parsing see #13665 -func (s *DockerSuite) TestKillWithSignal(c *check.C) { - // Cannot port to Windows - does not support signals in the same way Linux does - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - cid := strings.TrimSpace(out) - c.Assert(waitRun(cid), check.IsNil) - - dockerCmd(c, "kill", "-s", "SIGWINCH", cid) - time.Sleep(250 * time.Millisecond) - - running := inspectField(c, cid, "State.Running") - - c.Assert(running, checker.Equals, "true", check.Commentf("Container should be in running state after SIGWINCH")) -} - -func (s *DockerSuite) TestKillWithStopSignalWithSameSignalShouldDisableRestartPolicy(c *check.C) { - // Cannot port to Windows - does not support signals int the same way as Linux does - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "--stop-signal=TERM", "--restart=always", "busybox", "top") - cid := strings.TrimSpace(out) - c.Assert(waitRun(cid), check.IsNil) - - // Let docker send a TERM signal to the container - // It will kill the process and disable the restart policy - dockerCmd(c, "kill", "-s", "TERM", cid) - c.Assert(waitExited(cid, 10*time.Second), check.IsNil) - - out, _ = dockerCmd(c, "ps", "-q") - c.Assert(out, checker.Not(checker.Contains), cid, check.Commentf("killed container is still running")) -} - -func (s *DockerSuite) TestKillWithStopSignalWithDifferentSignalShouldKeepRestartPolicy(c *check.C) { - // Cannot port to Windows - does not support signals int the same way as Linux does - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "--stop-signal=CONT", "--restart=always", "busybox", "top") - cid := strings.TrimSpace(out) - c.Assert(waitRun(cid), check.IsNil) - - // Let docker send a TERM signal to the container - // It will kill the process, but not disable the restart policy - dockerCmd(c, "kill", "-s", "TERM", cid) - c.Assert(waitRestart(cid, 10*time.Second), check.IsNil) - - // Restart policy should still be in place, so it should be still running - c.Assert(waitRun(cid), check.IsNil) -} - -// FIXME(vdemeester) should be a unit test -func (s *DockerSuite) TestKillWithInvalidSignal(c *check.C) { - out, _ := runSleepingContainer(c, "-d") - cid := strings.TrimSpace(out) - c.Assert(waitRun(cid), check.IsNil) - - out, _, err := dockerCmdWithError("kill", "-s", "0", cid) - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, "Invalid signal: 0", check.Commentf("Kill with an invalid signal didn't error out correctly")) - - running := inspectField(c, cid, "State.Running") - c.Assert(running, checker.Equals, "true", check.Commentf("Container should be in running state after an invalid signal")) - - out, _ = runSleepingContainer(c, "-d") - cid = strings.TrimSpace(out) - c.Assert(waitRun(cid), check.IsNil) - - out, _, err = dockerCmdWithError("kill", "-s", "SIG42", cid) - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, "Invalid signal: SIG42", check.Commentf("Kill with an invalid signal error out correctly")) - - running = inspectField(c, cid, "State.Running") - c.Assert(running, checker.Equals, "true", check.Commentf("Container should be in running state after an invalid signal")) - -} - -func (s *DockerSuite) TestKillStoppedContainerAPIPre120(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows only supports 1.25 or later - runSleepingContainer(c, "--name", "docker-kill-test-api", "-d") - dockerCmd(c, "stop", "docker-kill-test-api") - - status, _, err := sockRequest("POST", fmt.Sprintf("/v1.19/containers/%s/kill", "docker-kill-test-api"), nil) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusNoContent) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_links_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_links_test.go deleted file mode 100644 index a5872d9e0..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_links_test.go +++ /dev/null @@ -1,240 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "regexp" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/runconfig" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestLinksPingUnlinkedContainers(c *check.C) { - testRequires(c, DaemonIsLinux) - _, exitCode, err := dockerCmdWithError("run", "--rm", "busybox", "sh", "-c", "ping -c 1 alias1 -W 1 && ping -c 1 alias2 -W 1") - - // run ping failed with error - c.Assert(exitCode, checker.Equals, 1, check.Commentf("error: %v", err)) -} - -// Test for appropriate error when calling --link with an invalid target container -func (s *DockerSuite) TestLinksInvalidContainerTarget(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "--link", "bogus:alias", "busybox", "true") - - // an invalid container target should produce an error - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - // an invalid container target should produce an error - c.Assert(out, checker.Contains, "Could not get container") -} - -func (s *DockerSuite) TestLinksPingLinkedContainers(c *check.C) { - testRequires(c, DaemonIsLinux) - // Test with the three different ways of specifying the default network on Linux - testLinkPingOnNetwork(c, "") - testLinkPingOnNetwork(c, "default") - testLinkPingOnNetwork(c, "bridge") -} - -func testLinkPingOnNetwork(c *check.C, network string) { - var postArgs []string - if network != "" { - postArgs = append(postArgs, []string{"--net", network}...) - } - postArgs = append(postArgs, []string{"busybox", "top"}...) - runArgs1 := append([]string{"run", "-d", "--name", "container1", "--hostname", "fred"}, postArgs...) - runArgs2 := append([]string{"run", "-d", "--name", "container2", "--hostname", "wilma"}, postArgs...) - - // Run the two named containers - dockerCmd(c, runArgs1...) - dockerCmd(c, runArgs2...) - - postArgs = []string{} - if network != "" { - postArgs = append(postArgs, []string{"--net", network}...) - } - postArgs = append(postArgs, []string{"busybox", "sh", "-c"}...) - - // Format a run for a container which links to the other two - runArgs := append([]string{"run", "--rm", "--link", "container1:alias1", "--link", "container2:alias2"}, postArgs...) - pingCmd := "ping -c 1 %s -W 1 && ping -c 1 %s -W 1" - - // test ping by alias, ping by name, and ping by hostname - // 1. Ping by alias - dockerCmd(c, append(runArgs, fmt.Sprintf(pingCmd, "alias1", "alias2"))...) - // 2. Ping by container name - dockerCmd(c, append(runArgs, fmt.Sprintf(pingCmd, "container1", "container2"))...) - // 3. Ping by hostname - dockerCmd(c, append(runArgs, fmt.Sprintf(pingCmd, "fred", "wilma"))...) - - // Clean for next round - dockerCmd(c, "rm", "-f", "container1") - dockerCmd(c, "rm", "-f", "container2") -} - -func (s *DockerSuite) TestLinksPingLinkedContainersAfterRename(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "--name", "container1", "busybox", "top") - idA := strings.TrimSpace(out) - out, _ = dockerCmd(c, "run", "-d", "--name", "container2", "busybox", "top") - idB := strings.TrimSpace(out) - dockerCmd(c, "rename", "container1", "container_new") - dockerCmd(c, "run", "--rm", "--link", "container_new:alias1", "--link", "container2:alias2", "busybox", "sh", "-c", "ping -c 1 alias1 -W 1 && ping -c 1 alias2 -W 1") - dockerCmd(c, "kill", idA) - dockerCmd(c, "kill", idB) - -} - -func (s *DockerSuite) TestLinksInspectLinksStarted(c *check.C) { - testRequires(c, DaemonIsLinux) - var ( - expected = map[string]struct{}{"/container1:/testinspectlink/alias1": {}, "/container2:/testinspectlink/alias2": {}} - result []string - ) - dockerCmd(c, "run", "-d", "--name", "container1", "busybox", "top") - dockerCmd(c, "run", "-d", "--name", "container2", "busybox", "top") - dockerCmd(c, "run", "-d", "--name", "testinspectlink", "--link", "container1:alias1", "--link", "container2:alias2", "busybox", "top") - links := inspectFieldJSON(c, "testinspectlink", "HostConfig.Links") - - err := json.Unmarshal([]byte(links), &result) - c.Assert(err, checker.IsNil) - - output := convertSliceOfStringsToMap(result) - - c.Assert(output, checker.DeepEquals, expected) -} - -func (s *DockerSuite) TestLinksInspectLinksStopped(c *check.C) { - testRequires(c, DaemonIsLinux) - var ( - expected = map[string]struct{}{"/container1:/testinspectlink/alias1": {}, "/container2:/testinspectlink/alias2": {}} - result []string - ) - dockerCmd(c, "run", "-d", "--name", "container1", "busybox", "top") - dockerCmd(c, "run", "-d", "--name", "container2", "busybox", "top") - dockerCmd(c, "run", "-d", "--name", "testinspectlink", "--link", "container1:alias1", "--link", "container2:alias2", "busybox", "true") - links := inspectFieldJSON(c, "testinspectlink", "HostConfig.Links") - - err := json.Unmarshal([]byte(links), &result) - c.Assert(err, checker.IsNil) - - output := convertSliceOfStringsToMap(result) - - c.Assert(output, checker.DeepEquals, expected) -} - -func (s *DockerSuite) TestLinksNotStartedParentNotFail(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "create", "--name=first", "busybox", "top") - dockerCmd(c, "create", "--name=second", "--link=first:first", "busybox", "top") - dockerCmd(c, "start", "first") - -} - -func (s *DockerSuite) TestLinksHostsFilesInject(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, SameHostDaemon, ExecSupport) - - out, _ := dockerCmd(c, "run", "-itd", "--name", "one", "busybox", "top") - idOne := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "run", "-itd", "--name", "two", "--link", "one:onetwo", "busybox", "top") - idTwo := strings.TrimSpace(out) - - c.Assert(waitRun(idTwo), checker.IsNil) - - contentOne, err := readContainerFileWithExec(idOne, "/etc/hosts") - c.Assert(err, checker.IsNil, check.Commentf("contentOne: %s", string(contentOne))) - - contentTwo, err := readContainerFileWithExec(idTwo, "/etc/hosts") - c.Assert(err, checker.IsNil, check.Commentf("contentTwo: %s", string(contentTwo))) - // Host is not present in updated hosts file - c.Assert(string(contentTwo), checker.Contains, "onetwo") -} - -func (s *DockerSuite) TestLinksUpdateOnRestart(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, SameHostDaemon, ExecSupport) - dockerCmd(c, "run", "-d", "--name", "one", "busybox", "top") - out, _ := dockerCmd(c, "run", "-d", "--name", "two", "--link", "one:onetwo", "--link", "one:one", "busybox", "top") - id := strings.TrimSpace(string(out)) - - realIP := inspectField(c, "one", "NetworkSettings.Networks.bridge.IPAddress") - content, err := readContainerFileWithExec(id, "/etc/hosts") - c.Assert(err, checker.IsNil) - - getIP := func(hosts []byte, hostname string) string { - re := regexp.MustCompile(fmt.Sprintf(`(\S*)\t%s`, regexp.QuoteMeta(hostname))) - matches := re.FindSubmatch(hosts) - c.Assert(matches, checker.NotNil, check.Commentf("Hostname %s have no matches in hosts", hostname)) - return string(matches[1]) - } - ip := getIP(content, "one") - c.Assert(ip, checker.Equals, realIP) - - ip = getIP(content, "onetwo") - c.Assert(ip, checker.Equals, realIP) - - dockerCmd(c, "restart", "one") - realIP = inspectField(c, "one", "NetworkSettings.Networks.bridge.IPAddress") - - content, err = readContainerFileWithExec(id, "/etc/hosts") - c.Assert(err, checker.IsNil, check.Commentf("content: %s", string(content))) - ip = getIP(content, "one") - c.Assert(ip, checker.Equals, realIP) - - ip = getIP(content, "onetwo") - c.Assert(ip, checker.Equals, realIP) -} - -func (s *DockerSuite) TestLinksEnvs(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "-e", "e1=", "-e", "e2=v2", "-e", "e3=v3=v3", "--name=first", "busybox", "top") - out, _ := dockerCmd(c, "run", "--name=second", "--link=first:first", "busybox", "env") - c.Assert(out, checker.Contains, "FIRST_ENV_e1=\n") - c.Assert(out, checker.Contains, "FIRST_ENV_e2=v2") - c.Assert(out, checker.Contains, "FIRST_ENV_e3=v3=v3") -} - -func (s *DockerSuite) TestLinkShortDefinition(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "--name", "shortlinkdef", "busybox", "top") - - cid := strings.TrimSpace(out) - c.Assert(waitRun(cid), checker.IsNil) - - out, _ = dockerCmd(c, "run", "-d", "--name", "link2", "--link", "shortlinkdef", "busybox", "top") - - cid2 := strings.TrimSpace(out) - c.Assert(waitRun(cid2), checker.IsNil) - - links := inspectFieldJSON(c, cid2, "HostConfig.Links") - c.Assert(links, checker.Equals, "[\"/shortlinkdef:/link2/shortlinkdef\"]") -} - -func (s *DockerSuite) TestLinksNetworkHostContainer(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - dockerCmd(c, "run", "-d", "--net", "host", "--name", "host_container", "busybox", "top") - out, _, err := dockerCmdWithError("run", "--name", "should_fail", "--link", "host_container:tester", "busybox", "true") - - // Running container linking to a container with --net host should have failed - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - // Running container linking to a container with --net host should have failed - c.Assert(out, checker.Contains, runconfig.ErrConflictHostNetworkAndLinks.Error()) -} - -func (s *DockerSuite) TestLinksEtcHostsRegularFile(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, _ := dockerCmd(c, "run", "--net=host", "busybox", "ls", "-la", "/etc/hosts") - // /etc/hosts should be a regular file - c.Assert(out, checker.Matches, "^-.+\n") -} - -func (s *DockerSuite) TestLinksMultipleWithSameName(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--name=upstream-a", "busybox", "top") - dockerCmd(c, "run", "-d", "--name=upstream-b", "busybox", "top") - dockerCmd(c, "run", "--link", "upstream-a:upstream", "--link", "upstream-b:upstream", "busybox", "sh", "-c", "ping -c 1 upstream") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_links_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_links_unix_test.go deleted file mode 100644 index 1af927930..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_links_unix_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// +build !windows - -package main - -import ( - "io/ioutil" - "os" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestLinksEtcHostsContentMatch(c *check.C) { - // In a _unix file as using Unix specific files, and must be on the - // same host as the daemon. - testRequires(c, SameHostDaemon, NotUserNamespace) - - out, _ := dockerCmd(c, "run", "--net=host", "busybox", "cat", "/etc/hosts") - hosts, err := ioutil.ReadFile("/etc/hosts") - if os.IsNotExist(err) { - c.Skip("/etc/hosts does not exist, skip this test") - } - - c.Assert(out, checker.Equals, string(hosts), check.Commentf("container: %s\n\nhost:%s", out, hosts)) - -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_login_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_login_test.go deleted file mode 100644 index 01de75d98..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_login_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package main - -import ( - "bytes" - "os/exec" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestLoginWithoutTTY(c *check.C) { - cmd := exec.Command(dockerBinary, "login") - - // Send to stdin so the process does not get the TTY - cmd.Stdin = bytes.NewBufferString("buffer test string \n") - - // run the command and block until it's done - err := cmd.Run() - c.Assert(err, checker.NotNil) //"Expected non nil err when loginning in & TTY not available" -} - -func (s *DockerRegistryAuthHtpasswdSuite) TestLoginToPrivateRegistry(c *check.C) { - // wrong credentials - out, _, err := dockerCmdWithError("login", "-u", s.reg.username, "-p", "WRONGPASSWORD", privateRegistryURL) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "401 Unauthorized") - - // now it's fine - dockerCmd(c, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) -} - -func (s *DockerRegistryAuthHtpasswdSuite) TestLoginToPrivateRegistryDeprecatedEmailFlag(c *check.C) { - // Test to make sure login still works with the deprecated -e and --email flags - // wrong credentials - out, _, err := dockerCmdWithError("login", "-u", s.reg.username, "-p", "WRONGPASSWORD", "-e", s.reg.email, privateRegistryURL) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "401 Unauthorized") - - // now it's fine - // -e flag - dockerCmd(c, "login", "-u", s.reg.username, "-p", s.reg.password, "-e", s.reg.email, privateRegistryURL) - // --email flag - dockerCmd(c, "login", "-u", s.reg.username, "-p", s.reg.password, "--email", s.reg.email, privateRegistryURL) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_logout_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_logout_test.go deleted file mode 100644 index a5f4b108c..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_logout_test.go +++ /dev/null @@ -1,100 +0,0 @@ -package main - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerRegistryAuthHtpasswdSuite) TestLogoutWithExternalAuth(c *check.C) { - osPath := os.Getenv("PATH") - defer os.Setenv("PATH", osPath) - - workingDir, err := os.Getwd() - c.Assert(err, checker.IsNil) - absolute, err := filepath.Abs(filepath.Join(workingDir, "fixtures", "auth")) - c.Assert(err, checker.IsNil) - testPath := fmt.Sprintf("%s%c%s", osPath, filepath.ListSeparator, absolute) - - os.Setenv("PATH", testPath) - - repoName := fmt.Sprintf("%v/dockercli/busybox:authtest", privateRegistryURL) - - tmp, err := ioutil.TempDir("", "integration-cli-") - c.Assert(err, checker.IsNil) - - externalAuthConfig := `{ "credsStore": "shell-test" }` - - configPath := filepath.Join(tmp, "config.json") - err = ioutil.WriteFile(configPath, []byte(externalAuthConfig), 0644) - c.Assert(err, checker.IsNil) - - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) - - b, err := ioutil.ReadFile(configPath) - c.Assert(err, checker.IsNil) - c.Assert(string(b), checker.Not(checker.Contains), "\"auth\":") - c.Assert(string(b), checker.Contains, privateRegistryURL) - - dockerCmd(c, "--config", tmp, "tag", "busybox", repoName) - dockerCmd(c, "--config", tmp, "push", repoName) - - dockerCmd(c, "--config", tmp, "logout", privateRegistryURL) - - b, err = ioutil.ReadFile(configPath) - c.Assert(err, checker.IsNil) - c.Assert(string(b), checker.Not(checker.Contains), privateRegistryURL) - - // check I cannot pull anymore - out, _, err := dockerCmdWithError("--config", tmp, "pull", repoName) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Error: image dockercli/busybox:authtest not found") -} - -// #23100 -func (s *DockerRegistryAuthHtpasswdSuite) TestLogoutWithWrongHostnamesStored(c *check.C) { - osPath := os.Getenv("PATH") - defer os.Setenv("PATH", osPath) - - workingDir, err := os.Getwd() - c.Assert(err, checker.IsNil) - absolute, err := filepath.Abs(filepath.Join(workingDir, "fixtures", "auth")) - c.Assert(err, checker.IsNil) - testPath := fmt.Sprintf("%s%c%s", osPath, filepath.ListSeparator, absolute) - - os.Setenv("PATH", testPath) - - cmd := exec.Command("docker-credential-shell-test", "store") - stdin := bytes.NewReader([]byte(fmt.Sprintf(`{"ServerURL": "https://%s", "Username": "%s", "Secret": "%s"}`, privateRegistryURL, s.reg.username, s.reg.password))) - cmd.Stdin = stdin - c.Assert(cmd.Run(), checker.IsNil) - - tmp, err := ioutil.TempDir("", "integration-cli-") - c.Assert(err, checker.IsNil) - - externalAuthConfig := fmt.Sprintf(`{ "auths": {"https://%s": {}}, "credsStore": "shell-test" }`, privateRegistryURL) - - configPath := filepath.Join(tmp, "config.json") - err = ioutil.WriteFile(configPath, []byte(externalAuthConfig), 0644) - c.Assert(err, checker.IsNil) - - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) - - b, err := ioutil.ReadFile(configPath) - c.Assert(err, checker.IsNil) - c.Assert(string(b), checker.Contains, fmt.Sprintf("\"https://%s\": {}", privateRegistryURL)) - c.Assert(string(b), checker.Contains, fmt.Sprintf("\"%s\": {}", privateRegistryURL)) - - dockerCmd(c, "--config", tmp, "logout", privateRegistryURL) - - b, err = ioutil.ReadFile(configPath) - c.Assert(err, checker.IsNil) - c.Assert(string(b), checker.Not(checker.Contains), fmt.Sprintf("\"https://%s\": {}", privateRegistryURL)) - c.Assert(string(b), checker.Not(checker.Contains), fmt.Sprintf("\"%s\": {}", privateRegistryURL)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_logs_bench_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_logs_bench_test.go deleted file mode 100644 index eeb008de7..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_logs_bench_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package main - -import ( - "fmt" - "strings" - "time" - - "github.com/go-check/check" -) - -func (s *DockerSuite) BenchmarkLogsCLIRotateFollow(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "--log-opt", "max-size=1b", "--log-opt", "max-file=10", "busybox", "sh", "-c", "while true; do usleep 50000; echo hello; done") - id := strings.TrimSpace(out) - ch := make(chan error, 1) - go func() { - ch <- nil - out, _, _ := dockerCmdWithError("logs", "-f", id) - // if this returns at all, it's an error - ch <- fmt.Errorf(out) - }() - - <-ch - select { - case <-time.After(30 * time.Second): - // ran for 30 seconds with no problem - return - case err := <-ch: - if err != nil { - c.Fatal(err) - } - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_logs_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_logs_test.go deleted file mode 100644 index d2dcad105..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_logs_test.go +++ /dev/null @@ -1,328 +0,0 @@ -package main - -import ( - "fmt" - "io" - "os/exec" - "regexp" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/jsonlog" - "github.com/go-check/check" -) - -// This used to work, it test a log of PageSize-1 (gh#4851) -func (s *DockerSuite) TestLogsContainerSmallerThanPage(c *check.C) { - testLen := 32767 - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", fmt.Sprintf("for i in $(seq 1 %d); do echo -n = >> a.a; done; echo >> a.a; cat a.a", testLen)) - - id := strings.TrimSpace(out) - dockerCmd(c, "wait", id) - - out, _ = dockerCmd(c, "logs", id) - - c.Assert(out, checker.HasLen, testLen+1) -} - -// Regression test: When going over the PageSize, it used to panic (gh#4851) -func (s *DockerSuite) TestLogsContainerBiggerThanPage(c *check.C) { - testLen := 32768 - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", fmt.Sprintf("for i in $(seq 1 %d); do echo -n = >> a.a; done; echo >> a.a; cat a.a", testLen)) - - id := strings.TrimSpace(out) - dockerCmd(c, "wait", id) - - out, _ = dockerCmd(c, "logs", id) - - c.Assert(out, checker.HasLen, testLen+1) -} - -// Regression test: When going much over the PageSize, it used to block (gh#4851) -func (s *DockerSuite) TestLogsContainerMuchBiggerThanPage(c *check.C) { - testLen := 33000 - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", fmt.Sprintf("for i in $(seq 1 %d); do echo -n = >> a.a; done; echo >> a.a; cat a.a", testLen)) - - id := strings.TrimSpace(out) - dockerCmd(c, "wait", id) - - out, _ = dockerCmd(c, "logs", id) - - c.Assert(out, checker.HasLen, testLen+1) -} - -func (s *DockerSuite) TestLogsTimestamps(c *check.C) { - testLen := 100 - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", fmt.Sprintf("for i in $(seq 1 %d); do echo = >> a.a; done; cat a.a", testLen)) - - id := strings.TrimSpace(out) - dockerCmd(c, "wait", id) - - out, _ = dockerCmd(c, "logs", "-t", id) - - lines := strings.Split(out, "\n") - - c.Assert(lines, checker.HasLen, testLen+1) - - ts := regexp.MustCompile(`^.* `) - - for _, l := range lines { - if l != "" { - _, err := time.Parse(jsonlog.RFC3339NanoFixed+" ", ts.FindString(l)) - c.Assert(err, checker.IsNil, check.Commentf("Failed to parse timestamp from %v", l)) - // ensure we have padded 0's - c.Assert(l[29], checker.Equals, uint8('Z')) - } - } -} - -func (s *DockerSuite) TestLogsSeparateStderr(c *check.C) { - msg := "stderr_log" - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", fmt.Sprintf("echo %s 1>&2", msg)) - - id := strings.TrimSpace(out) - dockerCmd(c, "wait", id) - - stdout, stderr, _ := dockerCmdWithStdoutStderr(c, "logs", id) - - c.Assert(stdout, checker.Equals, "") - - stderr = strings.TrimSpace(stderr) - - c.Assert(stderr, checker.Equals, msg) -} - -func (s *DockerSuite) TestLogsStderrInStdout(c *check.C) { - // TODO Windows: Needs investigation why this fails. Obtained string includes - // a bunch of ANSI escape sequences before the "stderr_log" message. - testRequires(c, DaemonIsLinux) - msg := "stderr_log" - out, _ := dockerCmd(c, "run", "-d", "-t", "busybox", "sh", "-c", fmt.Sprintf("echo %s 1>&2", msg)) - - id := strings.TrimSpace(out) - dockerCmd(c, "wait", id) - - stdout, stderr, _ := dockerCmdWithStdoutStderr(c, "logs", id) - c.Assert(stderr, checker.Equals, "") - - stdout = strings.TrimSpace(stdout) - c.Assert(stdout, checker.Equals, msg) -} - -func (s *DockerSuite) TestLogsTail(c *check.C) { - testLen := 100 - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", fmt.Sprintf("for i in $(seq 1 %d); do echo =; done;", testLen)) - - id := strings.TrimSpace(out) - dockerCmd(c, "wait", id) - - out, _ = dockerCmd(c, "logs", "--tail", "0", id) - lines := strings.Split(out, "\n") - c.Assert(lines, checker.HasLen, 1) - - out, _ = dockerCmd(c, "logs", "--tail", "5", id) - lines = strings.Split(out, "\n") - c.Assert(lines, checker.HasLen, 6) - - out, _ = dockerCmd(c, "logs", "--tail", "99", id) - lines = strings.Split(out, "\n") - c.Assert(lines, checker.HasLen, 100) - - out, _ = dockerCmd(c, "logs", "--tail", "all", id) - lines = strings.Split(out, "\n") - c.Assert(lines, checker.HasLen, testLen+1) - - out, _ = dockerCmd(c, "logs", "--tail", "-1", id) - lines = strings.Split(out, "\n") - c.Assert(lines, checker.HasLen, testLen+1) - - out, _, _ = dockerCmdWithStdoutStderr(c, "logs", "--tail", "random", id) - lines = strings.Split(out, "\n") - c.Assert(lines, checker.HasLen, testLen+1) -} - -func (s *DockerSuite) TestLogsFollowStopped(c *check.C) { - dockerCmd(c, "run", "--name=test", "busybox", "echo", "hello") - id, err := getIDByName("test") - c.Assert(err, check.IsNil) - - logsCmd := exec.Command(dockerBinary, "logs", "-f", id) - c.Assert(logsCmd.Start(), checker.IsNil) - - errChan := make(chan error) - go func() { - errChan <- logsCmd.Wait() - close(errChan) - }() - - select { - case err := <-errChan: - c.Assert(err, checker.IsNil) - case <-time.After(30 * time.Second): - c.Fatal("Following logs is hanged") - } -} - -func (s *DockerSuite) TestLogsSince(c *check.C) { - name := "testlogssince" - dockerCmd(c, "run", "--name="+name, "busybox", "/bin/sh", "-c", "for i in $(seq 1 3); do sleep 2; echo log$i; done") - out, _ := dockerCmd(c, "logs", "-t", name) - - log2Line := strings.Split(strings.Split(out, "\n")[1], " ") - t, err := time.Parse(time.RFC3339Nano, log2Line[0]) // the timestamp log2 is written - c.Assert(err, checker.IsNil) - since := t.Unix() + 1 // add 1s so log1 & log2 doesn't show up - out, _ = dockerCmd(c, "logs", "-t", fmt.Sprintf("--since=%v", since), name) - - // Skip 2 seconds - unexpected := []string{"log1", "log2"} - for _, v := range unexpected { - c.Assert(out, checker.Not(checker.Contains), v, check.Commentf("unexpected log message returned, since=%v", since)) - } - - // Test to make sure a bad since format is caught by the client - out, _, _ = dockerCmdWithError("logs", "-t", "--since=2006-01-02T15:04:0Z", name) - c.Assert(out, checker.Contains, "cannot parse \"0Z\" as \"05\"", check.Commentf("bad since format passed to server")) - - // Test with default value specified and parameter omitted - expected := []string{"log1", "log2", "log3"} - for _, cmd := range []*exec.Cmd{ - exec.Command(dockerBinary, "logs", "-t", name), - exec.Command(dockerBinary, "logs", "-t", "--since=0", name), - } { - out, _, err = runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil, check.Commentf("failed to log container: %s", out)) - for _, v := range expected { - c.Assert(out, checker.Contains, v) - } - } -} - -func (s *DockerSuite) TestLogsSinceFutureFollow(c *check.C) { - // TODO Windows TP5 - Figure out why this test is so flakey. Disabled for now. - testRequires(c, DaemonIsLinux) - name := "testlogssincefuturefollow" - out, _ := dockerCmd(c, "run", "-d", "--name", name, "busybox", "/bin/sh", "-c", `for i in $(seq 1 5); do echo log$i; sleep 1; done`) - - // Extract one timestamp from the log file to give us a starting point for - // our `--since` argument. Because the log producer runs in the background, - // we need to check repeatedly for some output to be produced. - var timestamp string - for i := 0; i != 100 && timestamp == ""; i++ { - if out, _ = dockerCmd(c, "logs", "-t", name); out == "" { - time.Sleep(time.Millisecond * 100) // Retry - } else { - timestamp = strings.Split(strings.Split(out, "\n")[0], " ")[0] - } - } - - c.Assert(timestamp, checker.Not(checker.Equals), "") - t, err := time.Parse(time.RFC3339Nano, timestamp) - c.Assert(err, check.IsNil) - - since := t.Unix() + 2 - out, _ = dockerCmd(c, "logs", "-t", "-f", fmt.Sprintf("--since=%v", since), name) - c.Assert(out, checker.Not(checker.HasLen), 0, check.Commentf("cannot read from empty log")) - lines := strings.Split(strings.TrimSpace(out), "\n") - for _, v := range lines { - ts, err := time.Parse(time.RFC3339Nano, strings.Split(v, " ")[0]) - c.Assert(err, checker.IsNil, check.Commentf("cannot parse timestamp output from log: '%v'", v)) - c.Assert(ts.Unix() >= since, checker.Equals, true, check.Commentf("earlier log found. since=%v logdate=%v", since, ts)) - } -} - -// Regression test for #8832 -func (s *DockerSuite) TestLogsFollowSlowStdoutConsumer(c *check.C) { - // TODO Windows: Fix this test for TP5. - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", `usleep 600000;yes X | head -c 200000`) - - id := strings.TrimSpace(out) - - stopSlowRead := make(chan bool) - - go func() { - exec.Command(dockerBinary, "wait", id).Run() - stopSlowRead <- true - }() - - logCmd := exec.Command(dockerBinary, "logs", "-f", id) - stdout, err := logCmd.StdoutPipe() - c.Assert(err, checker.IsNil) - c.Assert(logCmd.Start(), checker.IsNil) - - // First read slowly - bytes1, err := consumeWithSpeed(stdout, 10, 50*time.Millisecond, stopSlowRead) - c.Assert(err, checker.IsNil) - - // After the container has finished we can continue reading fast - bytes2, err := consumeWithSpeed(stdout, 32*1024, 0, nil) - c.Assert(err, checker.IsNil) - - actual := bytes1 + bytes2 - expected := 200000 - c.Assert(actual, checker.Equals, expected) -} - -func (s *DockerSuite) TestLogsFollowGoroutinesWithStdout(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "while true; do echo hello; sleep 2; done") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - nroutines, err := getGoroutineNumber() - c.Assert(err, checker.IsNil) - cmd := exec.Command(dockerBinary, "logs", "-f", id) - r, w := io.Pipe() - cmd.Stdout = w - c.Assert(cmd.Start(), checker.IsNil) - - // Make sure pipe is written to - chErr := make(chan error) - go func() { - b := make([]byte, 1) - _, err := r.Read(b) - chErr <- err - }() - c.Assert(<-chErr, checker.IsNil) - c.Assert(cmd.Process.Kill(), checker.IsNil) - - // NGoroutines is not updated right away, so we need to wait before failing - c.Assert(waitForGoroutines(nroutines), checker.IsNil) -} - -func (s *DockerSuite) TestLogsFollowGoroutinesNoOutput(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "while true; do sleep 2; done") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - nroutines, err := getGoroutineNumber() - c.Assert(err, checker.IsNil) - cmd := exec.Command(dockerBinary, "logs", "-f", id) - c.Assert(cmd.Start(), checker.IsNil) - time.Sleep(200 * time.Millisecond) - c.Assert(cmd.Process.Kill(), checker.IsNil) - - // NGoroutines is not updated right away, so we need to wait before failing - c.Assert(waitForGoroutines(nroutines), checker.IsNil) -} - -func (s *DockerSuite) TestLogsCLIContainerNotFound(c *check.C) { - name := "testlogsnocontainer" - out, _, _ := dockerCmdWithError("logs", name) - message := fmt.Sprintf("Error: No such container: %s\n", name) - c.Assert(out, checker.Equals, message) -} - -func (s *DockerSuite) TestLogsWithDetails(c *check.C) { - dockerCmd(c, "run", "--name=test", "--label", "foo=bar", "-e", "baz=qux", "--log-opt", "labels=foo", "--log-opt", "env=baz", "busybox", "echo", "hello") - out, _ := dockerCmd(c, "logs", "--details", "--timestamps", "test") - - logFields := strings.Fields(strings.TrimSpace(out)) - c.Assert(len(logFields), checker.Equals, 3, check.Commentf(out)) - - details := strings.Split(logFields[1], ",") - c.Assert(details, checker.HasLen, 2) - c.Assert(details[0], checker.Equals, "baz=qux") - c.Assert(details[1], checker.Equals, "foo=bar") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_nat_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_nat_test.go deleted file mode 100644 index 7f4cc2cbd..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_nat_test.go +++ /dev/null @@ -1,93 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "net" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func startServerContainer(c *check.C, msg string, port int) string { - name := "server" - cmd := []string{ - "-d", - "-p", fmt.Sprintf("%d:%d", port, port), - "busybox", - "sh", "-c", fmt.Sprintf("echo %q | nc -lp %d", msg, port), - } - c.Assert(waitForContainer(name, cmd...), check.IsNil) - return name -} - -func getExternalAddress(c *check.C) net.IP { - iface, err := net.InterfaceByName("eth0") - if err != nil { - c.Skip(fmt.Sprintf("Test not running with `make test`. Interface eth0 not found: %v", err)) - } - - ifaceAddrs, err := iface.Addrs() - c.Assert(err, check.IsNil) - c.Assert(ifaceAddrs, checker.Not(checker.HasLen), 0) - - ifaceIP, _, err := net.ParseCIDR(ifaceAddrs[0].String()) - c.Assert(err, check.IsNil) - - return ifaceIP -} - -func getContainerLogs(c *check.C, containerID string) string { - out, _ := dockerCmd(c, "logs", containerID) - return strings.Trim(out, "\r\n") -} - -func getContainerStatus(c *check.C, containerID string) string { - out := inspectField(c, containerID, "State.Running") - return out -} - -func (s *DockerSuite) TestNetworkNat(c *check.C) { - testRequires(c, DaemonIsLinux, SameHostDaemon) - msg := "it works" - startServerContainer(c, msg, 8080) - endpoint := getExternalAddress(c) - conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", endpoint.String(), 8080)) - c.Assert(err, check.IsNil) - - data, err := ioutil.ReadAll(conn) - conn.Close() - c.Assert(err, check.IsNil) - - final := strings.TrimRight(string(data), "\n") - c.Assert(final, checker.Equals, msg) -} - -func (s *DockerSuite) TestNetworkLocalhostTCPNat(c *check.C) { - testRequires(c, DaemonIsLinux, SameHostDaemon) - var ( - msg = "hi yall" - ) - startServerContainer(c, msg, 8081) - conn, err := net.Dial("tcp", "localhost:8081") - c.Assert(err, check.IsNil) - - data, err := ioutil.ReadAll(conn) - conn.Close() - c.Assert(err, check.IsNil) - - final := strings.TrimRight(string(data), "\n") - c.Assert(final, checker.Equals, msg) -} - -func (s *DockerSuite) TestNetworkLoopbackNat(c *check.C) { - testRequires(c, DaemonIsLinux, SameHostDaemon, NotUserNamespace) - msg := "it works" - startServerContainer(c, msg, 8080) - endpoint := getExternalAddress(c) - out, _ := dockerCmd(c, "run", "-t", "--net=container:server", "busybox", - "sh", "-c", fmt.Sprintf("stty raw && nc -w 5 %s 8080", endpoint.String())) - final := strings.TrimRight(string(out), "\n") - c.Assert(final, checker.Equals, msg) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_netmode_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_netmode_test.go deleted file mode 100644 index 4dfad937b..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_netmode_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package main - -import ( - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/runconfig" - "github.com/go-check/check" -) - -// GH14530. Validates combinations of --net= with other options - -// stringCheckPS is how the output of PS starts in order to validate that -// the command executed in a container did really run PS correctly. -const stringCheckPS = "PID USER" - -// DockerCmdWithFail executes a docker command that is supposed to fail and returns -// the output, the exit code. If the command returns a Nil error, it will fail and -// stop the tests. -func dockerCmdWithFail(c *check.C, args ...string) (string, int) { - out, status, err := dockerCmdWithError(args...) - c.Assert(err, check.NotNil, check.Commentf("%v", out)) - return out, status -} - -func (s *DockerSuite) TestNetHostnameWithNetHost(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - - out, _ := dockerCmd(c, "run", "--net=host", "busybox", "ps") - c.Assert(out, checker.Contains, stringCheckPS) -} - -func (s *DockerSuite) TestNetHostname(c *check.C) { - testRequires(c, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-h=name", "busybox", "ps") - c.Assert(out, checker.Contains, stringCheckPS) - - out, _ = dockerCmd(c, "run", "-h=name", "--net=bridge", "busybox", "ps") - c.Assert(out, checker.Contains, stringCheckPS) - - out, _ = dockerCmd(c, "run", "-h=name", "--net=none", "busybox", "ps") - c.Assert(out, checker.Contains, stringCheckPS) - - out, _ = dockerCmdWithFail(c, "run", "-h=name", "--net=container:other", "busybox", "ps") - c.Assert(out, checker.Contains, runconfig.ErrConflictNetworkHostname.Error()) - - out, _ = dockerCmdWithFail(c, "run", "--net=container", "busybox", "ps") - c.Assert(out, checker.Contains, "--net: invalid net mode: invalid container format container:") - - out, _ = dockerCmdWithFail(c, "run", "--net=weird", "busybox", "ps") - c.Assert(out, checker.Contains, "network weird not found") -} - -func (s *DockerSuite) TestConflictContainerNetworkAndLinks(c *check.C) { - testRequires(c, DaemonIsLinux) - - out, _ := dockerCmdWithFail(c, "run", "--net=container:other", "--link=zip:zap", "busybox", "ps") - c.Assert(out, checker.Contains, runconfig.ErrConflictContainerNetworkAndLinks.Error()) -} - -func (s *DockerSuite) TestConflictContainerNetworkHostAndLinks(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - - out, _ := dockerCmdWithFail(c, "run", "--net=host", "--link=zip:zap", "busybox", "ps") - c.Assert(out, checker.Contains, runconfig.ErrConflictHostNetworkAndLinks.Error()) -} - -func (s *DockerSuite) TestConflictNetworkModeNetHostAndOptions(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - - out, _ := dockerCmdWithFail(c, "run", "--net=host", "--mac-address=92:d0:c6:0a:29:33", "busybox", "ps") - c.Assert(out, checker.Contains, runconfig.ErrConflictContainerNetworkAndMac.Error()) -} - -func (s *DockerSuite) TestConflictNetworkModeAndOptions(c *check.C) { - testRequires(c, DaemonIsLinux) - - out, _ := dockerCmdWithFail(c, "run", "--net=container:other", "--dns=8.8.8.8", "busybox", "ps") - c.Assert(out, checker.Contains, runconfig.ErrConflictNetworkAndDNS.Error()) - - out, _ = dockerCmdWithFail(c, "run", "--net=container:other", "--add-host=name:8.8.8.8", "busybox", "ps") - c.Assert(out, checker.Contains, runconfig.ErrConflictNetworkHosts.Error()) - - out, _ = dockerCmdWithFail(c, "run", "--net=container:other", "--mac-address=92:d0:c6:0a:29:33", "busybox", "ps") - c.Assert(out, checker.Contains, runconfig.ErrConflictContainerNetworkAndMac.Error()) - - out, _ = dockerCmdWithFail(c, "run", "--net=container:other", "-P", "busybox", "ps") - c.Assert(out, checker.Contains, runconfig.ErrConflictNetworkPublishPorts.Error()) - - out, _ = dockerCmdWithFail(c, "run", "--net=container:other", "-p", "8080", "busybox", "ps") - c.Assert(out, checker.Contains, runconfig.ErrConflictNetworkPublishPorts.Error()) - - out, _ = dockerCmdWithFail(c, "run", "--net=container:other", "--expose", "8000-9000", "busybox", "ps") - c.Assert(out, checker.Contains, runconfig.ErrConflictNetworkExposePorts.Error()) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_network_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_network_unix_test.go deleted file mode 100644 index 97f204ab4..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_network_unix_test.go +++ /dev/null @@ -1,1791 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "net" - "net/http" - "net/http/httptest" - "os" - "path/filepath" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/versions/v1p20" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/runconfig" - "github.com/docker/libnetwork/driverapi" - remoteapi "github.com/docker/libnetwork/drivers/remote/api" - "github.com/docker/libnetwork/ipamapi" - remoteipam "github.com/docker/libnetwork/ipams/remote/api" - "github.com/docker/libnetwork/netlabel" - "github.com/go-check/check" - "github.com/vishvananda/netlink" -) - -const dummyNetworkDriver = "dummy-network-driver" -const dummyIPAMDriver = "dummy-ipam-driver" - -var remoteDriverNetworkRequest remoteapi.CreateNetworkRequest - -func init() { - check.Suite(&DockerNetworkSuite{ - ds: &DockerSuite{}, - }) -} - -type DockerNetworkSuite struct { - server *httptest.Server - ds *DockerSuite - d *Daemon -} - -func (s *DockerNetworkSuite) SetUpTest(c *check.C) { - s.d = NewDaemon(c) -} - -func (s *DockerNetworkSuite) TearDownTest(c *check.C) { - s.d.Stop() - s.ds.TearDownTest(c) -} - -func (s *DockerNetworkSuite) SetUpSuite(c *check.C) { - mux := http.NewServeMux() - s.server = httptest.NewServer(mux) - c.Assert(s.server, check.NotNil, check.Commentf("Failed to start an HTTP Server")) - setupRemoteNetworkDrivers(c, mux, s.server.URL, dummyNetworkDriver, dummyIPAMDriver) -} - -func setupRemoteNetworkDrivers(c *check.C, mux *http.ServeMux, url, netDrv, ipamDrv string) { - - mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, `{"Implements": ["%s", "%s"]}`, driverapi.NetworkPluginEndpointType, ipamapi.PluginEndpointType) - }) - - // Network driver implementation - mux.HandleFunc(fmt.Sprintf("/%s.GetCapabilities", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, `{"Scope":"local"}`) - }) - - mux.HandleFunc(fmt.Sprintf("/%s.CreateNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - err := json.NewDecoder(r.Body).Decode(&remoteDriverNetworkRequest) - if err != nil { - http.Error(w, "Unable to decode JSON payload: "+err.Error(), http.StatusBadRequest) - return - } - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, "null") - }) - - mux.HandleFunc(fmt.Sprintf("/%s.DeleteNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, "null") - }) - - mux.HandleFunc(fmt.Sprintf("/%s.CreateEndpoint", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, `{"Interface":{"MacAddress":"a0:b1:c2:d3:e4:f5"}}`) - }) - - mux.HandleFunc(fmt.Sprintf("/%s.Join", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - - veth := &netlink.Veth{ - LinkAttrs: netlink.LinkAttrs{Name: "randomIfName", TxQLen: 0}, PeerName: "cnt0"} - if err := netlink.LinkAdd(veth); err != nil { - fmt.Fprintf(w, `{"Error":"failed to add veth pair: `+err.Error()+`"}`) - } else { - fmt.Fprintf(w, `{"InterfaceName":{ "SrcName":"cnt0", "DstPrefix":"veth"}}`) - } - }) - - mux.HandleFunc(fmt.Sprintf("/%s.Leave", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, "null") - }) - - mux.HandleFunc(fmt.Sprintf("/%s.DeleteEndpoint", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - if link, err := netlink.LinkByName("cnt0"); err == nil { - netlink.LinkDel(link) - } - fmt.Fprintf(w, "null") - }) - - // IPAM Driver implementation - var ( - poolRequest remoteipam.RequestPoolRequest - poolReleaseReq remoteipam.ReleasePoolRequest - addressRequest remoteipam.RequestAddressRequest - addressReleaseReq remoteipam.ReleaseAddressRequest - lAS = "localAS" - gAS = "globalAS" - pool = "172.28.0.0/16" - poolID = lAS + "/" + pool - gw = "172.28.255.254/16" - ) - - mux.HandleFunc(fmt.Sprintf("/%s.GetDefaultAddressSpaces", ipamapi.PluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, `{"LocalDefaultAddressSpace":"`+lAS+`", "GlobalDefaultAddressSpace": "`+gAS+`"}`) - }) - - mux.HandleFunc(fmt.Sprintf("/%s.RequestPool", ipamapi.PluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - err := json.NewDecoder(r.Body).Decode(&poolRequest) - if err != nil { - http.Error(w, "Unable to decode JSON payload: "+err.Error(), http.StatusBadRequest) - return - } - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - if poolRequest.AddressSpace != lAS && poolRequest.AddressSpace != gAS { - fmt.Fprintf(w, `{"Error":"Unknown address space in pool request: `+poolRequest.AddressSpace+`"}`) - } else if poolRequest.Pool != "" && poolRequest.Pool != pool { - fmt.Fprintf(w, `{"Error":"Cannot handle explicit pool requests yet"}`) - } else { - fmt.Fprintf(w, `{"PoolID":"`+poolID+`", "Pool":"`+pool+`"}`) - } - }) - - mux.HandleFunc(fmt.Sprintf("/%s.RequestAddress", ipamapi.PluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - err := json.NewDecoder(r.Body).Decode(&addressRequest) - if err != nil { - http.Error(w, "Unable to decode JSON payload: "+err.Error(), http.StatusBadRequest) - return - } - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - // make sure libnetwork is now querying on the expected pool id - if addressRequest.PoolID != poolID { - fmt.Fprintf(w, `{"Error":"unknown pool id"}`) - } else if addressRequest.Address != "" { - fmt.Fprintf(w, `{"Error":"Cannot handle explicit address requests yet"}`) - } else { - fmt.Fprintf(w, `{"Address":"`+gw+`"}`) - } - }) - - mux.HandleFunc(fmt.Sprintf("/%s.ReleaseAddress", ipamapi.PluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - err := json.NewDecoder(r.Body).Decode(&addressReleaseReq) - if err != nil { - http.Error(w, "Unable to decode JSON payload: "+err.Error(), http.StatusBadRequest) - return - } - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - // make sure libnetwork is now asking to release the expected address from the expected poolid - if addressRequest.PoolID != poolID { - fmt.Fprintf(w, `{"Error":"unknown pool id"}`) - } else if addressReleaseReq.Address != gw { - fmt.Fprintf(w, `{"Error":"unknown address"}`) - } else { - fmt.Fprintf(w, "null") - } - }) - - mux.HandleFunc(fmt.Sprintf("/%s.ReleasePool", ipamapi.PluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - err := json.NewDecoder(r.Body).Decode(&poolReleaseReq) - if err != nil { - http.Error(w, "Unable to decode JSON payload: "+err.Error(), http.StatusBadRequest) - return - } - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - // make sure libnetwork is now asking to release the expected poolid - if addressRequest.PoolID != poolID { - fmt.Fprintf(w, `{"Error":"unknown pool id"}`) - } else { - fmt.Fprintf(w, "null") - } - }) - - err := os.MkdirAll("/etc/docker/plugins", 0755) - c.Assert(err, checker.IsNil) - - fileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", netDrv) - err = ioutil.WriteFile(fileName, []byte(url), 0644) - c.Assert(err, checker.IsNil) - - ipamFileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", ipamDrv) - err = ioutil.WriteFile(ipamFileName, []byte(url), 0644) - c.Assert(err, checker.IsNil) -} - -func (s *DockerNetworkSuite) TearDownSuite(c *check.C) { - if s.server == nil { - return - } - - s.server.Close() - - err := os.RemoveAll("/etc/docker/plugins") - c.Assert(err, checker.IsNil) -} - -func assertNwIsAvailable(c *check.C, name string) { - if !isNwPresent(c, name) { - c.Fatalf("Network %s not found in network ls o/p", name) - } -} - -func assertNwNotAvailable(c *check.C, name string) { - if isNwPresent(c, name) { - c.Fatalf("Found network %s in network ls o/p", name) - } -} - -func isNwPresent(c *check.C, name string) bool { - out, _ := dockerCmd(c, "network", "ls") - lines := strings.Split(out, "\n") - for i := 1; i < len(lines)-1; i++ { - netFields := strings.Fields(lines[i]) - if netFields[1] == name { - return true - } - } - return false -} - -// assertNwList checks network list retrieved with ls command -// equals to expected network list -// note: out should be `network ls [option]` result -func assertNwList(c *check.C, out string, expectNws []string) { - lines := strings.Split(out, "\n") - var nwList []string - for _, line := range lines[1 : len(lines)-1] { - netFields := strings.Fields(line) - // wrap all network name in nwList - nwList = append(nwList, netFields[1]) - } - - // network ls should contains all expected networks - c.Assert(nwList, checker.DeepEquals, expectNws) -} - -func getNwResource(c *check.C, name string) *types.NetworkResource { - out, _ := dockerCmd(c, "network", "inspect", name) - nr := []types.NetworkResource{} - err := json.Unmarshal([]byte(out), &nr) - c.Assert(err, check.IsNil) - return &nr[0] -} - -func (s *DockerNetworkSuite) TestDockerNetworkLsDefault(c *check.C) { - defaults := []string{"bridge", "host", "none"} - for _, nn := range defaults { - assertNwIsAvailable(c, nn) - } -} - -func (s *DockerSuite) TestNetworkLsFormat(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "network", "ls", "--format", "{{.Name}}") - lines := strings.Split(strings.TrimSpace(string(out)), "\n") - - expected := []string{"bridge", "host", "none"} - var names []string - names = append(names, lines...) - c.Assert(expected, checker.DeepEquals, names, check.Commentf("Expected array with truncated names: %v, got: %v", expected, names)) -} - -func (s *DockerSuite) TestNetworkLsFormatDefaultFormat(c *check.C) { - testRequires(c, DaemonIsLinux) - - config := `{ - "networksFormat": "{{ .Name }} default" -}` - d, err := ioutil.TempDir("", "integration-cli-") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(d) - - err = ioutil.WriteFile(filepath.Join(d, "config.json"), []byte(config), 0644) - c.Assert(err, checker.IsNil) - - out, _ := dockerCmd(c, "--config", d, "network", "ls") - lines := strings.Split(strings.TrimSpace(string(out)), "\n") - - expected := []string{"bridge default", "host default", "none default"} - var names []string - names = append(names, lines...) - c.Assert(expected, checker.DeepEquals, names, check.Commentf("Expected array with truncated names: %v, got: %v", expected, names)) -} - -func (s *DockerNetworkSuite) TestDockerNetworkCreatePredefined(c *check.C) { - predefined := []string{"bridge", "host", "none", "default"} - for _, net := range predefined { - // predefined networks can't be created again - out, _, err := dockerCmdWithError("network", "create", net) - c.Assert(err, checker.NotNil, check.Commentf("%v", out)) - } -} - -func (s *DockerNetworkSuite) TestDockerNetworkCreateHostBind(c *check.C) { - dockerCmd(c, "network", "create", "--subnet=192.168.10.0/24", "--gateway=192.168.10.1", "-o", "com.docker.network.bridge.host_binding_ipv4=192.168.10.1", "testbind") - assertNwIsAvailable(c, "testbind") - - out, _ := runSleepingContainer(c, "--net=testbind", "-p", "5000:5000") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - out, _ = dockerCmd(c, "ps") - c.Assert(out, checker.Contains, "192.168.10.1:5000->5000/tcp") -} - -func (s *DockerNetworkSuite) TestDockerNetworkRmPredefined(c *check.C) { - predefined := []string{"bridge", "host", "none", "default"} - for _, net := range predefined { - // predefined networks can't be removed - out, _, err := dockerCmdWithError("network", "rm", net) - c.Assert(err, checker.NotNil, check.Commentf("%v", out)) - } -} - -func (s *DockerNetworkSuite) TestDockerNetworkLsFilter(c *check.C) { - testNet := "testnet1" - testLabel := "foo" - testValue := "bar" - out, _ := dockerCmd(c, "network", "create", "dev") - defer func() { - dockerCmd(c, "network", "rm", "dev") - dockerCmd(c, "network", "rm", testNet) - }() - networkID := strings.TrimSpace(out) - - // filter with partial ID - // only show 'dev' network - out, _ = dockerCmd(c, "network", "ls", "-f", "id="+networkID[0:5]) - assertNwList(c, out, []string{"dev"}) - - out, _ = dockerCmd(c, "network", "ls", "-f", "name=dge") - assertNwList(c, out, []string{"bridge"}) - - // only show built-in network (bridge, none, host) - out, _ = dockerCmd(c, "network", "ls", "-f", "type=builtin") - assertNwList(c, out, []string{"bridge", "host", "none"}) - - // only show custom networks (dev) - out, _ = dockerCmd(c, "network", "ls", "-f", "type=custom") - assertNwList(c, out, []string{"dev"}) - - // show all networks with filter - // it should be equivalent of ls without option - out, _ = dockerCmd(c, "network", "ls", "-f", "type=custom", "-f", "type=builtin") - assertNwList(c, out, []string{"bridge", "dev", "host", "none"}) - - out, _ = dockerCmd(c, "network", "create", "--label", testLabel+"="+testValue, testNet) - assertNwIsAvailable(c, testNet) - - out, _ = dockerCmd(c, "network", "ls", "-f", "label="+testLabel) - assertNwList(c, out, []string{testNet}) - - out, _ = dockerCmd(c, "network", "ls", "-f", "label="+testLabel+"="+testValue) - assertNwList(c, out, []string{testNet}) - - out, _ = dockerCmd(c, "network", "ls", "-f", "label=nonexistent") - outArr := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 1, check.Commentf("%s\n", out)) - - out, _ = dockerCmd(c, "network", "ls", "-f", "driver=null") - assertNwList(c, out, []string{"none"}) - - out, _ = dockerCmd(c, "network", "ls", "-f", "driver=host") - assertNwList(c, out, []string{"host"}) - - out, _ = dockerCmd(c, "network", "ls", "-f", "driver=bridge") - assertNwList(c, out, []string{"bridge", "dev", testNet}) -} - -func (s *DockerNetworkSuite) TestDockerNetworkCreateDelete(c *check.C) { - dockerCmd(c, "network", "create", "test") - assertNwIsAvailable(c, "test") - - dockerCmd(c, "network", "rm", "test") - assertNwNotAvailable(c, "test") -} - -func (s *DockerNetworkSuite) TestDockerNetworkCreateLabel(c *check.C) { - testNet := "testnetcreatelabel" - testLabel := "foo" - testValue := "bar" - - dockerCmd(c, "network", "create", "--label", testLabel+"="+testValue, testNet) - assertNwIsAvailable(c, testNet) - - out, _, err := dockerCmdWithError("network", "inspect", "--format={{ .Labels."+testLabel+" }}", testNet) - c.Assert(err, check.IsNil) - c.Assert(strings.TrimSpace(out), check.Equals, testValue) - - dockerCmd(c, "network", "rm", testNet) - assertNwNotAvailable(c, testNet) -} - -func (s *DockerSuite) TestDockerNetworkDeleteNotExists(c *check.C) { - out, _, err := dockerCmdWithError("network", "rm", "test") - c.Assert(err, checker.NotNil, check.Commentf("%v", out)) -} - -func (s *DockerSuite) TestDockerNetworkDeleteMultiple(c *check.C) { - dockerCmd(c, "network", "create", "testDelMulti0") - assertNwIsAvailable(c, "testDelMulti0") - dockerCmd(c, "network", "create", "testDelMulti1") - assertNwIsAvailable(c, "testDelMulti1") - dockerCmd(c, "network", "create", "testDelMulti2") - assertNwIsAvailable(c, "testDelMulti2") - out, _ := dockerCmd(c, "run", "-d", "--net", "testDelMulti2", "busybox", "top") - containerID := strings.TrimSpace(out) - waitRun(containerID) - - // delete three networks at the same time, since testDelMulti2 - // contains active container, its deletion should fail. - out, _, err := dockerCmdWithError("network", "rm", "testDelMulti0", "testDelMulti1", "testDelMulti2") - // err should not be nil due to deleting testDelMulti2 failed. - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - // testDelMulti2 should fail due to network has active endpoints - c.Assert(out, checker.Contains, "has active endpoints") - assertNwNotAvailable(c, "testDelMulti0") - assertNwNotAvailable(c, "testDelMulti1") - // testDelMulti2 can't be deleted, so it should exist - assertNwIsAvailable(c, "testDelMulti2") -} - -func (s *DockerSuite) TestDockerNetworkInspect(c *check.C) { - out, _ := dockerCmd(c, "network", "inspect", "host") - networkResources := []types.NetworkResource{} - err := json.Unmarshal([]byte(out), &networkResources) - c.Assert(err, check.IsNil) - c.Assert(networkResources, checker.HasLen, 1) - - out, _ = dockerCmd(c, "network", "inspect", "--format={{ .Name }}", "host") - c.Assert(strings.TrimSpace(out), check.Equals, "host") -} - -func (s *DockerSuite) TestDockerNetworkInspectWithID(c *check.C) { - out, _ := dockerCmd(c, "network", "create", "test2") - networkID := strings.TrimSpace(out) - assertNwIsAvailable(c, "test2") - out, _ = dockerCmd(c, "network", "inspect", "--format={{ .Id }}", "test2") - c.Assert(strings.TrimSpace(out), check.Equals, networkID) - - out, _ = dockerCmd(c, "network", "inspect", "--format={{ .ID }}", "test2") - c.Assert(strings.TrimSpace(out), check.Equals, networkID) -} - -func (s *DockerSuite) TestDockerInspectMultipleNetwork(c *check.C) { - result := dockerCmdWithResult("network", "inspect", "host", "none") - c.Assert(result, icmd.Matches, icmd.Success) - - networkResources := []types.NetworkResource{} - err := json.Unmarshal([]byte(result.Stdout()), &networkResources) - c.Assert(err, check.IsNil) - c.Assert(networkResources, checker.HasLen, 2) - - // Should print an error, return an exitCode 1 *but* should print the host network - result = dockerCmdWithResult("network", "inspect", "host", "nonexistent") - c.Assert(result, icmd.Matches, icmd.Expected{ - ExitCode: 1, - Err: "Error: No such network: nonexistent", - Out: "host", - }) - - networkResources = []types.NetworkResource{} - err = json.Unmarshal([]byte(result.Stdout()), &networkResources) - c.Assert(networkResources, checker.HasLen, 1) - - // Should print an error and return an exitCode, nothing else - result = dockerCmdWithResult("network", "inspect", "nonexistent") - c.Assert(result, icmd.Matches, icmd.Expected{ - ExitCode: 1, - Err: "Error: No such network: nonexistent", - Out: "[]", - }) -} - -func (s *DockerSuite) TestDockerInspectNetworkWithContainerName(c *check.C) { - dockerCmd(c, "network", "create", "brNetForInspect") - assertNwIsAvailable(c, "brNetForInspect") - defer func() { - dockerCmd(c, "network", "rm", "brNetForInspect") - assertNwNotAvailable(c, "brNetForInspect") - }() - - out, _ := dockerCmd(c, "run", "-d", "--name", "testNetInspect1", "--net", "brNetForInspect", "busybox", "top") - c.Assert(waitRun("testNetInspect1"), check.IsNil) - containerID := strings.TrimSpace(out) - defer func() { - // we don't stop container by name, because we'll rename it later - dockerCmd(c, "stop", containerID) - }() - - out, _ = dockerCmd(c, "network", "inspect", "brNetForInspect") - networkResources := []types.NetworkResource{} - err := json.Unmarshal([]byte(out), &networkResources) - c.Assert(err, check.IsNil) - c.Assert(networkResources, checker.HasLen, 1) - container, ok := networkResources[0].Containers[containerID] - c.Assert(ok, checker.True) - c.Assert(container.Name, checker.Equals, "testNetInspect1") - - // rename container and check docker inspect output update - newName := "HappyNewName" - dockerCmd(c, "rename", "testNetInspect1", newName) - - // check whether network inspect works properly - out, _ = dockerCmd(c, "network", "inspect", "brNetForInspect") - newNetRes := []types.NetworkResource{} - err = json.Unmarshal([]byte(out), &newNetRes) - c.Assert(err, check.IsNil) - c.Assert(newNetRes, checker.HasLen, 1) - container1, ok := newNetRes[0].Containers[containerID] - c.Assert(ok, checker.True) - c.Assert(container1.Name, checker.Equals, newName) - -} - -func (s *DockerNetworkSuite) TestDockerNetworkConnectDisconnect(c *check.C) { - dockerCmd(c, "network", "create", "test") - assertNwIsAvailable(c, "test") - nr := getNwResource(c, "test") - - c.Assert(nr.Name, checker.Equals, "test") - c.Assert(len(nr.Containers), checker.Equals, 0) - - // run a container - out, _ := dockerCmd(c, "run", "-d", "--name", "test", "busybox", "top") - c.Assert(waitRun("test"), check.IsNil) - containerID := strings.TrimSpace(out) - - // connect the container to the test network - dockerCmd(c, "network", "connect", "test", containerID) - - // inspect the network to make sure container is connected - nr = getNetworkResource(c, nr.ID) - c.Assert(len(nr.Containers), checker.Equals, 1) - c.Assert(nr.Containers[containerID], check.NotNil) - - // check if container IP matches network inspect - ip, _, err := net.ParseCIDR(nr.Containers[containerID].IPv4Address) - c.Assert(err, check.IsNil) - containerIP := findContainerIP(c, "test", "test") - c.Assert(ip.String(), checker.Equals, containerIP) - - // disconnect container from the network - dockerCmd(c, "network", "disconnect", "test", containerID) - nr = getNwResource(c, "test") - c.Assert(nr.Name, checker.Equals, "test") - c.Assert(len(nr.Containers), checker.Equals, 0) - - // run another container - out, _ = dockerCmd(c, "run", "-d", "--net", "test", "--name", "test2", "busybox", "top") - c.Assert(waitRun("test2"), check.IsNil) - containerID = strings.TrimSpace(out) - - nr = getNwResource(c, "test") - c.Assert(nr.Name, checker.Equals, "test") - c.Assert(len(nr.Containers), checker.Equals, 1) - - // force disconnect the container to the test network - dockerCmd(c, "network", "disconnect", "-f", "test", containerID) - - nr = getNwResource(c, "test") - c.Assert(nr.Name, checker.Equals, "test") - c.Assert(len(nr.Containers), checker.Equals, 0) - - dockerCmd(c, "network", "rm", "test") - assertNwNotAvailable(c, "test") -} - -func (s *DockerNetworkSuite) TestDockerNetworkIPAMMultipleNetworks(c *check.C) { - // test0 bridge network - dockerCmd(c, "network", "create", "--subnet=192.168.0.0/16", "test1") - assertNwIsAvailable(c, "test1") - - // test2 bridge network does not overlap - dockerCmd(c, "network", "create", "--subnet=192.169.0.0/16", "test2") - assertNwIsAvailable(c, "test2") - - // for networks w/o ipam specified, docker will choose proper non-overlapping subnets - dockerCmd(c, "network", "create", "test3") - assertNwIsAvailable(c, "test3") - dockerCmd(c, "network", "create", "test4") - assertNwIsAvailable(c, "test4") - dockerCmd(c, "network", "create", "test5") - assertNwIsAvailable(c, "test5") - - // test network with multiple subnets - // bridge network doesn't support multiple subnets. hence, use a dummy driver that supports - - dockerCmd(c, "network", "create", "-d", dummyNetworkDriver, "--subnet=192.168.0.0/16", "--subnet=192.170.0.0/16", "test6") - assertNwIsAvailable(c, "test6") - - // test network with multiple subnets with valid ipam combinations - // also check same subnet across networks when the driver supports it. - dockerCmd(c, "network", "create", "-d", dummyNetworkDriver, - "--subnet=192.168.0.0/16", "--subnet=192.170.0.0/16", - "--gateway=192.168.0.100", "--gateway=192.170.0.100", - "--ip-range=192.168.1.0/24", - "--aux-address", "a=192.168.1.5", "--aux-address", "b=192.168.1.6", - "--aux-address", "c=192.170.1.5", "--aux-address", "d=192.170.1.6", - "test7") - assertNwIsAvailable(c, "test7") - - // cleanup - for i := 1; i < 8; i++ { - dockerCmd(c, "network", "rm", fmt.Sprintf("test%d", i)) - } -} - -func (s *DockerNetworkSuite) TestDockerNetworkCustomIPAM(c *check.C) { - // Create a bridge network using custom ipam driver - dockerCmd(c, "network", "create", "--ipam-driver", dummyIPAMDriver, "br0") - assertNwIsAvailable(c, "br0") - - // Verify expected network ipam fields are there - nr := getNetworkResource(c, "br0") - c.Assert(nr.Driver, checker.Equals, "bridge") - c.Assert(nr.IPAM.Driver, checker.Equals, dummyIPAMDriver) - - // remove network and exercise remote ipam driver - dockerCmd(c, "network", "rm", "br0") - assertNwNotAvailable(c, "br0") -} - -func (s *DockerNetworkSuite) TestDockerNetworkIPAMOptions(c *check.C) { - // Create a bridge network using custom ipam driver and options - dockerCmd(c, "network", "create", "--ipam-driver", dummyIPAMDriver, "--ipam-opt", "opt1=drv1", "--ipam-opt", "opt2=drv2", "br0") - assertNwIsAvailable(c, "br0") - - // Verify expected network ipam options - nr := getNetworkResource(c, "br0") - opts := nr.IPAM.Options - c.Assert(opts["opt1"], checker.Equals, "drv1") - c.Assert(opts["opt2"], checker.Equals, "drv2") -} - -func (s *DockerNetworkSuite) TestDockerNetworkInspectDefault(c *check.C) { - nr := getNetworkResource(c, "none") - c.Assert(nr.Driver, checker.Equals, "null") - c.Assert(nr.Scope, checker.Equals, "local") - c.Assert(nr.Internal, checker.Equals, false) - c.Assert(nr.EnableIPv6, checker.Equals, false) - c.Assert(nr.IPAM.Driver, checker.Equals, "default") - c.Assert(len(nr.IPAM.Config), checker.Equals, 0) - - nr = getNetworkResource(c, "host") - c.Assert(nr.Driver, checker.Equals, "host") - c.Assert(nr.Scope, checker.Equals, "local") - c.Assert(nr.Internal, checker.Equals, false) - c.Assert(nr.EnableIPv6, checker.Equals, false) - c.Assert(nr.IPAM.Driver, checker.Equals, "default") - c.Assert(len(nr.IPAM.Config), checker.Equals, 0) - - nr = getNetworkResource(c, "bridge") - c.Assert(nr.Driver, checker.Equals, "bridge") - c.Assert(nr.Scope, checker.Equals, "local") - c.Assert(nr.Internal, checker.Equals, false) - c.Assert(nr.EnableIPv6, checker.Equals, false) - c.Assert(nr.IPAM.Driver, checker.Equals, "default") - c.Assert(len(nr.IPAM.Config), checker.Equals, 1) - c.Assert(nr.IPAM.Config[0].Subnet, checker.NotNil) - c.Assert(nr.IPAM.Config[0].Gateway, checker.NotNil) -} - -func (s *DockerNetworkSuite) TestDockerNetworkInspectCustomUnspecified(c *check.C) { - // if unspecified, network subnet will be selected from inside preferred pool - dockerCmd(c, "network", "create", "test01") - assertNwIsAvailable(c, "test01") - - nr := getNetworkResource(c, "test01") - c.Assert(nr.Driver, checker.Equals, "bridge") - c.Assert(nr.Scope, checker.Equals, "local") - c.Assert(nr.Internal, checker.Equals, false) - c.Assert(nr.EnableIPv6, checker.Equals, false) - c.Assert(nr.IPAM.Driver, checker.Equals, "default") - c.Assert(len(nr.IPAM.Config), checker.Equals, 1) - c.Assert(nr.IPAM.Config[0].Subnet, checker.NotNil) - c.Assert(nr.IPAM.Config[0].Gateway, checker.NotNil) - - dockerCmd(c, "network", "rm", "test01") - assertNwNotAvailable(c, "test01") -} - -func (s *DockerNetworkSuite) TestDockerNetworkInspectCustomSpecified(c *check.C) { - dockerCmd(c, "network", "create", "--driver=bridge", "--ipv6", "--subnet=fd80:24e2:f998:72d6::/64", "--subnet=172.28.0.0/16", "--ip-range=172.28.5.0/24", "--gateway=172.28.5.254", "br0") - assertNwIsAvailable(c, "br0") - - nr := getNetworkResource(c, "br0") - c.Assert(nr.Driver, checker.Equals, "bridge") - c.Assert(nr.Scope, checker.Equals, "local") - c.Assert(nr.Internal, checker.Equals, false) - c.Assert(nr.EnableIPv6, checker.Equals, true) - c.Assert(nr.IPAM.Driver, checker.Equals, "default") - c.Assert(len(nr.IPAM.Config), checker.Equals, 2) - c.Assert(nr.IPAM.Config[0].Subnet, checker.Equals, "172.28.0.0/16") - c.Assert(nr.IPAM.Config[0].IPRange, checker.Equals, "172.28.5.0/24") - c.Assert(nr.IPAM.Config[0].Gateway, checker.Equals, "172.28.5.254") - c.Assert(nr.Internal, checker.False) - dockerCmd(c, "network", "rm", "br0") - assertNwNotAvailable(c, "test01") -} - -func (s *DockerNetworkSuite) TestDockerNetworkIPAMInvalidCombinations(c *check.C) { - // network with ip-range out of subnet range - _, _, err := dockerCmdWithError("network", "create", "--subnet=192.168.0.0/16", "--ip-range=192.170.0.0/16", "test") - c.Assert(err, check.NotNil) - - // network with multiple gateways for a single subnet - _, _, err = dockerCmdWithError("network", "create", "--subnet=192.168.0.0/16", "--gateway=192.168.0.1", "--gateway=192.168.0.2", "test") - c.Assert(err, check.NotNil) - - // Multiple overlapping subnets in the same network must fail - _, _, err = dockerCmdWithError("network", "create", "--subnet=192.168.0.0/16", "--subnet=192.168.1.0/16", "test") - c.Assert(err, check.NotNil) - - // overlapping subnets across networks must fail - // create a valid test0 network - dockerCmd(c, "network", "create", "--subnet=192.168.0.0/16", "test0") - assertNwIsAvailable(c, "test0") - // create an overlapping test1 network - _, _, err = dockerCmdWithError("network", "create", "--subnet=192.168.128.0/17", "test1") - c.Assert(err, check.NotNil) - dockerCmd(c, "network", "rm", "test0") - assertNwNotAvailable(c, "test0") -} - -func (s *DockerNetworkSuite) TestDockerNetworkDriverOptions(c *check.C) { - dockerCmd(c, "network", "create", "-d", dummyNetworkDriver, "-o", "opt1=drv1", "-o", "opt2=drv2", "testopt") - assertNwIsAvailable(c, "testopt") - gopts := remoteDriverNetworkRequest.Options[netlabel.GenericData] - c.Assert(gopts, checker.NotNil) - opts, ok := gopts.(map[string]interface{}) - c.Assert(ok, checker.Equals, true) - c.Assert(opts["opt1"], checker.Equals, "drv1") - c.Assert(opts["opt2"], checker.Equals, "drv2") - dockerCmd(c, "network", "rm", "testopt") - assertNwNotAvailable(c, "testopt") - -} - -func (s *DockerNetworkSuite) TestDockerPluginV2NetworkDriver(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - - var ( - npName = "tiborvass/test-docker-netplugin" - npTag = "latest" - npNameWithTag = npName + ":" + npTag - ) - _, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", npNameWithTag) - c.Assert(err, checker.IsNil) - - out, _, err := dockerCmdWithError("plugin", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, npName) - c.Assert(out, checker.Contains, npTag) - c.Assert(out, checker.Contains, "true") - - dockerCmd(c, "network", "create", "-d", npNameWithTag, "v2net") - assertNwIsAvailable(c, "v2net") - dockerCmd(c, "network", "rm", "v2net") - assertNwNotAvailable(c, "v2net") - -} - -func (s *DockerDaemonSuite) TestDockerNetworkNoDiscoveryDefaultBridgeNetwork(c *check.C) { - testRequires(c, ExecSupport) - // On default bridge network built-in service discovery should not happen - hostsFile := "/etc/hosts" - bridgeName := "external-bridge" - bridgeIP := "192.169.255.254/24" - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) - defer deleteInterface(c, bridgeName) - - err = s.d.StartWithBusybox("--bridge", bridgeName) - c.Assert(err, check.IsNil) - defer s.d.Restart() - - // run two containers and store first container's etc/hosts content - out, err = s.d.Cmd("run", "-d", "busybox", "top") - c.Assert(err, check.IsNil) - cid1 := strings.TrimSpace(out) - defer s.d.Cmd("stop", cid1) - - hosts, err := s.d.Cmd("exec", cid1, "cat", hostsFile) - c.Assert(err, checker.IsNil) - - out, err = s.d.Cmd("run", "-d", "--name", "container2", "busybox", "top") - c.Assert(err, check.IsNil) - cid2 := strings.TrimSpace(out) - - // verify first container's etc/hosts file has not changed after spawning the second named container - hostsPost, err := s.d.Cmd("exec", cid1, "cat", hostsFile) - c.Assert(err, checker.IsNil) - c.Assert(string(hosts), checker.Equals, string(hostsPost), - check.Commentf("Unexpected %s change on second container creation", hostsFile)) - - // stop container 2 and verify first container's etc/hosts has not changed - _, err = s.d.Cmd("stop", cid2) - c.Assert(err, check.IsNil) - - hostsPost, err = s.d.Cmd("exec", cid1, "cat", hostsFile) - c.Assert(err, checker.IsNil) - c.Assert(string(hosts), checker.Equals, string(hostsPost), - check.Commentf("Unexpected %s change on second container creation", hostsFile)) - - // but discovery is on when connecting to non default bridge network - network := "anotherbridge" - out, err = s.d.Cmd("network", "create", network) - c.Assert(err, check.IsNil, check.Commentf(out)) - defer s.d.Cmd("network", "rm", network) - - out, err = s.d.Cmd("network", "connect", network, cid1) - c.Assert(err, check.IsNil, check.Commentf(out)) - - hosts, err = s.d.Cmd("exec", cid1, "cat", hostsFile) - c.Assert(err, checker.IsNil) - - hostsPost, err = s.d.Cmd("exec", cid1, "cat", hostsFile) - c.Assert(err, checker.IsNil) - c.Assert(string(hosts), checker.Equals, string(hostsPost), - check.Commentf("Unexpected %s change on second network connection", hostsFile)) -} - -func (s *DockerNetworkSuite) TestDockerNetworkAnonymousEndpoint(c *check.C) { - testRequires(c, ExecSupport, NotArm) - hostsFile := "/etc/hosts" - cstmBridgeNw := "custom-bridge-nw" - cstmBridgeNw1 := "custom-bridge-nw1" - - dockerCmd(c, "network", "create", "-d", "bridge", cstmBridgeNw) - assertNwIsAvailable(c, cstmBridgeNw) - - // run two anonymous containers and store their etc/hosts content - out, _ := dockerCmd(c, "run", "-d", "--net", cstmBridgeNw, "busybox", "top") - cid1 := strings.TrimSpace(out) - - hosts1, err := readContainerFileWithExec(cid1, hostsFile) - c.Assert(err, checker.IsNil) - - out, _ = dockerCmd(c, "run", "-d", "--net", cstmBridgeNw, "busybox", "top") - cid2 := strings.TrimSpace(out) - - hosts2, err := readContainerFileWithExec(cid2, hostsFile) - c.Assert(err, checker.IsNil) - - // verify first container etc/hosts file has not changed - hosts1post, err := readContainerFileWithExec(cid1, hostsFile) - c.Assert(err, checker.IsNil) - c.Assert(string(hosts1), checker.Equals, string(hosts1post), - check.Commentf("Unexpected %s change on anonymous container creation", hostsFile)) - - // Connect the 2nd container to a new network and verify the - // first container /etc/hosts file still hasn't changed. - dockerCmd(c, "network", "create", "-d", "bridge", cstmBridgeNw1) - assertNwIsAvailable(c, cstmBridgeNw1) - - dockerCmd(c, "network", "connect", cstmBridgeNw1, cid2) - - hosts2, err = readContainerFileWithExec(cid2, hostsFile) - c.Assert(err, checker.IsNil) - - hosts1post, err = readContainerFileWithExec(cid1, hostsFile) - c.Assert(err, checker.IsNil) - c.Assert(string(hosts1), checker.Equals, string(hosts1post), - check.Commentf("Unexpected %s change on container connect", hostsFile)) - - // start a named container - cName := "AnyName" - out, _ = dockerCmd(c, "run", "-d", "--net", cstmBridgeNw, "--name", cName, "busybox", "top") - cid3 := strings.TrimSpace(out) - - // verify that container 1 and 2 can ping the named container - dockerCmd(c, "exec", cid1, "ping", "-c", "1", cName) - dockerCmd(c, "exec", cid2, "ping", "-c", "1", cName) - - // Stop named container and verify first two containers' etc/hosts file hasn't changed - dockerCmd(c, "stop", cid3) - hosts1post, err = readContainerFileWithExec(cid1, hostsFile) - c.Assert(err, checker.IsNil) - c.Assert(string(hosts1), checker.Equals, string(hosts1post), - check.Commentf("Unexpected %s change on name container creation", hostsFile)) - - hosts2post, err := readContainerFileWithExec(cid2, hostsFile) - c.Assert(err, checker.IsNil) - c.Assert(string(hosts2), checker.Equals, string(hosts2post), - check.Commentf("Unexpected %s change on name container creation", hostsFile)) - - // verify that container 1 and 2 can't ping the named container now - _, _, err = dockerCmdWithError("exec", cid1, "ping", "-c", "1", cName) - c.Assert(err, check.NotNil) - _, _, err = dockerCmdWithError("exec", cid2, "ping", "-c", "1", cName) - c.Assert(err, check.NotNil) -} - -func (s *DockerNetworkSuite) TestDockerNetworkLinkOnDefaultNetworkOnly(c *check.C) { - // Legacy Link feature must work only on default network, and not across networks - cnt1 := "container1" - cnt2 := "container2" - network := "anotherbridge" - - // Run first container on default network - dockerCmd(c, "run", "-d", "--name", cnt1, "busybox", "top") - - // Create another network and run the second container on it - dockerCmd(c, "network", "create", network) - assertNwIsAvailable(c, network) - dockerCmd(c, "run", "-d", "--net", network, "--name", cnt2, "busybox", "top") - - // Try launching a container on default network, linking to the first container. Must succeed - dockerCmd(c, "run", "-d", "--link", fmt.Sprintf("%s:%s", cnt1, cnt1), "busybox", "top") - - // Try launching a container on default network, linking to the second container. Must fail - _, _, err := dockerCmdWithError("run", "-d", "--link", fmt.Sprintf("%s:%s", cnt2, cnt2), "busybox", "top") - c.Assert(err, checker.NotNil) - - // Connect second container to default network. Now a container on default network can link to it - dockerCmd(c, "network", "connect", "bridge", cnt2) - dockerCmd(c, "run", "-d", "--link", fmt.Sprintf("%s:%s", cnt2, cnt2), "busybox", "top") -} - -func (s *DockerNetworkSuite) TestDockerNetworkOverlayPortMapping(c *check.C) { - // Verify exposed ports are present in ps output when running a container on - // a network managed by a driver which does not provide the default gateway - // for the container - nwn := "ov" - ctn := "bb" - port1 := 80 - port2 := 443 - expose1 := fmt.Sprintf("--expose=%d", port1) - expose2 := fmt.Sprintf("--expose=%d", port2) - - dockerCmd(c, "network", "create", "-d", dummyNetworkDriver, nwn) - assertNwIsAvailable(c, nwn) - - dockerCmd(c, "run", "-d", "--net", nwn, "--name", ctn, expose1, expose2, "busybox", "top") - - // Check docker ps o/p for last created container reports the unpublished ports - unpPort1 := fmt.Sprintf("%d/tcp", port1) - unpPort2 := fmt.Sprintf("%d/tcp", port2) - out, _ := dockerCmd(c, "ps", "-n=1") - // Missing unpublished ports in docker ps output - c.Assert(out, checker.Contains, unpPort1) - // Missing unpublished ports in docker ps output - c.Assert(out, checker.Contains, unpPort2) -} - -func (s *DockerNetworkSuite) TestDockerNetworkDriverUngracefulRestart(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - dnd := "dnd" - did := "did" - - mux := http.NewServeMux() - server := httptest.NewServer(mux) - setupRemoteNetworkDrivers(c, mux, server.URL, dnd, did) - - s.d.StartWithBusybox() - _, err := s.d.Cmd("network", "create", "-d", dnd, "--subnet", "1.1.1.0/24", "net1") - c.Assert(err, checker.IsNil) - - _, err = s.d.Cmd("run", "-itd", "--net", "net1", "--name", "foo", "--ip", "1.1.1.10", "busybox", "sh") - c.Assert(err, checker.IsNil) - - // Kill daemon and restart - if err = s.d.cmd.Process.Kill(); err != nil { - c.Fatal(err) - } - - server.Close() - - startTime := time.Now().Unix() - if err = s.d.Restart(); err != nil { - c.Fatal(err) - } - lapse := time.Now().Unix() - startTime - if lapse > 60 { - // In normal scenarios, daemon restart takes ~1 second. - // Plugin retry mechanism can delay the daemon start. systemd may not like it. - // Avoid accessing plugins during daemon bootup - c.Logf("daemon restart took too long : %d seconds", lapse) - } - - // Restart the custom dummy plugin - mux = http.NewServeMux() - server = httptest.NewServer(mux) - setupRemoteNetworkDrivers(c, mux, server.URL, dnd, did) - - // trying to reuse the same ip must succeed - _, err = s.d.Cmd("run", "-itd", "--net", "net1", "--name", "bar", "--ip", "1.1.1.10", "busybox", "sh") - c.Assert(err, checker.IsNil) -} - -func (s *DockerNetworkSuite) TestDockerNetworkMacInspect(c *check.C) { - // Verify endpoint MAC address is correctly populated in container's network settings - nwn := "ov" - ctn := "bb" - - dockerCmd(c, "network", "create", "-d", dummyNetworkDriver, nwn) - assertNwIsAvailable(c, nwn) - - dockerCmd(c, "run", "-d", "--net", nwn, "--name", ctn, "busybox", "top") - - mac := inspectField(c, ctn, "NetworkSettings.Networks."+nwn+".MacAddress") - c.Assert(mac, checker.Equals, "a0:b1:c2:d3:e4:f5") -} - -func (s *DockerSuite) TestInspectAPIMultipleNetworks(c *check.C) { - dockerCmd(c, "network", "create", "mybridge1") - dockerCmd(c, "network", "create", "mybridge2") - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), check.IsNil) - - dockerCmd(c, "network", "connect", "mybridge1", id) - dockerCmd(c, "network", "connect", "mybridge2", id) - - body := getInspectBody(c, "v1.20", id) - var inspect120 v1p20.ContainerJSON - err := json.Unmarshal(body, &inspect120) - c.Assert(err, checker.IsNil) - - versionedIP := inspect120.NetworkSettings.IPAddress - - body = getInspectBody(c, "v1.21", id) - var inspect121 types.ContainerJSON - err = json.Unmarshal(body, &inspect121) - c.Assert(err, checker.IsNil) - c.Assert(inspect121.NetworkSettings.Networks, checker.HasLen, 3) - - bridge := inspect121.NetworkSettings.Networks["bridge"] - c.Assert(bridge.IPAddress, checker.Equals, versionedIP) - c.Assert(bridge.IPAddress, checker.Equals, inspect121.NetworkSettings.IPAddress) -} - -func connectContainerToNetworks(c *check.C, d *Daemon, cName string, nws []string) { - // Run a container on the default network - out, err := d.Cmd("run", "-d", "--name", cName, "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // Attach the container to other networks - for _, nw := range nws { - out, err = d.Cmd("network", "create", nw) - c.Assert(err, checker.IsNil, check.Commentf(out)) - out, err = d.Cmd("network", "connect", nw, cName) - c.Assert(err, checker.IsNil, check.Commentf(out)) - } -} - -func verifyContainerIsConnectedToNetworks(c *check.C, d *Daemon, cName string, nws []string) { - // Verify container is connected to all the networks - for _, nw := range nws { - out, err := d.Cmd("inspect", "-f", fmt.Sprintf("{{.NetworkSettings.Networks.%s}}", nw), cName) - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(out, checker.Not(checker.Equals), "\n") - } -} - -func (s *DockerNetworkSuite) TestDockerNetworkMultipleNetworksGracefulDaemonRestart(c *check.C) { - cName := "bb" - nwList := []string{"nw1", "nw2", "nw3"} - - s.d.StartWithBusybox() - - connectContainerToNetworks(c, s.d, cName, nwList) - verifyContainerIsConnectedToNetworks(c, s.d, cName, nwList) - - // Reload daemon - s.d.Restart() - - _, err := s.d.Cmd("start", cName) - c.Assert(err, checker.IsNil) - - verifyContainerIsConnectedToNetworks(c, s.d, cName, nwList) -} - -func (s *DockerNetworkSuite) TestDockerNetworkMultipleNetworksUngracefulDaemonRestart(c *check.C) { - cName := "cc" - nwList := []string{"nw1", "nw2", "nw3"} - - s.d.StartWithBusybox() - - connectContainerToNetworks(c, s.d, cName, nwList) - verifyContainerIsConnectedToNetworks(c, s.d, cName, nwList) - - // Kill daemon and restart - if err := s.d.cmd.Process.Kill(); err != nil { - c.Fatal(err) - } - s.d.Restart() - - // Restart container - _, err := s.d.Cmd("start", cName) - c.Assert(err, checker.IsNil) - - verifyContainerIsConnectedToNetworks(c, s.d, cName, nwList) -} - -func (s *DockerNetworkSuite) TestDockerNetworkRunNetByID(c *check.C) { - out, _ := dockerCmd(c, "network", "create", "one") - containerOut, _, err := dockerCmdWithError("run", "-d", "--net", strings.TrimSpace(out), "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(containerOut)) -} - -func (s *DockerNetworkSuite) TestDockerNetworkHostModeUngracefulDaemonRestart(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - s.d.StartWithBusybox() - - // Run a few containers on host network - for i := 0; i < 10; i++ { - cName := fmt.Sprintf("hostc-%d", i) - out, err := s.d.Cmd("run", "-d", "--name", cName, "--net=host", "--restart=always", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // verfiy container has finished starting before killing daemon - err = s.d.waitRun(cName) - c.Assert(err, checker.IsNil) - } - - // Kill daemon ungracefully and restart - if err := s.d.cmd.Process.Kill(); err != nil { - c.Fatal(err) - } - if err := s.d.Restart(); err != nil { - c.Fatal(err) - } - - // make sure all the containers are up and running - for i := 0; i < 10; i++ { - err := s.d.waitRun(fmt.Sprintf("hostc-%d", i)) - c.Assert(err, checker.IsNil) - } -} - -func (s *DockerNetworkSuite) TestDockerNetworkConnectToHostFromOtherNetwork(c *check.C) { - dockerCmd(c, "run", "-d", "--name", "container1", "busybox", "top") - c.Assert(waitRun("container1"), check.IsNil) - dockerCmd(c, "network", "disconnect", "bridge", "container1") - out, _, err := dockerCmdWithError("network", "connect", "host", "container1") - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, runconfig.ErrConflictHostNetwork.Error()) -} - -func (s *DockerNetworkSuite) TestDockerNetworkDisconnectFromHost(c *check.C) { - dockerCmd(c, "run", "-d", "--name", "container1", "--net=host", "busybox", "top") - c.Assert(waitRun("container1"), check.IsNil) - out, _, err := dockerCmdWithError("network", "disconnect", "host", "container1") - c.Assert(err, checker.NotNil, check.Commentf("Should err out disconnect from host")) - c.Assert(out, checker.Contains, runconfig.ErrConflictHostNetwork.Error()) -} - -func (s *DockerNetworkSuite) TestDockerNetworkConnectWithPortMapping(c *check.C) { - testRequires(c, NotArm) - dockerCmd(c, "network", "create", "test1") - dockerCmd(c, "run", "-d", "--name", "c1", "-p", "5000:5000", "busybox", "top") - c.Assert(waitRun("c1"), check.IsNil) - dockerCmd(c, "network", "connect", "test1", "c1") -} - -func verifyPortMap(c *check.C, container, port, originalMapping string, mustBeEqual bool) { - chk := checker.Equals - if !mustBeEqual { - chk = checker.Not(checker.Equals) - } - currentMapping, _ := dockerCmd(c, "port", container, port) - c.Assert(currentMapping, chk, originalMapping) -} - -func (s *DockerNetworkSuite) TestDockerNetworkConnectDisconnectWithPortMapping(c *check.C) { - // Connect and disconnect a container with explicit and non-explicit - // host port mapping to/from networks which do cause and do not cause - // the container default gateway to change, and verify docker port cmd - // returns congruent information - testRequires(c, NotArm) - cnt := "c1" - dockerCmd(c, "network", "create", "aaa") - dockerCmd(c, "network", "create", "ccc") - - dockerCmd(c, "run", "-d", "--name", cnt, "-p", "9000:90", "-p", "70", "busybox", "top") - c.Assert(waitRun(cnt), check.IsNil) - curPortMap, _ := dockerCmd(c, "port", cnt, "70") - curExplPortMap, _ := dockerCmd(c, "port", cnt, "90") - - // Connect to a network which causes the container's default gw switch - dockerCmd(c, "network", "connect", "aaa", cnt) - verifyPortMap(c, cnt, "70", curPortMap, false) - verifyPortMap(c, cnt, "90", curExplPortMap, true) - - // Read current mapping - curPortMap, _ = dockerCmd(c, "port", cnt, "70") - - // Disconnect from a network which causes the container's default gw switch - dockerCmd(c, "network", "disconnect", "aaa", cnt) - verifyPortMap(c, cnt, "70", curPortMap, false) - verifyPortMap(c, cnt, "90", curExplPortMap, true) - - // Read current mapping - curPortMap, _ = dockerCmd(c, "port", cnt, "70") - - // Connect to a network which does not cause the container's default gw switch - dockerCmd(c, "network", "connect", "ccc", cnt) - verifyPortMap(c, cnt, "70", curPortMap, true) - verifyPortMap(c, cnt, "90", curExplPortMap, true) -} - -func (s *DockerNetworkSuite) TestDockerNetworkConnectWithMac(c *check.C) { - macAddress := "02:42:ac:11:00:02" - dockerCmd(c, "network", "create", "mynetwork") - dockerCmd(c, "run", "--name=test", "-d", "--mac-address", macAddress, "busybox", "top") - c.Assert(waitRun("test"), check.IsNil) - mac1 := inspectField(c, "test", "NetworkSettings.Networks.bridge.MacAddress") - c.Assert(strings.TrimSpace(mac1), checker.Equals, macAddress) - dockerCmd(c, "network", "connect", "mynetwork", "test") - mac2 := inspectField(c, "test", "NetworkSettings.Networks.mynetwork.MacAddress") - c.Assert(strings.TrimSpace(mac2), checker.Not(checker.Equals), strings.TrimSpace(mac1)) -} - -func (s *DockerNetworkSuite) TestDockerNetworkInspectCreatedContainer(c *check.C) { - dockerCmd(c, "create", "--name", "test", "busybox") - networks := inspectField(c, "test", "NetworkSettings.Networks") - c.Assert(networks, checker.Contains, "bridge", check.Commentf("Should return 'bridge' network")) -} - -func (s *DockerNetworkSuite) TestDockerNetworkRestartWithMultipleNetworks(c *check.C) { - dockerCmd(c, "network", "create", "test") - dockerCmd(c, "run", "--name=foo", "-d", "busybox", "top") - c.Assert(waitRun("foo"), checker.IsNil) - dockerCmd(c, "network", "connect", "test", "foo") - dockerCmd(c, "restart", "foo") - networks := inspectField(c, "foo", "NetworkSettings.Networks") - c.Assert(networks, checker.Contains, "bridge", check.Commentf("Should contain 'bridge' network")) - c.Assert(networks, checker.Contains, "test", check.Commentf("Should contain 'test' network")) -} - -func (s *DockerNetworkSuite) TestDockerNetworkConnectDisconnectToStoppedContainer(c *check.C) { - dockerCmd(c, "network", "create", "test") - dockerCmd(c, "create", "--name=foo", "busybox", "top") - dockerCmd(c, "network", "connect", "test", "foo") - networks := inspectField(c, "foo", "NetworkSettings.Networks") - c.Assert(networks, checker.Contains, "test", check.Commentf("Should contain 'test' network")) - - // Restart docker daemon to test the config has persisted to disk - s.d.Restart() - networks = inspectField(c, "foo", "NetworkSettings.Networks") - c.Assert(networks, checker.Contains, "test", check.Commentf("Should contain 'test' network")) - - // start the container and test if we can ping it from another container in the same network - dockerCmd(c, "start", "foo") - c.Assert(waitRun("foo"), checker.IsNil) - ip := inspectField(c, "foo", "NetworkSettings.Networks.test.IPAddress") - ip = strings.TrimSpace(ip) - dockerCmd(c, "run", "--net=test", "busybox", "sh", "-c", fmt.Sprintf("ping -c 1 %s", ip)) - - dockerCmd(c, "stop", "foo") - - // Test disconnect - dockerCmd(c, "network", "disconnect", "test", "foo") - networks = inspectField(c, "foo", "NetworkSettings.Networks") - c.Assert(networks, checker.Not(checker.Contains), "test", check.Commentf("Should not contain 'test' network")) - - // Restart docker daemon to test the config has persisted to disk - s.d.Restart() - networks = inspectField(c, "foo", "NetworkSettings.Networks") - c.Assert(networks, checker.Not(checker.Contains), "test", check.Commentf("Should not contain 'test' network")) - -} - -func (s *DockerNetworkSuite) TestDockerNetworkDisconnectContainerNonexistingNetwork(c *check.C) { - dockerCmd(c, "network", "create", "test") - dockerCmd(c, "run", "--net=test", "-d", "--name=foo", "busybox", "top") - networks := inspectField(c, "foo", "NetworkSettings.Networks") - c.Assert(networks, checker.Contains, "test", check.Commentf("Should contain 'test' network")) - - // Stop container and remove network - dockerCmd(c, "stop", "foo") - dockerCmd(c, "network", "rm", "test") - - // Test disconnecting stopped container from nonexisting network - dockerCmd(c, "network", "disconnect", "-f", "test", "foo") - networks = inspectField(c, "foo", "NetworkSettings.Networks") - c.Assert(networks, checker.Not(checker.Contains), "test", check.Commentf("Should not contain 'test' network")) -} - -func (s *DockerNetworkSuite) TestDockerNetworkConnectPreferredIP(c *check.C) { - // create two networks - dockerCmd(c, "network", "create", "--ipv6", "--subnet=172.28.0.0/16", "--subnet=2001:db8:1234::/64", "n0") - assertNwIsAvailable(c, "n0") - - dockerCmd(c, "network", "create", "--ipv6", "--subnet=172.30.0.0/16", "--ip-range=172.30.5.0/24", "--subnet=2001:db8:abcd::/64", "--ip-range=2001:db8:abcd::/80", "n1") - assertNwIsAvailable(c, "n1") - - // run a container on first network specifying the ip addresses - dockerCmd(c, "run", "-d", "--name", "c0", "--net=n0", "--ip", "172.28.99.88", "--ip6", "2001:db8:1234::9988", "busybox", "top") - c.Assert(waitRun("c0"), check.IsNil) - verifyIPAddressConfig(c, "c0", "n0", "172.28.99.88", "2001:db8:1234::9988") - verifyIPAddresses(c, "c0", "n0", "172.28.99.88", "2001:db8:1234::9988") - - // connect the container to the second network specifying an ip addresses - dockerCmd(c, "network", "connect", "--ip", "172.30.55.44", "--ip6", "2001:db8:abcd::5544", "n1", "c0") - verifyIPAddressConfig(c, "c0", "n1", "172.30.55.44", "2001:db8:abcd::5544") - verifyIPAddresses(c, "c0", "n1", "172.30.55.44", "2001:db8:abcd::5544") - - // Stop and restart the container - dockerCmd(c, "stop", "c0") - dockerCmd(c, "start", "c0") - - // verify requested addresses are applied and configs are still there - verifyIPAddressConfig(c, "c0", "n0", "172.28.99.88", "2001:db8:1234::9988") - verifyIPAddresses(c, "c0", "n0", "172.28.99.88", "2001:db8:1234::9988") - verifyIPAddressConfig(c, "c0", "n1", "172.30.55.44", "2001:db8:abcd::5544") - verifyIPAddresses(c, "c0", "n1", "172.30.55.44", "2001:db8:abcd::5544") - - // Still it should fail to connect to the default network with a specified IP (whatever ip) - out, _, err := dockerCmdWithError("network", "connect", "--ip", "172.21.55.44", "bridge", "c0") - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - c.Assert(out, checker.Contains, runconfig.ErrUnsupportedNetworkAndIP.Error()) - -} - -func (s *DockerNetworkSuite) TestDockerNetworkConnectPreferredIPStoppedContainer(c *check.C) { - // create a container - dockerCmd(c, "create", "--name", "c0", "busybox", "top") - - // create a network - dockerCmd(c, "network", "create", "--ipv6", "--subnet=172.30.0.0/16", "--subnet=2001:db8:abcd::/64", "n0") - assertNwIsAvailable(c, "n0") - - // connect the container to the network specifying an ip addresses - dockerCmd(c, "network", "connect", "--ip", "172.30.55.44", "--ip6", "2001:db8:abcd::5544", "n0", "c0") - verifyIPAddressConfig(c, "c0", "n0", "172.30.55.44", "2001:db8:abcd::5544") - - // start the container, verify config has not changed and ip addresses are assigned - dockerCmd(c, "start", "c0") - c.Assert(waitRun("c0"), check.IsNil) - verifyIPAddressConfig(c, "c0", "n0", "172.30.55.44", "2001:db8:abcd::5544") - verifyIPAddresses(c, "c0", "n0", "172.30.55.44", "2001:db8:abcd::5544") - - // stop the container and check ip config has not changed - dockerCmd(c, "stop", "c0") - verifyIPAddressConfig(c, "c0", "n0", "172.30.55.44", "2001:db8:abcd::5544") -} - -func (s *DockerNetworkSuite) TestDockerNetworkUnsupportedRequiredIP(c *check.C) { - // requested IP is not supported on predefined networks - for _, mode := range []string{"none", "host", "bridge", "default"} { - checkUnsupportedNetworkAndIP(c, mode) - } - - // requested IP is not supported on networks with no user defined subnets - dockerCmd(c, "network", "create", "n0") - assertNwIsAvailable(c, "n0") - - out, _, err := dockerCmdWithError("run", "-d", "--ip", "172.28.99.88", "--net", "n0", "busybox", "top") - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - c.Assert(out, checker.Contains, runconfig.ErrUnsupportedNetworkNoSubnetAndIP.Error()) - - out, _, err = dockerCmdWithError("run", "-d", "--ip6", "2001:db8:1234::9988", "--net", "n0", "busybox", "top") - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - c.Assert(out, checker.Contains, runconfig.ErrUnsupportedNetworkNoSubnetAndIP.Error()) - - dockerCmd(c, "network", "rm", "n0") - assertNwNotAvailable(c, "n0") -} - -func checkUnsupportedNetworkAndIP(c *check.C, nwMode string) { - out, _, err := dockerCmdWithError("run", "-d", "--net", nwMode, "--ip", "172.28.99.88", "--ip6", "2001:db8:1234::9988", "busybox", "top") - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - c.Assert(out, checker.Contains, runconfig.ErrUnsupportedNetworkAndIP.Error()) -} - -func verifyIPAddressConfig(c *check.C, cName, nwname, ipv4, ipv6 string) { - if ipv4 != "" { - out := inspectField(c, cName, fmt.Sprintf("NetworkSettings.Networks.%s.IPAMConfig.IPv4Address", nwname)) - c.Assert(strings.TrimSpace(out), check.Equals, ipv4) - } - - if ipv6 != "" { - out := inspectField(c, cName, fmt.Sprintf("NetworkSettings.Networks.%s.IPAMConfig.IPv6Address", nwname)) - c.Assert(strings.TrimSpace(out), check.Equals, ipv6) - } -} - -func verifyIPAddresses(c *check.C, cName, nwname, ipv4, ipv6 string) { - out := inspectField(c, cName, fmt.Sprintf("NetworkSettings.Networks.%s.IPAddress", nwname)) - c.Assert(strings.TrimSpace(out), check.Equals, ipv4) - - out = inspectField(c, cName, fmt.Sprintf("NetworkSettings.Networks.%s.GlobalIPv6Address", nwname)) - c.Assert(strings.TrimSpace(out), check.Equals, ipv6) -} - -func (s *DockerNetworkSuite) TestDockerNetworkConnectLinkLocalIP(c *check.C) { - // create one test network - dockerCmd(c, "network", "create", "n0") - assertNwIsAvailable(c, "n0") - - // run a container with incorrect link-local address - _, _, err := dockerCmdWithError("run", "--link-local-ip", "169.253.5.5", "busybox", "top") - c.Assert(err, check.NotNil) - _, _, err = dockerCmdWithError("run", "--link-local-ip", "2001:db8::89", "busybox", "top") - c.Assert(err, check.NotNil) - - // run two containers with link-local ip on the test network - dockerCmd(c, "run", "-d", "--name", "c0", "--net=n0", "--link-local-ip", "169.254.7.7", "--link-local-ip", "fe80::254:77", "busybox", "top") - c.Assert(waitRun("c0"), check.IsNil) - dockerCmd(c, "run", "-d", "--name", "c1", "--net=n0", "--link-local-ip", "169.254.8.8", "--link-local-ip", "fe80::254:88", "busybox", "top") - c.Assert(waitRun("c1"), check.IsNil) - - // run a container on the default network and connect it to the test network specifying a link-local address - dockerCmd(c, "run", "-d", "--name", "c2", "busybox", "top") - c.Assert(waitRun("c2"), check.IsNil) - dockerCmd(c, "network", "connect", "--link-local-ip", "169.254.9.9", "n0", "c2") - - // verify the three containers can ping each other via the link-local addresses - _, _, err = dockerCmdWithError("exec", "c0", "ping", "-c", "1", "169.254.8.8") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "c1", "ping", "-c", "1", "169.254.9.9") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "c2", "ping", "-c", "1", "169.254.7.7") - c.Assert(err, check.IsNil) - - // Stop and restart the three containers - dockerCmd(c, "stop", "c0") - dockerCmd(c, "stop", "c1") - dockerCmd(c, "stop", "c2") - dockerCmd(c, "start", "c0") - dockerCmd(c, "start", "c1") - dockerCmd(c, "start", "c2") - - // verify the ping again - _, _, err = dockerCmdWithError("exec", "c0", "ping", "-c", "1", "169.254.8.8") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "c1", "ping", "-c", "1", "169.254.9.9") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "c2", "ping", "-c", "1", "169.254.7.7") - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestUserDefinedNetworkConnectDisconnectLink(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - dockerCmd(c, "network", "create", "-d", "bridge", "foo1") - dockerCmd(c, "network", "create", "-d", "bridge", "foo2") - - dockerCmd(c, "run", "-d", "--net=foo1", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - - // run a container in a user-defined network with a link for an existing container - // and a link for a container that doesn't exist - dockerCmd(c, "run", "-d", "--net=foo1", "--name=second", "--link=first:FirstInFoo1", - "--link=third:bar", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // ping to first and its alias FirstInFoo1 must succeed - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "FirstInFoo1") - c.Assert(err, check.IsNil) - - // connect first container to foo2 network - dockerCmd(c, "network", "connect", "foo2", "first") - // connect second container to foo2 network with a different alias for first container - dockerCmd(c, "network", "connect", "--link=first:FirstInFoo2", "foo2", "second") - - // ping the new alias in network foo2 - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "FirstInFoo2") - c.Assert(err, check.IsNil) - - // disconnect first container from foo1 network - dockerCmd(c, "network", "disconnect", "foo1", "first") - - // link in foo1 network must fail - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "FirstInFoo1") - c.Assert(err, check.NotNil) - - // link in foo2 network must succeed - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "FirstInFoo2") - c.Assert(err, check.IsNil) -} - -func (s *DockerNetworkSuite) TestDockerNetworkDisconnectDefault(c *check.C) { - netWorkName1 := "test1" - netWorkName2 := "test2" - containerName := "foo" - - dockerCmd(c, "network", "create", netWorkName1) - dockerCmd(c, "network", "create", netWorkName2) - dockerCmd(c, "create", "--name", containerName, "busybox", "top") - dockerCmd(c, "network", "connect", netWorkName1, containerName) - dockerCmd(c, "network", "connect", netWorkName2, containerName) - dockerCmd(c, "network", "disconnect", "bridge", containerName) - - dockerCmd(c, "start", containerName) - c.Assert(waitRun(containerName), checker.IsNil) - networks := inspectField(c, containerName, "NetworkSettings.Networks") - c.Assert(networks, checker.Contains, netWorkName1, check.Commentf(fmt.Sprintf("Should contain '%s' network", netWorkName1))) - c.Assert(networks, checker.Contains, netWorkName2, check.Commentf(fmt.Sprintf("Should contain '%s' network", netWorkName2))) - c.Assert(networks, checker.Not(checker.Contains), "bridge", check.Commentf("Should not contain 'bridge' network")) -} - -func (s *DockerNetworkSuite) TestDockerNetworkConnectWithAliasOnDefaultNetworks(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - - defaults := []string{"bridge", "host", "none"} - out, _ := dockerCmd(c, "run", "-d", "--net=none", "busybox", "top") - containerID := strings.TrimSpace(out) - for _, net := range defaults { - res, _, err := dockerCmdWithError("network", "connect", "--alias", "alias"+net, net, containerID) - c.Assert(err, checker.NotNil) - c.Assert(res, checker.Contains, runconfig.ErrUnsupportedNetworkAndAlias.Error()) - } -} - -func (s *DockerSuite) TestUserDefinedNetworkConnectDisconnectAlias(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - dockerCmd(c, "network", "create", "-d", "bridge", "net1") - dockerCmd(c, "network", "create", "-d", "bridge", "net2") - - cid, _ := dockerCmd(c, "run", "-d", "--net=net1", "--name=first", "--net-alias=foo", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - - dockerCmd(c, "run", "-d", "--net=net1", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // ping first container and its alias - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo") - c.Assert(err, check.IsNil) - - // ping first container's short-id alias - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", stringid.TruncateID(cid)) - c.Assert(err, check.IsNil) - - // connect first container to net2 network - dockerCmd(c, "network", "connect", "--alias=bar", "net2", "first") - // connect second container to foo2 network with a different alias for first container - dockerCmd(c, "network", "connect", "net2", "second") - - // ping the new alias in network foo2 - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "bar") - c.Assert(err, check.IsNil) - - // disconnect first container from net1 network - dockerCmd(c, "network", "disconnect", "net1", "first") - - // ping to net1 scoped alias "foo" must fail - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo") - c.Assert(err, check.NotNil) - - // ping to net2 scoped alias "bar" must still succeed - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "bar") - c.Assert(err, check.IsNil) - // ping to net2 scoped alias short-id must still succeed - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", stringid.TruncateID(cid)) - c.Assert(err, check.IsNil) - - // verify the alias option is rejected when running on predefined network - out, _, err := dockerCmdWithError("run", "--rm", "--name=any", "--net-alias=any", "busybox", "top") - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - c.Assert(out, checker.Contains, runconfig.ErrUnsupportedNetworkAndAlias.Error()) - - // verify the alias option is rejected when connecting to predefined network - out, _, err = dockerCmdWithError("network", "connect", "--alias=any", "bridge", "first") - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - c.Assert(out, checker.Contains, runconfig.ErrUnsupportedNetworkAndAlias.Error()) -} - -func (s *DockerSuite) TestUserDefinedNetworkConnectivity(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - dockerCmd(c, "network", "create", "-d", "bridge", "br.net1") - - dockerCmd(c, "run", "-d", "--net=br.net1", "--name=c1.net1", "busybox", "top") - c.Assert(waitRun("c1.net1"), check.IsNil) - - dockerCmd(c, "run", "-d", "--net=br.net1", "--name=c2.net1", "busybox", "top") - c.Assert(waitRun("c2.net1"), check.IsNil) - - // ping first container by its unqualified name - _, _, err := dockerCmdWithError("exec", "c2.net1", "ping", "-c", "1", "c1.net1") - c.Assert(err, check.IsNil) - - // ping first container by its qualified name - _, _, err = dockerCmdWithError("exec", "c2.net1", "ping", "-c", "1", "c1.net1.br.net1") - c.Assert(err, check.IsNil) - - // ping with first qualified name masked by an additional domain. should fail - _, _, err = dockerCmdWithError("exec", "c2.net1", "ping", "-c", "1", "c1.net1.br.net1.google.com") - c.Assert(err, check.NotNil) -} - -func (s *DockerSuite) TestEmbeddedDNSInvalidInput(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - dockerCmd(c, "network", "create", "-d", "bridge", "nw1") - - // Sending garbage to embedded DNS shouldn't crash the daemon - dockerCmd(c, "run", "-i", "--net=nw1", "--name=c1", "debian:jessie", "bash", "-c", "echo InvalidQuery > /dev/udp/127.0.0.11/53") -} - -func (s *DockerSuite) TestDockerNetworkConnectFailsNoInspectChange(c *check.C) { - dockerCmd(c, "run", "-d", "--name=bb", "busybox", "top") - c.Assert(waitRun("bb"), check.IsNil) - - ns0 := inspectField(c, "bb", "NetworkSettings.Networks.bridge") - - // A failing redundant network connect should not alter current container's endpoint settings - _, _, err := dockerCmdWithError("network", "connect", "bridge", "bb") - c.Assert(err, check.NotNil) - - ns1 := inspectField(c, "bb", "NetworkSettings.Networks.bridge") - c.Assert(ns1, check.Equals, ns0) -} - -func (s *DockerSuite) TestDockerNetworkInternalMode(c *check.C) { - dockerCmd(c, "network", "create", "--driver=bridge", "--internal", "internal") - assertNwIsAvailable(c, "internal") - nr := getNetworkResource(c, "internal") - c.Assert(nr.Internal, checker.True) - - dockerCmd(c, "run", "-d", "--net=internal", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--net=internal", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - out, _, err := dockerCmdWithError("exec", "first", "ping", "-W", "4", "-c", "1", "www.google.com") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, "ping: bad address") - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) -} - -// Test for #21401 -func (s *DockerNetworkSuite) TestDockerNetworkCreateDeleteSpecialCharacters(c *check.C) { - dockerCmd(c, "network", "create", "test@#$") - assertNwIsAvailable(c, "test@#$") - dockerCmd(c, "network", "rm", "test@#$") - assertNwNotAvailable(c, "test@#$") - - dockerCmd(c, "network", "create", "kiwl$%^") - assertNwIsAvailable(c, "kiwl$%^") - dockerCmd(c, "network", "rm", "kiwl$%^") - assertNwNotAvailable(c, "kiwl$%^") -} - -func (s *DockerDaemonSuite) TestDaemonRestartRestoreBridgeNetwork(t *check.C) { - testRequires(t, DaemonIsLinux) - if err := s.d.StartWithBusybox("--live-restore"); err != nil { - t.Fatal(err) - } - defer s.d.Stop() - oldCon := "old" - - _, err := s.d.Cmd("run", "-d", "--name", oldCon, "-p", "80:80", "busybox", "top") - if err != nil { - t.Fatal(err) - } - oldContainerIP, err := s.d.Cmd("inspect", "-f", "{{ .NetworkSettings.Networks.bridge.IPAddress }}", oldCon) - if err != nil { - t.Fatal(err) - } - // Kill the daemon - if err := s.d.Kill(); err != nil { - t.Fatal(err) - } - - // restart the daemon - if err := s.d.Start("--live-restore"); err != nil { - t.Fatal(err) - } - - // start a new container, the new container's ip should not be the same with - // old running container. - newCon := "new" - _, err = s.d.Cmd("run", "-d", "--name", newCon, "busybox", "top") - if err != nil { - t.Fatal(err) - } - newContainerIP, err := s.d.Cmd("inspect", "-f", "{{ .NetworkSettings.Networks.bridge.IPAddress }}", newCon) - if err != nil { - t.Fatal(err) - } - if strings.Compare(strings.TrimSpace(oldContainerIP), strings.TrimSpace(newContainerIP)) == 0 { - t.Fatalf("new container ip should not equal to old running container ip") - } - - // start a new container, the new container should ping old running container - _, err = s.d.Cmd("run", "-t", "busybox", "ping", "-c", "1", oldContainerIP) - if err != nil { - t.Fatal(err) - } - - // start a new container, trying to publish port 80:80 should fail - out, err := s.d.Cmd("run", "-p", "80:80", "-d", "busybox", "top") - if err == nil || !strings.Contains(out, "Bind for 0.0.0.0:80 failed: port is already allocated") { - t.Fatalf("80 port is allocated to old running container, it should failed on allocating to new container") - } - - // kill old running container and try to allocate again - _, err = s.d.Cmd("kill", oldCon) - if err != nil { - t.Fatal(err) - } - id, err := s.d.Cmd("run", "-p", "80:80", "-d", "busybox", "top") - if err != nil { - t.Fatal(err) - } - - // Cleanup because these containers will not be shut down by daemon - out, err = s.d.Cmd("stop", newCon) - if err != nil { - t.Fatalf("err: %v %v", err, string(out)) - } - _, err = s.d.Cmd("stop", strings.TrimSpace(id)) - if err != nil { - t.Fatal(err) - } -} - -func (s *DockerNetworkSuite) TestDockerNetworkFlagAlias(c *check.C) { - dockerCmd(c, "network", "create", "user") - output, status := dockerCmd(c, "run", "--rm", "--network=user", "--network-alias=foo", "busybox", "true") - c.Assert(status, checker.Equals, 0, check.Commentf("unexpected status code %d (%s)", status, output)) - - output, status, _ = dockerCmdWithError("run", "--rm", "--net=user", "--network=user", "busybox", "true") - c.Assert(status, checker.Equals, 0, check.Commentf("unexpected status code %d (%s)", status, output)) - - output, status, _ = dockerCmdWithError("run", "--rm", "--network=user", "--net-alias=foo", "--network-alias=bar", "busybox", "true") - c.Assert(status, checker.Equals, 0, check.Commentf("unexpected status code %d (%s)", status, output)) -} - -func (s *DockerNetworkSuite) TestDockerNetworkValidateIP(c *check.C) { - _, _, err := dockerCmdWithError("network", "create", "--ipv6", "--subnet=172.28.0.0/16", "--subnet=2001:db8:1234::/64", "mynet") - c.Assert(err, check.IsNil) - assertNwIsAvailable(c, "mynet") - - _, _, err = dockerCmdWithError("run", "-d", "--name", "mynet0", "--net=mynet", "--ip", "172.28.99.88", "--ip6", "2001:db8:1234::9988", "busybox", "top") - c.Assert(err, check.IsNil) - c.Assert(waitRun("mynet0"), check.IsNil) - verifyIPAddressConfig(c, "mynet0", "mynet", "172.28.99.88", "2001:db8:1234::9988") - verifyIPAddresses(c, "mynet0", "mynet", "172.28.99.88", "2001:db8:1234::9988") - - _, _, err = dockerCmdWithError("run", "--net=mynet", "--ip", "mynet_ip", "--ip6", "2001:db8:1234::9999", "busybox", "top") - c.Assert(err.Error(), checker.Contains, "invalid IPv4 address") - _, _, err = dockerCmdWithError("run", "--net=mynet", "--ip", "172.28.99.99", "--ip6", "mynet_ip6", "busybox", "top") - c.Assert(err.Error(), checker.Contains, "invalid IPv6 address") - // This is a case of IPv4 address to `--ip6` - _, _, err = dockerCmdWithError("run", "--net=mynet", "--ip6", "172.28.99.99", "busybox", "top") - c.Assert(err.Error(), checker.Contains, "invalid IPv6 address") - // This is a special case of an IPv4-mapped IPv6 address - _, _, err = dockerCmdWithError("run", "--net=mynet", "--ip6", "::ffff:172.28.99.99", "busybox", "top") - c.Assert(err.Error(), checker.Contains, "invalid IPv6 address") -} - -// Test case for 26220 -func (s *DockerNetworkSuite) TestDockerNetworkDisconnectFromBridge(c *check.C) { - out, _ := dockerCmd(c, "network", "inspect", "--format", "{{.Id}}", "bridge") - - network := strings.TrimSpace(out) - - name := "test" - dockerCmd(c, "create", "--name", name, "busybox", "top") - - _, _, err := dockerCmdWithError("network", "disconnect", network, name) - c.Assert(err, check.IsNil) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_oom_killed_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_oom_killed_test.go deleted file mode 100644 index bcf59f860..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_oom_killed_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build !windows - -package main - -import ( - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestInspectOomKilledTrue(c *check.C) { - testRequires(c, DaemonIsLinux, memoryLimitSupport, swapMemorySupport) - - name := "testoomkilled" - _, exitCode, _ := dockerCmdWithError("run", "--name", name, "--memory", "32MB", "busybox", "sh", "-c", "x=a; while true; do x=$x$x$x$x; done") - - c.Assert(exitCode, checker.Equals, 137, check.Commentf("OOM exit should be 137")) - - oomKilled := inspectField(c, name, "State.OOMKilled") - c.Assert(oomKilled, checker.Equals, "true") -} - -func (s *DockerSuite) TestInspectOomKilledFalse(c *check.C) { - testRequires(c, DaemonIsLinux, memoryLimitSupport, swapMemorySupport) - - name := "testoomkilled" - dockerCmd(c, "run", "--name", name, "--memory", "32MB", "busybox", "sh", "-c", "echo hello world") - - oomKilled := inspectField(c, name, "State.OOMKilled") - c.Assert(oomKilled, checker.Equals, "false") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_pause_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_pause_test.go deleted file mode 100644 index 9217a6996..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_pause_test.go +++ /dev/null @@ -1,66 +0,0 @@ -package main - -import ( - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestPause(c *check.C) { - testRequires(c, IsPausable) - defer unpauseAllContainers() - - name := "testeventpause" - runSleepingContainer(c, "-d", "--name", name) - - dockerCmd(c, "pause", name) - pausedContainers, err := getSliceOfPausedContainers() - c.Assert(err, checker.IsNil) - c.Assert(len(pausedContainers), checker.Equals, 1) - - dockerCmd(c, "unpause", name) - - out, _ := dockerCmd(c, "events", "--since=0", "--until", daemonUnixTime(c)) - events := strings.Split(strings.TrimSpace(out), "\n") - actions := eventActionsByIDAndType(c, events, name, "container") - - c.Assert(actions[len(actions)-2], checker.Equals, "pause") - c.Assert(actions[len(actions)-1], checker.Equals, "unpause") -} - -func (s *DockerSuite) TestPauseMultipleContainers(c *check.C) { - testRequires(c, IsPausable) - defer unpauseAllContainers() - - containers := []string{ - "testpausewithmorecontainers1", - "testpausewithmorecontainers2", - } - for _, name := range containers { - runSleepingContainer(c, "-d", "--name", name) - } - dockerCmd(c, append([]string{"pause"}, containers...)...) - pausedContainers, err := getSliceOfPausedContainers() - c.Assert(err, checker.IsNil) - c.Assert(len(pausedContainers), checker.Equals, len(containers)) - - dockerCmd(c, append([]string{"unpause"}, containers...)...) - - out, _ := dockerCmd(c, "events", "--since=0", "--until", daemonUnixTime(c)) - events := strings.Split(strings.TrimSpace(out), "\n") - - for _, name := range containers { - actions := eventActionsByIDAndType(c, events, name, "container") - - c.Assert(actions[len(actions)-2], checker.Equals, "pause") - c.Assert(actions[len(actions)-1], checker.Equals, "unpause") - } -} - -func (s *DockerSuite) TestPauseFailsOnWindowsServerContainers(c *check.C) { - testRequires(c, DaemonIsWindows, NotPausable) - runSleepingContainer(c, "-d", "--name=test") - out, _, _ := dockerCmdWithError("pause", "test") - c.Assert(out, checker.Contains, "cannot pause Windows Server Containers") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_plugins_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_plugins_test.go deleted file mode 100644 index 380357d30..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_plugins_test.go +++ /dev/null @@ -1,393 +0,0 @@ -package main - -import ( - "fmt" - "os/exec" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" - - "io/ioutil" - "os" - "path/filepath" - "strings" -) - -var ( - pluginProcessName = "sample-volume-plugin" - pName = "tiborvass/sample-volume-plugin" - npName = "tiborvass/test-docker-netplugin" - pTag = "latest" - pNameWithTag = pName + ":" + pTag - npNameWithTag = npName + ":" + pTag -) - -func (s *DockerSuite) TestPluginBasicOps(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - _, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", pNameWithTag) - c.Assert(err, checker.IsNil) - - out, _, err := dockerCmdWithError("plugin", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, pName) - c.Assert(out, checker.Contains, pTag) - c.Assert(out, checker.Contains, "true") - - id, _, err := dockerCmdWithError("plugin", "inspect", "-f", "{{.Id}}", pNameWithTag) - id = strings.TrimSpace(id) - c.Assert(err, checker.IsNil) - - out, _, err = dockerCmdWithError("plugin", "remove", pNameWithTag) - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "is enabled") - - _, _, err = dockerCmdWithError("plugin", "disable", pNameWithTag) - c.Assert(err, checker.IsNil) - - out, _, err = dockerCmdWithError("plugin", "remove", pNameWithTag) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, pNameWithTag) - - _, err = os.Stat(filepath.Join(dockerBasePath, "plugins", id)) - if !os.IsNotExist(err) { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestPluginForceRemove(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - out, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", pNameWithTag) - c.Assert(err, checker.IsNil) - - out, _, err = dockerCmdWithError("plugin", "remove", pNameWithTag) - c.Assert(out, checker.Contains, "is enabled") - - out, _, err = dockerCmdWithError("plugin", "remove", "--force", pNameWithTag) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, pNameWithTag) -} - -func (s *DockerSuite) TestPluginActive(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - _, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", pNameWithTag) - c.Assert(err, checker.IsNil) - - _, _, err = dockerCmdWithError("volume", "create", "-d", pNameWithTag, "--name", "testvol1") - c.Assert(err, checker.IsNil) - - out, _, err := dockerCmdWithError("plugin", "disable", pNameWithTag) - c.Assert(out, checker.Contains, "in use") - - _, _, err = dockerCmdWithError("volume", "rm", "testvol1") - c.Assert(err, checker.IsNil) - - _, _, err = dockerCmdWithError("plugin", "disable", pNameWithTag) - c.Assert(err, checker.IsNil) - - out, _, err = dockerCmdWithError("plugin", "remove", pNameWithTag) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, pNameWithTag) -} - -func (s *DockerSuite) TestPluginActiveNetwork(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - out, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", npNameWithTag) - c.Assert(err, checker.IsNil) - - out, _, err = dockerCmdWithError("network", "create", "-d", npNameWithTag, "test") - c.Assert(err, checker.IsNil) - - nID := strings.TrimSpace(out) - - out, _, err = dockerCmdWithError("plugin", "remove", npNameWithTag) - c.Assert(out, checker.Contains, "is in use") - - _, _, err = dockerCmdWithError("network", "rm", nID) - c.Assert(err, checker.IsNil) - - out, _, err = dockerCmdWithError("plugin", "remove", npNameWithTag) - c.Assert(out, checker.Contains, "is enabled") - - _, _, err = dockerCmdWithError("plugin", "disable", npNameWithTag) - c.Assert(err, checker.IsNil) - - out, _, err = dockerCmdWithError("plugin", "remove", npNameWithTag) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, npNameWithTag) -} - -func (s *DockerSuite) TestPluginInstallDisable(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - out, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", "--disable", pName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, pName) - - out, _, err = dockerCmdWithError("plugin", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "false") - - out, _, err = dockerCmdWithError("plugin", "enable", pName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, pName) - - out, _, err = dockerCmdWithError("plugin", "disable", pName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, pName) - - out, _, err = dockerCmdWithError("plugin", "remove", pName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, pName) -} - -func (s *DockerSuite) TestPluginInstallDisableVolumeLs(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - out, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", "--disable", pName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, pName) - - dockerCmd(c, "volume", "ls") -} - -func (s *DockerSuite) TestPluginSet(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - out, _ := dockerCmd(c, "plugin", "install", "--grant-all-permissions", "--disable", pName) - c.Assert(strings.TrimSpace(out), checker.Contains, pName) - - env, _ := dockerCmd(c, "plugin", "inspect", "-f", "{{.Settings.Env}}", pName) - c.Assert(strings.TrimSpace(env), checker.Equals, "[DEBUG=0]") - - dockerCmd(c, "plugin", "set", pName, "DEBUG=1") - - env, _ = dockerCmd(c, "plugin", "inspect", "-f", "{{.Settings.Env}}", pName) - c.Assert(strings.TrimSpace(env), checker.Equals, "[DEBUG=1]") -} - -func (s *DockerSuite) TestPluginInstallArgs(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - out, _ := dockerCmd(c, "plugin", "install", "--grant-all-permissions", "--disable", pName, "DEBUG=1") - c.Assert(strings.TrimSpace(out), checker.Contains, pName) - - env, _ := dockerCmd(c, "plugin", "inspect", "-f", "{{.Settings.Env}}", pName) - c.Assert(strings.TrimSpace(env), checker.Equals, "[DEBUG=1]") -} - -func (s *DockerRegistrySuite) TestPluginInstallImage(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64) - - repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - // tag the image to upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - // push the image to the registry - dockerCmd(c, "push", repoName) - - out, _, err := dockerCmdWithError("plugin", "install", repoName) - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "target is image") -} - -func (s *DockerSuite) TestPluginEnableDisableNegative(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - out, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", pName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, pName) - - out, _, err = dockerCmdWithError("plugin", "enable", pName) - c.Assert(err, checker.NotNil) - c.Assert(strings.TrimSpace(out), checker.Contains, "already enabled") - - _, _, err = dockerCmdWithError("plugin", "disable", pName) - c.Assert(err, checker.IsNil) - - out, _, err = dockerCmdWithError("plugin", "disable", pName) - c.Assert(err, checker.NotNil) - c.Assert(strings.TrimSpace(out), checker.Contains, "already disabled") - - _, _, err = dockerCmdWithError("plugin", "remove", pName) - c.Assert(err, checker.IsNil) -} - -func (s *DockerSuite) TestPluginCreate(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - - name := "foo/bar-driver" - temp, err := ioutil.TempDir("", "foo") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(temp) - - data := `{"description": "foo plugin"}` - err = ioutil.WriteFile(filepath.Join(temp, "config.json"), []byte(data), 0644) - c.Assert(err, checker.IsNil) - - err = os.MkdirAll(filepath.Join(temp, "rootfs"), 0700) - c.Assert(err, checker.IsNil) - - out, _, err := dockerCmdWithError("plugin", "create", name, temp) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name) - - out, _, err = dockerCmdWithError("plugin", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name) - - out, _, err = dockerCmdWithError("plugin", "create", name, temp) - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "already exist") - - out, _, err = dockerCmdWithError("plugin", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name) - // The output will consists of one HEADER line and one line of foo/bar-driver - c.Assert(len(strings.Split(strings.TrimSpace(out), "\n")), checker.Equals, 2) -} - -func (s *DockerSuite) TestPluginInspect(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - _, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", pNameWithTag) - c.Assert(err, checker.IsNil) - - out, _, err := dockerCmdWithError("plugin", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, pName) - c.Assert(out, checker.Contains, pTag) - c.Assert(out, checker.Contains, "true") - - // Find the ID first - out, _, err = dockerCmdWithError("plugin", "inspect", "-f", "{{.Id}}", pNameWithTag) - c.Assert(err, checker.IsNil) - id := strings.TrimSpace(out) - c.Assert(id, checker.Not(checker.Equals), "") - - // Long form - out, _, err = dockerCmdWithError("plugin", "inspect", "-f", "{{.Id}}", id) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, id) - - // Short form - out, _, err = dockerCmdWithError("plugin", "inspect", "-f", "{{.Id}}", id[:5]) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, id) - - // Name with tag form - out, _, err = dockerCmdWithError("plugin", "inspect", "-f", "{{.Id}}", pNameWithTag) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, id) - - // Name without tag form - out, _, err = dockerCmdWithError("plugin", "inspect", "-f", "{{.Id}}", pName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, id) - - _, _, err = dockerCmdWithError("plugin", "disable", pNameWithTag) - c.Assert(err, checker.IsNil) - - out, _, err = dockerCmdWithError("plugin", "remove", pNameWithTag) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, pNameWithTag) - - // After remove nothing should be found - _, _, err = dockerCmdWithError("plugin", "inspect", "-f", "{{.Id}}", id[:5]) - c.Assert(err, checker.NotNil) -} - -// Test case for https://github.com/docker/docker/pull/29186#discussion_r91277345 -func (s *DockerSuite) TestPluginInspectOnWindows(c *check.C) { - // This test should work on Windows only - testRequires(c, DaemonIsWindows) - - out, _, err := dockerCmdWithError("plugin", "inspect", "foobar") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "plugins are not supported on this platform") - c.Assert(err.Error(), checker.Contains, "plugins are not supported on this platform") -} - -func (s *DockerTrustSuite) TestPluginTrustedInstall(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - - trustedName := s.setupTrustedplugin(c, pNameWithTag, "trusted-plugin-install") - - installCmd := exec.Command(dockerBinary, "plugin", "install", "--grant-all-permissions", trustedName) - s.trustedCmd(installCmd) - out, _, err := runCommandWithOutput(installCmd) - - c.Assert(strings.TrimSpace(out), checker.Contains, trustedName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, trustedName) - - out, _, err = dockerCmdWithError("plugin", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "true") - - out, _, err = dockerCmdWithError("plugin", "disable", trustedName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, trustedName) - - out, _, err = dockerCmdWithError("plugin", "enable", trustedName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, trustedName) - - out, _, err = dockerCmdWithError("plugin", "rm", "-f", trustedName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, trustedName) - - // Try untrusted pull to ensure we pushed the tag to the registry - installCmd = exec.Command(dockerBinary, "plugin", "install", "--disable-content-trust=true", "--grant-all-permissions", trustedName) - s.trustedCmd(installCmd) - out, _, err = runCommandWithOutput(installCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Downloaded", check.Commentf(out)) - - out, _, err = dockerCmdWithError("plugin", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "true") - -} - -func (s *DockerTrustSuite) TestPluginUntrustedInstall(c *check.C) { - testRequires(c, DaemonIsLinux, IsAmd64, Network) - - pluginName := fmt.Sprintf("%v/dockercliuntrusted/plugintest:latest", privateRegistryURL) - // install locally and push to private registry - dockerCmd(c, "plugin", "install", "--grant-all-permissions", "--alias", pluginName, pNameWithTag) - dockerCmd(c, "plugin", "push", pluginName) - dockerCmd(c, "plugin", "rm", "-f", pluginName) - - // Try trusted install on untrusted plugin - installCmd := exec.Command(dockerBinary, "plugin", "install", "--grant-all-permissions", pluginName) - s.trustedCmd(installCmd) - out, _, err := runCommandWithOutput(installCmd) - - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Error: remote trust data does not exist", check.Commentf(out)) -} - -func (s *DockerSuite) TestPluginUpgrade(c *check.C) { - testRequires(c, DaemonIsLinux, Network, SameHostDaemon, IsAmd64) - plugin := "cpuguy83/docker-volume-driver-plugin-local:latest" - pluginV2 := "cpuguy83/docker-volume-driver-plugin-local:v2" - - dockerCmd(c, "plugin", "install", "--grant-all-permissions", plugin) - dockerCmd(c, "volume", "create", "--driver", plugin, "bananas") - dockerCmd(c, "run", "--rm", "-v", "bananas:/apple", "busybox", "sh", "-c", "touch /apple/core") - - out, _, err := dockerCmdWithError("plugin", "upgrade", "--grant-all-permissions", plugin, pluginV2) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "disabled before upgrading") - - out, _ = dockerCmd(c, "plugin", "inspect", "--format={{.ID}}", plugin) - id := strings.TrimSpace(out) - - // make sure "v2" does not exists - _, err = os.Stat(filepath.Join(dockerBasePath, "plugins", id, "rootfs", "v2")) - c.Assert(os.IsNotExist(err), checker.True, check.Commentf(out)) - - dockerCmd(c, "plugin", "disable", "-f", plugin) - dockerCmd(c, "plugin", "upgrade", "--grant-all-permissions", "--skip-remote-check", plugin, pluginV2) - - // make sure "v2" file exists - _, err = os.Stat(filepath.Join(dockerBasePath, "plugins", id, "rootfs", "v2")) - c.Assert(err, checker.IsNil) - - dockerCmd(c, "plugin", "enable", plugin) - dockerCmd(c, "volume", "inspect", "bananas") - dockerCmd(c, "run", "--rm", "-v", "bananas:/apple", "busybox", "sh", "-c", "ls -lh /apple/core") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_port_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_port_test.go deleted file mode 100644 index 80b00fe93..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_port_test.go +++ /dev/null @@ -1,319 +0,0 @@ -package main - -import ( - "fmt" - "net" - "regexp" - "sort" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestPortList(c *check.C) { - testRequires(c, DaemonIsLinux) - // one port - out, _ := dockerCmd(c, "run", "-d", "-p", "9876:80", "busybox", "top") - firstID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "port", firstID, "80") - - err := assertPortList(c, out, []string{"0.0.0.0:9876"}) - // Port list is not correct - c.Assert(err, checker.IsNil) - - out, _ = dockerCmd(c, "port", firstID) - - err = assertPortList(c, out, []string{"80/tcp -> 0.0.0.0:9876"}) - // Port list is not correct - c.Assert(err, checker.IsNil) - - dockerCmd(c, "rm", "-f", firstID) - - // three port - out, _ = dockerCmd(c, "run", "-d", - "-p", "9876:80", - "-p", "9877:81", - "-p", "9878:82", - "busybox", "top") - ID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "port", ID, "80") - - err = assertPortList(c, out, []string{"0.0.0.0:9876"}) - // Port list is not correct - c.Assert(err, checker.IsNil) - - out, _ = dockerCmd(c, "port", ID) - - err = assertPortList(c, out, []string{ - "80/tcp -> 0.0.0.0:9876", - "81/tcp -> 0.0.0.0:9877", - "82/tcp -> 0.0.0.0:9878"}) - // Port list is not correct - c.Assert(err, checker.IsNil) - - dockerCmd(c, "rm", "-f", ID) - - // more and one port mapped to the same container port - out, _ = dockerCmd(c, "run", "-d", - "-p", "9876:80", - "-p", "9999:80", - "-p", "9877:81", - "-p", "9878:82", - "busybox", "top") - ID = strings.TrimSpace(out) - - out, _ = dockerCmd(c, "port", ID, "80") - - err = assertPortList(c, out, []string{"0.0.0.0:9876", "0.0.0.0:9999"}) - // Port list is not correct - c.Assert(err, checker.IsNil) - - out, _ = dockerCmd(c, "port", ID) - - err = assertPortList(c, out, []string{ - "80/tcp -> 0.0.0.0:9876", - "80/tcp -> 0.0.0.0:9999", - "81/tcp -> 0.0.0.0:9877", - "82/tcp -> 0.0.0.0:9878"}) - // Port list is not correct - c.Assert(err, checker.IsNil) - dockerCmd(c, "rm", "-f", ID) - - testRange := func() { - // host port ranges used - IDs := make([]string, 3) - for i := 0; i < 3; i++ { - out, _ = dockerCmd(c, "run", "-d", - "-p", "9090-9092:80", - "busybox", "top") - IDs[i] = strings.TrimSpace(out) - - out, _ = dockerCmd(c, "port", IDs[i]) - - err = assertPortList(c, out, []string{fmt.Sprintf("80/tcp -> 0.0.0.0:%d", 9090+i)}) - // Port list is not correct - c.Assert(err, checker.IsNil) - } - - // test port range exhaustion - out, _, err = dockerCmdWithError("run", "-d", - "-p", "9090-9092:80", - "busybox", "top") - // Exhausted port range did not return an error - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - - for i := 0; i < 3; i++ { - dockerCmd(c, "rm", "-f", IDs[i]) - } - } - testRange() - // Verify we ran re-use port ranges after they are no longer in use. - testRange() - - // test invalid port ranges - for _, invalidRange := range []string{"9090-9089:80", "9090-:80", "-9090:80"} { - out, _, err = dockerCmdWithError("run", "-d", - "-p", invalidRange, - "busybox", "top") - // Port range should have returned an error - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - } - - // test host range:container range spec. - out, _ = dockerCmd(c, "run", "-d", - "-p", "9800-9803:80-83", - "busybox", "top") - ID = strings.TrimSpace(out) - - out, _ = dockerCmd(c, "port", ID) - - err = assertPortList(c, out, []string{ - "80/tcp -> 0.0.0.0:9800", - "81/tcp -> 0.0.0.0:9801", - "82/tcp -> 0.0.0.0:9802", - "83/tcp -> 0.0.0.0:9803"}) - // Port list is not correct - c.Assert(err, checker.IsNil) - dockerCmd(c, "rm", "-f", ID) - - // test mixing protocols in same port range - out, _ = dockerCmd(c, "run", "-d", - "-p", "8000-8080:80", - "-p", "8000-8080:80/udp", - "busybox", "top") - ID = strings.TrimSpace(out) - - out, _ = dockerCmd(c, "port", ID) - - err = assertPortList(c, out, []string{ - "80/tcp -> 0.0.0.0:8000", - "80/udp -> 0.0.0.0:8000"}) - // Port list is not correct - c.Assert(err, checker.IsNil) - dockerCmd(c, "rm", "-f", ID) -} - -func assertPortList(c *check.C, out string, expected []string) error { - lines := strings.Split(strings.Trim(out, "\n "), "\n") - if len(lines) != len(expected) { - return fmt.Errorf("different size lists %s, %d, %d", out, len(lines), len(expected)) - } - sort.Strings(lines) - sort.Strings(expected) - - for i := 0; i < len(expected); i++ { - if lines[i] != expected[i] { - return fmt.Errorf("|" + lines[i] + "!=" + expected[i] + "|") - } - } - - return nil -} - -func stopRemoveContainer(id string, c *check.C) { - dockerCmd(c, "rm", "-f", id) -} - -func (s *DockerSuite) TestUnpublishedPortsInPsOutput(c *check.C) { - testRequires(c, DaemonIsLinux) - // Run busybox with command line expose (equivalent to EXPOSE in image's Dockerfile) for the following ports - port1 := 80 - port2 := 443 - expose1 := fmt.Sprintf("--expose=%d", port1) - expose2 := fmt.Sprintf("--expose=%d", port2) - dockerCmd(c, "run", "-d", expose1, expose2, "busybox", "sleep", "5") - - // Check docker ps o/p for last created container reports the unpublished ports - unpPort1 := fmt.Sprintf("%d/tcp", port1) - unpPort2 := fmt.Sprintf("%d/tcp", port2) - out, _ := dockerCmd(c, "ps", "-n=1") - // Missing unpublished ports in docker ps output - c.Assert(out, checker.Contains, unpPort1) - // Missing unpublished ports in docker ps output - c.Assert(out, checker.Contains, unpPort2) - - // Run the container forcing to publish the exposed ports - dockerCmd(c, "run", "-d", "-P", expose1, expose2, "busybox", "sleep", "5") - - // Check docker ps o/p for last created container reports the exposed ports in the port bindings - expBndRegx1 := regexp.MustCompile(`0.0.0.0:\d\d\d\d\d->` + unpPort1) - expBndRegx2 := regexp.MustCompile(`0.0.0.0:\d\d\d\d\d->` + unpPort2) - out, _ = dockerCmd(c, "ps", "-n=1") - // Cannot find expected port binding port (0.0.0.0:xxxxx->unpPort1) in docker ps output - c.Assert(expBndRegx1.MatchString(out), checker.Equals, true, check.Commentf("out: %s; unpPort1: %s", out, unpPort1)) - // Cannot find expected port binding port (0.0.0.0:xxxxx->unpPort2) in docker ps output - c.Assert(expBndRegx2.MatchString(out), checker.Equals, true, check.Commentf("out: %s; unpPort2: %s", out, unpPort2)) - - // Run the container specifying explicit port bindings for the exposed ports - offset := 10000 - pFlag1 := fmt.Sprintf("%d:%d", offset+port1, port1) - pFlag2 := fmt.Sprintf("%d:%d", offset+port2, port2) - out, _ = dockerCmd(c, "run", "-d", "-p", pFlag1, "-p", pFlag2, expose1, expose2, "busybox", "sleep", "5") - id := strings.TrimSpace(out) - - // Check docker ps o/p for last created container reports the specified port mappings - expBnd1 := fmt.Sprintf("0.0.0.0:%d->%s", offset+port1, unpPort1) - expBnd2 := fmt.Sprintf("0.0.0.0:%d->%s", offset+port2, unpPort2) - out, _ = dockerCmd(c, "ps", "-n=1") - // Cannot find expected port binding (expBnd1) in docker ps output - c.Assert(out, checker.Contains, expBnd1) - // Cannot find expected port binding (expBnd2) in docker ps output - c.Assert(out, checker.Contains, expBnd2) - - // Remove container now otherwise it will interfere with next test - stopRemoveContainer(id, c) - - // Run the container with explicit port bindings and no exposed ports - out, _ = dockerCmd(c, "run", "-d", "-p", pFlag1, "-p", pFlag2, "busybox", "sleep", "5") - id = strings.TrimSpace(out) - - // Check docker ps o/p for last created container reports the specified port mappings - out, _ = dockerCmd(c, "ps", "-n=1") - // Cannot find expected port binding (expBnd1) in docker ps output - c.Assert(out, checker.Contains, expBnd1) - // Cannot find expected port binding (expBnd2) in docker ps output - c.Assert(out, checker.Contains, expBnd2) - // Remove container now otherwise it will interfere with next test - stopRemoveContainer(id, c) - - // Run the container with one unpublished exposed port and one explicit port binding - dockerCmd(c, "run", "-d", expose1, "-p", pFlag2, "busybox", "sleep", "5") - - // Check docker ps o/p for last created container reports the specified unpublished port and port mapping - out, _ = dockerCmd(c, "ps", "-n=1") - // Missing unpublished exposed ports (unpPort1) in docker ps output - c.Assert(out, checker.Contains, unpPort1) - // Missing port binding (expBnd2) in docker ps output - c.Assert(out, checker.Contains, expBnd2) -} - -func (s *DockerSuite) TestPortHostBinding(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, _ := dockerCmd(c, "run", "-d", "-p", "9876:80", "busybox", - "nc", "-l", "-p", "80") - firstID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "port", firstID, "80") - - err := assertPortList(c, out, []string{"0.0.0.0:9876"}) - // Port list is not correct - c.Assert(err, checker.IsNil) - - dockerCmd(c, "run", "--net=host", "busybox", - "nc", "localhost", "9876") - - dockerCmd(c, "rm", "-f", firstID) - - out, _, err = dockerCmdWithError("run", "--net=host", "busybox", "nc", "localhost", "9876") - // Port is still bound after the Container is removed - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) -} - -func (s *DockerSuite) TestPortExposeHostBinding(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, _ := dockerCmd(c, "run", "-d", "-P", "--expose", "80", "busybox", - "nc", "-l", "-p", "80") - firstID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "port", firstID, "80") - - _, exposedPort, err := net.SplitHostPort(out) - c.Assert(err, checker.IsNil, check.Commentf("out: %s", out)) - - dockerCmd(c, "run", "--net=host", "busybox", - "nc", "localhost", strings.TrimSpace(exposedPort)) - - dockerCmd(c, "rm", "-f", firstID) - - out, _, err = dockerCmdWithError("run", "--net=host", "busybox", - "nc", "localhost", strings.TrimSpace(exposedPort)) - // Port is still bound after the Container is removed - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) -} - -func (s *DockerSuite) TestPortBindingOnSandbox(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - dockerCmd(c, "network", "create", "--internal", "-d", "bridge", "internal-net") - nr := getNetworkResource(c, "internal-net") - c.Assert(nr.Internal, checker.Equals, true) - - dockerCmd(c, "run", "--net", "internal-net", "-d", "--name", "c1", - "-p", "8080:8080", "busybox", "nc", "-l", "-p", "8080") - c.Assert(waitRun("c1"), check.IsNil) - - _, _, err := dockerCmdWithError("run", "--net=host", "busybox", "nc", "localhost", "8080") - c.Assert(err, check.NotNil, - check.Commentf("Port mapping on internal network is expected to fail")) - - // Connect container to another normal bridge network - dockerCmd(c, "network", "create", "-d", "bridge", "foo-net") - dockerCmd(c, "network", "connect", "foo-net", "c1") - - _, _, err = dockerCmdWithError("run", "--net=host", "busybox", "nc", "localhost", "8080") - c.Assert(err, check.IsNil, - check.Commentf("Port mapping on the new network is expected to succeed")) - -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_proxy_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_proxy_test.go deleted file mode 100644 index 1cf569b80..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_proxy_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package main - -import ( - "net" - "os/exec" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestCLIProxyDisableProxyUnixSock(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, SameHostDaemon) // test is valid when DOCKER_HOST=unix://.. - - cmd := exec.Command(dockerBinary, "info") - cmd.Env = appendBaseEnv(false, "HTTP_PROXY=http://127.0.0.1:9999") - - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil, check.Commentf("%v", out)) - -} - -// Can't use localhost here since go has a special case to not use proxy if connecting to localhost -// See https://golang.org/pkg/net/http/#ProxyFromEnvironment -func (s *DockerDaemonSuite) TestCLIProxyProxyTCPSock(c *check.C) { - testRequires(c, SameHostDaemon) - // get the IP to use to connect since we can't use localhost - addrs, err := net.InterfaceAddrs() - c.Assert(err, checker.IsNil) - var ip string - for _, addr := range addrs { - sAddr := addr.String() - if !strings.Contains(sAddr, "127.0.0.1") { - addrArr := strings.Split(sAddr, "/") - ip = addrArr[0] - break - } - } - - c.Assert(ip, checker.Not(checker.Equals), "") - - err = s.d.Start("-H", "tcp://"+ip+":2375") - c.Assert(err, checker.IsNil) - cmd := exec.Command(dockerBinary, "info") - cmd.Env = []string{"DOCKER_HOST=tcp://" + ip + ":2375", "HTTP_PROXY=127.0.0.1:9999"} - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.NotNil, check.Commentf("%v", out)) - // Test with no_proxy - cmd.Env = append(cmd.Env, "NO_PROXY="+ip) - out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "info")) - c.Assert(err, checker.IsNil, check.Commentf("%v", out)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_prune_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_prune_unix_test.go deleted file mode 100644 index dabbc7208..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_prune_unix_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// +build !windows - -package main - -import ( - "strconv" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func pruneNetworkAndVerify(c *check.C, d *SwarmDaemon, kept, pruned []string) { - _, err := d.Cmd("network", "prune", "--force") - c.Assert(err, checker.IsNil) - out, err := d.Cmd("network", "ls", "--format", "{{.Name}}") - c.Assert(err, checker.IsNil) - for _, s := range kept { - c.Assert(out, checker.Contains, s) - } - for _, s := range pruned { - c.Assert(out, checker.Not(checker.Contains), s) - } -} - -func (s *DockerSwarmSuite) TestPruneNetwork(c *check.C) { - d := s.AddDaemon(c, true, true) - _, err := d.Cmd("network", "create", "n1") // used by container (testprune) - c.Assert(err, checker.IsNil) - _, err = d.Cmd("network", "create", "n2") - c.Assert(err, checker.IsNil) - _, err = d.Cmd("network", "create", "n3", "--driver", "overlay") // used by service (testprunesvc) - c.Assert(err, checker.IsNil) - _, err = d.Cmd("network", "create", "n4", "--driver", "overlay") - c.Assert(err, checker.IsNil) - - cName := "testprune" - _, err = d.Cmd("run", "-d", "--name", cName, "--net", "n1", "busybox", "top") - c.Assert(err, checker.IsNil) - - serviceName := "testprunesvc" - replicas := 1 - out, err := d.Cmd("service", "create", "--name", serviceName, - "--replicas", strconv.Itoa(replicas), - "--network", "n3", - "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, replicas+1) - - // prune and verify - pruneNetworkAndVerify(c, d, []string{"n1", "n3"}, []string{"n2", "n4"}) - - // remove containers, then prune and verify again - _, err = d.Cmd("rm", "-f", cName) - c.Assert(err, checker.IsNil) - _, err = d.Cmd("service", "rm", serviceName) - c.Assert(err, checker.IsNil) - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 0) - pruneNetworkAndVerify(c, d, []string{}, []string{"n1", "n3"}) -} - -func (s *DockerDaemonSuite) TestPruneImageDangling(c *check.C) { - c.Assert(s.d.StartWithBusybox(), checker.IsNil) - - out, _, err := s.d.buildImageWithOut("test", - `FROM busybox - LABEL foo=bar`, true, "-q") - c.Assert(err, checker.IsNil) - id := strings.TrimSpace(out) - - out, err = s.d.Cmd("images", "-q", "--no-trunc") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, id) - - out, err = s.d.Cmd("image", "prune", "--force") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id) - - out, err = s.d.Cmd("images", "-q", "--no-trunc") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, id) - - out, err = s.d.Cmd("image", "prune", "--force", "--all") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, id) - - out, err = s.d.Cmd("images", "-q", "--no-trunc") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_ps_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_ps_test.go deleted file mode 100644 index 19ede90d5..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_ps_test.go +++ /dev/null @@ -1,952 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "sort" - "strconv" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/docker/docker/pkg/stringid" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestPsListContainersBase(c *check.C) { - out, _ := runSleepingContainer(c, "-d") - firstID := strings.TrimSpace(out) - - out, _ = runSleepingContainer(c, "-d") - secondID := strings.TrimSpace(out) - - // not long running - out, _ = dockerCmd(c, "run", "-d", "busybox", "true") - thirdID := strings.TrimSpace(out) - - out, _ = runSleepingContainer(c, "-d") - fourthID := strings.TrimSpace(out) - - // make sure the second is running - c.Assert(waitRun(secondID), checker.IsNil) - - // make sure third one is not running - dockerCmd(c, "wait", thirdID) - - // make sure the forth is running - c.Assert(waitRun(fourthID), checker.IsNil) - - // all - out, _ = dockerCmd(c, "ps", "-a") - c.Assert(assertContainerList(out, []string{fourthID, thirdID, secondID, firstID}), checker.Equals, true, check.Commentf("ALL: Container list is not in the correct order: \n%s", out)) - - // running - out, _ = dockerCmd(c, "ps") - c.Assert(assertContainerList(out, []string{fourthID, secondID, firstID}), checker.Equals, true, check.Commentf("RUNNING: Container list is not in the correct order: \n%s", out)) - - // limit - out, _ = dockerCmd(c, "ps", "-n=2", "-a") - expected := []string{fourthID, thirdID} - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("LIMIT & ALL: Container list is not in the correct order: \n%s", out)) - - out, _ = dockerCmd(c, "ps", "-n=2") - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("LIMIT: Container list is not in the correct order: \n%s", out)) - - // filter since - out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-a") - expected = []string{fourthID, thirdID, secondID} - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter & ALL: Container list is not in the correct order: \n%s", out)) - - out, _ = dockerCmd(c, "ps", "-f", "since="+firstID) - expected = []string{fourthID, secondID} - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter: Container list is not in the correct order: \n%s", out)) - - out, _ = dockerCmd(c, "ps", "-f", "since="+thirdID) - expected = []string{fourthID} - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter: Container list is not in the correct order: \n%s", out)) - - // filter before - out, _ = dockerCmd(c, "ps", "-f", "before="+fourthID, "-a") - expected = []string{thirdID, secondID, firstID} - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter & ALL: Container list is not in the correct order: \n%s", out)) - - out, _ = dockerCmd(c, "ps", "-f", "before="+fourthID) - expected = []string{secondID, firstID} - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter: Container list is not in the correct order: \n%s", out)) - - out, _ = dockerCmd(c, "ps", "-f", "before="+thirdID) - expected = []string{secondID, firstID} - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter: Container list is not in the correct order: \n%s", out)) - - // filter since & before - out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-f", "before="+fourthID, "-a") - expected = []string{thirdID, secondID} - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter & ALL: Container list is not in the correct order: \n%s", out)) - - out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-f", "before="+fourthID) - expected = []string{secondID} - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter: Container list is not in the correct order: \n%s", out)) - - // filter since & limit - out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-n=2", "-a") - expected = []string{fourthID, thirdID} - - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, LIMIT & ALL: Container list is not in the correct order: \n%s", out)) - - out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-n=2") - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, LIMIT: Container list is not in the correct order: \n%s", out)) - - // filter before & limit - out, _ = dockerCmd(c, "ps", "-f", "before="+fourthID, "-n=1", "-a") - expected = []string{thirdID} - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter, LIMIT & ALL: Container list is not in the correct order: \n%s", out)) - - out, _ = dockerCmd(c, "ps", "-f", "before="+fourthID, "-n=1") - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("BEFORE filter, LIMIT: Container list is not in the correct order: \n%s", out)) - - // filter since & filter before & limit - out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-f", "before="+fourthID, "-n=1", "-a") - expected = []string{thirdID} - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter, LIMIT & ALL: Container list is not in the correct order: \n%s", out)) - - out, _ = dockerCmd(c, "ps", "-f", "since="+firstID, "-f", "before="+fourthID, "-n=1") - c.Assert(assertContainerList(out, expected), checker.Equals, true, check.Commentf("SINCE filter, BEFORE filter, LIMIT: Container list is not in the correct order: \n%s", out)) - -} - -func assertContainerList(out string, expected []string) bool { - lines := strings.Split(strings.Trim(out, "\n "), "\n") - - if len(lines)-1 != len(expected) { - return false - } - - containerIDIndex := strings.Index(lines[0], "CONTAINER ID") - for i := 0; i < len(expected); i++ { - foundID := lines[i+1][containerIDIndex : containerIDIndex+12] - if foundID != expected[i][:12] { - return false - } - } - - return true -} - -// FIXME(vdemeester) Move this into a unit test in daemon package -func (s *DockerSuite) TestPsListContainersInvalidFilterName(c *check.C) { - out, _, err := dockerCmdWithError("ps", "-f", "invalidFilter=test") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "Invalid filter") -} - -func (s *DockerSuite) TestPsListContainersSize(c *check.C) { - // Problematic on Windows as it doesn't report the size correctly @swernli - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "busybox") - - baseOut, _ := dockerCmd(c, "ps", "-s", "-n=1") - baseLines := strings.Split(strings.Trim(baseOut, "\n "), "\n") - baseSizeIndex := strings.Index(baseLines[0], "SIZE") - baseFoundsize := baseLines[1][baseSizeIndex:] - baseBytes, err := strconv.Atoi(strings.Split(baseFoundsize, " ")[0]) - c.Assert(err, checker.IsNil) - - name := "test_size" - dockerCmd(c, "run", "--name", name, "busybox", "sh", "-c", "echo 1 > test") - id, err := getIDByName(name) - c.Assert(err, checker.IsNil) - - runCmd := exec.Command(dockerBinary, "ps", "-s", "-n=1") - var out string - - wait := make(chan struct{}) - go func() { - out, _, err = runCommandWithOutput(runCmd) - close(wait) - }() - select { - case <-wait: - case <-time.After(3 * time.Second): - c.Fatalf("Calling \"docker ps -s\" timed out!") - } - c.Assert(err, checker.IsNil) - lines := strings.Split(strings.Trim(out, "\n "), "\n") - c.Assert(lines, checker.HasLen, 2, check.Commentf("Expected 2 lines for 'ps -s -n=1' output, got %d", len(lines))) - sizeIndex := strings.Index(lines[0], "SIZE") - idIndex := strings.Index(lines[0], "CONTAINER ID") - foundID := lines[1][idIndex : idIndex+12] - c.Assert(foundID, checker.Equals, id[:12], check.Commentf("Expected id %s, got %s", id[:12], foundID)) - expectedSize := fmt.Sprintf("%d B", (2 + baseBytes)) - foundSize := lines[1][sizeIndex:] - c.Assert(foundSize, checker.Contains, expectedSize, check.Commentf("Expected size %q, got %q", expectedSize, foundSize)) -} - -func (s *DockerSuite) TestPsListContainersFilterStatus(c *check.C) { - // start exited container - out, _ := dockerCmd(c, "run", "-d", "busybox") - firstID := strings.TrimSpace(out) - - // make sure the exited container is not running - dockerCmd(c, "wait", firstID) - - // start running container - out, _ = dockerCmd(c, "run", "-itd", "busybox") - secondID := strings.TrimSpace(out) - - // filter containers by exited - out, _ = dockerCmd(c, "ps", "--no-trunc", "-q", "--filter=status=exited") - containerOut := strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, firstID) - - out, _ = dockerCmd(c, "ps", "-a", "--no-trunc", "-q", "--filter=status=running") - containerOut = strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, secondID) - - result := dockerCmdWithTimeout(time.Second*60, "ps", "-a", "-q", "--filter=status=rubbish") - c.Assert(result, icmd.Matches, icmd.Expected{ - ExitCode: 1, - Err: "Unrecognised filter value for status", - }) - - // Windows doesn't support pausing of containers - if daemonPlatform != "windows" { - // pause running container - out, _ = dockerCmd(c, "run", "-itd", "busybox") - pausedID := strings.TrimSpace(out) - dockerCmd(c, "pause", pausedID) - // make sure the container is unpaused to let the daemon stop it properly - defer func() { dockerCmd(c, "unpause", pausedID) }() - - out, _ = dockerCmd(c, "ps", "--no-trunc", "-q", "--filter=status=paused") - containerOut = strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, pausedID) - } -} - -func (s *DockerSuite) TestPsListContainersFilterHealth(c *check.C) { - // Test legacy no health check - out, _ := runSleepingContainer(c, "--name=none_legacy") - containerID := strings.TrimSpace(out) - - waitForContainer(containerID) - - out, _ = dockerCmd(c, "ps", "-q", "-l", "--no-trunc", "--filter=health=none") - containerOut := strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, containerID, check.Commentf("Expected id %s, got %s for legacy none filter, output: %q", containerID, containerOut, out)) - - // Test no health check specified explicitly - out, _ = runSleepingContainer(c, "--name=none", "--no-healthcheck") - containerID = strings.TrimSpace(out) - - waitForContainer(containerID) - - out, _ = dockerCmd(c, "ps", "-q", "-l", "--no-trunc", "--filter=health=none") - containerOut = strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, containerID, check.Commentf("Expected id %s, got %s for none filter, output: %q", containerID, containerOut, out)) - - // Test failing health check - out, _ = runSleepingContainer(c, "--name=failing_container", "--health-cmd=exit 1", "--health-interval=1s") - containerID = strings.TrimSpace(out) - - waitForHealthStatus(c, "failing_container", "starting", "unhealthy") - - out, _ = dockerCmd(c, "ps", "-q", "--no-trunc", "--filter=health=unhealthy") - containerOut = strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, containerID, check.Commentf("Expected containerID %s, got %s for unhealthy filter, output: %q", containerID, containerOut, out)) - - // Check passing healthcheck - out, _ = runSleepingContainer(c, "--name=passing_container", "--health-cmd=exit 0", "--health-interval=1s") - containerID = strings.TrimSpace(out) - - waitForHealthStatus(c, "passing_container", "starting", "healthy") - - out, _ = dockerCmd(c, "ps", "-q", "--no-trunc", "--filter=health=healthy") - containerOut = strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, containerID, check.Commentf("Expected containerID %s, got %s for healthy filter, output: %q", containerID, containerOut, out)) -} - -func (s *DockerSuite) TestPsListContainersFilterID(c *check.C) { - // start container - out, _ := dockerCmd(c, "run", "-d", "busybox") - firstID := strings.TrimSpace(out) - - // start another container - runSleepingContainer(c) - - // filter containers by id - out, _ = dockerCmd(c, "ps", "-a", "-q", "--filter=id="+firstID) - containerOut := strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, firstID[:12], check.Commentf("Expected id %s, got %s for exited filter, output: %q", firstID[:12], containerOut, out)) -} - -func (s *DockerSuite) TestPsListContainersFilterName(c *check.C) { - // start container - dockerCmd(c, "run", "--name=a_name_to_match", "busybox") - id, err := getIDByName("a_name_to_match") - c.Assert(err, check.IsNil) - - // start another container - runSleepingContainer(c, "--name=b_name_to_match") - - // filter containers by name - out, _ := dockerCmd(c, "ps", "-a", "-q", "--filter=name=a_name_to_match") - containerOut := strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, id[:12], check.Commentf("Expected id %s, got %s for exited filter, output: %q", id[:12], containerOut, out)) -} - -// Test for the ancestor filter for ps. -// There is also the same test but with image:tag@digest in docker_cli_by_digest_test.go -// -// What the test setups : -// - Create 2 image based on busybox using the same repository but different tags -// - Create an image based on the previous image (images_ps_filter_test2) -// - Run containers for each of those image (busybox, images_ps_filter_test1, images_ps_filter_test2) -// - Filter them out :P -func (s *DockerSuite) TestPsListContainersFilterAncestorImage(c *check.C) { - // Build images - imageName1 := "images_ps_filter_test1" - imageID1, err := buildImage(imageName1, - `FROM busybox - LABEL match me 1`, true) - c.Assert(err, checker.IsNil) - - imageName1Tagged := "images_ps_filter_test1:tag" - imageID1Tagged, err := buildImage(imageName1Tagged, - `FROM busybox - LABEL match me 1 tagged`, true) - c.Assert(err, checker.IsNil) - - imageName2 := "images_ps_filter_test2" - imageID2, err := buildImage(imageName2, - fmt.Sprintf(`FROM %s - LABEL match me 2`, imageName1), true) - c.Assert(err, checker.IsNil) - - // start containers - dockerCmd(c, "run", "--name=first", "busybox", "echo", "hello") - firstID, err := getIDByName("first") - c.Assert(err, check.IsNil) - - // start another container - dockerCmd(c, "run", "--name=second", "busybox", "echo", "hello") - secondID, err := getIDByName("second") - c.Assert(err, check.IsNil) - - // start third container - dockerCmd(c, "run", "--name=third", imageName1, "echo", "hello") - thirdID, err := getIDByName("third") - c.Assert(err, check.IsNil) - - // start fourth container - dockerCmd(c, "run", "--name=fourth", imageName1Tagged, "echo", "hello") - fourthID, err := getIDByName("fourth") - c.Assert(err, check.IsNil) - - // start fifth container - dockerCmd(c, "run", "--name=fifth", imageName2, "echo", "hello") - fifthID, err := getIDByName("fifth") - c.Assert(err, check.IsNil) - - var filterTestSuite = []struct { - filterName string - expectedIDs []string - }{ - // non existent stuff - {"nonexistent", []string{}}, - {"nonexistent:tag", []string{}}, - // image - {"busybox", []string{firstID, secondID, thirdID, fourthID, fifthID}}, - {imageName1, []string{thirdID, fifthID}}, - {imageName2, []string{fifthID}}, - // image:tag - {fmt.Sprintf("%s:latest", imageName1), []string{thirdID, fifthID}}, - {imageName1Tagged, []string{fourthID}}, - // short-id - {stringid.TruncateID(imageID1), []string{thirdID, fifthID}}, - {stringid.TruncateID(imageID2), []string{fifthID}}, - // full-id - {imageID1, []string{thirdID, fifthID}}, - {imageID1Tagged, []string{fourthID}}, - {imageID2, []string{fifthID}}, - } - - var out string - for _, filter := range filterTestSuite { - out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=ancestor="+filter.filterName) - checkPsAncestorFilterOutput(c, out, filter.filterName, filter.expectedIDs) - } - - // Multiple ancestor filter - out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=ancestor="+imageName2, "--filter=ancestor="+imageName1Tagged) - checkPsAncestorFilterOutput(c, out, imageName2+","+imageName1Tagged, []string{fourthID, fifthID}) -} - -func checkPsAncestorFilterOutput(c *check.C, out string, filterName string, expectedIDs []string) { - actualIDs := []string{} - if out != "" { - actualIDs = strings.Split(out[:len(out)-1], "\n") - } - sort.Strings(actualIDs) - sort.Strings(expectedIDs) - - c.Assert(actualIDs, checker.HasLen, len(expectedIDs), check.Commentf("Expected filtered container(s) for %s ancestor filter to be %v:%v, got %v:%v", filterName, len(expectedIDs), expectedIDs, len(actualIDs), actualIDs)) - if len(expectedIDs) > 0 { - same := true - for i := range expectedIDs { - if actualIDs[i] != expectedIDs[i] { - c.Logf("%s, %s", actualIDs[i], expectedIDs[i]) - same = false - break - } - } - c.Assert(same, checker.Equals, true, check.Commentf("Expected filtered container(s) for %s ancestor filter to be %v, got %v", filterName, expectedIDs, actualIDs)) - } -} - -func (s *DockerSuite) TestPsListContainersFilterLabel(c *check.C) { - // start container - dockerCmd(c, "run", "--name=first", "-l", "match=me", "-l", "second=tag", "busybox") - firstID, err := getIDByName("first") - c.Assert(err, check.IsNil) - - // start another container - dockerCmd(c, "run", "--name=second", "-l", "match=me too", "busybox") - secondID, err := getIDByName("second") - c.Assert(err, check.IsNil) - - // start third container - dockerCmd(c, "run", "--name=third", "-l", "nomatch=me", "busybox") - thirdID, err := getIDByName("third") - c.Assert(err, check.IsNil) - - // filter containers by exact match - out, _ := dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=label=match=me") - containerOut := strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, firstID, check.Commentf("Expected id %s, got %s for exited filter, output: %q", firstID, containerOut, out)) - - // filter containers by two labels - out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=label=match=me", "--filter=label=second=tag") - containerOut = strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, firstID, check.Commentf("Expected id %s, got %s for exited filter, output: %q", firstID, containerOut, out)) - - // filter containers by two labels, but expect not found because of AND behavior - out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=label=match=me", "--filter=label=second=tag-no") - containerOut = strings.TrimSpace(out) - c.Assert(containerOut, checker.Equals, "", check.Commentf("Expected nothing, got %s for exited filter, output: %q", containerOut, out)) - - // filter containers by exact key - out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=label=match") - containerOut = strings.TrimSpace(out) - c.Assert(containerOut, checker.Contains, firstID) - c.Assert(containerOut, checker.Contains, secondID) - c.Assert(containerOut, checker.Not(checker.Contains), thirdID) -} - -func (s *DockerSuite) TestPsListContainersFilterExited(c *check.C) { - runSleepingContainer(c, "--name=sleep") - - dockerCmd(c, "run", "--name", "zero1", "busybox", "true") - firstZero, err := getIDByName("zero1") - c.Assert(err, checker.IsNil) - - dockerCmd(c, "run", "--name", "zero2", "busybox", "true") - secondZero, err := getIDByName("zero2") - c.Assert(err, checker.IsNil) - - out, _, err := dockerCmdWithError("run", "--name", "nonzero1", "busybox", "false") - c.Assert(err, checker.NotNil, check.Commentf("Should fail.", out, err)) - - firstNonZero, err := getIDByName("nonzero1") - c.Assert(err, checker.IsNil) - - out, _, err = dockerCmdWithError("run", "--name", "nonzero2", "busybox", "false") - c.Assert(err, checker.NotNil, check.Commentf("Should fail.", out, err)) - secondNonZero, err := getIDByName("nonzero2") - c.Assert(err, checker.IsNil) - - // filter containers by exited=0 - out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=exited=0") - ids := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(ids, checker.HasLen, 2, check.Commentf("Should be 2 zero exited containers got %d: %s", len(ids), out)) - c.Assert(ids[0], checker.Equals, secondZero, check.Commentf("First in list should be %q, got %q", secondZero, ids[0])) - c.Assert(ids[1], checker.Equals, firstZero, check.Commentf("Second in list should be %q, got %q", firstZero, ids[1])) - - out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc", "--filter=exited=1") - ids = strings.Split(strings.TrimSpace(out), "\n") - c.Assert(ids, checker.HasLen, 2, check.Commentf("Should be 2 zero exited containers got %d", len(ids))) - c.Assert(ids[0], checker.Equals, secondNonZero, check.Commentf("First in list should be %q, got %q", secondNonZero, ids[0])) - c.Assert(ids[1], checker.Equals, firstNonZero, check.Commentf("Second in list should be %q, got %q", firstNonZero, ids[1])) - -} - -func (s *DockerSuite) TestPsRightTagName(c *check.C) { - // TODO Investigate further why this fails on Windows to Windows CI - testRequires(c, DaemonIsLinux) - tag := "asybox:shmatest" - dockerCmd(c, "tag", "busybox", tag) - - var id1 string - out, _ := runSleepingContainer(c) - id1 = strings.TrimSpace(string(out)) - - var id2 string - out, _ = runSleepingContainerInImage(c, tag) - id2 = strings.TrimSpace(string(out)) - - var imageID string - out = inspectField(c, "busybox", "Id") - imageID = strings.TrimSpace(string(out)) - - var id3 string - out, _ = runSleepingContainerInImage(c, imageID) - id3 = strings.TrimSpace(string(out)) - - out, _ = dockerCmd(c, "ps", "--no-trunc") - lines := strings.Split(strings.TrimSpace(string(out)), "\n") - // skip header - lines = lines[1:] - c.Assert(lines, checker.HasLen, 3, check.Commentf("There should be 3 running container, got %d", len(lines))) - for _, line := range lines { - f := strings.Fields(line) - switch f[0] { - case id1: - c.Assert(f[1], checker.Equals, "busybox", check.Commentf("Expected %s tag for id %s, got %s", "busybox", id1, f[1])) - case id2: - c.Assert(f[1], checker.Equals, tag, check.Commentf("Expected %s tag for id %s, got %s", tag, id2, f[1])) - case id3: - c.Assert(f[1], checker.Equals, imageID, check.Commentf("Expected %s imageID for id %s, got %s", tag, id3, f[1])) - default: - c.Fatalf("Unexpected id %s, expected %s and %s and %s", f[0], id1, id2, id3) - } - } -} - -func (s *DockerSuite) TestPsLinkedWithNoTrunc(c *check.C) { - // Problematic on Windows as it doesn't support links as of Jan 2016 - testRequires(c, DaemonIsLinux) - runSleepingContainer(c, "--name=first") - runSleepingContainer(c, "--name=second", "--link=first:first") - - out, _ := dockerCmd(c, "ps", "--no-trunc") - lines := strings.Split(strings.TrimSpace(string(out)), "\n") - // strip header - lines = lines[1:] - expected := []string{"second", "first,second/first"} - var names []string - for _, l := range lines { - fields := strings.Fields(l) - names = append(names, fields[len(fields)-1]) - } - c.Assert(expected, checker.DeepEquals, names, check.Commentf("Expected array: %v, got: %v", expected, names)) -} - -func (s *DockerSuite) TestPsGroupPortRange(c *check.C) { - // Problematic on Windows as it doesn't support port ranges as of Jan 2016 - testRequires(c, DaemonIsLinux) - portRange := "3850-3900" - dockerCmd(c, "run", "-d", "--name", "porttest", "-p", portRange+":"+portRange, "busybox", "top") - - out, _ := dockerCmd(c, "ps") - - c.Assert(string(out), checker.Contains, portRange, check.Commentf("docker ps output should have had the port range %q: %s", portRange, string(out))) - -} - -func (s *DockerSuite) TestPsWithSize(c *check.C) { - // Problematic on Windows as it doesn't report the size correctly @swernli - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--name", "sizetest", "busybox", "top") - - out, _ := dockerCmd(c, "ps", "--size") - c.Assert(out, checker.Contains, "virtual", check.Commentf("docker ps with --size should show virtual size of container")) -} - -func (s *DockerSuite) TestPsListContainersFilterCreated(c *check.C) { - // create a container - out, _ := dockerCmd(c, "create", "busybox") - cID := strings.TrimSpace(out) - shortCID := cID[:12] - - // Make sure it DOESN'T show up w/o a '-a' for normal 'ps' - out, _ = dockerCmd(c, "ps", "-q") - c.Assert(out, checker.Not(checker.Contains), shortCID, check.Commentf("Should have not seen '%s' in ps output:\n%s", shortCID, out)) - - // Make sure it DOES show up as 'Created' for 'ps -a' - out, _ = dockerCmd(c, "ps", "-a") - - hits := 0 - for _, line := range strings.Split(out, "\n") { - if !strings.Contains(line, shortCID) { - continue - } - hits++ - c.Assert(line, checker.Contains, "Created", check.Commentf("Missing 'Created' on '%s'", line)) - } - - c.Assert(hits, checker.Equals, 1, check.Commentf("Should have seen '%s' in ps -a output once:%d\n%s", shortCID, hits, out)) - - // filter containers by 'create' - note, no -a needed - out, _ = dockerCmd(c, "ps", "-q", "-f", "status=created") - containerOut := strings.TrimSpace(out) - c.Assert(cID, checker.HasPrefix, containerOut) -} - -func (s *DockerSuite) TestPsFormatMultiNames(c *check.C) { - // Problematic on Windows as it doesn't support link as of Jan 2016 - testRequires(c, DaemonIsLinux) - //create 2 containers and link them - dockerCmd(c, "run", "--name=child", "-d", "busybox", "top") - dockerCmd(c, "run", "--name=parent", "--link=child:linkedone", "-d", "busybox", "top") - - //use the new format capabilities to only list the names and --no-trunc to get all names - out, _ := dockerCmd(c, "ps", "--format", "{{.Names}}", "--no-trunc") - lines := strings.Split(strings.TrimSpace(string(out)), "\n") - expected := []string{"parent", "child,parent/linkedone"} - var names []string - names = append(names, lines...) - c.Assert(expected, checker.DeepEquals, names, check.Commentf("Expected array with non-truncated names: %v, got: %v", expected, names)) - - //now list without turning off truncation and make sure we only get the non-link names - out, _ = dockerCmd(c, "ps", "--format", "{{.Names}}") - lines = strings.Split(strings.TrimSpace(string(out)), "\n") - expected = []string{"parent", "child"} - var truncNames []string - truncNames = append(truncNames, lines...) - c.Assert(expected, checker.DeepEquals, truncNames, check.Commentf("Expected array with truncated names: %v, got: %v", expected, truncNames)) -} - -// Test for GitHub issue #21772 -func (s *DockerSuite) TestPsNamesMultipleTime(c *check.C) { - runSleepingContainer(c, "--name=test1") - runSleepingContainer(c, "--name=test2") - - //use the new format capabilities to list the names twice - out, _ := dockerCmd(c, "ps", "--format", "{{.Names}} {{.Names}}") - lines := strings.Split(strings.TrimSpace(string(out)), "\n") - expected := []string{"test2 test2", "test1 test1"} - var names []string - names = append(names, lines...) - c.Assert(expected, checker.DeepEquals, names, check.Commentf("Expected array with names displayed twice: %v, got: %v", expected, names)) -} - -func (s *DockerSuite) TestPsFormatHeaders(c *check.C) { - // make sure no-container "docker ps" still prints the header row - out, _ := dockerCmd(c, "ps", "--format", "table {{.ID}}") - c.Assert(out, checker.Equals, "CONTAINER ID\n", check.Commentf(`Expected 'CONTAINER ID\n', got %v`, out)) - - // verify that "docker ps" with a container still prints the header row also - runSleepingContainer(c, "--name=test") - out, _ = dockerCmd(c, "ps", "--format", "table {{.Names}}") - c.Assert(out, checker.Equals, "NAMES\ntest\n", check.Commentf(`Expected 'NAMES\ntest\n', got %v`, out)) -} - -func (s *DockerSuite) TestPsDefaultFormatAndQuiet(c *check.C) { - config := `{ - "psFormat": "default {{ .ID }}" -}` - d, err := ioutil.TempDir("", "integration-cli-") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(d) - - err = ioutil.WriteFile(filepath.Join(d, "config.json"), []byte(config), 0644) - c.Assert(err, checker.IsNil) - - out, _ := runSleepingContainer(c, "--name=test") - id := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "--config", d, "ps", "-q") - c.Assert(id, checker.HasPrefix, strings.TrimSpace(out), check.Commentf("Expected to print only the container id, got %v\n", out)) -} - -// Test for GitHub issue #12595 -func (s *DockerSuite) TestPsImageIDAfterUpdate(c *check.C) { - // TODO: Investigate why this fails on Windows to Windows CI further. - testRequires(c, DaemonIsLinux) - originalImageName := "busybox:TestPsImageIDAfterUpdate-original" - updatedImageName := "busybox:TestPsImageIDAfterUpdate-updated" - - runCmd := exec.Command(dockerBinary, "tag", "busybox:latest", originalImageName) - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.IsNil) - - originalImageID, err := getIDByName(originalImageName) - c.Assert(err, checker.IsNil) - - runCmd = exec.Command(dockerBinary, append([]string{"run", "-d", originalImageName}, sleepCommandForDaemonPlatform()...)...) - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.IsNil) - containerID := strings.TrimSpace(out) - - linesOut, err := exec.Command(dockerBinary, "ps", "--no-trunc").CombinedOutput() - c.Assert(err, checker.IsNil) - - lines := strings.Split(strings.TrimSpace(string(linesOut)), "\n") - // skip header - lines = lines[1:] - c.Assert(len(lines), checker.Equals, 1) - - for _, line := range lines { - f := strings.Fields(line) - c.Assert(f[1], checker.Equals, originalImageName) - } - - runCmd = exec.Command(dockerBinary, "commit", containerID, updatedImageName) - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.IsNil) - - runCmd = exec.Command(dockerBinary, "tag", updatedImageName, originalImageName) - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.IsNil) - - linesOut, err = exec.Command(dockerBinary, "ps", "--no-trunc").CombinedOutput() - c.Assert(err, checker.IsNil) - - lines = strings.Split(strings.TrimSpace(string(linesOut)), "\n") - // skip header - lines = lines[1:] - c.Assert(len(lines), checker.Equals, 1) - - for _, line := range lines { - f := strings.Fields(line) - c.Assert(f[1], checker.Equals, originalImageID) - } - -} - -func (s *DockerSuite) TestPsNotShowPortsOfStoppedContainer(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "--name=foo", "-d", "-p", "5000:5000", "busybox", "top") - c.Assert(waitRun("foo"), checker.IsNil) - out, _ := dockerCmd(c, "ps") - lines := strings.Split(strings.TrimSpace(string(out)), "\n") - expected := "0.0.0.0:5000->5000/tcp" - fields := strings.Fields(lines[1]) - c.Assert(fields[len(fields)-2], checker.Equals, expected, check.Commentf("Expected: %v, got: %v", expected, fields[len(fields)-2])) - - dockerCmd(c, "kill", "foo") - dockerCmd(c, "wait", "foo") - out, _ = dockerCmd(c, "ps", "-l") - lines = strings.Split(strings.TrimSpace(string(out)), "\n") - fields = strings.Fields(lines[1]) - c.Assert(fields[len(fields)-2], checker.Not(checker.Equals), expected, check.Commentf("Should not got %v", expected)) -} - -func (s *DockerSuite) TestPsShowMounts(c *check.C) { - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - - mp := prefix + slash + "test" - - dockerCmd(c, "volume", "create", "ps-volume-test") - // volume mount containers - runSleepingContainer(c, "--name=volume-test-1", "--volume", "ps-volume-test:"+mp) - c.Assert(waitRun("volume-test-1"), checker.IsNil) - runSleepingContainer(c, "--name=volume-test-2", "--volume", mp) - c.Assert(waitRun("volume-test-2"), checker.IsNil) - // bind mount container - var bindMountSource string - var bindMountDestination string - if DaemonIsWindows.Condition() { - bindMountSource = "c:\\" - bindMountDestination = "c:\\t" - } else { - bindMountSource = "/tmp" - bindMountDestination = "/t" - } - runSleepingContainer(c, "--name=bind-mount-test", "-v", bindMountSource+":"+bindMountDestination) - c.Assert(waitRun("bind-mount-test"), checker.IsNil) - - out, _ := dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}") - - lines := strings.Split(strings.TrimSpace(string(out)), "\n") - c.Assert(lines, checker.HasLen, 3) - - fields := strings.Fields(lines[0]) - c.Assert(fields, checker.HasLen, 2) - c.Assert(fields[0], checker.Equals, "bind-mount-test") - c.Assert(fields[1], checker.Equals, bindMountSource) - - fields = strings.Fields(lines[1]) - c.Assert(fields, checker.HasLen, 2) - - annonymounsVolumeID := fields[1] - - fields = strings.Fields(lines[2]) - c.Assert(fields[1], checker.Equals, "ps-volume-test") - - // filter by volume name - out, _ = dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}", "--filter", "volume=ps-volume-test") - - lines = strings.Split(strings.TrimSpace(string(out)), "\n") - c.Assert(lines, checker.HasLen, 1) - - fields = strings.Fields(lines[0]) - c.Assert(fields[1], checker.Equals, "ps-volume-test") - - // empty results filtering by unknown volume - out, _ = dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}", "--filter", "volume=this-volume-should-not-exist") - c.Assert(strings.TrimSpace(string(out)), checker.HasLen, 0) - - // filter by mount destination - out, _ = dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}", "--filter", "volume="+mp) - - lines = strings.Split(strings.TrimSpace(string(out)), "\n") - c.Assert(lines, checker.HasLen, 2) - - fields = strings.Fields(lines[0]) - c.Assert(fields[1], checker.Equals, annonymounsVolumeID) - fields = strings.Fields(lines[1]) - c.Assert(fields[1], checker.Equals, "ps-volume-test") - - // filter by bind mount source - out, _ = dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}", "--filter", "volume="+bindMountSource) - - lines = strings.Split(strings.TrimSpace(string(out)), "\n") - c.Assert(lines, checker.HasLen, 1) - - fields = strings.Fields(lines[0]) - c.Assert(fields, checker.HasLen, 2) - c.Assert(fields[0], checker.Equals, "bind-mount-test") - c.Assert(fields[1], checker.Equals, bindMountSource) - - // filter by bind mount destination - out, _ = dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}", "--filter", "volume="+bindMountDestination) - - lines = strings.Split(strings.TrimSpace(string(out)), "\n") - c.Assert(lines, checker.HasLen, 1) - - fields = strings.Fields(lines[0]) - c.Assert(fields, checker.HasLen, 2) - c.Assert(fields[0], checker.Equals, "bind-mount-test") - c.Assert(fields[1], checker.Equals, bindMountSource) - - // empty results filtering by unknown mount point - out, _ = dockerCmd(c, "ps", "--format", "{{.Names}} {{.Mounts}}", "--filter", "volume="+prefix+slash+"this-path-was-never-mounted") - c.Assert(strings.TrimSpace(string(out)), checker.HasLen, 0) -} - -func (s *DockerSuite) TestPsFormatSize(c *check.C) { - testRequires(c, DaemonIsLinux) - runSleepingContainer(c) - - out, _ := dockerCmd(c, "ps", "--format", "table {{.Size}}") - lines := strings.Split(out, "\n") - c.Assert(lines[1], checker.Not(checker.Equals), "0 B", check.Commentf("Should not display a size of 0 B")) - - out, _ = dockerCmd(c, "ps", "--size", "--format", "table {{.Size}}") - lines = strings.Split(out, "\n") - c.Assert(lines[0], checker.Equals, "SIZE", check.Commentf("Should only have one size column")) - - out, _ = dockerCmd(c, "ps", "--size", "--format", "raw") - lines = strings.Split(out, "\n") - c.Assert(lines[8], checker.HasPrefix, "size:", check.Commentf("Size should be appended on a newline")) -} - -func (s *DockerSuite) TestPsListContainersFilterNetwork(c *check.C) { - // TODO default network on Windows is not called "bridge", and creating a - // custom network fails on Windows fails with "Error response from daemon: plugin not found") - testRequires(c, DaemonIsLinux) - - // create some containers - runSleepingContainer(c, "--net=bridge", "--name=onbridgenetwork") - runSleepingContainer(c, "--net=none", "--name=onnonenetwork") - - // Filter docker ps on non existing network - out, _ := dockerCmd(c, "ps", "--filter", "network=doesnotexist") - containerOut := strings.TrimSpace(string(out)) - lines := strings.Split(containerOut, "\n") - - // skip header - lines = lines[1:] - - // ps output should have no containers - c.Assert(lines, checker.HasLen, 0) - - // Filter docker ps on network bridge - out, _ = dockerCmd(c, "ps", "--filter", "network=bridge") - containerOut = strings.TrimSpace(string(out)) - - lines = strings.Split(containerOut, "\n") - - // skip header - lines = lines[1:] - - // ps output should have only one container - c.Assert(lines, checker.HasLen, 1) - - // Making sure onbridgenetwork is on the output - c.Assert(containerOut, checker.Contains, "onbridgenetwork", check.Commentf("Missing the container on network\n")) - - // Filter docker ps on networks bridge and none - out, _ = dockerCmd(c, "ps", "--filter", "network=bridge", "--filter", "network=none") - containerOut = strings.TrimSpace(string(out)) - - lines = strings.Split(containerOut, "\n") - - // skip header - lines = lines[1:] - - //ps output should have both the containers - c.Assert(lines, checker.HasLen, 2) - - // Making sure onbridgenetwork and onnonenetwork is on the output - c.Assert(containerOut, checker.Contains, "onnonenetwork", check.Commentf("Missing the container on none network\n")) - c.Assert(containerOut, checker.Contains, "onbridgenetwork", check.Commentf("Missing the container on bridge network\n")) - - nwID, _ := dockerCmd(c, "network", "inspect", "--format", "{{.ID}}", "bridge") - - // Filter by network ID - out, _ = dockerCmd(c, "ps", "--filter", "network="+nwID) - containerOut = strings.TrimSpace(string(out)) - - c.Assert(containerOut, checker.Contains, "onbridgenetwork") -} - -func (s *DockerSuite) TestPsByOrder(c *check.C) { - name1 := "xyz-abc" - out, err := runSleepingContainer(c, "--name", name1) - c.Assert(err, checker.NotNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - container1 := strings.TrimSpace(out) - - name2 := "xyz-123" - out, err = runSleepingContainer(c, "--name", name2) - c.Assert(err, checker.NotNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - container2 := strings.TrimSpace(out) - - name3 := "789-abc" - out, err = runSleepingContainer(c, "--name", name3) - c.Assert(err, checker.NotNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - name4 := "789-123" - out, err = runSleepingContainer(c, "--name", name4) - c.Assert(err, checker.NotNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - // Run multiple time should have the same result - out, err = dockerCmd(c, "ps", "--no-trunc", "-q", "-f", "name=xyz") - c.Assert(err, checker.NotNil) - c.Assert(strings.TrimSpace(out), checker.Equals, fmt.Sprintf("%s\n%s", container2, container1)) - - // Run multiple time should have the same result - out, err = dockerCmd(c, "ps", "--no-trunc", "-q", "-f", "name=xyz") - c.Assert(err, checker.NotNil) - c.Assert(strings.TrimSpace(out), checker.Equals, fmt.Sprintf("%s\n%s", container2, container1)) -} - -func (s *DockerSuite) TestPsFilterMissingArgErrorCode(c *check.C) { - _, errCode, _ := dockerCmdWithError("ps", "--filter") - c.Assert(errCode, checker.Equals, 125) -} - -// Test case for 30291 -func (s *DockerSuite) TestPsFormatTemplateWithArg(c *check.C) { - runSleepingContainer(c, "-d", "--name", "top", "--label", "some.label=label.foo-bar") - out, _ := dockerCmd(c, "ps", "--format", `{{.Names}} {{.Label "some.label"}}`) - c.Assert(strings.TrimSpace(out), checker.Equals, "top label.foo-bar") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_local_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_local_test.go deleted file mode 100644 index cb14c2c70..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_local_test.go +++ /dev/null @@ -1,492 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest" - "github.com/docker/distribution/manifest/manifestlist" - "github.com/docker/distribution/manifest/schema2" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// testPullImageWithAliases pulls a specific image tag and verifies that any aliases (i.e., other -// tags for the same image) are not also pulled down. -// -// Ref: docker/docker#8141 -func testPullImageWithAliases(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - - repos := []string{} - for _, tag := range []string{"recent", "fresh"} { - repos = append(repos, fmt.Sprintf("%v:%v", repoName, tag)) - } - - // Tag and push the same image multiple times. - for _, repo := range repos { - dockerCmd(c, "tag", "busybox", repo) - dockerCmd(c, "push", repo) - } - - // Clear local images store. - args := append([]string{"rmi"}, repos...) - dockerCmd(c, args...) - - // Pull a single tag and verify it doesn't bring down all aliases. - dockerCmd(c, "pull", repos[0]) - dockerCmd(c, "inspect", repos[0]) - for _, repo := range repos[1:] { - _, _, err := dockerCmdWithError("inspect", repo) - c.Assert(err, checker.NotNil, check.Commentf("Image %v shouldn't have been pulled down", repo)) - } -} - -func (s *DockerRegistrySuite) TestPullImageWithAliases(c *check.C) { - testPullImageWithAliases(c) -} - -func (s *DockerSchema1RegistrySuite) TestPullImageWithAliases(c *check.C) { - testPullImageWithAliases(c) -} - -// testConcurrentPullWholeRepo pulls the same repo concurrently. -func testConcurrentPullWholeRepo(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - - repos := []string{} - for _, tag := range []string{"recent", "fresh", "todays"} { - repo := fmt.Sprintf("%v:%v", repoName, tag) - _, err := buildImage(repo, fmt.Sprintf(` - FROM busybox - ENTRYPOINT ["/bin/echo"] - ENV FOO foo - ENV BAR bar - CMD echo %s - `, repo), true) - c.Assert(err, checker.IsNil) - dockerCmd(c, "push", repo) - repos = append(repos, repo) - } - - // Clear local images store. - args := append([]string{"rmi"}, repos...) - dockerCmd(c, args...) - - // Run multiple re-pulls concurrently - results := make(chan error) - numPulls := 3 - - for i := 0; i != numPulls; i++ { - go func() { - _, _, err := runCommandWithOutput(exec.Command(dockerBinary, "pull", "-a", repoName)) - results <- err - }() - } - - // These checks are separate from the loop above because the check - // package is not goroutine-safe. - for i := 0; i != numPulls; i++ { - err := <-results - c.Assert(err, checker.IsNil, check.Commentf("concurrent pull failed with error: %v", err)) - } - - // Ensure all tags were pulled successfully - for _, repo := range repos { - dockerCmd(c, "inspect", repo) - out, _ := dockerCmd(c, "run", "--rm", repo) - c.Assert(strings.TrimSpace(out), checker.Equals, "/bin/sh -c echo "+repo) - } -} - -func (s *DockerRegistrySuite) testConcurrentPullWholeRepo(c *check.C) { - testConcurrentPullWholeRepo(c) -} - -func (s *DockerSchema1RegistrySuite) testConcurrentPullWholeRepo(c *check.C) { - testConcurrentPullWholeRepo(c) -} - -// testConcurrentFailingPull tries a concurrent pull that doesn't succeed. -func testConcurrentFailingPull(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - - // Run multiple pulls concurrently - results := make(chan error) - numPulls := 3 - - for i := 0; i != numPulls; i++ { - go func() { - _, _, err := runCommandWithOutput(exec.Command(dockerBinary, "pull", repoName+":asdfasdf")) - results <- err - }() - } - - // These checks are separate from the loop above because the check - // package is not goroutine-safe. - for i := 0; i != numPulls; i++ { - err := <-results - c.Assert(err, checker.NotNil, check.Commentf("expected pull to fail")) - } -} - -func (s *DockerRegistrySuite) testConcurrentFailingPull(c *check.C) { - testConcurrentFailingPull(c) -} - -func (s *DockerSchema1RegistrySuite) testConcurrentFailingPull(c *check.C) { - testConcurrentFailingPull(c) -} - -// testConcurrentPullMultipleTags pulls multiple tags from the same repo -// concurrently. -func testConcurrentPullMultipleTags(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - - repos := []string{} - for _, tag := range []string{"recent", "fresh", "todays"} { - repo := fmt.Sprintf("%v:%v", repoName, tag) - _, err := buildImage(repo, fmt.Sprintf(` - FROM busybox - ENTRYPOINT ["/bin/echo"] - ENV FOO foo - ENV BAR bar - CMD echo %s - `, repo), true) - c.Assert(err, checker.IsNil) - dockerCmd(c, "push", repo) - repos = append(repos, repo) - } - - // Clear local images store. - args := append([]string{"rmi"}, repos...) - dockerCmd(c, args...) - - // Re-pull individual tags, in parallel - results := make(chan error) - - for _, repo := range repos { - go func(repo string) { - _, _, err := runCommandWithOutput(exec.Command(dockerBinary, "pull", repo)) - results <- err - }(repo) - } - - // These checks are separate from the loop above because the check - // package is not goroutine-safe. - for range repos { - err := <-results - c.Assert(err, checker.IsNil, check.Commentf("concurrent pull failed with error: %v", err)) - } - - // Ensure all tags were pulled successfully - for _, repo := range repos { - dockerCmd(c, "inspect", repo) - out, _ := dockerCmd(c, "run", "--rm", repo) - c.Assert(strings.TrimSpace(out), checker.Equals, "/bin/sh -c echo "+repo) - } -} - -func (s *DockerRegistrySuite) TestConcurrentPullMultipleTags(c *check.C) { - testConcurrentPullMultipleTags(c) -} - -func (s *DockerSchema1RegistrySuite) TestConcurrentPullMultipleTags(c *check.C) { - testConcurrentPullMultipleTags(c) -} - -// testPullIDStability verifies that pushing an image and pulling it back -// preserves the image ID. -func testPullIDStability(c *check.C) { - derivedImage := privateRegistryURL + "/dockercli/id-stability" - baseImage := "busybox" - - _, err := buildImage(derivedImage, fmt.Sprintf(` - FROM %s - ENV derived true - ENV asdf true - RUN dd if=/dev/zero of=/file bs=1024 count=1024 - CMD echo %s - `, baseImage, derivedImage), true) - if err != nil { - c.Fatal(err) - } - - originalID, err := getIDByName(derivedImage) - if err != nil { - c.Fatalf("error inspecting: %v", err) - } - dockerCmd(c, "push", derivedImage) - - // Pull - out, _ := dockerCmd(c, "pull", derivedImage) - if strings.Contains(out, "Pull complete") { - c.Fatalf("repull redownloaded a layer: %s", out) - } - - derivedIDAfterPull, err := getIDByName(derivedImage) - if err != nil { - c.Fatalf("error inspecting: %v", err) - } - - if derivedIDAfterPull != originalID { - c.Fatal("image's ID unexpectedly changed after a repush/repull") - } - - // Make sure the image runs correctly - out, _ = dockerCmd(c, "run", "--rm", derivedImage) - if strings.TrimSpace(out) != derivedImage { - c.Fatalf("expected %s; got %s", derivedImage, out) - } - - // Confirm that repushing and repulling does not change the computed ID - dockerCmd(c, "push", derivedImage) - dockerCmd(c, "rmi", derivedImage) - dockerCmd(c, "pull", derivedImage) - - derivedIDAfterPull, err = getIDByName(derivedImage) - if err != nil { - c.Fatalf("error inspecting: %v", err) - } - - if derivedIDAfterPull != originalID { - c.Fatal("image's ID unexpectedly changed after a repush/repull") - } - if err != nil { - c.Fatalf("error inspecting: %v", err) - } - - // Make sure the image still runs - out, _ = dockerCmd(c, "run", "--rm", derivedImage) - if strings.TrimSpace(out) != derivedImage { - c.Fatalf("expected %s; got %s", derivedImage, out) - } -} - -func (s *DockerRegistrySuite) TestPullIDStability(c *check.C) { - testPullIDStability(c) -} - -func (s *DockerSchema1RegistrySuite) TestPullIDStability(c *check.C) { - testPullIDStability(c) -} - -// #21213 -func testPullNoLayers(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/scratch", privateRegistryURL) - - _, err := buildImage(repoName, ` - FROM scratch - ENV foo bar`, - true) - if err != nil { - c.Fatal(err) - } - - dockerCmd(c, "push", repoName) - dockerCmd(c, "rmi", repoName) - dockerCmd(c, "pull", repoName) -} - -func (s *DockerRegistrySuite) TestPullNoLayers(c *check.C) { - testPullNoLayers(c) -} - -func (s *DockerSchema1RegistrySuite) TestPullNoLayers(c *check.C) { - testPullNoLayers(c) -} - -func (s *DockerRegistrySuite) TestPullManifestList(c *check.C) { - testRequires(c, NotArm) - pushDigest, err := setupImage(c) - c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) - - // Inject a manifest list into the registry - manifestList := &manifestlist.ManifestList{ - Versioned: manifest.Versioned{ - SchemaVersion: 2, - MediaType: manifestlist.MediaTypeManifestList, - }, - Manifests: []manifestlist.ManifestDescriptor{ - { - Descriptor: distribution.Descriptor{ - Digest: "sha256:1a9ec845ee94c202b2d5da74a24f0ed2058318bfa9879fa541efaecba272e86b", - Size: 3253, - MediaType: schema2.MediaTypeManifest, - }, - Platform: manifestlist.PlatformSpec{ - Architecture: "bogus_arch", - OS: "bogus_os", - }, - }, - { - Descriptor: distribution.Descriptor{ - Digest: pushDigest, - Size: 3253, - MediaType: schema2.MediaTypeManifest, - }, - Platform: manifestlist.PlatformSpec{ - Architecture: runtime.GOARCH, - OS: runtime.GOOS, - }, - }, - }, - } - - manifestListJSON, err := json.MarshalIndent(manifestList, "", " ") - c.Assert(err, checker.IsNil, check.Commentf("error marshalling manifest list")) - - manifestListDigest := digest.FromBytes(manifestListJSON) - hexDigest := manifestListDigest.Hex() - - registryV2Path := filepath.Join(s.reg.dir, "docker", "registry", "v2") - - // Write manifest list to blob store - blobDir := filepath.Join(registryV2Path, "blobs", "sha256", hexDigest[:2], hexDigest) - err = os.MkdirAll(blobDir, 0755) - c.Assert(err, checker.IsNil, check.Commentf("error creating blob dir")) - blobPath := filepath.Join(blobDir, "data") - err = ioutil.WriteFile(blobPath, []byte(manifestListJSON), 0644) - c.Assert(err, checker.IsNil, check.Commentf("error writing manifest list")) - - // Add to revision store - revisionDir := filepath.Join(registryV2Path, "repositories", remoteRepoName, "_manifests", "revisions", "sha256", hexDigest) - err = os.Mkdir(revisionDir, 0755) - c.Assert(err, checker.IsNil, check.Commentf("error creating revision dir")) - revisionPath := filepath.Join(revisionDir, "link") - err = ioutil.WriteFile(revisionPath, []byte(manifestListDigest.String()), 0644) - c.Assert(err, checker.IsNil, check.Commentf("error writing revision link")) - - // Update tag - tagPath := filepath.Join(registryV2Path, "repositories", remoteRepoName, "_manifests", "tags", "latest", "current", "link") - err = ioutil.WriteFile(tagPath, []byte(manifestListDigest.String()), 0644) - c.Assert(err, checker.IsNil, check.Commentf("error writing tag link")) - - // Verify that the image can be pulled through the manifest list. - out, _ := dockerCmd(c, "pull", repoName) - - // The pull output includes "Digest: ", so find that - matches := digestRegex.FindStringSubmatch(out) - c.Assert(matches, checker.HasLen, 2, check.Commentf("unable to parse digest from pull output: %s", out)) - pullDigest := matches[1] - - // Make sure the pushed and pull digests match - c.Assert(manifestListDigest.String(), checker.Equals, pullDigest) - - // Was the image actually created? - dockerCmd(c, "inspect", repoName) - - dockerCmd(c, "rmi", repoName) -} - -// #23100 -func (s *DockerRegistryAuthHtpasswdSuite) TestPullWithExternalAuthLoginWithScheme(c *check.C) { - osPath := os.Getenv("PATH") - defer os.Setenv("PATH", osPath) - - workingDir, err := os.Getwd() - c.Assert(err, checker.IsNil) - absolute, err := filepath.Abs(filepath.Join(workingDir, "fixtures", "auth")) - c.Assert(err, checker.IsNil) - testPath := fmt.Sprintf("%s%c%s", osPath, filepath.ListSeparator, absolute) - - os.Setenv("PATH", testPath) - - repoName := fmt.Sprintf("%v/dockercli/busybox:authtest", privateRegistryURL) - - tmp, err := ioutil.TempDir("", "integration-cli-") - c.Assert(err, checker.IsNil) - - externalAuthConfig := `{ "credsStore": "shell-test" }` - - configPath := filepath.Join(tmp, "config.json") - err = ioutil.WriteFile(configPath, []byte(externalAuthConfig), 0644) - c.Assert(err, checker.IsNil) - - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) - - b, err := ioutil.ReadFile(configPath) - c.Assert(err, checker.IsNil) - c.Assert(string(b), checker.Not(checker.Contains), "\"auth\":") - - dockerCmd(c, "--config", tmp, "tag", "busybox", repoName) - dockerCmd(c, "--config", tmp, "push", repoName) - - dockerCmd(c, "--config", tmp, "logout", privateRegistryURL) - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, "https://"+privateRegistryURL) - dockerCmd(c, "--config", tmp, "pull", repoName) - - // likewise push should work - repoName2 := fmt.Sprintf("%v/dockercli/busybox:nocreds", privateRegistryURL) - dockerCmd(c, "tag", repoName, repoName2) - dockerCmd(c, "--config", tmp, "push", repoName2) - - // logout should work w scheme also because it will be stripped - dockerCmd(c, "--config", tmp, "logout", "https://"+privateRegistryURL) -} - -func (s *DockerRegistryAuthHtpasswdSuite) TestPullWithExternalAuth(c *check.C) { - osPath := os.Getenv("PATH") - defer os.Setenv("PATH", osPath) - - workingDir, err := os.Getwd() - c.Assert(err, checker.IsNil) - absolute, err := filepath.Abs(filepath.Join(workingDir, "fixtures", "auth")) - c.Assert(err, checker.IsNil) - testPath := fmt.Sprintf("%s%c%s", osPath, filepath.ListSeparator, absolute) - - os.Setenv("PATH", testPath) - - repoName := fmt.Sprintf("%v/dockercli/busybox:authtest", privateRegistryURL) - - tmp, err := ioutil.TempDir("", "integration-cli-") - c.Assert(err, checker.IsNil) - - externalAuthConfig := `{ "credsStore": "shell-test" }` - - configPath := filepath.Join(tmp, "config.json") - err = ioutil.WriteFile(configPath, []byte(externalAuthConfig), 0644) - c.Assert(err, checker.IsNil) - - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) - - b, err := ioutil.ReadFile(configPath) - c.Assert(err, checker.IsNil) - c.Assert(string(b), checker.Not(checker.Contains), "\"auth\":") - - dockerCmd(c, "--config", tmp, "tag", "busybox", repoName) - dockerCmd(c, "--config", tmp, "push", repoName) - - dockerCmd(c, "--config", tmp, "pull", repoName) -} - -// TestRunImplicitPullWithNoTag should pull implicitly only the default tag (latest) -func (s *DockerRegistrySuite) TestRunImplicitPullWithNoTag(c *check.C) { - testRequires(c, DaemonIsLinux) - repo := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - repoTag1 := fmt.Sprintf("%v:latest", repo) - repoTag2 := fmt.Sprintf("%v:t1", repo) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoTag1) - dockerCmd(c, "tag", "busybox", repoTag2) - dockerCmd(c, "push", repo) - dockerCmd(c, "rmi", repoTag1) - dockerCmd(c, "rmi", repoTag2) - - out, _, err := dockerCmdWithError("run", repo) - c.Assert(err, check.IsNil) - c.Assert(out, checker.Contains, fmt.Sprintf("Unable to find image '%s:latest' locally", repo)) - - // There should be only one line for repo, the one with repo:latest - outImageCmd, _, err := dockerCmdWithError("images", repo) - splitOutImageCmd := strings.Split(strings.TrimSpace(outImageCmd), "\n") - c.Assert(splitOutImageCmd, checker.HasLen, 2) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_test.go deleted file mode 100644 index a0118a8e9..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_test.go +++ /dev/null @@ -1,274 +0,0 @@ -package main - -import ( - "fmt" - "regexp" - "strings" - "sync" - "time" - - "github.com/docker/distribution/digest" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// TestPullFromCentralRegistry pulls an image from the central registry and verifies that the client -// prints all expected output. -func (s *DockerHubPullSuite) TestPullFromCentralRegistry(c *check.C) { - testRequires(c, DaemonIsLinux) - out := s.Cmd(c, "pull", "hello-world") - defer deleteImages("hello-world") - - c.Assert(out, checker.Contains, "Using default tag: latest", check.Commentf("expected the 'latest' tag to be automatically assumed")) - c.Assert(out, checker.Contains, "Pulling from library/hello-world", check.Commentf("expected the 'library/' prefix to be automatically assumed")) - c.Assert(out, checker.Contains, "Downloaded newer image for hello-world:latest") - - matches := regexp.MustCompile(`Digest: (.+)\n`).FindAllStringSubmatch(out, -1) - c.Assert(len(matches), checker.Equals, 1, check.Commentf("expected exactly one image digest in the output")) - c.Assert(len(matches[0]), checker.Equals, 2, check.Commentf("unexpected number of submatches for the digest")) - _, err := digest.ParseDigest(matches[0][1]) - c.Check(err, checker.IsNil, check.Commentf("invalid digest %q in output", matches[0][1])) - - // We should have a single entry in images. - img := strings.TrimSpace(s.Cmd(c, "images")) - splitImg := strings.Split(img, "\n") - c.Assert(splitImg, checker.HasLen, 2) - c.Assert(splitImg[1], checker.Matches, `hello-world\s+latest.*?`, check.Commentf("invalid output for `docker images` (expected image and tag name")) -} - -// TestPullNonExistingImage pulls non-existing images from the central registry, with different -// combinations of implicit tag and library prefix. -func (s *DockerHubPullSuite) TestPullNonExistingImage(c *check.C) { - testRequires(c, DaemonIsLinux) - - type entry struct { - repo string - alias string - tag string - } - - entries := []entry{ - {"asdfasdf", "asdfasdf", "foobar"}, - {"asdfasdf", "library/asdfasdf", "foobar"}, - {"asdfasdf", "asdfasdf", ""}, - {"asdfasdf", "asdfasdf", "latest"}, - {"asdfasdf", "library/asdfasdf", ""}, - {"asdfasdf", "library/asdfasdf", "latest"}, - } - - // The option field indicates "-a" or not. - type record struct { - e entry - option string - out string - err error - } - - // Execute 'docker pull' in parallel, pass results (out, err) and - // necessary information ("-a" or not, and the image name) to channel. - var group sync.WaitGroup - recordChan := make(chan record, len(entries)*2) - for _, e := range entries { - group.Add(1) - go func(e entry) { - defer group.Done() - repoName := e.alias - if e.tag != "" { - repoName += ":" + e.tag - } - out, err := s.CmdWithError("pull", repoName) - recordChan <- record{e, "", out, err} - }(e) - if e.tag == "" { - // pull -a on a nonexistent registry should fall back as well - group.Add(1) - go func(e entry) { - defer group.Done() - out, err := s.CmdWithError("pull", "-a", e.alias) - recordChan <- record{e, "-a", out, err} - }(e) - } - } - - // Wait for completion - group.Wait() - close(recordChan) - - // Process the results (out, err). - for record := range recordChan { - if len(record.option) == 0 { - c.Assert(record.err, checker.NotNil, check.Commentf("expected non-zero exit status when pulling non-existing image: %s", record.out)) - c.Assert(record.out, checker.Contains, fmt.Sprintf("repository %s not found: does not exist or no pull access", record.e.repo), check.Commentf("expected image not found error messages")) - } else { - // pull -a on a nonexistent registry should fall back as well - c.Assert(record.err, checker.NotNil, check.Commentf("expected non-zero exit status when pulling non-existing image: %s", record.out)) - c.Assert(record.out, checker.Contains, fmt.Sprintf("repository %s not found", record.e.repo), check.Commentf("expected image not found error messages")) - c.Assert(record.out, checker.Not(checker.Contains), "unauthorized", check.Commentf(`message should not contain "unauthorized"`)) - } - } - -} - -// TestPullFromCentralRegistryImplicitRefParts pulls an image from the central registry and verifies -// that pulling the same image with different combinations of implicit elements of the the image -// reference (tag, repository, central registry url, ...) doesn't trigger a new pull nor leads to -// multiple images. -func (s *DockerHubPullSuite) TestPullFromCentralRegistryImplicitRefParts(c *check.C) { - testRequires(c, DaemonIsLinux) - - // Pull hello-world from v2 - pullFromV2 := func(ref string) (int, string) { - out := s.Cmd(c, "pull", "hello-world") - v1Retries := 0 - for strings.Contains(out, "this image was pulled from a legacy registry") { - // Some network errors may cause fallbacks to the v1 - // protocol, which would violate the test's assumption - // that it will get the same images. To make the test - // more robust against these network glitches, allow a - // few retries if we end up with a v1 pull. - - if v1Retries > 2 { - c.Fatalf("too many v1 fallback incidents when pulling %s", ref) - } - - s.Cmd(c, "rmi", ref) - out = s.Cmd(c, "pull", ref) - - v1Retries++ - } - - return v1Retries, out - } - - pullFromV2("hello-world") - defer deleteImages("hello-world") - - s.Cmd(c, "tag", "hello-world", "hello-world-backup") - - for _, ref := range []string{ - "hello-world", - "hello-world:latest", - "library/hello-world", - "library/hello-world:latest", - "docker.io/library/hello-world", - "index.docker.io/library/hello-world", - } { - var out string - for { - var v1Retries int - v1Retries, out = pullFromV2(ref) - - // Keep repeating the test case until we don't hit a v1 - // fallback case. We won't get the right "Image is up - // to date" message if the local image was replaced - // with one pulled from v1. - if v1Retries == 0 { - break - } - s.Cmd(c, "rmi", ref) - s.Cmd(c, "tag", "hello-world-backup", "hello-world") - } - c.Assert(out, checker.Contains, "Image is up to date for hello-world:latest") - } - - s.Cmd(c, "rmi", "hello-world-backup") - - // We should have a single entry in images. - img := strings.TrimSpace(s.Cmd(c, "images")) - splitImg := strings.Split(img, "\n") - c.Assert(splitImg, checker.HasLen, 2) - c.Assert(splitImg[1], checker.Matches, `hello-world\s+latest.*?`, check.Commentf("invalid output for `docker images` (expected image and tag name")) -} - -// TestPullScratchNotAllowed verifies that pulling 'scratch' is rejected. -func (s *DockerHubPullSuite) TestPullScratchNotAllowed(c *check.C) { - testRequires(c, DaemonIsLinux) - out, err := s.CmdWithError("pull", "scratch") - c.Assert(err, checker.NotNil, check.Commentf("expected pull of scratch to fail")) - c.Assert(out, checker.Contains, "'scratch' is a reserved name") - c.Assert(out, checker.Not(checker.Contains), "Pulling repository scratch") -} - -// TestPullAllTagsFromCentralRegistry pulls using `all-tags` for a given image and verifies that it -// results in more images than a naked pull. -func (s *DockerHubPullSuite) TestPullAllTagsFromCentralRegistry(c *check.C) { - testRequires(c, DaemonIsLinux) - s.Cmd(c, "pull", "busybox") - outImageCmd := s.Cmd(c, "images", "busybox") - splitOutImageCmd := strings.Split(strings.TrimSpace(outImageCmd), "\n") - c.Assert(splitOutImageCmd, checker.HasLen, 2) - - s.Cmd(c, "pull", "--all-tags=true", "busybox") - outImageAllTagCmd := s.Cmd(c, "images", "busybox") - linesCount := strings.Count(outImageAllTagCmd, "\n") - c.Assert(linesCount, checker.GreaterThan, 2, check.Commentf("pulling all tags should provide more than two images, got %s", outImageAllTagCmd)) - - // Verify that the line for 'busybox:latest' is left unchanged. - var latestLine string - for _, line := range strings.Split(outImageAllTagCmd, "\n") { - if strings.HasPrefix(line, "busybox") && strings.Contains(line, "latest") { - latestLine = line - break - } - } - c.Assert(latestLine, checker.Not(checker.Equals), "", check.Commentf("no entry for busybox:latest found after pulling all tags")) - splitLatest := strings.Fields(latestLine) - splitCurrent := strings.Fields(splitOutImageCmd[1]) - - // Clear relative creation times, since these can easily change between - // two invocations of "docker images". Without this, the test can fail - // like this: - // ... obtained []string = []string{"busybox", "latest", "d9551b4026f0", "27", "minutes", "ago", "1.113", "MB"} - // ... expected []string = []string{"busybox", "latest", "d9551b4026f0", "26", "minutes", "ago", "1.113", "MB"} - splitLatest[3] = "" - splitLatest[4] = "" - splitLatest[5] = "" - splitCurrent[3] = "" - splitCurrent[4] = "" - splitCurrent[5] = "" - - c.Assert(splitLatest, checker.DeepEquals, splitCurrent, check.Commentf("busybox:latest was changed after pulling all tags")) -} - -// TestPullClientDisconnect kills the client during a pull operation and verifies that the operation -// gets cancelled. -// -// Ref: docker/docker#15589 -func (s *DockerHubPullSuite) TestPullClientDisconnect(c *check.C) { - testRequires(c, DaemonIsLinux) - repoName := "hello-world:latest" - - pullCmd := s.MakeCmd("pull", repoName) - stdout, err := pullCmd.StdoutPipe() - c.Assert(err, checker.IsNil) - err = pullCmd.Start() - c.Assert(err, checker.IsNil) - - // Cancel as soon as we get some output. - buf := make([]byte, 10) - _, err = stdout.Read(buf) - c.Assert(err, checker.IsNil) - - err = pullCmd.Process.Kill() - c.Assert(err, checker.IsNil) - - time.Sleep(2 * time.Second) - _, err = s.CmdWithError("inspect", repoName) - c.Assert(err, checker.NotNil, check.Commentf("image was pulled after client disconnected")) -} - -func (s *DockerRegistryAuthHtpasswdSuite) TestPullNoCredentialsNotFound(c *check.C) { - // we don't care about the actual image, we just want to see image not found - // because that means v2 call returned 401 and we fell back to v1 which usually - // gives a 404 (in this case the test registry doesn't handle v1 at all) - out, _, err := dockerCmdWithError("pull", privateRegistryURL+"/busybox") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Error: image busybox:latest not found") -} - -// Regression test for https://github.com/docker/docker/issues/26429 -func (s *DockerSuite) TestPullLinuxImageFailsOnWindows(c *check.C) { - testRequires(c, DaemonIsWindows, Network) - _, _, err := dockerCmdWithError("pull", "ubuntu") - c.Assert(err.Error(), checker.Contains, "cannot be used on this platform") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_trusted_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_trusted_test.go deleted file mode 100644 index 96a42d675..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_trusted_test.go +++ /dev/null @@ -1,365 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "os/exec" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerTrustSuite) TestTrustedPull(c *check.C) { - repoName := s.setupTrustedImage(c, "trusted-pull") - - // Try pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf(out)) - - dockerCmd(c, "rmi", repoName) - // Try untrusted pull to ensure we pushed the tag to the registry - pullCmd = exec.Command(dockerBinary, "pull", "--disable-content-trust=true", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Downloaded", check.Commentf(out)) - -} - -func (s *DockerTrustSuite) TestTrustedIsolatedPull(c *check.C) { - repoName := s.setupTrustedImage(c, "trusted-isolated-pull") - - // Try pull (run from isolated directory without trust information) - pullCmd := exec.Command(dockerBinary, "--config", "/tmp/docker-isolated", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf(string(out))) - - dockerCmd(c, "rmi", repoName) -} - -func (s *DockerTrustSuite) TestUntrustedPull(c *check.C) { - repoName := fmt.Sprintf("%v/dockercliuntrusted/pulltest:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - dockerCmd(c, "push", repoName) - dockerCmd(c, "rmi", repoName) - - // Try trusted pull on untrusted tag - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Error: remote trust data does not exist", check.Commentf(out)) -} - -func (s *DockerTrustSuite) TestPullWhenCertExpired(c *check.C) { - c.Skip("Currently changes system time, causing instability") - repoName := s.setupTrustedImage(c, "trusted-cert-expired") - - // Certificates have 10 years of expiration - elevenYearsFromNow := time.Now().Add(time.Hour * 24 * 365 * 11) - - runAtDifferentDate(elevenYearsFromNow, func() { - // Try pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "could not validate the path to a trusted root", check.Commentf(out)) - }) - - runAtDifferentDate(elevenYearsFromNow, func() { - // Try pull - pullCmd := exec.Command(dockerBinary, "pull", "--disable-content-trust", repoName) - s.trustedCmd(pullCmd) - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Downloaded", check.Commentf(out)) - }) -} - -func (s *DockerTrustSuite) TestTrustedPullFromBadTrustServer(c *check.C) { - repoName := fmt.Sprintf("%v/dockerclievilpull/trusted:latest", privateRegistryURL) - evilLocalConfigDir, err := ioutil.TempDir("", "evil-local-config-dir") - if err != nil { - c.Fatalf("Failed to create local temp dir") - } - - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Signing and pushing trust metadata", check.Commentf(out)) - dockerCmd(c, "rmi", repoName) - - // Try pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf(out)) - dockerCmd(c, "rmi", repoName) - - // Kill the notary server, start a new "evil" one. - s.not.Close() - s.not, err = newTestNotary(c) - - c.Assert(err, check.IsNil, check.Commentf("Restarting notary server failed.")) - - // In order to make an evil server, lets re-init a client (with a different trust dir) and push new data. - // tag an image and upload it to the private registry - dockerCmd(c, "--config", evilLocalConfigDir, "tag", "busybox", repoName) - - // Push up to the new server - pushCmd = exec.Command(dockerBinary, "--config", evilLocalConfigDir, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Signing and pushing trust metadata", check.Commentf(out)) - - // Now, try pulling with the original client from this new trust server. This should fail because the new root is invalid. - pullCmd = exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - if err == nil { - c.Fatalf("Continuing with cached data even though it's an invalid root rotation: %s\n%s", err, out) - } - if !strings.Contains(out, "could not rotate trust to a new trusted root") { - c.Fatalf("Missing expected output on trusted pull:\n%s", out) - } -} - -func (s *DockerTrustSuite) TestTrustedPullWithExpiredSnapshot(c *check.C) { - c.Skip("Currently changes system time, causing instability") - repoName := fmt.Sprintf("%v/dockercliexpiredtimestamppull/trusted:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - // Push with default passphrases - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Signing and pushing trust metadata", check.Commentf(out)) - - dockerCmd(c, "rmi", repoName) - - // Snapshots last for three years. This should be expired - fourYearsLater := time.Now().Add(time.Hour * 24 * 365 * 4) - - runAtDifferentDate(fourYearsLater, func() { - // Try pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - - c.Assert(err, check.NotNil, check.Commentf("Missing expected error running trusted pull with expired snapshots")) - c.Assert(string(out), checker.Contains, "repository out-of-date", check.Commentf(out)) - }) -} - -func (s *DockerTrustSuite) TestTrustedOfflinePull(c *check.C) { - repoName := s.setupTrustedImage(c, "trusted-offline-pull") - - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmdWithServer(pullCmd, "https://invalidnotaryserver") - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "error contacting notary server", check.Commentf(out)) - // Do valid trusted pull to warm cache - pullCmd = exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf(out)) - - dockerCmd(c, "rmi", repoName) - - // Try pull again with invalid notary server, should use cache - pullCmd = exec.Command(dockerBinary, "pull", repoName) - s.trustedCmdWithServer(pullCmd, "https://invalidnotaryserver") - out, _, err = runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf(out)) -} - -func (s *DockerTrustSuite) TestTrustedPullDelete(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/%s:latest", privateRegistryURL, "trusted-pull-delete") - // tag the image and upload it to the private registry - _, err := buildImage(repoName, ` - FROM busybox - CMD echo trustedpulldelete - `, true) - - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - if err != nil { - c.Fatalf("Error running trusted push: %s\n%s", err, out) - } - if !strings.Contains(string(out), "Signing and pushing trust metadata") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } - - if out, status := dockerCmd(c, "rmi", repoName); status != 0 { - c.Fatalf("Error removing image %q\n%s", repoName, out) - } - - // Try pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - - matches := digestRegex.FindStringSubmatch(out) - c.Assert(matches, checker.HasLen, 2, check.Commentf("unable to parse digest from pull output: %s", out)) - pullDigest := matches[1] - - imageID := inspectField(c, repoName, "Id") - - imageByDigest := repoName + "@" + pullDigest - byDigestID := inspectField(c, imageByDigest, "Id") - - c.Assert(byDigestID, checker.Equals, imageID) - - // rmi of tag should also remove the digest reference - dockerCmd(c, "rmi", repoName) - - _, err = inspectFieldWithError(imageByDigest, "Id") - c.Assert(err, checker.NotNil, check.Commentf("digest reference should have been removed")) - - _, err = inspectFieldWithError(imageID, "Id") - c.Assert(err, checker.NotNil, check.Commentf("image should have been deleted")) -} - -func (s *DockerTrustSuite) TestTrustedPullReadsFromReleasesRole(c *check.C) { - testRequires(c, NotaryHosting) - repoName := fmt.Sprintf("%v/dockerclireleasesdelegationpulling/trusted", privateRegistryURL) - targetName := fmt.Sprintf("%s:latest", repoName) - - // Push with targets first, initializing the repo - dockerCmd(c, "tag", "busybox", targetName) - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - s.assertTargetInRoles(c, repoName, "latest", "targets") - - // Try pull, check we retrieve from targets role - pullCmd := exec.Command(dockerBinary, "-D", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "retrieving target for targets role") - - // Now we'll create the releases role, and try pushing and pulling - s.notaryCreateDelegation(c, repoName, "targets/releases", s.not.keys[0].Public) - s.notaryImportKey(c, repoName, "targets/releases", s.not.keys[0].Private) - s.notaryPublish(c, repoName) - - // try a pull, check that we can still pull because we can still read the - // old tag in the targets role - pullCmd = exec.Command(dockerBinary, "-D", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "retrieving target for targets role") - - // try a pull -a, check that it succeeds because we can still pull from the - // targets role - pullCmd = exec.Command(dockerBinary, "-D", "pull", "-a", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - - // Push, should sign with targets/releases - dockerCmd(c, "tag", "busybox", targetName) - pushCmd = exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - s.assertTargetInRoles(c, repoName, "latest", "targets", "targets/releases") - - // Try pull, check we retrieve from targets/releases role - pullCmd = exec.Command(dockerBinary, "-D", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(out, checker.Contains, "retrieving target for targets/releases role") - - // Create another delegation that we'll sign with - s.notaryCreateDelegation(c, repoName, "targets/other", s.not.keys[1].Public) - s.notaryImportKey(c, repoName, "targets/other", s.not.keys[1].Private) - s.notaryPublish(c, repoName) - - dockerCmd(c, "tag", "busybox", targetName) - pushCmd = exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - s.assertTargetInRoles(c, repoName, "latest", "targets", "targets/releases", "targets/other") - - // Try pull, check we retrieve from targets/releases role - pullCmd = exec.Command(dockerBinary, "-D", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(out, checker.Contains, "retrieving target for targets/releases role") -} - -func (s *DockerTrustSuite) TestTrustedPullIgnoresOtherDelegationRoles(c *check.C) { - testRequires(c, NotaryHosting) - repoName := fmt.Sprintf("%v/dockerclipullotherdelegation/trusted", privateRegistryURL) - targetName := fmt.Sprintf("%s:latest", repoName) - - // We'll create a repo first with a non-release delegation role, so that when we - // push we'll sign it into the delegation role - s.notaryInitRepo(c, repoName) - s.notaryCreateDelegation(c, repoName, "targets/other", s.not.keys[0].Public) - s.notaryImportKey(c, repoName, "targets/other", s.not.keys[0].Private) - s.notaryPublish(c, repoName) - - // Push should write to the delegation role, not targets - dockerCmd(c, "tag", "busybox", targetName) - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - s.assertTargetInRoles(c, repoName, "latest", "targets/other") - s.assertTargetNotInRoles(c, repoName, "latest", "targets") - - // Try pull - we should fail, since pull will only pull from the targets/releases - // role or the targets role - pullCmd := exec.Command(dockerBinary, "-D", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "No trust data for") - - // try a pull -a: we should fail since pull will only pull from the targets/releases - // role or the targets role - pullCmd = exec.Command(dockerBinary, "-D", "pull", "-a", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "No trusted tags for") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_push_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_push_test.go deleted file mode 100644 index f750c1267..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_push_test.go +++ /dev/null @@ -1,715 +0,0 @@ -package main - -import ( - "archive/tar" - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "os/exec" - "path/filepath" - "strings" - "sync" - "time" - - "github.com/docker/distribution/reference" - "github.com/docker/docker/cliconfig" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// Pushing an image to a private registry. -func testPushBusyboxImage(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - // tag the image to upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - // push the image to the registry - dockerCmd(c, "push", repoName) -} - -func (s *DockerRegistrySuite) TestPushBusyboxImage(c *check.C) { - testPushBusyboxImage(c) -} - -func (s *DockerSchema1RegistrySuite) TestPushBusyboxImage(c *check.C) { - testPushBusyboxImage(c) -} - -// pushing an image without a prefix should throw an error -func (s *DockerSuite) TestPushUnprefixedRepo(c *check.C) { - out, _, err := dockerCmdWithError("push", "busybox") - c.Assert(err, check.NotNil, check.Commentf("pushing an unprefixed repo didn't result in a non-zero exit status: %s", out)) -} - -func testPushUntagged(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - expected := "An image does not exist locally with the tag" - - out, _, err := dockerCmdWithError("push", repoName) - c.Assert(err, check.NotNil, check.Commentf("pushing the image to the private registry should have failed: output %q", out)) - c.Assert(out, checker.Contains, expected, check.Commentf("pushing the image failed")) -} - -func (s *DockerRegistrySuite) TestPushUntagged(c *check.C) { - testPushUntagged(c) -} - -func (s *DockerSchema1RegistrySuite) TestPushUntagged(c *check.C) { - testPushUntagged(c) -} - -func testPushBadTag(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/busybox:latest", privateRegistryURL) - expected := "does not exist" - - out, _, err := dockerCmdWithError("push", repoName) - c.Assert(err, check.NotNil, check.Commentf("pushing the image to the private registry should have failed: output %q", out)) - c.Assert(out, checker.Contains, expected, check.Commentf("pushing the image failed")) -} - -func (s *DockerRegistrySuite) TestPushBadTag(c *check.C) { - testPushBadTag(c) -} - -func (s *DockerSchema1RegistrySuite) TestPushBadTag(c *check.C) { - testPushBadTag(c) -} - -func testPushMultipleTags(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - repoTag1 := fmt.Sprintf("%v/dockercli/busybox:t1", privateRegistryURL) - repoTag2 := fmt.Sprintf("%v/dockercli/busybox:t2", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoTag1) - - dockerCmd(c, "tag", "busybox", repoTag2) - - dockerCmd(c, "push", repoName) - - // Ensure layer list is equivalent for repoTag1 and repoTag2 - out1, _ := dockerCmd(c, "pull", repoTag1) - - imageAlreadyExists := ": Image already exists" - var out1Lines []string - for _, outputLine := range strings.Split(out1, "\n") { - if strings.Contains(outputLine, imageAlreadyExists) { - out1Lines = append(out1Lines, outputLine) - } - } - - out2, _ := dockerCmd(c, "pull", repoTag2) - - var out2Lines []string - for _, outputLine := range strings.Split(out2, "\n") { - if strings.Contains(outputLine, imageAlreadyExists) { - out1Lines = append(out1Lines, outputLine) - } - } - c.Assert(out2Lines, checker.HasLen, len(out1Lines)) - - for i := range out1Lines { - c.Assert(out1Lines[i], checker.Equals, out2Lines[i]) - } -} - -func (s *DockerRegistrySuite) TestPushMultipleTags(c *check.C) { - testPushMultipleTags(c) -} - -func (s *DockerSchema1RegistrySuite) TestPushMultipleTags(c *check.C) { - testPushMultipleTags(c) -} - -func testPushEmptyLayer(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/emptylayer", privateRegistryURL) - emptyTarball, err := ioutil.TempFile("", "empty_tarball") - c.Assert(err, check.IsNil, check.Commentf("Unable to create test file")) - - tw := tar.NewWriter(emptyTarball) - err = tw.Close() - c.Assert(err, check.IsNil, check.Commentf("Error creating empty tarball")) - - freader, err := os.Open(emptyTarball.Name()) - c.Assert(err, check.IsNil, check.Commentf("Could not open test tarball")) - defer freader.Close() - - importCmd := exec.Command(dockerBinary, "import", "-", repoName) - importCmd.Stdin = freader - out, _, err := runCommandWithOutput(importCmd) - c.Assert(err, check.IsNil, check.Commentf("import failed: %q", out)) - - // Now verify we can push it - out, _, err = dockerCmdWithError("push", repoName) - c.Assert(err, check.IsNil, check.Commentf("pushing the image to the private registry has failed: %s", out)) -} - -func (s *DockerRegistrySuite) TestPushEmptyLayer(c *check.C) { - testPushEmptyLayer(c) -} - -func (s *DockerSchema1RegistrySuite) TestPushEmptyLayer(c *check.C) { - testPushEmptyLayer(c) -} - -// testConcurrentPush pushes multiple tags to the same repo -// concurrently. -func testConcurrentPush(c *check.C) { - repoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - - repos := []string{} - for _, tag := range []string{"push1", "push2", "push3"} { - repo := fmt.Sprintf("%v:%v", repoName, tag) - _, err := buildImage(repo, fmt.Sprintf(` - FROM busybox - ENTRYPOINT ["/bin/echo"] - ENV FOO foo - ENV BAR bar - CMD echo %s -`, repo), true) - c.Assert(err, checker.IsNil) - repos = append(repos, repo) - } - - // Push tags, in parallel - results := make(chan error) - - for _, repo := range repos { - go func(repo string) { - _, _, err := runCommandWithOutput(exec.Command(dockerBinary, "push", repo)) - results <- err - }(repo) - } - - for range repos { - err := <-results - c.Assert(err, checker.IsNil, check.Commentf("concurrent push failed with error: %v", err)) - } - - // Clear local images store. - args := append([]string{"rmi"}, repos...) - dockerCmd(c, args...) - - // Re-pull and run individual tags, to make sure pushes succeeded - for _, repo := range repos { - dockerCmd(c, "pull", repo) - dockerCmd(c, "inspect", repo) - out, _ := dockerCmd(c, "run", "--rm", repo) - c.Assert(strings.TrimSpace(out), checker.Equals, "/bin/sh -c echo "+repo) - } -} - -func (s *DockerRegistrySuite) TestConcurrentPush(c *check.C) { - testConcurrentPush(c) -} - -func (s *DockerSchema1RegistrySuite) TestConcurrentPush(c *check.C) { - testConcurrentPush(c) -} - -func (s *DockerRegistrySuite) TestCrossRepositoryLayerPush(c *check.C) { - sourceRepoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - // tag the image to upload it to the private registry - dockerCmd(c, "tag", "busybox", sourceRepoName) - // push the image to the registry - out1, _, err := dockerCmdWithError("push", sourceRepoName) - c.Assert(err, check.IsNil, check.Commentf("pushing the image to the private registry has failed: %s", out1)) - // ensure that none of the layers were mounted from another repository during push - c.Assert(strings.Contains(out1, "Mounted from"), check.Equals, false) - - digest1 := reference.DigestRegexp.FindString(out1) - c.Assert(len(digest1), checker.GreaterThan, 0, check.Commentf("no digest found for pushed manifest")) - - destRepoName := fmt.Sprintf("%v/dockercli/crossrepopush", privateRegistryURL) - // retag the image to upload the same layers to another repo in the same registry - dockerCmd(c, "tag", "busybox", destRepoName) - // push the image to the registry - out2, _, err := dockerCmdWithError("push", destRepoName) - c.Assert(err, check.IsNil, check.Commentf("pushing the image to the private registry has failed: %s", out2)) - // ensure that layers were mounted from the first repo during push - c.Assert(strings.Contains(out2, "Mounted from dockercli/busybox"), check.Equals, true) - - digest2 := reference.DigestRegexp.FindString(out2) - c.Assert(len(digest2), checker.GreaterThan, 0, check.Commentf("no digest found for pushed manifest")) - c.Assert(digest1, check.Equals, digest2) - - // ensure that pushing again produces the same digest - out3, _, err := dockerCmdWithError("push", destRepoName) - c.Assert(err, check.IsNil, check.Commentf("pushing the image to the private registry has failed: %s", out2)) - - digest3 := reference.DigestRegexp.FindString(out3) - c.Assert(len(digest2), checker.GreaterThan, 0, check.Commentf("no digest found for pushed manifest")) - c.Assert(digest3, check.Equals, digest2) - - // ensure that we can pull and run the cross-repo-pushed repository - dockerCmd(c, "rmi", destRepoName) - dockerCmd(c, "pull", destRepoName) - out4, _ := dockerCmd(c, "run", destRepoName, "echo", "-n", "hello world") - c.Assert(out4, check.Equals, "hello world") -} - -func (s *DockerSchema1RegistrySuite) TestCrossRepositoryLayerPushNotSupported(c *check.C) { - sourceRepoName := fmt.Sprintf("%v/dockercli/busybox", privateRegistryURL) - // tag the image to upload it to the private registry - dockerCmd(c, "tag", "busybox", sourceRepoName) - // push the image to the registry - out1, _, err := dockerCmdWithError("push", sourceRepoName) - c.Assert(err, check.IsNil, check.Commentf("pushing the image to the private registry has failed: %s", out1)) - // ensure that none of the layers were mounted from another repository during push - c.Assert(strings.Contains(out1, "Mounted from"), check.Equals, false) - - digest1 := reference.DigestRegexp.FindString(out1) - c.Assert(len(digest1), checker.GreaterThan, 0, check.Commentf("no digest found for pushed manifest")) - - destRepoName := fmt.Sprintf("%v/dockercli/crossrepopush", privateRegistryURL) - // retag the image to upload the same layers to another repo in the same registry - dockerCmd(c, "tag", "busybox", destRepoName) - // push the image to the registry - out2, _, err := dockerCmdWithError("push", destRepoName) - c.Assert(err, check.IsNil, check.Commentf("pushing the image to the private registry has failed: %s", out2)) - // schema1 registry should not support cross-repo layer mounts, so ensure that this does not happen - c.Assert(strings.Contains(out2, "Mounted from"), check.Equals, false) - - digest2 := reference.DigestRegexp.FindString(out2) - c.Assert(len(digest2), checker.GreaterThan, 0, check.Commentf("no digest found for pushed manifest")) - c.Assert(digest1, check.Not(check.Equals), digest2) - - // ensure that we can pull and run the second pushed repository - dockerCmd(c, "rmi", destRepoName) - dockerCmd(c, "pull", destRepoName) - out3, _ := dockerCmd(c, "run", destRepoName, "echo", "-n", "hello world") - c.Assert(out3, check.Equals, "hello world") -} - -func (s *DockerTrustSuite) TestTrustedPush(c *check.C) { - repoName := fmt.Sprintf("%v/dockerclitrusted/pushtest:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("Error running trusted push: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push")) - - // Try pull after push - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Image is up to date", check.Commentf(out)) - - // Assert that we rotated the snapshot key to the server by checking our local keystore - contents, err := ioutil.ReadDir(filepath.Join(cliconfig.ConfigDir(), "trust/private/tuf_keys", privateRegistryURL, "dockerclitrusted/pushtest")) - c.Assert(err, check.IsNil, check.Commentf("Unable to read local tuf key files")) - // Check that we only have 1 key (targets key) - c.Assert(contents, checker.HasLen, 1) -} - -func (s *DockerTrustSuite) TestTrustedPushWithEnvPasswords(c *check.C) { - repoName := fmt.Sprintf("%v/dockerclienv/trusted:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmdWithPassphrases(pushCmd, "12345678", "12345678") - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("Error running trusted push: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push")) - - // Try pull after push - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Image is up to date", check.Commentf(out)) -} - -func (s *DockerTrustSuite) TestTrustedPushWithFailingServer(c *check.C) { - repoName := fmt.Sprintf("%v/dockerclitrusted/failingserver:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - pushCmd := exec.Command(dockerBinary, "push", repoName) - // Using a name that doesn't resolve to an address makes this test faster - s.trustedCmdWithServer(pushCmd, "https://server.invalid:81/") - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.NotNil, check.Commentf("Missing error while running trusted push w/ no server")) - c.Assert(out, checker.Contains, "error contacting notary server", check.Commentf("Missing expected output on trusted push")) -} - -func (s *DockerTrustSuite) TestTrustedPushWithoutServerAndUntrusted(c *check.C) { - repoName := fmt.Sprintf("%v/dockerclitrusted/trustedandnot:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - pushCmd := exec.Command(dockerBinary, "push", "--disable-content-trust", repoName) - // Using a name that doesn't resolve to an address makes this test faster - s.trustedCmdWithServer(pushCmd, "https://server.invalid") - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push with no server and --disable-content-trust failed: %s\n%s", err, out)) - c.Assert(out, check.Not(checker.Contains), "Error establishing connection to notary repository", check.Commentf("Missing expected output on trusted push with --disable-content-trust:")) -} - -func (s *DockerTrustSuite) TestTrustedPushWithExistingTag(c *check.C) { - repoName := fmt.Sprintf("%v/dockerclitag/trusted:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - dockerCmd(c, "push", repoName) - - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) - - // Try pull after push - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Image is up to date", check.Commentf(out)) -} - -func (s *DockerTrustSuite) TestTrustedPushWithExistingSignedTag(c *check.C) { - repoName := fmt.Sprintf("%v/dockerclipushpush/trusted:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - // Do a trusted push - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) - - // Do another trusted push - pushCmd = exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) - - dockerCmd(c, "rmi", repoName) - - // Try pull to ensure the double push did not break our ability to pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf("Error running trusted pull: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Status: Downloaded", check.Commentf("Missing expected output on trusted pull with --disable-content-trust")) - -} - -func (s *DockerTrustSuite) TestTrustedPushWithIncorrectPassphraseForNonRoot(c *check.C) { - repoName := fmt.Sprintf("%v/dockercliincorretpwd/trusted:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - // Push with default passphrases - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push:\n%s", out)) - - // Push with wrong passphrases - pushCmd = exec.Command(dockerBinary, "push", repoName) - s.trustedCmdWithPassphrases(pushCmd, "12345678", "87654321") - out, _, err = runCommandWithOutput(pushCmd) - c.Assert(err, check.NotNil, check.Commentf("Error missing from trusted push with short targets passphrase: \n%s", out)) - c.Assert(out, checker.Contains, "could not find necessary signing keys", check.Commentf("Missing expected output on trusted push with short targets/snapsnot passphrase")) -} - -func (s *DockerTrustSuite) TestTrustedPushWithExpiredSnapshot(c *check.C) { - c.Skip("Currently changes system time, causing instability") - repoName := fmt.Sprintf("%v/dockercliexpiredsnapshot/trusted:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - // Push with default passphrases - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push")) - - // Snapshots last for three years. This should be expired - fourYearsLater := time.Now().Add(time.Hour * 24 * 365 * 4) - - runAtDifferentDate(fourYearsLater, func() { - // Push with wrong passphrases - pushCmd = exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - c.Assert(err, check.NotNil, check.Commentf("Error missing from trusted push with expired snapshot: \n%s", out)) - c.Assert(out, checker.Contains, "repository out-of-date", check.Commentf("Missing expected output on trusted push with expired snapshot")) - }) -} - -func (s *DockerTrustSuite) TestTrustedPushWithExpiredTimestamp(c *check.C) { - c.Skip("Currently changes system time, causing instability") - repoName := fmt.Sprintf("%v/dockercliexpiredtimestamppush/trusted:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - // Push with default passphrases - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push")) - - // The timestamps expire in two weeks. Lets check three - threeWeeksLater := time.Now().Add(time.Hour * 24 * 21) - - // Should succeed because the server transparently re-signs one - runAtDifferentDate(threeWeeksLater, func() { - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("Error running trusted push: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with expired timestamp")) - }) -} - -func (s *DockerTrustSuite) TestTrustedPushWithReleasesDelegationOnly(c *check.C) { - testRequires(c, NotaryHosting) - repoName := fmt.Sprintf("%v/dockerclireleasedelegationinitfirst/trusted", privateRegistryURL) - targetName := fmt.Sprintf("%s:latest", repoName) - s.notaryInitRepo(c, repoName) - s.notaryCreateDelegation(c, repoName, "targets/releases", s.not.keys[0].Public) - s.notaryPublish(c, repoName) - - s.notaryImportKey(c, repoName, "targets/releases", s.not.keys[0].Private) - - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", targetName) - - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) - // check to make sure that the target has been added to targets/releases and not targets - s.assertTargetInRoles(c, repoName, "latest", "targets/releases") - s.assertTargetNotInRoles(c, repoName, "latest", "targets") - - // Try pull after push - os.RemoveAll(filepath.Join(cliconfig.ConfigDir(), "trust")) - - pullCmd := exec.Command(dockerBinary, "pull", targetName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Image is up to date", check.Commentf(out)) -} - -func (s *DockerTrustSuite) TestTrustedPushSignsAllFirstLevelRolesWeHaveKeysFor(c *check.C) { - testRequires(c, NotaryHosting) - repoName := fmt.Sprintf("%v/dockerclimanyroles/trusted", privateRegistryURL) - targetName := fmt.Sprintf("%s:latest", repoName) - s.notaryInitRepo(c, repoName) - s.notaryCreateDelegation(c, repoName, "targets/role1", s.not.keys[0].Public) - s.notaryCreateDelegation(c, repoName, "targets/role2", s.not.keys[1].Public) - s.notaryCreateDelegation(c, repoName, "targets/role3", s.not.keys[2].Public) - - // import everything except the third key - s.notaryImportKey(c, repoName, "targets/role1", s.not.keys[0].Private) - s.notaryImportKey(c, repoName, "targets/role2", s.not.keys[1].Private) - - s.notaryCreateDelegation(c, repoName, "targets/role1/subrole", s.not.keys[3].Public) - s.notaryImportKey(c, repoName, "targets/role1/subrole", s.not.keys[3].Private) - - s.notaryPublish(c, repoName) - - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", targetName) - - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) - - // check to make sure that the target has been added to targets/role1 and targets/role2, and - // not targets (because there are delegations) or targets/role3 (due to missing key) or - // targets/role1/subrole (due to it being a second level delegation) - s.assertTargetInRoles(c, repoName, "latest", "targets/role1", "targets/role2") - s.assertTargetNotInRoles(c, repoName, "latest", "targets") - - // Try pull after push - os.RemoveAll(filepath.Join(cliconfig.ConfigDir(), "trust")) - - // pull should fail because none of these are the releases role - pullCmd := exec.Command(dockerBinary, "pull", targetName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.NotNil, check.Commentf(out)) -} - -func (s *DockerTrustSuite) TestTrustedPushSignsForRolesWithKeysAndValidPaths(c *check.C) { - repoName := fmt.Sprintf("%v/dockerclirolesbykeysandpaths/trusted", privateRegistryURL) - targetName := fmt.Sprintf("%s:latest", repoName) - s.notaryInitRepo(c, repoName) - s.notaryCreateDelegation(c, repoName, "targets/role1", s.not.keys[0].Public, "l", "z") - s.notaryCreateDelegation(c, repoName, "targets/role2", s.not.keys[1].Public, "x", "y") - s.notaryCreateDelegation(c, repoName, "targets/role3", s.not.keys[2].Public, "latest") - s.notaryCreateDelegation(c, repoName, "targets/role4", s.not.keys[3].Public, "latest") - - // import everything except the third key - s.notaryImportKey(c, repoName, "targets/role1", s.not.keys[0].Private) - s.notaryImportKey(c, repoName, "targets/role2", s.not.keys[1].Private) - s.notaryImportKey(c, repoName, "targets/role4", s.not.keys[3].Private) - - s.notaryPublish(c, repoName) - - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", targetName) - - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) - - // check to make sure that the target has been added to targets/role1 and targets/role4, and - // not targets (because there are delegations) or targets/role2 (due to path restrictions) or - // targets/role3 (due to missing key) - s.assertTargetInRoles(c, repoName, "latest", "targets/role1", "targets/role4") - s.assertTargetNotInRoles(c, repoName, "latest", "targets") - - // Try pull after push - os.RemoveAll(filepath.Join(cliconfig.ConfigDir(), "trust")) - - // pull should fail because none of these are the releases role - pullCmd := exec.Command(dockerBinary, "pull", targetName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.NotNil, check.Commentf(out)) -} - -func (s *DockerTrustSuite) TestTrustedPushDoesntSignTargetsIfDelegationsExist(c *check.C) { - testRequires(c, NotaryHosting) - repoName := fmt.Sprintf("%v/dockerclireleasedelegationnotsignable/trusted", privateRegistryURL) - targetName := fmt.Sprintf("%s:latest", repoName) - s.notaryInitRepo(c, repoName) - s.notaryCreateDelegation(c, repoName, "targets/role1", s.not.keys[0].Public) - s.notaryPublish(c, repoName) - - // do not import any delegations key - - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", targetName) - - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.NotNil, check.Commentf("trusted push succeeded but should have failed:\n%s", out)) - c.Assert(out, checker.Contains, "no valid signing keys", - check.Commentf("Missing expected output on trusted push without keys")) - - s.assertTargetNotInRoles(c, repoName, "latest", "targets", "targets/role1") -} - -func (s *DockerRegistryAuthHtpasswdSuite) TestPushNoCredentialsNoRetry(c *check.C) { - repoName := fmt.Sprintf("%s/busybox", privateRegistryURL) - dockerCmd(c, "tag", "busybox", repoName) - out, _, err := dockerCmdWithError("push", repoName) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, check.Not(checker.Contains), "Retrying") - c.Assert(out, checker.Contains, "no basic auth credentials") -} - -// This may be flaky but it's needed not to regress on unauthorized push, see #21054 -func (s *DockerSuite) TestPushToCentralRegistryUnauthorized(c *check.C) { - testRequires(c, Network) - repoName := "test/busybox" - dockerCmd(c, "tag", "busybox", repoName) - out, _, err := dockerCmdWithError("push", repoName) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, check.Not(checker.Contains), "Retrying") -} - -func getTestTokenService(status int, body string, retries int) *httptest.Server { - var mu sync.Mutex - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - mu.Lock() - if retries > 0 { - w.WriteHeader(http.StatusServiceUnavailable) - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"errors":[{"code":"UNAVAILABLE","message":"cannot create token at this time"}]}`)) - retries-- - } else { - w.WriteHeader(status) - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(body)) - } - mu.Unlock() - })) -} - -func (s *DockerRegistryAuthTokenSuite) TestPushTokenServiceUnauthResponse(c *check.C) { - ts := getTestTokenService(http.StatusUnauthorized, `{"errors": [{"Code":"UNAUTHORIZED", "message": "a message", "detail": null}]}`, 0) - defer ts.Close() - s.setupRegistryWithTokenService(c, ts.URL) - repoName := fmt.Sprintf("%s/busybox", privateRegistryURL) - dockerCmd(c, "tag", "busybox", repoName) - out, _, err := dockerCmdWithError("push", repoName) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Not(checker.Contains), "Retrying") - c.Assert(out, checker.Contains, "unauthorized: a message") -} - -func (s *DockerRegistryAuthTokenSuite) TestPushMisconfiguredTokenServiceResponseUnauthorized(c *check.C) { - ts := getTestTokenService(http.StatusUnauthorized, `{"error": "unauthorized"}`, 0) - defer ts.Close() - s.setupRegistryWithTokenService(c, ts.URL) - repoName := fmt.Sprintf("%s/busybox", privateRegistryURL) - dockerCmd(c, "tag", "busybox", repoName) - out, _, err := dockerCmdWithError("push", repoName) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Not(checker.Contains), "Retrying") - split := strings.Split(out, "\n") - c.Assert(split[len(split)-2], check.Equals, "unauthorized: authentication required") -} - -func (s *DockerRegistryAuthTokenSuite) TestPushMisconfiguredTokenServiceResponseError(c *check.C) { - ts := getTestTokenService(http.StatusTooManyRequests, `{"errors": [{"code":"TOOMANYREQUESTS","message":"out of tokens"}]}`, 4) - defer ts.Close() - s.setupRegistryWithTokenService(c, ts.URL) - repoName := fmt.Sprintf("%s/busybox", privateRegistryURL) - dockerCmd(c, "tag", "busybox", repoName) - out, _, err := dockerCmdWithError("push", repoName) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Retrying") - c.Assert(out, checker.Not(checker.Contains), "Retrying in 15") - split := strings.Split(out, "\n") - c.Assert(split[len(split)-2], check.Equals, "toomanyrequests: out of tokens") -} - -func (s *DockerRegistryAuthTokenSuite) TestPushMisconfiguredTokenServiceResponseUnparsable(c *check.C) { - ts := getTestTokenService(http.StatusForbidden, `no way`, 0) - defer ts.Close() - s.setupRegistryWithTokenService(c, ts.URL) - repoName := fmt.Sprintf("%s/busybox", privateRegistryURL) - dockerCmd(c, "tag", "busybox", repoName) - out, _, err := dockerCmdWithError("push", repoName) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Not(checker.Contains), "Retrying") - split := strings.Split(out, "\n") - c.Assert(split[len(split)-2], checker.Contains, "error parsing HTTP 403 response body: ") -} - -func (s *DockerRegistryAuthTokenSuite) TestPushMisconfiguredTokenServiceResponseNoToken(c *check.C) { - ts := getTestTokenService(http.StatusOK, `{"something": "wrong"}`, 0) - defer ts.Close() - s.setupRegistryWithTokenService(c, ts.URL) - repoName := fmt.Sprintf("%s/busybox", privateRegistryURL) - dockerCmd(c, "tag", "busybox", repoName) - out, _, err := dockerCmdWithError("push", repoName) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Not(checker.Contains), "Retrying") - split := strings.Split(out, "\n") - c.Assert(split[len(split)-2], check.Equals, "authorization server did not include a token in the response") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_registry_user_agent_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_registry_user_agent_test.go deleted file mode 100644 index fb9a66a54..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_registry_user_agent_test.go +++ /dev/null @@ -1,120 +0,0 @@ -package main - -import ( - "fmt" - "net/http" - "regexp" - - "github.com/go-check/check" -) - -// unescapeBackslashSemicolonParens unescapes \;() -func unescapeBackslashSemicolonParens(s string) string { - re := regexp.MustCompile(`\\;`) - ret := re.ReplaceAll([]byte(s), []byte(";")) - - re = regexp.MustCompile(`\\\(`) - ret = re.ReplaceAll([]byte(ret), []byte("(")) - - re = regexp.MustCompile(`\\\)`) - ret = re.ReplaceAll([]byte(ret), []byte(")")) - - re = regexp.MustCompile(`\\\\`) - ret = re.ReplaceAll([]byte(ret), []byte(`\`)) - - return string(ret) -} - -func regexpCheckUA(c *check.C, ua string) { - re := regexp.MustCompile("(?P.+) UpstreamClient(?P.+)") - substrArr := re.FindStringSubmatch(ua) - - c.Assert(substrArr, check.HasLen, 3, check.Commentf("Expected 'UpstreamClient()' with upstream client UA")) - dockerUA := substrArr[1] - upstreamUAEscaped := substrArr[2] - - // check dockerUA looks correct - reDockerUA := regexp.MustCompile("^docker/[0-9A-Za-z+]") - bMatchDockerUA := reDockerUA.MatchString(dockerUA) - c.Assert(bMatchDockerUA, check.Equals, true, check.Commentf("Docker Engine User-Agent malformed")) - - // check upstreamUA looks correct - // Expecting something like: Docker-Client/1.11.0-dev (linux) - upstreamUA := unescapeBackslashSemicolonParens(upstreamUAEscaped) - reUpstreamUA := regexp.MustCompile("^\\(Docker-Client/[0-9A-Za-z+]") - bMatchUpstreamUA := reUpstreamUA.MatchString(upstreamUA) - c.Assert(bMatchUpstreamUA, check.Equals, true, check.Commentf("(Upstream) Docker Client User-Agent malformed")) -} - -func registerUserAgentHandler(reg *testRegistry, result *string) { - reg.registerHandler("/v2/", func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(404) - var ua string - for k, v := range r.Header { - if k == "User-Agent" { - ua = v[0] - } - } - *result = ua - }) -} - -// TestUserAgentPassThrough verifies that when an image is pulled from -// a registry, the registry should see a User-Agent string of the form -// [docker engine UA] UptreamClientSTREAM-CLIENT([client UA]) -func (s *DockerRegistrySuite) TestUserAgentPassThrough(c *check.C) { - var ( - buildUA string - pullUA string - pushUA string - loginUA string - ) - - buildReg, err := newTestRegistry(c) - c.Assert(err, check.IsNil) - registerUserAgentHandler(buildReg, &buildUA) - buildRepoName := fmt.Sprintf("%s/busybox", buildReg.hostport) - - pullReg, err := newTestRegistry(c) - c.Assert(err, check.IsNil) - registerUserAgentHandler(pullReg, &pullUA) - pullRepoName := fmt.Sprintf("%s/busybox", pullReg.hostport) - - pushReg, err := newTestRegistry(c) - c.Assert(err, check.IsNil) - registerUserAgentHandler(pushReg, &pushUA) - pushRepoName := fmt.Sprintf("%s/busybox", pushReg.hostport) - - loginReg, err := newTestRegistry(c) - c.Assert(err, check.IsNil) - registerUserAgentHandler(loginReg, &loginUA) - - err = s.d.Start( - "--insecure-registry", buildReg.hostport, - "--insecure-registry", pullReg.hostport, - "--insecure-registry", pushReg.hostport, - "--insecure-registry", loginReg.hostport, - "--disable-legacy-registry=true") - c.Assert(err, check.IsNil) - - dockerfileName, cleanup1, err := makefile(fmt.Sprintf("FROM %s", buildRepoName)) - c.Assert(err, check.IsNil, check.Commentf("Unable to create test dockerfile")) - defer cleanup1() - s.d.Cmd("build", "--file", dockerfileName, ".") - regexpCheckUA(c, buildUA) - - s.d.Cmd("login", "-u", "richard", "-p", "testtest", "-e", "testuser@testdomain.com", loginReg.hostport) - regexpCheckUA(c, loginUA) - - s.d.Cmd("pull", pullRepoName) - regexpCheckUA(c, pullUA) - - dockerfileName, cleanup2, err := makefile(`FROM scratch - ENV foo bar`) - c.Assert(err, check.IsNil, check.Commentf("Unable to create test dockerfile")) - defer cleanup2() - s.d.Cmd("build", "-t", pushRepoName, "--file", dockerfileName, ".") - - s.d.Cmd("push", pushRepoName) - regexpCheckUA(c, pushUA) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_rename_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_rename_test.go deleted file mode 100644 index 373d614b5..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_rename_test.go +++ /dev/null @@ -1,138 +0,0 @@ -package main - -import ( - "strings" - - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/docker/docker/pkg/stringid" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestRenameStoppedContainer(c *check.C) { - out, _ := dockerCmd(c, "run", "--name", "first_name", "-d", "busybox", "sh") - - cleanedContainerID := strings.TrimSpace(out) - dockerCmd(c, "wait", cleanedContainerID) - - name := inspectField(c, cleanedContainerID, "Name") - newName := "new_name" + stringid.GenerateNonCryptoID() - dockerCmd(c, "rename", "first_name", newName) - - name = inspectField(c, cleanedContainerID, "Name") - c.Assert(name, checker.Equals, "/"+newName, check.Commentf("Failed to rename container %s", name)) - -} - -func (s *DockerSuite) TestRenameRunningContainer(c *check.C) { - out, _ := dockerCmd(c, "run", "--name", "first_name", "-d", "busybox", "sh") - - newName := "new_name" + stringid.GenerateNonCryptoID() - cleanedContainerID := strings.TrimSpace(out) - dockerCmd(c, "rename", "first_name", newName) - - name := inspectField(c, cleanedContainerID, "Name") - c.Assert(name, checker.Equals, "/"+newName, check.Commentf("Failed to rename container %s", name)) -} - -func (s *DockerSuite) TestRenameRunningContainerAndReuse(c *check.C) { - out, _ := runSleepingContainer(c, "--name", "first_name") - c.Assert(waitRun("first_name"), check.IsNil) - - newName := "new_name" - ContainerID := strings.TrimSpace(out) - dockerCmd(c, "rename", "first_name", newName) - - name := inspectField(c, ContainerID, "Name") - c.Assert(name, checker.Equals, "/"+newName, check.Commentf("Failed to rename container")) - - out, _ = runSleepingContainer(c, "--name", "first_name") - c.Assert(waitRun("first_name"), check.IsNil) - newContainerID := strings.TrimSpace(out) - name = inspectField(c, newContainerID, "Name") - c.Assert(name, checker.Equals, "/first_name", check.Commentf("Failed to reuse container name")) -} - -func (s *DockerSuite) TestRenameCheckNames(c *check.C) { - dockerCmd(c, "run", "--name", "first_name", "-d", "busybox", "sh") - - newName := "new_name" + stringid.GenerateNonCryptoID() - dockerCmd(c, "rename", "first_name", newName) - - name := inspectField(c, newName, "Name") - c.Assert(name, checker.Equals, "/"+newName, check.Commentf("Failed to rename container %s", name)) - - result := dockerCmdWithResult("inspect", "-f={{.Name}}", "--type=container", "first_name") - c.Assert(result, icmd.Matches, icmd.Expected{ - ExitCode: 1, - Err: "No such container: first_name", - }) -} - -func (s *DockerSuite) TestRenameInvalidName(c *check.C) { - runSleepingContainer(c, "--name", "myname") - - out, _, err := dockerCmdWithError("rename", "myname", "new:invalid") - c.Assert(err, checker.NotNil, check.Commentf("Renaming container to invalid name should have failed: %s", out)) - c.Assert(out, checker.Contains, "Invalid container name", check.Commentf("%v", err)) - - out, _, err = dockerCmdWithError("rename", "myname") - c.Assert(err, checker.NotNil, check.Commentf("Renaming container to invalid name should have failed: %s", out)) - c.Assert(out, checker.Contains, "requires exactly 2 argument(s).", check.Commentf("%v", err)) - - out, _, err = dockerCmdWithError("rename", "myname", "") - c.Assert(err, checker.NotNil, check.Commentf("Renaming container to invalid name should have failed: %s", out)) - c.Assert(out, checker.Contains, "may be empty", check.Commentf("%v", err)) - - out, _, err = dockerCmdWithError("rename", "", "newname") - c.Assert(err, checker.NotNil, check.Commentf("Renaming container with empty name should have failed: %s", out)) - c.Assert(out, checker.Contains, "may be empty", check.Commentf("%v", err)) - - out, _ = dockerCmd(c, "ps", "-a") - c.Assert(out, checker.Contains, "myname", check.Commentf("Output of docker ps should have included 'myname': %s", out)) -} - -func (s *DockerSuite) TestRenameAnonymousContainer(c *check.C) { - testRequires(c, DaemonIsLinux) - - dockerCmd(c, "network", "create", "network1") - out, _ := dockerCmd(c, "create", "-it", "--net", "network1", "busybox", "top") - - anonymousContainerID := strings.TrimSpace(out) - - dockerCmd(c, "rename", anonymousContainerID, "container1") - dockerCmd(c, "start", "container1") - - count := "-c" - if daemonPlatform == "windows" { - count = "-n" - } - - _, _, err := dockerCmdWithError("run", "--net", "network1", "busybox", "ping", count, "1", "container1") - c.Assert(err, check.IsNil, check.Commentf("Embedded DNS lookup fails after renaming anonymous container: %v", err)) -} - -func (s *DockerSuite) TestRenameContainerWithSameName(c *check.C) { - out, _ := runSleepingContainer(c, "--name", "old") - ContainerID := strings.TrimSpace(out) - - out, _, err := dockerCmdWithError("rename", "old", "old") - c.Assert(err, checker.NotNil, check.Commentf("Renaming a container with the same name should have failed")) - c.Assert(out, checker.Contains, "Renaming a container with the same name", check.Commentf("%v", err)) - - out, _, err = dockerCmdWithError("rename", ContainerID, "old") - c.Assert(err, checker.NotNil, check.Commentf("Renaming a container with the same name should have failed")) - c.Assert(out, checker.Contains, "Renaming a container with the same name", check.Commentf("%v", err)) -} - -// Test case for #23973 -func (s *DockerSuite) TestRenameContainerWithLinkedContainer(c *check.C) { - testRequires(c, DaemonIsLinux) - - db1, _ := dockerCmd(c, "run", "--name", "db1", "-d", "busybox", "top") - dockerCmd(c, "run", "--name", "app1", "-d", "--link", "db1:/mysql", "busybox", "top") - dockerCmd(c, "rename", "app1", "app2") - out, _, err := dockerCmdWithError("inspect", "--format={{ .Id }}", "app2/mysql") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, strings.TrimSpace(db1)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_restart_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_restart_test.go deleted file mode 100644 index 7d585289e..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_restart_test.go +++ /dev/null @@ -1,278 +0,0 @@ -package main - -import ( - "os" - "strconv" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestRestartStoppedContainer(c *check.C) { - dockerCmd(c, "run", "--name=test", "busybox", "echo", "foobar") - cleanedContainerID, err := getIDByName("test") - c.Assert(err, check.IsNil) - - out, _ := dockerCmd(c, "logs", cleanedContainerID) - c.Assert(out, checker.Equals, "foobar\n") - - dockerCmd(c, "restart", cleanedContainerID) - - // Wait until the container has stopped - err = waitInspect(cleanedContainerID, "{{.State.Running}}", "false", 20*time.Second) - c.Assert(err, checker.IsNil) - - out, _ = dockerCmd(c, "logs", cleanedContainerID) - c.Assert(out, checker.Equals, "foobar\nfoobar\n") -} - -func (s *DockerSuite) TestRestartRunningContainer(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", "echo foobar && sleep 30 && echo 'should not print this'") - - cleanedContainerID := strings.TrimSpace(out) - - c.Assert(waitRun(cleanedContainerID), checker.IsNil) - - out, _ = dockerCmd(c, "logs", cleanedContainerID) - c.Assert(out, checker.Equals, "foobar\n") - - dockerCmd(c, "restart", "-t", "1", cleanedContainerID) - - out, _ = dockerCmd(c, "logs", cleanedContainerID) - - c.Assert(waitRun(cleanedContainerID), checker.IsNil) - - c.Assert(out, checker.Equals, "foobar\nfoobar\n") -} - -// Test that restarting a container with a volume does not create a new volume on restart. Regression test for #819. -func (s *DockerSuite) TestRestartWithVolumes(c *check.C) { - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - out, _ := runSleepingContainer(c, "-d", "-v", prefix+slash+"test") - - cleanedContainerID := strings.TrimSpace(out) - out, err := inspectFilter(cleanedContainerID, "len .Mounts") - c.Assert(err, check.IsNil, check.Commentf("failed to inspect %s: %s", cleanedContainerID, out)) - out = strings.Trim(out, " \n\r") - c.Assert(out, checker.Equals, "1") - - source, err := inspectMountSourceField(cleanedContainerID, prefix+slash+"test") - c.Assert(err, checker.IsNil) - - dockerCmd(c, "restart", cleanedContainerID) - - out, err = inspectFilter(cleanedContainerID, "len .Mounts") - c.Assert(err, check.IsNil, check.Commentf("failed to inspect %s: %s", cleanedContainerID, out)) - out = strings.Trim(out, " \n\r") - c.Assert(out, checker.Equals, "1") - - sourceAfterRestart, err := inspectMountSourceField(cleanedContainerID, prefix+slash+"test") - c.Assert(err, checker.IsNil) - c.Assert(source, checker.Equals, sourceAfterRestart) -} - -func (s *DockerSuite) TestRestartPolicyNO(c *check.C) { - out, _ := dockerCmd(c, "create", "--restart=no", "busybox") - - id := strings.TrimSpace(string(out)) - name := inspectField(c, id, "HostConfig.RestartPolicy.Name") - c.Assert(name, checker.Equals, "no") -} - -func (s *DockerSuite) TestRestartPolicyAlways(c *check.C) { - out, _ := dockerCmd(c, "create", "--restart=always", "busybox") - - id := strings.TrimSpace(string(out)) - name := inspectField(c, id, "HostConfig.RestartPolicy.Name") - c.Assert(name, checker.Equals, "always") - - MaximumRetryCount := inspectField(c, id, "HostConfig.RestartPolicy.MaximumRetryCount") - - // MaximumRetryCount=0 if the restart policy is always - c.Assert(MaximumRetryCount, checker.Equals, "0") -} - -func (s *DockerSuite) TestRestartPolicyOnFailure(c *check.C) { - out, _, err := dockerCmdWithError("create", "--restart=on-failure:-1", "busybox") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "maximum retry count cannot be negative") - - out, _ = dockerCmd(c, "create", "--restart=on-failure:1", "busybox") - - id := strings.TrimSpace(string(out)) - name := inspectField(c, id, "HostConfig.RestartPolicy.Name") - maxRetry := inspectField(c, id, "HostConfig.RestartPolicy.MaximumRetryCount") - - c.Assert(name, checker.Equals, "on-failure") - c.Assert(maxRetry, checker.Equals, "1") - - out, _ = dockerCmd(c, "create", "--restart=on-failure:0", "busybox") - - id = strings.TrimSpace(string(out)) - name = inspectField(c, id, "HostConfig.RestartPolicy.Name") - maxRetry = inspectField(c, id, "HostConfig.RestartPolicy.MaximumRetryCount") - - c.Assert(name, checker.Equals, "on-failure") - c.Assert(maxRetry, checker.Equals, "0") - - out, _ = dockerCmd(c, "create", "--restart=on-failure", "busybox") - - id = strings.TrimSpace(string(out)) - name = inspectField(c, id, "HostConfig.RestartPolicy.Name") - maxRetry = inspectField(c, id, "HostConfig.RestartPolicy.MaximumRetryCount") - - c.Assert(name, checker.Equals, "on-failure") - c.Assert(maxRetry, checker.Equals, "0") -} - -// a good container with --restart=on-failure:3 -// MaximumRetryCount!=0; RestartCount=0 -func (s *DockerSuite) TestRestartContainerwithGoodContainer(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "--restart=on-failure:3", "busybox", "true") - - id := strings.TrimSpace(string(out)) - err := waitInspect(id, "{{ .State.Restarting }} {{ .State.Running }}", "false false", 30*time.Second) - c.Assert(err, checker.IsNil) - - count := inspectField(c, id, "RestartCount") - c.Assert(count, checker.Equals, "0") - - MaximumRetryCount := inspectField(c, id, "HostConfig.RestartPolicy.MaximumRetryCount") - c.Assert(MaximumRetryCount, checker.Equals, "3") - -} - -func (s *DockerSuite) TestRestartContainerSuccess(c *check.C) { - testRequires(c, SameHostDaemon) - - out, _ := runSleepingContainer(c, "-d", "--restart=always") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), check.IsNil) - - pidStr := inspectField(c, id, "State.Pid") - - pid, err := strconv.Atoi(pidStr) - c.Assert(err, check.IsNil) - - p, err := os.FindProcess(pid) - c.Assert(err, check.IsNil) - c.Assert(p, check.NotNil) - - err = p.Kill() - c.Assert(err, check.IsNil) - - err = waitInspect(id, "{{.RestartCount}}", "1", 30*time.Second) - c.Assert(err, check.IsNil) - - err = waitInspect(id, "{{.State.Status}}", "running", 30*time.Second) - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestRestartWithPolicyUserDefinedNetwork(c *check.C) { - // TODO Windows. This may be portable following HNS integration post TP5. - testRequires(c, DaemonIsLinux, SameHostDaemon, NotUserNamespace, NotArm) - dockerCmd(c, "network", "create", "-d", "bridge", "udNet") - - dockerCmd(c, "run", "-d", "--net=udNet", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - - dockerCmd(c, "run", "-d", "--restart=always", "--net=udNet", "--name=second", - "--link=first:foo", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // ping to first and its alias foo must succeed - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo") - c.Assert(err, check.IsNil) - - // Now kill the second container and let the restart policy kick in - pidStr := inspectField(c, "second", "State.Pid") - - pid, err := strconv.Atoi(pidStr) - c.Assert(err, check.IsNil) - - p, err := os.FindProcess(pid) - c.Assert(err, check.IsNil) - c.Assert(p, check.NotNil) - - err = p.Kill() - c.Assert(err, check.IsNil) - - err = waitInspect("second", "{{.RestartCount}}", "1", 5*time.Second) - c.Assert(err, check.IsNil) - - err = waitInspect("second", "{{.State.Status}}", "running", 5*time.Second) - - // ping to first and its alias foo must still succeed - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo") - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestRestartPolicyAfterRestart(c *check.C) { - testRequires(c, SameHostDaemon) - - out, _ := runSleepingContainer(c, "-d", "--restart=always") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), check.IsNil) - - dockerCmd(c, "restart", id) - - c.Assert(waitRun(id), check.IsNil) - - pidStr := inspectField(c, id, "State.Pid") - - pid, err := strconv.Atoi(pidStr) - c.Assert(err, check.IsNil) - - p, err := os.FindProcess(pid) - c.Assert(err, check.IsNil) - c.Assert(p, check.NotNil) - - err = p.Kill() - c.Assert(err, check.IsNil) - - err = waitInspect(id, "{{.RestartCount}}", "1", 30*time.Second) - c.Assert(err, check.IsNil) - - err = waitInspect(id, "{{.State.Status}}", "running", 30*time.Second) - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestRestartContainerwithRestartPolicy(c *check.C) { - out1, _ := dockerCmd(c, "run", "-d", "--restart=on-failure:3", "busybox", "false") - out2, _ := dockerCmd(c, "run", "-d", "--restart=always", "busybox", "false") - - id1 := strings.TrimSpace(string(out1)) - id2 := strings.TrimSpace(string(out2)) - waitTimeout := 15 * time.Second - if daemonPlatform == "windows" { - waitTimeout = 150 * time.Second - } - err := waitInspect(id1, "{{ .State.Restarting }} {{ .State.Running }}", "false false", waitTimeout) - c.Assert(err, checker.IsNil) - - dockerCmd(c, "restart", id1) - dockerCmd(c, "restart", id2) - - dockerCmd(c, "stop", id1) - dockerCmd(c, "stop", id2) - dockerCmd(c, "start", id1) - dockerCmd(c, "start", id2) -} - -func (s *DockerSuite) TestRestartAutoRemoveContainer(c *check.C) { - out, _ := runSleepingContainer(c, "--rm") - - id := strings.TrimSpace(string(out)) - dockerCmd(c, "restart", id) - err := waitInspect(id, "{{ .State.Restarting }} {{ .State.Running }}", "false true", 15*time.Second) - c.Assert(err, checker.IsNil) - - out, _ = dockerCmd(c, "ps") - c.Assert(out, checker.Contains, id[:12], check.Commentf("container should be restarted instead of removed: %v", out)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_rm_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_rm_test.go deleted file mode 100644 index 0186c5674..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_rm_test.go +++ /dev/null @@ -1,86 +0,0 @@ -package main - -import ( - "io/ioutil" - "os" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestRmContainerWithRemovedVolume(c *check.C) { - testRequires(c, SameHostDaemon) - - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - - tempDir, err := ioutil.TempDir("", "test-rm-container-with-removed-volume-") - if err != nil { - c.Fatalf("failed to create temporary directory: %s", tempDir) - } - defer os.RemoveAll(tempDir) - - dockerCmd(c, "run", "--name", "losemyvolumes", "-v", tempDir+":"+prefix+slash+"test", "busybox", "true") - - err = os.RemoveAll(tempDir) - c.Assert(err, check.IsNil) - - dockerCmd(c, "rm", "-v", "losemyvolumes") -} - -func (s *DockerSuite) TestRmContainerWithVolume(c *check.C) { - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - - dockerCmd(c, "run", "--name", "foo", "-v", prefix+slash+"srv", "busybox", "true") - - dockerCmd(c, "rm", "-v", "foo") -} - -func (s *DockerSuite) TestRmContainerRunning(c *check.C) { - createRunningContainer(c, "foo") - - _, _, err := dockerCmdWithError("rm", "foo") - c.Assert(err, checker.NotNil, check.Commentf("Expected error, can't rm a running container")) -} - -func (s *DockerSuite) TestRmContainerForceRemoveRunning(c *check.C) { - createRunningContainer(c, "foo") - - // Stop then remove with -s - dockerCmd(c, "rm", "-f", "foo") -} - -func (s *DockerSuite) TestRmContainerOrphaning(c *check.C) { - dockerfile1 := `FROM busybox:latest - ENTRYPOINT ["true"]` - img := "test-container-orphaning" - dockerfile2 := `FROM busybox:latest - ENTRYPOINT ["true"] - MAINTAINER Integration Tests` - - // build first dockerfile - img1, err := buildImage(img, dockerfile1, true) - c.Assert(err, check.IsNil, check.Commentf("Could not build image %s", img)) - // run container on first image - dockerCmd(c, "run", img) - // rebuild dockerfile with a small addition at the end - _, err = buildImage(img, dockerfile2, true) - c.Assert(err, check.IsNil, check.Commentf("Could not rebuild image %s", img)) - // try to remove the image, should not error out. - out, _, err := dockerCmdWithError("rmi", img) - c.Assert(err, check.IsNil, check.Commentf("Expected to removing the image, but failed: %s", out)) - - // check if we deleted the first image - out, _ = dockerCmd(c, "images", "-q", "--no-trunc") - c.Assert(out, checker.Contains, img1, check.Commentf("Orphaned container (could not find %q in docker images): %s", img1, out)) - -} - -func (s *DockerSuite) TestRmInvalidContainer(c *check.C) { - out, _, err := dockerCmdWithError("rm", "unknown") - c.Assert(err, checker.NotNil, check.Commentf("Expected error on rm unknown container, got none")) - c.Assert(out, checker.Contains, "No such container") -} - -func createRunningContainer(c *check.C, name string) { - runSleepingContainer(c, "-dt", "--name", name) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_rmi_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_rmi_test.go deleted file mode 100644 index cb16d9d88..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_rmi_test.go +++ /dev/null @@ -1,352 +0,0 @@ -package main - -import ( - "fmt" - "os/exec" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/stringid" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestRmiWithContainerFails(c *check.C) { - errSubstr := "is using it" - - // create a container - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - - cleanedContainerID := strings.TrimSpace(out) - - // try to delete the image - out, _, err := dockerCmdWithError("rmi", "busybox") - // Container is using image, should not be able to rmi - c.Assert(err, checker.NotNil) - // Container is using image, error message should contain errSubstr - c.Assert(out, checker.Contains, errSubstr, check.Commentf("Container: %q", cleanedContainerID)) - - // make sure it didn't delete the busybox name - images, _ := dockerCmd(c, "images") - // The name 'busybox' should not have been removed from images - c.Assert(images, checker.Contains, "busybox") -} - -func (s *DockerSuite) TestRmiTag(c *check.C) { - imagesBefore, _ := dockerCmd(c, "images", "-a") - dockerCmd(c, "tag", "busybox", "utest:tag1") - dockerCmd(c, "tag", "busybox", "utest/docker:tag2") - dockerCmd(c, "tag", "busybox", "utest:5000/docker:tag3") - { - imagesAfter, _ := dockerCmd(c, "images", "-a") - c.Assert(strings.Count(imagesAfter, "\n"), checker.Equals, strings.Count(imagesBefore, "\n")+3, check.Commentf("before: %q\n\nafter: %q\n", imagesBefore, imagesAfter)) - } - dockerCmd(c, "rmi", "utest/docker:tag2") - { - imagesAfter, _ := dockerCmd(c, "images", "-a") - c.Assert(strings.Count(imagesAfter, "\n"), checker.Equals, strings.Count(imagesBefore, "\n")+2, check.Commentf("before: %q\n\nafter: %q\n", imagesBefore, imagesAfter)) - } - dockerCmd(c, "rmi", "utest:5000/docker:tag3") - { - imagesAfter, _ := dockerCmd(c, "images", "-a") - c.Assert(strings.Count(imagesAfter, "\n"), checker.Equals, strings.Count(imagesBefore, "\n")+1, check.Commentf("before: %q\n\nafter: %q\n", imagesBefore, imagesAfter)) - - } - dockerCmd(c, "rmi", "utest:tag1") - { - imagesAfter, _ := dockerCmd(c, "images", "-a") - c.Assert(strings.Count(imagesAfter, "\n"), checker.Equals, strings.Count(imagesBefore, "\n"), check.Commentf("before: %q\n\nafter: %q\n", imagesBefore, imagesAfter)) - - } -} - -func (s *DockerSuite) TestRmiImgIDMultipleTag(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "mkdir '/busybox-one'") - - containerID := strings.TrimSpace(out) - - // Wait for it to exit as cannot commit a running container on Windows, and - // it will take a few seconds to exit - if daemonPlatform == "windows" { - err := waitExited(containerID, 60*time.Second) - c.Assert(err, check.IsNil) - } - - dockerCmd(c, "commit", containerID, "busybox-one") - - imagesBefore, _ := dockerCmd(c, "images", "-a") - dockerCmd(c, "tag", "busybox-one", "busybox-one:tag1") - dockerCmd(c, "tag", "busybox-one", "busybox-one:tag2") - - imagesAfter, _ := dockerCmd(c, "images", "-a") - // tag busybox to create 2 more images with same imageID - c.Assert(strings.Count(imagesAfter, "\n"), checker.Equals, strings.Count(imagesBefore, "\n")+2, check.Commentf("docker images shows: %q\n", imagesAfter)) - - imgID := inspectField(c, "busybox-one:tag1", "Id") - - // run a container with the image - out, _ = runSleepingContainerInImage(c, "busybox-one") - - containerID = strings.TrimSpace(out) - - // first checkout without force it fails - out, _, err := dockerCmdWithError("rmi", imgID) - expected := fmt.Sprintf("conflict: unable to delete %s (cannot be forced) - image is being used by running container %s", stringid.TruncateID(imgID), stringid.TruncateID(containerID)) - // rmi tagged in multiple repos should have failed without force - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, expected) - - dockerCmd(c, "stop", containerID) - dockerCmd(c, "rmi", "-f", imgID) - - imagesAfter, _ = dockerCmd(c, "images", "-a") - // rmi -f failed, image still exists - c.Assert(imagesAfter, checker.Not(checker.Contains), imgID[:12], check.Commentf("ImageID:%q; ImagesAfter: %q", imgID, imagesAfter)) -} - -func (s *DockerSuite) TestRmiImgIDForce(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "mkdir '/busybox-test'") - - containerID := strings.TrimSpace(out) - - // Wait for it to exit as cannot commit a running container on Windows, and - // it will take a few seconds to exit - if daemonPlatform == "windows" { - err := waitExited(containerID, 60*time.Second) - c.Assert(err, check.IsNil) - } - - dockerCmd(c, "commit", containerID, "busybox-test") - - imagesBefore, _ := dockerCmd(c, "images", "-a") - dockerCmd(c, "tag", "busybox-test", "utest:tag1") - dockerCmd(c, "tag", "busybox-test", "utest:tag2") - dockerCmd(c, "tag", "busybox-test", "utest/docker:tag3") - dockerCmd(c, "tag", "busybox-test", "utest:5000/docker:tag4") - { - imagesAfter, _ := dockerCmd(c, "images", "-a") - c.Assert(strings.Count(imagesAfter, "\n"), checker.Equals, strings.Count(imagesBefore, "\n")+4, check.Commentf("before: %q\n\nafter: %q\n", imagesBefore, imagesAfter)) - } - imgID := inspectField(c, "busybox-test", "Id") - - // first checkout without force it fails - out, _, err := dockerCmdWithError("rmi", imgID) - // rmi tagged in multiple repos should have failed without force - c.Assert(err, checker.NotNil) - // rmi tagged in multiple repos should have failed without force - c.Assert(out, checker.Contains, "(must be forced) - image is referenced in multiple repositories", check.Commentf("out: %s; err: %v;", out, err)) - - dockerCmd(c, "rmi", "-f", imgID) - { - imagesAfter, _ := dockerCmd(c, "images", "-a") - // rmi failed, image still exists - c.Assert(imagesAfter, checker.Not(checker.Contains), imgID[:12]) - } -} - -// See https://github.com/docker/docker/issues/14116 -func (s *DockerSuite) TestRmiImageIDForceWithRunningContainersAndMultipleTags(c *check.C) { - dockerfile := "FROM busybox\nRUN echo test 14116\n" - imgID, err := buildImage("test-14116", dockerfile, false) - c.Assert(err, checker.IsNil) - - newTag := "newtag" - dockerCmd(c, "tag", imgID, newTag) - runSleepingContainerInImage(c, imgID) - - out, _, err := dockerCmdWithError("rmi", "-f", imgID) - // rmi -f should not delete image with running containers - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "(cannot be forced) - image is being used by running container") -} - -func (s *DockerSuite) TestRmiTagWithExistingContainers(c *check.C) { - container := "test-delete-tag" - newtag := "busybox:newtag" - bb := "busybox:latest" - dockerCmd(c, "tag", bb, newtag) - - dockerCmd(c, "run", "--name", container, bb, "/bin/true") - - out, _ := dockerCmd(c, "rmi", newtag) - c.Assert(strings.Count(out, "Untagged: "), checker.Equals, 1) -} - -func (s *DockerSuite) TestRmiForceWithExistingContainers(c *check.C) { - image := "busybox-clone" - - cmd := exec.Command(dockerBinary, "build", "--no-cache", "-t", image, "-") - cmd.Stdin = strings.NewReader(`FROM busybox -MAINTAINER foo`) - - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil, check.Commentf("Could not build %s: %s", image, out)) - - dockerCmd(c, "run", "--name", "test-force-rmi", image, "/bin/true") - - dockerCmd(c, "rmi", "-f", image) -} - -func (s *DockerSuite) TestRmiWithMultipleRepositories(c *check.C) { - newRepo := "127.0.0.1:5000/busybox" - oldRepo := "busybox" - newTag := "busybox:test" - dockerCmd(c, "tag", oldRepo, newRepo) - - dockerCmd(c, "run", "--name", "test", oldRepo, "touch", "/abcd") - - dockerCmd(c, "commit", "test", newTag) - - out, _ := dockerCmd(c, "rmi", newTag) - c.Assert(out, checker.Contains, "Untagged: "+newTag) -} - -func (s *DockerSuite) TestRmiForceWithMultipleRepositories(c *check.C) { - imageName := "rmiimage" - tag1 := imageName + ":tag1" - tag2 := imageName + ":tag2" - - _, err := buildImage(tag1, - `FROM busybox - MAINTAINER "docker"`, - true) - if err != nil { - c.Fatal(err) - } - - dockerCmd(c, "tag", tag1, tag2) - - out, _ := dockerCmd(c, "rmi", "-f", tag2) - c.Assert(out, checker.Contains, "Untagged: "+tag2) - c.Assert(out, checker.Not(checker.Contains), "Untagged: "+tag1) - - // Check built image still exists - images, _ := dockerCmd(c, "images", "-a") - c.Assert(images, checker.Contains, imageName, check.Commentf("Built image missing %q; Images: %q", imageName, images)) -} - -func (s *DockerSuite) TestRmiBlank(c *check.C) { - out, _, err := dockerCmdWithError("rmi", " ") - // Should have failed to delete ' ' image - c.Assert(err, checker.NotNil) - // Wrong error message generated - c.Assert(out, checker.Not(checker.Contains), "no such id", check.Commentf("out: %s", out)) - // Expected error message not generated - c.Assert(out, checker.Contains, "image name cannot be blank", check.Commentf("out: %s", out)) -} - -func (s *DockerSuite) TestRmiContainerImageNotFound(c *check.C) { - // Build 2 images for testing. - imageNames := []string{"test1", "test2"} - imageIds := make([]string, 2) - for i, name := range imageNames { - dockerfile := fmt.Sprintf("FROM busybox\nMAINTAINER %s\nRUN echo %s\n", name, name) - id, err := buildImage(name, dockerfile, false) - c.Assert(err, checker.IsNil) - imageIds[i] = id - } - - // Create a long-running container. - runSleepingContainerInImage(c, imageNames[0]) - - // Create a stopped container, and then force remove its image. - dockerCmd(c, "run", imageNames[1], "true") - dockerCmd(c, "rmi", "-f", imageIds[1]) - - // Try to remove the image of the running container and see if it fails as expected. - out, _, err := dockerCmdWithError("rmi", "-f", imageIds[0]) - // The image of the running container should not be removed. - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "image is being used by running container", check.Commentf("out: %s", out)) -} - -// #13422 -func (s *DockerSuite) TestRmiUntagHistoryLayer(c *check.C) { - image := "tmp1" - // Build an image for testing. - dockerfile := `FROM busybox -MAINTAINER foo -RUN echo 0 #layer0 -RUN echo 1 #layer1 -RUN echo 2 #layer2 -` - _, err := buildImage(image, dockerfile, false) - c.Assert(err, checker.IsNil) - - out, _ := dockerCmd(c, "history", "-q", image) - ids := strings.Split(out, "\n") - idToTag := ids[2] - - // Tag layer0 to "tmp2". - newTag := "tmp2" - dockerCmd(c, "tag", idToTag, newTag) - // Create a container based on "tmp1". - dockerCmd(c, "run", "-d", image, "true") - - // See if the "tmp2" can be untagged. - out, _ = dockerCmd(c, "rmi", newTag) - // Expected 1 untagged entry - c.Assert(strings.Count(out, "Untagged: "), checker.Equals, 1, check.Commentf("out: %s", out)) - - // Now let's add the tag again and create a container based on it. - dockerCmd(c, "tag", idToTag, newTag) - out, _ = dockerCmd(c, "run", "-d", newTag, "true") - cid := strings.TrimSpace(out) - - // At this point we have 2 containers, one based on layer2 and another based on layer0. - // Try to untag "tmp2" without the -f flag. - out, _, err = dockerCmdWithError("rmi", newTag) - // should not be untagged without the -f flag - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, cid[:12]) - c.Assert(out, checker.Contains, "(must force)") - - // Add the -f flag and test again. - out, _ = dockerCmd(c, "rmi", "-f", newTag) - // should be allowed to untag with the -f flag - c.Assert(out, checker.Contains, fmt.Sprintf("Untagged: %s:latest", newTag)) -} - -func (*DockerSuite) TestRmiParentImageFail(c *check.C) { - _, err := buildImage("test", ` - FROM busybox - RUN echo hello`, false) - c.Assert(err, checker.IsNil) - - id := inspectField(c, "busybox", "ID") - out, _, err := dockerCmdWithError("rmi", id) - c.Assert(err, check.NotNil) - if !strings.Contains(out, "image has dependent child images") { - c.Fatalf("rmi should have failed because it's a parent image, got %s", out) - } -} - -func (s *DockerSuite) TestRmiWithParentInUse(c *check.C) { - out, _ := dockerCmd(c, "create", "busybox") - cID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "commit", cID) - imageID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "create", imageID) - cID = strings.TrimSpace(out) - - out, _ = dockerCmd(c, "commit", cID) - imageID = strings.TrimSpace(out) - - dockerCmd(c, "rmi", imageID) -} - -// #18873 -func (s *DockerSuite) TestRmiByIDHardConflict(c *check.C) { - dockerCmd(c, "create", "busybox") - - imgID := inspectField(c, "busybox:latest", "Id") - - _, _, err := dockerCmdWithError("rmi", imgID[:12]) - c.Assert(err, checker.NotNil) - - // check that tag was not removed - imgID2 := inspectField(c, "busybox:latest", "Id") - c.Assert(imgID, checker.Equals, imgID2) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_run_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_run_test.go deleted file mode 100644 index 9462aef80..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_run_test.go +++ /dev/null @@ -1,4689 +0,0 @@ -package main - -import ( - "bufio" - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net" - "os" - "os/exec" - "path" - "path/filepath" - "reflect" - "regexp" - "runtime" - "sort" - "strconv" - "strings" - "sync" - "time" - - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/stringutils" - "github.com/docker/docker/runconfig" - "github.com/docker/go-connections/nat" - "github.com/docker/libnetwork/resolvconf" - "github.com/docker/libnetwork/types" - "github.com/go-check/check" - libcontainerUser "github.com/opencontainers/runc/libcontainer/user" -) - -// "test123" should be printed by docker run -func (s *DockerSuite) TestRunEchoStdout(c *check.C) { - out, _ := dockerCmd(c, "run", "busybox", "echo", "test123") - if out != "test123\n" { - c.Fatalf("container should've printed 'test123', got '%s'", out) - } -} - -// "test" should be printed -func (s *DockerSuite) TestRunEchoNamedContainer(c *check.C) { - out, _ := dockerCmd(c, "run", "--name", "testfoonamedcontainer", "busybox", "echo", "test") - if out != "test\n" { - c.Errorf("container should've printed 'test'") - } -} - -// docker run should not leak file descriptors. This test relies on Unix -// specific functionality and cannot run on Windows. -func (s *DockerSuite) TestRunLeakyFileDescriptors(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "busybox", "ls", "-C", "/proc/self/fd") - - // normally, we should only get 0, 1, and 2, but 3 gets created by "ls" when it does "opendir" on the "fd" directory - if out != "0 1 2 3\n" { - c.Errorf("container should've printed '0 1 2 3', not: %s", out) - } -} - -// it should be possible to lookup Google DNS -// this will fail when Internet access is unavailable -func (s *DockerSuite) TestRunLookupGoogleDNS(c *check.C) { - testRequires(c, Network, NotArm) - if daemonPlatform == "windows" { - // nslookup isn't present in Windows busybox. Is built-in. Further, - // nslookup isn't present in nanoserver. Hence just use PowerShell... - dockerCmd(c, "run", WindowsBaseImage, "powershell", "Resolve-DNSName", "google.com") - } else { - dockerCmd(c, "run", DefaultImage, "nslookup", "google.com") - } - -} - -// the exit code should be 0 -func (s *DockerSuite) TestRunExitCodeZero(c *check.C) { - dockerCmd(c, "run", "busybox", "true") -} - -// the exit code should be 1 -func (s *DockerSuite) TestRunExitCodeOne(c *check.C) { - _, exitCode, err := dockerCmdWithError("run", "busybox", "false") - c.Assert(err, checker.NotNil) - c.Assert(exitCode, checker.Equals, 1) -} - -// it should be possible to pipe in data via stdin to a process running in a container -func (s *DockerSuite) TestRunStdinPipe(c *check.C) { - // TODO Windows: This needs some work to make compatible. - testRequires(c, DaemonIsLinux) - runCmd := exec.Command(dockerBinary, "run", "-i", "-a", "stdin", "busybox", "cat") - runCmd.Stdin = strings.NewReader("blahblah") - out, _, _, err := runCommandWithStdoutStderr(runCmd) - if err != nil { - c.Fatalf("failed to run container: %v, output: %q", err, out) - } - - out = strings.TrimSpace(out) - dockerCmd(c, "wait", out) - - logsOut, _ := dockerCmd(c, "logs", out) - - containerLogs := strings.TrimSpace(logsOut) - if containerLogs != "blahblah" { - c.Errorf("logs didn't print the container's logs %s", containerLogs) - } - - dockerCmd(c, "rm", out) -} - -// the container's ID should be printed when starting a container in detached mode -func (s *DockerSuite) TestRunDetachedContainerIDPrinting(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "true") - - out = strings.TrimSpace(out) - dockerCmd(c, "wait", out) - - rmOut, _ := dockerCmd(c, "rm", out) - - rmOut = strings.TrimSpace(rmOut) - if rmOut != out { - c.Errorf("rm didn't print the container ID %s %s", out, rmOut) - } -} - -// the working directory should be set correctly -func (s *DockerSuite) TestRunWorkingDirectory(c *check.C) { - dir := "/root" - image := "busybox" - if daemonPlatform == "windows" { - dir = `C:/Windows` - } - - // First with -w - out, _ := dockerCmd(c, "run", "-w", dir, image, "pwd") - out = strings.TrimSpace(out) - if out != dir { - c.Errorf("-w failed to set working directory") - } - - // Then with --workdir - out, _ = dockerCmd(c, "run", "--workdir", dir, image, "pwd") - out = strings.TrimSpace(out) - if out != dir { - c.Errorf("--workdir failed to set working directory") - } -} - -// pinging Google's DNS resolver should fail when we disable the networking -func (s *DockerSuite) TestRunWithoutNetworking(c *check.C) { - count := "-c" - image := "busybox" - if daemonPlatform == "windows" { - count = "-n" - image = WindowsBaseImage - } - - // First using the long form --net - out, exitCode, err := dockerCmdWithError("run", "--net=none", image, "ping", count, "1", "8.8.8.8") - if err != nil && exitCode != 1 { - c.Fatal(out, err) - } - if exitCode != 1 { - c.Errorf("--net=none should've disabled the network; the container shouldn't have been able to ping 8.8.8.8") - } -} - -//test --link use container name to link target -func (s *DockerSuite) TestRunLinksContainerWithContainerName(c *check.C) { - // TODO Windows: This test cannot run on a Windows daemon as the networking - // settings are not populated back yet on inspect. - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-i", "-t", "-d", "--name", "parent", "busybox") - - ip := inspectField(c, "parent", "NetworkSettings.Networks.bridge.IPAddress") - - out, _ := dockerCmd(c, "run", "--link", "parent:test", "busybox", "/bin/cat", "/etc/hosts") - if !strings.Contains(out, ip+" test") { - c.Fatalf("use a container name to link target failed") - } -} - -//test --link use container id to link target -func (s *DockerSuite) TestRunLinksContainerWithContainerID(c *check.C) { - // TODO Windows: This test cannot run on a Windows daemon as the networking - // settings are not populated back yet on inspect. - testRequires(c, DaemonIsLinux) - cID, _ := dockerCmd(c, "run", "-i", "-t", "-d", "busybox") - - cID = strings.TrimSpace(cID) - ip := inspectField(c, cID, "NetworkSettings.Networks.bridge.IPAddress") - - out, _ := dockerCmd(c, "run", "--link", cID+":test", "busybox", "/bin/cat", "/etc/hosts") - if !strings.Contains(out, ip+" test") { - c.Fatalf("use a container id to link target failed") - } -} - -func (s *DockerSuite) TestUserDefinedNetworkLinks(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - dockerCmd(c, "network", "create", "-d", "bridge", "udlinkNet") - - dockerCmd(c, "run", "-d", "--net=udlinkNet", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - - // run a container in user-defined network udlinkNet with a link for an existing container - // and a link for a container that doesn't exist - dockerCmd(c, "run", "-d", "--net=udlinkNet", "--name=second", "--link=first:foo", - "--link=third:bar", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // ping to first and its alias foo must succeed - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo") - c.Assert(err, check.IsNil) - - // ping to third and its alias must fail - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "third") - c.Assert(err, check.NotNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "bar") - c.Assert(err, check.NotNil) - - // start third container now - dockerCmd(c, "run", "-d", "--net=udlinkNet", "--name=third", "busybox", "top") - c.Assert(waitRun("third"), check.IsNil) - - // ping to third and its alias must succeed now - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "third") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "bar") - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestUserDefinedNetworkLinksWithRestart(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - dockerCmd(c, "network", "create", "-d", "bridge", "udlinkNet") - - dockerCmd(c, "run", "-d", "--net=udlinkNet", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - - dockerCmd(c, "run", "-d", "--net=udlinkNet", "--name=second", "--link=first:foo", - "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // ping to first and its alias foo must succeed - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo") - c.Assert(err, check.IsNil) - - // Restart first container - dockerCmd(c, "restart", "first") - c.Assert(waitRun("first"), check.IsNil) - - // ping to first and its alias foo must still succeed - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo") - c.Assert(err, check.IsNil) - - // Restart second container - dockerCmd(c, "restart", "second") - c.Assert(waitRun("second"), check.IsNil) - - // ping to first and its alias foo must still succeed - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo") - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestRunWithNetAliasOnDefaultNetworks(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - - defaults := []string{"bridge", "host", "none"} - for _, net := range defaults { - out, _, err := dockerCmdWithError("run", "-d", "--net", net, "--net-alias", "alias_"+net, "busybox", "top") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, runconfig.ErrUnsupportedNetworkAndAlias.Error()) - } -} - -func (s *DockerSuite) TestUserDefinedNetworkAlias(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - dockerCmd(c, "network", "create", "-d", "bridge", "net1") - - cid1, _ := dockerCmd(c, "run", "-d", "--net=net1", "--name=first", "--net-alias=foo1", "--net-alias=foo2", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - - // Check if default short-id alias is added automatically - id := strings.TrimSpace(cid1) - aliases := inspectField(c, id, "NetworkSettings.Networks.net1.Aliases") - c.Assert(aliases, checker.Contains, stringid.TruncateID(id)) - - cid2, _ := dockerCmd(c, "run", "-d", "--net=net1", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // Check if default short-id alias is added automatically - id = strings.TrimSpace(cid2) - aliases = inspectField(c, id, "NetworkSettings.Networks.net1.Aliases") - c.Assert(aliases, checker.Contains, stringid.TruncateID(id)) - - // ping to first and its network-scoped aliases - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo1") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo2") - c.Assert(err, check.IsNil) - // ping first container's short-id alias - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", stringid.TruncateID(cid1)) - c.Assert(err, check.IsNil) - - // Restart first container - dockerCmd(c, "restart", "first") - c.Assert(waitRun("first"), check.IsNil) - - // ping to first and its network-scoped aliases must succeed - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo1") - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "foo2") - c.Assert(err, check.IsNil) - // ping first container's short-id alias - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", stringid.TruncateID(cid1)) - c.Assert(err, check.IsNil) -} - -// Issue 9677. -func (s *DockerSuite) TestRunWithDaemonFlags(c *check.C) { - out, _, err := dockerCmdWithError("--exec-opt", "foo=bar", "run", "-i", "busybox", "true") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "unknown flag: --exec-opt") -} - -// Regression test for #4979 -func (s *DockerSuite) TestRunWithVolumesFromExited(c *check.C) { - - var ( - out string - exitCode int - ) - - // Create a file in a volume - if daemonPlatform == "windows" { - out, exitCode = dockerCmd(c, "run", "--name", "test-data", "--volume", `c:\some\dir`, WindowsBaseImage, "cmd", "/c", `echo hello > c:\some\dir\file`) - } else { - out, exitCode = dockerCmd(c, "run", "--name", "test-data", "--volume", "/some/dir", "busybox", "touch", "/some/dir/file") - } - if exitCode != 0 { - c.Fatal("1", out, exitCode) - } - - // Read the file from another container using --volumes-from to access the volume in the second container - if daemonPlatform == "windows" { - out, exitCode = dockerCmd(c, "run", "--volumes-from", "test-data", WindowsBaseImage, "cmd", "/c", `type c:\some\dir\file`) - } else { - out, exitCode = dockerCmd(c, "run", "--volumes-from", "test-data", "busybox", "cat", "/some/dir/file") - } - if exitCode != 0 { - c.Fatal("2", out, exitCode) - } -} - -// Volume path is a symlink which also exists on the host, and the host side is a file not a dir -// But the volume call is just a normal volume, not a bind mount -func (s *DockerSuite) TestRunCreateVolumesInSymlinkDir(c *check.C) { - var ( - dockerFile string - containerPath string - cmd string - ) - // TODO Windows (Post TP5): This test cannot run on a Windows daemon as - // Windows does not support symlinks inside a volume path - testRequires(c, SameHostDaemon, DaemonIsLinux) - name := "test-volume-symlink" - - dir, err := ioutil.TempDir("", name) - if err != nil { - c.Fatal(err) - } - defer os.RemoveAll(dir) - - // In the case of Windows to Windows CI, if the machine is setup so that - // the temp directory is not the C: drive, this test is invalid and will - // not work. - if daemonPlatform == "windows" && strings.ToLower(dir[:1]) != "c" { - c.Skip("Requires TEMP to point to C: drive") - } - - f, err := os.OpenFile(filepath.Join(dir, "test"), os.O_CREATE, 0700) - if err != nil { - c.Fatal(err) - } - f.Close() - - if daemonPlatform == "windows" { - dockerFile = fmt.Sprintf("FROM %s\nRUN mkdir %s\nRUN mklink /D c:\\test %s", WindowsBaseImage, dir, dir) - containerPath = `c:\test\test` - cmd = "tasklist" - } else { - dockerFile = fmt.Sprintf("FROM busybox\nRUN mkdir -p %s\nRUN ln -s %s /test", dir, dir) - containerPath = "/test/test" - cmd = "true" - } - if _, err := buildImage(name, dockerFile, false); err != nil { - c.Fatal(err) - } - - dockerCmd(c, "run", "-v", containerPath, name, cmd) -} - -// Volume path is a symlink in the container -func (s *DockerSuite) TestRunCreateVolumesInSymlinkDir2(c *check.C) { - var ( - dockerFile string - containerPath string - cmd string - ) - // TODO Windows (Post TP5): This test cannot run on a Windows daemon as - // Windows does not support symlinks inside a volume path - testRequires(c, SameHostDaemon, DaemonIsLinux) - name := "test-volume-symlink2" - - if daemonPlatform == "windows" { - dockerFile = fmt.Sprintf("FROM %s\nRUN mkdir c:\\%s\nRUN mklink /D c:\\test c:\\%s", WindowsBaseImage, name, name) - containerPath = `c:\test\test` - cmd = "tasklist" - } else { - dockerFile = fmt.Sprintf("FROM busybox\nRUN mkdir -p /%s\nRUN ln -s /%s /test", name, name) - containerPath = "/test/test" - cmd = "true" - } - if _, err := buildImage(name, dockerFile, false); err != nil { - c.Fatal(err) - } - - dockerCmd(c, "run", "-v", containerPath, name, cmd) -} - -func (s *DockerSuite) TestRunVolumesMountedAsReadonly(c *check.C) { - // TODO Windows: Temporary check - remove once TP5 support is dropped - if daemonPlatform == "windows" && windowsDaemonKV < 14350 { - c.Skip("Needs later Windows build for RO volumes") - } - if _, code, err := dockerCmdWithError("run", "-v", "/test:/test:ro", "busybox", "touch", "/test/somefile"); err == nil || code == 0 { - c.Fatalf("run should fail because volume is ro: exit code %d", code) - } -} - -func (s *DockerSuite) TestRunVolumesFromInReadonlyModeFails(c *check.C) { - // TODO Windows: Temporary check - remove once TP5 support is dropped - if daemonPlatform == "windows" && windowsDaemonKV < 14350 { - c.Skip("Needs later Windows build for RO volumes") - } - var ( - volumeDir string - fileInVol string - ) - if daemonPlatform == "windows" { - volumeDir = `c:/test` // Forward-slash as using busybox - fileInVol = `c:/test/file` - } else { - testRequires(c, DaemonIsLinux) - volumeDir = "/test" - fileInVol = `/test/file` - } - dockerCmd(c, "run", "--name", "parent", "-v", volumeDir, "busybox", "true") - - if _, code, err := dockerCmdWithError("run", "--volumes-from", "parent:ro", "busybox", "touch", fileInVol); err == nil || code == 0 { - c.Fatalf("run should fail because volume is ro: exit code %d", code) - } -} - -// Regression test for #1201 -func (s *DockerSuite) TestRunVolumesFromInReadWriteMode(c *check.C) { - var ( - volumeDir string - fileInVol string - ) - if daemonPlatform == "windows" { - volumeDir = `c:/test` // Forward-slash as using busybox - fileInVol = `c:/test/file` - } else { - volumeDir = "/test" - fileInVol = "/test/file" - } - - dockerCmd(c, "run", "--name", "parent", "-v", volumeDir, "busybox", "true") - dockerCmd(c, "run", "--volumes-from", "parent:rw", "busybox", "touch", fileInVol) - - if out, _, err := dockerCmdWithError("run", "--volumes-from", "parent:bar", "busybox", "touch", fileInVol); err == nil || !strings.Contains(out, `invalid mode: bar`) { - c.Fatalf("running --volumes-from parent:bar should have failed with invalid mode: %q", out) - } - - dockerCmd(c, "run", "--volumes-from", "parent", "busybox", "touch", fileInVol) -} - -func (s *DockerSuite) TestVolumesFromGetsProperMode(c *check.C) { - testRequires(c, SameHostDaemon) - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - hostpath := randomTmpDirPath("test", daemonPlatform) - if err := os.MkdirAll(hostpath, 0755); err != nil { - c.Fatalf("Failed to create %s: %q", hostpath, err) - } - defer os.RemoveAll(hostpath) - - // TODO Windows: Temporary check - remove once TP5 support is dropped - if daemonPlatform == "windows" && windowsDaemonKV < 14350 { - c.Skip("Needs later Windows build for RO volumes") - } - dockerCmd(c, "run", "--name", "parent", "-v", hostpath+":"+prefix+slash+"test:ro", "busybox", "true") - - // Expect this "rw" mode to be be ignored since the inherited volume is "ro" - if _, _, err := dockerCmdWithError("run", "--volumes-from", "parent:rw", "busybox", "touch", prefix+slash+"test"+slash+"file"); err == nil { - c.Fatal("Expected volumes-from to inherit read-only volume even when passing in `rw`") - } - - dockerCmd(c, "run", "--name", "parent2", "-v", hostpath+":"+prefix+slash+"test:ro", "busybox", "true") - - // Expect this to be read-only since both are "ro" - if _, _, err := dockerCmdWithError("run", "--volumes-from", "parent2:ro", "busybox", "touch", prefix+slash+"test"+slash+"file"); err == nil { - c.Fatal("Expected volumes-from to inherit read-only volume even when passing in `ro`") - } -} - -// Test for GH#10618 -func (s *DockerSuite) TestRunNoDupVolumes(c *check.C) { - path1 := randomTmpDirPath("test1", daemonPlatform) - path2 := randomTmpDirPath("test2", daemonPlatform) - - someplace := ":/someplace" - if daemonPlatform == "windows" { - // Windows requires that the source directory exists before calling HCS - testRequires(c, SameHostDaemon) - someplace = `:c:\someplace` - if err := os.MkdirAll(path1, 0755); err != nil { - c.Fatalf("Failed to create %s: %q", path1, err) - } - defer os.RemoveAll(path1) - if err := os.MkdirAll(path2, 0755); err != nil { - c.Fatalf("Failed to create %s: %q", path1, err) - } - defer os.RemoveAll(path2) - } - mountstr1 := path1 + someplace - mountstr2 := path2 + someplace - - if out, _, err := dockerCmdWithError("run", "-v", mountstr1, "-v", mountstr2, "busybox", "true"); err == nil { - c.Fatal("Expected error about duplicate mount definitions") - } else { - if !strings.Contains(out, "Duplicate mount point") { - c.Fatalf("Expected 'duplicate mount point' error, got %v", out) - } - } - - // Test for https://github.com/docker/docker/issues/22093 - volumename1 := "test1" - volumename2 := "test2" - volume1 := volumename1 + someplace - volume2 := volumename2 + someplace - if out, _, err := dockerCmdWithError("run", "-v", volume1, "-v", volume2, "busybox", "true"); err == nil { - c.Fatal("Expected error about duplicate mount definitions") - } else { - if !strings.Contains(out, "Duplicate mount point") { - c.Fatalf("Expected 'duplicate mount point' error, got %v", out) - } - } - // create failed should have create volume volumename1 or volumename2 - // we should remove volumename2 or volumename2 successfully - out, _ := dockerCmd(c, "volume", "ls") - if strings.Contains(out, volumename1) { - dockerCmd(c, "volume", "rm", volumename1) - } else { - dockerCmd(c, "volume", "rm", volumename2) - } -} - -// Test for #1351 -func (s *DockerSuite) TestRunApplyVolumesFromBeforeVolumes(c *check.C) { - prefix := "" - if daemonPlatform == "windows" { - prefix = `c:` - } - dockerCmd(c, "run", "--name", "parent", "-v", prefix+"/test", "busybox", "touch", prefix+"/test/foo") - dockerCmd(c, "run", "--volumes-from", "parent", "-v", prefix+"/test", "busybox", "cat", prefix+"/test/foo") -} - -func (s *DockerSuite) TestRunMultipleVolumesFrom(c *check.C) { - prefix := "" - if daemonPlatform == "windows" { - prefix = `c:` - } - dockerCmd(c, "run", "--name", "parent1", "-v", prefix+"/test", "busybox", "touch", prefix+"/test/foo") - dockerCmd(c, "run", "--name", "parent2", "-v", prefix+"/other", "busybox", "touch", prefix+"/other/bar") - dockerCmd(c, "run", "--volumes-from", "parent1", "--volumes-from", "parent2", "busybox", "sh", "-c", "cat /test/foo && cat /other/bar") -} - -// this tests verifies the ID format for the container -func (s *DockerSuite) TestRunVerifyContainerID(c *check.C) { - out, exit, err := dockerCmdWithError("run", "-d", "busybox", "true") - if err != nil { - c.Fatal(err) - } - if exit != 0 { - c.Fatalf("expected exit code 0 received %d", exit) - } - - match, err := regexp.MatchString("^[0-9a-f]{64}$", strings.TrimSuffix(out, "\n")) - if err != nil { - c.Fatal(err) - } - if !match { - c.Fatalf("Invalid container ID: %s", out) - } -} - -// Test that creating a container with a volume doesn't crash. Regression test for #995. -func (s *DockerSuite) TestRunCreateVolume(c *check.C) { - prefix := "" - if daemonPlatform == "windows" { - prefix = `c:` - } - dockerCmd(c, "run", "-v", prefix+"/var/lib/data", "busybox", "true") -} - -// Test that creating a volume with a symlink in its path works correctly. Test for #5152. -// Note that this bug happens only with symlinks with a target that starts with '/'. -func (s *DockerSuite) TestRunCreateVolumeWithSymlink(c *check.C) { - // Cannot run on Windows as relies on Linux-specific functionality (sh -c mount...) - testRequires(c, DaemonIsLinux) - image := "docker-test-createvolumewithsymlink" - - buildCmd := exec.Command(dockerBinary, "build", "-t", image, "-") - buildCmd.Stdin = strings.NewReader(`FROM busybox - RUN ln -s home /bar`) - buildCmd.Dir = workingDirectory - err := buildCmd.Run() - if err != nil { - c.Fatalf("could not build '%s': %v", image, err) - } - - _, exitCode, err := dockerCmdWithError("run", "-v", "/bar/foo", "--name", "test-createvolumewithsymlink", image, "sh", "-c", "mount | grep -q /home/foo") - if err != nil || exitCode != 0 { - c.Fatalf("[run] err: %v, exitcode: %d", err, exitCode) - } - - volPath, err := inspectMountSourceField("test-createvolumewithsymlink", "/bar/foo") - c.Assert(err, checker.IsNil) - - _, exitCode, err = dockerCmdWithError("rm", "-v", "test-createvolumewithsymlink") - if err != nil || exitCode != 0 { - c.Fatalf("[rm] err: %v, exitcode: %d", err, exitCode) - } - - _, err = os.Stat(volPath) - if !os.IsNotExist(err) { - c.Fatalf("[open] (expecting 'file does not exist' error) err: %v, volPath: %s", err, volPath) - } -} - -// Tests that a volume path that has a symlink exists in a container mounting it with `--volumes-from`. -func (s *DockerSuite) TestRunVolumesFromSymlinkPath(c *check.C) { - // TODO Windows (Post TP5): This test cannot run on a Windows daemon as - // Windows does not support symlinks inside a volume path - testRequires(c, DaemonIsLinux) - name := "docker-test-volumesfromsymlinkpath" - prefix := "" - dfContents := `FROM busybox - RUN ln -s home /foo - VOLUME ["/foo/bar"]` - - if daemonPlatform == "windows" { - prefix = `c:` - dfContents = `FROM ` + WindowsBaseImage + ` - RUN mkdir c:\home - RUN mklink /D c:\foo c:\home - VOLUME ["c:/foo/bar"] - ENTRYPOINT c:\windows\system32\cmd.exe` - } - - buildCmd := exec.Command(dockerBinary, "build", "-t", name, "-") - buildCmd.Stdin = strings.NewReader(dfContents) - buildCmd.Dir = workingDirectory - err := buildCmd.Run() - if err != nil { - c.Fatalf("could not build 'docker-test-volumesfromsymlinkpath': %v", err) - } - - out, exitCode, err := dockerCmdWithError("run", "--name", "test-volumesfromsymlinkpath", name) - if err != nil || exitCode != 0 { - c.Fatalf("[run] (volume) err: %v, exitcode: %d, out: %s", err, exitCode, out) - } - - _, exitCode, err = dockerCmdWithError("run", "--volumes-from", "test-volumesfromsymlinkpath", "busybox", "sh", "-c", "ls "+prefix+"/foo | grep -q bar") - if err != nil || exitCode != 0 { - c.Fatalf("[run] err: %v, exitcode: %d", err, exitCode) - } -} - -func (s *DockerSuite) TestRunExitCode(c *check.C) { - var ( - exit int - err error - ) - - _, exit, err = dockerCmdWithError("run", "busybox", "/bin/sh", "-c", "exit 72") - - if err == nil { - c.Fatal("should not have a non nil error") - } - if exit != 72 { - c.Fatalf("expected exit code 72 received %d", exit) - } -} - -func (s *DockerSuite) TestRunUserDefaults(c *check.C) { - expected := "uid=0(root) gid=0(root)" - if daemonPlatform == "windows" { - expected = "uid=1000(ContainerAdministrator) gid=1000(ContainerAdministrator)" - } - out, _ := dockerCmd(c, "run", "busybox", "id") - if !strings.Contains(out, expected) { - c.Fatalf("expected '%s' got %s", expected, out) - } -} - -func (s *DockerSuite) TestRunUserByName(c *check.C) { - // TODO Windows: This test cannot run on a Windows daemon as Windows does - // not support the use of -u - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-u", "root", "busybox", "id") - if !strings.Contains(out, "uid=0(root) gid=0(root)") { - c.Fatalf("expected root user got %s", out) - } -} - -func (s *DockerSuite) TestRunUserByID(c *check.C) { - // TODO Windows: This test cannot run on a Windows daemon as Windows does - // not support the use of -u - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-u", "1", "busybox", "id") - if !strings.Contains(out, "uid=1(daemon) gid=1(daemon)") { - c.Fatalf("expected daemon user got %s", out) - } -} - -func (s *DockerSuite) TestRunUserByIDBig(c *check.C) { - // TODO Windows: This test cannot run on a Windows daemon as Windows does - // not support the use of -u - testRequires(c, DaemonIsLinux, NotArm) - out, _, err := dockerCmdWithError("run", "-u", "2147483648", "busybox", "id") - if err == nil { - c.Fatal("No error, but must be.", out) - } - if !strings.Contains(strings.ToUpper(out), strings.ToUpper(libcontainerUser.ErrRange.Error())) { - c.Fatalf("expected error about uids range, got %s", out) - } -} - -func (s *DockerSuite) TestRunUserByIDNegative(c *check.C) { - // TODO Windows: This test cannot run on a Windows daemon as Windows does - // not support the use of -u - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "-u", "-1", "busybox", "id") - if err == nil { - c.Fatal("No error, but must be.", out) - } - if !strings.Contains(strings.ToUpper(out), strings.ToUpper(libcontainerUser.ErrRange.Error())) { - c.Fatalf("expected error about uids range, got %s", out) - } -} - -func (s *DockerSuite) TestRunUserByIDZero(c *check.C) { - // TODO Windows: This test cannot run on a Windows daemon as Windows does - // not support the use of -u - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "-u", "0", "busybox", "id") - if err != nil { - c.Fatal(err, out) - } - if !strings.Contains(out, "uid=0(root) gid=0(root) groups=10(wheel)") { - c.Fatalf("expected daemon user got %s", out) - } -} - -func (s *DockerSuite) TestRunUserNotFound(c *check.C) { - // TODO Windows: This test cannot run on a Windows daemon as Windows does - // not support the use of -u - testRequires(c, DaemonIsLinux) - _, _, err := dockerCmdWithError("run", "-u", "notme", "busybox", "id") - if err == nil { - c.Fatal("unknown user should cause container to fail") - } -} - -func (s *DockerSuite) TestRunTwoConcurrentContainers(c *check.C) { - sleepTime := "2" - group := sync.WaitGroup{} - group.Add(2) - - errChan := make(chan error, 2) - for i := 0; i < 2; i++ { - go func() { - defer group.Done() - _, _, err := dockerCmdWithError("run", "busybox", "sleep", sleepTime) - errChan <- err - }() - } - - group.Wait() - close(errChan) - - for err := range errChan { - c.Assert(err, check.IsNil) - } -} - -func (s *DockerSuite) TestRunEnvironment(c *check.C) { - // TODO Windows: Environment handling is different between Linux and - // Windows and this test relies currently on unix functionality. - testRequires(c, DaemonIsLinux) - cmd := exec.Command(dockerBinary, "run", "-h", "testing", "-e=FALSE=true", "-e=TRUE", "-e=TRICKY", "-e=HOME=", "busybox", "env") - cmd.Env = append(os.Environ(), - "TRUE=false", - "TRICKY=tri\ncky\n", - ) - - out, _, err := runCommandWithOutput(cmd) - if err != nil { - c.Fatal(err, out) - } - - actualEnv := strings.Split(strings.TrimSpace(out), "\n") - sort.Strings(actualEnv) - - goodEnv := []string{ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "HOSTNAME=testing", - "FALSE=true", - "TRUE=false", - "TRICKY=tri", - "cky", - "", - "HOME=/root", - } - sort.Strings(goodEnv) - if len(goodEnv) != len(actualEnv) { - c.Fatalf("Wrong environment: should be %d variables, not %d: %q", len(goodEnv), len(actualEnv), strings.Join(actualEnv, ", ")) - } - for i := range goodEnv { - if actualEnv[i] != goodEnv[i] { - c.Fatalf("Wrong environment variable: should be %s, not %s", goodEnv[i], actualEnv[i]) - } - } -} - -func (s *DockerSuite) TestRunEnvironmentErase(c *check.C) { - // TODO Windows: Environment handling is different between Linux and - // Windows and this test relies currently on unix functionality. - testRequires(c, DaemonIsLinux) - - // Test to make sure that when we use -e on env vars that are - // not set in our local env that they're removed (if present) in - // the container - - cmd := exec.Command(dockerBinary, "run", "-e", "FOO", "-e", "HOSTNAME", "busybox", "env") - cmd.Env = appendBaseEnv(true) - - out, _, err := runCommandWithOutput(cmd) - if err != nil { - c.Fatal(err, out) - } - - actualEnv := strings.Split(strings.TrimSpace(out), "\n") - sort.Strings(actualEnv) - - goodEnv := []string{ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "HOME=/root", - } - sort.Strings(goodEnv) - if len(goodEnv) != len(actualEnv) { - c.Fatalf("Wrong environment: should be %d variables, not %d: %q", len(goodEnv), len(actualEnv), strings.Join(actualEnv, ", ")) - } - for i := range goodEnv { - if actualEnv[i] != goodEnv[i] { - c.Fatalf("Wrong environment variable: should be %s, not %s", goodEnv[i], actualEnv[i]) - } - } -} - -func (s *DockerSuite) TestRunEnvironmentOverride(c *check.C) { - // TODO Windows: Environment handling is different between Linux and - // Windows and this test relies currently on unix functionality. - testRequires(c, DaemonIsLinux) - - // Test to make sure that when we use -e on env vars that are - // already in the env that we're overriding them - - cmd := exec.Command(dockerBinary, "run", "-e", "HOSTNAME", "-e", "HOME=/root2", "busybox", "env") - cmd.Env = appendBaseEnv(true, "HOSTNAME=bar") - - out, _, err := runCommandWithOutput(cmd) - if err != nil { - c.Fatal(err, out) - } - - actualEnv := strings.Split(strings.TrimSpace(out), "\n") - sort.Strings(actualEnv) - - goodEnv := []string{ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "HOME=/root2", - "HOSTNAME=bar", - } - sort.Strings(goodEnv) - if len(goodEnv) != len(actualEnv) { - c.Fatalf("Wrong environment: should be %d variables, not %d: %q", len(goodEnv), len(actualEnv), strings.Join(actualEnv, ", ")) - } - for i := range goodEnv { - if actualEnv[i] != goodEnv[i] { - c.Fatalf("Wrong environment variable: should be %s, not %s", goodEnv[i], actualEnv[i]) - } - } -} - -func (s *DockerSuite) TestRunContainerNetwork(c *check.C) { - if daemonPlatform == "windows" { - // Windows busybox does not have ping. Use built in ping instead. - dockerCmd(c, "run", WindowsBaseImage, "ping", "-n", "1", "127.0.0.1") - } else { - dockerCmd(c, "run", "busybox", "ping", "-c", "1", "127.0.0.1") - } -} - -func (s *DockerSuite) TestRunNetHostNotAllowedWithLinks(c *check.C) { - // TODO Windows: This is Linux specific as --link is not supported and - // this will be deprecated in favor of container networking model. - testRequires(c, DaemonIsLinux, NotUserNamespace) - dockerCmd(c, "run", "--name", "linked", "busybox", "true") - - _, _, err := dockerCmdWithError("run", "--net=host", "--link", "linked:linked", "busybox", "true") - if err == nil { - c.Fatal("Expected error") - } -} - -// #7851 hostname outside container shows FQDN, inside only shortname -// For testing purposes it is not required to set host's hostname directly -// and use "--net=host" (as the original issue submitter did), as the same -// codepath is executed with "docker run -h ". Both were manually -// tested, but this testcase takes the simpler path of using "run -h .." -func (s *DockerSuite) TestRunFullHostnameSet(c *check.C) { - // TODO Windows: -h is not yet functional. - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-h", "foo.bar.baz", "busybox", "hostname") - if actual := strings.Trim(out, "\r\n"); actual != "foo.bar.baz" { - c.Fatalf("expected hostname 'foo.bar.baz', received %s", actual) - } -} - -func (s *DockerSuite) TestRunPrivilegedCanMknod(c *check.C) { - // Not applicable for Windows as Windows daemon does not support - // the concept of --privileged, and mknod is a Unix concept. - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, _ := dockerCmd(c, "run", "--privileged", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok") - if actual := strings.Trim(out, "\r\n"); actual != "ok" { - c.Fatalf("expected output ok received %s", actual) - } -} - -func (s *DockerSuite) TestRunUnprivilegedCanMknod(c *check.C) { - // Not applicable for Windows as Windows daemon does not support - // the concept of --privileged, and mknod is a Unix concept. - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, _ := dockerCmd(c, "run", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok") - if actual := strings.Trim(out, "\r\n"); actual != "ok" { - c.Fatalf("expected output ok received %s", actual) - } -} - -func (s *DockerSuite) TestRunCapDropInvalid(c *check.C) { - // Not applicable for Windows as there is no concept of --cap-drop - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "--cap-drop=CHPASS", "busybox", "ls") - if err == nil { - c.Fatal(err, out) - } -} - -func (s *DockerSuite) TestRunCapDropCannotMknod(c *check.C) { - // Not applicable for Windows as there is no concept of --cap-drop or mknod - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "--cap-drop=MKNOD", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok") - - if err == nil { - c.Fatal(err, out) - } - if actual := strings.Trim(out, "\r\n"); actual == "ok" { - c.Fatalf("expected output not ok received %s", actual) - } -} - -func (s *DockerSuite) TestRunCapDropCannotMknodLowerCase(c *check.C) { - // Not applicable for Windows as there is no concept of --cap-drop or mknod - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "--cap-drop=mknod", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok") - - if err == nil { - c.Fatal(err, out) - } - if actual := strings.Trim(out, "\r\n"); actual == "ok" { - c.Fatalf("expected output not ok received %s", actual) - } -} - -func (s *DockerSuite) TestRunCapDropALLCannotMknod(c *check.C) { - // Not applicable for Windows as there is no concept of --cap-drop or mknod - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "--cap-drop=ALL", "--cap-add=SETGID", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok") - if err == nil { - c.Fatal(err, out) - } - if actual := strings.Trim(out, "\r\n"); actual == "ok" { - c.Fatalf("expected output not ok received %s", actual) - } -} - -func (s *DockerSuite) TestRunCapDropALLAddMknodCanMknod(c *check.C) { - // Not applicable for Windows as there is no concept of --cap-drop or mknod - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, _ := dockerCmd(c, "run", "--cap-drop=ALL", "--cap-add=MKNOD", "--cap-add=SETGID", "busybox", "sh", "-c", "mknod /tmp/sda b 8 0 && echo ok") - - if actual := strings.Trim(out, "\r\n"); actual != "ok" { - c.Fatalf("expected output ok received %s", actual) - } -} - -func (s *DockerSuite) TestRunCapAddInvalid(c *check.C) { - // Not applicable for Windows as there is no concept of --cap-add - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "--cap-add=CHPASS", "busybox", "ls") - if err == nil { - c.Fatal(err, out) - } -} - -func (s *DockerSuite) TestRunCapAddCanDownInterface(c *check.C) { - // Not applicable for Windows as there is no concept of --cap-add - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "--cap-add=NET_ADMIN", "busybox", "sh", "-c", "ip link set eth0 down && echo ok") - - if actual := strings.Trim(out, "\r\n"); actual != "ok" { - c.Fatalf("expected output ok received %s", actual) - } -} - -func (s *DockerSuite) TestRunCapAddALLCanDownInterface(c *check.C) { - // Not applicable for Windows as there is no concept of --cap-add - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "--cap-add=ALL", "busybox", "sh", "-c", "ip link set eth0 down && echo ok") - - if actual := strings.Trim(out, "\r\n"); actual != "ok" { - c.Fatalf("expected output ok received %s", actual) - } -} - -func (s *DockerSuite) TestRunCapAddALLDropNetAdminCanDownInterface(c *check.C) { - // Not applicable for Windows as there is no concept of --cap-add - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "--cap-add=ALL", "--cap-drop=NET_ADMIN", "busybox", "sh", "-c", "ip link set eth0 down && echo ok") - if err == nil { - c.Fatal(err, out) - } - if actual := strings.Trim(out, "\r\n"); actual == "ok" { - c.Fatalf("expected output not ok received %s", actual) - } -} - -func (s *DockerSuite) TestRunGroupAdd(c *check.C) { - // Not applicable for Windows as there is no concept of --group-add - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "--group-add=audio", "--group-add=staff", "--group-add=777", "busybox", "sh", "-c", "id") - - groupsList := "uid=0(root) gid=0(root) groups=10(wheel),29(audio),50(staff),777" - if actual := strings.Trim(out, "\r\n"); actual != groupsList { - c.Fatalf("expected output %s received %s", groupsList, actual) - } -} - -func (s *DockerSuite) TestRunPrivilegedCanMount(c *check.C) { - // Not applicable for Windows as there is no concept of --privileged - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, _ := dockerCmd(c, "run", "--privileged", "busybox", "sh", "-c", "mount -t tmpfs none /tmp && echo ok") - - if actual := strings.Trim(out, "\r\n"); actual != "ok" { - c.Fatalf("expected output ok received %s", actual) - } -} - -func (s *DockerSuite) TestRunUnprivilegedCannotMount(c *check.C) { - // Not applicable for Windows as there is no concept of unprivileged - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "busybox", "sh", "-c", "mount -t tmpfs none /tmp && echo ok") - - if err == nil { - c.Fatal(err, out) - } - if actual := strings.Trim(out, "\r\n"); actual == "ok" { - c.Fatalf("expected output not ok received %s", actual) - } -} - -func (s *DockerSuite) TestRunSysNotWritableInNonPrivilegedContainers(c *check.C) { - // Not applicable for Windows as there is no concept of unprivileged - testRequires(c, DaemonIsLinux, NotArm) - if _, code, err := dockerCmdWithError("run", "busybox", "touch", "/sys/kernel/profiling"); err == nil || code == 0 { - c.Fatal("sys should not be writable in a non privileged container") - } -} - -func (s *DockerSuite) TestRunSysWritableInPrivilegedContainers(c *check.C) { - // Not applicable for Windows as there is no concept of unprivileged - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - if _, code, err := dockerCmdWithError("run", "--privileged", "busybox", "touch", "/sys/kernel/profiling"); err != nil || code != 0 { - c.Fatalf("sys should be writable in privileged container") - } -} - -func (s *DockerSuite) TestRunProcNotWritableInNonPrivilegedContainers(c *check.C) { - // Not applicable for Windows as there is no concept of unprivileged - testRequires(c, DaemonIsLinux) - if _, code, err := dockerCmdWithError("run", "busybox", "touch", "/proc/sysrq-trigger"); err == nil || code == 0 { - c.Fatal("proc should not be writable in a non privileged container") - } -} - -func (s *DockerSuite) TestRunProcWritableInPrivilegedContainers(c *check.C) { - // Not applicable for Windows as there is no concept of --privileged - testRequires(c, DaemonIsLinux, NotUserNamespace) - if _, code := dockerCmd(c, "run", "--privileged", "busybox", "sh", "-c", "touch /proc/sysrq-trigger"); code != 0 { - c.Fatalf("proc should be writable in privileged container") - } -} - -func (s *DockerSuite) TestRunDeviceNumbers(c *check.C) { - // Not applicable on Windows as /dev/ is a Unix specific concept - // TODO: NotUserNamespace could be removed here if "root" "root" is replaced w user - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, _ := dockerCmd(c, "run", "busybox", "sh", "-c", "ls -l /dev/null") - deviceLineFields := strings.Fields(out) - deviceLineFields[6] = "" - deviceLineFields[7] = "" - deviceLineFields[8] = "" - expected := []string{"crw-rw-rw-", "1", "root", "root", "1,", "3", "", "", "", "/dev/null"} - - if !(reflect.DeepEqual(deviceLineFields, expected)) { - c.Fatalf("expected output\ncrw-rw-rw- 1 root root 1, 3 May 24 13:29 /dev/null\n received\n %s\n", out) - } -} - -func (s *DockerSuite) TestRunThatCharacterDevicesActLikeCharacterDevices(c *check.C) { - // Not applicable on Windows as /dev/ is a Unix specific concept - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "busybox", "sh", "-c", "dd if=/dev/zero of=/zero bs=1k count=5 2> /dev/null ; du -h /zero") - if actual := strings.Trim(out, "\r\n"); actual[0] == '0' { - c.Fatalf("expected a new file called /zero to be create that is greater than 0 bytes long, but du says: %s", actual) - } -} - -func (s *DockerSuite) TestRunUnprivilegedWithChroot(c *check.C) { - // Not applicable on Windows as it does not support chroot - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "busybox", "chroot", "/", "true") -} - -func (s *DockerSuite) TestRunAddingOptionalDevices(c *check.C) { - // Not applicable on Windows as Windows does not support --device - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, _ := dockerCmd(c, "run", "--device", "/dev/zero:/dev/nulo", "busybox", "sh", "-c", "ls /dev/nulo") - if actual := strings.Trim(out, "\r\n"); actual != "/dev/nulo" { - c.Fatalf("expected output /dev/nulo, received %s", actual) - } -} - -func (s *DockerSuite) TestRunAddingOptionalDevicesNoSrc(c *check.C) { - // Not applicable on Windows as Windows does not support --device - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, _ := dockerCmd(c, "run", "--device", "/dev/zero:rw", "busybox", "sh", "-c", "ls /dev/zero") - if actual := strings.Trim(out, "\r\n"); actual != "/dev/zero" { - c.Fatalf("expected output /dev/zero, received %s", actual) - } -} - -func (s *DockerSuite) TestRunAddingOptionalDevicesInvalidMode(c *check.C) { - // Not applicable on Windows as Windows does not support --device - testRequires(c, DaemonIsLinux, NotUserNamespace) - _, _, err := dockerCmdWithError("run", "--device", "/dev/zero:ro", "busybox", "sh", "-c", "ls /dev/zero") - if err == nil { - c.Fatalf("run container with device mode ro should fail") - } -} - -func (s *DockerSuite) TestRunModeHostname(c *check.C) { - // Not applicable on Windows as Windows does not support -h - testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace) - - out, _ := dockerCmd(c, "run", "-h=testhostname", "busybox", "cat", "/etc/hostname") - - if actual := strings.Trim(out, "\r\n"); actual != "testhostname" { - c.Fatalf("expected 'testhostname', but says: %q", actual) - } - - out, _ = dockerCmd(c, "run", "--net=host", "busybox", "cat", "/etc/hostname") - - hostname, err := os.Hostname() - if err != nil { - c.Fatal(err) - } - if actual := strings.Trim(out, "\r\n"); actual != hostname { - c.Fatalf("expected %q, but says: %q", hostname, actual) - } -} - -func (s *DockerSuite) TestRunRootWorkdir(c *check.C) { - out, _ := dockerCmd(c, "run", "--workdir", "/", "busybox", "pwd") - expected := "/\n" - if daemonPlatform == "windows" { - expected = "C:" + expected - } - if out != expected { - c.Fatalf("pwd returned %q (expected %s)", s, expected) - } -} - -func (s *DockerSuite) TestRunAllowBindMountingRoot(c *check.C) { - if daemonPlatform == "windows" { - // Windows busybox will fail with Permission Denied on items such as pagefile.sys - dockerCmd(c, "run", "-v", `c:\:c:\host`, WindowsBaseImage, "cmd", "-c", "dir", `c:\host`) - } else { - dockerCmd(c, "run", "-v", "/:/host", "busybox", "ls", "/host") - } -} - -func (s *DockerSuite) TestRunDisallowBindMountingRootToRoot(c *check.C) { - mount := "/:/" - targetDir := "/host" - if daemonPlatform == "windows" { - mount = `c:\:c\` - targetDir = "c:/host" // Forward slash as using busybox - } - out, _, err := dockerCmdWithError("run", "-v", mount, "busybox", "ls", targetDir) - if err == nil { - c.Fatal(out, err) - } -} - -// Verify that a container gets default DNS when only localhost resolvers exist -func (s *DockerSuite) TestRunDNSDefaultOptions(c *check.C) { - // Not applicable on Windows as this is testing Unix specific functionality - testRequires(c, SameHostDaemon, DaemonIsLinux) - - // preserve original resolv.conf for restoring after test - origResolvConf, err := ioutil.ReadFile("/etc/resolv.conf") - if os.IsNotExist(err) { - c.Fatalf("/etc/resolv.conf does not exist") - } - // defer restored original conf - defer func() { - if err := ioutil.WriteFile("/etc/resolv.conf", origResolvConf, 0644); err != nil { - c.Fatal(err) - } - }() - - // test 3 cases: standard IPv4 localhost, commented out localhost, and IPv6 localhost - // 2 are removed from the file at container start, and the 3rd (commented out) one is ignored by - // GetNameservers(), leading to a replacement of nameservers with the default set - tmpResolvConf := []byte("nameserver 127.0.0.1\n#nameserver 127.0.2.1\nnameserver ::1") - if err := ioutil.WriteFile("/etc/resolv.conf", tmpResolvConf, 0644); err != nil { - c.Fatal(err) - } - - actual, _ := dockerCmd(c, "run", "busybox", "cat", "/etc/resolv.conf") - // check that the actual defaults are appended to the commented out - // localhost resolver (which should be preserved) - // NOTE: if we ever change the defaults from google dns, this will break - expected := "#nameserver 127.0.2.1\n\nnameserver 8.8.8.8\nnameserver 8.8.4.4\n" - if actual != expected { - c.Fatalf("expected resolv.conf be: %q, but was: %q", expected, actual) - } -} - -func (s *DockerSuite) TestRunDNSOptions(c *check.C) { - // Not applicable on Windows as Windows does not support --dns*, or - // the Unix-specific functionality of resolv.conf. - testRequires(c, DaemonIsLinux) - out, stderr, _ := dockerCmdWithStdoutStderr(c, "run", "--dns=127.0.0.1", "--dns-search=mydomain", "--dns-opt=ndots:9", "busybox", "cat", "/etc/resolv.conf") - - // The client will get a warning on stderr when setting DNS to a localhost address; verify this: - if !strings.Contains(stderr, "Localhost DNS setting") { - c.Fatalf("Expected warning on stderr about localhost resolver, but got %q", stderr) - } - - actual := strings.Replace(strings.Trim(out, "\r\n"), "\n", " ", -1) - if actual != "search mydomain nameserver 127.0.0.1 options ndots:9" { - c.Fatalf("expected 'search mydomain nameserver 127.0.0.1 options ndots:9', but says: %q", actual) - } - - out, stderr, _ = dockerCmdWithStdoutStderr(c, "run", "--dns=127.0.0.1", "--dns-search=.", "--dns-opt=ndots:3", "busybox", "cat", "/etc/resolv.conf") - - actual = strings.Replace(strings.Trim(strings.Trim(out, "\r\n"), " "), "\n", " ", -1) - if actual != "nameserver 127.0.0.1 options ndots:3" { - c.Fatalf("expected 'nameserver 127.0.0.1 options ndots:3', but says: %q", actual) - } -} - -func (s *DockerSuite) TestRunDNSRepeatOptions(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _, _ := dockerCmdWithStdoutStderr(c, "run", "--dns=1.1.1.1", "--dns=2.2.2.2", "--dns-search=mydomain", "--dns-search=mydomain2", "--dns-opt=ndots:9", "--dns-opt=timeout:3", "busybox", "cat", "/etc/resolv.conf") - - actual := strings.Replace(strings.Trim(out, "\r\n"), "\n", " ", -1) - if actual != "search mydomain mydomain2 nameserver 1.1.1.1 nameserver 2.2.2.2 options ndots:9 timeout:3" { - c.Fatalf("expected 'search mydomain mydomain2 nameserver 1.1.1.1 nameserver 2.2.2.2 options ndots:9 timeout:3', but says: %q", actual) - } -} - -func (s *DockerSuite) TestRunDNSOptionsBasedOnHostResolvConf(c *check.C) { - // Not applicable on Windows as testing Unix specific functionality - testRequires(c, SameHostDaemon, DaemonIsLinux) - - origResolvConf, err := ioutil.ReadFile("/etc/resolv.conf") - if os.IsNotExist(err) { - c.Fatalf("/etc/resolv.conf does not exist") - } - - hostNameservers := resolvconf.GetNameservers(origResolvConf, types.IP) - hostSearch := resolvconf.GetSearchDomains(origResolvConf) - - var out string - out, _ = dockerCmd(c, "run", "--dns=127.0.0.1", "busybox", "cat", "/etc/resolv.conf") - - if actualNameservers := resolvconf.GetNameservers([]byte(out), types.IP); string(actualNameservers[0]) != "127.0.0.1" { - c.Fatalf("expected '127.0.0.1', but says: %q", string(actualNameservers[0])) - } - - actualSearch := resolvconf.GetSearchDomains([]byte(out)) - if len(actualSearch) != len(hostSearch) { - c.Fatalf("expected %q search domain(s), but it has: %q", len(hostSearch), len(actualSearch)) - } - for i := range actualSearch { - if actualSearch[i] != hostSearch[i] { - c.Fatalf("expected %q domain, but says: %q", actualSearch[i], hostSearch[i]) - } - } - - out, _ = dockerCmd(c, "run", "--dns-search=mydomain", "busybox", "cat", "/etc/resolv.conf") - - actualNameservers := resolvconf.GetNameservers([]byte(out), types.IP) - if len(actualNameservers) != len(hostNameservers) { - c.Fatalf("expected %q nameserver(s), but it has: %q", len(hostNameservers), len(actualNameservers)) - } - for i := range actualNameservers { - if actualNameservers[i] != hostNameservers[i] { - c.Fatalf("expected %q nameserver, but says: %q", actualNameservers[i], hostNameservers[i]) - } - } - - if actualSearch = resolvconf.GetSearchDomains([]byte(out)); string(actualSearch[0]) != "mydomain" { - c.Fatalf("expected 'mydomain', but says: %q", string(actualSearch[0])) - } - - // test with file - tmpResolvConf := []byte("search example.com\nnameserver 12.34.56.78\nnameserver 127.0.0.1") - if err := ioutil.WriteFile("/etc/resolv.conf", tmpResolvConf, 0644); err != nil { - c.Fatal(err) - } - // put the old resolvconf back - defer func() { - if err := ioutil.WriteFile("/etc/resolv.conf", origResolvConf, 0644); err != nil { - c.Fatal(err) - } - }() - - resolvConf, err := ioutil.ReadFile("/etc/resolv.conf") - if os.IsNotExist(err) { - c.Fatalf("/etc/resolv.conf does not exist") - } - - hostNameservers = resolvconf.GetNameservers(resolvConf, types.IP) - hostSearch = resolvconf.GetSearchDomains(resolvConf) - - out, _ = dockerCmd(c, "run", "busybox", "cat", "/etc/resolv.conf") - if actualNameservers = resolvconf.GetNameservers([]byte(out), types.IP); string(actualNameservers[0]) != "12.34.56.78" || len(actualNameservers) != 1 { - c.Fatalf("expected '12.34.56.78', but has: %v", actualNameservers) - } - - actualSearch = resolvconf.GetSearchDomains([]byte(out)) - if len(actualSearch) != len(hostSearch) { - c.Fatalf("expected %q search domain(s), but it has: %q", len(hostSearch), len(actualSearch)) - } - for i := range actualSearch { - if actualSearch[i] != hostSearch[i] { - c.Fatalf("expected %q domain, but says: %q", actualSearch[i], hostSearch[i]) - } - } -} - -// Test to see if a non-root user can resolve a DNS name. Also -// check if the container resolv.conf file has at least 0644 perm. -func (s *DockerSuite) TestRunNonRootUserResolvName(c *check.C) { - // Not applicable on Windows as Windows does not support --user - testRequires(c, SameHostDaemon, Network, DaemonIsLinux, NotArm) - - dockerCmd(c, "run", "--name=testperm", "--user=nobody", "busybox", "nslookup", "apt.dockerproject.org") - - cID, err := getIDByName("testperm") - if err != nil { - c.Fatal(err) - } - - fmode := (os.FileMode)(0644) - finfo, err := os.Stat(containerStorageFile(cID, "resolv.conf")) - if err != nil { - c.Fatal(err) - } - - if (finfo.Mode() & fmode) != fmode { - c.Fatalf("Expected container resolv.conf mode to be at least %s, instead got %s", fmode.String(), finfo.Mode().String()) - } -} - -// Test if container resolv.conf gets updated the next time it restarts -// if host /etc/resolv.conf has changed. This only applies if the container -// uses the host's /etc/resolv.conf and does not have any dns options provided. -func (s *DockerSuite) TestRunResolvconfUpdate(c *check.C) { - // Not applicable on Windows as testing unix specific functionality - testRequires(c, SameHostDaemon, DaemonIsLinux) - c.Skip("Unstable test, to be re-activated once #19937 is resolved") - - tmpResolvConf := []byte("search pommesfrites.fr\nnameserver 12.34.56.78\n") - tmpLocalhostResolvConf := []byte("nameserver 127.0.0.1") - - //take a copy of resolv.conf for restoring after test completes - resolvConfSystem, err := ioutil.ReadFile("/etc/resolv.conf") - if err != nil { - c.Fatal(err) - } - - // This test case is meant to test monitoring resolv.conf when it is - // a regular file not a bind mounc. So we unmount resolv.conf and replace - // it with a file containing the original settings. - mounted, err := mount.Mounted("/etc/resolv.conf") - if err != nil { - c.Fatal(err) - } - if mounted { - cmd := exec.Command("umount", "/etc/resolv.conf") - if _, err = runCommand(cmd); err != nil { - c.Fatal(err) - } - } - - //cleanup - defer func() { - if err := ioutil.WriteFile("/etc/resolv.conf", resolvConfSystem, 0644); err != nil { - c.Fatal(err) - } - }() - - //1. test that a restarting container gets an updated resolv.conf - dockerCmd(c, "run", "--name=first", "busybox", "true") - containerID1, err := getIDByName("first") - if err != nil { - c.Fatal(err) - } - - // replace resolv.conf with our temporary copy - bytesResolvConf := []byte(tmpResolvConf) - if err := ioutil.WriteFile("/etc/resolv.conf", bytesResolvConf, 0644); err != nil { - c.Fatal(err) - } - - // start the container again to pickup changes - dockerCmd(c, "start", "first") - - // check for update in container - containerResolv, err := readContainerFile(containerID1, "resolv.conf") - if err != nil { - c.Fatal(err) - } - if !bytes.Equal(containerResolv, bytesResolvConf) { - c.Fatalf("Restarted container does not have updated resolv.conf; expected %q, got %q", tmpResolvConf, string(containerResolv)) - } - - /* //make a change to resolv.conf (in this case replacing our tmp copy with orig copy) - if err := ioutil.WriteFile("/etc/resolv.conf", resolvConfSystem, 0644); err != nil { - c.Fatal(err) - } */ - //2. test that a restarting container does not receive resolv.conf updates - // if it modified the container copy of the starting point resolv.conf - dockerCmd(c, "run", "--name=second", "busybox", "sh", "-c", "echo 'search mylittlepony.com' >>/etc/resolv.conf") - containerID2, err := getIDByName("second") - if err != nil { - c.Fatal(err) - } - - //make a change to resolv.conf (in this case replacing our tmp copy with orig copy) - if err := ioutil.WriteFile("/etc/resolv.conf", resolvConfSystem, 0644); err != nil { - c.Fatal(err) - } - - // start the container again - dockerCmd(c, "start", "second") - - // check for update in container - containerResolv, err = readContainerFile(containerID2, "resolv.conf") - if err != nil { - c.Fatal(err) - } - - if bytes.Equal(containerResolv, resolvConfSystem) { - c.Fatalf("Container's resolv.conf should not have been updated with host resolv.conf: %q", string(containerResolv)) - } - - //3. test that a running container's resolv.conf is not modified while running - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - runningContainerID := strings.TrimSpace(out) - - // replace resolv.conf - if err := ioutil.WriteFile("/etc/resolv.conf", bytesResolvConf, 0644); err != nil { - c.Fatal(err) - } - - // check for update in container - containerResolv, err = readContainerFile(runningContainerID, "resolv.conf") - if err != nil { - c.Fatal(err) - } - - if bytes.Equal(containerResolv, bytesResolvConf) { - c.Fatalf("Running container should not have updated resolv.conf; expected %q, got %q", string(resolvConfSystem), string(containerResolv)) - } - - //4. test that a running container's resolv.conf is updated upon restart - // (the above container is still running..) - dockerCmd(c, "restart", runningContainerID) - - // check for update in container - containerResolv, err = readContainerFile(runningContainerID, "resolv.conf") - if err != nil { - c.Fatal(err) - } - if !bytes.Equal(containerResolv, bytesResolvConf) { - c.Fatalf("Restarted container should have updated resolv.conf; expected %q, got %q", string(bytesResolvConf), string(containerResolv)) - } - - //5. test that additions of a localhost resolver are cleaned from - // host resolv.conf before updating container's resolv.conf copies - - // replace resolv.conf with a localhost-only nameserver copy - bytesResolvConf = []byte(tmpLocalhostResolvConf) - if err = ioutil.WriteFile("/etc/resolv.conf", bytesResolvConf, 0644); err != nil { - c.Fatal(err) - } - - // start the container again to pickup changes - dockerCmd(c, "start", "first") - - // our first exited container ID should have been updated, but with default DNS - // after the cleanup of resolv.conf found only a localhost nameserver: - containerResolv, err = readContainerFile(containerID1, "resolv.conf") - if err != nil { - c.Fatal(err) - } - - expected := "\nnameserver 8.8.8.8\nnameserver 8.8.4.4\n" - if !bytes.Equal(containerResolv, []byte(expected)) { - c.Fatalf("Container does not have cleaned/replaced DNS in resolv.conf; expected %q, got %q", expected, string(containerResolv)) - } - - //6. Test that replacing (as opposed to modifying) resolv.conf triggers an update - // of containers' resolv.conf. - - // Restore the original resolv.conf - if err := ioutil.WriteFile("/etc/resolv.conf", resolvConfSystem, 0644); err != nil { - c.Fatal(err) - } - - // Run the container so it picks up the old settings - dockerCmd(c, "run", "--name=third", "busybox", "true") - containerID3, err := getIDByName("third") - if err != nil { - c.Fatal(err) - } - - // Create a modified resolv.conf.aside and override resolv.conf with it - bytesResolvConf = []byte(tmpResolvConf) - if err := ioutil.WriteFile("/etc/resolv.conf.aside", bytesResolvConf, 0644); err != nil { - c.Fatal(err) - } - - err = os.Rename("/etc/resolv.conf.aside", "/etc/resolv.conf") - if err != nil { - c.Fatal(err) - } - - // start the container again to pickup changes - dockerCmd(c, "start", "third") - - // check for update in container - containerResolv, err = readContainerFile(containerID3, "resolv.conf") - if err != nil { - c.Fatal(err) - } - if !bytes.Equal(containerResolv, bytesResolvConf) { - c.Fatalf("Stopped container does not have updated resolv.conf; expected\n%q\n got\n%q", tmpResolvConf, string(containerResolv)) - } - - //cleanup, restore original resolv.conf happens in defer func() -} - -func (s *DockerSuite) TestRunAddHost(c *check.C) { - // Not applicable on Windows as it does not support --add-host - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "--add-host=extra:86.75.30.9", "busybox", "grep", "extra", "/etc/hosts") - - actual := strings.Trim(out, "\r\n") - if actual != "86.75.30.9\textra" { - c.Fatalf("expected '86.75.30.9\textra', but says: %q", actual) - } -} - -// Regression test for #6983 -func (s *DockerSuite) TestRunAttachStdErrOnlyTTYMode(c *check.C) { - _, exitCode := dockerCmd(c, "run", "-t", "-a", "stderr", "busybox", "true") - if exitCode != 0 { - c.Fatalf("Container should have exited with error code 0") - } -} - -// Regression test for #6983 -func (s *DockerSuite) TestRunAttachStdOutOnlyTTYMode(c *check.C) { - _, exitCode := dockerCmd(c, "run", "-t", "-a", "stdout", "busybox", "true") - if exitCode != 0 { - c.Fatalf("Container should have exited with error code 0") - } -} - -// Regression test for #6983 -func (s *DockerSuite) TestRunAttachStdOutAndErrTTYMode(c *check.C) { - _, exitCode := dockerCmd(c, "run", "-t", "-a", "stdout", "-a", "stderr", "busybox", "true") - if exitCode != 0 { - c.Fatalf("Container should have exited with error code 0") - } -} - -// Test for #10388 - this will run the same test as TestRunAttachStdOutAndErrTTYMode -// but using --attach instead of -a to make sure we read the flag correctly -func (s *DockerSuite) TestRunAttachWithDetach(c *check.C) { - cmd := exec.Command(dockerBinary, "run", "-d", "--attach", "stdout", "busybox", "true") - _, stderr, _, err := runCommandWithStdoutStderr(cmd) - if err == nil { - c.Fatal("Container should have exited with error code different than 0") - } else if !strings.Contains(stderr, "Conflicting options: -a and -d") { - c.Fatal("Should have been returned an error with conflicting options -a and -d") - } -} - -func (s *DockerSuite) TestRunState(c *check.C) { - // TODO Windows: This needs some rework as Windows busybox does not support top - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - - id := strings.TrimSpace(out) - state := inspectField(c, id, "State.Running") - if state != "true" { - c.Fatal("Container state is 'not running'") - } - pid1 := inspectField(c, id, "State.Pid") - if pid1 == "0" { - c.Fatal("Container state Pid 0") - } - - dockerCmd(c, "stop", id) - state = inspectField(c, id, "State.Running") - if state != "false" { - c.Fatal("Container state is 'running'") - } - pid2 := inspectField(c, id, "State.Pid") - if pid2 == pid1 { - c.Fatalf("Container state Pid %s, but expected %s", pid2, pid1) - } - - dockerCmd(c, "start", id) - state = inspectField(c, id, "State.Running") - if state != "true" { - c.Fatal("Container state is 'not running'") - } - pid3 := inspectField(c, id, "State.Pid") - if pid3 == pid1 { - c.Fatalf("Container state Pid %s, but expected %s", pid2, pid1) - } -} - -// Test for #1737 -func (s *DockerSuite) TestRunCopyVolumeUIDGID(c *check.C) { - // Not applicable on Windows as it does not support uid or gid in this way - testRequires(c, DaemonIsLinux) - name := "testrunvolumesuidgid" - _, err := buildImage(name, - `FROM busybox - RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd - RUN echo 'dockerio:x:1001:' >> /etc/group - RUN mkdir -p /hello && touch /hello/test && chown dockerio.dockerio /hello`, - true) - if err != nil { - c.Fatal(err) - } - - // Test that the uid and gid is copied from the image to the volume - out, _ := dockerCmd(c, "run", "--rm", "-v", "/hello", name, "sh", "-c", "ls -l / | grep hello | awk '{print $3\":\"$4}'") - out = strings.TrimSpace(out) - if out != "dockerio:dockerio" { - c.Fatalf("Wrong /hello ownership: %s, expected dockerio:dockerio", out) - } -} - -// Test for #1582 -func (s *DockerSuite) TestRunCopyVolumeContent(c *check.C) { - // TODO Windows, post TP5. Windows does not yet support volume functionality - // that copies from the image to the volume. - testRequires(c, DaemonIsLinux) - name := "testruncopyvolumecontent" - _, err := buildImage(name, - `FROM busybox - RUN mkdir -p /hello/local && echo hello > /hello/local/world`, - true) - if err != nil { - c.Fatal(err) - } - - // Test that the content is copied from the image to the volume - out, _ := dockerCmd(c, "run", "--rm", "-v", "/hello", name, "find", "/hello") - if !(strings.Contains(out, "/hello/local/world") && strings.Contains(out, "/hello/local")) { - c.Fatal("Container failed to transfer content to volume") - } -} - -func (s *DockerSuite) TestRunCleanupCmdOnEntrypoint(c *check.C) { - name := "testrunmdcleanuponentrypoint" - if _, err := buildImage(name, - `FROM busybox - ENTRYPOINT ["echo"] - CMD ["testingpoint"]`, - true); err != nil { - c.Fatal(err) - } - - out, exit := dockerCmd(c, "run", "--entrypoint", "whoami", name) - if exit != 0 { - c.Fatalf("expected exit code 0 received %d, out: %q", exit, out) - } - out = strings.TrimSpace(out) - expected := "root" - if daemonPlatform == "windows" { - if strings.Contains(WindowsBaseImage, "windowsservercore") { - expected = `user manager\containeradministrator` - } else { - expected = `ContainerAdministrator` // nanoserver - } - } - if out != expected { - c.Fatalf("Expected output %s, got %q. %s", expected, out, WindowsBaseImage) - } -} - -// TestRunWorkdirExistsAndIsFile checks that if 'docker run -w' with existing file can be detected -func (s *DockerSuite) TestRunWorkdirExistsAndIsFile(c *check.C) { - existingFile := "/bin/cat" - expected := "not a directory" - if daemonPlatform == "windows" { - existingFile = `\windows\system32\ntdll.dll` - expected = `The directory name is invalid.` - } - - out, exitCode, err := dockerCmdWithError("run", "-w", existingFile, "busybox") - if !(err != nil && exitCode == 125 && strings.Contains(out, expected)) { - c.Fatalf("Existing binary as a directory should error out with exitCode 125; we got: %s, exitCode: %d", out, exitCode) - } -} - -func (s *DockerSuite) TestRunExitOnStdinClose(c *check.C) { - name := "testrunexitonstdinclose" - - meow := "/bin/cat" - delay := 60 - if daemonPlatform == "windows" { - meow = "cat" - } - runCmd := exec.Command(dockerBinary, "run", "--name", name, "-i", "busybox", meow) - - stdin, err := runCmd.StdinPipe() - if err != nil { - c.Fatal(err) - } - stdout, err := runCmd.StdoutPipe() - if err != nil { - c.Fatal(err) - } - - if err := runCmd.Start(); err != nil { - c.Fatal(err) - } - if _, err := stdin.Write([]byte("hello\n")); err != nil { - c.Fatal(err) - } - - r := bufio.NewReader(stdout) - line, err := r.ReadString('\n') - if err != nil { - c.Fatal(err) - } - line = strings.TrimSpace(line) - if line != "hello" { - c.Fatalf("Output should be 'hello', got '%q'", line) - } - if err := stdin.Close(); err != nil { - c.Fatal(err) - } - finish := make(chan error) - go func() { - finish <- runCmd.Wait() - close(finish) - }() - select { - case err := <-finish: - c.Assert(err, check.IsNil) - case <-time.After(time.Duration(delay) * time.Second): - c.Fatal("docker run failed to exit on stdin close") - } - state := inspectField(c, name, "State.Running") - - if state != "false" { - c.Fatal("Container must be stopped after stdin closing") - } -} - -// Test run -i --restart xxx doesn't hang -func (s *DockerSuite) TestRunInteractiveWithRestartPolicy(c *check.C) { - name := "test-inter-restart" - - result := icmd.StartCmd(icmd.Cmd{ - Command: []string{dockerBinary, "run", "-i", "--name", name, "--restart=always", "busybox", "sh"}, - Stdin: bytes.NewBufferString("exit 11"), - }) - c.Assert(result.Error, checker.IsNil) - defer func() { - dockerCmdWithResult("stop", name).Assert(c, icmd.Success) - }() - - result = icmd.WaitOnCmd(60*time.Second, result) - c.Assert(result, icmd.Matches, icmd.Expected{ExitCode: 11}) -} - -// Test for #2267 -func (s *DockerSuite) TestRunWriteHostsFileAndNotCommit(c *check.C) { - // Cannot run on Windows as Windows does not support diff. - testRequires(c, DaemonIsLinux) - name := "writehosts" - out, _ := dockerCmd(c, "run", "--name", name, "busybox", "sh", "-c", "echo test2267 >> /etc/hosts && cat /etc/hosts") - if !strings.Contains(out, "test2267") { - c.Fatal("/etc/hosts should contain 'test2267'") - } - - out, _ = dockerCmd(c, "diff", name) - if len(strings.Trim(out, "\r\n")) != 0 && !eqToBaseDiff(out, c) { - c.Fatal("diff should be empty") - } -} - -func eqToBaseDiff(out string, c *check.C) bool { - name := "eqToBaseDiff" + stringutils.GenerateRandomAlphaOnlyString(32) - dockerCmd(c, "run", "--name", name, "busybox", "echo", "hello") - cID, err := getIDByName(name) - c.Assert(err, check.IsNil) - - baseDiff, _ := dockerCmd(c, "diff", cID) - baseArr := strings.Split(baseDiff, "\n") - sort.Strings(baseArr) - outArr := strings.Split(out, "\n") - sort.Strings(outArr) - return sliceEq(baseArr, outArr) -} - -func sliceEq(a, b []string) bool { - if len(a) != len(b) { - return false - } - - for i := range a { - if a[i] != b[i] { - return false - } - } - - return true -} - -// Test for #2267 -func (s *DockerSuite) TestRunWriteHostnameFileAndNotCommit(c *check.C) { - // Cannot run on Windows as Windows does not support diff. - testRequires(c, DaemonIsLinux) - name := "writehostname" - out, _ := dockerCmd(c, "run", "--name", name, "busybox", "sh", "-c", "echo test2267 >> /etc/hostname && cat /etc/hostname") - if !strings.Contains(out, "test2267") { - c.Fatal("/etc/hostname should contain 'test2267'") - } - - out, _ = dockerCmd(c, "diff", name) - if len(strings.Trim(out, "\r\n")) != 0 && !eqToBaseDiff(out, c) { - c.Fatal("diff should be empty") - } -} - -// Test for #2267 -func (s *DockerSuite) TestRunWriteResolvFileAndNotCommit(c *check.C) { - // Cannot run on Windows as Windows does not support diff. - testRequires(c, DaemonIsLinux) - name := "writeresolv" - out, _ := dockerCmd(c, "run", "--name", name, "busybox", "sh", "-c", "echo test2267 >> /etc/resolv.conf && cat /etc/resolv.conf") - if !strings.Contains(out, "test2267") { - c.Fatal("/etc/resolv.conf should contain 'test2267'") - } - - out, _ = dockerCmd(c, "diff", name) - if len(strings.Trim(out, "\r\n")) != 0 && !eqToBaseDiff(out, c) { - c.Fatal("diff should be empty") - } -} - -func (s *DockerSuite) TestRunWithBadDevice(c *check.C) { - // Cannot run on Windows as Windows does not support --device - testRequires(c, DaemonIsLinux) - name := "baddevice" - out, _, err := dockerCmdWithError("run", "--name", name, "--device", "/etc", "busybox", "true") - - if err == nil { - c.Fatal("Run should fail with bad device") - } - expected := `"/etc": not a device node` - if !strings.Contains(out, expected) { - c.Fatalf("Output should contain %q, actual out: %q", expected, out) - } -} - -func (s *DockerSuite) TestRunEntrypoint(c *check.C) { - name := "entrypoint" - - out, _ := dockerCmd(c, "run", "--name", name, "--entrypoint", "echo", "busybox", "-n", "foobar") - expected := "foobar" - - if out != expected { - c.Fatalf("Output should be %q, actual out: %q", expected, out) - } -} - -func (s *DockerSuite) TestRunBindMounts(c *check.C) { - testRequires(c, SameHostDaemon) - if daemonPlatform == "linux" { - testRequires(c, DaemonIsLinux, NotUserNamespace) - } - - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - - tmpDir, err := ioutil.TempDir("", "docker-test-container") - if err != nil { - c.Fatal(err) - } - - defer os.RemoveAll(tmpDir) - writeFile(path.Join(tmpDir, "touch-me"), "", c) - - // TODO Windows: Temporary check - remove once TP5 support is dropped - if daemonPlatform != "windows" || windowsDaemonKV >= 14350 { - // Test reading from a read-only bind mount - out, _ := dockerCmd(c, "run", "-v", fmt.Sprintf("%s:%s/tmp:ro", tmpDir, prefix), "busybox", "ls", prefix+"/tmp") - if !strings.Contains(out, "touch-me") { - c.Fatal("Container failed to read from bind mount") - } - } - - // test writing to bind mount - if daemonPlatform == "windows" { - dockerCmd(c, "run", "-v", fmt.Sprintf(`%s:c:\tmp:rw`, tmpDir), "busybox", "touch", "c:/tmp/holla") - } else { - dockerCmd(c, "run", "-v", fmt.Sprintf("%s:/tmp:rw", tmpDir), "busybox", "touch", "/tmp/holla") - } - - readFile(path.Join(tmpDir, "holla"), c) // Will fail if the file doesn't exist - - // test mounting to an illegal destination directory - _, _, err = dockerCmdWithError("run", "-v", fmt.Sprintf("%s:.", tmpDir), "busybox", "ls", ".") - if err == nil { - c.Fatal("Container bind mounted illegal directory") - } - - // Windows does not (and likely never will) support mounting a single file - if daemonPlatform != "windows" { - // test mount a file - dockerCmd(c, "run", "-v", fmt.Sprintf("%s/holla:/tmp/holla:rw", tmpDir), "busybox", "sh", "-c", "echo -n 'yotta' > /tmp/holla") - content := readFile(path.Join(tmpDir, "holla"), c) // Will fail if the file doesn't exist - expected := "yotta" - if content != expected { - c.Fatalf("Output should be %q, actual out: %q", expected, content) - } - } -} - -// Ensure that CIDFile gets deleted if it's empty -// Perform this test by making `docker run` fail -func (s *DockerSuite) TestRunCidFileCleanupIfEmpty(c *check.C) { - // Skip on Windows. Base image on Windows has a CMD set in the image. - testRequires(c, DaemonIsLinux) - - tmpDir, err := ioutil.TempDir("", "TestRunCidFile") - if err != nil { - c.Fatal(err) - } - defer os.RemoveAll(tmpDir) - tmpCidFile := path.Join(tmpDir, "cid") - - image := "emptyfs" - if daemonPlatform == "windows" { - // Windows can't support an emptyfs image. Just use the regular Windows image - image = WindowsBaseImage - } - out, _, err := dockerCmdWithError("run", "--cidfile", tmpCidFile, image) - if err == nil { - c.Fatalf("Run without command must fail. out=%s", out) - } else if !strings.Contains(out, "No command specified") { - c.Fatalf("Run without command failed with wrong output. out=%s\nerr=%v", out, err) - } - - if _, err := os.Stat(tmpCidFile); err == nil { - c.Fatalf("empty CIDFile %q should've been deleted", tmpCidFile) - } -} - -// #2098 - Docker cidFiles only contain short version of the containerId -//sudo docker run --cidfile /tmp/docker_tesc.cid ubuntu echo "test" -// TestRunCidFile tests that run --cidfile returns the longid -func (s *DockerSuite) TestRunCidFileCheckIDLength(c *check.C) { - tmpDir, err := ioutil.TempDir("", "TestRunCidFile") - if err != nil { - c.Fatal(err) - } - tmpCidFile := path.Join(tmpDir, "cid") - defer os.RemoveAll(tmpDir) - - out, _ := dockerCmd(c, "run", "-d", "--cidfile", tmpCidFile, "busybox", "true") - - id := strings.TrimSpace(out) - buffer, err := ioutil.ReadFile(tmpCidFile) - if err != nil { - c.Fatal(err) - } - cid := string(buffer) - if len(cid) != 64 { - c.Fatalf("--cidfile should be a long id, not %q", id) - } - if cid != id { - c.Fatalf("cid must be equal to %s, got %s", id, cid) - } -} - -func (s *DockerSuite) TestRunSetMacAddress(c *check.C) { - mac := "12:34:56:78:9a:bc" - var out string - if daemonPlatform == "windows" { - out, _ = dockerCmd(c, "run", "-i", "--rm", fmt.Sprintf("--mac-address=%s", mac), "busybox", "sh", "-c", "ipconfig /all | grep 'Physical Address' | awk '{print $12}'") - mac = strings.Replace(strings.ToUpper(mac), ":", "-", -1) // To Windows-style MACs - } else { - out, _ = dockerCmd(c, "run", "-i", "--rm", fmt.Sprintf("--mac-address=%s", mac), "busybox", "/bin/sh", "-c", "ip link show eth0 | tail -1 | awk '{print $2}'") - } - - actualMac := strings.TrimSpace(out) - if actualMac != mac { - c.Fatalf("Set MAC address with --mac-address failed. The container has an incorrect MAC address: %q, expected: %q", actualMac, mac) - } -} - -func (s *DockerSuite) TestRunInspectMacAddress(c *check.C) { - // TODO Windows. Network settings are not propagated back to inspect. - testRequires(c, DaemonIsLinux) - mac := "12:34:56:78:9a:bc" - out, _ := dockerCmd(c, "run", "-d", "--mac-address="+mac, "busybox", "top") - - id := strings.TrimSpace(out) - inspectedMac := inspectField(c, id, "NetworkSettings.Networks.bridge.MacAddress") - if inspectedMac != mac { - c.Fatalf("docker inspect outputs wrong MAC address: %q, should be: %q", inspectedMac, mac) - } -} - -// test docker run use an invalid mac address -func (s *DockerSuite) TestRunWithInvalidMacAddress(c *check.C) { - out, _, err := dockerCmdWithError("run", "--mac-address", "92:d0:c6:0a:29", "busybox") - //use an invalid mac address should with an error out - if err == nil || !strings.Contains(out, "is not a valid mac address") { - c.Fatalf("run with an invalid --mac-address should with error out") - } -} - -func (s *DockerSuite) TestRunDeallocatePortOnMissingIptablesRule(c *check.C) { - // TODO Windows. Network settings are not propagated back to inspect. - testRequires(c, SameHostDaemon, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-d", "-p", "23:23", "busybox", "top") - - id := strings.TrimSpace(out) - ip := inspectField(c, id, "NetworkSettings.Networks.bridge.IPAddress") - iptCmd := exec.Command("iptables", "-D", "DOCKER", "-d", fmt.Sprintf("%s/32", ip), - "!", "-i", "docker0", "-o", "docker0", "-p", "tcp", "-m", "tcp", "--dport", "23", "-j", "ACCEPT") - out, _, err := runCommandWithOutput(iptCmd) - if err != nil { - c.Fatal(err, out) - } - if err := deleteContainer(id); err != nil { - c.Fatal(err) - } - - dockerCmd(c, "run", "-d", "-p", "23:23", "busybox", "top") -} - -func (s *DockerSuite) TestRunPortInUse(c *check.C) { - // TODO Windows. The duplicate NAT message returned by Windows will be - // changing as is currently completely undecipherable. Does need modifying - // to run sh rather than top though as top isn't in Windows busybox. - testRequires(c, SameHostDaemon, DaemonIsLinux) - - port := "1234" - dockerCmd(c, "run", "-d", "-p", port+":80", "busybox", "top") - - out, _, err := dockerCmdWithError("run", "-d", "-p", port+":80", "busybox", "top") - if err == nil { - c.Fatalf("Binding on used port must fail") - } - if !strings.Contains(out, "port is already allocated") { - c.Fatalf("Out must be about \"port is already allocated\", got %s", out) - } -} - -// https://github.com/docker/docker/issues/12148 -func (s *DockerSuite) TestRunAllocatePortInReservedRange(c *check.C) { - // TODO Windows. -P is not yet supported - testRequires(c, DaemonIsLinux) - // allocate a dynamic port to get the most recent - out, _ := dockerCmd(c, "run", "-d", "-P", "-p", "80", "busybox", "top") - - id := strings.TrimSpace(out) - out, _ = dockerCmd(c, "port", id, "80") - - strPort := strings.Split(strings.TrimSpace(out), ":")[1] - port, err := strconv.ParseInt(strPort, 10, 64) - if err != nil { - c.Fatalf("invalid port, got: %s, error: %s", strPort, err) - } - - // allocate a static port and a dynamic port together, with static port - // takes the next recent port in dynamic port range. - dockerCmd(c, "run", "-d", "-P", "-p", "80", "-p", fmt.Sprintf("%d:8080", port+1), "busybox", "top") -} - -// Regression test for #7792 -func (s *DockerSuite) TestRunMountOrdering(c *check.C) { - // TODO Windows: Post TP5. Updated, but Windows does not support nested mounts currently. - testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace) - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - - tmpDir, err := ioutil.TempDir("", "docker_nested_mount_test") - if err != nil { - c.Fatal(err) - } - defer os.RemoveAll(tmpDir) - - tmpDir2, err := ioutil.TempDir("", "docker_nested_mount_test2") - if err != nil { - c.Fatal(err) - } - defer os.RemoveAll(tmpDir2) - - // Create a temporary tmpfs mounc. - fooDir := filepath.Join(tmpDir, "foo") - if err := os.MkdirAll(filepath.Join(tmpDir, "foo"), 0755); err != nil { - c.Fatalf("failed to mkdir at %s - %s", fooDir, err) - } - - if err := ioutil.WriteFile(fmt.Sprintf("%s/touch-me", fooDir), []byte{}, 0644); err != nil { - c.Fatal(err) - } - - if err := ioutil.WriteFile(fmt.Sprintf("%s/touch-me", tmpDir), []byte{}, 0644); err != nil { - c.Fatal(err) - } - - if err := ioutil.WriteFile(fmt.Sprintf("%s/touch-me", tmpDir2), []byte{}, 0644); err != nil { - c.Fatal(err) - } - - dockerCmd(c, "run", - "-v", fmt.Sprintf("%s:"+prefix+"/tmp", tmpDir), - "-v", fmt.Sprintf("%s:"+prefix+"/tmp/foo", fooDir), - "-v", fmt.Sprintf("%s:"+prefix+"/tmp/tmp2", tmpDir2), - "-v", fmt.Sprintf("%s:"+prefix+"/tmp/tmp2/foo", fooDir), - "busybox:latest", "sh", "-c", - "ls "+prefix+"/tmp/touch-me && ls "+prefix+"/tmp/foo/touch-me && ls "+prefix+"/tmp/tmp2/touch-me && ls "+prefix+"/tmp/tmp2/foo/touch-me") -} - -// Regression test for https://github.com/docker/docker/issues/8259 -func (s *DockerSuite) TestRunReuseBindVolumeThatIsSymlink(c *check.C) { - // Not applicable on Windows as Windows does not support volumes - testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace) - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - - tmpDir, err := ioutil.TempDir(os.TempDir(), "testlink") - if err != nil { - c.Fatal(err) - } - defer os.RemoveAll(tmpDir) - - linkPath := os.TempDir() + "/testlink2" - if err := os.Symlink(tmpDir, linkPath); err != nil { - c.Fatal(err) - } - defer os.RemoveAll(linkPath) - - // Create first container - dockerCmd(c, "run", "-v", fmt.Sprintf("%s:"+prefix+"/tmp/test", linkPath), "busybox", "ls", prefix+"/tmp/test") - - // Create second container with same symlinked path - // This will fail if the referenced issue is hit with a "Volume exists" error - dockerCmd(c, "run", "-v", fmt.Sprintf("%s:"+prefix+"/tmp/test", linkPath), "busybox", "ls", prefix+"/tmp/test") -} - -//GH#10604: Test an "/etc" volume doesn't overlay special bind mounts in container -func (s *DockerSuite) TestRunCreateVolumeEtc(c *check.C) { - // While Windows supports volumes, it does not support --add-host hence - // this test is not applicable on Windows. - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "--dns=127.0.0.1", "-v", "/etc", "busybox", "cat", "/etc/resolv.conf") - if !strings.Contains(out, "nameserver 127.0.0.1") { - c.Fatal("/etc volume mount hides /etc/resolv.conf") - } - - out, _ = dockerCmd(c, "run", "-h=test123", "-v", "/etc", "busybox", "cat", "/etc/hostname") - if !strings.Contains(out, "test123") { - c.Fatal("/etc volume mount hides /etc/hostname") - } - - out, _ = dockerCmd(c, "run", "--add-host=test:192.168.0.1", "-v", "/etc", "busybox", "cat", "/etc/hosts") - out = strings.Replace(out, "\n", " ", -1) - if !strings.Contains(out, "192.168.0.1\ttest") || !strings.Contains(out, "127.0.0.1\tlocalhost") { - c.Fatal("/etc volume mount hides /etc/hosts") - } -} - -func (s *DockerSuite) TestVolumesNoCopyData(c *check.C) { - // TODO Windows (Post RS1). Windows does not support volumes which - // are pre-populated such as is built in the dockerfile used in this test. - testRequires(c, DaemonIsLinux) - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - if _, err := buildImage("dataimage", - `FROM busybox - RUN ["mkdir", "-p", "/foo"] - RUN ["touch", "/foo/bar"]`, - true); err != nil { - c.Fatal(err) - } - - dockerCmd(c, "run", "--name", "test", "-v", prefix+slash+"foo", "busybox") - - if out, _, err := dockerCmdWithError("run", "--volumes-from", "test", "dataimage", "ls", "-lh", "/foo/bar"); err == nil || !strings.Contains(out, "No such file or directory") { - c.Fatalf("Data was copied on volumes-from but shouldn't be:\n%q", out) - } - - tmpDir := randomTmpDirPath("docker_test_bind_mount_copy_data", daemonPlatform) - if out, _, err := dockerCmdWithError("run", "-v", tmpDir+":/foo", "dataimage", "ls", "-lh", "/foo/bar"); err == nil || !strings.Contains(out, "No such file or directory") { - c.Fatalf("Data was copied on bind-mount but shouldn't be:\n%q", out) - } -} - -func (s *DockerSuite) TestRunNoOutputFromPullInStdout(c *check.C) { - // just run with unknown image - cmd := exec.Command(dockerBinary, "run", "asdfsg") - stdout := bytes.NewBuffer(nil) - cmd.Stdout = stdout - if err := cmd.Run(); err == nil { - c.Fatal("Run with unknown image should fail") - } - if stdout.Len() != 0 { - c.Fatalf("Stdout contains output from pull: %s", stdout) - } -} - -func (s *DockerSuite) TestRunVolumesCleanPaths(c *check.C) { - testRequires(c, SameHostDaemon) - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - if _, err := buildImage("run_volumes_clean_paths", - `FROM busybox - VOLUME `+prefix+`/foo/`, - true); err != nil { - c.Fatal(err) - } - - dockerCmd(c, "run", "-v", prefix+"/foo", "-v", prefix+"/bar/", "--name", "dark_helmet", "run_volumes_clean_paths") - - out, err := inspectMountSourceField("dark_helmet", prefix+slash+"foo"+slash) - if err != errMountNotFound { - c.Fatalf("Found unexpected volume entry for '%s/foo/' in volumes\n%q", prefix, out) - } - - out, err = inspectMountSourceField("dark_helmet", prefix+slash+`foo`) - c.Assert(err, check.IsNil) - if !strings.Contains(strings.ToLower(out), strings.ToLower(volumesConfigPath)) { - c.Fatalf("Volume was not defined for %s/foo\n%q", prefix, out) - } - - out, err = inspectMountSourceField("dark_helmet", prefix+slash+"bar"+slash) - if err != errMountNotFound { - c.Fatalf("Found unexpected volume entry for '%s/bar/' in volumes\n%q", prefix, out) - } - - out, err = inspectMountSourceField("dark_helmet", prefix+slash+"bar") - c.Assert(err, check.IsNil) - if !strings.Contains(strings.ToLower(out), strings.ToLower(volumesConfigPath)) { - c.Fatalf("Volume was not defined for %s/bar\n%q", prefix, out) - } -} - -// Regression test for #3631 -func (s *DockerSuite) TestRunSlowStdoutConsumer(c *check.C) { - // TODO Windows: This should be able to run on Windows if can find an - // alternate to /dev/zero and /dev/stdout. - testRequires(c, DaemonIsLinux) - cont := exec.Command(dockerBinary, "run", "--rm", "busybox", "/bin/sh", "-c", "dd if=/dev/zero of=/dev/stdout bs=1024 count=2000 | catv") - - stdout, err := cont.StdoutPipe() - if err != nil { - c.Fatal(err) - } - - if err := cont.Start(); err != nil { - c.Fatal(err) - } - n, err := consumeWithSpeed(stdout, 10000, 5*time.Millisecond, nil) - if err != nil { - c.Fatal(err) - } - - expected := 2 * 1024 * 2000 - if n != expected { - c.Fatalf("Expected %d, got %d", expected, n) - } -} - -func (s *DockerSuite) TestRunAllowPortRangeThroughExpose(c *check.C) { - // TODO Windows: -P is not currently supported. Also network - // settings are not propagated back. - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "--expose", "3000-3003", "-P", "busybox", "top") - - id := strings.TrimSpace(out) - portstr := inspectFieldJSON(c, id, "NetworkSettings.Ports") - var ports nat.PortMap - if err := json.Unmarshal([]byte(portstr), &ports); err != nil { - c.Fatal(err) - } - for port, binding := range ports { - portnum, _ := strconv.Atoi(strings.Split(string(port), "/")[0]) - if portnum < 3000 || portnum > 3003 { - c.Fatalf("Port %d is out of range ", portnum) - } - if binding == nil || len(binding) != 1 || len(binding[0].HostPort) == 0 { - c.Fatalf("Port is not mapped for the port %s", port) - } - } -} - -func (s *DockerSuite) TestRunExposePort(c *check.C) { - out, _, err := dockerCmdWithError("run", "--expose", "80000", "busybox") - c.Assert(err, checker.NotNil, check.Commentf("--expose with an invalid port should error out")) - c.Assert(out, checker.Contains, "invalid range format for --expose") -} - -func (s *DockerSuite) TestRunModeIpcHost(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace) - - hostIpc, err := os.Readlink("/proc/1/ns/ipc") - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "run", "--ipc=host", "busybox", "readlink", "/proc/self/ns/ipc") - out = strings.Trim(out, "\n") - if hostIpc != out { - c.Fatalf("IPC different with --ipc=host %s != %s\n", hostIpc, out) - } - - out, _ = dockerCmd(c, "run", "busybox", "readlink", "/proc/self/ns/ipc") - out = strings.Trim(out, "\n") - if hostIpc == out { - c.Fatalf("IPC should be different without --ipc=host %s == %s\n", hostIpc, out) - } -} - -func (s *DockerSuite) TestRunModeIpcContainer(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, SameHostDaemon, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", "echo -n test > /dev/shm/test && touch /dev/mqueue/toto && top") - - id := strings.TrimSpace(out) - state := inspectField(c, id, "State.Running") - if state != "true" { - c.Fatal("Container state is 'not running'") - } - pid1 := inspectField(c, id, "State.Pid") - - parentContainerIpc, err := os.Readlink(fmt.Sprintf("/proc/%s/ns/ipc", pid1)) - if err != nil { - c.Fatal(err) - } - - out, _ = dockerCmd(c, "run", fmt.Sprintf("--ipc=container:%s", id), "busybox", "readlink", "/proc/self/ns/ipc") - out = strings.Trim(out, "\n") - if parentContainerIpc != out { - c.Fatalf("IPC different with --ipc=container:%s %s != %s\n", id, parentContainerIpc, out) - } - - catOutput, _ := dockerCmd(c, "run", fmt.Sprintf("--ipc=container:%s", id), "busybox", "cat", "/dev/shm/test") - if catOutput != "test" { - c.Fatalf("Output of /dev/shm/test expected test but found: %s", catOutput) - } - - // check that /dev/mqueue is actually of mqueue type - grepOutput, _ := dockerCmd(c, "run", fmt.Sprintf("--ipc=container:%s", id), "busybox", "grep", "/dev/mqueue", "/proc/mounts") - if !strings.HasPrefix(grepOutput, "mqueue /dev/mqueue mqueue rw") { - c.Fatalf("Output of 'grep /proc/mounts' expected 'mqueue /dev/mqueue mqueue rw' but found: %s", grepOutput) - } - - lsOutput, _ := dockerCmd(c, "run", fmt.Sprintf("--ipc=container:%s", id), "busybox", "ls", "/dev/mqueue") - lsOutput = strings.Trim(lsOutput, "\n") - if lsOutput != "toto" { - c.Fatalf("Output of 'ls /dev/mqueue' expected 'toto' but found: %s", lsOutput) - } -} - -func (s *DockerSuite) TestRunModeIpcContainerNotExists(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "-d", "--ipc", "container:abcd1234", "busybox", "top") - if !strings.Contains(out, "abcd1234") || err == nil { - c.Fatalf("run IPC from a non exists container should with correct error out") - } -} - -func (s *DockerSuite) TestRunModeIpcContainerNotRunning(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, SameHostDaemon, DaemonIsLinux) - - out, _ := dockerCmd(c, "create", "busybox") - - id := strings.TrimSpace(out) - out, _, err := dockerCmdWithError("run", fmt.Sprintf("--ipc=container:%s", id), "busybox") - if err == nil { - c.Fatalf("Run container with ipc mode container should fail with non running container: %s\n%s", out, err) - } -} - -func (s *DockerSuite) TestRunModePIDContainer(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, SameHostDaemon, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", "top") - - id := strings.TrimSpace(out) - state := inspectField(c, id, "State.Running") - if state != "true" { - c.Fatal("Container state is 'not running'") - } - pid1 := inspectField(c, id, "State.Pid") - - parentContainerPid, err := os.Readlink(fmt.Sprintf("/proc/%s/ns/pid", pid1)) - if err != nil { - c.Fatal(err) - } - - out, _ = dockerCmd(c, "run", fmt.Sprintf("--pid=container:%s", id), "busybox", "readlink", "/proc/self/ns/pid") - out = strings.Trim(out, "\n") - if parentContainerPid != out { - c.Fatalf("PID different with --pid=container:%s %s != %s\n", id, parentContainerPid, out) - } -} - -func (s *DockerSuite) TestRunModePIDContainerNotExists(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "-d", "--pid", "container:abcd1234", "busybox", "top") - if !strings.Contains(out, "abcd1234") || err == nil { - c.Fatalf("run PID from a non exists container should with correct error out") - } -} - -func (s *DockerSuite) TestRunModePIDContainerNotRunning(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, SameHostDaemon, DaemonIsLinux) - - out, _ := dockerCmd(c, "create", "busybox") - - id := strings.TrimSpace(out) - out, _, err := dockerCmdWithError("run", fmt.Sprintf("--pid=container:%s", id), "busybox") - if err == nil { - c.Fatalf("Run container with pid mode container should fail with non running container: %s\n%s", out, err) - } -} - -func (s *DockerSuite) TestRunMountShmMqueueFromHost(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace) - - dockerCmd(c, "run", "-d", "--name", "shmfromhost", "-v", "/dev/shm:/dev/shm", "-v", "/dev/mqueue:/dev/mqueue", "busybox", "sh", "-c", "echo -n test > /dev/shm/test && touch /dev/mqueue/toto && top") - defer os.Remove("/dev/mqueue/toto") - defer os.Remove("/dev/shm/test") - volPath, err := inspectMountSourceField("shmfromhost", "/dev/shm") - c.Assert(err, checker.IsNil) - if volPath != "/dev/shm" { - c.Fatalf("volumePath should have been /dev/shm, was %s", volPath) - } - - out, _ := dockerCmd(c, "run", "--name", "ipchost", "--ipc", "host", "busybox", "cat", "/dev/shm/test") - if out != "test" { - c.Fatalf("Output of /dev/shm/test expected test but found: %s", out) - } - - // Check that the mq was created - if _, err := os.Stat("/dev/mqueue/toto"); err != nil { - c.Fatalf("Failed to confirm '/dev/mqueue/toto' presence on host: %s", err.Error()) - } -} - -func (s *DockerSuite) TestContainerNetworkMode(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, SameHostDaemon, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), check.IsNil) - pid1 := inspectField(c, id, "State.Pid") - - parentContainerNet, err := os.Readlink(fmt.Sprintf("/proc/%s/ns/net", pid1)) - if err != nil { - c.Fatal(err) - } - - out, _ = dockerCmd(c, "run", fmt.Sprintf("--net=container:%s", id), "busybox", "readlink", "/proc/self/ns/net") - out = strings.Trim(out, "\n") - if parentContainerNet != out { - c.Fatalf("NET different with --net=container:%s %s != %s\n", id, parentContainerNet, out) - } -} - -func (s *DockerSuite) TestRunModePIDHost(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace) - - hostPid, err := os.Readlink("/proc/1/ns/pid") - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "run", "--pid=host", "busybox", "readlink", "/proc/self/ns/pid") - out = strings.Trim(out, "\n") - if hostPid != out { - c.Fatalf("PID different with --pid=host %s != %s\n", hostPid, out) - } - - out, _ = dockerCmd(c, "run", "busybox", "readlink", "/proc/self/ns/pid") - out = strings.Trim(out, "\n") - if hostPid == out { - c.Fatalf("PID should be different without --pid=host %s == %s\n", hostPid, out) - } -} - -func (s *DockerSuite) TestRunModeUTSHost(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, SameHostDaemon, DaemonIsLinux) - - hostUTS, err := os.Readlink("/proc/1/ns/uts") - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "run", "--uts=host", "busybox", "readlink", "/proc/self/ns/uts") - out = strings.Trim(out, "\n") - if hostUTS != out { - c.Fatalf("UTS different with --uts=host %s != %s\n", hostUTS, out) - } - - out, _ = dockerCmd(c, "run", "busybox", "readlink", "/proc/self/ns/uts") - out = strings.Trim(out, "\n") - if hostUTS == out { - c.Fatalf("UTS should be different without --uts=host %s == %s\n", hostUTS, out) - } - - out, _ = dockerCmdWithFail(c, "run", "-h=name", "--uts=host", "busybox", "ps") - c.Assert(out, checker.Contains, runconfig.ErrConflictUTSHostname.Error()) -} - -func (s *DockerSuite) TestRunTLSVerify(c *check.C) { - // Remote daemons use TLS and this test is not applicable when TLS is required. - testRequires(c, SameHostDaemon) - if out, code, err := dockerCmdWithError("ps"); err != nil || code != 0 { - c.Fatalf("Should have worked: %v:\n%v", err, out) - } - - // Regardless of whether we specify true or false we need to - // test to make sure tls is turned on if --tlsverify is specified at all - result := dockerCmdWithResult("--tlsverify=false", "ps") - result.Assert(c, icmd.Expected{ExitCode: 1, Err: "error during connect"}) - - result = dockerCmdWithResult("--tlsverify=true", "ps") - result.Assert(c, icmd.Expected{ExitCode: 1, Err: "cert"}) -} - -func (s *DockerSuite) TestRunPortFromDockerRangeInUse(c *check.C) { - // TODO Windows. Once moved to libnetwork/CNM, this may be able to be - // re-instated. - testRequires(c, DaemonIsLinux) - // first find allocator current position - out, _ := dockerCmd(c, "run", "-d", "-p", ":80", "busybox", "top") - - id := strings.TrimSpace(out) - out, _ = dockerCmd(c, "port", id) - - out = strings.TrimSpace(out) - if out == "" { - c.Fatal("docker port command output is empty") - } - out = strings.Split(out, ":")[1] - lastPort, err := strconv.Atoi(out) - if err != nil { - c.Fatal(err) - } - port := lastPort + 1 - l, err := net.Listen("tcp", ":"+strconv.Itoa(port)) - if err != nil { - c.Fatal(err) - } - defer l.Close() - - out, _ = dockerCmd(c, "run", "-d", "-p", ":80", "busybox", "top") - - id = strings.TrimSpace(out) - dockerCmd(c, "port", id) -} - -func (s *DockerSuite) TestRunTTYWithPipe(c *check.C) { - errChan := make(chan error) - go func() { - defer close(errChan) - - cmd := exec.Command(dockerBinary, "run", "-ti", "busybox", "true") - if _, err := cmd.StdinPipe(); err != nil { - errChan <- err - return - } - - expected := "the input device is not a TTY" - if runtime.GOOS == "windows" { - expected += ". If you are using mintty, try prefixing the command with 'winpty'" - } - if out, _, err := runCommandWithOutput(cmd); err == nil { - errChan <- fmt.Errorf("run should have failed") - return - } else if !strings.Contains(out, expected) { - errChan <- fmt.Errorf("run failed with error %q: expected %q", out, expected) - return - } - }() - - select { - case err := <-errChan: - c.Assert(err, check.IsNil) - case <-time.After(30 * time.Second): - c.Fatal("container is running but should have failed") - } -} - -func (s *DockerSuite) TestRunNonLocalMacAddress(c *check.C) { - addr := "00:16:3E:08:00:50" - args := []string{"run", "--mac-address", addr} - expected := addr - - if daemonPlatform != "windows" { - args = append(args, "busybox", "ifconfig") - } else { - args = append(args, WindowsBaseImage, "ipconfig", "/all") - expected = strings.Replace(strings.ToUpper(addr), ":", "-", -1) - } - - if out, _ := dockerCmd(c, args...); !strings.Contains(out, expected) { - c.Fatalf("Output should have contained %q: %s", expected, out) - } -} - -func (s *DockerSuite) TestRunNetHost(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace) - - hostNet, err := os.Readlink("/proc/1/ns/net") - if err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "run", "--net=host", "busybox", "readlink", "/proc/self/ns/net") - out = strings.Trim(out, "\n") - if hostNet != out { - c.Fatalf("Net namespace different with --net=host %s != %s\n", hostNet, out) - } - - out, _ = dockerCmd(c, "run", "busybox", "readlink", "/proc/self/ns/net") - out = strings.Trim(out, "\n") - if hostNet == out { - c.Fatalf("Net namespace should be different without --net=host %s == %s\n", hostNet, out) - } -} - -func (s *DockerSuite) TestRunNetHostTwiceSameName(c *check.C) { - // TODO Windows. As Windows networking evolves and converges towards - // CNM, this test may be possible to enable on Windows. - testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace) - - dockerCmd(c, "run", "--rm", "--name=thost", "--net=host", "busybox", "true") - dockerCmd(c, "run", "--rm", "--name=thost", "--net=host", "busybox", "true") -} - -func (s *DockerSuite) TestRunNetContainerWhichHost(c *check.C) { - // Not applicable on Windows as uses Unix-specific capabilities - testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace) - - hostNet, err := os.Readlink("/proc/1/ns/net") - if err != nil { - c.Fatal(err) - } - - dockerCmd(c, "run", "-d", "--net=host", "--name=test", "busybox", "top") - - out, _ := dockerCmd(c, "run", "--net=container:test", "busybox", "readlink", "/proc/self/ns/net") - out = strings.Trim(out, "\n") - if hostNet != out { - c.Fatalf("Container should have host network namespace") - } -} - -func (s *DockerSuite) TestRunAllowPortRangeThroughPublish(c *check.C) { - // TODO Windows. This may be possible to enable in the future. However, - // Windows does not currently support --expose, or populate the network - // settings seen through inspect. - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "--expose", "3000-3003", "-p", "3000-3003", "busybox", "top") - - id := strings.TrimSpace(out) - portstr := inspectFieldJSON(c, id, "NetworkSettings.Ports") - - var ports nat.PortMap - err := json.Unmarshal([]byte(portstr), &ports) - c.Assert(err, checker.IsNil, check.Commentf("failed to unmarshal: %v", portstr)) - for port, binding := range ports { - portnum, _ := strconv.Atoi(strings.Split(string(port), "/")[0]) - if portnum < 3000 || portnum > 3003 { - c.Fatalf("Port %d is out of range ", portnum) - } - if binding == nil || len(binding) != 1 || len(binding[0].HostPort) == 0 { - c.Fatal("Port is not mapped for the port "+port, out) - } - } -} - -func (s *DockerSuite) TestRunSetDefaultRestartPolicy(c *check.C) { - runSleepingContainer(c, "--name=testrunsetdefaultrestartpolicy") - out := inspectField(c, "testrunsetdefaultrestartpolicy", "HostConfig.RestartPolicy.Name") - if out != "no" { - c.Fatalf("Set default restart policy failed") - } -} - -func (s *DockerSuite) TestRunRestartMaxRetries(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "--restart=on-failure:3", "busybox", "false") - timeout := 10 * time.Second - if daemonPlatform == "windows" { - timeout = 120 * time.Second - } - - id := strings.TrimSpace(string(out)) - if err := waitInspect(id, "{{ .State.Restarting }} {{ .State.Running }}", "false false", timeout); err != nil { - c.Fatal(err) - } - - count := inspectField(c, id, "RestartCount") - if count != "3" { - c.Fatalf("Container was restarted %s times, expected %d", count, 3) - } - - MaximumRetryCount := inspectField(c, id, "HostConfig.RestartPolicy.MaximumRetryCount") - if MaximumRetryCount != "3" { - c.Fatalf("Container Maximum Retry Count is %s, expected %s", MaximumRetryCount, "3") - } -} - -func (s *DockerSuite) TestRunContainerWithWritableRootfs(c *check.C) { - dockerCmd(c, "run", "--rm", "busybox", "touch", "/file") -} - -func (s *DockerSuite) TestRunContainerWithReadonlyRootfs(c *check.C) { - // Not applicable on Windows which does not support --read-only - testRequires(c, DaemonIsLinux, UserNamespaceROMount) - - testPriv := true - // don't test privileged mode subtest if user namespaces enabled - if root := os.Getenv("DOCKER_REMAP_ROOT"); root != "" { - testPriv = false - } - testReadOnlyFile(c, testPriv, "/file", "/etc/hosts", "/etc/resolv.conf", "/etc/hostname", "/sys/kernel", "/dev/.dont.touch.me") -} - -func (s *DockerSuite) TestPermissionsPtsReadonlyRootfs(c *check.C) { - // Not applicable on Windows due to use of Unix specific functionality, plus - // the use of --read-only which is not supported. - testRequires(c, DaemonIsLinux, UserNamespaceROMount) - - // Ensure we have not broken writing /dev/pts - out, status := dockerCmd(c, "run", "--read-only", "--rm", "busybox", "mount") - if status != 0 { - c.Fatal("Could not obtain mounts when checking /dev/pts mntpnt.") - } - expected := "type devpts (rw," - if !strings.Contains(string(out), expected) { - c.Fatalf("expected output to contain %s but contains %s", expected, out) - } -} - -func testReadOnlyFile(c *check.C, testPriv bool, filenames ...string) { - touch := "touch " + strings.Join(filenames, " ") - out, _, err := dockerCmdWithError("run", "--read-only", "--rm", "busybox", "sh", "-c", touch) - c.Assert(err, checker.NotNil) - - for _, f := range filenames { - expected := "touch: " + f + ": Read-only file system" - c.Assert(out, checker.Contains, expected) - } - - if !testPriv { - return - } - - out, _, err = dockerCmdWithError("run", "--read-only", "--privileged", "--rm", "busybox", "sh", "-c", touch) - c.Assert(err, checker.NotNil) - - for _, f := range filenames { - expected := "touch: " + f + ": Read-only file system" - c.Assert(out, checker.Contains, expected) - } -} - -func (s *DockerSuite) TestRunContainerWithReadonlyEtcHostsAndLinkedContainer(c *check.C) { - // Not applicable on Windows which does not support --link - testRequires(c, DaemonIsLinux, UserNamespaceROMount) - - dockerCmd(c, "run", "-d", "--name", "test-etc-hosts-ro-linked", "busybox", "top") - - out, _ := dockerCmd(c, "run", "--read-only", "--link", "test-etc-hosts-ro-linked:testlinked", "busybox", "cat", "/etc/hosts") - if !strings.Contains(string(out), "testlinked") { - c.Fatal("Expected /etc/hosts to be updated even if --read-only enabled") - } -} - -func (s *DockerSuite) TestRunContainerWithReadonlyRootfsWithDNSFlag(c *check.C) { - // Not applicable on Windows which does not support either --read-only or --dns. - testRequires(c, DaemonIsLinux, UserNamespaceROMount) - - out, _ := dockerCmd(c, "run", "--read-only", "--dns", "1.1.1.1", "busybox", "/bin/cat", "/etc/resolv.conf") - if !strings.Contains(string(out), "1.1.1.1") { - c.Fatal("Expected /etc/resolv.conf to be updated even if --read-only enabled and --dns flag used") - } -} - -func (s *DockerSuite) TestRunContainerWithReadonlyRootfsWithAddHostFlag(c *check.C) { - // Not applicable on Windows which does not support --read-only - testRequires(c, DaemonIsLinux, UserNamespaceROMount) - - out, _ := dockerCmd(c, "run", "--read-only", "--add-host", "testreadonly:127.0.0.1", "busybox", "/bin/cat", "/etc/hosts") - if !strings.Contains(string(out), "testreadonly") { - c.Fatal("Expected /etc/hosts to be updated even if --read-only enabled and --add-host flag used") - } -} - -func (s *DockerSuite) TestRunVolumesFromRestartAfterRemoved(c *check.C) { - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - runSleepingContainer(c, "--name=voltest", "-v", prefix+"/foo") - runSleepingContainer(c, "--name=restarter", "--volumes-from", "voltest") - - // Remove the main volume container and restart the consuming container - dockerCmd(c, "rm", "-f", "voltest") - - // This should not fail since the volumes-from were already applied - dockerCmd(c, "restart", "restarter") -} - -// run container with --rm should remove container if exit code != 0 -func (s *DockerSuite) TestRunContainerWithRmFlagExitCodeNotEqualToZero(c *check.C) { - name := "flowers" - out, _, err := dockerCmdWithError("run", "--name", name, "--rm", "busybox", "ls", "/notexists") - if err == nil { - c.Fatal("Expected docker run to fail", out, err) - } - - out, err = getAllContainers() - if err != nil { - c.Fatal(out, err) - } - - if out != "" { - c.Fatal("Expected not to have containers", out) - } -} - -func (s *DockerSuite) TestRunContainerWithRmFlagCannotStartContainer(c *check.C) { - name := "sparkles" - out, _, err := dockerCmdWithError("run", "--name", name, "--rm", "busybox", "commandNotFound") - if err == nil { - c.Fatal("Expected docker run to fail", out, err) - } - - out, err = getAllContainers() - if err != nil { - c.Fatal(out, err) - } - - if out != "" { - c.Fatal("Expected not to have containers", out) - } -} - -func (s *DockerSuite) TestRunPIDHostWithChildIsKillable(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux, NotUserNamespace) - name := "ibuildthecloud" - dockerCmd(c, "run", "-d", "--pid=host", "--name", name, "busybox", "sh", "-c", "sleep 30; echo hi") - - c.Assert(waitRun(name), check.IsNil) - - errchan := make(chan error) - go func() { - if out, _, err := dockerCmdWithError("kill", name); err != nil { - errchan <- fmt.Errorf("%v:\n%s", err, out) - } - close(errchan) - }() - select { - case err := <-errchan: - c.Assert(err, check.IsNil) - case <-time.After(5 * time.Second): - c.Fatal("Kill container timed out") - } -} - -func (s *DockerSuite) TestRunWithTooSmallMemoryLimit(c *check.C) { - // TODO Windows. This may be possible to enable once Windows supports - // memory limits on containers - testRequires(c, DaemonIsLinux) - // this memory limit is 1 byte less than the min, which is 4MB - // https://github.com/docker/docker/blob/v1.5.0/daemon/create.go#L22 - out, _, err := dockerCmdWithError("run", "-m", "4194303", "busybox") - if err == nil || !strings.Contains(out, "Minimum memory limit allowed is 4MB") { - c.Fatalf("expected run to fail when using too low a memory limit: %q", out) - } -} - -func (s *DockerSuite) TestRunWriteToProcAsound(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - _, code, err := dockerCmdWithError("run", "busybox", "sh", "-c", "echo 111 >> /proc/asound/version") - if err == nil || code == 0 { - c.Fatal("standard container should not be able to write to /proc/asound") - } -} - -func (s *DockerSuite) TestRunReadProcTimer(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - out, code, err := dockerCmdWithError("run", "busybox", "cat", "/proc/timer_stats") - if code != 0 { - return - } - if err != nil { - c.Fatal(err) - } - if strings.Trim(out, "\n ") != "" { - c.Fatalf("expected to receive no output from /proc/timer_stats but received %q", out) - } -} - -func (s *DockerSuite) TestRunReadProcLatency(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - // some kernels don't have this configured so skip the test if this file is not found - // on the host running the tests. - if _, err := os.Stat("/proc/latency_stats"); err != nil { - c.Skip("kernel doesn't have latency_stats configured") - return - } - out, code, err := dockerCmdWithError("run", "busybox", "cat", "/proc/latency_stats") - if code != 0 { - return - } - if err != nil { - c.Fatal(err) - } - if strings.Trim(out, "\n ") != "" { - c.Fatalf("expected to receive no output from /proc/latency_stats but received %q", out) - } -} - -func (s *DockerSuite) TestRunReadFilteredProc(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, Apparmor, DaemonIsLinux, NotUserNamespace) - - testReadPaths := []string{ - "/proc/latency_stats", - "/proc/timer_stats", - "/proc/kcore", - } - for i, filePath := range testReadPaths { - name := fmt.Sprintf("procsieve-%d", i) - shellCmd := fmt.Sprintf("exec 3<%s", filePath) - - out, exitCode, err := dockerCmdWithError("run", "--privileged", "--security-opt", "apparmor=docker-default", "--name", name, "busybox", "sh", "-c", shellCmd) - if exitCode != 0 { - return - } - if err != nil { - c.Fatalf("Open FD for read should have failed with permission denied, got: %s, %v", out, err) - } - } -} - -func (s *DockerSuite) TestMountIntoProc(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - _, code, err := dockerCmdWithError("run", "-v", "/proc//sys", "busybox", "true") - if err == nil || code == 0 { - c.Fatal("container should not be able to mount into /proc") - } -} - -func (s *DockerSuite) TestMountIntoSys(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - testRequires(c, NotUserNamespace) - dockerCmd(c, "run", "-v", "/sys/fs/cgroup", "busybox", "true") -} - -func (s *DockerSuite) TestRunUnshareProc(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, Apparmor, DaemonIsLinux, NotUserNamespace) - - // In this test goroutines are used to run test cases in parallel to prevent the test from taking a long time to run. - errChan := make(chan error) - - go func() { - name := "acidburn" - out, _, err := dockerCmdWithError("run", "--name", name, "--security-opt", "seccomp=unconfined", "debian:jessie", "unshare", "-p", "-m", "-f", "-r", "--mount-proc=/proc", "mount") - if err == nil || - !(strings.Contains(strings.ToLower(out), "permission denied") || - strings.Contains(strings.ToLower(out), "operation not permitted")) { - errChan <- fmt.Errorf("unshare with --mount-proc should have failed with 'permission denied' or 'operation not permitted', got: %s, %v", out, err) - } else { - errChan <- nil - } - }() - - go func() { - name := "cereal" - out, _, err := dockerCmdWithError("run", "--name", name, "--security-opt", "seccomp=unconfined", "debian:jessie", "unshare", "-p", "-m", "-f", "-r", "mount", "-t", "proc", "none", "/proc") - if err == nil || - !(strings.Contains(strings.ToLower(out), "mount: cannot mount none") || - strings.Contains(strings.ToLower(out), "permission denied") || - strings.Contains(strings.ToLower(out), "operation not permitted")) { - errChan <- fmt.Errorf("unshare and mount of /proc should have failed with 'mount: cannot mount none' or 'permission denied', got: %s, %v", out, err) - } else { - errChan <- nil - } - }() - - /* Ensure still fails if running privileged with the default policy */ - go func() { - name := "crashoverride" - out, _, err := dockerCmdWithError("run", "--privileged", "--security-opt", "seccomp=unconfined", "--security-opt", "apparmor=docker-default", "--name", name, "debian:jessie", "unshare", "-p", "-m", "-f", "-r", "mount", "-t", "proc", "none", "/proc") - if err == nil || - !(strings.Contains(strings.ToLower(out), "mount: cannot mount none") || - strings.Contains(strings.ToLower(out), "permission denied") || - strings.Contains(strings.ToLower(out), "operation not permitted")) { - errChan <- fmt.Errorf("privileged unshare with apparmor should have failed with 'mount: cannot mount none' or 'permission denied', got: %s, %v", out, err) - } else { - errChan <- nil - } - }() - - for i := 0; i < 3; i++ { - err := <-errChan - if err != nil { - c.Fatal(err) - } - } -} - -func (s *DockerSuite) TestRunPublishPort(c *check.C) { - // TODO Windows: This may be possible once Windows moves to libnetwork and CNM - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--name", "test", "--expose", "8080", "busybox", "top") - out, _ := dockerCmd(c, "port", "test") - out = strings.Trim(out, "\r\n") - if out != "" { - c.Fatalf("run without --publish-all should not publish port, out should be nil, but got: %s", out) - } -} - -// Issue #10184. -func (s *DockerSuite) TestDevicePermissions(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - const permissions = "crw-rw-rw-" - out, status := dockerCmd(c, "run", "--device", "/dev/fuse:/dev/fuse:mrw", "busybox:latest", "ls", "-l", "/dev/fuse") - if status != 0 { - c.Fatalf("expected status 0, got %d", status) - } - if !strings.HasPrefix(out, permissions) { - c.Fatalf("output should begin with %q, got %q", permissions, out) - } -} - -func (s *DockerSuite) TestRunCapAddCHOWN(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "--cap-drop=ALL", "--cap-add=CHOWN", "busybox", "sh", "-c", "adduser -D -H newuser && chown newuser /home && echo ok") - - if actual := strings.Trim(out, "\r\n"); actual != "ok" { - c.Fatalf("expected output ok received %s", actual) - } -} - -// https://github.com/docker/docker/pull/14498 -func (s *DockerSuite) TestVolumeFromMixedRWOptions(c *check.C) { - prefix, slash := getPrefixAndSlashFromDaemonPlatform() - - dockerCmd(c, "run", "--name", "parent", "-v", prefix+"/test", "busybox", "true") - - // TODO Windows: Temporary check - remove once TP5 support is dropped - if daemonPlatform != "windows" || windowsDaemonKV >= 14350 { - dockerCmd(c, "run", "--volumes-from", "parent:ro", "--name", "test-volumes-1", "busybox", "true") - } - dockerCmd(c, "run", "--volumes-from", "parent:rw", "--name", "test-volumes-2", "busybox", "true") - - if daemonPlatform != "windows" { - mRO, err := inspectMountPoint("test-volumes-1", prefix+slash+"test") - c.Assert(err, checker.IsNil, check.Commentf("failed to inspect mount point")) - if mRO.RW { - c.Fatalf("Expected RO volume was RW") - } - } - - mRW, err := inspectMountPoint("test-volumes-2", prefix+slash+"test") - c.Assert(err, checker.IsNil, check.Commentf("failed to inspect mount point")) - if !mRW.RW { - c.Fatalf("Expected RW volume was RO") - } -} - -func (s *DockerSuite) TestRunWriteFilteredProc(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, Apparmor, DaemonIsLinux, NotUserNamespace) - - testWritePaths := []string{ - /* modprobe and core_pattern should both be denied by generic - * policy of denials for /proc/sys/kernel. These files have been - * picked to be checked as they are particularly sensitive to writes */ - "/proc/sys/kernel/modprobe", - "/proc/sys/kernel/core_pattern", - "/proc/sysrq-trigger", - "/proc/kcore", - } - for i, filePath := range testWritePaths { - name := fmt.Sprintf("writeprocsieve-%d", i) - - shellCmd := fmt.Sprintf("exec 3>%s", filePath) - out, code, err := dockerCmdWithError("run", "--privileged", "--security-opt", "apparmor=docker-default", "--name", name, "busybox", "sh", "-c", shellCmd) - if code != 0 { - return - } - if err != nil { - c.Fatalf("Open FD for write should have failed with permission denied, got: %s, %v", out, err) - } - } -} - -func (s *DockerSuite) TestRunNetworkFilesBindMount(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, SameHostDaemon, DaemonIsLinux) - - expected := "test123" - - filename := createTmpFile(c, expected) - defer os.Remove(filename) - - nwfiles := []string{"/etc/resolv.conf", "/etc/hosts", "/etc/hostname"} - - for i := range nwfiles { - actual, _ := dockerCmd(c, "run", "-v", filename+":"+nwfiles[i], "busybox", "cat", nwfiles[i]) - if actual != expected { - c.Fatalf("expected %s be: %q, but was: %q", nwfiles[i], expected, actual) - } - } -} - -func (s *DockerSuite) TestRunNetworkFilesBindMountRO(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, SameHostDaemon, DaemonIsLinux) - - filename := createTmpFile(c, "test123") - defer os.Remove(filename) - - nwfiles := []string{"/etc/resolv.conf", "/etc/hosts", "/etc/hostname"} - - for i := range nwfiles { - _, exitCode, err := dockerCmdWithError("run", "-v", filename+":"+nwfiles[i]+":ro", "busybox", "touch", nwfiles[i]) - if err == nil || exitCode == 0 { - c.Fatalf("run should fail because bind mount of %s is ro: exit code %d", nwfiles[i], exitCode) - } - } -} - -func (s *DockerSuite) TestRunNetworkFilesBindMountROFilesystem(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, SameHostDaemon, DaemonIsLinux, UserNamespaceROMount) - - filename := createTmpFile(c, "test123") - defer os.Remove(filename) - - nwfiles := []string{"/etc/resolv.conf", "/etc/hosts", "/etc/hostname"} - - for i := range nwfiles { - _, exitCode := dockerCmd(c, "run", "-v", filename+":"+nwfiles[i], "--read-only", "busybox", "touch", nwfiles[i]) - if exitCode != 0 { - c.Fatalf("run should not fail because %s is mounted writable on read-only root filesystem: exit code %d", nwfiles[i], exitCode) - } - } - - for i := range nwfiles { - _, exitCode, err := dockerCmdWithError("run", "-v", filename+":"+nwfiles[i]+":ro", "--read-only", "busybox", "touch", nwfiles[i]) - if err == nil || exitCode == 0 { - c.Fatalf("run should fail because %s is mounted read-only on read-only root filesystem: exit code %d", nwfiles[i], exitCode) - } - } -} - -func (s *DockerTrustSuite) TestTrustedRun(c *check.C) { - // Windows does not support this functionality - testRequires(c, DaemonIsLinux) - repoName := s.setupTrustedImage(c, "trusted-run") - - // Try run - runCmd := exec.Command(dockerBinary, "run", repoName) - s.trustedCmd(runCmd) - out, _, err := runCommandWithOutput(runCmd) - if err != nil { - c.Fatalf("Error running trusted run: %s\n%s\n", err, out) - } - - if !strings.Contains(string(out), "Tagging") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } - - dockerCmd(c, "rmi", repoName) - - // Try untrusted run to ensure we pushed the tag to the registry - runCmd = exec.Command(dockerBinary, "run", "--disable-content-trust=true", repoName) - s.trustedCmd(runCmd) - out, _, err = runCommandWithOutput(runCmd) - if err != nil { - c.Fatalf("Error running trusted run: %s\n%s", err, out) - } - - if !strings.Contains(string(out), "Status: Downloaded") { - c.Fatalf("Missing expected output on trusted run with --disable-content-trust:\n%s", out) - } -} - -func (s *DockerTrustSuite) TestUntrustedRun(c *check.C) { - // Windows does not support this functionality - testRequires(c, DaemonIsLinux) - repoName := fmt.Sprintf("%v/dockercliuntrusted/runtest:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - dockerCmd(c, "push", repoName) - dockerCmd(c, "rmi", repoName) - - // Try trusted run on untrusted tag - runCmd := exec.Command(dockerBinary, "run", repoName) - s.trustedCmd(runCmd) - out, _, err := runCommandWithOutput(runCmd) - if err == nil { - c.Fatalf("Error expected when running trusted run with:\n%s", out) - } - - if !strings.Contains(string(out), "does not have trust data for") { - c.Fatalf("Missing expected output on trusted run:\n%s", out) - } -} - -func (s *DockerTrustSuite) TestRunWhenCertExpired(c *check.C) { - // Windows does not support this functionality - testRequires(c, DaemonIsLinux) - c.Skip("Currently changes system time, causing instability") - repoName := s.setupTrustedImage(c, "trusted-run-expired") - - // Certificates have 10 years of expiration - elevenYearsFromNow := time.Now().Add(time.Hour * 24 * 365 * 11) - - runAtDifferentDate(elevenYearsFromNow, func() { - // Try run - runCmd := exec.Command(dockerBinary, "run", repoName) - s.trustedCmd(runCmd) - out, _, err := runCommandWithOutput(runCmd) - if err == nil { - c.Fatalf("Error running trusted run in the distant future: %s\n%s", err, out) - } - - if !strings.Contains(string(out), "could not validate the path to a trusted root") { - c.Fatalf("Missing expected output on trusted run in the distant future:\n%s", out) - } - }) - - runAtDifferentDate(elevenYearsFromNow, func() { - // Try run - runCmd := exec.Command(dockerBinary, "run", "--disable-content-trust", repoName) - s.trustedCmd(runCmd) - out, _, err := runCommandWithOutput(runCmd) - if err != nil { - c.Fatalf("Error running untrusted run in the distant future: %s\n%s", err, out) - } - - if !strings.Contains(string(out), "Status: Downloaded") { - c.Fatalf("Missing expected output on untrusted run in the distant future:\n%s", out) - } - }) -} - -func (s *DockerTrustSuite) TestTrustedRunFromBadTrustServer(c *check.C) { - // Windows does not support this functionality - testRequires(c, DaemonIsLinux) - repoName := fmt.Sprintf("%v/dockerclievilrun/trusted:latest", privateRegistryURL) - evilLocalConfigDir, err := ioutil.TempDir("", "evilrun-local-config-dir") - if err != nil { - c.Fatalf("Failed to create local temp dir") - } - - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - if err != nil { - c.Fatalf("Error running trusted push: %s\n%s", err, out) - } - if !strings.Contains(string(out), "Signing and pushing trust metadata") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } - - dockerCmd(c, "rmi", repoName) - - // Try run - runCmd := exec.Command(dockerBinary, "run", repoName) - s.trustedCmd(runCmd) - out, _, err = runCommandWithOutput(runCmd) - if err != nil { - c.Fatalf("Error running trusted run: %s\n%s", err, out) - } - - if !strings.Contains(string(out), "Tagging") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } - - dockerCmd(c, "rmi", repoName) - - // Kill the notary server, start a new "evil" one. - s.not.Close() - s.not, err = newTestNotary(c) - if err != nil { - c.Fatalf("Restarting notary server failed.") - } - - // In order to make an evil server, lets re-init a client (with a different trust dir) and push new data. - // tag an image and upload it to the private registry - dockerCmd(c, "--config", evilLocalConfigDir, "tag", "busybox", repoName) - - // Push up to the new server - pushCmd = exec.Command(dockerBinary, "--config", evilLocalConfigDir, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - if err != nil { - c.Fatalf("Error running trusted push: %s\n%s", err, out) - } - if !strings.Contains(string(out), "Signing and pushing trust metadata") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } - - // Now, try running with the original client from this new trust server. This should fail because the new root is invalid. - runCmd = exec.Command(dockerBinary, "run", repoName) - s.trustedCmd(runCmd) - out, _, err = runCommandWithOutput(runCmd) - - if err == nil { - c.Fatalf("Continuing with cached data even though it's an invalid root rotation: %s\n%s", err, out) - } - if !strings.Contains(out, "could not rotate trust to a new trusted root") { - c.Fatalf("Missing expected output on trusted run:\n%s", out) - } -} - -func (s *DockerSuite) TestPtraceContainerProcsFromHost(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux, SameHostDaemon) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), check.IsNil) - pid1 := inspectField(c, id, "State.Pid") - - _, err := os.Readlink(fmt.Sprintf("/proc/%s/ns/net", pid1)) - if err != nil { - c.Fatal(err) - } -} - -func (s *DockerSuite) TestAppArmorDeniesPtrace(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, SameHostDaemon, Apparmor, DaemonIsLinux) - - // Run through 'sh' so we are NOT pid 1. Pid 1 may be able to trace - // itself, but pid>1 should not be able to trace pid1. - _, exitCode, _ := dockerCmdWithError("run", "busybox", "sh", "-c", "sh -c readlink /proc/1/ns/net") - if exitCode == 0 { - c.Fatal("ptrace was not successfully restricted by AppArmor") - } -} - -func (s *DockerSuite) TestAppArmorTraceSelf(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux, SameHostDaemon, Apparmor) - - _, exitCode, _ := dockerCmdWithError("run", "busybox", "readlink", "/proc/1/ns/net") - if exitCode != 0 { - c.Fatal("ptrace of self failed.") - } -} - -func (s *DockerSuite) TestAppArmorDeniesChmodProc(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, SameHostDaemon, Apparmor, DaemonIsLinux, NotUserNamespace) - _, exitCode, _ := dockerCmdWithError("run", "busybox", "chmod", "744", "/proc/cpuinfo") - if exitCode == 0 { - // If our test failed, attempt to repair the host system... - _, exitCode, _ := dockerCmdWithError("run", "busybox", "chmod", "444", "/proc/cpuinfo") - if exitCode == 0 { - c.Fatal("AppArmor was unsuccessful in prohibiting chmod of /proc/* files.") - } - } -} - -func (s *DockerSuite) TestRunCapAddSYSTIME(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - - dockerCmd(c, "run", "--cap-drop=ALL", "--cap-add=SYS_TIME", "busybox", "sh", "-c", "grep ^CapEff /proc/self/status | sed 's/^CapEff:\t//' | grep ^0000000002000000$") -} - -// run create container failed should clean up the container -func (s *DockerSuite) TestRunCreateContainerFailedCleanUp(c *check.C) { - // TODO Windows. This may be possible to enable once link is supported - testRequires(c, DaemonIsLinux) - name := "unique_name" - _, _, err := dockerCmdWithError("run", "--name", name, "--link", "nothing:nothing", "busybox") - c.Assert(err, check.NotNil, check.Commentf("Expected docker run to fail!")) - - containerID, err := inspectFieldWithError(name, "Id") - c.Assert(err, checker.NotNil, check.Commentf("Expected not to have this container: %s!", containerID)) - c.Assert(containerID, check.Equals, "", check.Commentf("Expected not to have this container: %s!", containerID)) -} - -func (s *DockerSuite) TestRunNamedVolume(c *check.C) { - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "--name=test", "-v", "testing:"+prefix+"/foo", "busybox", "sh", "-c", "echo hello > "+prefix+"/foo/bar") - - out, _ := dockerCmd(c, "run", "--volumes-from", "test", "busybox", "sh", "-c", "cat "+prefix+"/foo/bar") - c.Assert(strings.TrimSpace(out), check.Equals, "hello") - - out, _ = dockerCmd(c, "run", "-v", "testing:"+prefix+"/foo", "busybox", "sh", "-c", "cat "+prefix+"/foo/bar") - c.Assert(strings.TrimSpace(out), check.Equals, "hello") -} - -func (s *DockerSuite) TestRunWithUlimits(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "--name=testulimits", "--ulimit", "nofile=42", "busybox", "/bin/sh", "-c", "ulimit -n") - ul := strings.TrimSpace(out) - if ul != "42" { - c.Fatalf("expected `ulimit -n` to be 42, got %s", ul) - } -} - -func (s *DockerSuite) TestRunContainerWithCgroupParent(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - - cgroupParent := "test" - name := "cgroup-test" - - out, _, err := dockerCmdWithError("run", "--cgroup-parent", cgroupParent, "--name", name, "busybox", "cat", "/proc/self/cgroup") - if err != nil { - c.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err) - } - cgroupPaths := parseCgroupPaths(string(out)) - if len(cgroupPaths) == 0 { - c.Fatalf("unexpected output - %q", string(out)) - } - id, err := getIDByName(name) - c.Assert(err, check.IsNil) - expectedCgroup := path.Join(cgroupParent, id) - found := false - for _, path := range cgroupPaths { - if strings.HasSuffix(path, expectedCgroup) { - found = true - break - } - } - if !found { - c.Fatalf("unexpected cgroup paths. Expected at least one cgroup path to have suffix %q. Cgroup Paths: %v", expectedCgroup, cgroupPaths) - } -} - -func (s *DockerSuite) TestRunContainerWithCgroupParentAbsPath(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - - cgroupParent := "/cgroup-parent/test" - name := "cgroup-test" - out, _, err := dockerCmdWithError("run", "--cgroup-parent", cgroupParent, "--name", name, "busybox", "cat", "/proc/self/cgroup") - if err != nil { - c.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err) - } - cgroupPaths := parseCgroupPaths(string(out)) - if len(cgroupPaths) == 0 { - c.Fatalf("unexpected output - %q", string(out)) - } - id, err := getIDByName(name) - c.Assert(err, check.IsNil) - expectedCgroup := path.Join(cgroupParent, id) - found := false - for _, path := range cgroupPaths { - if strings.HasSuffix(path, expectedCgroup) { - found = true - break - } - } - if !found { - c.Fatalf("unexpected cgroup paths. Expected at least one cgroup path to have suffix %q. Cgroup Paths: %v", expectedCgroup, cgroupPaths) - } -} - -// TestRunInvalidCgroupParent checks that a specially-crafted cgroup parent doesn't cause Docker to crash or start modifying /. -func (s *DockerSuite) TestRunInvalidCgroupParent(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - - cgroupParent := "../../../../../../../../SHOULD_NOT_EXIST" - cleanCgroupParent := "SHOULD_NOT_EXIST" - name := "cgroup-invalid-test" - - out, _, err := dockerCmdWithError("run", "--cgroup-parent", cgroupParent, "--name", name, "busybox", "cat", "/proc/self/cgroup") - if err != nil { - // XXX: This may include a daemon crash. - c.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err) - } - - // We expect "/SHOULD_NOT_EXIST" to not exist. If not, we have a security issue. - if _, err := os.Stat("/SHOULD_NOT_EXIST"); err == nil || !os.IsNotExist(err) { - c.Fatalf("SECURITY: --cgroup-parent with ../../ relative paths cause files to be created in the host (this is bad) !!") - } - - cgroupPaths := parseCgroupPaths(string(out)) - if len(cgroupPaths) == 0 { - c.Fatalf("unexpected output - %q", string(out)) - } - id, err := getIDByName(name) - c.Assert(err, check.IsNil) - expectedCgroup := path.Join(cleanCgroupParent, id) - found := false - for _, path := range cgroupPaths { - if strings.HasSuffix(path, expectedCgroup) { - found = true - break - } - } - if !found { - c.Fatalf("unexpected cgroup paths. Expected at least one cgroup path to have suffix %q. Cgroup Paths: %v", expectedCgroup, cgroupPaths) - } -} - -// TestRunInvalidCgroupParent checks that a specially-crafted cgroup parent doesn't cause Docker to crash or start modifying /. -func (s *DockerSuite) TestRunAbsoluteInvalidCgroupParent(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - testRequires(c, DaemonIsLinux) - - cgroupParent := "/../../../../../../../../SHOULD_NOT_EXIST" - cleanCgroupParent := "/SHOULD_NOT_EXIST" - name := "cgroup-absolute-invalid-test" - - out, _, err := dockerCmdWithError("run", "--cgroup-parent", cgroupParent, "--name", name, "busybox", "cat", "/proc/self/cgroup") - if err != nil { - // XXX: This may include a daemon crash. - c.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err) - } - - // We expect "/SHOULD_NOT_EXIST" to not exist. If not, we have a security issue. - if _, err := os.Stat("/SHOULD_NOT_EXIST"); err == nil || !os.IsNotExist(err) { - c.Fatalf("SECURITY: --cgroup-parent with /../../ garbage paths cause files to be created in the host (this is bad) !!") - } - - cgroupPaths := parseCgroupPaths(string(out)) - if len(cgroupPaths) == 0 { - c.Fatalf("unexpected output - %q", string(out)) - } - id, err := getIDByName(name) - c.Assert(err, check.IsNil) - expectedCgroup := path.Join(cleanCgroupParent, id) - found := false - for _, path := range cgroupPaths { - if strings.HasSuffix(path, expectedCgroup) { - found = true - break - } - } - if !found { - c.Fatalf("unexpected cgroup paths. Expected at least one cgroup path to have suffix %q. Cgroup Paths: %v", expectedCgroup, cgroupPaths) - } -} - -func (s *DockerSuite) TestRunContainerWithCgroupMountRO(c *check.C) { - // Not applicable on Windows as uses Unix specific functionality - // --read-only + userns has remount issues - testRequires(c, DaemonIsLinux, NotUserNamespace) - - filename := "/sys/fs/cgroup/devices/test123" - out, _, err := dockerCmdWithError("run", "busybox", "touch", filename) - if err == nil { - c.Fatal("expected cgroup mount point to be read-only, touch file should fail") - } - expected := "Read-only file system" - if !strings.Contains(out, expected) { - c.Fatalf("expected output from failure to contain %s but contains %s", expected, out) - } -} - -func (s *DockerSuite) TestRunContainerNetworkModeToSelf(c *check.C) { - // Not applicable on Windows which does not support --net=container - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "--name=me", "--net=container:me", "busybox", "true") - if err == nil || !strings.Contains(out, "cannot join own network") { - c.Fatalf("using container net mode to self should result in an error\nerr: %q\nout: %s", err, out) - } -} - -func (s *DockerSuite) TestRunContainerNetModeWithDNSMacHosts(c *check.C) { - // Not applicable on Windows which does not support --net=container - testRequires(c, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "-d", "--name", "parent", "busybox", "top") - if err != nil { - c.Fatalf("failed to run container: %v, output: %q", err, out) - } - - out, _, err = dockerCmdWithError("run", "--dns", "1.2.3.4", "--net=container:parent", "busybox") - if err == nil || !strings.Contains(out, runconfig.ErrConflictNetworkAndDNS.Error()) { - c.Fatalf("run --net=container with --dns should error out") - } - - out, _, err = dockerCmdWithError("run", "--mac-address", "92:d0:c6:0a:29:33", "--net=container:parent", "busybox") - if err == nil || !strings.Contains(out, runconfig.ErrConflictContainerNetworkAndMac.Error()) { - c.Fatalf("run --net=container with --mac-address should error out") - } - - out, _, err = dockerCmdWithError("run", "--add-host", "test:192.168.2.109", "--net=container:parent", "busybox") - if err == nil || !strings.Contains(out, runconfig.ErrConflictNetworkHosts.Error()) { - c.Fatalf("run --net=container with --add-host should error out") - } -} - -func (s *DockerSuite) TestRunContainerNetModeWithExposePort(c *check.C) { - // Not applicable on Windows which does not support --net=container - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--name", "parent", "busybox", "top") - - out, _, err := dockerCmdWithError("run", "-p", "5000:5000", "--net=container:parent", "busybox") - if err == nil || !strings.Contains(out, runconfig.ErrConflictNetworkPublishPorts.Error()) { - c.Fatalf("run --net=container with -p should error out") - } - - out, _, err = dockerCmdWithError("run", "-P", "--net=container:parent", "busybox") - if err == nil || !strings.Contains(out, runconfig.ErrConflictNetworkPublishPorts.Error()) { - c.Fatalf("run --net=container with -P should error out") - } - - out, _, err = dockerCmdWithError("run", "--expose", "5000", "--net=container:parent", "busybox") - if err == nil || !strings.Contains(out, runconfig.ErrConflictNetworkExposePorts.Error()) { - c.Fatalf("run --net=container with --expose should error out") - } -} - -func (s *DockerSuite) TestRunLinkToContainerNetMode(c *check.C) { - // Not applicable on Windows which does not support --net=container or --link - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "--name", "test", "-d", "busybox", "top") - dockerCmd(c, "run", "--name", "parent", "-d", "--net=container:test", "busybox", "top") - dockerCmd(c, "run", "-d", "--link=parent:parent", "busybox", "top") - dockerCmd(c, "run", "--name", "child", "-d", "--net=container:parent", "busybox", "top") - dockerCmd(c, "run", "-d", "--link=child:child", "busybox", "top") -} - -func (s *DockerSuite) TestRunLoopbackOnlyExistsWhenNetworkingDisabled(c *check.C) { - // TODO Windows: This may be possible to convert. - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "--net=none", "busybox", "ip", "-o", "-4", "a", "show", "up") - - var ( - count = 0 - parts = strings.Split(out, "\n") - ) - - for _, l := range parts { - if l != "" { - count++ - } - } - - if count != 1 { - c.Fatalf("Wrong interface count in container %d", count) - } - - if !strings.HasPrefix(out, "1: lo") { - c.Fatalf("Wrong interface in test container: expected [1: lo], got %s", out) - } -} - -// Issue #4681 -func (s *DockerSuite) TestRunLoopbackWhenNetworkDisabled(c *check.C) { - if daemonPlatform == "windows" { - dockerCmd(c, "run", "--net=none", WindowsBaseImage, "ping", "-n", "1", "127.0.0.1") - } else { - dockerCmd(c, "run", "--net=none", "busybox", "ping", "-c", "1", "127.0.0.1") - } -} - -func (s *DockerSuite) TestRunModeNetContainerHostname(c *check.C) { - // Windows does not support --net=container - testRequires(c, DaemonIsLinux, ExecSupport) - - dockerCmd(c, "run", "-i", "-d", "--name", "parent", "busybox", "top") - out, _ := dockerCmd(c, "exec", "parent", "cat", "/etc/hostname") - out1, _ := dockerCmd(c, "run", "--net=container:parent", "busybox", "cat", "/etc/hostname") - - if out1 != out { - c.Fatal("containers with shared net namespace should have same hostname") - } -} - -func (s *DockerSuite) TestRunNetworkNotInitializedNoneMode(c *check.C) { - // TODO Windows: Network settings are not currently propagated. This may - // be resolved in the future with the move to libnetwork and CNM. - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "--net=none", "busybox", "top") - id := strings.TrimSpace(out) - res := inspectField(c, id, "NetworkSettings.Networks.none.IPAddress") - if res != "" { - c.Fatalf("For 'none' mode network must not be initialized, but container got IP: %s", res) - } -} - -func (s *DockerSuite) TestTwoContainersInNetHost(c *check.C) { - // Not applicable as Windows does not support --net=host - testRequires(c, DaemonIsLinux, NotUserNamespace, NotUserNamespace) - dockerCmd(c, "run", "-d", "--net=host", "--name=first", "busybox", "top") - dockerCmd(c, "run", "-d", "--net=host", "--name=second", "busybox", "top") - dockerCmd(c, "stop", "first") - dockerCmd(c, "stop", "second") -} - -func (s *DockerSuite) TestContainersInUserDefinedNetwork(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork") - dockerCmd(c, "run", "-d", "--net=testnetwork", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-t", "--net=testnetwork", "--name=second", "busybox", "ping", "-c", "1", "first") -} - -func (s *DockerSuite) TestContainersInMultipleNetworks(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - // Create 2 networks using bridge driver - dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork1") - dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork2") - // Run and connect containers to testnetwork1 - dockerCmd(c, "run", "-d", "--net=testnetwork1", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--net=testnetwork1", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - // Check connectivity between containers in testnetwork2 - dockerCmd(c, "exec", "first", "ping", "-c", "1", "second.testnetwork1") - // Connect containers to testnetwork2 - dockerCmd(c, "network", "connect", "testnetwork2", "first") - dockerCmd(c, "network", "connect", "testnetwork2", "second") - // Check connectivity between containers - dockerCmd(c, "exec", "second", "ping", "-c", "1", "first.testnetwork2") -} - -func (s *DockerSuite) TestContainersNetworkIsolation(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - // Create 2 networks using bridge driver - dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork1") - dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork2") - // Run 1 container in testnetwork1 and another in testnetwork2 - dockerCmd(c, "run", "-d", "--net=testnetwork1", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--net=testnetwork2", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // Check Isolation between containers : ping must fail - _, _, err := dockerCmdWithError("exec", "first", "ping", "-c", "1", "second") - c.Assert(err, check.NotNil) - // Connect first container to testnetwork2 - dockerCmd(c, "network", "connect", "testnetwork2", "first") - // ping must succeed now - _, _, err = dockerCmdWithError("exec", "first", "ping", "-c", "1", "second") - c.Assert(err, check.IsNil) - - // Disconnect first container from testnetwork2 - dockerCmd(c, "network", "disconnect", "testnetwork2", "first") - // ping must fail again - _, _, err = dockerCmdWithError("exec", "first", "ping", "-c", "1", "second") - c.Assert(err, check.NotNil) -} - -func (s *DockerSuite) TestNetworkRmWithActiveContainers(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - // Create 2 networks using bridge driver - dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork1") - // Run and connect containers to testnetwork1 - dockerCmd(c, "run", "-d", "--net=testnetwork1", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--net=testnetwork1", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - // Network delete with active containers must fail - _, _, err := dockerCmdWithError("network", "rm", "testnetwork1") - c.Assert(err, check.NotNil) - - dockerCmd(c, "stop", "first") - _, _, err = dockerCmdWithError("network", "rm", "testnetwork1") - c.Assert(err, check.NotNil) -} - -func (s *DockerSuite) TestContainerRestartInMultipleNetworks(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - // Create 2 networks using bridge driver - dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork1") - dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork2") - - // Run and connect containers to testnetwork1 - dockerCmd(c, "run", "-d", "--net=testnetwork1", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--net=testnetwork1", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - // Check connectivity between containers in testnetwork2 - dockerCmd(c, "exec", "first", "ping", "-c", "1", "second.testnetwork1") - // Connect containers to testnetwork2 - dockerCmd(c, "network", "connect", "testnetwork2", "first") - dockerCmd(c, "network", "connect", "testnetwork2", "second") - // Check connectivity between containers - dockerCmd(c, "exec", "second", "ping", "-c", "1", "first.testnetwork2") - - // Stop second container and test ping failures on both networks - dockerCmd(c, "stop", "second") - _, _, err := dockerCmdWithError("exec", "first", "ping", "-c", "1", "second.testnetwork1") - c.Assert(err, check.NotNil) - _, _, err = dockerCmdWithError("exec", "first", "ping", "-c", "1", "second.testnetwork2") - c.Assert(err, check.NotNil) - - // Start second container and connectivity must be restored on both networks - dockerCmd(c, "start", "second") - dockerCmd(c, "exec", "first", "ping", "-c", "1", "second.testnetwork1") - dockerCmd(c, "exec", "second", "ping", "-c", "1", "first.testnetwork2") -} - -func (s *DockerSuite) TestContainerWithConflictingHostNetworks(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - // Run a container with --net=host - dockerCmd(c, "run", "-d", "--net=host", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - - // Create a network using bridge driver - dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork1") - - // Connecting to the user defined network must fail - _, _, err := dockerCmdWithError("network", "connect", "testnetwork1", "first") - c.Assert(err, check.NotNil) -} - -func (s *DockerSuite) TestContainerWithConflictingSharedNetwork(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - // Run second container in first container's network namespace - dockerCmd(c, "run", "-d", "--net=container:first", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // Create a network using bridge driver - dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork1") - - // Connecting to the user defined network must fail - out, _, err := dockerCmdWithError("network", "connect", "testnetwork1", "second") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, runconfig.ErrConflictSharedNetwork.Error()) -} - -func (s *DockerSuite) TestContainerWithConflictingNoneNetwork(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "-d", "--net=none", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - - // Create a network using bridge driver - dockerCmd(c, "network", "create", "-d", "bridge", "testnetwork1") - - // Connecting to the user defined network must fail - out, _, err := dockerCmdWithError("network", "connect", "testnetwork1", "first") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, runconfig.ErrConflictNoNetwork.Error()) - - // create a container connected to testnetwork1 - dockerCmd(c, "run", "-d", "--net=testnetwork1", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // Connect second container to none network. it must fail as well - _, _, err = dockerCmdWithError("network", "connect", "none", "second") - c.Assert(err, check.NotNil) -} - -// #11957 - stdin with no tty does not exit if stdin is not closed even though container exited -func (s *DockerSuite) TestRunStdinBlockedAfterContainerExit(c *check.C) { - cmd := exec.Command(dockerBinary, "run", "-i", "--name=test", "busybox", "true") - in, err := cmd.StdinPipe() - c.Assert(err, check.IsNil) - defer in.Close() - stdout := bytes.NewBuffer(nil) - cmd.Stdout = stdout - cmd.Stderr = stdout - c.Assert(cmd.Start(), check.IsNil) - - waitChan := make(chan error) - go func() { - waitChan <- cmd.Wait() - }() - - select { - case err := <-waitChan: - c.Assert(err, check.IsNil, check.Commentf(stdout.String())) - case <-time.After(30 * time.Second): - c.Fatal("timeout waiting for command to exit") - } -} - -func (s *DockerSuite) TestRunWrongCpusetCpusFlagValue(c *check.C) { - // TODO Windows: This needs validation (error out) in the daemon. - testRequires(c, DaemonIsLinux) - out, exitCode, err := dockerCmdWithError("run", "--cpuset-cpus", "1-10,11--", "busybox", "true") - c.Assert(err, check.NotNil) - expected := "Error response from daemon: Invalid value 1-10,11-- for cpuset cpus.\n" - if !(strings.Contains(out, expected) || exitCode == 125) { - c.Fatalf("Expected output to contain %q with exitCode 125, got out: %q exitCode: %v", expected, out, exitCode) - } -} - -func (s *DockerSuite) TestRunWrongCpusetMemsFlagValue(c *check.C) { - // TODO Windows: This needs validation (error out) in the daemon. - testRequires(c, DaemonIsLinux) - out, exitCode, err := dockerCmdWithError("run", "--cpuset-mems", "1-42--", "busybox", "true") - c.Assert(err, check.NotNil) - expected := "Error response from daemon: Invalid value 1-42-- for cpuset mems.\n" - if !(strings.Contains(out, expected) || exitCode == 125) { - c.Fatalf("Expected output to contain %q with exitCode 125, got out: %q exitCode: %v", expected, out, exitCode) - } -} - -// TestRunNonExecutableCmd checks that 'docker run busybox foo' exits with error code 127' -func (s *DockerSuite) TestRunNonExecutableCmd(c *check.C) { - name := "testNonExecutableCmd" - runCmd := exec.Command(dockerBinary, "run", "--name", name, "busybox", "foo") - _, exit, _ := runCommandWithOutput(runCmd) - stateExitCode := findContainerExitCode(c, name) - if !(exit == 127 && strings.Contains(stateExitCode, "127")) { - c.Fatalf("Run non-executable command should have errored with exit code 127, but we got exit: %d, State.ExitCode: %s", exit, stateExitCode) - } -} - -// TestRunNonExistingCmd checks that 'docker run busybox /bin/foo' exits with code 127. -func (s *DockerSuite) TestRunNonExistingCmd(c *check.C) { - name := "testNonExistingCmd" - runCmd := exec.Command(dockerBinary, "run", "--name", name, "busybox", "/bin/foo") - _, exit, _ := runCommandWithOutput(runCmd) - stateExitCode := findContainerExitCode(c, name) - if !(exit == 127 && strings.Contains(stateExitCode, "127")) { - c.Fatalf("Run non-existing command should have errored with exit code 127, but we got exit: %d, State.ExitCode: %s", exit, stateExitCode) - } -} - -// TestCmdCannotBeInvoked checks that 'docker run busybox /etc' exits with 126, or -// 127 on Windows. The difference is that in Windows, the container must be started -// as that's when the check is made (and yes, by its design...) -func (s *DockerSuite) TestCmdCannotBeInvoked(c *check.C) { - expected := 126 - if daemonPlatform == "windows" { - expected = 127 - } - name := "testCmdCannotBeInvoked" - runCmd := exec.Command(dockerBinary, "run", "--name", name, "busybox", "/etc") - _, exit, _ := runCommandWithOutput(runCmd) - stateExitCode := findContainerExitCode(c, name) - if !(exit == expected && strings.Contains(stateExitCode, strconv.Itoa(expected))) { - c.Fatalf("Run cmd that cannot be invoked should have errored with code %d, but we got exit: %d, State.ExitCode: %s", expected, exit, stateExitCode) - } -} - -// TestRunNonExistingImage checks that 'docker run foo' exits with error msg 125 and contains 'Unable to find image' -func (s *DockerSuite) TestRunNonExistingImage(c *check.C) { - runCmd := exec.Command(dockerBinary, "run", "foo") - out, exit, err := runCommandWithOutput(runCmd) - if !(err != nil && exit == 125 && strings.Contains(out, "Unable to find image")) { - c.Fatalf("Run non-existing image should have errored with 'Unable to find image' code 125, but we got out: %s, exit: %d, err: %s", out, exit, err) - } -} - -// TestDockerFails checks that 'docker run -foo busybox' exits with 125 to signal docker run failed -func (s *DockerSuite) TestDockerFails(c *check.C) { - runCmd := exec.Command(dockerBinary, "run", "-foo", "busybox") - out, exit, err := runCommandWithOutput(runCmd) - if !(err != nil && exit == 125) { - c.Fatalf("Docker run with flag not defined should exit with 125, but we got out: %s, exit: %d, err: %s", out, exit, err) - } -} - -// TestRunInvalidReference invokes docker run with a bad reference. -func (s *DockerSuite) TestRunInvalidReference(c *check.C) { - out, exit, _ := dockerCmdWithError("run", "busybox@foo") - if exit == 0 { - c.Fatalf("expected non-zero exist code; received %d", exit) - } - - if !strings.Contains(out, "Error parsing reference") { - c.Fatalf(`Expected "Error parsing reference" in output; got: %s`, out) - } -} - -// Test fix for issue #17854 -func (s *DockerSuite) TestRunInitLayerPathOwnership(c *check.C) { - // Not applicable on Windows as it does not support Linux uid/gid ownership - testRequires(c, DaemonIsLinux) - name := "testetcfileownership" - _, err := buildImage(name, - `FROM busybox - RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd - RUN echo 'dockerio:x:1001:' >> /etc/group - RUN chown dockerio:dockerio /etc`, - true) - if err != nil { - c.Fatal(err) - } - - // Test that dockerio ownership of /etc is retained at runtime - out, _ := dockerCmd(c, "run", "--rm", name, "stat", "-c", "%U:%G", "/etc") - out = strings.TrimSpace(out) - if out != "dockerio:dockerio" { - c.Fatalf("Wrong /etc ownership: expected dockerio:dockerio, got %q", out) - } -} - -func (s *DockerSuite) TestRunWithOomScoreAdj(c *check.C) { - testRequires(c, DaemonIsLinux) - - expected := "642" - out, _ := dockerCmd(c, "run", "--oom-score-adj", expected, "busybox", "cat", "/proc/self/oom_score_adj") - oomScoreAdj := strings.TrimSpace(out) - if oomScoreAdj != "642" { - c.Fatalf("Expected oom_score_adj set to %q, got %q instead", expected, oomScoreAdj) - } -} - -func (s *DockerSuite) TestRunWithOomScoreAdjInvalidRange(c *check.C) { - testRequires(c, DaemonIsLinux) - - out, _, err := dockerCmdWithError("run", "--oom-score-adj", "1001", "busybox", "true") - c.Assert(err, check.NotNil) - expected := "Invalid value 1001, range for oom score adj is [-1000, 1000]." - if !strings.Contains(out, expected) { - c.Fatalf("Expected output to contain %q, got %q instead", expected, out) - } - out, _, err = dockerCmdWithError("run", "--oom-score-adj", "-1001", "busybox", "true") - c.Assert(err, check.NotNil) - expected = "Invalid value -1001, range for oom score adj is [-1000, 1000]." - if !strings.Contains(out, expected) { - c.Fatalf("Expected output to contain %q, got %q instead", expected, out) - } -} - -func (s *DockerSuite) TestRunVolumesMountedAsShared(c *check.C) { - // Volume propagation is linux only. Also it creates directories for - // bind mounting, so needs to be same host. - testRequires(c, DaemonIsLinux, SameHostDaemon, NotUserNamespace) - - // Prepare a source directory to bind mount - tmpDir, err := ioutil.TempDir("", "volume-source") - if err != nil { - c.Fatal(err) - } - defer os.RemoveAll(tmpDir) - - if err := os.Mkdir(path.Join(tmpDir, "mnt1"), 0755); err != nil { - c.Fatal(err) - } - - // Convert this directory into a shared mount point so that we do - // not rely on propagation properties of parent mount. - cmd := exec.Command("mount", "--bind", tmpDir, tmpDir) - if _, err = runCommand(cmd); err != nil { - c.Fatal(err) - } - - cmd = exec.Command("mount", "--make-private", "--make-shared", tmpDir) - if _, err = runCommand(cmd); err != nil { - c.Fatal(err) - } - - dockerCmd(c, "run", "--privileged", "-v", fmt.Sprintf("%s:/volume-dest:shared", tmpDir), "busybox", "mount", "--bind", "/volume-dest/mnt1", "/volume-dest/mnt1") - - // Make sure a bind mount under a shared volume propagated to host. - if mounted, _ := mount.Mounted(path.Join(tmpDir, "mnt1")); !mounted { - c.Fatalf("Bind mount under shared volume did not propagate to host") - } - - mount.Unmount(path.Join(tmpDir, "mnt1")) -} - -func (s *DockerSuite) TestRunVolumesMountedAsSlave(c *check.C) { - // Volume propagation is linux only. Also it creates directories for - // bind mounting, so needs to be same host. - testRequires(c, DaemonIsLinux, SameHostDaemon, NotUserNamespace) - - // Prepare a source directory to bind mount - tmpDir, err := ioutil.TempDir("", "volume-source") - if err != nil { - c.Fatal(err) - } - defer os.RemoveAll(tmpDir) - - if err := os.Mkdir(path.Join(tmpDir, "mnt1"), 0755); err != nil { - c.Fatal(err) - } - - // Prepare a source directory with file in it. We will bind mount this - // directory and see if file shows up. - tmpDir2, err := ioutil.TempDir("", "volume-source2") - if err != nil { - c.Fatal(err) - } - defer os.RemoveAll(tmpDir2) - - if err := ioutil.WriteFile(path.Join(tmpDir2, "slave-testfile"), []byte("Test"), 0644); err != nil { - c.Fatal(err) - } - - // Convert this directory into a shared mount point so that we do - // not rely on propagation properties of parent mount. - cmd := exec.Command("mount", "--bind", tmpDir, tmpDir) - if _, err = runCommand(cmd); err != nil { - c.Fatal(err) - } - - cmd = exec.Command("mount", "--make-private", "--make-shared", tmpDir) - if _, err = runCommand(cmd); err != nil { - c.Fatal(err) - } - - dockerCmd(c, "run", "-i", "-d", "--name", "parent", "-v", fmt.Sprintf("%s:/volume-dest:slave", tmpDir), "busybox", "top") - - // Bind mount tmpDir2/ onto tmpDir/mnt1. If mount propagates inside - // container then contents of tmpDir2/slave-testfile should become - // visible at "/volume-dest/mnt1/slave-testfile" - cmd = exec.Command("mount", "--bind", tmpDir2, path.Join(tmpDir, "mnt1")) - if _, err = runCommand(cmd); err != nil { - c.Fatal(err) - } - - out, _ := dockerCmd(c, "exec", "parent", "cat", "/volume-dest/mnt1/slave-testfile") - - mount.Unmount(path.Join(tmpDir, "mnt1")) - - if out != "Test" { - c.Fatalf("Bind mount under slave volume did not propagate to container") - } -} - -func (s *DockerSuite) TestRunNamedVolumesMountedAsShared(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, exitCode, _ := dockerCmdWithError("run", "-v", "foo:/test:shared", "busybox", "touch", "/test/somefile") - c.Assert(exitCode, checker.Not(checker.Equals), 0) - c.Assert(out, checker.Contains, "invalid mount config") -} - -func (s *DockerSuite) TestRunNamedVolumeCopyImageData(c *check.C) { - testRequires(c, DaemonIsLinux) - - testImg := "testvolumecopy" - _, err := buildImage(testImg, ` - FROM busybox - RUN mkdir -p /foo && echo hello > /foo/hello - `, true) - c.Assert(err, check.IsNil) - - dockerCmd(c, "run", "-v", "foo:/foo", testImg) - out, _ := dockerCmd(c, "run", "-v", "foo:/foo", "busybox", "cat", "/foo/hello") - c.Assert(strings.TrimSpace(out), check.Equals, "hello") -} - -func (s *DockerSuite) TestRunNamedVolumeNotRemoved(c *check.C) { - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - - dockerCmd(c, "volume", "create", "test") - - dockerCmd(c, "run", "--rm", "-v", "test:"+prefix+"/foo", "-v", prefix+"/bar", "busybox", "true") - dockerCmd(c, "volume", "inspect", "test") - out, _ := dockerCmd(c, "volume", "ls", "-q") - c.Assert(strings.TrimSpace(out), checker.Equals, "test") - - dockerCmd(c, "run", "--name=test", "-v", "test:"+prefix+"/foo", "-v", prefix+"/bar", "busybox", "true") - dockerCmd(c, "rm", "-fv", "test") - dockerCmd(c, "volume", "inspect", "test") - out, _ = dockerCmd(c, "volume", "ls", "-q") - c.Assert(strings.TrimSpace(out), checker.Equals, "test") -} - -func (s *DockerSuite) TestRunNamedVolumesFromNotRemoved(c *check.C) { - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - - dockerCmd(c, "volume", "create", "test") - dockerCmd(c, "run", "--name=parent", "-v", "test:"+prefix+"/foo", "-v", prefix+"/bar", "busybox", "true") - dockerCmd(c, "run", "--name=child", "--volumes-from=parent", "busybox", "true") - - // Remove the parent so there are not other references to the volumes - dockerCmd(c, "rm", "-f", "parent") - // now remove the child and ensure the named volume (and only the named volume) still exists - dockerCmd(c, "rm", "-fv", "child") - dockerCmd(c, "volume", "inspect", "test") - out, _ := dockerCmd(c, "volume", "ls", "-q") - c.Assert(strings.TrimSpace(out), checker.Equals, "test") -} - -func (s *DockerSuite) TestRunAttachFailedNoLeak(c *check.C) { - nroutines, err := getGoroutineNumber() - c.Assert(err, checker.IsNil) - - runSleepingContainer(c, "--name=test", "-p", "8000:8000") - - // Wait until container is fully up and running - c.Assert(waitRun("test"), check.IsNil) - - out, _, err := dockerCmdWithError("run", "--name=fail", "-p", "8000:8000", "busybox", "true") - // We will need the following `inspect` to diagnose the issue if test fails (#21247) - out1, err1 := dockerCmd(c, "inspect", "--format", "{{json .State}}", "test") - out2, err2 := dockerCmd(c, "inspect", "--format", "{{json .State}}", "fail") - c.Assert(err, checker.NotNil, check.Commentf("Command should have failed but succeeded with: %s\nContainer 'test' [%+v]: %s\nContainer 'fail' [%+v]: %s", out, err1, out1, err2, out2)) - // check for windows error as well - // TODO Windows Post TP5. Fix the error message string - c.Assert(strings.Contains(string(out), "port is already allocated") || - strings.Contains(string(out), "were not connected because a duplicate name exists") || - strings.Contains(string(out), "HNS failed with error : Failed to create endpoint") || - strings.Contains(string(out), "HNS failed with error : The object already exists"), checker.Equals, true, check.Commentf("Output: %s", out)) - dockerCmd(c, "rm", "-f", "test") - - // NGoroutines is not updated right away, so we need to wait before failing - c.Assert(waitForGoroutines(nroutines), checker.IsNil) -} - -// Test for one character directory name case (#20122) -func (s *DockerSuite) TestRunVolumeWithOneCharacter(c *check.C) { - testRequires(c, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-v", "/tmp/q:/foo", "busybox", "sh", "-c", "find /foo") - c.Assert(strings.TrimSpace(out), checker.Equals, "/foo") -} - -func (s *DockerSuite) TestRunVolumeCopyFlag(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support copying data from image to the volume - _, err := buildImage("volumecopy", - `FROM busybox - RUN mkdir /foo && echo hello > /foo/bar - CMD cat /foo/bar`, - true, - ) - c.Assert(err, checker.IsNil) - - dockerCmd(c, "volume", "create", "test") - - // test with the nocopy flag - out, _, err := dockerCmdWithError("run", "-v", "test:/foo:nocopy", "volumecopy") - c.Assert(err, checker.NotNil, check.Commentf(out)) - // test default behavior which is to copy for non-binds - out, _ = dockerCmd(c, "run", "-v", "test:/foo", "volumecopy") - c.Assert(strings.TrimSpace(out), checker.Equals, "hello") - // error out when the volume is already populated - out, _, err = dockerCmdWithError("run", "-v", "test:/foo:copy", "volumecopy") - c.Assert(err, checker.NotNil, check.Commentf(out)) - // do not error out when copy isn't explicitly set even though it's already populated - out, _ = dockerCmd(c, "run", "-v", "test:/foo", "volumecopy") - c.Assert(strings.TrimSpace(out), checker.Equals, "hello") - - // do not allow copy modes on volumes-from - dockerCmd(c, "run", "--name=test", "-v", "/foo", "busybox", "true") - out, _, err = dockerCmdWithError("run", "--volumes-from=test:copy", "busybox", "true") - c.Assert(err, checker.NotNil, check.Commentf(out)) - out, _, err = dockerCmdWithError("run", "--volumes-from=test:nocopy", "busybox", "true") - c.Assert(err, checker.NotNil, check.Commentf(out)) - - // do not allow copy modes on binds - out, _, err = dockerCmdWithError("run", "-v", "/foo:/bar:copy", "busybox", "true") - c.Assert(err, checker.NotNil, check.Commentf(out)) - out, _, err = dockerCmdWithError("run", "-v", "/foo:/bar:nocopy", "busybox", "true") - c.Assert(err, checker.NotNil, check.Commentf(out)) -} - -// Test case for #21976 -func (s *DockerSuite) TestRunDNSInHostMode(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - - expectedOutput := "nameserver 127.0.0.1" - expectedWarning := "Localhost DNS setting" - out, stderr, _ := dockerCmdWithStdoutStderr(c, "run", "--dns=127.0.0.1", "--net=host", "busybox", "cat", "/etc/resolv.conf") - c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out)) - c.Assert(stderr, checker.Contains, expectedWarning, check.Commentf("Expected warning on stderr about localhost resolver, but got %q", stderr)) - - expectedOutput = "nameserver 1.2.3.4" - out, _ = dockerCmd(c, "run", "--dns=1.2.3.4", "--net=host", "busybox", "cat", "/etc/resolv.conf") - c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out)) - - expectedOutput = "search example.com" - out, _ = dockerCmd(c, "run", "--dns-search=example.com", "--net=host", "busybox", "cat", "/etc/resolv.conf") - c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out)) - - expectedOutput = "options timeout:3" - out, _ = dockerCmd(c, "run", "--dns-opt=timeout:3", "--net=host", "busybox", "cat", "/etc/resolv.conf") - c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out)) - - expectedOutput1 := "nameserver 1.2.3.4" - expectedOutput2 := "search example.com" - expectedOutput3 := "options timeout:3" - out, _ = dockerCmd(c, "run", "--dns=1.2.3.4", "--dns-search=example.com", "--dns-opt=timeout:3", "--net=host", "busybox", "cat", "/etc/resolv.conf") - c.Assert(out, checker.Contains, expectedOutput1, check.Commentf("Expected '%s', but got %q", expectedOutput1, out)) - c.Assert(out, checker.Contains, expectedOutput2, check.Commentf("Expected '%s', but got %q", expectedOutput2, out)) - c.Assert(out, checker.Contains, expectedOutput3, check.Commentf("Expected '%s', but got %q", expectedOutput3, out)) -} - -// Test case for #21976 -func (s *DockerSuite) TestRunAddHostInHostMode(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - - expectedOutput := "1.2.3.4\textra" - out, _ := dockerCmd(c, "run", "--add-host=extra:1.2.3.4", "--net=host", "busybox", "cat", "/etc/hosts") - c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out)) -} - -func (s *DockerSuite) TestRunRmAndWait(c *check.C) { - dockerCmd(c, "run", "--name=test", "--rm", "-d", "busybox", "sh", "-c", "sleep 3;exit 2") - - out, code, err := dockerCmdWithError("wait", "test") - c.Assert(err, checker.IsNil, check.Commentf("out: %s; exit code: %d", out, code)) - c.Assert(out, checker.Equals, "2\n", check.Commentf("exit code: %d", code)) - c.Assert(code, checker.Equals, 0) -} - -// Test case for #23498 -func (s *DockerSuite) TestRunUnsetEntrypoint(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "test-entrypoint" - dockerfile := `FROM busybox -ADD entrypoint.sh /entrypoint.sh -RUN chmod 755 /entrypoint.sh -ENTRYPOINT ["/entrypoint.sh"] -CMD echo foobar` - - ctx, err := fakeContext(dockerfile, map[string]string{ - "entrypoint.sh": `#!/bin/sh -echo "I am an entrypoint" -exec "$@"`, - }) - c.Assert(err, check.IsNil) - defer ctx.Close() - - _, err = buildImageFromContext(name, ctx, true) - c.Assert(err, check.IsNil) - - out, _ := dockerCmd(c, "run", "--entrypoint=", "-t", name, "echo", "foo") - c.Assert(strings.TrimSpace(out), check.Equals, "foo") - - // CMD will be reset as well (the same as setting a custom entrypoint) - _, _, err = dockerCmdWithError("run", "--entrypoint=", "-t", name) - c.Assert(err, check.NotNil) - c.Assert(err.Error(), checker.Contains, "No command specified") -} - -func (s *DockerDaemonSuite) TestRunWithUlimitAndDaemonDefault(c *check.C) { - c.Assert(s.d.StartWithBusybox("--debug", "--default-ulimit=nofile=65535"), checker.IsNil) - - name := "test-A" - _, err := s.d.Cmd("run", "--name", name, "-d", "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(s.d.waitRun(name), check.IsNil) - - out, err := s.d.Cmd("inspect", "--format", "{{.HostConfig.Ulimits}}", name) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "[nofile=65535:65535]") - - name = "test-B" - _, err = s.d.Cmd("run", "--name", name, "--ulimit=nofile=42", "-d", "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(s.d.waitRun(name), check.IsNil) - - out, err = s.d.Cmd("inspect", "--format", "{{.HostConfig.Ulimits}}", name) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "[nofile=42:42]") -} - -func (s *DockerSuite) TestRunStoppedLoggingDriverNoLeak(c *check.C) { - nroutines, err := getGoroutineNumber() - c.Assert(err, checker.IsNil) - - out, _, err := dockerCmdWithError("run", "--name=fail", "--log-driver=splunk", "busybox", "true") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "Failed to initialize logging driver", check.Commentf("error should be about logging driver, got output %s", out)) - - // NGoroutines is not updated right away, so we need to wait before failing - c.Assert(waitForGoroutines(nroutines), checker.IsNil) -} - -// Handles error conditions for --credentialspec. Validating E2E success cases -// requires additional infrastructure (AD for example) on CI servers. -func (s *DockerSuite) TestRunCredentialSpecFailures(c *check.C) { - testRequires(c, DaemonIsWindows) - attempts := []struct{ value, expectedError string }{ - {"rubbish", "invalid credential spec security option - value must be prefixed file:// or registry://"}, - {"rubbish://", "invalid credential spec security option - value must be prefixed file:// or registry://"}, - {"file://", "no value supplied for file:// credential spec security option"}, - {"registry://", "no value supplied for registry:// credential spec security option"}, - {`file://c:\blah.txt`, "path cannot be absolute"}, - {`file://doesnotexist.txt`, "The system cannot find the file specified"}, - } - for _, attempt := range attempts { - _, _, err := dockerCmdWithError("run", "--security-opt=credentialspec="+attempt.value, "busybox", "true") - c.Assert(err, checker.NotNil, check.Commentf("%s expected non-nil err", attempt.value)) - c.Assert(err.Error(), checker.Contains, attempt.expectedError, check.Commentf("%s expected %s got %s", attempt.value, attempt.expectedError, err)) - } -} - -// Windows specific test to validate credential specs with a well-formed spec. -// Note it won't actually do anything in CI configuration with the spec, but -// it should not fail to run a container. -func (s *DockerSuite) TestRunCredentialSpecWellFormed(c *check.C) { - testRequires(c, DaemonIsWindows, SameHostDaemon) - validCS := readFile(`fixtures\credentialspecs\valid.json`, c) - writeFile(filepath.Join(dockerBasePath, `credentialspecs\valid.json`), validCS, c) - dockerCmd(c, "run", `--security-opt=credentialspec=file://valid.json`, "busybox", "true") -} - -// Windows specific test to ensure that a servicing app container is started -// if necessary once a container exits. It does this by forcing a no-op -// servicing event and verifying the event from Hyper-V-Compute -func (s *DockerSuite) TestRunServicingContainer(c *check.C) { - testRequires(c, DaemonIsWindows, SameHostDaemon) - - out, _ := dockerCmd(c, "run", "-d", WindowsBaseImage, "cmd", "/c", "mkdir c:\\programdata\\Microsoft\\Windows\\ContainerUpdates\\000_000_d99f45d0-ffc8-4af7-bd9c-ea6a62e035c9_200 && sc control cexecsvc 255") - containerID := strings.TrimSpace(out) - err := waitExited(containerID, 60*time.Second) - c.Assert(err, checker.IsNil) - - cmd := exec.Command("powershell", "echo", `(Get-WinEvent -ProviderName "Microsoft-Windows-Hyper-V-Compute" -FilterXPath 'Event[System[EventID=2010]]' -MaxEvents 1).Message`) - out2, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil) - c.Assert(out2, checker.Contains, `"Servicing":true`, check.Commentf("Servicing container does not appear to have been started: %s", out2)) - c.Assert(out2, checker.Contains, `Windows Container (Servicing)`, check.Commentf("Didn't find 'Windows Container (Servicing): %s", out2)) - c.Assert(out2, checker.Contains, containerID+"_servicing", check.Commentf("Didn't find '%s_servicing': %s", containerID+"_servicing", out2)) -} - -func (s *DockerSuite) TestRunDuplicateMount(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace) - - tmpFile, err := ioutil.TempFile("", "touch-me") - c.Assert(err, checker.IsNil) - defer tmpFile.Close() - - data := "touch-me-foo-bar\n" - if _, err := tmpFile.Write([]byte(data)); err != nil { - c.Fatal(err) - } - - name := "test" - out, _ := dockerCmd(c, "run", "--name", name, "-v", "/tmp:/tmp", "-v", "/tmp:/tmp", "busybox", "sh", "-c", "cat "+tmpFile.Name()+" && ls /") - c.Assert(out, checker.Not(checker.Contains), "tmp:") - c.Assert(out, checker.Contains, data) - - out = inspectFieldJSON(c, name, "Config.Volumes") - c.Assert(out, checker.Contains, "null") -} - -func (s *DockerSuite) TestRunWindowsWithCPUCount(c *check.C) { - testRequires(c, DaemonIsWindows) - - out, _ := dockerCmd(c, "run", "--cpu-count=1", "--name", "test", "busybox", "echo", "testing") - c.Assert(strings.TrimSpace(out), checker.Equals, "testing") - - out = inspectField(c, "test", "HostConfig.CPUCount") - c.Assert(out, check.Equals, "1") -} - -func (s *DockerSuite) TestRunWindowsWithCPUShares(c *check.C) { - testRequires(c, DaemonIsWindows) - - out, _ := dockerCmd(c, "run", "--cpu-shares=1000", "--name", "test", "busybox", "echo", "testing") - c.Assert(strings.TrimSpace(out), checker.Equals, "testing") - - out = inspectField(c, "test", "HostConfig.CPUShares") - c.Assert(out, check.Equals, "1000") -} - -func (s *DockerSuite) TestRunWindowsWithCPUPercent(c *check.C) { - testRequires(c, DaemonIsWindows) - - out, _ := dockerCmd(c, "run", "--cpu-percent=80", "--name", "test", "busybox", "echo", "testing") - c.Assert(strings.TrimSpace(out), checker.Equals, "testing") - - out = inspectField(c, "test", "HostConfig.CPUPercent") - c.Assert(out, check.Equals, "80") -} - -func (s *DockerSuite) TestRunProcessIsolationWithCPUCountCPUSharesAndCPUPercent(c *check.C) { - testRequires(c, DaemonIsWindows, IsolationIsProcess) - - out, _ := dockerCmd(c, "run", "--cpu-count=1", "--cpu-shares=1000", "--cpu-percent=80", "--name", "test", "busybox", "echo", "testing") - c.Assert(strings.TrimSpace(out), checker.Contains, "WARNING: Conflicting options: CPU count takes priority over CPU shares on Windows Server Containers. CPU shares discarded") - c.Assert(strings.TrimSpace(out), checker.Contains, "WARNING: Conflicting options: CPU count takes priority over CPU percent on Windows Server Containers. CPU percent discarded") - c.Assert(strings.TrimSpace(out), checker.Contains, "testing") - - out = inspectField(c, "test", "HostConfig.CPUCount") - c.Assert(out, check.Equals, "1") - - out = inspectField(c, "test", "HostConfig.CPUShares") - c.Assert(out, check.Equals, "0") - - out = inspectField(c, "test", "HostConfig.CPUPercent") - c.Assert(out, check.Equals, "0") -} - -func (s *DockerSuite) TestRunHypervIsolationWithCPUCountCPUSharesAndCPUPercent(c *check.C) { - testRequires(c, DaemonIsWindows, IsolationIsHyperv) - - out, _ := dockerCmd(c, "run", "--cpu-count=1", "--cpu-shares=1000", "--cpu-percent=80", "--name", "test", "busybox", "echo", "testing") - c.Assert(strings.TrimSpace(out), checker.Contains, "testing") - - out = inspectField(c, "test", "HostConfig.CPUCount") - c.Assert(out, check.Equals, "1") - - out = inspectField(c, "test", "HostConfig.CPUShares") - c.Assert(out, check.Equals, "1000") - - out = inspectField(c, "test", "HostConfig.CPUPercent") - c.Assert(out, check.Equals, "80") -} - -// Test for #25099 -func (s *DockerSuite) TestRunEmptyEnv(c *check.C) { - testRequires(c, DaemonIsLinux) - - expectedOutput := "invalid environment variable:" - - out, _, err := dockerCmdWithError("run", "-e", "", "busybox", "true") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, expectedOutput) - - out, _, err = dockerCmdWithError("run", "-e", "=", "busybox", "true") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, expectedOutput) - - out, _, err = dockerCmdWithError("run", "-e", "=foo", "busybox", "true") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, expectedOutput) -} - -// #28658 -func (s *DockerSuite) TestSlowStdinClosing(c *check.C) { - name := "testslowstdinclosing" - repeat := 3 // regression happened 50% of the time - for i := 0; i < repeat; i++ { - cmd := exec.Command(dockerBinary, "run", "--rm", "--name", name, "-i", "busybox", "cat") - cmd.Stdin = &delayedReader{} - done := make(chan error, 1) - go func() { - _, err := runCommand(cmd) - done <- err - }() - - select { - case <-time.After(15 * time.Second): - c.Fatal("running container timed out") // cleanup in teardown - case err := <-done: - c.Assert(err, checker.IsNil) - } - } -} - -type delayedReader struct{} - -func (s *delayedReader) Read([]byte) (int, error) { - time.Sleep(500 * time.Millisecond) - return 0, io.EOF -} - -// #28823 (originally #28639) -func (s *DockerSuite) TestRunMountReadOnlyDevShm(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - emptyDir, err := ioutil.TempDir("", "test-read-only-dev-shm") - c.Assert(err, check.IsNil) - defer os.RemoveAll(emptyDir) - out, _, err := dockerCmdWithError("run", "--rm", "--read-only", - "-v", fmt.Sprintf("%s:/dev/shm:ro", emptyDir), - "busybox", "touch", "/dev/shm/foo") - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Read-only file system") -} - -// Test case for 29129 -func (s *DockerSuite) TestRunHostnameInHostMode(c *check.C) { - testRequires(c, DaemonIsLinux) - - expectedOutput := "foobar\nfoobar" - out, _ := dockerCmd(c, "run", "--net=host", "--hostname=foobar", "busybox", "sh", "-c", `echo $HOSTNAME && hostname`) - c.Assert(strings.TrimSpace(out), checker.Equals, expectedOutput) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_run_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_run_unix_test.go deleted file mode 100644 index e346c19f8..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_run_unix_test.go +++ /dev/null @@ -1,1592 +0,0 @@ -// +build !windows - -package main - -import ( - "bufio" - "encoding/json" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "regexp" - "strconv" - "strings" - "syscall" - "time" - - "github.com/docker/docker/pkg/homedir" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/parsers" - "github.com/docker/docker/pkg/sysinfo" - "github.com/go-check/check" - "github.com/kr/pty" -) - -// #6509 -func (s *DockerSuite) TestRunRedirectStdout(c *check.C) { - checkRedirect := func(command string) { - _, tty, err := pty.Open() - c.Assert(err, checker.IsNil, check.Commentf("Could not open pty")) - cmd := exec.Command("sh", "-c", command) - cmd.Stdin = tty - cmd.Stdout = tty - cmd.Stderr = tty - c.Assert(cmd.Start(), checker.IsNil) - ch := make(chan error) - go func() { - ch <- cmd.Wait() - close(ch) - }() - - select { - case <-time.After(10 * time.Second): - c.Fatal("command timeout") - case err := <-ch: - c.Assert(err, checker.IsNil, check.Commentf("wait err")) - } - } - - checkRedirect(dockerBinary + " run -i busybox cat /etc/passwd | grep -q root") - checkRedirect(dockerBinary + " run busybox cat /etc/passwd | grep -q root") -} - -// Test recursive bind mount works by default -func (s *DockerSuite) TestRunWithVolumesIsRecursive(c *check.C) { - // /tmp gets permission denied - testRequires(c, NotUserNamespace, SameHostDaemon) - tmpDir, err := ioutil.TempDir("", "docker_recursive_mount_test") - c.Assert(err, checker.IsNil) - - defer os.RemoveAll(tmpDir) - - // Create a temporary tmpfs mount. - tmpfsDir := filepath.Join(tmpDir, "tmpfs") - c.Assert(os.MkdirAll(tmpfsDir, 0777), checker.IsNil, check.Commentf("failed to mkdir at %s", tmpfsDir)) - c.Assert(mount.Mount("tmpfs", tmpfsDir, "tmpfs", ""), checker.IsNil, check.Commentf("failed to create a tmpfs mount at %s", tmpfsDir)) - - f, err := ioutil.TempFile(tmpfsDir, "touch-me") - c.Assert(err, checker.IsNil) - defer f.Close() - - runCmd := exec.Command(dockerBinary, "run", "--name", "test-data", "--volume", fmt.Sprintf("%s:/tmp:ro", tmpDir), "busybox:latest", "ls", "/tmp/tmpfs") - out, _, _, err := runCommandWithStdoutStderr(runCmd) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, filepath.Base(f.Name()), check.Commentf("Recursive bind mount test failed. Expected file not found")) -} - -func (s *DockerSuite) TestRunDeviceDirectory(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm) - if _, err := os.Stat("/dev/snd"); err != nil { - c.Skip("Host does not have /dev/snd") - } - - out, _ := dockerCmd(c, "run", "--device", "/dev/snd:/dev/snd", "busybox", "sh", "-c", "ls /dev/snd/") - c.Assert(strings.Trim(out, "\r\n"), checker.Contains, "timer", check.Commentf("expected output /dev/snd/timer")) - - out, _ = dockerCmd(c, "run", "--device", "/dev/snd:/dev/othersnd", "busybox", "sh", "-c", "ls /dev/othersnd/") - c.Assert(strings.Trim(out, "\r\n"), checker.Contains, "seq", check.Commentf("expected output /dev/othersnd/seq")) -} - -// TestRunDetach checks attaching and detaching with the default escape sequence. -func (s *DockerSuite) TestRunAttachDetach(c *check.C) { - name := "attach-detach" - - dockerCmd(c, "run", "--name", name, "-itd", "busybox", "cat") - - cmd := exec.Command(dockerBinary, "attach", name) - stdout, err := cmd.StdoutPipe() - c.Assert(err, checker.IsNil) - cpty, tty, err := pty.Open() - c.Assert(err, checker.IsNil) - defer cpty.Close() - cmd.Stdin = tty - c.Assert(cmd.Start(), checker.IsNil) - c.Assert(waitRun(name), check.IsNil) - - _, err = cpty.Write([]byte("hello\n")) - c.Assert(err, checker.IsNil) - - out, err := bufio.NewReader(stdout).ReadString('\n') - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, "hello") - - // escape sequence - _, err = cpty.Write([]byte{16}) - c.Assert(err, checker.IsNil) - time.Sleep(100 * time.Millisecond) - _, err = cpty.Write([]byte{17}) - c.Assert(err, checker.IsNil) - - ch := make(chan struct{}) - go func() { - cmd.Wait() - ch <- struct{}{} - }() - - select { - case <-ch: - case <-time.After(10 * time.Second): - c.Fatal("timed out waiting for container to exit") - } - - running := inspectField(c, name, "State.Running") - c.Assert(running, checker.Equals, "true", check.Commentf("expected container to still be running")) - - out, _ = dockerCmd(c, "events", "--since=0", "--until", daemonUnixTime(c), "-f", "container="+name) - // attach and detach event should be monitored - c.Assert(out, checker.Contains, "attach") - c.Assert(out, checker.Contains, "detach") -} - -// TestRunDetach checks attaching and detaching with the escape sequence specified via flags. -func (s *DockerSuite) TestRunAttachDetachFromFlag(c *check.C) { - name := "attach-detach" - keyCtrlA := []byte{1} - keyA := []byte{97} - - dockerCmd(c, "run", "--name", name, "-itd", "busybox", "cat") - - cmd := exec.Command(dockerBinary, "attach", "--detach-keys=ctrl-a,a", name) - stdout, err := cmd.StdoutPipe() - if err != nil { - c.Fatal(err) - } - cpty, tty, err := pty.Open() - if err != nil { - c.Fatal(err) - } - defer cpty.Close() - cmd.Stdin = tty - if err := cmd.Start(); err != nil { - c.Fatal(err) - } - c.Assert(waitRun(name), check.IsNil) - - if _, err := cpty.Write([]byte("hello\n")); err != nil { - c.Fatal(err) - } - - out, err := bufio.NewReader(stdout).ReadString('\n') - if err != nil { - c.Fatal(err) - } - if strings.TrimSpace(out) != "hello" { - c.Fatalf("expected 'hello', got %q", out) - } - - // escape sequence - if _, err := cpty.Write(keyCtrlA); err != nil { - c.Fatal(err) - } - time.Sleep(100 * time.Millisecond) - if _, err := cpty.Write(keyA); err != nil { - c.Fatal(err) - } - - ch := make(chan struct{}) - go func() { - cmd.Wait() - ch <- struct{}{} - }() - - select { - case <-ch: - case <-time.After(10 * time.Second): - c.Fatal("timed out waiting for container to exit") - } - - running := inspectField(c, name, "State.Running") - c.Assert(running, checker.Equals, "true", check.Commentf("expected container to still be running")) -} - -// TestRunDetach checks attaching and detaching with the escape sequence specified via flags. -func (s *DockerSuite) TestRunAttachDetachFromInvalidFlag(c *check.C) { - name := "attach-detach" - dockerCmd(c, "run", "--name", name, "-itd", "busybox", "top") - c.Assert(waitRun(name), check.IsNil) - - // specify an invalid detach key, container will ignore it and use default - cmd := exec.Command(dockerBinary, "attach", "--detach-keys=ctrl-A,a", name) - stdout, err := cmd.StdoutPipe() - if err != nil { - c.Fatal(err) - } - cpty, tty, err := pty.Open() - if err != nil { - c.Fatal(err) - } - defer cpty.Close() - cmd.Stdin = tty - if err := cmd.Start(); err != nil { - c.Fatal(err) - } - - bufReader := bufio.NewReader(stdout) - out, err := bufReader.ReadString('\n') - if err != nil { - c.Fatal(err) - } - // it should print a warning to indicate the detach key flag is invalid - errStr := "Invalid escape keys (ctrl-A,a) provided" - c.Assert(strings.TrimSpace(out), checker.Equals, errStr) -} - -// TestRunDetach checks attaching and detaching with the escape sequence specified via config file. -func (s *DockerSuite) TestRunAttachDetachFromConfig(c *check.C) { - keyCtrlA := []byte{1} - keyA := []byte{97} - - // Setup config - homeKey := homedir.Key() - homeVal := homedir.Get() - tmpDir, err := ioutil.TempDir("", "fake-home") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpDir) - - dotDocker := filepath.Join(tmpDir, ".docker") - os.Mkdir(dotDocker, 0600) - tmpCfg := filepath.Join(dotDocker, "config.json") - - defer func() { os.Setenv(homeKey, homeVal) }() - os.Setenv(homeKey, tmpDir) - - data := `{ - "detachKeys": "ctrl-a,a" - }` - - err = ioutil.WriteFile(tmpCfg, []byte(data), 0600) - c.Assert(err, checker.IsNil) - - // Then do the work - name := "attach-detach" - dockerCmd(c, "run", "--name", name, "-itd", "busybox", "cat") - - cmd := exec.Command(dockerBinary, "attach", name) - stdout, err := cmd.StdoutPipe() - if err != nil { - c.Fatal(err) - } - cpty, tty, err := pty.Open() - if err != nil { - c.Fatal(err) - } - defer cpty.Close() - cmd.Stdin = tty - if err := cmd.Start(); err != nil { - c.Fatal(err) - } - c.Assert(waitRun(name), check.IsNil) - - if _, err := cpty.Write([]byte("hello\n")); err != nil { - c.Fatal(err) - } - - out, err := bufio.NewReader(stdout).ReadString('\n') - if err != nil { - c.Fatal(err) - } - if strings.TrimSpace(out) != "hello" { - c.Fatalf("expected 'hello', got %q", out) - } - - // escape sequence - if _, err := cpty.Write(keyCtrlA); err != nil { - c.Fatal(err) - } - time.Sleep(100 * time.Millisecond) - if _, err := cpty.Write(keyA); err != nil { - c.Fatal(err) - } - - ch := make(chan struct{}) - go func() { - cmd.Wait() - ch <- struct{}{} - }() - - select { - case <-ch: - case <-time.After(10 * time.Second): - c.Fatal("timed out waiting for container to exit") - } - - running := inspectField(c, name, "State.Running") - c.Assert(running, checker.Equals, "true", check.Commentf("expected container to still be running")) -} - -// TestRunDetach checks attaching and detaching with the detach flags, making sure it overrides config file -func (s *DockerSuite) TestRunAttachDetachKeysOverrideConfig(c *check.C) { - keyCtrlA := []byte{1} - keyA := []byte{97} - - // Setup config - homeKey := homedir.Key() - homeVal := homedir.Get() - tmpDir, err := ioutil.TempDir("", "fake-home") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpDir) - - dotDocker := filepath.Join(tmpDir, ".docker") - os.Mkdir(dotDocker, 0600) - tmpCfg := filepath.Join(dotDocker, "config.json") - - defer func() { os.Setenv(homeKey, homeVal) }() - os.Setenv(homeKey, tmpDir) - - data := `{ - "detachKeys": "ctrl-e,e" - }` - - err = ioutil.WriteFile(tmpCfg, []byte(data), 0600) - c.Assert(err, checker.IsNil) - - // Then do the work - name := "attach-detach" - dockerCmd(c, "run", "--name", name, "-itd", "busybox", "cat") - - cmd := exec.Command(dockerBinary, "attach", "--detach-keys=ctrl-a,a", name) - stdout, err := cmd.StdoutPipe() - if err != nil { - c.Fatal(err) - } - cpty, tty, err := pty.Open() - if err != nil { - c.Fatal(err) - } - defer cpty.Close() - cmd.Stdin = tty - if err := cmd.Start(); err != nil { - c.Fatal(err) - } - c.Assert(waitRun(name), check.IsNil) - - if _, err := cpty.Write([]byte("hello\n")); err != nil { - c.Fatal(err) - } - - out, err := bufio.NewReader(stdout).ReadString('\n') - if err != nil { - c.Fatal(err) - } - if strings.TrimSpace(out) != "hello" { - c.Fatalf("expected 'hello', got %q", out) - } - - // escape sequence - if _, err := cpty.Write(keyCtrlA); err != nil { - c.Fatal(err) - } - time.Sleep(100 * time.Millisecond) - if _, err := cpty.Write(keyA); err != nil { - c.Fatal(err) - } - - ch := make(chan struct{}) - go func() { - cmd.Wait() - ch <- struct{}{} - }() - - select { - case <-ch: - case <-time.After(10 * time.Second): - c.Fatal("timed out waiting for container to exit") - } - - running := inspectField(c, name, "State.Running") - c.Assert(running, checker.Equals, "true", check.Commentf("expected container to still be running")) -} - -func (s *DockerSuite) TestRunAttachInvalidDetachKeySequencePreserved(c *check.C) { - name := "attach-detach" - keyA := []byte{97} - keyB := []byte{98} - - dockerCmd(c, "run", "--name", name, "-itd", "busybox", "cat") - - cmd := exec.Command(dockerBinary, "attach", "--detach-keys=a,b,c", name) - stdout, err := cmd.StdoutPipe() - if err != nil { - c.Fatal(err) - } - cpty, tty, err := pty.Open() - if err != nil { - c.Fatal(err) - } - defer cpty.Close() - cmd.Stdin = tty - if err := cmd.Start(); err != nil { - c.Fatal(err) - } - c.Assert(waitRun(name), check.IsNil) - - // Invalid escape sequence aba, should print aba in output - if _, err := cpty.Write(keyA); err != nil { - c.Fatal(err) - } - time.Sleep(100 * time.Millisecond) - if _, err := cpty.Write(keyB); err != nil { - c.Fatal(err) - } - time.Sleep(100 * time.Millisecond) - if _, err := cpty.Write(keyA); err != nil { - c.Fatal(err) - } - time.Sleep(100 * time.Millisecond) - if _, err := cpty.Write([]byte("\n")); err != nil { - c.Fatal(err) - } - - out, err := bufio.NewReader(stdout).ReadString('\n') - if err != nil { - c.Fatal(err) - } - if strings.TrimSpace(out) != "aba" { - c.Fatalf("expected 'aba', got %q", out) - } -} - -// "test" should be printed -func (s *DockerSuite) TestRunWithCPUQuota(c *check.C) { - testRequires(c, cpuCfsQuota) - - file := "/sys/fs/cgroup/cpu/cpu.cfs_quota_us" - out, _ := dockerCmd(c, "run", "--cpu-quota", "8000", "--name", "test", "busybox", "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "8000") - - out = inspectField(c, "test", "HostConfig.CpuQuota") - c.Assert(out, checker.Equals, "8000", check.Commentf("setting the CPU CFS quota failed")) -} - -func (s *DockerSuite) TestRunWithCpuPeriod(c *check.C) { - testRequires(c, cpuCfsPeriod) - - file := "/sys/fs/cgroup/cpu/cpu.cfs_period_us" - out, _ := dockerCmd(c, "run", "--cpu-period", "50000", "--name", "test", "busybox", "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "50000") - - out, _ = dockerCmd(c, "run", "--cpu-period", "0", "busybox", "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "100000") - - out = inspectField(c, "test", "HostConfig.CpuPeriod") - c.Assert(out, checker.Equals, "50000", check.Commentf("setting the CPU CFS period failed")) -} - -func (s *DockerSuite) TestRunWithInvalidCpuPeriod(c *check.C) { - testRequires(c, cpuCfsPeriod) - out, _, err := dockerCmdWithError("run", "--cpu-period", "900", "busybox", "true") - c.Assert(err, check.NotNil) - expected := "CPU cfs period can not be less than 1ms (i.e. 1000) or larger than 1s (i.e. 1000000)" - c.Assert(out, checker.Contains, expected) - - out, _, err = dockerCmdWithError("run", "--cpu-period", "2000000", "busybox", "true") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, expected) - - out, _, err = dockerCmdWithError("run", "--cpu-period", "-3", "busybox", "true") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, expected) -} - -func (s *DockerSuite) TestRunWithKernelMemory(c *check.C) { - testRequires(c, kernelMemorySupport) - - file := "/sys/fs/cgroup/memory/memory.kmem.limit_in_bytes" - stdout, _, _ := dockerCmdWithStdoutStderr(c, "run", "--kernel-memory", "50M", "--name", "test1", "busybox", "cat", file) - c.Assert(strings.TrimSpace(stdout), checker.Equals, "52428800") - - out := inspectField(c, "test1", "HostConfig.KernelMemory") - c.Assert(out, check.Equals, "52428800") -} - -func (s *DockerSuite) TestRunWithInvalidKernelMemory(c *check.C) { - testRequires(c, kernelMemorySupport) - - out, _, err := dockerCmdWithError("run", "--kernel-memory", "2M", "busybox", "true") - c.Assert(err, check.NotNil) - expected := "Minimum kernel memory limit allowed is 4MB" - c.Assert(out, checker.Contains, expected) - - out, _, err = dockerCmdWithError("run", "--kernel-memory", "-16m", "--name", "test2", "busybox", "echo", "test") - c.Assert(err, check.NotNil) - expected = "invalid size" - c.Assert(out, checker.Contains, expected) -} - -func (s *DockerSuite) TestRunWithCPUShares(c *check.C) { - testRequires(c, cpuShare) - - file := "/sys/fs/cgroup/cpu/cpu.shares" - out, _ := dockerCmd(c, "run", "--cpu-shares", "1000", "--name", "test", "busybox", "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "1000") - - out = inspectField(c, "test", "HostConfig.CPUShares") - c.Assert(out, check.Equals, "1000") -} - -// "test" should be printed -func (s *DockerSuite) TestRunEchoStdoutWithCPUSharesAndMemoryLimit(c *check.C) { - testRequires(c, cpuShare) - testRequires(c, memoryLimitSupport) - out, _, _ := dockerCmdWithStdoutStderr(c, "run", "--cpu-shares", "1000", "-m", "32m", "busybox", "echo", "test") - c.Assert(out, checker.Equals, "test\n", check.Commentf("container should've printed 'test'")) -} - -func (s *DockerSuite) TestRunWithCpusetCpus(c *check.C) { - testRequires(c, cgroupCpuset) - - file := "/sys/fs/cgroup/cpuset/cpuset.cpus" - out, _ := dockerCmd(c, "run", "--cpuset-cpus", "0", "--name", "test", "busybox", "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - out = inspectField(c, "test", "HostConfig.CpusetCpus") - c.Assert(out, check.Equals, "0") -} - -func (s *DockerSuite) TestRunWithCpusetMems(c *check.C) { - testRequires(c, cgroupCpuset) - - file := "/sys/fs/cgroup/cpuset/cpuset.mems" - out, _ := dockerCmd(c, "run", "--cpuset-mems", "0", "--name", "test", "busybox", "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - out = inspectField(c, "test", "HostConfig.CpusetMems") - c.Assert(out, check.Equals, "0") -} - -func (s *DockerSuite) TestRunWithBlkioWeight(c *check.C) { - testRequires(c, blkioWeight) - - file := "/sys/fs/cgroup/blkio/blkio.weight" - out, _ := dockerCmd(c, "run", "--blkio-weight", "300", "--name", "test", "busybox", "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "300") - - out = inspectField(c, "test", "HostConfig.BlkioWeight") - c.Assert(out, check.Equals, "300") -} - -func (s *DockerSuite) TestRunWithInvalidBlkioWeight(c *check.C) { - testRequires(c, blkioWeight) - out, _, err := dockerCmdWithError("run", "--blkio-weight", "5", "busybox", "true") - c.Assert(err, check.NotNil, check.Commentf(out)) - expected := "Range of blkio weight is from 10 to 1000" - c.Assert(out, checker.Contains, expected) -} - -func (s *DockerSuite) TestRunWithInvalidPathforBlkioWeightDevice(c *check.C) { - testRequires(c, blkioWeight) - out, _, err := dockerCmdWithError("run", "--blkio-weight-device", "/dev/sdX:100", "busybox", "true") - c.Assert(err, check.NotNil, check.Commentf(out)) -} - -func (s *DockerSuite) TestRunWithInvalidPathforBlkioDeviceReadBps(c *check.C) { - testRequires(c, blkioWeight) - out, _, err := dockerCmdWithError("run", "--device-read-bps", "/dev/sdX:500", "busybox", "true") - c.Assert(err, check.NotNil, check.Commentf(out)) -} - -func (s *DockerSuite) TestRunWithInvalidPathforBlkioDeviceWriteBps(c *check.C) { - testRequires(c, blkioWeight) - out, _, err := dockerCmdWithError("run", "--device-write-bps", "/dev/sdX:500", "busybox", "true") - c.Assert(err, check.NotNil, check.Commentf(out)) -} - -func (s *DockerSuite) TestRunWithInvalidPathforBlkioDeviceReadIOps(c *check.C) { - testRequires(c, blkioWeight) - out, _, err := dockerCmdWithError("run", "--device-read-iops", "/dev/sdX:500", "busybox", "true") - c.Assert(err, check.NotNil, check.Commentf(out)) -} - -func (s *DockerSuite) TestRunWithInvalidPathforBlkioDeviceWriteIOps(c *check.C) { - testRequires(c, blkioWeight) - out, _, err := dockerCmdWithError("run", "--device-write-iops", "/dev/sdX:500", "busybox", "true") - c.Assert(err, check.NotNil, check.Commentf(out)) -} - -func (s *DockerSuite) TestRunOOMExitCode(c *check.C) { - testRequires(c, memoryLimitSupport, swapMemorySupport) - errChan := make(chan error) - go func() { - defer close(errChan) - out, exitCode, _ := dockerCmdWithError("run", "-m", "4MB", "busybox", "sh", "-c", "x=a; while true; do x=$x$x$x$x; done") - if expected := 137; exitCode != expected { - errChan <- fmt.Errorf("wrong exit code for OOM container: expected %d, got %d (output: %q)", expected, exitCode, out) - } - }() - - select { - case err := <-errChan: - c.Assert(err, check.IsNil) - case <-time.After(600 * time.Second): - c.Fatal("Timeout waiting for container to die on OOM") - } -} - -func (s *DockerSuite) TestRunWithMemoryLimit(c *check.C) { - testRequires(c, memoryLimitSupport) - - file := "/sys/fs/cgroup/memory/memory.limit_in_bytes" - stdout, _, _ := dockerCmdWithStdoutStderr(c, "run", "-m", "32M", "--name", "test", "busybox", "cat", file) - c.Assert(strings.TrimSpace(stdout), checker.Equals, "33554432") - - out := inspectField(c, "test", "HostConfig.Memory") - c.Assert(out, check.Equals, "33554432") -} - -// TestRunWithoutMemoryswapLimit sets memory limit and disables swap -// memory limit, this means the processes in the container can use -// 16M memory and as much swap memory as they need (if the host -// supports swap memory). -func (s *DockerSuite) TestRunWithoutMemoryswapLimit(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - testRequires(c, swapMemorySupport) - dockerCmd(c, "run", "-m", "32m", "--memory-swap", "-1", "busybox", "true") -} - -func (s *DockerSuite) TestRunWithSwappiness(c *check.C) { - testRequires(c, memorySwappinessSupport) - file := "/sys/fs/cgroup/memory/memory.swappiness" - out, _ := dockerCmd(c, "run", "--memory-swappiness", "0", "--name", "test", "busybox", "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "0") - - out = inspectField(c, "test", "HostConfig.MemorySwappiness") - c.Assert(out, check.Equals, "0") -} - -func (s *DockerSuite) TestRunWithSwappinessInvalid(c *check.C) { - testRequires(c, memorySwappinessSupport) - out, _, err := dockerCmdWithError("run", "--memory-swappiness", "101", "busybox", "true") - c.Assert(err, check.NotNil) - expected := "Valid memory swappiness range is 0-100" - c.Assert(out, checker.Contains, expected, check.Commentf("Expected output to contain %q, not %q", out, expected)) - - out, _, err = dockerCmdWithError("run", "--memory-swappiness", "-10", "busybox", "true") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, expected, check.Commentf("Expected output to contain %q, not %q", out, expected)) -} - -func (s *DockerSuite) TestRunWithMemoryReservation(c *check.C) { - testRequires(c, memoryReservationSupport) - - file := "/sys/fs/cgroup/memory/memory.soft_limit_in_bytes" - out, _ := dockerCmd(c, "run", "--memory-reservation", "200M", "--name", "test", "busybox", "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "209715200") - - out = inspectField(c, "test", "HostConfig.MemoryReservation") - c.Assert(out, check.Equals, "209715200") -} - -func (s *DockerSuite) TestRunWithMemoryReservationInvalid(c *check.C) { - testRequires(c, memoryLimitSupport) - testRequires(c, memoryReservationSupport) - out, _, err := dockerCmdWithError("run", "-m", "500M", "--memory-reservation", "800M", "busybox", "true") - c.Assert(err, check.NotNil) - expected := "Minimum memory limit can not be less than memory reservation limit" - c.Assert(strings.TrimSpace(out), checker.Contains, expected, check.Commentf("run container should fail with invalid memory reservation")) - - out, _, err = dockerCmdWithError("run", "--memory-reservation", "1k", "busybox", "true") - c.Assert(err, check.NotNil) - expected = "Minimum memory reservation allowed is 4MB" - c.Assert(strings.TrimSpace(out), checker.Contains, expected, check.Commentf("run container should fail with invalid memory reservation")) -} - -func (s *DockerSuite) TestStopContainerSignal(c *check.C) { - out, _ := dockerCmd(c, "run", "--stop-signal", "SIGUSR1", "-d", "busybox", "/bin/sh", "-c", `trap 'echo "exit trapped"; exit 0' USR1; while true; do sleep 1; done`) - containerID := strings.TrimSpace(out) - - c.Assert(waitRun(containerID), checker.IsNil) - - dockerCmd(c, "stop", containerID) - out, _ = dockerCmd(c, "logs", containerID) - - c.Assert(out, checker.Contains, "exit trapped", check.Commentf("Expected `exit trapped` in the log")) -} - -func (s *DockerSuite) TestRunSwapLessThanMemoryLimit(c *check.C) { - testRequires(c, memoryLimitSupport) - testRequires(c, swapMemorySupport) - out, _, err := dockerCmdWithError("run", "-m", "16m", "--memory-swap", "15m", "busybox", "echo", "test") - expected := "Minimum memoryswap limit should be larger than memory limit" - c.Assert(err, check.NotNil) - - c.Assert(out, checker.Contains, expected) -} - -func (s *DockerSuite) TestRunInvalidCpusetCpusFlagValue(c *check.C) { - testRequires(c, cgroupCpuset, SameHostDaemon) - - sysInfo := sysinfo.New(true) - cpus, err := parsers.ParseUintList(sysInfo.Cpus) - c.Assert(err, check.IsNil) - var invalid int - for i := 0; i <= len(cpus)+1; i++ { - if !cpus[i] { - invalid = i - break - } - } - out, _, err := dockerCmdWithError("run", "--cpuset-cpus", strconv.Itoa(invalid), "busybox", "true") - c.Assert(err, check.NotNil) - expected := fmt.Sprintf("Error response from daemon: Requested CPUs are not available - requested %s, available: %s", strconv.Itoa(invalid), sysInfo.Cpus) - c.Assert(out, checker.Contains, expected) -} - -func (s *DockerSuite) TestRunInvalidCpusetMemsFlagValue(c *check.C) { - testRequires(c, cgroupCpuset) - - sysInfo := sysinfo.New(true) - mems, err := parsers.ParseUintList(sysInfo.Mems) - c.Assert(err, check.IsNil) - var invalid int - for i := 0; i <= len(mems)+1; i++ { - if !mems[i] { - invalid = i - break - } - } - out, _, err := dockerCmdWithError("run", "--cpuset-mems", strconv.Itoa(invalid), "busybox", "true") - c.Assert(err, check.NotNil) - expected := fmt.Sprintf("Error response from daemon: Requested memory nodes are not available - requested %s, available: %s", strconv.Itoa(invalid), sysInfo.Mems) - c.Assert(out, checker.Contains, expected) -} - -func (s *DockerSuite) TestRunInvalidCPUShares(c *check.C) { - testRequires(c, cpuShare, DaemonIsLinux) - out, _, err := dockerCmdWithError("run", "--cpu-shares", "1", "busybox", "echo", "test") - c.Assert(err, check.NotNil, check.Commentf(out)) - expected := "The minimum allowed cpu-shares is 2" - c.Assert(out, checker.Contains, expected) - - out, _, err = dockerCmdWithError("run", "--cpu-shares", "-1", "busybox", "echo", "test") - c.Assert(err, check.NotNil, check.Commentf(out)) - expected = "shares: invalid argument" - c.Assert(out, checker.Contains, expected) - - out, _, err = dockerCmdWithError("run", "--cpu-shares", "99999999", "busybox", "echo", "test") - c.Assert(err, check.NotNil, check.Commentf(out)) - expected = "The maximum allowed cpu-shares is" - c.Assert(out, checker.Contains, expected) -} - -func (s *DockerSuite) TestRunWithDefaultShmSize(c *check.C) { - testRequires(c, DaemonIsLinux) - - name := "shm-default" - out, _ := dockerCmd(c, "run", "--name", name, "busybox", "mount") - shmRegex := regexp.MustCompile(`shm on /dev/shm type tmpfs(.*)size=65536k`) - if !shmRegex.MatchString(out) { - c.Fatalf("Expected shm of 64MB in mount command, got %v", out) - } - shmSize := inspectField(c, name, "HostConfig.ShmSize") - c.Assert(shmSize, check.Equals, "67108864") -} - -func (s *DockerSuite) TestRunWithShmSize(c *check.C) { - testRequires(c, DaemonIsLinux) - - name := "shm" - out, _ := dockerCmd(c, "run", "--name", name, "--shm-size=1G", "busybox", "mount") - shmRegex := regexp.MustCompile(`shm on /dev/shm type tmpfs(.*)size=1048576k`) - if !shmRegex.MatchString(out) { - c.Fatalf("Expected shm of 1GB in mount command, got %v", out) - } - shmSize := inspectField(c, name, "HostConfig.ShmSize") - c.Assert(shmSize, check.Equals, "1073741824") -} - -func (s *DockerSuite) TestRunTmpfsMountsEnsureOrdered(c *check.C) { - tmpFile, err := ioutil.TempFile("", "test") - c.Assert(err, check.IsNil) - defer tmpFile.Close() - out, _ := dockerCmd(c, "run", "--tmpfs", "/run", "-v", tmpFile.Name()+":/run/test", "busybox", "ls", "/run") - c.Assert(out, checker.Contains, "test") -} - -func (s *DockerSuite) TestRunTmpfsMounts(c *check.C) { - // TODO Windows (Post TP5): This test cannot run on a Windows daemon as - // Windows does not support tmpfs mounts. - testRequires(c, DaemonIsLinux) - if out, _, err := dockerCmdWithError("run", "--tmpfs", "/run", "busybox", "touch", "/run/somefile"); err != nil { - c.Fatalf("/run directory not mounted on tmpfs %q %s", err, out) - } - if out, _, err := dockerCmdWithError("run", "--tmpfs", "/run:noexec", "busybox", "touch", "/run/somefile"); err != nil { - c.Fatalf("/run directory not mounted on tmpfs %q %s", err, out) - } - if out, _, err := dockerCmdWithError("run", "--tmpfs", "/run:noexec,nosuid,rw,size=5k,mode=700", "busybox", "touch", "/run/somefile"); err != nil { - c.Fatalf("/run failed to mount on tmpfs with valid options %q %s", err, out) - } - if _, _, err := dockerCmdWithError("run", "--tmpfs", "/run:foobar", "busybox", "touch", "/run/somefile"); err == nil { - c.Fatalf("/run mounted on tmpfs when it should have vailed within invalid mount option") - } - if _, _, err := dockerCmdWithError("run", "--tmpfs", "/run", "-v", "/run:/run", "busybox", "touch", "/run/somefile"); err == nil { - c.Fatalf("Should have generated an error saying Duplicate mount points") - } -} - -func (s *DockerSuite) TestRunTmpfsMountsOverrideImageVolumes(c *check.C) { - name := "img-with-volumes" - _, err := buildImage( - name, - ` - FROM busybox - VOLUME /run - RUN touch /run/stuff - `, - true) - if err != nil { - c.Fatal(err) - } - out, _ := dockerCmd(c, "run", "--tmpfs", "/run", name, "ls", "/run") - c.Assert(out, checker.Not(checker.Contains), "stuff") -} - -// Test case for #22420 -func (s *DockerSuite) TestRunTmpfsMountsWithOptions(c *check.C) { - testRequires(c, DaemonIsLinux) - - expectedOptions := []string{"rw", "nosuid", "nodev", "noexec", "relatime"} - out, _ := dockerCmd(c, "run", "--tmpfs", "/tmp", "busybox", "sh", "-c", "mount | grep 'tmpfs on /tmp'") - for _, option := range expectedOptions { - c.Assert(out, checker.Contains, option) - } - c.Assert(out, checker.Not(checker.Contains), "size=") - - expectedOptions = []string{"rw", "nosuid", "nodev", "noexec", "relatime"} - out, _ = dockerCmd(c, "run", "--tmpfs", "/tmp:rw", "busybox", "sh", "-c", "mount | grep 'tmpfs on /tmp'") - for _, option := range expectedOptions { - c.Assert(out, checker.Contains, option) - } - c.Assert(out, checker.Not(checker.Contains), "size=") - - expectedOptions = []string{"rw", "nosuid", "nodev", "relatime", "size=8192k"} - out, _ = dockerCmd(c, "run", "--tmpfs", "/tmp:rw,exec,size=8192k", "busybox", "sh", "-c", "mount | grep 'tmpfs on /tmp'") - for _, option := range expectedOptions { - c.Assert(out, checker.Contains, option) - } - - expectedOptions = []string{"rw", "nosuid", "nodev", "noexec", "relatime", "size=4096k"} - out, _ = dockerCmd(c, "run", "--tmpfs", "/tmp:rw,size=8192k,exec,size=4096k,noexec", "busybox", "sh", "-c", "mount | grep 'tmpfs on /tmp'") - for _, option := range expectedOptions { - c.Assert(out, checker.Contains, option) - } - - // We use debian:jessie as there is no findmnt in busybox. Also the output will be in the format of - // TARGET PROPAGATION - // /tmp shared - // so we only capture `shared` here. - expectedOptions = []string{"shared"} - out, _ = dockerCmd(c, "run", "--tmpfs", "/tmp:shared", "debian:jessie", "findmnt", "-o", "TARGET,PROPAGATION", "/tmp") - for _, option := range expectedOptions { - c.Assert(out, checker.Contains, option) - } -} - -func (s *DockerSuite) TestRunSysctls(c *check.C) { - - testRequires(c, DaemonIsLinux) - var err error - - out, _ := dockerCmd(c, "run", "--sysctl", "net.ipv4.ip_forward=1", "--name", "test", "busybox", "cat", "/proc/sys/net/ipv4/ip_forward") - c.Assert(strings.TrimSpace(out), check.Equals, "1") - - out = inspectFieldJSON(c, "test", "HostConfig.Sysctls") - - sysctls := make(map[string]string) - err = json.Unmarshal([]byte(out), &sysctls) - c.Assert(err, check.IsNil) - c.Assert(sysctls["net.ipv4.ip_forward"], check.Equals, "1") - - out, _ = dockerCmd(c, "run", "--sysctl", "net.ipv4.ip_forward=0", "--name", "test1", "busybox", "cat", "/proc/sys/net/ipv4/ip_forward") - c.Assert(strings.TrimSpace(out), check.Equals, "0") - - out = inspectFieldJSON(c, "test1", "HostConfig.Sysctls") - - err = json.Unmarshal([]byte(out), &sysctls) - c.Assert(err, check.IsNil) - c.Assert(sysctls["net.ipv4.ip_forward"], check.Equals, "0") - - runCmd := exec.Command(dockerBinary, "run", "--sysctl", "kernel.foobar=1", "--name", "test2", "busybox", "cat", "/proc/sys/kernel/foobar") - out, _, _ = runCommandWithOutput(runCmd) - if !strings.Contains(out, "invalid argument") { - c.Fatalf("expected --sysctl to fail, got %s", out) - } -} - -// TestRunSeccompProfileDenyUnshare checks that 'docker run --security-opt seccomp=/tmp/profile.json debian:jessie unshare' exits with operation not permitted. -func (s *DockerSuite) TestRunSeccompProfileDenyUnshare(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled, NotArm, Apparmor) - jsonData := `{ - "defaultAction": "SCMP_ACT_ALLOW", - "syscalls": [ - { - "name": "unshare", - "action": "SCMP_ACT_ERRNO" - } - ] -}` - tmpFile, err := ioutil.TempFile("", "profile.json") - if err != nil { - c.Fatal(err) - } - defer tmpFile.Close() - - if _, err := tmpFile.Write([]byte(jsonData)); err != nil { - c.Fatal(err) - } - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "apparmor=unconfined", "--security-opt", "seccomp="+tmpFile.Name(), "debian:jessie", "unshare", "-p", "-m", "-f", "-r", "mount", "-t", "proc", "none", "/proc") - out, _, _ := runCommandWithOutput(runCmd) - if !strings.Contains(out, "Operation not permitted") { - c.Fatalf("expected unshare with seccomp profile denied to fail, got %s", out) - } -} - -// TestRunSeccompProfileDenyChmod checks that 'docker run --security-opt seccomp=/tmp/profile.json busybox chmod 400 /etc/hostname' exits with operation not permitted. -func (s *DockerSuite) TestRunSeccompProfileDenyChmod(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled) - jsonData := `{ - "defaultAction": "SCMP_ACT_ALLOW", - "syscalls": [ - { - "name": "chmod", - "action": "SCMP_ACT_ERRNO" - }, - { - "name":"fchmod", - "action": "SCMP_ACT_ERRNO" - }, - { - "name": "fchmodat", - "action":"SCMP_ACT_ERRNO" - } - ] -}` - tmpFile, err := ioutil.TempFile("", "profile.json") - c.Assert(err, check.IsNil) - defer tmpFile.Close() - - if _, err := tmpFile.Write([]byte(jsonData)); err != nil { - c.Fatal(err) - } - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "seccomp="+tmpFile.Name(), "busybox", "chmod", "400", "/etc/hostname") - out, _, _ := runCommandWithOutput(runCmd) - if !strings.Contains(out, "Operation not permitted") { - c.Fatalf("expected chmod with seccomp profile denied to fail, got %s", out) - } -} - -// TestRunSeccompProfileDenyUnshareUserns checks that 'docker run debian:jessie unshare --map-root-user --user sh -c whoami' with a specific profile to -// deny unhare of a userns exits with operation not permitted. -func (s *DockerSuite) TestRunSeccompProfileDenyUnshareUserns(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled, NotArm, Apparmor) - // from sched.h - jsonData := fmt.Sprintf(`{ - "defaultAction": "SCMP_ACT_ALLOW", - "syscalls": [ - { - "name": "unshare", - "action": "SCMP_ACT_ERRNO", - "args": [ - { - "index": 0, - "value": %d, - "op": "SCMP_CMP_EQ" - } - ] - } - ] -}`, uint64(0x10000000)) - tmpFile, err := ioutil.TempFile("", "profile.json") - if err != nil { - c.Fatal(err) - } - defer tmpFile.Close() - - if _, err := tmpFile.Write([]byte(jsonData)); err != nil { - c.Fatal(err) - } - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "apparmor=unconfined", "--security-opt", "seccomp="+tmpFile.Name(), "debian:jessie", "unshare", "--map-root-user", "--user", "sh", "-c", "whoami") - out, _, _ := runCommandWithOutput(runCmd) - if !strings.Contains(out, "Operation not permitted") { - c.Fatalf("expected unshare userns with seccomp profile denied to fail, got %s", out) - } -} - -// TestRunSeccompProfileDenyCloneUserns checks that 'docker run syscall-test' -// with a the default seccomp profile exits with operation not permitted. -func (s *DockerSuite) TestRunSeccompProfileDenyCloneUserns(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled) - ensureSyscallTest(c) - - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "userns-test", "id") - out, _, err := runCommandWithOutput(runCmd) - if err == nil || !strings.Contains(out, "clone failed: Operation not permitted") { - c.Fatalf("expected clone userns with default seccomp profile denied to fail, got %s: %v", out, err) - } -} - -// TestRunSeccompUnconfinedCloneUserns checks that -// 'docker run --security-opt seccomp=unconfined syscall-test' allows creating a userns. -func (s *DockerSuite) TestRunSeccompUnconfinedCloneUserns(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled, UserNamespaceInKernel, NotUserNamespace, unprivilegedUsernsClone) - ensureSyscallTest(c) - - // make sure running w privileged is ok - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "seccomp=unconfined", "syscall-test", "userns-test", "id") - if out, _, err := runCommandWithOutput(runCmd); err != nil || !strings.Contains(out, "nobody") { - c.Fatalf("expected clone userns with --security-opt seccomp=unconfined to succeed, got %s: %v", out, err) - } -} - -// TestRunSeccompAllowPrivCloneUserns checks that 'docker run --privileged syscall-test' -// allows creating a userns. -func (s *DockerSuite) TestRunSeccompAllowPrivCloneUserns(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled, UserNamespaceInKernel, NotUserNamespace) - ensureSyscallTest(c) - - // make sure running w privileged is ok - runCmd := exec.Command(dockerBinary, "run", "--privileged", "syscall-test", "userns-test", "id") - if out, _, err := runCommandWithOutput(runCmd); err != nil || !strings.Contains(out, "nobody") { - c.Fatalf("expected clone userns with --privileged to succeed, got %s: %v", out, err) - } -} - -// TestRunSeccompProfileAllow32Bit checks that 32 bit code can run on x86_64 -// with the default seccomp profile. -func (s *DockerSuite) TestRunSeccompProfileAllow32Bit(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled, IsAmd64) - ensureSyscallTest(c) - - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "exit32-test", "id") - if out, _, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("expected to be able to run 32 bit code, got %s: %v", out, err) - } -} - -// TestRunSeccompAllowSetrlimit checks that 'docker run debian:jessie ulimit -v 1048510' succeeds. -func (s *DockerSuite) TestRunSeccompAllowSetrlimit(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled) - - // ulimit uses setrlimit, so we want to make sure we don't break it - runCmd := exec.Command(dockerBinary, "run", "debian:jessie", "bash", "-c", "ulimit -v 1048510") - if out, _, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("expected ulimit with seccomp to succeed, got %s: %v", out, err) - } -} - -func (s *DockerSuite) TestRunSeccompDefaultProfileAcct(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled, NotUserNamespace) - ensureSyscallTest(c) - - out, _, err := dockerCmdWithError("run", "syscall-test", "acct-test") - if err == nil || !strings.Contains(out, "Operation not permitted") { - c.Fatalf("test 0: expected Operation not permitted, got: %s", out) - } - - out, _, err = dockerCmdWithError("run", "--cap-add", "sys_admin", "syscall-test", "acct-test") - if err == nil || !strings.Contains(out, "Operation not permitted") { - c.Fatalf("test 1: expected Operation not permitted, got: %s", out) - } - - out, _, err = dockerCmdWithError("run", "--cap-add", "sys_pacct", "syscall-test", "acct-test") - if err == nil || !strings.Contains(out, "No such file or directory") { - c.Fatalf("test 2: expected No such file or directory, got: %s", out) - } - - out, _, err = dockerCmdWithError("run", "--cap-add", "ALL", "syscall-test", "acct-test") - if err == nil || !strings.Contains(out, "No such file or directory") { - c.Fatalf("test 3: expected No such file or directory, got: %s", out) - } - - out, _, err = dockerCmdWithError("run", "--cap-drop", "ALL", "--cap-add", "sys_pacct", "syscall-test", "acct-test") - if err == nil || !strings.Contains(out, "No such file or directory") { - c.Fatalf("test 4: expected No such file or directory, got: %s", out) - } -} - -func (s *DockerSuite) TestRunSeccompDefaultProfileNS(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled, NotUserNamespace) - ensureSyscallTest(c) - - out, _, err := dockerCmdWithError("run", "syscall-test", "ns-test", "echo", "hello0") - if err == nil || !strings.Contains(out, "Operation not permitted") { - c.Fatalf("test 0: expected Operation not permitted, got: %s", out) - } - - out, _, err = dockerCmdWithError("run", "--cap-add", "sys_admin", "syscall-test", "ns-test", "echo", "hello1") - if err != nil || !strings.Contains(out, "hello1") { - c.Fatalf("test 1: expected hello1, got: %s, %v", out, err) - } - - out, _, err = dockerCmdWithError("run", "--cap-drop", "all", "--cap-add", "sys_admin", "syscall-test", "ns-test", "echo", "hello2") - if err != nil || !strings.Contains(out, "hello2") { - c.Fatalf("test 2: expected hello2, got: %s, %v", out, err) - } - - out, _, err = dockerCmdWithError("run", "--cap-add", "ALL", "syscall-test", "ns-test", "echo", "hello3") - if err != nil || !strings.Contains(out, "hello3") { - c.Fatalf("test 3: expected hello3, got: %s, %v", out, err) - } - - out, _, err = dockerCmdWithError("run", "--cap-add", "ALL", "--security-opt", "seccomp=unconfined", "syscall-test", "acct-test") - if err == nil || !strings.Contains(out, "No such file or directory") { - c.Fatalf("test 4: expected No such file or directory, got: %s", out) - } - - out, _, err = dockerCmdWithError("run", "--cap-add", "ALL", "--security-opt", "seccomp=unconfined", "syscall-test", "ns-test", "echo", "hello4") - if err != nil || !strings.Contains(out, "hello4") { - c.Fatalf("test 5: expected hello4, got: %s, %v", out, err) - } -} - -// TestRunNoNewPrivSetuid checks that --security-opt=no-new-privileges prevents -// effective uid transtions on executing setuid binaries. -func (s *DockerSuite) TestRunNoNewPrivSetuid(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, SameHostDaemon) - ensureNNPTest(c) - - // test that running a setuid binary results in no effective uid transition - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "no-new-privileges", "--user", "1000", "nnp-test", "/usr/bin/nnp-test") - if out, _, err := runCommandWithOutput(runCmd); err != nil || !strings.Contains(out, "EUID=1000") { - c.Fatalf("expected output to contain EUID=1000, got %s: %v", out, err) - } -} - -func (s *DockerSuite) TestUserNoEffectiveCapabilitiesChown(c *check.C) { - testRequires(c, DaemonIsLinux) - ensureSyscallTest(c) - - // test that a root user has default capability CAP_CHOWN - runCmd := exec.Command(dockerBinary, "run", "busybox", "chown", "100", "/tmp") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) - // test that non root user does not have default capability CAP_CHOWN - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "busybox", "chown", "100", "/tmp") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") - // test that root user can drop default capability CAP_CHOWN - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "chown", "busybox", "chown", "100", "/tmp") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") -} - -func (s *DockerSuite) TestUserNoEffectiveCapabilitiesDacOverride(c *check.C) { - testRequires(c, DaemonIsLinux) - ensureSyscallTest(c) - - // test that a root user has default capability CAP_DAC_OVERRIDE - runCmd := exec.Command(dockerBinary, "run", "busybox", "sh", "-c", "echo test > /etc/passwd") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) - // test that non root user does not have default capability CAP_DAC_OVERRIDE - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "busybox", "sh", "-c", "echo test > /etc/passwd") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Permission denied") - // TODO test that root user can drop default capability CAP_DAC_OVERRIDE -} - -func (s *DockerSuite) TestUserNoEffectiveCapabilitiesFowner(c *check.C) { - testRequires(c, DaemonIsLinux) - ensureSyscallTest(c) - - // test that a root user has default capability CAP_FOWNER - runCmd := exec.Command(dockerBinary, "run", "busybox", "chmod", "777", "/etc/passwd") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) - // test that non root user does not have default capability CAP_FOWNER - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "busybox", "chmod", "777", "/etc/passwd") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") - // TODO test that root user can drop default capability CAP_FOWNER -} - -// TODO CAP_KILL - -func (s *DockerSuite) TestUserNoEffectiveCapabilitiesSetuid(c *check.C) { - testRequires(c, DaemonIsLinux) - ensureSyscallTest(c) - - // test that a root user has default capability CAP_SETUID - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "setuid-test") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) - // test that non root user does not have default capability CAP_SETUID - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "setuid-test") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") - // test that root user can drop default capability CAP_SETUID - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "setuid", "syscall-test", "setuid-test") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") -} - -func (s *DockerSuite) TestUserNoEffectiveCapabilitiesSetgid(c *check.C) { - testRequires(c, DaemonIsLinux) - ensureSyscallTest(c) - - // test that a root user has default capability CAP_SETGID - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "setgid-test") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) - // test that non root user does not have default capability CAP_SETGID - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "setgid-test") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") - // test that root user can drop default capability CAP_SETGID - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "setgid", "syscall-test", "setgid-test") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") -} - -// TODO CAP_SETPCAP - -func (s *DockerSuite) TestUserNoEffectiveCapabilitiesNetBindService(c *check.C) { - testRequires(c, DaemonIsLinux) - ensureSyscallTest(c) - - // test that a root user has default capability CAP_NET_BIND_SERVICE - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "socket-test") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) - // test that non root user does not have default capability CAP_NET_BIND_SERVICE - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "socket-test") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Permission denied") - // test that root user can drop default capability CAP_NET_BIND_SERVICE - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "net_bind_service", "syscall-test", "socket-test") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Permission denied") -} - -func (s *DockerSuite) TestUserNoEffectiveCapabilitiesNetRaw(c *check.C) { - testRequires(c, DaemonIsLinux) - ensureSyscallTest(c) - - // test that a root user has default capability CAP_NET_RAW - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "raw-test") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) - // test that non root user does not have default capability CAP_NET_RAW - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "raw-test") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") - // test that root user can drop default capability CAP_NET_RAW - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "net_raw", "syscall-test", "raw-test") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") -} - -func (s *DockerSuite) TestUserNoEffectiveCapabilitiesChroot(c *check.C) { - testRequires(c, DaemonIsLinux) - ensureSyscallTest(c) - - // test that a root user has default capability CAP_SYS_CHROOT - runCmd := exec.Command(dockerBinary, "run", "busybox", "chroot", "/", "/bin/true") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) - // test that non root user does not have default capability CAP_SYS_CHROOT - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "busybox", "chroot", "/", "/bin/true") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") - // test that root user can drop default capability CAP_SYS_CHROOT - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "sys_chroot", "busybox", "chroot", "/", "/bin/true") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") -} - -func (s *DockerSuite) TestUserNoEffectiveCapabilitiesMknod(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - ensureSyscallTest(c) - - // test that a root user has default capability CAP_MKNOD - runCmd := exec.Command(dockerBinary, "run", "busybox", "mknod", "/tmp/node", "b", "1", "2") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) - // test that non root user does not have default capability CAP_MKNOD - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "busybox", "mknod", "/tmp/node", "b", "1", "2") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") - // test that root user can drop default capability CAP_MKNOD - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "mknod", "busybox", "mknod", "/tmp/node", "b", "1", "2") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") -} - -// TODO CAP_AUDIT_WRITE -// TODO CAP_SETFCAP - -func (s *DockerSuite) TestRunApparmorProcDirectory(c *check.C) { - testRequires(c, SameHostDaemon, Apparmor) - - // running w seccomp unconfined tests the apparmor profile - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "seccomp=unconfined", "busybox", "chmod", "777", "/proc/1/cgroup") - if out, _, err := runCommandWithOutput(runCmd); err == nil || !(strings.Contains(out, "Permission denied") || strings.Contains(out, "Operation not permitted")) { - c.Fatalf("expected chmod 777 /proc/1/cgroup to fail, got %s: %v", out, err) - } - - runCmd = exec.Command(dockerBinary, "run", "--security-opt", "seccomp=unconfined", "busybox", "chmod", "777", "/proc/1/attr/current") - if out, _, err := runCommandWithOutput(runCmd); err == nil || !(strings.Contains(out, "Permission denied") || strings.Contains(out, "Operation not permitted")) { - c.Fatalf("expected chmod 777 /proc/1/attr/current to fail, got %s: %v", out, err) - } -} - -// make sure the default profile can be successfully parsed (using unshare as it is -// something which we know is blocked in the default profile) -func (s *DockerSuite) TestRunSeccompWithDefaultProfile(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled) - - out, _, err := dockerCmdWithError("run", "--security-opt", "seccomp=../profiles/seccomp/default.json", "debian:jessie", "unshare", "--map-root-user", "--user", "sh", "-c", "whoami") - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Equals, "unshare: unshare failed: Operation not permitted") -} - -// TestRunDeviceSymlink checks run with device that follows symlink (#13840 and #22271) -func (s *DockerSuite) TestRunDeviceSymlink(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace, NotArm, SameHostDaemon) - if _, err := os.Stat("/dev/zero"); err != nil { - c.Skip("Host does not have /dev/zero") - } - - // Create a temporary directory to create symlink - tmpDir, err := ioutil.TempDir("", "docker_device_follow_symlink_tests") - c.Assert(err, checker.IsNil) - - defer os.RemoveAll(tmpDir) - - // Create a symbolic link to /dev/zero - symZero := filepath.Join(tmpDir, "zero") - err = os.Symlink("/dev/zero", symZero) - c.Assert(err, checker.IsNil) - - // Create a temporary file "temp" inside tmpDir, write some data to "tmpDir/temp", - // then create a symlink "tmpDir/file" to the temporary file "tmpDir/temp". - tmpFile := filepath.Join(tmpDir, "temp") - err = ioutil.WriteFile(tmpFile, []byte("temp"), 0666) - c.Assert(err, checker.IsNil) - symFile := filepath.Join(tmpDir, "file") - err = os.Symlink(tmpFile, symFile) - c.Assert(err, checker.IsNil) - - // Create a symbolic link to /dev/zero, this time with a relative path (#22271) - err = os.Symlink("zero", "/dev/symzero") - if err != nil { - c.Fatal("/dev/symzero creation failed") - } - // We need to remove this symbolic link here as it is created in /dev/, not temporary directory as above - defer os.Remove("/dev/symzero") - - // md5sum of 'dd if=/dev/zero bs=4K count=8' is bb7df04e1b0a2570657527a7e108ae23 - out, _ := dockerCmd(c, "run", "--device", symZero+":/dev/symzero", "busybox", "sh", "-c", "dd if=/dev/symzero bs=4K count=8 | md5sum") - c.Assert(strings.Trim(out, "\r\n"), checker.Contains, "bb7df04e1b0a2570657527a7e108ae23", check.Commentf("expected output bb7df04e1b0a2570657527a7e108ae23")) - - // symlink "tmpDir/file" to a file "tmpDir/temp" will result in an error as it is not a device. - out, _, err = dockerCmdWithError("run", "--device", symFile+":/dev/symzero", "busybox", "sh", "-c", "dd if=/dev/symzero bs=4K count=8 | md5sum") - c.Assert(err, check.NotNil) - c.Assert(strings.Trim(out, "\r\n"), checker.Contains, "not a device node", check.Commentf("expected output 'not a device node'")) - - // md5sum of 'dd if=/dev/zero bs=4K count=8' is bb7df04e1b0a2570657527a7e108ae23 (this time check with relative path backed, see #22271) - out, _ = dockerCmd(c, "run", "--device", "/dev/symzero:/dev/symzero", "busybox", "sh", "-c", "dd if=/dev/symzero bs=4K count=8 | md5sum") - c.Assert(strings.Trim(out, "\r\n"), checker.Contains, "bb7df04e1b0a2570657527a7e108ae23", check.Commentf("expected output bb7df04e1b0a2570657527a7e108ae23")) -} - -// TestRunPIDsLimit makes sure the pids cgroup is set with --pids-limit -func (s *DockerSuite) TestRunPIDsLimit(c *check.C) { - testRequires(c, pidsLimit) - - file := "/sys/fs/cgroup/pids/pids.max" - out, _ := dockerCmd(c, "run", "--name", "skittles", "--pids-limit", "4", "busybox", "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "4") - - out = inspectField(c, "skittles", "HostConfig.PidsLimit") - c.Assert(out, checker.Equals, "4", check.Commentf("setting the pids limit failed")) -} - -func (s *DockerSuite) TestRunPrivilegedAllowedDevices(c *check.C) { - testRequires(c, DaemonIsLinux, NotUserNamespace) - - file := "/sys/fs/cgroup/devices/devices.list" - out, _ := dockerCmd(c, "run", "--privileged", "busybox", "cat", file) - c.Logf("out: %q", out) - c.Assert(strings.TrimSpace(out), checker.Equals, "a *:* rwm") -} - -func (s *DockerSuite) TestRunUserDeviceAllowed(c *check.C) { - testRequires(c, DaemonIsLinux) - - fi, err := os.Stat("/dev/snd/timer") - if err != nil { - c.Skip("Host does not have /dev/snd/timer") - } - stat, ok := fi.Sys().(*syscall.Stat_t) - if !ok { - c.Skip("Could not stat /dev/snd/timer") - } - - file := "/sys/fs/cgroup/devices/devices.list" - out, _ := dockerCmd(c, "run", "--device", "/dev/snd/timer:w", "busybox", "cat", file) - c.Assert(out, checker.Contains, fmt.Sprintf("c %d:%d w", stat.Rdev/256, stat.Rdev%256)) -} - -func (s *DockerDaemonSuite) TestRunSeccompJSONNewFormat(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled) - - err := s.d.StartWithBusybox() - c.Assert(err, check.IsNil) - - jsonData := `{ - "defaultAction": "SCMP_ACT_ALLOW", - "syscalls": [ - { - "names": ["chmod", "fchmod", "fchmodat"], - "action": "SCMP_ACT_ERRNO" - } - ] -}` - tmpFile, err := ioutil.TempFile("", "profile.json") - c.Assert(err, check.IsNil) - defer tmpFile.Close() - _, err = tmpFile.Write([]byte(jsonData)) - c.Assert(err, check.IsNil) - - out, err := s.d.Cmd("run", "--security-opt", "seccomp="+tmpFile.Name(), "busybox", "chmod", "777", ".") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, "Operation not permitted") -} - -func (s *DockerDaemonSuite) TestRunSeccompJSONNoNameAndNames(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled) - - err := s.d.StartWithBusybox() - c.Assert(err, check.IsNil) - - jsonData := `{ - "defaultAction": "SCMP_ACT_ALLOW", - "syscalls": [ - { - "name": "chmod", - "names": ["fchmod", "fchmodat"], - "action": "SCMP_ACT_ERRNO" - } - ] -}` - tmpFile, err := ioutil.TempFile("", "profile.json") - c.Assert(err, check.IsNil) - defer tmpFile.Close() - _, err = tmpFile.Write([]byte(jsonData)) - c.Assert(err, check.IsNil) - - out, err := s.d.Cmd("run", "--security-opt", "seccomp="+tmpFile.Name(), "busybox", "chmod", "777", ".") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, "'name' and 'names' were specified in the seccomp profile, use either 'name' or 'names'") -} - -func (s *DockerDaemonSuite) TestRunSeccompJSONNoArchAndArchMap(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled) - - err := s.d.StartWithBusybox() - c.Assert(err, check.IsNil) - - jsonData := `{ - "archMap": [ - { - "architecture": "SCMP_ARCH_X86_64", - "subArchitectures": [ - "SCMP_ARCH_X86", - "SCMP_ARCH_X32" - ] - } - ], - "architectures": [ - "SCMP_ARCH_X32" - ], - "defaultAction": "SCMP_ACT_ALLOW", - "syscalls": [ - { - "names": ["chmod", "fchmod", "fchmodat"], - "action": "SCMP_ACT_ERRNO" - } - ] -}` - tmpFile, err := ioutil.TempFile("", "profile.json") - c.Assert(err, check.IsNil) - defer tmpFile.Close() - _, err = tmpFile.Write([]byte(jsonData)) - c.Assert(err, check.IsNil) - - out, err := s.d.Cmd("run", "--security-opt", "seccomp="+tmpFile.Name(), "busybox", "chmod", "777", ".") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, "'architectures' and 'archMap' were specified in the seccomp profile, use either 'architectures' or 'archMap'") -} - -func (s *DockerDaemonSuite) TestRunWithDaemonDefaultSeccompProfile(c *check.C) { - testRequires(c, SameHostDaemon, seccompEnabled) - - err := s.d.StartWithBusybox() - c.Assert(err, check.IsNil) - - // 1) verify I can run containers with the Docker default shipped profile which allows chmod - _, err = s.d.Cmd("run", "busybox", "chmod", "777", ".") - c.Assert(err, check.IsNil) - - jsonData := `{ - "defaultAction": "SCMP_ACT_ALLOW", - "syscalls": [ - { - "name": "chmod", - "action": "SCMP_ACT_ERRNO" - } - ] -}` - tmpFile, err := ioutil.TempFile("", "profile.json") - c.Assert(err, check.IsNil) - defer tmpFile.Close() - _, err = tmpFile.Write([]byte(jsonData)) - c.Assert(err, check.IsNil) - - // 2) restart the daemon and add a custom seccomp profile in which we deny chmod - err = s.d.Restart("--seccomp-profile=" + tmpFile.Name()) - c.Assert(err, check.IsNil) - - out, err := s.d.Cmd("run", "busybox", "chmod", "777", ".") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, "Operation not permitted") -} - -func (s *DockerSuite) TestRunWithNanoCPUs(c *check.C) { - testRequires(c, cpuCfsQuota, cpuCfsPeriod) - - file1 := "/sys/fs/cgroup/cpu/cpu.cfs_quota_us" - file2 := "/sys/fs/cgroup/cpu/cpu.cfs_period_us" - out, _ := dockerCmd(c, "run", "--cpus", "0.5", "--name", "test", "busybox", "sh", "-c", fmt.Sprintf("cat %s && cat %s", file1, file2)) - c.Assert(strings.TrimSpace(out), checker.Equals, "50000\n100000") - - out = inspectField(c, "test", "HostConfig.NanoCpus") - c.Assert(out, checker.Equals, "5e+08", check.Commentf("setting the Nano CPUs failed")) - out = inspectField(c, "test", "HostConfig.CpuQuota") - c.Assert(out, checker.Equals, "0", check.Commentf("CPU CFS quota should be 0")) - out = inspectField(c, "test", "HostConfig.CpuPeriod") - c.Assert(out, checker.Equals, "0", check.Commentf("CPU CFS period should be 0")) - - out, _, err := dockerCmdWithError("run", "--cpus", "0.5", "--cpu-quota", "50000", "--cpu-period", "100000", "busybox", "sh") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, "Conflicting options: Nano CPUs and CPU Period cannot both be set") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_test.go deleted file mode 100644 index 70139a59b..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_test.go +++ /dev/null @@ -1,383 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "reflect" - "regexp" - "sort" - "strings" - "time" - - "github.com/docker/distribution/digest" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// save a repo using gz compression and try to load it using stdout -func (s *DockerSuite) TestSaveXzAndLoadRepoStdout(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "test-save-xz-and-load-repo-stdout" - dockerCmd(c, "run", "--name", name, "busybox", "true") - - repoName := "foobar-save-load-test-xz-gz" - out, _ := dockerCmd(c, "commit", name, repoName) - - dockerCmd(c, "inspect", repoName) - - repoTarball, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "save", repoName), - exec.Command("xz", "-c"), - exec.Command("gzip", "-c")) - c.Assert(err, checker.IsNil, check.Commentf("failed to save repo: %v %v", out, err)) - deleteImages(repoName) - - loadCmd := exec.Command(dockerBinary, "load") - loadCmd.Stdin = strings.NewReader(repoTarball) - out, _, err = runCommandWithOutput(loadCmd) - c.Assert(err, checker.NotNil, check.Commentf("expected error, but succeeded with no error and output: %v", out)) - - after, _, err := dockerCmdWithError("inspect", repoName) - c.Assert(err, checker.NotNil, check.Commentf("the repo should not exist: %v", after)) -} - -// save a repo using xz+gz compression and try to load it using stdout -func (s *DockerSuite) TestSaveXzGzAndLoadRepoStdout(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "test-save-xz-gz-and-load-repo-stdout" - dockerCmd(c, "run", "--name", name, "busybox", "true") - - repoName := "foobar-save-load-test-xz-gz" - dockerCmd(c, "commit", name, repoName) - - dockerCmd(c, "inspect", repoName) - - out, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "save", repoName), - exec.Command("xz", "-c"), - exec.Command("gzip", "-c")) - c.Assert(err, checker.IsNil, check.Commentf("failed to save repo: %v %v", out, err)) - - deleteImages(repoName) - - loadCmd := exec.Command(dockerBinary, "load") - loadCmd.Stdin = strings.NewReader(out) - out, _, err = runCommandWithOutput(loadCmd) - c.Assert(err, checker.NotNil, check.Commentf("expected error, but succeeded with no error and output: %v", out)) - - after, _, err := dockerCmdWithError("inspect", repoName) - c.Assert(err, checker.NotNil, check.Commentf("the repo should not exist: %v", after)) -} - -func (s *DockerSuite) TestSaveSingleTag(c *check.C) { - testRequires(c, DaemonIsLinux) - repoName := "foobar-save-single-tag-test" - dockerCmd(c, "tag", "busybox:latest", fmt.Sprintf("%v:latest", repoName)) - - out, _ := dockerCmd(c, "images", "-q", "--no-trunc", repoName) - cleanedImageID := strings.TrimSpace(out) - - out, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "save", fmt.Sprintf("%v:latest", repoName)), - exec.Command("tar", "t"), - exec.Command("grep", "-E", fmt.Sprintf("(^repositories$|%v)", cleanedImageID))) - c.Assert(err, checker.IsNil, check.Commentf("failed to save repo with image ID and 'repositories' file: %s, %v", out, err)) -} - -func (s *DockerSuite) TestSaveCheckTimes(c *check.C) { - testRequires(c, DaemonIsLinux) - repoName := "busybox:latest" - out, _ := dockerCmd(c, "inspect", repoName) - data := []struct { - ID string - Created time.Time - }{} - err := json.Unmarshal([]byte(out), &data) - c.Assert(err, checker.IsNil, check.Commentf("failed to marshal from %q: err %v", repoName, err)) - c.Assert(len(data), checker.Not(checker.Equals), 0, check.Commentf("failed to marshal the data from %q", repoName)) - tarTvTimeFormat := "2006-01-02 15:04" - out, _, err = runCommandPipelineWithOutput( - exec.Command(dockerBinary, "save", repoName), - exec.Command("tar", "tv"), - exec.Command("grep", "-E", fmt.Sprintf("%s %s", data[0].Created.Format(tarTvTimeFormat), digest.Digest(data[0].ID).Hex()))) - c.Assert(err, checker.IsNil, check.Commentf("failed to save repo with image ID and 'repositories' file: %s, %v", out, err)) -} - -func (s *DockerSuite) TestSaveImageId(c *check.C) { - testRequires(c, DaemonIsLinux) - repoName := "foobar-save-image-id-test" - dockerCmd(c, "tag", "emptyfs:latest", fmt.Sprintf("%v:latest", repoName)) - - out, _ := dockerCmd(c, "images", "-q", "--no-trunc", repoName) - cleanedLongImageID := strings.TrimPrefix(strings.TrimSpace(out), "sha256:") - - out, _ = dockerCmd(c, "images", "-q", repoName) - cleanedShortImageID := strings.TrimSpace(out) - - // Make sure IDs are not empty - c.Assert(cleanedLongImageID, checker.Not(check.Equals), "", check.Commentf("Id should not be empty.")) - c.Assert(cleanedShortImageID, checker.Not(check.Equals), "", check.Commentf("Id should not be empty.")) - - saveCmd := exec.Command(dockerBinary, "save", cleanedShortImageID) - tarCmd := exec.Command("tar", "t") - - var err error - tarCmd.Stdin, err = saveCmd.StdoutPipe() - c.Assert(err, checker.IsNil, check.Commentf("cannot set stdout pipe for tar: %v", err)) - grepCmd := exec.Command("grep", cleanedLongImageID) - grepCmd.Stdin, err = tarCmd.StdoutPipe() - c.Assert(err, checker.IsNil, check.Commentf("cannot set stdout pipe for grep: %v", err)) - - c.Assert(tarCmd.Start(), checker.IsNil, check.Commentf("tar failed with error: %v", err)) - c.Assert(saveCmd.Start(), checker.IsNil, check.Commentf("docker save failed with error: %v", err)) - defer func() { - saveCmd.Wait() - tarCmd.Wait() - dockerCmd(c, "rmi", repoName) - }() - - out, _, err = runCommandWithOutput(grepCmd) - - c.Assert(err, checker.IsNil, check.Commentf("failed to save repo with image ID: %s, %v", out, err)) -} - -// save a repo and try to load it using flags -func (s *DockerSuite) TestSaveAndLoadRepoFlags(c *check.C) { - testRequires(c, DaemonIsLinux) - name := "test-save-and-load-repo-flags" - dockerCmd(c, "run", "--name", name, "busybox", "true") - - repoName := "foobar-save-load-test" - - deleteImages(repoName) - dockerCmd(c, "commit", name, repoName) - - before, _ := dockerCmd(c, "inspect", repoName) - - out, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "save", repoName), - exec.Command(dockerBinary, "load")) - c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err)) - - after, _ := dockerCmd(c, "inspect", repoName) - c.Assert(before, checker.Equals, after, check.Commentf("inspect is not the same after a save / load")) -} - -func (s *DockerSuite) TestSaveWithNoExistImage(c *check.C) { - testRequires(c, DaemonIsLinux) - - imgName := "foobar-non-existing-image" - - out, _, err := dockerCmdWithError("save", "-o", "test-img.tar", imgName) - c.Assert(err, checker.NotNil, check.Commentf("save image should fail for non-existing image")) - c.Assert(out, checker.Contains, fmt.Sprintf("No such image: %s", imgName)) -} - -func (s *DockerSuite) TestSaveMultipleNames(c *check.C) { - testRequires(c, DaemonIsLinux) - repoName := "foobar-save-multi-name-test" - - // Make one image - dockerCmd(c, "tag", "emptyfs:latest", fmt.Sprintf("%v-one:latest", repoName)) - - // Make two images - dockerCmd(c, "tag", "emptyfs:latest", fmt.Sprintf("%v-two:latest", repoName)) - - out, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "save", fmt.Sprintf("%v-one", repoName), fmt.Sprintf("%v-two:latest", repoName)), - exec.Command("tar", "xO", "repositories"), - exec.Command("grep", "-q", "-E", "(-one|-two)"), - ) - c.Assert(err, checker.IsNil, check.Commentf("failed to save multiple repos: %s, %v", out, err)) -} - -func (s *DockerSuite) TestSaveRepoWithMultipleImages(c *check.C) { - testRequires(c, DaemonIsLinux) - makeImage := func(from string, tag string) string { - var ( - out string - ) - out, _ = dockerCmd(c, "run", "-d", from, "true") - cleanedContainerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "commit", cleanedContainerID, tag) - imageID := strings.TrimSpace(out) - return imageID - } - - repoName := "foobar-save-multi-images-test" - tagFoo := repoName + ":foo" - tagBar := repoName + ":bar" - - idFoo := makeImage("busybox:latest", tagFoo) - idBar := makeImage("busybox:latest", tagBar) - - deleteImages(repoName) - - // create the archive - out, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "save", repoName, "busybox:latest"), - exec.Command("tar", "t")) - c.Assert(err, checker.IsNil, check.Commentf("failed to save multiple images: %s, %v", out, err)) - - lines := strings.Split(strings.TrimSpace(out), "\n") - var actual []string - for _, l := range lines { - if regexp.MustCompile("^[a-f0-9]{64}\\.json$").Match([]byte(l)) { - actual = append(actual, strings.TrimSuffix(l, ".json")) - } - } - - // make the list of expected layers - out = inspectField(c, "busybox:latest", "Id") - expected := []string{strings.TrimSpace(out), idFoo, idBar} - - // prefixes are not in tar - for i := range expected { - expected[i] = digest.Digest(expected[i]).Hex() - } - - sort.Strings(actual) - sort.Strings(expected) - c.Assert(actual, checker.DeepEquals, expected, check.Commentf("archive does not contains the right layers: got %v, expected %v, output: %q", actual, expected, out)) -} - -// Issue #6722 #5892 ensure directories are included in changes -func (s *DockerSuite) TestSaveDirectoryPermissions(c *check.C) { - testRequires(c, DaemonIsLinux) - layerEntries := []string{"opt/", "opt/a/", "opt/a/b/", "opt/a/b/c"} - layerEntriesAUFS := []string{"./", ".wh..wh.aufs", ".wh..wh.orph/", ".wh..wh.plnk/", "opt/", "opt/a/", "opt/a/b/", "opt/a/b/c"} - - name := "save-directory-permissions" - tmpDir, err := ioutil.TempDir("", "save-layers-with-directories") - c.Assert(err, checker.IsNil, check.Commentf("failed to create temporary directory: %s", err)) - extractionDirectory := filepath.Join(tmpDir, "image-extraction-dir") - os.Mkdir(extractionDirectory, 0777) - - defer os.RemoveAll(tmpDir) - _, err = buildImage(name, - `FROM busybox - RUN adduser -D user && mkdir -p /opt/a/b && chown -R user:user /opt/a - RUN touch /opt/a/b/c && chown user:user /opt/a/b/c`, - true) - c.Assert(err, checker.IsNil, check.Commentf("%v", err)) - - out, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "save", name), - exec.Command("tar", "-xf", "-", "-C", extractionDirectory), - ) - c.Assert(err, checker.IsNil, check.Commentf("failed to save and extract image: %s", out)) - - dirs, err := ioutil.ReadDir(extractionDirectory) - c.Assert(err, checker.IsNil, check.Commentf("failed to get a listing of the layer directories: %s", err)) - - found := false - for _, entry := range dirs { - var entriesSansDev []string - if entry.IsDir() { - layerPath := filepath.Join(extractionDirectory, entry.Name(), "layer.tar") - - f, err := os.Open(layerPath) - c.Assert(err, checker.IsNil, check.Commentf("failed to open %s: %s", layerPath, err)) - defer f.Close() - - entries, err := listTar(f) - for _, e := range entries { - if !strings.Contains(e, "dev/") { - entriesSansDev = append(entriesSansDev, e) - } - } - c.Assert(err, checker.IsNil, check.Commentf("encountered error while listing tar entries: %s", err)) - - if reflect.DeepEqual(entriesSansDev, layerEntries) || reflect.DeepEqual(entriesSansDev, layerEntriesAUFS) { - found = true - break - } - } - } - - c.Assert(found, checker.Equals, true, check.Commentf("failed to find the layer with the right content listing")) - -} - -// Test loading a weird image where one of the layers is of zero size. -// The layer.tar file is actually zero bytes, no padding or anything else. -// See issue: 18170 -func (s *DockerSuite) TestLoadZeroSizeLayer(c *check.C) { - testRequires(c, DaemonIsLinux) - - dockerCmd(c, "load", "-i", "fixtures/load/emptyLayer.tar") -} - -func (s *DockerSuite) TestSaveLoadParents(c *check.C) { - testRequires(c, DaemonIsLinux) - - makeImage := func(from string, addfile string) string { - var ( - out string - ) - out, _ = dockerCmd(c, "run", "-d", from, "touch", addfile) - cleanedContainerID := strings.TrimSpace(out) - - out, _ = dockerCmd(c, "commit", cleanedContainerID) - imageID := strings.TrimSpace(out) - - dockerCmd(c, "rm", "-f", cleanedContainerID) - return imageID - } - - idFoo := makeImage("busybox", "foo") - idBar := makeImage(idFoo, "bar") - - tmpDir, err := ioutil.TempDir("", "save-load-parents") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(tmpDir) - - c.Log("tmpdir", tmpDir) - - outfile := filepath.Join(tmpDir, "out.tar") - - dockerCmd(c, "save", "-o", outfile, idBar, idFoo) - dockerCmd(c, "rmi", idBar) - dockerCmd(c, "load", "-i", outfile) - - inspectOut := inspectField(c, idBar, "Parent") - c.Assert(inspectOut, checker.Equals, idFoo) - - inspectOut = inspectField(c, idFoo, "Parent") - c.Assert(inspectOut, checker.Equals, "") -} - -func (s *DockerSuite) TestSaveLoadNoTag(c *check.C) { - testRequires(c, DaemonIsLinux) - - name := "saveloadnotag" - - _, err := buildImage(name, "FROM busybox\nENV foo=bar", true) - c.Assert(err, checker.IsNil, check.Commentf("%v", err)) - - id := inspectField(c, name, "Id") - - // Test to make sure that save w/o name just shows imageID during load - out, _, err := runCommandPipelineWithOutput( - exec.Command(dockerBinary, "save", id), - exec.Command(dockerBinary, "load")) - c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err)) - - // Should not show 'name' but should show the image ID during the load - c.Assert(out, checker.Not(checker.Contains), "Loaded image: ") - c.Assert(out, checker.Contains, "Loaded image ID:") - c.Assert(out, checker.Contains, id) - - // Test to make sure that save by name shows that name during load - out, _, err = runCommandPipelineWithOutput( - exec.Command(dockerBinary, "save", name), - exec.Command(dockerBinary, "load")) - c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err)) - c.Assert(out, checker.Contains, "Loaded image: "+name+":latest") - c.Assert(out, checker.Not(checker.Contains), "Loaded image ID:") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_unix_test.go deleted file mode 100644 index 22445e5bb..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_unix_test.go +++ /dev/null @@ -1,109 +0,0 @@ -// +build !windows - -package main - -import ( - "context" - "fmt" - "io/ioutil" - "os" - "os/exec" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" - "github.com/kr/pty" -) - -// save a repo and try to load it using stdout -func (s *DockerSuite) TestSaveAndLoadRepoStdout(c *check.C) { - name := "test-save-and-load-repo-stdout" - dockerCmd(c, "run", "--name", name, "busybox", "true") - - repoName := "foobar-save-load-test" - before, _ := dockerCmd(c, "commit", name, repoName) - before = strings.TrimRight(before, "\n") - - tmpFile, err := ioutil.TempFile("", "foobar-save-load-test.tar") - c.Assert(err, check.IsNil) - defer os.Remove(tmpFile.Name()) - - saveCmd := exec.Command(dockerBinary, "save", repoName) - saveCmd.Stdout = tmpFile - - _, err = runCommand(saveCmd) - c.Assert(err, check.IsNil) - - tmpFile, err = os.Open(tmpFile.Name()) - c.Assert(err, check.IsNil) - defer tmpFile.Close() - - deleteImages(repoName) - - loadCmd := exec.Command(dockerBinary, "load") - loadCmd.Stdin = tmpFile - - out, _, err := runCommandWithOutput(loadCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - - after := inspectField(c, repoName, "Id") - after = strings.TrimRight(after, "\n") - - c.Assert(after, check.Equals, before) //inspect is not the same after a save / load - - deleteImages(repoName) - - pty, tty, err := pty.Open() - c.Assert(err, check.IsNil) - cmd := exec.Command(dockerBinary, "save", repoName) - cmd.Stdin = tty - cmd.Stdout = tty - cmd.Stderr = tty - c.Assert(cmd.Start(), check.IsNil) - c.Assert(cmd.Wait(), check.NotNil) //did not break writing to a TTY - - buf := make([]byte, 1024) - - n, err := pty.Read(buf) - c.Assert(err, check.IsNil) //could not read tty output - c.Assert(string(buf[:n]), checker.Contains, "Cowardly refusing", check.Commentf("help output is not being yielded", out)) -} - -func (s *DockerSuite) TestSaveAndLoadWithProgressBar(c *check.C) { - name := "test-load" - _, err := buildImage(name, ` - FROM busybox - RUN touch aa - `, true) - c.Assert(err, check.IsNil) - - tmptar := name + ".tar" - dockerCmd(c, "save", "-o", tmptar, name) - defer os.Remove(tmptar) - - dockerCmd(c, "rmi", name) - dockerCmd(c, "tag", "busybox", name) - out, _ := dockerCmd(c, "load", "-i", tmptar) - expected := fmt.Sprintf("The image %s:latest already exists, renaming the old one with ID", name) - c.Assert(out, checker.Contains, expected) -} - -// fail because load didn't receive data from stdin -func (s *DockerSuite) TestLoadNoStdinFail(c *check.C) { - pty, tty, err := pty.Open() - c.Assert(err, check.IsNil) - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - cmd := exec.CommandContext(ctx, dockerBinary, "load") - cmd.Stdin = tty - cmd.Stdout = tty - cmd.Stderr = tty - c.Assert(cmd.Run(), check.NotNil) // docker-load should fail - - buf := make([]byte, 1024) - - n, err := pty.Read(buf) - c.Assert(err, check.IsNil) //could not read tty output - c.Assert(string(buf[:n]), checker.Contains, "requested load from stdin, but stdin is empty") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_search_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_search_test.go deleted file mode 100644 index 5a32f2ab9..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_search_test.go +++ /dev/null @@ -1,131 +0,0 @@ -package main - -import ( - "fmt" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// search for repos named "registry" on the central registry -func (s *DockerSuite) TestSearchOnCentralRegistry(c *check.C) { - testRequires(c, Network, DaemonIsLinux) - - out, _ := dockerCmd(c, "search", "busybox") - c.Assert(out, checker.Contains, "Busybox base image.", check.Commentf("couldn't find any repository named (or containing) 'Busybox base image.'")) -} - -func (s *DockerSuite) TestSearchStarsOptionWithWrongParameter(c *check.C) { - out, _, err := dockerCmdWithError("search", "--filter", "stars=a", "busybox") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Invalid filter", check.Commentf("couldn't find the invalid filter warning")) - - out, _, err = dockerCmdWithError("search", "-f", "stars=a", "busybox") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Invalid filter", check.Commentf("couldn't find the invalid filter warning")) - - out, _, err = dockerCmdWithError("search", "-f", "is-automated=a", "busybox") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Invalid filter", check.Commentf("couldn't find the invalid filter warning")) - - out, _, err = dockerCmdWithError("search", "-f", "is-official=a", "busybox") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Invalid filter", check.Commentf("couldn't find the invalid filter warning")) - - // -s --stars deprecated since Docker 1.13 - out, _, err = dockerCmdWithError("search", "--stars=a", "busybox") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "invalid syntax", check.Commentf("couldn't find the invalid value warning")) - - // -s --stars deprecated since Docker 1.13 - out, _, err = dockerCmdWithError("search", "-s=-1", "busybox") - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "invalid syntax", check.Commentf("couldn't find the invalid value warning")) -} - -func (s *DockerSuite) TestSearchCmdOptions(c *check.C) { - testRequires(c, Network, DaemonIsLinux) - - out, _ := dockerCmd(c, "search", "--help") - c.Assert(out, checker.Contains, "Usage:\tdocker search [OPTIONS] TERM") - - outSearchCmd, _ := dockerCmd(c, "search", "busybox") - outSearchCmdNotrunc, _ := dockerCmd(c, "search", "--no-trunc=true", "busybox") - - c.Assert(len(outSearchCmd) > len(outSearchCmdNotrunc), check.Equals, false, check.Commentf("The no-trunc option can't take effect.")) - - outSearchCmdautomated, _ := dockerCmd(c, "search", "--filter", "is-automated=true", "busybox") //The busybox is a busybox base image, not an AUTOMATED image. - outSearchCmdautomatedSlice := strings.Split(outSearchCmdautomated, "\n") - for i := range outSearchCmdautomatedSlice { - c.Assert(strings.HasPrefix(outSearchCmdautomatedSlice[i], "busybox "), check.Equals, false, check.Commentf("The busybox is not an AUTOMATED image: %s", outSearchCmdautomated)) - } - - outSearchCmdNotOfficial, _ := dockerCmd(c, "search", "--filter", "is-official=false", "busybox") //The busybox is a busybox base image, official image. - outSearchCmdNotOfficialSlice := strings.Split(outSearchCmdNotOfficial, "\n") - for i := range outSearchCmdNotOfficialSlice { - c.Assert(strings.HasPrefix(outSearchCmdNotOfficialSlice[i], "busybox "), check.Equals, false, check.Commentf("The busybox is not an OFFICIAL image: %s", outSearchCmdNotOfficial)) - } - - outSearchCmdOfficial, _ := dockerCmd(c, "search", "--filter", "is-official=true", "busybox") //The busybox is a busybox base image, official image. - outSearchCmdOfficialSlice := strings.Split(outSearchCmdOfficial, "\n") - c.Assert(outSearchCmdOfficialSlice, checker.HasLen, 3) // 1 header, 1 line, 1 carriage return - c.Assert(strings.HasPrefix(outSearchCmdOfficialSlice[1], "busybox "), check.Equals, true, check.Commentf("The busybox is an OFFICIAL image: %s", outSearchCmdNotOfficial)) - - outSearchCmdStars, _ := dockerCmd(c, "search", "--filter", "stars=2", "busybox") - c.Assert(strings.Count(outSearchCmdStars, "[OK]") > strings.Count(outSearchCmd, "[OK]"), check.Equals, false, check.Commentf("The quantity of images with stars should be less than that of all images: %s", outSearchCmdStars)) - - dockerCmd(c, "search", "--filter", "is-automated=true", "--filter", "stars=2", "--no-trunc=true", "busybox") - - // --automated deprecated since Docker 1.13 - outSearchCmdautomated1, _ := dockerCmd(c, "search", "--automated=true", "busybox") //The busybox is a busybox base image, not an AUTOMATED image. - outSearchCmdautomatedSlice1 := strings.Split(outSearchCmdautomated1, "\n") - for i := range outSearchCmdautomatedSlice1 { - c.Assert(strings.HasPrefix(outSearchCmdautomatedSlice1[i], "busybox "), check.Equals, false, check.Commentf("The busybox is not an AUTOMATED image: %s", outSearchCmdautomated)) - } - - // -s --stars deprecated since Docker 1.13 - outSearchCmdStars1, _ := dockerCmd(c, "search", "--stars=2", "busybox") - c.Assert(strings.Count(outSearchCmdStars1, "[OK]") > strings.Count(outSearchCmd, "[OK]"), check.Equals, false, check.Commentf("The quantity of images with stars should be less than that of all images: %s", outSearchCmdStars1)) - - // -s --stars deprecated since Docker 1.13 - dockerCmd(c, "search", "--stars=2", "--automated=true", "--no-trunc=true", "busybox") -} - -// search for repos which start with "ubuntu-" on the central registry -func (s *DockerSuite) TestSearchOnCentralRegistryWithDash(c *check.C) { - testRequires(c, Network, DaemonIsLinux) - - dockerCmd(c, "search", "ubuntu-") -} - -// test case for #23055 -func (s *DockerSuite) TestSearchWithLimit(c *check.C) { - testRequires(c, Network, DaemonIsLinux) - - limit := 10 - out, _, err := dockerCmdWithError("search", fmt.Sprintf("--limit=%d", limit), "docker") - c.Assert(err, checker.IsNil) - outSlice := strings.Split(out, "\n") - c.Assert(outSlice, checker.HasLen, limit+2) // 1 header, 1 carriage return - - limit = 50 - out, _, err = dockerCmdWithError("search", fmt.Sprintf("--limit=%d", limit), "docker") - c.Assert(err, checker.IsNil) - outSlice = strings.Split(out, "\n") - c.Assert(outSlice, checker.HasLen, limit+2) // 1 header, 1 carriage return - - limit = 100 - out, _, err = dockerCmdWithError("search", fmt.Sprintf("--limit=%d", limit), "docker") - c.Assert(err, checker.IsNil) - outSlice = strings.Split(out, "\n") - c.Assert(outSlice, checker.HasLen, limit+2) // 1 header, 1 carriage return - - limit = 0 - out, _, err = dockerCmdWithError("search", fmt.Sprintf("--limit=%d", limit), "docker") - c.Assert(err, checker.Not(checker.IsNil)) - - limit = 200 - out, _, err = dockerCmdWithError("search", fmt.Sprintf("--limit=%d", limit), "docker") - c.Assert(err, checker.Not(checker.IsNil)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_create_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_create_test.go deleted file mode 100644 index b79fdbeb5..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_create_test.go +++ /dev/null @@ -1,131 +0,0 @@ -// +build !windows - -package main - -import ( - "io/ioutil" - "os" - "strings" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSwarmSuite) TestSecretCreate(c *check.C) { - d := s.AddDaemon(c, true, true) - - testName := "test_secret" - id := d.createSecret(c, swarm.SecretSpec{ - swarm.Annotations{ - Name: testName, - }, - []byte("TESTINGDATA"), - }) - c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) - - secret := d.getSecret(c, id) - c.Assert(secret.Spec.Name, checker.Equals, testName) -} - -func (s *DockerSwarmSuite) TestSecretCreateWithLabels(c *check.C) { - d := s.AddDaemon(c, true, true) - - testName := "test_secret" - id := d.createSecret(c, swarm.SecretSpec{ - swarm.Annotations{ - Name: testName, - Labels: map[string]string{ - "key1": "value1", - "key2": "value2", - }, - }, - []byte("TESTINGDATA"), - }) - c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) - - secret := d.getSecret(c, id) - c.Assert(secret.Spec.Name, checker.Equals, testName) - c.Assert(len(secret.Spec.Labels), checker.Equals, 2) - c.Assert(secret.Spec.Labels["key1"], checker.Equals, "value1") - c.Assert(secret.Spec.Labels["key2"], checker.Equals, "value2") -} - -// Test case for 28884 -func (s *DockerSwarmSuite) TestSecretCreateResolve(c *check.C) { - d := s.AddDaemon(c, true, true) - - name := "foo" - id := d.createSecret(c, swarm.SecretSpec{ - swarm.Annotations{ - Name: name, - }, - []byte("foo"), - }) - c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) - - fake := d.createSecret(c, swarm.SecretSpec{ - swarm.Annotations{ - Name: id, - }, - []byte("fake foo"), - }) - c.Assert(fake, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", fake)) - - out, err := d.Cmd("secret", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name) - c.Assert(out, checker.Contains, fake) - - out, err = d.Cmd("secret", "rm", id) - c.Assert(out, checker.Contains, id) - - // Fake one will remain - out, err = d.Cmd("secret", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), name) - c.Assert(out, checker.Contains, fake) - - // Remove based on name prefix of the fake one - // (which is the same as the ID of foo one) should not work - // as search is only done based on: - // - Full ID - // - Full Name - // - Partial ID (prefix) - out, err = d.Cmd("secret", "rm", id[:5]) - c.Assert(out, checker.Not(checker.Contains), id) - out, err = d.Cmd("secret", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), name) - c.Assert(out, checker.Contains, fake) - - // Remove based on ID prefix of the fake one should succeed - out, err = d.Cmd("secret", "rm", fake[:5]) - c.Assert(out, checker.Contains, fake) - out, err = d.Cmd("secret", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), name) - c.Assert(out, checker.Not(checker.Contains), id) - c.Assert(out, checker.Not(checker.Contains), fake) -} - -func (s *DockerSwarmSuite) TestSecretCreateWithFile(c *check.C) { - d := s.AddDaemon(c, true, true) - - testFile, err := ioutil.TempFile("", "secretCreateTest") - c.Assert(err, checker.IsNil, check.Commentf("failed to create temporary file")) - defer os.Remove(testFile.Name()) - - testData := "TESTINGDATA" - _, err = testFile.Write([]byte(testData)) - c.Assert(err, checker.IsNil, check.Commentf("failed to write to temporary file")) - - testName := "test_secret" - out, err := d.Cmd("secret", "create", testName, testFile.Name()) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "", check.Commentf(out)) - - id := strings.TrimSpace(out) - secret := d.getSecret(c, id) - c.Assert(secret.Spec.Name, checker.Equals, testName) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_inspect_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_inspect_test.go deleted file mode 100644 index 0985a2bd5..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_inspect_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSwarmSuite) TestSecretInspect(c *check.C) { - d := s.AddDaemon(c, true, true) - - testName := "test_secret" - id := d.createSecret(c, swarm.SecretSpec{ - swarm.Annotations{ - Name: testName, - }, - []byte("TESTINGDATA"), - }) - c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) - - secret := d.getSecret(c, id) - c.Assert(secret.Spec.Name, checker.Equals, testName) - - out, err := d.Cmd("secret", "inspect", testName) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - var secrets []swarm.Secret - c.Assert(json.Unmarshal([]byte(out), &secrets), checker.IsNil) - c.Assert(secrets, checker.HasLen, 1) -} - -func (s *DockerSwarmSuite) TestSecretInspectMultiple(c *check.C) { - d := s.AddDaemon(c, true, true) - - testNames := []string{ - "test0", - "test1", - } - for _, n := range testNames { - id := d.createSecret(c, swarm.SecretSpec{ - swarm.Annotations{ - Name: n, - }, - []byte("TESTINGDATA"), - }) - c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) - - secret := d.getSecret(c, id) - c.Assert(secret.Spec.Name, checker.Equals, n) - - } - - args := []string{ - "secret", - "inspect", - } - args = append(args, testNames...) - out, err := d.Cmd(args...) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - var secrets []swarm.Secret - c.Assert(json.Unmarshal([]byte(out), &secrets), checker.IsNil) - c.Assert(secrets, checker.HasLen, 2) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_create_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_create_test.go deleted file mode 100644 index 9e8b1e995..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_create_test.go +++ /dev/null @@ -1,175 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - "fmt" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSwarmSuite) TestServiceCreateMountVolume(c *check.C) { - d := s.AddDaemon(c, true, true) - out, err := d.Cmd("service", "create", "--mount", "type=volume,source=foo,target=/foo,volume-nocopy", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - id := strings.TrimSpace(out) - - var tasks []swarm.Task - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - tasks = d.getServiceTasks(c, id) - return len(tasks) > 0, nil - }, checker.Equals, true) - - task := tasks[0] - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - if task.NodeID == "" || task.Status.ContainerStatus.ContainerID == "" { - task = d.getTask(c, task.ID) - } - return task.NodeID != "" && task.Status.ContainerStatus.ContainerID != "", nil - }, checker.Equals, true) - - // check container mount config - out, err = s.nodeCmd(c, task.NodeID, "inspect", "--format", "{{json .HostConfig.Mounts}}", task.Status.ContainerStatus.ContainerID) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - var mountConfig []mount.Mount - c.Assert(json.Unmarshal([]byte(out), &mountConfig), checker.IsNil) - c.Assert(mountConfig, checker.HasLen, 1) - - c.Assert(mountConfig[0].Source, checker.Equals, "foo") - c.Assert(mountConfig[0].Target, checker.Equals, "/foo") - c.Assert(mountConfig[0].Type, checker.Equals, mount.TypeVolume) - c.Assert(mountConfig[0].VolumeOptions, checker.NotNil) - c.Assert(mountConfig[0].VolumeOptions.NoCopy, checker.True) - - // check container mounts actual - out, err = s.nodeCmd(c, task.NodeID, "inspect", "--format", "{{json .Mounts}}", task.Status.ContainerStatus.ContainerID) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - var mounts []types.MountPoint - c.Assert(json.Unmarshal([]byte(out), &mounts), checker.IsNil) - c.Assert(mounts, checker.HasLen, 1) - - c.Assert(mounts[0].Type, checker.Equals, mount.TypeVolume) - c.Assert(mounts[0].Name, checker.Equals, "foo") - c.Assert(mounts[0].Destination, checker.Equals, "/foo") - c.Assert(mounts[0].RW, checker.Equals, true) -} - -func (s *DockerSwarmSuite) TestServiceCreateWithSecretSimple(c *check.C) { - d := s.AddDaemon(c, true, true) - - serviceName := "test-service-secret" - testName := "test_secret" - id := d.createSecret(c, swarm.SecretSpec{ - swarm.Annotations{ - Name: testName, - }, - []byte("TESTINGDATA"), - }) - c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) - - out, err := d.Cmd("service", "create", "--name", serviceName, "--secret", testName, "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = d.Cmd("service", "inspect", "--format", "{{ json .Spec.TaskTemplate.ContainerSpec.Secrets }}", serviceName) - c.Assert(err, checker.IsNil) - - var refs []swarm.SecretReference - c.Assert(json.Unmarshal([]byte(out), &refs), checker.IsNil) - c.Assert(refs, checker.HasLen, 1) - - c.Assert(refs[0].SecretName, checker.Equals, testName) - c.Assert(refs[0].File, checker.Not(checker.IsNil)) - c.Assert(refs[0].File.Name, checker.Equals, testName) - c.Assert(refs[0].File.UID, checker.Equals, "0") - c.Assert(refs[0].File.GID, checker.Equals, "0") -} - -func (s *DockerSwarmSuite) TestServiceCreateWithSecretSourceTarget(c *check.C) { - d := s.AddDaemon(c, true, true) - - serviceName := "test-service-secret" - testName := "test_secret" - id := d.createSecret(c, swarm.SecretSpec{ - swarm.Annotations{ - Name: testName, - }, - []byte("TESTINGDATA"), - }) - c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) - testTarget := "testing" - - out, err := d.Cmd("service", "create", "--name", serviceName, "--secret", fmt.Sprintf("source=%s,target=%s", testName, testTarget), "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = d.Cmd("service", "inspect", "--format", "{{ json .Spec.TaskTemplate.ContainerSpec.Secrets }}", serviceName) - c.Assert(err, checker.IsNil) - - var refs []swarm.SecretReference - c.Assert(json.Unmarshal([]byte(out), &refs), checker.IsNil) - c.Assert(refs, checker.HasLen, 1) - - c.Assert(refs[0].SecretName, checker.Equals, testName) - c.Assert(refs[0].File, checker.Not(checker.IsNil)) - c.Assert(refs[0].File.Name, checker.Equals, testTarget) -} - -func (s *DockerSwarmSuite) TestServiceCreateMountTmpfs(c *check.C) { - d := s.AddDaemon(c, true, true) - out, err := d.Cmd("service", "create", "--mount", "type=tmpfs,target=/foo,tmpfs-size=1MB", "busybox", "sh", "-c", "mount | grep foo; tail -f /dev/null") - c.Assert(err, checker.IsNil, check.Commentf(out)) - id := strings.TrimSpace(out) - - var tasks []swarm.Task - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - tasks = d.getServiceTasks(c, id) - return len(tasks) > 0, nil - }, checker.Equals, true) - - task := tasks[0] - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - if task.NodeID == "" || task.Status.ContainerStatus.ContainerID == "" { - task = d.getTask(c, task.ID) - } - return task.NodeID != "" && task.Status.ContainerStatus.ContainerID != "", nil - }, checker.Equals, true) - - // check container mount config - out, err = s.nodeCmd(c, task.NodeID, "inspect", "--format", "{{json .HostConfig.Mounts}}", task.Status.ContainerStatus.ContainerID) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - var mountConfig []mount.Mount - c.Assert(json.Unmarshal([]byte(out), &mountConfig), checker.IsNil) - c.Assert(mountConfig, checker.HasLen, 1) - - c.Assert(mountConfig[0].Source, checker.Equals, "") - c.Assert(mountConfig[0].Target, checker.Equals, "/foo") - c.Assert(mountConfig[0].Type, checker.Equals, mount.TypeTmpfs) - c.Assert(mountConfig[0].TmpfsOptions, checker.NotNil) - c.Assert(mountConfig[0].TmpfsOptions.SizeBytes, checker.Equals, int64(1048576)) - - // check container mounts actual - out, err = s.nodeCmd(c, task.NodeID, "inspect", "--format", "{{json .Mounts}}", task.Status.ContainerStatus.ContainerID) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - var mounts []types.MountPoint - c.Assert(json.Unmarshal([]byte(out), &mounts), checker.IsNil) - c.Assert(mounts, checker.HasLen, 1) - - c.Assert(mounts[0].Type, checker.Equals, mount.TypeTmpfs) - c.Assert(mounts[0].Name, checker.Equals, "") - c.Assert(mounts[0].Destination, checker.Equals, "/foo") - c.Assert(mounts[0].RW, checker.Equals, true) - - out, err = s.nodeCmd(c, task.NodeID, "logs", task.Status.ContainerStatus.ContainerID) - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.HasPrefix, "tmpfs on /foo type tmpfs") - c.Assert(strings.TrimSpace(out), checker.Contains, "size=1024k") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_health_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_health_test.go deleted file mode 100644 index 30580f6be..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_health_test.go +++ /dev/null @@ -1,191 +0,0 @@ -// +build !windows - -package main - -import ( - "strconv" - "strings" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/daemon/cluster/executor/container" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// start a service, and then make its task unhealthy during running -// finally, unhealthy task should be detected and killed -func (s *DockerSwarmSuite) TestServiceHealthRun(c *check.C) { - testRequires(c, DaemonIsLinux) // busybox doesn't work on Windows - - d := s.AddDaemon(c, true, true) - - // build image with health-check - // note: use `daemon.buildImageWithOut` to build, do not use `buildImage` to build - imageName := "testhealth" - _, _, err := d.buildImageWithOut(imageName, - `FROM busybox - RUN touch /status - HEALTHCHECK --interval=1s --timeout=1s --retries=1\ - CMD cat /status`, - true) - c.Check(err, check.IsNil) - - serviceName := "healthServiceRun" - out, err := d.Cmd("service", "create", "--name", serviceName, imageName, "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - id := strings.TrimSpace(out) - - var tasks []swarm.Task - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - tasks = d.getServiceTasks(c, id) - return tasks, nil - }, checker.HasLen, 1) - - task := tasks[0] - - // wait for task to start - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - task = d.getTask(c, task.ID) - return task.Status.State, nil - }, checker.Equals, swarm.TaskStateRunning) - containerID := task.Status.ContainerStatus.ContainerID - - // wait for container to be healthy - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - out, _ := d.Cmd("inspect", "--format={{.State.Health.Status}}", containerID) - return strings.TrimSpace(out), nil - }, checker.Equals, "healthy") - - // make it fail - d.Cmd("exec", containerID, "rm", "/status") - // wait for container to be unhealthy - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - out, _ := d.Cmd("inspect", "--format={{.State.Health.Status}}", containerID) - return strings.TrimSpace(out), nil - }, checker.Equals, "unhealthy") - - // Task should be terminated - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - task = d.getTask(c, task.ID) - return task.Status.State, nil - }, checker.Equals, swarm.TaskStateFailed) - - if !strings.Contains(task.Status.Err, container.ErrContainerUnhealthy.Error()) { - c.Fatal("unhealthy task exits because of other error") - } -} - -// start a service whose task is unhealthy at beginning -// its tasks should be blocked in starting stage, until health check is passed -func (s *DockerSwarmSuite) TestServiceHealthStart(c *check.C) { - testRequires(c, DaemonIsLinux) // busybox doesn't work on Windows - - d := s.AddDaemon(c, true, true) - - // service started from this image won't pass health check - imageName := "testhealth" - _, _, err := d.buildImageWithOut(imageName, - `FROM busybox - HEALTHCHECK --interval=1s --timeout=1s --retries=1024\ - CMD cat /status`, - true) - c.Check(err, check.IsNil) - - serviceName := "healthServiceStart" - out, err := d.Cmd("service", "create", "--name", serviceName, imageName, "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - id := strings.TrimSpace(out) - - var tasks []swarm.Task - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - tasks = d.getServiceTasks(c, id) - return tasks, nil - }, checker.HasLen, 1) - - task := tasks[0] - - // wait for task to start - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - task = d.getTask(c, task.ID) - return task.Status.State, nil - }, checker.Equals, swarm.TaskStateStarting) - - containerID := task.Status.ContainerStatus.ContainerID - - // wait for health check to work - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - out, _ := d.Cmd("inspect", "--format={{.State.Health.FailingStreak}}", containerID) - failingStreak, _ := strconv.Atoi(strings.TrimSpace(out)) - return failingStreak, nil - }, checker.GreaterThan, 0) - - // task should be blocked at starting status - task = d.getTask(c, task.ID) - c.Assert(task.Status.State, check.Equals, swarm.TaskStateStarting) - - // make it healthy - d.Cmd("exec", containerID, "touch", "/status") - - // Task should be at running status - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - task = d.getTask(c, task.ID) - return task.Status.State, nil - }, checker.Equals, swarm.TaskStateRunning) -} - -// start a service whose task is unhealthy at beginning -// its tasks should be blocked in starting stage, until health check is passed -func (s *DockerSwarmSuite) TestServiceHealthUpdate(c *check.C) { - testRequires(c, DaemonIsLinux) // busybox doesn't work on Windows - - d := s.AddDaemon(c, true, true) - - // service started from this image won't pass health check - imageName := "testhealth" - _, _, err := d.buildImageWithOut(imageName, - `FROM busybox - HEALTHCHECK --interval=1s --timeout=1s --retries=1024\ - CMD cat /status`, - true) - c.Check(err, check.IsNil) - - serviceName := "healthServiceStart" - out, err := d.Cmd("service", "create", "--name", serviceName, imageName, "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - id := strings.TrimSpace(out) - - var tasks []swarm.Task - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - tasks = d.getServiceTasks(c, id) - return tasks, nil - }, checker.HasLen, 1) - - task := tasks[0] - - // wait for task to start - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - task = d.getTask(c, task.ID) - return task.Status.State, nil - }, checker.Equals, swarm.TaskStateStarting) - - containerID := task.Status.ContainerStatus.ContainerID - - // wait for health check to work - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - out, _ := d.Cmd("inspect", "--format={{.State.Health.FailingStreak}}", containerID) - failingStreak, _ := strconv.Atoi(strings.TrimSpace(out)) - return failingStreak, nil - }, checker.GreaterThan, 0) - - // task should be blocked at starting status - task = d.getTask(c, task.ID) - c.Assert(task.Status.State, check.Equals, swarm.TaskStateStarting) - - // make it healthy - d.Cmd("exec", containerID, "touch", "/status") - // Task should be at running status - waitAndAssert(c, defaultReconciliationTimeout, func(c *check.C) (interface{}, check.CommentInterface) { - task = d.getTask(c, task.ID) - return task.Status.State, nil - }, checker.Equals, swarm.TaskStateRunning) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_logs_experimental_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_logs_experimental_test.go deleted file mode 100644 index c2216543d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_logs_experimental_test.go +++ /dev/null @@ -1,96 +0,0 @@ -// +build !windows - -package main - -import ( - "bufio" - "fmt" - "io" - "os/exec" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -type logMessage struct { - err error - data []byte -} - -func (s *DockerSwarmSuite) TestServiceLogs(c *check.C) { - testRequires(c, ExperimentalDaemon) - - d := s.AddDaemon(c, true, true) - - // we have multiple services here for detecting the goroutine issue #28915 - services := map[string]string{ - "TestServiceLogs1": "hello1", - "TestServiceLogs2": "hello2", - } - - for name, message := range services { - out, err := d.Cmd("service", "create", "--name", name, "busybox", - "sh", "-c", fmt.Sprintf("echo %s; tail -f /dev/null", message)) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - } - - // make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, - d.checkActiveContainerCount, checker.Equals, len(services)) - - for name, message := range services { - out, err := d.Cmd("service", "logs", name) - c.Assert(err, checker.IsNil) - c.Logf("log for %q: %q", name, out) - c.Assert(out, checker.Contains, message) - } -} - -func (s *DockerSwarmSuite) TestServiceLogsFollow(c *check.C) { - testRequires(c, ExperimentalDaemon) - - d := s.AddDaemon(c, true, true) - - name := "TestServiceLogsFollow" - - out, err := d.Cmd("service", "create", "--name", name, "busybox", "sh", "-c", "while true; do echo log test; sleep 0.1; done") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - // make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - args := []string{"service", "logs", "-f", name} - cmd := exec.Command(dockerBinary, d.prependHostArg(args)...) - r, w := io.Pipe() - cmd.Stdout = w - cmd.Stderr = w - c.Assert(cmd.Start(), checker.IsNil) - - // Make sure pipe is written to - ch := make(chan *logMessage) - done := make(chan struct{}) - go func() { - reader := bufio.NewReader(r) - for { - msg := &logMessage{} - msg.data, _, msg.err = reader.ReadLine() - select { - case ch <- msg: - case <-done: - return - } - } - }() - - for i := 0; i < 3; i++ { - msg := <-ch - c.Assert(msg.err, checker.IsNil) - c.Assert(string(msg.data), checker.Contains, "log test") - } - close(done) - - c.Assert(cmd.Process.Kill(), checker.IsNil) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_scale_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_scale_test.go deleted file mode 100644 index 29cca2358..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_scale_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// +build !windows - -package main - -import ( - "fmt" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSwarmSuite) TestServiceScale(c *check.C) { - d := s.AddDaemon(c, true, true) - - service1Name := "TestService1" - service1Args := append([]string{"service", "create", "--name", service1Name, defaultSleepImage}, sleepCommandForDaemonPlatform()...) - - // global mode - service2Name := "TestService2" - service2Args := append([]string{"service", "create", "--name", service2Name, "--mode=global", defaultSleepImage}, sleepCommandForDaemonPlatform()...) - - // Create services - out, err := d.Cmd(service1Args...) - c.Assert(err, checker.IsNil) - - out, err = d.Cmd(service2Args...) - c.Assert(err, checker.IsNil) - - out, err = d.Cmd("service", "scale", "TestService1=2") - c.Assert(err, checker.IsNil) - - out, err = d.Cmd("service", "scale", "TestService1=foobar") - c.Assert(err, checker.NotNil) - - str := fmt.Sprintf("%s: invalid replicas value %s", service1Name, "foobar") - if !strings.Contains(out, str) { - c.Errorf("got: %s, expected has sub string: %s", out, str) - } - - out, err = d.Cmd("service", "scale", "TestService1=-1") - c.Assert(err, checker.NotNil) - - str = fmt.Sprintf("%s: invalid replicas value %s", service1Name, "-1") - if !strings.Contains(out, str) { - c.Errorf("got: %s, expected has sub string: %s", out, str) - } - - // TestService2 is a global mode - out, err = d.Cmd("service", "scale", "TestService2=2") - c.Assert(err, checker.NotNil) - - str = fmt.Sprintf("%s: scale can only be used with replicated mode\n", service2Name) - if out != str { - c.Errorf("got: %s, expected: %s", out, str) - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_update_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_update_test.go deleted file mode 100644 index 837370cee..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_update_test.go +++ /dev/null @@ -1,130 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - "fmt" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSwarmSuite) TestServiceUpdatePort(c *check.C) { - d := s.AddDaemon(c, true, true) - - serviceName := "TestServiceUpdatePort" - serviceArgs := append([]string{"service", "create", "--name", serviceName, "-p", "8080:8081", defaultSleepImage}, sleepCommandForDaemonPlatform()...) - - // Create a service with a port mapping of 8080:8081. - out, err := d.Cmd(serviceArgs...) - c.Assert(err, checker.IsNil) - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - // Update the service: changed the port mapping from 8080:8081 to 8082:8083. - _, err = d.Cmd("service", "update", "--publish-add", "8082:8083", "--publish-rm", "8081", serviceName) - c.Assert(err, checker.IsNil) - - // Inspect the service and verify port mapping - expected := []swarm.PortConfig{ - { - Protocol: "tcp", - PublishedPort: 8082, - TargetPort: 8083, - PublishMode: "ingress", - }, - } - - out, err = d.Cmd("service", "inspect", "--format", "{{ json .Spec.EndpointSpec.Ports }}", serviceName) - c.Assert(err, checker.IsNil) - - var portConfig []swarm.PortConfig - if err := json.Unmarshal([]byte(out), &portConfig); err != nil { - c.Fatalf("invalid JSON in inspect result: %v (%s)", err, out) - } - c.Assert(portConfig, checker.DeepEquals, expected) -} - -func (s *DockerSwarmSuite) TestServiceUpdateLabel(c *check.C) { - d := s.AddDaemon(c, true, true) - out, err := d.Cmd("service", "create", "--name=test", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - service := d.getService(c, "test") - c.Assert(service.Spec.Labels, checker.HasLen, 0) - - // add label to empty set - out, err = d.Cmd("service", "update", "test", "--label-add", "foo=bar") - c.Assert(err, checker.IsNil, check.Commentf(out)) - service = d.getService(c, "test") - c.Assert(service.Spec.Labels, checker.HasLen, 1) - c.Assert(service.Spec.Labels["foo"], checker.Equals, "bar") - - // add label to non-empty set - out, err = d.Cmd("service", "update", "test", "--label-add", "foo2=bar") - c.Assert(err, checker.IsNil, check.Commentf(out)) - service = d.getService(c, "test") - c.Assert(service.Spec.Labels, checker.HasLen, 2) - c.Assert(service.Spec.Labels["foo2"], checker.Equals, "bar") - - out, err = d.Cmd("service", "update", "test", "--label-rm", "foo2") - c.Assert(err, checker.IsNil, check.Commentf(out)) - service = d.getService(c, "test") - c.Assert(service.Spec.Labels, checker.HasLen, 1) - c.Assert(service.Spec.Labels["foo2"], checker.Equals, "") - - out, err = d.Cmd("service", "update", "test", "--label-rm", "foo") - c.Assert(err, checker.IsNil, check.Commentf(out)) - service = d.getService(c, "test") - c.Assert(service.Spec.Labels, checker.HasLen, 0) - c.Assert(service.Spec.Labels["foo"], checker.Equals, "") - - // now make sure we can add again - out, err = d.Cmd("service", "update", "test", "--label-add", "foo=bar") - c.Assert(err, checker.IsNil, check.Commentf(out)) - service = d.getService(c, "test") - c.Assert(service.Spec.Labels, checker.HasLen, 1) - c.Assert(service.Spec.Labels["foo"], checker.Equals, "bar") -} - -func (s *DockerSwarmSuite) TestServiceUpdateSecrets(c *check.C) { - d := s.AddDaemon(c, true, true) - testName := "test_secret" - id := d.createSecret(c, swarm.SecretSpec{ - swarm.Annotations{ - Name: testName, - }, - []byte("TESTINGDATA"), - }) - c.Assert(id, checker.Not(checker.Equals), "", check.Commentf("secrets: %s", id)) - testTarget := "testing" - serviceName := "test" - - out, err := d.Cmd("service", "create", "--name", serviceName, "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // add secret - out, err = d.cmdRetryOutOfSequence("service", "update", "test", "--secret-add", fmt.Sprintf("source=%s,target=%s", testName, testTarget)) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = d.Cmd("service", "inspect", "--format", "{{ json .Spec.TaskTemplate.ContainerSpec.Secrets }}", serviceName) - c.Assert(err, checker.IsNil) - - var refs []swarm.SecretReference - c.Assert(json.Unmarshal([]byte(out), &refs), checker.IsNil) - c.Assert(refs, checker.HasLen, 1) - - c.Assert(refs[0].SecretName, checker.Equals, testName) - c.Assert(refs[0].File, checker.Not(checker.IsNil)) - c.Assert(refs[0].File.Name, checker.Equals, testTarget) - - // remove - out, err = d.cmdRetryOutOfSequence("service", "update", "test", "--secret-rm", testName) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = d.Cmd("service", "inspect", "--format", "{{ json .Spec.TaskTemplate.ContainerSpec.Secrets }}", serviceName) - c.Assert(err, checker.IsNil) - - c.Assert(json.Unmarshal([]byte(out), &refs), checker.IsNil) - c.Assert(refs, checker.HasLen, 0) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_sni_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_sni_test.go deleted file mode 100644 index fb896d52d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_sni_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "log" - "net/http" - "net/http/httptest" - "net/url" - "os/exec" - "strings" - - "github.com/go-check/check" -) - -func (s *DockerSuite) TestClientSetsTLSServerName(c *check.C) { - c.Skip("Flakey test") - // there may be more than one hit to the server for each registry request - serverNameReceived := []string{} - var serverName string - - virtualHostServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - serverNameReceived = append(serverNameReceived, r.TLS.ServerName) - })) - defer virtualHostServer.Close() - // discard TLS handshake errors written by default to os.Stderr - virtualHostServer.Config.ErrorLog = log.New(ioutil.Discard, "", 0) - - u, err := url.Parse(virtualHostServer.URL) - c.Assert(err, check.IsNil) - hostPort := u.Host - serverName = strings.Split(hostPort, ":")[0] - - repoName := fmt.Sprintf("%v/dockercli/image:latest", hostPort) - cmd := exec.Command(dockerBinary, "pull", repoName) - cmd.Run() - - // check that the fake server was hit at least once - c.Assert(len(serverNameReceived) > 0, check.Equals, true) - // check that for each hit the right server name was received - for _, item := range serverNameReceived { - c.Check(item, check.Equals, serverName) - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_stack_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_stack_test.go deleted file mode 100644 index fd9b15449..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_stack_test.go +++ /dev/null @@ -1,186 +0,0 @@ -package main - -import ( - "encoding/json" - "io/ioutil" - "os" - "sort" - "strings" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSwarmSuite) TestStackRemoveUnknown(c *check.C) { - d := s.AddDaemon(c, true, true) - - stackArgs := append([]string{"stack", "remove", "UNKNOWN_STACK"}) - - out, err := d.Cmd(stackArgs...) - c.Assert(err, checker.IsNil) - c.Assert(out, check.Equals, "Nothing found in stack: UNKNOWN_STACK\n") -} - -func (s *DockerSwarmSuite) TestStackPSUnknown(c *check.C) { - d := s.AddDaemon(c, true, true) - - stackArgs := append([]string{"stack", "ps", "UNKNOWN_STACK"}) - - out, err := d.Cmd(stackArgs...) - c.Assert(err, checker.IsNil) - c.Assert(out, check.Equals, "Nothing found in stack: UNKNOWN_STACK\n") -} - -func (s *DockerSwarmSuite) TestStackServicesUnknown(c *check.C) { - d := s.AddDaemon(c, true, true) - - stackArgs := append([]string{"stack", "services", "UNKNOWN_STACK"}) - - out, err := d.Cmd(stackArgs...) - c.Assert(err, checker.IsNil) - c.Assert(out, check.Equals, "Nothing found in stack: UNKNOWN_STACK\n") -} - -func (s *DockerSwarmSuite) TestStackDeployComposeFile(c *check.C) { - d := s.AddDaemon(c, true, true) - - testStackName := "testdeploy" - stackArgs := []string{ - "stack", "deploy", - "--compose-file", "fixtures/deploy/default.yaml", - testStackName, - } - out, err := d.Cmd(stackArgs...) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = d.Cmd("stack", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, check.Equals, "NAME SERVICES\n"+"testdeploy 2\n") - - out, err = d.Cmd("stack", "rm", testStackName) - c.Assert(err, checker.IsNil) - out, err = d.Cmd("stack", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, check.Equals, "NAME SERVICES\n") -} - -func (s *DockerSwarmSuite) TestStackDeployWithSecretsTwice(c *check.C) { - d := s.AddDaemon(c, true, true) - - out, err := d.Cmd("secret", "create", "outside", "fixtures/secrets/default") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - testStackName := "testdeploy" - stackArgs := []string{ - "stack", "deploy", - "--compose-file", "fixtures/deploy/secrets.yaml", - testStackName, - } - out, err = d.Cmd(stackArgs...) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = d.Cmd("service", "inspect", "--format", "{{ json .Spec.TaskTemplate.ContainerSpec.Secrets }}", "testdeploy_web") - c.Assert(err, checker.IsNil) - - var refs []swarm.SecretReference - c.Assert(json.Unmarshal([]byte(out), &refs), checker.IsNil) - c.Assert(refs, checker.HasLen, 3) - - sort.Sort(sortSecrets(refs)) - c.Assert(refs[0].SecretName, checker.Equals, "outside") - c.Assert(refs[1].SecretName, checker.Equals, "testdeploy_special") - c.Assert(refs[1].File.Name, checker.Equals, "special") - c.Assert(refs[2].SecretName, checker.Equals, "testdeploy_super") - c.Assert(refs[2].File.Name, checker.Equals, "foo.txt") - c.Assert(refs[2].File.Mode, checker.Equals, os.FileMode(0400)) - - // Deploy again to ensure there are no errors when secret hasn't changed - out, err = d.Cmd(stackArgs...) - c.Assert(err, checker.IsNil, check.Commentf(out)) -} - -func (s *DockerSwarmSuite) TestStackRemove(c *check.C) { - d := s.AddDaemon(c, true, true) - - stackName := "testdeploy" - stackArgs := []string{ - "stack", "deploy", - "--compose-file", "fixtures/deploy/remove.yaml", - stackName, - } - out, err := d.Cmd(stackArgs...) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = d.Cmd("stack", "ps", stackName) - c.Assert(err, checker.IsNil) - c.Assert(strings.Split(strings.TrimSpace(out), "\n"), checker.HasLen, 2) - - out, err = d.Cmd("stack", "rm", stackName) - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Removing service testdeploy_web") - c.Assert(out, checker.Contains, "Removing network testdeploy_default") - c.Assert(out, checker.Contains, "Removing secret testdeploy_special") -} - -type sortSecrets []swarm.SecretReference - -func (s sortSecrets) Len() int { return len(s) } -func (s sortSecrets) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s sortSecrets) Less(i, j int) bool { return s[i].SecretName < s[j].SecretName } - -// testDAB is the DAB JSON used for testing. -// TODO: Use template/text and substitute "Image" with the result of -// `docker inspect --format '{{index .RepoDigests 0}}' busybox:latest` -const testDAB = `{ - "Version": "0.1", - "Services": { - "srv1": { - "Image": "busybox@sha256:e4f93f6ed15a0cdd342f5aae387886fba0ab98af0a102da6276eaf24d6e6ade0", - "Command": ["top"] - }, - "srv2": { - "Image": "busybox@sha256:e4f93f6ed15a0cdd342f5aae387886fba0ab98af0a102da6276eaf24d6e6ade0", - "Command": ["tail"], - "Args": ["-f", "/dev/null"] - } - } -}` - -func (s *DockerSwarmSuite) TestStackDeployWithDAB(c *check.C) { - testRequires(c, ExperimentalDaemon) - // setup - testStackName := "test" - testDABFileName := testStackName + ".dab" - defer os.RemoveAll(testDABFileName) - err := ioutil.WriteFile(testDABFileName, []byte(testDAB), 0444) - c.Assert(err, checker.IsNil) - d := s.AddDaemon(c, true, true) - // deploy - stackArgs := []string{ - "stack", "deploy", - "--bundle-file", testDABFileName, - testStackName, - } - out, err := d.Cmd(stackArgs...) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "Loading bundle from test.dab\n") - c.Assert(out, checker.Contains, "Creating service test_srv1\n") - c.Assert(out, checker.Contains, "Creating service test_srv2\n") - // ls - stackArgs = []string{"stack", "ls"} - out, err = d.Cmd(stackArgs...) - c.Assert(err, checker.IsNil) - c.Assert(out, check.Equals, "NAME SERVICES\n"+"test 2\n") - // rm - stackArgs = []string{"stack", "rm", testStackName} - out, err = d.Cmd(stackArgs...) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "Removing service test_srv1\n") - c.Assert(out, checker.Contains, "Removing service test_srv2\n") - // ls (empty) - stackArgs = []string{"stack", "ls"} - out, err = d.Cmd(stackArgs...) - c.Assert(err, checker.IsNil) - c.Assert(out, check.Equals, "NAME SERVICES\n") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_start_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_start_test.go deleted file mode 100644 index b1cea3587..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_start_test.go +++ /dev/null @@ -1,199 +0,0 @@ -package main - -import ( - "fmt" - "os/exec" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// Regression test for https://github.com/docker/docker/issues/7843 -func (s *DockerSuite) TestStartAttachReturnsOnError(c *check.C) { - // Windows does not support link - testRequires(c, DaemonIsLinux) - dockerCmd(c, "run", "--name", "test", "busybox") - - // Expect this to fail because the above container is stopped, this is what we want - out, _, err := dockerCmdWithError("run", "--name", "test2", "--link", "test:test", "busybox") - // err shouldn't be nil because container test2 try to link to stopped container - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - - ch := make(chan error) - go func() { - // Attempt to start attached to the container that won't start - // This should return an error immediately since the container can't be started - if out, _, err := dockerCmdWithError("start", "-a", "test2"); err == nil { - ch <- fmt.Errorf("Expected error but got none:\n%s", out) - } - close(ch) - }() - - select { - case err := <-ch: - c.Assert(err, check.IsNil) - case <-time.After(5 * time.Second): - c.Fatalf("Attach did not exit properly") - } -} - -// gh#8555: Exit code should be passed through when using start -a -func (s *DockerSuite) TestStartAttachCorrectExitCode(c *check.C) { - testRequires(c, DaemonIsLinux) - out, _, _ := dockerCmdWithStdoutStderr(c, "run", "-d", "busybox", "sh", "-c", "sleep 2; exit 1") - out = strings.TrimSpace(out) - - // make sure the container has exited before trying the "start -a" - dockerCmd(c, "wait", out) - - startOut, exitCode, err := dockerCmdWithError("start", "-a", out) - // start command should fail - c.Assert(err, checker.NotNil, check.Commentf("startOut: %s", startOut)) - // start -a did not respond with proper exit code - c.Assert(exitCode, checker.Equals, 1, check.Commentf("startOut: %s", startOut)) - -} - -func (s *DockerSuite) TestStartAttachSilent(c *check.C) { - name := "teststartattachcorrectexitcode" - dockerCmd(c, "run", "--name", name, "busybox", "echo", "test") - - // make sure the container has exited before trying the "start -a" - dockerCmd(c, "wait", name) - - startOut, _ := dockerCmd(c, "start", "-a", name) - // start -a produced unexpected output - c.Assert(startOut, checker.Equals, "test\n") -} - -func (s *DockerSuite) TestStartRecordError(c *check.C) { - // TODO Windows CI: Requires further porting work. Should be possible. - testRequires(c, DaemonIsLinux) - // when container runs successfully, we should not have state.Error - dockerCmd(c, "run", "-d", "-p", "9999:9999", "--name", "test", "busybox", "top") - stateErr := inspectField(c, "test", "State.Error") - // Expected to not have state error - c.Assert(stateErr, checker.Equals, "") - - // Expect this to fail and records error because of ports conflict - out, _, err := dockerCmdWithError("run", "-d", "--name", "test2", "-p", "9999:9999", "busybox", "top") - // err shouldn't be nil because docker run will fail - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - - stateErr = inspectField(c, "test2", "State.Error") - c.Assert(stateErr, checker.Contains, "port is already allocated") - - // Expect the conflict to be resolved when we stop the initial container - dockerCmd(c, "stop", "test") - dockerCmd(c, "start", "test2") - stateErr = inspectField(c, "test2", "State.Error") - // Expected to not have state error but got one - c.Assert(stateErr, checker.Equals, "") -} - -func (s *DockerSuite) TestStartPausedContainer(c *check.C) { - // Windows does not support pausing containers - testRequires(c, IsPausable) - defer unpauseAllContainers() - - runSleepingContainer(c, "-d", "--name", "testing") - - dockerCmd(c, "pause", "testing") - - out, _, err := dockerCmdWithError("start", "testing") - // an error should have been shown that you cannot start paused container - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - // an error should have been shown that you cannot start paused container - c.Assert(out, checker.Contains, "Cannot start a paused container, try unpause instead.") -} - -func (s *DockerSuite) TestStartMultipleContainers(c *check.C) { - // Windows does not support --link - testRequires(c, DaemonIsLinux) - // run a container named 'parent' and create two container link to `parent` - dockerCmd(c, "run", "-d", "--name", "parent", "busybox", "top") - - for _, container := range []string{"child_first", "child_second"} { - dockerCmd(c, "create", "--name", container, "--link", "parent:parent", "busybox", "top") - } - - // stop 'parent' container - dockerCmd(c, "stop", "parent") - - out := inspectField(c, "parent", "State.Running") - // Container should be stopped - c.Assert(out, checker.Equals, "false") - - // start all the three containers, container `child_first` start first which should be failed - // container 'parent' start second and then start container 'child_second' - expOut := "Cannot link to a non running container" - expErr := "failed to start containers: [child_first]" - out, _, err := dockerCmdWithError("start", "child_first", "parent", "child_second") - // err shouldn't be nil because start will fail - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - // output does not correspond to what was expected - if !(strings.Contains(out, expOut) || strings.Contains(err.Error(), expErr)) { - c.Fatalf("Expected out: %v with err: %v but got out: %v with err: %v", expOut, expErr, out, err) - } - - for container, expected := range map[string]string{"parent": "true", "child_first": "false", "child_second": "true"} { - out := inspectField(c, container, "State.Running") - // Container running state wrong - c.Assert(out, checker.Equals, expected) - } -} - -func (s *DockerSuite) TestStartAttachMultipleContainers(c *check.C) { - // run multiple containers to test - for _, container := range []string{"test1", "test2", "test3"} { - runSleepingContainer(c, "--name", container) - } - - // stop all the containers - for _, container := range []string{"test1", "test2", "test3"} { - dockerCmd(c, "stop", container) - } - - // test start and attach multiple containers at once, expected error - for _, option := range []string{"-a", "-i", "-ai"} { - out, _, err := dockerCmdWithError("start", option, "test1", "test2", "test3") - // err shouldn't be nil because start will fail - c.Assert(err, checker.NotNil, check.Commentf("out: %s", out)) - // output does not correspond to what was expected - c.Assert(out, checker.Contains, "You cannot start and attach multiple containers at once.") - } - - // confirm the state of all the containers be stopped - for container, expected := range map[string]string{"test1": "false", "test2": "false", "test3": "false"} { - out := inspectField(c, container, "State.Running") - // Container running state wrong - c.Assert(out, checker.Equals, expected) - } -} - -// Test case for #23716 -func (s *DockerSuite) TestStartAttachWithRename(c *check.C) { - testRequires(c, DaemonIsLinux) - dockerCmd(c, "create", "-t", "--name", "before", "busybox") - go func() { - c.Assert(waitRun("before"), checker.IsNil) - dockerCmd(c, "rename", "before", "after") - dockerCmd(c, "stop", "--time=2", "after") - }() - _, stderr, _, _ := runCommandWithStdoutStderr(exec.Command(dockerBinary, "start", "-a", "before")) - c.Assert(stderr, checker.Not(checker.Contains), "No such container") -} - -func (s *DockerSuite) TestStartReturnCorrectExitCode(c *check.C) { - dockerCmd(c, "create", "--restart=on-failure:2", "--name", "withRestart", "busybox", "sh", "-c", "exit 11") - dockerCmd(c, "create", "--rm", "--name", "withRm", "busybox", "sh", "-c", "exit 12") - - _, exitCode, err := dockerCmdWithError("start", "-a", "withRestart") - c.Assert(err, checker.NotNil) - c.Assert(exitCode, checker.Equals, 11) - _, exitCode, err = dockerCmdWithError("start", "-a", "withRm") - c.Assert(err, checker.NotNil) - c.Assert(exitCode, checker.Equals, 12) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_stats_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_stats_test.go deleted file mode 100644 index 5cb1a3ea0..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_stats_test.go +++ /dev/null @@ -1,159 +0,0 @@ -package main - -import ( - "bufio" - "os/exec" - "regexp" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestStatsNoStream(c *check.C) { - // Windows does not support stats - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - id := strings.TrimSpace(out) - c.Assert(waitRun(id), checker.IsNil) - - statsCmd := exec.Command(dockerBinary, "stats", "--no-stream", id) - type output struct { - out []byte - err error - } - - ch := make(chan output) - go func() { - out, err := statsCmd.Output() - ch <- output{out, err} - }() - - select { - case outerr := <-ch: - c.Assert(outerr.err, checker.IsNil, check.Commentf("Error running stats: %v", outerr.err)) - c.Assert(string(outerr.out), checker.Contains, id) //running container wasn't present in output - case <-time.After(3 * time.Second): - statsCmd.Process.Kill() - c.Fatalf("stats did not return immediately when not streaming") - } -} - -func (s *DockerSuite) TestStatsContainerNotFound(c *check.C) { - // Windows does not support stats - testRequires(c, DaemonIsLinux) - - out, _, err := dockerCmdWithError("stats", "notfound") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "No such container: notfound", check.Commentf("Expected to fail on not found container stats, got %q instead", out)) - - out, _, err = dockerCmdWithError("stats", "--no-stream", "notfound") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "No such container: notfound", check.Commentf("Expected to fail on not found container stats with --no-stream, got %q instead", out)) -} - -func (s *DockerSuite) TestStatsAllRunningNoStream(c *check.C) { - // Windows does not support stats - testRequires(c, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - id1 := strings.TrimSpace(out)[:12] - c.Assert(waitRun(id1), check.IsNil) - out, _ = dockerCmd(c, "run", "-d", "busybox", "top") - id2 := strings.TrimSpace(out)[:12] - c.Assert(waitRun(id2), check.IsNil) - out, _ = dockerCmd(c, "run", "-d", "busybox", "top") - id3 := strings.TrimSpace(out)[:12] - c.Assert(waitRun(id3), check.IsNil) - dockerCmd(c, "stop", id3) - - out, _ = dockerCmd(c, "stats", "--no-stream") - if !strings.Contains(out, id1) || !strings.Contains(out, id2) { - c.Fatalf("Expected stats output to contain both %s and %s, got %s", id1, id2, out) - } - if strings.Contains(out, id3) { - c.Fatalf("Did not expect %s in stats, got %s", id3, out) - } - - // check output contains real data, but not all zeros - reg, _ := regexp.Compile("[1-9]+") - // split output with "\n", outLines[1] is id2's output - // outLines[2] is id1's output - outLines := strings.Split(out, "\n") - // check stat result of id2 contains real data - realData := reg.Find([]byte(outLines[1][12:])) - c.Assert(realData, checker.NotNil, check.Commentf("stat result are empty: %s", out)) - // check stat result of id1 contains real data - realData = reg.Find([]byte(outLines[2][12:])) - c.Assert(realData, checker.NotNil, check.Commentf("stat result are empty: %s", out)) -} - -func (s *DockerSuite) TestStatsAllNoStream(c *check.C) { - // Windows does not support stats - testRequires(c, DaemonIsLinux) - - out, _ := dockerCmd(c, "run", "-d", "busybox", "top") - id1 := strings.TrimSpace(out)[:12] - c.Assert(waitRun(id1), check.IsNil) - dockerCmd(c, "stop", id1) - out, _ = dockerCmd(c, "run", "-d", "busybox", "top") - id2 := strings.TrimSpace(out)[:12] - c.Assert(waitRun(id2), check.IsNil) - - out, _ = dockerCmd(c, "stats", "--all", "--no-stream") - if !strings.Contains(out, id1) || !strings.Contains(out, id2) { - c.Fatalf("Expected stats output to contain both %s and %s, got %s", id1, id2, out) - } - - // check output contains real data, but not all zeros - reg, _ := regexp.Compile("[1-9]+") - // split output with "\n", outLines[1] is id2's output - outLines := strings.Split(out, "\n") - // check stat result of id2 contains real data - realData := reg.Find([]byte(outLines[1][12:])) - c.Assert(realData, checker.NotNil, check.Commentf("stat result of %s is empty: %s", id2, out)) - // check stat result of id1 contains all zero - realData = reg.Find([]byte(outLines[2][12:])) - c.Assert(realData, checker.IsNil, check.Commentf("stat result of %s should be empty : %s", id1, out)) -} - -func (s *DockerSuite) TestStatsAllNewContainersAdded(c *check.C) { - // Windows does not support stats - testRequires(c, DaemonIsLinux) - - id := make(chan string) - addedChan := make(chan struct{}) - - runSleepingContainer(c, "-d") - statsCmd := exec.Command(dockerBinary, "stats") - stdout, err := statsCmd.StdoutPipe() - c.Assert(err, check.IsNil) - c.Assert(statsCmd.Start(), check.IsNil) - defer statsCmd.Process.Kill() - - go func() { - containerID := <-id - matchID := regexp.MustCompile(containerID) - - scanner := bufio.NewScanner(stdout) - for scanner.Scan() { - switch { - case matchID.MatchString(scanner.Text()): - close(addedChan) - return - } - } - }() - - out, _ := runSleepingContainer(c, "-d") - c.Assert(waitRun(strings.TrimSpace(out)), check.IsNil) - id <- strings.TrimSpace(out)[:12] - - select { - case <-time.After(30 * time.Second): - c.Fatal("failed to observe new container created added to stats") - case <-addedChan: - // ignore, done - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_stop_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_stop_test.go deleted file mode 100644 index 103d01374..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_stop_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package main - -import ( - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestStopContainerWithRestartPolicyAlways(c *check.C) { - dockerCmd(c, "run", "--name", "verifyRestart1", "-d", "--restart=always", "busybox", "false") - dockerCmd(c, "run", "--name", "verifyRestart2", "-d", "--restart=always", "busybox", "false") - - c.Assert(waitRun("verifyRestart1"), checker.IsNil) - c.Assert(waitRun("verifyRestart2"), checker.IsNil) - - dockerCmd(c, "stop", "verifyRestart1") - dockerCmd(c, "stop", "verifyRestart2") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_test.go deleted file mode 100644 index 8eae162cb..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_test.go +++ /dev/null @@ -1,1254 +0,0 @@ -// +build !windows - -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "path/filepath" - "strings" - "time" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/libnetwork/driverapi" - "github.com/docker/libnetwork/ipamapi" - remoteipam "github.com/docker/libnetwork/ipams/remote/api" - "github.com/go-check/check" - "github.com/vishvananda/netlink" -) - -func (s *DockerSwarmSuite) TestSwarmUpdate(c *check.C) { - d := s.AddDaemon(c, true, true) - - getSpec := func() swarm.Spec { - sw := d.getSwarm(c) - return sw.Spec - } - - out, err := d.Cmd("swarm", "update", "--cert-expiry", "30h", "--dispatcher-heartbeat", "11s") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - - spec := getSpec() - c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour) - c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, 11*time.Second) - - // setting anything under 30m for cert-expiry is not allowed - out, err = d.Cmd("swarm", "update", "--cert-expiry", "15m") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "minimum certificate expiry time") - spec = getSpec() - c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour) -} - -func (s *DockerSwarmSuite) TestSwarmInit(c *check.C) { - d := s.AddDaemon(c, false, false) - - getSpec := func() swarm.Spec { - sw := d.getSwarm(c) - return sw.Spec - } - - out, err := d.Cmd("swarm", "init", "--cert-expiry", "30h", "--dispatcher-heartbeat", "11s") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - - spec := getSpec() - c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 30*time.Hour) - c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, 11*time.Second) - - c.Assert(d.Leave(true), checker.IsNil) - time.Sleep(500 * time.Millisecond) // https://github.com/docker/swarmkit/issues/1421 - out, err = d.Cmd("swarm", "init") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - - spec = getSpec() - c.Assert(spec.CAConfig.NodeCertExpiry, checker.Equals, 90*24*time.Hour) - c.Assert(spec.Dispatcher.HeartbeatPeriod, checker.Equals, 5*time.Second) -} - -func (s *DockerSwarmSuite) TestSwarmInitIPv6(c *check.C) { - testRequires(c, IPv6) - d1 := s.AddDaemon(c, false, false) - out, err := d1.Cmd("swarm", "init", "--listen-addr", "::1") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - - d2 := s.AddDaemon(c, false, false) - out, err = d2.Cmd("swarm", "join", "::1") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - - out, err = d2.Cmd("info") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - c.Assert(out, checker.Contains, "Swarm: active") -} - -func (s *DockerSwarmSuite) TestSwarmInitUnspecifiedAdvertiseAddr(c *check.C) { - d := s.AddDaemon(c, false, false) - out, err := d.Cmd("swarm", "init", "--advertise-addr", "0.0.0.0") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "advertise address must be a non-zero IP address") -} - -func (s *DockerSwarmSuite) TestSwarmIncompatibleDaemon(c *check.C) { - // init swarm mode and stop a daemon - d := s.AddDaemon(c, true, true) - info, err := d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - c.Assert(d.Stop(), checker.IsNil) - - // start a daemon with --cluster-store and --cluster-advertise - err = d.Start("--cluster-store=consul://consuladdr:consulport/some/path", "--cluster-advertise=1.1.1.1:2375") - c.Assert(err, checker.NotNil) - content, _ := ioutil.ReadFile(d.logFile.Name()) - c.Assert(string(content), checker.Contains, "--cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode") - - // start a daemon with --live-restore - err = d.Start("--live-restore") - c.Assert(err, checker.NotNil) - content, _ = ioutil.ReadFile(d.logFile.Name()) - c.Assert(string(content), checker.Contains, "--live-restore daemon configuration is incompatible with swarm mode") - // restart for teardown - c.Assert(d.Start(), checker.IsNil) -} - -// Test case for #24090 -func (s *DockerSwarmSuite) TestSwarmNodeListHostname(c *check.C) { - d := s.AddDaemon(c, true, true) - - // The first line should contain "HOSTNAME" - out, err := d.Cmd("node", "ls") - c.Assert(err, checker.IsNil) - c.Assert(strings.Split(out, "\n")[0], checker.Contains, "HOSTNAME") -} - -func (s *DockerSwarmSuite) TestSwarmServiceTemplatingHostname(c *check.C) { - d := s.AddDaemon(c, true, true) - - out, err := d.Cmd("service", "create", "--name", "test", "--hostname", "{{.Service.Name}}-{{.Task.Slot}}", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - containers := d.activeContainers() - out, err = d.Cmd("inspect", "--type", "container", "--format", "{{.Config.Hostname}}", containers[0]) - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.Split(out, "\n")[0], checker.Equals, "test-1", check.Commentf("hostname with templating invalid")) -} - -// Test case for #24270 -func (s *DockerSwarmSuite) TestSwarmServiceListFilter(c *check.C) { - d := s.AddDaemon(c, true, true) - - name1 := "redis-cluster-md5" - name2 := "redis-cluster" - name3 := "other-cluster" - out, err := d.Cmd("service", "create", "--name", name1, "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - out, err = d.Cmd("service", "create", "--name", name2, "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - out, err = d.Cmd("service", "create", "--name", name3, "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - filter1 := "name=redis-cluster-md5" - filter2 := "name=redis-cluster" - - // We search checker.Contains with `name+" "` to prevent prefix only. - out, err = d.Cmd("service", "ls", "--filter", filter1) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name1+" ") - c.Assert(out, checker.Not(checker.Contains), name2+" ") - c.Assert(out, checker.Not(checker.Contains), name3+" ") - - out, err = d.Cmd("service", "ls", "--filter", filter2) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name1+" ") - c.Assert(out, checker.Contains, name2+" ") - c.Assert(out, checker.Not(checker.Contains), name3+" ") - - out, err = d.Cmd("service", "ls") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name1+" ") - c.Assert(out, checker.Contains, name2+" ") - c.Assert(out, checker.Contains, name3+" ") -} - -func (s *DockerSwarmSuite) TestSwarmNodeListFilter(c *check.C) { - d := s.AddDaemon(c, true, true) - - out, err := d.Cmd("node", "inspect", "--format", "{{ .Description.Hostname }}", "self") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - name := strings.TrimSpace(out) - - filter := "name=" + name[:4] - - out, err = d.Cmd("node", "ls", "--filter", filter) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name) - - out, err = d.Cmd("node", "ls", "--filter", "name=none") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), name) -} - -func (s *DockerSwarmSuite) TestSwarmNodeTaskListFilter(c *check.C) { - d := s.AddDaemon(c, true, true) - - name := "redis-cluster-md5" - out, err := d.Cmd("service", "create", "--name", name, "--replicas=3", "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - // make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 3) - - filter := "name=redis-cluster" - - out, err = d.Cmd("node", "ps", "--filter", filter, "self") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name+".1") - c.Assert(out, checker.Contains, name+".2") - c.Assert(out, checker.Contains, name+".3") - - out, err = d.Cmd("node", "ps", "--filter", "name=none", "self") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), name+".1") - c.Assert(out, checker.Not(checker.Contains), name+".2") - c.Assert(out, checker.Not(checker.Contains), name+".3") -} - -// Test case for #25375 -func (s *DockerSwarmSuite) TestSwarmPublishAdd(c *check.C) { - d := s.AddDaemon(c, true, true) - - testCases := []struct { - name string - publishAdd []string - ports string - }{ - { - name: "simple-syntax", - publishAdd: []string{ - "80:80", - "80:80", - "80:80", - "80:20", - }, - ports: "[{ tcp 80 80 ingress}]", - }, - { - name: "complex-syntax", - publishAdd: []string{ - "target=90,published=90,protocol=tcp,mode=ingress", - "target=90,published=90,protocol=tcp,mode=ingress", - "target=90,published=90,protocol=tcp,mode=ingress", - "target=30,published=90,protocol=tcp,mode=ingress", - }, - ports: "[{ tcp 90 90 ingress}]", - }, - } - - for _, tc := range testCases { - out, err := d.Cmd("service", "create", "--name", tc.name, "--label", "x=y", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - out, err = d.cmdRetryOutOfSequence("service", "update", "--publish-add", tc.publishAdd[0], tc.name) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = d.cmdRetryOutOfSequence("service", "update", "--publish-add", tc.publishAdd[1], tc.name) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - out, err = d.cmdRetryOutOfSequence("service", "update", "--publish-add", tc.publishAdd[2], "--publish-add", tc.publishAdd[3], tc.name) - c.Assert(err, checker.NotNil, check.Commentf(out)) - - out, err = d.Cmd("service", "inspect", "--format", "{{ .Spec.EndpointSpec.Ports }}", tc.name) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, tc.ports) - } -} - -func (s *DockerSwarmSuite) TestSwarmServiceWithGroup(c *check.C) { - d := s.AddDaemon(c, true, true) - - name := "top" - out, err := d.Cmd("service", "create", "--name", name, "--user", "root:root", "--group", "wheel", "--group", "audio", "--group", "staff", "--group", "777", "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - // make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - out, err = d.Cmd("ps", "-q") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - container := strings.TrimSpace(out) - - out, err = d.Cmd("exec", container, "id") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, "uid=0(root) gid=0(root) groups=10(wheel),29(audio),50(staff),777") -} - -func (s *DockerSwarmSuite) TestSwarmContainerAutoStart(c *check.C) { - d := s.AddDaemon(c, true, true) - - out, err := d.Cmd("network", "create", "--attachable", "-d", "overlay", "foo") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - out, err = d.Cmd("run", "-id", "--restart=always", "--net=foo", "--name=test", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - out, err = d.Cmd("ps", "-q") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - d.Restart() - - out, err = d.Cmd("ps", "-q") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") -} - -func (s *DockerSwarmSuite) TestSwarmContainerEndpointOptions(c *check.C) { - d := s.AddDaemon(c, true, true) - - out, err := d.Cmd("network", "create", "--attachable", "-d", "overlay", "foo") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - _, err = d.Cmd("run", "-d", "--net=foo", "--name=first", "--net-alias=first-alias", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - _, err = d.Cmd("run", "-d", "--net=foo", "--name=second", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // ping first container and its alias - _, err = d.Cmd("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil, check.Commentf(out)) - _, err = d.Cmd("exec", "second", "ping", "-c", "1", "first-alias") - c.Assert(err, check.IsNil, check.Commentf(out)) -} - -func (s *DockerSwarmSuite) TestSwarmContainerAttachByNetworkId(c *check.C) { - d := s.AddDaemon(c, true, true) - - out, err := d.Cmd("network", "create", "--attachable", "-d", "overlay", "testnet") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - networkID := strings.TrimSpace(out) - - out, err = d.Cmd("run", "-d", "--net", networkID, "busybox", "top") - c.Assert(err, checker.IsNil) - cID := strings.TrimSpace(out) - d.waitRun(cID) - - _, err = d.Cmd("rm", "-f", cID) - c.Assert(err, checker.IsNil) - - out, err = d.Cmd("network", "rm", "testnet") - c.Assert(err, checker.IsNil) - - checkNetwork := func(*check.C) (interface{}, check.CommentInterface) { - out, err := d.Cmd("network", "ls") - c.Assert(err, checker.IsNil) - return out, nil - } - - waitAndAssert(c, 3*time.Second, checkNetwork, checker.Not(checker.Contains), "testnet") -} - -func (s *DockerSwarmSuite) TestOverlayAttachable(c *check.C) { - d := s.AddDaemon(c, true, true) - - out, err := d.Cmd("network", "create", "-d", "overlay", "--attachable", "ovnet") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // validate attachable - out, err = d.Cmd("network", "inspect", "--format", "{{json .Attachable}}", "ovnet") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Equals, "true") - - // validate containers can attache to this overlay network - out, err = d.Cmd("run", "-d", "--network", "ovnet", "--name", "c1", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // redo validation, there was a bug that the value of attachable changes after - // containers attach to the network - out, err = d.Cmd("network", "inspect", "--format", "{{json .Attachable}}", "ovnet") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Equals, "true") -} - -func (s *DockerSwarmSuite) TestOverlayAttachableOnSwarmLeave(c *check.C) { - d := s.AddDaemon(c, true, true) - - // Create an attachable swarm network - nwName := "attovl" - out, err := d.Cmd("network", "create", "-d", "overlay", "--attachable", nwName) - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // Connect a container to the network - out, err = d.Cmd("run", "-d", "--network", nwName, "--name", "c1", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // Leave the swarm - err = d.Leave(true) - c.Assert(err, checker.IsNil) - - // Check the container is disconnected - out, err = d.Cmd("inspect", "c1", "--format", "{{.NetworkSettings.Networks."+nwName+"}}") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, "") - - // Check the network is gone - out, err = d.Cmd("network", "ls", "--format", "{{.Name}}") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), nwName) -} - -func (s *DockerSwarmSuite) TestSwarmRemoveInternalNetwork(c *check.C) { - d := s.AddDaemon(c, true, true) - - name := "ingress" - out, err := d.Cmd("network", "rm", name) - c.Assert(err, checker.NotNil) - c.Assert(strings.TrimSpace(out), checker.Contains, name) - c.Assert(strings.TrimSpace(out), checker.Contains, "is a pre-defined network and cannot be removed") -} - -// Test case for #24108, also the case from: -// https://github.com/docker/docker/pull/24620#issuecomment-233715656 -func (s *DockerSwarmSuite) TestSwarmTaskListFilter(c *check.C) { - d := s.AddDaemon(c, true, true) - - name := "redis-cluster-md5" - out, err := d.Cmd("service", "create", "--name", name, "--replicas=3", "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - filter := "name=redis-cluster" - - checkNumTasks := func(*check.C) (interface{}, check.CommentInterface) { - out, err := d.Cmd("service", "ps", "--filter", filter, name) - c.Assert(err, checker.IsNil) - return len(strings.Split(out, "\n")) - 2, nil // includes header and nl in last line - } - - // wait until all tasks have been created - waitAndAssert(c, defaultReconciliationTimeout, checkNumTasks, checker.Equals, 3) - - out, err = d.Cmd("service", "ps", "--filter", filter, name) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name+".1") - c.Assert(out, checker.Contains, name+".2") - c.Assert(out, checker.Contains, name+".3") - - out, err = d.Cmd("service", "ps", "--filter", "name="+name+".1", name) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name+".1") - c.Assert(out, checker.Not(checker.Contains), name+".2") - c.Assert(out, checker.Not(checker.Contains), name+".3") - - out, err = d.Cmd("service", "ps", "--filter", "name=none", name) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), name+".1") - c.Assert(out, checker.Not(checker.Contains), name+".2") - c.Assert(out, checker.Not(checker.Contains), name+".3") - - name = "redis-cluster-sha1" - out, err = d.Cmd("service", "create", "--name", name, "--mode=global", "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - waitAndAssert(c, defaultReconciliationTimeout, checkNumTasks, checker.Equals, 1) - - filter = "name=redis-cluster" - out, err = d.Cmd("service", "ps", "--filter", filter, name) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name) - - out, err = d.Cmd("service", "ps", "--filter", "name="+name, name) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, name) - - out, err = d.Cmd("service", "ps", "--filter", "name=none", name) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Not(checker.Contains), name) -} - -func (s *DockerSwarmSuite) TestPsListContainersFilterIsTask(c *check.C) { - d := s.AddDaemon(c, true, true) - - // Create a bare container - out, err := d.Cmd("run", "-d", "--name=bare-container", "busybox", "top") - c.Assert(err, checker.IsNil) - bareID := strings.TrimSpace(out)[:12] - // Create a service - name := "busybox-top" - out, err = d.Cmd("service", "create", "--name", name, "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - // make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkServiceRunningTasks(name), checker.Equals, 1) - - // Filter non-tasks - out, err = d.Cmd("ps", "-a", "-q", "--filter=is-task=false") - c.Assert(err, checker.IsNil) - psOut := strings.TrimSpace(out) - c.Assert(psOut, checker.Equals, bareID, check.Commentf("Expected id %s, got %s for is-task label, output %q", bareID, psOut, out)) - - // Filter tasks - out, err = d.Cmd("ps", "-a", "-q", "--filter=is-task=true") - c.Assert(err, checker.IsNil) - lines := strings.Split(strings.Trim(out, "\n "), "\n") - c.Assert(lines, checker.HasLen, 1) - c.Assert(lines[0], checker.Not(checker.Equals), bareID, check.Commentf("Expected not %s, but got it for is-task label, output %q", bareID, out)) -} - -const globalNetworkPlugin = "global-network-plugin" -const globalIPAMPlugin = "global-ipam-plugin" - -func setupRemoteGlobalNetworkPlugin(c *check.C, mux *http.ServeMux, url, netDrv, ipamDrv string) { - - mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, `{"Implements": ["%s", "%s"]}`, driverapi.NetworkPluginEndpointType, ipamapi.PluginEndpointType) - }) - - // Network driver implementation - mux.HandleFunc(fmt.Sprintf("/%s.GetCapabilities", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, `{"Scope":"global"}`) - }) - - mux.HandleFunc(fmt.Sprintf("/%s.AllocateNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - err := json.NewDecoder(r.Body).Decode(&remoteDriverNetworkRequest) - if err != nil { - http.Error(w, "Unable to decode JSON payload: "+err.Error(), http.StatusBadRequest) - return - } - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, "null") - }) - - mux.HandleFunc(fmt.Sprintf("/%s.FreeNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, "null") - }) - - mux.HandleFunc(fmt.Sprintf("/%s.CreateNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - err := json.NewDecoder(r.Body).Decode(&remoteDriverNetworkRequest) - if err != nil { - http.Error(w, "Unable to decode JSON payload: "+err.Error(), http.StatusBadRequest) - return - } - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, "null") - }) - - mux.HandleFunc(fmt.Sprintf("/%s.DeleteNetwork", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, "null") - }) - - mux.HandleFunc(fmt.Sprintf("/%s.CreateEndpoint", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, `{"Interface":{"MacAddress":"a0:b1:c2:d3:e4:f5"}}`) - }) - - mux.HandleFunc(fmt.Sprintf("/%s.Join", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - - veth := &netlink.Veth{ - LinkAttrs: netlink.LinkAttrs{Name: "randomIfName", TxQLen: 0}, PeerName: "cnt0"} - if err := netlink.LinkAdd(veth); err != nil { - fmt.Fprintf(w, `{"Error":"failed to add veth pair: `+err.Error()+`"}`) - } else { - fmt.Fprintf(w, `{"InterfaceName":{ "SrcName":"cnt0", "DstPrefix":"veth"}}`) - } - }) - - mux.HandleFunc(fmt.Sprintf("/%s.Leave", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, "null") - }) - - mux.HandleFunc(fmt.Sprintf("/%s.DeleteEndpoint", driverapi.NetworkPluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - if link, err := netlink.LinkByName("cnt0"); err == nil { - netlink.LinkDel(link) - } - fmt.Fprintf(w, "null") - }) - - // IPAM Driver implementation - var ( - poolRequest remoteipam.RequestPoolRequest - poolReleaseReq remoteipam.ReleasePoolRequest - addressRequest remoteipam.RequestAddressRequest - addressReleaseReq remoteipam.ReleaseAddressRequest - lAS = "localAS" - gAS = "globalAS" - pool = "172.28.0.0/16" - poolID = lAS + "/" + pool - gw = "172.28.255.254/16" - ) - - mux.HandleFunc(fmt.Sprintf("/%s.GetDefaultAddressSpaces", ipamapi.PluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintf(w, `{"LocalDefaultAddressSpace":"`+lAS+`", "GlobalDefaultAddressSpace": "`+gAS+`"}`) - }) - - mux.HandleFunc(fmt.Sprintf("/%s.RequestPool", ipamapi.PluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - err := json.NewDecoder(r.Body).Decode(&poolRequest) - if err != nil { - http.Error(w, "Unable to decode JSON payload: "+err.Error(), http.StatusBadRequest) - return - } - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - if poolRequest.AddressSpace != lAS && poolRequest.AddressSpace != gAS { - fmt.Fprintf(w, `{"Error":"Unknown address space in pool request: `+poolRequest.AddressSpace+`"}`) - } else if poolRequest.Pool != "" && poolRequest.Pool != pool { - fmt.Fprintf(w, `{"Error":"Cannot handle explicit pool requests yet"}`) - } else { - fmt.Fprintf(w, `{"PoolID":"`+poolID+`", "Pool":"`+pool+`"}`) - } - }) - - mux.HandleFunc(fmt.Sprintf("/%s.RequestAddress", ipamapi.PluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - err := json.NewDecoder(r.Body).Decode(&addressRequest) - if err != nil { - http.Error(w, "Unable to decode JSON payload: "+err.Error(), http.StatusBadRequest) - return - } - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - // make sure libnetwork is now querying on the expected pool id - if addressRequest.PoolID != poolID { - fmt.Fprintf(w, `{"Error":"unknown pool id"}`) - } else if addressRequest.Address != "" { - fmt.Fprintf(w, `{"Error":"Cannot handle explicit address requests yet"}`) - } else { - fmt.Fprintf(w, `{"Address":"`+gw+`"}`) - } - }) - - mux.HandleFunc(fmt.Sprintf("/%s.ReleaseAddress", ipamapi.PluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - err := json.NewDecoder(r.Body).Decode(&addressReleaseReq) - if err != nil { - http.Error(w, "Unable to decode JSON payload: "+err.Error(), http.StatusBadRequest) - return - } - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - // make sure libnetwork is now asking to release the expected address from the expected poolid - if addressRequest.PoolID != poolID { - fmt.Fprintf(w, `{"Error":"unknown pool id"}`) - } else if addressReleaseReq.Address != gw { - fmt.Fprintf(w, `{"Error":"unknown address"}`) - } else { - fmt.Fprintf(w, "null") - } - }) - - mux.HandleFunc(fmt.Sprintf("/%s.ReleasePool", ipamapi.PluginEndpointType), func(w http.ResponseWriter, r *http.Request) { - err := json.NewDecoder(r.Body).Decode(&poolReleaseReq) - if err != nil { - http.Error(w, "Unable to decode JSON payload: "+err.Error(), http.StatusBadRequest) - return - } - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - // make sure libnetwork is now asking to release the expected poolid - if addressRequest.PoolID != poolID { - fmt.Fprintf(w, `{"Error":"unknown pool id"}`) - } else { - fmt.Fprintf(w, "null") - } - }) - - err := os.MkdirAll("/etc/docker/plugins", 0755) - c.Assert(err, checker.IsNil) - - fileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", netDrv) - err = ioutil.WriteFile(fileName, []byte(url), 0644) - c.Assert(err, checker.IsNil) - - ipamFileName := fmt.Sprintf("/etc/docker/plugins/%s.spec", ipamDrv) - err = ioutil.WriteFile(ipamFileName, []byte(url), 0644) - c.Assert(err, checker.IsNil) -} - -func (s *DockerSwarmSuite) TestSwarmNetworkPlugin(c *check.C) { - mux := http.NewServeMux() - s.server = httptest.NewServer(mux) - c.Assert(s.server, check.NotNil, check.Commentf("Failed to start an HTTP Server")) - setupRemoteGlobalNetworkPlugin(c, mux, s.server.URL, globalNetworkPlugin, globalIPAMPlugin) - defer func() { - s.server.Close() - err := os.RemoveAll("/etc/docker/plugins") - c.Assert(err, checker.IsNil) - }() - - d := s.AddDaemon(c, true, true) - - out, err := d.Cmd("network", "create", "-d", globalNetworkPlugin, "foo") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "not supported in swarm mode") -} - -// Test case for #24712 -func (s *DockerSwarmSuite) TestSwarmServiceEnvFile(c *check.C) { - d := s.AddDaemon(c, true, true) - - path := filepath.Join(d.folder, "env.txt") - err := ioutil.WriteFile(path, []byte("VAR1=A\nVAR2=A\n"), 0644) - c.Assert(err, checker.IsNil) - - name := "worker" - out, err := d.Cmd("service", "create", "--env-file", path, "--env", "VAR1=B", "--env", "VAR1=C", "--env", "VAR2=", "--env", "VAR2", "--name", name, "busybox", "top") - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - // The complete env is [VAR1=A VAR2=A VAR1=B VAR1=C VAR2= VAR2] and duplicates will be removed => [VAR1=C VAR2] - out, err = d.Cmd("inspect", "--format", "{{ .Spec.TaskTemplate.ContainerSpec.Env }}", name) - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, "[VAR1=C VAR2]") -} - -func (s *DockerSwarmSuite) TestSwarmServiceTTY(c *check.C) { - d := s.AddDaemon(c, true, true) - - name := "top" - - ttyCheck := "if [ -t 0 ]; then echo TTY > /status && top; else echo none > /status && top; fi" - - // Without --tty - expectedOutput := "none" - out, err := d.Cmd("service", "create", "--name", name, "busybox", "sh", "-c", ttyCheck) - c.Assert(err, checker.IsNil) - - // Make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - // We need to get the container id. - out, err = d.Cmd("ps", "-a", "-q", "--no-trunc") - c.Assert(err, checker.IsNil) - id := strings.TrimSpace(out) - - out, err = d.Cmd("exec", id, "cat", "/status") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out)) - - // Remove service - out, err = d.Cmd("service", "rm", name) - c.Assert(err, checker.IsNil) - // Make sure container has been destroyed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 0) - - // With --tty - expectedOutput = "TTY" - out, err = d.Cmd("service", "create", "--name", name, "--tty", "busybox", "sh", "-c", ttyCheck) - c.Assert(err, checker.IsNil) - - // Make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - // We need to get the container id. - out, err = d.Cmd("ps", "-a", "-q", "--no-trunc") - c.Assert(err, checker.IsNil) - id = strings.TrimSpace(out) - - out, err = d.Cmd("exec", id, "cat", "/status") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out)) -} - -func (s *DockerSwarmSuite) TestSwarmServiceTTYUpdate(c *check.C) { - d := s.AddDaemon(c, true, true) - - // Create a service - name := "top" - _, err := d.Cmd("service", "create", "--name", name, "busybox", "top") - c.Assert(err, checker.IsNil) - - // Make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - out, err := d.Cmd("service", "inspect", "--format", "{{ .Spec.TaskTemplate.ContainerSpec.TTY }}", name) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, "false") - - _, err = d.Cmd("service", "update", "--tty", name) - c.Assert(err, checker.IsNil) - - out, err = d.Cmd("service", "inspect", "--format", "{{ .Spec.TaskTemplate.ContainerSpec.TTY }}", name) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, "true") -} - -func (s *DockerSwarmSuite) TestDNSConfig(c *check.C) { - d := s.AddDaemon(c, true, true) - - // Create a service - name := "top" - _, err := d.Cmd("service", "create", "--name", name, "--dns=1.2.3.4", "--dns-search=example.com", "--dns-option=timeout:3", "busybox", "top") - c.Assert(err, checker.IsNil) - - // Make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - // We need to get the container id. - out, err := d.Cmd("ps", "-a", "-q", "--no-trunc") - c.Assert(err, checker.IsNil) - id := strings.TrimSpace(out) - - // Compare against expected output. - expectedOutput1 := "nameserver 1.2.3.4" - expectedOutput2 := "search example.com" - expectedOutput3 := "options timeout:3" - out, err = d.Cmd("exec", id, "cat", "/etc/resolv.conf") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, expectedOutput1, check.Commentf("Expected '%s', but got %q", expectedOutput1, out)) - c.Assert(out, checker.Contains, expectedOutput2, check.Commentf("Expected '%s', but got %q", expectedOutput2, out)) - c.Assert(out, checker.Contains, expectedOutput3, check.Commentf("Expected '%s', but got %q", expectedOutput3, out)) -} - -func (s *DockerSwarmSuite) TestDNSConfigUpdate(c *check.C) { - d := s.AddDaemon(c, true, true) - - // Create a service - name := "top" - _, err := d.Cmd("service", "create", "--name", name, "busybox", "top") - c.Assert(err, checker.IsNil) - - // Make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - _, err = d.Cmd("service", "update", "--dns-add=1.2.3.4", "--dns-search-add=example.com", "--dns-option-add=timeout:3", name) - c.Assert(err, checker.IsNil) - - out, err := d.Cmd("service", "inspect", "--format", "{{ .Spec.TaskTemplate.ContainerSpec.DNSConfig }}", name) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, "{[1.2.3.4] [example.com] [timeout:3]}") -} - -func (s *DockerSwarmSuite) TestSwarmInitLocked(c *check.C) { - d := s.AddDaemon(c, false, false) - - outs, err := d.Cmd("swarm", "init", "--autolock") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", outs)) - - c.Assert(outs, checker.Contains, "docker swarm unlock") - - var unlockKey string - for _, line := range strings.Split(outs, "\n") { - if strings.Contains(line, "SWMKEY") { - unlockKey = strings.TrimSpace(line) - break - } - } - - c.Assert(unlockKey, checker.Not(checker.Equals), "") - - outs, err = d.Cmd("swarm", "unlock-key", "-q") - c.Assert(outs, checker.Equals, unlockKey+"\n") - - info, err := d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - - c.Assert(d.Restart(), checker.IsNil) - - info, err = d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateLocked) - - cmd := d.command("swarm", "unlock") - cmd.Stdin = bytes.NewBufferString("wrong-secret-key") - out, err := cmd.CombinedOutput() - c.Assert(err, checker.NotNil, check.Commentf("out: %v", string(out))) - c.Assert(string(out), checker.Contains, "invalid key") - - cmd = d.command("swarm", "unlock") - cmd.Stdin = bytes.NewBufferString(unlockKey) - out, err = cmd.CombinedOutput() - c.Assert(err, checker.IsNil, check.Commentf("out: %v", string(out))) - - info, err = d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - - outs, err = d.Cmd("node", "ls") - c.Assert(err, checker.IsNil) - c.Assert(outs, checker.Not(checker.Contains), "Swarm is encrypted and needs to be unlocked") - - outs, err = d.Cmd("swarm", "update", "--autolock=false") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", outs)) - - // Wait for autolock to be turned off - time.Sleep(time.Second) - - c.Assert(d.Restart(), checker.IsNil) - - info, err = d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - - outs, err = d.Cmd("node", "ls") - c.Assert(err, checker.IsNil) - c.Assert(outs, checker.Not(checker.Contains), "Swarm is encrypted and needs to be unlocked") -} - -func (s *DockerSwarmSuite) TestSwarmLeaveLocked(c *check.C) { - d := s.AddDaemon(c, false, false) - - outs, err := d.Cmd("swarm", "init", "--autolock") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", outs)) - - c.Assert(d.Restart("--swarm-default-advertise-addr=lo"), checker.IsNil) - - info, err := d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateLocked) - - outs, _ = d.Cmd("node", "ls") - c.Assert(outs, checker.Contains, "Swarm is encrypted and needs to be unlocked") - - outs, err = d.Cmd("swarm", "leave", "--force") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", outs)) - - info, err = d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive) - - outs, err = d.Cmd("swarm", "init") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", outs)) - - info, err = d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) -} - -func (s *DockerSwarmSuite) TestSwarmRotateUnlockKey(c *check.C) { - d := s.AddDaemon(c, true, true) - - outs, err := d.Cmd("swarm", "update", "--autolock") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", outs)) - - c.Assert(outs, checker.Contains, "docker swarm unlock") - - var unlockKey string - for _, line := range strings.Split(outs, "\n") { - if strings.Contains(line, "SWMKEY") { - unlockKey = strings.TrimSpace(line) - break - } - } - - c.Assert(unlockKey, checker.Not(checker.Equals), "") - - outs, err = d.Cmd("swarm", "unlock-key", "-q") - c.Assert(outs, checker.Equals, unlockKey+"\n") - - // Rotate multiple times - for i := 0; i != 3; i++ { - outs, err = d.Cmd("swarm", "unlock-key", "-q", "--rotate") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", outs)) - // Strip \n - newUnlockKey := outs[:len(outs)-1] - c.Assert(newUnlockKey, checker.Not(checker.Equals), "") - c.Assert(newUnlockKey, checker.Not(checker.Equals), unlockKey) - - c.Assert(d.Restart(), checker.IsNil) - - info, err := d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateLocked) - - outs, _ = d.Cmd("node", "ls") - c.Assert(outs, checker.Contains, "Swarm is encrypted and needs to be unlocked") - - cmd := d.command("swarm", "unlock") - cmd.Stdin = bytes.NewBufferString(unlockKey) - out, err := cmd.CombinedOutput() - - if err == nil { - // On occasion, the daemon may not have finished - // rotating the KEK before restarting. The test is - // intentionally written to explore this behavior. - // When this happens, unlocking with the old key will - // succeed. If we wait for the rotation to happen and - // restart again, the new key should be required this - // time. - - time.Sleep(3 * time.Second) - - c.Assert(d.Restart(), checker.IsNil) - - cmd = d.command("swarm", "unlock") - cmd.Stdin = bytes.NewBufferString(unlockKey) - out, err = cmd.CombinedOutput() - } - c.Assert(err, checker.NotNil, check.Commentf("out: %v", string(out))) - c.Assert(string(out), checker.Contains, "invalid key") - - outs, _ = d.Cmd("node", "ls") - c.Assert(outs, checker.Contains, "Swarm is encrypted and needs to be unlocked") - - cmd = d.command("swarm", "unlock") - cmd.Stdin = bytes.NewBufferString(newUnlockKey) - out, err = cmd.CombinedOutput() - c.Assert(err, checker.IsNil, check.Commentf("out: %v", string(out))) - - info, err = d.info() - c.Assert(err, checker.IsNil) - c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateActive) - - outs, err = d.Cmd("node", "ls") - c.Assert(err, checker.IsNil) - c.Assert(outs, checker.Not(checker.Contains), "Swarm is encrypted and needs to be unlocked") - - unlockKey = newUnlockKey - } -} - -func (s *DockerSwarmSuite) TestExtraHosts(c *check.C) { - d := s.AddDaemon(c, true, true) - - // Create a service - name := "top" - _, err := d.Cmd("service", "create", "--name", name, "--host=example.com:1.2.3.4", "busybox", "top") - c.Assert(err, checker.IsNil) - - // Make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - // We need to get the container id. - out, err := d.Cmd("ps", "-a", "-q", "--no-trunc") - c.Assert(err, checker.IsNil) - id := strings.TrimSpace(out) - - // Compare against expected output. - expectedOutput := "1.2.3.4\texample.com" - out, err = d.Cmd("exec", id, "cat", "/etc/hosts") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, expectedOutput, check.Commentf("Expected '%s', but got %q", expectedOutput, out)) -} - -func (s *DockerSwarmSuite) TestSwarmManagerAddress(c *check.C) { - d1 := s.AddDaemon(c, true, true) - d2 := s.AddDaemon(c, true, false) - d3 := s.AddDaemon(c, true, false) - - // Manager Addresses will always show Node 1's address - expectedOutput := fmt.Sprintf("Manager Addresses:\n 127.0.0.1:%d\n", d1.port) - - out, err := d1.Cmd("info") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, expectedOutput) - - out, err = d2.Cmd("info") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, expectedOutput) - - out, err = d3.Cmd("info") - c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, expectedOutput) -} - -func (s *DockerSwarmSuite) TestSwarmServiceInspectPretty(c *check.C) { - d := s.AddDaemon(c, true, true) - - name := "top" - out, err := d.Cmd("service", "create", "--name", name, "--limit-cpu=0.5", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - expectedOutput := ` -Resources: - Limits: - CPU: 0.5` - out, err = d.Cmd("service", "inspect", "--pretty", name) - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, expectedOutput, check.Commentf(out)) -} - -func (s *DockerSwarmSuite) TestSwarmNetworkIPAMOptions(c *check.C) { - d := s.AddDaemon(c, true, true) - - out, err := d.Cmd("network", "create", "-d", "overlay", "--ipam-opt", "foo=bar", "foo") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - - out, err = d.Cmd("network", "inspect", "--format", "{{.IPAM.Options}}", "foo") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Equals, "map[foo:bar]") - - out, err = d.Cmd("service", "create", "--network=foo", "--name", "top", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - out, err = d.Cmd("network", "inspect", "--format", "{{.IPAM.Options}}", "foo") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Equals, "map[foo:bar]") -} - -// TODO: migrate to a unit test -// This test could be migrated to unit test and save costly integration test, -// once PR #29143 is merged. -func (s *DockerSwarmSuite) TestSwarmUpdateWithoutArgs(c *check.C) { - d := s.AddDaemon(c, true, true) - - expectedOutput := ` -Usage: docker swarm update [OPTIONS] - -Update the swarm - -Options:` - - out, err := d.Cmd("swarm", "update") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - c.Assert(out, checker.Contains, expectedOutput, check.Commentf(out)) -} - -func (s *DockerTrustedSwarmSuite) TestTrustedServiceCreate(c *check.C) { - d := s.swarmSuite.AddDaemon(c, true, true) - - // Attempt creating a service from an image that is known to notary. - repoName := s.trustSuite.setupTrustedImage(c, "trusted-pull") - - name := "trusted" - serviceCmd := d.command("-D", "service", "create", "--name", name, repoName, "top") - s.trustSuite.trustedCmd(serviceCmd) - out, _, err := runCommandWithOutput(serviceCmd) - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "resolved image tag to", check.Commentf(out)) - - out, err = d.Cmd("service", "inspect", "--pretty", name) - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, repoName+"@", check.Commentf(out)) - - // Try trusted service create on an untrusted tag. - - repoName = fmt.Sprintf("%v/untrustedservicecreate/createtest:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - dockerCmd(c, "push", repoName) - dockerCmd(c, "rmi", repoName) - - name = "untrusted" - serviceCmd = d.command("service", "create", "--name", name, repoName, "top") - s.trustSuite.trustedCmd(serviceCmd) - out, _, err = runCommandWithOutput(serviceCmd) - - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Error: remote trust data does not exist", check.Commentf(out)) - - out, err = d.Cmd("service", "inspect", "--pretty", name) - c.Assert(err, checker.NotNil, check.Commentf(out)) -} - -func (s *DockerTrustedSwarmSuite) TestTrustedServiceUpdate(c *check.C) { - d := s.swarmSuite.AddDaemon(c, true, true) - - // Attempt creating a service from an image that is known to notary. - repoName := s.trustSuite.setupTrustedImage(c, "trusted-pull") - - name := "myservice" - - // Create a service without content trust - _, err := d.Cmd("service", "create", "--name", name, repoName, "top") - c.Assert(err, checker.IsNil) - - out, err := d.Cmd("service", "inspect", "--pretty", name) - c.Assert(err, checker.IsNil, check.Commentf(out)) - // Daemon won't insert the digest because this is disabled by - // DOCKER_SERVICE_PREFER_OFFLINE_IMAGE. - c.Assert(out, check.Not(checker.Contains), repoName+"@", check.Commentf(out)) - - serviceCmd := d.command("-D", "service", "update", "--image", repoName, name) - s.trustSuite.trustedCmd(serviceCmd) - out, _, err = runCommandWithOutput(serviceCmd) - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "resolved image tag to", check.Commentf(out)) - - out, err = d.Cmd("service", "inspect", "--pretty", name) - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, repoName+"@", check.Commentf(out)) - - // Try trusted service update on an untrusted tag. - - repoName = fmt.Sprintf("%v/untrustedservicecreate/createtest:latest", privateRegistryURL) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - dockerCmd(c, "push", repoName) - dockerCmd(c, "rmi", repoName) - - serviceCmd = d.command("service", "update", "--image", repoName, name) - s.trustSuite.trustedCmd(serviceCmd) - out, _, err = runCommandWithOutput(serviceCmd) - - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Error: remote trust data does not exist", check.Commentf(out)) -} - -// Test case for issue #27866, which did not allow NW name that is the prefix of a swarm NW ID. -// e.g. if the ingress ID starts with "n1", it was impossible to create a NW named "n1". -func (s *DockerSwarmSuite) TestSwarmNetworkCreateIssue27866(c *check.C) { - d := s.AddDaemon(c, true, true) - out, err := d.Cmd("network", "inspect", "-f", "{{.Id}}", "ingress") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - ingressID := strings.TrimSpace(out) - c.Assert(ingressID, checker.Not(checker.Equals), "") - - // create a network of which name is the prefix of the ID of an overlay network - // (ingressID in this case) - newNetName := ingressID[0:2] - out, err = d.Cmd("network", "create", "--driver", "overlay", newNetName) - // In #27866, it was failing because of "network with name %s already exists" - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - out, err = d.Cmd("network", "rm", newNetName) - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) -} - -// Test case for https://github.com/docker/docker/pull/27938#issuecomment-265768303 -// This test creates two networks with the same name sequentially, with various drivers. -// Since the operations in this test are done sequentially, the 2nd call should fail with -// "network with name FOO already exists". -// Note that it is to ok have multiple networks with the same name if the operations are done -// in parallel. (#18864) -func (s *DockerSwarmSuite) TestSwarmNetworkCreateDup(c *check.C) { - d := s.AddDaemon(c, true, true) - drivers := []string{"bridge", "overlay"} - for i, driver1 := range drivers { - nwName := fmt.Sprintf("network-test-%d", i) - for _, driver2 := range drivers { - c.Logf("Creating a network named %q with %q, then %q", - nwName, driver1, driver2) - out, err := d.Cmd("network", "create", "--driver", driver1, nwName) - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - out, err = d.Cmd("network", "create", "--driver", driver2, nwName) - c.Assert(out, checker.Contains, - fmt.Sprintf("network with name %s already exists", nwName)) - c.Assert(err, checker.NotNil) - c.Logf("As expected, the attempt to network %q with %q failed: %s", - nwName, driver2, out) - out, err = d.Cmd("network", "rm", nwName) - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - } - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_unix_test.go deleted file mode 100644 index d9e56ce6d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_unix_test.go +++ /dev/null @@ -1,52 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - "strings" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSwarmSuite) TestSwarmVolumePlugin(c *check.C) { - d := s.AddDaemon(c, true, true) - - out, err := d.Cmd("service", "create", "--mount", "type=volume,source=my-volume,destination=/foo,volume-driver=customvolumedriver", "--name", "top", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - - // Make sure task stays pending before plugin is available - waitAndAssert(c, defaultReconciliationTimeout, d.checkServiceTasksInState("top", swarm.TaskStatePending, "missing plugin on 1 node"), checker.Equals, 1) - - plugin := newVolumePlugin(c, "customvolumedriver") - defer plugin.Close() - - // create a dummy volume to trigger lazy loading of the plugin - out, err = d.Cmd("volume", "create", "-d", "customvolumedriver", "hello") - - // TODO(aaronl): It will take about 15 seconds for swarm to realize the - // plugin was loaded. Switching the test over to plugin v2 would avoid - // this long delay. - - // make sure task has been deployed. - waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) - - out, err = d.Cmd("ps", "-q") - c.Assert(err, checker.IsNil) - containerID := strings.TrimSpace(out) - - out, err = d.Cmd("inspect", "-f", "{{json .Mounts}}", containerID) - c.Assert(err, checker.IsNil) - - var mounts []struct { - Name string - Driver string - } - - c.Assert(json.NewDecoder(strings.NewReader(out)).Decode(&mounts), checker.IsNil) - c.Assert(len(mounts), checker.Equals, 1, check.Commentf(out)) - c.Assert(mounts[0].Name, checker.Equals, "my-volume") - c.Assert(mounts[0].Driver, checker.Equals, "customvolumedriver") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_tag_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_tag_test.go deleted file mode 100644 index b7d2b1dfe..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_tag_test.go +++ /dev/null @@ -1,225 +0,0 @@ -package main - -import ( - "fmt" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/stringutils" - "github.com/go-check/check" -) - -// tagging a named image in a new unprefixed repo should work -func (s *DockerSuite) TestTagUnprefixedRepoByName(c *check.C) { - // Don't attempt to pull on Windows as not in hub. It's installed - // as an image through .ensure-frozen-images-windows - if daemonPlatform != "windows" { - if err := pullImageIfNotExist("busybox:latest"); err != nil { - c.Fatal("couldn't find the busybox:latest image locally and failed to pull it") - } - } - - dockerCmd(c, "tag", "busybox:latest", "testfoobarbaz") -} - -// tagging an image by ID in a new unprefixed repo should work -func (s *DockerSuite) TestTagUnprefixedRepoByID(c *check.C) { - imageID := inspectField(c, "busybox", "Id") - dockerCmd(c, "tag", imageID, "testfoobarbaz") -} - -// ensure we don't allow the use of invalid repository names; these tag operations should fail -func (s *DockerSuite) TestTagInvalidUnprefixedRepo(c *check.C) { - invalidRepos := []string{"fo$z$", "Foo@3cc", "Foo$3", "Foo*3", "Fo^3", "Foo!3", "F)xcz(", "fo%asd", "FOO/bar"} - - for _, repo := range invalidRepos { - out, _, err := dockerCmdWithError("tag", "busybox", repo) - c.Assert(err, checker.NotNil, check.Commentf("tag busybox %v should have failed : %v", repo, out)) - } -} - -// ensure we don't allow the use of invalid tags; these tag operations should fail -func (s *DockerSuite) TestTagInvalidPrefixedRepo(c *check.C) { - longTag := stringutils.GenerateRandomAlphaOnlyString(121) - - invalidTags := []string{"repo:fo$z$", "repo:Foo@3cc", "repo:Foo$3", "repo:Foo*3", "repo:Fo^3", "repo:Foo!3", "repo:%goodbye", "repo:#hashtagit", "repo:F)xcz(", "repo:-foo", "repo:..", longTag} - - for _, repotag := range invalidTags { - out, _, err := dockerCmdWithError("tag", "busybox", repotag) - c.Assert(err, checker.NotNil, check.Commentf("tag busybox %v should have failed : %v", repotag, out)) - } -} - -// ensure we allow the use of valid tags -func (s *DockerSuite) TestTagValidPrefixedRepo(c *check.C) { - // Don't attempt to pull on Windows as not in hub. It's installed - // as an image through .ensure-frozen-images-windows - if daemonPlatform != "windows" { - if err := pullImageIfNotExist("busybox:latest"); err != nil { - c.Fatal("couldn't find the busybox:latest image locally and failed to pull it") - } - } - - validRepos := []string{"fooo/bar", "fooaa/test", "foooo:t", "HOSTNAME.DOMAIN.COM:443/foo/bar"} - - for _, repo := range validRepos { - _, _, err := dockerCmdWithError("tag", "busybox:latest", repo) - if err != nil { - c.Errorf("tag busybox %v should have worked: %s", repo, err) - continue - } - deleteImages(repo) - } -} - -// tag an image with an existed tag name without -f option should work -func (s *DockerSuite) TestTagExistedNameWithoutForce(c *check.C) { - // Don't attempt to pull on Windows as not in hub. It's installed - // as an image through .ensure-frozen-images-windows - if daemonPlatform != "windows" { - if err := pullImageIfNotExist("busybox:latest"); err != nil { - c.Fatal("couldn't find the busybox:latest image locally and failed to pull it") - } - } - - dockerCmd(c, "tag", "busybox:latest", "busybox:test") -} - -func (s *DockerSuite) TestTagWithPrefixHyphen(c *check.C) { - // Don't attempt to pull on Windows as not in hub. It's installed - // as an image through .ensure-frozen-images-windows - if daemonPlatform != "windows" { - if err := pullImageIfNotExist("busybox:latest"); err != nil { - c.Fatal("couldn't find the busybox:latest image locally and failed to pull it") - } - } - // test repository name begin with '-' - out, _, err := dockerCmdWithError("tag", "busybox:latest", "-busybox:test") - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Error parsing reference", check.Commentf("tag a name begin with '-' should failed")) - - // test namespace name begin with '-' - out, _, err = dockerCmdWithError("tag", "busybox:latest", "-test/busybox:test") - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Error parsing reference", check.Commentf("tag a name begin with '-' should failed")) - - // test index name begin with '-' - out, _, err = dockerCmdWithError("tag", "busybox:latest", "-index:5000/busybox:test") - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Error parsing reference", check.Commentf("tag a name begin with '-' should failed")) -} - -// ensure tagging using official names works -// ensure all tags result in the same name -func (s *DockerSuite) TestTagOfficialNames(c *check.C) { - names := []string{ - "docker.io/busybox", - "index.docker.io/busybox", - "library/busybox", - "docker.io/library/busybox", - "index.docker.io/library/busybox", - } - - for _, name := range names { - out, exitCode, err := dockerCmdWithError("tag", "busybox:latest", name+":latest") - if err != nil || exitCode != 0 { - c.Errorf("tag busybox %v should have worked: %s, %s", name, err, out) - continue - } - - // ensure we don't have multiple tag names. - out, _, err = dockerCmdWithError("images") - if err != nil { - c.Errorf("listing images failed with errors: %v, %s", err, out) - } else if strings.Contains(out, name) { - c.Errorf("images should not have listed '%s'", name) - deleteImages(name + ":latest") - } - } - - for _, name := range names { - _, exitCode, err := dockerCmdWithError("tag", name+":latest", "fooo/bar:latest") - if err != nil || exitCode != 0 { - c.Errorf("tag %v fooo/bar should have worked: %s", name, err) - continue - } - deleteImages("fooo/bar:latest") - } -} - -// ensure tags can not match digests -func (s *DockerSuite) TestTagMatchesDigest(c *check.C) { - // Don't attempt to pull on Windows as not in hub. It's installed - // as an image through .ensure-frozen-images-windows - if daemonPlatform != "windows" { - if err := pullImageIfNotExist("busybox:latest"); err != nil { - c.Fatal("couldn't find the busybox:latest image locally and failed to pull it") - } - } - digest := "busybox@sha256:abcdef76720241213f5303bda7704ec4c2ef75613173910a56fb1b6e20251507" - // test setting tag fails - _, _, err := dockerCmdWithError("tag", "busybox:latest", digest) - if err == nil { - c.Fatal("digest tag a name should have failed") - } - // check that no new image matches the digest - _, _, err = dockerCmdWithError("inspect", digest) - if err == nil { - c.Fatal("inspecting by digest should have failed") - } -} - -func (s *DockerSuite) TestTagInvalidRepoName(c *check.C) { - // Don't attempt to pull on Windows as not in hub. It's installed - // as an image through .ensure-frozen-images-windows - if daemonPlatform != "windows" { - if err := pullImageIfNotExist("busybox:latest"); err != nil { - c.Fatal("couldn't find the busybox:latest image locally and failed to pull it") - } - } - - // test setting tag fails - _, _, err := dockerCmdWithError("tag", "busybox:latest", "sha256:sometag") - if err == nil { - c.Fatal("tagging with image named \"sha256\" should have failed") - } -} - -// ensure tags cannot create ambiguity with image ids -func (s *DockerSuite) TestTagTruncationAmbiguity(c *check.C) { - //testRequires(c, DaemonIsLinux) - // Don't attempt to pull on Windows as not in hub. It's installed - // as an image through .ensure-frozen-images-windows - if daemonPlatform != "windows" { - if err := pullImageIfNotExist("busybox:latest"); err != nil { - c.Fatal("couldn't find the busybox:latest image locally and failed to pull it") - } - } - imageID, err := buildImage("notbusybox:latest", - `FROM busybox - MAINTAINER dockerio`, - true) - if err != nil { - c.Fatal(err) - } - truncatedImageID := stringid.TruncateID(imageID) - truncatedTag := fmt.Sprintf("notbusybox:%s", truncatedImageID) - - id := inspectField(c, truncatedTag, "Id") - - // Ensure inspect by image id returns image for image id - c.Assert(id, checker.Equals, imageID) - c.Logf("Built image: %s", imageID) - - // test setting tag fails - _, _, err = dockerCmdWithError("tag", "busybox:latest", truncatedTag) - if err != nil { - c.Fatalf("Error tagging with an image id: %s", err) - } - - id = inspectField(c, truncatedTag, "Id") - - // Ensure id is imageID and not busybox:latest - c.Assert(id, checker.Not(checker.Equals), imageID) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_top_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_top_test.go deleted file mode 100644 index caae29024..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_top_test.go +++ /dev/null @@ -1,73 +0,0 @@ -package main - -import ( - "strings" - - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestTopMultipleArgs(c *check.C) { - out, _ := runSleepingContainer(c, "-d") - cleanedContainerID := strings.TrimSpace(out) - - var expected icmd.Expected - switch daemonPlatform { - case "windows": - expected = icmd.Expected{ExitCode: 1, Err: "Windows does not support arguments to top"} - default: - expected = icmd.Expected{Out: "PID"} - } - result := dockerCmdWithResult("top", cleanedContainerID, "-o", "pid") - c.Assert(result, icmd.Matches, expected) -} - -func (s *DockerSuite) TestTopNonPrivileged(c *check.C) { - out, _ := runSleepingContainer(c, "-d") - cleanedContainerID := strings.TrimSpace(out) - - out1, _ := dockerCmd(c, "top", cleanedContainerID) - out2, _ := dockerCmd(c, "top", cleanedContainerID) - dockerCmd(c, "kill", cleanedContainerID) - - // Windows will list the name of the launched executable which in this case is busybox.exe, without the parameters. - // Linux will display the command executed in the container - var lookingFor string - if daemonPlatform == "windows" { - lookingFor = "busybox.exe" - } else { - lookingFor = "top" - } - - c.Assert(out1, checker.Contains, lookingFor, check.Commentf("top should've listed `%s` in the process list, but failed the first time", lookingFor)) - c.Assert(out2, checker.Contains, lookingFor, check.Commentf("top should've listed `%s` in the process list, but failed the second time", lookingFor)) -} - -// TestTopWindowsCoreProcesses validates that there are lines for the critical -// processes which are found in a Windows container. Note Windows is architecturally -// very different to Linux in this regard. -func (s *DockerSuite) TestTopWindowsCoreProcesses(c *check.C) { - testRequires(c, DaemonIsWindows) - out, _ := runSleepingContainer(c, "-d") - cleanedContainerID := strings.TrimSpace(out) - out1, _ := dockerCmd(c, "top", cleanedContainerID) - lookingFor := []string{"smss.exe", "csrss.exe", "wininit.exe", "services.exe", "lsass.exe", "CExecSvc.exe"} - for i, s := range lookingFor { - c.Assert(out1, checker.Contains, s, check.Commentf("top should've listed `%s` in the process list, but failed. Test case %d", s, i)) - } -} - -func (s *DockerSuite) TestTopPrivileged(c *check.C) { - // Windows does not support --privileged - testRequires(c, DaemonIsLinux, NotUserNamespace) - out, _ := dockerCmd(c, "run", "--privileged", "-i", "-d", "busybox", "top") - cleanedContainerID := strings.TrimSpace(out) - - out1, _ := dockerCmd(c, "top", cleanedContainerID) - out2, _ := dockerCmd(c, "top", cleanedContainerID) - dockerCmd(c, "kill", cleanedContainerID) - - c.Assert(out1, checker.Contains, "top", check.Commentf("top should've listed `top` in the process list, but failed the first time")) - c.Assert(out2, checker.Contains, "top", check.Commentf("top should've listed `top` in the process list, but failed the second time")) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_update_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_update_test.go deleted file mode 100644 index 0b31bb45f..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_update_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package main - -import ( - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestUpdateRestartPolicy(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "--restart=on-failure:3", "busybox", "sh", "-c", "sleep 1 && false") - timeout := 60 * time.Second - if daemonPlatform == "windows" { - timeout = 180 * time.Second - } - - id := strings.TrimSpace(string(out)) - - // update restart policy to on-failure:5 - dockerCmd(c, "update", "--restart=on-failure:5", id) - - err := waitExited(id, timeout) - c.Assert(err, checker.IsNil) - - count := inspectField(c, id, "RestartCount") - c.Assert(count, checker.Equals, "5") - - maximumRetryCount := inspectField(c, id, "HostConfig.RestartPolicy.MaximumRetryCount") - c.Assert(maximumRetryCount, checker.Equals, "5") -} - -func (s *DockerSuite) TestUpdateRestartWithAutoRemoveFlag(c *check.C) { - out, _ := runSleepingContainer(c, "--rm") - id := strings.TrimSpace(out) - - // update restart policy for an AutoRemove container - out, _, err := dockerCmdWithError("update", "--restart=always", id) - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "Restart policy cannot be updated because AutoRemove is enabled for the container") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_update_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_update_unix_test.go deleted file mode 100644 index 580ff0260..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_update_unix_test.go +++ /dev/null @@ -1,283 +0,0 @@ -// +build !windows - -package main - -import ( - "encoding/json" - "fmt" - "github.com/kr/pty" - "os/exec" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/parsers/kernel" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestUpdateRunningContainer(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - - name := "test-update-container" - dockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "busybox", "top") - dockerCmd(c, "update", "-m", "500M", name) - - c.Assert(inspectField(c, name, "HostConfig.Memory"), checker.Equals, "524288000") - - file := "/sys/fs/cgroup/memory/memory.limit_in_bytes" - out, _ := dockerCmd(c, "exec", name, "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "524288000") -} - -func (s *DockerSuite) TestUpdateRunningContainerWithRestart(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - - name := "test-update-container" - dockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "busybox", "top") - dockerCmd(c, "update", "-m", "500M", name) - dockerCmd(c, "restart", name) - - c.Assert(inspectField(c, name, "HostConfig.Memory"), checker.Equals, "524288000") - - file := "/sys/fs/cgroup/memory/memory.limit_in_bytes" - out, _ := dockerCmd(c, "exec", name, "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "524288000") -} - -func (s *DockerSuite) TestUpdateStoppedContainer(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - - name := "test-update-container" - file := "/sys/fs/cgroup/memory/memory.limit_in_bytes" - dockerCmd(c, "run", "--name", name, "-m", "300M", "busybox", "cat", file) - dockerCmd(c, "update", "-m", "500M", name) - - c.Assert(inspectField(c, name, "HostConfig.Memory"), checker.Equals, "524288000") - - out, _ := dockerCmd(c, "start", "-a", name) - c.Assert(strings.TrimSpace(out), checker.Equals, "524288000") -} - -func (s *DockerSuite) TestUpdatePausedContainer(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, cpuShare) - - name := "test-update-container" - dockerCmd(c, "run", "-d", "--name", name, "--cpu-shares", "1000", "busybox", "top") - dockerCmd(c, "pause", name) - dockerCmd(c, "update", "--cpu-shares", "500", name) - - c.Assert(inspectField(c, name, "HostConfig.CPUShares"), checker.Equals, "500") - - dockerCmd(c, "unpause", name) - file := "/sys/fs/cgroup/cpu/cpu.shares" - out, _ := dockerCmd(c, "exec", name, "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "500") -} - -func (s *DockerSuite) TestUpdateWithUntouchedFields(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - testRequires(c, cpuShare) - - name := "test-update-container" - dockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "--cpu-shares", "800", "busybox", "top") - dockerCmd(c, "update", "-m", "500M", name) - - // Update memory and not touch cpus, `cpuset.cpus` should still have the old value - out := inspectField(c, name, "HostConfig.CPUShares") - c.Assert(out, check.Equals, "800") - - file := "/sys/fs/cgroup/cpu/cpu.shares" - out, _ = dockerCmd(c, "exec", name, "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "800") -} - -func (s *DockerSuite) TestUpdateContainerInvalidValue(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - - name := "test-update-container" - dockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "busybox", "true") - out, _, err := dockerCmdWithError("update", "-m", "2M", name) - c.Assert(err, check.NotNil) - expected := "Minimum memory limit allowed is 4MB" - c.Assert(out, checker.Contains, expected) -} - -func (s *DockerSuite) TestUpdateContainerWithoutFlags(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - - name := "test-update-container" - dockerCmd(c, "run", "-d", "--name", name, "-m", "300M", "busybox", "true") - _, _, err := dockerCmdWithError("update", name) - c.Assert(err, check.NotNil) -} - -func (s *DockerSuite) TestUpdateKernelMemory(c *check.C) { - testRequires(c, DaemonIsLinux, kernelMemorySupport) - - name := "test-update-container" - dockerCmd(c, "run", "-d", "--name", name, "--kernel-memory", "50M", "busybox", "top") - dockerCmd(c, "update", "--kernel-memory", "100M", name) - - c.Assert(inspectField(c, name, "HostConfig.KernelMemory"), checker.Equals, "104857600") - - file := "/sys/fs/cgroup/memory/memory.kmem.limit_in_bytes" - out, _ := dockerCmd(c, "exec", name, "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "104857600") -} - -func (s *DockerSuite) TestUpdateKernelMemoryUninitialized(c *check.C) { - testRequires(c, DaemonIsLinux, kernelMemorySupport) - - isNewKernel := kernel.CheckKernelVersion(4, 6, 0) - name := "test-update-container" - dockerCmd(c, "run", "-d", "--name", name, "busybox", "top") - _, _, err := dockerCmdWithError("update", "--kernel-memory", "100M", name) - // Update kernel memory to a running container without kernel memory initialized - // is not allowed before kernel version 4.6. - if !isNewKernel { - c.Assert(err, check.NotNil) - } else { - c.Assert(err, check.IsNil) - } - - dockerCmd(c, "pause", name) - _, _, err = dockerCmdWithError("update", "--kernel-memory", "200M", name) - if !isNewKernel { - c.Assert(err, check.NotNil) - } else { - c.Assert(err, check.IsNil) - } - dockerCmd(c, "unpause", name) - - dockerCmd(c, "stop", name) - dockerCmd(c, "update", "--kernel-memory", "300M", name) - dockerCmd(c, "start", name) - - c.Assert(inspectField(c, name, "HostConfig.KernelMemory"), checker.Equals, "314572800") - - file := "/sys/fs/cgroup/memory/memory.kmem.limit_in_bytes" - out, _ := dockerCmd(c, "exec", name, "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "314572800") -} - -func (s *DockerSuite) TestUpdateSwapMemoryOnly(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - testRequires(c, swapMemorySupport) - - name := "test-update-container" - dockerCmd(c, "run", "-d", "--name", name, "--memory", "300M", "--memory-swap", "500M", "busybox", "top") - dockerCmd(c, "update", "--memory-swap", "600M", name) - - c.Assert(inspectField(c, name, "HostConfig.MemorySwap"), checker.Equals, "629145600") - - file := "/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes" - out, _ := dockerCmd(c, "exec", name, "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "629145600") -} - -func (s *DockerSuite) TestUpdateInvalidSwapMemory(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - testRequires(c, swapMemorySupport) - - name := "test-update-container" - dockerCmd(c, "run", "-d", "--name", name, "--memory", "300M", "--memory-swap", "500M", "busybox", "top") - _, _, err := dockerCmdWithError("update", "--memory-swap", "200M", name) - // Update invalid swap memory should fail. - // This will pass docker config validation, but failed at kernel validation - c.Assert(err, check.NotNil) - - // Update invalid swap memory with failure should not change HostConfig - c.Assert(inspectField(c, name, "HostConfig.Memory"), checker.Equals, "314572800") - c.Assert(inspectField(c, name, "HostConfig.MemorySwap"), checker.Equals, "524288000") - - dockerCmd(c, "update", "--memory-swap", "600M", name) - - c.Assert(inspectField(c, name, "HostConfig.MemorySwap"), checker.Equals, "629145600") - - file := "/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes" - out, _ := dockerCmd(c, "exec", name, "cat", file) - c.Assert(strings.TrimSpace(out), checker.Equals, "629145600") -} - -func (s *DockerSuite) TestUpdateStats(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - testRequires(c, cpuCfsQuota) - name := "foo" - dockerCmd(c, "run", "-d", "-ti", "--name", name, "-m", "500m", "busybox") - - c.Assert(waitRun(name), checker.IsNil) - - getMemLimit := func(id string) uint64 { - resp, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id), nil, "") - c.Assert(err, checker.IsNil) - c.Assert(resp.Header.Get("Content-Type"), checker.Equals, "application/json") - - var v *types.Stats - err = json.NewDecoder(body).Decode(&v) - c.Assert(err, checker.IsNil) - body.Close() - - return v.MemoryStats.Limit - } - preMemLimit := getMemLimit(name) - - dockerCmd(c, "update", "--cpu-quota", "2000", name) - - curMemLimit := getMemLimit(name) - - c.Assert(preMemLimit, checker.Equals, curMemLimit) - -} - -func (s *DockerSuite) TestUpdateMemoryWithSwapMemory(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, memoryLimitSupport) - testRequires(c, swapMemorySupport) - - name := "test-update-container" - dockerCmd(c, "run", "-d", "--name", name, "--memory", "300M", "busybox", "top") - out, _, err := dockerCmdWithError("update", "--memory", "800M", name) - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "Memory limit should be smaller than already set memoryswap limit") - - dockerCmd(c, "update", "--memory", "800M", "--memory-swap", "1000M", name) -} - -func (s *DockerSuite) TestUpdateNotAffectMonitorRestartPolicy(c *check.C) { - testRequires(c, DaemonIsLinux, cpuShare) - - out, _ := dockerCmd(c, "run", "-tid", "--restart=always", "busybox", "sh") - id := strings.TrimSpace(string(out)) - dockerCmd(c, "update", "--cpu-shares", "512", id) - - cpty, tty, err := pty.Open() - c.Assert(err, checker.IsNil) - defer cpty.Close() - - cmd := exec.Command(dockerBinary, "attach", id) - cmd.Stdin = tty - - c.Assert(cmd.Start(), checker.IsNil) - defer cmd.Process.Kill() - - _, err = cpty.Write([]byte("exit\n")) - c.Assert(err, checker.IsNil) - - c.Assert(cmd.Wait(), checker.IsNil) - - // container should restart again and keep running - err = waitInspect(id, "{{.RestartCount}}", "1", 30*time.Second) - c.Assert(err, checker.IsNil) - c.Assert(waitRun(id), checker.IsNil) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_userns_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_userns_test.go deleted file mode 100644 index acf74238b..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_userns_test.go +++ /dev/null @@ -1,98 +0,0 @@ -// +build !windows - -package main - -import ( - "fmt" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "strconv" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/system" - "github.com/go-check/check" -) - -// user namespaces test: run daemon with remapped root setting -// 1. validate uid/gid maps are set properly -// 2. verify that files created are owned by remapped root -func (s *DockerDaemonSuite) TestDaemonUserNamespaceRootSetting(c *check.C) { - testRequires(c, DaemonIsLinux, SameHostDaemon, UserNamespaceInKernel) - - c.Assert(s.d.StartWithBusybox("--userns-remap", "default"), checker.IsNil) - - tmpDir, err := ioutil.TempDir("", "userns") - c.Assert(err, checker.IsNil) - - defer os.RemoveAll(tmpDir) - - // Set a non-existent path - tmpDirNotExists := path.Join(os.TempDir(), "userns"+stringid.GenerateRandomID()) - defer os.RemoveAll(tmpDirNotExists) - - // we need to find the uid and gid of the remapped root from the daemon's root dir info - uidgid := strings.Split(filepath.Base(s.d.root), ".") - c.Assert(uidgid, checker.HasLen, 2, check.Commentf("Should have gotten uid/gid strings from root dirname: %s", filepath.Base(s.d.root))) - uid, err := strconv.Atoi(uidgid[0]) - c.Assert(err, checker.IsNil, check.Commentf("Can't parse uid")) - gid, err := strconv.Atoi(uidgid[1]) - c.Assert(err, checker.IsNil, check.Commentf("Can't parse gid")) - - // writable by the remapped root UID/GID pair - c.Assert(os.Chown(tmpDir, uid, gid), checker.IsNil) - - out, err := s.d.Cmd("run", "-d", "--name", "userns", "-v", tmpDir+":/goofy", "-v", tmpDirNotExists+":/donald", "busybox", "sh", "-c", "touch /goofy/testfile; top") - c.Assert(err, checker.IsNil, check.Commentf("Output: %s", out)) - user := s.findUser(c, "userns") - c.Assert(uidgid[0], checker.Equals, user) - - // check that the created directory is owned by remapped uid:gid - statNotExists, err := system.Stat(tmpDirNotExists) - c.Assert(err, checker.IsNil) - c.Assert(statNotExists.UID(), checker.Equals, uint32(uid), check.Commentf("Created directory not owned by remapped root UID")) - c.Assert(statNotExists.GID(), checker.Equals, uint32(gid), check.Commentf("Created directory not owned by remapped root GID")) - - pid, err := s.d.Cmd("inspect", "--format={{.State.Pid}}", "userns") - c.Assert(err, checker.IsNil, check.Commentf("Could not inspect running container: out: %q", pid)) - // check the uid and gid maps for the PID to ensure root is remapped - // (cmd = cat /proc//uid_map | grep -E '0\s+9999\s+1') - out, rc1, err := runCommandPipelineWithOutput( - exec.Command("cat", "/proc/"+strings.TrimSpace(pid)+"/uid_map"), - exec.Command("grep", "-E", fmt.Sprintf("0[[:space:]]+%d[[:space:]]+", uid))) - c.Assert(rc1, checker.Equals, 0, check.Commentf("Didn't match uid_map: output: %s", out)) - - out, rc2, err := runCommandPipelineWithOutput( - exec.Command("cat", "/proc/"+strings.TrimSpace(pid)+"/gid_map"), - exec.Command("grep", "-E", fmt.Sprintf("0[[:space:]]+%d[[:space:]]+", gid))) - c.Assert(rc2, checker.Equals, 0, check.Commentf("Didn't match gid_map: output: %s", out)) - - // check that the touched file is owned by remapped uid:gid - stat, err := system.Stat(filepath.Join(tmpDir, "testfile")) - c.Assert(err, checker.IsNil) - c.Assert(stat.UID(), checker.Equals, uint32(uid), check.Commentf("Touched file not owned by remapped root UID")) - c.Assert(stat.GID(), checker.Equals, uint32(gid), check.Commentf("Touched file not owned by remapped root GID")) - - // use host usernamespace - out, err = s.d.Cmd("run", "-d", "--name", "userns_skip", "--userns", "host", "busybox", "sh", "-c", "touch /goofy/testfile; top") - c.Assert(err, checker.IsNil, check.Commentf("Output: %s", out)) - user = s.findUser(c, "userns_skip") - // userns are skipped, user is root - c.Assert(user, checker.Equals, "root") -} - -// findUser finds the uid or name of the user of the first process that runs in a container -func (s *DockerDaemonSuite) findUser(c *check.C, container string) string { - out, err := s.d.Cmd("top", container) - c.Assert(err, checker.IsNil, check.Commentf("Output: %s", out)) - rows := strings.Split(out, "\n") - if len(rows) < 2 { - // No process rows founds - c.FailNow() - } - return strings.Fields(rows[1])[0] -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_v2_only_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_v2_only_test.go deleted file mode 100644 index 889936a06..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_v2_only_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "net/http" - "os" - - "github.com/go-check/check" -) - -func makefile(contents string) (string, func(), error) { - cleanup := func() { - - } - - f, err := ioutil.TempFile(".", "tmp") - if err != nil { - return "", cleanup, err - } - err = ioutil.WriteFile(f.Name(), []byte(contents), os.ModePerm) - if err != nil { - return "", cleanup, err - } - - cleanup = func() { - err := os.Remove(f.Name()) - if err != nil { - fmt.Println("Error removing tmpfile") - } - } - return f.Name(), cleanup, nil - -} - -// TestV2Only ensures that a daemon in v2-only mode does not -// attempt to contact any v1 registry endpoints. -func (s *DockerRegistrySuite) TestV2Only(c *check.C) { - reg, err := newTestRegistry(c) - c.Assert(err, check.IsNil) - - reg.registerHandler("/v2/", func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(404) - }) - - reg.registerHandler("/v1/.*", func(w http.ResponseWriter, r *http.Request) { - c.Fatal("V1 registry contacted") - }) - - repoName := fmt.Sprintf("%s/busybox", reg.hostport) - - err = s.d.Start("--insecure-registry", reg.hostport, "--disable-legacy-registry=true") - c.Assert(err, check.IsNil) - - dockerfileName, cleanup, err := makefile(fmt.Sprintf("FROM %s/busybox", reg.hostport)) - c.Assert(err, check.IsNil, check.Commentf("Unable to create test dockerfile")) - defer cleanup() - - s.d.Cmd("build", "--file", dockerfileName, ".") - - s.d.Cmd("run", repoName) - s.d.Cmd("login", "-u", "richard", "-p", "testtest", "-e", "testuser@testdomain.com", reg.hostport) - s.d.Cmd("tag", "busybox", repoName) - s.d.Cmd("push", repoName) - s.d.Cmd("pull", repoName) -} - -// TestV1 starts a daemon in 'normal' mode -// and ensure v1 endpoints are hit for the following operations: -// login, push, pull, build & run -func (s *DockerRegistrySuite) TestV1(c *check.C) { - reg, err := newTestRegistry(c) - c.Assert(err, check.IsNil) - - v2Pings := 0 - reg.registerHandler("/v2/", func(w http.ResponseWriter, r *http.Request) { - v2Pings++ - // V2 ping 404 causes fallback to v1 - w.WriteHeader(404) - }) - - v1Pings := 0 - reg.registerHandler("/v1/_ping", func(w http.ResponseWriter, r *http.Request) { - v1Pings++ - }) - - v1Logins := 0 - reg.registerHandler("/v1/users/", func(w http.ResponseWriter, r *http.Request) { - v1Logins++ - }) - - v1Repo := 0 - reg.registerHandler("/v1/repositories/busybox/", func(w http.ResponseWriter, r *http.Request) { - v1Repo++ - }) - - reg.registerHandler("/v1/repositories/busybox/images", func(w http.ResponseWriter, r *http.Request) { - v1Repo++ - }) - - err = s.d.Start("--insecure-registry", reg.hostport, "--disable-legacy-registry=false") - c.Assert(err, check.IsNil) - - dockerfileName, cleanup, err := makefile(fmt.Sprintf("FROM %s/busybox", reg.hostport)) - c.Assert(err, check.IsNil, check.Commentf("Unable to create test dockerfile")) - defer cleanup() - - s.d.Cmd("build", "--file", dockerfileName, ".") - c.Assert(v1Repo, check.Equals, 1, check.Commentf("Expected v1 repository access after build")) - - repoName := fmt.Sprintf("%s/busybox", reg.hostport) - s.d.Cmd("run", repoName) - c.Assert(v1Repo, check.Equals, 2, check.Commentf("Expected v1 repository access after run")) - - s.d.Cmd("login", "-u", "richard", "-p", "testtest", reg.hostport) - c.Assert(v1Logins, check.Equals, 1, check.Commentf("Expected v1 login attempt")) - - s.d.Cmd("tag", "busybox", repoName) - s.d.Cmd("push", repoName) - - c.Assert(v1Repo, check.Equals, 2) - - s.d.Cmd("pull", repoName) - c.Assert(v1Repo, check.Equals, 3, check.Commentf("Expected v1 repository access after pull")) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_version_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_version_test.go deleted file mode 100644 index 7672beb73..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_version_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package main - -import ( - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// ensure docker version works -func (s *DockerSuite) TestVersionEnsureSucceeds(c *check.C) { - out, _ := dockerCmd(c, "version") - stringsToCheck := map[string]int{ - "Client:": 1, - "Server:": 1, - " Version:": 2, - " API version:": 2, - " Go version:": 2, - " Git commit:": 2, - " OS/Arch:": 2, - " Built:": 2, - } - - for k, v := range stringsToCheck { - c.Assert(strings.Count(out, k), checker.Equals, v, check.Commentf("The count of %v in %s does not match excepted", k, out)) - } -} - -// ensure the Windows daemon return the correct platform string -func (s *DockerSuite) TestVersionPlatform_w(c *check.C) { - testRequires(c, DaemonIsWindows) - testVersionPlatform(c, "windows/amd64") -} - -// ensure the Linux daemon return the correct platform string -func (s *DockerSuite) TestVersionPlatform_l(c *check.C) { - testRequires(c, DaemonIsLinux) - testVersionPlatform(c, "linux") -} - -func testVersionPlatform(c *check.C, platform string) { - out, _ := dockerCmd(c, "version") - expected := "OS/Arch: " + platform - - split := strings.Split(out, "\n") - c.Assert(len(split) >= 14, checker.Equals, true, check.Commentf("got %d lines from version", len(split))) - - // Verify the second 'OS/Arch' matches the platform. Experimental has - // more lines of output than 'regular' - bFound := false - for i := 14; i < len(split); i++ { - if strings.Contains(split[i], expected) { - bFound = true - break - } - } - c.Assert(bFound, checker.Equals, true, check.Commentf("Could not find server '%s' in '%s'", expected, out)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_volume_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_volume_test.go deleted file mode 100644 index 61a941375..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_volume_test.go +++ /dev/null @@ -1,427 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/go-check/check" -) - -func (s *DockerSuite) TestVolumeCLICreate(c *check.C) { - dockerCmd(c, "volume", "create") - - _, err := runCommand(exec.Command(dockerBinary, "volume", "create", "-d", "nosuchdriver")) - c.Assert(err, check.Not(check.IsNil)) - - // test using hidden --name option - out, _ := dockerCmd(c, "volume", "create", "--name=test") - name := strings.TrimSpace(out) - c.Assert(name, check.Equals, "test") - - out, _ = dockerCmd(c, "volume", "create", "test2") - name = strings.TrimSpace(out) - c.Assert(name, check.Equals, "test2") -} - -func (s *DockerSuite) TestVolumeCLIInspect(c *check.C) { - c.Assert( - exec.Command(dockerBinary, "volume", "inspect", "doesntexist").Run(), - check.Not(check.IsNil), - check.Commentf("volume inspect should error on non-existent volume"), - ) - - out, _ := dockerCmd(c, "volume", "create") - name := strings.TrimSpace(out) - out, _ = dockerCmd(c, "volume", "inspect", "--format={{ .Name }}", name) - c.Assert(strings.TrimSpace(out), check.Equals, name) - - dockerCmd(c, "volume", "create", "test") - out, _ = dockerCmd(c, "volume", "inspect", "--format={{ .Name }}", "test") - c.Assert(strings.TrimSpace(out), check.Equals, "test") -} - -func (s *DockerSuite) TestVolumeCLIInspectMulti(c *check.C) { - dockerCmd(c, "volume", "create", "test1") - dockerCmd(c, "volume", "create", "test2") - dockerCmd(c, "volume", "create", "not-shown") - - result := dockerCmdWithResult("volume", "inspect", "--format={{ .Name }}", "test1", "test2", "doesntexist", "not-shown") - c.Assert(result, icmd.Matches, icmd.Expected{ - ExitCode: 1, - Err: "No such volume: doesntexist", - }) - - out := result.Stdout() - outArr := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 2, check.Commentf("\n%s", out)) - - c.Assert(out, checker.Contains, "test1") - c.Assert(out, checker.Contains, "test2") - c.Assert(out, checker.Not(checker.Contains), "not-shown") -} - -func (s *DockerSuite) TestVolumeCLILs(c *check.C) { - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - dockerCmd(c, "volume", "create", "aaa") - - dockerCmd(c, "volume", "create", "test") - - dockerCmd(c, "volume", "create", "soo") - dockerCmd(c, "run", "-v", "soo:"+prefix+"/foo", "busybox", "ls", "/") - - out, _ := dockerCmd(c, "volume", "ls") - outArr := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 4, check.Commentf("\n%s", out)) - - assertVolList(c, out, []string{"aaa", "soo", "test"}) -} - -func (s *DockerSuite) TestVolumeLsFormat(c *check.C) { - dockerCmd(c, "volume", "create", "aaa") - dockerCmd(c, "volume", "create", "test") - dockerCmd(c, "volume", "create", "soo") - - out, _ := dockerCmd(c, "volume", "ls", "--format", "{{.Name}}") - lines := strings.Split(strings.TrimSpace(string(out)), "\n") - - expected := []string{"aaa", "soo", "test"} - var names []string - names = append(names, lines...) - c.Assert(expected, checker.DeepEquals, names, check.Commentf("Expected array with truncated names: %v, got: %v", expected, names)) -} - -func (s *DockerSuite) TestVolumeLsFormatDefaultFormat(c *check.C) { - dockerCmd(c, "volume", "create", "aaa") - dockerCmd(c, "volume", "create", "test") - dockerCmd(c, "volume", "create", "soo") - - config := `{ - "volumesFormat": "{{ .Name }} default" -}` - d, err := ioutil.TempDir("", "integration-cli-") - c.Assert(err, checker.IsNil) - defer os.RemoveAll(d) - - err = ioutil.WriteFile(filepath.Join(d, "config.json"), []byte(config), 0644) - c.Assert(err, checker.IsNil) - - out, _ := dockerCmd(c, "--config", d, "volume", "ls") - lines := strings.Split(strings.TrimSpace(string(out)), "\n") - - expected := []string{"aaa default", "soo default", "test default"} - var names []string - names = append(names, lines...) - c.Assert(expected, checker.DeepEquals, names, check.Commentf("Expected array with truncated names: %v, got: %v", expected, names)) -} - -// assertVolList checks volume retrieved with ls command -// equals to expected volume list -// note: out should be `volume ls [option]` result -func assertVolList(c *check.C, out string, expectVols []string) { - lines := strings.Split(out, "\n") - var volList []string - for _, line := range lines[1 : len(lines)-1] { - volFields := strings.Fields(line) - // wrap all volume name in volList - volList = append(volList, volFields[1]) - } - - // volume ls should contains all expected volumes - c.Assert(volList, checker.DeepEquals, expectVols) -} - -func (s *DockerSuite) TestVolumeCLILsFilterDangling(c *check.C) { - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - dockerCmd(c, "volume", "create", "testnotinuse1") - dockerCmd(c, "volume", "create", "testisinuse1") - dockerCmd(c, "volume", "create", "testisinuse2") - - // Make sure both "created" (but not started), and started - // containers are included in reference counting - dockerCmd(c, "run", "--name", "volume-test1", "-v", "testisinuse1:"+prefix+"/foo", "busybox", "true") - dockerCmd(c, "create", "--name", "volume-test2", "-v", "testisinuse2:"+prefix+"/foo", "busybox", "true") - - out, _ := dockerCmd(c, "volume", "ls") - - // No filter, all volumes should show - c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output")) - c.Assert(out, checker.Contains, "testisinuse1\n", check.Commentf("expected volume 'testisinuse1' in output")) - c.Assert(out, checker.Contains, "testisinuse2\n", check.Commentf("expected volume 'testisinuse2' in output")) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "dangling=false") - - // Explicitly disabling dangling - c.Assert(out, check.Not(checker.Contains), "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output")) - c.Assert(out, checker.Contains, "testisinuse1\n", check.Commentf("expected volume 'testisinuse1' in output")) - c.Assert(out, checker.Contains, "testisinuse2\n", check.Commentf("expected volume 'testisinuse2' in output")) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "dangling=true") - - // Filter "dangling" volumes; only "dangling" (unused) volumes should be in the output - c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output")) - c.Assert(out, check.Not(checker.Contains), "testisinuse1\n", check.Commentf("volume 'testisinuse1' in output, but not expected")) - c.Assert(out, check.Not(checker.Contains), "testisinuse2\n", check.Commentf("volume 'testisinuse2' in output, but not expected")) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "dangling=1") - // Filter "dangling" volumes; only "dangling" (unused) volumes should be in the output, dangling also accept 1 - c.Assert(out, checker.Contains, "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output")) - c.Assert(out, check.Not(checker.Contains), "testisinuse1\n", check.Commentf("volume 'testisinuse1' in output, but not expected")) - c.Assert(out, check.Not(checker.Contains), "testisinuse2\n", check.Commentf("volume 'testisinuse2' in output, but not expected")) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "dangling=0") - // dangling=0 is same as dangling=false case - c.Assert(out, check.Not(checker.Contains), "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output")) - c.Assert(out, checker.Contains, "testisinuse1\n", check.Commentf("expected volume 'testisinuse1' in output")) - c.Assert(out, checker.Contains, "testisinuse2\n", check.Commentf("expected volume 'testisinuse2' in output")) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "name=testisin") - c.Assert(out, check.Not(checker.Contains), "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output")) - c.Assert(out, checker.Contains, "testisinuse1\n", check.Commentf("execpeted volume 'testisinuse1' in output")) - c.Assert(out, checker.Contains, "testisinuse2\n", check.Commentf("expected volume 'testisinuse2' in output")) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "driver=invalidDriver") - outArr := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 1, check.Commentf("%s\n", out)) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "driver=local") - outArr = strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 4, check.Commentf("\n%s", out)) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "driver=loc") - outArr = strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 4, check.Commentf("\n%s", out)) - -} - -func (s *DockerSuite) TestVolumeCLILsErrorWithInvalidFilterName(c *check.C) { - out, _, err := dockerCmdWithError("volume", "ls", "-f", "FOO=123") - c.Assert(err, checker.NotNil) - c.Assert(out, checker.Contains, "Invalid filter") -} - -func (s *DockerSuite) TestVolumeCLILsWithIncorrectFilterValue(c *check.C) { - out, _, err := dockerCmdWithError("volume", "ls", "-f", "dangling=invalid") - c.Assert(err, check.NotNil) - c.Assert(out, checker.Contains, "Invalid filter") -} - -func (s *DockerSuite) TestVolumeCLIRm(c *check.C) { - prefix, _ := getPrefixAndSlashFromDaemonPlatform() - out, _ := dockerCmd(c, "volume", "create") - id := strings.TrimSpace(out) - - dockerCmd(c, "volume", "create", "test") - dockerCmd(c, "volume", "rm", id) - dockerCmd(c, "volume", "rm", "test") - - out, _ = dockerCmd(c, "volume", "ls") - outArr := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 1, check.Commentf("%s\n", out)) - - volumeID := "testing" - dockerCmd(c, "run", "-v", volumeID+":"+prefix+"/foo", "--name=test", "busybox", "sh", "-c", "echo hello > /foo/bar") - out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "volume", "rm", "testing")) - c.Assert( - err, - check.Not(check.IsNil), - check.Commentf("Should not be able to remove volume that is in use by a container\n%s", out)) - - out, _ = dockerCmd(c, "run", "--volumes-from=test", "--name=test2", "busybox", "sh", "-c", "cat /foo/bar") - c.Assert(strings.TrimSpace(out), check.Equals, "hello") - dockerCmd(c, "rm", "-fv", "test2") - dockerCmd(c, "volume", "inspect", volumeID) - dockerCmd(c, "rm", "-f", "test") - - out, _ = dockerCmd(c, "run", "--name=test2", "-v", volumeID+":"+prefix+"/foo", "busybox", "sh", "-c", "cat /foo/bar") - c.Assert(strings.TrimSpace(out), check.Equals, "hello", check.Commentf("volume data was removed")) - dockerCmd(c, "rm", "test2") - - dockerCmd(c, "volume", "rm", volumeID) - c.Assert( - exec.Command("volume", "rm", "doesntexist").Run(), - check.Not(check.IsNil), - check.Commentf("volume rm should fail with non-existent volume"), - ) -} - -func (s *DockerSuite) TestVolumeCLINoArgs(c *check.C) { - out, _ := dockerCmd(c, "volume") - // no args should produce the cmd usage output - usage := "Usage: docker volume COMMAND" - c.Assert(out, checker.Contains, usage) - - // invalid arg should error and show the command usage on stderr - _, stderr, _, err := runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "somearg")) - c.Assert(err, check.NotNil, check.Commentf(stderr)) - c.Assert(stderr, checker.Contains, usage) - - // invalid flag should error and show the flag error and cmd usage - _, stderr, _, err = runCommandWithStdoutStderr(exec.Command(dockerBinary, "volume", "--no-such-flag")) - c.Assert(err, check.NotNil, check.Commentf(stderr)) - c.Assert(stderr, checker.Contains, usage) - c.Assert(stderr, checker.Contains, "unknown flag: --no-such-flag") -} - -func (s *DockerSuite) TestVolumeCLIInspectTmplError(c *check.C) { - out, _ := dockerCmd(c, "volume", "create") - name := strings.TrimSpace(out) - - out, exitCode, err := dockerCmdWithError("volume", "inspect", "--format='{{ .FooBar }}'", name) - c.Assert(err, checker.NotNil, check.Commentf("Output: %s", out)) - c.Assert(exitCode, checker.Equals, 1, check.Commentf("Output: %s", out)) - c.Assert(out, checker.Contains, "Template parsing error") -} - -func (s *DockerSuite) TestVolumeCLICreateWithOpts(c *check.C) { - testRequires(c, DaemonIsLinux) - - dockerCmd(c, "volume", "create", "-d", "local", "test", "--opt=type=tmpfs", "--opt=device=tmpfs", "--opt=o=size=1m,uid=1000") - out, _ := dockerCmd(c, "run", "-v", "test:/foo", "busybox", "mount") - - mounts := strings.Split(out, "\n") - var found bool - for _, m := range mounts { - if strings.Contains(m, "/foo") { - found = true - info := strings.Fields(m) - // tmpfs on type tmpfs (rw,relatime,size=1024k,uid=1000) - c.Assert(info[0], checker.Equals, "tmpfs") - c.Assert(info[2], checker.Equals, "/foo") - c.Assert(info[4], checker.Equals, "tmpfs") - c.Assert(info[5], checker.Contains, "uid=1000") - c.Assert(info[5], checker.Contains, "size=1024k") - } - } - c.Assert(found, checker.Equals, true) -} - -func (s *DockerSuite) TestVolumeCLICreateLabel(c *check.C) { - testVol := "testvolcreatelabel" - testLabel := "foo" - testValue := "bar" - - out, _, err := dockerCmdWithError("volume", "create", "--label", testLabel+"="+testValue, testVol) - c.Assert(err, check.IsNil) - - out, _ = dockerCmd(c, "volume", "inspect", "--format={{ .Labels."+testLabel+" }}", testVol) - c.Assert(strings.TrimSpace(out), check.Equals, testValue) -} - -func (s *DockerSuite) TestVolumeCLICreateLabelMultiple(c *check.C) { - testVol := "testvolcreatelabel" - - testLabels := map[string]string{ - "foo": "bar", - "baz": "foo", - } - - args := []string{ - "volume", - "create", - testVol, - } - - for k, v := range testLabels { - args = append(args, "--label", k+"="+v) - } - - out, _, err := dockerCmdWithError(args...) - c.Assert(err, check.IsNil) - - for k, v := range testLabels { - out, _ = dockerCmd(c, "volume", "inspect", "--format={{ .Labels."+k+" }}", testVol) - c.Assert(strings.TrimSpace(out), check.Equals, v) - } -} - -func (s *DockerSuite) TestVolumeCLILsFilterLabels(c *check.C) { - testVol1 := "testvolcreatelabel-1" - out, _, err := dockerCmdWithError("volume", "create", "--label", "foo=bar1", testVol1) - c.Assert(err, check.IsNil) - - testVol2 := "testvolcreatelabel-2" - out, _, err = dockerCmdWithError("volume", "create", "--label", "foo=bar2", testVol2) - c.Assert(err, check.IsNil) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "label=foo") - - // filter with label=key - c.Assert(out, checker.Contains, "testvolcreatelabel-1\n", check.Commentf("expected volume 'testvolcreatelabel-1' in output")) - c.Assert(out, checker.Contains, "testvolcreatelabel-2\n", check.Commentf("expected volume 'testvolcreatelabel-2' in output")) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "label=foo=bar1") - - // filter with label=key=value - c.Assert(out, checker.Contains, "testvolcreatelabel-1\n", check.Commentf("expected volume 'testvolcreatelabel-1' in output")) - c.Assert(out, check.Not(checker.Contains), "testvolcreatelabel-2\n", check.Commentf("expected volume 'testvolcreatelabel-2 in output")) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "label=non-exist") - outArr := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 1, check.Commentf("\n%s", out)) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "label=foo=non-exist") - outArr = strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 1, check.Commentf("\n%s", out)) -} - -func (s *DockerSuite) TestVolumeCLIRmForceUsage(c *check.C) { - out, _ := dockerCmd(c, "volume", "create") - id := strings.TrimSpace(out) - - dockerCmd(c, "volume", "rm", "-f", id) - dockerCmd(c, "volume", "rm", "--force", "nonexist") - - out, _ = dockerCmd(c, "volume", "ls") - outArr := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 1, check.Commentf("%s\n", out)) -} - -func (s *DockerSuite) TestVolumeCLIRmForce(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) - - name := "test" - out, _ := dockerCmd(c, "volume", "create", name) - id := strings.TrimSpace(out) - c.Assert(id, checker.Equals, name) - - out, _ = dockerCmd(c, "volume", "inspect", "--format", "{{.Mountpoint}}", name) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - // Mountpoint is in the form of "/var/lib/docker/volumes/.../_data", removing `/_data` - path := strings.TrimSuffix(strings.TrimSpace(out), "/_data") - out, _, err := runCommandWithOutput(exec.Command("rm", "-rf", path)) - c.Assert(err, check.IsNil) - - dockerCmd(c, "volume", "rm", "-f", "test") - out, _ = dockerCmd(c, "volume", "ls") - c.Assert(out, checker.Not(checker.Contains), name) - dockerCmd(c, "volume", "create", "test") - out, _ = dockerCmd(c, "volume", "ls") - c.Assert(out, checker.Contains, name) -} - -func (s *DockerSuite) TestVolumeCliInspectWithVolumeOpts(c *check.C) { - testRequires(c, DaemonIsLinux) - - // Without options - name := "test1" - dockerCmd(c, "volume", "create", "-d", "local", name) - out, _ := dockerCmd(c, "volume", "inspect", "--format={{ .Options }}", name) - c.Assert(strings.TrimSpace(out), checker.Contains, "map[]") - - // With options - name = "test2" - k1, v1 := "type", "tmpfs" - k2, v2 := "device", "tmpfs" - k3, v3 := "o", "size=1m,uid=1000" - dockerCmd(c, "volume", "create", "-d", "local", name, "--opt", fmt.Sprintf("%s=%s", k1, v1), "--opt", fmt.Sprintf("%s=%s", k2, v2), "--opt", fmt.Sprintf("%s=%s", k3, v3)) - out, _ = dockerCmd(c, "volume", "inspect", "--format={{ .Options }}", name) - c.Assert(strings.TrimSpace(out), checker.Contains, fmt.Sprintf("%s:%s", k1, v1)) - c.Assert(strings.TrimSpace(out), checker.Contains, fmt.Sprintf("%s:%s", k2, v2)) - c.Assert(strings.TrimSpace(out), checker.Contains, fmt.Sprintf("%s:%s", k3, v3)) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_wait_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_wait_test.go deleted file mode 100644 index 961aef552..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_wait_test.go +++ /dev/null @@ -1,97 +0,0 @@ -package main - -import ( - "bytes" - "os/exec" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// non-blocking wait with 0 exit code -func (s *DockerSuite) TestWaitNonBlockedExitZero(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", "true") - containerID := strings.TrimSpace(out) - - err := waitInspect(containerID, "{{.State.Running}}", "false", 30*time.Second) - c.Assert(err, checker.IsNil) //Container should have stopped by now - - out, _ = dockerCmd(c, "wait", containerID) - c.Assert(strings.TrimSpace(out), checker.Equals, "0", check.Commentf("failed to set up container, %v", out)) - -} - -// blocking wait with 0 exit code -func (s *DockerSuite) TestWaitBlockedExitZero(c *check.C) { - // Windows busybox does not support trap in this way, not sleep with sub-second - // granularity. It will always exit 0x40010004. - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "trap 'exit 0' TERM; while true; do usleep 10; done") - containerID := strings.TrimSpace(out) - - c.Assert(waitRun(containerID), checker.IsNil) - - chWait := make(chan string) - go func() { - chWait <- "" - out, _, _ := runCommandWithOutput(exec.Command(dockerBinary, "wait", containerID)) - chWait <- out - }() - - <-chWait // make sure the goroutine is started - time.Sleep(100 * time.Millisecond) - dockerCmd(c, "stop", containerID) - - select { - case status := <-chWait: - c.Assert(strings.TrimSpace(status), checker.Equals, "0", check.Commentf("expected exit 0, got %s", status)) - case <-time.After(2 * time.Second): - c.Fatal("timeout waiting for `docker wait` to exit") - } - -} - -// non-blocking wait with random exit code -func (s *DockerSuite) TestWaitNonBlockedExitRandom(c *check.C) { - out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", "exit 99") - containerID := strings.TrimSpace(out) - - err := waitInspect(containerID, "{{.State.Running}}", "false", 30*time.Second) - c.Assert(err, checker.IsNil) //Container should have stopped by now - out, _ = dockerCmd(c, "wait", containerID) - c.Assert(strings.TrimSpace(out), checker.Equals, "99", check.Commentf("failed to set up container, %v", out)) - -} - -// blocking wait with random exit code -func (s *DockerSuite) TestWaitBlockedExitRandom(c *check.C) { - // Cannot run on Windows as trap in Windows busybox does not support trap in this way. - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "trap 'exit 99' TERM; while true; do usleep 10; done") - containerID := strings.TrimSpace(out) - c.Assert(waitRun(containerID), checker.IsNil) - - chWait := make(chan error) - waitCmd := exec.Command(dockerBinary, "wait", containerID) - waitCmdOut := bytes.NewBuffer(nil) - waitCmd.Stdout = waitCmdOut - c.Assert(waitCmd.Start(), checker.IsNil) - go func() { - chWait <- waitCmd.Wait() - }() - - dockerCmd(c, "stop", containerID) - - select { - case err := <-chWait: - c.Assert(err, checker.IsNil, check.Commentf(waitCmdOut.String())) - status, err := waitCmdOut.ReadString('\n') - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(status), checker.Equals, "99", check.Commentf("expected exit 99, got %s", status)) - case <-time.After(2 * time.Second): - waitCmd.Process.Kill() - c.Fatal("timeout waiting for `docker wait` to exit") - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_test.go b/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_test.go deleted file mode 100644 index 7bc287eca..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_test.go +++ /dev/null @@ -1,227 +0,0 @@ -// This file will be removed when we completely drop support for -// passing HostConfig to container start API. - -package main - -import ( - "net/http" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func formatV123StartAPIURL(url string) string { - return "/v1.23" + url -} - -func (s *DockerSuite) TestDeprecatedContainerAPIStartHostConfig(c *check.C) { - name := "test-deprecated-api-124" - dockerCmd(c, "create", "--name", name, "busybox") - config := map[string]interface{}{ - "Binds": []string{"/aa:/bb"}, - } - status, body, err := sockRequest("POST", "/containers/"+name+"/start", config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusBadRequest) - c.Assert(string(body), checker.Contains, "was deprecated since v1.10") -} - -func (s *DockerSuite) TestDeprecatedContainerAPIStartVolumeBinds(c *check.C) { - // TODO Windows CI: Investigate further why this fails on Windows to Windows CI. - testRequires(c, DaemonIsLinux) - path := "/foo" - if daemonPlatform == "windows" { - path = `c:\foo` - } - name := "testing" - config := map[string]interface{}{ - "Image": "busybox", - "Volumes": map[string]struct{}{path: {}}, - } - - status, _, err := sockRequest("POST", formatV123StartAPIURL("/containers/create?name="+name), config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - bindPath := randomTmpDirPath("test", daemonPlatform) - config = map[string]interface{}{ - "Binds": []string{bindPath + ":" + path}, - } - status, _, err = sockRequest("POST", formatV123StartAPIURL("/containers/"+name+"/start"), config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - - pth, err := inspectMountSourceField(name, path) - c.Assert(err, checker.IsNil) - c.Assert(pth, checker.Equals, bindPath, check.Commentf("expected volume host path to be %s, got %s", bindPath, pth)) -} - -// Test for GH#10618 -func (s *DockerSuite) TestDeprecatedContainerAPIStartDupVolumeBinds(c *check.C) { - // TODO Windows to Windows CI - Port this - testRequires(c, DaemonIsLinux) - name := "testdups" - config := map[string]interface{}{ - "Image": "busybox", - "Volumes": map[string]struct{}{"/tmp": {}}, - } - - status, _, err := sockRequest("POST", formatV123StartAPIURL("/containers/create?name="+name), config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - bindPath1 := randomTmpDirPath("test1", daemonPlatform) - bindPath2 := randomTmpDirPath("test2", daemonPlatform) - - config = map[string]interface{}{ - "Binds": []string{bindPath1 + ":/tmp", bindPath2 + ":/tmp"}, - } - status, body, err := sockRequest("POST", formatV123StartAPIURL("/containers/"+name+"/start"), config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusInternalServerError) - c.Assert(string(body), checker.Contains, "Duplicate mount point", check.Commentf("Expected failure due to duplicate bind mounts to same path, instead got: %q with error: %v", string(body), err)) -} - -func (s *DockerSuite) TestDeprecatedContainerAPIStartVolumesFrom(c *check.C) { - // TODO Windows to Windows CI - Port this - testRequires(c, DaemonIsLinux) - volName := "voltst" - volPath := "/tmp" - - dockerCmd(c, "run", "--name", volName, "-v", volPath, "busybox") - - name := "TestContainerAPIStartVolumesFrom" - config := map[string]interface{}{ - "Image": "busybox", - "Volumes": map[string]struct{}{volPath: {}}, - } - - status, _, err := sockRequest("POST", formatV123StartAPIURL("/containers/create?name="+name), config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) - - config = map[string]interface{}{ - "VolumesFrom": []string{volName}, - } - status, _, err = sockRequest("POST", formatV123StartAPIURL("/containers/"+name+"/start"), config) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - - pth, err := inspectMountSourceField(name, volPath) - c.Assert(err, checker.IsNil) - pth2, err := inspectMountSourceField(volName, volPath) - c.Assert(err, checker.IsNil) - c.Assert(pth, checker.Equals, pth2, check.Commentf("expected volume host path to be %s, got %s", pth, pth2)) -} - -// #9981 - Allow a docker created volume (ie, one in /var/lib/docker/volumes) to be used to overwrite (via passing in Binds on api start) an existing volume -func (s *DockerSuite) TestDeprecatedPostContainerBindNormalVolume(c *check.C) { - // TODO Windows to Windows CI - Port this - testRequires(c, DaemonIsLinux) - dockerCmd(c, "create", "-v", "/foo", "--name=one", "busybox") - - fooDir, err := inspectMountSourceField("one", "/foo") - c.Assert(err, checker.IsNil) - - dockerCmd(c, "create", "-v", "/foo", "--name=two", "busybox") - - bindSpec := map[string][]string{"Binds": {fooDir + ":/foo"}} - status, _, err := sockRequest("POST", formatV123StartAPIURL("/containers/two/start"), bindSpec) - c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusNoContent) - - fooDir2, err := inspectMountSourceField("two", "/foo") - c.Assert(err, checker.IsNil) - c.Assert(fooDir2, checker.Equals, fooDir, check.Commentf("expected volume path to be %s, got: %s", fooDir, fooDir2)) -} - -func (s *DockerSuite) TestDeprecatedStartWithTooLowMemoryLimit(c *check.C) { - // TODO Windows: Port once memory is supported - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "create", "busybox") - - containerID := strings.TrimSpace(out) - - config := `{ - "CpuShares": 100, - "Memory": 524287 - }` - - res, body, err := sockRequestRaw("POST", formatV123StartAPIURL("/containers/"+containerID+"/start"), strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - b, err2 := readBody(body) - c.Assert(err2, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - c.Assert(string(b), checker.Contains, "Minimum memory limit allowed is 4MB") -} - -// #14640 -func (s *DockerSuite) TestDeprecatedPostContainersStartWithoutLinksInHostConfig(c *check.C) { - // TODO Windows: Windows doesn't support supplying a hostconfig on start. - // An alternate test could be written to validate the negative testing aspect of this - testRequires(c, DaemonIsLinux) - name := "test-host-config-links" - dockerCmd(c, append([]string{"create", "--name", name, "busybox"}, sleepCommandForDaemonPlatform()...)...) - - hc := inspectFieldJSON(c, name, "HostConfig") - config := `{"HostConfig":` + hc + `}` - - res, b, err := sockRequestRaw("POST", formatV123StartAPIURL("/containers/"+name+"/start"), strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusNoContent) - b.Close() -} - -// #14640 -func (s *DockerSuite) TestDeprecatedPostContainersStartWithLinksInHostConfig(c *check.C) { - // TODO Windows: Windows doesn't support supplying a hostconfig on start. - // An alternate test could be written to validate the negative testing aspect of this - testRequires(c, DaemonIsLinux) - name := "test-host-config-links" - dockerCmd(c, "run", "--name", "foo", "-d", "busybox", "top") - dockerCmd(c, "create", "--name", name, "--link", "foo:bar", "busybox", "top") - - hc := inspectFieldJSON(c, name, "HostConfig") - config := `{"HostConfig":` + hc + `}` - - res, b, err := sockRequestRaw("POST", formatV123StartAPIURL("/containers/"+name+"/start"), strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusNoContent) - b.Close() -} - -// #14640 -func (s *DockerSuite) TestDeprecatedPostContainersStartWithLinksInHostConfigIdLinked(c *check.C) { - // Windows does not support links - testRequires(c, DaemonIsLinux) - name := "test-host-config-links" - out, _ := dockerCmd(c, "run", "--name", "link0", "-d", "busybox", "top") - id := strings.TrimSpace(out) - dockerCmd(c, "create", "--name", name, "--link", id, "busybox", "top") - - hc := inspectFieldJSON(c, name, "HostConfig") - config := `{"HostConfig":` + hc + `}` - - res, b, err := sockRequestRaw("POST", formatV123StartAPIURL("/containers/"+name+"/start"), strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusNoContent) - b.Close() -} - -func (s *DockerSuite) TestDeprecatedStartWithNilDNS(c *check.C) { - // TODO Windows: Add once DNS is supported - testRequires(c, DaemonIsLinux) - out, _ := dockerCmd(c, "create", "busybox") - containerID := strings.TrimSpace(out) - - config := `{"HostConfig": {"Dns": null}}` - - res, b, err := sockRequestRaw("POST", formatV123StartAPIURL("/containers/"+containerID+"/start"), strings.NewReader(config), "application/json") - c.Assert(err, checker.IsNil) - c.Assert(res.StatusCode, checker.Equals, http.StatusNoContent) - b.Close() - - dns := inspectFieldJSON(c, containerID, "HostConfig.Dns") - c.Assert(dns, checker.Equals, "[]") -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_unix_test.go deleted file mode 100644 index 94ef9b1a0..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_unix_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build !windows - -package main - -import ( - "fmt" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// #19100 This is a deprecated feature test, it should be removed in Docker 1.12 -func (s *DockerNetworkSuite) TestDeprecatedDockerNetworkStartAPIWithHostconfig(c *check.C) { - netName := "test" - conName := "foo" - dockerCmd(c, "network", "create", netName) - dockerCmd(c, "create", "--name", conName, "busybox", "top") - - config := map[string]interface{}{ - "HostConfig": map[string]interface{}{ - "NetworkMode": netName, - }, - } - _, _, err := sockRequest("POST", formatV123StartAPIURL("/containers/"+conName+"/start"), config) - c.Assert(err, checker.IsNil) - c.Assert(waitRun(conName), checker.IsNil) - networks := inspectField(c, conName, "NetworkSettings.Networks") - c.Assert(networks, checker.Contains, netName, check.Commentf(fmt.Sprintf("Should contain '%s' network", netName))) - c.Assert(networks, checker.Not(checker.Contains), "bridge", check.Commentf("Should not contain 'bridge' network")) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_experimental_network_test.go b/vendor/github.com/docker/docker/integration-cli/docker_experimental_network_test.go deleted file mode 100644 index 85dec3194..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_experimental_network_test.go +++ /dev/null @@ -1,594 +0,0 @@ -// +build !windows - -package main - -import ( - "os/exec" - "strings" - "time" - - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/docker/docker/pkg/parsers/kernel" - "github.com/go-check/check" -) - -var ( - MacvlanKernelSupport = testRequirement{ - func() bool { - const macvlanKernelVer = 3 // minimum macvlan kernel support - const macvlanMajorVer = 9 // minimum macvlan major kernel support - kv, err := kernel.GetKernelVersion() - if err != nil { - return false - } - // ensure Kernel version is >= v3.9 for macvlan support - if kv.Kernel < macvlanKernelVer || (kv.Kernel == macvlanKernelVer && kv.Major < macvlanMajorVer) { - return false - } - return true - }, - "kernel version failed to meet the minimum macvlan kernel requirement of 3.9", - } - IpvlanKernelSupport = testRequirement{ - func() bool { - const ipvlanKernelVer = 4 // minimum ipvlan kernel support - const ipvlanMajorVer = 2 // minimum ipvlan major kernel support - kv, err := kernel.GetKernelVersion() - if err != nil { - return false - } - // ensure Kernel version is >= v4.2 for ipvlan support - if kv.Kernel < ipvlanKernelVer || (kv.Kernel == ipvlanKernelVer && kv.Major < ipvlanMajorVer) { - return false - } - return true - }, - "kernel version failed to meet the minimum ipvlan kernel requirement of 4.0.0", - } -) - -func (s *DockerNetworkSuite) TestDockerNetworkMacvlanPersistance(c *check.C) { - // verify the driver automatically provisions the 802.1q link (dm-dummy0.60) - testRequires(c, DaemonIsLinux, MacvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - - // master dummy interface 'dm' abbreviation represents 'docker macvlan' - master := "dm-dummy0" - // simulate the master link the vlan tagged subinterface parent link will use - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) - // create a network specifying the desired sub-interface name - dockerCmd(c, "network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0.60", "dm-persist") - assertNwIsAvailable(c, "dm-persist") - // Restart docker daemon to test the config has persisted to disk - s.d.Restart() - // verify network is recreated from persistence - assertNwIsAvailable(c, "dm-persist") - // cleanup the master interface that also collects the slave dev - deleteInterface(c, "dm-dummy0") -} - -func (s *DockerNetworkSuite) TestDockerNetworkIpvlanPersistance(c *check.C) { - // verify the driver automatically provisions the 802.1q link (di-dummy0.70) - testRequires(c, DaemonIsLinux, IpvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - // master dummy interface 'di' notation represent 'docker ipvlan' - master := "di-dummy0" - // simulate the master link the vlan tagged subinterface parent link will use - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) - // create a network specifying the desired sub-interface name - dockerCmd(c, "network", "create", "--driver=ipvlan", "-o", "parent=di-dummy0.70", "di-persist") - assertNwIsAvailable(c, "di-persist") - // Restart docker daemon to test the config has persisted to disk - s.d.Restart() - // verify network is recreated from persistence - assertNwIsAvailable(c, "di-persist") - // cleanup the master interface that also collects the slave dev - deleteInterface(c, "di-dummy0") -} - -func (s *DockerNetworkSuite) TestDockerNetworkMacvlanSubIntCreate(c *check.C) { - // verify the driver automatically provisions the 802.1q link (dm-dummy0.50) - testRequires(c, DaemonIsLinux, MacvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - // master dummy interface 'dm' abbreviation represents 'docker macvlan' - master := "dm-dummy0" - // simulate the master link the vlan tagged subinterface parent link will use - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) - // create a network specifying the desired sub-interface name - dockerCmd(c, "network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0.50", "dm-subinterface") - assertNwIsAvailable(c, "dm-subinterface") - // cleanup the master interface which also collects the slave dev - deleteInterface(c, "dm-dummy0") -} - -func (s *DockerNetworkSuite) TestDockerNetworkIpvlanSubIntCreate(c *check.C) { - // verify the driver automatically provisions the 802.1q link (di-dummy0.50) - testRequires(c, DaemonIsLinux, IpvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - // master dummy interface 'dm' abbreviation represents 'docker ipvlan' - master := "di-dummy0" - // simulate the master link the vlan tagged subinterface parent link will use - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) - // create a network specifying the desired sub-interface name - dockerCmd(c, "network", "create", "--driver=ipvlan", "-o", "parent=di-dummy0.60", "di-subinterface") - assertNwIsAvailable(c, "di-subinterface") - // cleanup the master interface which also collects the slave dev - deleteInterface(c, "di-dummy0") -} - -func (s *DockerNetworkSuite) TestDockerNetworkMacvlanOverlapParent(c *check.C) { - // verify the same parent interface cannot be used if already in use by an existing network - testRequires(c, DaemonIsLinux, MacvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - // master dummy interface 'dm' abbreviation represents 'docker macvlan' - master := "dm-dummy0" - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) - out, err = createVlanInterface(c, master, "dm-dummy0.40", "40") - c.Assert(err, check.IsNil, check.Commentf(out)) - // create a network using an existing parent interface - dockerCmd(c, "network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0.40", "dm-subinterface") - assertNwIsAvailable(c, "dm-subinterface") - // attempt to create another network using the same parent iface that should fail - out, _, err = dockerCmdWithError("network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0.40", "dm-parent-net-overlap") - // verify that the overlap returns an error - c.Assert(err, check.NotNil) - // cleanup the master interface which also collects the slave dev - deleteInterface(c, "dm-dummy0") -} - -func (s *DockerNetworkSuite) TestDockerNetworkIpvlanOverlapParent(c *check.C) { - // verify the same parent interface cannot be used if already in use by an existing network - testRequires(c, DaemonIsLinux, IpvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - // master dummy interface 'dm' abbreviation represents 'docker ipvlan' - master := "di-dummy0" - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) - out, err = createVlanInterface(c, master, "di-dummy0.30", "30") - c.Assert(err, check.IsNil, check.Commentf(out)) - // create a network using an existing parent interface - dockerCmd(c, "network", "create", "--driver=ipvlan", "-o", "parent=di-dummy0.30", "di-subinterface") - assertNwIsAvailable(c, "di-subinterface") - // attempt to create another network using the same parent iface that should fail - out, _, err = dockerCmdWithError("network", "create", "--driver=ipvlan", "-o", "parent=di-dummy0.30", "di-parent-net-overlap") - // verify that the overlap returns an error - c.Assert(err, check.NotNil) - // cleanup the master interface which also collects the slave dev - deleteInterface(c, "di-dummy0") -} - -func (s *DockerNetworkSuite) TestDockerNetworkMacvlanMultiSubnet(c *check.C) { - // create a dual stack multi-subnet Macvlan bridge mode network and validate connectivity between four containers, two on each subnet - testRequires(c, DaemonIsLinux, IPv6, MacvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - dockerCmd(c, "network", "create", "--driver=macvlan", "--ipv6", "--subnet=172.28.100.0/24", "--subnet=172.28.102.0/24", "--gateway=172.28.102.254", - "--subnet=2001:db8:abc2::/64", "--subnet=2001:db8:abc4::/64", "--gateway=2001:db8:abc4::254", "dualstackbridge") - // Ensure the network was created - assertNwIsAvailable(c, "dualstackbridge") - // start dual stack containers and verify the user specified --ip and --ip6 addresses on subnets 172.28.100.0/24 and 2001:db8:abc2::/64 - dockerCmd(c, "run", "-d", "--net=dualstackbridge", "--name=first", "--ip", "172.28.100.20", "--ip6", "2001:db8:abc2::20", "busybox", "top") - dockerCmd(c, "run", "-d", "--net=dualstackbridge", "--name=second", "--ip", "172.28.100.21", "--ip6", "2001:db8:abc2::21", "busybox", "top") - - // Inspect and store the v4 address from specified container on the network dualstackbridge - ip := inspectField(c, "first", "NetworkSettings.Networks.dualstackbridge.IPAddress") - // Inspect and store the v6 address from specified container on the network dualstackbridge - ip6 := inspectField(c, "first", "NetworkSettings.Networks.dualstackbridge.GlobalIPv6Address") - - // verify ipv4 connectivity to the explicit --ipv address second to first - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", strings.TrimSpace(ip)) - c.Assert(err, check.IsNil) - // verify ipv6 connectivity to the explicit --ipv6 address second to first - c.Skip("Temporarily skipping while invesitigating sporadic v6 CI issues") - _, _, err = dockerCmdWithError("exec", "second", "ping6", "-c", "1", strings.TrimSpace(ip6)) - c.Assert(err, check.IsNil) - - // start dual stack containers and verify the user specified --ip and --ip6 addresses on subnets 172.28.102.0/24 and 2001:db8:abc4::/64 - dockerCmd(c, "run", "-d", "--net=dualstackbridge", "--name=third", "--ip", "172.28.102.20", "--ip6", "2001:db8:abc4::20", "busybox", "top") - dockerCmd(c, "run", "-d", "--net=dualstackbridge", "--name=fourth", "--ip", "172.28.102.21", "--ip6", "2001:db8:abc4::21", "busybox", "top") - - // Inspect and store the v4 address from specified container on the network dualstackbridge - ip = inspectField(c, "third", "NetworkSettings.Networks.dualstackbridge.IPAddress") - // Inspect and store the v6 address from specified container on the network dualstackbridge - ip6 = inspectField(c, "third", "NetworkSettings.Networks.dualstackbridge.GlobalIPv6Address") - - // verify ipv4 connectivity to the explicit --ipv address from third to fourth - _, _, err = dockerCmdWithError("exec", "fourth", "ping", "-c", "1", strings.TrimSpace(ip)) - c.Assert(err, check.IsNil) - // verify ipv6 connectivity to the explicit --ipv6 address from third to fourth - _, _, err = dockerCmdWithError("exec", "fourth", "ping6", "-c", "1", strings.TrimSpace(ip6)) - c.Assert(err, check.IsNil) - - // Inspect the v4 gateway to ensure the proper default GW was assigned - ip4gw := inspectField(c, "first", "NetworkSettings.Networks.dualstackbridge.Gateway") - c.Assert(strings.TrimSpace(ip4gw), check.Equals, "172.28.100.1") - // Inspect the v6 gateway to ensure the proper default GW was assigned - ip6gw := inspectField(c, "first", "NetworkSettings.Networks.dualstackbridge.IPv6Gateway") - c.Assert(strings.TrimSpace(ip6gw), check.Equals, "2001:db8:abc2::1") - - // Inspect the v4 gateway to ensure the proper explicitly assigned default GW was assigned - ip4gw = inspectField(c, "third", "NetworkSettings.Networks.dualstackbridge.Gateway") - c.Assert(strings.TrimSpace(ip4gw), check.Equals, "172.28.102.254") - // Inspect the v6 gateway to ensure the proper explicitly assigned default GW was assigned - ip6gw = inspectField(c, "third", "NetworkSettings.Networks.dualstackbridge.IPv6Gateway") - c.Assert(strings.TrimSpace(ip6gw), check.Equals, "2001:db8:abc4::254") -} - -func (s *DockerNetworkSuite) TestDockerNetworkIpvlanL2MultiSubnet(c *check.C) { - // create a dual stack multi-subnet Ipvlan L2 network and validate connectivity within the subnets, two on each subnet - testRequires(c, DaemonIsLinux, IPv6, IpvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - dockerCmd(c, "network", "create", "--driver=ipvlan", "--ipv6", "--subnet=172.28.200.0/24", "--subnet=172.28.202.0/24", "--gateway=172.28.202.254", - "--subnet=2001:db8:abc8::/64", "--subnet=2001:db8:abc6::/64", "--gateway=2001:db8:abc6::254", "dualstackl2") - // Ensure the network was created - assertNwIsAvailable(c, "dualstackl2") - // start dual stack containers and verify the user specified --ip and --ip6 addresses on subnets 172.28.200.0/24 and 2001:db8:abc8::/64 - dockerCmd(c, "run", "-d", "--net=dualstackl2", "--name=first", "--ip", "172.28.200.20", "--ip6", "2001:db8:abc8::20", "busybox", "top") - dockerCmd(c, "run", "-d", "--net=dualstackl2", "--name=second", "--ip", "172.28.200.21", "--ip6", "2001:db8:abc8::21", "busybox", "top") - - // Inspect and store the v4 address from specified container on the network dualstackl2 - ip := inspectField(c, "first", "NetworkSettings.Networks.dualstackl2.IPAddress") - // Inspect and store the v6 address from specified container on the network dualstackl2 - ip6 := inspectField(c, "first", "NetworkSettings.Networks.dualstackl2.GlobalIPv6Address") - - // verify ipv4 connectivity to the explicit --ipv address second to first - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", strings.TrimSpace(ip)) - c.Assert(err, check.IsNil) - // verify ipv6 connectivity to the explicit --ipv6 address second to first - _, _, err = dockerCmdWithError("exec", "second", "ping6", "-c", "1", strings.TrimSpace(ip6)) - c.Assert(err, check.IsNil) - - // start dual stack containers and verify the user specified --ip and --ip6 addresses on subnets 172.28.202.0/24 and 2001:db8:abc6::/64 - dockerCmd(c, "run", "-d", "--net=dualstackl2", "--name=third", "--ip", "172.28.202.20", "--ip6", "2001:db8:abc6::20", "busybox", "top") - dockerCmd(c, "run", "-d", "--net=dualstackl2", "--name=fourth", "--ip", "172.28.202.21", "--ip6", "2001:db8:abc6::21", "busybox", "top") - - // Inspect and store the v4 address from specified container on the network dualstackl2 - ip = inspectField(c, "third", "NetworkSettings.Networks.dualstackl2.IPAddress") - // Inspect and store the v6 address from specified container on the network dualstackl2 - ip6 = inspectField(c, "third", "NetworkSettings.Networks.dualstackl2.GlobalIPv6Address") - - // verify ipv4 connectivity to the explicit --ipv address from third to fourth - _, _, err = dockerCmdWithError("exec", "fourth", "ping", "-c", "1", strings.TrimSpace(ip)) - c.Assert(err, check.IsNil) - // verify ipv6 connectivity to the explicit --ipv6 address from third to fourth - _, _, err = dockerCmdWithError("exec", "fourth", "ping6", "-c", "1", strings.TrimSpace(ip6)) - c.Assert(err, check.IsNil) - - // Inspect the v4 gateway to ensure the proper default GW was assigned - ip4gw := inspectField(c, "first", "NetworkSettings.Networks.dualstackl2.Gateway") - c.Assert(strings.TrimSpace(ip4gw), check.Equals, "172.28.200.1") - // Inspect the v6 gateway to ensure the proper default GW was assigned - ip6gw := inspectField(c, "first", "NetworkSettings.Networks.dualstackl2.IPv6Gateway") - c.Assert(strings.TrimSpace(ip6gw), check.Equals, "2001:db8:abc8::1") - - // Inspect the v4 gateway to ensure the proper explicitly assigned default GW was assigned - ip4gw = inspectField(c, "third", "NetworkSettings.Networks.dualstackl2.Gateway") - c.Assert(strings.TrimSpace(ip4gw), check.Equals, "172.28.202.254") - // Inspect the v6 gateway to ensure the proper explicitly assigned default GW was assigned - ip6gw = inspectField(c, "third", "NetworkSettings.Networks.dualstackl2.IPv6Gateway") - c.Assert(strings.TrimSpace(ip6gw), check.Equals, "2001:db8:abc6::254") -} - -func (s *DockerNetworkSuite) TestDockerNetworkIpvlanL3MultiSubnet(c *check.C) { - // create a dual stack multi-subnet Ipvlan L3 network and validate connectivity between all four containers per L3 mode - testRequires(c, DaemonIsLinux, IPv6, IpvlanKernelSupport, NotUserNamespace, NotArm, IPv6, ExperimentalDaemon) - dockerCmd(c, "network", "create", "--driver=ipvlan", "--ipv6", "--subnet=172.28.10.0/24", "--subnet=172.28.12.0/24", "--gateway=172.28.12.254", - "--subnet=2001:db8:abc9::/64", "--subnet=2001:db8:abc7::/64", "--gateway=2001:db8:abc7::254", "-o", "ipvlan_mode=l3", "dualstackl3") - // Ensure the network was created - assertNwIsAvailable(c, "dualstackl3") - - // start dual stack containers and verify the user specified --ip and --ip6 addresses on subnets 172.28.10.0/24 and 2001:db8:abc9::/64 - dockerCmd(c, "run", "-d", "--net=dualstackl3", "--name=first", "--ip", "172.28.10.20", "--ip6", "2001:db8:abc9::20", "busybox", "top") - dockerCmd(c, "run", "-d", "--net=dualstackl3", "--name=second", "--ip", "172.28.10.21", "--ip6", "2001:db8:abc9::21", "busybox", "top") - - // Inspect and store the v4 address from specified container on the network dualstackl3 - ip := inspectField(c, "first", "NetworkSettings.Networks.dualstackl3.IPAddress") - // Inspect and store the v6 address from specified container on the network dualstackl3 - ip6 := inspectField(c, "first", "NetworkSettings.Networks.dualstackl3.GlobalIPv6Address") - - // verify ipv4 connectivity to the explicit --ipv address second to first - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", strings.TrimSpace(ip)) - c.Assert(err, check.IsNil) - // verify ipv6 connectivity to the explicit --ipv6 address second to first - _, _, err = dockerCmdWithError("exec", "second", "ping6", "-c", "1", strings.TrimSpace(ip6)) - c.Assert(err, check.IsNil) - - // start dual stack containers and verify the user specified --ip and --ip6 addresses on subnets 172.28.12.0/24 and 2001:db8:abc7::/64 - dockerCmd(c, "run", "-d", "--net=dualstackl3", "--name=third", "--ip", "172.28.12.20", "--ip6", "2001:db8:abc7::20", "busybox", "top") - dockerCmd(c, "run", "-d", "--net=dualstackl3", "--name=fourth", "--ip", "172.28.12.21", "--ip6", "2001:db8:abc7::21", "busybox", "top") - - // Inspect and store the v4 address from specified container on the network dualstackl3 - ip = inspectField(c, "third", "NetworkSettings.Networks.dualstackl3.IPAddress") - // Inspect and store the v6 address from specified container on the network dualstackl3 - ip6 = inspectField(c, "third", "NetworkSettings.Networks.dualstackl3.GlobalIPv6Address") - - // verify ipv4 connectivity to the explicit --ipv address from third to fourth - _, _, err = dockerCmdWithError("exec", "fourth", "ping", "-c", "1", strings.TrimSpace(ip)) - c.Assert(err, check.IsNil) - // verify ipv6 connectivity to the explicit --ipv6 address from third to fourth - _, _, err = dockerCmdWithError("exec", "fourth", "ping6", "-c", "1", strings.TrimSpace(ip6)) - c.Assert(err, check.IsNil) - - // Inspect and store the v4 address from specified container on the network dualstackl3 - ip = inspectField(c, "second", "NetworkSettings.Networks.dualstackl3.IPAddress") - // Inspect and store the v6 address from specified container on the network dualstackl3 - ip6 = inspectField(c, "second", "NetworkSettings.Networks.dualstackl3.GlobalIPv6Address") - - // Verify connectivity across disparate subnets which is unique to L3 mode only - _, _, err = dockerCmdWithError("exec", "third", "ping", "-c", "1", strings.TrimSpace(ip)) - c.Assert(err, check.IsNil) - _, _, err = dockerCmdWithError("exec", "third", "ping6", "-c", "1", strings.TrimSpace(ip6)) - c.Assert(err, check.IsNil) - - // Inspect the v4 gateway to ensure no next hop is assigned in L3 mode - ip4gw := inspectField(c, "first", "NetworkSettings.Networks.dualstackl3.Gateway") - c.Assert(strings.TrimSpace(ip4gw), check.Equals, "") - // Inspect the v6 gateway to ensure the explicitly specified default GW is ignored per L3 mode enabled - ip6gw := inspectField(c, "third", "NetworkSettings.Networks.dualstackl3.IPv6Gateway") - c.Assert(strings.TrimSpace(ip6gw), check.Equals, "") -} - -func (s *DockerNetworkSuite) TestDockerNetworkIpvlanAddressing(c *check.C) { - // Ensure the default gateways, next-hops and default dev devices are properly set - testRequires(c, DaemonIsLinux, IPv6, IpvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - dockerCmd(c, "network", "create", "--driver=macvlan", "--ipv6", "--subnet=172.28.130.0/24", - "--subnet=2001:db8:abca::/64", "--gateway=2001:db8:abca::254", "-o", "macvlan_mode=bridge", "dualstackbridge") - assertNwIsAvailable(c, "dualstackbridge") - dockerCmd(c, "run", "-d", "--net=dualstackbridge", "--name=first", "busybox", "top") - // Validate macvlan bridge mode defaults gateway sets the default IPAM next-hop inferred from the subnet - out, _, err := dockerCmdWithError("exec", "first", "ip", "route") - c.Assert(err, check.IsNil) - c.Assert(out, checker.Contains, "default via 172.28.130.1 dev eth0") - // Validate macvlan bridge mode sets the v6 gateway to the user specified default gateway/next-hop - out, _, err = dockerCmdWithError("exec", "first", "ip", "-6", "route") - c.Assert(err, check.IsNil) - c.Assert(out, checker.Contains, "default via 2001:db8:abca::254 dev eth0") - - // Verify ipvlan l2 mode sets the proper default gateway routes via netlink - // for either an explicitly set route by the user or inferred via default IPAM - dockerCmd(c, "network", "create", "--driver=ipvlan", "--ipv6", "--subnet=172.28.140.0/24", "--gateway=172.28.140.254", - "--subnet=2001:db8:abcb::/64", "-o", "ipvlan_mode=l2", "dualstackl2") - assertNwIsAvailable(c, "dualstackl2") - dockerCmd(c, "run", "-d", "--net=dualstackl2", "--name=second", "busybox", "top") - // Validate ipvlan l2 mode defaults gateway sets the default IPAM next-hop inferred from the subnet - out, _, err = dockerCmdWithError("exec", "second", "ip", "route") - c.Assert(err, check.IsNil) - c.Assert(out, checker.Contains, "default via 172.28.140.254 dev eth0") - // Validate ipvlan l2 mode sets the v6 gateway to the user specified default gateway/next-hop - out, _, err = dockerCmdWithError("exec", "second", "ip", "-6", "route") - c.Assert(err, check.IsNil) - c.Assert(out, checker.Contains, "default via 2001:db8:abcb::1 dev eth0") - - // Validate ipvlan l3 mode sets the v4 gateway to dev eth0 and disregards any explicit or inferred next-hops - dockerCmd(c, "network", "create", "--driver=ipvlan", "--ipv6", "--subnet=172.28.160.0/24", "--gateway=172.28.160.254", - "--subnet=2001:db8:abcd::/64", "--gateway=2001:db8:abcd::254", "-o", "ipvlan_mode=l3", "dualstackl3") - assertNwIsAvailable(c, "dualstackl3") - dockerCmd(c, "run", "-d", "--net=dualstackl3", "--name=third", "busybox", "top") - // Validate ipvlan l3 mode sets the v4 gateway to dev eth0 and disregards any explicit or inferred next-hops - out, _, err = dockerCmdWithError("exec", "third", "ip", "route") - c.Assert(err, check.IsNil) - c.Assert(out, checker.Contains, "default dev eth0") - // Validate ipvlan l3 mode sets the v6 gateway to dev eth0 and disregards any explicit or inferred next-hops - out, _, err = dockerCmdWithError("exec", "third", "ip", "-6", "route") - c.Assert(err, check.IsNil) - c.Assert(out, checker.Contains, "default dev eth0") -} - -func (s *DockerSuite) TestDockerNetworkMacVlanBridgeNilParent(c *check.C) { - // macvlan bridge mode - dummy parent interface is provisioned dynamically - testRequires(c, DaemonIsLinux, MacvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - dockerCmd(c, "network", "create", "--driver=macvlan", "dm-nil-parent") - assertNwIsAvailable(c, "dm-nil-parent") - - // start two containers on the same subnet - dockerCmd(c, "run", "-d", "--net=dm-nil-parent", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--net=dm-nil-parent", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // intra-network communications should succeed - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestDockerNetworkMacVlanBridgeInternalMode(c *check.C) { - // macvlan bridge mode --internal containers can communicate inside the network but not externally - testRequires(c, DaemonIsLinux, MacvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - dockerCmd(c, "network", "create", "--driver=macvlan", "--internal", "dm-internal") - assertNwIsAvailable(c, "dm-internal") - nr := getNetworkResource(c, "dm-internal") - c.Assert(nr.Internal, checker.True) - - // start two containers on the same subnet - dockerCmd(c, "run", "-d", "--net=dm-internal", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--net=dm-internal", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // access outside of the network should fail - result := dockerCmdWithTimeout(time.Second, "exec", "first", "ping", "-c", "1", "-w", "1", "8.8.8.8") - c.Assert(result, icmd.Matches, icmd.Expected{Timeout: true}) - - // intra-network communications should succeed - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestDockerNetworkIpvlanL2NilParent(c *check.C) { - // ipvlan l2 mode - dummy parent interface is provisioned dynamically - testRequires(c, DaemonIsLinux, IpvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - dockerCmd(c, "network", "create", "--driver=ipvlan", "di-nil-parent") - assertNwIsAvailable(c, "di-nil-parent") - - // start two containers on the same subnet - dockerCmd(c, "run", "-d", "--net=di-nil-parent", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--net=di-nil-parent", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // intra-network communications should succeed - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestDockerNetworkIpvlanL2InternalMode(c *check.C) { - // ipvlan l2 mode --internal containers can communicate inside the network but not externally - testRequires(c, DaemonIsLinux, IpvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - dockerCmd(c, "network", "create", "--driver=ipvlan", "--internal", "di-internal") - assertNwIsAvailable(c, "di-internal") - nr := getNetworkResource(c, "di-internal") - c.Assert(nr.Internal, checker.True) - - // start two containers on the same subnet - dockerCmd(c, "run", "-d", "--net=di-internal", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--net=di-internal", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // access outside of the network should fail - result := dockerCmdWithTimeout(time.Second, "exec", "first", "ping", "-c", "1", "-w", "1", "8.8.8.8") - c.Assert(result, icmd.Matches, icmd.Expected{Timeout: true}) - // intra-network communications should succeed - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestDockerNetworkIpvlanL3NilParent(c *check.C) { - // ipvlan l3 mode - dummy parent interface is provisioned dynamically - testRequires(c, DaemonIsLinux, IpvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - dockerCmd(c, "network", "create", "--driver=ipvlan", "--subnet=172.28.230.0/24", - "--subnet=172.28.220.0/24", "-o", "ipvlan_mode=l3", "di-nil-parent-l3") - assertNwIsAvailable(c, "di-nil-parent-l3") - - // start two containers on separate subnets - dockerCmd(c, "run", "-d", "--ip=172.28.220.10", "--net=di-nil-parent-l3", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--ip=172.28.230.10", "--net=di-nil-parent-l3", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // intra-network communications should succeed - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestDockerNetworkIpvlanL3InternalMode(c *check.C) { - // ipvlan l3 mode --internal containers can communicate inside the network but not externally - testRequires(c, DaemonIsLinux, IpvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - dockerCmd(c, "network", "create", "--driver=ipvlan", "--subnet=172.28.230.0/24", - "--subnet=172.28.220.0/24", "-o", "ipvlan_mode=l3", "--internal", "di-internal-l3") - assertNwIsAvailable(c, "di-internal-l3") - nr := getNetworkResource(c, "di-internal-l3") - c.Assert(nr.Internal, checker.True) - - // start two containers on separate subnets - dockerCmd(c, "run", "-d", "--ip=172.28.220.10", "--net=di-internal-l3", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--ip=172.28.230.10", "--net=di-internal-l3", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - - // access outside of the network should fail - result := dockerCmdWithTimeout(time.Second, "exec", "first", "ping", "-c", "1", "-w", "1", "8.8.8.8") - c.Assert(result, icmd.Matches, icmd.Expected{Timeout: true}) - // intra-network communications should succeed - _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) -} - -func (s *DockerSuite) TestDockerNetworkMacVlanExistingParent(c *check.C) { - // macvlan bridge mode - empty parent interface containers can reach each other internally but not externally - testRequires(c, DaemonIsLinux, MacvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - netName := "dm-parent-exists" - out, err := createMasterDummy(c, "dm-dummy0") - //out, err := createVlanInterface(c, "dm-parent", "dm-slave", "macvlan", "bridge") - c.Assert(err, check.IsNil, check.Commentf(out)) - // create a network using an existing parent interface - dockerCmd(c, "network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0", netName) - assertNwIsAvailable(c, netName) - // delete the network while preserving the parent link - dockerCmd(c, "network", "rm", netName) - assertNwNotAvailable(c, netName) - // verify the network delete did not delete the predefined link - out, err = linkExists(c, "dm-dummy0") - c.Assert(err, check.IsNil, check.Commentf(out)) - deleteInterface(c, "dm-dummy0") - c.Assert(err, check.IsNil, check.Commentf(out)) -} - -func (s *DockerSuite) TestDockerNetworkMacVlanSubinterface(c *check.C) { - // macvlan bridge mode - empty parent interface containers can reach each other internally but not externally - testRequires(c, DaemonIsLinux, MacvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) - netName := "dm-subinterface" - out, err := createMasterDummy(c, "dm-dummy0") - c.Assert(err, check.IsNil, check.Commentf(out)) - out, err = createVlanInterface(c, "dm-dummy0", "dm-dummy0.20", "20") - c.Assert(err, check.IsNil, check.Commentf(out)) - // create a network using an existing parent interface - dockerCmd(c, "network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0.20", netName) - assertNwIsAvailable(c, netName) - - // start containers on 802.1q tagged '-o parent' sub-interface - dockerCmd(c, "run", "-d", "--net=dm-subinterface", "--name=first", "busybox", "top") - c.Assert(waitRun("first"), check.IsNil) - dockerCmd(c, "run", "-d", "--net=dm-subinterface", "--name=second", "busybox", "top") - c.Assert(waitRun("second"), check.IsNil) - // verify containers can communicate - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") - c.Assert(err, check.IsNil) - - // remove the containers - dockerCmd(c, "rm", "-f", "first") - dockerCmd(c, "rm", "-f", "second") - // delete the network while preserving the parent link - dockerCmd(c, "network", "rm", netName) - assertNwNotAvailable(c, netName) - // verify the network delete did not delete the predefined sub-interface - out, err = linkExists(c, "dm-dummy0.20") - c.Assert(err, check.IsNil, check.Commentf(out)) - // delete the parent interface which also collects the slave - deleteInterface(c, "dm-dummy0") - c.Assert(err, check.IsNil, check.Commentf(out)) -} - -func createMasterDummy(c *check.C, master string) (string, error) { - // ip link add type dummy - args := []string{"link", "add", master, "type", "dummy"} - ipLinkCmd := exec.Command("ip", args...) - out, _, err := runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } - // ip link set dummy_name up - args = []string{"link", "set", master, "up"} - ipLinkCmd = exec.Command("ip", args...) - out, _, err = runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } - return out, err -} - -func createVlanInterface(c *check.C, master, slave, id string) (string, error) { - // ip link add link name . type vlan id - args := []string{"link", "add", "link", master, "name", slave, "type", "vlan", "id", id} - ipLinkCmd := exec.Command("ip", args...) - out, _, err := runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } - // ip link set up - args = []string{"link", "set", slave, "up"} - ipLinkCmd = exec.Command("ip", args...) - out, _, err = runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } - return out, err -} - -func linkExists(c *check.C, master string) (string, error) { - // verify the specified link exists, ip link show - args := []string{"link", "show", master} - ipLinkCmd := exec.Command("ip", args...) - out, _, err := runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } - return out, err -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_hub_pull_suite_test.go b/vendor/github.com/docker/docker/integration-cli/docker_hub_pull_suite_test.go deleted file mode 100644 index df52cae1a..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_hub_pull_suite_test.go +++ /dev/null @@ -1,90 +0,0 @@ -package main - -import ( - "os/exec" - "runtime" - "strings" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -func init() { - // FIXME. Temporarily turning this off for Windows as GH16039 was breaking - // Windows to Linux CI @icecrime - if runtime.GOOS != "windows" { - check.Suite(newDockerHubPullSuite()) - } -} - -// DockerHubPullSuite provides an isolated daemon that doesn't have all the -// images that are baked into our 'global' test environment daemon (e.g., -// busybox, httpserver, ...). -// -// We use it for push/pull tests where we want to start fresh, and measure the -// relative impact of each individual operation. As part of this suite, all -// images are removed after each test. -type DockerHubPullSuite struct { - d *Daemon - ds *DockerSuite -} - -// newDockerHubPullSuite returns a new instance of a DockerHubPullSuite. -func newDockerHubPullSuite() *DockerHubPullSuite { - return &DockerHubPullSuite{ - ds: &DockerSuite{}, - } -} - -// SetUpSuite starts the suite daemon. -func (s *DockerHubPullSuite) SetUpSuite(c *check.C) { - testRequires(c, DaemonIsLinux) - s.d = NewDaemon(c) - err := s.d.Start() - c.Assert(err, checker.IsNil, check.Commentf("starting push/pull test daemon: %v", err)) -} - -// TearDownSuite stops the suite daemon. -func (s *DockerHubPullSuite) TearDownSuite(c *check.C) { - if s.d != nil { - err := s.d.Stop() - c.Assert(err, checker.IsNil, check.Commentf("stopping push/pull test daemon: %v", err)) - } -} - -// SetUpTest declares that all tests of this suite require network. -func (s *DockerHubPullSuite) SetUpTest(c *check.C) { - testRequires(c, Network) -} - -// TearDownTest removes all images from the suite daemon. -func (s *DockerHubPullSuite) TearDownTest(c *check.C) { - out := s.Cmd(c, "images", "-aq") - images := strings.Split(out, "\n") - images = append([]string{"rmi", "-f"}, images...) - s.d.Cmd(images...) - s.ds.TearDownTest(c) -} - -// Cmd executes a command against the suite daemon and returns the combined -// output. The function fails the test when the command returns an error. -func (s *DockerHubPullSuite) Cmd(c *check.C, name string, arg ...string) string { - out, err := s.CmdWithError(name, arg...) - c.Assert(err, checker.IsNil, check.Commentf("%q failed with errors: %s, %v", strings.Join(arg, " "), out, err)) - return out -} - -// CmdWithError executes a command against the suite daemon and returns the -// combined output as well as any error. -func (s *DockerHubPullSuite) CmdWithError(name string, arg ...string) (string, error) { - c := s.MakeCmd(name, arg...) - b, err := c.CombinedOutput() - return string(b), err -} - -// MakeCmd returns an exec.Cmd command to run against the suite daemon. -func (s *DockerHubPullSuite) MakeCmd(name string, arg ...string) *exec.Cmd { - args := []string{"--host", s.d.sock(), name} - args = append(args, arg...) - return exec.Command(dockerBinary, args...) -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_test_vars.go b/vendor/github.com/docker/docker/integration-cli/docker_test_vars.go deleted file mode 100644 index 3559bfdbb..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_test_vars.go +++ /dev/null @@ -1,165 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "strconv" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/pkg/reexec" -) - -var ( - // the docker client binary to use - dockerBinary = "docker" - // the docker daemon binary to use - dockerdBinary = "dockerd" - - // path to containerd's ctr binary - ctrBinary = "docker-containerd-ctr" - - // the private registry image to use for tests involving the registry - registryImageName = "registry" - - // the private registry to use for tests - privateRegistryURL = "127.0.0.1:5000" - - // TODO Windows CI. These are incorrect and need fixing into - // platform specific pieces. - runtimePath = "/var/run/docker" - - workingDirectory string - - // isLocalDaemon is true if the daemon under test is on the same - // host as the CLI. - isLocalDaemon bool - - // daemonPlatform is held globally so that tests can make intelligent - // decisions on how to configure themselves according to the platform - // of the daemon. This is initialized in docker_utils by sending - // a version call to the daemon and examining the response header. - daemonPlatform string - - // windowsDaemonKV is used on Windows to distinguish between different - // versions. This is necessary to enable certain tests based on whether - // the platform supports it. For example, Windows Server 2016 TP3 did - // not support volumes, but TP4 did. - windowsDaemonKV int - - // daemonDefaultImage is the name of the default image to use when running - // tests. This is platform dependent. - daemonDefaultImage string - - // For a local daemon on Linux, these values will be used for testing - // user namespace support as the standard graph path(s) will be - // appended with the root remapped uid.gid prefix - dockerBasePath string - volumesConfigPath string - containerStoragePath string - - // experimentalDaemon tell whether the main daemon has - // experimental features enabled or not - experimentalDaemon bool - - // daemonStorageDriver is held globally so that tests can know the storage - // driver of the daemon. This is initialized in docker_utils by sending - // a version call to the daemon and examining the response header. - daemonStorageDriver string - - // WindowsBaseImage is the name of the base image for Windows testing - // Environment variable WINDOWS_BASE_IMAGE can override this - WindowsBaseImage = "microsoft/windowsservercore" - - // isolation is the isolation mode of the daemon under test - isolation container.Isolation - - // daemonPid is the pid of the main test daemon - daemonPid int - - daemonKernelVersion string -) - -const ( - // DefaultImage is the name of the base image for the majority of tests that - // are run across suites - DefaultImage = "busybox" -) - -func init() { - reexec.Init() - if dockerBin := os.Getenv("DOCKER_BINARY"); dockerBin != "" { - dockerBinary = dockerBin - } - var err error - dockerBinary, err = exec.LookPath(dockerBinary) - if err != nil { - fmt.Printf("ERROR: couldn't resolve full path to the Docker binary (%v)\n", err) - os.Exit(1) - } - if registryImage := os.Getenv("REGISTRY_IMAGE"); registryImage != "" { - registryImageName = registryImage - } - if registry := os.Getenv("REGISTRY_URL"); registry != "" { - privateRegistryURL = registry - } - workingDirectory, _ = os.Getwd() - - // Deterministically working out the environment in which CI is running - // to evaluate whether the daemon is local or remote is not possible through - // a build tag. - // - // For example Windows to Linux CI under Jenkins tests the 64-bit - // Windows binary build with the daemon build tag, but calls a remote - // Linux daemon. - // - // We can't just say if Windows then assume the daemon is local as at - // some point, we will be testing the Windows CLI against a Windows daemon. - // - // Similarly, it will be perfectly valid to also run CLI tests from - // a Linux CLI (built with the daemon tag) against a Windows daemon. - if len(os.Getenv("DOCKER_REMOTE_DAEMON")) > 0 { - isLocalDaemon = false - } else { - isLocalDaemon = true - } - - // TODO Windows CI. This are incorrect and need fixing into - // platform specific pieces. - // This is only used for a tests with local daemon true (Linux-only today) - // default is "/var/lib/docker", but we'll try and ask the - // /info endpoint for the specific root dir - dockerBasePath = "/var/lib/docker" - type Info struct { - DockerRootDir string - ExperimentalBuild bool - KernelVersion string - } - var i Info - status, b, err := sockRequest("GET", "/info", nil) - if err == nil && status == 200 { - if err = json.Unmarshal(b, &i); err == nil { - dockerBasePath = i.DockerRootDir - experimentalDaemon = i.ExperimentalBuild - daemonKernelVersion = i.KernelVersion - } - } - volumesConfigPath = dockerBasePath + "/volumes" - containerStoragePath = dockerBasePath + "/containers" - - if len(os.Getenv("WINDOWS_BASE_IMAGE")) > 0 { - WindowsBaseImage = os.Getenv("WINDOWS_BASE_IMAGE") - fmt.Println("INFO: Windows Base image is ", WindowsBaseImage) - } - - dest := os.Getenv("DEST") - b, err = ioutil.ReadFile(filepath.Join(dest, "docker.pid")) - if err == nil { - if p, err := strconv.ParseInt(string(b), 10, 32); err == nil { - daemonPid = int(p) - } - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_utils.go b/vendor/github.com/docker/docker/integration-cli/docker_utils.go deleted file mode 100644 index 749e4b335..000000000 --- a/vendor/github.com/docker/docker/integration-cli/docker_utils.go +++ /dev/null @@ -1,1607 +0,0 @@ -package main - -import ( - "bufio" - "bytes" - "crypto/tls" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "net/http/httptest" - "net/http/httputil" - "net/url" - "os" - "os/exec" - "path" - "path/filepath" - "strconv" - "strings" - "time" - - "github.com/docker/docker/api/types" - volumetypes "github.com/docker/docker/api/types/volume" - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/httputils" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/stringutils" - "github.com/docker/go-connections/tlsconfig" - units "github.com/docker/go-units" - "github.com/go-check/check" -) - -func init() { - cmd := exec.Command(dockerBinary, "images", "-f", "dangling=false", "--format", "{{.Repository}}:{{.Tag}}") - cmd.Env = appendBaseEnv(true) - out, err := cmd.CombinedOutput() - if err != nil { - panic(fmt.Errorf("err=%v\nout=%s\n", err, out)) - } - images := strings.Split(strings.TrimSpace(string(out)), "\n") - for _, img := range images { - protectedImages[img] = struct{}{} - } - - res, body, err := sockRequestRaw("GET", "/info", nil, "application/json") - if err != nil { - panic(fmt.Errorf("Init failed to get /info: %v", err)) - } - defer body.Close() - if res.StatusCode != http.StatusOK { - panic(fmt.Errorf("Init failed to get /info. Res=%v", res)) - } - - svrHeader, _ := httputils.ParseServerHeader(res.Header.Get("Server")) - daemonPlatform = svrHeader.OS - if daemonPlatform != "linux" && daemonPlatform != "windows" { - panic("Cannot run tests against platform: " + daemonPlatform) - } - - // Now we know the daemon platform, can set paths used by tests. - var info types.Info - err = json.NewDecoder(body).Decode(&info) - if err != nil { - panic(fmt.Errorf("Init failed to unmarshal docker info: %v", err)) - } - - daemonStorageDriver = info.Driver - dockerBasePath = info.DockerRootDir - volumesConfigPath = filepath.Join(dockerBasePath, "volumes") - containerStoragePath = filepath.Join(dockerBasePath, "containers") - // Make sure in context of daemon, not the local platform. Note we can't - // use filepath.FromSlash or ToSlash here as they are a no-op on Unix. - if daemonPlatform == "windows" { - volumesConfigPath = strings.Replace(volumesConfigPath, `/`, `\`, -1) - containerStoragePath = strings.Replace(containerStoragePath, `/`, `\`, -1) - // On Windows, extract out the version as we need to make selective - // decisions during integration testing as and when features are implemented. - // eg in "10.0 10550 (10550.1000.amd64fre.branch.date-time)" we want 10550 - windowsDaemonKV, _ = strconv.Atoi(strings.Split(info.KernelVersion, " ")[1]) - } else { - volumesConfigPath = strings.Replace(volumesConfigPath, `\`, `/`, -1) - containerStoragePath = strings.Replace(containerStoragePath, `\`, `/`, -1) - } - isolation = info.Isolation -} - -func convertBasesize(basesizeBytes int64) (int64, error) { - basesize := units.HumanSize(float64(basesizeBytes)) - basesize = strings.Trim(basesize, " ")[:len(basesize)-3] - basesizeFloat, err := strconv.ParseFloat(strings.Trim(basesize, " "), 64) - if err != nil { - return 0, err - } - return int64(basesizeFloat) * 1024 * 1024 * 1024, nil -} - -func daemonHost() string { - daemonURLStr := "unix://" + opts.DefaultUnixSocket - if daemonHostVar := os.Getenv("DOCKER_HOST"); daemonHostVar != "" { - daemonURLStr = daemonHostVar - } - return daemonURLStr -} - -func getTLSConfig() (*tls.Config, error) { - dockerCertPath := os.Getenv("DOCKER_CERT_PATH") - - if dockerCertPath == "" { - return nil, fmt.Errorf("DOCKER_TLS_VERIFY specified, but no DOCKER_CERT_PATH environment variable") - } - - option := &tlsconfig.Options{ - CAFile: filepath.Join(dockerCertPath, "ca.pem"), - CertFile: filepath.Join(dockerCertPath, "cert.pem"), - KeyFile: filepath.Join(dockerCertPath, "key.pem"), - } - tlsConfig, err := tlsconfig.Client(*option) - if err != nil { - return nil, err - } - - return tlsConfig, nil -} - -func sockConn(timeout time.Duration, daemon string) (net.Conn, error) { - if daemon == "" { - daemon = daemonHost() - } - daemonURL, err := url.Parse(daemon) - if err != nil { - return nil, fmt.Errorf("could not parse url %q: %v", daemon, err) - } - - var c net.Conn - switch daemonURL.Scheme { - case "npipe": - return npipeDial(daemonURL.Path, timeout) - case "unix": - return net.DialTimeout(daemonURL.Scheme, daemonURL.Path, timeout) - case "tcp": - if os.Getenv("DOCKER_TLS_VERIFY") != "" { - // Setup the socket TLS configuration. - tlsConfig, err := getTLSConfig() - if err != nil { - return nil, err - } - dialer := &net.Dialer{Timeout: timeout} - return tls.DialWithDialer(dialer, daemonURL.Scheme, daemonURL.Host, tlsConfig) - } - return net.DialTimeout(daemonURL.Scheme, daemonURL.Host, timeout) - default: - return c, fmt.Errorf("unknown scheme %v (%s)", daemonURL.Scheme, daemon) - } -} - -func sockRequest(method, endpoint string, data interface{}) (int, []byte, error) { - jsonData := bytes.NewBuffer(nil) - if err := json.NewEncoder(jsonData).Encode(data); err != nil { - return -1, nil, err - } - - res, body, err := sockRequestRaw(method, endpoint, jsonData, "application/json") - if err != nil { - return -1, nil, err - } - b, err := readBody(body) - return res.StatusCode, b, err -} - -func sockRequestRaw(method, endpoint string, data io.Reader, ct string) (*http.Response, io.ReadCloser, error) { - return sockRequestRawToDaemon(method, endpoint, data, ct, "") -} - -func sockRequestRawToDaemon(method, endpoint string, data io.Reader, ct, daemon string) (*http.Response, io.ReadCloser, error) { - req, client, err := newRequestClient(method, endpoint, data, ct, daemon) - if err != nil { - return nil, nil, err - } - - resp, err := client.Do(req) - if err != nil { - client.Close() - return nil, nil, err - } - body := ioutils.NewReadCloserWrapper(resp.Body, func() error { - defer resp.Body.Close() - return client.Close() - }) - - return resp, body, nil -} - -func sockRequestHijack(method, endpoint string, data io.Reader, ct string) (net.Conn, *bufio.Reader, error) { - req, client, err := newRequestClient(method, endpoint, data, ct, "") - if err != nil { - return nil, nil, err - } - - client.Do(req) - conn, br := client.Hijack() - return conn, br, nil -} - -func newRequestClient(method, endpoint string, data io.Reader, ct, daemon string) (*http.Request, *httputil.ClientConn, error) { - c, err := sockConn(time.Duration(10*time.Second), daemon) - if err != nil { - return nil, nil, fmt.Errorf("could not dial docker daemon: %v", err) - } - - client := httputil.NewClientConn(c, nil) - - req, err := http.NewRequest(method, endpoint, data) - if err != nil { - client.Close() - return nil, nil, fmt.Errorf("could not create new request: %v", err) - } - - if ct != "" { - req.Header.Set("Content-Type", ct) - } - return req, client, nil -} - -func readBody(b io.ReadCloser) ([]byte, error) { - defer b.Close() - return ioutil.ReadAll(b) -} - -func deleteContainer(container ...string) error { - result := icmd.RunCommand(dockerBinary, append([]string{"rm", "-fv"}, container...)...) - return result.Compare(icmd.Success) -} - -func getAllContainers() (string, error) { - getContainersCmd := exec.Command(dockerBinary, "ps", "-q", "-a") - out, exitCode, err := runCommandWithOutput(getContainersCmd) - if exitCode != 0 && err == nil { - err = fmt.Errorf("failed to get a list of containers: %v\n", out) - } - - return out, err -} - -func deleteAllContainers() error { - containers, err := getAllContainers() - if err != nil { - fmt.Println(containers) - return err - } - if containers == "" { - return nil - } - - err = deleteContainer(strings.Split(strings.TrimSpace(containers), "\n")...) - if err != nil { - fmt.Println(err.Error()) - } - return err -} - -func deleteAllNetworks() error { - networks, err := getAllNetworks() - if err != nil { - return err - } - var errors []string - for _, n := range networks { - if n.Name == "bridge" || n.Name == "none" || n.Name == "host" { - continue - } - if daemonPlatform == "windows" && strings.ToLower(n.Name) == "nat" { - // nat is a pre-defined network on Windows and cannot be removed - continue - } - status, b, err := sockRequest("DELETE", "/networks/"+n.Name, nil) - if err != nil { - errors = append(errors, err.Error()) - continue - } - if status != http.StatusNoContent { - errors = append(errors, fmt.Sprintf("error deleting network %s: %s", n.Name, string(b))) - } - } - if len(errors) > 0 { - return fmt.Errorf(strings.Join(errors, "\n")) - } - return nil -} - -func getAllNetworks() ([]types.NetworkResource, error) { - var networks []types.NetworkResource - _, b, err := sockRequest("GET", "/networks", nil) - if err != nil { - return nil, err - } - if err := json.Unmarshal(b, &networks); err != nil { - return nil, err - } - return networks, nil -} - -func deleteAllPlugins() error { - plugins, err := getAllPlugins() - if err != nil { - return err - } - var errors []string - for _, p := range plugins { - status, b, err := sockRequest("DELETE", "/plugins/"+p.Name+"?force=1", nil) - if err != nil { - errors = append(errors, err.Error()) - continue - } - if status != http.StatusNoContent { - errors = append(errors, fmt.Sprintf("error deleting plugin %s: %s", p.Name, string(b))) - } - } - if len(errors) > 0 { - return fmt.Errorf(strings.Join(errors, "\n")) - } - return nil -} - -func getAllPlugins() (types.PluginsListResponse, error) { - var plugins types.PluginsListResponse - _, b, err := sockRequest("GET", "/plugins", nil) - if err != nil { - return nil, err - } - if err := json.Unmarshal(b, &plugins); err != nil { - return nil, err - } - return plugins, nil -} - -func deleteAllVolumes() error { - volumes, err := getAllVolumes() - if err != nil { - return err - } - var errors []string - for _, v := range volumes { - status, b, err := sockRequest("DELETE", "/volumes/"+v.Name, nil) - if err != nil { - errors = append(errors, err.Error()) - continue - } - if status != http.StatusNoContent { - errors = append(errors, fmt.Sprintf("error deleting volume %s: %s", v.Name, string(b))) - } - } - if len(errors) > 0 { - return fmt.Errorf(strings.Join(errors, "\n")) - } - return nil -} - -func getAllVolumes() ([]*types.Volume, error) { - var volumes volumetypes.VolumesListOKBody - _, b, err := sockRequest("GET", "/volumes", nil) - if err != nil { - return nil, err - } - if err := json.Unmarshal(b, &volumes); err != nil { - return nil, err - } - return volumes.Volumes, nil -} - -var protectedImages = map[string]struct{}{} - -func deleteAllImages() error { - cmd := exec.Command(dockerBinary, "images") - cmd.Env = appendBaseEnv(true) - out, err := cmd.CombinedOutput() - if err != nil { - return err - } - lines := strings.Split(string(out), "\n")[1:] - var imgs []string - for _, l := range lines { - if l == "" { - continue - } - fields := strings.Fields(l) - imgTag := fields[0] + ":" + fields[1] - if _, ok := protectedImages[imgTag]; !ok { - if fields[0] == "" { - imgs = append(imgs, fields[2]) - continue - } - imgs = append(imgs, imgTag) - } - } - if len(imgs) == 0 { - return nil - } - args := append([]string{"rmi", "-f"}, imgs...) - if err := exec.Command(dockerBinary, args...).Run(); err != nil { - return err - } - return nil -} - -func getPausedContainers() (string, error) { - getPausedContainersCmd := exec.Command(dockerBinary, "ps", "-f", "status=paused", "-q", "-a") - out, exitCode, err := runCommandWithOutput(getPausedContainersCmd) - if exitCode != 0 && err == nil { - err = fmt.Errorf("failed to get a list of paused containers: %v\n", out) - } - - return out, err -} - -func getSliceOfPausedContainers() ([]string, error) { - out, err := getPausedContainers() - if err == nil { - if len(out) == 0 { - return nil, err - } - slice := strings.Split(strings.TrimSpace(out), "\n") - return slice, err - } - return []string{out}, err -} - -func unpauseContainer(container string) error { - return icmd.RunCommand(dockerBinary, "unpause", container).Error -} - -func unpauseAllContainers() error { - containers, err := getPausedContainers() - if err != nil { - fmt.Println(containers) - return err - } - - containers = strings.Replace(containers, "\n", " ", -1) - containers = strings.Trim(containers, " ") - containerList := strings.Split(containers, " ") - - for _, value := range containerList { - if err = unpauseContainer(value); err != nil { - return err - } - } - - return nil -} - -func deleteImages(images ...string) error { - args := []string{dockerBinary, "rmi", "-f"} - return icmd.RunCmd(icmd.Cmd{Command: append(args, images...)}).Error -} - -func imageExists(image string) error { - return icmd.RunCommand(dockerBinary, "inspect", image).Error -} - -func pullImageIfNotExist(image string) error { - if err := imageExists(image); err != nil { - pullCmd := exec.Command(dockerBinary, "pull", image) - _, exitCode, err := runCommandWithOutput(pullCmd) - - if err != nil || exitCode != 0 { - return fmt.Errorf("image %q wasn't found locally and it couldn't be pulled: %s", image, err) - } - } - return nil -} - -func dockerCmdWithError(args ...string) (string, int, error) { - if err := validateArgs(args...); err != nil { - return "", 0, err - } - result := icmd.RunCommand(dockerBinary, args...) - if result.Error != nil { - return result.Combined(), result.ExitCode, result.Compare(icmd.Success) - } - return result.Combined(), result.ExitCode, result.Error -} - -func dockerCmdWithStdoutStderr(c *check.C, args ...string) (string, string, int) { - if err := validateArgs(args...); err != nil { - c.Fatalf(err.Error()) - } - - result := icmd.RunCommand(dockerBinary, args...) - // TODO: why is c ever nil? - if c != nil { - c.Assert(result, icmd.Matches, icmd.Success) - } - return result.Stdout(), result.Stderr(), result.ExitCode -} - -func dockerCmd(c *check.C, args ...string) (string, int) { - if err := validateArgs(args...); err != nil { - c.Fatalf(err.Error()) - } - result := icmd.RunCommand(dockerBinary, args...) - c.Assert(result, icmd.Matches, icmd.Success) - return result.Combined(), result.ExitCode -} - -func dockerCmdWithResult(args ...string) *icmd.Result { - return icmd.RunCommand(dockerBinary, args...) -} - -func binaryWithArgs(args ...string) []string { - return append([]string{dockerBinary}, args...) -} - -// execute a docker command with a timeout -func dockerCmdWithTimeout(timeout time.Duration, args ...string) *icmd.Result { - if err := validateArgs(args...); err != nil { - return &icmd.Result{Error: err} - } - return icmd.RunCmd(icmd.Cmd{Command: binaryWithArgs(args...), Timeout: timeout}) -} - -// execute a docker command in a directory -func dockerCmdInDir(c *check.C, path string, args ...string) (string, int, error) { - if err := validateArgs(args...); err != nil { - c.Fatalf(err.Error()) - } - result := icmd.RunCmd(icmd.Cmd{Command: binaryWithArgs(args...), Dir: path}) - return result.Combined(), result.ExitCode, result.Error -} - -// execute a docker command in a directory with a timeout -func dockerCmdInDirWithTimeout(timeout time.Duration, path string, args ...string) *icmd.Result { - if err := validateArgs(args...); err != nil { - return &icmd.Result{Error: err} - } - return icmd.RunCmd(icmd.Cmd{ - Command: binaryWithArgs(args...), - Timeout: timeout, - Dir: path, - }) -} - -// validateArgs is a checker to ensure tests are not running commands which are -// not supported on platforms. Specifically on Windows this is 'busybox top'. -func validateArgs(args ...string) error { - if daemonPlatform != "windows" { - return nil - } - foundBusybox := -1 - for key, value := range args { - if strings.ToLower(value) == "busybox" { - foundBusybox = key - } - if (foundBusybox != -1) && (key == foundBusybox+1) && (strings.ToLower(value) == "top") { - return errors.New("cannot use 'busybox top' in tests on Windows. Use runSleepingContainer()") - } - } - return nil -} - -// find the State.ExitCode in container metadata -func findContainerExitCode(c *check.C, name string, vargs ...string) string { - args := append(vargs, "inspect", "--format='{{ .State.ExitCode }} {{ .State.Error }}'", name) - cmd := exec.Command(dockerBinary, args...) - out, _, err := runCommandWithOutput(cmd) - if err != nil { - c.Fatal(err, out) - } - return out -} - -func findContainerIP(c *check.C, id string, network string) string { - out, _ := dockerCmd(c, "inspect", fmt.Sprintf("--format='{{ .NetworkSettings.Networks.%s.IPAddress }}'", network), id) - return strings.Trim(out, " \r\n'") -} - -func getContainerCount() (int, error) { - const containers = "Containers:" - - cmd := exec.Command(dockerBinary, "info") - out, _, err := runCommandWithOutput(cmd) - if err != nil { - return 0, err - } - - lines := strings.Split(out, "\n") - for _, line := range lines { - if strings.Contains(line, containers) { - output := strings.TrimSpace(line) - output = strings.TrimLeft(output, containers) - output = strings.Trim(output, " ") - containerCount, err := strconv.Atoi(output) - if err != nil { - return 0, err - } - return containerCount, nil - } - } - return 0, fmt.Errorf("couldn't find the Container count in the output") -} - -// FakeContext creates directories that can be used as a build context -type FakeContext struct { - Dir string -} - -// Add a file at a path, creating directories where necessary -func (f *FakeContext) Add(file, content string) error { - return f.addFile(file, []byte(content)) -} - -func (f *FakeContext) addFile(file string, content []byte) error { - fp := filepath.Join(f.Dir, filepath.FromSlash(file)) - dirpath := filepath.Dir(fp) - if dirpath != "." { - if err := os.MkdirAll(dirpath, 0755); err != nil { - return err - } - } - return ioutil.WriteFile(fp, content, 0644) - -} - -// Delete a file at a path -func (f *FakeContext) Delete(file string) error { - fp := filepath.Join(f.Dir, filepath.FromSlash(file)) - return os.RemoveAll(fp) -} - -// Close deletes the context -func (f *FakeContext) Close() error { - return os.RemoveAll(f.Dir) -} - -func fakeContextFromNewTempDir() (*FakeContext, error) { - tmp, err := ioutil.TempDir("", "fake-context") - if err != nil { - return nil, err - } - if err := os.Chmod(tmp, 0755); err != nil { - return nil, err - } - return fakeContextFromDir(tmp), nil -} - -func fakeContextFromDir(dir string) *FakeContext { - return &FakeContext{dir} -} - -func fakeContextWithFiles(files map[string]string) (*FakeContext, error) { - ctx, err := fakeContextFromNewTempDir() - if err != nil { - return nil, err - } - for file, content := range files { - if err := ctx.Add(file, content); err != nil { - ctx.Close() - return nil, err - } - } - return ctx, nil -} - -func fakeContextAddDockerfile(ctx *FakeContext, dockerfile string) error { - if err := ctx.Add("Dockerfile", dockerfile); err != nil { - ctx.Close() - return err - } - return nil -} - -func fakeContext(dockerfile string, files map[string]string) (*FakeContext, error) { - ctx, err := fakeContextWithFiles(files) - if err != nil { - return nil, err - } - if err := fakeContextAddDockerfile(ctx, dockerfile); err != nil { - return nil, err - } - return ctx, nil -} - -// FakeStorage is a static file server. It might be running locally or remotely -// on test host. -type FakeStorage interface { - Close() error - URL() string - CtxDir() string -} - -func fakeBinaryStorage(archives map[string]*bytes.Buffer) (FakeStorage, error) { - ctx, err := fakeContextFromNewTempDir() - if err != nil { - return nil, err - } - for name, content := range archives { - if err := ctx.addFile(name, content.Bytes()); err != nil { - return nil, err - } - } - return fakeStorageWithContext(ctx) -} - -// fakeStorage returns either a local or remote (at daemon machine) file server -func fakeStorage(files map[string]string) (FakeStorage, error) { - ctx, err := fakeContextWithFiles(files) - if err != nil { - return nil, err - } - return fakeStorageWithContext(ctx) -} - -// fakeStorageWithContext returns either a local or remote (at daemon machine) file server -func fakeStorageWithContext(ctx *FakeContext) (FakeStorage, error) { - if isLocalDaemon { - return newLocalFakeStorage(ctx) - } - return newRemoteFileServer(ctx) -} - -// localFileStorage is a file storage on the running machine -type localFileStorage struct { - *FakeContext - *httptest.Server -} - -func (s *localFileStorage) URL() string { - return s.Server.URL -} - -func (s *localFileStorage) CtxDir() string { - return s.FakeContext.Dir -} - -func (s *localFileStorage) Close() error { - defer s.Server.Close() - return s.FakeContext.Close() -} - -func newLocalFakeStorage(ctx *FakeContext) (*localFileStorage, error) { - handler := http.FileServer(http.Dir(ctx.Dir)) - server := httptest.NewServer(handler) - return &localFileStorage{ - FakeContext: ctx, - Server: server, - }, nil -} - -// remoteFileServer is a containerized static file server started on the remote -// testing machine to be used in URL-accepting docker build functionality. -type remoteFileServer struct { - host string // hostname/port web server is listening to on docker host e.g. 0.0.0.0:43712 - container string - image string - ctx *FakeContext -} - -func (f *remoteFileServer) URL() string { - u := url.URL{ - Scheme: "http", - Host: f.host} - return u.String() -} - -func (f *remoteFileServer) CtxDir() string { - return f.ctx.Dir -} - -func (f *remoteFileServer) Close() error { - defer func() { - if f.ctx != nil { - f.ctx.Close() - } - if f.image != "" { - deleteImages(f.image) - } - }() - if f.container == "" { - return nil - } - return deleteContainer(f.container) -} - -func newRemoteFileServer(ctx *FakeContext) (*remoteFileServer, error) { - var ( - image = fmt.Sprintf("fileserver-img-%s", strings.ToLower(stringutils.GenerateRandomAlphaOnlyString(10))) - container = fmt.Sprintf("fileserver-cnt-%s", strings.ToLower(stringutils.GenerateRandomAlphaOnlyString(10))) - ) - - if err := ensureHTTPServerImage(); err != nil { - return nil, err - } - - // Build the image - if err := fakeContextAddDockerfile(ctx, `FROM httpserver -COPY . /static`); err != nil { - return nil, fmt.Errorf("Cannot add Dockerfile to context: %v", err) - } - if _, err := buildImageFromContext(image, ctx, false); err != nil { - return nil, fmt.Errorf("failed building file storage container image: %v", err) - } - - // Start the container - runCmd := exec.Command(dockerBinary, "run", "-d", "-P", "--name", container, image) - if out, ec, err := runCommandWithOutput(runCmd); err != nil { - return nil, fmt.Errorf("failed to start file storage container. ec=%v\nout=%s\nerr=%v", ec, out, err) - } - - // Find out the system assigned port - out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "port", container, "80/tcp")) - if err != nil { - return nil, fmt.Errorf("failed to find container port: err=%v\nout=%s", err, out) - } - - fileserverHostPort := strings.Trim(out, "\n") - _, port, err := net.SplitHostPort(fileserverHostPort) - if err != nil { - return nil, fmt.Errorf("unable to parse file server host:port: %v", err) - } - - dockerHostURL, err := url.Parse(daemonHost()) - if err != nil { - return nil, fmt.Errorf("unable to parse daemon host URL: %v", err) - } - - host, _, err := net.SplitHostPort(dockerHostURL.Host) - if err != nil { - return nil, fmt.Errorf("unable to parse docker daemon host:port: %v", err) - } - - return &remoteFileServer{ - container: container, - image: image, - host: fmt.Sprintf("%s:%s", host, port), - ctx: ctx}, nil -} - -func inspectFieldAndMarshall(c *check.C, name, field string, output interface{}) { - str := inspectFieldJSON(c, name, field) - err := json.Unmarshal([]byte(str), output) - if c != nil { - c.Assert(err, check.IsNil, check.Commentf("failed to unmarshal: %v", err)) - } -} - -func inspectFilter(name, filter string) (string, error) { - format := fmt.Sprintf("{{%s}}", filter) - inspectCmd := exec.Command(dockerBinary, "inspect", "-f", format, name) - out, exitCode, err := runCommandWithOutput(inspectCmd) - if err != nil || exitCode != 0 { - return "", fmt.Errorf("failed to inspect %s: %s", name, out) - } - return strings.TrimSpace(out), nil -} - -func inspectFieldWithError(name, field string) (string, error) { - return inspectFilter(name, fmt.Sprintf(".%s", field)) -} - -func inspectField(c *check.C, name, field string) string { - out, err := inspectFilter(name, fmt.Sprintf(".%s", field)) - if c != nil { - c.Assert(err, check.IsNil) - } - return out -} - -func inspectFieldJSON(c *check.C, name, field string) string { - out, err := inspectFilter(name, fmt.Sprintf("json .%s", field)) - if c != nil { - c.Assert(err, check.IsNil) - } - return out -} - -func inspectFieldMap(c *check.C, name, path, field string) string { - out, err := inspectFilter(name, fmt.Sprintf("index .%s %q", path, field)) - if c != nil { - c.Assert(err, check.IsNil) - } - return out -} - -func inspectMountSourceField(name, destination string) (string, error) { - m, err := inspectMountPoint(name, destination) - if err != nil { - return "", err - } - return m.Source, nil -} - -func inspectMountPoint(name, destination string) (types.MountPoint, error) { - out, err := inspectFilter(name, "json .Mounts") - if err != nil { - return types.MountPoint{}, err - } - - return inspectMountPointJSON(out, destination) -} - -var errMountNotFound = errors.New("mount point not found") - -func inspectMountPointJSON(j, destination string) (types.MountPoint, error) { - var mp []types.MountPoint - if err := json.Unmarshal([]byte(j), &mp); err != nil { - return types.MountPoint{}, err - } - - var m *types.MountPoint - for _, c := range mp { - if c.Destination == destination { - m = &c - break - } - } - - if m == nil { - return types.MountPoint{}, errMountNotFound - } - - return *m, nil -} - -func inspectImage(name, filter string) (string, error) { - args := []string{"inspect", "--type", "image"} - if filter != "" { - format := fmt.Sprintf("{{%s}}", filter) - args = append(args, "-f", format) - } - args = append(args, name) - inspectCmd := exec.Command(dockerBinary, args...) - out, exitCode, err := runCommandWithOutput(inspectCmd) - if err != nil || exitCode != 0 { - return "", fmt.Errorf("failed to inspect %s: %s", name, out) - } - return strings.TrimSpace(out), nil -} - -func getIDByName(name string) (string, error) { - return inspectFieldWithError(name, "Id") -} - -// getContainerState returns the exit code of the container -// and true if it's running -// the exit code should be ignored if it's running -func getContainerState(c *check.C, id string) (int, bool, error) { - var ( - exitStatus int - running bool - ) - out, exitCode := dockerCmd(c, "inspect", "--format={{.State.Running}} {{.State.ExitCode}}", id) - if exitCode != 0 { - return 0, false, fmt.Errorf("%q doesn't exist: %s", id, out) - } - - out = strings.Trim(out, "\n") - splitOutput := strings.Split(out, " ") - if len(splitOutput) != 2 { - return 0, false, fmt.Errorf("failed to get container state: output is broken") - } - if splitOutput[0] == "true" { - running = true - } - if n, err := strconv.Atoi(splitOutput[1]); err == nil { - exitStatus = n - } else { - return 0, false, fmt.Errorf("failed to get container state: couldn't parse integer") - } - - return exitStatus, running, nil -} - -func buildImageCmd(name, dockerfile string, useCache bool, buildFlags ...string) *exec.Cmd { - return buildImageCmdWithHost(name, dockerfile, "", useCache, buildFlags...) -} - -func buildImageCmdWithHost(name, dockerfile, host string, useCache bool, buildFlags ...string) *exec.Cmd { - args := []string{} - if host != "" { - args = append(args, "--host", host) - } - args = append(args, "build", "-t", name) - if !useCache { - args = append(args, "--no-cache") - } - args = append(args, buildFlags...) - args = append(args, "-") - buildCmd := exec.Command(dockerBinary, args...) - buildCmd.Stdin = strings.NewReader(dockerfile) - return buildCmd -} - -func buildImageWithOut(name, dockerfile string, useCache bool, buildFlags ...string) (string, string, error) { - buildCmd := buildImageCmd(name, dockerfile, useCache, buildFlags...) - out, exitCode, err := runCommandWithOutput(buildCmd) - if err != nil || exitCode != 0 { - return "", out, fmt.Errorf("failed to build the image: %s", out) - } - id, err := getIDByName(name) - if err != nil { - return "", out, err - } - return id, out, nil -} - -func buildImageWithStdoutStderr(name, dockerfile string, useCache bool, buildFlags ...string) (string, string, string, error) { - buildCmd := buildImageCmd(name, dockerfile, useCache, buildFlags...) - stdout, stderr, exitCode, err := runCommandWithStdoutStderr(buildCmd) - if err != nil || exitCode != 0 { - return "", stdout, stderr, fmt.Errorf("failed to build the image: %s", stdout) - } - id, err := getIDByName(name) - if err != nil { - return "", stdout, stderr, err - } - return id, stdout, stderr, nil -} - -func buildImage(name, dockerfile string, useCache bool, buildFlags ...string) (string, error) { - id, _, err := buildImageWithOut(name, dockerfile, useCache, buildFlags...) - return id, err -} - -func buildImageFromContext(name string, ctx *FakeContext, useCache bool, buildFlags ...string) (string, error) { - id, _, err := buildImageFromContextWithOut(name, ctx, useCache, buildFlags...) - if err != nil { - return "", err - } - return id, nil -} - -func buildImageFromContextWithOut(name string, ctx *FakeContext, useCache bool, buildFlags ...string) (string, string, error) { - args := []string{"build", "-t", name} - if !useCache { - args = append(args, "--no-cache") - } - args = append(args, buildFlags...) - args = append(args, ".") - buildCmd := exec.Command(dockerBinary, args...) - buildCmd.Dir = ctx.Dir - out, exitCode, err := runCommandWithOutput(buildCmd) - if err != nil || exitCode != 0 { - return "", "", fmt.Errorf("failed to build the image: %s", out) - } - id, err := getIDByName(name) - if err != nil { - return "", "", err - } - return id, out, nil -} - -func buildImageFromContextWithStdoutStderr(name string, ctx *FakeContext, useCache bool, buildFlags ...string) (string, string, string, error) { - args := []string{"build", "-t", name} - if !useCache { - args = append(args, "--no-cache") - } - args = append(args, buildFlags...) - args = append(args, ".") - buildCmd := exec.Command(dockerBinary, args...) - buildCmd.Dir = ctx.Dir - - stdout, stderr, exitCode, err := runCommandWithStdoutStderr(buildCmd) - if err != nil || exitCode != 0 { - return "", stdout, stderr, fmt.Errorf("failed to build the image: %s", stdout) - } - id, err := getIDByName(name) - if err != nil { - return "", stdout, stderr, err - } - return id, stdout, stderr, nil -} - -func buildImageFromGitWithStdoutStderr(name string, ctx *fakeGit, useCache bool, buildFlags ...string) (string, string, string, error) { - args := []string{"build", "-t", name} - if !useCache { - args = append(args, "--no-cache") - } - args = append(args, buildFlags...) - args = append(args, ctx.RepoURL) - buildCmd := exec.Command(dockerBinary, args...) - - stdout, stderr, exitCode, err := runCommandWithStdoutStderr(buildCmd) - if err != nil || exitCode != 0 { - return "", stdout, stderr, fmt.Errorf("failed to build the image: %s", stdout) - } - id, err := getIDByName(name) - if err != nil { - return "", stdout, stderr, err - } - return id, stdout, stderr, nil -} - -func buildImageFromPath(name, path string, useCache bool, buildFlags ...string) (string, error) { - args := []string{"build", "-t", name} - if !useCache { - args = append(args, "--no-cache") - } - args = append(args, buildFlags...) - args = append(args, path) - buildCmd := exec.Command(dockerBinary, args...) - out, exitCode, err := runCommandWithOutput(buildCmd) - if err != nil || exitCode != 0 { - return "", fmt.Errorf("failed to build the image: %s", out) - } - return getIDByName(name) -} - -type gitServer interface { - URL() string - Close() error -} - -type localGitServer struct { - *httptest.Server -} - -func (r *localGitServer) Close() error { - r.Server.Close() - return nil -} - -func (r *localGitServer) URL() string { - return r.Server.URL -} - -type fakeGit struct { - root string - server gitServer - RepoURL string -} - -func (g *fakeGit) Close() { - g.server.Close() - os.RemoveAll(g.root) -} - -func newFakeGit(name string, files map[string]string, enforceLocalServer bool) (*fakeGit, error) { - ctx, err := fakeContextWithFiles(files) - if err != nil { - return nil, err - } - defer ctx.Close() - curdir, err := os.Getwd() - if err != nil { - return nil, err - } - defer os.Chdir(curdir) - - if output, err := exec.Command("git", "init", ctx.Dir).CombinedOutput(); err != nil { - return nil, fmt.Errorf("error trying to init repo: %s (%s)", err, output) - } - err = os.Chdir(ctx.Dir) - if err != nil { - return nil, err - } - if output, err := exec.Command("git", "config", "user.name", "Fake User").CombinedOutput(); err != nil { - return nil, fmt.Errorf("error trying to set 'user.name': %s (%s)", err, output) - } - if output, err := exec.Command("git", "config", "user.email", "fake.user@example.com").CombinedOutput(); err != nil { - return nil, fmt.Errorf("error trying to set 'user.email': %s (%s)", err, output) - } - if output, err := exec.Command("git", "add", "*").CombinedOutput(); err != nil { - return nil, fmt.Errorf("error trying to add files to repo: %s (%s)", err, output) - } - if output, err := exec.Command("git", "commit", "-a", "-m", "Initial commit").CombinedOutput(); err != nil { - return nil, fmt.Errorf("error trying to commit to repo: %s (%s)", err, output) - } - - root, err := ioutil.TempDir("", "docker-test-git-repo") - if err != nil { - return nil, err - } - repoPath := filepath.Join(root, name+".git") - if output, err := exec.Command("git", "clone", "--bare", ctx.Dir, repoPath).CombinedOutput(); err != nil { - os.RemoveAll(root) - return nil, fmt.Errorf("error trying to clone --bare: %s (%s)", err, output) - } - err = os.Chdir(repoPath) - if err != nil { - os.RemoveAll(root) - return nil, err - } - if output, err := exec.Command("git", "update-server-info").CombinedOutput(); err != nil { - os.RemoveAll(root) - return nil, fmt.Errorf("error trying to git update-server-info: %s (%s)", err, output) - } - err = os.Chdir(curdir) - if err != nil { - os.RemoveAll(root) - return nil, err - } - - var server gitServer - if !enforceLocalServer { - // use fakeStorage server, which might be local or remote (at test daemon) - server, err = fakeStorageWithContext(fakeContextFromDir(root)) - if err != nil { - return nil, fmt.Errorf("cannot start fake storage: %v", err) - } - } else { - // always start a local http server on CLI test machine - httpServer := httptest.NewServer(http.FileServer(http.Dir(root))) - server = &localGitServer{httpServer} - } - return &fakeGit{ - root: root, - server: server, - RepoURL: fmt.Sprintf("%s/%s.git", server.URL(), name), - }, nil -} - -// Write `content` to the file at path `dst`, creating it if necessary, -// as well as any missing directories. -// The file is truncated if it already exists. -// Fail the test when error occurs. -func writeFile(dst, content string, c *check.C) { - // Create subdirectories if necessary - c.Assert(os.MkdirAll(path.Dir(dst), 0700), check.IsNil) - f, err := os.OpenFile(dst, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0700) - c.Assert(err, check.IsNil) - defer f.Close() - // Write content (truncate if it exists) - _, err = io.Copy(f, strings.NewReader(content)) - c.Assert(err, check.IsNil) -} - -// Return the contents of file at path `src`. -// Fail the test when error occurs. -func readFile(src string, c *check.C) (content string) { - data, err := ioutil.ReadFile(src) - c.Assert(err, check.IsNil) - - return string(data) -} - -func containerStorageFile(containerID, basename string) string { - return filepath.Join(containerStoragePath, containerID, basename) -} - -// docker commands that use this function must be run with the '-d' switch. -func runCommandAndReadContainerFile(filename string, cmd *exec.Cmd) ([]byte, error) { - out, _, err := runCommandWithOutput(cmd) - if err != nil { - return nil, fmt.Errorf("%v: %q", err, out) - } - - contID := strings.TrimSpace(out) - - if err := waitRun(contID); err != nil { - return nil, fmt.Errorf("%v: %q", contID, err) - } - - return readContainerFile(contID, filename) -} - -func readContainerFile(containerID, filename string) ([]byte, error) { - f, err := os.Open(containerStorageFile(containerID, filename)) - if err != nil { - return nil, err - } - defer f.Close() - - content, err := ioutil.ReadAll(f) - if err != nil { - return nil, err - } - - return content, nil -} - -func readContainerFileWithExec(containerID, filename string) ([]byte, error) { - out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "exec", containerID, "cat", filename)) - return []byte(out), err -} - -// daemonTime provides the current time on the daemon host -func daemonTime(c *check.C) time.Time { - if isLocalDaemon { - return time.Now() - } - - status, body, err := sockRequest("GET", "/info", nil) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusOK) - - type infoJSON struct { - SystemTime string - } - var info infoJSON - err = json.Unmarshal(body, &info) - c.Assert(err, check.IsNil, check.Commentf("unable to unmarshal GET /info response")) - - dt, err := time.Parse(time.RFC3339Nano, info.SystemTime) - c.Assert(err, check.IsNil, check.Commentf("invalid time format in GET /info response")) - return dt -} - -// daemonUnixTime returns the current time on the daemon host with nanoseconds precision. -// It return the time formatted how the client sends timestamps to the server. -func daemonUnixTime(c *check.C) string { - return parseEventTime(daemonTime(c)) -} - -func parseEventTime(t time.Time) string { - return fmt.Sprintf("%d.%09d", t.Unix(), int64(t.Nanosecond())) -} - -func setupRegistry(c *check.C, schema1 bool, auth, tokenURL string) *testRegistryV2 { - reg, err := newTestRegistryV2(c, schema1, auth, tokenURL) - c.Assert(err, check.IsNil) - - // Wait for registry to be ready to serve requests. - for i := 0; i != 50; i++ { - if err = reg.Ping(); err == nil { - break - } - time.Sleep(100 * time.Millisecond) - } - - c.Assert(err, check.IsNil, check.Commentf("Timeout waiting for test registry to become available: %v", err)) - return reg -} - -func setupNotary(c *check.C) *testNotary { - ts, err := newTestNotary(c) - c.Assert(err, check.IsNil) - - return ts -} - -// appendBaseEnv appends the minimum set of environment variables to exec the -// docker cli binary for testing with correct configuration to the given env -// list. -func appendBaseEnv(isTLS bool, env ...string) []string { - preserveList := []string{ - // preserve remote test host - "DOCKER_HOST", - - // windows: requires preserving SystemRoot, otherwise dial tcp fails - // with "GetAddrInfoW: A non-recoverable error occurred during a database lookup." - "SystemRoot", - - // testing help text requires the $PATH to dockerd is set - "PATH", - } - if isTLS { - preserveList = append(preserveList, "DOCKER_TLS_VERIFY", "DOCKER_CERT_PATH") - } - - for _, key := range preserveList { - if val := os.Getenv(key); val != "" { - env = append(env, fmt.Sprintf("%s=%s", key, val)) - } - } - return env -} - -func createTmpFile(c *check.C, content string) string { - f, err := ioutil.TempFile("", "testfile") - c.Assert(err, check.IsNil) - - filename := f.Name() - - err = ioutil.WriteFile(filename, []byte(content), 0644) - c.Assert(err, check.IsNil) - - return filename -} - -func buildImageWithOutInDamon(socket string, name, dockerfile string, useCache bool) (string, error) { - args := []string{"--host", socket} - buildCmd := buildImageCmdArgs(args, name, dockerfile, useCache) - out, exitCode, err := runCommandWithOutput(buildCmd) - if err != nil || exitCode != 0 { - return out, fmt.Errorf("failed to build the image: %s, error: %v", out, err) - } - return out, nil -} - -func buildImageCmdArgs(args []string, name, dockerfile string, useCache bool) *exec.Cmd { - args = append(args, []string{"-D", "build", "-t", name}...) - if !useCache { - args = append(args, "--no-cache") - } - args = append(args, "-") - buildCmd := exec.Command(dockerBinary, args...) - buildCmd.Stdin = strings.NewReader(dockerfile) - return buildCmd - -} - -func waitForContainer(contID string, args ...string) error { - args = append([]string{dockerBinary, "run", "--name", contID}, args...) - result := icmd.RunCmd(icmd.Cmd{Command: args}) - if result.Error != nil { - return result.Error - } - return waitRun(contID) -} - -// waitRestart will wait for the specified container to restart once -func waitRestart(contID string, duration time.Duration) error { - return waitInspect(contID, "{{.RestartCount}}", "1", duration) -} - -// waitRun will wait for the specified container to be running, maximum 5 seconds. -func waitRun(contID string) error { - return waitInspect(contID, "{{.State.Running}}", "true", 5*time.Second) -} - -// waitExited will wait for the specified container to state exit, subject -// to a maximum time limit in seconds supplied by the caller -func waitExited(contID string, duration time.Duration) error { - return waitInspect(contID, "{{.State.Status}}", "exited", duration) -} - -// waitInspect will wait for the specified container to have the specified string -// in the inspect output. It will wait until the specified timeout (in seconds) -// is reached. -func waitInspect(name, expr, expected string, timeout time.Duration) error { - return waitInspectWithArgs(name, expr, expected, timeout) -} - -func waitInspectWithArgs(name, expr, expected string, timeout time.Duration, arg ...string) error { - after := time.After(timeout) - - args := append(arg, "inspect", "-f", expr, name) - for { - result := icmd.RunCommand(dockerBinary, args...) - if result.Error != nil { - if !strings.Contains(result.Stderr(), "No such") { - return fmt.Errorf("error executing docker inspect: %v\n%s", - result.Stderr(), result.Stdout()) - } - select { - case <-after: - return result.Error - default: - time.Sleep(10 * time.Millisecond) - continue - } - } - - out := strings.TrimSpace(result.Stdout()) - if out == expected { - break - } - - select { - case <-after: - return fmt.Errorf("condition \"%q == %q\" not true in time", out, expected) - default: - } - - time.Sleep(100 * time.Millisecond) - } - return nil -} - -func getInspectBody(c *check.C, version, id string) []byte { - endpoint := fmt.Sprintf("/%s/containers/%s/json", version, id) - status, body, err := sockRequest("GET", endpoint, nil) - c.Assert(err, check.IsNil) - c.Assert(status, check.Equals, http.StatusOK) - return body -} - -// Run a long running idle task in a background container using the -// system-specific default image and command. -func runSleepingContainer(c *check.C, extraArgs ...string) (string, int) { - return runSleepingContainerInImage(c, defaultSleepImage, extraArgs...) -} - -// Run a long running idle task in a background container using the specified -// image and the system-specific command. -func runSleepingContainerInImage(c *check.C, image string, extraArgs ...string) (string, int) { - args := []string{"run", "-d"} - args = append(args, extraArgs...) - args = append(args, image) - args = append(args, sleepCommandForDaemonPlatform()...) - return dockerCmd(c, args...) -} - -func getRootUIDGID() (int, int, error) { - uidgid := strings.Split(filepath.Base(dockerBasePath), ".") - if len(uidgid) == 1 { - //user namespace remapping is not turned on; return 0 - return 0, 0, nil - } - uid, err := strconv.Atoi(uidgid[0]) - if err != nil { - return 0, 0, err - } - gid, err := strconv.Atoi(uidgid[1]) - if err != nil { - return 0, 0, err - } - return uid, gid, nil -} - -// minimalBaseImage returns the name of the minimal base image for the current -// daemon platform. -func minimalBaseImage() string { - if daemonPlatform == "windows" { - return WindowsBaseImage - } - return "scratch" -} - -func getGoroutineNumber() (int, error) { - i := struct { - NGoroutines int - }{} - status, b, err := sockRequest("GET", "/info", nil) - if err != nil { - return 0, err - } - if status != http.StatusOK { - return 0, fmt.Errorf("http status code: %d", status) - } - if err := json.Unmarshal(b, &i); err != nil { - return 0, err - } - return i.NGoroutines, nil -} - -func waitForGoroutines(expected int) error { - t := time.After(30 * time.Second) - for { - select { - case <-t: - n, err := getGoroutineNumber() - if err != nil { - return err - } - if n > expected { - return fmt.Errorf("leaked goroutines: expected less than or equal to %d, got: %d", expected, n) - } - default: - n, err := getGoroutineNumber() - if err != nil { - return err - } - if n <= expected { - return nil - } - time.Sleep(200 * time.Millisecond) - } - } -} - -// getErrorMessage returns the error message from an error API response -func getErrorMessage(c *check.C, body []byte) string { - var resp types.ErrorResponse - c.Assert(json.Unmarshal(body, &resp), check.IsNil) - return strings.TrimSpace(resp.Message) -} - -func waitAndAssert(c *check.C, timeout time.Duration, f checkF, checker check.Checker, args ...interface{}) { - after := time.After(timeout) - for { - v, comment := f(c) - assert, _ := checker.Check(append([]interface{}{v}, args...), checker.Info().Params) - select { - case <-after: - assert = true - default: - } - if assert { - if comment != nil { - args = append(args, comment) - } - c.Assert(v, checker, args...) - return - } - time.Sleep(100 * time.Millisecond) - } -} - -type checkF func(*check.C) (interface{}, check.CommentInterface) -type reducer func(...interface{}) interface{} - -func reducedCheck(r reducer, funcs ...checkF) checkF { - return func(c *check.C) (interface{}, check.CommentInterface) { - var values []interface{} - var comments []string - for _, f := range funcs { - v, comment := f(c) - values = append(values, v) - if comment != nil { - comments = append(comments, comment.CheckCommentString()) - } - } - return r(values...), check.Commentf("%v", strings.Join(comments, ", ")) - } -} - -func sumAsIntegers(vals ...interface{}) interface{} { - var s int - for _, v := range vals { - s += v.(int) - } - return s -} diff --git a/vendor/github.com/docker/docker/integration-cli/events_utils.go b/vendor/github.com/docker/docker/integration-cli/events_utils.go deleted file mode 100644 index ba241796b..000000000 --- a/vendor/github.com/docker/docker/integration-cli/events_utils.go +++ /dev/null @@ -1,206 +0,0 @@ -package main - -import ( - "bufio" - "bytes" - "io" - "os/exec" - "regexp" - "strconv" - "strings" - - "github.com/Sirupsen/logrus" - eventstestutils "github.com/docker/docker/daemon/events/testutils" - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" -) - -// eventMatcher is a function that tries to match an event input. -// It returns true if the event matches and a map with -// a set of key/value to identify the match. -type eventMatcher func(text string) (map[string]string, bool) - -// eventMatchProcessor is a function to handle an event match. -// It receives a map of key/value with the information extracted in a match. -type eventMatchProcessor func(matches map[string]string) - -// eventObserver runs an events commands and observes its output. -type eventObserver struct { - buffer *bytes.Buffer - command *exec.Cmd - scanner *bufio.Scanner - startTime string - disconnectionError error -} - -// newEventObserver creates the observer and initializes the command -// without running it. Users must call `eventObserver.Start` to start the command. -func newEventObserver(c *check.C, args ...string) (*eventObserver, error) { - since := daemonTime(c).Unix() - return newEventObserverWithBacklog(c, since, args...) -} - -// newEventObserverWithBacklog creates a new observer changing the start time of the backlog to return. -func newEventObserverWithBacklog(c *check.C, since int64, args ...string) (*eventObserver, error) { - startTime := strconv.FormatInt(since, 10) - cmdArgs := []string{"events", "--since", startTime} - if len(args) > 0 { - cmdArgs = append(cmdArgs, args...) - } - eventsCmd := exec.Command(dockerBinary, cmdArgs...) - stdout, err := eventsCmd.StdoutPipe() - if err != nil { - return nil, err - } - - return &eventObserver{ - buffer: new(bytes.Buffer), - command: eventsCmd, - scanner: bufio.NewScanner(stdout), - startTime: startTime, - }, nil -} - -// Start starts the events command. -func (e *eventObserver) Start() error { - return e.command.Start() -} - -// Stop stops the events command. -func (e *eventObserver) Stop() { - e.command.Process.Kill() - e.command.Process.Release() -} - -// Match tries to match the events output with a given matcher. -func (e *eventObserver) Match(match eventMatcher, process eventMatchProcessor) { - for e.scanner.Scan() { - text := e.scanner.Text() - e.buffer.WriteString(text) - e.buffer.WriteString("\n") - - if matches, ok := match(text); ok { - process(matches) - } - } - - err := e.scanner.Err() - if err == nil { - err = io.EOF - } - - logrus.Debugf("EventObserver scanner loop finished: %v", err) - e.disconnectionError = err -} - -func (e *eventObserver) CheckEventError(c *check.C, id, event string, match eventMatcher) { - var foundEvent bool - scannerOut := e.buffer.String() - - if e.disconnectionError != nil { - until := daemonUnixTime(c) - out, _ := dockerCmd(c, "events", "--since", e.startTime, "--until", until) - events := strings.Split(strings.TrimSpace(out), "\n") - for _, e := range events { - if _, ok := match(e); ok { - foundEvent = true - break - } - } - scannerOut = out - } - if !foundEvent { - c.Fatalf("failed to observe event `%s` for %s. Disconnection error: %v\nout:\n%v", event, id, e.disconnectionError, scannerOut) - } -} - -// matchEventLine matches a text with the event regular expression. -// It returns the matches and true if the regular expression matches with the given id and event type. -// It returns an empty map and false if there is no match. -func matchEventLine(id, eventType string, actions map[string]chan bool) eventMatcher { - return func(text string) (map[string]string, bool) { - matches := eventstestutils.ScanMap(text) - if len(matches) == 0 { - return matches, false - } - - if matchIDAndEventType(matches, id, eventType) { - if _, ok := actions[matches["action"]]; ok { - return matches, true - } - } - return matches, false - } -} - -// processEventMatch closes an action channel when an event line matches the expected action. -func processEventMatch(actions map[string]chan bool) eventMatchProcessor { - return func(matches map[string]string) { - if ch, ok := actions[matches["action"]]; ok { - ch <- true - } - } -} - -// parseEventAction parses an event text and returns the action. -// It fails if the text is not in the event format. -func parseEventAction(c *check.C, text string) string { - matches := eventstestutils.ScanMap(text) - return matches["action"] -} - -// eventActionsByIDAndType returns the actions for a given id and type. -// It fails if the text is not in the event format. -func eventActionsByIDAndType(c *check.C, events []string, id, eventType string) []string { - var filtered []string - for _, event := range events { - matches := eventstestutils.ScanMap(event) - c.Assert(matches, checker.Not(checker.IsNil)) - if matchIDAndEventType(matches, id, eventType) { - filtered = append(filtered, matches["action"]) - } - } - return filtered -} - -// matchIDAndEventType returns true if an event matches a given id and type. -// It also resolves names in the event attributes if the id doesn't match. -func matchIDAndEventType(matches map[string]string, id, eventType string) bool { - return matchEventID(matches, id) && matches["eventType"] == eventType -} - -func matchEventID(matches map[string]string, id string) bool { - matchID := matches["id"] == id || strings.HasPrefix(matches["id"], id) - if !matchID && matches["attributes"] != "" { - // try matching a name in the attributes - attributes := map[string]string{} - for _, a := range strings.Split(matches["attributes"], ", ") { - kv := strings.Split(a, "=") - attributes[kv[0]] = kv[1] - } - matchID = attributes["name"] == id - } - return matchID -} - -func parseEvents(c *check.C, out, match string) { - events := strings.Split(strings.TrimSpace(out), "\n") - for _, event := range events { - matches := eventstestutils.ScanMap(event) - matched, err := regexp.MatchString(match, matches["action"]) - c.Assert(err, checker.IsNil) - c.Assert(matched, checker.True, check.Commentf("Matcher: %s did not match %s", match, matches["action"])) - } -} - -func parseEventsWithID(c *check.C, out, match, id string) { - events := strings.Split(strings.TrimSpace(out), "\n") - for _, event := range events { - matches := eventstestutils.ScanMap(event) - c.Assert(matchEventID(matches, id), checker.True) - - matched, err := regexp.MatchString(match, matches["action"]) - c.Assert(err, checker.IsNil) - c.Assert(matched, checker.True, check.Commentf("Matcher: %s did not match %s", match, matches["action"])) - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures.go b/vendor/github.com/docker/docker/integration-cli/fixtures.go deleted file mode 100644 index e99b73815..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures.go +++ /dev/null @@ -1,69 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "sync" -) - -var ensureHTTPServerOnce sync.Once - -func ensureHTTPServerImage() error { - var doIt bool - ensureHTTPServerOnce.Do(func() { - doIt = true - }) - - if !doIt { - return nil - } - - protectedImages["httpserver:latest"] = struct{}{} - - tmp, err := ioutil.TempDir("", "docker-http-server-test") - if err != nil { - return fmt.Errorf("could not build http server: %v", err) - } - defer os.RemoveAll(tmp) - - goos := daemonPlatform - if goos == "" { - goos = "linux" - } - goarch := os.Getenv("DOCKER_ENGINE_GOARCH") - if goarch == "" { - goarch = "amd64" - } - - goCmd, lookErr := exec.LookPath("go") - if lookErr != nil { - return fmt.Errorf("could not build http server: %v", lookErr) - } - - cmd := exec.Command(goCmd, "build", "-o", filepath.Join(tmp, "httpserver"), "github.com/docker/docker/contrib/httpserver") - cmd.Env = append(os.Environ(), []string{ - "CGO_ENABLED=0", - "GOOS=" + goos, - "GOARCH=" + goarch, - }...) - var out []byte - if out, err = cmd.CombinedOutput(); err != nil { - return fmt.Errorf("could not build http server: %s", string(out)) - } - - cpCmd, lookErr := exec.LookPath("cp") - if lookErr != nil { - return fmt.Errorf("could not build http server: %v", lookErr) - } - if out, err = exec.Command(cpCmd, "../contrib/httpserver/Dockerfile", filepath.Join(tmp, "Dockerfile")).CombinedOutput(); err != nil { - return fmt.Errorf("could not build http server: %v", string(out)) - } - - if out, err = exec.Command(dockerBinary, "build", "-q", "-t", "httpserver", tmp).CombinedOutput(); err != nil { - return fmt.Errorf("could not build http server: %v", string(out)) - } - return nil -} diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/auth/docker-credential-shell-test b/vendor/github.com/docker/docker/integration-cli/fixtures/auth/docker-credential-shell-test deleted file mode 100755 index a7be56b2f..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/auth/docker-credential-shell-test +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -set -e - -listFile=shell_test_list.json - -case $1 in - "store") - in=$( $TEMP/$serverHash - # add the server to the list file - if [[ ! -f $TEMP/$listFile ]]; then - echo "{ \"${server}\": \"${username}\" }" > $TEMP/$listFile - else - list=$(<$TEMP/$listFile) - echo "$list" | jq ". + {\"${server}\": \"${username}\"}" > $TEMP/$listFile - fi - ;; - "get") - in=$( $TEMP/$listFile - ;; - "list") - if [[ ! -f $TEMP/$listFile ]]; then - echo "{}" - else - payload=$(<$TEMP/$listFile) - echo "$payload" - fi - ;; - *) - echo "unknown credential option" - exit 1 - ;; -esac diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/credentialspecs/valid.json b/vendor/github.com/docker/docker/integration-cli/fixtures/credentialspecs/valid.json deleted file mode 100644 index 28913e49d..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/credentialspecs/valid.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "CmsPlugins": [ - "ActiveDirectory" - ], - "DomainJoinConfig": { - "Sid": "S-1-5-21-4288985-3632099173-1864715694", - "MachineAccountName": "MusicStoreAcct", - "Guid": "3705d4c3-0b80-42a9-ad97-ebc1801c74b9", - "DnsTreeName": "hyperv.local", - "DnsName": "hyperv.local", - "NetBiosName": "hyperv" - }, - "ActiveDirectoryConfig": { - "GroupManagedServiceAccounts": [ - { - "Name": "MusicStoreAcct", - "Scope": "hyperv.local" - }, - { - "Name": "MusicStoreAcct", - "Scope": "hyperv" - } - ] - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/deploy/default.yaml b/vendor/github.com/docker/docker/integration-cli/fixtures/deploy/default.yaml deleted file mode 100644 index f30c04f8f..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/deploy/default.yaml +++ /dev/null @@ -1,9 +0,0 @@ - -version: "3" -services: - web: - image: busybox@sha256:e4f93f6ed15a0cdd342f5aae387886fba0ab98af0a102da6276eaf24d6e6ade0 - command: top - db: - image: busybox@sha256:e4f93f6ed15a0cdd342f5aae387886fba0ab98af0a102da6276eaf24d6e6ade0 - command: "tail -f /dev/null" diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/deploy/remove.yaml b/vendor/github.com/docker/docker/integration-cli/fixtures/deploy/remove.yaml deleted file mode 100644 index 4ec8cacc9..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/deploy/remove.yaml +++ /dev/null @@ -1,11 +0,0 @@ - -version: "3.1" -services: - web: - image: busybox@sha256:e4f93f6ed15a0cdd342f5aae387886fba0ab98af0a102da6276eaf24d6e6ade0 - command: top - secrets: - - special -secrets: - special: - file: fixtures/secrets/default diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/deploy/secrets.yaml b/vendor/github.com/docker/docker/integration-cli/fixtures/deploy/secrets.yaml deleted file mode 100644 index 6ac92cdde..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/deploy/secrets.yaml +++ /dev/null @@ -1,20 +0,0 @@ - -version: "3.1" -services: - web: - image: busybox@sha256:e4f93f6ed15a0cdd342f5aae387886fba0ab98af0a102da6276eaf24d6e6ade0 - command: top - secrets: - - special - - source: super - target: foo.txt - mode: 0400 - - star -secrets: - special: - file: fixtures/secrets/default - super: - file: fixtures/secrets/default - star: - external: - name: outside diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/https/ca.pem b/vendor/github.com/docker/docker/integration-cli/fixtures/https/ca.pem deleted file mode 100644 index 6825d6d1b..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/https/ca.pem +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIID0TCCAzqgAwIBAgIJAP2r7GqEJwSnMA0GCSqGSIb3DQEBBQUAMIGiMQswCQYD -VQQGEwJVUzELMAkGA1UECBMCQ0ExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMG -A1UEChMMRm9ydC1GdW5zdG9uMREwDwYDVQQLEwhjaGFuZ2VtZTERMA8GA1UEAxMI -Y2hhbmdlbWUxETAPBgNVBCkTCGNoYW5nZW1lMR8wHQYJKoZIhvcNAQkBFhBtYWls -QGhvc3QuZG9tYWluMB4XDTEzMTIwMzE2NTYzMFoXDTIzMTIwMTE2NTYzMFowgaIx -CzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEBxMMU2FuRnJhbmNpc2Nv -MRUwEwYDVQQKEwxGb3J0LUZ1bnN0b24xETAPBgNVBAsTCGNoYW5nZW1lMREwDwYD -VQQDEwhjaGFuZ2VtZTERMA8GA1UEKRMIY2hhbmdlbWUxHzAdBgkqhkiG9w0BCQEW -EG1haWxAaG9zdC5kb21haW4wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALAn -0xDw+5y7ZptQacq66pUhRu82JP2WU6IDgo5QUtNU6/CX5PwQATe/OnYTZQFbksxp -AU9boG0FCkgxfsgPYXEuZxVEGKI2fxfKHOZZI8mrkWmj6eWU/0cvCjGVc9rTITP5 -sNQvg+hORyVDdNp2IdsbMJayiB3AQYMFx3vSDOMTAgMBAAGjggELMIIBBzAdBgNV -HQ4EFgQUZu7DFz09q0QBa2+ymRm9qgK1NPswgdcGA1UdIwSBzzCBzIAUZu7DFz09 -q0QBa2+ymRm9qgK1NPuhgaikgaUwgaIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJD -QTEVMBMGA1UEBxMMU2FuRnJhbmNpc2NvMRUwEwYDVQQKEwxGb3J0LUZ1bnN0b24x -ETAPBgNVBAsTCGNoYW5nZW1lMREwDwYDVQQDEwhjaGFuZ2VtZTERMA8GA1UEKRMI -Y2hhbmdlbWUxHzAdBgkqhkiG9w0BCQEWEG1haWxAaG9zdC5kb21haW6CCQD9q+xq -hCcEpzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAF8fJKKM+/oOdnNi -zEd0M1+PmZOyqvjYQn/2ZR8UHH6Imgc/OPQKZXf0bVE1Txc/DaUNn9Isd1SuCuaE -ic3vAIYYU7PmgeNN6vwec48V96T7jr+GAi6AVMhQEc2hHCfVtx11Xx+x6aHDZzJt -Zxtf5lL6KSO9Y+EFwM+rju6hm5hW ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-cert.pem b/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-cert.pem deleted file mode 100644 index c05ed47c2..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-cert.pem +++ /dev/null @@ -1,73 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 3 (0x3) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=US, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=changeme, CN=changeme/name=changeme/emailAddress=mail@host.domain - Validity - Not Before: Dec 4 14:17:54 2013 GMT - Not After : Dec 2 14:17:54 2023 GMT - Subject: C=US, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=changeme, CN=client/name=changeme/emailAddress=mail@host.domain - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:ca:c9:05:d0:09:4e:3e:a4:fc:d5:14:f4:a5:e8: - 34:d3:6b:51:e3:f3:62:ea:a1:f0:e8:ed:c4:2a:bc: - f0:4f:ca:07:df:e3:88:fa:f4:21:99:35:0e:3d:ea: - b0:86:e7:c4:d2:8a:83:2b:42:b8:ec:a3:99:62:70: - 81:46:cc:fc:a5:1d:d2:63:e8:eb:07:25:9a:e2:25: - 6d:11:56:f2:1a:51:a1:b6:3e:1c:57:32:e9:7b:2c: - aa:1b:cc:97:2d:89:2d:b1:c9:5e:35:28:4d:7c:fa: - 65:31:3e:f7:70:dd:6e:0b:3c:58:af:a8:2e:24:c0: - 7e:4e:78:7d:0a:9e:8f:42:43 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - Easy-RSA Generated Certificate - X509v3 Subject Key Identifier: - DE:42:EF:2D:98:A3:6C:A8:AA:E0:8C:71:2C:9D:64:23:A9:E2:7E:81 - X509v3 Authority Key Identifier: - keyid:66:EE:C3:17:3D:3D:AB:44:01:6B:6F:B2:99:19:BD:AA:02:B5:34:FB - DirName:/C=US/ST=CA/L=SanFrancisco/O=Fort-Funston/OU=changeme/CN=changeme/name=changeme/emailAddress=mail@host.domain - serial:FD:AB:EC:6A:84:27:04:A7 - - X509v3 Extended Key Usage: - TLS Web Client Authentication - X509v3 Key Usage: - Digital Signature - Signature Algorithm: sha1WithRSAEncryption - 1c:44:26:ea:e1:66:25:cb:e4:8e:57:1c:f6:b9:17:22:62:40: - 12:90:8f:3b:b2:61:7a:54:94:8f:b1:20:0b:bf:a3:51:e3:fa: - 1c:a1:be:92:3a:d0:76:44:c0:57:83:ab:6a:e4:1a:45:49:a4: - af:39:0d:60:32:fc:3a:be:d7:fb:5d:99:7a:1f:87:e7:d5:ab: - 84:a2:5e:90:d8:bf:fa:89:6d:32:26:02:5e:31:35:68:7f:31: - f5:6b:51:46:bc:af:70:ed:5a:09:7d:ec:b2:48:4f:fe:c5:2f: - 56:04:ad:f6:c1:d2:2a:e4:6a:c4:87:fe:08:35:c5:38:cb:5e: - 4a:c4 ------BEGIN CERTIFICATE----- -MIIEFTCCA36gAwIBAgIBAzANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMCVVMx -CzAJBgNVBAgTAkNBMRUwEwYDVQQHEwxTYW5GcmFuY2lzY28xFTATBgNVBAoTDEZv -cnQtRnVuc3RvbjERMA8GA1UECxMIY2hhbmdlbWUxETAPBgNVBAMTCGNoYW5nZW1l -MREwDwYDVQQpEwhjaGFuZ2VtZTEfMB0GCSqGSIb3DQEJARYQbWFpbEBob3N0LmRv -bWFpbjAeFw0xMzEyMDQxNDE3NTRaFw0yMzEyMDIxNDE3NTRaMIGgMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCQ0ExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMGA1UE -ChMMRm9ydC1GdW5zdG9uMREwDwYDVQQLEwhjaGFuZ2VtZTEPMA0GA1UEAxMGY2xp -ZW50MREwDwYDVQQpEwhjaGFuZ2VtZTEfMB0GCSqGSIb3DQEJARYQbWFpbEBob3N0 -LmRvbWFpbjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAyskF0AlOPqT81RT0 -peg002tR4/Ni6qHw6O3EKrzwT8oH3+OI+vQhmTUOPeqwhufE0oqDK0K47KOZYnCB -Rsz8pR3SY+jrByWa4iVtEVbyGlGhtj4cVzLpeyyqG8yXLYktscleNShNfPplMT73 -cN1uCzxYr6guJMB+Tnh9Cp6PQkMCAwEAAaOCAVkwggFVMAkGA1UdEwQCMAAwLQYJ -YIZIAYb4QgENBCAWHkVhc3ktUlNBIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNV -HQ4EFgQU3kLvLZijbKiq4IxxLJ1kI6nifoEwgdcGA1UdIwSBzzCBzIAUZu7DFz09 -q0QBa2+ymRm9qgK1NPuhgaikgaUwgaIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJD -QTEVMBMGA1UEBxMMU2FuRnJhbmNpc2NvMRUwEwYDVQQKEwxGb3J0LUZ1bnN0b24x -ETAPBgNVBAsTCGNoYW5nZW1lMREwDwYDVQQDEwhjaGFuZ2VtZTERMA8GA1UEKRMI -Y2hhbmdlbWUxHzAdBgkqhkiG9w0BCQEWEG1haWxAaG9zdC5kb21haW6CCQD9q+xq -hCcEpzATBgNVHSUEDDAKBggrBgEFBQcDAjALBgNVHQ8EBAMCB4AwDQYJKoZIhvcN -AQEFBQADgYEAHEQm6uFmJcvkjlcc9rkXImJAEpCPO7JhelSUj7EgC7+jUeP6HKG+ -kjrQdkTAV4OrauQaRUmkrzkNYDL8Or7X+12Zeh+H59WrhKJekNi/+oltMiYCXjE1 -aH8x9WtRRryvcO1aCX3sskhP/sUvVgSt9sHSKuRqxIf+CDXFOMteSsQ= ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-key.pem b/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-key.pem deleted file mode 100644 index b5c15f8dc..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-key.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMrJBdAJTj6k/NUU -9KXoNNNrUePzYuqh8OjtxCq88E/KB9/jiPr0IZk1Dj3qsIbnxNKKgytCuOyjmWJw -gUbM/KUd0mPo6wclmuIlbRFW8hpRobY+HFcy6XssqhvMly2JLbHJXjUoTXz6ZTE+ -93Ddbgs8WK+oLiTAfk54fQqej0JDAgMBAAECgYBOFEzKp2qbMEexe9ofL2N3rDDh -xkrl8OijpzkLA6i78BxMFn4dsnZlWUpciMrjhsYAExkiRRSS+QMMJimAq1jzQqc3 -FAQV2XGYwkd0cUn7iZGvfNnEPysjsfyYQM+m+sT0ATj4BZjVShC6kkSjTdm1leLN -OSvcHdcu3Xxg9ufF0QJBAPYdnNt5sIndt2WECePuRVi+uF4mlxTobFY0fjn26yhC -4RsnhhD3Vldygo9gvnkwrAZYaALGSPBewes2InxvjA8CQQDS7erKiNXpwoqz5XiU -SVEsIIVTdWzBjGbIqMOu/hUwM5FK4j6JTBks0aTGMyh0YV9L1EzM0X79J29JahCe -iQKNAkBKNMOGqTpBV0hko1sYDk96YobUXG5RL4L6uvkUIQ7mJMQam+AgXXL7Ctuy -v0iu4a38e8tgisiTMP7nHHtpaXihAkAOiN54/lzfMsykANgCP9scE1GcoqbP34Dl -qttxH4kOPT9xzY1JoLjLYdbc4YGUI3GRpBt2sajygNkmUey7P+2xAkBBsVCZFvTw -qHvOpPS2kX5ml5xoc/QAHK9N7kR+X7XFYx82RTVSqJEK4lPb+aEWn+CjiIewO4Q5 -ksDFuNxAzbhl ------END PRIVATE KEY----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-rogue-cert.pem b/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-rogue-cert.pem deleted file mode 100644 index 21ae4bd57..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-rogue-cert.pem +++ /dev/null @@ -1,73 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 2 (0x2) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=US, ST=CA, L=SanFrancisco, O=Evil Inc, OU=changeme, CN=changeme/name=changeme/emailAddress=mail@host.domain - Validity - Not Before: Feb 24 17:54:59 2014 GMT - Not After : Feb 22 17:54:59 2024 GMT - Subject: C=US, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=changeme, CN=client/name=changeme/emailAddress=mail@host.domain - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:e8:e2:2c:b8:d4:db:89:50:4f:47:1e:68:db:f7: - e4:cc:47:41:63:75:03:37:50:7a:a8:4d:27:36:d5: - 15:01:08:b6:cf:56:f7:56:6d:3d:f9:e2:8d:1a:5d: - bf:a0:24:5e:07:55:8e:d0:dc:f1:fa:19:87:1d:d6: - b6:58:82:2e:ba:69:6d:e9:d9:c8:16:0d:1d:59:7f: - f4:8e:58:10:01:3d:21:14:16:3c:ec:cd:8c:b7:0e: - e6:7b:77:b4:f9:90:a5:17:01:bb:84:c6:b2:12:87: - 70:eb:9f:6d:4f:d0:68:8b:96:c0:e7:0b:51:b4:9d: - 1d:7b:6c:7b:be:89:6b:88:8b - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Comment: - Easy-RSA Generated Certificate - X509v3 Subject Key Identifier: - 9E:F8:49:D0:A2:76:30:5C:AB:2B:8A:B5:8D:C6:45:1F:A7:F8:CF:85 - X509v3 Authority Key Identifier: - keyid:DC:A5:F1:76:DB:4E:CD:8E:EF:B1:23:56:1D:92:80:99:74:3B:EA:6F - DirName:/C=US/ST=CA/L=SanFrancisco/O=Evil Inc/OU=changeme/CN=changeme/name=changeme/emailAddress=mail@host.domain - serial:E7:21:1E:18:41:1B:96:83 - - X509v3 Extended Key Usage: - TLS Web Client Authentication - X509v3 Key Usage: - Digital Signature - Signature Algorithm: sha1WithRSAEncryption - 48:76:c0:18:fa:0a:ee:4e:1a:ec:02:9d:d4:83:ca:94:54:a1: - 3f:51:2f:3e:4b:95:c3:42:9b:71:a0:4b:d9:af:47:23:b9:1c: - fb:85:ba:76:e2:09:cb:65:bb:d2:7d:44:3d:4b:67:ba:80:83: - be:a8:ed:c4:b9:ea:1a:1b:c7:59:3b:d9:5c:0d:46:d8:c9:92: - cb:10:c5:f2:1a:38:a4:aa:07:2c:e3:84:16:79:c7:95:09:e3: - 01:d2:15:a2:77:0b:8b:bf:94:04:e9:7f:c0:cd:e6:2e:64:cd: - 1e:a3:32:ec:11:cc:62:ce:c7:4e:cd:ad:48:5c:b1:b8:e9:76: - b3:f9 ------BEGIN CERTIFICATE----- -MIIEDTCCA3agAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMCVVMx -CzAJBgNVBAgTAkNBMRUwEwYDVQQHEwxTYW5GcmFuY2lzY28xETAPBgNVBAoTCEV2 -aWwgSW5jMREwDwYDVQQLEwhjaGFuZ2VtZTERMA8GA1UEAxMIY2hhbmdlbWUxETAP -BgNVBCkTCGNoYW5nZW1lMR8wHQYJKoZIhvcNAQkBFhBtYWlsQGhvc3QuZG9tYWlu -MB4XDTE0MDIyNDE3NTQ1OVoXDTI0MDIyMjE3NTQ1OVowgaAxCzAJBgNVBAYTAlVT -MQswCQYDVQQIEwJDQTEVMBMGA1UEBxMMU2FuRnJhbmNpc2NvMRUwEwYDVQQKEwxG -b3J0LUZ1bnN0b24xETAPBgNVBAsTCGNoYW5nZW1lMQ8wDQYDVQQDEwZjbGllbnQx -ETAPBgNVBCkTCGNoYW5nZW1lMR8wHQYJKoZIhvcNAQkBFhBtYWlsQGhvc3QuZG9t -YWluMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDo4iy41NuJUE9HHmjb9+TM -R0FjdQM3UHqoTSc21RUBCLbPVvdWbT354o0aXb+gJF4HVY7Q3PH6GYcd1rZYgi66 -aW3p2cgWDR1Zf/SOWBABPSEUFjzszYy3DuZ7d7T5kKUXAbuExrISh3Drn21P0GiL -lsDnC1G0nR17bHu+iWuIiwIDAQABo4IBVTCCAVEwCQYDVR0TBAIwADAtBglghkgB -hvhCAQ0EIBYeRWFzeS1SU0EgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQW -BBSe+EnQonYwXKsrirWNxkUfp/jPhTCB0wYDVR0jBIHLMIHIgBTcpfF2207Nju+x -I1YdkoCZdDvqb6GBpKSBoTCBnjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRUw -EwYDVQQHEwxTYW5GcmFuY2lzY28xETAPBgNVBAoTCEV2aWwgSW5jMREwDwYDVQQL -EwhjaGFuZ2VtZTERMA8GA1UEAxMIY2hhbmdlbWUxETAPBgNVBCkTCGNoYW5nZW1l -MR8wHQYJKoZIhvcNAQkBFhBtYWlsQGhvc3QuZG9tYWluggkA5yEeGEEbloMwEwYD -VR0lBAwwCgYIKwYBBQUHAwIwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GB -AEh2wBj6Cu5OGuwCndSDypRUoT9RLz5LlcNCm3GgS9mvRyO5HPuFunbiCctlu9J9 -RD1LZ7qAg76o7cS56hobx1k72VwNRtjJkssQxfIaOKSqByzjhBZ5x5UJ4wHSFaJ3 -C4u/lATpf8DN5i5kzR6jMuwRzGLOx07NrUhcsbjpdrP5 ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-rogue-key.pem b/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-rogue-key.pem deleted file mode 100644 index 53c122ab7..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/https/client-rogue-key.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOjiLLjU24lQT0ce -aNv35MxHQWN1AzdQeqhNJzbVFQEIts9W91ZtPfnijRpdv6AkXgdVjtDc8foZhx3W -tliCLrppbenZyBYNHVl/9I5YEAE9IRQWPOzNjLcO5nt3tPmQpRcBu4TGshKHcOuf -bU/QaIuWwOcLUbSdHXtse76Ja4iLAgMBAAECgYADs+TmI2xCKKa6CL++D5jxrohZ -nnionnz0xBVFh+nHlG3jqgxQsXf0yydXLfpn/2wHTdLxezHVuiYt0UYg7iD0CglW -+IjcgMebzyjLeYqYOE5llPlMvhp2HoEMYJNb+7bRrZ1WCITbu+Su0w1cgA7Cs+Ej -VlfvGzN+qqnDThRUYQJBAPY0sMWZJKly8QhUmUvmcXdPczzSOf6Mm7gc5LR6wzxd -vW7syuqk50qjqVqFpN81vCV7GoDxRUWbTM9ftf7JGFkCQQDyJc/1RMygE2o+enU1 -6UBxJyclXITEYtDn8aoEpLNc7RakP1WoPUKjZOnjkcoKcIkFNkSPeCfQujrb5f3F -MkuDAkByAI/hzzmkpK5rFxEsjfX4Mve/L/DepyjrpaVY1IdWimlO1aJX6CeY7hNa -8QsYt/74s/nfvtg+lNyKIV1aLq9xAkB+WSSNgfyTeg3x08vc+Xxajmdqoz/TiQwg -OoTQL3A3iK5LvZBgXLasszcnOycFE3srcQmNItEDpGiZ3QPxJTEpAkEA45EE9NMJ -SA7EGWSFlbz4f4u4oBeiDiJRJbGGfAyVxZlpCWUjPpg9+swsWoFEOjnGYaChAMk5 -nrOdMf15T6QF7Q== ------END PRIVATE KEY----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-cert.pem b/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-cert.pem deleted file mode 100644 index 08abfd1a3..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-cert.pem +++ /dev/null @@ -1,76 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 4 (0x4) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=US, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=changeme, CN=changeme/name=changeme/emailAddress=mail@host.domain - Validity - Not Before: Dec 4 15:01:20 2013 GMT - Not After : Dec 2 15:01:20 2023 GMT - Subject: C=US, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=changeme, CN=*/name=changeme/emailAddress=mail@host.domain - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:c1:ff:7d:30:6f:64:4a:b1:92:b1:71:d1:c1:74: - e2:1d:db:2d:11:24:e1:00:d4:00:ae:6f:c8:9e:ae: - 67:b3:4a:bd:f7:e6:9e:57:6d:19:4c:3c:23:94:2d: - 3d:d6:63:84:d8:fa:76:2b:38:12:c1:ed:20:9d:32: - e0:e8:c2:bf:9a:77:70:04:3f:7f:ca:8c:2c:82:d6: - 3d:25:5c:02:1a:4f:64:93:03:dd:9c:42:97:5e:09: - 49:af:f0:c2:e1:30:08:0e:21:46:95:d1:13:59:c0: - c8:76:be:94:0d:8b:43:67:21:33:b2:08:60:9d:76: - a8:05:32:1e:f9:95:09:14:75 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Cert Type: - SSL Server - Netscape Comment: - Easy-RSA Generated Server Certificate - X509v3 Subject Key Identifier: - 14:02:FD:FD:DD:13:38:E0:71:EA:D1:BE:C0:0E:89:1A:2D:B6:19:06 - X509v3 Authority Key Identifier: - keyid:66:EE:C3:17:3D:3D:AB:44:01:6B:6F:B2:99:19:BD:AA:02:B5:34:FB - DirName:/C=US/ST=CA/L=SanFrancisco/O=Fort-Funston/OU=changeme/CN=changeme/name=changeme/emailAddress=mail@host.domain - serial:FD:AB:EC:6A:84:27:04:A7 - - X509v3 Extended Key Usage: - TLS Web Server Authentication - X509v3 Key Usage: - Digital Signature, Key Encipherment - Signature Algorithm: sha1WithRSAEncryption - 40:0f:10:39:c4:b7:0f:0d:2f:bf:d2:16:cc:8e:d3:9a:fb:8b: - ce:4b:7b:0d:48:77:ce:f1:fe:d5:8f:ea:b1:71:ed:49:1d:9f: - 23:3a:16:d4:70:7c:c5:29:bf:e4:90:34:d0:f0:00:24:f4:e4: - df:2c:c3:83:01:66:61:c9:a8:ab:29:e7:98:6d:27:89:4a:76: - c9:2e:19:8e:fe:6e:d5:f8:99:11:0e:97:67:4b:34:e3:1e:e3: - 9f:35:00:a5:32:f9:b5:2c:f2:e0:c5:2e:cc:81:bd:18:dd:5c: - 12:c8:6b:fa:0c:17:74:30:55:f6:6e:20:9a:6c:1e:09:b4:0c: - 15:42 ------BEGIN CERTIFICATE----- -MIIEKjCCA5OgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMCVVMx -CzAJBgNVBAgTAkNBMRUwEwYDVQQHEwxTYW5GcmFuY2lzY28xFTATBgNVBAoTDEZv -cnQtRnVuc3RvbjERMA8GA1UECxMIY2hhbmdlbWUxETAPBgNVBAMTCGNoYW5nZW1l -MREwDwYDVQQpEwhjaGFuZ2VtZTEfMB0GCSqGSIb3DQEJARYQbWFpbEBob3N0LmRv -bWFpbjAeFw0xMzEyMDQxNTAxMjBaFw0yMzEyMDIxNTAxMjBaMIGbMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCQ0ExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMGA1UE -ChMMRm9ydC1GdW5zdG9uMREwDwYDVQQLEwhjaGFuZ2VtZTEKMAgGA1UEAxQBKjER -MA8GA1UEKRMIY2hhbmdlbWUxHzAdBgkqhkiG9w0BCQEWEG1haWxAaG9zdC5kb21h -aW4wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMH/fTBvZEqxkrFx0cF04h3b -LREk4QDUAK5vyJ6uZ7NKvffmnldtGUw8I5QtPdZjhNj6dis4EsHtIJ0y4OjCv5p3 -cAQ/f8qMLILWPSVcAhpPZJMD3ZxCl14JSa/wwuEwCA4hRpXRE1nAyHa+lA2LQ2ch -M7IIYJ12qAUyHvmVCRR1AgMBAAGjggFzMIIBbzAJBgNVHRMEAjAAMBEGCWCGSAGG -+EIBAQQEAwIGQDA0BglghkgBhvhCAQ0EJxYlRWFzeS1SU0EgR2VuZXJhdGVkIFNl -cnZlciBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUFAL9/d0TOOBx6tG+wA6JGi22GQYw -gdcGA1UdIwSBzzCBzIAUZu7DFz09q0QBa2+ymRm9qgK1NPuhgaikgaUwgaIxCzAJ -BgNVBAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEBxMMU2FuRnJhbmNpc2NvMRUw -EwYDVQQKEwxGb3J0LUZ1bnN0b24xETAPBgNVBAsTCGNoYW5nZW1lMREwDwYDVQQD -EwhjaGFuZ2VtZTERMA8GA1UEKRMIY2hhbmdlbWUxHzAdBgkqhkiG9w0BCQEWEG1h -aWxAaG9zdC5kb21haW6CCQD9q+xqhCcEpzATBgNVHSUEDDAKBggrBgEFBQcDATAL -BgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQEFBQADgYEAQA8QOcS3Dw0vv9IWzI7TmvuL -zkt7DUh3zvH+1Y/qsXHtSR2fIzoW1HB8xSm/5JA00PAAJPTk3yzDgwFmYcmoqynn -mG0niUp2yS4Zjv5u1fiZEQ6XZ0s04x7jnzUApTL5tSzy4MUuzIG9GN1cEshr+gwX -dDBV9m4gmmweCbQMFUI= ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-key.pem b/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-key.pem deleted file mode 100644 index c269320ef..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-key.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMH/fTBvZEqxkrFx -0cF04h3bLREk4QDUAK5vyJ6uZ7NKvffmnldtGUw8I5QtPdZjhNj6dis4EsHtIJ0y -4OjCv5p3cAQ/f8qMLILWPSVcAhpPZJMD3ZxCl14JSa/wwuEwCA4hRpXRE1nAyHa+ -lA2LQ2chM7IIYJ12qAUyHvmVCRR1AgMBAAECgYAmwckb9RUfSwyYgLm8IYLPHiuJ -wkllZfVg5Bo7gXJcQnFjZmJ56uTj8xvUjZlODIHM63TSO5ibv6kFXtXKCqZGd2M+ -wGbhZ0f+2GvKcwMmJERnIQjuoNaYSQLT0tM0VB9Iz0rJlZC+tzPZ+5pPqEumRdsS -IzWNXfF42AhcbwAQYQJBAPVXtMYIJc9EZsz86ZcQiMPWUpCX5vnRmtwL8kKyR8D5 -4KfYeiowyFffSRMMcclwNHq7TgSXN+nIXM9WyzyzwikCQQDKbNA28AgZp9aT54HP -WnbeE2pmt+uk/zl/BtxJSoK6H+69Jec+lf7EgL7HgOWYRSNot4uQWu8IhsHLTiUq -+0FtAkEAqwlRxRy4/x24bP+D+QRV0/D97j93joFJbE4Hved7jlSlAV4xDGilwlyv -HNB4Iu5OJ6Gcaibhm+FKkmD3noHSwQJBAIpu3fokLzX0bS+bDFBU6qO3HXX/47xj -+tsfQvkwZrSI8AkU6c8IX0HdVhsz0FBRQAT2ORDQz1XCarfxykNZrwUCQQCGCBIc -BBCWzhHlswlGidWJg3HqqO6hPPClEr3B5G87oCsdeYwiO23XT6rUnoJXfJHp6oCW -5nCwDu5ZTP+khltg ------END PRIVATE KEY----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-rogue-cert.pem b/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-rogue-cert.pem deleted file mode 100644 index 28feba665..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-rogue-cert.pem +++ /dev/null @@ -1,76 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 3 (0x3) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=US, ST=CA, L=SanFrancisco, O=Evil Inc, OU=changeme, CN=changeme/name=changeme/emailAddress=mail@host.domain - Validity - Not Before: Feb 28 18:49:31 2014 GMT - Not After : Feb 26 18:49:31 2024 GMT - Subject: C=US, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=changeme, CN=localhost/name=changeme/emailAddress=mail@host.domain - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (1024 bit) - Modulus: - 00:d1:08:58:24:60:a1:69:65:4b:76:46:8f:88:75: - 7c:49:3a:d8:03:cc:5b:58:c5:d1:bb:e5:f9:54:b9: - 75:65:df:7e:bb:fb:54:d4:b2:e9:6f:58:a2:a4:84: - 43:94:77:24:81:38:36:36:f0:66:65:26:e5:5b:2a: - 14:1c:a9:ae:57:7f:75:00:23:14:4b:61:58:e4:82: - aa:15:97:94:bd:50:35:0d:5d:18:18:ed:10:6a:bb: - d3:64:5a:eb:36:98:5b:58:a7:fe:67:48:c1:6c:3f: - 51:2f:02:65:96:54:77:9b:34:f9:a7:d2:63:54:6a: - 9e:02:5c:be:65:98:a4:b4:b5 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: - CA:FALSE - Netscape Cert Type: - SSL Server - Netscape Comment: - Easy-RSA Generated Server Certificate - X509v3 Subject Key Identifier: - 1F:E0:57:CA:CB:76:C9:C4:86:B9:EA:69:17:C0:F3:51:CE:95:40:EC - X509v3 Authority Key Identifier: - keyid:DC:A5:F1:76:DB:4E:CD:8E:EF:B1:23:56:1D:92:80:99:74:3B:EA:6F - DirName:/C=US/ST=CA/L=SanFrancisco/O=Evil Inc/OU=changeme/CN=changeme/name=changeme/emailAddress=mail@host.domain - serial:E7:21:1E:18:41:1B:96:83 - - X509v3 Extended Key Usage: - TLS Web Server Authentication - X509v3 Key Usage: - Digital Signature, Key Encipherment - Signature Algorithm: sha1WithRSAEncryption - 04:93:0e:28:01:94:18:f0:8c:7c:d3:0c:ad:e9:b7:46:b1:30: - 65:ed:68:7c:8c:91:cd:1a:86:66:87:4a:4f:c0:97:bc:f7:85: - 4b:38:79:31:b2:65:88:b1:76:16:9e:80:93:38:f4:b9:eb:65: - 00:6d:bb:89:e0:a1:bf:95:5e:80:13:8e:01:73:d3:f1:08:73: - 85:a5:33:75:0b:42:8a:a3:07:09:35:ef:d7:c6:58:eb:60:a3: - 06:89:a0:53:99:e2:aa:41:90:e0:1a:d2:12:4b:48:7d:c3:9c: - ad:bd:0e:5e:5f:f7:09:0c:5d:7c:86:24:dd:92:d5:b3:14:06: - c7:9f ------BEGIN CERTIFICATE----- -MIIEKjCCA5OgAwIBAgIBAzANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMCVVMx -CzAJBgNVBAgTAkNBMRUwEwYDVQQHEwxTYW5GcmFuY2lzY28xETAPBgNVBAoTCEV2 -aWwgSW5jMREwDwYDVQQLEwhjaGFuZ2VtZTERMA8GA1UEAxMIY2hhbmdlbWUxETAP -BgNVBCkTCGNoYW5nZW1lMR8wHQYJKoZIhvcNAQkBFhBtYWlsQGhvc3QuZG9tYWlu -MB4XDTE0MDIyODE4NDkzMVoXDTI0MDIyNjE4NDkzMVowgaMxCzAJBgNVBAYTAlVT -MQswCQYDVQQIEwJDQTEVMBMGA1UEBxMMU2FuRnJhbmNpc2NvMRUwEwYDVQQKEwxG -b3J0LUZ1bnN0b24xETAPBgNVBAsTCGNoYW5nZW1lMRIwEAYDVQQDEwlsb2NhbGhv -c3QxETAPBgNVBCkTCGNoYW5nZW1lMR8wHQYJKoZIhvcNAQkBFhBtYWlsQGhvc3Qu -ZG9tYWluMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRCFgkYKFpZUt2Ro+I -dXxJOtgDzFtYxdG75flUuXVl3367+1TUsulvWKKkhEOUdySBODY28GZlJuVbKhQc -qa5Xf3UAIxRLYVjkgqoVl5S9UDUNXRgY7RBqu9NkWus2mFtYp/5nSMFsP1EvAmWW -VHebNPmn0mNUap4CXL5lmKS0tQIDAQABo4IBbzCCAWswCQYDVR0TBAIwADARBglg -hkgBhvhCAQEEBAMCBkAwNAYJYIZIAYb4QgENBCcWJUVhc3ktUlNBIEdlbmVyYXRl -ZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFB/gV8rLdsnEhrnqaRfA81HO -lUDsMIHTBgNVHSMEgcswgciAFNyl8XbbTs2O77EjVh2SgJl0O+pvoYGkpIGhMIGe -MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFTATBgNVBAcTDFNhbkZyYW5jaXNj -bzERMA8GA1UEChMIRXZpbCBJbmMxETAPBgNVBAsTCGNoYW5nZW1lMREwDwYDVQQD -EwhjaGFuZ2VtZTERMA8GA1UEKRMIY2hhbmdlbWUxHzAdBgkqhkiG9w0BCQEWEG1h -aWxAaG9zdC5kb21haW6CCQDnIR4YQRuWgzATBgNVHSUEDDAKBggrBgEFBQcDATAL -BgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQEFBQADgYEABJMOKAGUGPCMfNMMrem3RrEw -Ze1ofIyRzRqGZodKT8CXvPeFSzh5MbJliLF2Fp6Akzj0uetlAG27ieChv5VegBOO -AXPT8QhzhaUzdQtCiqMHCTXv18ZY62CjBomgU5niqkGQ4BrSEktIfcOcrb0OXl/3 -CQxdfIYk3ZLVsxQGx58= ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-rogue-key.pem b/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-rogue-key.pem deleted file mode 100644 index 10f7c6500..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/https/server-rogue-key.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANEIWCRgoWllS3ZG -j4h1fEk62APMW1jF0bvl+VS5dWXffrv7VNSy6W9YoqSEQ5R3JIE4NjbwZmUm5Vsq -FByprld/dQAjFEthWOSCqhWXlL1QNQ1dGBjtEGq702Ra6zaYW1in/mdIwWw/US8C -ZZZUd5s0+afSY1RqngJcvmWYpLS1AgMBAAECgYAJXh9dGfuB1qlIFqduDR3RxlJR -8UGSu+LHUeoXkuwg8aAjWoMVuSLe+5DmYIsKx0AajmNXmPRtyg1zRXJ7SltmubJ8 -6qQVDsRk6biMdkpkl6a9Gk2av40psD9/VPGxagEoop7IKYhf3AeKPvPiwVB2qFrl -1aYMZm0aMR55pgRajQJBAOk8IsJDf0beooDZXVdv/oe4hcbM9fxO8Cn3qzoGImqD -37LL+PCzDP7AEV3fk43SsZDeSk+LDX+h0o9nPyhzHasCQQDlb3aDgcQY9NaGLUWO -moOCB3148eBVcAwCocu+OSkf7sbQdvXxgThBOrZl11wwRIMQqh99c2yeUwj+tELl -3VcfAkBZTiNpCvtDIaBLge9RuZpWUXs3wec2cutWxnSTxSGMc25GQf/R+l0xdk2w -ChmvpktDUzpU9sN2aXn8WuY+EMX9AkEApbLpUbKPUELLB958RLA819TW/lkZXjrs -wZ3eSoR3ufM1rOqtVvyvBxUDE+wETWu9iHSFB5Ir2PA5J9JCGkbPmwJAFI1ndfBj -iuyU93nFX0p+JE2wVHKx4dMzKCearNKiJh/lGDtUq3REGgamTNUnG8RAITUbxFs+ -Z1hrIq8xYl2LOQ== ------END PRIVATE KEY----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/load/emptyLayer.tar b/vendor/github.com/docker/docker/integration-cli/fixtures/load/emptyLayer.tar deleted file mode 100644 index beabb569ac1e7fea69848f79ffd77fb17b2487b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30720 zcmeI4ZExeo5y$c* zovW*2`my-BS#-6VC#(TWylUoH;FtY>E>gSBdD(R?T)*vNRTtCjW{dQq*rhc~JiEJz zsl`J#iI?4n-S>-|RPWcb+PkO&p2Vj7>-wi+S}$j_7sXd|yt?(*H*av1 z+nj$j?T=M`^{U#O?d!U0Kio7`Pi=kdMg6yBHQQD7cjwb=bNHthMQp;4h~=l$E~*AE zuwWB8>5;iMTvuHR-Lmal{@LpHT4MUleZcZ73oou6S9)q>^d-k>oX_}Qcxyo^p;T#I z4yBjEs}MP78A@rGh|&6(B$v4q&IKEaPbcYiRLK(|Fm&Lbue#U-=g_}>K?m>u=o9SE z|2Wfh|Nm{EC(M}~AUk1=_?|0jAs(MS-F>HlGq1Fv!G%u}F zxq~RdI2NK#f|*#Nn~(V{vFLOO8UqEuV@wWH0lWbP;+XE!kN?B|zvfDCV+{KLI33XJ zG420+{r|!CKbik8jnddl(C`@lF&t?A{}{IbApid{FhAKg29N*Y{y*OI0q1{v<6mif z{ttd8A4C0_$Nx6||IluLzUGZ<*Y1BAOzlPXfBaM3-28d; z^3|(Ru4ZY9j6K(!m62PF7=SBvvY>6u9_MkwI>$54a7OCT$T3-m=lJE( zmUnm}hhi;&u@=Bq+_JlF`T)-5bsBwzUH;iw#FV;!sB`|AkTbLnLJ;j*XJ0q(@q+&r#AY7K_tidj`Je@64Y zt^SAcHvH+*phv{y_9nO&aXZ27@H1gNA7uuCn|I7u4AJ4h5%>!(#?o4@01sM9=?Y<}U-wbn}~IT=+q) zpnU-y`(0?Hj|bqk-Cup*+8>Y5g-CYfCvx)B0vO)01+SpM1Tko z0U|&IhyW2F0z`la5CI}U1c(3;cp3zTzMXo^%Y*&eXctdy*>?6A8Sq zp|r}Cz7&k%LWj}|qk_p@3pT0=6BEu*_dHZBTzvXOYO{wlC)G^^hyW2F0z`la5CI}U k1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)z%wTBe{YUtx&QzG diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/load/frozen.go b/vendor/github.com/docker/docker/integration-cli/fixtures/load/frozen.go deleted file mode 100644 index 13cd393f3..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/load/frozen.go +++ /dev/null @@ -1,182 +0,0 @@ -package load - -import ( - "bufio" - "bytes" - "os" - "os/exec" - "path/filepath" - "strings" - "sync" - - "github.com/pkg/errors" -) - -var frozenImgDir = "/docker-frozen-images" - -// FrozenImagesLinux loads the frozen image set for the integration suite -// If the images are not available locally it will download them -// TODO: This loads whatever is in the frozen image dir, regardless of what -// images were passed in. If the images need to be downloaded, then it will respect -// the passed in images -func FrozenImagesLinux(dockerBinary string, images ...string) error { - imgNS := os.Getenv("TEST_IMAGE_NAMESPACE") - var loadImages []struct{ srcName, destName string } - for _, img := range images { - if err := exec.Command(dockerBinary, "inspect", "--type=image", img).Run(); err != nil { - srcName := img - // hello-world:latest gets re-tagged as hello-world:frozen - // there are some tests that use hello-world:latest specifically so it pulls - // the image and hello-world:frozen is used for when we just want a super - // small image - if img == "hello-world:frozen" { - srcName = "hello-world:latest" - } - if imgNS != "" { - srcName = imgNS + "/" + srcName - } - loadImages = append(loadImages, struct{ srcName, destName string }{ - srcName: srcName, - destName: img, - }) - } - } - if len(loadImages) == 0 { - // everything is loaded, we're done - return nil - } - - fi, err := os.Stat(frozenImgDir) - if err != nil || !fi.IsDir() { - srcImages := make([]string, 0, len(loadImages)) - for _, img := range loadImages { - srcImages = append(srcImages, img.srcName) - } - if err := pullImages(dockerBinary, srcImages); err != nil { - return errors.Wrap(err, "error pulling image list") - } - } else { - if err := loadFrozenImages(dockerBinary); err != nil { - return err - } - } - - for _, img := range loadImages { - if img.srcName != img.destName { - if out, err := exec.Command(dockerBinary, "tag", img.srcName, img.destName).CombinedOutput(); err != nil { - return errors.Errorf("%v: %s", err, string(out)) - } - if out, err := exec.Command(dockerBinary, "rmi", img.srcName).CombinedOutput(); err != nil { - return errors.Errorf("%v: %s", err, string(out)) - } - } - } - return nil -} - -func loadFrozenImages(dockerBinary string) error { - tar, err := exec.LookPath("tar") - if err != nil { - return errors.Wrap(err, "could not find tar binary") - } - tarCmd := exec.Command(tar, "-cC", frozenImgDir, ".") - out, err := tarCmd.StdoutPipe() - if err != nil { - return errors.Wrap(err, "error getting stdout pipe for tar command") - } - - errBuf := bytes.NewBuffer(nil) - tarCmd.Stderr = errBuf - tarCmd.Start() - defer tarCmd.Wait() - - cmd := exec.Command(dockerBinary, "load") - cmd.Stdin = out - if out, err := cmd.CombinedOutput(); err != nil { - return errors.Errorf("%v: %s", err, string(out)) - } - return nil -} - -func pullImages(dockerBinary string, images []string) error { - cwd, err := os.Getwd() - if err != nil { - return errors.Wrap(err, "error getting path to dockerfile") - } - dockerfile := os.Getenv("DOCKERFILE") - if dockerfile == "" { - dockerfile = "Dockerfile" - } - dockerfilePath := filepath.Join(filepath.Dir(filepath.Clean(cwd)), dockerfile) - pullRefs, err := readFrozenImageList(dockerfilePath, images) - if err != nil { - return errors.Wrap(err, "error reading frozen image list") - } - - var wg sync.WaitGroup - chErr := make(chan error, len(images)) - for tag, ref := range pullRefs { - wg.Add(1) - go func(tag, ref string) { - defer wg.Done() - if out, err := exec.Command(dockerBinary, "pull", ref).CombinedOutput(); err != nil { - chErr <- errors.Errorf("%v: %s", string(out), err) - return - } - if out, err := exec.Command(dockerBinary, "tag", ref, tag).CombinedOutput(); err != nil { - chErr <- errors.Errorf("%v: %s", string(out), err) - return - } - if out, err := exec.Command(dockerBinary, "rmi", ref).CombinedOutput(); err != nil { - chErr <- errors.Errorf("%v: %s", string(out), err) - return - } - }(tag, ref) - } - wg.Wait() - close(chErr) - return <-chErr -} - -func readFrozenImageList(dockerfilePath string, images []string) (map[string]string, error) { - f, err := os.Open(dockerfilePath) - if err != nil { - return nil, errors.Wrap(err, "error reading dockerfile") - } - defer f.Close() - ls := make(map[string]string) - - scanner := bufio.NewScanner(f) - for scanner.Scan() { - line := strings.Fields(scanner.Text()) - if len(line) < 3 { - continue - } - if !(line[0] == "RUN" && line[1] == "./contrib/download-frozen-image-v2.sh") { - continue - } - - frozenImgDir = line[2] - if line[2] == frozenImgDir { - frozenImgDir = filepath.Join(os.Getenv("DEST"), "frozen-images") - } - - for scanner.Scan() { - img := strings.TrimSpace(scanner.Text()) - img = strings.TrimSuffix(img, "\\") - img = strings.TrimSpace(img) - split := strings.Split(img, "@") - if len(split) < 2 { - break - } - - for _, i := range images { - if split[0] == i { - ls[i] = img - break - } - } - } - } - return ls, nil -} diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey1.crt b/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey1.crt deleted file mode 100644 index 2218f23c8..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey1.crt +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDhTCCAm2gAwIBAgIJAP2EcMN2UXPcMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNV -BAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEBxMMU2FuRnJhbmNpc2NvMQ8wDQYD -VQQKEwZEb2NrZXIxEzARBgNVBAMTCmRlbGVnYXRpb24wHhcNMTYwOTI4MTc0ODQ4 -WhcNMjYwNjI4MTc0ODQ4WjBXMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFTAT -BgNVBAcTDFNhbkZyYW5jaXNjbzEPMA0GA1UEChMGRG9ja2VyMRMwEQYDVQQDEwpk -ZWxlZ2F0aW9uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvgewhaYs -Ke5s2AM7xxKrT4A6n7hW17qSnBjonCcPcwTFmYqIOdxWjYITgJuHrTwB4ZhBqWS7 -tTsUUu6hWLMeB7Uo5/GEQAAZspKkT9G/rNKF9lbWK9PPhGGkeR01c/Q932m92Hsn -fCQ0Pp/OzD3nVTh0v9HKk+PObNMOCcqG87eYs4ylPRxs0RrE/rP+bEGssKQSbeCZ -wazDnO+kiatVgKQZ2CK23iFdRE1z2rzqVDeaFWdvBqrRdWnkOZClhlLgEQ5nK2yV -B6tSqOiI3MmHyHzIkGOQJp2/s7Pe0ckEkzsjTsJW8oKHlBBl6pRxHIKzNN4VFbeB -vvYvrogrDrC/owIDAQABo1QwUjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIF -oDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUFoHfukRa6qGk1ncON64Z -ASKlZdkwDQYJKoZIhvcNAQELBQADggEBAEq9Adpd03CPmpbRtTAJGAkjjLFr60sV -2r+/l/m9R31ZCN9ymM9nxToQ8zfMdeAh/nnPcErziil2gDVqXueCNDkRj09tmDIE -Q1Oc92uyNZNgcECow77cKZCTZSTku+qsJrYaykH5vSnia8ltcKj8inJedIcpBR+p -608HEQvF0Eg5eaLPJwH48BCb0Gqdri1dJgrNnqptz7MDr8M+u7tHVulbAd3YxLlq -JH1W2bkVUx6esbn/MUE5HL5iTuOYREEINvBSmLdmmFkampmCnCB/bDEyJeL9bAkt -ZPIi0UNSnqFKLSP1Vf8AGLXt6iO7+1OGvtsDXEEYdXVOMsSXZtUuT7A= ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey1.key b/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey1.key deleted file mode 100644 index cb37efc94..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey1.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAvgewhaYsKe5s2AM7xxKrT4A6n7hW17qSnBjonCcPcwTFmYqI -OdxWjYITgJuHrTwB4ZhBqWS7tTsUUu6hWLMeB7Uo5/GEQAAZspKkT9G/rNKF9lbW -K9PPhGGkeR01c/Q932m92HsnfCQ0Pp/OzD3nVTh0v9HKk+PObNMOCcqG87eYs4yl -PRxs0RrE/rP+bEGssKQSbeCZwazDnO+kiatVgKQZ2CK23iFdRE1z2rzqVDeaFWdv -BqrRdWnkOZClhlLgEQ5nK2yVB6tSqOiI3MmHyHzIkGOQJp2/s7Pe0ckEkzsjTsJW -8oKHlBBl6pRxHIKzNN4VFbeBvvYvrogrDrC/owIDAQABAoIBAB/o8KZwsgfUhqh7 -WoViSCwQb0e0z7hoFwhpUl4uXPTGf1v6HEgDDPG0PwwgkdbwNaypQZVtWevj4NTQ -R326jjdjH1xbfQa2PZpz722L3jDqJR6plEtFxRoIv3KrCffPsrgabIu2mnnJJpDB -ixtW5cq0sT4ov2i4H0i85CWWwbSY/G/MHsvCuK9PhoCj9uToVqrf1KrAESE5q4fh -mPSYUL99KVnj7SZkUz+79rc8sLLPVks3szZACMlm1n05ZTj/d6Nd2ZZUO45DllIj -1XJghfWmnChrB/P/KYXgQ3Y9BofIAw1ra2y3wOZeqRFNsbmojcGldfdtN/iQzhEj -uk4ThokCgYEA9FTmv36N8qSPWuqX/KzkixDQ8WrDGohcB54kK98Wx4ijXx3i38SY -tFjO8YUS9GVo1+UgmRjZbzVX7xeum6+TdBBwOjNOxEQ4tzwiQBWDdGpli8BccdJ2 -OOIVxSslWhiUWfpYloXVetrR88iHbT882g795pbonDaJdXSLnij4UW8CgYEAxxrr -QFpsmOEZvI/yPSOGdG7A1RIsCeH+cEOf4cKghs7+aCtAHlIweztNOrqirl3oKI1r -I0zQl46WsaW8S/y99v9lmmnZbWwqLa4vIu0NWs0zaZdzKZw3xljMhgp4Ge69hHa2 -utCtAxcX+7q/yLlHoTiYwKdxX54iLkheCB8csw0CgYEAleEG820kkjXUIodJ2JwO -Tihwo8dEC6CeI6YktizRgnEVFqH0rCOjMO5Rc+KX8AfNOrK5PnD54LguSuKSH7qi -j04OKgWTSd43lF90+y63RtCFnibQDpp2HwrBJAQFk7EEP/XMJfnPLN/SbuMSADgM -kg8kPTFRW5Iw3DYz9z9WpE0CgYAkn6/8Q2XMbUOFqti9JEa8Lg8sYk5VdwuNbPMA -3QMYKQUk9ieyLB4c3Nik3+XCuyVUKEc31A5egmz3umu7cn8i6vGuiJ/k/8t2YZ7s -Bry5Ihu95Yzab5DW3Eiqs0xKQN79ebS9AluAwQO5Wy2h52rknfuDHIm/M+BHsSoS -xl5KFQKBgQCokCsYuX1z2GojHw369/R2aX3ovCGuHqy4k7fWxUrpHTHvth2+qNPr -84qLJ9rLWoZE5sUiZ5YdwCgW877EdfkT+v4aaBX79ixso5VdqgJ/PdnoNntah/Vq -njQiW1skn6/P5V/eyimN2n0VsyBr/zMDEtYTRP/Tb1zi/njFLQkZEA== ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey2.crt b/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey2.crt deleted file mode 100644 index bec084790..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey2.crt +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDhTCCAm2gAwIBAgIJAIq8naKlYAQfMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNV -BAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEBxMMU2FuRnJhbmNpc2NvMQ8wDQYD -VQQKEwZEb2NrZXIxEzARBgNVBAMTCmRlbGVnYXRpb24wHhcNMTYwOTI4MTc0ODQ4 -WhcNMjYwNjI4MTc0ODQ4WjBXMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFTAT -BgNVBAcTDFNhbkZyYW5jaXNjbzEPMA0GA1UEChMGRG9ja2VyMRMwEQYDVQQDEwpk -ZWxlZ2F0aW9uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyY2EWYTW -5VHipw08t675upmD6a+akiuZ1z+XpuOxZCgjZ0aHfoOe8wGKg3Ohz7UCBdD5Mob/ -L/qvRlsCaqPHGZKIyyX1HDO4mpuQQFBhYxt+ZAO3AaawEUOw2rwwMDEjLnDDTSZM -z8jxCMvsJjBDqgb8g3z+AmjducQ/OH6llldgHIBY8ioRbROCL2PGgqywWq2fThav -c70YMxtKviBGDNCouYeQ8JMK/PuLwPNDXNQAagFHVARXiUv/ILHk7ImYnSGJUcuk -JTUGN2MBnpY0eakg7i+4za8sjjqOdn+2I6aVzlGJDSiRP72nkg/cE4BqMl9FrMwK -9iS8xa9yMDLUvwIDAQABo1QwUjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIF -oDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUvQzzFmh3Sv3HcdExY3wx -/1u6JLAwDQYJKoZIhvcNAQELBQADggEBAJcmDme2Xj/HPUPwaN/EyCmjhY73EiHO -x6Pm16tscg5JGn5A+u3CZ1DmxUYl8Hp6MaW/sWzdtL0oKJg76pynadCWh5EacFR8 -u+2GV/IcN9mSX6JQzvrqbjSqo5/FehqBD+W5h3euwwApWA3STAadYeyEfmdOA3SQ -W1vzrA1y7i8qgTqeJ7UX1sEAXlIhBK2zPYaMB+en+ZOiPyNxJYj6IDdGdD2paC9L -6H9wKC+GAUTSdCWp89HP7ETSXEGr94AXkrwU+qNsiN+OyK8ke0EMngEPh5IQoplw -/7zEZCth3oKxvR1/4S5LmTVaHI2ZlbU4q9bnY72G4tw8YQr2gcBGo4w= ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey2.key b/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey2.key deleted file mode 100644 index 5ccabe908..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey2.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEogIBAAKCAQEAyY2EWYTW5VHipw08t675upmD6a+akiuZ1z+XpuOxZCgjZ0aH -foOe8wGKg3Ohz7UCBdD5Mob/L/qvRlsCaqPHGZKIyyX1HDO4mpuQQFBhYxt+ZAO3 -AaawEUOw2rwwMDEjLnDDTSZMz8jxCMvsJjBDqgb8g3z+AmjducQ/OH6llldgHIBY -8ioRbROCL2PGgqywWq2fThavc70YMxtKviBGDNCouYeQ8JMK/PuLwPNDXNQAagFH -VARXiUv/ILHk7ImYnSGJUcukJTUGN2MBnpY0eakg7i+4za8sjjqOdn+2I6aVzlGJ -DSiRP72nkg/cE4BqMl9FrMwK9iS8xa9yMDLUvwIDAQABAoIBAHmffvzx7ydESWwa -zcfdu26BkptiTvjjfJrqEd4wSewxWGPKqJqMXE8xX99A2KTZClZuKuH1mmnecQQY -iRXGrK9ewFMuHYGeKEiLlPlqR8ohXhyGLVm+t0JDwaXMp5t9G0i73O5iLTm5fNGd -FGxa9YnVW20Q8MqNczbVGH1D1zInhxzzOyFzBd4bBBJ8PdrUdyLpd7+RxY2ghnbT -p9ZANR2vk5zmDLJgZx72n/u+miJWuhY6p0v3Vq4z/HHgdhf+K6vpDdzTcYlA0rO4 -c/c+RKED3ZadGUD5QoLsmEN0e3FVSMPN1kt4ZRTqWfH8f2X4mLz33aBryTjktP6+ -1rX6ThECgYEA74wc1Tq23B5R0/GaMm1AK3Ko2zzTD8wK7NSCElh2dls02B+GzrEB -aE3A2GMQSuzb+EA0zkipwANBaqs3ZemH5G1pu4hstQsXCMd4jAJn0TmTXlplXBCf -PSc8ZUU6XcJENRr9Q7O9/TGlgahX+z0ndxYx/CMCsSu7XsMg4IZsbAcCgYEA12Vb -wKOVG15GGp7pMshr+2rQfVimARUP4gf3JnQmenktI4PfdnMW3a4L3DEHfLhIerwT -6lRp/NpxSADmuT4h1UO1l2lc+gmTVPw0Vbl6VwHpgS5Kfu4ZyM6n3S66f/dE4nu7 -hQF9yZz7vn5Agghak4p6a1wC1gdMzR1tvxFzk4kCgYByBMTskWfcWeok8Yitm+bB -R3Ar+kWT7VD97SCETusD5uG+RTNLSmEbHnc+B9kHcLo67YS0800pAeOvPBPARGnU -RmffRU5I1iB+o0MzkSmNItSMQoagTaEd4IEUyuC/I+qHRHNsOC+kRm86ycAm67LP -MhdUpe1wGxqyPjp15EXTHQKBgDKzFu+3EWfJvvKRKQ7dAh3BvKVkcl6a2Iw5l8Ej -YdM+JpPPfI/i8yTmzL/dgoem0Nii4IUtrWzo9fUe0TAVId2S/HFRSaNJEbbVTnRH -HjbQqmfPv5U08jjD+9siHp/0UfCFc1QRT8xe+RqTmReCY9+KntoaZEiAm2FEZgqt -TukRAoGAf7QqbTP5/UH1KSkX89F5qy/6GS3pw6TLj9Ufm/l/NO8Um8gag6YhEKWR -7HpkpCqjfWj8Av8ESR9cqddPGrbdqXFm9z7dCjlAd5T3Q3h/h+v+JzLQWbsI6WOb -SsOSWNyE006ZZdIiFwO6GfxpLI24sVtYKgyob6Q71oxSqfnrnT0= ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey3.crt b/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey3.crt deleted file mode 100644 index f434b45fc..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey3.crt +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDhTCCAm2gAwIBAgIJAKHt/jxiWqMtMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNV -BAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEBxMMU2FuRnJhbmNpc2NvMQ8wDQYD -VQQKEwZEb2NrZXIxEzARBgNVBAMTCmRlbGVnYXRpb24wHhcNMTYwOTI4MTc0ODQ5 -WhcNMjYwNjI4MTc0ODQ5WjBXMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFTAT -BgNVBAcTDFNhbkZyYW5jaXNjbzEPMA0GA1UEChMGRG9ja2VyMRMwEQYDVQQDEwpk -ZWxlZ2F0aW9uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqfbJk2Dk -C9FJVjV2+Q2CQrJphG3vFc1Qlu9jgVA5RhGmF9jJzetsclsV/95nBhinIGcSmPQA -l318G7Bz/cG/6O2n5+hj+S1+YOvQweReZj3d4kCeS86SOyLNTpMD9gsF0S8nR1RN -h0jD4t1vxAVeGD1o61U8/k0O5eDoeOfOSWZagKk5PhyrMZgNip4IrG46umCkFlrw -zMMcgQdwTQXywPqkr/LmYpqT1WpMlzHYTQEY8rKorIJQbPtHVYdr4UxYnNmk6fbU -biEP1DQlwjBWcFTsDLqXKP/K+e3O0/e/hMB0y7Tj9fZ7Viw0t5IKXZPsxMhwknUT -9vmPzIJO6NiniwIDAQABo1QwUjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIF -oDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUdTXRP1EzxQ+UDZSoheVo -Mobud1cwDQYJKoZIhvcNAQELBQADggEBADV9asTWWdbmpkeRuKyi0xGho39ONK88 -xxkFlco766BVgemo/rGQj3oPuw6M6SzHFoJ6JUPjmLiAQDIGEU/2/b6LcOuLjP+4 -YejCcDTY3lSW/HMNoAmzr2foo/LngNGfe/qhVFUqV7GjFT9+XzFFBfIZ1cQiL2ed -kc8rgQxFPwWXFCSwaENWeFnMDugkd+7xanoAHq8GsJpg5fTruDTmJkUqC2RNiMLn -WM7QaqW7+lmUnMnc1IBoz0hFhgoiadWM/1RQxx51zTVw6Au1koIm4ZXu5a+/WyC8 -K1+HyUbc0AVaDaRBpRSOR9aHRwLGh6WQ4aUZQNyJroc999qfYrDEEV8= ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey3.key b/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey3.key deleted file mode 100644 index a61d18cc3..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey3.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEAqfbJk2DkC9FJVjV2+Q2CQrJphG3vFc1Qlu9jgVA5RhGmF9jJ -zetsclsV/95nBhinIGcSmPQAl318G7Bz/cG/6O2n5+hj+S1+YOvQweReZj3d4kCe -S86SOyLNTpMD9gsF0S8nR1RNh0jD4t1vxAVeGD1o61U8/k0O5eDoeOfOSWZagKk5 -PhyrMZgNip4IrG46umCkFlrwzMMcgQdwTQXywPqkr/LmYpqT1WpMlzHYTQEY8rKo -rIJQbPtHVYdr4UxYnNmk6fbUbiEP1DQlwjBWcFTsDLqXKP/K+e3O0/e/hMB0y7Tj -9fZ7Viw0t5IKXZPsxMhwknUT9vmPzIJO6NiniwIDAQABAoIBAQCAr/ed3A2umO7T -FDYZik3nXBiiiW4t7r+nGGgZ3/kNgY1lnuHlROxehXLZwbX1mrLnyML/BjhwezV9 -7ZNVPd6laVPpNj6DyxtWHRZ5yARlm1Al39E7CpQTrF0QsiWcpGnqIa62xjDRTpnq -askV/Q5qggyvqmE9FnFCQpEiAjlhvp7F0kVHVJm9s3MK3zSyR0UTZ3cpYus2Jr2z -OotHgAMHq5Hgb3dvxOeE2xRMeYAVDujbkNzXm2SddAtiRdLhWDh7JIr3zXhp0HyN -4rLOyhlgz00oIGeDt/C0q3fRmghr3iZOG+7m2sUx0FD1Ru1dI9v2A+jYmIVNW6+x -YJk5PzxJAoGBANDj7AGdcHSci/LDBPoTTUiz3uucAd27/IJma/iy8mdbVfOAb0Fy -PRSPvoozlpZyOxg2J4eH/o4QxQR4lVKtnLKZLNHK2tg3LarwyBX1LiI3vVlB+DT1 -AmV8i5bJAckDhqFeEH5qdWZFi03oZsSXWEqX5iMYCrdK5lTZggcrFZeHAoGBANBL -fkk3knAdcVfTYpmHx18GBi2AsCWTd20KD49YBdbVy0Y2Jaa1EJAmGWpTUKdYx40R -H5CuGgcAviXQz3bugdTU1I3tAclBtpJNU7JkhuE+Epz0CM/6WERJrE0YxcGQA5ui -6fOguFyiXD1/85jrDBOKy74aoS7lYz9r/a6eqmjdAoGBAJpm/nmrIAZx+Ff2ouUe -A1Ar9Ch/Zjm5zEmu3zwzOU4AiyWz14iuoktifNq2iyalRNz+mnVpplToPFizsNwu -C9dPtXtU0DJlhtIFrD/evLz6KnGhe4/ZUm4lgyBvb2xfuNHqL5Lhqelwmil6EQxb -Oh3Y7XkfOjyFln89TwlxZUJdAoGAJRMa4kta7EvBTeGZLjyltvsqhFTghX+vBSCC -ToBbYbbiHJgssXSPAylU4sD7nR3HPwuqM6VZip+OOMrm8oNXZpuPTce+xqTEq1vK -JvmPrG3RAFDLdMFZjqYSXhKnuGE60yv3Ol8EEbDwfB3XLQPBPYU56Jdy0xcPSE2f -dMJXEJ0CgYEAisZw0nXw6lFeYecu642EGuU0wv1O9i21p7eho9QwOcsoTl4Q9l+M -M8iBv+qTHO+D19l4JbkGvy2H2diKoYduUFACcuiFYs8fjrT+4Z6DyOQAQGAf6Ylw -BFbU15k6KbA9v4mZDfd1tY9x62L/XO55ZxYG+J+q0e26tEThgD8cEog= ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey4.crt b/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey4.crt deleted file mode 100644 index c8cbe46bd..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey4.crt +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDhTCCAm2gAwIBAgIJANae++ZkUEWMMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNV -BAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEBxMMU2FuRnJhbmNpc2NvMQ8wDQYD -VQQKEwZEb2NrZXIxEzARBgNVBAMTCmRlbGVnYXRpb24wHhcNMTYwOTI4MTc0ODQ5 -WhcNMjYwNjI4MTc0ODQ5WjBXMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFTAT -BgNVBAcTDFNhbkZyYW5jaXNjbzEPMA0GA1UEChMGRG9ja2VyMRMwEQYDVQQDEwpk -ZWxlZ2F0aW9uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqULAjgba -Y2I10WfqdmYnPfEqEe6iMDbzcgECb2xKafXcI4ltkQj1iO4zBTs0Ft9EzXFc5ZBh -pTjZrL6vrIa0y/CH2BiIHBJ0wRHx/40HXp4DSj3HZpVOlEMI3npRfBGNIBllUaRN -PWG7zL7DcKMIepBfPXyjBsxzH3yNiISq0W5hSiy+ImhSo3aipJUHHcp9Z9NgvpNC -3QvnxsGKRnECmDRDlxkq+FQu9Iqs/HWFYWgyfcsw+YTrWZq3qVnnqUouHO//c9PG -Ry3sZSDU97MwvkjvWys1e01Xvd3AbHx08YAsxih58i/OBKe81eD9NuZDP2KrjTxI -5xkXKhj6DV2NnQIDAQABo1QwUjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIF -oDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUDt95hiqbQvi0KcvZGAUu -VisnztQwDQYJKoZIhvcNAQELBQADggEBAGi7qHai7MWbfeu6SlXhzIP3AIMa8TMi -lp/+mvPUFPswIVqYJ71MAN8uA7CTH3z50a2vYupGeOEtZqVJeRf+xgOEpwycncxp -Qz6wc6TWPVIoT5q1Hqxw1RD2MyKL+Y+QBDYwFxFkthpDMlX48I9frcqoJUWFxBF2 -lnRr/cE7BbPE3sMbXV3wGPlH7+eUf+CgzXJo2HB6THzagyEgNrDiz/0rCQa1ipFd -mNU3D/U6BFGmJNxhvSOtXX9escg8yjr05YwwzokHS2K4jE0ZuJPBd50C/Rvo3Mf4 -0h7/2Q95e7d42zPe9WYPu2F8KTWsf4r+6ddhKrKhYzXIcTAfHIOiO+U= ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey4.key b/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey4.key deleted file mode 100644 index f473cc495..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/delgkey4.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAqULAjgbaY2I10WfqdmYnPfEqEe6iMDbzcgECb2xKafXcI4lt -kQj1iO4zBTs0Ft9EzXFc5ZBhpTjZrL6vrIa0y/CH2BiIHBJ0wRHx/40HXp4DSj3H -ZpVOlEMI3npRfBGNIBllUaRNPWG7zL7DcKMIepBfPXyjBsxzH3yNiISq0W5hSiy+ -ImhSo3aipJUHHcp9Z9NgvpNC3QvnxsGKRnECmDRDlxkq+FQu9Iqs/HWFYWgyfcsw -+YTrWZq3qVnnqUouHO//c9PGRy3sZSDU97MwvkjvWys1e01Xvd3AbHx08YAsxih5 -8i/OBKe81eD9NuZDP2KrjTxI5xkXKhj6DV2NnQIDAQABAoIBAGK0ZKnuYSiXux60 -5MvK4pOCsa/nY3mOcgVHhW4IzpRgJdIrcFOlz9ncXrBsSAIWjX7o3u2Ydvjs4DOW -t8d6frB3QiDInYcRVDjLCD6otWV97Bk9Ua0G4N4hAWkMF7ysV4oihS1JDSoAdo39 -qOdki6s9yeyHZGKwk2oHLlowU5TxQMBA8DHmxqBII1HTm+8xRz45bcEqRXydYSUn -P1JuSU9jFqdylxU+Nrq6ehslMQ3y7qNWQyiLGxu6EmR+vgrzSU0s3iAOqCHthaOS -VBBXPL3DNEYUS+0QGnGrACuJhanOMBfdiO6Orelx6ZzWZm38PNGv0yBt0WCM+8/A -TtQNGkECgYEA1LqR6AH9XikUQ0+rM4526BgVuYqtjw21h4Lj9alaA+YTQntBBJOv -iAcUpnJiV4T8jzAMLeqpK8R/rbxRnK5S9jOV2gr+puk4L6tH46cgahBUESDigDp8 -6vK8ur6ubBcXNPh3AT6rsPj+Ph2EU3raqiYdouvCdga/OCYZb+jr6UkCgYEAy7Cr -l8WssI/8/ORcQ4MFJFNyfz/Y2beNXyLd1PX0H+wRSiGcKzeUuTHNtzFFpMbrK/nx -ZOPCT2ROdHsBHzp1L+WquCb0fyMVSiYiXBU+VCFDbUU5tBr3ycTc7VwuFPENOiha -IdlWgew/aW110FQHIaqe9g+htRe+mXe++faZtbUCgYB/MSJmNzJX53XvHSZ/CBJ+ -iVAMBSfq3caJRLCqRNzGcf1YBbwFUYxlZ95n+wJj0+byckcF+UW3HqE8rtmZNf3y -qTtTCLnj8JQgpGeybU4LPMIXD7N9+fqQvBwuCC7gABpnGJyHCQK9KNNTLnDdPRqb -G3ki3ZYC3dvdZaJV8E2FyQKBgQCMa5Mf4kqWvezueo+QizZ0QILibqWUEhIH0AWV -1qkhiKCytlDvCjYhJdBnxjP40Jk3i+t6XfmKud/MNTAk0ywOhQoYQeKz8v+uSnPN -f2ekn/nXzq1lGGJSWsDjcXTjQvqXaVIZm7cjgjaE+80IfaUc9H75qvUT3vaq3f5u -XC7DMQKBgQDMAzCCpWlEPbZoFMl6F49+7jG0/TiqM/WRUSQnNtufPMbrR9Je4QM1 -L1UCANCPaHFOncKYer15NfIV1ctt5MZKImevDsUaQO8CUlO+dzd5H8KvHw9E29gA -B22v8k3jIjsYeRL+UJ/sBnWHgxdAe/NEM+TdlP2oP9D1gTifutPqAg== ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/gen.sh b/vendor/github.com/docker/docker/integration-cli/fixtures/notary/gen.sh deleted file mode 100755 index 8d6381cec..000000000 --- a/vendor/github.com/docker/docker/integration-cli/fixtures/notary/gen.sh +++ /dev/null @@ -1,18 +0,0 @@ -for selfsigned in delgkey1 delgkey2 delgkey3 delgkey4; do - subj='/C=US/ST=CA/L=SanFrancisco/O=Docker/CN=delegation' - - openssl genrsa -out "${selfsigned}.key" 2048 - openssl req -new -key "${selfsigned}.key" -out "${selfsigned}.csr" -sha256 -subj "${subj}" - cat > "${selfsigned}.cnf" < 1 && buf[0] == 'Y' - }, - "Test requires apparmor is enabled.", - } - RegistryHosting = testRequirement{ - func() bool { - // for now registry binary is built only if we're running inside - // container through `make test`. Figure that out by testing if - // registry binary is in PATH. - _, err := exec.LookPath(v2binary) - return err == nil - }, - fmt.Sprintf("Test requires an environment that can host %s in the same host", v2binary), - } - NotaryHosting = testRequirement{ - func() bool { - // for now notary binary is built only if we're running inside - // container through `make test`. Figure that out by testing if - // notary-server binary is in PATH. - _, err := exec.LookPath(notaryServerBinary) - return err == nil - }, - fmt.Sprintf("Test requires an environment that can host %s in the same host", notaryServerBinary), - } - NotaryServerHosting = testRequirement{ - func() bool { - // for now notary-server binary is built only if we're running inside - // container through `make test`. Figure that out by testing if - // notary-server binary is in PATH. - _, err := exec.LookPath(notaryServerBinary) - return err == nil - }, - fmt.Sprintf("Test requires an environment that can host %s in the same host", notaryServerBinary), - } - NotOverlay = testRequirement{ - func() bool { - return !strings.HasPrefix(daemonStorageDriver, "overlay") - }, - "Test requires underlying root filesystem not be backed by overlay.", - } - - Devicemapper = testRequirement{ - func() bool { - return strings.HasPrefix(daemonStorageDriver, "devicemapper") - }, - "Test requires underlying root filesystem to be backed by devicemapper.", - } - - IPv6 = testRequirement{ - func() bool { - cmd := exec.Command("test", "-f", "/proc/net/if_inet6") - - if err := cmd.Run(); err != nil { - return true - } - return false - }, - "Test requires support for IPv6", - } - UserNamespaceROMount = testRequirement{ - func() bool { - // quick case--userns not enabled in this test run - if os.Getenv("DOCKER_REMAP_ROOT") == "" { - return true - } - if _, _, err := dockerCmdWithError("run", "--rm", "--read-only", "busybox", "date"); err != nil { - return false - } - return true - }, - "Test cannot be run if user namespaces enabled but readonly mounts fail on this kernel.", - } - UserNamespaceInKernel = testRequirement{ - func() bool { - if _, err := os.Stat("/proc/self/uid_map"); os.IsNotExist(err) { - /* - * This kernel-provided file only exists if user namespaces are - * supported - */ - return false - } - - // We need extra check on redhat based distributions - if f, err := os.Open("/sys/module/user_namespace/parameters/enable"); err == nil { - defer f.Close() - b := make([]byte, 1) - _, _ = f.Read(b) - if string(b) == "N" { - return false - } - return true - } - - return true - }, - "Kernel must have user namespaces configured and enabled.", - } - NotUserNamespace = testRequirement{ - func() bool { - root := os.Getenv("DOCKER_REMAP_ROOT") - if root != "" { - return false - } - return true - }, - "Test cannot be run when remapping root", - } - IsPausable = testRequirement{ - func() bool { - if daemonPlatform == "windows" { - return isolation == "hyperv" - } - return true - }, - "Test requires containers are pausable.", - } - NotPausable = testRequirement{ - func() bool { - if daemonPlatform == "windows" { - return isolation == "process" - } - return false - }, - "Test requires containers are not pausable.", - } - IsolationIsHyperv = testRequirement{ - func() bool { - return daemonPlatform == "windows" && isolation == "hyperv" - }, - "Test requires a Windows daemon running default isolation mode of hyperv.", - } - IsolationIsProcess = testRequirement{ - func() bool { - return daemonPlatform == "windows" && isolation == "process" - }, - "Test requires a Windows daemon running default isolation mode of process.", - } -) - -// testRequires checks if the environment satisfies the requirements -// for the test to run or skips the tests. -func testRequires(c *check.C, requirements ...testRequirement) { - for _, r := range requirements { - if !r.Condition() { - c.Skip(r.SkipMessage) - } - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/requirements_unix.go b/vendor/github.com/docker/docker/integration-cli/requirements_unix.go deleted file mode 100644 index ef017d8a7..000000000 --- a/vendor/github.com/docker/docker/integration-cli/requirements_unix.go +++ /dev/null @@ -1,159 +0,0 @@ -// +build !windows - -package main - -import ( - "bytes" - "io/ioutil" - "os/exec" - "strings" - - "github.com/docker/docker/pkg/parsers/kernel" - "github.com/docker/docker/pkg/sysinfo" -) - -var ( - // SysInfo stores information about which features a kernel supports. - SysInfo *sysinfo.SysInfo - cpuCfsPeriod = testRequirement{ - func() bool { - return SysInfo.CPUCfsPeriod - }, - "Test requires an environment that supports cgroup cfs period.", - } - cpuCfsQuota = testRequirement{ - func() bool { - return SysInfo.CPUCfsQuota - }, - "Test requires an environment that supports cgroup cfs quota.", - } - cpuShare = testRequirement{ - func() bool { - return SysInfo.CPUShares - }, - "Test requires an environment that supports cgroup cpu shares.", - } - oomControl = testRequirement{ - func() bool { - return SysInfo.OomKillDisable - }, - "Test requires Oom control enabled.", - } - pidsLimit = testRequirement{ - func() bool { - return SysInfo.PidsLimit - }, - "Test requires pids limit enabled.", - } - kernelMemorySupport = testRequirement{ - func() bool { - return SysInfo.KernelMemory - }, - "Test requires an environment that supports cgroup kernel memory.", - } - memoryLimitSupport = testRequirement{ - func() bool { - return SysInfo.MemoryLimit - }, - "Test requires an environment that supports cgroup memory limit.", - } - memoryReservationSupport = testRequirement{ - func() bool { - return SysInfo.MemoryReservation - }, - "Test requires an environment that supports cgroup memory reservation.", - } - swapMemorySupport = testRequirement{ - func() bool { - return SysInfo.SwapLimit - }, - "Test requires an environment that supports cgroup swap memory limit.", - } - memorySwappinessSupport = testRequirement{ - func() bool { - return SysInfo.MemorySwappiness - }, - "Test requires an environment that supports cgroup memory swappiness.", - } - blkioWeight = testRequirement{ - func() bool { - return SysInfo.BlkioWeight - }, - "Test requires an environment that supports blkio weight.", - } - cgroupCpuset = testRequirement{ - func() bool { - return SysInfo.Cpuset - }, - "Test requires an environment that supports cgroup cpuset.", - } - seccompEnabled = testRequirement{ - func() bool { - return supportsSeccomp && SysInfo.Seccomp - }, - "Test requires that seccomp support be enabled in the daemon.", - } - bridgeNfIptables = testRequirement{ - func() bool { - return !SysInfo.BridgeNFCallIPTablesDisabled - }, - "Test requires that bridge-nf-call-iptables support be enabled in the daemon.", - } - bridgeNfIP6tables = testRequirement{ - func() bool { - return !SysInfo.BridgeNFCallIP6TablesDisabled - }, - "Test requires that bridge-nf-call-ip6tables support be enabled in the daemon.", - } - unprivilegedUsernsClone = testRequirement{ - func() bool { - content, err := ioutil.ReadFile("/proc/sys/kernel/unprivileged_userns_clone") - if err == nil && strings.Contains(string(content), "0") { - return false - } - return true - }, - "Test cannot be run with 'sysctl kernel.unprivileged_userns_clone' = 0", - } - ambientCapabilities = testRequirement{ - func() bool { - content, err := ioutil.ReadFile("/proc/self/status") - if err == nil && strings.Contains(string(content), "CapAmb:") { - return true - } - return false - }, - "Test cannot be run without a kernel (4.3+) supporting ambient capabilities", - } - overlayFSSupported = testRequirement{ - func() bool { - cmd := exec.Command(dockerBinary, "run", "--rm", "busybox", "/bin/sh", "-c", "cat /proc/filesystems") - out, err := cmd.CombinedOutput() - if err != nil { - return false - } - return bytes.Contains(out, []byte("overlay\n")) - }, - "Test cannot be run without suppport for overlayfs", - } - overlay2Supported = testRequirement{ - func() bool { - if !overlayFSSupported.Condition() { - return false - } - - daemonV, err := kernel.ParseRelease(daemonKernelVersion) - if err != nil { - return false - } - requiredV := kernel.VersionInfo{Kernel: 4} - return kernel.CompareKernelVersion(*daemonV, requiredV) > -1 - - }, - "Test cannot be run without overlay2 support (kernel 4.0+)", - } -) - -func init() { - SysInfo = sysinfo.New(true) -} diff --git a/vendor/github.com/docker/docker/integration-cli/test_vars.go b/vendor/github.com/docker/docker/integration-cli/test_vars.go deleted file mode 100644 index 97bcddd5f..000000000 --- a/vendor/github.com/docker/docker/integration-cli/test_vars.go +++ /dev/null @@ -1,11 +0,0 @@ -package main - -// sleepCommandForDaemonPlatform is a helper function that determines what -// the command is for a sleeping container based on the daemon platform. -// The Windows busybox image does not have a `top` command. -func sleepCommandForDaemonPlatform() []string { - if daemonPlatform == "windows" { - return []string{"sleep", "240"} - } - return []string{"top"} -} diff --git a/vendor/github.com/docker/docker/integration-cli/test_vars_exec.go b/vendor/github.com/docker/docker/integration-cli/test_vars_exec.go deleted file mode 100644 index 7633b346b..000000000 --- a/vendor/github.com/docker/docker/integration-cli/test_vars_exec.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !test_no_exec - -package main - -const ( - // indicates docker daemon tested supports 'docker exec' - supportsExec = true -) diff --git a/vendor/github.com/docker/docker/integration-cli/test_vars_noexec.go b/vendor/github.com/docker/docker/integration-cli/test_vars_noexec.go deleted file mode 100644 index 084509052..000000000 --- a/vendor/github.com/docker/docker/integration-cli/test_vars_noexec.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build test_no_exec - -package main - -const ( - // indicates docker daemon tested supports 'docker exec' - supportsExec = false -) diff --git a/vendor/github.com/docker/docker/integration-cli/test_vars_noseccomp.go b/vendor/github.com/docker/docker/integration-cli/test_vars_noseccomp.go deleted file mode 100644 index 2f47ab07a..000000000 --- a/vendor/github.com/docker/docker/integration-cli/test_vars_noseccomp.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !seccomp - -package main - -const ( - // indicates docker daemon built with seccomp support - supportsSeccomp = false -) diff --git a/vendor/github.com/docker/docker/integration-cli/test_vars_seccomp.go b/vendor/github.com/docker/docker/integration-cli/test_vars_seccomp.go deleted file mode 100644 index 00cf69720..000000000 --- a/vendor/github.com/docker/docker/integration-cli/test_vars_seccomp.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build seccomp - -package main - -const ( - // indicates docker daemon built with seccomp support - supportsSeccomp = true -) diff --git a/vendor/github.com/docker/docker/integration-cli/test_vars_unix.go b/vendor/github.com/docker/docker/integration-cli/test_vars_unix.go deleted file mode 100644 index f9ecc0112..000000000 --- a/vendor/github.com/docker/docker/integration-cli/test_vars_unix.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !windows - -package main - -const ( - // identifies if test suite is running on a unix platform - isUnixCli = true - - expectedFileChmod = "-rw-r--r--" - - // On Unix variants, the busybox image comes with the `top` command which - // runs indefinitely while still being interruptible by a signal. - defaultSleepImage = "busybox" -) diff --git a/vendor/github.com/docker/docker/integration-cli/test_vars_windows.go b/vendor/github.com/docker/docker/integration-cli/test_vars_windows.go deleted file mode 100644 index bfc9a5a91..000000000 --- a/vendor/github.com/docker/docker/integration-cli/test_vars_windows.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build windows - -package main - -const ( - // identifies if test suite is running on a unix platform - isUnixCli = false - - // this is the expected file permission set on windows: gh#11395 - expectedFileChmod = "-rwxr-xr-x" - - // On Windows, the busybox image doesn't have the `top` command, so we rely - // on `sleep` with a high duration. - defaultSleepImage = "busybox" -) diff --git a/vendor/github.com/docker/docker/integration-cli/trust_server.go b/vendor/github.com/docker/docker/integration-cli/trust_server.go deleted file mode 100644 index 18876311a..000000000 --- a/vendor/github.com/docker/docker/integration-cli/trust_server.go +++ /dev/null @@ -1,344 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "net" - "net/http" - "os" - "os/exec" - "path/filepath" - "strings" - "time" - - "github.com/docker/docker/cliconfig" - "github.com/docker/docker/pkg/integration/checker" - "github.com/docker/go-connections/tlsconfig" - "github.com/go-check/check" -) - -var notaryBinary = "notary" -var notaryServerBinary = "notary-server" - -type keyPair struct { - Public string - Private string -} - -type testNotary struct { - cmd *exec.Cmd - dir string - keys []keyPair -} - -const notaryHost = "localhost:4443" -const notaryURL = "https://" + notaryHost - -func newTestNotary(c *check.C) (*testNotary, error) { - // generate server config - template := `{ - "server": { - "http_addr": "%s", - "tls_key_file": "%s", - "tls_cert_file": "%s" - }, - "trust_service": { - "type": "local", - "hostname": "", - "port": "", - "key_algorithm": "ed25519" - }, - "logging": { - "level": "debug" - }, - "storage": { - "backend": "memory" - } -}` - tmp, err := ioutil.TempDir("", "notary-test-") - if err != nil { - return nil, err - } - confPath := filepath.Join(tmp, "config.json") - config, err := os.Create(confPath) - if err != nil { - return nil, err - } - defer config.Close() - - workingDir, err := os.Getwd() - if err != nil { - return nil, err - } - if _, err := fmt.Fprintf(config, template, notaryHost, filepath.Join(workingDir, "fixtures/notary/localhost.key"), filepath.Join(workingDir, "fixtures/notary/localhost.cert")); err != nil { - os.RemoveAll(tmp) - return nil, err - } - - // generate client config - clientConfPath := filepath.Join(tmp, "client-config.json") - clientConfig, err := os.Create(clientConfPath) - if err != nil { - return nil, err - } - defer clientConfig.Close() - - template = `{ - "trust_dir" : "%s", - "remote_server": { - "url": "%s", - "skipTLSVerify": true - } -}` - if _, err = fmt.Fprintf(clientConfig, template, filepath.Join(cliconfig.ConfigDir(), "trust"), notaryURL); err != nil { - os.RemoveAll(tmp) - return nil, err - } - - // load key fixture filenames - var keys []keyPair - for i := 1; i < 5; i++ { - keys = append(keys, keyPair{ - Public: filepath.Join(workingDir, fmt.Sprintf("fixtures/notary/delgkey%v.crt", i)), - Private: filepath.Join(workingDir, fmt.Sprintf("fixtures/notary/delgkey%v.key", i)), - }) - } - - // run notary-server - cmd := exec.Command(notaryServerBinary, "-config", confPath) - if err := cmd.Start(); err != nil { - os.RemoveAll(tmp) - if os.IsNotExist(err) { - c.Skip(err.Error()) - } - return nil, err - } - - testNotary := &testNotary{ - cmd: cmd, - dir: tmp, - keys: keys, - } - - // Wait for notary to be ready to serve requests. - for i := 1; i <= 20; i++ { - if err = testNotary.Ping(); err == nil { - break - } - time.Sleep(10 * time.Millisecond * time.Duration(i*i)) - } - - if err != nil { - c.Fatalf("Timeout waiting for test notary to become available: %s", err) - } - - return testNotary, nil -} - -func (t *testNotary) Ping() error { - tlsConfig := tlsconfig.ClientDefault() - tlsConfig.InsecureSkipVerify = true - client := http.Client{ - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - TLSHandshakeTimeout: 10 * time.Second, - TLSClientConfig: tlsConfig, - }, - } - resp, err := client.Get(fmt.Sprintf("%s/v2/", notaryURL)) - if err != nil { - return err - } - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("notary ping replied with an unexpected status code %d", resp.StatusCode) - } - return nil -} - -func (t *testNotary) Close() { - t.cmd.Process.Kill() - os.RemoveAll(t.dir) -} - -func (s *DockerTrustSuite) trustedCmd(cmd *exec.Cmd) { - pwd := "12345678" - trustCmdEnv(cmd, notaryURL, pwd, pwd) -} - -func (s *DockerTrustSuite) trustedCmdWithServer(cmd *exec.Cmd, server string) { - pwd := "12345678" - trustCmdEnv(cmd, server, pwd, pwd) -} - -func (s *DockerTrustSuite) trustedCmdWithPassphrases(cmd *exec.Cmd, rootPwd, repositoryPwd string) { - trustCmdEnv(cmd, notaryURL, rootPwd, repositoryPwd) -} - -func trustCmdEnv(cmd *exec.Cmd, server, rootPwd, repositoryPwd string) { - env := []string{ - "DOCKER_CONTENT_TRUST=1", - fmt.Sprintf("DOCKER_CONTENT_TRUST_SERVER=%s", server), - fmt.Sprintf("DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE=%s", rootPwd), - fmt.Sprintf("DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE=%s", repositoryPwd), - } - cmd.Env = append(os.Environ(), env...) -} - -func (s *DockerTrustSuite) setupTrustedImage(c *check.C, name string) string { - repoName := fmt.Sprintf("%v/dockercli/%s:latest", privateRegistryURL, name) - // tag the image and upload it to the private registry - dockerCmd(c, "tag", "busybox", repoName) - - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - - if err != nil { - c.Fatalf("Error running trusted push: %s\n%s", err, out) - } - if !strings.Contains(string(out), "Signing and pushing trust metadata") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } - - if out, status := dockerCmd(c, "rmi", repoName); status != 0 { - c.Fatalf("Error removing image %q\n%s", repoName, out) - } - - return repoName -} - -func (s *DockerTrustSuite) setupTrustedplugin(c *check.C, source, name string) string { - repoName := fmt.Sprintf("%v/dockercli/%s:latest", privateRegistryURL, name) - // tag the image and upload it to the private registry - dockerCmd(c, "plugin", "install", "--grant-all-permissions", "--alias", repoName, source) - - pushCmd := exec.Command(dockerBinary, "plugin", "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - - if err != nil { - c.Fatalf("Error running trusted plugin push: %s\n%s", err, out) - } - if !strings.Contains(string(out), "Signing and pushing trust metadata") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } - - if out, status := dockerCmd(c, "plugin", "rm", "-f", repoName); status != 0 { - c.Fatalf("Error removing plugin %q\n%s", repoName, out) - } - - return repoName -} - -func notaryClientEnv(cmd *exec.Cmd) { - pwd := "12345678" - env := []string{ - fmt.Sprintf("NOTARY_ROOT_PASSPHRASE=%s", pwd), - fmt.Sprintf("NOTARY_TARGETS_PASSPHRASE=%s", pwd), - fmt.Sprintf("NOTARY_SNAPSHOT_PASSPHRASE=%s", pwd), - fmt.Sprintf("NOTARY_DELEGATION_PASSPHRASE=%s", pwd), - } - cmd.Env = append(os.Environ(), env...) -} - -func (s *DockerTrustSuite) notaryInitRepo(c *check.C, repoName string) { - initCmd := exec.Command(notaryBinary, "-c", filepath.Join(s.not.dir, "client-config.json"), "init", repoName) - notaryClientEnv(initCmd) - out, _, err := runCommandWithOutput(initCmd) - if err != nil { - c.Fatalf("Error initializing notary repository: %s\n", out) - } -} - -func (s *DockerTrustSuite) notaryCreateDelegation(c *check.C, repoName, role string, pubKey string, paths ...string) { - pathsArg := "--all-paths" - if len(paths) > 0 { - pathsArg = "--paths=" + strings.Join(paths, ",") - } - - delgCmd := exec.Command(notaryBinary, "-c", filepath.Join(s.not.dir, "client-config.json"), - "delegation", "add", repoName, role, pubKey, pathsArg) - notaryClientEnv(delgCmd) - out, _, err := runCommandWithOutput(delgCmd) - if err != nil { - c.Fatalf("Error adding %s role to notary repository: %s\n", role, out) - } -} - -func (s *DockerTrustSuite) notaryPublish(c *check.C, repoName string) { - pubCmd := exec.Command(notaryBinary, "-c", filepath.Join(s.not.dir, "client-config.json"), "publish", repoName) - notaryClientEnv(pubCmd) - out, _, err := runCommandWithOutput(pubCmd) - if err != nil { - c.Fatalf("Error publishing notary repository: %s\n", out) - } -} - -func (s *DockerTrustSuite) notaryImportKey(c *check.C, repoName, role string, privKey string) { - impCmd := exec.Command(notaryBinary, "-c", filepath.Join(s.not.dir, "client-config.json"), "key", - "import", privKey, "-g", repoName, "-r", role) - notaryClientEnv(impCmd) - out, _, err := runCommandWithOutput(impCmd) - if err != nil { - c.Fatalf("Error importing key to notary repository: %s\n", out) - } -} - -func (s *DockerTrustSuite) notaryListTargetsInRole(c *check.C, repoName, role string) map[string]string { - listCmd := exec.Command(notaryBinary, "-c", filepath.Join(s.not.dir, "client-config.json"), "list", - repoName, "-r", role) - notaryClientEnv(listCmd) - out, _, err := runCommandWithOutput(listCmd) - if err != nil { - c.Fatalf("Error listing targets in notary repository: %s\n", out) - } - - // should look something like: - // NAME DIGEST SIZE (BYTES) ROLE - // ------------------------------------------------------------------------------------------------------ - // latest 24a36bbc059b1345b7e8be0df20f1b23caa3602e85d42fff7ecd9d0bd255de56 1377 targets - - targets := make(map[string]string) - - // no target - lines := strings.Split(strings.TrimSpace(out), "\n") - if len(lines) == 1 && strings.Contains(out, "No targets present in this repository.") { - return targets - } - - // otherwise, there is at least one target - c.Assert(len(lines), checker.GreaterOrEqualThan, 3) - - for _, line := range lines[2:] { - tokens := strings.Fields(line) - c.Assert(tokens, checker.HasLen, 4) - targets[tokens[0]] = tokens[3] - } - - return targets -} - -func (s *DockerTrustSuite) assertTargetInRoles(c *check.C, repoName, target string, roles ...string) { - // check all the roles - for _, role := range roles { - targets := s.notaryListTargetsInRole(c, repoName, role) - roleName, ok := targets[target] - c.Assert(ok, checker.True) - c.Assert(roleName, checker.Equals, role) - } -} - -func (s *DockerTrustSuite) assertTargetNotInRoles(c *check.C, repoName, target string, roles ...string) { - targets := s.notaryListTargetsInRole(c, repoName, "targets") - - roleName, ok := targets[target] - if ok { - for _, role := range roles { - c.Assert(roleName, checker.Not(checker.Equals), role) - } - } -} diff --git a/vendor/github.com/docker/docker/integration-cli/utils.go b/vendor/github.com/docker/docker/integration-cli/utils.go deleted file mode 100644 index 87d48e41b..000000000 --- a/vendor/github.com/docker/docker/integration-cli/utils.go +++ /dev/null @@ -1,79 +0,0 @@ -package main - -import ( - "io" - "os" - "os/exec" - "time" - - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/cmd" -) - -func getPrefixAndSlashFromDaemonPlatform() (prefix, slash string) { - if daemonPlatform == "windows" { - return "c:", `\` - } - return "", "/" -} - -// TODO: update code to call cmd.RunCmd directly, and remove this function -func runCommandWithOutput(execCmd *exec.Cmd) (string, int, error) { - result := cmd.RunCmd(transformCmd(execCmd)) - return result.Combined(), result.ExitCode, result.Error -} - -// TODO: update code to call cmd.RunCmd directly, and remove this function -func runCommandWithStdoutStderr(execCmd *exec.Cmd) (string, string, int, error) { - result := cmd.RunCmd(transformCmd(execCmd)) - return result.Stdout(), result.Stderr(), result.ExitCode, result.Error -} - -// TODO: update code to call cmd.RunCmd directly, and remove this function -func runCommand(execCmd *exec.Cmd) (exitCode int, err error) { - result := cmd.RunCmd(transformCmd(execCmd)) - return result.ExitCode, result.Error -} - -// Temporary shim for migrating commands to the new function -func transformCmd(execCmd *exec.Cmd) cmd.Cmd { - return cmd.Cmd{ - Command: execCmd.Args, - Env: execCmd.Env, - Dir: execCmd.Dir, - Stdin: execCmd.Stdin, - Stdout: execCmd.Stdout, - } -} - -func runCommandPipelineWithOutput(cmds ...*exec.Cmd) (output string, exitCode int, err error) { - return integration.RunCommandPipelineWithOutput(cmds...) -} - -func convertSliceOfStringsToMap(input []string) map[string]struct{} { - return integration.ConvertSliceOfStringsToMap(input) -} - -func compareDirectoryEntries(e1 []os.FileInfo, e2 []os.FileInfo) error { - return integration.CompareDirectoryEntries(e1, e2) -} - -func listTar(f io.Reader) ([]string, error) { - return integration.ListTar(f) -} - -func randomTmpDirPath(s string, platform string) string { - return integration.RandomTmpDirPath(s, platform) -} - -func consumeWithSpeed(reader io.Reader, chunkSize int, interval time.Duration, stop chan bool) (n int, err error) { - return integration.ConsumeWithSpeed(reader, chunkSize, interval, stop) -} - -func parseCgroupPaths(procCgroupData string) map[string]string { - return integration.ParseCgroupPaths(procCgroupData) -} - -func runAtDifferentDate(date time.Time, block func()) { - integration.RunAtDifferentDate(date, block) -} diff --git a/vendor/github.com/docker/docker/layer/empty.go b/vendor/github.com/docker/docker/layer/empty.go deleted file mode 100644 index 3b6ffc82f..000000000 --- a/vendor/github.com/docker/docker/layer/empty.go +++ /dev/null @@ -1,56 +0,0 @@ -package layer - -import ( - "archive/tar" - "bytes" - "fmt" - "io" - "io/ioutil" -) - -// DigestSHA256EmptyTar is the canonical sha256 digest of empty tar file - -// (1024 NULL bytes) -const DigestSHA256EmptyTar = DiffID("sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef") - -type emptyLayer struct{} - -// EmptyLayer is a layer that corresponds to empty tar. -var EmptyLayer = &emptyLayer{} - -func (el *emptyLayer) TarStream() (io.ReadCloser, error) { - buf := new(bytes.Buffer) - tarWriter := tar.NewWriter(buf) - tarWriter.Close() - return ioutil.NopCloser(buf), nil -} - -func (el *emptyLayer) TarStreamFrom(p ChainID) (io.ReadCloser, error) { - if p == "" { - return el.TarStream() - } - return nil, fmt.Errorf("can't get parent tar stream of an empty layer") -} - -func (el *emptyLayer) ChainID() ChainID { - return ChainID(DigestSHA256EmptyTar) -} - -func (el *emptyLayer) DiffID() DiffID { - return DigestSHA256EmptyTar -} - -func (el *emptyLayer) Parent() Layer { - return nil -} - -func (el *emptyLayer) Size() (size int64, err error) { - return 0, nil -} - -func (el *emptyLayer) DiffSize() (size int64, err error) { - return 0, nil -} - -func (el *emptyLayer) Metadata() (map[string]string, error) { - return make(map[string]string), nil -} diff --git a/vendor/github.com/docker/docker/layer/empty_test.go b/vendor/github.com/docker/docker/layer/empty_test.go deleted file mode 100644 index c22da7665..000000000 --- a/vendor/github.com/docker/docker/layer/empty_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package layer - -import ( - "io" - "testing" - - "github.com/docker/distribution/digest" -) - -func TestEmptyLayer(t *testing.T) { - if EmptyLayer.ChainID() != ChainID(DigestSHA256EmptyTar) { - t.Fatal("wrong ID for empty layer") - } - - if EmptyLayer.DiffID() != DigestSHA256EmptyTar { - t.Fatal("wrong DiffID for empty layer") - } - - if EmptyLayer.Parent() != nil { - t.Fatal("expected no parent for empty layer") - } - - if size, err := EmptyLayer.Size(); err != nil || size != 0 { - t.Fatal("expected zero size for empty layer") - } - - if diffSize, err := EmptyLayer.DiffSize(); err != nil || diffSize != 0 { - t.Fatal("expected zero diffsize for empty layer") - } - - tarStream, err := EmptyLayer.TarStream() - if err != nil { - t.Fatalf("error streaming tar for empty layer: %v", err) - } - - digester := digest.Canonical.New() - _, err = io.Copy(digester.Hash(), tarStream) - - if err != nil { - t.Fatalf("error hashing empty tar layer: %v", err) - } - - if digester.Digest() != digest.Digest(DigestSHA256EmptyTar) { - t.Fatal("empty layer tar stream hashes to wrong value") - } -} diff --git a/vendor/github.com/docker/docker/layer/filestore.go b/vendor/github.com/docker/docker/layer/filestore.go deleted file mode 100644 index 42b45556e..000000000 --- a/vendor/github.com/docker/docker/layer/filestore.go +++ /dev/null @@ -1,354 +0,0 @@ -package layer - -import ( - "compress/gzip" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/docker/pkg/ioutils" -) - -var ( - stringIDRegexp = regexp.MustCompile(`^[a-f0-9]{64}(-init)?$`) - supportedAlgorithms = []digest.Algorithm{ - digest.SHA256, - // digest.SHA384, // Currently not used - // digest.SHA512, // Currently not used - } -) - -type fileMetadataStore struct { - root string -} - -type fileMetadataTransaction struct { - store *fileMetadataStore - ws *ioutils.AtomicWriteSet -} - -// NewFSMetadataStore returns an instance of a metadata store -// which is backed by files on disk using the provided root -// as the root of metadata files. -func NewFSMetadataStore(root string) (MetadataStore, error) { - if err := os.MkdirAll(root, 0700); err != nil { - return nil, err - } - return &fileMetadataStore{ - root: root, - }, nil -} - -func (fms *fileMetadataStore) getLayerDirectory(layer ChainID) string { - dgst := digest.Digest(layer) - return filepath.Join(fms.root, string(dgst.Algorithm()), dgst.Hex()) -} - -func (fms *fileMetadataStore) getLayerFilename(layer ChainID, filename string) string { - return filepath.Join(fms.getLayerDirectory(layer), filename) -} - -func (fms *fileMetadataStore) getMountDirectory(mount string) string { - return filepath.Join(fms.root, "mounts", mount) -} - -func (fms *fileMetadataStore) getMountFilename(mount, filename string) string { - return filepath.Join(fms.getMountDirectory(mount), filename) -} - -func (fms *fileMetadataStore) StartTransaction() (MetadataTransaction, error) { - tmpDir := filepath.Join(fms.root, "tmp") - if err := os.MkdirAll(tmpDir, 0755); err != nil { - return nil, err - } - ws, err := ioutils.NewAtomicWriteSet(tmpDir) - if err != nil { - return nil, err - } - - return &fileMetadataTransaction{ - store: fms, - ws: ws, - }, nil -} - -func (fm *fileMetadataTransaction) SetSize(size int64) error { - content := fmt.Sprintf("%d", size) - return fm.ws.WriteFile("size", []byte(content), 0644) -} - -func (fm *fileMetadataTransaction) SetParent(parent ChainID) error { - return fm.ws.WriteFile("parent", []byte(digest.Digest(parent).String()), 0644) -} - -func (fm *fileMetadataTransaction) SetDiffID(diff DiffID) error { - return fm.ws.WriteFile("diff", []byte(digest.Digest(diff).String()), 0644) -} - -func (fm *fileMetadataTransaction) SetCacheID(cacheID string) error { - return fm.ws.WriteFile("cache-id", []byte(cacheID), 0644) -} - -func (fm *fileMetadataTransaction) SetDescriptor(ref distribution.Descriptor) error { - jsonRef, err := json.Marshal(ref) - if err != nil { - return err - } - return fm.ws.WriteFile("descriptor.json", jsonRef, 0644) -} - -func (fm *fileMetadataTransaction) TarSplitWriter(compressInput bool) (io.WriteCloser, error) { - f, err := fm.ws.FileWriter("tar-split.json.gz", os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - return nil, err - } - var wc io.WriteCloser - if compressInput { - wc = gzip.NewWriter(f) - } else { - wc = f - } - - return ioutils.NewWriteCloserWrapper(wc, func() error { - wc.Close() - return f.Close() - }), nil -} - -func (fm *fileMetadataTransaction) Commit(layer ChainID) error { - finalDir := fm.store.getLayerDirectory(layer) - if err := os.MkdirAll(filepath.Dir(finalDir), 0755); err != nil { - return err - } - - return fm.ws.Commit(finalDir) -} - -func (fm *fileMetadataTransaction) Cancel() error { - return fm.ws.Cancel() -} - -func (fm *fileMetadataTransaction) String() string { - return fm.ws.String() -} - -func (fms *fileMetadataStore) GetSize(layer ChainID) (int64, error) { - content, err := ioutil.ReadFile(fms.getLayerFilename(layer, "size")) - if err != nil { - return 0, err - } - - size, err := strconv.ParseInt(string(content), 10, 64) - if err != nil { - return 0, err - } - - return size, nil -} - -func (fms *fileMetadataStore) GetParent(layer ChainID) (ChainID, error) { - content, err := ioutil.ReadFile(fms.getLayerFilename(layer, "parent")) - if err != nil { - if os.IsNotExist(err) { - return "", nil - } - return "", err - } - - dgst, err := digest.ParseDigest(strings.TrimSpace(string(content))) - if err != nil { - return "", err - } - - return ChainID(dgst), nil -} - -func (fms *fileMetadataStore) GetDiffID(layer ChainID) (DiffID, error) { - content, err := ioutil.ReadFile(fms.getLayerFilename(layer, "diff")) - if err != nil { - return "", err - } - - dgst, err := digest.ParseDigest(strings.TrimSpace(string(content))) - if err != nil { - return "", err - } - - return DiffID(dgst), nil -} - -func (fms *fileMetadataStore) GetCacheID(layer ChainID) (string, error) { - contentBytes, err := ioutil.ReadFile(fms.getLayerFilename(layer, "cache-id")) - if err != nil { - return "", err - } - content := strings.TrimSpace(string(contentBytes)) - - if !stringIDRegexp.MatchString(content) { - return "", errors.New("invalid cache id value") - } - - return content, nil -} - -func (fms *fileMetadataStore) GetDescriptor(layer ChainID) (distribution.Descriptor, error) { - content, err := ioutil.ReadFile(fms.getLayerFilename(layer, "descriptor.json")) - if err != nil { - if os.IsNotExist(err) { - // only return empty descriptor to represent what is stored - return distribution.Descriptor{}, nil - } - return distribution.Descriptor{}, err - } - - var ref distribution.Descriptor - err = json.Unmarshal(content, &ref) - if err != nil { - return distribution.Descriptor{}, err - } - return ref, err -} - -func (fms *fileMetadataStore) TarSplitReader(layer ChainID) (io.ReadCloser, error) { - fz, err := os.Open(fms.getLayerFilename(layer, "tar-split.json.gz")) - if err != nil { - return nil, err - } - f, err := gzip.NewReader(fz) - if err != nil { - return nil, err - } - - return ioutils.NewReadCloserWrapper(f, func() error { - f.Close() - return fz.Close() - }), nil -} - -func (fms *fileMetadataStore) SetMountID(mount string, mountID string) error { - if err := os.MkdirAll(fms.getMountDirectory(mount), 0755); err != nil { - return err - } - return ioutil.WriteFile(fms.getMountFilename(mount, "mount-id"), []byte(mountID), 0644) -} - -func (fms *fileMetadataStore) SetInitID(mount string, init string) error { - if err := os.MkdirAll(fms.getMountDirectory(mount), 0755); err != nil { - return err - } - return ioutil.WriteFile(fms.getMountFilename(mount, "init-id"), []byte(init), 0644) -} - -func (fms *fileMetadataStore) SetMountParent(mount string, parent ChainID) error { - if err := os.MkdirAll(fms.getMountDirectory(mount), 0755); err != nil { - return err - } - return ioutil.WriteFile(fms.getMountFilename(mount, "parent"), []byte(digest.Digest(parent).String()), 0644) -} - -func (fms *fileMetadataStore) GetMountID(mount string) (string, error) { - contentBytes, err := ioutil.ReadFile(fms.getMountFilename(mount, "mount-id")) - if err != nil { - return "", err - } - content := strings.TrimSpace(string(contentBytes)) - - if !stringIDRegexp.MatchString(content) { - return "", errors.New("invalid mount id value") - } - - return content, nil -} - -func (fms *fileMetadataStore) GetInitID(mount string) (string, error) { - contentBytes, err := ioutil.ReadFile(fms.getMountFilename(mount, "init-id")) - if err != nil { - if os.IsNotExist(err) { - return "", nil - } - return "", err - } - content := strings.TrimSpace(string(contentBytes)) - - if !stringIDRegexp.MatchString(content) { - return "", errors.New("invalid init id value") - } - - return content, nil -} - -func (fms *fileMetadataStore) GetMountParent(mount string) (ChainID, error) { - content, err := ioutil.ReadFile(fms.getMountFilename(mount, "parent")) - if err != nil { - if os.IsNotExist(err) { - return "", nil - } - return "", err - } - - dgst, err := digest.ParseDigest(strings.TrimSpace(string(content))) - if err != nil { - return "", err - } - - return ChainID(dgst), nil -} - -func (fms *fileMetadataStore) List() ([]ChainID, []string, error) { - var ids []ChainID - for _, algorithm := range supportedAlgorithms { - fileInfos, err := ioutil.ReadDir(filepath.Join(fms.root, string(algorithm))) - if err != nil { - if os.IsNotExist(err) { - continue - } - return nil, nil, err - } - - for _, fi := range fileInfos { - if fi.IsDir() && fi.Name() != "mounts" { - dgst := digest.NewDigestFromHex(string(algorithm), fi.Name()) - if err := dgst.Validate(); err != nil { - logrus.Debugf("Ignoring invalid digest %s:%s", algorithm, fi.Name()) - } else { - ids = append(ids, ChainID(dgst)) - } - } - } - } - - fileInfos, err := ioutil.ReadDir(filepath.Join(fms.root, "mounts")) - if err != nil { - if os.IsNotExist(err) { - return ids, []string{}, nil - } - return nil, nil, err - } - - var mounts []string - for _, fi := range fileInfos { - if fi.IsDir() { - mounts = append(mounts, fi.Name()) - } - } - - return ids, mounts, nil -} - -func (fms *fileMetadataStore) Remove(layer ChainID) error { - return os.RemoveAll(fms.getLayerDirectory(layer)) -} - -func (fms *fileMetadataStore) RemoveMount(mount string) error { - return os.RemoveAll(fms.getMountDirectory(mount)) -} diff --git a/vendor/github.com/docker/docker/layer/filestore_test.go b/vendor/github.com/docker/docker/layer/filestore_test.go deleted file mode 100644 index 55e3b2853..000000000 --- a/vendor/github.com/docker/docker/layer/filestore_test.go +++ /dev/null @@ -1,104 +0,0 @@ -package layer - -import ( - "fmt" - "io/ioutil" - "math/rand" - "os" - "path/filepath" - "strings" - "syscall" - "testing" - - "github.com/docker/distribution/digest" -) - -func randomLayerID(seed int64) ChainID { - r := rand.New(rand.NewSource(seed)) - - return ChainID(digest.FromBytes([]byte(fmt.Sprintf("%d", r.Int63())))) -} - -func newFileMetadataStore(t *testing.T) (*fileMetadataStore, string, func()) { - td, err := ioutil.TempDir("", "layers-") - if err != nil { - t.Fatal(err) - } - fms, err := NewFSMetadataStore(td) - if err != nil { - t.Fatal(err) - } - - return fms.(*fileMetadataStore), td, func() { - if err := os.RemoveAll(td); err != nil { - t.Logf("Failed to cleanup %q: %s", td, err) - } - } -} - -func assertNotDirectoryError(t *testing.T, err error) { - perr, ok := err.(*os.PathError) - if !ok { - t.Fatalf("Unexpected error %#v, expected path error", err) - } - - if perr.Err != syscall.ENOTDIR { - t.Fatalf("Unexpected error %s, expected %s", perr.Err, syscall.ENOTDIR) - } -} - -func TestCommitFailure(t *testing.T) { - fms, td, cleanup := newFileMetadataStore(t) - defer cleanup() - - if err := ioutil.WriteFile(filepath.Join(td, "sha256"), []byte("was here first!"), 0644); err != nil { - t.Fatal(err) - } - - tx, err := fms.StartTransaction() - if err != nil { - t.Fatal(err) - } - - if err := tx.SetSize(0); err != nil { - t.Fatal(err) - } - - err = tx.Commit(randomLayerID(5)) - if err == nil { - t.Fatalf("Expected error committing with invalid layer parent directory") - } - assertNotDirectoryError(t, err) -} - -func TestStartTransactionFailure(t *testing.T) { - fms, td, cleanup := newFileMetadataStore(t) - defer cleanup() - - if err := ioutil.WriteFile(filepath.Join(td, "tmp"), []byte("was here first!"), 0644); err != nil { - t.Fatal(err) - } - - _, err := fms.StartTransaction() - if err == nil { - t.Fatalf("Expected error starting transaction with invalid layer parent directory") - } - assertNotDirectoryError(t, err) - - if err := os.Remove(filepath.Join(td, "tmp")); err != nil { - t.Fatal(err) - } - - tx, err := fms.StartTransaction() - if err != nil { - t.Fatal(err) - } - - if expected := filepath.Join(td, "tmp"); strings.HasPrefix(expected, tx.String()) { - t.Fatalf("Unexpected transaction string %q, expected prefix %q", tx.String(), expected) - } - - if err := tx.Cancel(); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/docker/layer/layer.go b/vendor/github.com/docker/docker/layer/layer.go deleted file mode 100644 index ec1d4346d..000000000 --- a/vendor/github.com/docker/docker/layer/layer.go +++ /dev/null @@ -1,275 +0,0 @@ -// Package layer is package for managing read-only -// and read-write mounts on the union file system -// driver. Read-only mounts are referenced using a -// content hash and are protected from mutation in -// the exposed interface. The tar format is used -// to create read-only layers and export both -// read-only and writable layers. The exported -// tar data for a read-only layer should match -// the tar used to create the layer. -package layer - -import ( - "errors" - "io" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/docker/pkg/archive" -) - -var ( - // ErrLayerDoesNotExist is used when an operation is - // attempted on a layer which does not exist. - ErrLayerDoesNotExist = errors.New("layer does not exist") - - // ErrLayerNotRetained is used when a release is - // attempted on a layer which is not retained. - ErrLayerNotRetained = errors.New("layer not retained") - - // ErrMountDoesNotExist is used when an operation is - // attempted on a mount layer which does not exist. - ErrMountDoesNotExist = errors.New("mount does not exist") - - // ErrMountNameConflict is used when a mount is attempted - // to be created but there is already a mount with the name - // used for creation. - ErrMountNameConflict = errors.New("mount already exists with name") - - // ErrActiveMount is used when an operation on a - // mount is attempted but the layer is still - // mounted and the operation cannot be performed. - ErrActiveMount = errors.New("mount still active") - - // ErrNotMounted is used when requesting an active - // mount but the layer is not mounted. - ErrNotMounted = errors.New("not mounted") - - // ErrMaxDepthExceeded is used when a layer is attempted - // to be created which would result in a layer depth - // greater than the 125 max. - ErrMaxDepthExceeded = errors.New("max depth exceeded") - - // ErrNotSupported is used when the action is not supported - // on the current platform - ErrNotSupported = errors.New("not support on this platform") -) - -// ChainID is the content-addressable ID of a layer. -type ChainID digest.Digest - -// String returns a string rendition of a layer ID -func (id ChainID) String() string { - return string(id) -} - -// DiffID is the hash of an individual layer tar. -type DiffID digest.Digest - -// String returns a string rendition of a layer DiffID -func (diffID DiffID) String() string { - return string(diffID) -} - -// TarStreamer represents an object which may -// have its contents exported as a tar stream. -type TarStreamer interface { - // TarStream returns a tar archive stream - // for the contents of a layer. - TarStream() (io.ReadCloser, error) -} - -// Layer represents a read-only layer -type Layer interface { - TarStreamer - - // TarStreamFrom returns a tar archive stream for all the layer chain with - // arbitrary depth. - TarStreamFrom(ChainID) (io.ReadCloser, error) - - // ChainID returns the content hash of the entire layer chain. The hash - // chain is made up of DiffID of top layer and all of its parents. - ChainID() ChainID - - // DiffID returns the content hash of the layer - // tar stream used to create this layer. - DiffID() DiffID - - // Parent returns the next layer in the layer chain. - Parent() Layer - - // Size returns the size of the entire layer chain. The size - // is calculated from the total size of all files in the layers. - Size() (int64, error) - - // DiffSize returns the size difference of the top layer - // from parent layer. - DiffSize() (int64, error) - - // Metadata returns the low level storage metadata associated - // with layer. - Metadata() (map[string]string, error) -} - -// RWLayer represents a layer which is -// read and writable -type RWLayer interface { - TarStreamer - - // Name of mounted layer - Name() string - - // Parent returns the layer which the writable - // layer was created from. - Parent() Layer - - // Mount mounts the RWLayer and returns the filesystem path - // the to the writable layer. - Mount(mountLabel string) (string, error) - - // Unmount unmounts the RWLayer. This should be called - // for every mount. If there are multiple mount calls - // this operation will only decrement the internal mount counter. - Unmount() error - - // Size represents the size of the writable layer - // as calculated by the total size of the files - // changed in the mutable layer. - Size() (int64, error) - - // Changes returns the set of changes for the mutable layer - // from the base layer. - Changes() ([]archive.Change, error) - - // Metadata returns the low level metadata for the mutable layer - Metadata() (map[string]string, error) -} - -// Metadata holds information about a -// read-only layer -type Metadata struct { - // ChainID is the content hash of the layer - ChainID ChainID - - // DiffID is the hash of the tar data used to - // create the layer - DiffID DiffID - - // Size is the size of the layer and all parents - Size int64 - - // DiffSize is the size of the top layer - DiffSize int64 -} - -// MountInit is a function to initialize a -// writable mount. Changes made here will -// not be included in the Tar stream of the -// RWLayer. -type MountInit func(root string) error - -// Store represents a backend for managing both -// read-only and read-write layers. -type Store interface { - Register(io.Reader, ChainID) (Layer, error) - Get(ChainID) (Layer, error) - Map() map[ChainID]Layer - Release(Layer) ([]Metadata, error) - - CreateRWLayer(id string, parent ChainID, mountLabel string, initFunc MountInit, storageOpt map[string]string) (RWLayer, error) - GetRWLayer(id string) (RWLayer, error) - GetMountID(id string) (string, error) - ReleaseRWLayer(RWLayer) ([]Metadata, error) - - Cleanup() error - DriverStatus() [][2]string - DriverName() string -} - -// DescribableStore represents a layer store capable of storing -// descriptors for layers. -type DescribableStore interface { - RegisterWithDescriptor(io.Reader, ChainID, distribution.Descriptor) (Layer, error) -} - -// MetadataTransaction represents functions for setting layer metadata -// with a single transaction. -type MetadataTransaction interface { - SetSize(int64) error - SetParent(parent ChainID) error - SetDiffID(DiffID) error - SetCacheID(string) error - SetDescriptor(distribution.Descriptor) error - TarSplitWriter(compressInput bool) (io.WriteCloser, error) - - Commit(ChainID) error - Cancel() error - String() string -} - -// MetadataStore represents a backend for persisting -// metadata about layers and providing the metadata -// for restoring a Store. -type MetadataStore interface { - // StartTransaction starts an update for new metadata - // which will be used to represent an ID on commit. - StartTransaction() (MetadataTransaction, error) - - GetSize(ChainID) (int64, error) - GetParent(ChainID) (ChainID, error) - GetDiffID(ChainID) (DiffID, error) - GetCacheID(ChainID) (string, error) - GetDescriptor(ChainID) (distribution.Descriptor, error) - TarSplitReader(ChainID) (io.ReadCloser, error) - - SetMountID(string, string) error - SetInitID(string, string) error - SetMountParent(string, ChainID) error - - GetMountID(string) (string, error) - GetInitID(string) (string, error) - GetMountParent(string) (ChainID, error) - - // List returns the full list of referenced - // read-only and read-write layers - List() ([]ChainID, []string, error) - - Remove(ChainID) error - RemoveMount(string) error -} - -// CreateChainID returns ID for a layerDigest slice -func CreateChainID(dgsts []DiffID) ChainID { - return createChainIDFromParent("", dgsts...) -} - -func createChainIDFromParent(parent ChainID, dgsts ...DiffID) ChainID { - if len(dgsts) == 0 { - return parent - } - if parent == "" { - return createChainIDFromParent(ChainID(dgsts[0]), dgsts[1:]...) - } - // H = "H(n-1) SHA256(n)" - dgst := digest.FromBytes([]byte(string(parent) + " " + string(dgsts[0]))) - return createChainIDFromParent(ChainID(dgst), dgsts[1:]...) -} - -// ReleaseAndLog releases the provided layer from the given layer -// store, logging any error and release metadata -func ReleaseAndLog(ls Store, l Layer) { - metadata, err := ls.Release(l) - if err != nil { - logrus.Errorf("Error releasing layer %s: %v", l.ChainID(), err) - } - LogReleaseMetadata(metadata) -} - -// LogReleaseMetadata logs a metadata array, uses this to -// ensure consistent logging for release metadata -func LogReleaseMetadata(metadatas []Metadata) { - for _, metadata := range metadatas { - logrus.Infof("Layer %s cleaned up", metadata.ChainID) - } -} diff --git a/vendor/github.com/docker/docker/layer/layer_store.go b/vendor/github.com/docker/docker/layer/layer_store.go deleted file mode 100644 index 1a1ff9fe5..000000000 --- a/vendor/github.com/docker/docker/layer/layer_store.go +++ /dev/null @@ -1,684 +0,0 @@ -package layer - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution" - "github.com/docker/distribution/digest" - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/plugingetter" - "github.com/docker/docker/pkg/stringid" - "github.com/vbatts/tar-split/tar/asm" - "github.com/vbatts/tar-split/tar/storage" -) - -// maxLayerDepth represents the maximum number of -// layers which can be chained together. 125 was -// chosen to account for the 127 max in some -// graphdrivers plus the 2 additional layers -// used to create a rwlayer. -const maxLayerDepth = 125 - -type layerStore struct { - store MetadataStore - driver graphdriver.Driver - - layerMap map[ChainID]*roLayer - layerL sync.Mutex - - mounts map[string]*mountedLayer - mountL sync.Mutex -} - -// StoreOptions are the options used to create a new Store instance -type StoreOptions struct { - StorePath string - MetadataStorePathTemplate string - GraphDriver string - GraphDriverOptions []string - UIDMaps []idtools.IDMap - GIDMaps []idtools.IDMap - PluginGetter plugingetter.PluginGetter - ExperimentalEnabled bool -} - -// NewStoreFromOptions creates a new Store instance -func NewStoreFromOptions(options StoreOptions) (Store, error) { - driver, err := graphdriver.New(options.GraphDriver, options.PluginGetter, graphdriver.Options{ - Root: options.StorePath, - DriverOptions: options.GraphDriverOptions, - UIDMaps: options.UIDMaps, - GIDMaps: options.GIDMaps, - ExperimentalEnabled: options.ExperimentalEnabled, - }) - if err != nil { - return nil, fmt.Errorf("error initializing graphdriver: %v", err) - } - logrus.Debugf("Using graph driver %s", driver) - - fms, err := NewFSMetadataStore(fmt.Sprintf(options.MetadataStorePathTemplate, driver)) - if err != nil { - return nil, err - } - - return NewStoreFromGraphDriver(fms, driver) -} - -// NewStoreFromGraphDriver creates a new Store instance using the provided -// metadata store and graph driver. The metadata store will be used to restore -// the Store. -func NewStoreFromGraphDriver(store MetadataStore, driver graphdriver.Driver) (Store, error) { - ls := &layerStore{ - store: store, - driver: driver, - layerMap: map[ChainID]*roLayer{}, - mounts: map[string]*mountedLayer{}, - } - - ids, mounts, err := store.List() - if err != nil { - return nil, err - } - - for _, id := range ids { - l, err := ls.loadLayer(id) - if err != nil { - logrus.Debugf("Failed to load layer %s: %s", id, err) - continue - } - if l.parent != nil { - l.parent.referenceCount++ - } - } - - for _, mount := range mounts { - if err := ls.loadMount(mount); err != nil { - logrus.Debugf("Failed to load mount %s: %s", mount, err) - } - } - - return ls, nil -} - -func (ls *layerStore) loadLayer(layer ChainID) (*roLayer, error) { - cl, ok := ls.layerMap[layer] - if ok { - return cl, nil - } - - diff, err := ls.store.GetDiffID(layer) - if err != nil { - return nil, fmt.Errorf("failed to get diff id for %s: %s", layer, err) - } - - size, err := ls.store.GetSize(layer) - if err != nil { - return nil, fmt.Errorf("failed to get size for %s: %s", layer, err) - } - - cacheID, err := ls.store.GetCacheID(layer) - if err != nil { - return nil, fmt.Errorf("failed to get cache id for %s: %s", layer, err) - } - - parent, err := ls.store.GetParent(layer) - if err != nil { - return nil, fmt.Errorf("failed to get parent for %s: %s", layer, err) - } - - descriptor, err := ls.store.GetDescriptor(layer) - if err != nil { - return nil, fmt.Errorf("failed to get descriptor for %s: %s", layer, err) - } - - cl = &roLayer{ - chainID: layer, - diffID: diff, - size: size, - cacheID: cacheID, - layerStore: ls, - references: map[Layer]struct{}{}, - descriptor: descriptor, - } - - if parent != "" { - p, err := ls.loadLayer(parent) - if err != nil { - return nil, err - } - cl.parent = p - } - - ls.layerMap[cl.chainID] = cl - - return cl, nil -} - -func (ls *layerStore) loadMount(mount string) error { - if _, ok := ls.mounts[mount]; ok { - return nil - } - - mountID, err := ls.store.GetMountID(mount) - if err != nil { - return err - } - - initID, err := ls.store.GetInitID(mount) - if err != nil { - return err - } - - parent, err := ls.store.GetMountParent(mount) - if err != nil { - return err - } - - ml := &mountedLayer{ - name: mount, - mountID: mountID, - initID: initID, - layerStore: ls, - references: map[RWLayer]*referencedRWLayer{}, - } - - if parent != "" { - p, err := ls.loadLayer(parent) - if err != nil { - return err - } - ml.parent = p - - p.referenceCount++ - } - - ls.mounts[ml.name] = ml - - return nil -} - -func (ls *layerStore) applyTar(tx MetadataTransaction, ts io.Reader, parent string, layer *roLayer) error { - digester := digest.Canonical.New() - tr := io.TeeReader(ts, digester.Hash()) - - tsw, err := tx.TarSplitWriter(true) - if err != nil { - return err - } - metaPacker := storage.NewJSONPacker(tsw) - defer tsw.Close() - - // we're passing nil here for the file putter, because the ApplyDiff will - // handle the extraction of the archive - rdr, err := asm.NewInputTarStream(tr, metaPacker, nil) - if err != nil { - return err - } - - applySize, err := ls.driver.ApplyDiff(layer.cacheID, parent, rdr) - if err != nil { - return err - } - - // Discard trailing data but ensure metadata is picked up to reconstruct stream - io.Copy(ioutil.Discard, rdr) // ignore error as reader may be closed - - layer.size = applySize - layer.diffID = DiffID(digester.Digest()) - - logrus.Debugf("Applied tar %s to %s, size: %d", layer.diffID, layer.cacheID, applySize) - - return nil -} - -func (ls *layerStore) Register(ts io.Reader, parent ChainID) (Layer, error) { - return ls.registerWithDescriptor(ts, parent, distribution.Descriptor{}) -} - -func (ls *layerStore) registerWithDescriptor(ts io.Reader, parent ChainID, descriptor distribution.Descriptor) (Layer, error) { - // err is used to hold the error which will always trigger - // cleanup of creates sources but may not be an error returned - // to the caller (already exists). - var err error - var pid string - var p *roLayer - if string(parent) != "" { - p = ls.get(parent) - if p == nil { - return nil, ErrLayerDoesNotExist - } - pid = p.cacheID - // Release parent chain if error - defer func() { - if err != nil { - ls.layerL.Lock() - ls.releaseLayer(p) - ls.layerL.Unlock() - } - }() - if p.depth() >= maxLayerDepth { - err = ErrMaxDepthExceeded - return nil, err - } - } - - // Create new roLayer - layer := &roLayer{ - parent: p, - cacheID: stringid.GenerateRandomID(), - referenceCount: 1, - layerStore: ls, - references: map[Layer]struct{}{}, - descriptor: descriptor, - } - - if err = ls.driver.Create(layer.cacheID, pid, nil); err != nil { - return nil, err - } - - tx, err := ls.store.StartTransaction() - if err != nil { - return nil, err - } - - defer func() { - if err != nil { - logrus.Debugf("Cleaning up layer %s: %v", layer.cacheID, err) - if err := ls.driver.Remove(layer.cacheID); err != nil { - logrus.Errorf("Error cleaning up cache layer %s: %v", layer.cacheID, err) - } - if err := tx.Cancel(); err != nil { - logrus.Errorf("Error canceling metadata transaction %q: %s", tx.String(), err) - } - } - }() - - if err = ls.applyTar(tx, ts, pid, layer); err != nil { - return nil, err - } - - if layer.parent == nil { - layer.chainID = ChainID(layer.diffID) - } else { - layer.chainID = createChainIDFromParent(layer.parent.chainID, layer.diffID) - } - - if err = storeLayer(tx, layer); err != nil { - return nil, err - } - - ls.layerL.Lock() - defer ls.layerL.Unlock() - - if existingLayer := ls.getWithoutLock(layer.chainID); existingLayer != nil { - // Set error for cleanup, but do not return the error - err = errors.New("layer already exists") - return existingLayer.getReference(), nil - } - - if err = tx.Commit(layer.chainID); err != nil { - return nil, err - } - - ls.layerMap[layer.chainID] = layer - - return layer.getReference(), nil -} - -func (ls *layerStore) getWithoutLock(layer ChainID) *roLayer { - l, ok := ls.layerMap[layer] - if !ok { - return nil - } - - l.referenceCount++ - - return l -} - -func (ls *layerStore) get(l ChainID) *roLayer { - ls.layerL.Lock() - defer ls.layerL.Unlock() - return ls.getWithoutLock(l) -} - -func (ls *layerStore) Get(l ChainID) (Layer, error) { - ls.layerL.Lock() - defer ls.layerL.Unlock() - - layer := ls.getWithoutLock(l) - if layer == nil { - return nil, ErrLayerDoesNotExist - } - - return layer.getReference(), nil -} - -func (ls *layerStore) Map() map[ChainID]Layer { - ls.layerL.Lock() - defer ls.layerL.Unlock() - - layers := map[ChainID]Layer{} - - for k, v := range ls.layerMap { - layers[k] = v - } - - return layers -} - -func (ls *layerStore) deleteLayer(layer *roLayer, metadata *Metadata) error { - err := ls.driver.Remove(layer.cacheID) - if err != nil { - return err - } - - err = ls.store.Remove(layer.chainID) - if err != nil { - return err - } - metadata.DiffID = layer.diffID - metadata.ChainID = layer.chainID - metadata.Size, err = layer.Size() - if err != nil { - return err - } - metadata.DiffSize = layer.size - - return nil -} - -func (ls *layerStore) releaseLayer(l *roLayer) ([]Metadata, error) { - depth := 0 - removed := []Metadata{} - for { - if l.referenceCount == 0 { - panic("layer not retained") - } - l.referenceCount-- - if l.referenceCount != 0 { - return removed, nil - } - - if len(removed) == 0 && depth > 0 { - panic("cannot remove layer with child") - } - if l.hasReferences() { - panic("cannot delete referenced layer") - } - var metadata Metadata - if err := ls.deleteLayer(l, &metadata); err != nil { - return nil, err - } - - delete(ls.layerMap, l.chainID) - removed = append(removed, metadata) - - if l.parent == nil { - return removed, nil - } - - depth++ - l = l.parent - } -} - -func (ls *layerStore) Release(l Layer) ([]Metadata, error) { - ls.layerL.Lock() - defer ls.layerL.Unlock() - layer, ok := ls.layerMap[l.ChainID()] - if !ok { - return []Metadata{}, nil - } - if !layer.hasReference(l) { - return nil, ErrLayerNotRetained - } - - layer.deleteReference(l) - - return ls.releaseLayer(layer) -} - -func (ls *layerStore) CreateRWLayer(name string, parent ChainID, mountLabel string, initFunc MountInit, storageOpt map[string]string) (RWLayer, error) { - ls.mountL.Lock() - defer ls.mountL.Unlock() - m, ok := ls.mounts[name] - if ok { - return nil, ErrMountNameConflict - } - - var err error - var pid string - var p *roLayer - if string(parent) != "" { - p = ls.get(parent) - if p == nil { - return nil, ErrLayerDoesNotExist - } - pid = p.cacheID - - // Release parent chain if error - defer func() { - if err != nil { - ls.layerL.Lock() - ls.releaseLayer(p) - ls.layerL.Unlock() - } - }() - } - - m = &mountedLayer{ - name: name, - parent: p, - mountID: ls.mountID(name), - layerStore: ls, - references: map[RWLayer]*referencedRWLayer{}, - } - - if initFunc != nil { - pid, err = ls.initMount(m.mountID, pid, mountLabel, initFunc, storageOpt) - if err != nil { - return nil, err - } - m.initID = pid - } - - createOpts := &graphdriver.CreateOpts{ - StorageOpt: storageOpt, - } - - if err = ls.driver.CreateReadWrite(m.mountID, pid, createOpts); err != nil { - return nil, err - } - - if err = ls.saveMount(m); err != nil { - return nil, err - } - - return m.getReference(), nil -} - -func (ls *layerStore) GetRWLayer(id string) (RWLayer, error) { - ls.mountL.Lock() - defer ls.mountL.Unlock() - mount, ok := ls.mounts[id] - if !ok { - return nil, ErrMountDoesNotExist - } - - return mount.getReference(), nil -} - -func (ls *layerStore) GetMountID(id string) (string, error) { - ls.mountL.Lock() - defer ls.mountL.Unlock() - mount, ok := ls.mounts[id] - if !ok { - return "", ErrMountDoesNotExist - } - logrus.Debugf("GetMountID id: %s -> mountID: %s", id, mount.mountID) - - return mount.mountID, nil -} - -func (ls *layerStore) ReleaseRWLayer(l RWLayer) ([]Metadata, error) { - ls.mountL.Lock() - defer ls.mountL.Unlock() - m, ok := ls.mounts[l.Name()] - if !ok { - return []Metadata{}, nil - } - - if err := m.deleteReference(l); err != nil { - return nil, err - } - - if m.hasReferences() { - return []Metadata{}, nil - } - - if err := ls.driver.Remove(m.mountID); err != nil { - logrus.Errorf("Error removing mounted layer %s: %s", m.name, err) - m.retakeReference(l) - return nil, err - } - - if m.initID != "" { - if err := ls.driver.Remove(m.initID); err != nil { - logrus.Errorf("Error removing init layer %s: %s", m.name, err) - m.retakeReference(l) - return nil, err - } - } - - if err := ls.store.RemoveMount(m.name); err != nil { - logrus.Errorf("Error removing mount metadata: %s: %s", m.name, err) - m.retakeReference(l) - return nil, err - } - - delete(ls.mounts, m.Name()) - - ls.layerL.Lock() - defer ls.layerL.Unlock() - if m.parent != nil { - return ls.releaseLayer(m.parent) - } - - return []Metadata{}, nil -} - -func (ls *layerStore) saveMount(mount *mountedLayer) error { - if err := ls.store.SetMountID(mount.name, mount.mountID); err != nil { - return err - } - - if mount.initID != "" { - if err := ls.store.SetInitID(mount.name, mount.initID); err != nil { - return err - } - } - - if mount.parent != nil { - if err := ls.store.SetMountParent(mount.name, mount.parent.chainID); err != nil { - return err - } - } - - ls.mounts[mount.name] = mount - - return nil -} - -func (ls *layerStore) initMount(graphID, parent, mountLabel string, initFunc MountInit, storageOpt map[string]string) (string, error) { - // Use "-init" to maintain compatibility with graph drivers - // which are expecting this layer with this special name. If all - // graph drivers can be updated to not rely on knowing about this layer - // then the initID should be randomly generated. - initID := fmt.Sprintf("%s-init", graphID) - - createOpts := &graphdriver.CreateOpts{ - MountLabel: mountLabel, - StorageOpt: storageOpt, - } - - if err := ls.driver.CreateReadWrite(initID, parent, createOpts); err != nil { - return "", err - } - p, err := ls.driver.Get(initID, "") - if err != nil { - return "", err - } - - if err := initFunc(p); err != nil { - ls.driver.Put(initID) - return "", err - } - - if err := ls.driver.Put(initID); err != nil { - return "", err - } - - return initID, nil -} - -func (ls *layerStore) assembleTarTo(graphID string, metadata io.ReadCloser, size *int64, w io.Writer) error { - diffDriver, ok := ls.driver.(graphdriver.DiffGetterDriver) - if !ok { - diffDriver = &naiveDiffPathDriver{ls.driver} - } - - defer metadata.Close() - - // get our relative path to the container - fileGetCloser, err := diffDriver.DiffGetter(graphID) - if err != nil { - return err - } - defer fileGetCloser.Close() - - metaUnpacker := storage.NewJSONUnpacker(metadata) - upackerCounter := &unpackSizeCounter{metaUnpacker, size} - logrus.Debugf("Assembling tar data for %s", graphID) - return asm.WriteOutputTarStream(fileGetCloser, upackerCounter, w) -} - -func (ls *layerStore) Cleanup() error { - return ls.driver.Cleanup() -} - -func (ls *layerStore) DriverStatus() [][2]string { - return ls.driver.Status() -} - -func (ls *layerStore) DriverName() string { - return ls.driver.String() -} - -type naiveDiffPathDriver struct { - graphdriver.Driver -} - -type fileGetPutter struct { - storage.FileGetter - driver graphdriver.Driver - id string -} - -func (w *fileGetPutter) Close() error { - return w.driver.Put(w.id) -} - -func (n *naiveDiffPathDriver) DiffGetter(id string) (graphdriver.FileGetCloser, error) { - p, err := n.Driver.Get(id, "") - if err != nil { - return nil, err - } - return &fileGetPutter{storage.NewPathFileGetter(p), n.Driver, id}, nil -} diff --git a/vendor/github.com/docker/docker/layer/layer_store_windows.go b/vendor/github.com/docker/docker/layer/layer_store_windows.go deleted file mode 100644 index 1276a912c..000000000 --- a/vendor/github.com/docker/docker/layer/layer_store_windows.go +++ /dev/null @@ -1,11 +0,0 @@ -package layer - -import ( - "io" - - "github.com/docker/distribution" -) - -func (ls *layerStore) RegisterWithDescriptor(ts io.Reader, parent ChainID, descriptor distribution.Descriptor) (Layer, error) { - return ls.registerWithDescriptor(ts, parent, descriptor) -} diff --git a/vendor/github.com/docker/docker/layer/layer_test.go b/vendor/github.com/docker/docker/layer/layer_test.go deleted file mode 100644 index 10712df99..000000000 --- a/vendor/github.com/docker/docker/layer/layer_test.go +++ /dev/null @@ -1,771 +0,0 @@ -package layer - -import ( - "bytes" - "io" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strings" - "testing" - - "github.com/docker/distribution/digest" - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/daemon/graphdriver/vfs" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/stringid" -) - -func init() { - graphdriver.ApplyUncompressedLayer = archive.UnpackLayer - vfs.CopyWithTar = archive.CopyWithTar -} - -func newVFSGraphDriver(td string) (graphdriver.Driver, error) { - uidMap := []idtools.IDMap{ - { - ContainerID: 0, - HostID: os.Getuid(), - Size: 1, - }, - } - gidMap := []idtools.IDMap{ - { - ContainerID: 0, - HostID: os.Getgid(), - Size: 1, - }, - } - - options := graphdriver.Options{Root: td, UIDMaps: uidMap, GIDMaps: gidMap} - return graphdriver.GetDriver("vfs", nil, options) -} - -func newTestGraphDriver(t *testing.T) (graphdriver.Driver, func()) { - td, err := ioutil.TempDir("", "graph-") - if err != nil { - t.Fatal(err) - } - - driver, err := newVFSGraphDriver(td) - if err != nil { - t.Fatal(err) - } - - return driver, func() { - os.RemoveAll(td) - } -} - -func newTestStore(t *testing.T) (Store, string, func()) { - td, err := ioutil.TempDir("", "layerstore-") - if err != nil { - t.Fatal(err) - } - - graph, graphcleanup := newTestGraphDriver(t) - fms, err := NewFSMetadataStore(td) - if err != nil { - t.Fatal(err) - } - ls, err := NewStoreFromGraphDriver(fms, graph) - if err != nil { - t.Fatal(err) - } - - return ls, td, func() { - graphcleanup() - os.RemoveAll(td) - } -} - -type layerInit func(root string) error - -func createLayer(ls Store, parent ChainID, layerFunc layerInit) (Layer, error) { - containerID := stringid.GenerateRandomID() - mount, err := ls.CreateRWLayer(containerID, parent, "", nil, nil) - if err != nil { - return nil, err - } - - path, err := mount.Mount("") - if err != nil { - return nil, err - } - - if err := layerFunc(path); err != nil { - return nil, err - } - - ts, err := mount.TarStream() - if err != nil { - return nil, err - } - defer ts.Close() - - layer, err := ls.Register(ts, parent) - if err != nil { - return nil, err - } - - if err := mount.Unmount(); err != nil { - return nil, err - } - - if _, err := ls.ReleaseRWLayer(mount); err != nil { - return nil, err - } - - return layer, nil -} - -type FileApplier interface { - ApplyFile(root string) error -} - -type testFile struct { - name string - content []byte - permission os.FileMode -} - -func newTestFile(name string, content []byte, perm os.FileMode) FileApplier { - return &testFile{ - name: name, - content: content, - permission: perm, - } -} - -func (tf *testFile) ApplyFile(root string) error { - fullPath := filepath.Join(root, tf.name) - if err := os.MkdirAll(filepath.Dir(fullPath), 0755); err != nil { - return err - } - // Check if already exists - if stat, err := os.Stat(fullPath); err == nil && stat.Mode().Perm() != tf.permission { - if err := os.Chmod(fullPath, tf.permission); err != nil { - return err - } - } - if err := ioutil.WriteFile(fullPath, tf.content, tf.permission); err != nil { - return err - } - return nil -} - -func initWithFiles(files ...FileApplier) layerInit { - return func(root string) error { - for _, f := range files { - if err := f.ApplyFile(root); err != nil { - return err - } - } - return nil - } -} - -func getCachedLayer(l Layer) *roLayer { - if rl, ok := l.(*referencedCacheLayer); ok { - return rl.roLayer - } - return l.(*roLayer) -} - -func getMountLayer(l RWLayer) *mountedLayer { - return l.(*referencedRWLayer).mountedLayer -} - -func createMetadata(layers ...Layer) []Metadata { - metadata := make([]Metadata, len(layers)) - for i := range layers { - size, err := layers[i].Size() - if err != nil { - panic(err) - } - - metadata[i].ChainID = layers[i].ChainID() - metadata[i].DiffID = layers[i].DiffID() - metadata[i].Size = size - metadata[i].DiffSize = getCachedLayer(layers[i]).size - } - - return metadata -} - -func assertMetadata(t *testing.T, metadata, expectedMetadata []Metadata) { - if len(metadata) != len(expectedMetadata) { - t.Fatalf("Unexpected number of deletes %d, expected %d", len(metadata), len(expectedMetadata)) - } - - for i := range metadata { - if metadata[i] != expectedMetadata[i] { - t.Errorf("Unexpected metadata\n\tExpected: %#v\n\tActual: %#v", expectedMetadata[i], metadata[i]) - } - } - if t.Failed() { - t.FailNow() - } -} - -func releaseAndCheckDeleted(t *testing.T, ls Store, layer Layer, removed ...Layer) { - layerCount := len(ls.(*layerStore).layerMap) - expectedMetadata := createMetadata(removed...) - metadata, err := ls.Release(layer) - if err != nil { - t.Fatal(err) - } - - assertMetadata(t, metadata, expectedMetadata) - - if expected := layerCount - len(removed); len(ls.(*layerStore).layerMap) != expected { - t.Fatalf("Unexpected number of layers %d, expected %d", len(ls.(*layerStore).layerMap), expected) - } -} - -func cacheID(l Layer) string { - return getCachedLayer(l).cacheID -} - -func assertLayerEqual(t *testing.T, l1, l2 Layer) { - if l1.ChainID() != l2.ChainID() { - t.Fatalf("Mismatched ID: %s vs %s", l1.ChainID(), l2.ChainID()) - } - if l1.DiffID() != l2.DiffID() { - t.Fatalf("Mismatched DiffID: %s vs %s", l1.DiffID(), l2.DiffID()) - } - - size1, err := l1.Size() - if err != nil { - t.Fatal(err) - } - - size2, err := l2.Size() - if err != nil { - t.Fatal(err) - } - - if size1 != size2 { - t.Fatalf("Mismatched size: %d vs %d", size1, size2) - } - - if cacheID(l1) != cacheID(l2) { - t.Fatalf("Mismatched cache id: %s vs %s", cacheID(l1), cacheID(l2)) - } - - p1 := l1.Parent() - p2 := l2.Parent() - if p1 != nil && p2 != nil { - assertLayerEqual(t, p1, p2) - } else if p1 != nil || p2 != nil { - t.Fatalf("Mismatched parents: %v vs %v", p1, p2) - } -} - -func TestMountAndRegister(t *testing.T) { - ls, _, cleanup := newTestStore(t) - defer cleanup() - - li := initWithFiles(newTestFile("testfile.txt", []byte("some test data"), 0644)) - layer, err := createLayer(ls, "", li) - if err != nil { - t.Fatal(err) - } - - size, _ := layer.Size() - t.Logf("Layer size: %d", size) - - mount2, err := ls.CreateRWLayer("new-test-mount", layer.ChainID(), "", nil, nil) - if err != nil { - t.Fatal(err) - } - - path2, err := mount2.Mount("") - if err != nil { - t.Fatal(err) - } - - b, err := ioutil.ReadFile(filepath.Join(path2, "testfile.txt")) - if err != nil { - t.Fatal(err) - } - - if expected := "some test data"; string(b) != expected { - t.Fatalf("Wrong file data, expected %q, got %q", expected, string(b)) - } - - if err := mount2.Unmount(); err != nil { - t.Fatal(err) - } - - if _, err := ls.ReleaseRWLayer(mount2); err != nil { - t.Fatal(err) - } -} - -func TestLayerRelease(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - ls, _, cleanup := newTestStore(t) - defer cleanup() - - layer1, err := createLayer(ls, "", initWithFiles(newTestFile("layer1.txt", []byte("layer 1 file"), 0644))) - if err != nil { - t.Fatal(err) - } - - layer2, err := createLayer(ls, layer1.ChainID(), initWithFiles(newTestFile("layer2.txt", []byte("layer 2 file"), 0644))) - if err != nil { - t.Fatal(err) - } - - if _, err := ls.Release(layer1); err != nil { - t.Fatal(err) - } - - layer3a, err := createLayer(ls, layer2.ChainID(), initWithFiles(newTestFile("layer3.txt", []byte("layer 3a file"), 0644))) - if err != nil { - t.Fatal(err) - } - - layer3b, err := createLayer(ls, layer2.ChainID(), initWithFiles(newTestFile("layer3.txt", []byte("layer 3b file"), 0644))) - if err != nil { - t.Fatal(err) - } - - if _, err := ls.Release(layer2); err != nil { - t.Fatal(err) - } - - t.Logf("Layer1: %s", layer1.ChainID()) - t.Logf("Layer2: %s", layer2.ChainID()) - t.Logf("Layer3a: %s", layer3a.ChainID()) - t.Logf("Layer3b: %s", layer3b.ChainID()) - - if expected := 4; len(ls.(*layerStore).layerMap) != expected { - t.Fatalf("Unexpected number of layers %d, expected %d", len(ls.(*layerStore).layerMap), expected) - } - - releaseAndCheckDeleted(t, ls, layer3b, layer3b) - releaseAndCheckDeleted(t, ls, layer3a, layer3a, layer2, layer1) -} - -func TestStoreRestore(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - ls, _, cleanup := newTestStore(t) - defer cleanup() - - layer1, err := createLayer(ls, "", initWithFiles(newTestFile("layer1.txt", []byte("layer 1 file"), 0644))) - if err != nil { - t.Fatal(err) - } - - layer2, err := createLayer(ls, layer1.ChainID(), initWithFiles(newTestFile("layer2.txt", []byte("layer 2 file"), 0644))) - if err != nil { - t.Fatal(err) - } - - if _, err := ls.Release(layer1); err != nil { - t.Fatal(err) - } - - layer3, err := createLayer(ls, layer2.ChainID(), initWithFiles(newTestFile("layer3.txt", []byte("layer 3 file"), 0644))) - if err != nil { - t.Fatal(err) - } - - if _, err := ls.Release(layer2); err != nil { - t.Fatal(err) - } - - m, err := ls.CreateRWLayer("some-mount_name", layer3.ChainID(), "", nil, nil) - if err != nil { - t.Fatal(err) - } - - path, err := m.Mount("") - if err != nil { - t.Fatal(err) - } - - if err := ioutil.WriteFile(filepath.Join(path, "testfile.txt"), []byte("nothing here"), 0644); err != nil { - t.Fatal(err) - } - - if err := m.Unmount(); err != nil { - t.Fatal(err) - } - - ls2, err := NewStoreFromGraphDriver(ls.(*layerStore).store, ls.(*layerStore).driver) - if err != nil { - t.Fatal(err) - } - - layer3b, err := ls2.Get(layer3.ChainID()) - if err != nil { - t.Fatal(err) - } - - assertLayerEqual(t, layer3b, layer3) - - // Create again with same name, should return error - if _, err := ls2.CreateRWLayer("some-mount_name", layer3b.ChainID(), "", nil, nil); err == nil { - t.Fatal("Expected error creating mount with same name") - } else if err != ErrMountNameConflict { - t.Fatal(err) - } - - m2, err := ls2.GetRWLayer("some-mount_name") - if err != nil { - t.Fatal(err) - } - - if mountPath, err := m2.Mount(""); err != nil { - t.Fatal(err) - } else if path != mountPath { - t.Fatalf("Unexpected path %s, expected %s", mountPath, path) - } - - if mountPath, err := m2.Mount(""); err != nil { - t.Fatal(err) - } else if path != mountPath { - t.Fatalf("Unexpected path %s, expected %s", mountPath, path) - } - if err := m2.Unmount(); err != nil { - t.Fatal(err) - } - - b, err := ioutil.ReadFile(filepath.Join(path, "testfile.txt")) - if err != nil { - t.Fatal(err) - } - if expected := "nothing here"; string(b) != expected { - t.Fatalf("Unexpected content %q, expected %q", string(b), expected) - } - - if err := m2.Unmount(); err != nil { - t.Fatal(err) - } - - if metadata, err := ls2.ReleaseRWLayer(m2); err != nil { - t.Fatal(err) - } else if len(metadata) != 0 { - t.Fatalf("Unexpectedly deleted layers: %#v", metadata) - } - - if metadata, err := ls2.ReleaseRWLayer(m2); err != nil { - t.Fatal(err) - } else if len(metadata) != 0 { - t.Fatalf("Unexpectedly deleted layers: %#v", metadata) - } - - releaseAndCheckDeleted(t, ls2, layer3b, layer3, layer2, layer1) -} - -func TestTarStreamStability(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - ls, _, cleanup := newTestStore(t) - defer cleanup() - - files1 := []FileApplier{ - newTestFile("/etc/hosts", []byte("mydomain 10.0.0.1"), 0644), - newTestFile("/etc/profile", []byte("PATH=/usr/bin"), 0644), - } - addedFile := newTestFile("/etc/shadow", []byte("root:::::::"), 0644) - files2 := []FileApplier{ - newTestFile("/etc/hosts", []byte("mydomain 10.0.0.2"), 0644), - newTestFile("/etc/profile", []byte("PATH=/usr/bin"), 0664), - newTestFile("/root/.bashrc", []byte("PATH=/usr/sbin:/usr/bin"), 0644), - } - - tar1, err := tarFromFiles(files1...) - if err != nil { - t.Fatal(err) - } - - tar2, err := tarFromFiles(files2...) - if err != nil { - t.Fatal(err) - } - - layer1, err := ls.Register(bytes.NewReader(tar1), "") - if err != nil { - t.Fatal(err) - } - - // hack layer to add file - p, err := ls.(*layerStore).driver.Get(layer1.(*referencedCacheLayer).cacheID, "") - if err != nil { - t.Fatal(err) - } - - if err := addedFile.ApplyFile(p); err != nil { - t.Fatal(err) - } - - if err := ls.(*layerStore).driver.Put(layer1.(*referencedCacheLayer).cacheID); err != nil { - t.Fatal(err) - } - - layer2, err := ls.Register(bytes.NewReader(tar2), layer1.ChainID()) - if err != nil { - t.Fatal(err) - } - - id1 := layer1.ChainID() - t.Logf("Layer 1: %s", layer1.ChainID()) - t.Logf("Layer 2: %s", layer2.ChainID()) - - if _, err := ls.Release(layer1); err != nil { - t.Fatal(err) - } - - assertLayerDiff(t, tar2, layer2) - - layer1b, err := ls.Get(id1) - if err != nil { - t.Logf("Content of layer map: %#v", ls.(*layerStore).layerMap) - t.Fatal(err) - } - - if _, err := ls.Release(layer2); err != nil { - t.Fatal(err) - } - - assertLayerDiff(t, tar1, layer1b) - - if _, err := ls.Release(layer1b); err != nil { - t.Fatal(err) - } -} - -func assertLayerDiff(t *testing.T, expected []byte, layer Layer) { - expectedDigest := digest.FromBytes(expected) - - if digest.Digest(layer.DiffID()) != expectedDigest { - t.Fatalf("Mismatched diff id for %s, got %s, expected %s", layer.ChainID(), layer.DiffID(), expected) - } - - ts, err := layer.TarStream() - if err != nil { - t.Fatal(err) - } - defer ts.Close() - - actual, err := ioutil.ReadAll(ts) - if err != nil { - t.Fatal(err) - } - - if len(actual) != len(expected) { - logByteDiff(t, actual, expected) - t.Fatalf("Mismatched tar stream size for %s, got %d, expected %d", layer.ChainID(), len(actual), len(expected)) - } - - actualDigest := digest.FromBytes(actual) - - if actualDigest != expectedDigest { - logByteDiff(t, actual, expected) - t.Fatalf("Wrong digest of tar stream, got %s, expected %s", actualDigest, expectedDigest) - } -} - -const maxByteLog = 4 * 1024 - -func logByteDiff(t *testing.T, actual, expected []byte) { - d1, d2 := byteDiff(actual, expected) - if len(d1) == 0 && len(d2) == 0 { - return - } - - prefix := len(actual) - len(d1) - if len(d1) > maxByteLog || len(d2) > maxByteLog { - t.Logf("Byte diff after %d matching bytes", prefix) - } else { - t.Logf("Byte diff after %d matching bytes\nActual bytes after prefix:\n%x\nExpected bytes after prefix:\n%x", prefix, d1, d2) - } -} - -// byteDiff returns the differing bytes after the matching prefix -func byteDiff(b1, b2 []byte) ([]byte, []byte) { - i := 0 - for i < len(b1) && i < len(b2) { - if b1[i] != b2[i] { - break - } - i++ - } - - return b1[i:], b2[i:] -} - -func tarFromFiles(files ...FileApplier) ([]byte, error) { - td, err := ioutil.TempDir("", "tar-") - if err != nil { - return nil, err - } - defer os.RemoveAll(td) - - for _, f := range files { - if err := f.ApplyFile(td); err != nil { - return nil, err - } - } - - r, err := archive.Tar(td, archive.Uncompressed) - if err != nil { - return nil, err - } - - buf := bytes.NewBuffer(nil) - if _, err := io.Copy(buf, r); err != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -// assertReferences asserts that all the references are to the same -// image and represent the full set of references to that image. -func assertReferences(t *testing.T, references ...Layer) { - if len(references) == 0 { - return - } - base := references[0].(*referencedCacheLayer).roLayer - seenReferences := map[Layer]struct{}{ - references[0]: {}, - } - for i := 1; i < len(references); i++ { - other := references[i].(*referencedCacheLayer).roLayer - if base != other { - t.Fatalf("Unexpected referenced cache layer %s, expecting %s", other.ChainID(), base.ChainID()) - } - if _, ok := base.references[references[i]]; !ok { - t.Fatalf("Reference not part of reference list: %v", references[i]) - } - if _, ok := seenReferences[references[i]]; ok { - t.Fatalf("Duplicated reference %v", references[i]) - } - } - if rc := len(base.references); rc != len(references) { - t.Fatalf("Unexpected number of references %d, expecting %d", rc, len(references)) - } -} - -func TestRegisterExistingLayer(t *testing.T) { - ls, _, cleanup := newTestStore(t) - defer cleanup() - - baseFiles := []FileApplier{ - newTestFile("/etc/profile", []byte("# Base configuration"), 0644), - } - - layerFiles := []FileApplier{ - newTestFile("/root/.bashrc", []byte("# Root configuration"), 0644), - } - - li := initWithFiles(baseFiles...) - layer1, err := createLayer(ls, "", li) - if err != nil { - t.Fatal(err) - } - - tar1, err := tarFromFiles(layerFiles...) - if err != nil { - t.Fatal(err) - } - - layer2a, err := ls.Register(bytes.NewReader(tar1), layer1.ChainID()) - if err != nil { - t.Fatal(err) - } - - layer2b, err := ls.Register(bytes.NewReader(tar1), layer1.ChainID()) - if err != nil { - t.Fatal(err) - } - - assertReferences(t, layer2a, layer2b) -} - -func TestTarStreamVerification(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - ls, tmpdir, cleanup := newTestStore(t) - defer cleanup() - - files1 := []FileApplier{ - newTestFile("/foo", []byte("abc"), 0644), - newTestFile("/bar", []byte("def"), 0644), - } - files2 := []FileApplier{ - newTestFile("/foo", []byte("abc"), 0644), - newTestFile("/bar", []byte("def"), 0600), // different perm - } - - tar1, err := tarFromFiles(files1...) - if err != nil { - t.Fatal(err) - } - - tar2, err := tarFromFiles(files2...) - if err != nil { - t.Fatal(err) - } - - layer1, err := ls.Register(bytes.NewReader(tar1), "") - if err != nil { - t.Fatal(err) - } - - layer2, err := ls.Register(bytes.NewReader(tar2), "") - if err != nil { - t.Fatal(err) - } - id1 := digest.Digest(layer1.ChainID()) - id2 := digest.Digest(layer2.ChainID()) - - // Replace tar data files - src, err := os.Open(filepath.Join(tmpdir, id1.Algorithm().String(), id1.Hex(), "tar-split.json.gz")) - if err != nil { - t.Fatal(err) - } - defer src.Close() - - dst, err := os.Create(filepath.Join(tmpdir, id2.Algorithm().String(), id2.Hex(), "tar-split.json.gz")) - if err != nil { - t.Fatal(err) - } - defer dst.Close() - - if _, err := io.Copy(dst, src); err != nil { - t.Fatal(err) - } - - src.Sync() - dst.Sync() - - ts, err := layer2.TarStream() - if err != nil { - t.Fatal(err) - } - _, err = io.Copy(ioutil.Discard, ts) - if err == nil { - t.Fatal("expected data verification to fail") - } - if !strings.Contains(err.Error(), "could not verify layer data") { - t.Fatalf("wrong error returned from tarstream: %q", err) - } -} diff --git a/vendor/github.com/docker/docker/layer/layer_unix.go b/vendor/github.com/docker/docker/layer/layer_unix.go deleted file mode 100644 index 776b78ac0..000000000 --- a/vendor/github.com/docker/docker/layer/layer_unix.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build linux freebsd darwin openbsd solaris - -package layer - -import "github.com/docker/docker/pkg/stringid" - -func (ls *layerStore) mountID(name string) string { - return stringid.GenerateRandomID() -} diff --git a/vendor/github.com/docker/docker/layer/layer_unix_test.go b/vendor/github.com/docker/docker/layer/layer_unix_test.go deleted file mode 100644 index 9aa1afd59..000000000 --- a/vendor/github.com/docker/docker/layer/layer_unix_test.go +++ /dev/null @@ -1,71 +0,0 @@ -// +build !windows - -package layer - -import "testing" - -func graphDiffSize(ls Store, l Layer) (int64, error) { - cl := getCachedLayer(l) - var parent string - if cl.parent != nil { - parent = cl.parent.cacheID - } - return ls.(*layerStore).driver.DiffSize(cl.cacheID, parent) -} - -// Unix as Windows graph driver does not support Changes which is indirectly -// invoked by calling DiffSize on the driver -func TestLayerSize(t *testing.T) { - ls, _, cleanup := newTestStore(t) - defer cleanup() - - content1 := []byte("Base contents") - content2 := []byte("Added contents") - - layer1, err := createLayer(ls, "", initWithFiles(newTestFile("file1", content1, 0644))) - if err != nil { - t.Fatal(err) - } - - layer2, err := createLayer(ls, layer1.ChainID(), initWithFiles(newTestFile("file2", content2, 0644))) - if err != nil { - t.Fatal(err) - } - - layer1DiffSize, err := graphDiffSize(ls, layer1) - if err != nil { - t.Fatal(err) - } - - if int(layer1DiffSize) != len(content1) { - t.Fatalf("Unexpected diff size %d, expected %d", layer1DiffSize, len(content1)) - } - - layer1Size, err := layer1.Size() - if err != nil { - t.Fatal(err) - } - - if expected := len(content1); int(layer1Size) != expected { - t.Fatalf("Unexpected size %d, expected %d", layer1Size, expected) - } - - layer2DiffSize, err := graphDiffSize(ls, layer2) - if err != nil { - t.Fatal(err) - } - - if int(layer2DiffSize) != len(content2) { - t.Fatalf("Unexpected diff size %d, expected %d", layer2DiffSize, len(content2)) - } - - layer2Size, err := layer2.Size() - if err != nil { - t.Fatal(err) - } - - if expected := len(content1) + len(content2); int(layer2Size) != expected { - t.Fatalf("Unexpected size %d, expected %d", layer2Size, expected) - } - -} diff --git a/vendor/github.com/docker/docker/layer/layer_windows.go b/vendor/github.com/docker/docker/layer/layer_windows.go deleted file mode 100644 index e20311a09..000000000 --- a/vendor/github.com/docker/docker/layer/layer_windows.go +++ /dev/null @@ -1,98 +0,0 @@ -package layer - -import ( - "errors" - "fmt" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/daemon/graphdriver" -) - -// GetLayerPath returns the path to a layer -func GetLayerPath(s Store, layer ChainID) (string, error) { - ls, ok := s.(*layerStore) - if !ok { - return "", errors.New("unsupported layer store") - } - ls.layerL.Lock() - defer ls.layerL.Unlock() - - rl, ok := ls.layerMap[layer] - if !ok { - return "", ErrLayerDoesNotExist - } - - path, err := ls.driver.Get(rl.cacheID, "") - if err != nil { - return "", err - } - - if err := ls.driver.Put(rl.cacheID); err != nil { - return "", err - } - - return path, nil -} - -func (ls *layerStore) RegisterDiffID(graphID string, size int64) (Layer, error) { - var err error // this is used for cleanup in existingLayer case - diffID := digest.FromBytes([]byte(graphID)) - - // Create new roLayer - layer := &roLayer{ - cacheID: graphID, - diffID: DiffID(diffID), - referenceCount: 1, - layerStore: ls, - references: map[Layer]struct{}{}, - size: size, - } - - tx, err := ls.store.StartTransaction() - if err != nil { - return nil, err - } - defer func() { - if err != nil { - if err := tx.Cancel(); err != nil { - logrus.Errorf("Error canceling metadata transaction %q: %s", tx.String(), err) - } - } - }() - - layer.chainID = createChainIDFromParent("", layer.diffID) - - if !ls.driver.Exists(layer.cacheID) { - return nil, fmt.Errorf("layer %q is unknown to driver", layer.cacheID) - } - if err = storeLayer(tx, layer); err != nil { - return nil, err - } - - ls.layerL.Lock() - defer ls.layerL.Unlock() - - if existingLayer := ls.getWithoutLock(layer.chainID); existingLayer != nil { - // Set error for cleanup, but do not return - err = errors.New("layer already exists") - return existingLayer.getReference(), nil - } - - if err = tx.Commit(layer.chainID); err != nil { - return nil, err - } - - ls.layerMap[layer.chainID] = layer - - return layer.getReference(), nil -} - -func (ls *layerStore) mountID(name string) string { - // windows has issues if container ID doesn't match mount ID - return name -} - -func (ls *layerStore) GraphDriver() graphdriver.Driver { - return ls.driver -} diff --git a/vendor/github.com/docker/docker/layer/migration.go b/vendor/github.com/docker/docker/layer/migration.go deleted file mode 100644 index b45c31099..000000000 --- a/vendor/github.com/docker/docker/layer/migration.go +++ /dev/null @@ -1,256 +0,0 @@ -package layer - -import ( - "compress/gzip" - "errors" - "fmt" - "io" - "os" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/vbatts/tar-split/tar/asm" - "github.com/vbatts/tar-split/tar/storage" -) - -// CreateRWLayerByGraphID creates a RWLayer in the layer store using -// the provided name with the given graphID. To get the RWLayer -// after migration the layer may be retrieved by the given name. -func (ls *layerStore) CreateRWLayerByGraphID(name string, graphID string, parent ChainID) (err error) { - ls.mountL.Lock() - defer ls.mountL.Unlock() - m, ok := ls.mounts[name] - if ok { - if m.parent.chainID != parent { - return errors.New("name conflict, mismatched parent") - } - if m.mountID != graphID { - return errors.New("mount already exists") - } - - return nil - } - - if !ls.driver.Exists(graphID) { - return fmt.Errorf("graph ID does not exist: %q", graphID) - } - - var p *roLayer - if string(parent) != "" { - p = ls.get(parent) - if p == nil { - return ErrLayerDoesNotExist - } - - // Release parent chain if error - defer func() { - if err != nil { - ls.layerL.Lock() - ls.releaseLayer(p) - ls.layerL.Unlock() - } - }() - } - - // TODO: Ensure graphID has correct parent - - m = &mountedLayer{ - name: name, - parent: p, - mountID: graphID, - layerStore: ls, - references: map[RWLayer]*referencedRWLayer{}, - } - - // Check for existing init layer - initID := fmt.Sprintf("%s-init", graphID) - if ls.driver.Exists(initID) { - m.initID = initID - } - - if err = ls.saveMount(m); err != nil { - return err - } - - return nil -} - -func (ls *layerStore) ChecksumForGraphID(id, parent, oldTarDataPath, newTarDataPath string) (diffID DiffID, size int64, err error) { - defer func() { - if err != nil { - logrus.Debugf("could not get checksum for %q with tar-split: %q", id, err) - diffID, size, err = ls.checksumForGraphIDNoTarsplit(id, parent, newTarDataPath) - } - }() - - if oldTarDataPath == "" { - err = errors.New("no tar-split file") - return - } - - tarDataFile, err := os.Open(oldTarDataPath) - if err != nil { - return - } - defer tarDataFile.Close() - uncompressed, err := gzip.NewReader(tarDataFile) - if err != nil { - return - } - - dgst := digest.Canonical.New() - err = ls.assembleTarTo(id, uncompressed, &size, dgst.Hash()) - if err != nil { - return - } - - diffID = DiffID(dgst.Digest()) - err = os.RemoveAll(newTarDataPath) - if err != nil { - return - } - err = os.Link(oldTarDataPath, newTarDataPath) - - return -} - -func (ls *layerStore) checksumForGraphIDNoTarsplit(id, parent, newTarDataPath string) (diffID DiffID, size int64, err error) { - rawarchive, err := ls.driver.Diff(id, parent) - if err != nil { - return - } - defer rawarchive.Close() - - f, err := os.Create(newTarDataPath) - if err != nil { - return - } - defer f.Close() - mfz := gzip.NewWriter(f) - defer mfz.Close() - metaPacker := storage.NewJSONPacker(mfz) - - packerCounter := &packSizeCounter{metaPacker, &size} - - archive, err := asm.NewInputTarStream(rawarchive, packerCounter, nil) - if err != nil { - return - } - dgst, err := digest.FromReader(archive) - if err != nil { - return - } - diffID = DiffID(dgst) - return -} - -func (ls *layerStore) RegisterByGraphID(graphID string, parent ChainID, diffID DiffID, tarDataFile string, size int64) (Layer, error) { - // err is used to hold the error which will always trigger - // cleanup of creates sources but may not be an error returned - // to the caller (already exists). - var err error - var p *roLayer - if string(parent) != "" { - p = ls.get(parent) - if p == nil { - return nil, ErrLayerDoesNotExist - } - - // Release parent chain if error - defer func() { - if err != nil { - ls.layerL.Lock() - ls.releaseLayer(p) - ls.layerL.Unlock() - } - }() - } - - // Create new roLayer - layer := &roLayer{ - parent: p, - cacheID: graphID, - referenceCount: 1, - layerStore: ls, - references: map[Layer]struct{}{}, - diffID: diffID, - size: size, - chainID: createChainIDFromParent(parent, diffID), - } - - ls.layerL.Lock() - defer ls.layerL.Unlock() - - if existingLayer := ls.getWithoutLock(layer.chainID); existingLayer != nil { - // Set error for cleanup, but do not return - err = errors.New("layer already exists") - return existingLayer.getReference(), nil - } - - tx, err := ls.store.StartTransaction() - if err != nil { - return nil, err - } - - defer func() { - if err != nil { - logrus.Debugf("Cleaning up transaction after failed migration for %s: %v", graphID, err) - if err := tx.Cancel(); err != nil { - logrus.Errorf("Error canceling metadata transaction %q: %s", tx.String(), err) - } - } - }() - - tsw, err := tx.TarSplitWriter(false) - if err != nil { - return nil, err - } - defer tsw.Close() - tdf, err := os.Open(tarDataFile) - if err != nil { - return nil, err - } - defer tdf.Close() - _, err = io.Copy(tsw, tdf) - if err != nil { - return nil, err - } - - if err = storeLayer(tx, layer); err != nil { - return nil, err - } - - if err = tx.Commit(layer.chainID); err != nil { - return nil, err - } - - ls.layerMap[layer.chainID] = layer - - return layer.getReference(), nil -} - -type unpackSizeCounter struct { - unpacker storage.Unpacker - size *int64 -} - -func (u *unpackSizeCounter) Next() (*storage.Entry, error) { - e, err := u.unpacker.Next() - if err == nil && u.size != nil { - *u.size += e.Size - } - return e, err -} - -type packSizeCounter struct { - packer storage.Packer - size *int64 -} - -func (p *packSizeCounter) AddEntry(e storage.Entry) (int, error) { - n, err := p.packer.AddEntry(e) - if err == nil && p.size != nil { - *p.size += e.Size - } - return n, err -} diff --git a/vendor/github.com/docker/docker/layer/migration_test.go b/vendor/github.com/docker/docker/layer/migration_test.go deleted file mode 100644 index 07b4b68f8..000000000 --- a/vendor/github.com/docker/docker/layer/migration_test.go +++ /dev/null @@ -1,435 +0,0 @@ -package layer - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "testing" - - "github.com/docker/docker/daemon/graphdriver" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/stringid" - "github.com/vbatts/tar-split/tar/asm" - "github.com/vbatts/tar-split/tar/storage" -) - -func writeTarSplitFile(name string, tarContent []byte) error { - f, err := os.OpenFile(name, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - return err - } - defer f.Close() - - fz := gzip.NewWriter(f) - - metaPacker := storage.NewJSONPacker(fz) - defer fz.Close() - - rdr, err := asm.NewInputTarStream(bytes.NewReader(tarContent), metaPacker, nil) - if err != nil { - return err - } - - if _, err := io.Copy(ioutil.Discard, rdr); err != nil { - return err - } - - return nil -} - -func TestLayerMigration(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - td, err := ioutil.TempDir("", "migration-test-") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(td) - - layer1Files := []FileApplier{ - newTestFile("/root/.bashrc", []byte("# Boring configuration"), 0644), - newTestFile("/etc/profile", []byte("# Base configuration"), 0644), - } - - layer2Files := []FileApplier{ - newTestFile("/root/.bashrc", []byte("# Updated configuration"), 0644), - } - - tar1, err := tarFromFiles(layer1Files...) - if err != nil { - t.Fatal(err) - } - - tar2, err := tarFromFiles(layer2Files...) - if err != nil { - t.Fatal(err) - } - - graph, err := newVFSGraphDriver(filepath.Join(td, "graphdriver-")) - if err != nil { - t.Fatal(err) - } - - graphID1 := stringid.GenerateRandomID() - if err := graph.Create(graphID1, "", nil); err != nil { - t.Fatal(err) - } - if _, err := graph.ApplyDiff(graphID1, "", bytes.NewReader(tar1)); err != nil { - t.Fatal(err) - } - - tf1 := filepath.Join(td, "tar1.json.gz") - if err := writeTarSplitFile(tf1, tar1); err != nil { - t.Fatal(err) - } - - fms, err := NewFSMetadataStore(filepath.Join(td, "layers")) - if err != nil { - t.Fatal(err) - } - ls, err := NewStoreFromGraphDriver(fms, graph) - if err != nil { - t.Fatal(err) - } - - newTarDataPath := filepath.Join(td, ".migration-tardata") - diffID, size, err := ls.(*layerStore).ChecksumForGraphID(graphID1, "", tf1, newTarDataPath) - if err != nil { - t.Fatal(err) - } - - layer1a, err := ls.(*layerStore).RegisterByGraphID(graphID1, "", diffID, newTarDataPath, size) - if err != nil { - t.Fatal(err) - } - - layer1b, err := ls.Register(bytes.NewReader(tar1), "") - if err != nil { - t.Fatal(err) - } - - assertReferences(t, layer1a, layer1b) - // Attempt register, should be same - layer2a, err := ls.Register(bytes.NewReader(tar2), layer1a.ChainID()) - if err != nil { - t.Fatal(err) - } - - graphID2 := stringid.GenerateRandomID() - if err := graph.Create(graphID2, graphID1, nil); err != nil { - t.Fatal(err) - } - if _, err := graph.ApplyDiff(graphID2, graphID1, bytes.NewReader(tar2)); err != nil { - t.Fatal(err) - } - - tf2 := filepath.Join(td, "tar2.json.gz") - if err := writeTarSplitFile(tf2, tar2); err != nil { - t.Fatal(err) - } - diffID, size, err = ls.(*layerStore).ChecksumForGraphID(graphID2, graphID1, tf2, newTarDataPath) - if err != nil { - t.Fatal(err) - } - - layer2b, err := ls.(*layerStore).RegisterByGraphID(graphID2, layer1a.ChainID(), diffID, tf2, size) - if err != nil { - t.Fatal(err) - } - assertReferences(t, layer2a, layer2b) - - if metadata, err := ls.Release(layer2a); err != nil { - t.Fatal(err) - } else if len(metadata) > 0 { - t.Fatalf("Unexpected layer removal after first release: %#v", metadata) - } - - metadata, err := ls.Release(layer2b) - if err != nil { - t.Fatal(err) - } - - assertMetadata(t, metadata, createMetadata(layer2a)) -} - -func tarFromFilesInGraph(graph graphdriver.Driver, graphID, parentID string, files ...FileApplier) ([]byte, error) { - t, err := tarFromFiles(files...) - if err != nil { - return nil, err - } - - if err := graph.Create(graphID, parentID, nil); err != nil { - return nil, err - } - if _, err := graph.ApplyDiff(graphID, parentID, bytes.NewReader(t)); err != nil { - return nil, err - } - - ar, err := graph.Diff(graphID, parentID) - if err != nil { - return nil, err - } - defer ar.Close() - - return ioutil.ReadAll(ar) -} - -func TestLayerMigrationNoTarsplit(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - td, err := ioutil.TempDir("", "migration-test-") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(td) - - layer1Files := []FileApplier{ - newTestFile("/root/.bashrc", []byte("# Boring configuration"), 0644), - newTestFile("/etc/profile", []byte("# Base configuration"), 0644), - } - - layer2Files := []FileApplier{ - newTestFile("/root/.bashrc", []byte("# Updated configuration"), 0644), - } - - graph, err := newVFSGraphDriver(filepath.Join(td, "graphdriver-")) - if err != nil { - t.Fatal(err) - } - graphID1 := stringid.GenerateRandomID() - graphID2 := stringid.GenerateRandomID() - - tar1, err := tarFromFilesInGraph(graph, graphID1, "", layer1Files...) - if err != nil { - t.Fatal(err) - } - - tar2, err := tarFromFilesInGraph(graph, graphID2, graphID1, layer2Files...) - if err != nil { - t.Fatal(err) - } - - fms, err := NewFSMetadataStore(filepath.Join(td, "layers")) - if err != nil { - t.Fatal(err) - } - ls, err := NewStoreFromGraphDriver(fms, graph) - if err != nil { - t.Fatal(err) - } - - newTarDataPath := filepath.Join(td, ".migration-tardata") - diffID, size, err := ls.(*layerStore).ChecksumForGraphID(graphID1, "", "", newTarDataPath) - if err != nil { - t.Fatal(err) - } - - layer1a, err := ls.(*layerStore).RegisterByGraphID(graphID1, "", diffID, newTarDataPath, size) - if err != nil { - t.Fatal(err) - } - - layer1b, err := ls.Register(bytes.NewReader(tar1), "") - if err != nil { - t.Fatal(err) - } - - assertReferences(t, layer1a, layer1b) - - // Attempt register, should be same - layer2a, err := ls.Register(bytes.NewReader(tar2), layer1a.ChainID()) - if err != nil { - t.Fatal(err) - } - - diffID, size, err = ls.(*layerStore).ChecksumForGraphID(graphID2, graphID1, "", newTarDataPath) - if err != nil { - t.Fatal(err) - } - - layer2b, err := ls.(*layerStore).RegisterByGraphID(graphID2, layer1a.ChainID(), diffID, newTarDataPath, size) - if err != nil { - t.Fatal(err) - } - assertReferences(t, layer2a, layer2b) - - if metadata, err := ls.Release(layer2a); err != nil { - t.Fatal(err) - } else if len(metadata) > 0 { - t.Fatalf("Unexpected layer removal after first release: %#v", metadata) - } - - metadata, err := ls.Release(layer2b) - if err != nil { - t.Fatal(err) - } - - assertMetadata(t, metadata, createMetadata(layer2a)) -} - -func TestMountMigration(t *testing.T) { - // TODO Windows: Figure out why this is failing (obvious - paths... needs porting) - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - ls, _, cleanup := newTestStore(t) - defer cleanup() - - baseFiles := []FileApplier{ - newTestFile("/root/.bashrc", []byte("# Boring configuration"), 0644), - newTestFile("/etc/profile", []byte("# Base configuration"), 0644), - } - initFiles := []FileApplier{ - newTestFile("/etc/hosts", []byte{}, 0644), - newTestFile("/etc/resolv.conf", []byte{}, 0644), - } - mountFiles := []FileApplier{ - newTestFile("/etc/hosts", []byte("localhost 127.0.0.1"), 0644), - newTestFile("/root/.bashrc", []byte("# Updated configuration"), 0644), - newTestFile("/root/testfile1.txt", []byte("nothing valuable"), 0644), - } - - initTar, err := tarFromFiles(initFiles...) - if err != nil { - t.Fatal(err) - } - - mountTar, err := tarFromFiles(mountFiles...) - if err != nil { - t.Fatal(err) - } - - graph := ls.(*layerStore).driver - - layer1, err := createLayer(ls, "", initWithFiles(baseFiles...)) - if err != nil { - t.Fatal(err) - } - - graphID1 := layer1.(*referencedCacheLayer).cacheID - - containerID := stringid.GenerateRandomID() - containerInit := fmt.Sprintf("%s-init", containerID) - - if err := graph.Create(containerInit, graphID1, nil); err != nil { - t.Fatal(err) - } - if _, err := graph.ApplyDiff(containerInit, graphID1, bytes.NewReader(initTar)); err != nil { - t.Fatal(err) - } - - if err := graph.Create(containerID, containerInit, nil); err != nil { - t.Fatal(err) - } - if _, err := graph.ApplyDiff(containerID, containerInit, bytes.NewReader(mountTar)); err != nil { - t.Fatal(err) - } - - if err := ls.(*layerStore).CreateRWLayerByGraphID("migration-mount", containerID, layer1.ChainID()); err != nil { - t.Fatal(err) - } - - rwLayer1, err := ls.GetRWLayer("migration-mount") - if err != nil { - t.Fatal(err) - } - - if _, err := rwLayer1.Mount(""); err != nil { - t.Fatal(err) - } - - changes, err := rwLayer1.Changes() - if err != nil { - t.Fatal(err) - } - - if expected := 5; len(changes) != expected { - t.Logf("Changes %#v", changes) - t.Fatalf("Wrong number of changes %d, expected %d", len(changes), expected) - } - - sortChanges(changes) - - assertChange(t, changes[0], archive.Change{ - Path: "/etc", - Kind: archive.ChangeModify, - }) - assertChange(t, changes[1], archive.Change{ - Path: "/etc/hosts", - Kind: archive.ChangeModify, - }) - assertChange(t, changes[2], archive.Change{ - Path: "/root", - Kind: archive.ChangeModify, - }) - assertChange(t, changes[3], archive.Change{ - Path: "/root/.bashrc", - Kind: archive.ChangeModify, - }) - assertChange(t, changes[4], archive.Change{ - Path: "/root/testfile1.txt", - Kind: archive.ChangeAdd, - }) - - if _, err := ls.CreateRWLayer("migration-mount", layer1.ChainID(), "", nil, nil); err == nil { - t.Fatal("Expected error creating mount with same name") - } else if err != ErrMountNameConflict { - t.Fatal(err) - } - - rwLayer2, err := ls.GetRWLayer("migration-mount") - if err != nil { - t.Fatal(err) - } - - if getMountLayer(rwLayer1) != getMountLayer(rwLayer2) { - t.Fatal("Expected same layer from get with same name as from migrate") - } - - if _, err := rwLayer2.Mount(""); err != nil { - t.Fatal(err) - } - - if _, err := rwLayer2.Mount(""); err != nil { - t.Fatal(err) - } - - if metadata, err := ls.Release(layer1); err != nil { - t.Fatal(err) - } else if len(metadata) > 0 { - t.Fatalf("Expected no layers to be deleted, deleted %#v", metadata) - } - - if err := rwLayer1.Unmount(); err != nil { - t.Fatal(err) - } - - if _, err := ls.ReleaseRWLayer(rwLayer1); err != nil { - t.Fatal(err) - } - - if err := rwLayer2.Unmount(); err != nil { - t.Fatal(err) - } - if err := rwLayer2.Unmount(); err != nil { - t.Fatal(err) - } - metadata, err := ls.ReleaseRWLayer(rwLayer2) - if err != nil { - t.Fatal(err) - } - if len(metadata) == 0 { - t.Fatal("Expected base layer to be deleted when deleting mount") - } - - assertMetadata(t, metadata, createMetadata(layer1)) -} diff --git a/vendor/github.com/docker/docker/layer/mount_test.go b/vendor/github.com/docker/docker/layer/mount_test.go deleted file mode 100644 index 7a8637eae..000000000 --- a/vendor/github.com/docker/docker/layer/mount_test.go +++ /dev/null @@ -1,230 +0,0 @@ -package layer - -import ( - "io/ioutil" - "os" - "path/filepath" - "runtime" - "sort" - "testing" - - "github.com/docker/docker/pkg/archive" -) - -func TestMountInit(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - ls, _, cleanup := newTestStore(t) - defer cleanup() - - basefile := newTestFile("testfile.txt", []byte("base data!"), 0644) - initfile := newTestFile("testfile.txt", []byte("init data!"), 0777) - - li := initWithFiles(basefile) - layer, err := createLayer(ls, "", li) - if err != nil { - t.Fatal(err) - } - - mountInit := func(root string) error { - return initfile.ApplyFile(root) - } - - m, err := ls.CreateRWLayer("fun-mount", layer.ChainID(), "", mountInit, nil) - if err != nil { - t.Fatal(err) - } - - path, err := m.Mount("") - if err != nil { - t.Fatal(err) - } - - f, err := os.Open(filepath.Join(path, "testfile.txt")) - if err != nil { - t.Fatal(err) - } - defer f.Close() - - fi, err := f.Stat() - if err != nil { - t.Fatal(err) - } - - b, err := ioutil.ReadAll(f) - if err != nil { - t.Fatal(err) - } - - if expected := "init data!"; string(b) != expected { - t.Fatalf("Unexpected test file contents %q, expected %q", string(b), expected) - } - - if fi.Mode().Perm() != 0777 { - t.Fatalf("Unexpected filemode %o, expecting %o", fi.Mode().Perm(), 0777) - } -} - -func TestMountSize(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - ls, _, cleanup := newTestStore(t) - defer cleanup() - - content1 := []byte("Base contents") - content2 := []byte("Mutable contents") - contentInit := []byte("why am I excluded from the size ☹") - - li := initWithFiles(newTestFile("file1", content1, 0644)) - layer, err := createLayer(ls, "", li) - if err != nil { - t.Fatal(err) - } - - mountInit := func(root string) error { - return newTestFile("file-init", contentInit, 0777).ApplyFile(root) - } - - m, err := ls.CreateRWLayer("mount-size", layer.ChainID(), "", mountInit, nil) - if err != nil { - t.Fatal(err) - } - - path, err := m.Mount("") - if err != nil { - t.Fatal(err) - } - - if err := ioutil.WriteFile(filepath.Join(path, "file2"), content2, 0755); err != nil { - t.Fatal(err) - } - - mountSize, err := m.Size() - if err != nil { - t.Fatal(err) - } - - if expected := len(content2); int(mountSize) != expected { - t.Fatalf("Unexpected mount size %d, expected %d", int(mountSize), expected) - } -} - -func TestMountChanges(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - ls, _, cleanup := newTestStore(t) - defer cleanup() - - basefiles := []FileApplier{ - newTestFile("testfile1.txt", []byte("base data!"), 0644), - newTestFile("testfile2.txt", []byte("base data!"), 0644), - newTestFile("testfile3.txt", []byte("base data!"), 0644), - } - initfile := newTestFile("testfile1.txt", []byte("init data!"), 0777) - - li := initWithFiles(basefiles...) - layer, err := createLayer(ls, "", li) - if err != nil { - t.Fatal(err) - } - - mountInit := func(root string) error { - return initfile.ApplyFile(root) - } - - m, err := ls.CreateRWLayer("mount-changes", layer.ChainID(), "", mountInit, nil) - if err != nil { - t.Fatal(err) - } - - path, err := m.Mount("") - if err != nil { - t.Fatal(err) - } - - if err := os.Chmod(filepath.Join(path, "testfile1.txt"), 0755); err != nil { - t.Fatal(err) - } - - if err := ioutil.WriteFile(filepath.Join(path, "testfile1.txt"), []byte("mount data!"), 0755); err != nil { - t.Fatal(err) - } - - if err := os.Remove(filepath.Join(path, "testfile2.txt")); err != nil { - t.Fatal(err) - } - - if err := os.Chmod(filepath.Join(path, "testfile3.txt"), 0755); err != nil { - t.Fatal(err) - } - - if err := ioutil.WriteFile(filepath.Join(path, "testfile4.txt"), []byte("mount data!"), 0644); err != nil { - t.Fatal(err) - } - - changes, err := m.Changes() - if err != nil { - t.Fatal(err) - } - - if expected := 4; len(changes) != expected { - t.Fatalf("Wrong number of changes %d, expected %d", len(changes), expected) - } - - sortChanges(changes) - - assertChange(t, changes[0], archive.Change{ - Path: "/testfile1.txt", - Kind: archive.ChangeModify, - }) - assertChange(t, changes[1], archive.Change{ - Path: "/testfile2.txt", - Kind: archive.ChangeDelete, - }) - assertChange(t, changes[2], archive.Change{ - Path: "/testfile3.txt", - Kind: archive.ChangeModify, - }) - assertChange(t, changes[3], archive.Change{ - Path: "/testfile4.txt", - Kind: archive.ChangeAdd, - }) -} - -func assertChange(t *testing.T, actual, expected archive.Change) { - if actual.Path != expected.Path { - t.Fatalf("Unexpected change path %s, expected %s", actual.Path, expected.Path) - } - if actual.Kind != expected.Kind { - t.Fatalf("Unexpected change type %s, expected %s", actual.Kind, expected.Kind) - } -} - -func sortChanges(changes []archive.Change) { - cs := &changeSorter{ - changes: changes, - } - sort.Sort(cs) -} - -type changeSorter struct { - changes []archive.Change -} - -func (cs *changeSorter) Len() int { - return len(cs.changes) -} - -func (cs *changeSorter) Swap(i, j int) { - cs.changes[i], cs.changes[j] = cs.changes[j], cs.changes[i] -} - -func (cs *changeSorter) Less(i, j int) bool { - return cs.changes[i].Path < cs.changes[j].Path -} diff --git a/vendor/github.com/docker/docker/layer/mounted_layer.go b/vendor/github.com/docker/docker/layer/mounted_layer.go deleted file mode 100644 index a5cfcfa9b..000000000 --- a/vendor/github.com/docker/docker/layer/mounted_layer.go +++ /dev/null @@ -1,99 +0,0 @@ -package layer - -import ( - "io" - - "github.com/docker/docker/pkg/archive" -) - -type mountedLayer struct { - name string - mountID string - initID string - parent *roLayer - path string - layerStore *layerStore - - references map[RWLayer]*referencedRWLayer -} - -func (ml *mountedLayer) cacheParent() string { - if ml.initID != "" { - return ml.initID - } - if ml.parent != nil { - return ml.parent.cacheID - } - return "" -} - -func (ml *mountedLayer) TarStream() (io.ReadCloser, error) { - return ml.layerStore.driver.Diff(ml.mountID, ml.cacheParent()) -} - -func (ml *mountedLayer) Name() string { - return ml.name -} - -func (ml *mountedLayer) Parent() Layer { - if ml.parent != nil { - return ml.parent - } - - // Return a nil interface instead of an interface wrapping a nil - // pointer. - return nil -} - -func (ml *mountedLayer) Size() (int64, error) { - return ml.layerStore.driver.DiffSize(ml.mountID, ml.cacheParent()) -} - -func (ml *mountedLayer) Changes() ([]archive.Change, error) { - return ml.layerStore.driver.Changes(ml.mountID, ml.cacheParent()) -} - -func (ml *mountedLayer) Metadata() (map[string]string, error) { - return ml.layerStore.driver.GetMetadata(ml.mountID) -} - -func (ml *mountedLayer) getReference() RWLayer { - ref := &referencedRWLayer{ - mountedLayer: ml, - } - ml.references[ref] = ref - - return ref -} - -func (ml *mountedLayer) hasReferences() bool { - return len(ml.references) > 0 -} - -func (ml *mountedLayer) deleteReference(ref RWLayer) error { - if _, ok := ml.references[ref]; !ok { - return ErrLayerNotRetained - } - delete(ml.references, ref) - return nil -} - -func (ml *mountedLayer) retakeReference(r RWLayer) { - if ref, ok := r.(*referencedRWLayer); ok { - ml.references[ref] = ref - } -} - -type referencedRWLayer struct { - *mountedLayer -} - -func (rl *referencedRWLayer) Mount(mountLabel string) (string, error) { - return rl.layerStore.driver.Get(rl.mountedLayer.mountID, mountLabel) -} - -// Unmount decrements the activity count and unmounts the underlying layer -// Callers should only call `Unmount` once per call to `Mount`, even on error. -func (rl *referencedRWLayer) Unmount() error { - return rl.layerStore.driver.Put(rl.mountedLayer.mountID) -} diff --git a/vendor/github.com/docker/docker/layer/ro_layer.go b/vendor/github.com/docker/docker/layer/ro_layer.go deleted file mode 100644 index 7c8d233a3..000000000 --- a/vendor/github.com/docker/docker/layer/ro_layer.go +++ /dev/null @@ -1,192 +0,0 @@ -package layer - -import ( - "fmt" - "io" - - "github.com/docker/distribution" - "github.com/docker/distribution/digest" -) - -type roLayer struct { - chainID ChainID - diffID DiffID - parent *roLayer - cacheID string - size int64 - layerStore *layerStore - descriptor distribution.Descriptor - - referenceCount int - references map[Layer]struct{} -} - -// TarStream for roLayer guarentees that the data that is produced is the exact -// data that the layer was registered with. -func (rl *roLayer) TarStream() (io.ReadCloser, error) { - r, err := rl.layerStore.store.TarSplitReader(rl.chainID) - if err != nil { - return nil, err - } - - pr, pw := io.Pipe() - go func() { - err := rl.layerStore.assembleTarTo(rl.cacheID, r, nil, pw) - if err != nil { - pw.CloseWithError(err) - } else { - pw.Close() - } - }() - rc, err := newVerifiedReadCloser(pr, digest.Digest(rl.diffID)) - if err != nil { - return nil, err - } - return rc, nil -} - -// TarStreamFrom does not make any guarentees to the correctness of the produced -// data. As such it should not be used when the layer content must be verified -// to be an exact match to the registered layer. -func (rl *roLayer) TarStreamFrom(parent ChainID) (io.ReadCloser, error) { - var parentCacheID string - for pl := rl.parent; pl != nil; pl = pl.parent { - if pl.chainID == parent { - parentCacheID = pl.cacheID - break - } - } - - if parent != ChainID("") && parentCacheID == "" { - return nil, fmt.Errorf("layer ID '%s' is not a parent of the specified layer: cannot provide diff to non-parent", parent) - } - return rl.layerStore.driver.Diff(rl.cacheID, parentCacheID) -} - -func (rl *roLayer) ChainID() ChainID { - return rl.chainID -} - -func (rl *roLayer) DiffID() DiffID { - return rl.diffID -} - -func (rl *roLayer) Parent() Layer { - if rl.parent == nil { - return nil - } - return rl.parent -} - -func (rl *roLayer) Size() (size int64, err error) { - if rl.parent != nil { - size, err = rl.parent.Size() - if err != nil { - return - } - } - - return size + rl.size, nil -} - -func (rl *roLayer) DiffSize() (size int64, err error) { - return rl.size, nil -} - -func (rl *roLayer) Metadata() (map[string]string, error) { - return rl.layerStore.driver.GetMetadata(rl.cacheID) -} - -type referencedCacheLayer struct { - *roLayer -} - -func (rl *roLayer) getReference() Layer { - ref := &referencedCacheLayer{ - roLayer: rl, - } - rl.references[ref] = struct{}{} - - return ref -} - -func (rl *roLayer) hasReference(ref Layer) bool { - _, ok := rl.references[ref] - return ok -} - -func (rl *roLayer) hasReferences() bool { - return len(rl.references) > 0 -} - -func (rl *roLayer) deleteReference(ref Layer) { - delete(rl.references, ref) -} - -func (rl *roLayer) depth() int { - if rl.parent == nil { - return 1 - } - return rl.parent.depth() + 1 -} - -func storeLayer(tx MetadataTransaction, layer *roLayer) error { - if err := tx.SetDiffID(layer.diffID); err != nil { - return err - } - if err := tx.SetSize(layer.size); err != nil { - return err - } - if err := tx.SetCacheID(layer.cacheID); err != nil { - return err - } - // Do not store empty descriptors - if layer.descriptor.Digest != "" { - if err := tx.SetDescriptor(layer.descriptor); err != nil { - return err - } - } - if layer.parent != nil { - if err := tx.SetParent(layer.parent.chainID); err != nil { - return err - } - } - - return nil -} - -func newVerifiedReadCloser(rc io.ReadCloser, dgst digest.Digest) (io.ReadCloser, error) { - verifier, err := digest.NewDigestVerifier(dgst) - if err != nil { - return nil, err - } - return &verifiedReadCloser{ - rc: rc, - dgst: dgst, - verifier: verifier, - }, nil -} - -type verifiedReadCloser struct { - rc io.ReadCloser - dgst digest.Digest - verifier digest.Verifier -} - -func (vrc *verifiedReadCloser) Read(p []byte) (n int, err error) { - n, err = vrc.rc.Read(p) - if n > 0 { - if n, err := vrc.verifier.Write(p[:n]); err != nil { - return n, err - } - } - if err == io.EOF { - if !vrc.verifier.Verified() { - err = fmt.Errorf("could not verify layer data for: %s. This may be because internal files in the layer store were modified. Re-pulling or rebuilding this image may resolve the issue", vrc.dgst) - } - } - return -} -func (vrc *verifiedReadCloser) Close() error { - return vrc.rc.Close() -} diff --git a/vendor/github.com/docker/docker/layer/ro_layer_windows.go b/vendor/github.com/docker/docker/layer/ro_layer_windows.go deleted file mode 100644 index 32bd7182a..000000000 --- a/vendor/github.com/docker/docker/layer/ro_layer_windows.go +++ /dev/null @@ -1,9 +0,0 @@ -package layer - -import "github.com/docker/distribution" - -var _ distribution.Describable = &roLayer{} - -func (rl *roLayer) Descriptor() distribution.Descriptor { - return rl.descriptor -} diff --git a/vendor/github.com/docker/docker/libcontainerd/client.go b/vendor/github.com/docker/docker/libcontainerd/client.go deleted file mode 100644 index c14c1c5e4..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/client.go +++ /dev/null @@ -1,46 +0,0 @@ -package libcontainerd - -import ( - "fmt" - "sync" - - "github.com/docker/docker/pkg/locker" -) - -// clientCommon contains the platform agnostic fields used in the client structure -type clientCommon struct { - backend Backend - containers map[string]*container - locker *locker.Locker - mapMutex sync.RWMutex // protects read/write oprations from containers map -} - -func (clnt *client) lock(containerID string) { - clnt.locker.Lock(containerID) -} - -func (clnt *client) unlock(containerID string) { - clnt.locker.Unlock(containerID) -} - -// must hold a lock for cont.containerID -func (clnt *client) appendContainer(cont *container) { - clnt.mapMutex.Lock() - clnt.containers[cont.containerID] = cont - clnt.mapMutex.Unlock() -} -func (clnt *client) deleteContainer(containerID string) { - clnt.mapMutex.Lock() - delete(clnt.containers, containerID) - clnt.mapMutex.Unlock() -} - -func (clnt *client) getContainer(containerID string) (*container, error) { - clnt.mapMutex.RLock() - container, ok := clnt.containers[containerID] - defer clnt.mapMutex.RUnlock() - if !ok { - return nil, fmt.Errorf("invalid container: %s", containerID) // fixme: typed error - } - return container, nil -} diff --git a/vendor/github.com/docker/docker/libcontainerd/client_linux.go b/vendor/github.com/docker/docker/libcontainerd/client_linux.go deleted file mode 100644 index 190f98186..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/client_linux.go +++ /dev/null @@ -1,605 +0,0 @@ -package libcontainerd - -import ( - "fmt" - "os" - "strings" - "sync" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - containerd "github.com/docker/containerd/api/grpc/types" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/mount" - "github.com/golang/protobuf/ptypes" - "github.com/golang/protobuf/ptypes/timestamp" - specs "github.com/opencontainers/runtime-spec/specs-go" - "golang.org/x/net/context" -) - -type client struct { - clientCommon - - // Platform specific properties below here. - remote *remote - q queue - exitNotifiers map[string]*exitNotifier - liveRestore bool -} - -// GetServerVersion returns the connected server version information -func (clnt *client) GetServerVersion(ctx context.Context) (*ServerVersion, error) { - resp, err := clnt.remote.apiClient.GetServerVersion(ctx, &containerd.GetServerVersionRequest{}) - if err != nil { - return nil, err - } - - sv := &ServerVersion{ - GetServerVersionResponse: *resp, - } - - return sv, nil -} - -// AddProcess is the handler for adding a process to an already running -// container. It's called through docker exec. It returns the system pid of the -// exec'd process. -func (clnt *client) AddProcess(ctx context.Context, containerID, processFriendlyName string, specp Process, attachStdio StdioCallback) (pid int, err error) { - clnt.lock(containerID) - defer clnt.unlock(containerID) - container, err := clnt.getContainer(containerID) - if err != nil { - return -1, err - } - - spec, err := container.spec() - if err != nil { - return -1, err - } - sp := spec.Process - sp.Args = specp.Args - sp.Terminal = specp.Terminal - if len(specp.Env) > 0 { - sp.Env = specp.Env - } - if specp.Cwd != nil { - sp.Cwd = *specp.Cwd - } - if specp.User != nil { - sp.User = specs.User{ - UID: specp.User.UID, - GID: specp.User.GID, - AdditionalGids: specp.User.AdditionalGids, - } - } - if specp.Capabilities != nil { - sp.Capabilities = specp.Capabilities - } - - p := container.newProcess(processFriendlyName) - - r := &containerd.AddProcessRequest{ - Args: sp.Args, - Cwd: sp.Cwd, - Terminal: sp.Terminal, - Id: containerID, - Env: sp.Env, - User: &containerd.User{ - Uid: sp.User.UID, - Gid: sp.User.GID, - AdditionalGids: sp.User.AdditionalGids, - }, - Pid: processFriendlyName, - Stdin: p.fifo(syscall.Stdin), - Stdout: p.fifo(syscall.Stdout), - Stderr: p.fifo(syscall.Stderr), - Capabilities: sp.Capabilities, - ApparmorProfile: sp.ApparmorProfile, - SelinuxLabel: sp.SelinuxLabel, - NoNewPrivileges: sp.NoNewPrivileges, - Rlimits: convertRlimits(sp.Rlimits), - } - - fifoCtx, cancel := context.WithCancel(context.Background()) - defer func() { - if err != nil { - cancel() - } - }() - - iopipe, err := p.openFifos(fifoCtx, sp.Terminal) - if err != nil { - return -1, err - } - - resp, err := clnt.remote.apiClient.AddProcess(ctx, r) - if err != nil { - p.closeFifos(iopipe) - return -1, err - } - - var stdinOnce sync.Once - stdin := iopipe.Stdin - iopipe.Stdin = ioutils.NewWriteCloserWrapper(stdin, func() error { - var err error - stdinOnce.Do(func() { // on error from attach we don't know if stdin was already closed - err = stdin.Close() - if err2 := p.sendCloseStdin(); err == nil { - err = err2 - } - }) - return err - }) - - container.processes[processFriendlyName] = p - - if err := attachStdio(*iopipe); err != nil { - p.closeFifos(iopipe) - return -1, err - } - - return int(resp.SystemPid), nil -} - -func (clnt *client) SignalProcess(containerID string, pid string, sig int) error { - clnt.lock(containerID) - defer clnt.unlock(containerID) - _, err := clnt.remote.apiClient.Signal(context.Background(), &containerd.SignalRequest{ - Id: containerID, - Pid: pid, - Signal: uint32(sig), - }) - return err -} - -func (clnt *client) Resize(containerID, processFriendlyName string, width, height int) error { - clnt.lock(containerID) - defer clnt.unlock(containerID) - if _, err := clnt.getContainer(containerID); err != nil { - return err - } - _, err := clnt.remote.apiClient.UpdateProcess(context.Background(), &containerd.UpdateProcessRequest{ - Id: containerID, - Pid: processFriendlyName, - Width: uint32(width), - Height: uint32(height), - }) - return err -} - -func (clnt *client) Pause(containerID string) error { - return clnt.setState(containerID, StatePause) -} - -func (clnt *client) setState(containerID, state string) error { - clnt.lock(containerID) - container, err := clnt.getContainer(containerID) - if err != nil { - clnt.unlock(containerID) - return err - } - if container.systemPid == 0 { - clnt.unlock(containerID) - return fmt.Errorf("No active process for container %s", containerID) - } - st := "running" - if state == StatePause { - st = "paused" - } - chstate := make(chan struct{}) - _, err = clnt.remote.apiClient.UpdateContainer(context.Background(), &containerd.UpdateContainerRequest{ - Id: containerID, - Pid: InitFriendlyName, - Status: st, - }) - if err != nil { - clnt.unlock(containerID) - return err - } - container.pauseMonitor.append(state, chstate) - clnt.unlock(containerID) - <-chstate - return nil -} - -func (clnt *client) Resume(containerID string) error { - return clnt.setState(containerID, StateResume) -} - -func (clnt *client) Stats(containerID string) (*Stats, error) { - resp, err := clnt.remote.apiClient.Stats(context.Background(), &containerd.StatsRequest{containerID}) - if err != nil { - return nil, err - } - return (*Stats)(resp), nil -} - -// Take care of the old 1.11.0 behavior in case the version upgrade -// happened without a clean daemon shutdown -func (clnt *client) cleanupOldRootfs(containerID string) { - // Unmount and delete the bundle folder - if mts, err := mount.GetMounts(); err == nil { - for _, mts := range mts { - if strings.HasSuffix(mts.Mountpoint, containerID+"/rootfs") { - if err := syscall.Unmount(mts.Mountpoint, syscall.MNT_DETACH); err == nil { - os.RemoveAll(strings.TrimSuffix(mts.Mountpoint, "/rootfs")) - } - break - } - } - } -} - -func (clnt *client) setExited(containerID string, exitCode uint32) error { - clnt.lock(containerID) - defer clnt.unlock(containerID) - - err := clnt.backend.StateChanged(containerID, StateInfo{ - CommonStateInfo: CommonStateInfo{ - State: StateExit, - ExitCode: exitCode, - }}) - - clnt.cleanupOldRootfs(containerID) - - return err -} - -func (clnt *client) GetPidsForContainer(containerID string) ([]int, error) { - cont, err := clnt.getContainerdContainer(containerID) - if err != nil { - return nil, err - } - pids := make([]int, len(cont.Pids)) - for i, p := range cont.Pids { - pids[i] = int(p) - } - return pids, nil -} - -// Summary returns a summary of the processes running in a container. -// This is a no-op on Linux. -func (clnt *client) Summary(containerID string) ([]Summary, error) { - return nil, nil -} - -func (clnt *client) getContainerdContainer(containerID string) (*containerd.Container, error) { - resp, err := clnt.remote.apiClient.State(context.Background(), &containerd.StateRequest{Id: containerID}) - if err != nil { - return nil, err - } - for _, cont := range resp.Containers { - if cont.Id == containerID { - return cont, nil - } - } - return nil, fmt.Errorf("invalid state response") -} - -func (clnt *client) UpdateResources(containerID string, resources Resources) error { - clnt.lock(containerID) - defer clnt.unlock(containerID) - container, err := clnt.getContainer(containerID) - if err != nil { - return err - } - if container.systemPid == 0 { - return fmt.Errorf("No active process for container %s", containerID) - } - _, err = clnt.remote.apiClient.UpdateContainer(context.Background(), &containerd.UpdateContainerRequest{ - Id: containerID, - Pid: InitFriendlyName, - Resources: (*containerd.UpdateResource)(&resources), - }) - if err != nil { - return err - } - return nil -} - -func (clnt *client) getExitNotifier(containerID string) *exitNotifier { - clnt.mapMutex.RLock() - defer clnt.mapMutex.RUnlock() - return clnt.exitNotifiers[containerID] -} - -func (clnt *client) getOrCreateExitNotifier(containerID string) *exitNotifier { - clnt.mapMutex.Lock() - w, ok := clnt.exitNotifiers[containerID] - defer clnt.mapMutex.Unlock() - if !ok { - w = &exitNotifier{c: make(chan struct{}), client: clnt} - clnt.exitNotifiers[containerID] = w - } - return w -} - -func (clnt *client) restore(cont *containerd.Container, lastEvent *containerd.Event, attachStdio StdioCallback, options ...CreateOption) (err error) { - clnt.lock(cont.Id) - defer clnt.unlock(cont.Id) - - logrus.Debugf("libcontainerd: restore container %s state %s", cont.Id, cont.Status) - - containerID := cont.Id - if _, err := clnt.getContainer(containerID); err == nil { - return fmt.Errorf("container %s is already active", containerID) - } - - defer func() { - if err != nil { - clnt.deleteContainer(cont.Id) - } - }() - - container := clnt.newContainer(cont.BundlePath, options...) - container.systemPid = systemPid(cont) - - var terminal bool - for _, p := range cont.Processes { - if p.Pid == InitFriendlyName { - terminal = p.Terminal - } - } - - fifoCtx, cancel := context.WithCancel(context.Background()) - defer func() { - if err != nil { - cancel() - } - }() - - iopipe, err := container.openFifos(fifoCtx, terminal) - if err != nil { - return err - } - var stdinOnce sync.Once - stdin := iopipe.Stdin - iopipe.Stdin = ioutils.NewWriteCloserWrapper(stdin, func() error { - var err error - stdinOnce.Do(func() { // on error from attach we don't know if stdin was already closed - err = stdin.Close() - }) - return err - }) - - if err := attachStdio(*iopipe); err != nil { - container.closeFifos(iopipe) - return err - } - - clnt.appendContainer(container) - - err = clnt.backend.StateChanged(containerID, StateInfo{ - CommonStateInfo: CommonStateInfo{ - State: StateRestore, - Pid: container.systemPid, - }}) - - if err != nil { - container.closeFifos(iopipe) - return err - } - - if lastEvent != nil { - // This should only be a pause or resume event - if lastEvent.Type == StatePause || lastEvent.Type == StateResume { - return clnt.backend.StateChanged(containerID, StateInfo{ - CommonStateInfo: CommonStateInfo{ - State: lastEvent.Type, - Pid: container.systemPid, - }}) - } - - logrus.Warnf("libcontainerd: unexpected backlog event: %#v", lastEvent) - } - - return nil -} - -func (clnt *client) getContainerLastEventSinceTime(id string, tsp *timestamp.Timestamp) (*containerd.Event, error) { - er := &containerd.EventsRequest{ - Timestamp: tsp, - StoredOnly: true, - Id: id, - } - events, err := clnt.remote.apiClient.Events(context.Background(), er) - if err != nil { - logrus.Errorf("libcontainerd: failed to get container events stream for %s: %q", er.Id, err) - return nil, err - } - - var ev *containerd.Event - for { - e, err := events.Recv() - if err != nil { - if err.Error() == "EOF" { - break - } - logrus.Errorf("libcontainerd: failed to get container event for %s: %q", id, err) - return nil, err - } - ev = e - logrus.Debugf("libcontainerd: received past event %#v", ev) - } - - return ev, nil -} - -func (clnt *client) getContainerLastEvent(id string) (*containerd.Event, error) { - ev, err := clnt.getContainerLastEventSinceTime(id, clnt.remote.restoreFromTimestamp) - if err == nil && ev == nil { - // If ev is nil and the container is running in containerd, - // we already consumed all the event of the - // container, included the "exit" one. - // Thus, we request all events containerd has in memory for - // this container in order to get the last one (which should - // be an exit event) - logrus.Warnf("libcontainerd: client is out of sync, restore was called on a fully synced container (%s).", id) - // Request all events since beginning of time - t := time.Unix(0, 0) - tsp, err := ptypes.TimestampProto(t) - if err != nil { - logrus.Errorf("libcontainerd: getLastEventSinceTime() failed to convert timestamp: %q", err) - return nil, err - } - - return clnt.getContainerLastEventSinceTime(id, tsp) - } - - return ev, err -} - -func (clnt *client) Restore(containerID string, attachStdio StdioCallback, options ...CreateOption) error { - // Synchronize with live events - clnt.remote.Lock() - defer clnt.remote.Unlock() - // Check that containerd still knows this container. - // - // In the unlikely event that Restore for this container process - // the its past event before the main loop, the event will be - // processed twice. However, this is not an issue as all those - // events will do is change the state of the container to be - // exactly the same. - cont, err := clnt.getContainerdContainer(containerID) - // Get its last event - ev, eerr := clnt.getContainerLastEvent(containerID) - if err != nil || cont.Status == "Stopped" { - if err != nil { - logrus.Warnf("libcontainerd: failed to retrieve container %s state: %v", containerID, err) - } - if ev != nil && (ev.Pid != InitFriendlyName || ev.Type != StateExit) { - // Wait a while for the exit event - timeout := time.NewTimer(10 * time.Second) - tick := time.NewTicker(100 * time.Millisecond) - stop: - for { - select { - case <-timeout.C: - break stop - case <-tick.C: - ev, eerr = clnt.getContainerLastEvent(containerID) - if eerr != nil { - break stop - } - if ev != nil && ev.Pid == InitFriendlyName && ev.Type == StateExit { - break stop - } - } - } - timeout.Stop() - tick.Stop() - } - - // get the exit status for this container, if we don't have - // one, indicate an error - ec := uint32(255) - if eerr == nil && ev != nil && ev.Pid == InitFriendlyName && ev.Type == StateExit { - ec = ev.Status - } - clnt.setExited(containerID, ec) - - return nil - } - - // container is still alive - if clnt.liveRestore { - if err := clnt.restore(cont, ev, attachStdio, options...); err != nil { - logrus.Errorf("libcontainerd: error restoring %s: %v", containerID, err) - } - return nil - } - - // Kill the container if liveRestore == false - w := clnt.getOrCreateExitNotifier(containerID) - clnt.lock(cont.Id) - container := clnt.newContainer(cont.BundlePath) - container.systemPid = systemPid(cont) - clnt.appendContainer(container) - clnt.unlock(cont.Id) - - container.discardFifos() - - if err := clnt.Signal(containerID, int(syscall.SIGTERM)); err != nil { - logrus.Errorf("libcontainerd: error sending sigterm to %v: %v", containerID, err) - } - // Let the main loop handle the exit event - clnt.remote.Unlock() - select { - case <-time.After(10 * time.Second): - if err := clnt.Signal(containerID, int(syscall.SIGKILL)); err != nil { - logrus.Errorf("libcontainerd: error sending sigkill to %v: %v", containerID, err) - } - select { - case <-time.After(2 * time.Second): - case <-w.wait(): - // relock because of the defer - clnt.remote.Lock() - return nil - } - case <-w.wait(): - // relock because of the defer - clnt.remote.Lock() - return nil - } - // relock because of the defer - clnt.remote.Lock() - - clnt.deleteContainer(containerID) - - return clnt.setExited(containerID, uint32(255)) -} - -func (clnt *client) CreateCheckpoint(containerID string, checkpointID string, checkpointDir string, exit bool) error { - clnt.lock(containerID) - defer clnt.unlock(containerID) - if _, err := clnt.getContainer(containerID); err != nil { - return err - } - - _, err := clnt.remote.apiClient.CreateCheckpoint(context.Background(), &containerd.CreateCheckpointRequest{ - Id: containerID, - Checkpoint: &containerd.Checkpoint{ - Name: checkpointID, - Exit: exit, - Tcp: true, - UnixSockets: true, - Shell: false, - EmptyNS: []string{"network"}, - }, - CheckpointDir: checkpointDir, - }) - return err -} - -func (clnt *client) DeleteCheckpoint(containerID string, checkpointID string, checkpointDir string) error { - clnt.lock(containerID) - defer clnt.unlock(containerID) - if _, err := clnt.getContainer(containerID); err != nil { - return err - } - - _, err := clnt.remote.apiClient.DeleteCheckpoint(context.Background(), &containerd.DeleteCheckpointRequest{ - Id: containerID, - Name: checkpointID, - CheckpointDir: checkpointDir, - }) - return err -} - -func (clnt *client) ListCheckpoints(containerID string, checkpointDir string) (*Checkpoints, error) { - clnt.lock(containerID) - defer clnt.unlock(containerID) - if _, err := clnt.getContainer(containerID); err != nil { - return nil, err - } - - resp, err := clnt.remote.apiClient.ListCheckpoint(context.Background(), &containerd.ListCheckpointRequest{ - Id: containerID, - CheckpointDir: checkpointDir, - }) - if err != nil { - return nil, err - } - return (*Checkpoints)(resp), nil -} diff --git a/vendor/github.com/docker/docker/libcontainerd/client_solaris.go b/vendor/github.com/docker/docker/libcontainerd/client_solaris.go deleted file mode 100644 index cb939975f..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/client_solaris.go +++ /dev/null @@ -1,101 +0,0 @@ -package libcontainerd - -import "golang.org/x/net/context" - -type client struct { - clientCommon - - // Platform specific properties below here. - remote *remote - q queue - exitNotifiers map[string]*exitNotifier - liveRestore bool -} - -// GetServerVersion returns the connected server version information -func (clnt *client) GetServerVersion(ctx context.Context) (*ServerVersion, error) { - resp, err := clnt.remote.apiClient.GetServerVersion(ctx, &containerd.GetServerVersionRequest{}) - if err != nil { - return nil, err - } - - sv := &ServerVersion{ - GetServerVersionResponse: *resp, - } - - return sv, nil -} - -func (clnt *client) AddProcess(ctx context.Context, containerID, processFriendlyName string, specp Process, attachStdio StdioCallback) (int, error) { - return -1, nil -} - -func (clnt *client) SignalProcess(containerID string, pid string, sig int) error { - return nil -} - -func (clnt *client) Resize(containerID, processFriendlyName string, width, height int) error { - return nil -} - -func (clnt *client) Pause(containerID string) error { - return nil -} - -func (clnt *client) Resume(containerID string) error { - return nil -} - -func (clnt *client) Stats(containerID string) (*Stats, error) { - return nil, nil -} - -func (clnt *client) getExitNotifier(containerID string) *exitNotifier { - clnt.mapMutex.RLock() - defer clnt.mapMutex.RUnlock() - return clnt.exitNotifiers[containerID] -} - -func (clnt *client) getOrCreateExitNotifier(containerID string) *exitNotifier { - clnt.mapMutex.Lock() - defer clnt.mapMutex.Unlock() - w, ok := clnt.exitNotifiers[containerID] - if !ok { - w = &exitNotifier{c: make(chan struct{}), client: clnt} - clnt.exitNotifiers[containerID] = w - } - return w -} - -// Restore is the handler for restoring a container -func (clnt *client) Restore(containerID string, attachStdio StdioCallback, options ...CreateOption) error { - return nil -} - -func (clnt *client) GetPidsForContainer(containerID string) ([]int, error) { - return nil, nil -} - -// Summary returns a summary of the processes running in a container. -func (clnt *client) Summary(containerID string) ([]Summary, error) { - return nil, nil -} - -// UpdateResources updates resources for a running container. -func (clnt *client) UpdateResources(containerID string, resources Resources) error { - // Updating resource isn't supported on Solaris - // but we should return nil for enabling updating container - return nil -} - -func (clnt *client) CreateCheckpoint(containerID string, checkpointID string, checkpointDir string, exit bool) error { - return nil -} - -func (clnt *client) DeleteCheckpoint(containerID string, checkpointID string, checkpointDir string) error { - return nil -} - -func (clnt *client) ListCheckpoints(containerID string, checkpointDir string) (*Checkpoints, error) { - return nil, nil -} diff --git a/vendor/github.com/docker/docker/libcontainerd/client_unix.go b/vendor/github.com/docker/docker/libcontainerd/client_unix.go deleted file mode 100644 index 21e8fea66..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/client_unix.go +++ /dev/null @@ -1,142 +0,0 @@ -// +build linux solaris - -package libcontainerd - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "strings" - "sync" - - "github.com/Sirupsen/logrus" - containerd "github.com/docker/containerd/api/grpc/types" - "github.com/docker/docker/pkg/idtools" - specs "github.com/opencontainers/runtime-spec/specs-go" - "golang.org/x/net/context" -) - -func (clnt *client) prepareBundleDir(uid, gid int) (string, error) { - root, err := filepath.Abs(clnt.remote.stateDir) - if err != nil { - return "", err - } - if uid == 0 && gid == 0 { - return root, nil - } - p := string(filepath.Separator) - for _, d := range strings.Split(root, string(filepath.Separator))[1:] { - p = filepath.Join(p, d) - fi, err := os.Stat(p) - if err != nil && !os.IsNotExist(err) { - return "", err - } - if os.IsNotExist(err) || fi.Mode()&1 == 0 { - p = fmt.Sprintf("%s.%d.%d", p, uid, gid) - if err := idtools.MkdirAs(p, 0700, uid, gid); err != nil && !os.IsExist(err) { - return "", err - } - } - } - return p, nil -} - -func (clnt *client) Create(containerID string, checkpoint string, checkpointDir string, spec specs.Spec, attachStdio StdioCallback, options ...CreateOption) (err error) { - clnt.lock(containerID) - defer clnt.unlock(containerID) - - if _, err := clnt.getContainer(containerID); err == nil { - return fmt.Errorf("Container %s is already active", containerID) - } - - uid, gid, err := getRootIDs(specs.Spec(spec)) - if err != nil { - return err - } - dir, err := clnt.prepareBundleDir(uid, gid) - if err != nil { - return err - } - - container := clnt.newContainer(filepath.Join(dir, containerID), options...) - if err := container.clean(); err != nil { - return err - } - - defer func() { - if err != nil { - container.clean() - clnt.deleteContainer(containerID) - } - }() - - if err := idtools.MkdirAllAs(container.dir, 0700, uid, gid); err != nil && !os.IsExist(err) { - return err - } - - f, err := os.Create(filepath.Join(container.dir, configFilename)) - if err != nil { - return err - } - defer f.Close() - if err := json.NewEncoder(f).Encode(spec); err != nil { - return err - } - - return container.start(checkpoint, checkpointDir, attachStdio) -} - -func (clnt *client) Signal(containerID string, sig int) error { - clnt.lock(containerID) - defer clnt.unlock(containerID) - _, err := clnt.remote.apiClient.Signal(context.Background(), &containerd.SignalRequest{ - Id: containerID, - Pid: InitFriendlyName, - Signal: uint32(sig), - }) - return err -} - -func (clnt *client) newContainer(dir string, options ...CreateOption) *container { - container := &container{ - containerCommon: containerCommon{ - process: process{ - dir: dir, - processCommon: processCommon{ - containerID: filepath.Base(dir), - client: clnt, - friendlyName: InitFriendlyName, - }, - }, - processes: make(map[string]*process), - }, - } - for _, option := range options { - if err := option.Apply(container); err != nil { - logrus.Errorf("libcontainerd: newContainer(): %v", err) - } - } - return container -} - -type exitNotifier struct { - id string - client *client - c chan struct{} - once sync.Once -} - -func (en *exitNotifier) close() { - en.once.Do(func() { - close(en.c) - en.client.mapMutex.Lock() - if en == en.client.exitNotifiers[en.id] { - delete(en.client.exitNotifiers, en.id) - } - en.client.mapMutex.Unlock() - }) -} -func (en *exitNotifier) wait() <-chan struct{} { - return en.c -} diff --git a/vendor/github.com/docker/docker/libcontainerd/client_windows.go b/vendor/github.com/docker/docker/libcontainerd/client_windows.go deleted file mode 100644 index ddcf321c8..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/client_windows.go +++ /dev/null @@ -1,631 +0,0 @@ -package libcontainerd - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "syscall" - - "golang.org/x/net/context" - - "github.com/Microsoft/hcsshim" - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/sysinfo" - "github.com/opencontainers/runtime-spec/specs-go" -) - -type client struct { - clientCommon - - // Platform specific properties below here (none presently on Windows) -} - -// Win32 error codes that are used for various workarounds -// These really should be ALL_CAPS to match golangs syscall library and standard -// Win32 error conventions, but golint insists on CamelCase. -const ( - CoEClassstring = syscall.Errno(0x800401F3) // Invalid class string - ErrorNoNetwork = syscall.Errno(1222) // The network is not present or not started - ErrorBadPathname = syscall.Errno(161) // The specified path is invalid - ErrorInvalidObject = syscall.Errno(0x800710D8) // The object identifier does not represent a valid object -) - -// defaultOwner is a tag passed to HCS to allow it to differentiate between -// container creator management stacks. We hard code "docker" in the case -// of docker. -const defaultOwner = "docker" - -// Create is the entrypoint to create a container from a spec, and if successfully -// created, start it too. Table below shows the fields required for HCS JSON calling parameters, -// where if not populated, is omitted. -// +-----------------+--------------------------------------------+---------------------------------------------------+ -// | | Isolation=Process | Isolation=Hyper-V | -// +-----------------+--------------------------------------------+---------------------------------------------------+ -// | VolumePath | \\?\\Volume{GUIDa} | | -// | LayerFolderPath | %root%\windowsfilter\containerID | %root%\windowsfilter\containerID (servicing only) | -// | Layers[] | ID=GUIDb;Path=%root%\windowsfilter\layerID | ID=GUIDb;Path=%root%\windowsfilter\layerID | -// | SandboxPath | | %root%\windowsfilter | -// | HvRuntime | | ImagePath=%root%\BaseLayerID\UtilityVM | -// +-----------------+--------------------------------------------+---------------------------------------------------+ -// -// Isolation=Process example: -// -// { -// "SystemType": "Container", -// "Name": "5e0055c814a6005b8e57ac59f9a522066e0af12b48b3c26a9416e23907698776", -// "Owner": "docker", -// "IsDummy": false, -// "VolumePath": "\\\\\\\\?\\\\Volume{66d1ef4c-7a00-11e6-8948-00155ddbef9d}", -// "IgnoreFlushesDuringBoot": true, -// "LayerFolderPath": "C:\\\\control\\\\windowsfilter\\\\5e0055c814a6005b8e57ac59f9a522066e0af12b48b3c26a9416e23907698776", -// "Layers": [{ -// "ID": "18955d65-d45a-557b-bf1c-49d6dfefc526", -// "Path": "C:\\\\control\\\\windowsfilter\\\\65bf96e5760a09edf1790cb229e2dfb2dbd0fcdc0bf7451bae099106bfbfea0c" -// }], -// "HostName": "5e0055c814a6", -// "MappedDirectories": [], -// "HvPartition": false, -// "EndpointList": ["eef2649d-bb17-4d53-9937-295a8efe6f2c"], -// "Servicing": false -//} -// -// Isolation=Hyper-V example: -// -//{ -// "SystemType": "Container", -// "Name": "475c2c58933b72687a88a441e7e0ca4bd72d76413c5f9d5031fee83b98f6045d", -// "Owner": "docker", -// "IsDummy": false, -// "IgnoreFlushesDuringBoot": true, -// "Layers": [{ -// "ID": "18955d65-d45a-557b-bf1c-49d6dfefc526", -// "Path": "C:\\\\control\\\\windowsfilter\\\\65bf96e5760a09edf1790cb229e2dfb2dbd0fcdc0bf7451bae099106bfbfea0c" -// }], -// "HostName": "475c2c58933b", -// "MappedDirectories": [], -// "SandboxPath": "C:\\\\control\\\\windowsfilter", -// "HvPartition": true, -// "EndpointList": ["e1bb1e61-d56f-405e-b75d-fd520cefa0cb"], -// "HvRuntime": { -// "ImagePath": "C:\\\\control\\\\windowsfilter\\\\65bf96e5760a09edf1790cb229e2dfb2dbd0fcdc0bf7451bae099106bfbfea0c\\\\UtilityVM" -// }, -// "Servicing": false -//} -func (clnt *client) Create(containerID string, checkpoint string, checkpointDir string, spec specs.Spec, attachStdio StdioCallback, options ...CreateOption) error { - clnt.lock(containerID) - defer clnt.unlock(containerID) - logrus.Debugln("libcontainerd: client.Create() with spec", spec) - - configuration := &hcsshim.ContainerConfig{ - SystemType: "Container", - Name: containerID, - Owner: defaultOwner, - IgnoreFlushesDuringBoot: false, - HostName: spec.Hostname, - HvPartition: false, - } - - if spec.Windows.Resources != nil { - if spec.Windows.Resources.CPU != nil { - if spec.Windows.Resources.CPU.Count != nil { - // This check is being done here rather than in adaptContainerSettings - // because we don't want to update the HostConfig in case this container - // is moved to a host with more CPUs than this one. - cpuCount := *spec.Windows.Resources.CPU.Count - hostCPUCount := uint64(sysinfo.NumCPU()) - if cpuCount > hostCPUCount { - logrus.Warnf("Changing requested CPUCount of %d to current number of processors, %d", cpuCount, hostCPUCount) - cpuCount = hostCPUCount - } - configuration.ProcessorCount = uint32(cpuCount) - } - if spec.Windows.Resources.CPU.Shares != nil { - configuration.ProcessorWeight = uint64(*spec.Windows.Resources.CPU.Shares) - } - if spec.Windows.Resources.CPU.Percent != nil { - configuration.ProcessorMaximum = int64(*spec.Windows.Resources.CPU.Percent) * 100 // ProcessorMaximum is a value between 1 and 10000 - } - } - if spec.Windows.Resources.Memory != nil { - if spec.Windows.Resources.Memory.Limit != nil { - configuration.MemoryMaximumInMB = int64(*spec.Windows.Resources.Memory.Limit) / 1024 / 1024 - } - } - if spec.Windows.Resources.Storage != nil { - if spec.Windows.Resources.Storage.Bps != nil { - configuration.StorageBandwidthMaximum = *spec.Windows.Resources.Storage.Bps - } - if spec.Windows.Resources.Storage.Iops != nil { - configuration.StorageIOPSMaximum = *spec.Windows.Resources.Storage.Iops - } - } - } - - var layerOpt *LayerOption - for _, option := range options { - if s, ok := option.(*ServicingOption); ok { - configuration.Servicing = s.IsServicing - continue - } - if f, ok := option.(*FlushOption); ok { - configuration.IgnoreFlushesDuringBoot = f.IgnoreFlushesDuringBoot - continue - } - if h, ok := option.(*HyperVIsolationOption); ok { - configuration.HvPartition = h.IsHyperV - configuration.SandboxPath = h.SandboxPath - continue - } - if l, ok := option.(*LayerOption); ok { - layerOpt = l - } - if n, ok := option.(*NetworkEndpointsOption); ok { - configuration.EndpointList = n.Endpoints - configuration.AllowUnqualifiedDNSQuery = n.AllowUnqualifiedDNSQuery - continue - } - if c, ok := option.(*CredentialsOption); ok { - configuration.Credentials = c.Credentials - continue - } - } - - // We must have a layer option with at least one path - if layerOpt == nil || layerOpt.LayerPaths == nil { - return fmt.Errorf("no layer option or paths were supplied to the runtime") - } - - if configuration.HvPartition { - // Find the upper-most utility VM image, since the utility VM does not - // use layering in RS1. - // TODO @swernli/jhowardmsft at some point post RS1 this may be re-locatable. - var uvmImagePath string - for _, path := range layerOpt.LayerPaths { - fullPath := filepath.Join(path, "UtilityVM") - _, err := os.Stat(fullPath) - if err == nil { - uvmImagePath = fullPath - break - } - if !os.IsNotExist(err) { - return err - } - } - if uvmImagePath == "" { - return errors.New("utility VM image could not be found") - } - configuration.HvRuntime = &hcsshim.HvRuntime{ImagePath: uvmImagePath} - } else { - configuration.VolumePath = spec.Root.Path - } - - configuration.LayerFolderPath = layerOpt.LayerFolderPath - - for _, layerPath := range layerOpt.LayerPaths { - _, filename := filepath.Split(layerPath) - g, err := hcsshim.NameToGuid(filename) - if err != nil { - return err - } - configuration.Layers = append(configuration.Layers, hcsshim.Layer{ - ID: g.ToString(), - Path: layerPath, - }) - } - - // Add the mounts (volumes, bind mounts etc) to the structure - mds := make([]hcsshim.MappedDir, len(spec.Mounts)) - for i, mount := range spec.Mounts { - mds[i] = hcsshim.MappedDir{ - HostPath: mount.Source, - ContainerPath: mount.Destination, - ReadOnly: false, - } - for _, o := range mount.Options { - if strings.ToLower(o) == "ro" { - mds[i].ReadOnly = true - } - } - } - configuration.MappedDirectories = mds - - hcsContainer, err := hcsshim.CreateContainer(containerID, configuration) - if err != nil { - return err - } - - // Construct a container object for calling start on it. - container := &container{ - containerCommon: containerCommon{ - process: process{ - processCommon: processCommon{ - containerID: containerID, - client: clnt, - friendlyName: InitFriendlyName, - }, - commandLine: strings.Join(spec.Process.Args, " "), - }, - processes: make(map[string]*process), - }, - ociSpec: spec, - hcsContainer: hcsContainer, - } - - container.options = options - for _, option := range options { - if err := option.Apply(container); err != nil { - logrus.Errorf("libcontainerd: %v", err) - } - } - - // Call start, and if it fails, delete the container from our - // internal structure, start will keep HCS in sync by deleting the - // container there. - logrus.Debugf("libcontainerd: Create() id=%s, Calling start()", containerID) - if err := container.start(attachStdio); err != nil { - clnt.deleteContainer(containerID) - return err - } - - logrus.Debugf("libcontainerd: Create() id=%s completed successfully", containerID) - return nil - -} - -// AddProcess is the handler for adding a process to an already running -// container. It's called through docker exec. It returns the system pid of the -// exec'd process. -func (clnt *client) AddProcess(ctx context.Context, containerID, processFriendlyName string, procToAdd Process, attachStdio StdioCallback) (int, error) { - clnt.lock(containerID) - defer clnt.unlock(containerID) - container, err := clnt.getContainer(containerID) - if err != nil { - return -1, err - } - // Note we always tell HCS to - // create stdout as it's required regardless of '-i' or '-t' options, so that - // docker can always grab the output through logs. We also tell HCS to always - // create stdin, even if it's not used - it will be closed shortly. Stderr - // is only created if it we're not -t. - createProcessParms := hcsshim.ProcessConfig{ - EmulateConsole: procToAdd.Terminal, - CreateStdInPipe: true, - CreateStdOutPipe: true, - CreateStdErrPipe: !procToAdd.Terminal, - } - createProcessParms.ConsoleSize[0] = uint(procToAdd.ConsoleSize.Height) - createProcessParms.ConsoleSize[1] = uint(procToAdd.ConsoleSize.Width) - - // Take working directory from the process to add if it is defined, - // otherwise take from the first process. - if procToAdd.Cwd != "" { - createProcessParms.WorkingDirectory = procToAdd.Cwd - } else { - createProcessParms.WorkingDirectory = container.ociSpec.Process.Cwd - } - - // Configure the environment for the process - createProcessParms.Environment = setupEnvironmentVariables(procToAdd.Env) - createProcessParms.CommandLine = strings.Join(procToAdd.Args, " ") - createProcessParms.User = procToAdd.User.Username - - logrus.Debugf("libcontainerd: commandLine: %s", createProcessParms.CommandLine) - - // Start the command running in the container. - var stdout, stderr io.ReadCloser - var stdin io.WriteCloser - newProcess, err := container.hcsContainer.CreateProcess(&createProcessParms) - if err != nil { - logrus.Errorf("libcontainerd: AddProcess(%s) CreateProcess() failed %s", containerID, err) - return -1, err - } - - pid := newProcess.Pid() - - stdin, stdout, stderr, err = newProcess.Stdio() - if err != nil { - logrus.Errorf("libcontainerd: %s getting std pipes failed %s", containerID, err) - return -1, err - } - - iopipe := &IOPipe{Terminal: procToAdd.Terminal} - iopipe.Stdin = createStdInCloser(stdin, newProcess) - - // Convert io.ReadClosers to io.Readers - if stdout != nil { - iopipe.Stdout = ioutil.NopCloser(&autoClosingReader{ReadCloser: stdout}) - } - if stderr != nil { - iopipe.Stderr = ioutil.NopCloser(&autoClosingReader{ReadCloser: stderr}) - } - - proc := &process{ - processCommon: processCommon{ - containerID: containerID, - friendlyName: processFriendlyName, - client: clnt, - systemPid: uint32(pid), - }, - commandLine: createProcessParms.CommandLine, - hcsProcess: newProcess, - } - - // Add the process to the container's list of processes - container.processes[processFriendlyName] = proc - - // Tell the engine to attach streams back to the client - if err := attachStdio(*iopipe); err != nil { - return -1, err - } - - // Spin up a go routine waiting for exit to handle cleanup - go container.waitExit(proc, false) - - return pid, nil -} - -// Signal handles `docker stop` on Windows. While Linux has support for -// the full range of signals, signals aren't really implemented on Windows. -// We fake supporting regular stop and -9 to force kill. -func (clnt *client) Signal(containerID string, sig int) error { - var ( - cont *container - err error - ) - - // Get the container as we need it to get the container handle. - clnt.lock(containerID) - defer clnt.unlock(containerID) - if cont, err = clnt.getContainer(containerID); err != nil { - return err - } - - cont.manualStopRequested = true - - logrus.Debugf("libcontainerd: Signal() containerID=%s sig=%d pid=%d", containerID, sig, cont.systemPid) - - if syscall.Signal(sig) == syscall.SIGKILL { - // Terminate the compute system - if err := cont.hcsContainer.Terminate(); err != nil { - if !hcsshim.IsPending(err) { - logrus.Errorf("libcontainerd: failed to terminate %s - %q", containerID, err) - } - } - } else { - // Terminate Process - if err := cont.hcsProcess.Kill(); err != nil && !hcsshim.IsAlreadyStopped(err) { - // ignore errors - logrus.Warnf("libcontainerd: failed to terminate pid %d in %s: %q", cont.systemPid, containerID, err) - } - } - - return nil -} - -// While Linux has support for the full range of signals, signals aren't really implemented on Windows. -// We try to terminate the specified process whatever signal is requested. -func (clnt *client) SignalProcess(containerID string, processFriendlyName string, sig int) error { - clnt.lock(containerID) - defer clnt.unlock(containerID) - cont, err := clnt.getContainer(containerID) - if err != nil { - return err - } - - for _, p := range cont.processes { - if p.friendlyName == processFriendlyName { - return p.hcsProcess.Kill() - } - } - - return fmt.Errorf("SignalProcess could not find process %s in %s", processFriendlyName, containerID) -} - -// Resize handles a CLI event to resize an interactive docker run or docker exec -// window. -func (clnt *client) Resize(containerID, processFriendlyName string, width, height int) error { - // Get the libcontainerd container object - clnt.lock(containerID) - defer clnt.unlock(containerID) - cont, err := clnt.getContainer(containerID) - if err != nil { - return err - } - - h, w := uint16(height), uint16(width) - - if processFriendlyName == InitFriendlyName { - logrus.Debugln("libcontainerd: resizing systemPID in", containerID, cont.process.systemPid) - return cont.process.hcsProcess.ResizeConsole(w, h) - } - - for _, p := range cont.processes { - if p.friendlyName == processFriendlyName { - logrus.Debugln("libcontainerd: resizing exec'd process", containerID, p.systemPid) - return p.hcsProcess.ResizeConsole(w, h) - } - } - - return fmt.Errorf("Resize could not find containerID %s to resize", containerID) - -} - -// Pause handles pause requests for containers -func (clnt *client) Pause(containerID string) error { - unlockContainer := true - // Get the libcontainerd container object - clnt.lock(containerID) - defer func() { - if unlockContainer { - clnt.unlock(containerID) - } - }() - container, err := clnt.getContainer(containerID) - if err != nil { - return err - } - - for _, option := range container.options { - if h, ok := option.(*HyperVIsolationOption); ok { - if !h.IsHyperV { - return errors.New("cannot pause Windows Server Containers") - } - break - } - } - - err = container.hcsContainer.Pause() - if err != nil { - return err - } - - // Unlock container before calling back into the daemon - unlockContainer = false - clnt.unlock(containerID) - - return clnt.backend.StateChanged(containerID, StateInfo{ - CommonStateInfo: CommonStateInfo{ - State: StatePause, - }}) -} - -// Resume handles resume requests for containers -func (clnt *client) Resume(containerID string) error { - unlockContainer := true - // Get the libcontainerd container object - clnt.lock(containerID) - defer func() { - if unlockContainer { - clnt.unlock(containerID) - } - }() - container, err := clnt.getContainer(containerID) - if err != nil { - return err - } - - // This should never happen, since Windows Server Containers cannot be paused - for _, option := range container.options { - if h, ok := option.(*HyperVIsolationOption); ok { - if !h.IsHyperV { - return errors.New("cannot resume Windows Server Containers") - } - break - } - } - - err = container.hcsContainer.Resume() - if err != nil { - return err - } - - // Unlock container before calling back into the daemon - unlockContainer = false - clnt.unlock(containerID) - - return clnt.backend.StateChanged(containerID, StateInfo{ - CommonStateInfo: CommonStateInfo{ - State: StateResume, - }}) -} - -// Stats handles stats requests for containers -func (clnt *client) Stats(containerID string) (*Stats, error) { - // Get the libcontainerd container object - clnt.lock(containerID) - defer clnt.unlock(containerID) - container, err := clnt.getContainer(containerID) - if err != nil { - return nil, err - } - s, err := container.hcsContainer.Statistics() - if err != nil { - return nil, err - } - st := Stats(s) - return &st, nil -} - -// Restore is the handler for restoring a container -func (clnt *client) Restore(containerID string, _ StdioCallback, unusedOnWindows ...CreateOption) error { - // TODO Windows: Implement this. For now, just tell the backend the container exited. - logrus.Debugf("libcontainerd: Restore(%s)", containerID) - return clnt.backend.StateChanged(containerID, StateInfo{ - CommonStateInfo: CommonStateInfo{ - State: StateExit, - ExitCode: 1 << 31, - }}) -} - -// GetPidsForContainer returns a list of process IDs running in a container. -// Although implemented, this is not used in Windows. -func (clnt *client) GetPidsForContainer(containerID string) ([]int, error) { - var pids []int - clnt.lock(containerID) - defer clnt.unlock(containerID) - cont, err := clnt.getContainer(containerID) - if err != nil { - return nil, err - } - - // Add the first process - pids = append(pids, int(cont.containerCommon.systemPid)) - // And add all the exec'd processes - for _, p := range cont.processes { - pids = append(pids, int(p.processCommon.systemPid)) - } - return pids, nil -} - -// Summary returns a summary of the processes running in a container. -// This is present in Windows to support docker top. In linux, the -// engine shells out to ps to get process information. On Windows, as -// the containers could be Hyper-V containers, they would not be -// visible on the container host. However, libcontainerd does have -// that information. -func (clnt *client) Summary(containerID string) ([]Summary, error) { - - // Get the libcontainerd container object - clnt.lock(containerID) - defer clnt.unlock(containerID) - container, err := clnt.getContainer(containerID) - if err != nil { - return nil, err - } - p, err := container.hcsContainer.ProcessList() - if err != nil { - return nil, err - } - pl := make([]Summary, len(p)) - for i := range p { - pl[i] = Summary(p[i]) - } - return pl, nil -} - -// UpdateResources updates resources for a running container. -func (clnt *client) UpdateResources(containerID string, resources Resources) error { - // Updating resource isn't supported on Windows - // but we should return nil for enabling updating container - return nil -} - -func (clnt *client) CreateCheckpoint(containerID string, checkpointID string, checkpointDir string, exit bool) error { - return errors.New("Windows: Containers do not support checkpoints") -} - -func (clnt *client) DeleteCheckpoint(containerID string, checkpointID string, checkpointDir string) error { - return errors.New("Windows: Containers do not support checkpoints") -} - -func (clnt *client) ListCheckpoints(containerID string, checkpointDir string) (*Checkpoints, error) { - return nil, errors.New("Windows: Containers do not support checkpoints") -} - -func (clnt *client) GetServerVersion(ctx context.Context) (*ServerVersion, error) { - return &ServerVersion{}, nil -} diff --git a/vendor/github.com/docker/docker/libcontainerd/container.go b/vendor/github.com/docker/docker/libcontainerd/container.go deleted file mode 100644 index b40321389..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/container.go +++ /dev/null @@ -1,13 +0,0 @@ -package libcontainerd - -const ( - // InitFriendlyName is the name given in the lookup map of processes - // for the first process started in a container. - InitFriendlyName = "init" - configFilename = "config.json" -) - -type containerCommon struct { - process - processes map[string]*process -} diff --git a/vendor/github.com/docker/docker/libcontainerd/container_unix.go b/vendor/github.com/docker/docker/libcontainerd/container_unix.go deleted file mode 100644 index 61bab145f..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/container_unix.go +++ /dev/null @@ -1,250 +0,0 @@ -// +build linux solaris - -package libcontainerd - -import ( - "encoding/json" - "io" - "io/ioutil" - "os" - "path/filepath" - "sync" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - containerd "github.com/docker/containerd/api/grpc/types" - "github.com/docker/docker/pkg/ioutils" - specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/tonistiigi/fifo" - "golang.org/x/net/context" -) - -type container struct { - containerCommon - - // Platform specific fields are below here. - pauseMonitor - oom bool - runtime string - runtimeArgs []string -} - -type runtime struct { - path string - args []string -} - -// WithRuntime sets the runtime to be used for the created container -func WithRuntime(path string, args []string) CreateOption { - return runtime{path, args} -} - -func (rt runtime) Apply(p interface{}) error { - if pr, ok := p.(*container); ok { - pr.runtime = rt.path - pr.runtimeArgs = rt.args - } - return nil -} - -func (ctr *container) clean() error { - if os.Getenv("LIBCONTAINERD_NOCLEAN") == "1" { - return nil - } - if _, err := os.Lstat(ctr.dir); err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - - if err := os.RemoveAll(ctr.dir); err != nil { - return err - } - return nil -} - -// cleanProcess removes the fifos used by an additional process. -// Caller needs to lock container ID before calling this method. -func (ctr *container) cleanProcess(id string) { - if p, ok := ctr.processes[id]; ok { - for _, i := range []int{syscall.Stdin, syscall.Stdout, syscall.Stderr} { - if err := os.Remove(p.fifo(i)); err != nil && !os.IsNotExist(err) { - logrus.Warnf("libcontainerd: failed to remove %v for process %v: %v", p.fifo(i), id, err) - } - } - } - delete(ctr.processes, id) -} - -func (ctr *container) spec() (*specs.Spec, error) { - var spec specs.Spec - dt, err := ioutil.ReadFile(filepath.Join(ctr.dir, configFilename)) - if err != nil { - return nil, err - } - if err := json.Unmarshal(dt, &spec); err != nil { - return nil, err - } - return &spec, nil -} - -func (ctr *container) start(checkpoint string, checkpointDir string, attachStdio StdioCallback) (err error) { - spec, err := ctr.spec() - if err != nil { - return nil - } - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - ready := make(chan struct{}) - - fifoCtx, cancel := context.WithCancel(context.Background()) - defer func() { - if err != nil { - cancel() - } - }() - - iopipe, err := ctr.openFifos(fifoCtx, spec.Process.Terminal) - if err != nil { - return err - } - - var stdinOnce sync.Once - - // we need to delay stdin closure after container start or else "stdin close" - // event will be rejected by containerd. - // stdin closure happens in attachStdio - stdin := iopipe.Stdin - iopipe.Stdin = ioutils.NewWriteCloserWrapper(stdin, func() error { - var err error - stdinOnce.Do(func() { // on error from attach we don't know if stdin was already closed - err = stdin.Close() - go func() { - select { - case <-ready: - case <-ctx.Done(): - } - select { - case <-ready: - if err := ctr.sendCloseStdin(); err != nil { - logrus.Warnf("failed to close stdin: %+v", err) - } - default: - } - }() - }) - return err - }) - - r := &containerd.CreateContainerRequest{ - Id: ctr.containerID, - BundlePath: ctr.dir, - Stdin: ctr.fifo(syscall.Stdin), - Stdout: ctr.fifo(syscall.Stdout), - Stderr: ctr.fifo(syscall.Stderr), - Checkpoint: checkpoint, - CheckpointDir: checkpointDir, - // check to see if we are running in ramdisk to disable pivot root - NoPivotRoot: os.Getenv("DOCKER_RAMDISK") != "", - Runtime: ctr.runtime, - RuntimeArgs: ctr.runtimeArgs, - } - ctr.client.appendContainer(ctr) - - if err := attachStdio(*iopipe); err != nil { - ctr.closeFifos(iopipe) - return err - } - - resp, err := ctr.client.remote.apiClient.CreateContainer(context.Background(), r) - if err != nil { - ctr.closeFifos(iopipe) - return err - } - ctr.systemPid = systemPid(resp.Container) - close(ready) - - return ctr.client.backend.StateChanged(ctr.containerID, StateInfo{ - CommonStateInfo: CommonStateInfo{ - State: StateStart, - Pid: ctr.systemPid, - }}) -} - -func (ctr *container) newProcess(friendlyName string) *process { - return &process{ - dir: ctr.dir, - processCommon: processCommon{ - containerID: ctr.containerID, - friendlyName: friendlyName, - client: ctr.client, - }, - } -} - -func (ctr *container) handleEvent(e *containerd.Event) error { - ctr.client.lock(ctr.containerID) - defer ctr.client.unlock(ctr.containerID) - switch e.Type { - case StateExit, StatePause, StateResume, StateOOM: - st := StateInfo{ - CommonStateInfo: CommonStateInfo{ - State: e.Type, - ExitCode: e.Status, - }, - OOMKilled: e.Type == StateExit && ctr.oom, - } - if e.Type == StateOOM { - ctr.oom = true - } - if e.Type == StateExit && e.Pid != InitFriendlyName { - st.ProcessID = e.Pid - st.State = StateExitProcess - } - - // Remove process from list if we have exited - switch st.State { - case StateExit: - ctr.clean() - ctr.client.deleteContainer(e.Id) - case StateExitProcess: - ctr.cleanProcess(st.ProcessID) - } - ctr.client.q.append(e.Id, func() { - if err := ctr.client.backend.StateChanged(e.Id, st); err != nil { - logrus.Errorf("libcontainerd: backend.StateChanged(): %v", err) - } - if e.Type == StatePause || e.Type == StateResume { - ctr.pauseMonitor.handle(e.Type) - } - if e.Type == StateExit { - if en := ctr.client.getExitNotifier(e.Id); en != nil { - en.close() - } - } - }) - - default: - logrus.Debugf("libcontainerd: event unhandled: %+v", e) - } - return nil -} - -// discardFifos attempts to fully read the container fifos to unblock processes -// that may be blocked on the writer side. -func (ctr *container) discardFifos() { - ctx, _ := context.WithTimeout(context.Background(), 3*time.Second) - for _, i := range []int{syscall.Stdout, syscall.Stderr} { - f, err := fifo.OpenFifo(ctx, ctr.fifo(i), syscall.O_RDONLY|syscall.O_NONBLOCK, 0) - if err != nil { - logrus.Warnf("error opening fifo %v for discarding: %+v", f, err) - continue - } - go func() { - io.Copy(ioutil.Discard, f) - }() - } -} diff --git a/vendor/github.com/docker/docker/libcontainerd/container_windows.go b/vendor/github.com/docker/docker/libcontainerd/container_windows.go deleted file mode 100644 index 9b1965099..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/container_windows.go +++ /dev/null @@ -1,311 +0,0 @@ -package libcontainerd - -import ( - "fmt" - "io" - "io/ioutil" - "strings" - "syscall" - "time" - - "github.com/Microsoft/hcsshim" - "github.com/Sirupsen/logrus" - "github.com/opencontainers/runtime-spec/specs-go" -) - -type container struct { - containerCommon - - // Platform specific fields are below here. There are none presently on Windows. - options []CreateOption - - // The ociSpec is required, as client.Create() needs a spec, - // but can be called from the RestartManager context which does not - // otherwise have access to the Spec - ociSpec specs.Spec - - manualStopRequested bool - hcsContainer hcsshim.Container -} - -func (ctr *container) newProcess(friendlyName string) *process { - return &process{ - processCommon: processCommon{ - containerID: ctr.containerID, - friendlyName: friendlyName, - client: ctr.client, - }, - } -} - -// start starts a created container. -// Caller needs to lock container ID before calling this method. -func (ctr *container) start(attachStdio StdioCallback) error { - var err error - isServicing := false - - for _, option := range ctr.options { - if s, ok := option.(*ServicingOption); ok && s.IsServicing { - isServicing = true - } - } - - // Start the container. If this is a servicing container, this call will block - // until the container is done with the servicing execution. - logrus.Debugln("libcontainerd: starting container ", ctr.containerID) - if err = ctr.hcsContainer.Start(); err != nil { - logrus.Errorf("libcontainerd: failed to start container: %s", err) - if err := ctr.terminate(); err != nil { - logrus.Errorf("libcontainerd: failed to cleanup after a failed Start. %s", err) - } else { - logrus.Debugln("libcontainerd: cleaned up after failed Start by calling Terminate") - } - return err - } - - // Note we always tell HCS to - // create stdout as it's required regardless of '-i' or '-t' options, so that - // docker can always grab the output through logs. We also tell HCS to always - // create stdin, even if it's not used - it will be closed shortly. Stderr - // is only created if it we're not -t. - createProcessParms := &hcsshim.ProcessConfig{ - EmulateConsole: ctr.ociSpec.Process.Terminal, - WorkingDirectory: ctr.ociSpec.Process.Cwd, - CreateStdInPipe: !isServicing, - CreateStdOutPipe: !isServicing, - CreateStdErrPipe: !ctr.ociSpec.Process.Terminal && !isServicing, - } - createProcessParms.ConsoleSize[0] = uint(ctr.ociSpec.Process.ConsoleSize.Height) - createProcessParms.ConsoleSize[1] = uint(ctr.ociSpec.Process.ConsoleSize.Width) - - // Configure the environment for the process - createProcessParms.Environment = setupEnvironmentVariables(ctr.ociSpec.Process.Env) - createProcessParms.CommandLine = strings.Join(ctr.ociSpec.Process.Args, " ") - createProcessParms.User = ctr.ociSpec.Process.User.Username - - // Start the command running in the container. - newProcess, err := ctr.hcsContainer.CreateProcess(createProcessParms) - if err != nil { - logrus.Errorf("libcontainerd: CreateProcess() failed %s", err) - if err := ctr.terminate(); err != nil { - logrus.Errorf("libcontainerd: failed to cleanup after a failed CreateProcess. %s", err) - } else { - logrus.Debugln("libcontainerd: cleaned up after failed CreateProcess by calling Terminate") - } - return err - } - - pid := newProcess.Pid() - - // Save the hcs Process and PID - ctr.process.friendlyName = InitFriendlyName - ctr.process.hcsProcess = newProcess - - // If this is a servicing container, wait on the process synchronously here and - // if it succeeds, wait for it cleanly shutdown and merge into the parent container. - if isServicing { - exitCode := ctr.waitProcessExitCode(&ctr.process) - - if exitCode != 0 { - if err := ctr.terminate(); err != nil { - logrus.Warnf("libcontainerd: terminating servicing container %s failed: %s", ctr.containerID, err) - } - return fmt.Errorf("libcontainerd: servicing container %s returned non-zero exit code %d", ctr.containerID, exitCode) - } - - return ctr.hcsContainer.WaitTimeout(time.Minute * 5) - } - - var stdout, stderr io.ReadCloser - var stdin io.WriteCloser - stdin, stdout, stderr, err = newProcess.Stdio() - if err != nil { - logrus.Errorf("libcontainerd: failed to get stdio pipes: %s", err) - if err := ctr.terminate(); err != nil { - logrus.Errorf("libcontainerd: failed to cleanup after a failed Stdio. %s", err) - } - return err - } - - iopipe := &IOPipe{Terminal: ctr.ociSpec.Process.Terminal} - - iopipe.Stdin = createStdInCloser(stdin, newProcess) - - // Convert io.ReadClosers to io.Readers - if stdout != nil { - iopipe.Stdout = ioutil.NopCloser(&autoClosingReader{ReadCloser: stdout}) - } - if stderr != nil { - iopipe.Stderr = ioutil.NopCloser(&autoClosingReader{ReadCloser: stderr}) - } - - // Save the PID - logrus.Debugf("libcontainerd: process started - PID %d", pid) - ctr.systemPid = uint32(pid) - - // Spin up a go routine waiting for exit to handle cleanup - go ctr.waitExit(&ctr.process, true) - - ctr.client.appendContainer(ctr) - - if err := attachStdio(*iopipe); err != nil { - // OK to return the error here, as waitExit will handle tear-down in HCS - return err - } - - // Tell the docker engine that the container has started. - si := StateInfo{ - CommonStateInfo: CommonStateInfo{ - State: StateStart, - Pid: ctr.systemPid, // Not sure this is needed? Double-check monitor.go in daemon BUGBUG @jhowardmsft - }} - logrus.Debugf("libcontainerd: start() completed OK, %+v", si) - return ctr.client.backend.StateChanged(ctr.containerID, si) - -} - -// waitProcessExitCode will wait for the given process to exit and return its error code. -func (ctr *container) waitProcessExitCode(process *process) int { - // Block indefinitely for the process to exit. - err := process.hcsProcess.Wait() - if err != nil { - if herr, ok := err.(*hcsshim.ProcessError); ok && herr.Err != syscall.ERROR_BROKEN_PIPE { - logrus.Warnf("libcontainerd: Wait() failed (container may have been killed): %s", err) - } - // Fall through here, do not return. This ensures we attempt to continue the - // shutdown in HCS and tell the docker engine that the process/container - // has exited to avoid a container being dropped on the floor. - } - - exitCode, err := process.hcsProcess.ExitCode() - if err != nil { - if herr, ok := err.(*hcsshim.ProcessError); ok && herr.Err != syscall.ERROR_BROKEN_PIPE { - logrus.Warnf("libcontainerd: unable to get exit code from container %s", ctr.containerID) - } - // Since we got an error retrieving the exit code, make sure that the code we return - // doesn't incorrectly indicate success. - exitCode = -1 - - // Fall through here, do not return. This ensures we attempt to continue the - // shutdown in HCS and tell the docker engine that the process/container - // has exited to avoid a container being dropped on the floor. - } - - return exitCode -} - -// waitExit runs as a goroutine waiting for the process to exit. It's -// equivalent to (in the linux containerd world) where events come in for -// state change notifications from containerd. -func (ctr *container) waitExit(process *process, isFirstProcessToStart bool) error { - logrus.Debugln("libcontainerd: waitExit() on pid", process.systemPid) - - exitCode := ctr.waitProcessExitCode(process) - // Lock the container while shutting down - ctr.client.lock(ctr.containerID) - - // Assume the container has exited - si := StateInfo{ - CommonStateInfo: CommonStateInfo{ - State: StateExit, - ExitCode: uint32(exitCode), - Pid: process.systemPid, - ProcessID: process.friendlyName, - }, - UpdatePending: false, - } - - // But it could have been an exec'd process which exited - if !isFirstProcessToStart { - si.State = StateExitProcess - ctr.cleanProcess(process.friendlyName) - } else { - updatePending, err := ctr.hcsContainer.HasPendingUpdates() - if err != nil { - logrus.Warnf("libcontainerd: HasPendingUpdates() failed (container may have been killed): %s", err) - } else { - si.UpdatePending = updatePending - } - - logrus.Debugf("libcontainerd: shutting down container %s", ctr.containerID) - if err := ctr.shutdown(); err != nil { - logrus.Debugf("libcontainerd: failed to shutdown container %s", ctr.containerID) - } else { - logrus.Debugf("libcontainerd: completed shutting down container %s", ctr.containerID) - } - if err := ctr.hcsContainer.Close(); err != nil { - logrus.Error(err) - } - - // Remove process from list if we have exited - if si.State == StateExit { - ctr.client.deleteContainer(ctr.containerID) - } - } - - if err := process.hcsProcess.Close(); err != nil { - logrus.Errorf("libcontainerd: hcsProcess.Close(): %v", err) - } - - // Unlock here before we call back into the daemon to update state - ctr.client.unlock(ctr.containerID) - - // Call into the backend to notify it of the state change. - logrus.Debugf("libcontainerd: waitExit() calling backend.StateChanged %+v", si) - if err := ctr.client.backend.StateChanged(ctr.containerID, si); err != nil { - logrus.Error(err) - } - - logrus.Debugf("libcontainerd: waitExit() completed OK, %+v", si) - - return nil -} - -// cleanProcess removes process from the map. -// Caller needs to lock container ID before calling this method. -func (ctr *container) cleanProcess(id string) { - delete(ctr.processes, id) -} - -// shutdown shuts down the container in HCS -// Caller needs to lock container ID before calling this method. -func (ctr *container) shutdown() error { - const shutdownTimeout = time.Minute * 5 - err := ctr.hcsContainer.Shutdown() - if hcsshim.IsPending(err) { - // Explicit timeout to avoid a (remote) possibility that shutdown hangs indefinitely. - err = ctr.hcsContainer.WaitTimeout(shutdownTimeout) - } else if hcsshim.IsAlreadyStopped(err) { - err = nil - } - - if err != nil { - logrus.Debugf("libcontainerd: error shutting down container %s %v calling terminate", ctr.containerID, err) - if err := ctr.terminate(); err != nil { - return err - } - return err - } - - return nil -} - -// terminate terminates the container in HCS -// Caller needs to lock container ID before calling this method. -func (ctr *container) terminate() error { - const terminateTimeout = time.Minute * 5 - err := ctr.hcsContainer.Terminate() - - if hcsshim.IsPending(err) { - err = ctr.hcsContainer.WaitTimeout(terminateTimeout) - } else if hcsshim.IsAlreadyStopped(err) { - err = nil - } - - if err != nil { - logrus.Debugf("libcontainerd: error terminating container %s %v", ctr.containerID, err) - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/libcontainerd/oom_linux.go b/vendor/github.com/docker/docker/libcontainerd/oom_linux.go deleted file mode 100644 index e126b7a55..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/oom_linux.go +++ /dev/null @@ -1,31 +0,0 @@ -package libcontainerd - -import ( - "fmt" - "os" - "strconv" - - "github.com/Sirupsen/logrus" - "github.com/opencontainers/runc/libcontainer/system" -) - -func setOOMScore(pid, score int) error { - oomScoreAdjPath := fmt.Sprintf("/proc/%d/oom_score_adj", pid) - f, err := os.OpenFile(oomScoreAdjPath, os.O_WRONLY, 0) - if err != nil { - return err - } - stringScore := strconv.Itoa(score) - _, err = f.WriteString(stringScore) - f.Close() - if os.IsPermission(err) { - // Setting oom_score_adj does not work in an - // unprivileged container. Ignore the error, but log - // it if we appear not to be in that situation. - if !system.RunningInUserNS() { - logrus.Debugf("Permission denied writing %q to %s", stringScore, oomScoreAdjPath) - } - return nil - } - return err -} diff --git a/vendor/github.com/docker/docker/libcontainerd/oom_solaris.go b/vendor/github.com/docker/docker/libcontainerd/oom_solaris.go deleted file mode 100644 index 2ebe5e87c..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/oom_solaris.go +++ /dev/null @@ -1,5 +0,0 @@ -package libcontainerd - -func setOOMScore(pid, score int) error { - return nil -} diff --git a/vendor/github.com/docker/docker/libcontainerd/pausemonitor_unix.go b/vendor/github.com/docker/docker/libcontainerd/pausemonitor_unix.go deleted file mode 100644 index 4f3766d95..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/pausemonitor_unix.go +++ /dev/null @@ -1,42 +0,0 @@ -// +build !windows - -package libcontainerd - -import ( - "sync" -) - -// pauseMonitor is helper to get notifications from pause state changes. -type pauseMonitor struct { - sync.Mutex - waiters map[string][]chan struct{} -} - -func (m *pauseMonitor) handle(t string) { - m.Lock() - defer m.Unlock() - if m.waiters == nil { - return - } - q, ok := m.waiters[t] - if !ok { - return - } - if len(q) > 0 { - close(q[0]) - m.waiters[t] = q[1:] - } -} - -func (m *pauseMonitor) append(t string, waiter chan struct{}) { - m.Lock() - defer m.Unlock() - if m.waiters == nil { - m.waiters = make(map[string][]chan struct{}) - } - _, ok := m.waiters[t] - if !ok { - m.waiters[t] = make([]chan struct{}, 0) - } - m.waiters[t] = append(m.waiters[t], waiter) -} diff --git a/vendor/github.com/docker/docker/libcontainerd/process.go b/vendor/github.com/docker/docker/libcontainerd/process.go deleted file mode 100644 index 57562c878..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/process.go +++ /dev/null @@ -1,18 +0,0 @@ -package libcontainerd - -// processCommon are the platform common fields as part of the process structure -// which keeps the state for the main container process, as well as any exec -// processes. -type processCommon struct { - client *client - - // containerID is the Container ID - containerID string - - // friendlyName is an identifier for the process (or `InitFriendlyName` - // for the first process) - friendlyName string - - // systemPid is the PID of the main container process - systemPid uint32 -} diff --git a/vendor/github.com/docker/docker/libcontainerd/process_unix.go b/vendor/github.com/docker/docker/libcontainerd/process_unix.go deleted file mode 100644 index 506fca6e1..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/process_unix.go +++ /dev/null @@ -1,107 +0,0 @@ -// +build linux solaris - -package libcontainerd - -import ( - "io" - "io/ioutil" - "os" - "path/filepath" - goruntime "runtime" - "strings" - - containerd "github.com/docker/containerd/api/grpc/types" - "github.com/tonistiigi/fifo" - "golang.org/x/net/context" - "golang.org/x/sys/unix" -) - -var fdNames = map[int]string{ - unix.Stdin: "stdin", - unix.Stdout: "stdout", - unix.Stderr: "stderr", -} - -// process keeps the state for both main container process and exec process. -type process struct { - processCommon - - // Platform specific fields are below here. - dir string -} - -func (p *process) openFifos(ctx context.Context, terminal bool) (pipe *IOPipe, err error) { - if err := os.MkdirAll(p.dir, 0700); err != nil { - return nil, err - } - - io := &IOPipe{} - - io.Stdin, err = fifo.OpenFifo(ctx, p.fifo(unix.Stdin), unix.O_WRONLY|unix.O_CREAT|unix.O_NONBLOCK, 0700) - if err != nil { - return nil, err - } - - defer func() { - if err != nil { - io.Stdin.Close() - } - }() - - io.Stdout, err = fifo.OpenFifo(ctx, p.fifo(unix.Stdout), unix.O_RDONLY|unix.O_CREAT|unix.O_NONBLOCK, 0700) - if err != nil { - return nil, err - } - - defer func() { - if err != nil { - io.Stdout.Close() - } - }() - - if goruntime.GOOS == "solaris" || !terminal { - // For Solaris terminal handling is done exclusively by the runtime therefore we make no distinction - // in the processing for terminal and !terminal cases. - io.Stderr, err = fifo.OpenFifo(ctx, p.fifo(unix.Stderr), unix.O_RDONLY|unix.O_CREAT|unix.O_NONBLOCK, 0700) - if err != nil { - return nil, err - } - defer func() { - if err != nil { - io.Stderr.Close() - } - }() - } else { - io.Stderr = ioutil.NopCloser(emptyReader{}) - } - - return io, nil -} - -func (p *process) sendCloseStdin() error { - _, err := p.client.remote.apiClient.UpdateProcess(context.Background(), &containerd.UpdateProcessRequest{ - Id: p.containerID, - Pid: p.friendlyName, - CloseStdin: true, - }) - if err != nil && (strings.Contains(err.Error(), "container not found") || strings.Contains(err.Error(), "process not found")) { - return nil - } - return err -} - -func (p *process) closeFifos(io *IOPipe) { - io.Stdin.Close() - io.Stdout.Close() - io.Stderr.Close() -} - -type emptyReader struct{} - -func (r emptyReader) Read(b []byte) (int, error) { - return 0, io.EOF -} - -func (p *process) fifo(index int) string { - return filepath.Join(p.dir, p.friendlyName+"-"+fdNames[index]) -} diff --git a/vendor/github.com/docker/docker/libcontainerd/process_windows.go b/vendor/github.com/docker/docker/libcontainerd/process_windows.go deleted file mode 100644 index 57ecc948d..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/process_windows.go +++ /dev/null @@ -1,51 +0,0 @@ -package libcontainerd - -import ( - "io" - "sync" - - "github.com/Microsoft/hcsshim" - "github.com/docker/docker/pkg/ioutils" -) - -// process keeps the state for both main container process and exec process. -type process struct { - processCommon - - // Platform specific fields are below here. - - // commandLine is to support returning summary information for docker top - commandLine string - hcsProcess hcsshim.Process -} - -type autoClosingReader struct { - io.ReadCloser - sync.Once -} - -func (r *autoClosingReader) Read(b []byte) (n int, err error) { - n, err = r.ReadCloser.Read(b) - if err == io.EOF { - r.Once.Do(func() { r.ReadCloser.Close() }) - } - return -} - -func createStdInCloser(pipe io.WriteCloser, process hcsshim.Process) io.WriteCloser { - return ioutils.NewWriteCloserWrapper(pipe, func() error { - if err := pipe.Close(); err != nil { - return err - } - - err := process.CloseStdin() - if err != nil && !hcsshim.IsNotExist(err) && !hcsshim.IsAlreadyClosed(err) { - // This error will occur if the compute system is currently shutting down - if perr, ok := err.(*hcsshim.ProcessError); ok && perr.Err != hcsshim.ErrVmcomputeOperationInvalidState { - return err - } - } - - return nil - }) -} diff --git a/vendor/github.com/docker/docker/libcontainerd/queue_unix.go b/vendor/github.com/docker/docker/libcontainerd/queue_unix.go deleted file mode 100644 index b848b9872..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/queue_unix.go +++ /dev/null @@ -1,31 +0,0 @@ -// +build linux solaris - -package libcontainerd - -import "sync" - -type queue struct { - sync.Mutex - fns map[string]chan struct{} -} - -func (q *queue) append(id string, f func()) { - q.Lock() - defer q.Unlock() - - if q.fns == nil { - q.fns = make(map[string]chan struct{}) - } - - done := make(chan struct{}) - - fn, ok := q.fns[id] - q.fns[id] = done - go func() { - if ok { - <-fn - } - f() - close(done) - }() -} diff --git a/vendor/github.com/docker/docker/libcontainerd/remote.go b/vendor/github.com/docker/docker/libcontainerd/remote.go deleted file mode 100644 index 9031e3ae7..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/remote.go +++ /dev/null @@ -1,20 +0,0 @@ -package libcontainerd - -// Remote on Linux defines the accesspoint to the containerd grpc API. -// Remote on Windows is largely an unimplemented interface as there is -// no remote containerd. -type Remote interface { - // Client returns a new Client instance connected with given Backend. - Client(Backend) (Client, error) - // Cleanup stops containerd if it was started by libcontainerd. - // Note this is not used on Windows as there is no remote containerd. - Cleanup() - // UpdateOptions allows various remote options to be updated at runtime. - UpdateOptions(...RemoteOption) error -} - -// RemoteOption allows to configure parameters of remotes. -// This is unused on Windows. -type RemoteOption interface { - Apply(Remote) error -} diff --git a/vendor/github.com/docker/docker/libcontainerd/remote_unix.go b/vendor/github.com/docker/docker/libcontainerd/remote_unix.go deleted file mode 100644 index 64a28646b..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/remote_unix.go +++ /dev/null @@ -1,544 +0,0 @@ -// +build linux solaris - -package libcontainerd - -import ( - "fmt" - "io" - "io/ioutil" - "log" - "net" - "os" - "os/exec" - "path/filepath" - goruntime "runtime" - "strconv" - "strings" - "sync" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - containerd "github.com/docker/containerd/api/grpc/types" - "github.com/docker/docker/pkg/locker" - sysinfo "github.com/docker/docker/pkg/system" - "github.com/docker/docker/utils" - "github.com/golang/protobuf/ptypes" - "github.com/golang/protobuf/ptypes/timestamp" - "golang.org/x/net/context" - "google.golang.org/grpc" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/health/grpc_health_v1" - "google.golang.org/grpc/transport" -) - -const ( - maxConnectionRetryCount = 3 - containerdHealthCheckTimeout = 3 * time.Second - containerdShutdownTimeout = 15 * time.Second - containerdBinary = "docker-containerd" - containerdPidFilename = "docker-containerd.pid" - containerdSockFilename = "docker-containerd.sock" - containerdStateDir = "containerd" - eventTimestampFilename = "event.ts" -) - -type remote struct { - sync.RWMutex - apiClient containerd.APIClient - daemonPid int - stateDir string - rpcAddr string - startDaemon bool - closeManually bool - debugLog bool - rpcConn *grpc.ClientConn - clients []*client - eventTsPath string - runtime string - runtimeArgs []string - daemonWaitCh chan struct{} - liveRestore bool - oomScore int - restoreFromTimestamp *timestamp.Timestamp -} - -// New creates a fresh instance of libcontainerd remote. -func New(stateDir string, options ...RemoteOption) (_ Remote, err error) { - defer func() { - if err != nil { - err = fmt.Errorf("Failed to connect to containerd. Please make sure containerd is installed in your PATH or you have specified the correct address. Got error: %v", err) - } - }() - r := &remote{ - stateDir: stateDir, - daemonPid: -1, - eventTsPath: filepath.Join(stateDir, eventTimestampFilename), - } - for _, option := range options { - if err := option.Apply(r); err != nil { - return nil, err - } - } - - if err := sysinfo.MkdirAll(stateDir, 0700); err != nil { - return nil, err - } - - if r.rpcAddr == "" { - r.rpcAddr = filepath.Join(stateDir, containerdSockFilename) - } - - if r.startDaemon { - if err := r.runContainerdDaemon(); err != nil { - return nil, err - } - } - - // don't output the grpc reconnect logging - grpclog.SetLogger(log.New(ioutil.Discard, "", log.LstdFlags)) - dialOpts := append([]grpc.DialOption{grpc.WithInsecure()}, - grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { - return net.DialTimeout("unix", addr, timeout) - }), - ) - conn, err := grpc.Dial(r.rpcAddr, dialOpts...) - if err != nil { - return nil, fmt.Errorf("error connecting to containerd: %v", err) - } - - r.rpcConn = conn - r.apiClient = containerd.NewAPIClient(conn) - - // Get the timestamp to restore from - t := r.getLastEventTimestamp() - tsp, err := ptypes.TimestampProto(t) - if err != nil { - logrus.Errorf("libcontainerd: failed to convert timestamp: %q", err) - } - r.restoreFromTimestamp = tsp - - go r.handleConnectionChange() - - if err := r.startEventsMonitor(); err != nil { - return nil, err - } - - return r, nil -} - -func (r *remote) UpdateOptions(options ...RemoteOption) error { - for _, option := range options { - if err := option.Apply(r); err != nil { - return err - } - } - return nil -} - -func (r *remote) handleConnectionChange() { - var transientFailureCount = 0 - - ticker := time.NewTicker(500 * time.Millisecond) - defer ticker.Stop() - healthClient := grpc_health_v1.NewHealthClient(r.rpcConn) - - for { - <-ticker.C - ctx, cancel := context.WithTimeout(context.Background(), containerdHealthCheckTimeout) - _, err := healthClient.Check(ctx, &grpc_health_v1.HealthCheckRequest{}) - cancel() - if err == nil { - continue - } - - logrus.Debugf("libcontainerd: containerd health check returned error: %v", err) - - if r.daemonPid != -1 { - if strings.Contains(err.Error(), "is closing") { - // Well, we asked for it to stop, just return - return - } - // all other errors are transient - // Reset state to be notified of next failure - transientFailureCount++ - if transientFailureCount >= maxConnectionRetryCount { - transientFailureCount = 0 - if utils.IsProcessAlive(r.daemonPid) { - utils.KillProcess(r.daemonPid) - } - <-r.daemonWaitCh - if err := r.runContainerdDaemon(); err != nil { //FIXME: Handle error - logrus.Errorf("libcontainerd: error restarting containerd: %v", err) - } - continue - } - } - } -} - -func (r *remote) Cleanup() { - if r.daemonPid == -1 { - return - } - r.closeManually = true - r.rpcConn.Close() - // Ask the daemon to quit - syscall.Kill(r.daemonPid, syscall.SIGTERM) - - // Wait up to 15secs for it to stop - for i := time.Duration(0); i < containerdShutdownTimeout; i += time.Second { - if !utils.IsProcessAlive(r.daemonPid) { - break - } - time.Sleep(time.Second) - } - - if utils.IsProcessAlive(r.daemonPid) { - logrus.Warnf("libcontainerd: containerd (%d) didn't stop within 15 secs, killing it\n", r.daemonPid) - syscall.Kill(r.daemonPid, syscall.SIGKILL) - } - - // cleanup some files - os.Remove(filepath.Join(r.stateDir, containerdPidFilename)) - os.Remove(filepath.Join(r.stateDir, containerdSockFilename)) -} - -func (r *remote) Client(b Backend) (Client, error) { - c := &client{ - clientCommon: clientCommon{ - backend: b, - containers: make(map[string]*container), - locker: locker.New(), - }, - remote: r, - exitNotifiers: make(map[string]*exitNotifier), - liveRestore: r.liveRestore, - } - - r.Lock() - r.clients = append(r.clients, c) - r.Unlock() - return c, nil -} - -func (r *remote) updateEventTimestamp(t time.Time) { - f, err := os.OpenFile(r.eventTsPath, syscall.O_CREAT|syscall.O_WRONLY|syscall.O_TRUNC, 0600) - if err != nil { - logrus.Warnf("libcontainerd: failed to open event timestamp file: %v", err) - return - } - defer f.Close() - - b, err := t.MarshalText() - if err != nil { - logrus.Warnf("libcontainerd: failed to encode timestamp: %v", err) - return - } - - n, err := f.Write(b) - if err != nil || n != len(b) { - logrus.Warnf("libcontainerd: failed to update event timestamp file: %v", err) - f.Truncate(0) - return - } -} - -func (r *remote) getLastEventTimestamp() time.Time { - t := time.Now() - - fi, err := os.Stat(r.eventTsPath) - if os.IsNotExist(err) || fi.Size() == 0 { - return t - } - - f, err := os.Open(r.eventTsPath) - if err != nil { - logrus.Warnf("libcontainerd: Unable to access last event ts: %v", err) - return t - } - defer f.Close() - - b := make([]byte, fi.Size()) - n, err := f.Read(b) - if err != nil || n != len(b) { - logrus.Warnf("libcontainerd: Unable to read last event ts: %v", err) - return t - } - - t.UnmarshalText(b) - - return t -} - -func (r *remote) startEventsMonitor() error { - // First, get past events - t := r.getLastEventTimestamp() - tsp, err := ptypes.TimestampProto(t) - if err != nil { - logrus.Errorf("libcontainerd: failed to convert timestamp: %q", err) - } - er := &containerd.EventsRequest{ - Timestamp: tsp, - } - events, err := r.apiClient.Events(context.Background(), er, grpc.FailFast(false)) - if err != nil { - return err - } - go r.handleEventStream(events) - return nil -} - -func (r *remote) handleEventStream(events containerd.API_EventsClient) { - for { - e, err := events.Recv() - if err != nil { - if grpc.ErrorDesc(err) == transport.ErrConnClosing.Desc && - r.closeManually { - // ignore error if grpc remote connection is closed manually - return - } - logrus.Errorf("libcontainerd: failed to receive event from containerd: %v", err) - go r.startEventsMonitor() - return - } - - logrus.Debugf("libcontainerd: received containerd event: %#v", e) - - var container *container - var c *client - r.RLock() - for _, c = range r.clients { - container, err = c.getContainer(e.Id) - if err == nil { - break - } - } - r.RUnlock() - if container == nil { - logrus.Warnf("libcontainerd: unknown container %s", e.Id) - continue - } - - if err := container.handleEvent(e); err != nil { - logrus.Errorf("libcontainerd: error processing state change for %s: %v", e.Id, err) - } - - tsp, err := ptypes.Timestamp(e.Timestamp) - if err != nil { - logrus.Errorf("libcontainerd: failed to convert event timestamp: %q", err) - continue - } - - r.updateEventTimestamp(tsp) - } -} - -func (r *remote) runContainerdDaemon() error { - pidFilename := filepath.Join(r.stateDir, containerdPidFilename) - f, err := os.OpenFile(pidFilename, os.O_RDWR|os.O_CREATE, 0600) - if err != nil { - return err - } - defer f.Close() - - // File exist, check if the daemon is alive - b := make([]byte, 8) - n, err := f.Read(b) - if err != nil && err != io.EOF { - return err - } - - if n > 0 { - pid, err := strconv.ParseUint(string(b[:n]), 10, 64) - if err != nil { - return err - } - if utils.IsProcessAlive(int(pid)) { - logrus.Infof("libcontainerd: previous instance of containerd still alive (%d)", pid) - r.daemonPid = int(pid) - return nil - } - } - - // rewind the file - _, err = f.Seek(0, os.SEEK_SET) - if err != nil { - return err - } - - // Truncate it - err = f.Truncate(0) - if err != nil { - return err - } - - // Start a new instance - args := []string{ - "-l", fmt.Sprintf("unix://%s", r.rpcAddr), - "--metrics-interval=0", - "--start-timeout", "2m", - "--state-dir", filepath.Join(r.stateDir, containerdStateDir), - } - if goruntime.GOOS == "solaris" { - args = append(args, "--shim", "containerd-shim", "--runtime", "runc") - } else { - args = append(args, "--shim", "docker-containerd-shim") - if r.runtime != "" { - args = append(args, "--runtime") - args = append(args, r.runtime) - } - } - if r.debugLog { - args = append(args, "--debug") - } - if len(r.runtimeArgs) > 0 { - for _, v := range r.runtimeArgs { - args = append(args, "--runtime-args") - args = append(args, v) - } - logrus.Debugf("libcontainerd: runContainerdDaemon: runtimeArgs: %s", args) - } - - cmd := exec.Command(containerdBinary, args...) - // redirect containerd logs to docker logs - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.SysProcAttr = setSysProcAttr(true) - cmd.Env = nil - // clear the NOTIFY_SOCKET from the env when starting containerd - for _, e := range os.Environ() { - if !strings.HasPrefix(e, "NOTIFY_SOCKET") { - cmd.Env = append(cmd.Env, e) - } - } - if err := cmd.Start(); err != nil { - return err - } - logrus.Infof("libcontainerd: new containerd process, pid: %d", cmd.Process.Pid) - if err := setOOMScore(cmd.Process.Pid, r.oomScore); err != nil { - utils.KillProcess(cmd.Process.Pid) - return err - } - if _, err := f.WriteString(fmt.Sprintf("%d", cmd.Process.Pid)); err != nil { - utils.KillProcess(cmd.Process.Pid) - return err - } - - r.daemonWaitCh = make(chan struct{}) - go func() { - cmd.Wait() - close(r.daemonWaitCh) - }() // Reap our child when needed - r.daemonPid = cmd.Process.Pid - return nil -} - -// WithRemoteAddr sets the external containerd socket to connect to. -func WithRemoteAddr(addr string) RemoteOption { - return rpcAddr(addr) -} - -type rpcAddr string - -func (a rpcAddr) Apply(r Remote) error { - if remote, ok := r.(*remote); ok { - remote.rpcAddr = string(a) - return nil - } - return fmt.Errorf("WithRemoteAddr option not supported for this remote") -} - -// WithRuntimePath sets the path of the runtime to be used as the -// default by containerd -func WithRuntimePath(rt string) RemoteOption { - return runtimePath(rt) -} - -type runtimePath string - -func (rt runtimePath) Apply(r Remote) error { - if remote, ok := r.(*remote); ok { - remote.runtime = string(rt) - return nil - } - return fmt.Errorf("WithRuntime option not supported for this remote") -} - -// WithRuntimeArgs sets the list of runtime args passed to containerd -func WithRuntimeArgs(args []string) RemoteOption { - return runtimeArgs(args) -} - -type runtimeArgs []string - -func (rt runtimeArgs) Apply(r Remote) error { - if remote, ok := r.(*remote); ok { - remote.runtimeArgs = rt - return nil - } - return fmt.Errorf("WithRuntimeArgs option not supported for this remote") -} - -// WithStartDaemon defines if libcontainerd should also run containerd daemon. -func WithStartDaemon(start bool) RemoteOption { - return startDaemon(start) -} - -type startDaemon bool - -func (s startDaemon) Apply(r Remote) error { - if remote, ok := r.(*remote); ok { - remote.startDaemon = bool(s) - return nil - } - return fmt.Errorf("WithStartDaemon option not supported for this remote") -} - -// WithDebugLog defines if containerd debug logs will be enabled for daemon. -func WithDebugLog(debug bool) RemoteOption { - return debugLog(debug) -} - -type debugLog bool - -func (d debugLog) Apply(r Remote) error { - if remote, ok := r.(*remote); ok { - remote.debugLog = bool(d) - return nil - } - return fmt.Errorf("WithDebugLog option not supported for this remote") -} - -// WithLiveRestore defines if containers are stopped on shutdown or restored. -func WithLiveRestore(v bool) RemoteOption { - return liveRestore(v) -} - -type liveRestore bool - -func (l liveRestore) Apply(r Remote) error { - if remote, ok := r.(*remote); ok { - remote.liveRestore = bool(l) - for _, c := range remote.clients { - c.liveRestore = bool(l) - } - return nil - } - return fmt.Errorf("WithLiveRestore option not supported for this remote") -} - -// WithOOMScore defines the oom_score_adj to set for the containerd process. -func WithOOMScore(score int) RemoteOption { - return oomScore(score) -} - -type oomScore int - -func (o oomScore) Apply(r Remote) error { - if remote, ok := r.(*remote); ok { - remote.oomScore = int(o) - return nil - } - return fmt.Errorf("WithOOMScore option not supported for this remote") -} diff --git a/vendor/github.com/docker/docker/libcontainerd/remote_windows.go b/vendor/github.com/docker/docker/libcontainerd/remote_windows.go deleted file mode 100644 index 74c10447b..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/remote_windows.go +++ /dev/null @@ -1,36 +0,0 @@ -package libcontainerd - -import "github.com/docker/docker/pkg/locker" - -type remote struct { -} - -func (r *remote) Client(b Backend) (Client, error) { - c := &client{ - clientCommon: clientCommon{ - backend: b, - containers: make(map[string]*container), - locker: locker.New(), - }, - } - return c, nil -} - -// Cleanup is a no-op on Windows. It is here to implement the interface. -func (r *remote) Cleanup() { -} - -func (r *remote) UpdateOptions(opts ...RemoteOption) error { - return nil -} - -// New creates a fresh instance of libcontainerd remote. On Windows, -// this is not used as there is no remote containerd process. -func New(_ string, _ ...RemoteOption) (Remote, error) { - return &remote{}, nil -} - -// WithLiveRestore is a noop on windows. -func WithLiveRestore(v bool) RemoteOption { - return nil -} diff --git a/vendor/github.com/docker/docker/libcontainerd/types.go b/vendor/github.com/docker/docker/libcontainerd/types.go deleted file mode 100644 index 3d981e337..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/types.go +++ /dev/null @@ -1,75 +0,0 @@ -package libcontainerd - -import ( - "io" - - containerd "github.com/docker/containerd/api/grpc/types" - "github.com/opencontainers/runtime-spec/specs-go" - "golang.org/x/net/context" -) - -// State constants used in state change reporting. -const ( - StateStart = "start-container" - StatePause = "pause" - StateResume = "resume" - StateExit = "exit" - StateRestore = "restore" - StateExitProcess = "exit-process" - StateOOM = "oom" // fake state -) - -// CommonStateInfo contains the state info common to all platforms. -type CommonStateInfo struct { // FIXME: event? - State string - Pid uint32 - ExitCode uint32 - ProcessID string -} - -// Backend defines callbacks that the client of the library needs to implement. -type Backend interface { - StateChanged(containerID string, state StateInfo) error -} - -// Client provides access to containerd features. -type Client interface { - GetServerVersion(ctx context.Context) (*ServerVersion, error) - Create(containerID string, checkpoint string, checkpointDir string, spec specs.Spec, attachStdio StdioCallback, options ...CreateOption) error - Signal(containerID string, sig int) error - SignalProcess(containerID string, processFriendlyName string, sig int) error - AddProcess(ctx context.Context, containerID, processFriendlyName string, process Process, attachStdio StdioCallback) (int, error) - Resize(containerID, processFriendlyName string, width, height int) error - Pause(containerID string) error - Resume(containerID string) error - Restore(containerID string, attachStdio StdioCallback, options ...CreateOption) error - Stats(containerID string) (*Stats, error) - GetPidsForContainer(containerID string) ([]int, error) - Summary(containerID string) ([]Summary, error) - UpdateResources(containerID string, resources Resources) error - CreateCheckpoint(containerID string, checkpointID string, checkpointDir string, exit bool) error - DeleteCheckpoint(containerID string, checkpointID string, checkpointDir string) error - ListCheckpoints(containerID string, checkpointDir string) (*Checkpoints, error) -} - -// CreateOption allows to configure parameters of container creation. -type CreateOption interface { - Apply(interface{}) error -} - -// StdioCallback is called to connect a container or process stdio. -type StdioCallback func(IOPipe) error - -// IOPipe contains the stdio streams. -type IOPipe struct { - Stdin io.WriteCloser - Stdout io.ReadCloser - Stderr io.ReadCloser - Terminal bool // Whether stderr is connected on Windows -} - -// ServerVersion contains version information as retrieved from the -// server -type ServerVersion struct { - containerd.GetServerVersionResponse -} diff --git a/vendor/github.com/docker/docker/libcontainerd/types_linux.go b/vendor/github.com/docker/docker/libcontainerd/types_linux.go deleted file mode 100644 index cc2a17aec..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/types_linux.go +++ /dev/null @@ -1,49 +0,0 @@ -package libcontainerd - -import ( - containerd "github.com/docker/containerd/api/grpc/types" - "github.com/opencontainers/runtime-spec/specs-go" -) - -// Process contains information to start a specific application inside the container. -type Process struct { - // Terminal creates an interactive terminal for the container. - Terminal bool `json:"terminal"` - // User specifies user information for the process. - User *specs.User `json:"user"` - // Args specifies the binary and arguments for the application to execute. - Args []string `json:"args"` - // Env populates the process environment for the process. - Env []string `json:"env,omitempty"` - // Cwd is the current working directory for the process and must be - // relative to the container's root. - Cwd *string `json:"cwd"` - // Capabilities are linux capabilities that are kept for the container. - Capabilities []string `json:"capabilities,omitempty"` - // Rlimits specifies rlimit options to apply to the process. - Rlimits []specs.Rlimit `json:"rlimits,omitempty"` - // ApparmorProfile specifies the apparmor profile for the container. - ApparmorProfile *string `json:"apparmorProfile,omitempty"` - // SelinuxLabel specifies the selinux context that the container process is run as. - SelinuxLabel *string `json:"selinuxLabel,omitempty"` -} - -// StateInfo contains description about the new state container has entered. -type StateInfo struct { - CommonStateInfo - - // Platform specific StateInfo - OOMKilled bool -} - -// Stats contains a stats properties from containerd. -type Stats containerd.StatsResponse - -// Summary contains a container summary from containerd -type Summary struct{} - -// Resources defines updatable container resource values. -type Resources containerd.UpdateResource - -// Checkpoints contains the details of a checkpoint -type Checkpoints containerd.ListCheckpointResponse diff --git a/vendor/github.com/docker/docker/libcontainerd/types_solaris.go b/vendor/github.com/docker/docker/libcontainerd/types_solaris.go deleted file mode 100644 index dbafef669..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/types_solaris.go +++ /dev/null @@ -1,43 +0,0 @@ -package libcontainerd - -import ( - containerd "github.com/docker/containerd/api/grpc/types" - "github.com/opencontainers/runtime-spec/specs-go" -) - -// Process contains information to start a specific application inside the container. -type Process struct { - // Terminal creates an interactive terminal for the container. - Terminal bool `json:"terminal"` - // User specifies user information for the process. - User *specs.User `json:"user"` - // Args specifies the binary and arguments for the application to execute. - Args []string `json:"args"` - // Env populates the process environment for the process. - Env []string `json:"env,omitempty"` - // Cwd is the current working directory for the process and must be - // relative to the container's root. - Cwd *string `json:"cwd"` - // Capabilities are linux capabilities that are kept for the container. - Capabilities []string `json:"capabilities,omitempty"` -} - -// Stats contains a stats properties from containerd. -type Stats struct{} - -// Summary contains a container summary from containerd -type Summary struct{} - -// StateInfo contains description about the new state container has entered. -type StateInfo struct { - CommonStateInfo - - // Platform specific StateInfo - OOMKilled bool -} - -// Resources defines updatable container resource values. -type Resources struct{} - -// Checkpoints contains the details of a checkpoint -type Checkpoints containerd.ListCheckpointResponse diff --git a/vendor/github.com/docker/docker/libcontainerd/types_windows.go b/vendor/github.com/docker/docker/libcontainerd/types_windows.go deleted file mode 100644 index 24a9a9644..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/types_windows.go +++ /dev/null @@ -1,79 +0,0 @@ -package libcontainerd - -import ( - "github.com/Microsoft/hcsshim" - "github.com/opencontainers/runtime-spec/specs-go" -) - -// Process contains information to start a specific application inside the container. -type Process specs.Process - -// Summary contains a ProcessList item from HCS to support `top` -type Summary hcsshim.ProcessListItem - -// StateInfo contains description about the new state container has entered. -type StateInfo struct { - CommonStateInfo - - // Platform specific StateInfo - - UpdatePending bool // Indicates that there are some update operations pending that should be completed by a servicing container. -} - -// Stats contains statics from HCS -type Stats hcsshim.Statistics - -// Resources defines updatable container resource values. -type Resources struct{} - -// ServicingOption is a CreateOption with a no-op application that signifies -// the container needs to be used for a Windows servicing operation. -type ServicingOption struct { - IsServicing bool -} - -// FlushOption is a CreateOption that signifies if the container should be -// started with flushes ignored until boot has completed. This is an optimisation -// for first boot of a container. -type FlushOption struct { - IgnoreFlushesDuringBoot bool -} - -// HyperVIsolationOption is a CreateOption that indicates whether the runtime -// should start the container as a Hyper-V container, and if so, the sandbox path. -type HyperVIsolationOption struct { - IsHyperV bool - SandboxPath string `json:",omitempty"` -} - -// LayerOption is a CreateOption that indicates to the runtime the layer folder -// and layer paths for a container. -type LayerOption struct { - // LayerFolder is the path to the current layer folder. Empty for Hyper-V containers. - LayerFolderPath string `json:",omitempty"` - // Layer paths of the parent layers - LayerPaths []string -} - -// NetworkEndpointsOption is a CreateOption that provides the runtime list -// of network endpoints to which a container should be attached during its creation. -type NetworkEndpointsOption struct { - Endpoints []string - AllowUnqualifiedDNSQuery bool -} - -// CredentialsOption is a CreateOption that indicates the credentials from -// a credential spec to be used to the runtime -type CredentialsOption struct { - Credentials string -} - -// Checkpoint holds the details of a checkpoint (not supported in windows) -type Checkpoint struct { - Name string -} - -// Checkpoints contains the details of a checkpoint -type Checkpoints struct { - Checkpoints []*Checkpoint -} diff --git a/vendor/github.com/docker/docker/libcontainerd/utils_linux.go b/vendor/github.com/docker/docker/libcontainerd/utils_linux.go deleted file mode 100644 index 78828bcda..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/utils_linux.go +++ /dev/null @@ -1,62 +0,0 @@ -package libcontainerd - -import ( - "syscall" - - containerd "github.com/docker/containerd/api/grpc/types" - "github.com/opencontainers/runtime-spec/specs-go" -) - -func getRootIDs(s specs.Spec) (int, int, error) { - var hasUserns bool - for _, ns := range s.Linux.Namespaces { - if ns.Type == specs.UserNamespace { - hasUserns = true - break - } - } - if !hasUserns { - return 0, 0, nil - } - uid := hostIDFromMap(0, s.Linux.UIDMappings) - gid := hostIDFromMap(0, s.Linux.GIDMappings) - return uid, gid, nil -} - -func hostIDFromMap(id uint32, mp []specs.IDMapping) int { - for _, m := range mp { - if id >= m.ContainerID && id <= m.ContainerID+m.Size-1 { - return int(m.HostID + id - m.ContainerID) - } - } - return 0 -} - -func systemPid(ctr *containerd.Container) uint32 { - var pid uint32 - for _, p := range ctr.Processes { - if p.Pid == InitFriendlyName { - pid = p.SystemPid - } - } - return pid -} - -func convertRlimits(sr []specs.Rlimit) (cr []*containerd.Rlimit) { - for _, r := range sr { - cr = append(cr, &containerd.Rlimit{ - Type: r.Type, - Hard: r.Hard, - Soft: r.Soft, - }) - } - return -} - -// setPDeathSig sets the parent death signal to SIGKILL -func setSysProcAttr(sid bool) *syscall.SysProcAttr { - return &syscall.SysProcAttr{ - Setsid: sid, - Pdeathsig: syscall.SIGKILL, - } -} diff --git a/vendor/github.com/docker/docker/libcontainerd/utils_solaris.go b/vendor/github.com/docker/docker/libcontainerd/utils_solaris.go deleted file mode 100644 index 49632b45e..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/utils_solaris.go +++ /dev/null @@ -1,27 +0,0 @@ -package libcontainerd - -import ( - "syscall" - - containerd "github.com/docker/containerd/api/grpc/types" - "github.com/opencontainers/runtime-spec/specs-go" -) - -func getRootIDs(s specs.Spec) (int, int, error) { - return 0, 0, nil -} - -func systemPid(ctr *containerd.Container) uint32 { - var pid uint32 - for _, p := range ctr.Processes { - if p.Pid == InitFriendlyName { - pid = p.SystemPid - } - } - return pid -} - -// setPDeathSig sets the parent death signal to SIGKILL -func setSysProcAttr(sid bool) *syscall.SysProcAttr { - return nil -} diff --git a/vendor/github.com/docker/docker/libcontainerd/utils_windows.go b/vendor/github.com/docker/docker/libcontainerd/utils_windows.go deleted file mode 100644 index 41ac40d2c..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/utils_windows.go +++ /dev/null @@ -1,46 +0,0 @@ -package libcontainerd - -import "strings" - -// setupEnvironmentVariables converts a string array of environment variables -// into a map as required by the HCS. Source array is in format [v1=k1] [v2=k2] etc. -func setupEnvironmentVariables(a []string) map[string]string { - r := make(map[string]string) - for _, s := range a { - arr := strings.SplitN(s, "=", 2) - if len(arr) == 2 { - r[arr[0]] = arr[1] - } - } - return r -} - -// Apply for a servicing option is a no-op. -func (s *ServicingOption) Apply(interface{}) error { - return nil -} - -// Apply for the flush option is a no-op. -func (f *FlushOption) Apply(interface{}) error { - return nil -} - -// Apply for the hypervisolation option is a no-op. -func (h *HyperVIsolationOption) Apply(interface{}) error { - return nil -} - -// Apply for the layer option is a no-op. -func (h *LayerOption) Apply(interface{}) error { - return nil -} - -// Apply for the network endpoints option is a no-op. -func (s *NetworkEndpointsOption) Apply(interface{}) error { - return nil -} - -// Apply for the credentials option is a no-op. -func (s *CredentialsOption) Apply(interface{}) error { - return nil -} diff --git a/vendor/github.com/docker/docker/libcontainerd/utils_windows_test.go b/vendor/github.com/docker/docker/libcontainerd/utils_windows_test.go deleted file mode 100644 index f3679bfb7..000000000 --- a/vendor/github.com/docker/docker/libcontainerd/utils_windows_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package libcontainerd - -import ( - "testing" -) - -func TestEnvironmentParsing(t *testing.T) { - env := []string{"foo=bar", "car=hat", "a=b=c"} - result := setupEnvironmentVariables(env) - if len(result) != 3 || result["foo"] != "bar" || result["car"] != "hat" || result["a"] != "b=c" { - t.Fatalf("Expected map[foo:bar car:hat a:b=c], got %v", result) - } -} diff --git a/vendor/github.com/docker/docker/man/Dockerfile b/vendor/github.com/docker/docker/man/Dockerfile deleted file mode 100644 index 80e97ff01..000000000 --- a/vendor/github.com/docker/docker/man/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM golang:1.7.5-alpine - -RUN apk add -U git bash curl gcc musl-dev make - -RUN mkdir -p /go/src /go/bin /go/pkg -RUN export GLIDE=v0.11.1; \ - export TARGET=/go/src/github.com/Masterminds; \ - mkdir -p ${TARGET} && \ - git clone https://github.com/Masterminds/glide.git ${TARGET}/glide && \ - cd ${TARGET}/glide && \ - git checkout $GLIDE && \ - make build && \ - cp ./glide /usr/bin/glide && \ - cd / && rm -rf /go/src/* /go/bin/* /go/pkg/* - -COPY glide.yaml /manvendor/ -COPY glide.lock /manvendor/ -WORKDIR /manvendor/ -RUN glide install && mv vendor src -ENV GOPATH=$GOPATH:/manvendor -RUN go build -o /usr/bin/go-md2man github.com/cpuguy83/go-md2man - -WORKDIR /go/src/github.com/docker/docker/ -ENTRYPOINT ["man/generate.sh"] diff --git a/vendor/github.com/docker/docker/man/Dockerfile.5.md b/vendor/github.com/docker/docker/man/Dockerfile.5.md deleted file mode 100644 index 5191b1930..000000000 --- a/vendor/github.com/docker/docker/man/Dockerfile.5.md +++ /dev/null @@ -1,474 +0,0 @@ -% DOCKERFILE(5) Docker User Manuals -% Zac Dover -% May 2014 -# NAME - -Dockerfile - automate the steps of creating a Docker image - -# INTRODUCTION - -The **Dockerfile** is a configuration file that automates the steps of creating -a Docker image. It is similar to a Makefile. Docker reads instructions from the -**Dockerfile** to automate the steps otherwise performed manually to create an -image. To build an image, create a file called **Dockerfile**. - -The **Dockerfile** describes the steps taken to assemble the image. When the -**Dockerfile** has been created, call the `docker build` command, using the -path of directory that contains **Dockerfile** as the argument. - -# SYNOPSIS - -INSTRUCTION arguments - -For example: - - FROM image - -# DESCRIPTION - -A Dockerfile is a file that automates the steps of creating a Docker image. -A Dockerfile is similar to a Makefile. - -# USAGE - - docker build . - - -- Runs the steps and commits them, building a final image. - The path to the source repository defines where to find the context of the - build. The build is run by the Docker daemon, not the CLI. The whole - context must be transferred to the daemon. The Docker CLI reports - `"Sending build context to Docker daemon"` when the context is sent to the - daemon. - - ``` - docker build -t repository/tag . - ``` - - -- specifies a repository and tag at which to save the new image if the build - succeeds. The Docker daemon runs the steps one-by-one, committing the result - to a new image if necessary, before finally outputting the ID of the new - image. The Docker daemon automatically cleans up the context it is given. - - Docker re-uses intermediate images whenever possible. This significantly - accelerates the *docker build* process. - -# FORMAT - - `FROM image` - - `FROM image:tag` - - `FROM image@digest` - - -- The **FROM** instruction sets the base image for subsequent instructions. A - valid Dockerfile must have **FROM** as its first instruction. The image can be any - valid image. It is easy to start by pulling an image from the public - repositories. - - -- **FROM** must be the first non-comment instruction in Dockerfile. - - -- **FROM** may appear multiple times within a single Dockerfile in order to create - multiple images. Make a note of the last image ID output by the commit before - each new **FROM** command. - - -- If no tag is given to the **FROM** instruction, Docker applies the - `latest` tag. If the used tag does not exist, an error is returned. - - -- If no digest is given to the **FROM** instruction, Docker applies the - `latest` tag. If the used tag does not exist, an error is returned. - -**MAINTAINER** - -- **MAINTAINER** sets the Author field for the generated images. - Useful for providing users with an email or url for support. - -**RUN** - -- **RUN** has two forms: - - ``` - # the command is run in a shell - /bin/sh -c - RUN - - # Executable form - RUN ["executable", "param1", "param2"] - ``` - - - -- The **RUN** instruction executes any commands in a new layer on top of the current - image and commits the results. The committed image is used for the next step in - Dockerfile. - - -- Layering **RUN** instructions and generating commits conforms to the core - concepts of Docker where commits are cheap and containers can be created from - any point in the history of an image. This is similar to source control. The - exec form makes it possible to avoid shell string munging. The exec form makes - it possible to **RUN** commands using a base image that does not contain `/bin/sh`. - - Note that the exec form is parsed as a JSON array, which means that you must - use double-quotes (") around words not single-quotes ('). - -**CMD** - -- **CMD** has three forms: - - ``` - # Executable form - CMD ["executable", "param1", "param2"]` - - # Provide default arguments to ENTRYPOINT - CMD ["param1", "param2"]` - - # the command is run in a shell - /bin/sh -c - CMD command param1 param2 - ``` - - -- There should be only one **CMD** in a Dockerfile. If more than one **CMD** is listed, only - the last **CMD** takes effect. - The main purpose of a **CMD** is to provide defaults for an executing container. - These defaults may include an executable, or they can omit the executable. If - they omit the executable, an **ENTRYPOINT** must be specified. - When used in the shell or exec formats, the **CMD** instruction sets the command to - be executed when running the image. - If you use the shell form of the **CMD**, the `` executes in `/bin/sh -c`: - - Note that the exec form is parsed as a JSON array, which means that you must - use double-quotes (") around words not single-quotes ('). - - ``` - FROM ubuntu - CMD echo "This is a test." | wc - - ``` - - -- If you run **command** without a shell, then you must express the command as a - JSON array and give the full path to the executable. This array form is the - preferred form of **CMD**. All additional parameters must be individually expressed - as strings in the array: - - ``` - FROM ubuntu - CMD ["/usr/bin/wc","--help"] - ``` - - -- To make the container run the same executable every time, use **ENTRYPOINT** in - combination with **CMD**. - If the user specifies arguments to `docker run`, the specified commands - override the default in **CMD**. - Do not confuse **RUN** with **CMD**. **RUN** runs a command and commits the result. - **CMD** executes nothing at build time, but specifies the intended command for - the image. - -**LABEL** - -- `LABEL = [= ...]`or - ``` - LABEL [ ] - LABEL [ ] - ... - ``` - The **LABEL** instruction adds metadata to an image. A **LABEL** is a - key-value pair. To specify a **LABEL** without a value, simply use an empty - string. To include spaces within a **LABEL** value, use quotes and - backslashes as you would in command-line parsing. - - ``` - LABEL com.example.vendor="ACME Incorporated" - LABEL com.example.vendor "ACME Incorporated" - LABEL com.example.vendor.is-beta "" - LABEL com.example.vendor.is-beta= - LABEL com.example.vendor.is-beta="" - ``` - - An image can have more than one label. To specify multiple labels, separate - each key-value pair by a space. - - Labels are additive including `LABEL`s in `FROM` images. As the system - encounters and then applies a new label, new `key`s override any previous - labels with identical keys. - - To display an image's labels, use the `docker inspect` command. - -**EXPOSE** - -- `EXPOSE [...]` - The **EXPOSE** instruction informs Docker that the container listens on the - specified network ports at runtime. Docker uses this information to - interconnect containers using links and to set up port redirection on the host - system. - -**ENV** - -- `ENV ` - The **ENV** instruction sets the environment variable to - the value ``. This value is passed to all future - **RUN**, **ENTRYPOINT**, and **CMD** instructions. This is - functionally equivalent to prefixing the command with `=`. The - environment variables that are set with **ENV** persist when a container is run - from the resulting image. Use `docker inspect` to inspect these values, and - change them using `docker run --env =`. - - Note that setting "`ENV DEBIAN_FRONTEND noninteractive`" may cause - unintended consequences, because it will persist when the container is run - interactively, as with the following command: `docker run -t -i image bash` - -**ADD** - -- **ADD** has two forms: - - ``` - ADD - - # Required for paths with whitespace - ADD ["",... ""] - ``` - - The **ADD** instruction copies new files, directories - or remote file URLs to the filesystem of the container at path ``. - Multiple `` resources may be specified but if they are files or directories - then they must be relative to the source directory that is being built - (the context of the build). The `` is the absolute path, or path relative - to **WORKDIR**, into which the source is copied inside the target container. - If the `` argument is a local file in a recognized compression format - (tar, gzip, bzip2, etc) then it is unpacked at the specified `` in the - container's filesystem. Note that only local compressed files will be unpacked, - i.e., the URL download and archive unpacking features cannot be used together. - All new directories are created with mode 0755 and with the uid and gid of **0**. - -**COPY** - -- **COPY** has two forms: - - ``` - COPY - - # Required for paths with whitespace - COPY ["",... ""] - ``` - - The **COPY** instruction copies new files from `` and - adds them to the filesystem of the container at path . The `` must be - the path to a file or directory relative to the source directory that is - being built (the context of the build) or a remote file URL. The `` is an - absolute path, or a path relative to **WORKDIR**, into which the source will - be copied inside the target container. If you **COPY** an archive file it will - land in the container exactly as it appears in the build context without any - attempt to unpack it. All new files and directories are created with mode **0755** - and with the uid and gid of **0**. - -**ENTRYPOINT** - -- **ENTRYPOINT** has two forms: - - ``` - # executable form - ENTRYPOINT ["executable", "param1", "param2"]` - - # run command in a shell - /bin/sh -c - ENTRYPOINT command param1 param2 - ``` - - -- An **ENTRYPOINT** helps you configure a - container that can be run as an executable. When you specify an **ENTRYPOINT**, - the whole container runs as if it was only that executable. The **ENTRYPOINT** - instruction adds an entry command that is not overwritten when arguments are - passed to docker run. This is different from the behavior of **CMD**. This allows - arguments to be passed to the entrypoint, for instance `docker run -d` - passes the -d argument to the **ENTRYPOINT**. Specify parameters either in the - **ENTRYPOINT** JSON array (as in the preferred exec form above), or by using a **CMD** - statement. Parameters in the **ENTRYPOINT** are not overwritten by the docker run - arguments. Parameters specified via **CMD** are overwritten by docker run - arguments. Specify a plain string for the **ENTRYPOINT**, and it will execute in - `/bin/sh -c`, like a **CMD** instruction: - - ``` - FROM ubuntu - ENTRYPOINT wc -l - - ``` - - This means that the Dockerfile's image always takes stdin as input (that's - what "-" means), and prints the number of lines (that's what "-l" means). To - make this optional but default, use a **CMD**: - - ``` - FROM ubuntu - CMD ["-l", "-"] - ENTRYPOINT ["/usr/bin/wc"] - ``` - -**VOLUME** - -- `VOLUME ["/data"]` - The **VOLUME** instruction creates a mount point with the specified name and marks - it as holding externally-mounted volumes from the native host or from other - containers. - -**USER** - -- `USER daemon` - Sets the username or UID used for running subsequent commands. - - The **USER** instruction can optionally be used to set the group or GID. The - followings examples are all valid: - USER [user | user:group | uid | uid:gid | user:gid | uid:group ] - - Until the **USER** instruction is set, instructions will be run as root. The USER - instruction can be used any number of times in a Dockerfile, and will only affect - subsequent commands. - -**WORKDIR** - -- `WORKDIR /path/to/workdir` - The **WORKDIR** instruction sets the working directory for the **RUN**, **CMD**, - **ENTRYPOINT**, **COPY** and **ADD** Dockerfile commands that follow it. It can - be used multiple times in a single Dockerfile. Relative paths are defined - relative to the path of the previous **WORKDIR** instruction. For example: - - ``` - WORKDIR /a - WORKDIR b - WORKDIR c - RUN pwd - ``` - - In the above example, the output of the **pwd** command is **a/b/c**. - -**ARG** - -- ARG [=] - - The `ARG` instruction defines a variable that users can pass at build-time to - the builder with the `docker build` command using the `--build-arg - =` flag. If a user specifies a build argument that was not - defined in the Dockerfile, the build outputs a warning. - - ``` - [Warning] One or more build-args [foo] were not consumed - ``` - - The Dockerfile author can define a single variable by specifying `ARG` once or many - variables by specifying `ARG` more than once. For example, a valid Dockerfile: - - ``` - FROM busybox - ARG user1 - ARG buildno - ... - ``` - - A Dockerfile author may optionally specify a default value for an `ARG` instruction: - - ``` - FROM busybox - ARG user1=someuser - ARG buildno=1 - ... - ``` - - If an `ARG` value has a default and if there is no value passed at build-time, the - builder uses the default. - - An `ARG` variable definition comes into effect from the line on which it is - defined in the `Dockerfile` not from the argument's use on the command-line or - elsewhere. For example, consider this Dockerfile: - - ``` - 1 FROM busybox - 2 USER ${user:-some_user} - 3 ARG user - 4 USER $user - ... - ``` - A user builds this file by calling: - - ``` - $ docker build --build-arg user=what_user Dockerfile - ``` - - The `USER` at line 2 evaluates to `some_user` as the `user` variable is defined on the - subsequent line 3. The `USER` at line 4 evaluates to `what_user` as `user` is - defined and the `what_user` value was passed on the command line. Prior to its definition by an - `ARG` instruction, any use of a variable results in an empty string. - - > **Warning:** It is not recommended to use build-time variables for - > passing secrets like github keys, user credentials etc. Build-time variable - > values are visible to any user of the image with the `docker history` command. - - You can use an `ARG` or an `ENV` instruction to specify variables that are - available to the `RUN` instruction. Environment variables defined using the - `ENV` instruction always override an `ARG` instruction of the same name. Consider - this Dockerfile with an `ENV` and `ARG` instruction. - - ``` - 1 FROM ubuntu - 2 ARG CONT_IMG_VER - 3 ENV CONT_IMG_VER v1.0.0 - 4 RUN echo $CONT_IMG_VER - ``` - Then, assume this image is built with this command: - - ``` - $ docker build --build-arg CONT_IMG_VER=v2.0.1 Dockerfile - ``` - - In this case, the `RUN` instruction uses `v1.0.0` instead of the `ARG` setting - passed by the user:`v2.0.1` This behavior is similar to a shell - script where a locally scoped variable overrides the variables passed as - arguments or inherited from environment, from its point of definition. - - Using the example above but a different `ENV` specification you can create more - useful interactions between `ARG` and `ENV` instructions: - - ``` - 1 FROM ubuntu - 2 ARG CONT_IMG_VER - 3 ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0} - 4 RUN echo $CONT_IMG_VER - ``` - - Unlike an `ARG` instruction, `ENV` values are always persisted in the built - image. Consider a docker build without the --build-arg flag: - - ``` - $ docker build Dockerfile - ``` - - Using this Dockerfile example, `CONT_IMG_VER` is still persisted in the image but - its value would be `v1.0.0` as it is the default set in line 3 by the `ENV` instruction. - - The variable expansion technique in this example allows you to pass arguments - from the command line and persist them in the final image by leveraging the - `ENV` instruction. Variable expansion is only supported for [a limited set of - Dockerfile instructions.](#environment-replacement) - - Docker has a set of predefined `ARG` variables that you can use without a - corresponding `ARG` instruction in the Dockerfile. - - * `HTTP_PROXY` - * `http_proxy` - * `HTTPS_PROXY` - * `https_proxy` - * `FTP_PROXY` - * `ftp_proxy` - * `NO_PROXY` - * `no_proxy` - - To use these, simply pass them on the command line using the `--build-arg - =` flag. - -**ONBUILD** - -- `ONBUILD [INSTRUCTION]` - The **ONBUILD** instruction adds a trigger instruction to an image. The - trigger is executed at a later time, when the image is used as the base for - another build. Docker executes the trigger in the context of the downstream - build, as if the trigger existed immediately after the **FROM** instruction in - the downstream Dockerfile. - - You can register any build instruction as a trigger. A trigger is useful if - you are defining an image to use as a base for building other images. For - example, if you are defining an application build environment or a daemon that - is customized with a user-specific configuration. - - Consider an image intended as a reusable python application builder. It must - add application source code to a particular directory, and might need a build - script called after that. You can't just call **ADD** and **RUN** now, because - you don't yet have access to the application source code, and it is different - for each application build. - - -- Providing application developers with a boilerplate Dockerfile to copy-paste - into their application is inefficient, error-prone, and - difficult to update because it mixes with application-specific code. - The solution is to use **ONBUILD** to register instructions in advance, to - run later, during the next build stage. - -# HISTORY -*May 2014, Compiled by Zac Dover (zdover at redhat dot com) based on docker.com Dockerfile documentation. -*Feb 2015, updated by Brian Goff (cpuguy83@gmail.com) for readability -*Sept 2015, updated by Sally O'Malley (somalley@redhat.com) -*Oct 2016, updated by Addam Hardy (addam.hardy@gmail.com) diff --git a/vendor/github.com/docker/docker/man/Dockerfile.aarch64 b/vendor/github.com/docker/docker/man/Dockerfile.aarch64 deleted file mode 100644 index e788eb1c1..000000000 --- a/vendor/github.com/docker/docker/man/Dockerfile.aarch64 +++ /dev/null @@ -1,25 +0,0 @@ -FROM aarch64/ubuntu:xenial - -RUN apt-get update && apt-get install -y git golang-go - -RUN mkdir -p /go/src /go/bin /go/pkg -ENV GOPATH=/go -RUN export GLIDE=v0.11.1; \ - export TARGET=/go/src/github.com/Masterminds; \ - mkdir -p ${TARGET} && \ - git clone https://github.com/Masterminds/glide.git ${TARGET}/glide && \ - cd ${TARGET}/glide && \ - git checkout $GLIDE && \ - make build && \ - cp ./glide /usr/bin/glide && \ - cd / && rm -rf /go/src/* /go/bin/* /go/pkg/* - -COPY glide.yaml /manvendor/ -COPY glide.lock /manvendor/ -WORKDIR /manvendor/ -RUN glide install && mv vendor src -ENV GOPATH=$GOPATH:/manvendor -RUN go build -o /usr/bin/go-md2man github.com/cpuguy83/go-md2man - -WORKDIR /go/src/github.com/docker/docker/ -ENTRYPOINT ["man/generate.sh"] diff --git a/vendor/github.com/docker/docker/man/Dockerfile.armhf b/vendor/github.com/docker/docker/man/Dockerfile.armhf deleted file mode 100644 index e7ea49564..000000000 --- a/vendor/github.com/docker/docker/man/Dockerfile.armhf +++ /dev/null @@ -1,43 +0,0 @@ -FROM armhf/debian:jessie - -# allow replacing httpredir or deb mirror -ARG APT_MIRROR=deb.debian.org -RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list - -RUN apt-get update && apt-get install -y \ - git \ - bash \ - curl \ - gcc \ - make - -ENV GO_VERSION 1.7.5 -RUN curl -fsSL "https://golang.org/dl/go${GO_VERSION}.linux-armv6l.tar.gz" \ - | tar -xzC /usr/local -ENV PATH /go/bin:/usr/local/go/bin:$PATH -ENV GOPATH /go - -# We're building for armhf, which is ARMv7, so let's be explicit about that -ENV GOARCH arm -ENV GOARM 7 - -RUN mkdir -p /go/src /go/bin /go/pkg -RUN export GLIDE=v0.11.1; \ - export TARGET=/go/src/github.com/Masterminds; \ - mkdir -p ${TARGET} && \ - git clone https://github.com/Masterminds/glide.git ${TARGET}/glide && \ - cd ${TARGET}/glide && \ - git checkout $GLIDE && \ - make build && \ - cp ./glide /usr/bin/glide && \ - cd / && rm -rf /go/src/* /go/bin/* /go/pkg/* - -COPY glide.yaml /manvendor/ -COPY glide.lock /manvendor/ -WORKDIR /manvendor/ -RUN glide install && mv vendor src -ENV GOPATH=$GOPATH:/manvendor -RUN go build -o /usr/bin/go-md2man github.com/cpuguy83/go-md2man - -WORKDIR /go/src/github.com/docker/docker/ -ENTRYPOINT ["man/generate.sh"] diff --git a/vendor/github.com/docker/docker/man/Dockerfile.ppc64le b/vendor/github.com/docker/docker/man/Dockerfile.ppc64le deleted file mode 100644 index fc96ca769..000000000 --- a/vendor/github.com/docker/docker/man/Dockerfile.ppc64le +++ /dev/null @@ -1,35 +0,0 @@ -FROM ppc64le/ubuntu:xenial - -RUN apt-get update && apt-get install -y \ - curl \ - gcc \ - git \ - make \ - tar - -ENV GO_VERSION 1.7.5 -RUN curl -fsSL "https://golang.org/dl/go${GO_VERSION}.linux-ppc64le.tar.gz" \ - | tar -xzC /usr/local -ENV PATH /usr/local/go/bin:$PATH -ENV GOPATH=/go - -RUN mkdir -p /go/src /go/bin /go/pkg -RUN export GLIDE=v0.11.1; \ - export TARGET=/go/src/github.com/Masterminds; \ - mkdir -p ${TARGET} && \ - git clone https://github.com/Masterminds/glide.git ${TARGET}/glide && \ - cd ${TARGET}/glide && \ - git checkout $GLIDE && \ - make build && \ - cp ./glide /usr/bin/glide && \ - cd / && rm -rf /go/src/* /go/bin/* /go/pkg/* - -COPY glide.yaml /manvendor/ -COPY glide.lock /manvendor/ -WORKDIR /manvendor/ -RUN glide install && mv vendor src -ENV GOPATH=$GOPATH:/manvendor -RUN go build -o /usr/bin/go-md2man github.com/cpuguy83/go-md2man - -WORKDIR /go/src/github.com/docker/docker/ -ENTRYPOINT ["man/generate.sh"] diff --git a/vendor/github.com/docker/docker/man/Dockerfile.s390x b/vendor/github.com/docker/docker/man/Dockerfile.s390x deleted file mode 100644 index d4bcf1da1..000000000 --- a/vendor/github.com/docker/docker/man/Dockerfile.s390x +++ /dev/null @@ -1,35 +0,0 @@ -FROM s390x/ubuntu:xenial - -RUN apt-get update && apt-get install -y \ - curl \ - gcc \ - git \ - make \ - tar - -ENV GO_VERSION 1.7.5 -RUN curl -fsSL "https://golang.org/dl/go${GO_VERSION}.linux-s390x.tar.gz" \ - | tar -xzC /usr/local -ENV PATH /usr/local/go/bin:$PATH -ENV GOPATH=/go - -RUN mkdir -p /go/src /go/bin /go/pkg -RUN export GLIDE=v0.11.1; \ - export TARGET=/go/src/github.com/Masterminds; \ - mkdir -p ${TARGET} && \ - git clone https://github.com/Masterminds/glide.git ${TARGET}/glide && \ - cd ${TARGET}/glide && \ - git checkout $GLIDE && \ - make build && \ - cp ./glide /usr/bin/glide && \ - cd / && rm -rf /go/src/* /go/bin/* /go/pkg/* - -COPY glide.yaml /manvendor/ -COPY glide.lock /manvendor/ -WORKDIR /manvendor/ -RUN glide install && mv vendor src -ENV GOPATH=$GOPATH:/manvendor -RUN go build -o /usr/bin/go-md2man github.com/cpuguy83/go-md2man - -WORKDIR /go/src/github.com/docker/docker/ -ENTRYPOINT ["man/generate.sh"] diff --git a/vendor/github.com/docker/docker/man/README.md b/vendor/github.com/docker/docker/man/README.md deleted file mode 100644 index 82dac650f..000000000 --- a/vendor/github.com/docker/docker/man/README.md +++ /dev/null @@ -1,15 +0,0 @@ -Docker Documentation -==================== - -This directory contains scripts for generating the man pages. Many of the man -pages are generated directly from the `spf13/cobra` `Command` definition. Some -legacy pages are still generated from the markdown files in this directory. -Do *not* edit the man pages in the man1 directory. Instead, update the -Cobra command or amend the Markdown files for legacy pages. - - -## Generate the man pages - -From within the project root directory run: - - make manpages diff --git a/vendor/github.com/docker/docker/man/docker-attach.1.md b/vendor/github.com/docker/docker/man/docker-attach.1.md deleted file mode 100644 index c39d1c929..000000000 --- a/vendor/github.com/docker/docker/man/docker-attach.1.md +++ /dev/null @@ -1,99 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-attach - Attach to a running container - -# SYNOPSIS -**docker attach** -[**--detach-keys**[=*[]*]] -[**--help**] -[**--no-stdin**] -[**--sig-proxy**[=*true*]] -CONTAINER - -# DESCRIPTION -The **docker attach** command allows you to attach to a running container using -the container's ID or name, either to view its ongoing output or to control it -interactively. You can attach to the same contained process multiple times -simultaneously, screen sharing style, or quickly view the progress of your -detached process. - -To stop a container, use `CTRL-c`. This key sequence sends `SIGKILL` to the -container. You can detach from the container (and leave it running) using a -configurable key sequence. The default sequence is `CTRL-p CTRL-q`. You -configure the key sequence using the **--detach-keys** option or a configuration -file. See **config-json(5)** for documentation on using a configuration file. - -It is forbidden to redirect the standard input of a `docker attach` command while -attaching to a tty-enabled container (i.e.: launched with `-t`). - -# OPTIONS -**--detach-keys**="" - Override the key sequence for detaching a container. Format is a single character `[a-Z]` or `ctrl-` where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**--help** - Print usage statement - -**--no-stdin**=*true*|*false* - Do not attach STDIN. The default is *false*. - -**--sig-proxy**=*true*|*false* - Proxy all received signals to the process (non-TTY mode only). SIGCHLD, SIGKILL, and SIGSTOP are not proxied. The default is *true*. - -# Override the detach sequence - -If you want, you can configure an override the Docker key sequence for detach. -This is useful if the Docker default sequence conflicts with key sequence you -use for other applications. There are two ways to define your own detach key -sequence, as a per-container override or as a configuration property on your -entire configuration. - -To override the sequence for an individual container, use the -`--detach-keys=""` flag with the `docker attach` command. The format of -the `` is either a letter [a-Z], or the `ctrl-` combined with any of -the following: - -* `a-z` (a single lowercase alpha character ) -* `@` (at sign) -* `[` (left bracket) -* `\\` (two backward slashes) -* `_` (underscore) -* `^` (caret) - -These `a`, `ctrl-a`, `X`, or `ctrl-\\` values are all examples of valid key -sequences. To configure a different configuration default key sequence for all -containers, see **docker(1)**. - -# EXAMPLES - -## Attaching to a container - -In this example the top command is run inside a container, from an image called -fedora, in detached mode. The ID from the container is passed into the **docker -attach** command: - - # ID=$(sudo docker run -d fedora /usr/bin/top -b) - # sudo docker attach $ID - top - 02:05:52 up 3:05, 0 users, load average: 0.01, 0.02, 0.05 - Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie - Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st - Mem: 373572k total, 355560k used, 18012k free, 27872k buffers - Swap: 786428k total, 0k used, 786428k free, 221740k cached - - PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND - 1 root 20 0 17200 1116 912 R 0 0.3 0:00.03 top - - top - 02:05:55 up 3:05, 0 users, load average: 0.01, 0.02, 0.05 - Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie - Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st - Mem: 373572k total, 355244k used, 18328k free, 27872k buffers - Swap: 786428k total, 0k used, 786428k free, 221776k cached - - PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND - 1 root 20 0 17208 1144 932 R 0 0.3 0:00.03 top - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-build.1.md b/vendor/github.com/docker/docker/man/docker-build.1.md deleted file mode 100644 index 4beee88e4..000000000 --- a/vendor/github.com/docker/docker/man/docker-build.1.md +++ /dev/null @@ -1,340 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-build - Build an image from a Dockerfile - -# SYNOPSIS -**docker build** -[**--build-arg**[=*[]*]] -[**--cpu-shares**[=*0*]] -[**--cgroup-parent**[=*CGROUP-PARENT*]] -[**--help**] -[**-f**|**--file**[=*PATH/Dockerfile*]] -[**-squash**] *Experimental* -[**--force-rm**] -[**--isolation**[=*default*]] -[**--label**[=*[]*]] -[**--no-cache**] -[**--pull**] -[**--compress**] -[**-q**|**--quiet**] -[**--rm**[=*true*]] -[**-t**|**--tag**[=*[]*]] -[**-m**|**--memory**[=*MEMORY*]] -[**--memory-swap**[=*LIMIT*]] -[**--network**[=*"default"*]] -[**--shm-size**[=*SHM-SIZE*]] -[**--cpu-period**[=*0*]] -[**--cpu-quota**[=*0*]] -[**--cpuset-cpus**[=*CPUSET-CPUS*]] -[**--cpuset-mems**[=*CPUSET-MEMS*]] -[**--ulimit**[=*[]*]] -PATH | URL | - - -# DESCRIPTION -This will read the Dockerfile from the directory specified in **PATH**. -It also sends any other files and directories found in the current -directory to the Docker daemon. The contents of this directory would -be used by **ADD** commands found within the Dockerfile. - -Warning, this will send a lot of data to the Docker daemon depending -on the contents of the current directory. The build is run by the Docker -daemon, not by the CLI, so the whole context must be transferred to the daemon. -The Docker CLI reports "Sending build context to Docker daemon" when the context is sent to -the daemon. - -When the URL to a tarball archive or to a single Dockerfile is given, no context is sent from -the client to the Docker daemon. In this case, the Dockerfile at the root of the archive and -the rest of the archive will get used as the context of the build. When a Git repository is -set as the **URL**, the repository is cloned locally and then sent as the context. - -# OPTIONS -**-f**, **--file**=*PATH/Dockerfile* - Path to the Dockerfile to use. If the path is a relative path and you are - building from a local directory, then the path must be relative to that - directory. If you are building from a remote URL pointing to either a - tarball or a Git repository, then the path must be relative to the root of - the remote context. In all cases, the file must be within the build context. - The default is *Dockerfile*. - -**--squash**=*true*|*false* - **Experimental Only** - Once the image is built, squash the new layers into a new image with a single - new layer. Squashing does not destroy any existing image, rather it creates a new - image with the content of the squshed layers. This effectively makes it look - like all `Dockerfile` commands were created with a single layer. The build - cache is preserved with this method. - - **Note**: using this option means the new image will not be able to take - advantage of layer sharing with other images and may use significantly more - space. - - **Note**: using this option you may see significantly more space used due to - storing two copies of the image, one for the build cache with all the cache - layers in tact, and one for the squashed version. - -**--build-arg**=*variable* - name and value of a **buildarg**. - - For example, if you want to pass a value for `http_proxy`, use - `--build-arg=http_proxy="http://some.proxy.url"` - - Users pass these values at build-time. Docker uses the `buildargs` as the - environment context for command(s) run via the Dockerfile's `RUN` instruction - or for variable expansion in other Dockerfile instructions. This is not meant - for passing secret values. [Read more about the buildargs instruction](https://docs.docker.com/engine/reference/builder/#arg) - -**--force-rm**=*true*|*false* - Always remove intermediate containers, even after unsuccessful builds. The default is *false*. - -**--isolation**="*default*" - Isolation specifies the type of isolation technology used by containers. - -**--label**=*label* - Set metadata for an image - -**--no-cache**=*true*|*false* - Do not use cache when building the image. The default is *false*. - -**--help** - Print usage statement - -**--pull**=*true*|*false* - Always attempt to pull a newer version of the image. The default is *false*. - -**--compress**=*true*|*false* - Compress the build context using gzip. The default is *false*. - -**-q**, **--quiet**=*true*|*false* - Suppress the build output and print image ID on success. The default is *false*. - -**--rm**=*true*|*false* - Remove intermediate containers after a successful build. The default is *true*. - -**-t**, **--tag**="" - Repository names (and optionally with tags) to be applied to the resulting - image in case of success. Refer to **docker-tag(1)** for more information - about valid tag names. - -**-m**, **--memory**=*MEMORY* - Memory limit - -**--memory-swap**=*LIMIT* - A limit value equal to memory plus swap. Must be used with the **-m** -(**--memory**) flag. The swap `LIMIT` should always be larger than **-m** -(**--memory**) value. - - The format of `LIMIT` is `[]`. Unit can be `b` (bytes), -`k` (kilobytes), `m` (megabytes), or `g` (gigabytes). If you don't specify a -unit, `b` is used. Set LIMIT to `-1` to enable unlimited swap. - -**--network**=*bridge* - Set the networking mode for the RUN instructions during build. Supported standard - values are: `bridge`, `host`, `none` and `container:`. Any other value - is taken as a custom network's name or ID which this container should connect to. - -**--shm-size**=*SHM-SIZE* - Size of `/dev/shm`. The format is ``. `number` must be greater than `0`. - Unit is optional and can be `b` (bytes), `k` (kilobytes), `m` (megabytes), or `g` (gigabytes). If you omit the unit, the system uses bytes. - If you omit the size entirely, the system uses `64m`. - -**--cpu-shares**=*0* - CPU shares (relative weight). - - By default, all containers get the same proportion of CPU cycles. - CPU shares is a 'relative weight', relative to the default setting of 1024. - This default value is defined here: - ``` - cat /sys/fs/cgroup/cpu/cpu.shares - 1024 - ``` - You can change this proportion by adjusting the container's CPU share - weighting relative to the weighting of all other running containers. - - To modify the proportion from the default of 1024, use the **--cpu-shares** - flag to set the weighting to 2 or higher. - - Container CPU share Flag - {C0} 60% of CPU --cpu-shares=614 (614 is 60% of 1024) - {C1} 40% of CPU --cpu-shares=410 (410 is 40% of 1024) - - The proportion is only applied when CPU-intensive processes are running. - When tasks in one container are idle, the other containers can use the - left-over CPU time. The actual amount of CPU time used varies depending on - the number of containers running on the system. - - For example, consider three containers, where one has **--cpu-shares=1024** and - two others have **--cpu-shares=512**. When processes in all three - containers attempt to use 100% of CPU, the first container would receive - 50% of the total CPU time. If you add a fourth container with **--cpu-shares=1024**, - the first container only gets 33% of the CPU. The remaining containers - receive 16.5%, 16.5% and 33% of the CPU. - - - Container CPU share Flag CPU time - {C0} 100% --cpu-shares=1024 33% - {C1} 50% --cpu-shares=512 16.5% - {C2} 50% --cpu-shares=512 16.5% - {C4} 100% --cpu-shares=1024 33% - - - On a multi-core system, the shares of CPU time are distributed across the CPU - cores. Even if a container is limited to less than 100% of CPU time, it can - use 100% of each individual CPU core. - - For example, consider a system with more than three cores. If you start one - container **{C0}** with **--cpu-shares=512** running one process, and another container - **{C1}** with **--cpu-shares=1024** running two processes, this can result in the following - division of CPU shares: - - PID container CPU CPU share - 100 {C0} 0 100% of CPU0 - 101 {C1} 1 100% of CPU1 - 102 {C1} 2 100% of CPU2 - -**--cpu-period**=*0* - Limit the CPU CFS (Completely Fair Scheduler) period. - - Limit the container's CPU usage. This flag causes the kernel to restrict the - container's CPU usage to the period you specify. - -**--cpu-quota**=*0* - Limit the CPU CFS (Completely Fair Scheduler) quota. - - By default, containers run with the full CPU resource. This flag causes the -kernel to restrict the container's CPU usage to the quota you specify. - -**--cpuset-cpus**=*CPUSET-CPUS* - CPUs in which to allow execution (0-3, 0,1). - -**--cpuset-mems**=*CPUSET-MEMS* - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on - NUMA systems. - - For example, if you have four memory nodes on your system (0-3), use `--cpuset-mems=0,1` -to ensure the processes in your Docker container only use memory from the first -two memory nodes. - -**--cgroup-parent**=*CGROUP-PARENT* - Path to `cgroups` under which the container's `cgroup` are created. - - If the path is not absolute, the path is considered relative to the `cgroups` path of the init process. -Cgroups are created if they do not already exist. - -**--ulimit**=[] - Ulimit options - - For more information about `ulimit` see [Setting ulimits in a -container](https://docs.docker.com/engine/reference/commandline/run/#set-ulimits-in-container---ulimit) - -# EXAMPLES - -## Building an image using a Dockerfile located inside the current directory - -Docker images can be built using the build command and a Dockerfile: - - docker build . - -During the build process Docker creates intermediate images. In order to -keep them, you must explicitly set `--rm=false`. - - docker build --rm=false . - -A good practice is to make a sub-directory with a related name and create -the Dockerfile in that directory. For example, a directory called mongo may -contain a Dockerfile to create a Docker MongoDB image. Likewise, another -directory called httpd may be used to store Dockerfiles for Apache web -server images. - -It is also a good practice to add the files required for the image to the -sub-directory. These files will then be specified with the `COPY` or `ADD` -instructions in the `Dockerfile`. - -Note: If you include a tar file (a good practice), then Docker will -automatically extract the contents of the tar file specified within the `ADD` -instruction into the specified target. - -## Building an image and naming that image - -A good practice is to give a name to the image you are building. Note that -only a-z0-9-_. should be used for consistency. There are no hard rules here but it is best to give the names consideration. - -The **-t**/**--tag** flag is used to rename an image. Here are some examples: - -Though it is not a good practice, image names can be arbitrary: - - docker build -t myimage . - -A better approach is to provide a fully qualified and meaningful repository, -name, and tag (where the tag in this context means the qualifier after -the ":"). In this example we build a JBoss image for the Fedora repository -and give it the version 1.0: - - docker build -t fedora/jboss:1.0 . - -The next example is for the "whenry" user repository and uses Fedora and -JBoss and gives it the version 2.1 : - - docker build -t whenry/fedora-jboss:v2.1 . - -If you do not provide a version tag then Docker will assign `latest`: - - docker build -t whenry/fedora-jboss . - -When you list the images, the image above will have the tag `latest`. - -You can apply multiple tags to an image. For example, you can apply the `latest` -tag to a newly built image and add another tag that references a specific -version. -For example, to tag an image both as `whenry/fedora-jboss:latest` and -`whenry/fedora-jboss:v2.1`, use the following: - - docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 . - -So renaming an image is arbitrary but consideration should be given to -a useful convention that makes sense for consumers and should also take -into account Docker community conventions. - - -## Building an image using a URL - -This will clone the specified GitHub repository from the URL and use it -as context. The Dockerfile at the root of the repository is used as -Dockerfile. This only works if the GitHub repository is a dedicated -repository. - - docker build github.com/scollier/purpletest - -Note: You can set an arbitrary Git repository via the `git://` scheme. - -## Building an image using a URL to a tarball'ed context - -This will send the URL itself to the Docker daemon. The daemon will fetch the -tarball archive, decompress it and use its contents as the build context. The -Dockerfile at the root of the archive and the rest of the archive will get used -as the context of the build. If you pass an **-f PATH/Dockerfile** option as well, -the system will look for that file inside the contents of the tarball. - - docker build -f dev/Dockerfile https://10.10.10.1/docker/context.tar.gz - -Note: supported compression formats are 'xz', 'bzip2', 'gzip' and 'identity' (no compression). - -## Specify isolation technology for container (--isolation) - -This option is useful in situations where you are running Docker containers on -Windows. The `--isolation=` option sets a container's isolation -technology. On Linux, the only supported is the `default` option which uses -Linux namespaces. On Microsoft Windows, you can specify these values: - -* `default`: Use the value specified by the Docker daemon's `--exec-opt` . If the `daemon` does not specify an isolation technology, Microsoft Windows uses `process` as its default value. -* `process`: Namespace isolation only. -* `hyperv`: Hyper-V hypervisor partition-based isolation. - -Specifying the `--isolation` flag without a value is the same as setting `--isolation="default"`. - -# HISTORY -March 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -June 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/docker-commit.1.md b/vendor/github.com/docker/docker/man/docker-commit.1.md deleted file mode 100644 index d8a4cf838..000000000 --- a/vendor/github.com/docker/docker/man/docker-commit.1.md +++ /dev/null @@ -1,71 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-commit - Create a new image from a container's changes - -# SYNOPSIS -**docker commit** -[**-a**|**--author**[=*AUTHOR*]] -[**-c**|**--change**[=\[*DOCKERFILE INSTRUCTIONS*\]]] -[**--help**] -[**-m**|**--message**[=*MESSAGE*]] -[**-p**|**--pause**[=*true*]] -CONTAINER [REPOSITORY[:TAG]] - -# DESCRIPTION -Create a new image from an existing container specified by name or -container ID. The new image will contain the contents of the -container filesystem, *excluding* any data volumes. Refer to **docker-tag(1)** -for more information about valid image and tag names. - -While the `docker commit` command is a convenient way of extending an -existing image, you should prefer the use of a Dockerfile and `docker -build` for generating images that you intend to share with other -people. - -# OPTIONS -**-a**, **--author**="" - Author (e.g., "John Hannibal Smith ") - -**-c** , **--change**=[] - Apply specified Dockerfile instructions while committing the image - Supported Dockerfile instructions: `CMD`|`ENTRYPOINT`|`ENV`|`EXPOSE`|`LABEL`|`ONBUILD`|`USER`|`VOLUME`|`WORKDIR` - -**--help** - Print usage statement - -**-m**, **--message**="" - Commit message - -**-p**, **--pause**=*true*|*false* - Pause container during commit. The default is *true*. - -# EXAMPLES - -## Creating a new image from an existing container -An existing Fedora based container has had Apache installed while running -in interactive mode with the bash shell. Apache is also running. To -create a new image run `docker ps` to find the container's ID and then run: - - # docker commit -m="Added Apache to Fedora base image" \ - -a="A D Ministrator" 98bd7fc99854 fedora/fedora_httpd:20 - -Note that only a-z0-9-_. are allowed when naming images from an -existing container. - -## Apply specified Dockerfile instructions while committing the image -If an existing container was created without the DEBUG environment -variable set to "true", you can create a new image based on that -container by first getting the container's ID with `docker ps` and -then running: - - # docker commit -c="ENV DEBUG true" 98bd7fc99854 debug-image - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and in -June 2014, updated by Sven Dowideit -July 2014, updated by Sven Dowideit -Oct 2014, updated by Daniel, Dao Quang Minh -June 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/docker-config-json.5.md b/vendor/github.com/docker/docker/man/docker-config-json.5.md deleted file mode 100644 index 49987f08b..000000000 --- a/vendor/github.com/docker/docker/man/docker-config-json.5.md +++ /dev/null @@ -1,72 +0,0 @@ -% CONFIG.JSON(5) Docker User Manuals -% Docker Community -% JANUARY 2016 -# NAME -HOME/.docker/config.json - Default Docker configuration file - -# INTRODUCTION - -By default, the Docker command line stores its configuration files in a -directory called `.docker` within your `$HOME` directory. Docker manages most of -the files in the configuration directory and you should not modify them. -However, you *can modify* the `config.json` file to control certain aspects of -how the `docker` command behaves. - -Currently, you can modify the `docker` command behavior using environment -variables or command-line options. You can also use options within -`config.json` to modify some of the same behavior. When using these -mechanisms, you must keep in mind the order of precedence among them. Command -line options override environment variables and environment variables override -properties you specify in a `config.json` file. - -The `config.json` file stores a JSON encoding of several properties: - -* The `HttpHeaders` property specifies a set of headers to include in all messages -sent from the Docker client to the daemon. Docker does not try to interpret or -understand these header; it simply puts them into the messages. Docker does not -allow these headers to change any headers it sets for itself. - -* The `psFormat` property specifies the default format for `docker ps` output. -When the `--format` flag is not provided with the `docker ps` command, -Docker's client uses this property. If this property is not set, the client -falls back to the default table format. For a list of supported formatting -directives, see **docker-ps(1)**. - -* The `detachKeys` property specifies the default key sequence which -detaches the container. When the `--detach-keys` flag is not provide -with the `docker attach`, `docker exec`, `docker run` or `docker -start`, Docker's client uses this property. If this property is not -set, the client falls back to the default sequence `ctrl-p,ctrl-q`. - - -* The `imagesFormat` property specifies the default format for `docker images` -output. When the `--format` flag is not provided with the `docker images` -command, Docker's client uses this property. If this property is not set, the -client falls back to the default table format. For a list of supported -formatting directives, see **docker-images(1)**. - -You can specify a different location for the configuration files via the -`DOCKER_CONFIG` environment variable or the `--config` command line option. If -both are specified, then the `--config` option overrides the `DOCKER_CONFIG` -environment variable: - - docker --config ~/testconfigs/ ps - -This command instructs Docker to use the configuration files in the -`~/testconfigs/` directory when running the `ps` command. - -## Examples - -Following is a sample `config.json` file: - - { - "HttpHeaders": { - "MyHeader": "MyValue" - }, - "psFormat": "table {{.ID}}\\t{{.Image}}\\t{{.Command}}\\t{{.Labels}}", - "imagesFormat": "table {{.ID}}\\t{{.Repository}}\\t{{.Tag}}\\t{{.CreatedAt}}", - "detachKeys": "ctrl-e,e" - } - -# HISTORY -January 2016, created by Moxiegirl diff --git a/vendor/github.com/docker/docker/man/docker-cp.1.md b/vendor/github.com/docker/docker/man/docker-cp.1.md deleted file mode 100644 index 949d60bb8..000000000 --- a/vendor/github.com/docker/docker/man/docker-cp.1.md +++ /dev/null @@ -1,175 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-cp - Copy files/folders between a container and the local filesystem. - -# SYNOPSIS -**docker cp** -[**--help**] -CONTAINER:SRC_PATH DEST_PATH|- - -**docker cp** -[**--help**] -SRC_PATH|- CONTAINER:DEST_PATH - -# DESCRIPTION - -The `docker cp` utility copies the contents of `SRC_PATH` to the `DEST_PATH`. -You can copy from the container's file system to the local machine or the -reverse, from the local filesystem to the container. If `-` is specified for -either the `SRC_PATH` or `DEST_PATH`, you can also stream a tar archive from -`STDIN` or to `STDOUT`. The `CONTAINER` can be a running or stopped container. -The `SRC_PATH` or `DEST_PATH` can be a file or directory. - -The `docker cp` command assumes container paths are relative to the container's -`/` (root) directory. This means supplying the initial forward slash is optional; -The command sees `compassionate_darwin:/tmp/foo/myfile.txt` and -`compassionate_darwin:tmp/foo/myfile.txt` as identical. Local machine paths can -be an absolute or relative value. The command interprets a local machine's -relative paths as relative to the current working directory where `docker cp` is -run. - -The `cp` command behaves like the Unix `cp -a` command in that directories are -copied recursively with permissions preserved if possible. Ownership is set to -the user and primary group at the destination. For example, files copied to a -container are created with `UID:GID` of the root user. Files copied to the local -machine are created with the `UID:GID` of the user which invoked the `docker cp` -command. If you specify the `-L` option, `docker cp` follows any symbolic link -in the `SRC_PATH`. `docker cp` does *not* create parent directories for -`DEST_PATH` if they do not exist. - -Assuming a path separator of `/`, a first argument of `SRC_PATH` and second -argument of `DEST_PATH`, the behavior is as follows: - -- `SRC_PATH` specifies a file - - `DEST_PATH` does not exist - - the file is saved to a file created at `DEST_PATH` - - `DEST_PATH` does not exist and ends with `/` - - Error condition: the destination directory must exist. - - `DEST_PATH` exists and is a file - - the destination is overwritten with the source file's contents - - `DEST_PATH` exists and is a directory - - the file is copied into this directory using the basename from - `SRC_PATH` -- `SRC_PATH` specifies a directory - - `DEST_PATH` does not exist - - `DEST_PATH` is created as a directory and the *contents* of the source - directory are copied into this directory - - `DEST_PATH` exists and is a file - - Error condition: cannot copy a directory to a file - - `DEST_PATH` exists and is a directory - - `SRC_PATH` does not end with `/.` - - the source directory is copied into this directory - - `SRC_PATH` does end with `/.` - - the *content* of the source directory is copied into this - directory - -The command requires `SRC_PATH` and `DEST_PATH` to exist according to the above -rules. If `SRC_PATH` is local and is a symbolic link, the symbolic link, not -the target, is copied by default. To copy the link target and not the link, -specify the `-L` option. - -A colon (`:`) is used as a delimiter between `CONTAINER` and its path. You can -also use `:` when specifying paths to a `SRC_PATH` or `DEST_PATH` on a local -machine, for example `file:name.txt`. If you use a `:` in a local machine path, -you must be explicit with a relative or absolute path, for example: - - `/path/to/file:name.txt` or `./file:name.txt` - -It is not possible to copy certain system files such as resources under -`/proc`, `/sys`, `/dev`, tmpfs, and mounts created by the user in the container. -However, you can still copy such files by manually running `tar` in `docker exec`. -For example (consider `SRC_PATH` and `DEST_PATH` are directories): - - $ docker exec foo tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | tar Cxf DEST_PATH - - -or - - $ tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | docker exec -i foo tar Cxf DEST_PATH - - - -Using `-` as the `SRC_PATH` streams the contents of `STDIN` as a tar archive. -The command extracts the content of the tar to the `DEST_PATH` in container's -filesystem. In this case, `DEST_PATH` must specify a directory. Using `-` as -the `DEST_PATH` streams the contents of the resource as a tar archive to `STDOUT`. - -# OPTIONS -**-L**, **--follow-link**=*true*|*false* - Follow symbol link in SRC_PATH - -**--help** - Print usage statement - -# EXAMPLES - -Suppose a container has finished producing some output as a file it saves -to somewhere in its filesystem. This could be the output of a build job or -some other computation. You can copy these outputs from the container to a -location on your local host. - -If you want to copy the `/tmp/foo` directory from a container to the -existing `/tmp` directory on your host. If you run `docker cp` in your `~` -(home) directory on the local host: - - $ docker cp compassionate_darwin:tmp/foo /tmp - -Docker creates a `/tmp/foo` directory on your host. Alternatively, you can omit -the leading slash in the command. If you execute this command from your home -directory: - - $ docker cp compassionate_darwin:tmp/foo tmp - -If `~/tmp` does not exist, Docker will create it and copy the contents of -`/tmp/foo` from the container into this new directory. If `~/tmp` already -exists as a directory, then Docker will copy the contents of `/tmp/foo` from -the container into a directory at `~/tmp/foo`. - -When copying a single file to an existing `LOCALPATH`, the `docker cp` command -will either overwrite the contents of `LOCALPATH` if it is a file or place it -into `LOCALPATH` if it is a directory, overwriting an existing file of the same -name if one exists. For example, this command: - - $ docker cp sharp_ptolemy:/tmp/foo/myfile.txt /test - -If `/test` does not exist on the local machine, it will be created as a file -with the contents of `/tmp/foo/myfile.txt` from the container. If `/test` -exists as a file, it will be overwritten. Lastly, if `/test` exists as a -directory, the file will be copied to `/test/myfile.txt`. - -Next, suppose you want to copy a file or folder into a container. For example, -this could be a configuration file or some other input to a long running -computation that you would like to place into a created container before it -starts. This is useful because it does not require the configuration file or -other input to exist in the container image. - -If you have a file, `config.yml`, in the current directory on your local host -and wish to copy it to an existing directory at `/etc/my-app.d` in a container, -this command can be used: - - $ docker cp config.yml myappcontainer:/etc/my-app.d - -If you have several files in a local directory `/config` which you need to copy -to a directory `/etc/my-app.d` in a container: - - $ docker cp /config/. myappcontainer:/etc/my-app.d - -The above command will copy the contents of the local `/config` directory into -the directory `/etc/my-app.d` in the container. - -Finally, if you want to copy a symbolic link into a container, you typically -want to copy the linked target and not the link itself. To copy the target, use -the `-L` option, for example: - - $ ln -s /tmp/somefile /tmp/somefile.ln - $ docker cp -L /tmp/somefile.ln myappcontainer:/tmp/ - -This command copies content of the local `/tmp/somefile` into the file -`/tmp/somefile.ln` in the container. Without `-L` option, the `/tmp/somefile.ln` -preserves its symbolic link but not its content. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -May 2015, updated by Josh Hawn diff --git a/vendor/github.com/docker/docker/man/docker-create.1.md b/vendor/github.com/docker/docker/man/docker-create.1.md deleted file mode 100644 index 3f8a07637..000000000 --- a/vendor/github.com/docker/docker/man/docker-create.1.md +++ /dev/null @@ -1,553 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-create - Create a new container - -# SYNOPSIS -**docker create** -[**-a**|**--attach**[=*[]*]] -[**--add-host**[=*[]*]] -[**--blkio-weight**[=*[BLKIO-WEIGHT]*]] -[**--blkio-weight-device**[=*[]*]] -[**--cpu-shares**[=*0*]] -[**--cap-add**[=*[]*]] -[**--cap-drop**[=*[]*]] -[**--cgroup-parent**[=*CGROUP-PATH*]] -[**--cidfile**[=*CIDFILE*]] -[**--cpu-count**[=*0*]] -[**--cpu-percent**[=*0*]] -[**--cpu-period**[=*0*]] -[**--cpu-quota**[=*0*]] -[**--cpu-rt-period**[=*0*]] -[**--cpu-rt-runtime**[=*0*]] -[**--cpus**[=*0.0*]] -[**--cpuset-cpus**[=*CPUSET-CPUS*]] -[**--cpuset-mems**[=*CPUSET-MEMS*]] -[**--device**[=*[]*]] -[**--device-read-bps**[=*[]*]] -[**--device-read-iops**[=*[]*]] -[**--device-write-bps**[=*[]*]] -[**--device-write-iops**[=*[]*]] -[**--dns**[=*[]*]] -[**--dns-search**[=*[]*]] -[**--dns-option**[=*[]*]] -[**-e**|**--env**[=*[]*]] -[**--entrypoint**[=*ENTRYPOINT*]] -[**--env-file**[=*[]*]] -[**--expose**[=*[]*]] -[**--group-add**[=*[]*]] -[**-h**|**--hostname**[=*HOSTNAME*]] -[**--help**] -[**-i**|**--interactive**] -[**--ip**[=*IPv4-ADDRESS*]] -[**--ip6**[=*IPv6-ADDRESS*]] -[**--ipc**[=*IPC*]] -[**--isolation**[=*default*]] -[**--kernel-memory**[=*KERNEL-MEMORY*]] -[**-l**|**--label**[=*[]*]] -[**--label-file**[=*[]*]] -[**--link**[=*[]*]] -[**--link-local-ip**[=*[]*]] -[**--log-driver**[=*[]*]] -[**--log-opt**[=*[]*]] -[**-m**|**--memory**[=*MEMORY*]] -[**--mac-address**[=*MAC-ADDRESS*]] -[**--memory-reservation**[=*MEMORY-RESERVATION*]] -[**--memory-swap**[=*LIMIT*]] -[**--memory-swappiness**[=*MEMORY-SWAPPINESS*]] -[**--name**[=*NAME*]] -[**--network-alias**[=*[]*]] -[**--network**[=*"bridge"*]] -[**--oom-kill-disable**] -[**--oom-score-adj**[=*0*]] -[**-P**|**--publish-all**] -[**-p**|**--publish**[=*[]*]] -[**--pid**[=*[PID]*]] -[**--userns**[=*[]*]] -[**--pids-limit**[=*PIDS_LIMIT*]] -[**--privileged**] -[**--read-only**] -[**--restart**[=*RESTART*]] -[**--rm**] -[**--security-opt**[=*[]*]] -[**--storage-opt**[=*[]*]] -[**--stop-signal**[=*SIGNAL*]] -[**--stop-timeout**[=*TIMEOUT*]] -[**--shm-size**[=*[]*]] -[**--sysctl**[=*[]*]] -[**-t**|**--tty**] -[**--tmpfs**[=*[CONTAINER-DIR[:]*]] -[**-u**|**--user**[=*USER*]] -[**--ulimit**[=*[]*]] -[**--uts**[=*[]*]] -[**-v**|**--volume**[=*[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]*]] -[**--volume-driver**[=*DRIVER*]] -[**--volumes-from**[=*[]*]] -[**-w**|**--workdir**[=*WORKDIR*]] -IMAGE [COMMAND] [ARG...] - -# DESCRIPTION - -Creates a writeable container layer over the specified image and prepares it for -running the specified command. The container ID is then printed to STDOUT. This -is similar to **docker run -d** except the container is never started. You can -then use the **docker start ** command to start the container at -any point. - -The initial status of the container created with **docker create** is 'created'. - -# OPTIONS -**-a**, **--attach**=[] - Attach to STDIN, STDOUT or STDERR. - -**--add-host**=[] - Add a custom host-to-IP mapping (host:ip) - -**--blkio-weight**=*0* - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - -**--blkio-weight-device**=[] - Block IO weight (relative device weight, format: `DEVICE_NAME:WEIGHT`). - -**--cpu-shares**=*0* - CPU shares (relative weight) - -**--cap-add**=[] - Add Linux capabilities - -**--cap-drop**=[] - Drop Linux capabilities - -**--cgroup-parent**="" - Path to cgroups under which the cgroup for the container will be created. If the path is not absolute, the path is considered to be relative to the cgroups path of the init process. Cgroups will be created if they do not already exist. - -**--cidfile**="" - Write the container ID to the file - -**--cpu-count**=*0* - Limit the number of CPUs available for execution by the container. - - On Windows Server containers, this is approximated as a percentage of total CPU usage. - - On Windows Server containers, the processor resource controls are mutually exclusive, the order of precedence is CPUCount first, then CPUShares, and CPUPercent last. - -**--cpu-percent**=*0* - Limit the percentage of CPU available for execution by a container running on a Windows daemon. - - On Windows Server containers, the processor resource controls are mutually exclusive, the order of precedence is CPUCount first, then CPUShares, and CPUPercent last. - -**--cpu-period**=*0* - Limit the CPU CFS (Completely Fair Scheduler) period - - Limit the container's CPU usage. This flag tell the kernel to restrict the container's CPU usage to the period you specify. - -**--cpuset-cpus**="" - CPUs in which to allow execution (0-3, 0,1) - -**--cpuset-mems**="" - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - - If you have four memory nodes on your system (0-3), use `--cpuset-mems=0,1` -then processes in your Docker container will only use memory from the first -two memory nodes. - -**--cpu-quota**=*0* - Limit the CPU CFS (Completely Fair Scheduler) quota - -**--cpu-rt-period**=0 - Limit the CPU real-time period in microseconds - - Limit the container's Real Time CPU usage. This flag tell the kernel to restrict the container's Real Time CPU usage to the period you specify. - -**--cpu-rt-runtime**=0 - Limit the CPU real-time runtime in microseconds - - Limit the containers Real Time CPU usage. This flag tells the kernel to limit the amount of time in a given CPU period Real Time tasks may consume. Ex: - Period of 1,000,000us and Runtime of 950,000us means that this container could consume 95% of available CPU and leave the remaining 5% to normal priority tasks. - - The sum of all runtimes across containers cannot exceed the amount allotted to the parent cgroup. - -**--cpus**=0.0 - Number of CPUs. The default is *0.0*. - -**--device**=[] - Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm) - -**--device-read-bps**=[] - Limit read rate (bytes per second) from a device (e.g. --device-read-bps=/dev/sda:1mb) - -**--device-read-iops**=[] - Limit read rate (IO per second) from a device (e.g. --device-read-iops=/dev/sda:1000) - -**--device-write-bps**=[] - Limit write rate (bytes per second) to a device (e.g. --device-write-bps=/dev/sda:1mb) - -**--device-write-iops**=[] - Limit write rate (IO per second) to a device (e.g. --device-write-iops=/dev/sda:1000) - -**--dns**=[] - Set custom DNS servers - -**--dns-option**=[] - Set custom DNS options - -**--dns-search**=[] - Set custom DNS search domains (Use --dns-search=. if you don't wish to set the search domain) - -**-e**, **--env**=[] - Set environment variables - -**--entrypoint**="" - Overwrite the default ENTRYPOINT of the image - -**--env-file**=[] - Read in a line-delimited file of environment variables - -**--expose**=[] - Expose a port or a range of ports (e.g. --expose=3300-3310) from the container without publishing it to your host - -**--group-add**=[] - Add additional groups to run as - -**-h**, **--hostname**="" - Container host name - -**--help** - Print usage statement - -**-i**, **--interactive**=*true*|*false* - Keep STDIN open even if not attached. The default is *false*. - -**--ip**="" - Sets the container's interface IPv4 address (e.g. 172.23.0.9) - - It can only be used in conjunction with **--network** for user-defined networks - -**--ip6**="" - Sets the container's interface IPv6 address (e.g. 2001:db8::1b99) - - It can only be used in conjunction with **--network** for user-defined networks - -**--ipc**="" - Default is to create a private IPC namespace (POSIX SysV IPC) for the container - 'container:': reuses another container shared memory, semaphores and message queues - 'host': use the host shared memory,semaphores and message queues inside the container. Note: the host mode gives the container full access to local shared memory and is therefore considered insecure. - -**--isolation**="*default*" - Isolation specifies the type of isolation technology used by containers. Note -that the default on Windows server is `process`, and the default on Windows client -is `hyperv`. Linux only supports `default`. - -**--kernel-memory**="" - Kernel memory limit (format: `[]`, where unit = b, k, m or g) - - Constrains the kernel memory available to a container. If a limit of 0 -is specified (not using `--kernel-memory`), the container's kernel memory -is not limited. If you specify a limit, it may be rounded up to a multiple -of the operating system's page size and the value can be very large, -millions of trillions. - -**-l**, **--label**=[] - Adds metadata to a container (e.g., --label=com.example.key=value) - -**--label-file**=[] - Read labels from a file. Delimit each label with an EOL. - -**--link**=[] - Add link to another container in the form of :alias or just - in which case the alias will match the name. - -**--link-local-ip**=[] - Add one or more link-local IPv4/IPv6 addresses to the container's interface - -**--log-driver**="*json-file*|*syslog*|*journald*|*gelf*|*fluentd*|*awslogs*|*splunk*|*etwlogs*|*gcplogs*|*none*" - Logging driver for the container. Default is defined by daemon `--log-driver` flag. - **Warning**: the `docker logs` command works only for the `json-file` and - `journald` logging drivers. - -**--log-opt**=[] - Logging driver specific options. - -**-m**, **--memory**="" - Memory limit (format: [], where unit = b, k, m or g) - - Allows you to constrain the memory available to a container. If the host -supports swap memory, then the **-m** memory setting can be larger than physical -RAM. If a limit of 0 is specified (not using **-m**), the container's memory is -not limited. The actual limit may be rounded up to a multiple of the operating -system's page size (the value would be very large, that's millions of trillions). - -**--mac-address**="" - Container MAC address (e.g. 92:d0:c6:0a:29:33) - -**--memory-reservation**="" - Memory soft limit (format: [], where unit = b, k, m or g) - - After setting memory reservation, when the system detects memory contention -or low memory, containers are forced to restrict their consumption to their -reservation. So you should always set the value below **--memory**, otherwise the -hard limit will take precedence. By default, memory reservation will be the same -as memory limit. - -**--memory-swap**="LIMIT" - A limit value equal to memory plus swap. Must be used with the **-m** -(**--memory**) flag. The swap `LIMIT` should always be larger than **-m** -(**--memory**) value. - - The format of `LIMIT` is `[]`. Unit can be `b` (bytes), -`k` (kilobytes), `m` (megabytes), or `g` (gigabytes). If you don't specify a -unit, `b` is used. Set LIMIT to `-1` to enable unlimited swap. - -**--memory-swappiness**="" - Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100. - -**--name**="" - Assign a name to the container - -**--network**="*bridge*" - Set the Network mode for the container - 'bridge': create a network stack on the default Docker bridge - 'none': no networking - 'container:': reuse another container's network stack - 'host': use the Docker host network stack. Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure. - '|': connect to a user-defined network - -**--network-alias**=[] - Add network-scoped alias for the container - -**--oom-kill-disable**=*true*|*false* - Whether to disable OOM Killer for the container or not. - -**--oom-score-adj**="" - Tune the host's OOM preferences for containers (accepts -1000 to 1000) - -**-P**, **--publish-all**=*true*|*false* - Publish all exposed ports to random ports on the host interfaces. The default is *false*. - -**-p**, **--publish**=[] - Publish a container's port, or a range of ports, to the host - format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort - Both hostPort and containerPort can be specified as a range of ports. - When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range. (e.g., `-p 1234-1236:1234-1236/tcp`) - (use 'docker port' to see the actual mapping) - -**--pid**="" - Set the PID mode for the container - Default is to create a private PID namespace for the container - 'container:': join another container's PID namespace - 'host': use the host's PID namespace for the container. Note: the host mode gives the container full access to local PID and is therefore considered insecure. - -**--userns**="" - Set the usernamespace mode for the container when `userns-remap` option is enabled. - **host**: use the host usernamespace and enable all privileged options (e.g., `pid=host` or `--privileged`). - -**--pids-limit**="" - Tune the container's pids limit. Set `-1` to have unlimited pids for the container. - -**--privileged**=*true*|*false* - Give extended privileges to this container. The default is *false*. - -**--read-only**=*true*|*false* - Mount the container's root filesystem as read only. - -**--restart**="*no*" - Restart policy to apply when a container exits (no, on-failure[:max-retry], always, unless-stopped). - -**--rm**=*true*|*false* - Automatically remove the container when it exits. The default is *false*. - -**--shm-size**="" - Size of `/dev/shm`. The format is ``. `number` must be greater than `0`. - Unit is optional and can be `b` (bytes), `k` (kilobytes), `m` (megabytes), or `g` (gigabytes). If you omit the unit, the system uses bytes. - If you omit the size entirely, the system uses `64m`. - -**--security-opt**=[] - Security Options - - "label:user:USER" : Set the label user for the container - "label:role:ROLE" : Set the label role for the container - "label:type:TYPE" : Set the label type for the container - "label:level:LEVEL" : Set the label level for the container - "label:disable" : Turn off label confinement for the container - "no-new-privileges" : Disable container processes from gaining additional privileges - "seccomp:unconfined" : Turn off seccomp confinement for the container - "seccomp:profile.json : White listed syscalls seccomp Json file to be used as a seccomp filter - -**--storage-opt**=[] - Storage driver options per container - - $ docker create -it --storage-opt size=120G fedora /bin/bash - - This (size) will allow to set the container rootfs size to 120G at creation time. - This option is only available for the `devicemapper`, `btrfs`, `overlay2` and `zfs` graph drivers. - For the `devicemapper`, `btrfs` and `zfs` storage drivers, user cannot pass a size less than the Default BaseFS Size. - For the `overlay2` storage driver, the size option is only available if the backing fs is `xfs` and mounted with the `pquota` mount option. - Under these conditions, user can pass any size less then the backing fs size. - -**--stop-signal**=*SIGTERM* - Signal to stop a container. Default is SIGTERM. - -**--stop-timeout**=*10* - Timeout (in seconds) to stop a container. Default is 10. - -**--sysctl**=SYSCTL - Configure namespaced kernel parameters at runtime - - IPC Namespace - current sysctls allowed: - - kernel.msgmax, kernel.msgmnb, kernel.msgmni, kernel.sem, kernel.shmall, kernel.shmmax, kernel.shmmni, kernel.shm_rmid_forced - Sysctls beginning with fs.mqueue.* - - Note: if you use --ipc=host using these sysctls will not be allowed. - - Network Namespace - current sysctls allowed: - Sysctls beginning with net.* - - Note: if you use --network=host using these sysctls will not be allowed. - -**-t**, **--tty**=*true*|*false* - Allocate a pseudo-TTY. The default is *false*. - -**--tmpfs**=[] Create a tmpfs mount - - Mount a temporary filesystem (`tmpfs`) mount into a container, for example: - - $ docker run -d --tmpfs /tmp:rw,size=787448k,mode=1777 my_image - - This command mounts a `tmpfs` at `/tmp` within the container. The supported mount -options are the same as the Linux default `mount` flags. If you do not specify -any options, the systems uses the following options: -`rw,noexec,nosuid,nodev,size=65536k`. - -**-u**, **--user**="" - Sets the username or UID used and optionally the groupname or GID for the specified command. - - The followings examples are all valid: - --user [user | user:group | uid | uid:gid | user:gid | uid:group ] - - Without this argument root user will be used in the container by default. - -**--ulimit**=[] - Ulimit options - -**--uts**=*host* - Set the UTS mode for the container - **host**: use the host's UTS namespace inside the container. - Note: the host mode gives the container access to changing the host's hostname and is therefore considered insecure. - -**-v**|**--volume**[=*[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]*] - Create a bind mount. If you specify, ` -v /HOST-DIR:/CONTAINER-DIR`, Docker - bind mounts `/HOST-DIR` in the host to `/CONTAINER-DIR` in the Docker - container. If 'HOST-DIR' is omitted, Docker automatically creates the new - volume on the host. The `OPTIONS` are a comma delimited list and can be: - - * [rw|ro] - * [z|Z] - * [`[r]shared`|`[r]slave`|`[r]private`] - -The `CONTAINER-DIR` must be an absolute path such as `/src/docs`. The `HOST-DIR` -can be an absolute path or a `name` value. A `name` value must start with an -alphanumeric character, followed by `a-z0-9`, `_` (underscore), `.` (period) or -`-` (hyphen). An absolute path starts with a `/` (forward slash). - -If you supply a `HOST-DIR` that is an absolute path, Docker bind-mounts to the -path you specify. If you supply a `name`, Docker creates a named volume by that -`name`. For example, you can specify either `/foo` or `foo` for a `HOST-DIR` -value. If you supply the `/foo` value, Docker creates a bind-mount. If you -supply the `foo` specification, Docker creates a named volume. - -You can specify multiple **-v** options to mount one or more mounts to a -container. To use these same mounts in other containers, specify the -**--volumes-from** option also. - -You can add `:ro` or `:rw` suffix to a volume to mount it read-only or -read-write mode, respectively. By default, the volumes are mounted read-write. -See examples. - -Labeling systems like SELinux require that proper labels are placed on volume -content mounted into a container. Without a label, the security system might -prevent the processes running inside the container from using the content. By -default, Docker does not change the labels set by the OS. - -To change a label in the container context, you can add either of two suffixes -`:z` or `:Z` to the volume mount. These suffixes tell Docker to relabel file -objects on the shared volumes. The `z` option tells Docker that two containers -share the volume content. As a result, Docker labels the content with a shared -content label. Shared volume labels allow all containers to read/write content. -The `Z` option tells Docker to label the content with a private unshared label. -Only the current container can use a private volume. - -By default bind mounted volumes are `private`. That means any mounts done -inside container will not be visible on host and vice-a-versa. One can change -this behavior by specifying a volume mount propagation property. Making a -volume `shared` mounts done under that volume inside container will be -visible on host and vice-a-versa. Making a volume `slave` enables only one -way mount propagation and that is mounts done on host under that volume -will be visible inside container but not the other way around. - -To control mount propagation property of volume one can use `:[r]shared`, -`:[r]slave` or `:[r]private` propagation flag. Propagation property can -be specified only for bind mounted volumes and not for internal volumes or -named volumes. For mount propagation to work source mount point (mount point -where source dir is mounted on) has to have right propagation properties. For -shared volumes, source mount point has to be shared. And for slave volumes, -source mount has to be either shared or slave. - -Use `df ` to figure out the source mount and then use -`findmnt -o TARGET,PROPAGATION ` to figure out propagation -properties of source mount. If `findmnt` utility is not available, then one -can look at mount entry for source mount point in `/proc/self/mountinfo`. Look -at `optional fields` and see if any propagaion properties are specified. -`shared:X` means mount is `shared`, `master:X` means mount is `slave` and if -nothing is there that means mount is `private`. - -To change propagation properties of a mount point use `mount` command. For -example, if one wants to bind mount source directory `/foo` one can do -`mount --bind /foo /foo` and `mount --make-private --make-shared /foo`. This -will convert /foo into a `shared` mount point. Alternatively one can directly -change propagation properties of source mount. Say `/` is source mount for -`/foo`, then use `mount --make-shared /` to convert `/` into a `shared` mount. - -> **Note**: -> When using systemd to manage the Docker daemon's start and stop, in the systemd -> unit file there is an option to control mount propagation for the Docker daemon -> itself, called `MountFlags`. The value of this setting may cause Docker to not -> see mount propagation changes made on the mount point. For example, if this value -> is `slave`, you may not be able to use the `shared` or `rshared` propagation on -> a volume. - - -To disable automatic copying of data from the container path to the volume, use -the `nocopy` flag. The `nocopy` flag can be set on bind mounts and named volumes. - -**--volume-driver**="" - Container's volume driver. This driver creates volumes specified either from - a Dockerfile's `VOLUME` instruction or from the `docker run -v` flag. - See **docker-volume-create(1)** for full details. - -**--volumes-from**=[] - Mount volumes from the specified container(s) - -**-w**, **--workdir**="" - Working directory inside the container - -# EXAMPLES - -## Specify isolation technology for container (--isolation) - -This option is useful in situations where you are running Docker containers on -Windows. The `--isolation=` option sets a container's isolation -technology. On Linux, the only supported is the `default` option which uses -Linux namespaces. On Microsoft Windows, you can specify these values: - -* `default`: Use the value specified by the Docker daemon's `--exec-opt` . If the `daemon` does not specify an isolation technology, Microsoft Windows uses `process` as its default value. -* `process`: Namespace isolation only. -* `hyperv`: Hyper-V hypervisor partition-based isolation. - -Specifying the `--isolation` flag without a value is the same as setting `--isolation="default"`. - -# HISTORY -August 2014, updated by Sven Dowideit -September 2014, updated by Sven Dowideit -November 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-diff.1.md b/vendor/github.com/docker/docker/man/docker-diff.1.md deleted file mode 100644 index 6c6c50253..000000000 --- a/vendor/github.com/docker/docker/man/docker-diff.1.md +++ /dev/null @@ -1,49 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-diff - Inspect changes on a container's filesystem - -# SYNOPSIS -**docker diff** -[**--help**] -CONTAINER - -# DESCRIPTION -Inspect changes on a container's filesystem. You can use the full or -shortened container ID or the container name set using -**docker run --name** option. - -# OPTIONS -**--help** - Print usage statement - -# EXAMPLES -Inspect the changes to on a nginx container: - - # docker diff 1fdfd1f54c1b - C /dev - C /dev/console - C /dev/core - C /dev/stdout - C /dev/fd - C /dev/ptmx - C /dev/stderr - C /dev/stdin - C /run - A /run/nginx.pid - C /var/lib/nginx/tmp - A /var/lib/nginx/tmp/client_body - A /var/lib/nginx/tmp/fastcgi - A /var/lib/nginx/tmp/proxy - A /var/lib/nginx/tmp/scgi - A /var/lib/nginx/tmp/uwsgi - C /var/log/nginx - A /var/log/nginx/access.log - A /var/log/nginx/error.log - - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-events.1.md b/vendor/github.com/docker/docker/man/docker-events.1.md deleted file mode 100644 index 51b042775..000000000 --- a/vendor/github.com/docker/docker/man/docker-events.1.md +++ /dev/null @@ -1,180 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-events - Get real time events from the server - -# SYNOPSIS -**docker events** -[**--help**] -[**-f**|**--filter**[=*[]*]] -[**--since**[=*SINCE*]] -[**--until**[=*UNTIL*]] -[**--format**[=*FORMAT*]] - - -# DESCRIPTION -Get event information from the Docker daemon. Information can include historical -information and real-time information. - -Docker containers will report the following events: - - attach, commit, copy, create, destroy, detach, die, exec_create, exec_detach, exec_start, export, kill, oom, pause, rename, resize, restart, start, stop, top, unpause, update - -Docker images report the following events: - - delete, import, load, pull, push, save, tag, untag - -Docker volumes report the following events: - - create, mount, unmount, destroy - -Docker networks report the following events: - - create, connect, disconnect, destroy - -# OPTIONS -**--help** - Print usage statement - -**-f**, **--filter**=[] - Filter output based on these conditions - - container (`container=`) - - event (`event=`) - - image (`image=`) - - plugin (experimental) (`plugin=`) - - label (`label=` or `label==`) - - type (`type=`) - - volume (`volume=`) - - network (`network=`) - - daemon (`daemon=`) - -**--since**="" - Show all events created since timestamp - -**--until**="" - Stream events until this timestamp - -**--format**="" - Format the output using the given Go template - -The `--since` and `--until` parameters can be Unix timestamps, date formatted -timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed -relative to the client machine's time. If you do not provide the `--since` option, -the command returns only new and/or live events. Supported formats for date -formatted time stamps include RFC3339Nano, RFC3339, `2006-01-02T15:04:05`, -`2006-01-02T15:04:05.999999999`, `2006-01-02Z07:00`, and `2006-01-02`. The local -timezone on the client will be used if you do not provide either a `Z` or a -`+-00:00` timezone offset at the end of the timestamp. When providing Unix -timestamps enter seconds[.nanoseconds], where seconds is the number of seconds -that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap -seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a -fraction of a second no more than nine digits long. - -# EXAMPLES - -## Listening for Docker events - -After running docker events a container 786d698004576 is started and stopped -(The container name has been shortened in the output below): - - # docker events - 2015-01-28T20:21:31.000000000-08:00 59211849bc10: (from whenry/testimage:latest) start - 2015-01-28T20:21:31.000000000-08:00 59211849bc10: (from whenry/testimage:latest) die - 2015-01-28T20:21:32.000000000-08:00 59211849bc10: (from whenry/testimage:latest) stop - -## Listening for events since a given date -Again the output container IDs have been shortened for the purposes of this document: - - # docker events --since '2015-01-28' - 2015-01-28T20:25:38.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) create - 2015-01-28T20:25:38.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) start - 2015-01-28T20:25:39.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) create - 2015-01-28T20:25:39.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) start - 2015-01-28T20:25:40.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) die - 2015-01-28T20:25:42.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) stop - 2015-01-28T20:25:45.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) start - 2015-01-28T20:25:45.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) die - 2015-01-28T20:25:46.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) stop - -The following example outputs all events that were generated in the last 3 minutes, -relative to the current time on the client machine: - - # docker events --since '3m' - 2015-05-12T11:51:30.999999999Z07:00 4386fb97867d: (from ubuntu-1:14.04) die - 2015-05-12T15:52:12.999999999Z07:00 4386fb97867d: (from ubuntu-1:14.04) stop - 2015-05-12T15:53:45.999999999Z07:00 7805c1d35632: (from redis:2.8) die - 2015-05-12T15:54:03.999999999Z07:00 7805c1d35632: (from redis:2.8) stop - -If you do not provide the --since option, the command returns only new and/or -live events. - -## Format - -If a format (`--format`) is specified, the given template will be executed -instead of the default format. Go's **text/template** package describes all the -details of the format. - - # docker events --filter 'type=container' --format 'Type={{.Type}} Status={{.Status}} ID={{.ID}}' - Type=container Status=create ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - Type=container Status=attach ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - Type=container Status=start ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - Type=container Status=resize ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - Type=container Status=die ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - Type=container Status=destroy ID=2ee349dac409e97974ce8d01b70d250b85e0ba8189299c126a87812311951e26 - -If a format is set to `{{json .}}`, the events are streamed as valid JSON -Lines. For information about JSON Lines, please refer to http://jsonlines.org/ . - - # docker events --format '{{json .}}' - {"status":"create","id":"196016a57679bf42424484918746a9474cd905dd993c4d0f4.. - {"status":"attach","id":"196016a57679bf42424484918746a9474cd905dd993c4d0f4.. - {"Type":"network","Action":"connect","Actor":{"ID":"1b50a5bf755f6021dfa78e.. - {"status":"start","id":"196016a57679bf42424484918746a9474cd905dd993c4d0f42.. - {"status":"resize","id":"196016a57679bf42424484918746a9474cd905dd993c4d0f4.. - -## Filters - - $ docker events --filter 'event=stop' - 2014-05-10T17:42:14.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - 2014-09-03T17:42:14.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - - $ docker events --filter 'image=ubuntu-1:14.04' - 2014-05-10T17:42:14.999999999Z07:00 container start 4386fb97867d (image=ubuntu-1:14.04) - 2014-05-10T17:42:14.999999999Z07:00 container die 4386fb97867d (image=ubuntu-1:14.04) - 2014-05-10T17:42:14.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - - $ docker events --filter 'container=7805c1d35632' - 2014-05-10T17:42:14.999999999Z07:00 container die 7805c1d35632 (image=redis:2.8) - 2014-09-03T15:49:29.999999999Z07:00 container stop 7805c1d35632 (image= redis:2.8) - - $ docker events --filter 'container=7805c1d35632' --filter 'container=4386fb97867d' - 2014-09-03T15:49:29.999999999Z07:00 container die 4386fb97867d (image=ubuntu-1:14.04) - 2014-05-10T17:42:14.999999999Z07:00 container stop 4386fb97867d (image=ubuntu-1:14.04) - 2014-05-10T17:42:14.999999999Z07:00 container die 7805c1d35632 (image=redis:2.8) - 2014-09-03T15:49:29.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - - $ docker events --filter 'container=7805c1d35632' --filter 'event=stop' - 2014-09-03T15:49:29.999999999Z07:00 container stop 7805c1d35632 (image=redis:2.8) - - $ docker events --filter 'type=volume' - 2015-12-23T21:05:28.136212689Z volume create test-event-volume-local (driver=local) - 2015-12-23T21:05:28.383462717Z volume mount test-event-volume-local (read/write=true, container=562fe10671e9273da25eed36cdce26159085ac7ee6707105fd534866340a5025, destination=/foo, driver=local, propagation=rprivate) - 2015-12-23T21:05:28.650314265Z volume unmount test-event-volume-local (container=562fe10671e9273da25eed36cdce26159085ac7ee6707105fd534866340a5025, driver=local) - 2015-12-23T21:05:28.716218405Z volume destroy test-event-volume-local (driver=local) - - $ docker events --filter 'type=network' - 2015-12-23T21:38:24.705709133Z network create 8b111217944ba0ba844a65b13efcd57dc494932ee2527577758f939315ba2c5b (name=test-event-network-local, type=bridge) - 2015-12-23T21:38:25.119625123Z network connect 8b111217944ba0ba844a65b13efcd57dc494932ee2527577758f939315ba2c5b (name=test-event-network-local, container=b4be644031a3d90b400f88ab3d4bdf4dc23adb250e696b6328b85441abe2c54e, type=bridge) - - $ docker events --filter 'type=plugin' (experimental) - 2016-07-25T17:30:14.825557616Z plugin pull ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/sample-volume-plugin:latest) - 2016-07-25T17:30:14.888127370Z plugin enable ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/sample-volume-plugin:latest) - - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -June 2015, updated by Brian Goff -October 2015, updated by Mike Brown diff --git a/vendor/github.com/docker/docker/man/docker-exec.1.md b/vendor/github.com/docker/docker/man/docker-exec.1.md deleted file mode 100644 index fe9c279e7..000000000 --- a/vendor/github.com/docker/docker/man/docker-exec.1.md +++ /dev/null @@ -1,71 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-exec - Run a command in a running container - -# SYNOPSIS -**docker exec** -[**-d**|**--detach**] -[**--detach-keys**[=*[]*]] -[**-e**|**--env**[=*[]*]] -[**--help**] -[**-i**|**--interactive**] -[**--privileged**] -[**-t**|**--tty**] -[**-u**|**--user**[=*USER*]] -CONTAINER COMMAND [ARG...] - -# DESCRIPTION - -Run a process in a running container. - -The command started using `docker exec` will only run while the container's primary -process (`PID 1`) is running, and will not be restarted if the container is restarted. - -If the container is paused, then the `docker exec` command will wait until the -container is unpaused, and then run - -# OPTIONS -**-d**, **--detach**=*true*|*false* - Detached mode: run command in the background. The default is *false*. - -**--detach-keys**="" - Override the key sequence for detaching a container. Format is a single character `[a-Z]` or `ctrl-` where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**-e**, **--env**=[] - Set environment variables - - This option allows you to specify arbitrary environment variables that are -available for the command to be executed. - -**--help** - Print usage statement - -**-i**, **--interactive**=*true*|*false* - Keep STDIN open even if not attached. The default is *false*. - -**--privileged**=*true*|*false* - Give the process extended [Linux capabilities](http://man7.org/linux/man-pages/man7/capabilities.7.html) -when running in a container. The default is *false*. - - Without this flag, the process run by `docker exec` in a running container has -the same capabilities as the container, which may be limited. Set -`--privileged` to give all capabilities to the process. - -**-t**, **--tty**=*true*|*false* - Allocate a pseudo-TTY. The default is *false*. - -**-u**, **--user**="" - Sets the username or UID used and optionally the groupname or GID for the specified command. - - The followings examples are all valid: - --user [user | user:group | uid | uid:gid | user:gid | uid:group ] - - Without this argument the command will be run as root in the container. - -The **-t** option is incompatible with a redirection of the docker client -standard input. - -# HISTORY -November 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-export.1.md b/vendor/github.com/docker/docker/man/docker-export.1.md deleted file mode 100644 index 3d59e4788..000000000 --- a/vendor/github.com/docker/docker/man/docker-export.1.md +++ /dev/null @@ -1,46 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-export - Export the contents of a container's filesystem as a tar archive - -# SYNOPSIS -**docker export** -[**--help**] -[**-o**|**--output**[=*""*]] -CONTAINER - -# DESCRIPTION -Export the contents of a container's filesystem using the full or shortened -container ID or container name. The output is exported to STDOUT and can be -redirected to a tar file. - -Stream to a file instead of STDOUT by using **-o**. - -# OPTIONS -**--help** - Print usage statement - -**-o**, **--output**="" - Write to a file, instead of STDOUT - -# EXAMPLES -Export the contents of the container called angry_bell to a tar file -called angry_bell.tar: - - # docker export angry_bell > angry_bell.tar - # docker export --output=angry_bell-latest.tar angry_bell - # ls -sh angry_bell.tar - 321M angry_bell.tar - # ls -sh angry_bell-latest.tar - 321M angry_bell-latest.tar - -# See also -**docker-import(1)** to create an empty filesystem image -and import the contents of the tarball into it, then optionally tag it. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -January 2015, updated by Joseph Kern (josephakern at gmail dot com) diff --git a/vendor/github.com/docker/docker/man/docker-history.1.md b/vendor/github.com/docker/docker/man/docker-history.1.md deleted file mode 100644 index 91edefe25..000000000 --- a/vendor/github.com/docker/docker/man/docker-history.1.md +++ /dev/null @@ -1,52 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-history - Show the history of an image - -# SYNOPSIS -**docker history** -[**--help**] -[**-H**|**--human**[=*true*]] -[**--no-trunc**] -[**-q**|**--quiet**] -IMAGE - -# DESCRIPTION - -Show the history of when and how an image was created. - -# OPTIONS -**--help** - Print usage statement - -**-H**, **--human**=*true*|*false* - Print sizes and dates in human readable format. The default is *true*. - -**--no-trunc**=*true*|*false* - Don't truncate output. The default is *false*. - -**-q**, **--quiet**=*true*|*false* - Only show numeric IDs. The default is *false*. - -# EXAMPLES - $ docker history fedora - IMAGE CREATED CREATED BY SIZE COMMENT - 105182bb5e8b 5 days ago /bin/sh -c #(nop) ADD file:71356d2ad59aa3119d 372.7 MB - 73bd853d2ea5 13 days ago /bin/sh -c #(nop) MAINTAINER Lokesh Mandvekar 0 B - 511136ea3c5a 10 months ago 0 B Imported from - - -## Display comments in the image history -The `docker commit` command has a **-m** flag for adding comments to the image. These comments will be displayed in the image history. - - $ sudo docker history docker:scm - IMAGE CREATED CREATED BY SIZE COMMENT - 2ac9d1098bf1 3 months ago /bin/bash 241.4 MB Added Apache to Fedora base image - 88b42ffd1f7c 5 months ago /bin/sh -c #(nop) ADD file:1fd8d7f9f6557cafc7 373.7 MB - c69cab00d6ef 5 months ago /bin/sh -c #(nop) MAINTAINER Lokesh Mandvekar 0 B - 511136ea3c5a 19 months ago 0 B Imported from - - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-images.1.md b/vendor/github.com/docker/docker/man/docker-images.1.md deleted file mode 100644 index d7958d0dc..000000000 --- a/vendor/github.com/docker/docker/man/docker-images.1.md +++ /dev/null @@ -1,153 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-images - List images - -# SYNOPSIS -**docker images** -[**--help**] -[**-a**|**--all**] -[**--digests**] -[**-f**|**--filter**[=*[]*]] -[**--format**=*"TEMPLATE"*] -[**--no-trunc**] -[**-q**|**--quiet**] -[REPOSITORY[:TAG]] - -# DESCRIPTION -This command lists the images stored in the local Docker repository. - -By default, intermediate images, used during builds, are not listed. Some of the -output, e.g., image ID, is truncated, for space reasons. However the truncated -image ID, and often the first few characters, are enough to be used in other -Docker commands that use the image ID. The output includes repository, tag, image -ID, date created and the virtual size. - -The title REPOSITORY for the first title may seem confusing. It is essentially -the image name. However, because you can tag a specific image, and multiple tags -(image instances) can be associated with a single name, the name is really a -repository for all tagged images of the same name. For example consider an image -called fedora. It may be tagged with 18, 19, or 20, etc. to manage different -versions. - -# OPTIONS -**-a**, **--all**=*true*|*false* - Show all images (by default filter out the intermediate image layers). The default is *false*. - -**--digests**=*true*|*false* - Show image digests. The default is *false*. - -**-f**, **--filter**=[] - Filters the output based on these conditions: - - dangling=(true|false) - find unused images - - label= or label== - - before=([:tag]||) - - since=([:tag]||) - -**--format**="*TEMPLATE*" - Pretty-print images using a Go template. - Valid placeholders: - .ID - Image ID - .Repository - Image repository - .Tag - Image tag - .Digest - Image digest - .CreatedSince - Elapsed time since the image was created - .CreatedAt - Time when the image was created - .Size - Image disk size - -**--help** - Print usage statement - -**--no-trunc**=*true*|*false* - Don't truncate output. The default is *false*. - -**-q**, **--quiet**=*true*|*false* - Only show numeric IDs. The default is *false*. - -# EXAMPLES - -## Listing the images - -To list the images in a local repository (not the registry) run: - - docker images - -The list will contain the image repository name, a tag for the image, and an -image ID, when it was created and its virtual size. Columns: REPOSITORY, TAG, -IMAGE ID, CREATED, and SIZE. - -The `docker images` command takes an optional `[REPOSITORY[:TAG]]` argument -that restricts the list to images that match the argument. If you specify -`REPOSITORY`but no `TAG`, the `docker images` command lists all images in the -given repository. - - docker images java - -The `[REPOSITORY[:TAG]]` value must be an "exact match". This means that, for example, -`docker images jav` does not match the image `java`. - -If both `REPOSITORY` and `TAG` are provided, only images matching that -repository and tag are listed. To find all local images in the "java" -repository with tag "8" you can use: - - docker images java:8 - -To get a verbose list of images which contains all the intermediate images -used in builds use **-a**: - - docker images -a - -Previously, the docker images command supported the --tree and --dot arguments, -which displayed different visualizations of the image data. Docker core removed -this functionality in the 1.7 version. If you liked this functionality, you can -still find it in the third-party dockviz tool: https://github.com/justone/dockviz. - -## Listing images in a desired format - -When using the --format option, the image command will either output the data -exactly as the template declares or, when using the `table` directive, will -include column headers as well. You can use special characters like `\t` for -inserting tab spacing between columns. - -The following example uses a template without headers and outputs the ID and -Repository entries separated by a colon for all images: - - docker images --format "{{.ID}}: {{.Repository}}" - 77af4d6b9913: - b6fa739cedf5: committ - 78a85c484bad: ipbabble - 30557a29d5ab: docker - 5ed6274db6ce: - 746b819f315e: postgres - 746b819f315e: postgres - 746b819f315e: postgres - 746b819f315e: postgres - -To list all images with their repository and tag in a table format you can use: - - docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}" - IMAGE ID REPOSITORY TAG - 77af4d6b9913 - b6fa739cedf5 committ latest - 78a85c484bad ipbabble - 30557a29d5ab docker latest - 5ed6274db6ce - 746b819f315e postgres 9 - 746b819f315e postgres 9.3 - 746b819f315e postgres 9.3.5 - 746b819f315e postgres latest - -Valid template placeholders are listed above. - -## Listing only the shortened image IDs - -Listing just the shortened image IDs. This can be useful for some automated -tools. - - docker images -q - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-import.1.md b/vendor/github.com/docker/docker/man/docker-import.1.md deleted file mode 100644 index 43d65efe6..000000000 --- a/vendor/github.com/docker/docker/man/docker-import.1.md +++ /dev/null @@ -1,72 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-import - Create an empty filesystem image and import the contents of the tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then optionally tag it. - -# SYNOPSIS -**docker import** -[**-c**|**--change**[=*[]*]] -[**-m**|**--message**[=*MESSAGE*]] -[**--help**] -file|URL|**-**[REPOSITORY[:TAG]] - -# OPTIONS -**-c**, **--change**=[] - Apply specified Dockerfile instructions while importing the image - Supported Dockerfile instructions: `CMD`|`ENTRYPOINT`|`ENV`|`EXPOSE`|`ONBUILD`|`USER`|`VOLUME`|`WORKDIR` - -**--help** - Print usage statement - -**-m**, **--message**="" - Set commit message for imported image - -# DESCRIPTION -Create a new filesystem image from the contents of a tarball (`.tar`, -`.tar.gz`, `.tgz`, `.bzip`, `.tar.xz`, `.txz`) into it, then optionally tag it. - - -# EXAMPLES - -## Import from a remote location - - # docker import http://example.com/exampleimage.tgz example/imagerepo - -## Import from a local file - -Import to docker via pipe and stdin: - - # cat exampleimage.tgz | docker import - example/imagelocal - -Import with a commit message. - - # cat exampleimage.tgz | docker import --message "New image imported from tarball" - exampleimagelocal:new - -Import to a Docker image from a local file. - - # docker import /path/to/exampleimage.tgz - - -## Import from a local file and tag - -Import to docker via pipe and stdin: - - # cat exampleimageV2.tgz | docker import - example/imagelocal:V-2.0 - -## Import from a local directory - - # tar -c . | docker import - exampleimagedir - -## Apply specified Dockerfile instructions while importing the image -This example sets the docker image ENV variable DEBUG to true by default. - - # tar -c . | docker import -c="ENV DEBUG true" - exampleimagedir - -# See also -**docker-export(1)** to export the contents of a filesystem as a tar archive to STDOUT. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-info.1.md b/vendor/github.com/docker/docker/man/docker-info.1.md deleted file mode 100644 index bb7a8fb4c..000000000 --- a/vendor/github.com/docker/docker/man/docker-info.1.md +++ /dev/null @@ -1,187 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-info - Display system-wide information - -# SYNOPSIS -**docker info** -[**--help**] -[**-f**|**--format**[=*FORMAT*]] - -# DESCRIPTION -This command displays system wide information regarding the Docker installation. -Information displayed includes the kernel version, number of containers and images. -The number of images shown is the number of unique images. The same image tagged -under different names is counted only once. - -If a format is specified, the given template will be executed instead of the -default format. Go's **text/template** package -describes all the details of the format. - -Depending on the storage driver in use, additional information can be shown, such -as pool name, data file, metadata file, data space used, total data space, metadata -space used, and total metadata space. - -The data file is where the images are stored and the metadata file is where the -meta data regarding those images are stored. When run for the first time Docker -allocates a certain amount of data space and meta data space from the space -available on the volume where `/var/lib/docker` is mounted. - -# OPTIONS -**--help** - Print usage statement - -**-f**, **--format**="" - Format the output using the given Go template - -# EXAMPLES - -## Display Docker system information - -Here is a sample output for a daemon running on Ubuntu, using the overlay2 -storage driver: - - $ docker -D info - Containers: 14 - Running: 3 - Paused: 1 - Stopped: 10 - Images: 52 - Server Version: 1.13.0 - Storage Driver: overlay2 - Backing Filesystem: extfs - Supports d_type: true - Native Overlay Diff: false - Logging Driver: json-file - Cgroup Driver: cgroupfs - Plugins: - Volume: local - Network: bridge host macvlan null overlay - Swarm: active - NodeID: rdjq45w1op418waxlairloqbm - Is Manager: true - ClusterID: te8kdyw33n36fqiz74bfjeixd - Managers: 1 - Nodes: 2 - Orchestration: - Task History Retention Limit: 5 - Raft: - Snapshot Interval: 10000 - Number of Old Snapshots to Retain: 0 - Heartbeat Tick: 1 - Election Tick: 3 - Dispatcher: - Heartbeat Period: 5 seconds - CA Configuration: - Expiry Duration: 3 months - Node Address: 172.16.66.128 172.16.66.129 - Manager Addresses: - 172.16.66.128:2477 - Runtimes: runc - Default Runtime: runc - Init Binary: docker-init - containerd version: 8517738ba4b82aff5662c97ca4627e7e4d03b531 - runc version: ac031b5bf1cc92239461125f4c1ffb760522bbf2 - init version: N/A (expected: v0.13.0) - Security Options: - apparmor - seccomp - Profile: default - Kernel Version: 4.4.0-31-generic - Operating System: Ubuntu 16.04.1 LTS - OSType: linux - Architecture: x86_64 - CPUs: 2 - Total Memory: 1.937 GiB - Name: ubuntu - ID: H52R:7ZR6:EIIA:76JG:ORIY:BVKF:GSFU:HNPG:B5MK:APSC:SZ3Q:N326 - Docker Root Dir: /var/lib/docker - Debug Mode (client): true - Debug Mode (server): true - File Descriptors: 30 - Goroutines: 123 - System Time: 2016-11-12T17:24:37.955404361-08:00 - EventsListeners: 0 - Http Proxy: http://test:test@proxy.example.com:8080 - Https Proxy: https://test:test@proxy.example.com:8080 - No Proxy: localhost,127.0.0.1,docker-registry.somecorporation.com - Registry: https://index.docker.io/v1/ - WARNING: No swap limit support - Labels: - storage=ssd - staging=true - Experimental: false - Insecure Registries: - 127.0.0.0/8 - Registry Mirrors: - http://192.168.1.2/ - http://registry-mirror.example.com:5000/ - Live Restore Enabled: false - - - -The global `-D` option tells all `docker` commands to output debug information. - -The example below shows the output for a daemon running on Red Hat Enterprise Linux, -using the devicemapper storage driver. As can be seen in the output, additional -information about the devicemapper storage driver is shown: - - $ docker info - Containers: 14 - Running: 3 - Paused: 1 - Stopped: 10 - Untagged Images: 52 - Server Version: 1.10.3 - Storage Driver: devicemapper - Pool Name: docker-202:2-25583803-pool - Pool Blocksize: 65.54 kB - Base Device Size: 10.74 GB - Backing Filesystem: xfs - Data file: /dev/loop0 - Metadata file: /dev/loop1 - Data Space Used: 1.68 GB - Data Space Total: 107.4 GB - Data Space Available: 7.548 GB - Metadata Space Used: 2.322 MB - Metadata Space Total: 2.147 GB - Metadata Space Available: 2.145 GB - Udev Sync Supported: true - Deferred Removal Enabled: false - Deferred Deletion Enabled: false - Deferred Deleted Device Count: 0 - Data loop file: /var/lib/docker/devicemapper/devicemapper/data - Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata - Library Version: 1.02.107-RHEL7 (2015-12-01) - Execution Driver: native-0.2 - Logging Driver: json-file - Plugins: - Volume: local - Network: null host bridge - Kernel Version: 3.10.0-327.el7.x86_64 - Operating System: Red Hat Enterprise Linux Server 7.2 (Maipo) - OSType: linux - Architecture: x86_64 - CPUs: 1 - Total Memory: 991.7 MiB - Name: ip-172-30-0-91.ec2.internal - ID: I54V:OLXT:HVMM:TPKO:JPHQ:CQCD:JNLC:O3BZ:4ZVJ:43XJ:PFHZ:6N2S - Docker Root Dir: /var/lib/docker - Debug mode (client): false - Debug mode (server): false - Username: gordontheturtle - Registry: https://index.docker.io/v1/ - Insecure registries: - myinsecurehost:5000 - 127.0.0.0/8 - -You can also specify the output format: - - $ docker info --format '{{json .}}' - {"ID":"I54V:OLXT:HVMM:TPKO:JPHQ:CQCD:JNLC:O3BZ:4ZVJ:43XJ:PFHZ:6N2S","Containers":14, ...} - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-inspect.1.md b/vendor/github.com/docker/docker/man/docker-inspect.1.md deleted file mode 100644 index 21d7ba678..000000000 --- a/vendor/github.com/docker/docker/man/docker-inspect.1.md +++ /dev/null @@ -1,323 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-inspect - Return low-level information on docker objects - -# SYNOPSIS -**docker inspect** -[**--help**] -[**-f**|**--format**[=*FORMAT*]] -[**-s**|**--size**] -[**--type**=*container*|*image*|*network*|*node*|*service*|*task*|*volume*] -NAME|ID [NAME|ID...] - -# DESCRIPTION - -This displays the low-level information on Docker object(s) (e.g. container, -image, volume,network, node, service, or task) identified by name or ID. By default, -this will render all results in a JSON array. If the container and image have -the same name, this will return container JSON for unspecified type. If a format -is specified, the given template will be executed for each result. - -# OPTIONS -**--help** - Print usage statement - -**-f**, **--format**="" - Format the output using the given Go template - -**-s**, **--size** - Display total file sizes if the type is container - -**--type**=*container*|*image*|*network*|*node*|*service*|*task*|*volume* - Return JSON for specified type, permissible values are "image", "container", - "network", "node", "service", "task", and "volume" - -# EXAMPLES - -Get information about an image when image name conflicts with the container name, -e.g. both image and container are named rhel7: - - $ docker inspect --type=image rhel7 - [ - { - "Id": "fe01a428b9d9de35d29531e9994157978e8c48fa693e1bf1d221dffbbb67b170", - "Parent": "10acc31def5d6f249b548e01e8ffbaccfd61af0240c17315a7ad393d022c5ca2", - .... - } - ] - -## Getting information on a container - -To get information on a container use its ID or instance name: - - $ docker inspect d2cc496561d6 - [{ - "Id": "d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47", - "Created": "2015-06-08T16:18:02.505155285Z", - "Path": "bash", - "Args": [], - "State": { - "Running": false, - "Paused": false, - "Restarting": false, - "OOMKilled": false, - "Dead": false, - "Pid": 0, - "ExitCode": 0, - "Error": "", - "StartedAt": "2015-06-08T16:18:03.643865954Z", - "FinishedAt": "2015-06-08T16:57:06.448552862Z" - }, - "Image": "ded7cd95e059788f2586a51c275a4f151653779d6a7f4dad77c2bd34601d94e4", - "NetworkSettings": { - "Bridge": "", - "SandboxID": "6b4851d1903e16dd6a567bd526553a86664361f31036eaaa2f8454d6f4611f6f", - "HairpinMode": false, - "LinkLocalIPv6Address": "", - "LinkLocalIPv6PrefixLen": 0, - "Ports": {}, - "SandboxKey": "/var/run/docker/netns/6b4851d1903e", - "SecondaryIPAddresses": null, - "SecondaryIPv6Addresses": null, - "EndpointID": "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d", - "Gateway": "172.17.0.1", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "MacAddress": "02:42:ac:12:00:02", - "Networks": { - "bridge": { - "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", - "EndpointID": "7587b82f0dada3656fda26588aee72630c6fab1536d36e394b2bfbcf898c971d", - "Gateway": "172.17.0.1", - "IPAddress": "172.17.0.2", - "IPPrefixLen": 16, - "IPv6Gateway": "", - "GlobalIPv6Address": "", - "GlobalIPv6PrefixLen": 0, - "MacAddress": "02:42:ac:12:00:02" - } - } - - }, - "ResolvConfPath": "/var/lib/docker/containers/d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47/resolv.conf", - "HostnamePath": "/var/lib/docker/containers/d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47/hostname", - "HostsPath": "/var/lib/docker/containers/d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47/hosts", - "LogPath": "/var/lib/docker/containers/d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47/d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47-json.log", - "Name": "/adoring_wozniak", - "RestartCount": 0, - "Driver": "devicemapper", - "MountLabel": "", - "ProcessLabel": "", - "Mounts": [ - { - "Source": "/data", - "Destination": "/data", - "Mode": "ro,Z", - "RW": false - "Propagation": "" - } - ], - "AppArmorProfile": "", - "ExecIDs": null, - "HostConfig": { - "Binds": null, - "ContainerIDFile": "", - "Memory": 0, - "MemorySwap": 0, - "CpuShares": 0, - "CpuPeriod": 0, - "CpusetCpus": "", - "CpusetMems": "", - "CpuQuota": 0, - "BlkioWeight": 0, - "OomKillDisable": false, - "Privileged": false, - "PortBindings": {}, - "Links": null, - "PublishAllPorts": false, - "Dns": null, - "DnsSearch": null, - "DnsOptions": null, - "ExtraHosts": null, - "VolumesFrom": null, - "Devices": [], - "NetworkMode": "bridge", - "IpcMode": "", - "PidMode": "", - "UTSMode": "", - "CapAdd": null, - "CapDrop": null, - "RestartPolicy": { - "Name": "no", - "MaximumRetryCount": 0 - }, - "SecurityOpt": null, - "ReadonlyRootfs": false, - "Ulimits": null, - "LogConfig": { - "Type": "json-file", - "Config": {} - }, - "CgroupParent": "" - }, - "GraphDriver": { - "Name": "devicemapper", - "Data": { - "DeviceId": "5", - "DeviceName": "docker-253:1-2763198-d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47", - "DeviceSize": "171798691840" - } - }, - "Config": { - "Hostname": "d2cc496561d6", - "Domainname": "", - "User": "", - "AttachStdin": true, - "AttachStdout": true, - "AttachStderr": true, - "ExposedPorts": null, - "Tty": true, - "OpenStdin": true, - "StdinOnce": true, - "Env": null, - "Cmd": [ - "bash" - ], - "Image": "fedora", - "Volumes": null, - "VolumeDriver": "", - "WorkingDir": "", - "Entrypoint": null, - "NetworkDisabled": false, - "MacAddress": "", - "OnBuild": null, - "Labels": {}, - "Memory": 0, - "MemorySwap": 0, - "CpuShares": 0, - "Cpuset": "", - "StopSignal": "SIGTERM" - } - } - ] -## Getting the IP address of a container instance - -To get the IP address of a container use: - - $ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' d2cc496561d6 - 172.17.0.2 - -## Listing all port bindings - -One can loop over arrays and maps in the results to produce simple text -output: - - $ docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} \ - {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' d2cc496561d6 - 80/tcp -> 80 - -You can get more information about how to write a Go template from: -https://golang.org/pkg/text/template/. - -## Getting size information on a container - - $ docker inspect -s d2cc496561d6 - [ - { - .... - "SizeRw": 0, - "SizeRootFs": 972, - .... - } - ] - -## Getting information on an image - -Use an image's ID or name (e.g., repository/name[:tag]) to get information -about the image: - - $ docker inspect ded7cd95e059 - [{ - "Id": "ded7cd95e059788f2586a51c275a4f151653779d6a7f4dad77c2bd34601d94e4", - "Parent": "48ecf305d2cf7046c1f5f8fcbcd4994403173441d4a7f125b1bb0ceead9de731", - "Comment": "", - "Created": "2015-05-27T16:58:22.937503085Z", - "Container": "76cf7f67d83a7a047454b33007d03e32a8f474ad332c3a03c94537edd22b312b", - "ContainerConfig": { - "Hostname": "76cf7f67d83a", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "ExposedPorts": null, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "/bin/sh", - "-c", - "#(nop) ADD file:4be46382bcf2b095fcb9fe8334206b584eff60bb3fad8178cbd97697fcb2ea83 in /" - ], - "Image": "48ecf305d2cf7046c1f5f8fcbcd4994403173441d4a7f125b1bb0ceead9de731", - "Volumes": null, - "VolumeDriver": "", - "WorkingDir": "", - "Entrypoint": null, - "NetworkDisabled": false, - "MacAddress": "", - "OnBuild": null, - "Labels": {} - }, - "DockerVersion": "1.6.0", - "Author": "Lokesh Mandvekar \u003clsm5@fedoraproject.org\u003e", - "Config": { - "Hostname": "76cf7f67d83a", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": false, - "AttachStderr": false, - "ExposedPorts": null, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": null, - "Image": "48ecf305d2cf7046c1f5f8fcbcd4994403173441d4a7f125b1bb0ceead9de731", - "Volumes": null, - "VolumeDriver": "", - "WorkingDir": "", - "Entrypoint": null, - "NetworkDisabled": false, - "MacAddress": "", - "OnBuild": null, - "Labels": {} - }, - "Architecture": "amd64", - "Os": "linux", - "Size": 186507296, - "VirtualSize": 186507296, - "GraphDriver": { - "Name": "devicemapper", - "Data": { - "DeviceId": "3", - "DeviceName": "docker-253:1-2763198-ded7cd95e059788f2586a51c275a4f151653779d6a7f4dad77c2bd34601d94e4", - "DeviceSize": "171798691840" - } - } - } - ] - -# HISTORY -April 2014, originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -April 2015, updated by Qiang Huang -October 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/docker-kill.1.md b/vendor/github.com/docker/docker/man/docker-kill.1.md deleted file mode 100644 index 36cbdb90e..000000000 --- a/vendor/github.com/docker/docker/man/docker-kill.1.md +++ /dev/null @@ -1,28 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-kill - Kill a running container using SIGKILL or a specified signal - -# SYNOPSIS -**docker kill** -[**--help**] -[**-s**|**--signal**[=*"KILL"*]] -CONTAINER [CONTAINER...] - -# DESCRIPTION - -The main process inside each container specified will be sent SIGKILL, - or any signal specified with option --signal. - -# OPTIONS -**--help** - Print usage statement - -**-s**, **--signal**="*KILL*" - Signal to send to the container - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) - based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-load.1.md b/vendor/github.com/docker/docker/man/docker-load.1.md deleted file mode 100644 index b16517304..000000000 --- a/vendor/github.com/docker/docker/man/docker-load.1.md +++ /dev/null @@ -1,56 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-load - Load an image from a tar archive or STDIN - -# SYNOPSIS -**docker load** -[**--help**] -[**-i**|**--input**[=*INPUT*]] -[**-q**|**--quiet**] - -# DESCRIPTION - -Loads a tarred repository from a file or the standard input stream. -Restores both images and tags. Write image names or IDs imported it -standard output stream. - -# OPTIONS -**--help** - Print usage statement - -**-i**, **--input**="" - Read from a tar archive file, instead of STDIN. The tarball may be compressed with gzip, bzip, or xz. - -**-q**, **--quiet** - Suppress the load progress bar but still outputs the imported images. - -# EXAMPLES - - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - busybox latest 769b9341d937 7 weeks ago 2.489 MB - $ docker load --input fedora.tar - # […] - Loaded image: fedora:rawhide - # […] - Loaded image: fedora:20 - # […] - $ docker images - REPOSITORY TAG IMAGE ID CREATED SIZE - busybox latest 769b9341d937 7 weeks ago 2.489 MB - fedora rawhide 0d20aec6529d 7 weeks ago 387 MB - fedora 20 58394af37342 7 weeks ago 385.5 MB - fedora heisenbug 58394af37342 7 weeks ago 385.5 MB - fedora latest 58394af37342 7 weeks ago 385.5 MB - -# See also -**docker-save(1)** to save one or more images to a tar archive (streamed to STDOUT by default). - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -July 2015 update by Mary Anthony -June 2016 update by Vincent Demeester diff --git a/vendor/github.com/docker/docker/man/docker-login.1.md b/vendor/github.com/docker/docker/man/docker-login.1.md deleted file mode 100644 index c0d4f795d..000000000 --- a/vendor/github.com/docker/docker/man/docker-login.1.md +++ /dev/null @@ -1,53 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-login - Log in to a Docker registry. - -# SYNOPSIS -**docker login** -[**--help**] -[**-p**|**--password**[=*PASSWORD*]] -[**-u**|**--username**[=*USERNAME*]] -[SERVER] - -# DESCRIPTION -Log in to a Docker Registry located on the specified -`SERVER`. You can specify a URL or a `hostname` for the `SERVER` value. If you -do not specify a `SERVER`, the command uses Docker's public registry located at -`https://registry-1.docker.io/` by default. To get a username/password for Docker's public registry, create an account on Docker Hub. - -`docker login` requires user to use `sudo` or be `root`, except when: - -1. connecting to a remote daemon, such as a `docker-machine` provisioned `docker engine`. -2. user is added to the `docker` group. This will impact the security of your system; the `docker` group is `root` equivalent. See [Docker Daemon Attack Surface](https://docs.docker.com/engine/articles/security/#docker-daemon-attack-surface) for details. - -You can log into any public or private repository for which you have -credentials. When you log in, the command stores encoded credentials in -`$HOME/.docker/config.json` on Linux or `%USERPROFILE%/.docker/config.json` on Windows. - -# OPTIONS -**--help** - Print usage statement - -**-p**, **--password**="" - Password - -**-u**, **--username**="" - Username - -# EXAMPLES - -## Login to a registry on your localhost - - # docker login localhost:8080 - -# See also -**docker-logout(1)** to log out from a Docker registry. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 -November 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/docker-logout.1.md b/vendor/github.com/docker/docker/man/docker-logout.1.md deleted file mode 100644 index a8a4b7c3c..000000000 --- a/vendor/github.com/docker/docker/man/docker-logout.1.md +++ /dev/null @@ -1,32 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-logout - Log out from a Docker registry. - -# SYNOPSIS -**docker logout** -[SERVER] - -# DESCRIPTION -Log out of a Docker Registry located on the specified `SERVER`. You can -specify a URL or a `hostname` for the `SERVER` value. If you do not specify a -`SERVER`, the command attempts to log you out of Docker's public registry -located at `https://registry-1.docker.io/` by default. - -# OPTIONS -There are no available options. - -# EXAMPLES - -## Log out from a registry on your localhost - - # docker logout localhost:8080 - -# See also -**docker-login(1)** to log in to a Docker registry server. - -# HISTORY -June 2014, Originally compiled by Daniel, Dao Quang Minh (daniel at nitrous dot io) -July 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 diff --git a/vendor/github.com/docker/docker/man/docker-logs.1.md b/vendor/github.com/docker/docker/man/docker-logs.1.md deleted file mode 100644 index e70f796e2..000000000 --- a/vendor/github.com/docker/docker/man/docker-logs.1.md +++ /dev/null @@ -1,71 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-logs - Fetch the logs of a container - -# SYNOPSIS -**docker logs** -[**-f**|**--follow**] -[**--help**] -[**--since**[=*SINCE*]] -[**-t**|**--timestamps**] -[**--tail**[=*"all"*]] -CONTAINER - -# DESCRIPTION -The **docker logs** command batch-retrieves whatever logs are present for -a container at the time of execution. This does not guarantee execution -order when combined with a docker run (i.e., your run may not have generated -any logs at the time you execute docker logs). - -The **docker logs --follow** command combines commands **docker logs** and -**docker attach**. It will first return all logs from the beginning and -then continue streaming new output from the container's stdout and stderr. - -**Warning**: This command works only for the **json-file** or **journald** -logging drivers. - -# OPTIONS -**--help** - Print usage statement - -**--details**=*true*|*false* - Show extra details provided to logs - -**-f**, **--follow**=*true*|*false* - Follow log output. The default is *false*. - -**--since**="" - Show logs since timestamp - -**-t**, **--timestamps**=*true*|*false* - Show timestamps. The default is *false*. - -**--tail**="*all*" - Output the specified number of lines at the end of logs (defaults to all logs) - -The `--since` option can be Unix timestamps, date formatted timestamps, or Go -duration strings (e.g. `10m`, `1h30m`) computed relative to the client machine's -time. Supported formats for date formatted time stamps include RFC3339Nano, -RFC3339, `2006-01-02T15:04:05`, `2006-01-02T15:04:05.999999999`, -`2006-01-02Z07:00`, and `2006-01-02`. The local timezone on the client will be -used if you do not provide either a `Z` or a `+-00:00` timezone offset at the -end of the timestamp. When providing Unix timestamps enter -seconds[.nanoseconds], where seconds is the number of seconds that have elapsed -since January 1, 1970 (midnight UTC/GMT), not counting leap seconds (aka Unix -epoch or Unix time), and the optional .nanoseconds field is a fraction of a -second no more than nine digits long. You can combine the `--since` option with -either or both of the `--follow` or `--tail` options. - -The `docker logs --details` command will add on extra attributes, such as -environment variables and labels, provided to `--log-opt` when creating the -container. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -July 2014, updated by Sven Dowideit -April 2015, updated by Ahmet Alp Balkan -October 2015, updated by Mike Brown diff --git a/vendor/github.com/docker/docker/man/docker-network-connect.1.md b/vendor/github.com/docker/docker/man/docker-network-connect.1.md deleted file mode 100644 index 096ec77a4..000000000 --- a/vendor/github.com/docker/docker/man/docker-network-connect.1.md +++ /dev/null @@ -1,66 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-connect - connect a container to a network - -# SYNOPSIS -**docker network connect** -[**--help**] -NETWORK CONTAINER - -# DESCRIPTION - -Connects a container to a network. You can connect a container by name -or by ID. Once connected, the container can communicate with other containers in -the same network. - -```bash -$ docker network connect multi-host-network container1 -``` - -You can also use the `docker run --network=` option to start a container and immediately connect it to a network. - -```bash -$ docker run -itd --network=multi-host-network --ip 172.20.88.22 --ip6 2001:db8::8822 busybox -``` -You can pause, restart, and stop containers that are connected to a network. -A container connects to its configured networks when it runs. - -If specified, the container's IP address(es) is reapplied when a stopped -container is restarted. If the IP address is no longer available, the container -fails to start. One way to guarantee that the IP address is available is -to specify an `--ip-range` when creating the network, and choose the static IP -address(es) from outside that range. This ensures that the IP address is not -given to another container while this container is not on the network. - -```bash -$ docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 multi-host-network -``` - -```bash -$ docker network connect --ip 172.20.128.2 multi-host-network container2 -``` - -To verify the container is connected, use the `docker network inspect` command. Use `docker network disconnect` to remove a container from the network. - -Once connected in network, containers can communicate using only another -container's IP address or name. For `overlay` networks or custom plugins that -support multi-host connectivity, containers connected to the same multi-host -network but launched from different Engines can also communicate in this way. - -You can connect a container to one or more networks. The networks need not be the same type. For example, you can connect a single container bridge and overlay networks. - - -# OPTIONS -**NETWORK** - Specify network name - -**CONTAINER** - Specify container name - -**--help** - Print usage statement - -# HISTORY -OCT 2015, created by Mary Anthony diff --git a/vendor/github.com/docker/docker/man/docker-network-create.1.md b/vendor/github.com/docker/docker/man/docker-network-create.1.md deleted file mode 100644 index 44ce8e15c..000000000 --- a/vendor/github.com/docker/docker/man/docker-network-create.1.md +++ /dev/null @@ -1,187 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-create - create a new network - -# SYNOPSIS -**docker network create** -[**--attachable**] -[**--aux-address**=*map[]*] -[**-d**|**--driver**=*DRIVER*] -[**--gateway**=*[]*] -[**--help**] -[**--internal**] -[**--ip-range**=*[]*] -[**--ipam-driver**=*default*] -[**--ipam-opt**=*map[]*] -[**--ipv6**] -[**--label**[=*[]*]] -[**-o**|**--opt**=*map[]*] -[**--subnet**=*[]*] -NETWORK-NAME - -# DESCRIPTION - -Creates a new network. The `DRIVER` accepts `bridge` or `overlay` which are the -built-in network drivers. If you have installed a third party or your own custom -network driver you can specify that `DRIVER` here also. If you don't specify the -`--driver` option, the command automatically creates a `bridge` network for you. -When you install Docker Engine it creates a `bridge` network automatically. This -network corresponds to the `docker0` bridge that Engine has traditionally relied -on. When launch a new container with `docker run` it automatically connects to -this bridge network. You cannot remove this default bridge network but you can -create new ones using the `network create` command. - -```bash -$ docker network create -d bridge my-bridge-network -``` - -Bridge networks are isolated networks on a single Engine installation. If you -want to create a network that spans multiple Docker hosts each running an -Engine, you must create an `overlay` network. Unlike `bridge` networks overlay -networks require some pre-existing conditions before you can create one. These -conditions are: - -* Access to a key-value store. Engine supports Consul, Etcd, and Zookeeper (Distributed store) key-value stores. -* A cluster of hosts with connectivity to the key-value store. -* A properly configured Engine `daemon` on each host in the cluster. - -The `dockerd` options that support the `overlay` network are: - -* `--cluster-store` -* `--cluster-store-opt` -* `--cluster-advertise` - -To read more about these options and how to configure them, see ["*Get started -with multi-host -network*"](https://docs.docker.com/engine/userguide/networking/get-started-overlay/). - -It is also a good idea, though not required, that you install Docker Swarm on to -manage the cluster that makes up your network. Swarm provides sophisticated -discovery and server management that can assist your implementation. - -Once you have prepared the `overlay` network prerequisites you simply choose a -Docker host in the cluster and issue the following to create the network: - -```bash -$ docker network create -d overlay my-multihost-network -``` - -Network names must be unique. The Docker daemon attempts to identify naming -conflicts but this is not guaranteed. It is the user's responsibility to avoid -name conflicts. - -## Connect containers - -When you start a container use the `--network` flag to connect it to a network. -This adds the `busybox` container to the `mynet` network. - -```bash -$ docker run -itd --network=mynet busybox -``` - -If you want to add a container to a network after the container is already -running use the `docker network connect` subcommand. - -You can connect multiple containers to the same network. Once connected, the -containers can communicate using only another container's IP address or name. -For `overlay` networks or custom plugins that support multi-host connectivity, -containers connected to the same multi-host network but launched from different -Engines can also communicate in this way. - -You can disconnect a container from a network using the `docker network -disconnect` command. - -## Specifying advanced options - -When you create a network, Engine creates a non-overlapping subnetwork for the -network by default. This subnetwork is not a subdivision of an existing network. -It is purely for ip-addressing purposes. You can override this default and -specify subnetwork values directly using the `--subnet` option. On a -`bridge` network you can only create a single subnet: - -```bash -$ docker network create -d bridge --subnet=192.168.0.0/16 br0 -``` - -Additionally, you also specify the `--gateway` `--ip-range` and `--aux-address` -options. - -```bash -$ docker network create \ - --driver=bridge \ - --subnet=172.28.0.0/16 \ - --ip-range=172.28.5.0/24 \ - --gateway=172.28.5.254 \ - br0 -``` - -If you omit the `--gateway` flag the Engine selects one for you from inside a -preferred pool. For `overlay` networks and for network driver plugins that -support it you can create multiple subnetworks. - -```bash -$ docker network create -d overlay \ - --subnet=192.168.0.0/16 \ - --subnet=192.170.0.0/16 \ - --gateway=192.168.0.100 \ - --gateway=192.170.0.100 \ - --ip-range=192.168.1.0/24 \ - --aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \ - --aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \ - my-multihost-network -``` - -Be sure that your subnetworks do not overlap. If they do, the network create -fails and Engine returns an error. - -### Network internal mode - -By default, when you connect a container to an `overlay` network, Docker also -connects a bridge network to it to provide external connectivity. If you want -to create an externally isolated `overlay` network, you can specify the -`--internal` option. - -# OPTIONS -**--attachable** - Enable manual container attachment - -**--aux-address**=map[] - Auxiliary IPv4 or IPv6 addresses used by network driver - -**-d**, **--driver**=*DRIVER* - Driver to manage the Network bridge or overlay. The default is bridge. - -**--gateway**=[] - IPv4 or IPv6 Gateway for the master subnet - -**--help** - Print usage - -**--internal** - Restrict external access to the network - -**--ip-range**=[] - Allocate container ip from a sub-range - -**--ipam-driver**=*default* - IP Address Management Driver - -**--ipam-opt**=map[] - Set custom IPAM driver options - -**--ipv6** - Enable IPv6 networking - -**--label**=*label* - Set metadata for a network - -**-o**, **--opt**=map[] - Set custom driver options - -**--subnet**=[] - Subnet in CIDR format that represents a network segment - -# HISTORY -OCT 2015, created by Mary Anthony diff --git a/vendor/github.com/docker/docker/man/docker-network-disconnect.1.md b/vendor/github.com/docker/docker/man/docker-network-disconnect.1.md deleted file mode 100644 index 09bcac51b..000000000 --- a/vendor/github.com/docker/docker/man/docker-network-disconnect.1.md +++ /dev/null @@ -1,36 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-disconnect - disconnect a container from a network - -# SYNOPSIS -**docker network disconnect** -[**--help**] -[**--force**] -NETWORK CONTAINER - -# DESCRIPTION - -Disconnects a container from a network. - -```bash - $ docker network disconnect multi-host-network container1 -``` - - -# OPTIONS -**NETWORK** - Specify network name - -**CONTAINER** - Specify container name - -**--force** - Force the container to disconnect from a network - -**--help** - Print usage statement - -# HISTORY -OCT 2015, created by Mary Anthony diff --git a/vendor/github.com/docker/docker/man/docker-network-inspect.1.md b/vendor/github.com/docker/docker/man/docker-network-inspect.1.md deleted file mode 100644 index f27c98cb3..000000000 --- a/vendor/github.com/docker/docker/man/docker-network-inspect.1.md +++ /dev/null @@ -1,112 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-inspect - inspect a network - -# SYNOPSIS -**docker network inspect** -[**-f**|**--format**[=*FORMAT*]] -[**--help**] -NETWORK [NETWORK...] - -# DESCRIPTION - -Returns information about one or more networks. By default, this command renders all results in a JSON object. For example, if you connect two containers to the default `bridge` network: - -```bash -$ sudo docker run -itd --name=container1 busybox -f2870c98fd504370fb86e59f32cd0753b1ac9b69b7d80566ffc7192a82b3ed27 - -$ sudo docker run -itd --name=container2 busybox -bda12f8922785d1f160be70736f26c1e331ab8aaf8ed8d56728508f2e2fd4727 -``` - -The `network inspect` command shows the containers, by id, in its -results. You can specify an alternate format to execute a given -template for each result. Go's -[text/template](http://golang.org/pkg/text/template/) package -describes all the details of the format. - -```bash -$ sudo docker network inspect bridge -[ - { - "Name": "bridge", - "Id": "b2b1a2cba717161d984383fd68218cf70bbbd17d328496885f7c921333228b0f", - "Scope": "local", - "Driver": "bridge", - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.17.42.1/16", - "Gateway": "172.17.42.1" - } - ] - }, - "Internal": false, - "Containers": { - "bda12f8922785d1f160be70736f26c1e331ab8aaf8ed8d56728508f2e2fd4727": { - "Name": "container2", - "EndpointID": "0aebb8fcd2b282abe1365979536f21ee4ceaf3ed56177c628eae9f706e00e019", - "MacAddress": "02:42:ac:11:00:02", - "IPv4Address": "172.17.0.2/16", - "IPv6Address": "" - }, - "f2870c98fd504370fb86e59f32cd0753b1ac9b69b7d80566ffc7192a82b3ed27": { - "Name": "container1", - "EndpointID": "a00676d9c91a96bbe5bcfb34f705387a33d7cc365bac1a29e4e9728df92d10ad", - "MacAddress": "02:42:ac:11:00:01", - "IPv4Address": "172.17.0.1/16", - "IPv6Address": "" - } - }, - "Options": { - "com.docker.network.bridge.default_bridge": "true", - "com.docker.network.bridge.enable_icc": "true", - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", - "com.docker.network.bridge.name": "docker0", - "com.docker.network.driver.mtu": "1500" - } - } -] -``` - -Returns the information about the user-defined network: - -```bash -$ docker network create simple-network -69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a -$ docker network inspect simple-network -[ - { - "Name": "simple-network", - "Id": "69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a", - "Scope": "local", - "Driver": "bridge", - "IPAM": { - "Driver": "default", - "Config": [ - { - "Subnet": "172.22.0.0/16", - "Gateway": "172.22.0.1" - } - ] - }, - "Containers": {}, - "Options": {} - } -] -``` - -# OPTIONS -**-f**, **--format**="" - Format the output using the given Go template. - -**--help** - Print usage statement - -# HISTORY -OCT 2015, created by Mary Anthony diff --git a/vendor/github.com/docker/docker/man/docker-network-ls.1.md b/vendor/github.com/docker/docker/man/docker-network-ls.1.md deleted file mode 100644 index f319e6603..000000000 --- a/vendor/github.com/docker/docker/man/docker-network-ls.1.md +++ /dev/null @@ -1,188 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-ls - list networks - -# SYNOPSIS -**docker network ls** -[**-f**|**--filter**[=*[]*]] -[**--format**=*"TEMPLATE"*] -[**--no-trunc**[=*true*|*false*]] -[**-q**|**--quiet**[=*true*|*false*]] -[**--help**] - -# DESCRIPTION - -Lists all the networks the Engine `daemon` knows about. This includes the -networks that span across multiple hosts in a cluster, for example: - -```bash - $ docker network ls - NETWORK ID NAME DRIVER SCOPE - 7fca4eb8c647 bridge bridge local - 9f904ee27bf5 none null local - cf03ee007fb4 host host local - 78b03ee04fc4 multi-host overlay swarm -``` - -Use the `--no-trunc` option to display the full network id: - -```bash -$ docker network ls --no-trunc -NETWORK ID NAME DRIVER -18a2866682b85619a026c81b98a5e375bd33e1b0936a26cc497c283d27bae9b3 none null -c288470c46f6c8949c5f7e5099b5b7947b07eabe8d9a27d79a9cbf111adcbf47 host host -7b369448dccbf865d397c8d2be0cda7cf7edc6b0945f77d2529912ae917a0185 bridge bridge -95e74588f40db048e86320c6526440c504650a1ff3e9f7d60a497c4d2163e5bd foo bridge -63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161 dev bridge -``` - -## Filtering - -The filtering flag (`-f` or `--filter`) format is a `key=value` pair. If there -is more than one filter, then pass multiple flags (e.g. `--filter "foo=bar" --filter "bif=baz"`). -Multiple filter flags are combined as an `OR` filter. For example, -`-f type=custom -f type=builtin` returns both `custom` and `builtin` networks. - -The currently supported filters are: - -* driver -* id (network's id) -* label (`label=` or `label==`) -* name (network's name) -* type (custom|builtin) - -#### Driver - -The `driver` filter matches networks based on their driver. - -The following example matches networks with the `bridge` driver: - -```bash -$ docker network ls --filter driver=bridge -NETWORK ID NAME DRIVER -db9db329f835 test1 bridge -f6e212da9dfd test2 bridge -``` - -#### ID - -The `id` filter matches on all or part of a network's ID. - -The following filter matches all networks with an ID containing the -`63d1ff1f77b0...` string. - -```bash -$ docker network ls --filter id=63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161 -NETWORK ID NAME DRIVER -63d1ff1f77b0 dev bridge -``` - -You can also filter for a substring in an ID as this shows: - -```bash -$ docker network ls --filter id=95e74588f40d -NETWORK ID NAME DRIVER -95e74588f40d foo bridge - -$ docker network ls --filter id=95e -NETWORK ID NAME DRIVER -95e74588f40d foo bridge -``` - -#### Label - -The `label` filter matches networks based on the presence of a `label` alone or a `label` and a -value. - -The following filter matches networks with the `usage` label regardless of its value. - -```bash -$ docker network ls -f "label=usage" -NETWORK ID NAME DRIVER -db9db329f835 test1 bridge -f6e212da9dfd test2 bridge -``` - -The following filter matches networks with the `usage` label with the `prod` value. - -```bash -$ docker network ls -f "label=usage=prod" -NETWORK ID NAME DRIVER -f6e212da9dfd test2 bridge -``` - -#### Name - -The `name` filter matches on all or part of a network's name. - -The following filter matches all networks with a name containing the `foobar` string. - -```bash -$ docker network ls --filter name=foobar -NETWORK ID NAME DRIVER -06e7eef0a170 foobar bridge -``` - -You can also filter for a substring in a name as this shows: - -```bash -$ docker network ls --filter name=foo -NETWORK ID NAME DRIVER -95e74588f40d foo bridge -06e7eef0a170 foobar bridge -``` - -#### Type - -The `type` filter supports two values; `builtin` displays predefined networks -(`bridge`, `none`, `host`), whereas `custom` displays user defined networks. - -The following filter matches all user defined networks: - -```bash -$ docker network ls --filter type=custom -NETWORK ID NAME DRIVER -95e74588f40d foo bridge -63d1ff1f77b0 dev bridge -``` - -By having this flag it allows for batch cleanup. For example, use this filter -to delete all user defined networks: - -```bash -$ docker network rm `docker network ls --filter type=custom -q` -``` - -A warning will be issued when trying to remove a network that has containers -attached. - -# OPTIONS - -**-f**, **--filter**=*[]* - filter output based on conditions provided. - -**--format**="*TEMPLATE*" - Pretty-print networks using a Go template. - Valid placeholders: - .ID - Network ID - .Name - Network name - .Driver - Network driver - .Scope - Network scope (local, global) - .IPv6 - Whether IPv6 is enabled on the network or not - .Internal - Whether the network is internal or not - .Labels - All labels assigned to the network - .Label - Value of a specific label for this network. For example `{{.Label "project.version"}}` - -**--no-trunc**=*true*|*false* - Do not truncate the output - -**-q**, **--quiet**=*true*|*false* - Only display network IDs - -**--help** - Print usage statement - -# HISTORY -OCT 2015, created by Mary Anthony diff --git a/vendor/github.com/docker/docker/man/docker-network-rm.1.md b/vendor/github.com/docker/docker/man/docker-network-rm.1.md deleted file mode 100644 index c094a1528..000000000 --- a/vendor/github.com/docker/docker/man/docker-network-rm.1.md +++ /dev/null @@ -1,43 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-rm - remove one or more networks - -# SYNOPSIS -**docker network rm** -[**--help**] -NETWORK [NETWORK...] - -# DESCRIPTION - -Removes one or more networks by name or identifier. To remove a network, -you must first disconnect any containers connected to it. -To remove the network named 'my-network': - -```bash - $ docker network rm my-network -``` - -To delete multiple networks in a single `docker network rm` command, provide -multiple network names or ids. The following example deletes a network with id -`3695c422697f` and a network named `my-network`: - -```bash - $ docker network rm 3695c422697f my-network -``` - -When you specify multiple networks, the command attempts to delete each in turn. -If the deletion of one network fails, the command continues to the next on the -list and tries to delete that. The command reports success or failure for each -deletion. - -# OPTIONS -**NETWORK** - Specify network name or id - -**--help** - Print usage statement - -# HISTORY -OCT 2015, created by Mary Anthony diff --git a/vendor/github.com/docker/docker/man/docker-pause.1.md b/vendor/github.com/docker/docker/man/docker-pause.1.md deleted file mode 100644 index 11eef5321..000000000 --- a/vendor/github.com/docker/docker/man/docker-pause.1.md +++ /dev/null @@ -1,32 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-pause - Pause all processes within one or more containers - -# SYNOPSIS -**docker pause** -CONTAINER [CONTAINER...] - -# DESCRIPTION - -The `docker pause` command suspends all processes in the specified containers. -On Linux, this uses the cgroups freezer. Traditionally, when suspending a process -the `SIGSTOP` signal is used, which is observable by the process being suspended. -With the cgroups freezer the process is unaware, and unable to capture, -that it is being suspended, and subsequently resumed. On Windows, only Hyper-V -containers can be paused. - -See the [cgroups freezer documentation] -(https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt) for -further details. - -# OPTIONS -**--help** - Print usage statement - -# See also -**docker-unpause(1)** to unpause all processes within one or more containers. - -# HISTORY -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-port.1.md b/vendor/github.com/docker/docker/man/docker-port.1.md deleted file mode 100644 index 83e9cf93b..000000000 --- a/vendor/github.com/docker/docker/man/docker-port.1.md +++ /dev/null @@ -1,47 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-port - List port mappings for the CONTAINER, or lookup the public-facing port that is NAT-ed to the PRIVATE_PORT - -# SYNOPSIS -**docker port** -[**--help**] -CONTAINER [PRIVATE_PORT[/PROTO]] - -# DESCRIPTION -List port mappings for the CONTAINER, or lookup the public-facing port that is NAT-ed to the PRIVATE_PORT - -# OPTIONS -**--help** - Print usage statement - -# EXAMPLES - - # docker ps - CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES - b650456536c7 busybox:latest top 54 minutes ago Up 54 minutes 0.0.0.0:1234->9876/tcp, 0.0.0.0:4321->7890/tcp test - -## Find out all the ports mapped - - # docker port test - 7890/tcp -> 0.0.0.0:4321 - 9876/tcp -> 0.0.0.0:1234 - -## Find out a specific mapping - - # docker port test 7890/tcp - 0.0.0.0:4321 - - # docker port test 7890 - 0.0.0.0:4321 - -## An example showing error for non-existent mapping - - # docker port test 7890/udp - 2014/06/24 11:53:36 Error: No public port '7890/udp' published for test - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -June 2014, updated by Sven Dowideit -November 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-ps.1.md b/vendor/github.com/docker/docker/man/docker-ps.1.md deleted file mode 100644 index d9aa39f8f..000000000 --- a/vendor/github.com/docker/docker/man/docker-ps.1.md +++ /dev/null @@ -1,145 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% FEBRUARY 2015 -# NAME -docker-ps - List containers - -# SYNOPSIS -**docker ps** -[**-a**|**--all**] -[**-f**|**--filter**[=*[]*]] -[**--format**=*"TEMPLATE"*] -[**--help**] -[**-l**|**--latest**] -[**-n**[=*-1*]] -[**--no-trunc**] -[**-q**|**--quiet**] -[**-s**|**--size**] - -# DESCRIPTION - -List the containers in the local repository. By default this shows only -the running containers. - -# OPTIONS -**-a**, **--all**=*true*|*false* - Show all containers. Only running containers are shown by default. The default is *false*. - -**-f**, **--filter**=[] - Filter output based on these conditions: - - exited= an exit code of - - label= or label== - - status=(created|restarting|running|paused|exited|dead) - - name= a container's name - - id= a container's ID - - is-task=(true|false) - containers that are a task (part of a service managed by swarm) - - before=(|) - - since=(|) - - ancestor=([:tag]||) - containers created from an image or a descendant. - - volume=(|) - - network=(|) - containers connected to the provided network - - health=(starting|healthy|unhealthy|none) - filters containers based on healthcheck status - -**--format**="*TEMPLATE*" - Pretty-print containers using a Go template. - Valid placeholders: - .ID - Container ID - .Image - Image ID - .Command - Quoted command - .CreatedAt - Time when the container was created. - .RunningFor - Elapsed time since the container was started. - .Ports - Exposed ports. - .Status - Container status. - .Size - Container disk size. - .Names - Container names. - .Labels - All labels assigned to the container. - .Label - Value of a specific label for this container. For example `{{.Label "com.docker.swarm.cpu"}}` - .Mounts - Names of the volumes mounted in this container. - -**--help** - Print usage statement - -**-l**, **--latest**=*true*|*false* - Show only the latest created container (includes all states). The default is *false*. - -**-n**=*-1* - Show n last created containers (includes all states). - -**--no-trunc**=*true*|*false* - Don't truncate output. The default is *false*. - -**-q**, **--quiet**=*true*|*false* - Only display numeric IDs. The default is *false*. - -**-s**, **--size**=*true*|*false* - Display total file sizes. The default is *false*. - -# EXAMPLES -# Display all containers, including non-running - - # docker ps -a - CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES - a87ecb4f327c fedora:20 /bin/sh -c #(nop) MA 20 minutes ago Exit 0 desperate_brattain - 01946d9d34d8 vpavlin/rhel7:latest /bin/sh -c #(nop) MA 33 minutes ago Exit 0 thirsty_bell - c1d3b0166030 acffc0358b9e /bin/sh -c yum -y up 2 weeks ago Exit 1 determined_torvalds - 41d50ecd2f57 fedora:20 /bin/sh -c #(nop) MA 2 weeks ago Exit 0 drunk_pike - -# Display only IDs of all containers, including non-running - - # docker ps -a -q - a87ecb4f327c - 01946d9d34d8 - c1d3b0166030 - 41d50ecd2f57 - -# Display only IDs of all containers that have the name `determined_torvalds` - - # docker ps -a -q --filter=name=determined_torvalds - c1d3b0166030 - -# Display containers with their commands - - # docker ps --format "{{.ID}}: {{.Command}}" - a87ecb4f327c: /bin/sh -c #(nop) MA - 01946d9d34d8: /bin/sh -c #(nop) MA - c1d3b0166030: /bin/sh -c yum -y up - 41d50ecd2f57: /bin/sh -c #(nop) MA - -# Display containers with their labels in a table - - # docker ps --format "table {{.ID}}\t{{.Labels}}" - CONTAINER ID LABELS - a87ecb4f327c com.docker.swarm.node=ubuntu,com.docker.swarm.storage=ssd - 01946d9d34d8 - c1d3b0166030 com.docker.swarm.node=debian,com.docker.swarm.cpu=6 - 41d50ecd2f57 com.docker.swarm.node=fedora,com.docker.swarm.cpu=3,com.docker.swarm.storage=ssd - -# Display containers with their node label in a table - - # docker ps --format 'table {{.ID}}\t{{(.Label "com.docker.swarm.node")}}' - CONTAINER ID NODE - a87ecb4f327c ubuntu - 01946d9d34d8 - c1d3b0166030 debian - 41d50ecd2f57 fedora - -# Display containers with `remote-volume` mounted - - $ docker ps --filter volume=remote-volume --format "table {{.ID}}\t{{.Mounts}}" - CONTAINER ID MOUNTS - 9c3527ed70ce remote-volume - -# Display containers with a volume mounted in `/data` - - $ docker ps --filter volume=/data --format "table {{.ID}}\t{{.Mounts}}" - CONTAINER ID MOUNTS - 9c3527ed70ce remote-volume - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -August 2014, updated by Sven Dowideit -November 2014, updated by Sven Dowideit -February 2015, updated by André Martins -October 2016, updated by Josh Horwitz diff --git a/vendor/github.com/docker/docker/man/docker-pull.1.md b/vendor/github.com/docker/docker/man/docker-pull.1.md deleted file mode 100644 index c61d00530..000000000 --- a/vendor/github.com/docker/docker/man/docker-pull.1.md +++ /dev/null @@ -1,220 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-pull - Pull an image or a repository from a registry - -# SYNOPSIS -**docker pull** -[**-a**|**--all-tags**] -[**--help**] -NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG] - -# DESCRIPTION - -This command pulls down an image or a repository from a registry. If -there is more than one image for a repository (e.g., fedora) then all -images for that repository name can be pulled down including any tags -(see the option **-a** or **--all-tags**). - -If you do not specify a `REGISTRY_HOST`, the command uses Docker's public -registry located at `registry-1.docker.io` by default. - -# OPTIONS -**-a**, **--all-tags**=*true*|*false* - Download all tagged images in the repository. The default is *false*. - -**--help** - Print usage statement - -# EXAMPLES - -### Pull an image from Docker Hub - -To download a particular image, or set of images (i.e., a repository), use -`docker pull`. If no tag is provided, Docker Engine uses the `:latest` tag as a -default. This command pulls the `debian:latest` image: - - $ docker pull debian - - Using default tag: latest - latest: Pulling from library/debian - fdd5d7827f33: Pull complete - a3ed95caeb02: Pull complete - Digest: sha256:e7d38b3517548a1c71e41bffe9c8ae6d6d29546ce46bf62159837aad072c90aa - Status: Downloaded newer image for debian:latest - -Docker images can consist of multiple layers. In the example above, the image -consists of two layers; `fdd5d7827f33` and `a3ed95caeb02`. - -Layers can be reused by images. For example, the `debian:jessie` image shares -both layers with `debian:latest`. Pulling the `debian:jessie` image therefore -only pulls its metadata, but not its layers, because all layers are already -present locally: - - $ docker pull debian:jessie - - jessie: Pulling from library/debian - fdd5d7827f33: Already exists - a3ed95caeb02: Already exists - Digest: sha256:a9c958be96d7d40df920e7041608f2f017af81800ca5ad23e327bc402626b58e - Status: Downloaded newer image for debian:jessie - -To see which images are present locally, use the **docker-images(1)** -command: - - $ docker images - - REPOSITORY TAG IMAGE ID CREATED SIZE - debian jessie f50f9524513f 5 days ago 125.1 MB - debian latest f50f9524513f 5 days ago 125.1 MB - -Docker uses a content-addressable image store, and the image ID is a SHA256 -digest covering the image's configuration and layers. In the example above, -`debian:jessie` and `debian:latest` have the same image ID because they are -actually the *same* image tagged with different names. Because they are the -same image, their layers are stored only once and do not consume extra disk -space. - -For more information about images, layers, and the content-addressable store, -refer to [understand images, containers, and storage drivers](https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/) -in the online documentation. - - -## Pull an image by digest (immutable identifier) - -So far, you've pulled images by their name (and "tag"). Using names and tags is -a convenient way to work with images. When using tags, you can `docker pull` an -image again to make sure you have the most up-to-date version of that image. -For example, `docker pull ubuntu:14.04` pulls the latest version of the Ubuntu -14.04 image. - -In some cases you don't want images to be updated to newer versions, but prefer -to use a fixed version of an image. Docker enables you to pull an image by its -*digest*. When pulling an image by digest, you specify *exactly* which version -of an image to pull. Doing so, allows you to "pin" an image to that version, -and guarantee that the image you're using is always the same. - -To know the digest of an image, pull the image first. Let's pull the latest -`ubuntu:14.04` image from Docker Hub: - - $ docker pull ubuntu:14.04 - - 14.04: Pulling from library/ubuntu - 5a132a7e7af1: Pull complete - fd2731e4c50c: Pull complete - 28a2f68d1120: Pull complete - a3ed95caeb02: Pull complete - Digest: sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 - Status: Downloaded newer image for ubuntu:14.04 - -Docker prints the digest of the image after the pull has finished. In the example -above, the digest of the image is: - - sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 - -Docker also prints the digest of an image when *pushing* to a registry. This -may be useful if you want to pin to a version of the image you just pushed. - -A digest takes the place of the tag when pulling an image, for example, to -pull the above image by digest, run the following command: - - $ docker pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 - - sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2: Pulling from library/ubuntu - 5a132a7e7af1: Already exists - fd2731e4c50c: Already exists - 28a2f68d1120: Already exists - a3ed95caeb02: Already exists - Digest: sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 - Status: Downloaded newer image for ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 - -Digest can also be used in the `FROM` of a Dockerfile, for example: - - FROM ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 - MAINTAINER some maintainer - -> **Note**: Using this feature "pins" an image to a specific version in time. -> Docker will therefore not pull updated versions of an image, which may include -> security updates. If you want to pull an updated image, you need to change the -> digest accordingly. - -## Pulling from a different registry - -By default, `docker pull` pulls images from Docker Hub. It is also possible to -manually specify the path of a registry to pull from. For example, if you have -set up a local registry, you can specify its path to pull from it. A registry -path is similar to a URL, but does not contain a protocol specifier (`https://`). - -The following command pulls the `testing/test-image` image from a local registry -listening on port 5000 (`myregistry.local:5000`): - - $ docker pull myregistry.local:5000/testing/test-image - -Registry credentials are managed by **docker-login(1)**. - -Docker uses the `https://` protocol to communicate with a registry, unless the -registry is allowed to be accessed over an insecure connection. Refer to the -[insecure registries](https://docs.docker.com/engine/reference/commandline/daemon/#insecure-registries) -section in the online documentation for more information. - - -## Pull a repository with multiple images - -By default, `docker pull` pulls a *single* image from the registry. A repository -can contain multiple images. To pull all images from a repository, provide the -`-a` (or `--all-tags`) option when using `docker pull`. - -This command pulls all images from the `fedora` repository: - - $ docker pull --all-tags fedora - - Pulling repository fedora - ad57ef8d78d7: Download complete - 105182bb5e8b: Download complete - 511136ea3c5a: Download complete - 73bd853d2ea5: Download complete - .... - - Status: Downloaded newer image for fedora - -After the pull has completed use the `docker images` command to see the -images that were pulled. The example below shows all the `fedora` images -that are present locally: - - $ docker images fedora - - REPOSITORY TAG IMAGE ID CREATED SIZE - fedora rawhide ad57ef8d78d7 5 days ago 359.3 MB - fedora 20 105182bb5e8b 5 days ago 372.7 MB - fedora heisenbug 105182bb5e8b 5 days ago 372.7 MB - fedora latest 105182bb5e8b 5 days ago 372.7 MB - - -## Canceling a pull - -Killing the `docker pull` process, for example by pressing `CTRL-c` while it is -running in a terminal, will terminate the pull operation. - - $ docker pull fedora - - Using default tag: latest - latest: Pulling from library/fedora - a3ed95caeb02: Pulling fs layer - 236608c7b546: Pulling fs layer - ^C - -> **Note**: Technically, the Engine terminates a pull operation when the -> connection between the Docker Engine daemon and the Docker Engine client -> initiating the pull is lost. If the connection with the Engine daemon is -> lost for other reasons than a manual interaction, the pull is also aborted. - - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -August 2014, updated by Sven Dowideit -April 2015, updated by John Willis -April 2015, updated by Mary Anthony for v2 -September 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/docker-push.1.md b/vendor/github.com/docker/docker/man/docker-push.1.md deleted file mode 100644 index 847e66d2e..000000000 --- a/vendor/github.com/docker/docker/man/docker-push.1.md +++ /dev/null @@ -1,63 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-push - Push an image or a repository to a registry - -# SYNOPSIS -**docker push** -[**--help**] -NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG] - -# DESCRIPTION - -Use `docker push` to share your images to the [Docker Hub](https://hub.docker.com) -registry or to a self-hosted one. - -Refer to **docker-tag(1)** for more information about valid image and tag names. - -Killing the **docker push** process, for example by pressing **CTRL-c** while it -is running in a terminal, terminates the push operation. - -Registry credentials are managed by **docker-login(1)**. - - -# OPTIONS - -**--disable-content-trust** - Skip image verification (default true) - -**--help** - Print usage statement - -# EXAMPLES - -## Pushing a new image to a registry - -First save the new image by finding the container ID (using **docker ps**) -and then committing it to a new image name. Note that only a-z0-9-_. are -allowed when naming images: - - # docker commit c16378f943fe rhel-httpd - -Now, push the image to the registry using the image ID. In this example the -registry is on host named `registry-host` and listening on port `5000`. To do -this, tag the image with the host name or IP address, and the port of the -registry: - - # docker tag rhel-httpd registry-host:5000/myadmin/rhel-httpd - # docker push registry-host:5000/myadmin/rhel-httpd - -Check that this worked by running: - - # docker images - -You should see both `rhel-httpd` and `registry-host:5000/myadmin/rhel-httpd` -listed. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 -June 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/docker-rename.1.md b/vendor/github.com/docker/docker/man/docker-rename.1.md deleted file mode 100644 index eaeea5c6e..000000000 --- a/vendor/github.com/docker/docker/man/docker-rename.1.md +++ /dev/null @@ -1,15 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCTOBER 2014 -# NAME -docker-rename - Rename a container - -# SYNOPSIS -**docker rename** -CONTAINER NEW_NAME - -# OPTIONS -There are no available options. - -# DESCRIPTION -Rename a container. Container may be running, paused or stopped. diff --git a/vendor/github.com/docker/docker/man/docker-restart.1.md b/vendor/github.com/docker/docker/man/docker-restart.1.md deleted file mode 100644 index 271c4eee1..000000000 --- a/vendor/github.com/docker/docker/man/docker-restart.1.md +++ /dev/null @@ -1,26 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-restart - Restart one or more containers - -# SYNOPSIS -**docker restart** -[**--help**] -[**-t**|**--time**[=*10*]] -CONTAINER [CONTAINER...] - -# DESCRIPTION -Restart each container listed. - -# OPTIONS -**--help** - Print usage statement - -**-t**, **--time**=*10* - Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-rm.1.md b/vendor/github.com/docker/docker/man/docker-rm.1.md deleted file mode 100644 index 2105288d0..000000000 --- a/vendor/github.com/docker/docker/man/docker-rm.1.md +++ /dev/null @@ -1,72 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-rm - Remove one or more containers - -# SYNOPSIS -**docker rm** -[**-f**|**--force**] -[**-l**|**--link**] -[**-v**|**--volumes**] -CONTAINER [CONTAINER...] - -# DESCRIPTION - -**docker rm** will remove one or more containers from the host node. The -container name or ID can be used. This does not remove images. You cannot -remove a running container unless you use the **-f** option. To see all -containers on a host use the **docker ps -a** command. - -# OPTIONS -**--help** - Print usage statement - -**-f**, **--force**=*true*|*false* - Force the removal of a running container (uses SIGKILL). The default is *false*. - -**-l**, **--link**=*true*|*false* - Remove the specified link and not the underlying container. The default is *false*. - -**-v**, **--volumes**=*true*|*false* - Remove the volumes associated with the container. The default is *false*. - -# EXAMPLES - -## Removing a container using its ID - -To remove a container using its ID, find either from a **docker ps -a** -command, or use the ID returned from the **docker run** command, or retrieve -it from a file used to store it using the **docker run --cidfile**: - - docker rm abebf7571666 - -## Removing a container using the container name - -The name of the container can be found using the **docker ps -a** -command. The use that name as follows: - - docker rm hopeful_morse - -## Removing a container and all associated volumes - - $ docker rm -v redis - redis - -This command will remove the container and any volumes associated with it. -Note that if a volume was specified with a name, it will not be removed. - - $ docker create -v awesome:/foo -v /bar --name hello redis - hello - $ docker rm -v hello - -In this example, the volume for `/foo` will remain in tact, but the volume for -`/bar` will be removed. The same behavior holds for volumes inherited with -`--volumes-from`. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -July 2014, updated by Sven Dowideit -August 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-rmi.1.md b/vendor/github.com/docker/docker/man/docker-rmi.1.md deleted file mode 100644 index 35bf8aac6..000000000 --- a/vendor/github.com/docker/docker/man/docker-rmi.1.md +++ /dev/null @@ -1,42 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-rmi - Remove one or more images - -# SYNOPSIS -**docker rmi** -[**-f**|**--force**] -[**--help**] -[**--no-prune**] -IMAGE [IMAGE...] - -# DESCRIPTION - -Removes one or more images from the host node. This does not remove images from -a registry. You cannot remove an image of a running container unless you use the -**-f** option. To see all images on a host use the **docker images** command. - -# OPTIONS -**-f**, **--force**=*true*|*false* - Force removal of the image. The default is *false*. - -**--help** - Print usage statement - -**--no-prune**=*true*|*false* - Do not delete untagged parents. The default is *false*. - -# EXAMPLES - -## Removing an image - -Here is an example of removing an image: - - docker rmi fedora/httpd - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 diff --git a/vendor/github.com/docker/docker/man/docker-run.1.md b/vendor/github.com/docker/docker/man/docker-run.1.md deleted file mode 100644 index 8c1018a1e..000000000 --- a/vendor/github.com/docker/docker/man/docker-run.1.md +++ /dev/null @@ -1,1055 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-run - Run a command in a new container - -# SYNOPSIS -**docker run** -[**-a**|**--attach**[=*[]*]] -[**--add-host**[=*[]*]] -[**--blkio-weight**[=*[BLKIO-WEIGHT]*]] -[**--blkio-weight-device**[=*[]*]] -[**--cpu-shares**[=*0*]] -[**--cap-add**[=*[]*]] -[**--cap-drop**[=*[]*]] -[**--cgroup-parent**[=*CGROUP-PATH*]] -[**--cidfile**[=*CIDFILE*]] -[**--cpu-count**[=*0*]] -[**--cpu-percent**[=*0*]] -[**--cpu-period**[=*0*]] -[**--cpu-quota**[=*0*]] -[**--cpu-rt-period**[=*0*]] -[**--cpu-rt-runtime**[=*0*]] -[**--cpus**[=*0.0*]] -[**--cpuset-cpus**[=*CPUSET-CPUS*]] -[**--cpuset-mems**[=*CPUSET-MEMS*]] -[**-d**|**--detach**] -[**--detach-keys**[=*[]*]] -[**--device**[=*[]*]] -[**--device-read-bps**[=*[]*]] -[**--device-read-iops**[=*[]*]] -[**--device-write-bps**[=*[]*]] -[**--device-write-iops**[=*[]*]] -[**--dns**[=*[]*]] -[**--dns-option**[=*[]*]] -[**--dns-search**[=*[]*]] -[**-e**|**--env**[=*[]*]] -[**--entrypoint**[=*ENTRYPOINT*]] -[**--env-file**[=*[]*]] -[**--expose**[=*[]*]] -[**--group-add**[=*[]*]] -[**-h**|**--hostname**[=*HOSTNAME*]] -[**--help**] -[**--init**] -[**--init-path**[=*[]*]] -[**-i**|**--interactive**] -[**--ip**[=*IPv4-ADDRESS*]] -[**--ip6**[=*IPv6-ADDRESS*]] -[**--ipc**[=*IPC*]] -[**--isolation**[=*default*]] -[**--kernel-memory**[=*KERNEL-MEMORY*]] -[**-l**|**--label**[=*[]*]] -[**--label-file**[=*[]*]] -[**--link**[=*[]*]] -[**--link-local-ip**[=*[]*]] -[**--log-driver**[=*[]*]] -[**--log-opt**[=*[]*]] -[**-m**|**--memory**[=*MEMORY*]] -[**--mac-address**[=*MAC-ADDRESS*]] -[**--memory-reservation**[=*MEMORY-RESERVATION*]] -[**--memory-swap**[=*LIMIT*]] -[**--memory-swappiness**[=*MEMORY-SWAPPINESS*]] -[**--name**[=*NAME*]] -[**--network-alias**[=*[]*]] -[**--network**[=*"bridge"*]] -[**--oom-kill-disable**] -[**--oom-score-adj**[=*0*]] -[**-P**|**--publish-all**] -[**-p**|**--publish**[=*[]*]] -[**--pid**[=*[PID]*]] -[**--userns**[=*[]*]] -[**--pids-limit**[=*PIDS_LIMIT*]] -[**--privileged**] -[**--read-only**] -[**--restart**[=*RESTART*]] -[**--rm**] -[**--security-opt**[=*[]*]] -[**--storage-opt**[=*[]*]] -[**--stop-signal**[=*SIGNAL*]] -[**--stop-timeout**[=*TIMEOUT*]] -[**--shm-size**[=*[]*]] -[**--sig-proxy**[=*true*]] -[**--sysctl**[=*[]*]] -[**-t**|**--tty**] -[**--tmpfs**[=*[CONTAINER-DIR[:]*]] -[**-u**|**--user**[=*USER*]] -[**--ulimit**[=*[]*]] -[**--uts**[=*[]*]] -[**-v**|**--volume**[=*[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]*]] -[**--volume-driver**[=*DRIVER*]] -[**--volumes-from**[=*[]*]] -[**-w**|**--workdir**[=*WORKDIR*]] -IMAGE [COMMAND] [ARG...] - -# DESCRIPTION - -Run a process in a new container. **docker run** starts a process with its own -file system, its own networking, and its own isolated process tree. The IMAGE -which starts the process may define defaults related to the process that will be -run in the container, the networking to expose, and more, but **docker run** -gives final control to the operator or administrator who starts the container -from the image. For that reason **docker run** has more options than any other -Docker command. - -If the IMAGE is not already loaded then **docker run** will pull the IMAGE, and -all image dependencies, from the repository in the same way running **docker -pull** IMAGE, before it starts the container from that image. - -# OPTIONS -**-a**, **--attach**=[] - Attach to STDIN, STDOUT or STDERR. - - In foreground mode (the default when **-d** -is not specified), **docker run** can start the process in the container -and attach the console to the process's standard input, output, and standard -error. It can even pretend to be a TTY (this is what most commandline -executables expect) and pass along signals. The **-a** option can be set for -each of stdin, stdout, and stderr. - -**--add-host**=[] - Add a custom host-to-IP mapping (host:ip) - - Add a line to /etc/hosts. The format is hostname:ip. The **--add-host** -option can be set multiple times. - -**--blkio-weight**=*0* - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - -**--blkio-weight-device**=[] - Block IO weight (relative device weight, format: `DEVICE_NAME:WEIGHT`). - -**--cpu-shares**=*0* - CPU shares (relative weight) - - By default, all containers get the same proportion of CPU cycles. This proportion -can be modified by changing the container's CPU share weighting relative -to the weighting of all other running containers. - -To modify the proportion from the default of 1024, use the **--cpu-shares** -flag to set the weighting to 2 or higher. - -The proportion will only apply when CPU-intensive processes are running. -When tasks in one container are idle, other containers can use the -left-over CPU time. The actual amount of CPU time will vary depending on -the number of containers running on the system. - -For example, consider three containers, one has a cpu-share of 1024 and -two others have a cpu-share setting of 512. When processes in all three -containers attempt to use 100% of CPU, the first container would receive -50% of the total CPU time. If you add a fourth container with a cpu-share -of 1024, the first container only gets 33% of the CPU. The remaining containers -receive 16.5%, 16.5% and 33% of the CPU. - -On a multi-core system, the shares of CPU time are distributed over all CPU -cores. Even if a container is limited to less than 100% of CPU time, it can -use 100% of each individual CPU core. - -For example, consider a system with more than three cores. If you start one -container **{C0}** with **-c=512** running one process, and another container -**{C1}** with **-c=1024** running two processes, this can result in the following -division of CPU shares: - - PID container CPU CPU share - 100 {C0} 0 100% of CPU0 - 101 {C1} 1 100% of CPU1 - 102 {C1} 2 100% of CPU2 - -**--cap-add**=[] - Add Linux capabilities - -**--cap-drop**=[] - Drop Linux capabilities - -**--cgroup-parent**="" - Path to cgroups under which the cgroup for the container will be created. If the path is not absolute, the path is considered to be relative to the cgroups path of the init process. Cgroups will be created if they do not already exist. - -**--cidfile**="" - Write the container ID to the file - -**--cpu-count**=*0* - Limit the number of CPUs available for execution by the container. - - On Windows Server containers, this is approximated as a percentage of total CPU usage. - - On Windows Server containers, the processor resource controls are mutually exclusive, the order of precedence is CPUCount first, then CPUShares, and CPUPercent last. - -**--cpu-percent**=*0* - Limit the percentage of CPU available for execution by a container running on a Windows daemon. - - On Windows Server containers, the processor resource controls are mutually exclusive, the order of precedence is CPUCount first, then CPUShares, and CPUPercent last. - -**--cpu-period**=*0* - Limit the CPU CFS (Completely Fair Scheduler) period - - Limit the container's CPU usage. This flag tell the kernel to restrict the container's CPU usage to the period you specify. - -**--cpuset-cpus**="" - CPUs in which to allow execution (0-3, 0,1) - -**--cpuset-mems**="" - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - - If you have four memory nodes on your system (0-3), use `--cpuset-mems=0,1` -then processes in your Docker container will only use memory from the first -two memory nodes. - -**--cpu-quota**=*0* - Limit the CPU CFS (Completely Fair Scheduler) quota - - Limit the container's CPU usage. By default, containers run with the full -CPU resource. This flag tell the kernel to restrict the container's CPU usage -to the quota you specify. - -**--cpu-rt-period**=0 - Limit the CPU real-time period in microseconds - - Limit the container's Real Time CPU usage. This flag tell the kernel to restrict the container's Real Time CPU usage to the period you specify. - -**--cpu-rt-runtime**=0 - Limit the CPU real-time runtime in microseconds - - Limit the containers Real Time CPU usage. This flag tells the kernel to limit the amount of time in a given CPU period Real Time tasks may consume. Ex: - Period of 1,000,000us and Runtime of 950,000us means that this container could consume 95% of available CPU and leave the remaining 5% to normal priority tasks. - - The sum of all runtimes across containers cannot exceed the amount allotted to the parent cgroup. - -**--cpus**=0.0 - Number of CPUs. The default is *0.0* which means no limit. - -**-d**, **--detach**=*true*|*false* - Detached mode: run the container in the background and print the new container ID. The default is *false*. - - At any time you can run **docker ps** in -the other shell to view a list of the running containers. You can reattach to a -detached container with **docker attach**. If you choose to run a container in -the detached mode, then you cannot use the **-rm** option. - - When attached in the tty mode, you can detach from the container (and leave it -running) using a configurable key sequence. The default sequence is `CTRL-p CTRL-q`. -You configure the key sequence using the **--detach-keys** option or a configuration file. -See **config-json(5)** for documentation on using a configuration file. - -**--detach-keys**="" - Override the key sequence for detaching a container. Format is a single character `[a-Z]` or `ctrl-` where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**--device**=[] - Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm) - -**--device-read-bps**=[] - Limit read rate from a device (e.g. --device-read-bps=/dev/sda:1mb) - -**--device-read-iops**=[] - Limit read rate from a device (e.g. --device-read-iops=/dev/sda:1000) - -**--device-write-bps**=[] - Limit write rate to a device (e.g. --device-write-bps=/dev/sda:1mb) - -**--device-write-iops**=[] - Limit write rate to a device (e.g. --device-write-iops=/dev/sda:1000) - -**--dns-search**=[] - Set custom DNS search domains (Use --dns-search=. if you don't wish to set the search domain) - -**--dns-option**=[] - Set custom DNS options - -**--dns**=[] - Set custom DNS servers - - This option can be used to override the DNS -configuration passed to the container. Typically this is necessary when the -host DNS configuration is invalid for the container (e.g., 127.0.0.1). When this -is the case the **--dns** flags is necessary for every run. - -**-e**, **--env**=[] - Set environment variables - - This option allows you to specify arbitrary -environment variables that are available for the process that will be launched -inside of the container. - -**--entrypoint**="" - Overwrite the default ENTRYPOINT of the image - - This option allows you to overwrite the default entrypoint of the image that -is set in the Dockerfile. The ENTRYPOINT of an image is similar to a COMMAND -because it specifies what executable to run when the container starts, but it is -(purposely) more difficult to override. The ENTRYPOINT gives a container its -default nature or behavior, so that when you set an ENTRYPOINT you can run the -container as if it were that binary, complete with default options, and you can -pass in more options via the COMMAND. But, sometimes an operator may want to run -something else inside the container, so you can override the default ENTRYPOINT -at runtime by using a **--entrypoint** and a string to specify the new -ENTRYPOINT. - -**--env-file**=[] - Read in a line delimited file of environment variables - -**--expose**=[] - Expose a port, or a range of ports (e.g. --expose=3300-3310) informs Docker -that the container listens on the specified network ports at runtime. Docker -uses this information to interconnect containers using links and to set up port -redirection on the host system. - -**--group-add**=[] - Add additional groups to run as - -**-h**, **--hostname**="" - Container host name - - Sets the container host name that is available inside the container. - -**--help** - Print usage statement - -**--init** - Run an init inside the container that forwards signals and reaps processes - -**--init-path**="" - Path to the docker-init binary - -**-i**, **--interactive**=*true*|*false* - Keep STDIN open even if not attached. The default is *false*. - - When set to true, keep stdin open even if not attached. The default is false. - -**--ip**="" - Sets the container's interface IPv4 address (e.g. 172.23.0.9) - - It can only be used in conjunction with **--network** for user-defined networks - -**--ip6**="" - Sets the container's interface IPv6 address (e.g. 2001:db8::1b99) - - It can only be used in conjunction with **--network** for user-defined networks - -**--ipc**="" - Default is to create a private IPC namespace (POSIX SysV IPC) for the container - 'container:': reuses another container shared memory, semaphores and message queues - 'host': use the host shared memory,semaphores and message queues inside the container. Note: the host mode gives the container full access to local shared memory and is therefore considered insecure. - -**--isolation**="*default*" - Isolation specifies the type of isolation technology used by containers. Note -that the default on Windows server is `process`, and the default on Windows client -is `hyperv`. Linux only supports `default`. - -**-l**, **--label**=[] - Set metadata on the container (e.g., --label com.example.key=value) - -**--kernel-memory**="" - Kernel memory limit (format: `[]`, where unit = b, k, m or g) - - Constrains the kernel memory available to a container. If a limit of 0 -is specified (not using `--kernel-memory`), the container's kernel memory -is not limited. If you specify a limit, it may be rounded up to a multiple -of the operating system's page size and the value can be very large, -millions of trillions. - -**--label-file**=[] - Read in a line delimited file of labels - -**--link**=[] - Add link to another container in the form of :alias or just -in which case the alias will match the name - - If the operator -uses **--link** when starting the new client container, then the client -container can access the exposed port via a private networking interface. Docker -will set some environment variables in the client container to help indicate -which interface and port to use. - -**--link-local-ip**=[] - Add one or more link-local IPv4/IPv6 addresses to the container's interface - -**--log-driver**="*json-file*|*syslog*|*journald*|*gelf*|*fluentd*|*awslogs*|*splunk*|*etwlogs*|*gcplogs*|*none*" - Logging driver for the container. Default is defined by daemon `--log-driver` flag. - **Warning**: the `docker logs` command works only for the `json-file` and - `journald` logging drivers. - -**--log-opt**=[] - Logging driver specific options. - -**-m**, **--memory**="" - Memory limit (format: [], where unit = b, k, m or g) - - Allows you to constrain the memory available to a container. If the host -supports swap memory, then the **-m** memory setting can be larger than physical -RAM. If a limit of 0 is specified (not using **-m**), the container's memory is -not limited. The actual limit may be rounded up to a multiple of the operating -system's page size (the value would be very large, that's millions of trillions). - -**--memory-reservation**="" - Memory soft limit (format: [], where unit = b, k, m or g) - - After setting memory reservation, when the system detects memory contention -or low memory, containers are forced to restrict their consumption to their -reservation. So you should always set the value below **--memory**, otherwise the -hard limit will take precedence. By default, memory reservation will be the same -as memory limit. - -**--memory-swap**="LIMIT" - A limit value equal to memory plus swap. Must be used with the **-m** -(**--memory**) flag. The swap `LIMIT` should always be larger than **-m** -(**--memory**) value. By default, the swap `LIMIT` will be set to double -the value of --memory. - - The format of `LIMIT` is `[]`. Unit can be `b` (bytes), -`k` (kilobytes), `m` (megabytes), or `g` (gigabytes). If you don't specify a -unit, `b` is used. Set LIMIT to `-1` to enable unlimited swap. - -**--mac-address**="" - Container MAC address (e.g. 92:d0:c6:0a:29:33) - - Remember that the MAC address in an Ethernet network must be unique. -The IPv6 link-local address will be based on the device's MAC address -according to RFC4862. - -**--name**="" - Assign a name to the container - - The operator can identify a container in three ways: - UUID long identifier (“f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778”) - UUID short identifier (“f78375b1c487”) - Name (“jonah”) - - The UUID identifiers come from the Docker daemon, and if a name is not assigned -to the container with **--name** then the daemon will also generate a random -string name. The name is useful when defining links (see **--link**) (or any -other place you need to identify a container). This works for both background -and foreground Docker containers. - -**--network**="*bridge*" - Set the Network mode for the container - 'bridge': create a network stack on the default Docker bridge - 'none': no networking - 'container:': reuse another container's network stack - 'host': use the Docker host network stack. Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure. - '|': connect to a user-defined network - -**--network-alias**=[] - Add network-scoped alias for the container - -**--oom-kill-disable**=*true*|*false* - Whether to disable OOM Killer for the container or not. - -**--oom-score-adj**="" - Tune the host's OOM preferences for containers (accepts -1000 to 1000) - -**-P**, **--publish-all**=*true*|*false* - Publish all exposed ports to random ports on the host interfaces. The default is *false*. - - When set to true publish all exposed ports to the host interfaces. The -default is false. If the operator uses -P (or -p) then Docker will make the -exposed port accessible on the host and the ports will be available to any -client that can reach the host. When using -P, Docker will bind any exposed -port to a random port on the host within an *ephemeral port range* defined by -`/proc/sys/net/ipv4/ip_local_port_range`. To find the mapping between the host -ports and the exposed ports, use `docker port`. - -**-p**, **--publish**=[] - Publish a container's port, or range of ports, to the host. - - Format: `ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort` -Both hostPort and containerPort can be specified as a range of ports. -When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range. -(e.g., `docker run -p 1234-1236:1222-1224 --name thisWorks -t busybox` -but not `docker run -p 1230-1236:1230-1240 --name RangeContainerPortsBiggerThanRangeHostPorts -t busybox`) -With ip: `docker run -p 127.0.0.1:$HOSTPORT:$CONTAINERPORT --name CONTAINER -t someimage` -Use `docker port` to see the actual mapping: `docker port CONTAINER $CONTAINERPORT` - -**--pid**="" - Set the PID mode for the container - Default is to create a private PID namespace for the container - 'container:': join another container's PID namespace - 'host': use the host's PID namespace for the container. Note: the host mode gives the container full access to local PID and is therefore considered insecure. - -**--userns**="" - Set the usernamespace mode for the container when `userns-remap` option is enabled. - **host**: use the host usernamespace and enable all privileged options (e.g., `pid=host` or `--privileged`). - -**--pids-limit**="" - Tune the container's pids limit. Set `-1` to have unlimited pids for the container. - -**--uts**=*host* - Set the UTS mode for the container - **host**: use the host's UTS namespace inside the container. - Note: the host mode gives the container access to changing the host's hostname and is therefore considered insecure. - -**--privileged**=*true*|*false* - Give extended privileges to this container. The default is *false*. - - By default, Docker containers are -“unprivileged” (=false) and cannot, for example, run a Docker daemon inside the -Docker container. This is because by default a container is not allowed to -access any devices. A “privileged” container is given access to all devices. - - When the operator executes **docker run --privileged**, Docker will enable access -to all devices on the host as well as set some configuration in AppArmor to -allow the container nearly all the same access to the host as processes running -outside of a container on the host. - -**--read-only**=*true*|*false* - Mount the container's root filesystem as read only. - - By default a container will have its root filesystem writable allowing processes -to write files anywhere. By specifying the `--read-only` flag the container will have -its root filesystem mounted as read only prohibiting any writes. - -**--restart**="*no*" - Restart policy to apply when a container exits (no, on-failure[:max-retry], always, unless-stopped). - -**--rm**=*true*|*false* - Automatically remove the container when it exits. The default is *false*. - `--rm` flag can work together with `-d`, and auto-removal will be done on daemon side. Note that it's -incompatible with any restart policy other than `none`. - -**--security-opt**=[] - Security Options - - "label=user:USER" : Set the label user for the container - "label=role:ROLE" : Set the label role for the container - "label=type:TYPE" : Set the label type for the container - "label=level:LEVEL" : Set the label level for the container - "label=disable" : Turn off label confinement for the container - "no-new-privileges" : Disable container processes from gaining additional privileges - - "seccomp=unconfined" : Turn off seccomp confinement for the container - "seccomp=profile.json : White listed syscalls seccomp Json file to be used as a seccomp filter - - "apparmor=unconfined" : Turn off apparmor confinement for the container - "apparmor=your-profile" : Set the apparmor confinement profile for the container - -**--storage-opt**=[] - Storage driver options per container - - $ docker run -it --storage-opt size=120G fedora /bin/bash - - This (size) will allow to set the container rootfs size to 120G at creation time. - This option is only available for the `devicemapper`, `btrfs`, `overlay2` and `zfs` graph drivers. - For the `devicemapper`, `btrfs` and `zfs` storage drivers, user cannot pass a size less than the Default BaseFS Size. - For the `overlay2` storage driver, the size option is only available if the backing fs is `xfs` and mounted with the `pquota` mount option. - Under these conditions, user can pass any size less then the backing fs size. - -**--stop-signal**=*SIGTERM* - Signal to stop a container. Default is SIGTERM. - -**--stop-timeout**=*10* - Timeout (in seconds) to stop a container. Default is 10. - -**--shm-size**="" - Size of `/dev/shm`. The format is ``. - `number` must be greater than `0`. Unit is optional and can be `b` (bytes), `k` (kilobytes), `m`(megabytes), or `g` (gigabytes). - If you omit the unit, the system uses bytes. If you omit the size entirely, the system uses `64m`. - -**--sysctl**=SYSCTL - Configure namespaced kernel parameters at runtime - - IPC Namespace - current sysctls allowed: - - kernel.msgmax, kernel.msgmnb, kernel.msgmni, kernel.sem, kernel.shmall, kernel.shmmax, kernel.shmmni, kernel.shm_rmid_forced - Sysctls beginning with fs.mqueue.* - - If you use the `--ipc=host` option these sysctls will not be allowed. - - Network Namespace - current sysctls allowed: - Sysctls beginning with net.* - - If you use the `--network=host` option these sysctls will not be allowed. - -**--sig-proxy**=*true*|*false* - Proxy received signals to the process (non-TTY mode only). SIGCHLD, SIGSTOP, and SIGKILL are not proxied. The default is *true*. - -**--memory-swappiness**="" - Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100. - -**-t**, **--tty**=*true*|*false* - Allocate a pseudo-TTY. The default is *false*. - - When set to true Docker can allocate a pseudo-tty and attach to the standard -input of any container. This can be used, for example, to run a throwaway -interactive shell. The default is false. - -The **-t** option is incompatible with a redirection of the docker client -standard input. - -**--tmpfs**=[] Create a tmpfs mount - - Mount a temporary filesystem (`tmpfs`) mount into a container, for example: - - $ docker run -d --tmpfs /tmp:rw,size=787448k,mode=1777 my_image - - This command mounts a `tmpfs` at `/tmp` within the container. The supported mount -options are the same as the Linux default `mount` flags. If you do not specify -any options, the systems uses the following options: -`rw,noexec,nosuid,nodev,size=65536k`. - -**-u**, **--user**="" - Sets the username or UID used and optionally the groupname or GID for the specified command. - - The followings examples are all valid: - --user [user | user:group | uid | uid:gid | user:gid | uid:group ] - - Without this argument the command will be run as root in the container. - -**--ulimit**=[] - Ulimit options - -**-v**|**--volume**[=*[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]*] - Create a bind mount. If you specify, ` -v /HOST-DIR:/CONTAINER-DIR`, Docker - bind mounts `/HOST-DIR` in the host to `/CONTAINER-DIR` in the Docker - container. If 'HOST-DIR' is omitted, Docker automatically creates the new - volume on the host. The `OPTIONS` are a comma delimited list and can be: - - * [rw|ro] - * [z|Z] - * [`[r]shared`|`[r]slave`|`[r]private`] - * [nocopy] - -The `CONTAINER-DIR` must be an absolute path such as `/src/docs`. The `HOST-DIR` -can be an absolute path or a `name` value. A `name` value must start with an -alphanumeric character, followed by `a-z0-9`, `_` (underscore), `.` (period) or -`-` (hyphen). An absolute path starts with a `/` (forward slash). - -If you supply a `HOST-DIR` that is an absolute path, Docker bind-mounts to the -path you specify. If you supply a `name`, Docker creates a named volume by that -`name`. For example, you can specify either `/foo` or `foo` for a `HOST-DIR` -value. If you supply the `/foo` value, Docker creates a bind-mount. If you -supply the `foo` specification, Docker creates a named volume. - -You can specify multiple **-v** options to mount one or more mounts to a -container. To use these same mounts in other containers, specify the -**--volumes-from** option also. - -You can add `:ro` or `:rw` suffix to a volume to mount it read-only or -read-write mode, respectively. By default, the volumes are mounted read-write. -See examples. - -Labeling systems like SELinux require that proper labels are placed on volume -content mounted into a container. Without a label, the security system might -prevent the processes running inside the container from using the content. By -default, Docker does not change the labels set by the OS. - -To change a label in the container context, you can add either of two suffixes -`:z` or `:Z` to the volume mount. These suffixes tell Docker to relabel file -objects on the shared volumes. The `z` option tells Docker that two containers -share the volume content. As a result, Docker labels the content with a shared -content label. Shared volume labels allow all containers to read/write content. -The `Z` option tells Docker to label the content with a private unshared label. -Only the current container can use a private volume. - -By default bind mounted volumes are `private`. That means any mounts done -inside container will not be visible on host and vice-a-versa. One can change -this behavior by specifying a volume mount propagation property. Making a -volume `shared` mounts done under that volume inside container will be -visible on host and vice-a-versa. Making a volume `slave` enables only one -way mount propagation and that is mounts done on host under that volume -will be visible inside container but not the other way around. - -To control mount propagation property of volume one can use `:[r]shared`, -`:[r]slave` or `:[r]private` propagation flag. Propagation property can -be specified only for bind mounted volumes and not for internal volumes or -named volumes. For mount propagation to work source mount point (mount point -where source dir is mounted on) has to have right propagation properties. For -shared volumes, source mount point has to be shared. And for slave volumes, -source mount has to be either shared or slave. - -Use `df ` to figure out the source mount and then use -`findmnt -o TARGET,PROPAGATION ` to figure out propagation -properties of source mount. If `findmnt` utility is not available, then one -can look at mount entry for source mount point in `/proc/self/mountinfo`. Look -at `optional fields` and see if any propagaion properties are specified. -`shared:X` means mount is `shared`, `master:X` means mount is `slave` and if -nothing is there that means mount is `private`. - -To change propagation properties of a mount point use `mount` command. For -example, if one wants to bind mount source directory `/foo` one can do -`mount --bind /foo /foo` and `mount --make-private --make-shared /foo`. This -will convert /foo into a `shared` mount point. Alternatively one can directly -change propagation properties of source mount. Say `/` is source mount for -`/foo`, then use `mount --make-shared /` to convert `/` into a `shared` mount. - -> **Note**: -> When using systemd to manage the Docker daemon's start and stop, in the systemd -> unit file there is an option to control mount propagation for the Docker daemon -> itself, called `MountFlags`. The value of this setting may cause Docker to not -> see mount propagation changes made on the mount point. For example, if this value -> is `slave`, you may not be able to use the `shared` or `rshared` propagation on -> a volume. - -To disable automatic copying of data from the container path to the volume, use -the `nocopy` flag. The `nocopy` flag can be set on bind mounts and named volumes. - -**--volume-driver**="" - Container's volume driver. This driver creates volumes specified either from - a Dockerfile's `VOLUME` instruction or from the `docker run -v` flag. - See **docker-volume-create(1)** for full details. - -**--volumes-from**=[] - Mount volumes from the specified container(s) - - Mounts already mounted volumes from a source container onto another - container. You must supply the source's container-id. To share - a volume, use the **--volumes-from** option when running - the target container. You can share volumes even if the source container - is not running. - - By default, Docker mounts the volumes in the same mode (read-write or - read-only) as it is mounted in the source container. Optionally, you - can change this by suffixing the container-id with either the `:ro` or - `:rw ` keyword. - - If the location of the volume from the source container overlaps with - data residing on a target container, then the volume hides - that data on the target. - -**-w**, **--workdir**="" - Working directory inside the container - - The default working directory for -running binaries within a container is the root directory (/). The developer can -set a different default with the Dockerfile WORKDIR instruction. The operator -can override the working directory by using the **-w** option. - -# Exit Status - -The exit code from `docker run` gives information about why the container -failed to run or why it exited. When `docker run` exits with a non-zero code, -the exit codes follow the `chroot` standard, see below: - -**_125_** if the error is with Docker daemon **_itself_** - - $ docker run --foo busybox; echo $? - # flag provided but not defined: --foo - See 'docker run --help'. - 125 - -**_126_** if the **_contained command_** cannot be invoked - - $ docker run busybox /etc; echo $? - # exec: "/etc": permission denied - docker: Error response from daemon: Contained command could not be invoked - 126 - -**_127_** if the **_contained command_** cannot be found - - $ docker run busybox foo; echo $? - # exec: "foo": executable file not found in $PATH - docker: Error response from daemon: Contained command not found or does not exist - 127 - -**_Exit code_** of **_contained command_** otherwise - - $ docker run busybox /bin/sh -c 'exit 3' - # 3 - -# EXAMPLES - -## Running container in read-only mode - -During container image development, containers often need to write to the image -content. Installing packages into /usr, for example. In production, -applications seldom need to write to the image. Container applications write -to volumes if they need to write to file systems at all. Applications can be -made more secure by running them in read-only mode using the --read-only switch. -This protects the containers image from modification. Read only containers may -still need to write temporary data. The best way to handle this is to mount -tmpfs directories on /run and /tmp. - - # docker run --read-only --tmpfs /run --tmpfs /tmp -i -t fedora /bin/bash - -## Exposing log messages from the container to the host's log - -If you want messages that are logged in your container to show up in the host's -syslog/journal then you should bind mount the /dev/log directory as follows. - - # docker run -v /dev/log:/dev/log -i -t fedora /bin/bash - -From inside the container you can test this by sending a message to the log. - - (bash)# logger "Hello from my container" - -Then exit and check the journal. - - # exit - - # journalctl -b | grep Hello - -This should list the message sent to logger. - -## Attaching to one or more from STDIN, STDOUT, STDERR - -If you do not specify -a then Docker will attach everything (stdin,stdout,stderr) -. You can specify to which of the three standard streams (stdin, stdout, stderr) -you'd like to connect instead, as in: - - # docker run -a stdin -a stdout -i -t fedora /bin/bash - -## Sharing IPC between containers - -Using shm_server.c available here: https://www.cs.cf.ac.uk/Dave/C/node27.html - -Testing `--ipc=host` mode: - -Host shows a shared memory segment with 7 pids attached, happens to be from httpd: - -``` - $ sudo ipcs -m - - ------ Shared Memory Segments -------- - key shmid owner perms bytes nattch status - 0x01128e25 0 root 600 1000 7 -``` - -Now run a regular container, and it correctly does NOT see the shared memory segment from the host: - -``` - $ docker run -it shm ipcs -m - - ------ Shared Memory Segments -------- - key shmid owner perms bytes nattch status -``` - -Run a container with the new `--ipc=host` option, and it now sees the shared memory segment from the host httpd: - - ``` - $ docker run -it --ipc=host shm ipcs -m - - ------ Shared Memory Segments -------- - key shmid owner perms bytes nattch status - 0x01128e25 0 root 600 1000 7 -``` -Testing `--ipc=container:CONTAINERID` mode: - -Start a container with a program to create a shared memory segment: -``` - $ docker run -it shm bash - $ sudo shm/shm_server & - $ sudo ipcs -m - - ------ Shared Memory Segments -------- - key shmid owner perms bytes nattch status - 0x0000162e 0 root 666 27 1 -``` -Create a 2nd container correctly shows no shared memory segment from 1st container: -``` - $ docker run shm ipcs -m - - ------ Shared Memory Segments -------- - key shmid owner perms bytes nattch status -``` - -Create a 3rd container using the new --ipc=container:CONTAINERID option, now it shows the shared memory segment from the first: - -``` - $ docker run -it --ipc=container:ed735b2264ac shm ipcs -m - $ sudo ipcs -m - - ------ Shared Memory Segments -------- - key shmid owner perms bytes nattch status - 0x0000162e 0 root 666 27 1 -``` - -## Linking Containers - -> **Note**: This section describes linking between containers on the -> default (bridge) network, also known as "legacy links". Using `--link` -> on user-defined networks uses the DNS-based discovery, which does not add -> entries to `/etc/hosts`, and does not set environment variables for -> discovery. - -The link feature allows multiple containers to communicate with each other. For -example, a container whose Dockerfile has exposed port 80 can be run and named -as follows: - - # docker run --name=link-test -d -i -t fedora/httpd - -A second container, in this case called linker, can communicate with the httpd -container, named link-test, by running with the **--link=:** - - # docker run -t -i --link=link-test:lt --name=linker fedora /bin/bash - -Now the container linker is linked to container link-test with the alias lt. -Running the **env** command in the linker container shows environment variables - with the LT (alias) context (**LT_**) - - # env - HOSTNAME=668231cb0978 - TERM=xterm - LT_PORT_80_TCP=tcp://172.17.0.3:80 - LT_PORT_80_TCP_PORT=80 - LT_PORT_80_TCP_PROTO=tcp - LT_PORT=tcp://172.17.0.3:80 - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - PWD=/ - LT_NAME=/linker/lt - SHLVL=1 - HOME=/ - LT_PORT_80_TCP_ADDR=172.17.0.3 - _=/usr/bin/env - -When linking two containers Docker will use the exposed ports of the container -to create a secure tunnel for the parent to access. - -If a container is connected to the default bridge network and `linked` -with other containers, then the container's `/etc/hosts` file is updated -with the linked container's name. - -> **Note** Since Docker may live update the container's `/etc/hosts` file, there -may be situations when processes inside the container can end up reading an -empty or incomplete `/etc/hosts` file. In most cases, retrying the read again -should fix the problem. - - -## Mapping Ports for External Usage - -The exposed port of an application can be mapped to a host port using the **-p** -flag. For example, an httpd port 80 can be mapped to the host port 8080 using the -following: - - # docker run -p 8080:80 -d -i -t fedora/httpd - -## Creating and Mounting a Data Volume Container - -Many applications require the sharing of persistent data across several -containers. Docker allows you to create a Data Volume Container that other -containers can mount from. For example, create a named container that contains -directories /var/volume1 and /tmp/volume2. The image will need to contain these -directories so a couple of RUN mkdir instructions might be required for you -fedora-data image: - - # docker run --name=data -v /var/volume1 -v /tmp/volume2 -i -t fedora-data true - # docker run --volumes-from=data --name=fedora-container1 -i -t fedora bash - -Multiple --volumes-from parameters will bring together multiple data volumes from -multiple containers. And it's possible to mount the volumes that came from the -DATA container in yet another container via the fedora-container1 intermediary -container, allowing to abstract the actual data source from users of that data: - - # docker run --volumes-from=fedora-container1 --name=fedora-container2 -i -t fedora bash - -## Mounting External Volumes - -To mount a host directory as a container volume, specify the absolute path to -the directory and the absolute path for the container directory separated by a -colon: - - # docker run -v /var/db:/data1 -i -t fedora bash - -When using SELinux, be aware that the host has no knowledge of container SELinux -policy. Therefore, in the above example, if SELinux policy is enforced, the -`/var/db` directory is not writable to the container. A "Permission Denied" -message will occur and an avc: message in the host's syslog. - - -To work around this, at time of writing this man page, the following command -needs to be run in order for the proper SELinux policy type label to be attached -to the host directory: - - # chcon -Rt svirt_sandbox_file_t /var/db - - -Now, writing to the /data1 volume in the container will be allowed and the -changes will also be reflected on the host in /var/db. - -## Using alternative security labeling - -You can override the default labeling scheme for each container by specifying -the `--security-opt` flag. For example, you can specify the MCS/MLS level, a -requirement for MLS systems. Specifying the level in the following command -allows you to share the same content between containers. - - # docker run --security-opt label=level:s0:c100,c200 -i -t fedora bash - -An MLS example might be: - - # docker run --security-opt label=level:TopSecret -i -t rhel7 bash - -To disable the security labeling for this container versus running with the -`--permissive` flag, use the following command: - - # docker run --security-opt label=disable -i -t fedora bash - -If you want a tighter security policy on the processes within a container, -you can specify an alternate type for the container. You could run a container -that is only allowed to listen on Apache ports by executing the following -command: - - # docker run --security-opt label=type:svirt_apache_t -i -t centos bash - -Note: - -You would have to write policy defining a `svirt_apache_t` type. - -## Setting device weight - -If you want to set `/dev/sda` device weight to `200`, you can specify the device -weight by `--blkio-weight-device` flag. Use the following command: - - # docker run -it --blkio-weight-device "/dev/sda:200" ubuntu - -## Specify isolation technology for container (--isolation) - -This option is useful in situations where you are running Docker containers on -Microsoft Windows. The `--isolation ` option sets a container's isolation -technology. On Linux, the only supported is the `default` option which uses -Linux namespaces. These two commands are equivalent on Linux: - -``` -$ docker run -d busybox top -$ docker run -d --isolation default busybox top -``` - -On Microsoft Windows, can take any of these values: - -* `default`: Use the value specified by the Docker daemon's `--exec-opt` . If the `daemon` does not specify an isolation technology, Microsoft Windows uses `process` as its default value. -* `process`: Namespace isolation only. -* `hyperv`: Hyper-V hypervisor partition-based isolation. - -In practice, when running on Microsoft Windows without a `daemon` option set, these two commands are equivalent: - -``` -$ docker run -d --isolation default busybox top -$ docker run -d --isolation process busybox top -``` - -If you have set the `--exec-opt isolation=hyperv` option on the Docker `daemon`, any of these commands also result in `hyperv` isolation: - -``` -$ docker run -d --isolation default busybox top -$ docker run -d --isolation hyperv busybox top -``` - -## Setting Namespaced Kernel Parameters (Sysctls) - -The `--sysctl` sets namespaced kernel parameters (sysctls) in the -container. For example, to turn on IP forwarding in the containers -network namespace, run this command: - - $ docker run --sysctl net.ipv4.ip_forward=1 someimage - -Note: - -Not all sysctls are namespaced. Docker does not support changing sysctls -inside of a container that also modify the host system. As the kernel -evolves we expect to see more sysctls become namespaced. - -See the definition of the `--sysctl` option above for the current list of -supported sysctls. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -July 2014, updated by Sven Dowideit -November 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/docker-save.1.md b/vendor/github.com/docker/docker/man/docker-save.1.md deleted file mode 100644 index 1d1de8a1d..000000000 --- a/vendor/github.com/docker/docker/man/docker-save.1.md +++ /dev/null @@ -1,45 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-save - Save one or more images to a tar archive (streamed to STDOUT by default) - -# SYNOPSIS -**docker save** -[**--help**] -[**-o**|**--output**[=*OUTPUT*]] -IMAGE [IMAGE...] - -# DESCRIPTION -Produces a tarred repository to the standard output stream. Contains all -parent layers, and all tags + versions, or specified repo:tag. - -Stream to a file instead of STDOUT by using **-o**. - -# OPTIONS -**--help** - Print usage statement - -**-o**, **--output**="" - Write to a file, instead of STDOUT - -# EXAMPLES - -Save all fedora repository images to a fedora-all.tar and save the latest -fedora image to a fedora-latest.tar: - - $ docker save fedora > fedora-all.tar - $ docker save --output=fedora-latest.tar fedora:latest - $ ls -sh fedora-all.tar - 721M fedora-all.tar - $ ls -sh fedora-latest.tar - 367M fedora-latest.tar - -# See also -**docker-load(1)** to load an image from a tar archive on STDIN. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -November 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-search.1.md b/vendor/github.com/docker/docker/man/docker-search.1.md deleted file mode 100644 index ad8bbc78b..000000000 --- a/vendor/github.com/docker/docker/man/docker-search.1.md +++ /dev/null @@ -1,70 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-search - Search the Docker Hub for images - -# SYNOPSIS -**docker search** -[**-f**|**--filter**[=*[]*]] -[**--help**] -[**--limit**[=*LIMIT*]] -[**--no-trunc**] -TERM - -# DESCRIPTION - -Search Docker Hub for images that match the specified `TERM`. The table -of images returned displays the name, description (truncated by default), number -of stars awarded, whether the image is official, and whether it is automated. - -*Note* - Search queries will only return up to 25 results - -# OPTIONS - -**-f**, **--filter**=[] - Filter output based on these conditions: - - stars= - - is-automated=(true|false) - - is-official=(true|false) - -**--help** - Print usage statement - -**--limit**=*LIMIT* - Maximum returned search results. The default is 25. - -**--no-trunc**=*true*|*false* - Don't truncate output. The default is *false*. - -# EXAMPLES - -## Search Docker Hub for ranked images - -Search a registry for the term 'fedora' and only display those images -ranked 3 or higher: - - $ docker search --filter=stars=3 fedora - NAME DESCRIPTION STARS OFFICIAL AUTOMATED - mattdm/fedora A basic Fedora image corresponding roughly... 50 - fedora (Semi) Official Fedora base image. 38 - mattdm/fedora-small A small Fedora image on which to build. Co... 8 - goldmann/wildfly A WildFly application server running on a ... 3 [OK] - -## Search Docker Hub for automated images - -Search Docker Hub for the term 'fedora' and only display automated images -ranked 1 or higher: - - $ docker search --filter=is-automated=true --filter=stars=1 fedora - NAME DESCRIPTION STARS OFFICIAL AUTOMATED - goldmann/wildfly A WildFly application server running on a ... 3 [OK] - tutum/fedora-20 Fedora 20 image with SSH access. For the r... 1 [OK] - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 -April 2016, updated by Vincent Demeester - diff --git a/vendor/github.com/docker/docker/man/docker-start.1.md b/vendor/github.com/docker/docker/man/docker-start.1.md deleted file mode 100644 index c00b0a166..000000000 --- a/vendor/github.com/docker/docker/man/docker-start.1.md +++ /dev/null @@ -1,39 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-start - Start one or more containers - -# SYNOPSIS -**docker start** -[**-a**|**--attach**] -[**--detach-keys**[=*[]*]] -[**--help**] -[**-i**|**--interactive**] -CONTAINER [CONTAINER...] - -# DESCRIPTION - -Start one or more containers. - -# OPTIONS -**-a**, **--attach**=*true*|*false* - Attach container's STDOUT and STDERR and forward all signals to the - process. The default is *false*. - -**--detach-keys**="" - Override the key sequence for detaching a container. Format is a single character `[a-Z]` or `ctrl-` where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**--help** - Print usage statement - -**-i**, **--interactive**=*true*|*false* - Attach container's STDIN. The default is *false*. - -# See also -**docker-stop(1)** to stop a container. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-stats.1.md b/vendor/github.com/docker/docker/man/docker-stats.1.md deleted file mode 100644 index 0f022cd41..000000000 --- a/vendor/github.com/docker/docker/man/docker-stats.1.md +++ /dev/null @@ -1,57 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-stats - Display a live stream of one or more containers' resource usage statistics - -# SYNOPSIS -**docker stats** -[**-a**|**--all**] -[**--help**] -[**--no-stream**] -[**--format[="*TEMPLATE*"]**] -[CONTAINER...] - -# DESCRIPTION - -Display a live stream of one or more containers' resource usage statistics - -# OPTIONS -**-a**, **--all**=*true*|*false* - Show all containers. Only running containers are shown by default. The default is *false*. - -**--help** - Print usage statement - -**--no-stream**=*true*|*false* - Disable streaming stats and only pull the first result, default setting is false. - -**--format**="*TEMPLATE*" - Pretty-print containers statistics using a Go template. - Valid placeholders: - .Container - Container name or ID. - .Name - Container name. - .ID - Container ID. - .CPUPerc - CPU percentage. - .MemUsage - Memory usage. - .NetIO - Network IO. - .BlockIO - Block IO. - .MemPerc - Memory percentage (Not available on Windows). - .PIDs - Number of PIDs (Not available on Windows). - -# EXAMPLES - -Running `docker stats` on all running containers - - $ docker stats - CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O - 1285939c1fd3 0.07% 796 KiB / 64 MiB 1.21% 788 B / 648 B 3.568 MB / 512 KB - 9c76f7834ae2 0.07% 2.746 MiB / 64 MiB 4.29% 1.266 KB / 648 B 12.4 MB / 0 B - d1ea048f04e4 0.03% 4.583 MiB / 64 MiB 6.30% 2.854 KB / 648 B 27.7 MB / 0 B - -Running `docker stats` on multiple containers by name and id. - - $ docker stats fervent_panini 5acfcb1b4fd1 - CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O - 5acfcb1b4fd1 0.00% 115.2 MiB/1.045 GiB 11.03% 1.422 kB/648 B - fervent_panini 0.02% 11.08 MiB/1.045 GiB 1.06% 648 B/648 B diff --git a/vendor/github.com/docker/docker/man/docker-stop.1.md b/vendor/github.com/docker/docker/man/docker-stop.1.md deleted file mode 100644 index fa377c92c..000000000 --- a/vendor/github.com/docker/docker/man/docker-stop.1.md +++ /dev/null @@ -1,30 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-stop - Stop a container by sending SIGTERM and then SIGKILL after a grace period - -# SYNOPSIS -**docker stop** -[**--help**] -[**-t**|**--time**[=*10*]] -CONTAINER [CONTAINER...] - -# DESCRIPTION -Stop a container (Send SIGTERM, and then SIGKILL after - grace period) - -# OPTIONS -**--help** - Print usage statement - -**-t**, **--time**=*10* - Number of seconds to wait for the container to stop before killing it. Default is 10 seconds. - -#See also -**docker-start(1)** to restart a stopped container. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-tag.1.md b/vendor/github.com/docker/docker/man/docker-tag.1.md deleted file mode 100644 index 7f27e1b0e..000000000 --- a/vendor/github.com/docker/docker/man/docker-tag.1.md +++ /dev/null @@ -1,76 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-tag - Create a tag `TARGET_IMAGE` that refers to `SOURCE_IMAGE` - -# SYNOPSIS -**docker tag** -[**--help**] -SOURCE_NAME[:TAG] TARGET_NAME[:TAG] - -# DESCRIPTION -Assigns a new alias to an image in a registry. An alias refers to the -entire image name including the optional `TAG` after the ':'. - -# "OPTIONS" -**--help** - Print usage statement. - -**NAME** - The image name which is made up of slash-separated name components, - optionally prefixed by a registry hostname. The hostname must comply with - standard DNS rules, but may not contain underscores. If a hostname is - present, it may optionally be followed by a port number in the format - `:8080`. If not present, the command uses Docker's public registry located at - `registry-1.docker.io` by default. Name components may contain lowercase - characters, digits and separators. A separator is defined as a period, one or - two underscores, or one or more dashes. A name component may not start or end - with a separator. - -**TAG** - The tag assigned to the image to version and distinguish images with the same - name. The tag name may contain lowercase and uppercase characters, digits, - underscores, periods and dashes. A tag name may not start with a period or a - dash and may contain a maximum of 128 characters. - -# EXAMPLES - -## Tagging an image referenced by ID - -To tag a local image with ID "0e5574283393" into the "fedora" repository with -"version1.0": - - docker tag 0e5574283393 fedora/httpd:version1.0 - -## Tagging an image referenced by Name - -To tag a local image with name "httpd" into the "fedora" repository with -"version1.0": - - docker tag httpd fedora/httpd:version1.0 - -Note that since the tag name is not specified, the alias is created for an -existing local version `httpd:latest`. - -## Tagging an image referenced by Name and Tag - -To tag a local image with name "httpd" and tag "test" into the "fedora" -repository with "version1.0.test": - - docker tag httpd:test fedora/httpd:version1.0.test - -## Tagging an image for a private repository - -To push an image to a private registry and not the central Docker -registry you must tag it with the registry hostname and port (if needed). - - docker tag 0e5574283393 myregistryhost:5000/fedora/httpd:version1.0 - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -July 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 -June 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/docker-top.1.md b/vendor/github.com/docker/docker/man/docker-top.1.md deleted file mode 100644 index a666f7cd3..000000000 --- a/vendor/github.com/docker/docker/man/docker-top.1.md +++ /dev/null @@ -1,36 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-top - Display the running processes of a container - -# SYNOPSIS -**docker top** -[**--help**] -CONTAINER [ps OPTIONS] - -# DESCRIPTION - -Display the running process of the container. ps-OPTION can be any of the options you would pass to a Linux ps command. - -All displayed information is from host's point of view. - -# OPTIONS -**--help** - Print usage statement - -# EXAMPLES - -Run **docker top** with the ps option of -x: - - $ docker top 8601afda2b -x - PID TTY STAT TIME COMMAND - 16623 ? Ss 0:00 sleep 99999 - - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -June 2015, updated by Ma Shimiao -December 2015, updated by Pavel Pospisil diff --git a/vendor/github.com/docker/docker/man/docker-unpause.1.md b/vendor/github.com/docker/docker/man/docker-unpause.1.md deleted file mode 100644 index e6fd3c4e0..000000000 --- a/vendor/github.com/docker/docker/man/docker-unpause.1.md +++ /dev/null @@ -1,28 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-unpause - Unpause all processes within one or more containers - -# SYNOPSIS -**docker unpause** -CONTAINER [CONTAINER...] - -# DESCRIPTION - -The `docker unpause` command un-suspends all processes in the specified containers. -On Linux, it does this using the cgroups freezer. - -See the [cgroups freezer documentation] -(https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt) for -further details. - -# OPTIONS -**--help** - Print usage statement - -# See also -**docker-pause(1)** to pause all processes within one or more containers. - -# HISTORY -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-update.1.md b/vendor/github.com/docker/docker/man/docker-update.1.md deleted file mode 100644 index 85f3dd07c..000000000 --- a/vendor/github.com/docker/docker/man/docker-update.1.md +++ /dev/null @@ -1,171 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-update - Update configuration of one or more containers - -# SYNOPSIS -**docker update** -[**--blkio-weight**[=*[BLKIO-WEIGHT]*]] -[**--cpu-shares**[=*0*]] -[**--cpu-period**[=*0*]] -[**--cpu-quota**[=*0*]] -[**--cpu-rt-period**[=*0*]] -[**--cpu-rt-runtime**[=*0*]] -[**--cpuset-cpus**[=*CPUSET-CPUS*]] -[**--cpuset-mems**[=*CPUSET-MEMS*]] -[**--help**] -[**--kernel-memory**[=*KERNEL-MEMORY*]] -[**-m**|**--memory**[=*MEMORY*]] -[**--memory-reservation**[=*MEMORY-RESERVATION*]] -[**--memory-swap**[=*MEMORY-SWAP*]] -[**--restart**[=*""*]] -CONTAINER [CONTAINER...] - -# DESCRIPTION - -The **docker update** command dynamically updates container configuration. -You can use this command to prevent containers from consuming too many -resources from their Docker host. With a single command, you can place -limits on a single container or on many. To specify more than one container, -provide space-separated list of container names or IDs. - -With the exception of the **--kernel-memory** option, you can specify these -options on a running or a stopped container. On kernel version older than -4.6, You can only update **--kernel-memory** on a stopped container or on -a running container with kernel memory initialized. - -# OPTIONS - -**--blkio-weight**=0 - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - -**--cpu-shares**=0 - CPU shares (relative weight) - -**--cpu-period**=0 - Limit the CPU CFS (Completely Fair Scheduler) period - - Limit the container's CPU usage. This flag tell the kernel to restrict the container's CPU usage to the period you specify. - -**--cpu-quota**=0 - Limit the CPU CFS (Completely Fair Scheduler) quota - -**--cpu-rt-period**=0 - Limit the CPU real-time period in microseconds - - Limit the container's Real Time CPU usage. This flag tell the kernel to restrict the container's Real Time CPU usage to the period you specify. - -**--cpu-rt-runtime**=0 - Limit the CPU real-time runtime in microseconds - - Limit the containers Real Time CPU usage. This flag tells the kernel to limit the amount of time in a given CPU period Real Time tasks may consume. Ex: - Period of 1,000,000us and Runtime of 950,000us means that this container could consume 95% of available CPU and leave the remaining 5% to normal priority tasks. - - The sum of all runtimes across containers cannot exceed the amount allotted to the parent cgroup. - -**--cpuset-cpus**="" - CPUs in which to allow execution (0-3, 0,1) - -**--cpuset-mems**="" - Memory nodes(MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - -**--help** - Print usage statement - -**--kernel-memory**="" - Kernel memory limit (format: `[]`, where unit = b, k, m or g) - - Note that on kernel version older than 4.6, you can not update kernel memory on - a running container if the container is started without kernel memory initialized, - in this case, it can only be updated after it's stopped. The new setting takes - effect when the container is started. - -**-m**, **--memory**="" - Memory limit (format: , where unit = b, k, m or g) - - Note that the memory should be smaller than the already set swap memory limit. - If you want update a memory limit bigger than the already set swap memory limit, - you should update swap memory limit at the same time. If you don't set swap memory - limit on docker create/run but only memory limit, the swap memory is double - the memory limit. - -**--memory-reservation**="" - Memory soft limit (format: [], where unit = b, k, m or g) - -**--memory-swap**="" - Total memory limit (memory + swap) - -**--restart**="" - Restart policy to apply when a container exits (no, on-failure[:max-retry], always, unless-stopped). - -# EXAMPLES - -The following sections illustrate ways to use this command. - -### Update a container's cpu-shares - -To limit a container's cpu-shares to 512, first identify the container -name or ID. You can use **docker ps** to find these values. You can also -use the ID returned from the **docker run** command. Then, do the following: - -```bash -$ docker update --cpu-shares 512 abebf7571666 -``` - -### Update a container with cpu-shares and memory - -To update multiple resource configurations for multiple containers: - -```bash -$ docker update --cpu-shares 512 -m 300M abebf7571666 hopeful_morse -``` - -### Update a container's kernel memory constraints - -You can update a container's kernel memory limit using the **--kernel-memory** -option. On kernel version older than 4.6, this option can be updated on a -running container only if the container was started with **--kernel-memory**. -If the container was started *without* **--kernel-memory** you need to stop -the container before updating kernel memory. - -For example, if you started a container with this command: - -```bash -$ docker run -dit --name test --kernel-memory 50M ubuntu bash -``` - -You can update kernel memory while the container is running: - -```bash -$ docker update --kernel-memory 80M test -``` - -If you started a container *without* kernel memory initialized: - -```bash -$ docker run -dit --name test2 --memory 300M ubuntu bash -``` - -Update kernel memory of running container `test2` will fail. You need to stop -the container before updating the **--kernel-memory** setting. The next time you -start it, the container uses the new value. - -Kernel version newer than (include) 4.6 does not have this limitation, you -can use `--kernel-memory` the same way as other options. - -### Update a container's restart policy - -You can change a container's restart policy on a running container. The new -restart policy takes effect instantly after you run `docker update` on a -container. - -To update restart policy for one or more containers: - -```bash -$ docker update --restart=on-failure:3 abebf7571666 hopeful_morse -``` - -Note that if the container is started with "--rm" flag, you cannot update the restart -policy for it. The `AutoRemove` and `RestartPolicy` are mutually exclusive for the -container. diff --git a/vendor/github.com/docker/docker/man/docker-version.1.md b/vendor/github.com/docker/docker/man/docker-version.1.md deleted file mode 100644 index 1838f8205..000000000 --- a/vendor/github.com/docker/docker/man/docker-version.1.md +++ /dev/null @@ -1,62 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2015 -# NAME -docker-version - Show the Docker version information. - -# SYNOPSIS -**docker version** -[**--help**] -[**-f**|**--format**[=*FORMAT*]] - -# DESCRIPTION -This command displays version information for both the Docker client and -daemon. - -# OPTIONS -**--help** - Print usage statement - -**-f**, **--format**="" - Format the output using the given Go template. - -# EXAMPLES - -## Display Docker version information - -The default output: - - $ docker version - Client: - Version: 1.8.0 - API version: 1.20 - Go version: go1.4.2 - Git commit: f5bae0a - Built: Tue Jun 23 17:56:00 UTC 2015 - OS/Arch: linux/amd64 - - Server: - Version: 1.8.0 - API version: 1.20 - Go version: go1.4.2 - Git commit: f5bae0a - Built: Tue Jun 23 17:56:00 UTC 2015 - OS/Arch: linux/amd64 - -Get server version: - - $ docker version --format '{{.Server.Version}}' - 1.8.0 - -Dump raw data: - -To view all available fields, you can use the format `{{json .}}`. - - $ docker version --format '{{json .}}' - {"Client":{"Version":"1.8.0","ApiVersion":"1.20","GitCommit":"f5bae0a","GoVersion":"go1.4.2","Os":"linux","Arch":"amd64","BuildTime":"Tue Jun 23 17:56:00 UTC 2015"},"ServerOK":true,"Server":{"Version":"1.8.0","ApiVersion":"1.20","GitCommit":"f5bae0a","GoVersion":"go1.4.2","Os":"linux","Arch":"amd64","KernelVersion":"3.13.2-gentoo","BuildTime":"Tue Jun 23 17:56:00 UTC 2015"}} - - -# HISTORY -June 2014, updated by Sven Dowideit -June 2015, updated by John Howard -June 2015, updated by Patrick Hemmer diff --git a/vendor/github.com/docker/docker/man/docker-wait.1.md b/vendor/github.com/docker/docker/man/docker-wait.1.md deleted file mode 100644 index 678800966..000000000 --- a/vendor/github.com/docker/docker/man/docker-wait.1.md +++ /dev/null @@ -1,30 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-wait - Block until one or more containers stop, then print their exit codes - -# SYNOPSIS -**docker wait** -[**--help**] -CONTAINER [CONTAINER...] - -# DESCRIPTION - -Block until one or more containers stop, then print their exit codes. - -# OPTIONS -**--help** - Print usage statement - -# EXAMPLES - - $ docker run -d fedora sleep 99 - 079b83f558a2bc52ecad6b2a5de13622d584e6bb1aea058c11b36511e85e7622 - $ docker wait 079b83f558a2bc - 0 - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker.1.md b/vendor/github.com/docker/docker/man/docker.1.md deleted file mode 100644 index 2a9618443..000000000 --- a/vendor/github.com/docker/docker/man/docker.1.md +++ /dev/null @@ -1,237 +0,0 @@ -% DOCKER(1) Docker User Manuals -% William Henry -% APRIL 2014 -# NAME -docker \- Docker image and container command line interface - -# SYNOPSIS -**docker** [OPTIONS] COMMAND [ARG...] - -**docker** daemon [--help|...] - -**docker** [--help|-v|--version] - -# DESCRIPTION -is a client for interacting with the daemon (see **dockerd(8)**) through the CLI. - -The Docker CLI has over 30 commands. The commands are listed below and each has -its own man page which explain usage and arguments. - -To see the man page for a command run **man docker **. - -# OPTIONS -**--help** - Print usage statement - -**--config**="" - Specifies the location of the Docker client configuration files. The default is '~/.docker'. - -**-D**, **--debug**=*true*|*false* - Enable debug mode. Default is false. - -**-H**, **--host**=[*unix:///var/run/docker.sock*]: tcp://[host]:[port][path] to bind or -unix://[/path/to/socket] to use. - The socket(s) to bind to in daemon mode specified using one or more - tcp://host:port/path, unix:///path/to/socket, fd://* or fd://socketfd. - If the tcp port is not specified, then it will default to either `2375` when - `--tls` is off, or `2376` when `--tls` is on, or `--tlsverify` is specified. - -**-l**, **--log-level**="*debug*|*info*|*warn*|*error*|*fatal*" - Set the logging level. Default is `info`. - -**--tls**=*true*|*false* - Use TLS; implied by --tlsverify. Default is false. - -**--tlscacert**=*~/.docker/ca.pem* - Trust certs signed only by this CA. - -**--tlscert**=*~/.docker/cert.pem* - Path to TLS certificate file. - -**--tlskey**=*~/.docker/key.pem* - Path to TLS key file. - -**--tlsverify**=*true*|*false* - Use TLS and verify the remote (daemon: verify client, client: verify daemon). - Default is false. - -**-v**, **--version**=*true*|*false* - Print version information and quit. Default is false. - -# COMMANDS -**attach** - Attach to a running container - See **docker-attach(1)** for full documentation on the **attach** command. - -**build** - Build an image from a Dockerfile - See **docker-build(1)** for full documentation on the **build** command. - -**commit** - Create a new image from a container's changes - See **docker-commit(1)** for full documentation on the **commit** command. - -**cp** - Copy files/folders between a container and the local filesystem - See **docker-cp(1)** for full documentation on the **cp** command. - -**create** - Create a new container - See **docker-create(1)** for full documentation on the **create** command. - -**diff** - Inspect changes on a container's filesystem - See **docker-diff(1)** for full documentation on the **diff** command. - -**events** - Get real time events from the server - See **docker-events(1)** for full documentation on the **events** command. - -**exec** - Run a command in a running container - See **docker-exec(1)** for full documentation on the **exec** command. - -**export** - Stream the contents of a container as a tar archive - See **docker-export(1)** for full documentation on the **export** command. - -**history** - Show the history of an image - See **docker-history(1)** for full documentation on the **history** command. - -**images** - List images - See **docker-images(1)** for full documentation on the **images** command. - -**import** - Create a new filesystem image from the contents of a tarball - See **docker-import(1)** for full documentation on the **import** command. - -**info** - Display system-wide information - See **docker-info(1)** for full documentation on the **info** command. - -**inspect** - Return low-level information on a container or image - See **docker-inspect(1)** for full documentation on the **inspect** command. - -**kill** - Kill a running container (which includes the wrapper process and everything -inside it) - See **docker-kill(1)** for full documentation on the **kill** command. - -**load** - Load an image from a tar archive - See **docker-load(1)** for full documentation on the **load** command. - -**login** - Log in to a Docker Registry - See **docker-login(1)** for full documentation on the **login** command. - -**logout** - Log the user out of a Docker Registry - See **docker-logout(1)** for full documentation on the **logout** command. - -**logs** - Fetch the logs of a container - See **docker-logs(1)** for full documentation on the **logs** command. - -**pause** - Pause all processes within a container - See **docker-pause(1)** for full documentation on the **pause** command. - -**port** - Lookup the public-facing port which is NAT-ed to PRIVATE_PORT - See **docker-port(1)** for full documentation on the **port** command. - -**ps** - List containers - See **docker-ps(1)** for full documentation on the **ps** command. - -**pull** - Pull an image or a repository from a Docker Registry - See **docker-pull(1)** for full documentation on the **pull** command. - -**push** - Push an image or a repository to a Docker Registry - See **docker-push(1)** for full documentation on the **push** command. - -**rename** - Rename a container. - See **docker-rename(1)** for full documentation on the **rename** command. - -**restart** - Restart one or more containers - See **docker-restart(1)** for full documentation on the **restart** command. - -**rm** - Remove one or more containers - See **docker-rm(1)** for full documentation on the **rm** command. - -**rmi** - Remove one or more images - See **docker-rmi(1)** for full documentation on the **rmi** command. - -**run** - Run a command in a new container - See **docker-run(1)** for full documentation on the **run** command. - -**save** - Save an image to a tar archive - See **docker-save(1)** for full documentation on the **save** command. - -**search** - Search for an image in the Docker index - See **docker-search(1)** for full documentation on the **search** command. - -**start** - Start a container - See **docker-start(1)** for full documentation on the **start** command. - -**stats** - Display a live stream of one or more containers' resource usage statistics - See **docker-stats(1)** for full documentation on the **stats** command. - -**stop** - Stop a container - See **docker-stop(1)** for full documentation on the **stop** command. - -**tag** - Tag an image into a repository - See **docker-tag(1)** for full documentation on the **tag** command. - -**top** - Lookup the running processes of a container - See **docker-top(1)** for full documentation on the **top** command. - -**unpause** - Unpause all processes within a container - See **docker-unpause(1)** for full documentation on the **unpause** command. - -**version** - Show the Docker version information - See **docker-version(1)** for full documentation on the **version** command. - -**wait** - Block until a container stops, then print its exit code - See **docker-wait(1)** for full documentation on the **wait** command. - - -# RUNTIME EXECUTION OPTIONS - -Use the **--exec-opt** flags to specify options to the execution driver. -The following options are available: - -#### native.cgroupdriver -Specifies the management of the container's `cgroups`. You can specify `cgroupfs` -or `systemd`. If you specify `systemd` and it is not available, the system errors -out. - -#### Client -For specific client examples please see the man page for the specific Docker -command. For example: - - man docker-run - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) based on docker.com source material and internal work. diff --git a/vendor/github.com/docker/docker/man/dockerd.8.md b/vendor/github.com/docker/docker/man/dockerd.8.md deleted file mode 100644 index 761dc6b9b..000000000 --- a/vendor/github.com/docker/docker/man/dockerd.8.md +++ /dev/null @@ -1,710 +0,0 @@ -% DOCKER(8) Docker User Manuals -% Shishir Mahajan -% SEPTEMBER 2015 -# NAME -dockerd - Enable daemon mode - -# SYNOPSIS -**dockerd** -[**--add-runtime**[=*[]*]] -[**--api-cors-header**=[=*API-CORS-HEADER*]] -[**--authorization-plugin**[=*[]*]] -[**-b**|**--bridge**[=*BRIDGE*]] -[**--bip**[=*BIP*]] -[**--cgroup-parent**[=*[]*]] -[**--cluster-store**[=*[]*]] -[**--cluster-advertise**[=*[]*]] -[**--cluster-store-opt**[=*map[]*]] -[**--config-file**[=*/etc/docker/daemon.json*]] -[**--containerd**[=*SOCKET-PATH*]] -[**-D**|**--debug**] -[**--default-gateway**[=*DEFAULT-GATEWAY*]] -[**--default-gateway-v6**[=*DEFAULT-GATEWAY-V6*]] -[**--default-runtime**[=*runc*]] -[**--default-ulimit**[=*[]*]] -[**--disable-legacy-registry**] -[**--dns**[=*[]*]] -[**--dns-opt**[=*[]*]] -[**--dns-search**[=*[]*]] -[**--exec-opt**[=*[]*]] -[**--exec-root**[=*/var/run/docker*]] -[**--experimental**[=*false*]] -[**--fixed-cidr**[=*FIXED-CIDR*]] -[**--fixed-cidr-v6**[=*FIXED-CIDR-V6*]] -[**-G**|**--group**[=*docker*]] -[**-g**|**--graph**[=*/var/lib/docker*]] -[**-H**|**--host**[=*[]*]] -[**--help**] -[**--icc**[=*true*]] -[**--init**[=*false*]] -[**--init-path**[=*""*]] -[**--insecure-registry**[=*[]*]] -[**--ip**[=*0.0.0.0*]] -[**--ip-forward**[=*true*]] -[**--ip-masq**[=*true*]] -[**--iptables**[=*true*]] -[**--ipv6**] -[**--isolation**[=*default*]] -[**-l**|**--log-level**[=*info*]] -[**--label**[=*[]*]] -[**--live-restore**[=*false*]] -[**--log-driver**[=*json-file*]] -[**--log-opt**[=*map[]*]] -[**--mtu**[=*0*]] -[**--max-concurrent-downloads**[=*3*]] -[**--max-concurrent-uploads**[=*5*]] -[**-p**|**--pidfile**[=*/var/run/docker.pid*]] -[**--raw-logs**] -[**--registry-mirror**[=*[]*]] -[**-s**|**--storage-driver**[=*STORAGE-DRIVER*]] -[**--seccomp-profile**[=*SECCOMP-PROFILE-PATH*]] -[**--selinux-enabled**] -[**--shutdown-timeout**[=*15*]] -[**--storage-opt**[=*[]*]] -[**--swarm-default-advertise-addr**[=*IP|INTERFACE*]] -[**--tls**] -[**--tlscacert**[=*~/.docker/ca.pem*]] -[**--tlscert**[=*~/.docker/cert.pem*]] -[**--tlskey**[=*~/.docker/key.pem*]] -[**--tlsverify**] -[**--userland-proxy**[=*true*]] -[**--userland-proxy-path**[=*""*]] -[**--userns-remap**[=*default*]] - -# DESCRIPTION -**dockerd** is used for starting the Docker daemon (i.e., to command the daemon -to manage images, containers etc). So **dockerd** is a server, as a daemon. - -To run the Docker daemon you can specify **dockerd**. -You can check the daemon options using **dockerd --help**. -Daemon options should be specified after the **dockerd** keyword in the -following format. - -**dockerd [OPTIONS]** - -# OPTIONS - -**--add-runtime**=[] - Runtimes can be registered with the daemon either via the -configuration file or using the `--add-runtime` command line argument. - - The following is an example adding 2 runtimes via the configuration: - -```json -{ - "default-runtime": "runc", - "runtimes": { - "runc": { - "path": "runc" - }, - "custom": { - "path": "/usr/local/bin/my-runc-replacement", - "runtimeArgs": [ - "--debug" - ] - } - } -} -``` - - This is the same example via the command line: - -```bash -$ sudo dockerd --add-runtime runc=runc --add-runtime custom=/usr/local/bin/my-runc-replacement -``` - - **Note**: defining runtime arguments via the command line is not supported. - -**--api-cors-header**="" - Set CORS headers in the Engine API. Default is cors disabled. Give urls like - "http://foo, http://bar, ...". Give "*" to allow all. - -**--authorization-plugin**="" - Set authorization plugins to load - -**-b**, **--bridge**="" - Attach containers to a pre\-existing network bridge; use 'none' to disable - container networking - -**--bip**="" - Use the provided CIDR notation address for the dynamically created bridge - (docker0); Mutually exclusive of \-b - -**--cgroup-parent**="" - Set parent cgroup for all containers. Default is "/docker" for fs cgroup - driver and "system.slice" for systemd cgroup driver. - -**--cluster-store**="" - URL of the distributed storage backend - -**--cluster-advertise**="" - Specifies the 'host:port' or `interface:port` combination that this - particular daemon instance should use when advertising itself to the cluster. - The daemon is reached through this value. - -**--cluster-store-opt**="" - Specifies options for the Key/Value store. - -**--config-file**="/etc/docker/daemon.json" - Specifies the JSON file path to load the configuration from. - -**--containerd**="" - Path to containerd socket. - -**-D**, **--debug**=*true*|*false* - Enable debug mode. Default is false. - -**--default-gateway**="" - IPv4 address of the container default gateway; this address must be part of - the bridge subnet (which is defined by \-b or \--bip) - -**--default-gateway-v6**="" - IPv6 address of the container default gateway - -**--default-runtime**="runc" - Set default runtime if there're more than one specified by `--add-runtime`. - -**--default-ulimit**=[] - Default ulimits for containers. - -**--disable-legacy-registry**=*true*|*false* - Disable contacting legacy registries - -**--dns**="" - Force Docker to use specific DNS servers - -**--dns-opt**="" - DNS options to use. - -**--dns-search**=[] - DNS search domains to use. - -**--exec-opt**=[] - Set runtime execution options. See RUNTIME EXECUTION OPTIONS. - -**--exec-root**="" - Path to use as the root of the Docker execution state files. Default is - `/var/run/docker`. - -**--experimental**="" - Enable the daemon experimental features. - -**--fixed-cidr**="" - IPv4 subnet for fixed IPs (e.g., 10.20.0.0/16); this subnet must be nested in - the bridge subnet (which is defined by \-b or \-\-bip). - -**--fixed-cidr-v6**="" - IPv6 subnet for global IPv6 addresses (e.g., 2a00:1450::/64) - -**-G**, **--group**="" - Group to assign the unix socket specified by -H when running in daemon mode. - use '' (the empty string) to disable setting of a group. Default is `docker`. - -**-g**, **--graph**="" - Path to use as the root of the Docker runtime. Default is `/var/lib/docker`. - -**-H**, **--host**=[*unix:///var/run/docker.sock*]: tcp://[host:port] to bind or -unix://[/path/to/socket] to use. - The socket(s) to bind to in daemon mode specified using one or more - tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd. - -**--help** - Print usage statement - -**--icc**=*true*|*false* - Allow unrestricted inter\-container and Docker daemon host communication. If - disabled, containers can still be linked together using the **--link** option - (see **docker-run(1)**). Default is true. - -**--init** - Run an init process inside containers for signal forwarding and process - reaping. - -**--init-path** - Path to the docker-init binary. - -**--insecure-registry**=[] - Enable insecure registry communication, i.e., enable un-encrypted and/or - untrusted communication. - - List of insecure registries can contain an element with CIDR notation to - specify a whole subnet. Insecure registries accept HTTP and/or accept HTTPS - with certificates from unknown CAs. - - Enabling `--insecure-registry` is useful when running a local registry. - However, because its use creates security vulnerabilities it should ONLY be - enabled for testing purposes. For increased security, users should add their - CA to their system's list of trusted CAs instead of using - `--insecure-registry`. - -**--ip**="" - Default IP address to use when binding container ports. Default is `0.0.0.0`. - -**--ip-forward**=*true*|*false* - Enables IP forwarding on the Docker host. The default is `true`. This flag - interacts with the IP forwarding setting on your host system's kernel. If - your system has IP forwarding disabled, this setting enables it. If your - system has IP forwarding enabled, setting this flag to `--ip-forward=false` - has no effect. - - This setting will also enable IPv6 forwarding if you have both - `--ip-forward=true` and `--fixed-cidr-v6` set. Note that this may reject - Router Advertisements and interfere with the host's existing IPv6 - configuration. For more information, please consult the documentation about - "Advanced Networking - IPv6". - -**--ip-masq**=*true*|*false* - Enable IP masquerading for bridge's IP range. Default is true. - -**--iptables**=*true*|*false* - Enable Docker's addition of iptables rules. Default is true. - -**--ipv6**=*true*|*false* - Enable IPv6 support. Default is false. Docker will create an IPv6-enabled - bridge with address fe80::1 which will allow you to create IPv6-enabled - containers. Use together with `--fixed-cidr-v6` to provide globally routable - IPv6 addresses. IPv6 forwarding will be enabled if not used with - `--ip-forward=false`. This may collide with your host's current IPv6 - settings. For more information please consult the documentation about - "Advanced Networking - IPv6". - -**--isolation**="*default*" - Isolation specifies the type of isolation technology used by containers. - Note that the default on Windows server is `process`, and the default on - Windows client is `hyperv`. Linux only supports `default`. - -**-l**, **--log-level**="*debug*|*info*|*warn*|*error*|*fatal*" - Set the logging level. Default is `info`. - -**--label**="[]" - Set key=value labels to the daemon (displayed in `docker info`) - -**--live-restore**=*false* - Enable live restore of running containers when the daemon starts so that they - are not restarted. This option is applicable only for docker daemon running - on Linux host. - -**--log-driver**="*json-file*|*syslog*|*journald*|*gelf*|*fluentd*|*awslogs*|*splunk*|*etwlogs*|*gcplogs*|*none*" - Default driver for container logs. Default is `json-file`. - **Warning**: `docker logs` command works only for `json-file` logging driver. - -**--log-opt**=[] - Logging driver specific options. - -**--mtu**=*0* - Set the containers network mtu. Default is `0`. - -**--max-concurrent-downloads**=*3* - Set the max concurrent downloads for each pull. Default is `3`. - -**--max-concurrent-uploads**=*5* - Set the max concurrent uploads for each push. Default is `5`. - -**-p**, **--pidfile**="" - Path to use for daemon PID file. Default is `/var/run/docker.pid` - -**--raw-logs** - Output daemon logs in full timestamp format without ANSI coloring. If this - flag is not set, the daemon outputs condensed, colorized logs if a terminal - is detected, or full ("raw") output otherwise. - -**--registry-mirror**=*://* - Prepend a registry mirror to be used for image pulls. May be specified - multiple times. - -**-s**, **--storage-driver**="" - Force the Docker runtime to use a specific storage driver. - -**--seccomp-profile**="" - Path to seccomp profile. - -**--selinux-enabled**=*true*|*false* - Enable selinux support. Default is false. - -**--shutdown-timeout**=*15* - Set the shutdown timeout value in seconds. Default is `15`. - -**--storage-opt**=[] - Set storage driver options. See STORAGE DRIVER OPTIONS. - -**--swarm-default-advertise-addr**=*IP|INTERFACE* - Set default address or interface for swarm to advertise as its - externally-reachable address to other cluster members. This can be a - hostname, an IP address, or an interface such as `eth0`. A port cannot be - specified with this option. - -**--tls**=*true*|*false* - Use TLS; implied by --tlsverify. Default is false. - -**--tlscacert**=*~/.docker/ca.pem* - Trust certs signed only by this CA. - -**--tlscert**=*~/.docker/cert.pem* - Path to TLS certificate file. - -**--tlskey**=*~/.docker/key.pem* - Path to TLS key file. - -**--tlsverify**=*true*|*false* - Use TLS and verify the remote (daemon: verify client, client: verify daemon). - Default is false. - -**--userland-proxy**=*true*|*false* - Rely on a userland proxy implementation for inter-container and - outside-to-container loopback communications. Default is true. - -**--userland-proxy-path**="" - Path to the userland proxy binary. - -**--userns-remap**=*default*|*uid:gid*|*user:group*|*user*|*uid* - Enable user namespaces for containers on the daemon. Specifying "default" - will cause a new user and group to be created to handle UID and GID range - remapping for the user namespace mappings used for contained processes. - Specifying a user (or uid) and optionally a group (or gid) will cause the - daemon to lookup the user and group's subordinate ID ranges for use as the - user namespace mappings for contained processes. - -# STORAGE DRIVER OPTIONS - -Docker uses storage backends (known as "graphdrivers" in the Docker -internals) to create writable containers from images. Many of these -backends use operating system level technologies and can be -configured. - -Specify options to the storage backend with **--storage-opt** flags. The -backends that currently take options are *devicemapper*, *zfs* and *btrfs*. -Options for *devicemapper* are prefixed with *dm*, options for *zfs* -start with *zfs* and options for *btrfs* start with *btrfs*. - -Specifically for devicemapper, the default is a "loopback" model which -requires no pre-configuration, but is extremely inefficient. Do not -use it in production. - -To make the best use of Docker with the devicemapper backend, you must -have a recent version of LVM. Use `lvm` to create a thin pool; for -more information see `man lvmthin`. Then, use `--storage-opt -dm.thinpooldev` to tell the Docker engine to use that pool for -allocating images and container snapshots. - -## Devicemapper options - -#### dm.thinpooldev - -Specifies a custom block storage device to use for the thin pool. - -If using a block device for device mapper storage, it is best to use `lvm` -to create and manage the thin-pool volume. This volume is then handed to Docker -to exclusively create snapshot volumes needed for images and containers. - -Managing the thin-pool outside of Engine makes for the most feature-rich -method of having Docker utilize device mapper thin provisioning as the -backing storage for Docker containers. The highlights of the lvm-based -thin-pool management feature include: automatic or interactive thin-pool -resize support, dynamically changing thin-pool features, automatic thinp -metadata checking when lvm activates the thin-pool, etc. - -As a fallback if no thin pool is provided, loopback files are -created. Loopback is very slow, but can be used without any -pre-configuration of storage. It is strongly recommended that you do -not use loopback in production. Ensure your Engine daemon has a -`--storage-opt dm.thinpooldev` argument provided. - -Example use: - - $ dockerd \ - --storage-opt dm.thinpooldev=/dev/mapper/thin-pool - -#### dm.basesize - -Specifies the size to use when creating the base device, which limits -the size of images and containers. The default value is 10G. Note, -thin devices are inherently "sparse", so a 10G device which is mostly -empty doesn't use 10 GB of space on the pool. However, the filesystem -will use more space for base images the larger the device -is. - -The base device size can be increased at daemon restart which will allow -all future images and containers (based on those new images) to be of the -new base device size. - -Example use: `dockerd --storage-opt dm.basesize=50G` - -This will increase the base device size to 50G. The Docker daemon will throw an -error if existing base device size is larger than 50G. A user can use -this option to expand the base device size however shrinking is not permitted. - -This value affects the system-wide "base" empty filesystem that may already -be initialized and inherited by pulled images. Typically, a change to this -value requires additional steps to take effect: - - $ sudo service docker stop - $ sudo rm -rf /var/lib/docker - $ sudo service docker start - -Example use: `dockerd --storage-opt dm.basesize=20G` - -#### dm.fs - -Specifies the filesystem type to use for the base device. The -supported options are `ext4` and `xfs`. The default is `ext4`. - -Example use: `dockerd --storage-opt dm.fs=xfs` - -#### dm.mkfsarg - -Specifies extra mkfs arguments to be used when creating the base device. - -Example use: `dockerd --storage-opt "dm.mkfsarg=-O ^has_journal"` - -#### dm.mountopt - -Specifies extra mount options used when mounting the thin devices. - -Example use: `dockerd --storage-opt dm.mountopt=nodiscard` - -#### dm.use_deferred_removal - -Enables use of deferred device removal if `libdm` and the kernel driver -support the mechanism. - -Deferred device removal means that if device is busy when devices are -being removed/deactivated, then a deferred removal is scheduled on -device. And devices automatically go away when last user of the device -exits. - -For example, when a container exits, its associated thin device is removed. If -that device has leaked into some other mount namespace and can't be removed, -the container exit still succeeds and this option causes the system to schedule -the device for deferred removal. It does not wait in a loop trying to remove a -busy device. - -Example use: `dockerd --storage-opt dm.use_deferred_removal=true` - -#### dm.use_deferred_deletion - -Enables use of deferred device deletion for thin pool devices. By default, -thin pool device deletion is synchronous. Before a container is deleted, the -Docker daemon removes any associated devices. If the storage driver can not -remove a device, the container deletion fails and daemon returns. - -`Error deleting container: Error response from daemon: Cannot destroy container` - -To avoid this failure, enable both deferred device deletion and deferred -device removal on the daemon. - -`dockerd --storage-opt dm.use_deferred_deletion=true --storage-opt dm.use_deferred_removal=true` - -With these two options enabled, if a device is busy when the driver is -deleting a container, the driver marks the device as deleted. Later, when the -device isn't in use, the driver deletes it. - -In general it should be safe to enable this option by default. It will help -when unintentional leaking of mount point happens across multiple mount -namespaces. - -#### dm.loopdatasize - -**Note**: This option configures devicemapper loopback, which should not be -used in production. - -Specifies the size to use when creating the loopback file for the "data" device -which is used for the thin pool. The default size is 100G. The file is sparse, -so it will not initially take up this much space. - -Example use: `dockerd --storage-opt dm.loopdatasize=200G` - -#### dm.loopmetadatasize - -**Note**: This option configures devicemapper loopback, which should not be -used in production. - -Specifies the size to use when creating the loopback file for the "metadata" -device which is used for the thin pool. The default size is 2G. The file is -sparse, so it will not initially take up this much space. - -Example use: `dockerd --storage-opt dm.loopmetadatasize=4G` - -#### dm.datadev - -(Deprecated, use `dm.thinpooldev`) - -Specifies a custom blockdevice to use for data for a Docker-managed thin pool. -It is better to use `dm.thinpooldev` - see the documentation for it above for -discussion of the advantages. - -#### dm.metadatadev - -(Deprecated, use `dm.thinpooldev`) - -Specifies a custom blockdevice to use for metadata for a Docker-managed thin -pool. See `dm.datadev` for why this is deprecated. - -#### dm.blocksize - -Specifies a custom blocksize to use for the thin pool. The default -blocksize is 64K. - -Example use: `dockerd --storage-opt dm.blocksize=512K` - -#### dm.blkdiscard - -Enables or disables the use of `blkdiscard` when removing devicemapper devices. -This is disabled by default due to the additional latency, but as a special -case with loopback devices it will be enabled, in order to re-sparsify the -loopback file on image/container removal. - -Disabling this on loopback can lead to *much* faster container removal times, -but it also prevents the space used in `/var/lib/docker` directory from being -returned to the system for other use when containers are removed. - -Example use: `dockerd --storage-opt dm.blkdiscard=false` - -#### dm.override_udev_sync_check - -By default, the devicemapper backend attempts to synchronize with the `udev` -device manager for the Linux kernel. This option allows disabling that -synchronization, to continue even though the configuration may be buggy. - -To view the `udev` sync support of a Docker daemon that is using the -`devicemapper` driver, run: - - $ docker info - [...] - Udev Sync Supported: true - [...] - -When `udev` sync support is `true`, then `devicemapper` and `udev` can -coordinate the activation and deactivation of devices for containers. - -When `udev` sync support is `false`, a race condition occurs between the -`devicemapper` and `udev` during create and cleanup. The race condition results -in errors and failures. (For information on these failures, see -[docker#4036](https://github.com/docker/docker/issues/4036)) - -To allow the `docker` daemon to start, regardless of whether `udev` sync is -`false`, set `dm.override_udev_sync_check` to true: - - $ dockerd --storage-opt dm.override_udev_sync_check=true - -When this value is `true`, the driver continues and simply warns you the errors -are happening. - -**Note**: The ideal is to pursue a `docker` daemon and environment that does -support synchronizing with `udev`. For further discussion on this topic, see -[docker#4036](https://github.com/docker/docker/issues/4036). -Otherwise, set this flag for migrating existing Docker daemons to a daemon with -a supported environment. - -#### dm.min_free_space - -Specifies the min free space percent in a thin pool require for new device -creation to succeed. This check applies to both free data space as well -as free metadata space. Valid values are from 0% - 99%. Value 0% disables -free space checking logic. If user does not specify a value for this option, -the Engine uses a default value of 10%. - -Whenever a new a thin pool device is created (during `docker pull` or during -container creation), the Engine checks if the minimum free space is available. -If the space is unavailable, then device creation fails and any relevant -`docker` operation fails. - -To recover from this error, you must create more free space in the thin pool to -recover from the error. You can create free space by deleting some images and -containers from tge thin pool. You can also add more storage to the thin pool. - -To add more space to an LVM (logical volume management) thin pool, just add -more storage to the group container thin pool; this should automatically -resolve any errors. If your configuration uses loop devices, then stop the -Engine daemon, grow the size of loop files and restart the daemon to resolve -the issue. - -Example use:: `dockerd --storage-opt dm.min_free_space=10%` - -#### dm.xfs_nospace_max_retries - -Specifies the maximum number of retries XFS should attempt to complete IO when -ENOSPC (no space) error is returned by underlying storage device. - -By default XFS retries infinitely for IO to finish and this can result in -unkillable process. To change this behavior one can set xfs_nospace_max_retries -to say 0 and XFS will not retry IO after getting ENOSPC and will shutdown -filesystem. - -Example use: - - $ sudo dockerd --storage-opt dm.xfs_nospace_max_retries=0 - - -## ZFS options - -#### zfs.fsname - -Set zfs filesystem under which docker will create its own datasets. By default -docker will pick up the zfs filesystem where docker graph (`/var/lib/docker`) -is located. - -Example use: `dockerd -s zfs --storage-opt zfs.fsname=zroot/docker` - -## Btrfs options - -#### btrfs.min_space - -Specifies the mininum size to use when creating the subvolume which is used for -containers. If user uses disk quota for btrfs when creating or running a -container with **--storage-opt size** option, docker should ensure the **size** -cannot be smaller than **btrfs.min_space**. - -Example use: `docker daemon -s btrfs --storage-opt btrfs.min_space=10G` - -# CLUSTER STORE OPTIONS - -The daemon uses libkv to advertise the node within the cluster. Some Key/Value -backends support mutual TLS, and the client TLS settings used by the daemon can -be configured using the **--cluster-store-opt** flag, specifying the paths to -PEM encoded files. - -#### kv.cacertfile - -Specifies the path to a local file with PEM encoded CA certificates to trust - -#### kv.certfile - -Specifies the path to a local file with a PEM encoded certificate. This -certificate is used as the client cert for communication with the Key/Value -store. - -#### kv.keyfile - -Specifies the path to a local file with a PEM encoded private key. This -private key is used as the client key for communication with the Key/Value -store. - -# Access authorization - -Docker's access authorization can be extended by authorization plugins that -your organization can purchase or build themselves. You can install one or more -authorization plugins when you start the Docker `daemon` using the -`--authorization-plugin=PLUGIN_ID` option. - -```bash -dockerd --authorization-plugin=plugin1 --authorization-plugin=plugin2,... -``` - -The `PLUGIN_ID` value is either the plugin's name or a path to its -specification file. The plugin's implementation determines whether you can -specify a name or path. Consult with your Docker administrator to get -information about the plugins available to you. - -Once a plugin is installed, requests made to the `daemon` through the command -line or Docker's Engine API are allowed or denied by the plugin. If you have -multiple plugins installed, at least one must allow the request for it to -complete. - -For information about how to create an authorization plugin, see [authorization -plugin](https://docs.docker.com/engine/extend/authorization/) section in the -Docker extend section of this documentation. - - -# HISTORY -Sept 2015, Originally compiled by Shishir Mahajan -based on docker.com source material and internal work. diff --git a/vendor/github.com/docker/docker/man/generate.go b/vendor/github.com/docker/docker/man/generate.go deleted file mode 100644 index f21614d94..000000000 --- a/vendor/github.com/docker/docker/man/generate.go +++ /dev/null @@ -1,43 +0,0 @@ -package main - -import ( - "fmt" - "os" - - "github.com/docker/docker/cli/command" - "github.com/docker/docker/cli/command/commands" - "github.com/docker/docker/pkg/term" - "github.com/spf13/cobra" - "github.com/spf13/cobra/doc" -) - -func generateManPages(path string) error { - header := &doc.GenManHeader{ - Title: "DOCKER", - Section: "1", - Source: "Docker Community", - } - - stdin, stdout, stderr := term.StdStreams() - dockerCli := command.NewDockerCli(stdin, stdout, stderr) - cmd := &cobra.Command{Use: "docker"} - commands.AddCommands(cmd, dockerCli) - - cmd.DisableAutoGenTag = true - return doc.GenManTreeFromOpts(cmd, doc.GenManTreeOptions{ - Header: header, - Path: path, - CommandSeparator: "-", - }) -} - -func main() { - path := "/tmp" - if len(os.Args) > 1 { - path = os.Args[1] - } - fmt.Printf("Generating man pages into %s\n", path) - if err := generateManPages(path); err != nil { - fmt.Fprintf(os.Stderr, "Failed to generate man pages: %s\n", err.Error()) - } -} diff --git a/vendor/github.com/docker/docker/man/generate.sh b/vendor/github.com/docker/docker/man/generate.sh deleted file mode 100755 index e4126ba4a..000000000 --- a/vendor/github.com/docker/docker/man/generate.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# -# Generate man pages for docker/docker -# - -set -eu - -mkdir -p ./man/man1 - -# Generate man pages from cobra commands -go build -o /tmp/gen-manpages ./man -/tmp/gen-manpages ./man/man1 - -# Generate legacy pages from markdown -./man/md2man-all.sh -q diff --git a/vendor/github.com/docker/docker/man/glide.lock b/vendor/github.com/docker/docker/man/glide.lock deleted file mode 100644 index 5ec765a4c..000000000 --- a/vendor/github.com/docker/docker/man/glide.lock +++ /dev/null @@ -1,52 +0,0 @@ -hash: ead3ea293a6143fe41069ebec814bf197d8c43a92cc7666b1f7e21a419b46feb -updated: 2016-06-20T21:53:35.420817456Z -imports: -- name: github.com/BurntSushi/toml - version: f0aeabca5a127c4078abb8c8d64298b147264b55 -- name: github.com/cpuguy83/go-md2man - version: a65d4d2de4d5f7c74868dfa9b202a3c8be315aaa - subpackages: - - md2man -- name: github.com/fsnotify/fsnotify - version: 30411dbcefb7a1da7e84f75530ad3abe4011b4f8 -- name: github.com/hashicorp/hcl - version: da486364306ed66c218be9b7953e19173447c18b - subpackages: - - hcl/ast - - hcl/parser - - hcl/token - - json/parser - - hcl/scanner - - hcl/strconv - - json/scanner - - json/token -- name: github.com/inconshreveable/mousetrap - version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 -- name: github.com/magiconair/properties - version: c265cfa48dda6474e208715ca93e987829f572f8 -- name: github.com/mitchellh/mapstructure - version: d2dd0262208475919e1a362f675cfc0e7c10e905 -- name: github.com/russross/blackfriday - version: 1d6b8e9301e720b08a8938b8c25c018285885438 -- name: github.com/shurcooL/sanitized_anchor_name - version: 10ef21a441db47d8b13ebcc5fd2310f636973c77 -- name: github.com/spf13/cast - version: 27b586b42e29bec072fe7379259cc719e1289da6 -- name: github.com/spf13/jwalterweatherman - version: 33c24e77fb80341fe7130ee7c594256ff08ccc46 -- name: github.com/spf13/pflag - version: dabebe21bf790f782ea4c7bbd2efc430de182afd -- name: github.com/spf13/viper - version: c1ccc378a054ea8d4e38d8c67f6938d4760b53dd -- name: golang.org/x/sys - version: 62bee037599929a6e9146f29d10dd5208c43507d - subpackages: - - unix -- name: gopkg.in/yaml.v2 - version: a83829b6f1293c91addabc89d0571c246397bbf4 -- name: github.com/spf13/cobra - repo: https://github.com/dnephin/cobra - subpackages: - - doc - version: v1.3 -devImports: [] diff --git a/vendor/github.com/docker/docker/man/glide.yaml b/vendor/github.com/docker/docker/man/glide.yaml deleted file mode 100644 index e99b2670d..000000000 --- a/vendor/github.com/docker/docker/man/glide.yaml +++ /dev/null @@ -1,12 +0,0 @@ -package: github.com/docker/docker/man -import: -- package: github.com/cpuguy83/go-md2man - subpackages: - - md2man -- package: github.com/inconshreveable/mousetrap -- package: github.com/spf13/pflag -- package: github.com/spf13/viper -- package: github.com/spf13/cobra - repo: https://github.com/dnephin/cobra - subpackages: - - doc diff --git a/vendor/github.com/docker/docker/man/md2man-all.sh b/vendor/github.com/docker/docker/man/md2man-all.sh deleted file mode 100755 index 97c65c93b..000000000 --- a/vendor/github.com/docker/docker/man/md2man-all.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -set -e - -# get into this script's directory -cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" - -[ "$1" = '-q' ] || { - set -x - pwd -} - -for FILE in *.md; do - base="$(basename "$FILE")" - name="${base%.md}" - num="${name##*.}" - if [ -z "$num" -o "$name" = "$num" ]; then - # skip files that aren't of the format xxxx.N.md (like README.md) - continue - fi - mkdir -p "./man${num}" - go-md2man -in "$FILE" -out "./man${num}/${name}" -done diff --git a/vendor/github.com/docker/docker/migrate/v1/migratev1.go b/vendor/github.com/docker/docker/migrate/v1/migratev1.go deleted file mode 100644 index bc42dd2ca..000000000 --- a/vendor/github.com/docker/docker/migrate/v1/migratev1.go +++ /dev/null @@ -1,504 +0,0 @@ -package v1 - -import ( - "errors" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strconv" - "sync" - "time" - - "encoding/json" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/distribution/metadata" - "github.com/docker/docker/image" - imagev1 "github.com/docker/docker/image/v1" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/reference" -) - -type graphIDRegistrar interface { - RegisterByGraphID(string, layer.ChainID, layer.DiffID, string, int64) (layer.Layer, error) - Release(layer.Layer) ([]layer.Metadata, error) -} - -type graphIDMounter interface { - CreateRWLayerByGraphID(string, string, layer.ChainID) error -} - -type checksumCalculator interface { - ChecksumForGraphID(id, parent, oldTarDataPath, newTarDataPath string) (diffID layer.DiffID, size int64, err error) -} - -const ( - graphDirName = "graph" - tarDataFileName = "tar-data.json.gz" - migrationFileName = ".migration-v1-images.json" - migrationTagsFileName = ".migration-v1-tags" - migrationDiffIDFileName = ".migration-diffid" - migrationSizeFileName = ".migration-size" - migrationTarDataFileName = ".migration-tardata" - containersDirName = "containers" - configFileNameLegacy = "config.json" - configFileName = "config.v2.json" - repositoriesFilePrefixLegacy = "repositories-" -) - -var ( - errUnsupported = errors.New("migration is not supported") -) - -// Migrate takes an old graph directory and transforms the metadata into the -// new format. -func Migrate(root, driverName string, ls layer.Store, is image.Store, rs reference.Store, ms metadata.Store) error { - graphDir := filepath.Join(root, graphDirName) - if _, err := os.Lstat(graphDir); os.IsNotExist(err) { - return nil - } - - mappings, err := restoreMappings(root) - if err != nil { - return err - } - - if cc, ok := ls.(checksumCalculator); ok { - CalculateLayerChecksums(root, cc, mappings) - } - - if registrar, ok := ls.(graphIDRegistrar); !ok { - return errUnsupported - } else if err := migrateImages(root, registrar, is, ms, mappings); err != nil { - return err - } - - err = saveMappings(root, mappings) - if err != nil { - return err - } - - if mounter, ok := ls.(graphIDMounter); !ok { - return errUnsupported - } else if err := migrateContainers(root, mounter, is, mappings); err != nil { - return err - } - - if err := migrateRefs(root, driverName, rs, mappings); err != nil { - return err - } - - return nil -} - -// CalculateLayerChecksums walks an old graph directory and calculates checksums -// for each layer. These checksums are later used for migration. -func CalculateLayerChecksums(root string, ls checksumCalculator, mappings map[string]image.ID) { - graphDir := filepath.Join(root, graphDirName) - // spawn some extra workers also for maximum performance because the process is bounded by both cpu and io - workers := runtime.NumCPU() * 3 - workQueue := make(chan string, workers) - - wg := sync.WaitGroup{} - - for i := 0; i < workers; i++ { - wg.Add(1) - go func() { - for id := range workQueue { - start := time.Now() - if err := calculateLayerChecksum(graphDir, id, ls); err != nil { - logrus.Errorf("could not calculate checksum for %q, %q", id, err) - } - elapsed := time.Since(start) - logrus.Debugf("layer %s took %.2f seconds", id, elapsed.Seconds()) - } - wg.Done() - }() - } - - dir, err := ioutil.ReadDir(graphDir) - if err != nil { - logrus.Errorf("could not read directory %q", graphDir) - return - } - for _, v := range dir { - v1ID := v.Name() - if err := imagev1.ValidateID(v1ID); err != nil { - continue - } - if _, ok := mappings[v1ID]; ok { // support old migrations without helper files - continue - } - workQueue <- v1ID - } - close(workQueue) - wg.Wait() -} - -func calculateLayerChecksum(graphDir, id string, ls checksumCalculator) error { - diffIDFile := filepath.Join(graphDir, id, migrationDiffIDFileName) - if _, err := os.Lstat(diffIDFile); err == nil { - return nil - } else if !os.IsNotExist(err) { - return err - } - - parent, err := getParent(filepath.Join(graphDir, id)) - if err != nil { - return err - } - - diffID, size, err := ls.ChecksumForGraphID(id, parent, filepath.Join(graphDir, id, tarDataFileName), filepath.Join(graphDir, id, migrationTarDataFileName)) - if err != nil { - return err - } - - if err := ioutil.WriteFile(filepath.Join(graphDir, id, migrationSizeFileName), []byte(strconv.Itoa(int(size))), 0600); err != nil { - return err - } - - if err := ioutils.AtomicWriteFile(filepath.Join(graphDir, id, migrationDiffIDFileName), []byte(diffID), 0600); err != nil { - return err - } - - logrus.Infof("calculated checksum for layer %s: %s", id, diffID) - return nil -} - -func restoreMappings(root string) (map[string]image.ID, error) { - mappings := make(map[string]image.ID) - - mfile := filepath.Join(root, migrationFileName) - f, err := os.Open(mfile) - if err != nil && !os.IsNotExist(err) { - return nil, err - } else if err == nil { - err := json.NewDecoder(f).Decode(&mappings) - if err != nil { - f.Close() - return nil, err - } - f.Close() - } - - return mappings, nil -} - -func saveMappings(root string, mappings map[string]image.ID) error { - mfile := filepath.Join(root, migrationFileName) - f, err := os.OpenFile(mfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - if err != nil { - return err - } - defer f.Close() - if err := json.NewEncoder(f).Encode(mappings); err != nil { - return err - } - return nil -} - -func migrateImages(root string, ls graphIDRegistrar, is image.Store, ms metadata.Store, mappings map[string]image.ID) error { - graphDir := filepath.Join(root, graphDirName) - - dir, err := ioutil.ReadDir(graphDir) - if err != nil { - return err - } - for _, v := range dir { - v1ID := v.Name() - if err := imagev1.ValidateID(v1ID); err != nil { - continue - } - if _, exists := mappings[v1ID]; exists { - continue - } - if err := migrateImage(v1ID, root, ls, is, ms, mappings); err != nil { - continue - } - } - - return nil -} - -func migrateContainers(root string, ls graphIDMounter, is image.Store, imageMappings map[string]image.ID) error { - containersDir := filepath.Join(root, containersDirName) - dir, err := ioutil.ReadDir(containersDir) - if err != nil { - return err - } - for _, v := range dir { - id := v.Name() - - if _, err := os.Stat(filepath.Join(containersDir, id, configFileName)); err == nil { - continue - } - - containerJSON, err := ioutil.ReadFile(filepath.Join(containersDir, id, configFileNameLegacy)) - if err != nil { - logrus.Errorf("migrate container error: %v", err) - continue - } - - var c map[string]*json.RawMessage - if err := json.Unmarshal(containerJSON, &c); err != nil { - logrus.Errorf("migrate container error: %v", err) - continue - } - - imageStrJSON, ok := c["Image"] - if !ok { - return fmt.Errorf("invalid container configuration for %v", id) - } - - var image string - if err := json.Unmarshal([]byte(*imageStrJSON), &image); err != nil { - logrus.Errorf("migrate container error: %v", err) - continue - } - - imageID, ok := imageMappings[image] - if !ok { - logrus.Errorf("image not migrated %v", imageID) // non-fatal error - continue - } - - c["Image"] = rawJSON(imageID) - - containerJSON, err = json.Marshal(c) - if err != nil { - return err - } - - if err := ioutil.WriteFile(filepath.Join(containersDir, id, configFileName), containerJSON, 0600); err != nil { - return err - } - - img, err := is.Get(imageID) - if err != nil { - return err - } - - if err := ls.CreateRWLayerByGraphID(id, id, img.RootFS.ChainID()); err != nil { - logrus.Errorf("migrate container error: %v", err) - continue - } - - logrus.Infof("migrated container %s to point to %s", id, imageID) - - } - return nil -} - -type refAdder interface { - AddTag(ref reference.Named, id digest.Digest, force bool) error - AddDigest(ref reference.Canonical, id digest.Digest, force bool) error -} - -func migrateRefs(root, driverName string, rs refAdder, mappings map[string]image.ID) error { - migrationFile := filepath.Join(root, migrationTagsFileName) - if _, err := os.Lstat(migrationFile); !os.IsNotExist(err) { - return err - } - - type repositories struct { - Repositories map[string]map[string]string - } - - var repos repositories - - f, err := os.Open(filepath.Join(root, repositoriesFilePrefixLegacy+driverName)) - if err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - defer f.Close() - if err := json.NewDecoder(f).Decode(&repos); err != nil { - return err - } - - for name, repo := range repos.Repositories { - for tag, id := range repo { - if strongID, exists := mappings[id]; exists { - ref, err := reference.WithName(name) - if err != nil { - logrus.Errorf("migrate tags: invalid name %q, %q", name, err) - continue - } - if dgst, err := digest.ParseDigest(tag); err == nil { - canonical, err := reference.WithDigest(reference.TrimNamed(ref), dgst) - if err != nil { - logrus.Errorf("migrate tags: invalid digest %q, %q", dgst, err) - continue - } - if err := rs.AddDigest(canonical, strongID.Digest(), false); err != nil { - logrus.Errorf("can't migrate digest %q for %q, err: %q", ref.String(), strongID, err) - } - } else { - tagRef, err := reference.WithTag(ref, tag) - if err != nil { - logrus.Errorf("migrate tags: invalid tag %q, %q", tag, err) - continue - } - if err := rs.AddTag(tagRef, strongID.Digest(), false); err != nil { - logrus.Errorf("can't migrate tag %q for %q, err: %q", ref.String(), strongID, err) - } - } - logrus.Infof("migrated tag %s:%s to point to %s", name, tag, strongID) - } - } - } - - mf, err := os.Create(migrationFile) - if err != nil { - return err - } - mf.Close() - - return nil -} - -func getParent(confDir string) (string, error) { - jsonFile := filepath.Join(confDir, "json") - imageJSON, err := ioutil.ReadFile(jsonFile) - if err != nil { - return "", err - } - var parent struct { - Parent string - ParentID digest.Digest `json:"parent_id"` - } - if err := json.Unmarshal(imageJSON, &parent); err != nil { - return "", err - } - if parent.Parent == "" && parent.ParentID != "" { // v1.9 - parent.Parent = parent.ParentID.Hex() - } - // compatibilityID for parent - parentCompatibilityID, err := ioutil.ReadFile(filepath.Join(confDir, "parent")) - if err == nil && len(parentCompatibilityID) > 0 { - parent.Parent = string(parentCompatibilityID) - } - return parent.Parent, nil -} - -func migrateImage(id, root string, ls graphIDRegistrar, is image.Store, ms metadata.Store, mappings map[string]image.ID) (err error) { - defer func() { - if err != nil { - logrus.Errorf("migration failed for %v, err: %v", id, err) - } - }() - - parent, err := getParent(filepath.Join(root, graphDirName, id)) - if err != nil { - return err - } - - var parentID image.ID - if parent != "" { - var exists bool - if parentID, exists = mappings[parent]; !exists { - if err := migrateImage(parent, root, ls, is, ms, mappings); err != nil { - // todo: fail or allow broken chains? - return err - } - parentID = mappings[parent] - } - } - - rootFS := image.NewRootFS() - var history []image.History - - if parentID != "" { - parentImg, err := is.Get(parentID) - if err != nil { - return err - } - - rootFS = parentImg.RootFS - history = parentImg.History - } - - diffIDData, err := ioutil.ReadFile(filepath.Join(root, graphDirName, id, migrationDiffIDFileName)) - if err != nil { - return err - } - diffID, err := digest.ParseDigest(string(diffIDData)) - if err != nil { - return err - } - - sizeStr, err := ioutil.ReadFile(filepath.Join(root, graphDirName, id, migrationSizeFileName)) - if err != nil { - return err - } - size, err := strconv.ParseInt(string(sizeStr), 10, 64) - if err != nil { - return err - } - - layer, err := ls.RegisterByGraphID(id, rootFS.ChainID(), layer.DiffID(diffID), filepath.Join(root, graphDirName, id, migrationTarDataFileName), size) - if err != nil { - return err - } - logrus.Infof("migrated layer %s to %s", id, layer.DiffID()) - - jsonFile := filepath.Join(root, graphDirName, id, "json") - imageJSON, err := ioutil.ReadFile(jsonFile) - if err != nil { - return err - } - - h, err := imagev1.HistoryFromConfig(imageJSON, false) - if err != nil { - return err - } - history = append(history, h) - - rootFS.Append(layer.DiffID()) - - config, err := imagev1.MakeConfigFromV1Config(imageJSON, rootFS, history) - if err != nil { - return err - } - strongID, err := is.Create(config) - if err != nil { - return err - } - logrus.Infof("migrated image %s to %s", id, strongID) - - if parentID != "" { - if err := is.SetParent(strongID, parentID); err != nil { - return err - } - } - - checksum, err := ioutil.ReadFile(filepath.Join(root, graphDirName, id, "checksum")) - if err == nil { // best effort - dgst, err := digest.ParseDigest(string(checksum)) - if err == nil { - V2MetadataService := metadata.NewV2MetadataService(ms) - V2MetadataService.Add(layer.DiffID(), metadata.V2Metadata{Digest: dgst}) - } - } - _, err = ls.Release(layer) - if err != nil { - return err - } - - mappings[id] = strongID - return -} - -func rawJSON(value interface{}) *json.RawMessage { - jsonval, err := json.Marshal(value) - if err != nil { - return nil - } - return (*json.RawMessage)(&jsonval) -} diff --git a/vendor/github.com/docker/docker/migrate/v1/migratev1_test.go b/vendor/github.com/docker/docker/migrate/v1/migratev1_test.go deleted file mode 100644 index be82fdc75..000000000 --- a/vendor/github.com/docker/docker/migrate/v1/migratev1_test.go +++ /dev/null @@ -1,438 +0,0 @@ -package v1 - -import ( - "crypto/rand" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "runtime" - "testing" - - "github.com/docker/distribution/digest" - "github.com/docker/docker/distribution/metadata" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/reference" -) - -func TestMigrateRefs(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "migrate-tags") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - ioutil.WriteFile(filepath.Join(tmpdir, "repositories-generic"), []byte(`{"Repositories":{"busybox":{"latest":"b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108","sha256:16a2a52884c2a9481ed267c2d46483eac7693b813a63132368ab098a71303f8a":"b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108"},"registry":{"2":"5d165b8e4b203685301c815e95663231691d383fd5e3d3185d1ce3f8dddead3d","latest":"8d5547a9f329b1d3f93198cd661fb5117e5a96b721c5cf9a2c389e7dd4877128"}}}`), 0600) - - ta := &mockTagAdder{} - err = migrateRefs(tmpdir, "generic", ta, map[string]image.ID{ - "5d165b8e4b203685301c815e95663231691d383fd5e3d3185d1ce3f8dddead3d": image.ID("sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"), - "b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108": image.ID("sha256:fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9"), - "abcdef3434c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108": image.ID("sha256:56434342345ae68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"), - }) - if err != nil { - t.Fatal(err) - } - - expected := map[string]string{ - "busybox:latest": "sha256:fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9", - "busybox@sha256:16a2a52884c2a9481ed267c2d46483eac7693b813a63132368ab098a71303f8a": "sha256:fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9", - "registry:2": "sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae", - } - - if !reflect.DeepEqual(expected, ta.refs) { - t.Fatalf("Invalid migrated tags: expected %q, got %q", expected, ta.refs) - } - - // second migration is no-op - ioutil.WriteFile(filepath.Join(tmpdir, "repositories-generic"), []byte(`{"Repositories":{"busybox":{"latest":"b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108"`), 0600) - err = migrateRefs(tmpdir, "generic", ta, map[string]image.ID{ - "b3ca410aa2c115c05969a7b2c8cf8a9fcf62c1340ed6a601c9ee50df337ec108": image.ID("sha256:fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9"), - }) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(expected, ta.refs) { - t.Fatalf("Invalid migrated tags: expected %q, got %q", expected, ta.refs) - } -} - -func TestMigrateContainers(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - if runtime.GOARCH != "amd64" { - t.Skip("Test tailored to amd64 architecture") - } - tmpdir, err := ioutil.TempDir("", "migrate-containers") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - err = addContainer(tmpdir, `{"State":{"Running":false,"Paused":false,"Restarting":false,"OOMKilled":false,"Dead":false,"Pid":0,"ExitCode":0,"Error":"","StartedAt":"2015-11-10T21:42:40.604267436Z","FinishedAt":"2015-11-10T21:42:41.869265487Z"},"ID":"f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c","Created":"2015-11-10T21:42:40.433831551Z","Path":"sh","Args":[],"Config":{"Hostname":"f780ee3f80e6","Domainname":"","User":"","AttachStdin":true,"AttachStdout":true,"AttachStderr":true,"Tty":true,"OpenStdin":true,"StdinOnce":true,"Env":null,"Cmd":["sh"],"Image":"busybox","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"Image":"2c5ac3f849df8627fcf2822727f87c57f38b7129d3604fbc11d861fe856ff093","NetworkSettings":{"Bridge":"","EndpointID":"","Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"HairpinMode":false,"IPAddress":"","IPPrefixLen":0,"IPv6Gateway":"","LinkLocalIPv6Address":"","LinkLocalIPv6PrefixLen":0,"MacAddress":"","NetworkID":"","PortMapping":null,"Ports":null,"SandboxKey":"","SecondaryIPAddresses":null,"SecondaryIPv6Addresses":null},"ResolvConfPath":"/var/lib/docker/containers/f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c/resolv.conf","HostnamePath":"/var/lib/docker/containers/f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c/hostname","HostsPath":"/var/lib/docker/containers/f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c/hosts","LogPath":"/var/lib/docker/containers/f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c/f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c-json.log","Name":"/determined_euclid","Driver":"overlay","ExecDriver":"native-0.2","MountLabel":"","ProcessLabel":"","RestartCount":0,"UpdateDns":false,"HasBeenStartedBefore":false,"MountPoints":{},"Volumes":{},"VolumesRW":{},"AppArmorProfile":""}`) - if err != nil { - t.Fatal(err) - } - - // container with invalid image - err = addContainer(tmpdir, `{"State":{"Running":false,"Paused":false,"Restarting":false,"OOMKilled":false,"Dead":false,"Pid":0,"ExitCode":0,"Error":"","StartedAt":"2015-11-10T21:42:40.604267436Z","FinishedAt":"2015-11-10T21:42:41.869265487Z"},"ID":"e780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c","Created":"2015-11-10T21:42:40.433831551Z","Path":"sh","Args":[],"Config":{"Hostname":"f780ee3f80e6","Domainname":"","User":"","AttachStdin":true,"AttachStdout":true,"AttachStderr":true,"Tty":true,"OpenStdin":true,"StdinOnce":true,"Env":null,"Cmd":["sh"],"Image":"busybox","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"Image":"4c5ac3f849df8627fcf2822727f87c57f38b7129d3604fbc11d861fe856ff093","NetworkSettings":{"Bridge":"","EndpointID":"","Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"HairpinMode":false,"IPAddress":"","IPPrefixLen":0,"IPv6Gateway":"","LinkLocalIPv6Address":"","LinkLocalIPv6PrefixLen":0,"MacAddress":"","NetworkID":"","PortMapping":null,"Ports":null,"SandboxKey":"","SecondaryIPAddresses":null,"SecondaryIPv6Addresses":null},"ResolvConfPath":"/var/lib/docker/containers/f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c/resolv.conf","HostnamePath":"/var/lib/docker/containers/f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c/hostname","HostsPath":"/var/lib/docker/containers/f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c/hosts","LogPath":"/var/lib/docker/containers/f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c/f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c-json.log","Name":"/determined_euclid","Driver":"overlay","ExecDriver":"native-0.2","MountLabel":"","ProcessLabel":"","RestartCount":0,"UpdateDns":false,"HasBeenStartedBefore":false,"MountPoints":{},"Volumes":{},"VolumesRW":{},"AppArmorProfile":""}`) - if err != nil { - t.Fatal(err) - } - - ls := &mockMounter{} - - ifs, err := image.NewFSStoreBackend(filepath.Join(tmpdir, "imagedb")) - if err != nil { - t.Fatal(err) - } - - is, err := image.NewImageStore(ifs, ls) - if err != nil { - t.Fatal(err) - } - - imgID, err := is.Create([]byte(`{"architecture":"amd64","config":{"AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Cmd":["sh"],"Entrypoint":null,"Env":null,"Hostname":"23304fc829f9","Image":"d1592a710ac323612bd786fa8ac20727c58d8a67847e5a65177c594f43919498","Labels":null,"OnBuild":null,"OpenStdin":false,"StdinOnce":false,"Tty":false,"Volumes":null,"WorkingDir":"","Domainname":"","User":""},"container":"349b014153779e30093d94f6df2a43c7a0a164e05aa207389917b540add39b51","container_config":{"AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Cmd":["/bin/sh","-c","#(nop) CMD [\"sh\"]"],"Entrypoint":null,"Env":null,"Hostname":"23304fc829f9","Image":"d1592a710ac323612bd786fa8ac20727c58d8a67847e5a65177c594f43919498","Labels":null,"OnBuild":null,"OpenStdin":false,"StdinOnce":false,"Tty":false,"Volumes":null,"WorkingDir":"","Domainname":"","User":""},"created":"2015-10-31T22:22:55.613815829Z","docker_version":"1.8.2","history":[{"created":"2015-10-31T22:22:54.690851953Z","created_by":"/bin/sh -c #(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /"},{"created":"2015-10-31T22:22:55.613815829Z","created_by":"/bin/sh -c #(nop) CMD [\"sh\"]"}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:c6f988f4874bb0add23a778f753c65efe992244e148a1d2ec2a8b664fb66bbd1","sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"]}}`)) - if err != nil { - t.Fatal(err) - } - - err = migrateContainers(tmpdir, ls, is, map[string]image.ID{ - "2c5ac3f849df8627fcf2822727f87c57f38b7129d3604fbc11d861fe856ff093": imgID, - }) - if err != nil { - t.Fatal(err) - } - - expected := []mountInfo{{ - "f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c", - "f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c", - "sha256:c3191d32a37d7159b2e30830937d2e30268ad6c375a773a8994911a3aba9b93f", - }} - if !reflect.DeepEqual(expected, ls.mounts) { - t.Fatalf("invalid mounts: expected %q, got %q", expected, ls.mounts) - } - - if actual, expected := ls.count, 0; actual != expected { - t.Fatalf("invalid active mounts: expected %d, got %d", expected, actual) - } - - config2, err := ioutil.ReadFile(filepath.Join(tmpdir, "containers", "f780ee3f80e66e9b432a57049597118a66aab8932be88e5628d4c824edbee37c", "config.v2.json")) - if err != nil { - t.Fatal(err) - } - var config struct{ Image string } - err = json.Unmarshal(config2, &config) - if err != nil { - t.Fatal(err) - } - - if actual, expected := config.Image, string(imgID); actual != expected { - t.Fatalf("invalid image pointer in migrated config: expected %q, got %q", expected, actual) - } - -} - -func TestMigrateImages(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - if runtime.GOARCH != "amd64" { - t.Skip("Test tailored to amd64 architecture") - } - tmpdir, err := ioutil.TempDir("", "migrate-images") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - // busybox from 1.9 - id1, err := addImage(tmpdir, `{"architecture":"amd64","config":{"Hostname":"23304fc829f9","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":null,"Image":"","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"23304fc829f9b9349416f6eb1afec162907eba3a328f51d53a17f8986f865d65","container_config":{"Hostname":"23304fc829f9","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["/bin/sh","-c","#(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /"],"Image":"","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"created":"2015-10-31T22:22:54.690851953Z","docker_version":"1.8.2","layer_id":"sha256:55dc925c23d1ed82551fd018c27ac3ee731377b6bad3963a2a4e76e753d70e57","os":"linux"}`, "", "") - if err != nil { - t.Fatal(err) - } - - id2, err := addImage(tmpdir, `{"architecture":"amd64","config":{"Hostname":"23304fc829f9","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["sh"],"Image":"d1592a710ac323612bd786fa8ac20727c58d8a67847e5a65177c594f43919498","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"349b014153779e30093d94f6df2a43c7a0a164e05aa207389917b540add39b51","container_config":{"Hostname":"23304fc829f9","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["/bin/sh","-c","#(nop) CMD [\"sh\"]"],"Image":"d1592a710ac323612bd786fa8ac20727c58d8a67847e5a65177c594f43919498","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"created":"2015-10-31T22:22:55.613815829Z","docker_version":"1.8.2","layer_id":"sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4","os":"linux","parent_id":"sha256:039b63dd2cbaa10d6015ea574392530571ed8d7b174090f032211285a71881d0"}`, id1, "") - if err != nil { - t.Fatal(err) - } - - ls := &mockRegistrar{} - - ifs, err := image.NewFSStoreBackend(filepath.Join(tmpdir, "imagedb")) - if err != nil { - t.Fatal(err) - } - - is, err := image.NewImageStore(ifs, ls) - if err != nil { - t.Fatal(err) - } - - ms, err := metadata.NewFSMetadataStore(filepath.Join(tmpdir, "distribution")) - if err != nil { - t.Fatal(err) - } - mappings := make(map[string]image.ID) - - err = migrateImages(tmpdir, ls, is, ms, mappings) - if err != nil { - t.Fatal(err) - } - - expected := map[string]image.ID{ - id1: image.ID("sha256:ca406eaf9c26898414ff5b7b3a023c33310759d6203be0663dbf1b3a712f432d"), - id2: image.ID("sha256:a488bec94bb96b26a968f913d25ef7d8d204d727ca328b52b4b059c7d03260b6"), - } - - if !reflect.DeepEqual(mappings, expected) { - t.Fatalf("invalid image mappings: expected %q, got %q", expected, mappings) - } - - if actual, expected := ls.count, 2; actual != expected { - t.Fatalf("invalid register count: expected %q, got %q", expected, actual) - } - ls.count = 0 - - // next images are busybox from 1.8.2 - _, err = addImage(tmpdir, `{"id":"17583c7dd0dae6244203b8029733bdb7d17fccbb2b5d93e2b24cf48b8bfd06e2","parent":"d1592a710ac323612bd786fa8ac20727c58d8a67847e5a65177c594f43919498","created":"2015-10-31T22:22:55.613815829Z","container":"349b014153779e30093d94f6df2a43c7a0a164e05aa207389917b540add39b51","container_config":{"Hostname":"23304fc829f9","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":null,"PublishService":"","Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["/bin/sh","-c","#(nop) CMD [\"sh\"]"],"Image":"d1592a710ac323612bd786fa8ac20727c58d8a67847e5a65177c594f43919498","Volumes":null,"VolumeDriver":"","WorkingDir":"","Entrypoint":null,"NetworkDisabled":false,"MacAddress":"","OnBuild":null,"Labels":null},"docker_version":"1.8.2","config":{"Hostname":"23304fc829f9","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":null,"PublishService":"","Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["sh"],"Image":"d1592a710ac323612bd786fa8ac20727c58d8a67847e5a65177c594f43919498","Volumes":null,"VolumeDriver":"","WorkingDir":"","Entrypoint":null,"NetworkDisabled":false,"MacAddress":"","OnBuild":null,"Labels":null},"architecture":"amd64","os":"linux","Size":0}`, "", "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4") - if err != nil { - t.Fatal(err) - } - - _, err = addImage(tmpdir, `{"id":"d1592a710ac323612bd786fa8ac20727c58d8a67847e5a65177c594f43919498","created":"2015-10-31T22:22:54.690851953Z","container":"23304fc829f9b9349416f6eb1afec162907eba3a328f51d53a17f8986f865d65","container_config":{"Hostname":"23304fc829f9","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":null,"PublishService":"","Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["/bin/sh","-c","#(nop) ADD file:a3bc1e842b69636f9df5256c49c5374fb4eef1e281fe3f282c65fb853ee171c5 in /"],"Image":"","Volumes":null,"VolumeDriver":"","WorkingDir":"","Entrypoint":null,"NetworkDisabled":false,"MacAddress":"","OnBuild":null,"Labels":null},"docker_version":"1.8.2","config":{"Hostname":"23304fc829f9","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":null,"PublishService":"","Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":null,"Image":"","Volumes":null,"VolumeDriver":"","WorkingDir":"","Entrypoint":null,"NetworkDisabled":false,"MacAddress":"","OnBuild":null,"Labels":null},"architecture":"amd64","os":"linux","Size":1108935}`, "", "sha256:55dc925c23d1ed82551fd018c27ac3ee731377b6bad3963a2a4e76e753d70e57") - if err != nil { - t.Fatal(err) - } - - err = migrateImages(tmpdir, ls, is, ms, mappings) - if err != nil { - t.Fatal(err) - } - - expected["d1592a710ac323612bd786fa8ac20727c58d8a67847e5a65177c594f43919498"] = image.ID("sha256:c091bb33854e57e6902b74c08719856d30b5593c7db6143b2b48376b8a588395") - expected["17583c7dd0dae6244203b8029733bdb7d17fccbb2b5d93e2b24cf48b8bfd06e2"] = image.ID("sha256:d963020e755ff2715b936065949472c1f8a6300144b922992a1a421999e71f07") - - if actual, expected := ls.count, 2; actual != expected { - t.Fatalf("invalid register count: expected %q, got %q", expected, actual) - } - - v2MetadataService := metadata.NewV2MetadataService(ms) - receivedMetadata, err := v2MetadataService.GetMetadata(layer.EmptyLayer.DiffID()) - if err != nil { - t.Fatal(err) - } - - expectedMetadata := []metadata.V2Metadata{ - {Digest: digest.Digest("sha256:55dc925c23d1ed82551fd018c27ac3ee731377b6bad3963a2a4e76e753d70e57")}, - {Digest: digest.Digest("sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4")}, - } - - if !reflect.DeepEqual(expectedMetadata, receivedMetadata) { - t.Fatalf("invalid metadata: expected %q, got %q", expectedMetadata, receivedMetadata) - } - -} - -func TestMigrateUnsupported(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "migrate-empty") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - err = os.MkdirAll(filepath.Join(tmpdir, "graph"), 0700) - if err != nil { - t.Fatal(err) - } - - err = Migrate(tmpdir, "generic", nil, nil, nil, nil) - if err != errUnsupported { - t.Fatalf("expected unsupported error, got %q", err) - } -} - -func TestMigrateEmptyDir(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "migrate-empty") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - err = Migrate(tmpdir, "generic", nil, nil, nil, nil) - if err != nil { - t.Fatal(err) - } -} - -func addImage(dest, jsonConfig, parent, checksum string) (string, error) { - var config struct{ ID string } - if err := json.Unmarshal([]byte(jsonConfig), &config); err != nil { - return "", err - } - if config.ID == "" { - b := make([]byte, 32) - rand.Read(b) - config.ID = hex.EncodeToString(b) - } - contDir := filepath.Join(dest, "graph", config.ID) - if err := os.MkdirAll(contDir, 0700); err != nil { - return "", err - } - if err := ioutil.WriteFile(filepath.Join(contDir, "json"), []byte(jsonConfig), 0600); err != nil { - return "", err - } - if checksum != "" { - if err := ioutil.WriteFile(filepath.Join(contDir, "checksum"), []byte(checksum), 0600); err != nil { - return "", err - } - } - if err := ioutil.WriteFile(filepath.Join(contDir, ".migration-diffid"), []byte(layer.EmptyLayer.DiffID()), 0600); err != nil { - return "", err - } - if err := ioutil.WriteFile(filepath.Join(contDir, ".migration-size"), []byte("0"), 0600); err != nil { - return "", err - } - if parent != "" { - if err := ioutil.WriteFile(filepath.Join(contDir, "parent"), []byte(parent), 0600); err != nil { - return "", err - } - } - if checksum != "" { - if err := ioutil.WriteFile(filepath.Join(contDir, "checksum"), []byte(checksum), 0600); err != nil { - return "", err - } - } - return config.ID, nil -} - -func addContainer(dest, jsonConfig string) error { - var config struct{ ID string } - if err := json.Unmarshal([]byte(jsonConfig), &config); err != nil { - return err - } - contDir := filepath.Join(dest, "containers", config.ID) - if err := os.MkdirAll(contDir, 0700); err != nil { - return err - } - if err := ioutil.WriteFile(filepath.Join(contDir, "config.json"), []byte(jsonConfig), 0600); err != nil { - return err - } - return nil -} - -type mockTagAdder struct { - refs map[string]string -} - -func (t *mockTagAdder) AddTag(ref reference.Named, id digest.Digest, force bool) error { - if t.refs == nil { - t.refs = make(map[string]string) - } - t.refs[ref.String()] = id.String() - return nil -} -func (t *mockTagAdder) AddDigest(ref reference.Canonical, id digest.Digest, force bool) error { - return t.AddTag(ref, id, force) -} - -type mockRegistrar struct { - layers map[layer.ChainID]*mockLayer - count int -} - -func (r *mockRegistrar) RegisterByGraphID(graphID string, parent layer.ChainID, diffID layer.DiffID, tarDataFile string, size int64) (layer.Layer, error) { - r.count++ - l := &mockLayer{} - if parent != "" { - p, exists := r.layers[parent] - if !exists { - return nil, fmt.Errorf("invalid parent %q", parent) - } - l.parent = p - l.diffIDs = append(l.diffIDs, p.diffIDs...) - } - l.diffIDs = append(l.diffIDs, diffID) - if r.layers == nil { - r.layers = make(map[layer.ChainID]*mockLayer) - } - r.layers[l.ChainID()] = l - return l, nil -} -func (r *mockRegistrar) Release(l layer.Layer) ([]layer.Metadata, error) { - return nil, nil -} -func (r *mockRegistrar) Get(layer.ChainID) (layer.Layer, error) { - return nil, nil -} - -type mountInfo struct { - name, graphID, parent string -} -type mockMounter struct { - mounts []mountInfo - count int -} - -func (r *mockMounter) CreateRWLayerByGraphID(name string, graphID string, parent layer.ChainID) error { - r.mounts = append(r.mounts, mountInfo{name, graphID, string(parent)}) - return nil -} -func (r *mockMounter) Unmount(string) error { - r.count-- - return nil -} -func (r *mockMounter) Get(layer.ChainID) (layer.Layer, error) { - return nil, nil -} - -func (r *mockMounter) Release(layer.Layer) ([]layer.Metadata, error) { - return nil, nil -} - -type mockLayer struct { - diffIDs []layer.DiffID - parent *mockLayer -} - -func (l *mockLayer) TarStream() (io.ReadCloser, error) { - return nil, nil -} -func (l *mockLayer) TarStreamFrom(layer.ChainID) (io.ReadCloser, error) { - return nil, nil -} - -func (l *mockLayer) ChainID() layer.ChainID { - return layer.CreateChainID(l.diffIDs) -} - -func (l *mockLayer) DiffID() layer.DiffID { - return l.diffIDs[len(l.diffIDs)-1] -} - -func (l *mockLayer) Parent() layer.Layer { - if l.parent == nil { - return nil - } - return l.parent -} - -func (l *mockLayer) Size() (int64, error) { - return 0, nil -} - -func (l *mockLayer) DiffSize() (int64, error) { - return 0, nil -} - -func (l *mockLayer) Metadata() (map[string]string, error) { - return nil, nil -} diff --git a/vendor/github.com/docker/docker/oci/defaults_linux.go b/vendor/github.com/docker/docker/oci/defaults_linux.go deleted file mode 100644 index 8b3ce7281..000000000 --- a/vendor/github.com/docker/docker/oci/defaults_linux.go +++ /dev/null @@ -1,168 +0,0 @@ -package oci - -import ( - "os" - "runtime" - - "github.com/opencontainers/runtime-spec/specs-go" -) - -func sPtr(s string) *string { return &s } -func iPtr(i int64) *int64 { return &i } -func u32Ptr(i int64) *uint32 { u := uint32(i); return &u } -func fmPtr(i int64) *os.FileMode { fm := os.FileMode(i); return &fm } - -// DefaultSpec returns default oci spec used by docker. -func DefaultSpec() specs.Spec { - s := specs.Spec{ - Version: specs.Version, - Platform: specs.Platform{ - OS: runtime.GOOS, - Arch: runtime.GOARCH, - }, - } - s.Mounts = []specs.Mount{ - { - Destination: "/proc", - Type: "proc", - Source: "proc", - Options: []string{"nosuid", "noexec", "nodev"}, - }, - { - Destination: "/dev", - Type: "tmpfs", - Source: "tmpfs", - Options: []string{"nosuid", "strictatime", "mode=755"}, - }, - { - Destination: "/dev/pts", - Type: "devpts", - Source: "devpts", - Options: []string{"nosuid", "noexec", "newinstance", "ptmxmode=0666", "mode=0620", "gid=5"}, - }, - { - Destination: "/sys", - Type: "sysfs", - Source: "sysfs", - Options: []string{"nosuid", "noexec", "nodev", "ro"}, - }, - { - Destination: "/sys/fs/cgroup", - Type: "cgroup", - Source: "cgroup", - Options: []string{"ro", "nosuid", "noexec", "nodev"}, - }, - { - Destination: "/dev/mqueue", - Type: "mqueue", - Source: "mqueue", - Options: []string{"nosuid", "noexec", "nodev"}, - }, - } - s.Process.Capabilities = []string{ - "CAP_CHOWN", - "CAP_DAC_OVERRIDE", - "CAP_FSETID", - "CAP_FOWNER", - "CAP_MKNOD", - "CAP_NET_RAW", - "CAP_SETGID", - "CAP_SETUID", - "CAP_SETFCAP", - "CAP_SETPCAP", - "CAP_NET_BIND_SERVICE", - "CAP_SYS_CHROOT", - "CAP_KILL", - "CAP_AUDIT_WRITE", - } - - s.Linux = &specs.Linux{ - MaskedPaths: []string{ - "/proc/kcore", - "/proc/latency_stats", - "/proc/timer_list", - "/proc/timer_stats", - "/proc/sched_debug", - "/sys/firmware", - }, - ReadonlyPaths: []string{ - "/proc/asound", - "/proc/bus", - "/proc/fs", - "/proc/irq", - "/proc/sys", - "/proc/sysrq-trigger", - }, - Namespaces: []specs.Namespace{ - {Type: "mount"}, - {Type: "network"}, - {Type: "uts"}, - {Type: "pid"}, - {Type: "ipc"}, - }, - // Devices implicitly contains the following devices: - // null, zero, full, random, urandom, tty, console, and ptmx. - // ptmx is a bind-mount or symlink of the container's ptmx. - // See also: https://github.com/opencontainers/runtime-spec/blob/master/config-linux.md#default-devices - Devices: []specs.Device{}, - Resources: &specs.Resources{ - Devices: []specs.DeviceCgroup{ - { - Allow: false, - Access: sPtr("rwm"), - }, - { - Allow: true, - Type: sPtr("c"), - Major: iPtr(1), - Minor: iPtr(5), - Access: sPtr("rwm"), - }, - { - Allow: true, - Type: sPtr("c"), - Major: iPtr(1), - Minor: iPtr(3), - Access: sPtr("rwm"), - }, - { - Allow: true, - Type: sPtr("c"), - Major: iPtr(1), - Minor: iPtr(9), - Access: sPtr("rwm"), - }, - { - Allow: true, - Type: sPtr("c"), - Major: iPtr(1), - Minor: iPtr(8), - Access: sPtr("rwm"), - }, - { - Allow: true, - Type: sPtr("c"), - Major: iPtr(5), - Minor: iPtr(0), - Access: sPtr("rwm"), - }, - { - Allow: true, - Type: sPtr("c"), - Major: iPtr(5), - Minor: iPtr(1), - Access: sPtr("rwm"), - }, - { - Allow: false, - Type: sPtr("c"), - Major: iPtr(10), - Minor: iPtr(229), - Access: sPtr("rwm"), - }, - }, - }, - } - - return s -} diff --git a/vendor/github.com/docker/docker/oci/defaults_solaris.go b/vendor/github.com/docker/docker/oci/defaults_solaris.go deleted file mode 100644 index 85c8b68e1..000000000 --- a/vendor/github.com/docker/docker/oci/defaults_solaris.go +++ /dev/null @@ -1,20 +0,0 @@ -package oci - -import ( - "runtime" - - "github.com/opencontainers/runtime-spec/specs-go" -) - -// DefaultSpec returns default oci spec used by docker. -func DefaultSpec() specs.Spec { - s := specs.Spec{ - Version: "0.6.0", - Platform: specs.Platform{ - OS: "SunOS", - Arch: runtime.GOARCH, - }, - } - s.Solaris = &specs.Solaris{} - return s -} diff --git a/vendor/github.com/docker/docker/oci/defaults_windows.go b/vendor/github.com/docker/docker/oci/defaults_windows.go deleted file mode 100644 index ab51904ec..000000000 --- a/vendor/github.com/docker/docker/oci/defaults_windows.go +++ /dev/null @@ -1,19 +0,0 @@ -package oci - -import ( - "runtime" - - "github.com/opencontainers/runtime-spec/specs-go" -) - -// DefaultSpec returns default spec used by docker. -func DefaultSpec() specs.Spec { - return specs.Spec{ - Version: specs.Version, - Platform: specs.Platform{ - OS: runtime.GOOS, - Arch: runtime.GOARCH, - }, - Windows: &specs.Windows{}, - } -} diff --git a/vendor/github.com/docker/docker/oci/devices_linux.go b/vendor/github.com/docker/docker/oci/devices_linux.go deleted file mode 100644 index 2840d2586..000000000 --- a/vendor/github.com/docker/docker/oci/devices_linux.go +++ /dev/null @@ -1,86 +0,0 @@ -package oci - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/opencontainers/runc/libcontainer/configs" - "github.com/opencontainers/runc/libcontainer/devices" - specs "github.com/opencontainers/runtime-spec/specs-go" -) - -// Device transforms a libcontainer configs.Device to a specs.Device object. -func Device(d *configs.Device) specs.Device { - return specs.Device{ - Type: string(d.Type), - Path: d.Path, - Major: d.Major, - Minor: d.Minor, - FileMode: fmPtr(int64(d.FileMode)), - UID: u32Ptr(int64(d.Uid)), - GID: u32Ptr(int64(d.Gid)), - } -} - -func deviceCgroup(d *configs.Device) specs.DeviceCgroup { - t := string(d.Type) - return specs.DeviceCgroup{ - Allow: true, - Type: &t, - Major: &d.Major, - Minor: &d.Minor, - Access: &d.Permissions, - } -} - -// DevicesFromPath computes a list of devices and device permissions from paths (pathOnHost and pathInContainer) and cgroup permissions. -func DevicesFromPath(pathOnHost, pathInContainer, cgroupPermissions string) (devs []specs.Device, devPermissions []specs.DeviceCgroup, err error) { - resolvedPathOnHost := pathOnHost - - // check if it is a symbolic link - if src, e := os.Lstat(pathOnHost); e == nil && src.Mode()&os.ModeSymlink == os.ModeSymlink { - if linkedPathOnHost, e := filepath.EvalSymlinks(pathOnHost); e == nil { - resolvedPathOnHost = linkedPathOnHost - } - } - - device, err := devices.DeviceFromPath(resolvedPathOnHost, cgroupPermissions) - // if there was no error, return the device - if err == nil { - device.Path = pathInContainer - return append(devs, Device(device)), append(devPermissions, deviceCgroup(device)), nil - } - - // if the device is not a device node - // try to see if it's a directory holding many devices - if err == devices.ErrNotADevice { - - // check if it is a directory - if src, e := os.Stat(resolvedPathOnHost); e == nil && src.IsDir() { - - // mount the internal devices recursively - filepath.Walk(resolvedPathOnHost, func(dpath string, f os.FileInfo, e error) error { - childDevice, e := devices.DeviceFromPath(dpath, cgroupPermissions) - if e != nil { - // ignore the device - return nil - } - - // add the device to userSpecified devices - childDevice.Path = strings.Replace(dpath, resolvedPathOnHost, pathInContainer, 1) - devs = append(devs, Device(childDevice)) - devPermissions = append(devPermissions, deviceCgroup(childDevice)) - - return nil - }) - } - } - - if len(devs) > 0 { - return devs, devPermissions, nil - } - - return devs, devPermissions, fmt.Errorf("error gathering device information while adding custom device %q: %s", pathOnHost, err) -} diff --git a/vendor/github.com/docker/docker/oci/devices_unsupported.go b/vendor/github.com/docker/docker/oci/devices_unsupported.go deleted file mode 100644 index 6252cab53..000000000 --- a/vendor/github.com/docker/docker/oci/devices_unsupported.go +++ /dev/null @@ -1,20 +0,0 @@ -// +build !linux - -package oci - -import ( - "errors" - - "github.com/opencontainers/runc/libcontainer/configs" - specs "github.com/opencontainers/runtime-spec/specs-go" -) - -// Device transforms a libcontainer configs.Device to a specs.Device object. -// Not implemented -func Device(d *configs.Device) specs.Device { return specs.Device{} } - -// DevicesFromPath computes a list of devices and device permissions from paths (pathOnHost and pathInContainer) and cgroup permissions. -// Not implemented -func DevicesFromPath(pathOnHost, pathInContainer, cgroupPermissions string) (devs []specs.Device, devPermissions []specs.DeviceCgroup, err error) { - return nil, nil, errors.New("oci/devices: unsupported platform") -} diff --git a/vendor/github.com/docker/docker/oci/namespaces.go b/vendor/github.com/docker/docker/oci/namespaces.go deleted file mode 100644 index 490248249..000000000 --- a/vendor/github.com/docker/docker/oci/namespaces.go +++ /dev/null @@ -1,16 +0,0 @@ -package oci - -import specs "github.com/opencontainers/runtime-spec/specs-go" - -// RemoveNamespace removes the `nsType` namespace from OCI spec `s` -func RemoveNamespace(s *specs.Spec, nsType specs.NamespaceType) { - idx := -1 - for i, n := range s.Linux.Namespaces { - if n.Type == nsType { - idx = i - } - } - if idx >= 0 { - s.Linux.Namespaces = append(s.Linux.Namespaces[:idx], s.Linux.Namespaces[idx+1:]...) - } -} diff --git a/vendor/github.com/docker/docker/opts/hosts.go b/vendor/github.com/docker/docker/opts/hosts.go deleted file mode 100644 index 266df1e53..000000000 --- a/vendor/github.com/docker/docker/opts/hosts.go +++ /dev/null @@ -1,151 +0,0 @@ -package opts - -import ( - "fmt" - "net" - "net/url" - "strconv" - "strings" -) - -var ( - // DefaultHTTPPort Default HTTP Port used if only the protocol is provided to -H flag e.g. docker daemon -H tcp:// - // These are the IANA registered port numbers for use with Docker - // see http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?search=docker - DefaultHTTPPort = 2375 // Default HTTP Port - // DefaultTLSHTTPPort Default HTTP Port used when TLS enabled - DefaultTLSHTTPPort = 2376 // Default TLS encrypted HTTP Port - // DefaultUnixSocket Path for the unix socket. - // Docker daemon by default always listens on the default unix socket - DefaultUnixSocket = "/var/run/docker.sock" - // DefaultTCPHost constant defines the default host string used by docker on Windows - DefaultTCPHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultHTTPPort) - // DefaultTLSHost constant defines the default host string used by docker for TLS sockets - DefaultTLSHost = fmt.Sprintf("tcp://%s:%d", DefaultHTTPHost, DefaultTLSHTTPPort) - // DefaultNamedPipe defines the default named pipe used by docker on Windows - DefaultNamedPipe = `//./pipe/docker_engine` -) - -// ValidateHost validates that the specified string is a valid host and returns it. -func ValidateHost(val string) (string, error) { - host := strings.TrimSpace(val) - // The empty string means default and is not handled by parseDockerDaemonHost - if host != "" { - _, err := parseDockerDaemonHost(host) - if err != nil { - return val, err - } - } - // Note: unlike most flag validators, we don't return the mutated value here - // we need to know what the user entered later (using ParseHost) to adjust for tls - return val, nil -} - -// ParseHost and set defaults for a Daemon host string -func ParseHost(defaultToTLS bool, val string) (string, error) { - host := strings.TrimSpace(val) - if host == "" { - if defaultToTLS { - host = DefaultTLSHost - } else { - host = DefaultHost - } - } else { - var err error - host, err = parseDockerDaemonHost(host) - if err != nil { - return val, err - } - } - return host, nil -} - -// parseDockerDaemonHost parses the specified address and returns an address that will be used as the host. -// Depending of the address specified, this may return one of the global Default* strings defined in hosts.go. -func parseDockerDaemonHost(addr string) (string, error) { - addrParts := strings.SplitN(addr, "://", 2) - if len(addrParts) == 1 && addrParts[0] != "" { - addrParts = []string{"tcp", addrParts[0]} - } - - switch addrParts[0] { - case "tcp": - return ParseTCPAddr(addrParts[1], DefaultTCPHost) - case "unix": - return parseSimpleProtoAddr("unix", addrParts[1], DefaultUnixSocket) - case "npipe": - return parseSimpleProtoAddr("npipe", addrParts[1], DefaultNamedPipe) - case "fd": - return addr, nil - default: - return "", fmt.Errorf("Invalid bind address format: %s", addr) - } -} - -// parseSimpleProtoAddr parses and validates that the specified address is a valid -// socket address for simple protocols like unix and npipe. It returns a formatted -// socket address, either using the address parsed from addr, or the contents of -// defaultAddr if addr is a blank string. -func parseSimpleProtoAddr(proto, addr, defaultAddr string) (string, error) { - addr = strings.TrimPrefix(addr, proto+"://") - if strings.Contains(addr, "://") { - return "", fmt.Errorf("Invalid proto, expected %s: %s", proto, addr) - } - if addr == "" { - addr = defaultAddr - } - return fmt.Sprintf("%s://%s", proto, addr), nil -} - -// ParseTCPAddr parses and validates that the specified address is a valid TCP -// address. It returns a formatted TCP address, either using the address parsed -// from tryAddr, or the contents of defaultAddr if tryAddr is a blank string. -// tryAddr is expected to have already been Trim()'d -// defaultAddr must be in the full `tcp://host:port` form -func ParseTCPAddr(tryAddr string, defaultAddr string) (string, error) { - if tryAddr == "" || tryAddr == "tcp://" { - return defaultAddr, nil - } - addr := strings.TrimPrefix(tryAddr, "tcp://") - if strings.Contains(addr, "://") || addr == "" { - return "", fmt.Errorf("Invalid proto, expected tcp: %s", tryAddr) - } - - defaultAddr = strings.TrimPrefix(defaultAddr, "tcp://") - defaultHost, defaultPort, err := net.SplitHostPort(defaultAddr) - if err != nil { - return "", err - } - // url.Parse fails for trailing colon on IPv6 brackets on Go 1.5, but - // not 1.4. See https://github.com/golang/go/issues/12200 and - // https://github.com/golang/go/issues/6530. - if strings.HasSuffix(addr, "]:") { - addr += defaultPort - } - - u, err := url.Parse("tcp://" + addr) - if err != nil { - return "", err - } - host, port, err := net.SplitHostPort(u.Host) - if err != nil { - // try port addition once - host, port, err = net.SplitHostPort(net.JoinHostPort(u.Host, defaultPort)) - } - if err != nil { - return "", fmt.Errorf("Invalid bind address format: %s", tryAddr) - } - - if host == "" { - host = defaultHost - } - if port == "" { - port = defaultPort - } - p, err := strconv.Atoi(port) - if err != nil && p == 0 { - return "", fmt.Errorf("Invalid bind address format: %s", tryAddr) - } - - return fmt.Sprintf("tcp://%s%s", net.JoinHostPort(host, port), u.Path), nil -} diff --git a/vendor/github.com/docker/docker/opts/hosts_test.go b/vendor/github.com/docker/docker/opts/hosts_test.go deleted file mode 100644 index a5bec30d4..000000000 --- a/vendor/github.com/docker/docker/opts/hosts_test.go +++ /dev/null @@ -1,148 +0,0 @@ -package opts - -import ( - "fmt" - "testing" -) - -func TestParseHost(t *testing.T) { - invalid := []string{ - "something with spaces", - "://", - "unknown://", - "tcp://:port", - "tcp://invalid:port", - } - - valid := map[string]string{ - "": DefaultHost, - " ": DefaultHost, - " ": DefaultHost, - "fd://": "fd://", - "fd://something": "fd://something", - "tcp://host:": fmt.Sprintf("tcp://host:%d", DefaultHTTPPort), - "tcp://": DefaultTCPHost, - "tcp://:2375": fmt.Sprintf("tcp://%s:2375", DefaultHTTPHost), - "tcp://:2376": fmt.Sprintf("tcp://%s:2376", DefaultHTTPHost), - "tcp://0.0.0.0:8080": "tcp://0.0.0.0:8080", - "tcp://192.168.0.0:12000": "tcp://192.168.0.0:12000", - "tcp://192.168:8080": "tcp://192.168:8080", - "tcp://0.0.0.0:1234567890": "tcp://0.0.0.0:1234567890", // yeah it's valid :P - " tcp://:7777/path ": fmt.Sprintf("tcp://%s:7777/path", DefaultHTTPHost), - "tcp://docker.com:2375": "tcp://docker.com:2375", - "unix://": "unix://" + DefaultUnixSocket, - "unix://path/to/socket": "unix://path/to/socket", - "npipe://": "npipe://" + DefaultNamedPipe, - "npipe:////./pipe/foo": "npipe:////./pipe/foo", - } - - for _, value := range invalid { - if _, err := ParseHost(false, value); err == nil { - t.Errorf("Expected an error for %v, got [nil]", value) - } - } - - for value, expected := range valid { - if actual, err := ParseHost(false, value); err != nil || actual != expected { - t.Errorf("Expected for %v [%v], got [%v, %v]", value, expected, actual, err) - } - } -} - -func TestParseDockerDaemonHost(t *testing.T) { - invalids := map[string]string{ - - "tcp:a.b.c.d": "Invalid bind address format: tcp:a.b.c.d", - "tcp:a.b.c.d/path": "Invalid bind address format: tcp:a.b.c.d/path", - "udp://127.0.0.1": "Invalid bind address format: udp://127.0.0.1", - "udp://127.0.0.1:2375": "Invalid bind address format: udp://127.0.0.1:2375", - "tcp://unix:///run/docker.sock": "Invalid proto, expected tcp: unix:///run/docker.sock", - " tcp://:7777/path ": "Invalid bind address format: tcp://:7777/path ", - "": "Invalid bind address format: ", - } - valids := map[string]string{ - "0.0.0.1:": "tcp://0.0.0.1:2375", - "0.0.0.1:5555": "tcp://0.0.0.1:5555", - "0.0.0.1:5555/path": "tcp://0.0.0.1:5555/path", - "[::1]:": "tcp://[::1]:2375", - "[::1]:5555/path": "tcp://[::1]:5555/path", - "[0:0:0:0:0:0:0:1]:": "tcp://[0:0:0:0:0:0:0:1]:2375", - "[0:0:0:0:0:0:0:1]:5555/path": "tcp://[0:0:0:0:0:0:0:1]:5555/path", - ":6666": fmt.Sprintf("tcp://%s:6666", DefaultHTTPHost), - ":6666/path": fmt.Sprintf("tcp://%s:6666/path", DefaultHTTPHost), - "tcp://": DefaultTCPHost, - "tcp://:7777": fmt.Sprintf("tcp://%s:7777", DefaultHTTPHost), - "tcp://:7777/path": fmt.Sprintf("tcp://%s:7777/path", DefaultHTTPHost), - "unix:///run/docker.sock": "unix:///run/docker.sock", - "unix://": "unix://" + DefaultUnixSocket, - "fd://": "fd://", - "fd://something": "fd://something", - "localhost:": "tcp://localhost:2375", - "localhost:5555": "tcp://localhost:5555", - "localhost:5555/path": "tcp://localhost:5555/path", - } - for invalidAddr, expectedError := range invalids { - if addr, err := parseDockerDaemonHost(invalidAddr); err == nil || err.Error() != expectedError { - t.Errorf("tcp %v address expected error %q return, got %q and addr %v", invalidAddr, expectedError, err, addr) - } - } - for validAddr, expectedAddr := range valids { - if addr, err := parseDockerDaemonHost(validAddr); err != nil || addr != expectedAddr { - t.Errorf("%v -> expected %v, got (%v) addr (%v)", validAddr, expectedAddr, err, addr) - } - } -} - -func TestParseTCP(t *testing.T) { - var ( - defaultHTTPHost = "tcp://127.0.0.1:2376" - ) - invalids := map[string]string{ - "tcp:a.b.c.d": "Invalid bind address format: tcp:a.b.c.d", - "tcp:a.b.c.d/path": "Invalid bind address format: tcp:a.b.c.d/path", - "udp://127.0.0.1": "Invalid proto, expected tcp: udp://127.0.0.1", - "udp://127.0.0.1:2375": "Invalid proto, expected tcp: udp://127.0.0.1:2375", - } - valids := map[string]string{ - "": defaultHTTPHost, - "tcp://": defaultHTTPHost, - "0.0.0.1:": "tcp://0.0.0.1:2376", - "0.0.0.1:5555": "tcp://0.0.0.1:5555", - "0.0.0.1:5555/path": "tcp://0.0.0.1:5555/path", - ":6666": "tcp://127.0.0.1:6666", - ":6666/path": "tcp://127.0.0.1:6666/path", - "tcp://:7777": "tcp://127.0.0.1:7777", - "tcp://:7777/path": "tcp://127.0.0.1:7777/path", - "[::1]:": "tcp://[::1]:2376", - "[::1]:5555": "tcp://[::1]:5555", - "[::1]:5555/path": "tcp://[::1]:5555/path", - "[0:0:0:0:0:0:0:1]:": "tcp://[0:0:0:0:0:0:0:1]:2376", - "[0:0:0:0:0:0:0:1]:5555": "tcp://[0:0:0:0:0:0:0:1]:5555", - "[0:0:0:0:0:0:0:1]:5555/path": "tcp://[0:0:0:0:0:0:0:1]:5555/path", - "localhost:": "tcp://localhost:2376", - "localhost:5555": "tcp://localhost:5555", - "localhost:5555/path": "tcp://localhost:5555/path", - } - for invalidAddr, expectedError := range invalids { - if addr, err := ParseTCPAddr(invalidAddr, defaultHTTPHost); err == nil || err.Error() != expectedError { - t.Errorf("tcp %v address expected error %v return, got %s and addr %v", invalidAddr, expectedError, err, addr) - } - } - for validAddr, expectedAddr := range valids { - if addr, err := ParseTCPAddr(validAddr, defaultHTTPHost); err != nil || addr != expectedAddr { - t.Errorf("%v -> expected %v, got %v and addr %v", validAddr, expectedAddr, err, addr) - } - } -} - -func TestParseInvalidUnixAddrInvalid(t *testing.T) { - if _, err := parseSimpleProtoAddr("unix", "tcp://127.0.0.1", "unix:///var/run/docker.sock"); err == nil || err.Error() != "Invalid proto, expected unix: tcp://127.0.0.1" { - t.Fatalf("Expected an error, got %v", err) - } - if _, err := parseSimpleProtoAddr("unix", "unix://tcp://127.0.0.1", "/var/run/docker.sock"); err == nil || err.Error() != "Invalid proto, expected unix: tcp://127.0.0.1" { - t.Fatalf("Expected an error, got %v", err) - } - if v, err := parseSimpleProtoAddr("unix", "", "/var/run/docker.sock"); err != nil || v != "unix:///var/run/docker.sock" { - t.Fatalf("Expected an %v, got %v", v, "unix:///var/run/docker.sock") - } -} diff --git a/vendor/github.com/docker/docker/opts/hosts_unix.go b/vendor/github.com/docker/docker/opts/hosts_unix.go deleted file mode 100644 index 611407a9d..000000000 --- a/vendor/github.com/docker/docker/opts/hosts_unix.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !windows - -package opts - -import "fmt" - -// DefaultHost constant defines the default host string used by docker on other hosts than Windows -var DefaultHost = fmt.Sprintf("unix://%s", DefaultUnixSocket) diff --git a/vendor/github.com/docker/docker/opts/hosts_windows.go b/vendor/github.com/docker/docker/opts/hosts_windows.go deleted file mode 100644 index 7c239e00f..000000000 --- a/vendor/github.com/docker/docker/opts/hosts_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -// +build windows - -package opts - -// DefaultHost constant defines the default host string used by docker on Windows -var DefaultHost = "npipe://" + DefaultNamedPipe diff --git a/vendor/github.com/docker/docker/opts/ip.go b/vendor/github.com/docker/docker/opts/ip.go deleted file mode 100644 index fb03b5011..000000000 --- a/vendor/github.com/docker/docker/opts/ip.go +++ /dev/null @@ -1,47 +0,0 @@ -package opts - -import ( - "fmt" - "net" -) - -// IPOpt holds an IP. It is used to store values from CLI flags. -type IPOpt struct { - *net.IP -} - -// NewIPOpt creates a new IPOpt from a reference net.IP and a -// string representation of an IP. If the string is not a valid -// IP it will fallback to the specified reference. -func NewIPOpt(ref *net.IP, defaultVal string) *IPOpt { - o := &IPOpt{ - IP: ref, - } - o.Set(defaultVal) - return o -} - -// Set sets an IPv4 or IPv6 address from a given string. If the given -// string is not parseable as an IP address it returns an error. -func (o *IPOpt) Set(val string) error { - ip := net.ParseIP(val) - if ip == nil { - return fmt.Errorf("%s is not an ip address", val) - } - *o.IP = ip - return nil -} - -// String returns the IP address stored in the IPOpt. If stored IP is a -// nil pointer, it returns an empty string. -func (o *IPOpt) String() string { - if *o.IP == nil { - return "" - } - return o.IP.String() -} - -// Type returns the type of the option -func (o *IPOpt) Type() string { - return "ip" -} diff --git a/vendor/github.com/docker/docker/opts/ip_test.go b/vendor/github.com/docker/docker/opts/ip_test.go deleted file mode 100644 index 1027d84a0..000000000 --- a/vendor/github.com/docker/docker/opts/ip_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package opts - -import ( - "net" - "testing" -) - -func TestIpOptString(t *testing.T) { - addresses := []string{"", "0.0.0.0"} - var ip net.IP - - for _, address := range addresses { - stringAddress := NewIPOpt(&ip, address).String() - if stringAddress != address { - t.Fatalf("IpOpt string should be `%s`, not `%s`", address, stringAddress) - } - } -} - -func TestNewIpOptInvalidDefaultVal(t *testing.T) { - ip := net.IPv4(127, 0, 0, 1) - defaultVal := "Not an ip" - - ipOpt := NewIPOpt(&ip, defaultVal) - - expected := "127.0.0.1" - if ipOpt.String() != expected { - t.Fatalf("Expected [%v], got [%v]", expected, ipOpt.String()) - } -} - -func TestNewIpOptValidDefaultVal(t *testing.T) { - ip := net.IPv4(127, 0, 0, 1) - defaultVal := "192.168.1.1" - - ipOpt := NewIPOpt(&ip, defaultVal) - - expected := "192.168.1.1" - if ipOpt.String() != expected { - t.Fatalf("Expected [%v], got [%v]", expected, ipOpt.String()) - } -} - -func TestIpOptSetInvalidVal(t *testing.T) { - ip := net.IPv4(127, 0, 0, 1) - ipOpt := &IPOpt{IP: &ip} - - invalidIP := "invalid ip" - expectedError := "invalid ip is not an ip address" - err := ipOpt.Set(invalidIP) - if err == nil || err.Error() != expectedError { - t.Fatalf("Expected an Error with [%v], got [%v]", expectedError, err.Error()) - } -} diff --git a/vendor/github.com/docker/docker/opts/mount.go b/vendor/github.com/docker/docker/opts/mount.go deleted file mode 100644 index ce6383ddc..000000000 --- a/vendor/github.com/docker/docker/opts/mount.go +++ /dev/null @@ -1,171 +0,0 @@ -package opts - -import ( - "encoding/csv" - "fmt" - "os" - "strconv" - "strings" - - mounttypes "github.com/docker/docker/api/types/mount" - "github.com/docker/go-units" -) - -// MountOpt is a Value type for parsing mounts -type MountOpt struct { - values []mounttypes.Mount -} - -// Set a new mount value -func (m *MountOpt) Set(value string) error { - csvReader := csv.NewReader(strings.NewReader(value)) - fields, err := csvReader.Read() - if err != nil { - return err - } - - mount := mounttypes.Mount{} - - volumeOptions := func() *mounttypes.VolumeOptions { - if mount.VolumeOptions == nil { - mount.VolumeOptions = &mounttypes.VolumeOptions{ - Labels: make(map[string]string), - } - } - if mount.VolumeOptions.DriverConfig == nil { - mount.VolumeOptions.DriverConfig = &mounttypes.Driver{} - } - return mount.VolumeOptions - } - - bindOptions := func() *mounttypes.BindOptions { - if mount.BindOptions == nil { - mount.BindOptions = new(mounttypes.BindOptions) - } - return mount.BindOptions - } - - tmpfsOptions := func() *mounttypes.TmpfsOptions { - if mount.TmpfsOptions == nil { - mount.TmpfsOptions = new(mounttypes.TmpfsOptions) - } - return mount.TmpfsOptions - } - - setValueOnMap := func(target map[string]string, value string) { - parts := strings.SplitN(value, "=", 2) - if len(parts) == 1 { - target[value] = "" - } else { - target[parts[0]] = parts[1] - } - } - - mount.Type = mounttypes.TypeVolume // default to volume mounts - // Set writable as the default - for _, field := range fields { - parts := strings.SplitN(field, "=", 2) - key := strings.ToLower(parts[0]) - - if len(parts) == 1 { - switch key { - case "readonly", "ro": - mount.ReadOnly = true - continue - case "volume-nocopy": - volumeOptions().NoCopy = true - continue - } - } - - if len(parts) != 2 { - return fmt.Errorf("invalid field '%s' must be a key=value pair", field) - } - - value := parts[1] - switch key { - case "type": - mount.Type = mounttypes.Type(strings.ToLower(value)) - case "source", "src": - mount.Source = value - case "target", "dst", "destination": - mount.Target = value - case "readonly", "ro": - mount.ReadOnly, err = strconv.ParseBool(value) - if err != nil { - return fmt.Errorf("invalid value for %s: %s", key, value) - } - case "bind-propagation": - bindOptions().Propagation = mounttypes.Propagation(strings.ToLower(value)) - case "volume-nocopy": - volumeOptions().NoCopy, err = strconv.ParseBool(value) - if err != nil { - return fmt.Errorf("invalid value for populate: %s", value) - } - case "volume-label": - setValueOnMap(volumeOptions().Labels, value) - case "volume-driver": - volumeOptions().DriverConfig.Name = value - case "volume-opt": - if volumeOptions().DriverConfig.Options == nil { - volumeOptions().DriverConfig.Options = make(map[string]string) - } - setValueOnMap(volumeOptions().DriverConfig.Options, value) - case "tmpfs-size": - sizeBytes, err := units.RAMInBytes(value) - if err != nil { - return fmt.Errorf("invalid value for %s: %s", key, value) - } - tmpfsOptions().SizeBytes = sizeBytes - case "tmpfs-mode": - ui64, err := strconv.ParseUint(value, 8, 32) - if err != nil { - return fmt.Errorf("invalid value for %s: %s", key, value) - } - tmpfsOptions().Mode = os.FileMode(ui64) - default: - return fmt.Errorf("unexpected key '%s' in '%s'", key, field) - } - } - - if mount.Type == "" { - return fmt.Errorf("type is required") - } - - if mount.Target == "" { - return fmt.Errorf("target is required") - } - - if mount.VolumeOptions != nil && mount.Type != mounttypes.TypeVolume { - return fmt.Errorf("cannot mix 'volume-*' options with mount type '%s'", mount.Type) - } - if mount.BindOptions != nil && mount.Type != mounttypes.TypeBind { - return fmt.Errorf("cannot mix 'bind-*' options with mount type '%s'", mount.Type) - } - if mount.TmpfsOptions != nil && mount.Type != mounttypes.TypeTmpfs { - return fmt.Errorf("cannot mix 'tmpfs-*' options with mount type '%s'", mount.Type) - } - - m.values = append(m.values, mount) - return nil -} - -// Type returns the type of this option -func (m *MountOpt) Type() string { - return "mount" -} - -// String returns a string repr of this option -func (m *MountOpt) String() string { - mounts := []string{} - for _, mount := range m.values { - repr := fmt.Sprintf("%s %s %s", mount.Type, mount.Source, mount.Target) - mounts = append(mounts, repr) - } - return strings.Join(mounts, ", ") -} - -// Value returns the mounts -func (m *MountOpt) Value() []mounttypes.Mount { - return m.values -} diff --git a/vendor/github.com/docker/docker/opts/mount_test.go b/vendor/github.com/docker/docker/opts/mount_test.go deleted file mode 100644 index 59606c38e..000000000 --- a/vendor/github.com/docker/docker/opts/mount_test.go +++ /dev/null @@ -1,184 +0,0 @@ -package opts - -import ( - "os" - "testing" - - mounttypes "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestMountOptString(t *testing.T) { - mount := MountOpt{ - values: []mounttypes.Mount{ - { - Type: mounttypes.TypeBind, - Source: "/home/path", - Target: "/target", - }, - { - Type: mounttypes.TypeVolume, - Source: "foo", - Target: "/target/foo", - }, - }, - } - expected := "bind /home/path /target, volume foo /target/foo" - assert.Equal(t, mount.String(), expected) -} - -func TestMountOptSetBindNoErrorBind(t *testing.T) { - for _, testcase := range []string{ - // tests several aliases that should have same result. - "type=bind,target=/target,source=/source", - "type=bind,src=/source,dst=/target", - "type=bind,source=/source,dst=/target", - "type=bind,src=/source,target=/target", - } { - var mount MountOpt - - assert.NilError(t, mount.Set(testcase)) - - mounts := mount.Value() - assert.Equal(t, len(mounts), 1) - assert.Equal(t, mounts[0], mounttypes.Mount{ - Type: mounttypes.TypeBind, - Source: "/source", - Target: "/target", - }) - } -} - -func TestMountOptSetVolumeNoError(t *testing.T) { - for _, testcase := range []string{ - // tests several aliases that should have same result. - "type=volume,target=/target,source=/source", - "type=volume,src=/source,dst=/target", - "type=volume,source=/source,dst=/target", - "type=volume,src=/source,target=/target", - } { - var mount MountOpt - - assert.NilError(t, mount.Set(testcase)) - - mounts := mount.Value() - assert.Equal(t, len(mounts), 1) - assert.Equal(t, mounts[0], mounttypes.Mount{ - Type: mounttypes.TypeVolume, - Source: "/source", - Target: "/target", - }) - } -} - -// TestMountOptDefaultType ensures that a mount without the type defaults to a -// volume mount. -func TestMountOptDefaultType(t *testing.T) { - var mount MountOpt - assert.NilError(t, mount.Set("target=/target,source=/foo")) - assert.Equal(t, mount.values[0].Type, mounttypes.TypeVolume) -} - -func TestMountOptSetErrorNoTarget(t *testing.T) { - var mount MountOpt - assert.Error(t, mount.Set("type=volume,source=/foo"), "target is required") -} - -func TestMountOptSetErrorInvalidKey(t *testing.T) { - var mount MountOpt - assert.Error(t, mount.Set("type=volume,bogus=foo"), "unexpected key 'bogus'") -} - -func TestMountOptSetErrorInvalidField(t *testing.T) { - var mount MountOpt - assert.Error(t, mount.Set("type=volume,bogus"), "invalid field 'bogus'") -} - -func TestMountOptSetErrorInvalidReadOnly(t *testing.T) { - var mount MountOpt - assert.Error(t, mount.Set("type=volume,readonly=no"), "invalid value for readonly: no") - assert.Error(t, mount.Set("type=volume,readonly=invalid"), "invalid value for readonly: invalid") -} - -func TestMountOptDefaultEnableReadOnly(t *testing.T) { - var m MountOpt - assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo")) - assert.Equal(t, m.values[0].ReadOnly, false) - - m = MountOpt{} - assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo,readonly")) - assert.Equal(t, m.values[0].ReadOnly, true) - - m = MountOpt{} - assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo,readonly=1")) - assert.Equal(t, m.values[0].ReadOnly, true) - - m = MountOpt{} - assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo,readonly=true")) - assert.Equal(t, m.values[0].ReadOnly, true) - - m = MountOpt{} - assert.NilError(t, m.Set("type=bind,target=/foo,source=/foo,readonly=0")) - assert.Equal(t, m.values[0].ReadOnly, false) -} - -func TestMountOptVolumeNoCopy(t *testing.T) { - var m MountOpt - assert.NilError(t, m.Set("type=volume,target=/foo,volume-nocopy")) - assert.Equal(t, m.values[0].Source, "") - - m = MountOpt{} - assert.NilError(t, m.Set("type=volume,target=/foo,source=foo")) - assert.Equal(t, m.values[0].VolumeOptions == nil, true) - - m = MountOpt{} - assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy=true")) - assert.Equal(t, m.values[0].VolumeOptions != nil, true) - assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) - - m = MountOpt{} - assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy")) - assert.Equal(t, m.values[0].VolumeOptions != nil, true) - assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) - - m = MountOpt{} - assert.NilError(t, m.Set("type=volume,target=/foo,source=foo,volume-nocopy=1")) - assert.Equal(t, m.values[0].VolumeOptions != nil, true) - assert.Equal(t, m.values[0].VolumeOptions.NoCopy, true) -} - -func TestMountOptTypeConflict(t *testing.T) { - var m MountOpt - assert.Error(t, m.Set("type=bind,target=/foo,source=/foo,volume-nocopy=true"), "cannot mix") - assert.Error(t, m.Set("type=volume,target=/foo,source=/foo,bind-propagation=rprivate"), "cannot mix") -} - -func TestMountOptSetTmpfsNoError(t *testing.T) { - for _, testcase := range []string{ - // tests several aliases that should have same result. - "type=tmpfs,target=/target,tmpfs-size=1m,tmpfs-mode=0700", - "type=tmpfs,target=/target,tmpfs-size=1MB,tmpfs-mode=700", - } { - var mount MountOpt - - assert.NilError(t, mount.Set(testcase)) - - mounts := mount.Value() - assert.Equal(t, len(mounts), 1) - assert.DeepEqual(t, mounts[0], mounttypes.Mount{ - Type: mounttypes.TypeTmpfs, - Target: "/target", - TmpfsOptions: &mounttypes.TmpfsOptions{ - SizeBytes: 1024 * 1024, // not 1000 * 1000 - Mode: os.FileMode(0700), - }, - }) - } -} - -func TestMountOptSetTmpfsError(t *testing.T) { - var m MountOpt - assert.Error(t, m.Set("type=tmpfs,target=/foo,tmpfs-size=foo"), "invalid value for tmpfs-size") - assert.Error(t, m.Set("type=tmpfs,target=/foo,tmpfs-mode=foo"), "invalid value for tmpfs-mode") - assert.Error(t, m.Set("type=tmpfs"), "target is required") -} diff --git a/vendor/github.com/docker/docker/opts/opts.go b/vendor/github.com/docker/docker/opts/opts.go deleted file mode 100644 index ae851537e..000000000 --- a/vendor/github.com/docker/docker/opts/opts.go +++ /dev/null @@ -1,360 +0,0 @@ -package opts - -import ( - "fmt" - "math/big" - "net" - "regexp" - "strings" - - "github.com/docker/docker/api/types/filters" -) - -var ( - alphaRegexp = regexp.MustCompile(`[a-zA-Z]`) - domainRegexp = regexp.MustCompile(`^(:?(:?[a-zA-Z0-9]|(:?[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]))(:?\.(:?[a-zA-Z0-9]|(:?[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])))*)\.?\s*$`) -) - -// ListOpts holds a list of values and a validation function. -type ListOpts struct { - values *[]string - validator ValidatorFctType -} - -// NewListOpts creates a new ListOpts with the specified validator. -func NewListOpts(validator ValidatorFctType) ListOpts { - var values []string - return *NewListOptsRef(&values, validator) -} - -// NewListOptsRef creates a new ListOpts with the specified values and validator. -func NewListOptsRef(values *[]string, validator ValidatorFctType) *ListOpts { - return &ListOpts{ - values: values, - validator: validator, - } -} - -func (opts *ListOpts) String() string { - return fmt.Sprintf("%v", []string((*opts.values))) -} - -// Set validates if needed the input value and adds it to the -// internal slice. -func (opts *ListOpts) Set(value string) error { - if opts.validator != nil { - v, err := opts.validator(value) - if err != nil { - return err - } - value = v - } - (*opts.values) = append((*opts.values), value) - return nil -} - -// Delete removes the specified element from the slice. -func (opts *ListOpts) Delete(key string) { - for i, k := range *opts.values { - if k == key { - (*opts.values) = append((*opts.values)[:i], (*opts.values)[i+1:]...) - return - } - } -} - -// GetMap returns the content of values in a map in order to avoid -// duplicates. -func (opts *ListOpts) GetMap() map[string]struct{} { - ret := make(map[string]struct{}) - for _, k := range *opts.values { - ret[k] = struct{}{} - } - return ret -} - -// GetAll returns the values of slice. -func (opts *ListOpts) GetAll() []string { - return (*opts.values) -} - -// GetAllOrEmpty returns the values of the slice -// or an empty slice when there are no values. -func (opts *ListOpts) GetAllOrEmpty() []string { - v := *opts.values - if v == nil { - return make([]string, 0) - } - return v -} - -// Get checks the existence of the specified key. -func (opts *ListOpts) Get(key string) bool { - for _, k := range *opts.values { - if k == key { - return true - } - } - return false -} - -// Len returns the amount of element in the slice. -func (opts *ListOpts) Len() int { - return len((*opts.values)) -} - -// Type returns a string name for this Option type -func (opts *ListOpts) Type() string { - return "list" -} - -// NamedOption is an interface that list and map options -// with names implement. -type NamedOption interface { - Name() string -} - -// NamedListOpts is a ListOpts with a configuration name. -// This struct is useful to keep reference to the assigned -// field name in the internal configuration struct. -type NamedListOpts struct { - name string - ListOpts -} - -var _ NamedOption = &NamedListOpts{} - -// NewNamedListOptsRef creates a reference to a new NamedListOpts struct. -func NewNamedListOptsRef(name string, values *[]string, validator ValidatorFctType) *NamedListOpts { - return &NamedListOpts{ - name: name, - ListOpts: *NewListOptsRef(values, validator), - } -} - -// Name returns the name of the NamedListOpts in the configuration. -func (o *NamedListOpts) Name() string { - return o.name -} - -// MapOpts holds a map of values and a validation function. -type MapOpts struct { - values map[string]string - validator ValidatorFctType -} - -// Set validates if needed the input value and add it to the -// internal map, by splitting on '='. -func (opts *MapOpts) Set(value string) error { - if opts.validator != nil { - v, err := opts.validator(value) - if err != nil { - return err - } - value = v - } - vals := strings.SplitN(value, "=", 2) - if len(vals) == 1 { - (opts.values)[vals[0]] = "" - } else { - (opts.values)[vals[0]] = vals[1] - } - return nil -} - -// GetAll returns the values of MapOpts as a map. -func (opts *MapOpts) GetAll() map[string]string { - return opts.values -} - -func (opts *MapOpts) String() string { - return fmt.Sprintf("%v", map[string]string((opts.values))) -} - -// Type returns a string name for this Option type -func (opts *MapOpts) Type() string { - return "map" -} - -// NewMapOpts creates a new MapOpts with the specified map of values and a validator. -func NewMapOpts(values map[string]string, validator ValidatorFctType) *MapOpts { - if values == nil { - values = make(map[string]string) - } - return &MapOpts{ - values: values, - validator: validator, - } -} - -// NamedMapOpts is a MapOpts struct with a configuration name. -// This struct is useful to keep reference to the assigned -// field name in the internal configuration struct. -type NamedMapOpts struct { - name string - MapOpts -} - -var _ NamedOption = &NamedMapOpts{} - -// NewNamedMapOpts creates a reference to a new NamedMapOpts struct. -func NewNamedMapOpts(name string, values map[string]string, validator ValidatorFctType) *NamedMapOpts { - return &NamedMapOpts{ - name: name, - MapOpts: *NewMapOpts(values, validator), - } -} - -// Name returns the name of the NamedMapOpts in the configuration. -func (o *NamedMapOpts) Name() string { - return o.name -} - -// ValidatorFctType defines a validator function that returns a validated string and/or an error. -type ValidatorFctType func(val string) (string, error) - -// ValidatorFctListType defines a validator function that returns a validated list of string and/or an error -type ValidatorFctListType func(val string) ([]string, error) - -// ValidateIPAddress validates an Ip address. -func ValidateIPAddress(val string) (string, error) { - var ip = net.ParseIP(strings.TrimSpace(val)) - if ip != nil { - return ip.String(), nil - } - return "", fmt.Errorf("%s is not an ip address", val) -} - -// ValidateDNSSearch validates domain for resolvconf search configuration. -// A zero length domain is represented by a dot (.). -func ValidateDNSSearch(val string) (string, error) { - if val = strings.Trim(val, " "); val == "." { - return val, nil - } - return validateDomain(val) -} - -func validateDomain(val string) (string, error) { - if alphaRegexp.FindString(val) == "" { - return "", fmt.Errorf("%s is not a valid domain", val) - } - ns := domainRegexp.FindSubmatch([]byte(val)) - if len(ns) > 0 && len(ns[1]) < 255 { - return string(ns[1]), nil - } - return "", fmt.Errorf("%s is not a valid domain", val) -} - -// ValidateLabel validates that the specified string is a valid label, and returns it. -// Labels are in the form on key=value. -func ValidateLabel(val string) (string, error) { - if strings.Count(val, "=") < 1 { - return "", fmt.Errorf("bad attribute format: %s", val) - } - return val, nil -} - -// ValidateSysctl validates a sysctl and returns it. -func ValidateSysctl(val string) (string, error) { - validSysctlMap := map[string]bool{ - "kernel.msgmax": true, - "kernel.msgmnb": true, - "kernel.msgmni": true, - "kernel.sem": true, - "kernel.shmall": true, - "kernel.shmmax": true, - "kernel.shmmni": true, - "kernel.shm_rmid_forced": true, - } - validSysctlPrefixes := []string{ - "net.", - "fs.mqueue.", - } - arr := strings.Split(val, "=") - if len(arr) < 2 { - return "", fmt.Errorf("sysctl '%s' is not whitelisted", val) - } - if validSysctlMap[arr[0]] { - return val, nil - } - - for _, vp := range validSysctlPrefixes { - if strings.HasPrefix(arr[0], vp) { - return val, nil - } - } - return "", fmt.Errorf("sysctl '%s' is not whitelisted", val) -} - -// FilterOpt is a flag type for validating filters -type FilterOpt struct { - filter filters.Args -} - -// NewFilterOpt returns a new FilterOpt -func NewFilterOpt() FilterOpt { - return FilterOpt{filter: filters.NewArgs()} -} - -func (o *FilterOpt) String() string { - repr, err := filters.ToParam(o.filter) - if err != nil { - return "invalid filters" - } - return repr -} - -// Set sets the value of the opt by parsing the command line value -func (o *FilterOpt) Set(value string) error { - var err error - o.filter, err = filters.ParseFlag(value, o.filter) - return err -} - -// Type returns the option type -func (o *FilterOpt) Type() string { - return "filter" -} - -// Value returns the value of this option -func (o *FilterOpt) Value() filters.Args { - return o.filter -} - -// NanoCPUs is a type for fixed point fractional number. -type NanoCPUs int64 - -// String returns the string format of the number -func (c *NanoCPUs) String() string { - return big.NewRat(c.Value(), 1e9).FloatString(3) -} - -// Set sets the value of the NanoCPU by passing a string -func (c *NanoCPUs) Set(value string) error { - cpus, err := ParseCPUs(value) - *c = NanoCPUs(cpus) - return err -} - -// Type returns the type -func (c *NanoCPUs) Type() string { - return "decimal" -} - -// Value returns the value in int64 -func (c *NanoCPUs) Value() int64 { - return int64(*c) -} - -// ParseCPUs takes a string ratio and returns an integer value of nano cpus -func ParseCPUs(value string) (int64, error) { - cpu, ok := new(big.Rat).SetString(value) - if !ok { - return 0, fmt.Errorf("failed to parse %v as a rational number", value) - } - nano := cpu.Mul(cpu, big.NewRat(1e9, 1)) - if !nano.IsInt() { - return 0, fmt.Errorf("value is too precise") - } - return nano.Num().Int64(), nil -} diff --git a/vendor/github.com/docker/docker/opts/opts_test.go b/vendor/github.com/docker/docker/opts/opts_test.go deleted file mode 100644 index 9f41e4786..000000000 --- a/vendor/github.com/docker/docker/opts/opts_test.go +++ /dev/null @@ -1,232 +0,0 @@ -package opts - -import ( - "fmt" - "strings" - "testing" -) - -func TestValidateIPAddress(t *testing.T) { - if ret, err := ValidateIPAddress(`1.2.3.4`); err != nil || ret == "" { - t.Fatalf("ValidateIPAddress(`1.2.3.4`) got %s %s", ret, err) - } - - if ret, err := ValidateIPAddress(`127.0.0.1`); err != nil || ret == "" { - t.Fatalf("ValidateIPAddress(`127.0.0.1`) got %s %s", ret, err) - } - - if ret, err := ValidateIPAddress(`::1`); err != nil || ret == "" { - t.Fatalf("ValidateIPAddress(`::1`) got %s %s", ret, err) - } - - if ret, err := ValidateIPAddress(`127`); err == nil || ret != "" { - t.Fatalf("ValidateIPAddress(`127`) got %s %s", ret, err) - } - - if ret, err := ValidateIPAddress(`random invalid string`); err == nil || ret != "" { - t.Fatalf("ValidateIPAddress(`random invalid string`) got %s %s", ret, err) - } - -} - -func TestMapOpts(t *testing.T) { - tmpMap := make(map[string]string) - o := NewMapOpts(tmpMap, logOptsValidator) - o.Set("max-size=1") - if o.String() != "map[max-size:1]" { - t.Errorf("%s != [map[max-size:1]", o.String()) - } - - o.Set("max-file=2") - if len(tmpMap) != 2 { - t.Errorf("map length %d != 2", len(tmpMap)) - } - - if tmpMap["max-file"] != "2" { - t.Errorf("max-file = %s != 2", tmpMap["max-file"]) - } - - if tmpMap["max-size"] != "1" { - t.Errorf("max-size = %s != 1", tmpMap["max-size"]) - } - if o.Set("dummy-val=3") == nil { - t.Errorf("validator is not being called") - } -} - -func TestListOptsWithoutValidator(t *testing.T) { - o := NewListOpts(nil) - o.Set("foo") - if o.String() != "[foo]" { - t.Errorf("%s != [foo]", o.String()) - } - o.Set("bar") - if o.Len() != 2 { - t.Errorf("%d != 2", o.Len()) - } - o.Set("bar") - if o.Len() != 3 { - t.Errorf("%d != 3", o.Len()) - } - if !o.Get("bar") { - t.Error("o.Get(\"bar\") == false") - } - if o.Get("baz") { - t.Error("o.Get(\"baz\") == true") - } - o.Delete("foo") - if o.String() != "[bar bar]" { - t.Errorf("%s != [bar bar]", o.String()) - } - listOpts := o.GetAll() - if len(listOpts) != 2 || listOpts[0] != "bar" || listOpts[1] != "bar" { - t.Errorf("Expected [[bar bar]], got [%v]", listOpts) - } - mapListOpts := o.GetMap() - if len(mapListOpts) != 1 { - t.Errorf("Expected [map[bar:{}]], got [%v]", mapListOpts) - } - -} - -func TestListOptsWithValidator(t *testing.T) { - // Re-using logOptsvalidator (used by MapOpts) - o := NewListOpts(logOptsValidator) - o.Set("foo") - if o.String() != "[]" { - t.Errorf("%s != []", o.String()) - } - o.Set("foo=bar") - if o.String() != "[]" { - t.Errorf("%s != []", o.String()) - } - o.Set("max-file=2") - if o.Len() != 1 { - t.Errorf("%d != 1", o.Len()) - } - if !o.Get("max-file=2") { - t.Error("o.Get(\"max-file=2\") == false") - } - if o.Get("baz") { - t.Error("o.Get(\"baz\") == true") - } - o.Delete("max-file=2") - if o.String() != "[]" { - t.Errorf("%s != []", o.String()) - } -} - -func TestValidateDNSSearch(t *testing.T) { - valid := []string{ - `.`, - `a`, - `a.`, - `1.foo`, - `17.foo`, - `foo.bar`, - `foo.bar.baz`, - `foo.bar.`, - `foo.bar.baz`, - `foo1.bar2`, - `foo1.bar2.baz`, - `1foo.2bar.`, - `1foo.2bar.baz`, - `foo-1.bar-2`, - `foo-1.bar-2.baz`, - `foo-1.bar-2.`, - `foo-1.bar-2.baz`, - `1-foo.2-bar`, - `1-foo.2-bar.baz`, - `1-foo.2-bar.`, - `1-foo.2-bar.baz`, - } - - invalid := []string{ - ``, - ` `, - ` `, - `17`, - `17.`, - `.17`, - `17-.`, - `17-.foo`, - `.foo`, - `foo-.bar`, - `-foo.bar`, - `foo.bar-`, - `foo.bar-.baz`, - `foo.-bar`, - `foo.-bar.baz`, - `foo.bar.baz.this.should.fail.on.long.name.beause.it.is.longer.thanisshouldbethis.should.fail.on.long.name.beause.it.is.longer.thanisshouldbethis.should.fail.on.long.name.beause.it.is.longer.thanisshouldbethis.should.fail.on.long.name.beause.it.is.longer.thanisshouldbe`, - } - - for _, domain := range valid { - if ret, err := ValidateDNSSearch(domain); err != nil || ret == "" { - t.Fatalf("ValidateDNSSearch(`"+domain+"`) got %s %s", ret, err) - } - } - - for _, domain := range invalid { - if ret, err := ValidateDNSSearch(domain); err == nil || ret != "" { - t.Fatalf("ValidateDNSSearch(`"+domain+"`) got %s %s", ret, err) - } - } -} - -func TestValidateLabel(t *testing.T) { - if _, err := ValidateLabel("label"); err == nil || err.Error() != "bad attribute format: label" { - t.Fatalf("Expected an error [bad attribute format: label], go %v", err) - } - if actual, err := ValidateLabel("key1=value1"); err != nil || actual != "key1=value1" { - t.Fatalf("Expected [key1=value1], got [%v,%v]", actual, err) - } - // Validate it's working with more than one = - if actual, err := ValidateLabel("key1=value1=value2"); err != nil { - t.Fatalf("Expected [key1=value1=value2], got [%v,%v]", actual, err) - } - // Validate it's working with one more - if actual, err := ValidateLabel("key1=value1=value2=value3"); err != nil { - t.Fatalf("Expected [key1=value1=value2=value2], got [%v,%v]", actual, err) - } -} - -func logOptsValidator(val string) (string, error) { - allowedKeys := map[string]string{"max-size": "1", "max-file": "2"} - vals := strings.Split(val, "=") - if allowedKeys[vals[0]] != "" { - return val, nil - } - return "", fmt.Errorf("invalid key %s", vals[0]) -} - -func TestNamedListOpts(t *testing.T) { - var v []string - o := NewNamedListOptsRef("foo-name", &v, nil) - - o.Set("foo") - if o.String() != "[foo]" { - t.Errorf("%s != [foo]", o.String()) - } - if o.Name() != "foo-name" { - t.Errorf("%s != foo-name", o.Name()) - } - if len(v) != 1 { - t.Errorf("expected foo to be in the values, got %v", v) - } -} - -func TestNamedMapOpts(t *testing.T) { - tmpMap := make(map[string]string) - o := NewNamedMapOpts("max-name", tmpMap, nil) - - o.Set("max-size=1") - if o.String() != "map[max-size:1]" { - t.Errorf("%s != [map[max-size:1]", o.String()) - } - if o.Name() != "max-name" { - t.Errorf("%s != max-name", o.Name()) - } - if _, exist := tmpMap["max-size"]; !exist { - t.Errorf("expected map-size to be in the values, got %v", tmpMap) - } -} diff --git a/vendor/github.com/docker/docker/opts/opts_unix.go b/vendor/github.com/docker/docker/opts/opts_unix.go deleted file mode 100644 index f1ce844a8..000000000 --- a/vendor/github.com/docker/docker/opts/opts_unix.go +++ /dev/null @@ -1,6 +0,0 @@ -// +build !windows - -package opts - -// DefaultHTTPHost Default HTTP Host used if only port is provided to -H flag e.g. docker daemon -H tcp://:8080 -const DefaultHTTPHost = "localhost" diff --git a/vendor/github.com/docker/docker/opts/opts_windows.go b/vendor/github.com/docker/docker/opts/opts_windows.go deleted file mode 100644 index ebe40c969..000000000 --- a/vendor/github.com/docker/docker/opts/opts_windows.go +++ /dev/null @@ -1,56 +0,0 @@ -package opts - -// TODO Windows. Identify bug in GOLang 1.5.1+ and/or Windows Server 2016 TP5. -// @jhowardmsft, @swernli. -// -// On Windows, this mitigates a problem with the default options of running -// a docker client against a local docker daemon on TP5. -// -// What was found that if the default host is "localhost", even if the client -// (and daemon as this is local) is not physically on a network, and the DNS -// cache is flushed (ipconfig /flushdns), then the client will pause for -// exactly one second when connecting to the daemon for calls. For example -// using docker run windowsservercore cmd, the CLI will send a create followed -// by an attach. You see the delay between the attach finishing and the attach -// being seen by the daemon. -// -// Here's some daemon debug logs with additional debug spew put in. The -// AfterWriteJSON log is the very last thing the daemon does as part of the -// create call. The POST /attach is the second CLI call. Notice the second -// time gap. -// -// time="2015-11-06T13:38:37.259627400-08:00" level=debug msg="After createRootfs" -// time="2015-11-06T13:38:37.263626300-08:00" level=debug msg="After setHostConfig" -// time="2015-11-06T13:38:37.267631200-08:00" level=debug msg="before createContainerPl...." -// time="2015-11-06T13:38:37.271629500-08:00" level=debug msg=ToDiskLocking.... -// time="2015-11-06T13:38:37.275643200-08:00" level=debug msg="loggin event...." -// time="2015-11-06T13:38:37.277627600-08:00" level=debug msg="logged event...." -// time="2015-11-06T13:38:37.279631800-08:00" level=debug msg="In defer func" -// time="2015-11-06T13:38:37.282628100-08:00" level=debug msg="After daemon.create" -// time="2015-11-06T13:38:37.286651700-08:00" level=debug msg="return 2" -// time="2015-11-06T13:38:37.289629500-08:00" level=debug msg="Returned from daemon.ContainerCreate" -// time="2015-11-06T13:38:37.311629100-08:00" level=debug msg="After WriteJSON" -// ... 1 second gap here.... -// time="2015-11-06T13:38:38.317866200-08:00" level=debug msg="Calling POST /v1.22/containers/984758282b842f779e805664b2c95d563adc9a979c8a3973e68c807843ee4757/attach" -// time="2015-11-06T13:38:38.326882500-08:00" level=info msg="POST /v1.22/containers/984758282b842f779e805664b2c95d563adc9a979c8a3973e68c807843ee4757/attach?stderr=1&stdin=1&stdout=1&stream=1" -// -// We suspect this is either a bug introduced in GOLang 1.5.1, or that a change -// in GOLang 1.5.1 (from 1.4.3) is exposing a bug in Windows. In theory, -// the Windows networking stack is supposed to resolve "localhost" internally, -// without hitting DNS, or even reading the hosts file (which is why localhost -// is commented out in the hosts file on Windows). -// -// We have validated that working around this using the actual IPv4 localhost -// address does not cause the delay. -// -// This does not occur with the docker client built with 1.4.3 on the same -// Windows build, regardless of whether the daemon is built using 1.5.1 -// or 1.4.3. It does not occur on Linux. We also verified we see the same thing -// on a cross-compiled Windows binary (from Linux). -// -// Final note: This is a mitigation, not a 'real' fix. It is still susceptible -// to the delay if a user were to do 'docker run -H=tcp://localhost:2375...' -// explicitly. - -// DefaultHTTPHost Default HTTP Host used if only port is provided to -H flag e.g. docker daemon -H tcp://:8080 -const DefaultHTTPHost = "127.0.0.1" diff --git a/vendor/github.com/docker/docker/opts/port.go b/vendor/github.com/docker/docker/opts/port.go deleted file mode 100644 index 020a5d1e1..000000000 --- a/vendor/github.com/docker/docker/opts/port.go +++ /dev/null @@ -1,146 +0,0 @@ -package opts - -import ( - "encoding/csv" - "fmt" - "regexp" - "strconv" - "strings" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/go-connections/nat" -) - -const ( - portOptTargetPort = "target" - portOptPublishedPort = "published" - portOptProtocol = "protocol" - portOptMode = "mode" -) - -// PortOpt represents a port config in swarm mode. -type PortOpt struct { - ports []swarm.PortConfig -} - -// Set a new port value -func (p *PortOpt) Set(value string) error { - longSyntax, err := regexp.MatchString(`\w+=\w+(,\w+=\w+)*`, value) - if err != nil { - return err - } - if longSyntax { - csvReader := csv.NewReader(strings.NewReader(value)) - fields, err := csvReader.Read() - if err != nil { - return err - } - - pConfig := swarm.PortConfig{} - for _, field := range fields { - parts := strings.SplitN(field, "=", 2) - if len(parts) != 2 { - return fmt.Errorf("invalid field %s", field) - } - - key := strings.ToLower(parts[0]) - value := strings.ToLower(parts[1]) - - switch key { - case portOptProtocol: - if value != string(swarm.PortConfigProtocolTCP) && value != string(swarm.PortConfigProtocolUDP) { - return fmt.Errorf("invalid protocol value %s", value) - } - - pConfig.Protocol = swarm.PortConfigProtocol(value) - case portOptMode: - if value != string(swarm.PortConfigPublishModeIngress) && value != string(swarm.PortConfigPublishModeHost) { - return fmt.Errorf("invalid publish mode value %s", value) - } - - pConfig.PublishMode = swarm.PortConfigPublishMode(value) - case portOptTargetPort: - tPort, err := strconv.ParseUint(value, 10, 16) - if err != nil { - return err - } - - pConfig.TargetPort = uint32(tPort) - case portOptPublishedPort: - pPort, err := strconv.ParseUint(value, 10, 16) - if err != nil { - return err - } - - pConfig.PublishedPort = uint32(pPort) - default: - return fmt.Errorf("invalid field key %s", key) - } - } - - if pConfig.TargetPort == 0 { - return fmt.Errorf("missing mandatory field %q", portOptTargetPort) - } - - if pConfig.PublishMode == "" { - pConfig.PublishMode = swarm.PortConfigPublishModeIngress - } - - if pConfig.Protocol == "" { - pConfig.Protocol = swarm.PortConfigProtocolTCP - } - - p.ports = append(p.ports, pConfig) - } else { - // short syntax - portConfigs := []swarm.PortConfig{} - // We can ignore errors because the format was already validated by ValidatePort - ports, portBindings, _ := nat.ParsePortSpecs([]string{value}) - - for port := range ports { - portConfigs = append(portConfigs, ConvertPortToPortConfig(port, portBindings)...) - } - p.ports = append(p.ports, portConfigs...) - } - return nil -} - -// Type returns the type of this option -func (p *PortOpt) Type() string { - return "port" -} - -// String returns a string repr of this option -func (p *PortOpt) String() string { - ports := []string{} - for _, port := range p.ports { - repr := fmt.Sprintf("%v:%v/%s/%s", port.PublishedPort, port.TargetPort, port.Protocol, port.PublishMode) - ports = append(ports, repr) - } - return strings.Join(ports, ", ") -} - -// Value returns the ports -func (p *PortOpt) Value() []swarm.PortConfig { - return p.ports -} - -// ConvertPortToPortConfig converts ports to the swarm type -func ConvertPortToPortConfig( - port nat.Port, - portBindings map[nat.Port][]nat.PortBinding, -) []swarm.PortConfig { - ports := []swarm.PortConfig{} - - for _, binding := range portBindings[port] { - hostPort, _ := strconv.ParseUint(binding.HostPort, 10, 16) - ports = append(ports, swarm.PortConfig{ - //TODO Name: ? - Protocol: swarm.PortConfigProtocol(strings.ToLower(port.Proto())), - TargetPort: uint32(port.Int()), - PublishedPort: uint32(hostPort), - PublishMode: swarm.PortConfigPublishModeIngress, - }) - } - return ports -} diff --git a/vendor/github.com/docker/docker/opts/port_test.go b/vendor/github.com/docker/docker/opts/port_test.go deleted file mode 100644 index 67bcf8f1d..000000000 --- a/vendor/github.com/docker/docker/opts/port_test.go +++ /dev/null @@ -1,259 +0,0 @@ -package opts - -import ( - "testing" - - "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestPortOptValidSimpleSyntax(t *testing.T) { - testCases := []struct { - value string - expected []swarm.PortConfig - }{ - { - value: "80", - expected: []swarm.PortConfig{ - { - Protocol: "tcp", - TargetPort: 80, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - }, - }, - { - value: "80:8080", - expected: []swarm.PortConfig{ - { - Protocol: "tcp", - TargetPort: 8080, - PublishedPort: 80, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - }, - }, - { - value: "8080:80/tcp", - expected: []swarm.PortConfig{ - { - Protocol: "tcp", - TargetPort: 80, - PublishedPort: 8080, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - }, - }, - { - value: "80:8080/udp", - expected: []swarm.PortConfig{ - { - Protocol: "udp", - TargetPort: 8080, - PublishedPort: 80, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - }, - }, - { - value: "80-81:8080-8081/tcp", - expected: []swarm.PortConfig{ - { - Protocol: "tcp", - TargetPort: 8080, - PublishedPort: 80, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - { - Protocol: "tcp", - TargetPort: 8081, - PublishedPort: 81, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - }, - }, - { - value: "80-82:8080-8082/udp", - expected: []swarm.PortConfig{ - { - Protocol: "udp", - TargetPort: 8080, - PublishedPort: 80, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - { - Protocol: "udp", - TargetPort: 8081, - PublishedPort: 81, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - { - Protocol: "udp", - TargetPort: 8082, - PublishedPort: 82, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - }, - }, - } - for _, tc := range testCases { - var port PortOpt - assert.NilError(t, port.Set(tc.value)) - assert.Equal(t, len(port.Value()), len(tc.expected)) - for _, expectedPortConfig := range tc.expected { - assertContains(t, port.Value(), expectedPortConfig) - } - } -} - -func TestPortOptValidComplexSyntax(t *testing.T) { - testCases := []struct { - value string - expected []swarm.PortConfig - }{ - { - value: "target=80", - expected: []swarm.PortConfig{ - { - TargetPort: 80, - Protocol: "tcp", - PublishMode: swarm.PortConfigPublishModeIngress, - }, - }, - }, - { - value: "target=80,protocol=tcp", - expected: []swarm.PortConfig{ - { - Protocol: "tcp", - TargetPort: 80, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - }, - }, - { - value: "target=80,published=8080,protocol=tcp", - expected: []swarm.PortConfig{ - { - Protocol: "tcp", - TargetPort: 80, - PublishedPort: 8080, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - }, - }, - { - value: "published=80,target=8080,protocol=tcp", - expected: []swarm.PortConfig{ - { - Protocol: "tcp", - TargetPort: 8080, - PublishedPort: 80, - PublishMode: swarm.PortConfigPublishModeIngress, - }, - }, - }, - { - value: "target=80,published=8080,protocol=tcp,mode=host", - expected: []swarm.PortConfig{ - { - Protocol: "tcp", - TargetPort: 80, - PublishedPort: 8080, - PublishMode: "host", - }, - }, - }, - { - value: "target=80,published=8080,mode=host", - expected: []swarm.PortConfig{ - { - TargetPort: 80, - PublishedPort: 8080, - PublishMode: "host", - Protocol: "tcp", - }, - }, - }, - { - value: "target=80,published=8080,mode=ingress", - expected: []swarm.PortConfig{ - { - TargetPort: 80, - PublishedPort: 8080, - PublishMode: "ingress", - Protocol: "tcp", - }, - }, - }, - } - for _, tc := range testCases { - var port PortOpt - assert.NilError(t, port.Set(tc.value)) - assert.Equal(t, len(port.Value()), len(tc.expected)) - for _, expectedPortConfig := range tc.expected { - assertContains(t, port.Value(), expectedPortConfig) - } - } -} - -func TestPortOptInvalidComplexSyntax(t *testing.T) { - testCases := []struct { - value string - expectedError string - }{ - { - value: "invalid,target=80", - expectedError: "invalid field", - }, - { - value: "invalid=field", - expectedError: "invalid field", - }, - { - value: "protocol=invalid", - expectedError: "invalid protocol value", - }, - { - value: "target=invalid", - expectedError: "invalid syntax", - }, - { - value: "published=invalid", - expectedError: "invalid syntax", - }, - { - value: "mode=invalid", - expectedError: "invalid publish mode value", - }, - { - value: "published=8080,protocol=tcp,mode=ingress", - expectedError: "missing mandatory field", - }, - { - value: `target=80,protocol="tcp,mode=ingress"`, - expectedError: "non-quoted-field", - }, - { - value: `target=80,"protocol=tcp,mode=ingress"`, - expectedError: "invalid protocol value", - }, - } - for _, tc := range testCases { - var port PortOpt - assert.Error(t, port.Set(tc.value), tc.expectedError) - } -} - -func assertContains(t *testing.T, portConfigs []swarm.PortConfig, expected swarm.PortConfig) { - var contains = false - for _, portConfig := range portConfigs { - if portConfig == expected { - contains = true - break - } - } - if !contains { - t.Errorf("expected %v to contain %v, did not", portConfigs, expected) - } -} diff --git a/vendor/github.com/docker/docker/opts/quotedstring.go b/vendor/github.com/docker/docker/opts/quotedstring.go deleted file mode 100644 index fb1e5374b..000000000 --- a/vendor/github.com/docker/docker/opts/quotedstring.go +++ /dev/null @@ -1,37 +0,0 @@ -package opts - -// QuotedString is a string that may have extra quotes around the value. The -// quotes are stripped from the value. -type QuotedString struct { - value *string -} - -// Set sets a new value -func (s *QuotedString) Set(val string) error { - *s.value = trimQuotes(val) - return nil -} - -// Type returns the type of the value -func (s *QuotedString) Type() string { - return "string" -} - -func (s *QuotedString) String() string { - return string(*s.value) -} - -func trimQuotes(value string) string { - lastIndex := len(value) - 1 - for _, char := range []byte{'\'', '"'} { - if value[0] == char && value[lastIndex] == char { - return value[1:lastIndex] - } - } - return value -} - -// NewQuotedString returns a new quoted string option -func NewQuotedString(value *string) *QuotedString { - return &QuotedString{value: value} -} diff --git a/vendor/github.com/docker/docker/opts/quotedstring_test.go b/vendor/github.com/docker/docker/opts/quotedstring_test.go deleted file mode 100644 index 0ebf04bbe..000000000 --- a/vendor/github.com/docker/docker/opts/quotedstring_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package opts - -import ( - "github.com/docker/docker/pkg/testutil/assert" - "testing" -) - -func TestQuotedStringSetWithQuotes(t *testing.T) { - value := "" - qs := NewQuotedString(&value) - assert.NilError(t, qs.Set("\"something\"")) - assert.Equal(t, qs.String(), "something") - assert.Equal(t, value, "something") -} - -func TestQuotedStringSetWithMismatchedQuotes(t *testing.T) { - value := "" - qs := NewQuotedString(&value) - assert.NilError(t, qs.Set("\"something'")) - assert.Equal(t, qs.String(), "\"something'") -} - -func TestQuotedStringSetWithNoQuotes(t *testing.T) { - value := "" - qs := NewQuotedString(&value) - assert.NilError(t, qs.Set("something")) - assert.Equal(t, qs.String(), "something") -} diff --git a/vendor/github.com/docker/docker/opts/secret.go b/vendor/github.com/docker/docker/opts/secret.go deleted file mode 100644 index 1fefcf843..000000000 --- a/vendor/github.com/docker/docker/opts/secret.go +++ /dev/null @@ -1,107 +0,0 @@ -package opts - -import ( - "encoding/csv" - "fmt" - "os" - "path/filepath" - "strconv" - "strings" - - "github.com/docker/docker/api/types" -) - -// SecretOpt is a Value type for parsing secrets -type SecretOpt struct { - values []*types.SecretRequestOption -} - -// Set a new secret value -func (o *SecretOpt) Set(value string) error { - csvReader := csv.NewReader(strings.NewReader(value)) - fields, err := csvReader.Read() - if err != nil { - return err - } - - options := &types.SecretRequestOption{ - Source: "", - Target: "", - UID: "0", - GID: "0", - Mode: 0444, - } - - // support a simple syntax of --secret foo - if len(fields) == 1 { - options.Source = fields[0] - options.Target = fields[0] - o.values = append(o.values, options) - return nil - } - - for _, field := range fields { - parts := strings.SplitN(field, "=", 2) - key := strings.ToLower(parts[0]) - - if len(parts) != 2 { - return fmt.Errorf("invalid field '%s' must be a key=value pair", field) - } - - value := parts[1] - switch key { - case "source", "src": - options.Source = value - case "target": - tDir, _ := filepath.Split(value) - if tDir != "" { - return fmt.Errorf("target must not be a path") - } - options.Target = value - case "uid": - options.UID = value - case "gid": - options.GID = value - case "mode": - m, err := strconv.ParseUint(value, 0, 32) - if err != nil { - return fmt.Errorf("invalid mode specified: %v", err) - } - - options.Mode = os.FileMode(m) - default: - if len(fields) == 1 && value == "" { - - } else { - return fmt.Errorf("invalid field in secret request: %s", key) - } - } - } - - if options.Source == "" { - return fmt.Errorf("source is required") - } - - o.values = append(o.values, options) - return nil -} - -// Type returns the type of this option -func (o *SecretOpt) Type() string { - return "secret" -} - -// String returns a string repr of this option -func (o *SecretOpt) String() string { - secrets := []string{} - for _, secret := range o.values { - repr := fmt.Sprintf("%s -> %s", secret.Source, secret.Target) - secrets = append(secrets, repr) - } - return strings.Join(secrets, ", ") -} - -// Value returns the secret requests -func (o *SecretOpt) Value() []*types.SecretRequestOption { - return o.values -} diff --git a/vendor/github.com/docker/docker/opts/secret_test.go b/vendor/github.com/docker/docker/opts/secret_test.go deleted file mode 100644 index d978c86e2..000000000 --- a/vendor/github.com/docker/docker/opts/secret_test.go +++ /dev/null @@ -1,79 +0,0 @@ -package opts - -import ( - "os" - "testing" - - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestSecretOptionsSimple(t *testing.T) { - var opt SecretOpt - - testCase := "app-secret" - assert.NilError(t, opt.Set(testCase)) - - reqs := opt.Value() - assert.Equal(t, len(reqs), 1) - req := reqs[0] - assert.Equal(t, req.Source, "app-secret") - assert.Equal(t, req.Target, "app-secret") - assert.Equal(t, req.UID, "0") - assert.Equal(t, req.GID, "0") -} - -func TestSecretOptionsSourceTarget(t *testing.T) { - var opt SecretOpt - - testCase := "source=foo,target=testing" - assert.NilError(t, opt.Set(testCase)) - - reqs := opt.Value() - assert.Equal(t, len(reqs), 1) - req := reqs[0] - assert.Equal(t, req.Source, "foo") - assert.Equal(t, req.Target, "testing") -} - -func TestSecretOptionsShorthand(t *testing.T) { - var opt SecretOpt - - testCase := "src=foo,target=testing" - assert.NilError(t, opt.Set(testCase)) - - reqs := opt.Value() - assert.Equal(t, len(reqs), 1) - req := reqs[0] - assert.Equal(t, req.Source, "foo") -} - -func TestSecretOptionsCustomUidGid(t *testing.T) { - var opt SecretOpt - - testCase := "source=foo,target=testing,uid=1000,gid=1001" - assert.NilError(t, opt.Set(testCase)) - - reqs := opt.Value() - assert.Equal(t, len(reqs), 1) - req := reqs[0] - assert.Equal(t, req.Source, "foo") - assert.Equal(t, req.Target, "testing") - assert.Equal(t, req.UID, "1000") - assert.Equal(t, req.GID, "1001") -} - -func TestSecretOptionsCustomMode(t *testing.T) { - var opt SecretOpt - - testCase := "source=foo,target=testing,uid=1000,gid=1001,mode=0444" - assert.NilError(t, opt.Set(testCase)) - - reqs := opt.Value() - assert.Equal(t, len(reqs), 1) - req := reqs[0] - assert.Equal(t, req.Source, "foo") - assert.Equal(t, req.Target, "testing") - assert.Equal(t, req.UID, "1000") - assert.Equal(t, req.GID, "1001") - assert.Equal(t, req.Mode, os.FileMode(0444)) -} diff --git a/vendor/github.com/docker/docker/pkg/aaparser/aaparser.go b/vendor/github.com/docker/docker/pkg/aaparser/aaparser.go deleted file mode 100644 index ffcc5647a..000000000 --- a/vendor/github.com/docker/docker/pkg/aaparser/aaparser.go +++ /dev/null @@ -1,91 +0,0 @@ -// Package aaparser is a convenience package interacting with `apparmor_parser`. -package aaparser - -import ( - "fmt" - "os/exec" - "strconv" - "strings" -) - -const ( - binary = "apparmor_parser" -) - -// GetVersion returns the major and minor version of apparmor_parser. -func GetVersion() (int, error) { - output, err := cmd("", "--version") - if err != nil { - return -1, err - } - - return parseVersion(output) -} - -// LoadProfile runs `apparmor_parser -r` on a specified apparmor profile to -// replace the profile. -func LoadProfile(profilePath string) error { - _, err := cmd("", "-r", profilePath) - if err != nil { - return err - } - return nil -} - -// cmd runs `apparmor_parser` with the passed arguments. -func cmd(dir string, arg ...string) (string, error) { - c := exec.Command(binary, arg...) - c.Dir = dir - - output, err := c.CombinedOutput() - if err != nil { - return "", fmt.Errorf("running `%s %s` failed with output: %s\nerror: %v", c.Path, strings.Join(c.Args, " "), string(output), err) - } - - return string(output), nil -} - -// parseVersion takes the output from `apparmor_parser --version` and returns -// a representation of the {major, minor, patch} version as a single number of -// the form MMmmPPP {major, minor, patch}. -func parseVersion(output string) (int, error) { - // output is in the form of the following: - // AppArmor parser version 2.9.1 - // Copyright (C) 1999-2008 Novell Inc. - // Copyright 2009-2012 Canonical Ltd. - - lines := strings.SplitN(output, "\n", 2) - words := strings.Split(lines[0], " ") - version := words[len(words)-1] - - // split by major minor version - v := strings.Split(version, ".") - if len(v) == 0 || len(v) > 3 { - return -1, fmt.Errorf("parsing version failed for output: `%s`", output) - } - - // Default the versions to 0. - var majorVersion, minorVersion, patchLevel int - - majorVersion, err := strconv.Atoi(v[0]) - if err != nil { - return -1, err - } - - if len(v) > 1 { - minorVersion, err = strconv.Atoi(v[1]) - if err != nil { - return -1, err - } - } - if len(v) > 2 { - patchLevel, err = strconv.Atoi(v[2]) - if err != nil { - return -1, err - } - } - - // major*10^5 + minor*10^3 + patch*10^0 - numericVersion := majorVersion*1e5 + minorVersion*1e3 + patchLevel - return numericVersion, nil -} diff --git a/vendor/github.com/docker/docker/pkg/aaparser/aaparser_test.go b/vendor/github.com/docker/docker/pkg/aaparser/aaparser_test.go deleted file mode 100644 index 69bc8d2fd..000000000 --- a/vendor/github.com/docker/docker/pkg/aaparser/aaparser_test.go +++ /dev/null @@ -1,73 +0,0 @@ -package aaparser - -import ( - "testing" -) - -type versionExpected struct { - output string - version int -} - -func TestParseVersion(t *testing.T) { - versions := []versionExpected{ - { - output: `AppArmor parser version 2.10 -Copyright (C) 1999-2008 Novell Inc. -Copyright 2009-2012 Canonical Ltd. - -`, - version: 210000, - }, - { - output: `AppArmor parser version 2.8 -Copyright (C) 1999-2008 Novell Inc. -Copyright 2009-2012 Canonical Ltd. - -`, - version: 208000, - }, - { - output: `AppArmor parser version 2.20 -Copyright (C) 1999-2008 Novell Inc. -Copyright 2009-2012 Canonical Ltd. - -`, - version: 220000, - }, - { - output: `AppArmor parser version 2.05 -Copyright (C) 1999-2008 Novell Inc. -Copyright 2009-2012 Canonical Ltd. - -`, - version: 205000, - }, - { - output: `AppArmor parser version 2.9.95 -Copyright (C) 1999-2008 Novell Inc. -Copyright 2009-2012 Canonical Ltd. - -`, - version: 209095, - }, - { - output: `AppArmor parser version 3.14.159 -Copyright (C) 1999-2008 Novell Inc. -Copyright 2009-2012 Canonical Ltd. - -`, - version: 314159, - }, - } - - for _, v := range versions { - version, err := parseVersion(v.output) - if err != nil { - t.Fatalf("expected error to be nil for %#v, got: %v", v, err) - } - if version != v.version { - t.Fatalf("expected version to be %d, was %d, for: %#v\n", v.version, version, v) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/archive/README.md b/vendor/github.com/docker/docker/pkg/archive/README.md deleted file mode 100644 index 7307d9694..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/README.md +++ /dev/null @@ -1 +0,0 @@ -This code provides helper functions for dealing with archive files. diff --git a/vendor/github.com/docker/docker/pkg/archive/archive.go b/vendor/github.com/docker/docker/pkg/archive/archive.go deleted file mode 100644 index 3261c4f49..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/archive.go +++ /dev/null @@ -1,1175 +0,0 @@ -package archive - -import ( - "archive/tar" - "bufio" - "bytes" - "compress/bzip2" - "compress/gzip" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - "syscall" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/fileutils" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/pools" - "github.com/docker/docker/pkg/promise" - "github.com/docker/docker/pkg/system" -) - -type ( - // Compression is the state represents if compressed or not. - Compression int - // WhiteoutFormat is the format of whiteouts unpacked - WhiteoutFormat int - // TarChownOptions wraps the chown options UID and GID. - TarChownOptions struct { - UID, GID int - } - - // TarOptions wraps the tar options. - TarOptions struct { - IncludeFiles []string - ExcludePatterns []string - Compression Compression - NoLchown bool - UIDMaps []idtools.IDMap - GIDMaps []idtools.IDMap - ChownOpts *TarChownOptions - IncludeSourceDir bool - // WhiteoutFormat is the expected on disk format for whiteout files. - // This format will be converted to the standard format on pack - // and from the standard format on unpack. - WhiteoutFormat WhiteoutFormat - // When unpacking, specifies whether overwriting a directory with a - // non-directory is allowed and vice versa. - NoOverwriteDirNonDir bool - // For each include when creating an archive, the included name will be - // replaced with the matching name from this map. - RebaseNames map[string]string - InUserNS bool - } - - // Archiver allows the reuse of most utility functions of this package - // with a pluggable Untar function. Also, to facilitate the passing of - // specific id mappings for untar, an archiver can be created with maps - // which will then be passed to Untar operations - Archiver struct { - Untar func(io.Reader, string, *TarOptions) error - UIDMaps []idtools.IDMap - GIDMaps []idtools.IDMap - } - - // breakoutError is used to differentiate errors related to breaking out - // When testing archive breakout in the unit tests, this error is expected - // in order for the test to pass. - breakoutError error -) - -var ( - // ErrNotImplemented is the error message of function not implemented. - ErrNotImplemented = errors.New("Function not implemented") - defaultArchiver = &Archiver{Untar: Untar, UIDMaps: nil, GIDMaps: nil} -) - -const ( - // HeaderSize is the size in bytes of a tar header - HeaderSize = 512 -) - -const ( - // Uncompressed represents the uncompressed. - Uncompressed Compression = iota - // Bzip2 is bzip2 compression algorithm. - Bzip2 - // Gzip is gzip compression algorithm. - Gzip - // Xz is xz compression algorithm. - Xz -) - -const ( - // AUFSWhiteoutFormat is the default format for whiteouts - AUFSWhiteoutFormat WhiteoutFormat = iota - // OverlayWhiteoutFormat formats whiteout according to the overlay - // standard. - OverlayWhiteoutFormat -) - -// IsArchive checks for the magic bytes of a tar or any supported compression -// algorithm. -func IsArchive(header []byte) bool { - compression := DetectCompression(header) - if compression != Uncompressed { - return true - } - r := tar.NewReader(bytes.NewBuffer(header)) - _, err := r.Next() - return err == nil -} - -// IsArchivePath checks if the (possibly compressed) file at the given path -// starts with a tar file header. -func IsArchivePath(path string) bool { - file, err := os.Open(path) - if err != nil { - return false - } - defer file.Close() - rdr, err := DecompressStream(file) - if err != nil { - return false - } - r := tar.NewReader(rdr) - _, err = r.Next() - return err == nil -} - -// DetectCompression detects the compression algorithm of the source. -func DetectCompression(source []byte) Compression { - for compression, m := range map[Compression][]byte{ - Bzip2: {0x42, 0x5A, 0x68}, - Gzip: {0x1F, 0x8B, 0x08}, - Xz: {0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00}, - } { - if len(source) < len(m) { - logrus.Debug("Len too short") - continue - } - if bytes.Compare(m, source[:len(m)]) == 0 { - return compression - } - } - return Uncompressed -} - -func xzDecompress(archive io.Reader) (io.ReadCloser, <-chan struct{}, error) { - args := []string{"xz", "-d", "-c", "-q"} - - return cmdStream(exec.Command(args[0], args[1:]...), archive) -} - -// DecompressStream decompresses the archive and returns a ReaderCloser with the decompressed archive. -func DecompressStream(archive io.Reader) (io.ReadCloser, error) { - p := pools.BufioReader32KPool - buf := p.Get(archive) - bs, err := buf.Peek(10) - if err != nil && err != io.EOF { - // Note: we'll ignore any io.EOF error because there are some odd - // cases where the layer.tar file will be empty (zero bytes) and - // that results in an io.EOF from the Peek() call. So, in those - // cases we'll just treat it as a non-compressed stream and - // that means just create an empty layer. - // See Issue 18170 - return nil, err - } - - compression := DetectCompression(bs) - switch compression { - case Uncompressed: - readBufWrapper := p.NewReadCloserWrapper(buf, buf) - return readBufWrapper, nil - case Gzip: - gzReader, err := gzip.NewReader(buf) - if err != nil { - return nil, err - } - readBufWrapper := p.NewReadCloserWrapper(buf, gzReader) - return readBufWrapper, nil - case Bzip2: - bz2Reader := bzip2.NewReader(buf) - readBufWrapper := p.NewReadCloserWrapper(buf, bz2Reader) - return readBufWrapper, nil - case Xz: - xzReader, chdone, err := xzDecompress(buf) - if err != nil { - return nil, err - } - readBufWrapper := p.NewReadCloserWrapper(buf, xzReader) - return ioutils.NewReadCloserWrapper(readBufWrapper, func() error { - <-chdone - return readBufWrapper.Close() - }), nil - default: - return nil, fmt.Errorf("Unsupported compression format %s", (&compression).Extension()) - } -} - -// CompressStream compresseses the dest with specified compression algorithm. -func CompressStream(dest io.Writer, compression Compression) (io.WriteCloser, error) { - p := pools.BufioWriter32KPool - buf := p.Get(dest) - switch compression { - case Uncompressed: - writeBufWrapper := p.NewWriteCloserWrapper(buf, buf) - return writeBufWrapper, nil - case Gzip: - gzWriter := gzip.NewWriter(dest) - writeBufWrapper := p.NewWriteCloserWrapper(buf, gzWriter) - return writeBufWrapper, nil - case Bzip2, Xz: - // archive/bzip2 does not support writing, and there is no xz support at all - // However, this is not a problem as docker only currently generates gzipped tars - return nil, fmt.Errorf("Unsupported compression format %s", (&compression).Extension()) - default: - return nil, fmt.Errorf("Unsupported compression format %s", (&compression).Extension()) - } -} - -// Extension returns the extension of a file that uses the specified compression algorithm. -func (compression *Compression) Extension() string { - switch *compression { - case Uncompressed: - return "tar" - case Bzip2: - return "tar.bz2" - case Gzip: - return "tar.gz" - case Xz: - return "tar.xz" - } - return "" -} - -type tarWhiteoutConverter interface { - ConvertWrite(*tar.Header, string, os.FileInfo) (*tar.Header, error) - ConvertRead(*tar.Header, string) (bool, error) -} - -type tarAppender struct { - TarWriter *tar.Writer - Buffer *bufio.Writer - - // for hardlink mapping - SeenFiles map[uint64]string - UIDMaps []idtools.IDMap - GIDMaps []idtools.IDMap - - // For packing and unpacking whiteout files in the - // non standard format. The whiteout files defined - // by the AUFS standard are used as the tar whiteout - // standard. - WhiteoutConverter tarWhiteoutConverter -} - -// canonicalTarName provides a platform-independent and consistent posix-style -//path for files and directories to be archived regardless of the platform. -func canonicalTarName(name string, isDir bool) (string, error) { - name, err := CanonicalTarNameForPath(name) - if err != nil { - return "", err - } - - // suffix with '/' for directories - if isDir && !strings.HasSuffix(name, "/") { - name += "/" - } - return name, nil -} - -// addTarFile adds to the tar archive a file from `path` as `name` -func (ta *tarAppender) addTarFile(path, name string) error { - fi, err := os.Lstat(path) - if err != nil { - return err - } - - link := "" - if fi.Mode()&os.ModeSymlink != 0 { - if link, err = os.Readlink(path); err != nil { - return err - } - } - - hdr, err := tar.FileInfoHeader(fi, link) - if err != nil { - return err - } - hdr.Mode = int64(chmodTarEntry(os.FileMode(hdr.Mode))) - - name, err = canonicalTarName(name, fi.IsDir()) - if err != nil { - return fmt.Errorf("tar: cannot canonicalize path: %v", err) - } - hdr.Name = name - - inode, err := setHeaderForSpecialDevice(hdr, ta, name, fi.Sys()) - if err != nil { - return err - } - - // if it's not a directory and has more than 1 link, - // it's hard linked, so set the type flag accordingly - if !fi.IsDir() && hasHardlinks(fi) { - // a link should have a name that it links too - // and that linked name should be first in the tar archive - if oldpath, ok := ta.SeenFiles[inode]; ok { - hdr.Typeflag = tar.TypeLink - hdr.Linkname = oldpath - hdr.Size = 0 // This Must be here for the writer math to add up! - } else { - ta.SeenFiles[inode] = name - } - } - - capability, _ := system.Lgetxattr(path, "security.capability") - if capability != nil { - hdr.Xattrs = make(map[string]string) - hdr.Xattrs["security.capability"] = string(capability) - } - - //handle re-mapping container ID mappings back to host ID mappings before - //writing tar headers/files. We skip whiteout files because they were written - //by the kernel and already have proper ownership relative to the host - if !strings.HasPrefix(filepath.Base(hdr.Name), WhiteoutPrefix) && (ta.UIDMaps != nil || ta.GIDMaps != nil) { - uid, gid, err := getFileUIDGID(fi.Sys()) - if err != nil { - return err - } - xUID, err := idtools.ToContainer(uid, ta.UIDMaps) - if err != nil { - return err - } - xGID, err := idtools.ToContainer(gid, ta.GIDMaps) - if err != nil { - return err - } - hdr.Uid = xUID - hdr.Gid = xGID - } - - if ta.WhiteoutConverter != nil { - wo, err := ta.WhiteoutConverter.ConvertWrite(hdr, path, fi) - if err != nil { - return err - } - - // If a new whiteout file exists, write original hdr, then - // replace hdr with wo to be written after. Whiteouts should - // always be written after the original. Note the original - // hdr may have been updated to be a whiteout with returning - // a whiteout header - if wo != nil { - if err := ta.TarWriter.WriteHeader(hdr); err != nil { - return err - } - if hdr.Typeflag == tar.TypeReg && hdr.Size > 0 { - return fmt.Errorf("tar: cannot use whiteout for non-empty file") - } - hdr = wo - } - } - - if err := ta.TarWriter.WriteHeader(hdr); err != nil { - return err - } - - if hdr.Typeflag == tar.TypeReg && hdr.Size > 0 { - // We use system.OpenSequential to ensure we use sequential file - // access on Windows to avoid depleting the standby list. - // On Linux, this equates to a regular os.Open. - file, err := system.OpenSequential(path) - if err != nil { - return err - } - - ta.Buffer.Reset(ta.TarWriter) - defer ta.Buffer.Reset(nil) - _, err = io.Copy(ta.Buffer, file) - file.Close() - if err != nil { - return err - } - err = ta.Buffer.Flush() - if err != nil { - return err - } - } - - return nil -} - -func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, Lchown bool, chownOpts *TarChownOptions, inUserns bool) error { - // hdr.Mode is in linux format, which we can use for sycalls, - // but for os.Foo() calls we need the mode converted to os.FileMode, - // so use hdrInfo.Mode() (they differ for e.g. setuid bits) - hdrInfo := hdr.FileInfo() - - switch hdr.Typeflag { - case tar.TypeDir: - // Create directory unless it exists as a directory already. - // In that case we just want to merge the two - if fi, err := os.Lstat(path); !(err == nil && fi.IsDir()) { - if err := os.Mkdir(path, hdrInfo.Mode()); err != nil { - return err - } - } - - case tar.TypeReg, tar.TypeRegA: - // Source is regular file. We use system.OpenFileSequential to use sequential - // file access to avoid depleting the standby list on Windows. - // On Linux, this equates to a regular os.OpenFile - file, err := system.OpenFileSequential(path, os.O_CREATE|os.O_WRONLY, hdrInfo.Mode()) - if err != nil { - return err - } - if _, err := io.Copy(file, reader); err != nil { - file.Close() - return err - } - file.Close() - - case tar.TypeBlock, tar.TypeChar: - if inUserns { // cannot create devices in a userns - return nil - } - // Handle this is an OS-specific way - if err := handleTarTypeBlockCharFifo(hdr, path); err != nil { - return err - } - - case tar.TypeFifo: - // Handle this is an OS-specific way - if err := handleTarTypeBlockCharFifo(hdr, path); err != nil { - return err - } - - case tar.TypeLink: - targetPath := filepath.Join(extractDir, hdr.Linkname) - // check for hardlink breakout - if !strings.HasPrefix(targetPath, extractDir) { - return breakoutError(fmt.Errorf("invalid hardlink %q -> %q", targetPath, hdr.Linkname)) - } - if err := os.Link(targetPath, path); err != nil { - return err - } - - case tar.TypeSymlink: - // path -> hdr.Linkname = targetPath - // e.g. /extractDir/path/to/symlink -> ../2/file = /extractDir/path/2/file - targetPath := filepath.Join(filepath.Dir(path), hdr.Linkname) - - // the reason we don't need to check symlinks in the path (with FollowSymlinkInScope) is because - // that symlink would first have to be created, which would be caught earlier, at this very check: - if !strings.HasPrefix(targetPath, extractDir) { - return breakoutError(fmt.Errorf("invalid symlink %q -> %q", path, hdr.Linkname)) - } - if err := os.Symlink(hdr.Linkname, path); err != nil { - return err - } - - case tar.TypeXGlobalHeader: - logrus.Debug("PAX Global Extended Headers found and ignored") - return nil - - default: - return fmt.Errorf("Unhandled tar header type %d\n", hdr.Typeflag) - } - - // Lchown is not supported on Windows. - if Lchown && runtime.GOOS != "windows" { - if chownOpts == nil { - chownOpts = &TarChownOptions{UID: hdr.Uid, GID: hdr.Gid} - } - if err := os.Lchown(path, chownOpts.UID, chownOpts.GID); err != nil { - return err - } - } - - var errors []string - for key, value := range hdr.Xattrs { - if err := system.Lsetxattr(path, key, []byte(value), 0); err != nil { - if err == syscall.ENOTSUP { - // We ignore errors here because not all graphdrivers support - // xattrs *cough* old versions of AUFS *cough*. However only - // ENOTSUP should be emitted in that case, otherwise we still - // bail. - errors = append(errors, err.Error()) - continue - } - return err - } - - } - - if len(errors) > 0 { - logrus.WithFields(logrus.Fields{ - "errors": errors, - }).Warn("ignored xattrs in archive: underlying filesystem doesn't support them") - } - - // There is no LChmod, so ignore mode for symlink. Also, this - // must happen after chown, as that can modify the file mode - if err := handleLChmod(hdr, path, hdrInfo); err != nil { - return err - } - - aTime := hdr.AccessTime - if aTime.Before(hdr.ModTime) { - // Last access time should never be before last modified time. - aTime = hdr.ModTime - } - - // system.Chtimes doesn't support a NOFOLLOW flag atm - if hdr.Typeflag == tar.TypeLink { - if fi, err := os.Lstat(hdr.Linkname); err == nil && (fi.Mode()&os.ModeSymlink == 0) { - if err := system.Chtimes(path, aTime, hdr.ModTime); err != nil { - return err - } - } - } else if hdr.Typeflag != tar.TypeSymlink { - if err := system.Chtimes(path, aTime, hdr.ModTime); err != nil { - return err - } - } else { - ts := []syscall.Timespec{timeToTimespec(aTime), timeToTimespec(hdr.ModTime)} - if err := system.LUtimesNano(path, ts); err != nil && err != system.ErrNotSupportedPlatform { - return err - } - } - return nil -} - -// Tar creates an archive from the directory at `path`, and returns it as a -// stream of bytes. -func Tar(path string, compression Compression) (io.ReadCloser, error) { - return TarWithOptions(path, &TarOptions{Compression: compression}) -} - -// TarWithOptions creates an archive from the directory at `path`, only including files whose relative -// paths are included in `options.IncludeFiles` (if non-nil) or not in `options.ExcludePatterns`. -func TarWithOptions(srcPath string, options *TarOptions) (io.ReadCloser, error) { - - // Fix the source path to work with long path names. This is a no-op - // on platforms other than Windows. - srcPath = fixVolumePathPrefix(srcPath) - - patterns, patDirs, exceptions, err := fileutils.CleanPatterns(options.ExcludePatterns) - - if err != nil { - return nil, err - } - - pipeReader, pipeWriter := io.Pipe() - - compressWriter, err := CompressStream(pipeWriter, options.Compression) - if err != nil { - return nil, err - } - - go func() { - ta := &tarAppender{ - TarWriter: tar.NewWriter(compressWriter), - Buffer: pools.BufioWriter32KPool.Get(nil), - SeenFiles: make(map[uint64]string), - UIDMaps: options.UIDMaps, - GIDMaps: options.GIDMaps, - WhiteoutConverter: getWhiteoutConverter(options.WhiteoutFormat), - } - - defer func() { - // Make sure to check the error on Close. - if err := ta.TarWriter.Close(); err != nil { - logrus.Errorf("Can't close tar writer: %s", err) - } - if err := compressWriter.Close(); err != nil { - logrus.Errorf("Can't close compress writer: %s", err) - } - if err := pipeWriter.Close(); err != nil { - logrus.Errorf("Can't close pipe writer: %s", err) - } - }() - - // this buffer is needed for the duration of this piped stream - defer pools.BufioWriter32KPool.Put(ta.Buffer) - - // In general we log errors here but ignore them because - // during e.g. a diff operation the container can continue - // mutating the filesystem and we can see transient errors - // from this - - stat, err := os.Lstat(srcPath) - if err != nil { - return - } - - if !stat.IsDir() { - // We can't later join a non-dir with any includes because the - // 'walk' will error if "file/." is stat-ed and "file" is not a - // directory. So, we must split the source path and use the - // basename as the include. - if len(options.IncludeFiles) > 0 { - logrus.Warn("Tar: Can't archive a file with includes") - } - - dir, base := SplitPathDirEntry(srcPath) - srcPath = dir - options.IncludeFiles = []string{base} - } - - if len(options.IncludeFiles) == 0 { - options.IncludeFiles = []string{"."} - } - - seen := make(map[string]bool) - - for _, include := range options.IncludeFiles { - rebaseName := options.RebaseNames[include] - - walkRoot := getWalkRoot(srcPath, include) - filepath.Walk(walkRoot, func(filePath string, f os.FileInfo, err error) error { - if err != nil { - logrus.Errorf("Tar: Can't stat file %s to tar: %s", srcPath, err) - return nil - } - - relFilePath, err := filepath.Rel(srcPath, filePath) - if err != nil || (!options.IncludeSourceDir && relFilePath == "." && f.IsDir()) { - // Error getting relative path OR we are looking - // at the source directory path. Skip in both situations. - return nil - } - - if options.IncludeSourceDir && include == "." && relFilePath != "." { - relFilePath = strings.Join([]string{".", relFilePath}, string(filepath.Separator)) - } - - skip := false - - // If "include" is an exact match for the current file - // then even if there's an "excludePatterns" pattern that - // matches it, don't skip it. IOW, assume an explicit 'include' - // is asking for that file no matter what - which is true - // for some files, like .dockerignore and Dockerfile (sometimes) - if include != relFilePath { - skip, err = fileutils.OptimizedMatches(relFilePath, patterns, patDirs) - if err != nil { - logrus.Errorf("Error matching %s: %v", relFilePath, err) - return err - } - } - - if skip { - // If we want to skip this file and its a directory - // then we should first check to see if there's an - // excludes pattern (eg !dir/file) that starts with this - // dir. If so then we can't skip this dir. - - // Its not a dir then so we can just return/skip. - if !f.IsDir() { - return nil - } - - // No exceptions (!...) in patterns so just skip dir - if !exceptions { - return filepath.SkipDir - } - - dirSlash := relFilePath + string(filepath.Separator) - - for _, pat := range patterns { - if pat[0] != '!' { - continue - } - pat = pat[1:] + string(filepath.Separator) - if strings.HasPrefix(pat, dirSlash) { - // found a match - so can't skip this dir - return nil - } - } - - // No matching exclusion dir so just skip dir - return filepath.SkipDir - } - - if seen[relFilePath] { - return nil - } - seen[relFilePath] = true - - // Rename the base resource. - if rebaseName != "" { - var replacement string - if rebaseName != string(filepath.Separator) { - // Special case the root directory to replace with an - // empty string instead so that we don't end up with - // double slashes in the paths. - replacement = rebaseName - } - - relFilePath = strings.Replace(relFilePath, include, replacement, 1) - } - - if err := ta.addTarFile(filePath, relFilePath); err != nil { - logrus.Errorf("Can't add file %s to tar: %s", filePath, err) - // if pipe is broken, stop writing tar stream to it - if err == io.ErrClosedPipe { - return err - } - } - return nil - }) - } - }() - - return pipeReader, nil -} - -// Unpack unpacks the decompressedArchive to dest with options. -func Unpack(decompressedArchive io.Reader, dest string, options *TarOptions) error { - tr := tar.NewReader(decompressedArchive) - trBuf := pools.BufioReader32KPool.Get(nil) - defer pools.BufioReader32KPool.Put(trBuf) - - var dirs []*tar.Header - remappedRootUID, remappedRootGID, err := idtools.GetRootUIDGID(options.UIDMaps, options.GIDMaps) - if err != nil { - return err - } - whiteoutConverter := getWhiteoutConverter(options.WhiteoutFormat) - - // Iterate through the files in the archive. -loop: - for { - hdr, err := tr.Next() - if err == io.EOF { - // end of tar archive - break - } - if err != nil { - return err - } - - // Normalize name, for safety and for a simple is-root check - // This keeps "../" as-is, but normalizes "/../" to "/". Or Windows: - // This keeps "..\" as-is, but normalizes "\..\" to "\". - hdr.Name = filepath.Clean(hdr.Name) - - for _, exclude := range options.ExcludePatterns { - if strings.HasPrefix(hdr.Name, exclude) { - continue loop - } - } - - // After calling filepath.Clean(hdr.Name) above, hdr.Name will now be in - // the filepath format for the OS on which the daemon is running. Hence - // the check for a slash-suffix MUST be done in an OS-agnostic way. - if !strings.HasSuffix(hdr.Name, string(os.PathSeparator)) { - // Not the root directory, ensure that the parent directory exists - parent := filepath.Dir(hdr.Name) - parentPath := filepath.Join(dest, parent) - if _, err := os.Lstat(parentPath); err != nil && os.IsNotExist(err) { - err = idtools.MkdirAllNewAs(parentPath, 0777, remappedRootUID, remappedRootGID) - if err != nil { - return err - } - } - } - - path := filepath.Join(dest, hdr.Name) - rel, err := filepath.Rel(dest, path) - if err != nil { - return err - } - if strings.HasPrefix(rel, ".."+string(os.PathSeparator)) { - return breakoutError(fmt.Errorf("%q is outside of %q", hdr.Name, dest)) - } - - // If path exits we almost always just want to remove and replace it - // The only exception is when it is a directory *and* the file from - // the layer is also a directory. Then we want to merge them (i.e. - // just apply the metadata from the layer). - if fi, err := os.Lstat(path); err == nil { - if options.NoOverwriteDirNonDir && fi.IsDir() && hdr.Typeflag != tar.TypeDir { - // If NoOverwriteDirNonDir is true then we cannot replace - // an existing directory with a non-directory from the archive. - return fmt.Errorf("cannot overwrite directory %q with non-directory %q", path, dest) - } - - if options.NoOverwriteDirNonDir && !fi.IsDir() && hdr.Typeflag == tar.TypeDir { - // If NoOverwriteDirNonDir is true then we cannot replace - // an existing non-directory with a directory from the archive. - return fmt.Errorf("cannot overwrite non-directory %q with directory %q", path, dest) - } - - if fi.IsDir() && hdr.Name == "." { - continue - } - - if !(fi.IsDir() && hdr.Typeflag == tar.TypeDir) { - if err := os.RemoveAll(path); err != nil { - return err - } - } - } - trBuf.Reset(tr) - - // if the options contain a uid & gid maps, convert header uid/gid - // entries using the maps such that lchown sets the proper mapped - // uid/gid after writing the file. We only perform this mapping if - // the file isn't already owned by the remapped root UID or GID, as - // that specific uid/gid has no mapping from container -> host, and - // those files already have the proper ownership for inside the - // container. - if hdr.Uid != remappedRootUID { - xUID, err := idtools.ToHost(hdr.Uid, options.UIDMaps) - if err != nil { - return err - } - hdr.Uid = xUID - } - if hdr.Gid != remappedRootGID { - xGID, err := idtools.ToHost(hdr.Gid, options.GIDMaps) - if err != nil { - return err - } - hdr.Gid = xGID - } - - if whiteoutConverter != nil { - writeFile, err := whiteoutConverter.ConvertRead(hdr, path) - if err != nil { - return err - } - if !writeFile { - continue - } - } - - if err := createTarFile(path, dest, hdr, trBuf, !options.NoLchown, options.ChownOpts, options.InUserNS); err != nil { - return err - } - - // Directory mtimes must be handled at the end to avoid further - // file creation in them to modify the directory mtime - if hdr.Typeflag == tar.TypeDir { - dirs = append(dirs, hdr) - } - } - - for _, hdr := range dirs { - path := filepath.Join(dest, hdr.Name) - - if err := system.Chtimes(path, hdr.AccessTime, hdr.ModTime); err != nil { - return err - } - } - return nil -} - -// Untar reads a stream of bytes from `archive`, parses it as a tar archive, -// and unpacks it into the directory at `dest`. -// The archive may be compressed with one of the following algorithms: -// identity (uncompressed), gzip, bzip2, xz. -// FIXME: specify behavior when target path exists vs. doesn't exist. -func Untar(tarArchive io.Reader, dest string, options *TarOptions) error { - return untarHandler(tarArchive, dest, options, true) -} - -// UntarUncompressed reads a stream of bytes from `archive`, parses it as a tar archive, -// and unpacks it into the directory at `dest`. -// The archive must be an uncompressed stream. -func UntarUncompressed(tarArchive io.Reader, dest string, options *TarOptions) error { - return untarHandler(tarArchive, dest, options, false) -} - -// Handler for teasing out the automatic decompression -func untarHandler(tarArchive io.Reader, dest string, options *TarOptions, decompress bool) error { - if tarArchive == nil { - return fmt.Errorf("Empty archive") - } - dest = filepath.Clean(dest) - if options == nil { - options = &TarOptions{} - } - if options.ExcludePatterns == nil { - options.ExcludePatterns = []string{} - } - - r := tarArchive - if decompress { - decompressedArchive, err := DecompressStream(tarArchive) - if err != nil { - return err - } - defer decompressedArchive.Close() - r = decompressedArchive - } - - return Unpack(r, dest, options) -} - -// TarUntar is a convenience function which calls Tar and Untar, with the output of one piped into the other. -// If either Tar or Untar fails, TarUntar aborts and returns the error. -func (archiver *Archiver) TarUntar(src, dst string) error { - logrus.Debugf("TarUntar(%s %s)", src, dst) - archive, err := TarWithOptions(src, &TarOptions{Compression: Uncompressed}) - if err != nil { - return err - } - defer archive.Close() - - var options *TarOptions - if archiver.UIDMaps != nil || archiver.GIDMaps != nil { - options = &TarOptions{ - UIDMaps: archiver.UIDMaps, - GIDMaps: archiver.GIDMaps, - } - } - return archiver.Untar(archive, dst, options) -} - -// TarUntar is a convenience function which calls Tar and Untar, with the output of one piped into the other. -// If either Tar or Untar fails, TarUntar aborts and returns the error. -func TarUntar(src, dst string) error { - return defaultArchiver.TarUntar(src, dst) -} - -// UntarPath untar a file from path to a destination, src is the source tar file path. -func (archiver *Archiver) UntarPath(src, dst string) error { - archive, err := os.Open(src) - if err != nil { - return err - } - defer archive.Close() - var options *TarOptions - if archiver.UIDMaps != nil || archiver.GIDMaps != nil { - options = &TarOptions{ - UIDMaps: archiver.UIDMaps, - GIDMaps: archiver.GIDMaps, - } - } - return archiver.Untar(archive, dst, options) -} - -// UntarPath is a convenience function which looks for an archive -// at filesystem path `src`, and unpacks it at `dst`. -func UntarPath(src, dst string) error { - return defaultArchiver.UntarPath(src, dst) -} - -// CopyWithTar creates a tar archive of filesystem path `src`, and -// unpacks it at filesystem path `dst`. -// The archive is streamed directly with fixed buffering and no -// intermediary disk IO. -func (archiver *Archiver) CopyWithTar(src, dst string) error { - srcSt, err := os.Stat(src) - if err != nil { - return err - } - if !srcSt.IsDir() { - return archiver.CopyFileWithTar(src, dst) - } - - // if this archiver is set up with ID mapping we need to create - // the new destination directory with the remapped root UID/GID pair - // as owner - rootUID, rootGID, err := idtools.GetRootUIDGID(archiver.UIDMaps, archiver.GIDMaps) - if err != nil { - return err - } - // Create dst, copy src's content into it - logrus.Debugf("Creating dest directory: %s", dst) - if err := idtools.MkdirAllNewAs(dst, 0755, rootUID, rootGID); err != nil { - return err - } - logrus.Debugf("Calling TarUntar(%s, %s)", src, dst) - return archiver.TarUntar(src, dst) -} - -// CopyWithTar creates a tar archive of filesystem path `src`, and -// unpacks it at filesystem path `dst`. -// The archive is streamed directly with fixed buffering and no -// intermediary disk IO. -func CopyWithTar(src, dst string) error { - return defaultArchiver.CopyWithTar(src, dst) -} - -// CopyFileWithTar emulates the behavior of the 'cp' command-line -// for a single file. It copies a regular file from path `src` to -// path `dst`, and preserves all its metadata. -func (archiver *Archiver) CopyFileWithTar(src, dst string) (err error) { - logrus.Debugf("CopyFileWithTar(%s, %s)", src, dst) - srcSt, err := os.Stat(src) - if err != nil { - return err - } - - if srcSt.IsDir() { - return fmt.Errorf("Can't copy a directory") - } - - // Clean up the trailing slash. This must be done in an operating - // system specific manner. - if dst[len(dst)-1] == os.PathSeparator { - dst = filepath.Join(dst, filepath.Base(src)) - } - // Create the holding directory if necessary - if err := system.MkdirAll(filepath.Dir(dst), 0700); err != nil { - return err - } - - r, w := io.Pipe() - errC := promise.Go(func() error { - defer w.Close() - - srcF, err := os.Open(src) - if err != nil { - return err - } - defer srcF.Close() - - hdr, err := tar.FileInfoHeader(srcSt, "") - if err != nil { - return err - } - hdr.Name = filepath.Base(dst) - hdr.Mode = int64(chmodTarEntry(os.FileMode(hdr.Mode))) - - remappedRootUID, remappedRootGID, err := idtools.GetRootUIDGID(archiver.UIDMaps, archiver.GIDMaps) - if err != nil { - return err - } - - // only perform mapping if the file being copied isn't already owned by the - // uid or gid of the remapped root in the container - if remappedRootUID != hdr.Uid { - xUID, err := idtools.ToHost(hdr.Uid, archiver.UIDMaps) - if err != nil { - return err - } - hdr.Uid = xUID - } - if remappedRootGID != hdr.Gid { - xGID, err := idtools.ToHost(hdr.Gid, archiver.GIDMaps) - if err != nil { - return err - } - hdr.Gid = xGID - } - - tw := tar.NewWriter(w) - defer tw.Close() - if err := tw.WriteHeader(hdr); err != nil { - return err - } - if _, err := io.Copy(tw, srcF); err != nil { - return err - } - return nil - }) - defer func() { - if er := <-errC; err == nil && er != nil { - err = er - } - }() - - err = archiver.Untar(r, filepath.Dir(dst), nil) - if err != nil { - r.CloseWithError(err) - } - return err -} - -// CopyFileWithTar emulates the behavior of the 'cp' command-line -// for a single file. It copies a regular file from path `src` to -// path `dst`, and preserves all its metadata. -// -// Destination handling is in an operating specific manner depending -// where the daemon is running. If `dst` ends with a trailing slash -// the final destination path will be `dst/base(src)` (Linux) or -// `dst\base(src)` (Windows). -func CopyFileWithTar(src, dst string) (err error) { - return defaultArchiver.CopyFileWithTar(src, dst) -} - -// cmdStream executes a command, and returns its stdout as a stream. -// If the command fails to run or doesn't complete successfully, an error -// will be returned, including anything written on stderr. -func cmdStream(cmd *exec.Cmd, input io.Reader) (io.ReadCloser, <-chan struct{}, error) { - chdone := make(chan struct{}) - cmd.Stdin = input - pipeR, pipeW := io.Pipe() - cmd.Stdout = pipeW - var errBuf bytes.Buffer - cmd.Stderr = &errBuf - - // Run the command and return the pipe - if err := cmd.Start(); err != nil { - return nil, nil, err - } - - // Copy stdout to the returned pipe - go func() { - if err := cmd.Wait(); err != nil { - pipeW.CloseWithError(fmt.Errorf("%s: %s", err, errBuf.String())) - } else { - pipeW.Close() - } - close(chdone) - }() - - return pipeR, chdone, nil -} - -// NewTempArchive reads the content of src into a temporary file, and returns the contents -// of that file as an archive. The archive can only be read once - as soon as reading completes, -// the file will be deleted. -func NewTempArchive(src io.Reader, dir string) (*TempArchive, error) { - f, err := ioutil.TempFile(dir, "") - if err != nil { - return nil, err - } - if _, err := io.Copy(f, src); err != nil { - return nil, err - } - if _, err := f.Seek(0, 0); err != nil { - return nil, err - } - st, err := f.Stat() - if err != nil { - return nil, err - } - size := st.Size() - return &TempArchive{File: f, Size: size}, nil -} - -// TempArchive is a temporary archive. The archive can only be read once - as soon as reading completes, -// the file will be deleted. -type TempArchive struct { - *os.File - Size int64 // Pre-computed from Stat().Size() as a convenience - read int64 - closed bool -} - -// Close closes the underlying file if it's still open, or does a no-op -// to allow callers to try to close the TempArchive multiple times safely. -func (archive *TempArchive) Close() error { - if archive.closed { - return nil - } - - archive.closed = true - - return archive.File.Close() -} - -func (archive *TempArchive) Read(data []byte) (int, error) { - n, err := archive.File.Read(data) - archive.read += int64(n) - if err != nil || archive.read == archive.Size { - archive.Close() - os.Remove(archive.File.Name()) - } - return n, err -} diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_linux.go b/vendor/github.com/docker/docker/pkg/archive/archive_linux.go deleted file mode 100644 index 6b2a31ff1..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/archive_linux.go +++ /dev/null @@ -1,95 +0,0 @@ -package archive - -import ( - "archive/tar" - "os" - "path/filepath" - "strings" - "syscall" - - "github.com/docker/docker/pkg/system" -) - -func getWhiteoutConverter(format WhiteoutFormat) tarWhiteoutConverter { - if format == OverlayWhiteoutFormat { - return overlayWhiteoutConverter{} - } - return nil -} - -type overlayWhiteoutConverter struct{} - -func (overlayWhiteoutConverter) ConvertWrite(hdr *tar.Header, path string, fi os.FileInfo) (wo *tar.Header, err error) { - // convert whiteouts to AUFS format - if fi.Mode()&os.ModeCharDevice != 0 && hdr.Devmajor == 0 && hdr.Devminor == 0 { - // we just rename the file and make it normal - dir, filename := filepath.Split(hdr.Name) - hdr.Name = filepath.Join(dir, WhiteoutPrefix+filename) - hdr.Mode = 0600 - hdr.Typeflag = tar.TypeReg - hdr.Size = 0 - } - - if fi.Mode()&os.ModeDir != 0 { - // convert opaque dirs to AUFS format by writing an empty file with the prefix - opaque, err := system.Lgetxattr(path, "trusted.overlay.opaque") - if err != nil { - return nil, err - } - if len(opaque) == 1 && opaque[0] == 'y' { - if hdr.Xattrs != nil { - delete(hdr.Xattrs, "trusted.overlay.opaque") - } - - // create a header for the whiteout file - // it should inherit some properties from the parent, but be a regular file - wo = &tar.Header{ - Typeflag: tar.TypeReg, - Mode: hdr.Mode & int64(os.ModePerm), - Name: filepath.Join(hdr.Name, WhiteoutOpaqueDir), - Size: 0, - Uid: hdr.Uid, - Uname: hdr.Uname, - Gid: hdr.Gid, - Gname: hdr.Gname, - AccessTime: hdr.AccessTime, - ChangeTime: hdr.ChangeTime, - } - } - } - - return -} - -func (overlayWhiteoutConverter) ConvertRead(hdr *tar.Header, path string) (bool, error) { - base := filepath.Base(path) - dir := filepath.Dir(path) - - // if a directory is marked as opaque by the AUFS special file, we need to translate that to overlay - if base == WhiteoutOpaqueDir { - if err := syscall.Setxattr(dir, "trusted.overlay.opaque", []byte{'y'}, 0); err != nil { - return false, err - } - - // don't write the file itself - return false, nil - } - - // if a file was deleted and we are using overlay, we need to create a character device - if strings.HasPrefix(base, WhiteoutPrefix) { - originalBase := base[len(WhiteoutPrefix):] - originalPath := filepath.Join(dir, originalBase) - - if err := syscall.Mknod(originalPath, syscall.S_IFCHR, 0); err != nil { - return false, err - } - if err := os.Chown(originalPath, hdr.Uid, hdr.Gid); err != nil { - return false, err - } - - // don't write the file itself - return false, nil - } - - return true, nil -} diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_linux_test.go b/vendor/github.com/docker/docker/pkg/archive/archive_linux_test.go deleted file mode 100644 index d5f046e9d..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/archive_linux_test.go +++ /dev/null @@ -1,187 +0,0 @@ -package archive - -import ( - "io/ioutil" - "os" - "path/filepath" - "syscall" - "testing" - - "github.com/docker/docker/pkg/system" -) - -// setupOverlayTestDir creates files in a directory with overlay whiteouts -// Tree layout -// . -// ├── d1 # opaque, 0700 -// │   └── f1 # empty file, 0600 -// ├── d2 # opaque, 0750 -// │   └── f1 # empty file, 0660 -// └── d3 # 0700 -// └── f1 # whiteout, 0644 -func setupOverlayTestDir(t *testing.T, src string) { - // Create opaque directory containing single file and permission 0700 - if err := os.Mkdir(filepath.Join(src, "d1"), 0700); err != nil { - t.Fatal(err) - } - - if err := system.Lsetxattr(filepath.Join(src, "d1"), "trusted.overlay.opaque", []byte("y"), 0); err != nil { - t.Fatal(err) - } - - if err := ioutil.WriteFile(filepath.Join(src, "d1", "f1"), []byte{}, 0600); err != nil { - t.Fatal(err) - } - - // Create another opaque directory containing single file but with permission 0750 - if err := os.Mkdir(filepath.Join(src, "d2"), 0750); err != nil { - t.Fatal(err) - } - - if err := system.Lsetxattr(filepath.Join(src, "d2"), "trusted.overlay.opaque", []byte("y"), 0); err != nil { - t.Fatal(err) - } - - if err := ioutil.WriteFile(filepath.Join(src, "d2", "f1"), []byte{}, 0660); err != nil { - t.Fatal(err) - } - - // Create regular directory with deleted file - if err := os.Mkdir(filepath.Join(src, "d3"), 0700); err != nil { - t.Fatal(err) - } - - if err := system.Mknod(filepath.Join(src, "d3", "f1"), syscall.S_IFCHR, 0); err != nil { - t.Fatal(err) - } -} - -func checkOpaqueness(t *testing.T, path string, opaque string) { - xattrOpaque, err := system.Lgetxattr(path, "trusted.overlay.opaque") - if err != nil { - t.Fatal(err) - } - if string(xattrOpaque) != opaque { - t.Fatalf("Unexpected opaque value: %q, expected %q", string(xattrOpaque), opaque) - } - -} - -func checkOverlayWhiteout(t *testing.T, path string) { - stat, err := os.Stat(path) - if err != nil { - t.Fatal(err) - } - statT, ok := stat.Sys().(*syscall.Stat_t) - if !ok { - t.Fatalf("Unexpected type: %t, expected *syscall.Stat_t", stat.Sys()) - } - if statT.Rdev != 0 { - t.Fatalf("Non-zero device number for whiteout") - } -} - -func checkFileMode(t *testing.T, path string, perm os.FileMode) { - stat, err := os.Stat(path) - if err != nil { - t.Fatal(err) - } - if stat.Mode() != perm { - t.Fatalf("Unexpected file mode for %s: %o, expected %o", path, stat.Mode(), perm) - } -} - -func TestOverlayTarUntar(t *testing.T) { - oldmask, err := system.Umask(0) - if err != nil { - t.Fatal(err) - } - defer system.Umask(oldmask) - - src, err := ioutil.TempDir("", "docker-test-overlay-tar-src") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(src) - - setupOverlayTestDir(t, src) - - dst, err := ioutil.TempDir("", "docker-test-overlay-tar-dst") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dst) - - options := &TarOptions{ - Compression: Uncompressed, - WhiteoutFormat: OverlayWhiteoutFormat, - } - archive, err := TarWithOptions(src, options) - if err != nil { - t.Fatal(err) - } - defer archive.Close() - - if err := Untar(archive, dst, options); err != nil { - t.Fatal(err) - } - - checkFileMode(t, filepath.Join(dst, "d1"), 0700|os.ModeDir) - checkFileMode(t, filepath.Join(dst, "d2"), 0750|os.ModeDir) - checkFileMode(t, filepath.Join(dst, "d3"), 0700|os.ModeDir) - checkFileMode(t, filepath.Join(dst, "d1", "f1"), 0600) - checkFileMode(t, filepath.Join(dst, "d2", "f1"), 0660) - checkFileMode(t, filepath.Join(dst, "d3", "f1"), os.ModeCharDevice|os.ModeDevice) - - checkOpaqueness(t, filepath.Join(dst, "d1"), "y") - checkOpaqueness(t, filepath.Join(dst, "d2"), "y") - checkOpaqueness(t, filepath.Join(dst, "d3"), "") - checkOverlayWhiteout(t, filepath.Join(dst, "d3", "f1")) -} - -func TestOverlayTarAUFSUntar(t *testing.T) { - oldmask, err := system.Umask(0) - if err != nil { - t.Fatal(err) - } - defer system.Umask(oldmask) - - src, err := ioutil.TempDir("", "docker-test-overlay-tar-src") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(src) - - setupOverlayTestDir(t, src) - - dst, err := ioutil.TempDir("", "docker-test-overlay-tar-dst") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dst) - - archive, err := TarWithOptions(src, &TarOptions{ - Compression: Uncompressed, - WhiteoutFormat: OverlayWhiteoutFormat, - }) - if err != nil { - t.Fatal(err) - } - defer archive.Close() - - if err := Untar(archive, dst, &TarOptions{ - Compression: Uncompressed, - WhiteoutFormat: AUFSWhiteoutFormat, - }); err != nil { - t.Fatal(err) - } - - checkFileMode(t, filepath.Join(dst, "d1"), 0700|os.ModeDir) - checkFileMode(t, filepath.Join(dst, "d1", WhiteoutOpaqueDir), 0700) - checkFileMode(t, filepath.Join(dst, "d2"), 0750|os.ModeDir) - checkFileMode(t, filepath.Join(dst, "d2", WhiteoutOpaqueDir), 0750) - checkFileMode(t, filepath.Join(dst, "d3"), 0700|os.ModeDir) - checkFileMode(t, filepath.Join(dst, "d1", "f1"), 0600) - checkFileMode(t, filepath.Join(dst, "d2", "f1"), 0660) - checkFileMode(t, filepath.Join(dst, "d3", WhiteoutPrefix+"f1"), 0600) -} diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_other.go b/vendor/github.com/docker/docker/pkg/archive/archive_other.go deleted file mode 100644 index 54acbf285..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/archive_other.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !linux - -package archive - -func getWhiteoutConverter(format WhiteoutFormat) tarWhiteoutConverter { - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_test.go b/vendor/github.com/docker/docker/pkg/archive/archive_test.go deleted file mode 100644 index b883be33e..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/archive_test.go +++ /dev/null @@ -1,1162 +0,0 @@ -package archive - -import ( - "archive/tar" - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - "testing" - "time" -) - -var tmp string - -func init() { - tmp = "/tmp/" - if runtime.GOOS == "windows" { - tmp = os.Getenv("TEMP") + `\` - } -} - -func TestIsArchiveNilHeader(t *testing.T) { - out := IsArchive(nil) - if out { - t.Fatalf("isArchive should return false as nil is not a valid archive header") - } -} - -func TestIsArchiveInvalidHeader(t *testing.T) { - header := []byte{0x00, 0x01, 0x02} - out := IsArchive(header) - if out { - t.Fatalf("isArchive should return false as %s is not a valid archive header", header) - } -} - -func TestIsArchiveBzip2(t *testing.T) { - header := []byte{0x42, 0x5A, 0x68} - out := IsArchive(header) - if !out { - t.Fatalf("isArchive should return true as %s is a bz2 header", header) - } -} - -func TestIsArchive7zip(t *testing.T) { - header := []byte{0x50, 0x4b, 0x03, 0x04} - out := IsArchive(header) - if out { - t.Fatalf("isArchive should return false as %s is a 7z header and it is not supported", header) - } -} - -func TestIsArchivePathDir(t *testing.T) { - cmd := exec.Command("sh", "-c", "mkdir -p /tmp/archivedir") - output, err := cmd.CombinedOutput() - if err != nil { - t.Fatalf("Fail to create an archive file for test : %s.", output) - } - if IsArchivePath(tmp + "archivedir") { - t.Fatalf("Incorrectly recognised directory as an archive") - } -} - -func TestIsArchivePathInvalidFile(t *testing.T) { - cmd := exec.Command("sh", "-c", "dd if=/dev/zero bs=1024 count=1 of=/tmp/archive && gzip --stdout /tmp/archive > /tmp/archive.gz") - output, err := cmd.CombinedOutput() - if err != nil { - t.Fatalf("Fail to create an archive file for test : %s.", output) - } - if IsArchivePath(tmp + "archive") { - t.Fatalf("Incorrectly recognised invalid tar path as archive") - } - if IsArchivePath(tmp + "archive.gz") { - t.Fatalf("Incorrectly recognised invalid compressed tar path as archive") - } -} - -func TestIsArchivePathTar(t *testing.T) { - var whichTar string - if runtime.GOOS == "solaris" { - whichTar = "gtar" - } else { - whichTar = "tar" - } - cmdStr := fmt.Sprintf("touch /tmp/archivedata && %s -cf /tmp/archive /tmp/archivedata && gzip --stdout /tmp/archive > /tmp/archive.gz", whichTar) - cmd := exec.Command("sh", "-c", cmdStr) - output, err := cmd.CombinedOutput() - if err != nil { - t.Fatalf("Fail to create an archive file for test : %s.", output) - } - if !IsArchivePath(tmp + "/archive") { - t.Fatalf("Did not recognise valid tar path as archive") - } - if !IsArchivePath(tmp + "archive.gz") { - t.Fatalf("Did not recognise valid compressed tar path as archive") - } -} - -func testDecompressStream(t *testing.T, ext, compressCommand string) { - cmd := exec.Command("sh", "-c", - fmt.Sprintf("touch /tmp/archive && %s /tmp/archive", compressCommand)) - output, err := cmd.CombinedOutput() - if err != nil { - t.Fatalf("Failed to create an archive file for test : %s.", output) - } - filename := "archive." + ext - archive, err := os.Open(tmp + filename) - if err != nil { - t.Fatalf("Failed to open file %s: %v", filename, err) - } - defer archive.Close() - - r, err := DecompressStream(archive) - if err != nil { - t.Fatalf("Failed to decompress %s: %v", filename, err) - } - if _, err = ioutil.ReadAll(r); err != nil { - t.Fatalf("Failed to read the decompressed stream: %v ", err) - } - if err = r.Close(); err != nil { - t.Fatalf("Failed to close the decompressed stream: %v ", err) - } -} - -func TestDecompressStreamGzip(t *testing.T) { - testDecompressStream(t, "gz", "gzip -f") -} - -func TestDecompressStreamBzip2(t *testing.T) { - testDecompressStream(t, "bz2", "bzip2 -f") -} - -func TestDecompressStreamXz(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("Xz not present in msys2") - } - testDecompressStream(t, "xz", "xz -f") -} - -func TestCompressStreamXzUnsuported(t *testing.T) { - dest, err := os.Create(tmp + "dest") - if err != nil { - t.Fatalf("Fail to create the destination file") - } - defer dest.Close() - - _, err = CompressStream(dest, Xz) - if err == nil { - t.Fatalf("Should fail as xz is unsupported for compression format.") - } -} - -func TestCompressStreamBzip2Unsupported(t *testing.T) { - dest, err := os.Create(tmp + "dest") - if err != nil { - t.Fatalf("Fail to create the destination file") - } - defer dest.Close() - - _, err = CompressStream(dest, Xz) - if err == nil { - t.Fatalf("Should fail as xz is unsupported for compression format.") - } -} - -func TestCompressStreamInvalid(t *testing.T) { - dest, err := os.Create(tmp + "dest") - if err != nil { - t.Fatalf("Fail to create the destination file") - } - defer dest.Close() - - _, err = CompressStream(dest, -1) - if err == nil { - t.Fatalf("Should fail as xz is unsupported for compression format.") - } -} - -func TestExtensionInvalid(t *testing.T) { - compression := Compression(-1) - output := compression.Extension() - if output != "" { - t.Fatalf("The extension of an invalid compression should be an empty string.") - } -} - -func TestExtensionUncompressed(t *testing.T) { - compression := Uncompressed - output := compression.Extension() - if output != "tar" { - t.Fatalf("The extension of an uncompressed archive should be 'tar'.") - } -} -func TestExtensionBzip2(t *testing.T) { - compression := Bzip2 - output := compression.Extension() - if output != "tar.bz2" { - t.Fatalf("The extension of a bzip2 archive should be 'tar.bz2'") - } -} -func TestExtensionGzip(t *testing.T) { - compression := Gzip - output := compression.Extension() - if output != "tar.gz" { - t.Fatalf("The extension of a bzip2 archive should be 'tar.gz'") - } -} -func TestExtensionXz(t *testing.T) { - compression := Xz - output := compression.Extension() - if output != "tar.xz" { - t.Fatalf("The extension of a bzip2 archive should be 'tar.xz'") - } -} - -func TestCmdStreamLargeStderr(t *testing.T) { - cmd := exec.Command("sh", "-c", "dd if=/dev/zero bs=1k count=1000 of=/dev/stderr; echo hello") - out, _, err := cmdStream(cmd, nil) - if err != nil { - t.Fatalf("Failed to start command: %s", err) - } - errCh := make(chan error) - go func() { - _, err := io.Copy(ioutil.Discard, out) - errCh <- err - }() - select { - case err := <-errCh: - if err != nil { - t.Fatalf("Command should not have failed (err=%.100s...)", err) - } - case <-time.After(5 * time.Second): - t.Fatalf("Command did not complete in 5 seconds; probable deadlock") - } -} - -func TestCmdStreamBad(t *testing.T) { - // TODO Windows: Figure out why this is failing in CI but not locally - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows CI machines") - } - badCmd := exec.Command("sh", "-c", "echo hello; echo >&2 error couldn\\'t reverse the phase pulser; exit 1") - out, _, err := cmdStream(badCmd, nil) - if err != nil { - t.Fatalf("Failed to start command: %s", err) - } - if output, err := ioutil.ReadAll(out); err == nil { - t.Fatalf("Command should have failed") - } else if err.Error() != "exit status 1: error couldn't reverse the phase pulser\n" { - t.Fatalf("Wrong error value (%s)", err) - } else if s := string(output); s != "hello\n" { - t.Fatalf("Command output should be '%s', not '%s'", "hello\\n", output) - } -} - -func TestCmdStreamGood(t *testing.T) { - cmd := exec.Command("sh", "-c", "echo hello; exit 0") - out, _, err := cmdStream(cmd, nil) - if err != nil { - t.Fatal(err) - } - if output, err := ioutil.ReadAll(out); err != nil { - t.Fatalf("Command should not have failed (err=%s)", err) - } else if s := string(output); s != "hello\n" { - t.Fatalf("Command output should be '%s', not '%s'", "hello\\n", output) - } -} - -func TestUntarPathWithInvalidDest(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tempFolder) - invalidDestFolder := filepath.Join(tempFolder, "invalidDest") - // Create a src file - srcFile := filepath.Join(tempFolder, "src") - tarFile := filepath.Join(tempFolder, "src.tar") - os.Create(srcFile) - os.Create(invalidDestFolder) // being a file (not dir) should cause an error - - // Translate back to Unix semantics as next exec.Command is run under sh - srcFileU := srcFile - tarFileU := tarFile - if runtime.GOOS == "windows" { - tarFileU = "/tmp/" + filepath.Base(filepath.Dir(tarFile)) + "/src.tar" - srcFileU = "/tmp/" + filepath.Base(filepath.Dir(srcFile)) + "/src" - } - - cmd := exec.Command("sh", "-c", "tar cf "+tarFileU+" "+srcFileU) - _, err = cmd.CombinedOutput() - if err != nil { - t.Fatal(err) - } - - err = UntarPath(tarFile, invalidDestFolder) - if err == nil { - t.Fatalf("UntarPath with invalid destination path should throw an error.") - } -} - -func TestUntarPathWithInvalidSrc(t *testing.T) { - dest, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatalf("Fail to create the destination file") - } - defer os.RemoveAll(dest) - err = UntarPath("/invalid/path", dest) - if err == nil { - t.Fatalf("UntarPath with invalid src path should throw an error.") - } -} - -func TestUntarPath(t *testing.T) { - tmpFolder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpFolder) - srcFile := filepath.Join(tmpFolder, "src") - tarFile := filepath.Join(tmpFolder, "src.tar") - os.Create(filepath.Join(tmpFolder, "src")) - - destFolder := filepath.Join(tmpFolder, "dest") - err = os.MkdirAll(destFolder, 0740) - if err != nil { - t.Fatalf("Fail to create the destination file") - } - - // Translate back to Unix semantics as next exec.Command is run under sh - srcFileU := srcFile - tarFileU := tarFile - if runtime.GOOS == "windows" { - tarFileU = "/tmp/" + filepath.Base(filepath.Dir(tarFile)) + "/src.tar" - srcFileU = "/tmp/" + filepath.Base(filepath.Dir(srcFile)) + "/src" - } - cmd := exec.Command("sh", "-c", "tar cf "+tarFileU+" "+srcFileU) - _, err = cmd.CombinedOutput() - if err != nil { - t.Fatal(err) - } - - err = UntarPath(tarFile, destFolder) - if err != nil { - t.Fatalf("UntarPath shouldn't throw an error, %s.", err) - } - expectedFile := filepath.Join(destFolder, srcFileU) - _, err = os.Stat(expectedFile) - if err != nil { - t.Fatalf("Destination folder should contain the source file but did not.") - } -} - -// Do the same test as above but with the destination as file, it should fail -func TestUntarPathWithDestinationFile(t *testing.T) { - tmpFolder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpFolder) - srcFile := filepath.Join(tmpFolder, "src") - tarFile := filepath.Join(tmpFolder, "src.tar") - os.Create(filepath.Join(tmpFolder, "src")) - - // Translate back to Unix semantics as next exec.Command is run under sh - srcFileU := srcFile - tarFileU := tarFile - if runtime.GOOS == "windows" { - tarFileU = "/tmp/" + filepath.Base(filepath.Dir(tarFile)) + "/src.tar" - srcFileU = "/tmp/" + filepath.Base(filepath.Dir(srcFile)) + "/src" - } - cmd := exec.Command("sh", "-c", "tar cf "+tarFileU+" "+srcFileU) - _, err = cmd.CombinedOutput() - if err != nil { - t.Fatal(err) - } - destFile := filepath.Join(tmpFolder, "dest") - _, err = os.Create(destFile) - if err != nil { - t.Fatalf("Fail to create the destination file") - } - err = UntarPath(tarFile, destFile) - if err == nil { - t.Fatalf("UntarPath should throw an error if the destination if a file") - } -} - -// Do the same test as above but with the destination folder already exists -// and the destination file is a directory -// It's working, see https://github.com/docker/docker/issues/10040 -func TestUntarPathWithDestinationSrcFileAsFolder(t *testing.T) { - tmpFolder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpFolder) - srcFile := filepath.Join(tmpFolder, "src") - tarFile := filepath.Join(tmpFolder, "src.tar") - os.Create(srcFile) - - // Translate back to Unix semantics as next exec.Command is run under sh - srcFileU := srcFile - tarFileU := tarFile - if runtime.GOOS == "windows" { - tarFileU = "/tmp/" + filepath.Base(filepath.Dir(tarFile)) + "/src.tar" - srcFileU = "/tmp/" + filepath.Base(filepath.Dir(srcFile)) + "/src" - } - - cmd := exec.Command("sh", "-c", "tar cf "+tarFileU+" "+srcFileU) - _, err = cmd.CombinedOutput() - if err != nil { - t.Fatal(err) - } - destFolder := filepath.Join(tmpFolder, "dest") - err = os.MkdirAll(destFolder, 0740) - if err != nil { - t.Fatalf("Fail to create the destination folder") - } - // Let's create a folder that will has the same path as the extracted file (from tar) - destSrcFileAsFolder := filepath.Join(destFolder, srcFileU) - err = os.MkdirAll(destSrcFileAsFolder, 0740) - if err != nil { - t.Fatal(err) - } - err = UntarPath(tarFile, destFolder) - if err != nil { - t.Fatalf("UntarPath should throw not throw an error if the extracted file already exists and is a folder") - } -} - -func TestCopyWithTarInvalidSrc(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(nil) - } - destFolder := filepath.Join(tempFolder, "dest") - invalidSrc := filepath.Join(tempFolder, "doesnotexists") - err = os.MkdirAll(destFolder, 0740) - if err != nil { - t.Fatal(err) - } - err = CopyWithTar(invalidSrc, destFolder) - if err == nil { - t.Fatalf("archiver.CopyWithTar with invalid src path should throw an error.") - } -} - -func TestCopyWithTarInexistentDestWillCreateIt(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(nil) - } - srcFolder := filepath.Join(tempFolder, "src") - inexistentDestFolder := filepath.Join(tempFolder, "doesnotexists") - err = os.MkdirAll(srcFolder, 0740) - if err != nil { - t.Fatal(err) - } - err = CopyWithTar(srcFolder, inexistentDestFolder) - if err != nil { - t.Fatalf("CopyWithTar with an inexistent folder shouldn't fail.") - } - _, err = os.Stat(inexistentDestFolder) - if err != nil { - t.Fatalf("CopyWithTar with an inexistent folder should create it.") - } -} - -// Test CopyWithTar with a file as src -func TestCopyWithTarSrcFile(t *testing.T) { - folder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(folder) - dest := filepath.Join(folder, "dest") - srcFolder := filepath.Join(folder, "src") - src := filepath.Join(folder, filepath.Join("src", "src")) - err = os.MkdirAll(srcFolder, 0740) - if err != nil { - t.Fatal(err) - } - err = os.MkdirAll(dest, 0740) - if err != nil { - t.Fatal(err) - } - ioutil.WriteFile(src, []byte("content"), 0777) - err = CopyWithTar(src, dest) - if err != nil { - t.Fatalf("archiver.CopyWithTar shouldn't throw an error, %s.", err) - } - _, err = os.Stat(dest) - // FIXME Check the content - if err != nil { - t.Fatalf("Destination file should be the same as the source.") - } -} - -// Test CopyWithTar with a folder as src -func TestCopyWithTarSrcFolder(t *testing.T) { - folder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(folder) - dest := filepath.Join(folder, "dest") - src := filepath.Join(folder, filepath.Join("src", "folder")) - err = os.MkdirAll(src, 0740) - if err != nil { - t.Fatal(err) - } - err = os.MkdirAll(dest, 0740) - if err != nil { - t.Fatal(err) - } - ioutil.WriteFile(filepath.Join(src, "file"), []byte("content"), 0777) - err = CopyWithTar(src, dest) - if err != nil { - t.Fatalf("archiver.CopyWithTar shouldn't throw an error, %s.", err) - } - _, err = os.Stat(dest) - // FIXME Check the content (the file inside) - if err != nil { - t.Fatalf("Destination folder should contain the source file but did not.") - } -} - -func TestCopyFileWithTarInvalidSrc(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tempFolder) - destFolder := filepath.Join(tempFolder, "dest") - err = os.MkdirAll(destFolder, 0740) - if err != nil { - t.Fatal(err) - } - invalidFile := filepath.Join(tempFolder, "doesnotexists") - err = CopyFileWithTar(invalidFile, destFolder) - if err == nil { - t.Fatalf("archiver.CopyWithTar with invalid src path should throw an error.") - } -} - -func TestCopyFileWithTarInexistentDestWillCreateIt(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(nil) - } - defer os.RemoveAll(tempFolder) - srcFile := filepath.Join(tempFolder, "src") - inexistentDestFolder := filepath.Join(tempFolder, "doesnotexists") - _, err = os.Create(srcFile) - if err != nil { - t.Fatal(err) - } - err = CopyFileWithTar(srcFile, inexistentDestFolder) - if err != nil { - t.Fatalf("CopyWithTar with an inexistent folder shouldn't fail.") - } - _, err = os.Stat(inexistentDestFolder) - if err != nil { - t.Fatalf("CopyWithTar with an inexistent folder should create it.") - } - // FIXME Test the src file and content -} - -func TestCopyFileWithTarSrcFolder(t *testing.T) { - folder, err := ioutil.TempDir("", "docker-archive-copyfilewithtar-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(folder) - dest := filepath.Join(folder, "dest") - src := filepath.Join(folder, "srcfolder") - err = os.MkdirAll(src, 0740) - if err != nil { - t.Fatal(err) - } - err = os.MkdirAll(dest, 0740) - if err != nil { - t.Fatal(err) - } - err = CopyFileWithTar(src, dest) - if err == nil { - t.Fatalf("CopyFileWithTar should throw an error with a folder.") - } -} - -func TestCopyFileWithTarSrcFile(t *testing.T) { - folder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(folder) - dest := filepath.Join(folder, "dest") - srcFolder := filepath.Join(folder, "src") - src := filepath.Join(folder, filepath.Join("src", "src")) - err = os.MkdirAll(srcFolder, 0740) - if err != nil { - t.Fatal(err) - } - err = os.MkdirAll(dest, 0740) - if err != nil { - t.Fatal(err) - } - ioutil.WriteFile(src, []byte("content"), 0777) - err = CopyWithTar(src, dest+"/") - if err != nil { - t.Fatalf("archiver.CopyFileWithTar shouldn't throw an error, %s.", err) - } - _, err = os.Stat(dest) - if err != nil { - t.Fatalf("Destination folder should contain the source file but did not.") - } -} - -func TestTarFiles(t *testing.T) { - // TODO Windows: Figure out how to port this test. - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - // try without hardlinks - if err := checkNoChanges(1000, false); err != nil { - t.Fatal(err) - } - // try with hardlinks - if err := checkNoChanges(1000, true); err != nil { - t.Fatal(err) - } -} - -func checkNoChanges(fileNum int, hardlinks bool) error { - srcDir, err := ioutil.TempDir("", "docker-test-srcDir") - if err != nil { - return err - } - defer os.RemoveAll(srcDir) - - destDir, err := ioutil.TempDir("", "docker-test-destDir") - if err != nil { - return err - } - defer os.RemoveAll(destDir) - - _, err = prepareUntarSourceDirectory(fileNum, srcDir, hardlinks) - if err != nil { - return err - } - - err = TarUntar(srcDir, destDir) - if err != nil { - return err - } - - changes, err := ChangesDirs(destDir, srcDir) - if err != nil { - return err - } - if len(changes) > 0 { - return fmt.Errorf("with %d files and %v hardlinks: expected 0 changes, got %d", fileNum, hardlinks, len(changes)) - } - return nil -} - -func tarUntar(t *testing.T, origin string, options *TarOptions) ([]Change, error) { - archive, err := TarWithOptions(origin, options) - if err != nil { - t.Fatal(err) - } - defer archive.Close() - - buf := make([]byte, 10) - if _, err := archive.Read(buf); err != nil { - return nil, err - } - wrap := io.MultiReader(bytes.NewReader(buf), archive) - - detectedCompression := DetectCompression(buf) - compression := options.Compression - if detectedCompression.Extension() != compression.Extension() { - return nil, fmt.Errorf("Wrong compression detected. Actual compression: %s, found %s", compression.Extension(), detectedCompression.Extension()) - } - - tmp, err := ioutil.TempDir("", "docker-test-untar") - if err != nil { - return nil, err - } - defer os.RemoveAll(tmp) - if err := Untar(wrap, tmp, nil); err != nil { - return nil, err - } - if _, err := os.Stat(tmp); err != nil { - return nil, err - } - - return ChangesDirs(origin, tmp) -} - -func TestTarUntar(t *testing.T) { - // TODO Windows: Figure out how to fix this test. - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - origin, err := ioutil.TempDir("", "docker-test-untar-origin") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(origin) - if err := ioutil.WriteFile(filepath.Join(origin, "1"), []byte("hello world"), 0700); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(origin, "2"), []byte("welcome!"), 0700); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(origin, "3"), []byte("will be ignored"), 0700); err != nil { - t.Fatal(err) - } - - for _, c := range []Compression{ - Uncompressed, - Gzip, - } { - changes, err := tarUntar(t, origin, &TarOptions{ - Compression: c, - ExcludePatterns: []string{"3"}, - }) - - if err != nil { - t.Fatalf("Error tar/untar for compression %s: %s", c.Extension(), err) - } - - if len(changes) != 1 || changes[0].Path != "/3" { - t.Fatalf("Unexpected differences after tarUntar: %v", changes) - } - } -} - -func TestTarWithOptions(t *testing.T) { - // TODO Windows: Figure out how to fix this test. - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - origin, err := ioutil.TempDir("", "docker-test-untar-origin") - if err != nil { - t.Fatal(err) - } - if _, err := ioutil.TempDir(origin, "folder"); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(origin) - if err := ioutil.WriteFile(filepath.Join(origin, "1"), []byte("hello world"), 0700); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(origin, "2"), []byte("welcome!"), 0700); err != nil { - t.Fatal(err) - } - - cases := []struct { - opts *TarOptions - numChanges int - }{ - {&TarOptions{IncludeFiles: []string{"1"}}, 2}, - {&TarOptions{ExcludePatterns: []string{"2"}}, 1}, - {&TarOptions{ExcludePatterns: []string{"1", "folder*"}}, 2}, - {&TarOptions{IncludeFiles: []string{"1", "1"}}, 2}, - {&TarOptions{IncludeFiles: []string{"1"}, RebaseNames: map[string]string{"1": "test"}}, 4}, - } - for _, testCase := range cases { - changes, err := tarUntar(t, origin, testCase.opts) - if err != nil { - t.Fatalf("Error tar/untar when testing inclusion/exclusion: %s", err) - } - if len(changes) != testCase.numChanges { - t.Errorf("Expected %d changes, got %d for %+v:", - testCase.numChanges, len(changes), testCase.opts) - } - } -} - -// Some tar archives such as http://haproxy.1wt.eu/download/1.5/src/devel/haproxy-1.5-dev21.tar.gz -// use PAX Global Extended Headers. -// Failing prevents the archives from being uncompressed during ADD -func TestTypeXGlobalHeaderDoesNotFail(t *testing.T) { - hdr := tar.Header{Typeflag: tar.TypeXGlobalHeader} - tmpDir, err := ioutil.TempDir("", "docker-test-archive-pax-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpDir) - err = createTarFile(filepath.Join(tmpDir, "pax_global_header"), tmpDir, &hdr, nil, true, nil, false) - if err != nil { - t.Fatal(err) - } -} - -// Some tar have both GNU specific (huge uid) and Ustar specific (long name) things. -// Not supposed to happen (should use PAX instead of Ustar for long name) but it does and it should still work. -func TestUntarUstarGnuConflict(t *testing.T) { - f, err := os.Open("testdata/broken.tar") - if err != nil { - t.Fatal(err) - } - defer f.Close() - - found := false - tr := tar.NewReader(f) - // Iterate through the files in the archive. - for { - hdr, err := tr.Next() - if err == io.EOF { - // end of tar archive - break - } - if err != nil { - t.Fatal(err) - } - if hdr.Name == "root/.cpanm/work/1395823785.24209/Plack-1.0030/blib/man3/Plack::Middleware::LighttpdScriptNameFix.3pm" { - found = true - break - } - } - if !found { - t.Fatalf("%s not found in the archive", "root/.cpanm/work/1395823785.24209/Plack-1.0030/blib/man3/Plack::Middleware::LighttpdScriptNameFix.3pm") - } -} - -func prepareUntarSourceDirectory(numberOfFiles int, targetPath string, makeLinks bool) (int, error) { - fileData := []byte("fooo") - for n := 0; n < numberOfFiles; n++ { - fileName := fmt.Sprintf("file-%d", n) - if err := ioutil.WriteFile(filepath.Join(targetPath, fileName), fileData, 0700); err != nil { - return 0, err - } - if makeLinks { - if err := os.Link(filepath.Join(targetPath, fileName), filepath.Join(targetPath, fileName+"-link")); err != nil { - return 0, err - } - } - } - totalSize := numberOfFiles * len(fileData) - return totalSize, nil -} - -func BenchmarkTarUntar(b *testing.B) { - origin, err := ioutil.TempDir("", "docker-test-untar-origin") - if err != nil { - b.Fatal(err) - } - tempDir, err := ioutil.TempDir("", "docker-test-untar-destination") - if err != nil { - b.Fatal(err) - } - target := filepath.Join(tempDir, "dest") - n, err := prepareUntarSourceDirectory(100, origin, false) - if err != nil { - b.Fatal(err) - } - defer os.RemoveAll(origin) - defer os.RemoveAll(tempDir) - - b.ResetTimer() - b.SetBytes(int64(n)) - for n := 0; n < b.N; n++ { - err := TarUntar(origin, target) - if err != nil { - b.Fatal(err) - } - os.RemoveAll(target) - } -} - -func BenchmarkTarUntarWithLinks(b *testing.B) { - origin, err := ioutil.TempDir("", "docker-test-untar-origin") - if err != nil { - b.Fatal(err) - } - tempDir, err := ioutil.TempDir("", "docker-test-untar-destination") - if err != nil { - b.Fatal(err) - } - target := filepath.Join(tempDir, "dest") - n, err := prepareUntarSourceDirectory(100, origin, true) - if err != nil { - b.Fatal(err) - } - defer os.RemoveAll(origin) - defer os.RemoveAll(tempDir) - - b.ResetTimer() - b.SetBytes(int64(n)) - for n := 0; n < b.N; n++ { - err := TarUntar(origin, target) - if err != nil { - b.Fatal(err) - } - os.RemoveAll(target) - } -} - -func TestUntarInvalidFilenames(t *testing.T) { - // TODO Windows: Figure out how to fix this test. - if runtime.GOOS == "windows" { - t.Skip("Passes but hits breakoutError: platform and architecture is not supported") - } - for i, headers := range [][]*tar.Header{ - { - { - Name: "../victim/dotdot", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - { - { - // Note the leading slash - Name: "/../victim/slash-dotdot", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - } { - if err := testBreakout("untar", "docker-TestUntarInvalidFilenames", headers); err != nil { - t.Fatalf("i=%d. %v", i, err) - } - } -} - -func TestUntarHardlinkToSymlink(t *testing.T) { - // TODO Windows. There may be a way of running this, but turning off for now - if runtime.GOOS == "windows" { - t.Skip("hardlinks on Windows") - } - for i, headers := range [][]*tar.Header{ - { - { - Name: "symlink1", - Typeflag: tar.TypeSymlink, - Linkname: "regfile", - Mode: 0644, - }, - { - Name: "symlink2", - Typeflag: tar.TypeLink, - Linkname: "symlink1", - Mode: 0644, - }, - { - Name: "regfile", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - } { - if err := testBreakout("untar", "docker-TestUntarHardlinkToSymlink", headers); err != nil { - t.Fatalf("i=%d. %v", i, err) - } - } -} - -func TestUntarInvalidHardlink(t *testing.T) { - // TODO Windows. There may be a way of running this, but turning off for now - if runtime.GOOS == "windows" { - t.Skip("hardlinks on Windows") - } - for i, headers := range [][]*tar.Header{ - { // try reading victim/hello (../) - { - Name: "dotdot", - Typeflag: tar.TypeLink, - Linkname: "../victim/hello", - Mode: 0644, - }, - }, - { // try reading victim/hello (/../) - { - Name: "slash-dotdot", - Typeflag: tar.TypeLink, - // Note the leading slash - Linkname: "/../victim/hello", - Mode: 0644, - }, - }, - { // try writing victim/file - { - Name: "loophole-victim", - Typeflag: tar.TypeLink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "loophole-victim/file", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - { // try reading victim/hello (hardlink, symlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeLink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "symlink", - Typeflag: tar.TypeSymlink, - Linkname: "loophole-victim/hello", - Mode: 0644, - }, - }, - { // Try reading victim/hello (hardlink, hardlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeLink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "hardlink", - Typeflag: tar.TypeLink, - Linkname: "loophole-victim/hello", - Mode: 0644, - }, - }, - { // Try removing victim directory (hardlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeLink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "loophole-victim", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - } { - if err := testBreakout("untar", "docker-TestUntarInvalidHardlink", headers); err != nil { - t.Fatalf("i=%d. %v", i, err) - } - } -} - -func TestUntarInvalidSymlink(t *testing.T) { - // TODO Windows. There may be a way of running this, but turning off for now - if runtime.GOOS == "windows" { - t.Skip("hardlinks on Windows") - } - for i, headers := range [][]*tar.Header{ - { // try reading victim/hello (../) - { - Name: "dotdot", - Typeflag: tar.TypeSymlink, - Linkname: "../victim/hello", - Mode: 0644, - }, - }, - { // try reading victim/hello (/../) - { - Name: "slash-dotdot", - Typeflag: tar.TypeSymlink, - // Note the leading slash - Linkname: "/../victim/hello", - Mode: 0644, - }, - }, - { // try writing victim/file - { - Name: "loophole-victim", - Typeflag: tar.TypeSymlink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "loophole-victim/file", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - { // try reading victim/hello (symlink, symlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeSymlink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "symlink", - Typeflag: tar.TypeSymlink, - Linkname: "loophole-victim/hello", - Mode: 0644, - }, - }, - { // try reading victim/hello (symlink, hardlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeSymlink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "hardlink", - Typeflag: tar.TypeLink, - Linkname: "loophole-victim/hello", - Mode: 0644, - }, - }, - { // try removing victim directory (symlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeSymlink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "loophole-victim", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - { // try writing to victim/newdir/newfile with a symlink in the path - { - // this header needs to be before the next one, or else there is an error - Name: "dir/loophole", - Typeflag: tar.TypeSymlink, - Linkname: "../../victim", - Mode: 0755, - }, - { - Name: "dir/loophole/newdir/newfile", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - } { - if err := testBreakout("untar", "docker-TestUntarInvalidSymlink", headers); err != nil { - t.Fatalf("i=%d. %v", i, err) - } - } -} - -func TestTempArchiveCloseMultipleTimes(t *testing.T) { - reader := ioutil.NopCloser(strings.NewReader("hello")) - tempArchive, err := NewTempArchive(reader, "") - buf := make([]byte, 10) - n, err := tempArchive.Read(buf) - if n != 5 { - t.Fatalf("Expected to read 5 bytes. Read %d instead", n) - } - for i := 0; i < 3; i++ { - if err = tempArchive.Close(); err != nil { - t.Fatalf("i=%d. Unexpected error closing temp archive: %v", i, err) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_unix.go b/vendor/github.com/docker/docker/pkg/archive/archive_unix.go deleted file mode 100644 index 7083f2fa5..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/archive_unix.go +++ /dev/null @@ -1,118 +0,0 @@ -// +build !windows - -package archive - -import ( - "archive/tar" - "errors" - "os" - "path/filepath" - "syscall" - - "github.com/docker/docker/pkg/system" - rsystem "github.com/opencontainers/runc/libcontainer/system" -) - -// fixVolumePathPrefix does platform specific processing to ensure that if -// the path being passed in is not in a volume path format, convert it to one. -func fixVolumePathPrefix(srcPath string) string { - return srcPath -} - -// getWalkRoot calculates the root path when performing a TarWithOptions. -// We use a separate function as this is platform specific. On Linux, we -// can't use filepath.Join(srcPath,include) because this will clean away -// a trailing "." or "/" which may be important. -func getWalkRoot(srcPath string, include string) string { - return srcPath + string(filepath.Separator) + include -} - -// CanonicalTarNameForPath returns platform-specific filepath -// to canonical posix-style path for tar archival. p is relative -// path. -func CanonicalTarNameForPath(p string) (string, error) { - return p, nil // already unix-style -} - -// chmodTarEntry is used to adjust the file permissions used in tar header based -// on the platform the archival is done. - -func chmodTarEntry(perm os.FileMode) os.FileMode { - return perm // noop for unix as golang APIs provide perm bits correctly -} - -func setHeaderForSpecialDevice(hdr *tar.Header, ta *tarAppender, name string, stat interface{}) (inode uint64, err error) { - s, ok := stat.(*syscall.Stat_t) - - if !ok { - err = errors.New("cannot convert stat value to syscall.Stat_t") - return - } - - inode = uint64(s.Ino) - - // Currently go does not fill in the major/minors - if s.Mode&syscall.S_IFBLK != 0 || - s.Mode&syscall.S_IFCHR != 0 { - hdr.Devmajor = int64(major(uint64(s.Rdev))) - hdr.Devminor = int64(minor(uint64(s.Rdev))) - } - - return -} - -func getFileUIDGID(stat interface{}) (int, int, error) { - s, ok := stat.(*syscall.Stat_t) - - if !ok { - return -1, -1, errors.New("cannot convert stat value to syscall.Stat_t") - } - return int(s.Uid), int(s.Gid), nil -} - -func major(device uint64) uint64 { - return (device >> 8) & 0xfff -} - -func minor(device uint64) uint64 { - return (device & 0xff) | ((device >> 12) & 0xfff00) -} - -// handleTarTypeBlockCharFifo is an OS-specific helper function used by -// createTarFile to handle the following types of header: Block; Char; Fifo -func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error { - if rsystem.RunningInUserNS() { - // cannot create a device if running in user namespace - return nil - } - - mode := uint32(hdr.Mode & 07777) - switch hdr.Typeflag { - case tar.TypeBlock: - mode |= syscall.S_IFBLK - case tar.TypeChar: - mode |= syscall.S_IFCHR - case tar.TypeFifo: - mode |= syscall.S_IFIFO - } - - if err := system.Mknod(path, mode, int(system.Mkdev(hdr.Devmajor, hdr.Devminor))); err != nil { - return err - } - return nil -} - -func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo) error { - if hdr.Typeflag == tar.TypeLink { - if fi, err := os.Lstat(hdr.Linkname); err == nil && (fi.Mode()&os.ModeSymlink == 0) { - if err := os.Chmod(path, hdrInfo.Mode()); err != nil { - return err - } - } - } else if hdr.Typeflag != tar.TypeSymlink { - if err := os.Chmod(path, hdrInfo.Mode()); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_unix_test.go b/vendor/github.com/docker/docker/pkg/archive/archive_unix_test.go deleted file mode 100644 index 4eeafdd12..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/archive_unix_test.go +++ /dev/null @@ -1,249 +0,0 @@ -// +build !windows - -package archive - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "syscall" - "testing" - - "github.com/docker/docker/pkg/system" -) - -func TestCanonicalTarNameForPath(t *testing.T) { - cases := []struct{ in, expected string }{ - {"foo", "foo"}, - {"foo/bar", "foo/bar"}, - {"foo/dir/", "foo/dir/"}, - } - for _, v := range cases { - if out, err := CanonicalTarNameForPath(v.in); err != nil { - t.Fatalf("cannot get canonical name for path: %s: %v", v.in, err) - } else if out != v.expected { - t.Fatalf("wrong canonical tar name. expected:%s got:%s", v.expected, out) - } - } -} - -func TestCanonicalTarName(t *testing.T) { - cases := []struct { - in string - isDir bool - expected string - }{ - {"foo", false, "foo"}, - {"foo", true, "foo/"}, - {"foo/bar", false, "foo/bar"}, - {"foo/bar", true, "foo/bar/"}, - } - for _, v := range cases { - if out, err := canonicalTarName(v.in, v.isDir); err != nil { - t.Fatalf("cannot get canonical name for path: %s: %v", v.in, err) - } else if out != v.expected { - t.Fatalf("wrong canonical tar name. expected:%s got:%s", v.expected, out) - } - } -} - -func TestChmodTarEntry(t *testing.T) { - cases := []struct { - in, expected os.FileMode - }{ - {0000, 0000}, - {0777, 0777}, - {0644, 0644}, - {0755, 0755}, - {0444, 0444}, - } - for _, v := range cases { - if out := chmodTarEntry(v.in); out != v.expected { - t.Fatalf("wrong chmod. expected:%v got:%v", v.expected, out) - } - } -} - -func TestTarWithHardLink(t *testing.T) { - origin, err := ioutil.TempDir("", "docker-test-tar-hardlink") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(origin) - if err := ioutil.WriteFile(filepath.Join(origin, "1"), []byte("hello world"), 0700); err != nil { - t.Fatal(err) - } - if err := os.Link(filepath.Join(origin, "1"), filepath.Join(origin, "2")); err != nil { - t.Fatal(err) - } - - var i1, i2 uint64 - if i1, err = getNlink(filepath.Join(origin, "1")); err != nil { - t.Fatal(err) - } - // sanity check that we can hardlink - if i1 != 2 { - t.Skipf("skipping since hardlinks don't work here; expected 2 links, got %d", i1) - } - - dest, err := ioutil.TempDir("", "docker-test-tar-hardlink-dest") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dest) - - // we'll do this in two steps to separate failure - fh, err := Tar(origin, Uncompressed) - if err != nil { - t.Fatal(err) - } - - // ensure we can read the whole thing with no error, before writing back out - buf, err := ioutil.ReadAll(fh) - if err != nil { - t.Fatal(err) - } - - bRdr := bytes.NewReader(buf) - err = Untar(bRdr, dest, &TarOptions{Compression: Uncompressed}) - if err != nil { - t.Fatal(err) - } - - if i1, err = getInode(filepath.Join(dest, "1")); err != nil { - t.Fatal(err) - } - if i2, err = getInode(filepath.Join(dest, "2")); err != nil { - t.Fatal(err) - } - - if i1 != i2 { - t.Errorf("expected matching inodes, but got %d and %d", i1, i2) - } -} - -func getNlink(path string) (uint64, error) { - stat, err := os.Stat(path) - if err != nil { - return 0, err - } - statT, ok := stat.Sys().(*syscall.Stat_t) - if !ok { - return 0, fmt.Errorf("expected type *syscall.Stat_t, got %t", stat.Sys()) - } - // We need this conversion on ARM64 - return uint64(statT.Nlink), nil -} - -func getInode(path string) (uint64, error) { - stat, err := os.Stat(path) - if err != nil { - return 0, err - } - statT, ok := stat.Sys().(*syscall.Stat_t) - if !ok { - return 0, fmt.Errorf("expected type *syscall.Stat_t, got %t", stat.Sys()) - } - return statT.Ino, nil -} - -func TestTarWithBlockCharFifo(t *testing.T) { - origin, err := ioutil.TempDir("", "docker-test-tar-hardlink") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(origin) - if err := ioutil.WriteFile(filepath.Join(origin, "1"), []byte("hello world"), 0700); err != nil { - t.Fatal(err) - } - if err := system.Mknod(filepath.Join(origin, "2"), syscall.S_IFBLK, int(system.Mkdev(int64(12), int64(5)))); err != nil { - t.Fatal(err) - } - if err := system.Mknod(filepath.Join(origin, "3"), syscall.S_IFCHR, int(system.Mkdev(int64(12), int64(5)))); err != nil { - t.Fatal(err) - } - if err := system.Mknod(filepath.Join(origin, "4"), syscall.S_IFIFO, int(system.Mkdev(int64(12), int64(5)))); err != nil { - t.Fatal(err) - } - - dest, err := ioutil.TempDir("", "docker-test-tar-hardlink-dest") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dest) - - // we'll do this in two steps to separate failure - fh, err := Tar(origin, Uncompressed) - if err != nil { - t.Fatal(err) - } - - // ensure we can read the whole thing with no error, before writing back out - buf, err := ioutil.ReadAll(fh) - if err != nil { - t.Fatal(err) - } - - bRdr := bytes.NewReader(buf) - err = Untar(bRdr, dest, &TarOptions{Compression: Uncompressed}) - if err != nil { - t.Fatal(err) - } - - changes, err := ChangesDirs(origin, dest) - if err != nil { - t.Fatal(err) - } - if len(changes) > 0 { - t.Fatalf("Tar with special device (block, char, fifo) should keep them (recreate them when untar) : %v", changes) - } -} - -// TestTarUntarWithXattr is Unix as Lsetxattr is not supported on Windows -func TestTarUntarWithXattr(t *testing.T) { - if runtime.GOOS == "solaris" { - t.Skip() - } - origin, err := ioutil.TempDir("", "docker-test-untar-origin") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(origin) - if err := ioutil.WriteFile(filepath.Join(origin, "1"), []byte("hello world"), 0700); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(origin, "2"), []byte("welcome!"), 0700); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(origin, "3"), []byte("will be ignored"), 0700); err != nil { - t.Fatal(err) - } - if err := system.Lsetxattr(filepath.Join(origin, "2"), "security.capability", []byte{0x00}, 0); err != nil { - t.Fatal(err) - } - - for _, c := range []Compression{ - Uncompressed, - Gzip, - } { - changes, err := tarUntar(t, origin, &TarOptions{ - Compression: c, - ExcludePatterns: []string{"3"}, - }) - - if err != nil { - t.Fatalf("Error tar/untar for compression %s: %s", c.Extension(), err) - } - - if len(changes) != 1 || changes[0].Path != "/3" { - t.Fatalf("Unexpected differences after tarUntar: %v", changes) - } - capability, _ := system.Lgetxattr(filepath.Join(origin, "2"), "security.capability") - if capability == nil && capability[0] != 0x00 { - t.Fatalf("Untar should have kept the 'security.capability' xattr.") - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_windows.go b/vendor/github.com/docker/docker/pkg/archive/archive_windows.go deleted file mode 100644 index 5c3a1be34..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/archive_windows.go +++ /dev/null @@ -1,70 +0,0 @@ -// +build windows - -package archive - -import ( - "archive/tar" - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/docker/docker/pkg/longpath" -) - -// fixVolumePathPrefix does platform specific processing to ensure that if -// the path being passed in is not in a volume path format, convert it to one. -func fixVolumePathPrefix(srcPath string) string { - return longpath.AddPrefix(srcPath) -} - -// getWalkRoot calculates the root path when performing a TarWithOptions. -// We use a separate function as this is platform specific. -func getWalkRoot(srcPath string, include string) string { - return filepath.Join(srcPath, include) -} - -// CanonicalTarNameForPath returns platform-specific filepath -// to canonical posix-style path for tar archival. p is relative -// path. -func CanonicalTarNameForPath(p string) (string, error) { - // windows: convert windows style relative path with backslashes - // into forward slashes. Since windows does not allow '/' or '\' - // in file names, it is mostly safe to replace however we must - // check just in case - if strings.Contains(p, "/") { - return "", fmt.Errorf("Windows path contains forward slash: %s", p) - } - return strings.Replace(p, string(os.PathSeparator), "/", -1), nil - -} - -// chmodTarEntry is used to adjust the file permissions used in tar header based -// on the platform the archival is done. -func chmodTarEntry(perm os.FileMode) os.FileMode { - perm &= 0755 - // Add the x bit: make everything +x from windows - perm |= 0111 - - return perm -} - -func setHeaderForSpecialDevice(hdr *tar.Header, ta *tarAppender, name string, stat interface{}) (inode uint64, err error) { - // do nothing. no notion of Rdev, Inode, Nlink in stat on Windows - return -} - -// handleTarTypeBlockCharFifo is an OS-specific helper function used by -// createTarFile to handle the following types of header: Block; Char; Fifo -func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error { - return nil -} - -func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo) error { - return nil -} - -func getFileUIDGID(stat interface{}) (int, int, error) { - // no notion of file ownership mapping yet on Windows - return 0, 0, nil -} diff --git a/vendor/github.com/docker/docker/pkg/archive/archive_windows_test.go b/vendor/github.com/docker/docker/pkg/archive/archive_windows_test.go deleted file mode 100644 index 0c6733d6b..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/archive_windows_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// +build windows - -package archive - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" -) - -func TestCopyFileWithInvalidDest(t *testing.T) { - // TODO Windows: This is currently failing. Not sure what has - // recently changed in CopyWithTar as used to pass. Further investigation - // is required. - t.Skip("Currently fails") - folder, err := ioutil.TempDir("", "docker-archive-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(folder) - dest := "c:dest" - srcFolder := filepath.Join(folder, "src") - src := filepath.Join(folder, "src", "src") - err = os.MkdirAll(srcFolder, 0740) - if err != nil { - t.Fatal(err) - } - ioutil.WriteFile(src, []byte("content"), 0777) - err = CopyWithTar(src, dest) - if err == nil { - t.Fatalf("archiver.CopyWithTar should throw an error on invalid dest.") - } -} - -func TestCanonicalTarNameForPath(t *testing.T) { - cases := []struct { - in, expected string - shouldFail bool - }{ - {"foo", "foo", false}, - {"foo/bar", "___", true}, // unix-styled windows path must fail - {`foo\bar`, "foo/bar", false}, - } - for _, v := range cases { - if out, err := CanonicalTarNameForPath(v.in); err != nil && !v.shouldFail { - t.Fatalf("cannot get canonical name for path: %s: %v", v.in, err) - } else if v.shouldFail && err == nil { - t.Fatalf("canonical path call should have failed with error. in=%s out=%s", v.in, out) - } else if !v.shouldFail && out != v.expected { - t.Fatalf("wrong canonical tar name. expected:%s got:%s", v.expected, out) - } - } -} - -func TestCanonicalTarName(t *testing.T) { - cases := []struct { - in string - isDir bool - expected string - }{ - {"foo", false, "foo"}, - {"foo", true, "foo/"}, - {`foo\bar`, false, "foo/bar"}, - {`foo\bar`, true, "foo/bar/"}, - } - for _, v := range cases { - if out, err := canonicalTarName(v.in, v.isDir); err != nil { - t.Fatalf("cannot get canonical name for path: %s: %v", v.in, err) - } else if out != v.expected { - t.Fatalf("wrong canonical tar name. expected:%s got:%s", v.expected, out) - } - } -} - -func TestChmodTarEntry(t *testing.T) { - cases := []struct { - in, expected os.FileMode - }{ - {0000, 0111}, - {0777, 0755}, - {0644, 0755}, - {0755, 0755}, - {0444, 0555}, - } - for _, v := range cases { - if out := chmodTarEntry(v.in); out != v.expected { - t.Fatalf("wrong chmod. expected:%v got:%v", v.expected, out) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/archive/changes.go b/vendor/github.com/docker/docker/pkg/archive/changes.go deleted file mode 100644 index c07d55cbd..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/changes.go +++ /dev/null @@ -1,446 +0,0 @@ -package archive - -import ( - "archive/tar" - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "sort" - "strings" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/pools" - "github.com/docker/docker/pkg/system" -) - -// ChangeType represents the change type. -type ChangeType int - -const ( - // ChangeModify represents the modify operation. - ChangeModify = iota - // ChangeAdd represents the add operation. - ChangeAdd - // ChangeDelete represents the delete operation. - ChangeDelete -) - -func (c ChangeType) String() string { - switch c { - case ChangeModify: - return "C" - case ChangeAdd: - return "A" - case ChangeDelete: - return "D" - } - return "" -} - -// Change represents a change, it wraps the change type and path. -// It describes changes of the files in the path respect to the -// parent layers. The change could be modify, add, delete. -// This is used for layer diff. -type Change struct { - Path string - Kind ChangeType -} - -func (change *Change) String() string { - return fmt.Sprintf("%s %s", change.Kind, change.Path) -} - -// for sort.Sort -type changesByPath []Change - -func (c changesByPath) Less(i, j int) bool { return c[i].Path < c[j].Path } -func (c changesByPath) Len() int { return len(c) } -func (c changesByPath) Swap(i, j int) { c[j], c[i] = c[i], c[j] } - -// Gnu tar and the go tar writer don't have sub-second mtime -// precision, which is problematic when we apply changes via tar -// files, we handle this by comparing for exact times, *or* same -// second count and either a or b having exactly 0 nanoseconds -func sameFsTime(a, b time.Time) bool { - return a == b || - (a.Unix() == b.Unix() && - (a.Nanosecond() == 0 || b.Nanosecond() == 0)) -} - -func sameFsTimeSpec(a, b syscall.Timespec) bool { - return a.Sec == b.Sec && - (a.Nsec == b.Nsec || a.Nsec == 0 || b.Nsec == 0) -} - -// Changes walks the path rw and determines changes for the files in the path, -// with respect to the parent layers -func Changes(layers []string, rw string) ([]Change, error) { - return changes(layers, rw, aufsDeletedFile, aufsMetadataSkip) -} - -func aufsMetadataSkip(path string) (skip bool, err error) { - skip, err = filepath.Match(string(os.PathSeparator)+WhiteoutMetaPrefix+"*", path) - if err != nil { - skip = true - } - return -} - -func aufsDeletedFile(root, path string, fi os.FileInfo) (string, error) { - f := filepath.Base(path) - - // If there is a whiteout, then the file was removed - if strings.HasPrefix(f, WhiteoutPrefix) { - originalFile := f[len(WhiteoutPrefix):] - return filepath.Join(filepath.Dir(path), originalFile), nil - } - - return "", nil -} - -type skipChange func(string) (bool, error) -type deleteChange func(string, string, os.FileInfo) (string, error) - -func changes(layers []string, rw string, dc deleteChange, sc skipChange) ([]Change, error) { - var ( - changes []Change - changedDirs = make(map[string]struct{}) - ) - - err := filepath.Walk(rw, func(path string, f os.FileInfo, err error) error { - if err != nil { - return err - } - - // Rebase path - path, err = filepath.Rel(rw, path) - if err != nil { - return err - } - - // As this runs on the daemon side, file paths are OS specific. - path = filepath.Join(string(os.PathSeparator), path) - - // Skip root - if path == string(os.PathSeparator) { - return nil - } - - if sc != nil { - if skip, err := sc(path); skip { - return err - } - } - - change := Change{ - Path: path, - } - - deletedFile, err := dc(rw, path, f) - if err != nil { - return err - } - - // Find out what kind of modification happened - if deletedFile != "" { - change.Path = deletedFile - change.Kind = ChangeDelete - } else { - // Otherwise, the file was added - change.Kind = ChangeAdd - - // ...Unless it already existed in a top layer, in which case, it's a modification - for _, layer := range layers { - stat, err := os.Stat(filepath.Join(layer, path)) - if err != nil && !os.IsNotExist(err) { - return err - } - if err == nil { - // The file existed in the top layer, so that's a modification - - // However, if it's a directory, maybe it wasn't actually modified. - // If you modify /foo/bar/baz, then /foo will be part of the changed files only because it's the parent of bar - if stat.IsDir() && f.IsDir() { - if f.Size() == stat.Size() && f.Mode() == stat.Mode() && sameFsTime(f.ModTime(), stat.ModTime()) { - // Both directories are the same, don't record the change - return nil - } - } - change.Kind = ChangeModify - break - } - } - } - - // If /foo/bar/file.txt is modified, then /foo/bar must be part of the changed files. - // This block is here to ensure the change is recorded even if the - // modify time, mode and size of the parent directory in the rw and ro layers are all equal. - // Check https://github.com/docker/docker/pull/13590 for details. - if f.IsDir() { - changedDirs[path] = struct{}{} - } - if change.Kind == ChangeAdd || change.Kind == ChangeDelete { - parent := filepath.Dir(path) - if _, ok := changedDirs[parent]; !ok && parent != "/" { - changes = append(changes, Change{Path: parent, Kind: ChangeModify}) - changedDirs[parent] = struct{}{} - } - } - - // Record change - changes = append(changes, change) - return nil - }) - if err != nil && !os.IsNotExist(err) { - return nil, err - } - return changes, nil -} - -// FileInfo describes the information of a file. -type FileInfo struct { - parent *FileInfo - name string - stat *system.StatT - children map[string]*FileInfo - capability []byte - added bool -} - -// LookUp looks up the file information of a file. -func (info *FileInfo) LookUp(path string) *FileInfo { - // As this runs on the daemon side, file paths are OS specific. - parent := info - if path == string(os.PathSeparator) { - return info - } - - pathElements := strings.Split(path, string(os.PathSeparator)) - for _, elem := range pathElements { - if elem != "" { - child := parent.children[elem] - if child == nil { - return nil - } - parent = child - } - } - return parent -} - -func (info *FileInfo) path() string { - if info.parent == nil { - // As this runs on the daemon side, file paths are OS specific. - return string(os.PathSeparator) - } - return filepath.Join(info.parent.path(), info.name) -} - -func (info *FileInfo) addChanges(oldInfo *FileInfo, changes *[]Change) { - - sizeAtEntry := len(*changes) - - if oldInfo == nil { - // add - change := Change{ - Path: info.path(), - Kind: ChangeAdd, - } - *changes = append(*changes, change) - info.added = true - } - - // We make a copy so we can modify it to detect additions - // also, we only recurse on the old dir if the new info is a directory - // otherwise any previous delete/change is considered recursive - oldChildren := make(map[string]*FileInfo) - if oldInfo != nil && info.isDir() { - for k, v := range oldInfo.children { - oldChildren[k] = v - } - } - - for name, newChild := range info.children { - oldChild, _ := oldChildren[name] - if oldChild != nil { - // change? - oldStat := oldChild.stat - newStat := newChild.stat - // Note: We can't compare inode or ctime or blocksize here, because these change - // when copying a file into a container. However, that is not generally a problem - // because any content change will change mtime, and any status change should - // be visible when actually comparing the stat fields. The only time this - // breaks down is if some code intentionally hides a change by setting - // back mtime - if statDifferent(oldStat, newStat) || - bytes.Compare(oldChild.capability, newChild.capability) != 0 { - change := Change{ - Path: newChild.path(), - Kind: ChangeModify, - } - *changes = append(*changes, change) - newChild.added = true - } - - // Remove from copy so we can detect deletions - delete(oldChildren, name) - } - - newChild.addChanges(oldChild, changes) - } - for _, oldChild := range oldChildren { - // delete - change := Change{ - Path: oldChild.path(), - Kind: ChangeDelete, - } - *changes = append(*changes, change) - } - - // If there were changes inside this directory, we need to add it, even if the directory - // itself wasn't changed. This is needed to properly save and restore filesystem permissions. - // As this runs on the daemon side, file paths are OS specific. - if len(*changes) > sizeAtEntry && info.isDir() && !info.added && info.path() != string(os.PathSeparator) { - change := Change{ - Path: info.path(), - Kind: ChangeModify, - } - // Let's insert the directory entry before the recently added entries located inside this dir - *changes = append(*changes, change) // just to resize the slice, will be overwritten - copy((*changes)[sizeAtEntry+1:], (*changes)[sizeAtEntry:]) - (*changes)[sizeAtEntry] = change - } - -} - -// Changes add changes to file information. -func (info *FileInfo) Changes(oldInfo *FileInfo) []Change { - var changes []Change - - info.addChanges(oldInfo, &changes) - - return changes -} - -func newRootFileInfo() *FileInfo { - // As this runs on the daemon side, file paths are OS specific. - root := &FileInfo{ - name: string(os.PathSeparator), - children: make(map[string]*FileInfo), - } - return root -} - -// ChangesDirs compares two directories and generates an array of Change objects describing the changes. -// If oldDir is "", then all files in newDir will be Add-Changes. -func ChangesDirs(newDir, oldDir string) ([]Change, error) { - var ( - oldRoot, newRoot *FileInfo - ) - if oldDir == "" { - emptyDir, err := ioutil.TempDir("", "empty") - if err != nil { - return nil, err - } - defer os.Remove(emptyDir) - oldDir = emptyDir - } - oldRoot, newRoot, err := collectFileInfoForChanges(oldDir, newDir) - if err != nil { - return nil, err - } - - return newRoot.Changes(oldRoot), nil -} - -// ChangesSize calculates the size in bytes of the provided changes, based on newDir. -func ChangesSize(newDir string, changes []Change) int64 { - var ( - size int64 - sf = make(map[uint64]struct{}) - ) - for _, change := range changes { - if change.Kind == ChangeModify || change.Kind == ChangeAdd { - file := filepath.Join(newDir, change.Path) - fileInfo, err := os.Lstat(file) - if err != nil { - logrus.Errorf("Can not stat %q: %s", file, err) - continue - } - - if fileInfo != nil && !fileInfo.IsDir() { - if hasHardlinks(fileInfo) { - inode := getIno(fileInfo) - if _, ok := sf[inode]; !ok { - size += fileInfo.Size() - sf[inode] = struct{}{} - } - } else { - size += fileInfo.Size() - } - } - } - } - return size -} - -// ExportChanges produces an Archive from the provided changes, relative to dir. -func ExportChanges(dir string, changes []Change, uidMaps, gidMaps []idtools.IDMap) (io.ReadCloser, error) { - reader, writer := io.Pipe() - go func() { - ta := &tarAppender{ - TarWriter: tar.NewWriter(writer), - Buffer: pools.BufioWriter32KPool.Get(nil), - SeenFiles: make(map[uint64]string), - UIDMaps: uidMaps, - GIDMaps: gidMaps, - } - // this buffer is needed for the duration of this piped stream - defer pools.BufioWriter32KPool.Put(ta.Buffer) - - sort.Sort(changesByPath(changes)) - - // In general we log errors here but ignore them because - // during e.g. a diff operation the container can continue - // mutating the filesystem and we can see transient errors - // from this - for _, change := range changes { - if change.Kind == ChangeDelete { - whiteOutDir := filepath.Dir(change.Path) - whiteOutBase := filepath.Base(change.Path) - whiteOut := filepath.Join(whiteOutDir, WhiteoutPrefix+whiteOutBase) - timestamp := time.Now() - hdr := &tar.Header{ - Name: whiteOut[1:], - Size: 0, - ModTime: timestamp, - AccessTime: timestamp, - ChangeTime: timestamp, - } - if err := ta.TarWriter.WriteHeader(hdr); err != nil { - logrus.Debugf("Can't write whiteout header: %s", err) - } - } else { - path := filepath.Join(dir, change.Path) - if err := ta.addTarFile(path, change.Path[1:]); err != nil { - logrus.Debugf("Can't add file %s to tar: %s", path, err) - } - } - } - - // Make sure to check the error on Close. - if err := ta.TarWriter.Close(); err != nil { - logrus.Debugf("Can't close layer: %s", err) - } - if err := writer.Close(); err != nil { - logrus.Debugf("failed close Changes writer: %s", err) - } - }() - return reader, nil -} diff --git a/vendor/github.com/docker/docker/pkg/archive/changes_linux.go b/vendor/github.com/docker/docker/pkg/archive/changes_linux.go deleted file mode 100644 index fc5a9dfdb..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/changes_linux.go +++ /dev/null @@ -1,312 +0,0 @@ -package archive - -import ( - "bytes" - "fmt" - "os" - "path/filepath" - "sort" - "syscall" - "unsafe" - - "github.com/docker/docker/pkg/system" -) - -// walker is used to implement collectFileInfoForChanges on linux. Where this -// method in general returns the entire contents of two directory trees, we -// optimize some FS calls out on linux. In particular, we take advantage of the -// fact that getdents(2) returns the inode of each file in the directory being -// walked, which, when walking two trees in parallel to generate a list of -// changes, can be used to prune subtrees without ever having to lstat(2) them -// directly. Eliminating stat calls in this way can save up to seconds on large -// images. -type walker struct { - dir1 string - dir2 string - root1 *FileInfo - root2 *FileInfo -} - -// collectFileInfoForChanges returns a complete representation of the trees -// rooted at dir1 and dir2, with one important exception: any subtree or -// leaf where the inode and device numbers are an exact match between dir1 -// and dir2 will be pruned from the results. This method is *only* to be used -// to generating a list of changes between the two directories, as it does not -// reflect the full contents. -func collectFileInfoForChanges(dir1, dir2 string) (*FileInfo, *FileInfo, error) { - w := &walker{ - dir1: dir1, - dir2: dir2, - root1: newRootFileInfo(), - root2: newRootFileInfo(), - } - - i1, err := os.Lstat(w.dir1) - if err != nil { - return nil, nil, err - } - i2, err := os.Lstat(w.dir2) - if err != nil { - return nil, nil, err - } - - if err := w.walk("/", i1, i2); err != nil { - return nil, nil, err - } - - return w.root1, w.root2, nil -} - -// Given a FileInfo, its path info, and a reference to the root of the tree -// being constructed, register this file with the tree. -func walkchunk(path string, fi os.FileInfo, dir string, root *FileInfo) error { - if fi == nil { - return nil - } - parent := root.LookUp(filepath.Dir(path)) - if parent == nil { - return fmt.Errorf("collectFileInfoForChanges: Unexpectedly no parent for %s", path) - } - info := &FileInfo{ - name: filepath.Base(path), - children: make(map[string]*FileInfo), - parent: parent, - } - cpath := filepath.Join(dir, path) - stat, err := system.FromStatT(fi.Sys().(*syscall.Stat_t)) - if err != nil { - return err - } - info.stat = stat - info.capability, _ = system.Lgetxattr(cpath, "security.capability") // lgetxattr(2): fs access - parent.children[info.name] = info - return nil -} - -// Walk a subtree rooted at the same path in both trees being iterated. For -// example, /docker/overlay/1234/a/b/c/d and /docker/overlay/8888/a/b/c/d -func (w *walker) walk(path string, i1, i2 os.FileInfo) (err error) { - // Register these nodes with the return trees, unless we're still at the - // (already-created) roots: - if path != "/" { - if err := walkchunk(path, i1, w.dir1, w.root1); err != nil { - return err - } - if err := walkchunk(path, i2, w.dir2, w.root2); err != nil { - return err - } - } - - is1Dir := i1 != nil && i1.IsDir() - is2Dir := i2 != nil && i2.IsDir() - - sameDevice := false - if i1 != nil && i2 != nil { - si1 := i1.Sys().(*syscall.Stat_t) - si2 := i2.Sys().(*syscall.Stat_t) - if si1.Dev == si2.Dev { - sameDevice = true - } - } - - // If these files are both non-existent, or leaves (non-dirs), we are done. - if !is1Dir && !is2Dir { - return nil - } - - // Fetch the names of all the files contained in both directories being walked: - var names1, names2 []nameIno - if is1Dir { - names1, err = readdirnames(filepath.Join(w.dir1, path)) // getdents(2): fs access - if err != nil { - return err - } - } - if is2Dir { - names2, err = readdirnames(filepath.Join(w.dir2, path)) // getdents(2): fs access - if err != nil { - return err - } - } - - // We have lists of the files contained in both parallel directories, sorted - // in the same order. Walk them in parallel, generating a unique merged list - // of all items present in either or both directories. - var names []string - ix1 := 0 - ix2 := 0 - - for { - if ix1 >= len(names1) { - break - } - if ix2 >= len(names2) { - break - } - - ni1 := names1[ix1] - ni2 := names2[ix2] - - switch bytes.Compare([]byte(ni1.name), []byte(ni2.name)) { - case -1: // ni1 < ni2 -- advance ni1 - // we will not encounter ni1 in names2 - names = append(names, ni1.name) - ix1++ - case 0: // ni1 == ni2 - if ni1.ino != ni2.ino || !sameDevice { - names = append(names, ni1.name) - } - ix1++ - ix2++ - case 1: // ni1 > ni2 -- advance ni2 - // we will not encounter ni2 in names1 - names = append(names, ni2.name) - ix2++ - } - } - for ix1 < len(names1) { - names = append(names, names1[ix1].name) - ix1++ - } - for ix2 < len(names2) { - names = append(names, names2[ix2].name) - ix2++ - } - - // For each of the names present in either or both of the directories being - // iterated, stat the name under each root, and recurse the pair of them: - for _, name := range names { - fname := filepath.Join(path, name) - var cInfo1, cInfo2 os.FileInfo - if is1Dir { - cInfo1, err = os.Lstat(filepath.Join(w.dir1, fname)) // lstat(2): fs access - if err != nil && !os.IsNotExist(err) { - return err - } - } - if is2Dir { - cInfo2, err = os.Lstat(filepath.Join(w.dir2, fname)) // lstat(2): fs access - if err != nil && !os.IsNotExist(err) { - return err - } - } - if err = w.walk(fname, cInfo1, cInfo2); err != nil { - return err - } - } - return nil -} - -// {name,inode} pairs used to support the early-pruning logic of the walker type -type nameIno struct { - name string - ino uint64 -} - -type nameInoSlice []nameIno - -func (s nameInoSlice) Len() int { return len(s) } -func (s nameInoSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s nameInoSlice) Less(i, j int) bool { return s[i].name < s[j].name } - -// readdirnames is a hacked-apart version of the Go stdlib code, exposing inode -// numbers further up the stack when reading directory contents. Unlike -// os.Readdirnames, which returns a list of filenames, this function returns a -// list of {filename,inode} pairs. -func readdirnames(dirname string) (names []nameIno, err error) { - var ( - size = 100 - buf = make([]byte, 4096) - nbuf int - bufp int - nb int - ) - - f, err := os.Open(dirname) - if err != nil { - return nil, err - } - defer f.Close() - - names = make([]nameIno, 0, size) // Empty with room to grow. - for { - // Refill the buffer if necessary - if bufp >= nbuf { - bufp = 0 - nbuf, err = syscall.ReadDirent(int(f.Fd()), buf) // getdents on linux - if nbuf < 0 { - nbuf = 0 - } - if err != nil { - return nil, os.NewSyscallError("readdirent", err) - } - if nbuf <= 0 { - break // EOF - } - } - - // Drain the buffer - nb, names = parseDirent(buf[bufp:nbuf], names) - bufp += nb - } - - sl := nameInoSlice(names) - sort.Sort(sl) - return sl, nil -} - -// parseDirent is a minor modification of syscall.ParseDirent (linux version) -// which returns {name,inode} pairs instead of just names. -func parseDirent(buf []byte, names []nameIno) (consumed int, newnames []nameIno) { - origlen := len(buf) - for len(buf) > 0 { - dirent := (*syscall.Dirent)(unsafe.Pointer(&buf[0])) - buf = buf[dirent.Reclen:] - if dirent.Ino == 0 { // File absent in directory. - continue - } - bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) - var name = string(bytes[0:clen(bytes[:])]) - if name == "." || name == ".." { // Useless names - continue - } - names = append(names, nameIno{name, dirent.Ino}) - } - return origlen - len(buf), names -} - -func clen(n []byte) int { - for i := 0; i < len(n); i++ { - if n[i] == 0 { - return i - } - } - return len(n) -} - -// OverlayChanges walks the path rw and determines changes for the files in the path, -// with respect to the parent layers -func OverlayChanges(layers []string, rw string) ([]Change, error) { - return changes(layers, rw, overlayDeletedFile, nil) -} - -func overlayDeletedFile(root, path string, fi os.FileInfo) (string, error) { - if fi.Mode()&os.ModeCharDevice != 0 { - s := fi.Sys().(*syscall.Stat_t) - if major(uint64(s.Rdev)) == 0 && minor(uint64(s.Rdev)) == 0 { - return path, nil - } - } - if fi.Mode()&os.ModeDir != 0 { - opaque, err := system.Lgetxattr(filepath.Join(root, path), "trusted.overlay.opaque") - if err != nil { - return "", err - } - if len(opaque) == 1 && opaque[0] == 'y' { - return path, nil - } - } - - return "", nil - -} diff --git a/vendor/github.com/docker/docker/pkg/archive/changes_other.go b/vendor/github.com/docker/docker/pkg/archive/changes_other.go deleted file mode 100644 index da70ed37c..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/changes_other.go +++ /dev/null @@ -1,97 +0,0 @@ -// +build !linux - -package archive - -import ( - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - - "github.com/docker/docker/pkg/system" -) - -func collectFileInfoForChanges(oldDir, newDir string) (*FileInfo, *FileInfo, error) { - var ( - oldRoot, newRoot *FileInfo - err1, err2 error - errs = make(chan error, 2) - ) - go func() { - oldRoot, err1 = collectFileInfo(oldDir) - errs <- err1 - }() - go func() { - newRoot, err2 = collectFileInfo(newDir) - errs <- err2 - }() - - // block until both routines have returned - for i := 0; i < 2; i++ { - if err := <-errs; err != nil { - return nil, nil, err - } - } - - return oldRoot, newRoot, nil -} - -func collectFileInfo(sourceDir string) (*FileInfo, error) { - root := newRootFileInfo() - - err := filepath.Walk(sourceDir, func(path string, f os.FileInfo, err error) error { - if err != nil { - return err - } - - // Rebase path - relPath, err := filepath.Rel(sourceDir, path) - if err != nil { - return err - } - - // As this runs on the daemon side, file paths are OS specific. - relPath = filepath.Join(string(os.PathSeparator), relPath) - - // See https://github.com/golang/go/issues/9168 - bug in filepath.Join. - // Temporary workaround. If the returned path starts with two backslashes, - // trim it down to a single backslash. Only relevant on Windows. - if runtime.GOOS == "windows" { - if strings.HasPrefix(relPath, `\\`) { - relPath = relPath[1:] - } - } - - if relPath == string(os.PathSeparator) { - return nil - } - - parent := root.LookUp(filepath.Dir(relPath)) - if parent == nil { - return fmt.Errorf("collectFileInfo: Unexpectedly no parent for %s", relPath) - } - - info := &FileInfo{ - name: filepath.Base(relPath), - children: make(map[string]*FileInfo), - parent: parent, - } - - s, err := system.Lstat(path) - if err != nil { - return err - } - info.stat = s - - info.capability, _ = system.Lgetxattr(path, "security.capability") - - parent.children[info.name] = info - - return nil - }) - if err != nil { - return nil, err - } - return root, nil -} diff --git a/vendor/github.com/docker/docker/pkg/archive/changes_posix_test.go b/vendor/github.com/docker/docker/pkg/archive/changes_posix_test.go deleted file mode 100644 index 095102e57..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/changes_posix_test.go +++ /dev/null @@ -1,132 +0,0 @@ -package archive - -import ( - "archive/tar" - "fmt" - "io" - "io/ioutil" - "os" - "path" - "runtime" - "sort" - "testing" -) - -func TestHardLinkOrder(t *testing.T) { - //TODO Should run for Solaris - if runtime.GOOS == "solaris" { - t.Skip("gcp failures on Solaris") - } - names := []string{"file1.txt", "file2.txt", "file3.txt"} - msg := []byte("Hey y'all") - - // Create dir - src, err := ioutil.TempDir("", "docker-hardlink-test-src-") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(src) - for _, name := range names { - func() { - fh, err := os.Create(path.Join(src, name)) - if err != nil { - t.Fatal(err) - } - defer fh.Close() - if _, err = fh.Write(msg); err != nil { - t.Fatal(err) - } - }() - } - // Create dest, with changes that includes hardlinks - dest, err := ioutil.TempDir("", "docker-hardlink-test-dest-") - if err != nil { - t.Fatal(err) - } - os.RemoveAll(dest) // we just want the name, at first - if err := copyDir(src, dest); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dest) - for _, name := range names { - for i := 0; i < 5; i++ { - if err := os.Link(path.Join(dest, name), path.Join(dest, fmt.Sprintf("%s.link%d", name, i))); err != nil { - t.Fatal(err) - } - } - } - - // get changes - changes, err := ChangesDirs(dest, src) - if err != nil { - t.Fatal(err) - } - - // sort - sort.Sort(changesByPath(changes)) - - // ExportChanges - ar, err := ExportChanges(dest, changes, nil, nil) - if err != nil { - t.Fatal(err) - } - hdrs, err := walkHeaders(ar) - if err != nil { - t.Fatal(err) - } - - // reverse sort - sort.Sort(sort.Reverse(changesByPath(changes))) - // ExportChanges - arRev, err := ExportChanges(dest, changes, nil, nil) - if err != nil { - t.Fatal(err) - } - hdrsRev, err := walkHeaders(arRev) - if err != nil { - t.Fatal(err) - } - - // line up the two sets - sort.Sort(tarHeaders(hdrs)) - sort.Sort(tarHeaders(hdrsRev)) - - // compare Size and LinkName - for i := range hdrs { - if hdrs[i].Name != hdrsRev[i].Name { - t.Errorf("headers - expected name %q; but got %q", hdrs[i].Name, hdrsRev[i].Name) - } - if hdrs[i].Size != hdrsRev[i].Size { - t.Errorf("headers - %q expected size %d; but got %d", hdrs[i].Name, hdrs[i].Size, hdrsRev[i].Size) - } - if hdrs[i].Typeflag != hdrsRev[i].Typeflag { - t.Errorf("headers - %q expected type %d; but got %d", hdrs[i].Name, hdrs[i].Typeflag, hdrsRev[i].Typeflag) - } - if hdrs[i].Linkname != hdrsRev[i].Linkname { - t.Errorf("headers - %q expected linkname %q; but got %q", hdrs[i].Name, hdrs[i].Linkname, hdrsRev[i].Linkname) - } - } - -} - -type tarHeaders []tar.Header - -func (th tarHeaders) Len() int { return len(th) } -func (th tarHeaders) Swap(i, j int) { th[j], th[i] = th[i], th[j] } -func (th tarHeaders) Less(i, j int) bool { return th[i].Name < th[j].Name } - -func walkHeaders(r io.Reader) ([]tar.Header, error) { - t := tar.NewReader(r) - headers := []tar.Header{} - for { - hdr, err := t.Next() - if err != nil { - if err == io.EOF { - break - } - return headers, err - } - headers = append(headers, *hdr) - } - return headers, nil -} diff --git a/vendor/github.com/docker/docker/pkg/archive/changes_test.go b/vendor/github.com/docker/docker/pkg/archive/changes_test.go deleted file mode 100644 index eae1d022c..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/changes_test.go +++ /dev/null @@ -1,572 +0,0 @@ -package archive - -import ( - "io/ioutil" - "os" - "os/exec" - "path" - "runtime" - "sort" - "testing" - "time" - - "github.com/docker/docker/pkg/system" -) - -func max(x, y int) int { - if x >= y { - return x - } - return y -} - -func copyDir(src, dst string) error { - cmd := exec.Command("cp", "-a", src, dst) - if runtime.GOOS == "solaris" { - cmd = exec.Command("gcp", "-a", src, dst) - } - - if err := cmd.Run(); err != nil { - return err - } - return nil -} - -type FileType uint32 - -const ( - Regular FileType = iota - Dir - Symlink -) - -type FileData struct { - filetype FileType - path string - contents string - permissions os.FileMode -} - -func createSampleDir(t *testing.T, root string) { - files := []FileData{ - {Regular, "file1", "file1\n", 0600}, - {Regular, "file2", "file2\n", 0666}, - {Regular, "file3", "file3\n", 0404}, - {Regular, "file4", "file4\n", 0600}, - {Regular, "file5", "file5\n", 0600}, - {Regular, "file6", "file6\n", 0600}, - {Regular, "file7", "file7\n", 0600}, - {Dir, "dir1", "", 0740}, - {Regular, "dir1/file1-1", "file1-1\n", 01444}, - {Regular, "dir1/file1-2", "file1-2\n", 0666}, - {Dir, "dir2", "", 0700}, - {Regular, "dir2/file2-1", "file2-1\n", 0666}, - {Regular, "dir2/file2-2", "file2-2\n", 0666}, - {Dir, "dir3", "", 0700}, - {Regular, "dir3/file3-1", "file3-1\n", 0666}, - {Regular, "dir3/file3-2", "file3-2\n", 0666}, - {Dir, "dir4", "", 0700}, - {Regular, "dir4/file3-1", "file4-1\n", 0666}, - {Regular, "dir4/file3-2", "file4-2\n", 0666}, - {Symlink, "symlink1", "target1", 0666}, - {Symlink, "symlink2", "target2", 0666}, - {Symlink, "symlink3", root + "/file1", 0666}, - {Symlink, "symlink4", root + "/symlink3", 0666}, - {Symlink, "dirSymlink", root + "/dir1", 0740}, - } - - now := time.Now() - for _, info := range files { - p := path.Join(root, info.path) - if info.filetype == Dir { - if err := os.MkdirAll(p, info.permissions); err != nil { - t.Fatal(err) - } - } else if info.filetype == Regular { - if err := ioutil.WriteFile(p, []byte(info.contents), info.permissions); err != nil { - t.Fatal(err) - } - } else if info.filetype == Symlink { - if err := os.Symlink(info.contents, p); err != nil { - t.Fatal(err) - } - } - - if info.filetype != Symlink { - // Set a consistent ctime, atime for all files and dirs - if err := system.Chtimes(p, now, now); err != nil { - t.Fatal(err) - } - } - } -} - -func TestChangeString(t *testing.T) { - modifiyChange := Change{"change", ChangeModify} - toString := modifiyChange.String() - if toString != "C change" { - t.Fatalf("String() of a change with ChangeModifiy Kind should have been %s but was %s", "C change", toString) - } - addChange := Change{"change", ChangeAdd} - toString = addChange.String() - if toString != "A change" { - t.Fatalf("String() of a change with ChangeAdd Kind should have been %s but was %s", "A change", toString) - } - deleteChange := Change{"change", ChangeDelete} - toString = deleteChange.String() - if toString != "D change" { - t.Fatalf("String() of a change with ChangeDelete Kind should have been %s but was %s", "D change", toString) - } -} - -func TestChangesWithNoChanges(t *testing.T) { - // TODO Windows. There may be a way of running this, but turning off for now - // as createSampleDir uses symlinks. - if runtime.GOOS == "windows" { - t.Skip("symlinks on Windows") - } - rwLayer, err := ioutil.TempDir("", "docker-changes-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(rwLayer) - layer, err := ioutil.TempDir("", "docker-changes-test-layer") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(layer) - createSampleDir(t, layer) - changes, err := Changes([]string{layer}, rwLayer) - if err != nil { - t.Fatal(err) - } - if len(changes) != 0 { - t.Fatalf("Changes with no difference should have detect no changes, but detected %d", len(changes)) - } -} - -func TestChangesWithChanges(t *testing.T) { - // TODO Windows. There may be a way of running this, but turning off for now - // as createSampleDir uses symlinks. - if runtime.GOOS == "windows" { - t.Skip("symlinks on Windows") - } - // Mock the readonly layer - layer, err := ioutil.TempDir("", "docker-changes-test-layer") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(layer) - createSampleDir(t, layer) - os.MkdirAll(path.Join(layer, "dir1/subfolder"), 0740) - - // Mock the RW layer - rwLayer, err := ioutil.TempDir("", "docker-changes-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(rwLayer) - - // Create a folder in RW layer - dir1 := path.Join(rwLayer, "dir1") - os.MkdirAll(dir1, 0740) - deletedFile := path.Join(dir1, ".wh.file1-2") - ioutil.WriteFile(deletedFile, []byte{}, 0600) - modifiedFile := path.Join(dir1, "file1-1") - ioutil.WriteFile(modifiedFile, []byte{0x00}, 01444) - // Let's add a subfolder for a newFile - subfolder := path.Join(dir1, "subfolder") - os.MkdirAll(subfolder, 0740) - newFile := path.Join(subfolder, "newFile") - ioutil.WriteFile(newFile, []byte{}, 0740) - - changes, err := Changes([]string{layer}, rwLayer) - if err != nil { - t.Fatal(err) - } - - expectedChanges := []Change{ - {"/dir1", ChangeModify}, - {"/dir1/file1-1", ChangeModify}, - {"/dir1/file1-2", ChangeDelete}, - {"/dir1/subfolder", ChangeModify}, - {"/dir1/subfolder/newFile", ChangeAdd}, - } - checkChanges(expectedChanges, changes, t) -} - -// See https://github.com/docker/docker/pull/13590 -func TestChangesWithChangesGH13590(t *testing.T) { - // TODO Windows. There may be a way of running this, but turning off for now - // as createSampleDir uses symlinks. - if runtime.GOOS == "windows" { - t.Skip("symlinks on Windows") - } - baseLayer, err := ioutil.TempDir("", "docker-changes-test.") - defer os.RemoveAll(baseLayer) - - dir3 := path.Join(baseLayer, "dir1/dir2/dir3") - os.MkdirAll(dir3, 07400) - - file := path.Join(dir3, "file.txt") - ioutil.WriteFile(file, []byte("hello"), 0666) - - layer, err := ioutil.TempDir("", "docker-changes-test2.") - defer os.RemoveAll(layer) - - // Test creating a new file - if err := copyDir(baseLayer+"/dir1", layer+"/"); err != nil { - t.Fatalf("Cmd failed: %q", err) - } - - os.Remove(path.Join(layer, "dir1/dir2/dir3/file.txt")) - file = path.Join(layer, "dir1/dir2/dir3/file1.txt") - ioutil.WriteFile(file, []byte("bye"), 0666) - - changes, err := Changes([]string{baseLayer}, layer) - if err != nil { - t.Fatal(err) - } - - expectedChanges := []Change{ - {"/dir1/dir2/dir3", ChangeModify}, - {"/dir1/dir2/dir3/file1.txt", ChangeAdd}, - } - checkChanges(expectedChanges, changes, t) - - // Now test changing a file - layer, err = ioutil.TempDir("", "docker-changes-test3.") - defer os.RemoveAll(layer) - - if err := copyDir(baseLayer+"/dir1", layer+"/"); err != nil { - t.Fatalf("Cmd failed: %q", err) - } - - file = path.Join(layer, "dir1/dir2/dir3/file.txt") - ioutil.WriteFile(file, []byte("bye"), 0666) - - changes, err = Changes([]string{baseLayer}, layer) - if err != nil { - t.Fatal(err) - } - - expectedChanges = []Change{ - {"/dir1/dir2/dir3/file.txt", ChangeModify}, - } - checkChanges(expectedChanges, changes, t) -} - -// Create a directory, copy it, make sure we report no changes between the two -func TestChangesDirsEmpty(t *testing.T) { - // TODO Windows. There may be a way of running this, but turning off for now - // as createSampleDir uses symlinks. - // TODO Should work for Solaris - if runtime.GOOS == "windows" || runtime.GOOS == "solaris" { - t.Skip("symlinks on Windows; gcp failure on Solaris") - } - src, err := ioutil.TempDir("", "docker-changes-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(src) - createSampleDir(t, src) - dst := src + "-copy" - if err := copyDir(src, dst); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dst) - changes, err := ChangesDirs(dst, src) - if err != nil { - t.Fatal(err) - } - - if len(changes) != 0 { - t.Fatalf("Reported changes for identical dirs: %v", changes) - } - os.RemoveAll(src) - os.RemoveAll(dst) -} - -func mutateSampleDir(t *testing.T, root string) { - // Remove a regular file - if err := os.RemoveAll(path.Join(root, "file1")); err != nil { - t.Fatal(err) - } - - // Remove a directory - if err := os.RemoveAll(path.Join(root, "dir1")); err != nil { - t.Fatal(err) - } - - // Remove a symlink - if err := os.RemoveAll(path.Join(root, "symlink1")); err != nil { - t.Fatal(err) - } - - // Rewrite a file - if err := ioutil.WriteFile(path.Join(root, "file2"), []byte("fileNN\n"), 0777); err != nil { - t.Fatal(err) - } - - // Replace a file - if err := os.RemoveAll(path.Join(root, "file3")); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(path.Join(root, "file3"), []byte("fileMM\n"), 0404); err != nil { - t.Fatal(err) - } - - // Touch file - if err := system.Chtimes(path.Join(root, "file4"), time.Now().Add(time.Second), time.Now().Add(time.Second)); err != nil { - t.Fatal(err) - } - - // Replace file with dir - if err := os.RemoveAll(path.Join(root, "file5")); err != nil { - t.Fatal(err) - } - if err := os.MkdirAll(path.Join(root, "file5"), 0666); err != nil { - t.Fatal(err) - } - - // Create new file - if err := ioutil.WriteFile(path.Join(root, "filenew"), []byte("filenew\n"), 0777); err != nil { - t.Fatal(err) - } - - // Create new dir - if err := os.MkdirAll(path.Join(root, "dirnew"), 0766); err != nil { - t.Fatal(err) - } - - // Create a new symlink - if err := os.Symlink("targetnew", path.Join(root, "symlinknew")); err != nil { - t.Fatal(err) - } - - // Change a symlink - if err := os.RemoveAll(path.Join(root, "symlink2")); err != nil { - t.Fatal(err) - } - if err := os.Symlink("target2change", path.Join(root, "symlink2")); err != nil { - t.Fatal(err) - } - - // Replace dir with file - if err := os.RemoveAll(path.Join(root, "dir2")); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(path.Join(root, "dir2"), []byte("dir2\n"), 0777); err != nil { - t.Fatal(err) - } - - // Touch dir - if err := system.Chtimes(path.Join(root, "dir3"), time.Now().Add(time.Second), time.Now().Add(time.Second)); err != nil { - t.Fatal(err) - } -} - -func TestChangesDirsMutated(t *testing.T) { - // TODO Windows. There may be a way of running this, but turning off for now - // as createSampleDir uses symlinks. - // TODO Should work for Solaris - if runtime.GOOS == "windows" || runtime.GOOS == "solaris" { - t.Skip("symlinks on Windows; gcp failures on Solaris") - } - src, err := ioutil.TempDir("", "docker-changes-test") - if err != nil { - t.Fatal(err) - } - createSampleDir(t, src) - dst := src + "-copy" - if err := copyDir(src, dst); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(src) - defer os.RemoveAll(dst) - - mutateSampleDir(t, dst) - - changes, err := ChangesDirs(dst, src) - if err != nil { - t.Fatal(err) - } - - sort.Sort(changesByPath(changes)) - - expectedChanges := []Change{ - {"/dir1", ChangeDelete}, - {"/dir2", ChangeModify}, - {"/dirnew", ChangeAdd}, - {"/file1", ChangeDelete}, - {"/file2", ChangeModify}, - {"/file3", ChangeModify}, - {"/file4", ChangeModify}, - {"/file5", ChangeModify}, - {"/filenew", ChangeAdd}, - {"/symlink1", ChangeDelete}, - {"/symlink2", ChangeModify}, - {"/symlinknew", ChangeAdd}, - } - - for i := 0; i < max(len(changes), len(expectedChanges)); i++ { - if i >= len(expectedChanges) { - t.Fatalf("unexpected change %s\n", changes[i].String()) - } - if i >= len(changes) { - t.Fatalf("no change for expected change %s\n", expectedChanges[i].String()) - } - if changes[i].Path == expectedChanges[i].Path { - if changes[i] != expectedChanges[i] { - t.Fatalf("Wrong change for %s, expected %s, got %s\n", changes[i].Path, changes[i].String(), expectedChanges[i].String()) - } - } else if changes[i].Path < expectedChanges[i].Path { - t.Fatalf("unexpected change %s\n", changes[i].String()) - } else { - t.Fatalf("no change for expected change %s != %s\n", expectedChanges[i].String(), changes[i].String()) - } - } -} - -func TestApplyLayer(t *testing.T) { - // TODO Windows. There may be a way of running this, but turning off for now - // as createSampleDir uses symlinks. - // TODO Should work for Solaris - if runtime.GOOS == "windows" || runtime.GOOS == "solaris" { - t.Skip("symlinks on Windows; gcp failures on Solaris") - } - src, err := ioutil.TempDir("", "docker-changes-test") - if err != nil { - t.Fatal(err) - } - createSampleDir(t, src) - defer os.RemoveAll(src) - dst := src + "-copy" - if err := copyDir(src, dst); err != nil { - t.Fatal(err) - } - mutateSampleDir(t, dst) - defer os.RemoveAll(dst) - - changes, err := ChangesDirs(dst, src) - if err != nil { - t.Fatal(err) - } - - layer, err := ExportChanges(dst, changes, nil, nil) - if err != nil { - t.Fatal(err) - } - - layerCopy, err := NewTempArchive(layer, "") - if err != nil { - t.Fatal(err) - } - - if _, err := ApplyLayer(src, layerCopy); err != nil { - t.Fatal(err) - } - - changes2, err := ChangesDirs(src, dst) - if err != nil { - t.Fatal(err) - } - - if len(changes2) != 0 { - t.Fatalf("Unexpected differences after reapplying mutation: %v", changes2) - } -} - -func TestChangesSizeWithHardlinks(t *testing.T) { - // TODO Windows. There may be a way of running this, but turning off for now - // as createSampleDir uses symlinks. - if runtime.GOOS == "windows" { - t.Skip("hardlinks on Windows") - } - srcDir, err := ioutil.TempDir("", "docker-test-srcDir") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(srcDir) - - destDir, err := ioutil.TempDir("", "docker-test-destDir") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(destDir) - - creationSize, err := prepareUntarSourceDirectory(100, destDir, true) - if err != nil { - t.Fatal(err) - } - - changes, err := ChangesDirs(destDir, srcDir) - if err != nil { - t.Fatal(err) - } - - got := ChangesSize(destDir, changes) - if got != int64(creationSize) { - t.Errorf("Expected %d bytes of changes, got %d", creationSize, got) - } -} - -func TestChangesSizeWithNoChanges(t *testing.T) { - size := ChangesSize("/tmp", nil) - if size != 0 { - t.Fatalf("ChangesSizes with no changes should be 0, was %d", size) - } -} - -func TestChangesSizeWithOnlyDeleteChanges(t *testing.T) { - changes := []Change{ - {Path: "deletedPath", Kind: ChangeDelete}, - } - size := ChangesSize("/tmp", changes) - if size != 0 { - t.Fatalf("ChangesSizes with only delete changes should be 0, was %d", size) - } -} - -func TestChangesSize(t *testing.T) { - parentPath, err := ioutil.TempDir("", "docker-changes-test") - defer os.RemoveAll(parentPath) - addition := path.Join(parentPath, "addition") - if err := ioutil.WriteFile(addition, []byte{0x01, 0x01, 0x01}, 0744); err != nil { - t.Fatal(err) - } - modification := path.Join(parentPath, "modification") - if err = ioutil.WriteFile(modification, []byte{0x01, 0x01, 0x01}, 0744); err != nil { - t.Fatal(err) - } - changes := []Change{ - {Path: "addition", Kind: ChangeAdd}, - {Path: "modification", Kind: ChangeModify}, - } - size := ChangesSize(parentPath, changes) - if size != 6 { - t.Fatalf("Expected 6 bytes of changes, got %d", size) - } -} - -func checkChanges(expectedChanges, changes []Change, t *testing.T) { - sort.Sort(changesByPath(expectedChanges)) - sort.Sort(changesByPath(changes)) - for i := 0; i < max(len(changes), len(expectedChanges)); i++ { - if i >= len(expectedChanges) { - t.Fatalf("unexpected change %s\n", changes[i].String()) - } - if i >= len(changes) { - t.Fatalf("no change for expected change %s\n", expectedChanges[i].String()) - } - if changes[i].Path == expectedChanges[i].Path { - if changes[i] != expectedChanges[i] { - t.Fatalf("Wrong change for %s, expected %s, got %s\n", changes[i].Path, changes[i].String(), expectedChanges[i].String()) - } - } else if changes[i].Path < expectedChanges[i].Path { - t.Fatalf("unexpected change %s\n", changes[i].String()) - } else { - t.Fatalf("no change for expected change %s != %s\n", expectedChanges[i].String(), changes[i].String()) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/archive/changes_unix.go b/vendor/github.com/docker/docker/pkg/archive/changes_unix.go deleted file mode 100644 index 3778b732c..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/changes_unix.go +++ /dev/null @@ -1,36 +0,0 @@ -// +build !windows - -package archive - -import ( - "os" - "syscall" - - "github.com/docker/docker/pkg/system" -) - -func statDifferent(oldStat *system.StatT, newStat *system.StatT) bool { - // Don't look at size for dirs, its not a good measure of change - if oldStat.Mode() != newStat.Mode() || - oldStat.UID() != newStat.UID() || - oldStat.GID() != newStat.GID() || - oldStat.Rdev() != newStat.Rdev() || - // Don't look at size for dirs, its not a good measure of change - (oldStat.Mode()&syscall.S_IFDIR != syscall.S_IFDIR && - (!sameFsTimeSpec(oldStat.Mtim(), newStat.Mtim()) || (oldStat.Size() != newStat.Size()))) { - return true - } - return false -} - -func (info *FileInfo) isDir() bool { - return info.parent == nil || info.stat.Mode()&syscall.S_IFDIR != 0 -} - -func getIno(fi os.FileInfo) uint64 { - return uint64(fi.Sys().(*syscall.Stat_t).Ino) -} - -func hasHardlinks(fi os.FileInfo) bool { - return fi.Sys().(*syscall.Stat_t).Nlink > 1 -} diff --git a/vendor/github.com/docker/docker/pkg/archive/changes_windows.go b/vendor/github.com/docker/docker/pkg/archive/changes_windows.go deleted file mode 100644 index af94243fc..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/changes_windows.go +++ /dev/null @@ -1,30 +0,0 @@ -package archive - -import ( - "os" - - "github.com/docker/docker/pkg/system" -) - -func statDifferent(oldStat *system.StatT, newStat *system.StatT) bool { - - // Don't look at size for dirs, its not a good measure of change - if oldStat.ModTime() != newStat.ModTime() || - oldStat.Mode() != newStat.Mode() || - oldStat.Size() != newStat.Size() && !oldStat.IsDir() { - return true - } - return false -} - -func (info *FileInfo) isDir() bool { - return info.parent == nil || info.stat.IsDir() -} - -func getIno(fi os.FileInfo) (inode uint64) { - return -} - -func hasHardlinks(fi os.FileInfo) bool { - return false -} diff --git a/vendor/github.com/docker/docker/pkg/archive/copy.go b/vendor/github.com/docker/docker/pkg/archive/copy.go deleted file mode 100644 index 0614c67ce..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/copy.go +++ /dev/null @@ -1,458 +0,0 @@ -package archive - -import ( - "archive/tar" - "errors" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/system" -) - -// Errors used or returned by this file. -var ( - ErrNotDirectory = errors.New("not a directory") - ErrDirNotExists = errors.New("no such directory") - ErrCannotCopyDir = errors.New("cannot copy directory") - ErrInvalidCopySource = errors.New("invalid copy source content") -) - -// PreserveTrailingDotOrSeparator returns the given cleaned path (after -// processing using any utility functions from the path or filepath stdlib -// packages) and appends a trailing `/.` or `/` if its corresponding original -// path (from before being processed by utility functions from the path or -// filepath stdlib packages) ends with a trailing `/.` or `/`. If the cleaned -// path already ends in a `.` path segment, then another is not added. If the -// clean path already ends in a path separator, then another is not added. -func PreserveTrailingDotOrSeparator(cleanedPath, originalPath string) string { - // Ensure paths are in platform semantics - cleanedPath = normalizePath(cleanedPath) - originalPath = normalizePath(originalPath) - - if !specifiesCurrentDir(cleanedPath) && specifiesCurrentDir(originalPath) { - if !hasTrailingPathSeparator(cleanedPath) { - // Add a separator if it doesn't already end with one (a cleaned - // path would only end in a separator if it is the root). - cleanedPath += string(filepath.Separator) - } - cleanedPath += "." - } - - if !hasTrailingPathSeparator(cleanedPath) && hasTrailingPathSeparator(originalPath) { - cleanedPath += string(filepath.Separator) - } - - return cleanedPath -} - -// assertsDirectory returns whether the given path is -// asserted to be a directory, i.e., the path ends with -// a trailing '/' or `/.`, assuming a path separator of `/`. -func assertsDirectory(path string) bool { - return hasTrailingPathSeparator(path) || specifiesCurrentDir(path) -} - -// hasTrailingPathSeparator returns whether the given -// path ends with the system's path separator character. -func hasTrailingPathSeparator(path string) bool { - return len(path) > 0 && os.IsPathSeparator(path[len(path)-1]) -} - -// specifiesCurrentDir returns whether the given path specifies -// a "current directory", i.e., the last path segment is `.`. -func specifiesCurrentDir(path string) bool { - return filepath.Base(path) == "." -} - -// SplitPathDirEntry splits the given path between its directory name and its -// basename by first cleaning the path but preserves a trailing "." if the -// original path specified the current directory. -func SplitPathDirEntry(path string) (dir, base string) { - cleanedPath := filepath.Clean(normalizePath(path)) - - if specifiesCurrentDir(path) { - cleanedPath += string(filepath.Separator) + "." - } - - return filepath.Dir(cleanedPath), filepath.Base(cleanedPath) -} - -// TarResource archives the resource described by the given CopyInfo to a Tar -// archive. A non-nil error is returned if sourcePath does not exist or is -// asserted to be a directory but exists as another type of file. -// -// This function acts as a convenient wrapper around TarWithOptions, which -// requires a directory as the source path. TarResource accepts either a -// directory or a file path and correctly sets the Tar options. -func TarResource(sourceInfo CopyInfo) (content io.ReadCloser, err error) { - return TarResourceRebase(sourceInfo.Path, sourceInfo.RebaseName) -} - -// TarResourceRebase is like TarResource but renames the first path element of -// items in the resulting tar archive to match the given rebaseName if not "". -func TarResourceRebase(sourcePath, rebaseName string) (content io.ReadCloser, err error) { - sourcePath = normalizePath(sourcePath) - if _, err = os.Lstat(sourcePath); err != nil { - // Catches the case where the source does not exist or is not a - // directory if asserted to be a directory, as this also causes an - // error. - return - } - - // Separate the source path between its directory and - // the entry in that directory which we are archiving. - sourceDir, sourceBase := SplitPathDirEntry(sourcePath) - - filter := []string{sourceBase} - - logrus.Debugf("copying %q from %q", sourceBase, sourceDir) - - return TarWithOptions(sourceDir, &TarOptions{ - Compression: Uncompressed, - IncludeFiles: filter, - IncludeSourceDir: true, - RebaseNames: map[string]string{ - sourceBase: rebaseName, - }, - }) -} - -// CopyInfo holds basic info about the source -// or destination path of a copy operation. -type CopyInfo struct { - Path string - Exists bool - IsDir bool - RebaseName string -} - -// CopyInfoSourcePath stats the given path to create a CopyInfo -// struct representing that resource for the source of an archive copy -// operation. The given path should be an absolute local path. A source path -// has all symlinks evaluated that appear before the last path separator ("/" -// on Unix). As it is to be a copy source, the path must exist. -func CopyInfoSourcePath(path string, followLink bool) (CopyInfo, error) { - // normalize the file path and then evaluate the symbol link - // we will use the target file instead of the symbol link if - // followLink is set - path = normalizePath(path) - - resolvedPath, rebaseName, err := ResolveHostSourcePath(path, followLink) - if err != nil { - return CopyInfo{}, err - } - - stat, err := os.Lstat(resolvedPath) - if err != nil { - return CopyInfo{}, err - } - - return CopyInfo{ - Path: resolvedPath, - Exists: true, - IsDir: stat.IsDir(), - RebaseName: rebaseName, - }, nil -} - -// CopyInfoDestinationPath stats the given path to create a CopyInfo -// struct representing that resource for the destination of an archive copy -// operation. The given path should be an absolute local path. -func CopyInfoDestinationPath(path string) (info CopyInfo, err error) { - maxSymlinkIter := 10 // filepath.EvalSymlinks uses 255, but 10 already seems like a lot. - path = normalizePath(path) - originalPath := path - - stat, err := os.Lstat(path) - - if err == nil && stat.Mode()&os.ModeSymlink == 0 { - // The path exists and is not a symlink. - return CopyInfo{ - Path: path, - Exists: true, - IsDir: stat.IsDir(), - }, nil - } - - // While the path is a symlink. - for n := 0; err == nil && stat.Mode()&os.ModeSymlink != 0; n++ { - if n > maxSymlinkIter { - // Don't follow symlinks more than this arbitrary number of times. - return CopyInfo{}, errors.New("too many symlinks in " + originalPath) - } - - // The path is a symbolic link. We need to evaluate it so that the - // destination of the copy operation is the link target and not the - // link itself. This is notably different than CopyInfoSourcePath which - // only evaluates symlinks before the last appearing path separator. - // Also note that it is okay if the last path element is a broken - // symlink as the copy operation should create the target. - var linkTarget string - - linkTarget, err = os.Readlink(path) - if err != nil { - return CopyInfo{}, err - } - - if !system.IsAbs(linkTarget) { - // Join with the parent directory. - dstParent, _ := SplitPathDirEntry(path) - linkTarget = filepath.Join(dstParent, linkTarget) - } - - path = linkTarget - stat, err = os.Lstat(path) - } - - if err != nil { - // It's okay if the destination path doesn't exist. We can still - // continue the copy operation if the parent directory exists. - if !os.IsNotExist(err) { - return CopyInfo{}, err - } - - // Ensure destination parent dir exists. - dstParent, _ := SplitPathDirEntry(path) - - parentDirStat, err := os.Lstat(dstParent) - if err != nil { - return CopyInfo{}, err - } - if !parentDirStat.IsDir() { - return CopyInfo{}, ErrNotDirectory - } - - return CopyInfo{Path: path}, nil - } - - // The path exists after resolving symlinks. - return CopyInfo{ - Path: path, - Exists: true, - IsDir: stat.IsDir(), - }, nil -} - -// PrepareArchiveCopy prepares the given srcContent archive, which should -// contain the archived resource described by srcInfo, to the destination -// described by dstInfo. Returns the possibly modified content archive along -// with the path to the destination directory which it should be extracted to. -func PrepareArchiveCopy(srcContent io.Reader, srcInfo, dstInfo CopyInfo) (dstDir string, content io.ReadCloser, err error) { - // Ensure in platform semantics - srcInfo.Path = normalizePath(srcInfo.Path) - dstInfo.Path = normalizePath(dstInfo.Path) - - // Separate the destination path between its directory and base - // components in case the source archive contents need to be rebased. - dstDir, dstBase := SplitPathDirEntry(dstInfo.Path) - _, srcBase := SplitPathDirEntry(srcInfo.Path) - - switch { - case dstInfo.Exists && dstInfo.IsDir: - // The destination exists as a directory. No alteration - // to srcContent is needed as its contents can be - // simply extracted to the destination directory. - return dstInfo.Path, ioutil.NopCloser(srcContent), nil - case dstInfo.Exists && srcInfo.IsDir: - // The destination exists as some type of file and the source - // content is a directory. This is an error condition since - // you cannot copy a directory to an existing file location. - return "", nil, ErrCannotCopyDir - case dstInfo.Exists: - // The destination exists as some type of file and the source content - // is also a file. The source content entry will have to be renamed to - // have a basename which matches the destination path's basename. - if len(srcInfo.RebaseName) != 0 { - srcBase = srcInfo.RebaseName - } - return dstDir, RebaseArchiveEntries(srcContent, srcBase, dstBase), nil - case srcInfo.IsDir: - // The destination does not exist and the source content is an archive - // of a directory. The archive should be extracted to the parent of - // the destination path instead, and when it is, the directory that is - // created as a result should take the name of the destination path. - // The source content entries will have to be renamed to have a - // basename which matches the destination path's basename. - if len(srcInfo.RebaseName) != 0 { - srcBase = srcInfo.RebaseName - } - return dstDir, RebaseArchiveEntries(srcContent, srcBase, dstBase), nil - case assertsDirectory(dstInfo.Path): - // The destination does not exist and is asserted to be created as a - // directory, but the source content is not a directory. This is an - // error condition since you cannot create a directory from a file - // source. - return "", nil, ErrDirNotExists - default: - // The last remaining case is when the destination does not exist, is - // not asserted to be a directory, and the source content is not an - // archive of a directory. It this case, the destination file will need - // to be created when the archive is extracted and the source content - // entry will have to be renamed to have a basename which matches the - // destination path's basename. - if len(srcInfo.RebaseName) != 0 { - srcBase = srcInfo.RebaseName - } - return dstDir, RebaseArchiveEntries(srcContent, srcBase, dstBase), nil - } - -} - -// RebaseArchiveEntries rewrites the given srcContent archive replacing -// an occurrence of oldBase with newBase at the beginning of entry names. -func RebaseArchiveEntries(srcContent io.Reader, oldBase, newBase string) io.ReadCloser { - if oldBase == string(os.PathSeparator) { - // If oldBase specifies the root directory, use an empty string as - // oldBase instead so that newBase doesn't replace the path separator - // that all paths will start with. - oldBase = "" - } - - rebased, w := io.Pipe() - - go func() { - srcTar := tar.NewReader(srcContent) - rebasedTar := tar.NewWriter(w) - - for { - hdr, err := srcTar.Next() - if err == io.EOF { - // Signals end of archive. - rebasedTar.Close() - w.Close() - return - } - if err != nil { - w.CloseWithError(err) - return - } - - hdr.Name = strings.Replace(hdr.Name, oldBase, newBase, 1) - - if err = rebasedTar.WriteHeader(hdr); err != nil { - w.CloseWithError(err) - return - } - - if _, err = io.Copy(rebasedTar, srcTar); err != nil { - w.CloseWithError(err) - return - } - } - }() - - return rebased -} - -// CopyResource performs an archive copy from the given source path to the -// given destination path. The source path MUST exist and the destination -// path's parent directory must exist. -func CopyResource(srcPath, dstPath string, followLink bool) error { - var ( - srcInfo CopyInfo - err error - ) - - // Ensure in platform semantics - srcPath = normalizePath(srcPath) - dstPath = normalizePath(dstPath) - - // Clean the source and destination paths. - srcPath = PreserveTrailingDotOrSeparator(filepath.Clean(srcPath), srcPath) - dstPath = PreserveTrailingDotOrSeparator(filepath.Clean(dstPath), dstPath) - - if srcInfo, err = CopyInfoSourcePath(srcPath, followLink); err != nil { - return err - } - - content, err := TarResource(srcInfo) - if err != nil { - return err - } - defer content.Close() - - return CopyTo(content, srcInfo, dstPath) -} - -// CopyTo handles extracting the given content whose -// entries should be sourced from srcInfo to dstPath. -func CopyTo(content io.Reader, srcInfo CopyInfo, dstPath string) error { - // The destination path need not exist, but CopyInfoDestinationPath will - // ensure that at least the parent directory exists. - dstInfo, err := CopyInfoDestinationPath(normalizePath(dstPath)) - if err != nil { - return err - } - - dstDir, copyArchive, err := PrepareArchiveCopy(content, srcInfo, dstInfo) - if err != nil { - return err - } - defer copyArchive.Close() - - options := &TarOptions{ - NoLchown: true, - NoOverwriteDirNonDir: true, - } - - return Untar(copyArchive, dstDir, options) -} - -// ResolveHostSourcePath decides real path need to be copied with parameters such as -// whether to follow symbol link or not, if followLink is true, resolvedPath will return -// link target of any symbol link file, else it will only resolve symlink of directory -// but return symbol link file itself without resolving. -func ResolveHostSourcePath(path string, followLink bool) (resolvedPath, rebaseName string, err error) { - if followLink { - resolvedPath, err = filepath.EvalSymlinks(path) - if err != nil { - return - } - - resolvedPath, rebaseName = GetRebaseName(path, resolvedPath) - } else { - dirPath, basePath := filepath.Split(path) - - // if not follow symbol link, then resolve symbol link of parent dir - var resolvedDirPath string - resolvedDirPath, err = filepath.EvalSymlinks(dirPath) - if err != nil { - return - } - // resolvedDirPath will have been cleaned (no trailing path separators) so - // we can manually join it with the base path element. - resolvedPath = resolvedDirPath + string(filepath.Separator) + basePath - if hasTrailingPathSeparator(path) && filepath.Base(path) != filepath.Base(resolvedPath) { - rebaseName = filepath.Base(path) - } - } - return resolvedPath, rebaseName, nil -} - -// GetRebaseName normalizes and compares path and resolvedPath, -// return completed resolved path and rebased file name -func GetRebaseName(path, resolvedPath string) (string, string) { - // linkTarget will have been cleaned (no trailing path separators and dot) so - // we can manually join it with them - var rebaseName string - if specifiesCurrentDir(path) && !specifiesCurrentDir(resolvedPath) { - resolvedPath += string(filepath.Separator) + "." - } - - if hasTrailingPathSeparator(path) && !hasTrailingPathSeparator(resolvedPath) { - resolvedPath += string(filepath.Separator) - } - - if filepath.Base(path) != filepath.Base(resolvedPath) { - // In the case where the path had a trailing separator and a symlink - // evaluation has changed the last path component, we will need to - // rebase the name in the archive that is being copied to match the - // originally requested name. - rebaseName = filepath.Base(path) - } - return resolvedPath, rebaseName -} diff --git a/vendor/github.com/docker/docker/pkg/archive/copy_unix.go b/vendor/github.com/docker/docker/pkg/archive/copy_unix.go deleted file mode 100644 index e305b5e4a..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/copy_unix.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build !windows - -package archive - -import ( - "path/filepath" -) - -func normalizePath(path string) string { - return filepath.ToSlash(path) -} diff --git a/vendor/github.com/docker/docker/pkg/archive/copy_unix_test.go b/vendor/github.com/docker/docker/pkg/archive/copy_unix_test.go deleted file mode 100644 index ecbfc172b..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/copy_unix_test.go +++ /dev/null @@ -1,978 +0,0 @@ -// +build !windows - -// TODO Windows: Some of these tests may be salvagable and portable to Windows. - -package archive - -import ( - "bytes" - "crypto/sha256" - "encoding/hex" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "testing" -) - -func removeAllPaths(paths ...string) { - for _, path := range paths { - os.RemoveAll(path) - } -} - -func getTestTempDirs(t *testing.T) (tmpDirA, tmpDirB string) { - var err error - - if tmpDirA, err = ioutil.TempDir("", "archive-copy-test"); err != nil { - t.Fatal(err) - } - - if tmpDirB, err = ioutil.TempDir("", "archive-copy-test"); err != nil { - t.Fatal(err) - } - - return -} - -func isNotDir(err error) bool { - return strings.Contains(err.Error(), "not a directory") -} - -func joinTrailingSep(pathElements ...string) string { - joined := filepath.Join(pathElements...) - - return fmt.Sprintf("%s%c", joined, filepath.Separator) -} - -func fileContentsEqual(t *testing.T, filenameA, filenameB string) (err error) { - t.Logf("checking for equal file contents: %q and %q\n", filenameA, filenameB) - - fileA, err := os.Open(filenameA) - if err != nil { - return - } - defer fileA.Close() - - fileB, err := os.Open(filenameB) - if err != nil { - return - } - defer fileB.Close() - - hasher := sha256.New() - - if _, err = io.Copy(hasher, fileA); err != nil { - return - } - - hashA := hasher.Sum(nil) - hasher.Reset() - - if _, err = io.Copy(hasher, fileB); err != nil { - return - } - - hashB := hasher.Sum(nil) - - if !bytes.Equal(hashA, hashB) { - err = fmt.Errorf("file content hashes not equal - expected %s, got %s", hex.EncodeToString(hashA), hex.EncodeToString(hashB)) - } - - return -} - -func dirContentsEqual(t *testing.T, newDir, oldDir string) (err error) { - t.Logf("checking for equal directory contents: %q and %q\n", newDir, oldDir) - - var changes []Change - - if changes, err = ChangesDirs(newDir, oldDir); err != nil { - return - } - - if len(changes) != 0 { - err = fmt.Errorf("expected no changes between directories, but got: %v", changes) - } - - return -} - -func logDirContents(t *testing.T, dirPath string) { - logWalkedPaths := filepath.WalkFunc(func(path string, info os.FileInfo, err error) error { - if err != nil { - t.Errorf("stat error for path %q: %s", path, err) - return nil - } - - if info.IsDir() { - path = joinTrailingSep(path) - } - - t.Logf("\t%s", path) - - return nil - }) - - t.Logf("logging directory contents: %q", dirPath) - - if err := filepath.Walk(dirPath, logWalkedPaths); err != nil { - t.Fatal(err) - } -} - -func testCopyHelper(t *testing.T, srcPath, dstPath string) (err error) { - t.Logf("copying from %q to %q (not follow symbol link)", srcPath, dstPath) - - return CopyResource(srcPath, dstPath, false) -} - -func testCopyHelperFSym(t *testing.T, srcPath, dstPath string) (err error) { - t.Logf("copying from %q to %q (follow symbol link)", srcPath, dstPath) - - return CopyResource(srcPath, dstPath, true) -} - -// Basic assumptions about SRC and DST: -// 1. SRC must exist. -// 2. If SRC ends with a trailing separator, it must be a directory. -// 3. DST parent directory must exist. -// 4. If DST exists as a file, it must not end with a trailing separator. - -// First get these easy error cases out of the way. - -// Test for error when SRC does not exist. -func TestCopyErrSrcNotExists(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - if _, err := CopyInfoSourcePath(filepath.Join(tmpDirA, "file1"), false); !os.IsNotExist(err) { - t.Fatalf("expected IsNotExist error, but got %T: %s", err, err) - } -} - -// Test for error when SRC ends in a trailing -// path separator but it exists as a file. -func TestCopyErrSrcNotDir(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A with some sample files and directories. - createSampleDir(t, tmpDirA) - - if _, err := CopyInfoSourcePath(joinTrailingSep(tmpDirA, "file1"), false); !isNotDir(err) { - t.Fatalf("expected IsNotDir error, but got %T: %s", err, err) - } -} - -// Test for error when SRC is a valid file or directory, -// but the DST parent directory does not exist. -func TestCopyErrDstParentNotExists(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A with some sample files and directories. - createSampleDir(t, tmpDirA) - - srcInfo := CopyInfo{Path: filepath.Join(tmpDirA, "file1"), Exists: true, IsDir: false} - - // Try with a file source. - content, err := TarResource(srcInfo) - if err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - defer content.Close() - - // Copy to a file whose parent does not exist. - if err = CopyTo(content, srcInfo, filepath.Join(tmpDirB, "fakeParentDir", "file1")); err == nil { - t.Fatal("expected IsNotExist error, but got nil instead") - } - - if !os.IsNotExist(err) { - t.Fatalf("expected IsNotExist error, but got %T: %s", err, err) - } - - // Try with a directory source. - srcInfo = CopyInfo{Path: filepath.Join(tmpDirA, "dir1"), Exists: true, IsDir: true} - - content, err = TarResource(srcInfo) - if err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - defer content.Close() - - // Copy to a directory whose parent does not exist. - if err = CopyTo(content, srcInfo, joinTrailingSep(tmpDirB, "fakeParentDir", "fakeDstDir")); err == nil { - t.Fatal("expected IsNotExist error, but got nil instead") - } - - if !os.IsNotExist(err) { - t.Fatalf("expected IsNotExist error, but got %T: %s", err, err) - } -} - -// Test for error when DST ends in a trailing -// path separator but exists as a file. -func TestCopyErrDstNotDir(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A and B with some sample files and directories. - createSampleDir(t, tmpDirA) - createSampleDir(t, tmpDirB) - - // Try with a file source. - srcInfo := CopyInfo{Path: filepath.Join(tmpDirA, "file1"), Exists: true, IsDir: false} - - content, err := TarResource(srcInfo) - if err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - defer content.Close() - - if err = CopyTo(content, srcInfo, joinTrailingSep(tmpDirB, "file1")); err == nil { - t.Fatal("expected IsNotDir error, but got nil instead") - } - - if !isNotDir(err) { - t.Fatalf("expected IsNotDir error, but got %T: %s", err, err) - } - - // Try with a directory source. - srcInfo = CopyInfo{Path: filepath.Join(tmpDirA, "dir1"), Exists: true, IsDir: true} - - content, err = TarResource(srcInfo) - if err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - defer content.Close() - - if err = CopyTo(content, srcInfo, joinTrailingSep(tmpDirB, "file1")); err == nil { - t.Fatal("expected IsNotDir error, but got nil instead") - } - - if !isNotDir(err) { - t.Fatalf("expected IsNotDir error, but got %T: %s", err, err) - } -} - -// Possibilities are reduced to the remaining 10 cases: -// -// case | srcIsDir | onlyDirContents | dstExists | dstIsDir | dstTrSep | action -// =================================================================================================== -// A | no | - | no | - | no | create file -// B | no | - | no | - | yes | error -// C | no | - | yes | no | - | overwrite file -// D | no | - | yes | yes | - | create file in dst dir -// E | yes | no | no | - | - | create dir, copy contents -// F | yes | no | yes | no | - | error -// G | yes | no | yes | yes | - | copy dir and contents -// H | yes | yes | no | - | - | create dir, copy contents -// I | yes | yes | yes | no | - | error -// J | yes | yes | yes | yes | - | copy dir contents -// - -// A. SRC specifies a file and DST (no trailing path separator) doesn't -// exist. This should create a file with the name DST and copy the -// contents of the source file into it. -func TestCopyCaseA(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A with some sample files and directories. - createSampleDir(t, tmpDirA) - - srcPath := filepath.Join(tmpDirA, "file1") - dstPath := filepath.Join(tmpDirB, "itWorks.txt") - - var err error - - if err = testCopyHelper(t, srcPath, dstPath); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = fileContentsEqual(t, srcPath, dstPath); err != nil { - t.Fatal(err) - } - os.Remove(dstPath) - - symlinkPath := filepath.Join(tmpDirA, "symlink3") - symlinkPath1 := filepath.Join(tmpDirA, "symlink4") - linkTarget := filepath.Join(tmpDirA, "file1") - - if err = testCopyHelperFSym(t, symlinkPath, dstPath); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = fileContentsEqual(t, linkTarget, dstPath); err != nil { - t.Fatal(err) - } - os.Remove(dstPath) - if err = testCopyHelperFSym(t, symlinkPath1, dstPath); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = fileContentsEqual(t, linkTarget, dstPath); err != nil { - t.Fatal(err) - } -} - -// B. SRC specifies a file and DST (with trailing path separator) doesn't -// exist. This should cause an error because the copy operation cannot -// create a directory when copying a single file. -func TestCopyCaseB(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A with some sample files and directories. - createSampleDir(t, tmpDirA) - - srcPath := filepath.Join(tmpDirA, "file1") - dstDir := joinTrailingSep(tmpDirB, "testDir") - - var err error - - if err = testCopyHelper(t, srcPath, dstDir); err == nil { - t.Fatal("expected ErrDirNotExists error, but got nil instead") - } - - if err != ErrDirNotExists { - t.Fatalf("expected ErrDirNotExists error, but got %T: %s", err, err) - } - - symlinkPath := filepath.Join(tmpDirA, "symlink3") - - if err = testCopyHelperFSym(t, symlinkPath, dstDir); err == nil { - t.Fatal("expected ErrDirNotExists error, but got nil instead") - } - if err != ErrDirNotExists { - t.Fatalf("expected ErrDirNotExists error, but got %T: %s", err, err) - } - -} - -// C. SRC specifies a file and DST exists as a file. This should overwrite -// the file at DST with the contents of the source file. -func TestCopyCaseC(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A and B with some sample files and directories. - createSampleDir(t, tmpDirA) - createSampleDir(t, tmpDirB) - - srcPath := filepath.Join(tmpDirA, "file1") - dstPath := filepath.Join(tmpDirB, "file2") - - var err error - - // Ensure they start out different. - if err = fileContentsEqual(t, srcPath, dstPath); err == nil { - t.Fatal("expected different file contents") - } - - if err = testCopyHelper(t, srcPath, dstPath); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = fileContentsEqual(t, srcPath, dstPath); err != nil { - t.Fatal(err) - } -} - -// C. Symbol link following version: -// SRC specifies a file and DST exists as a file. This should overwrite -// the file at DST with the contents of the source file. -func TestCopyCaseCFSym(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A and B with some sample files and directories. - createSampleDir(t, tmpDirA) - createSampleDir(t, tmpDirB) - - symlinkPathBad := filepath.Join(tmpDirA, "symlink1") - symlinkPath := filepath.Join(tmpDirA, "symlink3") - linkTarget := filepath.Join(tmpDirA, "file1") - dstPath := filepath.Join(tmpDirB, "file2") - - var err error - - // first to test broken link - if err = testCopyHelperFSym(t, symlinkPathBad, dstPath); err == nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - // test symbol link -> symbol link -> target - // Ensure they start out different. - if err = fileContentsEqual(t, linkTarget, dstPath); err == nil { - t.Fatal("expected different file contents") - } - - if err = testCopyHelperFSym(t, symlinkPath, dstPath); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = fileContentsEqual(t, linkTarget, dstPath); err != nil { - t.Fatal(err) - } -} - -// D. SRC specifies a file and DST exists as a directory. This should place -// a copy of the source file inside it using the basename from SRC. Ensure -// this works whether DST has a trailing path separator or not. -func TestCopyCaseD(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A and B with some sample files and directories. - createSampleDir(t, tmpDirA) - createSampleDir(t, tmpDirB) - - srcPath := filepath.Join(tmpDirA, "file1") - dstDir := filepath.Join(tmpDirB, "dir1") - dstPath := filepath.Join(dstDir, "file1") - - var err error - - // Ensure that dstPath doesn't exist. - if _, err = os.Stat(dstPath); !os.IsNotExist(err) { - t.Fatalf("did not expect dstPath %q to exist", dstPath) - } - - if err = testCopyHelper(t, srcPath, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = fileContentsEqual(t, srcPath, dstPath); err != nil { - t.Fatal(err) - } - - // Now try again but using a trailing path separator for dstDir. - - if err = os.RemoveAll(dstDir); err != nil { - t.Fatalf("unable to remove dstDir: %s", err) - } - - if err = os.MkdirAll(dstDir, os.FileMode(0755)); err != nil { - t.Fatalf("unable to make dstDir: %s", err) - } - - dstDir = joinTrailingSep(tmpDirB, "dir1") - - if err = testCopyHelper(t, srcPath, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = fileContentsEqual(t, srcPath, dstPath); err != nil { - t.Fatal(err) - } -} - -// D. Symbol link following version: -// SRC specifies a file and DST exists as a directory. This should place -// a copy of the source file inside it using the basename from SRC. Ensure -// this works whether DST has a trailing path separator or not. -func TestCopyCaseDFSym(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A and B with some sample files and directories. - createSampleDir(t, tmpDirA) - createSampleDir(t, tmpDirB) - - srcPath := filepath.Join(tmpDirA, "symlink4") - linkTarget := filepath.Join(tmpDirA, "file1") - dstDir := filepath.Join(tmpDirB, "dir1") - dstPath := filepath.Join(dstDir, "symlink4") - - var err error - - // Ensure that dstPath doesn't exist. - if _, err = os.Stat(dstPath); !os.IsNotExist(err) { - t.Fatalf("did not expect dstPath %q to exist", dstPath) - } - - if err = testCopyHelperFSym(t, srcPath, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = fileContentsEqual(t, linkTarget, dstPath); err != nil { - t.Fatal(err) - } - - // Now try again but using a trailing path separator for dstDir. - - if err = os.RemoveAll(dstDir); err != nil { - t.Fatalf("unable to remove dstDir: %s", err) - } - - if err = os.MkdirAll(dstDir, os.FileMode(0755)); err != nil { - t.Fatalf("unable to make dstDir: %s", err) - } - - dstDir = joinTrailingSep(tmpDirB, "dir1") - - if err = testCopyHelperFSym(t, srcPath, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = fileContentsEqual(t, linkTarget, dstPath); err != nil { - t.Fatal(err) - } -} - -// E. SRC specifies a directory and DST does not exist. This should create a -// directory at DST and copy the contents of the SRC directory into the DST -// directory. Ensure this works whether DST has a trailing path separator or -// not. -func TestCopyCaseE(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A with some sample files and directories. - createSampleDir(t, tmpDirA) - - srcDir := filepath.Join(tmpDirA, "dir1") - dstDir := filepath.Join(tmpDirB, "testDir") - - var err error - - if err = testCopyHelper(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, srcDir); err != nil { - t.Log("dir contents not equal") - logDirContents(t, tmpDirA) - logDirContents(t, tmpDirB) - t.Fatal(err) - } - - // Now try again but using a trailing path separator for dstDir. - - if err = os.RemoveAll(dstDir); err != nil { - t.Fatalf("unable to remove dstDir: %s", err) - } - - dstDir = joinTrailingSep(tmpDirB, "testDir") - - if err = testCopyHelper(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, srcDir); err != nil { - t.Fatal(err) - } -} - -// E. Symbol link following version: -// SRC specifies a directory and DST does not exist. This should create a -// directory at DST and copy the contents of the SRC directory into the DST -// directory. Ensure this works whether DST has a trailing path separator or -// not. -func TestCopyCaseEFSym(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A with some sample files and directories. - createSampleDir(t, tmpDirA) - - srcDir := filepath.Join(tmpDirA, "dirSymlink") - linkTarget := filepath.Join(tmpDirA, "dir1") - dstDir := filepath.Join(tmpDirB, "testDir") - - var err error - - if err = testCopyHelperFSym(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, linkTarget); err != nil { - t.Log("dir contents not equal") - logDirContents(t, tmpDirA) - logDirContents(t, tmpDirB) - t.Fatal(err) - } - - // Now try again but using a trailing path separator for dstDir. - - if err = os.RemoveAll(dstDir); err != nil { - t.Fatalf("unable to remove dstDir: %s", err) - } - - dstDir = joinTrailingSep(tmpDirB, "testDir") - - if err = testCopyHelperFSym(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, linkTarget); err != nil { - t.Fatal(err) - } -} - -// F. SRC specifies a directory and DST exists as a file. This should cause an -// error as it is not possible to overwrite a file with a directory. -func TestCopyCaseF(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A and B with some sample files and directories. - createSampleDir(t, tmpDirA) - createSampleDir(t, tmpDirB) - - srcDir := filepath.Join(tmpDirA, "dir1") - symSrcDir := filepath.Join(tmpDirA, "dirSymlink") - dstFile := filepath.Join(tmpDirB, "file1") - - var err error - - if err = testCopyHelper(t, srcDir, dstFile); err == nil { - t.Fatal("expected ErrCannotCopyDir error, but got nil instead") - } - - if err != ErrCannotCopyDir { - t.Fatalf("expected ErrCannotCopyDir error, but got %T: %s", err, err) - } - - // now test with symbol link - if err = testCopyHelperFSym(t, symSrcDir, dstFile); err == nil { - t.Fatal("expected ErrCannotCopyDir error, but got nil instead") - } - - if err != ErrCannotCopyDir { - t.Fatalf("expected ErrCannotCopyDir error, but got %T: %s", err, err) - } -} - -// G. SRC specifies a directory and DST exists as a directory. This should copy -// the SRC directory and all its contents to the DST directory. Ensure this -// works whether DST has a trailing path separator or not. -func TestCopyCaseG(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A and B with some sample files and directories. - createSampleDir(t, tmpDirA) - createSampleDir(t, tmpDirB) - - srcDir := filepath.Join(tmpDirA, "dir1") - dstDir := filepath.Join(tmpDirB, "dir2") - resultDir := filepath.Join(dstDir, "dir1") - - var err error - - if err = testCopyHelper(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, resultDir, srcDir); err != nil { - t.Fatal(err) - } - - // Now try again but using a trailing path separator for dstDir. - - if err = os.RemoveAll(dstDir); err != nil { - t.Fatalf("unable to remove dstDir: %s", err) - } - - if err = os.MkdirAll(dstDir, os.FileMode(0755)); err != nil { - t.Fatalf("unable to make dstDir: %s", err) - } - - dstDir = joinTrailingSep(tmpDirB, "dir2") - - if err = testCopyHelper(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, resultDir, srcDir); err != nil { - t.Fatal(err) - } -} - -// G. Symbol link version: -// SRC specifies a directory and DST exists as a directory. This should copy -// the SRC directory and all its contents to the DST directory. Ensure this -// works whether DST has a trailing path separator or not. -func TestCopyCaseGFSym(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A and B with some sample files and directories. - createSampleDir(t, tmpDirA) - createSampleDir(t, tmpDirB) - - srcDir := filepath.Join(tmpDirA, "dirSymlink") - linkTarget := filepath.Join(tmpDirA, "dir1") - dstDir := filepath.Join(tmpDirB, "dir2") - resultDir := filepath.Join(dstDir, "dirSymlink") - - var err error - - if err = testCopyHelperFSym(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, resultDir, linkTarget); err != nil { - t.Fatal(err) - } - - // Now try again but using a trailing path separator for dstDir. - - if err = os.RemoveAll(dstDir); err != nil { - t.Fatalf("unable to remove dstDir: %s", err) - } - - if err = os.MkdirAll(dstDir, os.FileMode(0755)); err != nil { - t.Fatalf("unable to make dstDir: %s", err) - } - - dstDir = joinTrailingSep(tmpDirB, "dir2") - - if err = testCopyHelperFSym(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, resultDir, linkTarget); err != nil { - t.Fatal(err) - } -} - -// H. SRC specifies a directory's contents only and DST does not exist. This -// should create a directory at DST and copy the contents of the SRC -// directory (but not the directory itself) into the DST directory. Ensure -// this works whether DST has a trailing path separator or not. -func TestCopyCaseH(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A with some sample files and directories. - createSampleDir(t, tmpDirA) - - srcDir := joinTrailingSep(tmpDirA, "dir1") + "." - dstDir := filepath.Join(tmpDirB, "testDir") - - var err error - - if err = testCopyHelper(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, srcDir); err != nil { - t.Log("dir contents not equal") - logDirContents(t, tmpDirA) - logDirContents(t, tmpDirB) - t.Fatal(err) - } - - // Now try again but using a trailing path separator for dstDir. - - if err = os.RemoveAll(dstDir); err != nil { - t.Fatalf("unable to remove dstDir: %s", err) - } - - dstDir = joinTrailingSep(tmpDirB, "testDir") - - if err = testCopyHelper(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, srcDir); err != nil { - t.Log("dir contents not equal") - logDirContents(t, tmpDirA) - logDirContents(t, tmpDirB) - t.Fatal(err) - } -} - -// H. Symbol link following version: -// SRC specifies a directory's contents only and DST does not exist. This -// should create a directory at DST and copy the contents of the SRC -// directory (but not the directory itself) into the DST directory. Ensure -// this works whether DST has a trailing path separator or not. -func TestCopyCaseHFSym(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A with some sample files and directories. - createSampleDir(t, tmpDirA) - - srcDir := joinTrailingSep(tmpDirA, "dirSymlink") + "." - linkTarget := filepath.Join(tmpDirA, "dir1") - dstDir := filepath.Join(tmpDirB, "testDir") - - var err error - - if err = testCopyHelperFSym(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, linkTarget); err != nil { - t.Log("dir contents not equal") - logDirContents(t, tmpDirA) - logDirContents(t, tmpDirB) - t.Fatal(err) - } - - // Now try again but using a trailing path separator for dstDir. - - if err = os.RemoveAll(dstDir); err != nil { - t.Fatalf("unable to remove dstDir: %s", err) - } - - dstDir = joinTrailingSep(tmpDirB, "testDir") - - if err = testCopyHelperFSym(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, linkTarget); err != nil { - t.Log("dir contents not equal") - logDirContents(t, tmpDirA) - logDirContents(t, tmpDirB) - t.Fatal(err) - } -} - -// I. SRC specifies a directory's contents only and DST exists as a file. This -// should cause an error as it is not possible to overwrite a file with a -// directory. -func TestCopyCaseI(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A and B with some sample files and directories. - createSampleDir(t, tmpDirA) - createSampleDir(t, tmpDirB) - - srcDir := joinTrailingSep(tmpDirA, "dir1") + "." - symSrcDir := filepath.Join(tmpDirB, "dirSymlink") - dstFile := filepath.Join(tmpDirB, "file1") - - var err error - - if err = testCopyHelper(t, srcDir, dstFile); err == nil { - t.Fatal("expected ErrCannotCopyDir error, but got nil instead") - } - - if err != ErrCannotCopyDir { - t.Fatalf("expected ErrCannotCopyDir error, but got %T: %s", err, err) - } - - // now try with symbol link of dir - if err = testCopyHelperFSym(t, symSrcDir, dstFile); err == nil { - t.Fatal("expected ErrCannotCopyDir error, but got nil instead") - } - - if err != ErrCannotCopyDir { - t.Fatalf("expected ErrCannotCopyDir error, but got %T: %s", err, err) - } -} - -// J. SRC specifies a directory's contents only and DST exists as a directory. -// This should copy the contents of the SRC directory (but not the directory -// itself) into the DST directory. Ensure this works whether DST has a -// trailing path separator or not. -func TestCopyCaseJ(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A and B with some sample files and directories. - createSampleDir(t, tmpDirA) - createSampleDir(t, tmpDirB) - - srcDir := joinTrailingSep(tmpDirA, "dir1") + "." - dstDir := filepath.Join(tmpDirB, "dir5") - - var err error - - // first to create an empty dir - if err = os.MkdirAll(dstDir, os.FileMode(0755)); err != nil { - t.Fatalf("unable to make dstDir: %s", err) - } - - if err = testCopyHelper(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, srcDir); err != nil { - t.Fatal(err) - } - - // Now try again but using a trailing path separator for dstDir. - - if err = os.RemoveAll(dstDir); err != nil { - t.Fatalf("unable to remove dstDir: %s", err) - } - - if err = os.MkdirAll(dstDir, os.FileMode(0755)); err != nil { - t.Fatalf("unable to make dstDir: %s", err) - } - - dstDir = joinTrailingSep(tmpDirB, "dir5") - - if err = testCopyHelper(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, srcDir); err != nil { - t.Fatal(err) - } -} - -// J. Symbol link following version: -// SRC specifies a directory's contents only and DST exists as a directory. -// This should copy the contents of the SRC directory (but not the directory -// itself) into the DST directory. Ensure this works whether DST has a -// trailing path separator or not. -func TestCopyCaseJFSym(t *testing.T) { - tmpDirA, tmpDirB := getTestTempDirs(t) - defer removeAllPaths(tmpDirA, tmpDirB) - - // Load A and B with some sample files and directories. - createSampleDir(t, tmpDirA) - createSampleDir(t, tmpDirB) - - srcDir := joinTrailingSep(tmpDirA, "dirSymlink") + "." - linkTarget := filepath.Join(tmpDirA, "dir1") - dstDir := filepath.Join(tmpDirB, "dir5") - - var err error - - // first to create an empty dir - if err = os.MkdirAll(dstDir, os.FileMode(0755)); err != nil { - t.Fatalf("unable to make dstDir: %s", err) - } - - if err = testCopyHelperFSym(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, linkTarget); err != nil { - t.Fatal(err) - } - - // Now try again but using a trailing path separator for dstDir. - - if err = os.RemoveAll(dstDir); err != nil { - t.Fatalf("unable to remove dstDir: %s", err) - } - - if err = os.MkdirAll(dstDir, os.FileMode(0755)); err != nil { - t.Fatalf("unable to make dstDir: %s", err) - } - - dstDir = joinTrailingSep(tmpDirB, "dir5") - - if err = testCopyHelperFSym(t, srcDir, dstDir); err != nil { - t.Fatalf("unexpected error %T: %s", err, err) - } - - if err = dirContentsEqual(t, dstDir, linkTarget); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/docker/pkg/archive/copy_windows.go b/vendor/github.com/docker/docker/pkg/archive/copy_windows.go deleted file mode 100644 index 2b775b45c..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/copy_windows.go +++ /dev/null @@ -1,9 +0,0 @@ -package archive - -import ( - "path/filepath" -) - -func normalizePath(path string) string { - return filepath.FromSlash(path) -} diff --git a/vendor/github.com/docker/docker/pkg/archive/diff.go b/vendor/github.com/docker/docker/pkg/archive/diff.go deleted file mode 100644 index 9e1a58c49..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/diff.go +++ /dev/null @@ -1,279 +0,0 @@ -package archive - -import ( - "archive/tar" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/pools" - "github.com/docker/docker/pkg/system" -) - -// UnpackLayer unpack `layer` to a `dest`. The stream `layer` can be -// compressed or uncompressed. -// Returns the size in bytes of the contents of the layer. -func UnpackLayer(dest string, layer io.Reader, options *TarOptions) (size int64, err error) { - tr := tar.NewReader(layer) - trBuf := pools.BufioReader32KPool.Get(tr) - defer pools.BufioReader32KPool.Put(trBuf) - - var dirs []*tar.Header - unpackedPaths := make(map[string]struct{}) - - if options == nil { - options = &TarOptions{} - } - if options.ExcludePatterns == nil { - options.ExcludePatterns = []string{} - } - remappedRootUID, remappedRootGID, err := idtools.GetRootUIDGID(options.UIDMaps, options.GIDMaps) - if err != nil { - return 0, err - } - - aufsTempdir := "" - aufsHardlinks := make(map[string]*tar.Header) - - if options == nil { - options = &TarOptions{} - } - // Iterate through the files in the archive. - for { - hdr, err := tr.Next() - if err == io.EOF { - // end of tar archive - break - } - if err != nil { - return 0, err - } - - size += hdr.Size - - // Normalize name, for safety and for a simple is-root check - hdr.Name = filepath.Clean(hdr.Name) - - // Windows does not support filenames with colons in them. Ignore - // these files. This is not a problem though (although it might - // appear that it is). Let's suppose a client is running docker pull. - // The daemon it points to is Windows. Would it make sense for the - // client to be doing a docker pull Ubuntu for example (which has files - // with colons in the name under /usr/share/man/man3)? No, absolutely - // not as it would really only make sense that they were pulling a - // Windows image. However, for development, it is necessary to be able - // to pull Linux images which are in the repository. - // - // TODO Windows. Once the registry is aware of what images are Windows- - // specific or Linux-specific, this warning should be changed to an error - // to cater for the situation where someone does manage to upload a Linux - // image but have it tagged as Windows inadvertently. - if runtime.GOOS == "windows" { - if strings.Contains(hdr.Name, ":") { - logrus.Warnf("Windows: Ignoring %s (is this a Linux image?)", hdr.Name) - continue - } - } - - // Note as these operations are platform specific, so must the slash be. - if !strings.HasSuffix(hdr.Name, string(os.PathSeparator)) { - // Not the root directory, ensure that the parent directory exists. - // This happened in some tests where an image had a tarfile without any - // parent directories. - parent := filepath.Dir(hdr.Name) - parentPath := filepath.Join(dest, parent) - - if _, err := os.Lstat(parentPath); err != nil && os.IsNotExist(err) { - err = system.MkdirAll(parentPath, 0600) - if err != nil { - return 0, err - } - } - } - - // Skip AUFS metadata dirs - if strings.HasPrefix(hdr.Name, WhiteoutMetaPrefix) { - // Regular files inside /.wh..wh.plnk can be used as hardlink targets - // We don't want this directory, but we need the files in them so that - // such hardlinks can be resolved. - if strings.HasPrefix(hdr.Name, WhiteoutLinkDir) && hdr.Typeflag == tar.TypeReg { - basename := filepath.Base(hdr.Name) - aufsHardlinks[basename] = hdr - if aufsTempdir == "" { - if aufsTempdir, err = ioutil.TempDir("", "dockerplnk"); err != nil { - return 0, err - } - defer os.RemoveAll(aufsTempdir) - } - if err := createTarFile(filepath.Join(aufsTempdir, basename), dest, hdr, tr, true, nil, options.InUserNS); err != nil { - return 0, err - } - } - - if hdr.Name != WhiteoutOpaqueDir { - continue - } - } - path := filepath.Join(dest, hdr.Name) - rel, err := filepath.Rel(dest, path) - if err != nil { - return 0, err - } - - // Note as these operations are platform specific, so must the slash be. - if strings.HasPrefix(rel, ".."+string(os.PathSeparator)) { - return 0, breakoutError(fmt.Errorf("%q is outside of %q", hdr.Name, dest)) - } - base := filepath.Base(path) - - if strings.HasPrefix(base, WhiteoutPrefix) { - dir := filepath.Dir(path) - if base == WhiteoutOpaqueDir { - _, err := os.Lstat(dir) - if err != nil { - return 0, err - } - err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { - if err != nil { - if os.IsNotExist(err) { - err = nil // parent was deleted - } - return err - } - if path == dir { - return nil - } - if _, exists := unpackedPaths[path]; !exists { - err := os.RemoveAll(path) - return err - } - return nil - }) - if err != nil { - return 0, err - } - } else { - originalBase := base[len(WhiteoutPrefix):] - originalPath := filepath.Join(dir, originalBase) - if err := os.RemoveAll(originalPath); err != nil { - return 0, err - } - } - } else { - // If path exits we almost always just want to remove and replace it. - // The only exception is when it is a directory *and* the file from - // the layer is also a directory. Then we want to merge them (i.e. - // just apply the metadata from the layer). - if fi, err := os.Lstat(path); err == nil { - if !(fi.IsDir() && hdr.Typeflag == tar.TypeDir) { - if err := os.RemoveAll(path); err != nil { - return 0, err - } - } - } - - trBuf.Reset(tr) - srcData := io.Reader(trBuf) - srcHdr := hdr - - // Hard links into /.wh..wh.plnk don't work, as we don't extract that directory, so - // we manually retarget these into the temporary files we extracted them into - if hdr.Typeflag == tar.TypeLink && strings.HasPrefix(filepath.Clean(hdr.Linkname), WhiteoutLinkDir) { - linkBasename := filepath.Base(hdr.Linkname) - srcHdr = aufsHardlinks[linkBasename] - if srcHdr == nil { - return 0, fmt.Errorf("Invalid aufs hardlink") - } - tmpFile, err := os.Open(filepath.Join(aufsTempdir, linkBasename)) - if err != nil { - return 0, err - } - defer tmpFile.Close() - srcData = tmpFile - } - - // if the options contain a uid & gid maps, convert header uid/gid - // entries using the maps such that lchown sets the proper mapped - // uid/gid after writing the file. We only perform this mapping if - // the file isn't already owned by the remapped root UID or GID, as - // that specific uid/gid has no mapping from container -> host, and - // those files already have the proper ownership for inside the - // container. - if srcHdr.Uid != remappedRootUID { - xUID, err := idtools.ToHost(srcHdr.Uid, options.UIDMaps) - if err != nil { - return 0, err - } - srcHdr.Uid = xUID - } - if srcHdr.Gid != remappedRootGID { - xGID, err := idtools.ToHost(srcHdr.Gid, options.GIDMaps) - if err != nil { - return 0, err - } - srcHdr.Gid = xGID - } - if err := createTarFile(path, dest, srcHdr, srcData, true, nil, options.InUserNS); err != nil { - return 0, err - } - - // Directory mtimes must be handled at the end to avoid further - // file creation in them to modify the directory mtime - if hdr.Typeflag == tar.TypeDir { - dirs = append(dirs, hdr) - } - unpackedPaths[path] = struct{}{} - } - } - - for _, hdr := range dirs { - path := filepath.Join(dest, hdr.Name) - if err := system.Chtimes(path, hdr.AccessTime, hdr.ModTime); err != nil { - return 0, err - } - } - - return size, nil -} - -// ApplyLayer parses a diff in the standard layer format from `layer`, -// and applies it to the directory `dest`. The stream `layer` can be -// compressed or uncompressed. -// Returns the size in bytes of the contents of the layer. -func ApplyLayer(dest string, layer io.Reader) (int64, error) { - return applyLayerHandler(dest, layer, &TarOptions{}, true) -} - -// ApplyUncompressedLayer parses a diff in the standard layer format from -// `layer`, and applies it to the directory `dest`. The stream `layer` -// can only be uncompressed. -// Returns the size in bytes of the contents of the layer. -func ApplyUncompressedLayer(dest string, layer io.Reader, options *TarOptions) (int64, error) { - return applyLayerHandler(dest, layer, options, false) -} - -// do the bulk load of ApplyLayer, but allow for not calling DecompressStream -func applyLayerHandler(dest string, layer io.Reader, options *TarOptions, decompress bool) (int64, error) { - dest = filepath.Clean(dest) - - // We need to be able to set any perms - oldmask, err := system.Umask(0) - if err != nil { - return 0, err - } - defer system.Umask(oldmask) // ignore err, ErrNotSupportedPlatform - - if decompress { - layer, err = DecompressStream(layer) - if err != nil { - return 0, err - } - } - return UnpackLayer(dest, layer, options) -} diff --git a/vendor/github.com/docker/docker/pkg/archive/diff_test.go b/vendor/github.com/docker/docker/pkg/archive/diff_test.go deleted file mode 100644 index 8167941ac..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/diff_test.go +++ /dev/null @@ -1,386 +0,0 @@ -package archive - -import ( - "archive/tar" - "io" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "runtime" - "testing" - - "github.com/docker/docker/pkg/ioutils" -) - -func TestApplyLayerInvalidFilenames(t *testing.T) { - // TODO Windows: Figure out how to fix this test. - if runtime.GOOS == "windows" { - t.Skip("Passes but hits breakoutError: platform and architecture is not supported") - } - for i, headers := range [][]*tar.Header{ - { - { - Name: "../victim/dotdot", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - { - { - // Note the leading slash - Name: "/../victim/slash-dotdot", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - } { - if err := testBreakout("applylayer", "docker-TestApplyLayerInvalidFilenames", headers); err != nil { - t.Fatalf("i=%d. %v", i, err) - } - } -} - -func TestApplyLayerInvalidHardlink(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("TypeLink support on Windows") - } - for i, headers := range [][]*tar.Header{ - { // try reading victim/hello (../) - { - Name: "dotdot", - Typeflag: tar.TypeLink, - Linkname: "../victim/hello", - Mode: 0644, - }, - }, - { // try reading victim/hello (/../) - { - Name: "slash-dotdot", - Typeflag: tar.TypeLink, - // Note the leading slash - Linkname: "/../victim/hello", - Mode: 0644, - }, - }, - { // try writing victim/file - { - Name: "loophole-victim", - Typeflag: tar.TypeLink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "loophole-victim/file", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - { // try reading victim/hello (hardlink, symlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeLink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "symlink", - Typeflag: tar.TypeSymlink, - Linkname: "loophole-victim/hello", - Mode: 0644, - }, - }, - { // Try reading victim/hello (hardlink, hardlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeLink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "hardlink", - Typeflag: tar.TypeLink, - Linkname: "loophole-victim/hello", - Mode: 0644, - }, - }, - { // Try removing victim directory (hardlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeLink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "loophole-victim", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - } { - if err := testBreakout("applylayer", "docker-TestApplyLayerInvalidHardlink", headers); err != nil { - t.Fatalf("i=%d. %v", i, err) - } - } -} - -func TestApplyLayerInvalidSymlink(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("TypeSymLink support on Windows") - } - for i, headers := range [][]*tar.Header{ - { // try reading victim/hello (../) - { - Name: "dotdot", - Typeflag: tar.TypeSymlink, - Linkname: "../victim/hello", - Mode: 0644, - }, - }, - { // try reading victim/hello (/../) - { - Name: "slash-dotdot", - Typeflag: tar.TypeSymlink, - // Note the leading slash - Linkname: "/../victim/hello", - Mode: 0644, - }, - }, - { // try writing victim/file - { - Name: "loophole-victim", - Typeflag: tar.TypeSymlink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "loophole-victim/file", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - { // try reading victim/hello (symlink, symlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeSymlink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "symlink", - Typeflag: tar.TypeSymlink, - Linkname: "loophole-victim/hello", - Mode: 0644, - }, - }, - { // try reading victim/hello (symlink, hardlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeSymlink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "hardlink", - Typeflag: tar.TypeLink, - Linkname: "loophole-victim/hello", - Mode: 0644, - }, - }, - { // try removing victim directory (symlink) - { - Name: "loophole-victim", - Typeflag: tar.TypeSymlink, - Linkname: "../victim", - Mode: 0755, - }, - { - Name: "loophole-victim", - Typeflag: tar.TypeReg, - Mode: 0644, - }, - }, - } { - if err := testBreakout("applylayer", "docker-TestApplyLayerInvalidSymlink", headers); err != nil { - t.Fatalf("i=%d. %v", i, err) - } - } -} - -func TestApplyLayerWhiteouts(t *testing.T) { - // TODO Windows: Figure out why this test fails - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - - wd, err := ioutil.TempDir("", "graphdriver-test-whiteouts") - if err != nil { - return - } - defer os.RemoveAll(wd) - - base := []string{ - ".baz", - "bar/", - "bar/bax", - "bar/bay/", - "baz", - "foo/", - "foo/.abc", - "foo/.bcd/", - "foo/.bcd/a", - "foo/cde/", - "foo/cde/def", - "foo/cde/efg", - "foo/fgh", - "foobar", - } - - type tcase struct { - change, expected []string - } - - tcases := []tcase{ - { - base, - base, - }, - { - []string{ - ".bay", - ".wh.baz", - "foo/", - "foo/.bce", - "foo/.wh..wh..opq", - "foo/cde/", - "foo/cde/efg", - }, - []string{ - ".bay", - ".baz", - "bar/", - "bar/bax", - "bar/bay/", - "foo/", - "foo/.bce", - "foo/cde/", - "foo/cde/efg", - "foobar", - }, - }, - { - []string{ - ".bay", - ".wh..baz", - ".wh.foobar", - "foo/", - "foo/.abc", - "foo/.wh.cde", - "bar/", - }, - []string{ - ".bay", - "bar/", - "bar/bax", - "bar/bay/", - "foo/", - "foo/.abc", - "foo/.bce", - }, - }, - { - []string{ - ".abc", - ".wh..wh..opq", - "foobar", - }, - []string{ - ".abc", - "foobar", - }, - }, - } - - for i, tc := range tcases { - l, err := makeTestLayer(tc.change) - if err != nil { - t.Fatal(err) - } - - _, err = UnpackLayer(wd, l, nil) - if err != nil { - t.Fatal(err) - } - err = l.Close() - if err != nil { - t.Fatal(err) - } - - paths, err := readDirContents(wd) - if err != nil { - t.Fatal(err) - } - - if !reflect.DeepEqual(tc.expected, paths) { - t.Fatalf("invalid files for layer %d: expected %q, got %q", i, tc.expected, paths) - } - } - -} - -func makeTestLayer(paths []string) (rc io.ReadCloser, err error) { - tmpDir, err := ioutil.TempDir("", "graphdriver-test-mklayer") - if err != nil { - return - } - defer func() { - if err != nil { - os.RemoveAll(tmpDir) - } - }() - for _, p := range paths { - if p[len(p)-1] == filepath.Separator { - if err = os.MkdirAll(filepath.Join(tmpDir, p), 0700); err != nil { - return - } - } else { - if err = ioutil.WriteFile(filepath.Join(tmpDir, p), nil, 0600); err != nil { - return - } - } - } - archive, err := Tar(tmpDir, Uncompressed) - if err != nil { - return - } - return ioutils.NewReadCloserWrapper(archive, func() error { - err := archive.Close() - os.RemoveAll(tmpDir) - return err - }), nil -} - -func readDirContents(root string) ([]string, error) { - var files []string - err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if path == root { - return nil - } - rel, err := filepath.Rel(root, path) - if err != nil { - return err - } - if info.IsDir() { - rel = rel + "/" - } - files = append(files, rel) - return nil - }) - if err != nil { - return nil, err - } - return files, nil -} diff --git a/vendor/github.com/docker/docker/pkg/archive/example_changes.go b/vendor/github.com/docker/docker/pkg/archive/example_changes.go deleted file mode 100644 index cedd46a40..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/example_changes.go +++ /dev/null @@ -1,97 +0,0 @@ -// +build ignore - -// Simple tool to create an archive stream from an old and new directory -// -// By default it will stream the comparison of two temporary directories with junk files -package main - -import ( - "flag" - "fmt" - "io" - "io/ioutil" - "os" - "path" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/archive" -) - -var ( - flDebug = flag.Bool("D", false, "debugging output") - flNewDir = flag.String("newdir", "", "") - flOldDir = flag.String("olddir", "", "") - log = logrus.New() -) - -func main() { - flag.Usage = func() { - fmt.Println("Produce a tar from comparing two directory paths. By default a demo tar is created of around 200 files (including hardlinks)") - fmt.Printf("%s [OPTIONS]\n", os.Args[0]) - flag.PrintDefaults() - } - flag.Parse() - log.Out = os.Stderr - if (len(os.Getenv("DEBUG")) > 0) || *flDebug { - logrus.SetLevel(logrus.DebugLevel) - } - var newDir, oldDir string - - if len(*flNewDir) == 0 { - var err error - newDir, err = ioutil.TempDir("", "docker-test-newDir") - if err != nil { - log.Fatal(err) - } - defer os.RemoveAll(newDir) - if _, err := prepareUntarSourceDirectory(100, newDir, true); err != nil { - log.Fatal(err) - } - } else { - newDir = *flNewDir - } - - if len(*flOldDir) == 0 { - oldDir, err := ioutil.TempDir("", "docker-test-oldDir") - if err != nil { - log.Fatal(err) - } - defer os.RemoveAll(oldDir) - } else { - oldDir = *flOldDir - } - - changes, err := archive.ChangesDirs(newDir, oldDir) - if err != nil { - log.Fatal(err) - } - - a, err := archive.ExportChanges(newDir, changes) - if err != nil { - log.Fatal(err) - } - defer a.Close() - - i, err := io.Copy(os.Stdout, a) - if err != nil && err != io.EOF { - log.Fatal(err) - } - fmt.Fprintf(os.Stderr, "wrote archive of %d bytes", i) -} - -func prepareUntarSourceDirectory(numberOfFiles int, targetPath string, makeLinks bool) (int, error) { - fileData := []byte("fooo") - for n := 0; n < numberOfFiles; n++ { - fileName := fmt.Sprintf("file-%d", n) - if err := ioutil.WriteFile(path.Join(targetPath, fileName), fileData, 0700); err != nil { - return 0, err - } - if makeLinks { - if err := os.Link(path.Join(targetPath, fileName), path.Join(targetPath, fileName+"-link")); err != nil { - return 0, err - } - } - } - totalSize := numberOfFiles * len(fileData) - return totalSize, nil -} diff --git a/vendor/github.com/docker/docker/pkg/archive/testdata/broken.tar b/vendor/github.com/docker/docker/pkg/archive/testdata/broken.tar deleted file mode 100644 index 8f10ea6b87d3eb4fed572349dfe87695603b10a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13824 zcmeHN>rxv>7UtLfn5Q@^l8gXrG&7O_li)0oQBai)6v9rjo&-ixOPXbFo(r;aaqT1Q zi|o_vJM6y3ey8Um2^?(fm~vH66==Hq^tqqYr_U$~f~3CkaX-4=)VFkfMbAE0zj=1W zFdGeXOK)!KtrgwSO|!8=t&huAhCPiFI|54|O6#g{AByje_D5`gZ4lbN_tD%y+P?+6 zW}mCyJbT6dM$<6v?SB_8uxS5j5M6u>C%C=+&BoS!{NIK7SFYLLXgq9fL;u??&1{)C_QVb?f0pB4xfD_C1pX2f z=LE&>$4O)llEszRik&8tAi~^>9~IXb2tQsXkop&XF!hz8gWXO)O@R9>nS~7H1w&*U zWf1ryXPidjED|qMClc|F!YuB;N}eT-8}IBqwJ!w!F&$m$r;a;(N7!YIEb7h<=ej}& zT~f;Cd!ZOC&mX2n zv4)UvkOa{z8}jxVC6bTq+3^R;Sok8c6EQsN&k9^`&h(Hc32JVwt-Hrj<{`vG3V< zCk?#){6BW>!9@+(L2u}{Jos}CZh!u_HaA;$dH(--^ZzaF-*=tS5&i^O)@Me!3BwBQ`@=VE zIl)Fp0MG z@%2K`G+^8HA?T&;xGZB%_q<@Vt&(_!w-gfXxk@mb9|fb)1BuBGk_ptuvx%G~pq0Kb zb&?6Szj_3#ClOiI_3vu1e+mOX z9k`Og2B5RmN7LGZ)c;3%E%Ip__9KKUf&G&zD9jkJNr-{ibNby{ds> zUrSU_0z^Wf<)}gE{Jb22kgArW_I#nO79{eFvL6rZP*4oJ7H%7}fn5i&1ZT@5hDK4~ z(U`5S#`Fws86Z{2P=gP6usiI=mKaOr@4W|(?6Ye5$Oayf(LUxEb zaN*HO8gZBg{sZJ1)pg4>36^kmC*dQ2;oE@^#)cw_*aI^!cM=y1Rqga(?Ey`Mja44@ zco?Vs7`J_y5ir%m6vXp*y&Gb{4lfBvR0R>wjxNBA^zHAzdc;~eK6(s=AB|{$OM8p} zp9LwiIkAyG5Q$+F3`7h$CPJbL(j-h1h61!ZViYo4dBXOg@lop12w4VYz!&$vL+Po-n0lE6B8Y;6$Ar89(FQ zU43m0VVC)g+}A0GY(H3=vGXH;5|6sFnZk+NN-WF&+)64KnDBNmlR?P<{j247c6ZGs zY`hF!K4&Hi(0r~#=6sH0f#>;~|6uT_GuPArovwt~PT&t2-pNh;x9aMe7i;!lK!(<$ z?d`g5*7a@bJ?(y(Y4ln98)|Cinp8V=gdKs-N$TT&k8N344C6y&*H}a~{9Pg&%cB8( zs3gwCMEH-=;aI?u+)#>TQj}R!`jyO-QsK*KZS|lK9+9#7oV0B(la+@sRbyfJf~*mY z#+u;OA2B@66aq^nOW6`=t5qYdRV{oFkE8T+GhJI-*NldTtcr!I|PQf({z2i zZs;`}x~m6ks)bXh@+($$(s>pJ`5X6~16{UfoJC(mW1b(MtJcpN$ZBT3r1B`&Cx9{-iF=!{A}z(ob033DW~d!*9$cfm zVNC%z6l$8Qz0LiPv&`A!8a*yd3zi-in+*e-!2$MiQNyE>1xX!65{vsnGKkf9!|0+OGBAb= z5*&U!Rl91sZq^%6Di#9<<87G)rv;99!{p6oE&}gq)LXeeJT)kYlsjz{ehkbMY(O`q zGvc6vviAh-6>EFt+I|*)$Z&%o;(ob2LAmI= zd);1Ux&vAHF3sW+ZYtInM5`7V!gWe@@A3}gzBN4OzKHcFXhsnBZ62vkM}c;c8?C16|}T)I>F_`E4y<`7O_Uv z_IIGuK3}j6k8x0(NE^)|N^6ztuoF5wcqyCPP4-b>1H5)kQM(q_kYzo37tjs2w1@@5 z)pou5q*BNKlggS#-4TOxF*--bZwQgZIP>8>Wh4R6qJg1trGj7P+M9C-U$bgV0-Bbc zM}8SyaI1`5o3Hn=gK~dij~yq2v7>PXETRIqq!En36W>+P9az*N;)5;FK054lzkPPH zcY4hR*Orc{l5us$Y*nZ!(@__9wdDn6|B~BL+;v!B^Cr(N`)UtH54-56s#rGO&e@Q}~KNYPdQ94MZxA|gP9PSIqe@Ff$9bNNvws)xH zUYfZ#^MIJly?f4ly_CL`QQoB~o&>3jKAlL=*#tHX$;*%#;^sVnJHGU0={L0dh$?du z$V*u|2o=sbG6HQV;$?~-5Xh?Gjf~m#{@1wY+1@T!Us<#xZ;2Rn{Y@!B=|jZ;TY#GL zQet9G=4h_z5?#7$NWf6BJyZ3f$1aFp02S_lpyVtB;|niLX54VbZP`xU1YMSiGnf#! zBhWBJBLfCg3eCtIG~av^x3Yo4twnBx#0a&E>6G9&~+z{;Wn%CtG>DYD1(pjqYiYL oJsf9Rk?Q4-IWqA2mih3}{ZBUT=3UD@m3s}`Yv5i3pOOat4?XSI`2YX_ diff --git a/vendor/github.com/docker/docker/pkg/archive/time_linux.go b/vendor/github.com/docker/docker/pkg/archive/time_linux.go deleted file mode 100644 index 3448569b1..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/time_linux.go +++ /dev/null @@ -1,16 +0,0 @@ -package archive - -import ( - "syscall" - "time" -) - -func timeToTimespec(time time.Time) (ts syscall.Timespec) { - if time.IsZero() { - // Return UTIME_OMIT special value - ts.Sec = 0 - ts.Nsec = ((1 << 30) - 2) - return - } - return syscall.NsecToTimespec(time.UnixNano()) -} diff --git a/vendor/github.com/docker/docker/pkg/archive/time_unsupported.go b/vendor/github.com/docker/docker/pkg/archive/time_unsupported.go deleted file mode 100644 index e85aac054..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/time_unsupported.go +++ /dev/null @@ -1,16 +0,0 @@ -// +build !linux - -package archive - -import ( - "syscall" - "time" -) - -func timeToTimespec(time time.Time) (ts syscall.Timespec) { - nsec := int64(0) - if !time.IsZero() { - nsec = time.UnixNano() - } - return syscall.NsecToTimespec(nsec) -} diff --git a/vendor/github.com/docker/docker/pkg/archive/utils_test.go b/vendor/github.com/docker/docker/pkg/archive/utils_test.go deleted file mode 100644 index 01b9e92d1..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/utils_test.go +++ /dev/null @@ -1,166 +0,0 @@ -package archive - -import ( - "archive/tar" - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "time" -) - -var testUntarFns = map[string]func(string, io.Reader) error{ - "untar": func(dest string, r io.Reader) error { - return Untar(r, dest, nil) - }, - "applylayer": func(dest string, r io.Reader) error { - _, err := ApplyLayer(dest, r) - return err - }, -} - -// testBreakout is a helper function that, within the provided `tmpdir` directory, -// creates a `victim` folder with a generated `hello` file in it. -// `untar` extracts to a directory named `dest`, the tar file created from `headers`. -// -// Here are the tested scenarios: -// - removed `victim` folder (write) -// - removed files from `victim` folder (write) -// - new files in `victim` folder (write) -// - modified files in `victim` folder (write) -// - file in `dest` with same content as `victim/hello` (read) -// -// When using testBreakout make sure you cover one of the scenarios listed above. -func testBreakout(untarFn string, tmpdir string, headers []*tar.Header) error { - tmpdir, err := ioutil.TempDir("", tmpdir) - if err != nil { - return err - } - defer os.RemoveAll(tmpdir) - - dest := filepath.Join(tmpdir, "dest") - if err := os.Mkdir(dest, 0755); err != nil { - return err - } - - victim := filepath.Join(tmpdir, "victim") - if err := os.Mkdir(victim, 0755); err != nil { - return err - } - hello := filepath.Join(victim, "hello") - helloData, err := time.Now().MarshalText() - if err != nil { - return err - } - if err := ioutil.WriteFile(hello, helloData, 0644); err != nil { - return err - } - helloStat, err := os.Stat(hello) - if err != nil { - return err - } - - reader, writer := io.Pipe() - go func() { - t := tar.NewWriter(writer) - for _, hdr := range headers { - t.WriteHeader(hdr) - } - t.Close() - }() - - untar := testUntarFns[untarFn] - if untar == nil { - return fmt.Errorf("could not find untar function %q in testUntarFns", untarFn) - } - if err := untar(dest, reader); err != nil { - if _, ok := err.(breakoutError); !ok { - // If untar returns an error unrelated to an archive breakout, - // then consider this an unexpected error and abort. - return err - } - // Here, untar detected the breakout. - // Let's move on verifying that indeed there was no breakout. - fmt.Printf("breakoutError: %v\n", err) - } - - // Check victim folder - f, err := os.Open(victim) - if err != nil { - // codepath taken if victim folder was removed - return fmt.Errorf("archive breakout: error reading %q: %v", victim, err) - } - defer f.Close() - - // Check contents of victim folder - // - // We are only interested in getting 2 files from the victim folder, because if all is well - // we expect only one result, the `hello` file. If there is a second result, it cannot - // hold the same name `hello` and we assume that a new file got created in the victim folder. - // That is enough to detect an archive breakout. - names, err := f.Readdirnames(2) - if err != nil { - // codepath taken if victim is not a folder - return fmt.Errorf("archive breakout: error reading directory content of %q: %v", victim, err) - } - for _, name := range names { - if name != "hello" { - // codepath taken if new file was created in victim folder - return fmt.Errorf("archive breakout: new file %q", name) - } - } - - // Check victim/hello - f, err = os.Open(hello) - if err != nil { - // codepath taken if read permissions were removed - return fmt.Errorf("archive breakout: could not lstat %q: %v", hello, err) - } - defer f.Close() - b, err := ioutil.ReadAll(f) - if err != nil { - return err - } - fi, err := f.Stat() - if err != nil { - return err - } - if helloStat.IsDir() != fi.IsDir() || - // TODO: cannot check for fi.ModTime() change - helloStat.Mode() != fi.Mode() || - helloStat.Size() != fi.Size() || - !bytes.Equal(helloData, b) { - // codepath taken if hello has been modified - return fmt.Errorf("archive breakout: file %q has been modified. Contents: expected=%q, got=%q. FileInfo: expected=%#v, got=%#v", hello, helloData, b, helloStat, fi) - } - - // Check that nothing in dest/ has the same content as victim/hello. - // Since victim/hello was generated with time.Now(), it is safe to assume - // that any file whose content matches exactly victim/hello, managed somehow - // to access victim/hello. - return filepath.Walk(dest, func(path string, info os.FileInfo, err error) error { - if info.IsDir() { - if err != nil { - // skip directory if error - return filepath.SkipDir - } - // enter directory - return nil - } - if err != nil { - // skip file if error - return nil - } - b, err := ioutil.ReadFile(path) - if err != nil { - // Houston, we have a problem. Aborting (space)walk. - return err - } - if bytes.Equal(helloData, b) { - return fmt.Errorf("archive breakout: file %q has been accessed via %q", hello, path) - } - return nil - }) -} diff --git a/vendor/github.com/docker/docker/pkg/archive/whiteouts.go b/vendor/github.com/docker/docker/pkg/archive/whiteouts.go deleted file mode 100644 index d20478a10..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/whiteouts.go +++ /dev/null @@ -1,23 +0,0 @@ -package archive - -// Whiteouts are files with a special meaning for the layered filesystem. -// Docker uses AUFS whiteout files inside exported archives. In other -// filesystems these files are generated/handled on tar creation/extraction. - -// WhiteoutPrefix prefix means file is a whiteout. If this is followed by a -// filename this means that file has been removed from the base layer. -const WhiteoutPrefix = ".wh." - -// WhiteoutMetaPrefix prefix means whiteout has a special meaning and is not -// for removing an actual file. Normally these files are excluded from exported -// archives. -const WhiteoutMetaPrefix = WhiteoutPrefix + WhiteoutPrefix - -// WhiteoutLinkDir is a directory AUFS uses for storing hardlink links to other -// layers. Normally these should not go into exported archives and all changed -// hardlinks should be copied to the top layer. -const WhiteoutLinkDir = WhiteoutMetaPrefix + "plnk" - -// WhiteoutOpaqueDir file means directory has been made opaque - meaning -// readdir calls to this directory do not follow to lower layers. -const WhiteoutOpaqueDir = WhiteoutMetaPrefix + ".opq" diff --git a/vendor/github.com/docker/docker/pkg/archive/wrap.go b/vendor/github.com/docker/docker/pkg/archive/wrap.go deleted file mode 100644 index b39d12c87..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/wrap.go +++ /dev/null @@ -1,59 +0,0 @@ -package archive - -import ( - "archive/tar" - "bytes" - "io" -) - -// Generate generates a new archive from the content provided -// as input. -// -// `files` is a sequence of path/content pairs. A new file is -// added to the archive for each pair. -// If the last pair is incomplete, the file is created with an -// empty content. For example: -// -// Generate("foo.txt", "hello world", "emptyfile") -// -// The above call will return an archive with 2 files: -// * ./foo.txt with content "hello world" -// * ./empty with empty content -// -// FIXME: stream content instead of buffering -// FIXME: specify permissions and other archive metadata -func Generate(input ...string) (io.Reader, error) { - files := parseStringPairs(input...) - buf := new(bytes.Buffer) - tw := tar.NewWriter(buf) - for _, file := range files { - name, content := file[0], file[1] - hdr := &tar.Header{ - Name: name, - Size: int64(len(content)), - } - if err := tw.WriteHeader(hdr); err != nil { - return nil, err - } - if _, err := tw.Write([]byte(content)); err != nil { - return nil, err - } - } - if err := tw.Close(); err != nil { - return nil, err - } - return buf, nil -} - -func parseStringPairs(input ...string) (output [][2]string) { - output = make([][2]string, 0, len(input)/2+1) - for i := 0; i < len(input); i += 2 { - var pair [2]string - pair[0] = input[i] - if i+1 < len(input) { - pair[1] = input[i+1] - } - output = append(output, pair) - } - return -} diff --git a/vendor/github.com/docker/docker/pkg/archive/wrap_test.go b/vendor/github.com/docker/docker/pkg/archive/wrap_test.go deleted file mode 100644 index 46ab36697..000000000 --- a/vendor/github.com/docker/docker/pkg/archive/wrap_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package archive - -import ( - "archive/tar" - "bytes" - "io" - "testing" -) - -func TestGenerateEmptyFile(t *testing.T) { - archive, err := Generate("emptyFile") - if err != nil { - t.Fatal(err) - } - if archive == nil { - t.Fatal("The generated archive should not be nil.") - } - - expectedFiles := [][]string{ - {"emptyFile", ""}, - } - - tr := tar.NewReader(archive) - actualFiles := make([][]string, 0, 10) - i := 0 - for { - hdr, err := tr.Next() - if err == io.EOF { - break - } - if err != nil { - t.Fatal(err) - } - buf := new(bytes.Buffer) - buf.ReadFrom(tr) - content := buf.String() - actualFiles = append(actualFiles, []string{hdr.Name, content}) - i++ - } - if len(actualFiles) != len(expectedFiles) { - t.Fatalf("Number of expected file %d, got %d.", len(expectedFiles), len(actualFiles)) - } - for i := 0; i < len(expectedFiles); i++ { - actual := actualFiles[i] - expected := expectedFiles[i] - if actual[0] != expected[0] { - t.Fatalf("Expected name '%s', Actual name '%s'", expected[0], actual[0]) - } - if actual[1] != expected[1] { - t.Fatalf("Expected content '%s', Actual content '%s'", expected[1], actual[1]) - } - } -} - -func TestGenerateWithContent(t *testing.T) { - archive, err := Generate("file", "content") - if err != nil { - t.Fatal(err) - } - if archive == nil { - t.Fatal("The generated archive should not be nil.") - } - - expectedFiles := [][]string{ - {"file", "content"}, - } - - tr := tar.NewReader(archive) - actualFiles := make([][]string, 0, 10) - i := 0 - for { - hdr, err := tr.Next() - if err == io.EOF { - break - } - if err != nil { - t.Fatal(err) - } - buf := new(bytes.Buffer) - buf.ReadFrom(tr) - content := buf.String() - actualFiles = append(actualFiles, []string{hdr.Name, content}) - i++ - } - if len(actualFiles) != len(expectedFiles) { - t.Fatalf("Number of expected file %d, got %d.", len(expectedFiles), len(actualFiles)) - } - for i := 0; i < len(expectedFiles); i++ { - actual := actualFiles[i] - expected := expectedFiles[i] - if actual[0] != expected[0] { - t.Fatalf("Expected name '%s', Actual name '%s'", expected[0], actual[0]) - } - if actual[1] != expected[1] { - t.Fatalf("Expected content '%s', Actual content '%s'", expected[1], actual[1]) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/authorization/api.go b/vendor/github.com/docker/docker/pkg/authorization/api.go deleted file mode 100644 index 05c75f1a6..000000000 --- a/vendor/github.com/docker/docker/pkg/authorization/api.go +++ /dev/null @@ -1,88 +0,0 @@ -package authorization - -import ( - "crypto/x509" - "encoding/json" - "encoding/pem" -) - -const ( - // AuthZApiRequest is the url for daemon request authorization - AuthZApiRequest = "AuthZPlugin.AuthZReq" - - // AuthZApiResponse is the url for daemon response authorization - AuthZApiResponse = "AuthZPlugin.AuthZRes" - - // AuthZApiImplements is the name of the interface all AuthZ plugins implement - AuthZApiImplements = "authz" -) - -// PeerCertificate is a wrapper around x509.Certificate which provides a sane -// enconding/decoding to/from PEM format and JSON. -type PeerCertificate x509.Certificate - -// MarshalJSON returns the JSON encoded pem bytes of a PeerCertificate. -func (pc *PeerCertificate) MarshalJSON() ([]byte, error) { - b := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: pc.Raw}) - return json.Marshal(b) -} - -// UnmarshalJSON populates a new PeerCertificate struct from JSON data. -func (pc *PeerCertificate) UnmarshalJSON(b []byte) error { - var buf []byte - if err := json.Unmarshal(b, &buf); err != nil { - return err - } - derBytes, _ := pem.Decode(buf) - c, err := x509.ParseCertificate(derBytes.Bytes) - if err != nil { - return err - } - *pc = PeerCertificate(*c) - return nil -} - -// Request holds data required for authZ plugins -type Request struct { - // User holds the user extracted by AuthN mechanism - User string `json:"User,omitempty"` - - // UserAuthNMethod holds the mechanism used to extract user details (e.g., krb) - UserAuthNMethod string `json:"UserAuthNMethod,omitempty"` - - // RequestMethod holds the HTTP method (GET/POST/PUT) - RequestMethod string `json:"RequestMethod,omitempty"` - - // RequestUri holds the full HTTP uri (e.g., /v1.21/version) - RequestURI string `json:"RequestUri,omitempty"` - - // RequestBody stores the raw request body sent to the docker daemon - RequestBody []byte `json:"RequestBody,omitempty"` - - // RequestHeaders stores the raw request headers sent to the docker daemon - RequestHeaders map[string]string `json:"RequestHeaders,omitempty"` - - // RequestPeerCertificates stores the request's TLS peer certificates in PEM format - RequestPeerCertificates []*PeerCertificate `json:"RequestPeerCertificates,omitempty"` - - // ResponseStatusCode stores the status code returned from docker daemon - ResponseStatusCode int `json:"ResponseStatusCode,omitempty"` - - // ResponseBody stores the raw response body sent from docker daemon - ResponseBody []byte `json:"ResponseBody,omitempty"` - - // ResponseHeaders stores the response headers sent to the docker daemon - ResponseHeaders map[string]string `json:"ResponseHeaders,omitempty"` -} - -// Response represents authZ plugin response -type Response struct { - // Allow indicating whether the user is allowed or not - Allow bool `json:"Allow"` - - // Msg stores the authorization message - Msg string `json:"Msg,omitempty"` - - // Err stores a message in case there's an error - Err string `json:"Err,omitempty"` -} diff --git a/vendor/github.com/docker/docker/pkg/authorization/authz.go b/vendor/github.com/docker/docker/pkg/authorization/authz.go deleted file mode 100644 index dc9a9ae56..000000000 --- a/vendor/github.com/docker/docker/pkg/authorization/authz.go +++ /dev/null @@ -1,186 +0,0 @@ -package authorization - -import ( - "bufio" - "bytes" - "fmt" - "io" - "net/http" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/ioutils" -) - -const maxBodySize = 1048576 // 1MB - -// NewCtx creates new authZ context, it is used to store authorization information related to a specific docker -// REST http session -// A context provides two method: -// Authenticate Request: -// Call authZ plugins with current REST request and AuthN response -// Request contains full HTTP packet sent to the docker daemon -// https://docs.docker.com/engine/reference/api/ -// -// Authenticate Response: -// Call authZ plugins with full info about current REST request, REST response and AuthN response -// The response from this method may contains content that overrides the daemon response -// This allows authZ plugins to filter privileged content -// -// If multiple authZ plugins are specified, the block/allow decision is based on ANDing all plugin results -// For response manipulation, the response from each plugin is piped between plugins. Plugin execution order -// is determined according to daemon parameters -func NewCtx(authZPlugins []Plugin, user, userAuthNMethod, requestMethod, requestURI string) *Ctx { - return &Ctx{ - plugins: authZPlugins, - user: user, - userAuthNMethod: userAuthNMethod, - requestMethod: requestMethod, - requestURI: requestURI, - } -} - -// Ctx stores a single request-response interaction context -type Ctx struct { - user string - userAuthNMethod string - requestMethod string - requestURI string - plugins []Plugin - // authReq stores the cached request object for the current transaction - authReq *Request -} - -// AuthZRequest authorized the request to the docker daemon using authZ plugins -func (ctx *Ctx) AuthZRequest(w http.ResponseWriter, r *http.Request) error { - var body []byte - if sendBody(ctx.requestURI, r.Header) && r.ContentLength > 0 && r.ContentLength < maxBodySize { - var err error - body, r.Body, err = drainBody(r.Body) - if err != nil { - return err - } - } - - var h bytes.Buffer - if err := r.Header.Write(&h); err != nil { - return err - } - - ctx.authReq = &Request{ - User: ctx.user, - UserAuthNMethod: ctx.userAuthNMethod, - RequestMethod: ctx.requestMethod, - RequestURI: ctx.requestURI, - RequestBody: body, - RequestHeaders: headers(r.Header), - } - - if r.TLS != nil { - for _, c := range r.TLS.PeerCertificates { - pc := PeerCertificate(*c) - ctx.authReq.RequestPeerCertificates = append(ctx.authReq.RequestPeerCertificates, &pc) - } - } - - for _, plugin := range ctx.plugins { - logrus.Debugf("AuthZ request using plugin %s", plugin.Name()) - - authRes, err := plugin.AuthZRequest(ctx.authReq) - if err != nil { - return fmt.Errorf("plugin %s failed with error: %s", plugin.Name(), err) - } - - if !authRes.Allow { - return newAuthorizationError(plugin.Name(), authRes.Msg) - } - } - - return nil -} - -// AuthZResponse authorized and manipulates the response from docker daemon using authZ plugins -func (ctx *Ctx) AuthZResponse(rm ResponseModifier, r *http.Request) error { - ctx.authReq.ResponseStatusCode = rm.StatusCode() - ctx.authReq.ResponseHeaders = headers(rm.Header()) - - if sendBody(ctx.requestURI, rm.Header()) { - ctx.authReq.ResponseBody = rm.RawBody() - } - - for _, plugin := range ctx.plugins { - logrus.Debugf("AuthZ response using plugin %s", plugin.Name()) - - authRes, err := plugin.AuthZResponse(ctx.authReq) - if err != nil { - return fmt.Errorf("plugin %s failed with error: %s", plugin.Name(), err) - } - - if !authRes.Allow { - return newAuthorizationError(plugin.Name(), authRes.Msg) - } - } - - rm.FlushAll() - - return nil -} - -// drainBody dump the body (if its length is less than 1MB) without modifying the request state -func drainBody(body io.ReadCloser) ([]byte, io.ReadCloser, error) { - bufReader := bufio.NewReaderSize(body, maxBodySize) - newBody := ioutils.NewReadCloserWrapper(bufReader, func() error { return body.Close() }) - - data, err := bufReader.Peek(maxBodySize) - // Body size exceeds max body size - if err == nil { - logrus.Warnf("Request body is larger than: '%d' skipping body", maxBodySize) - return nil, newBody, nil - } - // Body size is less than maximum size - if err == io.EOF { - return data, newBody, nil - } - // Unknown error - return nil, newBody, err -} - -// sendBody returns true when request/response body should be sent to AuthZPlugin -func sendBody(url string, header http.Header) bool { - // Skip body for auth endpoint - if strings.HasSuffix(url, "/auth") { - return false - } - - // body is sent only for text or json messages - return header.Get("Content-Type") == "application/json" -} - -// headers returns flatten version of the http headers excluding authorization -func headers(header http.Header) map[string]string { - v := make(map[string]string, 0) - for k, values := range header { - // Skip authorization headers - if strings.EqualFold(k, "Authorization") || strings.EqualFold(k, "X-Registry-Config") || strings.EqualFold(k, "X-Registry-Auth") { - continue - } - for _, val := range values { - v[k] = val - } - } - return v -} - -// authorizationError represents an authorization deny error -type authorizationError struct { - error -} - -// HTTPErrorStatusCode returns the authorization error status code (forbidden) -func (e authorizationError) HTTPErrorStatusCode() int { - return http.StatusForbidden -} - -func newAuthorizationError(plugin, msg string) authorizationError { - return authorizationError{error: fmt.Errorf("authorization denied by plugin %s: %s", plugin, msg)} -} diff --git a/vendor/github.com/docker/docker/pkg/authorization/authz_unix_test.go b/vendor/github.com/docker/docker/pkg/authorization/authz_unix_test.go deleted file mode 100644 index a787f3cd8..000000000 --- a/vendor/github.com/docker/docker/pkg/authorization/authz_unix_test.go +++ /dev/null @@ -1,282 +0,0 @@ -// +build !windows - -// TODO Windows: This uses a Unix socket for testing. This might be possible -// to port to Windows using a named pipe instead. - -package authorization - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net" - "net/http" - "net/http/httptest" - "os" - "path" - "reflect" - "strings" - "testing" - - "github.com/docker/docker/pkg/plugins" - "github.com/docker/go-connections/tlsconfig" - "github.com/gorilla/mux" -) - -const ( - pluginAddress = "authz-test-plugin.sock" -) - -func TestAuthZRequestPluginError(t *testing.T) { - server := authZPluginTestServer{t: t} - server.start() - defer server.stop() - - authZPlugin := createTestPlugin(t) - - request := Request{ - User: "user", - RequestBody: []byte("sample body"), - RequestURI: "www.authz.com/auth", - RequestMethod: "GET", - RequestHeaders: map[string]string{"header": "value"}, - } - server.replayResponse = Response{ - Err: "an error", - } - - actualResponse, err := authZPlugin.AuthZRequest(&request) - if err != nil { - t.Fatalf("Failed to authorize request %v", err) - } - - if !reflect.DeepEqual(server.replayResponse, *actualResponse) { - t.Fatal("Response must be equal") - } - if !reflect.DeepEqual(request, server.recordedRequest) { - t.Fatal("Requests must be equal") - } -} - -func TestAuthZRequestPlugin(t *testing.T) { - server := authZPluginTestServer{t: t} - server.start() - defer server.stop() - - authZPlugin := createTestPlugin(t) - - request := Request{ - User: "user", - RequestBody: []byte("sample body"), - RequestURI: "www.authz.com/auth", - RequestMethod: "GET", - RequestHeaders: map[string]string{"header": "value"}, - } - server.replayResponse = Response{ - Allow: true, - Msg: "Sample message", - } - - actualResponse, err := authZPlugin.AuthZRequest(&request) - if err != nil { - t.Fatalf("Failed to authorize request %v", err) - } - - if !reflect.DeepEqual(server.replayResponse, *actualResponse) { - t.Fatal("Response must be equal") - } - if !reflect.DeepEqual(request, server.recordedRequest) { - t.Fatal("Requests must be equal") - } -} - -func TestAuthZResponsePlugin(t *testing.T) { - server := authZPluginTestServer{t: t} - server.start() - defer server.stop() - - authZPlugin := createTestPlugin(t) - - request := Request{ - User: "user", - RequestURI: "someting.com/auth", - RequestBody: []byte("sample body"), - } - server.replayResponse = Response{ - Allow: true, - Msg: "Sample message", - } - - actualResponse, err := authZPlugin.AuthZResponse(&request) - if err != nil { - t.Fatalf("Failed to authorize request %v", err) - } - - if !reflect.DeepEqual(server.replayResponse, *actualResponse) { - t.Fatal("Response must be equal") - } - if !reflect.DeepEqual(request, server.recordedRequest) { - t.Fatal("Requests must be equal") - } -} - -func TestResponseModifier(t *testing.T) { - r := httptest.NewRecorder() - m := NewResponseModifier(r) - m.Header().Set("h1", "v1") - m.Write([]byte("body")) - m.WriteHeader(http.StatusInternalServerError) - - m.FlushAll() - if r.Header().Get("h1") != "v1" { - t.Fatalf("Header value must exists %s", r.Header().Get("h1")) - } - if !reflect.DeepEqual(r.Body.Bytes(), []byte("body")) { - t.Fatalf("Body value must exists %s", r.Body.Bytes()) - } - if r.Code != http.StatusInternalServerError { - t.Fatalf("Status code must be correct %d", r.Code) - } -} - -func TestDrainBody(t *testing.T) { - tests := []struct { - length int // length is the message length send to drainBody - expectedBodyLength int // expectedBodyLength is the expected body length after drainBody is called - }{ - {10, 10}, // Small message size - {maxBodySize - 1, maxBodySize - 1}, // Max message size - {maxBodySize * 2, 0}, // Large message size (skip copying body) - - } - - for _, test := range tests { - msg := strings.Repeat("a", test.length) - body, closer, err := drainBody(ioutil.NopCloser(bytes.NewReader([]byte(msg)))) - if err != nil { - t.Fatal(err) - } - if len(body) != test.expectedBodyLength { - t.Fatalf("Body must be copied, actual length: '%d'", len(body)) - } - if closer == nil { - t.Fatal("Closer must not be nil") - } - modified, err := ioutil.ReadAll(closer) - if err != nil { - t.Fatalf("Error must not be nil: '%v'", err) - } - if len(modified) != len(msg) { - t.Fatalf("Result should not be truncated. Original length: '%d', new length: '%d'", len(msg), len(modified)) - } - } -} - -func TestResponseModifierOverride(t *testing.T) { - r := httptest.NewRecorder() - m := NewResponseModifier(r) - m.Header().Set("h1", "v1") - m.Write([]byte("body")) - m.WriteHeader(http.StatusInternalServerError) - - overrideHeader := make(http.Header) - overrideHeader.Add("h1", "v2") - overrideHeaderBytes, err := json.Marshal(overrideHeader) - if err != nil { - t.Fatalf("override header failed %v", err) - } - - m.OverrideHeader(overrideHeaderBytes) - m.OverrideBody([]byte("override body")) - m.OverrideStatusCode(http.StatusNotFound) - m.FlushAll() - if r.Header().Get("h1") != "v2" { - t.Fatalf("Header value must exists %s", r.Header().Get("h1")) - } - if !reflect.DeepEqual(r.Body.Bytes(), []byte("override body")) { - t.Fatalf("Body value must exists %s", r.Body.Bytes()) - } - if r.Code != http.StatusNotFound { - t.Fatalf("Status code must be correct %d", r.Code) - } -} - -// createTestPlugin creates a new sample authorization plugin -func createTestPlugin(t *testing.T) *authorizationPlugin { - pwd, err := os.Getwd() - if err != nil { - t.Fatal(err) - } - - client, err := plugins.NewClient("unix:///"+path.Join(pwd, pluginAddress), &tlsconfig.Options{InsecureSkipVerify: true}) - if err != nil { - t.Fatalf("Failed to create client %v", err) - } - - return &authorizationPlugin{name: "plugin", plugin: client} -} - -// AuthZPluginTestServer is a simple server that implements the authZ plugin interface -type authZPluginTestServer struct { - listener net.Listener - t *testing.T - // request stores the request sent from the daemon to the plugin - recordedRequest Request - // response stores the response sent from the plugin to the daemon - replayResponse Response - server *httptest.Server -} - -// start starts the test server that implements the plugin -func (t *authZPluginTestServer) start() { - r := mux.NewRouter() - l, err := net.Listen("unix", pluginAddress) - if err != nil { - t.t.Fatal(err) - } - t.listener = l - r.HandleFunc("/Plugin.Activate", t.activate) - r.HandleFunc("/"+AuthZApiRequest, t.auth) - r.HandleFunc("/"+AuthZApiResponse, t.auth) - t.server = &httptest.Server{ - Listener: l, - Config: &http.Server{ - Handler: r, - Addr: pluginAddress, - }, - } - t.server.Start() -} - -// stop stops the test server that implements the plugin -func (t *authZPluginTestServer) stop() { - t.server.Close() - os.Remove(pluginAddress) - if t.listener != nil { - t.listener.Close() - } -} - -// auth is a used to record/replay the authentication api messages -func (t *authZPluginTestServer) auth(w http.ResponseWriter, r *http.Request) { - t.recordedRequest = Request{} - body, err := ioutil.ReadAll(r.Body) - if err != nil { - t.t.Fatal(err) - } - r.Body.Close() - json.Unmarshal(body, &t.recordedRequest) - b, err := json.Marshal(t.replayResponse) - if err != nil { - t.t.Fatal(err) - } - w.Write(b) -} - -func (t *authZPluginTestServer) activate(w http.ResponseWriter, r *http.Request) { - b, err := json.Marshal(plugins.Manifest{Implements: []string{AuthZApiImplements}}) - if err != nil { - t.t.Fatal(err) - } - w.Write(b) -} diff --git a/vendor/github.com/docker/docker/pkg/authorization/middleware.go b/vendor/github.com/docker/docker/pkg/authorization/middleware.go deleted file mode 100644 index 52890dd36..000000000 --- a/vendor/github.com/docker/docker/pkg/authorization/middleware.go +++ /dev/null @@ -1,84 +0,0 @@ -package authorization - -import ( - "net/http" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/plugingetter" - "golang.org/x/net/context" -) - -// Middleware uses a list of plugins to -// handle authorization in the API requests. -type Middleware struct { - mu sync.Mutex - plugins []Plugin -} - -// NewMiddleware creates a new Middleware -// with a slice of plugins names. -func NewMiddleware(names []string, pg plugingetter.PluginGetter) *Middleware { - SetPluginGetter(pg) - return &Middleware{ - plugins: newPlugins(names), - } -} - -// SetPlugins sets the plugin used for authorization -func (m *Middleware) SetPlugins(names []string) { - m.mu.Lock() - m.plugins = newPlugins(names) - m.mu.Unlock() -} - -// WrapHandler returns a new handler function wrapping the previous one in the request chain. -func (m *Middleware) WrapHandler(handler func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error) func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - return func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { - - m.mu.Lock() - plugins := m.plugins - m.mu.Unlock() - if len(plugins) == 0 { - return handler(ctx, w, r, vars) - } - - user := "" - userAuthNMethod := "" - - // Default authorization using existing TLS connection credentials - // FIXME: Non trivial authorization mechanisms (such as advanced certificate validations, kerberos support - // and ldap) will be extracted using AuthN feature, which is tracked under: - // https://github.com/docker/docker/pull/20883 - if r.TLS != nil && len(r.TLS.PeerCertificates) > 0 { - user = r.TLS.PeerCertificates[0].Subject.CommonName - userAuthNMethod = "TLS" - } - - authCtx := NewCtx(plugins, user, userAuthNMethod, r.Method, r.RequestURI) - - if err := authCtx.AuthZRequest(w, r); err != nil { - logrus.Errorf("AuthZRequest for %s %s returned error: %s", r.Method, r.RequestURI, err) - return err - } - - rw := NewResponseModifier(w) - - var errD error - - if errD = handler(ctx, rw, r, vars); errD != nil { - logrus.Errorf("Handler for %s %s returned error: %s", r.Method, r.RequestURI, errD) - } - - if err := authCtx.AuthZResponse(rw, r); errD == nil && err != nil { - logrus.Errorf("AuthZResponse for %s %s returned error: %s", r.Method, r.RequestURI, err) - return err - } - - if errD != nil { - return errD - } - - return nil - } -} diff --git a/vendor/github.com/docker/docker/pkg/authorization/plugin.go b/vendor/github.com/docker/docker/pkg/authorization/plugin.go deleted file mode 100644 index 4b1c71bd4..000000000 --- a/vendor/github.com/docker/docker/pkg/authorization/plugin.go +++ /dev/null @@ -1,112 +0,0 @@ -package authorization - -import ( - "sync" - - "github.com/docker/docker/pkg/plugingetter" - "github.com/docker/docker/pkg/plugins" -) - -// Plugin allows third party plugins to authorize requests and responses -// in the context of docker API -type Plugin interface { - // Name returns the registered plugin name - Name() string - - // AuthZRequest authorizes the request from the client to the daemon - AuthZRequest(*Request) (*Response, error) - - // AuthZResponse authorizes the response from the daemon to the client - AuthZResponse(*Request) (*Response, error) -} - -// newPlugins constructs and initializes the authorization plugins based on plugin names -func newPlugins(names []string) []Plugin { - plugins := []Plugin{} - pluginsMap := make(map[string]struct{}) - for _, name := range names { - if _, ok := pluginsMap[name]; ok { - continue - } - pluginsMap[name] = struct{}{} - plugins = append(plugins, newAuthorizationPlugin(name)) - } - return plugins -} - -var getter plugingetter.PluginGetter - -// SetPluginGetter sets the plugingetter -func SetPluginGetter(pg plugingetter.PluginGetter) { - getter = pg -} - -// GetPluginGetter gets the plugingetter -func GetPluginGetter() plugingetter.PluginGetter { - return getter -} - -// authorizationPlugin is an internal adapter to docker plugin system -type authorizationPlugin struct { - plugin *plugins.Client - name string - once sync.Once -} - -func newAuthorizationPlugin(name string) Plugin { - return &authorizationPlugin{name: name} -} - -func (a *authorizationPlugin) Name() string { - return a.name -} - -func (a *authorizationPlugin) AuthZRequest(authReq *Request) (*Response, error) { - if err := a.initPlugin(); err != nil { - return nil, err - } - - authRes := &Response{} - if err := a.plugin.Call(AuthZApiRequest, authReq, authRes); err != nil { - return nil, err - } - - return authRes, nil -} - -func (a *authorizationPlugin) AuthZResponse(authReq *Request) (*Response, error) { - if err := a.initPlugin(); err != nil { - return nil, err - } - - authRes := &Response{} - if err := a.plugin.Call(AuthZApiResponse, authReq, authRes); err != nil { - return nil, err - } - - return authRes, nil -} - -// initPlugin initializes the authorization plugin if needed -func (a *authorizationPlugin) initPlugin() error { - // Lazy loading of plugins - var err error - a.once.Do(func() { - if a.plugin == nil { - var plugin plugingetter.CompatPlugin - var e error - - if pg := GetPluginGetter(); pg != nil { - plugin, e = pg.Get(a.name, AuthZApiImplements, plugingetter.LOOKUP) - } else { - plugin, e = plugins.Get(a.name, AuthZApiImplements) - } - if e != nil { - err = e - return - } - a.plugin = plugin.Client() - } - }) - return err -} diff --git a/vendor/github.com/docker/docker/pkg/authorization/response.go b/vendor/github.com/docker/docker/pkg/authorization/response.go deleted file mode 100644 index 129bf2f41..000000000 --- a/vendor/github.com/docker/docker/pkg/authorization/response.go +++ /dev/null @@ -1,203 +0,0 @@ -package authorization - -import ( - "bufio" - "bytes" - "encoding/json" - "fmt" - "net" - "net/http" - - "github.com/Sirupsen/logrus" -) - -// ResponseModifier allows authorization plugins to read and modify the content of the http.response -type ResponseModifier interface { - http.ResponseWriter - http.Flusher - http.CloseNotifier - - // RawBody returns the current http content - RawBody() []byte - - // RawHeaders returns the current content of the http headers - RawHeaders() ([]byte, error) - - // StatusCode returns the current status code - StatusCode() int - - // OverrideBody replaces the body of the HTTP reply - OverrideBody(b []byte) - - // OverrideHeader replaces the headers of the HTTP reply - OverrideHeader(b []byte) error - - // OverrideStatusCode replaces the status code of the HTTP reply - OverrideStatusCode(statusCode int) - - // FlushAll flushes all data to the HTTP response - FlushAll() error - - // Hijacked indicates the response has been hijacked by the Docker daemon - Hijacked() bool -} - -// NewResponseModifier creates a wrapper to an http.ResponseWriter to allow inspecting and modifying the content -func NewResponseModifier(rw http.ResponseWriter) ResponseModifier { - return &responseModifier{rw: rw, header: make(http.Header)} -} - -// responseModifier is used as an adapter to http.ResponseWriter in order to manipulate and explore -// the http request/response from docker daemon -type responseModifier struct { - // The original response writer - rw http.ResponseWriter - // body holds the response body - body []byte - // header holds the response header - header http.Header - // statusCode holds the response status code - statusCode int - // hijacked indicates the request has been hijacked - hijacked bool -} - -func (rm *responseModifier) Hijacked() bool { - return rm.hijacked -} - -// WriterHeader stores the http status code -func (rm *responseModifier) WriteHeader(s int) { - - // Use original request if hijacked - if rm.hijacked { - rm.rw.WriteHeader(s) - return - } - - rm.statusCode = s -} - -// Header returns the internal http header -func (rm *responseModifier) Header() http.Header { - - // Use original header if hijacked - if rm.hijacked { - return rm.rw.Header() - } - - return rm.header -} - -// StatusCode returns the http status code -func (rm *responseModifier) StatusCode() int { - return rm.statusCode -} - -// OverrideBody replaces the body of the HTTP response -func (rm *responseModifier) OverrideBody(b []byte) { - rm.body = b -} - -// OverrideStatusCode replaces the status code of the HTTP response -func (rm *responseModifier) OverrideStatusCode(statusCode int) { - rm.statusCode = statusCode -} - -// OverrideHeader replaces the headers of the HTTP response -func (rm *responseModifier) OverrideHeader(b []byte) error { - header := http.Header{} - if err := json.Unmarshal(b, &header); err != nil { - return err - } - rm.header = header - return nil -} - -// Write stores the byte array inside content -func (rm *responseModifier) Write(b []byte) (int, error) { - - if rm.hijacked { - return rm.rw.Write(b) - } - - rm.body = append(rm.body, b...) - return len(b), nil -} - -// Body returns the response body -func (rm *responseModifier) RawBody() []byte { - return rm.body -} - -func (rm *responseModifier) RawHeaders() ([]byte, error) { - var b bytes.Buffer - if err := rm.header.Write(&b); err != nil { - return nil, err - } - return b.Bytes(), nil -} - -// Hijack returns the internal connection of the wrapped http.ResponseWriter -func (rm *responseModifier) Hijack() (net.Conn, *bufio.ReadWriter, error) { - - rm.hijacked = true - rm.FlushAll() - - hijacker, ok := rm.rw.(http.Hijacker) - if !ok { - return nil, nil, fmt.Errorf("Internal response writer doesn't support the Hijacker interface") - } - return hijacker.Hijack() -} - -// CloseNotify uses the internal close notify API of the wrapped http.ResponseWriter -func (rm *responseModifier) CloseNotify() <-chan bool { - closeNotifier, ok := rm.rw.(http.CloseNotifier) - if !ok { - logrus.Error("Internal response writer doesn't support the CloseNotifier interface") - return nil - } - return closeNotifier.CloseNotify() -} - -// Flush uses the internal flush API of the wrapped http.ResponseWriter -func (rm *responseModifier) Flush() { - flusher, ok := rm.rw.(http.Flusher) - if !ok { - logrus.Error("Internal response writer doesn't support the Flusher interface") - return - } - - rm.FlushAll() - flusher.Flush() -} - -// FlushAll flushes all data to the HTTP response -func (rm *responseModifier) FlushAll() error { - // Copy the header - for k, vv := range rm.header { - for _, v := range vv { - rm.rw.Header().Add(k, v) - } - } - - // Copy the status code - // Also WriteHeader needs to be done after all the headers - // have been copied (above). - if rm.statusCode > 0 { - rm.rw.WriteHeader(rm.statusCode) - } - - var err error - if len(rm.body) > 0 { - // Write body - _, err = rm.rw.Write(rm.body) - } - - // Clean previous data - rm.body = nil - rm.statusCode = 0 - rm.header = http.Header{} - return err -} diff --git a/vendor/github.com/docker/docker/pkg/broadcaster/unbuffered.go b/vendor/github.com/docker/docker/pkg/broadcaster/unbuffered.go deleted file mode 100644 index 784d65d6f..000000000 --- a/vendor/github.com/docker/docker/pkg/broadcaster/unbuffered.go +++ /dev/null @@ -1,49 +0,0 @@ -package broadcaster - -import ( - "io" - "sync" -) - -// Unbuffered accumulates multiple io.WriteCloser by stream. -type Unbuffered struct { - mu sync.Mutex - writers []io.WriteCloser -} - -// Add adds new io.WriteCloser. -func (w *Unbuffered) Add(writer io.WriteCloser) { - w.mu.Lock() - w.writers = append(w.writers, writer) - w.mu.Unlock() -} - -// Write writes bytes to all writers. Failed writers will be evicted during -// this call. -func (w *Unbuffered) Write(p []byte) (n int, err error) { - w.mu.Lock() - var evict []int - for i, sw := range w.writers { - if n, err := sw.Write(p); err != nil || n != len(p) { - // On error, evict the writer - evict = append(evict, i) - } - } - for n, i := range evict { - w.writers = append(w.writers[:i-n], w.writers[i-n+1:]...) - } - w.mu.Unlock() - return len(p), nil -} - -// Clean closes and removes all writers. Last non-eol-terminated part of data -// will be saved. -func (w *Unbuffered) Clean() error { - w.mu.Lock() - for _, sw := range w.writers { - sw.Close() - } - w.writers = nil - w.mu.Unlock() - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/broadcaster/unbuffered_test.go b/vendor/github.com/docker/docker/pkg/broadcaster/unbuffered_test.go deleted file mode 100644 index 9f8e72bc0..000000000 --- a/vendor/github.com/docker/docker/pkg/broadcaster/unbuffered_test.go +++ /dev/null @@ -1,162 +0,0 @@ -package broadcaster - -import ( - "bytes" - "errors" - "strings" - - "testing" -) - -type dummyWriter struct { - buffer bytes.Buffer - failOnWrite bool -} - -func (dw *dummyWriter) Write(p []byte) (n int, err error) { - if dw.failOnWrite { - return 0, errors.New("Fake fail") - } - return dw.buffer.Write(p) -} - -func (dw *dummyWriter) String() string { - return dw.buffer.String() -} - -func (dw *dummyWriter) Close() error { - return nil -} - -func TestUnbuffered(t *testing.T) { - writer := new(Unbuffered) - - // Test 1: Both bufferA and bufferB should contain "foo" - bufferA := &dummyWriter{} - writer.Add(bufferA) - bufferB := &dummyWriter{} - writer.Add(bufferB) - writer.Write([]byte("foo")) - - if bufferA.String() != "foo" { - t.Errorf("Buffer contains %v", bufferA.String()) - } - - if bufferB.String() != "foo" { - t.Errorf("Buffer contains %v", bufferB.String()) - } - - // Test2: bufferA and bufferB should contain "foobar", - // while bufferC should only contain "bar" - bufferC := &dummyWriter{} - writer.Add(bufferC) - writer.Write([]byte("bar")) - - if bufferA.String() != "foobar" { - t.Errorf("Buffer contains %v", bufferA.String()) - } - - if bufferB.String() != "foobar" { - t.Errorf("Buffer contains %v", bufferB.String()) - } - - if bufferC.String() != "bar" { - t.Errorf("Buffer contains %v", bufferC.String()) - } - - // Test3: Test eviction on failure - bufferA.failOnWrite = true - writer.Write([]byte("fail")) - if bufferA.String() != "foobar" { - t.Errorf("Buffer contains %v", bufferA.String()) - } - if bufferC.String() != "barfail" { - t.Errorf("Buffer contains %v", bufferC.String()) - } - // Even though we reset the flag, no more writes should go in there - bufferA.failOnWrite = false - writer.Write([]byte("test")) - if bufferA.String() != "foobar" { - t.Errorf("Buffer contains %v", bufferA.String()) - } - if bufferC.String() != "barfailtest" { - t.Errorf("Buffer contains %v", bufferC.String()) - } - - // Test4: Test eviction on multiple simultaneous failures - bufferB.failOnWrite = true - bufferC.failOnWrite = true - bufferD := &dummyWriter{} - writer.Add(bufferD) - writer.Write([]byte("yo")) - writer.Write([]byte("ink")) - if strings.Contains(bufferB.String(), "yoink") { - t.Errorf("bufferB received write. contents: %q", bufferB) - } - if strings.Contains(bufferC.String(), "yoink") { - t.Errorf("bufferC received write. contents: %q", bufferC) - } - if g, w := bufferD.String(), "yoink"; g != w { - t.Errorf("bufferD = %q, want %q", g, w) - } - - writer.Clean() -} - -type devNullCloser int - -func (d devNullCloser) Close() error { - return nil -} - -func (d devNullCloser) Write(buf []byte) (int, error) { - return len(buf), nil -} - -// This test checks for races. It is only useful when run with the race detector. -func TestRaceUnbuffered(t *testing.T) { - writer := new(Unbuffered) - c := make(chan bool) - go func() { - writer.Add(devNullCloser(0)) - c <- true - }() - writer.Write([]byte("hello")) - <-c -} - -func BenchmarkUnbuffered(b *testing.B) { - writer := new(Unbuffered) - setUpWriter := func() { - for i := 0; i < 100; i++ { - writer.Add(devNullCloser(0)) - writer.Add(devNullCloser(0)) - writer.Add(devNullCloser(0)) - } - } - testLine := "Line that thinks that it is log line from docker" - var buf bytes.Buffer - for i := 0; i < 100; i++ { - buf.Write([]byte(testLine + "\n")) - } - // line without eol - buf.Write([]byte(testLine)) - testText := buf.Bytes() - b.SetBytes(int64(5 * len(testText))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - b.StopTimer() - setUpWriter() - b.StartTimer() - - for j := 0; j < 5; j++ { - if _, err := writer.Write(testText); err != nil { - b.Fatal(err) - } - } - - b.StopTimer() - writer.Clean() - b.StartTimer() - } -} diff --git a/vendor/github.com/docker/docker/pkg/chrootarchive/archive.go b/vendor/github.com/docker/docker/pkg/chrootarchive/archive.go deleted file mode 100644 index a7814f5b9..000000000 --- a/vendor/github.com/docker/docker/pkg/chrootarchive/archive.go +++ /dev/null @@ -1,97 +0,0 @@ -package chrootarchive - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/idtools" -) - -var chrootArchiver = &archive.Archiver{Untar: Untar} - -// Untar reads a stream of bytes from `archive`, parses it as a tar archive, -// and unpacks it into the directory at `dest`. -// The archive may be compressed with one of the following algorithms: -// identity (uncompressed), gzip, bzip2, xz. -func Untar(tarArchive io.Reader, dest string, options *archive.TarOptions) error { - return untarHandler(tarArchive, dest, options, true) -} - -// UntarUncompressed reads a stream of bytes from `archive`, parses it as a tar archive, -// and unpacks it into the directory at `dest`. -// The archive must be an uncompressed stream. -func UntarUncompressed(tarArchive io.Reader, dest string, options *archive.TarOptions) error { - return untarHandler(tarArchive, dest, options, false) -} - -// Handler for teasing out the automatic decompression -func untarHandler(tarArchive io.Reader, dest string, options *archive.TarOptions, decompress bool) error { - - if tarArchive == nil { - return fmt.Errorf("Empty archive") - } - if options == nil { - options = &archive.TarOptions{} - } - if options.ExcludePatterns == nil { - options.ExcludePatterns = []string{} - } - - rootUID, rootGID, err := idtools.GetRootUIDGID(options.UIDMaps, options.GIDMaps) - if err != nil { - return err - } - - dest = filepath.Clean(dest) - if _, err := os.Stat(dest); os.IsNotExist(err) { - if err := idtools.MkdirAllNewAs(dest, 0755, rootUID, rootGID); err != nil { - return err - } - } - - r := ioutil.NopCloser(tarArchive) - if decompress { - decompressedArchive, err := archive.DecompressStream(tarArchive) - if err != nil { - return err - } - defer decompressedArchive.Close() - r = decompressedArchive - } - - return invokeUnpack(r, dest, options) -} - -// TarUntar is a convenience function which calls Tar and Untar, with the output of one piped into the other. -// If either Tar or Untar fails, TarUntar aborts and returns the error. -func TarUntar(src, dst string) error { - return chrootArchiver.TarUntar(src, dst) -} - -// CopyWithTar creates a tar archive of filesystem path `src`, and -// unpacks it at filesystem path `dst`. -// The archive is streamed directly with fixed buffering and no -// intermediary disk IO. -func CopyWithTar(src, dst string) error { - return chrootArchiver.CopyWithTar(src, dst) -} - -// CopyFileWithTar emulates the behavior of the 'cp' command-line -// for a single file. It copies a regular file from path `src` to -// path `dst`, and preserves all its metadata. -// -// If `dst` ends with a trailing slash '/' ('\' on Windows), the final -// destination path will be `dst/base(src)` or `dst\base(src)` -func CopyFileWithTar(src, dst string) (err error) { - return chrootArchiver.CopyFileWithTar(src, dst) -} - -// UntarPath is a convenience function which looks for an archive -// at filesystem path `src`, and unpacks it at `dst`. -func UntarPath(src, dst string) error { - return chrootArchiver.UntarPath(src, dst) -} diff --git a/vendor/github.com/docker/docker/pkg/chrootarchive/archive_test.go b/vendor/github.com/docker/docker/pkg/chrootarchive/archive_test.go deleted file mode 100644 index d2d7e621f..000000000 --- a/vendor/github.com/docker/docker/pkg/chrootarchive/archive_test.go +++ /dev/null @@ -1,394 +0,0 @@ -package chrootarchive - -import ( - "bytes" - "fmt" - "hash/crc32" - "io" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strings" - "testing" - "time" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/reexec" - "github.com/docker/docker/pkg/system" -) - -func init() { - reexec.Init() -} - -func TestChrootTarUntar(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "docker-TestChrootTarUntar") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - src := filepath.Join(tmpdir, "src") - if err := system.MkdirAll(src, 0700); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(src, "toto"), []byte("hello toto"), 0644); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(src, "lolo"), []byte("hello lolo"), 0644); err != nil { - t.Fatal(err) - } - stream, err := archive.Tar(src, archive.Uncompressed) - if err != nil { - t.Fatal(err) - } - dest := filepath.Join(tmpdir, "src") - if err := system.MkdirAll(dest, 0700); err != nil { - t.Fatal(err) - } - if err := Untar(stream, dest, &archive.TarOptions{ExcludePatterns: []string{"lolo"}}); err != nil { - t.Fatal(err) - } -} - -// gh#10426: Verify the fix for having a huge excludes list (like on `docker load` with large # of -// local images) -func TestChrootUntarWithHugeExcludesList(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "docker-TestChrootUntarHugeExcludes") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - src := filepath.Join(tmpdir, "src") - if err := system.MkdirAll(src, 0700); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(src, "toto"), []byte("hello toto"), 0644); err != nil { - t.Fatal(err) - } - stream, err := archive.Tar(src, archive.Uncompressed) - if err != nil { - t.Fatal(err) - } - dest := filepath.Join(tmpdir, "dest") - if err := system.MkdirAll(dest, 0700); err != nil { - t.Fatal(err) - } - options := &archive.TarOptions{} - //65534 entries of 64-byte strings ~= 4MB of environment space which should overflow - //on most systems when passed via environment or command line arguments - excludes := make([]string, 65534, 65534) - for i := 0; i < 65534; i++ { - excludes[i] = strings.Repeat(string(i), 64) - } - options.ExcludePatterns = excludes - if err := Untar(stream, dest, options); err != nil { - t.Fatal(err) - } -} - -func TestChrootUntarEmptyArchive(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "docker-TestChrootUntarEmptyArchive") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - if err := Untar(nil, tmpdir, nil); err == nil { - t.Fatal("expected error on empty archive") - } -} - -func prepareSourceDirectory(numberOfFiles int, targetPath string, makeSymLinks bool) (int, error) { - fileData := []byte("fooo") - for n := 0; n < numberOfFiles; n++ { - fileName := fmt.Sprintf("file-%d", n) - if err := ioutil.WriteFile(filepath.Join(targetPath, fileName), fileData, 0700); err != nil { - return 0, err - } - if makeSymLinks { - if err := os.Symlink(filepath.Join(targetPath, fileName), filepath.Join(targetPath, fileName+"-link")); err != nil { - return 0, err - } - } - } - totalSize := numberOfFiles * len(fileData) - return totalSize, nil -} - -func getHash(filename string) (uint32, error) { - stream, err := ioutil.ReadFile(filename) - if err != nil { - return 0, err - } - hash := crc32.NewIEEE() - hash.Write(stream) - return hash.Sum32(), nil -} - -func compareDirectories(src string, dest string) error { - changes, err := archive.ChangesDirs(dest, src) - if err != nil { - return err - } - if len(changes) > 0 { - return fmt.Errorf("Unexpected differences after untar: %v", changes) - } - return nil -} - -func compareFiles(src string, dest string) error { - srcHash, err := getHash(src) - if err != nil { - return err - } - destHash, err := getHash(dest) - if err != nil { - return err - } - if srcHash != destHash { - return fmt.Errorf("%s is different from %s", src, dest) - } - return nil -} - -func TestChrootTarUntarWithSymlink(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - tmpdir, err := ioutil.TempDir("", "docker-TestChrootTarUntarWithSymlink") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - src := filepath.Join(tmpdir, "src") - if err := system.MkdirAll(src, 0700); err != nil { - t.Fatal(err) - } - if _, err := prepareSourceDirectory(10, src, false); err != nil { - t.Fatal(err) - } - dest := filepath.Join(tmpdir, "dest") - if err := TarUntar(src, dest); err != nil { - t.Fatal(err) - } - if err := compareDirectories(src, dest); err != nil { - t.Fatal(err) - } -} - -func TestChrootCopyWithTar(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" || runtime.GOOS == "solaris" { - t.Skip("Failing on Windows and Solaris") - } - tmpdir, err := ioutil.TempDir("", "docker-TestChrootCopyWithTar") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - src := filepath.Join(tmpdir, "src") - if err := system.MkdirAll(src, 0700); err != nil { - t.Fatal(err) - } - if _, err := prepareSourceDirectory(10, src, true); err != nil { - t.Fatal(err) - } - - // Copy directory - dest := filepath.Join(tmpdir, "dest") - if err := CopyWithTar(src, dest); err != nil { - t.Fatal(err) - } - if err := compareDirectories(src, dest); err != nil { - t.Fatal(err) - } - - // Copy file - srcfile := filepath.Join(src, "file-1") - dest = filepath.Join(tmpdir, "destFile") - destfile := filepath.Join(dest, "file-1") - if err := CopyWithTar(srcfile, destfile); err != nil { - t.Fatal(err) - } - if err := compareFiles(srcfile, destfile); err != nil { - t.Fatal(err) - } - - // Copy symbolic link - srcLinkfile := filepath.Join(src, "file-1-link") - dest = filepath.Join(tmpdir, "destSymlink") - destLinkfile := filepath.Join(dest, "file-1-link") - if err := CopyWithTar(srcLinkfile, destLinkfile); err != nil { - t.Fatal(err) - } - if err := compareFiles(srcLinkfile, destLinkfile); err != nil { - t.Fatal(err) - } -} - -func TestChrootCopyFileWithTar(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "docker-TestChrootCopyFileWithTar") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - src := filepath.Join(tmpdir, "src") - if err := system.MkdirAll(src, 0700); err != nil { - t.Fatal(err) - } - if _, err := prepareSourceDirectory(10, src, true); err != nil { - t.Fatal(err) - } - - // Copy directory - dest := filepath.Join(tmpdir, "dest") - if err := CopyFileWithTar(src, dest); err == nil { - t.Fatal("Expected error on copying directory") - } - - // Copy file - srcfile := filepath.Join(src, "file-1") - dest = filepath.Join(tmpdir, "destFile") - destfile := filepath.Join(dest, "file-1") - if err := CopyFileWithTar(srcfile, destfile); err != nil { - t.Fatal(err) - } - if err := compareFiles(srcfile, destfile); err != nil { - t.Fatal(err) - } - - // Copy symbolic link - srcLinkfile := filepath.Join(src, "file-1-link") - dest = filepath.Join(tmpdir, "destSymlink") - destLinkfile := filepath.Join(dest, "file-1-link") - if err := CopyFileWithTar(srcLinkfile, destLinkfile); err != nil { - t.Fatal(err) - } - if err := compareFiles(srcLinkfile, destLinkfile); err != nil { - t.Fatal(err) - } -} - -func TestChrootUntarPath(t *testing.T) { - // TODO Windows: Figure out why this is failing - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows") - } - tmpdir, err := ioutil.TempDir("", "docker-TestChrootUntarPath") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - src := filepath.Join(tmpdir, "src") - if err := system.MkdirAll(src, 0700); err != nil { - t.Fatal(err) - } - if _, err := prepareSourceDirectory(10, src, false); err != nil { - t.Fatal(err) - } - dest := filepath.Join(tmpdir, "dest") - // Untar a directory - if err := UntarPath(src, dest); err == nil { - t.Fatal("Expected error on untaring a directory") - } - - // Untar a tar file - stream, err := archive.Tar(src, archive.Uncompressed) - if err != nil { - t.Fatal(err) - } - buf := new(bytes.Buffer) - buf.ReadFrom(stream) - tarfile := filepath.Join(tmpdir, "src.tar") - if err := ioutil.WriteFile(tarfile, buf.Bytes(), 0644); err != nil { - t.Fatal(err) - } - if err := UntarPath(tarfile, dest); err != nil { - t.Fatal(err) - } - if err := compareDirectories(src, dest); err != nil { - t.Fatal(err) - } -} - -type slowEmptyTarReader struct { - size int - offset int - chunkSize int -} - -// Read is a slow reader of an empty tar (like the output of "tar c --files-from /dev/null") -func (s *slowEmptyTarReader) Read(p []byte) (int, error) { - time.Sleep(100 * time.Millisecond) - count := s.chunkSize - if len(p) < s.chunkSize { - count = len(p) - } - for i := 0; i < count; i++ { - p[i] = 0 - } - s.offset += count - if s.offset > s.size { - return count, io.EOF - } - return count, nil -} - -func TestChrootUntarEmptyArchiveFromSlowReader(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "docker-TestChrootUntarEmptyArchiveFromSlowReader") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - dest := filepath.Join(tmpdir, "dest") - if err := system.MkdirAll(dest, 0700); err != nil { - t.Fatal(err) - } - stream := &slowEmptyTarReader{size: 10240, chunkSize: 1024} - if err := Untar(stream, dest, nil); err != nil { - t.Fatal(err) - } -} - -func TestChrootApplyEmptyArchiveFromSlowReader(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "docker-TestChrootApplyEmptyArchiveFromSlowReader") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - dest := filepath.Join(tmpdir, "dest") - if err := system.MkdirAll(dest, 0700); err != nil { - t.Fatal(err) - } - stream := &slowEmptyTarReader{size: 10240, chunkSize: 1024} - if _, err := ApplyLayer(dest, stream); err != nil { - t.Fatal(err) - } -} - -func TestChrootApplyDotDotFile(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "docker-TestChrootApplyDotDotFile") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - src := filepath.Join(tmpdir, "src") - if err := system.MkdirAll(src, 0700); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(filepath.Join(src, "..gitme"), []byte(""), 0644); err != nil { - t.Fatal(err) - } - stream, err := archive.Tar(src, archive.Uncompressed) - if err != nil { - t.Fatal(err) - } - dest := filepath.Join(tmpdir, "dest") - if err := system.MkdirAll(dest, 0700); err != nil { - t.Fatal(err) - } - if _, err := ApplyLayer(dest, stream); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/docker/pkg/chrootarchive/archive_unix.go b/vendor/github.com/docker/docker/pkg/chrootarchive/archive_unix.go deleted file mode 100644 index f2325abd7..000000000 --- a/vendor/github.com/docker/docker/pkg/chrootarchive/archive_unix.go +++ /dev/null @@ -1,86 +0,0 @@ -// +build !windows - -package chrootarchive - -import ( - "bytes" - "encoding/json" - "flag" - "fmt" - "io" - "io/ioutil" - "os" - "runtime" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/reexec" -) - -// untar is the entry-point for docker-untar on re-exec. This is not used on -// Windows as it does not support chroot, hence no point sandboxing through -// chroot and rexec. -func untar() { - runtime.LockOSThread() - flag.Parse() - - var options *archive.TarOptions - - //read the options from the pipe "ExtraFiles" - if err := json.NewDecoder(os.NewFile(3, "options")).Decode(&options); err != nil { - fatal(err) - } - - if err := chroot(flag.Arg(0)); err != nil { - fatal(err) - } - - if err := archive.Unpack(os.Stdin, "/", options); err != nil { - fatal(err) - } - // fully consume stdin in case it is zero padded - if _, err := flush(os.Stdin); err != nil { - fatal(err) - } - - os.Exit(0) -} - -func invokeUnpack(decompressedArchive io.Reader, dest string, options *archive.TarOptions) error { - - // We can't pass a potentially large exclude list directly via cmd line - // because we easily overrun the kernel's max argument/environment size - // when the full image list is passed (e.g. when this is used by - // `docker load`). We will marshall the options via a pipe to the - // child - r, w, err := os.Pipe() - if err != nil { - return fmt.Errorf("Untar pipe failure: %v", err) - } - - cmd := reexec.Command("docker-untar", dest) - cmd.Stdin = decompressedArchive - - cmd.ExtraFiles = append(cmd.ExtraFiles, r) - output := bytes.NewBuffer(nil) - cmd.Stdout = output - cmd.Stderr = output - - if err := cmd.Start(); err != nil { - return fmt.Errorf("Untar error on re-exec cmd: %v", err) - } - //write the options to the pipe for the untar exec to read - if err := json.NewEncoder(w).Encode(options); err != nil { - return fmt.Errorf("Untar json encode to pipe failed: %v", err) - } - w.Close() - - if err := cmd.Wait(); err != nil { - // when `xz -d -c -q | docker-untar ...` failed on docker-untar side, - // we need to exhaust `xz`'s output, otherwise the `xz` side will be - // pending on write pipe forever - io.Copy(ioutil.Discard, decompressedArchive) - - return fmt.Errorf("Error processing tar file(%v): %s", err, output) - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/chrootarchive/archive_windows.go b/vendor/github.com/docker/docker/pkg/chrootarchive/archive_windows.go deleted file mode 100644 index 0a500ed5c..000000000 --- a/vendor/github.com/docker/docker/pkg/chrootarchive/archive_windows.go +++ /dev/null @@ -1,22 +0,0 @@ -package chrootarchive - -import ( - "io" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/longpath" -) - -// chroot is not supported by Windows -func chroot(path string) error { - return nil -} - -func invokeUnpack(decompressedArchive io.ReadCloser, - dest string, - options *archive.TarOptions) error { - // Windows is different to Linux here because Windows does not support - // chroot. Hence there is no point sandboxing a chrooted process to - // do the unpack. We call inline instead within the daemon process. - return archive.Unpack(decompressedArchive, longpath.AddPrefix(dest), options) -} diff --git a/vendor/github.com/docker/docker/pkg/chrootarchive/chroot_linux.go b/vendor/github.com/docker/docker/pkg/chrootarchive/chroot_linux.go deleted file mode 100644 index f9d7fed63..000000000 --- a/vendor/github.com/docker/docker/pkg/chrootarchive/chroot_linux.go +++ /dev/null @@ -1,108 +0,0 @@ -package chrootarchive - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "syscall" - - "github.com/docker/docker/pkg/mount" - rsystem "github.com/opencontainers/runc/libcontainer/system" -) - -// chroot on linux uses pivot_root instead of chroot -// pivot_root takes a new root and an old root. -// Old root must be a sub-dir of new root, it is where the current rootfs will reside after the call to pivot_root. -// New root is where the new rootfs is set to. -// Old root is removed after the call to pivot_root so it is no longer available under the new root. -// This is similar to how libcontainer sets up a container's rootfs -func chroot(path string) (err error) { - // if the engine is running in a user namespace we need to use actual chroot - if rsystem.RunningInUserNS() { - return realChroot(path) - } - if err := syscall.Unshare(syscall.CLONE_NEWNS); err != nil { - return fmt.Errorf("Error creating mount namespace before pivot: %v", err) - } - - // make everything in new ns private - if err := mount.MakeRPrivate("/"); err != nil { - return err - } - - if mounted, _ := mount.Mounted(path); !mounted { - if err := mount.Mount(path, path, "bind", "rbind,rw"); err != nil { - return realChroot(path) - } - } - - // setup oldRoot for pivot_root - pivotDir, err := ioutil.TempDir(path, ".pivot_root") - if err != nil { - return fmt.Errorf("Error setting up pivot dir: %v", err) - } - - var mounted bool - defer func() { - if mounted { - // make sure pivotDir is not mounted before we try to remove it - if errCleanup := syscall.Unmount(pivotDir, syscall.MNT_DETACH); errCleanup != nil { - if err == nil { - err = errCleanup - } - return - } - } - - errCleanup := os.Remove(pivotDir) - // pivotDir doesn't exist if pivot_root failed and chroot+chdir was successful - // because we already cleaned it up on failed pivot_root - if errCleanup != nil && !os.IsNotExist(errCleanup) { - errCleanup = fmt.Errorf("Error cleaning up after pivot: %v", errCleanup) - if err == nil { - err = errCleanup - } - } - }() - - if err := syscall.PivotRoot(path, pivotDir); err != nil { - // If pivot fails, fall back to the normal chroot after cleaning up temp dir - if err := os.Remove(pivotDir); err != nil { - return fmt.Errorf("Error cleaning up after failed pivot: %v", err) - } - return realChroot(path) - } - mounted = true - - // This is the new path for where the old root (prior to the pivot) has been moved to - // This dir contains the rootfs of the caller, which we need to remove so it is not visible during extraction - pivotDir = filepath.Join("/", filepath.Base(pivotDir)) - - if err := syscall.Chdir("/"); err != nil { - return fmt.Errorf("Error changing to new root: %v", err) - } - - // Make the pivotDir (where the old root lives) private so it can be unmounted without propagating to the host - if err := syscall.Mount("", pivotDir, "", syscall.MS_PRIVATE|syscall.MS_REC, ""); err != nil { - return fmt.Errorf("Error making old root private after pivot: %v", err) - } - - // Now unmount the old root so it's no longer visible from the new root - if err := syscall.Unmount(pivotDir, syscall.MNT_DETACH); err != nil { - return fmt.Errorf("Error while unmounting old root after pivot: %v", err) - } - mounted = false - - return nil -} - -func realChroot(path string) error { - if err := syscall.Chroot(path); err != nil { - return fmt.Errorf("Error after fallback to chroot: %v", err) - } - if err := syscall.Chdir("/"); err != nil { - return fmt.Errorf("Error changing to new root after chroot: %v", err) - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/chrootarchive/chroot_unix.go b/vendor/github.com/docker/docker/pkg/chrootarchive/chroot_unix.go deleted file mode 100644 index 16354bf64..000000000 --- a/vendor/github.com/docker/docker/pkg/chrootarchive/chroot_unix.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !windows,!linux - -package chrootarchive - -import "syscall" - -func chroot(path string) error { - if err := syscall.Chroot(path); err != nil { - return err - } - return syscall.Chdir("/") -} diff --git a/vendor/github.com/docker/docker/pkg/chrootarchive/diff.go b/vendor/github.com/docker/docker/pkg/chrootarchive/diff.go deleted file mode 100644 index 49acad79f..000000000 --- a/vendor/github.com/docker/docker/pkg/chrootarchive/diff.go +++ /dev/null @@ -1,23 +0,0 @@ -package chrootarchive - -import ( - "io" - - "github.com/docker/docker/pkg/archive" -) - -// ApplyLayer parses a diff in the standard layer format from `layer`, -// and applies it to the directory `dest`. The stream `layer` can only be -// uncompressed. -// Returns the size in bytes of the contents of the layer. -func ApplyLayer(dest string, layer io.Reader) (size int64, err error) { - return applyLayerHandler(dest, layer, &archive.TarOptions{}, true) -} - -// ApplyUncompressedLayer parses a diff in the standard layer format from -// `layer`, and applies it to the directory `dest`. The stream `layer` -// can only be uncompressed. -// Returns the size in bytes of the contents of the layer. -func ApplyUncompressedLayer(dest string, layer io.Reader, options *archive.TarOptions) (int64, error) { - return applyLayerHandler(dest, layer, options, false) -} diff --git a/vendor/github.com/docker/docker/pkg/chrootarchive/diff_unix.go b/vendor/github.com/docker/docker/pkg/chrootarchive/diff_unix.go deleted file mode 100644 index eb0aacc3a..000000000 --- a/vendor/github.com/docker/docker/pkg/chrootarchive/diff_unix.go +++ /dev/null @@ -1,130 +0,0 @@ -//+build !windows - -package chrootarchive - -import ( - "bytes" - "encoding/json" - "flag" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "runtime" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/reexec" - "github.com/docker/docker/pkg/system" - rsystem "github.com/opencontainers/runc/libcontainer/system" -) - -type applyLayerResponse struct { - LayerSize int64 `json:"layerSize"` -} - -// applyLayer is the entry-point for docker-applylayer on re-exec. This is not -// used on Windows as it does not support chroot, hence no point sandboxing -// through chroot and rexec. -func applyLayer() { - - var ( - tmpDir = "" - err error - options *archive.TarOptions - ) - runtime.LockOSThread() - flag.Parse() - - inUserns := rsystem.RunningInUserNS() - if err := chroot(flag.Arg(0)); err != nil { - fatal(err) - } - - // We need to be able to set any perms - oldmask, err := system.Umask(0) - defer system.Umask(oldmask) - if err != nil { - fatal(err) - } - - if err := json.Unmarshal([]byte(os.Getenv("OPT")), &options); err != nil { - fatal(err) - } - - if inUserns { - options.InUserNS = true - } - - if tmpDir, err = ioutil.TempDir("/", "temp-docker-extract"); err != nil { - fatal(err) - } - - os.Setenv("TMPDIR", tmpDir) - size, err := archive.UnpackLayer("/", os.Stdin, options) - os.RemoveAll(tmpDir) - if err != nil { - fatal(err) - } - - encoder := json.NewEncoder(os.Stdout) - if err := encoder.Encode(applyLayerResponse{size}); err != nil { - fatal(fmt.Errorf("unable to encode layerSize JSON: %s", err)) - } - - if _, err := flush(os.Stdin); err != nil { - fatal(err) - } - - os.Exit(0) -} - -// applyLayerHandler parses a diff in the standard layer format from `layer`, and -// applies it to the directory `dest`. Returns the size in bytes of the -// contents of the layer. -func applyLayerHandler(dest string, layer io.Reader, options *archive.TarOptions, decompress bool) (size int64, err error) { - dest = filepath.Clean(dest) - if decompress { - decompressed, err := archive.DecompressStream(layer) - if err != nil { - return 0, err - } - defer decompressed.Close() - - layer = decompressed - } - if options == nil { - options = &archive.TarOptions{} - if rsystem.RunningInUserNS() { - options.InUserNS = true - } - } - if options.ExcludePatterns == nil { - options.ExcludePatterns = []string{} - } - - data, err := json.Marshal(options) - if err != nil { - return 0, fmt.Errorf("ApplyLayer json encode: %v", err) - } - - cmd := reexec.Command("docker-applyLayer", dest) - cmd.Stdin = layer - cmd.Env = append(cmd.Env, fmt.Sprintf("OPT=%s", data)) - - outBuf, errBuf := new(bytes.Buffer), new(bytes.Buffer) - cmd.Stdout, cmd.Stderr = outBuf, errBuf - - if err = cmd.Run(); err != nil { - return 0, fmt.Errorf("ApplyLayer %s stdout: %s stderr: %s", err, outBuf, errBuf) - } - - // Stdout should be a valid JSON struct representing an applyLayerResponse. - response := applyLayerResponse{} - decoder := json.NewDecoder(outBuf) - if err = decoder.Decode(&response); err != nil { - return 0, fmt.Errorf("unable to decode ApplyLayer JSON response: %s", err) - } - - return response.LayerSize, nil -} diff --git a/vendor/github.com/docker/docker/pkg/chrootarchive/diff_windows.go b/vendor/github.com/docker/docker/pkg/chrootarchive/diff_windows.go deleted file mode 100644 index 9dd9988de..000000000 --- a/vendor/github.com/docker/docker/pkg/chrootarchive/diff_windows.go +++ /dev/null @@ -1,45 +0,0 @@ -package chrootarchive - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/longpath" -) - -// applyLayerHandler parses a diff in the standard layer format from `layer`, and -// applies it to the directory `dest`. Returns the size in bytes of the -// contents of the layer. -func applyLayerHandler(dest string, layer io.Reader, options *archive.TarOptions, decompress bool) (size int64, err error) { - dest = filepath.Clean(dest) - - // Ensure it is a Windows-style volume path - dest = longpath.AddPrefix(dest) - - if decompress { - decompressed, err := archive.DecompressStream(layer) - if err != nil { - return 0, err - } - defer decompressed.Close() - - layer = decompressed - } - - tmpDir, err := ioutil.TempDir(os.Getenv("temp"), "temp-docker-extract") - if err != nil { - return 0, fmt.Errorf("ApplyLayer failed to create temp-docker-extract under %s. %s", dest, err) - } - - s, err := archive.UnpackLayer(dest, layer, nil) - os.RemoveAll(tmpDir) - if err != nil { - return 0, fmt.Errorf("ApplyLayer %s failed UnpackLayer to %s", err, dest) - } - - return s, nil -} diff --git a/vendor/github.com/docker/docker/pkg/chrootarchive/init_unix.go b/vendor/github.com/docker/docker/pkg/chrootarchive/init_unix.go deleted file mode 100644 index 4f637f17b..000000000 --- a/vendor/github.com/docker/docker/pkg/chrootarchive/init_unix.go +++ /dev/null @@ -1,28 +0,0 @@ -// +build !windows - -package chrootarchive - -import ( - "fmt" - "io" - "io/ioutil" - "os" - - "github.com/docker/docker/pkg/reexec" -) - -func init() { - reexec.Register("docker-applyLayer", applyLayer) - reexec.Register("docker-untar", untar) -} - -func fatal(err error) { - fmt.Fprint(os.Stderr, err) - os.Exit(1) -} - -// flush consumes all the bytes from the reader discarding -// any errors -func flush(r io.Reader) (bytes int64, err error) { - return io.Copy(ioutil.Discard, r) -} diff --git a/vendor/github.com/docker/docker/pkg/chrootarchive/init_windows.go b/vendor/github.com/docker/docker/pkg/chrootarchive/init_windows.go deleted file mode 100644 index fa17c9bf8..000000000 --- a/vendor/github.com/docker/docker/pkg/chrootarchive/init_windows.go +++ /dev/null @@ -1,4 +0,0 @@ -package chrootarchive - -func init() { -} diff --git a/vendor/github.com/docker/docker/pkg/devicemapper/devmapper.go b/vendor/github.com/docker/docker/pkg/devicemapper/devmapper.go deleted file mode 100644 index 94b55306f..000000000 --- a/vendor/github.com/docker/docker/pkg/devicemapper/devmapper.go +++ /dev/null @@ -1,828 +0,0 @@ -// +build linux - -package devicemapper - -import ( - "errors" - "fmt" - "os" - "runtime" - "syscall" - "unsafe" - - "github.com/Sirupsen/logrus" -) - -// DevmapperLogger defines methods for logging with devicemapper. -type DevmapperLogger interface { - DMLog(level int, file string, line int, dmError int, message string) -} - -const ( - deviceCreate TaskType = iota - deviceReload - deviceRemove - deviceRemoveAll - deviceSuspend - deviceResume - deviceInfo - deviceDeps - deviceRename - deviceVersion - deviceStatus - deviceTable - deviceWaitevent - deviceList - deviceClear - deviceMknodes - deviceListVersions - deviceTargetMsg - deviceSetGeometry -) - -const ( - addNodeOnResume AddNodeType = iota - addNodeOnCreate -) - -// List of errors returned when using devicemapper. -var ( - ErrTaskRun = errors.New("dm_task_run failed") - ErrTaskSetName = errors.New("dm_task_set_name failed") - ErrTaskSetMessage = errors.New("dm_task_set_message failed") - ErrTaskSetAddNode = errors.New("dm_task_set_add_node failed") - ErrTaskSetRo = errors.New("dm_task_set_ro failed") - ErrTaskAddTarget = errors.New("dm_task_add_target failed") - ErrTaskSetSector = errors.New("dm_task_set_sector failed") - ErrTaskGetDeps = errors.New("dm_task_get_deps failed") - ErrTaskGetInfo = errors.New("dm_task_get_info failed") - ErrTaskGetDriverVersion = errors.New("dm_task_get_driver_version failed") - ErrTaskDeferredRemove = errors.New("dm_task_deferred_remove failed") - ErrTaskSetCookie = errors.New("dm_task_set_cookie failed") - ErrNilCookie = errors.New("cookie ptr can't be nil") - ErrGetBlockSize = errors.New("Can't get block size") - ErrUdevWait = errors.New("wait on udev cookie failed") - ErrSetDevDir = errors.New("dm_set_dev_dir failed") - ErrGetLibraryVersion = errors.New("dm_get_library_version failed") - ErrCreateRemoveTask = errors.New("Can't create task of type deviceRemove") - ErrRunRemoveDevice = errors.New("running RemoveDevice failed") - ErrInvalidAddNode = errors.New("Invalid AddNode type") - ErrBusy = errors.New("Device is Busy") - ErrDeviceIDExists = errors.New("Device Id Exists") - ErrEnxio = errors.New("No such device or address") -) - -var ( - dmSawBusy bool - dmSawExist bool - dmSawEnxio bool // No Such Device or Address -) - -type ( - // Task represents a devicemapper task (like lvcreate, etc.) ; a task is needed for each ioctl - // command to execute. - Task struct { - unmanaged *cdmTask - } - // Deps represents dependents (layer) of a device. - Deps struct { - Count uint32 - Filler uint32 - Device []uint64 - } - // Info represents information about a device. - Info struct { - Exists int - Suspended int - LiveTable int - InactiveTable int - OpenCount int32 - EventNr uint32 - Major uint32 - Minor uint32 - ReadOnly int - TargetCount int32 - DeferredRemove int - } - // TaskType represents a type of task - TaskType int - // AddNodeType represents a type of node to be added - AddNodeType int -) - -// DeviceIDExists returns whether error conveys the information about device Id already -// exist or not. This will be true if device creation or snap creation -// operation fails if device or snap device already exists in pool. -// Current implementation is little crude as it scans the error string -// for exact pattern match. Replacing it with more robust implementation -// is desirable. -func DeviceIDExists(err error) bool { - return fmt.Sprint(err) == fmt.Sprint(ErrDeviceIDExists) -} - -func (t *Task) destroy() { - if t != nil { - DmTaskDestroy(t.unmanaged) - runtime.SetFinalizer(t, nil) - } -} - -// TaskCreateNamed is a convenience function for TaskCreate when a name -// will be set on the task as well -func TaskCreateNamed(t TaskType, name string) (*Task, error) { - task := TaskCreate(t) - if task == nil { - return nil, fmt.Errorf("devicemapper: Can't create task of type %d", int(t)) - } - if err := task.setName(name); err != nil { - return nil, fmt.Errorf("devicemapper: Can't set task name %s", name) - } - return task, nil -} - -// TaskCreate initializes a devicemapper task of tasktype -func TaskCreate(tasktype TaskType) *Task { - Ctask := DmTaskCreate(int(tasktype)) - if Ctask == nil { - return nil - } - task := &Task{unmanaged: Ctask} - runtime.SetFinalizer(task, (*Task).destroy) - return task -} - -func (t *Task) run() error { - if res := DmTaskRun(t.unmanaged); res != 1 { - return ErrTaskRun - } - return nil -} - -func (t *Task) setName(name string) error { - if res := DmTaskSetName(t.unmanaged, name); res != 1 { - return ErrTaskSetName - } - return nil -} - -func (t *Task) setMessage(message string) error { - if res := DmTaskSetMessage(t.unmanaged, message); res != 1 { - return ErrTaskSetMessage - } - return nil -} - -func (t *Task) setSector(sector uint64) error { - if res := DmTaskSetSector(t.unmanaged, sector); res != 1 { - return ErrTaskSetSector - } - return nil -} - -func (t *Task) setCookie(cookie *uint, flags uint16) error { - if cookie == nil { - return ErrNilCookie - } - if res := DmTaskSetCookie(t.unmanaged, cookie, flags); res != 1 { - return ErrTaskSetCookie - } - return nil -} - -func (t *Task) setAddNode(addNode AddNodeType) error { - if addNode != addNodeOnResume && addNode != addNodeOnCreate { - return ErrInvalidAddNode - } - if res := DmTaskSetAddNode(t.unmanaged, addNode); res != 1 { - return ErrTaskSetAddNode - } - return nil -} - -func (t *Task) setRo() error { - if res := DmTaskSetRo(t.unmanaged); res != 1 { - return ErrTaskSetRo - } - return nil -} - -func (t *Task) addTarget(start, size uint64, ttype, params string) error { - if res := DmTaskAddTarget(t.unmanaged, start, size, - ttype, params); res != 1 { - return ErrTaskAddTarget - } - return nil -} - -func (t *Task) getDeps() (*Deps, error) { - var deps *Deps - if deps = DmTaskGetDeps(t.unmanaged); deps == nil { - return nil, ErrTaskGetDeps - } - return deps, nil -} - -func (t *Task) getInfo() (*Info, error) { - info := &Info{} - if res := DmTaskGetInfo(t.unmanaged, info); res != 1 { - return nil, ErrTaskGetInfo - } - return info, nil -} - -func (t *Task) getInfoWithDeferred() (*Info, error) { - info := &Info{} - if res := DmTaskGetInfoWithDeferred(t.unmanaged, info); res != 1 { - return nil, ErrTaskGetInfo - } - return info, nil -} - -func (t *Task) getDriverVersion() (string, error) { - res := DmTaskGetDriverVersion(t.unmanaged) - if res == "" { - return "", ErrTaskGetDriverVersion - } - return res, nil -} - -func (t *Task) getNextTarget(next unsafe.Pointer) (nextPtr unsafe.Pointer, start uint64, - length uint64, targetType string, params string) { - - return DmGetNextTarget(t.unmanaged, next, &start, &length, - &targetType, ¶ms), - start, length, targetType, params -} - -// UdevWait waits for any processes that are waiting for udev to complete the specified cookie. -func UdevWait(cookie *uint) error { - if res := DmUdevWait(*cookie); res != 1 { - logrus.Debugf("devicemapper: Failed to wait on udev cookie %d", *cookie) - return ErrUdevWait - } - return nil -} - -// LogInitVerbose is an interface to initialize the verbose logger for the device mapper library. -func LogInitVerbose(level int) { - DmLogInitVerbose(level) -} - -var dmLogger DevmapperLogger - -// LogInit initializes the logger for the device mapper library. -func LogInit(logger DevmapperLogger) { - dmLogger = logger - LogWithErrnoInit() -} - -// SetDevDir sets the dev folder for the device mapper library (usually /dev). -func SetDevDir(dir string) error { - if res := DmSetDevDir(dir); res != 1 { - logrus.Debug("devicemapper: Error dm_set_dev_dir") - return ErrSetDevDir - } - return nil -} - -// GetLibraryVersion returns the device mapper library version. -func GetLibraryVersion() (string, error) { - var version string - if res := DmGetLibraryVersion(&version); res != 1 { - return "", ErrGetLibraryVersion - } - return version, nil -} - -// UdevSyncSupported returns whether device-mapper is able to sync with udev -// -// This is essential otherwise race conditions can arise where both udev and -// device-mapper attempt to create and destroy devices. -func UdevSyncSupported() bool { - return DmUdevGetSyncSupport() != 0 -} - -// UdevSetSyncSupport allows setting whether the udev sync should be enabled. -// The return bool indicates the state of whether the sync is enabled. -func UdevSetSyncSupport(enable bool) bool { - if enable { - DmUdevSetSyncSupport(1) - } else { - DmUdevSetSyncSupport(0) - } - - return UdevSyncSupported() -} - -// CookieSupported returns whether the version of device-mapper supports the -// use of cookie's in the tasks. -// This is largely a lower level call that other functions use. -func CookieSupported() bool { - return DmCookieSupported() != 0 -} - -// RemoveDevice is a useful helper for cleaning up a device. -func RemoveDevice(name string) error { - task, err := TaskCreateNamed(deviceRemove, name) - if task == nil { - return err - } - - var cookie uint - if err := task.setCookie(&cookie, 0); err != nil { - return fmt.Errorf("devicemapper: Can not set cookie: %s", err) - } - defer UdevWait(&cookie) - - dmSawBusy = false // reset before the task is run - if err = task.run(); err != nil { - if dmSawBusy { - return ErrBusy - } - return fmt.Errorf("devicemapper: Error running RemoveDevice %s", err) - } - - return nil -} - -// RemoveDeviceDeferred is a useful helper for cleaning up a device, but deferred. -func RemoveDeviceDeferred(name string) error { - logrus.Debugf("devicemapper: RemoveDeviceDeferred START(%s)", name) - defer logrus.Debugf("devicemapper: RemoveDeviceDeferred END(%s)", name) - task, err := TaskCreateNamed(deviceRemove, name) - if task == nil { - return err - } - - if err := DmTaskDeferredRemove(task.unmanaged); err != 1 { - return ErrTaskDeferredRemove - } - - // set a task cookie and disable library fallback, or else libdevmapper will - // disable udev dm rules and delete the symlink under /dev/mapper by itself, - // even if the removal is deferred by the kernel. - var cookie uint - var flags uint16 - flags = DmUdevDisableLibraryFallback - if err := task.setCookie(&cookie, flags); err != nil { - return fmt.Errorf("devicemapper: Can not set cookie: %s", err) - } - - // libdevmapper and udev relies on System V semaphore for synchronization, - // semaphores created in `task.setCookie` will be cleaned up in `UdevWait`. - // So these two function call must come in pairs, otherwise semaphores will - // be leaked, and the limit of number of semaphores defined in `/proc/sys/kernel/sem` - // will be reached, which will eventually make all follwing calls to 'task.SetCookie' - // fail. - // this call will not wait for the deferred removal's final executing, since no - // udev event will be generated, and the semaphore's value will not be incremented - // by udev, what UdevWait is just cleaning up the semaphore. - defer UdevWait(&cookie) - - if err = task.run(); err != nil { - return fmt.Errorf("devicemapper: Error running RemoveDeviceDeferred %s", err) - } - - return nil -} - -// CancelDeferredRemove cancels a deferred remove for a device. -func CancelDeferredRemove(deviceName string) error { - task, err := TaskCreateNamed(deviceTargetMsg, deviceName) - if task == nil { - return err - } - - if err := task.setSector(0); err != nil { - return fmt.Errorf("devicemapper: Can't set sector %s", err) - } - - if err := task.setMessage(fmt.Sprintf("@cancel_deferred_remove")); err != nil { - return fmt.Errorf("devicemapper: Can't set message %s", err) - } - - dmSawBusy = false - dmSawEnxio = false - if err := task.run(); err != nil { - // A device might be being deleted already - if dmSawBusy { - return ErrBusy - } else if dmSawEnxio { - return ErrEnxio - } - return fmt.Errorf("devicemapper: Error running CancelDeferredRemove %s", err) - - } - return nil -} - -// GetBlockDeviceSize returns the size of a block device identified by the specified file. -func GetBlockDeviceSize(file *os.File) (uint64, error) { - size, err := ioctlBlkGetSize64(file.Fd()) - if err != nil { - logrus.Errorf("devicemapper: Error getblockdevicesize: %s", err) - return 0, ErrGetBlockSize - } - return uint64(size), nil -} - -// BlockDeviceDiscard runs discard for the given path. -// This is used as a workaround for the kernel not discarding block so -// on the thin pool when we remove a thinp device, so we do it -// manually -func BlockDeviceDiscard(path string) error { - file, err := os.OpenFile(path, os.O_RDWR, 0) - if err != nil { - return err - } - defer file.Close() - - size, err := GetBlockDeviceSize(file) - if err != nil { - return err - } - - if err := ioctlBlkDiscard(file.Fd(), 0, size); err != nil { - return err - } - - // Without this sometimes the remove of the device that happens after - // discard fails with EBUSY. - syscall.Sync() - - return nil -} - -// CreatePool is the programmatic example of "dmsetup create". -// It creates a device with the specified poolName, data and metadata file and block size. -func CreatePool(poolName string, dataFile, metadataFile *os.File, poolBlockSize uint32) error { - task, err := TaskCreateNamed(deviceCreate, poolName) - if task == nil { - return err - } - - size, err := GetBlockDeviceSize(dataFile) - if err != nil { - return fmt.Errorf("devicemapper: Can't get data size %s", err) - } - - params := fmt.Sprintf("%s %s %d 32768 1 skip_block_zeroing", metadataFile.Name(), dataFile.Name(), poolBlockSize) - if err := task.addTarget(0, size/512, "thin-pool", params); err != nil { - return fmt.Errorf("devicemapper: Can't add target %s", err) - } - - var cookie uint - var flags uint16 - flags = DmUdevDisableSubsystemRulesFlag | DmUdevDisableDiskRulesFlag | DmUdevDisableOtherRulesFlag - if err := task.setCookie(&cookie, flags); err != nil { - return fmt.Errorf("devicemapper: Can't set cookie %s", err) - } - defer UdevWait(&cookie) - - if err := task.run(); err != nil { - return fmt.Errorf("devicemapper: Error running deviceCreate (CreatePool) %s", err) - } - - return nil -} - -// ReloadPool is the programmatic example of "dmsetup reload". -// It reloads the table with the specified poolName, data and metadata file and block size. -func ReloadPool(poolName string, dataFile, metadataFile *os.File, poolBlockSize uint32) error { - task, err := TaskCreateNamed(deviceReload, poolName) - if task == nil { - return err - } - - size, err := GetBlockDeviceSize(dataFile) - if err != nil { - return fmt.Errorf("devicemapper: Can't get data size %s", err) - } - - params := fmt.Sprintf("%s %s %d 32768 1 skip_block_zeroing", metadataFile.Name(), dataFile.Name(), poolBlockSize) - if err := task.addTarget(0, size/512, "thin-pool", params); err != nil { - return fmt.Errorf("devicemapper: Can't add target %s", err) - } - - if err := task.run(); err != nil { - return fmt.Errorf("devicemapper: Error running deviceCreate %s", err) - } - - return nil -} - -// GetDeps is the programmatic example of "dmsetup deps". -// It outputs a list of devices referenced by the live table for the specified device. -func GetDeps(name string) (*Deps, error) { - task, err := TaskCreateNamed(deviceDeps, name) - if task == nil { - return nil, err - } - if err := task.run(); err != nil { - return nil, err - } - return task.getDeps() -} - -// GetInfo is the programmatic example of "dmsetup info". -// It outputs some brief information about the device. -func GetInfo(name string) (*Info, error) { - task, err := TaskCreateNamed(deviceInfo, name) - if task == nil { - return nil, err - } - if err := task.run(); err != nil { - return nil, err - } - return task.getInfo() -} - -// GetInfoWithDeferred is the programmatic example of "dmsetup info", but deferred. -// It outputs some brief information about the device. -func GetInfoWithDeferred(name string) (*Info, error) { - task, err := TaskCreateNamed(deviceInfo, name) - if task == nil { - return nil, err - } - if err := task.run(); err != nil { - return nil, err - } - return task.getInfoWithDeferred() -} - -// GetDriverVersion is the programmatic example of "dmsetup version". -// It outputs version information of the driver. -func GetDriverVersion() (string, error) { - task := TaskCreate(deviceVersion) - if task == nil { - return "", fmt.Errorf("devicemapper: Can't create deviceVersion task") - } - if err := task.run(); err != nil { - return "", err - } - return task.getDriverVersion() -} - -// GetStatus is the programmatic example of "dmsetup status". -// It outputs status information for the specified device name. -func GetStatus(name string) (uint64, uint64, string, string, error) { - task, err := TaskCreateNamed(deviceStatus, name) - if task == nil { - logrus.Debugf("devicemapper: GetStatus() Error TaskCreateNamed: %s", err) - return 0, 0, "", "", err - } - if err := task.run(); err != nil { - logrus.Debugf("devicemapper: GetStatus() Error Run: %s", err) - return 0, 0, "", "", err - } - - devinfo, err := task.getInfo() - if err != nil { - logrus.Debugf("devicemapper: GetStatus() Error GetInfo: %s", err) - return 0, 0, "", "", err - } - if devinfo.Exists == 0 { - logrus.Debugf("devicemapper: GetStatus() Non existing device %s", name) - return 0, 0, "", "", fmt.Errorf("devicemapper: Non existing device %s", name) - } - - _, start, length, targetType, params := task.getNextTarget(unsafe.Pointer(nil)) - return start, length, targetType, params, nil -} - -// GetTable is the programmatic example for "dmsetup table". -// It outputs the current table for the specified device name. -func GetTable(name string) (uint64, uint64, string, string, error) { - task, err := TaskCreateNamed(deviceTable, name) - if task == nil { - logrus.Debugf("devicemapper: GetTable() Error TaskCreateNamed: %s", err) - return 0, 0, "", "", err - } - if err := task.run(); err != nil { - logrus.Debugf("devicemapper: GetTable() Error Run: %s", err) - return 0, 0, "", "", err - } - - devinfo, err := task.getInfo() - if err != nil { - logrus.Debugf("devicemapper: GetTable() Error GetInfo: %s", err) - return 0, 0, "", "", err - } - if devinfo.Exists == 0 { - logrus.Debugf("devicemapper: GetTable() Non existing device %s", name) - return 0, 0, "", "", fmt.Errorf("devicemapper: Non existing device %s", name) - } - - _, start, length, targetType, params := task.getNextTarget(unsafe.Pointer(nil)) - return start, length, targetType, params, nil -} - -// SetTransactionID sets a transaction id for the specified device name. -func SetTransactionID(poolName string, oldID uint64, newID uint64) error { - task, err := TaskCreateNamed(deviceTargetMsg, poolName) - if task == nil { - return err - } - - if err := task.setSector(0); err != nil { - return fmt.Errorf("devicemapper: Can't set sector %s", err) - } - - if err := task.setMessage(fmt.Sprintf("set_transaction_id %d %d", oldID, newID)); err != nil { - return fmt.Errorf("devicemapper: Can't set message %s", err) - } - - if err := task.run(); err != nil { - return fmt.Errorf("devicemapper: Error running SetTransactionID %s", err) - } - return nil -} - -// SuspendDevice is the programmatic example of "dmsetup suspend". -// It suspends the specified device. -func SuspendDevice(name string) error { - task, err := TaskCreateNamed(deviceSuspend, name) - if task == nil { - return err - } - if err := task.run(); err != nil { - return fmt.Errorf("devicemapper: Error running deviceSuspend %s", err) - } - return nil -} - -// ResumeDevice is the programmatic example of "dmsetup resume". -// It un-suspends the specified device. -func ResumeDevice(name string) error { - task, err := TaskCreateNamed(deviceResume, name) - if task == nil { - return err - } - - var cookie uint - if err := task.setCookie(&cookie, 0); err != nil { - return fmt.Errorf("devicemapper: Can't set cookie %s", err) - } - defer UdevWait(&cookie) - - if err := task.run(); err != nil { - return fmt.Errorf("devicemapper: Error running deviceResume %s", err) - } - - return nil -} - -// CreateDevice creates a device with the specified poolName with the specified device id. -func CreateDevice(poolName string, deviceID int) error { - logrus.Debugf("devicemapper: CreateDevice(poolName=%v, deviceID=%v)", poolName, deviceID) - task, err := TaskCreateNamed(deviceTargetMsg, poolName) - if task == nil { - return err - } - - if err := task.setSector(0); err != nil { - return fmt.Errorf("devicemapper: Can't set sector %s", err) - } - - if err := task.setMessage(fmt.Sprintf("create_thin %d", deviceID)); err != nil { - return fmt.Errorf("devicemapper: Can't set message %s", err) - } - - dmSawExist = false // reset before the task is run - if err := task.run(); err != nil { - // Caller wants to know about ErrDeviceIDExists so that it can try with a different device id. - if dmSawExist { - return ErrDeviceIDExists - } - - return fmt.Errorf("devicemapper: Error running CreateDevice %s", err) - - } - return nil -} - -// DeleteDevice deletes a device with the specified poolName with the specified device id. -func DeleteDevice(poolName string, deviceID int) error { - task, err := TaskCreateNamed(deviceTargetMsg, poolName) - if task == nil { - return err - } - - if err := task.setSector(0); err != nil { - return fmt.Errorf("devicemapper: Can't set sector %s", err) - } - - if err := task.setMessage(fmt.Sprintf("delete %d", deviceID)); err != nil { - return fmt.Errorf("devicemapper: Can't set message %s", err) - } - - dmSawBusy = false - if err := task.run(); err != nil { - if dmSawBusy { - return ErrBusy - } - return fmt.Errorf("devicemapper: Error running DeleteDevice %s", err) - } - return nil -} - -// ActivateDevice activates the device identified by the specified -// poolName, name and deviceID with the specified size. -func ActivateDevice(poolName string, name string, deviceID int, size uint64) error { - return activateDevice(poolName, name, deviceID, size, "") -} - -// ActivateDeviceWithExternal activates the device identified by the specified -// poolName, name and deviceID with the specified size. -func ActivateDeviceWithExternal(poolName string, name string, deviceID int, size uint64, external string) error { - return activateDevice(poolName, name, deviceID, size, external) -} - -func activateDevice(poolName string, name string, deviceID int, size uint64, external string) error { - task, err := TaskCreateNamed(deviceCreate, name) - if task == nil { - return err - } - - var params string - if len(external) > 0 { - params = fmt.Sprintf("%s %d %s", poolName, deviceID, external) - } else { - params = fmt.Sprintf("%s %d", poolName, deviceID) - } - if err := task.addTarget(0, size/512, "thin", params); err != nil { - return fmt.Errorf("devicemapper: Can't add target %s", err) - } - if err := task.setAddNode(addNodeOnCreate); err != nil { - return fmt.Errorf("devicemapper: Can't add node %s", err) - } - - var cookie uint - if err := task.setCookie(&cookie, 0); err != nil { - return fmt.Errorf("devicemapper: Can't set cookie %s", err) - } - - defer UdevWait(&cookie) - - if err := task.run(); err != nil { - return fmt.Errorf("devicemapper: Error running deviceCreate (ActivateDevice) %s", err) - } - - return nil -} - -// CreateSnapDeviceRaw creates a snapshot device. Caller needs to suspend and resume the origin device if it is active. -func CreateSnapDeviceRaw(poolName string, deviceID int, baseDeviceID int) error { - task, err := TaskCreateNamed(deviceTargetMsg, poolName) - if task == nil { - return err - } - - if err := task.setSector(0); err != nil { - return fmt.Errorf("devicemapper: Can't set sector %s", err) - } - - if err := task.setMessage(fmt.Sprintf("create_snap %d %d", deviceID, baseDeviceID)); err != nil { - return fmt.Errorf("devicemapper: Can't set message %s", err) - } - - dmSawExist = false // reset before the task is run - if err := task.run(); err != nil { - // Caller wants to know about ErrDeviceIDExists so that it can try with a different device id. - if dmSawExist { - return ErrDeviceIDExists - } - return fmt.Errorf("devicemapper: Error running deviceCreate (createSnapDevice) %s", err) - } - - return nil -} - -// CreateSnapDevice creates a snapshot based on the device identified by the baseName and baseDeviceId, -func CreateSnapDevice(poolName string, deviceID int, baseName string, baseDeviceID int) error { - devinfo, _ := GetInfo(baseName) - doSuspend := devinfo != nil && devinfo.Exists != 0 - - if doSuspend { - if err := SuspendDevice(baseName); err != nil { - return err - } - } - - if err := CreateSnapDeviceRaw(poolName, deviceID, baseDeviceID); err != nil { - if doSuspend { - if err2 := ResumeDevice(baseName); err2 != nil { - return fmt.Errorf("CreateSnapDeviceRaw Error: (%v): ResumeDevice Error: (%v)", err, err2) - } - } - return err - } - - if doSuspend { - if err := ResumeDevice(baseName); err != nil { - return err - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_log.go b/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_log.go deleted file mode 100644 index 8477e36fe..000000000 --- a/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_log.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build linux - -package devicemapper - -import "C" - -import ( - "strings" -) - -// Due to the way cgo works this has to be in a separate file, as devmapper.go has -// definitions in the cgo block, which is incompatible with using "//export" - -// DevmapperLogCallback exports the devmapper log callback for cgo. -//export DevmapperLogCallback -func DevmapperLogCallback(level C.int, file *C.char, line C.int, dmErrnoOrClass C.int, message *C.char) { - msg := C.GoString(message) - if level < 7 { - if strings.Contains(msg, "busy") { - dmSawBusy = true - } - - if strings.Contains(msg, "File exists") { - dmSawExist = true - } - - if strings.Contains(msg, "No such device or address") { - dmSawEnxio = true - } - } - - if dmLogger != nil { - dmLogger.DMLog(int(level), C.GoString(file), int(line), int(dmErrnoOrClass), msg) - } -} diff --git a/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper.go b/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper.go deleted file mode 100644 index 91fbc85b3..000000000 --- a/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper.go +++ /dev/null @@ -1,251 +0,0 @@ -// +build linux - -package devicemapper - -/* -#cgo LDFLAGS: -L. -ldevmapper -#include -#include // FIXME: present only for BLKGETSIZE64, maybe we can remove it? - -// FIXME: Can't we find a way to do the logging in pure Go? -extern void DevmapperLogCallback(int level, char *file, int line, int dm_errno_or_class, char *str); - -static void log_cb(int level, const char *file, int line, int dm_errno_or_class, const char *f, ...) -{ - char buffer[256]; - va_list ap; - - va_start(ap, f); - vsnprintf(buffer, 256, f, ap); - va_end(ap); - - DevmapperLogCallback(level, (char *)file, line, dm_errno_or_class, buffer); -} - -static void log_with_errno_init() -{ - dm_log_with_errno_init(log_cb); -} -*/ -import "C" - -import ( - "reflect" - "unsafe" -) - -type ( - cdmTask C.struct_dm_task -) - -// IOCTL consts -const ( - BlkGetSize64 = C.BLKGETSIZE64 - BlkDiscard = C.BLKDISCARD -) - -// Devicemapper cookie flags. -const ( - DmUdevDisableSubsystemRulesFlag = C.DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG - DmUdevDisableDiskRulesFlag = C.DM_UDEV_DISABLE_DISK_RULES_FLAG - DmUdevDisableOtherRulesFlag = C.DM_UDEV_DISABLE_OTHER_RULES_FLAG - DmUdevDisableLibraryFallback = C.DM_UDEV_DISABLE_LIBRARY_FALLBACK -) - -// DeviceMapper mapped functions. -var ( - DmGetLibraryVersion = dmGetLibraryVersionFct - DmGetNextTarget = dmGetNextTargetFct - DmLogInitVerbose = dmLogInitVerboseFct - DmSetDevDir = dmSetDevDirFct - DmTaskAddTarget = dmTaskAddTargetFct - DmTaskCreate = dmTaskCreateFct - DmTaskDestroy = dmTaskDestroyFct - DmTaskGetDeps = dmTaskGetDepsFct - DmTaskGetInfo = dmTaskGetInfoFct - DmTaskGetDriverVersion = dmTaskGetDriverVersionFct - DmTaskRun = dmTaskRunFct - DmTaskSetAddNode = dmTaskSetAddNodeFct - DmTaskSetCookie = dmTaskSetCookieFct - DmTaskSetMessage = dmTaskSetMessageFct - DmTaskSetName = dmTaskSetNameFct - DmTaskSetRo = dmTaskSetRoFct - DmTaskSetSector = dmTaskSetSectorFct - DmUdevWait = dmUdevWaitFct - DmUdevSetSyncSupport = dmUdevSetSyncSupportFct - DmUdevGetSyncSupport = dmUdevGetSyncSupportFct - DmCookieSupported = dmCookieSupportedFct - LogWithErrnoInit = logWithErrnoInitFct - DmTaskDeferredRemove = dmTaskDeferredRemoveFct - DmTaskGetInfoWithDeferred = dmTaskGetInfoWithDeferredFct -) - -func free(p *C.char) { - C.free(unsafe.Pointer(p)) -} - -func dmTaskDestroyFct(task *cdmTask) { - C.dm_task_destroy((*C.struct_dm_task)(task)) -} - -func dmTaskCreateFct(taskType int) *cdmTask { - return (*cdmTask)(C.dm_task_create(C.int(taskType))) -} - -func dmTaskRunFct(task *cdmTask) int { - ret, _ := C.dm_task_run((*C.struct_dm_task)(task)) - return int(ret) -} - -func dmTaskSetNameFct(task *cdmTask, name string) int { - Cname := C.CString(name) - defer free(Cname) - - return int(C.dm_task_set_name((*C.struct_dm_task)(task), Cname)) -} - -func dmTaskSetMessageFct(task *cdmTask, message string) int { - Cmessage := C.CString(message) - defer free(Cmessage) - - return int(C.dm_task_set_message((*C.struct_dm_task)(task), Cmessage)) -} - -func dmTaskSetSectorFct(task *cdmTask, sector uint64) int { - return int(C.dm_task_set_sector((*C.struct_dm_task)(task), C.uint64_t(sector))) -} - -func dmTaskSetCookieFct(task *cdmTask, cookie *uint, flags uint16) int { - cCookie := C.uint32_t(*cookie) - defer func() { - *cookie = uint(cCookie) - }() - return int(C.dm_task_set_cookie((*C.struct_dm_task)(task), &cCookie, C.uint16_t(flags))) -} - -func dmTaskSetAddNodeFct(task *cdmTask, addNode AddNodeType) int { - return int(C.dm_task_set_add_node((*C.struct_dm_task)(task), C.dm_add_node_t(addNode))) -} - -func dmTaskSetRoFct(task *cdmTask) int { - return int(C.dm_task_set_ro((*C.struct_dm_task)(task))) -} - -func dmTaskAddTargetFct(task *cdmTask, - start, size uint64, ttype, params string) int { - - Cttype := C.CString(ttype) - defer free(Cttype) - - Cparams := C.CString(params) - defer free(Cparams) - - return int(C.dm_task_add_target((*C.struct_dm_task)(task), C.uint64_t(start), C.uint64_t(size), Cttype, Cparams)) -} - -func dmTaskGetDepsFct(task *cdmTask) *Deps { - Cdeps := C.dm_task_get_deps((*C.struct_dm_task)(task)) - if Cdeps == nil { - return nil - } - - // golang issue: https://github.com/golang/go/issues/11925 - hdr := reflect.SliceHeader{ - Data: uintptr(unsafe.Pointer(uintptr(unsafe.Pointer(Cdeps)) + unsafe.Sizeof(*Cdeps))), - Len: int(Cdeps.count), - Cap: int(Cdeps.count), - } - devices := *(*[]C.uint64_t)(unsafe.Pointer(&hdr)) - - deps := &Deps{ - Count: uint32(Cdeps.count), - Filler: uint32(Cdeps.filler), - } - for _, device := range devices { - deps.Device = append(deps.Device, uint64(device)) - } - return deps -} - -func dmTaskGetInfoFct(task *cdmTask, info *Info) int { - Cinfo := C.struct_dm_info{} - defer func() { - info.Exists = int(Cinfo.exists) - info.Suspended = int(Cinfo.suspended) - info.LiveTable = int(Cinfo.live_table) - info.InactiveTable = int(Cinfo.inactive_table) - info.OpenCount = int32(Cinfo.open_count) - info.EventNr = uint32(Cinfo.event_nr) - info.Major = uint32(Cinfo.major) - info.Minor = uint32(Cinfo.minor) - info.ReadOnly = int(Cinfo.read_only) - info.TargetCount = int32(Cinfo.target_count) - }() - return int(C.dm_task_get_info((*C.struct_dm_task)(task), &Cinfo)) -} - -func dmTaskGetDriverVersionFct(task *cdmTask) string { - buffer := C.malloc(128) - defer C.free(buffer) - res := C.dm_task_get_driver_version((*C.struct_dm_task)(task), (*C.char)(buffer), 128) - if res == 0 { - return "" - } - return C.GoString((*C.char)(buffer)) -} - -func dmGetNextTargetFct(task *cdmTask, next unsafe.Pointer, start, length *uint64, target, params *string) unsafe.Pointer { - var ( - Cstart, Clength C.uint64_t - CtargetType, Cparams *C.char - ) - defer func() { - *start = uint64(Cstart) - *length = uint64(Clength) - *target = C.GoString(CtargetType) - *params = C.GoString(Cparams) - }() - - nextp := C.dm_get_next_target((*C.struct_dm_task)(task), next, &Cstart, &Clength, &CtargetType, &Cparams) - return nextp -} - -func dmUdevSetSyncSupportFct(syncWithUdev int) { - (C.dm_udev_set_sync_support(C.int(syncWithUdev))) -} - -func dmUdevGetSyncSupportFct() int { - return int(C.dm_udev_get_sync_support()) -} - -func dmUdevWaitFct(cookie uint) int { - return int(C.dm_udev_wait(C.uint32_t(cookie))) -} - -func dmCookieSupportedFct() int { - return int(C.dm_cookie_supported()) -} - -func dmLogInitVerboseFct(level int) { - C.dm_log_init_verbose(C.int(level)) -} - -func logWithErrnoInitFct() { - C.log_with_errno_init() -} - -func dmSetDevDirFct(dir string) int { - Cdir := C.CString(dir) - defer free(Cdir) - - return int(C.dm_set_dev_dir(Cdir)) -} - -func dmGetLibraryVersionFct(version *string) int { - buffer := C.CString(string(make([]byte, 128))) - defer free(buffer) - defer func() { - *version = C.GoString(buffer) - }() - return int(C.dm_get_library_version(buffer, 128)) -} diff --git a/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper_deferred_remove.go b/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper_deferred_remove.go deleted file mode 100644 index dc361eab7..000000000 --- a/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper_deferred_remove.go +++ /dev/null @@ -1,34 +0,0 @@ -// +build linux,!libdm_no_deferred_remove - -package devicemapper - -/* -#cgo LDFLAGS: -L. -ldevmapper -#include -*/ -import "C" - -// LibraryDeferredRemovalSupport is supported when statically linked. -const LibraryDeferredRemovalSupport = true - -func dmTaskDeferredRemoveFct(task *cdmTask) int { - return int(C.dm_task_deferred_remove((*C.struct_dm_task)(task))) -} - -func dmTaskGetInfoWithDeferredFct(task *cdmTask, info *Info) int { - Cinfo := C.struct_dm_info{} - defer func() { - info.Exists = int(Cinfo.exists) - info.Suspended = int(Cinfo.suspended) - info.LiveTable = int(Cinfo.live_table) - info.InactiveTable = int(Cinfo.inactive_table) - info.OpenCount = int32(Cinfo.open_count) - info.EventNr = uint32(Cinfo.event_nr) - info.Major = uint32(Cinfo.major) - info.Minor = uint32(Cinfo.minor) - info.ReadOnly = int(Cinfo.read_only) - info.TargetCount = int32(Cinfo.target_count) - info.DeferredRemove = int(Cinfo.deferred_remove) - }() - return int(C.dm_task_get_info((*C.struct_dm_task)(task), &Cinfo)) -} diff --git a/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper_no_deferred_remove.go b/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper_no_deferred_remove.go deleted file mode 100644 index 8249ccf85..000000000 --- a/vendor/github.com/docker/docker/pkg/devicemapper/devmapper_wrapper_no_deferred_remove.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build linux,libdm_no_deferred_remove - -package devicemapper - -// LibraryDeferredRemovalSupport is not supported when statically linked. -const LibraryDeferredRemovalSupport = false - -func dmTaskDeferredRemoveFct(task *cdmTask) int { - // Error. Nobody should be calling it. - return -1 -} - -func dmTaskGetInfoWithDeferredFct(task *cdmTask, info *Info) int { - return -1 -} diff --git a/vendor/github.com/docker/docker/pkg/devicemapper/ioctl.go b/vendor/github.com/docker/docker/pkg/devicemapper/ioctl.go deleted file mode 100644 index 581b57eb8..000000000 --- a/vendor/github.com/docker/docker/pkg/devicemapper/ioctl.go +++ /dev/null @@ -1,27 +0,0 @@ -// +build linux - -package devicemapper - -import ( - "syscall" - "unsafe" -) - -func ioctlBlkGetSize64(fd uintptr) (int64, error) { - var size int64 - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, BlkGetSize64, uintptr(unsafe.Pointer(&size))); err != 0 { - return 0, err - } - return size, nil -} - -func ioctlBlkDiscard(fd uintptr, offset, length uint64) error { - var r [2]uint64 - r[0] = offset - r[1] = length - - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, BlkDiscard, uintptr(unsafe.Pointer(&r[0]))); err != 0 { - return err - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/devicemapper/log.go b/vendor/github.com/docker/docker/pkg/devicemapper/log.go deleted file mode 100644 index cee5e5454..000000000 --- a/vendor/github.com/docker/docker/pkg/devicemapper/log.go +++ /dev/null @@ -1,11 +0,0 @@ -package devicemapper - -// definitions from lvm2 lib/log/log.h -const ( - LogLevelFatal = 2 + iota // _LOG_FATAL - LogLevelErr // _LOG_ERR - LogLevelWarn // _LOG_WARN - LogLevelNotice // _LOG_NOTICE - LogLevelInfo // _LOG_INFO - LogLevelDebug // _LOG_DEBUG -) diff --git a/vendor/github.com/docker/docker/pkg/directory/directory.go b/vendor/github.com/docker/docker/pkg/directory/directory.go deleted file mode 100644 index 1715ef45d..000000000 --- a/vendor/github.com/docker/docker/pkg/directory/directory.go +++ /dev/null @@ -1,26 +0,0 @@ -package directory - -import ( - "io/ioutil" - "os" - "path/filepath" -) - -// MoveToSubdir moves all contents of a directory to a subdirectory underneath the original path -func MoveToSubdir(oldpath, subdir string) error { - - infos, err := ioutil.ReadDir(oldpath) - if err != nil { - return err - } - for _, info := range infos { - if info.Name() != subdir { - oldName := filepath.Join(oldpath, info.Name()) - newName := filepath.Join(oldpath, subdir, info.Name()) - if err := os.Rename(oldName, newName); err != nil { - return err - } - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/directory/directory_test.go b/vendor/github.com/docker/docker/pkg/directory/directory_test.go deleted file mode 100644 index 2b7a4657b..000000000 --- a/vendor/github.com/docker/docker/pkg/directory/directory_test.go +++ /dev/null @@ -1,192 +0,0 @@ -package directory - -import ( - "io/ioutil" - "os" - "path/filepath" - "reflect" - "sort" - "testing" -) - -// Size of an empty directory should be 0 -func TestSizeEmpty(t *testing.T) { - var dir string - var err error - if dir, err = ioutil.TempDir(os.TempDir(), "testSizeEmptyDirectory"); err != nil { - t.Fatalf("failed to create directory: %s", err) - } - - var size int64 - if size, _ = Size(dir); size != 0 { - t.Fatalf("empty directory has size: %d", size) - } -} - -// Size of a directory with one empty file should be 0 -func TestSizeEmptyFile(t *testing.T) { - var dir string - var err error - if dir, err = ioutil.TempDir(os.TempDir(), "testSizeEmptyFile"); err != nil { - t.Fatalf("failed to create directory: %s", err) - } - - var file *os.File - if file, err = ioutil.TempFile(dir, "file"); err != nil { - t.Fatalf("failed to create file: %s", err) - } - - var size int64 - if size, _ = Size(file.Name()); size != 0 { - t.Fatalf("directory with one file has size: %d", size) - } -} - -// Size of a directory with one 5-byte file should be 5 -func TestSizeNonemptyFile(t *testing.T) { - var dir string - var err error - if dir, err = ioutil.TempDir(os.TempDir(), "testSizeNonemptyFile"); err != nil { - t.Fatalf("failed to create directory: %s", err) - } - - var file *os.File - if file, err = ioutil.TempFile(dir, "file"); err != nil { - t.Fatalf("failed to create file: %s", err) - } - - d := []byte{97, 98, 99, 100, 101} - file.Write(d) - - var size int64 - if size, _ = Size(file.Name()); size != 5 { - t.Fatalf("directory with one 5-byte file has size: %d", size) - } -} - -// Size of a directory with one empty directory should be 0 -func TestSizeNestedDirectoryEmpty(t *testing.T) { - var dir string - var err error - if dir, err = ioutil.TempDir(os.TempDir(), "testSizeNestedDirectoryEmpty"); err != nil { - t.Fatalf("failed to create directory: %s", err) - } - if dir, err = ioutil.TempDir(dir, "nested"); err != nil { - t.Fatalf("failed to create nested directory: %s", err) - } - - var size int64 - if size, _ = Size(dir); size != 0 { - t.Fatalf("directory with one empty directory has size: %d", size) - } -} - -// Test directory with 1 file and 1 empty directory -func TestSizeFileAndNestedDirectoryEmpty(t *testing.T) { - var dir string - var err error - if dir, err = ioutil.TempDir(os.TempDir(), "testSizeFileAndNestedDirectoryEmpty"); err != nil { - t.Fatalf("failed to create directory: %s", err) - } - if dir, err = ioutil.TempDir(dir, "nested"); err != nil { - t.Fatalf("failed to create nested directory: %s", err) - } - - var file *os.File - if file, err = ioutil.TempFile(dir, "file"); err != nil { - t.Fatalf("failed to create file: %s", err) - } - - d := []byte{100, 111, 99, 107, 101, 114} - file.Write(d) - - var size int64 - if size, _ = Size(dir); size != 6 { - t.Fatalf("directory with 6-byte file and empty directory has size: %d", size) - } -} - -// Test directory with 1 file and 1 non-empty directory -func TestSizeFileAndNestedDirectoryNonempty(t *testing.T) { - var dir, dirNested string - var err error - if dir, err = ioutil.TempDir(os.TempDir(), "TestSizeFileAndNestedDirectoryNonempty"); err != nil { - t.Fatalf("failed to create directory: %s", err) - } - if dirNested, err = ioutil.TempDir(dir, "nested"); err != nil { - t.Fatalf("failed to create nested directory: %s", err) - } - - var file *os.File - if file, err = ioutil.TempFile(dir, "file"); err != nil { - t.Fatalf("failed to create file: %s", err) - } - - data := []byte{100, 111, 99, 107, 101, 114} - file.Write(data) - - var nestedFile *os.File - if nestedFile, err = ioutil.TempFile(dirNested, "file"); err != nil { - t.Fatalf("failed to create file in nested directory: %s", err) - } - - nestedData := []byte{100, 111, 99, 107, 101, 114} - nestedFile.Write(nestedData) - - var size int64 - if size, _ = Size(dir); size != 12 { - t.Fatalf("directory with 6-byte file and nested directory with 6-byte file has size: %d", size) - } -} - -// Test migration of directory to a subdir underneath itself -func TestMoveToSubdir(t *testing.T) { - var outerDir, subDir string - var err error - - if outerDir, err = ioutil.TempDir(os.TempDir(), "TestMoveToSubdir"); err != nil { - t.Fatalf("failed to create directory: %v", err) - } - - if subDir, err = ioutil.TempDir(outerDir, "testSub"); err != nil { - t.Fatalf("failed to create subdirectory: %v", err) - } - - // write 4 temp files in the outer dir to get moved - filesList := []string{"a", "b", "c", "d"} - for _, fName := range filesList { - if file, err := os.Create(filepath.Join(outerDir, fName)); err != nil { - t.Fatalf("couldn't create temp file %q: %v", fName, err) - } else { - file.WriteString(fName) - file.Close() - } - } - - if err = MoveToSubdir(outerDir, filepath.Base(subDir)); err != nil { - t.Fatalf("Error during migration of content to subdirectory: %v", err) - } - // validate that the files were moved to the subdirectory - infos, err := ioutil.ReadDir(subDir) - if err != nil { - t.Fatal(err) - } - if len(infos) != 4 { - t.Fatalf("Should be four files in the subdir after the migration: actual length: %d", len(infos)) - } - var results []string - for _, info := range infos { - results = append(results, info.Name()) - } - sort.Sort(sort.StringSlice(results)) - if !reflect.DeepEqual(filesList, results) { - t.Fatalf("Results after migration do not equal list of files: expected: %v, got: %v", filesList, results) - } -} - -// Test a non-existing directory -func TestSizeNonExistingDirectory(t *testing.T) { - if _, err := Size("/thisdirectoryshouldnotexist/TestSizeNonExistingDirectory"); err == nil { - t.Fatalf("error is expected") - } -} diff --git a/vendor/github.com/docker/docker/pkg/directory/directory_unix.go b/vendor/github.com/docker/docker/pkg/directory/directory_unix.go deleted file mode 100644 index 397251bdb..000000000 --- a/vendor/github.com/docker/docker/pkg/directory/directory_unix.go +++ /dev/null @@ -1,48 +0,0 @@ -// +build linux freebsd solaris - -package directory - -import ( - "os" - "path/filepath" - "syscall" -) - -// Size walks a directory tree and returns its total size in bytes. -func Size(dir string) (size int64, err error) { - data := make(map[uint64]struct{}) - err = filepath.Walk(dir, func(d string, fileInfo os.FileInfo, err error) error { - if err != nil { - // if dir does not exist, Size() returns the error. - // if dir/x disappeared while walking, Size() ignores dir/x. - if os.IsNotExist(err) && d != dir { - return nil - } - return err - } - - // Ignore directory sizes - if fileInfo == nil { - return nil - } - - s := fileInfo.Size() - if fileInfo.IsDir() || s == 0 { - return nil - } - - // Check inode to handle hard links correctly - inode := fileInfo.Sys().(*syscall.Stat_t).Ino - // inode is not a uint64 on all platforms. Cast it to avoid issues. - if _, exists := data[uint64(inode)]; exists { - return nil - } - // inode is not a uint64 on all platforms. Cast it to avoid issues. - data[uint64(inode)] = struct{}{} - - size += s - - return nil - }) - return -} diff --git a/vendor/github.com/docker/docker/pkg/directory/directory_windows.go b/vendor/github.com/docker/docker/pkg/directory/directory_windows.go deleted file mode 100644 index 6fb0917c4..000000000 --- a/vendor/github.com/docker/docker/pkg/directory/directory_windows.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build windows - -package directory - -import ( - "os" - "path/filepath" -) - -// Size walks a directory tree and returns its total size in bytes. -func Size(dir string) (size int64, err error) { - err = filepath.Walk(dir, func(d string, fileInfo os.FileInfo, err error) error { - if err != nil { - // if dir does not exist, Size() returns the error. - // if dir/x disappeared while walking, Size() ignores dir/x. - if os.IsNotExist(err) && d != dir { - return nil - } - return err - } - - // Ignore directory sizes - if fileInfo == nil { - return nil - } - - s := fileInfo.Size() - if fileInfo.IsDir() || s == 0 { - return nil - } - - size += s - - return nil - }) - return -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/README.md b/vendor/github.com/docker/docker/pkg/discovery/README.md deleted file mode 100644 index 39777c217..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/README.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -page_title: Docker discovery -page_description: discovery -page_keywords: docker, clustering, discovery ---- - -# Discovery - -Docker comes with multiple Discovery backends. - -## Backends - -### Using etcd - -Point your Docker Engine instances to a common etcd instance. You can specify -the address Docker uses to advertise the node using the `--cluster-advertise` -flag. - -```bash -$ docker daemon -H= --cluster-advertise= --cluster-store etcd://,/ -``` - -### Using consul - -Point your Docker Engine instances to a common Consul instance. You can specify -the address Docker uses to advertise the node using the `--cluster-advertise` -flag. - -```bash -$ docker daemon -H= --cluster-advertise= --cluster-store consul:/// -``` - -### Using zookeeper - -Point your Docker Engine instances to a common Zookeeper instance. You can specify -the address Docker uses to advertise the node using the `--cluster-advertise` -flag. - -```bash -$ docker daemon -H= --cluster-advertise= --cluster-store zk://,/ -``` diff --git a/vendor/github.com/docker/docker/pkg/discovery/backends.go b/vendor/github.com/docker/docker/pkg/discovery/backends.go deleted file mode 100644 index 2eab550e2..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/backends.go +++ /dev/null @@ -1,107 +0,0 @@ -package discovery - -import ( - "fmt" - "net" - "strings" - "time" - - "github.com/Sirupsen/logrus" -) - -var ( - // Backends is a global map of discovery backends indexed by their - // associated scheme. - backends = make(map[string]Backend) -) - -// Register makes a discovery backend available by the provided scheme. -// If Register is called twice with the same scheme an error is returned. -func Register(scheme string, d Backend) error { - if _, exists := backends[scheme]; exists { - return fmt.Errorf("scheme already registered %s", scheme) - } - logrus.WithField("name", scheme).Debugf("Registering discovery service") - backends[scheme] = d - return nil -} - -func parse(rawurl string) (string, string) { - parts := strings.SplitN(rawurl, "://", 2) - - // nodes:port,node2:port => nodes://node1:port,node2:port - if len(parts) == 1 { - return "nodes", parts[0] - } - return parts[0], parts[1] -} - -// ParseAdvertise parses the --cluster-advertise daemon config which accepts -// : or : -func ParseAdvertise(advertise string) (string, error) { - var ( - iface *net.Interface - addrs []net.Addr - err error - ) - - addr, port, err := net.SplitHostPort(advertise) - - if err != nil { - return "", fmt.Errorf("invalid --cluster-advertise configuration: %s: %v", advertise, err) - } - - ip := net.ParseIP(addr) - // If it is a valid ip-address, use it as is - if ip != nil { - return advertise, nil - } - - // If advertise is a valid interface name, get the valid IPv4 address and use it to advertise - ifaceName := addr - iface, err = net.InterfaceByName(ifaceName) - if err != nil { - return "", fmt.Errorf("invalid cluster advertise IP address or interface name (%s) : %v", advertise, err) - } - - addrs, err = iface.Addrs() - if err != nil { - return "", fmt.Errorf("unable to get advertise IP address from interface (%s) : %v", advertise, err) - } - - if len(addrs) == 0 { - return "", fmt.Errorf("no available advertise IP address in interface (%s)", advertise) - } - - addr = "" - for _, a := range addrs { - ip, _, err := net.ParseCIDR(a.String()) - if err != nil { - return "", fmt.Errorf("error deriving advertise ip-address in interface (%s) : %v", advertise, err) - } - if ip.To4() == nil || ip.IsLoopback() { - continue - } - addr = ip.String() - break - } - if addr == "" { - return "", fmt.Errorf("could not find a valid ip-address in interface %s", advertise) - } - - addr = net.JoinHostPort(addr, port) - return addr, nil -} - -// New returns a new Discovery given a URL, heartbeat and ttl settings. -// Returns an error if the URL scheme is not supported. -func New(rawurl string, heartbeat time.Duration, ttl time.Duration, clusterOpts map[string]string) (Backend, error) { - scheme, uri := parse(rawurl) - if backend, exists := backends[scheme]; exists { - logrus.WithFields(logrus.Fields{"name": scheme, "uri": uri}).Debugf("Initializing discovery service") - err := backend.Initialize(uri, heartbeat, ttl, clusterOpts) - return backend, err - } - - return nil, ErrNotSupported -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/discovery.go b/vendor/github.com/docker/docker/pkg/discovery/discovery.go deleted file mode 100644 index ca7f58745..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/discovery.go +++ /dev/null @@ -1,35 +0,0 @@ -package discovery - -import ( - "errors" - "time" -) - -var ( - // ErrNotSupported is returned when a discovery service is not supported. - ErrNotSupported = errors.New("discovery service not supported") - - // ErrNotImplemented is returned when discovery feature is not implemented - // by discovery backend. - ErrNotImplemented = errors.New("not implemented in this discovery service") -) - -// Watcher provides watching over a cluster for nodes joining and leaving. -type Watcher interface { - // Watch the discovery for entry changes. - // Returns a channel that will receive changes or an error. - // Providing a non-nil stopCh can be used to stop watching. - Watch(stopCh <-chan struct{}) (<-chan Entries, <-chan error) -} - -// Backend is implemented by discovery backends which manage cluster entries. -type Backend interface { - // Watcher must be provided by every backend. - Watcher - - // Initialize the discovery with URIs, a heartbeat, a ttl and optional settings. - Initialize(string, time.Duration, time.Duration, map[string]string) error - - // Register to the discovery. - Register(string) error -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/discovery_test.go b/vendor/github.com/docker/docker/pkg/discovery/discovery_test.go deleted file mode 100644 index 6084f3ef0..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/discovery_test.go +++ /dev/null @@ -1,137 +0,0 @@ -package discovery - -import ( - "testing" - - "github.com/go-check/check" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -type DiscoverySuite struct{} - -var _ = check.Suite(&DiscoverySuite{}) - -func (s *DiscoverySuite) TestNewEntry(c *check.C) { - entry, err := NewEntry("127.0.0.1:2375") - c.Assert(err, check.IsNil) - c.Assert(entry.Equals(&Entry{Host: "127.0.0.1", Port: "2375"}), check.Equals, true) - c.Assert(entry.String(), check.Equals, "127.0.0.1:2375") - - entry, err = NewEntry("[2001:db8:0:f101::2]:2375") - c.Assert(err, check.IsNil) - c.Assert(entry.Equals(&Entry{Host: "2001:db8:0:f101::2", Port: "2375"}), check.Equals, true) - c.Assert(entry.String(), check.Equals, "[2001:db8:0:f101::2]:2375") - - _, err = NewEntry("127.0.0.1") - c.Assert(err, check.NotNil) -} - -func (s *DiscoverySuite) TestParse(c *check.C) { - scheme, uri := parse("127.0.0.1:2375") - c.Assert(scheme, check.Equals, "nodes") - c.Assert(uri, check.Equals, "127.0.0.1:2375") - - scheme, uri = parse("localhost:2375") - c.Assert(scheme, check.Equals, "nodes") - c.Assert(uri, check.Equals, "localhost:2375") - - scheme, uri = parse("scheme://127.0.0.1:2375") - c.Assert(scheme, check.Equals, "scheme") - c.Assert(uri, check.Equals, "127.0.0.1:2375") - - scheme, uri = parse("scheme://localhost:2375") - c.Assert(scheme, check.Equals, "scheme") - c.Assert(uri, check.Equals, "localhost:2375") - - scheme, uri = parse("") - c.Assert(scheme, check.Equals, "nodes") - c.Assert(uri, check.Equals, "") -} - -func (s *DiscoverySuite) TestCreateEntries(c *check.C) { - entries, err := CreateEntries(nil) - c.Assert(entries, check.DeepEquals, Entries{}) - c.Assert(err, check.IsNil) - - entries, err = CreateEntries([]string{"127.0.0.1:2375", "127.0.0.2:2375", "[2001:db8:0:f101::2]:2375", ""}) - c.Assert(err, check.IsNil) - expected := Entries{ - &Entry{Host: "127.0.0.1", Port: "2375"}, - &Entry{Host: "127.0.0.2", Port: "2375"}, - &Entry{Host: "2001:db8:0:f101::2", Port: "2375"}, - } - c.Assert(entries.Equals(expected), check.Equals, true) - - _, err = CreateEntries([]string{"127.0.0.1", "127.0.0.2"}) - c.Assert(err, check.NotNil) -} - -func (s *DiscoverySuite) TestContainsEntry(c *check.C) { - entries, err := CreateEntries([]string{"127.0.0.1:2375", "127.0.0.2:2375", ""}) - c.Assert(err, check.IsNil) - c.Assert(entries.Contains(&Entry{Host: "127.0.0.1", Port: "2375"}), check.Equals, true) - c.Assert(entries.Contains(&Entry{Host: "127.0.0.3", Port: "2375"}), check.Equals, false) -} - -func (s *DiscoverySuite) TestEntriesEquality(c *check.C) { - entries := Entries{ - &Entry{Host: "127.0.0.1", Port: "2375"}, - &Entry{Host: "127.0.0.2", Port: "2375"}, - } - - // Same - c.Assert(entries.Equals(Entries{ - &Entry{Host: "127.0.0.1", Port: "2375"}, - &Entry{Host: "127.0.0.2", Port: "2375"}, - }), check. - Equals, true) - - // Different size - c.Assert(entries.Equals(Entries{ - &Entry{Host: "127.0.0.1", Port: "2375"}, - &Entry{Host: "127.0.0.2", Port: "2375"}, - &Entry{Host: "127.0.0.3", Port: "2375"}, - }), check. - Equals, false) - - // Different content - c.Assert(entries.Equals(Entries{ - &Entry{Host: "127.0.0.1", Port: "2375"}, - &Entry{Host: "127.0.0.42", Port: "2375"}, - }), check. - Equals, false) - -} - -func (s *DiscoverySuite) TestEntriesDiff(c *check.C) { - entry1 := &Entry{Host: "1.1.1.1", Port: "1111"} - entry2 := &Entry{Host: "2.2.2.2", Port: "2222"} - entry3 := &Entry{Host: "3.3.3.3", Port: "3333"} - entries := Entries{entry1, entry2} - - // No diff - added, removed := entries.Diff(Entries{entry2, entry1}) - c.Assert(added, check.HasLen, 0) - c.Assert(removed, check.HasLen, 0) - - // Add - added, removed = entries.Diff(Entries{entry2, entry3, entry1}) - c.Assert(added, check.HasLen, 1) - c.Assert(added.Contains(entry3), check.Equals, true) - c.Assert(removed, check.HasLen, 0) - - // Remove - added, removed = entries.Diff(Entries{entry2}) - c.Assert(added, check.HasLen, 0) - c.Assert(removed, check.HasLen, 1) - c.Assert(removed.Contains(entry1), check.Equals, true) - - // Add and remove - added, removed = entries.Diff(Entries{entry1, entry3}) - c.Assert(added, check.HasLen, 1) - c.Assert(added.Contains(entry3), check.Equals, true) - c.Assert(removed, check.HasLen, 1) - c.Assert(removed.Contains(entry2), check.Equals, true) -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/entry.go b/vendor/github.com/docker/docker/pkg/discovery/entry.go deleted file mode 100644 index ce23bbf89..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/entry.go +++ /dev/null @@ -1,94 +0,0 @@ -package discovery - -import "net" - -// NewEntry creates a new entry. -func NewEntry(url string) (*Entry, error) { - host, port, err := net.SplitHostPort(url) - if err != nil { - return nil, err - } - return &Entry{host, port}, nil -} - -// An Entry represents a host. -type Entry struct { - Host string - Port string -} - -// Equals returns true if cmp contains the same data. -func (e *Entry) Equals(cmp *Entry) bool { - return e.Host == cmp.Host && e.Port == cmp.Port -} - -// String returns the string form of an entry. -func (e *Entry) String() string { - return net.JoinHostPort(e.Host, e.Port) -} - -// Entries is a list of *Entry with some helpers. -type Entries []*Entry - -// Equals returns true if cmp contains the same data. -func (e Entries) Equals(cmp Entries) bool { - // Check if the file has really changed. - if len(e) != len(cmp) { - return false - } - for i := range e { - if !e[i].Equals(cmp[i]) { - return false - } - } - return true -} - -// Contains returns true if the Entries contain a given Entry. -func (e Entries) Contains(entry *Entry) bool { - for _, curr := range e { - if curr.Equals(entry) { - return true - } - } - return false -} - -// Diff compares two entries and returns the added and removed entries. -func (e Entries) Diff(cmp Entries) (Entries, Entries) { - added := Entries{} - for _, entry := range cmp { - if !e.Contains(entry) { - added = append(added, entry) - } - } - - removed := Entries{} - for _, entry := range e { - if !cmp.Contains(entry) { - removed = append(removed, entry) - } - } - - return added, removed -} - -// CreateEntries returns an array of entries based on the given addresses. -func CreateEntries(addrs []string) (Entries, error) { - entries := Entries{} - if addrs == nil { - return entries, nil - } - - for _, addr := range addrs { - if len(addr) == 0 { - continue - } - entry, err := NewEntry(addr) - if err != nil { - return nil, err - } - entries = append(entries, entry) - } - return entries, nil -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/file/file.go b/vendor/github.com/docker/docker/pkg/discovery/file/file.go deleted file mode 100644 index 2b8e27b75..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/file/file.go +++ /dev/null @@ -1,107 +0,0 @@ -package file - -import ( - "fmt" - "io/ioutil" - "strings" - "time" - - "github.com/docker/docker/pkg/discovery" -) - -// Discovery is exported -type Discovery struct { - heartbeat time.Duration - path string -} - -func init() { - Init() -} - -// Init is exported -func Init() { - discovery.Register("file", &Discovery{}) -} - -// Initialize is exported -func (s *Discovery) Initialize(path string, heartbeat time.Duration, ttl time.Duration, _ map[string]string) error { - s.path = path - s.heartbeat = heartbeat - return nil -} - -func parseFileContent(content []byte) []string { - var result []string - for _, line := range strings.Split(strings.TrimSpace(string(content)), "\n") { - line = strings.TrimSpace(line) - // Ignoring line starts with # - if strings.HasPrefix(line, "#") { - continue - } - // Inlined # comment also ignored. - if strings.Contains(line, "#") { - line = line[0:strings.Index(line, "#")] - // Trim additional spaces caused by above stripping. - line = strings.TrimSpace(line) - } - result = append(result, discovery.Generate(line)...) - } - return result -} - -func (s *Discovery) fetch() (discovery.Entries, error) { - fileContent, err := ioutil.ReadFile(s.path) - if err != nil { - return nil, fmt.Errorf("failed to read '%s': %v", s.path, err) - } - return discovery.CreateEntries(parseFileContent(fileContent)) -} - -// Watch is exported -func (s *Discovery) Watch(stopCh <-chan struct{}) (<-chan discovery.Entries, <-chan error) { - ch := make(chan discovery.Entries) - errCh := make(chan error) - ticker := time.NewTicker(s.heartbeat) - - go func() { - defer close(errCh) - defer close(ch) - - // Send the initial entries if available. - currentEntries, err := s.fetch() - if err != nil { - errCh <- err - } else { - ch <- currentEntries - } - - // Periodically send updates. - for { - select { - case <-ticker.C: - newEntries, err := s.fetch() - if err != nil { - errCh <- err - continue - } - - // Check if the file has really changed. - if !newEntries.Equals(currentEntries) { - ch <- newEntries - } - currentEntries = newEntries - case <-stopCh: - ticker.Stop() - return - } - } - }() - - return ch, errCh -} - -// Register is exported -func (s *Discovery) Register(addr string) error { - return discovery.ErrNotImplemented -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/file/file_test.go b/vendor/github.com/docker/docker/pkg/discovery/file/file_test.go deleted file mode 100644 index 667f00ba0..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/file/file_test.go +++ /dev/null @@ -1,114 +0,0 @@ -package file - -import ( - "io/ioutil" - "os" - "testing" - - "github.com/docker/docker/pkg/discovery" - - "github.com/go-check/check" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -type DiscoverySuite struct{} - -var _ = check.Suite(&DiscoverySuite{}) - -func (s *DiscoverySuite) TestInitialize(c *check.C) { - d := &Discovery{} - d.Initialize("/path/to/file", 1000, 0, nil) - c.Assert(d.path, check.Equals, "/path/to/file") -} - -func (s *DiscoverySuite) TestNew(c *check.C) { - d, err := discovery.New("file:///path/to/file", 0, 0, nil) - c.Assert(err, check.IsNil) - c.Assert(d.(*Discovery).path, check.Equals, "/path/to/file") -} - -func (s *DiscoverySuite) TestContent(c *check.C) { - data := ` -1.1.1.[1:2]:1111 -2.2.2.[2:4]:2222 -` - ips := parseFileContent([]byte(data)) - c.Assert(ips, check.HasLen, 5) - c.Assert(ips[0], check.Equals, "1.1.1.1:1111") - c.Assert(ips[1], check.Equals, "1.1.1.2:1111") - c.Assert(ips[2], check.Equals, "2.2.2.2:2222") - c.Assert(ips[3], check.Equals, "2.2.2.3:2222") - c.Assert(ips[4], check.Equals, "2.2.2.4:2222") -} - -func (s *DiscoverySuite) TestRegister(c *check.C) { - discovery := &Discovery{path: "/path/to/file"} - c.Assert(discovery.Register("0.0.0.0"), check.NotNil) -} - -func (s *DiscoverySuite) TestParsingContentsWithComments(c *check.C) { - data := ` -### test ### -1.1.1.1:1111 # inline comment -# 2.2.2.2:2222 - ### empty line with comment - 3.3.3.3:3333 -### test ### -` - ips := parseFileContent([]byte(data)) - c.Assert(ips, check.HasLen, 2) - c.Assert("1.1.1.1:1111", check.Equals, ips[0]) - c.Assert("3.3.3.3:3333", check.Equals, ips[1]) -} - -func (s *DiscoverySuite) TestWatch(c *check.C) { - data := ` -1.1.1.1:1111 -2.2.2.2:2222 -` - expected := discovery.Entries{ - &discovery.Entry{Host: "1.1.1.1", Port: "1111"}, - &discovery.Entry{Host: "2.2.2.2", Port: "2222"}, - } - - // Create a temporary file and remove it. - tmp, err := ioutil.TempFile(os.TempDir(), "discovery-file-test") - c.Assert(err, check.IsNil) - c.Assert(tmp.Close(), check.IsNil) - c.Assert(os.Remove(tmp.Name()), check.IsNil) - - // Set up file discovery. - d := &Discovery{} - d.Initialize(tmp.Name(), 1000, 0, nil) - stopCh := make(chan struct{}) - ch, errCh := d.Watch(stopCh) - - // Make sure it fires errors since the file doesn't exist. - c.Assert(<-errCh, check.NotNil) - // We have to drain the error channel otherwise Watch will get stuck. - go func() { - for range errCh { - } - }() - - // Write the file and make sure we get the expected value back. - c.Assert(ioutil.WriteFile(tmp.Name(), []byte(data), 0600), check.IsNil) - c.Assert(<-ch, check.DeepEquals, expected) - - // Add a new entry and look it up. - expected = append(expected, &discovery.Entry{Host: "3.3.3.3", Port: "3333"}) - f, err := os.OpenFile(tmp.Name(), os.O_APPEND|os.O_WRONLY, 0600) - c.Assert(err, check.IsNil) - c.Assert(f, check.NotNil) - _, err = f.WriteString("\n3.3.3.3:3333\n") - c.Assert(err, check.IsNil) - f.Close() - c.Assert(<-ch, check.DeepEquals, expected) - - // Stop and make sure it closes all channels. - close(stopCh) - c.Assert(<-ch, check.IsNil) - c.Assert(<-errCh, check.IsNil) -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/generator.go b/vendor/github.com/docker/docker/pkg/discovery/generator.go deleted file mode 100644 index d22298298..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/generator.go +++ /dev/null @@ -1,35 +0,0 @@ -package discovery - -import ( - "fmt" - "regexp" - "strconv" -) - -// Generate takes care of IP generation -func Generate(pattern string) []string { - re, _ := regexp.Compile(`\[(.+):(.+)\]`) - submatch := re.FindStringSubmatch(pattern) - if submatch == nil { - return []string{pattern} - } - - from, err := strconv.Atoi(submatch[1]) - if err != nil { - return []string{pattern} - } - to, err := strconv.Atoi(submatch[2]) - if err != nil { - return []string{pattern} - } - - template := re.ReplaceAllString(pattern, "%d") - - var result []string - for val := from; val <= to; val++ { - entry := fmt.Sprintf(template, val) - result = append(result, entry) - } - - return result -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/generator_test.go b/vendor/github.com/docker/docker/pkg/discovery/generator_test.go deleted file mode 100644 index 6281c4666..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/generator_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package discovery - -import ( - "github.com/go-check/check" -) - -func (s *DiscoverySuite) TestGeneratorNotGenerate(c *check.C) { - ips := Generate("127.0.0.1") - c.Assert(len(ips), check.Equals, 1) - c.Assert(ips[0], check.Equals, "127.0.0.1") -} - -func (s *DiscoverySuite) TestGeneratorWithPortNotGenerate(c *check.C) { - ips := Generate("127.0.0.1:8080") - c.Assert(len(ips), check.Equals, 1) - c.Assert(ips[0], check.Equals, "127.0.0.1:8080") -} - -func (s *DiscoverySuite) TestGeneratorMatchFailedNotGenerate(c *check.C) { - ips := Generate("127.0.0.[1]") - c.Assert(len(ips), check.Equals, 1) - c.Assert(ips[0], check.Equals, "127.0.0.[1]") -} - -func (s *DiscoverySuite) TestGeneratorWithPort(c *check.C) { - ips := Generate("127.0.0.[1:11]:2375") - c.Assert(len(ips), check.Equals, 11) - c.Assert(ips[0], check.Equals, "127.0.0.1:2375") - c.Assert(ips[1], check.Equals, "127.0.0.2:2375") - c.Assert(ips[2], check.Equals, "127.0.0.3:2375") - c.Assert(ips[3], check.Equals, "127.0.0.4:2375") - c.Assert(ips[4], check.Equals, "127.0.0.5:2375") - c.Assert(ips[5], check.Equals, "127.0.0.6:2375") - c.Assert(ips[6], check.Equals, "127.0.0.7:2375") - c.Assert(ips[7], check.Equals, "127.0.0.8:2375") - c.Assert(ips[8], check.Equals, "127.0.0.9:2375") - c.Assert(ips[9], check.Equals, "127.0.0.10:2375") - c.Assert(ips[10], check.Equals, "127.0.0.11:2375") -} - -func (s *DiscoverySuite) TestGenerateWithMalformedInputAtRangeStart(c *check.C) { - malformedInput := "127.0.0.[x:11]:2375" - ips := Generate(malformedInput) - c.Assert(len(ips), check.Equals, 1) - c.Assert(ips[0], check.Equals, malformedInput) -} - -func (s *DiscoverySuite) TestGenerateWithMalformedInputAtRangeEnd(c *check.C) { - malformedInput := "127.0.0.[1:x]:2375" - ips := Generate(malformedInput) - c.Assert(len(ips), check.Equals, 1) - c.Assert(ips[0], check.Equals, malformedInput) -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/kv/kv.go b/vendor/github.com/docker/docker/pkg/discovery/kv/kv.go deleted file mode 100644 index 77eee7d45..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/kv/kv.go +++ /dev/null @@ -1,192 +0,0 @@ -package kv - -import ( - "fmt" - "path" - "strings" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/discovery" - "github.com/docker/go-connections/tlsconfig" - "github.com/docker/libkv" - "github.com/docker/libkv/store" - "github.com/docker/libkv/store/consul" - "github.com/docker/libkv/store/etcd" - "github.com/docker/libkv/store/zookeeper" -) - -const ( - defaultDiscoveryPath = "docker/nodes" -) - -// Discovery is exported -type Discovery struct { - backend store.Backend - store store.Store - heartbeat time.Duration - ttl time.Duration - prefix string - path string -} - -func init() { - Init() -} - -// Init is exported -func Init() { - // Register to libkv - zookeeper.Register() - consul.Register() - etcd.Register() - - // Register to internal discovery service - discovery.Register("zk", &Discovery{backend: store.ZK}) - discovery.Register("consul", &Discovery{backend: store.CONSUL}) - discovery.Register("etcd", &Discovery{backend: store.ETCD}) -} - -// Initialize is exported -func (s *Discovery) Initialize(uris string, heartbeat time.Duration, ttl time.Duration, clusterOpts map[string]string) error { - var ( - parts = strings.SplitN(uris, "/", 2) - addrs = strings.Split(parts[0], ",") - err error - ) - - // A custom prefix to the path can be optionally used. - if len(parts) == 2 { - s.prefix = parts[1] - } - - s.heartbeat = heartbeat - s.ttl = ttl - - // Use a custom path if specified in discovery options - dpath := defaultDiscoveryPath - if clusterOpts["kv.path"] != "" { - dpath = clusterOpts["kv.path"] - } - - s.path = path.Join(s.prefix, dpath) - - var config *store.Config - if clusterOpts["kv.cacertfile"] != "" && clusterOpts["kv.certfile"] != "" && clusterOpts["kv.keyfile"] != "" { - logrus.Info("Initializing discovery with TLS") - tlsConfig, err := tlsconfig.Client(tlsconfig.Options{ - CAFile: clusterOpts["kv.cacertfile"], - CertFile: clusterOpts["kv.certfile"], - KeyFile: clusterOpts["kv.keyfile"], - }) - if err != nil { - return err - } - config = &store.Config{ - // Set ClientTLS to trigger https (bug in libkv/etcd) - ClientTLS: &store.ClientTLSConfig{ - CACertFile: clusterOpts["kv.cacertfile"], - CertFile: clusterOpts["kv.certfile"], - KeyFile: clusterOpts["kv.keyfile"], - }, - // The actual TLS config that will be used - TLS: tlsConfig, - } - } else { - logrus.Info("Initializing discovery without TLS") - } - - // Creates a new store, will ignore options given - // if not supported by the chosen store - s.store, err = libkv.NewStore(s.backend, addrs, config) - return err -} - -// Watch the store until either there's a store error or we receive a stop request. -// Returns false if we shouldn't attempt watching the store anymore (stop request received). -func (s *Discovery) watchOnce(stopCh <-chan struct{}, watchCh <-chan []*store.KVPair, discoveryCh chan discovery.Entries, errCh chan error) bool { - for { - select { - case pairs := <-watchCh: - if pairs == nil { - return true - } - - logrus.WithField("discovery", s.backend).Debugf("Watch triggered with %d nodes", len(pairs)) - - // Convert `KVPair` into `discovery.Entry`. - addrs := make([]string, len(pairs)) - for _, pair := range pairs { - addrs = append(addrs, string(pair.Value)) - } - - entries, err := discovery.CreateEntries(addrs) - if err != nil { - errCh <- err - } else { - discoveryCh <- entries - } - case <-stopCh: - // We were requested to stop watching. - return false - } - } -} - -// Watch is exported -func (s *Discovery) Watch(stopCh <-chan struct{}) (<-chan discovery.Entries, <-chan error) { - ch := make(chan discovery.Entries) - errCh := make(chan error) - - go func() { - defer close(ch) - defer close(errCh) - - // Forever: Create a store watch, watch until we get an error and then try again. - // Will only stop if we receive a stopCh request. - for { - // Create the path to watch if it does not exist yet - exists, err := s.store.Exists(s.path) - if err != nil { - errCh <- err - } - if !exists { - if err := s.store.Put(s.path, []byte(""), &store.WriteOptions{IsDir: true}); err != nil { - errCh <- err - } - } - - // Set up a watch. - watchCh, err := s.store.WatchTree(s.path, stopCh) - if err != nil { - errCh <- err - } else { - if !s.watchOnce(stopCh, watchCh, ch, errCh) { - return - } - } - - // If we get here it means the store watch channel was closed. This - // is unexpected so let's retry later. - errCh <- fmt.Errorf("Unexpected watch error") - time.Sleep(s.heartbeat) - } - }() - return ch, errCh -} - -// Register is exported -func (s *Discovery) Register(addr string) error { - opts := &store.WriteOptions{TTL: s.ttl} - return s.store.Put(path.Join(s.path, addr), []byte(addr), opts) -} - -// Store returns the underlying store used by KV discovery. -func (s *Discovery) Store() store.Store { - return s.store -} - -// Prefix returns the store prefix -func (s *Discovery) Prefix() string { - return s.prefix -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/kv/kv_test.go b/vendor/github.com/docker/docker/pkg/discovery/kv/kv_test.go deleted file mode 100644 index dab3939dd..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/kv/kv_test.go +++ /dev/null @@ -1,324 +0,0 @@ -package kv - -import ( - "errors" - "io/ioutil" - "os" - "path" - "testing" - "time" - - "github.com/docker/docker/pkg/discovery" - "github.com/docker/libkv" - "github.com/docker/libkv/store" - - "github.com/go-check/check" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -type DiscoverySuite struct{} - -var _ = check.Suite(&DiscoverySuite{}) - -func (ds *DiscoverySuite) TestInitialize(c *check.C) { - storeMock := &FakeStore{ - Endpoints: []string{"127.0.0.1"}, - } - d := &Discovery{backend: store.CONSUL} - d.Initialize("127.0.0.1", 0, 0, nil) - d.store = storeMock - - s := d.store.(*FakeStore) - c.Assert(s.Endpoints, check.HasLen, 1) - c.Assert(s.Endpoints[0], check.Equals, "127.0.0.1") - c.Assert(d.path, check.Equals, defaultDiscoveryPath) - - storeMock = &FakeStore{ - Endpoints: []string{"127.0.0.1:1234"}, - } - d = &Discovery{backend: store.CONSUL} - d.Initialize("127.0.0.1:1234/path", 0, 0, nil) - d.store = storeMock - - s = d.store.(*FakeStore) - c.Assert(s.Endpoints, check.HasLen, 1) - c.Assert(s.Endpoints[0], check.Equals, "127.0.0.1:1234") - c.Assert(d.path, check.Equals, "path/"+defaultDiscoveryPath) - - storeMock = &FakeStore{ - Endpoints: []string{"127.0.0.1:1234", "127.0.0.2:1234", "127.0.0.3:1234"}, - } - d = &Discovery{backend: store.CONSUL} - d.Initialize("127.0.0.1:1234,127.0.0.2:1234,127.0.0.3:1234/path", 0, 0, nil) - d.store = storeMock - - s = d.store.(*FakeStore) - c.Assert(s.Endpoints, check.HasLen, 3) - c.Assert(s.Endpoints[0], check.Equals, "127.0.0.1:1234") - c.Assert(s.Endpoints[1], check.Equals, "127.0.0.2:1234") - c.Assert(s.Endpoints[2], check.Equals, "127.0.0.3:1234") - - c.Assert(d.path, check.Equals, "path/"+defaultDiscoveryPath) -} - -// Extremely limited mock store so we can test initialization -type Mock struct { - // Endpoints passed to InitializeMock - Endpoints []string - - // Options passed to InitializeMock - Options *store.Config -} - -func NewMock(endpoints []string, options *store.Config) (store.Store, error) { - s := &Mock{} - s.Endpoints = endpoints - s.Options = options - return s, nil -} -func (s *Mock) Put(key string, value []byte, opts *store.WriteOptions) error { - return errors.New("Put not supported") -} -func (s *Mock) Get(key string) (*store.KVPair, error) { - return nil, errors.New("Get not supported") -} -func (s *Mock) Delete(key string) error { - return errors.New("Delete not supported") -} - -// Exists mock -func (s *Mock) Exists(key string) (bool, error) { - return false, errors.New("Exists not supported") -} - -// Watch mock -func (s *Mock) Watch(key string, stopCh <-chan struct{}) (<-chan *store.KVPair, error) { - return nil, errors.New("Watch not supported") -} - -// WatchTree mock -func (s *Mock) WatchTree(prefix string, stopCh <-chan struct{}) (<-chan []*store.KVPair, error) { - return nil, errors.New("WatchTree not supported") -} - -// NewLock mock -func (s *Mock) NewLock(key string, options *store.LockOptions) (store.Locker, error) { - return nil, errors.New("NewLock not supported") -} - -// List mock -func (s *Mock) List(prefix string) ([]*store.KVPair, error) { - return nil, errors.New("List not supported") -} - -// DeleteTree mock -func (s *Mock) DeleteTree(prefix string) error { - return errors.New("DeleteTree not supported") -} - -// AtomicPut mock -func (s *Mock) AtomicPut(key string, value []byte, previous *store.KVPair, opts *store.WriteOptions) (bool, *store.KVPair, error) { - return false, nil, errors.New("AtomicPut not supported") -} - -// AtomicDelete mock -func (s *Mock) AtomicDelete(key string, previous *store.KVPair) (bool, error) { - return false, errors.New("AtomicDelete not supported") -} - -// Close mock -func (s *Mock) Close() { - return -} - -func (ds *DiscoverySuite) TestInitializeWithCerts(c *check.C) { - cert := `-----BEGIN CERTIFICATE----- -MIIDCDCCAfKgAwIBAgIICifG7YeiQOEwCwYJKoZIhvcNAQELMBIxEDAOBgNVBAMT -B1Rlc3QgQ0EwHhcNMTUxMDAxMjMwMDAwWhcNMjAwOTI5MjMwMDAwWjASMRAwDgYD -VQQDEwdUZXN0IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1wRC -O+flnLTK5ImjTurNRHwSejuqGbc4CAvpB0hS+z0QlSs4+zE9h80aC4hz+6caRpds -+J908Q+RvAittMHbpc7VjbZP72G6fiXk7yPPl6C10HhRSoSi3nY+B7F2E8cuz14q -V2e+ejhWhSrBb/keyXpcyjoW1BOAAJ2TIclRRkICSCZrpXUyXxAvzXfpFXo1RhSb -UywN11pfiCQzDUN7sPww9UzFHuAHZHoyfTr27XnJYVUerVYrCPq8vqfn//01qz55 -Xs0hvzGdlTFXhuabFtQnKFH5SNwo/fcznhB7rePOwHojxOpXTBepUCIJLbtNnWFT -V44t9gh5IqIWtoBReQIDAQABo2YwZDAOBgNVHQ8BAf8EBAMCAAYwEgYDVR0TAQH/ -BAgwBgEB/wIBAjAdBgNVHQ4EFgQUZKUI8IIjIww7X/6hvwggQK4bD24wHwYDVR0j -BBgwFoAUZKUI8IIjIww7X/6hvwggQK4bD24wCwYJKoZIhvcNAQELA4IBAQDES2cz -7sCQfDCxCIWH7X8kpi/JWExzUyQEJ0rBzN1m3/x8ySRxtXyGekimBqQwQdFqlwMI -xzAQKkh3ue8tNSzRbwqMSyH14N1KrSxYS9e9szJHfUasoTpQGPmDmGIoRJuq1h6M -ej5x1SCJ7GWCR6xEXKUIE9OftXm9TdFzWa7Ja3OHz/mXteii8VXDuZ5ACq6EE5bY -8sP4gcICfJ5fTrpTlk9FIqEWWQrCGa5wk95PGEj+GJpNogjXQ97wVoo/Y3p1brEn -t5zjN9PAq4H1fuCMdNNA+p1DHNwd+ELTxcMAnb2ajwHvV6lKPXutrTFc4umJToBX -FpTxDmJHEV4bzUzh ------END CERTIFICATE----- -` - key := `-----BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEA1wRCO+flnLTK5ImjTurNRHwSejuqGbc4CAvpB0hS+z0QlSs4 -+zE9h80aC4hz+6caRpds+J908Q+RvAittMHbpc7VjbZP72G6fiXk7yPPl6C10HhR -SoSi3nY+B7F2E8cuz14qV2e+ejhWhSrBb/keyXpcyjoW1BOAAJ2TIclRRkICSCZr -pXUyXxAvzXfpFXo1RhSbUywN11pfiCQzDUN7sPww9UzFHuAHZHoyfTr27XnJYVUe -rVYrCPq8vqfn//01qz55Xs0hvzGdlTFXhuabFtQnKFH5SNwo/fcznhB7rePOwHoj -xOpXTBepUCIJLbtNnWFTV44t9gh5IqIWtoBReQIDAQABAoIBAHSWipORGp/uKFXj -i/mut776x8ofsAxhnLBARQr93ID+i49W8H7EJGkOfaDjTICYC1dbpGrri61qk8sx -qX7p3v/5NzKwOIfEpirgwVIqSNYe/ncbxnhxkx6tXtUtFKmEx40JskvSpSYAhmmO -1XSx0E/PWaEN/nLgX/f1eWJIlxlQkk3QeqL+FGbCXI48DEtlJ9+MzMu4pAwZTpj5 -5qtXo5JJ0jRGfJVPAOznRsYqv864AhMdMIWguzk6EGnbaCWwPcfcn+h9a5LMdony -MDHfBS7bb5tkF3+AfnVY3IBMVx7YlsD9eAyajlgiKu4zLbwTRHjXgShy+4Oussz0 -ugNGnkECgYEA/hi+McrZC8C4gg6XqK8+9joD8tnyDZDz88BQB7CZqABUSwvjDqlP -L8hcwo/lzvjBNYGkqaFPUICGWKjeCtd8pPS2DCVXxDQX4aHF1vUur0uYNncJiV3N -XQz4Iemsa6wnKf6M67b5vMXICw7dw0HZCdIHD1hnhdtDz0uVpeevLZ8CgYEA2KCT -Y43lorjrbCgMqtlefkr3GJA9dey+hTzCiWEOOqn9RqGoEGUday0sKhiLofOgmN2B -LEukpKIey8s+Q/cb6lReajDVPDsMweX8i7hz3Wa4Ugp4Xa5BpHqu8qIAE2JUZ7bU -t88aQAYE58pUF+/Lq1QzAQdrjjzQBx6SrBxieecCgYEAvukoPZEC8mmiN1VvbTX+ -QFHmlZha3QaDxChB+QUe7bMRojEUL/fVnzkTOLuVFqSfxevaI/km9n0ac5KtAchV -xjp2bTnBb5EUQFqjopYktWA+xO07JRJtMfSEmjZPbbay1kKC7rdTfBm961EIHaRj -xZUf6M+rOE8964oGrdgdLlECgYEA046GQmx6fh7/82FtdZDRQp9tj3SWQUtSiQZc -qhO59Lq8mjUXz+MgBuJXxkiwXRpzlbaFB0Bca1fUoYw8o915SrDYf/Zu2OKGQ/qa -V81sgiVmDuEgycR7YOlbX6OsVUHrUlpwhY3hgfMe6UtkMvhBvHF/WhroBEIJm1pV -PXZ/CbMCgYEApNWVktFBjOaYfY6SNn4iSts1jgsQbbpglg3kT7PLKjCAhI6lNsbk -dyT7ut01PL6RaW4SeQWtrJIVQaM6vF3pprMKqlc5XihOGAmVqH7rQx9rtQB5TicL -BFrwkQE4HQtQBV60hYQUzzlSk44VFDz+jxIEtacRHaomDRh2FtOTz+I= ------END RSA PRIVATE KEY----- -` - certFile, err := ioutil.TempFile("", "cert") - c.Assert(err, check.IsNil) - defer os.Remove(certFile.Name()) - certFile.Write([]byte(cert)) - certFile.Close() - keyFile, err := ioutil.TempFile("", "key") - c.Assert(err, check.IsNil) - defer os.Remove(keyFile.Name()) - keyFile.Write([]byte(key)) - keyFile.Close() - - libkv.AddStore("mock", NewMock) - d := &Discovery{backend: "mock"} - err = d.Initialize("127.0.0.3:1234", 0, 0, map[string]string{ - "kv.cacertfile": certFile.Name(), - "kv.certfile": certFile.Name(), - "kv.keyfile": keyFile.Name(), - }) - c.Assert(err, check.IsNil) - s := d.store.(*Mock) - c.Assert(s.Options.TLS, check.NotNil) - c.Assert(s.Options.TLS.RootCAs, check.NotNil) - c.Assert(s.Options.TLS.Certificates, check.HasLen, 1) -} - -func (ds *DiscoverySuite) TestWatch(c *check.C) { - mockCh := make(chan []*store.KVPair) - - storeMock := &FakeStore{ - Endpoints: []string{"127.0.0.1:1234"}, - mockKVChan: mockCh, - } - - d := &Discovery{backend: store.CONSUL} - d.Initialize("127.0.0.1:1234/path", 0, 0, nil) - d.store = storeMock - - expected := discovery.Entries{ - &discovery.Entry{Host: "1.1.1.1", Port: "1111"}, - &discovery.Entry{Host: "2.2.2.2", Port: "2222"}, - } - kvs := []*store.KVPair{ - {Key: path.Join("path", defaultDiscoveryPath, "1.1.1.1"), Value: []byte("1.1.1.1:1111")}, - {Key: path.Join("path", defaultDiscoveryPath, "2.2.2.2"), Value: []byte("2.2.2.2:2222")}, - } - - stopCh := make(chan struct{}) - ch, errCh := d.Watch(stopCh) - - // It should fire an error since the first WatchTree call failed. - c.Assert(<-errCh, check.ErrorMatches, "test error") - // We have to drain the error channel otherwise Watch will get stuck. - go func() { - for range errCh { - } - }() - - // Push the entries into the store channel and make sure discovery emits. - mockCh <- kvs - c.Assert(<-ch, check.DeepEquals, expected) - - // Add a new entry. - expected = append(expected, &discovery.Entry{Host: "3.3.3.3", Port: "3333"}) - kvs = append(kvs, &store.KVPair{Key: path.Join("path", defaultDiscoveryPath, "3.3.3.3"), Value: []byte("3.3.3.3:3333")}) - mockCh <- kvs - c.Assert(<-ch, check.DeepEquals, expected) - - close(mockCh) - // Give it enough time to call WatchTree. - time.Sleep(3 * time.Second) - - // Stop and make sure it closes all channels. - close(stopCh) - c.Assert(<-ch, check.IsNil) - c.Assert(<-errCh, check.IsNil) -} - -// FakeStore implements store.Store methods. It mocks all store -// function in a simple, naive way. -type FakeStore struct { - Endpoints []string - Options *store.Config - mockKVChan <-chan []*store.KVPair - - watchTreeCallCount int -} - -func (s *FakeStore) Put(key string, value []byte, options *store.WriteOptions) error { - return nil -} - -func (s *FakeStore) Get(key string) (*store.KVPair, error) { - return nil, nil -} - -func (s *FakeStore) Delete(key string) error { - return nil -} - -func (s *FakeStore) Exists(key string) (bool, error) { - return true, nil -} - -func (s *FakeStore) Watch(key string, stopCh <-chan struct{}) (<-chan *store.KVPair, error) { - return nil, nil -} - -// WatchTree will fail the first time, and return the mockKVchan afterwards. -// This is the behavior we need for testing.. If we need 'moar', should update this. -func (s *FakeStore) WatchTree(directory string, stopCh <-chan struct{}) (<-chan []*store.KVPair, error) { - if s.watchTreeCallCount == 0 { - s.watchTreeCallCount = 1 - return nil, errors.New("test error") - } - // First calls error - return s.mockKVChan, nil -} - -func (s *FakeStore) NewLock(key string, options *store.LockOptions) (store.Locker, error) { - return nil, nil -} - -func (s *FakeStore) List(directory string) ([]*store.KVPair, error) { - return []*store.KVPair{}, nil -} - -func (s *FakeStore) DeleteTree(directory string) error { - return nil -} - -func (s *FakeStore) AtomicPut(key string, value []byte, previous *store.KVPair, options *store.WriteOptions) (bool, *store.KVPair, error) { - return true, nil, nil -} - -func (s *FakeStore) AtomicDelete(key string, previous *store.KVPair) (bool, error) { - return true, nil -} - -func (s *FakeStore) Close() { -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/memory/memory.go b/vendor/github.com/docker/docker/pkg/discovery/memory/memory.go deleted file mode 100644 index ba8b1f55f..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/memory/memory.go +++ /dev/null @@ -1,93 +0,0 @@ -package memory - -import ( - "sync" - "time" - - "github.com/docker/docker/pkg/discovery" -) - -// Discovery implements a discovery backend that keeps -// data in memory. -type Discovery struct { - heartbeat time.Duration - values []string - mu sync.Mutex -} - -func init() { - Init() -} - -// Init registers the memory backend on demand. -func Init() { - discovery.Register("memory", &Discovery{}) -} - -// Initialize sets the heartbeat for the memory backend. -func (s *Discovery) Initialize(_ string, heartbeat time.Duration, _ time.Duration, _ map[string]string) error { - s.heartbeat = heartbeat - s.values = make([]string, 0) - return nil -} - -// Watch sends periodic discovery updates to a channel. -func (s *Discovery) Watch(stopCh <-chan struct{}) (<-chan discovery.Entries, <-chan error) { - ch := make(chan discovery.Entries) - errCh := make(chan error) - ticker := time.NewTicker(s.heartbeat) - - go func() { - defer close(errCh) - defer close(ch) - - // Send the initial entries if available. - var currentEntries discovery.Entries - var err error - - s.mu.Lock() - if len(s.values) > 0 { - currentEntries, err = discovery.CreateEntries(s.values) - } - s.mu.Unlock() - - if err != nil { - errCh <- err - } else if currentEntries != nil { - ch <- currentEntries - } - - // Periodically send updates. - for { - select { - case <-ticker.C: - s.mu.Lock() - newEntries, err := discovery.CreateEntries(s.values) - s.mu.Unlock() - if err != nil { - errCh <- err - continue - } - - // Check if the file has really changed. - if !newEntries.Equals(currentEntries) { - ch <- newEntries - } - currentEntries = newEntries - case <-stopCh: - ticker.Stop() - return - } - } - }() - - return ch, errCh -} - -// Register adds a new address to the discovery. -func (s *Discovery) Register(addr string) error { - s.mu.Lock() - s.values = append(s.values, addr) - s.mu.Unlock() - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/memory/memory_test.go b/vendor/github.com/docker/docker/pkg/discovery/memory/memory_test.go deleted file mode 100644 index c2da0a068..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/memory/memory_test.go +++ /dev/null @@ -1,48 +0,0 @@ -package memory - -import ( - "testing" - - "github.com/docker/docker/pkg/discovery" - "github.com/go-check/check" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -type discoverySuite struct{} - -var _ = check.Suite(&discoverySuite{}) - -func (s *discoverySuite) TestWatch(c *check.C) { - d := &Discovery{} - d.Initialize("foo", 1000, 0, nil) - stopCh := make(chan struct{}) - ch, errCh := d.Watch(stopCh) - - // We have to drain the error channel otherwise Watch will get stuck. - go func() { - for range errCh { - } - }() - - expected := discovery.Entries{ - &discovery.Entry{Host: "1.1.1.1", Port: "1111"}, - } - - c.Assert(d.Register("1.1.1.1:1111"), check.IsNil) - c.Assert(<-ch, check.DeepEquals, expected) - - expected = discovery.Entries{ - &discovery.Entry{Host: "1.1.1.1", Port: "1111"}, - &discovery.Entry{Host: "2.2.2.2", Port: "2222"}, - } - - c.Assert(d.Register("2.2.2.2:2222"), check.IsNil) - c.Assert(<-ch, check.DeepEquals, expected) - - // Stop and make sure it closes all channels. - close(stopCh) - c.Assert(<-ch, check.IsNil) - c.Assert(<-errCh, check.IsNil) -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/nodes/nodes.go b/vendor/github.com/docker/docker/pkg/discovery/nodes/nodes.go deleted file mode 100644 index c0e3c07b2..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/nodes/nodes.go +++ /dev/null @@ -1,54 +0,0 @@ -package nodes - -import ( - "fmt" - "strings" - "time" - - "github.com/docker/docker/pkg/discovery" -) - -// Discovery is exported -type Discovery struct { - entries discovery.Entries -} - -func init() { - Init() -} - -// Init is exported -func Init() { - discovery.Register("nodes", &Discovery{}) -} - -// Initialize is exported -func (s *Discovery) Initialize(uris string, _ time.Duration, _ time.Duration, _ map[string]string) error { - for _, input := range strings.Split(uris, ",") { - for _, ip := range discovery.Generate(input) { - entry, err := discovery.NewEntry(ip) - if err != nil { - return fmt.Errorf("%s, please check you are using the correct discovery (missing token:// ?)", err.Error()) - } - s.entries = append(s.entries, entry) - } - } - - return nil -} - -// Watch is exported -func (s *Discovery) Watch(stopCh <-chan struct{}) (<-chan discovery.Entries, <-chan error) { - ch := make(chan discovery.Entries) - go func() { - defer close(ch) - ch <- s.entries - <-stopCh - }() - return ch, nil -} - -// Register is exported -func (s *Discovery) Register(addr string) error { - return discovery.ErrNotImplemented -} diff --git a/vendor/github.com/docker/docker/pkg/discovery/nodes/nodes_test.go b/vendor/github.com/docker/docker/pkg/discovery/nodes/nodes_test.go deleted file mode 100644 index e26568cf5..000000000 --- a/vendor/github.com/docker/docker/pkg/discovery/nodes/nodes_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package nodes - -import ( - "testing" - - "github.com/docker/docker/pkg/discovery" - - "github.com/go-check/check" -) - -// Hook up gocheck into the "go test" runner. -func Test(t *testing.T) { check.TestingT(t) } - -type DiscoverySuite struct{} - -var _ = check.Suite(&DiscoverySuite{}) - -func (s *DiscoverySuite) TestInitialize(c *check.C) { - d := &Discovery{} - d.Initialize("1.1.1.1:1111,2.2.2.2:2222", 0, 0, nil) - c.Assert(len(d.entries), check.Equals, 2) - c.Assert(d.entries[0].String(), check.Equals, "1.1.1.1:1111") - c.Assert(d.entries[1].String(), check.Equals, "2.2.2.2:2222") -} - -func (s *DiscoverySuite) TestInitializeWithPattern(c *check.C) { - d := &Discovery{} - d.Initialize("1.1.1.[1:2]:1111,2.2.2.[2:4]:2222", 0, 0, nil) - c.Assert(len(d.entries), check.Equals, 5) - c.Assert(d.entries[0].String(), check.Equals, "1.1.1.1:1111") - c.Assert(d.entries[1].String(), check.Equals, "1.1.1.2:1111") - c.Assert(d.entries[2].String(), check.Equals, "2.2.2.2:2222") - c.Assert(d.entries[3].String(), check.Equals, "2.2.2.3:2222") - c.Assert(d.entries[4].String(), check.Equals, "2.2.2.4:2222") -} - -func (s *DiscoverySuite) TestWatch(c *check.C) { - d := &Discovery{} - d.Initialize("1.1.1.1:1111,2.2.2.2:2222", 0, 0, nil) - expected := discovery.Entries{ - &discovery.Entry{Host: "1.1.1.1", Port: "1111"}, - &discovery.Entry{Host: "2.2.2.2", Port: "2222"}, - } - ch, _ := d.Watch(nil) - c.Assert(expected.Equals(<-ch), check.Equals, true) -} - -func (s *DiscoverySuite) TestRegister(c *check.C) { - d := &Discovery{} - c.Assert(d.Register("0.0.0.0"), check.NotNil) -} diff --git a/vendor/github.com/docker/docker/pkg/filenotify/filenotify.go b/vendor/github.com/docker/docker/pkg/filenotify/filenotify.go deleted file mode 100644 index 7a81cbda9..000000000 --- a/vendor/github.com/docker/docker/pkg/filenotify/filenotify.go +++ /dev/null @@ -1,40 +0,0 @@ -// Package filenotify provides a mechanism for watching file(s) for changes. -// Generally leans on fsnotify, but provides a poll-based notifier which fsnotify does not support. -// These are wrapped up in a common interface so that either can be used interchangeably in your code. -package filenotify - -import "github.com/fsnotify/fsnotify" - -// FileWatcher is an interface for implementing file notification watchers -type FileWatcher interface { - Events() <-chan fsnotify.Event - Errors() <-chan error - Add(name string) error - Remove(name string) error - Close() error -} - -// New tries to use an fs-event watcher, and falls back to the poller if there is an error -func New() (FileWatcher, error) { - if watcher, err := NewEventWatcher(); err == nil { - return watcher, nil - } - return NewPollingWatcher(), nil -} - -// NewPollingWatcher returns a poll-based file watcher -func NewPollingWatcher() FileWatcher { - return &filePoller{ - events: make(chan fsnotify.Event), - errors: make(chan error), - } -} - -// NewEventWatcher returns an fs-event based file watcher -func NewEventWatcher() (FileWatcher, error) { - watcher, err := fsnotify.NewWatcher() - if err != nil { - return nil, err - } - return &fsNotifyWatcher{watcher}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/filenotify/fsnotify.go b/vendor/github.com/docker/docker/pkg/filenotify/fsnotify.go deleted file mode 100644 index 5d08a997a..000000000 --- a/vendor/github.com/docker/docker/pkg/filenotify/fsnotify.go +++ /dev/null @@ -1,18 +0,0 @@ -package filenotify - -import "github.com/fsnotify/fsnotify" - -// fsNotifyWatcher wraps the fsnotify package to satisfy the FileNotifer interface -type fsNotifyWatcher struct { - *fsnotify.Watcher -} - -// Events returns the fsnotify event channel receiver -func (w *fsNotifyWatcher) Events() <-chan fsnotify.Event { - return w.Watcher.Events -} - -// Errors returns the fsnotify error channel receiver -func (w *fsNotifyWatcher) Errors() <-chan error { - return w.Watcher.Errors -} diff --git a/vendor/github.com/docker/docker/pkg/filenotify/poller.go b/vendor/github.com/docker/docker/pkg/filenotify/poller.go deleted file mode 100644 index dc5ccd0f7..000000000 --- a/vendor/github.com/docker/docker/pkg/filenotify/poller.go +++ /dev/null @@ -1,204 +0,0 @@ -package filenotify - -import ( - "errors" - "fmt" - "os" - "sync" - "time" - - "github.com/Sirupsen/logrus" - - "github.com/fsnotify/fsnotify" -) - -var ( - // errPollerClosed is returned when the poller is closed - errPollerClosed = errors.New("poller is closed") - // errNoSuchPoller is returned when trying to remove a watch that doesn't exist - errNoSuchWatch = errors.New("poller does not exist") -) - -// watchWaitTime is the time to wait between file poll loops -const watchWaitTime = 200 * time.Millisecond - -// filePoller is used to poll files for changes, especially in cases where fsnotify -// can't be run (e.g. when inotify handles are exhausted) -// filePoller satisfies the FileWatcher interface -type filePoller struct { - // watches is the list of files currently being polled, close the associated channel to stop the watch - watches map[string]chan struct{} - // events is the channel to listen to for watch events - events chan fsnotify.Event - // errors is the channel to listen to for watch errors - errors chan error - // mu locks the poller for modification - mu sync.Mutex - // closed is used to specify when the poller has already closed - closed bool -} - -// Add adds a filename to the list of watches -// once added the file is polled for changes in a separate goroutine -func (w *filePoller) Add(name string) error { - w.mu.Lock() - defer w.mu.Unlock() - - if w.closed == true { - return errPollerClosed - } - - f, err := os.Open(name) - if err != nil { - return err - } - fi, err := os.Stat(name) - if err != nil { - return err - } - - if w.watches == nil { - w.watches = make(map[string]chan struct{}) - } - if _, exists := w.watches[name]; exists { - return fmt.Errorf("watch exists") - } - chClose := make(chan struct{}) - w.watches[name] = chClose - - go w.watch(f, fi, chClose) - return nil -} - -// Remove stops and removes watch with the specified name -func (w *filePoller) Remove(name string) error { - w.mu.Lock() - defer w.mu.Unlock() - return w.remove(name) -} - -func (w *filePoller) remove(name string) error { - if w.closed == true { - return errPollerClosed - } - - chClose, exists := w.watches[name] - if !exists { - return errNoSuchWatch - } - close(chClose) - delete(w.watches, name) - return nil -} - -// Events returns the event channel -// This is used for notifications on events about watched files -func (w *filePoller) Events() <-chan fsnotify.Event { - return w.events -} - -// Errors returns the errors channel -// This is used for notifications about errors on watched files -func (w *filePoller) Errors() <-chan error { - return w.errors -} - -// Close closes the poller -// All watches are stopped, removed, and the poller cannot be added to -func (w *filePoller) Close() error { - w.mu.Lock() - defer w.mu.Unlock() - - if w.closed { - return nil - } - - w.closed = true - for name := range w.watches { - w.remove(name) - delete(w.watches, name) - } - return nil -} - -// sendEvent publishes the specified event to the events channel -func (w *filePoller) sendEvent(e fsnotify.Event, chClose <-chan struct{}) error { - select { - case w.events <- e: - case <-chClose: - return fmt.Errorf("closed") - } - return nil -} - -// sendErr publishes the specified error to the errors channel -func (w *filePoller) sendErr(e error, chClose <-chan struct{}) error { - select { - case w.errors <- e: - case <-chClose: - return fmt.Errorf("closed") - } - return nil -} - -// watch is responsible for polling the specified file for changes -// upon finding changes to a file or errors, sendEvent/sendErr is called -func (w *filePoller) watch(f *os.File, lastFi os.FileInfo, chClose chan struct{}) { - defer f.Close() - for { - time.Sleep(watchWaitTime) - select { - case <-chClose: - logrus.Debugf("watch for %s closed", f.Name()) - return - default: - } - - fi, err := os.Stat(f.Name()) - if err != nil { - // if we got an error here and lastFi is not set, we can presume that nothing has changed - // This should be safe since before `watch()` is called, a stat is performed, there is any error `watch` is not called - if lastFi == nil { - continue - } - // If it doesn't exist at this point, it must have been removed - // no need to send the error here since this is a valid operation - if os.IsNotExist(err) { - if err := w.sendEvent(fsnotify.Event{Op: fsnotify.Remove, Name: f.Name()}, chClose); err != nil { - return - } - lastFi = nil - continue - } - // at this point, send the error - if err := w.sendErr(err, chClose); err != nil { - return - } - continue - } - - if lastFi == nil { - if err := w.sendEvent(fsnotify.Event{Op: fsnotify.Create, Name: fi.Name()}, chClose); err != nil { - return - } - lastFi = fi - continue - } - - if fi.Mode() != lastFi.Mode() { - if err := w.sendEvent(fsnotify.Event{Op: fsnotify.Chmod, Name: fi.Name()}, chClose); err != nil { - return - } - lastFi = fi - continue - } - - if fi.ModTime() != lastFi.ModTime() || fi.Size() != lastFi.Size() { - if err := w.sendEvent(fsnotify.Event{Op: fsnotify.Write, Name: fi.Name()}, chClose); err != nil { - return - } - lastFi = fi - continue - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/filenotify/poller_test.go b/vendor/github.com/docker/docker/pkg/filenotify/poller_test.go deleted file mode 100644 index b4c782511..000000000 --- a/vendor/github.com/docker/docker/pkg/filenotify/poller_test.go +++ /dev/null @@ -1,119 +0,0 @@ -package filenotify - -import ( - "fmt" - "io/ioutil" - "os" - "runtime" - "testing" - "time" - - "github.com/fsnotify/fsnotify" -) - -func TestPollerAddRemove(t *testing.T) { - w := NewPollingWatcher() - - if err := w.Add("no-such-file"); err == nil { - t.Fatal("should have gotten error when adding a non-existent file") - } - if err := w.Remove("no-such-file"); err == nil { - t.Fatal("should have gotten error when removing non-existent watch") - } - - f, err := ioutil.TempFile("", "asdf") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(f.Name()) - - if err := w.Add(f.Name()); err != nil { - t.Fatal(err) - } - - if err := w.Remove(f.Name()); err != nil { - t.Fatal(err) - } -} - -func TestPollerEvent(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("No chmod on Windows") - } - w := NewPollingWatcher() - - f, err := ioutil.TempFile("", "test-poller") - if err != nil { - t.Fatal("error creating temp file") - } - defer os.RemoveAll(f.Name()) - f.Close() - - if err := w.Add(f.Name()); err != nil { - t.Fatal(err) - } - - select { - case <-w.Events(): - t.Fatal("got event before anything happened") - case <-w.Errors(): - t.Fatal("got error before anything happened") - default: - } - - if err := ioutil.WriteFile(f.Name(), []byte("hello"), 644); err != nil { - t.Fatal(err) - } - if err := assertEvent(w, fsnotify.Write); err != nil { - t.Fatal(err) - } - - if err := os.Chmod(f.Name(), 600); err != nil { - t.Fatal(err) - } - if err := assertEvent(w, fsnotify.Chmod); err != nil { - t.Fatal(err) - } - - if err := os.Remove(f.Name()); err != nil { - t.Fatal(err) - } - if err := assertEvent(w, fsnotify.Remove); err != nil { - t.Fatal(err) - } -} - -func TestPollerClose(t *testing.T) { - w := NewPollingWatcher() - if err := w.Close(); err != nil { - t.Fatal(err) - } - // test double-close - if err := w.Close(); err != nil { - t.Fatal(err) - } - - f, err := ioutil.TempFile("", "asdf") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(f.Name()) - if err := w.Add(f.Name()); err == nil { - t.Fatal("should have gotten error adding watch for closed watcher") - } -} - -func assertEvent(w FileWatcher, eType fsnotify.Op) error { - var err error - select { - case e := <-w.Events(): - if e.Op != eType { - err = fmt.Errorf("got wrong event type, expected %q: %v", eType, e) - } - case e := <-w.Errors(): - err = fmt.Errorf("got unexpected error waiting for events %v: %v", eType, e) - case <-time.After(watchWaitTime * 3): - err = fmt.Errorf("timeout waiting for event %v", eType) - } - return err -} diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils.go deleted file mode 100644 index c63ae75ce..000000000 --- a/vendor/github.com/docker/docker/pkg/fileutils/fileutils.go +++ /dev/null @@ -1,283 +0,0 @@ -package fileutils - -import ( - "errors" - "fmt" - "io" - "os" - "path/filepath" - "regexp" - "strings" - "text/scanner" - - "github.com/Sirupsen/logrus" -) - -// exclusion returns true if the specified pattern is an exclusion -func exclusion(pattern string) bool { - return pattern[0] == '!' -} - -// empty returns true if the specified pattern is empty -func empty(pattern string) bool { - return pattern == "" -} - -// CleanPatterns takes a slice of patterns returns a new -// slice of patterns cleaned with filepath.Clean, stripped -// of any empty patterns and lets the caller know whether the -// slice contains any exception patterns (prefixed with !). -func CleanPatterns(patterns []string) ([]string, [][]string, bool, error) { - // Loop over exclusion patterns and: - // 1. Clean them up. - // 2. Indicate whether we are dealing with any exception rules. - // 3. Error if we see a single exclusion marker on its own (!). - cleanedPatterns := []string{} - patternDirs := [][]string{} - exceptions := false - for _, pattern := range patterns { - // Eliminate leading and trailing whitespace. - pattern = strings.TrimSpace(pattern) - if empty(pattern) { - continue - } - if exclusion(pattern) { - if len(pattern) == 1 { - return nil, nil, false, errors.New("Illegal exclusion pattern: !") - } - exceptions = true - } - pattern = filepath.Clean(pattern) - cleanedPatterns = append(cleanedPatterns, pattern) - if exclusion(pattern) { - pattern = pattern[1:] - } - patternDirs = append(patternDirs, strings.Split(pattern, string(os.PathSeparator))) - } - - return cleanedPatterns, patternDirs, exceptions, nil -} - -// Matches returns true if file matches any of the patterns -// and isn't excluded by any of the subsequent patterns. -func Matches(file string, patterns []string) (bool, error) { - file = filepath.Clean(file) - - if file == "." { - // Don't let them exclude everything, kind of silly. - return false, nil - } - - patterns, patDirs, _, err := CleanPatterns(patterns) - if err != nil { - return false, err - } - - return OptimizedMatches(file, patterns, patDirs) -} - -// OptimizedMatches is basically the same as fileutils.Matches() but optimized for archive.go. -// It will assume that the inputs have been preprocessed and therefore the function -// doesn't need to do as much error checking and clean-up. This was done to avoid -// repeating these steps on each file being checked during the archive process. -// The more generic fileutils.Matches() can't make these assumptions. -func OptimizedMatches(file string, patterns []string, patDirs [][]string) (bool, error) { - matched := false - file = filepath.FromSlash(file) - parentPath := filepath.Dir(file) - parentPathDirs := strings.Split(parentPath, string(os.PathSeparator)) - - for i, pattern := range patterns { - negative := false - - if exclusion(pattern) { - negative = true - pattern = pattern[1:] - } - - match, err := regexpMatch(pattern, file) - if err != nil { - return false, fmt.Errorf("Error in pattern (%s): %s", pattern, err) - } - - if !match && parentPath != "." { - // Check to see if the pattern matches one of our parent dirs. - if len(patDirs[i]) <= len(parentPathDirs) { - match, _ = regexpMatch(strings.Join(patDirs[i], string(os.PathSeparator)), - strings.Join(parentPathDirs[:len(patDirs[i])], string(os.PathSeparator))) - } - } - - if match { - matched = !negative - } - } - - if matched { - logrus.Debugf("Skipping excluded path: %s", file) - } - - return matched, nil -} - -// regexpMatch tries to match the logic of filepath.Match but -// does so using regexp logic. We do this so that we can expand the -// wildcard set to include other things, like "**" to mean any number -// of directories. This means that we should be backwards compatible -// with filepath.Match(). We'll end up supporting more stuff, due to -// the fact that we're using regexp, but that's ok - it does no harm. -// -// As per the comment in golangs filepath.Match, on Windows, escaping -// is disabled. Instead, '\\' is treated as path separator. -func regexpMatch(pattern, path string) (bool, error) { - regStr := "^" - - // Do some syntax checking on the pattern. - // filepath's Match() has some really weird rules that are inconsistent - // so instead of trying to dup their logic, just call Match() for its - // error state and if there is an error in the pattern return it. - // If this becomes an issue we can remove this since its really only - // needed in the error (syntax) case - which isn't really critical. - if _, err := filepath.Match(pattern, path); err != nil { - return false, err - } - - // Go through the pattern and convert it to a regexp. - // We use a scanner so we can support utf-8 chars. - var scan scanner.Scanner - scan.Init(strings.NewReader(pattern)) - - sl := string(os.PathSeparator) - escSL := sl - if sl == `\` { - escSL += `\` - } - - for scan.Peek() != scanner.EOF { - ch := scan.Next() - - if ch == '*' { - if scan.Peek() == '*' { - // is some flavor of "**" - scan.Next() - - if scan.Peek() == scanner.EOF { - // is "**EOF" - to align with .gitignore just accept all - regStr += ".*" - } else { - // is "**" - regStr += "((.*" + escSL + ")|([^" + escSL + "]*))" - } - - // Treat **/ as ** so eat the "/" - if string(scan.Peek()) == sl { - scan.Next() - } - } else { - // is "*" so map it to anything but "/" - regStr += "[^" + escSL + "]*" - } - } else if ch == '?' { - // "?" is any char except "/" - regStr += "[^" + escSL + "]" - } else if ch == '.' || ch == '$' { - // Escape some regexp special chars that have no meaning - // in golang's filepath.Match - regStr += `\` + string(ch) - } else if ch == '\\' { - // escape next char. Note that a trailing \ in the pattern - // will be left alone (but need to escape it) - if sl == `\` { - // On windows map "\" to "\\", meaning an escaped backslash, - // and then just continue because filepath.Match on - // Windows doesn't allow escaping at all - regStr += escSL - continue - } - if scan.Peek() != scanner.EOF { - regStr += `\` + string(scan.Next()) - } else { - regStr += `\` - } - } else { - regStr += string(ch) - } - } - - regStr += "$" - - res, err := regexp.MatchString(regStr, path) - - // Map regexp's error to filepath's so no one knows we're not using filepath - if err != nil { - err = filepath.ErrBadPattern - } - - return res, err -} - -// CopyFile copies from src to dst until either EOF is reached -// on src or an error occurs. It verifies src exists and removes -// the dst if it exists. -func CopyFile(src, dst string) (int64, error) { - cleanSrc := filepath.Clean(src) - cleanDst := filepath.Clean(dst) - if cleanSrc == cleanDst { - return 0, nil - } - sf, err := os.Open(cleanSrc) - if err != nil { - return 0, err - } - defer sf.Close() - if err := os.Remove(cleanDst); err != nil && !os.IsNotExist(err) { - return 0, err - } - df, err := os.Create(cleanDst) - if err != nil { - return 0, err - } - defer df.Close() - return io.Copy(df, sf) -} - -// ReadSymlinkedDirectory returns the target directory of a symlink. -// The target of the symbolic link may not be a file. -func ReadSymlinkedDirectory(path string) (string, error) { - var realPath string - var err error - if realPath, err = filepath.Abs(path); err != nil { - return "", fmt.Errorf("unable to get absolute path for %s: %s", path, err) - } - if realPath, err = filepath.EvalSymlinks(realPath); err != nil { - return "", fmt.Errorf("failed to canonicalise path for %s: %s", path, err) - } - realPathInfo, err := os.Stat(realPath) - if err != nil { - return "", fmt.Errorf("failed to stat target '%s' of '%s': %s", realPath, path, err) - } - if !realPathInfo.Mode().IsDir() { - return "", fmt.Errorf("canonical path points to a file '%s'", realPath) - } - return realPath, nil -} - -// CreateIfNotExists creates a file or a directory only if it does not already exist. -func CreateIfNotExists(path string, isDir bool) error { - if _, err := os.Stat(path); err != nil { - if os.IsNotExist(err) { - if isDir { - return os.MkdirAll(path, 0755) - } - if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { - return err - } - f, err := os.OpenFile(path, os.O_CREATE, 0755) - if err != nil { - return err - } - f.Close() - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_darwin.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_darwin.go deleted file mode 100644 index ccd648fac..000000000 --- a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_darwin.go +++ /dev/null @@ -1,27 +0,0 @@ -package fileutils - -import ( - "os" - "os/exec" - "strconv" - "strings" -) - -// GetTotalUsedFds returns the number of used File Descriptors by -// executing `lsof -p PID` -func GetTotalUsedFds() int { - pid := os.Getpid() - - cmd := exec.Command("lsof", "-p", strconv.Itoa(pid)) - - output, err := cmd.CombinedOutput() - if err != nil { - return -1 - } - - outputStr := strings.TrimSpace(string(output)) - - fds := strings.Split(outputStr, "\n") - - return len(fds) - 1 -} diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_solaris.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_solaris.go deleted file mode 100644 index 0f2cb7ab9..000000000 --- a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_solaris.go +++ /dev/null @@ -1,7 +0,0 @@ -package fileutils - -// GetTotalUsedFds Returns the number of used File Descriptors. -// On Solaris these limits are per process and not systemwide -func GetTotalUsedFds() int { - return -1 -} diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_test.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_test.go deleted file mode 100644 index 6df1be89b..000000000 --- a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_test.go +++ /dev/null @@ -1,585 +0,0 @@ -package fileutils - -import ( - "io/ioutil" - "os" - "path" - "path/filepath" - "runtime" - "strings" - "testing" -) - -// CopyFile with invalid src -func TestCopyFileWithInvalidSrc(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-fileutils-test") - defer os.RemoveAll(tempFolder) - if err != nil { - t.Fatal(err) - } - bytes, err := CopyFile("/invalid/file/path", path.Join(tempFolder, "dest")) - if err == nil { - t.Fatal("Should have fail to copy an invalid src file") - } - if bytes != 0 { - t.Fatal("Should have written 0 bytes") - } - -} - -// CopyFile with invalid dest -func TestCopyFileWithInvalidDest(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-fileutils-test") - defer os.RemoveAll(tempFolder) - if err != nil { - t.Fatal(err) - } - src := path.Join(tempFolder, "file") - err = ioutil.WriteFile(src, []byte("content"), 0740) - if err != nil { - t.Fatal(err) - } - bytes, err := CopyFile(src, path.Join(tempFolder, "/invalid/dest/path")) - if err == nil { - t.Fatal("Should have fail to copy an invalid src file") - } - if bytes != 0 { - t.Fatal("Should have written 0 bytes") - } - -} - -// CopyFile with same src and dest -func TestCopyFileWithSameSrcAndDest(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-fileutils-test") - defer os.RemoveAll(tempFolder) - if err != nil { - t.Fatal(err) - } - file := path.Join(tempFolder, "file") - err = ioutil.WriteFile(file, []byte("content"), 0740) - if err != nil { - t.Fatal(err) - } - bytes, err := CopyFile(file, file) - if err != nil { - t.Fatal(err) - } - if bytes != 0 { - t.Fatal("Should have written 0 bytes as it is the same file.") - } -} - -// CopyFile with same src and dest but path is different and not clean -func TestCopyFileWithSameSrcAndDestWithPathNameDifferent(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-fileutils-test") - defer os.RemoveAll(tempFolder) - if err != nil { - t.Fatal(err) - } - testFolder := path.Join(tempFolder, "test") - err = os.MkdirAll(testFolder, 0740) - if err != nil { - t.Fatal(err) - } - file := path.Join(testFolder, "file") - sameFile := testFolder + "/../test/file" - err = ioutil.WriteFile(file, []byte("content"), 0740) - if err != nil { - t.Fatal(err) - } - bytes, err := CopyFile(file, sameFile) - if err != nil { - t.Fatal(err) - } - if bytes != 0 { - t.Fatal("Should have written 0 bytes as it is the same file.") - } -} - -func TestCopyFile(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-fileutils-test") - defer os.RemoveAll(tempFolder) - if err != nil { - t.Fatal(err) - } - src := path.Join(tempFolder, "src") - dest := path.Join(tempFolder, "dest") - ioutil.WriteFile(src, []byte("content"), 0777) - ioutil.WriteFile(dest, []byte("destContent"), 0777) - bytes, err := CopyFile(src, dest) - if err != nil { - t.Fatal(err) - } - if bytes != 7 { - t.Fatalf("Should have written %d bytes but wrote %d", 7, bytes) - } - actual, err := ioutil.ReadFile(dest) - if err != nil { - t.Fatal(err) - } - if string(actual) != "content" { - t.Fatalf("Dest content was '%s', expected '%s'", string(actual), "content") - } -} - -// Reading a symlink to a directory must return the directory -func TestReadSymlinkedDirectoryExistingDirectory(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - var err error - if err = os.Mkdir("/tmp/testReadSymlinkToExistingDirectory", 0777); err != nil { - t.Errorf("failed to create directory: %s", err) - } - - if err = os.Symlink("/tmp/testReadSymlinkToExistingDirectory", "/tmp/dirLinkTest"); err != nil { - t.Errorf("failed to create symlink: %s", err) - } - - var path string - if path, err = ReadSymlinkedDirectory("/tmp/dirLinkTest"); err != nil { - t.Fatalf("failed to read symlink to directory: %s", err) - } - - if path != "/tmp/testReadSymlinkToExistingDirectory" { - t.Fatalf("symlink returned unexpected directory: %s", path) - } - - if err = os.Remove("/tmp/testReadSymlinkToExistingDirectory"); err != nil { - t.Errorf("failed to remove temporary directory: %s", err) - } - - if err = os.Remove("/tmp/dirLinkTest"); err != nil { - t.Errorf("failed to remove symlink: %s", err) - } -} - -// Reading a non-existing symlink must fail -func TestReadSymlinkedDirectoryNonExistingSymlink(t *testing.T) { - var path string - var err error - if path, err = ReadSymlinkedDirectory("/tmp/test/foo/Non/ExistingPath"); err == nil { - t.Fatalf("error expected for non-existing symlink") - } - - if path != "" { - t.Fatalf("expected empty path, but '%s' was returned", path) - } -} - -// Reading a symlink to a file must fail -func TestReadSymlinkedDirectoryToFile(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - var err error - var file *os.File - - if file, err = os.Create("/tmp/testReadSymlinkToFile"); err != nil { - t.Fatalf("failed to create file: %s", err) - } - - file.Close() - - if err = os.Symlink("/tmp/testReadSymlinkToFile", "/tmp/fileLinkTest"); err != nil { - t.Errorf("failed to create symlink: %s", err) - } - - var path string - if path, err = ReadSymlinkedDirectory("/tmp/fileLinkTest"); err == nil { - t.Fatalf("ReadSymlinkedDirectory on a symlink to a file should've failed") - } - - if path != "" { - t.Fatalf("path should've been empty: %s", path) - } - - if err = os.Remove("/tmp/testReadSymlinkToFile"); err != nil { - t.Errorf("failed to remove file: %s", err) - } - - if err = os.Remove("/tmp/fileLinkTest"); err != nil { - t.Errorf("failed to remove symlink: %s", err) - } -} - -func TestWildcardMatches(t *testing.T) { - match, _ := Matches("fileutils.go", []string{"*"}) - if match != true { - t.Errorf("failed to get a wildcard match, got %v", match) - } -} - -// A simple pattern match should return true. -func TestPatternMatches(t *testing.T) { - match, _ := Matches("fileutils.go", []string{"*.go"}) - if match != true { - t.Errorf("failed to get a match, got %v", match) - } -} - -// An exclusion followed by an inclusion should return true. -func TestExclusionPatternMatchesPatternBefore(t *testing.T) { - match, _ := Matches("fileutils.go", []string{"!fileutils.go", "*.go"}) - if match != true { - t.Errorf("failed to get true match on exclusion pattern, got %v", match) - } -} - -// A folder pattern followed by an exception should return false. -func TestPatternMatchesFolderExclusions(t *testing.T) { - match, _ := Matches("docs/README.md", []string{"docs", "!docs/README.md"}) - if match != false { - t.Errorf("failed to get a false match on exclusion pattern, got %v", match) - } -} - -// A folder pattern followed by an exception should return false. -func TestPatternMatchesFolderWithSlashExclusions(t *testing.T) { - match, _ := Matches("docs/README.md", []string{"docs/", "!docs/README.md"}) - if match != false { - t.Errorf("failed to get a false match on exclusion pattern, got %v", match) - } -} - -// A folder pattern followed by an exception should return false. -func TestPatternMatchesFolderWildcardExclusions(t *testing.T) { - match, _ := Matches("docs/README.md", []string{"docs/*", "!docs/README.md"}) - if match != false { - t.Errorf("failed to get a false match on exclusion pattern, got %v", match) - } -} - -// A pattern followed by an exclusion should return false. -func TestExclusionPatternMatchesPatternAfter(t *testing.T) { - match, _ := Matches("fileutils.go", []string{"*.go", "!fileutils.go"}) - if match != false { - t.Errorf("failed to get false match on exclusion pattern, got %v", match) - } -} - -// A filename evaluating to . should return false. -func TestExclusionPatternMatchesWholeDirectory(t *testing.T) { - match, _ := Matches(".", []string{"*.go"}) - if match != false { - t.Errorf("failed to get false match on ., got %v", match) - } -} - -// A single ! pattern should return an error. -func TestSingleExclamationError(t *testing.T) { - _, err := Matches("fileutils.go", []string{"!"}) - if err == nil { - t.Errorf("failed to get an error for a single exclamation point, got %v", err) - } -} - -// A string preceded with a ! should return true from Exclusion. -func TestExclusion(t *testing.T) { - exclusion := exclusion("!") - if !exclusion { - t.Errorf("failed to get true for a single !, got %v", exclusion) - } -} - -// Matches with no patterns -func TestMatchesWithNoPatterns(t *testing.T) { - matches, err := Matches("/any/path/there", []string{}) - if err != nil { - t.Fatal(err) - } - if matches { - t.Fatalf("Should not have match anything") - } -} - -// Matches with malformed patterns -func TestMatchesWithMalformedPatterns(t *testing.T) { - matches, err := Matches("/any/path/there", []string{"["}) - if err == nil { - t.Fatal("Should have failed because of a malformed syntax in the pattern") - } - if matches { - t.Fatalf("Should not have match anything") - } -} - -// Test lots of variants of patterns & strings -func TestMatches(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - tests := []struct { - pattern string - text string - pass bool - }{ - {"**", "file", true}, - {"**", "file/", true}, - {"**/", "file", true}, // weird one - {"**/", "file/", true}, - {"**", "/", true}, - {"**/", "/", true}, - {"**", "dir/file", true}, - {"**/", "dir/file", false}, - {"**", "dir/file/", true}, - {"**/", "dir/file/", true}, - {"**/**", "dir/file", true}, - {"**/**", "dir/file/", true}, - {"dir/**", "dir/file", true}, - {"dir/**", "dir/file/", true}, - {"dir/**", "dir/dir2/file", true}, - {"dir/**", "dir/dir2/file/", true}, - {"**/dir2/*", "dir/dir2/file", true}, - {"**/dir2/*", "dir/dir2/file/", false}, - {"**/dir2/**", "dir/dir2/dir3/file", true}, - {"**/dir2/**", "dir/dir2/dir3/file/", true}, - {"**file", "file", true}, - {"**file", "dir/file", true}, - {"**/file", "dir/file", true}, - {"**file", "dir/dir/file", true}, - {"**/file", "dir/dir/file", true}, - {"**/file*", "dir/dir/file", true}, - {"**/file*", "dir/dir/file.txt", true}, - {"**/file*txt", "dir/dir/file.txt", true}, - {"**/file*.txt", "dir/dir/file.txt", true}, - {"**/file*.txt*", "dir/dir/file.txt", true}, - {"**/**/*.txt", "dir/dir/file.txt", true}, - {"**/**/*.txt2", "dir/dir/file.txt", false}, - {"**/*.txt", "file.txt", true}, - {"**/**/*.txt", "file.txt", true}, - {"a**/*.txt", "a/file.txt", true}, - {"a**/*.txt", "a/dir/file.txt", true}, - {"a**/*.txt", "a/dir/dir/file.txt", true}, - {"a/*.txt", "a/dir/file.txt", false}, - {"a/*.txt", "a/file.txt", true}, - {"a/*.txt**", "a/file.txt", true}, - {"a[b-d]e", "ae", false}, - {"a[b-d]e", "ace", true}, - {"a[b-d]e", "aae", false}, - {"a[^b-d]e", "aze", true}, - {".*", ".foo", true}, - {".*", "foo", false}, - {"abc.def", "abcdef", false}, - {"abc.def", "abc.def", true}, - {"abc.def", "abcZdef", false}, - {"abc?def", "abcZdef", true}, - {"abc?def", "abcdef", false}, - {"a\\*b", "a*b", true}, - {"a\\", "a", false}, - {"a\\", "a\\", false}, - {"a\\\\", "a\\", true}, - {"**/foo/bar", "foo/bar", true}, - {"**/foo/bar", "dir/foo/bar", true}, - {"**/foo/bar", "dir/dir2/foo/bar", true}, - {"abc/**", "abc", false}, - {"abc/**", "abc/def", true}, - {"abc/**", "abc/def/ghi", true}, - } - - for _, test := range tests { - res, _ := regexpMatch(test.pattern, test.text) - if res != test.pass { - t.Fatalf("Failed: %v - res:%v", test, res) - } - } -} - -// An empty string should return true from Empty. -func TestEmpty(t *testing.T) { - empty := empty("") - if !empty { - t.Errorf("failed to get true for an empty string, got %v", empty) - } -} - -func TestCleanPatterns(t *testing.T) { - cleaned, _, _, _ := CleanPatterns([]string{"docs", "config"}) - if len(cleaned) != 2 { - t.Errorf("expected 2 element slice, got %v", len(cleaned)) - } -} - -func TestCleanPatternsStripEmptyPatterns(t *testing.T) { - cleaned, _, _, _ := CleanPatterns([]string{"docs", "config", ""}) - if len(cleaned) != 2 { - t.Errorf("expected 2 element slice, got %v", len(cleaned)) - } -} - -func TestCleanPatternsExceptionFlag(t *testing.T) { - _, _, exceptions, _ := CleanPatterns([]string{"docs", "!docs/README.md"}) - if !exceptions { - t.Errorf("expected exceptions to be true, got %v", exceptions) - } -} - -func TestCleanPatternsLeadingSpaceTrimmed(t *testing.T) { - _, _, exceptions, _ := CleanPatterns([]string{"docs", " !docs/README.md"}) - if !exceptions { - t.Errorf("expected exceptions to be true, got %v", exceptions) - } -} - -func TestCleanPatternsTrailingSpaceTrimmed(t *testing.T) { - _, _, exceptions, _ := CleanPatterns([]string{"docs", "!docs/README.md "}) - if !exceptions { - t.Errorf("expected exceptions to be true, got %v", exceptions) - } -} - -func TestCleanPatternsErrorSingleException(t *testing.T) { - _, _, _, err := CleanPatterns([]string{"!"}) - if err == nil { - t.Errorf("expected error on single exclamation point, got %v", err) - } -} - -func TestCleanPatternsFolderSplit(t *testing.T) { - _, dirs, _, _ := CleanPatterns([]string{"docs/config/CONFIG.md"}) - if dirs[0][0] != "docs" { - t.Errorf("expected first element in dirs slice to be docs, got %v", dirs[0][1]) - } - if dirs[0][1] != "config" { - t.Errorf("expected first element in dirs slice to be config, got %v", dirs[0][1]) - } -} - -func TestCreateIfNotExistsDir(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-fileutils-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tempFolder) - - folderToCreate := filepath.Join(tempFolder, "tocreate") - - if err := CreateIfNotExists(folderToCreate, true); err != nil { - t.Fatal(err) - } - fileinfo, err := os.Stat(folderToCreate) - if err != nil { - t.Fatalf("Should have create a folder, got %v", err) - } - - if !fileinfo.IsDir() { - t.Fatalf("Should have been a dir, seems it's not") - } -} - -func TestCreateIfNotExistsFile(t *testing.T) { - tempFolder, err := ioutil.TempDir("", "docker-fileutils-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tempFolder) - - fileToCreate := filepath.Join(tempFolder, "file/to/create") - - if err := CreateIfNotExists(fileToCreate, false); err != nil { - t.Fatal(err) - } - fileinfo, err := os.Stat(fileToCreate) - if err != nil { - t.Fatalf("Should have create a file, got %v", err) - } - - if fileinfo.IsDir() { - t.Fatalf("Should have been a file, seems it's not") - } -} - -// These matchTests are stolen from go's filepath Match tests. -type matchTest struct { - pattern, s string - match bool - err error -} - -var matchTests = []matchTest{ - {"abc", "abc", true, nil}, - {"*", "abc", true, nil}, - {"*c", "abc", true, nil}, - {"a*", "a", true, nil}, - {"a*", "abc", true, nil}, - {"a*", "ab/c", false, nil}, - {"a*/b", "abc/b", true, nil}, - {"a*/b", "a/c/b", false, nil}, - {"a*b*c*d*e*/f", "axbxcxdxe/f", true, nil}, - {"a*b*c*d*e*/f", "axbxcxdxexxx/f", true, nil}, - {"a*b*c*d*e*/f", "axbxcxdxe/xxx/f", false, nil}, - {"a*b*c*d*e*/f", "axbxcxdxexxx/fff", false, nil}, - {"a*b?c*x", "abxbbxdbxebxczzx", true, nil}, - {"a*b?c*x", "abxbbxdbxebxczzy", false, nil}, - {"ab[c]", "abc", true, nil}, - {"ab[b-d]", "abc", true, nil}, - {"ab[e-g]", "abc", false, nil}, - {"ab[^c]", "abc", false, nil}, - {"ab[^b-d]", "abc", false, nil}, - {"ab[^e-g]", "abc", true, nil}, - {"a\\*b", "a*b", true, nil}, - {"a\\*b", "ab", false, nil}, - {"a?b", "a☺b", true, nil}, - {"a[^a]b", "a☺b", true, nil}, - {"a???b", "a☺b", false, nil}, - {"a[^a][^a][^a]b", "a☺b", false, nil}, - {"[a-ζ]*", "α", true, nil}, - {"*[a-ζ]", "A", false, nil}, - {"a?b", "a/b", false, nil}, - {"a*b", "a/b", false, nil}, - {"[\\]a]", "]", true, nil}, - {"[\\-]", "-", true, nil}, - {"[x\\-]", "x", true, nil}, - {"[x\\-]", "-", true, nil}, - {"[x\\-]", "z", false, nil}, - {"[\\-x]", "x", true, nil}, - {"[\\-x]", "-", true, nil}, - {"[\\-x]", "a", false, nil}, - {"[]a]", "]", false, filepath.ErrBadPattern}, - {"[-]", "-", false, filepath.ErrBadPattern}, - {"[x-]", "x", false, filepath.ErrBadPattern}, - {"[x-]", "-", false, filepath.ErrBadPattern}, - {"[x-]", "z", false, filepath.ErrBadPattern}, - {"[-x]", "x", false, filepath.ErrBadPattern}, - {"[-x]", "-", false, filepath.ErrBadPattern}, - {"[-x]", "a", false, filepath.ErrBadPattern}, - {"\\", "a", false, filepath.ErrBadPattern}, - {"[a-b-c]", "a", false, filepath.ErrBadPattern}, - {"[", "a", false, filepath.ErrBadPattern}, - {"[^", "a", false, filepath.ErrBadPattern}, - {"[^bc", "a", false, filepath.ErrBadPattern}, - {"a[", "a", false, filepath.ErrBadPattern}, // was nil but IMO its wrong - {"a[", "ab", false, filepath.ErrBadPattern}, - {"*x", "xxx", true, nil}, -} - -func errp(e error) string { - if e == nil { - return "" - } - return e.Error() -} - -// TestMatch test's our version of filepath.Match, called regexpMatch. -func TestMatch(t *testing.T) { - for _, tt := range matchTests { - pattern := tt.pattern - s := tt.s - if runtime.GOOS == "windows" { - if strings.Index(pattern, "\\") >= 0 { - // no escape allowed on windows. - continue - } - pattern = filepath.Clean(pattern) - s = filepath.Clean(s) - } - ok, err := regexpMatch(pattern, s) - if ok != tt.match || err != tt.err { - t.Fatalf("Match(%#q, %#q) = %v, %q want %v, %q", pattern, s, ok, errp(err), tt.match, errp(tt.err)) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_unix.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_unix.go deleted file mode 100644 index d5c3abf56..000000000 --- a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_unix.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build linux freebsd - -package fileutils - -import ( - "fmt" - "io/ioutil" - "os" - - "github.com/Sirupsen/logrus" -) - -// GetTotalUsedFds Returns the number of used File Descriptors by -// reading it via /proc filesystem. -func GetTotalUsedFds() int { - if fds, err := ioutil.ReadDir(fmt.Sprintf("/proc/%d/fd", os.Getpid())); err != nil { - logrus.Errorf("Error opening /proc/%d/fd: %s", os.Getpid(), err) - } else { - return len(fds) - } - return -1 -} diff --git a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_windows.go b/vendor/github.com/docker/docker/pkg/fileutils/fileutils_windows.go deleted file mode 100644 index 5ec21cace..000000000 --- a/vendor/github.com/docker/docker/pkg/fileutils/fileutils_windows.go +++ /dev/null @@ -1,7 +0,0 @@ -package fileutils - -// GetTotalUsedFds Returns the number of used File Descriptors. Not supported -// on Windows. -func GetTotalUsedFds() int { - return -1 -} diff --git a/vendor/github.com/docker/docker/pkg/fsutils/fsutils_linux.go b/vendor/github.com/docker/docker/pkg/fsutils/fsutils_linux.go deleted file mode 100644 index 9fd054e77..000000000 --- a/vendor/github.com/docker/docker/pkg/fsutils/fsutils_linux.go +++ /dev/null @@ -1,89 +0,0 @@ -// +build linux - -package fsutils - -import ( - "fmt" - "io/ioutil" - "os" - "syscall" - "unsafe" -) - -func locateDummyIfEmpty(path string) (string, error) { - children, err := ioutil.ReadDir(path) - if err != nil { - return "", err - } - if len(children) != 0 { - return "", nil - } - dummyFile, err := ioutil.TempFile(path, "fsutils-dummy") - if err != nil { - return "", err - } - name := dummyFile.Name() - if err = dummyFile.Close(); err != nil { - return name, err - } - return name, nil -} - -// SupportsDType returns whether the filesystem mounted on path supports d_type -func SupportsDType(path string) (bool, error) { - // locate dummy so that we have at least one dirent - dummy, err := locateDummyIfEmpty(path) - if err != nil { - return false, err - } - if dummy != "" { - defer os.Remove(dummy) - } - - visited := 0 - supportsDType := true - fn := func(ent *syscall.Dirent) bool { - visited++ - if ent.Type == syscall.DT_UNKNOWN { - supportsDType = false - // stop iteration - return true - } - // continue iteration - return false - } - if err = iterateReadDir(path, fn); err != nil { - return false, err - } - if visited == 0 { - return false, fmt.Errorf("did not hit any dirent during iteration %s", path) - } - return supportsDType, nil -} - -func iterateReadDir(path string, fn func(*syscall.Dirent) bool) error { - d, err := os.Open(path) - if err != nil { - return err - } - defer d.Close() - fd := int(d.Fd()) - buf := make([]byte, 4096) - for { - nbytes, err := syscall.ReadDirent(fd, buf) - if err != nil { - return err - } - if nbytes == 0 { - break - } - for off := 0; off < nbytes; { - ent := (*syscall.Dirent)(unsafe.Pointer(&buf[off])) - if stop := fn(ent); stop { - return nil - } - off += int(ent.Reclen) - } - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/fsutils/fsutils_linux_test.go b/vendor/github.com/docker/docker/pkg/fsutils/fsutils_linux_test.go deleted file mode 100644 index 4a648239c..000000000 --- a/vendor/github.com/docker/docker/pkg/fsutils/fsutils_linux_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// +build linux - -package fsutils - -import ( - "io/ioutil" - "os" - "os/exec" - "syscall" - "testing" -) - -func testSupportsDType(t *testing.T, expected bool, mkfsCommand string, mkfsArg ...string) { - // check whether mkfs is installed - if _, err := exec.LookPath(mkfsCommand); err != nil { - t.Skipf("%s not installed: %v", mkfsCommand, err) - } - - // create a sparse image - imageSize := int64(32 * 1024 * 1024) - imageFile, err := ioutil.TempFile("", "fsutils-image") - if err != nil { - t.Fatal(err) - } - imageFileName := imageFile.Name() - defer os.Remove(imageFileName) - if _, err = imageFile.Seek(imageSize-1, 0); err != nil { - t.Fatal(err) - } - if _, err = imageFile.Write([]byte{0}); err != nil { - t.Fatal(err) - } - if err = imageFile.Close(); err != nil { - t.Fatal(err) - } - - // create a mountpoint - mountpoint, err := ioutil.TempDir("", "fsutils-mountpoint") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(mountpoint) - - // format the image - args := append(mkfsArg, imageFileName) - t.Logf("Executing `%s %v`", mkfsCommand, args) - out, err := exec.Command(mkfsCommand, args...).CombinedOutput() - if len(out) > 0 { - t.Log(string(out)) - } - if err != nil { - t.Fatal(err) - } - - // loopback-mount the image. - // for ease of setting up loopback device, we use os/exec rather than syscall.Mount - out, err = exec.Command("mount", "-o", "loop", imageFileName, mountpoint).CombinedOutput() - if len(out) > 0 { - t.Log(string(out)) - } - if err != nil { - t.Skip("skipping the test because mount failed") - } - defer func() { - if err := syscall.Unmount(mountpoint, 0); err != nil { - t.Fatal(err) - } - }() - - // check whether it supports d_type - result, err := SupportsDType(mountpoint) - if err != nil { - t.Fatal(err) - } - t.Logf("Supports d_type: %v", result) - if result != expected { - t.Fatalf("expected %v, got %v", expected, result) - } -} - -func TestSupportsDTypeWithFType0XFS(t *testing.T) { - testSupportsDType(t, false, "mkfs.xfs", "-m", "crc=0", "-n", "ftype=0") -} - -func TestSupportsDTypeWithFType1XFS(t *testing.T) { - testSupportsDType(t, true, "mkfs.xfs", "-m", "crc=0", "-n", "ftype=1") -} - -func TestSupportsDTypeWithExt4(t *testing.T) { - testSupportsDType(t, true, "mkfs.ext4") -} diff --git a/vendor/github.com/docker/docker/pkg/gitutils/gitutils.go b/vendor/github.com/docker/docker/pkg/gitutils/gitutils.go deleted file mode 100644 index ded091f2a..000000000 --- a/vendor/github.com/docker/docker/pkg/gitutils/gitutils.go +++ /dev/null @@ -1,100 +0,0 @@ -package gitutils - -import ( - "fmt" - "io/ioutil" - "net/http" - "net/url" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/docker/docker/pkg/symlink" - "github.com/docker/docker/pkg/urlutil" -) - -// Clone clones a repository into a newly created directory which -// will be under "docker-build-git" -func Clone(remoteURL string) (string, error) { - if !urlutil.IsGitTransport(remoteURL) { - remoteURL = "https://" + remoteURL - } - root, err := ioutil.TempDir("", "docker-build-git") - if err != nil { - return "", err - } - - u, err := url.Parse(remoteURL) - if err != nil { - return "", err - } - - fragment := u.Fragment - clone := cloneArgs(u, root) - - if output, err := git(clone...); err != nil { - return "", fmt.Errorf("Error trying to use git: %s (%s)", err, output) - } - - return checkoutGit(fragment, root) -} - -func cloneArgs(remoteURL *url.URL, root string) []string { - args := []string{"clone", "--recursive"} - shallow := len(remoteURL.Fragment) == 0 - - if shallow && strings.HasPrefix(remoteURL.Scheme, "http") { - res, err := http.Head(fmt.Sprintf("%s/info/refs?service=git-upload-pack", remoteURL)) - if err != nil || res.Header.Get("Content-Type") != "application/x-git-upload-pack-advertisement" { - shallow = false - } - } - - if shallow { - args = append(args, "--depth", "1") - } - - if remoteURL.Fragment != "" { - remoteURL.Fragment = "" - } - - return append(args, remoteURL.String(), root) -} - -func checkoutGit(fragment, root string) (string, error) { - refAndDir := strings.SplitN(fragment, ":", 2) - - if len(refAndDir[0]) != 0 { - if output, err := gitWithinDir(root, "checkout", refAndDir[0]); err != nil { - return "", fmt.Errorf("Error trying to use git: %s (%s)", err, output) - } - } - - if len(refAndDir) > 1 && len(refAndDir[1]) != 0 { - newCtx, err := symlink.FollowSymlinkInScope(filepath.Join(root, refAndDir[1]), root) - if err != nil { - return "", fmt.Errorf("Error setting git context, %q not within git root: %s", refAndDir[1], err) - } - - fi, err := os.Stat(newCtx) - if err != nil { - return "", err - } - if !fi.IsDir() { - return "", fmt.Errorf("Error setting git context, not a directory: %s", newCtx) - } - root = newCtx - } - - return root, nil -} - -func gitWithinDir(dir string, args ...string) ([]byte, error) { - a := []string{"--work-tree", dir, "--git-dir", filepath.Join(dir, ".git")} - return git(append(a, args...)...) -} - -func git(args ...string) ([]byte, error) { - return exec.Command("git", args...).CombinedOutput() -} diff --git a/vendor/github.com/docker/docker/pkg/gitutils/gitutils_test.go b/vendor/github.com/docker/docker/pkg/gitutils/gitutils_test.go deleted file mode 100644 index d197058d2..000000000 --- a/vendor/github.com/docker/docker/pkg/gitutils/gitutils_test.go +++ /dev/null @@ -1,220 +0,0 @@ -package gitutils - -import ( - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "os" - "path/filepath" - "reflect" - "runtime" - "strings" - "testing" -) - -func TestCloneArgsSmartHttp(t *testing.T) { - mux := http.NewServeMux() - server := httptest.NewServer(mux) - serverURL, _ := url.Parse(server.URL) - - serverURL.Path = "/repo.git" - gitURL := serverURL.String() - - mux.HandleFunc("/repo.git/info/refs", func(w http.ResponseWriter, r *http.Request) { - q := r.URL.Query().Get("service") - w.Header().Set("Content-Type", fmt.Sprintf("application/x-%s-advertisement", q)) - }) - - args := cloneArgs(serverURL, "/tmp") - exp := []string{"clone", "--recursive", "--depth", "1", gitURL, "/tmp"} - if !reflect.DeepEqual(args, exp) { - t.Fatalf("Expected %v, got %v", exp, args) - } -} - -func TestCloneArgsDumbHttp(t *testing.T) { - mux := http.NewServeMux() - server := httptest.NewServer(mux) - serverURL, _ := url.Parse(server.URL) - - serverURL.Path = "/repo.git" - gitURL := serverURL.String() - - mux.HandleFunc("/repo.git/info/refs", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "text/plain") - }) - - args := cloneArgs(serverURL, "/tmp") - exp := []string{"clone", "--recursive", gitURL, "/tmp"} - if !reflect.DeepEqual(args, exp) { - t.Fatalf("Expected %v, got %v", exp, args) - } -} - -func TestCloneArgsGit(t *testing.T) { - u, _ := url.Parse("git://github.com/docker/docker") - args := cloneArgs(u, "/tmp") - exp := []string{"clone", "--recursive", "--depth", "1", "git://github.com/docker/docker", "/tmp"} - if !reflect.DeepEqual(args, exp) { - t.Fatalf("Expected %v, got %v", exp, args) - } -} - -func TestCloneArgsStripFragment(t *testing.T) { - u, _ := url.Parse("git://github.com/docker/docker#test") - args := cloneArgs(u, "/tmp") - exp := []string{"clone", "--recursive", "git://github.com/docker/docker", "/tmp"} - if !reflect.DeepEqual(args, exp) { - t.Fatalf("Expected %v, got %v", exp, args) - } -} - -func gitGetConfig(name string) string { - b, err := git([]string{"config", "--get", name}...) - if err != nil { - // since we are interested in empty or non empty string, - // we can safely ignore the err here. - return "" - } - return strings.TrimSpace(string(b)) -} - -func TestCheckoutGit(t *testing.T) { - root, err := ioutil.TempDir("", "docker-build-git-checkout") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(root) - - autocrlf := gitGetConfig("core.autocrlf") - if !(autocrlf == "true" || autocrlf == "false" || - autocrlf == "input" || autocrlf == "") { - t.Logf("unknown core.autocrlf value: \"%s\"", autocrlf) - } - eol := "\n" - if autocrlf == "true" { - eol = "\r\n" - } - - gitDir := filepath.Join(root, "repo") - _, err = git("init", gitDir) - if err != nil { - t.Fatal(err) - } - - if _, err = gitWithinDir(gitDir, "config", "user.email", "test@docker.com"); err != nil { - t.Fatal(err) - } - - if _, err = gitWithinDir(gitDir, "config", "user.name", "Docker test"); err != nil { - t.Fatal(err) - } - - if err = ioutil.WriteFile(filepath.Join(gitDir, "Dockerfile"), []byte("FROM scratch"), 0644); err != nil { - t.Fatal(err) - } - - subDir := filepath.Join(gitDir, "subdir") - if err = os.Mkdir(subDir, 0755); err != nil { - t.Fatal(err) - } - - if err = ioutil.WriteFile(filepath.Join(subDir, "Dockerfile"), []byte("FROM scratch\nEXPOSE 5000"), 0644); err != nil { - t.Fatal(err) - } - - if runtime.GOOS != "windows" { - if err = os.Symlink("../subdir", filepath.Join(gitDir, "parentlink")); err != nil { - t.Fatal(err) - } - - if err = os.Symlink("/subdir", filepath.Join(gitDir, "absolutelink")); err != nil { - t.Fatal(err) - } - } - - if _, err = gitWithinDir(gitDir, "add", "-A"); err != nil { - t.Fatal(err) - } - - if _, err = gitWithinDir(gitDir, "commit", "-am", "First commit"); err != nil { - t.Fatal(err) - } - - if _, err = gitWithinDir(gitDir, "checkout", "-b", "test"); err != nil { - t.Fatal(err) - } - - if err = ioutil.WriteFile(filepath.Join(gitDir, "Dockerfile"), []byte("FROM scratch\nEXPOSE 3000"), 0644); err != nil { - t.Fatal(err) - } - - if err = ioutil.WriteFile(filepath.Join(subDir, "Dockerfile"), []byte("FROM busybox\nEXPOSE 5000"), 0644); err != nil { - t.Fatal(err) - } - - if _, err = gitWithinDir(gitDir, "add", "-A"); err != nil { - t.Fatal(err) - } - - if _, err = gitWithinDir(gitDir, "commit", "-am", "Branch commit"); err != nil { - t.Fatal(err) - } - - if _, err = gitWithinDir(gitDir, "checkout", "master"); err != nil { - t.Fatal(err) - } - - type singleCase struct { - frag string - exp string - fail bool - } - - cases := []singleCase{ - {"", "FROM scratch", false}, - {"master", "FROM scratch", false}, - {":subdir", "FROM scratch" + eol + "EXPOSE 5000", false}, - {":nosubdir", "", true}, // missing directory error - {":Dockerfile", "", true}, // not a directory error - {"master:nosubdir", "", true}, - {"master:subdir", "FROM scratch" + eol + "EXPOSE 5000", false}, - {"master:../subdir", "", true}, - {"test", "FROM scratch" + eol + "EXPOSE 3000", false}, - {"test:", "FROM scratch" + eol + "EXPOSE 3000", false}, - {"test:subdir", "FROM busybox" + eol + "EXPOSE 5000", false}, - } - - if runtime.GOOS != "windows" { - // Windows GIT (2.7.1 x64) does not support parentlink/absolutelink. Sample output below - // git --work-tree .\repo --git-dir .\repo\.git add -A - // error: readlink("absolutelink"): Function not implemented - // error: unable to index file absolutelink - // fatal: adding files failed - cases = append(cases, singleCase{frag: "master:absolutelink", exp: "FROM scratch" + eol + "EXPOSE 5000", fail: false}) - cases = append(cases, singleCase{frag: "master:parentlink", exp: "FROM scratch" + eol + "EXPOSE 5000", fail: false}) - } - - for _, c := range cases { - r, err := checkoutGit(c.frag, gitDir) - - fail := err != nil - if fail != c.fail { - t.Fatalf("Expected %v failure, error was %v\n", c.fail, err) - } - if c.fail { - continue - } - - b, err := ioutil.ReadFile(filepath.Join(r, "Dockerfile")) - if err != nil { - t.Fatal(err) - } - - if string(b) != c.exp { - t.Fatalf("Expected %v, was %v\n", c.exp, string(b)) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/graphdb/conn_sqlite3_linux.go b/vendor/github.com/docker/docker/pkg/graphdb/conn_sqlite3_linux.go deleted file mode 100644 index 8e61ff3b4..000000000 --- a/vendor/github.com/docker/docker/pkg/graphdb/conn_sqlite3_linux.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build cgo - -package graphdb - -import ( - "database/sql" - - _ "github.com/mattn/go-sqlite3" // registers sqlite -) - -// NewSqliteConn opens a connection to a sqlite -// database. -func NewSqliteConn(root string) (*Database, error) { - conn, err := sql.Open("sqlite3", root) - if err != nil { - return nil, err - } - return NewDatabase(conn) -} diff --git a/vendor/github.com/docker/docker/pkg/graphdb/graphdb_linux.go b/vendor/github.com/docker/docker/pkg/graphdb/graphdb_linux.go deleted file mode 100644 index eca433fa8..000000000 --- a/vendor/github.com/docker/docker/pkg/graphdb/graphdb_linux.go +++ /dev/null @@ -1,551 +0,0 @@ -package graphdb - -import ( - "database/sql" - "fmt" - "path" - "strings" - "sync" -) - -const ( - createEntityTable = ` - CREATE TABLE IF NOT EXISTS entity ( - id text NOT NULL PRIMARY KEY - );` - - createEdgeTable = ` - CREATE TABLE IF NOT EXISTS edge ( - "entity_id" text NOT NULL, - "parent_id" text NULL, - "name" text NOT NULL, - CONSTRAINT "parent_fk" FOREIGN KEY ("parent_id") REFERENCES "entity" ("id"), - CONSTRAINT "entity_fk" FOREIGN KEY ("entity_id") REFERENCES "entity" ("id") - ); - ` - - createEdgeIndices = ` - CREATE UNIQUE INDEX IF NOT EXISTS "name_parent_ix" ON "edge" (parent_id, name); - ` -) - -// Entity with a unique id. -type Entity struct { - id string -} - -// An Edge connects two entities together. -type Edge struct { - EntityID string - Name string - ParentID string -} - -// Entities stores the list of entities. -type Entities map[string]*Entity - -// Edges stores the relationships between entities. -type Edges []*Edge - -// WalkFunc is a function invoked to process an individual entity. -type WalkFunc func(fullPath string, entity *Entity) error - -// Database is a graph database for storing entities and their relationships. -type Database struct { - conn *sql.DB - mux sync.RWMutex -} - -// IsNonUniqueNameError processes the error to check if it's caused by -// a constraint violation. -// This is necessary because the error isn't the same across various -// sqlite versions. -func IsNonUniqueNameError(err error) bool { - str := err.Error() - // sqlite 3.7.17-1ubuntu1 returns: - // Set failure: Abort due to constraint violation: columns parent_id, name are not unique - if strings.HasSuffix(str, "name are not unique") { - return true - } - // sqlite-3.8.3-1.fc20 returns: - // Set failure: Abort due to constraint violation: UNIQUE constraint failed: edge.parent_id, edge.name - if strings.Contains(str, "UNIQUE constraint failed") && strings.Contains(str, "edge.name") { - return true - } - // sqlite-3.6.20-1.el6 returns: - // Set failure: Abort due to constraint violation: constraint failed - if strings.HasSuffix(str, "constraint failed") { - return true - } - return false -} - -// NewDatabase creates a new graph database initialized with a root entity. -func NewDatabase(conn *sql.DB) (*Database, error) { - if conn == nil { - return nil, fmt.Errorf("Database connection cannot be nil") - } - db := &Database{conn: conn} - - // Create root entities - tx, err := conn.Begin() - if err != nil { - return nil, err - } - - if _, err := tx.Exec(createEntityTable); err != nil { - return nil, err - } - if _, err := tx.Exec(createEdgeTable); err != nil { - return nil, err - } - if _, err := tx.Exec(createEdgeIndices); err != nil { - return nil, err - } - - if _, err := tx.Exec("DELETE FROM entity where id = ?", "0"); err != nil { - tx.Rollback() - return nil, err - } - - if _, err := tx.Exec("INSERT INTO entity (id) VALUES (?);", "0"); err != nil { - tx.Rollback() - return nil, err - } - - if _, err := tx.Exec("DELETE FROM edge where entity_id=? and name=?", "0", "/"); err != nil { - tx.Rollback() - return nil, err - } - - if _, err := tx.Exec("INSERT INTO edge (entity_id, name) VALUES(?,?);", "0", "/"); err != nil { - tx.Rollback() - return nil, err - } - - if err := tx.Commit(); err != nil { - return nil, err - } - - return db, nil -} - -// Close the underlying connection to the database. -func (db *Database) Close() error { - return db.conn.Close() -} - -// Set the entity id for a given path. -func (db *Database) Set(fullPath, id string) (*Entity, error) { - db.mux.Lock() - defer db.mux.Unlock() - - tx, err := db.conn.Begin() - if err != nil { - return nil, err - } - - var entityID string - if err := tx.QueryRow("SELECT id FROM entity WHERE id = ?;", id).Scan(&entityID); err != nil { - if err == sql.ErrNoRows { - if _, err := tx.Exec("INSERT INTO entity (id) VALUES(?);", id); err != nil { - tx.Rollback() - return nil, err - } - } else { - tx.Rollback() - return nil, err - } - } - e := &Entity{id} - - parentPath, name := splitPath(fullPath) - if err := db.setEdge(parentPath, name, e, tx); err != nil { - tx.Rollback() - return nil, err - } - - if err := tx.Commit(); err != nil { - return nil, err - } - return e, nil -} - -// Exists returns true if a name already exists in the database. -func (db *Database) Exists(name string) bool { - db.mux.RLock() - defer db.mux.RUnlock() - - e, err := db.get(name) - if err != nil { - return false - } - return e != nil -} - -func (db *Database) setEdge(parentPath, name string, e *Entity, tx *sql.Tx) error { - parent, err := db.get(parentPath) - if err != nil { - return err - } - if parent.id == e.id { - return fmt.Errorf("Cannot set self as child") - } - - if _, err := tx.Exec("INSERT INTO edge (parent_id, name, entity_id) VALUES (?,?,?);", parent.id, name, e.id); err != nil { - return err - } - return nil -} - -// RootEntity returns the root "/" entity for the database. -func (db *Database) RootEntity() *Entity { - return &Entity{ - id: "0", - } -} - -// Get returns the entity for a given path. -func (db *Database) Get(name string) *Entity { - db.mux.RLock() - defer db.mux.RUnlock() - - e, err := db.get(name) - if err != nil { - return nil - } - return e -} - -func (db *Database) get(name string) (*Entity, error) { - e := db.RootEntity() - // We always know the root name so return it if - // it is requested - if name == "/" { - return e, nil - } - - parts := split(name) - for i := 1; i < len(parts); i++ { - p := parts[i] - if p == "" { - continue - } - - next := db.child(e, p) - if next == nil { - return nil, fmt.Errorf("Cannot find child for %s", name) - } - e = next - } - return e, nil - -} - -// List all entities by from the name. -// The key will be the full path of the entity. -func (db *Database) List(name string, depth int) Entities { - db.mux.RLock() - defer db.mux.RUnlock() - - out := Entities{} - e, err := db.get(name) - if err != nil { - return out - } - - children, err := db.children(e, name, depth, nil) - if err != nil { - return out - } - - for _, c := range children { - out[c.FullPath] = c.Entity - } - return out -} - -// Walk through the child graph of an entity, calling walkFunc for each child entity. -// It is safe for walkFunc to call graph functions. -func (db *Database) Walk(name string, walkFunc WalkFunc, depth int) error { - children, err := db.Children(name, depth) - if err != nil { - return err - } - - // Note: the database lock must not be held while calling walkFunc - for _, c := range children { - if err := walkFunc(c.FullPath, c.Entity); err != nil { - return err - } - } - return nil -} - -// Children returns the children of the specified entity. -func (db *Database) Children(name string, depth int) ([]WalkMeta, error) { - db.mux.RLock() - defer db.mux.RUnlock() - - e, err := db.get(name) - if err != nil { - return nil, err - } - - return db.children(e, name, depth, nil) -} - -// Parents returns the parents of a specified entity. -func (db *Database) Parents(name string) ([]string, error) { - db.mux.RLock() - defer db.mux.RUnlock() - - e, err := db.get(name) - if err != nil { - return nil, err - } - return db.parents(e) -} - -// Refs returns the reference count for a specified id. -func (db *Database) Refs(id string) int { - db.mux.RLock() - defer db.mux.RUnlock() - - var count int - if err := db.conn.QueryRow("SELECT COUNT(*) FROM edge WHERE entity_id = ?;", id).Scan(&count); err != nil { - return 0 - } - return count -} - -// RefPaths returns all the id's path references. -func (db *Database) RefPaths(id string) Edges { - db.mux.RLock() - defer db.mux.RUnlock() - - refs := Edges{} - - rows, err := db.conn.Query("SELECT name, parent_id FROM edge WHERE entity_id = ?;", id) - if err != nil { - return refs - } - defer rows.Close() - - for rows.Next() { - var name string - var parentID string - if err := rows.Scan(&name, &parentID); err != nil { - return refs - } - refs = append(refs, &Edge{ - EntityID: id, - Name: name, - ParentID: parentID, - }) - } - return refs -} - -// Delete the reference to an entity at a given path. -func (db *Database) Delete(name string) error { - db.mux.Lock() - defer db.mux.Unlock() - - if name == "/" { - return fmt.Errorf("Cannot delete root entity") - } - - parentPath, n := splitPath(name) - parent, err := db.get(parentPath) - if err != nil { - return err - } - - if _, err := db.conn.Exec("DELETE FROM edge WHERE parent_id = ? AND name = ?;", parent.id, n); err != nil { - return err - } - return nil -} - -// Purge removes the entity with the specified id -// Walk the graph to make sure all references to the entity -// are removed and return the number of references removed -func (db *Database) Purge(id string) (int, error) { - db.mux.Lock() - defer db.mux.Unlock() - - tx, err := db.conn.Begin() - if err != nil { - return -1, err - } - - // Delete all edges - rows, err := tx.Exec("DELETE FROM edge WHERE entity_id = ?;", id) - if err != nil { - tx.Rollback() - return -1, err - } - changes, err := rows.RowsAffected() - if err != nil { - return -1, err - } - - // Clear who's using this id as parent - refs, err := tx.Exec("DELETE FROM edge WHERE parent_id = ?;", id) - if err != nil { - tx.Rollback() - return -1, err - } - refsCount, err := refs.RowsAffected() - if err != nil { - return -1, err - } - - // Delete entity - if _, err := tx.Exec("DELETE FROM entity where id = ?;", id); err != nil { - tx.Rollback() - return -1, err - } - - if err := tx.Commit(); err != nil { - return -1, err - } - - return int(changes + refsCount), nil -} - -// Rename an edge for a given path -func (db *Database) Rename(currentName, newName string) error { - db.mux.Lock() - defer db.mux.Unlock() - - parentPath, name := splitPath(currentName) - newParentPath, newEdgeName := splitPath(newName) - - if parentPath != newParentPath { - return fmt.Errorf("Cannot rename when root paths do not match %s != %s", parentPath, newParentPath) - } - - parent, err := db.get(parentPath) - if err != nil { - return err - } - - rows, err := db.conn.Exec("UPDATE edge SET name = ? WHERE parent_id = ? AND name = ?;", newEdgeName, parent.id, name) - if err != nil { - return err - } - i, err := rows.RowsAffected() - if err != nil { - return err - } - if i == 0 { - return fmt.Errorf("Cannot locate edge for %s %s", parent.id, name) - } - return nil -} - -// WalkMeta stores the walk metadata. -type WalkMeta struct { - Parent *Entity - Entity *Entity - FullPath string - Edge *Edge -} - -func (db *Database) children(e *Entity, name string, depth int, entities []WalkMeta) ([]WalkMeta, error) { - if e == nil { - return entities, nil - } - - rows, err := db.conn.Query("SELECT entity_id, name FROM edge where parent_id = ?;", e.id) - if err != nil { - return nil, err - } - defer rows.Close() - - for rows.Next() { - var entityID, entityName string - if err := rows.Scan(&entityID, &entityName); err != nil { - return nil, err - } - child := &Entity{entityID} - edge := &Edge{ - ParentID: e.id, - Name: entityName, - EntityID: child.id, - } - - meta := WalkMeta{ - Parent: e, - Entity: child, - FullPath: path.Join(name, edge.Name), - Edge: edge, - } - - entities = append(entities, meta) - - if depth != 0 { - nDepth := depth - if depth != -1 { - nDepth-- - } - entities, err = db.children(child, meta.FullPath, nDepth, entities) - if err != nil { - return nil, err - } - } - } - - return entities, nil -} - -func (db *Database) parents(e *Entity) (parents []string, err error) { - if e == nil { - return parents, nil - } - - rows, err := db.conn.Query("SELECT parent_id FROM edge where entity_id = ?;", e.id) - if err != nil { - return nil, err - } - defer rows.Close() - - for rows.Next() { - var parentID string - if err := rows.Scan(&parentID); err != nil { - return nil, err - } - parents = append(parents, parentID) - } - - return parents, nil -} - -// Return the entity based on the parent path and name. -func (db *Database) child(parent *Entity, name string) *Entity { - var id string - if err := db.conn.QueryRow("SELECT entity_id FROM edge WHERE parent_id = ? AND name = ?;", parent.id, name).Scan(&id); err != nil { - return nil - } - return &Entity{id} -} - -// ID returns the id used to reference this entity. -func (e *Entity) ID() string { - return e.id -} - -// Paths returns the paths sorted by depth. -func (e Entities) Paths() []string { - out := make([]string, len(e)) - var i int - for k := range e { - out[i] = k - i++ - } - sortByDepth(out) - - return out -} diff --git a/vendor/github.com/docker/docker/pkg/graphdb/graphdb_linux_test.go b/vendor/github.com/docker/docker/pkg/graphdb/graphdb_linux_test.go deleted file mode 100644 index f0fb074b4..000000000 --- a/vendor/github.com/docker/docker/pkg/graphdb/graphdb_linux_test.go +++ /dev/null @@ -1,721 +0,0 @@ -package graphdb - -import ( - "database/sql" - "fmt" - "os" - "path" - "runtime" - "strconv" - "testing" - - _ "github.com/mattn/go-sqlite3" -) - -func newTestDb(t *testing.T) (*Database, string) { - p := path.Join(os.TempDir(), "sqlite.db") - conn, err := sql.Open("sqlite3", p) - db, err := NewDatabase(conn) - if err != nil { - t.Fatal(err) - } - return db, p -} - -func destroyTestDb(dbPath string) { - os.Remove(dbPath) -} - -func TestNewDatabase(t *testing.T) { - db, dbpath := newTestDb(t) - if db == nil { - t.Fatal("Database should not be nil") - } - db.Close() - defer destroyTestDb(dbpath) -} - -func TestCreateRootEntity(t *testing.T) { - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - root := db.RootEntity() - if root == nil { - t.Fatal("Root entity should not be nil") - } -} - -func TestGetRootEntity(t *testing.T) { - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - e := db.Get("/") - if e == nil { - t.Fatal("Entity should not be nil") - } - if e.ID() != "0" { - t.Fatalf("Entity id should be 0, got %s", e.ID()) - } -} - -func TestSetEntityWithDifferentName(t *testing.T) { - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - db.Set("/test", "1") - if _, err := db.Set("/other", "1"); err != nil { - t.Fatal(err) - } -} - -func TestSetDuplicateEntity(t *testing.T) { - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - if _, err := db.Set("/foo", "42"); err != nil { - t.Fatal(err) - } - if _, err := db.Set("/foo", "43"); err == nil { - t.Fatalf("Creating an entry with a duplicate path did not cause an error") - } -} - -func TestCreateChild(t *testing.T) { - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - child, err := db.Set("/db", "1") - if err != nil { - t.Fatal(err) - } - if child == nil { - t.Fatal("Child should not be nil") - } - if child.ID() != "1" { - t.Fail() - } -} - -func TestParents(t *testing.T) { - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - for i := 1; i < 6; i++ { - a := strconv.Itoa(i) - if _, err := db.Set("/"+a, a); err != nil { - t.Fatal(err) - } - } - - for i := 6; i < 11; i++ { - a := strconv.Itoa(i) - p := strconv.Itoa(i - 5) - - key := fmt.Sprintf("/%s/%s", p, a) - - if _, err := db.Set(key, a); err != nil { - t.Fatal(err) - } - - parents, err := db.Parents(key) - if err != nil { - t.Fatal(err) - } - - if len(parents) != 1 { - t.Fatalf("Expected 1 entry for %s got %d", key, len(parents)) - } - - if parents[0] != p { - t.Fatalf("ID %s received, %s expected", parents[0], p) - } - } -} - -func TestChildren(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - str := "/" - for i := 1; i < 6; i++ { - a := strconv.Itoa(i) - if _, err := db.Set(str+a, a); err != nil { - t.Fatal(err) - } - - str = str + a + "/" - } - - str = "/" - for i := 10; i < 30; i++ { // 20 entities - a := strconv.Itoa(i) - if _, err := db.Set(str+a, a); err != nil { - t.Fatal(err) - } - - str = str + a + "/" - } - entries, err := db.Children("/", 5) - if err != nil { - t.Fatal(err) - } - - if len(entries) != 11 { - t.Fatalf("Expect 11 entries for / got %d", len(entries)) - } - - entries, err = db.Children("/", 20) - if err != nil { - t.Fatal(err) - } - - if len(entries) != 25 { - t.Fatalf("Expect 25 entries for / got %d", len(entries)) - } -} - -func TestListAllRootChildren(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - for i := 1; i < 6; i++ { - a := strconv.Itoa(i) - if _, err := db.Set("/"+a, a); err != nil { - t.Fatal(err) - } - } - entries := db.List("/", -1) - if len(entries) != 5 { - t.Fatalf("Expect 5 entries for / got %d", len(entries)) - } -} - -func TestListAllSubChildren(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - _, err := db.Set("/webapp", "1") - if err != nil { - t.Fatal(err) - } - child2, err := db.Set("/db", "2") - if err != nil { - t.Fatal(err) - } - child4, err := db.Set("/logs", "4") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/db/logs", child4.ID()); err != nil { - t.Fatal(err) - } - - child3, err := db.Set("/sentry", "3") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/sentry", child3.ID()); err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/db", child2.ID()); err != nil { - t.Fatal(err) - } - - entries := db.List("/webapp", 1) - if len(entries) != 3 { - t.Fatalf("Expect 3 entries for / got %d", len(entries)) - } - - entries = db.List("/webapp", 0) - if len(entries) != 2 { - t.Fatalf("Expect 2 entries for / got %d", len(entries)) - } -} - -func TestAddSelfAsChild(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - child, err := db.Set("/test", "1") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/test/other", child.ID()); err == nil { - t.Fatal("Error should not be nil") - } -} - -func TestAddChildToNonExistentRoot(t *testing.T) { - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - if _, err := db.Set("/myapp", "1"); err != nil { - t.Fatal(err) - } - - if _, err := db.Set("/myapp/proxy/db", "2"); err == nil { - t.Fatal("Error should not be nil") - } -} - -func TestWalkAll(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - _, err := db.Set("/webapp", "1") - if err != nil { - t.Fatal(err) - } - child2, err := db.Set("/db", "2") - if err != nil { - t.Fatal(err) - } - child4, err := db.Set("/db/logs", "4") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/logs", child4.ID()); err != nil { - t.Fatal(err) - } - - child3, err := db.Set("/sentry", "3") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/sentry", child3.ID()); err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/db", child2.ID()); err != nil { - t.Fatal(err) - } - - child5, err := db.Set("/gograph", "5") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/same-ref-diff-name", child5.ID()); err != nil { - t.Fatal(err) - } - - if err := db.Walk("/", func(p string, e *Entity) error { - t.Logf("Path: %s Entity: %s", p, e.ID()) - return nil - }, -1); err != nil { - t.Fatal(err) - } -} - -func TestGetEntityByPath(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - _, err := db.Set("/webapp", "1") - if err != nil { - t.Fatal(err) - } - child2, err := db.Set("/db", "2") - if err != nil { - t.Fatal(err) - } - child4, err := db.Set("/logs", "4") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/db/logs", child4.ID()); err != nil { - t.Fatal(err) - } - - child3, err := db.Set("/sentry", "3") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/sentry", child3.ID()); err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/db", child2.ID()); err != nil { - t.Fatal(err) - } - - child5, err := db.Set("/gograph", "5") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/same-ref-diff-name", child5.ID()); err != nil { - t.Fatal(err) - } - - entity := db.Get("/webapp/db/logs") - if entity == nil { - t.Fatal("Entity should not be nil") - } - if entity.ID() != "4" { - t.Fatalf("Expected to get entity with id 4, got %s", entity.ID()) - } -} - -func TestEnitiesPaths(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - _, err := db.Set("/webapp", "1") - if err != nil { - t.Fatal(err) - } - child2, err := db.Set("/db", "2") - if err != nil { - t.Fatal(err) - } - child4, err := db.Set("/logs", "4") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/db/logs", child4.ID()); err != nil { - t.Fatal(err) - } - - child3, err := db.Set("/sentry", "3") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/sentry", child3.ID()); err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/db", child2.ID()); err != nil { - t.Fatal(err) - } - - child5, err := db.Set("/gograph", "5") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/same-ref-diff-name", child5.ID()); err != nil { - t.Fatal(err) - } - - out := db.List("/", -1) - for _, p := range out.Paths() { - t.Log(p) - } -} - -func TestDeleteRootEntity(t *testing.T) { - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - if err := db.Delete("/"); err == nil { - t.Fatal("Error should not be nil") - } -} - -func TestDeleteEntity(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - _, err := db.Set("/webapp", "1") - if err != nil { - t.Fatal(err) - } - child2, err := db.Set("/db", "2") - if err != nil { - t.Fatal(err) - } - child4, err := db.Set("/logs", "4") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/db/logs", child4.ID()); err != nil { - t.Fatal(err) - } - - child3, err := db.Set("/sentry", "3") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/sentry", child3.ID()); err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/db", child2.ID()); err != nil { - t.Fatal(err) - } - - child5, err := db.Set("/gograph", "5") - if err != nil { - t.Fatal(err) - } - if _, err := db.Set("/webapp/same-ref-diff-name", child5.ID()); err != nil { - t.Fatal(err) - } - - if err := db.Delete("/webapp/sentry"); err != nil { - t.Fatal(err) - } - entity := db.Get("/webapp/sentry") - if entity != nil { - t.Fatal("Entity /webapp/sentry should be nil") - } -} - -func TestCountRefs(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - db.Set("/webapp", "1") - - if db.Refs("1") != 1 { - t.Fatal("Expect reference count to be 1") - } - - db.Set("/db", "2") - db.Set("/webapp/db", "2") - if db.Refs("2") != 2 { - t.Fatal("Expect reference count to be 2") - } -} - -func TestPurgeId(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - db.Set("/webapp", "1") - - if c := db.Refs("1"); c != 1 { - t.Fatalf("Expect reference count to be 1, got %d", c) - } - - db.Set("/db", "2") - db.Set("/webapp/db", "2") - - count, err := db.Purge("2") - if err != nil { - t.Fatal(err) - } - if count != 2 { - t.Fatalf("Expected 2 references to be removed, got %d", count) - } -} - -// Regression test https://github.com/docker/docker/issues/12334 -func TestPurgeIdRefPaths(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - db.Set("/webapp", "1") - db.Set("/db", "2") - - db.Set("/db/webapp", "1") - - if c := db.Refs("1"); c != 2 { - t.Fatalf("Expected 2 reference for webapp, got %d", c) - } - if c := db.Refs("2"); c != 1 { - t.Fatalf("Expected 1 reference for db, got %d", c) - } - - if rp := db.RefPaths("2"); len(rp) != 1 { - t.Fatalf("Expected 1 reference path for db, got %d", len(rp)) - } - - count, err := db.Purge("2") - if err != nil { - t.Fatal(err) - } - - if count != 2 { - t.Fatalf("Expected 2 rows to be removed, got %d", count) - } - - if c := db.Refs("2"); c != 0 { - t.Fatalf("Expected 0 reference for db, got %d", c) - } - if c := db.Refs("1"); c != 1 { - t.Fatalf("Expected 1 reference for webapp, got %d", c) - } -} - -func TestRename(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - db.Set("/webapp", "1") - - if db.Refs("1") != 1 { - t.Fatal("Expect reference count to be 1") - } - - db.Set("/db", "2") - db.Set("/webapp/db", "2") - - if db.Get("/webapp/db") == nil { - t.Fatal("Cannot find entity at path /webapp/db") - } - - if err := db.Rename("/webapp/db", "/webapp/newdb"); err != nil { - t.Fatal(err) - } - if db.Get("/webapp/db") != nil { - t.Fatal("Entity should not exist at /webapp/db") - } - if db.Get("/webapp/newdb") == nil { - t.Fatal("Cannot find entity at path /webapp/newdb") - } - -} - -func TestCreateMultipleNames(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - db.Set("/db", "1") - if _, err := db.Set("/myapp", "1"); err != nil { - t.Fatal(err) - } - - db.Walk("/", func(p string, e *Entity) error { - t.Logf("%s\n", p) - return nil - }, -1) -} - -func TestRefPaths(t *testing.T) { - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - db.Set("/webapp", "1") - - db.Set("/db", "2") - db.Set("/webapp/db", "2") - - refs := db.RefPaths("2") - if len(refs) != 2 { - t.Fatalf("Expected reference count to be 2, got %d", len(refs)) - } -} - -func TestExistsTrue(t *testing.T) { - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - db.Set("/testing", "1") - - if !db.Exists("/testing") { - t.Fatalf("/tesing should exist") - } -} - -func TestExistsFalse(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - db.Set("/toerhe", "1") - - if db.Exists("/testing") { - t.Fatalf("/tesing should not exist") - } - -} - -func TestGetNameWithTrailingSlash(t *testing.T) { - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - db.Set("/todo", "1") - - e := db.Get("/todo/") - if e == nil { - t.Fatalf("Entity should not be nil") - } -} - -func TestConcurrentWrites(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - db, dbpath := newTestDb(t) - defer destroyTestDb(dbpath) - - errs := make(chan error, 2) - - save := func(name string, id string) { - if _, err := db.Set(fmt.Sprintf("/%s", name), id); err != nil { - errs <- err - } - errs <- nil - } - purge := func(id string) { - if _, err := db.Purge(id); err != nil { - errs <- err - } - errs <- nil - } - - save("/1", "1") - - go purge("1") - go save("/2", "2") - - any := false - for i := 0; i < 2; i++ { - if err := <-errs; err != nil { - any = true - t.Log(err) - } - } - if any { - t.Fail() - } -} diff --git a/vendor/github.com/docker/docker/pkg/graphdb/sort_linux.go b/vendor/github.com/docker/docker/pkg/graphdb/sort_linux.go deleted file mode 100644 index c07df077d..000000000 --- a/vendor/github.com/docker/docker/pkg/graphdb/sort_linux.go +++ /dev/null @@ -1,27 +0,0 @@ -package graphdb - -import "sort" - -type pathSorter struct { - paths []string - by func(i, j string) bool -} - -func sortByDepth(paths []string) { - s := &pathSorter{paths, func(i, j string) bool { - return PathDepth(i) > PathDepth(j) - }} - sort.Sort(s) -} - -func (s *pathSorter) Len() int { - return len(s.paths) -} - -func (s *pathSorter) Swap(i, j int) { - s.paths[i], s.paths[j] = s.paths[j], s.paths[i] -} - -func (s *pathSorter) Less(i, j int) bool { - return s.by(s.paths[i], s.paths[j]) -} diff --git a/vendor/github.com/docker/docker/pkg/graphdb/sort_linux_test.go b/vendor/github.com/docker/docker/pkg/graphdb/sort_linux_test.go deleted file mode 100644 index ddf2266f6..000000000 --- a/vendor/github.com/docker/docker/pkg/graphdb/sort_linux_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package graphdb - -import ( - "testing" -) - -func TestSort(t *testing.T) { - paths := []string{ - "/", - "/myreallylongname", - "/app/db", - } - - sortByDepth(paths) - - if len(paths) != 3 { - t.Fatalf("Expected 3 parts got %d", len(paths)) - } - - if paths[0] != "/app/db" { - t.Fatalf("Expected /app/db got %s", paths[0]) - } - if paths[1] != "/myreallylongname" { - t.Fatalf("Expected /myreallylongname got %s", paths[1]) - } - if paths[2] != "/" { - t.Fatalf("Expected / got %s", paths[2]) - } -} diff --git a/vendor/github.com/docker/docker/pkg/graphdb/unsupported.go b/vendor/github.com/docker/docker/pkg/graphdb/unsupported.go deleted file mode 100644 index 2b8ba7172..000000000 --- a/vendor/github.com/docker/docker/pkg/graphdb/unsupported.go +++ /dev/null @@ -1,3 +0,0 @@ -// +build !cgo !linux - -package graphdb diff --git a/vendor/github.com/docker/docker/pkg/graphdb/utils_linux.go b/vendor/github.com/docker/docker/pkg/graphdb/utils_linux.go deleted file mode 100644 index 9edd79c35..000000000 --- a/vendor/github.com/docker/docker/pkg/graphdb/utils_linux.go +++ /dev/null @@ -1,32 +0,0 @@ -package graphdb - -import ( - "path" - "strings" -) - -// Split p on / -func split(p string) []string { - return strings.Split(p, "/") -} - -// PathDepth returns the depth or number of / in a given path -func PathDepth(p string) int { - parts := split(p) - if len(parts) == 2 && parts[1] == "" { - return 1 - } - return len(parts) -} - -func splitPath(p string) (parent, name string) { - if p[0] != '/' { - p = "/" + p - } - parent, name = path.Split(p) - l := len(parent) - if parent[l-1] == '/' { - parent = parent[:l-1] - } - return -} diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir.go b/vendor/github.com/docker/docker/pkg/homedir/homedir.go deleted file mode 100644 index 8154e83f0..000000000 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir.go +++ /dev/null @@ -1,39 +0,0 @@ -package homedir - -import ( - "os" - "runtime" - - "github.com/opencontainers/runc/libcontainer/user" -) - -// Key returns the env var name for the user's home dir based on -// the platform being run on -func Key() string { - if runtime.GOOS == "windows" { - return "USERPROFILE" - } - return "HOME" -} - -// Get returns the home directory of the current user with the help of -// environment variables depending on the target operating system. -// Returned path should be used with "path/filepath" to form new paths. -func Get() string { - home := os.Getenv(Key()) - if home == "" && runtime.GOOS != "windows" { - if u, err := user.CurrentUser(); err == nil { - return u.Home - } - } - return home -} - -// GetShortcutString returns the string that is shortcut to user's home directory -// in the native shell of the platform running on. -func GetShortcutString() string { - if runtime.GOOS == "windows" { - return "%USERPROFILE%" // be careful while using in format functions - } - return "~" -} diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_test.go b/vendor/github.com/docker/docker/pkg/homedir/homedir_test.go deleted file mode 100644 index 7a95cb2bd..000000000 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package homedir - -import ( - "path/filepath" - "testing" -) - -func TestGet(t *testing.T) { - home := Get() - if home == "" { - t.Fatal("returned home directory is empty") - } - - if !filepath.IsAbs(home) { - t.Fatalf("returned path is not absolute: %s", home) - } -} - -func TestGetShortcutString(t *testing.T) { - shortcut := GetShortcutString() - if shortcut == "" { - t.Fatal("returned shortcut string is empty") - } -} diff --git a/vendor/github.com/docker/docker/pkg/httputils/httputils.go b/vendor/github.com/docker/docker/pkg/httputils/httputils.go deleted file mode 100644 index d7dc43877..000000000 --- a/vendor/github.com/docker/docker/pkg/httputils/httputils.go +++ /dev/null @@ -1,56 +0,0 @@ -package httputils - -import ( - "errors" - "fmt" - "net/http" - "regexp" - "strings" - - "github.com/docker/docker/pkg/jsonmessage" -) - -var ( - headerRegexp = regexp.MustCompile(`^(?:(.+)/(.+?))\((.+)\).*$`) - errInvalidHeader = errors.New("Bad header, should be in format `docker/version (platform)`") -) - -// Download requests a given URL and returns an io.Reader. -func Download(url string) (resp *http.Response, err error) { - if resp, err = http.Get(url); err != nil { - return nil, err - } - if resp.StatusCode >= 400 { - return nil, fmt.Errorf("Got HTTP status code >= 400: %s", resp.Status) - } - return resp, nil -} - -// NewHTTPRequestError returns a JSON response error. -func NewHTTPRequestError(msg string, res *http.Response) error { - return &jsonmessage.JSONError{ - Message: msg, - Code: res.StatusCode, - } -} - -// ServerHeader contains the server information. -type ServerHeader struct { - App string // docker - Ver string // 1.8.0-dev - OS string // windows or linux -} - -// ParseServerHeader extracts pieces from an HTTP server header -// which is in the format "docker/version (os)" eg docker/1.8.0-dev (windows). -func ParseServerHeader(hdr string) (*ServerHeader, error) { - matches := headerRegexp.FindStringSubmatch(hdr) - if len(matches) != 4 { - return nil, errInvalidHeader - } - return &ServerHeader{ - App: strings.TrimSpace(matches[1]), - Ver: strings.TrimSpace(matches[2]), - OS: strings.TrimSpace(matches[3]), - }, nil -} diff --git a/vendor/github.com/docker/docker/pkg/httputils/httputils_test.go b/vendor/github.com/docker/docker/pkg/httputils/httputils_test.go deleted file mode 100644 index d35d08215..000000000 --- a/vendor/github.com/docker/docker/pkg/httputils/httputils_test.go +++ /dev/null @@ -1,115 +0,0 @@ -package httputils - -import ( - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "strings" - "testing" -) - -func TestDownload(t *testing.T) { - expected := "Hello, docker !" - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, expected) - })) - defer ts.Close() - response, err := Download(ts.URL) - if err != nil { - t.Fatal(err) - } - - actual, err := ioutil.ReadAll(response.Body) - response.Body.Close() - - if err != nil || string(actual) != expected { - t.Fatalf("Expected the response %q, got err:%v, response:%v, actual:%s", expected, err, response, string(actual)) - } -} - -func TestDownload400Errors(t *testing.T) { - expectedError := "Got HTTP status code >= 400: 403 Forbidden" - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // 403 - http.Error(w, "something failed (forbidden)", http.StatusForbidden) - })) - defer ts.Close() - // Expected status code = 403 - if _, err := Download(ts.URL); err == nil || err.Error() != expectedError { - t.Fatalf("Expected the the error %q, got %v", expectedError, err) - } -} - -func TestDownloadOtherErrors(t *testing.T) { - if _, err := Download("I'm not an url.."); err == nil || !strings.Contains(err.Error(), "unsupported protocol scheme") { - t.Fatalf("Expected an error with 'unsupported protocol scheme', got %v", err) - } -} - -func TestNewHTTPRequestError(t *testing.T) { - errorMessage := "Some error message" - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // 403 - http.Error(w, errorMessage, http.StatusForbidden) - })) - defer ts.Close() - httpResponse, err := http.Get(ts.URL) - if err != nil { - t.Fatal(err) - } - if err := NewHTTPRequestError(errorMessage, httpResponse); err.Error() != errorMessage { - t.Fatalf("Expected err to be %q, got %v", errorMessage, err) - } -} - -func TestParseServerHeader(t *testing.T) { - inputs := map[string][]string{ - "bad header": {"error"}, - "(bad header)": {"error"}, - "(without/spaces)": {"error"}, - "(header/with spaces)": {"error"}, - "foo/bar (baz)": {"foo", "bar", "baz"}, - "foo/bar": {"error"}, - "foo": {"error"}, - "foo/bar (baz space)": {"foo", "bar", "baz space"}, - " f f / b b ( b s ) ": {"f f", "b b", "b s"}, - "foo/bar (baz) ignore": {"foo", "bar", "baz"}, - "foo/bar ()": {"error"}, - "foo/bar()": {"error"}, - "foo/bar(baz)": {"foo", "bar", "baz"}, - "foo/bar/zzz(baz)": {"foo/bar", "zzz", "baz"}, - "foo/bar(baz/abc)": {"foo", "bar", "baz/abc"}, - "foo/bar(baz (abc))": {"foo", "bar", "baz (abc)"}, - } - - for header, values := range inputs { - serverHeader, err := ParseServerHeader(header) - if err != nil { - if err != errInvalidHeader { - t.Fatalf("Failed to parse %q, and got some unexpected error: %q", header, err) - } - if values[0] == "error" { - continue - } - t.Fatalf("Header %q failed to parse when it shouldn't have", header) - } - if values[0] == "error" { - t.Fatalf("Header %q parsed ok when it should have failed(%q).", header, serverHeader) - } - - if serverHeader.App != values[0] { - t.Fatalf("Expected serverHeader.App for %q to equal %q, got %q", header, values[0], serverHeader.App) - } - - if serverHeader.Ver != values[1] { - t.Fatalf("Expected serverHeader.Ver for %q to equal %q, got %q", header, values[1], serverHeader.Ver) - } - - if serverHeader.OS != values[2] { - t.Fatalf("Expected serverHeader.OS for %q to equal %q, got %q", header, values[2], serverHeader.OS) - } - - } - -} diff --git a/vendor/github.com/docker/docker/pkg/httputils/mimetype.go b/vendor/github.com/docker/docker/pkg/httputils/mimetype.go deleted file mode 100644 index d5cf34e4f..000000000 --- a/vendor/github.com/docker/docker/pkg/httputils/mimetype.go +++ /dev/null @@ -1,30 +0,0 @@ -package httputils - -import ( - "mime" - "net/http" -) - -// MimeTypes stores the MIME content type. -var MimeTypes = struct { - TextPlain string - Tar string - OctetStream string -}{"text/plain", "application/tar", "application/octet-stream"} - -// DetectContentType returns a best guess representation of the MIME -// content type for the bytes at c. The value detected by -// http.DetectContentType is guaranteed not be nil, defaulting to -// application/octet-stream when a better guess cannot be made. The -// result of this detection is then run through mime.ParseMediaType() -// which separates the actual MIME string from any parameters. -func DetectContentType(c []byte) (string, map[string]string, error) { - - ct := http.DetectContentType(c) - contentType, args, err := mime.ParseMediaType(ct) - if err != nil { - return "", nil, err - } - - return contentType, args, nil -} diff --git a/vendor/github.com/docker/docker/pkg/httputils/mimetype_test.go b/vendor/github.com/docker/docker/pkg/httputils/mimetype_test.go deleted file mode 100644 index 9de433ee8..000000000 --- a/vendor/github.com/docker/docker/pkg/httputils/mimetype_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package httputils - -import ( - "testing" -) - -func TestDetectContentType(t *testing.T) { - input := []byte("That is just a plain text") - - if contentType, _, err := DetectContentType(input); err != nil || contentType != "text/plain" { - t.Errorf("TestDetectContentType failed") - } -} diff --git a/vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader.go b/vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader.go deleted file mode 100644 index bebc8608c..000000000 --- a/vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader.go +++ /dev/null @@ -1,95 +0,0 @@ -package httputils - -import ( - "fmt" - "io" - "net/http" - "time" - - "github.com/Sirupsen/logrus" -) - -type resumableRequestReader struct { - client *http.Client - request *http.Request - lastRange int64 - totalSize int64 - currentResponse *http.Response - failures uint32 - maxFailures uint32 -} - -// ResumableRequestReader makes it possible to resume reading a request's body transparently -// maxfail is the number of times we retry to make requests again (not resumes) -// totalsize is the total length of the body; auto detect if not provided -func ResumableRequestReader(c *http.Client, r *http.Request, maxfail uint32, totalsize int64) io.ReadCloser { - return &resumableRequestReader{client: c, request: r, maxFailures: maxfail, totalSize: totalsize} -} - -// ResumableRequestReaderWithInitialResponse makes it possible to resume -// reading the body of an already initiated request. -func ResumableRequestReaderWithInitialResponse(c *http.Client, r *http.Request, maxfail uint32, totalsize int64, initialResponse *http.Response) io.ReadCloser { - return &resumableRequestReader{client: c, request: r, maxFailures: maxfail, totalSize: totalsize, currentResponse: initialResponse} -} - -func (r *resumableRequestReader) Read(p []byte) (n int, err error) { - if r.client == nil || r.request == nil { - return 0, fmt.Errorf("client and request can't be nil\n") - } - isFreshRequest := false - if r.lastRange != 0 && r.currentResponse == nil { - readRange := fmt.Sprintf("bytes=%d-%d", r.lastRange, r.totalSize) - r.request.Header.Set("Range", readRange) - time.Sleep(5 * time.Second) - } - if r.currentResponse == nil { - r.currentResponse, err = r.client.Do(r.request) - isFreshRequest = true - } - if err != nil && r.failures+1 != r.maxFailures { - r.cleanUpResponse() - r.failures++ - time.Sleep(5 * time.Duration(r.failures) * time.Second) - return 0, nil - } else if err != nil { - r.cleanUpResponse() - return 0, err - } - if r.currentResponse.StatusCode == 416 && r.lastRange == r.totalSize && r.currentResponse.ContentLength == 0 { - r.cleanUpResponse() - return 0, io.EOF - } else if r.currentResponse.StatusCode != 206 && r.lastRange != 0 && isFreshRequest { - r.cleanUpResponse() - return 0, fmt.Errorf("the server doesn't support byte ranges") - } - if r.totalSize == 0 { - r.totalSize = r.currentResponse.ContentLength - } else if r.totalSize <= 0 { - r.cleanUpResponse() - return 0, fmt.Errorf("failed to auto detect content length") - } - n, err = r.currentResponse.Body.Read(p) - r.lastRange += int64(n) - if err != nil { - r.cleanUpResponse() - } - if err != nil && err != io.EOF { - logrus.Infof("encountered error during pull and clearing it before resume: %s", err) - err = nil - } - return n, err -} - -func (r *resumableRequestReader) Close() error { - r.cleanUpResponse() - r.client = nil - r.request = nil - return nil -} - -func (r *resumableRequestReader) cleanUpResponse() { - if r.currentResponse != nil { - r.currentResponse.Body.Close() - r.currentResponse = nil - } -} diff --git a/vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader_test.go b/vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader_test.go deleted file mode 100644 index 5a2906db7..000000000 --- a/vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader_test.go +++ /dev/null @@ -1,307 +0,0 @@ -package httputils - -import ( - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "strings" - "testing" -) - -func TestResumableRequestHeaderSimpleErrors(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, "Hello, world !") - })) - defer ts.Close() - - client := &http.Client{} - - var req *http.Request - req, err := http.NewRequest("GET", ts.URL, nil) - if err != nil { - t.Fatal(err) - } - - expectedError := "client and request can't be nil\n" - resreq := &resumableRequestReader{} - _, err = resreq.Read([]byte{}) - if err == nil || err.Error() != expectedError { - t.Fatalf("Expected an error with '%s', got %v.", expectedError, err) - } - - resreq = &resumableRequestReader{ - client: client, - request: req, - totalSize: -1, - } - expectedError = "failed to auto detect content length" - _, err = resreq.Read([]byte{}) - if err == nil || err.Error() != expectedError { - t.Fatalf("Expected an error with '%s', got %v.", expectedError, err) - } - -} - -// Not too much failures, bails out after some wait -func TestResumableRequestHeaderNotTooMuchFailures(t *testing.T) { - client := &http.Client{} - - var badReq *http.Request - badReq, err := http.NewRequest("GET", "I'm not an url", nil) - if err != nil { - t.Fatal(err) - } - - resreq := &resumableRequestReader{ - client: client, - request: badReq, - failures: 0, - maxFailures: 2, - } - read, err := resreq.Read([]byte{}) - if err != nil || read != 0 { - t.Fatalf("Expected no error and no byte read, got err:%v, read:%v.", err, read) - } -} - -// Too much failures, returns the error -func TestResumableRequestHeaderTooMuchFailures(t *testing.T) { - client := &http.Client{} - - var badReq *http.Request - badReq, err := http.NewRequest("GET", "I'm not an url", nil) - if err != nil { - t.Fatal(err) - } - - resreq := &resumableRequestReader{ - client: client, - request: badReq, - failures: 0, - maxFailures: 1, - } - defer resreq.Close() - - expectedError := `Get I%27m%20not%20an%20url: unsupported protocol scheme ""` - read, err := resreq.Read([]byte{}) - if err == nil || err.Error() != expectedError || read != 0 { - t.Fatalf("Expected the error '%s', got err:%v, read:%v.", expectedError, err, read) - } -} - -type errorReaderCloser struct{} - -func (errorReaderCloser) Close() error { return nil } - -func (errorReaderCloser) Read(p []byte) (n int, err error) { - return 0, fmt.Errorf("An error occurred") -} - -// If an unknown error is encountered, return 0, nil and log it -func TestResumableRequestReaderWithReadError(t *testing.T) { - var req *http.Request - req, err := http.NewRequest("GET", "", nil) - if err != nil { - t.Fatal(err) - } - - client := &http.Client{} - - response := &http.Response{ - Status: "500 Internal Server", - StatusCode: 500, - ContentLength: 0, - Close: true, - Body: errorReaderCloser{}, - } - - resreq := &resumableRequestReader{ - client: client, - request: req, - currentResponse: response, - lastRange: 1, - totalSize: 1, - } - defer resreq.Close() - - buf := make([]byte, 1) - read, err := resreq.Read(buf) - if err != nil { - t.Fatal(err) - } - - if read != 0 { - t.Fatalf("Expected to have read nothing, but read %v", read) - } -} - -func TestResumableRequestReaderWithEOFWith416Response(t *testing.T) { - var req *http.Request - req, err := http.NewRequest("GET", "", nil) - if err != nil { - t.Fatal(err) - } - - client := &http.Client{} - - response := &http.Response{ - Status: "416 Requested Range Not Satisfiable", - StatusCode: 416, - ContentLength: 0, - Close: true, - Body: ioutil.NopCloser(strings.NewReader("")), - } - - resreq := &resumableRequestReader{ - client: client, - request: req, - currentResponse: response, - lastRange: 1, - totalSize: 1, - } - defer resreq.Close() - - buf := make([]byte, 1) - _, err = resreq.Read(buf) - if err == nil || err != io.EOF { - t.Fatalf("Expected an io.EOF error, got %v", err) - } -} - -func TestResumableRequestReaderWithServerDoesntSupportByteRanges(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("Range") == "" { - t.Fatalf("Expected a Range HTTP header, got nothing") - } - })) - defer ts.Close() - - var req *http.Request - req, err := http.NewRequest("GET", ts.URL, nil) - if err != nil { - t.Fatal(err) - } - - client := &http.Client{} - - resreq := &resumableRequestReader{ - client: client, - request: req, - lastRange: 1, - } - defer resreq.Close() - - buf := make([]byte, 2) - _, err = resreq.Read(buf) - if err == nil || err.Error() != "the server doesn't support byte ranges" { - t.Fatalf("Expected an error 'the server doesn't support byte ranges', got %v", err) - } -} - -func TestResumableRequestReaderWithZeroTotalSize(t *testing.T) { - - srvtxt := "some response text data" - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, srvtxt) - })) - defer ts.Close() - - var req *http.Request - req, err := http.NewRequest("GET", ts.URL, nil) - if err != nil { - t.Fatal(err) - } - - client := &http.Client{} - retries := uint32(5) - - resreq := ResumableRequestReader(client, req, retries, 0) - defer resreq.Close() - - data, err := ioutil.ReadAll(resreq) - if err != nil { - t.Fatal(err) - } - - resstr := strings.TrimSuffix(string(data), "\n") - - if resstr != srvtxt { - t.Errorf("resstr != srvtxt") - } -} - -func TestResumableRequestReader(t *testing.T) { - - srvtxt := "some response text data" - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, srvtxt) - })) - defer ts.Close() - - var req *http.Request - req, err := http.NewRequest("GET", ts.URL, nil) - if err != nil { - t.Fatal(err) - } - - client := &http.Client{} - retries := uint32(5) - imgSize := int64(len(srvtxt)) - - resreq := ResumableRequestReader(client, req, retries, imgSize) - defer resreq.Close() - - data, err := ioutil.ReadAll(resreq) - if err != nil { - t.Fatal(err) - } - - resstr := strings.TrimSuffix(string(data), "\n") - - if resstr != srvtxt { - t.Errorf("resstr != srvtxt") - } -} - -func TestResumableRequestReaderWithInitialResponse(t *testing.T) { - - srvtxt := "some response text data" - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, srvtxt) - })) - defer ts.Close() - - var req *http.Request - req, err := http.NewRequest("GET", ts.URL, nil) - if err != nil { - t.Fatal(err) - } - - client := &http.Client{} - retries := uint32(5) - imgSize := int64(len(srvtxt)) - - res, err := client.Do(req) - if err != nil { - t.Fatal(err) - } - - resreq := ResumableRequestReaderWithInitialResponse(client, req, retries, imgSize, res) - defer resreq.Close() - - data, err := ioutil.ReadAll(resreq) - if err != nil { - t.Fatal(err) - } - - resstr := strings.TrimSuffix(string(data), "\n") - - if resstr != srvtxt { - t.Errorf("resstr != srvtxt") - } -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools.go b/vendor/github.com/docker/docker/pkg/idtools/idtools.go deleted file mode 100644 index 6bca46628..000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools.go +++ /dev/null @@ -1,197 +0,0 @@ -package idtools - -import ( - "bufio" - "fmt" - "os" - "sort" - "strconv" - "strings" -) - -// IDMap contains a single entry for user namespace range remapping. An array -// of IDMap entries represents the structure that will be provided to the Linux -// kernel for creating a user namespace. -type IDMap struct { - ContainerID int `json:"container_id"` - HostID int `json:"host_id"` - Size int `json:"size"` -} - -type subIDRange struct { - Start int - Length int -} - -type ranges []subIDRange - -func (e ranges) Len() int { return len(e) } -func (e ranges) Swap(i, j int) { e[i], e[j] = e[j], e[i] } -func (e ranges) Less(i, j int) bool { return e[i].Start < e[j].Start } - -const ( - subuidFileName string = "/etc/subuid" - subgidFileName string = "/etc/subgid" -) - -// MkdirAllAs creates a directory (include any along the path) and then modifies -// ownership to the requested uid/gid. If the directory already exists, this -// function will still change ownership to the requested uid/gid pair. -func MkdirAllAs(path string, mode os.FileMode, ownerUID, ownerGID int) error { - return mkdirAs(path, mode, ownerUID, ownerGID, true, true) -} - -// MkdirAllNewAs creates a directory (include any along the path) and then modifies -// ownership ONLY of newly created directories to the requested uid/gid. If the -// directories along the path exist, no change of ownership will be performed -func MkdirAllNewAs(path string, mode os.FileMode, ownerUID, ownerGID int) error { - return mkdirAs(path, mode, ownerUID, ownerGID, true, false) -} - -// MkdirAs creates a directory and then modifies ownership to the requested uid/gid. -// If the directory already exists, this function still changes ownership -func MkdirAs(path string, mode os.FileMode, ownerUID, ownerGID int) error { - return mkdirAs(path, mode, ownerUID, ownerGID, false, true) -} - -// GetRootUIDGID retrieves the remapped root uid/gid pair from the set of maps. -// If the maps are empty, then the root uid/gid will default to "real" 0/0 -func GetRootUIDGID(uidMap, gidMap []IDMap) (int, int, error) { - var uid, gid int - - if uidMap != nil { - xUID, err := ToHost(0, uidMap) - if err != nil { - return -1, -1, err - } - uid = xUID - } - if gidMap != nil { - xGID, err := ToHost(0, gidMap) - if err != nil { - return -1, -1, err - } - gid = xGID - } - return uid, gid, nil -} - -// ToContainer takes an id mapping, and uses it to translate a -// host ID to the remapped ID. If no map is provided, then the translation -// assumes a 1-to-1 mapping and returns the passed in id -func ToContainer(hostID int, idMap []IDMap) (int, error) { - if idMap == nil { - return hostID, nil - } - for _, m := range idMap { - if (hostID >= m.HostID) && (hostID <= (m.HostID + m.Size - 1)) { - contID := m.ContainerID + (hostID - m.HostID) - return contID, nil - } - } - return -1, fmt.Errorf("Host ID %d cannot be mapped to a container ID", hostID) -} - -// ToHost takes an id mapping and a remapped ID, and translates the -// ID to the mapped host ID. If no map is provided, then the translation -// assumes a 1-to-1 mapping and returns the passed in id # -func ToHost(contID int, idMap []IDMap) (int, error) { - if idMap == nil { - return contID, nil - } - for _, m := range idMap { - if (contID >= m.ContainerID) && (contID <= (m.ContainerID + m.Size - 1)) { - hostID := m.HostID + (contID - m.ContainerID) - return hostID, nil - } - } - return -1, fmt.Errorf("Container ID %d cannot be mapped to a host ID", contID) -} - -// CreateIDMappings takes a requested user and group name and -// using the data from /etc/sub{uid,gid} ranges, creates the -// proper uid and gid remapping ranges for that user/group pair -func CreateIDMappings(username, groupname string) ([]IDMap, []IDMap, error) { - subuidRanges, err := parseSubuid(username) - if err != nil { - return nil, nil, err - } - subgidRanges, err := parseSubgid(groupname) - if err != nil { - return nil, nil, err - } - if len(subuidRanges) == 0 { - return nil, nil, fmt.Errorf("No subuid ranges found for user %q", username) - } - if len(subgidRanges) == 0 { - return nil, nil, fmt.Errorf("No subgid ranges found for group %q", groupname) - } - - return createIDMap(subuidRanges), createIDMap(subgidRanges), nil -} - -func createIDMap(subidRanges ranges) []IDMap { - idMap := []IDMap{} - - // sort the ranges by lowest ID first - sort.Sort(subidRanges) - containerID := 0 - for _, idrange := range subidRanges { - idMap = append(idMap, IDMap{ - ContainerID: containerID, - HostID: idrange.Start, - Size: idrange.Length, - }) - containerID = containerID + idrange.Length - } - return idMap -} - -func parseSubuid(username string) (ranges, error) { - return parseSubidFile(subuidFileName, username) -} - -func parseSubgid(username string) (ranges, error) { - return parseSubidFile(subgidFileName, username) -} - -// parseSubidFile will read the appropriate file (/etc/subuid or /etc/subgid) -// and return all found ranges for a specified username. If the special value -// "ALL" is supplied for username, then all ranges in the file will be returned -func parseSubidFile(path, username string) (ranges, error) { - var rangeList ranges - - subidFile, err := os.Open(path) - if err != nil { - return rangeList, err - } - defer subidFile.Close() - - s := bufio.NewScanner(subidFile) - for s.Scan() { - if err := s.Err(); err != nil { - return rangeList, err - } - - text := strings.TrimSpace(s.Text()) - if text == "" || strings.HasPrefix(text, "#") { - continue - } - parts := strings.Split(text, ":") - if len(parts) != 3 { - return rangeList, fmt.Errorf("Cannot parse subuid/gid information: Format not correct for %s file", path) - } - if parts[0] == username || username == "ALL" { - startid, err := strconv.Atoi(parts[1]) - if err != nil { - return rangeList, fmt.Errorf("String to int conversion failed during subuid/gid parsing of %s: %v", path, err) - } - length, err := strconv.Atoi(parts[2]) - if err != nil { - return rangeList, fmt.Errorf("String to int conversion failed during subuid/gid parsing of %s: %v", path, err) - } - rangeList = append(rangeList, subIDRange{startid, length}) - } - } - return rangeList, nil -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go b/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go deleted file mode 100644 index f9eb31c3e..000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools_unix.go +++ /dev/null @@ -1,207 +0,0 @@ -// +build !windows - -package idtools - -import ( - "bytes" - "fmt" - "io" - "os" - "path/filepath" - "strings" - "sync" - - "github.com/docker/docker/pkg/system" - "github.com/opencontainers/runc/libcontainer/user" -) - -var ( - entOnce sync.Once - getentCmd string -) - -func mkdirAs(path string, mode os.FileMode, ownerUID, ownerGID int, mkAll, chownExisting bool) error { - // make an array containing the original path asked for, plus (for mkAll == true) - // all path components leading up to the complete path that don't exist before we MkdirAll - // so that we can chown all of them properly at the end. If chownExisting is false, we won't - // chown the full directory path if it exists - var paths []string - if _, err := os.Stat(path); err != nil && os.IsNotExist(err) { - paths = []string{path} - } else if err == nil && chownExisting { - if err := os.Chown(path, ownerUID, ownerGID); err != nil { - return err - } - // short-circuit--we were called with an existing directory and chown was requested - return nil - } else if err == nil { - // nothing to do; directory path fully exists already and chown was NOT requested - return nil - } - - if mkAll { - // walk back to "/" looking for directories which do not exist - // and add them to the paths array for chown after creation - dirPath := path - for { - dirPath = filepath.Dir(dirPath) - if dirPath == "/" { - break - } - if _, err := os.Stat(dirPath); err != nil && os.IsNotExist(err) { - paths = append(paths, dirPath) - } - } - if err := system.MkdirAll(path, mode); err != nil && !os.IsExist(err) { - return err - } - } else { - if err := os.Mkdir(path, mode); err != nil && !os.IsExist(err) { - return err - } - } - // even if it existed, we will chown the requested path + any subpaths that - // didn't exist when we called MkdirAll - for _, pathComponent := range paths { - if err := os.Chown(pathComponent, ownerUID, ownerGID); err != nil { - return err - } - } - return nil -} - -// CanAccess takes a valid (existing) directory and a uid, gid pair and determines -// if that uid, gid pair has access (execute bit) to the directory -func CanAccess(path string, uid, gid int) bool { - statInfo, err := system.Stat(path) - if err != nil { - return false - } - fileMode := os.FileMode(statInfo.Mode()) - permBits := fileMode.Perm() - return accessible(statInfo.UID() == uint32(uid), - statInfo.GID() == uint32(gid), permBits) -} - -func accessible(isOwner, isGroup bool, perms os.FileMode) bool { - if isOwner && (perms&0100 == 0100) { - return true - } - if isGroup && (perms&0010 == 0010) { - return true - } - if perms&0001 == 0001 { - return true - } - return false -} - -// LookupUser uses traditional local system files lookup (from libcontainer/user) on a username, -// followed by a call to `getent` for supporting host configured non-files passwd and group dbs -func LookupUser(username string) (user.User, error) { - // first try a local system files lookup using existing capabilities - usr, err := user.LookupUser(username) - if err == nil { - return usr, nil - } - // local files lookup failed; attempt to call `getent` to query configured passwd dbs - usr, err = getentUser(fmt.Sprintf("%s %s", "passwd", username)) - if err != nil { - return user.User{}, err - } - return usr, nil -} - -// LookupUID uses traditional local system files lookup (from libcontainer/user) on a uid, -// followed by a call to `getent` for supporting host configured non-files passwd and group dbs -func LookupUID(uid int) (user.User, error) { - // first try a local system files lookup using existing capabilities - usr, err := user.LookupUid(uid) - if err == nil { - return usr, nil - } - // local files lookup failed; attempt to call `getent` to query configured passwd dbs - return getentUser(fmt.Sprintf("%s %d", "passwd", uid)) -} - -func getentUser(args string) (user.User, error) { - reader, err := callGetent(args) - if err != nil { - return user.User{}, err - } - users, err := user.ParsePasswd(reader) - if err != nil { - return user.User{}, err - } - if len(users) == 0 { - return user.User{}, fmt.Errorf("getent failed to find passwd entry for %q", strings.Split(args, " ")[1]) - } - return users[0], nil -} - -// LookupGroup uses traditional local system files lookup (from libcontainer/user) on a group name, -// followed by a call to `getent` for supporting host configured non-files passwd and group dbs -func LookupGroup(groupname string) (user.Group, error) { - // first try a local system files lookup using existing capabilities - group, err := user.LookupGroup(groupname) - if err == nil { - return group, nil - } - // local files lookup failed; attempt to call `getent` to query configured group dbs - return getentGroup(fmt.Sprintf("%s %s", "group", groupname)) -} - -// LookupGID uses traditional local system files lookup (from libcontainer/user) on a group ID, -// followed by a call to `getent` for supporting host configured non-files passwd and group dbs -func LookupGID(gid int) (user.Group, error) { - // first try a local system files lookup using existing capabilities - group, err := user.LookupGid(gid) - if err == nil { - return group, nil - } - // local files lookup failed; attempt to call `getent` to query configured group dbs - return getentGroup(fmt.Sprintf("%s %d", "group", gid)) -} - -func getentGroup(args string) (user.Group, error) { - reader, err := callGetent(args) - if err != nil { - return user.Group{}, err - } - groups, err := user.ParseGroup(reader) - if err != nil { - return user.Group{}, err - } - if len(groups) == 0 { - return user.Group{}, fmt.Errorf("getent failed to find groups entry for %q", strings.Split(args, " ")[1]) - } - return groups[0], nil -} - -func callGetent(args string) (io.Reader, error) { - entOnce.Do(func() { getentCmd, _ = resolveBinary("getent") }) - // if no `getent` command on host, can't do anything else - if getentCmd == "" { - return nil, fmt.Errorf("") - } - out, err := execCmd(getentCmd, args) - if err != nil { - exitCode, errC := system.GetExitCode(err) - if errC != nil { - return nil, err - } - switch exitCode { - case 1: - return nil, fmt.Errorf("getent reported invalid parameters/database unknown") - case 2: - terms := strings.Split(args, " ") - return nil, fmt.Errorf("getent unable to find entry %q in %s database", terms[1], terms[0]) - case 3: - return nil, fmt.Errorf("getent database doesn't support enumeration") - default: - return nil, err - } - - } - return bytes.NewReader(out), nil -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools_unix_test.go b/vendor/github.com/docker/docker/pkg/idtools/idtools_unix_test.go deleted file mode 100644 index 540d3079e..000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools_unix_test.go +++ /dev/null @@ -1,271 +0,0 @@ -// +build !windows - -package idtools - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "syscall" - "testing" -) - -type node struct { - uid int - gid int -} - -func TestMkdirAllAs(t *testing.T) { - dirName, err := ioutil.TempDir("", "mkdirall") - if err != nil { - t.Fatalf("Couldn't create temp dir: %v", err) - } - defer os.RemoveAll(dirName) - - testTree := map[string]node{ - "usr": {0, 0}, - "usr/bin": {0, 0}, - "lib": {33, 33}, - "lib/x86_64": {45, 45}, - "lib/x86_64/share": {1, 1}, - } - - if err := buildTree(dirName, testTree); err != nil { - t.Fatal(err) - } - - // test adding a directory to a pre-existing dir; only the new dir is owned by the uid/gid - if err := MkdirAllAs(filepath.Join(dirName, "usr", "share"), 0755, 99, 99); err != nil { - t.Fatal(err) - } - testTree["usr/share"] = node{99, 99} - verifyTree, err := readTree(dirName, "") - if err != nil { - t.Fatal(err) - } - if err := compareTrees(testTree, verifyTree); err != nil { - t.Fatal(err) - } - - // test 2-deep new directories--both should be owned by the uid/gid pair - if err := MkdirAllAs(filepath.Join(dirName, "lib", "some", "other"), 0755, 101, 101); err != nil { - t.Fatal(err) - } - testTree["lib/some"] = node{101, 101} - testTree["lib/some/other"] = node{101, 101} - verifyTree, err = readTree(dirName, "") - if err != nil { - t.Fatal(err) - } - if err := compareTrees(testTree, verifyTree); err != nil { - t.Fatal(err) - } - - // test a directory that already exists; should be chowned, but nothing else - if err := MkdirAllAs(filepath.Join(dirName, "usr"), 0755, 102, 102); err != nil { - t.Fatal(err) - } - testTree["usr"] = node{102, 102} - verifyTree, err = readTree(dirName, "") - if err != nil { - t.Fatal(err) - } - if err := compareTrees(testTree, verifyTree); err != nil { - t.Fatal(err) - } -} - -func TestMkdirAllNewAs(t *testing.T) { - - dirName, err := ioutil.TempDir("", "mkdirnew") - if err != nil { - t.Fatalf("Couldn't create temp dir: %v", err) - } - defer os.RemoveAll(dirName) - - testTree := map[string]node{ - "usr": {0, 0}, - "usr/bin": {0, 0}, - "lib": {33, 33}, - "lib/x86_64": {45, 45}, - "lib/x86_64/share": {1, 1}, - } - - if err := buildTree(dirName, testTree); err != nil { - t.Fatal(err) - } - - // test adding a directory to a pre-existing dir; only the new dir is owned by the uid/gid - if err := MkdirAllNewAs(filepath.Join(dirName, "usr", "share"), 0755, 99, 99); err != nil { - t.Fatal(err) - } - testTree["usr/share"] = node{99, 99} - verifyTree, err := readTree(dirName, "") - if err != nil { - t.Fatal(err) - } - if err := compareTrees(testTree, verifyTree); err != nil { - t.Fatal(err) - } - - // test 2-deep new directories--both should be owned by the uid/gid pair - if err := MkdirAllNewAs(filepath.Join(dirName, "lib", "some", "other"), 0755, 101, 101); err != nil { - t.Fatal(err) - } - testTree["lib/some"] = node{101, 101} - testTree["lib/some/other"] = node{101, 101} - verifyTree, err = readTree(dirName, "") - if err != nil { - t.Fatal(err) - } - if err := compareTrees(testTree, verifyTree); err != nil { - t.Fatal(err) - } - - // test a directory that already exists; should NOT be chowned - if err := MkdirAllNewAs(filepath.Join(dirName, "usr"), 0755, 102, 102); err != nil { - t.Fatal(err) - } - verifyTree, err = readTree(dirName, "") - if err != nil { - t.Fatal(err) - } - if err := compareTrees(testTree, verifyTree); err != nil { - t.Fatal(err) - } -} - -func TestMkdirAs(t *testing.T) { - - dirName, err := ioutil.TempDir("", "mkdir") - if err != nil { - t.Fatalf("Couldn't create temp dir: %v", err) - } - defer os.RemoveAll(dirName) - - testTree := map[string]node{ - "usr": {0, 0}, - } - if err := buildTree(dirName, testTree); err != nil { - t.Fatal(err) - } - - // test a directory that already exists; should just chown to the requested uid/gid - if err := MkdirAs(filepath.Join(dirName, "usr"), 0755, 99, 99); err != nil { - t.Fatal(err) - } - testTree["usr"] = node{99, 99} - verifyTree, err := readTree(dirName, "") - if err != nil { - t.Fatal(err) - } - if err := compareTrees(testTree, verifyTree); err != nil { - t.Fatal(err) - } - - // create a subdir under a dir which doesn't exist--should fail - if err := MkdirAs(filepath.Join(dirName, "usr", "bin", "subdir"), 0755, 102, 102); err == nil { - t.Fatalf("Trying to create a directory with Mkdir where the parent doesn't exist should have failed") - } - - // create a subdir under an existing dir; should only change the ownership of the new subdir - if err := MkdirAs(filepath.Join(dirName, "usr", "bin"), 0755, 102, 102); err != nil { - t.Fatal(err) - } - testTree["usr/bin"] = node{102, 102} - verifyTree, err = readTree(dirName, "") - if err != nil { - t.Fatal(err) - } - if err := compareTrees(testTree, verifyTree); err != nil { - t.Fatal(err) - } -} - -func buildTree(base string, tree map[string]node) error { - for path, node := range tree { - fullPath := filepath.Join(base, path) - if err := os.MkdirAll(fullPath, 0755); err != nil { - return fmt.Errorf("Couldn't create path: %s; error: %v", fullPath, err) - } - if err := os.Chown(fullPath, node.uid, node.gid); err != nil { - return fmt.Errorf("Couldn't chown path: %s; error: %v", fullPath, err) - } - } - return nil -} - -func readTree(base, root string) (map[string]node, error) { - tree := make(map[string]node) - - dirInfos, err := ioutil.ReadDir(base) - if err != nil { - return nil, fmt.Errorf("Couldn't read directory entries for %q: %v", base, err) - } - - for _, info := range dirInfos { - s := &syscall.Stat_t{} - if err := syscall.Stat(filepath.Join(base, info.Name()), s); err != nil { - return nil, fmt.Errorf("Can't stat file %q: %v", filepath.Join(base, info.Name()), err) - } - tree[filepath.Join(root, info.Name())] = node{int(s.Uid), int(s.Gid)} - if info.IsDir() { - // read the subdirectory - subtree, err := readTree(filepath.Join(base, info.Name()), filepath.Join(root, info.Name())) - if err != nil { - return nil, err - } - for path, nodeinfo := range subtree { - tree[path] = nodeinfo - } - } - } - return tree, nil -} - -func compareTrees(left, right map[string]node) error { - if len(left) != len(right) { - return fmt.Errorf("Trees aren't the same size") - } - for path, nodeLeft := range left { - if nodeRight, ok := right[path]; ok { - if nodeRight.uid != nodeLeft.uid || nodeRight.gid != nodeLeft.gid { - // mismatch - return fmt.Errorf("mismatched ownership for %q: expected: %d:%d, got: %d:%d", path, - nodeLeft.uid, nodeLeft.gid, nodeRight.uid, nodeRight.gid) - } - continue - } - return fmt.Errorf("right tree didn't contain path %q", path) - } - return nil -} - -func TestParseSubidFileWithNewlinesAndComments(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "parsesubid") - if err != nil { - t.Fatal(err) - } - fnamePath := filepath.Join(tmpDir, "testsubuid") - fcontent := `tss:100000:65536 -# empty default subuid/subgid file - -dockremap:231072:65536` - if err := ioutil.WriteFile(fnamePath, []byte(fcontent), 0644); err != nil { - t.Fatal(err) - } - ranges, err := parseSubidFile(fnamePath, "dockremap") - if err != nil { - t.Fatal(err) - } - if len(ranges) != 1 { - t.Fatalf("wanted 1 element in ranges, got %d instead", len(ranges)) - } - if ranges[0].Start != 231072 { - t.Fatalf("wanted 231072, got %d instead", ranges[0].Start) - } - if ranges[0].Length != 65536 { - t.Fatalf("wanted 65536, got %d instead", ranges[0].Length) - } -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go b/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go deleted file mode 100644 index 49f67e78c..000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/idtools_windows.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build windows - -package idtools - -import ( - "os" - - "github.com/docker/docker/pkg/system" -) - -// Platforms such as Windows do not support the UID/GID concept. So make this -// just a wrapper around system.MkdirAll. -func mkdirAs(path string, mode os.FileMode, ownerUID, ownerGID int, mkAll, chownExisting bool) error { - if err := system.MkdirAll(path, mode); err != nil && !os.IsExist(err) { - return err - } - return nil -} - -// CanAccess takes a valid (existing) directory and a uid, gid pair and determines -// if that uid, gid pair has access (execute bit) to the directory -// Windows does not require/support this function, so always return true -func CanAccess(path string, uid, gid int) bool { - return true -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go deleted file mode 100644 index 9da7975e2..000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_linux.go +++ /dev/null @@ -1,164 +0,0 @@ -package idtools - -import ( - "fmt" - "regexp" - "sort" - "strconv" - "strings" - "sync" -) - -// add a user and/or group to Linux /etc/passwd, /etc/group using standard -// Linux distribution commands: -// adduser --system --shell /bin/false --disabled-login --disabled-password --no-create-home --group -// useradd -r -s /bin/false - -var ( - once sync.Once - userCommand string - - cmdTemplates = map[string]string{ - "adduser": "--system --shell /bin/false --no-create-home --disabled-login --disabled-password --group %s", - "useradd": "-r -s /bin/false %s", - "usermod": "-%s %d-%d %s", - } - - idOutRegexp = regexp.MustCompile(`uid=([0-9]+).*gid=([0-9]+)`) - // default length for a UID/GID subordinate range - defaultRangeLen = 65536 - defaultRangeStart = 100000 - userMod = "usermod" -) - -// AddNamespaceRangesUser takes a username and uses the standard system -// utility to create a system user/group pair used to hold the -// /etc/sub{uid,gid} ranges which will be used for user namespace -// mapping ranges in containers. -func AddNamespaceRangesUser(name string) (int, int, error) { - if err := addUser(name); err != nil { - return -1, -1, fmt.Errorf("Error adding user %q: %v", name, err) - } - - // Query the system for the created uid and gid pair - out, err := execCmd("id", name) - if err != nil { - return -1, -1, fmt.Errorf("Error trying to find uid/gid for new user %q: %v", name, err) - } - matches := idOutRegexp.FindStringSubmatch(strings.TrimSpace(string(out))) - if len(matches) != 3 { - return -1, -1, fmt.Errorf("Can't find uid, gid from `id` output: %q", string(out)) - } - uid, err := strconv.Atoi(matches[1]) - if err != nil { - return -1, -1, fmt.Errorf("Can't convert found uid (%s) to int: %v", matches[1], err) - } - gid, err := strconv.Atoi(matches[2]) - if err != nil { - return -1, -1, fmt.Errorf("Can't convert found gid (%s) to int: %v", matches[2], err) - } - - // Now we need to create the subuid/subgid ranges for our new user/group (system users - // do not get auto-created ranges in subuid/subgid) - - if err := createSubordinateRanges(name); err != nil { - return -1, -1, fmt.Errorf("Couldn't create subordinate ID ranges: %v", err) - } - return uid, gid, nil -} - -func addUser(userName string) error { - once.Do(func() { - // set up which commands are used for adding users/groups dependent on distro - if _, err := resolveBinary("adduser"); err == nil { - userCommand = "adduser" - } else if _, err := resolveBinary("useradd"); err == nil { - userCommand = "useradd" - } - }) - if userCommand == "" { - return fmt.Errorf("Cannot add user; no useradd/adduser binary found") - } - args := fmt.Sprintf(cmdTemplates[userCommand], userName) - out, err := execCmd(userCommand, args) - if err != nil { - return fmt.Errorf("Failed to add user with error: %v; output: %q", err, string(out)) - } - return nil -} - -func createSubordinateRanges(name string) error { - - // first, we should verify that ranges weren't automatically created - // by the distro tooling - ranges, err := parseSubuid(name) - if err != nil { - return fmt.Errorf("Error while looking for subuid ranges for user %q: %v", name, err) - } - if len(ranges) == 0 { - // no UID ranges; let's create one - startID, err := findNextUIDRange() - if err != nil { - return fmt.Errorf("Can't find available subuid range: %v", err) - } - out, err := execCmd(userMod, fmt.Sprintf(cmdTemplates[userMod], "v", startID, startID+defaultRangeLen-1, name)) - if err != nil { - return fmt.Errorf("Unable to add subuid range to user: %q; output: %s, err: %v", name, out, err) - } - } - - ranges, err = parseSubgid(name) - if err != nil { - return fmt.Errorf("Error while looking for subgid ranges for user %q: %v", name, err) - } - if len(ranges) == 0 { - // no GID ranges; let's create one - startID, err := findNextGIDRange() - if err != nil { - return fmt.Errorf("Can't find available subgid range: %v", err) - } - out, err := execCmd(userMod, fmt.Sprintf(cmdTemplates[userMod], "w", startID, startID+defaultRangeLen-1, name)) - if err != nil { - return fmt.Errorf("Unable to add subgid range to user: %q; output: %s, err: %v", name, out, err) - } - } - return nil -} - -func findNextUIDRange() (int, error) { - ranges, err := parseSubuid("ALL") - if err != nil { - return -1, fmt.Errorf("Couldn't parse all ranges in /etc/subuid file: %v", err) - } - sort.Sort(ranges) - return findNextRangeStart(ranges) -} - -func findNextGIDRange() (int, error) { - ranges, err := parseSubgid("ALL") - if err != nil { - return -1, fmt.Errorf("Couldn't parse all ranges in /etc/subgid file: %v", err) - } - sort.Sort(ranges) - return findNextRangeStart(ranges) -} - -func findNextRangeStart(rangeList ranges) (int, error) { - startID := defaultRangeStart - for _, arange := range rangeList { - if wouldOverlap(arange, startID) { - startID = arange.Start + arange.Length - } - } - return startID, nil -} - -func wouldOverlap(arange subIDRange, ID int) bool { - low := ID - high := ID + defaultRangeLen - if (low >= arange.Start && low <= arange.Start+arange.Length) || - (high <= arange.Start+arange.Length && high >= arange.Start) { - return true - } - return false -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_unsupported.go b/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_unsupported.go deleted file mode 100644 index d98b354cb..000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/usergroupadd_unsupported.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !linux - -package idtools - -import "fmt" - -// AddNamespaceRangesUser takes a name and finds an unused uid, gid pair -// and calls the appropriate helper function to add the group and then -// the user to the group in /etc/group and /etc/passwd respectively. -func AddNamespaceRangesUser(name string) (int, int, error) { - return -1, -1, fmt.Errorf("No support for adding users or groups on this OS") -} diff --git a/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go b/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go deleted file mode 100644 index 9703ecbd9..000000000 --- a/vendor/github.com/docker/docker/pkg/idtools/utils_unix.go +++ /dev/null @@ -1,32 +0,0 @@ -// +build !windows - -package idtools - -import ( - "fmt" - "os/exec" - "path/filepath" - "strings" -) - -func resolveBinary(binname string) (string, error) { - binaryPath, err := exec.LookPath(binname) - if err != nil { - return "", err - } - resolvedPath, err := filepath.EvalSymlinks(binaryPath) - if err != nil { - return "", err - } - //only return no error if the final resolved binary basename - //matches what was searched for - if filepath.Base(resolvedPath) == binname { - return resolvedPath, nil - } - return "", fmt.Errorf("Binary %q does not resolve to a binary of that name in $PATH (%q)", binname, resolvedPath) -} - -func execCmd(cmd, args string) ([]byte, error) { - execCmd := exec.Command(cmd, strings.Split(args, " ")...) - return execCmd.CombinedOutput() -} diff --git a/vendor/github.com/docker/docker/pkg/integration/checker/checker.go b/vendor/github.com/docker/docker/pkg/integration/checker/checker.go deleted file mode 100644 index d1b703a59..000000000 --- a/vendor/github.com/docker/docker/pkg/integration/checker/checker.go +++ /dev/null @@ -1,46 +0,0 @@ -// Package checker provides Docker specific implementations of the go-check.Checker interface. -package checker - -import ( - "github.com/go-check/check" - "github.com/vdemeester/shakers" -) - -// As a commodity, we bring all check.Checker variables into the current namespace to avoid having -// to think about check.X versus checker.X. -var ( - DeepEquals = check.DeepEquals - ErrorMatches = check.ErrorMatches - FitsTypeOf = check.FitsTypeOf - HasLen = check.HasLen - Implements = check.Implements - IsNil = check.IsNil - Matches = check.Matches - Not = check.Not - NotNil = check.NotNil - PanicMatches = check.PanicMatches - Panics = check.Panics - - Contains = shakers.Contains - ContainsAny = shakers.ContainsAny - Count = shakers.Count - Equals = shakers.Equals - EqualFold = shakers.EqualFold - False = shakers.False - GreaterOrEqualThan = shakers.GreaterOrEqualThan - GreaterThan = shakers.GreaterThan - HasPrefix = shakers.HasPrefix - HasSuffix = shakers.HasSuffix - Index = shakers.Index - IndexAny = shakers.IndexAny - IsAfter = shakers.IsAfter - IsBefore = shakers.IsBefore - IsBetween = shakers.IsBetween - IsLower = shakers.IsLower - IsUpper = shakers.IsUpper - LessOrEqualThan = shakers.LessOrEqualThan - LessThan = shakers.LessThan - TimeEquals = shakers.TimeEquals - True = shakers.True - TimeIgnore = shakers.TimeIgnore -) diff --git a/vendor/github.com/docker/docker/pkg/integration/cmd/command.go b/vendor/github.com/docker/docker/pkg/integration/cmd/command.go deleted file mode 100644 index 76d04e8df..000000000 --- a/vendor/github.com/docker/docker/pkg/integration/cmd/command.go +++ /dev/null @@ -1,294 +0,0 @@ -package cmd - -import ( - "bytes" - "fmt" - "io" - "os/exec" - "path/filepath" - "runtime" - "strings" - "sync" - "time" - - "github.com/docker/docker/pkg/system" - "github.com/go-check/check" -) - -type testingT interface { - Fatalf(string, ...interface{}) -} - -const ( - // None is a token to inform Result.Assert that the output should be empty - None string = "" -) - -type lockedBuffer struct { - m sync.RWMutex - buf bytes.Buffer -} - -func (buf *lockedBuffer) Write(b []byte) (int, error) { - buf.m.Lock() - defer buf.m.Unlock() - return buf.buf.Write(b) -} - -func (buf *lockedBuffer) String() string { - buf.m.RLock() - defer buf.m.RUnlock() - return buf.buf.String() -} - -// Result stores the result of running a command -type Result struct { - Cmd *exec.Cmd - ExitCode int - Error error - // Timeout is true if the command was killed because it ran for too long - Timeout bool - outBuffer *lockedBuffer - errBuffer *lockedBuffer -} - -// Assert compares the Result against the Expected struct, and fails the test if -// any of the expcetations are not met. -func (r *Result) Assert(t testingT, exp Expected) { - err := r.Compare(exp) - if err == nil { - return - } - - _, file, line, _ := runtime.Caller(1) - t.Fatalf("at %s:%d\n%s", filepath.Base(file), line, err.Error()) -} - -// Compare returns an formatted error with the command, stdout, stderr, exit -// code, and any failed expectations -func (r *Result) Compare(exp Expected) error { - errors := []string{} - add := func(format string, args ...interface{}) { - errors = append(errors, fmt.Sprintf(format, args...)) - } - - if exp.ExitCode != r.ExitCode { - add("ExitCode was %d expected %d", r.ExitCode, exp.ExitCode) - } - if exp.Timeout != r.Timeout { - if exp.Timeout { - add("Expected command to timeout") - } else { - add("Expected command to finish, but it hit the timeout") - } - } - if !matchOutput(exp.Out, r.Stdout()) { - add("Expected stdout to contain %q", exp.Out) - } - if !matchOutput(exp.Err, r.Stderr()) { - add("Expected stderr to contain %q", exp.Err) - } - switch { - // If a non-zero exit code is expected there is going to be an error. - // Don't require an error message as well as an exit code because the - // error message is going to be "exit status which is not useful - case exp.Error == "" && exp.ExitCode != 0: - case exp.Error == "" && r.Error != nil: - add("Expected no error") - case exp.Error != "" && r.Error == nil: - add("Expected error to contain %q, but there was no error", exp.Error) - case exp.Error != "" && !strings.Contains(r.Error.Error(), exp.Error): - add("Expected error to contain %q", exp.Error) - } - - if len(errors) == 0 { - return nil - } - return fmt.Errorf("%s\nFailures:\n%s\n", r, strings.Join(errors, "\n")) -} - -func matchOutput(expected string, actual string) bool { - switch expected { - case None: - return actual == "" - default: - return strings.Contains(actual, expected) - } -} - -func (r *Result) String() string { - var timeout string - if r.Timeout { - timeout = " (timeout)" - } - - return fmt.Sprintf(` -Command: %s -ExitCode: %d%s, Error: %s -Stdout: %v -Stderr: %v -`, - strings.Join(r.Cmd.Args, " "), - r.ExitCode, - timeout, - r.Error, - r.Stdout(), - r.Stderr()) -} - -// Expected is the expected output from a Command. This struct is compared to a -// Result struct by Result.Assert(). -type Expected struct { - ExitCode int - Timeout bool - Error string - Out string - Err string -} - -// Success is the default expected result -var Success = Expected{} - -// Stdout returns the stdout of the process as a string -func (r *Result) Stdout() string { - return r.outBuffer.String() -} - -// Stderr returns the stderr of the process as a string -func (r *Result) Stderr() string { - return r.errBuffer.String() -} - -// Combined returns the stdout and stderr combined into a single string -func (r *Result) Combined() string { - return r.outBuffer.String() + r.errBuffer.String() -} - -// SetExitError sets Error and ExitCode based on Error -func (r *Result) SetExitError(err error) { - if err == nil { - return - } - r.Error = err - r.ExitCode = system.ProcessExitCode(err) -} - -type matches struct{} - -// Info returns the CheckerInfo -func (m *matches) Info() *check.CheckerInfo { - return &check.CheckerInfo{ - Name: "CommandMatches", - Params: []string{"result", "expected"}, - } -} - -// Check compares a result against the expected -func (m *matches) Check(params []interface{}, names []string) (bool, string) { - result, ok := params[0].(*Result) - if !ok { - return false, fmt.Sprintf("result must be a *Result, not %T", params[0]) - } - expected, ok := params[1].(Expected) - if !ok { - return false, fmt.Sprintf("expected must be an Expected, not %T", params[1]) - } - - err := result.Compare(expected) - if err == nil { - return true, "" - } - return false, err.Error() -} - -// Matches is a gocheck.Checker for comparing a Result against an Expected -var Matches = &matches{} - -// Cmd contains the arguments and options for a process to run as part of a test -// suite. -type Cmd struct { - Command []string - Timeout time.Duration - Stdin io.Reader - Stdout io.Writer - Dir string - Env []string -} - -// RunCmd runs a command and returns a Result -func RunCmd(cmd Cmd) *Result { - result := StartCmd(cmd) - if result.Error != nil { - return result - } - return WaitOnCmd(cmd.Timeout, result) -} - -// RunCommand parses a command line and runs it, returning a result -func RunCommand(command string, args ...string) *Result { - return RunCmd(Cmd{Command: append([]string{command}, args...)}) -} - -// StartCmd starts a command, but doesn't wait for it to finish -func StartCmd(cmd Cmd) *Result { - result := buildCmd(cmd) - if result.Error != nil { - return result - } - result.SetExitError(result.Cmd.Start()) - return result -} - -func buildCmd(cmd Cmd) *Result { - var execCmd *exec.Cmd - switch len(cmd.Command) { - case 1: - execCmd = exec.Command(cmd.Command[0]) - default: - execCmd = exec.Command(cmd.Command[0], cmd.Command[1:]...) - } - outBuffer := new(lockedBuffer) - errBuffer := new(lockedBuffer) - - execCmd.Stdin = cmd.Stdin - execCmd.Dir = cmd.Dir - execCmd.Env = cmd.Env - if cmd.Stdout != nil { - execCmd.Stdout = io.MultiWriter(outBuffer, cmd.Stdout) - } else { - execCmd.Stdout = outBuffer - } - execCmd.Stderr = errBuffer - return &Result{ - Cmd: execCmd, - outBuffer: outBuffer, - errBuffer: errBuffer, - } -} - -// WaitOnCmd waits for a command to complete. If timeout is non-nil then -// only wait until the timeout. -func WaitOnCmd(timeout time.Duration, result *Result) *Result { - if timeout == time.Duration(0) { - result.SetExitError(result.Cmd.Wait()) - return result - } - - done := make(chan error, 1) - // Wait for command to exit in a goroutine - go func() { - done <- result.Cmd.Wait() - }() - - select { - case <-time.After(timeout): - killErr := result.Cmd.Process.Kill() - if killErr != nil { - fmt.Printf("failed to kill (pid=%d): %v\n", result.Cmd.Process.Pid, killErr) - } - result.Timeout = true - case err := <-done: - result.SetExitError(err) - } - return result -} diff --git a/vendor/github.com/docker/docker/pkg/integration/cmd/command_test.go b/vendor/github.com/docker/docker/pkg/integration/cmd/command_test.go deleted file mode 100644 index df2344207..000000000 --- a/vendor/github.com/docker/docker/pkg/integration/cmd/command_test.go +++ /dev/null @@ -1,118 +0,0 @@ -package cmd - -import ( - "runtime" - "strings" - "testing" - "time" - - "github.com/docker/docker/pkg/testutil/assert" -) - -func TestRunCommand(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - - var cmd string - if runtime.GOOS == "solaris" { - cmd = "gls" - } else { - cmd = "ls" - } - result := RunCommand(cmd) - result.Assert(t, Expected{}) - - result = RunCommand("doesnotexists") - expectedError := `exec: "doesnotexists": executable file not found` - result.Assert(t, Expected{ExitCode: 127, Error: expectedError}) - - result = RunCommand(cmd, "-z") - result.Assert(t, Expected{ - ExitCode: 2, - Error: "exit status 2", - Err: "invalid option", - }) - assert.Contains(t, result.Combined(), "invalid option") -} - -func TestRunCommandWithCombined(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - - result := RunCommand("ls", "-a") - result.Assert(t, Expected{}) - - assert.Contains(t, result.Combined(), "..") - assert.Contains(t, result.Stdout(), "..") -} - -func TestRunCommandWithTimeoutFinished(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - - result := RunCmd(Cmd{ - Command: []string{"ls", "-a"}, - Timeout: 50 * time.Millisecond, - }) - result.Assert(t, Expected{Out: ".."}) -} - -func TestRunCommandWithTimeoutKilled(t *testing.T) { - // TODO Windows: Port this test - if runtime.GOOS == "windows" { - t.Skip("Needs porting to Windows") - } - - command := []string{"sh", "-c", "while true ; do echo 1 ; sleep .5 ; done"} - result := RunCmd(Cmd{Command: command, Timeout: 1250 * time.Millisecond}) - result.Assert(t, Expected{Timeout: true}) - - ones := strings.Split(result.Stdout(), "\n") - assert.Equal(t, len(ones), 4) -} - -func TestRunCommandWithErrors(t *testing.T) { - result := RunCommand("/foobar") - result.Assert(t, Expected{Error: "foobar", ExitCode: 127}) -} - -func TestRunCommandWithStdoutStderr(t *testing.T) { - result := RunCommand("echo", "hello", "world") - result.Assert(t, Expected{Out: "hello world\n", Err: None}) -} - -func TestRunCommandWithStdoutStderrError(t *testing.T) { - result := RunCommand("doesnotexists") - - expected := `exec: "doesnotexists": executable file not found` - result.Assert(t, Expected{Out: None, Err: None, ExitCode: 127, Error: expected}) - - switch runtime.GOOS { - case "windows": - expected = "ls: unknown option" - case "solaris": - expected = "gls: invalid option" - default: - expected = "ls: invalid option" - } - - var cmd string - if runtime.GOOS == "solaris" { - cmd = "gls" - } else { - cmd = "ls" - } - result = RunCommand(cmd, "-z") - result.Assert(t, Expected{ - Out: None, - Err: expected, - ExitCode: 2, - Error: "exit status 2", - }) -} diff --git a/vendor/github.com/docker/docker/pkg/integration/utils.go b/vendor/github.com/docker/docker/pkg/integration/utils.go deleted file mode 100644 index f2089c43c..000000000 --- a/vendor/github.com/docker/docker/pkg/integration/utils.go +++ /dev/null @@ -1,227 +0,0 @@ -package integration - -import ( - "archive/tar" - "errors" - "fmt" - "io" - "os" - "os/exec" - "path/filepath" - "reflect" - "strings" - "syscall" - "time" - - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/docker/docker/pkg/stringutils" - "github.com/docker/docker/pkg/system" -) - -// IsKilled process the specified error and returns whether the process was killed or not. -func IsKilled(err error) bool { - if exitErr, ok := err.(*exec.ExitError); ok { - status, ok := exitErr.Sys().(syscall.WaitStatus) - if !ok { - return false - } - // status.ExitStatus() is required on Windows because it does not - // implement Signal() nor Signaled(). Just check it had a bad exit - // status could mean it was killed (and in tests we do kill) - return (status.Signaled() && status.Signal() == os.Kill) || status.ExitStatus() != 0 - } - return false -} - -func runCommandWithOutput(cmd *exec.Cmd) (output string, exitCode int, err error) { - exitCode = 0 - out, err := cmd.CombinedOutput() - exitCode = system.ProcessExitCode(err) - output = string(out) - return -} - -// RunCommandPipelineWithOutput runs the array of commands with the output -// of each pipelined with the following (like cmd1 | cmd2 | cmd3 would do). -// It returns the final output, the exitCode different from 0 and the error -// if something bad happened. -func RunCommandPipelineWithOutput(cmds ...*exec.Cmd) (output string, exitCode int, err error) { - if len(cmds) < 2 { - return "", 0, errors.New("pipeline does not have multiple cmds") - } - - // connect stdin of each cmd to stdout pipe of previous cmd - for i, cmd := range cmds { - if i > 0 { - prevCmd := cmds[i-1] - cmd.Stdin, err = prevCmd.StdoutPipe() - - if err != nil { - return "", 0, fmt.Errorf("cannot set stdout pipe for %s: %v", cmd.Path, err) - } - } - } - - // start all cmds except the last - for _, cmd := range cmds[:len(cmds)-1] { - if err = cmd.Start(); err != nil { - return "", 0, fmt.Errorf("starting %s failed with error: %v", cmd.Path, err) - } - } - - defer func() { - var pipeErrMsgs []string - // wait all cmds except the last to release their resources - for _, cmd := range cmds[:len(cmds)-1] { - if pipeErr := cmd.Wait(); pipeErr != nil { - pipeErrMsgs = append(pipeErrMsgs, fmt.Sprintf("command %s failed with error: %v", cmd.Path, pipeErr)) - } - } - if len(pipeErrMsgs) > 0 && err == nil { - err = fmt.Errorf("pipelineError from Wait: %v", strings.Join(pipeErrMsgs, ", ")) - } - }() - - // wait on last cmd - return runCommandWithOutput(cmds[len(cmds)-1]) -} - -// ConvertSliceOfStringsToMap converts a slices of string in a map -// with the strings as key and an empty string as values. -func ConvertSliceOfStringsToMap(input []string) map[string]struct{} { - output := make(map[string]struct{}) - for _, v := range input { - output[v] = struct{}{} - } - return output -} - -// CompareDirectoryEntries compares two sets of FileInfo (usually taken from a directory) -// and returns an error if different. -func CompareDirectoryEntries(e1 []os.FileInfo, e2 []os.FileInfo) error { - var ( - e1Entries = make(map[string]struct{}) - e2Entries = make(map[string]struct{}) - ) - for _, e := range e1 { - e1Entries[e.Name()] = struct{}{} - } - for _, e := range e2 { - e2Entries[e.Name()] = struct{}{} - } - if !reflect.DeepEqual(e1Entries, e2Entries) { - return fmt.Errorf("entries differ") - } - return nil -} - -// ListTar lists the entries of a tar. -func ListTar(f io.Reader) ([]string, error) { - tr := tar.NewReader(f) - var entries []string - - for { - th, err := tr.Next() - if err == io.EOF { - // end of tar archive - return entries, nil - } - if err != nil { - return entries, err - } - entries = append(entries, th.Name) - } -} - -// RandomTmpDirPath provides a temporary path with rand string appended. -// does not create or checks if it exists. -func RandomTmpDirPath(s string, platform string) string { - tmp := "/tmp" - if platform == "windows" { - tmp = os.Getenv("TEMP") - } - path := filepath.Join(tmp, fmt.Sprintf("%s.%s", s, stringutils.GenerateRandomAlphaOnlyString(10))) - if platform == "windows" { - return filepath.FromSlash(path) // Using \ - } - return filepath.ToSlash(path) // Using / -} - -// ConsumeWithSpeed reads chunkSize bytes from reader before sleeping -// for interval duration. Returns total read bytes. Send true to the -// stop channel to return before reading to EOF on the reader. -func ConsumeWithSpeed(reader io.Reader, chunkSize int, interval time.Duration, stop chan bool) (n int, err error) { - buffer := make([]byte, chunkSize) - for { - var readBytes int - readBytes, err = reader.Read(buffer) - n += readBytes - if err != nil { - if err == io.EOF { - err = nil - } - return - } - select { - case <-stop: - return - case <-time.After(interval): - } - } -} - -// ParseCgroupPaths parses 'procCgroupData', which is output of '/proc//cgroup', and returns -// a map which cgroup name as key and path as value. -func ParseCgroupPaths(procCgroupData string) map[string]string { - cgroupPaths := map[string]string{} - for _, line := range strings.Split(procCgroupData, "\n") { - parts := strings.Split(line, ":") - if len(parts) != 3 { - continue - } - cgroupPaths[parts[1]] = parts[2] - } - return cgroupPaths -} - -// ChannelBuffer holds a chan of byte array that can be populate in a goroutine. -type ChannelBuffer struct { - C chan []byte -} - -// Write implements Writer. -func (c *ChannelBuffer) Write(b []byte) (int, error) { - c.C <- b - return len(b), nil -} - -// Close closes the go channel. -func (c *ChannelBuffer) Close() error { - close(c.C) - return nil -} - -// ReadTimeout reads the content of the channel in the specified byte array with -// the specified duration as timeout. -func (c *ChannelBuffer) ReadTimeout(p []byte, n time.Duration) (int, error) { - select { - case b := <-c.C: - return copy(p[0:], b), nil - case <-time.After(n): - return -1, fmt.Errorf("timeout reading from channel") - } -} - -// RunAtDifferentDate runs the specified function with the given time. -// It changes the date of the system, which can led to weird behaviors. -func RunAtDifferentDate(date time.Time, block func()) { - // Layout for date. MMDDhhmmYYYY - const timeLayout = "010203042006" - // Ensure we bring time back to now - now := time.Now().Format(timeLayout) - defer icmd.RunCommand("date", now) - - icmd.RunCommand("date", date.Format(timeLayout)) - block() - return -} diff --git a/vendor/github.com/docker/docker/pkg/integration/utils_test.go b/vendor/github.com/docker/docker/pkg/integration/utils_test.go deleted file mode 100644 index 0b2ef4aff..000000000 --- a/vendor/github.com/docker/docker/pkg/integration/utils_test.go +++ /dev/null @@ -1,363 +0,0 @@ -package integration - -import ( - "io" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - "testing" - "time" -) - -func TestIsKilledFalseWithNonKilledProcess(t *testing.T) { - var lsCmd *exec.Cmd - if runtime.GOOS != "windows" { - lsCmd = exec.Command("ls") - } else { - lsCmd = exec.Command("cmd", "/c", "dir") - } - - err := lsCmd.Run() - if IsKilled(err) { - t.Fatalf("Expected the ls command to not be killed, was.") - } -} - -func TestIsKilledTrueWithKilledProcess(t *testing.T) { - var longCmd *exec.Cmd - if runtime.GOOS != "windows" { - longCmd = exec.Command("top") - } else { - longCmd = exec.Command("powershell", "while ($true) { sleep 1 }") - } - - // Start a command - err := longCmd.Start() - if err != nil { - t.Fatal(err) - } - // Capture the error when *dying* - done := make(chan error, 1) - go func() { - done <- longCmd.Wait() - }() - // Then kill it - longCmd.Process.Kill() - // Get the error - err = <-done - if !IsKilled(err) { - t.Fatalf("Expected the command to be killed, was not.") - } -} - -func TestRunCommandPipelineWithOutputWithNotEnoughCmds(t *testing.T) { - _, _, err := RunCommandPipelineWithOutput(exec.Command("ls")) - expectedError := "pipeline does not have multiple cmds" - if err == nil || err.Error() != expectedError { - t.Fatalf("Expected an error with %s, got err:%s", expectedError, err) - } -} - -func TestRunCommandPipelineWithOutputErrors(t *testing.T) { - p := "$PATH" - if runtime.GOOS == "windows" { - p = "%PATH%" - } - cmd1 := exec.Command("ls") - cmd1.Stdout = os.Stdout - cmd2 := exec.Command("anything really") - _, _, err := RunCommandPipelineWithOutput(cmd1, cmd2) - if err == nil || err.Error() != "cannot set stdout pipe for anything really: exec: Stdout already set" { - t.Fatalf("Expected an error, got %v", err) - } - - cmdWithError := exec.Command("doesnotexists") - cmdCat := exec.Command("cat") - _, _, err = RunCommandPipelineWithOutput(cmdWithError, cmdCat) - if err == nil || err.Error() != `starting doesnotexists failed with error: exec: "doesnotexists": executable file not found in `+p { - t.Fatalf("Expected an error, got %v", err) - } -} - -func TestRunCommandPipelineWithOutput(t *testing.T) { - //TODO: Should run on Solaris - if runtime.GOOS == "solaris" { - t.Skip() - } - cmds := []*exec.Cmd{ - // Print 2 characters - exec.Command("echo", "-n", "11"), - // Count the number or char from stdin (previous command) - exec.Command("wc", "-m"), - } - out, exitCode, err := RunCommandPipelineWithOutput(cmds...) - expectedOutput := "2\n" - if out != expectedOutput || exitCode != 0 || err != nil { - t.Fatalf("Expected %s for commands %v, got out:%s, exitCode:%d, err:%v", expectedOutput, cmds, out, exitCode, err) - } -} - -func TestConvertSliceOfStringsToMap(t *testing.T) { - input := []string{"a", "b"} - actual := ConvertSliceOfStringsToMap(input) - for _, key := range input { - if _, ok := actual[key]; !ok { - t.Fatalf("Expected output to contains key %s, did not: %v", key, actual) - } - } -} - -func TestCompareDirectoryEntries(t *testing.T) { - tmpFolder, err := ioutil.TempDir("", "integration-cli-utils-compare-directories") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpFolder) - - file1 := filepath.Join(tmpFolder, "file1") - file2 := filepath.Join(tmpFolder, "file2") - os.Create(file1) - os.Create(file2) - - fi1, err := os.Stat(file1) - if err != nil { - t.Fatal(err) - } - fi1bis, err := os.Stat(file1) - if err != nil { - t.Fatal(err) - } - fi2, err := os.Stat(file2) - if err != nil { - t.Fatal(err) - } - - cases := []struct { - e1 []os.FileInfo - e2 []os.FileInfo - shouldError bool - }{ - // Empty directories - { - []os.FileInfo{}, - []os.FileInfo{}, - false, - }, - // Same FileInfos - { - []os.FileInfo{fi1}, - []os.FileInfo{fi1}, - false, - }, - // Different FileInfos but same names - { - []os.FileInfo{fi1}, - []os.FileInfo{fi1bis}, - false, - }, - // Different FileInfos, different names - { - []os.FileInfo{fi1}, - []os.FileInfo{fi2}, - true, - }, - } - for _, elt := range cases { - err := CompareDirectoryEntries(elt.e1, elt.e2) - if elt.shouldError && err == nil { - t.Fatalf("Should have return an error, did not with %v and %v", elt.e1, elt.e2) - } - if !elt.shouldError && err != nil { - t.Fatalf("Should have not returned an error, but did : %v with %v and %v", err, elt.e1, elt.e2) - } - } -} - -// FIXME make an "unhappy path" test for ListTar without "panicking" :-) -func TestListTar(t *testing.T) { - // TODO Windows: Figure out why this fails. Should be portable. - if runtime.GOOS == "windows" { - t.Skip("Failing on Windows - needs further investigation") - } - tmpFolder, err := ioutil.TempDir("", "integration-cli-utils-list-tar") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpFolder) - - // Let's create a Tar file - srcFile := filepath.Join(tmpFolder, "src") - tarFile := filepath.Join(tmpFolder, "src.tar") - os.Create(srcFile) - cmd := exec.Command("sh", "-c", "tar cf "+tarFile+" "+srcFile) - _, err = cmd.CombinedOutput() - if err != nil { - t.Fatal(err) - } - - reader, err := os.Open(tarFile) - if err != nil { - t.Fatal(err) - } - defer reader.Close() - - entries, err := ListTar(reader) - if err != nil { - t.Fatal(err) - } - if len(entries) != 1 && entries[0] != "src" { - t.Fatalf("Expected a tar file with 1 entry (%s), got %v", srcFile, entries) - } -} - -func TestRandomTmpDirPath(t *testing.T) { - path := RandomTmpDirPath("something", runtime.GOOS) - - prefix := "/tmp/something" - if runtime.GOOS == "windows" { - prefix = os.Getenv("TEMP") + `\something` - } - expectedSize := len(prefix) + 11 - - if !strings.HasPrefix(path, prefix) { - t.Fatalf("Expected generated path to have '%s' as prefix, got %s'", prefix, path) - } - if len(path) != expectedSize { - t.Fatalf("Expected generated path to be %d, got %d", expectedSize, len(path)) - } -} - -func TestConsumeWithSpeed(t *testing.T) { - reader := strings.NewReader("1234567890") - chunksize := 2 - - bytes1, err := ConsumeWithSpeed(reader, chunksize, 1*time.Second, nil) - if err != nil { - t.Fatal(err) - } - - if bytes1 != 10 { - t.Fatalf("Expected to have read 10 bytes, got %d", bytes1) - } - -} - -func TestConsumeWithSpeedWithStop(t *testing.T) { - reader := strings.NewReader("1234567890") - chunksize := 2 - - stopIt := make(chan bool) - - go func() { - time.Sleep(1 * time.Millisecond) - stopIt <- true - }() - - bytes1, err := ConsumeWithSpeed(reader, chunksize, 20*time.Millisecond, stopIt) - if err != nil { - t.Fatal(err) - } - - if bytes1 != 2 { - t.Fatalf("Expected to have read 2 bytes, got %d", bytes1) - } - -} - -func TestParseCgroupPathsEmpty(t *testing.T) { - cgroupMap := ParseCgroupPaths("") - if len(cgroupMap) != 0 { - t.Fatalf("Expected an empty map, got %v", cgroupMap) - } - cgroupMap = ParseCgroupPaths("\n") - if len(cgroupMap) != 0 { - t.Fatalf("Expected an empty map, got %v", cgroupMap) - } - cgroupMap = ParseCgroupPaths("something:else\nagain:here") - if len(cgroupMap) != 0 { - t.Fatalf("Expected an empty map, got %v", cgroupMap) - } -} - -func TestParseCgroupPaths(t *testing.T) { - cgroupMap := ParseCgroupPaths("2:memory:/a\n1:cpuset:/b") - if len(cgroupMap) != 2 { - t.Fatalf("Expected a map with 2 entries, got %v", cgroupMap) - } - if value, ok := cgroupMap["memory"]; !ok || value != "/a" { - t.Fatalf("Expected cgroupMap to contains an entry for 'memory' with value '/a', got %v", cgroupMap) - } - if value, ok := cgroupMap["cpuset"]; !ok || value != "/b" { - t.Fatalf("Expected cgroupMap to contains an entry for 'cpuset' with value '/b', got %v", cgroupMap) - } -} - -func TestChannelBufferTimeout(t *testing.T) { - expected := "11" - - buf := &ChannelBuffer{make(chan []byte, 1)} - defer buf.Close() - - done := make(chan struct{}, 1) - go func() { - time.Sleep(100 * time.Millisecond) - io.Copy(buf, strings.NewReader(expected)) - done <- struct{}{} - }() - - // Wait long enough - b := make([]byte, 2) - _, err := buf.ReadTimeout(b, 50*time.Millisecond) - if err == nil && err.Error() != "timeout reading from channel" { - t.Fatalf("Expected an error, got %s", err) - } - <-done -} - -func TestChannelBuffer(t *testing.T) { - expected := "11" - - buf := &ChannelBuffer{make(chan []byte, 1)} - defer buf.Close() - - go func() { - time.Sleep(100 * time.Millisecond) - io.Copy(buf, strings.NewReader(expected)) - }() - - // Wait long enough - b := make([]byte, 2) - _, err := buf.ReadTimeout(b, 200*time.Millisecond) - if err != nil { - t.Fatal(err) - } - - if string(b) != expected { - t.Fatalf("Expected '%s', got '%s'", expected, string(b)) - } -} - -// FIXME doesn't work -// func TestRunAtDifferentDate(t *testing.T) { -// var date string - -// // Layout for date. MMDDhhmmYYYY -// const timeLayout = "20060102" -// expectedDate := "20100201" -// theDate, err := time.Parse(timeLayout, expectedDate) -// if err != nil { -// t.Fatal(err) -// } - -// RunAtDifferentDate(theDate, func() { -// cmd := exec.Command("date", "+%Y%M%d") -// out, err := cmd.Output() -// if err != nil { -// t.Fatal(err) -// } -// date = string(out) -// }) -// } diff --git a/vendor/github.com/docker/docker/pkg/ioutils/buffer.go b/vendor/github.com/docker/docker/pkg/ioutils/buffer.go deleted file mode 100644 index 3d737b3e1..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/buffer.go +++ /dev/null @@ -1,51 +0,0 @@ -package ioutils - -import ( - "errors" - "io" -) - -var errBufferFull = errors.New("buffer is full") - -type fixedBuffer struct { - buf []byte - pos int - lastRead int -} - -func (b *fixedBuffer) Write(p []byte) (int, error) { - n := copy(b.buf[b.pos:cap(b.buf)], p) - b.pos += n - - if n < len(p) { - if b.pos == cap(b.buf) { - return n, errBufferFull - } - return n, io.ErrShortWrite - } - return n, nil -} - -func (b *fixedBuffer) Read(p []byte) (int, error) { - n := copy(p, b.buf[b.lastRead:b.pos]) - b.lastRead += n - return n, nil -} - -func (b *fixedBuffer) Len() int { - return b.pos - b.lastRead -} - -func (b *fixedBuffer) Cap() int { - return cap(b.buf) -} - -func (b *fixedBuffer) Reset() { - b.pos = 0 - b.lastRead = 0 - b.buf = b.buf[:0] -} - -func (b *fixedBuffer) String() string { - return string(b.buf[b.lastRead:b.pos]) -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/buffer_test.go b/vendor/github.com/docker/docker/pkg/ioutils/buffer_test.go deleted file mode 100644 index 41098fa6e..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/buffer_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package ioutils - -import ( - "bytes" - "testing" -) - -func TestFixedBufferWrite(t *testing.T) { - buf := &fixedBuffer{buf: make([]byte, 0, 64)} - n, err := buf.Write([]byte("hello")) - if err != nil { - t.Fatal(err) - } - - if n != 5 { - t.Fatalf("expected 5 bytes written, got %d", n) - } - - if string(buf.buf[:5]) != "hello" { - t.Fatalf("expected \"hello\", got %q", string(buf.buf[:5])) - } - - n, err = buf.Write(bytes.Repeat([]byte{1}, 64)) - if err != errBufferFull { - t.Fatalf("expected errBufferFull, got %v - %v", err, buf.buf[:64]) - } -} - -func TestFixedBufferRead(t *testing.T) { - buf := &fixedBuffer{buf: make([]byte, 0, 64)} - if _, err := buf.Write([]byte("hello world")); err != nil { - t.Fatal(err) - } - - b := make([]byte, 5) - n, err := buf.Read(b) - if err != nil { - t.Fatal(err) - } - - if n != 5 { - t.Fatalf("expected 5 bytes read, got %d - %s", n, buf.String()) - } - - if string(b) != "hello" { - t.Fatalf("expected \"hello\", got %q", string(b)) - } - - n, err = buf.Read(b) - if err != nil { - t.Fatal(err) - } - - if n != 5 { - t.Fatalf("expected 5 bytes read, got %d", n) - } - - if string(b) != " worl" { - t.Fatalf("expected \" worl\", got %s", string(b)) - } - - b = b[:1] - n, err = buf.Read(b) - if err != nil { - t.Fatal(err) - } - - if n != 1 { - t.Fatalf("expected 1 byte read, got %d - %s", n, buf.String()) - } - - if string(b) != "d" { - t.Fatalf("expected \"d\", got %s", string(b)) - } -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go b/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go deleted file mode 100644 index 72a04f349..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go +++ /dev/null @@ -1,186 +0,0 @@ -package ioutils - -import ( - "errors" - "io" - "sync" -) - -// maxCap is the highest capacity to use in byte slices that buffer data. -const maxCap = 1e6 - -// minCap is the lowest capacity to use in byte slices that buffer data -const minCap = 64 - -// blockThreshold is the minimum number of bytes in the buffer which will cause -// a write to BytesPipe to block when allocating a new slice. -const blockThreshold = 1e6 - -var ( - // ErrClosed is returned when Write is called on a closed BytesPipe. - ErrClosed = errors.New("write to closed BytesPipe") - - bufPools = make(map[int]*sync.Pool) - bufPoolsLock sync.Mutex -) - -// BytesPipe is io.ReadWriteCloser which works similarly to pipe(queue). -// All written data may be read at most once. Also, BytesPipe allocates -// and releases new byte slices to adjust to current needs, so the buffer -// won't be overgrown after peak loads. -type BytesPipe struct { - mu sync.Mutex - wait *sync.Cond - buf []*fixedBuffer - bufLen int - closeErr error // error to return from next Read. set to nil if not closed. -} - -// NewBytesPipe creates new BytesPipe, initialized by specified slice. -// If buf is nil, then it will be initialized with slice which cap is 64. -// buf will be adjusted in a way that len(buf) == 0, cap(buf) == cap(buf). -func NewBytesPipe() *BytesPipe { - bp := &BytesPipe{} - bp.buf = append(bp.buf, getBuffer(minCap)) - bp.wait = sync.NewCond(&bp.mu) - return bp -} - -// Write writes p to BytesPipe. -// It can allocate new []byte slices in a process of writing. -func (bp *BytesPipe) Write(p []byte) (int, error) { - bp.mu.Lock() - - written := 0 -loop0: - for { - if bp.closeErr != nil { - bp.mu.Unlock() - return written, ErrClosed - } - - if len(bp.buf) == 0 { - bp.buf = append(bp.buf, getBuffer(64)) - } - // get the last buffer - b := bp.buf[len(bp.buf)-1] - - n, err := b.Write(p) - written += n - bp.bufLen += n - - // errBufferFull is an error we expect to get if the buffer is full - if err != nil && err != errBufferFull { - bp.wait.Broadcast() - bp.mu.Unlock() - return written, err - } - - // if there was enough room to write all then break - if len(p) == n { - break - } - - // more data: write to the next slice - p = p[n:] - - // make sure the buffer doesn't grow too big from this write - for bp.bufLen >= blockThreshold { - bp.wait.Wait() - if bp.closeErr != nil { - continue loop0 - } - } - - // add new byte slice to the buffers slice and continue writing - nextCap := b.Cap() * 2 - if nextCap > maxCap { - nextCap = maxCap - } - bp.buf = append(bp.buf, getBuffer(nextCap)) - } - bp.wait.Broadcast() - bp.mu.Unlock() - return written, nil -} - -// CloseWithError causes further reads from a BytesPipe to return immediately. -func (bp *BytesPipe) CloseWithError(err error) error { - bp.mu.Lock() - if err != nil { - bp.closeErr = err - } else { - bp.closeErr = io.EOF - } - bp.wait.Broadcast() - bp.mu.Unlock() - return nil -} - -// Close causes further reads from a BytesPipe to return immediately. -func (bp *BytesPipe) Close() error { - return bp.CloseWithError(nil) -} - -// Read reads bytes from BytesPipe. -// Data could be read only once. -func (bp *BytesPipe) Read(p []byte) (n int, err error) { - bp.mu.Lock() - if bp.bufLen == 0 { - if bp.closeErr != nil { - bp.mu.Unlock() - return 0, bp.closeErr - } - bp.wait.Wait() - if bp.bufLen == 0 && bp.closeErr != nil { - err := bp.closeErr - bp.mu.Unlock() - return 0, err - } - } - - for bp.bufLen > 0 { - b := bp.buf[0] - read, _ := b.Read(p) // ignore error since fixedBuffer doesn't really return an error - n += read - bp.bufLen -= read - - if b.Len() == 0 { - // it's empty so return it to the pool and move to the next one - returnBuffer(b) - bp.buf[0] = nil - bp.buf = bp.buf[1:] - } - - if len(p) == read { - break - } - - p = p[read:] - } - - bp.wait.Broadcast() - bp.mu.Unlock() - return -} - -func returnBuffer(b *fixedBuffer) { - b.Reset() - bufPoolsLock.Lock() - pool := bufPools[b.Cap()] - bufPoolsLock.Unlock() - if pool != nil { - pool.Put(b) - } -} - -func getBuffer(size int) *fixedBuffer { - bufPoolsLock.Lock() - pool, ok := bufPools[size] - if !ok { - pool = &sync.Pool{New: func() interface{} { return &fixedBuffer{buf: make([]byte, 0, size)} }} - bufPools[size] = pool - } - bufPoolsLock.Unlock() - return pool.Get().(*fixedBuffer) -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe_test.go b/vendor/github.com/docker/docker/pkg/ioutils/bytespipe_test.go deleted file mode 100644 index 300fb5f6d..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe_test.go +++ /dev/null @@ -1,159 +0,0 @@ -package ioutils - -import ( - "crypto/sha1" - "encoding/hex" - "math/rand" - "testing" - "time" -) - -func TestBytesPipeRead(t *testing.T) { - buf := NewBytesPipe() - buf.Write([]byte("12")) - buf.Write([]byte("34")) - buf.Write([]byte("56")) - buf.Write([]byte("78")) - buf.Write([]byte("90")) - rd := make([]byte, 4) - n, err := buf.Read(rd) - if err != nil { - t.Fatal(err) - } - if n != 4 { - t.Fatalf("Wrong number of bytes read: %d, should be %d", n, 4) - } - if string(rd) != "1234" { - t.Fatalf("Read %s, but must be %s", rd, "1234") - } - n, err = buf.Read(rd) - if err != nil { - t.Fatal(err) - } - if n != 4 { - t.Fatalf("Wrong number of bytes read: %d, should be %d", n, 4) - } - if string(rd) != "5678" { - t.Fatalf("Read %s, but must be %s", rd, "5679") - } - n, err = buf.Read(rd) - if err != nil { - t.Fatal(err) - } - if n != 2 { - t.Fatalf("Wrong number of bytes read: %d, should be %d", n, 2) - } - if string(rd[:n]) != "90" { - t.Fatalf("Read %s, but must be %s", rd, "90") - } -} - -func TestBytesPipeWrite(t *testing.T) { - buf := NewBytesPipe() - buf.Write([]byte("12")) - buf.Write([]byte("34")) - buf.Write([]byte("56")) - buf.Write([]byte("78")) - buf.Write([]byte("90")) - if buf.buf[0].String() != "1234567890" { - t.Fatalf("Buffer %q, must be %q", buf.buf[0].String(), "1234567890") - } -} - -// Write and read in different speeds/chunk sizes and check valid data is read. -func TestBytesPipeWriteRandomChunks(t *testing.T) { - cases := []struct{ iterations, writesPerLoop, readsPerLoop int }{ - {100, 10, 1}, - {1000, 10, 5}, - {1000, 100, 0}, - {1000, 5, 6}, - {10000, 50, 25}, - } - - testMessage := []byte("this is a random string for testing") - // random slice sizes to read and write - writeChunks := []int{25, 35, 15, 20} - readChunks := []int{5, 45, 20, 25} - - for _, c := range cases { - // first pass: write directly to hash - hash := sha1.New() - for i := 0; i < c.iterations*c.writesPerLoop; i++ { - if _, err := hash.Write(testMessage[:writeChunks[i%len(writeChunks)]]); err != nil { - t.Fatal(err) - } - } - expected := hex.EncodeToString(hash.Sum(nil)) - - // write/read through buffer - buf := NewBytesPipe() - hash.Reset() - - done := make(chan struct{}) - - go func() { - // random delay before read starts - <-time.After(time.Duration(rand.Intn(10)) * time.Millisecond) - for i := 0; ; i++ { - p := make([]byte, readChunks[(c.iterations*c.readsPerLoop+i)%len(readChunks)]) - n, _ := buf.Read(p) - if n == 0 { - break - } - hash.Write(p[:n]) - } - - close(done) - }() - - for i := 0; i < c.iterations; i++ { - for w := 0; w < c.writesPerLoop; w++ { - buf.Write(testMessage[:writeChunks[(i*c.writesPerLoop+w)%len(writeChunks)]]) - } - } - buf.Close() - <-done - - actual := hex.EncodeToString(hash.Sum(nil)) - - if expected != actual { - t.Fatalf("BytesPipe returned invalid data. Expected checksum %v, got %v", expected, actual) - } - - } -} - -func BenchmarkBytesPipeWrite(b *testing.B) { - testData := []byte("pretty short line, because why not?") - for i := 0; i < b.N; i++ { - readBuf := make([]byte, 1024) - buf := NewBytesPipe() - go func() { - var err error - for err == nil { - _, err = buf.Read(readBuf) - } - }() - for j := 0; j < 1000; j++ { - buf.Write(testData) - } - buf.Close() - } -} - -func BenchmarkBytesPipeRead(b *testing.B) { - rd := make([]byte, 512) - for i := 0; i < b.N; i++ { - b.StopTimer() - buf := NewBytesPipe() - for j := 0; j < 500; j++ { - buf.Write(make([]byte, 1024)) - } - b.StartTimer() - for j := 0; j < 1000; j++ { - if n, _ := buf.Read(rd); n != 512 { - b.Fatalf("Wrong number of bytes: %d", n) - } - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/fmt.go b/vendor/github.com/docker/docker/pkg/ioutils/fmt.go deleted file mode 100644 index 0b04b0ba3..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/fmt.go +++ /dev/null @@ -1,22 +0,0 @@ -package ioutils - -import ( - "fmt" - "io" -) - -// FprintfIfNotEmpty prints the string value if it's not empty -func FprintfIfNotEmpty(w io.Writer, format, value string) (int, error) { - if value != "" { - return fmt.Fprintf(w, format, value) - } - return 0, nil -} - -// FprintfIfTrue prints the boolean value if it's true -func FprintfIfTrue(w io.Writer, format string, ok bool) (int, error) { - if ok { - return fmt.Fprintf(w, format, ok) - } - return 0, nil -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/fmt_test.go b/vendor/github.com/docker/docker/pkg/ioutils/fmt_test.go deleted file mode 100644 index 896886329..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/fmt_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package ioutils - -import "testing" - -func TestFprintfIfNotEmpty(t *testing.T) { - wc := NewWriteCounter(&NopWriter{}) - n, _ := FprintfIfNotEmpty(wc, "foo%s", "") - - if wc.Count != 0 || n != 0 { - t.Errorf("Wrong count: %v vs. %v vs. 0", wc.Count, n) - } - - n, _ = FprintfIfNotEmpty(wc, "foo%s", "bar") - if wc.Count != 6 || n != 6 { - t.Errorf("Wrong count: %v vs. %v vs. 6", wc.Count, n) - } -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go b/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go deleted file mode 100644 index a56c46265..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go +++ /dev/null @@ -1,162 +0,0 @@ -package ioutils - -import ( - "io" - "io/ioutil" - "os" - "path/filepath" -) - -// NewAtomicFileWriter returns WriteCloser so that writing to it writes to a -// temporary file and closing it atomically changes the temporary file to -// destination path. Writing and closing concurrently is not allowed. -func NewAtomicFileWriter(filename string, perm os.FileMode) (io.WriteCloser, error) { - f, err := ioutil.TempFile(filepath.Dir(filename), ".tmp-"+filepath.Base(filename)) - if err != nil { - return nil, err - } - - abspath, err := filepath.Abs(filename) - if err != nil { - return nil, err - } - return &atomicFileWriter{ - f: f, - fn: abspath, - perm: perm, - }, nil -} - -// AtomicWriteFile atomically writes data to a file named by filename. -func AtomicWriteFile(filename string, data []byte, perm os.FileMode) error { - f, err := NewAtomicFileWriter(filename, perm) - if err != nil { - return err - } - n, err := f.Write(data) - if err == nil && n < len(data) { - err = io.ErrShortWrite - f.(*atomicFileWriter).writeErr = err - } - if err1 := f.Close(); err == nil { - err = err1 - } - return err -} - -type atomicFileWriter struct { - f *os.File - fn string - writeErr error - perm os.FileMode -} - -func (w *atomicFileWriter) Write(dt []byte) (int, error) { - n, err := w.f.Write(dt) - if err != nil { - w.writeErr = err - } - return n, err -} - -func (w *atomicFileWriter) Close() (retErr error) { - defer func() { - if retErr != nil || w.writeErr != nil { - os.Remove(w.f.Name()) - } - }() - if err := w.f.Sync(); err != nil { - w.f.Close() - return err - } - if err := w.f.Close(); err != nil { - return err - } - if err := os.Chmod(w.f.Name(), w.perm); err != nil { - return err - } - if w.writeErr == nil { - return os.Rename(w.f.Name(), w.fn) - } - return nil -} - -// AtomicWriteSet is used to atomically write a set -// of files and ensure they are visible at the same time. -// Must be committed to a new directory. -type AtomicWriteSet struct { - root string -} - -// NewAtomicWriteSet creates a new atomic write set to -// atomically create a set of files. The given directory -// is used as the base directory for storing files before -// commit. If no temporary directory is given the system -// default is used. -func NewAtomicWriteSet(tmpDir string) (*AtomicWriteSet, error) { - td, err := ioutil.TempDir(tmpDir, "write-set-") - if err != nil { - return nil, err - } - - return &AtomicWriteSet{ - root: td, - }, nil -} - -// WriteFile writes a file to the set, guaranteeing the file -// has been synced. -func (ws *AtomicWriteSet) WriteFile(filename string, data []byte, perm os.FileMode) error { - f, err := ws.FileWriter(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) - if err != nil { - return err - } - n, err := f.Write(data) - if err == nil && n < len(data) { - err = io.ErrShortWrite - } - if err1 := f.Close(); err == nil { - err = err1 - } - return err -} - -type syncFileCloser struct { - *os.File -} - -func (w syncFileCloser) Close() error { - err := w.File.Sync() - if err1 := w.File.Close(); err == nil { - err = err1 - } - return err -} - -// FileWriter opens a file writer inside the set. The file -// should be synced and closed before calling commit. -func (ws *AtomicWriteSet) FileWriter(name string, flag int, perm os.FileMode) (io.WriteCloser, error) { - f, err := os.OpenFile(filepath.Join(ws.root, name), flag, perm) - if err != nil { - return nil, err - } - return syncFileCloser{f}, nil -} - -// Cancel cancels the set and removes all temporary data -// created in the set. -func (ws *AtomicWriteSet) Cancel() error { - return os.RemoveAll(ws.root) -} - -// Commit moves all created files to the target directory. The -// target directory must not exist and the parent of the target -// directory must exist. -func (ws *AtomicWriteSet) Commit(target string) error { - return os.Rename(ws.root, target) -} - -// String returns the location the set is writing to. -func (ws *AtomicWriteSet) String() string { - return ws.root -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/fswriters_test.go b/vendor/github.com/docker/docker/pkg/ioutils/fswriters_test.go deleted file mode 100644 index c4d141930..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/fswriters_test.go +++ /dev/null @@ -1,132 +0,0 @@ -package ioutils - -import ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "testing" -) - -var ( - testMode os.FileMode = 0640 -) - -func init() { - // Windows does not support full Linux file mode - if runtime.GOOS == "windows" { - testMode = 0666 - } -} - -func TestAtomicWriteToFile(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "atomic-writers-test") - if err != nil { - t.Fatalf("Error when creating temporary directory: %s", err) - } - defer os.RemoveAll(tmpDir) - - expected := []byte("barbaz") - if err := AtomicWriteFile(filepath.Join(tmpDir, "foo"), expected, testMode); err != nil { - t.Fatalf("Error writing to file: %v", err) - } - - actual, err := ioutil.ReadFile(filepath.Join(tmpDir, "foo")) - if err != nil { - t.Fatalf("Error reading from file: %v", err) - } - - if bytes.Compare(actual, expected) != 0 { - t.Fatalf("Data mismatch, expected %q, got %q", expected, actual) - } - - st, err := os.Stat(filepath.Join(tmpDir, "foo")) - if err != nil { - t.Fatalf("Error statting file: %v", err) - } - if expected := os.FileMode(testMode); st.Mode() != expected { - t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode()) - } -} - -func TestAtomicWriteSetCommit(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "atomic-writerset-test") - if err != nil { - t.Fatalf("Error when creating temporary directory: %s", err) - } - defer os.RemoveAll(tmpDir) - - if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0700); err != nil { - t.Fatalf("Error creating tmp directory: %s", err) - } - - targetDir := filepath.Join(tmpDir, "target") - ws, err := NewAtomicWriteSet(filepath.Join(tmpDir, "tmp")) - if err != nil { - t.Fatalf("Error creating atomic write set: %s", err) - } - - expected := []byte("barbaz") - if err := ws.WriteFile("foo", expected, testMode); err != nil { - t.Fatalf("Error writing to file: %v", err) - } - - if _, err := ioutil.ReadFile(filepath.Join(targetDir, "foo")); err == nil { - t.Fatalf("Expected error reading file where should not exist") - } - - if err := ws.Commit(targetDir); err != nil { - t.Fatalf("Error committing file: %s", err) - } - - actual, err := ioutil.ReadFile(filepath.Join(targetDir, "foo")) - if err != nil { - t.Fatalf("Error reading from file: %v", err) - } - - if bytes.Compare(actual, expected) != 0 { - t.Fatalf("Data mismatch, expected %q, got %q", expected, actual) - } - - st, err := os.Stat(filepath.Join(targetDir, "foo")) - if err != nil { - t.Fatalf("Error statting file: %v", err) - } - if expected := os.FileMode(testMode); st.Mode() != expected { - t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode()) - } - -} - -func TestAtomicWriteSetCancel(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "atomic-writerset-test") - if err != nil { - t.Fatalf("Error when creating temporary directory: %s", err) - } - defer os.RemoveAll(tmpDir) - - if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0700); err != nil { - t.Fatalf("Error creating tmp directory: %s", err) - } - - ws, err := NewAtomicWriteSet(filepath.Join(tmpDir, "tmp")) - if err != nil { - t.Fatalf("Error creating atomic write set: %s", err) - } - - expected := []byte("barbaz") - if err := ws.WriteFile("foo", expected, testMode); err != nil { - t.Fatalf("Error writing to file: %v", err) - } - - if err := ws.Cancel(); err != nil { - t.Fatalf("Error committing file: %s", err) - } - - if _, err := ioutil.ReadFile(filepath.Join(tmpDir, "target", "foo")); err == nil { - t.Fatalf("Expected error reading file where should not exist") - } else if !os.IsNotExist(err) { - t.Fatalf("Unexpected error reading file: %s", err) - } -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/multireader.go b/vendor/github.com/docker/docker/pkg/ioutils/multireader.go deleted file mode 100644 index d7b97486c..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/multireader.go +++ /dev/null @@ -1,223 +0,0 @@ -package ioutils - -import ( - "bytes" - "fmt" - "io" - "os" -) - -type pos struct { - idx int - offset int64 -} - -type multiReadSeeker struct { - readers []io.ReadSeeker - pos *pos - posIdx map[io.ReadSeeker]int -} - -func (r *multiReadSeeker) Seek(offset int64, whence int) (int64, error) { - var tmpOffset int64 - switch whence { - case os.SEEK_SET: - for i, rdr := range r.readers { - // get size of the current reader - s, err := rdr.Seek(0, os.SEEK_END) - if err != nil { - return -1, err - } - - if offset > tmpOffset+s { - if i == len(r.readers)-1 { - rdrOffset := s + (offset - tmpOffset) - if _, err := rdr.Seek(rdrOffset, os.SEEK_SET); err != nil { - return -1, err - } - r.pos = &pos{i, rdrOffset} - return offset, nil - } - - tmpOffset += s - continue - } - - rdrOffset := offset - tmpOffset - idx := i - - rdr.Seek(rdrOffset, os.SEEK_SET) - // make sure all following readers are at 0 - for _, rdr := range r.readers[i+1:] { - rdr.Seek(0, os.SEEK_SET) - } - - if rdrOffset == s && i != len(r.readers)-1 { - idx++ - rdrOffset = 0 - } - r.pos = &pos{idx, rdrOffset} - return offset, nil - } - case os.SEEK_END: - for _, rdr := range r.readers { - s, err := rdr.Seek(0, os.SEEK_END) - if err != nil { - return -1, err - } - tmpOffset += s - } - r.Seek(tmpOffset+offset, os.SEEK_SET) - return tmpOffset + offset, nil - case os.SEEK_CUR: - if r.pos == nil { - return r.Seek(offset, os.SEEK_SET) - } - // Just return the current offset - if offset == 0 { - return r.getCurOffset() - } - - curOffset, err := r.getCurOffset() - if err != nil { - return -1, err - } - rdr, rdrOffset, err := r.getReaderForOffset(curOffset + offset) - if err != nil { - return -1, err - } - - r.pos = &pos{r.posIdx[rdr], rdrOffset} - return curOffset + offset, nil - default: - return -1, fmt.Errorf("Invalid whence: %d", whence) - } - - return -1, fmt.Errorf("Error seeking for whence: %d, offset: %d", whence, offset) -} - -func (r *multiReadSeeker) getReaderForOffset(offset int64) (io.ReadSeeker, int64, error) { - - var offsetTo int64 - - for _, rdr := range r.readers { - size, err := getReadSeekerSize(rdr) - if err != nil { - return nil, -1, err - } - if offsetTo+size > offset { - return rdr, offset - offsetTo, nil - } - if rdr == r.readers[len(r.readers)-1] { - return rdr, offsetTo + offset, nil - } - offsetTo += size - } - - return nil, 0, nil -} - -func (r *multiReadSeeker) getCurOffset() (int64, error) { - var totalSize int64 - for _, rdr := range r.readers[:r.pos.idx+1] { - if r.posIdx[rdr] == r.pos.idx { - totalSize += r.pos.offset - break - } - - size, err := getReadSeekerSize(rdr) - if err != nil { - return -1, fmt.Errorf("error getting seeker size: %v", err) - } - totalSize += size - } - return totalSize, nil -} - -func (r *multiReadSeeker) getOffsetToReader(rdr io.ReadSeeker) (int64, error) { - var offset int64 - for _, r := range r.readers { - if r == rdr { - break - } - - size, err := getReadSeekerSize(rdr) - if err != nil { - return -1, err - } - offset += size - } - return offset, nil -} - -func (r *multiReadSeeker) Read(b []byte) (int, error) { - if r.pos == nil { - r.pos = &pos{0, 0} - } - - bLen := int64(len(b)) - buf := bytes.NewBuffer(nil) - var rdr io.ReadSeeker - - for _, rdr = range r.readers[r.pos.idx:] { - readBytes, err := io.CopyN(buf, rdr, bLen) - if err != nil && err != io.EOF { - return -1, err - } - bLen -= readBytes - - if bLen == 0 { - break - } - } - - rdrPos, err := rdr.Seek(0, os.SEEK_CUR) - if err != nil { - return -1, err - } - r.pos = &pos{r.posIdx[rdr], rdrPos} - return buf.Read(b) -} - -func getReadSeekerSize(rdr io.ReadSeeker) (int64, error) { - // save the current position - pos, err := rdr.Seek(0, os.SEEK_CUR) - if err != nil { - return -1, err - } - - // get the size - size, err := rdr.Seek(0, os.SEEK_END) - if err != nil { - return -1, err - } - - // reset the position - if _, err := rdr.Seek(pos, os.SEEK_SET); err != nil { - return -1, err - } - return size, nil -} - -// MultiReadSeeker returns a ReadSeeker that's the logical concatenation of the provided -// input readseekers. After calling this method the initial position is set to the -// beginning of the first ReadSeeker. At the end of a ReadSeeker, Read always advances -// to the beginning of the next ReadSeeker and returns EOF at the end of the last ReadSeeker. -// Seek can be used over the sum of lengths of all readseekers. -// -// When a MultiReadSeeker is used, no Read and Seek operations should be made on -// its ReadSeeker components. Also, users should make no assumption on the state -// of individual readseekers while the MultiReadSeeker is used. -func MultiReadSeeker(readers ...io.ReadSeeker) io.ReadSeeker { - if len(readers) == 1 { - return readers[0] - } - idx := make(map[io.ReadSeeker]int) - for i, rdr := range readers { - idx[rdr] = i - } - return &multiReadSeeker{ - readers: readers, - posIdx: idx, - } -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/multireader_test.go b/vendor/github.com/docker/docker/pkg/ioutils/multireader_test.go deleted file mode 100644 index 65309a956..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/multireader_test.go +++ /dev/null @@ -1,211 +0,0 @@ -package ioutils - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" - "io/ioutil" - "os" - "strings" - "testing" -) - -func TestMultiReadSeekerReadAll(t *testing.T) { - str := "hello world" - s1 := strings.NewReader(str + " 1") - s2 := strings.NewReader(str + " 2") - s3 := strings.NewReader(str + " 3") - mr := MultiReadSeeker(s1, s2, s3) - - expectedSize := int64(s1.Len() + s2.Len() + s3.Len()) - - b, err := ioutil.ReadAll(mr) - if err != nil { - t.Fatal(err) - } - - expected := "hello world 1hello world 2hello world 3" - if string(b) != expected { - t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected) - } - - size, err := mr.Seek(0, os.SEEK_END) - if err != nil { - t.Fatal(err) - } - if size != expectedSize { - t.Fatalf("reader size does not match, got %d, expected %d", size, expectedSize) - } - - // Reset the position and read again - pos, err := mr.Seek(0, os.SEEK_SET) - if err != nil { - t.Fatal(err) - } - if pos != 0 { - t.Fatalf("expected position to be set to 0, got %d", pos) - } - - b, err = ioutil.ReadAll(mr) - if err != nil { - t.Fatal(err) - } - - if string(b) != expected { - t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected) - } -} - -func TestMultiReadSeekerReadEach(t *testing.T) { - str := "hello world" - s1 := strings.NewReader(str + " 1") - s2 := strings.NewReader(str + " 2") - s3 := strings.NewReader(str + " 3") - mr := MultiReadSeeker(s1, s2, s3) - - var totalBytes int64 - for i, s := range []*strings.Reader{s1, s2, s3} { - sLen := int64(s.Len()) - buf := make([]byte, s.Len()) - expected := []byte(fmt.Sprintf("%s %d", str, i+1)) - - if _, err := mr.Read(buf); err != nil && err != io.EOF { - t.Fatal(err) - } - - if !bytes.Equal(buf, expected) { - t.Fatalf("expected %q to be %q", string(buf), string(expected)) - } - - pos, err := mr.Seek(0, os.SEEK_CUR) - if err != nil { - t.Fatalf("iteration: %d, error: %v", i+1, err) - } - - // check that the total bytes read is the current position of the seeker - totalBytes += sLen - if pos != totalBytes { - t.Fatalf("expected current position to be: %d, got: %d, iteration: %d", totalBytes, pos, i+1) - } - - // This tests not only that SEEK_SET and SEEK_CUR give the same values, but that the next iteration is in the expected position as well - newPos, err := mr.Seek(pos, os.SEEK_SET) - if err != nil { - t.Fatal(err) - } - if newPos != pos { - t.Fatalf("expected to get same position when calling SEEK_SET with value from SEEK_CUR, cur: %d, set: %d", pos, newPos) - } - } -} - -func TestMultiReadSeekerReadSpanningChunks(t *testing.T) { - str := "hello world" - s1 := strings.NewReader(str + " 1") - s2 := strings.NewReader(str + " 2") - s3 := strings.NewReader(str + " 3") - mr := MultiReadSeeker(s1, s2, s3) - - buf := make([]byte, s1.Len()+3) - _, err := mr.Read(buf) - if err != nil { - t.Fatal(err) - } - - // expected is the contents of s1 + 3 bytes from s2, ie, the `hel` at the end of this string - expected := "hello world 1hel" - if string(buf) != expected { - t.Fatalf("expected %s to be %s", string(buf), expected) - } -} - -func TestMultiReadSeekerNegativeSeek(t *testing.T) { - str := "hello world" - s1 := strings.NewReader(str + " 1") - s2 := strings.NewReader(str + " 2") - s3 := strings.NewReader(str + " 3") - mr := MultiReadSeeker(s1, s2, s3) - - s1Len := s1.Len() - s2Len := s2.Len() - s3Len := s3.Len() - - s, err := mr.Seek(int64(-1*s3.Len()), os.SEEK_END) - if err != nil { - t.Fatal(err) - } - if s != int64(s1Len+s2Len) { - t.Fatalf("expected %d to be %d", s, s1.Len()+s2.Len()) - } - - buf := make([]byte, s3Len) - if _, err := mr.Read(buf); err != nil && err != io.EOF { - t.Fatal(err) - } - expected := fmt.Sprintf("%s %d", str, 3) - if string(buf) != fmt.Sprintf("%s %d", str, 3) { - t.Fatalf("expected %q to be %q", string(buf), expected) - } -} - -func TestMultiReadSeekerCurAfterSet(t *testing.T) { - str := "hello world" - s1 := strings.NewReader(str + " 1") - s2 := strings.NewReader(str + " 2") - s3 := strings.NewReader(str + " 3") - mr := MultiReadSeeker(s1, s2, s3) - - mid := int64(s1.Len() + s2.Len()/2) - - size, err := mr.Seek(mid, os.SEEK_SET) - if err != nil { - t.Fatal(err) - } - if size != mid { - t.Fatalf("reader size does not match, got %d, expected %d", size, mid) - } - - size, err = mr.Seek(3, os.SEEK_CUR) - if err != nil { - t.Fatal(err) - } - if size != mid+3 { - t.Fatalf("reader size does not match, got %d, expected %d", size, mid+3) - } - size, err = mr.Seek(5, os.SEEK_CUR) - if err != nil { - t.Fatal(err) - } - if size != mid+8 { - t.Fatalf("reader size does not match, got %d, expected %d", size, mid+8) - } - - size, err = mr.Seek(10, os.SEEK_CUR) - if err != nil { - t.Fatal(err) - } - if size != mid+18 { - t.Fatalf("reader size does not match, got %d, expected %d", size, mid+18) - } -} - -func TestMultiReadSeekerSmallReads(t *testing.T) { - readers := []io.ReadSeeker{} - for i := 0; i < 10; i++ { - integer := make([]byte, 4, 4) - binary.BigEndian.PutUint32(integer, uint32(i)) - readers = append(readers, bytes.NewReader(integer)) - } - - reader := MultiReadSeeker(readers...) - for i := 0; i < 10; i++ { - var integer uint32 - if err := binary.Read(reader, binary.BigEndian, &integer); err != nil { - t.Fatalf("Read from NewMultiReadSeeker failed: %v", err) - } - if uint32(i) != integer { - t.Fatalf("Read wrong value from NewMultiReadSeeker: %d != %d", i, integer) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/readers.go b/vendor/github.com/docker/docker/pkg/ioutils/readers.go deleted file mode 100644 index 63f3c07f4..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/readers.go +++ /dev/null @@ -1,154 +0,0 @@ -package ioutils - -import ( - "crypto/sha256" - "encoding/hex" - "io" - - "golang.org/x/net/context" -) - -type readCloserWrapper struct { - io.Reader - closer func() error -} - -func (r *readCloserWrapper) Close() error { - return r.closer() -} - -// NewReadCloserWrapper returns a new io.ReadCloser. -func NewReadCloserWrapper(r io.Reader, closer func() error) io.ReadCloser { - return &readCloserWrapper{ - Reader: r, - closer: closer, - } -} - -type readerErrWrapper struct { - reader io.Reader - closer func() -} - -func (r *readerErrWrapper) Read(p []byte) (int, error) { - n, err := r.reader.Read(p) - if err != nil { - r.closer() - } - return n, err -} - -// NewReaderErrWrapper returns a new io.Reader. -func NewReaderErrWrapper(r io.Reader, closer func()) io.Reader { - return &readerErrWrapper{ - reader: r, - closer: closer, - } -} - -// HashData returns the sha256 sum of src. -func HashData(src io.Reader) (string, error) { - h := sha256.New() - if _, err := io.Copy(h, src); err != nil { - return "", err - } - return "sha256:" + hex.EncodeToString(h.Sum(nil)), nil -} - -// OnEOFReader wraps an io.ReadCloser and a function -// the function will run at the end of file or close the file. -type OnEOFReader struct { - Rc io.ReadCloser - Fn func() -} - -func (r *OnEOFReader) Read(p []byte) (n int, err error) { - n, err = r.Rc.Read(p) - if err == io.EOF { - r.runFunc() - } - return -} - -// Close closes the file and run the function. -func (r *OnEOFReader) Close() error { - err := r.Rc.Close() - r.runFunc() - return err -} - -func (r *OnEOFReader) runFunc() { - if fn := r.Fn; fn != nil { - fn() - r.Fn = nil - } -} - -// cancelReadCloser wraps an io.ReadCloser with a context for cancelling read -// operations. -type cancelReadCloser struct { - cancel func() - pR *io.PipeReader // Stream to read from - pW *io.PipeWriter -} - -// NewCancelReadCloser creates a wrapper that closes the ReadCloser when the -// context is cancelled. The returned io.ReadCloser must be closed when it is -// no longer needed. -func NewCancelReadCloser(ctx context.Context, in io.ReadCloser) io.ReadCloser { - pR, pW := io.Pipe() - - // Create a context used to signal when the pipe is closed - doneCtx, cancel := context.WithCancel(context.Background()) - - p := &cancelReadCloser{ - cancel: cancel, - pR: pR, - pW: pW, - } - - go func() { - _, err := io.Copy(pW, in) - select { - case <-ctx.Done(): - // If the context was closed, p.closeWithError - // was already called. Calling it again would - // change the error that Read returns. - default: - p.closeWithError(err) - } - in.Close() - }() - go func() { - for { - select { - case <-ctx.Done(): - p.closeWithError(ctx.Err()) - case <-doneCtx.Done(): - return - } - } - }() - - return p -} - -// Read wraps the Read method of the pipe that provides data from the wrapped -// ReadCloser. -func (p *cancelReadCloser) Read(buf []byte) (n int, err error) { - return p.pR.Read(buf) -} - -// closeWithError closes the wrapper and its underlying reader. It will -// cause future calls to Read to return err. -func (p *cancelReadCloser) closeWithError(err error) { - p.pW.CloseWithError(err) - p.cancel() -} - -// Close closes the wrapper its underlying reader. It will cause -// future calls to Read to return io.EOF. -func (p *cancelReadCloser) Close() error { - p.closeWithError(io.EOF) - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/readers_test.go b/vendor/github.com/docker/docker/pkg/ioutils/readers_test.go deleted file mode 100644 index 9abc1054d..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/readers_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package ioutils - -import ( - "fmt" - "io/ioutil" - "strings" - "testing" - "time" - - "golang.org/x/net/context" -) - -// Implement io.Reader -type errorReader struct{} - -func (r *errorReader) Read(p []byte) (int, error) { - return 0, fmt.Errorf("Error reader always fail.") -} - -func TestReadCloserWrapperClose(t *testing.T) { - reader := strings.NewReader("A string reader") - wrapper := NewReadCloserWrapper(reader, func() error { - return fmt.Errorf("This will be called when closing") - }) - err := wrapper.Close() - if err == nil || !strings.Contains(err.Error(), "This will be called when closing") { - t.Fatalf("readCloserWrapper should have call the anonymous func and thus, fail.") - } -} - -func TestReaderErrWrapperReadOnError(t *testing.T) { - called := false - reader := &errorReader{} - wrapper := NewReaderErrWrapper(reader, func() { - called = true - }) - _, err := wrapper.Read([]byte{}) - if err == nil || !strings.Contains(err.Error(), "Error reader always fail.") { - t.Fatalf("readErrWrapper should returned an error") - } - if !called { - t.Fatalf("readErrWrapper should have call the anonymous function on failure") - } -} - -func TestReaderErrWrapperRead(t *testing.T) { - reader := strings.NewReader("a string reader.") - wrapper := NewReaderErrWrapper(reader, func() { - t.Fatalf("readErrWrapper should not have called the anonymous function") - }) - // Read 20 byte (should be ok with the string above) - num, err := wrapper.Read(make([]byte, 20)) - if err != nil { - t.Fatal(err) - } - if num != 16 { - t.Fatalf("readerErrWrapper should have read 16 byte, but read %d", num) - } -} - -func TestHashData(t *testing.T) { - reader := strings.NewReader("hash-me") - actual, err := HashData(reader) - if err != nil { - t.Fatal(err) - } - expected := "sha256:4d11186aed035cc624d553e10db358492c84a7cd6b9670d92123c144930450aa" - if actual != expected { - t.Fatalf("Expecting %s, got %s", expected, actual) - } -} - -type perpetualReader struct{} - -func (p *perpetualReader) Read(buf []byte) (n int, err error) { - for i := 0; i != len(buf); i++ { - buf[i] = 'a' - } - return len(buf), nil -} - -func TestCancelReadCloser(t *testing.T) { - ctx, _ := context.WithTimeout(context.Background(), 100*time.Millisecond) - cancelReadCloser := NewCancelReadCloser(ctx, ioutil.NopCloser(&perpetualReader{})) - for { - var buf [128]byte - _, err := cancelReadCloser.Read(buf[:]) - if err == context.DeadlineExceeded { - break - } else if err != nil { - t.Fatalf("got unexpected error: %v", err) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go b/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go deleted file mode 100644 index 1539ad21b..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build !windows - -package ioutils - -import "io/ioutil" - -// TempDir on Unix systems is equivalent to ioutil.TempDir. -func TempDir(dir, prefix string) (string, error) { - return ioutil.TempDir(dir, prefix) -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go b/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go deleted file mode 100644 index c258e5fdd..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build windows - -package ioutils - -import ( - "io/ioutil" - - "github.com/docker/docker/pkg/longpath" -) - -// TempDir is the equivalent of ioutil.TempDir, except that the result is in Windows longpath format. -func TempDir(dir, prefix string) (string, error) { - tempDir, err := ioutil.TempDir(dir, prefix) - if err != nil { - return "", err - } - return longpath.AddPrefix(tempDir), nil -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go b/vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go deleted file mode 100644 index 52a4901ad..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go +++ /dev/null @@ -1,92 +0,0 @@ -package ioutils - -import ( - "io" - "sync" -) - -// WriteFlusher wraps the Write and Flush operation ensuring that every write -// is a flush. In addition, the Close method can be called to intercept -// Read/Write calls if the targets lifecycle has already ended. -type WriteFlusher struct { - w io.Writer - flusher flusher - flushed chan struct{} - flushedOnce sync.Once - closed chan struct{} - closeLock sync.Mutex -} - -type flusher interface { - Flush() -} - -var errWriteFlusherClosed = io.EOF - -func (wf *WriteFlusher) Write(b []byte) (n int, err error) { - select { - case <-wf.closed: - return 0, errWriteFlusherClosed - default: - } - - n, err = wf.w.Write(b) - wf.Flush() // every write is a flush. - return n, err -} - -// Flush the stream immediately. -func (wf *WriteFlusher) Flush() { - select { - case <-wf.closed: - return - default: - } - - wf.flushedOnce.Do(func() { - close(wf.flushed) - }) - wf.flusher.Flush() -} - -// Flushed returns the state of flushed. -// If it's flushed, return true, or else it return false. -func (wf *WriteFlusher) Flushed() bool { - // BUG(stevvooe): Remove this method. Its use is inherently racy. Seems to - // be used to detect whether or a response code has been issued or not. - // Another hook should be used instead. - var flushed bool - select { - case <-wf.flushed: - flushed = true - default: - } - return flushed -} - -// Close closes the write flusher, disallowing any further writes to the -// target. After the flusher is closed, all calls to write or flush will -// result in an error. -func (wf *WriteFlusher) Close() error { - wf.closeLock.Lock() - defer wf.closeLock.Unlock() - - select { - case <-wf.closed: - return errWriteFlusherClosed - default: - close(wf.closed) - } - return nil -} - -// NewWriteFlusher returns a new WriteFlusher. -func NewWriteFlusher(w io.Writer) *WriteFlusher { - var fl flusher - if f, ok := w.(flusher); ok { - fl = f - } else { - fl = &NopFlusher{} - } - return &WriteFlusher{w: w, flusher: fl, closed: make(chan struct{}), flushed: make(chan struct{})} -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/writers.go b/vendor/github.com/docker/docker/pkg/ioutils/writers.go deleted file mode 100644 index ccc7f9c23..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/writers.go +++ /dev/null @@ -1,66 +0,0 @@ -package ioutils - -import "io" - -// NopWriter represents a type which write operation is nop. -type NopWriter struct{} - -func (*NopWriter) Write(buf []byte) (int, error) { - return len(buf), nil -} - -type nopWriteCloser struct { - io.Writer -} - -func (w *nopWriteCloser) Close() error { return nil } - -// NopWriteCloser returns a nopWriteCloser. -func NopWriteCloser(w io.Writer) io.WriteCloser { - return &nopWriteCloser{w} -} - -// NopFlusher represents a type which flush operation is nop. -type NopFlusher struct{} - -// Flush is a nop operation. -func (f *NopFlusher) Flush() {} - -type writeCloserWrapper struct { - io.Writer - closer func() error -} - -func (r *writeCloserWrapper) Close() error { - return r.closer() -} - -// NewWriteCloserWrapper returns a new io.WriteCloser. -func NewWriteCloserWrapper(r io.Writer, closer func() error) io.WriteCloser { - return &writeCloserWrapper{ - Writer: r, - closer: closer, - } -} - -// WriteCounter wraps a concrete io.Writer and hold a count of the number -// of bytes written to the writer during a "session". -// This can be convenient when write return is masked -// (e.g., json.Encoder.Encode()) -type WriteCounter struct { - Count int64 - Writer io.Writer -} - -// NewWriteCounter returns a new WriteCounter. -func NewWriteCounter(w io.Writer) *WriteCounter { - return &WriteCounter{ - Writer: w, - } -} - -func (wc *WriteCounter) Write(p []byte) (count int, err error) { - count, err = wc.Writer.Write(p) - wc.Count += int64(count) - return -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/writers_test.go b/vendor/github.com/docker/docker/pkg/ioutils/writers_test.go deleted file mode 100644 index 564b1cd4f..000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/writers_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package ioutils - -import ( - "bytes" - "strings" - "testing" -) - -func TestWriteCloserWrapperClose(t *testing.T) { - called := false - writer := bytes.NewBuffer([]byte{}) - wrapper := NewWriteCloserWrapper(writer, func() error { - called = true - return nil - }) - if err := wrapper.Close(); err != nil { - t.Fatal(err) - } - if !called { - t.Fatalf("writeCloserWrapper should have call the anonymous function.") - } -} - -func TestNopWriteCloser(t *testing.T) { - writer := bytes.NewBuffer([]byte{}) - wrapper := NopWriteCloser(writer) - if err := wrapper.Close(); err != nil { - t.Fatal("NopWriteCloser always return nil on Close.") - } - -} - -func TestNopWriter(t *testing.T) { - nw := &NopWriter{} - l, err := nw.Write([]byte{'c'}) - if err != nil { - t.Fatal(err) - } - if l != 1 { - t.Fatalf("Expected 1 got %d", l) - } -} - -func TestWriteCounter(t *testing.T) { - dummy1 := "This is a dummy string." - dummy2 := "This is another dummy string." - totalLength := int64(len(dummy1) + len(dummy2)) - - reader1 := strings.NewReader(dummy1) - reader2 := strings.NewReader(dummy2) - - var buffer bytes.Buffer - wc := NewWriteCounter(&buffer) - - reader1.WriteTo(wc) - reader2.WriteTo(wc) - - if wc.Count != totalLength { - t.Errorf("Wrong count: %d vs. %d", wc.Count, totalLength) - } - - if buffer.String() != dummy1+dummy2 { - t.Error("Wrong message written") - } -} diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog.go b/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog.go deleted file mode 100644 index 4734c3111..000000000 --- a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog.go +++ /dev/null @@ -1,42 +0,0 @@ -package jsonlog - -import ( - "encoding/json" - "fmt" - "time" -) - -// JSONLog represents a log message, typically a single entry from a given log stream. -// JSONLogs can be easily serialized to and from JSON and support custom formatting. -type JSONLog struct { - // Log is the log message - Log string `json:"log,omitempty"` - // Stream is the log source - Stream string `json:"stream,omitempty"` - // Created is the created timestamp of log - Created time.Time `json:"time"` - // Attrs is the list of extra attributes provided by the user - Attrs map[string]string `json:"attrs,omitempty"` -} - -// Format returns the log formatted according to format -// If format is nil, returns the log message -// If format is json, returns the log marshaled in json format -// By default, returns the log with the log time formatted according to format. -func (jl *JSONLog) Format(format string) (string, error) { - if format == "" { - return jl.Log, nil - } - if format == "json" { - m, err := json.Marshal(jl) - return string(m), err - } - return fmt.Sprintf("%s %s", jl.Created.Format(format), jl.Log), nil -} - -// Reset resets the log to nil. -func (jl *JSONLog) Reset() { - jl.Log = "" - jl.Stream = "" - jl.Created = time.Time{} -} diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling.go b/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling.go deleted file mode 100644 index 83ce684a8..000000000 --- a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling.go +++ /dev/null @@ -1,178 +0,0 @@ -// This code was initially generated by ffjson -// This code was generated via the following steps: -// $ go get -u github.com/pquerna/ffjson -// $ make BIND_DIR=. shell -// $ ffjson pkg/jsonlog/jsonlog.go -// $ mv pkg/jsonglog/jsonlog_ffjson.go pkg/jsonlog/jsonlog_marshalling.go -// -// It has been modified to improve the performance of time marshalling to JSON -// and to clean it up. -// Should this code need to be regenerated when the JSONLog struct is changed, -// the relevant changes which have been made are: -// import ( -// "bytes" -//- -// "unicode/utf8" -// ) -// -// func (mj *JSONLog) MarshalJSON() ([]byte, error) { -//@@ -20,13 +16,13 @@ func (mj *JSONLog) MarshalJSON() ([]byte, error) { -// } -// return buf.Bytes(), nil -// } -//+ -// func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error { -//- var err error -//- var obj []byte -//- var first bool = true -//- _ = obj -//- _ = err -//- _ = first -//+ var ( -//+ err error -//+ timestamp string -//+ first bool = true -//+ ) -// buf.WriteString(`{`) -// if len(mj.Log) != 0 { -// if first == true { -//@@ -52,11 +48,11 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error { -// buf.WriteString(`,`) -// } -// buf.WriteString(`"time":`) -//- obj, err = mj.Created.MarshalJSON() -//+ timestamp, err = FastTimeMarshalJSON(mj.Created) -// if err != nil { -// return err -// } -//- buf.Write(obj) -//+ buf.WriteString(timestamp) -// buf.WriteString(`}`) -// return nil -// } -// @@ -81,9 +81,10 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error { -// if len(mj.Log) != 0 { -// - if first == true { -// - first = false -// - } else { -// - buf.WriteString(`,`) -// - } -// + first = false -// buf.WriteString(`"log":`) -// ffjsonWriteJSONString(buf, mj.Log) -// } - -package jsonlog - -import ( - "bytes" - "unicode/utf8" -) - -// MarshalJSON marshals the JSONLog. -func (mj *JSONLog) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - buf.Grow(1024) - if err := mj.MarshalJSONBuf(&buf); err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -// MarshalJSONBuf marshals the JSONLog and stores the result to a bytes.Buffer. -func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error { - var ( - err error - timestamp string - first = true - ) - buf.WriteString(`{`) - if len(mj.Log) != 0 { - first = false - buf.WriteString(`"log":`) - ffjsonWriteJSONString(buf, mj.Log) - } - if len(mj.Stream) != 0 { - if first { - first = false - } else { - buf.WriteString(`,`) - } - buf.WriteString(`"stream":`) - ffjsonWriteJSONString(buf, mj.Stream) - } - if !first { - buf.WriteString(`,`) - } - buf.WriteString(`"time":`) - timestamp, err = FastTimeMarshalJSON(mj.Created) - if err != nil { - return err - } - buf.WriteString(timestamp) - buf.WriteString(`}`) - return nil -} - -func ffjsonWriteJSONString(buf *bytes.Buffer, s string) { - const hex = "0123456789abcdef" - - buf.WriteByte('"') - start := 0 - for i := 0; i < len(s); { - if b := s[i]; b < utf8.RuneSelf { - if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' { - i++ - continue - } - if start < i { - buf.WriteString(s[start:i]) - } - switch b { - case '\\', '"': - buf.WriteByte('\\') - buf.WriteByte(b) - case '\n': - buf.WriteByte('\\') - buf.WriteByte('n') - case '\r': - buf.WriteByte('\\') - buf.WriteByte('r') - default: - - buf.WriteString(`\u00`) - buf.WriteByte(hex[b>>4]) - buf.WriteByte(hex[b&0xF]) - } - i++ - start = i - continue - } - c, size := utf8.DecodeRuneInString(s[i:]) - if c == utf8.RuneError && size == 1 { - if start < i { - buf.WriteString(s[start:i]) - } - buf.WriteString(`\ufffd`) - i += size - start = i - continue - } - - if c == '\u2028' || c == '\u2029' { - if start < i { - buf.WriteString(s[start:i]) - } - buf.WriteString(`\u202`) - buf.WriteByte(hex[c&0xF]) - i += size - start = i - continue - } - i += size - } - if start < len(s) { - buf.WriteString(s[start:]) - } - buf.WriteByte('"') -} diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling_test.go b/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling_test.go deleted file mode 100644 index 3edb27141..000000000 --- a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package jsonlog - -import ( - "regexp" - "testing" -) - -func TestJSONLogMarshalJSON(t *testing.T) { - logs := map[*JSONLog]string{ - &JSONLog{Log: `"A log line with \\"`}: `^{\"log\":\"\\\"A log line with \\\\\\\\\\\"\",\"time\":\".{20,}\"}$`, - &JSONLog{Log: "A log line"}: `^{\"log\":\"A log line\",\"time\":\".{20,}\"}$`, - &JSONLog{Log: "A log line with \r"}: `^{\"log\":\"A log line with \\r\",\"time\":\".{20,}\"}$`, - &JSONLog{Log: "A log line with & < >"}: `^{\"log\":\"A log line with \\u0026 \\u003c \\u003e\",\"time\":\".{20,}\"}$`, - &JSONLog{Log: "A log line with utf8 : 🚀 ψ ω β"}: `^{\"log\":\"A log line with utf8 : 🚀 ψ ω β\",\"time\":\".{20,}\"}$`, - &JSONLog{Stream: "stdout"}: `^{\"stream\":\"stdout\",\"time\":\".{20,}\"}$`, - &JSONLog{}: `^{\"time\":\".{20,}\"}$`, - // These ones are a little weird - &JSONLog{Log: "\u2028 \u2029"}: `^{\"log\":\"\\u2028 \\u2029\",\"time\":\".{20,}\"}$`, - &JSONLog{Log: string([]byte{0xaF})}: `^{\"log\":\"\\ufffd\",\"time\":\".{20,}\"}$`, - &JSONLog{Log: string([]byte{0x7F})}: `^{\"log\":\"\x7f\",\"time\":\".{20,}\"}$`, - } - for jsonLog, expression := range logs { - data, err := jsonLog.MarshalJSON() - if err != nil { - t.Fatal(err) - } - res := string(data) - t.Logf("Result of WriteLog: %q", res) - logRe := regexp.MustCompile(expression) - if !logRe.MatchString(res) { - t.Fatalf("Log line not in expected format [%v]: %q", expression, res) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes.go b/vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes.go deleted file mode 100644 index df522c0d6..000000000 --- a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes.go +++ /dev/null @@ -1,122 +0,0 @@ -package jsonlog - -import ( - "bytes" - "encoding/json" - "unicode/utf8" -) - -// JSONLogs is based on JSONLog. -// It allows marshalling JSONLog from Log as []byte -// and an already marshalled Created timestamp. -type JSONLogs struct { - Log []byte `json:"log,omitempty"` - Stream string `json:"stream,omitempty"` - Created string `json:"time"` - - // json-encoded bytes - RawAttrs json.RawMessage `json:"attrs,omitempty"` -} - -// MarshalJSONBuf is based on the same method from JSONLog -// It has been modified to take into account the necessary changes. -func (mj *JSONLogs) MarshalJSONBuf(buf *bytes.Buffer) error { - var first = true - - buf.WriteString(`{`) - if len(mj.Log) != 0 { - first = false - buf.WriteString(`"log":`) - ffjsonWriteJSONBytesAsString(buf, mj.Log) - } - if len(mj.Stream) != 0 { - if first == true { - first = false - } else { - buf.WriteString(`,`) - } - buf.WriteString(`"stream":`) - ffjsonWriteJSONString(buf, mj.Stream) - } - if len(mj.RawAttrs) > 0 { - if first { - first = false - } else { - buf.WriteString(`,`) - } - buf.WriteString(`"attrs":`) - buf.Write(mj.RawAttrs) - } - if !first { - buf.WriteString(`,`) - } - buf.WriteString(`"time":`) - buf.WriteString(mj.Created) - buf.WriteString(`}`) - return nil -} - -// This is based on ffjsonWriteJSONBytesAsString. It has been changed -// to accept a string passed as a slice of bytes. -func ffjsonWriteJSONBytesAsString(buf *bytes.Buffer, s []byte) { - const hex = "0123456789abcdef" - - buf.WriteByte('"') - start := 0 - for i := 0; i < len(s); { - if b := s[i]; b < utf8.RuneSelf { - if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' { - i++ - continue - } - if start < i { - buf.Write(s[start:i]) - } - switch b { - case '\\', '"': - buf.WriteByte('\\') - buf.WriteByte(b) - case '\n': - buf.WriteByte('\\') - buf.WriteByte('n') - case '\r': - buf.WriteByte('\\') - buf.WriteByte('r') - default: - - buf.WriteString(`\u00`) - buf.WriteByte(hex[b>>4]) - buf.WriteByte(hex[b&0xF]) - } - i++ - start = i - continue - } - c, size := utf8.DecodeRune(s[i:]) - if c == utf8.RuneError && size == 1 { - if start < i { - buf.Write(s[start:i]) - } - buf.WriteString(`\ufffd`) - i += size - start = i - continue - } - - if c == '\u2028' || c == '\u2029' { - if start < i { - buf.Write(s[start:i]) - } - buf.WriteString(`\u202`) - buf.WriteByte(hex[c&0xF]) - i += size - start = i - continue - } - i += size - } - if start < len(s) { - buf.Write(s[start:]) - } - buf.WriteByte('"') -} diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes_test.go b/vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes_test.go deleted file mode 100644 index 6d6ad2158..000000000 --- a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package jsonlog - -import ( - "bytes" - "regexp" - "testing" -) - -func TestJSONLogsMarshalJSONBuf(t *testing.T) { - logs := map[*JSONLogs]string{ - &JSONLogs{Log: []byte(`"A log line with \\"`)}: `^{\"log\":\"\\\"A log line with \\\\\\\\\\\"\",\"time\":}$`, - &JSONLogs{Log: []byte("A log line")}: `^{\"log\":\"A log line\",\"time\":}$`, - &JSONLogs{Log: []byte("A log line with \r")}: `^{\"log\":\"A log line with \\r\",\"time\":}$`, - &JSONLogs{Log: []byte("A log line with & < >")}: `^{\"log\":\"A log line with \\u0026 \\u003c \\u003e\",\"time\":}$`, - &JSONLogs{Log: []byte("A log line with utf8 : 🚀 ψ ω β")}: `^{\"log\":\"A log line with utf8 : 🚀 ψ ω β\",\"time\":}$`, - &JSONLogs{Stream: "stdout"}: `^{\"stream\":\"stdout\",\"time\":}$`, - &JSONLogs{Stream: "stdout", Log: []byte("A log line")}: `^{\"log\":\"A log line\",\"stream\":\"stdout\",\"time\":}$`, - &JSONLogs{Created: "time"}: `^{\"time\":time}$`, - &JSONLogs{}: `^{\"time\":}$`, - // These ones are a little weird - &JSONLogs{Log: []byte("\u2028 \u2029")}: `^{\"log\":\"\\u2028 \\u2029\",\"time\":}$`, - &JSONLogs{Log: []byte{0xaF}}: `^{\"log\":\"\\ufffd\",\"time\":}$`, - &JSONLogs{Log: []byte{0x7F}}: `^{\"log\":\"\x7f\",\"time\":}$`, - // with raw attributes - &JSONLogs{Log: []byte("A log line"), RawAttrs: []byte(`{"hello":"world","value":1234}`)}: `^{\"log\":\"A log line\",\"attrs\":{\"hello\":\"world\",\"value\":1234},\"time\":}$`, - } - for jsonLog, expression := range logs { - var buf bytes.Buffer - if err := jsonLog.MarshalJSONBuf(&buf); err != nil { - t.Fatal(err) - } - res := buf.String() - t.Logf("Result of WriteLog: %q", res) - logRe := regexp.MustCompile(expression) - if !logRe.MatchString(res) { - t.Fatalf("Log line not in expected format [%v]: %q", expression, res) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling.go b/vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling.go deleted file mode 100644 index 211733814..000000000 --- a/vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling.go +++ /dev/null @@ -1,27 +0,0 @@ -// Package jsonlog provides helper functions to parse and print time (time.Time) as JSON. -package jsonlog - -import ( - "errors" - "time" -) - -const ( - // RFC3339NanoFixed is our own version of RFC339Nano because we want one - // that pads the nano seconds part with zeros to ensure - // the timestamps are aligned in the logs. - RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" - // JSONFormat is the format used by FastMarshalJSON - JSONFormat = `"` + time.RFC3339Nano + `"` -) - -// FastTimeMarshalJSON avoids one of the extra allocations that -// time.MarshalJSON is making. -func FastTimeMarshalJSON(t time.Time) (string, error) { - if y := t.Year(); y < 0 || y >= 10000 { - // RFC 3339 is clear that years are 4 digits exactly. - // See golang.org/issue/4556#c15 for more discussion. - return "", errors.New("time.MarshalJSON: year outside of range [0,9999]") - } - return t.Format(JSONFormat), nil -} diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling_test.go b/vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling_test.go deleted file mode 100644 index 02d0302c4..000000000 --- a/vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package jsonlog - -import ( - "testing" - "time" -) - -// Testing to ensure 'year' fields is between 0 and 9999 -func TestFastTimeMarshalJSONWithInvalidDate(t *testing.T) { - aTime := time.Date(-1, 1, 1, 0, 0, 0, 0, time.Local) - json, err := FastTimeMarshalJSON(aTime) - if err == nil { - t.Fatalf("FastTimeMarshalJSON should throw an error, but was '%v'", json) - } - anotherTime := time.Date(10000, 1, 1, 0, 0, 0, 0, time.Local) - json, err = FastTimeMarshalJSON(anotherTime) - if err == nil { - t.Fatalf("FastTimeMarshalJSON should throw an error, but was '%v'", json) - } - -} - -func TestFastTimeMarshalJSON(t *testing.T) { - aTime := time.Date(2015, 5, 29, 11, 1, 2, 3, time.UTC) - json, err := FastTimeMarshalJSON(aTime) - if err != nil { - t.Fatal(err) - } - expected := "\"2015-05-29T11:01:02.000000003Z\"" - if json != expected { - t.Fatalf("Expected %v, got %v", expected, json) - } - - location, err := time.LoadLocation("Europe/Paris") - if err != nil { - t.Fatal(err) - } - aTime = time.Date(2015, 5, 29, 11, 1, 2, 3, location) - json, err = FastTimeMarshalJSON(aTime) - if err != nil { - t.Fatal(err) - } - expected = "\"2015-05-29T11:01:02.000000003+02:00\"" - if json != expected { - t.Fatalf("Expected %v, got %v", expected, json) - } -} diff --git a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go deleted file mode 100644 index 5481433c5..000000000 --- a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go +++ /dev/null @@ -1,225 +0,0 @@ -package jsonmessage - -import ( - "encoding/json" - "fmt" - "io" - "strings" - "time" - - "github.com/docker/docker/pkg/jsonlog" - "github.com/docker/docker/pkg/term" - "github.com/docker/go-units" -) - -// JSONError wraps a concrete Code and Message, `Code` is -// is an integer error code, `Message` is the error message. -type JSONError struct { - Code int `json:"code,omitempty"` - Message string `json:"message,omitempty"` -} - -func (e *JSONError) Error() string { - return e.Message -} - -// JSONProgress describes a Progress. terminalFd is the fd of the current terminal, -// Start is the initial value for the operation. Current is the current status and -// value of the progress made towards Total. Total is the end value describing when -// we made 100% progress for an operation. -type JSONProgress struct { - terminalFd uintptr - Current int64 `json:"current,omitempty"` - Total int64 `json:"total,omitempty"` - Start int64 `json:"start,omitempty"` -} - -func (p *JSONProgress) String() string { - var ( - width = 200 - pbBox string - numbersBox string - timeLeftBox string - ) - - ws, err := term.GetWinsize(p.terminalFd) - if err == nil { - width = int(ws.Width) - } - - if p.Current <= 0 && p.Total <= 0 { - return "" - } - current := units.HumanSize(float64(p.Current)) - if p.Total <= 0 { - return fmt.Sprintf("%8v", current) - } - total := units.HumanSize(float64(p.Total)) - percentage := int(float64(p.Current)/float64(p.Total)*100) / 2 - if percentage > 50 { - percentage = 50 - } - if width > 110 { - // this number can't be negative gh#7136 - numSpaces := 0 - if 50-percentage > 0 { - numSpaces = 50 - percentage - } - pbBox = fmt.Sprintf("[%s>%s] ", strings.Repeat("=", percentage), strings.Repeat(" ", numSpaces)) - } - - numbersBox = fmt.Sprintf("%8v/%v", current, total) - - if p.Current > p.Total { - // remove total display if the reported current is wonky. - numbersBox = fmt.Sprintf("%8v", current) - } - - if p.Current > 0 && p.Start > 0 && percentage < 50 { - fromStart := time.Now().UTC().Sub(time.Unix(p.Start, 0)) - perEntry := fromStart / time.Duration(p.Current) - left := time.Duration(p.Total-p.Current) * perEntry - left = (left / time.Second) * time.Second - - if width > 50 { - timeLeftBox = " " + left.String() - } - } - return pbBox + numbersBox + timeLeftBox -} - -// JSONMessage defines a message struct. It describes -// the created time, where it from, status, ID of the -// message. It's used for docker events. -type JSONMessage struct { - Stream string `json:"stream,omitempty"` - Status string `json:"status,omitempty"` - Progress *JSONProgress `json:"progressDetail,omitempty"` - ProgressMessage string `json:"progress,omitempty"` //deprecated - ID string `json:"id,omitempty"` - From string `json:"from,omitempty"` - Time int64 `json:"time,omitempty"` - TimeNano int64 `json:"timeNano,omitempty"` - Error *JSONError `json:"errorDetail,omitempty"` - ErrorMessage string `json:"error,omitempty"` //deprecated - // Aux contains out-of-band data, such as digests for push signing. - Aux *json.RawMessage `json:"aux,omitempty"` -} - -// Display displays the JSONMessage to `out`. `isTerminal` describes if `out` -// is a terminal. If this is the case, it will erase the entire current line -// when displaying the progressbar. -func (jm *JSONMessage) Display(out io.Writer, isTerminal bool) error { - if jm.Error != nil { - if jm.Error.Code == 401 { - return fmt.Errorf("Authentication is required.") - } - return jm.Error - } - var endl string - if isTerminal && jm.Stream == "" && jm.Progress != nil { - // [2K = erase entire current line - fmt.Fprintf(out, "%c[2K\r", 27) - endl = "\r" - } else if jm.Progress != nil && jm.Progress.String() != "" { //disable progressbar in non-terminal - return nil - } - if jm.TimeNano != 0 { - fmt.Fprintf(out, "%s ", time.Unix(0, jm.TimeNano).Format(jsonlog.RFC3339NanoFixed)) - } else if jm.Time != 0 { - fmt.Fprintf(out, "%s ", time.Unix(jm.Time, 0).Format(jsonlog.RFC3339NanoFixed)) - } - if jm.ID != "" { - fmt.Fprintf(out, "%s: ", jm.ID) - } - if jm.From != "" { - fmt.Fprintf(out, "(from %s) ", jm.From) - } - if jm.Progress != nil && isTerminal { - fmt.Fprintf(out, "%s %s%s", jm.Status, jm.Progress.String(), endl) - } else if jm.ProgressMessage != "" { //deprecated - fmt.Fprintf(out, "%s %s%s", jm.Status, jm.ProgressMessage, endl) - } else if jm.Stream != "" { - fmt.Fprintf(out, "%s%s", jm.Stream, endl) - } else { - fmt.Fprintf(out, "%s%s\n", jm.Status, endl) - } - return nil -} - -// DisplayJSONMessagesStream displays a json message stream from `in` to `out`, `isTerminal` -// describes if `out` is a terminal. If this is the case, it will print `\n` at the end of -// each line and move the cursor while displaying. -func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(*json.RawMessage)) error { - var ( - dec = json.NewDecoder(in) - ids = make(map[string]int) - ) - for { - diff := 0 - var jm JSONMessage - if err := dec.Decode(&jm); err != nil { - if err == io.EOF { - break - } - return err - } - - if jm.Aux != nil { - if auxCallback != nil { - auxCallback(jm.Aux) - } - continue - } - - if jm.Progress != nil { - jm.Progress.terminalFd = terminalFd - } - if jm.ID != "" && (jm.Progress != nil || jm.ProgressMessage != "") { - line, ok := ids[jm.ID] - if !ok { - // NOTE: This approach of using len(id) to - // figure out the number of lines of history - // only works as long as we clear the history - // when we output something that's not - // accounted for in the map, such as a line - // with no ID. - line = len(ids) - ids[jm.ID] = line - if isTerminal { - fmt.Fprintf(out, "\n") - } - } - diff = len(ids) - line - if isTerminal && diff > 0 { - fmt.Fprintf(out, "%c[%dA", 27, diff) - } - } else { - // When outputting something that isn't progress - // output, clear the history of previous lines. We - // don't want progress entries from some previous - // operation to be updated (for example, pull -a - // with multiple tags). - ids = make(map[string]int) - } - err := jm.Display(out, isTerminal) - if jm.ID != "" && isTerminal && diff > 0 { - fmt.Fprintf(out, "%c[%dB", 27, diff) - } - if err != nil { - return err - } - } - return nil -} - -type stream interface { - io.Writer - FD() uintptr - IsTerminal() bool -} - -// DisplayJSONMessagesToStream prints json messages to the output stream -func DisplayJSONMessagesToStream(in io.Reader, stream stream, auxCallback func(*json.RawMessage)) error { - return DisplayJSONMessagesStream(in, stream, stream.FD(), stream.IsTerminal(), auxCallback) -} diff --git a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage_test.go b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage_test.go deleted file mode 100644 index c6c5b0ed2..000000000 --- a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage_test.go +++ /dev/null @@ -1,245 +0,0 @@ -package jsonmessage - -import ( - "bytes" - "fmt" - "strings" - "testing" - "time" - - "github.com/docker/docker/pkg/jsonlog" - "github.com/docker/docker/pkg/term" -) - -func TestError(t *testing.T) { - je := JSONError{404, "Not found"} - if je.Error() != "Not found" { - t.Fatalf("Expected 'Not found' got '%s'", je.Error()) - } -} - -func TestProgress(t *testing.T) { - termsz, err := term.GetWinsize(0) - if err != nil { - // we can safely ignore the err here - termsz = nil - } - jp := JSONProgress{} - if jp.String() != "" { - t.Fatalf("Expected empty string, got '%s'", jp.String()) - } - - expected := " 1 B" - jp2 := JSONProgress{Current: 1} - if jp2.String() != expected { - t.Fatalf("Expected %q, got %q", expected, jp2.String()) - } - - expectedStart := "[==========> ] 20 B/100 B" - if termsz != nil && termsz.Width <= 110 { - expectedStart = " 20 B/100 B" - } - jp3 := JSONProgress{Current: 20, Total: 100, Start: time.Now().Unix()} - // Just look at the start of the string - // (the remaining time is really hard to test -_-) - if jp3.String()[:len(expectedStart)] != expectedStart { - t.Fatalf("Expected to start with %q, got %q", expectedStart, jp3.String()) - } - - expected = "[=========================> ] 50 B/100 B" - if termsz != nil && termsz.Width <= 110 { - expected = " 50 B/100 B" - } - jp4 := JSONProgress{Current: 50, Total: 100} - if jp4.String() != expected { - t.Fatalf("Expected %q, got %q", expected, jp4.String()) - } - - // this number can't be negative gh#7136 - expected = "[==================================================>] 50 B" - if termsz != nil && termsz.Width <= 110 { - expected = " 50 B" - } - jp5 := JSONProgress{Current: 50, Total: 40} - if jp5.String() != expected { - t.Fatalf("Expected %q, got %q", expected, jp5.String()) - } -} - -func TestJSONMessageDisplay(t *testing.T) { - now := time.Now() - messages := map[JSONMessage][]string{ - // Empty - JSONMessage{}: {"\n", "\n"}, - // Status - JSONMessage{ - Status: "status", - }: { - "status\n", - "status\n", - }, - // General - JSONMessage{ - Time: now.Unix(), - ID: "ID", - From: "From", - Status: "status", - }: { - fmt.Sprintf("%v ID: (from From) status\n", time.Unix(now.Unix(), 0).Format(jsonlog.RFC3339NanoFixed)), - fmt.Sprintf("%v ID: (from From) status\n", time.Unix(now.Unix(), 0).Format(jsonlog.RFC3339NanoFixed)), - }, - // General, with nano precision time - JSONMessage{ - TimeNano: now.UnixNano(), - ID: "ID", - From: "From", - Status: "status", - }: { - fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(jsonlog.RFC3339NanoFixed)), - fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(jsonlog.RFC3339NanoFixed)), - }, - // General, with both times Nano is preferred - JSONMessage{ - Time: now.Unix(), - TimeNano: now.UnixNano(), - ID: "ID", - From: "From", - Status: "status", - }: { - fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(jsonlog.RFC3339NanoFixed)), - fmt.Sprintf("%v ID: (from From) status\n", time.Unix(0, now.UnixNano()).Format(jsonlog.RFC3339NanoFixed)), - }, - // Stream over status - JSONMessage{ - Status: "status", - Stream: "stream", - }: { - "stream", - "stream", - }, - // With progress message - JSONMessage{ - Status: "status", - ProgressMessage: "progressMessage", - }: { - "status progressMessage", - "status progressMessage", - }, - // With progress, stream empty - JSONMessage{ - Status: "status", - Stream: "", - Progress: &JSONProgress{Current: 1}, - }: { - "", - fmt.Sprintf("%c[2K\rstatus 1 B\r", 27), - }, - } - - // The tests :) - for jsonMessage, expectedMessages := range messages { - // Without terminal - data := bytes.NewBuffer([]byte{}) - if err := jsonMessage.Display(data, false); err != nil { - t.Fatal(err) - } - if data.String() != expectedMessages[0] { - t.Fatalf("Expected [%v], got [%v]", expectedMessages[0], data.String()) - } - // With terminal - data = bytes.NewBuffer([]byte{}) - if err := jsonMessage.Display(data, true); err != nil { - t.Fatal(err) - } - if data.String() != expectedMessages[1] { - t.Fatalf("Expected [%v], got [%v]", expectedMessages[1], data.String()) - } - } -} - -// Test JSONMessage with an Error. It will return an error with the text as error, not the meaning of the HTTP code. -func TestJSONMessageDisplayWithJSONError(t *testing.T) { - data := bytes.NewBuffer([]byte{}) - jsonMessage := JSONMessage{Error: &JSONError{404, "Can't find it"}} - - err := jsonMessage.Display(data, true) - if err == nil || err.Error() != "Can't find it" { - t.Fatalf("Expected a JSONError 404, got [%v]", err) - } - - jsonMessage = JSONMessage{Error: &JSONError{401, "Anything"}} - err = jsonMessage.Display(data, true) - if err == nil || err.Error() != "Authentication is required." { - t.Fatalf("Expected an error [Authentication is required.], got [%v]", err) - } -} - -func TestDisplayJSONMessagesStreamInvalidJSON(t *testing.T) { - var ( - inFd uintptr - ) - data := bytes.NewBuffer([]byte{}) - reader := strings.NewReader("This is not a 'valid' JSON []") - inFd, _ = term.GetFdInfo(reader) - - if err := DisplayJSONMessagesStream(reader, data, inFd, false, nil); err == nil && err.Error()[:17] != "invalid character" { - t.Fatalf("Should have thrown an error (invalid character in ..), got [%v]", err) - } -} - -func TestDisplayJSONMessagesStream(t *testing.T) { - var ( - inFd uintptr - ) - - messages := map[string][]string{ - // empty string - "": { - "", - ""}, - // Without progress & ID - "{ \"status\": \"status\" }": { - "status\n", - "status\n", - }, - // Without progress, with ID - "{ \"id\": \"ID\",\"status\": \"status\" }": { - "ID: status\n", - fmt.Sprintf("ID: status\n"), - }, - // With progress - "{ \"id\": \"ID\", \"status\": \"status\", \"progress\": \"ProgressMessage\" }": { - "ID: status ProgressMessage", - fmt.Sprintf("\n%c[%dAID: status ProgressMessage%c[%dB", 27, 1, 27, 1), - }, - // With progressDetail - "{ \"id\": \"ID\", \"status\": \"status\", \"progressDetail\": { \"Current\": 1} }": { - "", // progressbar is disabled in non-terminal - fmt.Sprintf("\n%c[%dA%c[2K\rID: status 1 B\r%c[%dB", 27, 1, 27, 27, 1), - }, - } - for jsonMessage, expectedMessages := range messages { - data := bytes.NewBuffer([]byte{}) - reader := strings.NewReader(jsonMessage) - inFd, _ = term.GetFdInfo(reader) - - // Without terminal - if err := DisplayJSONMessagesStream(reader, data, inFd, false, nil); err != nil { - t.Fatal(err) - } - if data.String() != expectedMessages[0] { - t.Fatalf("Expected an [%v], got [%v]", expectedMessages[0], data.String()) - } - - // With terminal - data = bytes.NewBuffer([]byte{}) - reader = strings.NewReader(jsonMessage) - if err := DisplayJSONMessagesStream(reader, data, inFd, true, nil); err != nil { - t.Fatal(err) - } - if data.String() != expectedMessages[1] { - t.Fatalf("Expected an [%v], got [%v]", expectedMessages[1], data.String()) - } - } - -} diff --git a/vendor/github.com/docker/docker/pkg/listeners/listeners_solaris.go b/vendor/github.com/docker/docker/pkg/listeners/listeners_solaris.go deleted file mode 100644 index ff833e374..000000000 --- a/vendor/github.com/docker/docker/pkg/listeners/listeners_solaris.go +++ /dev/null @@ -1,31 +0,0 @@ -package listeners - -import ( - "crypto/tls" - "fmt" - "net" - - "github.com/docker/go-connections/sockets" -) - -// Init creates new listeners for the server. -func Init(proto, addr, socketGroup string, tlsConfig *tls.Config) (ls []net.Listener, err error) { - switch proto { - case "tcp": - l, err := sockets.NewTCPSocket(addr, tlsConfig) - if err != nil { - return nil, err - } - ls = append(ls, l) - case "unix": - l, err := sockets.NewUnixSocket(addr, socketGroup) - if err != nil { - return nil, fmt.Errorf("can't create unix socket %s: %v", addr, err) - } - ls = append(ls, l) - default: - return nil, fmt.Errorf("Invalid protocol format: %q", proto) - } - - return -} diff --git a/vendor/github.com/docker/docker/pkg/listeners/listeners_unix.go b/vendor/github.com/docker/docker/pkg/listeners/listeners_unix.go deleted file mode 100644 index 1bcae7aa3..000000000 --- a/vendor/github.com/docker/docker/pkg/listeners/listeners_unix.go +++ /dev/null @@ -1,94 +0,0 @@ -// +build !windows,!solaris - -package listeners - -import ( - "crypto/tls" - "fmt" - "net" - "strconv" - - "github.com/Sirupsen/logrus" - "github.com/coreos/go-systemd/activation" - "github.com/docker/go-connections/sockets" -) - -// Init creates new listeners for the server. -// TODO: Clean up the fact that socketGroup and tlsConfig aren't always used. -func Init(proto, addr, socketGroup string, tlsConfig *tls.Config) ([]net.Listener, error) { - ls := []net.Listener{} - - switch proto { - case "fd": - fds, err := listenFD(addr, tlsConfig) - if err != nil { - return nil, err - } - ls = append(ls, fds...) - case "tcp": - l, err := sockets.NewTCPSocket(addr, tlsConfig) - if err != nil { - return nil, err - } - ls = append(ls, l) - case "unix": - l, err := sockets.NewUnixSocket(addr, socketGroup) - if err != nil { - return nil, fmt.Errorf("can't create unix socket %s: %v", addr, err) - } - ls = append(ls, l) - default: - return nil, fmt.Errorf("invalid protocol format: %q", proto) - } - - return ls, nil -} - -// listenFD returns the specified socket activated files as a slice of -// net.Listeners or all of the activated files if "*" is given. -func listenFD(addr string, tlsConfig *tls.Config) ([]net.Listener, error) { - var ( - err error - listeners []net.Listener - ) - // socket activation - if tlsConfig != nil { - listeners, err = activation.TLSListeners(false, tlsConfig) - } else { - listeners, err = activation.Listeners(false) - } - if err != nil { - return nil, err - } - - if len(listeners) == 0 { - return nil, fmt.Errorf("no sockets found via socket activation: make sure the service was started by systemd") - } - - // default to all fds just like unix:// and tcp:// - if addr == "" || addr == "*" { - return listeners, nil - } - - fdNum, err := strconv.Atoi(addr) - if err != nil { - return nil, fmt.Errorf("failed to parse systemd fd address: should be a number: %v", addr) - } - fdOffset := fdNum - 3 - if len(listeners) < int(fdOffset)+1 { - return nil, fmt.Errorf("too few socket activated files passed in by systemd") - } - if listeners[fdOffset] == nil { - return nil, fmt.Errorf("failed to listen on systemd activated file: fd %d", fdOffset+3) - } - for i, ls := range listeners { - if i == fdOffset || ls == nil { - continue - } - if err := ls.Close(); err != nil { - // TODO: We shouldn't log inside a library. Remove this or error out. - logrus.Errorf("failed to close systemd activated file: fd %d: %v", fdOffset+3, err) - } - } - return []net.Listener{listeners[fdOffset]}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/listeners/listeners_windows.go b/vendor/github.com/docker/docker/pkg/listeners/listeners_windows.go deleted file mode 100644 index 5b5a470fc..000000000 --- a/vendor/github.com/docker/docker/pkg/listeners/listeners_windows.go +++ /dev/null @@ -1,54 +0,0 @@ -package listeners - -import ( - "crypto/tls" - "fmt" - "net" - "strings" - - "github.com/Microsoft/go-winio" - "github.com/docker/go-connections/sockets" -) - -// Init creates new listeners for the server. -func Init(proto, addr, socketGroup string, tlsConfig *tls.Config) ([]net.Listener, error) { - ls := []net.Listener{} - - switch proto { - case "tcp": - l, err := sockets.NewTCPSocket(addr, tlsConfig) - if err != nil { - return nil, err - } - ls = append(ls, l) - - case "npipe": - // allow Administrators and SYSTEM, plus whatever additional users or groups were specified - sddl := "D:P(A;;GA;;;BA)(A;;GA;;;SY)" - if socketGroup != "" { - for _, g := range strings.Split(socketGroup, ",") { - sid, err := winio.LookupSidByName(g) - if err != nil { - return nil, err - } - sddl += fmt.Sprintf("(A;;GRGW;;;%s)", sid) - } - } - c := winio.PipeConfig{ - SecurityDescriptor: sddl, - MessageMode: true, // Use message mode so that CloseWrite() is supported - InputBufferSize: 65536, // Use 64KB buffers to improve performance - OutputBufferSize: 65536, - } - l, err := winio.ListenPipe(addr, &c) - if err != nil { - return nil, err - } - ls = append(ls, l) - - default: - return nil, fmt.Errorf("invalid protocol format: windows only supports tcp and npipe") - } - - return ls, nil -} diff --git a/vendor/github.com/docker/docker/pkg/locker/README.md b/vendor/github.com/docker/docker/pkg/locker/README.md deleted file mode 100644 index e84a815cc..000000000 --- a/vendor/github.com/docker/docker/pkg/locker/README.md +++ /dev/null @@ -1,65 +0,0 @@ -Locker -===== - -locker provides a mechanism for creating finer-grained locking to help -free up more global locks to handle other tasks. - -The implementation looks close to a sync.Mutex, however the user must provide a -reference to use to refer to the underlying lock when locking and unlocking, -and unlock may generate an error. - -If a lock with a given name does not exist when `Lock` is called, one is -created. -Lock references are automatically cleaned up on `Unlock` if nothing else is -waiting for the lock. - - -## Usage - -```go -package important - -import ( - "sync" - "time" - - "github.com/docker/docker/pkg/locker" -) - -type important struct { - locks *locker.Locker - data map[string]interface{} - mu sync.Mutex -} - -func (i *important) Get(name string) interface{} { - i.locks.Lock(name) - defer i.locks.Unlock(name) - return data[name] -} - -func (i *important) Create(name string, data interface{}) { - i.locks.Lock(name) - defer i.locks.Unlock(name) - - i.createImportant(data) - - s.mu.Lock() - i.data[name] = data - s.mu.Unlock() -} - -func (i *important) createImportant(data interface{}) { - time.Sleep(10 * time.Second) -} -``` - -For functions dealing with a given name, always lock at the beginning of the -function (or before doing anything with the underlying state), this ensures any -other function that is dealing with the same name will block. - -When needing to modify the underlying data, use the global lock to ensure nothing -else is modfying it at the same time. -Since name lock is already in place, no reads will occur while the modification -is being performed. - diff --git a/vendor/github.com/docker/docker/pkg/locker/locker.go b/vendor/github.com/docker/docker/pkg/locker/locker.go deleted file mode 100644 index 0b22ddfab..000000000 --- a/vendor/github.com/docker/docker/pkg/locker/locker.go +++ /dev/null @@ -1,112 +0,0 @@ -/* -Package locker provides a mechanism for creating finer-grained locking to help -free up more global locks to handle other tasks. - -The implementation looks close to a sync.Mutex, however the user must provide a -reference to use to refer to the underlying lock when locking and unlocking, -and unlock may generate an error. - -If a lock with a given name does not exist when `Lock` is called, one is -created. -Lock references are automatically cleaned up on `Unlock` if nothing else is -waiting for the lock. -*/ -package locker - -import ( - "errors" - "sync" - "sync/atomic" -) - -// ErrNoSuchLock is returned when the requested lock does not exist -var ErrNoSuchLock = errors.New("no such lock") - -// Locker provides a locking mechanism based on the passed in reference name -type Locker struct { - mu sync.Mutex - locks map[string]*lockCtr -} - -// lockCtr is used by Locker to represent a lock with a given name. -type lockCtr struct { - mu sync.Mutex - // waiters is the number of waiters waiting to acquire the lock - // this is int32 instead of uint32 so we can add `-1` in `dec()` - waiters int32 -} - -// inc increments the number of waiters waiting for the lock -func (l *lockCtr) inc() { - atomic.AddInt32(&l.waiters, 1) -} - -// dec decrements the number of waiters waiting on the lock -func (l *lockCtr) dec() { - atomic.AddInt32(&l.waiters, -1) -} - -// count gets the current number of waiters -func (l *lockCtr) count() int32 { - return atomic.LoadInt32(&l.waiters) -} - -// Lock locks the mutex -func (l *lockCtr) Lock() { - l.mu.Lock() -} - -// Unlock unlocks the mutex -func (l *lockCtr) Unlock() { - l.mu.Unlock() -} - -// New creates a new Locker -func New() *Locker { - return &Locker{ - locks: make(map[string]*lockCtr), - } -} - -// Lock locks a mutex with the given name. If it doesn't exist, one is created -func (l *Locker) Lock(name string) { - l.mu.Lock() - if l.locks == nil { - l.locks = make(map[string]*lockCtr) - } - - nameLock, exists := l.locks[name] - if !exists { - nameLock = &lockCtr{} - l.locks[name] = nameLock - } - - // increment the nameLock waiters while inside the main mutex - // this makes sure that the lock isn't deleted if `Lock` and `Unlock` are called concurrently - nameLock.inc() - l.mu.Unlock() - - // Lock the nameLock outside the main mutex so we don't block other operations - // once locked then we can decrement the number of waiters for this lock - nameLock.Lock() - nameLock.dec() -} - -// Unlock unlocks the mutex with the given name -// If the given lock is not being waited on by any other callers, it is deleted -func (l *Locker) Unlock(name string) error { - l.mu.Lock() - nameLock, exists := l.locks[name] - if !exists { - l.mu.Unlock() - return ErrNoSuchLock - } - - if nameLock.count() == 0 { - delete(l.locks, name) - } - nameLock.Unlock() - - l.mu.Unlock() - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/locker/locker_test.go b/vendor/github.com/docker/docker/pkg/locker/locker_test.go deleted file mode 100644 index 5a297dd47..000000000 --- a/vendor/github.com/docker/docker/pkg/locker/locker_test.go +++ /dev/null @@ -1,124 +0,0 @@ -package locker - -import ( - "sync" - "testing" - "time" -) - -func TestLockCounter(t *testing.T) { - l := &lockCtr{} - l.inc() - - if l.waiters != 1 { - t.Fatal("counter inc failed") - } - - l.dec() - if l.waiters != 0 { - t.Fatal("counter dec failed") - } -} - -func TestLockerLock(t *testing.T) { - l := New() - l.Lock("test") - ctr := l.locks["test"] - - if ctr.count() != 0 { - t.Fatalf("expected waiters to be 0, got :%d", ctr.waiters) - } - - chDone := make(chan struct{}) - go func() { - l.Lock("test") - close(chDone) - }() - - chWaiting := make(chan struct{}) - go func() { - for range time.Tick(1 * time.Millisecond) { - if ctr.count() == 1 { - close(chWaiting) - break - } - } - }() - - select { - case <-chWaiting: - case <-time.After(3 * time.Second): - t.Fatal("timed out waiting for lock waiters to be incremented") - } - - select { - case <-chDone: - t.Fatal("lock should not have returned while it was still held") - default: - } - - if err := l.Unlock("test"); err != nil { - t.Fatal(err) - } - - select { - case <-chDone: - case <-time.After(3 * time.Second): - t.Fatalf("lock should have completed") - } - - if ctr.count() != 0 { - t.Fatalf("expected waiters to be 0, got: %d", ctr.count()) - } -} - -func TestLockerUnlock(t *testing.T) { - l := New() - - l.Lock("test") - l.Unlock("test") - - chDone := make(chan struct{}) - go func() { - l.Lock("test") - close(chDone) - }() - - select { - case <-chDone: - case <-time.After(3 * time.Second): - t.Fatalf("lock should not be blocked") - } -} - -func TestLockerConcurrency(t *testing.T) { - l := New() - - var wg sync.WaitGroup - for i := 0; i <= 10000; i++ { - wg.Add(1) - go func() { - l.Lock("test") - // if there is a concurrency issue, will very likely panic here - l.Unlock("test") - wg.Done() - }() - } - - chDone := make(chan struct{}) - go func() { - wg.Wait() - close(chDone) - }() - - select { - case <-chDone: - case <-time.After(10 * time.Second): - t.Fatal("timeout waiting for locks to complete") - } - - // Since everything has unlocked this should not exist anymore - if ctr, exists := l.locks["test"]; exists { - t.Fatalf("lock should not exist: %v", ctr) - } -} diff --git a/vendor/github.com/docker/docker/pkg/longpath/longpath.go b/vendor/github.com/docker/docker/pkg/longpath/longpath.go deleted file mode 100644 index 9b15bfff4..000000000 --- a/vendor/github.com/docker/docker/pkg/longpath/longpath.go +++ /dev/null @@ -1,26 +0,0 @@ -// longpath introduces some constants and helper functions for handling long paths -// in Windows, which are expected to be prepended with `\\?\` and followed by either -// a drive letter, a UNC server\share, or a volume identifier. - -package longpath - -import ( - "strings" -) - -// Prefix is the longpath prefix for Windows file paths. -const Prefix = `\\?\` - -// AddPrefix will add the Windows long path prefix to the path provided if -// it does not already have it. -func AddPrefix(path string) string { - if !strings.HasPrefix(path, Prefix) { - if strings.HasPrefix(path, `\\`) { - // This is a UNC path, so we need to add 'UNC' to the path as well. - path = Prefix + `UNC` + path[1:] - } else { - path = Prefix + path - } - } - return path -} diff --git a/vendor/github.com/docker/docker/pkg/longpath/longpath_test.go b/vendor/github.com/docker/docker/pkg/longpath/longpath_test.go deleted file mode 100644 index 01865eff0..000000000 --- a/vendor/github.com/docker/docker/pkg/longpath/longpath_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package longpath - -import ( - "strings" - "testing" -) - -func TestStandardLongPath(t *testing.T) { - c := `C:\simple\path` - longC := AddPrefix(c) - if !strings.EqualFold(longC, `\\?\C:\simple\path`) { - t.Errorf("Wrong long path returned. Original = %s ; Long = %s", c, longC) - } -} - -func TestUNCLongPath(t *testing.T) { - c := `\\server\share\path` - longC := AddPrefix(c) - if !strings.EqualFold(longC, `\\?\UNC\server\share\path`) { - t.Errorf("Wrong UNC long path returned. Original = %s ; Long = %s", c, longC) - } -} diff --git a/vendor/github.com/docker/docker/pkg/loopback/attach_loopback.go b/vendor/github.com/docker/docker/pkg/loopback/attach_loopback.go deleted file mode 100644 index 971f45eb4..000000000 --- a/vendor/github.com/docker/docker/pkg/loopback/attach_loopback.go +++ /dev/null @@ -1,137 +0,0 @@ -// +build linux - -package loopback - -import ( - "errors" - "fmt" - "os" - "syscall" - - "github.com/Sirupsen/logrus" -) - -// Loopback related errors -var ( - ErrAttachLoopbackDevice = errors.New("loopback attach failed") - ErrGetLoopbackBackingFile = errors.New("Unable to get loopback backing file") - ErrSetCapacity = errors.New("Unable set loopback capacity") -) - -func stringToLoopName(src string) [LoNameSize]uint8 { - var dst [LoNameSize]uint8 - copy(dst[:], src[:]) - return dst -} - -func getNextFreeLoopbackIndex() (int, error) { - f, err := os.OpenFile("/dev/loop-control", os.O_RDONLY, 0644) - if err != nil { - return 0, err - } - defer f.Close() - - index, err := ioctlLoopCtlGetFree(f.Fd()) - if index < 0 { - index = 0 - } - return index, err -} - -func openNextAvailableLoopback(index int, sparseFile *os.File) (loopFile *os.File, err error) { - // Start looking for a free /dev/loop - for { - target := fmt.Sprintf("/dev/loop%d", index) - index++ - - fi, err := os.Stat(target) - if err != nil { - if os.IsNotExist(err) { - logrus.Error("There are no more loopback devices available.") - } - return nil, ErrAttachLoopbackDevice - } - - if fi.Mode()&os.ModeDevice != os.ModeDevice { - logrus.Errorf("Loopback device %s is not a block device.", target) - continue - } - - // OpenFile adds O_CLOEXEC - loopFile, err = os.OpenFile(target, os.O_RDWR, 0644) - if err != nil { - logrus.Errorf("Error opening loopback device: %s", err) - return nil, ErrAttachLoopbackDevice - } - - // Try to attach to the loop file - if err := ioctlLoopSetFd(loopFile.Fd(), sparseFile.Fd()); err != nil { - loopFile.Close() - - // If the error is EBUSY, then try the next loopback - if err != syscall.EBUSY { - logrus.Errorf("Cannot set up loopback device %s: %s", target, err) - return nil, ErrAttachLoopbackDevice - } - - // Otherwise, we keep going with the loop - continue - } - // In case of success, we finished. Break the loop. - break - } - - // This can't happen, but let's be sure - if loopFile == nil { - logrus.Errorf("Unreachable code reached! Error attaching %s to a loopback device.", sparseFile.Name()) - return nil, ErrAttachLoopbackDevice - } - - return loopFile, nil -} - -// AttachLoopDevice attaches the given sparse file to the next -// available loopback device. It returns an opened *os.File. -func AttachLoopDevice(sparseName string) (loop *os.File, err error) { - - // Try to retrieve the next available loopback device via syscall. - // If it fails, we discard error and start looping for a - // loopback from index 0. - startIndex, err := getNextFreeLoopbackIndex() - if err != nil { - logrus.Debugf("Error retrieving the next available loopback: %s", err) - } - - // OpenFile adds O_CLOEXEC - sparseFile, err := os.OpenFile(sparseName, os.O_RDWR, 0644) - if err != nil { - logrus.Errorf("Error opening sparse file %s: %s", sparseName, err) - return nil, ErrAttachLoopbackDevice - } - defer sparseFile.Close() - - loopFile, err := openNextAvailableLoopback(startIndex, sparseFile) - if err != nil { - return nil, err - } - - // Set the status of the loopback device - loopInfo := &loopInfo64{ - loFileName: stringToLoopName(loopFile.Name()), - loOffset: 0, - loFlags: LoFlagsAutoClear, - } - - if err := ioctlLoopSetStatus64(loopFile.Fd(), loopInfo); err != nil { - logrus.Errorf("Cannot set up loopback device info: %s", err) - - // If the call failed, then free the loopback device - if err := ioctlLoopClrFd(loopFile.Fd()); err != nil { - logrus.Error("Error while cleaning up the loopback device") - } - loopFile.Close() - return nil, ErrAttachLoopbackDevice - } - - return loopFile, nil -} diff --git a/vendor/github.com/docker/docker/pkg/loopback/ioctl.go b/vendor/github.com/docker/docker/pkg/loopback/ioctl.go deleted file mode 100644 index 0714eb5f8..000000000 --- a/vendor/github.com/docker/docker/pkg/loopback/ioctl.go +++ /dev/null @@ -1,53 +0,0 @@ -// +build linux - -package loopback - -import ( - "syscall" - "unsafe" -) - -func ioctlLoopCtlGetFree(fd uintptr) (int, error) { - index, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, LoopCtlGetFree, 0) - if err != 0 { - return 0, err - } - return int(index), nil -} - -func ioctlLoopSetFd(loopFd, sparseFd uintptr) error { - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, loopFd, LoopSetFd, sparseFd); err != 0 { - return err - } - return nil -} - -func ioctlLoopSetStatus64(loopFd uintptr, loopInfo *loopInfo64) error { - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, loopFd, LoopSetStatus64, uintptr(unsafe.Pointer(loopInfo))); err != 0 { - return err - } - return nil -} - -func ioctlLoopClrFd(loopFd uintptr) error { - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, loopFd, LoopClrFd, 0); err != 0 { - return err - } - return nil -} - -func ioctlLoopGetStatus64(loopFd uintptr) (*loopInfo64, error) { - loopInfo := &loopInfo64{} - - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, loopFd, LoopGetStatus64, uintptr(unsafe.Pointer(loopInfo))); err != 0 { - return nil, err - } - return loopInfo, nil -} - -func ioctlLoopSetCapacity(loopFd uintptr, value int) error { - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, loopFd, LoopSetCapacity, uintptr(value)); err != 0 { - return err - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/loopback/loop_wrapper.go b/vendor/github.com/docker/docker/pkg/loopback/loop_wrapper.go deleted file mode 100644 index e1100ce15..000000000 --- a/vendor/github.com/docker/docker/pkg/loopback/loop_wrapper.go +++ /dev/null @@ -1,52 +0,0 @@ -// +build linux - -package loopback - -/* -#include // FIXME: present only for defines, maybe we can remove it? - -#ifndef LOOP_CTL_GET_FREE - #define LOOP_CTL_GET_FREE 0x4C82 -#endif - -#ifndef LO_FLAGS_PARTSCAN - #define LO_FLAGS_PARTSCAN 8 -#endif - -*/ -import "C" - -type loopInfo64 struct { - loDevice uint64 /* ioctl r/o */ - loInode uint64 /* ioctl r/o */ - loRdevice uint64 /* ioctl r/o */ - loOffset uint64 - loSizelimit uint64 /* bytes, 0 == max available */ - loNumber uint32 /* ioctl r/o */ - loEncryptType uint32 - loEncryptKeySize uint32 /* ioctl w/o */ - loFlags uint32 /* ioctl r/o */ - loFileName [LoNameSize]uint8 - loCryptName [LoNameSize]uint8 - loEncryptKey [LoKeySize]uint8 /* ioctl w/o */ - loInit [2]uint64 -} - -// IOCTL consts -const ( - LoopSetFd = C.LOOP_SET_FD - LoopCtlGetFree = C.LOOP_CTL_GET_FREE - LoopGetStatus64 = C.LOOP_GET_STATUS64 - LoopSetStatus64 = C.LOOP_SET_STATUS64 - LoopClrFd = C.LOOP_CLR_FD - LoopSetCapacity = C.LOOP_SET_CAPACITY -) - -// LOOP consts. -const ( - LoFlagsAutoClear = C.LO_FLAGS_AUTOCLEAR - LoFlagsReadOnly = C.LO_FLAGS_READ_ONLY - LoFlagsPartScan = C.LO_FLAGS_PARTSCAN - LoKeySize = C.LO_KEY_SIZE - LoNameSize = C.LO_NAME_SIZE -) diff --git a/vendor/github.com/docker/docker/pkg/loopback/loopback.go b/vendor/github.com/docker/docker/pkg/loopback/loopback.go deleted file mode 100644 index bc0479284..000000000 --- a/vendor/github.com/docker/docker/pkg/loopback/loopback.go +++ /dev/null @@ -1,63 +0,0 @@ -// +build linux - -package loopback - -import ( - "fmt" - "os" - "syscall" - - "github.com/Sirupsen/logrus" -) - -func getLoopbackBackingFile(file *os.File) (uint64, uint64, error) { - loopInfo, err := ioctlLoopGetStatus64(file.Fd()) - if err != nil { - logrus.Errorf("Error get loopback backing file: %s", err) - return 0, 0, ErrGetLoopbackBackingFile - } - return loopInfo.loDevice, loopInfo.loInode, nil -} - -// SetCapacity reloads the size for the loopback device. -func SetCapacity(file *os.File) error { - if err := ioctlLoopSetCapacity(file.Fd(), 0); err != nil { - logrus.Errorf("Error loopbackSetCapacity: %s", err) - return ErrSetCapacity - } - return nil -} - -// FindLoopDeviceFor returns a loopback device file for the specified file which -// is backing file of a loop back device. -func FindLoopDeviceFor(file *os.File) *os.File { - stat, err := file.Stat() - if err != nil { - return nil - } - targetInode := stat.Sys().(*syscall.Stat_t).Ino - targetDevice := stat.Sys().(*syscall.Stat_t).Dev - - for i := 0; true; i++ { - path := fmt.Sprintf("/dev/loop%d", i) - - file, err := os.OpenFile(path, os.O_RDWR, 0) - if err != nil { - if os.IsNotExist(err) { - return nil - } - - // Ignore all errors until the first not-exist - // we want to continue looking for the file - continue - } - - dev, inode, err := getLoopbackBackingFile(file) - if err == nil && dev == targetDevice && inode == targetInode { - return file - } - file.Close() - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/flags.go b/vendor/github.com/docker/docker/pkg/mount/flags.go deleted file mode 100644 index 607dbed43..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/flags.go +++ /dev/null @@ -1,149 +0,0 @@ -package mount - -import ( - "fmt" - "strings" -) - -var flags = map[string]struct { - clear bool - flag int -}{ - "defaults": {false, 0}, - "ro": {false, RDONLY}, - "rw": {true, RDONLY}, - "suid": {true, NOSUID}, - "nosuid": {false, NOSUID}, - "dev": {true, NODEV}, - "nodev": {false, NODEV}, - "exec": {true, NOEXEC}, - "noexec": {false, NOEXEC}, - "sync": {false, SYNCHRONOUS}, - "async": {true, SYNCHRONOUS}, - "dirsync": {false, DIRSYNC}, - "remount": {false, REMOUNT}, - "mand": {false, MANDLOCK}, - "nomand": {true, MANDLOCK}, - "atime": {true, NOATIME}, - "noatime": {false, NOATIME}, - "diratime": {true, NODIRATIME}, - "nodiratime": {false, NODIRATIME}, - "bind": {false, BIND}, - "rbind": {false, RBIND}, - "unbindable": {false, UNBINDABLE}, - "runbindable": {false, RUNBINDABLE}, - "private": {false, PRIVATE}, - "rprivate": {false, RPRIVATE}, - "shared": {false, SHARED}, - "rshared": {false, RSHARED}, - "slave": {false, SLAVE}, - "rslave": {false, RSLAVE}, - "relatime": {false, RELATIME}, - "norelatime": {true, RELATIME}, - "strictatime": {false, STRICTATIME}, - "nostrictatime": {true, STRICTATIME}, -} - -var validFlags = map[string]bool{ - "": true, - "size": true, - "mode": true, - "uid": true, - "gid": true, - "nr_inodes": true, - "nr_blocks": true, - "mpol": true, -} - -var propagationFlags = map[string]bool{ - "bind": true, - "rbind": true, - "unbindable": true, - "runbindable": true, - "private": true, - "rprivate": true, - "shared": true, - "rshared": true, - "slave": true, - "rslave": true, -} - -// MergeTmpfsOptions merge mount options to make sure there is no duplicate. -func MergeTmpfsOptions(options []string) ([]string, error) { - // We use collisions maps to remove duplicates. - // For flag, the key is the flag value (the key for propagation flag is -1) - // For data=value, the key is the data - flagCollisions := map[int]bool{} - dataCollisions := map[string]bool{} - - var newOptions []string - // We process in reverse order - for i := len(options) - 1; i >= 0; i-- { - option := options[i] - if option == "defaults" { - continue - } - if f, ok := flags[option]; ok && f.flag != 0 { - // There is only one propagation mode - key := f.flag - if propagationFlags[option] { - key = -1 - } - // Check to see if there is collision for flag - if !flagCollisions[key] { - // We prepend the option and add to collision map - newOptions = append([]string{option}, newOptions...) - flagCollisions[key] = true - } - continue - } - opt := strings.SplitN(option, "=", 2) - if len(opt) != 2 || !validFlags[opt[0]] { - return nil, fmt.Errorf("Invalid tmpfs option %q", opt) - } - if !dataCollisions[opt[0]] { - // We prepend the option and add to collision map - newOptions = append([]string{option}, newOptions...) - dataCollisions[opt[0]] = true - } - } - - return newOptions, nil -} - -// Parse fstab type mount options into mount() flags -// and device specific data -func parseOptions(options string) (int, string) { - var ( - flag int - data []string - ) - - for _, o := range strings.Split(options, ",") { - // If the option does not exist in the flags table or the flag - // is not supported on the platform, - // then it is a data value for a specific fs type - if f, exists := flags[o]; exists && f.flag != 0 { - if f.clear { - flag &= ^f.flag - } else { - flag |= f.flag - } - } else { - data = append(data, o) - } - } - return flag, strings.Join(data, ",") -} - -// ParseTmpfsOptions parse fstab type mount options into flags and data -func ParseTmpfsOptions(options string) (int, string, error) { - flags, data := parseOptions(options) - for _, o := range strings.Split(data, ",") { - opt := strings.SplitN(o, "=", 2) - if !validFlags[opt[0]] { - return 0, "", fmt.Errorf("Invalid tmpfs option %q", opt) - } - } - return flags, data, nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/flags_freebsd.go b/vendor/github.com/docker/docker/pkg/mount/flags_freebsd.go deleted file mode 100644 index f166cb2f7..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/flags_freebsd.go +++ /dev/null @@ -1,48 +0,0 @@ -// +build freebsd,cgo - -package mount - -/* -#include -*/ -import "C" - -const ( - // RDONLY will mount the filesystem as read-only. - RDONLY = C.MNT_RDONLY - - // NOSUID will not allow set-user-identifier or set-group-identifier bits to - // take effect. - NOSUID = C.MNT_NOSUID - - // NOEXEC will not allow execution of any binaries on the mounted file system. - NOEXEC = C.MNT_NOEXEC - - // SYNCHRONOUS will allow any I/O to the file system to be done synchronously. - SYNCHRONOUS = C.MNT_SYNCHRONOUS - - // NOATIME will not update the file access time when reading from a file. - NOATIME = C.MNT_NOATIME -) - -// These flags are unsupported. -const ( - BIND = 0 - DIRSYNC = 0 - MANDLOCK = 0 - NODEV = 0 - NODIRATIME = 0 - UNBINDABLE = 0 - RUNBINDABLE = 0 - PRIVATE = 0 - RPRIVATE = 0 - SHARED = 0 - RSHARED = 0 - SLAVE = 0 - RSLAVE = 0 - RBIND = 0 - RELATIVE = 0 - RELATIME = 0 - REMOUNT = 0 - STRICTATIME = 0 -) diff --git a/vendor/github.com/docker/docker/pkg/mount/flags_linux.go b/vendor/github.com/docker/docker/pkg/mount/flags_linux.go deleted file mode 100644 index dc696dce9..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/flags_linux.go +++ /dev/null @@ -1,85 +0,0 @@ -package mount - -import ( - "syscall" -) - -const ( - // RDONLY will mount the file system read-only. - RDONLY = syscall.MS_RDONLY - - // NOSUID will not allow set-user-identifier or set-group-identifier bits to - // take effect. - NOSUID = syscall.MS_NOSUID - - // NODEV will not interpret character or block special devices on the file - // system. - NODEV = syscall.MS_NODEV - - // NOEXEC will not allow execution of any binaries on the mounted file system. - NOEXEC = syscall.MS_NOEXEC - - // SYNCHRONOUS will allow I/O to the file system to be done synchronously. - SYNCHRONOUS = syscall.MS_SYNCHRONOUS - - // DIRSYNC will force all directory updates within the file system to be done - // synchronously. This affects the following system calls: create, link, - // unlink, symlink, mkdir, rmdir, mknod and rename. - DIRSYNC = syscall.MS_DIRSYNC - - // REMOUNT will attempt to remount an already-mounted file system. This is - // commonly used to change the mount flags for a file system, especially to - // make a readonly file system writeable. It does not change device or mount - // point. - REMOUNT = syscall.MS_REMOUNT - - // MANDLOCK will force mandatory locks on a filesystem. - MANDLOCK = syscall.MS_MANDLOCK - - // NOATIME will not update the file access time when reading from a file. - NOATIME = syscall.MS_NOATIME - - // NODIRATIME will not update the directory access time. - NODIRATIME = syscall.MS_NODIRATIME - - // BIND remounts a subtree somewhere else. - BIND = syscall.MS_BIND - - // RBIND remounts a subtree and all possible submounts somewhere else. - RBIND = syscall.MS_BIND | syscall.MS_REC - - // UNBINDABLE creates a mount which cannot be cloned through a bind operation. - UNBINDABLE = syscall.MS_UNBINDABLE - - // RUNBINDABLE marks the entire mount tree as UNBINDABLE. - RUNBINDABLE = syscall.MS_UNBINDABLE | syscall.MS_REC - - // PRIVATE creates a mount which carries no propagation abilities. - PRIVATE = syscall.MS_PRIVATE - - // RPRIVATE marks the entire mount tree as PRIVATE. - RPRIVATE = syscall.MS_PRIVATE | syscall.MS_REC - - // SLAVE creates a mount which receives propagation from its master, but not - // vice versa. - SLAVE = syscall.MS_SLAVE - - // RSLAVE marks the entire mount tree as SLAVE. - RSLAVE = syscall.MS_SLAVE | syscall.MS_REC - - // SHARED creates a mount which provides the ability to create mirrors of - // that mount such that mounts and unmounts within any of the mirrors - // propagate to the other mirrors. - SHARED = syscall.MS_SHARED - - // RSHARED marks the entire mount tree as SHARED. - RSHARED = syscall.MS_SHARED | syscall.MS_REC - - // RELATIME updates inode access times relative to modify or change time. - RELATIME = syscall.MS_RELATIME - - // STRICTATIME allows to explicitly request full atime updates. This makes - // it possible for the kernel to default to relatime or noatime but still - // allow userspace to override it. - STRICTATIME = syscall.MS_STRICTATIME -) diff --git a/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go deleted file mode 100644 index 5564f7b3c..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build !linux,!freebsd freebsd,!cgo solaris,!cgo - -package mount - -// These flags are unsupported. -const ( - BIND = 0 - DIRSYNC = 0 - MANDLOCK = 0 - NOATIME = 0 - NODEV = 0 - NODIRATIME = 0 - NOEXEC = 0 - NOSUID = 0 - UNBINDABLE = 0 - RUNBINDABLE = 0 - PRIVATE = 0 - RPRIVATE = 0 - SHARED = 0 - RSHARED = 0 - SLAVE = 0 - RSLAVE = 0 - RBIND = 0 - RELATIME = 0 - RELATIVE = 0 - REMOUNT = 0 - STRICTATIME = 0 - SYNCHRONOUS = 0 - RDONLY = 0 -) diff --git a/vendor/github.com/docker/docker/pkg/mount/mount.go b/vendor/github.com/docker/docker/pkg/mount/mount.go deleted file mode 100644 index 66ac4bf47..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mount.go +++ /dev/null @@ -1,74 +0,0 @@ -package mount - -import ( - "time" -) - -// GetMounts retrieves a list of mounts for the current running process. -func GetMounts() ([]*Info, error) { - return parseMountTable() -} - -// Mounted determines if a specified mountpoint has been mounted. -// On Linux it looks at /proc/self/mountinfo and on Solaris at mnttab. -func Mounted(mountpoint string) (bool, error) { - entries, err := parseMountTable() - if err != nil { - return false, err - } - - // Search the table for the mountpoint - for _, e := range entries { - if e.Mountpoint == mountpoint { - return true, nil - } - } - return false, nil -} - -// Mount will mount filesystem according to the specified configuration, on the -// condition that the target path is *not* already mounted. Options must be -// specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See -// flags.go for supported option flags. -func Mount(device, target, mType, options string) error { - flag, _ := parseOptions(options) - if flag&REMOUNT != REMOUNT { - if mounted, err := Mounted(target); err != nil || mounted { - return err - } - } - return ForceMount(device, target, mType, options) -} - -// ForceMount will mount a filesystem according to the specified configuration, -// *regardless* if the target path is not already mounted. Options must be -// specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See -// flags.go for supported option flags. -func ForceMount(device, target, mType, options string) error { - flag, data := parseOptions(options) - if err := mount(device, target, mType, uintptr(flag), data); err != nil { - return err - } - return nil -} - -// Unmount will unmount the target filesystem, so long as it is mounted. -func Unmount(target string) error { - if mounted, err := Mounted(target); err != nil || !mounted { - return err - } - return ForceUnmount(target) -} - -// ForceUnmount will force an unmount of the target filesystem, regardless if -// it is mounted or not. -func ForceUnmount(target string) (err error) { - // Simple retry logic for unmount - for i := 0; i < 10; i++ { - if err = unmount(target, 0); err == nil { - return nil - } - time.Sleep(100 * time.Millisecond) - } - return -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mount_unix_test.go b/vendor/github.com/docker/docker/pkg/mount/mount_unix_test.go deleted file mode 100644 index 253aff3b8..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mount_unix_test.go +++ /dev/null @@ -1,162 +0,0 @@ -// +build !windows,!solaris - -package mount - -import ( - "os" - "path" - "testing" -) - -func TestMountOptionsParsing(t *testing.T) { - options := "noatime,ro,size=10k" - - flag, data := parseOptions(options) - - if data != "size=10k" { - t.Fatalf("Expected size=10 got %s", data) - } - - expectedFlag := NOATIME | RDONLY - - if flag != expectedFlag { - t.Fatalf("Expected %d got %d", expectedFlag, flag) - } -} - -func TestMounted(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - sourcePath = path.Join(sourceDir, "file.txt") - targetPath = path.Join(targetDir, "file.txt") - ) - - os.Mkdir(sourceDir, 0777) - os.Mkdir(targetDir, 0777) - - f, err := os.Create(sourcePath) - if err != nil { - t.Fatal(err) - } - f.WriteString("hello") - f.Close() - - f, err = os.Create(targetPath) - if err != nil { - t.Fatal(err) - } - f.Close() - - if err := Mount(sourceDir, targetDir, "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - mounted, err := Mounted(targetDir) - if err != nil { - t.Fatal(err) - } - if !mounted { - t.Fatalf("Expected %s to be mounted", targetDir) - } - if _, err := os.Stat(targetDir); err != nil { - t.Fatal(err) - } -} - -func TestMountReadonly(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - sourcePath = path.Join(sourceDir, "file.txt") - targetPath = path.Join(targetDir, "file.txt") - ) - - os.Mkdir(sourceDir, 0777) - os.Mkdir(targetDir, 0777) - - f, err := os.Create(sourcePath) - if err != nil { - t.Fatal(err) - } - f.WriteString("hello") - f.Close() - - f, err = os.Create(targetPath) - if err != nil { - t.Fatal(err) - } - f.Close() - - if err := Mount(sourceDir, targetDir, "none", "bind,ro"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - f, err = os.OpenFile(targetPath, os.O_RDWR, 0777) - if err == nil { - t.Fatal("Should not be able to open a ro file as rw") - } -} - -func TestGetMounts(t *testing.T) { - mounts, err := GetMounts() - if err != nil { - t.Fatal(err) - } - - root := false - for _, entry := range mounts { - if entry.Mountpoint == "/" { - root = true - } - } - - if !root { - t.Fatal("/ should be mounted at least") - } -} - -func TestMergeTmpfsOptions(t *testing.T) { - options := []string{"noatime", "ro", "size=10k", "defaults", "atime", "defaults", "rw", "rprivate", "size=1024k", "slave"} - expected := []string{"atime", "rw", "size=1024k", "slave"} - merged, err := MergeTmpfsOptions(options) - if err != nil { - t.Fatal(err) - } - if len(expected) != len(merged) { - t.Fatalf("Expected %s got %s", expected, merged) - } - for index := range merged { - if merged[index] != expected[index] { - t.Fatalf("Expected %s for the %dth option, got %s", expected, index, merged) - } - } - - options = []string{"noatime", "ro", "size=10k", "atime", "rw", "rprivate", "size=1024k", "slave", "size"} - _, err = MergeTmpfsOptions(options) - if err == nil { - t.Fatal("Expected error got nil") - } -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_freebsd.go b/vendor/github.com/docker/docker/pkg/mount/mounter_freebsd.go deleted file mode 100644 index bb870e6f5..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_freebsd.go +++ /dev/null @@ -1,59 +0,0 @@ -package mount - -/* -#include -#include -#include -#include -#include -#include -*/ -import "C" - -import ( - "fmt" - "strings" - "syscall" - "unsafe" -) - -func allocateIOVecs(options []string) []C.struct_iovec { - out := make([]C.struct_iovec, len(options)) - for i, option := range options { - out[i].iov_base = unsafe.Pointer(C.CString(option)) - out[i].iov_len = C.size_t(len(option) + 1) - } - return out -} - -func mount(device, target, mType string, flag uintptr, data string) error { - isNullFS := false - - xs := strings.Split(data, ",") - for _, x := range xs { - if x == "bind" { - isNullFS = true - } - } - - options := []string{"fspath", target} - if isNullFS { - options = append(options, "fstype", "nullfs", "target", device) - } else { - options = append(options, "fstype", mType, "from", device) - } - rawOptions := allocateIOVecs(options) - for _, rawOption := range rawOptions { - defer C.free(rawOption.iov_base) - } - - if errno := C.nmount(&rawOptions[0], C.uint(len(options)), C.int(flag)); errno != 0 { - reason := C.GoString(C.strerror(*C.__error())) - return fmt.Errorf("Failed to call nmount: %s", reason) - } - return nil -} - -func unmount(target string, flag int) error { - return syscall.Unmount(target, flag) -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_linux.go b/vendor/github.com/docker/docker/pkg/mount/mounter_linux.go deleted file mode 100644 index dd4280c77..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_linux.go +++ /dev/null @@ -1,21 +0,0 @@ -package mount - -import ( - "syscall" -) - -func mount(device, target, mType string, flag uintptr, data string) error { - if err := syscall.Mount(device, target, mType, flag, data); err != nil { - return err - } - - // If we have a bind mount or remount, remount... - if flag&syscall.MS_BIND == syscall.MS_BIND && flag&syscall.MS_RDONLY == syscall.MS_RDONLY { - return syscall.Mount(device, target, mType, flag|syscall.MS_REMOUNT, data) - } - return nil -} - -func unmount(target string, flag int) error { - return syscall.Unmount(target, flag) -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go b/vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go deleted file mode 100644 index c684aa81f..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go +++ /dev/null @@ -1,33 +0,0 @@ -// +build solaris,cgo - -package mount - -import ( - "golang.org/x/sys/unix" - "unsafe" -) - -// #include -// #include -// #include -// int Mount(const char *spec, const char *dir, int mflag, -// char *fstype, char *dataptr, int datalen, char *optptr, int optlen) { -// return mount(spec, dir, mflag, fstype, dataptr, datalen, optptr, optlen); -// } -import "C" - -func mount(device, target, mType string, flag uintptr, data string) error { - spec := C.CString(device) - dir := C.CString(target) - fstype := C.CString(mType) - _, err := C.Mount(spec, dir, C.int(flag), fstype, nil, 0, nil, 0) - C.free(unsafe.Pointer(spec)) - C.free(unsafe.Pointer(dir)) - C.free(unsafe.Pointer(fstype)) - return err -} - -func unmount(target string, flag int) error { - err := unix.Unmount(target, flag) - return err -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go deleted file mode 100644 index a2a3bb457..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build !linux,!freebsd,!solaris freebsd,!cgo solaris,!cgo - -package mount - -func mount(device, target, mType string, flag uintptr, data string) error { - panic("Not implemented") -} - -func unmount(target string, flag int) error { - panic("Not implemented") -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo.go deleted file mode 100644 index e3fc3535e..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo.go +++ /dev/null @@ -1,40 +0,0 @@ -package mount - -// Info reveals information about a particular mounted filesystem. This -// struct is populated from the content in the /proc//mountinfo file. -type Info struct { - // ID is a unique identifier of the mount (may be reused after umount). - ID int - - // Parent indicates the ID of the mount parent (or of self for the top of the - // mount tree). - Parent int - - // Major indicates one half of the device ID which identifies the device class. - Major int - - // Minor indicates one half of the device ID which identifies a specific - // instance of device. - Minor int - - // Root of the mount within the filesystem. - Root string - - // Mountpoint indicates the mount point relative to the process's root. - Mountpoint string - - // Opts represents mount-specific options. - Opts string - - // Optional represents optional fields. - Optional string - - // Fstype indicates the type of filesystem, such as EXT3. - Fstype string - - // Source indicates filesystem specific information or "none". - Source string - - // VfsOpts represents per super block options. - VfsOpts string -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go deleted file mode 100644 index 4f32edcd9..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go +++ /dev/null @@ -1,41 +0,0 @@ -package mount - -/* -#include -#include -#include -*/ -import "C" - -import ( - "fmt" - "reflect" - "unsafe" -) - -// Parse /proc/self/mountinfo because comparing Dev and ino does not work from -// bind mounts. -func parseMountTable() ([]*Info, error) { - var rawEntries *C.struct_statfs - - count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT)) - if count == 0 { - return nil, fmt.Errorf("Failed to call getmntinfo") - } - - var entries []C.struct_statfs - header := (*reflect.SliceHeader)(unsafe.Pointer(&entries)) - header.Cap = count - header.Len = count - header.Data = uintptr(unsafe.Pointer(rawEntries)) - - var out []*Info - for _, entry := range entries { - var mountinfo Info - mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0]) - mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) - mountinfo.Fstype = C.GoString(&entry.f_fstypename[0]) - out = append(out, &mountinfo) - } - return out, nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go deleted file mode 100644 index be69fee1d..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go +++ /dev/null @@ -1,95 +0,0 @@ -// +build linux - -package mount - -import ( - "bufio" - "fmt" - "io" - "os" - "strings" -) - -const ( - /* 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue - (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) - - (1) mount ID: unique identifier of the mount (may be reused after umount) - (2) parent ID: ID of parent (or of self for the top of the mount tree) - (3) major:minor: value of st_dev for files on filesystem - (4) root: root of the mount within the filesystem - (5) mount point: mount point relative to the process's root - (6) mount options: per mount options - (7) optional fields: zero or more fields of the form "tag[:value]" - (8) separator: marks the end of the optional fields - (9) filesystem type: name of filesystem of the form "type[.subtype]" - (10) mount source: filesystem specific information or "none" - (11) super options: per super block options*/ - mountinfoFormat = "%d %d %d:%d %s %s %s %s" -) - -// Parse /proc/self/mountinfo because comparing Dev and ino does not work from -// bind mounts -func parseMountTable() ([]*Info, error) { - f, err := os.Open("/proc/self/mountinfo") - if err != nil { - return nil, err - } - defer f.Close() - - return parseInfoFile(f) -} - -func parseInfoFile(r io.Reader) ([]*Info, error) { - var ( - s = bufio.NewScanner(r) - out = []*Info{} - ) - - for s.Scan() { - if err := s.Err(); err != nil { - return nil, err - } - - var ( - p = &Info{} - text = s.Text() - optionalFields string - ) - - if _, err := fmt.Sscanf(text, mountinfoFormat, - &p.ID, &p.Parent, &p.Major, &p.Minor, - &p.Root, &p.Mountpoint, &p.Opts, &optionalFields); err != nil { - return nil, fmt.Errorf("Scanning '%s' failed: %s", text, err) - } - // Safe as mountinfo encodes mountpoints with spaces as \040. - index := strings.Index(text, " - ") - postSeparatorFields := strings.Fields(text[index+3:]) - if len(postSeparatorFields) < 3 { - return nil, fmt.Errorf("Error found less than 3 fields post '-' in %q", text) - } - - if optionalFields != "-" { - p.Optional = optionalFields - } - - p.Fstype = postSeparatorFields[0] - p.Source = postSeparatorFields[1] - p.VfsOpts = strings.Join(postSeparatorFields[2:], " ") - out = append(out, p) - } - return out, nil -} - -// PidMountInfo collects the mounts for a specific process ID. If the process -// ID is unknown, it is better to use `GetMounts` which will inspect -// "/proc/self/mountinfo" instead. -func PidMountInfo(pid int) ([]*Info, error) { - f, err := os.Open(fmt.Sprintf("/proc/%d/mountinfo", pid)) - if err != nil { - return nil, err - } - defer f.Close() - - return parseInfoFile(f) -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux_test.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux_test.go deleted file mode 100644 index bd100e1d4..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux_test.go +++ /dev/null @@ -1,476 +0,0 @@ -// +build linux - -package mount - -import ( - "bytes" - "testing" -) - -const ( - fedoraMountinfo = `15 35 0:3 / /proc rw,nosuid,nodev,noexec,relatime shared:5 - proc proc rw - 16 35 0:14 / /sys rw,nosuid,nodev,noexec,relatime shared:6 - sysfs sysfs rw,seclabel - 17 35 0:5 / /dev rw,nosuid shared:2 - devtmpfs devtmpfs rw,seclabel,size=8056484k,nr_inodes=2014121,mode=755 - 18 16 0:15 / /sys/kernel/security rw,nosuid,nodev,noexec,relatime shared:7 - securityfs securityfs rw - 19 16 0:13 / /sys/fs/selinux rw,relatime shared:8 - selinuxfs selinuxfs rw - 20 17 0:16 / /dev/shm rw,nosuid,nodev shared:3 - tmpfs tmpfs rw,seclabel - 21 17 0:10 / /dev/pts rw,nosuid,noexec,relatime shared:4 - devpts devpts rw,seclabel,gid=5,mode=620,ptmxmode=000 - 22 35 0:17 / /run rw,nosuid,nodev shared:21 - tmpfs tmpfs rw,seclabel,mode=755 - 23 16 0:18 / /sys/fs/cgroup rw,nosuid,nodev,noexec shared:9 - tmpfs tmpfs rw,seclabel,mode=755 - 24 23 0:19 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:10 - cgroup cgroup rw,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd - 25 16 0:20 / /sys/fs/pstore rw,nosuid,nodev,noexec,relatime shared:20 - pstore pstore rw - 26 23 0:21 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:11 - cgroup cgroup rw,cpuset,clone_children - 27 23 0:22 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:12 - cgroup cgroup rw,cpuacct,cpu,clone_children - 28 23 0:23 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:13 - cgroup cgroup rw,memory,clone_children - 29 23 0:24 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:14 - cgroup cgroup rw,devices,clone_children - 30 23 0:25 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:15 - cgroup cgroup rw,freezer,clone_children - 31 23 0:26 / /sys/fs/cgroup/net_cls rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,net_cls,clone_children - 32 23 0:27 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,blkio,clone_children - 33 23 0:28 / /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:18 - cgroup cgroup rw,perf_event,clone_children - 34 23 0:29 / /sys/fs/cgroup/hugetlb rw,nosuid,nodev,noexec,relatime shared:19 - cgroup cgroup rw,hugetlb,clone_children - 35 1 253:2 / / rw,relatime shared:1 - ext4 /dev/mapper/ssd-root--f20 rw,seclabel,data=ordered - 36 15 0:30 / /proc/sys/fs/binfmt_misc rw,relatime shared:22 - autofs systemd-1 rw,fd=38,pgrp=1,timeout=300,minproto=5,maxproto=5,direct - 37 17 0:12 / /dev/mqueue rw,relatime shared:23 - mqueue mqueue rw,seclabel - 38 35 0:31 / /tmp rw shared:24 - tmpfs tmpfs rw,seclabel - 39 17 0:32 / /dev/hugepages rw,relatime shared:25 - hugetlbfs hugetlbfs rw,seclabel - 40 16 0:7 / /sys/kernel/debug rw,relatime shared:26 - debugfs debugfs rw - 41 16 0:33 / /sys/kernel/config rw,relatime shared:27 - configfs configfs rw - 42 35 0:34 / /var/lib/nfs/rpc_pipefs rw,relatime shared:28 - rpc_pipefs sunrpc rw - 43 15 0:35 / /proc/fs/nfsd rw,relatime shared:29 - nfsd sunrpc rw - 45 35 8:17 / /boot rw,relatime shared:30 - ext4 /dev/sdb1 rw,seclabel,data=ordered - 46 35 253:4 / /home rw,relatime shared:31 - ext4 /dev/mapper/ssd-home rw,seclabel,data=ordered - 47 35 253:5 / /var/lib/libvirt/images rw,noatime,nodiratime shared:32 - ext4 /dev/mapper/ssd-virt rw,seclabel,discard,data=ordered - 48 35 253:12 / /mnt/old rw,relatime shared:33 - ext4 /dev/mapper/HelpDeskRHEL6-FedoraRoot rw,seclabel,data=ordered - 121 22 0:36 / /run/user/1000/gvfs rw,nosuid,nodev,relatime shared:104 - fuse.gvfsd-fuse gvfsd-fuse rw,user_id=1000,group_id=1000 - 124 16 0:37 / /sys/fs/fuse/connections rw,relatime shared:107 - fusectl fusectl rw - 165 38 253:3 / /tmp/mnt rw,relatime shared:147 - ext4 /dev/mapper/ssd-root rw,seclabel,data=ordered - 167 35 253:15 / /var/lib/docker/devicemapper/mnt/aae4076022f0e2b80a2afbf8fc6df450c52080191fcef7fb679a73e6f073e5c2 rw,relatime shared:149 - ext4 /dev/mapper/docker-253:2-425882-aae4076022f0e2b80a2afbf8fc6df450c52080191fcef7fb679a73e6f073e5c2 rw,seclabel,discard,stripe=16,data=ordered - 171 35 253:16 / /var/lib/docker/devicemapper/mnt/c71be651f114db95180e472f7871b74fa597ee70a58ccc35cb87139ddea15373 rw,relatime shared:153 - ext4 /dev/mapper/docker-253:2-425882-c71be651f114db95180e472f7871b74fa597ee70a58ccc35cb87139ddea15373 rw,seclabel,discard,stripe=16,data=ordered - 175 35 253:17 / /var/lib/docker/devicemapper/mnt/1bac6ab72862d2d5626560df6197cf12036b82e258c53d981fa29adce6f06c3c rw,relatime shared:157 - ext4 /dev/mapper/docker-253:2-425882-1bac6ab72862d2d5626560df6197cf12036b82e258c53d981fa29adce6f06c3c rw,seclabel,discard,stripe=16,data=ordered - 179 35 253:18 / /var/lib/docker/devicemapper/mnt/d710a357d77158e80d5b2c55710ae07c94e76d34d21ee7bae65ce5418f739b09 rw,relatime shared:161 - ext4 /dev/mapper/docker-253:2-425882-d710a357d77158e80d5b2c55710ae07c94e76d34d21ee7bae65ce5418f739b09 rw,seclabel,discard,stripe=16,data=ordered - 183 35 253:19 / /var/lib/docker/devicemapper/mnt/6479f52366114d5f518db6837254baab48fab39f2ac38d5099250e9a6ceae6c7 rw,relatime shared:165 - ext4 /dev/mapper/docker-253:2-425882-6479f52366114d5f518db6837254baab48fab39f2ac38d5099250e9a6ceae6c7 rw,seclabel,discard,stripe=16,data=ordered - 187 35 253:20 / /var/lib/docker/devicemapper/mnt/8d9df91c4cca5aef49eeb2725292aab324646f723a7feab56be34c2ad08268e1 rw,relatime shared:169 - ext4 /dev/mapper/docker-253:2-425882-8d9df91c4cca5aef49eeb2725292aab324646f723a7feab56be34c2ad08268e1 rw,seclabel,discard,stripe=16,data=ordered - 191 35 253:21 / /var/lib/docker/devicemapper/mnt/c8240b768603d32e920d365dc9d1dc2a6af46cd23e7ae819947f969e1b4ec661 rw,relatime shared:173 - ext4 /dev/mapper/docker-253:2-425882-c8240b768603d32e920d365dc9d1dc2a6af46cd23e7ae819947f969e1b4ec661 rw,seclabel,discard,stripe=16,data=ordered - 195 35 253:22 / /var/lib/docker/devicemapper/mnt/2eb3a01278380bbf3ed12d86ac629eaa70a4351301ee307a5cabe7b5f3b1615f rw,relatime shared:177 - ext4 /dev/mapper/docker-253:2-425882-2eb3a01278380bbf3ed12d86ac629eaa70a4351301ee307a5cabe7b5f3b1615f rw,seclabel,discard,stripe=16,data=ordered - 199 35 253:23 / /var/lib/docker/devicemapper/mnt/37a17fb7c9d9b80821235d5f2662879bd3483915f245f9b49cdaa0e38779b70b rw,relatime shared:181 - ext4 /dev/mapper/docker-253:2-425882-37a17fb7c9d9b80821235d5f2662879bd3483915f245f9b49cdaa0e38779b70b rw,seclabel,discard,stripe=16,data=ordered - 203 35 253:24 / /var/lib/docker/devicemapper/mnt/aea459ae930bf1de913e2f29428fd80ee678a1e962d4080019d9f9774331ee2b rw,relatime shared:185 - ext4 /dev/mapper/docker-253:2-425882-aea459ae930bf1de913e2f29428fd80ee678a1e962d4080019d9f9774331ee2b rw,seclabel,discard,stripe=16,data=ordered - 207 35 253:25 / /var/lib/docker/devicemapper/mnt/928ead0bc06c454bd9f269e8585aeae0a6bd697f46dc8754c2a91309bc810882 rw,relatime shared:189 - ext4 /dev/mapper/docker-253:2-425882-928ead0bc06c454bd9f269e8585aeae0a6bd697f46dc8754c2a91309bc810882 rw,seclabel,discard,stripe=16,data=ordered - 211 35 253:26 / /var/lib/docker/devicemapper/mnt/0f284d18481d671644706e7a7244cbcf63d590d634cc882cb8721821929d0420 rw,relatime shared:193 - ext4 /dev/mapper/docker-253:2-425882-0f284d18481d671644706e7a7244cbcf63d590d634cc882cb8721821929d0420 rw,seclabel,discard,stripe=16,data=ordered - 215 35 253:27 / /var/lib/docker/devicemapper/mnt/d9dd16722ab34c38db2733e23f69e8f4803ce59658250dd63e98adff95d04919 rw,relatime shared:197 - ext4 /dev/mapper/docker-253:2-425882-d9dd16722ab34c38db2733e23f69e8f4803ce59658250dd63e98adff95d04919 rw,seclabel,discard,stripe=16,data=ordered - 219 35 253:28 / /var/lib/docker/devicemapper/mnt/bc4500479f18c2c08c21ad5282e5f826a016a386177d9874c2764751c031d634 rw,relatime shared:201 - ext4 /dev/mapper/docker-253:2-425882-bc4500479f18c2c08c21ad5282e5f826a016a386177d9874c2764751c031d634 rw,seclabel,discard,stripe=16,data=ordered - 223 35 253:29 / /var/lib/docker/devicemapper/mnt/7770c8b24eb3d5cc159a065910076938910d307ab2f5d94e1dc3b24c06ee2c8a rw,relatime shared:205 - ext4 /dev/mapper/docker-253:2-425882-7770c8b24eb3d5cc159a065910076938910d307ab2f5d94e1dc3b24c06ee2c8a rw,seclabel,discard,stripe=16,data=ordered - 227 35 253:30 / /var/lib/docker/devicemapper/mnt/c280cd3d0bf0aa36b478b292279671624cceafc1a67eaa920fa1082601297adf rw,relatime shared:209 - ext4 /dev/mapper/docker-253:2-425882-c280cd3d0bf0aa36b478b292279671624cceafc1a67eaa920fa1082601297adf rw,seclabel,discard,stripe=16,data=ordered - 231 35 253:31 / /var/lib/docker/devicemapper/mnt/8b59a7d9340279f09fea67fd6ad89ddef711e9e7050eb647984f8b5ef006335f rw,relatime shared:213 - ext4 /dev/mapper/docker-253:2-425882-8b59a7d9340279f09fea67fd6ad89ddef711e9e7050eb647984f8b5ef006335f rw,seclabel,discard,stripe=16,data=ordered - 235 35 253:32 / /var/lib/docker/devicemapper/mnt/1a28059f29eda821578b1bb27a60cc71f76f846a551abefabce6efd0146dce9f rw,relatime shared:217 - ext4 /dev/mapper/docker-253:2-425882-1a28059f29eda821578b1bb27a60cc71f76f846a551abefabce6efd0146dce9f rw,seclabel,discard,stripe=16,data=ordered - 239 35 253:33 / /var/lib/docker/devicemapper/mnt/e9aa60c60128cad1 rw,relatime shared:221 - ext4 /dev/mapper/docker-253:2-425882-e9aa60c60128cad1 rw,seclabel,discard,stripe=16,data=ordered - 243 35 253:34 / /var/lib/docker/devicemapper/mnt/5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d-init rw,relatime shared:225 - ext4 /dev/mapper/docker-253:2-425882-5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d-init rw,seclabel,discard,stripe=16,data=ordered - 247 35 253:35 / /var/lib/docker/devicemapper/mnt/5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d rw,relatime shared:229 - ext4 /dev/mapper/docker-253:2-425882-5fec11304b6f4713fea7b6ccdcc1adc0a1966187f590fe25a8227428a8df275d rw,seclabel,discard,stripe=16,data=ordered - 31 21 0:23 / /DATA/foo_bla_bla rw,relatime - cifs //foo/BLA\040BLA\040BLA/ rw,sec=ntlm,cache=loose,unc=\\foo\BLA BLA BLA,username=my_login,domain=mydomain.com,uid=12345678,forceuid,gid=12345678,forcegid,addr=10.1.30.10,file_mode=0755,dir_mode=0755,nounix,rsize=61440,wsize=65536,actimeo=1` - - ubuntuMountInfo = `15 20 0:14 / /sys rw,nosuid,nodev,noexec,relatime - sysfs sysfs rw -16 20 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw -17 20 0:5 / /dev rw,relatime - devtmpfs udev rw,size=1015140k,nr_inodes=253785,mode=755 -18 17 0:11 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=000 -19 20 0:15 / /run rw,nosuid,noexec,relatime - tmpfs tmpfs rw,size=205044k,mode=755 -20 1 253:0 / / rw,relatime - ext4 /dev/disk/by-label/DOROOT rw,errors=remount-ro,data=ordered -21 15 0:16 / /sys/fs/cgroup rw,relatime - tmpfs none rw,size=4k,mode=755 -22 15 0:17 / /sys/fs/fuse/connections rw,relatime - fusectl none rw -23 15 0:6 / /sys/kernel/debug rw,relatime - debugfs none rw -24 15 0:10 / /sys/kernel/security rw,relatime - securityfs none rw -25 19 0:18 / /run/lock rw,nosuid,nodev,noexec,relatime - tmpfs none rw,size=5120k -26 21 0:19 / /sys/fs/cgroup/cpuset rw,relatime - cgroup cgroup rw,cpuset,clone_children -27 19 0:20 / /run/shm rw,nosuid,nodev,relatime - tmpfs none rw -28 21 0:21 / /sys/fs/cgroup/cpu rw,relatime - cgroup cgroup rw,cpu -29 19 0:22 / /run/user rw,nosuid,nodev,noexec,relatime - tmpfs none rw,size=102400k,mode=755 -30 15 0:23 / /sys/fs/pstore rw,relatime - pstore none rw -31 21 0:24 / /sys/fs/cgroup/cpuacct rw,relatime - cgroup cgroup rw,cpuacct -32 21 0:25 / /sys/fs/cgroup/memory rw,relatime - cgroup cgroup rw,memory -33 21 0:26 / /sys/fs/cgroup/devices rw,relatime - cgroup cgroup rw,devices -34 21 0:27 / /sys/fs/cgroup/freezer rw,relatime - cgroup cgroup rw,freezer -35 21 0:28 / /sys/fs/cgroup/blkio rw,relatime - cgroup cgroup rw,blkio -36 21 0:29 / /sys/fs/cgroup/perf_event rw,relatime - cgroup cgroup rw,perf_event -37 21 0:30 / /sys/fs/cgroup/hugetlb rw,relatime - cgroup cgroup rw,hugetlb -38 21 0:31 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime - cgroup systemd rw,name=systemd -39 20 0:32 / /var/lib/docker/aufs/mnt/b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc rw,relatime - aufs none rw,si=caafa54fdc06525 -40 20 0:33 / /var/lib/docker/aufs/mnt/2eed44ac7ce7c75af04f088ed6cb4ce9d164801e91d78c6db65d7ef6d572bba8-init rw,relatime - aufs none rw,si=caafa54f882b525 -41 20 0:34 / /var/lib/docker/aufs/mnt/2eed44ac7ce7c75af04f088ed6cb4ce9d164801e91d78c6db65d7ef6d572bba8 rw,relatime - aufs none rw,si=caafa54f8829525 -42 20 0:35 / /var/lib/docker/aufs/mnt/16f4d7e96dd612903f425bfe856762f291ff2e36a8ecd55a2209b7d7cd81c30b rw,relatime - aufs none rw,si=caafa54f882d525 -43 20 0:36 / /var/lib/docker/aufs/mnt/63ca08b75d7438a9469a5954e003f48ffede73541f6286ce1cb4d7dd4811da7e-init rw,relatime - aufs none rw,si=caafa54f882f525 -44 20 0:37 / /var/lib/docker/aufs/mnt/63ca08b75d7438a9469a5954e003f48ffede73541f6286ce1cb4d7dd4811da7e rw,relatime - aufs none rw,si=caafa54f88ba525 -45 20 0:38 / /var/lib/docker/aufs/mnt/283f35a910233c756409313be71ecd8fcfef0df57108b8d740b61b3e88860452 rw,relatime - aufs none rw,si=caafa54f88b8525 -46 20 0:39 / /var/lib/docker/aufs/mnt/2c6c7253d4090faa3886871fb21bd660609daeb0206588c0602007f7d0f254b1-init rw,relatime - aufs none rw,si=caafa54f88be525 -47 20 0:40 / /var/lib/docker/aufs/mnt/2c6c7253d4090faa3886871fb21bd660609daeb0206588c0602007f7d0f254b1 rw,relatime - aufs none rw,si=caafa54f882c525 -48 20 0:41 / /var/lib/docker/aufs/mnt/de2b538c97d6366cc80e8658547c923ea1d042f85580df379846f36a4df7049d rw,relatime - aufs none rw,si=caafa54f85bb525 -49 20 0:42 / /var/lib/docker/aufs/mnt/94a3d8ed7c27e5b0aa71eba46c736bfb2742afda038e74f2dd6035fb28415b49-init rw,relatime - aufs none rw,si=caafa54fdc00525 -50 20 0:43 / /var/lib/docker/aufs/mnt/94a3d8ed7c27e5b0aa71eba46c736bfb2742afda038e74f2dd6035fb28415b49 rw,relatime - aufs none rw,si=caafa54fbaec525 -51 20 0:44 / /var/lib/docker/aufs/mnt/6ac1cace985c9fc9bea32234de8b36dba49bdd5e29a2972b327ff939d78a6274 rw,relatime - aufs none rw,si=caafa54f8e1a525 -52 20 0:45 / /var/lib/docker/aufs/mnt/dff147033e3a0ef061e1de1ad34256b523d4a8c1fa6bba71a0ab538e8628ff0b-init rw,relatime - aufs none rw,si=caafa54f8e1d525 -53 20 0:46 / /var/lib/docker/aufs/mnt/dff147033e3a0ef061e1de1ad34256b523d4a8c1fa6bba71a0ab538e8628ff0b rw,relatime - aufs none rw,si=caafa54f8e1b525 -54 20 0:47 / /var/lib/docker/aufs/mnt/cabb117d997f0f93519185aea58389a9762770b7496ed0b74a3e4a083fa45902 rw,relatime - aufs none rw,si=caafa54f810a525 -55 20 0:48 / /var/lib/docker/aufs/mnt/e1c8a94ffaa9d532bbbdc6ef771ce8a6c2c06757806ecaf8b68e9108fec65f33-init rw,relatime - aufs none rw,si=caafa54f8529525 -56 20 0:49 / /var/lib/docker/aufs/mnt/e1c8a94ffaa9d532bbbdc6ef771ce8a6c2c06757806ecaf8b68e9108fec65f33 rw,relatime - aufs none rw,si=caafa54f852f525 -57 20 0:50 / /var/lib/docker/aufs/mnt/16a1526fa445b84ce84f89506d219e87fa488a814063baf045d88b02f21166b3 rw,relatime - aufs none rw,si=caafa54f9e1d525 -58 20 0:51 / /var/lib/docker/aufs/mnt/57b9c92e1e368fa7dbe5079f7462e917777829caae732828b003c355fe49da9f-init rw,relatime - aufs none rw,si=caafa54f854d525 -59 20 0:52 / /var/lib/docker/aufs/mnt/57b9c92e1e368fa7dbe5079f7462e917777829caae732828b003c355fe49da9f rw,relatime - aufs none rw,si=caafa54f854e525 -60 20 0:53 / /var/lib/docker/aufs/mnt/e370c3e286bea027917baa0e4d251262681a472a87056e880dfd0513516dffd9 rw,relatime - aufs none rw,si=caafa54f840a525 -61 20 0:54 / /var/lib/docker/aufs/mnt/6b00d3b4f32b41997ec07412b5e18204f82fbe643e7122251cdeb3582abd424e-init rw,relatime - aufs none rw,si=caafa54f8408525 -62 20 0:55 / /var/lib/docker/aufs/mnt/6b00d3b4f32b41997ec07412b5e18204f82fbe643e7122251cdeb3582abd424e rw,relatime - aufs none rw,si=caafa54f8409525 -63 20 0:56 / /var/lib/docker/aufs/mnt/abd0b5ea5d355a67f911475e271924a5388ee60c27185fcd60d095afc4a09dc7 rw,relatime - aufs none rw,si=caafa54f9eb1525 -64 20 0:57 / /var/lib/docker/aufs/mnt/336222effc3f7b89867bb39ff7792ae5412c35c749f127c29159d046b6feedd2-init rw,relatime - aufs none rw,si=caafa54f85bf525 -65 20 0:58 / /var/lib/docker/aufs/mnt/336222effc3f7b89867bb39ff7792ae5412c35c749f127c29159d046b6feedd2 rw,relatime - aufs none rw,si=caafa54f85b8525 -66 20 0:59 / /var/lib/docker/aufs/mnt/912e1bf28b80a09644503924a8a1a4fb8ed10b808ca847bda27a369919aa52fa rw,relatime - aufs none rw,si=caafa54fbaea525 -67 20 0:60 / /var/lib/docker/aufs/mnt/386f722875013b4a875118367abc783fc6617a3cb7cf08b2b4dcf550b4b9c576-init rw,relatime - aufs none rw,si=caafa54f8472525 -68 20 0:61 / /var/lib/docker/aufs/mnt/386f722875013b4a875118367abc783fc6617a3cb7cf08b2b4dcf550b4b9c576 rw,relatime - aufs none rw,si=caafa54f8474525 -69 20 0:62 / /var/lib/docker/aufs/mnt/5aaebb79ef3097dfca377889aeb61a0c9d5e3795117d2b08d0751473c671dfb2 rw,relatime - aufs none rw,si=caafa54f8c5e525 -70 20 0:63 / /var/lib/docker/aufs/mnt/5ba3e493279d01277d583600b81c7c079e691b73c3a2bdea8e4b12a35a418be2-init rw,relatime - aufs none rw,si=caafa54f8c3b525 -71 20 0:64 / /var/lib/docker/aufs/mnt/5ba3e493279d01277d583600b81c7c079e691b73c3a2bdea8e4b12a35a418be2 rw,relatime - aufs none rw,si=caafa54f8c3d525 -72 20 0:65 / /var/lib/docker/aufs/mnt/2777f0763da4de93f8bebbe1595cc77f739806a158657b033eca06f827b6028a rw,relatime - aufs none rw,si=caafa54f8c3e525 -73 20 0:66 / /var/lib/docker/aufs/mnt/5d7445562acf73c6f0ae34c3dd0921d7457de1ba92a587d9e06a44fa209eeb3e-init rw,relatime - aufs none rw,si=caafa54f8c39525 -74 20 0:67 / /var/lib/docker/aufs/mnt/5d7445562acf73c6f0ae34c3dd0921d7457de1ba92a587d9e06a44fa209eeb3e rw,relatime - aufs none rw,si=caafa54f854f525 -75 20 0:68 / /var/lib/docker/aufs/mnt/06400b526ec18b66639c96efc41a84f4ae0b117cb28dafd56be420651b4084a0 rw,relatime - aufs none rw,si=caafa54f840b525 -76 20 0:69 / /var/lib/docker/aufs/mnt/e051d45ec42d8e3e1cc57bb39871a40de486dc123522e9c067fbf2ca6a357785-init rw,relatime - aufs none rw,si=caafa54fdddf525 -77 20 0:70 / /var/lib/docker/aufs/mnt/e051d45ec42d8e3e1cc57bb39871a40de486dc123522e9c067fbf2ca6a357785 rw,relatime - aufs none rw,si=caafa54f854b525 -78 20 0:71 / /var/lib/docker/aufs/mnt/1ff414fa93fd61ec81b0ab7b365a841ff6545accae03cceac702833aaeaf718f rw,relatime - aufs none rw,si=caafa54f8d85525 -79 20 0:72 / /var/lib/docker/aufs/mnt/c661b2f871dd5360e46a2aebf8f970f6d39a2ff64e06979aa0361227c88128b8-init rw,relatime - aufs none rw,si=caafa54f8da3525 -80 20 0:73 / /var/lib/docker/aufs/mnt/c661b2f871dd5360e46a2aebf8f970f6d39a2ff64e06979aa0361227c88128b8 rw,relatime - aufs none rw,si=caafa54f8da2525 -81 20 0:74 / /var/lib/docker/aufs/mnt/b68b1d4fe4d30016c552398e78b379a39f651661d8e1fa5f2460c24a5e723420 rw,relatime - aufs none rw,si=caafa54f8d81525 -82 20 0:75 / /var/lib/docker/aufs/mnt/c5c5979c936cd0153a4c626fa9d69ce4fce7d924cc74fa68b025d2f585031739-init rw,relatime - aufs none rw,si=caafa54f8da1525 -83 20 0:76 / /var/lib/docker/aufs/mnt/c5c5979c936cd0153a4c626fa9d69ce4fce7d924cc74fa68b025d2f585031739 rw,relatime - aufs none rw,si=caafa54f8da0525 -84 20 0:77 / /var/lib/docker/aufs/mnt/53e10b0329afc0e0d3322d31efaed4064139dc7027fe6ae445cffd7104bcc94f rw,relatime - aufs none rw,si=caafa54f8c35525 -85 20 0:78 / /var/lib/docker/aufs/mnt/3bfafd09ff2603e2165efacc2215c1f51afabba6c42d04a68cc2df0e8cc31494-init rw,relatime - aufs none rw,si=caafa54f8db8525 -86 20 0:79 / /var/lib/docker/aufs/mnt/3bfafd09ff2603e2165efacc2215c1f51afabba6c42d04a68cc2df0e8cc31494 rw,relatime - aufs none rw,si=caafa54f8dba525 -87 20 0:80 / /var/lib/docker/aufs/mnt/90fdd2c03eeaf65311f88f4200e18aef6d2772482712d9aea01cd793c64781b5 rw,relatime - aufs none rw,si=caafa54f8315525 -88 20 0:81 / /var/lib/docker/aufs/mnt/7bdf2591c06c154ceb23f5e74b1d03b18fbf6fe96e35fbf539b82d446922442f-init rw,relatime - aufs none rw,si=caafa54f8fc6525 -89 20 0:82 / /var/lib/docker/aufs/mnt/7bdf2591c06c154ceb23f5e74b1d03b18fbf6fe96e35fbf539b82d446922442f rw,relatime - aufs none rw,si=caafa54f8468525 -90 20 0:83 / /var/lib/docker/aufs/mnt/8cf9a993f50f3305abad3da268c0fc44ff78a1e7bba595ef9de963497496c3f9 rw,relatime - aufs none rw,si=caafa54f8c59525 -91 20 0:84 / /var/lib/docker/aufs/mnt/ecc896fd74b21840a8d35e8316b92a08b1b9c83d722a12acff847e9f0ff17173-init rw,relatime - aufs none rw,si=caafa54f846a525 -92 20 0:85 / /var/lib/docker/aufs/mnt/ecc896fd74b21840a8d35e8316b92a08b1b9c83d722a12acff847e9f0ff17173 rw,relatime - aufs none rw,si=caafa54f846b525 -93 20 0:86 / /var/lib/docker/aufs/mnt/d8c8288ec920439a48b5796bab5883ee47a019240da65e8d8f33400c31bac5df rw,relatime - aufs none rw,si=caafa54f8dbf525 -94 20 0:87 / /var/lib/docker/aufs/mnt/ecba66710bcd03199b9398e46c005cd6b68d0266ec81dc8b722a29cc417997c6-init rw,relatime - aufs none rw,si=caafa54f810f525 -95 20 0:88 / /var/lib/docker/aufs/mnt/ecba66710bcd03199b9398e46c005cd6b68d0266ec81dc8b722a29cc417997c6 rw,relatime - aufs none rw,si=caafa54fbae9525 -96 20 0:89 / /var/lib/docker/aufs/mnt/befc1c67600df449dddbe796c0d06da7caff1d2bbff64cde1f0ba82d224996b5 rw,relatime - aufs none rw,si=caafa54f8dab525 -97 20 0:90 / /var/lib/docker/aufs/mnt/c9f470e73d2742629cdc4084a1b2c1a8302914f2aa0d0ec4542371df9a050562-init rw,relatime - aufs none rw,si=caafa54fdc02525 -98 20 0:91 / /var/lib/docker/aufs/mnt/c9f470e73d2742629cdc4084a1b2c1a8302914f2aa0d0ec4542371df9a050562 rw,relatime - aufs none rw,si=caafa54f9eb0525 -99 20 0:92 / /var/lib/docker/aufs/mnt/2a31f10029f04ff9d4381167a9b739609853d7220d55a56cb654779a700ee246 rw,relatime - aufs none rw,si=caafa54f8c37525 -100 20 0:93 / /var/lib/docker/aufs/mnt/8c4261b8e3e4b21ebba60389bd64b6261217e7e6b9fd09e201d5a7f6760f6927-init rw,relatime - aufs none rw,si=caafa54fd173525 -101 20 0:94 / /var/lib/docker/aufs/mnt/8c4261b8e3e4b21ebba60389bd64b6261217e7e6b9fd09e201d5a7f6760f6927 rw,relatime - aufs none rw,si=caafa54f8108525 -102 20 0:95 / /var/lib/docker/aufs/mnt/eaa0f57403a3dc685268f91df3fbcd7a8423cee50e1a9ee5c3e1688d9d676bb4 rw,relatime - aufs none rw,si=caafa54f852d525 -103 20 0:96 / /var/lib/docker/aufs/mnt/9cfe69a2cbffd9bfc7f396d4754f6fe5cc457ef417b277797be3762dfe955a6b-init rw,relatime - aufs none rw,si=caafa54f8d80525 -104 20 0:97 / /var/lib/docker/aufs/mnt/9cfe69a2cbffd9bfc7f396d4754f6fe5cc457ef417b277797be3762dfe955a6b rw,relatime - aufs none rw,si=caafa54f8fc3525 -105 20 0:98 / /var/lib/docker/aufs/mnt/d1b322ae17613c6adee84e709641a9244ac56675244a89a64dc0075075fcbb83 rw,relatime - aufs none rw,si=caafa54f8c58525 -106 20 0:99 / /var/lib/docker/aufs/mnt/d46c2a8e9da7e91ab34fd9c192851c246a4e770a46720bda09e55c7554b9dbbd-init rw,relatime - aufs none rw,si=caafa54f8c63525 -107 20 0:100 / /var/lib/docker/aufs/mnt/d46c2a8e9da7e91ab34fd9c192851c246a4e770a46720bda09e55c7554b9dbbd rw,relatime - aufs none rw,si=caafa54f8c67525 -108 20 0:101 / /var/lib/docker/aufs/mnt/bc9d2a264158f83a617a069bf17cbbf2a2ba453db7d3951d9dc63cc1558b1c2b rw,relatime - aufs none rw,si=caafa54f8dbe525 -109 20 0:102 / /var/lib/docker/aufs/mnt/9e6abb8d72bbeb4d5cf24b96018528015ba830ce42b4859965bd482cbd034e99-init rw,relatime - aufs none rw,si=caafa54f9e0d525 -110 20 0:103 / /var/lib/docker/aufs/mnt/9e6abb8d72bbeb4d5cf24b96018528015ba830ce42b4859965bd482cbd034e99 rw,relatime - aufs none rw,si=caafa54f9e1b525 -111 20 0:104 / /var/lib/docker/aufs/mnt/d4dca7b02569c732e740071e1c654d4ad282de5c41edb619af1f0aafa618be26 rw,relatime - aufs none rw,si=caafa54f8dae525 -112 20 0:105 / /var/lib/docker/aufs/mnt/fea63da40fa1c5ffbad430dde0bc64a8fc2edab09a051fff55b673c40a08f6b7-init rw,relatime - aufs none rw,si=caafa54f8c5c525 -113 20 0:106 / /var/lib/docker/aufs/mnt/fea63da40fa1c5ffbad430dde0bc64a8fc2edab09a051fff55b673c40a08f6b7 rw,relatime - aufs none rw,si=caafa54fd172525 -114 20 0:107 / /var/lib/docker/aufs/mnt/e60c57499c0b198a6734f77f660cdbbd950a5b78aa23f470ca4f0cfcc376abef rw,relatime - aufs none rw,si=caafa54909c4525 -115 20 0:108 / /var/lib/docker/aufs/mnt/099c78e7ccd9c8717471bb1bbfff838c0a9913321ba2f214fbeaf92c678e5b35-init rw,relatime - aufs none rw,si=caafa54909c3525 -116 20 0:109 / /var/lib/docker/aufs/mnt/099c78e7ccd9c8717471bb1bbfff838c0a9913321ba2f214fbeaf92c678e5b35 rw,relatime - aufs none rw,si=caafa54909c7525 -117 20 0:110 / /var/lib/docker/aufs/mnt/2997be666d58b9e71469759bcb8bd9608dad0e533a1a7570a896919ba3388825 rw,relatime - aufs none rw,si=caafa54f8557525 -118 20 0:111 / /var/lib/docker/aufs/mnt/730694eff438ef20569df38dfb38a920969d7ff2170cc9aa7cb32a7ed8147a93-init rw,relatime - aufs none rw,si=caafa54c6e88525 -119 20 0:112 / /var/lib/docker/aufs/mnt/730694eff438ef20569df38dfb38a920969d7ff2170cc9aa7cb32a7ed8147a93 rw,relatime - aufs none rw,si=caafa54c6e8e525 -120 20 0:113 / /var/lib/docker/aufs/mnt/a672a1e2f2f051f6e19ed1dfbe80860a2d774174c49f7c476695f5dd1d5b2f67 rw,relatime - aufs none rw,si=caafa54c6e15525 -121 20 0:114 / /var/lib/docker/aufs/mnt/aba3570e17859f76cf29d282d0d150659c6bd80780fdc52a465ba05245c2a420-init rw,relatime - aufs none rw,si=caafa54f8dad525 -122 20 0:115 / /var/lib/docker/aufs/mnt/aba3570e17859f76cf29d282d0d150659c6bd80780fdc52a465ba05245c2a420 rw,relatime - aufs none rw,si=caafa54f8d84525 -123 20 0:116 / /var/lib/docker/aufs/mnt/2abc86007aca46fb4a817a033e2a05ccacae40b78ea4b03f8ea616b9ada40e2e rw,relatime - aufs none rw,si=caafa54c6e8b525 -124 20 0:117 / /var/lib/docker/aufs/mnt/36352f27f7878e648367a135bd1ec3ed497adcb8ac13577ee892a0bd921d2374-init rw,relatime - aufs none rw,si=caafa54c6e8d525 -125 20 0:118 / /var/lib/docker/aufs/mnt/36352f27f7878e648367a135bd1ec3ed497adcb8ac13577ee892a0bd921d2374 rw,relatime - aufs none rw,si=caafa54f8c34525 -126 20 0:119 / /var/lib/docker/aufs/mnt/2f95ca1a629cea8363b829faa727dd52896d5561f2c96ddee4f697ea2fc872c2 rw,relatime - aufs none rw,si=caafa54c6e8a525 -127 20 0:120 / /var/lib/docker/aufs/mnt/f108c8291654f179ef143a3e07de2b5a34adbc0b28194a0ab17742b6db9a7fb2-init rw,relatime - aufs none rw,si=caafa54f8e19525 -128 20 0:121 / /var/lib/docker/aufs/mnt/f108c8291654f179ef143a3e07de2b5a34adbc0b28194a0ab17742b6db9a7fb2 rw,relatime - aufs none rw,si=caafa54fa8c6525 -129 20 0:122 / /var/lib/docker/aufs/mnt/c1d04dfdf8cccb3676d5a91e84e9b0781ce40623d127d038bcfbe4c761b27401 rw,relatime - aufs none rw,si=caafa54f8c30525 -130 20 0:123 / /var/lib/docker/aufs/mnt/3f4898ffd0e1239aeebf1d1412590cdb7254207fa3883663e2c40cf772e5f05a-init rw,relatime - aufs none rw,si=caafa54c6e1a525 -131 20 0:124 / /var/lib/docker/aufs/mnt/3f4898ffd0e1239aeebf1d1412590cdb7254207fa3883663e2c40cf772e5f05a rw,relatime - aufs none rw,si=caafa54c6e1c525 -132 20 0:125 / /var/lib/docker/aufs/mnt/5ae3b6fccb1539fc02d420e86f3e9637bef5b711fed2ca31a2f426c8f5deddbf rw,relatime - aufs none rw,si=caafa54c4fea525 -133 20 0:126 / /var/lib/docker/aufs/mnt/310bfaf80d57020f2e73b06aeffb0b9b0ca2f54895f88bf5e4d1529ccac58fe0-init rw,relatime - aufs none rw,si=caafa54c6e1e525 -134 20 0:127 / /var/lib/docker/aufs/mnt/310bfaf80d57020f2e73b06aeffb0b9b0ca2f54895f88bf5e4d1529ccac58fe0 rw,relatime - aufs none rw,si=caafa54fa8c0525 -135 20 0:128 / /var/lib/docker/aufs/mnt/f382bd5aaccaf2d04a59089ac7cb12ec87efd769fd0c14d623358fbfd2a3f896 rw,relatime - aufs none rw,si=caafa54c4fec525 -136 20 0:129 / /var/lib/docker/aufs/mnt/50d45e9bb2d779bc6362824085564c7578c231af5ae3b3da116acf7e17d00735-init rw,relatime - aufs none rw,si=caafa54c4fef525 -137 20 0:130 / /var/lib/docker/aufs/mnt/50d45e9bb2d779bc6362824085564c7578c231af5ae3b3da116acf7e17d00735 rw,relatime - aufs none rw,si=caafa54c4feb525 -138 20 0:131 / /var/lib/docker/aufs/mnt/a9c5ee0854dc083b6bf62b7eb1e5291aefbb10702289a446471ce73aba0d5d7d rw,relatime - aufs none rw,si=caafa54909c6525 -139 20 0:134 / /var/lib/docker/aufs/mnt/03a613e7bd5078819d1fd92df4e671c0127559a5e0b5a885cc8d5616875162f0-init rw,relatime - aufs none rw,si=caafa54804fe525 -140 20 0:135 / /var/lib/docker/aufs/mnt/03a613e7bd5078819d1fd92df4e671c0127559a5e0b5a885cc8d5616875162f0 rw,relatime - aufs none rw,si=caafa54804fa525 -141 20 0:136 / /var/lib/docker/aufs/mnt/7ec3277e5c04c907051caf9c9c35889f5fcd6463e5485971b25404566830bb70 rw,relatime - aufs none rw,si=caafa54804f9525 -142 20 0:139 / /var/lib/docker/aufs/mnt/26b5b5d71d79a5b2bfcf8bc4b2280ee829f261eb886745dd90997ed410f7e8b8-init rw,relatime - aufs none rw,si=caafa54c6ef6525 -143 20 0:140 / /var/lib/docker/aufs/mnt/26b5b5d71d79a5b2bfcf8bc4b2280ee829f261eb886745dd90997ed410f7e8b8 rw,relatime - aufs none rw,si=caafa54c6ef5525 -144 20 0:356 / /var/lib/docker/aufs/mnt/e6ecde9e2c18cd3c75f424c67b6d89685cfee0fc67abf2cb6bdc0867eb998026 rw,relatime - aufs none rw,si=caafa548068e525` - - gentooMountinfo = `15 1 8:6 / / rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered -16 15 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw -17 15 0:14 / /run rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=3292172k,mode=755 -18 15 0:5 / /dev rw,nosuid,relatime - devtmpfs udev rw,size=10240k,nr_inodes=4106451,mode=755 -19 18 0:12 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw -20 18 0:10 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=000 -21 18 0:15 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw -22 15 0:16 / /sys rw,nosuid,nodev,noexec,relatime - sysfs sysfs rw -23 22 0:7 / /sys/kernel/debug rw,nosuid,nodev,noexec,relatime - debugfs debugfs rw -24 22 0:17 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs cgroup_root rw,size=10240k,mode=755 -25 24 0:18 / /sys/fs/cgroup/openrc rw,nosuid,nodev,noexec,relatime - cgroup openrc rw,release_agent=/lib64/rc/sh/cgroup-release-agent.sh,name=openrc -26 24 0:19 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime - cgroup cpuset rw,cpuset,clone_children -27 24 0:20 / /sys/fs/cgroup/cpu rw,nosuid,nodev,noexec,relatime - cgroup cpu rw,cpu,clone_children -28 24 0:21 / /sys/fs/cgroup/cpuacct rw,nosuid,nodev,noexec,relatime - cgroup cpuacct rw,cpuacct,clone_children -29 24 0:22 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime - cgroup memory rw,memory,clone_children -30 24 0:23 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime - cgroup devices rw,devices,clone_children -31 24 0:24 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime - cgroup freezer rw,freezer,clone_children -32 24 0:25 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime - cgroup blkio rw,blkio,clone_children -33 15 8:1 / /boot rw,noatime,nodiratime - vfat /dev/sda1 rw,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro -34 15 8:18 / /mnt/xfs rw,noatime,nodiratime - xfs /dev/sdb2 rw,attr2,inode64,noquota -35 15 0:26 / /tmp rw,relatime - tmpfs tmpfs rw -36 16 0:27 / /proc/sys/fs/binfmt_misc rw,nosuid,nodev,noexec,relatime - binfmt_misc binfmt_misc rw -42 15 0:33 / /var/lib/nfs/rpc_pipefs rw,relatime - rpc_pipefs rpc_pipefs rw -43 16 0:34 / /proc/fs/nfsd rw,nosuid,nodev,noexec,relatime - nfsd nfsd rw -44 15 0:35 / /home/tianon/.gvfs rw,nosuid,nodev,relatime - fuse.gvfs-fuse-daemon gvfs-fuse-daemon rw,user_id=1000,group_id=1000 -68 15 0:3336 / /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd rw,relatime - aufs none rw,si=9b4a7640128db39c -86 68 8:6 /var/lib/docker/containers/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/config.env /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/.dockerenv rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered -87 68 8:6 /etc/resolv.conf /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/etc/resolv.conf rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered -88 68 8:6 /var/lib/docker/containers/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/hostname /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/etc/hostname rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered -89 68 8:6 /var/lib/docker/containers/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/hosts /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/etc/hosts rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered -38 15 0:3384 / /var/lib/docker/aufs/mnt/0292005a9292401bb5197657f2b682d97d8edcb3b72b5e390d2a680139985b55 rw,relatime - aufs none rw,si=9b4a7642b584939c -39 15 0:3385 / /var/lib/docker/aufs/mnt/59db98c889de5f71b70cfb82c40cbe47b64332f0f56042a2987a9e5df6e5e3aa rw,relatime - aufs none rw,si=9b4a7642b584e39c -40 15 0:3386 / /var/lib/docker/aufs/mnt/0545f0f2b6548eb9601d08f35a08f5a0a385407d36027a28f58e06e9f61e0278 rw,relatime - aufs none rw,si=9b4a7642b584b39c -41 15 0:3387 / /var/lib/docker/aufs/mnt/d882cfa16d1aa8fe0331a36e79be3d80b151e49f24fc39a39c3fed1735d5feb5 rw,relatime - aufs none rw,si=9b4a76453040039c -45 15 0:3388 / /var/lib/docker/aufs/mnt/055ca3befcb1626e74f5344b3398724ff05c0de0e20021683d04305c9e70a3f6 rw,relatime - aufs none rw,si=9b4a76453040739c -46 15 0:3389 / /var/lib/docker/aufs/mnt/b899e4567a351745d4285e7f1c18fdece75d877deb3041981cd290be348b7aa6 rw,relatime - aufs none rw,si=9b4a7647def4039c -47 15 0:3390 / /var/lib/docker/aufs/mnt/067ca040292c58954c5129f953219accfae0d40faca26b4d05e76ca76a998f16 rw,relatime - aufs none rw,si=9b4a7647def4239c -48 15 0:3391 / /var/lib/docker/aufs/mnt/8c995e7cb6e5082742daeea720e340b021d288d25d92e0412c03d200df308a11 rw,relatime - aufs none rw,si=9b4a764479c1639c -49 15 0:3392 / /var/lib/docker/aufs/mnt/07cc54dfae5b45300efdacdd53cc72c01b9044956a86ce7bff42d087e426096d rw,relatime - aufs none rw,si=9b4a764479c1739c -50 15 0:3393 / /var/lib/docker/aufs/mnt/0a9c95cf4c589c05b06baa79150b0cc1d8e7102759fe3ce4afaabb8247ca4f85 rw,relatime - aufs none rw,si=9b4a7644059c839c -51 15 0:3394 / /var/lib/docker/aufs/mnt/468fa98cececcf4e226e8370f18f4f848d63faf287fb8321a07f73086441a3a0 rw,relatime - aufs none rw,si=9b4a7644059ca39c -52 15 0:3395 / /var/lib/docker/aufs/mnt/0b826192231c5ce066fffb5beff4397337b5fc19a377aa7c6282c7c0ce7f111f rw,relatime - aufs none rw,si=9b4a764479c1339c -53 15 0:3396 / /var/lib/docker/aufs/mnt/93b8ba1b772fbe79709b909c43ea4b2c30d712e53548f467db1ffdc7a384f196 rw,relatime - aufs none rw,si=9b4a7640798a739c -54 15 0:3397 / /var/lib/docker/aufs/mnt/0c0d0acfb506859b12ef18cdfef9ebed0b43a611482403564224bde9149d373c rw,relatime - aufs none rw,si=9b4a7640798a039c -55 15 0:3398 / /var/lib/docker/aufs/mnt/33648c39ab6c7c74af0243d6d6a81b052e9e25ad1e04b19892eb2dde013e358b rw,relatime - aufs none rw,si=9b4a7644b439b39c -56 15 0:3399 / /var/lib/docker/aufs/mnt/0c12bea97a1c958a3c739fb148536c1c89351d48e885ecda8f0499b5cc44407e rw,relatime - aufs none rw,si=9b4a7640798a239c -57 15 0:3400 / /var/lib/docker/aufs/mnt/ed443988ce125f172d7512e84a4de2627405990fd767a16adefa8ce700c19ce8 rw,relatime - aufs none rw,si=9b4a7644c8ed339c -59 15 0:3402 / /var/lib/docker/aufs/mnt/f61612c324ff3c924d3f7a82fb00a0f8d8f73c248c41897061949e9f5ab7e3b1 rw,relatime - aufs none rw,si=9b4a76442810c39c -60 15 0:3403 / /var/lib/docker/aufs/mnt/0f1ee55c6c4e25027b80de8e64b8b6fb542b3b41aa0caab9261da75752e22bfd rw,relatime - aufs none rw,si=9b4a76442810e39c -61 15 0:3404 / /var/lib/docker/aufs/mnt/956f6cc4af5785cb3ee6963dcbca668219437d9b28f513290b1453ac64a34f97 rw,relatime - aufs none rw,si=9b4a7644303ec39c -62 15 0:3405 / /var/lib/docker/aufs/mnt/1099769158c4b4773e2569e38024e8717e400f87a002c41d8cf47cb81b051ba6 rw,relatime - aufs none rw,si=9b4a7644303ee39c -63 15 0:3406 / /var/lib/docker/aufs/mnt/11890ceb98d4442595b676085cd7b21550ab85c5df841e0fba997ff54e3d522d rw,relatime - aufs none rw,si=9b4a7644303ed39c -64 15 0:3407 / /var/lib/docker/aufs/mnt/acdb90dc378e8ed2420b43a6d291f1c789a081cd1904018780cc038fcd7aae53 rw,relatime - aufs none rw,si=9b4a76434be2139c -65 15 0:3408 / /var/lib/docker/aufs/mnt/120e716f19d4714fbe63cc1ed246204f2c1106eefebc6537ba2587d7e7711959 rw,relatime - aufs none rw,si=9b4a76434be2339c -66 15 0:3409 / /var/lib/docker/aufs/mnt/b197b7fffb61d89e0ba1c40de9a9fc0d912e778b3c1bd828cf981ff37c1963bc rw,relatime - aufs none rw,si=9b4a76434be2039c -70 15 0:3412 / /var/lib/docker/aufs/mnt/1434b69d2e1bb18a9f0b96b9cdac30132b2688f5d1379f68a39a5e120c2f93eb rw,relatime - aufs none rw,si=9b4a76434be2639c -71 15 0:3413 / /var/lib/docker/aufs/mnt/16006e83caf33ab5eb0cd6afc92ea2ee8edeff897496b0bb3ec3a75b767374b3 rw,relatime - aufs none rw,si=9b4a7644d790439c -72 15 0:3414 / /var/lib/docker/aufs/mnt/55bfa5f44e94d27f91f79ba901b118b15098449165c87abf1b53ffff147ff164 rw,relatime - aufs none rw,si=9b4a7644d790239c -73 15 0:3415 / /var/lib/docker/aufs/mnt/1912b97a07ab21ccd98a2a27bc779bf3cf364a3138afa3c3e6f7f169a3c3eab5 rw,relatime - aufs none rw,si=9b4a76441822739c -76 15 0:3418 / /var/lib/docker/aufs/mnt/1a7c3292e8879bd91ffd9282e954f643b1db5683093574c248ff14a9609f2f56 rw,relatime - aufs none rw,si=9b4a76438cb7239c -77 15 0:3419 / /var/lib/docker/aufs/mnt/bb1faaf0d076ddba82c2318305a85f490dafa4e8a8640a8db8ed657c439120cc rw,relatime - aufs none rw,si=9b4a76438cb7339c -78 15 0:3420 / /var/lib/docker/aufs/mnt/1ab869f21d2241a73ac840c7f988490313f909ac642eba71d092204fec66dd7c rw,relatime - aufs none rw,si=9b4a76438cb7639c -79 15 0:3421 / /var/lib/docker/aufs/mnt/fd7245b2cfe3890fa5f5b452260e4edf9e7fb7746532ed9d83f7a0d7dbaa610e rw,relatime - aufs none rw,si=9b4a7644bdc0139c -80 15 0:3422 / /var/lib/docker/aufs/mnt/1e5686c5301f26b9b3cd24e322c608913465cc6c5d0dcd7c5e498d1314747d61 rw,relatime - aufs none rw,si=9b4a7644bdc0639c -81 15 0:3423 / /var/lib/docker/aufs/mnt/52edf6ee6e40bfec1e9301a4d4a92ab83d144e2ae4ce5099e99df6138cb844bf rw,relatime - aufs none rw,si=9b4a7644bdc0239c -82 15 0:3424 / /var/lib/docker/aufs/mnt/1ea10fb7085d28cda4904657dff0454e52598d28e1d77e4f2965bbc3666e808f rw,relatime - aufs none rw,si=9b4a76438cb7139c -83 15 0:3425 / /var/lib/docker/aufs/mnt/9c03e98c3593946dbd4087f8d83f9ca262f4a2efdc952ce60690838b9ba6c526 rw,relatime - aufs none rw,si=9b4a76443020639c -84 15 0:3426 / /var/lib/docker/aufs/mnt/220a2344d67437602c6d2cee9a98c46be13f82c2a8063919dd2fad52bf2fb7dd rw,relatime - aufs none rw,si=9b4a76434bff339c -94 15 0:3427 / /var/lib/docker/aufs/mnt/3b32876c5b200312c50baa476ff342248e88c8ea96e6a1032cd53a88738a1cf2 rw,relatime - aufs none rw,si=9b4a76434bff139c -95 15 0:3428 / /var/lib/docker/aufs/mnt/23ee2b8b0d4ae8db6f6d1e168e2c6f79f8a18f953b09f65e0d22cc1e67a3a6fa rw,relatime - aufs none rw,si=9b4a7646c305c39c -96 15 0:3429 / /var/lib/docker/aufs/mnt/e86e6daa70b61b57945fa178222615f3c3d6bcef12c9f28e9f8623d44dc2d429 rw,relatime - aufs none rw,si=9b4a7646c305f39c -97 15 0:3430 / /var/lib/docker/aufs/mnt/2413d07623e80860bb2e9e306fbdee699afd07525785c025c591231e864aa162 rw,relatime - aufs none rw,si=9b4a76434bff039c -98 15 0:3431 / /var/lib/docker/aufs/mnt/adfd622eb22340fc80b429e5564b125668e260bf9068096c46dd59f1386a4b7d rw,relatime - aufs none rw,si=9b4a7646a7a1039c -102 15 0:3435 / /var/lib/docker/aufs/mnt/27cd92e7a91d02e2d6b44d16679a00fb6d169b19b88822891084e7fd1a84882d rw,relatime - aufs none rw,si=9b4a7646f25ec39c -103 15 0:3436 / /var/lib/docker/aufs/mnt/27dfdaf94cfbf45055c748293c37dd68d9140240bff4c646cb09216015914a88 rw,relatime - aufs none rw,si=9b4a7646732f939c -104 15 0:3437 / /var/lib/docker/aufs/mnt/5ed7524aff68dfbf0fc601cbaeac01bab14391850a973dabf3653282a627920f rw,relatime - aufs none rw,si=9b4a7646732f839c -105 15 0:3438 / /var/lib/docker/aufs/mnt/2a0d4767e536beb5785b60e071e3ac8e5e812613ab143a9627bee77d0c9ab062 rw,relatime - aufs none rw,si=9b4a7646732fe39c -106 15 0:3439 / /var/lib/docker/aufs/mnt/dea3fc045d9f4ae51ba952450b948a822cf85c39411489ca5224f6d9a8d02bad rw,relatime - aufs none rw,si=9b4a764012ad839c -107 15 0:3440 / /var/lib/docker/aufs/mnt/2d140a787160798da60cb67c21b1210054ad4dafecdcf832f015995b9aa99cfd rw,relatime - aufs none rw,si=9b4a764012add39c -108 15 0:3441 / /var/lib/docker/aufs/mnt/cb190b2a8e984475914430fbad2382e0d20b9b659f8ef83ae8d170cc672e519c rw,relatime - aufs none rw,si=9b4a76454d9c239c -109 15 0:3442 / /var/lib/docker/aufs/mnt/2f4a012d5a7ffd90256a6e9aa479054b3dddbc3c6a343f26dafbf3196890223b rw,relatime - aufs none rw,si=9b4a76454d9c439c -110 15 0:3443 / /var/lib/docker/aufs/mnt/63cc77904b80c4ffbf49cb974c5d8733dc52ad7640d3ae87554b325d7312d87f rw,relatime - aufs none rw,si=9b4a76454d9c339c -111 15 0:3444 / /var/lib/docker/aufs/mnt/30333e872c451482ea2d235ff2192e875bd234006b238ae2bdde3b91a86d7522 rw,relatime - aufs none rw,si=9b4a76422cebf39c -112 15 0:3445 / /var/lib/docker/aufs/mnt/6c54fc1125da3925cae65b5c9a98f3be55b0a2c2666082e5094a4ba71beb5bff rw,relatime - aufs none rw,si=9b4a7646dd5a439c -113 15 0:3446 / /var/lib/docker/aufs/mnt/3087d48cb01cda9d0a83a9ca301e6ea40e8593d18c4921be4794c91a420ab9a3 rw,relatime - aufs none rw,si=9b4a7646dd5a739c -114 15 0:3447 / /var/lib/docker/aufs/mnt/cc2607462a8f55b179a749b144c3fdbb50678e1a4f3065ea04e283e9b1f1d8e2 rw,relatime - aufs none rw,si=9b4a7646dd5a239c -117 15 0:3450 / /var/lib/docker/aufs/mnt/310c5e8392b29e8658a22e08d96d63936633b7e2c38e8d220047928b00a03d24 rw,relatime - aufs none rw,si=9b4a7647932d739c -118 15 0:3451 / /var/lib/docker/aufs/mnt/38a1f0029406ba9c3b6058f2f406d8a1d23c855046cf355c91d87d446fcc1460 rw,relatime - aufs none rw,si=9b4a76445abc939c -119 15 0:3452 / /var/lib/docker/aufs/mnt/42e109ab7914ae997a11ccd860fd18e4d488c50c044c3240423ce15774b8b62e rw,relatime - aufs none rw,si=9b4a76445abca39c -120 15 0:3453 / /var/lib/docker/aufs/mnt/365d832af0402d052b389c1e9c0d353b48487533d20cd4351df8e24ec4e4f9d8 rw,relatime - aufs none rw,si=9b4a7644066aa39c -121 15 0:3454 / /var/lib/docker/aufs/mnt/d3fa8a24d695b6cda9b64f96188f701963d28bef0473343f8b212df1a2cf1d2b rw,relatime - aufs none rw,si=9b4a7644066af39c -122 15 0:3455 / /var/lib/docker/aufs/mnt/37d4f491919abc49a15d0c7a7cc8383f087573525d7d288accd14f0b4af9eae0 rw,relatime - aufs none rw,si=9b4a7644066ad39c -123 15 0:3456 / /var/lib/docker/aufs/mnt/93902707fe12cbdd0068ce73f2baad4b3a299189b1b19cb5f8a2025e106ae3f5 rw,relatime - aufs none rw,si=9b4a76444445f39c -126 15 0:3459 / /var/lib/docker/aufs/mnt/3b49291670a625b9bbb329ffba99bf7fa7abff80cefef040f8b89e2b3aad4f9f rw,relatime - aufs none rw,si=9b4a7640798a339c -127 15 0:3460 / /var/lib/docker/aufs/mnt/8d9c7b943cc8f854f4d0d4ec19f7c16c13b0cc4f67a41472a072648610cecb59 rw,relatime - aufs none rw,si=9b4a76427383039c -128 15 0:3461 / /var/lib/docker/aufs/mnt/3b6c90036526c376307df71d49c9f5fce334c01b926faa6a78186842de74beac rw,relatime - aufs none rw,si=9b4a7644badd439c -130 15 0:3463 / /var/lib/docker/aufs/mnt/7b24158eeddfb5d31b7e932e406ea4899fd728344335ff8e0765e89ddeb351dd rw,relatime - aufs none rw,si=9b4a7644badd539c -131 15 0:3464 / /var/lib/docker/aufs/mnt/3ead6dd5773765c74850cf6c769f21fe65c29d622ffa712664f9f5b80364ce27 rw,relatime - aufs none rw,si=9b4a7642f469939c -132 15 0:3465 / /var/lib/docker/aufs/mnt/3f825573b29547744a37b65597a9d6d15a8350be4429b7038d126a4c9a8e178f rw,relatime - aufs none rw,si=9b4a7642f469c39c -133 15 0:3466 / /var/lib/docker/aufs/mnt/f67aaaeb3681e5dcb99a41f847087370bd1c206680cb8c7b6a9819fd6c97a331 rw,relatime - aufs none rw,si=9b4a7647cc25939c -134 15 0:3467 / /var/lib/docker/aufs/mnt/41afe6cfb3c1fc2280b869db07699da88552786e28793f0bc048a265c01bd942 rw,relatime - aufs none rw,si=9b4a7647cc25c39c -135 15 0:3468 / /var/lib/docker/aufs/mnt/b8092ea59da34a40b120e8718c3ae9fa8436996edc4fc50e4b99c72dfd81e1af rw,relatime - aufs none rw,si=9b4a76445abc439c -136 15 0:3469 / /var/lib/docker/aufs/mnt/42c69d2cc179e2684458bb8596a9da6dad182c08eae9b74d5f0e615b399f75a5 rw,relatime - aufs none rw,si=9b4a76455ddbe39c -137 15 0:3470 / /var/lib/docker/aufs/mnt/ea0871954acd2d62a211ac60e05969622044d4c74597870c4f818fbb0c56b09b rw,relatime - aufs none rw,si=9b4a76455ddbf39c -138 15 0:3471 / /var/lib/docker/aufs/mnt/4307906b275ab3fc971786b3841ae3217ac85b6756ddeb7ad4ba09cd044c2597 rw,relatime - aufs none rw,si=9b4a76455ddb839c -139 15 0:3472 / /var/lib/docker/aufs/mnt/4390b872928c53500a5035634f3421622ed6299dc1472b631fc45de9f56dc180 rw,relatime - aufs none rw,si=9b4a76402f2fd39c -140 15 0:3473 / /var/lib/docker/aufs/mnt/6bb41e78863b85e4aa7da89455314855c8c3bda64e52a583bab15dc1fa2e80c2 rw,relatime - aufs none rw,si=9b4a76402f2fa39c -141 15 0:3474 / /var/lib/docker/aufs/mnt/4444f583c2a79c66608f4673a32c9c812154f027045fbd558c2d69920c53f835 rw,relatime - aufs none rw,si=9b4a764479dbd39c -142 15 0:3475 / /var/lib/docker/aufs/mnt/6f11883af4a05ea362e0c54df89058da4859f977efd07b6f539e1f55c1d2a668 rw,relatime - aufs none rw,si=9b4a76402f30b39c -143 15 0:3476 / /var/lib/docker/aufs/mnt/453490dd32e7c2e9ef906f995d8fb3c2753923d1a5e0ba3fd3296e2e4dc238e7 rw,relatime - aufs none rw,si=9b4a76402f30c39c -144 15 0:3477 / /var/lib/docker/aufs/mnt/45e5945735ee102b5e891c91650c57ec4b52bb53017d68f02d50ea8a6e230610 rw,relatime - aufs none rw,si=9b4a76423260739c -147 15 0:3480 / /var/lib/docker/aufs/mnt/4727a64a5553a1125f315b96bed10d3073d6988225a292cce732617c925b56ab rw,relatime - aufs none rw,si=9b4a76443030339c -150 15 0:3483 / /var/lib/docker/aufs/mnt/4e348b5187b9a567059306afc72d42e0ec5c893b0d4abd547526d5f9b6fb4590 rw,relatime - aufs none rw,si=9b4a7644f5d8c39c -151 15 0:3484 / /var/lib/docker/aufs/mnt/4efc616bfbc3f906718b052da22e4335f8e9f91ee9b15866ed3a8029645189ef rw,relatime - aufs none rw,si=9b4a7644f5d8939c -152 15 0:3485 / /var/lib/docker/aufs/mnt/83e730ae9754d5adb853b64735472d98dfa17136b8812ac9cfcd1eba7f4e7d2d rw,relatime - aufs none rw,si=9b4a76469aa7139c -153 15 0:3486 / /var/lib/docker/aufs/mnt/4fc5ba8a5b333be2b7eefacccb626772eeec0ae8a6975112b56c9fb36c0d342f rw,relatime - aufs none rw,si=9b4a7640128dc39c -154 15 0:3487 / /var/lib/docker/aufs/mnt/50200d5edff5dfe8d1ef3c78b0bbd709793ac6e936aa16d74ff66f7ea577b6f9 rw,relatime - aufs none rw,si=9b4a7640128da39c -155 15 0:3488 / /var/lib/docker/aufs/mnt/51e5e51604361448f0b9777f38329f414bc5ba9cf238f26d465ff479bd574b61 rw,relatime - aufs none rw,si=9b4a76444f68939c -156 15 0:3489 / /var/lib/docker/aufs/mnt/52a142149aa98bba83df8766bbb1c629a97b9799944ead90dd206c4bdf0b8385 rw,relatime - aufs none rw,si=9b4a76444f68b39c -157 15 0:3490 / /var/lib/docker/aufs/mnt/52dd21a94a00f58a1ed489312fcfffb91578089c76c5650364476f1d5de031bc rw,relatime - aufs none rw,si=9b4a76444f68f39c -158 15 0:3491 / /var/lib/docker/aufs/mnt/ee562415ddaad353ed22c88d0ca768a0c74bfba6333b6e25c46849ee22d990da rw,relatime - aufs none rw,si=9b4a7640128d839c -159 15 0:3492 / /var/lib/docker/aufs/mnt/db47a9e87173f7554f550c8a01891de79cf12acdd32e01f95c1a527a08bdfb2c rw,relatime - aufs none rw,si=9b4a764405a1d39c -160 15 0:3493 / /var/lib/docker/aufs/mnt/55e827bf6d44d930ec0b827c98356eb8b68c3301e2d60d1429aa72e05b4c17df rw,relatime - aufs none rw,si=9b4a764405a1a39c -162 15 0:3495 / /var/lib/docker/aufs/mnt/578dc4e0a87fc37ec081ca098430499a59639c09f6f12a8f48de29828a091aa6 rw,relatime - aufs none rw,si=9b4a76406d7d439c -163 15 0:3496 / /var/lib/docker/aufs/mnt/728cc1cb04fa4bc6f7bf7a90980beda6d8fc0beb71630874c0747b994efb0798 rw,relatime - aufs none rw,si=9b4a76444f20e39c -164 15 0:3497 / /var/lib/docker/aufs/mnt/5850cc4bd9b55aea46c7ad598f1785117607974084ea643580f58ce3222e683a rw,relatime - aufs none rw,si=9b4a7644a824239c -165 15 0:3498 / /var/lib/docker/aufs/mnt/89443b3f766d5a37bc8b84e29da8b84e6a3ea8486d3cf154e2aae1816516e4a8 rw,relatime - aufs none rw,si=9b4a7644a824139c -166 15 0:3499 / /var/lib/docker/aufs/mnt/f5ae8fd5a41a337907d16515bc3162525154b59c32314c695ecd092c3b47943d rw,relatime - aufs none rw,si=9b4a7644a824439c -167 15 0:3500 / /var/lib/docker/aufs/mnt/5a430854f2a03a9e5f7cbc9f3fb46a8ebca526a5b3f435236d8295e5998798f5 rw,relatime - aufs none rw,si=9b4a7647fc82439c -168 15 0:3501 / /var/lib/docker/aufs/mnt/eda16901ae4cead35070c39845cbf1e10bd6b8cb0ffa7879ae2d8a186e460f91 rw,relatime - aufs none rw,si=9b4a76441e0df39c -169 15 0:3502 / /var/lib/docker/aufs/mnt/5a593721430c2a51b119ff86a7e06ea2b37e3b4131f8f1344d402b61b0c8d868 rw,relatime - aufs none rw,si=9b4a764248bad39c -170 15 0:3503 / /var/lib/docker/aufs/mnt/d662ad0a30fbfa902e0962108685b9330597e1ee2abb16dc9462eb5a67fdd23f rw,relatime - aufs none rw,si=9b4a764248bae39c -171 15 0:3504 / /var/lib/docker/aufs/mnt/5bc9de5c79812843fb36eee96bef1ddba812407861f572e33242f4ee10da2c15 rw,relatime - aufs none rw,si=9b4a764248ba839c -172 15 0:3505 / /var/lib/docker/aufs/mnt/5e763de8e9b0f7d58d2e12a341e029ab4efb3b99788b175090d8209e971156c1 rw,relatime - aufs none rw,si=9b4a764248baa39c -173 15 0:3506 / /var/lib/docker/aufs/mnt/b4431dc2739936f1df6387e337f5a0c99cf051900c896bd7fd46a870ce61c873 rw,relatime - aufs none rw,si=9b4a76401263539c -174 15 0:3507 / /var/lib/docker/aufs/mnt/5f37830e5a02561ab8c67ea3113137ba69f67a60e41c05cb0e7a0edaa1925b24 rw,relatime - aufs none rw,si=9b4a76401263639c -184 15 0:3508 / /var/lib/docker/aufs/mnt/62ea10b957e6533538a4633a1e1d678502f50ddcdd354b2ca275c54dd7a7793a rw,relatime - aufs none rw,si=9b4a76401263039c -187 15 0:3509 / /var/lib/docker/aufs/mnt/d56ee9d44195fe390e042fda75ec15af5132adb6d5c69468fa8792f4e54a6953 rw,relatime - aufs none rw,si=9b4a76401263239c -188 15 0:3510 / /var/lib/docker/aufs/mnt/6a300930673174549c2b62f36c933f0332a20735978c007c805a301f897146c5 rw,relatime - aufs none rw,si=9b4a76455d4c539c -189 15 0:3511 / /var/lib/docker/aufs/mnt/64496c45c84d348c24d410015456d101601c30cab4d1998c395591caf7e57a70 rw,relatime - aufs none rw,si=9b4a76455d4c639c -190 15 0:3512 / /var/lib/docker/aufs/mnt/65a6a645883fe97a7422cd5e71ebe0bc17c8e6302a5361edf52e89747387e908 rw,relatime - aufs none rw,si=9b4a76455d4c039c -191 15 0:3513 / /var/lib/docker/aufs/mnt/672be40695f7b6e13b0a3ed9fc996c73727dede3481f58155950fcfad57ed616 rw,relatime - aufs none rw,si=9b4a76455d4c239c -192 15 0:3514 / /var/lib/docker/aufs/mnt/d42438acb2bfb2169e1c0d8e917fc824f7c85d336dadb0b0af36dfe0f001b3ba rw,relatime - aufs none rw,si=9b4a7642bfded39c -193 15 0:3515 / /var/lib/docker/aufs/mnt/b48a54abf26d01cb2ddd908b1ed6034d17397c1341bf0eb2b251a3e5b79be854 rw,relatime - aufs none rw,si=9b4a7642bfdee39c -194 15 0:3516 / /var/lib/docker/aufs/mnt/76f27134491f052bfb87f59092126e53ef875d6851990e59195a9da16a9412f8 rw,relatime - aufs none rw,si=9b4a7642bfde839c -195 15 0:3517 / /var/lib/docker/aufs/mnt/6bd626a5462b4f8a8e1cc7d10351326dca97a59b2758e5ea549a4f6350ce8a90 rw,relatime - aufs none rw,si=9b4a7642bfdea39c -196 15 0:3518 / /var/lib/docker/aufs/mnt/f1fe3549dbd6f5ca615e9139d9b53f0c83a3b825565df37628eacc13e70cbd6d rw,relatime - aufs none rw,si=9b4a7642bfdf539c -197 15 0:3519 / /var/lib/docker/aufs/mnt/6d0458c8426a9e93d58d0625737e6122e725c9408488ed9e3e649a9984e15c34 rw,relatime - aufs none rw,si=9b4a7642bfdf639c -198 15 0:3520 / /var/lib/docker/aufs/mnt/6e4c97db83aa82145c9cf2bafc20d500c0b5389643b689e3ae84188c270a48c5 rw,relatime - aufs none rw,si=9b4a7642bfdf039c -199 15 0:3521 / /var/lib/docker/aufs/mnt/eb94d6498f2c5969eaa9fa11ac2934f1ab90ef88e2d002258dca08e5ba74ea27 rw,relatime - aufs none rw,si=9b4a7642bfdf239c -200 15 0:3522 / /var/lib/docker/aufs/mnt/fe3f88f0c511608a2eec5f13a98703aa16e55dbf930309723d8a37101f539fe1 rw,relatime - aufs none rw,si=9b4a7642bfc3539c -201 15 0:3523 / /var/lib/docker/aufs/mnt/6f40c229fb9cad85fabf4b64a2640a5403ec03fe5ac1a57d0609fb8b606b9c83 rw,relatime - aufs none rw,si=9b4a7642bfc3639c -202 15 0:3524 / /var/lib/docker/aufs/mnt/7513e9131f7a8acf58ff15248237feb767c78732ca46e159f4d791e6ef031dbc rw,relatime - aufs none rw,si=9b4a7642bfc3039c -203 15 0:3525 / /var/lib/docker/aufs/mnt/79f48b00aa713cdf809c6bb7c7cb911b66e9a8076c81d6c9d2504139984ea2da rw,relatime - aufs none rw,si=9b4a7642bfc3239c -204 15 0:3526 / /var/lib/docker/aufs/mnt/c3680418350d11358f0a96c676bc5aa74fa00a7c89e629ef5909d3557b060300 rw,relatime - aufs none rw,si=9b4a7642f47cd39c -205 15 0:3527 / /var/lib/docker/aufs/mnt/7a1744dd350d7fcc0cccb6f1757ca4cbe5453f203a5888b0f1014d96ad5a5ef9 rw,relatime - aufs none rw,si=9b4a7642f47ce39c -206 15 0:3528 / /var/lib/docker/aufs/mnt/7fa99662db046be9f03c33c35251afda9ccdc0085636bbba1d90592cec3ff68d rw,relatime - aufs none rw,si=9b4a7642f47c839c -207 15 0:3529 / /var/lib/docker/aufs/mnt/f815021ef20da9c9b056bd1d52d8aaf6e2c0c19f11122fc793eb2b04eb995e35 rw,relatime - aufs none rw,si=9b4a7642f47ca39c -208 15 0:3530 / /var/lib/docker/aufs/mnt/801086ae3110192d601dfcebdba2db92e86ce6b6a9dba6678ea04488e4513669 rw,relatime - aufs none rw,si=9b4a7642dc6dd39c -209 15 0:3531 / /var/lib/docker/aufs/mnt/822ba7db69f21daddda87c01cfbfbf73013fc03a879daf96d16cdde6f9b1fbd6 rw,relatime - aufs none rw,si=9b4a7642dc6de39c -210 15 0:3532 / /var/lib/docker/aufs/mnt/834227c1a950fef8cae3827489129d0dd220541e60c6b731caaa765bf2e6a199 rw,relatime - aufs none rw,si=9b4a7642dc6d839c -211 15 0:3533 / /var/lib/docker/aufs/mnt/83dccbc385299bd1c7cf19326e791b33a544eea7b4cdfb6db70ea94eed4389fb rw,relatime - aufs none rw,si=9b4a7642dc6da39c -212 15 0:3534 / /var/lib/docker/aufs/mnt/f1b8e6f0e7c8928b5dcdab944db89306ebcae3e0b32f9ff40d2daa8329f21600 rw,relatime - aufs none rw,si=9b4a7645a126039c -213 15 0:3535 / /var/lib/docker/aufs/mnt/970efb262c7a020c2404cbcc5b3259efba0d110a786079faeef05bc2952abf3a rw,relatime - aufs none rw,si=9b4a7644c8ed139c -214 15 0:3536 / /var/lib/docker/aufs/mnt/84b6d73af7450f3117a77e15a5ca1255871fea6182cd8e8a7be6bc744be18c2c rw,relatime - aufs none rw,si=9b4a76406559139c -215 15 0:3537 / /var/lib/docker/aufs/mnt/88be2716e026bc681b5e63fe7942068773efbd0b6e901ca7ba441412006a96b6 rw,relatime - aufs none rw,si=9b4a76406559339c -216 15 0:3538 / /var/lib/docker/aufs/mnt/c81939aa166ce50cd8bca5cfbbcc420a78e0318dd5cd7c755209b9166a00a752 rw,relatime - aufs none rw,si=9b4a76406559239c -217 15 0:3539 / /var/lib/docker/aufs/mnt/e0f241645d64b7dc5ff6a8414087cca226be08fb54ce987d1d1f6350c57083aa rw,relatime - aufs none rw,si=9b4a7647cfc0f39c -218 15 0:3540 / /var/lib/docker/aufs/mnt/e10e2bf75234ed51d8a6a4bb39e465404fecbe318e54400d3879cdb2b0679c78 rw,relatime - aufs none rw,si=9b4a7647cfc0939c -219 15 0:3541 / /var/lib/docker/aufs/mnt/8f71d74c8cfc3228b82564aa9f09b2e576cff0083ddfb6aa5cb350346063f080 rw,relatime - aufs none rw,si=9b4a7647cfc0a39c -220 15 0:3542 / /var/lib/docker/aufs/mnt/9159f1eba2aef7f5205cc18d015cda7f5933cd29bba3b1b8aed5ccb5824c69ee rw,relatime - aufs none rw,si=9b4a76468cedd39c -221 15 0:3543 / /var/lib/docker/aufs/mnt/932cad71e652e048e500d9fbb5b8ea4fc9a269d42a3134ce527ceef42a2be56b rw,relatime - aufs none rw,si=9b4a76468cede39c -222 15 0:3544 / /var/lib/docker/aufs/mnt/bf1e1b5f529e8943cc0144ee86dbaaa37885c1ddffcef29537e0078ee7dd316a rw,relatime - aufs none rw,si=9b4a76468ced839c -223 15 0:3545 / /var/lib/docker/aufs/mnt/949d93ecf3322e09f858ce81d5f4b434068ec44ff84c375de03104f7b45ee955 rw,relatime - aufs none rw,si=9b4a76468ceda39c -224 15 0:3546 / /var/lib/docker/aufs/mnt/d65c6087f92dc2a3841b5251d2fe9ca07d4c6e5b021597692479740816e4e2a1 rw,relatime - aufs none rw,si=9b4a7645a126239c -225 15 0:3547 / /var/lib/docker/aufs/mnt/98a0153119d0651c193d053d254f6e16a68345a141baa80c87ae487e9d33f290 rw,relatime - aufs none rw,si=9b4a7640787cf39c -226 15 0:3548 / /var/lib/docker/aufs/mnt/99daf7fe5847c017392f6e59aa9706b3dfdd9e6d1ba11dae0f7fffde0a60b5e5 rw,relatime - aufs none rw,si=9b4a7640787c839c -227 15 0:3549 / /var/lib/docker/aufs/mnt/9ad1f2fe8a5599d4e10c5a6effa7f03d932d4e92ee13149031a372087a359079 rw,relatime - aufs none rw,si=9b4a7640787ca39c -228 15 0:3550 / /var/lib/docker/aufs/mnt/c26d64494da782ddac26f8370d86ac93e7c1666d88a7b99110fc86b35ea6a85d rw,relatime - aufs none rw,si=9b4a7642fc6b539c -229 15 0:3551 / /var/lib/docker/aufs/mnt/a49e4a8275133c230ec640997f35f172312eb0ea5bd2bbe10abf34aae98f30eb rw,relatime - aufs none rw,si=9b4a7642fc6b639c -230 15 0:3552 / /var/lib/docker/aufs/mnt/b5e2740c867ed843025f49d84e8d769de9e8e6039b3c8cb0735b5bf358994bc7 rw,relatime - aufs none rw,si=9b4a7642fc6b039c -231 15 0:3553 / /var/lib/docker/aufs/mnt/a826fdcf3a7039b30570054579b65763db605a314275d7aef31b872c13311b4b rw,relatime - aufs none rw,si=9b4a7642fc6b239c -232 15 0:3554 / /var/lib/docker/aufs/mnt/addf3025babf5e43b5a3f4a0da7ad863dda3c01fb8365c58fd8d28bb61dc11bc rw,relatime - aufs none rw,si=9b4a76407871d39c -233 15 0:3555 / /var/lib/docker/aufs/mnt/c5b6c6813ab3e5ebdc6d22cb2a3d3106a62095f2c298be52b07a3b0fa20ff690 rw,relatime - aufs none rw,si=9b4a76407871e39c -234 15 0:3556 / /var/lib/docker/aufs/mnt/af0609eaaf64e2392060cb46f5a9f3d681a219bb4c651d4f015bf573fbe6c4cf rw,relatime - aufs none rw,si=9b4a76407871839c -235 15 0:3557 / /var/lib/docker/aufs/mnt/e7f20e3c37ecad39cd90a97cd3549466d0d106ce4f0a930b8495442634fa4a1f rw,relatime - aufs none rw,si=9b4a76407871a39c -237 15 0:3559 / /var/lib/docker/aufs/mnt/b57a53d440ffd0c1295804fa68cdde35d2fed5409484627e71b9c37e4249fd5c rw,relatime - aufs none rw,si=9b4a76444445a39c -238 15 0:3560 / /var/lib/docker/aufs/mnt/b5e7d7b8f35e47efbba3d80c5d722f5e7bd43e54c824e54b4a4b351714d36d42 rw,relatime - aufs none rw,si=9b4a7647932d439c -239 15 0:3561 / /var/lib/docker/aufs/mnt/f1b136def157e9465640658f277f3347de593c6ae76412a2e79f7002f091cae2 rw,relatime - aufs none rw,si=9b4a76445abcd39c -240 15 0:3562 / /var/lib/docker/aufs/mnt/b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc rw,relatime - aufs none rw,si=9b4a7644403b339c -241 15 0:3563 / /var/lib/docker/aufs/mnt/b89b140cdbc95063761864e0a23346207fa27ee4c5c63a1ae85c9069a9d9cf1d rw,relatime - aufs none rw,si=9b4a7644aa19739c -242 15 0:3564 / /var/lib/docker/aufs/mnt/bc6a69ed51c07f5228f6b4f161c892e6a949c0e7e86a9c3432049d4c0e5cd298 rw,relatime - aufs none rw,si=9b4a7644aa19139c -243 15 0:3565 / /var/lib/docker/aufs/mnt/be4e2ba3f136933e239f7cf3d136f484fb9004f1fbdfee24a62a2c7b0ab30670 rw,relatime - aufs none rw,si=9b4a7644aa19339c -244 15 0:3566 / /var/lib/docker/aufs/mnt/e04ca1a4a5171e30d20f0c92f90a50b8b6f8600af5459c4b4fb25e42e864dfe1 rw,relatime - aufs none rw,si=9b4a7647932d139c -245 15 0:3567 / /var/lib/docker/aufs/mnt/be61576b31db893129aaffcd3dcb5ce35e49c4b71b30c392a78609a45c7323d8 rw,relatime - aufs none rw,si=9b4a7642d85f739c -246 15 0:3568 / /var/lib/docker/aufs/mnt/dda42c191e56becf672327658ab84fcb563322db3764b91c2fefe4aaef04c624 rw,relatime - aufs none rw,si=9b4a7642d85f139c -247 15 0:3569 / /var/lib/docker/aufs/mnt/c0a7995053330f3d88969247a2e72b07e2dd692133f5668a4a35ea3905561072 rw,relatime - aufs none rw,si=9b4a7642d85f339c -249 15 0:3571 / /var/lib/docker/aufs/mnt/c3594b2e5f08c59ff5ed338a1ba1eceeeb1f7fc5d180068338110c00b1eb8502 rw,relatime - aufs none rw,si=9b4a7642738c739c -250 15 0:3572 / /var/lib/docker/aufs/mnt/c58dce03a0ab0a7588393880379dc3bce9f96ec08ed3f99cf1555260ff0031e8 rw,relatime - aufs none rw,si=9b4a7642738c139c -251 15 0:3573 / /var/lib/docker/aufs/mnt/c73e9f1d109c9d14cb36e1c7489df85649be3911116d76c2fd3648ec8fd94e23 rw,relatime - aufs none rw,si=9b4a7642738c339c -252 15 0:3574 / /var/lib/docker/aufs/mnt/c9eef28c344877cd68aa09e543c0710ab2b305a0ff96dbb859bfa7808c3e8d01 rw,relatime - aufs none rw,si=9b4a7642d85f439c -253 15 0:3575 / /var/lib/docker/aufs/mnt/feb67148f548d70cb7484f2aaad2a86051cd6867a561741a2f13b552457d666e rw,relatime - aufs none rw,si=9b4a76468c55739c -254 15 0:3576 / /var/lib/docker/aufs/mnt/cdf1f96c36d35a96041a896bf398ec0f7dc3b0fb0643612a0f4b6ff96e04e1bb rw,relatime - aufs none rw,si=9b4a76468c55139c -255 15 0:3577 / /var/lib/docker/aufs/mnt/ec6e505872353268451ac4bc034c1df00f3bae4a3ea2261c6e48f7bd5417c1b3 rw,relatime - aufs none rw,si=9b4a76468c55339c -256 15 0:3578 / /var/lib/docker/aufs/mnt/d6dc8aca64efd90e0bc10274001882d0efb310d42ccbf5712b99b169053b8b1a rw,relatime - aufs none rw,si=9b4a7642738c439c -257 15 0:3579 / /var/lib/docker/aufs/mnt/d712594e2ff6eaeb895bfd150d694bd1305fb927e7a186b2dab7df2ea95f8f81 rw,relatime - aufs none rw,si=9b4a76401268f39c -259 15 0:3581 / /var/lib/docker/aufs/mnt/dbfa1174cd78cde2d7410eae442af0b416c4a0e6f87ed4ff1e9f169a0029abc0 rw,relatime - aufs none rw,si=9b4a76401268b39c -260 15 0:3582 / /var/lib/docker/aufs/mnt/e883f5a82316d7856fbe93ee8c0af5a920b7079619dd95c4ffd88bbd309d28dd rw,relatime - aufs none rw,si=9b4a76468c55439c -261 15 0:3583 / /var/lib/docker/aufs/mnt/fdec3eff581c4fc2b09f87befa2fa021f3f2d373bea636a87f1fb5b367d6347a rw,relatime - aufs none rw,si=9b4a7644aa1af39c -262 15 0:3584 / /var/lib/docker/aufs/mnt/ef764e26712184653067ecf7afea18a80854c41331ca0f0ef03e1bacf90a6ffc rw,relatime - aufs none rw,si=9b4a7644aa1a939c -263 15 0:3585 / /var/lib/docker/aufs/mnt/f3176b40c41fce8ce6942936359a2001a6f1b5c1bb40ee224186db0789ec2f76 rw,relatime - aufs none rw,si=9b4a7644aa1ab39c -264 15 0:3586 / /var/lib/docker/aufs/mnt/f5daf06785d3565c6dd18ea7d953d9a8b9606107781e63270fe0514508736e6a rw,relatime - aufs none rw,si=9b4a76401268c39c -58 15 0:3587 / /var/lib/docker/aufs/mnt/cde8c40f6524b7361af4f5ad05bb857dc9ee247c20852ba666195c0739e3a2b8-init rw,relatime - aufs none rw,si=9b4a76444445839c -67 15 0:3588 / /var/lib/docker/aufs/mnt/cde8c40f6524b7361af4f5ad05bb857dc9ee247c20852ba666195c0739e3a2b8 rw,relatime - aufs none rw,si=9b4a7644badd339c -265 15 0:3610 / /var/lib/docker/aufs/mnt/e812472cd2c8c4748d1ef71fac4e77e50d661b9349abe66ce3e23511ed44f414 rw,relatime - aufs none rw,si=9b4a76427937d39c -270 15 0:3615 / /var/lib/docker/aufs/mnt/997636e7c5c9d0d1376a217e295c14c205350b62bc12052804fb5f90abe6f183 rw,relatime - aufs none rw,si=9b4a76406540739c -273 15 0:3618 / /var/lib/docker/aufs/mnt/d5794d080417b6e52e69227c3873e0e4c1ff0d5a845ebe3860ec2f89a47a2a1e rw,relatime - aufs none rw,si=9b4a76454814039c -278 15 0:3623 / /var/lib/docker/aufs/mnt/586bdd48baced671bb19bc4d294ec325f26c55545ae267db426424f157d59c48 rw,relatime - aufs none rw,si=9b4a7644b439f39c -281 15 0:3626 / /var/lib/docker/aufs/mnt/69739d022f89f8586908bbd5edbbdd95ea5256356f177f9ffcc6ef9c0ea752d2 rw,relatime - aufs none rw,si=9b4a7644a0f1b39c -286 15 0:3631 / /var/lib/docker/aufs/mnt/ff28c27d5f894363993622de26d5dd352dba072f219e4691d6498c19bbbc15a9 rw,relatime - aufs none rw,si=9b4a7642265b339c -289 15 0:3634 / /var/lib/docker/aufs/mnt/aa128fe0e64fdede333aa48fd9de39530c91a9244a0f0649a3c411c61e372daa rw,relatime - aufs none rw,si=9b4a764012ada39c -99 15 8:33 / /media/REMOVE\040ME rw,nosuid,nodev,relatime - fuseblk /dev/sdc1 rw,user_id=0,group_id=0,allow_other,blksize=4096` -) - -func TestParseFedoraMountinfo(t *testing.T) { - r := bytes.NewBuffer([]byte(fedoraMountinfo)) - _, err := parseInfoFile(r) - if err != nil { - t.Fatal(err) - } -} - -func TestParseUbuntuMountinfo(t *testing.T) { - r := bytes.NewBuffer([]byte(ubuntuMountInfo)) - _, err := parseInfoFile(r) - if err != nil { - t.Fatal(err) - } -} - -func TestParseGentooMountinfo(t *testing.T) { - r := bytes.NewBuffer([]byte(gentooMountinfo)) - _, err := parseInfoFile(r) - if err != nil { - t.Fatal(err) - } -} - -func TestParseFedoraMountinfoFields(t *testing.T) { - r := bytes.NewBuffer([]byte(fedoraMountinfo)) - infos, err := parseInfoFile(r) - if err != nil { - t.Fatal(err) - } - expectedLength := 58 - if len(infos) != expectedLength { - t.Fatalf("Expected %d entries, got %d", expectedLength, len(infos)) - } - mi := Info{ - ID: 15, - Parent: 35, - Major: 0, - Minor: 3, - Root: "/", - Mountpoint: "/proc", - Opts: "rw,nosuid,nodev,noexec,relatime", - Optional: "shared:5", - Fstype: "proc", - Source: "proc", - VfsOpts: "rw", - } - - if *infos[0] != mi { - t.Fatalf("expected %#v, got %#v", mi, infos[0]) - } -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go deleted file mode 100644 index ad9ab57f8..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build solaris,cgo - -package mount - -/* -#include -#include -*/ -import "C" - -import ( - "fmt" -) - -func parseMountTable() ([]*Info, error) { - mnttab := C.fopen(C.CString(C.MNTTAB), C.CString("r")) - if mnttab == nil { - return nil, fmt.Errorf("Failed to open %s", C.MNTTAB) - } - - var out []*Info - var mp C.struct_mnttab - - ret := C.getmntent(mnttab, &mp) - for ret == 0 { - var mountinfo Info - mountinfo.Mountpoint = C.GoString(mp.mnt_mountp) - mountinfo.Source = C.GoString(mp.mnt_special) - mountinfo.Fstype = C.GoString(mp.mnt_fstype) - mountinfo.Opts = C.GoString(mp.mnt_mntopts) - out = append(out, &mountinfo) - ret = C.getmntent(mnttab, &mp) - } - - C.fclose(mnttab) - return out, nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go deleted file mode 100644 index 7fbcf1921..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !windows,!linux,!freebsd,!solaris freebsd,!cgo solaris,!cgo - -package mount - -import ( - "fmt" - "runtime" -) - -func parseMountTable() ([]*Info, error) { - return nil, fmt.Errorf("mount.parseMountTable is not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go deleted file mode 100644 index dab8a37ed..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -package mount - -func parseMountTable() ([]*Info, error) { - // Do NOT return an error! - return nil, nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go b/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go deleted file mode 100644 index 8ceec84bc..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go +++ /dev/null @@ -1,69 +0,0 @@ -// +build linux - -package mount - -// MakeShared ensures a mounted filesystem has the SHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeShared(mountPoint string) error { - return ensureMountedAs(mountPoint, "shared") -} - -// MakeRShared ensures a mounted filesystem has the RSHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRShared(mountPoint string) error { - return ensureMountedAs(mountPoint, "rshared") -} - -// MakePrivate ensures a mounted filesystem has the PRIVATE mount option enabled. -// See the supported options in flags.go for further reference. -func MakePrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, "private") -} - -// MakeRPrivate ensures a mounted filesystem has the RPRIVATE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeRPrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, "rprivate") -} - -// MakeSlave ensures a mounted filesystem has the SLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, "slave") -} - -// MakeRSlave ensures a mounted filesystem has the RSLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, "rslave") -} - -// MakeUnbindable ensures a mounted filesystem has the UNBINDABLE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, "unbindable") -} - -// MakeRUnbindable ensures a mounted filesystem has the RUNBINDABLE mount -// option enabled. See the supported options in flags.go for further reference. -func MakeRUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, "runbindable") -} - -func ensureMountedAs(mountPoint, options string) error { - mounted, err := Mounted(mountPoint) - if err != nil { - return err - } - - if !mounted { - if err := Mount(mountPoint, mountPoint, "none", "bind,rw"); err != nil { - return err - } - } - if _, err = Mounted(mountPoint); err != nil { - return err - } - - return ForceMount("", mountPoint, "none", options) -} diff --git a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux_test.go b/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux_test.go deleted file mode 100644 index c1837942e..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux_test.go +++ /dev/null @@ -1,331 +0,0 @@ -// +build linux - -package mount - -import ( - "os" - "path" - "syscall" - "testing" -) - -// nothing is propagated in or out -func TestSubtreePrivate(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - outside1Dir = path.Join(tmp, "outside1") - outside2Dir = path.Join(tmp, "outside2") - - outside1Path = path.Join(outside1Dir, "file.txt") - outside2Path = path.Join(outside2Dir, "file.txt") - outside1CheckPath = path.Join(targetDir, "a", "file.txt") - outside2CheckPath = path.Join(sourceDir, "b", "file.txt") - ) - if err := os.MkdirAll(path.Join(sourceDir, "a"), 0777); err != nil { - t.Fatal(err) - } - if err := os.MkdirAll(path.Join(sourceDir, "b"), 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(targetDir, 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(outside1Dir, 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(outside2Dir, 0777); err != nil { - t.Fatal(err) - } - - if err := createFile(outside1Path); err != nil { - t.Fatal(err) - } - if err := createFile(outside2Path); err != nil { - t.Fatal(err) - } - - // mount the shared directory to a target - if err := Mount(sourceDir, targetDir, "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - // next, make the target private - if err := MakePrivate(targetDir); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - // mount in an outside path to a mounted path inside the _source_ - if err := Mount(outside1Dir, path.Join(sourceDir, "a"), "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(path.Join(sourceDir, "a")); err != nil { - t.Fatal(err) - } - }() - - // check that this file _does_not_ show in the _target_ - if _, err := os.Stat(outside1CheckPath); err != nil && !os.IsNotExist(err) { - t.Fatal(err) - } else if err == nil { - t.Fatalf("%q should not be visible, but is", outside1CheckPath) - } - - // next mount outside2Dir into the _target_ - if err := Mount(outside2Dir, path.Join(targetDir, "b"), "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(path.Join(targetDir, "b")); err != nil { - t.Fatal(err) - } - }() - - // check that this file _does_not_ show in the _source_ - if _, err := os.Stat(outside2CheckPath); err != nil && !os.IsNotExist(err) { - t.Fatal(err) - } else if err == nil { - t.Fatalf("%q should not be visible, but is", outside2CheckPath) - } -} - -// Testing that when a target is a shared mount, -// then child mounts propagate to the source -func TestSubtreeShared(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - outsideDir = path.Join(tmp, "outside") - - outsidePath = path.Join(outsideDir, "file.txt") - sourceCheckPath = path.Join(sourceDir, "a", "file.txt") - ) - - if err := os.MkdirAll(path.Join(sourceDir, "a"), 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(targetDir, 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(outsideDir, 0777); err != nil { - t.Fatal(err) - } - - if err := createFile(outsidePath); err != nil { - t.Fatal(err) - } - - // mount the source as shared - if err := MakeShared(sourceDir); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(sourceDir); err != nil { - t.Fatal(err) - } - }() - - // mount the shared directory to a target - if err := Mount(sourceDir, targetDir, "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - // mount in an outside path to a mounted path inside the target - if err := Mount(outsideDir, path.Join(targetDir, "a"), "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(path.Join(targetDir, "a")); err != nil { - t.Fatal(err) - } - }() - - // NOW, check that the file from the outside directory is available in the source directory - if _, err := os.Stat(sourceCheckPath); err != nil { - t.Fatal(err) - } -} - -// testing that mounts to a shared source show up in the slave target, -// and that mounts into a slave target do _not_ show up in the shared source -func TestSubtreeSharedSlave(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - outside1Dir = path.Join(tmp, "outside1") - outside2Dir = path.Join(tmp, "outside2") - - outside1Path = path.Join(outside1Dir, "file.txt") - outside2Path = path.Join(outside2Dir, "file.txt") - outside1CheckPath = path.Join(targetDir, "a", "file.txt") - outside2CheckPath = path.Join(sourceDir, "b", "file.txt") - ) - if err := os.MkdirAll(path.Join(sourceDir, "a"), 0777); err != nil { - t.Fatal(err) - } - if err := os.MkdirAll(path.Join(sourceDir, "b"), 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(targetDir, 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(outside1Dir, 0777); err != nil { - t.Fatal(err) - } - if err := os.Mkdir(outside2Dir, 0777); err != nil { - t.Fatal(err) - } - - if err := createFile(outside1Path); err != nil { - t.Fatal(err) - } - if err := createFile(outside2Path); err != nil { - t.Fatal(err) - } - - // mount the source as shared - if err := MakeShared(sourceDir); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(sourceDir); err != nil { - t.Fatal(err) - } - }() - - // mount the shared directory to a target - if err := Mount(sourceDir, targetDir, "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - // next, make the target slave - if err := MakeSlave(targetDir); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() - - // mount in an outside path to a mounted path inside the _source_ - if err := Mount(outside1Dir, path.Join(sourceDir, "a"), "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(path.Join(sourceDir, "a")); err != nil { - t.Fatal(err) - } - }() - - // check that this file _does_ show in the _target_ - if _, err := os.Stat(outside1CheckPath); err != nil { - t.Fatal(err) - } - - // next mount outside2Dir into the _target_ - if err := Mount(outside2Dir, path.Join(targetDir, "b"), "none", "bind,rw"); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(path.Join(targetDir, "b")); err != nil { - t.Fatal(err) - } - }() - - // check that this file _does_not_ show in the _source_ - if _, err := os.Stat(outside2CheckPath); err != nil && !os.IsNotExist(err) { - t.Fatal(err) - } else if err == nil { - t.Fatalf("%q should not be visible, but is", outside2CheckPath) - } -} - -func TestSubtreeUnbindable(t *testing.T) { - tmp := path.Join(os.TempDir(), "mount-tests") - if err := os.MkdirAll(tmp, 0777); err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - var ( - sourceDir = path.Join(tmp, "source") - targetDir = path.Join(tmp, "target") - ) - if err := os.MkdirAll(sourceDir, 0777); err != nil { - t.Fatal(err) - } - if err := os.MkdirAll(targetDir, 0777); err != nil { - t.Fatal(err) - } - - // next, make the source unbindable - if err := MakeUnbindable(sourceDir); err != nil { - t.Fatal(err) - } - defer func() { - if err := Unmount(sourceDir); err != nil { - t.Fatal(err) - } - }() - - // then attempt to mount it to target. It should fail - if err := Mount(sourceDir, targetDir, "none", "bind,rw"); err != nil && err != syscall.EINVAL { - t.Fatal(err) - } else if err == nil { - t.Fatalf("%q should not have been bindable", sourceDir) - } - defer func() { - if err := Unmount(targetDir); err != nil { - t.Fatal(err) - } - }() -} - -func createFile(path string) error { - f, err := os.Create(path) - if err != nil { - return err - } - f.WriteString("hello world!") - return f.Close() -} diff --git a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go b/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go deleted file mode 100644 index 09f6b03cb..000000000 --- a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go +++ /dev/null @@ -1,58 +0,0 @@ -// +build solaris - -package mount - -// MakeShared ensures a mounted filesystem has the SHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeShared(mountPoint string) error { - return ensureMountedAs(mountPoint, "shared") -} - -// MakeRShared ensures a mounted filesystem has the RSHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRShared(mountPoint string) error { - return ensureMountedAs(mountPoint, "rshared") -} - -// MakePrivate ensures a mounted filesystem has the PRIVATE mount option enabled. -// See the supported options in flags.go for further reference. -func MakePrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, "private") -} - -// MakeRPrivate ensures a mounted filesystem has the RPRIVATE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeRPrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, "rprivate") -} - -// MakeSlave ensures a mounted filesystem has the SLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, "slave") -} - -// MakeRSlave ensures a mounted filesystem has the RSLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, "rslave") -} - -// MakeUnbindable ensures a mounted filesystem has the UNBINDABLE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, "unbindable") -} - -// MakeRUnbindable ensures a mounted filesystem has the RUNBINDABLE mount -// option enabled. See the supported options in flags.go for further reference. -func MakeRUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, "runbindable") -} - -func ensureMountedAs(mountPoint, options string) error { - // TODO: Solaris does not support bind mounts. - // Evaluate lofs and also look at the relevant - // mount flags to be supported. - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/namesgenerator/cmd/names-generator/main.go b/vendor/github.com/docker/docker/pkg/namesgenerator/cmd/names-generator/main.go deleted file mode 100644 index 18a939b70..000000000 --- a/vendor/github.com/docker/docker/pkg/namesgenerator/cmd/names-generator/main.go +++ /dev/null @@ -1,11 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/docker/docker/pkg/namesgenerator" -) - -func main() { - fmt.Println(namesgenerator.GetRandomName(0)) -} diff --git a/vendor/github.com/docker/docker/pkg/namesgenerator/names-generator.go b/vendor/github.com/docker/docker/pkg/namesgenerator/names-generator.go deleted file mode 100644 index cfb8157d6..000000000 --- a/vendor/github.com/docker/docker/pkg/namesgenerator/names-generator.go +++ /dev/null @@ -1,590 +0,0 @@ -package namesgenerator - -import ( - "fmt" - - "github.com/docker/docker/pkg/random" -) - -var ( - left = [...]string{ - "admiring", - "adoring", - "affectionate", - "agitated", - "amazing", - "angry", - "awesome", - "blissful", - "boring", - "brave", - "clever", - "cocky", - "compassionate", - "competent", - "condescending", - "confident", - "cranky", - "dazzling", - "determined", - "distracted", - "dreamy", - "eager", - "ecstatic", - "elastic", - "elated", - "elegant", - "eloquent", - "epic", - "fervent", - "festive", - "flamboyant", - "focused", - "friendly", - "frosty", - "gallant", - "gifted", - "goofy", - "gracious", - "happy", - "hardcore", - "heuristic", - "hopeful", - "hungry", - "infallible", - "inspiring", - "jolly", - "jovial", - "keen", - "kickass", - "kind", - "laughing", - "loving", - "lucid", - "mystifying", - "modest", - "musing", - "naughty", - "nervous", - "nifty", - "nostalgic", - "objective", - "optimistic", - "peaceful", - "pedantic", - "pensive", - "practical", - "priceless", - "quirky", - "quizzical", - "relaxed", - "reverent", - "romantic", - "sad", - "serene", - "sharp", - "silly", - "sleepy", - "stoic", - "stupefied", - "suspicious", - "tender", - "thirsty", - "trusting", - "unruffled", - "upbeat", - "vibrant", - "vigilant", - "wizardly", - "wonderful", - "xenodochial", - "youthful", - "zealous", - "zen", - } - - // Docker, starting from 0.7.x, generates names from notable scientists and hackers. - // Please, for any amazing man that you add to the list, consider adding an equally amazing woman to it, and vice versa. - right = [...]string{ - // Muhammad ibn Jābir al-Ḥarrānī al-Battānī was a founding father of astronomy. https://en.wikipedia.org/wiki/Mu%E1%B8%A5ammad_ibn_J%C4%81bir_al-%E1%B8%A4arr%C4%81n%C4%AB_al-Batt%C4%81n%C4%AB - "albattani", - - // Frances E. Allen, became the first female IBM Fellow in 1989. In 2006, she became the first female recipient of the ACM's Turing Award. https://en.wikipedia.org/wiki/Frances_E._Allen - "allen", - - // June Almeida - Scottish virologist who took the first pictures of the rubella virus - https://en.wikipedia.org/wiki/June_Almeida - "almeida", - - // Maria Gaetana Agnesi - Italian mathematician, philosopher, theologian and humanitarian. She was the first woman to write a mathematics handbook and the first woman appointed as a Mathematics Professor at a University. https://en.wikipedia.org/wiki/Maria_Gaetana_Agnesi - "agnesi", - - // Archimedes was a physicist, engineer and mathematician who invented too many things to list them here. https://en.wikipedia.org/wiki/Archimedes - "archimedes", - - // Maria Ardinghelli - Italian translator, mathematician and physicist - https://en.wikipedia.org/wiki/Maria_Ardinghelli - "ardinghelli", - - // Aryabhata - Ancient Indian mathematician-astronomer during 476-550 CE https://en.wikipedia.org/wiki/Aryabhata - "aryabhata", - - // Wanda Austin - Wanda Austin is the President and CEO of The Aerospace Corporation, a leading architect for the US security space programs. https://en.wikipedia.org/wiki/Wanda_Austin - "austin", - - // Charles Babbage invented the concept of a programmable computer. https://en.wikipedia.org/wiki/Charles_Babbage. - "babbage", - - // Stefan Banach - Polish mathematician, was one of the founders of modern functional analysis. https://en.wikipedia.org/wiki/Stefan_Banach - "banach", - - // John Bardeen co-invented the transistor - https://en.wikipedia.org/wiki/John_Bardeen - "bardeen", - - // Jean Bartik, born Betty Jean Jennings, was one of the original programmers for the ENIAC computer. https://en.wikipedia.org/wiki/Jean_Bartik - "bartik", - - // Laura Bassi, the world's first female professor https://en.wikipedia.org/wiki/Laura_Bassi - "bassi", - - // Hugh Beaver, British engineer, founder of the Guinness Book of World Records https://en.wikipedia.org/wiki/Hugh_Beaver - "beaver", - - // Alexander Graham Bell - an eminent Scottish-born scientist, inventor, engineer and innovator who is credited with inventing the first practical telephone - https://en.wikipedia.org/wiki/Alexander_Graham_Bell - "bell", - - // Homi J Bhabha - was an Indian nuclear physicist, founding director, and professor of physics at the Tata Institute of Fundamental Research. Colloquially known as "father of Indian nuclear programme"- https://en.wikipedia.org/wiki/Homi_J._Bhabha - "bhabha", - - // Bhaskara II - Ancient Indian mathematician-astronomer whose work on calculus predates Newton and Leibniz by over half a millennium - https://en.wikipedia.org/wiki/Bh%C4%81skara_II#Calculus - "bhaskara", - - // Elizabeth Blackwell - American doctor and first American woman to receive a medical degree - https://en.wikipedia.org/wiki/Elizabeth_Blackwell - "blackwell", - - // Niels Bohr is the father of quantum theory. https://en.wikipedia.org/wiki/Niels_Bohr. - "bohr", - - // Kathleen Booth, she's credited with writing the first assembly language. https://en.wikipedia.org/wiki/Kathleen_Booth - "booth", - - // Anita Borg - Anita Borg was the founding director of the Institute for Women and Technology (IWT). https://en.wikipedia.org/wiki/Anita_Borg - "borg", - - // Satyendra Nath Bose - He provided the foundation for Bose–Einstein statistics and the theory of the Bose–Einstein condensate. - https://en.wikipedia.org/wiki/Satyendra_Nath_Bose - "bose", - - // Evelyn Boyd Granville - She was one of the first African-American woman to receive a Ph.D. in mathematics; she earned it in 1949 from Yale University. https://en.wikipedia.org/wiki/Evelyn_Boyd_Granville - "boyd", - - // Brahmagupta - Ancient Indian mathematician during 598-670 CE who gave rules to compute with zero - https://en.wikipedia.org/wiki/Brahmagupta#Zero - "brahmagupta", - - // Walter Houser Brattain co-invented the transistor - https://en.wikipedia.org/wiki/Walter_Houser_Brattain - "brattain", - - // Emmett Brown invented time travel. https://en.wikipedia.org/wiki/Emmett_Brown (thanks Brian Goff) - "brown", - - // Rachel Carson - American marine biologist and conservationist, her book Silent Spring and other writings are credited with advancing the global environmental movement. https://en.wikipedia.org/wiki/Rachel_Carson - "carson", - - // Subrahmanyan Chandrasekhar - Astrophysicist known for his mathematical theory on different stages and evolution in structures of the stars. He has won nobel prize for physics - https://en.wikipedia.org/wiki/Subrahmanyan_Chandrasekhar - "chandrasekhar", - - //Claude Shannon - The father of information theory and founder of digital circuit design theory. (https://en.wikipedia.org/wiki/Claude_Shannon) - "shannon", - - // Joan Clarke - Bletchley Park code breaker during the Second World War who pioneered techniques that remained top secret for decades. Also an accomplished numismatist https://en.wikipedia.org/wiki/Joan_Clarke - "clarke", - - // Jane Colden - American botanist widely considered the first female American botanist - https://en.wikipedia.org/wiki/Jane_Colden - "colden", - - // Gerty Theresa Cori - American biochemist who became the third woman—and first American woman—to win a Nobel Prize in science, and the first woman to be awarded the Nobel Prize in Physiology or Medicine. Cori was born in Prague. https://en.wikipedia.org/wiki/Gerty_Cori - "cori", - - // Seymour Roger Cray was an American electrical engineer and supercomputer architect who designed a series of computers that were the fastest in the world for decades. https://en.wikipedia.org/wiki/Seymour_Cray - "cray", - - // This entry reflects a husband and wife team who worked together: - // Joan Curran was a Welsh scientist who developed radar and invented chaff, a radar countermeasure. https://en.wikipedia.org/wiki/Joan_Curran - // Samuel Curran was an Irish physicist who worked alongside his wife during WWII and invented the proximity fuse. https://en.wikipedia.org/wiki/Samuel_Curran - "curran", - - // Marie Curie discovered radioactivity. https://en.wikipedia.org/wiki/Marie_Curie. - "curie", - - // Charles Darwin established the principles of natural evolution. https://en.wikipedia.org/wiki/Charles_Darwin. - "darwin", - - // Leonardo Da Vinci invented too many things to list here. https://en.wikipedia.org/wiki/Leonardo_da_Vinci. - "davinci", - - // Edsger Wybe Dijkstra was a Dutch computer scientist and mathematical scientist. https://en.wikipedia.org/wiki/Edsger_W._Dijkstra. - "dijkstra", - - // Donna Dubinsky - played an integral role in the development of personal digital assistants (PDAs) serving as CEO of Palm, Inc. and co-founding Handspring. https://en.wikipedia.org/wiki/Donna_Dubinsky - "dubinsky", - - // Annie Easley - She was a leading member of the team which developed software for the Centaur rocket stage and one of the first African-Americans in her field. https://en.wikipedia.org/wiki/Annie_Easley - "easley", - - // Thomas Alva Edison, prolific inventor https://en.wikipedia.org/wiki/Thomas_Edison - "edison", - - // Albert Einstein invented the general theory of relativity. https://en.wikipedia.org/wiki/Albert_Einstein - "einstein", - - // Gertrude Elion - American biochemist, pharmacologist and the 1988 recipient of the Nobel Prize in Medicine - https://en.wikipedia.org/wiki/Gertrude_Elion - "elion", - - // Douglas Engelbart gave the mother of all demos: https://en.wikipedia.org/wiki/Douglas_Engelbart - "engelbart", - - // Euclid invented geometry. https://en.wikipedia.org/wiki/Euclid - "euclid", - - // Leonhard Euler invented large parts of modern mathematics. https://de.wikipedia.org/wiki/Leonhard_Euler - "euler", - - // Pierre de Fermat pioneered several aspects of modern mathematics. https://en.wikipedia.org/wiki/Pierre_de_Fermat - "fermat", - - // Enrico Fermi invented the first nuclear reactor. https://en.wikipedia.org/wiki/Enrico_Fermi. - "fermi", - - // Richard Feynman was a key contributor to quantum mechanics and particle physics. https://en.wikipedia.org/wiki/Richard_Feynman - "feynman", - - // Benjamin Franklin is famous for his experiments in electricity and the invention of the lightning rod. - "franklin", - - // Galileo was a founding father of modern astronomy, and faced politics and obscurantism to establish scientific truth. https://en.wikipedia.org/wiki/Galileo_Galilei - "galileo", - - // William Henry "Bill" Gates III is an American business magnate, philanthropist, investor, computer programmer, and inventor. https://en.wikipedia.org/wiki/Bill_Gates - "gates", - - // Adele Goldberg, was one of the designers and developers of the Smalltalk language. https://en.wikipedia.org/wiki/Adele_Goldberg_(computer_scientist) - "goldberg", - - // Adele Goldstine, born Adele Katz, wrote the complete technical description for the first electronic digital computer, ENIAC. https://en.wikipedia.org/wiki/Adele_Goldstine - "goldstine", - - // Shafi Goldwasser is a computer scientist known for creating theoretical foundations of modern cryptography. Winner of 2012 ACM Turing Award. https://en.wikipedia.org/wiki/Shafi_Goldwasser - "goldwasser", - - // James Golick, all around gangster. - "golick", - - // Jane Goodall - British primatologist, ethologist, and anthropologist who is considered to be the world's foremost expert on chimpanzees - https://en.wikipedia.org/wiki/Jane_Goodall - "goodall", - - // Lois Haibt - American computer scientist, part of the team at IBM that developed FORTRAN - https://en.wikipedia.org/wiki/Lois_Haibt - "haibt", - - // Margaret Hamilton - Director of the Software Engineering Division of the MIT Instrumentation Laboratory, which developed on-board flight software for the Apollo space program. https://en.wikipedia.org/wiki/Margaret_Hamilton_(scientist) - "hamilton", - - // Stephen Hawking pioneered the field of cosmology by combining general relativity and quantum mechanics. https://en.wikipedia.org/wiki/Stephen_Hawking - "hawking", - - // Werner Heisenberg was a founding father of quantum mechanics. https://en.wikipedia.org/wiki/Werner_Heisenberg - "heisenberg", - - // Jaroslav Heyrovský was the inventor of the polarographic method, father of the electroanalytical method, and recipient of the Nobel Prize in 1959. His main field of work was polarography. https://en.wikipedia.org/wiki/Jaroslav_Heyrovsk%C3%BD - "heyrovsky", - - // Dorothy Hodgkin was a British biochemist, credited with the development of protein crystallography. She was awarded the Nobel Prize in Chemistry in 1964. https://en.wikipedia.org/wiki/Dorothy_Hodgkin - "hodgkin", - - // Erna Schneider Hoover revolutionized modern communication by inventing a computerized telephone switching method. https://en.wikipedia.org/wiki/Erna_Schneider_Hoover - "hoover", - - // Grace Hopper developed the first compiler for a computer programming language and is credited with popularizing the term "debugging" for fixing computer glitches. https://en.wikipedia.org/wiki/Grace_Hopper - "hopper", - - // Frances Hugle, she was an American scientist, engineer, and inventor who contributed to the understanding of semiconductors, integrated circuitry, and the unique electrical principles of microscopic materials. https://en.wikipedia.org/wiki/Frances_Hugle - "hugle", - - // Hypatia - Greek Alexandrine Neoplatonist philosopher in Egypt who was one of the earliest mothers of mathematics - https://en.wikipedia.org/wiki/Hypatia - "hypatia", - - // Yeong-Sil Jang was a Korean scientist and astronomer during the Joseon Dynasty; he invented the first metal printing press and water gauge. https://en.wikipedia.org/wiki/Jang_Yeong-sil - "jang", - - // Betty Jennings - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Jean_Bartik - "jennings", - - // Mary Lou Jepsen, was the founder and chief technology officer of One Laptop Per Child (OLPC), and the founder of Pixel Qi. https://en.wikipedia.org/wiki/Mary_Lou_Jepsen - "jepsen", - - // Irène Joliot-Curie - French scientist who was awarded the Nobel Prize for Chemistry in 1935. Daughter of Marie and Pierre Curie. https://en.wikipedia.org/wiki/Ir%C3%A8ne_Joliot-Curie - "joliot", - - // Karen Spärck Jones came up with the concept of inverse document frequency, which is used in most search engines today. https://en.wikipedia.org/wiki/Karen_Sp%C3%A4rck_Jones - "jones", - - // A. P. J. Abdul Kalam - is an Indian scientist aka Missile Man of India for his work on the development of ballistic missile and launch vehicle technology - https://en.wikipedia.org/wiki/A._P._J._Abdul_Kalam - "kalam", - - // Susan Kare, created the icons and many of the interface elements for the original Apple Macintosh in the 1980s, and was an original employee of NeXT, working as the Creative Director. https://en.wikipedia.org/wiki/Susan_Kare - "kare", - - // Mary Kenneth Keller, Sister Mary Kenneth Keller became the first American woman to earn a PhD in Computer Science in 1965. https://en.wikipedia.org/wiki/Mary_Kenneth_Keller - "keller", - - // Har Gobind Khorana - Indian-American biochemist who shared the 1968 Nobel Prize for Physiology - https://en.wikipedia.org/wiki/Har_Gobind_Khorana - "khorana", - - // Jack Kilby invented silicone integrated circuits and gave Silicon Valley its name. - https://en.wikipedia.org/wiki/Jack_Kilby - "kilby", - - // Maria Kirch - German astronomer and first woman to discover a comet - https://en.wikipedia.org/wiki/Maria_Margarethe_Kirch - "kirch", - - // Donald Knuth - American computer scientist, author of "The Art of Computer Programming" and creator of the TeX typesetting system. https://en.wikipedia.org/wiki/Donald_Knuth - "knuth", - - // Sophie Kowalevski - Russian mathematician responsible for important original contributions to analysis, differential equations and mechanics - https://en.wikipedia.org/wiki/Sofia_Kovalevskaya - "kowalevski", - - // Marie-Jeanne de Lalande - French astronomer, mathematician and cataloguer of stars - https://en.wikipedia.org/wiki/Marie-Jeanne_de_Lalande - "lalande", - - // Hedy Lamarr - Actress and inventor. The principles of her work are now incorporated into modern Wi-Fi, CDMA and Bluetooth technology. https://en.wikipedia.org/wiki/Hedy_Lamarr - "lamarr", - - // Leslie B. Lamport - American computer scientist. Lamport is best known for his seminal work in distributed systems and was the winner of the 2013 Turing Award. https://en.wikipedia.org/wiki/Leslie_Lamport - "lamport", - - // Mary Leakey - British paleoanthropologist who discovered the first fossilized Proconsul skull - https://en.wikipedia.org/wiki/Mary_Leakey - "leakey", - - // Henrietta Swan Leavitt - she was an American astronomer who discovered the relation between the luminosity and the period of Cepheid variable stars. https://en.wikipedia.org/wiki/Henrietta_Swan_Leavitt - "leavitt", - - //Daniel Lewin - Mathematician, Akamai co-founder, soldier, 9/11 victim-- Developed optimization techniques for routing traffic on the internet. Died attempting to stop the 9-11 hijackers. https://en.wikipedia.org/wiki/Daniel_Lewin - "lewin", - - // Ruth Lichterman - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Ruth_Teitelbaum - "lichterman", - - // Barbara Liskov - co-developed the Liskov substitution principle. Liskov was also the winner of the Turing Prize in 2008. - https://en.wikipedia.org/wiki/Barbara_Liskov - "liskov", - - // Ada Lovelace invented the first algorithm. https://en.wikipedia.org/wiki/Ada_Lovelace (thanks James Turnbull) - "lovelace", - - // Auguste and Louis Lumière - the first filmmakers in history - https://en.wikipedia.org/wiki/Auguste_and_Louis_Lumi%C3%A8re - "lumiere", - - // Mahavira - Ancient Indian mathematician during 9th century AD who discovered basic algebraic identities - https://en.wikipedia.org/wiki/Mah%C4%81v%C4%ABra_(mathematician) - "mahavira", - - // Maria Mayer - American theoretical physicist and Nobel laureate in Physics for proposing the nuclear shell model of the atomic nucleus - https://en.wikipedia.org/wiki/Maria_Mayer - "mayer", - - // John McCarthy invented LISP: https://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist) - "mccarthy", - - // Barbara McClintock - a distinguished American cytogeneticist, 1983 Nobel Laureate in Physiology or Medicine for discovering transposons. https://en.wikipedia.org/wiki/Barbara_McClintock - "mcclintock", - - // Malcolm McLean invented the modern shipping container: https://en.wikipedia.org/wiki/Malcom_McLean - "mclean", - - // Kay McNulty - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Kathleen_Antonelli - "mcnulty", - - // Lise Meitner - Austrian/Swedish physicist who was involved in the discovery of nuclear fission. The element meitnerium is named after her - https://en.wikipedia.org/wiki/Lise_Meitner - "meitner", - - // Carla Meninsky, was the game designer and programmer for Atari 2600 games Dodge 'Em and Warlords. https://en.wikipedia.org/wiki/Carla_Meninsky - "meninsky", - - // Johanna Mestorf - German prehistoric archaeologist and first female museum director in Germany - https://en.wikipedia.org/wiki/Johanna_Mestorf - "mestorf", - - // Marvin Minsky - Pioneer in Artificial Intelligence, co-founder of the MIT's AI Lab, won the Turing Award in 1969. https://en.wikipedia.org/wiki/Marvin_Minsky - "minsky", - - // Maryam Mirzakhani - an Iranian mathematician and the first woman to win the Fields Medal. https://en.wikipedia.org/wiki/Maryam_Mirzakhani - "mirzakhani", - - // Samuel Morse - contributed to the invention of a single-wire telegraph system based on European telegraphs and was a co-developer of the Morse code - https://en.wikipedia.org/wiki/Samuel_Morse - "morse", - - // Ian Murdock - founder of the Debian project - https://en.wikipedia.org/wiki/Ian_Murdock - "murdock", - - // Isaac Newton invented classic mechanics and modern optics. https://en.wikipedia.org/wiki/Isaac_Newton - "newton", - - // Florence Nightingale, more prominently known as a nurse, was also the first female member of the Royal Statistical Society and a pioneer in statistical graphics https://en.wikipedia.org/wiki/Florence_Nightingale#Statistics_and_sanitary_reform - "nightingale", - - // Alfred Nobel - a Swedish chemist, engineer, innovator, and armaments manufacturer (inventor of dynamite) - https://en.wikipedia.org/wiki/Alfred_Nobel - "nobel", - - // Emmy Noether, German mathematician. Noether's Theorem is named after her. https://en.wikipedia.org/wiki/Emmy_Noether - "noether", - - // Poppy Northcutt. Poppy Northcutt was the first woman to work as part of NASA’s Mission Control. http://www.businessinsider.com/poppy-northcutt-helped-apollo-astronauts-2014-12?op=1 - "northcutt", - - // Robert Noyce invented silicone integrated circuits and gave Silicon Valley its name. - https://en.wikipedia.org/wiki/Robert_Noyce - "noyce", - - // Panini - Ancient Indian linguist and grammarian from 4th century CE who worked on the world's first formal system - https://en.wikipedia.org/wiki/P%C4%81%E1%B9%87ini#Comparison_with_modern_formal_systems - "panini", - - // Ambroise Pare invented modern surgery. https://en.wikipedia.org/wiki/Ambroise_Par%C3%A9 - "pare", - - // Louis Pasteur discovered vaccination, fermentation and pasteurization. https://en.wikipedia.org/wiki/Louis_Pasteur. - "pasteur", - - // Cecilia Payne-Gaposchkin was an astronomer and astrophysicist who, in 1925, proposed in her Ph.D. thesis an explanation for the composition of stars in terms of the relative abundances of hydrogen and helium. https://en.wikipedia.org/wiki/Cecilia_Payne-Gaposchkin - "payne", - - // Radia Perlman is a software designer and network engineer and most famous for her invention of the spanning-tree protocol (STP). https://en.wikipedia.org/wiki/Radia_Perlman - "perlman", - - // Rob Pike was a key contributor to Unix, Plan 9, the X graphic system, utf-8, and the Go programming language. https://en.wikipedia.org/wiki/Rob_Pike - "pike", - - // Henri Poincaré made fundamental contributions in several fields of mathematics. https://en.wikipedia.org/wiki/Henri_Poincar%C3%A9 - "poincare", - - // Laura Poitras is a director and producer whose work, made possible by open source crypto tools, advances the causes of truth and freedom of information by reporting disclosures by whistleblowers such as Edward Snowden. https://en.wikipedia.org/wiki/Laura_Poitras - "poitras", - - // Claudius Ptolemy - a Greco-Egyptian writer of Alexandria, known as a mathematician, astronomer, geographer, astrologer, and poet of a single epigram in the Greek Anthology - https://en.wikipedia.org/wiki/Ptolemy - "ptolemy", - - // C. V. Raman - Indian physicist who won the Nobel Prize in 1930 for proposing the Raman effect. - https://en.wikipedia.org/wiki/C._V._Raman - "raman", - - // Srinivasa Ramanujan - Indian mathematician and autodidact who made extraordinary contributions to mathematical analysis, number theory, infinite series, and continued fractions. - https://en.wikipedia.org/wiki/Srinivasa_Ramanujan - "ramanujan", - - // Sally Kristen Ride was an American physicist and astronaut. She was the first American woman in space, and the youngest American astronaut. https://en.wikipedia.org/wiki/Sally_Ride - "ride", - - // Rita Levi-Montalcini - Won Nobel Prize in Physiology or Medicine jointly with colleague Stanley Cohen for the discovery of nerve growth factor (https://en.wikipedia.org/wiki/Rita_Levi-Montalcini) - "montalcini", - - // Dennis Ritchie - co-creator of UNIX and the C programming language. - https://en.wikipedia.org/wiki/Dennis_Ritchie - "ritchie", - - // Wilhelm Conrad Röntgen - German physicist who was awarded the first Nobel Prize in Physics in 1901 for the discovery of X-rays (Röntgen rays). https://en.wikipedia.org/wiki/Wilhelm_R%C3%B6ntgen - "roentgen", - - // Rosalind Franklin - British biophysicist and X-ray crystallographer whose research was critical to the understanding of DNA - https://en.wikipedia.org/wiki/Rosalind_Franklin - "rosalind", - - // Meghnad Saha - Indian astrophysicist best known for his development of the Saha equation, used to describe chemical and physical conditions in stars - https://en.wikipedia.org/wiki/Meghnad_Saha - "saha", - - // Jean E. Sammet developed FORMAC, the first widely used computer language for symbolic manipulation of mathematical formulas. https://en.wikipedia.org/wiki/Jean_E._Sammet - "sammet", - - // Carol Shaw - Originally an Atari employee, Carol Shaw is said to be the first female video game designer. https://en.wikipedia.org/wiki/Carol_Shaw_(video_game_designer) - "shaw", - - // Dame Stephanie "Steve" Shirley - Founded a software company in 1962 employing women working from home. https://en.wikipedia.org/wiki/Steve_Shirley - "shirley", - - // William Shockley co-invented the transistor - https://en.wikipedia.org/wiki/William_Shockley - "shockley", - - // Françoise Barré-Sinoussi - French virologist and Nobel Prize Laureate in Physiology or Medicine; her work was fundamental in identifying HIV as the cause of AIDS. https://en.wikipedia.org/wiki/Fran%C3%A7oise_Barr%C3%A9-Sinoussi - "sinoussi", - - // Betty Snyder - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Betty_Holberton - "snyder", - - // Frances Spence - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Frances_Spence - "spence", - - // Richard Matthew Stallman - the founder of the Free Software movement, the GNU project, the Free Software Foundation, and the League for Programming Freedom. He also invented the concept of copyleft to protect the ideals of this movement, and enshrined this concept in the widely-used GPL (General Public License) for software. https://en.wikiquote.org/wiki/Richard_Stallman - "stallman", - - // Michael Stonebraker is a database research pioneer and architect of Ingres, Postgres, VoltDB and SciDB. Winner of 2014 ACM Turing Award. https://en.wikipedia.org/wiki/Michael_Stonebraker - "stonebraker", - - // Janese Swanson (with others) developed the first of the Carmen Sandiego games. She went on to found Girl Tech. https://en.wikipedia.org/wiki/Janese_Swanson - "swanson", - - // Aaron Swartz was influential in creating RSS, Markdown, Creative Commons, Reddit, and much of the internet as we know it today. He was devoted to freedom of information on the web. https://en.wikiquote.org/wiki/Aaron_Swartz - "swartz", - - // Bertha Swirles was a theoretical physicist who made a number of contributions to early quantum theory. https://en.wikipedia.org/wiki/Bertha_Swirles - "swirles", - - // Nikola Tesla invented the AC electric system and every gadget ever used by a James Bond villain. https://en.wikipedia.org/wiki/Nikola_Tesla - "tesla", - - // Ken Thompson - co-creator of UNIX and the C programming language - https://en.wikipedia.org/wiki/Ken_Thompson - "thompson", - - // Linus Torvalds invented Linux and Git. https://en.wikipedia.org/wiki/Linus_Torvalds - "torvalds", - - // Alan Turing was a founding father of computer science. https://en.wikipedia.org/wiki/Alan_Turing. - "turing", - - // Varahamihira - Ancient Indian mathematician who discovered trigonometric formulae during 505-587 CE - https://en.wikipedia.org/wiki/Var%C4%81hamihira#Contributions - "varahamihira", - - // Sir Mokshagundam Visvesvaraya - is a notable Indian engineer. He is a recipient of the Indian Republic's highest honour, the Bharat Ratna, in 1955. On his birthday, 15 September is celebrated as Engineer's Day in India in his memory - https://en.wikipedia.org/wiki/Visvesvaraya - "visvesvaraya", - - // Christiane Nüsslein-Volhard - German biologist, won Nobel Prize in Physiology or Medicine in 1995 for research on the genetic control of embryonic development. https://en.wikipedia.org/wiki/Christiane_N%C3%BCsslein-Volhard - "volhard", - - // Marlyn Wescoff - one of the original programmers of the ENIAC. https://en.wikipedia.org/wiki/ENIAC - https://en.wikipedia.org/wiki/Marlyn_Meltzer - "wescoff", - - // Andrew Wiles - Notable British mathematician who proved the enigmatic Fermat's Last Theorem - https://en.wikipedia.org/wiki/Andrew_Wiles - "wiles", - - // Roberta Williams, did pioneering work in graphical adventure games for personal computers, particularly the King's Quest series. https://en.wikipedia.org/wiki/Roberta_Williams - "williams", - - // Sophie Wilson designed the first Acorn Micro-Computer and the instruction set for ARM processors. https://en.wikipedia.org/wiki/Sophie_Wilson - "wilson", - - // Jeannette Wing - co-developed the Liskov substitution principle. - https://en.wikipedia.org/wiki/Jeannette_Wing - "wing", - - // Steve Wozniak invented the Apple I and Apple II. https://en.wikipedia.org/wiki/Steve_Wozniak - "wozniak", - - // The Wright brothers, Orville and Wilbur - credited with inventing and building the world's first successful airplane and making the first controlled, powered and sustained heavier-than-air human flight - https://en.wikipedia.org/wiki/Wright_brothers - "wright", - - // Rosalyn Sussman Yalow - Rosalyn Sussman Yalow was an American medical physicist, and a co-winner of the 1977 Nobel Prize in Physiology or Medicine for development of the radioimmunoassay technique. https://en.wikipedia.org/wiki/Rosalyn_Sussman_Yalow - "yalow", - - // Ada Yonath - an Israeli crystallographer, the first woman from the Middle East to win a Nobel prize in the sciences. https://en.wikipedia.org/wiki/Ada_Yonath - "yonath", - } -) - -// GetRandomName generates a random name from the list of adjectives and surnames in this package -// formatted as "adjective_surname". For example 'focused_turing'. If retry is non-zero, a random -// integer between 0 and 10 will be added to the end of the name, e.g `focused_turing3` -func GetRandomName(retry int) string { - rnd := random.Rand -begin: - name := fmt.Sprintf("%s_%s", left[rnd.Intn(len(left))], right[rnd.Intn(len(right))]) - if name == "boring_wozniak" /* Steve Wozniak is not boring */ { - goto begin - } - - if retry > 0 { - name = fmt.Sprintf("%s%d", name, rnd.Intn(10)) - } - return name -} diff --git a/vendor/github.com/docker/docker/pkg/namesgenerator/names-generator_test.go b/vendor/github.com/docker/docker/pkg/namesgenerator/names-generator_test.go deleted file mode 100644 index d1a94977d..000000000 --- a/vendor/github.com/docker/docker/pkg/namesgenerator/names-generator_test.go +++ /dev/null @@ -1,27 +0,0 @@ -package namesgenerator - -import ( - "strings" - "testing" -) - -func TestNameFormat(t *testing.T) { - name := GetRandomName(0) - if !strings.Contains(name, "_") { - t.Fatalf("Generated name does not contain an underscore") - } - if strings.ContainsAny(name, "0123456789") { - t.Fatalf("Generated name contains numbers!") - } -} - -func TestNameRetries(t *testing.T) { - name := GetRandomName(1) - if !strings.Contains(name, "_") { - t.Fatalf("Generated name does not contain an underscore") - } - if !strings.ContainsAny(name, "0123456789") { - t.Fatalf("Generated name doesn't contain a number") - } - -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel.go b/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel.go deleted file mode 100644 index 7738fc741..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel.go +++ /dev/null @@ -1,74 +0,0 @@ -// +build !windows - -// Package kernel provides helper function to get, parse and compare kernel -// versions for different platforms. -package kernel - -import ( - "errors" - "fmt" -) - -// VersionInfo holds information about the kernel. -type VersionInfo struct { - Kernel int // Version of the kernel (e.g. 4.1.2-generic -> 4) - Major int // Major part of the kernel version (e.g. 4.1.2-generic -> 1) - Minor int // Minor part of the kernel version (e.g. 4.1.2-generic -> 2) - Flavor string // Flavor of the kernel version (e.g. 4.1.2-generic -> generic) -} - -func (k *VersionInfo) String() string { - return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, k.Flavor) -} - -// CompareKernelVersion compares two kernel.VersionInfo structs. -// Returns -1 if a < b, 0 if a == b, 1 it a > b -func CompareKernelVersion(a, b VersionInfo) int { - if a.Kernel < b.Kernel { - return -1 - } else if a.Kernel > b.Kernel { - return 1 - } - - if a.Major < b.Major { - return -1 - } else if a.Major > b.Major { - return 1 - } - - if a.Minor < b.Minor { - return -1 - } else if a.Minor > b.Minor { - return 1 - } - - return 0 -} - -// ParseRelease parses a string and creates a VersionInfo based on it. -func ParseRelease(release string) (*VersionInfo, error) { - var ( - kernel, major, minor, parsed int - flavor, partial string - ) - - // Ignore error from Sscanf to allow an empty flavor. Instead, just - // make sure we got all the version numbers. - parsed, _ = fmt.Sscanf(release, "%d.%d%s", &kernel, &major, &partial) - if parsed < 2 { - return nil, errors.New("Can't parse kernel version " + release) - } - - // sometimes we have 3.12.25-gentoo, but sometimes we just have 3.12-1-amd64 - parsed, _ = fmt.Sscanf(partial, ".%d%s", &minor, &flavor) - if parsed < 1 { - flavor = partial - } - - return &VersionInfo{ - Kernel: kernel, - Major: major, - Minor: minor, - Flavor: flavor, - }, nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_darwin.go b/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_darwin.go deleted file mode 100644 index 71f205b28..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_darwin.go +++ /dev/null @@ -1,56 +0,0 @@ -// +build darwin - -// Package kernel provides helper function to get, parse and compare kernel -// versions for different platforms. -package kernel - -import ( - "fmt" - "os/exec" - "strings" - - "github.com/mattn/go-shellwords" -) - -// GetKernelVersion gets the current kernel version. -func GetKernelVersion() (*VersionInfo, error) { - release, err := getRelease() - if err != nil { - return nil, err - } - - return ParseRelease(release) -} - -// getRelease uses `system_profiler SPSoftwareDataType` to get OSX kernel version -func getRelease() (string, error) { - cmd := exec.Command("system_profiler", "SPSoftwareDataType") - osName, err := cmd.Output() - if err != nil { - return "", err - } - - var release string - data := strings.Split(string(osName), "\n") - for _, line := range data { - if strings.Contains(line, "Kernel Version") { - // It has the format like ' Kernel Version: Darwin 14.5.0' - content := strings.SplitN(line, ":", 2) - if len(content) != 2 { - return "", fmt.Errorf("Kernel Version is invalid") - } - - prettyNames, err := shellwords.Parse(content[1]) - if err != nil { - return "", fmt.Errorf("Kernel Version is invalid: %s", err.Error()) - } - - if len(prettyNames) != 2 { - return "", fmt.Errorf("Kernel Version needs to be 'Darwin x.x.x' ") - } - release = prettyNames[1] - } - } - - return release, nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_unix.go b/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_unix.go deleted file mode 100644 index 744d5e1f8..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_unix.go +++ /dev/null @@ -1,45 +0,0 @@ -// +build linux freebsd solaris - -// Package kernel provides helper function to get, parse and compare kernel -// versions for different platforms. -package kernel - -import ( - "bytes" - - "github.com/Sirupsen/logrus" -) - -// GetKernelVersion gets the current kernel version. -func GetKernelVersion() (*VersionInfo, error) { - uts, err := uname() - if err != nil { - return nil, err - } - - release := make([]byte, len(uts.Release)) - - i := 0 - for _, c := range uts.Release { - release[i] = byte(c) - i++ - } - - // Remove the \x00 from the release for Atoi to parse correctly - release = release[:bytes.IndexByte(release, 0)] - - return ParseRelease(string(release)) -} - -// CheckKernelVersion checks if current kernel is newer than (or equal to) -// the given version. -func CheckKernelVersion(k, major, minor int) bool { - if v, err := GetKernelVersion(); err != nil { - logrus.Warnf("error getting kernel version: %s", err) - } else { - if CompareKernelVersion(*v, VersionInfo{Kernel: k, Major: major, Minor: minor}) < 0 { - return false - } - } - return true -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_unix_test.go b/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_unix_test.go deleted file mode 100644 index dc8c0e307..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_unix_test.go +++ /dev/null @@ -1,96 +0,0 @@ -// +build !windows - -package kernel - -import ( - "fmt" - "testing" -) - -func assertParseRelease(t *testing.T, release string, b *VersionInfo, result int) { - var ( - a *VersionInfo - ) - a, _ = ParseRelease(release) - - if r := CompareKernelVersion(*a, *b); r != result { - t.Fatalf("Unexpected kernel version comparison result for (%v,%v). Found %d, expected %d", release, b, r, result) - } - if a.Flavor != b.Flavor { - t.Fatalf("Unexpected parsed kernel flavor. Found %s, expected %s", a.Flavor, b.Flavor) - } -} - -// TestParseRelease tests the ParseRelease() function -func TestParseRelease(t *testing.T) { - assertParseRelease(t, "3.8.0", &VersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0) - assertParseRelease(t, "3.4.54.longterm-1", &VersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: ".longterm-1"}, 0) - assertParseRelease(t, "3.4.54.longterm-1", &VersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: ".longterm-1"}, 0) - assertParseRelease(t, "3.8.0-19-generic", &VersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "-19-generic"}, 0) - assertParseRelease(t, "3.12.8tag", &VersionInfo{Kernel: 3, Major: 12, Minor: 8, Flavor: "tag"}, 0) - assertParseRelease(t, "3.12-1-amd64", &VersionInfo{Kernel: 3, Major: 12, Minor: 0, Flavor: "-1-amd64"}, 0) - assertParseRelease(t, "3.8.0", &VersionInfo{Kernel: 4, Major: 8, Minor: 0}, -1) - // Errors - invalids := []string{ - "3", - "a", - "a.a", - "a.a.a-a", - } - for _, invalid := range invalids { - expectedMessage := fmt.Sprintf("Can't parse kernel version %v", invalid) - if _, err := ParseRelease(invalid); err == nil || err.Error() != expectedMessage { - - } - } -} - -func assertKernelVersion(t *testing.T, a, b VersionInfo, result int) { - if r := CompareKernelVersion(a, b); r != result { - t.Fatalf("Unexpected kernel version comparison result. Found %d, expected %d", r, result) - } -} - -// TestCompareKernelVersion tests the CompareKernelVersion() function -func TestCompareKernelVersion(t *testing.T) { - assertKernelVersion(t, - VersionInfo{Kernel: 3, Major: 8, Minor: 0}, - VersionInfo{Kernel: 3, Major: 8, Minor: 0}, - 0) - assertKernelVersion(t, - VersionInfo{Kernel: 2, Major: 6, Minor: 0}, - VersionInfo{Kernel: 3, Major: 8, Minor: 0}, - -1) - assertKernelVersion(t, - VersionInfo{Kernel: 3, Major: 8, Minor: 0}, - VersionInfo{Kernel: 2, Major: 6, Minor: 0}, - 1) - assertKernelVersion(t, - VersionInfo{Kernel: 3, Major: 8, Minor: 0}, - VersionInfo{Kernel: 3, Major: 8, Minor: 0}, - 0) - assertKernelVersion(t, - VersionInfo{Kernel: 3, Major: 8, Minor: 5}, - VersionInfo{Kernel: 3, Major: 8, Minor: 0}, - 1) - assertKernelVersion(t, - VersionInfo{Kernel: 3, Major: 0, Minor: 20}, - VersionInfo{Kernel: 3, Major: 8, Minor: 0}, - -1) - assertKernelVersion(t, - VersionInfo{Kernel: 3, Major: 7, Minor: 20}, - VersionInfo{Kernel: 3, Major: 8, Minor: 0}, - -1) - assertKernelVersion(t, - VersionInfo{Kernel: 3, Major: 8, Minor: 20}, - VersionInfo{Kernel: 3, Major: 7, Minor: 0}, - 1) - assertKernelVersion(t, - VersionInfo{Kernel: 3, Major: 8, Minor: 20}, - VersionInfo{Kernel: 3, Major: 8, Minor: 0}, - 1) - assertKernelVersion(t, - VersionInfo{Kernel: 3, Major: 8, Minor: 0}, - VersionInfo{Kernel: 3, Major: 8, Minor: 20}, - -1) -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_windows.go b/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_windows.go deleted file mode 100644 index 80fab8ff6..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/kernel/kernel_windows.go +++ /dev/null @@ -1,69 +0,0 @@ -// +build windows - -package kernel - -import ( - "fmt" - "syscall" - "unsafe" -) - -// VersionInfo holds information about the kernel. -type VersionInfo struct { - kvi string // Version of the kernel (e.g. 6.1.7601.17592 -> 6) - major int // Major part of the kernel version (e.g. 6.1.7601.17592 -> 1) - minor int // Minor part of the kernel version (e.g. 6.1.7601.17592 -> 7601) - build int // Build number of the kernel version (e.g. 6.1.7601.17592 -> 17592) -} - -func (k *VersionInfo) String() string { - return fmt.Sprintf("%d.%d %d (%s)", k.major, k.minor, k.build, k.kvi) -} - -// GetKernelVersion gets the current kernel version. -func GetKernelVersion() (*VersionInfo, error) { - - var ( - h syscall.Handle - dwVersion uint32 - err error - ) - - KVI := &VersionInfo{"Unknown", 0, 0, 0} - - if err = syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE, - syscall.StringToUTF16Ptr(`SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\`), - 0, - syscall.KEY_READ, - &h); err != nil { - return KVI, err - } - defer syscall.RegCloseKey(h) - - var buf [1 << 10]uint16 - var typ uint32 - n := uint32(len(buf) * 2) // api expects array of bytes, not uint16 - - if err = syscall.RegQueryValueEx(h, - syscall.StringToUTF16Ptr("BuildLabEx"), - nil, - &typ, - (*byte)(unsafe.Pointer(&buf[0])), - &n); err != nil { - return KVI, err - } - - KVI.kvi = syscall.UTF16ToString(buf[:]) - - // Important - docker.exe MUST be manifested for this API to return - // the correct information. - if dwVersion, err = syscall.GetVersion(); err != nil { - return KVI, err - } - - KVI.major = int(dwVersion & 0xFF) - KVI.minor = int((dwVersion & 0XFF00) >> 8) - KVI.build = int((dwVersion & 0xFFFF0000) >> 16) - - return KVI, nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/kernel/uname_linux.go b/vendor/github.com/docker/docker/pkg/parsers/kernel/uname_linux.go deleted file mode 100644 index bb9b32641..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/kernel/uname_linux.go +++ /dev/null @@ -1,19 +0,0 @@ -package kernel - -import ( - "syscall" -) - -// Utsname represents the system name structure. -// It is passthrough for syscall.Utsname in order to make it portable with -// other platforms where it is not available. -type Utsname syscall.Utsname - -func uname() (*syscall.Utsname, error) { - uts := &syscall.Utsname{} - - if err := syscall.Uname(uts); err != nil { - return nil, err - } - return uts, nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/kernel/uname_solaris.go b/vendor/github.com/docker/docker/pkg/parsers/kernel/uname_solaris.go deleted file mode 100644 index 49370bd3d..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/kernel/uname_solaris.go +++ /dev/null @@ -1,14 +0,0 @@ -package kernel - -import ( - "golang.org/x/sys/unix" -) - -func uname() (*unix.Utsname, error) { - uts := &unix.Utsname{} - - if err := unix.Uname(uts); err != nil { - return nil, err - } - return uts, nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/kernel/uname_unsupported.go b/vendor/github.com/docker/docker/pkg/parsers/kernel/uname_unsupported.go deleted file mode 100644 index 1da3f239f..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/kernel/uname_unsupported.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build !linux,!solaris - -package kernel - -import ( - "errors" -) - -// Utsname represents the system name structure. -// It is defined here to make it portable as it is available on linux but not -// on windows. -type Utsname struct { - Release [65]byte -} - -func uname() (*Utsname, error) { - return nil, errors.New("Kernel version detection is available only on linux") -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_linux.go b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_linux.go deleted file mode 100644 index e04a3499a..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_linux.go +++ /dev/null @@ -1,77 +0,0 @@ -// Package operatingsystem provides helper function to get the operating system -// name for different platforms. -package operatingsystem - -import ( - "bufio" - "bytes" - "fmt" - "io/ioutil" - "os" - "strings" - - "github.com/mattn/go-shellwords" -) - -var ( - // file to use to detect if the daemon is running in a container - proc1Cgroup = "/proc/1/cgroup" - - // file to check to determine Operating System - etcOsRelease = "/etc/os-release" - - // used by stateless systems like Clear Linux - altOsRelease = "/usr/lib/os-release" -) - -// GetOperatingSystem gets the name of the current operating system. -func GetOperatingSystem() (string, error) { - osReleaseFile, err := os.Open(etcOsRelease) - if err != nil { - if !os.IsNotExist(err) { - return "", fmt.Errorf("Error opening %s: %v", etcOsRelease, err) - } - osReleaseFile, err = os.Open(altOsRelease) - if err != nil { - return "", fmt.Errorf("Error opening %s: %v", altOsRelease, err) - } - } - defer osReleaseFile.Close() - - var prettyName string - scanner := bufio.NewScanner(osReleaseFile) - for scanner.Scan() { - line := scanner.Text() - if strings.HasPrefix(line, "PRETTY_NAME=") { - data := strings.SplitN(line, "=", 2) - prettyNames, err := shellwords.Parse(data[1]) - if err != nil { - return "", fmt.Errorf("PRETTY_NAME is invalid: %s", err.Error()) - } - if len(prettyNames) != 1 { - return "", fmt.Errorf("PRETTY_NAME needs to be enclosed by quotes if they have spaces: %s", data[1]) - } - prettyName = prettyNames[0] - } - } - if prettyName != "" { - return prettyName, nil - } - // If not set, defaults to PRETTY_NAME="Linux" - // c.f. http://www.freedesktop.org/software/systemd/man/os-release.html - return "Linux", nil -} - -// IsContainerized returns true if we are running inside a container. -func IsContainerized() (bool, error) { - b, err := ioutil.ReadFile(proc1Cgroup) - if err != nil { - return false, err - } - for _, line := range bytes.Split(b, []byte{'\n'}) { - if len(line) > 0 && !bytes.HasSuffix(line, []byte{'/'}) && !bytes.HasSuffix(line, []byte("init.scope")) { - return true, nil - } - } - return false, nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_solaris.go b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_solaris.go deleted file mode 100644 index d08ad1486..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_solaris.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build solaris,cgo - -package operatingsystem - -/* -#include -*/ -import "C" - -import ( - "bytes" - "errors" - "io/ioutil" -) - -var etcOsRelease = "/etc/release" - -// GetOperatingSystem gets the name of the current operating system. -func GetOperatingSystem() (string, error) { - b, err := ioutil.ReadFile(etcOsRelease) - if err != nil { - return "", err - } - if i := bytes.Index(b, []byte("\n")); i >= 0 { - b = bytes.Trim(b[:i], " ") - return string(b), nil - } - return "", errors.New("release not found") -} - -// IsContainerized returns true if we are running inside a container. -func IsContainerized() (bool, error) { - if C.getzoneid() != 0 { - return true, nil - } - return false, nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix.go b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix.go deleted file mode 100644 index bc91c3c53..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build freebsd darwin - -package operatingsystem - -import ( - "errors" - "os/exec" -) - -// GetOperatingSystem gets the name of the current operating system. -func GetOperatingSystem() (string, error) { - cmd := exec.Command("uname", "-s") - osName, err := cmd.Output() - if err != nil { - return "", err - } - return string(osName), nil -} - -// IsContainerized returns true if we are running inside a container. -// No-op on FreeBSD and Darwin, always returns false. -func IsContainerized() (bool, error) { - // TODO: Implement jail detection for freeBSD - return false, errors.New("Cannot detect if we are in container") -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix_test.go b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix_test.go deleted file mode 100644 index e7120c65c..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix_test.go +++ /dev/null @@ -1,247 +0,0 @@ -// +build linux freebsd - -package operatingsystem - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" -) - -func TestGetOperatingSystem(t *testing.T) { - var backup = etcOsRelease - - invalids := []struct { - content string - errorExpected string - }{ - { - `PRETTY_NAME=Source Mage GNU/Linux -PRETTY_NAME=Ubuntu 14.04.LTS`, - "PRETTY_NAME needs to be enclosed by quotes if they have spaces: Source Mage GNU/Linux", - }, - { - `PRETTY_NAME="Ubuntu Linux -PRETTY_NAME=Ubuntu 14.04.LTS`, - "PRETTY_NAME is invalid: invalid command line string", - }, - { - `PRETTY_NAME=Ubuntu' -PRETTY_NAME=Ubuntu 14.04.LTS`, - "PRETTY_NAME is invalid: invalid command line string", - }, - { - `PRETTY_NAME' -PRETTY_NAME=Ubuntu 14.04.LTS`, - "PRETTY_NAME needs to be enclosed by quotes if they have spaces: Ubuntu 14.04.LTS", - }, - } - - valids := []struct { - content string - expected string - }{ - { - `NAME="Ubuntu" -PRETTY_NAME_AGAIN="Ubuntu 14.04.LTS" -VERSION="14.04, Trusty Tahr" -ID=ubuntu -ID_LIKE=debian -VERSION_ID="14.04" -HOME_URL="http://www.ubuntu.com/" -SUPPORT_URL="http://help.ubuntu.com/" -BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"`, - "Linux", - }, - { - `NAME="Ubuntu" -VERSION="14.04, Trusty Tahr" -ID=ubuntu -ID_LIKE=debian -VERSION_ID="14.04" -HOME_URL="http://www.ubuntu.com/" -SUPPORT_URL="http://help.ubuntu.com/" -BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"`, - "Linux", - }, - { - `NAME=Gentoo -ID=gentoo -PRETTY_NAME="Gentoo/Linux" -ANSI_COLOR="1;32" -HOME_URL="http://www.gentoo.org/" -SUPPORT_URL="http://www.gentoo.org/main/en/support.xml" -BUG_REPORT_URL="https://bugs.gentoo.org/" -`, - "Gentoo/Linux", - }, - { - `NAME="Ubuntu" -VERSION="14.04, Trusty Tahr" -ID=ubuntu -ID_LIKE=debian -PRETTY_NAME="Ubuntu 14.04 LTS" -VERSION_ID="14.04" -HOME_URL="http://www.ubuntu.com/" -SUPPORT_URL="http://help.ubuntu.com/" -BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"`, - "Ubuntu 14.04 LTS", - }, - { - `NAME="Ubuntu" -VERSION="14.04, Trusty Tahr" -ID=ubuntu -ID_LIKE=debian -PRETTY_NAME='Ubuntu 14.04 LTS'`, - "Ubuntu 14.04 LTS", - }, - { - `PRETTY_NAME=Source -NAME="Source Mage"`, - "Source", - }, - { - `PRETTY_NAME=Source -PRETTY_NAME="Source Mage"`, - "Source Mage", - }, - } - - dir := os.TempDir() - etcOsRelease = filepath.Join(dir, "etcOsRelease") - - defer func() { - os.Remove(etcOsRelease) - etcOsRelease = backup - }() - - for _, elt := range invalids { - if err := ioutil.WriteFile(etcOsRelease, []byte(elt.content), 0600); err != nil { - t.Fatalf("failed to write to %s: %v", etcOsRelease, err) - } - s, err := GetOperatingSystem() - if err == nil || err.Error() != elt.errorExpected { - t.Fatalf("Expected an error %q, got %q (err: %v)", elt.errorExpected, s, err) - } - } - - for _, elt := range valids { - if err := ioutil.WriteFile(etcOsRelease, []byte(elt.content), 0600); err != nil { - t.Fatalf("failed to write to %s: %v", etcOsRelease, err) - } - s, err := GetOperatingSystem() - if err != nil || s != elt.expected { - t.Fatalf("Expected %q, got %q (err: %v)", elt.expected, s, err) - } - } -} - -func TestIsContainerized(t *testing.T) { - var ( - backup = proc1Cgroup - nonContainerizedProc1Cgroupsystemd226 = []byte(`9:memory:/init.scope -8:net_cls,net_prio:/ -7:cpuset:/ -6:freezer:/ -5:devices:/init.scope -4:blkio:/init.scope -3:cpu,cpuacct:/init.scope -2:perf_event:/ -1:name=systemd:/init.scope -`) - nonContainerizedProc1Cgroup = []byte(`14:name=systemd:/ -13:hugetlb:/ -12:net_prio:/ -11:perf_event:/ -10:bfqio:/ -9:blkio:/ -8:net_cls:/ -7:freezer:/ -6:devices:/ -5:memory:/ -4:cpuacct:/ -3:cpu:/ -2:cpuset:/ -`) - containerizedProc1Cgroup = []byte(`9:perf_event:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d -8:blkio:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d -7:net_cls:/ -6:freezer:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d -5:devices:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d -4:memory:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d -3:cpuacct:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d -2:cpu:/docker/3cef1b53c50b0fa357d994f8a1a8cd783c76bbf4f5dd08b226e38a8bd331338d -1:cpuset:/`) - ) - - dir := os.TempDir() - proc1Cgroup = filepath.Join(dir, "proc1Cgroup") - - defer func() { - os.Remove(proc1Cgroup) - proc1Cgroup = backup - }() - - if err := ioutil.WriteFile(proc1Cgroup, nonContainerizedProc1Cgroup, 0600); err != nil { - t.Fatalf("failed to write to %s: %v", proc1Cgroup, err) - } - inContainer, err := IsContainerized() - if err != nil { - t.Fatal(err) - } - if inContainer { - t.Fatal("Wrongly assuming containerized") - } - - if err := ioutil.WriteFile(proc1Cgroup, nonContainerizedProc1Cgroupsystemd226, 0600); err != nil { - t.Fatalf("failed to write to %s: %v", proc1Cgroup, err) - } - inContainer, err = IsContainerized() - if err != nil { - t.Fatal(err) - } - if inContainer { - t.Fatal("Wrongly assuming containerized for systemd /init.scope cgroup layout") - } - - if err := ioutil.WriteFile(proc1Cgroup, containerizedProc1Cgroup, 0600); err != nil { - t.Fatalf("failed to write to %s: %v", proc1Cgroup, err) - } - inContainer, err = IsContainerized() - if err != nil { - t.Fatal(err) - } - if !inContainer { - t.Fatal("Wrongly assuming non-containerized") - } -} - -func TestOsReleaseFallback(t *testing.T) { - var backup = etcOsRelease - var altBackup = altOsRelease - dir := os.TempDir() - etcOsRelease = filepath.Join(dir, "etcOsRelease") - altOsRelease = filepath.Join(dir, "altOsRelease") - - defer func() { - os.Remove(dir) - etcOsRelease = backup - altOsRelease = altBackup - }() - content := `NAME=Gentoo -ID=gentoo -PRETTY_NAME="Gentoo/Linux" -ANSI_COLOR="1;32" -HOME_URL="http://www.gentoo.org/" -SUPPORT_URL="http://www.gentoo.org/main/en/support.xml" -BUG_REPORT_URL="https://bugs.gentoo.org/" -` - if err := ioutil.WriteFile(altOsRelease, []byte(content), 0600); err != nil { - t.Fatalf("failed to write to %s: %v", etcOsRelease, err) - } - s, err := GetOperatingSystem() - if err != nil || s != "Gentoo/Linux" { - t.Fatalf("Expected %q, got %q (err: %v)", "Gentoo/Linux", s, err) - } -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go deleted file mode 100644 index 3c86b6af9..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go +++ /dev/null @@ -1,49 +0,0 @@ -package operatingsystem - -import ( - "syscall" - "unsafe" -) - -// See https://code.google.com/p/go/source/browse/src/pkg/mime/type_windows.go?r=d14520ac25bf6940785aabb71f5be453a286f58c -// for a similar sample - -// GetOperatingSystem gets the name of the current operating system. -func GetOperatingSystem() (string, error) { - - var h syscall.Handle - - // Default return value - ret := "Unknown Operating System" - - if err := syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE, - syscall.StringToUTF16Ptr(`SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\`), - 0, - syscall.KEY_READ, - &h); err != nil { - return ret, err - } - defer syscall.RegCloseKey(h) - - var buf [1 << 10]uint16 - var typ uint32 - n := uint32(len(buf) * 2) // api expects array of bytes, not uint16 - - if err := syscall.RegQueryValueEx(h, - syscall.StringToUTF16Ptr("ProductName"), - nil, - &typ, - (*byte)(unsafe.Pointer(&buf[0])), - &n); err != nil { - return ret, err - } - ret = syscall.UTF16ToString(buf[:]) - - return ret, nil -} - -// IsContainerized returns true if we are running inside a container. -// No-op on Windows, always returns false. -func IsContainerized() (bool, error) { - return false, nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/parsers.go b/vendor/github.com/docker/docker/pkg/parsers/parsers.go deleted file mode 100644 index acc897168..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/parsers.go +++ /dev/null @@ -1,69 +0,0 @@ -// Package parsers provides helper functions to parse and validate different type -// of string. It can be hosts, unix addresses, tcp addresses, filters, kernel -// operating system versions. -package parsers - -import ( - "fmt" - "strconv" - "strings" -) - -// ParseKeyValueOpt parses and validates the specified string as a key/value pair (key=value) -func ParseKeyValueOpt(opt string) (string, string, error) { - parts := strings.SplitN(opt, "=", 2) - if len(parts) != 2 { - return "", "", fmt.Errorf("Unable to parse key/value option: %s", opt) - } - return strings.TrimSpace(parts[0]), strings.TrimSpace(parts[1]), nil -} - -// ParseUintList parses and validates the specified string as the value -// found in some cgroup file (e.g. `cpuset.cpus`, `cpuset.mems`), which could be -// one of the formats below. Note that duplicates are actually allowed in the -// input string. It returns a `map[int]bool` with available elements from `val` -// set to `true`. -// Supported formats: -// 7 -// 1-6 -// 0,3-4,7,8-10 -// 0-0,0,1-7 -// 03,1-3 <- this is gonna get parsed as [1,2,3] -// 3,2,1 -// 0-2,3,1 -func ParseUintList(val string) (map[int]bool, error) { - if val == "" { - return map[int]bool{}, nil - } - - availableInts := make(map[int]bool) - split := strings.Split(val, ",") - errInvalidFormat := fmt.Errorf("invalid format: %s", val) - - for _, r := range split { - if !strings.Contains(r, "-") { - v, err := strconv.Atoi(r) - if err != nil { - return nil, errInvalidFormat - } - availableInts[v] = true - } else { - split := strings.SplitN(r, "-", 2) - min, err := strconv.Atoi(split[0]) - if err != nil { - return nil, errInvalidFormat - } - max, err := strconv.Atoi(split[1]) - if err != nil { - return nil, errInvalidFormat - } - if max < min { - return nil, errInvalidFormat - } - for i := min; i <= max; i++ { - availableInts[i] = true - } - } - } - return availableInts, nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/parsers_test.go b/vendor/github.com/docker/docker/pkg/parsers/parsers_test.go deleted file mode 100644 index 7f19e9027..000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/parsers_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package parsers - -import ( - "reflect" - "testing" -) - -func TestParseKeyValueOpt(t *testing.T) { - invalids := map[string]string{ - "": "Unable to parse key/value option: ", - "key": "Unable to parse key/value option: key", - } - for invalid, expectedError := range invalids { - if _, _, err := ParseKeyValueOpt(invalid); err == nil || err.Error() != expectedError { - t.Fatalf("Expected error %v for %v, got %v", expectedError, invalid, err) - } - } - valids := map[string][]string{ - "key=value": {"key", "value"}, - " key = value ": {"key", "value"}, - "key=value1=value2": {"key", "value1=value2"}, - " key = value1 = value2 ": {"key", "value1 = value2"}, - } - for valid, expectedKeyValue := range valids { - key, value, err := ParseKeyValueOpt(valid) - if err != nil { - t.Fatal(err) - } - if key != expectedKeyValue[0] || value != expectedKeyValue[1] { - t.Fatalf("Expected {%v: %v} got {%v: %v}", expectedKeyValue[0], expectedKeyValue[1], key, value) - } - } -} - -func TestParseUintList(t *testing.T) { - valids := map[string]map[int]bool{ - "": {}, - "7": {7: true}, - "1-6": {1: true, 2: true, 3: true, 4: true, 5: true, 6: true}, - "0-7": {0: true, 1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true}, - "0,3-4,7,8-10": {0: true, 3: true, 4: true, 7: true, 8: true, 9: true, 10: true}, - "0-0,0,1-4": {0: true, 1: true, 2: true, 3: true, 4: true}, - "03,1-3": {1: true, 2: true, 3: true}, - "3,2,1": {1: true, 2: true, 3: true}, - "0-2,3,1": {0: true, 1: true, 2: true, 3: true}, - } - for k, v := range valids { - out, err := ParseUintList(k) - if err != nil { - t.Fatalf("Expected not to fail, got %v", err) - } - if !reflect.DeepEqual(out, v) { - t.Fatalf("Expected %v, got %v", v, out) - } - } - - invalids := []string{ - "this", - "1--", - "1-10,,10", - "10-1", - "-1", - "-1,0", - } - for _, v := range invalids { - if out, err := ParseUintList(v); err == nil { - t.Fatalf("Expected failure with %s but got %v", v, out) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/pidfile/pidfile.go b/vendor/github.com/docker/docker/pkg/pidfile/pidfile.go deleted file mode 100644 index d832fea7a..000000000 --- a/vendor/github.com/docker/docker/pkg/pidfile/pidfile.go +++ /dev/null @@ -1,56 +0,0 @@ -// Package pidfile provides structure and helper functions to create and remove -// PID file. A PID file is usually a file used to store the process ID of a -// running process. -package pidfile - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strconv" - "strings" - - "github.com/docker/docker/pkg/system" -) - -// PIDFile is a file used to store the process ID of a running process. -type PIDFile struct { - path string -} - -func checkPIDFileAlreadyExists(path string) error { - if pidByte, err := ioutil.ReadFile(path); err == nil { - pidString := strings.TrimSpace(string(pidByte)) - if pid, err := strconv.Atoi(pidString); err == nil { - if processExists(pid) { - return fmt.Errorf("pid file found, ensure docker is not running or delete %s", path) - } - } - } - return nil -} - -// New creates a PIDfile using the specified path. -func New(path string) (*PIDFile, error) { - if err := checkPIDFileAlreadyExists(path); err != nil { - return nil, err - } - // Note MkdirAll returns nil if a directory already exists - if err := system.MkdirAll(filepath.Dir(path), os.FileMode(0755)); err != nil { - return nil, err - } - if err := ioutil.WriteFile(path, []byte(fmt.Sprintf("%d", os.Getpid())), 0644); err != nil { - return nil, err - } - - return &PIDFile{path: path}, nil -} - -// Remove removes the PIDFile. -func (file PIDFile) Remove() error { - if err := os.Remove(file.path); err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/pidfile/pidfile_darwin.go b/vendor/github.com/docker/docker/pkg/pidfile/pidfile_darwin.go deleted file mode 100644 index 5c1cd7ab8..000000000 --- a/vendor/github.com/docker/docker/pkg/pidfile/pidfile_darwin.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build darwin - -package pidfile - -import ( - "syscall" -) - -func processExists(pid int) bool { - // OS X does not have a proc filesystem. - // Use kill -0 pid to judge if the process exists. - err := syscall.Kill(pid, 0) - if err != nil { - return false - } - - return true -} diff --git a/vendor/github.com/docker/docker/pkg/pidfile/pidfile_test.go b/vendor/github.com/docker/docker/pkg/pidfile/pidfile_test.go deleted file mode 100644 index 73e8af76d..000000000 --- a/vendor/github.com/docker/docker/pkg/pidfile/pidfile_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package pidfile - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" -) - -func TestNewAndRemove(t *testing.T) { - dir, err := ioutil.TempDir(os.TempDir(), "test-pidfile") - if err != nil { - t.Fatal("Could not create test directory") - } - - path := filepath.Join(dir, "testfile") - file, err := New(path) - if err != nil { - t.Fatal("Could not create test file", err) - } - - _, err = New(path) - if err == nil { - t.Fatal("Test file creation not blocked") - } - - if err := file.Remove(); err != nil { - t.Fatal("Could not delete created test file") - } -} - -func TestRemoveInvalidPath(t *testing.T) { - file := PIDFile{path: filepath.Join("foo", "bar")} - - if err := file.Remove(); err == nil { - t.Fatal("Non-existing file doesn't give an error on delete") - } -} diff --git a/vendor/github.com/docker/docker/pkg/pidfile/pidfile_unix.go b/vendor/github.com/docker/docker/pkg/pidfile/pidfile_unix.go deleted file mode 100644 index 1bf5221e3..000000000 --- a/vendor/github.com/docker/docker/pkg/pidfile/pidfile_unix.go +++ /dev/null @@ -1,16 +0,0 @@ -// +build !windows,!darwin - -package pidfile - -import ( - "os" - "path/filepath" - "strconv" -) - -func processExists(pid int) bool { - if _, err := os.Stat(filepath.Join("/proc", strconv.Itoa(pid))); err == nil { - return true - } - return false -} diff --git a/vendor/github.com/docker/docker/pkg/pidfile/pidfile_windows.go b/vendor/github.com/docker/docker/pkg/pidfile/pidfile_windows.go deleted file mode 100644 index ae489c627..000000000 --- a/vendor/github.com/docker/docker/pkg/pidfile/pidfile_windows.go +++ /dev/null @@ -1,23 +0,0 @@ -package pidfile - -import "syscall" - -const ( - processQueryLimitedInformation = 0x1000 - - stillActive = 259 -) - -func processExists(pid int) bool { - h, err := syscall.OpenProcess(processQueryLimitedInformation, false, uint32(pid)) - if err != nil { - return false - } - var c uint32 - err = syscall.GetExitCodeProcess(h, &c) - syscall.Close(h) - if err != nil { - return c == stillActive - } - return true -} diff --git a/vendor/github.com/docker/docker/pkg/platform/architecture_linux.go b/vendor/github.com/docker/docker/pkg/platform/architecture_linux.go deleted file mode 100644 index 2cdc2c591..000000000 --- a/vendor/github.com/docker/docker/pkg/platform/architecture_linux.go +++ /dev/null @@ -1,16 +0,0 @@ -// Package platform provides helper function to get the runtime architecture -// for different platforms. -package platform - -import ( - "syscall" -) - -// runtimeArchitecture gets the name of the current architecture (x86, x86_64, …) -func runtimeArchitecture() (string, error) { - utsname := &syscall.Utsname{} - if err := syscall.Uname(utsname); err != nil { - return "", err - } - return charsToString(utsname.Machine), nil -} diff --git a/vendor/github.com/docker/docker/pkg/platform/architecture_unix.go b/vendor/github.com/docker/docker/pkg/platform/architecture_unix.go deleted file mode 100644 index 45bbcf153..000000000 --- a/vendor/github.com/docker/docker/pkg/platform/architecture_unix.go +++ /dev/null @@ -1,20 +0,0 @@ -// +build freebsd solaris darwin - -// Package platform provides helper function to get the runtime architecture -// for different platforms. -package platform - -import ( - "os/exec" - "strings" -) - -// runtimeArchitecture gets the name of the current architecture (x86, x86_64, i86pc, sun4v, ...) -func runtimeArchitecture() (string, error) { - cmd := exec.Command("/usr/bin/uname", "-m") - machine, err := cmd.Output() - if err != nil { - return "", err - } - return strings.TrimSpace(string(machine)), nil -} diff --git a/vendor/github.com/docker/docker/pkg/platform/architecture_windows.go b/vendor/github.com/docker/docker/pkg/platform/architecture_windows.go deleted file mode 100644 index c5f684ddf..000000000 --- a/vendor/github.com/docker/docker/pkg/platform/architecture_windows.go +++ /dev/null @@ -1,60 +0,0 @@ -package platform - -import ( - "fmt" - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - procGetSystemInfo = modkernel32.NewProc("GetSystemInfo") -) - -// see http://msdn.microsoft.com/en-us/library/windows/desktop/ms724958(v=vs.85).aspx -type systeminfo struct { - wProcessorArchitecture uint16 - wReserved uint16 - dwPageSize uint32 - lpMinimumApplicationAddress uintptr - lpMaximumApplicationAddress uintptr - dwActiveProcessorMask uintptr - dwNumberOfProcessors uint32 - dwProcessorType uint32 - dwAllocationGranularity uint32 - wProcessorLevel uint16 - wProcessorRevision uint16 -} - -// Constants -const ( - ProcessorArchitecture64 = 9 // PROCESSOR_ARCHITECTURE_AMD64 - ProcessorArchitectureIA64 = 6 // PROCESSOR_ARCHITECTURE_IA64 - ProcessorArchitecture32 = 0 // PROCESSOR_ARCHITECTURE_INTEL - ProcessorArchitectureArm = 5 // PROCESSOR_ARCHITECTURE_ARM -) - -// runtimeArchitecture gets the name of the current architecture (x86, x86_64, …) -func runtimeArchitecture() (string, error) { - var sysinfo systeminfo - syscall.Syscall(procGetSystemInfo.Addr(), 1, uintptr(unsafe.Pointer(&sysinfo)), 0, 0) - switch sysinfo.wProcessorArchitecture { - case ProcessorArchitecture64, ProcessorArchitectureIA64: - return "x86_64", nil - case ProcessorArchitecture32: - return "i686", nil - case ProcessorArchitectureArm: - return "arm", nil - default: - return "", fmt.Errorf("Unknown processor architecture") - } -} - -// NumProcs returns the number of processors on the system -func NumProcs() uint32 { - var sysinfo systeminfo - syscall.Syscall(procGetSystemInfo.Addr(), 1, uintptr(unsafe.Pointer(&sysinfo)), 0, 0) - return sysinfo.dwNumberOfProcessors -} diff --git a/vendor/github.com/docker/docker/pkg/platform/platform.go b/vendor/github.com/docker/docker/pkg/platform/platform.go deleted file mode 100644 index e4b03122f..000000000 --- a/vendor/github.com/docker/docker/pkg/platform/platform.go +++ /dev/null @@ -1,23 +0,0 @@ -package platform - -import ( - "runtime" - - "github.com/Sirupsen/logrus" -) - -var ( - // Architecture holds the runtime architecture of the process. - Architecture string - // OSType holds the runtime operating system type (Linux, …) of the process. - OSType string -) - -func init() { - var err error - Architecture, err = runtimeArchitecture() - if err != nil { - logrus.Errorf("Could not read system architecture info: %v", err) - } - OSType = runtime.GOOS -} diff --git a/vendor/github.com/docker/docker/pkg/platform/utsname_int8.go b/vendor/github.com/docker/docker/pkg/platform/utsname_int8.go deleted file mode 100644 index 5dcbadfdf..000000000 --- a/vendor/github.com/docker/docker/pkg/platform/utsname_int8.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build linux,386 linux,amd64 linux,arm64 -// see golang's sources src/syscall/ztypes_linux_*.go that use int8 - -package platform - -// Convert the OS/ARCH-specific utsname.Machine to string -// given as an array of signed int8 -func charsToString(ca [65]int8) string { - s := make([]byte, len(ca)) - var lens int - for ; lens < len(ca); lens++ { - if ca[lens] == 0 { - break - } - s[lens] = uint8(ca[lens]) - } - return string(s[0:lens]) -} diff --git a/vendor/github.com/docker/docker/pkg/platform/utsname_uint8.go b/vendor/github.com/docker/docker/pkg/platform/utsname_uint8.go deleted file mode 100644 index c9875cf6e..000000000 --- a/vendor/github.com/docker/docker/pkg/platform/utsname_uint8.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build linux,arm linux,ppc64 linux,ppc64le s390x -// see golang's sources src/syscall/ztypes_linux_*.go that use uint8 - -package platform - -// Convert the OS/ARCH-specific utsname.Machine to string -// given as an array of unsigned uint8 -func charsToString(ca [65]uint8) string { - s := make([]byte, len(ca)) - var lens int - for ; lens < len(ca); lens++ { - if ca[lens] == 0 { - break - } - s[lens] = ca[lens] - } - return string(s[0:lens]) -} diff --git a/vendor/github.com/docker/docker/pkg/plugingetter/getter.go b/vendor/github.com/docker/docker/pkg/plugingetter/getter.go deleted file mode 100644 index dde5f6603..000000000 --- a/vendor/github.com/docker/docker/pkg/plugingetter/getter.go +++ /dev/null @@ -1,35 +0,0 @@ -package plugingetter - -import "github.com/docker/docker/pkg/plugins" - -const ( - // LOOKUP doesn't update RefCount - LOOKUP = 0 - // ACQUIRE increments RefCount - ACQUIRE = 1 - // RELEASE decrements RefCount - RELEASE = -1 -) - -// CompatPlugin is a abstraction to handle both v2(new) and v1(legacy) plugins. -type CompatPlugin interface { - Client() *plugins.Client - Name() string - BasePath() string - IsV1() bool -} - -// CountedPlugin is a plugin which is reference counted. -type CountedPlugin interface { - Acquire() - Release() - CompatPlugin -} - -// PluginGetter is the interface implemented by Store -type PluginGetter interface { - Get(name, capability string, mode int) (CompatPlugin, error) - GetAllByCap(capability string) ([]CompatPlugin, error) - GetAllManagedPluginsByCap(capability string) []CompatPlugin - Handle(capability string, callback func(string, *plugins.Client)) -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/client.go b/vendor/github.com/docker/docker/pkg/plugins/client.go deleted file mode 100644 index e8e730eb5..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/client.go +++ /dev/null @@ -1,205 +0,0 @@ -package plugins - -import ( - "bytes" - "encoding/json" - "io" - "io/ioutil" - "net/http" - "net/url" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/plugins/transport" - "github.com/docker/go-connections/sockets" - "github.com/docker/go-connections/tlsconfig" -) - -const ( - defaultTimeOut = 30 -) - -func newTransport(addr string, tlsConfig *tlsconfig.Options) (transport.Transport, error) { - tr := &http.Transport{} - - if tlsConfig != nil { - c, err := tlsconfig.Client(*tlsConfig) - if err != nil { - return nil, err - } - tr.TLSClientConfig = c - } - - u, err := url.Parse(addr) - if err != nil { - return nil, err - } - socket := u.Host - if socket == "" { - // valid local socket addresses have the host empty. - socket = u.Path - } - if err := sockets.ConfigureTransport(tr, u.Scheme, socket); err != nil { - return nil, err - } - scheme := httpScheme(u) - - return transport.NewHTTPTransport(tr, scheme, socket), nil -} - -// NewClient creates a new plugin client (http). -func NewClient(addr string, tlsConfig *tlsconfig.Options) (*Client, error) { - clientTransport, err := newTransport(addr, tlsConfig) - if err != nil { - return nil, err - } - return newClientWithTransport(clientTransport, 0), nil -} - -// NewClientWithTimeout creates a new plugin client (http). -func NewClientWithTimeout(addr string, tlsConfig *tlsconfig.Options, timeoutInSecs int) (*Client, error) { - clientTransport, err := newTransport(addr, tlsConfig) - if err != nil { - return nil, err - } - return newClientWithTransport(clientTransport, timeoutInSecs), nil -} - -// newClientWithTransport creates a new plugin client with a given transport. -func newClientWithTransport(tr transport.Transport, timeoutInSecs int) *Client { - return &Client{ - http: &http.Client{ - Transport: tr, - Timeout: time.Duration(timeoutInSecs) * time.Second, - }, - requestFactory: tr, - } -} - -// Client represents a plugin client. -type Client struct { - http *http.Client // http client to use - requestFactory transport.RequestFactory -} - -// Call calls the specified method with the specified arguments for the plugin. -// It will retry for 30 seconds if a failure occurs when calling. -func (c *Client) Call(serviceMethod string, args interface{}, ret interface{}) error { - var buf bytes.Buffer - if args != nil { - if err := json.NewEncoder(&buf).Encode(args); err != nil { - return err - } - } - body, err := c.callWithRetry(serviceMethod, &buf, true) - if err != nil { - return err - } - defer body.Close() - if ret != nil { - if err := json.NewDecoder(body).Decode(&ret); err != nil { - logrus.Errorf("%s: error reading plugin resp: %v", serviceMethod, err) - return err - } - } - return nil -} - -// Stream calls the specified method with the specified arguments for the plugin and returns the response body -func (c *Client) Stream(serviceMethod string, args interface{}) (io.ReadCloser, error) { - var buf bytes.Buffer - if err := json.NewEncoder(&buf).Encode(args); err != nil { - return nil, err - } - return c.callWithRetry(serviceMethod, &buf, true) -} - -// SendFile calls the specified method, and passes through the IO stream -func (c *Client) SendFile(serviceMethod string, data io.Reader, ret interface{}) error { - body, err := c.callWithRetry(serviceMethod, data, true) - if err != nil { - return err - } - defer body.Close() - if err := json.NewDecoder(body).Decode(&ret); err != nil { - logrus.Errorf("%s: error reading plugin resp: %v", serviceMethod, err) - return err - } - return nil -} - -func (c *Client) callWithRetry(serviceMethod string, data io.Reader, retry bool) (io.ReadCloser, error) { - req, err := c.requestFactory.NewRequest(serviceMethod, data) - if err != nil { - return nil, err - } - - var retries int - start := time.Now() - - for { - resp, err := c.http.Do(req) - if err != nil { - if !retry { - return nil, err - } - - timeOff := backoff(retries) - if abort(start, timeOff) { - return nil, err - } - retries++ - logrus.Warnf("Unable to connect to plugin: %s%s: %v, retrying in %v", req.URL.Host, req.URL.Path, err, timeOff) - time.Sleep(timeOff) - continue - } - - if resp.StatusCode != http.StatusOK { - b, err := ioutil.ReadAll(resp.Body) - resp.Body.Close() - if err != nil { - return nil, &statusError{resp.StatusCode, serviceMethod, err.Error()} - } - - // Plugins' Response(s) should have an Err field indicating what went - // wrong. Try to unmarshal into ResponseErr. Otherwise fallback to just - // return the string(body) - type responseErr struct { - Err string - } - remoteErr := responseErr{} - if err := json.Unmarshal(b, &remoteErr); err == nil { - if remoteErr.Err != "" { - return nil, &statusError{resp.StatusCode, serviceMethod, remoteErr.Err} - } - } - // old way... - return nil, &statusError{resp.StatusCode, serviceMethod, string(b)} - } - return resp.Body, nil - } -} - -func backoff(retries int) time.Duration { - b, max := 1, defaultTimeOut - for b < max && retries > 0 { - b *= 2 - retries-- - } - if b > max { - b = max - } - return time.Duration(b) * time.Second -} - -func abort(start time.Time, timeOff time.Duration) bool { - return timeOff+time.Since(start) >= time.Duration(defaultTimeOut)*time.Second -} - -func httpScheme(u *url.URL) string { - scheme := u.Scheme - if scheme != "https" { - scheme = "http" - } - return scheme -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/client_test.go b/vendor/github.com/docker/docker/pkg/plugins/client_test.go deleted file mode 100644 index 9faad86a1..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/client_test.go +++ /dev/null @@ -1,134 +0,0 @@ -package plugins - -import ( - "io" - "net/http" - "net/http/httptest" - "net/url" - "reflect" - "testing" - "time" - - "github.com/docker/docker/pkg/plugins/transport" - "github.com/docker/go-connections/tlsconfig" -) - -var ( - mux *http.ServeMux - server *httptest.Server -) - -func setupRemotePluginServer() string { - mux = http.NewServeMux() - server = httptest.NewServer(mux) - return server.URL -} - -func teardownRemotePluginServer() { - if server != nil { - server.Close() - } -} - -func TestFailedConnection(t *testing.T) { - c, _ := NewClient("tcp://127.0.0.1:1", &tlsconfig.Options{InsecureSkipVerify: true}) - _, err := c.callWithRetry("Service.Method", nil, false) - if err == nil { - t.Fatal("Unexpected successful connection") - } -} - -func TestEchoInputOutput(t *testing.T) { - addr := setupRemotePluginServer() - defer teardownRemotePluginServer() - - m := Manifest{[]string{"VolumeDriver", "NetworkDriver"}} - - mux.HandleFunc("/Test.Echo", func(w http.ResponseWriter, r *http.Request) { - if r.Method != "POST" { - t.Fatalf("Expected POST, got %s\n", r.Method) - } - - header := w.Header() - header.Set("Content-Type", transport.VersionMimetype) - - io.Copy(w, r.Body) - }) - - c, _ := NewClient(addr, &tlsconfig.Options{InsecureSkipVerify: true}) - var output Manifest - err := c.Call("Test.Echo", m, &output) - if err != nil { - t.Fatal(err) - } - - if !reflect.DeepEqual(output, m) { - t.Fatalf("Expected %v, was %v\n", m, output) - } - err = c.Call("Test.Echo", nil, nil) - if err != nil { - t.Fatal(err) - } -} - -func TestBackoff(t *testing.T) { - cases := []struct { - retries int - expTimeOff time.Duration - }{ - {0, time.Duration(1)}, - {1, time.Duration(2)}, - {2, time.Duration(4)}, - {4, time.Duration(16)}, - {6, time.Duration(30)}, - {10, time.Duration(30)}, - } - - for _, c := range cases { - s := c.expTimeOff * time.Second - if d := backoff(c.retries); d != s { - t.Fatalf("Retry %v, expected %v, was %v\n", c.retries, s, d) - } - } -} - -func TestAbortRetry(t *testing.T) { - cases := []struct { - timeOff time.Duration - expAbort bool - }{ - {time.Duration(1), false}, - {time.Duration(2), false}, - {time.Duration(10), false}, - {time.Duration(30), true}, - {time.Duration(40), true}, - } - - for _, c := range cases { - s := c.timeOff * time.Second - if a := abort(time.Now(), s); a != c.expAbort { - t.Fatalf("Duration %v, expected %v, was %v\n", c.timeOff, s, a) - } - } -} - -func TestClientScheme(t *testing.T) { - cases := map[string]string{ - "tcp://127.0.0.1:8080": "http", - "unix:///usr/local/plugins/foo": "http", - "http://127.0.0.1:8080": "http", - "https://127.0.0.1:8080": "https", - } - - for addr, scheme := range cases { - u, err := url.Parse(addr) - if err != nil { - t.Fatal(err) - } - s := httpScheme(u) - - if s != scheme { - t.Fatalf("URL scheme mismatch, expected %s, got %s", scheme, s) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/discovery.go b/vendor/github.com/docker/docker/pkg/plugins/discovery.go deleted file mode 100644 index e99581c57..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/discovery.go +++ /dev/null @@ -1,131 +0,0 @@ -package plugins - -import ( - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "net/url" - "os" - "path/filepath" - "strings" - "sync" -) - -var ( - // ErrNotFound plugin not found - ErrNotFound = errors.New("plugin not found") - socketsPath = "/run/docker/plugins" -) - -// localRegistry defines a registry that is local (using unix socket). -type localRegistry struct{} - -func newLocalRegistry() localRegistry { - return localRegistry{} -} - -// Scan scans all the plugin paths and returns all the names it found -func Scan() ([]string, error) { - var names []string - if err := filepath.Walk(socketsPath, func(path string, fi os.FileInfo, err error) error { - if err != nil { - return nil - } - - if fi.Mode()&os.ModeSocket != 0 { - name := strings.TrimSuffix(fi.Name(), filepath.Ext(fi.Name())) - names = append(names, name) - } - return nil - }); err != nil { - return nil, err - } - - for _, path := range specsPaths { - if err := filepath.Walk(path, func(p string, fi os.FileInfo, err error) error { - if err != nil || fi.IsDir() { - return nil - } - name := strings.TrimSuffix(fi.Name(), filepath.Ext(fi.Name())) - names = append(names, name) - return nil - }); err != nil { - return nil, err - } - } - return names, nil -} - -// Plugin returns the plugin registered with the given name (or returns an error). -func (l *localRegistry) Plugin(name string) (*Plugin, error) { - socketpaths := pluginPaths(socketsPath, name, ".sock") - - for _, p := range socketpaths { - if fi, err := os.Stat(p); err == nil && fi.Mode()&os.ModeSocket != 0 { - return NewLocalPlugin(name, "unix://"+p), nil - } - } - - var txtspecpaths []string - for _, p := range specsPaths { - txtspecpaths = append(txtspecpaths, pluginPaths(p, name, ".spec")...) - txtspecpaths = append(txtspecpaths, pluginPaths(p, name, ".json")...) - } - - for _, p := range txtspecpaths { - if _, err := os.Stat(p); err == nil { - if strings.HasSuffix(p, ".json") { - return readPluginJSONInfo(name, p) - } - return readPluginInfo(name, p) - } - } - return nil, ErrNotFound -} - -func readPluginInfo(name, path string) (*Plugin, error) { - content, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - addr := strings.TrimSpace(string(content)) - - u, err := url.Parse(addr) - if err != nil { - return nil, err - } - - if len(u.Scheme) == 0 { - return nil, fmt.Errorf("Unknown protocol") - } - - return NewLocalPlugin(name, addr), nil -} - -func readPluginJSONInfo(name, path string) (*Plugin, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - defer f.Close() - - var p Plugin - if err := json.NewDecoder(f).Decode(&p); err != nil { - return nil, err - } - p.name = name - if p.TLSConfig != nil && len(p.TLSConfig.CAFile) == 0 { - p.TLSConfig.InsecureSkipVerify = true - } - p.activateWait = sync.NewCond(&sync.Mutex{}) - - return &p, nil -} - -func pluginPaths(base, name, ext string) []string { - return []string{ - filepath.Join(base, name+ext), - filepath.Join(base, name, name+ext), - } -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/discovery_test.go b/vendor/github.com/docker/docker/pkg/plugins/discovery_test.go deleted file mode 100644 index 03f9d0031..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/discovery_test.go +++ /dev/null @@ -1,152 +0,0 @@ -package plugins - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" -) - -func Setup(t *testing.T) (string, func()) { - tmpdir, err := ioutil.TempDir("", "docker-test") - if err != nil { - t.Fatal(err) - } - backup := socketsPath - socketsPath = tmpdir - specsPaths = []string{tmpdir} - - return tmpdir, func() { - socketsPath = backup - os.RemoveAll(tmpdir) - } -} - -func TestFileSpecPlugin(t *testing.T) { - tmpdir, unregister := Setup(t) - defer unregister() - - cases := []struct { - path string - name string - addr string - fail bool - }{ - // TODO Windows: Factor out the unix:// variants. - {filepath.Join(tmpdir, "echo.spec"), "echo", "unix://var/lib/docker/plugins/echo.sock", false}, - {filepath.Join(tmpdir, "echo", "echo.spec"), "echo", "unix://var/lib/docker/plugins/echo.sock", false}, - {filepath.Join(tmpdir, "foo.spec"), "foo", "tcp://localhost:8080", false}, - {filepath.Join(tmpdir, "foo", "foo.spec"), "foo", "tcp://localhost:8080", false}, - {filepath.Join(tmpdir, "bar.spec"), "bar", "localhost:8080", true}, // unknown transport - } - - for _, c := range cases { - if err := os.MkdirAll(filepath.Dir(c.path), 0755); err != nil { - t.Fatal(err) - } - if err := ioutil.WriteFile(c.path, []byte(c.addr), 0644); err != nil { - t.Fatal(err) - } - - r := newLocalRegistry() - p, err := r.Plugin(c.name) - if c.fail && err == nil { - continue - } - - if err != nil { - t.Fatal(err) - } - - if p.name != c.name { - t.Fatalf("Expected plugin `%s`, got %s\n", c.name, p.name) - } - - if p.Addr != c.addr { - t.Fatalf("Expected plugin addr `%s`, got %s\n", c.addr, p.Addr) - } - - if p.TLSConfig.InsecureSkipVerify != true { - t.Fatalf("Expected TLS verification to be skipped") - } - } -} - -func TestFileJSONSpecPlugin(t *testing.T) { - tmpdir, unregister := Setup(t) - defer unregister() - - p := filepath.Join(tmpdir, "example.json") - spec := `{ - "Name": "plugin-example", - "Addr": "https://example.com/docker/plugin", - "TLSConfig": { - "CAFile": "/usr/shared/docker/certs/example-ca.pem", - "CertFile": "/usr/shared/docker/certs/example-cert.pem", - "KeyFile": "/usr/shared/docker/certs/example-key.pem" - } -}` - - if err := ioutil.WriteFile(p, []byte(spec), 0644); err != nil { - t.Fatal(err) - } - - r := newLocalRegistry() - plugin, err := r.Plugin("example") - if err != nil { - t.Fatal(err) - } - - if expected, actual := "example", plugin.name; expected != actual { - t.Fatalf("Expected plugin %q, got %s\n", expected, actual) - } - - if plugin.Addr != "https://example.com/docker/plugin" { - t.Fatalf("Expected plugin addr `https://example.com/docker/plugin`, got %s\n", plugin.Addr) - } - - if plugin.TLSConfig.CAFile != "/usr/shared/docker/certs/example-ca.pem" { - t.Fatalf("Expected plugin CA `/usr/shared/docker/certs/example-ca.pem`, got %s\n", plugin.TLSConfig.CAFile) - } - - if plugin.TLSConfig.CertFile != "/usr/shared/docker/certs/example-cert.pem" { - t.Fatalf("Expected plugin Certificate `/usr/shared/docker/certs/example-cert.pem`, got %s\n", plugin.TLSConfig.CertFile) - } - - if plugin.TLSConfig.KeyFile != "/usr/shared/docker/certs/example-key.pem" { - t.Fatalf("Expected plugin Key `/usr/shared/docker/certs/example-key.pem`, got %s\n", plugin.TLSConfig.KeyFile) - } -} - -func TestFileJSONSpecPluginWithoutTLSConfig(t *testing.T) { - tmpdir, unregister := Setup(t) - defer unregister() - - p := filepath.Join(tmpdir, "example.json") - spec := `{ - "Name": "plugin-example", - "Addr": "https://example.com/docker/plugin" -}` - - if err := ioutil.WriteFile(p, []byte(spec), 0644); err != nil { - t.Fatal(err) - } - - r := newLocalRegistry() - plugin, err := r.Plugin("example") - if err != nil { - t.Fatal(err) - } - - if expected, actual := "example", plugin.name; expected != actual { - t.Fatalf("Expected plugin %q, got %s\n", expected, actual) - } - - if plugin.Addr != "https://example.com/docker/plugin" { - t.Fatalf("Expected plugin addr `https://example.com/docker/plugin`, got %s\n", plugin.Addr) - } - - if plugin.TLSConfig != nil { - t.Fatalf("Expected plugin TLSConfig nil, got %v\n", plugin.TLSConfig) - } -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/discovery_unix.go b/vendor/github.com/docker/docker/pkg/plugins/discovery_unix.go deleted file mode 100644 index 693a47e39..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/discovery_unix.go +++ /dev/null @@ -1,5 +0,0 @@ -// +build !windows - -package plugins - -var specsPaths = []string{"/etc/docker/plugins", "/usr/lib/docker/plugins"} diff --git a/vendor/github.com/docker/docker/pkg/plugins/discovery_unix_test.go b/vendor/github.com/docker/docker/pkg/plugins/discovery_unix_test.go deleted file mode 100644 index 3e2d506b9..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/discovery_unix_test.go +++ /dev/null @@ -1,61 +0,0 @@ -// +build !windows - -package plugins - -import ( - "fmt" - "net" - "os" - "path/filepath" - "reflect" - "testing" -) - -func TestLocalSocket(t *testing.T) { - // TODO Windows: Enable a similar version for Windows named pipes - tmpdir, unregister := Setup(t) - defer unregister() - - cases := []string{ - filepath.Join(tmpdir, "echo.sock"), - filepath.Join(tmpdir, "echo", "echo.sock"), - } - - for _, c := range cases { - if err := os.MkdirAll(filepath.Dir(c), 0755); err != nil { - t.Fatal(err) - } - - l, err := net.Listen("unix", c) - if err != nil { - t.Fatal(err) - } - - r := newLocalRegistry() - p, err := r.Plugin("echo") - if err != nil { - t.Fatal(err) - } - - pp, err := r.Plugin("echo") - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(p, pp) { - t.Fatalf("Expected %v, was %v\n", p, pp) - } - - if p.name != "echo" { - t.Fatalf("Expected plugin `echo`, got %s\n", p.name) - } - - addr := fmt.Sprintf("unix://%s", c) - if p.Addr != addr { - t.Fatalf("Expected plugin addr `%s`, got %s\n", addr, p.Addr) - } - if p.TLSConfig.InsecureSkipVerify != true { - t.Fatalf("Expected TLS verification to be skipped") - } - l.Close() - } -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/discovery_windows.go b/vendor/github.com/docker/docker/pkg/plugins/discovery_windows.go deleted file mode 100644 index d7c1fe494..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/discovery_windows.go +++ /dev/null @@ -1,8 +0,0 @@ -package plugins - -import ( - "os" - "path/filepath" -) - -var specsPaths = []string{filepath.Join(os.Getenv("programdata"), "docker", "plugins")} diff --git a/vendor/github.com/docker/docker/pkg/plugins/errors.go b/vendor/github.com/docker/docker/pkg/plugins/errors.go deleted file mode 100644 index 798847102..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/errors.go +++ /dev/null @@ -1,33 +0,0 @@ -package plugins - -import ( - "fmt" - "net/http" -) - -type statusError struct { - status int - method string - err string -} - -// Error returns a formatted string for this error type -func (e *statusError) Error() string { - return fmt.Sprintf("%s: %v", e.method, e.err) -} - -// IsNotFound indicates if the passed in error is from an http.StatusNotFound from the plugin -func IsNotFound(err error) bool { - return isStatusError(err, http.StatusNotFound) -} - -func isStatusError(err error, status int) bool { - if err == nil { - return false - } - e, ok := err.(*statusError) - if !ok { - return false - } - return e.status == status -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/plugin_test.go b/vendor/github.com/docker/docker/pkg/plugins/plugin_test.go deleted file mode 100644 index b19c0d52f..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/plugin_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package plugins - -import ( - "errors" - "path/filepath" - "runtime" - "sync" - "testing" - "time" -) - -// regression test for deadlock in handlers -func TestPluginAddHandler(t *testing.T) { - // make a plugin which is pre-activated - p := &Plugin{activateWait: sync.NewCond(&sync.Mutex{})} - p.Manifest = &Manifest{Implements: []string{"bananas"}} - storage.plugins["qwerty"] = p - - testActive(t, p) - Handle("bananas", func(_ string, _ *Client) {}) - testActive(t, p) -} - -func TestPluginWaitBadPlugin(t *testing.T) { - p := &Plugin{activateWait: sync.NewCond(&sync.Mutex{})} - p.activateErr = errors.New("some junk happened") - testActive(t, p) -} - -func testActive(t *testing.T, p *Plugin) { - done := make(chan struct{}) - go func() { - p.waitActive() - close(done) - }() - - select { - case <-time.After(100 * time.Millisecond): - _, f, l, _ := runtime.Caller(1) - t.Fatalf("%s:%d: deadlock in waitActive", filepath.Base(f), l) - case <-done: - } - -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/README.md b/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/README.md deleted file mode 100644 index 0418a3e00..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/README.md +++ /dev/null @@ -1,58 +0,0 @@ -Plugin RPC Generator -==================== - -Generates go code from a Go interface definition for proxying between the plugin -API and the subsystem being extended. - -## Usage - -Given an interface definition: - -```go -type volumeDriver interface { - Create(name string, opts opts) (err error) - Remove(name string) (err error) - Path(name string) (mountpoint string, err error) - Mount(name string) (mountpoint string, err error) - Unmount(name string) (err error) -} -``` - -**Note**: All function options and return values must be named in the definition. - -Run the generator: - -```bash -$ pluginrpc-gen --type volumeDriver --name VolumeDriver -i volumes/drivers/extpoint.go -o volumes/drivers/proxy.go -``` - -Where: -- `--type` is the name of the interface to use -- `--name` is the subsystem that the plugin "Implements" -- `-i` is the input file containing the interface definition -- `-o` is the output file where the the generated code should go - -**Note**: The generated code will use the same package name as the one defined in the input file - -Optionally, you can skip functions on the interface that should not be -implemented in the generated proxy code by passing in the function name to `--skip`. -This flag can be specified multiple times. - -You can also add build tags that should be prepended to the generated code by -supplying `--tag`. This flag can be specified multiple times. - -## Known issues - -## go-generate - -You can also use this with go-generate, which is pretty awesome. -To do so, place the code at the top of the file which contains the interface -definition (i.e., the input file): - -```go -//go:generate pluginrpc-gen -i $GOFILE -o proxy.go -type volumeDriver -name VolumeDriver -``` - -Then cd to the package dir and run `go generate` - -**Note**: the `pluginrpc-gen` binary must be within your `$PATH` diff --git a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/fixtures/foo.go b/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/fixtures/foo.go deleted file mode 100644 index 5695dcc2d..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/fixtures/foo.go +++ /dev/null @@ -1,89 +0,0 @@ -package foo - -import ( - "fmt" - - aliasedio "io" - - "github.com/docker/docker/pkg/plugins/pluginrpc-gen/fixtures/otherfixture" -) - -var ( - errFakeImport = fmt.Errorf("just to import fmt for imports tests") -) - -type wobble struct { - Some string - Val string - Inception *wobble -} - -// Fooer is an empty interface used for tests. -type Fooer interface{} - -// Fooer2 is an interface used for tests. -type Fooer2 interface { - Foo() -} - -// Fooer3 is an interface used for tests. -type Fooer3 interface { - Foo() - Bar(a string) - Baz(a string) (err error) - Qux(a, b string) (val string, err error) - Wobble() (w *wobble) - Wiggle() (w wobble) - WiggleWobble(a []*wobble, b []wobble, c map[string]*wobble, d map[*wobble]wobble, e map[string][]wobble, f []*otherfixture.Spaceship) (g map[*wobble]wobble, h [][]*wobble, i otherfixture.Spaceship, j *otherfixture.Spaceship, k map[*otherfixture.Spaceship]otherfixture.Spaceship, l []otherfixture.Spaceship) -} - -// Fooer4 is an interface used for tests. -type Fooer4 interface { - Foo() error -} - -// Bar is an interface used for tests. -type Bar interface { - Boo(a string, b string) (s string, err error) -} - -// Fooer5 is an interface used for tests. -type Fooer5 interface { - Foo() - Bar -} - -// Fooer6 is an interface used for tests. -type Fooer6 interface { - Foo(a otherfixture.Spaceship) -} - -// Fooer7 is an interface used for tests. -type Fooer7 interface { - Foo(a *otherfixture.Spaceship) -} - -// Fooer8 is an interface used for tests. -type Fooer8 interface { - Foo(a map[string]otherfixture.Spaceship) -} - -// Fooer9 is an interface used for tests. -type Fooer9 interface { - Foo(a map[string]*otherfixture.Spaceship) -} - -// Fooer10 is an interface used for tests. -type Fooer10 interface { - Foo(a []otherfixture.Spaceship) -} - -// Fooer11 is an interface used for tests. -type Fooer11 interface { - Foo(a []*otherfixture.Spaceship) -} - -// Fooer12 is an interface used for tests. -type Fooer12 interface { - Foo(a aliasedio.Reader) -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/fixtures/otherfixture/spaceship.go b/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/fixtures/otherfixture/spaceship.go deleted file mode 100644 index 1937d1786..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/fixtures/otherfixture/spaceship.go +++ /dev/null @@ -1,4 +0,0 @@ -package otherfixture - -// Spaceship is a fixture for tests -type Spaceship struct{} diff --git a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/main.go b/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/main.go deleted file mode 100644 index e77a7d45f..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/main.go +++ /dev/null @@ -1,91 +0,0 @@ -package main - -import ( - "bytes" - "flag" - "fmt" - "go/format" - "io/ioutil" - "os" - "unicode" - "unicode/utf8" -) - -type stringSet struct { - values map[string]struct{} -} - -func (s stringSet) String() string { - return "" -} - -func (s stringSet) Set(value string) error { - s.values[value] = struct{}{} - return nil -} -func (s stringSet) GetValues() map[string]struct{} { - return s.values -} - -var ( - typeName = flag.String("type", "", "interface type to generate plugin rpc proxy for") - rpcName = flag.String("name", *typeName, "RPC name, set if different from type") - inputFile = flag.String("i", "", "input file path") - outputFile = flag.String("o", *inputFile+"_proxy.go", "output file path") - - skipFuncs map[string]struct{} - flSkipFuncs = stringSet{make(map[string]struct{})} - - flBuildTags = stringSet{make(map[string]struct{})} -) - -func errorOut(msg string, err error) { - if err == nil { - return - } - fmt.Fprintf(os.Stderr, "%s: %v\n", msg, err) - os.Exit(1) -} - -func checkFlags() error { - if *outputFile == "" { - return fmt.Errorf("missing required flag `-o`") - } - if *inputFile == "" { - return fmt.Errorf("missing required flag `-i`") - } - return nil -} - -func main() { - flag.Var(flSkipFuncs, "skip", "skip parsing for function") - flag.Var(flBuildTags, "tag", "build tags to add to generated files") - flag.Parse() - skipFuncs = flSkipFuncs.GetValues() - - errorOut("error", checkFlags()) - - pkg, err := Parse(*inputFile, *typeName) - errorOut(fmt.Sprintf("error parsing requested type %s", *typeName), err) - - var analysis = struct { - InterfaceType string - RPCName string - BuildTags map[string]struct{} - *ParsedPkg - }{toLower(*typeName), *rpcName, flBuildTags.GetValues(), pkg} - var buf bytes.Buffer - - errorOut("parser error", generatedTempl.Execute(&buf, analysis)) - src, err := format.Source(buf.Bytes()) - errorOut("error formatting generated source:\n"+buf.String(), err) - errorOut("error writing file", ioutil.WriteFile(*outputFile, src, 0644)) -} - -func toLower(s string) string { - if s == "" { - return "" - } - r, n := utf8.DecodeRuneInString(s) - return string(unicode.ToLower(r)) + s[n:] -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/parser.go b/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/parser.go deleted file mode 100644 index 6c547e18c..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/parser.go +++ /dev/null @@ -1,263 +0,0 @@ -package main - -import ( - "errors" - "fmt" - "go/ast" - "go/parser" - "go/token" - "path" - "reflect" - "strings" -) - -var errBadReturn = errors.New("found return arg with no name: all args must be named") - -type errUnexpectedType struct { - expected string - actual interface{} -} - -func (e errUnexpectedType) Error() string { - return fmt.Sprintf("got wrong type expecting %s, got: %v", e.expected, reflect.TypeOf(e.actual)) -} - -// ParsedPkg holds information about a package that has been parsed, -// its name and the list of functions. -type ParsedPkg struct { - Name string - Functions []function - Imports []importSpec -} - -type function struct { - Name string - Args []arg - Returns []arg - Doc string -} - -type arg struct { - Name string - ArgType string - PackageSelector string -} - -func (a *arg) String() string { - return a.Name + " " + a.ArgType -} - -type importSpec struct { - Name string - Path string -} - -func (s *importSpec) String() string { - var ss string - if len(s.Name) != 0 { - ss += s.Name - } - ss += s.Path - return ss -} - -// Parse parses the given file for an interface definition with the given name. -func Parse(filePath string, objName string) (*ParsedPkg, error) { - fs := token.NewFileSet() - pkg, err := parser.ParseFile(fs, filePath, nil, parser.AllErrors) - if err != nil { - return nil, err - } - p := &ParsedPkg{} - p.Name = pkg.Name.Name - obj, exists := pkg.Scope.Objects[objName] - if !exists { - return nil, fmt.Errorf("could not find object %s in %s", objName, filePath) - } - if obj.Kind != ast.Typ { - return nil, fmt.Errorf("exected type, got %s", obj.Kind) - } - spec, ok := obj.Decl.(*ast.TypeSpec) - if !ok { - return nil, errUnexpectedType{"*ast.TypeSpec", obj.Decl} - } - iface, ok := spec.Type.(*ast.InterfaceType) - if !ok { - return nil, errUnexpectedType{"*ast.InterfaceType", spec.Type} - } - - p.Functions, err = parseInterface(iface) - if err != nil { - return nil, err - } - - // figure out what imports will be needed - imports := make(map[string]importSpec) - for _, f := range p.Functions { - args := append(f.Args, f.Returns...) - for _, arg := range args { - if len(arg.PackageSelector) == 0 { - continue - } - - for _, i := range pkg.Imports { - if i.Name != nil { - if i.Name.Name != arg.PackageSelector { - continue - } - imports[i.Path.Value] = importSpec{Name: arg.PackageSelector, Path: i.Path.Value} - break - } - - _, name := path.Split(i.Path.Value) - splitName := strings.Split(name, "-") - if len(splitName) > 1 { - name = splitName[len(splitName)-1] - } - // import paths have quotes already added in, so need to remove them for name comparison - name = strings.TrimPrefix(name, `"`) - name = strings.TrimSuffix(name, `"`) - if name == arg.PackageSelector { - imports[i.Path.Value] = importSpec{Path: i.Path.Value} - break - } - } - } - } - - for _, spec := range imports { - p.Imports = append(p.Imports, spec) - } - - return p, nil -} - -func parseInterface(iface *ast.InterfaceType) ([]function, error) { - var functions []function - for _, field := range iface.Methods.List { - switch f := field.Type.(type) { - case *ast.FuncType: - method, err := parseFunc(field) - if err != nil { - return nil, err - } - if method == nil { - continue - } - functions = append(functions, *method) - case *ast.Ident: - spec, ok := f.Obj.Decl.(*ast.TypeSpec) - if !ok { - return nil, errUnexpectedType{"*ast.TypeSpec", f.Obj.Decl} - } - iface, ok := spec.Type.(*ast.InterfaceType) - if !ok { - return nil, errUnexpectedType{"*ast.TypeSpec", spec.Type} - } - funcs, err := parseInterface(iface) - if err != nil { - fmt.Println(err) - continue - } - functions = append(functions, funcs...) - default: - return nil, errUnexpectedType{"*astFuncType or *ast.Ident", f} - } - } - return functions, nil -} - -func parseFunc(field *ast.Field) (*function, error) { - f := field.Type.(*ast.FuncType) - method := &function{Name: field.Names[0].Name} - if _, exists := skipFuncs[method.Name]; exists { - fmt.Println("skipping:", method.Name) - return nil, nil - } - if f.Params != nil { - args, err := parseArgs(f.Params.List) - if err != nil { - return nil, err - } - method.Args = args - } - if f.Results != nil { - returns, err := parseArgs(f.Results.List) - if err != nil { - return nil, fmt.Errorf("error parsing function returns for %q: %v", method.Name, err) - } - method.Returns = returns - } - return method, nil -} - -func parseArgs(fields []*ast.Field) ([]arg, error) { - var args []arg - for _, f := range fields { - if len(f.Names) == 0 { - return nil, errBadReturn - } - for _, name := range f.Names { - p, err := parseExpr(f.Type) - if err != nil { - return nil, err - } - args = append(args, arg{name.Name, p.value, p.pkg}) - } - } - return args, nil -} - -type parsedExpr struct { - value string - pkg string -} - -func parseExpr(e ast.Expr) (parsedExpr, error) { - var parsed parsedExpr - switch i := e.(type) { - case *ast.Ident: - parsed.value += i.Name - case *ast.StarExpr: - p, err := parseExpr(i.X) - if err != nil { - return parsed, err - } - parsed.value += "*" - parsed.value += p.value - parsed.pkg = p.pkg - case *ast.SelectorExpr: - p, err := parseExpr(i.X) - if err != nil { - return parsed, err - } - parsed.pkg = p.value - parsed.value += p.value + "." - parsed.value += i.Sel.Name - case *ast.MapType: - parsed.value += "map[" - p, err := parseExpr(i.Key) - if err != nil { - return parsed, err - } - parsed.value += p.value - parsed.value += "]" - p, err = parseExpr(i.Value) - if err != nil { - return parsed, err - } - parsed.value += p.value - parsed.pkg = p.pkg - case *ast.ArrayType: - parsed.value += "[]" - p, err := parseExpr(i.Elt) - if err != nil { - return parsed, err - } - parsed.value += p.value - parsed.pkg = p.pkg - default: - return parsed, errUnexpectedType{"*ast.Ident or *ast.StarExpr", i} - } - return parsed, nil -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/parser_test.go b/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/parser_test.go deleted file mode 100644 index a1b1ac956..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/parser_test.go +++ /dev/null @@ -1,222 +0,0 @@ -package main - -import ( - "fmt" - "path/filepath" - "runtime" - "strings" - "testing" -) - -const testFixture = "fixtures/foo.go" - -func TestParseEmptyInterface(t *testing.T) { - pkg, err := Parse(testFixture, "Fooer") - if err != nil { - t.Fatal(err) - } - - assertName(t, "foo", pkg.Name) - assertNum(t, 0, len(pkg.Functions)) -} - -func TestParseNonInterfaceType(t *testing.T) { - _, err := Parse(testFixture, "wobble") - if _, ok := err.(errUnexpectedType); !ok { - t.Fatal("expected type error when parsing non-interface type") - } -} - -func TestParseWithOneFunction(t *testing.T) { - pkg, err := Parse(testFixture, "Fooer2") - if err != nil { - t.Fatal(err) - } - - assertName(t, "foo", pkg.Name) - assertNum(t, 1, len(pkg.Functions)) - assertName(t, "Foo", pkg.Functions[0].Name) - assertNum(t, 0, len(pkg.Functions[0].Args)) - assertNum(t, 0, len(pkg.Functions[0].Returns)) -} - -func TestParseWithMultipleFuncs(t *testing.T) { - pkg, err := Parse(testFixture, "Fooer3") - if err != nil { - t.Fatal(err) - } - - assertName(t, "foo", pkg.Name) - assertNum(t, 7, len(pkg.Functions)) - - f := pkg.Functions[0] - assertName(t, "Foo", f.Name) - assertNum(t, 0, len(f.Args)) - assertNum(t, 0, len(f.Returns)) - - f = pkg.Functions[1] - assertName(t, "Bar", f.Name) - assertNum(t, 1, len(f.Args)) - assertNum(t, 0, len(f.Returns)) - arg := f.Args[0] - assertName(t, "a", arg.Name) - assertName(t, "string", arg.ArgType) - - f = pkg.Functions[2] - assertName(t, "Baz", f.Name) - assertNum(t, 1, len(f.Args)) - assertNum(t, 1, len(f.Returns)) - arg = f.Args[0] - assertName(t, "a", arg.Name) - assertName(t, "string", arg.ArgType) - arg = f.Returns[0] - assertName(t, "err", arg.Name) - assertName(t, "error", arg.ArgType) - - f = pkg.Functions[3] - assertName(t, "Qux", f.Name) - assertNum(t, 2, len(f.Args)) - assertNum(t, 2, len(f.Returns)) - arg = f.Args[0] - assertName(t, "a", f.Args[0].Name) - assertName(t, "string", f.Args[0].ArgType) - arg = f.Args[1] - assertName(t, "b", arg.Name) - assertName(t, "string", arg.ArgType) - arg = f.Returns[0] - assertName(t, "val", arg.Name) - assertName(t, "string", arg.ArgType) - arg = f.Returns[1] - assertName(t, "err", arg.Name) - assertName(t, "error", arg.ArgType) - - f = pkg.Functions[4] - assertName(t, "Wobble", f.Name) - assertNum(t, 0, len(f.Args)) - assertNum(t, 1, len(f.Returns)) - arg = f.Returns[0] - assertName(t, "w", arg.Name) - assertName(t, "*wobble", arg.ArgType) - - f = pkg.Functions[5] - assertName(t, "Wiggle", f.Name) - assertNum(t, 0, len(f.Args)) - assertNum(t, 1, len(f.Returns)) - arg = f.Returns[0] - assertName(t, "w", arg.Name) - assertName(t, "wobble", arg.ArgType) - - f = pkg.Functions[6] - assertName(t, "WiggleWobble", f.Name) - assertNum(t, 6, len(f.Args)) - assertNum(t, 6, len(f.Returns)) - expectedArgs := [][]string{ - {"a", "[]*wobble"}, - {"b", "[]wobble"}, - {"c", "map[string]*wobble"}, - {"d", "map[*wobble]wobble"}, - {"e", "map[string][]wobble"}, - {"f", "[]*otherfixture.Spaceship"}, - } - for i, arg := range f.Args { - assertName(t, expectedArgs[i][0], arg.Name) - assertName(t, expectedArgs[i][1], arg.ArgType) - } - expectedReturns := [][]string{ - {"g", "map[*wobble]wobble"}, - {"h", "[][]*wobble"}, - {"i", "otherfixture.Spaceship"}, - {"j", "*otherfixture.Spaceship"}, - {"k", "map[*otherfixture.Spaceship]otherfixture.Spaceship"}, - {"l", "[]otherfixture.Spaceship"}, - } - for i, ret := range f.Returns { - assertName(t, expectedReturns[i][0], ret.Name) - assertName(t, expectedReturns[i][1], ret.ArgType) - } -} - -func TestParseWithUnamedReturn(t *testing.T) { - _, err := Parse(testFixture, "Fooer4") - if !strings.HasSuffix(err.Error(), errBadReturn.Error()) { - t.Fatalf("expected ErrBadReturn, got %v", err) - } -} - -func TestEmbeddedInterface(t *testing.T) { - pkg, err := Parse(testFixture, "Fooer5") - if err != nil { - t.Fatal(err) - } - - assertName(t, "foo", pkg.Name) - assertNum(t, 2, len(pkg.Functions)) - - f := pkg.Functions[0] - assertName(t, "Foo", f.Name) - assertNum(t, 0, len(f.Args)) - assertNum(t, 0, len(f.Returns)) - - f = pkg.Functions[1] - assertName(t, "Boo", f.Name) - assertNum(t, 2, len(f.Args)) - assertNum(t, 2, len(f.Returns)) - - arg := f.Args[0] - assertName(t, "a", arg.Name) - assertName(t, "string", arg.ArgType) - - arg = f.Args[1] - assertName(t, "b", arg.Name) - assertName(t, "string", arg.ArgType) - - arg = f.Returns[0] - assertName(t, "s", arg.Name) - assertName(t, "string", arg.ArgType) - - arg = f.Returns[1] - assertName(t, "err", arg.Name) - assertName(t, "error", arg.ArgType) -} - -func TestParsedImports(t *testing.T) { - cases := []string{"Fooer6", "Fooer7", "Fooer8", "Fooer9", "Fooer10", "Fooer11"} - for _, testCase := range cases { - pkg, err := Parse(testFixture, testCase) - if err != nil { - t.Fatal(err) - } - - assertNum(t, 1, len(pkg.Imports)) - importPath := strings.Split(pkg.Imports[0].Path, "/") - assertName(t, "otherfixture\"", importPath[len(importPath)-1]) - assertName(t, "", pkg.Imports[0].Name) - } -} - -func TestAliasedImports(t *testing.T) { - pkg, err := Parse(testFixture, "Fooer12") - if err != nil { - t.Fatal(err) - } - - assertNum(t, 1, len(pkg.Imports)) - assertName(t, "aliasedio", pkg.Imports[0].Name) -} - -func assertName(t *testing.T, expected, actual string) { - if expected != actual { - fatalOut(t, fmt.Sprintf("expected name to be `%s`, got: %s", expected, actual)) - } -} - -func assertNum(t *testing.T, expected, actual int) { - if expected != actual { - fatalOut(t, fmt.Sprintf("expected number to be %d, got: %d", expected, actual)) - } -} - -func fatalOut(t *testing.T, msg string) { - _, file, ln, _ := runtime.Caller(2) - t.Fatalf("%s:%d: %s", filepath.Base(file), ln, msg) -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/template.go b/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/template.go deleted file mode 100644 index 50ed9293c..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/pluginrpc-gen/template.go +++ /dev/null @@ -1,118 +0,0 @@ -package main - -import ( - "strings" - "text/template" -) - -func printArgs(args []arg) string { - var argStr []string - for _, arg := range args { - argStr = append(argStr, arg.String()) - } - return strings.Join(argStr, ", ") -} - -func buildImports(specs []importSpec) string { - if len(specs) == 0 { - return `import "errors"` - } - imports := "import(\n" - imports += "\t\"errors\"\n" - for _, i := range specs { - imports += "\t" + i.String() + "\n" - } - imports += ")" - return imports -} - -func marshalType(t string) string { - switch t { - case "error": - // convert error types to plain strings to ensure the values are encoded/decoded properly - return "string" - default: - return t - } -} - -func isErr(t string) bool { - switch t { - case "error": - return true - default: - return false - } -} - -// Need to use this helper due to issues with go-vet -func buildTag(s string) string { - return "+build " + s -} - -var templFuncs = template.FuncMap{ - "printArgs": printArgs, - "marshalType": marshalType, - "isErr": isErr, - "lower": strings.ToLower, - "title": title, - "tag": buildTag, - "imports": buildImports, -} - -func title(s string) string { - if strings.ToLower(s) == "id" { - return "ID" - } - return strings.Title(s) -} - -var generatedTempl = template.Must(template.New("rpc_cient").Funcs(templFuncs).Parse(` -// generated code - DO NOT EDIT -{{ range $k, $v := .BuildTags }} - // {{ tag $k }} {{ end }} - -package {{ .Name }} - -{{ imports .Imports }} - -type client interface{ - Call(string, interface{}, interface{}) error -} - -type {{ .InterfaceType }}Proxy struct { - client -} - -{{ range .Functions }} - type {{ $.InterfaceType }}Proxy{{ .Name }}Request struct{ - {{ range .Args }} - {{ title .Name }} {{ .ArgType }} {{ end }} - } - - type {{ $.InterfaceType }}Proxy{{ .Name }}Response struct{ - {{ range .Returns }} - {{ title .Name }} {{ marshalType .ArgType }} {{ end }} - } - - func (pp *{{ $.InterfaceType }}Proxy) {{ .Name }}({{ printArgs .Args }}) ({{ printArgs .Returns }}) { - var( - req {{ $.InterfaceType }}Proxy{{ .Name }}Request - ret {{ $.InterfaceType }}Proxy{{ .Name }}Response - ) - {{ range .Args }} - req.{{ title .Name }} = {{ lower .Name }} {{ end }} - if err = pp.Call("{{ $.RPCName }}.{{ .Name }}", req, &ret); err != nil { - return - } - {{ range $r := .Returns }} - {{ if isErr .ArgType }} - if ret.{{ title .Name }} != "" { - {{ lower .Name }} = errors.New(ret.{{ title .Name }}) - } {{ end }} - {{ if isErr .ArgType | not }} {{ lower .Name }} = ret.{{ title .Name }} {{ end }} {{ end }} - - return - } -{{ end }} -`)) diff --git a/vendor/github.com/docker/docker/pkg/plugins/plugins.go b/vendor/github.com/docker/docker/pkg/plugins/plugins.go deleted file mode 100644 index c0059cba7..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/plugins.go +++ /dev/null @@ -1,329 +0,0 @@ -// Package plugins provides structures and helper functions to manage Docker -// plugins. -// -// Docker discovers plugins by looking for them in the plugin directory whenever -// a user or container tries to use one by name. UNIX domain socket files must -// be located under /run/docker/plugins, whereas spec files can be located -// either under /etc/docker/plugins or /usr/lib/docker/plugins. This is handled -// by the Registry interface, which lets you list all plugins or get a plugin by -// its name if it exists. -// -// The plugins need to implement an HTTP server and bind this to the UNIX socket -// or the address specified in the spec files. -// A handshake is send at /Plugin.Activate, and plugins are expected to return -// a Manifest with a list of of Docker subsystems which this plugin implements. -// -// In order to use a plugins, you can use the ``Get`` with the name of the -// plugin and the subsystem it implements. -// -// plugin, err := plugins.Get("example", "VolumeDriver") -// if err != nil { -// return fmt.Errorf("Error looking up volume plugin example: %v", err) -// } -package plugins - -import ( - "errors" - "sync" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/go-connections/tlsconfig" -) - -var ( - // ErrNotImplements is returned if the plugin does not implement the requested driver. - ErrNotImplements = errors.New("Plugin does not implement the requested driver") -) - -type plugins struct { - sync.Mutex - plugins map[string]*Plugin -} - -type extpointHandlers struct { - sync.RWMutex - extpointHandlers map[string][]func(string, *Client) -} - -var ( - storage = plugins{plugins: make(map[string]*Plugin)} - handlers = extpointHandlers{extpointHandlers: make(map[string][]func(string, *Client))} -) - -// Manifest lists what a plugin implements. -type Manifest struct { - // List of subsystem the plugin implements. - Implements []string -} - -// Plugin is the definition of a docker plugin. -type Plugin struct { - // Name of the plugin - name string - // Address of the plugin - Addr string - // TLS configuration of the plugin - TLSConfig *tlsconfig.Options - // Client attached to the plugin - client *Client - // Manifest of the plugin (see above) - Manifest *Manifest `json:"-"` - - // wait for activation to finish - activateWait *sync.Cond - // error produced by activation - activateErr error - // keeps track of callback handlers run against this plugin - handlersRun bool -} - -// Name returns the name of the plugin. -func (p *Plugin) Name() string { - return p.name -} - -// Client returns a ready-to-use plugin client that can be used to communicate with the plugin. -func (p *Plugin) Client() *Client { - return p.client -} - -// IsV1 returns true for V1 plugins and false otherwise. -func (p *Plugin) IsV1() bool { - return true -} - -// NewLocalPlugin creates a new local plugin. -func NewLocalPlugin(name, addr string) *Plugin { - return &Plugin{ - name: name, - Addr: addr, - // TODO: change to nil - TLSConfig: &tlsconfig.Options{InsecureSkipVerify: true}, - activateWait: sync.NewCond(&sync.Mutex{}), - } -} - -func (p *Plugin) activate() error { - p.activateWait.L.Lock() - - if p.activated() { - p.runHandlers() - p.activateWait.L.Unlock() - return p.activateErr - } - - p.activateErr = p.activateWithLock() - - p.runHandlers() - p.activateWait.L.Unlock() - p.activateWait.Broadcast() - return p.activateErr -} - -// runHandlers runs the registered handlers for the implemented plugin types -// This should only be run after activation, and while the activation lock is held. -func (p *Plugin) runHandlers() { - if !p.activated() { - return - } - - handlers.RLock() - if !p.handlersRun { - for _, iface := range p.Manifest.Implements { - hdlrs, handled := handlers.extpointHandlers[iface] - if !handled { - continue - } - for _, handler := range hdlrs { - handler(p.name, p.client) - } - } - p.handlersRun = true - } - handlers.RUnlock() - -} - -// activated returns if the plugin has already been activated. -// This should only be called with the activation lock held -func (p *Plugin) activated() bool { - return p.Manifest != nil -} - -func (p *Plugin) activateWithLock() error { - c, err := NewClient(p.Addr, p.TLSConfig) - if err != nil { - return err - } - p.client = c - - m := new(Manifest) - if err = p.client.Call("Plugin.Activate", nil, m); err != nil { - return err - } - - p.Manifest = m - return nil -} - -func (p *Plugin) waitActive() error { - p.activateWait.L.Lock() - for !p.activated() && p.activateErr == nil { - p.activateWait.Wait() - } - p.activateWait.L.Unlock() - return p.activateErr -} - -func (p *Plugin) implements(kind string) bool { - if p.Manifest == nil { - return false - } - for _, driver := range p.Manifest.Implements { - if driver == kind { - return true - } - } - return false -} - -func load(name string) (*Plugin, error) { - return loadWithRetry(name, true) -} - -func loadWithRetry(name string, retry bool) (*Plugin, error) { - registry := newLocalRegistry() - start := time.Now() - - var retries int - for { - pl, err := registry.Plugin(name) - if err != nil { - if !retry { - return nil, err - } - - timeOff := backoff(retries) - if abort(start, timeOff) { - return nil, err - } - retries++ - logrus.Warnf("Unable to locate plugin: %s, retrying in %v", name, timeOff) - time.Sleep(timeOff) - continue - } - - storage.Lock() - if pl, exists := storage.plugins[name]; exists { - storage.Unlock() - return pl, pl.activate() - } - storage.plugins[name] = pl - storage.Unlock() - - err = pl.activate() - - if err != nil { - storage.Lock() - delete(storage.plugins, name) - storage.Unlock() - } - - return pl, err - } -} - -func get(name string) (*Plugin, error) { - storage.Lock() - pl, ok := storage.plugins[name] - storage.Unlock() - if ok { - return pl, pl.activate() - } - return load(name) -} - -// Get returns the plugin given the specified name and requested implementation. -func Get(name, imp string) (*Plugin, error) { - pl, err := get(name) - if err != nil { - return nil, err - } - if err := pl.waitActive(); err == nil && pl.implements(imp) { - logrus.Debugf("%s implements: %s", name, imp) - return pl, nil - } - return nil, ErrNotImplements -} - -// Handle adds the specified function to the extpointHandlers. -func Handle(iface string, fn func(string, *Client)) { - handlers.Lock() - hdlrs, ok := handlers.extpointHandlers[iface] - if !ok { - hdlrs = []func(string, *Client){} - } - - hdlrs = append(hdlrs, fn) - handlers.extpointHandlers[iface] = hdlrs - - storage.Lock() - for _, p := range storage.plugins { - p.activateWait.L.Lock() - if p.activated() && p.implements(iface) { - p.handlersRun = false - } - p.activateWait.L.Unlock() - } - storage.Unlock() - - handlers.Unlock() -} - -// GetAll returns all the plugins for the specified implementation -func GetAll(imp string) ([]*Plugin, error) { - pluginNames, err := Scan() - if err != nil { - return nil, err - } - - type plLoad struct { - pl *Plugin - err error - } - - chPl := make(chan *plLoad, len(pluginNames)) - var wg sync.WaitGroup - for _, name := range pluginNames { - storage.Lock() - pl, ok := storage.plugins[name] - storage.Unlock() - if ok { - chPl <- &plLoad{pl, nil} - continue - } - - wg.Add(1) - go func(name string) { - defer wg.Done() - pl, err := loadWithRetry(name, false) - chPl <- &plLoad{pl, err} - }(name) - } - - wg.Wait() - close(chPl) - - var out []*Plugin - for pl := range chPl { - if pl.err != nil { - logrus.Error(pl.err) - continue - } - if err := pl.pl.waitActive(); err == nil && pl.pl.implements(imp) { - out = append(out, pl.pl) - } - } - return out, nil -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/plugins_linux.go b/vendor/github.com/docker/docker/pkg/plugins/plugins_linux.go deleted file mode 100644 index 9c5a0b563..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/plugins_linux.go +++ /dev/null @@ -1,7 +0,0 @@ -package plugins - -// BasePath returns the path to which all paths returned by the plugin are relative to. -// For v1 plugins, this always returns the host's root directory. -func (p *Plugin) BasePath() string { - return "/" -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/plugins_windows.go b/vendor/github.com/docker/docker/pkg/plugins/plugins_windows.go deleted file mode 100644 index 3c8d8feb8..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/plugins_windows.go +++ /dev/null @@ -1,8 +0,0 @@ -package plugins - -// BasePath returns the path to which all paths returned by the plugin are relative to. -// For Windows v1 plugins, this returns an empty string, since the plugin is already aware -// of the absolute path of the mount. -func (p *Plugin) BasePath() string { - return "" -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/transport/http.go b/vendor/github.com/docker/docker/pkg/plugins/transport/http.go deleted file mode 100644 index 5be146af6..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/transport/http.go +++ /dev/null @@ -1,36 +0,0 @@ -package transport - -import ( - "io" - "net/http" -) - -// httpTransport holds an http.RoundTripper -// and information about the scheme and address the transport -// sends request to. -type httpTransport struct { - http.RoundTripper - scheme string - addr string -} - -// NewHTTPTransport creates a new httpTransport. -func NewHTTPTransport(r http.RoundTripper, scheme, addr string) Transport { - return httpTransport{ - RoundTripper: r, - scheme: scheme, - addr: addr, - } -} - -// NewRequest creates a new http.Request and sets the URL -// scheme and address with the transport's fields. -func (t httpTransport) NewRequest(path string, data io.Reader) (*http.Request, error) { - req, err := newHTTPRequest(path, data) - if err != nil { - return nil, err - } - req.URL.Scheme = t.scheme - req.URL.Host = t.addr - return req, nil -} diff --git a/vendor/github.com/docker/docker/pkg/plugins/transport/transport.go b/vendor/github.com/docker/docker/pkg/plugins/transport/transport.go deleted file mode 100644 index d7f1e2100..000000000 --- a/vendor/github.com/docker/docker/pkg/plugins/transport/transport.go +++ /dev/null @@ -1,36 +0,0 @@ -package transport - -import ( - "io" - "net/http" - "strings" -) - -// VersionMimetype is the Content-Type the engine sends to plugins. -const VersionMimetype = "application/vnd.docker.plugins.v1.2+json" - -// RequestFactory defines an interface that -// transports can implement to create new requests. -type RequestFactory interface { - NewRequest(path string, data io.Reader) (*http.Request, error) -} - -// Transport defines an interface that plugin transports -// must implement. -type Transport interface { - http.RoundTripper - RequestFactory -} - -// newHTTPRequest creates a new request with a path and a body. -func newHTTPRequest(path string, data io.Reader) (*http.Request, error) { - if !strings.HasPrefix(path, "/") { - path = "/" + path - } - req, err := http.NewRequest("POST", path, data) - if err != nil { - return nil, err - } - req.Header.Add("Accept", VersionMimetype) - return req, nil -} diff --git a/vendor/github.com/docker/docker/pkg/pools/pools.go b/vendor/github.com/docker/docker/pkg/pools/pools.go deleted file mode 100644 index 5c5aead69..000000000 --- a/vendor/github.com/docker/docker/pkg/pools/pools.go +++ /dev/null @@ -1,116 +0,0 @@ -// Package pools provides a collection of pools which provide various -// data types with buffers. These can be used to lower the number of -// memory allocations and reuse buffers. -// -// New pools should be added to this package to allow them to be -// shared across packages. -// -// Utility functions which operate on pools should be added to this -// package to allow them to be reused. -package pools - -import ( - "bufio" - "io" - "sync" - - "github.com/docker/docker/pkg/ioutils" -) - -var ( - // BufioReader32KPool is a pool which returns bufio.Reader with a 32K buffer. - BufioReader32KPool = newBufioReaderPoolWithSize(buffer32K) - // BufioWriter32KPool is a pool which returns bufio.Writer with a 32K buffer. - BufioWriter32KPool = newBufioWriterPoolWithSize(buffer32K) -) - -const buffer32K = 32 * 1024 - -// BufioReaderPool is a bufio reader that uses sync.Pool. -type BufioReaderPool struct { - pool sync.Pool -} - -// newBufioReaderPoolWithSize is unexported because new pools should be -// added here to be shared where required. -func newBufioReaderPoolWithSize(size int) *BufioReaderPool { - return &BufioReaderPool{ - pool: sync.Pool{ - New: func() interface{} { return bufio.NewReaderSize(nil, size) }, - }, - } -} - -// Get returns a bufio.Reader which reads from r. The buffer size is that of the pool. -func (bufPool *BufioReaderPool) Get(r io.Reader) *bufio.Reader { - buf := bufPool.pool.Get().(*bufio.Reader) - buf.Reset(r) - return buf -} - -// Put puts the bufio.Reader back into the pool. -func (bufPool *BufioReaderPool) Put(b *bufio.Reader) { - b.Reset(nil) - bufPool.pool.Put(b) -} - -// Copy is a convenience wrapper which uses a buffer to avoid allocation in io.Copy. -func Copy(dst io.Writer, src io.Reader) (written int64, err error) { - buf := BufioReader32KPool.Get(src) - written, err = io.Copy(dst, buf) - BufioReader32KPool.Put(buf) - return -} - -// NewReadCloserWrapper returns a wrapper which puts the bufio.Reader back -// into the pool and closes the reader if it's an io.ReadCloser. -func (bufPool *BufioReaderPool) NewReadCloserWrapper(buf *bufio.Reader, r io.Reader) io.ReadCloser { - return ioutils.NewReadCloserWrapper(r, func() error { - if readCloser, ok := r.(io.ReadCloser); ok { - readCloser.Close() - } - bufPool.Put(buf) - return nil - }) -} - -// BufioWriterPool is a bufio writer that uses sync.Pool. -type BufioWriterPool struct { - pool sync.Pool -} - -// newBufioWriterPoolWithSize is unexported because new pools should be -// added here to be shared where required. -func newBufioWriterPoolWithSize(size int) *BufioWriterPool { - return &BufioWriterPool{ - pool: sync.Pool{ - New: func() interface{} { return bufio.NewWriterSize(nil, size) }, - }, - } -} - -// Get returns a bufio.Writer which writes to w. The buffer size is that of the pool. -func (bufPool *BufioWriterPool) Get(w io.Writer) *bufio.Writer { - buf := bufPool.pool.Get().(*bufio.Writer) - buf.Reset(w) - return buf -} - -// Put puts the bufio.Writer back into the pool. -func (bufPool *BufioWriterPool) Put(b *bufio.Writer) { - b.Reset(nil) - bufPool.pool.Put(b) -} - -// NewWriteCloserWrapper returns a wrapper which puts the bufio.Writer back -// into the pool and closes the writer if it's an io.Writecloser. -func (bufPool *BufioWriterPool) NewWriteCloserWrapper(buf *bufio.Writer, w io.Writer) io.WriteCloser { - return ioutils.NewWriteCloserWrapper(w, func() error { - buf.Flush() - if writeCloser, ok := w.(io.WriteCloser); ok { - writeCloser.Close() - } - bufPool.Put(buf) - return nil - }) -} diff --git a/vendor/github.com/docker/docker/pkg/pools/pools_test.go b/vendor/github.com/docker/docker/pkg/pools/pools_test.go deleted file mode 100644 index 1661b780c..000000000 --- a/vendor/github.com/docker/docker/pkg/pools/pools_test.go +++ /dev/null @@ -1,161 +0,0 @@ -package pools - -import ( - "bufio" - "bytes" - "io" - "strings" - "testing" -) - -func TestBufioReaderPoolGetWithNoReaderShouldCreateOne(t *testing.T) { - reader := BufioReader32KPool.Get(nil) - if reader == nil { - t.Fatalf("BufioReaderPool should have create a bufio.Reader but did not.") - } -} - -func TestBufioReaderPoolPutAndGet(t *testing.T) { - sr := bufio.NewReader(strings.NewReader("foobar")) - reader := BufioReader32KPool.Get(sr) - if reader == nil { - t.Fatalf("BufioReaderPool should not return a nil reader.") - } - // verify the first 3 byte - buf1 := make([]byte, 3) - _, err := reader.Read(buf1) - if err != nil { - t.Fatal(err) - } - if actual := string(buf1); actual != "foo" { - t.Fatalf("The first letter should have been 'foo' but was %v", actual) - } - BufioReader32KPool.Put(reader) - // Try to read the next 3 bytes - _, err = sr.Read(make([]byte, 3)) - if err == nil || err != io.EOF { - t.Fatalf("The buffer should have been empty, issue an EOF error.") - } -} - -type simpleReaderCloser struct { - io.Reader - closed bool -} - -func (r *simpleReaderCloser) Close() error { - r.closed = true - return nil -} - -func TestNewReadCloserWrapperWithAReadCloser(t *testing.T) { - br := bufio.NewReader(strings.NewReader("")) - sr := &simpleReaderCloser{ - Reader: strings.NewReader("foobar"), - closed: false, - } - reader := BufioReader32KPool.NewReadCloserWrapper(br, sr) - if reader == nil { - t.Fatalf("NewReadCloserWrapper should not return a nil reader.") - } - // Verify the content of reader - buf := make([]byte, 3) - _, err := reader.Read(buf) - if err != nil { - t.Fatal(err) - } - if actual := string(buf); actual != "foo" { - t.Fatalf("The first 3 letter should have been 'foo' but were %v", actual) - } - reader.Close() - // Read 3 more bytes "bar" - _, err = reader.Read(buf) - if err != nil { - t.Fatal(err) - } - if actual := string(buf); actual != "bar" { - t.Fatalf("The first 3 letter should have been 'bar' but were %v", actual) - } - if !sr.closed { - t.Fatalf("The ReaderCloser should have been closed, it is not.") - } -} - -func TestBufioWriterPoolGetWithNoReaderShouldCreateOne(t *testing.T) { - writer := BufioWriter32KPool.Get(nil) - if writer == nil { - t.Fatalf("BufioWriterPool should have create a bufio.Writer but did not.") - } -} - -func TestBufioWriterPoolPutAndGet(t *testing.T) { - buf := new(bytes.Buffer) - bw := bufio.NewWriter(buf) - writer := BufioWriter32KPool.Get(bw) - if writer == nil { - t.Fatalf("BufioReaderPool should not return a nil writer.") - } - written, err := writer.Write([]byte("foobar")) - if err != nil { - t.Fatal(err) - } - if written != 6 { - t.Fatalf("Should have written 6 bytes, but wrote %v bytes", written) - } - // Make sure we Flush all the way ? - writer.Flush() - bw.Flush() - if len(buf.Bytes()) != 6 { - t.Fatalf("The buffer should contain 6 bytes ('foobar') but contains %v ('%v')", buf.Bytes(), string(buf.Bytes())) - } - // Reset the buffer - buf.Reset() - BufioWriter32KPool.Put(writer) - // Try to write something - if _, err = writer.Write([]byte("barfoo")); err != nil { - t.Fatal(err) - } - // If we now try to flush it, it should panic (the writer is nil) - // recover it - defer func() { - if r := recover(); r == nil { - t.Fatal("Trying to flush the writter should have 'paniced', did not.") - } - }() - writer.Flush() -} - -type simpleWriterCloser struct { - io.Writer - closed bool -} - -func (r *simpleWriterCloser) Close() error { - r.closed = true - return nil -} - -func TestNewWriteCloserWrapperWithAWriteCloser(t *testing.T) { - buf := new(bytes.Buffer) - bw := bufio.NewWriter(buf) - sw := &simpleWriterCloser{ - Writer: new(bytes.Buffer), - closed: false, - } - bw.Flush() - writer := BufioWriter32KPool.NewWriteCloserWrapper(bw, sw) - if writer == nil { - t.Fatalf("BufioReaderPool should not return a nil writer.") - } - written, err := writer.Write([]byte("foobar")) - if err != nil { - t.Fatal(err) - } - if written != 6 { - t.Fatalf("Should have written 6 bytes, but wrote %v bytes", written) - } - writer.Close() - if !sw.closed { - t.Fatalf("The ReaderCloser should have been closed, it is not.") - } -} diff --git a/vendor/github.com/docker/docker/pkg/progress/progress.go b/vendor/github.com/docker/docker/pkg/progress/progress.go deleted file mode 100644 index fcf31173c..000000000 --- a/vendor/github.com/docker/docker/pkg/progress/progress.go +++ /dev/null @@ -1,84 +0,0 @@ -package progress - -import ( - "fmt" -) - -// Progress represents the progress of a transfer. -type Progress struct { - ID string - - // Progress contains a Message or... - Message string - - // ...progress of an action - Action string - Current int64 - Total int64 - - // Aux contains extra information not presented to the user, such as - // digests for push signing. - Aux interface{} - - LastUpdate bool -} - -// Output is an interface for writing progress information. It's -// like a writer for progress, but we don't call it Writer because -// that would be confusing next to ProgressReader (also, because it -// doesn't implement the io.Writer interface). -type Output interface { - WriteProgress(Progress) error -} - -type chanOutput chan<- Progress - -func (out chanOutput) WriteProgress(p Progress) error { - out <- p - return nil -} - -// ChanOutput returns an Output that writes progress updates to the -// supplied channel. -func ChanOutput(progressChan chan<- Progress) Output { - return chanOutput(progressChan) -} - -type discardOutput struct{} - -func (discardOutput) WriteProgress(Progress) error { - return nil -} - -// DiscardOutput returns an Output that discards progress -func DiscardOutput() Output { - return discardOutput{} -} - -// Update is a convenience function to write a progress update to the channel. -func Update(out Output, id, action string) { - out.WriteProgress(Progress{ID: id, Action: action}) -} - -// Updatef is a convenience function to write a printf-formatted progress update -// to the channel. -func Updatef(out Output, id, format string, a ...interface{}) { - Update(out, id, fmt.Sprintf(format, a...)) -} - -// Message is a convenience function to write a progress message to the channel. -func Message(out Output, id, message string) { - out.WriteProgress(Progress{ID: id, Message: message}) -} - -// Messagef is a convenience function to write a printf-formatted progress -// message to the channel. -func Messagef(out Output, id, format string, a ...interface{}) { - Message(out, id, fmt.Sprintf(format, a...)) -} - -// Aux sends auxiliary information over a progress interface, which will not be -// formatted for the UI. This is used for things such as push signing. -func Aux(out Output, a interface{}) { - out.WriteProgress(Progress{Aux: a}) -} diff --git a/vendor/github.com/docker/docker/pkg/progress/progressreader.go b/vendor/github.com/docker/docker/pkg/progress/progressreader.go deleted file mode 100644 index 6b3927eec..000000000 --- a/vendor/github.com/docker/docker/pkg/progress/progressreader.go +++ /dev/null @@ -1,66 +0,0 @@ -package progress - -import ( - "io" - "time" - - "golang.org/x/time/rate" -) - -// Reader is a Reader with progress bar. -type Reader struct { - in io.ReadCloser // Stream to read from - out Output // Where to send progress bar to - size int64 - current int64 - lastUpdate int64 - id string - action string - rateLimiter *rate.Limiter -} - -// NewProgressReader creates a new ProgressReader. -func NewProgressReader(in io.ReadCloser, out Output, size int64, id, action string) *Reader { - return &Reader{ - in: in, - out: out, - size: size, - id: id, - action: action, - rateLimiter: rate.NewLimiter(rate.Every(100*time.Millisecond), 1), - } -} - -func (p *Reader) Read(buf []byte) (n int, err error) { - read, err := p.in.Read(buf) - p.current += int64(read) - updateEvery := int64(1024 * 512) //512kB - if p.size > 0 { - // Update progress for every 1% read if 1% < 512kB - if increment := int64(0.01 * float64(p.size)); increment < updateEvery { - updateEvery = increment - } - } - if p.current-p.lastUpdate > updateEvery || err != nil { - p.updateProgress(err != nil && read == 0) - p.lastUpdate = p.current - } - - return read, err -} - -// Close closes the progress reader and its underlying reader. -func (p *Reader) Close() error { - if p.current < p.size { - // print a full progress bar when closing prematurely - p.current = p.size - p.updateProgress(false) - } - return p.in.Close() -} - -func (p *Reader) updateProgress(last bool) { - if last || p.current == p.size || p.rateLimiter.Allow() { - p.out.WriteProgress(Progress{ID: p.id, Action: p.action, Current: p.current, Total: p.size, LastUpdate: last}) - } -} diff --git a/vendor/github.com/docker/docker/pkg/progress/progressreader_test.go b/vendor/github.com/docker/docker/pkg/progress/progressreader_test.go deleted file mode 100644 index b14d40156..000000000 --- a/vendor/github.com/docker/docker/pkg/progress/progressreader_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package progress - -import ( - "bytes" - "io" - "io/ioutil" - "testing" -) - -func TestOutputOnPrematureClose(t *testing.T) { - content := []byte("TESTING") - reader := ioutil.NopCloser(bytes.NewReader(content)) - progressChan := make(chan Progress, 10) - - pr := NewProgressReader(reader, ChanOutput(progressChan), int64(len(content)), "Test", "Read") - - part := make([]byte, 4, 4) - _, err := io.ReadFull(pr, part) - if err != nil { - pr.Close() - t.Fatal(err) - } - -drainLoop: - for { - select { - case <-progressChan: - default: - break drainLoop - } - } - - pr.Close() - - select { - case <-progressChan: - default: - t.Fatalf("Expected some output when closing prematurely") - } -} - -func TestCompleteSilently(t *testing.T) { - content := []byte("TESTING") - reader := ioutil.NopCloser(bytes.NewReader(content)) - progressChan := make(chan Progress, 10) - - pr := NewProgressReader(reader, ChanOutput(progressChan), int64(len(content)), "Test", "Read") - - out, err := ioutil.ReadAll(pr) - if err != nil { - pr.Close() - t.Fatal(err) - } - if string(out) != "TESTING" { - pr.Close() - t.Fatalf("Unexpected output %q from reader", string(out)) - } - -drainLoop: - for { - select { - case <-progressChan: - default: - break drainLoop - } - } - - pr.Close() - - select { - case <-progressChan: - t.Fatalf("Should have closed silently when read is complete") - default: - } -} diff --git a/vendor/github.com/docker/docker/pkg/promise/promise.go b/vendor/github.com/docker/docker/pkg/promise/promise.go deleted file mode 100644 index dd52b9082..000000000 --- a/vendor/github.com/docker/docker/pkg/promise/promise.go +++ /dev/null @@ -1,11 +0,0 @@ -package promise - -// Go is a basic promise implementation: it wraps calls a function in a goroutine, -// and returns a channel which will later return the function's return value. -func Go(f func() error) chan error { - ch := make(chan error, 1) - go func() { - ch <- f() - }() - return ch -} diff --git a/vendor/github.com/docker/docker/pkg/pubsub/publisher.go b/vendor/github.com/docker/docker/pkg/pubsub/publisher.go deleted file mode 100644 index 09364617e..000000000 --- a/vendor/github.com/docker/docker/pkg/pubsub/publisher.go +++ /dev/null @@ -1,111 +0,0 @@ -package pubsub - -import ( - "sync" - "time" -) - -var wgPool = sync.Pool{New: func() interface{} { return new(sync.WaitGroup) }} - -// NewPublisher creates a new pub/sub publisher to broadcast messages. -// The duration is used as the send timeout as to not block the publisher publishing -// messages to other clients if one client is slow or unresponsive. -// The buffer is used when creating new channels for subscribers. -func NewPublisher(publishTimeout time.Duration, buffer int) *Publisher { - return &Publisher{ - buffer: buffer, - timeout: publishTimeout, - subscribers: make(map[subscriber]topicFunc), - } -} - -type subscriber chan interface{} -type topicFunc func(v interface{}) bool - -// Publisher is basic pub/sub structure. Allows to send events and subscribe -// to them. Can be safely used from multiple goroutines. -type Publisher struct { - m sync.RWMutex - buffer int - timeout time.Duration - subscribers map[subscriber]topicFunc -} - -// Len returns the number of subscribers for the publisher -func (p *Publisher) Len() int { - p.m.RLock() - i := len(p.subscribers) - p.m.RUnlock() - return i -} - -// Subscribe adds a new subscriber to the publisher returning the channel. -func (p *Publisher) Subscribe() chan interface{} { - return p.SubscribeTopic(nil) -} - -// SubscribeTopic adds a new subscriber that filters messages sent by a topic. -func (p *Publisher) SubscribeTopic(topic topicFunc) chan interface{} { - ch := make(chan interface{}, p.buffer) - p.m.Lock() - p.subscribers[ch] = topic - p.m.Unlock() - return ch -} - -// Evict removes the specified subscriber from receiving any more messages. -func (p *Publisher) Evict(sub chan interface{}) { - p.m.Lock() - delete(p.subscribers, sub) - close(sub) - p.m.Unlock() -} - -// Publish sends the data in v to all subscribers currently registered with the publisher. -func (p *Publisher) Publish(v interface{}) { - p.m.RLock() - if len(p.subscribers) == 0 { - p.m.RUnlock() - return - } - - wg := wgPool.Get().(*sync.WaitGroup) - for sub, topic := range p.subscribers { - wg.Add(1) - go p.sendTopic(sub, topic, v, wg) - } - wg.Wait() - wgPool.Put(wg) - p.m.RUnlock() -} - -// Close closes the channels to all subscribers registered with the publisher. -func (p *Publisher) Close() { - p.m.Lock() - for sub := range p.subscribers { - delete(p.subscribers, sub) - close(sub) - } - p.m.Unlock() -} - -func (p *Publisher) sendTopic(sub subscriber, topic topicFunc, v interface{}, wg *sync.WaitGroup) { - defer wg.Done() - if topic != nil && !topic(v) { - return - } - - // send under a select as to not block if the receiver is unavailable - if p.timeout > 0 { - select { - case sub <- v: - case <-time.After(p.timeout): - } - return - } - - select { - case sub <- v: - default: - } -} diff --git a/vendor/github.com/docker/docker/pkg/pubsub/publisher_test.go b/vendor/github.com/docker/docker/pkg/pubsub/publisher_test.go deleted file mode 100644 index d6b0a1d59..000000000 --- a/vendor/github.com/docker/docker/pkg/pubsub/publisher_test.go +++ /dev/null @@ -1,142 +0,0 @@ -package pubsub - -import ( - "fmt" - "testing" - "time" -) - -func TestSendToOneSub(t *testing.T) { - p := NewPublisher(100*time.Millisecond, 10) - c := p.Subscribe() - - p.Publish("hi") - - msg := <-c - if msg.(string) != "hi" { - t.Fatalf("expected message hi but received %v", msg) - } -} - -func TestSendToMultipleSubs(t *testing.T) { - p := NewPublisher(100*time.Millisecond, 10) - subs := []chan interface{}{} - subs = append(subs, p.Subscribe(), p.Subscribe(), p.Subscribe()) - - p.Publish("hi") - - for _, c := range subs { - msg := <-c - if msg.(string) != "hi" { - t.Fatalf("expected message hi but received %v", msg) - } - } -} - -func TestEvictOneSub(t *testing.T) { - p := NewPublisher(100*time.Millisecond, 10) - s1 := p.Subscribe() - s2 := p.Subscribe() - - p.Evict(s1) - p.Publish("hi") - if _, ok := <-s1; ok { - t.Fatal("expected s1 to not receive the published message") - } - - msg := <-s2 - if msg.(string) != "hi" { - t.Fatalf("expected message hi but received %v", msg) - } -} - -func TestClosePublisher(t *testing.T) { - p := NewPublisher(100*time.Millisecond, 10) - subs := []chan interface{}{} - subs = append(subs, p.Subscribe(), p.Subscribe(), p.Subscribe()) - p.Close() - - for _, c := range subs { - if _, ok := <-c; ok { - t.Fatal("expected all subscriber channels to be closed") - } - } -} - -const sampleText = "test" - -type testSubscriber struct { - dataCh chan interface{} - ch chan error -} - -func (s *testSubscriber) Wait() error { - return <-s.ch -} - -func newTestSubscriber(p *Publisher) *testSubscriber { - ts := &testSubscriber{ - dataCh: p.Subscribe(), - ch: make(chan error), - } - go func() { - for data := range ts.dataCh { - s, ok := data.(string) - if !ok { - ts.ch <- fmt.Errorf("Unexpected type %T", data) - break - } - if s != sampleText { - ts.ch <- fmt.Errorf("Unexpected text %s", s) - break - } - } - close(ts.ch) - }() - return ts -} - -// for testing with -race -func TestPubSubRace(t *testing.T) { - p := NewPublisher(0, 1024) - var subs [](*testSubscriber) - for j := 0; j < 50; j++ { - subs = append(subs, newTestSubscriber(p)) - } - for j := 0; j < 1000; j++ { - p.Publish(sampleText) - } - time.AfterFunc(1*time.Second, func() { - for _, s := range subs { - p.Evict(s.dataCh) - } - }) - for _, s := range subs { - s.Wait() - } -} - -func BenchmarkPubSub(b *testing.B) { - for i := 0; i < b.N; i++ { - b.StopTimer() - p := NewPublisher(0, 1024) - var subs [](*testSubscriber) - for j := 0; j < 50; j++ { - subs = append(subs, newTestSubscriber(p)) - } - b.StartTimer() - for j := 0; j < 1000; j++ { - p.Publish(sampleText) - } - time.AfterFunc(1*time.Second, func() { - for _, s := range subs { - p.Evict(s.dataCh) - } - }) - for _, s := range subs { - if err := s.Wait(); err != nil { - b.Fatal(err) - } - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/random/random.go b/vendor/github.com/docker/docker/pkg/random/random.go deleted file mode 100644 index 70de4d130..000000000 --- a/vendor/github.com/docker/docker/pkg/random/random.go +++ /dev/null @@ -1,71 +0,0 @@ -package random - -import ( - cryptorand "crypto/rand" - "io" - "math" - "math/big" - "math/rand" - "sync" - "time" -) - -// Rand is a global *rand.Rand instance, which initialized with NewSource() source. -var Rand = rand.New(NewSource()) - -// Reader is a global, shared instance of a pseudorandom bytes generator. -// It doesn't consume entropy. -var Reader io.Reader = &reader{rnd: Rand} - -// copypaste from standard math/rand -type lockedSource struct { - lk sync.Mutex - src rand.Source -} - -func (r *lockedSource) Int63() (n int64) { - r.lk.Lock() - n = r.src.Int63() - r.lk.Unlock() - return -} - -func (r *lockedSource) Seed(seed int64) { - r.lk.Lock() - r.src.Seed(seed) - r.lk.Unlock() -} - -// NewSource returns math/rand.Source safe for concurrent use and initialized -// with current unix-nano timestamp -func NewSource() rand.Source { - var seed int64 - if cryptoseed, err := cryptorand.Int(cryptorand.Reader, big.NewInt(math.MaxInt64)); err != nil { - // This should not happen, but worst-case fallback to time-based seed. - seed = time.Now().UnixNano() - } else { - seed = cryptoseed.Int64() - } - return &lockedSource{ - src: rand.NewSource(seed), - } -} - -type reader struct { - rnd *rand.Rand -} - -func (r *reader) Read(b []byte) (int, error) { - i := 0 - for { - val := r.rnd.Int63() - for val > 0 { - b[i] = byte(val) - i++ - if i == len(b) { - return i, nil - } - val >>= 8 - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/random/random_test.go b/vendor/github.com/docker/docker/pkg/random/random_test.go deleted file mode 100644 index cf405f78c..000000000 --- a/vendor/github.com/docker/docker/pkg/random/random_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package random - -import ( - "math/rand" - "sync" - "testing" -) - -// for go test -v -race -func TestConcurrency(t *testing.T) { - rnd := rand.New(NewSource()) - var wg sync.WaitGroup - - for i := 0; i < 10; i++ { - wg.Add(1) - go func() { - rnd.Int63() - wg.Done() - }() - } - wg.Wait() -} diff --git a/vendor/github.com/docker/docker/pkg/reexec/README.md b/vendor/github.com/docker/docker/pkg/reexec/README.md deleted file mode 100644 index 45592ce85..000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/README.md +++ /dev/null @@ -1,5 +0,0 @@ -## reexec - -The `reexec` package facilitates the busybox style reexec of the docker binary that we require because -of the forking limitations of using Go. Handlers can be registered with a name and the argv 0 of -the exec of the binary will be used to find and execute custom init paths. diff --git a/vendor/github.com/docker/docker/pkg/reexec/command_linux.go b/vendor/github.com/docker/docker/pkg/reexec/command_linux.go deleted file mode 100644 index 34ae2a9dc..000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/command_linux.go +++ /dev/null @@ -1,28 +0,0 @@ -// +build linux - -package reexec - -import ( - "os/exec" - "syscall" -) - -// Self returns the path to the current process's binary. -// Returns "/proc/self/exe". -func Self() string { - return "/proc/self/exe" -} - -// Command returns *exec.Cmd which has Path as current binary. Also it setting -// SysProcAttr.Pdeathsig to SIGTERM. -// This will use the in-memory version (/proc/self/exe) of the current binary, -// it is thus safe to delete or replace the on-disk binary (os.Args[0]). -func Command(args ...string) *exec.Cmd { - return &exec.Cmd{ - Path: Self(), - Args: args, - SysProcAttr: &syscall.SysProcAttr{ - Pdeathsig: syscall.SIGTERM, - }, - } -} diff --git a/vendor/github.com/docker/docker/pkg/reexec/command_unix.go b/vendor/github.com/docker/docker/pkg/reexec/command_unix.go deleted file mode 100644 index 778a720e3..000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/command_unix.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build freebsd solaris darwin - -package reexec - -import ( - "os/exec" -) - -// Self returns the path to the current process's binary. -// Uses os.Args[0]. -func Self() string { - return naiveSelf() -} - -// Command returns *exec.Cmd which has Path as current binary. -// For example if current binary is "docker" at "/usr/bin/", then cmd.Path will -// be set to "/usr/bin/docker". -func Command(args ...string) *exec.Cmd { - return &exec.Cmd{ - Path: Self(), - Args: args, - } -} diff --git a/vendor/github.com/docker/docker/pkg/reexec/command_unsupported.go b/vendor/github.com/docker/docker/pkg/reexec/command_unsupported.go deleted file mode 100644 index 76edd8242..000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/command_unsupported.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !linux,!windows,!freebsd,!solaris,!darwin - -package reexec - -import ( - "os/exec" -) - -// Command is unsupported on operating systems apart from Linux, Windows, Solaris and Darwin. -func Command(args ...string) *exec.Cmd { - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/reexec/command_windows.go b/vendor/github.com/docker/docker/pkg/reexec/command_windows.go deleted file mode 100644 index ca871c422..000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/command_windows.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build windows - -package reexec - -import ( - "os/exec" -) - -// Self returns the path to the current process's binary. -// Uses os.Args[0]. -func Self() string { - return naiveSelf() -} - -// Command returns *exec.Cmd which has Path as current binary. -// For example if current binary is "docker.exe" at "C:\", then cmd.Path will -// be set to "C:\docker.exe". -func Command(args ...string) *exec.Cmd { - return &exec.Cmd{ - Path: Self(), - Args: args, - } -} diff --git a/vendor/github.com/docker/docker/pkg/reexec/reexec.go b/vendor/github.com/docker/docker/pkg/reexec/reexec.go deleted file mode 100644 index c56671d91..000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/reexec.go +++ /dev/null @@ -1,47 +0,0 @@ -package reexec - -import ( - "fmt" - "os" - "os/exec" - "path/filepath" -) - -var registeredInitializers = make(map[string]func()) - -// Register adds an initialization func under the specified name -func Register(name string, initializer func()) { - if _, exists := registeredInitializers[name]; exists { - panic(fmt.Sprintf("reexec func already registered under name %q", name)) - } - - registeredInitializers[name] = initializer -} - -// Init is called as the first part of the exec process and returns true if an -// initialization function was called. -func Init() bool { - initializer, exists := registeredInitializers[os.Args[0]] - if exists { - initializer() - - return true - } - return false -} - -func naiveSelf() string { - name := os.Args[0] - if filepath.Base(name) == name { - if lp, err := exec.LookPath(name); err == nil { - return lp - } - } - // handle conversion of relative paths to absolute - if absName, err := filepath.Abs(name); err == nil { - return absName - } - // if we couldn't get absolute name, return original - // (NOTE: Go only errors on Abs() if os.Getwd fails) - return name -} diff --git a/vendor/github.com/docker/docker/pkg/registrar/registrar.go b/vendor/github.com/docker/docker/pkg/registrar/registrar.go deleted file mode 100644 index 1e75ee995..000000000 --- a/vendor/github.com/docker/docker/pkg/registrar/registrar.go +++ /dev/null @@ -1,127 +0,0 @@ -// Package registrar provides name registration. It reserves a name to a given key. -package registrar - -import ( - "errors" - "sync" -) - -var ( - // ErrNameReserved is an error which is returned when a name is requested to be reserved that already is reserved - ErrNameReserved = errors.New("name is reserved") - // ErrNameNotReserved is an error which is returned when trying to find a name that is not reserved - ErrNameNotReserved = errors.New("name is not reserved") - // ErrNoSuchKey is returned when trying to find the names for a key which is not known - ErrNoSuchKey = errors.New("provided key does not exist") -) - -// Registrar stores indexes a list of keys and their registered names as well as indexes names and the key that they are registered to -// Names must be unique. -// Registrar is safe for concurrent access. -type Registrar struct { - idx map[string][]string - names map[string]string - mu sync.Mutex -} - -// NewRegistrar creates a new Registrar with the an empty index -func NewRegistrar() *Registrar { - return &Registrar{ - idx: make(map[string][]string), - names: make(map[string]string), - } -} - -// Reserve registers a key to a name -// Reserve is idempotent -// Attempting to reserve a key to a name that already exists results in an `ErrNameReserved` -// A name reservation is globally unique -func (r *Registrar) Reserve(name, key string) error { - r.mu.Lock() - defer r.mu.Unlock() - - if k, exists := r.names[name]; exists { - if k != key { - return ErrNameReserved - } - return nil - } - - r.idx[key] = append(r.idx[key], name) - r.names[name] = key - return nil -} - -// Release releases the reserved name -// Once released, a name can be reserved again -func (r *Registrar) Release(name string) { - r.mu.Lock() - defer r.mu.Unlock() - - key, exists := r.names[name] - if !exists { - return - } - - for i, n := range r.idx[key] { - if n != name { - continue - } - r.idx[key] = append(r.idx[key][:i], r.idx[key][i+1:]...) - break - } - - delete(r.names, name) - - if len(r.idx[key]) == 0 { - delete(r.idx, key) - } -} - -// Delete removes all reservations for the passed in key. -// All names reserved to this key are released. -func (r *Registrar) Delete(key string) { - r.mu.Lock() - for _, name := range r.idx[key] { - delete(r.names, name) - } - delete(r.idx, key) - r.mu.Unlock() -} - -// GetNames lists all the reserved names for the given key -func (r *Registrar) GetNames(key string) ([]string, error) { - r.mu.Lock() - defer r.mu.Unlock() - - names, exists := r.idx[key] - if !exists { - return nil, ErrNoSuchKey - } - return names, nil -} - -// Get returns the key that the passed in name is reserved to -func (r *Registrar) Get(name string) (string, error) { - r.mu.Lock() - key, exists := r.names[name] - r.mu.Unlock() - - if !exists { - return "", ErrNameNotReserved - } - return key, nil -} - -// GetAll returns all registered names -func (r *Registrar) GetAll() map[string][]string { - out := make(map[string][]string) - - r.mu.Lock() - // copy index into out - for id, names := range r.idx { - out[id] = names - } - r.mu.Unlock() - return out -} diff --git a/vendor/github.com/docker/docker/pkg/registrar/registrar_test.go b/vendor/github.com/docker/docker/pkg/registrar/registrar_test.go deleted file mode 100644 index 0c1ef312a..000000000 --- a/vendor/github.com/docker/docker/pkg/registrar/registrar_test.go +++ /dev/null @@ -1,119 +0,0 @@ -package registrar - -import ( - "reflect" - "testing" -) - -func TestReserve(t *testing.T) { - r := NewRegistrar() - - obj := "test1" - if err := r.Reserve("test", obj); err != nil { - t.Fatal(err) - } - - if err := r.Reserve("test", obj); err != nil { - t.Fatal(err) - } - - obj2 := "test2" - err := r.Reserve("test", obj2) - if err == nil { - t.Fatalf("expected error when reserving an already reserved name to another object") - } - if err != ErrNameReserved { - t.Fatal("expected `ErrNameReserved` error when attempting to reserve an already reserved name") - } -} - -func TestRelease(t *testing.T) { - r := NewRegistrar() - obj := "testing" - - if err := r.Reserve("test", obj); err != nil { - t.Fatal(err) - } - r.Release("test") - r.Release("test") // Ensure there is no panic here - - if err := r.Reserve("test", obj); err != nil { - t.Fatal(err) - } -} - -func TestGetNames(t *testing.T) { - r := NewRegistrar() - obj := "testing" - names := []string{"test1", "test2"} - - for _, name := range names { - if err := r.Reserve(name, obj); err != nil { - t.Fatal(err) - } - } - r.Reserve("test3", "other") - - names2, err := r.GetNames(obj) - if err != nil { - t.Fatal(err) - } - - if !reflect.DeepEqual(names, names2) { - t.Fatalf("Exepected: %v, Got: %v", names, names2) - } -} - -func TestDelete(t *testing.T) { - r := NewRegistrar() - obj := "testing" - names := []string{"test1", "test2"} - for _, name := range names { - if err := r.Reserve(name, obj); err != nil { - t.Fatal(err) - } - } - - r.Reserve("test3", "other") - r.Delete(obj) - - _, err := r.GetNames(obj) - if err == nil { - t.Fatal("expected error getting names for deleted key") - } - - if err != ErrNoSuchKey { - t.Fatal("expected `ErrNoSuchKey`") - } -} - -func TestGet(t *testing.T) { - r := NewRegistrar() - obj := "testing" - name := "test" - - _, err := r.Get(name) - if err == nil { - t.Fatal("expected error when key does not exist") - } - if err != ErrNameNotReserved { - t.Fatal(err) - } - - if err := r.Reserve(name, obj); err != nil { - t.Fatal(err) - } - - if _, err = r.Get(name); err != nil { - t.Fatal(err) - } - - r.Delete(obj) - _, err = r.Get(name) - if err == nil { - t.Fatal("expected error when key does not exist") - } - if err != ErrNameNotReserved { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/docker/pkg/signal/README.md b/vendor/github.com/docker/docker/pkg/signal/README.md deleted file mode 100644 index 2b237a594..000000000 --- a/vendor/github.com/docker/docker/pkg/signal/README.md +++ /dev/null @@ -1 +0,0 @@ -This package provides helper functions for dealing with signals across various operating systems \ No newline at end of file diff --git a/vendor/github.com/docker/docker/pkg/signal/signal.go b/vendor/github.com/docker/docker/pkg/signal/signal.go deleted file mode 100644 index 68bb77cf5..000000000 --- a/vendor/github.com/docker/docker/pkg/signal/signal.go +++ /dev/null @@ -1,54 +0,0 @@ -// Package signal provides helper functions for dealing with signals across -// various operating systems. -package signal - -import ( - "fmt" - "os" - "os/signal" - "strconv" - "strings" - "syscall" -) - -// CatchAll catches all signals and relays them to the specified channel. -func CatchAll(sigc chan os.Signal) { - handledSigs := []os.Signal{} - for _, s := range SignalMap { - handledSigs = append(handledSigs, s) - } - signal.Notify(sigc, handledSigs...) -} - -// StopCatch stops catching the signals and closes the specified channel. -func StopCatch(sigc chan os.Signal) { - signal.Stop(sigc) - close(sigc) -} - -// ParseSignal translates a string to a valid syscall signal. -// It returns an error if the signal map doesn't include the given signal. -func ParseSignal(rawSignal string) (syscall.Signal, error) { - s, err := strconv.Atoi(rawSignal) - if err == nil { - if s == 0 { - return -1, fmt.Errorf("Invalid signal: %s", rawSignal) - } - return syscall.Signal(s), nil - } - signal, ok := SignalMap[strings.TrimPrefix(strings.ToUpper(rawSignal), "SIG")] - if !ok { - return -1, fmt.Errorf("Invalid signal: %s", rawSignal) - } - return signal, nil -} - -// ValidSignalForPlatform returns true if a signal is valid on the platform -func ValidSignalForPlatform(sig syscall.Signal) bool { - for _, v := range SignalMap { - if v == sig { - return true - } - } - return false -} diff --git a/vendor/github.com/docker/docker/pkg/signal/signal_darwin.go b/vendor/github.com/docker/docker/pkg/signal/signal_darwin.go deleted file mode 100644 index 946de87e9..000000000 --- a/vendor/github.com/docker/docker/pkg/signal/signal_darwin.go +++ /dev/null @@ -1,41 +0,0 @@ -package signal - -import ( - "syscall" -) - -// SignalMap is a map of Darwin signals. -var SignalMap = map[string]syscall.Signal{ - "ABRT": syscall.SIGABRT, - "ALRM": syscall.SIGALRM, - "BUG": syscall.SIGBUS, - "CHLD": syscall.SIGCHLD, - "CONT": syscall.SIGCONT, - "EMT": syscall.SIGEMT, - "FPE": syscall.SIGFPE, - "HUP": syscall.SIGHUP, - "ILL": syscall.SIGILL, - "INFO": syscall.SIGINFO, - "INT": syscall.SIGINT, - "IO": syscall.SIGIO, - "IOT": syscall.SIGIOT, - "KILL": syscall.SIGKILL, - "PIPE": syscall.SIGPIPE, - "PROF": syscall.SIGPROF, - "QUIT": syscall.SIGQUIT, - "SEGV": syscall.SIGSEGV, - "STOP": syscall.SIGSTOP, - "SYS": syscall.SIGSYS, - "TERM": syscall.SIGTERM, - "TRAP": syscall.SIGTRAP, - "TSTP": syscall.SIGTSTP, - "TTIN": syscall.SIGTTIN, - "TTOU": syscall.SIGTTOU, - "URG": syscall.SIGURG, - "USR1": syscall.SIGUSR1, - "USR2": syscall.SIGUSR2, - "VTALRM": syscall.SIGVTALRM, - "WINCH": syscall.SIGWINCH, - "XCPU": syscall.SIGXCPU, - "XFSZ": syscall.SIGXFSZ, -} diff --git a/vendor/github.com/docker/docker/pkg/signal/signal_freebsd.go b/vendor/github.com/docker/docker/pkg/signal/signal_freebsd.go deleted file mode 100644 index 6b9569bb7..000000000 --- a/vendor/github.com/docker/docker/pkg/signal/signal_freebsd.go +++ /dev/null @@ -1,43 +0,0 @@ -package signal - -import ( - "syscall" -) - -// SignalMap is a map of FreeBSD signals. -var SignalMap = map[string]syscall.Signal{ - "ABRT": syscall.SIGABRT, - "ALRM": syscall.SIGALRM, - "BUF": syscall.SIGBUS, - "CHLD": syscall.SIGCHLD, - "CONT": syscall.SIGCONT, - "EMT": syscall.SIGEMT, - "FPE": syscall.SIGFPE, - "HUP": syscall.SIGHUP, - "ILL": syscall.SIGILL, - "INFO": syscall.SIGINFO, - "INT": syscall.SIGINT, - "IO": syscall.SIGIO, - "IOT": syscall.SIGIOT, - "KILL": syscall.SIGKILL, - "LWP": syscall.SIGLWP, - "PIPE": syscall.SIGPIPE, - "PROF": syscall.SIGPROF, - "QUIT": syscall.SIGQUIT, - "SEGV": syscall.SIGSEGV, - "STOP": syscall.SIGSTOP, - "SYS": syscall.SIGSYS, - "TERM": syscall.SIGTERM, - "THR": syscall.SIGTHR, - "TRAP": syscall.SIGTRAP, - "TSTP": syscall.SIGTSTP, - "TTIN": syscall.SIGTTIN, - "TTOU": syscall.SIGTTOU, - "URG": syscall.SIGURG, - "USR1": syscall.SIGUSR1, - "USR2": syscall.SIGUSR2, - "VTALRM": syscall.SIGVTALRM, - "WINCH": syscall.SIGWINCH, - "XCPU": syscall.SIGXCPU, - "XFSZ": syscall.SIGXFSZ, -} diff --git a/vendor/github.com/docker/docker/pkg/signal/signal_linux.go b/vendor/github.com/docker/docker/pkg/signal/signal_linux.go deleted file mode 100644 index d418cbe9e..000000000 --- a/vendor/github.com/docker/docker/pkg/signal/signal_linux.go +++ /dev/null @@ -1,80 +0,0 @@ -package signal - -import ( - "syscall" -) - -const ( - sigrtmin = 34 - sigrtmax = 64 -) - -// SignalMap is a map of Linux signals. -var SignalMap = map[string]syscall.Signal{ - "ABRT": syscall.SIGABRT, - "ALRM": syscall.SIGALRM, - "BUS": syscall.SIGBUS, - "CHLD": syscall.SIGCHLD, - "CLD": syscall.SIGCLD, - "CONT": syscall.SIGCONT, - "FPE": syscall.SIGFPE, - "HUP": syscall.SIGHUP, - "ILL": syscall.SIGILL, - "INT": syscall.SIGINT, - "IO": syscall.SIGIO, - "IOT": syscall.SIGIOT, - "KILL": syscall.SIGKILL, - "PIPE": syscall.SIGPIPE, - "POLL": syscall.SIGPOLL, - "PROF": syscall.SIGPROF, - "PWR": syscall.SIGPWR, - "QUIT": syscall.SIGQUIT, - "SEGV": syscall.SIGSEGV, - "STKFLT": syscall.SIGSTKFLT, - "STOP": syscall.SIGSTOP, - "SYS": syscall.SIGSYS, - "TERM": syscall.SIGTERM, - "TRAP": syscall.SIGTRAP, - "TSTP": syscall.SIGTSTP, - "TTIN": syscall.SIGTTIN, - "TTOU": syscall.SIGTTOU, - "UNUSED": syscall.SIGUNUSED, - "URG": syscall.SIGURG, - "USR1": syscall.SIGUSR1, - "USR2": syscall.SIGUSR2, - "VTALRM": syscall.SIGVTALRM, - "WINCH": syscall.SIGWINCH, - "XCPU": syscall.SIGXCPU, - "XFSZ": syscall.SIGXFSZ, - "RTMIN": sigrtmin, - "RTMIN+1": sigrtmin + 1, - "RTMIN+2": sigrtmin + 2, - "RTMIN+3": sigrtmin + 3, - "RTMIN+4": sigrtmin + 4, - "RTMIN+5": sigrtmin + 5, - "RTMIN+6": sigrtmin + 6, - "RTMIN+7": sigrtmin + 7, - "RTMIN+8": sigrtmin + 8, - "RTMIN+9": sigrtmin + 9, - "RTMIN+10": sigrtmin + 10, - "RTMIN+11": sigrtmin + 11, - "RTMIN+12": sigrtmin + 12, - "RTMIN+13": sigrtmin + 13, - "RTMIN+14": sigrtmin + 14, - "RTMIN+15": sigrtmin + 15, - "RTMAX-14": sigrtmax - 14, - "RTMAX-13": sigrtmax - 13, - "RTMAX-12": sigrtmax - 12, - "RTMAX-11": sigrtmax - 11, - "RTMAX-10": sigrtmax - 10, - "RTMAX-9": sigrtmax - 9, - "RTMAX-8": sigrtmax - 8, - "RTMAX-7": sigrtmax - 7, - "RTMAX-6": sigrtmax - 6, - "RTMAX-5": sigrtmax - 5, - "RTMAX-4": sigrtmax - 4, - "RTMAX-3": sigrtmax - 3, - "RTMAX-2": sigrtmax - 2, - "RTMAX-1": sigrtmax - 1, - "RTMAX": sigrtmax, -} diff --git a/vendor/github.com/docker/docker/pkg/signal/signal_solaris.go b/vendor/github.com/docker/docker/pkg/signal/signal_solaris.go deleted file mode 100644 index 89576b9e3..000000000 --- a/vendor/github.com/docker/docker/pkg/signal/signal_solaris.go +++ /dev/null @@ -1,42 +0,0 @@ -package signal - -import ( - "syscall" -) - -// SignalMap is a map of Solaris signals. -// SIGINFO and SIGTHR not defined for Solaris -var SignalMap = map[string]syscall.Signal{ - "ABRT": syscall.SIGABRT, - "ALRM": syscall.SIGALRM, - "BUF": syscall.SIGBUS, - "CHLD": syscall.SIGCHLD, - "CONT": syscall.SIGCONT, - "EMT": syscall.SIGEMT, - "FPE": syscall.SIGFPE, - "HUP": syscall.SIGHUP, - "ILL": syscall.SIGILL, - "INT": syscall.SIGINT, - "IO": syscall.SIGIO, - "IOT": syscall.SIGIOT, - "KILL": syscall.SIGKILL, - "LWP": syscall.SIGLWP, - "PIPE": syscall.SIGPIPE, - "PROF": syscall.SIGPROF, - "QUIT": syscall.SIGQUIT, - "SEGV": syscall.SIGSEGV, - "STOP": syscall.SIGSTOP, - "SYS": syscall.SIGSYS, - "TERM": syscall.SIGTERM, - "TRAP": syscall.SIGTRAP, - "TSTP": syscall.SIGTSTP, - "TTIN": syscall.SIGTTIN, - "TTOU": syscall.SIGTTOU, - "URG": syscall.SIGURG, - "USR1": syscall.SIGUSR1, - "USR2": syscall.SIGUSR2, - "VTALRM": syscall.SIGVTALRM, - "WINCH": syscall.SIGWINCH, - "XCPU": syscall.SIGXCPU, - "XFSZ": syscall.SIGXFSZ, -} diff --git a/vendor/github.com/docker/docker/pkg/signal/signal_unix.go b/vendor/github.com/docker/docker/pkg/signal/signal_unix.go deleted file mode 100644 index 5d058fd56..000000000 --- a/vendor/github.com/docker/docker/pkg/signal/signal_unix.go +++ /dev/null @@ -1,21 +0,0 @@ -// +build !windows - -package signal - -import ( - "syscall" -) - -// Signals used in cli/command (no windows equivalent, use -// invalid signals so they don't get handled) - -const ( - // SIGCHLD is a signal sent to a process when a child process terminates, is interrupted, or resumes after being interrupted. - SIGCHLD = syscall.SIGCHLD - // SIGWINCH is a signal sent to a process when its controlling terminal changes its size - SIGWINCH = syscall.SIGWINCH - // SIGPIPE is a signal sent to a process when a pipe is written to before the other end is open for reading - SIGPIPE = syscall.SIGPIPE - // DefaultStopSignal is the syscall signal used to stop a container in unix systems. - DefaultStopSignal = "SIGTERM" -) diff --git a/vendor/github.com/docker/docker/pkg/signal/signal_unsupported.go b/vendor/github.com/docker/docker/pkg/signal/signal_unsupported.go deleted file mode 100644 index c592d37df..000000000 --- a/vendor/github.com/docker/docker/pkg/signal/signal_unsupported.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build !linux,!darwin,!freebsd,!windows,!solaris - -package signal - -import ( - "syscall" -) - -// SignalMap is an empty map of signals for unsupported platform. -var SignalMap = map[string]syscall.Signal{} diff --git a/vendor/github.com/docker/docker/pkg/signal/signal_windows.go b/vendor/github.com/docker/docker/pkg/signal/signal_windows.go deleted file mode 100644 index 440f2700e..000000000 --- a/vendor/github.com/docker/docker/pkg/signal/signal_windows.go +++ /dev/null @@ -1,28 +0,0 @@ -// +build windows - -package signal - -import ( - "syscall" -) - -// Signals used in cli/command (no windows equivalent, use -// invalid signals so they don't get handled) -const ( - SIGCHLD = syscall.Signal(0xff) - SIGWINCH = syscall.Signal(0xff) - SIGPIPE = syscall.Signal(0xff) - // DefaultStopSignal is the syscall signal used to stop a container in windows systems. - DefaultStopSignal = "15" -) - -// SignalMap is a map of "supported" signals. As per the comment in GOLang's -// ztypes_windows.go: "More invented values for signals". Windows doesn't -// really support signals in any way, shape or form that Unix does. -// -// We have these so that docker kill can be used to gracefully (TERM) and -// forcibly (KILL) terminate a container on Windows. -var SignalMap = map[string]syscall.Signal{ - "KILL": syscall.SIGKILL, - "TERM": syscall.SIGTERM, -} diff --git a/vendor/github.com/docker/docker/pkg/signal/trap.go b/vendor/github.com/docker/docker/pkg/signal/trap.go deleted file mode 100644 index 638a1ab66..000000000 --- a/vendor/github.com/docker/docker/pkg/signal/trap.go +++ /dev/null @@ -1,103 +0,0 @@ -package signal - -import ( - "fmt" - "os" - gosignal "os/signal" - "path/filepath" - "runtime" - "strings" - "sync/atomic" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - "github.com/pkg/errors" -) - -// Trap sets up a simplified signal "trap", appropriate for common -// behavior expected from a vanilla unix command-line tool in general -// (and the Docker engine in particular). -// -// * If SIGINT or SIGTERM are received, `cleanup` is called, then the process is terminated. -// * If SIGINT or SIGTERM are received 3 times before cleanup is complete, then cleanup is -// skipped and the process is terminated immediately (allows force quit of stuck daemon) -// * A SIGQUIT always causes an exit without cleanup, with a goroutine dump preceding exit. -// * Ignore SIGPIPE events. These are generated by systemd when journald is restarted while -// the docker daemon is not restarted and also running under systemd. -// Fixes https://github.com/docker/docker/issues/19728 -// -func Trap(cleanup func()) { - c := make(chan os.Signal, 1) - // we will handle INT, TERM, QUIT, SIGPIPE here - signals := []os.Signal{os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGPIPE} - gosignal.Notify(c, signals...) - go func() { - interruptCount := uint32(0) - for sig := range c { - if sig == syscall.SIGPIPE { - continue - } - - go func(sig os.Signal) { - logrus.Infof("Processing signal '%v'", sig) - switch sig { - case os.Interrupt, syscall.SIGTERM: - if atomic.LoadUint32(&interruptCount) < 3 { - // Initiate the cleanup only once - if atomic.AddUint32(&interruptCount, 1) == 1 { - // Call the provided cleanup handler - cleanup() - os.Exit(0) - } else { - return - } - } else { - // 3 SIGTERM/INT signals received; force exit without cleanup - logrus.Info("Forcing docker daemon shutdown without cleanup; 3 interrupts received") - } - case syscall.SIGQUIT: - DumpStacks("") - logrus.Info("Forcing docker daemon shutdown without cleanup on SIGQUIT") - } - //for the SIGINT/TERM, and SIGQUIT non-clean shutdown case, exit with 128 + signal # - os.Exit(128 + int(sig.(syscall.Signal))) - }(sig) - } - }() -} - -const stacksLogNameTemplate = "goroutine-stacks-%s.log" - -// DumpStacks appends the runtime stack into file in dir and returns full path -// to that file. -func DumpStacks(dir string) (string, error) { - var ( - buf []byte - stackSize int - ) - bufferLen := 16384 - for stackSize == len(buf) { - buf = make([]byte, bufferLen) - stackSize = runtime.Stack(buf, true) - bufferLen *= 2 - } - buf = buf[:stackSize] - var f *os.File - if dir != "" { - path := filepath.Join(dir, fmt.Sprintf(stacksLogNameTemplate, strings.Replace(time.Now().Format(time.RFC3339), ":", "", -1))) - var err error - f, err = os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0666) - if err != nil { - return "", errors.Wrap(err, "failed to open file to write the goroutine stacks") - } - defer f.Close() - defer f.Sync() - } else { - f = os.Stderr - } - if _, err := f.Write(buf); err != nil { - return "", errors.Wrap(err, "failed to write goroutine stacks") - } - return f.Name(), nil -} diff --git a/vendor/github.com/docker/docker/pkg/streamformatter/streamformatter.go b/vendor/github.com/docker/docker/pkg/streamformatter/streamformatter.go deleted file mode 100644 index ce6ea79de..000000000 --- a/vendor/github.com/docker/docker/pkg/streamformatter/streamformatter.go +++ /dev/null @@ -1,172 +0,0 @@ -// Package streamformatter provides helper functions to format a stream. -package streamformatter - -import ( - "encoding/json" - "fmt" - "io" - - "github.com/docker/docker/pkg/jsonmessage" - "github.com/docker/docker/pkg/progress" -) - -// StreamFormatter formats a stream, optionally using JSON. -type StreamFormatter struct { - json bool -} - -// NewStreamFormatter returns a simple StreamFormatter -func NewStreamFormatter() *StreamFormatter { - return &StreamFormatter{} -} - -// NewJSONStreamFormatter returns a StreamFormatter configured to stream json -func NewJSONStreamFormatter() *StreamFormatter { - return &StreamFormatter{true} -} - -const streamNewline = "\r\n" - -var streamNewlineBytes = []byte(streamNewline) - -// FormatStream formats the specified stream. -func (sf *StreamFormatter) FormatStream(str string) []byte { - if sf.json { - b, err := json.Marshal(&jsonmessage.JSONMessage{Stream: str}) - if err != nil { - return sf.FormatError(err) - } - return append(b, streamNewlineBytes...) - } - return []byte(str + "\r") -} - -// FormatStatus formats the specified objects according to the specified format (and id). -func (sf *StreamFormatter) FormatStatus(id, format string, a ...interface{}) []byte { - str := fmt.Sprintf(format, a...) - if sf.json { - b, err := json.Marshal(&jsonmessage.JSONMessage{ID: id, Status: str}) - if err != nil { - return sf.FormatError(err) - } - return append(b, streamNewlineBytes...) - } - return []byte(str + streamNewline) -} - -// FormatError formats the specified error. -func (sf *StreamFormatter) FormatError(err error) []byte { - if sf.json { - jsonError, ok := err.(*jsonmessage.JSONError) - if !ok { - jsonError = &jsonmessage.JSONError{Message: err.Error()} - } - if b, err := json.Marshal(&jsonmessage.JSONMessage{Error: jsonError, ErrorMessage: err.Error()}); err == nil { - return append(b, streamNewlineBytes...) - } - return []byte("{\"error\":\"format error\"}" + streamNewline) - } - return []byte("Error: " + err.Error() + streamNewline) -} - -// FormatProgress formats the progress information for a specified action. -func (sf *StreamFormatter) FormatProgress(id, action string, progress *jsonmessage.JSONProgress, aux interface{}) []byte { - if progress == nil { - progress = &jsonmessage.JSONProgress{} - } - if sf.json { - var auxJSON *json.RawMessage - if aux != nil { - auxJSONBytes, err := json.Marshal(aux) - if err != nil { - return nil - } - auxJSON = new(json.RawMessage) - *auxJSON = auxJSONBytes - } - b, err := json.Marshal(&jsonmessage.JSONMessage{ - Status: action, - ProgressMessage: progress.String(), - Progress: progress, - ID: id, - Aux: auxJSON, - }) - if err != nil { - return nil - } - return append(b, streamNewlineBytes...) - } - endl := "\r" - if progress.String() == "" { - endl += "\n" - } - return []byte(action + " " + progress.String() + endl) -} - -// NewProgressOutput returns a progress.Output object that can be passed to -// progress.NewProgressReader. -func (sf *StreamFormatter) NewProgressOutput(out io.Writer, newLines bool) progress.Output { - return &progressOutput{ - sf: sf, - out: out, - newLines: newLines, - } -} - -type progressOutput struct { - sf *StreamFormatter - out io.Writer - newLines bool -} - -// WriteProgress formats progress information from a ProgressReader. -func (out *progressOutput) WriteProgress(prog progress.Progress) error { - var formatted []byte - if prog.Message != "" { - formatted = out.sf.FormatStatus(prog.ID, prog.Message) - } else { - jsonProgress := jsonmessage.JSONProgress{Current: prog.Current, Total: prog.Total} - formatted = out.sf.FormatProgress(prog.ID, prog.Action, &jsonProgress, prog.Aux) - } - _, err := out.out.Write(formatted) - if err != nil { - return err - } - - if out.newLines && prog.LastUpdate { - _, err = out.out.Write(out.sf.FormatStatus("", "")) - return err - } - - return nil -} - -// StdoutFormatter is a streamFormatter that writes to the standard output. -type StdoutFormatter struct { - io.Writer - *StreamFormatter -} - -func (sf *StdoutFormatter) Write(buf []byte) (int, error) { - formattedBuf := sf.StreamFormatter.FormatStream(string(buf)) - n, err := sf.Writer.Write(formattedBuf) - if n != len(formattedBuf) { - return n, io.ErrShortWrite - } - return len(buf), err -} - -// StderrFormatter is a streamFormatter that writes to the standard error. -type StderrFormatter struct { - io.Writer - *StreamFormatter -} - -func (sf *StderrFormatter) Write(buf []byte) (int, error) { - formattedBuf := sf.StreamFormatter.FormatStream("\033[91m" + string(buf) + "\033[0m") - n, err := sf.Writer.Write(formattedBuf) - if n != len(formattedBuf) { - return n, io.ErrShortWrite - } - return len(buf), err -} diff --git a/vendor/github.com/docker/docker/pkg/streamformatter/streamformatter_test.go b/vendor/github.com/docker/docker/pkg/streamformatter/streamformatter_test.go deleted file mode 100644 index 93ec90f5f..000000000 --- a/vendor/github.com/docker/docker/pkg/streamformatter/streamformatter_test.go +++ /dev/null @@ -1,108 +0,0 @@ -package streamformatter - -import ( - "encoding/json" - "errors" - "reflect" - "strings" - "testing" - - "github.com/docker/docker/pkg/jsonmessage" -) - -func TestFormatStream(t *testing.T) { - sf := NewStreamFormatter() - res := sf.FormatStream("stream") - if string(res) != "stream"+"\r" { - t.Fatalf("%q", res) - } -} - -func TestFormatJSONStatus(t *testing.T) { - sf := NewStreamFormatter() - res := sf.FormatStatus("ID", "%s%d", "a", 1) - if string(res) != "a1\r\n" { - t.Fatalf("%q", res) - } -} - -func TestFormatSimpleError(t *testing.T) { - sf := NewStreamFormatter() - res := sf.FormatError(errors.New("Error for formatter")) - if string(res) != "Error: Error for formatter\r\n" { - t.Fatalf("%q", res) - } -} - -func TestJSONFormatStream(t *testing.T) { - sf := NewJSONStreamFormatter() - res := sf.FormatStream("stream") - if string(res) != `{"stream":"stream"}`+"\r\n" { - t.Fatalf("%q", res) - } -} - -func TestJSONFormatStatus(t *testing.T) { - sf := NewJSONStreamFormatter() - res := sf.FormatStatus("ID", "%s%d", "a", 1) - if string(res) != `{"status":"a1","id":"ID"}`+"\r\n" { - t.Fatalf("%q", res) - } -} - -func TestJSONFormatSimpleError(t *testing.T) { - sf := NewJSONStreamFormatter() - res := sf.FormatError(errors.New("Error for formatter")) - if string(res) != `{"errorDetail":{"message":"Error for formatter"},"error":"Error for formatter"}`+"\r\n" { - t.Fatalf("%q", res) - } -} - -func TestJSONFormatJSONError(t *testing.T) { - sf := NewJSONStreamFormatter() - err := &jsonmessage.JSONError{Code: 50, Message: "Json error"} - res := sf.FormatError(err) - if string(res) != `{"errorDetail":{"code":50,"message":"Json error"},"error":"Json error"}`+"\r\n" { - t.Fatalf("%q", res) - } -} - -func TestJSONFormatProgress(t *testing.T) { - sf := NewJSONStreamFormatter() - progress := &jsonmessage.JSONProgress{ - Current: 15, - Total: 30, - Start: 1, - } - res := sf.FormatProgress("id", "action", progress, nil) - msg := &jsonmessage.JSONMessage{} - if err := json.Unmarshal(res, msg); err != nil { - t.Fatal(err) - } - if msg.ID != "id" { - t.Fatalf("ID must be 'id', got: %s", msg.ID) - } - if msg.Status != "action" { - t.Fatalf("Status must be 'action', got: %s", msg.Status) - } - - // The progress will always be in the format of: - // [=========================> ] 15 B/30 B 404933h7m11s - // The last entry '404933h7m11s' is the timeLeftBox. - // However, the timeLeftBox field may change as progress.String() depends on time.Now(). - // Therefore, we have to strip the timeLeftBox from the strings to do the comparison. - - // Compare the progress strings before the timeLeftBox - expectedProgress := "[=========================> ] 15 B/30 B" - // if terminal column is <= 110, expectedProgressShort is expected. - expectedProgressShort := " 15 B/30 B" - if !(strings.HasPrefix(msg.ProgressMessage, expectedProgress) || - strings.HasPrefix(msg.ProgressMessage, expectedProgressShort)) { - t.Fatalf("ProgressMessage without the timeLeftBox must be %s or %s, got: %s", - expectedProgress, expectedProgressShort, msg.ProgressMessage) - } - - if !reflect.DeepEqual(msg.Progress, progress) { - t.Fatal("Original progress not equals progress from FormatProgress") - } -} diff --git a/vendor/github.com/docker/docker/pkg/stringid/README.md b/vendor/github.com/docker/docker/pkg/stringid/README.md deleted file mode 100644 index 37a5098fd..000000000 --- a/vendor/github.com/docker/docker/pkg/stringid/README.md +++ /dev/null @@ -1 +0,0 @@ -This package provides helper functions for dealing with string identifiers diff --git a/vendor/github.com/docker/docker/pkg/stringid/stringid.go b/vendor/github.com/docker/docker/pkg/stringid/stringid.go deleted file mode 100644 index fa35d8bad..000000000 --- a/vendor/github.com/docker/docker/pkg/stringid/stringid.go +++ /dev/null @@ -1,69 +0,0 @@ -// Package stringid provides helper functions for dealing with string identifiers -package stringid - -import ( - "crypto/rand" - "encoding/hex" - "io" - "regexp" - "strconv" - "strings" - - "github.com/docker/docker/pkg/random" -) - -const shortLen = 12 - -var validShortID = regexp.MustCompile("^[a-z0-9]{12}$") - -// IsShortID determines if an arbitrary string *looks like* a short ID. -func IsShortID(id string) bool { - return validShortID.MatchString(id) -} - -// TruncateID returns a shorthand version of a string identifier for convenience. -// A collision with other shorthands is very unlikely, but possible. -// In case of a collision a lookup with TruncIndex.Get() will fail, and the caller -// will need to use a longer prefix, or the full-length Id. -func TruncateID(id string) string { - if i := strings.IndexRune(id, ':'); i >= 0 { - id = id[i+1:] - } - if len(id) > shortLen { - id = id[:shortLen] - } - return id -} - -func generateID(crypto bool) string { - b := make([]byte, 32) - r := random.Reader - if crypto { - r = rand.Reader - } - for { - if _, err := io.ReadFull(r, b); err != nil { - panic(err) // This shouldn't happen - } - id := hex.EncodeToString(b) - // if we try to parse the truncated for as an int and we don't have - // an error then the value is all numeric and causes issues when - // used as a hostname. ref #3869 - if _, err := strconv.ParseInt(TruncateID(id), 10, 64); err == nil { - continue - } - return id - } -} - -// GenerateRandomID returns a unique id. -func GenerateRandomID() string { - return generateID(true) -} - -// GenerateNonCryptoID generates unique id without using cryptographically -// secure sources of random. -// It helps you to save entropy. -func GenerateNonCryptoID() string { - return generateID(false) -} diff --git a/vendor/github.com/docker/docker/pkg/stringid/stringid_test.go b/vendor/github.com/docker/docker/pkg/stringid/stringid_test.go deleted file mode 100644 index 8ff6b4383..000000000 --- a/vendor/github.com/docker/docker/pkg/stringid/stringid_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package stringid - -import ( - "strings" - "testing" -) - -func TestGenerateRandomID(t *testing.T) { - id := GenerateRandomID() - - if len(id) != 64 { - t.Fatalf("Id returned is incorrect: %s", id) - } -} - -func TestGenerateNonCryptoID(t *testing.T) { - id := GenerateNonCryptoID() - - if len(id) != 64 { - t.Fatalf("Id returned is incorrect: %s", id) - } -} - -func TestShortenId(t *testing.T) { - id := "90435eec5c4e124e741ef731e118be2fc799a68aba0466ec17717f24ce2ae6a2" - truncID := TruncateID(id) - if truncID != "90435eec5c4e" { - t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID) - } -} - -func TestShortenSha256Id(t *testing.T) { - id := "sha256:4e38e38c8ce0b8d9041a9c4fefe786631d1416225e13b0bfe8cfa2321aec4bba" - truncID := TruncateID(id) - if truncID != "4e38e38c8ce0" { - t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID) - } -} - -func TestShortenIdEmpty(t *testing.T) { - id := "" - truncID := TruncateID(id) - if len(truncID) > len(id) { - t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID) - } -} - -func TestShortenIdInvalid(t *testing.T) { - id := "1234" - truncID := TruncateID(id) - if len(truncID) != len(id) { - t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID) - } -} - -func TestIsShortIDNonHex(t *testing.T) { - id := "some non-hex value" - if IsShortID(id) { - t.Fatalf("%s is not a short ID", id) - } -} - -func TestIsShortIDNotCorrectSize(t *testing.T) { - id := strings.Repeat("a", shortLen+1) - if IsShortID(id) { - t.Fatalf("%s is not a short ID", id) - } - id = strings.Repeat("a", shortLen-1) - if IsShortID(id) { - t.Fatalf("%s is not a short ID", id) - } -} diff --git a/vendor/github.com/docker/docker/pkg/stringutils/README.md b/vendor/github.com/docker/docker/pkg/stringutils/README.md deleted file mode 100644 index b3e454573..000000000 --- a/vendor/github.com/docker/docker/pkg/stringutils/README.md +++ /dev/null @@ -1 +0,0 @@ -This package provides helper functions for dealing with strings diff --git a/vendor/github.com/docker/docker/pkg/stringutils/stringutils.go b/vendor/github.com/docker/docker/pkg/stringutils/stringutils.go deleted file mode 100644 index 8e1c812d7..000000000 --- a/vendor/github.com/docker/docker/pkg/stringutils/stringutils.go +++ /dev/null @@ -1,101 +0,0 @@ -// Package stringutils provides helper functions for dealing with strings. -package stringutils - -import ( - "bytes" - "math/rand" - "strings" - - "github.com/docker/docker/pkg/random" -) - -// GenerateRandomAlphaOnlyString generates an alphabetical random string with length n. -func GenerateRandomAlphaOnlyString(n int) string { - // make a really long string - letters := []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") - b := make([]byte, n) - for i := range b { - b[i] = letters[random.Rand.Intn(len(letters))] - } - return string(b) -} - -// GenerateRandomASCIIString generates an ASCII random string with length n. -func GenerateRandomASCIIString(n int) string { - chars := "abcdefghijklmnopqrstuvwxyz" + - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + - "~!@#$%^&*()-_+={}[]\\|<,>.?/\"';:` " - res := make([]byte, n) - for i := 0; i < n; i++ { - res[i] = chars[rand.Intn(len(chars))] - } - return string(res) -} - -// Ellipsis truncates a string to fit within maxlen, and appends ellipsis (...). -// For maxlen of 3 and lower, no ellipsis is appended. -func Ellipsis(s string, maxlen int) string { - r := []rune(s) - if len(r) <= maxlen { - return s - } - if maxlen <= 3 { - return string(r[:maxlen]) - } - return string(r[:maxlen-3]) + "..." -} - -// Truncate truncates a string to maxlen. -func Truncate(s string, maxlen int) string { - r := []rune(s) - if len(r) <= maxlen { - return s - } - return string(r[:maxlen]) -} - -// InSlice tests whether a string is contained in a slice of strings or not. -// Comparison is case insensitive -func InSlice(slice []string, s string) bool { - for _, ss := range slice { - if strings.ToLower(s) == strings.ToLower(ss) { - return true - } - } - return false -} - -func quote(word string, buf *bytes.Buffer) { - // Bail out early for "simple" strings - if word != "" && !strings.ContainsAny(word, "\\'\"`${[|&;<>()~*?! \t\n") { - buf.WriteString(word) - return - } - - buf.WriteString("'") - - for i := 0; i < len(word); i++ { - b := word[i] - if b == '\'' { - // Replace literal ' with a close ', a \', and a open ' - buf.WriteString("'\\''") - } else { - buf.WriteByte(b) - } - } - - buf.WriteString("'") -} - -// ShellQuoteArguments takes a list of strings and escapes them so they will be -// handled right when passed as arguments to a program via a shell -func ShellQuoteArguments(args []string) string { - var buf bytes.Buffer - for i, arg := range args { - if i != 0 { - buf.WriteByte(' ') - } - quote(arg, &buf) - } - return buf.String() -} diff --git a/vendor/github.com/docker/docker/pkg/stringutils/stringutils_test.go b/vendor/github.com/docker/docker/pkg/stringutils/stringutils_test.go deleted file mode 100644 index 8af2bdcc0..000000000 --- a/vendor/github.com/docker/docker/pkg/stringutils/stringutils_test.go +++ /dev/null @@ -1,121 +0,0 @@ -package stringutils - -import "testing" - -func testLengthHelper(generator func(int) string, t *testing.T) { - expectedLength := 20 - s := generator(expectedLength) - if len(s) != expectedLength { - t.Fatalf("Length of %s was %d but expected length %d", s, len(s), expectedLength) - } -} - -func testUniquenessHelper(generator func(int) string, t *testing.T) { - repeats := 25 - set := make(map[string]struct{}, repeats) - for i := 0; i < repeats; i = i + 1 { - str := generator(64) - if len(str) != 64 { - t.Fatalf("Id returned is incorrect: %s", str) - } - if _, ok := set[str]; ok { - t.Fatalf("Random number is repeated") - } - set[str] = struct{}{} - } -} - -func isASCII(s string) bool { - for _, c := range s { - if c > 127 { - return false - } - } - return true -} - -func TestGenerateRandomAlphaOnlyStringLength(t *testing.T) { - testLengthHelper(GenerateRandomAlphaOnlyString, t) -} - -func TestGenerateRandomAlphaOnlyStringUniqueness(t *testing.T) { - testUniquenessHelper(GenerateRandomAlphaOnlyString, t) -} - -func TestGenerateRandomAsciiStringLength(t *testing.T) { - testLengthHelper(GenerateRandomASCIIString, t) -} - -func TestGenerateRandomAsciiStringUniqueness(t *testing.T) { - testUniquenessHelper(GenerateRandomASCIIString, t) -} - -func TestGenerateRandomAsciiStringIsAscii(t *testing.T) { - str := GenerateRandomASCIIString(64) - if !isASCII(str) { - t.Fatalf("%s contained non-ascii characters", str) - } -} - -func TestEllipsis(t *testing.T) { - str := "t🐳ststring" - newstr := Ellipsis(str, 3) - if newstr != "t🐳s" { - t.Fatalf("Expected t🐳s, got %s", newstr) - } - newstr = Ellipsis(str, 8) - if newstr != "t🐳sts..." { - t.Fatalf("Expected tests..., got %s", newstr) - } - newstr = Ellipsis(str, 20) - if newstr != "t🐳ststring" { - t.Fatalf("Expected t🐳ststring, got %s", newstr) - } -} - -func TestTruncate(t *testing.T) { - str := "t🐳ststring" - newstr := Truncate(str, 4) - if newstr != "t🐳st" { - t.Fatalf("Expected t🐳st, got %s", newstr) - } - newstr = Truncate(str, 20) - if newstr != "t🐳ststring" { - t.Fatalf("Expected t🐳ststring, got %s", newstr) - } -} - -func TestInSlice(t *testing.T) { - slice := []string{"t🐳st", "in", "slice"} - - test := InSlice(slice, "t🐳st") - if !test { - t.Fatalf("Expected string t🐳st to be in slice") - } - test = InSlice(slice, "SLICE") - if !test { - t.Fatalf("Expected string SLICE to be in slice") - } - test = InSlice(slice, "notinslice") - if test { - t.Fatalf("Expected string notinslice not to be in slice") - } -} - -func TestShellQuoteArgumentsEmpty(t *testing.T) { - actual := ShellQuoteArguments([]string{}) - expected := "" - if actual != expected { - t.Fatalf("Expected an empty string") - } -} - -func TestShellQuoteArguments(t *testing.T) { - simpleString := "simpleString" - complexString := "This is a 'more' complex $tring with some special char *" - actual := ShellQuoteArguments([]string{simpleString, complexString}) - expected := "simpleString 'This is a '\\''more'\\'' complex $tring with some special char *'" - if actual != expected { - t.Fatalf("Expected \"%v\", got \"%v\"", expected, actual) - } -} diff --git a/vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE b/vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE deleted file mode 100644 index 34c4ea7c5..000000000 --- a/vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE +++ /dev/null @@ -1,191 +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 - - Copyright 2014-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 - - 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/docker/pkg/symlink/LICENSE.BSD b/vendor/github.com/docker/docker/pkg/symlink/LICENSE.BSD deleted file mode 100644 index 9b4f4a294..000000000 --- a/vendor/github.com/docker/docker/pkg/symlink/LICENSE.BSD +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2014-2016 The Docker & Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/docker/docker/pkg/symlink/README.md b/vendor/github.com/docker/docker/pkg/symlink/README.md deleted file mode 100644 index 8dba54fd0..000000000 --- a/vendor/github.com/docker/docker/pkg/symlink/README.md +++ /dev/null @@ -1,6 +0,0 @@ -Package symlink implements EvalSymlinksInScope which is an extension of filepath.EvalSymlinks, -as well as a Windows long-path aware version of filepath.EvalSymlinks -from the [Go standard library](https://golang.org/pkg/path/filepath). - -The code from filepath.EvalSymlinks has been adapted in fs.go. -Please read the LICENSE.BSD file that governs fs.go and LICENSE.APACHE for fs_test.go. diff --git a/vendor/github.com/docker/docker/pkg/symlink/fs.go b/vendor/github.com/docker/docker/pkg/symlink/fs.go deleted file mode 100644 index f6bc2231f..000000000 --- a/vendor/github.com/docker/docker/pkg/symlink/fs.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.BSD file. - -// This code is a modified version of path/filepath/symlink.go from the Go standard library. - -package symlink - -import ( - "bytes" - "errors" - "os" - "path/filepath" - "strings" - - "github.com/docker/docker/pkg/system" -) - -// FollowSymlinkInScope is a wrapper around evalSymlinksInScope that returns an -// absolute path. This function handles paths in a platform-agnostic manner. -func FollowSymlinkInScope(path, root string) (string, error) { - path, err := filepath.Abs(filepath.FromSlash(path)) - if err != nil { - return "", err - } - root, err = filepath.Abs(filepath.FromSlash(root)) - if err != nil { - return "", err - } - return evalSymlinksInScope(path, root) -} - -// evalSymlinksInScope will evaluate symlinks in `path` within a scope `root` and return -// a result guaranteed to be contained within the scope `root`, at the time of the call. -// Symlinks in `root` are not evaluated and left as-is. -// Errors encountered while attempting to evaluate symlinks in path will be returned. -// Non-existing paths are valid and do not constitute an error. -// `path` has to contain `root` as a prefix, or else an error will be returned. -// Trying to break out from `root` does not constitute an error. -// -// Example: -// If /foo/bar -> /outside, -// FollowSymlinkInScope("/foo/bar", "/foo") == "/foo/outside" instead of "/oustide" -// -// IMPORTANT: it is the caller's responsibility to call evalSymlinksInScope *after* relevant symlinks -// are created and not to create subsequently, additional symlinks that could potentially make a -// previously-safe path, unsafe. Example: if /foo/bar does not exist, evalSymlinksInScope("/foo/bar", "/foo") -// would return "/foo/bar". If one makes /foo/bar a symlink to /baz subsequently, then "/foo/bar" should -// no longer be considered safely contained in "/foo". -func evalSymlinksInScope(path, root string) (string, error) { - root = filepath.Clean(root) - if path == root { - return path, nil - } - if !strings.HasPrefix(path, root) { - return "", errors.New("evalSymlinksInScope: " + path + " is not in " + root) - } - const maxIter = 255 - originalPath := path - // given root of "/a" and path of "/a/b/../../c" we want path to be "/b/../../c" - path = path[len(root):] - if root == string(filepath.Separator) { - path = string(filepath.Separator) + path - } - if !strings.HasPrefix(path, string(filepath.Separator)) { - return "", errors.New("evalSymlinksInScope: " + path + " is not in " + root) - } - path = filepath.Clean(path) - // consume path by taking each frontmost path element, - // expanding it if it's a symlink, and appending it to b - var b bytes.Buffer - // b here will always be considered to be the "current absolute path inside - // root" when we append paths to it, we also append a slash and use - // filepath.Clean after the loop to trim the trailing slash - for n := 0; path != ""; n++ { - if n > maxIter { - return "", errors.New("evalSymlinksInScope: too many links in " + originalPath) - } - - // find next path component, p - i := strings.IndexRune(path, filepath.Separator) - var p string - if i == -1 { - p, path = path, "" - } else { - p, path = path[:i], path[i+1:] - } - - if p == "" { - continue - } - - // this takes a b.String() like "b/../" and a p like "c" and turns it - // into "/b/../c" which then gets filepath.Cleaned into "/c" and then - // root gets prepended and we Clean again (to remove any trailing slash - // if the first Clean gave us just "/") - cleanP := filepath.Clean(string(filepath.Separator) + b.String() + p) - if isDriveOrRoot(cleanP) { - // never Lstat "/" itself, or drive letters on Windows - b.Reset() - continue - } - fullP := filepath.Clean(root + cleanP) - - fi, err := os.Lstat(fullP) - if os.IsNotExist(err) { - // if p does not exist, accept it - b.WriteString(p) - b.WriteRune(filepath.Separator) - continue - } - if err != nil { - return "", err - } - if fi.Mode()&os.ModeSymlink == 0 { - b.WriteString(p) - b.WriteRune(filepath.Separator) - continue - } - - // it's a symlink, put it at the front of path - dest, err := os.Readlink(fullP) - if err != nil { - return "", err - } - if system.IsAbs(dest) { - b.Reset() - } - path = dest + string(filepath.Separator) + path - } - - // see note above on "fullP := ..." for why this is double-cleaned and - // what's happening here - return filepath.Clean(root + filepath.Clean(string(filepath.Separator)+b.String())), nil -} - -// EvalSymlinks returns the path name after the evaluation of any symbolic -// links. -// If path is relative the result will be relative to the current directory, -// unless one of the components is an absolute symbolic link. -// This version has been updated to support long paths prepended with `\\?\`. -func EvalSymlinks(path string) (string, error) { - return evalSymlinks(path) -} diff --git a/vendor/github.com/docker/docker/pkg/symlink/fs_unix.go b/vendor/github.com/docker/docker/pkg/symlink/fs_unix.go deleted file mode 100644 index 22708273d..000000000 --- a/vendor/github.com/docker/docker/pkg/symlink/fs_unix.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build !windows - -package symlink - -import ( - "path/filepath" -) - -func evalSymlinks(path string) (string, error) { - return filepath.EvalSymlinks(path) -} - -func isDriveOrRoot(p string) bool { - return p == string(filepath.Separator) -} diff --git a/vendor/github.com/docker/docker/pkg/symlink/fs_unix_test.go b/vendor/github.com/docker/docker/pkg/symlink/fs_unix_test.go deleted file mode 100644 index 7085c0b66..000000000 --- a/vendor/github.com/docker/docker/pkg/symlink/fs_unix_test.go +++ /dev/null @@ -1,407 +0,0 @@ -// +build !windows - -// Licensed under the Apache License, Version 2.0; See LICENSE.APACHE - -package symlink - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "testing" -) - -// TODO Windows: This needs some serious work to port to Windows. For now, -// turning off testing in this package. - -type dirOrLink struct { - path string - target string -} - -func makeFs(tmpdir string, fs []dirOrLink) error { - for _, s := range fs { - s.path = filepath.Join(tmpdir, s.path) - if s.target == "" { - os.MkdirAll(s.path, 0755) - continue - } - if err := os.MkdirAll(filepath.Dir(s.path), 0755); err != nil { - return err - } - if err := os.Symlink(s.target, s.path); err != nil && !os.IsExist(err) { - return err - } - } - return nil -} - -func testSymlink(tmpdir, path, expected, scope string) error { - rewrite, err := FollowSymlinkInScope(filepath.Join(tmpdir, path), filepath.Join(tmpdir, scope)) - if err != nil { - return err - } - expected, err = filepath.Abs(filepath.Join(tmpdir, expected)) - if err != nil { - return err - } - if expected != rewrite { - return fmt.Errorf("Expected %q got %q", expected, rewrite) - } - return nil -} - -func TestFollowSymlinkAbsolute(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkAbsolute") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - if err := makeFs(tmpdir, []dirOrLink{{path: "testdata/fs/a/d", target: "/b"}}); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "testdata/fs/a/d/c/data", "testdata/b/c/data", "testdata"); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkRelativePath(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkRelativePath") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - if err := makeFs(tmpdir, []dirOrLink{{path: "testdata/fs/i", target: "a"}}); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "testdata/fs/i", "testdata/fs/a", "testdata"); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkSkipSymlinksOutsideScope(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkSkipSymlinksOutsideScope") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - if err := makeFs(tmpdir, []dirOrLink{ - {path: "linkdir", target: "realdir"}, - {path: "linkdir/foo/bar"}, - }); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "linkdir/foo/bar", "linkdir/foo/bar", "linkdir/foo"); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkInvalidScopePathPair(t *testing.T) { - if _, err := FollowSymlinkInScope("toto", "testdata"); err == nil { - t.Fatal("expected an error") - } -} - -func TestFollowSymlinkLastLink(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkLastLink") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - if err := makeFs(tmpdir, []dirOrLink{{path: "testdata/fs/a/d", target: "/b"}}); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "testdata/fs/a/d", "testdata/b", "testdata"); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkRelativeLinkChangeScope(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkRelativeLinkChangeScope") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - if err := makeFs(tmpdir, []dirOrLink{{path: "testdata/fs/a/e", target: "../b"}}); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "testdata/fs/a/e/c/data", "testdata/fs/b/c/data", "testdata"); err != nil { - t.Fatal(err) - } - // avoid letting allowing symlink e lead us to ../b - // normalize to the "testdata/fs/a" - if err := testSymlink(tmpdir, "testdata/fs/a/e", "testdata/fs/a/b", "testdata/fs/a"); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkDeepRelativeLinkChangeScope(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkDeepRelativeLinkChangeScope") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - if err := makeFs(tmpdir, []dirOrLink{{path: "testdata/fs/a/f", target: "../../../../test"}}); err != nil { - t.Fatal(err) - } - // avoid letting symlink f lead us out of the "testdata" scope - // we don't normalize because symlink f is in scope and there is no - // information leak - if err := testSymlink(tmpdir, "testdata/fs/a/f", "testdata/test", "testdata"); err != nil { - t.Fatal(err) - } - // avoid letting symlink f lead us out of the "testdata/fs" scope - // we don't normalize because symlink f is in scope and there is no - // information leak - if err := testSymlink(tmpdir, "testdata/fs/a/f", "testdata/fs/test", "testdata/fs"); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkRelativeLinkChain(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkRelativeLinkChain") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - // avoid letting symlink g (pointed at by symlink h) take out of scope - // TODO: we should probably normalize to scope here because ../[....]/root - // is out of scope and we leak information - if err := makeFs(tmpdir, []dirOrLink{ - {path: "testdata/fs/b/h", target: "../g"}, - {path: "testdata/fs/g", target: "../../../../../../../../../../../../root"}, - }); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "testdata/fs/b/h", "testdata/root", "testdata"); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkBreakoutPath(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkBreakoutPath") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - // avoid letting symlink -> ../directory/file escape from scope - // normalize to "testdata/fs/j" - if err := makeFs(tmpdir, []dirOrLink{{path: "testdata/fs/j/k", target: "../i/a"}}); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "testdata/fs/j/k", "testdata/fs/j/i/a", "testdata/fs/j"); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkToRoot(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkToRoot") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - // make sure we don't allow escaping to / - // normalize to dir - if err := makeFs(tmpdir, []dirOrLink{{path: "foo", target: "/"}}); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "foo", "", ""); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkSlashDotdot(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkSlashDotdot") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - tmpdir = filepath.Join(tmpdir, "dir", "subdir") - - // make sure we don't allow escaping to / - // normalize to dir - if err := makeFs(tmpdir, []dirOrLink{{path: "foo", target: "/../../"}}); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "foo", "", ""); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkDotdot(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkDotdot") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - tmpdir = filepath.Join(tmpdir, "dir", "subdir") - - // make sure we stay in scope without leaking information - // this also checks for escaping to / - // normalize to dir - if err := makeFs(tmpdir, []dirOrLink{{path: "foo", target: "../../"}}); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "foo", "", ""); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkRelativePath2(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkRelativePath2") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - if err := makeFs(tmpdir, []dirOrLink{{path: "bar/foo", target: "baz/target"}}); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "bar/foo", "bar/baz/target", ""); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkScopeLink(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkScopeLink") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - if err := makeFs(tmpdir, []dirOrLink{ - {path: "root2"}, - {path: "root", target: "root2"}, - {path: "root2/foo", target: "../bar"}, - }); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "root/foo", "root/bar", "root"); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkRootScope(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkRootScope") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - expected, err := filepath.EvalSymlinks(tmpdir) - if err != nil { - t.Fatal(err) - } - rewrite, err := FollowSymlinkInScope(tmpdir, "/") - if err != nil { - t.Fatal(err) - } - if rewrite != expected { - t.Fatalf("expected %q got %q", expected, rewrite) - } -} - -func TestFollowSymlinkEmpty(t *testing.T) { - res, err := FollowSymlinkInScope("", "") - if err != nil { - t.Fatal(err) - } - wd, err := os.Getwd() - if err != nil { - t.Fatal(err) - } - if res != wd { - t.Fatalf("expected %q got %q", wd, res) - } -} - -func TestFollowSymlinkCircular(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkCircular") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - if err := makeFs(tmpdir, []dirOrLink{{path: "root/foo", target: "foo"}}); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "root/foo", "", "root"); err == nil { - t.Fatal("expected an error for foo -> foo") - } - - if err := makeFs(tmpdir, []dirOrLink{ - {path: "root/bar", target: "baz"}, - {path: "root/baz", target: "../bak"}, - {path: "root/bak", target: "/bar"}, - }); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "root/foo", "", "root"); err == nil { - t.Fatal("expected an error for bar -> baz -> bak -> bar") - } -} - -func TestFollowSymlinkComplexChainWithTargetPathsContainingLinks(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkComplexChainWithTargetPathsContainingLinks") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - if err := makeFs(tmpdir, []dirOrLink{ - {path: "root2"}, - {path: "root", target: "root2"}, - {path: "root/a", target: "r/s"}, - {path: "root/r", target: "../root/t"}, - {path: "root/root/t/s/b", target: "/../u"}, - {path: "root/u/c", target: "."}, - {path: "root/u/x/y", target: "../v"}, - {path: "root/u/v", target: "/../w"}, - }); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "root/a/b/c/x/y/z", "root/w/z", "root"); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkBreakoutNonExistent(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkBreakoutNonExistent") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - if err := makeFs(tmpdir, []dirOrLink{ - {path: "root/slash", target: "/"}, - {path: "root/sym", target: "/idontexist/../slash"}, - }); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "root/sym/file", "root/file", "root"); err != nil { - t.Fatal(err) - } -} - -func TestFollowSymlinkNoLexicalCleaning(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "TestFollowSymlinkNoLexicalCleaning") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - if err := makeFs(tmpdir, []dirOrLink{ - {path: "root/sym", target: "/foo/bar"}, - {path: "root/hello", target: "/sym/../baz"}, - }); err != nil { - t.Fatal(err) - } - if err := testSymlink(tmpdir, "root/hello", "root/foo/baz", "root"); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/docker/pkg/symlink/fs_windows.go b/vendor/github.com/docker/docker/pkg/symlink/fs_windows.go deleted file mode 100644 index 241e531f9..000000000 --- a/vendor/github.com/docker/docker/pkg/symlink/fs_windows.go +++ /dev/null @@ -1,169 +0,0 @@ -package symlink - -import ( - "bytes" - "errors" - "os" - "path/filepath" - "strings" - "syscall" - - "github.com/docker/docker/pkg/longpath" -) - -func toShort(path string) (string, error) { - p, err := syscall.UTF16FromString(path) - if err != nil { - return "", err - } - b := p // GetShortPathName says we can reuse buffer - n, err := syscall.GetShortPathName(&p[0], &b[0], uint32(len(b))) - if err != nil { - return "", err - } - if n > uint32(len(b)) { - b = make([]uint16, n) - if _, err = syscall.GetShortPathName(&p[0], &b[0], uint32(len(b))); err != nil { - return "", err - } - } - return syscall.UTF16ToString(b), nil -} - -func toLong(path string) (string, error) { - p, err := syscall.UTF16FromString(path) - if err != nil { - return "", err - } - b := p // GetLongPathName says we can reuse buffer - n, err := syscall.GetLongPathName(&p[0], &b[0], uint32(len(b))) - if err != nil { - return "", err - } - if n > uint32(len(b)) { - b = make([]uint16, n) - n, err = syscall.GetLongPathName(&p[0], &b[0], uint32(len(b))) - if err != nil { - return "", err - } - } - b = b[:n] - return syscall.UTF16ToString(b), nil -} - -func evalSymlinks(path string) (string, error) { - path, err := walkSymlinks(path) - if err != nil { - return "", err - } - - p, err := toShort(path) - if err != nil { - return "", err - } - p, err = toLong(p) - if err != nil { - return "", err - } - // syscall.GetLongPathName does not change the case of the drive letter, - // but the result of EvalSymlinks must be unique, so we have - // EvalSymlinks(`c:\a`) == EvalSymlinks(`C:\a`). - // Make drive letter upper case. - if len(p) >= 2 && p[1] == ':' && 'a' <= p[0] && p[0] <= 'z' { - p = string(p[0]+'A'-'a') + p[1:] - } else if len(p) >= 6 && p[5] == ':' && 'a' <= p[4] && p[4] <= 'z' { - p = p[:3] + string(p[4]+'A'-'a') + p[5:] - } - return filepath.Clean(p), nil -} - -const utf8RuneSelf = 0x80 - -func walkSymlinks(path string) (string, error) { - const maxIter = 255 - originalPath := path - // consume path by taking each frontmost path element, - // expanding it if it's a symlink, and appending it to b - var b bytes.Buffer - for n := 0; path != ""; n++ { - if n > maxIter { - return "", errors.New("EvalSymlinks: too many links in " + originalPath) - } - - // A path beginning with `\\?\` represents the root, so automatically - // skip that part and begin processing the next segment. - if strings.HasPrefix(path, longpath.Prefix) { - b.WriteString(longpath.Prefix) - path = path[4:] - continue - } - - // find next path component, p - var i = -1 - for j, c := range path { - if c < utf8RuneSelf && os.IsPathSeparator(uint8(c)) { - i = j - break - } - } - var p string - if i == -1 { - p, path = path, "" - } else { - p, path = path[:i], path[i+1:] - } - - if p == "" { - if b.Len() == 0 { - // must be absolute path - b.WriteRune(filepath.Separator) - } - continue - } - - // If this is the first segment after the long path prefix, accept the - // current segment as a volume root or UNC share and move on to the next. - if b.String() == longpath.Prefix { - b.WriteString(p) - b.WriteRune(filepath.Separator) - continue - } - - fi, err := os.Lstat(b.String() + p) - if err != nil { - return "", err - } - if fi.Mode()&os.ModeSymlink == 0 { - b.WriteString(p) - if path != "" || (b.Len() == 2 && len(p) == 2 && p[1] == ':') { - b.WriteRune(filepath.Separator) - } - continue - } - - // it's a symlink, put it at the front of path - dest, err := os.Readlink(b.String() + p) - if err != nil { - return "", err - } - if filepath.IsAbs(dest) || os.IsPathSeparator(dest[0]) { - b.Reset() - } - path = dest + string(filepath.Separator) + path - } - return filepath.Clean(b.String()), nil -} - -func isDriveOrRoot(p string) bool { - if p == string(filepath.Separator) { - return true - } - - length := len(p) - if length >= 2 { - if p[length-1] == ':' && (('a' <= p[length-2] && p[length-2] <= 'z') || ('A' <= p[length-2] && p[length-2] <= 'Z')) { - return true - } - } - return false -} diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/README.md b/vendor/github.com/docker/docker/pkg/sysinfo/README.md deleted file mode 100644 index c1530cef0..000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/README.md +++ /dev/null @@ -1 +0,0 @@ -SysInfo stores information about which features a kernel supports. diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/numcpu.go b/vendor/github.com/docker/docker/pkg/sysinfo/numcpu.go deleted file mode 100644 index aeb1a3a80..000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/numcpu.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !linux,!windows - -package sysinfo - -import ( - "runtime" -) - -// NumCPU returns the number of CPUs -func NumCPU() int { - return runtime.NumCPU() -} diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_linux.go b/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_linux.go deleted file mode 100644 index 5eacd3512..000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_linux.go +++ /dev/null @@ -1,43 +0,0 @@ -// +build linux - -package sysinfo - -import ( - "runtime" - "syscall" - "unsafe" -) - -// numCPU queries the system for the count of threads available -// for use to this process. -// -// Issues two syscalls. -// Returns 0 on errors. Use |runtime.NumCPU| in that case. -func numCPU() int { - // Gets the affinity mask for a process: The very one invoking this function. - pid, _, _ := syscall.RawSyscall(syscall.SYS_GETPID, 0, 0, 0) - - var mask [1024 / 64]uintptr - _, _, err := syscall.RawSyscall(syscall.SYS_SCHED_GETAFFINITY, pid, uintptr(len(mask)*8), uintptr(unsafe.Pointer(&mask[0]))) - if err != 0 { - return 0 - } - - // For every available thread a bit is set in the mask. - ncpu := 0 - for _, e := range mask { - if e == 0 { - continue - } - ncpu += int(popcnt(uint64(e))) - } - return ncpu -} - -// NumCPU returns the number of CPUs which are currently online -func NumCPU() int { - if ncpu := numCPU(); ncpu > 0 { - return ncpu - } - return runtime.NumCPU() -} diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_windows.go b/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_windows.go deleted file mode 100644 index 1d89dd550..000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_windows.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build windows - -package sysinfo - -import ( - "runtime" - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - kernel32 = windows.NewLazySystemDLL("kernel32.dll") - getCurrentProcess = kernel32.NewProc("GetCurrentProcess") - getProcessAffinityMask = kernel32.NewProc("GetProcessAffinityMask") -) - -func numCPU() int { - // Gets the affinity mask for a process - var mask, sysmask uintptr - currentProcess, _, _ := getCurrentProcess.Call() - ret, _, _ := getProcessAffinityMask.Call(currentProcess, uintptr(unsafe.Pointer(&mask)), uintptr(unsafe.Pointer(&sysmask))) - if ret == 0 { - return 0 - } - // For every available thread a bit is set in the mask. - ncpu := int(popcnt(uint64(mask))) - return ncpu -} - -// NumCPU returns the number of CPUs which are currently online -func NumCPU() int { - if ncpu := numCPU(); ncpu > 0 { - return ncpu - } - return runtime.NumCPU() -} diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo.go b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo.go deleted file mode 100644 index f046de4b1..000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo.go +++ /dev/null @@ -1,144 +0,0 @@ -package sysinfo - -import "github.com/docker/docker/pkg/parsers" - -// SysInfo stores information about which features a kernel supports. -// TODO Windows: Factor out platform specific capabilities. -type SysInfo struct { - // Whether the kernel supports AppArmor or not - AppArmor bool - // Whether the kernel supports Seccomp or not - Seccomp bool - - cgroupMemInfo - cgroupCPUInfo - cgroupBlkioInfo - cgroupCpusetInfo - cgroupPids - - // Whether IPv4 forwarding is supported or not, if this was disabled, networking will not work - IPv4ForwardingDisabled bool - - // Whether bridge-nf-call-iptables is supported or not - BridgeNFCallIPTablesDisabled bool - - // Whether bridge-nf-call-ip6tables is supported or not - BridgeNFCallIP6TablesDisabled bool - - // Whether the cgroup has the mountpoint of "devices" or not - CgroupDevicesEnabled bool -} - -type cgroupMemInfo struct { - // Whether memory limit is supported or not - MemoryLimit bool - - // Whether swap limit is supported or not - SwapLimit bool - - // Whether soft limit is supported or not - MemoryReservation bool - - // Whether OOM killer disable is supported or not - OomKillDisable bool - - // Whether memory swappiness is supported or not - MemorySwappiness bool - - // Whether kernel memory limit is supported or not - KernelMemory bool -} - -type cgroupCPUInfo struct { - // Whether CPU shares is supported or not - CPUShares bool - - // Whether CPU CFS(Completely Fair Scheduler) period is supported or not - CPUCfsPeriod bool - - // Whether CPU CFS(Completely Fair Scheduler) quota is supported or not - CPUCfsQuota bool - - // Whether CPU real-time period is supported or not - CPURealtimePeriod bool - - // Whether CPU real-time runtime is supported or not - CPURealtimeRuntime bool -} - -type cgroupBlkioInfo struct { - // Whether Block IO weight is supported or not - BlkioWeight bool - - // Whether Block IO weight_device is supported or not - BlkioWeightDevice bool - - // Whether Block IO read limit in bytes per second is supported or not - BlkioReadBpsDevice bool - - // Whether Block IO write limit in bytes per second is supported or not - BlkioWriteBpsDevice bool - - // Whether Block IO read limit in IO per second is supported or not - BlkioReadIOpsDevice bool - - // Whether Block IO write limit in IO per second is supported or not - BlkioWriteIOpsDevice bool -} - -type cgroupCpusetInfo struct { - // Whether Cpuset is supported or not - Cpuset bool - - // Available Cpuset's cpus - Cpus string - - // Available Cpuset's memory nodes - Mems string -} - -type cgroupPids struct { - // Whether Pids Limit is supported or not - PidsLimit bool -} - -// IsCpusetCpusAvailable returns `true` if the provided string set is contained -// in cgroup's cpuset.cpus set, `false` otherwise. -// If error is not nil a parsing error occurred. -func (c cgroupCpusetInfo) IsCpusetCpusAvailable(provided string) (bool, error) { - return isCpusetListAvailable(provided, c.Cpus) -} - -// IsCpusetMemsAvailable returns `true` if the provided string set is contained -// in cgroup's cpuset.mems set, `false` otherwise. -// If error is not nil a parsing error occurred. -func (c cgroupCpusetInfo) IsCpusetMemsAvailable(provided string) (bool, error) { - return isCpusetListAvailable(provided, c.Mems) -} - -func isCpusetListAvailable(provided, available string) (bool, error) { - parsedProvided, err := parsers.ParseUintList(provided) - if err != nil { - return false, err - } - parsedAvailable, err := parsers.ParseUintList(available) - if err != nil { - return false, err - } - for k := range parsedProvided { - if !parsedAvailable[k] { - return false, nil - } - } - return true, nil -} - -// Returns bit count of 1, used by NumCPU -func popcnt(x uint64) (n byte) { - x -= (x >> 1) & 0x5555555555555555 - x = (x>>2)&0x3333333333333333 + x&0x3333333333333333 - x += x >> 4 - x &= 0x0f0f0f0f0f0f0f0f - x *= 0x0101010101010101 - return byte(x >> 56) -} diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_linux.go b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_linux.go deleted file mode 100644 index 7ad84a830..000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_linux.go +++ /dev/null @@ -1,259 +0,0 @@ -package sysinfo - -import ( - "fmt" - "io/ioutil" - "os" - "path" - "strings" - "syscall" - - "github.com/Sirupsen/logrus" - "github.com/opencontainers/runc/libcontainer/cgroups" -) - -const ( - // SeccompModeFilter refers to the syscall argument SECCOMP_MODE_FILTER. - SeccompModeFilter = uintptr(2) -) - -func findCgroupMountpoints() (map[string]string, error) { - cgMounts, err := cgroups.GetCgroupMounts(false) - if err != nil { - return nil, fmt.Errorf("Failed to parse cgroup information: %v", err) - } - mps := make(map[string]string) - for _, m := range cgMounts { - for _, ss := range m.Subsystems { - mps[ss] = m.Mountpoint - } - } - return mps, nil -} - -// New returns a new SysInfo, using the filesystem to detect which features -// the kernel supports. If `quiet` is `false` warnings are printed in logs -// whenever an error occurs or misconfigurations are present. -func New(quiet bool) *SysInfo { - sysInfo := &SysInfo{} - cgMounts, err := findCgroupMountpoints() - if err != nil { - logrus.Warnf("Failed to parse cgroup information: %v", err) - } else { - sysInfo.cgroupMemInfo = checkCgroupMem(cgMounts, quiet) - sysInfo.cgroupCPUInfo = checkCgroupCPU(cgMounts, quiet) - sysInfo.cgroupBlkioInfo = checkCgroupBlkioInfo(cgMounts, quiet) - sysInfo.cgroupCpusetInfo = checkCgroupCpusetInfo(cgMounts, quiet) - sysInfo.cgroupPids = checkCgroupPids(quiet) - } - - _, ok := cgMounts["devices"] - sysInfo.CgroupDevicesEnabled = ok - - sysInfo.IPv4ForwardingDisabled = !readProcBool("/proc/sys/net/ipv4/ip_forward") - sysInfo.BridgeNFCallIPTablesDisabled = !readProcBool("/proc/sys/net/bridge/bridge-nf-call-iptables") - sysInfo.BridgeNFCallIP6TablesDisabled = !readProcBool("/proc/sys/net/bridge/bridge-nf-call-ip6tables") - - // Check if AppArmor is supported. - if _, err := os.Stat("/sys/kernel/security/apparmor"); !os.IsNotExist(err) { - sysInfo.AppArmor = true - } - - // Check if Seccomp is supported, via CONFIG_SECCOMP. - if _, _, err := syscall.RawSyscall(syscall.SYS_PRCTL, syscall.PR_GET_SECCOMP, 0, 0); err != syscall.EINVAL { - // Make sure the kernel has CONFIG_SECCOMP_FILTER. - if _, _, err := syscall.RawSyscall(syscall.SYS_PRCTL, syscall.PR_SET_SECCOMP, SeccompModeFilter, 0); err != syscall.EINVAL { - sysInfo.Seccomp = true - } - } - - return sysInfo -} - -// checkCgroupMem reads the memory information from the memory cgroup mount point. -func checkCgroupMem(cgMounts map[string]string, quiet bool) cgroupMemInfo { - mountPoint, ok := cgMounts["memory"] - if !ok { - if !quiet { - logrus.Warn("Your kernel does not support cgroup memory limit") - } - return cgroupMemInfo{} - } - - swapLimit := cgroupEnabled(mountPoint, "memory.memsw.limit_in_bytes") - if !quiet && !swapLimit { - logrus.Warn("Your kernel does not support swap memory limit") - } - memoryReservation := cgroupEnabled(mountPoint, "memory.soft_limit_in_bytes") - if !quiet && !memoryReservation { - logrus.Warn("Your kernel does not support memory reservation") - } - oomKillDisable := cgroupEnabled(mountPoint, "memory.oom_control") - if !quiet && !oomKillDisable { - logrus.Warn("Your kernel does not support oom control") - } - memorySwappiness := cgroupEnabled(mountPoint, "memory.swappiness") - if !quiet && !memorySwappiness { - logrus.Warn("Your kernel does not support memory swappiness") - } - kernelMemory := cgroupEnabled(mountPoint, "memory.kmem.limit_in_bytes") - if !quiet && !kernelMemory { - logrus.Warn("Your kernel does not support kernel memory limit") - } - - return cgroupMemInfo{ - MemoryLimit: true, - SwapLimit: swapLimit, - MemoryReservation: memoryReservation, - OomKillDisable: oomKillDisable, - MemorySwappiness: memorySwappiness, - KernelMemory: kernelMemory, - } -} - -// checkCgroupCPU reads the cpu information from the cpu cgroup mount point. -func checkCgroupCPU(cgMounts map[string]string, quiet bool) cgroupCPUInfo { - mountPoint, ok := cgMounts["cpu"] - if !ok { - if !quiet { - logrus.Warn("Unable to find cpu cgroup in mounts") - } - return cgroupCPUInfo{} - } - - cpuShares := cgroupEnabled(mountPoint, "cpu.shares") - if !quiet && !cpuShares { - logrus.Warn("Your kernel does not support cgroup cpu shares") - } - - cpuCfsPeriod := cgroupEnabled(mountPoint, "cpu.cfs_period_us") - if !quiet && !cpuCfsPeriod { - logrus.Warn("Your kernel does not support cgroup cfs period") - } - - cpuCfsQuota := cgroupEnabled(mountPoint, "cpu.cfs_quota_us") - if !quiet && !cpuCfsQuota { - logrus.Warn("Your kernel does not support cgroup cfs quotas") - } - - cpuRealtimePeriod := cgroupEnabled(mountPoint, "cpu.rt_period_us") - if !quiet && !cpuRealtimePeriod { - logrus.Warn("Your kernel does not support cgroup rt period") - } - - cpuRealtimeRuntime := cgroupEnabled(mountPoint, "cpu.rt_runtime_us") - if !quiet && !cpuRealtimeRuntime { - logrus.Warn("Your kernel does not support cgroup rt runtime") - } - - return cgroupCPUInfo{ - CPUShares: cpuShares, - CPUCfsPeriod: cpuCfsPeriod, - CPUCfsQuota: cpuCfsQuota, - CPURealtimePeriod: cpuRealtimePeriod, - CPURealtimeRuntime: cpuRealtimeRuntime, - } -} - -// checkCgroupBlkioInfo reads the blkio information from the blkio cgroup mount point. -func checkCgroupBlkioInfo(cgMounts map[string]string, quiet bool) cgroupBlkioInfo { - mountPoint, ok := cgMounts["blkio"] - if !ok { - if !quiet { - logrus.Warn("Unable to find blkio cgroup in mounts") - } - return cgroupBlkioInfo{} - } - - weight := cgroupEnabled(mountPoint, "blkio.weight") - if !quiet && !weight { - logrus.Warn("Your kernel does not support cgroup blkio weight") - } - - weightDevice := cgroupEnabled(mountPoint, "blkio.weight_device") - if !quiet && !weightDevice { - logrus.Warn("Your kernel does not support cgroup blkio weight_device") - } - - readBpsDevice := cgroupEnabled(mountPoint, "blkio.throttle.read_bps_device") - if !quiet && !readBpsDevice { - logrus.Warn("Your kernel does not support cgroup blkio throttle.read_bps_device") - } - - writeBpsDevice := cgroupEnabled(mountPoint, "blkio.throttle.write_bps_device") - if !quiet && !writeBpsDevice { - logrus.Warn("Your kernel does not support cgroup blkio throttle.write_bps_device") - } - readIOpsDevice := cgroupEnabled(mountPoint, "blkio.throttle.read_iops_device") - if !quiet && !readIOpsDevice { - logrus.Warn("Your kernel does not support cgroup blkio throttle.read_iops_device") - } - - writeIOpsDevice := cgroupEnabled(mountPoint, "blkio.throttle.write_iops_device") - if !quiet && !writeIOpsDevice { - logrus.Warn("Your kernel does not support cgroup blkio throttle.write_iops_device") - } - return cgroupBlkioInfo{ - BlkioWeight: weight, - BlkioWeightDevice: weightDevice, - BlkioReadBpsDevice: readBpsDevice, - BlkioWriteBpsDevice: writeBpsDevice, - BlkioReadIOpsDevice: readIOpsDevice, - BlkioWriteIOpsDevice: writeIOpsDevice, - } -} - -// checkCgroupCpusetInfo reads the cpuset information from the cpuset cgroup mount point. -func checkCgroupCpusetInfo(cgMounts map[string]string, quiet bool) cgroupCpusetInfo { - mountPoint, ok := cgMounts["cpuset"] - if !ok { - if !quiet { - logrus.Warn("Unable to find cpuset cgroup in mounts") - } - return cgroupCpusetInfo{} - } - - cpus, err := ioutil.ReadFile(path.Join(mountPoint, "cpuset.cpus")) - if err != nil { - return cgroupCpusetInfo{} - } - - mems, err := ioutil.ReadFile(path.Join(mountPoint, "cpuset.mems")) - if err != nil { - return cgroupCpusetInfo{} - } - - return cgroupCpusetInfo{ - Cpuset: true, - Cpus: strings.TrimSpace(string(cpus)), - Mems: strings.TrimSpace(string(mems)), - } -} - -// checkCgroupPids reads the pids information from the pids cgroup mount point. -func checkCgroupPids(quiet bool) cgroupPids { - _, err := cgroups.FindCgroupMountpoint("pids") - if err != nil { - if !quiet { - logrus.Warn(err) - } - return cgroupPids{} - } - - return cgroupPids{ - PidsLimit: true, - } -} - -func cgroupEnabled(mountPoint, name string) bool { - _, err := os.Stat(path.Join(mountPoint, name)) - return err == nil -} - -func readProcBool(path string) bool { - val, err := ioutil.ReadFile(path) - if err != nil { - return false - } - return strings.TrimSpace(string(val)) == "1" -} diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_linux_test.go b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_linux_test.go deleted file mode 100644 index fae0fdffb..000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_linux_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package sysinfo - -import ( - "io/ioutil" - "os" - "path" - "path/filepath" - "testing" -) - -func TestReadProcBool(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "test-sysinfo-proc") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpDir) - - procFile := filepath.Join(tmpDir, "read-proc-bool") - if err := ioutil.WriteFile(procFile, []byte("1"), 644); err != nil { - t.Fatal(err) - } - - if !readProcBool(procFile) { - t.Fatal("expected proc bool to be true, got false") - } - - if err := ioutil.WriteFile(procFile, []byte("0"), 644); err != nil { - t.Fatal(err) - } - if readProcBool(procFile) { - t.Fatal("expected proc bool to be false, got false") - } - - if readProcBool(path.Join(tmpDir, "no-exist")) { - t.Fatal("should be false for non-existent entry") - } - -} - -func TestCgroupEnabled(t *testing.T) { - cgroupDir, err := ioutil.TempDir("", "cgroup-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(cgroupDir) - - if cgroupEnabled(cgroupDir, "test") { - t.Fatal("cgroupEnabled should be false") - } - - if err := ioutil.WriteFile(path.Join(cgroupDir, "test"), []byte{}, 644); err != nil { - t.Fatal(err) - } - - if !cgroupEnabled(cgroupDir, "test") { - t.Fatal("cgroupEnabled should be true") - } -} diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_solaris.go b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_solaris.go deleted file mode 100644 index c858d57e0..000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_solaris.go +++ /dev/null @@ -1,121 +0,0 @@ -// +build solaris,cgo - -package sysinfo - -import ( - "bytes" - "os/exec" - "strconv" - "strings" -) - -/* -#cgo LDFLAGS: -llgrp -#include -#include -#include -int getLgrpCount() { - lgrp_cookie_t lgrpcookie = LGRP_COOKIE_NONE; - uint_t nlgrps; - - if ((lgrpcookie = lgrp_init(LGRP_VIEW_OS)) == LGRP_COOKIE_NONE) { - return -1; - } - nlgrps = lgrp_nlgrps(lgrpcookie); - return nlgrps; -} -*/ -import "C" - -// IsCPUSharesAvailable returns whether CPUShares setting is supported. -// We need FSS to be set as default scheduling class to support CPU Shares -func IsCPUSharesAvailable() bool { - cmd := exec.Command("/usr/sbin/dispadmin", "-d") - outBuf := new(bytes.Buffer) - errBuf := new(bytes.Buffer) - cmd.Stderr = errBuf - cmd.Stdout = outBuf - - if err := cmd.Run(); err != nil { - return false - } - return (strings.Contains(outBuf.String(), "FSS")) -} - -// New returns a new SysInfo, using the filesystem to detect which features -// the kernel supports. -//NOTE Solaris: If we change the below capabilities be sure -// to update verifyPlatformContainerSettings() in daemon_solaris.go -func New(quiet bool) *SysInfo { - sysInfo := &SysInfo{} - sysInfo.cgroupMemInfo = setCgroupMem(quiet) - sysInfo.cgroupCPUInfo = setCgroupCPU(quiet) - sysInfo.cgroupBlkioInfo = setCgroupBlkioInfo(quiet) - sysInfo.cgroupCpusetInfo = setCgroupCPUsetInfo(quiet) - - sysInfo.IPv4ForwardingDisabled = false - - sysInfo.AppArmor = false - - return sysInfo -} - -// setCgroupMem reads the memory information for Solaris. -func setCgroupMem(quiet bool) cgroupMemInfo { - - return cgroupMemInfo{ - MemoryLimit: true, - SwapLimit: true, - MemoryReservation: false, - OomKillDisable: false, - MemorySwappiness: false, - KernelMemory: false, - } -} - -// setCgroupCPU reads the cpu information for Solaris. -func setCgroupCPU(quiet bool) cgroupCPUInfo { - - return cgroupCPUInfo{ - CPUShares: true, - CPUCfsPeriod: false, - CPUCfsQuota: true, - CPURealtimePeriod: false, - CPURealtimeRuntime: false, - } -} - -// blkio switches are not supported in Solaris. -func setCgroupBlkioInfo(quiet bool) cgroupBlkioInfo { - - return cgroupBlkioInfo{ - BlkioWeight: false, - BlkioWeightDevice: false, - } -} - -// setCgroupCPUsetInfo reads the cpuset information for Solaris. -func setCgroupCPUsetInfo(quiet bool) cgroupCpusetInfo { - - return cgroupCpusetInfo{ - Cpuset: true, - Cpus: getCPUCount(), - Mems: getLgrpCount(), - } -} - -func getCPUCount() string { - ncpus := C.sysconf(C._SC_NPROCESSORS_ONLN) - if ncpus <= 0 { - return "" - } - return strconv.FormatInt(int64(ncpus), 16) -} - -func getLgrpCount() string { - nlgrps := C.getLgrpCount() - if nlgrps <= 0 { - return "" - } - return strconv.FormatInt(int64(nlgrps), 16) -} diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_test.go b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_test.go deleted file mode 100644 index b61fbcf54..000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package sysinfo - -import "testing" - -func TestIsCpusetListAvailable(t *testing.T) { - cases := []struct { - provided string - available string - res bool - err bool - }{ - {"1", "0-4", true, false}, - {"01,3", "0-4", true, false}, - {"", "0-7", true, false}, - {"1--42", "0-7", false, true}, - {"1-42", "00-1,8,,9", false, true}, - {"1,41-42", "43,45", false, false}, - {"0-3", "", false, false}, - } - for _, c := range cases { - r, err := isCpusetListAvailable(c.provided, c.available) - if (c.err && err == nil) && r != c.res { - t.Fatalf("Expected pair: %v, %v for %s, %s. Got %v, %v instead", c.res, c.err, c.provided, c.available, (c.err && err == nil), r) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_unix.go b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_unix.go deleted file mode 100644 index 45f3ef1c6..000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_unix.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build !linux,!solaris,!windows - -package sysinfo - -// New returns an empty SysInfo for non linux nor solaris for now. -func New(quiet bool) *SysInfo { - sysInfo := &SysInfo{} - return sysInfo -} diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_windows.go b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_windows.go deleted file mode 100644 index 4e6255bc5..000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_windows.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build windows - -package sysinfo - -// New returns an empty SysInfo for windows for now. -func New(quiet bool) *SysInfo { - sysInfo := &SysInfo{} - return sysInfo -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes.go b/vendor/github.com/docker/docker/pkg/system/chtimes.go deleted file mode 100644 index 7637f12e1..000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes.go +++ /dev/null @@ -1,52 +0,0 @@ -package system - -import ( - "os" - "syscall" - "time" - "unsafe" -) - -var ( - maxTime time.Time -) - -func init() { - if unsafe.Sizeof(syscall.Timespec{}.Nsec) == 8 { - // This is a 64 bit timespec - // os.Chtimes limits time to the following - maxTime = time.Unix(0, 1<<63-1) - } else { - // This is a 32 bit timespec - maxTime = time.Unix(1<<31-1, 0) - } -} - -// Chtimes changes the access time and modified time of a file at the given path -func Chtimes(name string, atime time.Time, mtime time.Time) error { - unixMinTime := time.Unix(0, 0) - unixMaxTime := maxTime - - // If the modified time is prior to the Unix Epoch, or after the - // end of Unix Time, os.Chtimes has undefined behavior - // default to Unix Epoch in this case, just in case - - if atime.Before(unixMinTime) || atime.After(unixMaxTime) { - atime = unixMinTime - } - - if mtime.Before(unixMinTime) || mtime.After(unixMaxTime) { - mtime = unixMinTime - } - - if err := os.Chtimes(name, atime, mtime); err != nil { - return err - } - - // Take platform specific action for setting create time. - if err := setCTime(name, mtime); err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_test.go b/vendor/github.com/docker/docker/pkg/system/chtimes_test.go deleted file mode 100644 index 5c87df32a..000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package system - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" - "time" -) - -// prepareTempFile creates a temporary file in a temporary directory. -func prepareTempFile(t *testing.T) (string, string) { - dir, err := ioutil.TempDir("", "docker-system-test") - if err != nil { - t.Fatal(err) - } - - file := filepath.Join(dir, "exist") - if err := ioutil.WriteFile(file, []byte("hello"), 0644); err != nil { - t.Fatal(err) - } - return file, dir -} - -// TestChtimes tests Chtimes on a tempfile. Test only mTime, because aTime is OS dependent -func TestChtimes(t *testing.T) { - file, dir := prepareTempFile(t) - defer os.RemoveAll(dir) - - beforeUnixEpochTime := time.Unix(0, 0).Add(-100 * time.Second) - unixEpochTime := time.Unix(0, 0) - afterUnixEpochTime := time.Unix(100, 0) - unixMaxTime := maxTime - - // Test both aTime and mTime set to Unix Epoch - Chtimes(file, unixEpochTime, unixEpochTime) - - f, err := os.Stat(file) - if err != nil { - t.Fatal(err) - } - - if f.ModTime() != unixEpochTime { - t.Fatalf("Expected: %s, got: %s", unixEpochTime, f.ModTime()) - } - - // Test aTime before Unix Epoch and mTime set to Unix Epoch - Chtimes(file, beforeUnixEpochTime, unixEpochTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - if f.ModTime() != unixEpochTime { - t.Fatalf("Expected: %s, got: %s", unixEpochTime, f.ModTime()) - } - - // Test aTime set to Unix Epoch and mTime before Unix Epoch - Chtimes(file, unixEpochTime, beforeUnixEpochTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - if f.ModTime() != unixEpochTime { - t.Fatalf("Expected: %s, got: %s", unixEpochTime, f.ModTime()) - } - - // Test both aTime and mTime set to after Unix Epoch (valid time) - Chtimes(file, afterUnixEpochTime, afterUnixEpochTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - if f.ModTime() != afterUnixEpochTime { - t.Fatalf("Expected: %s, got: %s", afterUnixEpochTime, f.ModTime()) - } - - // Test both aTime and mTime set to Unix max time - Chtimes(file, unixMaxTime, unixMaxTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - if f.ModTime().Truncate(time.Second) != unixMaxTime.Truncate(time.Second) { - t.Fatalf("Expected: %s, got: %s", unixMaxTime.Truncate(time.Second), f.ModTime().Truncate(time.Second)) - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go b/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go deleted file mode 100644 index 09d58bcbf..000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !windows - -package system - -import ( - "time" -) - -//setCTime will set the create time on a file. On Unix, the create -//time is updated as a side effect of setting the modified time, so -//no action is required. -func setCTime(path string, ctime time.Time) error { - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_unix_test.go b/vendor/github.com/docker/docker/pkg/system/chtimes_unix_test.go deleted file mode 100644 index 6ec9a7173..000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_unix_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// +build !windows - -package system - -import ( - "os" - "syscall" - "testing" - "time" -) - -// TestChtimesLinux tests Chtimes access time on a tempfile on Linux -func TestChtimesLinux(t *testing.T) { - file, dir := prepareTempFile(t) - defer os.RemoveAll(dir) - - beforeUnixEpochTime := time.Unix(0, 0).Add(-100 * time.Second) - unixEpochTime := time.Unix(0, 0) - afterUnixEpochTime := time.Unix(100, 0) - unixMaxTime := maxTime - - // Test both aTime and mTime set to Unix Epoch - Chtimes(file, unixEpochTime, unixEpochTime) - - f, err := os.Stat(file) - if err != nil { - t.Fatal(err) - } - - stat := f.Sys().(*syscall.Stat_t) - aTime := time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) - if aTime != unixEpochTime { - t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) - } - - // Test aTime before Unix Epoch and mTime set to Unix Epoch - Chtimes(file, beforeUnixEpochTime, unixEpochTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - stat = f.Sys().(*syscall.Stat_t) - aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) - if aTime != unixEpochTime { - t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) - } - - // Test aTime set to Unix Epoch and mTime before Unix Epoch - Chtimes(file, unixEpochTime, beforeUnixEpochTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - stat = f.Sys().(*syscall.Stat_t) - aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) - if aTime != unixEpochTime { - t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) - } - - // Test both aTime and mTime set to after Unix Epoch (valid time) - Chtimes(file, afterUnixEpochTime, afterUnixEpochTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - stat = f.Sys().(*syscall.Stat_t) - aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) - if aTime != afterUnixEpochTime { - t.Fatalf("Expected: %s, got: %s", afterUnixEpochTime, aTime) - } - - // Test both aTime and mTime set to Unix max time - Chtimes(file, unixMaxTime, unixMaxTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - stat = f.Sys().(*syscall.Stat_t) - aTime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) - if aTime.Truncate(time.Second) != unixMaxTime.Truncate(time.Second) { - t.Fatalf("Expected: %s, got: %s", unixMaxTime.Truncate(time.Second), aTime.Truncate(time.Second)) - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go b/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go deleted file mode 100644 index 294586846..000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go +++ /dev/null @@ -1,27 +0,0 @@ -// +build windows - -package system - -import ( - "syscall" - "time" -) - -//setCTime will set the create time on a file. On Windows, this requires -//calling SetFileTime and explicitly including the create time. -func setCTime(path string, ctime time.Time) error { - ctimespec := syscall.NsecToTimespec(ctime.UnixNano()) - pathp, e := syscall.UTF16PtrFromString(path) - if e != nil { - return e - } - h, e := syscall.CreateFile(pathp, - syscall.FILE_WRITE_ATTRIBUTES, syscall.FILE_SHARE_WRITE, nil, - syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS, 0) - if e != nil { - return e - } - defer syscall.Close(h) - c := syscall.NsecToFiletime(syscall.TimespecToNsec(ctimespec)) - return syscall.SetFileTime(h, &c, nil, nil) -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_windows_test.go b/vendor/github.com/docker/docker/pkg/system/chtimes_windows_test.go deleted file mode 100644 index 72d8a1061..000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_windows_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// +build windows - -package system - -import ( - "os" - "syscall" - "testing" - "time" -) - -// TestChtimesWindows tests Chtimes access time on a tempfile on Windows -func TestChtimesWindows(t *testing.T) { - file, dir := prepareTempFile(t) - defer os.RemoveAll(dir) - - beforeUnixEpochTime := time.Unix(0, 0).Add(-100 * time.Second) - unixEpochTime := time.Unix(0, 0) - afterUnixEpochTime := time.Unix(100, 0) - unixMaxTime := maxTime - - // Test both aTime and mTime set to Unix Epoch - Chtimes(file, unixEpochTime, unixEpochTime) - - f, err := os.Stat(file) - if err != nil { - t.Fatal(err) - } - - aTime := time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) - if aTime != unixEpochTime { - t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) - } - - // Test aTime before Unix Epoch and mTime set to Unix Epoch - Chtimes(file, beforeUnixEpochTime, unixEpochTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - aTime = time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) - if aTime != unixEpochTime { - t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) - } - - // Test aTime set to Unix Epoch and mTime before Unix Epoch - Chtimes(file, unixEpochTime, beforeUnixEpochTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - aTime = time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) - if aTime != unixEpochTime { - t.Fatalf("Expected: %s, got: %s", unixEpochTime, aTime) - } - - // Test both aTime and mTime set to after Unix Epoch (valid time) - Chtimes(file, afterUnixEpochTime, afterUnixEpochTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - aTime = time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) - if aTime != afterUnixEpochTime { - t.Fatalf("Expected: %s, got: %s", afterUnixEpochTime, aTime) - } - - // Test both aTime and mTime set to Unix max time - Chtimes(file, unixMaxTime, unixMaxTime) - - f, err = os.Stat(file) - if err != nil { - t.Fatal(err) - } - - aTime = time.Unix(0, f.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds()) - if aTime.Truncate(time.Second) != unixMaxTime.Truncate(time.Second) { - t.Fatalf("Expected: %s, got: %s", unixMaxTime.Truncate(time.Second), aTime.Truncate(time.Second)) - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/errors.go b/vendor/github.com/docker/docker/pkg/system/errors.go deleted file mode 100644 index 288318985..000000000 --- a/vendor/github.com/docker/docker/pkg/system/errors.go +++ /dev/null @@ -1,10 +0,0 @@ -package system - -import ( - "errors" -) - -var ( - // ErrNotSupportedPlatform means the platform is not supported. - ErrNotSupportedPlatform = errors.New("platform and architecture is not supported") -) diff --git a/vendor/github.com/docker/docker/pkg/system/events_windows.go b/vendor/github.com/docker/docker/pkg/system/events_windows.go deleted file mode 100644 index 3ec6d2215..000000000 --- a/vendor/github.com/docker/docker/pkg/system/events_windows.go +++ /dev/null @@ -1,85 +0,0 @@ -package system - -// This file implements syscalls for Win32 events which are not implemented -// in golang. - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - procCreateEvent = modkernel32.NewProc("CreateEventW") - procOpenEvent = modkernel32.NewProc("OpenEventW") - procSetEvent = modkernel32.NewProc("SetEvent") - procResetEvent = modkernel32.NewProc("ResetEvent") - procPulseEvent = modkernel32.NewProc("PulseEvent") -) - -// CreateEvent implements win32 CreateEventW func in golang. It will create an event object. -func CreateEvent(eventAttributes *syscall.SecurityAttributes, manualReset bool, initialState bool, name string) (handle syscall.Handle, err error) { - namep, _ := syscall.UTF16PtrFromString(name) - var _p1 uint32 - if manualReset { - _p1 = 1 - } - var _p2 uint32 - if initialState { - _p2 = 1 - } - r0, _, e1 := procCreateEvent.Call(uintptr(unsafe.Pointer(eventAttributes)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(namep))) - use(unsafe.Pointer(namep)) - handle = syscall.Handle(r0) - if handle == syscall.InvalidHandle { - err = e1 - } - return -} - -// OpenEvent implements win32 OpenEventW func in golang. It opens an event object. -func OpenEvent(desiredAccess uint32, inheritHandle bool, name string) (handle syscall.Handle, err error) { - namep, _ := syscall.UTF16PtrFromString(name) - var _p1 uint32 - if inheritHandle { - _p1 = 1 - } - r0, _, e1 := procOpenEvent.Call(uintptr(desiredAccess), uintptr(_p1), uintptr(unsafe.Pointer(namep))) - use(unsafe.Pointer(namep)) - handle = syscall.Handle(r0) - if handle == syscall.InvalidHandle { - err = e1 - } - return -} - -// SetEvent implements win32 SetEvent func in golang. -func SetEvent(handle syscall.Handle) (err error) { - return setResetPulse(handle, procSetEvent) -} - -// ResetEvent implements win32 ResetEvent func in golang. -func ResetEvent(handle syscall.Handle) (err error) { - return setResetPulse(handle, procResetEvent) -} - -// PulseEvent implements win32 PulseEvent func in golang. -func PulseEvent(handle syscall.Handle) (err error) { - return setResetPulse(handle, procPulseEvent) -} - -func setResetPulse(handle syscall.Handle, proc *windows.LazyProc) (err error) { - r0, _, _ := proc.Call(uintptr(handle)) - if r0 != 0 { - err = syscall.Errno(r0) - } - return -} - -var temp unsafe.Pointer - -// use ensures a variable is kept alive without the GC freeing while still needed -func use(p unsafe.Pointer) { - temp = p -} diff --git a/vendor/github.com/docker/docker/pkg/system/exitcode.go b/vendor/github.com/docker/docker/pkg/system/exitcode.go deleted file mode 100644 index 60f0514b1..000000000 --- a/vendor/github.com/docker/docker/pkg/system/exitcode.go +++ /dev/null @@ -1,33 +0,0 @@ -package system - -import ( - "fmt" - "os/exec" - "syscall" -) - -// GetExitCode returns the ExitStatus of the specified error if its type is -// exec.ExitError, returns 0 and an error otherwise. -func GetExitCode(err error) (int, error) { - exitCode := 0 - if exiterr, ok := err.(*exec.ExitError); ok { - if procExit, ok := exiterr.Sys().(syscall.WaitStatus); ok { - return procExit.ExitStatus(), nil - } - } - return exitCode, fmt.Errorf("failed to get exit code") -} - -// ProcessExitCode process the specified error and returns the exit status code -// if the error was of type exec.ExitError, returns nothing otherwise. -func ProcessExitCode(err error) (exitCode int) { - if err != nil { - var exiterr error - if exitCode, exiterr = GetExitCode(err); exiterr != nil { - // TODO: Fix this so we check the error's text. - // we've failed to retrieve exit code, so we set it to 127 - exitCode = 127 - } - } - return -} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys.go b/vendor/github.com/docker/docker/pkg/system/filesys.go deleted file mode 100644 index 810c79478..000000000 --- a/vendor/github.com/docker/docker/pkg/system/filesys.go +++ /dev/null @@ -1,54 +0,0 @@ -// +build !windows - -package system - -import ( - "os" - "path/filepath" -) - -// MkdirAllWithACL is a wrapper for MkdirAll that creates a directory -// ACL'd for Builtin Administrators and Local System. -func MkdirAllWithACL(path string, perm os.FileMode) error { - return MkdirAll(path, perm) -} - -// MkdirAll creates a directory named path along with any necessary parents, -// with permission specified by attribute perm for all dir created. -func MkdirAll(path string, perm os.FileMode) error { - return os.MkdirAll(path, perm) -} - -// IsAbs is a platform-specific wrapper for filepath.IsAbs. -func IsAbs(path string) bool { - return filepath.IsAbs(path) -} - -// The functions below here are wrappers for the equivalents in the os package. -// They are passthrough on Unix platforms, and only relevant on Windows. - -// CreateSequential creates the named file with mode 0666 (before umask), truncating -// it if it already exists. If successful, methods on the returned -// File can be used for I/O; the associated file descriptor has mode -// O_RDWR. -// If there is an error, it will be of type *PathError. -func CreateSequential(name string) (*os.File, error) { - return os.Create(name) -} - -// OpenSequential opens the named file for reading. If successful, methods on -// the returned file can be used for reading; the associated file -// descriptor has mode O_RDONLY. -// If there is an error, it will be of type *PathError. -func OpenSequential(name string) (*os.File, error) { - return os.Open(name) -} - -// OpenFileSequential is the generalized open call; most users will use Open -// or Create instead. It opens the named file with specified flag -// (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, -// methods on the returned File can be used for I/O. -// If there is an error, it will be of type *PathError. -func OpenFileSequential(name string, flag int, perm os.FileMode) (*os.File, error) { - return os.OpenFile(name, flag, perm) -} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go b/vendor/github.com/docker/docker/pkg/system/filesys_windows.go deleted file mode 100644 index 6094f01fd..000000000 --- a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go +++ /dev/null @@ -1,236 +0,0 @@ -// +build windows - -package system - -import ( - "os" - "path/filepath" - "regexp" - "strings" - "syscall" - "unsafe" - - winio "github.com/Microsoft/go-winio" -) - -// MkdirAllWithACL is a wrapper for MkdirAll that creates a directory -// ACL'd for Builtin Administrators and Local System. -func MkdirAllWithACL(path string, perm os.FileMode) error { - return mkdirall(path, true) -} - -// MkdirAll implementation that is volume path aware for Windows. -func MkdirAll(path string, _ os.FileMode) error { - return mkdirall(path, false) -} - -// mkdirall is a custom version of os.MkdirAll modified for use on Windows -// so that it is both volume path aware, and can create a directory with -// a DACL. -func mkdirall(path string, adminAndLocalSystem bool) error { - if re := regexp.MustCompile(`^\\\\\?\\Volume{[a-z0-9-]+}$`); re.MatchString(path) { - return nil - } - - // The rest of this method is largely copied from os.MkdirAll and should be kept - // as-is to ensure compatibility. - - // Fast path: if we can tell whether path is a directory or file, stop with success or error. - dir, err := os.Stat(path) - if err == nil { - if dir.IsDir() { - return nil - } - return &os.PathError{ - Op: "mkdir", - Path: path, - Err: syscall.ENOTDIR, - } - } - - // Slow path: make sure parent exists and then call Mkdir for path. - i := len(path) - for i > 0 && os.IsPathSeparator(path[i-1]) { // Skip trailing path separator. - i-- - } - - j := i - for j > 0 && !os.IsPathSeparator(path[j-1]) { // Scan backward over element. - j-- - } - - if j > 1 { - // Create parent - err = mkdirall(path[0:j-1], false) - if err != nil { - return err - } - } - - // Parent now exists; invoke os.Mkdir or mkdirWithACL and use its result. - if adminAndLocalSystem { - err = mkdirWithACL(path) - } else { - err = os.Mkdir(path, 0) - } - - if err != nil { - // Handle arguments like "foo/." by - // double-checking that directory doesn't exist. - dir, err1 := os.Lstat(path) - if err1 == nil && dir.IsDir() { - return nil - } - return err - } - return nil -} - -// mkdirWithACL creates a new directory. If there is an error, it will be of -// type *PathError. . -// -// This is a modified and combined version of os.Mkdir and syscall.Mkdir -// in golang to cater for creating a directory am ACL permitting full -// access, with inheritance, to any subfolder/file for Built-in Administrators -// and Local System. -func mkdirWithACL(name string) error { - sa := syscall.SecurityAttributes{Length: 0} - sddl := "D:P(A;OICI;GA;;;BA)(A;OICI;GA;;;SY)" - sd, err := winio.SddlToSecurityDescriptor(sddl) - if err != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: err} - } - sa.Length = uint32(unsafe.Sizeof(sa)) - sa.InheritHandle = 1 - sa.SecurityDescriptor = uintptr(unsafe.Pointer(&sd[0])) - - namep, err := syscall.UTF16PtrFromString(name) - if err != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: err} - } - - e := syscall.CreateDirectory(namep, &sa) - if e != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: e} - } - return nil -} - -// IsAbs is a platform-specific wrapper for filepath.IsAbs. On Windows, -// golang filepath.IsAbs does not consider a path \windows\system32 as absolute -// as it doesn't start with a drive-letter/colon combination. However, in -// docker we need to verify things such as WORKDIR /windows/system32 in -// a Dockerfile (which gets translated to \windows\system32 when being processed -// by the daemon. This SHOULD be treated as absolute from a docker processing -// perspective. -func IsAbs(path string) bool { - if !filepath.IsAbs(path) { - if !strings.HasPrefix(path, string(os.PathSeparator)) { - return false - } - } - return true -} - -// The origin of the functions below here are the golang OS and syscall packages, -// slightly modified to only cope with files, not directories due to the -// specific use case. -// -// The alteration is to allow a file on Windows to be opened with -// FILE_FLAG_SEQUENTIAL_SCAN (particular for docker load), to avoid eating -// the standby list, particularly when accessing large files such as layer.tar. - -// CreateSequential creates the named file with mode 0666 (before umask), truncating -// it if it already exists. If successful, methods on the returned -// File can be used for I/O; the associated file descriptor has mode -// O_RDWR. -// If there is an error, it will be of type *PathError. -func CreateSequential(name string) (*os.File, error) { - return OpenFileSequential(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0) -} - -// OpenSequential opens the named file for reading. If successful, methods on -// the returned file can be used for reading; the associated file -// descriptor has mode O_RDONLY. -// If there is an error, it will be of type *PathError. -func OpenSequential(name string) (*os.File, error) { - return OpenFileSequential(name, os.O_RDONLY, 0) -} - -// OpenFileSequential is the generalized open call; most users will use Open -// or Create instead. -// If there is an error, it will be of type *PathError. -func OpenFileSequential(name string, flag int, _ os.FileMode) (*os.File, error) { - if name == "" { - return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOENT} - } - r, errf := syscallOpenFileSequential(name, flag, 0) - if errf == nil { - return r, nil - } - return nil, &os.PathError{Op: "open", Path: name, Err: errf} -} - -func syscallOpenFileSequential(name string, flag int, _ os.FileMode) (file *os.File, err error) { - r, e := syscallOpenSequential(name, flag|syscall.O_CLOEXEC, 0) - if e != nil { - return nil, e - } - return os.NewFile(uintptr(r), name), nil -} - -func makeInheritSa() *syscall.SecurityAttributes { - var sa syscall.SecurityAttributes - sa.Length = uint32(unsafe.Sizeof(sa)) - sa.InheritHandle = 1 - return &sa -} - -func syscallOpenSequential(path string, mode int, _ uint32) (fd syscall.Handle, err error) { - if len(path) == 0 { - return syscall.InvalidHandle, syscall.ERROR_FILE_NOT_FOUND - } - pathp, err := syscall.UTF16PtrFromString(path) - if err != nil { - return syscall.InvalidHandle, err - } - var access uint32 - switch mode & (syscall.O_RDONLY | syscall.O_WRONLY | syscall.O_RDWR) { - case syscall.O_RDONLY: - access = syscall.GENERIC_READ - case syscall.O_WRONLY: - access = syscall.GENERIC_WRITE - case syscall.O_RDWR: - access = syscall.GENERIC_READ | syscall.GENERIC_WRITE - } - if mode&syscall.O_CREAT != 0 { - access |= syscall.GENERIC_WRITE - } - if mode&syscall.O_APPEND != 0 { - access &^= syscall.GENERIC_WRITE - access |= syscall.FILE_APPEND_DATA - } - sharemode := uint32(syscall.FILE_SHARE_READ | syscall.FILE_SHARE_WRITE) - var sa *syscall.SecurityAttributes - if mode&syscall.O_CLOEXEC == 0 { - sa = makeInheritSa() - } - var createmode uint32 - switch { - case mode&(syscall.O_CREAT|syscall.O_EXCL) == (syscall.O_CREAT | syscall.O_EXCL): - createmode = syscall.CREATE_NEW - case mode&(syscall.O_CREAT|syscall.O_TRUNC) == (syscall.O_CREAT | syscall.O_TRUNC): - createmode = syscall.CREATE_ALWAYS - case mode&syscall.O_CREAT == syscall.O_CREAT: - createmode = syscall.OPEN_ALWAYS - case mode&syscall.O_TRUNC == syscall.O_TRUNC: - createmode = syscall.TRUNCATE_EXISTING - default: - createmode = syscall.OPEN_EXISTING - } - // Use FILE_FLAG_SEQUENTIAL_SCAN rather than FILE_ATTRIBUTE_NORMAL as implemented in golang. - //https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx - const fileFlagSequentialScan = 0x08000000 // FILE_FLAG_SEQUENTIAL_SCAN - h, e := syscall.CreateFile(pathp, access, sharemode, sa, createmode, fileFlagSequentialScan, 0) - return h, e -} diff --git a/vendor/github.com/docker/docker/pkg/system/lstat.go b/vendor/github.com/docker/docker/pkg/system/lstat.go deleted file mode 100644 index bd23c4d50..000000000 --- a/vendor/github.com/docker/docker/pkg/system/lstat.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build !windows - -package system - -import ( - "syscall" -) - -// Lstat takes a path to a file and returns -// a system.StatT type pertaining to that file. -// -// Throws an error if the file does not exist -func Lstat(path string) (*StatT, error) { - s := &syscall.Stat_t{} - if err := syscall.Lstat(path, s); err != nil { - return nil, err - } - return fromStatT(s) -} diff --git a/vendor/github.com/docker/docker/pkg/system/lstat_unix_test.go b/vendor/github.com/docker/docker/pkg/system/lstat_unix_test.go deleted file mode 100644 index 062cf53bf..000000000 --- a/vendor/github.com/docker/docker/pkg/system/lstat_unix_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build linux freebsd - -package system - -import ( - "os" - "testing" -) - -// TestLstat tests Lstat for existing and non existing files -func TestLstat(t *testing.T) { - file, invalid, _, dir := prepareFiles(t) - defer os.RemoveAll(dir) - - statFile, err := Lstat(file) - if err != nil { - t.Fatal(err) - } - if statFile == nil { - t.Fatal("returned empty stat for existing file") - } - - statInvalid, err := Lstat(invalid) - if err == nil { - t.Fatal("did not return error for non-existing file") - } - if statInvalid != nil { - t.Fatal("returned non-nil stat for non-existing file") - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/lstat_windows.go b/vendor/github.com/docker/docker/pkg/system/lstat_windows.go deleted file mode 100644 index 49e87eb40..000000000 --- a/vendor/github.com/docker/docker/pkg/system/lstat_windows.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build windows - -package system - -import ( - "os" -) - -// Lstat calls os.Lstat to get a fileinfo interface back. -// This is then copied into our own locally defined structure. -// Note the Linux version uses fromStatT to do the copy back, -// but that not strictly necessary when already in an OS specific module. -func Lstat(path string) (*StatT, error) { - fi, err := os.Lstat(path) - if err != nil { - return nil, err - } - - return &StatT{ - name: fi.Name(), - size: fi.Size(), - mode: fi.Mode(), - modTime: fi.ModTime(), - isDir: fi.IsDir()}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo.go b/vendor/github.com/docker/docker/pkg/system/meminfo.go deleted file mode 100644 index 3b6e947e6..000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo.go +++ /dev/null @@ -1,17 +0,0 @@ -package system - -// MemInfo contains memory statistics of the host system. -type MemInfo struct { - // Total usable RAM (i.e. physical RAM minus a few reserved bits and the - // kernel binary code). - MemTotal int64 - - // Amount of free memory. - MemFree int64 - - // Total amount of swap space available. - SwapTotal int64 - - // Amount of swap space that is currently unused. - SwapFree int64 -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go b/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go deleted file mode 100644 index 385f1d5e7..000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go +++ /dev/null @@ -1,65 +0,0 @@ -package system - -import ( - "bufio" - "io" - "os" - "strconv" - "strings" - - "github.com/docker/go-units" -) - -// ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. -func ReadMemInfo() (*MemInfo, error) { - file, err := os.Open("/proc/meminfo") - if err != nil { - return nil, err - } - defer file.Close() - return parseMemInfo(file) -} - -// parseMemInfo parses the /proc/meminfo file into -// a MemInfo object given an io.Reader to the file. -// Throws error if there are problems reading from the file -func parseMemInfo(reader io.Reader) (*MemInfo, error) { - meminfo := &MemInfo{} - scanner := bufio.NewScanner(reader) - for scanner.Scan() { - // Expected format: ["MemTotal:", "1234", "kB"] - parts := strings.Fields(scanner.Text()) - - // Sanity checks: Skip malformed entries. - if len(parts) < 3 || parts[2] != "kB" { - continue - } - - // Convert to bytes. - size, err := strconv.Atoi(parts[1]) - if err != nil { - continue - } - bytes := int64(size) * units.KiB - - switch parts[0] { - case "MemTotal:": - meminfo.MemTotal = bytes - case "MemFree:": - meminfo.MemFree = bytes - case "SwapTotal:": - meminfo.SwapTotal = bytes - case "SwapFree:": - meminfo.SwapFree = bytes - } - - } - - // Handle errors that may have occurred during the reading of the file. - if err := scanner.Err(); err != nil { - return nil, err - } - - return meminfo, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_solaris.go b/vendor/github.com/docker/docker/pkg/system/meminfo_solaris.go deleted file mode 100644 index 7f4f84f73..000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_solaris.go +++ /dev/null @@ -1,128 +0,0 @@ -// +build solaris,cgo - -package system - -import ( - "fmt" - "unsafe" -) - -// #cgo LDFLAGS: -lkstat -// #include -// #include -// #include -// #include -// #include -// #include -// struct swaptable *allocSwaptable(int num) { -// struct swaptable *st; -// struct swapent *swapent; -// st = (struct swaptable *)malloc(num * sizeof(swapent_t) + sizeof (int)); -// swapent = st->swt_ent; -// for (int i = 0; i < num; i++,swapent++) { -// swapent->ste_path = (char *)malloc(MAXPATHLEN * sizeof (char)); -// } -// st->swt_n = num; -// return st; -//} -// void freeSwaptable (struct swaptable *st) { -// struct swapent *swapent = st->swt_ent; -// for (int i = 0; i < st->swt_n; i++,swapent++) { -// free(swapent->ste_path); -// } -// free(st); -// } -// swapent_t getSwapEnt(swapent_t *ent, int i) { -// return ent[i]; -// } -// int64_t getPpKernel() { -// int64_t pp_kernel = 0; -// kstat_ctl_t *ksc; -// kstat_t *ks; -// kstat_named_t *knp; -// kid_t kid; -// -// if ((ksc = kstat_open()) == NULL) { -// return -1; -// } -// if ((ks = kstat_lookup(ksc, "unix", 0, "system_pages")) == NULL) { -// return -1; -// } -// if (((kid = kstat_read(ksc, ks, NULL)) == -1) || -// ((knp = kstat_data_lookup(ks, "pp_kernel")) == NULL)) { -// return -1; -// } -// switch (knp->data_type) { -// case KSTAT_DATA_UINT64: -// pp_kernel = knp->value.ui64; -// break; -// case KSTAT_DATA_UINT32: -// pp_kernel = knp->value.ui32; -// break; -// } -// pp_kernel *= sysconf(_SC_PAGESIZE); -// return (pp_kernel > 0 ? pp_kernel : -1); -// } -import "C" - -// Get the system memory info using sysconf same as prtconf -func getTotalMem() int64 { - pagesize := C.sysconf(C._SC_PAGESIZE) - npages := C.sysconf(C._SC_PHYS_PAGES) - return int64(pagesize * npages) -} - -func getFreeMem() int64 { - pagesize := C.sysconf(C._SC_PAGESIZE) - npages := C.sysconf(C._SC_AVPHYS_PAGES) - return int64(pagesize * npages) -} - -// ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. -func ReadMemInfo() (*MemInfo, error) { - - ppKernel := C.getPpKernel() - MemTotal := getTotalMem() - MemFree := getFreeMem() - SwapTotal, SwapFree, err := getSysSwap() - - if ppKernel < 0 || MemTotal < 0 || MemFree < 0 || SwapTotal < 0 || - SwapFree < 0 { - return nil, fmt.Errorf("error getting system memory info %v\n", err) - } - - meminfo := &MemInfo{} - // Total memory is total physical memory less than memory locked by kernel - meminfo.MemTotal = MemTotal - int64(ppKernel) - meminfo.MemFree = MemFree - meminfo.SwapTotal = SwapTotal - meminfo.SwapFree = SwapFree - - return meminfo, nil -} - -func getSysSwap() (int64, int64, error) { - var tSwap int64 - var fSwap int64 - var diskblksPerPage int64 - num, err := C.swapctl(C.SC_GETNSWP, nil) - if err != nil { - return -1, -1, err - } - st := C.allocSwaptable(num) - _, err = C.swapctl(C.SC_LIST, unsafe.Pointer(st)) - if err != nil { - C.freeSwaptable(st) - return -1, -1, err - } - - diskblksPerPage = int64(C.sysconf(C._SC_PAGESIZE) >> C.DEV_BSHIFT) - for i := 0; i < int(num); i++ { - swapent := C.getSwapEnt(&st.swt_ent[0], C.int(i)) - tSwap += int64(swapent.ste_pages) * diskblksPerPage - fSwap += int64(swapent.ste_free) * diskblksPerPage - } - C.freeSwaptable(st) - return tSwap, fSwap, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_unix_test.go b/vendor/github.com/docker/docker/pkg/system/meminfo_unix_test.go deleted file mode 100644 index 44f556288..000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_unix_test.go +++ /dev/null @@ -1,40 +0,0 @@ -// +build linux freebsd - -package system - -import ( - "strings" - "testing" - - "github.com/docker/go-units" -) - -// TestMemInfo tests parseMemInfo with a static meminfo string -func TestMemInfo(t *testing.T) { - const input = ` - MemTotal: 1 kB - MemFree: 2 kB - SwapTotal: 3 kB - SwapFree: 4 kB - Malformed1: - Malformed2: 1 - Malformed3: 2 MB - Malformed4: X kB - ` - meminfo, err := parseMemInfo(strings.NewReader(input)) - if err != nil { - t.Fatal(err) - } - if meminfo.MemTotal != 1*units.KiB { - t.Fatalf("Unexpected MemTotal: %d", meminfo.MemTotal) - } - if meminfo.MemFree != 2*units.KiB { - t.Fatalf("Unexpected MemFree: %d", meminfo.MemFree) - } - if meminfo.SwapTotal != 3*units.KiB { - t.Fatalf("Unexpected SwapTotal: %d", meminfo.SwapTotal) - } - if meminfo.SwapFree != 4*units.KiB { - t.Fatalf("Unexpected SwapFree: %d", meminfo.SwapFree) - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go b/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go deleted file mode 100644 index 3ce019dff..000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !linux,!windows,!solaris - -package system - -// ReadMemInfo is not supported on platforms other than linux and windows. -func ReadMemInfo() (*MemInfo, error) { - return nil, ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_windows.go b/vendor/github.com/docker/docker/pkg/system/meminfo_windows.go deleted file mode 100644 index 883944a4c..000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_windows.go +++ /dev/null @@ -1,45 +0,0 @@ -package system - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - - procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx") -) - -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366770(v=vs.85).aspx -type memorystatusex struct { - dwLength uint32 - dwMemoryLoad uint32 - ullTotalPhys uint64 - ullAvailPhys uint64 - ullTotalPageFile uint64 - ullAvailPageFile uint64 - ullTotalVirtual uint64 - ullAvailVirtual uint64 - ullAvailExtendedVirtual uint64 -} - -// ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. -func ReadMemInfo() (*MemInfo, error) { - msi := &memorystatusex{ - dwLength: 64, - } - r1, _, _ := procGlobalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msi))) - if r1 == 0 { - return &MemInfo{}, nil - } - return &MemInfo{ - MemTotal: int64(msi.ullTotalPhys), - MemFree: int64(msi.ullAvailPhys), - SwapTotal: int64(msi.ullTotalPageFile), - SwapFree: int64(msi.ullAvailPageFile), - }, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/mknod.go b/vendor/github.com/docker/docker/pkg/system/mknod.go deleted file mode 100644 index 73958182b..000000000 --- a/vendor/github.com/docker/docker/pkg/system/mknod.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build !windows - -package system - -import ( - "syscall" -) - -// Mknod creates a filesystem node (file, device special file or named pipe) named path -// with attributes specified by mode and dev. -func Mknod(path string, mode uint32, dev int) error { - return syscall.Mknod(path, mode, dev) -} - -// Mkdev is used to build the value of linux devices (in /dev/) which specifies major -// and minor number of the newly created device special file. -// Linux device nodes are a bit weird due to backwards compat with 16 bit device nodes. -// They are, from low to high: the lower 8 bits of the minor, then 12 bits of the major, -// then the top 12 bits of the minor. -func Mkdev(major int64, minor int64) uint32 { - return uint32(((minor & 0xfff00) << 12) | ((major & 0xfff) << 8) | (minor & 0xff)) -} diff --git a/vendor/github.com/docker/docker/pkg/system/mknod_windows.go b/vendor/github.com/docker/docker/pkg/system/mknod_windows.go deleted file mode 100644 index 2e863c021..000000000 --- a/vendor/github.com/docker/docker/pkg/system/mknod_windows.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build windows - -package system - -// Mknod is not implemented on Windows. -func Mknod(path string, mode uint32, dev int) error { - return ErrNotSupportedPlatform -} - -// Mkdev is not implemented on Windows. -func Mkdev(major int64, minor int64) uint32 { - panic("Mkdev not implemented on Windows.") -} diff --git a/vendor/github.com/docker/docker/pkg/system/path_unix.go b/vendor/github.com/docker/docker/pkg/system/path_unix.go deleted file mode 100644 index c607c4db0..000000000 --- a/vendor/github.com/docker/docker/pkg/system/path_unix.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !windows - -package system - -// DefaultPathEnv is unix style list of directories to search for -// executables. Each directory is separated from the next by a colon -// ':' character . -const DefaultPathEnv = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - -// CheckSystemDriveAndRemoveDriveLetter verifies that a path, if it includes a drive letter, -// is the system drive. This is a no-op on Linux. -func CheckSystemDriveAndRemoveDriveLetter(path string) (string, error) { - return path, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/path_windows.go b/vendor/github.com/docker/docker/pkg/system/path_windows.go deleted file mode 100644 index cbfe2c157..000000000 --- a/vendor/github.com/docker/docker/pkg/system/path_windows.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build windows - -package system - -import ( - "fmt" - "path/filepath" - "strings" -) - -// DefaultPathEnv is deliberately empty on Windows as the default path will be set by -// the container. Docker has no context of what the default path should be. -const DefaultPathEnv = "" - -// CheckSystemDriveAndRemoveDriveLetter verifies and manipulates a Windows path. -// This is used, for example, when validating a user provided path in docker cp. -// If a drive letter is supplied, it must be the system drive. The drive letter -// is always removed. Also, it translates it to OS semantics (IOW / to \). We -// need the path in this syntax so that it can ultimately be contatenated with -// a Windows long-path which doesn't support drive-letters. Examples: -// C: --> Fail -// C:\ --> \ -// a --> a -// /a --> \a -// d:\ --> Fail -func CheckSystemDriveAndRemoveDriveLetter(path string) (string, error) { - if len(path) == 2 && string(path[1]) == ":" { - return "", fmt.Errorf("No relative path specified in %q", path) - } - if !filepath.IsAbs(path) || len(path) < 2 { - return filepath.FromSlash(path), nil - } - if string(path[1]) == ":" && !strings.EqualFold(string(path[0]), "c") { - return "", fmt.Errorf("The specified path is not on the system drive (C:)") - } - return filepath.FromSlash(path[2:]), nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/path_windows_test.go b/vendor/github.com/docker/docker/pkg/system/path_windows_test.go deleted file mode 100644 index eccb26aae..000000000 --- a/vendor/github.com/docker/docker/pkg/system/path_windows_test.go +++ /dev/null @@ -1,78 +0,0 @@ -// +build windows - -package system - -import "testing" - -// TestCheckSystemDriveAndRemoveDriveLetter tests CheckSystemDriveAndRemoveDriveLetter -func TestCheckSystemDriveAndRemoveDriveLetter(t *testing.T) { - // Fails if not C drive. - path, err := CheckSystemDriveAndRemoveDriveLetter(`d:\`) - if err == nil || (err != nil && err.Error() != "The specified path is not on the system drive (C:)") { - t.Fatalf("Expected error for d:") - } - - // Single character is unchanged - if path, err = CheckSystemDriveAndRemoveDriveLetter("z"); err != nil { - t.Fatalf("Single character should pass") - } - if path != "z" { - t.Fatalf("Single character should be unchanged") - } - - // Two characters without colon is unchanged - if path, err = CheckSystemDriveAndRemoveDriveLetter("AB"); err != nil { - t.Fatalf("2 characters without colon should pass") - } - if path != "AB" { - t.Fatalf("2 characters without colon should be unchanged") - } - - // Abs path without drive letter - if path, err = CheckSystemDriveAndRemoveDriveLetter(`\l`); err != nil { - t.Fatalf("abs path no drive letter should pass") - } - if path != `\l` { - t.Fatalf("abs path without drive letter should be unchanged") - } - - // Abs path without drive letter, linux style - if path, err = CheckSystemDriveAndRemoveDriveLetter(`/l`); err != nil { - t.Fatalf("abs path no drive letter linux style should pass") - } - if path != `\l` { - t.Fatalf("abs path without drive letter linux failed %s", path) - } - - // Drive-colon should be stripped - if path, err = CheckSystemDriveAndRemoveDriveLetter(`c:\`); err != nil { - t.Fatalf("An absolute path should pass") - } - if path != `\` { - t.Fatalf(`An absolute path should have been shortened to \ %s`, path) - } - - // Verify with a linux-style path - if path, err = CheckSystemDriveAndRemoveDriveLetter(`c:/`); err != nil { - t.Fatalf("An absolute path should pass") - } - if path != `\` { - t.Fatalf(`A linux style absolute path should have been shortened to \ %s`, path) - } - - // Failure on c: - if path, err = CheckSystemDriveAndRemoveDriveLetter(`c:`); err == nil { - t.Fatalf("c: should fail") - } - if err.Error() != `No relative path specified in "c:"` { - t.Fatalf(path, err) - } - - // Failure on d: - if path, err = CheckSystemDriveAndRemoveDriveLetter(`d:`); err == nil { - t.Fatalf("c: should fail") - } - if err.Error() != `No relative path specified in "d:"` { - t.Fatalf(path, err) - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat.go b/vendor/github.com/docker/docker/pkg/system/stat.go deleted file mode 100644 index 087034c5e..000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat.go +++ /dev/null @@ -1,53 +0,0 @@ -// +build !windows - -package system - -import ( - "syscall" -) - -// StatT type contains status of a file. It contains metadata -// like permission, owner, group, size, etc about a file. -type StatT struct { - mode uint32 - uid uint32 - gid uint32 - rdev uint64 - size int64 - mtim syscall.Timespec -} - -// Mode returns file's permission mode. -func (s StatT) Mode() uint32 { - return s.mode -} - -// UID returns file's user id of owner. -func (s StatT) UID() uint32 { - return s.uid -} - -// GID returns file's group id of owner. -func (s StatT) GID() uint32 { - return s.gid -} - -// Rdev returns file's device ID (if it's special file). -func (s StatT) Rdev() uint64 { - return s.rdev -} - -// Size returns file's size. -func (s StatT) Size() int64 { - return s.size -} - -// Mtim returns file's last modification time. -func (s StatT) Mtim() syscall.Timespec { - return s.mtim -} - -// GetLastModification returns file's last modification time. -func (s StatT) GetLastModification() syscall.Timespec { - return s.Mtim() -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_darwin.go b/vendor/github.com/docker/docker/pkg/system/stat_darwin.go deleted file mode 100644 index f0742f59e..000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_darwin.go +++ /dev/null @@ -1,32 +0,0 @@ -package system - -import ( - "syscall" -) - -// fromStatT creates a system.StatT type from a syscall.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtimespec}, nil -} - -// FromStatT loads a system.StatT from a syscall.Stat_t. -func FromStatT(s *syscall.Stat_t) (*StatT, error) { - return fromStatT(s) -} - -// Stat takes a path to a file and returns -// a system.StatT type pertaining to that file. -// -// Throws an error if the file does not exist -func Stat(path string) (*StatT, error) { - s := &syscall.Stat_t{} - if err := syscall.Stat(path, s); err != nil { - return nil, err - } - return fromStatT(s) -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go b/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go deleted file mode 100644 index d0fb6f151..000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go +++ /dev/null @@ -1,27 +0,0 @@ -package system - -import ( - "syscall" -) - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtimespec}, nil -} - -// Stat takes a path to a file and returns -// a system.Stat_t type pertaining to that file. -// -// Throws an error if the file does not exist -func Stat(path string) (*StatT, error) { - s := &syscall.Stat_t{} - if err := syscall.Stat(path, s); err != nil { - return nil, err - } - return fromStatT(s) -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_linux.go b/vendor/github.com/docker/docker/pkg/system/stat_linux.go deleted file mode 100644 index 8b1eded13..000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_linux.go +++ /dev/null @@ -1,33 +0,0 @@ -package system - -import ( - "syscall" -) - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: s.Mode, - uid: s.Uid, - gid: s.Gid, - rdev: s.Rdev, - mtim: s.Mtim}, nil -} - -// FromStatT exists only on linux, and loads a system.StatT from a -// syscal.Stat_t. -func FromStatT(s *syscall.Stat_t) (*StatT, error) { - return fromStatT(s) -} - -// Stat takes a path to a file and returns -// a system.StatT type pertaining to that file. -// -// Throws an error if the file does not exist -func Stat(path string) (*StatT, error) { - s := &syscall.Stat_t{} - if err := syscall.Stat(path, s); err != nil { - return nil, err - } - return fromStatT(s) -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_openbsd.go b/vendor/github.com/docker/docker/pkg/system/stat_openbsd.go deleted file mode 100644 index 3c3b71fb2..000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_openbsd.go +++ /dev/null @@ -1,15 +0,0 @@ -package system - -import ( - "syscall" -) - -// fromStatT creates a system.StatT type from a syscall.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtim}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_solaris.go b/vendor/github.com/docker/docker/pkg/system/stat_solaris.go deleted file mode 100644 index 0216985a2..000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_solaris.go +++ /dev/null @@ -1,34 +0,0 @@ -// +build solaris - -package system - -import ( - "syscall" -) - -// fromStatT creates a system.StatT type from a syscall.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtim}, nil -} - -// FromStatT loads a system.StatT from a syscal.Stat_t. -func FromStatT(s *syscall.Stat_t) (*StatT, error) { - return fromStatT(s) -} - -// Stat takes a path to a file and returns -// a system.StatT type pertaining to that file. -// -// Throws an error if the file does not exist -func Stat(path string) (*StatT, error) { - s := &syscall.Stat_t{} - if err := syscall.Stat(path, s); err != nil { - return nil, err - } - return fromStatT(s) -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_unix_test.go b/vendor/github.com/docker/docker/pkg/system/stat_unix_test.go deleted file mode 100644 index dee8d30a1..000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_unix_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// +build linux freebsd - -package system - -import ( - "os" - "syscall" - "testing" -) - -// TestFromStatT tests fromStatT for a tempfile -func TestFromStatT(t *testing.T) { - file, _, _, dir := prepareFiles(t) - defer os.RemoveAll(dir) - - stat := &syscall.Stat_t{} - err := syscall.Lstat(file, stat) - - s, err := fromStatT(stat) - if err != nil { - t.Fatal(err) - } - - if stat.Mode != s.Mode() { - t.Fatal("got invalid mode") - } - if stat.Uid != s.UID() { - t.Fatal("got invalid uid") - } - if stat.Gid != s.GID() { - t.Fatal("got invalid gid") - } - if stat.Rdev != s.Rdev() { - t.Fatal("got invalid rdev") - } - if stat.Mtim != s.Mtim() { - t.Fatal("got invalid mtim") - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_unsupported.go b/vendor/github.com/docker/docker/pkg/system/stat_unsupported.go deleted file mode 100644 index 5d85f523c..000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_unsupported.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build !linux,!windows,!freebsd,!solaris,!openbsd,!darwin - -package system - -import ( - "syscall" -) - -// fromStatT creates a system.StatT type from a syscall.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtimespec}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_windows.go b/vendor/github.com/docker/docker/pkg/system/stat_windows.go deleted file mode 100644 index 39490c625..000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_windows.go +++ /dev/null @@ -1,43 +0,0 @@ -// +build windows - -package system - -import ( - "os" - "time" -) - -// StatT type contains status of a file. It contains metadata -// like name, permission, size, etc about a file. -type StatT struct { - name string - size int64 - mode os.FileMode - modTime time.Time - isDir bool -} - -// Name returns file's name. -func (s StatT) Name() string { - return s.name -} - -// Size returns file's size. -func (s StatT) Size() int64 { - return s.size -} - -// Mode returns file's permission mode. -func (s StatT) Mode() os.FileMode { - return s.mode -} - -// ModTime returns file's last modification time. -func (s StatT) ModTime() time.Time { - return s.modTime -} - -// IsDir returns whether file is actually a directory. -func (s StatT) IsDir() bool { - return s.isDir -} diff --git a/vendor/github.com/docker/docker/pkg/system/syscall_unix.go b/vendor/github.com/docker/docker/pkg/system/syscall_unix.go deleted file mode 100644 index 3ae912846..000000000 --- a/vendor/github.com/docker/docker/pkg/system/syscall_unix.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build linux freebsd - -package system - -import "syscall" - -// Unmount is a platform-specific helper function to call -// the unmount syscall. -func Unmount(dest string) error { - return syscall.Unmount(dest, 0) -} - -// CommandLineToArgv should not be used on Unix. -// It simply returns commandLine in the only element in the returned array. -func CommandLineToArgv(commandLine string) ([]string, error) { - return []string{commandLine}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/syscall_windows.go b/vendor/github.com/docker/docker/pkg/system/syscall_windows.go deleted file mode 100644 index 1f311874f..000000000 --- a/vendor/github.com/docker/docker/pkg/system/syscall_windows.go +++ /dev/null @@ -1,105 +0,0 @@ -package system - -import ( - "syscall" - "unsafe" - - "github.com/Sirupsen/logrus" -) - -var ( - ntuserApiset = syscall.NewLazyDLL("ext-ms-win-ntuser-window-l1-1-0") - procGetVersionExW = modkernel32.NewProc("GetVersionExW") -) - -// OSVersion is a wrapper for Windows version information -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx -type OSVersion struct { - Version uint32 - MajorVersion uint8 - MinorVersion uint8 - Build uint16 -} - -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx -type osVersionInfoEx struct { - OSVersionInfoSize uint32 - MajorVersion uint32 - MinorVersion uint32 - BuildNumber uint32 - PlatformID uint32 - CSDVersion [128]uint16 - ServicePackMajor uint16 - ServicePackMinor uint16 - SuiteMask uint16 - ProductType byte - Reserve byte -} - -// GetOSVersion gets the operating system version on Windows. Note that -// docker.exe must be manifested to get the correct version information. -func GetOSVersion() OSVersion { - var err error - osv := OSVersion{} - osv.Version, err = syscall.GetVersion() - if err != nil { - // GetVersion never fails. - panic(err) - } - osv.MajorVersion = uint8(osv.Version & 0xFF) - osv.MinorVersion = uint8(osv.Version >> 8 & 0xFF) - osv.Build = uint16(osv.Version >> 16) - return osv -} - -// IsWindowsClient returns true if the SKU is client -// @engine maintainers - this function should not be removed or modified as it -// is used to enforce licensing restrictions on Windows. -func IsWindowsClient() bool { - osviex := &osVersionInfoEx{OSVersionInfoSize: 284} - r1, _, err := procGetVersionExW.Call(uintptr(unsafe.Pointer(osviex))) - if r1 == 0 { - logrus.Warnf("GetVersionExW failed - assuming server SKU: %v", err) - return false - } - const verNTWorkstation = 0x00000001 - return osviex.ProductType == verNTWorkstation -} - -// Unmount is a platform-specific helper function to call -// the unmount syscall. Not supported on Windows -func Unmount(dest string) error { - return nil -} - -// CommandLineToArgv wraps the Windows syscall to turn a commandline into an argument array. -func CommandLineToArgv(commandLine string) ([]string, error) { - var argc int32 - - argsPtr, err := syscall.UTF16PtrFromString(commandLine) - if err != nil { - return nil, err - } - - argv, err := syscall.CommandLineToArgv(argsPtr, &argc) - if err != nil { - return nil, err - } - defer syscall.LocalFree(syscall.Handle(uintptr(unsafe.Pointer(argv)))) - - newArgs := make([]string, argc) - for i, v := range (*argv)[:argc] { - newArgs[i] = string(syscall.UTF16ToString((*v)[:])) - } - - return newArgs, nil -} - -// HasWin32KSupport determines whether containers that depend on win32k can -// run on this machine. Win32k is the driver used to implement windowing. -func HasWin32KSupport() bool { - // For now, check for ntuser API support on the host. In the future, a host - // may support win32k in containers even if the host does not support ntuser - // APIs. - return ntuserApiset.Load() == nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/syscall_windows_test.go b/vendor/github.com/docker/docker/pkg/system/syscall_windows_test.go deleted file mode 100644 index 4886b2b9b..000000000 --- a/vendor/github.com/docker/docker/pkg/system/syscall_windows_test.go +++ /dev/null @@ -1,9 +0,0 @@ -package system - -import "testing" - -func TestHasWin32KSupport(t *testing.T) { - s := HasWin32KSupport() // make sure this doesn't panic - - t.Logf("win32k: %v", s) // will be different on different platforms -- informative only -} diff --git a/vendor/github.com/docker/docker/pkg/system/umask.go b/vendor/github.com/docker/docker/pkg/system/umask.go deleted file mode 100644 index 3d0146b01..000000000 --- a/vendor/github.com/docker/docker/pkg/system/umask.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build !windows - -package system - -import ( - "syscall" -) - -// Umask sets current process's file mode creation mask to newmask -// and returns oldmask. -func Umask(newmask int) (oldmask int, err error) { - return syscall.Umask(newmask), nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/umask_windows.go b/vendor/github.com/docker/docker/pkg/system/umask_windows.go deleted file mode 100644 index 13f1de176..000000000 --- a/vendor/github.com/docker/docker/pkg/system/umask_windows.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build windows - -package system - -// Umask is not supported on the windows platform. -func Umask(newmask int) (oldmask int, err error) { - // should not be called on cli code path - return 0, ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go b/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go deleted file mode 100644 index e2eac3b55..000000000 --- a/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go +++ /dev/null @@ -1,22 +0,0 @@ -package system - -import ( - "syscall" - "unsafe" -) - -// LUtimesNano is used to change access and modification time of the specified path. -// It's used for symbol link file because syscall.UtimesNano doesn't support a NOFOLLOW flag atm. -func LUtimesNano(path string, ts []syscall.Timespec) error { - var _path *byte - _path, err := syscall.BytePtrFromString(path) - if err != nil { - return err - } - - if _, _, err := syscall.Syscall(syscall.SYS_LUTIMES, uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), 0); err != 0 && err != syscall.ENOSYS { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_linux.go b/vendor/github.com/docker/docker/pkg/system/utimes_linux.go deleted file mode 100644 index fc8a1aba9..000000000 --- a/vendor/github.com/docker/docker/pkg/system/utimes_linux.go +++ /dev/null @@ -1,26 +0,0 @@ -package system - -import ( - "syscall" - "unsafe" -) - -// LUtimesNano is used to change access and modification time of the specified path. -// It's used for symbol link file because syscall.UtimesNano doesn't support a NOFOLLOW flag atm. -func LUtimesNano(path string, ts []syscall.Timespec) error { - // These are not currently available in syscall - atFdCwd := -100 - atSymLinkNoFollow := 0x100 - - var _path *byte - _path, err := syscall.BytePtrFromString(path) - if err != nil { - return err - } - - if _, _, err := syscall.Syscall6(syscall.SYS_UTIMENSAT, uintptr(atFdCwd), uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), uintptr(atSymLinkNoFollow), 0, 0); err != 0 && err != syscall.ENOSYS { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_unix_test.go b/vendor/github.com/docker/docker/pkg/system/utimes_unix_test.go deleted file mode 100644 index a73ed118c..000000000 --- a/vendor/github.com/docker/docker/pkg/system/utimes_unix_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// +build linux freebsd - -package system - -import ( - "io/ioutil" - "os" - "path/filepath" - "syscall" - "testing" -) - -// prepareFiles creates files for testing in the temp directory -func prepareFiles(t *testing.T) (string, string, string, string) { - dir, err := ioutil.TempDir("", "docker-system-test") - if err != nil { - t.Fatal(err) - } - - file := filepath.Join(dir, "exist") - if err := ioutil.WriteFile(file, []byte("hello"), 0644); err != nil { - t.Fatal(err) - } - - invalid := filepath.Join(dir, "doesnt-exist") - - symlink := filepath.Join(dir, "symlink") - if err := os.Symlink(file, symlink); err != nil { - t.Fatal(err) - } - - return file, invalid, symlink, dir -} - -func TestLUtimesNano(t *testing.T) { - file, invalid, symlink, dir := prepareFiles(t) - defer os.RemoveAll(dir) - - before, err := os.Stat(file) - if err != nil { - t.Fatal(err) - } - - ts := []syscall.Timespec{{Sec: 0, Nsec: 0}, {Sec: 0, Nsec: 0}} - if err := LUtimesNano(symlink, ts); err != nil { - t.Fatal(err) - } - - symlinkInfo, err := os.Lstat(symlink) - if err != nil { - t.Fatal(err) - } - if before.ModTime().Unix() == symlinkInfo.ModTime().Unix() { - t.Fatal("The modification time of the symlink should be different") - } - - fileInfo, err := os.Stat(file) - if err != nil { - t.Fatal(err) - } - if before.ModTime().Unix() != fileInfo.ModTime().Unix() { - t.Fatal("The modification time of the file should be same") - } - - if err := LUtimesNano(invalid, ts); err == nil { - t.Fatal("Doesn't return an error on a non-existing file") - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go b/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go deleted file mode 100644 index 139714544..000000000 --- a/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build !linux,!freebsd - -package system - -import "syscall" - -// LUtimesNano is only supported on linux and freebsd. -func LUtimesNano(path string, ts []syscall.Timespec) error { - return ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go b/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go deleted file mode 100644 index d2e2c0579..000000000 --- a/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go +++ /dev/null @@ -1,63 +0,0 @@ -package system - -import ( - "syscall" - "unsafe" -) - -// Lgetxattr retrieves the value of the extended attribute identified by attr -// and associated with the given path in the file system. -// It will returns a nil slice and nil error if the xattr is not set. -func Lgetxattr(path string, attr string) ([]byte, error) { - pathBytes, err := syscall.BytePtrFromString(path) - if err != nil { - return nil, err - } - attrBytes, err := syscall.BytePtrFromString(attr) - if err != nil { - return nil, err - } - - dest := make([]byte, 128) - destBytes := unsafe.Pointer(&dest[0]) - sz, _, errno := syscall.Syscall6(syscall.SYS_LGETXATTR, uintptr(unsafe.Pointer(pathBytes)), uintptr(unsafe.Pointer(attrBytes)), uintptr(destBytes), uintptr(len(dest)), 0, 0) - if errno == syscall.ENODATA { - return nil, nil - } - if errno == syscall.ERANGE { - dest = make([]byte, sz) - destBytes := unsafe.Pointer(&dest[0]) - sz, _, errno = syscall.Syscall6(syscall.SYS_LGETXATTR, uintptr(unsafe.Pointer(pathBytes)), uintptr(unsafe.Pointer(attrBytes)), uintptr(destBytes), uintptr(len(dest)), 0, 0) - } - if errno != 0 { - return nil, errno - } - - return dest[:sz], nil -} - -var _zero uintptr - -// Lsetxattr sets the value of the extended attribute identified by attr -// and associated with the given path in the file system. -func Lsetxattr(path string, attr string, data []byte, flags int) error { - pathBytes, err := syscall.BytePtrFromString(path) - if err != nil { - return err - } - attrBytes, err := syscall.BytePtrFromString(attr) - if err != nil { - return err - } - var dataBytes unsafe.Pointer - if len(data) > 0 { - dataBytes = unsafe.Pointer(&data[0]) - } else { - dataBytes = unsafe.Pointer(&_zero) - } - _, _, errno := syscall.Syscall6(syscall.SYS_LSETXATTR, uintptr(unsafe.Pointer(pathBytes)), uintptr(unsafe.Pointer(attrBytes)), uintptr(dataBytes), uintptr(len(data)), uintptr(flags), 0) - if errno != 0 { - return errno - } - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go b/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go deleted file mode 100644 index 0114f2227..000000000 --- a/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build !linux - -package system - -// Lgetxattr is not supported on platforms other than linux. -func Lgetxattr(path string, attr string) ([]byte, error) { - return nil, ErrNotSupportedPlatform -} - -// Lsetxattr is not supported on platforms other than linux. -func Lsetxattr(path string, attr string, data []byte, flags int) error { - return ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/tailfile/tailfile.go b/vendor/github.com/docker/docker/pkg/tailfile/tailfile.go deleted file mode 100644 index 09eb393ab..000000000 --- a/vendor/github.com/docker/docker/pkg/tailfile/tailfile.go +++ /dev/null @@ -1,66 +0,0 @@ -// Package tailfile provides helper functions to read the nth lines of any -// ReadSeeker. -package tailfile - -import ( - "bytes" - "errors" - "io" - "os" -) - -const blockSize = 1024 - -var eol = []byte("\n") - -// ErrNonPositiveLinesNumber is an error returned if the lines number was negative. -var ErrNonPositiveLinesNumber = errors.New("The number of lines to extract from the file must be positive") - -//TailFile returns last n lines of reader f (could be a fil). -func TailFile(f io.ReadSeeker, n int) ([][]byte, error) { - if n <= 0 { - return nil, ErrNonPositiveLinesNumber - } - size, err := f.Seek(0, os.SEEK_END) - if err != nil { - return nil, err - } - block := -1 - var data []byte - var cnt int - for { - var b []byte - step := int64(block * blockSize) - left := size + step // how many bytes to beginning - if left < 0 { - if _, err := f.Seek(0, os.SEEK_SET); err != nil { - return nil, err - } - b = make([]byte, blockSize+left) - if _, err := f.Read(b); err != nil { - return nil, err - } - data = append(b, data...) - break - } else { - b = make([]byte, blockSize) - if _, err := f.Seek(left, os.SEEK_SET); err != nil { - return nil, err - } - if _, err := f.Read(b); err != nil { - return nil, err - } - data = append(b, data...) - } - cnt += bytes.Count(b, eol) - if cnt > n { - break - } - block-- - } - lines := bytes.Split(data, eol) - if n < len(lines) { - return lines[len(lines)-n-1 : len(lines)-1], nil - } - return lines[:len(lines)-1], nil -} diff --git a/vendor/github.com/docker/docker/pkg/tailfile/tailfile_test.go b/vendor/github.com/docker/docker/pkg/tailfile/tailfile_test.go deleted file mode 100644 index 31217c036..000000000 --- a/vendor/github.com/docker/docker/pkg/tailfile/tailfile_test.go +++ /dev/null @@ -1,148 +0,0 @@ -package tailfile - -import ( - "io/ioutil" - "os" - "testing" -) - -func TestTailFile(t *testing.T) { - f, err := ioutil.TempFile("", "tail-test") - if err != nil { - t.Fatal(err) - } - defer f.Close() - defer os.RemoveAll(f.Name()) - testFile := []byte(`first line -second line -third line -fourth line -fifth line -next first line -next second line -next third line -next fourth line -next fifth line -last first line -next first line -next second line -next third line -next fourth line -next fifth line -next first line -next second line -next third line -next fourth line -next fifth line -last second line -last third line -last fourth line -last fifth line -truncated line`) - if _, err := f.Write(testFile); err != nil { - t.Fatal(err) - } - if _, err := f.Seek(0, os.SEEK_SET); err != nil { - t.Fatal(err) - } - expected := []string{"last fourth line", "last fifth line"} - res, err := TailFile(f, 2) - if err != nil { - t.Fatal(err) - } - for i, l := range res { - t.Logf("%s", l) - if expected[i] != string(l) { - t.Fatalf("Expected line %s, got %s", expected[i], l) - } - } -} - -func TestTailFileManyLines(t *testing.T) { - f, err := ioutil.TempFile("", "tail-test") - if err != nil { - t.Fatal(err) - } - defer f.Close() - defer os.RemoveAll(f.Name()) - testFile := []byte(`first line -second line -truncated line`) - if _, err := f.Write(testFile); err != nil { - t.Fatal(err) - } - if _, err := f.Seek(0, os.SEEK_SET); err != nil { - t.Fatal(err) - } - expected := []string{"first line", "second line"} - res, err := TailFile(f, 10000) - if err != nil { - t.Fatal(err) - } - for i, l := range res { - t.Logf("%s", l) - if expected[i] != string(l) { - t.Fatalf("Expected line %s, got %s", expected[i], l) - } - } -} - -func TestTailEmptyFile(t *testing.T) { - f, err := ioutil.TempFile("", "tail-test") - if err != nil { - t.Fatal(err) - } - defer f.Close() - defer os.RemoveAll(f.Name()) - res, err := TailFile(f, 10000) - if err != nil { - t.Fatal(err) - } - if len(res) != 0 { - t.Fatal("Must be empty slice from empty file") - } -} - -func TestTailNegativeN(t *testing.T) { - f, err := ioutil.TempFile("", "tail-test") - if err != nil { - t.Fatal(err) - } - defer f.Close() - defer os.RemoveAll(f.Name()) - testFile := []byte(`first line -second line -truncated line`) - if _, err := f.Write(testFile); err != nil { - t.Fatal(err) - } - if _, err := f.Seek(0, os.SEEK_SET); err != nil { - t.Fatal(err) - } - if _, err := TailFile(f, -1); err != ErrNonPositiveLinesNumber { - t.Fatalf("Expected ErrNonPositiveLinesNumber, got %s", err) - } - if _, err := TailFile(f, 0); err != ErrNonPositiveLinesNumber { - t.Fatalf("Expected ErrNonPositiveLinesNumber, got %s", err) - } -} - -func BenchmarkTail(b *testing.B) { - f, err := ioutil.TempFile("", "tail-test") - if err != nil { - b.Fatal(err) - } - defer f.Close() - defer os.RemoveAll(f.Name()) - for i := 0; i < 10000; i++ { - if _, err := f.Write([]byte("tailfile pretty interesting line\n")); err != nil { - b.Fatal(err) - } - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - if _, err := TailFile(f, 1000); err != nil { - b.Fatal(err) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/tarsum/builder_context.go b/vendor/github.com/docker/docker/pkg/tarsum/builder_context.go deleted file mode 100644 index b42983e98..000000000 --- a/vendor/github.com/docker/docker/pkg/tarsum/builder_context.go +++ /dev/null @@ -1,21 +0,0 @@ -package tarsum - -// BuilderContext is an interface extending TarSum by adding the Remove method. -// In general there was concern about adding this method to TarSum itself -// so instead it is being added just to "BuilderContext" which will then -// only be used during the .dockerignore file processing -// - see builder/evaluator.go -type BuilderContext interface { - TarSum - Remove(string) -} - -func (bc *tarSum) Remove(filename string) { - for i, fis := range bc.sums { - if fis.Name() == filename { - bc.sums = append(bc.sums[:i], bc.sums[i+1:]...) - // Note, we don't just return because there could be - // more than one with this name - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/tarsum/builder_context_test.go b/vendor/github.com/docker/docker/pkg/tarsum/builder_context_test.go deleted file mode 100644 index f54bf3a1b..000000000 --- a/vendor/github.com/docker/docker/pkg/tarsum/builder_context_test.go +++ /dev/null @@ -1,67 +0,0 @@ -package tarsum - -import ( - "io" - "io/ioutil" - "os" - "testing" -) - -// Try to remove tarsum (in the BuilderContext) that do not exists, won't change a thing -func TestTarSumRemoveNonExistent(t *testing.T) { - filename := "testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar" - reader, err := os.Open(filename) - if err != nil { - t.Fatal(err) - } - defer reader.Close() - - ts, err := NewTarSum(reader, false, Version0) - if err != nil { - t.Fatal(err) - } - - // Read and discard bytes so that it populates sums - _, err = io.Copy(ioutil.Discard, ts) - if err != nil { - t.Errorf("failed to read from %s: %s", filename, err) - } - - expected := len(ts.GetSums()) - - ts.(BuilderContext).Remove("") - ts.(BuilderContext).Remove("Anything") - - if len(ts.GetSums()) != expected { - t.Fatalf("Expected %v sums, go %v.", expected, ts.GetSums()) - } -} - -// Remove a tarsum (in the BuilderContext) -func TestTarSumRemove(t *testing.T) { - filename := "testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar" - reader, err := os.Open(filename) - if err != nil { - t.Fatal(err) - } - defer reader.Close() - - ts, err := NewTarSum(reader, false, Version0) - if err != nil { - t.Fatal(err) - } - - // Read and discard bytes so that it populates sums - _, err = io.Copy(ioutil.Discard, ts) - if err != nil { - t.Errorf("failed to read from %s: %s", filename, err) - } - - expected := len(ts.GetSums()) - 1 - - ts.(BuilderContext).Remove("etc/sudoers") - - if len(ts.GetSums()) != expected { - t.Fatalf("Expected %v sums, go %v.", expected, len(ts.GetSums())) - } -} diff --git a/vendor/github.com/docker/docker/pkg/tarsum/fileinfosums.go b/vendor/github.com/docker/docker/pkg/tarsum/fileinfosums.go deleted file mode 100644 index 5abf5e7ba..000000000 --- a/vendor/github.com/docker/docker/pkg/tarsum/fileinfosums.go +++ /dev/null @@ -1,126 +0,0 @@ -package tarsum - -import "sort" - -// FileInfoSumInterface provides an interface for accessing file checksum -// information within a tar file. This info is accessed through interface -// so the actual name and sum cannot be melded with. -type FileInfoSumInterface interface { - // File name - Name() string - // Checksum of this particular file and its headers - Sum() string - // Position of file in the tar - Pos() int64 -} - -type fileInfoSum struct { - name string - sum string - pos int64 -} - -func (fis fileInfoSum) Name() string { - return fis.name -} -func (fis fileInfoSum) Sum() string { - return fis.sum -} -func (fis fileInfoSum) Pos() int64 { - return fis.pos -} - -// FileInfoSums provides a list of FileInfoSumInterfaces. -type FileInfoSums []FileInfoSumInterface - -// GetFile returns the first FileInfoSumInterface with a matching name. -func (fis FileInfoSums) GetFile(name string) FileInfoSumInterface { - for i := range fis { - if fis[i].Name() == name { - return fis[i] - } - } - return nil -} - -// GetAllFile returns a FileInfoSums with all matching names. -func (fis FileInfoSums) GetAllFile(name string) FileInfoSums { - f := FileInfoSums{} - for i := range fis { - if fis[i].Name() == name { - f = append(f, fis[i]) - } - } - return f -} - -// GetDuplicatePaths returns a FileInfoSums with all duplicated paths. -func (fis FileInfoSums) GetDuplicatePaths() (dups FileInfoSums) { - seen := make(map[string]int, len(fis)) // allocate earl. no need to grow this map. - for i := range fis { - f := fis[i] - if _, ok := seen[f.Name()]; ok { - dups = append(dups, f) - } else { - seen[f.Name()] = 0 - } - } - return dups -} - -// Len returns the size of the FileInfoSums. -func (fis FileInfoSums) Len() int { return len(fis) } - -// Swap swaps two FileInfoSum values if a FileInfoSums list. -func (fis FileInfoSums) Swap(i, j int) { fis[i], fis[j] = fis[j], fis[i] } - -// SortByPos sorts FileInfoSums content by position. -func (fis FileInfoSums) SortByPos() { - sort.Sort(byPos{fis}) -} - -// SortByNames sorts FileInfoSums content by name. -func (fis FileInfoSums) SortByNames() { - sort.Sort(byName{fis}) -} - -// SortBySums sorts FileInfoSums content by sums. -func (fis FileInfoSums) SortBySums() { - dups := fis.GetDuplicatePaths() - if len(dups) > 0 { - sort.Sort(bySum{fis, dups}) - } else { - sort.Sort(bySum{fis, nil}) - } -} - -// byName is a sort.Sort helper for sorting by file names. -// If names are the same, order them by their appearance in the tar archive -type byName struct{ FileInfoSums } - -func (bn byName) Less(i, j int) bool { - if bn.FileInfoSums[i].Name() == bn.FileInfoSums[j].Name() { - return bn.FileInfoSums[i].Pos() < bn.FileInfoSums[j].Pos() - } - return bn.FileInfoSums[i].Name() < bn.FileInfoSums[j].Name() -} - -// bySum is a sort.Sort helper for sorting by the sums of all the fileinfos in the tar archive -type bySum struct { - FileInfoSums - dups FileInfoSums -} - -func (bs bySum) Less(i, j int) bool { - if bs.dups != nil && bs.FileInfoSums[i].Name() == bs.FileInfoSums[j].Name() { - return bs.FileInfoSums[i].Pos() < bs.FileInfoSums[j].Pos() - } - return bs.FileInfoSums[i].Sum() < bs.FileInfoSums[j].Sum() -} - -// byPos is a sort.Sort helper for sorting by the sums of all the fileinfos by their original order -type byPos struct{ FileInfoSums } - -func (bp byPos) Less(i, j int) bool { - return bp.FileInfoSums[i].Pos() < bp.FileInfoSums[j].Pos() -} diff --git a/vendor/github.com/docker/docker/pkg/tarsum/fileinfosums_test.go b/vendor/github.com/docker/docker/pkg/tarsum/fileinfosums_test.go deleted file mode 100644 index bb700d8bd..000000000 --- a/vendor/github.com/docker/docker/pkg/tarsum/fileinfosums_test.go +++ /dev/null @@ -1,62 +0,0 @@ -package tarsum - -import "testing" - -func newFileInfoSums() FileInfoSums { - return FileInfoSums{ - fileInfoSum{name: "file3", sum: "2abcdef1234567890", pos: 2}, - fileInfoSum{name: "dup1", sum: "deadbeef1", pos: 5}, - fileInfoSum{name: "file1", sum: "0abcdef1234567890", pos: 0}, - fileInfoSum{name: "file4", sum: "3abcdef1234567890", pos: 3}, - fileInfoSum{name: "dup1", sum: "deadbeef0", pos: 4}, - fileInfoSum{name: "file2", sum: "1abcdef1234567890", pos: 1}, - } -} - -func TestSortFileInfoSums(t *testing.T) { - dups := newFileInfoSums().GetAllFile("dup1") - if len(dups) != 2 { - t.Errorf("expected length 2, got %d", len(dups)) - } - dups.SortByNames() - if dups[0].Pos() != 4 { - t.Errorf("sorted dups should be ordered by position. Expected 4, got %d", dups[0].Pos()) - } - - fis := newFileInfoSums() - expected := "0abcdef1234567890" - fis.SortBySums() - got := fis[0].Sum() - if got != expected { - t.Errorf("Expected %q, got %q", expected, got) - } - - fis = newFileInfoSums() - expected = "dup1" - fis.SortByNames() - gotFis := fis[0] - if gotFis.Name() != expected { - t.Errorf("Expected %q, got %q", expected, gotFis.Name()) - } - // since a duplicate is first, ensure it is ordered first by position too - if gotFis.Pos() != 4 { - t.Errorf("Expected %d, got %d", 4, gotFis.Pos()) - } - - fis = newFileInfoSums() - fis.SortByPos() - if fis[0].Pos() != 0 { - t.Errorf("sorted fileInfoSums by Pos should order them by position.") - } - - fis = newFileInfoSums() - expected = "deadbeef1" - gotFileInfoSum := fis.GetFile("dup1") - if gotFileInfoSum.Sum() != expected { - t.Errorf("Expected %q, got %q", expected, gotFileInfoSum) - } - if fis.GetFile("noPresent") != nil { - t.Errorf("Should have return nil if name not found.") - } - -} diff --git a/vendor/github.com/docker/docker/pkg/tarsum/tarsum.go b/vendor/github.com/docker/docker/pkg/tarsum/tarsum.go deleted file mode 100644 index 154788db8..000000000 --- a/vendor/github.com/docker/docker/pkg/tarsum/tarsum.go +++ /dev/null @@ -1,295 +0,0 @@ -// Package tarsum provides algorithms to perform checksum calculation on -// filesystem layers. -// -// The transportation of filesystems, regarding Docker, is done with tar(1) -// archives. There are a variety of tar serialization formats [2], and a key -// concern here is ensuring a repeatable checksum given a set of inputs from a -// generic tar archive. Types of transportation include distribution to and from a -// registry endpoint, saving and loading through commands or Docker daemon APIs, -// transferring the build context from client to Docker daemon, and committing the -// filesystem of a container to become an image. -// -// As tar archives are used for transit, but not preserved in many situations, the -// focus of the algorithm is to ensure the integrity of the preserved filesystem, -// while maintaining a deterministic accountability. This includes neither -// constraining the ordering or manipulation of the files during the creation or -// unpacking of the archive, nor include additional metadata state about the file -// system attributes. -package tarsum - -import ( - "archive/tar" - "bytes" - "compress/gzip" - "crypto" - "crypto/sha256" - "encoding/hex" - "errors" - "fmt" - "hash" - "io" - "path" - "strings" -) - -const ( - buf8K = 8 * 1024 - buf16K = 16 * 1024 - buf32K = 32 * 1024 -) - -// NewTarSum creates a new interface for calculating a fixed time checksum of a -// tar archive. -// -// This is used for calculating checksums of layers of an image, in some cases -// including the byte payload of the image's json metadata as well, and for -// calculating the checksums for buildcache. -func NewTarSum(r io.Reader, dc bool, v Version) (TarSum, error) { - return NewTarSumHash(r, dc, v, DefaultTHash) -} - -// NewTarSumHash creates a new TarSum, providing a THash to use rather than -// the DefaultTHash. -func NewTarSumHash(r io.Reader, dc bool, v Version, tHash THash) (TarSum, error) { - headerSelector, err := getTarHeaderSelector(v) - if err != nil { - return nil, err - } - ts := &tarSum{Reader: r, DisableCompression: dc, tarSumVersion: v, headerSelector: headerSelector, tHash: tHash} - err = ts.initTarSum() - return ts, err -} - -// NewTarSumForLabel creates a new TarSum using the provided TarSum version+hash label. -func NewTarSumForLabel(r io.Reader, disableCompression bool, label string) (TarSum, error) { - parts := strings.SplitN(label, "+", 2) - if len(parts) != 2 { - return nil, errors.New("tarsum label string should be of the form: {tarsum_version}+{hash_name}") - } - - versionName, hashName := parts[0], parts[1] - - version, ok := tarSumVersionsByName[versionName] - if !ok { - return nil, fmt.Errorf("unknown TarSum version name: %q", versionName) - } - - hashConfig, ok := standardHashConfigs[hashName] - if !ok { - return nil, fmt.Errorf("unknown TarSum hash name: %q", hashName) - } - - tHash := NewTHash(hashConfig.name, hashConfig.hash.New) - - return NewTarSumHash(r, disableCompression, version, tHash) -} - -// TarSum is the generic interface for calculating fixed time -// checksums of a tar archive. -type TarSum interface { - io.Reader - GetSums() FileInfoSums - Sum([]byte) string - Version() Version - Hash() THash -} - -// tarSum struct is the structure for a Version0 checksum calculation. -type tarSum struct { - io.Reader - tarR *tar.Reader - tarW *tar.Writer - writer writeCloseFlusher - bufTar *bytes.Buffer - bufWriter *bytes.Buffer - bufData []byte - h hash.Hash - tHash THash - sums FileInfoSums - fileCounter int64 - currentFile string - finished bool - first bool - DisableCompression bool // false by default. When false, the output gzip compressed. - tarSumVersion Version // this field is not exported so it can not be mutated during use - headerSelector tarHeaderSelector // handles selecting and ordering headers for files in the archive -} - -func (ts tarSum) Hash() THash { - return ts.tHash -} - -func (ts tarSum) Version() Version { - return ts.tarSumVersion -} - -// THash provides a hash.Hash type generator and its name. -type THash interface { - Hash() hash.Hash - Name() string -} - -// NewTHash is a convenience method for creating a THash. -func NewTHash(name string, h func() hash.Hash) THash { - return simpleTHash{n: name, h: h} -} - -type tHashConfig struct { - name string - hash crypto.Hash -} - -var ( - // NOTE: DO NOT include MD5 or SHA1, which are considered insecure. - standardHashConfigs = map[string]tHashConfig{ - "sha256": {name: "sha256", hash: crypto.SHA256}, - "sha512": {name: "sha512", hash: crypto.SHA512}, - } -) - -// DefaultTHash is default TarSum hashing algorithm - "sha256". -var DefaultTHash = NewTHash("sha256", sha256.New) - -type simpleTHash struct { - n string - h func() hash.Hash -} - -func (sth simpleTHash) Name() string { return sth.n } -func (sth simpleTHash) Hash() hash.Hash { return sth.h() } - -func (ts *tarSum) encodeHeader(h *tar.Header) error { - for _, elem := range ts.headerSelector.selectHeaders(h) { - if _, err := ts.h.Write([]byte(elem[0] + elem[1])); err != nil { - return err - } - } - return nil -} - -func (ts *tarSum) initTarSum() error { - ts.bufTar = bytes.NewBuffer([]byte{}) - ts.bufWriter = bytes.NewBuffer([]byte{}) - ts.tarR = tar.NewReader(ts.Reader) - ts.tarW = tar.NewWriter(ts.bufTar) - if !ts.DisableCompression { - ts.writer = gzip.NewWriter(ts.bufWriter) - } else { - ts.writer = &nopCloseFlusher{Writer: ts.bufWriter} - } - if ts.tHash == nil { - ts.tHash = DefaultTHash - } - ts.h = ts.tHash.Hash() - ts.h.Reset() - ts.first = true - ts.sums = FileInfoSums{} - return nil -} - -func (ts *tarSum) Read(buf []byte) (int, error) { - if ts.finished { - return ts.bufWriter.Read(buf) - } - if len(ts.bufData) < len(buf) { - switch { - case len(buf) <= buf8K: - ts.bufData = make([]byte, buf8K) - case len(buf) <= buf16K: - ts.bufData = make([]byte, buf16K) - case len(buf) <= buf32K: - ts.bufData = make([]byte, buf32K) - default: - ts.bufData = make([]byte, len(buf)) - } - } - buf2 := ts.bufData[:len(buf)] - - n, err := ts.tarR.Read(buf2) - if err != nil { - if err == io.EOF { - if _, err := ts.h.Write(buf2[:n]); err != nil { - return 0, err - } - if !ts.first { - ts.sums = append(ts.sums, fileInfoSum{name: ts.currentFile, sum: hex.EncodeToString(ts.h.Sum(nil)), pos: ts.fileCounter}) - ts.fileCounter++ - ts.h.Reset() - } else { - ts.first = false - } - - currentHeader, err := ts.tarR.Next() - if err != nil { - if err == io.EOF { - if err := ts.tarW.Close(); err != nil { - return 0, err - } - if _, err := io.Copy(ts.writer, ts.bufTar); err != nil { - return 0, err - } - if err := ts.writer.Close(); err != nil { - return 0, err - } - ts.finished = true - return n, nil - } - return n, err - } - ts.currentFile = path.Clean(currentHeader.Name) - if err := ts.encodeHeader(currentHeader); err != nil { - return 0, err - } - if err := ts.tarW.WriteHeader(currentHeader); err != nil { - return 0, err - } - if _, err := ts.tarW.Write(buf2[:n]); err != nil { - return 0, err - } - ts.tarW.Flush() - if _, err := io.Copy(ts.writer, ts.bufTar); err != nil { - return 0, err - } - ts.writer.Flush() - - return ts.bufWriter.Read(buf) - } - return n, err - } - - // Filling the hash buffer - if _, err = ts.h.Write(buf2[:n]); err != nil { - return 0, err - } - - // Filling the tar writer - if _, err = ts.tarW.Write(buf2[:n]); err != nil { - return 0, err - } - ts.tarW.Flush() - - // Filling the output writer - if _, err = io.Copy(ts.writer, ts.bufTar); err != nil { - return 0, err - } - ts.writer.Flush() - - return ts.bufWriter.Read(buf) -} - -func (ts *tarSum) Sum(extra []byte) string { - ts.sums.SortBySums() - h := ts.tHash.Hash() - if extra != nil { - h.Write(extra) - } - for _, fis := range ts.sums { - h.Write([]byte(fis.Sum())) - } - checksum := ts.Version().String() + "+" + ts.tHash.Name() + ":" + hex.EncodeToString(h.Sum(nil)) - return checksum -} - -func (ts *tarSum) GetSums() FileInfoSums { - return ts.sums -} diff --git a/vendor/github.com/docker/docker/pkg/tarsum/tarsum_spec.md b/vendor/github.com/docker/docker/pkg/tarsum/tarsum_spec.md deleted file mode 100644 index 89b2e49f9..000000000 --- a/vendor/github.com/docker/docker/pkg/tarsum/tarsum_spec.md +++ /dev/null @@ -1,230 +0,0 @@ -page_title: TarSum checksum specification -page_description: Documentation for algorithms used in the TarSum checksum calculation -page_keywords: docker, checksum, validation, tarsum - -# TarSum Checksum Specification - -## Abstract - -This document describes the algorithms used in performing the TarSum checksum -calculation on filesystem layers, the need for this method over existing -methods, and the versioning of this calculation. - -## Warning - -This checksum algorithm is for best-effort comparison of file trees with fuzzy logic. - -This is _not_ a cryptographic attestation, and should not be considered secure. - -## Introduction - -The transportation of filesystems, regarding Docker, is done with tar(1) -archives. There are a variety of tar serialization formats [2], and a key -concern here is ensuring a repeatable checksum given a set of inputs from a -generic tar archive. Types of transportation include distribution to and from a -registry endpoint, saving and loading through commands or Docker daemon APIs, -transferring the build context from client to Docker daemon, and committing the -filesystem of a container to become an image. - -As tar archives are used for transit, but not preserved in many situations, the -focus of the algorithm is to ensure the integrity of the preserved filesystem, -while maintaining a deterministic accountability. This includes neither -constraining the ordering or manipulation of the files during the creation or -unpacking of the archive, nor include additional metadata state about the file -system attributes. - -## Intended Audience - -This document is outlining the methods used for consistent checksum calculation -for filesystems transported via tar archives. - -Auditing these methodologies is an open and iterative process. This document -should accommodate the review of source code. Ultimately, this document should -be the starting point of further refinements to the algorithm and its future -versions. - -## Concept - -The checksum mechanism must ensure the integrity and assurance of the -filesystem payload. - -## Checksum Algorithm Profile - -A checksum mechanism must define the following operations and attributes: - -* Associated hashing cipher - used to checksum each file payload and attribute - information. -* Checksum list - each file of the filesystem archive has its checksum - calculated from the payload and attributes of the file. The final checksum is - calculated from this list, with specific ordering. -* Version - as the algorithm adapts to requirements, there are behaviors of the - algorithm to manage by versioning. -* Archive being calculated - the tar archive having its checksum calculated - -## Elements of TarSum checksum - -The calculated sum output is a text string. The elements included in the output -of the calculated sum comprise the information needed for validation of the sum -(TarSum version and hashing cipher used) and the expected checksum in hexadecimal -form. - -There are two delimiters used: -* '+' separates TarSum version from hashing cipher -* ':' separates calculation mechanics from expected hash - -Example: - -``` - "tarsum.v1+sha256:220a60ecd4a3c32c282622a625a54db9ba0ff55b5ba9c29c7064a2bc358b6a3e" - | | \ | - | | \ | - |_version_|_cipher__|__ | - | \ | - |_calculation_mechanics_|______________________expected_sum_______________________| -``` - -## Versioning - -Versioning was introduced [0] to accommodate differences in calculation needed, -and ability to maintain reverse compatibility. - -The general algorithm will be describe further in the 'Calculation'. - -### Version0 - -This is the initial version of TarSum. - -Its element in the TarSum checksum string is `tarsum`. - -### Version1 - -Its element in the TarSum checksum is `tarsum.v1`. - -The notable changes in this version: -* Exclusion of file `mtime` from the file information headers, in each file - checksum calculation -* Inclusion of extended attributes (`xattrs`. Also seen as `SCHILY.xattr.` prefixed Pax - tar file info headers) keys and values in each file checksum calculation - -### VersionDev - -*Do not use unless validating refinements to the checksum algorithm* - -Its element in the TarSum checksum is `tarsum.dev`. - -This is a floating place holder for a next version and grounds for testing -changes. The methods used for calculation are subject to change without notice, -and this version is for testing and not for production use. - -## Ciphers - -The official default and standard hashing cipher used in the calculation mechanic -is `sha256`. This refers to SHA256 hash algorithm as defined in FIPS 180-4. - -Though the TarSum algorithm itself is not exclusively bound to the single -hashing cipher `sha256`, support for alternate hashing ciphers was later added -[1]. Use cases for alternate cipher could include future-proofing TarSum -checksum format and using faster cipher hashes for tar filesystem checksums. - -## Calculation - -### Requirement - -As mentioned earlier, the calculation is such that it takes into consideration -the lifecycle of the tar archive. In that the tar archive is not an immutable, -permanent artifact. Otherwise options like relying on a known hashing cipher -checksum of the archive itself would be reliable enough. The tar archive of the -filesystem is used as a transportation medium for Docker images, and the -archive is discarded once its contents are extracted. Therefore, for consistent -validation items such as order of files in the tar archive and time stamps are -subject to change once an image is received. - -### Process - -The method is typically iterative due to reading tar info headers from the -archive stream, though this is not a strict requirement. - -#### Files - -Each file in the tar archive have their contents (headers and body) checksummed -individually using the designated associated hashing cipher. The ordered -headers of the file are written to the checksum calculation first, and then the -payload of the file body. - -The resulting checksum of the file is appended to the list of file sums. The -sum is encoded as a string of the hexadecimal digest. Additionally, the file -name and position in the archive is kept as reference for special ordering. - -#### Headers - -The following headers are read, in this -order ( and the corresponding representation of its value): -* 'name' - string -* 'mode' - string of the base10 integer -* 'uid' - string of the integer -* 'gid' - string of the integer -* 'size' - string of the integer -* 'mtime' (_Version0 only_) - string of integer of the seconds since 1970-01-01 00:00:00 UTC -* 'typeflag' - string of the char -* 'linkname' - string -* 'uname' - string -* 'gname' - string -* 'devmajor' - string of the integer -* 'devminor' - string of the integer - -For >= Version1, the extended attribute headers ("SCHILY.xattr." prefixed pax -headers) included after the above list. These xattrs key/values are first -sorted by the keys. - -#### Header Format - -The ordered headers are written to the hash in the format of - - "{.key}{.value}" - -with no newline. - -#### Body - -After the order headers of the file have been added to the checksum for the -file, the body of the file is written to the hash. - -#### List of file sums - -The list of file sums is sorted by the string of the hexadecimal digest. - -If there are two files in the tar with matching paths, the order of occurrence -for that path is reflected for the sums of the corresponding file header and -body. - -#### Final Checksum - -Begin with a fresh or initial state of the associated hash cipher. If there is -additional payload to include in the TarSum calculation for the archive, it is -written first. Then each checksum from the ordered list of file sums is written -to the hash. - -The resulting digest is formatted per the Elements of TarSum checksum, -including the TarSum version, the associated hash cipher and the hexadecimal -encoded checksum digest. - -## Security Considerations - -The initial version of TarSum has undergone one update that could invalidate -handcrafted tar archives. The tar archive format supports appending of files -with same names as prior files in the archive. The latter file will clobber the -prior file of the same path. Due to this the algorithm now accounts for files -with matching paths, and orders the list of file sums accordingly [3]. - -## Footnotes - -* [0] Versioning https://github.com/docker/docker/commit/747f89cd327db9d50251b17797c4d825162226d0 -* [1] Alternate ciphers https://github.com/docker/docker/commit/4e9925d780665149b8bc940d5ba242ada1973c4e -* [2] Tar http://en.wikipedia.org/wiki/Tar_%28computing%29 -* [3] Name collision https://github.com/docker/docker/commit/c5e6362c53cbbc09ddbabd5a7323e04438b57d31 - -## Acknowledgments - -Joffrey F (shin-) and Guillaume J. Charmes (creack) on the initial work of the -TarSum calculation. - diff --git a/vendor/github.com/docker/docker/pkg/tarsum/tarsum_test.go b/vendor/github.com/docker/docker/pkg/tarsum/tarsum_test.go deleted file mode 100644 index 86df0e2b8..000000000 --- a/vendor/github.com/docker/docker/pkg/tarsum/tarsum_test.go +++ /dev/null @@ -1,664 +0,0 @@ -package tarsum - -import ( - "archive/tar" - "bytes" - "compress/gzip" - "crypto/md5" - "crypto/rand" - "crypto/sha1" - "crypto/sha256" - "crypto/sha512" - "encoding/hex" - "fmt" - "io" - "io/ioutil" - "os" - "strings" - "testing" -) - -type testLayer struct { - filename string - options *sizedOptions - jsonfile string - gzip bool - tarsum string - version Version - hash THash -} - -var testLayers = []testLayer{ - { - filename: "testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar", - jsonfile: "testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/json", - version: Version0, - tarsum: "tarsum+sha256:4095cc12fa5fdb1ab2760377e1cd0c4ecdd3e61b4f9b82319d96fcea6c9a41c6"}, - { - filename: "testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar", - jsonfile: "testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/json", - version: VersionDev, - tarsum: "tarsum.dev+sha256:db56e35eec6ce65ba1588c20ba6b1ea23743b59e81fb6b7f358ccbde5580345c"}, - { - filename: "testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar", - jsonfile: "testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/json", - gzip: true, - tarsum: "tarsum+sha256:4095cc12fa5fdb1ab2760377e1cd0c4ecdd3e61b4f9b82319d96fcea6c9a41c6"}, - { - // Tests existing version of TarSum when xattrs are present - filename: "testdata/xattr/layer.tar", - jsonfile: "testdata/xattr/json", - version: Version0, - tarsum: "tarsum+sha256:07e304a8dbcb215b37649fde1a699f8aeea47e60815707f1cdf4d55d25ff6ab4"}, - { - // Tests next version of TarSum when xattrs are present - filename: "testdata/xattr/layer.tar", - jsonfile: "testdata/xattr/json", - version: VersionDev, - tarsum: "tarsum.dev+sha256:6c58917892d77b3b357b0f9ad1e28e1f4ae4de3a8006bd3beb8beda214d8fd16"}, - { - filename: "testdata/511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/layer.tar", - jsonfile: "testdata/511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/json", - tarsum: "tarsum+sha256:c66bd5ec9f87b8f4c6135ca37684618f486a3dd1d113b138d0a177bfa39c2571"}, - { - options: &sizedOptions{1, 1024 * 1024, false, false}, // a 1mb file (in memory) - tarsum: "tarsum+sha256:8bf12d7e67c51ee2e8306cba569398b1b9f419969521a12ffb9d8875e8836738"}, - { - // this tar has two files with the same path - filename: "testdata/collision/collision-0.tar", - tarsum: "tarsum+sha256:08653904a68d3ab5c59e65ef58c49c1581caa3c34744f8d354b3f575ea04424a"}, - { - // this tar has the same two files (with the same path), but reversed order. ensuring is has different hash than above - filename: "testdata/collision/collision-1.tar", - tarsum: "tarsum+sha256:b51c13fbefe158b5ce420d2b930eef54c5cd55c50a2ee4abdddea8fa9f081e0d"}, - { - // this tar has newer of collider-0.tar, ensuring is has different hash - filename: "testdata/collision/collision-2.tar", - tarsum: "tarsum+sha256:381547080919bb82691e995508ae20ed33ce0f6948d41cafbeb70ce20c73ee8e"}, - { - // this tar has newer of collider-1.tar, ensuring is has different hash - filename: "testdata/collision/collision-3.tar", - tarsum: "tarsum+sha256:f886e431c08143164a676805205979cd8fa535dfcef714db5515650eea5a7c0f"}, - { - options: &sizedOptions{1, 1024 * 1024, false, false}, // a 1mb file (in memory) - tarsum: "tarsum+md5:0d7529ec7a8360155b48134b8e599f53", - hash: md5THash, - }, - { - options: &sizedOptions{1, 1024 * 1024, false, false}, // a 1mb file (in memory) - tarsum: "tarsum+sha1:f1fee39c5925807ff75ef1925e7a23be444ba4df", - hash: sha1Hash, - }, - { - options: &sizedOptions{1, 1024 * 1024, false, false}, // a 1mb file (in memory) - tarsum: "tarsum+sha224:6319390c0b061d639085d8748b14cd55f697cf9313805218b21cf61c", - hash: sha224Hash, - }, - { - options: &sizedOptions{1, 1024 * 1024, false, false}, // a 1mb file (in memory) - tarsum: "tarsum+sha384:a578ce3ce29a2ae03b8ed7c26f47d0f75b4fc849557c62454be4b5ffd66ba021e713b48ce71e947b43aab57afd5a7636", - hash: sha384Hash, - }, - { - options: &sizedOptions{1, 1024 * 1024, false, false}, // a 1mb file (in memory) - tarsum: "tarsum+sha512:e9bfb90ca5a4dfc93c46ee061a5cf9837de6d2fdf82544d6460d3147290aecfabf7b5e415b9b6e72db9b8941f149d5d69fb17a394cbfaf2eac523bd9eae21855", - hash: sha512Hash, - }, -} - -type sizedOptions struct { - num int64 - size int64 - isRand bool - realFile bool -} - -// make a tar: -// * num is the number of files the tar should have -// * size is the bytes per file -// * isRand is whether the contents of the files should be a random chunk (otherwise it's all zeros) -// * realFile will write to a TempFile, instead of an in memory buffer -func sizedTar(opts sizedOptions) io.Reader { - var ( - fh io.ReadWriter - err error - ) - if opts.realFile { - fh, err = ioutil.TempFile("", "tarsum") - if err != nil { - return nil - } - } else { - fh = bytes.NewBuffer([]byte{}) - } - tarW := tar.NewWriter(fh) - defer tarW.Close() - for i := int64(0); i < opts.num; i++ { - err := tarW.WriteHeader(&tar.Header{ - Name: fmt.Sprintf("/testdata%d", i), - Mode: 0755, - Uid: 0, - Gid: 0, - Size: opts.size, - }) - if err != nil { - return nil - } - var rBuf []byte - if opts.isRand { - rBuf = make([]byte, 8) - _, err = rand.Read(rBuf) - if err != nil { - return nil - } - } else { - rBuf = []byte{0, 0, 0, 0, 0, 0, 0, 0} - } - - for i := int64(0); i < opts.size/int64(8); i++ { - tarW.Write(rBuf) - } - } - return fh -} - -func emptyTarSum(gzip bool) (TarSum, error) { - reader, writer := io.Pipe() - tarWriter := tar.NewWriter(writer) - - // Immediately close tarWriter and write-end of the - // Pipe in a separate goroutine so we don't block. - go func() { - tarWriter.Close() - writer.Close() - }() - - return NewTarSum(reader, !gzip, Version0) -} - -// Test errors on NewTarsumForLabel -func TestNewTarSumForLabelInvalid(t *testing.T) { - reader := strings.NewReader("") - - if _, err := NewTarSumForLabel(reader, true, "invalidlabel"); err == nil { - t.Fatalf("Expected an error, got nothing.") - } - - if _, err := NewTarSumForLabel(reader, true, "invalid+sha256"); err == nil { - t.Fatalf("Expected an error, got nothing.") - } - if _, err := NewTarSumForLabel(reader, true, "tarsum.v1+invalid"); err == nil { - t.Fatalf("Expected an error, got nothing.") - } -} - -func TestNewTarSumForLabel(t *testing.T) { - - layer := testLayers[0] - - reader, err := os.Open(layer.filename) - if err != nil { - t.Fatal(err) - } - defer reader.Close() - - label := strings.Split(layer.tarsum, ":")[0] - ts, err := NewTarSumForLabel(reader, false, label) - if err != nil { - t.Fatal(err) - } - - // Make sure it actually worked by reading a little bit of it - nbByteToRead := 8 * 1024 - dBuf := make([]byte, nbByteToRead) - _, err = ts.Read(dBuf) - if err != nil { - t.Errorf("failed to read %vKB from %s: %s", nbByteToRead, layer.filename, err) - } -} - -// TestEmptyTar tests that tarsum does not fail to read an empty tar -// and correctly returns the hex digest of an empty hash. -func TestEmptyTar(t *testing.T) { - // Test without gzip. - ts, err := emptyTarSum(false) - if err != nil { - t.Fatal(err) - } - - zeroBlock := make([]byte, 1024) - buf := new(bytes.Buffer) - - n, err := io.Copy(buf, ts) - if err != nil { - t.Fatal(err) - } - - if n != int64(len(zeroBlock)) || !bytes.Equal(buf.Bytes(), zeroBlock) { - t.Fatalf("tarSum did not write the correct number of zeroed bytes: %d", n) - } - - expectedSum := ts.Version().String() + "+sha256:" + hex.EncodeToString(sha256.New().Sum(nil)) - resultSum := ts.Sum(nil) - - if resultSum != expectedSum { - t.Fatalf("expected [%s] but got [%s]", expectedSum, resultSum) - } - - // Test with gzip. - ts, err = emptyTarSum(true) - if err != nil { - t.Fatal(err) - } - buf.Reset() - - n, err = io.Copy(buf, ts) - if err != nil { - t.Fatal(err) - } - - bufgz := new(bytes.Buffer) - gz := gzip.NewWriter(bufgz) - n, err = io.Copy(gz, bytes.NewBuffer(zeroBlock)) - gz.Close() - gzBytes := bufgz.Bytes() - - if n != int64(len(zeroBlock)) || !bytes.Equal(buf.Bytes(), gzBytes) { - t.Fatalf("tarSum did not write the correct number of gzipped-zeroed bytes: %d", n) - } - - resultSum = ts.Sum(nil) - - if resultSum != expectedSum { - t.Fatalf("expected [%s] but got [%s]", expectedSum, resultSum) - } - - // Test without ever actually writing anything. - if ts, err = NewTarSum(bytes.NewReader([]byte{}), true, Version0); err != nil { - t.Fatal(err) - } - - resultSum = ts.Sum(nil) - - if resultSum != expectedSum { - t.Fatalf("expected [%s] but got [%s]", expectedSum, resultSum) - } -} - -var ( - md5THash = NewTHash("md5", md5.New) - sha1Hash = NewTHash("sha1", sha1.New) - sha224Hash = NewTHash("sha224", sha256.New224) - sha384Hash = NewTHash("sha384", sha512.New384) - sha512Hash = NewTHash("sha512", sha512.New) -) - -// Test all the build-in read size : buf8K, buf16K, buf32K and more -func TestTarSumsReadSize(t *testing.T) { - // Test always on the same layer (that is big enough) - layer := testLayers[0] - - for i := 0; i < 5; i++ { - - reader, err := os.Open(layer.filename) - if err != nil { - t.Fatal(err) - } - defer reader.Close() - - ts, err := NewTarSum(reader, false, layer.version) - if err != nil { - t.Fatal(err) - } - - // Read and discard bytes so that it populates sums - nbByteToRead := (i + 1) * 8 * 1024 - dBuf := make([]byte, nbByteToRead) - _, err = ts.Read(dBuf) - if err != nil { - t.Errorf("failed to read %vKB from %s: %s", nbByteToRead, layer.filename, err) - continue - } - } -} - -func TestTarSums(t *testing.T) { - for _, layer := range testLayers { - var ( - fh io.Reader - err error - ) - if len(layer.filename) > 0 { - fh, err = os.Open(layer.filename) - if err != nil { - t.Errorf("failed to open %s: %s", layer.filename, err) - continue - } - } else if layer.options != nil { - fh = sizedTar(*layer.options) - } else { - // What else is there to test? - t.Errorf("what to do with %#v", layer) - continue - } - if file, ok := fh.(*os.File); ok { - defer file.Close() - } - - var ts TarSum - if layer.hash == nil { - // double negatives! - ts, err = NewTarSum(fh, !layer.gzip, layer.version) - } else { - ts, err = NewTarSumHash(fh, !layer.gzip, layer.version, layer.hash) - } - if err != nil { - t.Errorf("%q :: %q", err, layer.filename) - continue - } - - // Read variable number of bytes to test dynamic buffer - dBuf := make([]byte, 1) - _, err = ts.Read(dBuf) - if err != nil { - t.Errorf("failed to read 1B from %s: %s", layer.filename, err) - continue - } - dBuf = make([]byte, 16*1024) - _, err = ts.Read(dBuf) - if err != nil { - t.Errorf("failed to read 16KB from %s: %s", layer.filename, err) - continue - } - - // Read and discard remaining bytes - _, err = io.Copy(ioutil.Discard, ts) - if err != nil { - t.Errorf("failed to copy from %s: %s", layer.filename, err) - continue - } - var gotSum string - if len(layer.jsonfile) > 0 { - jfh, err := os.Open(layer.jsonfile) - if err != nil { - t.Errorf("failed to open %s: %s", layer.jsonfile, err) - continue - } - defer jfh.Close() - - buf, err := ioutil.ReadAll(jfh) - if err != nil { - t.Errorf("failed to readAll %s: %s", layer.jsonfile, err) - continue - } - gotSum = ts.Sum(buf) - } else { - gotSum = ts.Sum(nil) - } - - if layer.tarsum != gotSum { - t.Errorf("expecting [%s], but got [%s]", layer.tarsum, gotSum) - } - var expectedHashName string - if layer.hash != nil { - expectedHashName = layer.hash.Name() - } else { - expectedHashName = DefaultTHash.Name() - } - if expectedHashName != ts.Hash().Name() { - t.Errorf("expecting hash [%v], but got [%s]", expectedHashName, ts.Hash().Name()) - } - } -} - -func TestIteration(t *testing.T) { - headerTests := []struct { - expectedSum string // TODO(vbatts) it would be nice to get individual sums of each - version Version - hdr *tar.Header - data []byte - }{ - { - "tarsum+sha256:626c4a2e9a467d65c33ae81f7f3dedd4de8ccaee72af73223c4bc4718cbc7bbd", - Version0, - &tar.Header{ - Name: "file.txt", - Size: 0, - Typeflag: tar.TypeReg, - Devminor: 0, - Devmajor: 0, - }, - []byte(""), - }, - { - "tarsum.dev+sha256:6ffd43a1573a9913325b4918e124ee982a99c0f3cba90fc032a65f5e20bdd465", - VersionDev, - &tar.Header{ - Name: "file.txt", - Size: 0, - Typeflag: tar.TypeReg, - Devminor: 0, - Devmajor: 0, - }, - []byte(""), - }, - { - "tarsum.dev+sha256:b38166c059e11fb77bef30bf16fba7584446e80fcc156ff46d47e36c5305d8ef", - VersionDev, - &tar.Header{ - Name: "another.txt", - Uid: 1000, - Gid: 1000, - Uname: "slartibartfast", - Gname: "users", - Size: 4, - Typeflag: tar.TypeReg, - Devminor: 0, - Devmajor: 0, - }, - []byte("test"), - }, - { - "tarsum.dev+sha256:4cc2e71ac5d31833ab2be9b4f7842a14ce595ec96a37af4ed08f87bc374228cd", - VersionDev, - &tar.Header{ - Name: "xattrs.txt", - Uid: 1000, - Gid: 1000, - Uname: "slartibartfast", - Gname: "users", - Size: 4, - Typeflag: tar.TypeReg, - Xattrs: map[string]string{ - "user.key1": "value1", - "user.key2": "value2", - }, - }, - []byte("test"), - }, - { - "tarsum.dev+sha256:65f4284fa32c0d4112dd93c3637697805866415b570587e4fd266af241503760", - VersionDev, - &tar.Header{ - Name: "xattrs.txt", - Uid: 1000, - Gid: 1000, - Uname: "slartibartfast", - Gname: "users", - Size: 4, - Typeflag: tar.TypeReg, - Xattrs: map[string]string{ - "user.KEY1": "value1", // adding different case to ensure different sum - "user.key2": "value2", - }, - }, - []byte("test"), - }, - { - "tarsum+sha256:c12bb6f1303a9ddbf4576c52da74973c00d14c109bcfa76b708d5da1154a07fa", - Version0, - &tar.Header{ - Name: "xattrs.txt", - Uid: 1000, - Gid: 1000, - Uname: "slartibartfast", - Gname: "users", - Size: 4, - Typeflag: tar.TypeReg, - Xattrs: map[string]string{ - "user.NOT": "CALCULATED", - }, - }, - []byte("test"), - }, - } - for _, htest := range headerTests { - s, err := renderSumForHeader(htest.version, htest.hdr, htest.data) - if err != nil { - t.Fatal(err) - } - - if s != htest.expectedSum { - t.Errorf("expected sum: %q, got: %q", htest.expectedSum, s) - } - } - -} - -func renderSumForHeader(v Version, h *tar.Header, data []byte) (string, error) { - buf := bytes.NewBuffer(nil) - // first build our test tar - tw := tar.NewWriter(buf) - if err := tw.WriteHeader(h); err != nil { - return "", err - } - if _, err := tw.Write(data); err != nil { - return "", err - } - tw.Close() - - ts, err := NewTarSum(buf, true, v) - if err != nil { - return "", err - } - tr := tar.NewReader(ts) - for { - hdr, err := tr.Next() - if hdr == nil || err == io.EOF { - // Signals the end of the archive. - break - } - if err != nil { - return "", err - } - if _, err = io.Copy(ioutil.Discard, tr); err != nil { - return "", err - } - } - return ts.Sum(nil), nil -} - -func Benchmark9kTar(b *testing.B) { - buf := bytes.NewBuffer([]byte{}) - fh, err := os.Open("testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar") - if err != nil { - b.Error(err) - return - } - defer fh.Close() - - n, err := io.Copy(buf, fh) - if err != nil { - b.Error(err) - return - } - - reader := bytes.NewReader(buf.Bytes()) - - b.SetBytes(n) - b.ResetTimer() - for i := 0; i < b.N; i++ { - reader.Seek(0, 0) - ts, err := NewTarSum(reader, true, Version0) - if err != nil { - b.Error(err) - return - } - io.Copy(ioutil.Discard, ts) - ts.Sum(nil) - } -} - -func Benchmark9kTarGzip(b *testing.B) { - buf := bytes.NewBuffer([]byte{}) - fh, err := os.Open("testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar") - if err != nil { - b.Error(err) - return - } - defer fh.Close() - - n, err := io.Copy(buf, fh) - if err != nil { - b.Error(err) - return - } - - reader := bytes.NewReader(buf.Bytes()) - - b.SetBytes(n) - b.ResetTimer() - for i := 0; i < b.N; i++ { - reader.Seek(0, 0) - ts, err := NewTarSum(reader, false, Version0) - if err != nil { - b.Error(err) - return - } - io.Copy(ioutil.Discard, ts) - ts.Sum(nil) - } -} - -// this is a single big file in the tar archive -func Benchmark1mbSingleFileTar(b *testing.B) { - benchmarkTar(b, sizedOptions{1, 1024 * 1024, true, true}, false) -} - -// this is a single big file in the tar archive -func Benchmark1mbSingleFileTarGzip(b *testing.B) { - benchmarkTar(b, sizedOptions{1, 1024 * 1024, true, true}, true) -} - -// this is 1024 1k files in the tar archive -func Benchmark1kFilesTar(b *testing.B) { - benchmarkTar(b, sizedOptions{1024, 1024, true, true}, false) -} - -// this is 1024 1k files in the tar archive -func Benchmark1kFilesTarGzip(b *testing.B) { - benchmarkTar(b, sizedOptions{1024, 1024, true, true}, true) -} - -func benchmarkTar(b *testing.B, opts sizedOptions, isGzip bool) { - var fh *os.File - tarReader := sizedTar(opts) - if br, ok := tarReader.(*os.File); ok { - fh = br - } - defer os.Remove(fh.Name()) - defer fh.Close() - - b.SetBytes(opts.size * opts.num) - b.ResetTimer() - for i := 0; i < b.N; i++ { - ts, err := NewTarSum(fh, !isGzip, Version0) - if err != nil { - b.Error(err) - return - } - io.Copy(ioutil.Discard, ts) - ts.Sum(nil) - fh.Seek(0, 0) - } -} diff --git a/vendor/github.com/docker/docker/pkg/tarsum/testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/json b/vendor/github.com/docker/docker/pkg/tarsum/testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/json deleted file mode 100644 index 48e2af349..000000000 --- a/vendor/github.com/docker/docker/pkg/tarsum/testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/json +++ /dev/null @@ -1 +0,0 @@ -{"id":"46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457","parent":"def3f9165934325dfd027c86530b2ea49bb57a0963eb1336b3a0415ff6fd56de","created":"2014-04-07T02:45:52.610504484Z","container":"e0f07f8d72cae171a3dcc35859960e7e956e0628bce6fedc4122bf55b2c287c7","container_config":{"Hostname":"88807319f25e","Domainname":"","User":"","Memory":0,"MemorySwap":0,"CpuShares":0,"AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":null,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["HOME=/","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","sed -ri 's/^(%wheel.*)(ALL)$/\\1NOPASSWD: \\2/' /etc/sudoers"],"Image":"def3f9165934325dfd027c86530b2ea49bb57a0963eb1336b3a0415ff6fd56de","Volumes":null,"WorkingDir":"","Entrypoint":null,"NetworkDisabled":false,"OnBuild":[]},"docker_version":"0.9.1-dev","config":{"Hostname":"88807319f25e","Domainname":"","User":"","Memory":0,"MemorySwap":0,"CpuShares":0,"AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":null,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["HOME=/","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":null,"Image":"def3f9165934325dfd027c86530b2ea49bb57a0963eb1336b3a0415ff6fd56de","Volumes":null,"WorkingDir":"","Entrypoint":null,"NetworkDisabled":false,"OnBuild":[]},"architecture":"amd64","os":"linux","Size":3425} \ No newline at end of file diff --git a/vendor/github.com/docker/docker/pkg/tarsum/testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar b/vendor/github.com/docker/docker/pkg/tarsum/testdata/46af0962ab5afeb5ce6740d4d91652e69206fc991fd5328c1a94d364ad00e457/layer.tar deleted file mode 100644 index dfd5c204aea77673f13fdd2f81cb4af1c155c00c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9216 zcmeHMYfsx)8s=;H6|bl&iYAZ?p-5<1$(y*vYHk~c?XX{vu}|fzRr1|&zyvK1! zQq)nWWVPA}63Myvy*}^F5Qtg*V8=g=M!Ru&adFTnf40B*^q|=~Z#CM@#>M%EgGRH_ zXtfULV#j(J_Jz`34wZgZ*0ym!%kRHL9{_(p&BZRoHJYu)<>loz?$!PU{9Bjp<^i?p zS)Tg!r=9Az$G@(0Ao6^75%A;qpMSV)ukcqQn%1X5y|oh!_xLmZX`y%GUBmQG;D6af z{a@yPg@1D=8t(B&ZtcXgE2ck=f9pf*x&ANlU$J}L#UB59rsJ=#>(otde**vZ1?PXJ z)y|dMh8z!Kfh=;zN!B|J)*y8)L$Hbq5c2K_rK=l{{8R8czxwV#$Odd zDsuJ8oS)h8`+U3IsNVOszdy8F?XCC!X1jHMK)Xr!XT8koFP{Hz-;!IxPhJ$Ib48h# zYv~t}ms6n-7Nk?ki-cxgF4IDhpT@D51d2R$2x=V)%F|Svhif#KI>gHaB|@O7JU(A% zo>KEP56(cuboN&-&LROexgfmf&txD1^0c9NNVQI5N~dNwm64!nnnQFH317=JF`{vu zi^$WUtCWHQq4Y!Yy@W{oRoV29sUd<=@!~sJ;!ok8>_qYfz|Ch12+9P6$8i`#qvqS zhsLT-8QL!zwhRx(aXaYF&PwD5LLOm%T#Ds>) z{YV0A>qPL*aFLnz9*nfyl@!I3_Ss=Y=MKNEA zG8|$lPj#9`#(W1sgCgK@f)P?2A)0uPB8Gf6TLITOAl@|29e$jAvBox=W-QCrr59N% zKg$7Xy=69F7QR_X7D_-i2hs*J)6%&RIBr9LDPPP_-? z-X`DPuwzY(j+Gk=rWL_Msfvvp-prW$3W(MwPPgEZO^EI!{*XIAuLp zlpj9k85vO{{2kR4hD{4c;~{+QmhNVfq;xeepJc>QQ@QJfEkdQVBbPJuiA~nsv9l~O zrN&UpxC9i`6;rQ>v?7%WUrr@(gXOs4JE=IN=}4(?RS=2GEd9-ogTEiuP>Fqyb6;vM ziV-Q;Z|ZT?Vz^rPk?`^}6a`cC_=9V1=*>jc&y0jq{h|=m&BK+Jpv}ea1?sKVi^Gj` zk<9K*;4?gK^?Jl6-g0L4kQcX>OZUHi{>Odi#u~f!gnqSdCpW{f zGr2q31WO6O$i;nz9#NH-D^8Rv6Xcv%XFkhmyBsZ;8k2ftd;fPtN1v+`G zPRv~5E)wm1y}~(Py9GwK;`;9K2C_2#(Rc=qFBTa z>?ZUNHvSmq9G9)M%0u+CW!J=jv1~Clz-avUIImk%<&=a9uI;2EY~~stiCKTsh|Oow<5; z$eY1%WV!B_?iFikc)C2TV46YQucl=WfmM#jY|_4sK>Njf)j#u#Y{x@V_A!c2o<`D? zX*2YQ4A)U054Qh4y3hVk?0?5^Us~rh*TViU9vl!r009ILKmY**5I_I{1Q0*~0R#|0 Y009ILKmY**5I_I{1Q0*~fqxTt0{2EK)Bpeg diff --git a/vendor/github.com/docker/docker/pkg/tarsum/testdata/collision/collision-2.tar b/vendor/github.com/docker/docker/pkg/tarsum/testdata/collision/collision-2.tar deleted file mode 100644 index 7b5c04a9644808851fcccab5c3c240bf342abd93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10240 zcmeIuF%E+;425COJw=XS2L~?Dp<74P5hRe1I+e8NZ(w35>V(Abzr};)_<@(2e`|Ha`Z>GG~@_KYd${~ON w0tg_000IagfB*srAbVE5xzPBd+@To)G|2840byWhU|?oqf;;~Mb02E{2kHRk de~R-YhD)#rjPU%AB}7JrMnhmU1V%^*0091(G-Ch& diff --git a/vendor/github.com/docker/docker/pkg/tarsum/versioning.go b/vendor/github.com/docker/docker/pkg/tarsum/versioning.go deleted file mode 100644 index 288228685..000000000 --- a/vendor/github.com/docker/docker/pkg/tarsum/versioning.go +++ /dev/null @@ -1,150 +0,0 @@ -package tarsum - -import ( - "archive/tar" - "errors" - "sort" - "strconv" - "strings" -) - -// Version is used for versioning of the TarSum algorithm -// based on the prefix of the hash used -// i.e. "tarsum+sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b" -type Version int - -// Prefix of "tarsum" -const ( - Version0 Version = iota - Version1 - // VersionDev this constant will be either the latest or an unsettled next-version of the TarSum calculation - VersionDev -) - -// VersionLabelForChecksum returns the label for the given tarsum -// checksum, i.e., everything before the first `+` character in -// the string or an empty string if no label separator is found. -func VersionLabelForChecksum(checksum string) string { - // Checksums are in the form: {versionLabel}+{hashID}:{hex} - sepIndex := strings.Index(checksum, "+") - if sepIndex < 0 { - return "" - } - return checksum[:sepIndex] -} - -// GetVersions gets a list of all known tarsum versions. -func GetVersions() []Version { - v := []Version{} - for k := range tarSumVersions { - v = append(v, k) - } - return v -} - -var ( - tarSumVersions = map[Version]string{ - Version0: "tarsum", - Version1: "tarsum.v1", - VersionDev: "tarsum.dev", - } - tarSumVersionsByName = map[string]Version{ - "tarsum": Version0, - "tarsum.v1": Version1, - "tarsum.dev": VersionDev, - } -) - -func (tsv Version) String() string { - return tarSumVersions[tsv] -} - -// GetVersionFromTarsum returns the Version from the provided string. -func GetVersionFromTarsum(tarsum string) (Version, error) { - tsv := tarsum - if strings.Contains(tarsum, "+") { - tsv = strings.SplitN(tarsum, "+", 2)[0] - } - for v, s := range tarSumVersions { - if s == tsv { - return v, nil - } - } - return -1, ErrNotVersion -} - -// Errors that may be returned by functions in this package -var ( - ErrNotVersion = errors.New("string does not include a TarSum Version") - ErrVersionNotImplemented = errors.New("TarSum Version is not yet implemented") -) - -// tarHeaderSelector is the interface which different versions -// of tarsum should use for selecting and ordering tar headers -// for each item in the archive. -type tarHeaderSelector interface { - selectHeaders(h *tar.Header) (orderedHeaders [][2]string) -} - -type tarHeaderSelectFunc func(h *tar.Header) (orderedHeaders [][2]string) - -func (f tarHeaderSelectFunc) selectHeaders(h *tar.Header) (orderedHeaders [][2]string) { - return f(h) -} - -func v0TarHeaderSelect(h *tar.Header) (orderedHeaders [][2]string) { - return [][2]string{ - {"name", h.Name}, - {"mode", strconv.FormatInt(h.Mode, 10)}, - {"uid", strconv.Itoa(h.Uid)}, - {"gid", strconv.Itoa(h.Gid)}, - {"size", strconv.FormatInt(h.Size, 10)}, - {"mtime", strconv.FormatInt(h.ModTime.UTC().Unix(), 10)}, - {"typeflag", string([]byte{h.Typeflag})}, - {"linkname", h.Linkname}, - {"uname", h.Uname}, - {"gname", h.Gname}, - {"devmajor", strconv.FormatInt(h.Devmajor, 10)}, - {"devminor", strconv.FormatInt(h.Devminor, 10)}, - } -} - -func v1TarHeaderSelect(h *tar.Header) (orderedHeaders [][2]string) { - // Get extended attributes. - xAttrKeys := make([]string, len(h.Xattrs)) - for k := range h.Xattrs { - xAttrKeys = append(xAttrKeys, k) - } - sort.Strings(xAttrKeys) - - // Make the slice with enough capacity to hold the 11 basic headers - // we want from the v0 selector plus however many xattrs we have. - orderedHeaders = make([][2]string, 0, 11+len(xAttrKeys)) - - // Copy all headers from v0 excluding the 'mtime' header (the 5th element). - v0headers := v0TarHeaderSelect(h) - orderedHeaders = append(orderedHeaders, v0headers[0:5]...) - orderedHeaders = append(orderedHeaders, v0headers[6:]...) - - // Finally, append the sorted xattrs. - for _, k := range xAttrKeys { - orderedHeaders = append(orderedHeaders, [2]string{k, h.Xattrs[k]}) - } - - return -} - -var registeredHeaderSelectors = map[Version]tarHeaderSelectFunc{ - Version0: v0TarHeaderSelect, - Version1: v1TarHeaderSelect, - VersionDev: v1TarHeaderSelect, -} - -func getTarHeaderSelector(v Version) (tarHeaderSelector, error) { - headerSelector, ok := registeredHeaderSelectors[v] - if !ok { - return nil, ErrVersionNotImplemented - } - - return headerSelector, nil -} diff --git a/vendor/github.com/docker/docker/pkg/tarsum/versioning_test.go b/vendor/github.com/docker/docker/pkg/tarsum/versioning_test.go deleted file mode 100644 index 88e0a5783..000000000 --- a/vendor/github.com/docker/docker/pkg/tarsum/versioning_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package tarsum - -import ( - "testing" -) - -func TestVersionLabelForChecksum(t *testing.T) { - version := VersionLabelForChecksum("tarsum+sha256:deadbeef") - if version != "tarsum" { - t.Fatalf("Version should have been 'tarsum', was %v", version) - } - version = VersionLabelForChecksum("tarsum.v1+sha256:deadbeef") - if version != "tarsum.v1" { - t.Fatalf("Version should have been 'tarsum.v1', was %v", version) - } - version = VersionLabelForChecksum("something+somethingelse") - if version != "something" { - t.Fatalf("Version should have been 'something', was %v", version) - } - version = VersionLabelForChecksum("invalidChecksum") - if version != "" { - t.Fatalf("Version should have been empty, was %v", version) - } -} - -func TestVersion(t *testing.T) { - expected := "tarsum" - var v Version - if v.String() != expected { - t.Errorf("expected %q, got %q", expected, v.String()) - } - - expected = "tarsum.v1" - v = 1 - if v.String() != expected { - t.Errorf("expected %q, got %q", expected, v.String()) - } - - expected = "tarsum.dev" - v = 2 - if v.String() != expected { - t.Errorf("expected %q, got %q", expected, v.String()) - } -} - -func TestGetVersion(t *testing.T) { - testSet := []struct { - Str string - Expected Version - }{ - {"tarsum+sha256:e58fcf7418d4390dec8e8fb69d88c06ec07039d651fedd3aa72af9972e7d046b", Version0}, - {"tarsum+sha256", Version0}, - {"tarsum", Version0}, - {"tarsum.dev", VersionDev}, - {"tarsum.dev+sha256:deadbeef", VersionDev}, - } - - for _, ts := range testSet { - v, err := GetVersionFromTarsum(ts.Str) - if err != nil { - t.Fatalf("%q : %s", err, ts.Str) - } - if v != ts.Expected { - t.Errorf("expected %d (%q), got %d (%q)", ts.Expected, ts.Expected, v, v) - } - } - - // test one that does not exist, to ensure it errors - str := "weak+md5:abcdeabcde" - _, err := GetVersionFromTarsum(str) - if err != ErrNotVersion { - t.Fatalf("%q : %s", err, str) - } -} - -func TestGetVersions(t *testing.T) { - expected := []Version{ - Version0, - Version1, - VersionDev, - } - versions := GetVersions() - if len(versions) != len(expected) { - t.Fatalf("Expected %v versions, got %v", len(expected), len(versions)) - } - if !containsVersion(versions, expected[0]) || !containsVersion(versions, expected[1]) || !containsVersion(versions, expected[2]) { - t.Fatalf("Expected [%v], got [%v]", expected, versions) - } -} - -func containsVersion(versions []Version, version Version) bool { - for _, v := range versions { - if v == version { - return true - } - } - return false -} diff --git a/vendor/github.com/docker/docker/pkg/tarsum/writercloser.go b/vendor/github.com/docker/docker/pkg/tarsum/writercloser.go deleted file mode 100644 index 9727ecde3..000000000 --- a/vendor/github.com/docker/docker/pkg/tarsum/writercloser.go +++ /dev/null @@ -1,22 +0,0 @@ -package tarsum - -import ( - "io" -) - -type writeCloseFlusher interface { - io.WriteCloser - Flush() error -} - -type nopCloseFlusher struct { - io.Writer -} - -func (n *nopCloseFlusher) Close() error { - return nil -} - -func (n *nopCloseFlusher) Flush() error { - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/ascii.go b/vendor/github.com/docker/docker/pkg/term/ascii.go deleted file mode 100644 index f5262bccf..000000000 --- a/vendor/github.com/docker/docker/pkg/term/ascii.go +++ /dev/null @@ -1,66 +0,0 @@ -package term - -import ( - "fmt" - "strings" -) - -// ASCII list the possible supported ASCII key sequence -var ASCII = []string{ - "ctrl-@", - "ctrl-a", - "ctrl-b", - "ctrl-c", - "ctrl-d", - "ctrl-e", - "ctrl-f", - "ctrl-g", - "ctrl-h", - "ctrl-i", - "ctrl-j", - "ctrl-k", - "ctrl-l", - "ctrl-m", - "ctrl-n", - "ctrl-o", - "ctrl-p", - "ctrl-q", - "ctrl-r", - "ctrl-s", - "ctrl-t", - "ctrl-u", - "ctrl-v", - "ctrl-w", - "ctrl-x", - "ctrl-y", - "ctrl-z", - "ctrl-[", - "ctrl-\\", - "ctrl-]", - "ctrl-^", - "ctrl-_", -} - -// ToBytes converts a string representing a suite of key-sequence to the corresponding ASCII code. -func ToBytes(keys string) ([]byte, error) { - codes := []byte{} -next: - for _, key := range strings.Split(keys, ",") { - if len(key) != 1 { - for code, ctrl := range ASCII { - if ctrl == key { - codes = append(codes, byte(code)) - continue next - } - } - if key == "DEL" { - codes = append(codes, 127) - } else { - return nil, fmt.Errorf("Unknown character: '%s'", key) - } - } else { - codes = append(codes, byte(key[0])) - } - } - return codes, nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/ascii_test.go b/vendor/github.com/docker/docker/pkg/term/ascii_test.go deleted file mode 100644 index 4a1e7f302..000000000 --- a/vendor/github.com/docker/docker/pkg/term/ascii_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package term - -import "testing" - -func TestToBytes(t *testing.T) { - codes, err := ToBytes("ctrl-a,a") - if err != nil { - t.Fatal(err) - } - if len(codes) != 2 { - t.Fatalf("Expected 2 codes, got %d", len(codes)) - } - if codes[0] != 1 || codes[1] != 97 { - t.Fatalf("Expected '1' '97', got '%d' '%d'", codes[0], codes[1]) - } - - codes, err = ToBytes("shift-z") - if err == nil { - t.Fatalf("Expected error, got none") - } - - codes, err = ToBytes("ctrl-@,ctrl-[,~,ctrl-o") - if err != nil { - t.Fatal(err) - } - if len(codes) != 4 { - t.Fatalf("Expected 4 codes, got %d", len(codes)) - } - if codes[0] != 0 || codes[1] != 27 || codes[2] != 126 || codes[3] != 15 { - t.Fatalf("Expected '0' '27' '126', '15', got '%d' '%d' '%d' '%d'", codes[0], codes[1], codes[2], codes[3]) - } - - codes, err = ToBytes("DEL,+") - if err != nil { - t.Fatal(err) - } - if len(codes) != 2 { - t.Fatalf("Expected 2 codes, got %d", len(codes)) - } - if codes[0] != 127 || codes[1] != 43 { - t.Fatalf("Expected '127 '43'', got '%d' '%d'", codes[0], codes[1]) - } -} diff --git a/vendor/github.com/docker/docker/pkg/term/tc_linux_cgo.go b/vendor/github.com/docker/docker/pkg/term/tc_linux_cgo.go deleted file mode 100644 index 59dac5ba8..000000000 --- a/vendor/github.com/docker/docker/pkg/term/tc_linux_cgo.go +++ /dev/null @@ -1,50 +0,0 @@ -// +build linux,cgo - -package term - -import ( - "syscall" - "unsafe" -) - -// #include -import "C" - -// Termios is the Unix API for terminal I/O. -// It is passthrough for syscall.Termios in order to make it portable with -// other platforms where it is not available or handled differently. -type Termios syscall.Termios - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - var oldState State - if err := tcget(fd, &oldState.termios); err != 0 { - return nil, err - } - - newState := oldState.termios - - C.cfmakeraw((*C.struct_termios)(unsafe.Pointer(&newState))) - if err := tcset(fd, &newState); err != 0 { - return nil, err - } - return &oldState, nil -} - -func tcget(fd uintptr, p *Termios) syscall.Errno { - ret, err := C.tcgetattr(C.int(fd), (*C.struct_termios)(unsafe.Pointer(p))) - if ret != 0 { - return err.(syscall.Errno) - } - return 0 -} - -func tcset(fd uintptr, p *Termios) syscall.Errno { - ret, err := C.tcsetattr(C.int(fd), C.TCSANOW, (*C.struct_termios)(unsafe.Pointer(p))) - if ret != 0 { - return err.(syscall.Errno) - } - return 0 -} diff --git a/vendor/github.com/docker/docker/pkg/term/tc_other.go b/vendor/github.com/docker/docker/pkg/term/tc_other.go deleted file mode 100644 index 750d7c3f6..000000000 --- a/vendor/github.com/docker/docker/pkg/term/tc_other.go +++ /dev/null @@ -1,20 +0,0 @@ -// +build !windows -// +build !linux !cgo -// +build !solaris !cgo - -package term - -import ( - "syscall" - "unsafe" -) - -func tcget(fd uintptr, p *Termios) syscall.Errno { - _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(p))) - return err -} - -func tcset(fd uintptr, p *Termios) syscall.Errno { - _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(p))) - return err -} diff --git a/vendor/github.com/docker/docker/pkg/term/tc_solaris_cgo.go b/vendor/github.com/docker/docker/pkg/term/tc_solaris_cgo.go deleted file mode 100644 index c9139d0ca..000000000 --- a/vendor/github.com/docker/docker/pkg/term/tc_solaris_cgo.go +++ /dev/null @@ -1,63 +0,0 @@ -// +build solaris,cgo - -package term - -import ( - "syscall" - "unsafe" -) - -// #include -import "C" - -// Termios is the Unix API for terminal I/O. -// It is passthrough for syscall.Termios in order to make it portable with -// other platforms where it is not available or handled differently. -type Termios syscall.Termios - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - var oldState State - if err := tcget(fd, &oldState.termios); err != 0 { - return nil, err - } - - newState := oldState.termios - - newState.Iflag &^= (syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON | syscall.IXANY) - newState.Oflag &^= syscall.OPOST - newState.Lflag &^= (syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN) - newState.Cflag &^= (syscall.CSIZE | syscall.PARENB) - newState.Cflag |= syscall.CS8 - - /* - VMIN is the minimum number of characters that needs to be read in non-canonical mode for it to be returned - Since VMIN is overloaded with another element in canonical mode when we switch modes it defaults to 4. It - needs to be explicitly set to 1. - */ - newState.Cc[C.VMIN] = 1 - newState.Cc[C.VTIME] = 0 - - if err := tcset(fd, &newState); err != 0 { - return nil, err - } - return &oldState, nil -} - -func tcget(fd uintptr, p *Termios) syscall.Errno { - ret, err := C.tcgetattr(C.int(fd), (*C.struct_termios)(unsafe.Pointer(p))) - if ret != 0 { - return err.(syscall.Errno) - } - return 0 -} - -func tcset(fd uintptr, p *Termios) syscall.Errno { - ret, err := C.tcsetattr(C.int(fd), C.TCSANOW, (*C.struct_termios)(unsafe.Pointer(p))) - if ret != 0 { - return err.(syscall.Errno) - } - return 0 -} diff --git a/vendor/github.com/docker/docker/pkg/term/term.go b/vendor/github.com/docker/docker/pkg/term/term.go deleted file mode 100644 index fe59faa94..000000000 --- a/vendor/github.com/docker/docker/pkg/term/term.go +++ /dev/null @@ -1,123 +0,0 @@ -// +build !windows - -// Package term provides structures and helper functions to work with -// terminal (state, sizes). -package term - -import ( - "errors" - "fmt" - "io" - "os" - "os/signal" - "syscall" -) - -var ( - // ErrInvalidState is returned if the state of the terminal is invalid. - ErrInvalidState = errors.New("Invalid terminal state") -) - -// State represents the state of the terminal. -type State struct { - termios Termios -} - -// Winsize represents the size of the terminal window. -type Winsize struct { - Height uint16 - Width uint16 - x uint16 - y uint16 -} - -// StdStreams returns the standard streams (stdin, stdout, stedrr). -func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { - return os.Stdin, os.Stdout, os.Stderr -} - -// GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal. -func GetFdInfo(in interface{}) (uintptr, bool) { - var inFd uintptr - var isTerminalIn bool - if file, ok := in.(*os.File); ok { - inFd = file.Fd() - isTerminalIn = IsTerminal(inFd) - } - return inFd, isTerminalIn -} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd uintptr) bool { - var termios Termios - return tcget(fd, &termios) == 0 -} - -// RestoreTerminal restores the terminal connected to the given file descriptor -// to a previous state. -func RestoreTerminal(fd uintptr, state *State) error { - if state == nil { - return ErrInvalidState - } - if err := tcset(fd, &state.termios); err != 0 { - return err - } - return nil -} - -// SaveState saves the state of the terminal connected to the given file descriptor. -func SaveState(fd uintptr) (*State, error) { - var oldState State - if err := tcget(fd, &oldState.termios); err != 0 { - return nil, err - } - - return &oldState, nil -} - -// DisableEcho applies the specified state to the terminal connected to the file -// descriptor, with echo disabled. -func DisableEcho(fd uintptr, state *State) error { - newState := state.termios - newState.Lflag &^= syscall.ECHO - - if err := tcset(fd, &newState); err != 0 { - return err - } - handleInterrupt(fd, state) - return nil -} - -// SetRawTerminal puts the terminal connected to the given file descriptor into -// raw mode and returns the previous state. On UNIX, this puts both the input -// and output into raw mode. On Windows, it only puts the input into raw mode. -func SetRawTerminal(fd uintptr) (*State, error) { - oldState, err := MakeRaw(fd) - if err != nil { - return nil, err - } - handleInterrupt(fd, oldState) - return oldState, err -} - -// SetRawTerminalOutput puts the output of terminal connected to the given file -// descriptor into raw mode. On UNIX, this does nothing and returns nil for the -// state. On Windows, it disables LF -> CRLF translation. -func SetRawTerminalOutput(fd uintptr) (*State, error) { - return nil, nil -} - -func handleInterrupt(fd uintptr, state *State) { - sigchan := make(chan os.Signal, 1) - signal.Notify(sigchan, os.Interrupt) - go func() { - for range sigchan { - // quit cleanly and the new terminal item is on a new line - fmt.Println() - signal.Stop(sigchan) - close(sigchan) - RestoreTerminal(fd, state) - os.Exit(1) - } - }() -} diff --git a/vendor/github.com/docker/docker/pkg/term/term_solaris.go b/vendor/github.com/docker/docker/pkg/term/term_solaris.go deleted file mode 100644 index 112debbec..000000000 --- a/vendor/github.com/docker/docker/pkg/term/term_solaris.go +++ /dev/null @@ -1,41 +0,0 @@ -// +build solaris - -package term - -import ( - "syscall" - "unsafe" -) - -/* -#include -#include -#include - -// Small wrapper to get rid of variadic args of ioctl() -int my_ioctl(int fd, int cmd, struct winsize *ws) { - return ioctl(fd, cmd, ws); -} -*/ -import "C" - -// GetWinsize returns the window size based on the specified file descriptor. -func GetWinsize(fd uintptr) (*Winsize, error) { - ws := &Winsize{} - ret, err := C.my_ioctl(C.int(fd), C.int(syscall.TIOCGWINSZ), (*C.struct_winsize)(unsafe.Pointer(ws))) - // Skip retval = 0 - if ret == 0 { - return ws, nil - } - return ws, err -} - -// SetWinsize tries to set the specified window size for the specified file descriptor. -func SetWinsize(fd uintptr, ws *Winsize) error { - ret, err := C.my_ioctl(C.int(fd), C.int(syscall.TIOCSWINSZ), (*C.struct_winsize)(unsafe.Pointer(ws))) - // Skip retval = 0 - if ret == 0 { - return nil - } - return err -} diff --git a/vendor/github.com/docker/docker/pkg/term/term_unix.go b/vendor/github.com/docker/docker/pkg/term/term_unix.go deleted file mode 100644 index ddf87a0e5..000000000 --- a/vendor/github.com/docker/docker/pkg/term/term_unix.go +++ /dev/null @@ -1,29 +0,0 @@ -// +build !solaris,!windows - -package term - -import ( - "syscall" - "unsafe" -) - -// GetWinsize returns the window size based on the specified file descriptor. -func GetWinsize(fd uintptr) (*Winsize, error) { - ws := &Winsize{} - _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(ws))) - // Skipp errno = 0 - if err == 0 { - return ws, nil - } - return ws, err -} - -// SetWinsize tries to set the specified window size for the specified file descriptor. -func SetWinsize(fd uintptr, ws *Winsize) error { - _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCSWINSZ), uintptr(unsafe.Pointer(ws))) - // Skipp errno = 0 - if err == 0 { - return nil - } - return err -} diff --git a/vendor/github.com/docker/docker/pkg/term/term_windows.go b/vendor/github.com/docker/docker/pkg/term/term_windows.go deleted file mode 100644 index a91f07e48..000000000 --- a/vendor/github.com/docker/docker/pkg/term/term_windows.go +++ /dev/null @@ -1,233 +0,0 @@ -// +build windows - -package term - -import ( - "io" - "os" - "os/signal" - "syscall" - - "github.com/Azure/go-ansiterm/winterm" - "github.com/docker/docker/pkg/term/windows" -) - -// State holds the console mode for the terminal. -type State struct { - mode uint32 -} - -// Winsize is used for window size. -type Winsize struct { - Height uint16 - Width uint16 -} - -const ( - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx - enableVirtualTerminalInput = 0x0200 - enableVirtualTerminalProcessing = 0x0004 - disableNewlineAutoReturn = 0x0008 -) - -// vtInputSupported is true if enableVirtualTerminalInput is supported by the console -var vtInputSupported bool - -// StdStreams returns the standard streams (stdin, stdout, stedrr). -func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { - // Turn on VT handling on all std handles, if possible. This might - // fail, in which case we will fall back to terminal emulation. - var emulateStdin, emulateStdout, emulateStderr bool - fd := os.Stdin.Fd() - if mode, err := winterm.GetConsoleMode(fd); err == nil { - // Validate that enableVirtualTerminalInput is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalInput); err != nil { - emulateStdin = true - } else { - vtInputSupported = true - } - // Unconditionally set the console mode back even on failure because SetConsoleMode - // remembers invalid bits on input handles. - winterm.SetConsoleMode(fd, mode) - } - - fd = os.Stdout.Fd() - if mode, err := winterm.GetConsoleMode(fd); err == nil { - // Validate disableNewlineAutoReturn is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing|disableNewlineAutoReturn); err != nil { - emulateStdout = true - } else { - winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing) - } - } - - fd = os.Stderr.Fd() - if mode, err := winterm.GetConsoleMode(fd); err == nil { - // Validate disableNewlineAutoReturn is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing|disableNewlineAutoReturn); err != nil { - emulateStderr = true - } else { - winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing) - } - } - - if os.Getenv("ConEmuANSI") == "ON" || os.Getenv("ConsoleZVersion") != "" { - // The ConEmu and ConsoleZ terminals emulate ANSI on output streams well. - emulateStdin = true - emulateStdout = false - emulateStderr = false - } - - if emulateStdin { - stdIn = windows.NewAnsiReader(syscall.STD_INPUT_HANDLE) - } else { - stdIn = os.Stdin - } - - if emulateStdout { - stdOut = windows.NewAnsiWriter(syscall.STD_OUTPUT_HANDLE) - } else { - stdOut = os.Stdout - } - - if emulateStderr { - stdErr = windows.NewAnsiWriter(syscall.STD_ERROR_HANDLE) - } else { - stdErr = os.Stderr - } - - return -} - -// GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal. -func GetFdInfo(in interface{}) (uintptr, bool) { - return windows.GetHandleInfo(in) -} - -// GetWinsize returns the window size based on the specified file descriptor. -func GetWinsize(fd uintptr) (*Winsize, error) { - info, err := winterm.GetConsoleScreenBufferInfo(fd) - if err != nil { - return nil, err - } - - winsize := &Winsize{ - Width: uint16(info.Window.Right - info.Window.Left + 1), - Height: uint16(info.Window.Bottom - info.Window.Top + 1), - } - - return winsize, nil -} - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd uintptr) bool { - return windows.IsConsole(fd) -} - -// RestoreTerminal restores the terminal connected to the given file descriptor -// to a previous state. -func RestoreTerminal(fd uintptr, state *State) error { - return winterm.SetConsoleMode(fd, state.mode) -} - -// SaveState saves the state of the terminal connected to the given file descriptor. -func SaveState(fd uintptr) (*State, error) { - mode, e := winterm.GetConsoleMode(fd) - if e != nil { - return nil, e - } - - return &State{mode: mode}, nil -} - -// DisableEcho disables echo for the terminal connected to the given file descriptor. -// -- See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx -func DisableEcho(fd uintptr, state *State) error { - mode := state.mode - mode &^= winterm.ENABLE_ECHO_INPUT - mode |= winterm.ENABLE_PROCESSED_INPUT | winterm.ENABLE_LINE_INPUT - err := winterm.SetConsoleMode(fd, mode) - if err != nil { - return err - } - - // Register an interrupt handler to catch and restore prior state - restoreAtInterrupt(fd, state) - return nil -} - -// SetRawTerminal puts the terminal connected to the given file descriptor into -// raw mode and returns the previous state. On UNIX, this puts both the input -// and output into raw mode. On Windows, it only puts the input into raw mode. -func SetRawTerminal(fd uintptr) (*State, error) { - state, err := MakeRaw(fd) - if err != nil { - return nil, err - } - - // Register an interrupt handler to catch and restore prior state - restoreAtInterrupt(fd, state) - return state, err -} - -// SetRawTerminalOutput puts the output of terminal connected to the given file -// descriptor into raw mode. On UNIX, this does nothing and returns nil for the -// state. On Windows, it disables LF -> CRLF translation. -func SetRawTerminalOutput(fd uintptr) (*State, error) { - state, err := SaveState(fd) - if err != nil { - return nil, err - } - - // Ignore failures, since disableNewlineAutoReturn might not be supported on this - // version of Windows. - winterm.SetConsoleMode(fd, state.mode|disableNewlineAutoReturn) - return state, err -} - -// MakeRaw puts the terminal (Windows Console) connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be restored. -func MakeRaw(fd uintptr) (*State, error) { - state, err := SaveState(fd) - if err != nil { - return nil, err - } - - mode := state.mode - - // See - // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx - // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx - - // Disable these modes - mode &^= winterm.ENABLE_ECHO_INPUT - mode &^= winterm.ENABLE_LINE_INPUT - mode &^= winterm.ENABLE_MOUSE_INPUT - mode &^= winterm.ENABLE_WINDOW_INPUT - mode &^= winterm.ENABLE_PROCESSED_INPUT - - // Enable these modes - mode |= winterm.ENABLE_EXTENDED_FLAGS - mode |= winterm.ENABLE_INSERT_MODE - mode |= winterm.ENABLE_QUICK_EDIT_MODE - if vtInputSupported { - mode |= enableVirtualTerminalInput - } - - err = winterm.SetConsoleMode(fd, mode) - if err != nil { - return nil, err - } - return state, nil -} - -func restoreAtInterrupt(fd uintptr, state *State) { - sigchan := make(chan os.Signal, 1) - signal.Notify(sigchan, os.Interrupt) - - go func() { - _ = <-sigchan - RestoreTerminal(fd, state) - os.Exit(0) - }() -} diff --git a/vendor/github.com/docker/docker/pkg/term/termios_darwin.go b/vendor/github.com/docker/docker/pkg/term/termios_darwin.go deleted file mode 100644 index 480db900a..000000000 --- a/vendor/github.com/docker/docker/pkg/term/termios_darwin.go +++ /dev/null @@ -1,69 +0,0 @@ -package term - -import ( - "syscall" - "unsafe" -) - -const ( - getTermios = syscall.TIOCGETA - setTermios = syscall.TIOCSETA -) - -// Termios magic numbers, passthrough to the ones defined in syscall. -const ( - IGNBRK = syscall.IGNBRK - PARMRK = syscall.PARMRK - INLCR = syscall.INLCR - IGNCR = syscall.IGNCR - ECHONL = syscall.ECHONL - CSIZE = syscall.CSIZE - ICRNL = syscall.ICRNL - ISTRIP = syscall.ISTRIP - PARENB = syscall.PARENB - ECHO = syscall.ECHO - ICANON = syscall.ICANON - ISIG = syscall.ISIG - IXON = syscall.IXON - BRKINT = syscall.BRKINT - INPCK = syscall.INPCK - OPOST = syscall.OPOST - CS8 = syscall.CS8 - IEXTEN = syscall.IEXTEN -) - -// Termios is the Unix API for terminal I/O. -type Termios struct { - Iflag uint64 - Oflag uint64 - Cflag uint64 - Lflag uint64 - Cc [20]byte - Ispeed uint64 - Ospeed uint64 -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - var oldState State - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { - return nil, err - } - - newState := oldState.termios - newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON) - newState.Oflag &^= OPOST - newState.Lflag &^= (ECHO | ECHONL | ICANON | ISIG | IEXTEN) - newState.Cflag &^= (CSIZE | PARENB) - newState.Cflag |= CS8 - newState.Cc[syscall.VMIN] = 1 - newState.Cc[syscall.VTIME] = 0 - - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(setTermios), uintptr(unsafe.Pointer(&newState))); err != 0 { - return nil, err - } - - return &oldState, nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/termios_freebsd.go b/vendor/github.com/docker/docker/pkg/term/termios_freebsd.go deleted file mode 100644 index ed843ad69..000000000 --- a/vendor/github.com/docker/docker/pkg/term/termios_freebsd.go +++ /dev/null @@ -1,69 +0,0 @@ -package term - -import ( - "syscall" - "unsafe" -) - -const ( - getTermios = syscall.TIOCGETA - setTermios = syscall.TIOCSETA -) - -// Termios magic numbers, passthrough to the ones defined in syscall. -const ( - IGNBRK = syscall.IGNBRK - PARMRK = syscall.PARMRK - INLCR = syscall.INLCR - IGNCR = syscall.IGNCR - ECHONL = syscall.ECHONL - CSIZE = syscall.CSIZE - ICRNL = syscall.ICRNL - ISTRIP = syscall.ISTRIP - PARENB = syscall.PARENB - ECHO = syscall.ECHO - ICANON = syscall.ICANON - ISIG = syscall.ISIG - IXON = syscall.IXON - BRKINT = syscall.BRKINT - INPCK = syscall.INPCK - OPOST = syscall.OPOST - CS8 = syscall.CS8 - IEXTEN = syscall.IEXTEN -) - -// Termios is the Unix API for terminal I/O. -type Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]byte - Ispeed uint32 - Ospeed uint32 -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - var oldState State - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { - return nil, err - } - - newState := oldState.termios - newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON) - newState.Oflag &^= OPOST - newState.Lflag &^= (ECHO | ECHONL | ICANON | ISIG | IEXTEN) - newState.Cflag &^= (CSIZE | PARENB) - newState.Cflag |= CS8 - newState.Cc[syscall.VMIN] = 1 - newState.Cc[syscall.VTIME] = 0 - - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(setTermios), uintptr(unsafe.Pointer(&newState))); err != 0 { - return nil, err - } - - return &oldState, nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/termios_linux.go b/vendor/github.com/docker/docker/pkg/term/termios_linux.go deleted file mode 100644 index 22921b6ae..000000000 --- a/vendor/github.com/docker/docker/pkg/term/termios_linux.go +++ /dev/null @@ -1,47 +0,0 @@ -// +build !cgo - -package term - -import ( - "syscall" - "unsafe" -) - -const ( - getTermios = syscall.TCGETS - setTermios = syscall.TCSETS -) - -// Termios is the Unix API for terminal I/O. -type Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]byte - Ispeed uint32 - Ospeed uint32 -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - var oldState State - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, getTermios, uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { - return nil, err - } - - newState := oldState.termios - - newState.Iflag &^= (syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON) - newState.Oflag &^= syscall.OPOST - newState.Lflag &^= (syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN) - newState.Cflag &^= (syscall.CSIZE | syscall.PARENB) - newState.Cflag |= syscall.CS8 - - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(&newState))); err != 0 { - return nil, err - } - return &oldState, nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/termios_openbsd.go b/vendor/github.com/docker/docker/pkg/term/termios_openbsd.go deleted file mode 100644 index ed843ad69..000000000 --- a/vendor/github.com/docker/docker/pkg/term/termios_openbsd.go +++ /dev/null @@ -1,69 +0,0 @@ -package term - -import ( - "syscall" - "unsafe" -) - -const ( - getTermios = syscall.TIOCGETA - setTermios = syscall.TIOCSETA -) - -// Termios magic numbers, passthrough to the ones defined in syscall. -const ( - IGNBRK = syscall.IGNBRK - PARMRK = syscall.PARMRK - INLCR = syscall.INLCR - IGNCR = syscall.IGNCR - ECHONL = syscall.ECHONL - CSIZE = syscall.CSIZE - ICRNL = syscall.ICRNL - ISTRIP = syscall.ISTRIP - PARENB = syscall.PARENB - ECHO = syscall.ECHO - ICANON = syscall.ICANON - ISIG = syscall.ISIG - IXON = syscall.IXON - BRKINT = syscall.BRKINT - INPCK = syscall.INPCK - OPOST = syscall.OPOST - CS8 = syscall.CS8 - IEXTEN = syscall.IEXTEN -) - -// Termios is the Unix API for terminal I/O. -type Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]byte - Ispeed uint32 - Ospeed uint32 -} - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - var oldState State - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { - return nil, err - } - - newState := oldState.termios - newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON) - newState.Oflag &^= OPOST - newState.Lflag &^= (ECHO | ECHONL | ICANON | ISIG | IEXTEN) - newState.Cflag &^= (CSIZE | PARENB) - newState.Cflag |= CS8 - newState.Cc[syscall.VMIN] = 1 - newState.Cc[syscall.VTIME] = 0 - - if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(setTermios), uintptr(unsafe.Pointer(&newState))); err != 0 { - return nil, err - } - - return &oldState, nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go b/vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go deleted file mode 100644 index cb0b88356..000000000 --- a/vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go +++ /dev/null @@ -1,263 +0,0 @@ -// +build windows - -package windows - -import ( - "bytes" - "errors" - "fmt" - "io" - "os" - "strings" - "unsafe" - - ansiterm "github.com/Azure/go-ansiterm" - "github.com/Azure/go-ansiterm/winterm" -) - -const ( - escapeSequence = ansiterm.KEY_ESC_CSI -) - -// ansiReader wraps a standard input file (e.g., os.Stdin) providing ANSI sequence translation. -type ansiReader struct { - file *os.File - fd uintptr - buffer []byte - cbBuffer int - command []byte -} - -// NewAnsiReader returns an io.ReadCloser that provides VT100 terminal emulation on top of a -// Windows console input handle. -func NewAnsiReader(nFile int) io.ReadCloser { - initLogger() - file, fd := winterm.GetStdFile(nFile) - return &ansiReader{ - file: file, - fd: fd, - command: make([]byte, 0, ansiterm.ANSI_MAX_CMD_LENGTH), - buffer: make([]byte, 0), - } -} - -// Close closes the wrapped file. -func (ar *ansiReader) Close() (err error) { - return ar.file.Close() -} - -// Fd returns the file descriptor of the wrapped file. -func (ar *ansiReader) Fd() uintptr { - return ar.fd -} - -// Read reads up to len(p) bytes of translated input events into p. -func (ar *ansiReader) Read(p []byte) (int, error) { - if len(p) == 0 { - return 0, nil - } - - // Previously read bytes exist, read as much as we can and return - if len(ar.buffer) > 0 { - logger.Debugf("Reading previously cached bytes") - - originalLength := len(ar.buffer) - copiedLength := copy(p, ar.buffer) - - if copiedLength == originalLength { - ar.buffer = make([]byte, 0, len(p)) - } else { - ar.buffer = ar.buffer[copiedLength:] - } - - logger.Debugf("Read from cache p[%d]: % x", copiedLength, p) - return copiedLength, nil - } - - // Read and translate key events - events, err := readInputEvents(ar.fd, len(p)) - if err != nil { - return 0, err - } else if len(events) == 0 { - logger.Debug("No input events detected") - return 0, nil - } - - keyBytes := translateKeyEvents(events, []byte(escapeSequence)) - - // Save excess bytes and right-size keyBytes - if len(keyBytes) > len(p) { - logger.Debugf("Received %d keyBytes, only room for %d bytes", len(keyBytes), len(p)) - ar.buffer = keyBytes[len(p):] - keyBytes = keyBytes[:len(p)] - } else if len(keyBytes) == 0 { - logger.Debug("No key bytes returned from the translator") - return 0, nil - } - - copiedLength := copy(p, keyBytes) - if copiedLength != len(keyBytes) { - return 0, errors.New("unexpected copy length encountered") - } - - logger.Debugf("Read p[%d]: % x", copiedLength, p) - logger.Debugf("Read keyBytes[%d]: % x", copiedLength, keyBytes) - return copiedLength, nil -} - -// readInputEvents polls until at least one event is available. -func readInputEvents(fd uintptr, maxBytes int) ([]winterm.INPUT_RECORD, error) { - // Determine the maximum number of records to retrieve - // -- Cast around the type system to obtain the size of a single INPUT_RECORD. - // unsafe.Sizeof requires an expression vs. a type-reference; the casting - // tricks the type system into believing it has such an expression. - recordSize := int(unsafe.Sizeof(*((*winterm.INPUT_RECORD)(unsafe.Pointer(&maxBytes))))) - countRecords := maxBytes / recordSize - if countRecords > ansiterm.MAX_INPUT_EVENTS { - countRecords = ansiterm.MAX_INPUT_EVENTS - } else if countRecords == 0 { - countRecords = 1 - } - logger.Debugf("[windows] readInputEvents: Reading %v records (buffer size %v, record size %v)", countRecords, maxBytes, recordSize) - - // Wait for and read input events - events := make([]winterm.INPUT_RECORD, countRecords) - nEvents := uint32(0) - eventsExist, err := winterm.WaitForSingleObject(fd, winterm.WAIT_INFINITE) - if err != nil { - return nil, err - } - - if eventsExist { - err = winterm.ReadConsoleInput(fd, events, &nEvents) - if err != nil { - return nil, err - } - } - - // Return a slice restricted to the number of returned records - logger.Debugf("[windows] readInputEvents: Read %v events", nEvents) - return events[:nEvents], nil -} - -// KeyEvent Translation Helpers - -var arrowKeyMapPrefix = map[uint16]string{ - winterm.VK_UP: "%s%sA", - winterm.VK_DOWN: "%s%sB", - winterm.VK_RIGHT: "%s%sC", - winterm.VK_LEFT: "%s%sD", -} - -var keyMapPrefix = map[uint16]string{ - winterm.VK_UP: "\x1B[%sA", - winterm.VK_DOWN: "\x1B[%sB", - winterm.VK_RIGHT: "\x1B[%sC", - winterm.VK_LEFT: "\x1B[%sD", - winterm.VK_HOME: "\x1B[1%s~", // showkey shows ^[[1 - winterm.VK_END: "\x1B[4%s~", // showkey shows ^[[4 - winterm.VK_INSERT: "\x1B[2%s~", - winterm.VK_DELETE: "\x1B[3%s~", - winterm.VK_PRIOR: "\x1B[5%s~", - winterm.VK_NEXT: "\x1B[6%s~", - winterm.VK_F1: "", - winterm.VK_F2: "", - winterm.VK_F3: "\x1B[13%s~", - winterm.VK_F4: "\x1B[14%s~", - winterm.VK_F5: "\x1B[15%s~", - winterm.VK_F6: "\x1B[17%s~", - winterm.VK_F7: "\x1B[18%s~", - winterm.VK_F8: "\x1B[19%s~", - winterm.VK_F9: "\x1B[20%s~", - winterm.VK_F10: "\x1B[21%s~", - winterm.VK_F11: "\x1B[23%s~", - winterm.VK_F12: "\x1B[24%s~", -} - -// translateKeyEvents converts the input events into the appropriate ANSI string. -func translateKeyEvents(events []winterm.INPUT_RECORD, escapeSequence []byte) []byte { - var buffer bytes.Buffer - for _, event := range events { - if event.EventType == winterm.KEY_EVENT && event.KeyEvent.KeyDown != 0 { - buffer.WriteString(keyToString(&event.KeyEvent, escapeSequence)) - } - } - - return buffer.Bytes() -} - -// keyToString maps the given input event record to the corresponding string. -func keyToString(keyEvent *winterm.KEY_EVENT_RECORD, escapeSequence []byte) string { - if keyEvent.UnicodeChar == 0 { - return formatVirtualKey(keyEvent.VirtualKeyCode, keyEvent.ControlKeyState, escapeSequence) - } - - _, alt, control := getControlKeys(keyEvent.ControlKeyState) - if control { - // TODO(azlinux): Implement following control sequences - // -D Signals the end of input from the keyboard; also exits current shell. - // -H Deletes the first character to the left of the cursor. Also called the ERASE key. - // -Q Restarts printing after it has been stopped with -s. - // -S Suspends printing on the screen (does not stop the program). - // -U Deletes all characters on the current line. Also called the KILL key. - // -E Quits current command and creates a core - - } - - // +Key generates ESC N Key - if !control && alt { - return ansiterm.KEY_ESC_N + strings.ToLower(string(keyEvent.UnicodeChar)) - } - - return string(keyEvent.UnicodeChar) -} - -// formatVirtualKey converts a virtual key (e.g., up arrow) into the appropriate ANSI string. -func formatVirtualKey(key uint16, controlState uint32, escapeSequence []byte) string { - shift, alt, control := getControlKeys(controlState) - modifier := getControlKeysModifier(shift, alt, control) - - if format, ok := arrowKeyMapPrefix[key]; ok { - return fmt.Sprintf(format, escapeSequence, modifier) - } - - if format, ok := keyMapPrefix[key]; ok { - return fmt.Sprintf(format, modifier) - } - - return "" -} - -// getControlKeys extracts the shift, alt, and ctrl key states. -func getControlKeys(controlState uint32) (shift, alt, control bool) { - shift = 0 != (controlState & winterm.SHIFT_PRESSED) - alt = 0 != (controlState & (winterm.LEFT_ALT_PRESSED | winterm.RIGHT_ALT_PRESSED)) - control = 0 != (controlState & (winterm.LEFT_CTRL_PRESSED | winterm.RIGHT_CTRL_PRESSED)) - return shift, alt, control -} - -// getControlKeysModifier returns the ANSI modifier for the given combination of control keys. -func getControlKeysModifier(shift, alt, control bool) string { - if shift && alt && control { - return ansiterm.KEY_CONTROL_PARAM_8 - } - if alt && control { - return ansiterm.KEY_CONTROL_PARAM_7 - } - if shift && control { - return ansiterm.KEY_CONTROL_PARAM_6 - } - if control { - return ansiterm.KEY_CONTROL_PARAM_5 - } - if shift && alt { - return ansiterm.KEY_CONTROL_PARAM_4 - } - if alt { - return ansiterm.KEY_CONTROL_PARAM_3 - } - if shift { - return ansiterm.KEY_CONTROL_PARAM_2 - } - return "" -} diff --git a/vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go b/vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go deleted file mode 100644 index a3ce5697d..000000000 --- a/vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go +++ /dev/null @@ -1,64 +0,0 @@ -// +build windows - -package windows - -import ( - "io" - "os" - - ansiterm "github.com/Azure/go-ansiterm" - "github.com/Azure/go-ansiterm/winterm" -) - -// ansiWriter wraps a standard output file (e.g., os.Stdout) providing ANSI sequence translation. -type ansiWriter struct { - file *os.File - fd uintptr - infoReset *winterm.CONSOLE_SCREEN_BUFFER_INFO - command []byte - escapeSequence []byte - inAnsiSequence bool - parser *ansiterm.AnsiParser -} - -// NewAnsiWriter returns an io.Writer that provides VT100 terminal emulation on top of a -// Windows console output handle. -func NewAnsiWriter(nFile int) io.Writer { - initLogger() - file, fd := winterm.GetStdFile(nFile) - info, err := winterm.GetConsoleScreenBufferInfo(fd) - if err != nil { - return nil - } - - parser := ansiterm.CreateParser("Ground", winterm.CreateWinEventHandler(fd, file)) - logger.Infof("newAnsiWriter: parser %p", parser) - - aw := &ansiWriter{ - file: file, - fd: fd, - infoReset: info, - command: make([]byte, 0, ansiterm.ANSI_MAX_CMD_LENGTH), - escapeSequence: []byte(ansiterm.KEY_ESC_CSI), - parser: parser, - } - - logger.Infof("newAnsiWriter: aw.parser %p", aw.parser) - logger.Infof("newAnsiWriter: %v", aw) - return aw -} - -func (aw *ansiWriter) Fd() uintptr { - return aw.fd -} - -// Write writes len(p) bytes from p to the underlying data stream. -func (aw *ansiWriter) Write(p []byte) (total int, err error) { - if len(p) == 0 { - return 0, nil - } - - logger.Infof("Write: % x", p) - logger.Infof("Write: %s", string(p)) - return aw.parser.Parse(p) -} diff --git a/vendor/github.com/docker/docker/pkg/term/windows/console.go b/vendor/github.com/docker/docker/pkg/term/windows/console.go deleted file mode 100644 index ca5c3b2e5..000000000 --- a/vendor/github.com/docker/docker/pkg/term/windows/console.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build windows - -package windows - -import ( - "os" - - "github.com/Azure/go-ansiterm/winterm" -) - -// GetHandleInfo returns file descriptor and bool indicating whether the file is a console. -func GetHandleInfo(in interface{}) (uintptr, bool) { - switch t := in.(type) { - case *ansiReader: - return t.Fd(), true - case *ansiWriter: - return t.Fd(), true - } - - var inFd uintptr - var isTerminal bool - - if file, ok := in.(*os.File); ok { - inFd = file.Fd() - isTerminal = IsConsole(inFd) - } - return inFd, isTerminal -} - -// IsConsole returns true if the given file descriptor is a Windows Console. -// The code assumes that GetConsoleMode will return an error for file descriptors that are not a console. -func IsConsole(fd uintptr) bool { - _, e := winterm.GetConsoleMode(fd) - return e == nil -} diff --git a/vendor/github.com/docker/docker/pkg/term/windows/windows.go b/vendor/github.com/docker/docker/pkg/term/windows/windows.go deleted file mode 100644 index ce4cb5990..000000000 --- a/vendor/github.com/docker/docker/pkg/term/windows/windows.go +++ /dev/null @@ -1,33 +0,0 @@ -// These files implement ANSI-aware input and output streams for use by the Docker Windows client. -// When asked for the set of standard streams (e.g., stdin, stdout, stderr), the code will create -// and return pseudo-streams that convert ANSI sequences to / from Windows Console API calls. - -package windows - -import ( - "io/ioutil" - "os" - "sync" - - ansiterm "github.com/Azure/go-ansiterm" - "github.com/Sirupsen/logrus" -) - -var logger *logrus.Logger -var initOnce sync.Once - -func initLogger() { - initOnce.Do(func() { - logFile := ioutil.Discard - - if isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == "1" { - logFile, _ = os.Create("ansiReaderWriter.log") - } - - logger = &logrus.Logger{ - Out: logFile, - Formatter: new(logrus.TextFormatter), - Level: logrus.DebugLevel, - } - }) -} diff --git a/vendor/github.com/docker/docker/pkg/term/windows/windows_test.go b/vendor/github.com/docker/docker/pkg/term/windows/windows_test.go deleted file mode 100644 index 52aeab54e..000000000 --- a/vendor/github.com/docker/docker/pkg/term/windows/windows_test.go +++ /dev/null @@ -1,3 +0,0 @@ -// This file is necessary to pass the Docker tests. - -package windows diff --git a/vendor/github.com/docker/docker/pkg/testutil/assert/assert.go b/vendor/github.com/docker/docker/pkg/testutil/assert/assert.go deleted file mode 100644 index 6da8518a5..000000000 --- a/vendor/github.com/docker/docker/pkg/testutil/assert/assert.go +++ /dev/null @@ -1,97 +0,0 @@ -// Package assert contains functions for making assertions in unit tests -package assert - -import ( - "fmt" - "path/filepath" - "reflect" - "runtime" - "strings" - - "github.com/davecgh/go-spew/spew" -) - -// TestingT is an interface which defines the methods of testing.T that are -// required by this package -type TestingT interface { - Fatalf(string, ...interface{}) -} - -// Equal compare the actual value to the expected value and fails the test if -// they are not equal. -func Equal(t TestingT, actual, expected interface{}) { - if expected != actual { - fatal(t, "Expected '%v' (%T) got '%v' (%T)", expected, expected, actual, actual) - } -} - -//EqualStringSlice compares two slices and fails the test if they do not contain -// the same items. -func EqualStringSlice(t TestingT, actual, expected []string) { - if len(actual) != len(expected) { - fatal(t, "Expected (length %d): %q\nActual (length %d): %q", - len(expected), expected, len(actual), actual) - } - for i, item := range actual { - if item != expected[i] { - fatal(t, "Slices differ at element %d, expected %q got %q", - i, expected[i], item) - } - } -} - -// NilError asserts that the error is nil, otherwise it fails the test. -func NilError(t TestingT, err error) { - if err != nil { - fatal(t, "Expected no error, got: %s", err.Error()) - } -} - -// DeepEqual compare the actual value to the expected value and fails the test if -// they are not "deeply equal". -func DeepEqual(t TestingT, actual, expected interface{}) { - if !reflect.DeepEqual(actual, expected) { - fatal(t, "Expected (%T):\n%v\n\ngot (%T):\n%s\n", - expected, spew.Sdump(expected), actual, spew.Sdump(actual)) - } -} - -// Error asserts that error is not nil, and contains the expected text, -// otherwise it fails the test. -func Error(t TestingT, err error, contains string) { - if err == nil { - fatal(t, "Expected an error, but error was nil") - } - - if !strings.Contains(err.Error(), contains) { - fatal(t, "Expected error to contain '%s', got '%s'", contains, err.Error()) - } -} - -// Contains asserts that the string contains a substring, otherwise it fails the -// test. -func Contains(t TestingT, actual, contains string) { - if !strings.Contains(actual, contains) { - fatal(t, "Expected '%s' to contain '%s'", actual, contains) - } -} - -// NotNil fails the test if the object is nil -func NotNil(t TestingT, obj interface{}) { - if obj == nil { - fatal(t, "Expected non-nil value.") - } -} - -func fatal(t TestingT, format string, args ...interface{}) { - t.Fatalf(errorSource()+format, args...) -} - -// See testing.decorate() -func errorSource() string { - _, filename, line, ok := runtime.Caller(3) - if !ok { - return "" - } - return fmt.Sprintf("%s:%d: ", filepath.Base(filename), line) -} diff --git a/vendor/github.com/docker/docker/pkg/testutil/pkg.go b/vendor/github.com/docker/docker/pkg/testutil/pkg.go deleted file mode 100644 index 110b2e6a7..000000000 --- a/vendor/github.com/docker/docker/pkg/testutil/pkg.go +++ /dev/null @@ -1 +0,0 @@ -package testutil diff --git a/vendor/github.com/docker/docker/pkg/testutil/tempfile/tempfile.go b/vendor/github.com/docker/docker/pkg/testutil/tempfile/tempfile.go deleted file mode 100644 index 0e09d99da..000000000 --- a/vendor/github.com/docker/docker/pkg/testutil/tempfile/tempfile.go +++ /dev/null @@ -1,36 +0,0 @@ -package tempfile - -import ( - "io/ioutil" - "os" - - "github.com/docker/docker/pkg/testutil/assert" -) - -// TempFile is a temporary file that can be used with unit tests. TempFile -// reduces the boilerplate setup required in each test case by handling -// setup errors. -type TempFile struct { - File *os.File -} - -// NewTempFile returns a new temp file with contents -func NewTempFile(t assert.TestingT, prefix string, content string) *TempFile { - file, err := ioutil.TempFile("", prefix+"-") - assert.NilError(t, err) - - _, err = file.Write([]byte(content)) - assert.NilError(t, err) - file.Close() - return &TempFile{File: file} -} - -// Name returns the filename -func (f *TempFile) Name() string { - return f.File.Name() -} - -// Remove removes the file -func (f *TempFile) Remove() { - os.Remove(f.Name()) -} diff --git a/vendor/github.com/docker/docker/pkg/truncindex/truncindex.go b/vendor/github.com/docker/docker/pkg/truncindex/truncindex.go deleted file mode 100644 index 02610b8b7..000000000 --- a/vendor/github.com/docker/docker/pkg/truncindex/truncindex.go +++ /dev/null @@ -1,137 +0,0 @@ -// Package truncindex provides a general 'index tree', used by Docker -// in order to be able to reference containers by only a few unambiguous -// characters of their id. -package truncindex - -import ( - "errors" - "fmt" - "strings" - "sync" - - "github.com/tchap/go-patricia/patricia" -) - -var ( - // ErrEmptyPrefix is an error returned if the prefix was empty. - ErrEmptyPrefix = errors.New("Prefix can't be empty") - - // ErrIllegalChar is returned when a space is in the ID - ErrIllegalChar = errors.New("illegal character: ' '") - - // ErrNotExist is returned when ID or its prefix not found in index. - ErrNotExist = errors.New("ID does not exist") -) - -// ErrAmbiguousPrefix is returned if the prefix was ambiguous -// (multiple ids for the prefix). -type ErrAmbiguousPrefix struct { - prefix string -} - -func (e ErrAmbiguousPrefix) Error() string { - return fmt.Sprintf("Multiple IDs found with provided prefix: %s", e.prefix) -} - -// TruncIndex allows the retrieval of string identifiers by any of their unique prefixes. -// This is used to retrieve image and container IDs by more convenient shorthand prefixes. -type TruncIndex struct { - sync.RWMutex - trie *patricia.Trie - ids map[string]struct{} -} - -// NewTruncIndex creates a new TruncIndex and initializes with a list of IDs. -func NewTruncIndex(ids []string) (idx *TruncIndex) { - idx = &TruncIndex{ - ids: make(map[string]struct{}), - - // Change patricia max prefix per node length, - // because our len(ID) always 64 - trie: patricia.NewTrie(patricia.MaxPrefixPerNode(64)), - } - for _, id := range ids { - idx.addID(id) - } - return -} - -func (idx *TruncIndex) addID(id string) error { - if strings.Contains(id, " ") { - return ErrIllegalChar - } - if id == "" { - return ErrEmptyPrefix - } - if _, exists := idx.ids[id]; exists { - return fmt.Errorf("id already exists: '%s'", id) - } - idx.ids[id] = struct{}{} - if inserted := idx.trie.Insert(patricia.Prefix(id), struct{}{}); !inserted { - return fmt.Errorf("failed to insert id: %s", id) - } - return nil -} - -// Add adds a new ID to the TruncIndex. -func (idx *TruncIndex) Add(id string) error { - idx.Lock() - defer idx.Unlock() - if err := idx.addID(id); err != nil { - return err - } - return nil -} - -// Delete removes an ID from the TruncIndex. If there are multiple IDs -// with the given prefix, an error is thrown. -func (idx *TruncIndex) Delete(id string) error { - idx.Lock() - defer idx.Unlock() - if _, exists := idx.ids[id]; !exists || id == "" { - return fmt.Errorf("no such id: '%s'", id) - } - delete(idx.ids, id) - if deleted := idx.trie.Delete(patricia.Prefix(id)); !deleted { - return fmt.Errorf("no such id: '%s'", id) - } - return nil -} - -// Get retrieves an ID from the TruncIndex. If there are multiple IDs -// with the given prefix, an error is thrown. -func (idx *TruncIndex) Get(s string) (string, error) { - if s == "" { - return "", ErrEmptyPrefix - } - var ( - id string - ) - subTreeVisitFunc := func(prefix patricia.Prefix, item patricia.Item) error { - if id != "" { - // we haven't found the ID if there are two or more IDs - id = "" - return ErrAmbiguousPrefix{prefix: string(prefix)} - } - id = string(prefix) - return nil - } - - idx.RLock() - defer idx.RUnlock() - if err := idx.trie.VisitSubtree(patricia.Prefix(s), subTreeVisitFunc); err != nil { - return "", err - } - if id != "" { - return id, nil - } - return "", ErrNotExist -} - -// Iterate iterates over all stored IDs, and passes each of them to the given handler. -func (idx *TruncIndex) Iterate(handler func(id string)) { - idx.trie.Visit(func(prefix patricia.Prefix, item patricia.Item) error { - handler(string(prefix)) - return nil - }) -} diff --git a/vendor/github.com/docker/docker/pkg/truncindex/truncindex_test.go b/vendor/github.com/docker/docker/pkg/truncindex/truncindex_test.go deleted file mode 100644 index 8197baf7d..000000000 --- a/vendor/github.com/docker/docker/pkg/truncindex/truncindex_test.go +++ /dev/null @@ -1,429 +0,0 @@ -package truncindex - -import ( - "math/rand" - "testing" - - "github.com/docker/docker/pkg/stringid" -) - -// Test the behavior of TruncIndex, an index for querying IDs from a non-conflicting prefix. -func TestTruncIndex(t *testing.T) { - ids := []string{} - index := NewTruncIndex(ids) - // Get on an empty index - if _, err := index.Get("foobar"); err == nil { - t.Fatal("Get on an empty index should return an error") - } - - // Spaces should be illegal in an id - if err := index.Add("I have a space"); err == nil { - t.Fatalf("Adding an id with ' ' should return an error") - } - - id := "99b36c2c326ccc11e726eee6ee78a0baf166ef96" - // Add an id - if err := index.Add(id); err != nil { - t.Fatal(err) - } - - // Add an empty id (should fail) - if err := index.Add(""); err == nil { - t.Fatalf("Adding an empty id should return an error") - } - - // Get a non-existing id - assertIndexGet(t, index, "abracadabra", "", true) - // Get an empty id - assertIndexGet(t, index, "", "", true) - // Get the exact id - assertIndexGet(t, index, id, id, false) - // The first letter should match - assertIndexGet(t, index, id[:1], id, false) - // The first half should match - assertIndexGet(t, index, id[:len(id)/2], id, false) - // The second half should NOT match - assertIndexGet(t, index, id[len(id)/2:], "", true) - - id2 := id[:6] + "blabla" - // Add an id - if err := index.Add(id2); err != nil { - t.Fatal(err) - } - // Both exact IDs should work - assertIndexGet(t, index, id, id, false) - assertIndexGet(t, index, id2, id2, false) - - // 6 characters or less should conflict - assertIndexGet(t, index, id[:6], "", true) - assertIndexGet(t, index, id[:4], "", true) - assertIndexGet(t, index, id[:1], "", true) - - // An ambiguous id prefix should return an error - if _, err := index.Get(id[:4]); err == nil { - t.Fatal("An ambiguous id prefix should return an error") - } - - // 7 characters should NOT conflict - assertIndexGet(t, index, id[:7], id, false) - assertIndexGet(t, index, id2[:7], id2, false) - - // Deleting a non-existing id should return an error - if err := index.Delete("non-existing"); err == nil { - t.Fatalf("Deleting a non-existing id should return an error") - } - - // Deleting an empty id should return an error - if err := index.Delete(""); err == nil { - t.Fatal("Deleting an empty id should return an error") - } - - // Deleting id2 should remove conflicts - if err := index.Delete(id2); err != nil { - t.Fatal(err) - } - // id2 should no longer work - assertIndexGet(t, index, id2, "", true) - assertIndexGet(t, index, id2[:7], "", true) - assertIndexGet(t, index, id2[:11], "", true) - - // conflicts between id and id2 should be gone - assertIndexGet(t, index, id[:6], id, false) - assertIndexGet(t, index, id[:4], id, false) - assertIndexGet(t, index, id[:1], id, false) - - // non-conflicting substrings should still not conflict - assertIndexGet(t, index, id[:7], id, false) - assertIndexGet(t, index, id[:15], id, false) - assertIndexGet(t, index, id, id, false) - - assertIndexIterate(t) -} - -func assertIndexIterate(t *testing.T) { - ids := []string{ - "19b36c2c326ccc11e726eee6ee78a0baf166ef96", - "28b36c2c326ccc11e726eee6ee78a0baf166ef96", - "37b36c2c326ccc11e726eee6ee78a0baf166ef96", - "46b36c2c326ccc11e726eee6ee78a0baf166ef96", - } - - index := NewTruncIndex(ids) - - index.Iterate(func(targetId string) { - for _, id := range ids { - if targetId == id { - return - } - } - - t.Fatalf("An unknown ID '%s'", targetId) - }) -} - -func assertIndexGet(t *testing.T, index *TruncIndex, input, expectedResult string, expectError bool) { - if result, err := index.Get(input); err != nil && !expectError { - t.Fatalf("Unexpected error getting '%s': %s", input, err) - } else if err == nil && expectError { - t.Fatalf("Getting '%s' should return an error, not '%s'", input, result) - } else if result != expectedResult { - t.Fatalf("Getting '%s' returned '%s' instead of '%s'", input, result, expectedResult) - } -} - -func BenchmarkTruncIndexAdd100(b *testing.B) { - var testSet []string - for i := 0; i < 100; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - } - } -} - -func BenchmarkTruncIndexAdd250(b *testing.B) { - var testSet []string - for i := 0; i < 250; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - } - } -} - -func BenchmarkTruncIndexAdd500(b *testing.B) { - var testSet []string - for i := 0; i < 500; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - } - } -} - -func BenchmarkTruncIndexGet100(b *testing.B) { - var testSet []string - var testKeys []string - for i := 0; i < 100; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - l := rand.Intn(12) + 12 - testKeys = append(testKeys, id[:l]) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - for _, id := range testKeys { - if res, err := index.Get(id); err != nil { - b.Fatal(res, err) - } - } - } -} - -func BenchmarkTruncIndexGet250(b *testing.B) { - var testSet []string - var testKeys []string - for i := 0; i < 250; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - l := rand.Intn(12) + 12 - testKeys = append(testKeys, id[:l]) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - for _, id := range testKeys { - if res, err := index.Get(id); err != nil { - b.Fatal(res, err) - } - } - } -} - -func BenchmarkTruncIndexGet500(b *testing.B) { - var testSet []string - var testKeys []string - for i := 0; i < 500; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - l := rand.Intn(12) + 12 - testKeys = append(testKeys, id[:l]) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - for _, id := range testKeys { - if res, err := index.Get(id); err != nil { - b.Fatal(res, err) - } - } - } -} - -func BenchmarkTruncIndexDelete100(b *testing.B) { - var testSet []string - for i := 0; i < 100; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - b.StopTimer() - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - } - b.StartTimer() - for _, id := range testSet { - if err := index.Delete(id); err != nil { - b.Fatal(err) - } - } - } -} - -func BenchmarkTruncIndexDelete250(b *testing.B) { - var testSet []string - for i := 0; i < 250; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - b.StopTimer() - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - } - b.StartTimer() - for _, id := range testSet { - if err := index.Delete(id); err != nil { - b.Fatal(err) - } - } - } -} - -func BenchmarkTruncIndexDelete500(b *testing.B) { - var testSet []string - for i := 0; i < 500; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - b.StopTimer() - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - } - b.StartTimer() - for _, id := range testSet { - if err := index.Delete(id); err != nil { - b.Fatal(err) - } - } - } -} - -func BenchmarkTruncIndexNew100(b *testing.B) { - var testSet []string - for i := 0; i < 100; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - NewTruncIndex(testSet) - } -} - -func BenchmarkTruncIndexNew250(b *testing.B) { - var testSet []string - for i := 0; i < 250; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - NewTruncIndex(testSet) - } -} - -func BenchmarkTruncIndexNew500(b *testing.B) { - var testSet []string - for i := 0; i < 500; i++ { - testSet = append(testSet, stringid.GenerateNonCryptoID()) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - NewTruncIndex(testSet) - } -} - -func BenchmarkTruncIndexAddGet100(b *testing.B) { - var testSet []string - var testKeys []string - for i := 0; i < 500; i++ { - id := stringid.GenerateNonCryptoID() - testSet = append(testSet, id) - l := rand.Intn(12) + 12 - testKeys = append(testKeys, id[:l]) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - } - for _, id := range testKeys { - if res, err := index.Get(id); err != nil { - b.Fatal(res, err) - } - } - } -} - -func BenchmarkTruncIndexAddGet250(b *testing.B) { - var testSet []string - var testKeys []string - for i := 0; i < 500; i++ { - id := stringid.GenerateNonCryptoID() - testSet = append(testSet, id) - l := rand.Intn(12) + 12 - testKeys = append(testKeys, id[:l]) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - } - for _, id := range testKeys { - if res, err := index.Get(id); err != nil { - b.Fatal(res, err) - } - } - } -} - -func BenchmarkTruncIndexAddGet500(b *testing.B) { - var testSet []string - var testKeys []string - for i := 0; i < 500; i++ { - id := stringid.GenerateNonCryptoID() - testSet = append(testSet, id) - l := rand.Intn(12) + 12 - testKeys = append(testKeys, id[:l]) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - index := NewTruncIndex([]string{}) - for _, id := range testSet { - if err := index.Add(id); err != nil { - b.Fatal(err) - } - } - for _, id := range testKeys { - if res, err := index.Get(id); err != nil { - b.Fatal(res, err) - } - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/urlutil/urlutil.go b/vendor/github.com/docker/docker/pkg/urlutil/urlutil.go deleted file mode 100644 index 44152873b..000000000 --- a/vendor/github.com/docker/docker/pkg/urlutil/urlutil.go +++ /dev/null @@ -1,50 +0,0 @@ -// Package urlutil provides helper function to check urls kind. -// It supports http urls, git urls and transport url (tcp://, …) -package urlutil - -import ( - "regexp" - "strings" -) - -var ( - validPrefixes = map[string][]string{ - "url": {"http://", "https://"}, - "git": {"git://", "github.com/", "git@"}, - "transport": {"tcp://", "tcp+tls://", "udp://", "unix://", "unixgram://"}, - } - urlPathWithFragmentSuffix = regexp.MustCompile(".git(?:#.+)?$") -) - -// IsURL returns true if the provided str is an HTTP(S) URL. -func IsURL(str string) bool { - return checkURL(str, "url") -} - -// IsGitURL returns true if the provided str is a git repository URL. -func IsGitURL(str string) bool { - if IsURL(str) && urlPathWithFragmentSuffix.MatchString(str) { - return true - } - return checkURL(str, "git") -} - -// IsGitTransport returns true if the provided str is a git transport by inspecting -// the prefix of the string for known protocols used in git. -func IsGitTransport(str string) bool { - return IsURL(str) || strings.HasPrefix(str, "git://") || strings.HasPrefix(str, "git@") -} - -// IsTransportURL returns true if the provided str is a transport (tcp, tcp+tls, udp, unix) URL. -func IsTransportURL(str string) bool { - return checkURL(str, "transport") -} - -func checkURL(str, kind string) bool { - for _, prefix := range validPrefixes[kind] { - if strings.HasPrefix(str, prefix) { - return true - } - } - return false -} diff --git a/vendor/github.com/docker/docker/pkg/urlutil/urlutil_test.go b/vendor/github.com/docker/docker/pkg/urlutil/urlutil_test.go deleted file mode 100644 index 75eb464fe..000000000 --- a/vendor/github.com/docker/docker/pkg/urlutil/urlutil_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package urlutil - -import "testing" - -var ( - gitUrls = []string{ - "git://github.com/docker/docker", - "git@github.com:docker/docker.git", - "git@bitbucket.org:atlassianlabs/atlassian-docker.git", - "https://github.com/docker/docker.git", - "http://github.com/docker/docker.git", - "http://github.com/docker/docker.git#branch", - "http://github.com/docker/docker.git#:dir", - } - incompleteGitUrls = []string{ - "github.com/docker/docker", - } - invalidGitUrls = []string{ - "http://github.com/docker/docker.git:#branch", - } - transportUrls = []string{ - "tcp://example.com", - "tcp+tls://example.com", - "udp://example.com", - "unix:///example", - "unixgram:///example", - } -) - -func TestValidGitTransport(t *testing.T) { - for _, url := range gitUrls { - if IsGitTransport(url) == false { - t.Fatalf("%q should be detected as valid Git prefix", url) - } - } - - for _, url := range incompleteGitUrls { - if IsGitTransport(url) == true { - t.Fatalf("%q should not be detected as valid Git prefix", url) - } - } -} - -func TestIsGIT(t *testing.T) { - for _, url := range gitUrls { - if IsGitURL(url) == false { - t.Fatalf("%q should be detected as valid Git url", url) - } - } - - for _, url := range incompleteGitUrls { - if IsGitURL(url) == false { - t.Fatalf("%q should be detected as valid Git url", url) - } - } - - for _, url := range invalidGitUrls { - if IsGitURL(url) == true { - t.Fatalf("%q should not be detected as valid Git prefix", url) - } - } -} - -func TestIsTransport(t *testing.T) { - for _, url := range transportUrls { - if IsTransportURL(url) == false { - t.Fatalf("%q should be detected as valid Transport url", url) - } - } -} diff --git a/vendor/github.com/docker/docker/pkg/useragent/README.md b/vendor/github.com/docker/docker/pkg/useragent/README.md deleted file mode 100644 index d9cb367d1..000000000 --- a/vendor/github.com/docker/docker/pkg/useragent/README.md +++ /dev/null @@ -1 +0,0 @@ -This package provides helper functions to pack version information into a single User-Agent header. diff --git a/vendor/github.com/docker/docker/pkg/useragent/useragent.go b/vendor/github.com/docker/docker/pkg/useragent/useragent.go deleted file mode 100644 index 1137db51b..000000000 --- a/vendor/github.com/docker/docker/pkg/useragent/useragent.go +++ /dev/null @@ -1,55 +0,0 @@ -// Package useragent provides helper functions to pack -// version information into a single User-Agent header. -package useragent - -import ( - "strings" -) - -// VersionInfo is used to model UserAgent versions. -type VersionInfo struct { - Name string - Version string -} - -func (vi *VersionInfo) isValid() bool { - const stopChars = " \t\r\n/" - name := vi.Name - vers := vi.Version - if len(name) == 0 || strings.ContainsAny(name, stopChars) { - return false - } - if len(vers) == 0 || strings.ContainsAny(vers, stopChars) { - return false - } - return true -} - -// AppendVersions converts versions to a string and appends the string to the string base. -// -// Each VersionInfo will be converted to a string in the format of -// "product/version", where the "product" is get from the name field, while -// version is get from the version field. Several pieces of version information -// will be concatenated and separated by space. -// -// Example: -// AppendVersions("base", VersionInfo{"foo", "1.0"}, VersionInfo{"bar", "2.0"}) -// results in "base foo/1.0 bar/2.0". -func AppendVersions(base string, versions ...VersionInfo) string { - if len(versions) == 0 { - return base - } - - verstrs := make([]string, 0, 1+len(versions)) - if len(base) > 0 { - verstrs = append(verstrs, base) - } - - for _, v := range versions { - if !v.isValid() { - continue - } - verstrs = append(verstrs, v.Name+"/"+v.Version) - } - return strings.Join(verstrs, " ") -} diff --git a/vendor/github.com/docker/docker/pkg/useragent/useragent_test.go b/vendor/github.com/docker/docker/pkg/useragent/useragent_test.go deleted file mode 100644 index 0ad7243a6..000000000 --- a/vendor/github.com/docker/docker/pkg/useragent/useragent_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package useragent - -import "testing" - -func TestVersionInfo(t *testing.T) { - vi := VersionInfo{"foo", "bar"} - if !vi.isValid() { - t.Fatalf("VersionInfo should be valid") - } - vi = VersionInfo{"", "bar"} - if vi.isValid() { - t.Fatalf("Expected VersionInfo to be invalid") - } - vi = VersionInfo{"foo", ""} - if vi.isValid() { - t.Fatalf("Expected VersionInfo to be invalid") - } -} - -func TestAppendVersions(t *testing.T) { - vis := []VersionInfo{ - {"foo", "1.0"}, - {"bar", "0.1"}, - {"pi", "3.1.4"}, - } - v := AppendVersions("base", vis...) - expect := "base foo/1.0 bar/0.1 pi/3.1.4" - if v != expect { - t.Fatalf("expected %q, got %q", expect, v) - } -} diff --git a/vendor/github.com/docker/docker/plugin/backend_linux.go b/vendor/github.com/docker/docker/plugin/backend_linux.go deleted file mode 100644 index 33200d8ef..000000000 --- a/vendor/github.com/docker/docker/plugin/backend_linux.go +++ /dev/null @@ -1,790 +0,0 @@ -// +build linux - -package plugin - -import ( - "archive/tar" - "compress/gzip" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "path" - "path/filepath" - "sort" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/distribution/manifest/schema2" - "github.com/docker/docker/api/types" - "github.com/docker/docker/distribution" - progressutils "github.com/docker/docker/distribution/utils" - "github.com/docker/docker/distribution/xfer" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/chrootarchive" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/pools" - "github.com/docker/docker/pkg/progress" - "github.com/docker/docker/plugin/v2" - "github.com/docker/docker/reference" - "github.com/pkg/errors" - "golang.org/x/net/context" -) - -// Disable deactivates a plugin. This means resources (volumes, networks) cant use them. -func (pm *Manager) Disable(refOrID string, config *types.PluginDisableConfig) error { - p, err := pm.config.Store.GetV2Plugin(refOrID) - if err != nil { - return err - } - pm.mu.RLock() - c := pm.cMap[p] - pm.mu.RUnlock() - - if !config.ForceDisable && p.GetRefCount() > 0 { - return fmt.Errorf("plugin %s is in use", p.Name()) - } - - if err := pm.disable(p, c); err != nil { - return err - } - pm.config.LogPluginEvent(p.GetID(), refOrID, "disable") - return nil -} - -// Enable activates a plugin, which implies that they are ready to be used by containers. -func (pm *Manager) Enable(refOrID string, config *types.PluginEnableConfig) error { - p, err := pm.config.Store.GetV2Plugin(refOrID) - if err != nil { - return err - } - - c := &controller{timeoutInSecs: config.Timeout} - if err := pm.enable(p, c, false); err != nil { - return err - } - pm.config.LogPluginEvent(p.GetID(), refOrID, "enable") - return nil -} - -// Inspect examines a plugin config -func (pm *Manager) Inspect(refOrID string) (tp *types.Plugin, err error) { - p, err := pm.config.Store.GetV2Plugin(refOrID) - if err != nil { - return nil, err - } - - return &p.PluginObj, nil -} - -func (pm *Manager) pull(ctx context.Context, ref reference.Named, config *distribution.ImagePullConfig, outStream io.Writer) error { - if outStream != nil { - // Include a buffer so that slow client connections don't affect - // transfer performance. - progressChan := make(chan progress.Progress, 100) - - writesDone := make(chan struct{}) - - defer func() { - close(progressChan) - <-writesDone - }() - - var cancelFunc context.CancelFunc - ctx, cancelFunc = context.WithCancel(ctx) - - go func() { - progressutils.WriteDistributionProgress(cancelFunc, outStream, progressChan) - close(writesDone) - }() - - config.ProgressOutput = progress.ChanOutput(progressChan) - } else { - config.ProgressOutput = progress.DiscardOutput() - } - return distribution.Pull(ctx, ref, config) -} - -type tempConfigStore struct { - config []byte - configDigest digest.Digest -} - -func (s *tempConfigStore) Put(c []byte) (digest.Digest, error) { - dgst := digest.FromBytes(c) - - s.config = c - s.configDigest = dgst - - return dgst, nil -} - -func (s *tempConfigStore) Get(d digest.Digest) ([]byte, error) { - if d != s.configDigest { - return nil, digest.ErrDigestNotFound - } - return s.config, nil -} - -func (s *tempConfigStore) RootFSFromConfig(c []byte) (*image.RootFS, error) { - return configToRootFS(c) -} - -func computePrivileges(c types.PluginConfig) (types.PluginPrivileges, error) { - var privileges types.PluginPrivileges - if c.Network.Type != "null" && c.Network.Type != "bridge" && c.Network.Type != "" { - privileges = append(privileges, types.PluginPrivilege{ - Name: "network", - Description: "permissions to access a network", - Value: []string{c.Network.Type}, - }) - } - for _, mount := range c.Mounts { - if mount.Source != nil { - privileges = append(privileges, types.PluginPrivilege{ - Name: "mount", - Description: "host path to mount", - Value: []string{*mount.Source}, - }) - } - } - for _, device := range c.Linux.Devices { - if device.Path != nil { - privileges = append(privileges, types.PluginPrivilege{ - Name: "device", - Description: "host device to access", - Value: []string{*device.Path}, - }) - } - } - if c.Linux.AllowAllDevices { - privileges = append(privileges, types.PluginPrivilege{ - Name: "allow-all-devices", - Description: "allow 'rwm' access to all devices", - Value: []string{"true"}, - }) - } - if len(c.Linux.Capabilities) > 0 { - privileges = append(privileges, types.PluginPrivilege{ - Name: "capabilities", - Description: "list of additional capabilities required", - Value: c.Linux.Capabilities, - }) - } - - return privileges, nil -} - -// Privileges pulls a plugin config and computes the privileges required to install it. -func (pm *Manager) Privileges(ctx context.Context, ref reference.Named, metaHeader http.Header, authConfig *types.AuthConfig) (types.PluginPrivileges, error) { - // create image store instance - cs := &tempConfigStore{} - - // DownloadManager not defined because only pulling configuration. - pluginPullConfig := &distribution.ImagePullConfig{ - Config: distribution.Config{ - MetaHeaders: metaHeader, - AuthConfig: authConfig, - RegistryService: pm.config.RegistryService, - ImageEventLogger: func(string, string, string) {}, - ImageStore: cs, - }, - Schema2Types: distribution.PluginTypes, - } - - if err := pm.pull(ctx, ref, pluginPullConfig, nil); err != nil { - return nil, err - } - - if cs.config == nil { - return nil, errors.New("no configuration pulled") - } - var config types.PluginConfig - if err := json.Unmarshal(cs.config, &config); err != nil { - return nil, err - } - - return computePrivileges(config) -} - -// Upgrade upgrades a plugin -func (pm *Manager) Upgrade(ctx context.Context, ref reference.Named, name string, metaHeader http.Header, authConfig *types.AuthConfig, privileges types.PluginPrivileges, outStream io.Writer) (err error) { - p, err := pm.config.Store.GetV2Plugin(name) - if err != nil { - return errors.Wrap(err, "plugin must be installed before upgrading") - } - - if p.IsEnabled() { - return fmt.Errorf("plugin must be disabled before upgrading") - } - - pm.muGC.RLock() - defer pm.muGC.RUnlock() - - // revalidate because Pull is public - nameref, err := reference.ParseNamed(name) - if err != nil { - return errors.Wrapf(err, "failed to parse %q", name) - } - name = reference.WithDefaultTag(nameref).String() - - tmpRootFSDir, err := ioutil.TempDir(pm.tmpDir(), ".rootfs") - defer os.RemoveAll(tmpRootFSDir) - - dm := &downloadManager{ - tmpDir: tmpRootFSDir, - blobStore: pm.blobStore, - } - - pluginPullConfig := &distribution.ImagePullConfig{ - Config: distribution.Config{ - MetaHeaders: metaHeader, - AuthConfig: authConfig, - RegistryService: pm.config.RegistryService, - ImageEventLogger: pm.config.LogPluginEvent, - ImageStore: dm, - }, - DownloadManager: dm, // todo: reevaluate if possible to substitute distribution/xfer dependencies instead - Schema2Types: distribution.PluginTypes, - } - - err = pm.pull(ctx, ref, pluginPullConfig, outStream) - if err != nil { - go pm.GC() - return err - } - - if err := pm.upgradePlugin(p, dm.configDigest, dm.blobs, tmpRootFSDir, &privileges); err != nil { - return err - } - p.PluginObj.PluginReference = ref.String() - return nil -} - -// Pull pulls a plugin, check if the correct privileges are provided and install the plugin. -func (pm *Manager) Pull(ctx context.Context, ref reference.Named, name string, metaHeader http.Header, authConfig *types.AuthConfig, privileges types.PluginPrivileges, outStream io.Writer) (err error) { - pm.muGC.RLock() - defer pm.muGC.RUnlock() - - // revalidate because Pull is public - nameref, err := reference.ParseNamed(name) - if err != nil { - return errors.Wrapf(err, "failed to parse %q", name) - } - name = reference.WithDefaultTag(nameref).String() - - if err := pm.config.Store.validateName(name); err != nil { - return err - } - - tmpRootFSDir, err := ioutil.TempDir(pm.tmpDir(), ".rootfs") - defer os.RemoveAll(tmpRootFSDir) - - dm := &downloadManager{ - tmpDir: tmpRootFSDir, - blobStore: pm.blobStore, - } - - pluginPullConfig := &distribution.ImagePullConfig{ - Config: distribution.Config{ - MetaHeaders: metaHeader, - AuthConfig: authConfig, - RegistryService: pm.config.RegistryService, - ImageEventLogger: pm.config.LogPluginEvent, - ImageStore: dm, - }, - DownloadManager: dm, // todo: reevaluate if possible to substitute distribution/xfer dependencies instead - Schema2Types: distribution.PluginTypes, - } - - err = pm.pull(ctx, ref, pluginPullConfig, outStream) - if err != nil { - go pm.GC() - return err - } - - p, err := pm.createPlugin(name, dm.configDigest, dm.blobs, tmpRootFSDir, &privileges) - if err != nil { - return err - } - p.PluginObj.PluginReference = ref.String() - - return nil -} - -// List displays the list of plugins and associated metadata. -func (pm *Manager) List() ([]types.Plugin, error) { - plugins := pm.config.Store.GetAll() - out := make([]types.Plugin, 0, len(plugins)) - for _, p := range plugins { - out = append(out, p.PluginObj) - } - return out, nil -} - -// Push pushes a plugin to the store. -func (pm *Manager) Push(ctx context.Context, name string, metaHeader http.Header, authConfig *types.AuthConfig, outStream io.Writer) error { - p, err := pm.config.Store.GetV2Plugin(name) - if err != nil { - return err - } - - ref, err := reference.ParseNamed(p.Name()) - if err != nil { - return errors.Wrapf(err, "plugin has invalid name %v for push", p.Name()) - } - - var po progress.Output - if outStream != nil { - // Include a buffer so that slow client connections don't affect - // transfer performance. - progressChan := make(chan progress.Progress, 100) - - writesDone := make(chan struct{}) - - defer func() { - close(progressChan) - <-writesDone - }() - - var cancelFunc context.CancelFunc - ctx, cancelFunc = context.WithCancel(ctx) - - go func() { - progressutils.WriteDistributionProgress(cancelFunc, outStream, progressChan) - close(writesDone) - }() - - po = progress.ChanOutput(progressChan) - } else { - po = progress.DiscardOutput() - } - - // TODO: replace these with manager - is := &pluginConfigStore{ - pm: pm, - plugin: p, - } - ls := &pluginLayerProvider{ - pm: pm, - plugin: p, - } - rs := &pluginReference{ - name: ref, - pluginID: p.Config, - } - - uploadManager := xfer.NewLayerUploadManager(3) - - imagePushConfig := &distribution.ImagePushConfig{ - Config: distribution.Config{ - MetaHeaders: metaHeader, - AuthConfig: authConfig, - ProgressOutput: po, - RegistryService: pm.config.RegistryService, - ReferenceStore: rs, - ImageEventLogger: pm.config.LogPluginEvent, - ImageStore: is, - RequireSchema2: true, - }, - ConfigMediaType: schema2.MediaTypePluginConfig, - LayerStore: ls, - UploadManager: uploadManager, - } - - return distribution.Push(ctx, ref, imagePushConfig) -} - -type pluginReference struct { - name reference.Named - pluginID digest.Digest -} - -func (r *pluginReference) References(id digest.Digest) []reference.Named { - if r.pluginID != id { - return nil - } - return []reference.Named{r.name} -} - -func (r *pluginReference) ReferencesByName(ref reference.Named) []reference.Association { - return []reference.Association{ - { - Ref: r.name, - ID: r.pluginID, - }, - } -} - -func (r *pluginReference) Get(ref reference.Named) (digest.Digest, error) { - if r.name.String() != ref.String() { - return digest.Digest(""), reference.ErrDoesNotExist - } - return r.pluginID, nil -} - -func (r *pluginReference) AddTag(ref reference.Named, id digest.Digest, force bool) error { - // Read only, ignore - return nil -} -func (r *pluginReference) AddDigest(ref reference.Canonical, id digest.Digest, force bool) error { - // Read only, ignore - return nil -} -func (r *pluginReference) Delete(ref reference.Named) (bool, error) { - // Read only, ignore - return false, nil -} - -type pluginConfigStore struct { - pm *Manager - plugin *v2.Plugin -} - -func (s *pluginConfigStore) Put([]byte) (digest.Digest, error) { - return digest.Digest(""), errors.New("cannot store config on push") -} - -func (s *pluginConfigStore) Get(d digest.Digest) ([]byte, error) { - if s.plugin.Config != d { - return nil, errors.New("plugin not found") - } - rwc, err := s.pm.blobStore.Get(d) - if err != nil { - return nil, err - } - defer rwc.Close() - return ioutil.ReadAll(rwc) -} - -func (s *pluginConfigStore) RootFSFromConfig(c []byte) (*image.RootFS, error) { - return configToRootFS(c) -} - -type pluginLayerProvider struct { - pm *Manager - plugin *v2.Plugin -} - -func (p *pluginLayerProvider) Get(id layer.ChainID) (distribution.PushLayer, error) { - rootFS := rootFSFromPlugin(p.plugin.PluginObj.Config.Rootfs) - var i int - for i = 1; i <= len(rootFS.DiffIDs); i++ { - if layer.CreateChainID(rootFS.DiffIDs[:i]) == id { - break - } - } - if i > len(rootFS.DiffIDs) { - return nil, errors.New("layer not found") - } - return &pluginLayer{ - pm: p.pm, - diffIDs: rootFS.DiffIDs[:i], - blobs: p.plugin.Blobsums[:i], - }, nil -} - -type pluginLayer struct { - pm *Manager - diffIDs []layer.DiffID - blobs []digest.Digest -} - -func (l *pluginLayer) ChainID() layer.ChainID { - return layer.CreateChainID(l.diffIDs) -} - -func (l *pluginLayer) DiffID() layer.DiffID { - return l.diffIDs[len(l.diffIDs)-1] -} - -func (l *pluginLayer) Parent() distribution.PushLayer { - if len(l.diffIDs) == 1 { - return nil - } - return &pluginLayer{ - pm: l.pm, - diffIDs: l.diffIDs[:len(l.diffIDs)-1], - blobs: l.blobs[:len(l.diffIDs)-1], - } -} - -func (l *pluginLayer) Open() (io.ReadCloser, error) { - return l.pm.blobStore.Get(l.blobs[len(l.diffIDs)-1]) -} - -func (l *pluginLayer) Size() (int64, error) { - return l.pm.blobStore.Size(l.blobs[len(l.diffIDs)-1]) -} - -func (l *pluginLayer) MediaType() string { - return schema2.MediaTypeLayer -} - -func (l *pluginLayer) Release() { - // Nothing needs to be release, no references held -} - -// Remove deletes plugin's root directory. -func (pm *Manager) Remove(name string, config *types.PluginRmConfig) error { - p, err := pm.config.Store.GetV2Plugin(name) - pm.mu.RLock() - c := pm.cMap[p] - pm.mu.RUnlock() - - if err != nil { - return err - } - - if !config.ForceRemove { - if p.GetRefCount() > 0 { - return fmt.Errorf("plugin %s is in use", p.Name()) - } - if p.IsEnabled() { - return fmt.Errorf("plugin %s is enabled", p.Name()) - } - } - - if p.IsEnabled() { - if err := pm.disable(p, c); err != nil { - logrus.Errorf("failed to disable plugin '%s': %s", p.Name(), err) - } - } - - defer func() { - go pm.GC() - }() - - id := p.GetID() - pm.config.Store.Remove(p) - pluginDir := filepath.Join(pm.config.Root, id) - if err := recursiveUnmount(pm.config.Root); err != nil { - logrus.WithField("dir", pm.config.Root).WithField("id", id).Warn(err) - } - if err := os.RemoveAll(pluginDir); err != nil { - logrus.Warnf("unable to remove %q from plugin remove: %v", pluginDir, err) - } - pm.config.LogPluginEvent(id, name, "remove") - return nil -} - -func getMounts(root string) ([]string, error) { - infos, err := mount.GetMounts() - if err != nil { - return nil, errors.Wrap(err, "failed to read mount table while performing recursive unmount") - } - - var mounts []string - for _, m := range infos { - if strings.HasPrefix(m.Mountpoint, root) { - mounts = append(mounts, m.Mountpoint) - } - } - - return mounts, nil -} - -func recursiveUnmount(root string) error { - mounts, err := getMounts(root) - if err != nil { - return err - } - - // sort in reverse-lexicographic order so the root mount will always be last - sort.Sort(sort.Reverse(sort.StringSlice(mounts))) - - for i, m := range mounts { - if err := mount.Unmount(m); err != nil { - if i == len(mounts)-1 { - return errors.Wrapf(err, "error performing recursive unmount on %s", root) - } - logrus.WithError(err).WithField("mountpoint", m).Warn("could not unmount") - } - } - - return nil -} - -// Set sets plugin args -func (pm *Manager) Set(name string, args []string) error { - p, err := pm.config.Store.GetV2Plugin(name) - if err != nil { - return err - } - if err := p.Set(args); err != nil { - return err - } - return pm.save(p) -} - -// CreateFromContext creates a plugin from the given pluginDir which contains -// both the rootfs and the config.json and a repoName with optional tag. -func (pm *Manager) CreateFromContext(ctx context.Context, tarCtx io.ReadCloser, options *types.PluginCreateOptions) (err error) { - pm.muGC.RLock() - defer pm.muGC.RUnlock() - - ref, err := reference.ParseNamed(options.RepoName) - if err != nil { - return errors.Wrapf(err, "failed to parse reference %v", options.RepoName) - } - if _, ok := ref.(reference.Canonical); ok { - return errors.Errorf("canonical references are not permitted") - } - taggedRef := reference.WithDefaultTag(ref) - name := taggedRef.String() - - if err := pm.config.Store.validateName(name); err != nil { // fast check, real check is in createPlugin() - return err - } - - tmpRootFSDir, err := ioutil.TempDir(pm.tmpDir(), ".rootfs") - defer os.RemoveAll(tmpRootFSDir) - if err != nil { - return errors.Wrap(err, "failed to create temp directory") - } - var configJSON []byte - rootFS := splitConfigRootFSFromTar(tarCtx, &configJSON) - - rootFSBlob, err := pm.blobStore.New() - if err != nil { - return err - } - defer rootFSBlob.Close() - gzw := gzip.NewWriter(rootFSBlob) - layerDigester := digest.Canonical.New() - rootFSReader := io.TeeReader(rootFS, io.MultiWriter(gzw, layerDigester.Hash())) - - if err := chrootarchive.Untar(rootFSReader, tmpRootFSDir, nil); err != nil { - return err - } - if err := rootFS.Close(); err != nil { - return err - } - - if configJSON == nil { - return errors.New("config not found") - } - - if err := gzw.Close(); err != nil { - return errors.Wrap(err, "error closing gzip writer") - } - - var config types.PluginConfig - if err := json.Unmarshal(configJSON, &config); err != nil { - return errors.Wrap(err, "failed to parse config") - } - - if err := pm.validateConfig(config); err != nil { - return err - } - - pm.mu.Lock() - defer pm.mu.Unlock() - - rootFSBlobsum, err := rootFSBlob.Commit() - if err != nil { - return err - } - defer func() { - if err != nil { - go pm.GC() - } - }() - - config.Rootfs = &types.PluginConfigRootfs{ - Type: "layers", - DiffIds: []string{layerDigester.Digest().String()}, - } - - configBlob, err := pm.blobStore.New() - if err != nil { - return err - } - defer configBlob.Close() - if err := json.NewEncoder(configBlob).Encode(config); err != nil { - return errors.Wrap(err, "error encoding json config") - } - configBlobsum, err := configBlob.Commit() - if err != nil { - return err - } - - p, err := pm.createPlugin(name, configBlobsum, []digest.Digest{rootFSBlobsum}, tmpRootFSDir, nil) - if err != nil { - return err - } - p.PluginObj.PluginReference = taggedRef.String() - - pm.config.LogPluginEvent(p.PluginObj.ID, name, "create") - - return nil -} - -func (pm *Manager) validateConfig(config types.PluginConfig) error { - return nil // TODO: -} - -func splitConfigRootFSFromTar(in io.ReadCloser, config *[]byte) io.ReadCloser { - pr, pw := io.Pipe() - go func() { - tarReader := tar.NewReader(in) - tarWriter := tar.NewWriter(pw) - defer in.Close() - - hasRootFS := false - - for { - hdr, err := tarReader.Next() - if err == io.EOF { - if !hasRootFS { - pw.CloseWithError(errors.Wrap(err, "no rootfs found")) - return - } - // Signals end of archive. - tarWriter.Close() - pw.Close() - return - } - if err != nil { - pw.CloseWithError(errors.Wrap(err, "failed to read from tar")) - return - } - - content := io.Reader(tarReader) - name := path.Clean(hdr.Name) - if path.IsAbs(name) { - name = name[1:] - } - if name == configFileName { - dt, err := ioutil.ReadAll(content) - if err != nil { - pw.CloseWithError(errors.Wrapf(err, "failed to read %s", configFileName)) - return - } - *config = dt - } - if parts := strings.Split(name, "/"); len(parts) != 0 && parts[0] == rootFSFileName { - hdr.Name = path.Clean(path.Join(parts[1:]...)) - if hdr.Typeflag == tar.TypeLink && strings.HasPrefix(strings.ToLower(hdr.Linkname), rootFSFileName+"/") { - hdr.Linkname = hdr.Linkname[len(rootFSFileName)+1:] - } - if err := tarWriter.WriteHeader(hdr); err != nil { - pw.CloseWithError(errors.Wrap(err, "error writing tar header")) - return - } - if _, err := pools.Copy(tarWriter, content); err != nil { - pw.CloseWithError(errors.Wrap(err, "error copying tar data")) - return - } - hasRootFS = true - } else { - io.Copy(ioutil.Discard, content) - } - } - }() - return pr -} diff --git a/vendor/github.com/docker/docker/plugin/backend_unsupported.go b/vendor/github.com/docker/docker/plugin/backend_unsupported.go deleted file mode 100644 index 66e6dab9e..000000000 --- a/vendor/github.com/docker/docker/plugin/backend_unsupported.go +++ /dev/null @@ -1,71 +0,0 @@ -// +build !linux - -package plugin - -import ( - "errors" - "io" - "net/http" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/reference" - "golang.org/x/net/context" -) - -var errNotSupported = errors.New("plugins are not supported on this platform") - -// Disable deactivates a plugin, which implies that they cannot be used by containers. -func (pm *Manager) Disable(name string, config *types.PluginDisableConfig) error { - return errNotSupported -} - -// Enable activates a plugin, which implies that they are ready to be used by containers. -func (pm *Manager) Enable(name string, config *types.PluginEnableConfig) error { - return errNotSupported -} - -// Inspect examines a plugin config -func (pm *Manager) Inspect(refOrID string) (tp *types.Plugin, err error) { - return nil, errNotSupported -} - -// Privileges pulls a plugin config and computes the privileges required to install it. -func (pm *Manager) Privileges(ctx context.Context, ref reference.Named, metaHeader http.Header, authConfig *types.AuthConfig) (types.PluginPrivileges, error) { - return nil, errNotSupported -} - -// Pull pulls a plugin, check if the correct privileges are provided and install the plugin. -func (pm *Manager) Pull(ctx context.Context, ref reference.Named, name string, metaHeader http.Header, authConfig *types.AuthConfig, privileges types.PluginPrivileges, out io.Writer) error { - return errNotSupported -} - -// Upgrade pulls a plugin, check if the correct privileges are provided and install the plugin. -func (pm *Manager) Upgrade(ctx context.Context, ref reference.Named, name string, metaHeader http.Header, authConfig *types.AuthConfig, privileges types.PluginPrivileges, outStream io.Writer) error { - return errNotSupported -} - -// List displays the list of plugins and associated metadata. -func (pm *Manager) List() ([]types.Plugin, error) { - return nil, errNotSupported -} - -// Push pushes a plugin to the store. -func (pm *Manager) Push(ctx context.Context, name string, metaHeader http.Header, authConfig *types.AuthConfig, out io.Writer) error { - return errNotSupported -} - -// Remove deletes plugin's root directory. -func (pm *Manager) Remove(name string, config *types.PluginRmConfig) error { - return errNotSupported -} - -// Set sets plugin args -func (pm *Manager) Set(name string, args []string) error { - return errNotSupported -} - -// CreateFromContext creates a plugin from the given pluginDir which contains -// both the rootfs and the config.json and a repoName with optional tag. -func (pm *Manager) CreateFromContext(ctx context.Context, tarCtx io.ReadCloser, options *types.PluginCreateOptions) error { - return errNotSupported -} diff --git a/vendor/github.com/docker/docker/plugin/blobstore.go b/vendor/github.com/docker/docker/plugin/blobstore.go deleted file mode 100644 index dc9e598e0..000000000 --- a/vendor/github.com/docker/docker/plugin/blobstore.go +++ /dev/null @@ -1,181 +0,0 @@ -package plugin - -import ( - "io" - "io/ioutil" - "os" - "path/filepath" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/distribution/xfer" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/progress" - "github.com/pkg/errors" - "golang.org/x/net/context" -) - -type blobstore interface { - New() (WriteCommitCloser, error) - Get(dgst digest.Digest) (io.ReadCloser, error) - Size(dgst digest.Digest) (int64, error) -} - -type basicBlobStore struct { - path string -} - -func newBasicBlobStore(p string) (*basicBlobStore, error) { - tmpdir := filepath.Join(p, "tmp") - if err := os.MkdirAll(tmpdir, 0700); err != nil { - return nil, errors.Wrapf(err, "failed to mkdir %v", p) - } - return &basicBlobStore{path: p}, nil -} - -func (b *basicBlobStore) New() (WriteCommitCloser, error) { - f, err := ioutil.TempFile(filepath.Join(b.path, "tmp"), ".insertion") - if err != nil { - return nil, errors.Wrap(err, "failed to create temp file") - } - return newInsertion(f), nil -} - -func (b *basicBlobStore) Get(dgst digest.Digest) (io.ReadCloser, error) { - return os.Open(filepath.Join(b.path, string(dgst.Algorithm()), dgst.Hex())) -} - -func (b *basicBlobStore) Size(dgst digest.Digest) (int64, error) { - stat, err := os.Stat(filepath.Join(b.path, string(dgst.Algorithm()), dgst.Hex())) - if err != nil { - return 0, err - } - return stat.Size(), nil -} - -func (b *basicBlobStore) gc(whitelist map[digest.Digest]struct{}) { - for _, alg := range []string{string(digest.Canonical)} { - items, err := ioutil.ReadDir(filepath.Join(b.path, alg)) - if err != nil { - continue - } - for _, fi := range items { - if _, exists := whitelist[digest.Digest(alg+":"+fi.Name())]; !exists { - p := filepath.Join(b.path, alg, fi.Name()) - err := os.RemoveAll(p) - logrus.Debugf("cleaned up blob %v: %v", p, err) - } - } - } - -} - -// WriteCommitCloser defines object that can be committed to blobstore. -type WriteCommitCloser interface { - io.WriteCloser - Commit() (digest.Digest, error) -} - -type insertion struct { - io.Writer - f *os.File - digester digest.Digester - closed bool -} - -func newInsertion(tempFile *os.File) *insertion { - digester := digest.Canonical.New() - return &insertion{f: tempFile, digester: digester, Writer: io.MultiWriter(tempFile, digester.Hash())} -} - -func (i *insertion) Commit() (digest.Digest, error) { - p := i.f.Name() - d := filepath.Join(filepath.Join(p, "../../")) - i.f.Sync() - defer os.RemoveAll(p) - if err := i.f.Close(); err != nil { - return "", err - } - i.closed = true - dgst := i.digester.Digest() - if err := os.MkdirAll(filepath.Join(d, string(dgst.Algorithm())), 0700); err != nil { - return "", errors.Wrapf(err, "failed to mkdir %v", d) - } - if err := os.Rename(p, filepath.Join(d, string(dgst.Algorithm()), dgst.Hex())); err != nil { - return "", errors.Wrapf(err, "failed to rename %v", p) - } - return dgst, nil -} - -func (i *insertion) Close() error { - if i.closed { - return nil - } - defer os.RemoveAll(i.f.Name()) - return i.f.Close() -} - -type downloadManager struct { - blobStore blobstore - tmpDir string - blobs []digest.Digest - configDigest digest.Digest -} - -func (dm *downloadManager) Download(ctx context.Context, initialRootFS image.RootFS, layers []xfer.DownloadDescriptor, progressOutput progress.Output) (image.RootFS, func(), error) { - for _, l := range layers { - b, err := dm.blobStore.New() - if err != nil { - return initialRootFS, nil, err - } - defer b.Close() - rc, _, err := l.Download(ctx, progressOutput) - if err != nil { - return initialRootFS, nil, errors.Wrap(err, "failed to download") - } - defer rc.Close() - r := io.TeeReader(rc, b) - inflatedLayerData, err := archive.DecompressStream(r) - if err != nil { - return initialRootFS, nil, err - } - digester := digest.Canonical.New() - if _, err := archive.ApplyLayer(dm.tmpDir, io.TeeReader(inflatedLayerData, digester.Hash())); err != nil { - return initialRootFS, nil, err - } - initialRootFS.Append(layer.DiffID(digester.Digest())) - d, err := b.Commit() - if err != nil { - return initialRootFS, nil, err - } - dm.blobs = append(dm.blobs, d) - } - return initialRootFS, nil, nil -} - -func (dm *downloadManager) Put(dt []byte) (digest.Digest, error) { - b, err := dm.blobStore.New() - if err != nil { - return "", err - } - defer b.Close() - n, err := b.Write(dt) - if err != nil { - return "", err - } - if n != len(dt) { - return "", io.ErrShortWrite - } - d, err := b.Commit() - dm.configDigest = d - return d, err -} - -func (dm *downloadManager) Get(d digest.Digest) ([]byte, error) { - return nil, digest.ErrDigestNotFound -} -func (dm *downloadManager) RootFSFromConfig(c []byte) (*image.RootFS, error) { - return configToRootFS(c) -} diff --git a/vendor/github.com/docker/docker/plugin/defs.go b/vendor/github.com/docker/docker/plugin/defs.go deleted file mode 100644 index 927f63916..000000000 --- a/vendor/github.com/docker/docker/plugin/defs.go +++ /dev/null @@ -1,26 +0,0 @@ -package plugin - -import ( - "sync" - - "github.com/docker/docker/pkg/plugins" - "github.com/docker/docker/plugin/v2" -) - -// Store manages the plugin inventory in memory and on-disk -type Store struct { - sync.RWMutex - plugins map[string]*v2.Plugin - /* handlers are necessary for transition path of legacy plugins - * to the new model. Legacy plugins use Handle() for registering an - * activation callback.*/ - handlers map[string][]func(string, *plugins.Client) -} - -// NewStore creates a Store. -func NewStore(libRoot string) *Store { - return &Store{ - plugins: make(map[string]*v2.Plugin), - handlers: make(map[string][]func(string, *plugins.Client)), - } -} diff --git a/vendor/github.com/docker/docker/plugin/manager.go b/vendor/github.com/docker/docker/plugin/manager.go deleted file mode 100644 index f260aa61a..000000000 --- a/vendor/github.com/docker/docker/plugin/manager.go +++ /dev/null @@ -1,347 +0,0 @@ -package plugin - -import ( - "encoding/json" - "io" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "regexp" - "strings" - "sync" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/api/types" - "github.com/docker/docker/image" - "github.com/docker/docker/layer" - "github.com/docker/docker/libcontainerd" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/plugin/v2" - "github.com/docker/docker/reference" - "github.com/docker/docker/registry" - "github.com/pkg/errors" -) - -const configFileName = "config.json" -const rootFSFileName = "rootfs" - -var validFullID = regexp.MustCompile(`^([a-f0-9]{64})$`) - -func (pm *Manager) restorePlugin(p *v2.Plugin) error { - if p.IsEnabled() { - return pm.restore(p) - } - return nil -} - -type eventLogger func(id, name, action string) - -// ManagerConfig defines configuration needed to start new manager. -type ManagerConfig struct { - Store *Store // remove - Executor libcontainerd.Remote - RegistryService registry.Service - LiveRestoreEnabled bool // TODO: remove - LogPluginEvent eventLogger - Root string - ExecRoot string -} - -// Manager controls the plugin subsystem. -type Manager struct { - config ManagerConfig - mu sync.RWMutex // protects cMap - muGC sync.RWMutex // protects blobstore deletions - cMap map[*v2.Plugin]*controller - containerdClient libcontainerd.Client - blobStore *basicBlobStore -} - -// controller represents the manager's control on a plugin. -type controller struct { - restart bool - exitChan chan bool - timeoutInSecs int -} - -// pluginRegistryService ensures that all resolved repositories -// are of the plugin class. -type pluginRegistryService struct { - registry.Service -} - -func (s pluginRegistryService) ResolveRepository(name reference.Named) (repoInfo *registry.RepositoryInfo, err error) { - repoInfo, err = s.Service.ResolveRepository(name) - if repoInfo != nil { - repoInfo.Class = "plugin" - } - return -} - -// NewManager returns a new plugin manager. -func NewManager(config ManagerConfig) (*Manager, error) { - if config.RegistryService != nil { - config.RegistryService = pluginRegistryService{config.RegistryService} - } - manager := &Manager{ - config: config, - } - if err := os.MkdirAll(manager.config.Root, 0700); err != nil { - return nil, errors.Wrapf(err, "failed to mkdir %v", manager.config.Root) - } - if err := os.MkdirAll(manager.config.ExecRoot, 0700); err != nil { - return nil, errors.Wrapf(err, "failed to mkdir %v", manager.config.ExecRoot) - } - if err := os.MkdirAll(manager.tmpDir(), 0700); err != nil { - return nil, errors.Wrapf(err, "failed to mkdir %v", manager.tmpDir()) - } - var err error - manager.containerdClient, err = config.Executor.Client(manager) // todo: move to another struct - if err != nil { - return nil, errors.Wrap(err, "failed to create containerd client") - } - manager.blobStore, err = newBasicBlobStore(filepath.Join(manager.config.Root, "storage/blobs")) - if err != nil { - return nil, err - } - - manager.cMap = make(map[*v2.Plugin]*controller) - if err := manager.reload(); err != nil { - return nil, errors.Wrap(err, "failed to restore plugins") - } - return manager, nil -} - -func (pm *Manager) tmpDir() string { - return filepath.Join(pm.config.Root, "tmp") -} - -// StateChanged updates plugin internals using libcontainerd events. -func (pm *Manager) StateChanged(id string, e libcontainerd.StateInfo) error { - logrus.Debugf("plugin state changed %s %#v", id, e) - - switch e.State { - case libcontainerd.StateExit: - p, err := pm.config.Store.GetV2Plugin(id) - if err != nil { - return err - } - - pm.mu.RLock() - c := pm.cMap[p] - - if c.exitChan != nil { - close(c.exitChan) - } - restart := c.restart - pm.mu.RUnlock() - - os.RemoveAll(filepath.Join(pm.config.ExecRoot, id)) - - if p.PropagatedMount != "" { - if err := mount.Unmount(p.PropagatedMount); err != nil { - logrus.Warnf("Could not unmount %s: %v", p.PropagatedMount, err) - } - propRoot := filepath.Join(filepath.Dir(p.Rootfs), "propagated-mount") - if err := mount.Unmount(propRoot); err != nil { - logrus.Warn("Could not unmount %s: %v", propRoot, err) - } - } - - if restart { - pm.enable(p, c, true) - } - } - - return nil -} - -func (pm *Manager) reload() error { // todo: restore - dir, err := ioutil.ReadDir(pm.config.Root) - if err != nil { - return errors.Wrapf(err, "failed to read %v", pm.config.Root) - } - plugins := make(map[string]*v2.Plugin) - for _, v := range dir { - if validFullID.MatchString(v.Name()) { - p, err := pm.loadPlugin(v.Name()) - if err != nil { - return err - } - plugins[p.GetID()] = p - } - } - - pm.config.Store.SetAll(plugins) - - var wg sync.WaitGroup - wg.Add(len(plugins)) - for _, p := range plugins { - c := &controller{} // todo: remove this - pm.cMap[p] = c - go func(p *v2.Plugin) { - defer wg.Done() - if err := pm.restorePlugin(p); err != nil { - logrus.Errorf("failed to restore plugin '%s': %s", p.Name(), err) - return - } - - if p.Rootfs != "" { - p.Rootfs = filepath.Join(pm.config.Root, p.PluginObj.ID, "rootfs") - } - - // We should only enable rootfs propagation for certain plugin types that need it. - for _, typ := range p.PluginObj.Config.Interface.Types { - if (typ.Capability == "volumedriver" || typ.Capability == "graphdriver") && typ.Prefix == "docker" && strings.HasPrefix(typ.Version, "1.") { - if p.PluginObj.Config.PropagatedMount != "" { - propRoot := filepath.Join(filepath.Dir(p.Rootfs), "propagated-mount") - - // check if we need to migrate an older propagated mount from before - // these mounts were stored outside the plugin rootfs - if _, err := os.Stat(propRoot); os.IsNotExist(err) { - if _, err := os.Stat(p.PropagatedMount); err == nil { - // make sure nothing is mounted here - // don't care about errors - mount.Unmount(p.PropagatedMount) - if err := os.Rename(p.PropagatedMount, propRoot); err != nil { - logrus.WithError(err).WithField("dir", propRoot).Error("error migrating propagated mount storage") - } - if err := os.MkdirAll(p.PropagatedMount, 0755); err != nil { - logrus.WithError(err).WithField("dir", p.PropagatedMount).Error("error migrating propagated mount storage") - } - } - } - - if err := os.MkdirAll(propRoot, 0755); err != nil { - logrus.Errorf("failed to create PropagatedMount directory at %s: %v", propRoot, err) - } - // TODO: sanitize PropagatedMount and prevent breakout - p.PropagatedMount = filepath.Join(p.Rootfs, p.PluginObj.Config.PropagatedMount) - if err := os.MkdirAll(p.PropagatedMount, 0755); err != nil { - logrus.Errorf("failed to create PropagatedMount directory at %s: %v", p.PropagatedMount, err) - return - } - } - } - } - - pm.save(p) - requiresManualRestore := !pm.config.LiveRestoreEnabled && p.IsEnabled() - - if requiresManualRestore { - // if liveRestore is not enabled, the plugin will be stopped now so we should enable it - if err := pm.enable(p, c, true); err != nil { - logrus.Errorf("failed to enable plugin '%s': %s", p.Name(), err) - } - } - }(p) - } - wg.Wait() - return nil -} - -func (pm *Manager) loadPlugin(id string) (*v2.Plugin, error) { - p := filepath.Join(pm.config.Root, id, configFileName) - dt, err := ioutil.ReadFile(p) - if err != nil { - return nil, errors.Wrapf(err, "error reading %v", p) - } - var plugin v2.Plugin - if err := json.Unmarshal(dt, &plugin); err != nil { - return nil, errors.Wrapf(err, "error decoding %v", p) - } - return &plugin, nil -} - -func (pm *Manager) save(p *v2.Plugin) error { - pluginJSON, err := json.Marshal(p) - if err != nil { - return errors.Wrap(err, "failed to marshal plugin json") - } - if err := ioutils.AtomicWriteFile(filepath.Join(pm.config.Root, p.GetID(), configFileName), pluginJSON, 0600); err != nil { - return errors.Wrap(err, "failed to write atomically plugin json") - } - return nil -} - -// GC cleans up unrefrenced blobs. This is recommended to run in a goroutine -func (pm *Manager) GC() { - pm.muGC.Lock() - defer pm.muGC.Unlock() - - whitelist := make(map[digest.Digest]struct{}) - for _, p := range pm.config.Store.GetAll() { - whitelist[p.Config] = struct{}{} - for _, b := range p.Blobsums { - whitelist[b] = struct{}{} - } - } - - pm.blobStore.gc(whitelist) -} - -type logHook struct{ id string } - -func (logHook) Levels() []logrus.Level { - return logrus.AllLevels -} - -func (l logHook) Fire(entry *logrus.Entry) error { - entry.Data = logrus.Fields{"plugin": l.id} - return nil -} - -func attachToLog(id string) func(libcontainerd.IOPipe) error { - return func(iop libcontainerd.IOPipe) error { - iop.Stdin.Close() - - logger := logrus.New() - logger.Hooks.Add(logHook{id}) - // TODO: cache writer per id - w := logger.Writer() - go func() { - io.Copy(w, iop.Stdout) - }() - go func() { - // TODO: update logrus and use logger.WriterLevel - io.Copy(w, iop.Stderr) - }() - return nil - } -} - -func validatePrivileges(requiredPrivileges, privileges types.PluginPrivileges) error { - // todo: make a better function that doesn't check order - if !reflect.DeepEqual(privileges, requiredPrivileges) { - return errors.New("incorrect privileges") - } - return nil -} - -func configToRootFS(c []byte) (*image.RootFS, error) { - var pluginConfig types.PluginConfig - if err := json.Unmarshal(c, &pluginConfig); err != nil { - return nil, err - } - // validation for empty rootfs is in distribution code - if pluginConfig.Rootfs == nil { - return nil, nil - } - - return rootFSFromPlugin(pluginConfig.Rootfs), nil -} - -func rootFSFromPlugin(pluginfs *types.PluginConfigRootfs) *image.RootFS { - rootFS := image.RootFS{ - Type: pluginfs.Type, - DiffIDs: make([]layer.DiffID, len(pluginfs.DiffIds)), - } - for i := range pluginfs.DiffIds { - rootFS.DiffIDs[i] = layer.DiffID(pluginfs.DiffIds[i]) - } - - return &rootFS -} diff --git a/vendor/github.com/docker/docker/plugin/manager_linux.go b/vendor/github.com/docker/docker/plugin/manager_linux.go deleted file mode 100644 index ad6661662..000000000 --- a/vendor/github.com/docker/docker/plugin/manager_linux.go +++ /dev/null @@ -1,284 +0,0 @@ -// +build linux - -package plugin - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "syscall" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" - "github.com/docker/docker/api/types" - "github.com/docker/docker/daemon/initlayer" - "github.com/docker/docker/libcontainerd" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/plugins" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/plugin/v2" - specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" -) - -func (pm *Manager) enable(p *v2.Plugin, c *controller, force bool) error { - p.Rootfs = filepath.Join(pm.config.Root, p.PluginObj.ID, "rootfs") - if p.IsEnabled() && !force { - return fmt.Errorf("plugin %s is already enabled", p.Name()) - } - spec, err := p.InitSpec(pm.config.ExecRoot) - if err != nil { - return err - } - - c.restart = true - c.exitChan = make(chan bool) - - pm.mu.Lock() - pm.cMap[p] = c - pm.mu.Unlock() - - var propRoot string - if p.PropagatedMount != "" { - propRoot = filepath.Join(filepath.Dir(p.Rootfs), "propagated-mount") - - if err := os.MkdirAll(propRoot, 0755); err != nil { - logrus.Errorf("failed to create PropagatedMount directory at %s: %v", propRoot, err) - } - - if err := mount.MakeRShared(propRoot); err != nil { - return errors.Wrap(err, "error setting up propagated mount dir") - } - - if err := mount.Mount(propRoot, p.PropagatedMount, "none", "rbind"); err != nil { - return errors.Wrap(err, "error creating mount for propagated mount") - } - } - - if err := initlayer.Setup(filepath.Join(pm.config.Root, p.PluginObj.ID, rootFSFileName), 0, 0); err != nil { - return errors.WithStack(err) - } - - if err := pm.containerdClient.Create(p.GetID(), "", "", specs.Spec(*spec), attachToLog(p.GetID())); err != nil { - if p.PropagatedMount != "" { - if err := mount.Unmount(p.PropagatedMount); err != nil { - logrus.Warnf("Could not unmount %s: %v", p.PropagatedMount, err) - } - if err := mount.Unmount(propRoot); err != nil { - logrus.Warnf("Could not unmount %s: %v", propRoot, err) - } - } - return errors.WithStack(err) - } - - return pm.pluginPostStart(p, c) -} - -func (pm *Manager) pluginPostStart(p *v2.Plugin, c *controller) error { - client, err := plugins.NewClientWithTimeout("unix://"+filepath.Join(pm.config.ExecRoot, p.GetID(), p.GetSocket()), nil, c.timeoutInSecs) - if err != nil { - c.restart = false - shutdownPlugin(p, c, pm.containerdClient) - return errors.WithStack(err) - } - - p.SetPClient(client) - pm.config.Store.SetState(p, true) - pm.config.Store.CallHandler(p) - - return pm.save(p) -} - -func (pm *Manager) restore(p *v2.Plugin) error { - if err := pm.containerdClient.Restore(p.GetID(), attachToLog(p.GetID())); err != nil { - return err - } - - if pm.config.LiveRestoreEnabled { - c := &controller{} - if pids, _ := pm.containerdClient.GetPidsForContainer(p.GetID()); len(pids) == 0 { - // plugin is not running, so follow normal startup procedure - return pm.enable(p, c, true) - } - - c.exitChan = make(chan bool) - c.restart = true - pm.mu.Lock() - pm.cMap[p] = c - pm.mu.Unlock() - return pm.pluginPostStart(p, c) - } - - return nil -} - -func shutdownPlugin(p *v2.Plugin, c *controller, containerdClient libcontainerd.Client) { - pluginID := p.GetID() - - err := containerdClient.Signal(pluginID, int(syscall.SIGTERM)) - if err != nil { - logrus.Errorf("Sending SIGTERM to plugin failed with error: %v", err) - } else { - select { - case <-c.exitChan: - logrus.Debug("Clean shutdown of plugin") - case <-time.After(time.Second * 10): - logrus.Debug("Force shutdown plugin") - if err := containerdClient.Signal(pluginID, int(syscall.SIGKILL)); err != nil { - logrus.Errorf("Sending SIGKILL to plugin failed with error: %v", err) - } - } - } -} - -func (pm *Manager) disable(p *v2.Plugin, c *controller) error { - if !p.IsEnabled() { - return fmt.Errorf("plugin %s is already disabled", p.Name()) - } - - c.restart = false - shutdownPlugin(p, c, pm.containerdClient) - pm.config.Store.SetState(p, false) - return pm.save(p) -} - -// Shutdown stops all plugins and called during daemon shutdown. -func (pm *Manager) Shutdown() { - plugins := pm.config.Store.GetAll() - for _, p := range plugins { - pm.mu.RLock() - c := pm.cMap[p] - pm.mu.RUnlock() - - if pm.config.LiveRestoreEnabled && p.IsEnabled() { - logrus.Debug("Plugin active when liveRestore is set, skipping shutdown") - continue - } - if pm.containerdClient != nil && p.IsEnabled() { - c.restart = false - shutdownPlugin(p, c, pm.containerdClient) - } - } -} - -func (pm *Manager) upgradePlugin(p *v2.Plugin, configDigest digest.Digest, blobsums []digest.Digest, tmpRootFSDir string, privileges *types.PluginPrivileges) (err error) { - config, err := pm.setupNewPlugin(configDigest, blobsums, privileges) - if err != nil { - return err - } - - pdir := filepath.Join(pm.config.Root, p.PluginObj.ID) - orig := filepath.Join(pdir, "rootfs") - backup := orig + "-old" - if err := os.Rename(orig, backup); err != nil { - return err - } - - defer func() { - if err != nil { - if rmErr := os.RemoveAll(orig); rmErr != nil && !os.IsNotExist(rmErr) { - logrus.WithError(rmErr).WithField("dir", backup).Error("error cleaning up after failed upgrade") - return - } - - if err := os.Rename(backup, orig); err != nil { - err = errors.Wrap(err, "error restoring old plugin root on upgrade failure") - } - if rmErr := os.RemoveAll(tmpRootFSDir); rmErr != nil && !os.IsNotExist(rmErr) { - logrus.WithError(rmErr).WithField("plugin", p.Name()).Errorf("error cleaning up plugin upgrade dir: %s", tmpRootFSDir) - } - } else { - if rmErr := os.RemoveAll(backup); rmErr != nil && !os.IsNotExist(rmErr) { - logrus.WithError(rmErr).WithField("dir", backup).Error("error cleaning up old plugin root after successful upgrade") - } - - p.Config = configDigest - p.Blobsums = blobsums - } - }() - - if err := os.Rename(tmpRootFSDir, orig); err != nil { - return errors.Wrap(err, "error upgrading") - } - - p.PluginObj.Config = config - err = pm.save(p) - return errors.Wrap(err, "error saving upgraded plugin config") -} - -func (pm *Manager) setupNewPlugin(configDigest digest.Digest, blobsums []digest.Digest, privileges *types.PluginPrivileges) (types.PluginConfig, error) { - configRC, err := pm.blobStore.Get(configDigest) - if err != nil { - return types.PluginConfig{}, err - } - defer configRC.Close() - - var config types.PluginConfig - dec := json.NewDecoder(configRC) - if err := dec.Decode(&config); err != nil { - return types.PluginConfig{}, errors.Wrapf(err, "failed to parse config") - } - if dec.More() { - return types.PluginConfig{}, errors.New("invalid config json") - } - - requiredPrivileges, err := computePrivileges(config) - if err != nil { - return types.PluginConfig{}, err - } - if privileges != nil { - if err := validatePrivileges(requiredPrivileges, *privileges); err != nil { - return types.PluginConfig{}, err - } - } - - return config, nil -} - -// createPlugin creates a new plugin. take lock before calling. -func (pm *Manager) createPlugin(name string, configDigest digest.Digest, blobsums []digest.Digest, rootFSDir string, privileges *types.PluginPrivileges) (p *v2.Plugin, err error) { - if err := pm.config.Store.validateName(name); err != nil { // todo: this check is wrong. remove store - return nil, err - } - - config, err := pm.setupNewPlugin(configDigest, blobsums, privileges) - if err != nil { - return nil, err - } - - p = &v2.Plugin{ - PluginObj: types.Plugin{ - Name: name, - ID: stringid.GenerateRandomID(), - Config: config, - }, - Config: configDigest, - Blobsums: blobsums, - } - p.InitEmptySettings() - - pdir := filepath.Join(pm.config.Root, p.PluginObj.ID) - if err := os.MkdirAll(pdir, 0700); err != nil { - return nil, errors.Wrapf(err, "failed to mkdir %v", pdir) - } - - defer func() { - if err != nil { - os.RemoveAll(pdir) - } - }() - - if err := os.Rename(rootFSDir, filepath.Join(pdir, rootFSFileName)); err != nil { - return nil, errors.Wrap(err, "failed to rename rootfs") - } - - if err := pm.save(p); err != nil { - return nil, err - } - - pm.config.Store.Add(p) // todo: remove - - return p, nil -} diff --git a/vendor/github.com/docker/docker/plugin/manager_solaris.go b/vendor/github.com/docker/docker/plugin/manager_solaris.go deleted file mode 100644 index 72ccae72d..000000000 --- a/vendor/github.com/docker/docker/plugin/manager_solaris.go +++ /dev/null @@ -1,28 +0,0 @@ -package plugin - -import ( - "fmt" - - "github.com/docker/docker/plugin/v2" - specs "github.com/opencontainers/runtime-spec/specs-go" -) - -func (pm *Manager) enable(p *v2.Plugin, c *controller, force bool) error { - return fmt.Errorf("Not implemented") -} - -func (pm *Manager) initSpec(p *v2.Plugin) (*specs.Spec, error) { - return nil, fmt.Errorf("Not implemented") -} - -func (pm *Manager) disable(p *v2.Plugin, c *controller) error { - return fmt.Errorf("Not implemented") -} - -func (pm *Manager) restore(p *v2.Plugin) error { - return fmt.Errorf("Not implemented") -} - -// Shutdown plugins -func (pm *Manager) Shutdown() { -} diff --git a/vendor/github.com/docker/docker/plugin/manager_windows.go b/vendor/github.com/docker/docker/plugin/manager_windows.go deleted file mode 100644 index 4469a671f..000000000 --- a/vendor/github.com/docker/docker/plugin/manager_windows.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build windows - -package plugin - -import ( - "fmt" - - "github.com/docker/docker/plugin/v2" - specs "github.com/opencontainers/runtime-spec/specs-go" -) - -func (pm *Manager) enable(p *v2.Plugin, c *controller, force bool) error { - return fmt.Errorf("Not implemented") -} - -func (pm *Manager) initSpec(p *v2.Plugin) (*specs.Spec, error) { - return nil, fmt.Errorf("Not implemented") -} - -func (pm *Manager) disable(p *v2.Plugin, c *controller) error { - return fmt.Errorf("Not implemented") -} - -func (pm *Manager) restore(p *v2.Plugin) error { - return fmt.Errorf("Not implemented") -} - -// Shutdown plugins -func (pm *Manager) Shutdown() { -} diff --git a/vendor/github.com/docker/docker/plugin/store.go b/vendor/github.com/docker/docker/plugin/store.go deleted file mode 100644 index b7a96a950..000000000 --- a/vendor/github.com/docker/docker/plugin/store.go +++ /dev/null @@ -1,263 +0,0 @@ -package plugin - -import ( - "fmt" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/plugingetter" - "github.com/docker/docker/pkg/plugins" - "github.com/docker/docker/plugin/v2" - "github.com/docker/docker/reference" - "github.com/pkg/errors" -) - -/* allowV1PluginsFallback determines daemon's support for V1 plugins. - * When the time comes to remove support for V1 plugins, flipping - * this bool is all that will be needed. - */ -const allowV1PluginsFallback bool = true - -/* defaultAPIVersion is the version of the plugin API for volume, network, - IPAM and authz. This is a very stable API. When we update this API, then - pluginType should include a version. eg "networkdriver/2.0". -*/ -const defaultAPIVersion string = "1.0" - -// ErrNotFound indicates that a plugin was not found locally. -type ErrNotFound string - -func (name ErrNotFound) Error() string { return fmt.Sprintf("plugin %q not found", string(name)) } - -// ErrAmbiguous indicates that a plugin was not found locally. -type ErrAmbiguous string - -func (name ErrAmbiguous) Error() string { - return fmt.Sprintf("multiple plugins found for %q", string(name)) -} - -// GetV2Plugin retreives a plugin by name, id or partial ID. -func (ps *Store) GetV2Plugin(refOrID string) (*v2.Plugin, error) { - ps.RLock() - defer ps.RUnlock() - - id, err := ps.resolvePluginID(refOrID) - if err != nil { - return nil, err - } - - p, idOk := ps.plugins[id] - if !idOk { - return nil, errors.WithStack(ErrNotFound(id)) - } - - return p, nil -} - -// validateName returns error if name is already reserved. always call with lock and full name -func (ps *Store) validateName(name string) error { - for _, p := range ps.plugins { - if p.Name() == name { - return errors.Errorf("plugin %q already exists", name) - } - } - return nil -} - -// GetAll retreives all plugins. -func (ps *Store) GetAll() map[string]*v2.Plugin { - ps.RLock() - defer ps.RUnlock() - return ps.plugins -} - -// SetAll initialized plugins during daemon restore. -func (ps *Store) SetAll(plugins map[string]*v2.Plugin) { - ps.Lock() - defer ps.Unlock() - ps.plugins = plugins -} - -func (ps *Store) getAllByCap(capability string) []plugingetter.CompatPlugin { - ps.RLock() - defer ps.RUnlock() - - result := make([]plugingetter.CompatPlugin, 0, 1) - for _, p := range ps.plugins { - if p.IsEnabled() { - if _, err := p.FilterByCap(capability); err == nil { - result = append(result, p) - } - } - } - return result -} - -// SetState sets the active state of the plugin and updates plugindb. -func (ps *Store) SetState(p *v2.Plugin, state bool) { - ps.Lock() - defer ps.Unlock() - - p.PluginObj.Enabled = state -} - -// Add adds a plugin to memory and plugindb. -// An error will be returned if there is a collision. -func (ps *Store) Add(p *v2.Plugin) error { - ps.Lock() - defer ps.Unlock() - - if v, exist := ps.plugins[p.GetID()]; exist { - return fmt.Errorf("plugin %q has the same ID %s as %q", p.Name(), p.GetID(), v.Name()) - } - ps.plugins[p.GetID()] = p - return nil -} - -// Remove removes a plugin from memory and plugindb. -func (ps *Store) Remove(p *v2.Plugin) { - ps.Lock() - delete(ps.plugins, p.GetID()) - ps.Unlock() -} - -// Get returns an enabled plugin matching the given name and capability. -func (ps *Store) Get(name, capability string, mode int) (plugingetter.CompatPlugin, error) { - var ( - p *v2.Plugin - err error - ) - - // Lookup using new model. - if ps != nil { - p, err = ps.GetV2Plugin(name) - if err == nil { - p.AddRefCount(mode) - if p.IsEnabled() { - return p.FilterByCap(capability) - } - // Plugin was found but it is disabled, so we should not fall back to legacy plugins - // but we should error out right away - return nil, ErrNotFound(name) - } - if _, ok := errors.Cause(err).(ErrNotFound); !ok { - return nil, err - } - } - - // Lookup using legacy model. - if allowV1PluginsFallback { - p, err := plugins.Get(name, capability) - if err != nil { - return nil, fmt.Errorf("legacy plugin: %v", err) - } - return p, nil - } - - return nil, err -} - -// GetAllManagedPluginsByCap returns a list of managed plugins matching the given capability. -func (ps *Store) GetAllManagedPluginsByCap(capability string) []plugingetter.CompatPlugin { - return ps.getAllByCap(capability) -} - -// GetAllByCap returns a list of enabled plugins matching the given capability. -func (ps *Store) GetAllByCap(capability string) ([]plugingetter.CompatPlugin, error) { - result := make([]plugingetter.CompatPlugin, 0, 1) - - /* Daemon start always calls plugin.Init thereby initializing a store. - * So store on experimental builds can never be nil, even while - * handling legacy plugins. However, there are legacy plugin unit - * tests where the volume subsystem directly talks with the plugin, - * bypassing the daemon. For such tests, this check is necessary. - */ - if ps != nil { - ps.RLock() - result = ps.getAllByCap(capability) - ps.RUnlock() - } - - // Lookup with legacy model - if allowV1PluginsFallback { - pl, err := plugins.GetAll(capability) - if err != nil { - return nil, fmt.Errorf("legacy plugin: %v", err) - } - for _, p := range pl { - result = append(result, p) - } - } - return result, nil -} - -// Handle sets a callback for a given capability. It is only used by network -// and ipam drivers during plugin registration. The callback registers the -// driver with the subsystem (network, ipam). -func (ps *Store) Handle(capability string, callback func(string, *plugins.Client)) { - pluginType := fmt.Sprintf("docker.%s/%s", strings.ToLower(capability), defaultAPIVersion) - - // Register callback with new plugin model. - ps.Lock() - handlers, ok := ps.handlers[pluginType] - if !ok { - handlers = []func(string, *plugins.Client){} - } - handlers = append(handlers, callback) - ps.handlers[pluginType] = handlers - ps.Unlock() - - // Register callback with legacy plugin model. - if allowV1PluginsFallback { - plugins.Handle(capability, callback) - } -} - -// CallHandler calls the registered callback. It is invoked during plugin enable. -func (ps *Store) CallHandler(p *v2.Plugin) { - for _, typ := range p.GetTypes() { - for _, handler := range ps.handlers[typ.String()] { - handler(p.Name(), p.Client()) - } - } -} - -func (ps *Store) resolvePluginID(idOrName string) (string, error) { - ps.RLock() // todo: fix - defer ps.RUnlock() - - if validFullID.MatchString(idOrName) { - return idOrName, nil - } - - ref, err := reference.ParseNamed(idOrName) - if err != nil { - return "", errors.WithStack(ErrNotFound(idOrName)) - } - if _, ok := ref.(reference.Canonical); ok { - logrus.Warnf("canonical references cannot be resolved: %v", ref.String()) - return "", errors.WithStack(ErrNotFound(idOrName)) - } - - fullRef := reference.WithDefaultTag(ref) - - for _, p := range ps.plugins { - if p.PluginObj.Name == fullRef.String() { - return p.PluginObj.ID, nil - } - } - - var found *v2.Plugin - for id, p := range ps.plugins { // this can be optimized - if strings.HasPrefix(id, idOrName) { - if found != nil { - return "", errors.WithStack(ErrAmbiguous(idOrName)) - } - found = p - } - } - if found == nil { - return "", errors.WithStack(ErrNotFound(idOrName)) - } - return found.PluginObj.ID, nil -} diff --git a/vendor/github.com/docker/docker/plugin/store_test.go b/vendor/github.com/docker/docker/plugin/store_test.go deleted file mode 100644 index 6b1f6a941..000000000 --- a/vendor/github.com/docker/docker/plugin/store_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package plugin - -import ( - "testing" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/plugin/v2" -) - -func TestFilterByCapNeg(t *testing.T) { - p := v2.Plugin{PluginObj: types.Plugin{Name: "test:latest"}} - iType := types.PluginInterfaceType{"volumedriver", "docker", "1.0"} - i := types.PluginConfigInterface{"plugins.sock", []types.PluginInterfaceType{iType}} - p.PluginObj.Config.Interface = i - - _, err := p.FilterByCap("foobar") - if err == nil { - t.Fatalf("expected inadequate error, got %v", err) - } -} - -func TestFilterByCapPos(t *testing.T) { - p := v2.Plugin{PluginObj: types.Plugin{Name: "test:latest"}} - - iType := types.PluginInterfaceType{"volumedriver", "docker", "1.0"} - i := types.PluginConfigInterface{"plugins.sock", []types.PluginInterfaceType{iType}} - p.PluginObj.Config.Interface = i - - _, err := p.FilterByCap("volumedriver") - if err != nil { - t.Fatalf("expected no error, got %v", err) - } -} diff --git a/vendor/github.com/docker/docker/plugin/v2/plugin.go b/vendor/github.com/docker/docker/plugin/v2/plugin.go deleted file mode 100644 index 93b489a14..000000000 --- a/vendor/github.com/docker/docker/plugin/v2/plugin.go +++ /dev/null @@ -1,244 +0,0 @@ -package v2 - -import ( - "fmt" - "strings" - "sync" - - "github.com/docker/distribution/digest" - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/plugingetter" - "github.com/docker/docker/pkg/plugins" -) - -// Plugin represents an individual plugin. -type Plugin struct { - mu sync.RWMutex - PluginObj types.Plugin `json:"plugin"` // todo: embed struct - pClient *plugins.Client - refCount int - PropagatedMount string // TODO: make private - Rootfs string // TODO: make private - - Config digest.Digest - Blobsums []digest.Digest -} - -const defaultPluginRuntimeDestination = "/run/docker/plugins" - -// ErrInadequateCapability indicates that the plugin did not have the requested capability. -type ErrInadequateCapability struct { - cap string -} - -func (e ErrInadequateCapability) Error() string { - return fmt.Sprintf("plugin does not provide %q capability", e.cap) -} - -// BasePath returns the path to which all paths returned by the plugin are relative to. -// For Plugin objects this returns the host path of the plugin container's rootfs. -func (p *Plugin) BasePath() string { - return p.Rootfs -} - -// Client returns the plugin client. -func (p *Plugin) Client() *plugins.Client { - p.mu.RLock() - defer p.mu.RUnlock() - - return p.pClient -} - -// SetPClient set the plugin client. -func (p *Plugin) SetPClient(client *plugins.Client) { - p.mu.Lock() - defer p.mu.Unlock() - - p.pClient = client -} - -// IsV1 returns true for V1 plugins and false otherwise. -func (p *Plugin) IsV1() bool { - return false -} - -// Name returns the plugin name. -func (p *Plugin) Name() string { - return p.PluginObj.Name -} - -// FilterByCap query the plugin for a given capability. -func (p *Plugin) FilterByCap(capability string) (*Plugin, error) { - capability = strings.ToLower(capability) - for _, typ := range p.PluginObj.Config.Interface.Types { - if typ.Capability == capability && typ.Prefix == "docker" { - return p, nil - } - } - return nil, ErrInadequateCapability{capability} -} - -// InitEmptySettings initializes empty settings for a plugin. -func (p *Plugin) InitEmptySettings() { - p.PluginObj.Settings.Mounts = make([]types.PluginMount, len(p.PluginObj.Config.Mounts)) - copy(p.PluginObj.Settings.Mounts, p.PluginObj.Config.Mounts) - p.PluginObj.Settings.Devices = make([]types.PluginDevice, len(p.PluginObj.Config.Linux.Devices)) - copy(p.PluginObj.Settings.Devices, p.PluginObj.Config.Linux.Devices) - p.PluginObj.Settings.Env = make([]string, 0, len(p.PluginObj.Config.Env)) - for _, env := range p.PluginObj.Config.Env { - if env.Value != nil { - p.PluginObj.Settings.Env = append(p.PluginObj.Settings.Env, fmt.Sprintf("%s=%s", env.Name, *env.Value)) - } - } - p.PluginObj.Settings.Args = make([]string, len(p.PluginObj.Config.Args.Value)) - copy(p.PluginObj.Settings.Args, p.PluginObj.Config.Args.Value) -} - -// Set is used to pass arguments to the plugin. -func (p *Plugin) Set(args []string) error { - p.mu.Lock() - defer p.mu.Unlock() - - if p.PluginObj.Enabled { - return fmt.Errorf("cannot set on an active plugin, disable plugin before setting") - } - - sets, err := newSettables(args) - if err != nil { - return err - } - - // TODO(vieux): lots of code duplication here, needs to be refactored. - -next: - for _, s := range sets { - // range over all the envs in the config - for _, env := range p.PluginObj.Config.Env { - // found the env in the config - if env.Name == s.name { - // is it settable ? - if ok, err := s.isSettable(allowedSettableFieldsEnv, env.Settable); err != nil { - return err - } else if !ok { - return fmt.Errorf("%q is not settable", s.prettyName()) - } - // is it, so lets update the settings in memory - updateSettingsEnv(&p.PluginObj.Settings.Env, &s) - continue next - } - } - - // range over all the mounts in the config - for _, mount := range p.PluginObj.Config.Mounts { - // found the mount in the config - if mount.Name == s.name { - // is it settable ? - if ok, err := s.isSettable(allowedSettableFieldsMounts, mount.Settable); err != nil { - return err - } else if !ok { - return fmt.Errorf("%q is not settable", s.prettyName()) - } - - // it is, so lets update the settings in memory - *mount.Source = s.value - continue next - } - } - - // range over all the devices in the config - for _, device := range p.PluginObj.Config.Linux.Devices { - // found the device in the config - if device.Name == s.name { - // is it settable ? - if ok, err := s.isSettable(allowedSettableFieldsDevices, device.Settable); err != nil { - return err - } else if !ok { - return fmt.Errorf("%q is not settable", s.prettyName()) - } - - // it is, so lets update the settings in memory - *device.Path = s.value - continue next - } - } - - // found the name in the config - if p.PluginObj.Config.Args.Name == s.name { - // is it settable ? - if ok, err := s.isSettable(allowedSettableFieldsArgs, p.PluginObj.Config.Args.Settable); err != nil { - return err - } else if !ok { - return fmt.Errorf("%q is not settable", s.prettyName()) - } - - // it is, so lets update the settings in memory - p.PluginObj.Settings.Args = strings.Split(s.value, " ") - continue next - } - - return fmt.Errorf("setting %q not found in the plugin configuration", s.name) - } - - return nil -} - -// IsEnabled returns the active state of the plugin. -func (p *Plugin) IsEnabled() bool { - p.mu.RLock() - defer p.mu.RUnlock() - - return p.PluginObj.Enabled -} - -// GetID returns the plugin's ID. -func (p *Plugin) GetID() string { - p.mu.RLock() - defer p.mu.RUnlock() - - return p.PluginObj.ID -} - -// GetSocket returns the plugin socket. -func (p *Plugin) GetSocket() string { - p.mu.RLock() - defer p.mu.RUnlock() - - return p.PluginObj.Config.Interface.Socket -} - -// GetTypes returns the interface types of a plugin. -func (p *Plugin) GetTypes() []types.PluginInterfaceType { - p.mu.RLock() - defer p.mu.RUnlock() - - return p.PluginObj.Config.Interface.Types -} - -// GetRefCount returns the reference count. -func (p *Plugin) GetRefCount() int { - p.mu.RLock() - defer p.mu.RUnlock() - - return p.refCount -} - -// AddRefCount adds to reference count. -func (p *Plugin) AddRefCount(count int) { - p.mu.Lock() - defer p.mu.Unlock() - - p.refCount += count -} - -// Acquire increments the plugin's reference count -// This should be followed up by `Release()` when the plugin is no longer in use. -func (p *Plugin) Acquire() { - p.AddRefCount(plugingetter.ACQUIRE) -} - -// Release decrements the plugin's reference count -// This should only be called when the plugin is no longer in use, e.g. with -// via `Acquire()` or getter.Get("name", "type", plugingetter.ACQUIRE) -func (p *Plugin) Release() { - p.AddRefCount(plugingetter.RELEASE) -} diff --git a/vendor/github.com/docker/docker/plugin/v2/plugin_linux.go b/vendor/github.com/docker/docker/plugin/v2/plugin_linux.go deleted file mode 100644 index e980e7f29..000000000 --- a/vendor/github.com/docker/docker/plugin/v2/plugin_linux.go +++ /dev/null @@ -1,121 +0,0 @@ -// +build linux - -package v2 - -import ( - "os" - "path/filepath" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/oci" - "github.com/docker/docker/pkg/system" - specs "github.com/opencontainers/runtime-spec/specs-go" - "github.com/pkg/errors" -) - -// InitSpec creates an OCI spec from the plugin's config. -func (p *Plugin) InitSpec(execRoot string) (*specs.Spec, error) { - s := oci.DefaultSpec() - s.Root = specs.Root{ - Path: p.Rootfs, - Readonly: false, // TODO: all plugins should be readonly? settable in config? - } - - userMounts := make(map[string]struct{}, len(p.PluginObj.Settings.Mounts)) - for _, m := range p.PluginObj.Settings.Mounts { - userMounts[m.Destination] = struct{}{} - } - - execRoot = filepath.Join(execRoot, p.PluginObj.ID) - if err := os.MkdirAll(execRoot, 0700); err != nil { - return nil, errors.WithStack(err) - } - - mounts := append(p.PluginObj.Config.Mounts, types.PluginMount{ - Source: &execRoot, - Destination: defaultPluginRuntimeDestination, - Type: "bind", - Options: []string{"rbind", "rshared"}, - }) - - if p.PluginObj.Config.Network.Type != "" { - // TODO: if net == bridge, use libnetwork controller to create a new plugin-specific bridge, bind mount /etc/hosts and /etc/resolv.conf look at the docker code (allocateNetwork, initialize) - if p.PluginObj.Config.Network.Type == "host" { - oci.RemoveNamespace(&s, specs.NamespaceType("network")) - } - etcHosts := "/etc/hosts" - resolvConf := "/etc/resolv.conf" - mounts = append(mounts, - types.PluginMount{ - Source: &etcHosts, - Destination: etcHosts, - Type: "bind", - Options: []string{"rbind", "ro"}, - }, - types.PluginMount{ - Source: &resolvConf, - Destination: resolvConf, - Type: "bind", - Options: []string{"rbind", "ro"}, - }) - } - - for _, mnt := range mounts { - m := specs.Mount{ - Destination: mnt.Destination, - Type: mnt.Type, - Options: mnt.Options, - } - if mnt.Source == nil { - return nil, errors.New("mount source is not specified") - } - m.Source = *mnt.Source - s.Mounts = append(s.Mounts, m) - } - - for i, m := range s.Mounts { - if strings.HasPrefix(m.Destination, "/dev/") { - if _, ok := userMounts[m.Destination]; ok { - s.Mounts = append(s.Mounts[:i], s.Mounts[i+1:]...) - } - } - } - - if p.PluginObj.Config.PropagatedMount != "" { - p.PropagatedMount = filepath.Join(p.Rootfs, p.PluginObj.Config.PropagatedMount) - s.Linux.RootfsPropagation = "rshared" - } - - if p.PluginObj.Config.Linux.AllowAllDevices { - rwm := "rwm" - s.Linux.Resources.Devices = []specs.DeviceCgroup{{Allow: true, Access: &rwm}} - } - for _, dev := range p.PluginObj.Settings.Devices { - path := *dev.Path - d, dPermissions, err := oci.DevicesFromPath(path, path, "rwm") - if err != nil { - return nil, errors.WithStack(err) - } - s.Linux.Devices = append(s.Linux.Devices, d...) - s.Linux.Resources.Devices = append(s.Linux.Resources.Devices, dPermissions...) - } - - envs := make([]string, 1, len(p.PluginObj.Settings.Env)+1) - envs[0] = "PATH=" + system.DefaultPathEnv - envs = append(envs, p.PluginObj.Settings.Env...) - - args := append(p.PluginObj.Config.Entrypoint, p.PluginObj.Settings.Args...) - cwd := p.PluginObj.Config.WorkDir - if len(cwd) == 0 { - cwd = "/" - } - s.Process.Terminal = false - s.Process.Args = args - s.Process.Cwd = cwd - s.Process.Env = envs - - s.Process.Capabilities = append(s.Process.Capabilities, p.PluginObj.Config.Linux.Capabilities...) - - return &s, nil -} diff --git a/vendor/github.com/docker/docker/plugin/v2/plugin_unsupported.go b/vendor/github.com/docker/docker/plugin/v2/plugin_unsupported.go deleted file mode 100644 index e60fb8311..000000000 --- a/vendor/github.com/docker/docker/plugin/v2/plugin_unsupported.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !linux - -package v2 - -import ( - "errors" - - specs "github.com/opencontainers/runtime-spec/specs-go" -) - -// InitSpec creates an OCI spec from the plugin's config. -func (p *Plugin) InitSpec(execRoot string) (*specs.Spec, error) { - return nil, errors.New("not supported") -} diff --git a/vendor/github.com/docker/docker/plugin/v2/settable.go b/vendor/github.com/docker/docker/plugin/v2/settable.go deleted file mode 100644 index 79c6befc2..000000000 --- a/vendor/github.com/docker/docker/plugin/v2/settable.go +++ /dev/null @@ -1,102 +0,0 @@ -package v2 - -import ( - "errors" - "fmt" - "strings" -) - -type settable struct { - name string - field string - value string -} - -var ( - allowedSettableFieldsEnv = []string{"value"} - allowedSettableFieldsArgs = []string{"value"} - allowedSettableFieldsDevices = []string{"path"} - allowedSettableFieldsMounts = []string{"source"} - - errMultipleFields = errors.New("multiple fields are settable, one must be specified") - errInvalidFormat = errors.New("invalid format, must be [.][=]") -) - -func newSettables(args []string) ([]settable, error) { - sets := make([]settable, 0, len(args)) - for _, arg := range args { - set, err := newSettable(arg) - if err != nil { - return nil, err - } - sets = append(sets, set) - } - return sets, nil -} - -func newSettable(arg string) (settable, error) { - var set settable - if i := strings.Index(arg, "="); i == 0 { - return set, errInvalidFormat - } else if i < 0 { - set.name = arg - } else { - set.name = arg[:i] - set.value = arg[i+1:] - } - - if i := strings.LastIndex(set.name, "."); i > 0 { - set.field = set.name[i+1:] - set.name = arg[:i] - } - - return set, nil -} - -// prettyName return name.field if there is a field, otherwise name. -func (set *settable) prettyName() string { - if set.field != "" { - return fmt.Sprintf("%s.%s", set.name, set.field) - } - return set.name -} - -func (set *settable) isSettable(allowedSettableFields []string, settable []string) (bool, error) { - if set.field == "" { - if len(settable) == 1 { - // if field is not specified and there only one settable, default to it. - set.field = settable[0] - } else if len(settable) > 1 { - return false, errMultipleFields - } - } - - isAllowed := false - for _, allowedSettableField := range allowedSettableFields { - if set.field == allowedSettableField { - isAllowed = true - break - } - } - - if isAllowed { - for _, settableField := range settable { - if set.field == settableField { - return true, nil - } - } - } - - return false, nil -} - -func updateSettingsEnv(env *[]string, set *settable) { - for i, e := range *env { - if parts := strings.SplitN(e, "=", 2); parts[0] == set.name { - (*env)[i] = fmt.Sprintf("%s=%s", set.name, set.value) - return - } - } - - *env = append(*env, fmt.Sprintf("%s=%s", set.name, set.value)) -} diff --git a/vendor/github.com/docker/docker/plugin/v2/settable_test.go b/vendor/github.com/docker/docker/plugin/v2/settable_test.go deleted file mode 100644 index 7183f3a67..000000000 --- a/vendor/github.com/docker/docker/plugin/v2/settable_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package v2 - -import ( - "reflect" - "testing" -) - -func TestNewSettable(t *testing.T) { - contexts := []struct { - arg string - name string - field string - value string - err error - }{ - {"name=value", "name", "", "value", nil}, - {"name", "name", "", "", nil}, - {"name.field=value", "name", "field", "value", nil}, - {"name.field", "name", "field", "", nil}, - {"=value", "", "", "", errInvalidFormat}, - {"=", "", "", "", errInvalidFormat}, - } - - for _, c := range contexts { - s, err := newSettable(c.arg) - if err != c.err { - t.Fatalf("expected error to be %v, got %v", c.err, err) - } - - if s.name != c.name { - t.Fatalf("expected name to be %q, got %q", c.name, s.name) - } - - if s.field != c.field { - t.Fatalf("expected field to be %q, got %q", c.field, s.field) - } - - if s.value != c.value { - t.Fatalf("expected value to be %q, got %q", c.value, s.value) - } - - } -} - -func TestIsSettable(t *testing.T) { - contexts := []struct { - allowedSettableFields []string - set settable - settable []string - result bool - err error - }{ - {allowedSettableFieldsEnv, settable{}, []string{}, false, nil}, - {allowedSettableFieldsEnv, settable{field: "value"}, []string{}, false, nil}, - {allowedSettableFieldsEnv, settable{}, []string{"value"}, true, nil}, - {allowedSettableFieldsEnv, settable{field: "value"}, []string{"value"}, true, nil}, - {allowedSettableFieldsEnv, settable{field: "foo"}, []string{"value"}, false, nil}, - {allowedSettableFieldsEnv, settable{field: "foo"}, []string{"foo"}, false, nil}, - {allowedSettableFieldsEnv, settable{}, []string{"value1", "value2"}, false, errMultipleFields}, - } - - for _, c := range contexts { - if res, err := c.set.isSettable(c.allowedSettableFields, c.settable); res != c.result { - t.Fatalf("expected result to be %t, got %t", c.result, res) - } else if err != c.err { - t.Fatalf("expected error to be %v, got %v", c.err, err) - } - } -} - -func TestUpdateSettinsEnv(t *testing.T) { - contexts := []struct { - env []string - set settable - newEnv []string - }{ - {[]string{}, settable{name: "DEBUG", value: "1"}, []string{"DEBUG=1"}}, - {[]string{"DEBUG=0"}, settable{name: "DEBUG", value: "1"}, []string{"DEBUG=1"}}, - {[]string{"FOO=0"}, settable{name: "DEBUG", value: "1"}, []string{"FOO=0", "DEBUG=1"}}, - {[]string{"FOO=0", "DEBUG=0"}, settable{name: "DEBUG", value: "1"}, []string{"FOO=0", "DEBUG=1"}}, - {[]string{"FOO=0", "DEBUG=0", "BAR=1"}, settable{name: "DEBUG", value: "1"}, []string{"FOO=0", "DEBUG=1", "BAR=1"}}, - } - - for _, c := range contexts { - updateSettingsEnv(&c.env, &c.set) - - if !reflect.DeepEqual(c.env, c.newEnv) { - t.Fatalf("expected env to be %q, got %q", c.newEnv, c.env) - } - } -} diff --git a/vendor/github.com/docker/docker/profiles/apparmor/apparmor.go b/vendor/github.com/docker/docker/profiles/apparmor/apparmor.go deleted file mode 100644 index 5132ebe00..000000000 --- a/vendor/github.com/docker/docker/profiles/apparmor/apparmor.go +++ /dev/null @@ -1,122 +0,0 @@ -// +build linux - -package apparmor - -import ( - "bufio" - "io" - "io/ioutil" - "os" - "path" - "strings" - - "github.com/docker/docker/pkg/aaparser" - "github.com/docker/docker/utils/templates" -) - -var ( - // profileDirectory is the file store for apparmor profiles and macros. - profileDirectory = "/etc/apparmor.d" -) - -// profileData holds information about the given profile for generation. -type profileData struct { - // Name is profile name. - Name string - // Imports defines the apparmor functions to import, before defining the profile. - Imports []string - // InnerImports defines the apparmor functions to import in the profile. - InnerImports []string - // Version is the {major, minor, patch} version of apparmor_parser as a single number. - Version int -} - -// generateDefault creates an apparmor profile from ProfileData. -func (p *profileData) generateDefault(out io.Writer) error { - compiled, err := templates.NewParse("apparmor_profile", baseTemplate) - if err != nil { - return err - } - - if macroExists("tunables/global") { - p.Imports = append(p.Imports, "#include ") - } else { - p.Imports = append(p.Imports, "@{PROC}=/proc/") - } - - if macroExists("abstractions/base") { - p.InnerImports = append(p.InnerImports, "#include ") - } - - ver, err := aaparser.GetVersion() - if err != nil { - return err - } - p.Version = ver - - if err := compiled.Execute(out, p); err != nil { - return err - } - return nil -} - -// macrosExists checks if the passed macro exists. -func macroExists(m string) bool { - _, err := os.Stat(path.Join(profileDirectory, m)) - return err == nil -} - -// InstallDefault generates a default profile in a temp directory determined by -// os.TempDir(), then loads the profile into the kernel using 'apparmor_parser'. -func InstallDefault(name string) error { - p := profileData{ - Name: name, - } - - // Install to a temporary directory. - f, err := ioutil.TempFile("", name) - if err != nil { - return err - } - profilePath := f.Name() - - defer f.Close() - defer os.Remove(profilePath) - - if err := p.generateDefault(f); err != nil { - f.Close() - return err - } - - if err := aaparser.LoadProfile(profilePath); err != nil { - return err - } - - return nil -} - -// IsLoaded checks if a profile with the given name has been loaded into the -// kernel. -func IsLoaded(name string) (bool, error) { - file, err := os.Open("/sys/kernel/security/apparmor/profiles") - if err != nil { - return false, err - } - defer file.Close() - - r := bufio.NewReader(file) - for { - p, err := r.ReadString('\n') - if err == io.EOF { - break - } - if err != nil { - return false, err - } - if strings.HasPrefix(p, name+" ") { - return true, nil - } - } - - return false, nil -} diff --git a/vendor/github.com/docker/docker/profiles/apparmor/template.go b/vendor/github.com/docker/docker/profiles/apparmor/template.go deleted file mode 100644 index c5ea4584d..000000000 --- a/vendor/github.com/docker/docker/profiles/apparmor/template.go +++ /dev/null @@ -1,46 +0,0 @@ -// +build linux - -package apparmor - -// baseTemplate defines the default apparmor profile for containers. -const baseTemplate = ` -{{range $value := .Imports}} -{{$value}} -{{end}} - -profile {{.Name}} flags=(attach_disconnected,mediate_deleted) { -{{range $value := .InnerImports}} - {{$value}} -{{end}} - - network, - capability, - file, - umount, - - deny @{PROC}/* w, # deny write for all files directly in /proc (not in a subdir) - # deny write to files not in /proc//** or /proc/sys/** - deny @{PROC}/{[^1-9],[^1-9][^0-9],[^1-9s][^0-9y][^0-9s],[^1-9][^0-9][^0-9][^0-9]*}/** w, - deny @{PROC}/sys/[^k]** w, # deny /proc/sys except /proc/sys/k* (effectively /proc/sys/kernel) - deny @{PROC}/sys/kernel/{?,??,[^s][^h][^m]**} w, # deny everything except shm* in /proc/sys/kernel/ - deny @{PROC}/sysrq-trigger rwklx, - deny @{PROC}/mem rwklx, - deny @{PROC}/kmem rwklx, - deny @{PROC}/kcore rwklx, - - deny mount, - - deny /sys/[^f]*/** wklx, - deny /sys/f[^s]*/** wklx, - deny /sys/fs/[^c]*/** wklx, - deny /sys/fs/c[^g]*/** wklx, - deny /sys/fs/cg[^r]*/** wklx, - deny /sys/firmware/** rwklx, - deny /sys/kernel/security/** rwklx, - -{{if ge .Version 208095}} - # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container - ptrace (trace,read) peer={{.Name}}, -{{end}} -} -` diff --git a/vendor/github.com/docker/docker/profiles/seccomp/default.json b/vendor/github.com/docker/docker/profiles/seccomp/default.json deleted file mode 100755 index ac129d3a3..000000000 --- a/vendor/github.com/docker/docker/profiles/seccomp/default.json +++ /dev/null @@ -1,698 +0,0 @@ -{ - "defaultAction": "SCMP_ACT_ERRNO", - "archMap": [ - { - "architecture": "SCMP_ARCH_X86_64", - "subArchitectures": [ - "SCMP_ARCH_X86", - "SCMP_ARCH_X32" - ] - }, - { - "architecture": "SCMP_ARCH_AARCH64", - "subArchitectures": [ - "SCMP_ARCH_ARM" - ] - }, - { - "architecture": "SCMP_ARCH_MIPS64", - "subArchitectures": [ - "SCMP_ARCH_MIPS", - "SCMP_ARCH_MIPS64N32" - ] - }, - { - "architecture": "SCMP_ARCH_MIPS64N32", - "subArchitectures": [ - "SCMP_ARCH_MIPS", - "SCMP_ARCH_MIPS64" - ] - }, - { - "architecture": "SCMP_ARCH_MIPSEL64", - "subArchitectures": [ - "SCMP_ARCH_MIPSEL", - "SCMP_ARCH_MIPSEL64N32" - ] - }, - { - "architecture": "SCMP_ARCH_MIPSEL64N32", - "subArchitectures": [ - "SCMP_ARCH_MIPSEL", - "SCMP_ARCH_MIPSEL64" - ] - }, - { - "architecture": "SCMP_ARCH_S390X", - "subArchitectures": [ - "SCMP_ARCH_S390" - ] - } - ], - "syscalls": [ - { - "names": [ - "accept", - "accept4", - "access", - "alarm", - "alarm", - "bind", - "brk", - "capget", - "capset", - "chdir", - "chmod", - "chown", - "chown32", - "clock_getres", - "clock_gettime", - "clock_nanosleep", - "close", - "connect", - "copy_file_range", - "creat", - "dup", - "dup2", - "dup3", - "epoll_create", - "epoll_create1", - "epoll_ctl", - "epoll_ctl_old", - "epoll_pwait", - "epoll_wait", - "epoll_wait_old", - "eventfd", - "eventfd2", - "execve", - "execveat", - "exit", - "exit_group", - "faccessat", - "fadvise64", - "fadvise64_64", - "fallocate", - "fanotify_mark", - "fchdir", - "fchmod", - "fchmodat", - "fchown", - "fchown32", - "fchownat", - "fcntl", - "fcntl64", - "fdatasync", - "fgetxattr", - "flistxattr", - "flock", - "fork", - "fremovexattr", - "fsetxattr", - "fstat", - "fstat64", - "fstatat64", - "fstatfs", - "fstatfs64", - "fsync", - "ftruncate", - "ftruncate64", - "futex", - "futimesat", - "getcpu", - "getcwd", - "getdents", - "getdents64", - "getegid", - "getegid32", - "geteuid", - "geteuid32", - "getgid", - "getgid32", - "getgroups", - "getgroups32", - "getitimer", - "getpeername", - "getpgid", - "getpgrp", - "getpid", - "getppid", - "getpriority", - "getrandom", - "getresgid", - "getresgid32", - "getresuid", - "getresuid32", - "getrlimit", - "get_robust_list", - "getrusage", - "getsid", - "getsockname", - "getsockopt", - "get_thread_area", - "gettid", - "gettimeofday", - "getuid", - "getuid32", - "getxattr", - "inotify_add_watch", - "inotify_init", - "inotify_init1", - "inotify_rm_watch", - "io_cancel", - "ioctl", - "io_destroy", - "io_getevents", - "ioprio_get", - "ioprio_set", - "io_setup", - "io_submit", - "ipc", - "kill", - "lchown", - "lchown32", - "lgetxattr", - "link", - "linkat", - "listen", - "listxattr", - "llistxattr", - "_llseek", - "lremovexattr", - "lseek", - "lsetxattr", - "lstat", - "lstat64", - "madvise", - "memfd_create", - "mincore", - "mkdir", - "mkdirat", - "mknod", - "mknodat", - "mlock", - "mlock2", - "mlockall", - "mmap", - "mmap2", - "mprotect", - "mq_getsetattr", - "mq_notify", - "mq_open", - "mq_timedreceive", - "mq_timedsend", - "mq_unlink", - "mremap", - "msgctl", - "msgget", - "msgrcv", - "msgsnd", - "msync", - "munlock", - "munlockall", - "munmap", - "nanosleep", - "newfstatat", - "_newselect", - "open", - "openat", - "pause", - "pipe", - "pipe2", - "poll", - "ppoll", - "prctl", - "pread64", - "preadv", - "prlimit64", - "pselect6", - "pwrite64", - "pwritev", - "read", - "readahead", - "readlink", - "readlinkat", - "readv", - "recv", - "recvfrom", - "recvmmsg", - "recvmsg", - "remap_file_pages", - "removexattr", - "rename", - "renameat", - "renameat2", - "restart_syscall", - "rmdir", - "rt_sigaction", - "rt_sigpending", - "rt_sigprocmask", - "rt_sigqueueinfo", - "rt_sigreturn", - "rt_sigsuspend", - "rt_sigtimedwait", - "rt_tgsigqueueinfo", - "sched_getaffinity", - "sched_getattr", - "sched_getparam", - "sched_get_priority_max", - "sched_get_priority_min", - "sched_getscheduler", - "sched_rr_get_interval", - "sched_setaffinity", - "sched_setattr", - "sched_setparam", - "sched_setscheduler", - "sched_yield", - "seccomp", - "select", - "semctl", - "semget", - "semop", - "semtimedop", - "send", - "sendfile", - "sendfile64", - "sendmmsg", - "sendmsg", - "sendto", - "setfsgid", - "setfsgid32", - "setfsuid", - "setfsuid32", - "setgid", - "setgid32", - "setgroups", - "setgroups32", - "setitimer", - "setpgid", - "setpriority", - "setregid", - "setregid32", - "setresgid", - "setresgid32", - "setresuid", - "setresuid32", - "setreuid", - "setreuid32", - "setrlimit", - "set_robust_list", - "setsid", - "setsockopt", - "set_thread_area", - "set_tid_address", - "setuid", - "setuid32", - "setxattr", - "shmat", - "shmctl", - "shmdt", - "shmget", - "shutdown", - "sigaltstack", - "signalfd", - "signalfd4", - "sigreturn", - "socket", - "socketcall", - "socketpair", - "splice", - "stat", - "stat64", - "statfs", - "statfs64", - "symlink", - "symlinkat", - "sync", - "sync_file_range", - "syncfs", - "sysinfo", - "syslog", - "tee", - "tgkill", - "time", - "timer_create", - "timer_delete", - "timerfd_create", - "timerfd_gettime", - "timerfd_settime", - "timer_getoverrun", - "timer_gettime", - "timer_settime", - "times", - "tkill", - "truncate", - "truncate64", - "ugetrlimit", - "umask", - "uname", - "unlink", - "unlinkat", - "utime", - "utimensat", - "utimes", - "vfork", - "vmsplice", - "wait4", - "waitid", - "waitpid", - "write", - "writev" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": {}, - "excludes": {} - }, - { - "names": [ - "personality" - ], - "action": "SCMP_ACT_ALLOW", - "args": [ - { - "index": 0, - "value": 0, - "valueTwo": 0, - "op": "SCMP_CMP_EQ" - } - ], - "comment": "", - "includes": {}, - "excludes": {} - }, - { - "names": [ - "personality" - ], - "action": "SCMP_ACT_ALLOW", - "args": [ - { - "index": 0, - "value": 8, - "valueTwo": 0, - "op": "SCMP_CMP_EQ" - } - ], - "comment": "", - "includes": {}, - "excludes": {} - }, - { - "names": [ - "personality" - ], - "action": "SCMP_ACT_ALLOW", - "args": [ - { - "index": 0, - "value": 4294967295, - "valueTwo": 0, - "op": "SCMP_CMP_EQ" - } - ], - "comment": "", - "includes": {}, - "excludes": {} - }, - { - "names": [ - "arm_fadvise64_64", - "arm_sync_file_range", - "breakpoint", - "cacheflush", - "set_tls" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "arches": [ - "arm", - "arm64" - ] - }, - "excludes": {} - }, - { - "names": [ - "arch_prctl" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "arches": [ - "amd64", - "x32" - ] - }, - "excludes": {} - }, - { - "names": [ - "modify_ldt" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "arches": [ - "amd64", - "x32", - "x86" - ] - }, - "excludes": {} - }, - { - "names": [ - "s390_pci_mmio_read", - "s390_pci_mmio_write", - "s390_runtime_instr" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "arches": [ - "s390", - "s390x" - ] - }, - "excludes": {} - }, - { - "names": [ - "open_by_handle_at" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "caps": [ - "CAP_DAC_READ_SEARCH" - ] - }, - "excludes": {} - }, - { - "names": [ - "bpf", - "clone", - "fanotify_init", - "lookup_dcookie", - "mount", - "name_to_handle_at", - "perf_event_open", - "setdomainname", - "sethostname", - "setns", - "umount", - "umount2", - "unshare" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "caps": [ - "CAP_SYS_ADMIN" - ] - }, - "excludes": {} - }, - { - "names": [ - "clone" - ], - "action": "SCMP_ACT_ALLOW", - "args": [ - { - "index": 0, - "value": 2080505856, - "valueTwo": 0, - "op": "SCMP_CMP_MASKED_EQ" - } - ], - "comment": "", - "includes": {}, - "excludes": { - "caps": [ - "CAP_SYS_ADMIN" - ], - "arches": [ - "s390", - "s390x" - ] - } - }, - { - "names": [ - "clone" - ], - "action": "SCMP_ACT_ALLOW", - "args": [ - { - "index": 1, - "value": 2080505856, - "valueTwo": 0, - "op": "SCMP_CMP_MASKED_EQ" - } - ], - "comment": "s390 parameter ordering for clone is different", - "includes": { - "arches": [ - "s390", - "s390x" - ] - }, - "excludes": { - "caps": [ - "CAP_SYS_ADMIN" - ] - } - }, - { - "names": [ - "reboot" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "caps": [ - "CAP_SYS_BOOT" - ] - }, - "excludes": {} - }, - { - "names": [ - "chroot" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "caps": [ - "CAP_SYS_CHROOT" - ] - }, - "excludes": {} - }, - { - "names": [ - "delete_module", - "init_module", - "finit_module", - "query_module" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "caps": [ - "CAP_SYS_MODULE" - ] - }, - "excludes": {} - }, - { - "names": [ - "acct" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "caps": [ - "CAP_SYS_PACCT" - ] - }, - "excludes": {} - }, - { - "names": [ - "kcmp", - "process_vm_readv", - "process_vm_writev", - "ptrace" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "caps": [ - "CAP_SYS_PTRACE" - ] - }, - "excludes": {} - }, - { - "names": [ - "iopl", - "ioperm" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "caps": [ - "CAP_SYS_RAWIO" - ] - }, - "excludes": {} - }, - { - "names": [ - "settimeofday", - "stime", - "adjtimex" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "caps": [ - "CAP_SYS_TIME" - ] - }, - "excludes": {} - }, - { - "names": [ - "vhangup" - ], - "action": "SCMP_ACT_ALLOW", - "args": [], - "comment": "", - "includes": { - "caps": [ - "CAP_SYS_TTY_CONFIG" - ] - }, - "excludes": {} - } - ] -} \ No newline at end of file diff --git a/vendor/github.com/docker/docker/profiles/seccomp/fixtures/example.json b/vendor/github.com/docker/docker/profiles/seccomp/fixtures/example.json deleted file mode 100755 index 674ca50fd..000000000 --- a/vendor/github.com/docker/docker/profiles/seccomp/fixtures/example.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "defaultAction": "SCMP_ACT_ERRNO", - "syscalls": [ - { - "name": "clone", - "action": "SCMP_ACT_ALLOW", - "args": [ - { - "index": 0, - "value": 2080505856, - "valueTwo": 0, - "op": "SCMP_CMP_MASKED_EQ" - } - ] - }, - { - "name": "open", - "action": "SCMP_ACT_ALLOW", - "args": [] - }, - { - "name": "close", - "action": "SCMP_ACT_ALLOW", - "args": [] - } - ] -} diff --git a/vendor/github.com/docker/docker/profiles/seccomp/generate.go b/vendor/github.com/docker/docker/profiles/seccomp/generate.go deleted file mode 100644 index 32f22bb37..000000000 --- a/vendor/github.com/docker/docker/profiles/seccomp/generate.go +++ /dev/null @@ -1,32 +0,0 @@ -// +build ignore - -package main - -import ( - "encoding/json" - "io/ioutil" - "os" - "path/filepath" - - "github.com/docker/docker/profiles/seccomp" -) - -// saves the default seccomp profile as a json file so people can use it as a -// base for their own custom profiles -func main() { - wd, err := os.Getwd() - if err != nil { - panic(err) - } - f := filepath.Join(wd, "default.json") - - // write the default profile to the file - b, err := json.MarshalIndent(seccomp.DefaultProfile(), "", "\t") - if err != nil { - panic(err) - } - - if err := ioutil.WriteFile(f, b, 0644); err != nil { - panic(err) - } -} diff --git a/vendor/github.com/docker/docker/profiles/seccomp/seccomp.go b/vendor/github.com/docker/docker/profiles/seccomp/seccomp.go deleted file mode 100644 index a54ef50a8..000000000 --- a/vendor/github.com/docker/docker/profiles/seccomp/seccomp.go +++ /dev/null @@ -1,150 +0,0 @@ -// +build linux - -package seccomp - -import ( - "encoding/json" - "errors" - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/stringutils" - "github.com/opencontainers/runtime-spec/specs-go" - libseccomp "github.com/seccomp/libseccomp-golang" -) - -//go:generate go run -tags 'seccomp' generate.go - -// GetDefaultProfile returns the default seccomp profile. -func GetDefaultProfile(rs *specs.Spec) (*specs.Seccomp, error) { - return setupSeccomp(DefaultProfile(), rs) -} - -// LoadProfile takes a file path and decodes the seccomp profile. -func LoadProfile(body string, rs *specs.Spec) (*specs.Seccomp, error) { - var config types.Seccomp - if err := json.Unmarshal([]byte(body), &config); err != nil { - return nil, fmt.Errorf("Decoding seccomp profile failed: %v", err) - } - return setupSeccomp(&config, rs) -} - -var nativeToSeccomp = map[string]types.Arch{ - "amd64": types.ArchX86_64, - "arm64": types.ArchAARCH64, - "mips64": types.ArchMIPS64, - "mips64n32": types.ArchMIPS64N32, - "mipsel64": types.ArchMIPSEL64, - "mipsel64n32": types.ArchMIPSEL64N32, - "s390x": types.ArchS390X, -} - -func setupSeccomp(config *types.Seccomp, rs *specs.Spec) (*specs.Seccomp, error) { - if config == nil { - return nil, nil - } - - // No default action specified, no syscalls listed, assume seccomp disabled - if config.DefaultAction == "" && len(config.Syscalls) == 0 { - return nil, nil - } - - newConfig := &specs.Seccomp{} - - var arch string - var native, err = libseccomp.GetNativeArch() - if err == nil { - arch = native.String() - } - - if len(config.Architectures) != 0 && len(config.ArchMap) != 0 { - return nil, errors.New("'architectures' and 'archMap' were specified in the seccomp profile, use either 'architectures' or 'archMap'") - } - - // if config.Architectures == 0 then libseccomp will figure out the architecture to use - if len(config.Architectures) != 0 { - for _, a := range config.Architectures { - newConfig.Architectures = append(newConfig.Architectures, specs.Arch(a)) - } - } - - if len(config.ArchMap) != 0 { - for _, a := range config.ArchMap { - seccompArch, ok := nativeToSeccomp[arch] - if ok { - if a.Arch == seccompArch { - newConfig.Architectures = append(newConfig.Architectures, specs.Arch(a.Arch)) - for _, sa := range a.SubArches { - newConfig.Architectures = append(newConfig.Architectures, specs.Arch(sa)) - } - break - } - } - } - } - - newConfig.DefaultAction = specs.Action(config.DefaultAction) - -Loop: - // Loop through all syscall blocks and convert them to libcontainer format after filtering them - for _, call := range config.Syscalls { - if len(call.Excludes.Arches) > 0 { - if stringutils.InSlice(call.Excludes.Arches, arch) { - continue Loop - } - } - if len(call.Excludes.Caps) > 0 { - for _, c := range call.Excludes.Caps { - if stringutils.InSlice(rs.Process.Capabilities, c) { - continue Loop - } - } - } - if len(call.Includes.Arches) > 0 { - if !stringutils.InSlice(call.Includes.Arches, arch) { - continue Loop - } - } - if len(call.Includes.Caps) > 0 { - for _, c := range call.Includes.Caps { - if !stringutils.InSlice(rs.Process.Capabilities, c) { - continue Loop - } - } - } - - if call.Name != "" && len(call.Names) != 0 { - return nil, errors.New("'name' and 'names' were specified in the seccomp profile, use either 'name' or 'names'") - } - - if call.Name != "" { - newConfig.Syscalls = append(newConfig.Syscalls, createSpecsSyscall(call.Name, call.Action, call.Args)) - } - - for _, n := range call.Names { - newConfig.Syscalls = append(newConfig.Syscalls, createSpecsSyscall(n, call.Action, call.Args)) - } - } - - return newConfig, nil -} - -func createSpecsSyscall(name string, action types.Action, args []*types.Arg) specs.Syscall { - newCall := specs.Syscall{ - Name: name, - Action: specs.Action(action), - } - - // Loop through all the arguments of the syscall and convert them - for _, arg := range args { - newArg := specs.Arg{ - Index: arg.Index, - Value: arg.Value, - ValueTwo: arg.ValueTwo, - Op: specs.Operator(arg.Op), - } - - newCall.Args = append(newCall.Args, newArg) - } - return newCall -} diff --git a/vendor/github.com/docker/docker/profiles/seccomp/seccomp_default.go b/vendor/github.com/docker/docker/profiles/seccomp/seccomp_default.go deleted file mode 100644 index b84de820b..000000000 --- a/vendor/github.com/docker/docker/profiles/seccomp/seccomp_default.go +++ /dev/null @@ -1,604 +0,0 @@ -// +build linux,seccomp - -package seccomp - -import ( - "syscall" - - "github.com/docker/docker/api/types" -) - -func arches() []types.Architecture { - return []types.Architecture{ - { - Arch: types.ArchX86_64, - SubArches: []types.Arch{types.ArchX86, types.ArchX32}, - }, - { - Arch: types.ArchAARCH64, - SubArches: []types.Arch{types.ArchARM}, - }, - { - Arch: types.ArchMIPS64, - SubArches: []types.Arch{types.ArchMIPS, types.ArchMIPS64N32}, - }, - { - Arch: types.ArchMIPS64N32, - SubArches: []types.Arch{types.ArchMIPS, types.ArchMIPS64}, - }, - { - Arch: types.ArchMIPSEL64, - SubArches: []types.Arch{types.ArchMIPSEL, types.ArchMIPSEL64N32}, - }, - { - Arch: types.ArchMIPSEL64N32, - SubArches: []types.Arch{types.ArchMIPSEL, types.ArchMIPSEL64}, - }, - { - Arch: types.ArchS390X, - SubArches: []types.Arch{types.ArchS390}, - }, - } -} - -// DefaultProfile defines the whitelist for the default seccomp profile. -func DefaultProfile() *types.Seccomp { - syscalls := []*types.Syscall{ - { - Names: []string{ - "accept", - "accept4", - "access", - "alarm", - "alarm", - "bind", - "brk", - "capget", - "capset", - "chdir", - "chmod", - "chown", - "chown32", - "clock_getres", - "clock_gettime", - "clock_nanosleep", - "close", - "connect", - "copy_file_range", - "creat", - "dup", - "dup2", - "dup3", - "epoll_create", - "epoll_create1", - "epoll_ctl", - "epoll_ctl_old", - "epoll_pwait", - "epoll_wait", - "epoll_wait_old", - "eventfd", - "eventfd2", - "execve", - "execveat", - "exit", - "exit_group", - "faccessat", - "fadvise64", - "fadvise64_64", - "fallocate", - "fanotify_mark", - "fchdir", - "fchmod", - "fchmodat", - "fchown", - "fchown32", - "fchownat", - "fcntl", - "fcntl64", - "fdatasync", - "fgetxattr", - "flistxattr", - "flock", - "fork", - "fremovexattr", - "fsetxattr", - "fstat", - "fstat64", - "fstatat64", - "fstatfs", - "fstatfs64", - "fsync", - "ftruncate", - "ftruncate64", - "futex", - "futimesat", - "getcpu", - "getcwd", - "getdents", - "getdents64", - "getegid", - "getegid32", - "geteuid", - "geteuid32", - "getgid", - "getgid32", - "getgroups", - "getgroups32", - "getitimer", - "getpeername", - "getpgid", - "getpgrp", - "getpid", - "getppid", - "getpriority", - "getrandom", - "getresgid", - "getresgid32", - "getresuid", - "getresuid32", - "getrlimit", - "get_robust_list", - "getrusage", - "getsid", - "getsockname", - "getsockopt", - "get_thread_area", - "gettid", - "gettimeofday", - "getuid", - "getuid32", - "getxattr", - "inotify_add_watch", - "inotify_init", - "inotify_init1", - "inotify_rm_watch", - "io_cancel", - "ioctl", - "io_destroy", - "io_getevents", - "ioprio_get", - "ioprio_set", - "io_setup", - "io_submit", - "ipc", - "kill", - "lchown", - "lchown32", - "lgetxattr", - "link", - "linkat", - "listen", - "listxattr", - "llistxattr", - "_llseek", - "lremovexattr", - "lseek", - "lsetxattr", - "lstat", - "lstat64", - "madvise", - "memfd_create", - "mincore", - "mkdir", - "mkdirat", - "mknod", - "mknodat", - "mlock", - "mlock2", - "mlockall", - "mmap", - "mmap2", - "mprotect", - "mq_getsetattr", - "mq_notify", - "mq_open", - "mq_timedreceive", - "mq_timedsend", - "mq_unlink", - "mremap", - "msgctl", - "msgget", - "msgrcv", - "msgsnd", - "msync", - "munlock", - "munlockall", - "munmap", - "nanosleep", - "newfstatat", - "_newselect", - "open", - "openat", - "pause", - "pipe", - "pipe2", - "poll", - "ppoll", - "prctl", - "pread64", - "preadv", - "prlimit64", - "pselect6", - "pwrite64", - "pwritev", - "read", - "readahead", - "readlink", - "readlinkat", - "readv", - "recv", - "recvfrom", - "recvmmsg", - "recvmsg", - "remap_file_pages", - "removexattr", - "rename", - "renameat", - "renameat2", - "restart_syscall", - "rmdir", - "rt_sigaction", - "rt_sigpending", - "rt_sigprocmask", - "rt_sigqueueinfo", - "rt_sigreturn", - "rt_sigsuspend", - "rt_sigtimedwait", - "rt_tgsigqueueinfo", - "sched_getaffinity", - "sched_getattr", - "sched_getparam", - "sched_get_priority_max", - "sched_get_priority_min", - "sched_getscheduler", - "sched_rr_get_interval", - "sched_setaffinity", - "sched_setattr", - "sched_setparam", - "sched_setscheduler", - "sched_yield", - "seccomp", - "select", - "semctl", - "semget", - "semop", - "semtimedop", - "send", - "sendfile", - "sendfile64", - "sendmmsg", - "sendmsg", - "sendto", - "setfsgid", - "setfsgid32", - "setfsuid", - "setfsuid32", - "setgid", - "setgid32", - "setgroups", - "setgroups32", - "setitimer", - "setpgid", - "setpriority", - "setregid", - "setregid32", - "setresgid", - "setresgid32", - "setresuid", - "setresuid32", - "setreuid", - "setreuid32", - "setrlimit", - "set_robust_list", - "setsid", - "setsockopt", - "set_thread_area", - "set_tid_address", - "setuid", - "setuid32", - "setxattr", - "shmat", - "shmctl", - "shmdt", - "shmget", - "shutdown", - "sigaltstack", - "signalfd", - "signalfd4", - "sigreturn", - "socket", - "socketcall", - "socketpair", - "splice", - "stat", - "stat64", - "statfs", - "statfs64", - "symlink", - "symlinkat", - "sync", - "sync_file_range", - "syncfs", - "sysinfo", - "syslog", - "tee", - "tgkill", - "time", - "timer_create", - "timer_delete", - "timerfd_create", - "timerfd_gettime", - "timerfd_settime", - "timer_getoverrun", - "timer_gettime", - "timer_settime", - "times", - "tkill", - "truncate", - "truncate64", - "ugetrlimit", - "umask", - "uname", - "unlink", - "unlinkat", - "utime", - "utimensat", - "utimes", - "vfork", - "vmsplice", - "wait4", - "waitid", - "waitpid", - "write", - "writev", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - }, - { - Names: []string{"personality"}, - Action: types.ActAllow, - Args: []*types.Arg{ - { - Index: 0, - Value: 0x0, - Op: types.OpEqualTo, - }, - }, - }, - { - Names: []string{"personality"}, - Action: types.ActAllow, - Args: []*types.Arg{ - { - Index: 0, - Value: 0x0008, - Op: types.OpEqualTo, - }, - }, - }, - { - Names: []string{"personality"}, - Action: types.ActAllow, - Args: []*types.Arg{ - { - Index: 0, - Value: 0xffffffff, - Op: types.OpEqualTo, - }, - }, - }, - { - Names: []string{ - "arm_fadvise64_64", - "arm_sync_file_range", - "breakpoint", - "cacheflush", - "set_tls", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Arches: []string{"arm", "arm64"}, - }, - }, - { - Names: []string{ - "arch_prctl", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Arches: []string{"amd64", "x32"}, - }, - }, - { - Names: []string{ - "modify_ldt", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Arches: []string{"amd64", "x32", "x86"}, - }, - }, - { - Names: []string{ - "s390_pci_mmio_read", - "s390_pci_mmio_write", - "s390_runtime_instr", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Arches: []string{"s390", "s390x"}, - }, - }, - { - Names: []string{ - "open_by_handle_at", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Caps: []string{"CAP_DAC_READ_SEARCH"}, - }, - }, - { - Names: []string{ - "bpf", - "clone", - "fanotify_init", - "lookup_dcookie", - "mount", - "name_to_handle_at", - "perf_event_open", - "setdomainname", - "sethostname", - "setns", - "umount", - "umount2", - "unshare", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Caps: []string{"CAP_SYS_ADMIN"}, - }, - }, - { - Names: []string{ - "clone", - }, - Action: types.ActAllow, - Args: []*types.Arg{ - { - Index: 0, - Value: syscall.CLONE_NEWNS | syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWUSER | syscall.CLONE_NEWPID | syscall.CLONE_NEWNET, - ValueTwo: 0, - Op: types.OpMaskedEqual, - }, - }, - Excludes: types.Filter{ - Caps: []string{"CAP_SYS_ADMIN"}, - Arches: []string{"s390", "s390x"}, - }, - }, - { - Names: []string{ - "clone", - }, - Action: types.ActAllow, - Args: []*types.Arg{ - { - Index: 1, - Value: syscall.CLONE_NEWNS | syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWUSER | syscall.CLONE_NEWPID | syscall.CLONE_NEWNET, - ValueTwo: 0, - Op: types.OpMaskedEqual, - }, - }, - Comment: "s390 parameter ordering for clone is different", - Includes: types.Filter{ - Arches: []string{"s390", "s390x"}, - }, - Excludes: types.Filter{ - Caps: []string{"CAP_SYS_ADMIN"}, - }, - }, - { - Names: []string{ - "reboot", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Caps: []string{"CAP_SYS_BOOT"}, - }, - }, - { - Names: []string{ - "chroot", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Caps: []string{"CAP_SYS_CHROOT"}, - }, - }, - { - Names: []string{ - "delete_module", - "init_module", - "finit_module", - "query_module", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Caps: []string{"CAP_SYS_MODULE"}, - }, - }, - { - Names: []string{ - "acct", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Caps: []string{"CAP_SYS_PACCT"}, - }, - }, - { - Names: []string{ - "kcmp", - "process_vm_readv", - "process_vm_writev", - "ptrace", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Caps: []string{"CAP_SYS_PTRACE"}, - }, - }, - { - Names: []string{ - "iopl", - "ioperm", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Caps: []string{"CAP_SYS_RAWIO"}, - }, - }, - { - Names: []string{ - "settimeofday", - "stime", - "adjtimex", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Caps: []string{"CAP_SYS_TIME"}, - }, - }, - { - Names: []string{ - "vhangup", - }, - Action: types.ActAllow, - Args: []*types.Arg{}, - Includes: types.Filter{ - Caps: []string{"CAP_SYS_TTY_CONFIG"}, - }, - }, - } - - return &types.Seccomp{ - DefaultAction: types.ActErrno, - ArchMap: arches(), - Syscalls: syscalls, - } -} diff --git a/vendor/github.com/docker/docker/profiles/seccomp/seccomp_test.go b/vendor/github.com/docker/docker/profiles/seccomp/seccomp_test.go deleted file mode 100644 index 134692147..000000000 --- a/vendor/github.com/docker/docker/profiles/seccomp/seccomp_test.go +++ /dev/null @@ -1,32 +0,0 @@ -// +build linux - -package seccomp - -import ( - "io/ioutil" - "testing" - - "github.com/docker/docker/oci" -) - -func TestLoadProfile(t *testing.T) { - f, err := ioutil.ReadFile("fixtures/example.json") - if err != nil { - t.Fatal(err) - } - rs := oci.DefaultSpec() - if _, err := LoadProfile(string(f), &rs); err != nil { - t.Fatal(err) - } -} - -func TestLoadDefaultProfile(t *testing.T) { - f, err := ioutil.ReadFile("default.json") - if err != nil { - t.Fatal(err) - } - rs := oci.DefaultSpec() - if _, err := LoadProfile(string(f), &rs); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/docker/profiles/seccomp/seccomp_unsupported.go b/vendor/github.com/docker/docker/profiles/seccomp/seccomp_unsupported.go deleted file mode 100644 index f84b20b6d..000000000 --- a/vendor/github.com/docker/docker/profiles/seccomp/seccomp_unsupported.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build linux,!seccomp - -package seccomp - -import ( - "github.com/docker/docker/api/types" - "github.com/opencontainers/runtime-spec/specs-go" -) - -// DefaultProfile returns a nil pointer on unsupported systems. -func DefaultProfile(rs *specs.Spec) *types.Seccomp { - return nil -} diff --git a/vendor/github.com/docker/docker/project/ARM.md b/vendor/github.com/docker/docker/project/ARM.md deleted file mode 100644 index c4d21bf27..000000000 --- a/vendor/github.com/docker/docker/project/ARM.md +++ /dev/null @@ -1,45 +0,0 @@ -# ARM support - -The ARM support should be considered experimental. It will be extended step by step in the coming weeks. - -Building a Docker Development Image works in the same fashion as for Intel platform (x86-64). -Currently we have initial support for 32bit ARMv7 devices. - -To work with the Docker Development Image you have to clone the Docker/Docker repo on a supported device. -It needs to have a Docker Engine installed to build the Docker Development Image. - -From the root of the Docker/Docker repo one can use make to execute the following make targets: -- make validate -- make binary -- make build -- make deb -- make bundles -- make default -- make shell -- make test-unit -- make test-integration-cli -- make - -The Makefile does include logic to determine on which OS and architecture the Docker Development Image is built. -Based on OS and architecture it chooses the correct Dockerfile. -For the ARM 32bit architecture it uses `Dockerfile.armhf`. - -So for example in order to build a Docker binary one has to -1. clone the Docker/Docker repository on an ARM device `git clone git@github.com:docker/docker.git` -2. change into the checked out repository with `cd docker` -3. execute `make binary` to create a Docker Engine binary for ARM - -## Kernel modules -A few libnetwork integration tests require that the kernel be -configured with "dummy" network interface and has the module -loaded. However, the dummy module may be not loaded automatically. - -To load the kernel module permanently, run these commands as `root`. - - modprobe dummy - echo "dummy" >> /etc/modules - -On some systems you also have to sync your kernel modules. - - oc-sync-kernel-modules - depmod diff --git a/vendor/github.com/docker/docker/project/BRANCHES-AND-TAGS.md b/vendor/github.com/docker/docker/project/BRANCHES-AND-TAGS.md deleted file mode 100644 index 1c6f23252..000000000 --- a/vendor/github.com/docker/docker/project/BRANCHES-AND-TAGS.md +++ /dev/null @@ -1,35 +0,0 @@ -Branches and tags -================= - -Note: details of the release process for the Engine are documented in the -[RELEASE-CHECKLIST](https://github.com/docker/docker/blob/master/project/RELEASE-CHECKLIST.md). - -# Branches - -The docker/docker repository should normally have only three living branches at all time, including -the regular `master` branch: - -## `docs` branch - -The `docs` branch supports documentation updates between product releases. This branch allow us to -decouple documentation releases from product releases. - -## `release` branch - -The `release` branch contains the last _released_ version of the code for the project. - -The `release` branch is only updated at each public release of the project. The mechanism for this -is that the release is materialized by a pull request against the `release` branch which lives for -the duration of the code freeze period. When this pull request is merged, the `release` branch gets -updated, and its new state is tagged accordingly. - -# Tags - -Any public release of a compiled binary, with the logical exception of nightly builds, should have -a corresponding tag in the repository. - -The general format of a tag is `vX.Y.Z[-suffix[N]]`: - -- All of `X`, `Y`, `Z` must be specified (example: `v1.0.0`) -- First release candidate for version `1.8.0` should be tagged `v1.8.0-rc1` -- Second alpha release of a product should be tagged `v1.0.0-alpha1` diff --git a/vendor/github.com/docker/docker/project/CONTRIBUTORS.md b/vendor/github.com/docker/docker/project/CONTRIBUTORS.md deleted file mode 120000 index 44fcc6343..000000000 --- a/vendor/github.com/docker/docker/project/CONTRIBUTORS.md +++ /dev/null @@ -1 +0,0 @@ -../CONTRIBUTING.md \ No newline at end of file diff --git a/vendor/github.com/docker/docker/project/GOVERNANCE.md b/vendor/github.com/docker/docker/project/GOVERNANCE.md deleted file mode 100644 index 6ae7baf74..000000000 --- a/vendor/github.com/docker/docker/project/GOVERNANCE.md +++ /dev/null @@ -1,17 +0,0 @@ -# Docker Governance Advisory Board Meetings - -In the spirit of openness, Docker created a Governance Advisory Board, and committed to make all materials and notes from the meetings of this group public. -All output from the meetings should be considered proposals only, and are subject to the review and approval of the community and the project leadership. - -The materials from the first Docker Governance Advisory Board meeting, held on October 28, 2014, are available at -[Google Docs Folder](https://goo.gl/Alfj8r) - -These include: - -* First Meeting Notes -* DGAB Charter -* Presentation 1: Introductory Presentation, including State of The Project -* Presentation 2: Overall Contribution Structure/Docker Project Core Proposal -* Presentation 3: Long Term Roadmap/Statement of Direction - - diff --git a/vendor/github.com/docker/docker/project/IRC-ADMINISTRATION.md b/vendor/github.com/docker/docker/project/IRC-ADMINISTRATION.md deleted file mode 100644 index 824a14bd5..000000000 --- a/vendor/github.com/docker/docker/project/IRC-ADMINISTRATION.md +++ /dev/null @@ -1,37 +0,0 @@ -# Freenode IRC Administration Guidelines and Tips - -This is not meant to be a general "Here's how to IRC" document, so if you're -looking for that, check Google instead. ♥ - -If you've been charged with helping maintain one of Docker's now many IRC -channels, this might turn out to be useful. If there's information that you -wish you'd known about how a particular channel is organized, you should add -deets here! :) - -## `ChanServ` - -Most channel maintenance happens by talking to Freenode's `ChanServ` bot. For -example, `/msg ChanServ ACCESS LIST` will show you a list of everyone -with "access" privileges for a particular channel. - -A similar command is used to give someone a particular access level. For -example, to add a new maintainer to the `#docker-maintainers` access list so -that they can contribute to the discussions (after they've been merged -appropriately in a `MAINTAINERS` file, of course), one would use `/msg ChanServ -ACCESS #docker-maintainers ADD maintainer`. - -To setup a new channel with a similar `maintainer` access template, use a -command like `/msg ChanServ TEMPLATE maintainer +AV` (`+A` for letting -them view the `ACCESS LIST`, `+V` for auto-voice; see `/msg ChanServ HELP FLAGS` -for more details). - -## Troubleshooting - -The most common cause of not-getting-auto-`+v` woes is people not being -`IDENTIFY`ed with `NickServ` (or their current nickname not being `GROUP`ed with -their main nickname) -- often manifested by `ChanServ` responding to an `ACCESS -ADD` request with something like `xyz is not registered.`. - -This is easily fixed by doing `/msg NickServ IDENTIFY OldNick SecretPassword` -followed by `/msg NickServ GROUP` to group the two nicknames together. See -`/msg NickServ HELP GROUP` for more information. diff --git a/vendor/github.com/docker/docker/project/ISSUE-TRIAGE.md b/vendor/github.com/docker/docker/project/ISSUE-TRIAGE.md deleted file mode 100644 index 95cb2f1b9..000000000 --- a/vendor/github.com/docker/docker/project/ISSUE-TRIAGE.md +++ /dev/null @@ -1,132 +0,0 @@ -Triaging of issues ------------------- - -Triage provides an important way to contribute to an open source project. Triage helps ensure issues resolve quickly by: - -- Describing the issue's intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences a problem and what actions they took. -- Giving a contributor the information they need before they commit to resolving an issue. -- Lowering the issue count by preventing duplicate issues. -- Streamlining the development process by preventing duplicate discussions. - -If you don't have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. - -### 1. Ensure the issue contains basic information - -Before triaging an issue very far, make sure that the issue's author provided the standard issue information. This will help you make an educated recommendation on how this to categorize the issue. Standard information that *must* be included in most issues are things such as: - -- the output of `docker version` -- the output of `docker info` -- the output of `uname -a` -- a reproducible case if this is a bug, Dockerfiles FTW -- host distribution and version ( ubuntu 14.04, RHEL, fedora 23 ) -- page URL if this is a docs issue or the name of a man page - -Depending on the issue, you might not feel all this information is needed. Use your best judgement. If you cannot triage an issue using what its author provided, explain kindly to the author that they must provide the above information to clarify the problem. - -If the author provides the standard information but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author's time. - -If the author does not respond requested information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be -reopened when the necessary information is provided. - -### 2. Classify the Issue - -An issue can have multiple of the following labels. Typically, a properly classified issues should -have: - -- One label identifying its kind (`kind/*`). -- One or multiple labels identifying the functional areas of interest (`area/*`). -- Where applicable, one label categorizing its difficulty (`exp/*`). - -#### Issue kind - -| Kind | Description | -|------------------|---------------------------------------------------------------------------------------------------------------------------------| -| kind/bug | Bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate. | -| kind/enhancement | Enhancement are not bugs or new features but can drastically improve usability or performance of a project component. | -| kind/feature | Functionality or other elements that the project does not currently support. Features are new and shiny. | -| kind/question | Contains a user or contributor question requiring a response. | - -#### Functional area - -| Area | -|---------------------------| -| area/api | -| area/builder | -| area/bundles | -| area/cli | -| area/daemon | -| area/distribution | -| area/docs | -| area/kernel | -| area/logging | -| area/networking | -| area/plugins | -| area/project | -| area/runtime | -| area/security | -| area/security/apparmor | -| area/security/seccomp | -| area/security/selinux | -| area/security/trust | -| area/storage | -| area/storage/aufs | -| area/storage/btrfs | -| area/storage/devicemapper | -| area/storage/overlay | -| area/storage/zfs | -| area/swarm | -| area/testing | -| area/volumes | - -#### Platform - -| Platform | -|---------------------------| -| platform/arm | -| platform/darwin | -| platform/ibm-power | -| platform/ibm-z | -| platform/windows | - -#### Experience level - -Experience level is a way for a contributor to find an issue based on their -skill set. Experience types are applied to the issue or pull request using -labels. - -| Level | Experience level guideline | -|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| exp/beginner | New to Docker, and possibly Golang, and is looking to help while learning the basics. | -| exp/intermediate | Comfortable with golang and understands the core concepts of Docker and looking to dive deeper into the project. | -| exp/expert | Proficient with Docker and Golang and has been following, and active in, the community to understand the rationale behind design decisions and where the project is headed. | - -As the table states, these labels are meant as guidelines. You might have -written a whole plugin for Docker in a personal project and never contributed to -Docker. With that kind of experience, you could take on an exp/expert level task. - -#### Triage status - -To communicate the triage status with other collaborators, you can apply status -labels to issues. These labels prevent duplicating effort. - -| Status | Description | -|-------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| status/confirmed | You triaged the issue, and were able to reproduce the issue. Always leave a comment how you reproduced, so that the person working on resolving the issue has a way to set up a test-case. -| status/accepted | Apply to enhancements / feature requests that we think are good to have. Adding this label helps contributors find things to work on. -| status/more-info-needed | Apply this to issues that are missing information (e.g. no `docker version` or `docker info` output, or no steps to reproduce), or require feedback from the reporter. If the issue is not updated after a week, it can generally be closed. -| status/needs-attention | Apply this label if an issue (or PR) needs more eyes. - -### 3. Prioritizing issue - -When, and only when, an issue is attached to a specific milestone, the issue can be labeled with the -following labels to indicate their degree of priority (from more urgent to less urgent). - -| Priority | Description | -|-------------|-----------------------------------------------------------------------------------------------------------------------------------| -| priority/P0 | Urgent: Security, critical bugs, blocking issues. P0 basically means drop everything you are doing until this issue is addressed. | -| priority/P1 | Important: P1 issues are a top priority and a must-have for the next release. | -| priority/P2 | Normal priority: default priority applied. | -| priority/P3 | Best effort: those are nice to have / minor issues. | - -And that's it. That should be all the information required for a new or existing contributor to come in an resolve an issue. diff --git a/vendor/github.com/docker/docker/project/PACKAGE-REPO-MAINTENANCE.md b/vendor/github.com/docker/docker/project/PACKAGE-REPO-MAINTENANCE.md deleted file mode 100644 index 3763f8798..000000000 --- a/vendor/github.com/docker/docker/project/PACKAGE-REPO-MAINTENANCE.md +++ /dev/null @@ -1,74 +0,0 @@ -# Apt & Yum Repository Maintenance -## A maintainer's guide to managing Docker's package repos - -### How to clean up old experimental debs and rpms - -We release debs and rpms for experimental nightly, so these can build up. -To remove old experimental debs and rpms, and _ONLY_ keep the latest, follow the -steps below. - -1. Checkout docker master - -2. Run clean scripts - -```bash -docker build --rm --force-rm -t docker-dev:master . -docker run --rm -it --privileged \ - -v /path/to/your/repos/dir:/volumes/repos \ - -v $HOME/.gnupg:/root/.gnupg \ - -e GPG_PASSPHRASE \ - -e DOCKER_RELEASE_DIR=/volumes/repos \ - docker-dev:master hack/make.sh clean-apt-repo clean-yum-repo generate-index-listing sign-repos -``` - -3. Upload the changed repos to `s3` (if you host on s3) - -4. Purge the cache, PURGE the cache, PURGE THE CACHE! - -### How to get out of a sticky situation - -Sh\*t happens. We know. Below are steps to get out of any "hash-sum mismatch" or -"gpg sig error" or the likes error that might happen to the apt repo. - -**NOTE:** These are apt repo specific, have had no experimence with anything similar -happening to the yum repo in the past so you can rest easy. - -For each step listed below, move on to the next if the previous didn't work. -Otherwise CELEBRATE! - -1. Purge the cache. - -2. Did you remember to sign the debs after releasing? - -Re-sign the repo with your gpg key: - -```bash -docker build --rm --force-rm -t docker-dev:master . -docker run --rm -it --privileged \ - -v /path/to/your/repos/dir:/volumes/repos \ - -v $HOME/.gnupg:/root/.gnupg \ - -e GPG_PASSPHRASE \ - -e DOCKER_RELEASE_DIR=/volumes/repos \ - docker-dev:master hack/make.sh sign-repos -``` - -Upload the changed repo to `s3` (if that is where you host) - -PURGE THE CACHE. - -3. Run Jess' magical, save all, only in case of extreme emergencies, "you are -going to have to break this glass to get it" script. - -```bash -docker build --rm --force-rm -t docker-dev:master . -docker run --rm -it --privileged \ - -v /path/to/your/repos/dir:/volumes/repos \ - -v $HOME/.gnupg:/root/.gnupg \ - -e GPG_PASSPHRASE \ - -e DOCKER_RELEASE_DIR=/volumes/repos \ - docker-dev:master hack/make.sh update-apt-repo generate-index-listing sign-repos -``` - -4. Upload the changed repo to `s3` (if that is where you host) - -PURGE THE CACHE. diff --git a/vendor/github.com/docker/docker/project/PACKAGERS.md b/vendor/github.com/docker/docker/project/PACKAGERS.md deleted file mode 100644 index 46ea8e7b2..000000000 --- a/vendor/github.com/docker/docker/project/PACKAGERS.md +++ /dev/null @@ -1,307 +0,0 @@ -# Dear Packager, - -If you are looking to make Docker available on your favorite software -distribution, this document is for you. It summarizes the requirements for -building and running the Docker client and the Docker daemon. - -## Getting Started - -We want to help you package Docker successfully. Before doing any packaging, a -good first step is to introduce yourself on the [docker-dev mailing -list](https://groups.google.com/d/forum/docker-dev), explain what you're trying -to achieve, and tell us how we can help. Don't worry, we don't bite! There might -even be someone already working on packaging for the same distro! - -You can also join the IRC channel - #docker and #docker-dev on Freenode are both -active and friendly. - -We like to refer to Tianon ("@tianon" on GitHub and "tianon" on IRC) as our -"Packagers Relations", since he's always working to make sure our packagers have -a good, healthy upstream to work with (both in our communication and in our -build scripts). If you're having any kind of trouble, feel free to ping him -directly. He also likes to keep track of what distributions we have packagers -for, so feel free to reach out to him even just to say "Hi!" - -## Package Name - -If possible, your package should be called "docker". If that name is already -taken, a second choice is "docker-engine". Another possible choice is "docker.io". - -## Official Build vs Distro Build - -The Docker project maintains its own build and release toolchain. It is pretty -neat and entirely based on Docker (surprise!). This toolchain is the canonical -way to build Docker. We encourage you to give it a try, and if the circumstances -allow you to use it, we recommend that you do. - -You might not be able to use the official build toolchain - usually because your -distribution has a toolchain and packaging policy of its own. We get it! Your -house, your rules. The rest of this document should give you the information you -need to package Docker your way, without denaturing it in the process. - -## Build Dependencies - -To build Docker, you will need the following: - -* A recent version of Git and Mercurial -* Go version 1.6 or later -* A clean checkout of the source added to a valid [Go - workspace](https://golang.org/doc/code.html#Workspaces) under the path - *src/github.com/docker/docker* (unless you plan to use `AUTO_GOPATH`, - explained in more detail below) - -To build the Docker daemon, you will additionally need: - -* An amd64/x86_64 machine running Linux -* SQLite version 3.7.9 or later -* libdevmapper version 1.02.68-cvs (2012-01-26) or later from lvm2 version - 2.02.89 or later -* btrfs-progs version 3.16.1 or later (unless using an older version is - absolutely necessary, in which case 3.8 is the minimum) -* libseccomp version 2.2.1 or later (for build tag seccomp) - -Be sure to also check out Docker's Dockerfile for the most up-to-date list of -these build-time dependencies. - -### Go Dependencies - -All Go dependencies are vendored under "./vendor". They are used by the official -build, so the source of truth for the current version of each dependency is -whatever is in "./vendor". - -To use the vendored dependencies, simply make sure the path to "./vendor" is -included in `GOPATH` (or use `AUTO_GOPATH`, as explained below). - -If you would rather (or must, due to distro policy) package these dependencies -yourself, take a look at "vendor.conf" for an easy-to-parse list of the -exact version for each. - -NOTE: if you're not able to package the exact version (to the exact commit) of a -given dependency, please get in touch so we can remediate! Who knows what -discrepancies can be caused by even the slightest deviation. We promise to do -our best to make everybody happy. - -## Stripping Binaries - -Please, please, please do not strip any compiled binaries. This is really -important. - -In our own testing, stripping the resulting binaries sometimes results in a -binary that appears to work, but more often causes random panics, segfaults, and -other issues. Even if the binary appears to work, please don't strip. - -See the following quotes from Dave Cheney, which explain this position better -from the upstream Golang perspective. - -### [go issue #5855, comment #3](https://code.google.com/p/go/issues/detail?id=5855#c3) - -> Super super important: Do not strip go binaries or archives. It isn't tested, -> often breaks, and doesn't work. - -### [launchpad golang issue #1200255, comment #8](https://bugs.launchpad.net/ubuntu/+source/golang/+bug/1200255/comments/8) - -> To quote myself: "Please do not strip Go binaries, it is not supported, not -> tested, is often broken, and doesn't do what you want" -> -> To unpack that a bit -> -> * not supported, as in, we don't support it, and recommend against it when -> asked -> * not tested, we don't test stripped binaries as part of the build CI process -> * is often broken, stripping a go binary will produce anywhere from no, to -> subtle, to outright execution failure, see above - -### [launchpad golang issue #1200255, comment #13](https://bugs.launchpad.net/ubuntu/+source/golang/+bug/1200255/comments/13) - -> To clarify my previous statements. -> -> * I do not disagree with the debian policy, it is there for a good reason -> * Having said that, it stripping Go binaries doesn't work, and nobody is -> looking at making it work, so there is that. -> -> Thanks for patching the build formula. - -## Building Docker - -Please use our build script ("./hack/make.sh") for all your compilation of -Docker. If there's something you need that it isn't doing, or something it could -be doing to make your life as a packager easier, please get in touch with Tianon -and help us rectify the situation. Chances are good that other packagers have -probably run into the same problems and a fix might already be in the works, but -none of us will know for sure unless you harass Tianon about it. :) - -All the commands listed within this section should be run with the Docker source -checkout as the current working directory. - -### `AUTO_GOPATH` - -If you'd rather not be bothered with the hassles that setting up `GOPATH` -appropriately can be, and prefer to just get a "build that works", you should -add something similar to this to whatever script or process you're using to -build Docker: - -```bash -export AUTO_GOPATH=1 -``` - -This will cause the build scripts to set up a reasonable `GOPATH` that -automatically and properly includes both docker/docker from the local -directory, and the local "./vendor" directory as necessary. - -### `DOCKER_BUILDTAGS` - -If you're building a binary that may need to be used on platforms that include -AppArmor, you will need to set `DOCKER_BUILDTAGS` as follows: -```bash -export DOCKER_BUILDTAGS='apparmor' -``` - -If you're building a binary that may need to be used on platforms that include -SELinux, you will need to use the `selinux` build tag: -```bash -export DOCKER_BUILDTAGS='selinux' -``` - -If you're building a binary that may need to be used on platforms that include -seccomp, you will need to use the `seccomp` build tag: -```bash -export DOCKER_BUILDTAGS='seccomp' -``` - -There are build tags for disabling graphdrivers as well. By default, support -for all graphdrivers are built in. - -To disable btrfs: -```bash -export DOCKER_BUILDTAGS='exclude_graphdriver_btrfs' -``` - -To disable devicemapper: -```bash -export DOCKER_BUILDTAGS='exclude_graphdriver_devicemapper' -``` - -To disable aufs: -```bash -export DOCKER_BUILDTAGS='exclude_graphdriver_aufs' -``` - -NOTE: if you need to set more than one build tag, space separate them: -```bash -export DOCKER_BUILDTAGS='apparmor selinux exclude_graphdriver_aufs' -``` - -### Static Daemon - -If it is feasible within the constraints of your distribution, you should -seriously consider packaging Docker as a single static binary. A good comparison -is Busybox, which is often packaged statically as a feature to enable mass -portability. Because of the unique way Docker operates, being similarly static -is a "feature". - -To build a static Docker daemon binary, run the following command (first -ensuring that all the necessary libraries are available in static form for -linking - see the "Build Dependencies" section above, and the relevant lines -within Docker's own Dockerfile that set up our official build environment): - -```bash -./hack/make.sh binary -``` - -This will create a static binary under -"./bundles/$VERSION/binary/docker-$VERSION", where "$VERSION" is the contents of -the file "./VERSION". This binary is usually installed somewhere like -"/usr/bin/docker". - -### Dynamic Daemon / Client-only Binary - -If you are only interested in a Docker client binary, you can build using: - -```bash -./hack/make.sh binary-client -``` - -If you need to (due to distro policy, distro library availability, or for other -reasons) create a dynamically compiled daemon binary, or if you are only -interested in creating a client binary for Docker, use something similar to the -following: - -```bash -./hack/make.sh dynbinary-client -``` - -This will create "./bundles/$VERSION/dynbinary-client/docker-$VERSION", which for -client-only builds is the important file to grab and install as appropriate. - -## System Dependencies - -### Runtime Dependencies - -To function properly, the Docker daemon needs the following software to be -installed and available at runtime: - -* iptables version 1.4 or later -* procps (or similar provider of a "ps" executable) -* e2fsprogs version 1.4.12 or later (in use: mkfs.ext4, tune2fs) -* xfsprogs (in use: mkfs.xfs) -* XZ Utils version 4.9 or later -* a [properly - mounted](https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount) - cgroupfs hierarchy (having a single, all-encompassing "cgroup" mount point - [is](https://github.com/docker/docker/issues/2683) - [not](https://github.com/docker/docker/issues/3485) - [sufficient](https://github.com/docker/docker/issues/4568)) - -Additionally, the Docker client needs the following software to be installed and -available at runtime: - -* Git version 1.7 or later - -### Kernel Requirements - -The Docker daemon has very specific kernel requirements. Most pre-packaged -kernels already include the necessary options enabled. If you are building your -own kernel, you will either need to discover the options necessary via trial and -error, or check out the [Gentoo -ebuild](https://github.com/tianon/docker-overlay/blob/master/app-emulation/docker/docker-9999.ebuild), -in which a list is maintained (and if there are any issues or discrepancies in -that list, please contact Tianon so they can be rectified). - -Note that in client mode, there are no specific kernel requirements, and that -the client will even run on alternative platforms such as Mac OS X / Darwin. - -### Optional Dependencies - -Some of Docker's features are activated by using optional command-line flags or -by having support for them in the kernel or userspace. A few examples include: - -* AUFS graph driver (requires AUFS patches/support enabled in the kernel, and at - least the "auplink" utility from aufs-tools) -* BTRFS graph driver (requires BTRFS support enabled in the kernel) -* ZFS graph driver (requires userspace zfs-utils and a corresponding kernel module) -* Libseccomp to allow running seccomp profiles with containers - -## Daemon Init Script - -Docker expects to run as a daemon at machine startup. Your package will need to -include a script for your distro's process supervisor of choice. Be sure to -check out the "contrib/init" folder in case a suitable init script already -exists (and if one does not, contact Tianon about whether it might be -appropriate for your distro's init script to live there too!). - -In general, Docker should be run as root, similar to the following: - -```bash -docker daemon -``` - -Generally, a `DOCKER_OPTS` variable of some kind is available for adding more -flags (such as changing the graph driver to use BTRFS, switching the location of -"/var/lib/docker", etc). - -## Communicate - -As a final note, please do feel free to reach out to Tianon at any time for -pretty much anything. He really does love hearing from our packagers and wants -to make sure we're not being a "hostile upstream". As should be a given, we -appreciate the work our packagers do to make sure we have broad distribution! diff --git a/vendor/github.com/docker/docker/project/PATCH-RELEASES.md b/vendor/github.com/docker/docker/project/PATCH-RELEASES.md deleted file mode 100644 index 548db9ab4..000000000 --- a/vendor/github.com/docker/docker/project/PATCH-RELEASES.md +++ /dev/null @@ -1,68 +0,0 @@ -# Docker patch (bugfix) release process - -Patch releases (the 'Z' in vX.Y.Z) are intended to fix major issues in a -release. Docker open source projects follow these procedures when creating a -patch release; - -After each release (both "major" (vX.Y.0) and "patch" releases (vX.Y.Z)), a -patch release milestone (vX.Y.Z + 1) is created. - -The creation of a patch release milestone is no obligation to actually -*create* a patch release. The purpose of these milestones is to collect -issues and pull requests that can *justify* a patch release; - -- Any maintainer is allowed to add issues and PR's to the milestone, when - doing so, preferably leave a comment on the issue or PR explaining *why* - you think it should be considered for inclusion in a patch release. -- Issues introduced in version vX.Y.0 get added to milestone X.Y.Z+1 -- Only *regressions* should be added. Issues *discovered* in version vX.Y.0, - but already present in version vX.Y-1.Z should not be added, unless - critical. -- Patch releases can *only* contain bug-fixes. New features should - *never* be added to a patch release. - -The release captain of the "major" (X.Y.0) release, is also responsible for -patch releases. The release captain, together with another maintainer, will -review issues and PRs on the milestone, and assigns `priority/`labels. These -review sessions take place on a weekly basis, more frequent if needed: - -- A P0 priority is assigned to critical issues. A maintainer *must* be - assigned to these issues. Maintainers should strive to fix a P0 within a week. -- A P1 priority is assigned to major issues, but not critical. A maintainer - *must* be assigned to these issues. -- P2 and P3 priorities are assigned to other issues. A maintainer can be - assigned. -- Non-critical issues and PR's can be removed from the milestone. Minor - changes, such as typo-fixes or omissions in the documentation can be - considered for inclusion in a patch release. - -## Deciding if a patch release should be done - -- Only a P0 can justify to proceed with the patch release. -- P1, P2, and P3 issues/PR's should not influence the decision, and - should be moved to the X.Y.Z+1 milestone, or removed from the - milestone. - -> **Note**: If the next "major" release is imminent, the release captain -> can decide to cancel a patch release, and include the patches in the -> upcoming major release. - -> **Note**: Security releases are also "patch releases", but follow -> a different procedure. Security releases are developed in a private -> repository, released and tested under embargo before they become -> publicly available. - -## Deciding on the content of a patch release - -When the criteria for moving forward with a patch release are met, the release -manager will decide on the exact content of the release. - -- Fixes to all P0 issues *must* be included in the release. -- Fixes to *some* P1, P2, and P3 issues *may* be included as part of the patch - release depending on the severity of the issue and the risk associated with - the patch. - -Any code delivered as part of a patch release should make life easier for a -significant amount of users with zero chance of degrading anybody's experience. -A good rule of thumb for that is to limit cherry-picking to small patches, which -fix well-understood issues, and which come with verifiable tests. diff --git a/vendor/github.com/docker/docker/project/PRINCIPLES.md b/vendor/github.com/docker/docker/project/PRINCIPLES.md deleted file mode 100644 index 53f03018e..000000000 --- a/vendor/github.com/docker/docker/project/PRINCIPLES.md +++ /dev/null @@ -1,19 +0,0 @@ -# Docker principles - -In the design and development of Docker we try to follow these principles: - -(Work in progress) - -* Don't try to replace every tool. Instead, be an ingredient to improve them. -* Less code is better. -* Fewer components are better. Do you really need to add one more class? -* 50 lines of straightforward, readable code is better than 10 lines of magic that nobody can understand. -* Don't do later what you can do now. "//FIXME: refactor" is not acceptable in new code. -* When hesitating between 2 options, choose the one that is easier to reverse. -* No is temporary, Yes is forever. If you're not sure about a new feature, say no. You can change your mind later. -* Containers must be portable to the greatest possible number of machines. Be suspicious of any change which makes machines less interchangeable. -* The less moving parts in a container, the better. -* Don't merge it unless you document it. -* Don't document it unless you can keep it up-to-date. -* Don't merge it unless you test it! -* Everyone's problem is slightly different. Focus on the part that is the same for everyone, and solve that. diff --git a/vendor/github.com/docker/docker/project/README.md b/vendor/github.com/docker/docker/project/README.md deleted file mode 100644 index 3ed68cf29..000000000 --- a/vendor/github.com/docker/docker/project/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Hacking on Docker - -The `project/` directory holds information and tools for everyone involved in the process of creating and -distributing Docker, specifically: - -## Guides - -If you're a *contributor* or aspiring contributor, you should read [CONTRIBUTORS.md](../CONTRIBUTING.md). - -If you're a *maintainer* or aspiring maintainer, you should read [MAINTAINERS](../MAINTAINERS). - -If you're a *packager* or aspiring packager, you should read [PACKAGERS.md](./PACKAGERS.md). - -If you're a maintainer in charge of a *release*, you should read [RELEASE-CHECKLIST.md](./RELEASE-CHECKLIST.md). - -## Roadmap - -A high-level roadmap is available at [ROADMAP.md](../ROADMAP.md). - - -## Build tools - -[hack/make.sh](../hack/make.sh) is the primary build tool for docker. It is used for compiling the official binary, -running the test suite, and pushing releases. diff --git a/vendor/github.com/docker/docker/project/RELEASE-CHECKLIST.md b/vendor/github.com/docker/docker/project/RELEASE-CHECKLIST.md deleted file mode 100644 index 84848cae2..000000000 --- a/vendor/github.com/docker/docker/project/RELEASE-CHECKLIST.md +++ /dev/null @@ -1,518 +0,0 @@ -# Release Checklist -## A maintainer's guide to releasing Docker - -So you're in charge of a Docker release? Cool. Here's what to do. - -If your experience deviates from this document, please document the changes -to keep it up-to-date. - -It is important to note that this document assumes that the git remote in your -repository that corresponds to "https://github.com/docker/docker" is named -"origin". If yours is not (for example, if you've chosen to name it "upstream" -or something similar instead), be sure to adjust the listed snippets for your -local environment accordingly. If you are not sure what your upstream remote is -named, use a command like `git remote -v` to find out. - -If you don't have an upstream remote, you can add one easily using something -like: - -```bash -export GITHUBUSER="YOUR_GITHUB_USER" -git remote add origin https://github.com/docker/docker.git -git remote add $GITHUBUSER git@github.com:$GITHUBUSER/docker.git -``` - -### 1. Pull from master and create a release branch - -All releases version numbers will be of the form: vX.Y.Z where X is the major -version number, Y is the minor version number and Z is the patch release version number. - -#### Major releases - -The release branch name is just vX.Y because it's going to be the basis for all .Z releases. - -```bash -export BASE=vX.Y -export VERSION=vX.Y.Z -git fetch origin -git checkout --track origin/master -git checkout -b release/$BASE -``` - -This new branch is going to be the base for the release. We need to push it to origin so we -can track the cherry-picked changes and the version bump: - -```bash -git push origin release/$BASE -``` - -When you have the major release branch in origin, we need to create the bump fork branch -that we'll push to our fork: - -```bash -git checkout -b bump_$VERSION -``` - -#### Patch releases - -If we have the release branch in origin, we can create the forked bump branch from it directly: - -```bash -export VERSION=vX.Y.Z -export PATCH=vX.Y.Z+1 -git fetch origin -git checkout --track origin/release/$BASE -git checkout -b bump_$PATCH -``` - -We cherry-pick only the commits we want into the bump branch: - -```bash -# get the commits ids we want to cherry-pick -git log -# cherry-pick the commits starting from the oldest one, without including merge commits -git cherry-pick -s -x -git cherry-pick -s -x -... -``` - -### 2. Update the VERSION files and API version on master - -We don't want to stop contributions to master just because we are releasing. -So, after the release branch is up, we bump the VERSION and API version to mark -the start of the "next" release. - -#### 2.1 Update the VERSION files - -Update the content of the `VERSION` file to be the next minor (incrementing Y) -and add the `-dev` suffix. For example, after the release branch for 1.5.0 is -created, the `VERSION` file gets updated to `1.6.0-dev` (as in "1.6.0 in the -making"). - -#### 2.2 Update API version on master - -We don't want API changes to go to the now frozen API version. Create a new -entry in `docs/reference/api/` by copying the latest and bumping the version -number (in both the file's name and content), and submit this in a PR against -master. - -### 3. Update CHANGELOG.md - -You can run this command for reference with git 2.0: - -```bash -git fetch --tags -LAST_VERSION=$(git tag -l --sort=-version:refname "v*" | grep -E 'v[0-9\.]+$' | head -1) -git log --stat $LAST_VERSION..bump_$VERSION -``` - -If you don't have git 2.0 but have a sort command that supports `-V`: -```bash -git fetch --tags -LAST_VERSION=$(git tag -l | grep -E 'v[0-9\.]+$' | sort -rV | head -1) -git log --stat $LAST_VERSION..bump_$VERSION -``` - -If releasing a major version (X or Y increased in vX.Y.Z), simply listing notable user-facing features is sufficient. -```markdown -#### Notable features since -* New docker command to do something useful -* Engine API change (deprecating old version) -* Performance improvements in some usecases -* ... -``` - -For minor releases (only Z increases in vX.Y.Z), provide a list of user-facing changes. -Each change should be listed under a category heading formatted as `#### CATEGORY`. - -`CATEGORY` should describe which part of the project is affected. - Valid categories are: - * Builder - * Documentation - * Hack - * Packaging - * Engine API - * Runtime - * Other (please use this category sparingly) - -Each change should be formatted as `BULLET DESCRIPTION`, given: - -* BULLET: either `-`, `+` or `*`, to indicate a bugfix, new feature or - upgrade, respectively. - -* DESCRIPTION: a concise description of the change that is relevant to the - end-user, using the present tense. Changes should be described in terms - of how they affect the user, for example "Add new feature X which allows Y", - "Fix bug which caused X", "Increase performance of Y". - -EXAMPLES: - -```markdown -## 0.3.6 (1995-12-25) - -#### Builder - -+ 'docker build -t FOO .' applies the tag FOO to the newly built image - -#### Engine API - -- Fix a bug in the optional unix socket transport - -#### Runtime - -* Improve detection of kernel version -``` - -If you need a list of contributors between the last major release and the -current bump branch, use something like: -```bash -git log --format='%aN <%aE>' v0.7.0...bump_v0.8.0 | sort -uf -``` -Obviously, you'll need to adjust version numbers as necessary. If you just need -a count, add a simple `| wc -l`. - -### 4. Change the contents of the VERSION file - -Before the big thing, you'll want to make successive release candidates and get -people to test. The release candidate number `N` should be part of the version: - -```bash -export RC_VERSION=${VERSION}-rcN -echo ${RC_VERSION#v} > VERSION -``` - -### 5. Test the docs - -Make sure that your tree includes documentation for any modified or -new features, syntax or semantic changes. - -To test locally: - -```bash -make docs -``` - -To make a shared test at https://beta-docs.docker.io: - -(You will need the `awsconfig` file added to the `docs/` dir) - -```bash -make AWS_S3_BUCKET=beta-docs.docker.io BUILD_ROOT=yes docs-release -``` - -### 6. Commit and create a pull request to the "release" branch - -```bash -git add VERSION CHANGELOG.md -git commit -m "Bump version to $VERSION" -git push $GITHUBUSER bump_$VERSION -echo "https://github.com/$GITHUBUSER/docker/compare/docker:release/$BASE...$GITHUBUSER:bump_$VERSION?expand=1" -``` - -That last command will give you the proper link to visit to ensure that you -open the PR against the "release" branch instead of accidentally against -"master" (like so many brave souls before you already have). - -### 7. Create a PR to update the AUTHORS file for the release - -Update the AUTHORS file, by running the `hack/generate-authors.sh` on the -release branch. To prevent duplicate entries, you may need to update the -`.mailmap` file accordingly. - -### 8. Build release candidate rpms and debs - -**NOTE**: It will be a lot faster if you pass a different graphdriver with -`DOCKER_GRAPHDRIVER` than `vfs`. - -```bash -docker build -t docker . -docker run \ - --rm -t --privileged \ - -e DOCKER_GRAPHDRIVER=aufs \ - -v $(pwd)/bundles:/go/src/github.com/docker/docker/bundles \ - docker \ - hack/make.sh binary build-deb build-rpm -``` - -### 9. Publish release candidate rpms and debs - -With the rpms and debs you built from the last step you can release them on the -same server, or ideally, move them to a dedicated release box via scp into -another docker/docker directory in bundles. This next step assumes you have -a checkout of the docker source code at the same commit you used to build, with -the artifacts from the last step in `bundles`. - -**NOTE:** If you put a space before the command your `.bash_history` will not -save it. (for the `GPG_PASSPHRASE`). - -```bash -docker build -t docker . -docker run --rm -it --privileged \ - -v /volumes/repos:/volumes/repos \ - -v $(pwd)/bundles:/go/src/github.com/docker/docker/bundles \ - -v $HOME/.gnupg:/root/.gnupg \ - -e DOCKER_RELEASE_DIR=/volumes/repos \ - -e GPG_PASSPHRASE \ - -e KEEPBUNDLE=1 \ - docker \ - hack/make.sh release-deb release-rpm sign-repos generate-index-listing -``` - -### 10. Upload the changed repos to wherever you host - -For example, above we bind mounted `/volumes/repos` as the storage for -`DOCKER_RELEASE_DIR`. In this case `/volumes/repos/apt` can be synced with -a specific s3 bucket for the apt repo and `/volumes/repos/yum` can be synced with -a s3 bucket for the yum repo. - -### 11. Publish release candidate binaries - -To run this you will need access to the release credentials. Get them from the -Core maintainers. - -```bash -docker build -t docker . - -# static binaries are still pushed to s3 -docker run \ - -e AWS_S3_BUCKET=test.docker.com \ - -e AWS_ACCESS_KEY_ID \ - -e AWS_SECRET_ACCESS_KEY \ - -e AWS_DEFAULT_REGION \ - -i -t --privileged \ - docker \ - hack/release.sh -``` - -It will run the test suite, build the binaries and upload to the specified bucket, -so this is a good time to verify that you're running against **test**.docker.com. - -### 12. Purge the cache! - -After the binaries are uploaded to test.docker.com and the packages are on -apt.dockerproject.org and yum.dockerproject.org, make sure -they get tested in both Ubuntu and Debian for any obvious installation -issues or runtime issues. - -If everything looks good, it's time to create a git tag for this candidate: - -```bash -git tag -a $RC_VERSION -m $RC_VERSION bump_$VERSION -git push origin $RC_VERSION -``` - -Announcing on multiple medias is the best way to get some help testing! An easy -way to get some useful links for sharing: - -```bash -echo "Ubuntu/Debian: curl -sSL https://test.docker.com/ | sh" -echo "Linux 64bit binary: https://test.docker.com/builds/Linux/x86_64/docker-${VERSION#v}" -echo "Darwin/OSX 64bit client binary: https://test.docker.com/builds/Darwin/x86_64/docker-${VERSION#v}" -echo "Linux 64bit tgz: https://test.docker.com/builds/Linux/x86_64/docker-${VERSION#v}.tgz" -echo "Windows 64bit client binary: https://test.docker.com/builds/Windows/x86_64/docker-${VERSION#v}.exe" -echo "Windows 32bit client binary: https://test.docker.com/builds/Windows/i386/docker-${VERSION#v}.exe" -``` - -We recommend announcing the release candidate on: - -- IRC on #docker, #docker-dev, #docker-maintainers -- In a comment on the pull request to notify subscribed people on GitHub -- The [docker-dev](https://groups.google.com/forum/#!forum/docker-dev) group -- The [docker-maintainers](https://groups.google.com/a/dockerproject.org/forum/#!forum/maintainers) group -- Any social media that can bring some attention to the release candidate - -### 13. Iterate on successive release candidates - -Spend several days along with the community explicitly investing time and -resources to try and break Docker in every possible way, documenting any -findings pertinent to the release. This time should be spent testing and -finding ways in which the release might have caused various features or upgrade -environments to have issues, not coding. During this time, the release is in -code freeze, and any additional code changes will be pushed out to the next -release. - -It should include various levels of breaking Docker, beyond just using Docker -by the book. - -Any issues found may still remain issues for this release, but they should be -documented and give appropriate warnings. - -During this phase, the `bump_$VERSION` branch will keep evolving as you will -produce new release candidates. The frequency of new candidates is up to the -release manager: use your best judgement taking into account the severity of -reported issues, testers availability, and time to scheduled release date. - -Each time you'll want to produce a new release candidate, you will start by -adding commits to the branch, usually by cherry-picking from master: - -```bash -git cherry-pick -s -x -m0 -``` - -You want your "bump commit" (the one that updates the CHANGELOG and VERSION -files) to remain on top, so you'll have to `git rebase -i` to bring it back up. - -Now that your bump commit is back on top, you will need to update the CHANGELOG -file (if appropriate for this particular release candidate), and update the -VERSION file to increment the RC number: - -```bash -export RC_VERSION=$VERSION-rcN -echo $RC_VERSION > VERSION -``` - -You can now amend your last commit and update the bump branch: - -```bash -git commit --amend -git push -f $GITHUBUSER bump_$VERSION -``` - -Repeat step 6 to tag the code, publish new binaries, announce availability, and -get help testing. - -### 14. Finalize the bump branch - -When you're happy with the quality of a release candidate, you can move on and -create the real thing. - -You will first have to amend the "bump commit" to drop the release candidate -suffix in the VERSION file: - -```bash -echo $VERSION > VERSION -git add VERSION -git commit --amend -``` - -You will then repeat step 6 to publish the binaries to test - -### 15. Get 2 other maintainers to validate the pull request - -### 16. Build final rpms and debs - -```bash -docker build -t docker . -docker run \ - --rm -t --privileged \ - -v $(pwd)/bundles:/go/src/github.com/docker/docker/bundles \ - docker \ - hack/make.sh binary build-deb build-rpm -``` - -### 17. Publish final rpms and debs - -With the rpms and debs you built from the last step you can release them on the -same server, or ideally, move them to a dedicated release box via scp into -another docker/docker directory in bundles. This next step assumes you have -a checkout of the docker source code at the same commit you used to build, with -the artifacts from the last step in `bundles`. - -**NOTE:** If you put a space before the command your `.bash_history` will not -save it. (for the `GPG_PASSPHRASE`). - -```bash -docker build -t docker . -docker run --rm -it --privileged \ - -v /volumes/repos:/volumes/repos \ - -v $(pwd)/bundles:/go/src/github.com/docker/docker/bundles \ - -v $HOME/.gnupg:/root/.gnupg \ - -e DOCKER_RELEASE_DIR=/volumes/repos \ - -e GPG_PASSPHRASE \ - -e KEEPBUNDLE=1 \ - docker \ - hack/make.sh release-deb release-rpm sign-repos generate-index-listing -``` - -### 18. Upload the changed repos to wherever you host - -For example, above we bind mounted `/volumes/repos` as the storage for -`DOCKER_RELEASE_DIR`. In this case `/volumes/repos/apt` can be synced with -a specific s3 bucket for the apt repo and `/volumes/repos/yum` can be synced with -a s3 bucket for the yum repo. - -### 19. Publish final binaries - -Once they're tested and reasonably believed to be working, run against -get.docker.com: - -```bash -docker build -t docker . -# static binaries are still pushed to s3 -docker run \ - -e AWS_S3_BUCKET=get.docker.com \ - -e AWS_ACCESS_KEY_ID \ - -e AWS_SECRET_ACCESS_KEY \ - -e AWS_DEFAULT_REGION \ - -i -t --privileged \ - docker \ - hack/release.sh -``` - -### 20. Purge the cache! - -### 21. Apply tag and create release - -It's very important that we don't make the tag until after the official -release is uploaded to get.docker.com! - -```bash -git tag -a $VERSION -m $VERSION bump_$VERSION -git push origin $VERSION -``` - -Once the tag is pushed, go to GitHub and create a [new release](https://github.com/docker/docker/releases/new). -If the tag is for an RC make sure you check `This is a pre-release` at the bottom of the form. - -Select the tag that you just pushed as the version and paste the changelog in the description of the release. -You can see examples in this two links: - -https://github.com/docker/docker/releases/tag/v1.8.0 -https://github.com/docker/docker/releases/tag/v1.8.0-rc3 - -### 22. Go to github to merge the `bump_$VERSION` branch into release - -Don't forget to push that pretty blue button to delete the leftover -branch afterwards! - -### 23. Update the docs branch - -You will need to point the docs branch to the newly created release tag: - -```bash -git checkout origin/docs -git reset --hard origin/$VERSION -git push -f origin docs -``` - -The docs will appear on https://docs.docker.com/ (though there may be cached -versions, so its worth checking http://docs.docker.com.s3-website-us-east-1.amazonaws.com/). -For more information about documentation releases, see `docs/README.md`. - -Note that the new docs will not appear live on the site until the cache (a complex, -distributed CDN system) is flushed. The `make docs-release` command will do this -_if_ the `DISTRIBUTION_ID` is set correctly - this will take at least 15 minutes to run -and you can check its progress with the CDN Cloudfront Chrome addon. - -### 24. Create a new pull request to merge your bump commit back into master - -```bash -git checkout master -git fetch -git reset --hard origin/master -git cherry-pick -s -x $VERSION -git push $GITHUBUSER merge_release_$VERSION -echo "https://github.com/$GITHUBUSER/docker/compare/docker:master...$GITHUBUSER:merge_release_$VERSION?expand=1" -``` - -Again, get two maintainers to validate, then merge, then push that pretty -blue button to delete your branch. - -### 25. Rejoice and Evangelize! - -Congratulations! You're done. - -Go forth and announce the glad tidings of the new release in `#docker`, -`#docker-dev`, on the [dev mailing list](https://groups.google.com/forum/#!forum/docker-dev), -the [announce mailing list](https://groups.google.com/forum/#!forum/docker-announce), -and on Twitter! diff --git a/vendor/github.com/docker/docker/project/RELEASE-PROCESS.md b/vendor/github.com/docker/docker/project/RELEASE-PROCESS.md deleted file mode 100644 index d764e9d00..000000000 --- a/vendor/github.com/docker/docker/project/RELEASE-PROCESS.md +++ /dev/null @@ -1,78 +0,0 @@ -# Docker Release Process - -This document describes how the Docker project is released. The Docker project -release process targets the Engine, Compose, Kitematic, Machine, Swarm, -Distribution, Notary and their underlying dependencies (libnetwork, libkv, -etc...). - -Step-by-step technical details of the process are described in -[RELEASE-CHECKLIST.md](https://github.com/docker/docker/blob/master/project/RELEASE-CHECKLIST.md). - -## Release cycle - -The Docker project follows a **time-based release cycle** and ships every nine -weeks. A release cycle starts the same day the previous release cycle ends. - -The first six weeks of the cycle are dedicated to development and review. During -this phase, new features and bugfixes submitted to any of the projects are -**eligible** to be shipped as part of the next release. No changeset submitted -during this period is however guaranteed to be merged for the current release -cycle. - -## The freeze period - -Six weeks after the beginning of the cycle, the codebase is officially frozen -and the codebase reaches a state close to the final release. A Release Candidate -(RC) gets created at the same time. The freeze period is used to find bugs and -get feedback on the state of the RC before the release. - -During this freeze period, while the `master` branch will continue its normal -development cycle, no new features are accepted into the RC. As bugs are fixed -in `master` the release owner will selectively 'cherry-pick' critical ones to -be included into the RC. As the RC changes, new ones are made available for the -community to test and review. - -This period lasts for three weeks. - -## How to maximize chances of being merged before the freeze date? - -First of all, there is never a guarantee that a specific changeset is going to -be merged. However there are different actions to follow to maximize the chances -for a changeset to be merged: - -- The team gives priority to review the PRs aligned with the Roadmap (usually -defined by a ROADMAP.md file at the root of the repository). -- The earlier a PR is opened, the more time the maintainers have to review. For -example, if a PR is opened the day before the freeze date, it’s very unlikely -that it will be merged for the release. -- Constant communication with the maintainers (mailing-list, IRC, Github issues, -etc.) allows to get early feedback on the design before getting into the -implementation, which usually reduces the time needed to discuss a changeset. -- If the code is commented, fully tested and by extension follows every single -rules defined by the [CONTRIBUTING guide]( -https://github.com/docker/docker/blob/master/CONTRIBUTING.md), this will help -the maintainers by speeding up the review. - -## The release - -At the end of the freeze (nine weeks after the start of the cycle), all the -projects are released together. - -``` - Codebase Release -Start of is frozen (end of the -the Cycle (7th week) 9th week) -+---------------------------------------+---------------------+ -| | | -| Development phase | Freeze phase | -| | | -+---------------------------------------+---------------------+ - 6 weeks 3 weeks -<---------------------------------------><--------------------> -``` - -## Exceptions - -If a critical issue is found at the end of the freeze period and more time is -needed to address it, the release will be pushed back. When a release gets -pushed back, the next release cycle gets delayed as well. diff --git a/vendor/github.com/docker/docker/project/REVIEWING.md b/vendor/github.com/docker/docker/project/REVIEWING.md deleted file mode 100644 index 51ef4c59d..000000000 --- a/vendor/github.com/docker/docker/project/REVIEWING.md +++ /dev/null @@ -1,246 +0,0 @@ -# Pull request reviewing process - -## Labels - -Labels are carefully picked to optimize for: - - - Readability: maintainers must immediately know the state of a PR - - Filtering simplicity: different labels represent many different aspects of - the reviewing work, and can even be targeted at different maintainers groups. - -A pull request should only be attributed labels documented in this section: other labels that may -exist on the repository should apply to issues. - -### DCO labels - - * `dco/no`: automatically set by a bot when one of the commits lacks proper signature - -### Status labels - - * `status/0-triage` - * `status/1-design-review` - * `status/2-code-review` - * `status/3-docs-review` - * `status/4-ready-to-merge` - -Special status labels: - - * `status/failing-ci`: indicates that the PR in its current state fails the test suite - * `status/needs-attention`: calls for a collective discussion during a review session - -### Impact labels (apply to merged pull requests) - - * `impact/api` - * `impact/changelog` - * `impact/cli` - * `impact/deprecation` - * `impact/distribution` - * `impact/dockerfile` - -### Process labels (apply to merged pull requests) - -Process labels are to assist in preparing (patch) releases. These labels should only be used for pull requests. - -Label | Use for -------------------------------- | ------------------------------------------------------------------------- -`process/cherry-pick` | PRs that should be cherry-picked in the bump/release branch. These pull-requests must also be assigned to a milestone. -`process/cherry-picked` | PRs that have been cherry-picked. This label is helpful to find PR's that have been added to release-candidates, and to update the change log -`process/docs-cherry-pick` | PRs that should be cherry-picked in the docs branch. Only apply this label for changes that apply to the *current* release, and generic documentation fixes, such as Markdown and spelling fixes. -`process/docs-cherry-picked` | PRs that have been cherry-picked in the docs branch -`process/merge-to-master` | PRs that are opened directly on the bump/release branch, but also need to be merged back to "master" -`process/merged-to-master` | PRs that have been merged back to "master" - - -## Workflow - -An opened pull request can be in 1 of 5 distinct states, for each of which there is a corresponding -label that needs to be applied. - -### Triage - `status/0-triage` - -Maintainers are expected to triage new incoming pull requests by removing the `status/0-triage` -label and adding the correct labels (e.g. `status/1-design-review`) before any other interaction -with the PR. The starting label may potentially skip some steps depending on the kind of pull -request: use your best judgement. - -Maintainers should perform an initial, high-level, overview of the pull request before moving it to -the next appropriate stage: - - - Has DCO - - Contains sufficient justification (e.g., usecases) for the proposed change - - References the Github issue it fixes (if any) in the commit or the first Github comment - -Possible transitions from this state: - - * Close: e.g., unresponsive contributor without DCO - * `status/1-design-review`: general case - * `status/2-code-review`: e.g. trivial bugfix - * `status/3-docs-review`: non-proposal documentation-only change - -### Design review - `status/1-design-review` - -Maintainers are expected to comment on the design of the pull request. Review of documentation is -expected only in the context of design validation, not for stylistic changes. - -Ideally, documentation should reflect the expected behavior of the code. No code review should -take place in this step. - -There are no strict rules on the way a design is validated: we usually aim for a consensus, -although a single maintainer approval is often sufficient for obviously reasonable changes. In -general, strong disagreement expressed by any of the maintainers should not be taken lightly. - -Once design is approved, a maintainer should make sure to remove this label and add the next one. - -Possible transitions from this state: - - * Close: design rejected - * `status/2-code-review`: general case - * `status/3-docs-review`: proposals with only documentation changes - -### Code review - `status/2-code-review` - -Maintainers are expected to review the code and ensure that it is good quality and in accordance -with the documentation in the PR. - -New testcases are expected to be added. Ideally, those testcases should fail when the new code is -absent, and pass when present. The testcases should strive to test as many variants, code paths, as -possible to ensure maximum coverage. - -Changes to code must be reviewed and approved (LGTM'd) by a minimum of two code maintainers. When -the author of a PR is a maintainer, he still needs the approval of two other maintainers. - -Once code is approved according to the rules of the subsystem, a maintainer should make sure to -remove this label and add the next one. If documentation is absent but expected, maintainers should -ask for documentation and move to status `status/3-docs-review` for docs maintainer to follow. - -Possible transitions from this state: - - * Close - * `status/1-design-review`: new design concerns are raised - * `status/3-docs-review`: general case - * `status/4-ready-to-merge`: change not impacting documentation - -### Docs review - `status/3-docs-review` - -Maintainers are expected to review the documentation in its bigger context, ensuring consistency, -completeness, validity, and breadth of coverage across all existing and new documentation. - -They should ask for any editorial change that makes the documentation more consistent and easier to -understand. - -The docker/docker repository only contains _reference documentation_, all -"narrative" documentation is kept in a [unified documentation -repository](https://github.com/docker/docker.github.io). Reviewers must -therefore verify which parts of the documentation need to be updated. Any -contribution that may require changing the narrative should get the -`impact/documentation` label: this is the signal for documentation maintainers -that a change will likely need to happen on the unified documentation -repository. When in doubt, it’s better to add the label and leave it to -documentation maintainers to decide whether it’s ok to skip. In all cases, -leave a comment to explain what documentation changes you think might be needed. - -- If the pull request does not impact the documentation at all, the docs review - step is skipped, and the pull request is ready to merge. -- If the changes in - the pull request require changes to the reference documentation (either - command-line reference, or API reference), those changes must be included as - part of the pull request and will be reviewed now. Keep in mind that the - narrative documentation may contain output examples of commands, so may need - to be updated as well, in which case the `impact/documentation` label must - be applied. -- If the PR has the `impact/documentation` label, merging is delayed until a - documentation maintainer acknowledges that a corresponding documentation PR - (or issue) is opened on the documentation repository. Once a documentation - maintainer acknowledges the change, she/he will move the PR to `status/4-merge` - for a code maintainer to push the green button. - -Changes and additions to docs must be reviewed and approved (LGTM'd) by a minimum of two docs -sub-project maintainers. If the docs change originates with a docs maintainer, only one additional -LGTM is required (since we assume a docs maintainer approves of their own PR). - -Once documentation is approved, a maintainer should make sure to remove this label and -add the next one. - -Possible transitions from this state: - - * Close - * `status/1-design-review`: new design concerns are raised - * `status/2-code-review`: requires more code changes - * `status/4-ready-to-merge`: general case - -### Merge - `status/4-ready-to-merge` - -Maintainers are expected to merge this pull request as soon as possible. They can ask for a rebase -or carry the pull request themselves. - -Possible transitions from this state: - - * Merge: general case - * Close: carry PR - -After merging a pull request, the maintainer should consider applying one or multiple impact labels -to ease future classification: - - * `impact/api` signifies the patch impacted the Engine API - * `impact/changelog` signifies the change is significant enough to make it in the changelog - * `impact/cli` signifies the patch impacted a CLI command - * `impact/dockerfile` signifies the patch impacted the Dockerfile syntax - * `impact/deprecation` signifies the patch participates in deprecating an existing feature - -### Close - -If a pull request is closed it is expected that sufficient justification will be provided. In -particular, if there are alternative ways of achieving the same net result then those needs to be -spelled out. If the pull request is trying to solve a use case that is not one that we (as a -community) want to support then a justification for why should be provided. - -The number of maintainers it takes to decide and close a PR is deliberately left unspecified. We -assume that the group of maintainers is bound by mutual trust and respect, and that opposition from -any single maintainer should be taken into consideration. Similarly, we expect maintainers to -justify their reasoning and to accept debating. - -## Escalation process - -Despite the previously described reviewing process, some PR might not show any progress for various -reasons: - - - No strong opinion for or against the proposed patch - - Debates about the proper way to solve the problem at hand - - Lack of consensus - - ... - -All these will eventually lead to stalled PR, where no apparent progress is made across several -weeks, or even months. - -Maintainers should use their best judgement and apply the `status/needs-attention` label. It must -be used sparingly, as each PR with such label will be discussed by a group of maintainers during a -review session. The goal of that session is to agree on one of the following outcomes for the PR: - - * Close, explaining the rationale for not pursuing further - * Continue, either by pushing the PR further in the workflow, or by deciding to carry the patch - (ideally, a maintainer should be immediately assigned to make sure that the PR keeps continued - attention) - * Escalate to Solomon by formulating a few specific questions on which his answers will allow - maintainers to decide. - -## Milestones - -Typically, every merged pull request get shipped naturally with the next release cut from the -`master` branch (either the next minor or major version, as indicated by the -[`VERSION`](https://github.com/docker/docker/blob/master/VERSION) file at the root of the -repository). However, the time-based nature of the release process provides no guarantee that a -given pull request will get merged in time. In other words, all open pull requests are implicitly -considered part of the next minor or major release milestone, and this won't be materialized on -GitHub. - -A merged pull request must be attached to the milestone corresponding to the release in which it -will be shipped: this is both useful for tracking, and to help the release manager with the -changelog generation. - -An open pull request may exceptionally get attached to a milestone to express a particular intent to -get it merged in time for that release. This may for example be the case for an important feature to -be included in a minor release, or a critical bugfix to be included in a patch release. - -Finally, and as documented by the [`PATCH-RELEASES.md`](PATCH-RELEASES.md) process, the existence of -a milestone is not a guarantee that a release will happen, as some milestones will be created purely -for the purpose of bookkeeping diff --git a/vendor/github.com/docker/docker/project/TOOLS.md b/vendor/github.com/docker/docker/project/TOOLS.md deleted file mode 100644 index 26303c302..000000000 --- a/vendor/github.com/docker/docker/project/TOOLS.md +++ /dev/null @@ -1,63 +0,0 @@ -# Tools - -This page describes the tools we use and infrastructure that is in place for -the Docker project. - -### CI - -The Docker project uses [Jenkins](https://jenkins.dockerproject.org/) as our -continuous integration server. Each Pull Request to Docker is tested by running the -equivalent of `make all`. We chose Jenkins because we can host it ourselves and -we run Docker in Docker to test. - -#### Leeroy - -Leeroy is a Go application which integrates Jenkins with -GitHub pull requests. Leeroy uses -[GitHub hooks](https://developer.github.com/v3/repos/hooks/) -to listen for pull request notifications and starts jobs on your Jenkins -server. Using the Jenkins -[notification plugin][https://wiki.jenkins-ci.org/display/JENKINS/Notification+Plugin], -Leeroy updates the pull request using GitHub's -[status API](https://developer.github.com/v3/repos/statuses/) -with pending, success, failure, or error statuses. - -The leeroy repository is maintained at -[github.com/docker/leeroy](https://github.com/docker/leeroy). - -#### GordonTheTurtle IRC Bot - -The GordonTheTurtle IRC Bot lives in the -[#docker-maintainers](https://botbot.me/freenode/docker-maintainers/) channel -on Freenode. He is built in Go and is based off the project at -[github.com/fabioxgn/go-bot](https://github.com/fabioxgn/go-bot). - -His main command is `!rebuild`, which rebuilds a given Pull Request for a repository. -This command works by integrating with Leroy. He has a few other commands too, such -as `!gif` or `!godoc`, but we are always looking for more fun commands to add. - -The gordon-bot repository is maintained at -[github.com/docker/gordon-bot](https://github.com/docker/gordon-bot) - -### NSQ - -We use [NSQ](https://github.com/bitly/nsq) for various aspects of the project -infrastructure. - -#### Hooks - -The hooks project, -[github.com/crosbymichael/hooks](https://github.com/crosbymichael/hooks), -is a small Go application that manages web hooks from github, hub.docker.com, or -other third party services. - -It can be used for listening to github webhooks & pushing them to a queue, -archiving hooks to rethinkdb for processing, and broadcasting hooks to various -jobs. - -#### Docker Master Binaries - -One of the things queued from the Hooks are the building of the Master -Binaries. This happens on every push to the master branch of Docker. The -repository for this is maintained at -[github.com/docker/docker-bb](https://github.com/docker/docker-bb). diff --git a/vendor/github.com/docker/docker/reference/reference.go b/vendor/github.com/docker/docker/reference/reference.go deleted file mode 100644 index 996fc5070..000000000 --- a/vendor/github.com/docker/docker/reference/reference.go +++ /dev/null @@ -1,216 +0,0 @@ -package reference - -import ( - "errors" - "fmt" - "strings" - - "github.com/docker/distribution/digest" - distreference "github.com/docker/distribution/reference" - "github.com/docker/docker/image/v1" -) - -const ( - // DefaultTag defines the default tag used when performing images related actions and no tag or digest is specified - DefaultTag = "latest" - // DefaultHostname is the default built-in hostname - DefaultHostname = "docker.io" - // LegacyDefaultHostname is automatically converted to DefaultHostname - LegacyDefaultHostname = "index.docker.io" - // DefaultRepoPrefix is the prefix used for default repositories in default host - DefaultRepoPrefix = "library/" -) - -// Named is an object with a full name -type Named interface { - // Name returns normalized repository name, like "ubuntu". - Name() string - // String returns full reference, like "ubuntu@sha256:abcdef..." - String() string - // FullName returns full repository name with hostname, like "docker.io/library/ubuntu" - FullName() string - // Hostname returns hostname for the reference, like "docker.io" - Hostname() string - // RemoteName returns the repository component of the full name, like "library/ubuntu" - RemoteName() string -} - -// NamedTagged is an object including a name and tag. -type NamedTagged interface { - Named - Tag() string -} - -// Canonical reference is an object with a fully unique -// name including a name with hostname and digest -type Canonical interface { - Named - Digest() digest.Digest -} - -// ParseNamed parses s and returns a syntactically valid reference implementing -// the Named interface. The reference must have a name, otherwise an error is -// returned. -// If an error was encountered it is returned, along with a nil Reference. -func ParseNamed(s string) (Named, error) { - named, err := distreference.ParseNamed(s) - if err != nil { - return nil, fmt.Errorf("Error parsing reference: %q is not a valid repository/tag: %s", s, err) - } - r, err := WithName(named.Name()) - if err != nil { - return nil, err - } - if canonical, isCanonical := named.(distreference.Canonical); isCanonical { - return WithDigest(r, canonical.Digest()) - } - if tagged, isTagged := named.(distreference.NamedTagged); isTagged { - return WithTag(r, tagged.Tag()) - } - return r, nil -} - -// TrimNamed removes any tag or digest from the named reference -func TrimNamed(ref Named) Named { - return &namedRef{distreference.TrimNamed(ref)} -} - -// WithName returns a named object representing the given string. If the input -// is invalid ErrReferenceInvalidFormat will be returned. -func WithName(name string) (Named, error) { - name, err := normalize(name) - if err != nil { - return nil, err - } - if err := validateName(name); err != nil { - return nil, err - } - r, err := distreference.WithName(name) - if err != nil { - return nil, err - } - return &namedRef{r}, 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) { - r, err := distreference.WithTag(name, tag) - if err != nil { - return nil, err - } - return &taggedRef{namedRef{r}}, 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) { - r, err := distreference.WithDigest(name, digest) - if err != nil { - return nil, err - } - return &canonicalRef{namedRef{r}}, nil -} - -type namedRef struct { - distreference.Named -} -type taggedRef struct { - namedRef -} -type canonicalRef struct { - namedRef -} - -func (r *namedRef) FullName() string { - hostname, remoteName := splitHostname(r.Name()) - return hostname + "/" + remoteName -} -func (r *namedRef) Hostname() string { - hostname, _ := splitHostname(r.Name()) - return hostname -} -func (r *namedRef) RemoteName() string { - _, remoteName := splitHostname(r.Name()) - return remoteName -} -func (r *taggedRef) Tag() string { - return r.namedRef.Named.(distreference.NamedTagged).Tag() -} -func (r *canonicalRef) Digest() digest.Digest { - return r.namedRef.Named.(distreference.Canonical).Digest() -} - -// WithDefaultTag adds a default tag to a reference if it only has a repo name. -func WithDefaultTag(ref Named) Named { - if IsNameOnly(ref) { - ref, _ = WithTag(ref, DefaultTag) - } - return ref -} - -// 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 -} - -// ParseIDOrReference parses string for an image ID or a reference. ID can be -// without a default prefix. -func ParseIDOrReference(idOrRef string) (digest.Digest, Named, error) { - if err := v1.ValidateID(idOrRef); err == nil { - idOrRef = "sha256:" + idOrRef - } - if dgst, err := digest.ParseDigest(idOrRef); err == nil { - return dgst, nil, nil - } - ref, err := ParseNamed(idOrRef) - return "", ref, err -} - -// splitHostname splits a repository name to hostname and remotename string. -// If no valid hostname is found, the default hostname is used. Repository name -// needs to be already validated before. -func splitHostname(name string) (hostname, remoteName string) { - i := strings.IndexRune(name, '/') - if i == -1 || (!strings.ContainsAny(name[:i], ".:") && name[:i] != "localhost") { - hostname, remoteName = DefaultHostname, name - } else { - hostname, remoteName = name[:i], name[i+1:] - } - if hostname == LegacyDefaultHostname { - hostname = DefaultHostname - } - if hostname == DefaultHostname && !strings.ContainsRune(remoteName, '/') { - remoteName = DefaultRepoPrefix + remoteName - } - return -} - -// normalize returns a repository name in its normalized form, meaning it -// will not contain default hostname nor library/ prefix for official images. -func normalize(name string) (string, error) { - host, remoteName := splitHostname(name) - if strings.ToLower(remoteName) != remoteName { - return "", errors.New("invalid reference format: repository name must be lowercase") - } - if host == DefaultHostname { - if strings.HasPrefix(remoteName, DefaultRepoPrefix) { - return strings.TrimPrefix(remoteName, DefaultRepoPrefix), nil - } - return remoteName, nil - } - return name, nil -} - -func validateName(name string) error { - if err := v1.ValidateID(name); err == nil { - return fmt.Errorf("Invalid repository name (%s), cannot specify 64-byte hexadecimal strings", name) - } - return nil -} diff --git a/vendor/github.com/docker/docker/reference/reference_test.go b/vendor/github.com/docker/docker/reference/reference_test.go deleted file mode 100644 index ff35ba3da..000000000 --- a/vendor/github.com/docker/docker/reference/reference_test.go +++ /dev/null @@ -1,275 +0,0 @@ -package reference - -import ( - "testing" - - "github.com/docker/distribution/digest" -) - -func TestValidateReferenceName(t *testing.T) { - validRepoNames := []string{ - "docker/docker", - "library/debian", - "debian", - "docker.io/docker/docker", - "docker.io/library/debian", - "docker.io/debian", - "index.docker.io/docker/docker", - "index.docker.io/library/debian", - "index.docker.io/debian", - "127.0.0.1:5000/docker/docker", - "127.0.0.1:5000/library/debian", - "127.0.0.1:5000/debian", - "thisisthesongthatneverendsitgoesonandonandonthisisthesongthatnev", - } - invalidRepoNames := []string{ - "https://github.com/docker/docker", - "docker/Docker", - "-docker", - "-docker/docker", - "-docker.io/docker/docker", - "docker///docker", - "docker.io/docker/Docker", - "docker.io/docker///docker", - "1a3f5e7d9c1b3a5f7e9d1c3b5a7f9e1d3c5b7a9f1e3d5d7c9b1a3f5e7d9c1b3a", - "docker.io/1a3f5e7d9c1b3a5f7e9d1c3b5a7f9e1d3c5b7a9f1e3d5d7c9b1a3f5e7d9c1b3a", - } - - for _, name := range invalidRepoNames { - _, err := ParseNamed(name) - if err == nil { - t.Fatalf("Expected invalid repo name for %q", name) - } - } - - for _, name := range validRepoNames { - _, err := ParseNamed(name) - if err != nil { - t.Fatalf("Error parsing repo name %s, got: %q", name, err) - } - } -} - -func TestValidateRemoteName(t *testing.T) { - validRepositoryNames := []string{ - // Sanity check. - "docker/docker", - - // Allow 64-character non-hexadecimal names (hexadecimal names are forbidden). - "thisisthesongthatneverendsitgoesonandonandonthisisthesongthatnev", - - // Allow embedded hyphens. - "docker-rules/docker", - - // Allow multiple hyphens as well. - "docker---rules/docker", - - //Username doc and image name docker being tested. - "doc/docker", - - // single character names are now allowed. - "d/docker", - "jess/t", - - // Consecutive underscores. - "dock__er/docker", - } - for _, repositoryName := range validRepositoryNames { - _, err := ParseNamed(repositoryName) - if err != nil { - t.Errorf("Repository name should be valid: %v. Error: %v", repositoryName, err) - } - } - - invalidRepositoryNames := []string{ - // Disallow capital letters. - "docker/Docker", - - // Only allow one slash. - "docker///docker", - - // Disallow 64-character hexadecimal. - "1a3f5e7d9c1b3a5f7e9d1c3b5a7f9e1d3c5b7a9f1e3d5d7c9b1a3f5e7d9c1b3a", - - // Disallow leading and trailing hyphens in namespace. - "-docker/docker", - "docker-/docker", - "-docker-/docker", - - // Don't allow underscores everywhere (as opposed to hyphens). - "____/____", - - "_docker/_docker", - - // Disallow consecutive periods. - "dock..er/docker", - "dock_.er/docker", - "dock-.er/docker", - - // No repository. - "docker/", - - //namespace too long - "this_is_not_a_valid_namespace_because_its_lenth_is_greater_than_255_this_is_not_a_valid_namespace_because_its_lenth_is_greater_than_255_this_is_not_a_valid_namespace_because_its_lenth_is_greater_than_255_this_is_not_a_valid_namespace_because_its_lenth_is_greater_than_255/docker", - } - for _, repositoryName := range invalidRepositoryNames { - if _, err := ParseNamed(repositoryName); err == nil { - t.Errorf("Repository name should be invalid: %v", repositoryName) - } - } -} - -func TestParseRepositoryInfo(t *testing.T) { - type tcase struct { - RemoteName, NormalizedName, FullName, AmbiguousName, Hostname string - } - - tcases := []tcase{ - { - RemoteName: "fooo/bar", - NormalizedName: "fooo/bar", - FullName: "docker.io/fooo/bar", - AmbiguousName: "index.docker.io/fooo/bar", - Hostname: "docker.io", - }, - { - RemoteName: "library/ubuntu", - NormalizedName: "ubuntu", - FullName: "docker.io/library/ubuntu", - AmbiguousName: "library/ubuntu", - Hostname: "docker.io", - }, - { - RemoteName: "nonlibrary/ubuntu", - NormalizedName: "nonlibrary/ubuntu", - FullName: "docker.io/nonlibrary/ubuntu", - AmbiguousName: "", - Hostname: "docker.io", - }, - { - RemoteName: "other/library", - NormalizedName: "other/library", - FullName: "docker.io/other/library", - AmbiguousName: "", - Hostname: "docker.io", - }, - { - RemoteName: "private/moonbase", - NormalizedName: "127.0.0.1:8000/private/moonbase", - FullName: "127.0.0.1:8000/private/moonbase", - AmbiguousName: "", - Hostname: "127.0.0.1:8000", - }, - { - RemoteName: "privatebase", - NormalizedName: "127.0.0.1:8000/privatebase", - FullName: "127.0.0.1:8000/privatebase", - AmbiguousName: "", - Hostname: "127.0.0.1:8000", - }, - { - RemoteName: "private/moonbase", - NormalizedName: "example.com/private/moonbase", - FullName: "example.com/private/moonbase", - AmbiguousName: "", - Hostname: "example.com", - }, - { - RemoteName: "privatebase", - NormalizedName: "example.com/privatebase", - FullName: "example.com/privatebase", - AmbiguousName: "", - Hostname: "example.com", - }, - { - RemoteName: "private/moonbase", - NormalizedName: "example.com:8000/private/moonbase", - FullName: "example.com:8000/private/moonbase", - AmbiguousName: "", - Hostname: "example.com:8000", - }, - { - RemoteName: "privatebasee", - NormalizedName: "example.com:8000/privatebasee", - FullName: "example.com:8000/privatebasee", - AmbiguousName: "", - Hostname: "example.com:8000", - }, - { - RemoteName: "library/ubuntu-12.04-base", - NormalizedName: "ubuntu-12.04-base", - FullName: "docker.io/library/ubuntu-12.04-base", - AmbiguousName: "index.docker.io/library/ubuntu-12.04-base", - Hostname: "docker.io", - }, - } - - for _, tcase := range tcases { - refStrings := []string{tcase.NormalizedName, tcase.FullName} - if tcase.AmbiguousName != "" { - refStrings = append(refStrings, tcase.AmbiguousName) - } - - var refs []Named - for _, r := range refStrings { - named, err := ParseNamed(r) - if err != nil { - t.Fatal(err) - } - refs = append(refs, named) - named, err = WithName(r) - if err != nil { - t.Fatal(err) - } - refs = append(refs, named) - } - - for _, r := range refs { - if expected, actual := tcase.NormalizedName, r.Name(); expected != actual { - t.Fatalf("Invalid normalized reference for %q. Expected %q, got %q", r, expected, actual) - } - if expected, actual := tcase.FullName, r.FullName(); expected != actual { - t.Fatalf("Invalid normalized reference for %q. Expected %q, got %q", r, expected, actual) - } - if expected, actual := tcase.Hostname, r.Hostname(); expected != actual { - t.Fatalf("Invalid hostname for %q. Expected %q, got %q", r, expected, actual) - } - if expected, actual := tcase.RemoteName, r.RemoteName(); expected != actual { - t.Fatalf("Invalid remoteName for %q. Expected %q, got %q", r, expected, actual) - } - - } - } -} - -func TestParseReferenceWithTagAndDigest(t *testing.T) { - ref, err := ParseNamed("busybox:latest@sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa") - if err != nil { - t.Fatal(err) - } - if _, isTagged := ref.(NamedTagged); isTagged { - t.Fatalf("Reference from %q should not support tag", ref) - } - if _, isCanonical := ref.(Canonical); !isCanonical { - t.Fatalf("Reference from %q should not support digest", ref) - } - if expected, actual := "busybox@sha256:86e0e091d0da6bde2456dbb48306f3956bbeb2eae1b5b9a43045843f69fe4aaa", ref.String(); actual != expected { - t.Fatalf("Invalid parsed reference for %q: expected %q, got %q", ref, expected, actual) - } -} - -func TestInvalidReferenceComponents(t *testing.T) { - if _, err := WithName("-foo"); err == nil { - t.Fatal("Expected WithName to detect invalid name") - } - ref, err := WithName("busybox") - if err != nil { - t.Fatal(err) - } - if _, err := WithTag(ref, "-foo"); err == nil { - t.Fatal("Expected WithName to detect invalid tag") - } - if _, err := WithDigest(ref, digest.Digest("foo")); err == nil { - t.Fatal("Expected WithName to detect invalid digest") - } -} diff --git a/vendor/github.com/docker/docker/reference/store.go b/vendor/github.com/docker/docker/reference/store.go deleted file mode 100644 index 71ca236c9..000000000 --- a/vendor/github.com/docker/docker/reference/store.go +++ /dev/null @@ -1,286 +0,0 @@ -package reference - -import ( - "encoding/json" - "errors" - "fmt" - "os" - "path/filepath" - "sort" - "sync" - - "github.com/docker/distribution/digest" - "github.com/docker/docker/pkg/ioutils" -) - -var ( - // ErrDoesNotExist is returned if a reference is not found in the - // store. - ErrDoesNotExist = errors.New("reference does not exist") -) - -// An Association is a tuple associating a reference with an image ID. -type Association struct { - Ref Named - ID digest.Digest -} - -// Store provides the set of methods which can operate on a tag store. -type Store interface { - References(id digest.Digest) []Named - ReferencesByName(ref Named) []Association - AddTag(ref Named, id digest.Digest, force bool) error - AddDigest(ref Canonical, id digest.Digest, force bool) error - Delete(ref Named) (bool, error) - Get(ref Named) (digest.Digest, error) -} - -type store struct { - mu sync.RWMutex - // jsonPath is the path to the file where the serialized tag data is - // stored. - jsonPath string - // Repositories is a map of repositories, indexed by name. - Repositories map[string]repository - // referencesByIDCache is a cache of references indexed by ID, to speed - // up References. - referencesByIDCache map[digest.Digest]map[string]Named -} - -// Repository maps tags to digests. The key is a stringified Reference, -// including the repository name. -type repository map[string]digest.Digest - -type lexicalRefs []Named - -func (a lexicalRefs) Len() int { return len(a) } -func (a lexicalRefs) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a lexicalRefs) Less(i, j int) bool { return a[i].String() < a[j].String() } - -type lexicalAssociations []Association - -func (a lexicalAssociations) Len() int { return len(a) } -func (a lexicalAssociations) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a lexicalAssociations) Less(i, j int) bool { return a[i].Ref.String() < a[j].Ref.String() } - -// NewReferenceStore creates a new reference store, tied to a file path where -// the set of references are serialized in JSON format. -func NewReferenceStore(jsonPath string) (Store, error) { - abspath, err := filepath.Abs(jsonPath) - if err != nil { - return nil, err - } - - store := &store{ - jsonPath: abspath, - Repositories: make(map[string]repository), - referencesByIDCache: make(map[digest.Digest]map[string]Named), - } - // Load the json file if it exists, otherwise create it. - if err := store.reload(); os.IsNotExist(err) { - if err := store.save(); err != nil { - return nil, err - } - } else if err != nil { - return nil, err - } - return store, nil -} - -// AddTag adds a tag reference to the store. If force is set to true, existing -// references can be overwritten. This only works for tags, not digests. -func (store *store) AddTag(ref Named, id digest.Digest, force bool) error { - if _, isCanonical := ref.(Canonical); isCanonical { - return errors.New("refusing to create a tag with a digest reference") - } - return store.addReference(WithDefaultTag(ref), id, force) -} - -// AddDigest adds a digest reference to the store. -func (store *store) AddDigest(ref Canonical, id digest.Digest, force bool) error { - return store.addReference(ref, id, force) -} - -func (store *store) addReference(ref Named, id digest.Digest, force bool) error { - if ref.Name() == string(digest.Canonical) { - return errors.New("refusing to create an ambiguous tag using digest algorithm as name") - } - - store.mu.Lock() - defer store.mu.Unlock() - - repository, exists := store.Repositories[ref.Name()] - if !exists || repository == nil { - repository = make(map[string]digest.Digest) - store.Repositories[ref.Name()] = repository - } - - refStr := ref.String() - oldID, exists := repository[refStr] - - if exists { - // force only works for tags - if digested, isDigest := ref.(Canonical); isDigest { - return fmt.Errorf("Cannot overwrite digest %s", digested.Digest().String()) - } - - if !force { - return fmt.Errorf("Conflict: Tag %s is already set to image %s, if you want to replace it, please use -f option", ref.String(), oldID.String()) - } - - if store.referencesByIDCache[oldID] != nil { - delete(store.referencesByIDCache[oldID], refStr) - if len(store.referencesByIDCache[oldID]) == 0 { - delete(store.referencesByIDCache, oldID) - } - } - } - - repository[refStr] = id - if store.referencesByIDCache[id] == nil { - store.referencesByIDCache[id] = make(map[string]Named) - } - store.referencesByIDCache[id][refStr] = ref - - return store.save() -} - -// Delete deletes a reference from the store. It returns true if a deletion -// happened, or false otherwise. -func (store *store) Delete(ref Named) (bool, error) { - ref = WithDefaultTag(ref) - - store.mu.Lock() - defer store.mu.Unlock() - - repoName := ref.Name() - - repository, exists := store.Repositories[repoName] - if !exists { - return false, ErrDoesNotExist - } - - refStr := ref.String() - if id, exists := repository[refStr]; exists { - delete(repository, refStr) - if len(repository) == 0 { - delete(store.Repositories, repoName) - } - if store.referencesByIDCache[id] != nil { - delete(store.referencesByIDCache[id], refStr) - if len(store.referencesByIDCache[id]) == 0 { - delete(store.referencesByIDCache, id) - } - } - return true, store.save() - } - - return false, ErrDoesNotExist -} - -// Get retrieves an item from the store by reference -func (store *store) Get(ref Named) (digest.Digest, error) { - ref = WithDefaultTag(ref) - - store.mu.RLock() - defer store.mu.RUnlock() - - repository, exists := store.Repositories[ref.Name()] - if !exists || repository == nil { - return "", ErrDoesNotExist - } - - id, exists := repository[ref.String()] - if !exists { - return "", ErrDoesNotExist - } - - return id, nil -} - -// References returns a slice of references to the given ID. The slice -// will be nil if there are no references to this ID. -func (store *store) References(id digest.Digest) []Named { - store.mu.RLock() - defer store.mu.RUnlock() - - // Convert the internal map to an array for two reasons: - // 1) We must not return a mutable - // 2) It would be ugly to expose the extraneous map keys to callers. - - var references []Named - for _, ref := range store.referencesByIDCache[id] { - references = append(references, ref) - } - - sort.Sort(lexicalRefs(references)) - - return references -} - -// ReferencesByName returns the references for a given repository name. -// If there are no references known for this repository name, -// ReferencesByName returns nil. -func (store *store) ReferencesByName(ref Named) []Association { - store.mu.RLock() - defer store.mu.RUnlock() - - repository, exists := store.Repositories[ref.Name()] - if !exists { - return nil - } - - var associations []Association - for refStr, refID := range repository { - ref, err := ParseNamed(refStr) - if err != nil { - // Should never happen - return nil - } - associations = append(associations, - Association{ - Ref: ref, - ID: refID, - }) - } - - sort.Sort(lexicalAssociations(associations)) - - return associations -} - -func (store *store) save() error { - // Store the json - jsonData, err := json.Marshal(store) - if err != nil { - return err - } - return ioutils.AtomicWriteFile(store.jsonPath, jsonData, 0600) -} - -func (store *store) reload() error { - f, err := os.Open(store.jsonPath) - if err != nil { - return err - } - defer f.Close() - if err := json.NewDecoder(f).Decode(&store); err != nil { - return err - } - - for _, repository := range store.Repositories { - for refStr, refID := range repository { - ref, err := ParseNamed(refStr) - if err != nil { - // Should never happen - continue - } - if store.referencesByIDCache[refID] == nil { - store.referencesByIDCache[refID] = make(map[string]Named) - } - store.referencesByIDCache[refID][refStr] = ref - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/reference/store_test.go b/vendor/github.com/docker/docker/reference/store_test.go deleted file mode 100644 index dd1d253d8..000000000 --- a/vendor/github.com/docker/docker/reference/store_test.go +++ /dev/null @@ -1,356 +0,0 @@ -package reference - -import ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "strings" - "testing" - - "github.com/docker/distribution/digest" -) - -var ( - saveLoadTestCases = map[string]digest.Digest{ - "registry:5000/foobar:HEAD": "sha256:470022b8af682154f57a2163d030eb369549549cba00edc69e1b99b46bb924d6", - "registry:5000/foobar:alternate": "sha256:ae300ebc4a4f00693702cfb0a5e0b7bc527b353828dc86ad09fb95c8a681b793", - "registry:5000/foobar:latest": "sha256:6153498b9ac00968d71b66cca4eac37e990b5f9eb50c26877eb8799c8847451b", - "registry:5000/foobar:master": "sha256:6c9917af4c4e05001b346421959d7ea81b6dc9d25718466a37a6add865dfd7fc", - "jess/hollywood:latest": "sha256:ae7a5519a0a55a2d4ef20ddcbd5d0ca0888a1f7ab806acc8e2a27baf46f529fe", - "registry@sha256:367eb40fd0330a7e464777121e39d2f5b3e8e23a1e159342e53ab05c9e4d94e6": "sha256:24126a56805beb9711be5f4590cc2eb55ab8d4a85ebd618eed72bb19fc50631c", - "busybox:latest": "sha256:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c", - } - - marshalledSaveLoadTestCases = []byte(`{"Repositories":{"busybox":{"busybox:latest":"sha256:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c"},"jess/hollywood":{"jess/hollywood:latest":"sha256:ae7a5519a0a55a2d4ef20ddcbd5d0ca0888a1f7ab806acc8e2a27baf46f529fe"},"registry":{"registry@sha256:367eb40fd0330a7e464777121e39d2f5b3e8e23a1e159342e53ab05c9e4d94e6":"sha256:24126a56805beb9711be5f4590cc2eb55ab8d4a85ebd618eed72bb19fc50631c"},"registry:5000/foobar":{"registry:5000/foobar:HEAD":"sha256:470022b8af682154f57a2163d030eb369549549cba00edc69e1b99b46bb924d6","registry:5000/foobar:alternate":"sha256:ae300ebc4a4f00693702cfb0a5e0b7bc527b353828dc86ad09fb95c8a681b793","registry:5000/foobar:latest":"sha256:6153498b9ac00968d71b66cca4eac37e990b5f9eb50c26877eb8799c8847451b","registry:5000/foobar:master":"sha256:6c9917af4c4e05001b346421959d7ea81b6dc9d25718466a37a6add865dfd7fc"}}}`) -) - -func TestLoad(t *testing.T) { - jsonFile, err := ioutil.TempFile("", "tag-store-test") - if err != nil { - t.Fatalf("error creating temp file: %v", err) - } - defer os.RemoveAll(jsonFile.Name()) - - // Write canned json to the temp file - _, err = jsonFile.Write(marshalledSaveLoadTestCases) - if err != nil { - t.Fatalf("error writing to temp file: %v", err) - } - jsonFile.Close() - - store, err := NewReferenceStore(jsonFile.Name()) - if err != nil { - t.Fatalf("error creating tag store: %v", err) - } - - for refStr, expectedID := range saveLoadTestCases { - ref, err := ParseNamed(refStr) - if err != nil { - t.Fatalf("failed to parse reference: %v", err) - } - id, err := store.Get(ref) - if err != nil { - t.Fatalf("could not find reference %s: %v", refStr, err) - } - if id != expectedID { - t.Fatalf("expected %s - got %s", expectedID, id) - } - } -} - -func TestSave(t *testing.T) { - jsonFile, err := ioutil.TempFile("", "tag-store-test") - if err != nil { - t.Fatalf("error creating temp file: %v", err) - } - _, err = jsonFile.Write([]byte(`{}`)) - jsonFile.Close() - defer os.RemoveAll(jsonFile.Name()) - - store, err := NewReferenceStore(jsonFile.Name()) - if err != nil { - t.Fatalf("error creating tag store: %v", err) - } - - for refStr, id := range saveLoadTestCases { - ref, err := ParseNamed(refStr) - if err != nil { - t.Fatalf("failed to parse reference: %v", err) - } - if canonical, ok := ref.(Canonical); ok { - err = store.AddDigest(canonical, id, false) - if err != nil { - t.Fatalf("could not add digest reference %s: %v", refStr, err) - } - } else { - err = store.AddTag(ref, id, false) - if err != nil { - t.Fatalf("could not add reference %s: %v", refStr, err) - } - } - } - - jsonBytes, err := ioutil.ReadFile(jsonFile.Name()) - if err != nil { - t.Fatalf("could not read json file: %v", err) - } - - if !bytes.Equal(jsonBytes, marshalledSaveLoadTestCases) { - t.Fatalf("save output did not match expectations\nexpected:\n%s\ngot:\n%s", marshalledSaveLoadTestCases, jsonBytes) - } -} - -func TestAddDeleteGet(t *testing.T) { - jsonFile, err := ioutil.TempFile("", "tag-store-test") - if err != nil { - t.Fatalf("error creating temp file: %v", err) - } - _, err = jsonFile.Write([]byte(`{}`)) - jsonFile.Close() - defer os.RemoveAll(jsonFile.Name()) - - store, err := NewReferenceStore(jsonFile.Name()) - if err != nil { - t.Fatalf("error creating tag store: %v", err) - } - - testImageID1 := digest.Digest("sha256:9655aef5fd742a1b4e1b7b163aa9f1c76c186304bf39102283d80927c916ca9c") - testImageID2 := digest.Digest("sha256:9655aef5fd742a1b4e1b7b163aa9f1c76c186304bf39102283d80927c916ca9d") - testImageID3 := digest.Digest("sha256:9655aef5fd742a1b4e1b7b163aa9f1c76c186304bf39102283d80927c916ca9e") - - // Try adding a reference with no tag or digest - nameOnly, err := WithName("username/repo") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - if err = store.AddTag(nameOnly, testImageID1, false); err != nil { - t.Fatalf("error adding to store: %v", err) - } - - // Add a few references - ref1, err := ParseNamed("username/repo1:latest") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - if err = store.AddTag(ref1, testImageID1, false); err != nil { - t.Fatalf("error adding to store: %v", err) - } - - ref2, err := ParseNamed("username/repo1:old") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - if err = store.AddTag(ref2, testImageID2, false); err != nil { - t.Fatalf("error adding to store: %v", err) - } - - ref3, err := ParseNamed("username/repo1:alias") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - if err = store.AddTag(ref3, testImageID1, false); err != nil { - t.Fatalf("error adding to store: %v", err) - } - - ref4, err := ParseNamed("username/repo2:latest") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - if err = store.AddTag(ref4, testImageID2, false); err != nil { - t.Fatalf("error adding to store: %v", err) - } - - ref5, err := ParseNamed("username/repo3@sha256:58153dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - if err = store.AddDigest(ref5.(Canonical), testImageID2, false); err != nil { - t.Fatalf("error adding to store: %v", err) - } - - // Attempt to overwrite with force == false - if err = store.AddTag(ref4, testImageID3, false); err == nil || !strings.HasPrefix(err.Error(), "Conflict:") { - t.Fatalf("did not get expected error on overwrite attempt - got %v", err) - } - // Repeat to overwrite with force == true - if err = store.AddTag(ref4, testImageID3, true); err != nil { - t.Fatalf("failed to force tag overwrite: %v", err) - } - - // Check references so far - id, err := store.Get(nameOnly) - if err != nil { - t.Fatalf("Get returned error: %v", err) - } - if id != testImageID1 { - t.Fatalf("id mismatch: got %s instead of %s", id.String(), testImageID1.String()) - } - - id, err = store.Get(ref1) - if err != nil { - t.Fatalf("Get returned error: %v", err) - } - if id != testImageID1 { - t.Fatalf("id mismatch: got %s instead of %s", id.String(), testImageID1.String()) - } - - id, err = store.Get(ref2) - if err != nil { - t.Fatalf("Get returned error: %v", err) - } - if id != testImageID2 { - t.Fatalf("id mismatch: got %s instead of %s", id.String(), testImageID2.String()) - } - - id, err = store.Get(ref3) - if err != nil { - t.Fatalf("Get returned error: %v", err) - } - if id != testImageID1 { - t.Fatalf("id mismatch: got %s instead of %s", id.String(), testImageID1.String()) - } - - id, err = store.Get(ref4) - if err != nil { - t.Fatalf("Get returned error: %v", err) - } - if id != testImageID3 { - t.Fatalf("id mismatch: got %s instead of %s", id.String(), testImageID3.String()) - } - - id, err = store.Get(ref5) - if err != nil { - t.Fatalf("Get returned error: %v", err) - } - if id != testImageID2 { - t.Fatalf("id mismatch: got %s instead of %s", id.String(), testImageID3.String()) - } - - // Get should return ErrDoesNotExist for a nonexistent repo - nonExistRepo, err := ParseNamed("username/nonexistrepo:latest") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - if _, err = store.Get(nonExistRepo); err != ErrDoesNotExist { - t.Fatal("Expected ErrDoesNotExist from Get") - } - - // Get should return ErrDoesNotExist for a nonexistent tag - nonExistTag, err := ParseNamed("username/repo1:nonexist") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - if _, err = store.Get(nonExistTag); err != ErrDoesNotExist { - t.Fatal("Expected ErrDoesNotExist from Get") - } - - // Check References - refs := store.References(testImageID1) - if len(refs) != 3 { - t.Fatal("unexpected number of references") - } - // Looking for the references in this order verifies that they are - // returned lexically sorted. - if refs[0].String() != ref3.String() { - t.Fatalf("unexpected reference: %v", refs[0].String()) - } - if refs[1].String() != ref1.String() { - t.Fatalf("unexpected reference: %v", refs[1].String()) - } - if refs[2].String() != nameOnly.String()+":latest" { - t.Fatalf("unexpected reference: %v", refs[2].String()) - } - - // Check ReferencesByName - repoName, err := WithName("username/repo1") - if err != nil { - t.Fatalf("could not parse reference: %v", err) - } - associations := store.ReferencesByName(repoName) - if len(associations) != 3 { - t.Fatal("unexpected number of associations") - } - // Looking for the associations in this order verifies that they are - // returned lexically sorted. - if associations[0].Ref.String() != ref3.String() { - t.Fatalf("unexpected reference: %v", associations[0].Ref.String()) - } - if associations[0].ID != testImageID1 { - t.Fatalf("unexpected reference: %v", associations[0].Ref.String()) - } - if associations[1].Ref.String() != ref1.String() { - t.Fatalf("unexpected reference: %v", associations[1].Ref.String()) - } - if associations[1].ID != testImageID1 { - t.Fatalf("unexpected reference: %v", associations[1].Ref.String()) - } - if associations[2].Ref.String() != ref2.String() { - t.Fatalf("unexpected reference: %v", associations[2].Ref.String()) - } - if associations[2].ID != testImageID2 { - t.Fatalf("unexpected reference: %v", associations[2].Ref.String()) - } - - // Delete should return ErrDoesNotExist for a nonexistent repo - if _, err = store.Delete(nonExistRepo); err != ErrDoesNotExist { - t.Fatal("Expected ErrDoesNotExist from Delete") - } - - // Delete should return ErrDoesNotExist for a nonexistent tag - if _, err = store.Delete(nonExistTag); err != ErrDoesNotExist { - t.Fatal("Expected ErrDoesNotExist from Delete") - } - - // Delete a few references - if deleted, err := store.Delete(ref1); err != nil || deleted != true { - t.Fatal("Delete failed") - } - if _, err := store.Get(ref1); err != ErrDoesNotExist { - t.Fatal("Expected ErrDoesNotExist from Get") - } - if deleted, err := store.Delete(ref5); err != nil || deleted != true { - t.Fatal("Delete failed") - } - if _, err := store.Get(ref5); err != ErrDoesNotExist { - t.Fatal("Expected ErrDoesNotExist from Get") - } - if deleted, err := store.Delete(nameOnly); err != nil || deleted != true { - t.Fatal("Delete failed") - } - if _, err := store.Get(nameOnly); err != ErrDoesNotExist { - t.Fatal("Expected ErrDoesNotExist from Get") - } -} - -func TestInvalidTags(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "tag-store-test") - defer os.RemoveAll(tmpDir) - - store, err := NewReferenceStore(filepath.Join(tmpDir, "repositories.json")) - if err != nil { - t.Fatalf("error creating tag store: %v", err) - } - id := digest.Digest("sha256:470022b8af682154f57a2163d030eb369549549cba00edc69e1b99b46bb924d6") - - // sha256 as repo name - ref, err := ParseNamed("sha256:abc") - if err != nil { - t.Fatal(err) - } - err = store.AddTag(ref, id, true) - if err == nil { - t.Fatalf("expected setting tag %q to fail", ref) - } - - // setting digest as a tag - ref, err = ParseNamed("registry@sha256:367eb40fd0330a7e464777121e39d2f5b3e8e23a1e159342e53ab05c9e4d94e6") - if err != nil { - t.Fatal(err) - } - err = store.AddTag(ref, id, true) - if err == nil { - t.Fatalf("expected setting digest %q to fail", ref) - } - -} diff --git a/vendor/github.com/docker/docker/registry/auth.go b/vendor/github.com/docker/docker/registry/auth.go deleted file mode 100644 index 8cadd51ba..000000000 --- a/vendor/github.com/docker/docker/registry/auth.go +++ /dev/null @@ -1,303 +0,0 @@ -package registry - -import ( - "fmt" - "io/ioutil" - "net/http" - "net/url" - "strings" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/registry/client/auth" - "github.com/docker/distribution/registry/client/auth/challenge" - "github.com/docker/distribution/registry/client/transport" - "github.com/docker/docker/api/types" - registrytypes "github.com/docker/docker/api/types/registry" -) - -const ( - // AuthClientID is used the ClientID used for the token server - AuthClientID = "docker" -) - -// loginV1 tries to register/login to the v1 registry server. -func loginV1(authConfig *types.AuthConfig, apiEndpoint APIEndpoint, userAgent string) (string, string, error) { - registryEndpoint, err := apiEndpoint.ToV1Endpoint(userAgent, nil) - if err != nil { - return "", "", err - } - - serverAddress := registryEndpoint.String() - - logrus.Debugf("attempting v1 login to registry endpoint %s", serverAddress) - - if serverAddress == "" { - return "", "", fmt.Errorf("Server Error: Server Address not set.") - } - - loginAgainstOfficialIndex := serverAddress == IndexServer - - req, err := http.NewRequest("GET", serverAddress+"users/", nil) - if err != nil { - return "", "", err - } - req.SetBasicAuth(authConfig.Username, authConfig.Password) - resp, err := registryEndpoint.client.Do(req) - if err != nil { - // fallback when request could not be completed - return "", "", fallbackError{ - err: err, - } - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return "", "", err - } - if resp.StatusCode == http.StatusOK { - return "Login Succeeded", "", nil - } else if resp.StatusCode == http.StatusUnauthorized { - if loginAgainstOfficialIndex { - return "", "", fmt.Errorf("Wrong login/password, please try again. Haven't got a Docker ID? Create one at https://hub.docker.com") - } - return "", "", fmt.Errorf("Wrong login/password, please try again") - } else if resp.StatusCode == http.StatusForbidden { - if loginAgainstOfficialIndex { - return "", "", fmt.Errorf("Login: Account is not active. Please check your e-mail for a confirmation link.") - } - // *TODO: Use registry configuration to determine what this says, if anything? - return "", "", fmt.Errorf("Login: Account is not active. Please see the documentation of the registry %s for instructions how to activate it.", serverAddress) - } else if resp.StatusCode == http.StatusInternalServerError { // Issue #14326 - logrus.Errorf("%s returned status code %d. Response Body :\n%s", req.URL.String(), resp.StatusCode, body) - return "", "", fmt.Errorf("Internal Server Error") - } - return "", "", fmt.Errorf("Login: %s (Code: %d; Headers: %s)", body, - resp.StatusCode, resp.Header) -} - -type loginCredentialStore struct { - authConfig *types.AuthConfig -} - -func (lcs loginCredentialStore) Basic(*url.URL) (string, string) { - return lcs.authConfig.Username, lcs.authConfig.Password -} - -func (lcs loginCredentialStore) RefreshToken(*url.URL, string) string { - return lcs.authConfig.IdentityToken -} - -func (lcs loginCredentialStore) SetRefreshToken(u *url.URL, service, token string) { - lcs.authConfig.IdentityToken = token -} - -type staticCredentialStore struct { - auth *types.AuthConfig -} - -// NewStaticCredentialStore returns a credential store -// which always returns the same credential values. -func NewStaticCredentialStore(auth *types.AuthConfig) auth.CredentialStore { - return staticCredentialStore{ - auth: auth, - } -} - -func (scs staticCredentialStore) Basic(*url.URL) (string, string) { - if scs.auth == nil { - return "", "" - } - return scs.auth.Username, scs.auth.Password -} - -func (scs staticCredentialStore) RefreshToken(*url.URL, string) string { - if scs.auth == nil { - return "" - } - return scs.auth.IdentityToken -} - -func (scs staticCredentialStore) SetRefreshToken(*url.URL, string, string) { -} - -type fallbackError struct { - err error -} - -func (err fallbackError) Error() string { - return err.err.Error() -} - -// loginV2 tries to login to the v2 registry server. The given registry -// endpoint will be pinged to get authorization challenges. These challenges -// will be used to authenticate against the registry to validate credentials. -func loginV2(authConfig *types.AuthConfig, endpoint APIEndpoint, userAgent string) (string, string, error) { - logrus.Debugf("attempting v2 login to registry endpoint %s", strings.TrimRight(endpoint.URL.String(), "/")+"/v2/") - - modifiers := DockerHeaders(userAgent, nil) - authTransport := transport.NewTransport(NewTransport(endpoint.TLSConfig), modifiers...) - - credentialAuthConfig := *authConfig - creds := loginCredentialStore{ - authConfig: &credentialAuthConfig, - } - - loginClient, foundV2, err := v2AuthHTTPClient(endpoint.URL, authTransport, modifiers, creds, nil) - if err != nil { - return "", "", err - } - - endpointStr := strings.TrimRight(endpoint.URL.String(), "/") + "/v2/" - req, err := http.NewRequest("GET", endpointStr, nil) - if err != nil { - if !foundV2 { - err = fallbackError{err: err} - } - return "", "", err - } - - resp, err := loginClient.Do(req) - if err != nil { - if !foundV2 { - err = fallbackError{err: err} - } - return "", "", err - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - // TODO(dmcgowan): Attempt to further interpret result, status code and error code string - err := fmt.Errorf("login attempt to %s failed with status: %d %s", endpointStr, resp.StatusCode, http.StatusText(resp.StatusCode)) - if !foundV2 { - err = fallbackError{err: err} - } - return "", "", err - } - - return "Login Succeeded", credentialAuthConfig.IdentityToken, nil - -} - -func v2AuthHTTPClient(endpoint *url.URL, authTransport http.RoundTripper, modifiers []transport.RequestModifier, creds auth.CredentialStore, scopes []auth.Scope) (*http.Client, bool, error) { - challengeManager, foundV2, err := PingV2Registry(endpoint, authTransport) - if err != nil { - if !foundV2 { - err = fallbackError{err: err} - } - return nil, foundV2, err - } - - tokenHandlerOptions := auth.TokenHandlerOptions{ - Transport: authTransport, - Credentials: creds, - OfflineAccess: true, - ClientID: AuthClientID, - Scopes: scopes, - } - tokenHandler := auth.NewTokenHandlerWithOptions(tokenHandlerOptions) - basicHandler := auth.NewBasicHandler(creds) - modifiers = append(modifiers, auth.NewAuthorizer(challengeManager, tokenHandler, basicHandler)) - tr := transport.NewTransport(authTransport, modifiers...) - - return &http.Client{ - Transport: tr, - Timeout: 15 * time.Second, - }, foundV2, nil - -} - -// ConvertToHostname converts a registry url which has http|https prepended -// to just an hostname. -func ConvertToHostname(url string) string { - stripped := url - if strings.HasPrefix(url, "http://") { - stripped = strings.TrimPrefix(url, "http://") - } else if strings.HasPrefix(url, "https://") { - stripped = strings.TrimPrefix(url, "https://") - } - - nameParts := strings.SplitN(stripped, "/", 2) - - return nameParts[0] -} - -// ResolveAuthConfig matches an auth configuration to a server address or a URL -func ResolveAuthConfig(authConfigs map[string]types.AuthConfig, index *registrytypes.IndexInfo) types.AuthConfig { - configKey := GetAuthConfigKey(index) - // First try the happy case - if c, found := authConfigs[configKey]; found || index.Official { - return c - } - - // Maybe they have a legacy config file, we will iterate the keys converting - // them to the new format and testing - for registry, ac := range authConfigs { - if configKey == ConvertToHostname(registry) { - return ac - } - } - - // When all else fails, return an empty auth config - return types.AuthConfig{} -} - -// PingResponseError is used when the response from a ping -// was received but invalid. -type PingResponseError struct { - Err error -} - -func (err PingResponseError) Error() string { - return err.Err.Error() -} - -// PingV2Registry attempts to ping a v2 registry and on success return a -// challenge manager for the supported authentication types and -// whether v2 was confirmed by the response. If a response is received but -// cannot be interpreted a PingResponseError will be returned. -func PingV2Registry(endpoint *url.URL, transport http.RoundTripper) (challenge.Manager, bool, error) { - var ( - foundV2 = false - v2Version = auth.APIVersion{ - Type: "registry", - Version: "2.0", - } - ) - - pingClient := &http.Client{ - Transport: transport, - Timeout: 15 * time.Second, - } - endpointStr := strings.TrimRight(endpoint.String(), "/") + "/v2/" - req, err := http.NewRequest("GET", endpointStr, nil) - if err != nil { - return nil, false, err - } - resp, err := pingClient.Do(req) - if err != nil { - return nil, false, err - } - defer resp.Body.Close() - - versions := auth.APIVersions(resp, DefaultRegistryVersionHeader) - for _, pingVersion := range versions { - if pingVersion == v2Version { - // The version header indicates we're definitely - // talking to a v2 registry. So don't allow future - // fallbacks to the v1 protocol. - - foundV2 = true - break - } - } - - challengeManager := challenge.NewSimpleManager() - if err := challengeManager.AddResponse(resp); err != nil { - return nil, foundV2, PingResponseError{ - Err: err, - } - } - - return challengeManager, foundV2, nil -} diff --git a/vendor/github.com/docker/docker/registry/auth_test.go b/vendor/github.com/docker/docker/registry/auth_test.go deleted file mode 100644 index 9ab71aa4f..000000000 --- a/vendor/github.com/docker/docker/registry/auth_test.go +++ /dev/null @@ -1,124 +0,0 @@ -// +build !solaris - -// TODO: Support Solaris - -package registry - -import ( - "testing" - - "github.com/docker/docker/api/types" - registrytypes "github.com/docker/docker/api/types/registry" -) - -func buildAuthConfigs() map[string]types.AuthConfig { - authConfigs := map[string]types.AuthConfig{} - - for _, registry := range []string{"testIndex", IndexServer} { - authConfigs[registry] = types.AuthConfig{ - Username: "docker-user", - Password: "docker-pass", - } - } - - return authConfigs -} - -func TestSameAuthDataPostSave(t *testing.T) { - authConfigs := buildAuthConfigs() - authConfig := authConfigs["testIndex"] - if authConfig.Username != "docker-user" { - t.Fail() - } - if authConfig.Password != "docker-pass" { - t.Fail() - } - if authConfig.Auth != "" { - t.Fail() - } -} - -func TestResolveAuthConfigIndexServer(t *testing.T) { - authConfigs := buildAuthConfigs() - indexConfig := authConfigs[IndexServer] - - officialIndex := ®istrytypes.IndexInfo{ - Official: true, - } - privateIndex := ®istrytypes.IndexInfo{ - Official: false, - } - - resolved := ResolveAuthConfig(authConfigs, officialIndex) - assertEqual(t, resolved, indexConfig, "Expected ResolveAuthConfig to return IndexServer") - - resolved = ResolveAuthConfig(authConfigs, privateIndex) - assertNotEqual(t, resolved, indexConfig, "Expected ResolveAuthConfig to not return IndexServer") -} - -func TestResolveAuthConfigFullURL(t *testing.T) { - authConfigs := buildAuthConfigs() - - registryAuth := types.AuthConfig{ - Username: "foo-user", - Password: "foo-pass", - } - localAuth := types.AuthConfig{ - Username: "bar-user", - Password: "bar-pass", - } - officialAuth := types.AuthConfig{ - Username: "baz-user", - Password: "baz-pass", - } - authConfigs[IndexServer] = officialAuth - - expectedAuths := map[string]types.AuthConfig{ - "registry.example.com": registryAuth, - "localhost:8000": localAuth, - "registry.com": localAuth, - } - - validRegistries := map[string][]string{ - "registry.example.com": { - "https://registry.example.com/v1/", - "http://registry.example.com/v1/", - "registry.example.com", - "registry.example.com/v1/", - }, - "localhost:8000": { - "https://localhost:8000/v1/", - "http://localhost:8000/v1/", - "localhost:8000", - "localhost:8000/v1/", - }, - "registry.com": { - "https://registry.com/v1/", - "http://registry.com/v1/", - "registry.com", - "registry.com/v1/", - }, - } - - for configKey, registries := range validRegistries { - configured, ok := expectedAuths[configKey] - if !ok { - t.Fail() - } - index := ®istrytypes.IndexInfo{ - Name: configKey, - } - for _, registry := range registries { - authConfigs[registry] = configured - resolved := ResolveAuthConfig(authConfigs, index) - if resolved.Username != configured.Username || resolved.Password != configured.Password { - t.Errorf("%s -> %v != %v\n", registry, resolved, configured) - } - delete(authConfigs, registry) - resolved = ResolveAuthConfig(authConfigs, index) - if resolved.Username == configured.Username || resolved.Password == configured.Password { - t.Errorf("%s -> %v == %v\n", registry, resolved, configured) - } - } - } -} diff --git a/vendor/github.com/docker/docker/registry/config.go b/vendor/github.com/docker/docker/registry/config.go deleted file mode 100644 index 9a4f6a925..000000000 --- a/vendor/github.com/docker/docker/registry/config.go +++ /dev/null @@ -1,305 +0,0 @@ -package registry - -import ( - "errors" - "fmt" - "net" - "net/url" - "strings" - - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/opts" - "github.com/docker/docker/reference" - "github.com/spf13/pflag" -) - -// ServiceOptions holds command line options. -type ServiceOptions struct { - Mirrors []string `json:"registry-mirrors,omitempty"` - InsecureRegistries []string `json:"insecure-registries,omitempty"` - - // V2Only controls access to legacy registries. If it is set to true via the - // command line flag the daemon will not attempt to contact v1 legacy registries - V2Only bool `json:"disable-legacy-registry,omitempty"` -} - -// serviceConfig holds daemon configuration for the registry service. -type serviceConfig struct { - registrytypes.ServiceConfig - V2Only bool -} - -var ( - // DefaultNamespace is the default namespace - DefaultNamespace = "docker.io" - // DefaultRegistryVersionHeader is the name of the default HTTP header - // that carries Registry version info - DefaultRegistryVersionHeader = "Docker-Distribution-Api-Version" - - // IndexHostname is the index hostname - IndexHostname = "index.docker.io" - // IndexServer is used for user auth and image search - IndexServer = "https://" + IndexHostname + "/v1/" - // IndexName is the name of the index - IndexName = "docker.io" - - // NotaryServer is the endpoint serving the Notary trust server - NotaryServer = "https://notary.docker.io" - - // DefaultV2Registry is the URI of the default v2 registry - DefaultV2Registry = &url.URL{ - Scheme: "https", - Host: "registry-1.docker.io", - } -) - -var ( - // ErrInvalidRepositoryName is an error returned if the repository name did - // not have the correct form - ErrInvalidRepositoryName = errors.New("Invalid repository name (ex: \"registry.domain.tld/myrepos\")") - - emptyServiceConfig = newServiceConfig(ServiceOptions{}) -) - -// for mocking in unit tests -var lookupIP = net.LookupIP - -// InstallCliFlags adds command-line options to the top-level flag parser for -// the current process. -func (options *ServiceOptions) InstallCliFlags(flags *pflag.FlagSet) { - mirrors := opts.NewNamedListOptsRef("registry-mirrors", &options.Mirrors, ValidateMirror) - insecureRegistries := opts.NewNamedListOptsRef("insecure-registries", &options.InsecureRegistries, ValidateIndexName) - - flags.Var(mirrors, "registry-mirror", "Preferred Docker registry mirror") - flags.Var(insecureRegistries, "insecure-registry", "Enable insecure registry communication") - - options.installCliPlatformFlags(flags) -} - -// newServiceConfig returns a new instance of ServiceConfig -func newServiceConfig(options ServiceOptions) *serviceConfig { - config := &serviceConfig{ - ServiceConfig: registrytypes.ServiceConfig{ - InsecureRegistryCIDRs: make([]*registrytypes.NetIPNet, 0), - IndexConfigs: make(map[string]*registrytypes.IndexInfo, 0), - // Hack: Bypass setting the mirrors to IndexConfigs since they are going away - // and Mirrors are only for the official registry anyways. - Mirrors: options.Mirrors, - }, - V2Only: options.V2Only, - } - - config.LoadInsecureRegistries(options.InsecureRegistries) - - return config -} - -// LoadInsecureRegistries loads insecure registries to config -func (config *serviceConfig) LoadInsecureRegistries(registries []string) error { - // Localhost is by default considered as an insecure registry - // This is a stop-gap for people who are running a private registry on localhost (especially on Boot2docker). - // - // TODO: should we deprecate this once it is easier for people to set up a TLS registry or change - // daemon flags on boot2docker? - registries = append(registries, "127.0.0.0/8") - - // Store original InsecureRegistryCIDRs and IndexConfigs - // Clean InsecureRegistryCIDRs and IndexConfigs in config, as passed registries has all insecure registry info. - originalCIDRs := config.ServiceConfig.InsecureRegistryCIDRs - originalIndexInfos := config.ServiceConfig.IndexConfigs - - config.ServiceConfig.InsecureRegistryCIDRs = make([]*registrytypes.NetIPNet, 0) - config.ServiceConfig.IndexConfigs = make(map[string]*registrytypes.IndexInfo, 0) - -skip: - for _, r := range registries { - // validate insecure registry - if _, err := ValidateIndexName(r); err != nil { - // before returning err, roll back to original data - config.ServiceConfig.InsecureRegistryCIDRs = originalCIDRs - config.ServiceConfig.IndexConfigs = originalIndexInfos - return err - } - // Check if CIDR was passed to --insecure-registry - _, ipnet, err := net.ParseCIDR(r) - if err == nil { - // Valid CIDR. If ipnet is already in config.InsecureRegistryCIDRs, skip. - data := (*registrytypes.NetIPNet)(ipnet) - for _, value := range config.InsecureRegistryCIDRs { - if value.IP.String() == data.IP.String() && value.Mask.String() == data.Mask.String() { - continue skip - } - } - // ipnet is not found, add it in config.InsecureRegistryCIDRs - config.InsecureRegistryCIDRs = append(config.InsecureRegistryCIDRs, data) - - } else { - // Assume `host:port` if not CIDR. - config.IndexConfigs[r] = ®istrytypes.IndexInfo{ - Name: r, - Mirrors: make([]string, 0), - Secure: false, - Official: false, - } - } - } - - // Configure public registry. - config.IndexConfigs[IndexName] = ®istrytypes.IndexInfo{ - Name: IndexName, - Mirrors: config.Mirrors, - Secure: true, - Official: true, - } - - return nil -} - -// isSecureIndex returns false if the provided indexName is part of the list of insecure registries -// Insecure registries accept HTTP and/or accept HTTPS with certificates from unknown CAs. -// -// The list of insecure registries can contain an element with CIDR notation to specify a whole subnet. -// If the subnet contains one of the IPs of the registry specified by indexName, the latter is considered -// insecure. -// -// indexName should be a URL.Host (`host:port` or `host`) where the `host` part can be either a domain name -// or an IP address. If it is a domain name, then it will be resolved in order to check if the IP is contained -// in a subnet. If the resolving is not successful, isSecureIndex will only try to match hostname to any element -// of insecureRegistries. -func isSecureIndex(config *serviceConfig, indexName string) bool { - // Check for configured index, first. This is needed in case isSecureIndex - // is called from anything besides newIndexInfo, in order to honor per-index configurations. - if index, ok := config.IndexConfigs[indexName]; ok { - return index.Secure - } - - host, _, err := net.SplitHostPort(indexName) - if err != nil { - // assume indexName is of the form `host` without the port and go on. - host = indexName - } - - addrs, err := lookupIP(host) - if err != nil { - ip := net.ParseIP(host) - if ip != nil { - addrs = []net.IP{ip} - } - - // if ip == nil, then `host` is neither an IP nor it could be looked up, - // either because the index is unreachable, or because the index is behind an HTTP proxy. - // So, len(addrs) == 0 and we're not aborting. - } - - // Try CIDR notation only if addrs has any elements, i.e. if `host`'s IP could be determined. - for _, addr := range addrs { - for _, ipnet := range config.InsecureRegistryCIDRs { - // check if the addr falls in the subnet - if (*net.IPNet)(ipnet).Contains(addr) { - return false - } - } - } - - return true -} - -// ValidateMirror validates an HTTP(S) registry mirror -func ValidateMirror(val string) (string, error) { - uri, err := url.Parse(val) - if err != nil { - return "", fmt.Errorf("%s is not a valid URI", val) - } - - if uri.Scheme != "http" && uri.Scheme != "https" { - return "", fmt.Errorf("Unsupported scheme %s", uri.Scheme) - } - - if uri.Path != "" || uri.RawQuery != "" || uri.Fragment != "" { - return "", fmt.Errorf("Unsupported path/query/fragment at end of the URI") - } - - return fmt.Sprintf("%s://%s/", uri.Scheme, uri.Host), nil -} - -// ValidateIndexName validates an index name. -func ValidateIndexName(val string) (string, error) { - if val == reference.LegacyDefaultHostname { - val = reference.DefaultHostname - } - if strings.HasPrefix(val, "-") || strings.HasSuffix(val, "-") { - return "", fmt.Errorf("Invalid index name (%s). Cannot begin or end with a hyphen.", val) - } - return val, nil -} - -func validateNoScheme(reposName string) error { - if strings.Contains(reposName, "://") { - // It cannot contain a scheme! - return ErrInvalidRepositoryName - } - return nil -} - -// newIndexInfo returns IndexInfo configuration from indexName -func newIndexInfo(config *serviceConfig, indexName string) (*registrytypes.IndexInfo, error) { - var err error - indexName, err = ValidateIndexName(indexName) - if err != nil { - return nil, err - } - - // Return any configured index info, first. - if index, ok := config.IndexConfigs[indexName]; ok { - return index, nil - } - - // Construct a non-configured index info. - index := ®istrytypes.IndexInfo{ - Name: indexName, - Mirrors: make([]string, 0), - Official: false, - } - index.Secure = isSecureIndex(config, indexName) - return index, nil -} - -// GetAuthConfigKey special-cases using the full index address of the official -// index as the AuthConfig key, and uses the (host)name[:port] for private indexes. -func GetAuthConfigKey(index *registrytypes.IndexInfo) string { - if index.Official { - return IndexServer - } - return index.Name -} - -// newRepositoryInfo validates and breaks down a repository name into a RepositoryInfo -func newRepositoryInfo(config *serviceConfig, name reference.Named) (*RepositoryInfo, error) { - index, err := newIndexInfo(config, name.Hostname()) - if err != nil { - return nil, err - } - official := !strings.ContainsRune(name.Name(), '/') - return &RepositoryInfo{ - Named: name, - Index: index, - Official: official, - }, nil -} - -// ParseRepositoryInfo performs the breakdown of a repository name into a RepositoryInfo, but -// lacks registry configuration. -func ParseRepositoryInfo(reposName reference.Named) (*RepositoryInfo, error) { - return newRepositoryInfo(emptyServiceConfig, reposName) -} - -// ParseSearchIndexInfo will use repository name to get back an indexInfo. -func ParseSearchIndexInfo(reposName string) (*registrytypes.IndexInfo, error) { - indexName, _ := splitReposSearchTerm(reposName) - - indexInfo, err := newIndexInfo(emptyServiceConfig, indexName) - if err != nil { - return nil, err - } - return indexInfo, nil -} diff --git a/vendor/github.com/docker/docker/registry/config_test.go b/vendor/github.com/docker/docker/registry/config_test.go deleted file mode 100644 index 25578a7f2..000000000 --- a/vendor/github.com/docker/docker/registry/config_test.go +++ /dev/null @@ -1,49 +0,0 @@ -package registry - -import ( - "testing" -) - -func TestValidateMirror(t *testing.T) { - valid := []string{ - "http://mirror-1.com", - "https://mirror-1.com", - "http://localhost", - "https://localhost", - "http://localhost:5000", - "https://localhost:5000", - "http://127.0.0.1", - "https://127.0.0.1", - "http://127.0.0.1:5000", - "https://127.0.0.1:5000", - } - - invalid := []string{ - "!invalid!://%as%", - "ftp://mirror-1.com", - "http://mirror-1.com/", - "http://mirror-1.com/?q=foo", - "http://mirror-1.com/v1/", - "http://mirror-1.com/v1/?q=foo", - "http://mirror-1.com/v1/?q=foo#frag", - "http://mirror-1.com?q=foo", - "https://mirror-1.com#frag", - "https://mirror-1.com/", - "https://mirror-1.com/#frag", - "https://mirror-1.com/v1/", - "https://mirror-1.com/v1/#", - "https://mirror-1.com?q", - } - - for _, address := range valid { - if ret, err := ValidateMirror(address); err != nil || ret == "" { - t.Errorf("ValidateMirror(`"+address+"`) got %s %s", ret, err) - } - } - - for _, address := range invalid { - if ret, err := ValidateMirror(address); err == nil || ret != "" { - t.Errorf("ValidateMirror(`"+address+"`) got %s %s", ret, err) - } - } -} diff --git a/vendor/github.com/docker/docker/registry/config_unix.go b/vendor/github.com/docker/docker/registry/config_unix.go deleted file mode 100644 index d692e8ef5..000000000 --- a/vendor/github.com/docker/docker/registry/config_unix.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build !windows - -package registry - -import ( - "github.com/spf13/pflag" -) - -var ( - // CertsDir is the directory where certificates are stored - CertsDir = "/etc/docker/certs.d" -) - -// cleanPath is used to ensure that a directory name is valid on the target -// platform. It will be passed in something *similar* to a URL such as -// https:/index.docker.io/v1. Not all platforms support directory names -// which contain those characters (such as : on Windows) -func cleanPath(s string) string { - return s -} - -// installCliPlatformFlags handles any platform specific flags for the service. -func (options *ServiceOptions) installCliPlatformFlags(flags *pflag.FlagSet) { - flags.BoolVar(&options.V2Only, "disable-legacy-registry", false, "Disable contacting legacy registries") -} diff --git a/vendor/github.com/docker/docker/registry/config_windows.go b/vendor/github.com/docker/docker/registry/config_windows.go deleted file mode 100644 index d1b313dc1..000000000 --- a/vendor/github.com/docker/docker/registry/config_windows.go +++ /dev/null @@ -1,25 +0,0 @@ -package registry - -import ( - "os" - "path/filepath" - "strings" - - "github.com/spf13/pflag" -) - -// CertsDir is the directory where certificates are stored -var CertsDir = os.Getenv("programdata") + `\docker\certs.d` - -// cleanPath is used to ensure that a directory name is valid on the target -// platform. It will be passed in something *similar* to a URL such as -// https:\index.docker.io\v1. Not all platforms support directory names -// which contain those characters (such as : on Windows) -func cleanPath(s string) string { - return filepath.FromSlash(strings.Replace(s, ":", "", -1)) -} - -// installCliPlatformFlags handles any platform specific flags for the service. -func (options *ServiceOptions) installCliPlatformFlags(flags *pflag.FlagSet) { - // No Windows specific flags. -} diff --git a/vendor/github.com/docker/docker/registry/endpoint_test.go b/vendor/github.com/docker/docker/registry/endpoint_test.go deleted file mode 100644 index 8451d3f67..000000000 --- a/vendor/github.com/docker/docker/registry/endpoint_test.go +++ /dev/null @@ -1,78 +0,0 @@ -package registry - -import ( - "net/http" - "net/http/httptest" - "net/url" - "testing" -) - -func TestEndpointParse(t *testing.T) { - testData := []struct { - str string - expected string - }{ - {IndexServer, IndexServer}, - {"http://0.0.0.0:5000/v1/", "http://0.0.0.0:5000/v1/"}, - {"http://0.0.0.0:5000", "http://0.0.0.0:5000/v1/"}, - {"0.0.0.0:5000", "https://0.0.0.0:5000/v1/"}, - {"http://0.0.0.0:5000/nonversion/", "http://0.0.0.0:5000/nonversion/v1/"}, - {"http://0.0.0.0:5000/v0/", "http://0.0.0.0:5000/v0/v1/"}, - } - for _, td := range testData { - e, err := newV1EndpointFromStr(td.str, nil, "", nil) - if err != nil { - t.Errorf("%q: %s", td.str, err) - } - if e == nil { - t.Logf("something's fishy, endpoint for %q is nil", td.str) - continue - } - if e.String() != td.expected { - t.Errorf("expected %q, got %q", td.expected, e.String()) - } - } -} - -func TestEndpointParseInvalid(t *testing.T) { - testData := []string{ - "http://0.0.0.0:5000/v2/", - } - for _, td := range testData { - e, err := newV1EndpointFromStr(td, nil, "", nil) - if err == nil { - t.Errorf("expected error parsing %q: parsed as %q", td, e) - } - } -} - -// Ensure that a registry endpoint that responds with a 401 only is determined -// to be a valid v1 registry endpoint -func TestValidateEndpoint(t *testing.T) { - requireBasicAuthHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Add("WWW-Authenticate", `Basic realm="localhost"`) - w.WriteHeader(http.StatusUnauthorized) - }) - - // Make a test server which should validate as a v1 server. - testServer := httptest.NewServer(requireBasicAuthHandler) - defer testServer.Close() - - testServerURL, err := url.Parse(testServer.URL) - if err != nil { - t.Fatal(err) - } - - testEndpoint := V1Endpoint{ - URL: testServerURL, - client: HTTPClient(NewTransport(nil)), - } - - if err = validateEndpoint(&testEndpoint); err != nil { - t.Fatal(err) - } - - if testEndpoint.URL.Scheme != "http" { - t.Fatalf("expecting to validate endpoint as http, got url %s", testEndpoint.String()) - } -} diff --git a/vendor/github.com/docker/docker/registry/endpoint_v1.go b/vendor/github.com/docker/docker/registry/endpoint_v1.go deleted file mode 100644 index 6bcf8c935..000000000 --- a/vendor/github.com/docker/docker/registry/endpoint_v1.go +++ /dev/null @@ -1,198 +0,0 @@ -package registry - -import ( - "crypto/tls" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "net/url" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/registry/client/transport" - registrytypes "github.com/docker/docker/api/types/registry" -) - -// V1Endpoint stores basic information about a V1 registry endpoint. -type V1Endpoint struct { - client *http.Client - URL *url.URL - IsSecure bool -} - -// NewV1Endpoint parses the given address to return a registry endpoint. -func NewV1Endpoint(index *registrytypes.IndexInfo, userAgent string, metaHeaders http.Header) (*V1Endpoint, error) { - tlsConfig, err := newTLSConfig(index.Name, index.Secure) - if err != nil { - return nil, err - } - - endpoint, err := newV1EndpointFromStr(GetAuthConfigKey(index), tlsConfig, userAgent, metaHeaders) - if err != nil { - return nil, err - } - - if err := validateEndpoint(endpoint); err != nil { - return nil, err - } - - return endpoint, nil -} - -func validateEndpoint(endpoint *V1Endpoint) error { - logrus.Debugf("pinging registry endpoint %s", endpoint) - - // Try HTTPS ping to registry - endpoint.URL.Scheme = "https" - if _, err := endpoint.Ping(); err != nil { - if endpoint.IsSecure { - // If registry is secure and HTTPS failed, show user the error and tell them about `--insecure-registry` - // in case that's what they need. DO NOT accept unknown CA certificates, and DO NOT fallback to HTTP. - return fmt.Errorf("invalid registry endpoint %s: %v. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry %s` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/%s/ca.crt", endpoint, err, endpoint.URL.Host, endpoint.URL.Host) - } - - // If registry is insecure and HTTPS failed, fallback to HTTP. - logrus.Debugf("Error from registry %q marked as insecure: %v. Insecurely falling back to HTTP", endpoint, err) - endpoint.URL.Scheme = "http" - - var err2 error - if _, err2 = endpoint.Ping(); err2 == nil { - return nil - } - - return fmt.Errorf("invalid registry endpoint %q. HTTPS attempt: %v. HTTP attempt: %v", endpoint, err, err2) - } - - return nil -} - -func newV1Endpoint(address url.URL, tlsConfig *tls.Config, userAgent string, metaHeaders http.Header) (*V1Endpoint, error) { - endpoint := &V1Endpoint{ - IsSecure: (tlsConfig == nil || !tlsConfig.InsecureSkipVerify), - URL: new(url.URL), - } - - *endpoint.URL = address - - // TODO(tiborvass): make sure a ConnectTimeout transport is used - tr := NewTransport(tlsConfig) - endpoint.client = HTTPClient(transport.NewTransport(tr, DockerHeaders(userAgent, metaHeaders)...)) - return endpoint, nil -} - -// trimV1Address trims the version off the address and returns the -// trimmed address or an error if there is a non-V1 version. -func trimV1Address(address string) (string, error) { - var ( - chunks []string - apiVersionStr string - ) - - if strings.HasSuffix(address, "/") { - address = address[:len(address)-1] - } - - chunks = strings.Split(address, "/") - apiVersionStr = chunks[len(chunks)-1] - if apiVersionStr == "v1" { - return strings.Join(chunks[:len(chunks)-1], "/"), nil - } - - for k, v := range apiVersions { - if k != APIVersion1 && apiVersionStr == v { - return "", fmt.Errorf("unsupported V1 version path %s", apiVersionStr) - } - } - - return address, nil -} - -func newV1EndpointFromStr(address string, tlsConfig *tls.Config, userAgent string, metaHeaders http.Header) (*V1Endpoint, error) { - if !strings.HasPrefix(address, "http://") && !strings.HasPrefix(address, "https://") { - address = "https://" + address - } - - address, err := trimV1Address(address) - if err != nil { - return nil, err - } - - uri, err := url.Parse(address) - if err != nil { - return nil, err - } - - endpoint, err := newV1Endpoint(*uri, tlsConfig, userAgent, metaHeaders) - if err != nil { - return nil, err - } - - return endpoint, nil -} - -// Get the formatted URL for the root of this registry Endpoint -func (e *V1Endpoint) String() string { - return e.URL.String() + "/v1/" -} - -// Path returns a formatted string for the URL -// of this endpoint with the given path appended. -func (e *V1Endpoint) Path(path string) string { - return e.URL.String() + "/v1/" + path -} - -// Ping returns a PingResult which indicates whether the registry is standalone or not. -func (e *V1Endpoint) Ping() (PingResult, error) { - logrus.Debugf("attempting v1 ping for registry endpoint %s", e) - - if e.String() == IndexServer { - // Skip the check, we know this one is valid - // (and we never want to fallback to http in case of error) - return PingResult{Standalone: false}, nil - } - - req, err := http.NewRequest("GET", e.Path("_ping"), nil) - if err != nil { - return PingResult{Standalone: false}, err - } - - resp, err := e.client.Do(req) - if err != nil { - return PingResult{Standalone: false}, err - } - - defer resp.Body.Close() - - jsonString, err := ioutil.ReadAll(resp.Body) - if err != nil { - return PingResult{Standalone: false}, fmt.Errorf("error while reading the http response: %s", err) - } - - // If the header is absent, we assume true for compatibility with earlier - // versions of the registry. default to true - info := PingResult{ - Standalone: true, - } - if err := json.Unmarshal(jsonString, &info); err != nil { - logrus.Debugf("Error unmarshalling the _ping PingResult: %s", err) - // don't stop here. Just assume sane defaults - } - if hdr := resp.Header.Get("X-Docker-Registry-Version"); hdr != "" { - logrus.Debugf("Registry version header: '%s'", hdr) - info.Version = hdr - } - logrus.Debugf("PingResult.Version: %q", info.Version) - - standalone := resp.Header.Get("X-Docker-Registry-Standalone") - logrus.Debugf("Registry standalone header: '%s'", standalone) - // Accepted values are "true" (case-insensitive) and "1". - if strings.EqualFold(standalone, "true") || standalone == "1" { - info.Standalone = true - } else if len(standalone) > 0 { - // there is a header set, and it is not "true" or "1", so assume fails - info.Standalone = false - } - logrus.Debugf("PingResult.Standalone: %t", info.Standalone) - return info, nil -} diff --git a/vendor/github.com/docker/docker/registry/registry.go b/vendor/github.com/docker/docker/registry/registry.go deleted file mode 100644 index 17fa97ce3..000000000 --- a/vendor/github.com/docker/docker/registry/registry.go +++ /dev/null @@ -1,191 +0,0 @@ -// Package registry contains client primitives to interact with a remote Docker registry. -package registry - -import ( - "crypto/tls" - "errors" - "fmt" - "io/ioutil" - "net" - "net/http" - "os" - "path/filepath" - "strings" - "time" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/registry/client/transport" - "github.com/docker/go-connections/sockets" - "github.com/docker/go-connections/tlsconfig" -) - -var ( - // ErrAlreadyExists is an error returned if an image being pushed - // already exists on the remote side - ErrAlreadyExists = errors.New("Image already exists") -) - -func newTLSConfig(hostname string, isSecure bool) (*tls.Config, error) { - // PreferredServerCipherSuites should have no effect - tlsConfig := tlsconfig.ServerDefault() - - tlsConfig.InsecureSkipVerify = !isSecure - - if isSecure && CertsDir != "" { - hostDir := filepath.Join(CertsDir, cleanPath(hostname)) - logrus.Debugf("hostDir: %s", hostDir) - if err := ReadCertsDirectory(tlsConfig, hostDir); err != nil { - return nil, err - } - } - - return tlsConfig, nil -} - -func hasFile(files []os.FileInfo, name string) bool { - for _, f := range files { - if f.Name() == name { - return true - } - } - return false -} - -// ReadCertsDirectory reads the directory for TLS certificates -// including roots and certificate pairs and updates the -// provided TLS configuration. -func ReadCertsDirectory(tlsConfig *tls.Config, directory string) error { - fs, err := ioutil.ReadDir(directory) - if err != nil && !os.IsNotExist(err) { - return err - } - - for _, f := range fs { - if strings.HasSuffix(f.Name(), ".crt") { - if tlsConfig.RootCAs == nil { - systemPool, err := tlsconfig.SystemCertPool() - if err != nil { - return fmt.Errorf("unable to get system cert pool: %v", err) - } - tlsConfig.RootCAs = systemPool - } - logrus.Debugf("crt: %s", filepath.Join(directory, f.Name())) - data, err := ioutil.ReadFile(filepath.Join(directory, f.Name())) - if err != nil { - return err - } - tlsConfig.RootCAs.AppendCertsFromPEM(data) - } - if strings.HasSuffix(f.Name(), ".cert") { - certName := f.Name() - keyName := certName[:len(certName)-5] + ".key" - logrus.Debugf("cert: %s", filepath.Join(directory, f.Name())) - if !hasFile(fs, keyName) { - return fmt.Errorf("Missing key %s for client certificate %s. Note that CA certificates should use the extension .crt.", keyName, certName) - } - cert, err := tls.LoadX509KeyPair(filepath.Join(directory, certName), filepath.Join(directory, keyName)) - if err != nil { - return err - } - tlsConfig.Certificates = append(tlsConfig.Certificates, cert) - } - if strings.HasSuffix(f.Name(), ".key") { - keyName := f.Name() - certName := keyName[:len(keyName)-4] + ".cert" - logrus.Debugf("key: %s", filepath.Join(directory, f.Name())) - if !hasFile(fs, certName) { - return fmt.Errorf("Missing client certificate %s for key %s", certName, keyName) - } - } - } - - return nil -} - -// DockerHeaders returns request modifiers with a User-Agent and metaHeaders -func DockerHeaders(userAgent string, metaHeaders http.Header) []transport.RequestModifier { - modifiers := []transport.RequestModifier{} - if userAgent != "" { - modifiers = append(modifiers, transport.NewHeaderRequestModifier(http.Header{ - "User-Agent": []string{userAgent}, - })) - } - if metaHeaders != nil { - modifiers = append(modifiers, transport.NewHeaderRequestModifier(metaHeaders)) - } - return modifiers -} - -// HTTPClient returns an HTTP client structure which uses the given transport -// and contains the necessary headers for redirected requests -func HTTPClient(transport http.RoundTripper) *http.Client { - return &http.Client{ - Transport: transport, - CheckRedirect: addRequiredHeadersToRedirectedRequests, - } -} - -func trustedLocation(req *http.Request) bool { - var ( - trusteds = []string{"docker.com", "docker.io"} - hostname = strings.SplitN(req.Host, ":", 2)[0] - ) - if req.URL.Scheme != "https" { - return false - } - - for _, trusted := range trusteds { - if hostname == trusted || strings.HasSuffix(hostname, "."+trusted) { - return true - } - } - return false -} - -// addRequiredHeadersToRedirectedRequests adds the necessary redirection headers -// for redirected requests -func addRequiredHeadersToRedirectedRequests(req *http.Request, via []*http.Request) error { - if via != nil && via[0] != nil { - if trustedLocation(req) && trustedLocation(via[0]) { - req.Header = via[0].Header - return nil - } - for k, v := range via[0].Header { - if k != "Authorization" { - for _, vv := range v { - req.Header.Add(k, vv) - } - } - } - } - return nil -} - -// NewTransport returns a new HTTP transport. If tlsConfig is nil, it uses the -// default TLS configuration. -func NewTransport(tlsConfig *tls.Config) *http.Transport { - if tlsConfig == nil { - tlsConfig = tlsconfig.ServerDefault() - } - - direct := &net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - DualStack: true, - } - - base := &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: direct.Dial, - TLSHandshakeTimeout: 10 * time.Second, - TLSClientConfig: tlsConfig, - // TODO(dmcgowan): Call close idle connections when complete and use keep alive - DisableKeepAlives: true, - } - - proxyDialer, err := sockets.DialerFromEnvironment(direct) - if err == nil { - base.Dial = proxyDialer.Dial - } - return base -} diff --git a/vendor/github.com/docker/docker/registry/registry_mock_test.go b/vendor/github.com/docker/docker/registry/registry_mock_test.go deleted file mode 100644 index 21fc1fdcc..000000000 --- a/vendor/github.com/docker/docker/registry/registry_mock_test.go +++ /dev/null @@ -1,478 +0,0 @@ -// +build !solaris - -package registry - -import ( - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "net/http/httptest" - "net/url" - "strconv" - "strings" - "testing" - "time" - - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/reference" - "github.com/gorilla/mux" - - "github.com/Sirupsen/logrus" -) - -var ( - testHTTPServer *httptest.Server - testHTTPSServer *httptest.Server - testLayers = map[string]map[string]string{ - "77dbf71da1d00e3fbddc480176eac8994025630c6590d11cfc8fe1209c2a1d20": { - "json": `{"id":"77dbf71da1d00e3fbddc480176eac8994025630c6590d11cfc8fe1209c2a1d20", - "comment":"test base image","created":"2013-03-23T12:53:11.10432-07:00", - "container_config":{"Hostname":"","User":"","Memory":0,"MemorySwap":0, - "CpuShares":0,"AttachStdin":false,"AttachStdout":false,"AttachStderr":false, - "Tty":false,"OpenStdin":false,"StdinOnce":false, - "Env":null,"Cmd":null,"Dns":null,"Image":"","Volumes":null, - "VolumesFrom":"","Entrypoint":null},"Size":424242}`, - "checksum_simple": "sha256:1ac330d56e05eef6d438586545ceff7550d3bdcb6b19961f12c5ba714ee1bb37", - "checksum_tarsum": "tarsum+sha256:4409a0685741ca86d38df878ed6f8cbba4c99de5dc73cd71aef04be3bb70be7c", - "ancestry": `["77dbf71da1d00e3fbddc480176eac8994025630c6590d11cfc8fe1209c2a1d20"]`, - "layer": string([]byte{ - 0x1f, 0x8b, 0x08, 0x08, 0x0e, 0xb0, 0xee, 0x51, 0x02, 0x03, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x2e, 0x74, 0x61, 0x72, 0x00, 0xed, 0xd2, 0x31, 0x0e, 0xc2, 0x30, 0x0c, 0x05, - 0x50, 0xcf, 0x9c, 0xc2, 0x27, 0x48, 0xed, 0x38, 0x4e, 0xce, 0x13, 0x44, 0x2b, 0x66, - 0x62, 0x24, 0x8e, 0x4f, 0xa0, 0x15, 0x63, 0xb6, 0x20, 0x21, 0xfc, 0x96, 0xbf, 0x78, - 0xb0, 0xf5, 0x1d, 0x16, 0x98, 0x8e, 0x88, 0x8a, 0x2a, 0xbe, 0x33, 0xef, 0x49, 0x31, - 0xed, 0x79, 0x40, 0x8e, 0x5c, 0x44, 0x85, 0x88, 0x33, 0x12, 0x73, 0x2c, 0x02, 0xa8, - 0xf0, 0x05, 0xf7, 0x66, 0xf5, 0xd6, 0x57, 0x69, 0xd7, 0x7a, 0x19, 0xcd, 0xf5, 0xb1, - 0x6d, 0x1b, 0x1f, 0xf9, 0xba, 0xe3, 0x93, 0x3f, 0x22, 0x2c, 0xb6, 0x36, 0x0b, 0xf6, - 0xb0, 0xa9, 0xfd, 0xe7, 0x94, 0x46, 0xfd, 0xeb, 0xd1, 0x7f, 0x2c, 0xc4, 0xd2, 0xfb, - 0x97, 0xfe, 0x02, 0x80, 0xe4, 0xfd, 0x4f, 0x77, 0xae, 0x6d, 0x3d, 0x81, 0x73, 0xce, - 0xb9, 0x7f, 0xf3, 0x04, 0x41, 0xc1, 0xab, 0xc6, 0x00, 0x0a, 0x00, 0x00, - }), - }, - "42d718c941f5c532ac049bf0b0ab53f0062f09a03afd4aa4a02c098e46032b9d": { - "json": `{"id":"42d718c941f5c532ac049bf0b0ab53f0062f09a03afd4aa4a02c098e46032b9d", - "parent":"77dbf71da1d00e3fbddc480176eac8994025630c6590d11cfc8fe1209c2a1d20", - "comment":"test base image","created":"2013-03-23T12:55:11.10432-07:00", - "container_config":{"Hostname":"","User":"","Memory":0,"MemorySwap":0, - "CpuShares":0,"AttachStdin":false,"AttachStdout":false,"AttachStderr":false, - "Tty":false,"OpenStdin":false,"StdinOnce":false, - "Env":null,"Cmd":null,"Dns":null,"Image":"","Volumes":null, - "VolumesFrom":"","Entrypoint":null},"Size":424242}`, - "checksum_simple": "sha256:bea7bf2e4bacd479344b737328db47b18880d09096e6674165533aa994f5e9f2", - "checksum_tarsum": "tarsum+sha256:68fdb56fb364f074eec2c9b3f85ca175329c4dcabc4a6a452b7272aa613a07a2", - "ancestry": `["42d718c941f5c532ac049bf0b0ab53f0062f09a03afd4aa4a02c098e46032b9d", - "77dbf71da1d00e3fbddc480176eac8994025630c6590d11cfc8fe1209c2a1d20"]`, - "layer": string([]byte{ - 0x1f, 0x8b, 0x08, 0x08, 0xbd, 0xb3, 0xee, 0x51, 0x02, 0x03, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x2e, 0x74, 0x61, 0x72, 0x00, 0xed, 0xd1, 0x31, 0x0e, 0xc2, 0x30, 0x0c, 0x05, - 0x50, 0xcf, 0x9c, 0xc2, 0x27, 0x48, 0x9d, 0x38, 0x8e, 0xcf, 0x53, 0x51, 0xaa, 0x56, - 0xea, 0x44, 0x82, 0xc4, 0xf1, 0x09, 0xb4, 0xea, 0x98, 0x2d, 0x48, 0x08, 0xbf, 0xe5, - 0x2f, 0x1e, 0xfc, 0xf5, 0xdd, 0x00, 0xdd, 0x11, 0x91, 0x8a, 0xe0, 0x27, 0xd3, 0x9e, - 0x14, 0xe2, 0x9e, 0x07, 0xf4, 0xc1, 0x2b, 0x0b, 0xfb, 0xa4, 0x82, 0xe4, 0x3d, 0x93, - 0x02, 0x0a, 0x7c, 0xc1, 0x23, 0x97, 0xf1, 0x5e, 0x5f, 0xc9, 0xcb, 0x38, 0xb5, 0xee, - 0xea, 0xd9, 0x3c, 0xb7, 0x4b, 0xbe, 0x7b, 0x9c, 0xf9, 0x23, 0xdc, 0x50, 0x6e, 0xb9, - 0xb8, 0xf2, 0x2c, 0x5d, 0xf7, 0x4f, 0x31, 0xb6, 0xf6, 0x4f, 0xc7, 0xfe, 0x41, 0x55, - 0x63, 0xdd, 0x9f, 0x89, 0x09, 0x90, 0x6c, 0xff, 0xee, 0xae, 0xcb, 0xba, 0x4d, 0x17, - 0x30, 0xc6, 0x18, 0xf3, 0x67, 0x5e, 0xc1, 0xed, 0x21, 0x5d, 0x00, 0x0a, 0x00, 0x00, - }), - }, - } - testRepositories = map[string]map[string]string{ - "foo42/bar": { - "latest": "42d718c941f5c532ac049bf0b0ab53f0062f09a03afd4aa4a02c098e46032b9d", - "test": "42d718c941f5c532ac049bf0b0ab53f0062f09a03afd4aa4a02c098e46032b9d", - }, - } - mockHosts = map[string][]net.IP{ - "": {net.ParseIP("0.0.0.0")}, - "localhost": {net.ParseIP("127.0.0.1"), net.ParseIP("::1")}, - "example.com": {net.ParseIP("42.42.42.42")}, - "other.com": {net.ParseIP("43.43.43.43")}, - } -) - -func init() { - r := mux.NewRouter() - - // /v1/ - r.HandleFunc("/v1/_ping", handlerGetPing).Methods("GET") - r.HandleFunc("/v1/images/{image_id:[^/]+}/{action:json|layer|ancestry}", handlerGetImage).Methods("GET") - r.HandleFunc("/v1/images/{image_id:[^/]+}/{action:json|layer|checksum}", handlerPutImage).Methods("PUT") - r.HandleFunc("/v1/repositories/{repository:.+}/tags", handlerGetDeleteTags).Methods("GET", "DELETE") - r.HandleFunc("/v1/repositories/{repository:.+}/tags/{tag:.+}", handlerGetTag).Methods("GET") - r.HandleFunc("/v1/repositories/{repository:.+}/tags/{tag:.+}", handlerPutTag).Methods("PUT") - r.HandleFunc("/v1/users{null:.*}", handlerUsers).Methods("GET", "POST", "PUT") - r.HandleFunc("/v1/repositories/{repository:.+}{action:/images|/}", handlerImages).Methods("GET", "PUT", "DELETE") - r.HandleFunc("/v1/repositories/{repository:.+}/auth", handlerAuth).Methods("PUT") - r.HandleFunc("/v1/search", handlerSearch).Methods("GET") - - // /v2/ - r.HandleFunc("/v2/version", handlerGetPing).Methods("GET") - - testHTTPServer = httptest.NewServer(handlerAccessLog(r)) - testHTTPSServer = httptest.NewTLSServer(handlerAccessLog(r)) - - // override net.LookupIP - lookupIP = func(host string) ([]net.IP, error) { - if host == "127.0.0.1" { - // I believe in future Go versions this will fail, so let's fix it later - return net.LookupIP(host) - } - for h, addrs := range mockHosts { - if host == h { - return addrs, nil - } - for _, addr := range addrs { - if addr.String() == host { - return []net.IP{addr}, nil - } - } - } - return nil, errors.New("lookup: no such host") - } -} - -func handlerAccessLog(handler http.Handler) http.Handler { - logHandler := func(w http.ResponseWriter, r *http.Request) { - logrus.Debugf("%s \"%s %s\"", r.RemoteAddr, r.Method, r.URL) - handler.ServeHTTP(w, r) - } - return http.HandlerFunc(logHandler) -} - -func makeURL(req string) string { - return testHTTPServer.URL + req -} - -func makeHTTPSURL(req string) string { - return testHTTPSServer.URL + req -} - -func makeIndex(req string) *registrytypes.IndexInfo { - index := ®istrytypes.IndexInfo{ - Name: makeURL(req), - } - return index -} - -func makeHTTPSIndex(req string) *registrytypes.IndexInfo { - index := ®istrytypes.IndexInfo{ - Name: makeHTTPSURL(req), - } - return index -} - -func makePublicIndex() *registrytypes.IndexInfo { - index := ®istrytypes.IndexInfo{ - Name: IndexServer, - Secure: true, - Official: true, - } - return index -} - -func makeServiceConfig(mirrors []string, insecureRegistries []string) *serviceConfig { - options := ServiceOptions{ - Mirrors: mirrors, - InsecureRegistries: insecureRegistries, - } - - return newServiceConfig(options) -} - -func writeHeaders(w http.ResponseWriter) { - h := w.Header() - h.Add("Server", "docker-tests/mock") - h.Add("Expires", "-1") - h.Add("Content-Type", "application/json") - h.Add("Pragma", "no-cache") - h.Add("Cache-Control", "no-cache") - h.Add("X-Docker-Registry-Version", "0.0.0") - h.Add("X-Docker-Registry-Config", "mock") -} - -func writeResponse(w http.ResponseWriter, message interface{}, code int) { - writeHeaders(w) - w.WriteHeader(code) - body, err := json.Marshal(message) - if err != nil { - io.WriteString(w, err.Error()) - return - } - w.Write(body) -} - -func readJSON(r *http.Request, dest interface{}) error { - body, err := ioutil.ReadAll(r.Body) - if err != nil { - return err - } - return json.Unmarshal(body, dest) -} - -func apiError(w http.ResponseWriter, message string, code int) { - body := map[string]string{ - "error": message, - } - writeResponse(w, body, code) -} - -func assertEqual(t *testing.T, a interface{}, b interface{}, message string) { - if a == b { - return - } - if len(message) == 0 { - message = fmt.Sprintf("%v != %v", a, b) - } - t.Fatal(message) -} - -func assertNotEqual(t *testing.T, a interface{}, b interface{}, message string) { - if a != b { - return - } - if len(message) == 0 { - message = fmt.Sprintf("%v == %v", a, b) - } - t.Fatal(message) -} - -// Similar to assertEqual, but does not stop test -func checkEqual(t *testing.T, a interface{}, b interface{}, messagePrefix string) { - if a == b { - return - } - message := fmt.Sprintf("%v != %v", a, b) - if len(messagePrefix) != 0 { - message = messagePrefix + ": " + message - } - t.Error(message) -} - -// Similar to assertNotEqual, but does not stop test -func checkNotEqual(t *testing.T, a interface{}, b interface{}, messagePrefix string) { - if a != b { - return - } - message := fmt.Sprintf("%v == %v", a, b) - if len(messagePrefix) != 0 { - message = messagePrefix + ": " + message - } - t.Error(message) -} - -func requiresAuth(w http.ResponseWriter, r *http.Request) bool { - writeCookie := func() { - value := fmt.Sprintf("FAKE-SESSION-%d", time.Now().UnixNano()) - cookie := &http.Cookie{Name: "session", Value: value, MaxAge: 3600} - http.SetCookie(w, cookie) - //FIXME(sam): this should be sent only on Index routes - value = fmt.Sprintf("FAKE-TOKEN-%d", time.Now().UnixNano()) - w.Header().Add("X-Docker-Token", value) - } - if len(r.Cookies()) > 0 { - writeCookie() - return true - } - if len(r.Header.Get("Authorization")) > 0 { - writeCookie() - return true - } - w.Header().Add("WWW-Authenticate", "token") - apiError(w, "Wrong auth", 401) - return false -} - -func handlerGetPing(w http.ResponseWriter, r *http.Request) { - writeResponse(w, true, 200) -} - -func handlerGetImage(w http.ResponseWriter, r *http.Request) { - if !requiresAuth(w, r) { - return - } - vars := mux.Vars(r) - layer, exists := testLayers[vars["image_id"]] - if !exists { - http.NotFound(w, r) - return - } - writeHeaders(w) - layerSize := len(layer["layer"]) - w.Header().Add("X-Docker-Size", strconv.Itoa(layerSize)) - io.WriteString(w, layer[vars["action"]]) -} - -func handlerPutImage(w http.ResponseWriter, r *http.Request) { - if !requiresAuth(w, r) { - return - } - vars := mux.Vars(r) - imageID := vars["image_id"] - action := vars["action"] - layer, exists := testLayers[imageID] - if !exists { - if action != "json" { - http.NotFound(w, r) - return - } - layer = make(map[string]string) - testLayers[imageID] = layer - } - if checksum := r.Header.Get("X-Docker-Checksum"); checksum != "" { - if checksum != layer["checksum_simple"] && checksum != layer["checksum_tarsum"] { - apiError(w, "Wrong checksum", 400) - return - } - } - body, err := ioutil.ReadAll(r.Body) - if err != nil { - apiError(w, fmt.Sprintf("Error: %s", err), 500) - return - } - layer[action] = string(body) - writeResponse(w, true, 200) -} - -func handlerGetDeleteTags(w http.ResponseWriter, r *http.Request) { - if !requiresAuth(w, r) { - return - } - repositoryName, err := reference.WithName(mux.Vars(r)["repository"]) - if err != nil { - apiError(w, "Could not parse repository", 400) - return - } - tags, exists := testRepositories[repositoryName.String()] - if !exists { - apiError(w, "Repository not found", 404) - return - } - if r.Method == "DELETE" { - delete(testRepositories, repositoryName.String()) - writeResponse(w, true, 200) - return - } - writeResponse(w, tags, 200) -} - -func handlerGetTag(w http.ResponseWriter, r *http.Request) { - if !requiresAuth(w, r) { - return - } - vars := mux.Vars(r) - repositoryName, err := reference.WithName(vars["repository"]) - if err != nil { - apiError(w, "Could not parse repository", 400) - return - } - tagName := vars["tag"] - tags, exists := testRepositories[repositoryName.String()] - if !exists { - apiError(w, "Repository not found", 404) - return - } - tag, exists := tags[tagName] - if !exists { - apiError(w, "Tag not found", 404) - return - } - writeResponse(w, tag, 200) -} - -func handlerPutTag(w http.ResponseWriter, r *http.Request) { - if !requiresAuth(w, r) { - return - } - vars := mux.Vars(r) - repositoryName, err := reference.WithName(vars["repository"]) - if err != nil { - apiError(w, "Could not parse repository", 400) - return - } - tagName := vars["tag"] - tags, exists := testRepositories[repositoryName.String()] - if !exists { - tags = make(map[string]string) - testRepositories[repositoryName.String()] = tags - } - tagValue := "" - readJSON(r, tagValue) - tags[tagName] = tagValue - writeResponse(w, true, 200) -} - -func handlerUsers(w http.ResponseWriter, r *http.Request) { - code := 200 - if r.Method == "POST" { - code = 201 - } else if r.Method == "PUT" { - code = 204 - } - writeResponse(w, "", code) -} - -func handlerImages(w http.ResponseWriter, r *http.Request) { - u, _ := url.Parse(testHTTPServer.URL) - w.Header().Add("X-Docker-Endpoints", fmt.Sprintf("%s , %s ", u.Host, "test.example.com")) - w.Header().Add("X-Docker-Token", fmt.Sprintf("FAKE-SESSION-%d", time.Now().UnixNano())) - if r.Method == "PUT" { - if strings.HasSuffix(r.URL.Path, "images") { - writeResponse(w, "", 204) - return - } - writeResponse(w, "", 200) - return - } - if r.Method == "DELETE" { - writeResponse(w, "", 204) - return - } - images := []map[string]string{} - for imageID, layer := range testLayers { - image := make(map[string]string) - image["id"] = imageID - image["checksum"] = layer["checksum_tarsum"] - image["Tag"] = "latest" - images = append(images, image) - } - writeResponse(w, images, 200) -} - -func handlerAuth(w http.ResponseWriter, r *http.Request) { - writeResponse(w, "OK", 200) -} - -func handlerSearch(w http.ResponseWriter, r *http.Request) { - result := ®istrytypes.SearchResults{ - Query: "fakequery", - NumResults: 1, - Results: []registrytypes.SearchResult{{Name: "fakeimage", StarCount: 42}}, - } - writeResponse(w, result, 200) -} - -func TestPing(t *testing.T) { - res, err := http.Get(makeURL("/v1/_ping")) - if err != nil { - t.Fatal(err) - } - assertEqual(t, res.StatusCode, 200, "") - assertEqual(t, res.Header.Get("X-Docker-Registry-Config"), "mock", - "This is not a Mocked Registry") -} - -/* Uncomment this to test Mocked Registry locally with curl - * WARNING: Don't push on the repos uncommented, it'll block the tests - * -func TestWait(t *testing.T) { - logrus.Println("Test HTTP server ready and waiting:", testHTTPServer.URL) - c := make(chan int) - <-c -} - -//*/ diff --git a/vendor/github.com/docker/docker/registry/registry_test.go b/vendor/github.com/docker/docker/registry/registry_test.go deleted file mode 100644 index 786dfbed4..000000000 --- a/vendor/github.com/docker/docker/registry/registry_test.go +++ /dev/null @@ -1,875 +0,0 @@ -// +build !solaris - -package registry - -import ( - "fmt" - "net/http" - "net/http/httputil" - "net/url" - "strings" - "testing" - - "github.com/docker/distribution/registry/client/transport" - "github.com/docker/docker/api/types" - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/reference" -) - -var ( - token = []string{"fake-token"} -) - -const ( - imageID = "42d718c941f5c532ac049bf0b0ab53f0062f09a03afd4aa4a02c098e46032b9d" - REPO = "foo42/bar" -) - -func spawnTestRegistrySession(t *testing.T) *Session { - authConfig := &types.AuthConfig{} - endpoint, err := NewV1Endpoint(makeIndex("/v1/"), "", nil) - if err != nil { - t.Fatal(err) - } - userAgent := "docker test client" - var tr http.RoundTripper = debugTransport{NewTransport(nil), t.Log} - tr = transport.NewTransport(AuthTransport(tr, authConfig, false), DockerHeaders(userAgent, nil)...) - client := HTTPClient(tr) - r, err := NewSession(client, authConfig, endpoint) - if err != nil { - t.Fatal(err) - } - // In a normal scenario for the v1 registry, the client should send a `X-Docker-Token: true` - // header while authenticating, in order to retrieve a token that can be later used to - // perform authenticated actions. - // - // The mock v1 registry does not support that, (TODO(tiborvass): support it), instead, - // it will consider authenticated any request with the header `X-Docker-Token: fake-token`. - // - // Because we know that the client's transport is an `*authTransport` we simply cast it, - // in order to set the internal cached token to the fake token, and thus send that fake token - // upon every subsequent requests. - r.client.Transport.(*authTransport).token = token - return r -} - -func TestPingRegistryEndpoint(t *testing.T) { - testPing := func(index *registrytypes.IndexInfo, expectedStandalone bool, assertMessage string) { - ep, err := NewV1Endpoint(index, "", nil) - if err != nil { - t.Fatal(err) - } - regInfo, err := ep.Ping() - if err != nil { - t.Fatal(err) - } - - assertEqual(t, regInfo.Standalone, expectedStandalone, assertMessage) - } - - testPing(makeIndex("/v1/"), true, "Expected standalone to be true (default)") - testPing(makeHTTPSIndex("/v1/"), true, "Expected standalone to be true (default)") - testPing(makePublicIndex(), false, "Expected standalone to be false for public index") -} - -func TestEndpoint(t *testing.T) { - // Simple wrapper to fail test if err != nil - expandEndpoint := func(index *registrytypes.IndexInfo) *V1Endpoint { - endpoint, err := NewV1Endpoint(index, "", nil) - if err != nil { - t.Fatal(err) - } - return endpoint - } - - assertInsecureIndex := func(index *registrytypes.IndexInfo) { - index.Secure = true - _, err := NewV1Endpoint(index, "", nil) - assertNotEqual(t, err, nil, index.Name+": Expected error for insecure index") - assertEqual(t, strings.Contains(err.Error(), "insecure-registry"), true, index.Name+": Expected insecure-registry error for insecure index") - index.Secure = false - } - - assertSecureIndex := func(index *registrytypes.IndexInfo) { - index.Secure = true - _, err := NewV1Endpoint(index, "", nil) - assertNotEqual(t, err, nil, index.Name+": Expected cert error for secure index") - assertEqual(t, strings.Contains(err.Error(), "certificate signed by unknown authority"), true, index.Name+": Expected cert error for secure index") - index.Secure = false - } - - index := ®istrytypes.IndexInfo{} - index.Name = makeURL("/v1/") - endpoint := expandEndpoint(index) - assertEqual(t, endpoint.String(), index.Name, "Expected endpoint to be "+index.Name) - assertInsecureIndex(index) - - index.Name = makeURL("") - endpoint = expandEndpoint(index) - assertEqual(t, endpoint.String(), index.Name+"/v1/", index.Name+": Expected endpoint to be "+index.Name+"/v1/") - assertInsecureIndex(index) - - httpURL := makeURL("") - index.Name = strings.SplitN(httpURL, "://", 2)[1] - endpoint = expandEndpoint(index) - assertEqual(t, endpoint.String(), httpURL+"/v1/", index.Name+": Expected endpoint to be "+httpURL+"/v1/") - assertInsecureIndex(index) - - index.Name = makeHTTPSURL("/v1/") - endpoint = expandEndpoint(index) - assertEqual(t, endpoint.String(), index.Name, "Expected endpoint to be "+index.Name) - assertSecureIndex(index) - - index.Name = makeHTTPSURL("") - endpoint = expandEndpoint(index) - assertEqual(t, endpoint.String(), index.Name+"/v1/", index.Name+": Expected endpoint to be "+index.Name+"/v1/") - assertSecureIndex(index) - - httpsURL := makeHTTPSURL("") - index.Name = strings.SplitN(httpsURL, "://", 2)[1] - endpoint = expandEndpoint(index) - assertEqual(t, endpoint.String(), httpsURL+"/v1/", index.Name+": Expected endpoint to be "+httpsURL+"/v1/") - assertSecureIndex(index) - - badEndpoints := []string{ - "http://127.0.0.1/v1/", - "https://127.0.0.1/v1/", - "http://127.0.0.1", - "https://127.0.0.1", - "127.0.0.1", - } - for _, address := range badEndpoints { - index.Name = address - _, err := NewV1Endpoint(index, "", nil) - checkNotEqual(t, err, nil, "Expected error while expanding bad endpoint") - } -} - -func TestGetRemoteHistory(t *testing.T) { - r := spawnTestRegistrySession(t) - hist, err := r.GetRemoteHistory(imageID, makeURL("/v1/")) - if err != nil { - t.Fatal(err) - } - assertEqual(t, len(hist), 2, "Expected 2 images in history") - assertEqual(t, hist[0], imageID, "Expected "+imageID+"as first ancestry") - assertEqual(t, hist[1], "77dbf71da1d00e3fbddc480176eac8994025630c6590d11cfc8fe1209c2a1d20", - "Unexpected second ancestry") -} - -func TestLookupRemoteImage(t *testing.T) { - r := spawnTestRegistrySession(t) - err := r.LookupRemoteImage(imageID, makeURL("/v1/")) - assertEqual(t, err, nil, "Expected error of remote lookup to nil") - if err := r.LookupRemoteImage("abcdef", makeURL("/v1/")); err == nil { - t.Fatal("Expected error of remote lookup to not nil") - } -} - -func TestGetRemoteImageJSON(t *testing.T) { - r := spawnTestRegistrySession(t) - json, size, err := r.GetRemoteImageJSON(imageID, makeURL("/v1/")) - if err != nil { - t.Fatal(err) - } - assertEqual(t, size, int64(154), "Expected size 154") - if len(json) == 0 { - t.Fatal("Expected non-empty json") - } - - _, _, err = r.GetRemoteImageJSON("abcdef", makeURL("/v1/")) - if err == nil { - t.Fatal("Expected image not found error") - } -} - -func TestGetRemoteImageLayer(t *testing.T) { - r := spawnTestRegistrySession(t) - data, err := r.GetRemoteImageLayer(imageID, makeURL("/v1/"), 0) - if err != nil { - t.Fatal(err) - } - if data == nil { - t.Fatal("Expected non-nil data result") - } - - _, err = r.GetRemoteImageLayer("abcdef", makeURL("/v1/"), 0) - if err == nil { - t.Fatal("Expected image not found error") - } -} - -func TestGetRemoteTag(t *testing.T) { - r := spawnTestRegistrySession(t) - repoRef, err := reference.ParseNamed(REPO) - if err != nil { - t.Fatal(err) - } - tag, err := r.GetRemoteTag([]string{makeURL("/v1/")}, repoRef, "test") - if err != nil { - t.Fatal(err) - } - assertEqual(t, tag, imageID, "Expected tag test to map to "+imageID) - - bazRef, err := reference.ParseNamed("foo42/baz") - if err != nil { - t.Fatal(err) - } - _, err = r.GetRemoteTag([]string{makeURL("/v1/")}, bazRef, "foo") - if err != ErrRepoNotFound { - t.Fatal("Expected ErrRepoNotFound error when fetching tag for bogus repo") - } -} - -func TestGetRemoteTags(t *testing.T) { - r := spawnTestRegistrySession(t) - repoRef, err := reference.ParseNamed(REPO) - if err != nil { - t.Fatal(err) - } - tags, err := r.GetRemoteTags([]string{makeURL("/v1/")}, repoRef) - if err != nil { - t.Fatal(err) - } - assertEqual(t, len(tags), 2, "Expected two tags") - assertEqual(t, tags["latest"], imageID, "Expected tag latest to map to "+imageID) - assertEqual(t, tags["test"], imageID, "Expected tag test to map to "+imageID) - - bazRef, err := reference.ParseNamed("foo42/baz") - if err != nil { - t.Fatal(err) - } - _, err = r.GetRemoteTags([]string{makeURL("/v1/")}, bazRef) - if err != ErrRepoNotFound { - t.Fatal("Expected ErrRepoNotFound error when fetching tags for bogus repo") - } -} - -func TestGetRepositoryData(t *testing.T) { - r := spawnTestRegistrySession(t) - parsedURL, err := url.Parse(makeURL("/v1/")) - if err != nil { - t.Fatal(err) - } - host := "http://" + parsedURL.Host + "/v1/" - repoRef, err := reference.ParseNamed(REPO) - if err != nil { - t.Fatal(err) - } - data, err := r.GetRepositoryData(repoRef) - if err != nil { - t.Fatal(err) - } - assertEqual(t, len(data.ImgList), 2, "Expected 2 images in ImgList") - assertEqual(t, len(data.Endpoints), 2, - fmt.Sprintf("Expected 2 endpoints in Endpoints, found %d instead", len(data.Endpoints))) - assertEqual(t, data.Endpoints[0], host, - fmt.Sprintf("Expected first endpoint to be %s but found %s instead", host, data.Endpoints[0])) - assertEqual(t, data.Endpoints[1], "http://test.example.com/v1/", - fmt.Sprintf("Expected first endpoint to be http://test.example.com/v1/ but found %s instead", data.Endpoints[1])) - -} - -func TestPushImageJSONRegistry(t *testing.T) { - r := spawnTestRegistrySession(t) - imgData := &ImgData{ - ID: "77dbf71da1d00e3fbddc480176eac8994025630c6590d11cfc8fe1209c2a1d20", - Checksum: "sha256:1ac330d56e05eef6d438586545ceff7550d3bdcb6b19961f12c5ba714ee1bb37", - } - - err := r.PushImageJSONRegistry(imgData, []byte{0x42, 0xdf, 0x0}, makeURL("/v1/")) - if err != nil { - t.Fatal(err) - } -} - -func TestPushImageLayerRegistry(t *testing.T) { - r := spawnTestRegistrySession(t) - layer := strings.NewReader("") - _, _, err := r.PushImageLayerRegistry(imageID, layer, makeURL("/v1/"), []byte{}) - if err != nil { - t.Fatal(err) - } -} - -func TestParseRepositoryInfo(t *testing.T) { - type staticRepositoryInfo struct { - Index *registrytypes.IndexInfo - RemoteName string - CanonicalName string - LocalName string - Official bool - } - - expectedRepoInfos := map[string]staticRepositoryInfo{ - "fooo/bar": { - Index: ®istrytypes.IndexInfo{ - Name: IndexName, - Official: true, - }, - RemoteName: "fooo/bar", - LocalName: "fooo/bar", - CanonicalName: "docker.io/fooo/bar", - Official: false, - }, - "library/ubuntu": { - Index: ®istrytypes.IndexInfo{ - Name: IndexName, - Official: true, - }, - RemoteName: "library/ubuntu", - LocalName: "ubuntu", - CanonicalName: "docker.io/library/ubuntu", - Official: true, - }, - "nonlibrary/ubuntu": { - Index: ®istrytypes.IndexInfo{ - Name: IndexName, - Official: true, - }, - RemoteName: "nonlibrary/ubuntu", - LocalName: "nonlibrary/ubuntu", - CanonicalName: "docker.io/nonlibrary/ubuntu", - Official: false, - }, - "ubuntu": { - Index: ®istrytypes.IndexInfo{ - Name: IndexName, - Official: true, - }, - RemoteName: "library/ubuntu", - LocalName: "ubuntu", - CanonicalName: "docker.io/library/ubuntu", - Official: true, - }, - "other/library": { - Index: ®istrytypes.IndexInfo{ - Name: IndexName, - Official: true, - }, - RemoteName: "other/library", - LocalName: "other/library", - CanonicalName: "docker.io/other/library", - Official: false, - }, - "127.0.0.1:8000/private/moonbase": { - Index: ®istrytypes.IndexInfo{ - Name: "127.0.0.1:8000", - Official: false, - }, - RemoteName: "private/moonbase", - LocalName: "127.0.0.1:8000/private/moonbase", - CanonicalName: "127.0.0.1:8000/private/moonbase", - Official: false, - }, - "127.0.0.1:8000/privatebase": { - Index: ®istrytypes.IndexInfo{ - Name: "127.0.0.1:8000", - Official: false, - }, - RemoteName: "privatebase", - LocalName: "127.0.0.1:8000/privatebase", - CanonicalName: "127.0.0.1:8000/privatebase", - Official: false, - }, - "localhost:8000/private/moonbase": { - Index: ®istrytypes.IndexInfo{ - Name: "localhost:8000", - Official: false, - }, - RemoteName: "private/moonbase", - LocalName: "localhost:8000/private/moonbase", - CanonicalName: "localhost:8000/private/moonbase", - Official: false, - }, - "localhost:8000/privatebase": { - Index: ®istrytypes.IndexInfo{ - Name: "localhost:8000", - Official: false, - }, - RemoteName: "privatebase", - LocalName: "localhost:8000/privatebase", - CanonicalName: "localhost:8000/privatebase", - Official: false, - }, - "example.com/private/moonbase": { - Index: ®istrytypes.IndexInfo{ - Name: "example.com", - Official: false, - }, - RemoteName: "private/moonbase", - LocalName: "example.com/private/moonbase", - CanonicalName: "example.com/private/moonbase", - Official: false, - }, - "example.com/privatebase": { - Index: ®istrytypes.IndexInfo{ - Name: "example.com", - Official: false, - }, - RemoteName: "privatebase", - LocalName: "example.com/privatebase", - CanonicalName: "example.com/privatebase", - Official: false, - }, - "example.com:8000/private/moonbase": { - Index: ®istrytypes.IndexInfo{ - Name: "example.com:8000", - Official: false, - }, - RemoteName: "private/moonbase", - LocalName: "example.com:8000/private/moonbase", - CanonicalName: "example.com:8000/private/moonbase", - Official: false, - }, - "example.com:8000/privatebase": { - Index: ®istrytypes.IndexInfo{ - Name: "example.com:8000", - Official: false, - }, - RemoteName: "privatebase", - LocalName: "example.com:8000/privatebase", - CanonicalName: "example.com:8000/privatebase", - Official: false, - }, - "localhost/private/moonbase": { - Index: ®istrytypes.IndexInfo{ - Name: "localhost", - Official: false, - }, - RemoteName: "private/moonbase", - LocalName: "localhost/private/moonbase", - CanonicalName: "localhost/private/moonbase", - Official: false, - }, - "localhost/privatebase": { - Index: ®istrytypes.IndexInfo{ - Name: "localhost", - Official: false, - }, - RemoteName: "privatebase", - LocalName: "localhost/privatebase", - CanonicalName: "localhost/privatebase", - Official: false, - }, - IndexName + "/public/moonbase": { - Index: ®istrytypes.IndexInfo{ - Name: IndexName, - Official: true, - }, - RemoteName: "public/moonbase", - LocalName: "public/moonbase", - CanonicalName: "docker.io/public/moonbase", - Official: false, - }, - "index." + IndexName + "/public/moonbase": { - Index: ®istrytypes.IndexInfo{ - Name: IndexName, - Official: true, - }, - RemoteName: "public/moonbase", - LocalName: "public/moonbase", - CanonicalName: "docker.io/public/moonbase", - Official: false, - }, - "ubuntu-12.04-base": { - Index: ®istrytypes.IndexInfo{ - Name: IndexName, - Official: true, - }, - RemoteName: "library/ubuntu-12.04-base", - LocalName: "ubuntu-12.04-base", - CanonicalName: "docker.io/library/ubuntu-12.04-base", - Official: true, - }, - IndexName + "/ubuntu-12.04-base": { - Index: ®istrytypes.IndexInfo{ - Name: IndexName, - Official: true, - }, - RemoteName: "library/ubuntu-12.04-base", - LocalName: "ubuntu-12.04-base", - CanonicalName: "docker.io/library/ubuntu-12.04-base", - Official: true, - }, - "index." + IndexName + "/ubuntu-12.04-base": { - Index: ®istrytypes.IndexInfo{ - Name: IndexName, - Official: true, - }, - RemoteName: "library/ubuntu-12.04-base", - LocalName: "ubuntu-12.04-base", - CanonicalName: "docker.io/library/ubuntu-12.04-base", - Official: true, - }, - } - - for reposName, expectedRepoInfo := range expectedRepoInfos { - named, err := reference.WithName(reposName) - if err != nil { - t.Error(err) - } - - repoInfo, err := ParseRepositoryInfo(named) - if err != nil { - t.Error(err) - } else { - checkEqual(t, repoInfo.Index.Name, expectedRepoInfo.Index.Name, reposName) - checkEqual(t, repoInfo.RemoteName(), expectedRepoInfo.RemoteName, reposName) - checkEqual(t, repoInfo.Name(), expectedRepoInfo.LocalName, reposName) - checkEqual(t, repoInfo.FullName(), expectedRepoInfo.CanonicalName, reposName) - checkEqual(t, repoInfo.Index.Official, expectedRepoInfo.Index.Official, reposName) - checkEqual(t, repoInfo.Official, expectedRepoInfo.Official, reposName) - } - } -} - -func TestNewIndexInfo(t *testing.T) { - testIndexInfo := func(config *serviceConfig, expectedIndexInfos map[string]*registrytypes.IndexInfo) { - for indexName, expectedIndexInfo := range expectedIndexInfos { - index, err := newIndexInfo(config, indexName) - if err != nil { - t.Fatal(err) - } else { - checkEqual(t, index.Name, expectedIndexInfo.Name, indexName+" name") - checkEqual(t, index.Official, expectedIndexInfo.Official, indexName+" is official") - checkEqual(t, index.Secure, expectedIndexInfo.Secure, indexName+" is secure") - checkEqual(t, len(index.Mirrors), len(expectedIndexInfo.Mirrors), indexName+" mirrors") - } - } - } - - config := newServiceConfig(ServiceOptions{}) - noMirrors := []string{} - expectedIndexInfos := map[string]*registrytypes.IndexInfo{ - IndexName: { - Name: IndexName, - Official: true, - Secure: true, - Mirrors: noMirrors, - }, - "index." + IndexName: { - Name: IndexName, - Official: true, - Secure: true, - Mirrors: noMirrors, - }, - "example.com": { - Name: "example.com", - Official: false, - Secure: true, - Mirrors: noMirrors, - }, - "127.0.0.1:5000": { - Name: "127.0.0.1:5000", - Official: false, - Secure: false, - Mirrors: noMirrors, - }, - } - testIndexInfo(config, expectedIndexInfos) - - publicMirrors := []string{"http://mirror1.local", "http://mirror2.local"} - config = makeServiceConfig(publicMirrors, []string{"example.com"}) - - expectedIndexInfos = map[string]*registrytypes.IndexInfo{ - IndexName: { - Name: IndexName, - Official: true, - Secure: true, - Mirrors: publicMirrors, - }, - "index." + IndexName: { - Name: IndexName, - Official: true, - Secure: true, - Mirrors: publicMirrors, - }, - "example.com": { - Name: "example.com", - Official: false, - Secure: false, - Mirrors: noMirrors, - }, - "example.com:5000": { - Name: "example.com:5000", - Official: false, - Secure: true, - Mirrors: noMirrors, - }, - "127.0.0.1": { - Name: "127.0.0.1", - Official: false, - Secure: false, - Mirrors: noMirrors, - }, - "127.0.0.1:5000": { - Name: "127.0.0.1:5000", - Official: false, - Secure: false, - Mirrors: noMirrors, - }, - "other.com": { - Name: "other.com", - Official: false, - Secure: true, - Mirrors: noMirrors, - }, - } - testIndexInfo(config, expectedIndexInfos) - - config = makeServiceConfig(nil, []string{"42.42.0.0/16"}) - expectedIndexInfos = map[string]*registrytypes.IndexInfo{ - "example.com": { - Name: "example.com", - Official: false, - Secure: false, - Mirrors: noMirrors, - }, - "example.com:5000": { - Name: "example.com:5000", - Official: false, - Secure: false, - Mirrors: noMirrors, - }, - "127.0.0.1": { - Name: "127.0.0.1", - Official: false, - Secure: false, - Mirrors: noMirrors, - }, - "127.0.0.1:5000": { - Name: "127.0.0.1:5000", - Official: false, - Secure: false, - Mirrors: noMirrors, - }, - "other.com": { - Name: "other.com", - Official: false, - Secure: true, - Mirrors: noMirrors, - }, - } - testIndexInfo(config, expectedIndexInfos) -} - -func TestMirrorEndpointLookup(t *testing.T) { - containsMirror := func(endpoints []APIEndpoint) bool { - for _, pe := range endpoints { - if pe.URL.Host == "my.mirror" { - return true - } - } - return false - } - s := DefaultService{config: makeServiceConfig([]string{"my.mirror"}, nil)} - - imageName, err := reference.WithName(IndexName + "/test/image") - if err != nil { - t.Error(err) - } - pushAPIEndpoints, err := s.LookupPushEndpoints(imageName.Hostname()) - if err != nil { - t.Fatal(err) - } - if containsMirror(pushAPIEndpoints) { - t.Fatal("Push endpoint should not contain mirror") - } - - pullAPIEndpoints, err := s.LookupPullEndpoints(imageName.Hostname()) - if err != nil { - t.Fatal(err) - } - if !containsMirror(pullAPIEndpoints) { - t.Fatal("Pull endpoint should contain mirror") - } -} - -func TestPushRegistryTag(t *testing.T) { - r := spawnTestRegistrySession(t) - repoRef, err := reference.ParseNamed(REPO) - if err != nil { - t.Fatal(err) - } - err = r.PushRegistryTag(repoRef, imageID, "stable", makeURL("/v1/")) - if err != nil { - t.Fatal(err) - } -} - -func TestPushImageJSONIndex(t *testing.T) { - r := spawnTestRegistrySession(t) - imgData := []*ImgData{ - { - ID: "77dbf71da1d00e3fbddc480176eac8994025630c6590d11cfc8fe1209c2a1d20", - Checksum: "sha256:1ac330d56e05eef6d438586545ceff7550d3bdcb6b19961f12c5ba714ee1bb37", - }, - { - ID: "42d718c941f5c532ac049bf0b0ab53f0062f09a03afd4aa4a02c098e46032b9d", - Checksum: "sha256:bea7bf2e4bacd479344b737328db47b18880d09096e6674165533aa994f5e9f2", - }, - } - repoRef, err := reference.ParseNamed(REPO) - if err != nil { - t.Fatal(err) - } - repoData, err := r.PushImageJSONIndex(repoRef, imgData, false, nil) - if err != nil { - t.Fatal(err) - } - if repoData == nil { - t.Fatal("Expected RepositoryData object") - } - repoData, err = r.PushImageJSONIndex(repoRef, imgData, true, []string{r.indexEndpoint.String()}) - if err != nil { - t.Fatal(err) - } - if repoData == nil { - t.Fatal("Expected RepositoryData object") - } -} - -func TestSearchRepositories(t *testing.T) { - r := spawnTestRegistrySession(t) - results, err := r.SearchRepositories("fakequery", 25) - if err != nil { - t.Fatal(err) - } - if results == nil { - t.Fatal("Expected non-nil SearchResults object") - } - assertEqual(t, results.NumResults, 1, "Expected 1 search results") - assertEqual(t, results.Query, "fakequery", "Expected 'fakequery' as query") - assertEqual(t, results.Results[0].StarCount, 42, "Expected 'fakeimage' to have 42 stars") -} - -func TestTrustedLocation(t *testing.T) { - for _, url := range []string{"http://example.com", "https://example.com:7777", "http://docker.io", "http://test.docker.com", "https://fakedocker.com"} { - req, _ := http.NewRequest("GET", url, nil) - if trustedLocation(req) == true { - t.Fatalf("'%s' shouldn't be detected as a trusted location", url) - } - } - - for _, url := range []string{"https://docker.io", "https://test.docker.com:80"} { - req, _ := http.NewRequest("GET", url, nil) - if trustedLocation(req) == false { - t.Fatalf("'%s' should be detected as a trusted location", url) - } - } -} - -func TestAddRequiredHeadersToRedirectedRequests(t *testing.T) { - for _, urls := range [][]string{ - {"http://docker.io", "https://docker.com"}, - {"https://foo.docker.io:7777", "http://bar.docker.com"}, - {"https://foo.docker.io", "https://example.com"}, - } { - reqFrom, _ := http.NewRequest("GET", urls[0], nil) - reqFrom.Header.Add("Content-Type", "application/json") - reqFrom.Header.Add("Authorization", "super_secret") - reqTo, _ := http.NewRequest("GET", urls[1], nil) - - addRequiredHeadersToRedirectedRequests(reqTo, []*http.Request{reqFrom}) - - if len(reqTo.Header) != 1 { - t.Fatalf("Expected 1 headers, got %d", len(reqTo.Header)) - } - - if reqTo.Header.Get("Content-Type") != "application/json" { - t.Fatal("'Content-Type' should be 'application/json'") - } - - if reqTo.Header.Get("Authorization") != "" { - t.Fatal("'Authorization' should be empty") - } - } - - for _, urls := range [][]string{ - {"https://docker.io", "https://docker.com"}, - {"https://foo.docker.io:7777", "https://bar.docker.com"}, - } { - reqFrom, _ := http.NewRequest("GET", urls[0], nil) - reqFrom.Header.Add("Content-Type", "application/json") - reqFrom.Header.Add("Authorization", "super_secret") - reqTo, _ := http.NewRequest("GET", urls[1], nil) - - addRequiredHeadersToRedirectedRequests(reqTo, []*http.Request{reqFrom}) - - if len(reqTo.Header) != 2 { - t.Fatalf("Expected 2 headers, got %d", len(reqTo.Header)) - } - - if reqTo.Header.Get("Content-Type") != "application/json" { - t.Fatal("'Content-Type' should be 'application/json'") - } - - if reqTo.Header.Get("Authorization") != "super_secret" { - t.Fatal("'Authorization' should be 'super_secret'") - } - } -} - -func TestIsSecureIndex(t *testing.T) { - tests := []struct { - addr string - insecureRegistries []string - expected bool - }{ - {IndexName, nil, true}, - {"example.com", []string{}, true}, - {"example.com", []string{"example.com"}, false}, - {"localhost", []string{"localhost:5000"}, false}, - {"localhost:5000", []string{"localhost:5000"}, false}, - {"localhost", []string{"example.com"}, false}, - {"127.0.0.1:5000", []string{"127.0.0.1:5000"}, false}, - {"localhost", nil, false}, - {"localhost:5000", nil, false}, - {"127.0.0.1", nil, false}, - {"localhost", []string{"example.com"}, false}, - {"127.0.0.1", []string{"example.com"}, false}, - {"example.com", nil, true}, - {"example.com", []string{"example.com"}, false}, - {"127.0.0.1", []string{"example.com"}, false}, - {"127.0.0.1:5000", []string{"example.com"}, false}, - {"example.com:5000", []string{"42.42.0.0/16"}, false}, - {"example.com", []string{"42.42.0.0/16"}, false}, - {"example.com:5000", []string{"42.42.42.42/8"}, false}, - {"127.0.0.1:5000", []string{"127.0.0.0/8"}, false}, - {"42.42.42.42:5000", []string{"42.1.1.1/8"}, false}, - {"invalid.domain.com", []string{"42.42.0.0/16"}, true}, - {"invalid.domain.com", []string{"invalid.domain.com"}, false}, - {"invalid.domain.com:5000", []string{"invalid.domain.com"}, true}, - {"invalid.domain.com:5000", []string{"invalid.domain.com:5000"}, false}, - } - for _, tt := range tests { - config := makeServiceConfig(nil, tt.insecureRegistries) - if sec := isSecureIndex(config, tt.addr); sec != tt.expected { - t.Errorf("isSecureIndex failed for %q %v, expected %v got %v", tt.addr, tt.insecureRegistries, tt.expected, sec) - } - } -} - -type debugTransport struct { - http.RoundTripper - log func(...interface{}) -} - -func (tr debugTransport) RoundTrip(req *http.Request) (*http.Response, error) { - dump, err := httputil.DumpRequestOut(req, false) - if err != nil { - tr.log("could not dump request") - } - tr.log(string(dump)) - resp, err := tr.RoundTripper.RoundTrip(req) - if err != nil { - return nil, err - } - dump, err = httputil.DumpResponse(resp, false) - if err != nil { - tr.log("could not dump response") - } - tr.log(string(dump)) - return resp, err -} diff --git a/vendor/github.com/docker/docker/registry/service.go b/vendor/github.com/docker/docker/registry/service.go deleted file mode 100644 index 596a9c7e5..000000000 --- a/vendor/github.com/docker/docker/registry/service.go +++ /dev/null @@ -1,304 +0,0 @@ -package registry - -import ( - "crypto/tls" - "fmt" - "net/http" - "net/url" - "strings" - "sync" - - "golang.org/x/net/context" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/registry/client/auth" - "github.com/docker/docker/api/types" - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/reference" -) - -const ( - // DefaultSearchLimit is the default value for maximum number of returned search results. - DefaultSearchLimit = 25 -) - -// Service is the interface defining what a registry service should implement. -type Service interface { - Auth(ctx context.Context, authConfig *types.AuthConfig, userAgent string) (status, token string, err error) - LookupPullEndpoints(hostname string) (endpoints []APIEndpoint, err error) - LookupPushEndpoints(hostname string) (endpoints []APIEndpoint, err error) - ResolveRepository(name reference.Named) (*RepositoryInfo, error) - Search(ctx context.Context, term string, limit int, authConfig *types.AuthConfig, userAgent string, headers map[string][]string) (*registrytypes.SearchResults, error) - ServiceConfig() *registrytypes.ServiceConfig - TLSConfig(hostname string) (*tls.Config, error) - LoadInsecureRegistries([]string) error -} - -// DefaultService is a registry service. It tracks configuration data such as a list -// of mirrors. -type DefaultService struct { - config *serviceConfig - mu sync.Mutex -} - -// NewService returns a new instance of DefaultService ready to be -// installed into an engine. -func NewService(options ServiceOptions) *DefaultService { - return &DefaultService{ - config: newServiceConfig(options), - } -} - -// ServiceConfig returns the public registry service configuration. -func (s *DefaultService) ServiceConfig() *registrytypes.ServiceConfig { - s.mu.Lock() - defer s.mu.Unlock() - - servConfig := registrytypes.ServiceConfig{ - InsecureRegistryCIDRs: make([]*(registrytypes.NetIPNet), 0), - IndexConfigs: make(map[string]*(registrytypes.IndexInfo)), - Mirrors: make([]string, 0), - } - - // construct a new ServiceConfig which will not retrieve s.Config directly, - // and look up items in s.config with mu locked - servConfig.InsecureRegistryCIDRs = append(servConfig.InsecureRegistryCIDRs, s.config.ServiceConfig.InsecureRegistryCIDRs...) - - for key, value := range s.config.ServiceConfig.IndexConfigs { - servConfig.IndexConfigs[key] = value - } - - servConfig.Mirrors = append(servConfig.Mirrors, s.config.ServiceConfig.Mirrors...) - - return &servConfig -} - -// LoadInsecureRegistries loads insecure registries for Service -func (s *DefaultService) LoadInsecureRegistries(registries []string) error { - s.mu.Lock() - defer s.mu.Unlock() - - return s.config.LoadInsecureRegistries(registries) -} - -// Auth contacts the public registry with the provided credentials, -// and returns OK if authentication was successful. -// It can be used to verify the validity of a client's credentials. -func (s *DefaultService) Auth(ctx context.Context, authConfig *types.AuthConfig, userAgent string) (status, token string, err error) { - // TODO Use ctx when searching for repositories - serverAddress := authConfig.ServerAddress - if serverAddress == "" { - serverAddress = IndexServer - } - if !strings.HasPrefix(serverAddress, "https://") && !strings.HasPrefix(serverAddress, "http://") { - serverAddress = "https://" + serverAddress - } - u, err := url.Parse(serverAddress) - if err != nil { - return "", "", fmt.Errorf("unable to parse server address: %v", err) - } - - endpoints, err := s.LookupPushEndpoints(u.Host) - if err != nil { - return "", "", err - } - - for _, endpoint := range endpoints { - login := loginV2 - if endpoint.Version == APIVersion1 { - login = loginV1 - } - - status, token, err = login(authConfig, endpoint, userAgent) - if err == nil { - return - } - if fErr, ok := err.(fallbackError); ok { - err = fErr.err - logrus.Infof("Error logging in to %s endpoint, trying next endpoint: %v", endpoint.Version, err) - continue - } - return "", "", err - } - - return "", "", err -} - -// splitReposSearchTerm breaks a search term into an index name and remote name -func splitReposSearchTerm(reposName string) (string, string) { - nameParts := strings.SplitN(reposName, "/", 2) - var indexName, remoteName string - if len(nameParts) == 1 || (!strings.Contains(nameParts[0], ".") && - !strings.Contains(nameParts[0], ":") && nameParts[0] != "localhost") { - // This is a Docker Index repos (ex: samalba/hipache or ubuntu) - // 'docker.io' - indexName = IndexName - remoteName = reposName - } else { - indexName = nameParts[0] - remoteName = nameParts[1] - } - return indexName, remoteName -} - -// Search queries the public registry for images matching the specified -// search terms, and returns the results. -func (s *DefaultService) Search(ctx context.Context, term string, limit int, authConfig *types.AuthConfig, userAgent string, headers map[string][]string) (*registrytypes.SearchResults, error) { - // TODO Use ctx when searching for repositories - if err := validateNoScheme(term); err != nil { - return nil, err - } - - indexName, remoteName := splitReposSearchTerm(term) - - // Search is a long-running operation, just lock s.config to avoid block others. - s.mu.Lock() - index, err := newIndexInfo(s.config, indexName) - s.mu.Unlock() - - if err != nil { - return nil, err - } - - // *TODO: Search multiple indexes. - endpoint, err := NewV1Endpoint(index, userAgent, http.Header(headers)) - if err != nil { - return nil, err - } - - var client *http.Client - if authConfig != nil && authConfig.IdentityToken != "" && authConfig.Username != "" { - creds := NewStaticCredentialStore(authConfig) - scopes := []auth.Scope{ - auth.RegistryScope{ - Name: "catalog", - Actions: []string{"search"}, - }, - } - - modifiers := DockerHeaders(userAgent, nil) - v2Client, foundV2, err := v2AuthHTTPClient(endpoint.URL, endpoint.client.Transport, modifiers, creds, scopes) - if err != nil { - if fErr, ok := err.(fallbackError); ok { - logrus.Errorf("Cannot use identity token for search, v2 auth not supported: %v", fErr.err) - } else { - return nil, err - } - } else if foundV2 { - // Copy non transport http client features - v2Client.Timeout = endpoint.client.Timeout - v2Client.CheckRedirect = endpoint.client.CheckRedirect - v2Client.Jar = endpoint.client.Jar - - logrus.Debugf("using v2 client for search to %s", endpoint.URL) - client = v2Client - } - } - - if client == nil { - client = endpoint.client - if err := authorizeClient(client, authConfig, endpoint); err != nil { - return nil, err - } - } - - r := newSession(client, authConfig, endpoint) - - if index.Official { - localName := remoteName - if strings.HasPrefix(localName, "library/") { - // If pull "library/foo", it's stored locally under "foo" - localName = strings.SplitN(localName, "/", 2)[1] - } - - return r.SearchRepositories(localName, limit) - } - return r.SearchRepositories(remoteName, limit) -} - -// ResolveRepository splits a repository name into its components -// and configuration of the associated registry. -func (s *DefaultService) ResolveRepository(name reference.Named) (*RepositoryInfo, error) { - s.mu.Lock() - defer s.mu.Unlock() - return newRepositoryInfo(s.config, name) -} - -// APIEndpoint represents a remote API endpoint -type APIEndpoint struct { - Mirror bool - URL *url.URL - Version APIVersion - Official bool - TrimHostname bool - TLSConfig *tls.Config -} - -// ToV1Endpoint returns a V1 API endpoint based on the APIEndpoint -func (e APIEndpoint) ToV1Endpoint(userAgent string, metaHeaders http.Header) (*V1Endpoint, error) { - return newV1Endpoint(*e.URL, e.TLSConfig, userAgent, metaHeaders) -} - -// TLSConfig constructs a client TLS configuration based on server defaults -func (s *DefaultService) TLSConfig(hostname string) (*tls.Config, error) { - s.mu.Lock() - defer s.mu.Unlock() - - return newTLSConfig(hostname, isSecureIndex(s.config, hostname)) -} - -// tlsConfig constructs a client TLS configuration based on server defaults -func (s *DefaultService) tlsConfig(hostname string) (*tls.Config, error) { - return newTLSConfig(hostname, isSecureIndex(s.config, hostname)) -} - -func (s *DefaultService) tlsConfigForMirror(mirrorURL *url.URL) (*tls.Config, error) { - return s.tlsConfig(mirrorURL.Host) -} - -// LookupPullEndpoints creates a list of endpoints to try to pull from, in order of preference. -// It gives preference to v2 endpoints over v1, mirrors over the actual -// registry, and HTTPS over plain HTTP. -func (s *DefaultService) LookupPullEndpoints(hostname string) (endpoints []APIEndpoint, err error) { - s.mu.Lock() - defer s.mu.Unlock() - - return s.lookupEndpoints(hostname) -} - -// LookupPushEndpoints creates a list of endpoints to try to push to, in order of preference. -// It gives preference to v2 endpoints over v1, and HTTPS over plain HTTP. -// Mirrors are not included. -func (s *DefaultService) LookupPushEndpoints(hostname string) (endpoints []APIEndpoint, err error) { - s.mu.Lock() - defer s.mu.Unlock() - - allEndpoints, err := s.lookupEndpoints(hostname) - if err == nil { - for _, endpoint := range allEndpoints { - if !endpoint.Mirror { - endpoints = append(endpoints, endpoint) - } - } - } - return endpoints, err -} - -func (s *DefaultService) lookupEndpoints(hostname string) (endpoints []APIEndpoint, err error) { - endpoints, err = s.lookupV2Endpoints(hostname) - if err != nil { - return nil, err - } - - if s.config.V2Only { - return endpoints, nil - } - - legacyEndpoints, err := s.lookupV1Endpoints(hostname) - if err != nil { - return nil, err - } - endpoints = append(endpoints, legacyEndpoints...) - - return endpoints, nil -} diff --git a/vendor/github.com/docker/docker/registry/service_v1.go b/vendor/github.com/docker/docker/registry/service_v1.go deleted file mode 100644 index 1d251aec6..000000000 --- a/vendor/github.com/docker/docker/registry/service_v1.go +++ /dev/null @@ -1,40 +0,0 @@ -package registry - -import "net/url" - -func (s *DefaultService) lookupV1Endpoints(hostname string) (endpoints []APIEndpoint, err error) { - if hostname == DefaultNamespace || hostname == DefaultV2Registry.Host || hostname == IndexHostname { - return []APIEndpoint{}, nil - } - - tlsConfig, err := s.tlsConfig(hostname) - if err != nil { - return nil, err - } - - endpoints = []APIEndpoint{ - { - URL: &url.URL{ - Scheme: "https", - Host: hostname, - }, - Version: APIVersion1, - TrimHostname: true, - TLSConfig: tlsConfig, - }, - } - - if tlsConfig.InsecureSkipVerify { - endpoints = append(endpoints, APIEndpoint{ // or this - URL: &url.URL{ - Scheme: "http", - Host: hostname, - }, - Version: APIVersion1, - TrimHostname: true, - // used to check if supposed to be secure via InsecureSkipVerify - TLSConfig: tlsConfig, - }) - } - return endpoints, nil -} diff --git a/vendor/github.com/docker/docker/registry/service_v1_test.go b/vendor/github.com/docker/docker/registry/service_v1_test.go deleted file mode 100644 index bd15dfffb..000000000 --- a/vendor/github.com/docker/docker/registry/service_v1_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package registry - -import "testing" - -func TestLookupV1Endpoints(t *testing.T) { - s := NewService(ServiceOptions{}) - - cases := []struct { - hostname string - expectedLen int - }{ - {"example.com", 1}, - {DefaultNamespace, 0}, - {DefaultV2Registry.Host, 0}, - {IndexHostname, 0}, - } - - for _, c := range cases { - if ret, err := s.lookupV1Endpoints(c.hostname); err != nil || len(ret) != c.expectedLen { - t.Errorf("lookupV1Endpoints(`"+c.hostname+"`) returned %+v and %+v", ret, err) - } - } -} diff --git a/vendor/github.com/docker/docker/registry/service_v2.go b/vendor/github.com/docker/docker/registry/service_v2.go deleted file mode 100644 index 228d745f8..000000000 --- a/vendor/github.com/docker/docker/registry/service_v2.go +++ /dev/null @@ -1,78 +0,0 @@ -package registry - -import ( - "net/url" - "strings" - - "github.com/docker/go-connections/tlsconfig" -) - -func (s *DefaultService) lookupV2Endpoints(hostname string) (endpoints []APIEndpoint, err error) { - tlsConfig := tlsconfig.ServerDefault() - if hostname == DefaultNamespace || hostname == IndexHostname { - // v2 mirrors - for _, mirror := range s.config.Mirrors { - if !strings.HasPrefix(mirror, "http://") && !strings.HasPrefix(mirror, "https://") { - mirror = "https://" + mirror - } - mirrorURL, err := url.Parse(mirror) - if err != nil { - return nil, err - } - mirrorTLSConfig, err := s.tlsConfigForMirror(mirrorURL) - if err != nil { - return nil, err - } - endpoints = append(endpoints, APIEndpoint{ - URL: mirrorURL, - // guess mirrors are v2 - Version: APIVersion2, - Mirror: true, - TrimHostname: true, - TLSConfig: mirrorTLSConfig, - }) - } - // v2 registry - endpoints = append(endpoints, APIEndpoint{ - URL: DefaultV2Registry, - Version: APIVersion2, - Official: true, - TrimHostname: true, - TLSConfig: tlsConfig, - }) - - return endpoints, nil - } - - tlsConfig, err = s.tlsConfig(hostname) - if err != nil { - return nil, err - } - - endpoints = []APIEndpoint{ - { - URL: &url.URL{ - Scheme: "https", - Host: hostname, - }, - Version: APIVersion2, - TrimHostname: true, - TLSConfig: tlsConfig, - }, - } - - if tlsConfig.InsecureSkipVerify { - endpoints = append(endpoints, APIEndpoint{ - URL: &url.URL{ - Scheme: "http", - Host: hostname, - }, - Version: APIVersion2, - TrimHostname: true, - // used to check if supposed to be secure via InsecureSkipVerify - TLSConfig: tlsConfig, - }) - } - - return endpoints, nil -} diff --git a/vendor/github.com/docker/docker/registry/session.go b/vendor/github.com/docker/docker/registry/session.go deleted file mode 100644 index 72e286ab4..000000000 --- a/vendor/github.com/docker/docker/registry/session.go +++ /dev/null @@ -1,783 +0,0 @@ -package registry - -import ( - "bytes" - "crypto/sha256" - "errors" - "sync" - // this is required for some certificates - _ "crypto/sha512" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/cookiejar" - "net/url" - "strconv" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/registry/api/errcode" - "github.com/docker/docker/api/types" - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/pkg/httputils" - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/stringid" - "github.com/docker/docker/pkg/tarsum" - "github.com/docker/docker/reference" -) - -var ( - // ErrRepoNotFound is returned if the repository didn't exist on the - // remote side - ErrRepoNotFound = errors.New("Repository not found") -) - -// A Session is used to communicate with a V1 registry -type Session struct { - indexEndpoint *V1Endpoint - client *http.Client - // TODO(tiborvass): remove authConfig - authConfig *types.AuthConfig - id string -} - -type authTransport struct { - http.RoundTripper - *types.AuthConfig - - alwaysSetBasicAuth bool - token []string - - mu sync.Mutex // guards modReq - modReq map[*http.Request]*http.Request // original -> modified -} - -// AuthTransport handles the auth layer when communicating with a v1 registry (private or official) -// -// For private v1 registries, set alwaysSetBasicAuth to true. -// -// For the official v1 registry, if there isn't already an Authorization header in the request, -// but there is an X-Docker-Token header set to true, then Basic Auth will be used to set the Authorization header. -// After sending the request with the provided base http.RoundTripper, if an X-Docker-Token header, representing -// a token, is present in the response, then it gets cached and sent in the Authorization header of all subsequent -// requests. -// -// If the server sends a token without the client having requested it, it is ignored. -// -// This RoundTripper also has a CancelRequest method important for correct timeout handling. -func AuthTransport(base http.RoundTripper, authConfig *types.AuthConfig, alwaysSetBasicAuth bool) http.RoundTripper { - if base == nil { - base = http.DefaultTransport - } - return &authTransport{ - RoundTripper: base, - AuthConfig: authConfig, - alwaysSetBasicAuth: alwaysSetBasicAuth, - modReq: make(map[*http.Request]*http.Request), - } -} - -// cloneRequest returns a clone of the provided *http.Request. -// The clone is a shallow copy of the struct and its Header map. -func cloneRequest(r *http.Request) *http.Request { - // shallow copy of the struct - r2 := new(http.Request) - *r2 = *r - // deep copy of the Header - r2.Header = make(http.Header, len(r.Header)) - for k, s := range r.Header { - r2.Header[k] = append([]string(nil), s...) - } - - return r2 -} - -// RoundTrip changes an HTTP request's headers to add the necessary -// authentication-related headers -func (tr *authTransport) RoundTrip(orig *http.Request) (*http.Response, error) { - // Authorization should not be set on 302 redirect for untrusted locations. - // This logic mirrors the behavior in addRequiredHeadersToRedirectedRequests. - // As the authorization logic is currently implemented in RoundTrip, - // a 302 redirect is detected by looking at the Referrer header as go http package adds said header. - // This is safe as Docker doesn't set Referrer in other scenarios. - if orig.Header.Get("Referer") != "" && !trustedLocation(orig) { - return tr.RoundTripper.RoundTrip(orig) - } - - req := cloneRequest(orig) - tr.mu.Lock() - tr.modReq[orig] = req - tr.mu.Unlock() - - if tr.alwaysSetBasicAuth { - if tr.AuthConfig == nil { - return nil, errors.New("unexpected error: empty auth config") - } - req.SetBasicAuth(tr.Username, tr.Password) - return tr.RoundTripper.RoundTrip(req) - } - - // Don't override - if req.Header.Get("Authorization") == "" { - if req.Header.Get("X-Docker-Token") == "true" && tr.AuthConfig != nil && len(tr.Username) > 0 { - req.SetBasicAuth(tr.Username, tr.Password) - } else if len(tr.token) > 0 { - req.Header.Set("Authorization", "Token "+strings.Join(tr.token, ",")) - } - } - resp, err := tr.RoundTripper.RoundTrip(req) - if err != nil { - delete(tr.modReq, orig) - return nil, err - } - if len(resp.Header["X-Docker-Token"]) > 0 { - tr.token = resp.Header["X-Docker-Token"] - } - resp.Body = &ioutils.OnEOFReader{ - Rc: resp.Body, - Fn: func() { - tr.mu.Lock() - delete(tr.modReq, orig) - tr.mu.Unlock() - }, - } - return resp, nil -} - -// CancelRequest cancels an in-flight request by closing its connection. -func (tr *authTransport) CancelRequest(req *http.Request) { - type canceler interface { - CancelRequest(*http.Request) - } - if cr, ok := tr.RoundTripper.(canceler); ok { - tr.mu.Lock() - modReq := tr.modReq[req] - delete(tr.modReq, req) - tr.mu.Unlock() - cr.CancelRequest(modReq) - } -} - -func authorizeClient(client *http.Client, authConfig *types.AuthConfig, endpoint *V1Endpoint) error { - var alwaysSetBasicAuth bool - - // If we're working with a standalone private registry over HTTPS, send Basic Auth headers - // alongside all our requests. - if endpoint.String() != IndexServer && endpoint.URL.Scheme == "https" { - info, err := endpoint.Ping() - if err != nil { - return err - } - if info.Standalone && authConfig != nil { - logrus.Debugf("Endpoint %s is eligible for private registry. Enabling decorator.", endpoint.String()) - alwaysSetBasicAuth = true - } - } - - // Annotate the transport unconditionally so that v2 can - // properly fallback on v1 when an image is not found. - client.Transport = AuthTransport(client.Transport, authConfig, alwaysSetBasicAuth) - - jar, err := cookiejar.New(nil) - if err != nil { - return errors.New("cookiejar.New is not supposed to return an error") - } - client.Jar = jar - - return nil -} - -func newSession(client *http.Client, authConfig *types.AuthConfig, endpoint *V1Endpoint) *Session { - return &Session{ - authConfig: authConfig, - client: client, - indexEndpoint: endpoint, - id: stringid.GenerateRandomID(), - } -} - -// NewSession creates a new session -// TODO(tiborvass): remove authConfig param once registry client v2 is vendored -func NewSession(client *http.Client, authConfig *types.AuthConfig, endpoint *V1Endpoint) (*Session, error) { - if err := authorizeClient(client, authConfig, endpoint); err != nil { - return nil, err - } - - return newSession(client, authConfig, endpoint), nil -} - -// ID returns this registry session's ID. -func (r *Session) ID() string { - return r.id -} - -// GetRemoteHistory retrieves the history of a given image from the registry. -// It returns a list of the parent's JSON files (including the requested image). -func (r *Session) GetRemoteHistory(imgID, registry string) ([]string, error) { - res, err := r.client.Get(registry + "images/" + imgID + "/ancestry") - if err != nil { - return nil, err - } - defer res.Body.Close() - if res.StatusCode != 200 { - if res.StatusCode == 401 { - return nil, errcode.ErrorCodeUnauthorized.WithArgs() - } - return nil, httputils.NewHTTPRequestError(fmt.Sprintf("Server error: %d trying to fetch remote history for %s", res.StatusCode, imgID), res) - } - - var history []string - if err := json.NewDecoder(res.Body).Decode(&history); err != nil { - return nil, fmt.Errorf("Error while reading the http response: %v", err) - } - - logrus.Debugf("Ancestry: %v", history) - return history, nil -} - -// LookupRemoteImage checks if an image exists in the registry -func (r *Session) LookupRemoteImage(imgID, registry string) error { - res, err := r.client.Get(registry + "images/" + imgID + "/json") - if err != nil { - return err - } - res.Body.Close() - if res.StatusCode != 200 { - return httputils.NewHTTPRequestError(fmt.Sprintf("HTTP code %d", res.StatusCode), res) - } - return nil -} - -// GetRemoteImageJSON retrieves an image's JSON metadata from the registry. -func (r *Session) GetRemoteImageJSON(imgID, registry string) ([]byte, int64, error) { - res, err := r.client.Get(registry + "images/" + imgID + "/json") - if err != nil { - return nil, -1, fmt.Errorf("Failed to download json: %s", err) - } - defer res.Body.Close() - if res.StatusCode != 200 { - return nil, -1, httputils.NewHTTPRequestError(fmt.Sprintf("HTTP code %d", res.StatusCode), res) - } - // if the size header is not present, then set it to '-1' - imageSize := int64(-1) - if hdr := res.Header.Get("X-Docker-Size"); hdr != "" { - imageSize, err = strconv.ParseInt(hdr, 10, 64) - if err != nil { - return nil, -1, err - } - } - - jsonString, err := ioutil.ReadAll(res.Body) - if err != nil { - return nil, -1, fmt.Errorf("Failed to parse downloaded json: %v (%s)", err, jsonString) - } - return jsonString, imageSize, nil -} - -// GetRemoteImageLayer retrieves an image layer from the registry -func (r *Session) GetRemoteImageLayer(imgID, registry string, imgSize int64) (io.ReadCloser, error) { - var ( - statusCode = 0 - res *http.Response - err error - imageURL = fmt.Sprintf("%simages/%s/layer", registry, imgID) - ) - - req, err := http.NewRequest("GET", imageURL, nil) - if err != nil { - return nil, fmt.Errorf("Error while getting from the server: %v", err) - } - statusCode = 0 - res, err = r.client.Do(req) - if err != nil { - logrus.Debugf("Error contacting registry %s: %v", registry, err) - // the only case err != nil && res != nil is https://golang.org/src/net/http/client.go#L515 - if res != nil { - if res.Body != nil { - res.Body.Close() - } - statusCode = res.StatusCode - } - return nil, fmt.Errorf("Server error: Status %d while fetching image layer (%s)", - statusCode, imgID) - } - - if res.StatusCode != 200 { - res.Body.Close() - return nil, fmt.Errorf("Server error: Status %d while fetching image layer (%s)", - res.StatusCode, imgID) - } - - if res.Header.Get("Accept-Ranges") == "bytes" && imgSize > 0 { - logrus.Debug("server supports resume") - return httputils.ResumableRequestReaderWithInitialResponse(r.client, req, 5, imgSize, res), nil - } - logrus.Debug("server doesn't support resume") - return res.Body, nil -} - -// GetRemoteTag retrieves the tag named in the askedTag argument from the given -// repository. It queries each of the registries supplied in the registries -// argument, and returns data from the first one that answers the query -// successfully. -func (r *Session) GetRemoteTag(registries []string, repositoryRef reference.Named, askedTag string) (string, error) { - repository := repositoryRef.RemoteName() - - if strings.Count(repository, "/") == 0 { - // This will be removed once the registry supports auto-resolution on - // the "library" namespace - repository = "library/" + repository - } - for _, host := range registries { - endpoint := fmt.Sprintf("%srepositories/%s/tags/%s", host, repository, askedTag) - res, err := r.client.Get(endpoint) - if err != nil { - return "", err - } - - logrus.Debugf("Got status code %d from %s", res.StatusCode, endpoint) - defer res.Body.Close() - - if res.StatusCode == 404 { - return "", ErrRepoNotFound - } - if res.StatusCode != 200 { - continue - } - - var tagID string - if err := json.NewDecoder(res.Body).Decode(&tagID); err != nil { - return "", err - } - return tagID, nil - } - return "", fmt.Errorf("Could not reach any registry endpoint") -} - -// GetRemoteTags retrieves all tags from the given repository. It queries each -// of the registries supplied in the registries argument, and returns data from -// the first one that answers the query successfully. It returns a map with -// tag names as the keys and image IDs as the values. -func (r *Session) GetRemoteTags(registries []string, repositoryRef reference.Named) (map[string]string, error) { - repository := repositoryRef.RemoteName() - - if strings.Count(repository, "/") == 0 { - // This will be removed once the registry supports auto-resolution on - // the "library" namespace - repository = "library/" + repository - } - for _, host := range registries { - endpoint := fmt.Sprintf("%srepositories/%s/tags", host, repository) - res, err := r.client.Get(endpoint) - if err != nil { - return nil, err - } - - logrus.Debugf("Got status code %d from %s", res.StatusCode, endpoint) - defer res.Body.Close() - - if res.StatusCode == 404 { - return nil, ErrRepoNotFound - } - if res.StatusCode != 200 { - continue - } - - result := make(map[string]string) - if err := json.NewDecoder(res.Body).Decode(&result); err != nil { - return nil, err - } - return result, nil - } - return nil, fmt.Errorf("Could not reach any registry endpoint") -} - -func buildEndpointsList(headers []string, indexEp string) ([]string, error) { - var endpoints []string - parsedURL, err := url.Parse(indexEp) - if err != nil { - return nil, err - } - var urlScheme = parsedURL.Scheme - // The registry's URL scheme has to match the Index' - for _, ep := range headers { - epList := strings.Split(ep, ",") - for _, epListElement := range epList { - endpoints = append( - endpoints, - fmt.Sprintf("%s://%s/v1/", urlScheme, strings.TrimSpace(epListElement))) - } - } - return endpoints, nil -} - -// GetRepositoryData returns lists of images and endpoints for the repository -func (r *Session) GetRepositoryData(name reference.Named) (*RepositoryData, error) { - repositoryTarget := fmt.Sprintf("%srepositories/%s/images", r.indexEndpoint.String(), name.RemoteName()) - - logrus.Debugf("[registry] Calling GET %s", repositoryTarget) - - req, err := http.NewRequest("GET", repositoryTarget, nil) - if err != nil { - return nil, err - } - // this will set basic auth in r.client.Transport and send cached X-Docker-Token headers for all subsequent requests - req.Header.Set("X-Docker-Token", "true") - res, err := r.client.Do(req) - if err != nil { - // check if the error is because of i/o timeout - // and return a non-obtuse error message for users - // "Get https://index.docker.io/v1/repositories/library/busybox/images: i/o timeout" - // was a top search on the docker user forum - if isTimeout(err) { - return nil, fmt.Errorf("Network timed out while trying to connect to %s. You may want to check your internet connection or if you are behind a proxy.", repositoryTarget) - } - return nil, fmt.Errorf("Error while pulling image: %v", err) - } - defer res.Body.Close() - if res.StatusCode == 401 { - return nil, errcode.ErrorCodeUnauthorized.WithArgs() - } - // TODO: Right now we're ignoring checksums in the response body. - // In the future, we need to use them to check image validity. - if res.StatusCode == 404 { - return nil, httputils.NewHTTPRequestError(fmt.Sprintf("HTTP code: %d", res.StatusCode), res) - } else if res.StatusCode != 200 { - errBody, err := ioutil.ReadAll(res.Body) - if err != nil { - logrus.Debugf("Error reading response body: %s", err) - } - return nil, httputils.NewHTTPRequestError(fmt.Sprintf("Error: Status %d trying to pull repository %s: %q", res.StatusCode, name.RemoteName(), errBody), res) - } - - var endpoints []string - if res.Header.Get("X-Docker-Endpoints") != "" { - endpoints, err = buildEndpointsList(res.Header["X-Docker-Endpoints"], r.indexEndpoint.String()) - if err != nil { - return nil, err - } - } else { - // Assume the endpoint is on the same host - endpoints = append(endpoints, fmt.Sprintf("%s://%s/v1/", r.indexEndpoint.URL.Scheme, req.URL.Host)) - } - - remoteChecksums := []*ImgData{} - if err := json.NewDecoder(res.Body).Decode(&remoteChecksums); err != nil { - return nil, err - } - - // Forge a better object from the retrieved data - imgsData := make(map[string]*ImgData, len(remoteChecksums)) - for _, elem := range remoteChecksums { - imgsData[elem.ID] = elem - } - - return &RepositoryData{ - ImgList: imgsData, - Endpoints: endpoints, - }, nil -} - -// PushImageChecksumRegistry uploads checksums for an image -func (r *Session) PushImageChecksumRegistry(imgData *ImgData, registry string) error { - u := registry + "images/" + imgData.ID + "/checksum" - - logrus.Debugf("[registry] Calling PUT %s", u) - - req, err := http.NewRequest("PUT", u, nil) - if err != nil { - return err - } - req.Header.Set("X-Docker-Checksum", imgData.Checksum) - req.Header.Set("X-Docker-Checksum-Payload", imgData.ChecksumPayload) - - res, err := r.client.Do(req) - if err != nil { - return fmt.Errorf("Failed to upload metadata: %v", err) - } - defer res.Body.Close() - if len(res.Cookies()) > 0 { - r.client.Jar.SetCookies(req.URL, res.Cookies()) - } - if res.StatusCode != 200 { - errBody, err := ioutil.ReadAll(res.Body) - if err != nil { - return fmt.Errorf("HTTP code %d while uploading metadata and error when trying to parse response body: %s", res.StatusCode, err) - } - var jsonBody map[string]string - if err := json.Unmarshal(errBody, &jsonBody); err != nil { - errBody = []byte(err.Error()) - } else if jsonBody["error"] == "Image already exists" { - return ErrAlreadyExists - } - return fmt.Errorf("HTTP code %d while uploading metadata: %q", res.StatusCode, errBody) - } - return nil -} - -// PushImageJSONRegistry pushes JSON metadata for a local image to the registry -func (r *Session) PushImageJSONRegistry(imgData *ImgData, jsonRaw []byte, registry string) error { - - u := registry + "images/" + imgData.ID + "/json" - - logrus.Debugf("[registry] Calling PUT %s", u) - - req, err := http.NewRequest("PUT", u, bytes.NewReader(jsonRaw)) - if err != nil { - return err - } - req.Header.Add("Content-type", "application/json") - - res, err := r.client.Do(req) - if err != nil { - return fmt.Errorf("Failed to upload metadata: %s", err) - } - defer res.Body.Close() - if res.StatusCode == 401 && strings.HasPrefix(registry, "http://") { - return httputils.NewHTTPRequestError("HTTP code 401, Docker will not send auth headers over HTTP.", res) - } - if res.StatusCode != 200 { - errBody, err := ioutil.ReadAll(res.Body) - if err != nil { - return httputils.NewHTTPRequestError(fmt.Sprintf("HTTP code %d while uploading metadata and error when trying to parse response body: %s", res.StatusCode, err), res) - } - var jsonBody map[string]string - if err := json.Unmarshal(errBody, &jsonBody); err != nil { - errBody = []byte(err.Error()) - } else if jsonBody["error"] == "Image already exists" { - return ErrAlreadyExists - } - return httputils.NewHTTPRequestError(fmt.Sprintf("HTTP code %d while uploading metadata: %q", res.StatusCode, errBody), res) - } - return nil -} - -// PushImageLayerRegistry sends the checksum of an image layer to the registry -func (r *Session) PushImageLayerRegistry(imgID string, layer io.Reader, registry string, jsonRaw []byte) (checksum string, checksumPayload string, err error) { - u := registry + "images/" + imgID + "/layer" - - logrus.Debugf("[registry] Calling PUT %s", u) - - tarsumLayer, err := tarsum.NewTarSum(layer, false, tarsum.Version0) - if err != nil { - return "", "", err - } - h := sha256.New() - h.Write(jsonRaw) - h.Write([]byte{'\n'}) - checksumLayer := io.TeeReader(tarsumLayer, h) - - req, err := http.NewRequest("PUT", u, checksumLayer) - if err != nil { - return "", "", err - } - req.Header.Add("Content-Type", "application/octet-stream") - req.ContentLength = -1 - req.TransferEncoding = []string{"chunked"} - res, err := r.client.Do(req) - if err != nil { - return "", "", fmt.Errorf("Failed to upload layer: %v", err) - } - if rc, ok := layer.(io.Closer); ok { - if err := rc.Close(); err != nil { - return "", "", err - } - } - defer res.Body.Close() - - if res.StatusCode != 200 { - errBody, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", "", httputils.NewHTTPRequestError(fmt.Sprintf("HTTP code %d while uploading metadata and error when trying to parse response body: %s", res.StatusCode, err), res) - } - return "", "", httputils.NewHTTPRequestError(fmt.Sprintf("Received HTTP code %d while uploading layer: %q", res.StatusCode, errBody), res) - } - - checksumPayload = "sha256:" + hex.EncodeToString(h.Sum(nil)) - return tarsumLayer.Sum(jsonRaw), checksumPayload, nil -} - -// PushRegistryTag pushes a tag on the registry. -// Remote has the format '/ -func (r *Session) PushRegistryTag(remote reference.Named, revision, tag, registry string) error { - // "jsonify" the string - revision = "\"" + revision + "\"" - path := fmt.Sprintf("repositories/%s/tags/%s", remote.RemoteName(), tag) - - req, err := http.NewRequest("PUT", registry+path, strings.NewReader(revision)) - if err != nil { - return err - } - req.Header.Add("Content-type", "application/json") - req.ContentLength = int64(len(revision)) - res, err := r.client.Do(req) - if err != nil { - return err - } - res.Body.Close() - if res.StatusCode != 200 && res.StatusCode != 201 { - return httputils.NewHTTPRequestError(fmt.Sprintf("Internal server error: %d trying to push tag %s on %s", res.StatusCode, tag, remote.RemoteName()), res) - } - return nil -} - -// PushImageJSONIndex uploads an image list to the repository -func (r *Session) PushImageJSONIndex(remote reference.Named, imgList []*ImgData, validate bool, regs []string) (*RepositoryData, error) { - cleanImgList := []*ImgData{} - if validate { - for _, elem := range imgList { - if elem.Checksum != "" { - cleanImgList = append(cleanImgList, elem) - } - } - } else { - cleanImgList = imgList - } - - imgListJSON, err := json.Marshal(cleanImgList) - if err != nil { - return nil, err - } - var suffix string - if validate { - suffix = "images" - } - u := fmt.Sprintf("%srepositories/%s/%s", r.indexEndpoint.String(), remote.RemoteName(), suffix) - logrus.Debugf("[registry] PUT %s", u) - logrus.Debugf("Image list pushed to index:\n%s", imgListJSON) - headers := map[string][]string{ - "Content-type": {"application/json"}, - // this will set basic auth in r.client.Transport and send cached X-Docker-Token headers for all subsequent requests - "X-Docker-Token": {"true"}, - } - if validate { - headers["X-Docker-Endpoints"] = regs - } - - // Redirect if necessary - var res *http.Response - for { - if res, err = r.putImageRequest(u, headers, imgListJSON); err != nil { - return nil, err - } - if !shouldRedirect(res) { - break - } - res.Body.Close() - u = res.Header.Get("Location") - logrus.Debugf("Redirected to %s", u) - } - defer res.Body.Close() - - if res.StatusCode == 401 { - return nil, errcode.ErrorCodeUnauthorized.WithArgs() - } - - var tokens, endpoints []string - if !validate { - if res.StatusCode != 200 && res.StatusCode != 201 { - errBody, err := ioutil.ReadAll(res.Body) - if err != nil { - logrus.Debugf("Error reading response body: %s", err) - } - return nil, httputils.NewHTTPRequestError(fmt.Sprintf("Error: Status %d trying to push repository %s: %q", res.StatusCode, remote.RemoteName(), errBody), res) - } - tokens = res.Header["X-Docker-Token"] - logrus.Debugf("Auth token: %v", tokens) - - if res.Header.Get("X-Docker-Endpoints") == "" { - return nil, fmt.Errorf("Index response didn't contain any endpoints") - } - endpoints, err = buildEndpointsList(res.Header["X-Docker-Endpoints"], r.indexEndpoint.String()) - if err != nil { - return nil, err - } - } else { - if res.StatusCode != 204 { - errBody, err := ioutil.ReadAll(res.Body) - if err != nil { - logrus.Debugf("Error reading response body: %s", err) - } - return nil, httputils.NewHTTPRequestError(fmt.Sprintf("Error: Status %d trying to push checksums %s: %q", res.StatusCode, remote.RemoteName(), errBody), res) - } - } - - return &RepositoryData{ - Endpoints: endpoints, - }, nil -} - -func (r *Session) putImageRequest(u string, headers map[string][]string, body []byte) (*http.Response, error) { - req, err := http.NewRequest("PUT", u, bytes.NewReader(body)) - if err != nil { - return nil, err - } - req.ContentLength = int64(len(body)) - for k, v := range headers { - req.Header[k] = v - } - response, err := r.client.Do(req) - if err != nil { - return nil, err - } - return response, nil -} - -func shouldRedirect(response *http.Response) bool { - return response.StatusCode >= 300 && response.StatusCode < 400 -} - -// SearchRepositories performs a search against the remote repository -func (r *Session) SearchRepositories(term string, limit int) (*registrytypes.SearchResults, error) { - if limit < 1 || limit > 100 { - return nil, fmt.Errorf("Limit %d is outside the range of [1, 100]", limit) - } - logrus.Debugf("Index server: %s", r.indexEndpoint) - u := r.indexEndpoint.String() + "search?q=" + url.QueryEscape(term) + "&n=" + url.QueryEscape(fmt.Sprintf("%d", limit)) - - req, err := http.NewRequest("GET", u, nil) - if err != nil { - return nil, fmt.Errorf("Error while getting from the server: %v", err) - } - // Have the AuthTransport send authentication, when logged in. - req.Header.Set("X-Docker-Token", "true") - res, err := r.client.Do(req) - if err != nil { - return nil, err - } - defer res.Body.Close() - if res.StatusCode != 200 { - return nil, httputils.NewHTTPRequestError(fmt.Sprintf("Unexpected status code %d", res.StatusCode), res) - } - result := new(registrytypes.SearchResults) - return result, json.NewDecoder(res.Body).Decode(result) -} - -// GetAuthConfig returns the authentication settings for a session -// TODO(tiborvass): remove this once registry client v2 is vendored -func (r *Session) GetAuthConfig(withPasswd bool) *types.AuthConfig { - password := "" - if withPasswd { - password = r.authConfig.Password - } - return &types.AuthConfig{ - Username: r.authConfig.Username, - Password: password, - } -} - -func isTimeout(err error) bool { - type timeout interface { - Timeout() bool - } - e := err - switch urlErr := err.(type) { - case *url.Error: - e = urlErr.Err - } - t, ok := e.(timeout) - return ok && t.Timeout() -} diff --git a/vendor/github.com/docker/docker/registry/types.go b/vendor/github.com/docker/docker/registry/types.go deleted file mode 100644 index 49c123a3e..000000000 --- a/vendor/github.com/docker/docker/registry/types.go +++ /dev/null @@ -1,73 +0,0 @@ -package registry - -import ( - registrytypes "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/reference" -) - -// RepositoryData tracks the image list, list of endpoints, and list of tokens -// for a repository -type RepositoryData struct { - // ImgList is a list of images in the repository - ImgList map[string]*ImgData - // Endpoints is a list of endpoints returned in X-Docker-Endpoints - Endpoints []string - // Tokens is currently unused (remove it?) - Tokens []string -} - -// ImgData is used to transfer image checksums to and from the registry -type ImgData struct { - // ID is an opaque string that identifies the image - ID string `json:"id"` - Checksum string `json:"checksum,omitempty"` - ChecksumPayload string `json:"-"` - Tag string `json:",omitempty"` -} - -// PingResult contains the information returned when pinging a registry. It -// indicates the registry's version and whether the registry claims to be a -// standalone registry. -type PingResult struct { - // Version is the registry version supplied by the registry in an HTTP - // header - Version string `json:"version"` - // Standalone is set to true if the registry indicates it is a - // standalone registry in the X-Docker-Registry-Standalone - // header - Standalone bool `json:"standalone"` -} - -// APIVersion is an integral representation of an API version (presently -// either 1 or 2) -type APIVersion int - -func (av APIVersion) String() string { - return apiVersions[av] -} - -// API Version identifiers. -const ( - _ = iota - APIVersion1 APIVersion = iota - APIVersion2 -) - -var apiVersions = map[APIVersion]string{ - APIVersion1: "v1", - APIVersion2: "v2", -} - -// RepositoryInfo describes a repository -type RepositoryInfo struct { - reference.Named - // Index points to registry information - Index *registrytypes.IndexInfo - // Official indicates whether the repository is considered official. - // If the registry is official, and the normalized name does not - // contain a '/' (e.g. "foo"), then it is considered an official repo. - Official bool - // Class represents the class of the repository, such as "plugin" - // or "image". - Class string -} diff --git a/vendor/github.com/docker/docker/restartmanager/restartmanager.go b/vendor/github.com/docker/docker/restartmanager/restartmanager.go deleted file mode 100644 index 570fc9380..000000000 --- a/vendor/github.com/docker/docker/restartmanager/restartmanager.go +++ /dev/null @@ -1,128 +0,0 @@ -package restartmanager - -import ( - "errors" - "fmt" - "sync" - "time" - - "github.com/docker/docker/api/types/container" -) - -const ( - backoffMultiplier = 2 - defaultTimeout = 100 * time.Millisecond -) - -// ErrRestartCanceled is returned when the restart manager has been -// canceled and will no longer restart the container. -var ErrRestartCanceled = errors.New("restart canceled") - -// RestartManager defines object that controls container restarting rules. -type RestartManager interface { - Cancel() error - ShouldRestart(exitCode uint32, hasBeenManuallyStopped bool, executionDuration time.Duration) (bool, chan error, error) -} - -type restartManager struct { - sync.Mutex - sync.Once - policy container.RestartPolicy - restartCount int - timeout time.Duration - active bool - cancel chan struct{} - canceled bool -} - -// New returns a new restartmanager based on a policy. -func New(policy container.RestartPolicy, restartCount int) RestartManager { - return &restartManager{policy: policy, restartCount: restartCount, cancel: make(chan struct{})} -} - -func (rm *restartManager) SetPolicy(policy container.RestartPolicy) { - rm.Lock() - rm.policy = policy - rm.Unlock() -} - -func (rm *restartManager) ShouldRestart(exitCode uint32, hasBeenManuallyStopped bool, executionDuration time.Duration) (bool, chan error, error) { - if rm.policy.IsNone() { - return false, nil, nil - } - rm.Lock() - unlockOnExit := true - defer func() { - if unlockOnExit { - rm.Unlock() - } - }() - - if rm.canceled { - return false, nil, ErrRestartCanceled - } - - if rm.active { - return false, nil, fmt.Errorf("invalid call on active restartmanager") - } - // if the container ran for more than 10s, regardless of status and policy reset the - // the timeout back to the default. - if executionDuration.Seconds() >= 10 { - rm.timeout = 0 - } - if rm.timeout == 0 { - rm.timeout = defaultTimeout - } else { - rm.timeout *= backoffMultiplier - } - - var restart bool - switch { - case rm.policy.IsAlways(): - restart = true - case rm.policy.IsUnlessStopped() && !hasBeenManuallyStopped: - restart = true - case rm.policy.IsOnFailure(): - // the default value of 0 for MaximumRetryCount means that we will not enforce a maximum count - if max := rm.policy.MaximumRetryCount; max == 0 || rm.restartCount < max { - restart = exitCode != 0 - } - } - - if !restart { - rm.active = false - return false, nil, nil - } - - rm.restartCount++ - - unlockOnExit = false - rm.active = true - rm.Unlock() - - ch := make(chan error) - go func() { - select { - case <-rm.cancel: - ch <- ErrRestartCanceled - close(ch) - case <-time.After(rm.timeout): - rm.Lock() - close(ch) - rm.active = false - rm.Unlock() - } - }() - - return true, ch, nil -} - -func (rm *restartManager) Cancel() error { - rm.Do(func() { - rm.Lock() - rm.canceled = true - close(rm.cancel) - rm.Unlock() - }) - return nil -} diff --git a/vendor/github.com/docker/docker/restartmanager/restartmanager_test.go b/vendor/github.com/docker/docker/restartmanager/restartmanager_test.go deleted file mode 100644 index 20eced54d..000000000 --- a/vendor/github.com/docker/docker/restartmanager/restartmanager_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package restartmanager - -import ( - "testing" - "time" - - "github.com/docker/docker/api/types/container" -) - -func TestRestartManagerTimeout(t *testing.T) { - rm := New(container.RestartPolicy{Name: "always"}, 0).(*restartManager) - should, _, err := rm.ShouldRestart(0, false, 1*time.Second) - if err != nil { - t.Fatal(err) - } - if !should { - t.Fatal("container should be restarted") - } - if rm.timeout != 100*time.Millisecond { - t.Fatalf("restart manager should have a timeout of 100ms but has %s", rm.timeout) - } -} - -func TestRestartManagerTimeoutReset(t *testing.T) { - rm := New(container.RestartPolicy{Name: "always"}, 0).(*restartManager) - rm.timeout = 5 * time.Second - _, _, err := rm.ShouldRestart(0, false, 10*time.Second) - if err != nil { - t.Fatal(err) - } - if rm.timeout != 100*time.Millisecond { - t.Fatalf("restart manager should have a timeout of 100ms but has %s", rm.timeout) - } -} diff --git a/vendor/github.com/docker/docker/runconfig/compare.go b/vendor/github.com/docker/docker/runconfig/compare.go deleted file mode 100644 index 708922f98..000000000 --- a/vendor/github.com/docker/docker/runconfig/compare.go +++ /dev/null @@ -1,61 +0,0 @@ -package runconfig - -import "github.com/docker/docker/api/types/container" - -// Compare two Config struct. Do not compare the "Image" nor "Hostname" fields -// If OpenStdin is set, then it differs -func Compare(a, b *container.Config) bool { - if a == nil || b == nil || - a.OpenStdin || b.OpenStdin { - return false - } - if a.AttachStdout != b.AttachStdout || - a.AttachStderr != b.AttachStderr || - a.User != b.User || - a.OpenStdin != b.OpenStdin || - a.Tty != b.Tty { - return false - } - - if len(a.Cmd) != len(b.Cmd) || - len(a.Env) != len(b.Env) || - len(a.Labels) != len(b.Labels) || - len(a.ExposedPorts) != len(b.ExposedPorts) || - len(a.Entrypoint) != len(b.Entrypoint) || - len(a.Volumes) != len(b.Volumes) { - return false - } - - for i := 0; i < len(a.Cmd); i++ { - if a.Cmd[i] != b.Cmd[i] { - return false - } - } - for i := 0; i < len(a.Env); i++ { - if a.Env[i] != b.Env[i] { - return false - } - } - for k, v := range a.Labels { - if v != b.Labels[k] { - return false - } - } - for k := range a.ExposedPorts { - if _, exists := b.ExposedPorts[k]; !exists { - return false - } - } - - for i := 0; i < len(a.Entrypoint); i++ { - if a.Entrypoint[i] != b.Entrypoint[i] { - return false - } - } - for key := range a.Volumes { - if _, exists := b.Volumes[key]; !exists { - return false - } - } - return true -} diff --git a/vendor/github.com/docker/docker/runconfig/compare_test.go b/vendor/github.com/docker/docker/runconfig/compare_test.go deleted file mode 100644 index 6370d7a88..000000000 --- a/vendor/github.com/docker/docker/runconfig/compare_test.go +++ /dev/null @@ -1,126 +0,0 @@ -package runconfig - -import ( - "testing" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/strslice" - "github.com/docker/go-connections/nat" -) - -// Just to make life easier -func newPortNoError(proto, port string) nat.Port { - p, _ := nat.NewPort(proto, port) - return p -} - -func TestCompare(t *testing.T) { - ports1 := make(nat.PortSet) - ports1[newPortNoError("tcp", "1111")] = struct{}{} - ports1[newPortNoError("tcp", "2222")] = struct{}{} - ports2 := make(nat.PortSet) - ports2[newPortNoError("tcp", "3333")] = struct{}{} - ports2[newPortNoError("tcp", "4444")] = struct{}{} - ports3 := make(nat.PortSet) - ports3[newPortNoError("tcp", "1111")] = struct{}{} - ports3[newPortNoError("tcp", "2222")] = struct{}{} - ports3[newPortNoError("tcp", "5555")] = struct{}{} - volumes1 := make(map[string]struct{}) - volumes1["/test1"] = struct{}{} - volumes2 := make(map[string]struct{}) - volumes2["/test2"] = struct{}{} - volumes3 := make(map[string]struct{}) - volumes3["/test1"] = struct{}{} - volumes3["/test3"] = struct{}{} - envs1 := []string{"ENV1=value1", "ENV2=value2"} - envs2 := []string{"ENV1=value1", "ENV3=value3"} - entrypoint1 := strslice.StrSlice{"/bin/sh", "-c"} - entrypoint2 := strslice.StrSlice{"/bin/sh", "-d"} - entrypoint3 := strslice.StrSlice{"/bin/sh", "-c", "echo"} - cmd1 := strslice.StrSlice{"/bin/sh", "-c"} - cmd2 := strslice.StrSlice{"/bin/sh", "-d"} - cmd3 := strslice.StrSlice{"/bin/sh", "-c", "echo"} - labels1 := map[string]string{"LABEL1": "value1", "LABEL2": "value2"} - labels2 := map[string]string{"LABEL1": "value1", "LABEL2": "value3"} - labels3 := map[string]string{"LABEL1": "value1", "LABEL2": "value2", "LABEL3": "value3"} - - sameConfigs := map[*container.Config]*container.Config{ - // Empty config - &container.Config{}: {}, - // Does not compare hostname, domainname & image - &container.Config{ - Hostname: "host1", - Domainname: "domain1", - Image: "image1", - User: "user", - }: { - Hostname: "host2", - Domainname: "domain2", - Image: "image2", - User: "user", - }, - // only OpenStdin - &container.Config{OpenStdin: false}: {OpenStdin: false}, - // only env - &container.Config{Env: envs1}: {Env: envs1}, - // only cmd - &container.Config{Cmd: cmd1}: {Cmd: cmd1}, - // only labels - &container.Config{Labels: labels1}: {Labels: labels1}, - // only exposedPorts - &container.Config{ExposedPorts: ports1}: {ExposedPorts: ports1}, - // only entrypoints - &container.Config{Entrypoint: entrypoint1}: {Entrypoint: entrypoint1}, - // only volumes - &container.Config{Volumes: volumes1}: {Volumes: volumes1}, - } - differentConfigs := map[*container.Config]*container.Config{ - nil: nil, - &container.Config{ - Hostname: "host1", - Domainname: "domain1", - Image: "image1", - User: "user1", - }: { - Hostname: "host1", - Domainname: "domain1", - Image: "image1", - User: "user2", - }, - // only OpenStdin - &container.Config{OpenStdin: false}: {OpenStdin: true}, - &container.Config{OpenStdin: true}: {OpenStdin: false}, - // only env - &container.Config{Env: envs1}: {Env: envs2}, - // only cmd - &container.Config{Cmd: cmd1}: {Cmd: cmd2}, - // not the same number of parts - &container.Config{Cmd: cmd1}: {Cmd: cmd3}, - // only labels - &container.Config{Labels: labels1}: {Labels: labels2}, - // not the same number of labels - &container.Config{Labels: labels1}: {Labels: labels3}, - // only exposedPorts - &container.Config{ExposedPorts: ports1}: {ExposedPorts: ports2}, - // not the same number of ports - &container.Config{ExposedPorts: ports1}: {ExposedPorts: ports3}, - // only entrypoints - &container.Config{Entrypoint: entrypoint1}: {Entrypoint: entrypoint2}, - // not the same number of parts - &container.Config{Entrypoint: entrypoint1}: {Entrypoint: entrypoint3}, - // only volumes - &container.Config{Volumes: volumes1}: {Volumes: volumes2}, - // not the same number of labels - &container.Config{Volumes: volumes1}: {Volumes: volumes3}, - } - for config1, config2 := range sameConfigs { - if !Compare(config1, config2) { - t.Fatalf("Compare should be true for [%v] and [%v]", config1, config2) - } - } - for config1, config2 := range differentConfigs { - if Compare(config1, config2) { - t.Fatalf("Compare should be false for [%v] and [%v]", config1, config2) - } - } -} diff --git a/vendor/github.com/docker/docker/runconfig/config.go b/vendor/github.com/docker/docker/runconfig/config.go deleted file mode 100644 index 508681cfe..000000000 --- a/vendor/github.com/docker/docker/runconfig/config.go +++ /dev/null @@ -1,97 +0,0 @@ -package runconfig - -import ( - "encoding/json" - "fmt" - "io" - - "github.com/docker/docker/api/types/container" - networktypes "github.com/docker/docker/api/types/network" - "github.com/docker/docker/pkg/sysinfo" - "github.com/docker/docker/volume" -) - -// ContainerDecoder implements httputils.ContainerDecoder -// calling DecodeContainerConfig. -type ContainerDecoder struct{} - -// DecodeConfig makes ContainerDecoder to implement httputils.ContainerDecoder -func (r ContainerDecoder) DecodeConfig(src io.Reader) (*container.Config, *container.HostConfig, *networktypes.NetworkingConfig, error) { - return DecodeContainerConfig(src) -} - -// DecodeHostConfig makes ContainerDecoder to implement httputils.ContainerDecoder -func (r ContainerDecoder) DecodeHostConfig(src io.Reader) (*container.HostConfig, error) { - return DecodeHostConfig(src) -} - -// DecodeContainerConfig decodes a json encoded config into a ContainerConfigWrapper -// struct and returns both a Config and a HostConfig struct -// Be aware this function is not checking whether the resulted structs are nil, -// it's your business to do so -func DecodeContainerConfig(src io.Reader) (*container.Config, *container.HostConfig, *networktypes.NetworkingConfig, error) { - var w ContainerConfigWrapper - - decoder := json.NewDecoder(src) - if err := decoder.Decode(&w); err != nil { - return nil, nil, nil, err - } - - hc := w.getHostConfig() - - // Perform platform-specific processing of Volumes and Binds. - if w.Config != nil && hc != nil { - - // Initialize the volumes map if currently nil - if w.Config.Volumes == nil { - w.Config.Volumes = make(map[string]struct{}) - } - - // Now validate all the volumes and binds - if err := validateMountSettings(w.Config, hc); err != nil { - return nil, nil, nil, err - } - } - - // Certain parameters need daemon-side validation that cannot be done - // on the client, as only the daemon knows what is valid for the platform. - if err := ValidateNetMode(w.Config, hc); err != nil { - return nil, nil, nil, err - } - - // Validate isolation - if err := ValidateIsolation(hc); err != nil { - return nil, nil, nil, err - } - - // Validate QoS - if err := ValidateQoS(hc); err != nil { - return nil, nil, nil, err - } - - // Validate Resources - if err := ValidateResources(hc, sysinfo.New(true)); err != nil { - return nil, nil, nil, err - } - return w.Config, hc, w.NetworkingConfig, nil -} - -// validateMountSettings validates each of the volumes and bind settings -// passed by the caller to ensure they are valid. -func validateMountSettings(c *container.Config, hc *container.HostConfig) error { - // it is ok to have len(hc.Mounts) > 0 && (len(hc.Binds) > 0 || len (c.Volumes) > 0 || len (hc.Tmpfs) > 0 ) - - // Ensure all volumes and binds are valid. - for spec := range c.Volumes { - if _, err := volume.ParseMountRaw(spec, hc.VolumeDriver); err != nil { - return fmt.Errorf("invalid volume spec %q: %v", spec, err) - } - } - for _, spec := range hc.Binds { - if _, err := volume.ParseMountRaw(spec, hc.VolumeDriver); err != nil { - return fmt.Errorf("invalid bind mount spec %q: %v", spec, err) - } - } - - return nil -} diff --git a/vendor/github.com/docker/docker/runconfig/config_test.go b/vendor/github.com/docker/docker/runconfig/config_test.go deleted file mode 100644 index f1f9de595..000000000 --- a/vendor/github.com/docker/docker/runconfig/config_test.go +++ /dev/null @@ -1,139 +0,0 @@ -package runconfig - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "runtime" - "strings" - "testing" - - "github.com/docker/docker/api/types/container" - networktypes "github.com/docker/docker/api/types/network" - "github.com/docker/docker/api/types/strslice" -) - -type f struct { - file string - entrypoint strslice.StrSlice -} - -func TestDecodeContainerConfig(t *testing.T) { - - var ( - fixtures []f - image string - ) - - //TODO: Should run for Solaris - if runtime.GOOS == "solaris" { - t.Skip() - } - - if runtime.GOOS != "windows" { - image = "ubuntu" - fixtures = []f{ - {"fixtures/unix/container_config_1_14.json", strslice.StrSlice{}}, - {"fixtures/unix/container_config_1_17.json", strslice.StrSlice{"bash"}}, - {"fixtures/unix/container_config_1_19.json", strslice.StrSlice{"bash"}}, - } - } else { - image = "windows" - fixtures = []f{ - {"fixtures/windows/container_config_1_19.json", strslice.StrSlice{"cmd"}}, - } - } - - for _, f := range fixtures { - b, err := ioutil.ReadFile(f.file) - if err != nil { - t.Fatal(err) - } - - c, h, _, err := DecodeContainerConfig(bytes.NewReader(b)) - if err != nil { - t.Fatal(fmt.Errorf("Error parsing %s: %v", f, err)) - } - - if c.Image != image { - t.Fatalf("Expected %s image, found %s\n", image, c.Image) - } - - if len(c.Entrypoint) != len(f.entrypoint) { - t.Fatalf("Expected %v, found %v\n", f.entrypoint, c.Entrypoint) - } - - if h != nil && h.Memory != 1000 { - t.Fatalf("Expected memory to be 1000, found %d\n", h.Memory) - } - } -} - -// TestDecodeContainerConfigIsolation validates isolation passed -// to the daemon in the hostConfig structure. Note this is platform specific -// as to what level of container isolation is supported. -func TestDecodeContainerConfigIsolation(t *testing.T) { - - // An invalid isolation level - if _, _, _, err := callDecodeContainerConfigIsolation("invalid"); err != nil { - if !strings.Contains(err.Error(), `invalid --isolation: "invalid"`) { - t.Fatal(err) - } - } - - // Blank isolation (== default) - if _, _, _, err := callDecodeContainerConfigIsolation(""); err != nil { - t.Fatal("Blank isolation should have succeeded") - } - - // Default isolation - if _, _, _, err := callDecodeContainerConfigIsolation("default"); err != nil { - t.Fatal("default isolation should have succeeded") - } - - // Process isolation (Valid on Windows only) - if runtime.GOOS == "windows" { - if _, _, _, err := callDecodeContainerConfigIsolation("process"); err != nil { - t.Fatal("process isolation should have succeeded") - } - } else { - if _, _, _, err := callDecodeContainerConfigIsolation("process"); err != nil { - if !strings.Contains(err.Error(), `invalid --isolation: "process"`) { - t.Fatal(err) - } - } - } - - // Hyper-V Containers isolation (Valid on Windows only) - if runtime.GOOS == "windows" { - if _, _, _, err := callDecodeContainerConfigIsolation("hyperv"); err != nil { - t.Fatal("hyperv isolation should have succeeded") - } - } else { - if _, _, _, err := callDecodeContainerConfigIsolation("hyperv"); err != nil { - if !strings.Contains(err.Error(), `invalid --isolation: "hyperv"`) { - t.Fatal(err) - } - } - } -} - -// callDecodeContainerConfigIsolation is a utility function to call -// DecodeContainerConfig for validating isolation -func callDecodeContainerConfigIsolation(isolation string) (*container.Config, *container.HostConfig, *networktypes.NetworkingConfig, error) { - var ( - b []byte - err error - ) - w := ContainerConfigWrapper{ - Config: &container.Config{}, - HostConfig: &container.HostConfig{ - NetworkMode: "none", - Isolation: container.Isolation(isolation)}, - } - if b, err = json.Marshal(w); err != nil { - return nil, nil, nil, fmt.Errorf("Error on marshal %s", err.Error()) - } - return DecodeContainerConfig(bytes.NewReader(b)) -} diff --git a/vendor/github.com/docker/docker/runconfig/config_unix.go b/vendor/github.com/docker/docker/runconfig/config_unix.go deleted file mode 100644 index 4ccfc73be..000000000 --- a/vendor/github.com/docker/docker/runconfig/config_unix.go +++ /dev/null @@ -1,59 +0,0 @@ -// +build !windows - -package runconfig - -import ( - "github.com/docker/docker/api/types/container" - networktypes "github.com/docker/docker/api/types/network" -) - -// ContainerConfigWrapper is a Config wrapper that holds the container Config (portable) -// and the corresponding HostConfig (non-portable). -type ContainerConfigWrapper struct { - *container.Config - InnerHostConfig *container.HostConfig `json:"HostConfig,omitempty"` - Cpuset string `json:",omitempty"` // Deprecated. Exported for backwards compatibility. - NetworkingConfig *networktypes.NetworkingConfig `json:"NetworkingConfig,omitempty"` - *container.HostConfig // Deprecated. Exported to read attributes from json that are not in the inner host config structure. -} - -// getHostConfig gets the HostConfig of the Config. -// It's mostly there to handle Deprecated fields of the ContainerConfigWrapper -func (w *ContainerConfigWrapper) getHostConfig() *container.HostConfig { - hc := w.HostConfig - - if hc == nil && w.InnerHostConfig != nil { - hc = w.InnerHostConfig - } else if w.InnerHostConfig != nil { - if hc.Memory != 0 && w.InnerHostConfig.Memory == 0 { - w.InnerHostConfig.Memory = hc.Memory - } - if hc.MemorySwap != 0 && w.InnerHostConfig.MemorySwap == 0 { - w.InnerHostConfig.MemorySwap = hc.MemorySwap - } - if hc.CPUShares != 0 && w.InnerHostConfig.CPUShares == 0 { - w.InnerHostConfig.CPUShares = hc.CPUShares - } - if hc.CpusetCpus != "" && w.InnerHostConfig.CpusetCpus == "" { - w.InnerHostConfig.CpusetCpus = hc.CpusetCpus - } - - if hc.VolumeDriver != "" && w.InnerHostConfig.VolumeDriver == "" { - w.InnerHostConfig.VolumeDriver = hc.VolumeDriver - } - - hc = w.InnerHostConfig - } - - if hc != nil { - if w.Cpuset != "" && hc.CpusetCpus == "" { - hc.CpusetCpus = w.Cpuset - } - } - - // Make sure NetworkMode has an acceptable value. We do this to ensure - // backwards compatible API behavior. - hc = SetDefaultNetModeIfBlank(hc) - - return hc -} diff --git a/vendor/github.com/docker/docker/runconfig/config_windows.go b/vendor/github.com/docker/docker/runconfig/config_windows.go deleted file mode 100644 index f2361b554..000000000 --- a/vendor/github.com/docker/docker/runconfig/config_windows.go +++ /dev/null @@ -1,19 +0,0 @@ -package runconfig - -import ( - "github.com/docker/docker/api/types/container" - networktypes "github.com/docker/docker/api/types/network" -) - -// ContainerConfigWrapper is a Config wrapper that holds the container Config (portable) -// and the corresponding HostConfig (non-portable). -type ContainerConfigWrapper struct { - *container.Config - HostConfig *container.HostConfig `json:"HostConfig,omitempty"` - NetworkingConfig *networktypes.NetworkingConfig `json:"NetworkingConfig,omitempty"` -} - -// getHostConfig gets the HostConfig of the Config. -func (w *ContainerConfigWrapper) getHostConfig() *container.HostConfig { - return w.HostConfig -} diff --git a/vendor/github.com/docker/docker/runconfig/errors.go b/vendor/github.com/docker/docker/runconfig/errors.go deleted file mode 100644 index bb72c1699..000000000 --- a/vendor/github.com/docker/docker/runconfig/errors.go +++ /dev/null @@ -1,46 +0,0 @@ -package runconfig - -import ( - "fmt" - - "github.com/docker/docker/api/errors" -) - -var ( - // ErrConflictContainerNetworkAndLinks conflict between --net=container and links - ErrConflictContainerNetworkAndLinks = fmt.Errorf("Conflicting options: container type network can't be used with links. This would result in undefined behavior") - // ErrConflictUserDefinedNetworkAndLinks conflict between --net= and links - ErrConflictUserDefinedNetworkAndLinks = fmt.Errorf("Conflicting options: networking can't be used with links. This would result in undefined behavior") - // ErrConflictSharedNetwork conflict between private and other networks - ErrConflictSharedNetwork = fmt.Errorf("Container sharing network namespace with another container or host cannot be connected to any other network") - // ErrConflictHostNetwork conflict from being disconnected from host network or connected to host network. - ErrConflictHostNetwork = fmt.Errorf("Container cannot be disconnected from host network or connected to host network") - // ErrConflictNoNetwork conflict between private and other networks - ErrConflictNoNetwork = fmt.Errorf("Container cannot be connected to multiple networks with one of the networks in private (none) mode") - // ErrConflictNetworkAndDNS conflict between --dns and the network mode - ErrConflictNetworkAndDNS = fmt.Errorf("Conflicting options: dns and the network mode") - // ErrConflictNetworkHostname conflict between the hostname and the network mode - ErrConflictNetworkHostname = fmt.Errorf("Conflicting options: hostname and the network mode") - // ErrConflictHostNetworkAndLinks conflict between --net=host and links - ErrConflictHostNetworkAndLinks = fmt.Errorf("Conflicting options: host type networking can't be used with links. This would result in undefined behavior") - // ErrConflictContainerNetworkAndMac conflict between the mac address and the network mode - ErrConflictContainerNetworkAndMac = fmt.Errorf("Conflicting options: mac-address and the network mode") - // ErrConflictNetworkHosts conflict between add-host and the network mode - ErrConflictNetworkHosts = fmt.Errorf("Conflicting options: custom host-to-IP mapping and the network mode") - // ErrConflictNetworkPublishPorts conflict between the publish options and the network mode - ErrConflictNetworkPublishPorts = fmt.Errorf("Conflicting options: port publishing and the container type network mode") - // ErrConflictNetworkExposePorts conflict between the expose option and the network mode - ErrConflictNetworkExposePorts = fmt.Errorf("Conflicting options: port exposing and the container type network mode") - // ErrUnsupportedNetworkAndIP conflict between network mode and requested ip address - ErrUnsupportedNetworkAndIP = fmt.Errorf("User specified IP address is supported on user defined networks only") - // ErrUnsupportedNetworkNoSubnetAndIP conflict between network with no configured subnet and requested ip address - ErrUnsupportedNetworkNoSubnetAndIP = fmt.Errorf("User specified IP address is supported only when connecting to networks with user configured subnets") - // ErrUnsupportedNetworkAndAlias conflict between network mode and alias - ErrUnsupportedNetworkAndAlias = fmt.Errorf("Network-scoped alias is supported only for containers in user defined networks") - // ErrConflictUTSHostname conflict between the hostname and the UTS mode - ErrConflictUTSHostname = fmt.Errorf("Conflicting options: hostname and the UTS mode") -) - -func conflictError(err error) error { - return errors.NewRequestConflictError(err) -} diff --git a/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_14.json b/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_14.json deleted file mode 100644 index b08334c09..000000000 --- a/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_14.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "Hostname":"", - "Domainname": "", - "User":"", - "Memory": 1000, - "MemorySwap":0, - "CpuShares": 512, - "Cpuset": "0,1", - "AttachStdin":false, - "AttachStdout":true, - "AttachStderr":true, - "PortSpecs":null, - "Tty":false, - "OpenStdin":false, - "StdinOnce":false, - "Env":null, - "Cmd":[ - "bash" - ], - "Image":"ubuntu", - "Volumes":{ - "/tmp": {} - }, - "WorkingDir":"", - "NetworkDisabled": false, - "ExposedPorts":{ - "22/tcp": {} - }, - "RestartPolicy": { "Name": "always" } -} diff --git a/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_17.json b/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_17.json deleted file mode 100644 index 0d780877b..000000000 --- a/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_17.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "Hostname": "", - "Domainname": "", - "User": "", - "Memory": 1000, - "MemorySwap": 0, - "CpuShares": 512, - "Cpuset": "0,1", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Entrypoint": "bash", - "Image": "ubuntu", - "Volumes": { - "/tmp": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "SecurityOpt": [""], - "HostConfig": { - "Binds": ["/tmp:/tmp"], - "Links": ["redis3:redis"], - "LxcConf": {"lxc.utsname":"docker"}, - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsSearch": [""], - "DnsOptions": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "NetworkMode": "bridge", - "Devices": [] - } -} diff --git a/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_19.json b/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_19.json deleted file mode 100644 index de49cf324..000000000 --- a/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_config_1_19.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Entrypoint": "bash", - "Image": "ubuntu", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": { - "/tmp": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "HostConfig": { - "Binds": ["/tmp:/tmp"], - "Links": ["redis3:redis"], - "LxcConf": {"lxc.utsname":"docker"}, - "Memory": 1000, - "MemorySwap": 0, - "CpuShares": 512, - "CpusetCpus": "0,1", - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsSearch": [""], - "DnsOptions": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "NetworkMode": "bridge", - "Devices": [], - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [""], - "CgroupParent": "" - } -} diff --git a/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_hostconfig_1_14.json b/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_hostconfig_1_14.json deleted file mode 100644 index c72ac91ca..000000000 --- a/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_hostconfig_1_14.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "Binds": ["/tmp:/tmp"], - "ContainerIDFile": "", - "LxcConf": [], - "Privileged": false, - "PortBindings": { - "80/tcp": [ - { - "HostIp": "0.0.0.0", - "HostPort": "49153" - } - ] - }, - "Links": ["/name:alias"], - "PublishAllPorts": false, - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"] -} diff --git a/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_hostconfig_1_19.json b/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_hostconfig_1_19.json deleted file mode 100644 index 5ca8aa7e1..000000000 --- a/vendor/github.com/docker/docker/runconfig/fixtures/unix/container_hostconfig_1_19.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "Binds": ["/tmp:/tmp"], - "Links": ["redis3:redis"], - "LxcConf": {"lxc.utsname":"docker"}, - "Memory": 0, - "MemorySwap": 0, - "CpuShares": 512, - "CpuPeriod": 100000, - "CpusetCpus": "0,1", - "CpusetMems": "0,1", - "BlkioWeight": 300, - "OomKillDisable": false, - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsSearch": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "NetworkMode": "bridge", - "Devices": [], - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [""], - "CgroupParent": "" -} diff --git a/vendor/github.com/docker/docker/runconfig/fixtures/windows/container_config_1_19.json b/vendor/github.com/docker/docker/runconfig/fixtures/windows/container_config_1_19.json deleted file mode 100644 index 724320c76..000000000 --- a/vendor/github.com/docker/docker/runconfig/fixtures/windows/container_config_1_19.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "Hostname": "", - "Domainname": "", - "User": "", - "AttachStdin": false, - "AttachStdout": true, - "AttachStderr": true, - "Tty": false, - "OpenStdin": false, - "StdinOnce": false, - "Env": null, - "Cmd": [ - "date" - ], - "Entrypoint": "cmd", - "Image": "windows", - "Labels": { - "com.example.vendor": "Acme", - "com.example.license": "GPL", - "com.example.version": "1.0" - }, - "Volumes": { - "c:/windows": {} - }, - "WorkingDir": "", - "NetworkDisabled": false, - "MacAddress": "12:34:56:78:9a:bc", - "ExposedPorts": { - "22/tcp": {} - }, - "HostConfig": { - "Binds": ["c:/windows:d:/tmp"], - "Links": ["redis3:redis"], - "LxcConf": {"lxc.utsname":"docker"}, - "Memory": 1000, - "MemorySwap": 0, - "CpuShares": 512, - "CpusetCpus": "0,1", - "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }, - "PublishAllPorts": false, - "Privileged": false, - "ReadonlyRootfs": false, - "Dns": ["8.8.8.8"], - "DnsSearch": [""], - "DnsOptions": [""], - "ExtraHosts": null, - "VolumesFrom": ["parent", "other:ro"], - "CapAdd": ["NET_ADMIN"], - "CapDrop": ["MKNOD"], - "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 }, - "NetworkMode": "default", - "Devices": [], - "Ulimits": [{}], - "LogConfig": { "Type": "json-file", "Config": {} }, - "SecurityOpt": [""], - "CgroupParent": "" - } -} diff --git a/vendor/github.com/docker/docker/runconfig/hostconfig.go b/vendor/github.com/docker/docker/runconfig/hostconfig.go deleted file mode 100644 index 2b81d02c2..000000000 --- a/vendor/github.com/docker/docker/runconfig/hostconfig.go +++ /dev/null @@ -1,35 +0,0 @@ -package runconfig - -import ( - "encoding/json" - "io" - - "github.com/docker/docker/api/types/container" -) - -// DecodeHostConfig creates a HostConfig based on the specified Reader. -// It assumes the content of the reader will be JSON, and decodes it. -func DecodeHostConfig(src io.Reader) (*container.HostConfig, error) { - decoder := json.NewDecoder(src) - - var w ContainerConfigWrapper - if err := decoder.Decode(&w); err != nil { - return nil, err - } - - hc := w.getHostConfig() - return hc, nil -} - -// SetDefaultNetModeIfBlank changes the NetworkMode in a HostConfig structure -// to default if it is not populated. This ensures backwards compatibility after -// the validation of the network mode was moved from the docker CLI to the -// docker daemon. -func SetDefaultNetModeIfBlank(hc *container.HostConfig) *container.HostConfig { - if hc != nil { - if hc.NetworkMode == container.NetworkMode("") { - hc.NetworkMode = container.NetworkMode("default") - } - } - return hc -} diff --git a/vendor/github.com/docker/docker/runconfig/hostconfig_solaris.go b/vendor/github.com/docker/docker/runconfig/hostconfig_solaris.go deleted file mode 100644 index 83ad32ecc..000000000 --- a/vendor/github.com/docker/docker/runconfig/hostconfig_solaris.go +++ /dev/null @@ -1,41 +0,0 @@ -package runconfig - -import ( - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/pkg/sysinfo" -) - -// DefaultDaemonNetworkMode returns the default network stack the daemon should -// use. -func DefaultDaemonNetworkMode() container.NetworkMode { - return container.NetworkMode("bridge") -} - -// IsPreDefinedNetwork indicates if a network is predefined by the daemon -func IsPreDefinedNetwork(network string) bool { - return false -} - -// ValidateNetMode ensures that the various combinations of requested -// network settings are valid. -func ValidateNetMode(c *container.Config, hc *container.HostConfig) error { - // We may not be passed a host config, such as in the case of docker commit - return nil -} - -// ValidateIsolation performs platform specific validation of the -// isolation level in the hostconfig structure. -// This setting is currently discarded for Solaris so this is a no-op. -func ValidateIsolation(hc *container.HostConfig) error { - return nil -} - -// ValidateQoS performs platform specific validation of the QoS settings -func ValidateQoS(hc *container.HostConfig) error { - return nil -} - -// ValidateResources performs platform specific validation of the resource settings -func ValidateResources(hc *container.HostConfig, si *sysinfo.SysInfo) error { - return nil -} diff --git a/vendor/github.com/docker/docker/runconfig/hostconfig_test.go b/vendor/github.com/docker/docker/runconfig/hostconfig_test.go deleted file mode 100644 index a6a2b34fc..000000000 --- a/vendor/github.com/docker/docker/runconfig/hostconfig_test.go +++ /dev/null @@ -1,283 +0,0 @@ -// +build !windows - -package runconfig - -import ( - "bytes" - "fmt" - "io/ioutil" - "testing" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/pkg/sysinfo" -) - -// TODO Windows: This will need addressing for a Windows daemon. -func TestNetworkModeTest(t *testing.T) { - networkModes := map[container.NetworkMode][]bool{ - // private, bridge, host, container, none, default - "": {true, false, false, false, false, false}, - "something:weird": {true, false, false, false, false, false}, - "bridge": {true, true, false, false, false, false}, - DefaultDaemonNetworkMode(): {true, true, false, false, false, false}, - "host": {false, false, true, false, false, false}, - "container:name": {false, false, false, true, false, false}, - "none": {true, false, false, false, true, false}, - "default": {true, false, false, false, false, true}, - } - networkModeNames := map[container.NetworkMode]string{ - "": "", - "something:weird": "something:weird", - "bridge": "bridge", - DefaultDaemonNetworkMode(): "bridge", - "host": "host", - "container:name": "container", - "none": "none", - "default": "default", - } - for networkMode, state := range networkModes { - if networkMode.IsPrivate() != state[0] { - t.Fatalf("NetworkMode.IsPrivate for %v should have been %v but was %v", networkMode, state[0], networkMode.IsPrivate()) - } - if networkMode.IsBridge() != state[1] { - t.Fatalf("NetworkMode.IsBridge for %v should have been %v but was %v", networkMode, state[1], networkMode.IsBridge()) - } - if networkMode.IsHost() != state[2] { - t.Fatalf("NetworkMode.IsHost for %v should have been %v but was %v", networkMode, state[2], networkMode.IsHost()) - } - if networkMode.IsContainer() != state[3] { - t.Fatalf("NetworkMode.IsContainer for %v should have been %v but was %v", networkMode, state[3], networkMode.IsContainer()) - } - if networkMode.IsNone() != state[4] { - t.Fatalf("NetworkMode.IsNone for %v should have been %v but was %v", networkMode, state[4], networkMode.IsNone()) - } - if networkMode.IsDefault() != state[5] { - t.Fatalf("NetworkMode.IsDefault for %v should have been %v but was %v", networkMode, state[5], networkMode.IsDefault()) - } - if networkMode.NetworkName() != networkModeNames[networkMode] { - t.Fatalf("Expected name %v, got %v", networkModeNames[networkMode], networkMode.NetworkName()) - } - } -} - -func TestIpcModeTest(t *testing.T) { - ipcModes := map[container.IpcMode][]bool{ - // private, host, container, valid - "": {true, false, false, true}, - "something:weird": {true, false, false, false}, - ":weird": {true, false, false, true}, - "host": {false, true, false, true}, - "container:name": {false, false, true, true}, - "container:name:something": {false, false, true, false}, - "container:": {false, false, true, false}, - } - for ipcMode, state := range ipcModes { - if ipcMode.IsPrivate() != state[0] { - t.Fatalf("IpcMode.IsPrivate for %v should have been %v but was %v", ipcMode, state[0], ipcMode.IsPrivate()) - } - if ipcMode.IsHost() != state[1] { - t.Fatalf("IpcMode.IsHost for %v should have been %v but was %v", ipcMode, state[1], ipcMode.IsHost()) - } - if ipcMode.IsContainer() != state[2] { - t.Fatalf("IpcMode.IsContainer for %v should have been %v but was %v", ipcMode, state[2], ipcMode.IsContainer()) - } - if ipcMode.Valid() != state[3] { - t.Fatalf("IpcMode.Valid for %v should have been %v but was %v", ipcMode, state[3], ipcMode.Valid()) - } - } - containerIpcModes := map[container.IpcMode]string{ - "": "", - "something": "", - "something:weird": "weird", - "container": "", - "container:": "", - "container:name": "name", - "container:name1:name2": "name1:name2", - } - for ipcMode, container := range containerIpcModes { - if ipcMode.Container() != container { - t.Fatalf("Expected %v for %v but was %v", container, ipcMode, ipcMode.Container()) - } - } -} - -func TestUTSModeTest(t *testing.T) { - utsModes := map[container.UTSMode][]bool{ - // private, host, valid - "": {true, false, true}, - "something:weird": {true, false, false}, - "host": {false, true, true}, - "host:name": {true, false, true}, - } - for utsMode, state := range utsModes { - if utsMode.IsPrivate() != state[0] { - t.Fatalf("UtsMode.IsPrivate for %v should have been %v but was %v", utsMode, state[0], utsMode.IsPrivate()) - } - if utsMode.IsHost() != state[1] { - t.Fatalf("UtsMode.IsHost for %v should have been %v but was %v", utsMode, state[1], utsMode.IsHost()) - } - if utsMode.Valid() != state[2] { - t.Fatalf("UtsMode.Valid for %v should have been %v but was %v", utsMode, state[2], utsMode.Valid()) - } - } -} - -func TestUsernsModeTest(t *testing.T) { - usrensMode := map[container.UsernsMode][]bool{ - // private, host, valid - "": {true, false, true}, - "something:weird": {true, false, false}, - "host": {false, true, true}, - "host:name": {true, false, true}, - } - for usernsMode, state := range usrensMode { - if usernsMode.IsPrivate() != state[0] { - t.Fatalf("UsernsMode.IsPrivate for %v should have been %v but was %v", usernsMode, state[0], usernsMode.IsPrivate()) - } - if usernsMode.IsHost() != state[1] { - t.Fatalf("UsernsMode.IsHost for %v should have been %v but was %v", usernsMode, state[1], usernsMode.IsHost()) - } - if usernsMode.Valid() != state[2] { - t.Fatalf("UsernsMode.Valid for %v should have been %v but was %v", usernsMode, state[2], usernsMode.Valid()) - } - } -} - -func TestPidModeTest(t *testing.T) { - pidModes := map[container.PidMode][]bool{ - // private, host, valid - "": {true, false, true}, - "something:weird": {true, false, false}, - "host": {false, true, true}, - "host:name": {true, false, true}, - } - for pidMode, state := range pidModes { - if pidMode.IsPrivate() != state[0] { - t.Fatalf("PidMode.IsPrivate for %v should have been %v but was %v", pidMode, state[0], pidMode.IsPrivate()) - } - if pidMode.IsHost() != state[1] { - t.Fatalf("PidMode.IsHost for %v should have been %v but was %v", pidMode, state[1], pidMode.IsHost()) - } - if pidMode.Valid() != state[2] { - t.Fatalf("PidMode.Valid for %v should have been %v but was %v", pidMode, state[2], pidMode.Valid()) - } - } -} - -func TestRestartPolicy(t *testing.T) { - restartPolicies := map[container.RestartPolicy][]bool{ - // none, always, failure - container.RestartPolicy{}: {true, false, false}, - container.RestartPolicy{"something", 0}: {false, false, false}, - container.RestartPolicy{"no", 0}: {true, false, false}, - container.RestartPolicy{"always", 0}: {false, true, false}, - container.RestartPolicy{"on-failure", 0}: {false, false, true}, - } - for restartPolicy, state := range restartPolicies { - if restartPolicy.IsNone() != state[0] { - t.Fatalf("RestartPolicy.IsNone for %v should have been %v but was %v", restartPolicy, state[0], restartPolicy.IsNone()) - } - if restartPolicy.IsAlways() != state[1] { - t.Fatalf("RestartPolicy.IsAlways for %v should have been %v but was %v", restartPolicy, state[1], restartPolicy.IsAlways()) - } - if restartPolicy.IsOnFailure() != state[2] { - t.Fatalf("RestartPolicy.IsOnFailure for %v should have been %v but was %v", restartPolicy, state[2], restartPolicy.IsOnFailure()) - } - } -} -func TestDecodeHostConfig(t *testing.T) { - fixtures := []struct { - file string - }{ - {"fixtures/unix/container_hostconfig_1_14.json"}, - {"fixtures/unix/container_hostconfig_1_19.json"}, - } - - for _, f := range fixtures { - b, err := ioutil.ReadFile(f.file) - if err != nil { - t.Fatal(err) - } - - c, err := DecodeHostConfig(bytes.NewReader(b)) - if err != nil { - t.Fatal(fmt.Errorf("Error parsing %s: %v", f, err)) - } - - if c.Privileged != false { - t.Fatalf("Expected privileged false, found %v\n", c.Privileged) - } - - if l := len(c.Binds); l != 1 { - t.Fatalf("Expected 1 bind, found %d\n", l) - } - - if len(c.CapAdd) != 1 && c.CapAdd[0] != "NET_ADMIN" { - t.Fatalf("Expected CapAdd NET_ADMIN, got %v", c.CapAdd) - } - - if len(c.CapDrop) != 1 && c.CapDrop[0] != "NET_ADMIN" { - t.Fatalf("Expected CapDrop MKNOD, got %v", c.CapDrop) - } - } -} - -func TestValidateResources(t *testing.T) { - type resourceTest struct { - ConfigCPURealtimePeriod int64 - ConfigCPURealtimeRuntime int64 - SysInfoCPURealtimePeriod bool - SysInfoCPURealtimeRuntime bool - ErrorExpected bool - FailureMsg string - } - - tests := []resourceTest{ - { - ConfigCPURealtimePeriod: 1000, - ConfigCPURealtimeRuntime: 1000, - SysInfoCPURealtimePeriod: true, - SysInfoCPURealtimeRuntime: true, - ErrorExpected: false, - FailureMsg: "Expected valid configuration", - }, - { - ConfigCPURealtimePeriod: 5000, - ConfigCPURealtimeRuntime: 5000, - SysInfoCPURealtimePeriod: false, - SysInfoCPURealtimeRuntime: true, - ErrorExpected: true, - FailureMsg: "Expected failure when cpu-rt-period is set but kernel doesn't support it", - }, - { - ConfigCPURealtimePeriod: 5000, - ConfigCPURealtimeRuntime: 5000, - SysInfoCPURealtimePeriod: true, - SysInfoCPURealtimeRuntime: false, - ErrorExpected: true, - FailureMsg: "Expected failure when cpu-rt-runtime is set but kernel doesn't support it", - }, - { - ConfigCPURealtimePeriod: 5000, - ConfigCPURealtimeRuntime: 10000, - SysInfoCPURealtimePeriod: true, - SysInfoCPURealtimeRuntime: false, - ErrorExpected: true, - FailureMsg: "Expected failure when cpu-rt-runtime is greater than cpu-rt-period", - }, - } - - for _, rt := range tests { - var hc container.HostConfig - hc.Resources.CPURealtimePeriod = rt.ConfigCPURealtimePeriod - hc.Resources.CPURealtimeRuntime = rt.ConfigCPURealtimeRuntime - - var si sysinfo.SysInfo - si.CPURealtimePeriod = rt.SysInfoCPURealtimePeriod - si.CPURealtimeRuntime = rt.SysInfoCPURealtimeRuntime - - if err := ValidateResources(&hc, &si); (err != nil) != rt.ErrorExpected { - t.Fatal(rt.FailureMsg, err) - } - } -} diff --git a/vendor/github.com/docker/docker/runconfig/hostconfig_unix.go b/vendor/github.com/docker/docker/runconfig/hostconfig_unix.go deleted file mode 100644 index 6e2b7f5ff..000000000 --- a/vendor/github.com/docker/docker/runconfig/hostconfig_unix.go +++ /dev/null @@ -1,129 +0,0 @@ -// +build !windows,!solaris - -package runconfig - -import ( - "fmt" - "runtime" - "strings" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/pkg/sysinfo" -) - -// DefaultDaemonNetworkMode returns the default network stack the daemon should -// use. -func DefaultDaemonNetworkMode() container.NetworkMode { - return container.NetworkMode("bridge") -} - -// IsPreDefinedNetwork indicates if a network is predefined by the daemon -func IsPreDefinedNetwork(network string) bool { - n := container.NetworkMode(network) - return n.IsBridge() || n.IsHost() || n.IsNone() || n.IsDefault() || network == "ingress" -} - -// ValidateNetMode ensures that the various combinations of requested -// network settings are valid. -func ValidateNetMode(c *container.Config, hc *container.HostConfig) error { - // We may not be passed a host config, such as in the case of docker commit - if hc == nil { - return nil - } - parts := strings.Split(string(hc.NetworkMode), ":") - if parts[0] == "container" { - if len(parts) < 2 || parts[1] == "" { - return fmt.Errorf("--net: invalid net mode: invalid container format container:") - } - } - - if hc.NetworkMode.IsContainer() && c.Hostname != "" { - return ErrConflictNetworkHostname - } - - if hc.UTSMode.IsHost() && c.Hostname != "" { - return ErrConflictUTSHostname - } - - if hc.NetworkMode.IsHost() && len(hc.Links) > 0 { - return ErrConflictHostNetworkAndLinks - } - - if hc.NetworkMode.IsContainer() && len(hc.Links) > 0 { - return ErrConflictContainerNetworkAndLinks - } - - if hc.NetworkMode.IsContainer() && len(hc.DNS) > 0 { - return ErrConflictNetworkAndDNS - } - - if hc.NetworkMode.IsContainer() && len(hc.ExtraHosts) > 0 { - return ErrConflictNetworkHosts - } - - if (hc.NetworkMode.IsContainer() || hc.NetworkMode.IsHost()) && c.MacAddress != "" { - return ErrConflictContainerNetworkAndMac - } - - if hc.NetworkMode.IsContainer() && (len(hc.PortBindings) > 0 || hc.PublishAllPorts == true) { - return ErrConflictNetworkPublishPorts - } - - if hc.NetworkMode.IsContainer() && len(c.ExposedPorts) > 0 { - return ErrConflictNetworkExposePorts - } - return nil -} - -// ValidateIsolation performs platform specific validation of -// isolation in the hostconfig structure. Linux only supports "default" -// which is LXC container isolation -func ValidateIsolation(hc *container.HostConfig) error { - // We may not be passed a host config, such as in the case of docker commit - if hc == nil { - return nil - } - if !hc.Isolation.IsValid() { - return fmt.Errorf("invalid --isolation: %q - %s only supports 'default'", hc.Isolation, runtime.GOOS) - } - return nil -} - -// ValidateQoS performs platform specific validation of the QoS settings -func ValidateQoS(hc *container.HostConfig) error { - // We may not be passed a host config, such as in the case of docker commit - if hc == nil { - return nil - } - - if hc.IOMaximumBandwidth != 0 { - return fmt.Errorf("invalid QoS settings: %s does not support --io-maxbandwidth", runtime.GOOS) - } - - if hc.IOMaximumIOps != 0 { - return fmt.Errorf("invalid QoS settings: %s does not support --io-maxiops", runtime.GOOS) - } - return nil -} - -// ValidateResources performs platform specific validation of the resource settings -// cpu-rt-runtime and cpu-rt-period can not be greater than their parent, cpu-rt-runtime requires sys_nice -func ValidateResources(hc *container.HostConfig, si *sysinfo.SysInfo) error { - // We may not be passed a host config, such as in the case of docker commit - if hc == nil { - return nil - } - - if hc.Resources.CPURealtimePeriod > 0 && !si.CPURealtimePeriod { - return fmt.Errorf("invalid --cpu-rt-period: Your kernel does not support cgroup rt period") - } - - if hc.Resources.CPURealtimeRuntime > 0 && !si.CPURealtimeRuntime { - return fmt.Errorf("invalid --cpu-rt-runtime: Your kernel does not support cgroup rt runtime") - } - - if hc.Resources.CPURealtimePeriod != 0 && hc.Resources.CPURealtimeRuntime != 0 && hc.Resources.CPURealtimeRuntime > hc.Resources.CPURealtimePeriod { - return fmt.Errorf("invalid --cpu-rt-runtime: rt runtime cannot be higher than rt period") - } - return nil -} diff --git a/vendor/github.com/docker/docker/runconfig/hostconfig_windows.go b/vendor/github.com/docker/docker/runconfig/hostconfig_windows.go deleted file mode 100644 index 91bd6dcc3..000000000 --- a/vendor/github.com/docker/docker/runconfig/hostconfig_windows.go +++ /dev/null @@ -1,68 +0,0 @@ -package runconfig - -import ( - "fmt" - "strings" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/pkg/sysinfo" -) - -// DefaultDaemonNetworkMode returns the default network stack the daemon should -// use. -func DefaultDaemonNetworkMode() container.NetworkMode { - return container.NetworkMode("nat") -} - -// IsPreDefinedNetwork indicates if a network is predefined by the daemon -func IsPreDefinedNetwork(network string) bool { - return !container.NetworkMode(network).IsUserDefined() -} - -// ValidateNetMode ensures that the various combinations of requested -// network settings are valid. -func ValidateNetMode(c *container.Config, hc *container.HostConfig) error { - if hc == nil { - return nil - } - parts := strings.Split(string(hc.NetworkMode), ":") - if len(parts) > 1 { - return fmt.Errorf("invalid --net: %s", hc.NetworkMode) - } - return nil -} - -// ValidateIsolation performs platform specific validation of the -// isolation in the hostconfig structure. Windows supports 'default' (or -// blank), 'process', or 'hyperv'. -func ValidateIsolation(hc *container.HostConfig) error { - // We may not be passed a host config, such as in the case of docker commit - if hc == nil { - return nil - } - if !hc.Isolation.IsValid() { - return fmt.Errorf("invalid --isolation: %q. Windows supports 'default', 'process', or 'hyperv'", hc.Isolation) - } - return nil -} - -// ValidateQoS performs platform specific validation of the Qos settings -func ValidateQoS(hc *container.HostConfig) error { - return nil -} - -// ValidateResources performs platform specific validation of the resource settings -func ValidateResources(hc *container.HostConfig, si *sysinfo.SysInfo) error { - // We may not be passed a host config, such as in the case of docker commit - if hc == nil { - return nil - } - - if hc.Resources.CPURealtimePeriod != 0 { - return fmt.Errorf("invalid --cpu-rt-period: Windows does not support this feature") - } - if hc.Resources.CPURealtimeRuntime != 0 { - return fmt.Errorf("invalid --cpu-rt-runtime: Windows does not support this feature") - } - return nil -} diff --git a/vendor/github.com/docker/docker/runconfig/opts/envfile.go b/vendor/github.com/docker/docker/runconfig/opts/envfile.go deleted file mode 100644 index f72379921..000000000 --- a/vendor/github.com/docker/docker/runconfig/opts/envfile.go +++ /dev/null @@ -1,81 +0,0 @@ -package opts - -import ( - "bufio" - "bytes" - "fmt" - "os" - "strings" - "unicode" - "unicode/utf8" -) - -// ParseEnvFile reads a file with environment variables enumerated by lines -// -// ``Environment variable names used by the utilities in the Shell and -// Utilities volume of IEEE Std 1003.1-2001 consist solely of uppercase -// letters, digits, and the '_' (underscore) from the characters defined in -// Portable Character Set and do not begin with a digit. *But*, other -// characters may be permitted by an implementation; applications shall -// tolerate the presence of such names.'' -// -- http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html -// -// As of #16585, it's up to application inside docker to validate or not -// environment variables, that's why we just strip leading whitespace and -// nothing more. -func ParseEnvFile(filename string) ([]string, error) { - fh, err := os.Open(filename) - if err != nil { - return []string{}, err - } - defer fh.Close() - - lines := []string{} - scanner := bufio.NewScanner(fh) - currentLine := 0 - utf8bom := []byte{0xEF, 0xBB, 0xBF} - for scanner.Scan() { - scannedBytes := scanner.Bytes() - if !utf8.Valid(scannedBytes) { - return []string{}, fmt.Errorf("env file %s contains invalid utf8 bytes at line %d: %v", filename, currentLine+1, scannedBytes) - } - // We trim UTF8 BOM - if currentLine == 0 { - scannedBytes = bytes.TrimPrefix(scannedBytes, utf8bom) - } - // trim the line from all leading whitespace first - line := strings.TrimLeftFunc(string(scannedBytes), unicode.IsSpace) - currentLine++ - // line is not empty, and not starting with '#' - if len(line) > 0 && !strings.HasPrefix(line, "#") { - data := strings.SplitN(line, "=", 2) - - // trim the front of a variable, but nothing else - variable := strings.TrimLeft(data[0], whiteSpaces) - if strings.ContainsAny(variable, whiteSpaces) { - return []string{}, ErrBadEnvVariable{fmt.Sprintf("variable '%s' has white spaces", variable)} - } - - if len(data) > 1 { - - // pass the value through, no trimming - lines = append(lines, fmt.Sprintf("%s=%s", variable, data[1])) - } else { - // if only a pass-through variable is given, clean it up. - lines = append(lines, fmt.Sprintf("%s=%s", strings.TrimSpace(line), os.Getenv(line))) - } - } - } - return lines, scanner.Err() -} - -var whiteSpaces = " \t" - -// ErrBadEnvVariable typed error for bad environment variable -type ErrBadEnvVariable struct { - msg string -} - -func (e ErrBadEnvVariable) Error() string { - return fmt.Sprintf("poorly formatted environment: %s", e.msg) -} diff --git a/vendor/github.com/docker/docker/runconfig/opts/envfile_test.go b/vendor/github.com/docker/docker/runconfig/opts/envfile_test.go deleted file mode 100644 index 5dd7078bc..000000000 --- a/vendor/github.com/docker/docker/runconfig/opts/envfile_test.go +++ /dev/null @@ -1,142 +0,0 @@ -package opts - -import ( - "bufio" - "fmt" - "io/ioutil" - "os" - "reflect" - "strings" - "testing" -) - -func tmpFileWithContent(content string, t *testing.T) string { - tmpFile, err := ioutil.TempFile("", "envfile-test") - if err != nil { - t.Fatal(err) - } - defer tmpFile.Close() - - tmpFile.WriteString(content) - return tmpFile.Name() -} - -// Test ParseEnvFile for a file with a few well formatted lines -func TestParseEnvFileGoodFile(t *testing.T) { - content := `foo=bar - baz=quux -# comment - -_foobar=foobaz -with.dots=working -and_underscore=working too -` - // Adding a newline + a line with pure whitespace. - // This is being done like this instead of the block above - // because it's common for editors to trim trailing whitespace - // from lines, which becomes annoying since that's the - // exact thing we need to test. - content += "\n \t " - tmpFile := tmpFileWithContent(content, t) - defer os.Remove(tmpFile) - - lines, err := ParseEnvFile(tmpFile) - if err != nil { - t.Fatal(err) - } - - expectedLines := []string{ - "foo=bar", - "baz=quux", - "_foobar=foobaz", - "with.dots=working", - "and_underscore=working too", - } - - if !reflect.DeepEqual(lines, expectedLines) { - t.Fatal("lines not equal to expected_lines") - } -} - -// Test ParseEnvFile for an empty file -func TestParseEnvFileEmptyFile(t *testing.T) { - tmpFile := tmpFileWithContent("", t) - defer os.Remove(tmpFile) - - lines, err := ParseEnvFile(tmpFile) - if err != nil { - t.Fatal(err) - } - - if len(lines) != 0 { - t.Fatal("lines not empty; expected empty") - } -} - -// Test ParseEnvFile for a non existent file -func TestParseEnvFileNonExistentFile(t *testing.T) { - _, err := ParseEnvFile("foo_bar_baz") - if err == nil { - t.Fatal("ParseEnvFile succeeded; expected failure") - } - if _, ok := err.(*os.PathError); !ok { - t.Fatalf("Expected a PathError, got [%v]", err) - } -} - -// Test ParseEnvFile for a badly formatted file -func TestParseEnvFileBadlyFormattedFile(t *testing.T) { - content := `foo=bar - f =quux -` - - tmpFile := tmpFileWithContent(content, t) - defer os.Remove(tmpFile) - - _, err := ParseEnvFile(tmpFile) - if err == nil { - t.Fatalf("Expected an ErrBadEnvVariable, got nothing") - } - if _, ok := err.(ErrBadEnvVariable); !ok { - t.Fatalf("Expected an ErrBadEnvVariable, got [%v]", err) - } - expectedMessage := "poorly formatted environment: variable 'f ' has white spaces" - if err.Error() != expectedMessage { - t.Fatalf("Expected [%v], got [%v]", expectedMessage, err.Error()) - } -} - -// Test ParseEnvFile for a file with a line exceeding bufio.MaxScanTokenSize -func TestParseEnvFileLineTooLongFile(t *testing.T) { - content := strings.Repeat("a", bufio.MaxScanTokenSize+42) - content = fmt.Sprint("foo=", content) - - tmpFile := tmpFileWithContent(content, t) - defer os.Remove(tmpFile) - - _, err := ParseEnvFile(tmpFile) - if err == nil { - t.Fatal("ParseEnvFile succeeded; expected failure") - } -} - -// ParseEnvFile with a random file, pass through -func TestParseEnvFileRandomFile(t *testing.T) { - content := `first line -another invalid line` - tmpFile := tmpFileWithContent(content, t) - defer os.Remove(tmpFile) - - _, err := ParseEnvFile(tmpFile) - - if err == nil { - t.Fatalf("Expected an ErrBadEnvVariable, got nothing") - } - if _, ok := err.(ErrBadEnvVariable); !ok { - t.Fatalf("Expected an ErrBadEnvvariable, got [%v]", err) - } - expectedMessage := "poorly formatted environment: variable 'first line' has white spaces" - if err.Error() != expectedMessage { - t.Fatalf("Expected [%v], got [%v]", expectedMessage, err.Error()) - } -} diff --git a/vendor/github.com/docker/docker/runconfig/opts/fixtures/utf16.env b/vendor/github.com/docker/docker/runconfig/opts/fixtures/utf16.env deleted file mode 100755 index 3a73358fffbc0d5d3d4df985ccf2f4a1a29cdb2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 ucmezW&yB$!2yGdh7#tab7 1 { - return val, nil - } - if !doesEnvExist(val) { - return val, nil - } - return fmt.Sprintf("%s=%s", val, os.Getenv(val)), nil -} - -func doesEnvExist(name string) bool { - for _, entry := range os.Environ() { - parts := strings.SplitN(entry, "=", 2) - if runtime.GOOS == "windows" { - // Environment variable are case-insensitive on Windows. PaTh, path and PATH are equivalent. - if strings.EqualFold(parts[0], name) { - return true - } - } - if parts[0] == name { - return true - } - } - return false -} - -// ValidateExtraHost validates that the specified string is a valid extrahost and returns it. -// ExtraHost is in the form of name:ip where the ip has to be a valid ip (IPv4 or IPv6). -func ValidateExtraHost(val string) (string, error) { - // allow for IPv6 addresses in extra hosts by only splitting on first ":" - arr := strings.SplitN(val, ":", 2) - if len(arr) != 2 || len(arr[0]) == 0 { - return "", fmt.Errorf("bad format for add-host: %q", val) - } - if _, err := fopts.ValidateIPAddress(arr[1]); err != nil { - return "", fmt.Errorf("invalid IP address in add-host: %q", arr[1]) - } - return val, nil -} - -// ValidateMACAddress validates a MAC address. -func ValidateMACAddress(val string) (string, error) { - _, err := net.ParseMAC(strings.TrimSpace(val)) - if err != nil { - return "", err - } - return val, nil -} diff --git a/vendor/github.com/docker/docker/runconfig/opts/opts_test.go b/vendor/github.com/docker/docker/runconfig/opts/opts_test.go deleted file mode 100644 index 43f8730fc..000000000 --- a/vendor/github.com/docker/docker/runconfig/opts/opts_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package opts - -import ( - "fmt" - "os" - "runtime" - "strings" - "testing" -) - -func TestValidateAttach(t *testing.T) { - valid := []string{ - "stdin", - "stdout", - "stderr", - "STDIN", - "STDOUT", - "STDERR", - } - if _, err := ValidateAttach("invalid"); err == nil { - t.Fatalf("Expected error with [valid streams are STDIN, STDOUT and STDERR], got nothing") - } - - for _, attach := range valid { - value, err := ValidateAttach(attach) - if err != nil { - t.Fatal(err) - } - if value != strings.ToLower(attach) { - t.Fatalf("Expected [%v], got [%v]", attach, value) - } - } -} - -func TestValidateEnv(t *testing.T) { - valids := map[string]string{ - "a": "a", - "something": "something", - "_=a": "_=a", - "env1=value1": "env1=value1", - "_env1=value1": "_env1=value1", - "env2=value2=value3": "env2=value2=value3", - "env3=abc!qwe": "env3=abc!qwe", - "env_4=value 4": "env_4=value 4", - "PATH": fmt.Sprintf("PATH=%v", os.Getenv("PATH")), - "PATH=something": "PATH=something", - "asd!qwe": "asd!qwe", - "1asd": "1asd", - "123": "123", - "some space": "some space", - " some space before": " some space before", - "some space after ": "some space after ", - } - // Environment variables are case in-sensitive on Windows - if runtime.GOOS == "windows" { - valids["PaTh"] = fmt.Sprintf("PaTh=%v", os.Getenv("PATH")) - } - for value, expected := range valids { - actual, err := ValidateEnv(value) - if err != nil { - t.Fatal(err) - } - if actual != expected { - t.Fatalf("Expected [%v], got [%v]", expected, actual) - } - } -} - -func TestValidateExtraHosts(t *testing.T) { - valid := []string{ - `myhost:192.168.0.1`, - `thathost:10.0.2.1`, - `anipv6host:2003:ab34:e::1`, - `ipv6local:::1`, - } - - invalid := map[string]string{ - `myhost:192.notanipaddress.1`: `invalid IP`, - `thathost-nosemicolon10.0.0.1`: `bad format`, - `anipv6host:::::1`: `invalid IP`, - `ipv6local:::0::`: `invalid IP`, - } - - for _, extrahost := range valid { - if _, err := ValidateExtraHost(extrahost); err != nil { - t.Fatalf("ValidateExtraHost(`"+extrahost+"`) should succeed: error %v", err) - } - } - - for extraHost, expectedError := range invalid { - if _, err := ValidateExtraHost(extraHost); err == nil { - t.Fatalf("ValidateExtraHost(`%q`) should have failed validation", extraHost) - } else { - if !strings.Contains(err.Error(), expectedError) { - t.Fatalf("ValidateExtraHost(`%q`) error should contain %q", extraHost, expectedError) - } - } - } -} - -func TestValidateMACAddress(t *testing.T) { - if _, err := ValidateMACAddress(`92:d0:c6:0a:29:33`); err != nil { - t.Fatalf("ValidateMACAddress(`92:d0:c6:0a:29:33`) got %s", err) - } - - if _, err := ValidateMACAddress(`92:d0:c6:0a:33`); err == nil { - t.Fatalf("ValidateMACAddress(`92:d0:c6:0a:33`) succeeded; expected failure on invalid MAC") - } - - if _, err := ValidateMACAddress(`random invalid string`); err == nil { - t.Fatalf("ValidateMACAddress(`random invalid string`) succeeded; expected failure on invalid MAC") - } -} diff --git a/vendor/github.com/docker/docker/runconfig/opts/parse.go b/vendor/github.com/docker/docker/runconfig/opts/parse.go deleted file mode 100644 index 71a89277e..000000000 --- a/vendor/github.com/docker/docker/runconfig/opts/parse.go +++ /dev/null @@ -1,995 +0,0 @@ -package opts - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "path" - "strconv" - "strings" - "time" - - "github.com/docker/docker/api/types/container" - networktypes "github.com/docker/docker/api/types/network" - "github.com/docker/docker/api/types/strslice" - "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/signal" - "github.com/docker/go-connections/nat" - units "github.com/docker/go-units" - "github.com/spf13/pflag" -) - -// ContainerOptions is a data object with all the options for creating a container -type ContainerOptions struct { - attach opts.ListOpts - volumes opts.ListOpts - tmpfs opts.ListOpts - blkioWeightDevice WeightdeviceOpt - deviceReadBps ThrottledeviceOpt - deviceWriteBps ThrottledeviceOpt - links opts.ListOpts - aliases opts.ListOpts - linkLocalIPs opts.ListOpts - deviceReadIOps ThrottledeviceOpt - deviceWriteIOps ThrottledeviceOpt - env opts.ListOpts - labels opts.ListOpts - devices opts.ListOpts - ulimits *UlimitOpt - sysctls *opts.MapOpts - publish opts.ListOpts - expose opts.ListOpts - dns opts.ListOpts - dnsSearch opts.ListOpts - dnsOptions opts.ListOpts - extraHosts opts.ListOpts - volumesFrom opts.ListOpts - envFile opts.ListOpts - capAdd opts.ListOpts - capDrop opts.ListOpts - groupAdd opts.ListOpts - securityOpt opts.ListOpts - storageOpt opts.ListOpts - labelsFile opts.ListOpts - loggingOpts opts.ListOpts - privileged bool - pidMode string - utsMode string - usernsMode string - publishAll bool - stdin bool - tty bool - oomKillDisable bool - oomScoreAdj int - containerIDFile string - entrypoint string - hostname string - memoryString string - memoryReservation string - memorySwap string - kernelMemory string - user string - workingDir string - cpuCount int64 - cpuShares int64 - cpuPercent int64 - cpuPeriod int64 - cpuRealtimePeriod int64 - cpuRealtimeRuntime int64 - cpuQuota int64 - cpus opts.NanoCPUs - cpusetCpus string - cpusetMems string - blkioWeight uint16 - ioMaxBandwidth string - ioMaxIOps uint64 - swappiness int64 - netMode string - macAddress string - ipv4Address string - ipv6Address string - ipcMode string - pidsLimit int64 - restartPolicy string - readonlyRootfs bool - loggingDriver string - cgroupParent string - volumeDriver string - stopSignal string - stopTimeout int - isolation string - shmSize string - noHealthcheck bool - healthCmd string - healthInterval time.Duration - healthTimeout time.Duration - healthRetries int - runtime string - autoRemove bool - init bool - initPath string - credentialSpec string - - Image string - Args []string -} - -// AddFlags adds all command line flags that will be used by Parse to the FlagSet -func AddFlags(flags *pflag.FlagSet) *ContainerOptions { - copts := &ContainerOptions{ - aliases: opts.NewListOpts(nil), - attach: opts.NewListOpts(ValidateAttach), - blkioWeightDevice: NewWeightdeviceOpt(ValidateWeightDevice), - capAdd: opts.NewListOpts(nil), - capDrop: opts.NewListOpts(nil), - dns: opts.NewListOpts(opts.ValidateIPAddress), - dnsOptions: opts.NewListOpts(nil), - dnsSearch: opts.NewListOpts(opts.ValidateDNSSearch), - deviceReadBps: NewThrottledeviceOpt(ValidateThrottleBpsDevice), - deviceReadIOps: NewThrottledeviceOpt(ValidateThrottleIOpsDevice), - deviceWriteBps: NewThrottledeviceOpt(ValidateThrottleBpsDevice), - deviceWriteIOps: NewThrottledeviceOpt(ValidateThrottleIOpsDevice), - devices: opts.NewListOpts(ValidateDevice), - env: opts.NewListOpts(ValidateEnv), - envFile: opts.NewListOpts(nil), - expose: opts.NewListOpts(nil), - extraHosts: opts.NewListOpts(ValidateExtraHost), - groupAdd: opts.NewListOpts(nil), - labels: opts.NewListOpts(ValidateEnv), - labelsFile: opts.NewListOpts(nil), - linkLocalIPs: opts.NewListOpts(nil), - links: opts.NewListOpts(ValidateLink), - loggingOpts: opts.NewListOpts(nil), - publish: opts.NewListOpts(nil), - securityOpt: opts.NewListOpts(nil), - storageOpt: opts.NewListOpts(nil), - sysctls: opts.NewMapOpts(nil, opts.ValidateSysctl), - tmpfs: opts.NewListOpts(nil), - ulimits: NewUlimitOpt(nil), - volumes: opts.NewListOpts(nil), - volumesFrom: opts.NewListOpts(nil), - } - - // General purpose flags - flags.VarP(&copts.attach, "attach", "a", "Attach to STDIN, STDOUT or STDERR") - flags.Var(&copts.devices, "device", "Add a host device to the container") - flags.VarP(&copts.env, "env", "e", "Set environment variables") - flags.Var(&copts.envFile, "env-file", "Read in a file of environment variables") - flags.StringVar(&copts.entrypoint, "entrypoint", "", "Overwrite the default ENTRYPOINT of the image") - flags.Var(&copts.groupAdd, "group-add", "Add additional groups to join") - flags.StringVarP(&copts.hostname, "hostname", "h", "", "Container host name") - flags.BoolVarP(&copts.stdin, "interactive", "i", false, "Keep STDIN open even if not attached") - flags.VarP(&copts.labels, "label", "l", "Set meta data on a container") - flags.Var(&copts.labelsFile, "label-file", "Read in a line delimited file of labels") - flags.BoolVar(&copts.readonlyRootfs, "read-only", false, "Mount the container's root filesystem as read only") - flags.StringVar(&copts.restartPolicy, "restart", "no", "Restart policy to apply when a container exits") - flags.StringVar(&copts.stopSignal, "stop-signal", signal.DefaultStopSignal, fmt.Sprintf("Signal to stop a container, %v by default", signal.DefaultStopSignal)) - flags.IntVar(&copts.stopTimeout, "stop-timeout", 0, "Timeout (in seconds) to stop a container") - flags.SetAnnotation("stop-timeout", "version", []string{"1.25"}) - flags.Var(copts.sysctls, "sysctl", "Sysctl options") - flags.BoolVarP(&copts.tty, "tty", "t", false, "Allocate a pseudo-TTY") - flags.Var(copts.ulimits, "ulimit", "Ulimit options") - flags.StringVarP(&copts.user, "user", "u", "", "Username or UID (format: [:])") - flags.StringVarP(&copts.workingDir, "workdir", "w", "", "Working directory inside the container") - flags.BoolVar(&copts.autoRemove, "rm", false, "Automatically remove the container when it exits") - - // Security - flags.Var(&copts.capAdd, "cap-add", "Add Linux capabilities") - flags.Var(&copts.capDrop, "cap-drop", "Drop Linux capabilities") - flags.BoolVar(&copts.privileged, "privileged", false, "Give extended privileges to this container") - flags.Var(&copts.securityOpt, "security-opt", "Security Options") - flags.StringVar(&copts.usernsMode, "userns", "", "User namespace to use") - flags.StringVar(&copts.credentialSpec, "credentialspec", "", "Credential spec for managed service account (Windows only)") - - // Network and port publishing flag - flags.Var(&copts.extraHosts, "add-host", "Add a custom host-to-IP mapping (host:ip)") - flags.Var(&copts.dns, "dns", "Set custom DNS servers") - // We allow for both "--dns-opt" and "--dns-option", although the latter is the recommended way. - // This is to be consistent with service create/update - flags.Var(&copts.dnsOptions, "dns-opt", "Set DNS options") - flags.Var(&copts.dnsOptions, "dns-option", "Set DNS options") - flags.MarkHidden("dns-opt") - flags.Var(&copts.dnsSearch, "dns-search", "Set custom DNS search domains") - flags.Var(&copts.expose, "expose", "Expose a port or a range of ports") - flags.StringVar(&copts.ipv4Address, "ip", "", "Container IPv4 address (e.g. 172.30.100.104)") - flags.StringVar(&copts.ipv6Address, "ip6", "", "Container IPv6 address (e.g. 2001:db8::33)") - flags.Var(&copts.links, "link", "Add link to another container") - flags.Var(&copts.linkLocalIPs, "link-local-ip", "Container IPv4/IPv6 link-local addresses") - flags.StringVar(&copts.macAddress, "mac-address", "", "Container MAC address (e.g. 92:d0:c6:0a:29:33)") - flags.VarP(&copts.publish, "publish", "p", "Publish a container's port(s) to the host") - flags.BoolVarP(&copts.publishAll, "publish-all", "P", false, "Publish all exposed ports to random ports") - // We allow for both "--net" and "--network", although the latter is the recommended way. - flags.StringVar(&copts.netMode, "net", "default", "Connect a container to a network") - flags.StringVar(&copts.netMode, "network", "default", "Connect a container to a network") - flags.MarkHidden("net") - // We allow for both "--net-alias" and "--network-alias", although the latter is the recommended way. - flags.Var(&copts.aliases, "net-alias", "Add network-scoped alias for the container") - flags.Var(&copts.aliases, "network-alias", "Add network-scoped alias for the container") - flags.MarkHidden("net-alias") - - // Logging and storage - flags.StringVar(&copts.loggingDriver, "log-driver", "", "Logging driver for the container") - flags.StringVar(&copts.volumeDriver, "volume-driver", "", "Optional volume driver for the container") - flags.Var(&copts.loggingOpts, "log-opt", "Log driver options") - flags.Var(&copts.storageOpt, "storage-opt", "Storage driver options for the container") - flags.Var(&copts.tmpfs, "tmpfs", "Mount a tmpfs directory") - flags.Var(&copts.volumesFrom, "volumes-from", "Mount volumes from the specified container(s)") - flags.VarP(&copts.volumes, "volume", "v", "Bind mount a volume") - - // Health-checking - flags.StringVar(&copts.healthCmd, "health-cmd", "", "Command to run to check health") - flags.DurationVar(&copts.healthInterval, "health-interval", 0, "Time between running the check (ns|us|ms|s|m|h) (default 0s)") - flags.IntVar(&copts.healthRetries, "health-retries", 0, "Consecutive failures needed to report unhealthy") - flags.DurationVar(&copts.healthTimeout, "health-timeout", 0, "Maximum time to allow one check to run (ns|us|ms|s|m|h) (default 0s)") - flags.BoolVar(&copts.noHealthcheck, "no-healthcheck", false, "Disable any container-specified HEALTHCHECK") - - // Resource management - flags.Uint16Var(&copts.blkioWeight, "blkio-weight", 0, "Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)") - flags.Var(&copts.blkioWeightDevice, "blkio-weight-device", "Block IO weight (relative device weight)") - flags.StringVar(&copts.containerIDFile, "cidfile", "", "Write the container ID to the file") - flags.StringVar(&copts.cpusetCpus, "cpuset-cpus", "", "CPUs in which to allow execution (0-3, 0,1)") - flags.StringVar(&copts.cpusetMems, "cpuset-mems", "", "MEMs in which to allow execution (0-3, 0,1)") - flags.Int64Var(&copts.cpuCount, "cpu-count", 0, "CPU count (Windows only)") - flags.Int64Var(&copts.cpuPercent, "cpu-percent", 0, "CPU percent (Windows only)") - flags.Int64Var(&copts.cpuPeriod, "cpu-period", 0, "Limit CPU CFS (Completely Fair Scheduler) period") - flags.Int64Var(&copts.cpuQuota, "cpu-quota", 0, "Limit CPU CFS (Completely Fair Scheduler) quota") - flags.Int64Var(&copts.cpuRealtimePeriod, "cpu-rt-period", 0, "Limit CPU real-time period in microseconds") - flags.Int64Var(&copts.cpuRealtimeRuntime, "cpu-rt-runtime", 0, "Limit CPU real-time runtime in microseconds") - flags.Int64VarP(&copts.cpuShares, "cpu-shares", "c", 0, "CPU shares (relative weight)") - flags.Var(&copts.cpus, "cpus", "Number of CPUs") - flags.Var(&copts.deviceReadBps, "device-read-bps", "Limit read rate (bytes per second) from a device") - flags.Var(&copts.deviceReadIOps, "device-read-iops", "Limit read rate (IO per second) from a device") - flags.Var(&copts.deviceWriteBps, "device-write-bps", "Limit write rate (bytes per second) to a device") - flags.Var(&copts.deviceWriteIOps, "device-write-iops", "Limit write rate (IO per second) to a device") - flags.StringVar(&copts.ioMaxBandwidth, "io-maxbandwidth", "", "Maximum IO bandwidth limit for the system drive (Windows only)") - flags.Uint64Var(&copts.ioMaxIOps, "io-maxiops", 0, "Maximum IOps limit for the system drive (Windows only)") - flags.StringVar(&copts.kernelMemory, "kernel-memory", "", "Kernel memory limit") - flags.StringVarP(&copts.memoryString, "memory", "m", "", "Memory limit") - flags.StringVar(&copts.memoryReservation, "memory-reservation", "", "Memory soft limit") - flags.StringVar(&copts.memorySwap, "memory-swap", "", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap") - flags.Int64Var(&copts.swappiness, "memory-swappiness", -1, "Tune container memory swappiness (0 to 100)") - flags.BoolVar(&copts.oomKillDisable, "oom-kill-disable", false, "Disable OOM Killer") - flags.IntVar(&copts.oomScoreAdj, "oom-score-adj", 0, "Tune host's OOM preferences (-1000 to 1000)") - flags.Int64Var(&copts.pidsLimit, "pids-limit", 0, "Tune container pids limit (set -1 for unlimited)") - - // Low-level execution (cgroups, namespaces, ...) - flags.StringVar(&copts.cgroupParent, "cgroup-parent", "", "Optional parent cgroup for the container") - flags.StringVar(&copts.ipcMode, "ipc", "", "IPC namespace to use") - flags.StringVar(&copts.isolation, "isolation", "", "Container isolation technology") - flags.StringVar(&copts.pidMode, "pid", "", "PID namespace to use") - flags.StringVar(&copts.shmSize, "shm-size", "", "Size of /dev/shm, default value is 64MB") - flags.StringVar(&copts.utsMode, "uts", "", "UTS namespace to use") - flags.StringVar(&copts.runtime, "runtime", "", "Runtime to use for this container") - - flags.BoolVar(&copts.init, "init", false, "Run an init inside the container that forwards signals and reaps processes") - flags.StringVar(&copts.initPath, "init-path", "", "Path to the docker-init binary") - return copts -} - -// Parse parses the args for the specified command and generates a Config, -// a HostConfig and returns them with the specified command. -// If the specified args are not valid, it will return an error. -func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *container.HostConfig, *networktypes.NetworkingConfig, error) { - var ( - attachStdin = copts.attach.Get("stdin") - attachStdout = copts.attach.Get("stdout") - attachStderr = copts.attach.Get("stderr") - ) - - // Validate the input mac address - if copts.macAddress != "" { - if _, err := ValidateMACAddress(copts.macAddress); err != nil { - return nil, nil, nil, fmt.Errorf("%s is not a valid mac address", copts.macAddress) - } - } - if copts.stdin { - attachStdin = true - } - // If -a is not set, attach to stdout and stderr - if copts.attach.Len() == 0 { - attachStdout = true - attachStderr = true - } - - var err error - - var memory int64 - if copts.memoryString != "" { - memory, err = units.RAMInBytes(copts.memoryString) - if err != nil { - return nil, nil, nil, err - } - } - - var memoryReservation int64 - if copts.memoryReservation != "" { - memoryReservation, err = units.RAMInBytes(copts.memoryReservation) - if err != nil { - return nil, nil, nil, err - } - } - - var memorySwap int64 - if copts.memorySwap != "" { - if copts.memorySwap == "-1" { - memorySwap = -1 - } else { - memorySwap, err = units.RAMInBytes(copts.memorySwap) - if err != nil { - return nil, nil, nil, err - } - } - } - - var kernelMemory int64 - if copts.kernelMemory != "" { - kernelMemory, err = units.RAMInBytes(copts.kernelMemory) - if err != nil { - return nil, nil, nil, err - } - } - - swappiness := copts.swappiness - if swappiness != -1 && (swappiness < 0 || swappiness > 100) { - return nil, nil, nil, fmt.Errorf("invalid value: %d. Valid memory swappiness range is 0-100", swappiness) - } - - var shmSize int64 - if copts.shmSize != "" { - shmSize, err = units.RAMInBytes(copts.shmSize) - if err != nil { - return nil, nil, nil, err - } - } - - // TODO FIXME units.RAMInBytes should have a uint64 version - var maxIOBandwidth int64 - if copts.ioMaxBandwidth != "" { - maxIOBandwidth, err = units.RAMInBytes(copts.ioMaxBandwidth) - if err != nil { - return nil, nil, nil, err - } - if maxIOBandwidth < 0 { - return nil, nil, nil, fmt.Errorf("invalid value: %s. Maximum IO Bandwidth must be positive", copts.ioMaxBandwidth) - } - } - - var binds []string - volumes := copts.volumes.GetMap() - // add any bind targets to the list of container volumes - for bind := range copts.volumes.GetMap() { - if arr := volumeSplitN(bind, 2); len(arr) > 1 { - // after creating the bind mount we want to delete it from the copts.volumes values because - // we do not want bind mounts being committed to image configs - binds = append(binds, bind) - // We should delete from the map (`volumes`) here, as deleting from copts.volumes will not work if - // there are duplicates entries. - delete(volumes, bind) - } - } - - // Can't evaluate options passed into --tmpfs until we actually mount - tmpfs := make(map[string]string) - for _, t := range copts.tmpfs.GetAll() { - if arr := strings.SplitN(t, ":", 2); len(arr) > 1 { - tmpfs[arr[0]] = arr[1] - } else { - tmpfs[arr[0]] = "" - } - } - - var ( - runCmd strslice.StrSlice - entrypoint strslice.StrSlice - ) - - if len(copts.Args) > 0 { - runCmd = strslice.StrSlice(copts.Args) - } - - if copts.entrypoint != "" { - entrypoint = strslice.StrSlice{copts.entrypoint} - } else if flags.Changed("entrypoint") { - // if `--entrypoint=` is parsed then Entrypoint is reset - entrypoint = []string{""} - } - - ports, portBindings, err := nat.ParsePortSpecs(copts.publish.GetAll()) - if err != nil { - return nil, nil, nil, err - } - - // Merge in exposed ports to the map of published ports - for _, e := range copts.expose.GetAll() { - if strings.Contains(e, ":") { - return nil, nil, nil, fmt.Errorf("invalid port format for --expose: %s", e) - } - //support two formats for expose, original format /[] or /[] - proto, port := nat.SplitProtoPort(e) - //parse the start and end port and create a sequence of ports to expose - //if expose a port, the start and end port are the same - start, end, err := nat.ParsePortRange(port) - if err != nil { - return nil, nil, nil, fmt.Errorf("invalid range format for --expose: %s, error: %s", e, err) - } - for i := start; i <= end; i++ { - p, err := nat.NewPort(proto, strconv.FormatUint(i, 10)) - if err != nil { - return nil, nil, nil, err - } - if _, exists := ports[p]; !exists { - ports[p] = struct{}{} - } - } - } - - // parse device mappings - deviceMappings := []container.DeviceMapping{} - for _, device := range copts.devices.GetAll() { - deviceMapping, err := ParseDevice(device) - if err != nil { - return nil, nil, nil, err - } - deviceMappings = append(deviceMappings, deviceMapping) - } - - // collect all the environment variables for the container - envVariables, err := ReadKVStrings(copts.envFile.GetAll(), copts.env.GetAll()) - if err != nil { - return nil, nil, nil, err - } - - // collect all the labels for the container - labels, err := ReadKVStrings(copts.labelsFile.GetAll(), copts.labels.GetAll()) - if err != nil { - return nil, nil, nil, err - } - - ipcMode := container.IpcMode(copts.ipcMode) - if !ipcMode.Valid() { - return nil, nil, nil, fmt.Errorf("--ipc: invalid IPC mode") - } - - pidMode := container.PidMode(copts.pidMode) - if !pidMode.Valid() { - return nil, nil, nil, fmt.Errorf("--pid: invalid PID mode") - } - - utsMode := container.UTSMode(copts.utsMode) - if !utsMode.Valid() { - return nil, nil, nil, fmt.Errorf("--uts: invalid UTS mode") - } - - usernsMode := container.UsernsMode(copts.usernsMode) - if !usernsMode.Valid() { - return nil, nil, nil, fmt.Errorf("--userns: invalid USER mode") - } - - restartPolicy, err := ParseRestartPolicy(copts.restartPolicy) - if err != nil { - return nil, nil, nil, err - } - - loggingOpts, err := parseLoggingOpts(copts.loggingDriver, copts.loggingOpts.GetAll()) - if err != nil { - return nil, nil, nil, err - } - - securityOpts, err := parseSecurityOpts(copts.securityOpt.GetAll()) - if err != nil { - return nil, nil, nil, err - } - - storageOpts, err := parseStorageOpts(copts.storageOpt.GetAll()) - if err != nil { - return nil, nil, nil, err - } - - // Healthcheck - var healthConfig *container.HealthConfig - haveHealthSettings := copts.healthCmd != "" || - copts.healthInterval != 0 || - copts.healthTimeout != 0 || - copts.healthRetries != 0 - if copts.noHealthcheck { - if haveHealthSettings { - return nil, nil, nil, fmt.Errorf("--no-healthcheck conflicts with --health-* options") - } - test := strslice.StrSlice{"NONE"} - healthConfig = &container.HealthConfig{Test: test} - } else if haveHealthSettings { - var probe strslice.StrSlice - if copts.healthCmd != "" { - args := []string{"CMD-SHELL", copts.healthCmd} - probe = strslice.StrSlice(args) - } - if copts.healthInterval < 0 { - return nil, nil, nil, fmt.Errorf("--health-interval cannot be negative") - } - if copts.healthTimeout < 0 { - return nil, nil, nil, fmt.Errorf("--health-timeout cannot be negative") - } - - healthConfig = &container.HealthConfig{ - Test: probe, - Interval: copts.healthInterval, - Timeout: copts.healthTimeout, - Retries: copts.healthRetries, - } - } - - resources := container.Resources{ - CgroupParent: copts.cgroupParent, - Memory: memory, - MemoryReservation: memoryReservation, - MemorySwap: memorySwap, - MemorySwappiness: &copts.swappiness, - KernelMemory: kernelMemory, - OomKillDisable: &copts.oomKillDisable, - NanoCPUs: copts.cpus.Value(), - CPUCount: copts.cpuCount, - CPUPercent: copts.cpuPercent, - CPUShares: copts.cpuShares, - CPUPeriod: copts.cpuPeriod, - CpusetCpus: copts.cpusetCpus, - CpusetMems: copts.cpusetMems, - CPUQuota: copts.cpuQuota, - CPURealtimePeriod: copts.cpuRealtimePeriod, - CPURealtimeRuntime: copts.cpuRealtimeRuntime, - PidsLimit: copts.pidsLimit, - BlkioWeight: copts.blkioWeight, - BlkioWeightDevice: copts.blkioWeightDevice.GetList(), - BlkioDeviceReadBps: copts.deviceReadBps.GetList(), - BlkioDeviceWriteBps: copts.deviceWriteBps.GetList(), - BlkioDeviceReadIOps: copts.deviceReadIOps.GetList(), - BlkioDeviceWriteIOps: copts.deviceWriteIOps.GetList(), - IOMaximumIOps: copts.ioMaxIOps, - IOMaximumBandwidth: uint64(maxIOBandwidth), - Ulimits: copts.ulimits.GetList(), - Devices: deviceMappings, - } - - config := &container.Config{ - Hostname: copts.hostname, - ExposedPorts: ports, - User: copts.user, - Tty: copts.tty, - // TODO: deprecated, it comes from -n, --networking - // it's still needed internally to set the network to disabled - // if e.g. bridge is none in daemon opts, and in inspect - NetworkDisabled: false, - OpenStdin: copts.stdin, - AttachStdin: attachStdin, - AttachStdout: attachStdout, - AttachStderr: attachStderr, - Env: envVariables, - Cmd: runCmd, - Image: copts.Image, - Volumes: volumes, - MacAddress: copts.macAddress, - Entrypoint: entrypoint, - WorkingDir: copts.workingDir, - Labels: ConvertKVStringsToMap(labels), - Healthcheck: healthConfig, - } - if flags.Changed("stop-signal") { - config.StopSignal = copts.stopSignal - } - if flags.Changed("stop-timeout") { - config.StopTimeout = &copts.stopTimeout - } - - hostConfig := &container.HostConfig{ - Binds: binds, - ContainerIDFile: copts.containerIDFile, - OomScoreAdj: copts.oomScoreAdj, - AutoRemove: copts.autoRemove, - Privileged: copts.privileged, - PortBindings: portBindings, - Links: copts.links.GetAll(), - PublishAllPorts: copts.publishAll, - // Make sure the dns fields are never nil. - // New containers don't ever have those fields nil, - // but pre created containers can still have those nil values. - // See https://github.com/docker/docker/pull/17779 - // for a more detailed explanation on why we don't want that. - DNS: copts.dns.GetAllOrEmpty(), - DNSSearch: copts.dnsSearch.GetAllOrEmpty(), - DNSOptions: copts.dnsOptions.GetAllOrEmpty(), - ExtraHosts: copts.extraHosts.GetAll(), - VolumesFrom: copts.volumesFrom.GetAll(), - NetworkMode: container.NetworkMode(copts.netMode), - IpcMode: ipcMode, - PidMode: pidMode, - UTSMode: utsMode, - UsernsMode: usernsMode, - CapAdd: strslice.StrSlice(copts.capAdd.GetAll()), - CapDrop: strslice.StrSlice(copts.capDrop.GetAll()), - GroupAdd: copts.groupAdd.GetAll(), - RestartPolicy: restartPolicy, - SecurityOpt: securityOpts, - StorageOpt: storageOpts, - ReadonlyRootfs: copts.readonlyRootfs, - LogConfig: container.LogConfig{Type: copts.loggingDriver, Config: loggingOpts}, - VolumeDriver: copts.volumeDriver, - Isolation: container.Isolation(copts.isolation), - ShmSize: shmSize, - Resources: resources, - Tmpfs: tmpfs, - Sysctls: copts.sysctls.GetAll(), - Runtime: copts.runtime, - } - - // only set this value if the user provided the flag, else it should default to nil - if flags.Changed("init") { - hostConfig.Init = &copts.init - } - - // When allocating stdin in attached mode, close stdin at client disconnect - if config.OpenStdin && config.AttachStdin { - config.StdinOnce = true - } - - networkingConfig := &networktypes.NetworkingConfig{ - EndpointsConfig: make(map[string]*networktypes.EndpointSettings), - } - - if copts.ipv4Address != "" || copts.ipv6Address != "" || copts.linkLocalIPs.Len() > 0 { - epConfig := &networktypes.EndpointSettings{} - networkingConfig.EndpointsConfig[string(hostConfig.NetworkMode)] = epConfig - - epConfig.IPAMConfig = &networktypes.EndpointIPAMConfig{ - IPv4Address: copts.ipv4Address, - IPv6Address: copts.ipv6Address, - } - - if copts.linkLocalIPs.Len() > 0 { - epConfig.IPAMConfig.LinkLocalIPs = make([]string, copts.linkLocalIPs.Len()) - copy(epConfig.IPAMConfig.LinkLocalIPs, copts.linkLocalIPs.GetAll()) - } - } - - if hostConfig.NetworkMode.IsUserDefined() && len(hostConfig.Links) > 0 { - epConfig := networkingConfig.EndpointsConfig[string(hostConfig.NetworkMode)] - if epConfig == nil { - epConfig = &networktypes.EndpointSettings{} - } - epConfig.Links = make([]string, len(hostConfig.Links)) - copy(epConfig.Links, hostConfig.Links) - networkingConfig.EndpointsConfig[string(hostConfig.NetworkMode)] = epConfig - } - - if copts.aliases.Len() > 0 { - epConfig := networkingConfig.EndpointsConfig[string(hostConfig.NetworkMode)] - if epConfig == nil { - epConfig = &networktypes.EndpointSettings{} - } - epConfig.Aliases = make([]string, copts.aliases.Len()) - copy(epConfig.Aliases, copts.aliases.GetAll()) - networkingConfig.EndpointsConfig[string(hostConfig.NetworkMode)] = epConfig - } - - return config, hostConfig, networkingConfig, nil -} - -// ReadKVStrings reads a file of line terminated key=value pairs, and overrides any keys -// present in the file with additional pairs specified in the override parameter -func ReadKVStrings(files []string, override []string) ([]string, error) { - envVariables := []string{} - for _, ef := range files { - parsedVars, err := ParseEnvFile(ef) - if err != nil { - return nil, err - } - envVariables = append(envVariables, parsedVars...) - } - // parse the '-e' and '--env' after, to allow override - envVariables = append(envVariables, override...) - - return envVariables, nil -} - -// ConvertKVStringsToMap converts ["key=value"] to {"key":"value"} -func ConvertKVStringsToMap(values []string) map[string]string { - result := make(map[string]string, len(values)) - for _, value := range values { - kv := strings.SplitN(value, "=", 2) - if len(kv) == 1 { - result[kv[0]] = "" - } else { - result[kv[0]] = kv[1] - } - } - - return result -} - -// ConvertKVStringsToMapWithNil converts ["key=value"] to {"key":"value"} -// but set unset keys to nil - meaning the ones with no "=" in them. -// We use this in cases where we need to distinguish between -// FOO= and FOO -// where the latter case just means FOO was mentioned but not given a value -func ConvertKVStringsToMapWithNil(values []string) map[string]*string { - result := make(map[string]*string, len(values)) - for _, value := range values { - kv := strings.SplitN(value, "=", 2) - if len(kv) == 1 { - result[kv[0]] = nil - } else { - result[kv[0]] = &kv[1] - } - } - - return result -} - -func parseLoggingOpts(loggingDriver string, loggingOpts []string) (map[string]string, error) { - loggingOptsMap := ConvertKVStringsToMap(loggingOpts) - if loggingDriver == "none" && len(loggingOpts) > 0 { - return map[string]string{}, fmt.Errorf("invalid logging opts for driver %s", loggingDriver) - } - return loggingOptsMap, nil -} - -// takes a local seccomp daemon, reads the file contents for sending to the daemon -func parseSecurityOpts(securityOpts []string) ([]string, error) { - for key, opt := range securityOpts { - con := strings.SplitN(opt, "=", 2) - if len(con) == 1 && con[0] != "no-new-privileges" { - if strings.Contains(opt, ":") { - con = strings.SplitN(opt, ":", 2) - } else { - return securityOpts, fmt.Errorf("Invalid --security-opt: %q", opt) - } - } - if con[0] == "seccomp" && con[1] != "unconfined" { - f, err := ioutil.ReadFile(con[1]) - if err != nil { - return securityOpts, fmt.Errorf("opening seccomp profile (%s) failed: %v", con[1], err) - } - b := bytes.NewBuffer(nil) - if err := json.Compact(b, f); err != nil { - return securityOpts, fmt.Errorf("compacting json for seccomp profile (%s) failed: %v", con[1], err) - } - securityOpts[key] = fmt.Sprintf("seccomp=%s", b.Bytes()) - } - } - - return securityOpts, nil -} - -// parses storage options per container into a map -func parseStorageOpts(storageOpts []string) (map[string]string, error) { - m := make(map[string]string) - for _, option := range storageOpts { - if strings.Contains(option, "=") { - opt := strings.SplitN(option, "=", 2) - m[opt[0]] = opt[1] - } else { - return nil, fmt.Errorf("invalid storage option") - } - } - return m, nil -} - -// ParseRestartPolicy returns the parsed policy or an error indicating what is incorrect -func ParseRestartPolicy(policy string) (container.RestartPolicy, error) { - p := container.RestartPolicy{} - - if policy == "" { - return p, nil - } - - parts := strings.Split(policy, ":") - - if len(parts) > 2 { - return p, fmt.Errorf("invalid restart policy format") - } - if len(parts) == 2 { - count, err := strconv.Atoi(parts[1]) - if err != nil { - return p, fmt.Errorf("maximum retry count must be an integer") - } - - p.MaximumRetryCount = count - } - - p.Name = parts[0] - - return p, nil -} - -// ParseDevice parses a device mapping string to a container.DeviceMapping struct -func ParseDevice(device string) (container.DeviceMapping, error) { - src := "" - dst := "" - permissions := "rwm" - arr := strings.Split(device, ":") - switch len(arr) { - case 3: - permissions = arr[2] - fallthrough - case 2: - if ValidDeviceMode(arr[1]) { - permissions = arr[1] - } else { - dst = arr[1] - } - fallthrough - case 1: - src = arr[0] - default: - return container.DeviceMapping{}, fmt.Errorf("invalid device specification: %s", device) - } - - if dst == "" { - dst = src - } - - deviceMapping := container.DeviceMapping{ - PathOnHost: src, - PathInContainer: dst, - CgroupPermissions: permissions, - } - return deviceMapping, nil -} - -// ParseLink parses and validates the specified string as a link format (name:alias) -func ParseLink(val string) (string, string, error) { - if val == "" { - return "", "", fmt.Errorf("empty string specified for links") - } - arr := strings.Split(val, ":") - if len(arr) > 2 { - return "", "", fmt.Errorf("bad format for links: %s", val) - } - if len(arr) == 1 { - return val, val, nil - } - // This is kept because we can actually get a HostConfig with links - // from an already created container and the format is not `foo:bar` - // but `/foo:/c1/bar` - if strings.HasPrefix(arr[0], "/") { - _, alias := path.Split(arr[1]) - return arr[0][1:], alias, nil - } - return arr[0], arr[1], nil -} - -// ValidateLink validates that the specified string has a valid link format (containerName:alias). -func ValidateLink(val string) (string, error) { - if _, _, err := ParseLink(val); err != nil { - return val, err - } - return val, nil -} - -// ValidDeviceMode checks if the mode for device is valid or not. -// Valid mode is a composition of r (read), w (write), and m (mknod). -func ValidDeviceMode(mode string) bool { - var legalDeviceMode = map[rune]bool{ - 'r': true, - 'w': true, - 'm': true, - } - if mode == "" { - return false - } - for _, c := range mode { - if !legalDeviceMode[c] { - return false - } - legalDeviceMode[c] = false - } - return true -} - -// ValidateDevice validates a path for devices -// It will make sure 'val' is in the form: -// [host-dir:]container-path[:mode] -// It also validates the device mode. -func ValidateDevice(val string) (string, error) { - return validatePath(val, ValidDeviceMode) -} - -func validatePath(val string, validator func(string) bool) (string, error) { - var containerPath string - var mode string - - if strings.Count(val, ":") > 2 { - return val, fmt.Errorf("bad format for path: %s", val) - } - - split := strings.SplitN(val, ":", 3) - if split[0] == "" { - return val, fmt.Errorf("bad format for path: %s", val) - } - switch len(split) { - case 1: - containerPath = split[0] - val = path.Clean(containerPath) - case 2: - if isValid := validator(split[1]); isValid { - containerPath = split[0] - mode = split[1] - val = fmt.Sprintf("%s:%s", path.Clean(containerPath), mode) - } else { - containerPath = split[1] - val = fmt.Sprintf("%s:%s", split[0], path.Clean(containerPath)) - } - case 3: - containerPath = split[1] - mode = split[2] - if isValid := validator(split[2]); !isValid { - return val, fmt.Errorf("bad mode specified: %s", mode) - } - val = fmt.Sprintf("%s:%s:%s", split[0], containerPath, mode) - } - - if !path.IsAbs(containerPath) { - return val, fmt.Errorf("%s is not an absolute path", containerPath) - } - return val, nil -} - -// volumeSplitN splits raw into a maximum of n parts, separated by a separator colon. -// A separator colon is the last `:` character in the regex `[:\\]?[a-zA-Z]:` (note `\\` is `\` escaped). -// In Windows driver letter appears in two situations: -// a. `^[a-zA-Z]:` (A colon followed by `^[a-zA-Z]:` is OK as colon is the separator in volume option) -// b. A string in the format like `\\?\C:\Windows\...` (UNC). -// Therefore, a driver letter can only follow either a `:` or `\\` -// This allows to correctly split strings such as `C:\foo:D:\:rw` or `/tmp/q:/foo`. -func volumeSplitN(raw string, n int) []string { - var array []string - if len(raw) == 0 || raw[0] == ':' { - // invalid - return nil - } - // numberOfParts counts the number of parts separated by a separator colon - numberOfParts := 0 - // left represents the left-most cursor in raw, updated at every `:` character considered as a separator. - left := 0 - // right represents the right-most cursor in raw incremented with the loop. Note this - // starts at index 1 as index 0 is already handle above as a special case. - for right := 1; right < len(raw); right++ { - // stop parsing if reached maximum number of parts - if n >= 0 && numberOfParts >= n { - break - } - if raw[right] != ':' { - continue - } - potentialDriveLetter := raw[right-1] - if (potentialDriveLetter >= 'A' && potentialDriveLetter <= 'Z') || (potentialDriveLetter >= 'a' && potentialDriveLetter <= 'z') { - if right > 1 { - beforePotentialDriveLetter := raw[right-2] - // Only `:` or `\\` are checked (`/` could fall into the case of `/tmp/q:/foo`) - if beforePotentialDriveLetter != ':' && beforePotentialDriveLetter != '\\' { - // e.g. `C:` is not preceded by any delimiter, therefore it was not a drive letter but a path ending with `C:`. - array = append(array, raw[left:right]) - left = right + 1 - numberOfParts++ - } - // else, `C:` is considered as a drive letter and not as a delimiter, so we continue parsing. - } - // if right == 1, then `C:` is the beginning of the raw string, therefore `:` is again not considered a delimiter and we continue parsing. - } else { - // if `:` is not preceded by a potential drive letter, then consider it as a delimiter. - array = append(array, raw[left:right]) - left = right + 1 - numberOfParts++ - } - } - // need to take care of the last part - if left < len(raw) { - if n >= 0 && numberOfParts >= n { - // if the maximum number of parts is reached, just append the rest to the last part - // left-1 is at the last `:` that needs to be included since not considered a separator. - array[n-1] += raw[left-1:] - } else { - array = append(array, raw[left:]) - } - } - return array -} diff --git a/vendor/github.com/docker/docker/runconfig/opts/parse_test.go b/vendor/github.com/docker/docker/runconfig/opts/parse_test.go deleted file mode 100644 index a1be379ae..000000000 --- a/vendor/github.com/docker/docker/runconfig/opts/parse_test.go +++ /dev/null @@ -1,894 +0,0 @@ -package opts - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "os" - "runtime" - "strings" - "testing" - "time" - - "github.com/docker/docker/api/types/container" - networktypes "github.com/docker/docker/api/types/network" - "github.com/docker/docker/runconfig" - "github.com/docker/go-connections/nat" - "github.com/spf13/pflag" -) - -func parseRun(args []string) (*container.Config, *container.HostConfig, *networktypes.NetworkingConfig, error) { - flags := pflag.NewFlagSet("run", pflag.ContinueOnError) - flags.SetOutput(ioutil.Discard) - flags.Usage = nil - copts := AddFlags(flags) - if err := flags.Parse(args); err != nil { - return nil, nil, nil, err - } - return Parse(flags, copts) -} - -func parse(t *testing.T, args string) (*container.Config, *container.HostConfig, error) { - config, hostConfig, _, err := parseRun(strings.Split(args+" ubuntu bash", " ")) - return config, hostConfig, err -} - -func mustParse(t *testing.T, args string) (*container.Config, *container.HostConfig) { - config, hostConfig, err := parse(t, args) - if err != nil { - t.Fatal(err) - } - return config, hostConfig -} - -func TestParseRunLinks(t *testing.T) { - if _, hostConfig := mustParse(t, "--link a:b"); len(hostConfig.Links) == 0 || hostConfig.Links[0] != "a:b" { - t.Fatalf("Error parsing links. Expected []string{\"a:b\"}, received: %v", hostConfig.Links) - } - if _, hostConfig := mustParse(t, "--link a:b --link c:d"); len(hostConfig.Links) < 2 || hostConfig.Links[0] != "a:b" || hostConfig.Links[1] != "c:d" { - t.Fatalf("Error parsing links. Expected []string{\"a:b\", \"c:d\"}, received: %v", hostConfig.Links) - } - if _, hostConfig := mustParse(t, ""); len(hostConfig.Links) != 0 { - t.Fatalf("Error parsing links. No link expected, received: %v", hostConfig.Links) - } -} - -func TestParseRunAttach(t *testing.T) { - if config, _ := mustParse(t, "-a stdin"); !config.AttachStdin || config.AttachStdout || config.AttachStderr { - t.Fatalf("Error parsing attach flags. Expect only Stdin enabled. Received: in: %v, out: %v, err: %v", config.AttachStdin, config.AttachStdout, config.AttachStderr) - } - if config, _ := mustParse(t, "-a stdin -a stdout"); !config.AttachStdin || !config.AttachStdout || config.AttachStderr { - t.Fatalf("Error parsing attach flags. Expect only Stdin and Stdout enabled. Received: in: %v, out: %v, err: %v", config.AttachStdin, config.AttachStdout, config.AttachStderr) - } - if config, _ := mustParse(t, "-a stdin -a stdout -a stderr"); !config.AttachStdin || !config.AttachStdout || !config.AttachStderr { - t.Fatalf("Error parsing attach flags. Expect all attach enabled. Received: in: %v, out: %v, err: %v", config.AttachStdin, config.AttachStdout, config.AttachStderr) - } - if config, _ := mustParse(t, ""); config.AttachStdin || !config.AttachStdout || !config.AttachStderr { - t.Fatalf("Error parsing attach flags. Expect Stdin disabled. Received: in: %v, out: %v, err: %v", config.AttachStdin, config.AttachStdout, config.AttachStderr) - } - if config, _ := mustParse(t, "-i"); !config.AttachStdin || !config.AttachStdout || !config.AttachStderr { - t.Fatalf("Error parsing attach flags. Expect Stdin enabled. Received: in: %v, out: %v, err: %v", config.AttachStdin, config.AttachStdout, config.AttachStderr) - } - - if _, _, err := parse(t, "-a"); err == nil { - t.Fatalf("Error parsing attach flags, `-a` should be an error but is not") - } - if _, _, err := parse(t, "-a invalid"); err == nil { - t.Fatalf("Error parsing attach flags, `-a invalid` should be an error but is not") - } - if _, _, err := parse(t, "-a invalid -a stdout"); err == nil { - t.Fatalf("Error parsing attach flags, `-a stdout -a invalid` should be an error but is not") - } - if _, _, err := parse(t, "-a stdout -a stderr -d"); err == nil { - t.Fatalf("Error parsing attach flags, `-a stdout -a stderr -d` should be an error but is not") - } - if _, _, err := parse(t, "-a stdin -d"); err == nil { - t.Fatalf("Error parsing attach flags, `-a stdin -d` should be an error but is not") - } - if _, _, err := parse(t, "-a stdout -d"); err == nil { - t.Fatalf("Error parsing attach flags, `-a stdout -d` should be an error but is not") - } - if _, _, err := parse(t, "-a stderr -d"); err == nil { - t.Fatalf("Error parsing attach flags, `-a stderr -d` should be an error but is not") - } - if _, _, err := parse(t, "-d --rm"); err == nil { - t.Fatalf("Error parsing attach flags, `-d --rm` should be an error but is not") - } -} - -func TestParseRunVolumes(t *testing.T) { - - // A single volume - arr, tryit := setupPlatformVolume([]string{`/tmp`}, []string{`c:\tmp`}) - if config, hostConfig := mustParse(t, tryit); hostConfig.Binds != nil { - t.Fatalf("Error parsing volume flags, %q should not mount-bind anything. Received %v", tryit, hostConfig.Binds) - } else if _, exists := config.Volumes[arr[0]]; !exists { - t.Fatalf("Error parsing volume flags, %q is missing from volumes. Received %v", tryit, config.Volumes) - } - - // Two volumes - arr, tryit = setupPlatformVolume([]string{`/tmp`, `/var`}, []string{`c:\tmp`, `c:\var`}) - if config, hostConfig := mustParse(t, tryit); hostConfig.Binds != nil { - t.Fatalf("Error parsing volume flags, %q should not mount-bind anything. Received %v", tryit, hostConfig.Binds) - } else if _, exists := config.Volumes[arr[0]]; !exists { - t.Fatalf("Error parsing volume flags, %s is missing from volumes. Received %v", arr[0], config.Volumes) - } else if _, exists := config.Volumes[arr[1]]; !exists { - t.Fatalf("Error parsing volume flags, %s is missing from volumes. Received %v", arr[1], config.Volumes) - } - - // A single bind-mount - arr, tryit = setupPlatformVolume([]string{`/hostTmp:/containerTmp`}, []string{os.Getenv("TEMP") + `:c:\containerTmp`}) - if config, hostConfig := mustParse(t, tryit); hostConfig.Binds == nil || hostConfig.Binds[0] != arr[0] { - t.Fatalf("Error parsing volume flags, %q should mount-bind the path before the colon into the path after the colon. Received %v %v", arr[0], hostConfig.Binds, config.Volumes) - } - - // Two bind-mounts. - arr, tryit = setupPlatformVolume([]string{`/hostTmp:/containerTmp`, `/hostVar:/containerVar`}, []string{os.Getenv("ProgramData") + `:c:\ContainerPD`, os.Getenv("TEMP") + `:c:\containerTmp`}) - if _, hostConfig := mustParse(t, tryit); hostConfig.Binds == nil || compareRandomizedStrings(hostConfig.Binds[0], hostConfig.Binds[1], arr[0], arr[1]) != nil { - t.Fatalf("Error parsing volume flags, `%s and %s` did not mount-bind correctly. Received %v", arr[0], arr[1], hostConfig.Binds) - } - - // Two bind-mounts, first read-only, second read-write. - // TODO Windows: The Windows version uses read-write as that's the only mode it supports. Can change this post TP4 - arr, tryit = setupPlatformVolume([]string{`/hostTmp:/containerTmp:ro`, `/hostVar:/containerVar:rw`}, []string{os.Getenv("TEMP") + `:c:\containerTmp:rw`, os.Getenv("ProgramData") + `:c:\ContainerPD:rw`}) - if _, hostConfig := mustParse(t, tryit); hostConfig.Binds == nil || compareRandomizedStrings(hostConfig.Binds[0], hostConfig.Binds[1], arr[0], arr[1]) != nil { - t.Fatalf("Error parsing volume flags, `%s and %s` did not mount-bind correctly. Received %v", arr[0], arr[1], hostConfig.Binds) - } - - // Similar to previous test but with alternate modes which are only supported by Linux - if runtime.GOOS != "windows" { - arr, tryit = setupPlatformVolume([]string{`/hostTmp:/containerTmp:ro,Z`, `/hostVar:/containerVar:rw,Z`}, []string{}) - if _, hostConfig := mustParse(t, tryit); hostConfig.Binds == nil || compareRandomizedStrings(hostConfig.Binds[0], hostConfig.Binds[1], arr[0], arr[1]) != nil { - t.Fatalf("Error parsing volume flags, `%s and %s` did not mount-bind correctly. Received %v", arr[0], arr[1], hostConfig.Binds) - } - - arr, tryit = setupPlatformVolume([]string{`/hostTmp:/containerTmp:Z`, `/hostVar:/containerVar:z`}, []string{}) - if _, hostConfig := mustParse(t, tryit); hostConfig.Binds == nil || compareRandomizedStrings(hostConfig.Binds[0], hostConfig.Binds[1], arr[0], arr[1]) != nil { - t.Fatalf("Error parsing volume flags, `%s and %s` did not mount-bind correctly. Received %v", arr[0], arr[1], hostConfig.Binds) - } - } - - // One bind mount and one volume - arr, tryit = setupPlatformVolume([]string{`/hostTmp:/containerTmp`, `/containerVar`}, []string{os.Getenv("TEMP") + `:c:\containerTmp`, `c:\containerTmp`}) - if config, hostConfig := mustParse(t, tryit); hostConfig.Binds == nil || len(hostConfig.Binds) > 1 || hostConfig.Binds[0] != arr[0] { - t.Fatalf("Error parsing volume flags, %s and %s should only one and only one bind mount %s. Received %s", arr[0], arr[1], arr[0], hostConfig.Binds) - } else if _, exists := config.Volumes[arr[1]]; !exists { - t.Fatalf("Error parsing volume flags %s and %s. %s is missing from volumes. Received %v", arr[0], arr[1], arr[1], config.Volumes) - } - - // Root to non-c: drive letter (Windows specific) - if runtime.GOOS == "windows" { - arr, tryit = setupPlatformVolume([]string{}, []string{os.Getenv("SystemDrive") + `\:d:`}) - if config, hostConfig := mustParse(t, tryit); hostConfig.Binds == nil || len(hostConfig.Binds) > 1 || hostConfig.Binds[0] != arr[0] || len(config.Volumes) != 0 { - t.Fatalf("Error parsing %s. Should have a single bind mount and no volumes", arr[0]) - } - } - -} - -// This tests the cases for binds which are generated through -// DecodeContainerConfig rather than Parse() -func TestDecodeContainerConfigVolumes(t *testing.T) { - - // Root to root - bindsOrVols, _ := setupPlatformVolume([]string{`/:/`}, []string{os.Getenv("SystemDrive") + `\:c:\`}) - if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil { - t.Fatalf("binds %v should have failed", bindsOrVols) - } - if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil { - t.Fatalf("volume %v should have failed", bindsOrVols) - } - - // No destination path - bindsOrVols, _ = setupPlatformVolume([]string{`/tmp:`}, []string{os.Getenv("TEMP") + `\:`}) - if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil { - t.Fatalf("binds %v should have failed", bindsOrVols) - } - if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil { - t.Fatalf("volume %v should have failed", bindsOrVols) - } - - // // No destination path or mode - bindsOrVols, _ = setupPlatformVolume([]string{`/tmp::`}, []string{os.Getenv("TEMP") + `\::`}) - if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil { - t.Fatalf("binds %v should have failed", bindsOrVols) - } - if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil { - t.Fatalf("volume %v should have failed", bindsOrVols) - } - - // A whole lot of nothing - bindsOrVols = []string{`:`} - if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil { - t.Fatalf("binds %v should have failed", bindsOrVols) - } - if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil { - t.Fatalf("volume %v should have failed", bindsOrVols) - } - - // A whole lot of nothing with no mode - bindsOrVols = []string{`::`} - if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil { - t.Fatalf("binds %v should have failed", bindsOrVols) - } - if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil { - t.Fatalf("volume %v should have failed", bindsOrVols) - } - - // Too much including an invalid mode - wTmp := os.Getenv("TEMP") - bindsOrVols, _ = setupPlatformVolume([]string{`/tmp:/tmp:/tmp:/tmp`}, []string{wTmp + ":" + wTmp + ":" + wTmp + ":" + wTmp}) - if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil { - t.Fatalf("binds %v should have failed", bindsOrVols) - } - if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil { - t.Fatalf("volume %v should have failed", bindsOrVols) - } - - // Windows specific error tests - if runtime.GOOS == "windows" { - // Volume which does not include a drive letter - bindsOrVols = []string{`\tmp`} - if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil { - t.Fatalf("binds %v should have failed", bindsOrVols) - } - if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil { - t.Fatalf("volume %v should have failed", bindsOrVols) - } - - // Root to C-Drive - bindsOrVols = []string{os.Getenv("SystemDrive") + `\:c:`} - if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil { - t.Fatalf("binds %v should have failed", bindsOrVols) - } - if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil { - t.Fatalf("volume %v should have failed", bindsOrVols) - } - - // Container path that does not include a drive letter - bindsOrVols = []string{`c:\windows:\somewhere`} - if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil { - t.Fatalf("binds %v should have failed", bindsOrVols) - } - if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil { - t.Fatalf("volume %v should have failed", bindsOrVols) - } - } - - // Linux-specific error tests - if runtime.GOOS != "windows" { - // Just root - bindsOrVols = []string{`/`} - if _, _, err := callDecodeContainerConfig(nil, bindsOrVols); err == nil { - t.Fatalf("binds %v should have failed", bindsOrVols) - } - if _, _, err := callDecodeContainerConfig(bindsOrVols, nil); err == nil { - t.Fatalf("volume %v should have failed", bindsOrVols) - } - - // A single volume that looks like a bind mount passed in Volumes. - // This should be handled as a bind mount, not a volume. - vols := []string{`/foo:/bar`} - if config, hostConfig, err := callDecodeContainerConfig(vols, nil); err != nil { - t.Fatal("Volume /foo:/bar should have succeeded as a volume name") - } else if hostConfig.Binds != nil { - t.Fatalf("Error parsing volume flags, /foo:/bar should not mount-bind anything. Received %v", hostConfig.Binds) - } else if _, exists := config.Volumes[vols[0]]; !exists { - t.Fatalf("Error parsing volume flags, /foo:/bar is missing from volumes. Received %v", config.Volumes) - } - - } -} - -// callDecodeContainerConfig is a utility function used by TestDecodeContainerConfigVolumes -// to call DecodeContainerConfig. It effectively does what a client would -// do when calling the daemon by constructing a JSON stream of a -// ContainerConfigWrapper which is populated by the set of volume specs -// passed into it. It returns a config and a hostconfig which can be -// validated to ensure DecodeContainerConfig has manipulated the structures -// correctly. -func callDecodeContainerConfig(volumes []string, binds []string) (*container.Config, *container.HostConfig, error) { - var ( - b []byte - err error - c *container.Config - h *container.HostConfig - ) - w := runconfig.ContainerConfigWrapper{ - Config: &container.Config{ - Volumes: map[string]struct{}{}, - }, - HostConfig: &container.HostConfig{ - NetworkMode: "none", - Binds: binds, - }, - } - for _, v := range volumes { - w.Config.Volumes[v] = struct{}{} - } - if b, err = json.Marshal(w); err != nil { - return nil, nil, fmt.Errorf("Error on marshal %s", err.Error()) - } - c, h, _, err = runconfig.DecodeContainerConfig(bytes.NewReader(b)) - if err != nil { - return nil, nil, fmt.Errorf("Error parsing %s: %v", string(b), err) - } - if c == nil || h == nil { - return nil, nil, fmt.Errorf("Empty config or hostconfig") - } - - return c, h, err -} - -// check if (a == c && b == d) || (a == d && b == c) -// because maps are randomized -func compareRandomizedStrings(a, b, c, d string) error { - if a == c && b == d { - return nil - } - if a == d && b == c { - return nil - } - return fmt.Errorf("strings don't match") -} - -// setupPlatformVolume takes two arrays of volume specs - a Unix style -// spec and a Windows style spec. Depending on the platform being unit tested, -// it returns one of them, along with a volume string that would be passed -// on the docker CLI (eg -v /bar -v /foo). -func setupPlatformVolume(u []string, w []string) ([]string, string) { - var a []string - if runtime.GOOS == "windows" { - a = w - } else { - a = u - } - s := "" - for _, v := range a { - s = s + "-v " + v + " " - } - return a, s -} - -// Simple parse with MacAddress validation -func TestParseWithMacAddress(t *testing.T) { - invalidMacAddress := "--mac-address=invalidMacAddress" - validMacAddress := "--mac-address=92:d0:c6:0a:29:33" - if _, _, _, err := parseRun([]string{invalidMacAddress, "img", "cmd"}); err != nil && err.Error() != "invalidMacAddress is not a valid mac address" { - t.Fatalf("Expected an error with %v mac-address, got %v", invalidMacAddress, err) - } - if config, _ := mustParse(t, validMacAddress); config.MacAddress != "92:d0:c6:0a:29:33" { - t.Fatalf("Expected the config to have '92:d0:c6:0a:29:33' as MacAddress, got '%v'", config.MacAddress) - } -} - -func TestParseWithMemory(t *testing.T) { - invalidMemory := "--memory=invalid" - validMemory := "--memory=1G" - if _, _, _, err := parseRun([]string{invalidMemory, "img", "cmd"}); err != nil && err.Error() != "invalid size: 'invalid'" { - t.Fatalf("Expected an error with '%v' Memory, got '%v'", invalidMemory, err) - } - if _, hostconfig := mustParse(t, validMemory); hostconfig.Memory != 1073741824 { - t.Fatalf("Expected the config to have '1G' as Memory, got '%v'", hostconfig.Memory) - } -} - -func TestParseWithMemorySwap(t *testing.T) { - invalidMemory := "--memory-swap=invalid" - validMemory := "--memory-swap=1G" - anotherValidMemory := "--memory-swap=-1" - if _, _, _, err := parseRun([]string{invalidMemory, "img", "cmd"}); err == nil || err.Error() != "invalid size: 'invalid'" { - t.Fatalf("Expected an error with '%v' MemorySwap, got '%v'", invalidMemory, err) - } - if _, hostconfig := mustParse(t, validMemory); hostconfig.MemorySwap != 1073741824 { - t.Fatalf("Expected the config to have '1073741824' as MemorySwap, got '%v'", hostconfig.MemorySwap) - } - if _, hostconfig := mustParse(t, anotherValidMemory); hostconfig.MemorySwap != -1 { - t.Fatalf("Expected the config to have '-1' as MemorySwap, got '%v'", hostconfig.MemorySwap) - } -} - -func TestParseHostname(t *testing.T) { - validHostnames := map[string]string{ - "hostname": "hostname", - "host-name": "host-name", - "hostname123": "hostname123", - "123hostname": "123hostname", - "hostname-of-63-bytes-long-should-be-valid-and-without-any-error": "hostname-of-63-bytes-long-should-be-valid-and-without-any-error", - } - hostnameWithDomain := "--hostname=hostname.domainname" - hostnameWithDomainTld := "--hostname=hostname.domainname.tld" - for hostname, expectedHostname := range validHostnames { - if config, _ := mustParse(t, fmt.Sprintf("--hostname=%s", hostname)); config.Hostname != expectedHostname { - t.Fatalf("Expected the config to have 'hostname' as hostname, got '%v'", config.Hostname) - } - } - if config, _ := mustParse(t, hostnameWithDomain); config.Hostname != "hostname.domainname" && config.Domainname != "" { - t.Fatalf("Expected the config to have 'hostname' as hostname.domainname, got '%v'", config.Hostname) - } - if config, _ := mustParse(t, hostnameWithDomainTld); config.Hostname != "hostname.domainname.tld" && config.Domainname != "" { - t.Fatalf("Expected the config to have 'hostname' as hostname.domainname.tld, got '%v'", config.Hostname) - } -} - -func TestParseWithExpose(t *testing.T) { - invalids := map[string]string{ - ":": "invalid port format for --expose: :", - "8080:9090": "invalid port format for --expose: 8080:9090", - "/tcp": "invalid range format for --expose: /tcp, error: Empty string specified for ports.", - "/udp": "invalid range format for --expose: /udp, error: Empty string specified for ports.", - "NaN/tcp": `invalid range format for --expose: NaN/tcp, error: strconv.ParseUint: parsing "NaN": invalid syntax`, - "NaN-NaN/tcp": `invalid range format for --expose: NaN-NaN/tcp, error: strconv.ParseUint: parsing "NaN": invalid syntax`, - "8080-NaN/tcp": `invalid range format for --expose: 8080-NaN/tcp, error: strconv.ParseUint: parsing "NaN": invalid syntax`, - "1234567890-8080/tcp": `invalid range format for --expose: 1234567890-8080/tcp, error: strconv.ParseUint: parsing "1234567890": value out of range`, - } - valids := map[string][]nat.Port{ - "8080/tcp": {"8080/tcp"}, - "8080/udp": {"8080/udp"}, - "8080/ncp": {"8080/ncp"}, - "8080-8080/udp": {"8080/udp"}, - "8080-8082/tcp": {"8080/tcp", "8081/tcp", "8082/tcp"}, - } - for expose, expectedError := range invalids { - if _, _, _, err := parseRun([]string{fmt.Sprintf("--expose=%v", expose), "img", "cmd"}); err == nil || err.Error() != expectedError { - t.Fatalf("Expected error '%v' with '--expose=%v', got '%v'", expectedError, expose, err) - } - } - for expose, exposedPorts := range valids { - config, _, _, err := parseRun([]string{fmt.Sprintf("--expose=%v", expose), "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if len(config.ExposedPorts) != len(exposedPorts) { - t.Fatalf("Expected %v exposed port, got %v", len(exposedPorts), len(config.ExposedPorts)) - } - for _, port := range exposedPorts { - if _, ok := config.ExposedPorts[port]; !ok { - t.Fatalf("Expected %v, got %v", exposedPorts, config.ExposedPorts) - } - } - } - // Merge with actual published port - config, _, _, err := parseRun([]string{"--publish=80", "--expose=80-81/tcp", "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if len(config.ExposedPorts) != 2 { - t.Fatalf("Expected 2 exposed ports, got %v", config.ExposedPorts) - } - ports := []nat.Port{"80/tcp", "81/tcp"} - for _, port := range ports { - if _, ok := config.ExposedPorts[port]; !ok { - t.Fatalf("Expected %v, got %v", ports, config.ExposedPorts) - } - } -} - -func TestParseDevice(t *testing.T) { - valids := map[string]container.DeviceMapping{ - "/dev/snd": { - PathOnHost: "/dev/snd", - PathInContainer: "/dev/snd", - CgroupPermissions: "rwm", - }, - "/dev/snd:rw": { - PathOnHost: "/dev/snd", - PathInContainer: "/dev/snd", - CgroupPermissions: "rw", - }, - "/dev/snd:/something": { - PathOnHost: "/dev/snd", - PathInContainer: "/something", - CgroupPermissions: "rwm", - }, - "/dev/snd:/something:rw": { - PathOnHost: "/dev/snd", - PathInContainer: "/something", - CgroupPermissions: "rw", - }, - } - for device, deviceMapping := range valids { - _, hostconfig, _, err := parseRun([]string{fmt.Sprintf("--device=%v", device), "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if len(hostconfig.Devices) != 1 { - t.Fatalf("Expected 1 devices, got %v", hostconfig.Devices) - } - if hostconfig.Devices[0] != deviceMapping { - t.Fatalf("Expected %v, got %v", deviceMapping, hostconfig.Devices) - } - } - -} - -func TestParseModes(t *testing.T) { - // ipc ko - if _, _, _, err := parseRun([]string{"--ipc=container:", "img", "cmd"}); err == nil || err.Error() != "--ipc: invalid IPC mode" { - t.Fatalf("Expected an error with message '--ipc: invalid IPC mode', got %v", err) - } - // ipc ok - _, hostconfig, _, err := parseRun([]string{"--ipc=host", "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if !hostconfig.IpcMode.Valid() { - t.Fatalf("Expected a valid IpcMode, got %v", hostconfig.IpcMode) - } - // pid ko - if _, _, _, err := parseRun([]string{"--pid=container:", "img", "cmd"}); err == nil || err.Error() != "--pid: invalid PID mode" { - t.Fatalf("Expected an error with message '--pid: invalid PID mode', got %v", err) - } - // pid ok - _, hostconfig, _, err = parseRun([]string{"--pid=host", "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if !hostconfig.PidMode.Valid() { - t.Fatalf("Expected a valid PidMode, got %v", hostconfig.PidMode) - } - // uts ko - if _, _, _, err := parseRun([]string{"--uts=container:", "img", "cmd"}); err == nil || err.Error() != "--uts: invalid UTS mode" { - t.Fatalf("Expected an error with message '--uts: invalid UTS mode', got %v", err) - } - // uts ok - _, hostconfig, _, err = parseRun([]string{"--uts=host", "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if !hostconfig.UTSMode.Valid() { - t.Fatalf("Expected a valid UTSMode, got %v", hostconfig.UTSMode) - } - // shm-size ko - if _, _, _, err = parseRun([]string{"--shm-size=a128m", "img", "cmd"}); err == nil || err.Error() != "invalid size: 'a128m'" { - t.Fatalf("Expected an error with message 'invalid size: a128m', got %v", err) - } - // shm-size ok - _, hostconfig, _, err = parseRun([]string{"--shm-size=128m", "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if hostconfig.ShmSize != 134217728 { - t.Fatalf("Expected a valid ShmSize, got %d", hostconfig.ShmSize) - } -} - -func TestParseRestartPolicy(t *testing.T) { - invalids := map[string]string{ - "always:2:3": "invalid restart policy format", - "on-failure:invalid": "maximum retry count must be an integer", - } - valids := map[string]container.RestartPolicy{ - "": {}, - "always": { - Name: "always", - MaximumRetryCount: 0, - }, - "on-failure:1": { - Name: "on-failure", - MaximumRetryCount: 1, - }, - } - for restart, expectedError := range invalids { - if _, _, _, err := parseRun([]string{fmt.Sprintf("--restart=%s", restart), "img", "cmd"}); err == nil || err.Error() != expectedError { - t.Fatalf("Expected an error with message '%v' for %v, got %v", expectedError, restart, err) - } - } - for restart, expected := range valids { - _, hostconfig, _, err := parseRun([]string{fmt.Sprintf("--restart=%v", restart), "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if hostconfig.RestartPolicy != expected { - t.Fatalf("Expected %v, got %v", expected, hostconfig.RestartPolicy) - } - } -} - -func TestParseHealth(t *testing.T) { - checkOk := func(args ...string) *container.HealthConfig { - config, _, _, err := parseRun(args) - if err != nil { - t.Fatalf("%#v: %v", args, err) - } - return config.Healthcheck - } - checkError := func(expected string, args ...string) { - config, _, _, err := parseRun(args) - if err == nil { - t.Fatalf("Expected error, but got %#v", config) - } - if err.Error() != expected { - t.Fatalf("Expected %#v, got %#v", expected, err) - } - } - health := checkOk("--no-healthcheck", "img", "cmd") - if health == nil || len(health.Test) != 1 || health.Test[0] != "NONE" { - t.Fatalf("--no-healthcheck failed: %#v", health) - } - - health = checkOk("--health-cmd=/check.sh -q", "img", "cmd") - if len(health.Test) != 2 || health.Test[0] != "CMD-SHELL" || health.Test[1] != "/check.sh -q" { - t.Fatalf("--health-cmd: got %#v", health.Test) - } - if health.Timeout != 0 { - t.Fatalf("--health-cmd: timeout = %f", health.Timeout) - } - - checkError("--no-healthcheck conflicts with --health-* options", - "--no-healthcheck", "--health-cmd=/check.sh -q", "img", "cmd") - - health = checkOk("--health-timeout=2s", "--health-retries=3", "--health-interval=4.5s", "img", "cmd") - if health.Timeout != 2*time.Second || health.Retries != 3 || health.Interval != 4500*time.Millisecond { - t.Fatalf("--health-*: got %#v", health) - } -} - -func TestParseLoggingOpts(t *testing.T) { - // logging opts ko - if _, _, _, err := parseRun([]string{"--log-driver=none", "--log-opt=anything", "img", "cmd"}); err == nil || err.Error() != "invalid logging opts for driver none" { - t.Fatalf("Expected an error with message 'invalid logging opts for driver none', got %v", err) - } - // logging opts ok - _, hostconfig, _, err := parseRun([]string{"--log-driver=syslog", "--log-opt=something", "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if hostconfig.LogConfig.Type != "syslog" || len(hostconfig.LogConfig.Config) != 1 { - t.Fatalf("Expected a 'syslog' LogConfig with one config, got %v", hostconfig.RestartPolicy) - } -} - -func TestParseEnvfileVariables(t *testing.T) { - e := "open nonexistent: no such file or directory" - if runtime.GOOS == "windows" { - e = "open nonexistent: The system cannot find the file specified." - } - // env ko - if _, _, _, err := parseRun([]string{"--env-file=nonexistent", "img", "cmd"}); err == nil || err.Error() != e { - t.Fatalf("Expected an error with message '%s', got %v", e, err) - } - // env ok - config, _, _, err := parseRun([]string{"--env-file=fixtures/valid.env", "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if len(config.Env) != 1 || config.Env[0] != "ENV1=value1" { - t.Fatalf("Expected a config with [ENV1=value1], got %v", config.Env) - } - config, _, _, err = parseRun([]string{"--env-file=fixtures/valid.env", "--env=ENV2=value2", "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if len(config.Env) != 2 || config.Env[0] != "ENV1=value1" || config.Env[1] != "ENV2=value2" { - t.Fatalf("Expected a config with [ENV1=value1 ENV2=value2], got %v", config.Env) - } -} - -func TestParseEnvfileVariablesWithBOMUnicode(t *testing.T) { - // UTF8 with BOM - config, _, _, err := parseRun([]string{"--env-file=fixtures/utf8.env", "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - env := []string{"FOO=BAR", "HELLO=" + string([]byte{0xe6, 0x82, 0xa8, 0xe5, 0xa5, 0xbd}), "BAR=FOO"} - if len(config.Env) != len(env) { - t.Fatalf("Expected a config with %d env variables, got %v: %v", len(env), len(config.Env), config.Env) - } - for i, v := range env { - if config.Env[i] != v { - t.Fatalf("Expected a config with [%s], got %v", v, []byte(config.Env[i])) - } - } - - // UTF16 with BOM - e := "contains invalid utf8 bytes at line" - if _, _, _, err := parseRun([]string{"--env-file=fixtures/utf16.env", "img", "cmd"}); err == nil || !strings.Contains(err.Error(), e) { - t.Fatalf("Expected an error with message '%s', got %v", e, err) - } - // UTF16BE with BOM - if _, _, _, err := parseRun([]string{"--env-file=fixtures/utf16be.env", "img", "cmd"}); err == nil || !strings.Contains(err.Error(), e) { - t.Fatalf("Expected an error with message '%s', got %v", e, err) - } -} - -func TestParseLabelfileVariables(t *testing.T) { - e := "open nonexistent: no such file or directory" - if runtime.GOOS == "windows" { - e = "open nonexistent: The system cannot find the file specified." - } - // label ko - if _, _, _, err := parseRun([]string{"--label-file=nonexistent", "img", "cmd"}); err == nil || err.Error() != e { - t.Fatalf("Expected an error with message '%s', got %v", e, err) - } - // label ok - config, _, _, err := parseRun([]string{"--label-file=fixtures/valid.label", "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if len(config.Labels) != 1 || config.Labels["LABEL1"] != "value1" { - t.Fatalf("Expected a config with [LABEL1:value1], got %v", config.Labels) - } - config, _, _, err = parseRun([]string{"--label-file=fixtures/valid.label", "--label=LABEL2=value2", "img", "cmd"}) - if err != nil { - t.Fatal(err) - } - if len(config.Labels) != 2 || config.Labels["LABEL1"] != "value1" || config.Labels["LABEL2"] != "value2" { - t.Fatalf("Expected a config with [LABEL1:value1 LABEL2:value2], got %v", config.Labels) - } -} - -func TestParseEntryPoint(t *testing.T) { - config, _, _, err := parseRun([]string{"--entrypoint=anything", "cmd", "img"}) - if err != nil { - t.Fatal(err) - } - if len(config.Entrypoint) != 1 && config.Entrypoint[0] != "anything" { - t.Fatalf("Expected entrypoint 'anything', got %v", config.Entrypoint) - } -} - -func TestValidateLink(t *testing.T) { - valid := []string{ - "name", - "dcdfbe62ecd0:alias", - "7a67485460b7642516a4ad82ecefe7f57d0c4916f530561b71a50a3f9c4e33da", - "angry_torvalds:linus", - } - invalid := map[string]string{ - "": "empty string specified for links", - "too:much:of:it": "bad format for links: too:much:of:it", - } - - for _, link := range valid { - if _, err := ValidateLink(link); err != nil { - t.Fatalf("ValidateLink(`%q`) should succeed: error %q", link, err) - } - } - - for link, expectedError := range invalid { - if _, err := ValidateLink(link); err == nil { - t.Fatalf("ValidateLink(`%q`) should have failed validation", link) - } else { - if !strings.Contains(err.Error(), expectedError) { - t.Fatalf("ValidateLink(`%q`) error should contain %q", link, expectedError) - } - } - } -} - -func TestParseLink(t *testing.T) { - name, alias, err := ParseLink("name:alias") - if err != nil { - t.Fatalf("Expected not to error out on a valid name:alias format but got: %v", err) - } - if name != "name" { - t.Fatalf("Link name should have been name, got %s instead", name) - } - if alias != "alias" { - t.Fatalf("Link alias should have been alias, got %s instead", alias) - } - // short format definition - name, alias, err = ParseLink("name") - if err != nil { - t.Fatalf("Expected not to error out on a valid name only format but got: %v", err) - } - if name != "name" { - t.Fatalf("Link name should have been name, got %s instead", name) - } - if alias != "name" { - t.Fatalf("Link alias should have been name, got %s instead", alias) - } - // empty string link definition is not allowed - if _, _, err := ParseLink(""); err == nil || !strings.Contains(err.Error(), "empty string specified for links") { - t.Fatalf("Expected error 'empty string specified for links' but got: %v", err) - } - // more than two colons are not allowed - if _, _, err := ParseLink("link:alias:wrong"); err == nil || !strings.Contains(err.Error(), "bad format for links: link:alias:wrong") { - t.Fatalf("Expected error 'bad format for links: link:alias:wrong' but got: %v", err) - } -} - -func TestValidateDevice(t *testing.T) { - valid := []string{ - "/home", - "/home:/home", - "/home:/something/else", - "/with space", - "/home:/with space", - "relative:/absolute-path", - "hostPath:/containerPath:r", - "/hostPath:/containerPath:rw", - "/hostPath:/containerPath:mrw", - } - invalid := map[string]string{ - "": "bad format for path: ", - "./": "./ is not an absolute path", - "../": "../ is not an absolute path", - "/:../": "../ is not an absolute path", - "/:path": "path is not an absolute path", - ":": "bad format for path: :", - "/tmp:": " is not an absolute path", - ":test": "bad format for path: :test", - ":/test": "bad format for path: :/test", - "tmp:": " is not an absolute path", - ":test:": "bad format for path: :test:", - "::": "bad format for path: ::", - ":::": "bad format for path: :::", - "/tmp:::": "bad format for path: /tmp:::", - ":/tmp::": "bad format for path: :/tmp::", - "path:ro": "ro is not an absolute path", - "path:rr": "rr is not an absolute path", - "a:/b:ro": "bad mode specified: ro", - "a:/b:rr": "bad mode specified: rr", - } - - for _, path := range valid { - if _, err := ValidateDevice(path); err != nil { - t.Fatalf("ValidateDevice(`%q`) should succeed: error %q", path, err) - } - } - - for path, expectedError := range invalid { - if _, err := ValidateDevice(path); err == nil { - t.Fatalf("ValidateDevice(`%q`) should have failed validation", path) - } else { - if err.Error() != expectedError { - t.Fatalf("ValidateDevice(`%q`) error should contain %q, got %q", path, expectedError, err.Error()) - } - } - } -} - -func TestVolumeSplitN(t *testing.T) { - for _, x := range []struct { - input string - n int - expected []string - }{ - {`C:\foo:d:`, -1, []string{`C:\foo`, `d:`}}, - {`:C:\foo:d:`, -1, nil}, - {`/foo:/bar:ro`, 3, []string{`/foo`, `/bar`, `ro`}}, - {`/foo:/bar:ro`, 2, []string{`/foo`, `/bar:ro`}}, - {`C:\foo\:/foo`, -1, []string{`C:\foo\`, `/foo`}}, - - {`d:\`, -1, []string{`d:\`}}, - {`d:`, -1, []string{`d:`}}, - {`d:\path`, -1, []string{`d:\path`}}, - {`d:\path with space`, -1, []string{`d:\path with space`}}, - {`d:\pathandmode:rw`, -1, []string{`d:\pathandmode`, `rw`}}, - {`c:\:d:\`, -1, []string{`c:\`, `d:\`}}, - {`c:\windows\:d:`, -1, []string{`c:\windows\`, `d:`}}, - {`c:\windows:d:\s p a c e`, -1, []string{`c:\windows`, `d:\s p a c e`}}, - {`c:\windows:d:\s p a c e:RW`, -1, []string{`c:\windows`, `d:\s p a c e`, `RW`}}, - {`c:\program files:d:\s p a c e i n h o s t d i r`, -1, []string{`c:\program files`, `d:\s p a c e i n h o s t d i r`}}, - {`0123456789name:d:`, -1, []string{`0123456789name`, `d:`}}, - {`MiXeDcAsEnAmE:d:`, -1, []string{`MiXeDcAsEnAmE`, `d:`}}, - {`name:D:`, -1, []string{`name`, `D:`}}, - {`name:D::rW`, -1, []string{`name`, `D:`, `rW`}}, - {`name:D::RW`, -1, []string{`name`, `D:`, `RW`}}, - {`c:/:d:/forward/slashes/are/good/too`, -1, []string{`c:/`, `d:/forward/slashes/are/good/too`}}, - {`c:\Windows`, -1, []string{`c:\Windows`}}, - {`c:\Program Files (x86)`, -1, []string{`c:\Program Files (x86)`}}, - - {``, -1, nil}, - {`.`, -1, []string{`.`}}, - {`..\`, -1, []string{`..\`}}, - {`c:\:..\`, -1, []string{`c:\`, `..\`}}, - {`c:\:d:\:xyzzy`, -1, []string{`c:\`, `d:\`, `xyzzy`}}, - - // Cover directories with one-character name - {`/tmp/x/y:/foo/x/y`, -1, []string{`/tmp/x/y`, `/foo/x/y`}}, - } { - res := volumeSplitN(x.input, x.n) - if len(res) < len(x.expected) { - t.Fatalf("input: %v, expected: %v, got: %v", x.input, x.expected, res) - } - for i, e := range res { - if e != x.expected[i] { - t.Fatalf("input: %v, expected: %v, got: %v", x.input, x.expected, res) - } - } - } -} diff --git a/vendor/github.com/docker/docker/runconfig/opts/runtime.go b/vendor/github.com/docker/docker/runconfig/opts/runtime.go deleted file mode 100644 index 4361b3ce0..000000000 --- a/vendor/github.com/docker/docker/runconfig/opts/runtime.go +++ /dev/null @@ -1,79 +0,0 @@ -package opts - -import ( - "fmt" - "strings" - - "github.com/docker/docker/api/types" -) - -// RuntimeOpt defines a map of Runtimes -type RuntimeOpt struct { - name string - stockRuntimeName string - values *map[string]types.Runtime -} - -// NewNamedRuntimeOpt creates a new RuntimeOpt -func NewNamedRuntimeOpt(name string, ref *map[string]types.Runtime, stockRuntime string) *RuntimeOpt { - if ref == nil { - ref = &map[string]types.Runtime{} - } - return &RuntimeOpt{name: name, values: ref, stockRuntimeName: stockRuntime} -} - -// Name returns the name of the NamedListOpts in the configuration. -func (o *RuntimeOpt) Name() string { - return o.name -} - -// Set validates and updates the list of Runtimes -func (o *RuntimeOpt) Set(val string) error { - parts := strings.SplitN(val, "=", 2) - if len(parts) != 2 { - return fmt.Errorf("invalid runtime argument: %s", val) - } - - parts[0] = strings.TrimSpace(parts[0]) - parts[1] = strings.TrimSpace(parts[1]) - if parts[0] == "" || parts[1] == "" { - return fmt.Errorf("invalid runtime argument: %s", val) - } - - parts[0] = strings.ToLower(parts[0]) - if parts[0] == o.stockRuntimeName { - return fmt.Errorf("runtime name '%s' is reserved", o.stockRuntimeName) - } - - if _, ok := (*o.values)[parts[0]]; ok { - return fmt.Errorf("runtime '%s' was already defined", parts[0]) - } - - (*o.values)[parts[0]] = types.Runtime{Path: parts[1]} - - return nil -} - -// String returns Runtime values as a string. -func (o *RuntimeOpt) String() string { - var out []string - for k := range *o.values { - out = append(out, k) - } - - return fmt.Sprintf("%v", out) -} - -// GetMap returns a map of Runtimes (name: path) -func (o *RuntimeOpt) GetMap() map[string]types.Runtime { - if o.values != nil { - return *o.values - } - - return map[string]types.Runtime{} -} - -// Type returns the type of the option -func (o *RuntimeOpt) Type() string { - return "runtime" -} diff --git a/vendor/github.com/docker/docker/runconfig/opts/throttledevice.go b/vendor/github.com/docker/docker/runconfig/opts/throttledevice.go deleted file mode 100644 index 502432429..000000000 --- a/vendor/github.com/docker/docker/runconfig/opts/throttledevice.go +++ /dev/null @@ -1,111 +0,0 @@ -package opts - -import ( - "fmt" - "strconv" - "strings" - - "github.com/docker/docker/api/types/blkiodev" - "github.com/docker/go-units" -) - -// ValidatorThrottleFctType defines a validator function that returns a validated struct and/or an error. -type ValidatorThrottleFctType func(val string) (*blkiodev.ThrottleDevice, error) - -// ValidateThrottleBpsDevice validates that the specified string has a valid device-rate format. -func ValidateThrottleBpsDevice(val string) (*blkiodev.ThrottleDevice, error) { - split := strings.SplitN(val, ":", 2) - if len(split) != 2 { - return nil, fmt.Errorf("bad format: %s", val) - } - if !strings.HasPrefix(split[0], "/dev/") { - return nil, fmt.Errorf("bad format for device path: %s", val) - } - rate, err := units.RAMInBytes(split[1]) - if err != nil { - return nil, fmt.Errorf("invalid rate for device: %s. The correct format is :[]. Number must be a positive integer. Unit is optional and can be kb, mb, or gb", val) - } - if rate < 0 { - return nil, fmt.Errorf("invalid rate for device: %s. The correct format is :[]. Number must be a positive integer. Unit is optional and can be kb, mb, or gb", val) - } - - return &blkiodev.ThrottleDevice{ - Path: split[0], - Rate: uint64(rate), - }, nil -} - -// ValidateThrottleIOpsDevice validates that the specified string has a valid device-rate format. -func ValidateThrottleIOpsDevice(val string) (*blkiodev.ThrottleDevice, error) { - split := strings.SplitN(val, ":", 2) - if len(split) != 2 { - return nil, fmt.Errorf("bad format: %s", val) - } - if !strings.HasPrefix(split[0], "/dev/") { - return nil, fmt.Errorf("bad format for device path: %s", val) - } - rate, err := strconv.ParseUint(split[1], 10, 64) - if err != nil { - return nil, fmt.Errorf("invalid rate for device: %s. The correct format is :. Number must be a positive integer", val) - } - if rate < 0 { - return nil, fmt.Errorf("invalid rate for device: %s. The correct format is :. Number must be a positive integer", val) - } - - return &blkiodev.ThrottleDevice{ - Path: split[0], - Rate: uint64(rate), - }, nil -} - -// ThrottledeviceOpt defines a map of ThrottleDevices -type ThrottledeviceOpt struct { - values []*blkiodev.ThrottleDevice - validator ValidatorThrottleFctType -} - -// NewThrottledeviceOpt creates a new ThrottledeviceOpt -func NewThrottledeviceOpt(validator ValidatorThrottleFctType) ThrottledeviceOpt { - values := []*blkiodev.ThrottleDevice{} - return ThrottledeviceOpt{ - values: values, - validator: validator, - } -} - -// Set validates a ThrottleDevice and sets its name as a key in ThrottledeviceOpt -func (opt *ThrottledeviceOpt) Set(val string) error { - var value *blkiodev.ThrottleDevice - if opt.validator != nil { - v, err := opt.validator(val) - if err != nil { - return err - } - value = v - } - (opt.values) = append((opt.values), value) - return nil -} - -// String returns ThrottledeviceOpt values as a string. -func (opt *ThrottledeviceOpt) String() string { - var out []string - for _, v := range opt.values { - out = append(out, v.String()) - } - - return fmt.Sprintf("%v", out) -} - -// GetList returns a slice of pointers to ThrottleDevices. -func (opt *ThrottledeviceOpt) GetList() []*blkiodev.ThrottleDevice { - var throttledevice []*blkiodev.ThrottleDevice - throttledevice = append(throttledevice, opt.values...) - - return throttledevice -} - -// Type returns the option type -func (opt *ThrottledeviceOpt) Type() string { - return "throttled-device" -} diff --git a/vendor/github.com/docker/docker/runconfig/opts/ulimit.go b/vendor/github.com/docker/docker/runconfig/opts/ulimit.go deleted file mode 100644 index 5adfe3085..000000000 --- a/vendor/github.com/docker/docker/runconfig/opts/ulimit.go +++ /dev/null @@ -1,57 +0,0 @@ -package opts - -import ( - "fmt" - - "github.com/docker/go-units" -) - -// UlimitOpt defines a map of Ulimits -type UlimitOpt struct { - values *map[string]*units.Ulimit -} - -// NewUlimitOpt creates a new UlimitOpt -func NewUlimitOpt(ref *map[string]*units.Ulimit) *UlimitOpt { - if ref == nil { - ref = &map[string]*units.Ulimit{} - } - return &UlimitOpt{ref} -} - -// Set validates a Ulimit and sets its name as a key in UlimitOpt -func (o *UlimitOpt) Set(val string) error { - l, err := units.ParseUlimit(val) - if err != nil { - return err - } - - (*o.values)[l.Name] = l - - return nil -} - -// String returns Ulimit values as a string. -func (o *UlimitOpt) String() string { - var out []string - for _, v := range *o.values { - out = append(out, v.String()) - } - - return fmt.Sprintf("%v", out) -} - -// GetList returns a slice of pointers to Ulimits. -func (o *UlimitOpt) GetList() []*units.Ulimit { - var ulimits []*units.Ulimit - for _, v := range *o.values { - ulimits = append(ulimits, v) - } - - return ulimits -} - -// Type returns the option type -func (o *UlimitOpt) Type() string { - return "ulimit" -} diff --git a/vendor/github.com/docker/docker/runconfig/opts/ulimit_test.go b/vendor/github.com/docker/docker/runconfig/opts/ulimit_test.go deleted file mode 100644 index 0aa3facdf..000000000 --- a/vendor/github.com/docker/docker/runconfig/opts/ulimit_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package opts - -import ( - "testing" - - "github.com/docker/go-units" -) - -func TestUlimitOpt(t *testing.T) { - ulimitMap := map[string]*units.Ulimit{ - "nofile": {"nofile", 1024, 512}, - } - - ulimitOpt := NewUlimitOpt(&ulimitMap) - - expected := "[nofile=512:1024]" - if ulimitOpt.String() != expected { - t.Fatalf("Expected %v, got %v", expected, ulimitOpt) - } - - // Valid ulimit append to opts - if err := ulimitOpt.Set("core=1024:1024"); err != nil { - t.Fatal(err) - } - - // Invalid ulimit type returns an error and do not append to opts - if err := ulimitOpt.Set("notavalidtype=1024:1024"); err == nil { - t.Fatalf("Expected error on invalid ulimit type") - } - expected = "[nofile=512:1024 core=1024:1024]" - expected2 := "[core=1024:1024 nofile=512:1024]" - result := ulimitOpt.String() - if result != expected && result != expected2 { - t.Fatalf("Expected %v or %v, got %v", expected, expected2, ulimitOpt) - } - - // And test GetList - ulimits := ulimitOpt.GetList() - if len(ulimits) != 2 { - t.Fatalf("Expected a ulimit list of 2, got %v", ulimits) - } -} diff --git a/vendor/github.com/docker/docker/runconfig/opts/weightdevice.go b/vendor/github.com/docker/docker/runconfig/opts/weightdevice.go deleted file mode 100644 index 2a5da6da0..000000000 --- a/vendor/github.com/docker/docker/runconfig/opts/weightdevice.go +++ /dev/null @@ -1,89 +0,0 @@ -package opts - -import ( - "fmt" - "strconv" - "strings" - - "github.com/docker/docker/api/types/blkiodev" -) - -// ValidatorWeightFctType defines a validator function that returns a validated struct and/or an error. -type ValidatorWeightFctType func(val string) (*blkiodev.WeightDevice, error) - -// ValidateWeightDevice validates that the specified string has a valid device-weight format. -func ValidateWeightDevice(val string) (*blkiodev.WeightDevice, error) { - split := strings.SplitN(val, ":", 2) - if len(split) != 2 { - return nil, fmt.Errorf("bad format: %s", val) - } - if !strings.HasPrefix(split[0], "/dev/") { - return nil, fmt.Errorf("bad format for device path: %s", val) - } - weight, err := strconv.ParseUint(split[1], 10, 0) - if err != nil { - return nil, fmt.Errorf("invalid weight for device: %s", val) - } - if weight > 0 && (weight < 10 || weight > 1000) { - return nil, fmt.Errorf("invalid weight for device: %s", val) - } - - return &blkiodev.WeightDevice{ - Path: split[0], - Weight: uint16(weight), - }, nil -} - -// WeightdeviceOpt defines a map of WeightDevices -type WeightdeviceOpt struct { - values []*blkiodev.WeightDevice - validator ValidatorWeightFctType -} - -// NewWeightdeviceOpt creates a new WeightdeviceOpt -func NewWeightdeviceOpt(validator ValidatorWeightFctType) WeightdeviceOpt { - values := []*blkiodev.WeightDevice{} - return WeightdeviceOpt{ - values: values, - validator: validator, - } -} - -// Set validates a WeightDevice and sets its name as a key in WeightdeviceOpt -func (opt *WeightdeviceOpt) Set(val string) error { - var value *blkiodev.WeightDevice - if opt.validator != nil { - v, err := opt.validator(val) - if err != nil { - return err - } - value = v - } - (opt.values) = append((opt.values), value) - return nil -} - -// String returns WeightdeviceOpt values as a string. -func (opt *WeightdeviceOpt) String() string { - var out []string - for _, v := range opt.values { - out = append(out, v.String()) - } - - return fmt.Sprintf("%v", out) -} - -// GetList returns a slice of pointers to WeightDevices. -func (opt *WeightdeviceOpt) GetList() []*blkiodev.WeightDevice { - var weightdevice []*blkiodev.WeightDevice - for _, v := range opt.values { - weightdevice = append(weightdevice, v) - } - - return weightdevice -} - -// Type returns the option type -func (opt *WeightdeviceOpt) Type() string { - return "weighted-device" -} diff --git a/vendor/github.com/docker/docker/utils/debug.go b/vendor/github.com/docker/docker/utils/debug.go deleted file mode 100644 index d20389112..000000000 --- a/vendor/github.com/docker/docker/utils/debug.go +++ /dev/null @@ -1,26 +0,0 @@ -package utils - -import ( - "os" - - "github.com/Sirupsen/logrus" -) - -// EnableDebug sets the DEBUG env var to true -// and makes the logger to log at debug level. -func EnableDebug() { - os.Setenv("DEBUG", "1") - logrus.SetLevel(logrus.DebugLevel) -} - -// DisableDebug sets the DEBUG env var to false -// and makes the logger to log at info level. -func DisableDebug() { - os.Setenv("DEBUG", "") - logrus.SetLevel(logrus.InfoLevel) -} - -// IsDebugEnabled checks whether the debug flag is set or not. -func IsDebugEnabled() bool { - return os.Getenv("DEBUG") != "" -} diff --git a/vendor/github.com/docker/docker/utils/debug_test.go b/vendor/github.com/docker/docker/utils/debug_test.go deleted file mode 100644 index 6f9c4dfbb..000000000 --- a/vendor/github.com/docker/docker/utils/debug_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package utils - -import ( - "os" - "testing" - - "github.com/Sirupsen/logrus" -) - -func TestEnableDebug(t *testing.T) { - defer func() { - os.Setenv("DEBUG", "") - logrus.SetLevel(logrus.InfoLevel) - }() - EnableDebug() - if os.Getenv("DEBUG") != "1" { - t.Fatalf("expected DEBUG=1, got %s\n", os.Getenv("DEBUG")) - } - if logrus.GetLevel() != logrus.DebugLevel { - t.Fatalf("expected log level %v, got %v\n", logrus.DebugLevel, logrus.GetLevel()) - } -} - -func TestDisableDebug(t *testing.T) { - DisableDebug() - if os.Getenv("DEBUG") != "" { - t.Fatalf("expected DEBUG=\"\", got %s\n", os.Getenv("DEBUG")) - } - if logrus.GetLevel() != logrus.InfoLevel { - t.Fatalf("expected log level %v, got %v\n", logrus.InfoLevel, logrus.GetLevel()) - } -} - -func TestDebugEnabled(t *testing.T) { - EnableDebug() - if !IsDebugEnabled() { - t.Fatal("expected debug enabled, got false") - } - DisableDebug() - if IsDebugEnabled() { - t.Fatal("expected debug disabled, got true") - } -} diff --git a/vendor/github.com/docker/docker/utils/names.go b/vendor/github.com/docker/docker/utils/names.go deleted file mode 100644 index 632062819..000000000 --- a/vendor/github.com/docker/docker/utils/names.go +++ /dev/null @@ -1,9 +0,0 @@ -package utils - -import "regexp" - -// RestrictedNameChars collects the characters allowed to represent a name, normally used to validate container and volume names. -const RestrictedNameChars = `[a-zA-Z0-9][a-zA-Z0-9_.-]` - -// RestrictedNamePattern is a regular expression to validate names against the collection of restricted characters. -var RestrictedNamePattern = regexp.MustCompile(`^` + RestrictedNameChars + `+$`) diff --git a/vendor/github.com/docker/docker/utils/process_unix.go b/vendor/github.com/docker/docker/utils/process_unix.go deleted file mode 100644 index fc0b1c8b7..000000000 --- a/vendor/github.com/docker/docker/utils/process_unix.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build linux freebsd solaris - -package utils - -import ( - "syscall" -) - -// IsProcessAlive returns true if process with a given pid is running. -func IsProcessAlive(pid int) bool { - err := syscall.Kill(pid, syscall.Signal(0)) - if err == nil || err == syscall.EPERM { - return true - } - - return false -} - -// KillProcess force-stops a process. -func KillProcess(pid int) { - syscall.Kill(pid, syscall.SIGKILL) -} diff --git a/vendor/github.com/docker/docker/utils/process_windows.go b/vendor/github.com/docker/docker/utils/process_windows.go deleted file mode 100644 index 03cb85519..000000000 --- a/vendor/github.com/docker/docker/utils/process_windows.go +++ /dev/null @@ -1,20 +0,0 @@ -package utils - -// IsProcessAlive returns true if process with a given pid is running. -func IsProcessAlive(pid int) bool { - // TODO Windows containerd. Not sure this is needed - // p, err := os.FindProcess(pid) - // if err == nil { - // return true - // } - return false -} - -// KillProcess force-stops a process. -func KillProcess(pid int) { - // TODO Windows containerd. Not sure this is needed - // p, err := os.FindProcess(pid) - // if err == nil { - // p.Kill() - // } -} diff --git a/vendor/github.com/docker/docker/utils/templates/templates.go b/vendor/github.com/docker/docker/utils/templates/templates.go deleted file mode 100644 index 91c376f38..000000000 --- a/vendor/github.com/docker/docker/utils/templates/templates.go +++ /dev/null @@ -1,42 +0,0 @@ -package templates - -import ( - "encoding/json" - "strings" - "text/template" -) - -// basicFunctions are the set of initial -// functions provided to every template. -var basicFunctions = template.FuncMap{ - "json": func(v interface{}) string { - a, _ := json.Marshal(v) - return string(a) - }, - "split": strings.Split, - "join": strings.Join, - "title": strings.Title, - "lower": strings.ToLower, - "upper": strings.ToUpper, - "pad": padWithSpace, -} - -// Parse creates a new annonymous template with the basic functions -// and parses the given format. -func Parse(format string) (*template.Template, error) { - return NewParse("", format) -} - -// NewParse creates a new tagged template with the basic functions -// and parses the given format. -func NewParse(tag, format string) (*template.Template, error) { - return template.New(tag).Funcs(basicFunctions).Parse(format) -} - -// padWithSpace adds whitespace to the input if the input is non-empty -func padWithSpace(source string, prefix, suffix int) string { - if source == "" { - return source - } - return strings.Repeat(" ", prefix) + source + strings.Repeat(" ", suffix) -} diff --git a/vendor/github.com/docker/docker/utils/templates/templates_test.go b/vendor/github.com/docker/docker/utils/templates/templates_test.go deleted file mode 100644 index dd42901ae..000000000 --- a/vendor/github.com/docker/docker/utils/templates/templates_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package templates - -import ( - "bytes" - "testing" -) - -func TestParseStringFunctions(t *testing.T) { - tm, err := Parse(`{{join (split . ":") "/"}}`) - if err != nil { - t.Fatal(err) - } - - var b bytes.Buffer - if err := tm.Execute(&b, "text:with:colon"); err != nil { - t.Fatal(err) - } - want := "text/with/colon" - if b.String() != want { - t.Fatalf("expected %s, got %s", want, b.String()) - } -} - -func TestNewParse(t *testing.T) { - tm, err := NewParse("foo", "this is a {{ . }}") - if err != nil { - t.Fatal(err) - } - - var b bytes.Buffer - if err := tm.Execute(&b, "string"); err != nil { - t.Fatal(err) - } - want := "this is a string" - if b.String() != want { - t.Fatalf("expected %s, got %s", want, b.String()) - } -} diff --git a/vendor/github.com/docker/docker/utils/utils.go b/vendor/github.com/docker/docker/utils/utils.go deleted file mode 100644 index d3dd00abf..000000000 --- a/vendor/github.com/docker/docker/utils/utils.go +++ /dev/null @@ -1,87 +0,0 @@ -package utils - -import ( - "fmt" - "io/ioutil" - "os" - "runtime" - "strings" - - "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/stringid" -) - -var globalTestID string - -// TestDirectory creates a new temporary directory and returns its path. -// The contents of directory at path `templateDir` is copied into the -// new directory. -func TestDirectory(templateDir string) (dir string, err error) { - if globalTestID == "" { - globalTestID = stringid.GenerateNonCryptoID()[:4] - } - prefix := fmt.Sprintf("docker-test%s-%s-", globalTestID, GetCallerName(2)) - if prefix == "" { - prefix = "docker-test-" - } - dir, err = ioutil.TempDir("", prefix) - if err = os.Remove(dir); err != nil { - return - } - if templateDir != "" { - if err = archive.CopyWithTar(templateDir, dir); err != nil { - return - } - } - return -} - -// GetCallerName introspects the call stack and returns the name of the -// function `depth` levels down in the stack. -func GetCallerName(depth int) string { - // Use the caller function name as a prefix. - // This helps trace temp directories back to their test. - pc, _, _, _ := runtime.Caller(depth + 1) - callerLongName := runtime.FuncForPC(pc).Name() - parts := strings.Split(callerLongName, ".") - callerShortName := parts[len(parts)-1] - return callerShortName -} - -// ReplaceOrAppendEnvValues returns the defaults with the overrides either -// replaced by env key or appended to the list -func ReplaceOrAppendEnvValues(defaults, overrides []string) []string { - cache := make(map[string]int, len(defaults)) - for i, e := range defaults { - parts := strings.SplitN(e, "=", 2) - cache[parts[0]] = i - } - - for _, value := range overrides { - // Values w/o = means they want this env to be removed/unset. - if !strings.Contains(value, "=") { - if i, exists := cache[value]; exists { - defaults[i] = "" // Used to indicate it should be removed - } - continue - } - - // Just do a normal set/update - parts := strings.SplitN(value, "=", 2) - if i, exists := cache[parts[0]]; exists { - defaults[i] = value - } else { - defaults = append(defaults, value) - } - } - - // Now remove all entries that we want to "unset" - for i := 0; i < len(defaults); i++ { - if defaults[i] == "" { - defaults = append(defaults[:i], defaults[i+1:]...) - i-- - } - } - - return defaults -} diff --git a/vendor/github.com/docker/docker/utils/utils_test.go b/vendor/github.com/docker/docker/utils/utils_test.go deleted file mode 100644 index ab3911e8b..000000000 --- a/vendor/github.com/docker/docker/utils/utils_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package utils - -import "testing" - -func TestReplaceAndAppendEnvVars(t *testing.T) { - var ( - d = []string{"HOME=/"} - o = []string{"HOME=/root", "TERM=xterm"} - ) - - env := ReplaceOrAppendEnvValues(d, o) - if len(env) != 2 { - t.Fatalf("expected len of 2 got %d", len(env)) - } - if env[0] != "HOME=/root" { - t.Fatalf("expected HOME=/root got '%s'", env[0]) - } - if env[1] != "TERM=xterm" { - t.Fatalf("expected TERM=xterm got '%s'", env[1]) - } -} diff --git a/vendor/github.com/docker/docker/volume/drivers/adapter.go b/vendor/github.com/docker/docker/volume/drivers/adapter.go deleted file mode 100644 index 62ef7dfe6..000000000 --- a/vendor/github.com/docker/docker/volume/drivers/adapter.go +++ /dev/null @@ -1,177 +0,0 @@ -package volumedrivers - -import ( - "errors" - "path/filepath" - "strings" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/volume" -) - -var ( - errNoSuchVolume = errors.New("no such volume") -) - -type volumeDriverAdapter struct { - name string - baseHostPath string - capabilities *volume.Capability - proxy *volumeDriverProxy -} - -func (a *volumeDriverAdapter) Name() string { - return a.name -} - -func (a *volumeDriverAdapter) Create(name string, opts map[string]string) (volume.Volume, error) { - if err := a.proxy.Create(name, opts); err != nil { - return nil, err - } - return &volumeAdapter{ - proxy: a.proxy, - name: name, - driverName: a.name, - baseHostPath: a.baseHostPath, - }, nil -} - -func (a *volumeDriverAdapter) Remove(v volume.Volume) error { - return a.proxy.Remove(v.Name()) -} - -func hostPath(baseHostPath, path string) string { - if baseHostPath != "" { - path = filepath.Join(baseHostPath, path) - } - return path -} - -func (a *volumeDriverAdapter) List() ([]volume.Volume, error) { - ls, err := a.proxy.List() - if err != nil { - return nil, err - } - - var out []volume.Volume - for _, vp := range ls { - out = append(out, &volumeAdapter{ - proxy: a.proxy, - name: vp.Name, - baseHostPath: a.baseHostPath, - driverName: a.name, - eMount: hostPath(a.baseHostPath, vp.Mountpoint), - }) - } - return out, nil -} - -func (a *volumeDriverAdapter) Get(name string) (volume.Volume, error) { - v, err := a.proxy.Get(name) - if err != nil { - return nil, err - } - - // plugin may have returned no volume and no error - if v == nil { - return nil, errNoSuchVolume - } - - return &volumeAdapter{ - proxy: a.proxy, - name: v.Name, - driverName: a.Name(), - eMount: v.Mountpoint, - status: v.Status, - baseHostPath: a.baseHostPath, - }, nil -} - -func (a *volumeDriverAdapter) Scope() string { - cap := a.getCapabilities() - return cap.Scope -} - -func (a *volumeDriverAdapter) getCapabilities() volume.Capability { - if a.capabilities != nil { - return *a.capabilities - } - cap, err := a.proxy.Capabilities() - if err != nil { - // `GetCapabilities` is a not a required endpoint. - // On error assume it's a local-only driver - logrus.Warnf("Volume driver %s returned an error while trying to query its capabilities, using default capabilties: %v", a.name, err) - return volume.Capability{Scope: volume.LocalScope} - } - - // don't spam the warn log below just because the plugin didn't provide a scope - if len(cap.Scope) == 0 { - cap.Scope = volume.LocalScope - } - - cap.Scope = strings.ToLower(cap.Scope) - if cap.Scope != volume.LocalScope && cap.Scope != volume.GlobalScope { - logrus.Warnf("Volume driver %q returned an invalid scope: %q", a.Name(), cap.Scope) - cap.Scope = volume.LocalScope - } - - a.capabilities = &cap - return cap -} - -type volumeAdapter struct { - proxy *volumeDriverProxy - name string - baseHostPath string - driverName string - eMount string // ephemeral host volume path - status map[string]interface{} -} - -type proxyVolume struct { - Name string - Mountpoint string - Status map[string]interface{} -} - -func (a *volumeAdapter) Name() string { - return a.name -} - -func (a *volumeAdapter) DriverName() string { - return a.driverName -} - -func (a *volumeAdapter) Path() string { - if len(a.eMount) == 0 { - mountpoint, _ := a.proxy.Path(a.name) - a.eMount = hostPath(a.baseHostPath, mountpoint) - } - return a.eMount -} - -func (a *volumeAdapter) CachedPath() string { - return a.eMount -} - -func (a *volumeAdapter) Mount(id string) (string, error) { - mountpoint, err := a.proxy.Mount(a.name, id) - a.eMount = hostPath(a.baseHostPath, mountpoint) - return a.eMount, err -} - -func (a *volumeAdapter) Unmount(id string) error { - err := a.proxy.Unmount(a.name, id) - if err == nil { - a.eMount = "" - } - return err -} - -func (a *volumeAdapter) Status() map[string]interface{} { - out := make(map[string]interface{}, len(a.status)) - for k, v := range a.status { - out[k] = v - } - return out -} diff --git a/vendor/github.com/docker/docker/volume/drivers/extpoint.go b/vendor/github.com/docker/docker/volume/drivers/extpoint.go deleted file mode 100644 index 576dee8a1..000000000 --- a/vendor/github.com/docker/docker/volume/drivers/extpoint.go +++ /dev/null @@ -1,215 +0,0 @@ -//go:generate pluginrpc-gen -i $GOFILE -o proxy.go -type volumeDriver -name VolumeDriver - -package volumedrivers - -import ( - "fmt" - "sync" - - "github.com/docker/docker/pkg/locker" - getter "github.com/docker/docker/pkg/plugingetter" - "github.com/docker/docker/volume" -) - -// currently created by hand. generation tool would generate this like: -// $ extpoint-gen Driver > volume/extpoint.go - -var drivers = &driverExtpoint{ - extensions: make(map[string]volume.Driver), - driverLock: &locker.Locker{}, -} - -const extName = "VolumeDriver" - -// NewVolumeDriver returns a driver has the given name mapped on the given client. -func NewVolumeDriver(name string, baseHostPath string, c client) volume.Driver { - proxy := &volumeDriverProxy{c} - return &volumeDriverAdapter{name: name, baseHostPath: baseHostPath, proxy: proxy} -} - -// volumeDriver defines the available functions that volume plugins must implement. -// This interface is only defined to generate the proxy objects. -// It's not intended to be public or reused. -type volumeDriver interface { - // Create a volume with the given name - Create(name string, opts map[string]string) (err error) - // Remove the volume with the given name - Remove(name string) (err error) - // Get the mountpoint of the given volume - Path(name string) (mountpoint string, err error) - // Mount the given volume and return the mountpoint - Mount(name, id string) (mountpoint string, err error) - // Unmount the given volume - Unmount(name, id string) (err error) - // List lists all the volumes known to the driver - List() (volumes []*proxyVolume, err error) - // Get retrieves the volume with the requested name - Get(name string) (volume *proxyVolume, err error) - // Capabilities gets the list of capabilities of the driver - Capabilities() (capabilities volume.Capability, err error) -} - -type driverExtpoint struct { - extensions map[string]volume.Driver - sync.Mutex - driverLock *locker.Locker - plugingetter getter.PluginGetter -} - -// RegisterPluginGetter sets the plugingetter -func RegisterPluginGetter(plugingetter getter.PluginGetter) { - drivers.plugingetter = plugingetter -} - -// Register associates the given driver to the given name, checking if -// the name is already associated -func Register(extension volume.Driver, name string) bool { - if name == "" { - return false - } - - drivers.Lock() - defer drivers.Unlock() - - _, exists := drivers.extensions[name] - if exists { - return false - } - - if err := validateDriver(extension); err != nil { - return false - } - - drivers.extensions[name] = extension - - return true -} - -// Unregister dissociates the name from its driver, if the association exists. -func Unregister(name string) bool { - drivers.Lock() - defer drivers.Unlock() - - _, exists := drivers.extensions[name] - if !exists { - return false - } - delete(drivers.extensions, name) - return true -} - -// lookup returns the driver associated with the given name. If a -// driver with the given name has not been registered it checks if -// there is a VolumeDriver plugin available with the given name. -func lookup(name string, mode int) (volume.Driver, error) { - drivers.driverLock.Lock(name) - defer drivers.driverLock.Unlock(name) - - drivers.Lock() - ext, ok := drivers.extensions[name] - drivers.Unlock() - if ok { - return ext, nil - } - if drivers.plugingetter != nil { - p, err := drivers.plugingetter.Get(name, extName, mode) - if err != nil { - return nil, fmt.Errorf("Error looking up volume plugin %s: %v", name, err) - } - - d := NewVolumeDriver(p.Name(), p.BasePath(), p.Client()) - if err := validateDriver(d); err != nil { - return nil, err - } - - if p.IsV1() { - drivers.Lock() - drivers.extensions[name] = d - drivers.Unlock() - } - return d, nil - } - return nil, fmt.Errorf("Error looking up volume plugin %s", name) -} - -func validateDriver(vd volume.Driver) error { - scope := vd.Scope() - if scope != volume.LocalScope && scope != volume.GlobalScope { - return fmt.Errorf("Driver %q provided an invalid capability scope: %s", vd.Name(), scope) - } - return nil -} - -// GetDriver returns a volume driver by its name. -// If the driver is empty, it looks for the local driver. -func GetDriver(name string) (volume.Driver, error) { - if name == "" { - name = volume.DefaultDriverName - } - return lookup(name, getter.LOOKUP) -} - -// CreateDriver returns a volume driver by its name and increments RefCount. -// If the driver is empty, it looks for the local driver. -func CreateDriver(name string) (volume.Driver, error) { - if name == "" { - name = volume.DefaultDriverName - } - return lookup(name, getter.ACQUIRE) -} - -// RemoveDriver returns a volume driver by its name and decrements RefCount.. -// If the driver is empty, it looks for the local driver. -func RemoveDriver(name string) (volume.Driver, error) { - if name == "" { - name = volume.DefaultDriverName - } - return lookup(name, getter.RELEASE) -} - -// GetDriverList returns list of volume drivers registered. -// If no driver is registered, empty string list will be returned. -func GetDriverList() []string { - var driverList []string - drivers.Lock() - for driverName := range drivers.extensions { - driverList = append(driverList, driverName) - } - drivers.Unlock() - return driverList -} - -// GetAllDrivers lists all the registered drivers -func GetAllDrivers() ([]volume.Driver, error) { - var plugins []getter.CompatPlugin - if drivers.plugingetter != nil { - var err error - plugins, err = drivers.plugingetter.GetAllByCap(extName) - if err != nil { - return nil, fmt.Errorf("error listing plugins: %v", err) - } - } - var ds []volume.Driver - - drivers.Lock() - defer drivers.Unlock() - - for _, d := range drivers.extensions { - ds = append(ds, d) - } - - for _, p := range plugins { - name := p.Name() - ext, ok := drivers.extensions[name] - if ok { - continue - } - - ext = NewVolumeDriver(name, p.BasePath(), p.Client()) - if p.IsV1() { - drivers.extensions[name] = ext - } - ds = append(ds, ext) - } - return ds, nil -} diff --git a/vendor/github.com/docker/docker/volume/drivers/extpoint_test.go b/vendor/github.com/docker/docker/volume/drivers/extpoint_test.go deleted file mode 100644 index 428b0752f..000000000 --- a/vendor/github.com/docker/docker/volume/drivers/extpoint_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package volumedrivers - -import ( - "testing" - - volumetestutils "github.com/docker/docker/volume/testutils" -) - -func TestGetDriver(t *testing.T) { - _, err := GetDriver("missing") - if err == nil { - t.Fatal("Expected error, was nil") - } - Register(volumetestutils.NewFakeDriver("fake"), "fake") - - d, err := GetDriver("fake") - if err != nil { - t.Fatal(err) - } - if d.Name() != "fake" { - t.Fatalf("Expected fake driver, got %s\n", d.Name()) - } -} diff --git a/vendor/github.com/docker/docker/volume/drivers/proxy.go b/vendor/github.com/docker/docker/volume/drivers/proxy.go deleted file mode 100644 index b23db6258..000000000 --- a/vendor/github.com/docker/docker/volume/drivers/proxy.go +++ /dev/null @@ -1,242 +0,0 @@ -// generated code - DO NOT EDIT - -package volumedrivers - -import ( - "errors" - - "github.com/docker/docker/volume" -) - -type client interface { - Call(string, interface{}, interface{}) error -} - -type volumeDriverProxy struct { - client -} - -type volumeDriverProxyCreateRequest struct { - Name string - Opts map[string]string -} - -type volumeDriverProxyCreateResponse struct { - Err string -} - -func (pp *volumeDriverProxy) Create(name string, opts map[string]string) (err error) { - var ( - req volumeDriverProxyCreateRequest - ret volumeDriverProxyCreateResponse - ) - - req.Name = name - req.Opts = opts - if err = pp.Call("VolumeDriver.Create", req, &ret); err != nil { - return - } - - if ret.Err != "" { - err = errors.New(ret.Err) - } - - return -} - -type volumeDriverProxyRemoveRequest struct { - Name string -} - -type volumeDriverProxyRemoveResponse struct { - Err string -} - -func (pp *volumeDriverProxy) Remove(name string) (err error) { - var ( - req volumeDriverProxyRemoveRequest - ret volumeDriverProxyRemoveResponse - ) - - req.Name = name - if err = pp.Call("VolumeDriver.Remove", req, &ret); err != nil { - return - } - - if ret.Err != "" { - err = errors.New(ret.Err) - } - - return -} - -type volumeDriverProxyPathRequest struct { - Name string -} - -type volumeDriverProxyPathResponse struct { - Mountpoint string - Err string -} - -func (pp *volumeDriverProxy) Path(name string) (mountpoint string, err error) { - var ( - req volumeDriverProxyPathRequest - ret volumeDriverProxyPathResponse - ) - - req.Name = name - if err = pp.Call("VolumeDriver.Path", req, &ret); err != nil { - return - } - - mountpoint = ret.Mountpoint - - if ret.Err != "" { - err = errors.New(ret.Err) - } - - return -} - -type volumeDriverProxyMountRequest struct { - Name string - ID string -} - -type volumeDriverProxyMountResponse struct { - Mountpoint string - Err string -} - -func (pp *volumeDriverProxy) Mount(name string, id string) (mountpoint string, err error) { - var ( - req volumeDriverProxyMountRequest - ret volumeDriverProxyMountResponse - ) - - req.Name = name - req.ID = id - if err = pp.Call("VolumeDriver.Mount", req, &ret); err != nil { - return - } - - mountpoint = ret.Mountpoint - - if ret.Err != "" { - err = errors.New(ret.Err) - } - - return -} - -type volumeDriverProxyUnmountRequest struct { - Name string - ID string -} - -type volumeDriverProxyUnmountResponse struct { - Err string -} - -func (pp *volumeDriverProxy) Unmount(name string, id string) (err error) { - var ( - req volumeDriverProxyUnmountRequest - ret volumeDriverProxyUnmountResponse - ) - - req.Name = name - req.ID = id - if err = pp.Call("VolumeDriver.Unmount", req, &ret); err != nil { - return - } - - if ret.Err != "" { - err = errors.New(ret.Err) - } - - return -} - -type volumeDriverProxyListRequest struct { -} - -type volumeDriverProxyListResponse struct { - Volumes []*proxyVolume - Err string -} - -func (pp *volumeDriverProxy) List() (volumes []*proxyVolume, err error) { - var ( - req volumeDriverProxyListRequest - ret volumeDriverProxyListResponse - ) - - if err = pp.Call("VolumeDriver.List", req, &ret); err != nil { - return - } - - volumes = ret.Volumes - - if ret.Err != "" { - err = errors.New(ret.Err) - } - - return -} - -type volumeDriverProxyGetRequest struct { - Name string -} - -type volumeDriverProxyGetResponse struct { - Volume *proxyVolume - Err string -} - -func (pp *volumeDriverProxy) Get(name string) (volume *proxyVolume, err error) { - var ( - req volumeDriverProxyGetRequest - ret volumeDriverProxyGetResponse - ) - - req.Name = name - if err = pp.Call("VolumeDriver.Get", req, &ret); err != nil { - return - } - - volume = ret.Volume - - if ret.Err != "" { - err = errors.New(ret.Err) - } - - return -} - -type volumeDriverProxyCapabilitiesRequest struct { -} - -type volumeDriverProxyCapabilitiesResponse struct { - Capabilities volume.Capability - Err string -} - -func (pp *volumeDriverProxy) Capabilities() (capabilities volume.Capability, err error) { - var ( - req volumeDriverProxyCapabilitiesRequest - ret volumeDriverProxyCapabilitiesResponse - ) - - if err = pp.Call("VolumeDriver.Capabilities", req, &ret); err != nil { - return - } - - capabilities = ret.Capabilities - - if ret.Err != "" { - err = errors.New(ret.Err) - } - - return -} diff --git a/vendor/github.com/docker/docker/volume/drivers/proxy_test.go b/vendor/github.com/docker/docker/volume/drivers/proxy_test.go deleted file mode 100644 index b78c46a03..000000000 --- a/vendor/github.com/docker/docker/volume/drivers/proxy_test.go +++ /dev/null @@ -1,132 +0,0 @@ -package volumedrivers - -import ( - "fmt" - "net/http" - "net/http/httptest" - "net/url" - "strings" - "testing" - - "github.com/docker/docker/pkg/plugins" - "github.com/docker/go-connections/tlsconfig" -) - -func TestVolumeRequestError(t *testing.T) { - mux := http.NewServeMux() - server := httptest.NewServer(mux) - defer server.Close() - - mux.HandleFunc("/VolumeDriver.Create", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintln(w, `{"Err": "Cannot create volume"}`) - }) - - mux.HandleFunc("/VolumeDriver.Remove", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintln(w, `{"Err": "Cannot remove volume"}`) - }) - - mux.HandleFunc("/VolumeDriver.Mount", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintln(w, `{"Err": "Cannot mount volume"}`) - }) - - mux.HandleFunc("/VolumeDriver.Unmount", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintln(w, `{"Err": "Cannot unmount volume"}`) - }) - - mux.HandleFunc("/VolumeDriver.Path", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintln(w, `{"Err": "Unknown volume"}`) - }) - - mux.HandleFunc("/VolumeDriver.List", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintln(w, `{"Err": "Cannot list volumes"}`) - }) - - mux.HandleFunc("/VolumeDriver.Get", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - fmt.Fprintln(w, `{"Err": "Cannot get volume"}`) - }) - - mux.HandleFunc("/VolumeDriver.Capabilities", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json") - http.Error(w, "error", 500) - }) - - u, _ := url.Parse(server.URL) - client, err := plugins.NewClient("tcp://"+u.Host, &tlsconfig.Options{InsecureSkipVerify: true}) - if err != nil { - t.Fatal(err) - } - - driver := volumeDriverProxy{client} - - if err = driver.Create("volume", nil); err == nil { - t.Fatal("Expected error, was nil") - } - - if !strings.Contains(err.Error(), "Cannot create volume") { - t.Fatalf("Unexpected error: %v\n", err) - } - - _, err = driver.Mount("volume", "123") - if err == nil { - t.Fatal("Expected error, was nil") - } - - if !strings.Contains(err.Error(), "Cannot mount volume") { - t.Fatalf("Unexpected error: %v\n", err) - } - - err = driver.Unmount("volume", "123") - if err == nil { - t.Fatal("Expected error, was nil") - } - - if !strings.Contains(err.Error(), "Cannot unmount volume") { - t.Fatalf("Unexpected error: %v\n", err) - } - - err = driver.Remove("volume") - if err == nil { - t.Fatal("Expected error, was nil") - } - - if !strings.Contains(err.Error(), "Cannot remove volume") { - t.Fatalf("Unexpected error: %v\n", err) - } - - _, err = driver.Path("volume") - if err == nil { - t.Fatal("Expected error, was nil") - } - - if !strings.Contains(err.Error(), "Unknown volume") { - t.Fatalf("Unexpected error: %v\n", err) - } - - _, err = driver.List() - if err == nil { - t.Fatal("Expected error, was nil") - } - if !strings.Contains(err.Error(), "Cannot list volumes") { - t.Fatalf("Unexpected error: %v\n", err) - } - - _, err = driver.Get("volume") - if err == nil { - t.Fatal("Expected error, was nil") - } - if !strings.Contains(err.Error(), "Cannot get volume") { - t.Fatalf("Unexpected error: %v\n", err) - } - - _, err = driver.Capabilities() - if err == nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/docker/volume/local/local.go b/vendor/github.com/docker/docker/volume/local/local.go deleted file mode 100644 index 62c45e69e..000000000 --- a/vendor/github.com/docker/docker/volume/local/local.go +++ /dev/null @@ -1,364 +0,0 @@ -// Package local provides the default implementation for volumes. It -// is used to mount data volume containers and directories local to -// the host server. -package local - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "strings" - "sync" - - "github.com/pkg/errors" - - "github.com/Sirupsen/logrus" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/utils" - "github.com/docker/docker/volume" -) - -// VolumeDataPathName is the name of the directory where the volume data is stored. -// It uses a very distinctive name to avoid collisions migrating data between -// Docker versions. -const ( - VolumeDataPathName = "_data" - volumesPathName = "volumes" -) - -var ( - // ErrNotFound is the typed error returned when the requested volume name can't be found - ErrNotFound = fmt.Errorf("volume not found") - // volumeNameRegex ensures the name assigned for the volume is valid. - // This name is used to create the bind directory, so we need to avoid characters that - // would make the path to escape the root directory. - volumeNameRegex = utils.RestrictedNamePattern -) - -type validationError struct { - error -} - -func (validationError) IsValidationError() bool { - return true -} - -type activeMount struct { - count uint64 - mounted bool -} - -// New instantiates a new Root instance with the provided scope. Scope -// is the base path that the Root instance uses to store its -// volumes. The base path is created here if it does not exist. -func New(scope string, rootUID, rootGID int) (*Root, error) { - rootDirectory := filepath.Join(scope, volumesPathName) - - if err := idtools.MkdirAllAs(rootDirectory, 0700, rootUID, rootGID); err != nil { - return nil, err - } - - r := &Root{ - scope: scope, - path: rootDirectory, - volumes: make(map[string]*localVolume), - rootUID: rootUID, - rootGID: rootGID, - } - - dirs, err := ioutil.ReadDir(rootDirectory) - if err != nil { - return nil, err - } - - mountInfos, err := mount.GetMounts() - if err != nil { - logrus.Debugf("error looking up mounts for local volume cleanup: %v", err) - } - - for _, d := range dirs { - if !d.IsDir() { - continue - } - - name := filepath.Base(d.Name()) - v := &localVolume{ - driverName: r.Name(), - name: name, - path: r.DataPath(name), - } - r.volumes[name] = v - optsFilePath := filepath.Join(rootDirectory, name, "opts.json") - if b, err := ioutil.ReadFile(optsFilePath); err == nil { - opts := optsConfig{} - if err := json.Unmarshal(b, &opts); err != nil { - return nil, errors.Wrapf(err, "error while unmarshaling volume options for volume: %s", name) - } - // Make sure this isn't an empty optsConfig. - // This could be empty due to buggy behavior in older versions of Docker. - if !reflect.DeepEqual(opts, optsConfig{}) { - v.opts = &opts - } - - // unmount anything that may still be mounted (for example, from an unclean shutdown) - for _, info := range mountInfos { - if info.Mountpoint == v.path { - mount.Unmount(v.path) - break - } - } - } - } - - return r, nil -} - -// Root implements the Driver interface for the volume package and -// manages the creation/removal of volumes. It uses only standard vfs -// commands to create/remove dirs within its provided scope. -type Root struct { - m sync.Mutex - scope string - path string - volumes map[string]*localVolume - rootUID int - rootGID int -} - -// List lists all the volumes -func (r *Root) List() ([]volume.Volume, error) { - var ls []volume.Volume - r.m.Lock() - for _, v := range r.volumes { - ls = append(ls, v) - } - r.m.Unlock() - return ls, nil -} - -// DataPath returns the constructed path of this volume. -func (r *Root) DataPath(volumeName string) string { - return filepath.Join(r.path, volumeName, VolumeDataPathName) -} - -// Name returns the name of Root, defined in the volume package in the DefaultDriverName constant. -func (r *Root) Name() string { - return volume.DefaultDriverName -} - -// Create creates a new volume.Volume with the provided name, creating -// the underlying directory tree required for this volume in the -// process. -func (r *Root) Create(name string, opts map[string]string) (volume.Volume, error) { - if err := r.validateName(name); err != nil { - return nil, err - } - - r.m.Lock() - defer r.m.Unlock() - - v, exists := r.volumes[name] - if exists { - return v, nil - } - - path := r.DataPath(name) - if err := idtools.MkdirAllAs(path, 0755, r.rootUID, r.rootGID); err != nil { - if os.IsExist(err) { - return nil, fmt.Errorf("volume already exists under %s", filepath.Dir(path)) - } - return nil, errors.Wrapf(err, "error while creating volume path '%s'", path) - } - - var err error - defer func() { - if err != nil { - os.RemoveAll(filepath.Dir(path)) - } - }() - - v = &localVolume{ - driverName: r.Name(), - name: name, - path: path, - } - - if len(opts) != 0 { - if err = setOpts(v, opts); err != nil { - return nil, err - } - var b []byte - b, err = json.Marshal(v.opts) - if err != nil { - return nil, err - } - if err = ioutil.WriteFile(filepath.Join(filepath.Dir(path), "opts.json"), b, 600); err != nil { - return nil, errors.Wrap(err, "error while persisting volume options") - } - } - - r.volumes[name] = v - return v, nil -} - -// Remove removes the specified volume and all underlying data. If the -// given volume does not belong to this driver and an error is -// returned. The volume is reference counted, if all references are -// not released then the volume is not removed. -func (r *Root) Remove(v volume.Volume) error { - r.m.Lock() - defer r.m.Unlock() - - lv, ok := v.(*localVolume) - if !ok { - return fmt.Errorf("unknown volume type %T", v) - } - - realPath, err := filepath.EvalSymlinks(lv.path) - if err != nil { - if !os.IsNotExist(err) { - return err - } - realPath = filepath.Dir(lv.path) - } - - if !r.scopedPath(realPath) { - return fmt.Errorf("Unable to remove a directory of out the Docker root %s: %s", r.scope, realPath) - } - - if err := removePath(realPath); err != nil { - return err - } - - delete(r.volumes, lv.name) - return removePath(filepath.Dir(lv.path)) -} - -func removePath(path string) error { - if err := os.RemoveAll(path); err != nil { - if os.IsNotExist(err) { - return nil - } - return errors.Wrapf(err, "error removing volume path '%s'", path) - } - return nil -} - -// Get looks up the volume for the given name and returns it if found -func (r *Root) Get(name string) (volume.Volume, error) { - r.m.Lock() - v, exists := r.volumes[name] - r.m.Unlock() - if !exists { - return nil, ErrNotFound - } - return v, nil -} - -// Scope returns the local volume scope -func (r *Root) Scope() string { - return volume.LocalScope -} - -func (r *Root) validateName(name string) error { - if len(name) == 1 { - return validationError{fmt.Errorf("volume name is too short, names should be at least two alphanumeric characters")} - } - if !volumeNameRegex.MatchString(name) { - return validationError{fmt.Errorf("%q includes invalid characters for a local volume name, only %q are allowed. If you intented to pass a host directory, use absolute path", name, utils.RestrictedNameChars)} - } - return nil -} - -// localVolume implements the Volume interface from the volume package and -// represents the volumes created by Root. -type localVolume struct { - m sync.Mutex - // unique name of the volume - name string - // path is the path on the host where the data lives - path string - // driverName is the name of the driver that created the volume. - driverName string - // opts is the parsed list of options used to create the volume - opts *optsConfig - // active refcounts the active mounts - active activeMount -} - -// Name returns the name of the given Volume. -func (v *localVolume) Name() string { - return v.name -} - -// DriverName returns the driver that created the given Volume. -func (v *localVolume) DriverName() string { - return v.driverName -} - -// Path returns the data location. -func (v *localVolume) Path() string { - return v.path -} - -// Mount implements the localVolume interface, returning the data location. -func (v *localVolume) Mount(id string) (string, error) { - v.m.Lock() - defer v.m.Unlock() - if v.opts != nil { - if !v.active.mounted { - if err := v.mount(); err != nil { - return "", err - } - v.active.mounted = true - } - v.active.count++ - } - return v.path, nil -} - -// Umount is for satisfying the localVolume interface and does not do anything in this driver. -func (v *localVolume) Unmount(id string) error { - v.m.Lock() - defer v.m.Unlock() - if v.opts != nil { - v.active.count-- - if v.active.count == 0 { - if err := mount.Unmount(v.path); err != nil { - v.active.count++ - return errors.Wrapf(err, "error while unmounting volume path '%s'", v.path) - } - v.active.mounted = false - } - } - return nil -} - -func validateOpts(opts map[string]string) error { - for opt := range opts { - if !validOpts[opt] { - return validationError{fmt.Errorf("invalid option key: %q", opt)} - } - } - return nil -} - -func (v *localVolume) Status() map[string]interface{} { - return nil -} - -// getAddress finds out address/hostname from options -func getAddress(opts string) string { - optsList := strings.Split(opts, ",") - for i := 0; i < len(optsList); i++ { - if strings.HasPrefix(optsList[i], "addr=") { - addr := (strings.SplitN(optsList[i], "=", 2)[1]) - return addr - } - } - return "" -} diff --git a/vendor/github.com/docker/docker/volume/local/local_test.go b/vendor/github.com/docker/docker/volume/local/local_test.go deleted file mode 100644 index f5a519b88..000000000 --- a/vendor/github.com/docker/docker/volume/local/local_test.go +++ /dev/null @@ -1,344 +0,0 @@ -package local - -import ( - "io/ioutil" - "os" - "path/filepath" - "reflect" - "runtime" - "strings" - "testing" - - "github.com/docker/docker/pkg/mount" -) - -func TestGetAddress(t *testing.T) { - cases := map[string]string{ - "addr=11.11.11.1": "11.11.11.1", - " ": "", - "addr=": "", - "addr=2001:db8::68": "2001:db8::68", - } - for name, success := range cases { - v := getAddress(name) - if v != success { - t.Errorf("Test case failed for %s actual: %s expected : %s", name, v, success) - } - } - -} - -func TestRemove(t *testing.T) { - // TODO Windows: Investigate why this test fails on Windows under CI - // but passes locally. - if runtime.GOOS == "windows" { - t.Skip("Test failing on Windows CI") - } - rootDir, err := ioutil.TempDir("", "local-volume-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(rootDir) - - r, err := New(rootDir, 0, 0) - if err != nil { - t.Fatal(err) - } - - vol, err := r.Create("testing", nil) - if err != nil { - t.Fatal(err) - } - - if err := r.Remove(vol); err != nil { - t.Fatal(err) - } - - vol, err = r.Create("testing2", nil) - if err != nil { - t.Fatal(err) - } - if err := os.RemoveAll(vol.Path()); err != nil { - t.Fatal(err) - } - - if err := r.Remove(vol); err != nil { - t.Fatal(err) - } - - if _, err := os.Stat(vol.Path()); err != nil && !os.IsNotExist(err) { - t.Fatal("volume dir not removed") - } - - if l, _ := r.List(); len(l) != 0 { - t.Fatal("expected there to be no volumes") - } -} - -func TestInitializeWithVolumes(t *testing.T) { - rootDir, err := ioutil.TempDir("", "local-volume-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(rootDir) - - r, err := New(rootDir, 0, 0) - if err != nil { - t.Fatal(err) - } - - vol, err := r.Create("testing", nil) - if err != nil { - t.Fatal(err) - } - - r, err = New(rootDir, 0, 0) - if err != nil { - t.Fatal(err) - } - - v, err := r.Get(vol.Name()) - if err != nil { - t.Fatal(err) - } - - if v.Path() != vol.Path() { - t.Fatal("expected to re-initialize root with existing volumes") - } -} - -func TestCreate(t *testing.T) { - rootDir, err := ioutil.TempDir("", "local-volume-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(rootDir) - - r, err := New(rootDir, 0, 0) - if err != nil { - t.Fatal(err) - } - - cases := map[string]bool{ - "name": true, - "name-with-dash": true, - "name_with_underscore": true, - "name/with/slash": false, - "name/with/../../slash": false, - "./name": false, - "../name": false, - "./": false, - "../": false, - "~": false, - ".": false, - "..": false, - "...": false, - } - - for name, success := range cases { - v, err := r.Create(name, nil) - if success { - if err != nil { - t.Fatal(err) - } - if v.Name() != name { - t.Fatalf("Expected volume with name %s, got %s", name, v.Name()) - } - } else { - if err == nil { - t.Fatalf("Expected error creating volume with name %s, got nil", name) - } - } - } - - r, err = New(rootDir, 0, 0) - if err != nil { - t.Fatal(err) - } -} - -func TestValidateName(t *testing.T) { - r := &Root{} - names := map[string]bool{ - "x": false, - "/testvol": false, - "thing.d": true, - "hello-world": true, - "./hello": false, - ".hello": false, - } - - for vol, expected := range names { - err := r.validateName(vol) - if expected && err != nil { - t.Fatalf("expected %s to be valid got %v", vol, err) - } - if !expected && err == nil { - t.Fatalf("expected %s to be invalid", vol) - } - } -} - -func TestCreateWithOpts(t *testing.T) { - if runtime.GOOS == "windows" || runtime.GOOS == "solaris" { - t.Skip() - } - rootDir, err := ioutil.TempDir("", "local-volume-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(rootDir) - - r, err := New(rootDir, 0, 0) - if err != nil { - t.Fatal(err) - } - - if _, err := r.Create("test", map[string]string{"invalidopt": "notsupported"}); err == nil { - t.Fatal("expected invalid opt to cause error") - } - - vol, err := r.Create("test", map[string]string{"device": "tmpfs", "type": "tmpfs", "o": "size=1m,uid=1000"}) - if err != nil { - t.Fatal(err) - } - v := vol.(*localVolume) - - dir, err := v.Mount("1234") - if err != nil { - t.Fatal(err) - } - defer func() { - if err := v.Unmount("1234"); err != nil { - t.Fatal(err) - } - }() - - mountInfos, err := mount.GetMounts() - if err != nil { - t.Fatal(err) - } - - var found bool - for _, info := range mountInfos { - if info.Mountpoint == dir { - found = true - if info.Fstype != "tmpfs" { - t.Fatalf("expected tmpfs mount, got %q", info.Fstype) - } - if info.Source != "tmpfs" { - t.Fatalf("expected tmpfs mount, got %q", info.Source) - } - if !strings.Contains(info.VfsOpts, "uid=1000") { - t.Fatalf("expected mount info to have uid=1000: %q", info.VfsOpts) - } - if !strings.Contains(info.VfsOpts, "size=1024k") { - t.Fatalf("expected mount info to have size=1024k: %q", info.VfsOpts) - } - break - } - } - - if !found { - t.Fatal("mount not found") - } - - if v.active.count != 1 { - t.Fatalf("Expected active mount count to be 1, got %d", v.active.count) - } - - // test double mount - if _, err := v.Mount("1234"); err != nil { - t.Fatal(err) - } - if v.active.count != 2 { - t.Fatalf("Expected active mount count to be 2, got %d", v.active.count) - } - - if err := v.Unmount("1234"); err != nil { - t.Fatal(err) - } - if v.active.count != 1 { - t.Fatalf("Expected active mount count to be 1, got %d", v.active.count) - } - - mounted, err := mount.Mounted(v.path) - if err != nil { - t.Fatal(err) - } - if !mounted { - t.Fatal("expected mount to still be active") - } - - r, err = New(rootDir, 0, 0) - if err != nil { - t.Fatal(err) - } - - v2, exists := r.volumes["test"] - if !exists { - t.Fatal("missing volume on restart") - } - - if !reflect.DeepEqual(v.opts, v2.opts) { - t.Fatal("missing volume options on restart") - } -} - -func TestRealodNoOpts(t *testing.T) { - rootDir, err := ioutil.TempDir("", "volume-test-reload-no-opts") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(rootDir) - - r, err := New(rootDir, 0, 0) - if err != nil { - t.Fatal(err) - } - - if _, err := r.Create("test1", nil); err != nil { - t.Fatal(err) - } - if _, err := r.Create("test2", nil); err != nil { - t.Fatal(err) - } - // make sure a file with `null` (.e.g. empty opts map from older daemon) is ok - if err := ioutil.WriteFile(filepath.Join(rootDir, "test2"), []byte("null"), 600); err != nil { - t.Fatal(err) - } - - if _, err := r.Create("test3", nil); err != nil { - t.Fatal(err) - } - // make sure an empty opts file doesn't break us too - if err := ioutil.WriteFile(filepath.Join(rootDir, "test3"), nil, 600); err != nil { - t.Fatal(err) - } - - if _, err := r.Create("test4", map[string]string{}); err != nil { - t.Fatal(err) - } - - r, err = New(rootDir, 0, 0) - if err != nil { - t.Fatal(err) - } - - for _, name := range []string{"test1", "test2", "test3", "test4"} { - v, err := r.Get(name) - if err != nil { - t.Fatal(err) - } - lv, ok := v.(*localVolume) - if !ok { - t.Fatalf("expected *localVolume got: %v", reflect.TypeOf(v)) - } - if lv.opts != nil { - t.Fatalf("expected opts to be nil, got: %v", lv.opts) - } - if _, err := lv.Mount("1234"); err != nil { - t.Fatal(err) - } - } -} diff --git a/vendor/github.com/docker/docker/volume/local/local_unix.go b/vendor/github.com/docker/docker/volume/local/local_unix.go deleted file mode 100644 index fb08862ce..000000000 --- a/vendor/github.com/docker/docker/volume/local/local_unix.go +++ /dev/null @@ -1,87 +0,0 @@ -// +build linux freebsd solaris - -// Package local provides the default implementation for volumes. It -// is used to mount data volume containers and directories local to -// the host server. -package local - -import ( - "fmt" - "net" - "path/filepath" - "strings" - - "github.com/pkg/errors" - - "github.com/docker/docker/pkg/mount" -) - -var ( - oldVfsDir = filepath.Join("vfs", "dir") - - validOpts = map[string]bool{ - "type": true, // specify the filesystem type for mount, e.g. nfs - "o": true, // generic mount options - "device": true, // device to mount from - } -) - -type optsConfig struct { - MountType string - MountOpts string - MountDevice string -} - -func (o *optsConfig) String() string { - return fmt.Sprintf("type='%s' device='%s' o='%s'", o.MountType, o.MountDevice, o.MountOpts) -} - -// scopedPath verifies that the path where the volume is located -// is under Docker's root and the valid local paths. -func (r *Root) scopedPath(realPath string) bool { - // Volumes path for Docker version >= 1.7 - if strings.HasPrefix(realPath, filepath.Join(r.scope, volumesPathName)) && realPath != filepath.Join(r.scope, volumesPathName) { - return true - } - - // Volumes path for Docker version < 1.7 - if strings.HasPrefix(realPath, filepath.Join(r.scope, oldVfsDir)) { - return true - } - - return false -} - -func setOpts(v *localVolume, opts map[string]string) error { - if len(opts) == 0 { - return nil - } - if err := validateOpts(opts); err != nil { - return err - } - - v.opts = &optsConfig{ - MountType: opts["type"], - MountOpts: opts["o"], - MountDevice: opts["device"], - } - return nil -} - -func (v *localVolume) mount() error { - if v.opts.MountDevice == "" { - return fmt.Errorf("missing device in volume options") - } - mountOpts := v.opts.MountOpts - if v.opts.MountType == "nfs" { - if addrValue := getAddress(v.opts.MountOpts); addrValue != "" && net.ParseIP(addrValue).To4() == nil { - ipAddr, err := net.ResolveIPAddr("ip", addrValue) - if err != nil { - return errors.Wrapf(err, "error resolving passed in nfs address") - } - mountOpts = strings.Replace(mountOpts, "addr="+addrValue, "addr="+ipAddr.String(), 1) - } - } - err := mount.Mount(v.opts.MountDevice, v.path, v.opts.MountType, mountOpts) - return errors.Wrapf(err, "error while mounting volume with options: %s", v.opts) -} diff --git a/vendor/github.com/docker/docker/volume/local/local_windows.go b/vendor/github.com/docker/docker/volume/local/local_windows.go deleted file mode 100644 index 1bdb368a0..000000000 --- a/vendor/github.com/docker/docker/volume/local/local_windows.go +++ /dev/null @@ -1,34 +0,0 @@ -// Package local provides the default implementation for volumes. It -// is used to mount data volume containers and directories local to -// the host server. -package local - -import ( - "fmt" - "path/filepath" - "strings" -) - -type optsConfig struct{} - -var validOpts map[string]bool - -// scopedPath verifies that the path where the volume is located -// is under Docker's root and the valid local paths. -func (r *Root) scopedPath(realPath string) bool { - if strings.HasPrefix(realPath, filepath.Join(r.scope, volumesPathName)) && realPath != filepath.Join(r.scope, volumesPathName) { - return true - } - return false -} - -func setOpts(v *localVolume, opts map[string]string) error { - if len(opts) > 0 { - return fmt.Errorf("options are not supported on this platform") - } - return nil -} - -func (v *localVolume) mount() error { - return nil -} diff --git a/vendor/github.com/docker/docker/volume/store/db.go b/vendor/github.com/docker/docker/volume/store/db.go deleted file mode 100644 index c5fd1643f..000000000 --- a/vendor/github.com/docker/docker/volume/store/db.go +++ /dev/null @@ -1,88 +0,0 @@ -package store - -import ( - "encoding/json" - - "github.com/Sirupsen/logrus" - "github.com/boltdb/bolt" - "github.com/pkg/errors" -) - -var volumeBucketName = []byte("volumes") - -type volumeMetadata struct { - Name string - Driver string - Labels map[string]string - Options map[string]string -} - -func (s *VolumeStore) setMeta(name string, meta volumeMetadata) error { - return s.db.Update(func(tx *bolt.Tx) error { - return setMeta(tx, name, meta) - }) -} - -func setMeta(tx *bolt.Tx, name string, meta volumeMetadata) error { - metaJSON, err := json.Marshal(meta) - if err != nil { - return err - } - b := tx.Bucket(volumeBucketName) - return errors.Wrap(b.Put([]byte(name), metaJSON), "error setting volume metadata") -} - -func (s *VolumeStore) getMeta(name string) (volumeMetadata, error) { - var meta volumeMetadata - err := s.db.View(func(tx *bolt.Tx) error { - return getMeta(tx, name, &meta) - }) - return meta, err -} - -func getMeta(tx *bolt.Tx, name string, meta *volumeMetadata) error { - b := tx.Bucket(volumeBucketName) - val := b.Get([]byte(name)) - if string(val) == "" { - return nil - } - if err := json.Unmarshal(val, meta); err != nil { - return errors.Wrap(err, "error unmarshaling volume metadata") - } - return nil -} - -func (s *VolumeStore) removeMeta(name string) error { - return s.db.Update(func(tx *bolt.Tx) error { - return removeMeta(tx, name) - }) -} - -func removeMeta(tx *bolt.Tx, name string) error { - b := tx.Bucket(volumeBucketName) - return errors.Wrap(b.Delete([]byte(name)), "error removing volume metadata") -} - -// listMeta is used during restore to get the list of volume metadata -// from the on-disk database. -// Any errors that occur are only logged. -func listMeta(tx *bolt.Tx) []volumeMetadata { - var ls []volumeMetadata - b := tx.Bucket(volumeBucketName) - b.ForEach(func(k, v []byte) error { - if len(v) == 0 { - // don't try to unmarshal an empty value - return nil - } - - var m volumeMetadata - if err := json.Unmarshal(v, &m); err != nil { - // Just log the error - logrus.Errorf("Error while reading volume metadata for volume %q: %v", string(k), err) - return nil - } - ls = append(ls, m) - return nil - }) - return ls -} diff --git a/vendor/github.com/docker/docker/volume/store/errors.go b/vendor/github.com/docker/docker/volume/store/errors.go deleted file mode 100644 index 980175f29..000000000 --- a/vendor/github.com/docker/docker/volume/store/errors.go +++ /dev/null @@ -1,76 +0,0 @@ -package store - -import ( - "strings" - - "github.com/pkg/errors" -) - -var ( - // errVolumeInUse is a typed error returned when trying to remove a volume that is currently in use by a container - errVolumeInUse = errors.New("volume is in use") - // errNoSuchVolume is a typed error returned if the requested volume doesn't exist in the volume store - errNoSuchVolume = errors.New("no such volume") - // errInvalidName is a typed error returned when creating a volume with a name that is not valid on the platform - errInvalidName = errors.New("volume name is not valid on this platform") - // errNameConflict is a typed error returned on create when a volume exists with the given name, but for a different driver - errNameConflict = errors.New("volume name must be unique") -) - -// OpErr is the error type returned by functions in the store package. It describes -// the operation, volume name, and error. -type OpErr struct { - // Err is the error that occurred during the operation. - Err error - // Op is the operation which caused the error, such as "create", or "list". - Op string - // Name is the name of the resource being requested for this op, typically the volume name or the driver name. - Name string - // Refs is the list of references associated with the resource. - Refs []string -} - -// Error satisfies the built-in error interface type. -func (e *OpErr) Error() string { - if e == nil { - return "" - } - s := e.Op - if e.Name != "" { - s = s + " " + e.Name - } - - s = s + ": " + e.Err.Error() - if len(e.Refs) > 0 { - s = s + " - " + "[" + strings.Join(e.Refs, ", ") + "]" - } - return s -} - -// IsInUse returns a boolean indicating whether the error indicates that a -// volume is in use -func IsInUse(err error) bool { - return isErr(err, errVolumeInUse) -} - -// IsNotExist returns a boolean indicating whether the error indicates that the volume does not exist -func IsNotExist(err error) bool { - return isErr(err, errNoSuchVolume) -} - -// IsNameConflict returns a boolean indicating whether the error indicates that a -// volume name is already taken -func IsNameConflict(err error) bool { - return isErr(err, errNameConflict) -} - -func isErr(err error, expected error) bool { - err = errors.Cause(err) - switch pe := err.(type) { - case nil: - return false - case *OpErr: - err = errors.Cause(pe.Err) - } - return err == expected -} diff --git a/vendor/github.com/docker/docker/volume/store/restore.go b/vendor/github.com/docker/docker/volume/store/restore.go deleted file mode 100644 index c0c5b519b..000000000 --- a/vendor/github.com/docker/docker/volume/store/restore.go +++ /dev/null @@ -1,83 +0,0 @@ -package store - -import ( - "sync" - - "github.com/Sirupsen/logrus" - "github.com/boltdb/bolt" - "github.com/docker/docker/volume" - "github.com/docker/docker/volume/drivers" -) - -// restore is called when a new volume store is created. -// It's primary purpose is to ensure that all drivers' refcounts are set based -// on known volumes after a restart. -// This only attempts to track volumes that are actually stored in the on-disk db. -// It does not probe the available drivers to find anything that may have been added -// out of band. -func (s *VolumeStore) restore() { - var ls []volumeMetadata - s.db.View(func(tx *bolt.Tx) error { - ls = listMeta(tx) - return nil - }) - - chRemove := make(chan *volumeMetadata, len(ls)) - var wg sync.WaitGroup - for _, meta := range ls { - wg.Add(1) - // this is potentially a very slow operation, so do it in a goroutine - go func(meta volumeMetadata) { - defer wg.Done() - - var v volume.Volume - var err error - if meta.Driver != "" { - v, err = lookupVolume(meta.Driver, meta.Name) - if err != nil && err != errNoSuchVolume { - logrus.WithError(err).WithField("driver", meta.Driver).WithField("volume", meta.Name).Warn("Error restoring volume") - return - } - if v == nil { - // doesn't exist in the driver, remove it from the db - chRemove <- &meta - return - } - } else { - v, err = s.getVolume(meta.Name) - if err != nil { - if err == errNoSuchVolume { - chRemove <- &meta - } - return - } - - meta.Driver = v.DriverName() - if err := s.setMeta(v.Name(), meta); err != nil { - logrus.WithError(err).WithField("driver", meta.Driver).WithField("volume", v.Name()).Warn("Error updating volume metadata on restore") - } - } - - // increment driver refcount - volumedrivers.CreateDriver(meta.Driver) - - // cache the volume - s.globalLock.Lock() - s.options[v.Name()] = meta.Options - s.labels[v.Name()] = meta.Labels - s.names[v.Name()] = v - s.globalLock.Unlock() - }(meta) - } - - wg.Wait() - close(chRemove) - s.db.Update(func(tx *bolt.Tx) error { - for meta := range chRemove { - if err := removeMeta(tx, meta.Name); err != nil { - logrus.WithField("volume", meta.Name).Warnf("Error removing stale entry from volume db: %v", err) - } - } - return nil - }) -} diff --git a/vendor/github.com/docker/docker/volume/store/store.go b/vendor/github.com/docker/docker/volume/store/store.go deleted file mode 100644 index 38afd86f4..000000000 --- a/vendor/github.com/docker/docker/volume/store/store.go +++ /dev/null @@ -1,649 +0,0 @@ -package store - -import ( - "net" - "os" - "path/filepath" - "sync" - "time" - - "github.com/pkg/errors" - - "github.com/Sirupsen/logrus" - "github.com/boltdb/bolt" - "github.com/docker/docker/pkg/locker" - "github.com/docker/docker/volume" - "github.com/docker/docker/volume/drivers" -) - -const ( - volumeDataDir = "volumes" -) - -type volumeWrapper struct { - volume.Volume - labels map[string]string - scope string - options map[string]string -} - -func (v volumeWrapper) Options() map[string]string { - options := map[string]string{} - for key, value := range v.options { - options[key] = value - } - return options -} - -func (v volumeWrapper) Labels() map[string]string { - return v.labels -} - -func (v volumeWrapper) Scope() string { - return v.scope -} - -func (v volumeWrapper) CachedPath() string { - if vv, ok := v.Volume.(interface { - CachedPath() string - }); ok { - return vv.CachedPath() - } - return v.Volume.Path() -} - -// New initializes a VolumeStore to keep -// reference counting of volumes in the system. -func New(rootPath string) (*VolumeStore, error) { - vs := &VolumeStore{ - locks: &locker.Locker{}, - names: make(map[string]volume.Volume), - refs: make(map[string][]string), - labels: make(map[string]map[string]string), - options: make(map[string]map[string]string), - } - - if rootPath != "" { - // initialize metadata store - volPath := filepath.Join(rootPath, volumeDataDir) - if err := os.MkdirAll(volPath, 750); err != nil { - return nil, err - } - - dbPath := filepath.Join(volPath, "metadata.db") - - var err error - vs.db, err = bolt.Open(dbPath, 0600, &bolt.Options{Timeout: 1 * time.Second}) - if err != nil { - return nil, errors.Wrap(err, "error while opening volume store metadata database") - } - - // initialize volumes bucket - if err := vs.db.Update(func(tx *bolt.Tx) error { - if _, err := tx.CreateBucketIfNotExists(volumeBucketName); err != nil { - return errors.Wrap(err, "error while setting up volume store metadata database") - } - return nil - }); err != nil { - return nil, err - } - } - - vs.restore() - - return vs, nil -} - -func (s *VolumeStore) getNamed(name string) (volume.Volume, bool) { - s.globalLock.RLock() - v, exists := s.names[name] - s.globalLock.RUnlock() - return v, exists -} - -func (s *VolumeStore) setNamed(v volume.Volume, ref string) { - s.globalLock.Lock() - s.names[v.Name()] = v - if len(ref) > 0 { - s.refs[v.Name()] = append(s.refs[v.Name()], ref) - } - s.globalLock.Unlock() -} - -// getRefs gets the list of refs for a given name -// Callers of this function are expected to hold the name lock. -func (s *VolumeStore) getRefs(name string) []string { - s.globalLock.RLock() - refs := s.refs[name] - s.globalLock.RUnlock() - return refs -} - -// Purge allows the cleanup of internal data on docker in case -// the internal data is out of sync with volumes driver plugins. -func (s *VolumeStore) Purge(name string) { - s.globalLock.Lock() - v, exists := s.names[name] - if exists { - if _, err := volumedrivers.RemoveDriver(v.DriverName()); err != nil { - logrus.Error("Error dereferencing volume driver: %v", err) - } - } - if err := s.removeMeta(name); err != nil { - logrus.Errorf("Error removing volume metadata for volume %q: %v", name, err) - } - delete(s.names, name) - delete(s.refs, name) - delete(s.labels, name) - delete(s.options, name) - s.globalLock.Unlock() -} - -// VolumeStore is a struct that stores the list of volumes available and keeps track of their usage counts -type VolumeStore struct { - // locks ensures that only one action is being performed on a particular volume at a time without locking the entire store - // since actions on volumes can be quite slow, this ensures the store is free to handle requests for other volumes. - locks *locker.Locker - // globalLock is used to protect access to mutable structures used by the store object - globalLock sync.RWMutex - // names stores the volume name -> volume relationship. - // This is used for making lookups faster so we don't have to probe all drivers - names map[string]volume.Volume - // refs stores the volume name and the list of things referencing it - refs map[string][]string - // labels stores volume labels for each volume - labels map[string]map[string]string - // options stores volume options for each volume - options map[string]map[string]string - db *bolt.DB -} - -// List proxies to all registered volume drivers to get the full list of volumes -// If a driver returns a volume that has name which conflicts with another volume from a different driver, -// the first volume is chosen and the conflicting volume is dropped. -func (s *VolumeStore) List() ([]volume.Volume, []string, error) { - vols, warnings, err := s.list() - if err != nil { - return nil, nil, &OpErr{Err: err, Op: "list"} - } - var out []volume.Volume - - for _, v := range vols { - name := normaliseVolumeName(v.Name()) - - s.locks.Lock(name) - storedV, exists := s.getNamed(name) - // Note: it's not safe to populate the cache here because the volume may have been - // deleted before we acquire a lock on its name - if exists && storedV.DriverName() != v.DriverName() { - logrus.Warnf("Volume name %s already exists for driver %s, not including volume returned by %s", v.Name(), storedV.DriverName(), v.DriverName()) - s.locks.Unlock(v.Name()) - continue - } - - out = append(out, v) - s.locks.Unlock(v.Name()) - } - return out, warnings, nil -} - -// list goes through each volume driver and asks for its list of volumes. -func (s *VolumeStore) list() ([]volume.Volume, []string, error) { - var ( - ls []volume.Volume - warnings []string - ) - - drivers, err := volumedrivers.GetAllDrivers() - if err != nil { - return nil, nil, err - } - - type vols struct { - vols []volume.Volume - err error - driverName string - } - chVols := make(chan vols, len(drivers)) - - for _, vd := range drivers { - go func(d volume.Driver) { - vs, err := d.List() - if err != nil { - chVols <- vols{driverName: d.Name(), err: &OpErr{Err: err, Name: d.Name(), Op: "list"}} - return - } - for i, v := range vs { - s.globalLock.RLock() - vs[i] = volumeWrapper{v, s.labels[v.Name()], d.Scope(), s.options[v.Name()]} - s.globalLock.RUnlock() - } - - chVols <- vols{vols: vs} - }(vd) - } - - badDrivers := make(map[string]struct{}) - for i := 0; i < len(drivers); i++ { - vs := <-chVols - - if vs.err != nil { - warnings = append(warnings, vs.err.Error()) - badDrivers[vs.driverName] = struct{}{} - logrus.Warn(vs.err) - } - ls = append(ls, vs.vols...) - } - - if len(badDrivers) > 0 { - s.globalLock.RLock() - for _, v := range s.names { - if _, exists := badDrivers[v.DriverName()]; exists { - ls = append(ls, v) - } - } - s.globalLock.RUnlock() - } - return ls, warnings, nil -} - -// CreateWithRef creates a volume with the given name and driver and stores the ref -// This ensures there's no race between creating a volume and then storing a reference. -func (s *VolumeStore) CreateWithRef(name, driverName, ref string, opts, labels map[string]string) (volume.Volume, error) { - name = normaliseVolumeName(name) - s.locks.Lock(name) - defer s.locks.Unlock(name) - - v, err := s.create(name, driverName, opts, labels) - if err != nil { - return nil, &OpErr{Err: err, Name: name, Op: "create"} - } - - s.setNamed(v, ref) - return v, nil -} - -// Create creates a volume with the given name and driver. -// This is just like CreateWithRef() except we don't store a reference while holding the lock. -func (s *VolumeStore) Create(name, driverName string, opts, labels map[string]string) (volume.Volume, error) { - return s.CreateWithRef(name, driverName, "", opts, labels) -} - -// checkConflict checks the local cache for name collisions with the passed in name, -// for existing volumes with the same name but in a different driver. -// This is used by `Create` as a best effort to prevent name collisions for volumes. -// If a matching volume is found that is not a conflict that is returned so the caller -// does not need to perform an additional lookup. -// When no matching volume is found, both returns will be nil -// -// Note: This does not probe all the drivers for name collisions because v1 plugins -// are very slow, particularly if the plugin is down, and cause other issues, -// particularly around locking the store. -// TODO(cpuguy83): With v2 plugins this shouldn't be a problem. Could also potentially -// use a connect timeout for this kind of check to ensure we aren't blocking for a -// long time. -func (s *VolumeStore) checkConflict(name, driverName string) (volume.Volume, error) { - // check the local cache - v, _ := s.getNamed(name) - if v == nil { - return nil, nil - } - - vDriverName := v.DriverName() - var conflict bool - if driverName != "" { - // Retrieve canonical driver name to avoid inconsistencies (for example - // "plugin" vs. "plugin:latest") - vd, err := volumedrivers.GetDriver(driverName) - if err != nil { - return nil, err - } - - if vDriverName != vd.Name() { - conflict = true - } - } - - // let's check if the found volume ref - // is stale by checking with the driver if it still exists - exists, err := volumeExists(v) - if err != nil { - return nil, errors.Wrapf(errNameConflict, "found reference to volume '%s' in driver '%s', but got an error while checking the driver: %v", name, vDriverName, err) - } - - if exists { - if conflict { - return nil, errors.Wrapf(errNameConflict, "driver '%s' already has volume '%s'", vDriverName, name) - } - return v, nil - } - - if len(s.getRefs(v.Name())) > 0 { - // Containers are referencing this volume but it doesn't seem to exist anywhere. - // Return a conflict error here, the user can fix this with `docker volume rm -f` - return nil, errors.Wrapf(errNameConflict, "found references to volume '%s' in driver '%s' but the volume was not found in the driver -- you may need to remove containers referencing this volume or force remove the volume to re-create it", name, vDriverName) - } - - // doesn't exist, so purge it from the cache - s.Purge(name) - return nil, nil -} - -// volumeExists returns if the volume is still present in the driver. -// An error is returned if there was an issue communicating with the driver. -func volumeExists(v volume.Volume) (bool, error) { - exists, err := lookupVolume(v.DriverName(), v.Name()) - if err != nil { - return false, err - } - return exists != nil, nil -} - -// create asks the given driver to create a volume with the name/opts. -// If a volume with the name is already known, it will ask the stored driver for the volume. -// If the passed in driver name does not match the driver name which is stored -// for the given volume name, an error is returned after checking if the reference is stale. -// If the reference is stale, it will be purged and this create can continue. -// It is expected that callers of this function hold any necessary locks. -func (s *VolumeStore) create(name, driverName string, opts, labels map[string]string) (volume.Volume, error) { - // Validate the name in a platform-specific manner - valid, err := volume.IsVolumeNameValid(name) - if err != nil { - return nil, err - } - if !valid { - return nil, &OpErr{Err: errInvalidName, Name: name, Op: "create"} - } - - v, err := s.checkConflict(name, driverName) - if err != nil { - return nil, err - } - - if v != nil { - return v, nil - } - - // Since there isn't a specified driver name, let's see if any of the existing drivers have this volume name - if driverName == "" { - v, _ := s.getVolume(name) - if v != nil { - return v, nil - } - } - - vd, err := volumedrivers.CreateDriver(driverName) - - if err != nil { - return nil, &OpErr{Op: "create", Name: name, Err: err} - } - - logrus.Debugf("Registering new volume reference: driver %q, name %q", vd.Name(), name) - - if v, _ := vd.Get(name); v != nil { - return v, nil - } - v, err = vd.Create(name, opts) - if err != nil { - return nil, err - } - s.globalLock.Lock() - s.labels[name] = labels - s.options[name] = opts - s.globalLock.Unlock() - - metadata := volumeMetadata{ - Name: name, - Driver: vd.Name(), - Labels: labels, - Options: opts, - } - - if err := s.setMeta(name, metadata); err != nil { - return nil, err - } - return volumeWrapper{v, labels, vd.Scope(), opts}, nil -} - -// GetWithRef gets a volume with the given name from the passed in driver and stores the ref -// This is just like Get(), but we store the reference while holding the lock. -// This makes sure there are no races between checking for the existence of a volume and adding a reference for it -func (s *VolumeStore) GetWithRef(name, driverName, ref string) (volume.Volume, error) { - name = normaliseVolumeName(name) - s.locks.Lock(name) - defer s.locks.Unlock(name) - - vd, err := volumedrivers.GetDriver(driverName) - if err != nil { - return nil, &OpErr{Err: err, Name: name, Op: "get"} - } - - v, err := vd.Get(name) - if err != nil { - return nil, &OpErr{Err: err, Name: name, Op: "get"} - } - - s.setNamed(v, ref) - - s.globalLock.RLock() - defer s.globalLock.RUnlock() - return volumeWrapper{v, s.labels[name], vd.Scope(), s.options[name]}, nil -} - -// Get looks if a volume with the given name exists and returns it if so -func (s *VolumeStore) Get(name string) (volume.Volume, error) { - name = normaliseVolumeName(name) - s.locks.Lock(name) - defer s.locks.Unlock(name) - - v, err := s.getVolume(name) - if err != nil { - return nil, &OpErr{Err: err, Name: name, Op: "get"} - } - s.setNamed(v, "") - return v, nil -} - -// getVolume requests the volume, if the driver info is stored it just accesses that driver, -// if the driver is unknown it probes all drivers until it finds the first volume with that name. -// it is expected that callers of this function hold any necessary locks -func (s *VolumeStore) getVolume(name string) (volume.Volume, error) { - var meta volumeMetadata - meta, err := s.getMeta(name) - if err != nil { - return nil, err - } - - driverName := meta.Driver - if driverName == "" { - s.globalLock.RLock() - v, exists := s.names[name] - s.globalLock.RUnlock() - if exists { - meta.Driver = v.DriverName() - if err := s.setMeta(name, meta); err != nil { - return nil, err - } - } - } - - if meta.Driver != "" { - vol, err := lookupVolume(meta.Driver, name) - if err != nil { - return nil, err - } - if vol == nil { - s.Purge(name) - return nil, errNoSuchVolume - } - - var scope string - vd, err := volumedrivers.GetDriver(meta.Driver) - if err == nil { - scope = vd.Scope() - } - return volumeWrapper{vol, meta.Labels, scope, meta.Options}, nil - } - - logrus.Debugf("Probing all drivers for volume with name: %s", name) - drivers, err := volumedrivers.GetAllDrivers() - if err != nil { - return nil, err - } - - for _, d := range drivers { - v, err := d.Get(name) - if err != nil || v == nil { - continue - } - meta.Driver = v.DriverName() - if err := s.setMeta(name, meta); err != nil { - return nil, err - } - return volumeWrapper{v, meta.Labels, d.Scope(), meta.Options}, nil - } - return nil, errNoSuchVolume -} - -// lookupVolume gets the specified volume from the specified driver. -// This will only return errors related to communications with the driver. -// If the driver returns an error that is not communication related the -// error is logged but not returned. -// If the volume is not found it will return `nil, nil`` -func lookupVolume(driverName, volumeName string) (volume.Volume, error) { - vd, err := volumedrivers.GetDriver(driverName) - if err != nil { - return nil, errors.Wrapf(err, "error while checking if volume %q exists in driver %q", volumeName, driverName) - } - v, err := vd.Get(volumeName) - if err != nil { - err = errors.Cause(err) - if _, ok := err.(net.Error); ok { - return nil, errors.Wrapf(err, "error while checking if volume %q exists in driver %q", v.Name(), v.DriverName()) - } - - // At this point, the error could be anything from the driver, such as "no such volume" - // Let's not check an error here, and instead check if the driver returned a volume - logrus.WithError(err).WithField("driver", driverName).WithField("volume", volumeName).Warnf("Error while looking up volume") - } - return v, nil -} - -// Remove removes the requested volume. A volume is not removed if it has any refs -func (s *VolumeStore) Remove(v volume.Volume) error { - name := normaliseVolumeName(v.Name()) - s.locks.Lock(name) - defer s.locks.Unlock(name) - - refs := s.getRefs(name) - if len(refs) > 0 { - return &OpErr{Err: errVolumeInUse, Name: v.Name(), Op: "remove", Refs: refs} - } - - vd, err := volumedrivers.GetDriver(v.DriverName()) - if err != nil { - return &OpErr{Err: err, Name: vd.Name(), Op: "remove"} - } - - logrus.Debugf("Removing volume reference: driver %s, name %s", v.DriverName(), name) - vol := unwrapVolume(v) - if err := vd.Remove(vol); err != nil { - return &OpErr{Err: err, Name: name, Op: "remove"} - } - - s.Purge(name) - return nil -} - -// Dereference removes the specified reference to the volume -func (s *VolumeStore) Dereference(v volume.Volume, ref string) { - s.locks.Lock(v.Name()) - defer s.locks.Unlock(v.Name()) - - s.globalLock.Lock() - defer s.globalLock.Unlock() - var refs []string - - for _, r := range s.refs[v.Name()] { - if r != ref { - refs = append(refs, r) - } - } - s.refs[v.Name()] = refs -} - -// Refs gets the current list of refs for the given volume -func (s *VolumeStore) Refs(v volume.Volume) []string { - s.locks.Lock(v.Name()) - defer s.locks.Unlock(v.Name()) - - refs := s.getRefs(v.Name()) - refsOut := make([]string, len(refs)) - copy(refsOut, refs) - return refsOut -} - -// FilterByDriver returns the available volumes filtered by driver name -func (s *VolumeStore) FilterByDriver(name string) ([]volume.Volume, error) { - vd, err := volumedrivers.GetDriver(name) - if err != nil { - return nil, &OpErr{Err: err, Name: name, Op: "list"} - } - ls, err := vd.List() - if err != nil { - return nil, &OpErr{Err: err, Name: name, Op: "list"} - } - for i, v := range ls { - options := map[string]string{} - s.globalLock.RLock() - for key, value := range s.options[v.Name()] { - options[key] = value - } - ls[i] = volumeWrapper{v, s.labels[v.Name()], vd.Scope(), options} - s.globalLock.RUnlock() - } - return ls, nil -} - -// FilterByUsed returns the available volumes filtered by if they are in use or not. -// `used=true` returns only volumes that are being used, while `used=false` returns -// only volumes that are not being used. -func (s *VolumeStore) FilterByUsed(vols []volume.Volume, used bool) []volume.Volume { - return s.filter(vols, func(v volume.Volume) bool { - s.locks.Lock(v.Name()) - l := len(s.getRefs(v.Name())) - s.locks.Unlock(v.Name()) - if (used && l > 0) || (!used && l == 0) { - return true - } - return false - }) -} - -// filterFunc defines a function to allow filter volumes in the store -type filterFunc func(vol volume.Volume) bool - -// filter returns the available volumes filtered by a filterFunc function -func (s *VolumeStore) filter(vols []volume.Volume, f filterFunc) []volume.Volume { - var ls []volume.Volume - for _, v := range vols { - if f(v) { - ls = append(ls, v) - } - } - return ls -} - -func unwrapVolume(v volume.Volume) volume.Volume { - if vol, ok := v.(volumeWrapper); ok { - return vol.Volume - } - - return v -} - -// Shutdown releases all resources used by the volume store -// It does not make any changes to volumes, drivers, etc. -func (s *VolumeStore) Shutdown() error { - return s.db.Close() -} diff --git a/vendor/github.com/docker/docker/volume/store/store_test.go b/vendor/github.com/docker/docker/volume/store/store_test.go deleted file mode 100644 index b52f720ca..000000000 --- a/vendor/github.com/docker/docker/volume/store/store_test.go +++ /dev/null @@ -1,234 +0,0 @@ -package store - -import ( - "errors" - "io/ioutil" - "os" - "strings" - "testing" - - "github.com/docker/docker/volume/drivers" - volumetestutils "github.com/docker/docker/volume/testutils" -) - -func TestCreate(t *testing.T) { - volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") - defer volumedrivers.Unregister("fake") - dir, err := ioutil.TempDir("", "test-create") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - s, err := New(dir) - if err != nil { - t.Fatal(err) - } - v, err := s.Create("fake1", "fake", nil, nil) - if err != nil { - t.Fatal(err) - } - if v.Name() != "fake1" { - t.Fatalf("Expected fake1 volume, got %v", v) - } - if l, _, _ := s.List(); len(l) != 1 { - t.Fatalf("Expected 1 volume in the store, got %v: %v", len(l), l) - } - - if _, err := s.Create("none", "none", nil, nil); err == nil { - t.Fatalf("Expected unknown driver error, got nil") - } - - _, err = s.Create("fakeerror", "fake", map[string]string{"error": "create error"}, nil) - expected := &OpErr{Op: "create", Name: "fakeerror", Err: errors.New("create error")} - if err != nil && err.Error() != expected.Error() { - t.Fatalf("Expected create fakeError: create error, got %v", err) - } -} - -func TestRemove(t *testing.T) { - volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") - volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop") - defer volumedrivers.Unregister("fake") - defer volumedrivers.Unregister("noop") - dir, err := ioutil.TempDir("", "test-remove") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - s, err := New(dir) - if err != nil { - t.Fatal(err) - } - - // doing string compare here since this error comes directly from the driver - expected := "no such volume" - if err := s.Remove(volumetestutils.NoopVolume{}); err == nil || !strings.Contains(err.Error(), expected) { - t.Fatalf("Expected error %q, got %v", expected, err) - } - - v, err := s.CreateWithRef("fake1", "fake", "fake", nil, nil) - if err != nil { - t.Fatal(err) - } - - if err := s.Remove(v); !IsInUse(err) { - t.Fatalf("Expected ErrVolumeInUse error, got %v", err) - } - s.Dereference(v, "fake") - if err := s.Remove(v); err != nil { - t.Fatal(err) - } - if l, _, _ := s.List(); len(l) != 0 { - t.Fatalf("Expected 0 volumes in the store, got %v, %v", len(l), l) - } -} - -func TestList(t *testing.T) { - volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") - volumedrivers.Register(volumetestutils.NewFakeDriver("fake2"), "fake2") - defer volumedrivers.Unregister("fake") - defer volumedrivers.Unregister("fake2") - dir, err := ioutil.TempDir("", "test-list") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - s, err := New(dir) - if err != nil { - t.Fatal(err) - } - if _, err := s.Create("test", "fake", nil, nil); err != nil { - t.Fatal(err) - } - if _, err := s.Create("test2", "fake2", nil, nil); err != nil { - t.Fatal(err) - } - - ls, _, err := s.List() - if err != nil { - t.Fatal(err) - } - if len(ls) != 2 { - t.Fatalf("expected 2 volumes, got: %d", len(ls)) - } - if err := s.Shutdown(); err != nil { - t.Fatal(err) - } - - // and again with a new store - s, err = New(dir) - if err != nil { - t.Fatal(err) - } - ls, _, err = s.List() - if err != nil { - t.Fatal(err) - } - if len(ls) != 2 { - t.Fatalf("expected 2 volumes, got: %d", len(ls)) - } -} - -func TestFilterByDriver(t *testing.T) { - volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") - volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop") - defer volumedrivers.Unregister("fake") - defer volumedrivers.Unregister("noop") - dir, err := ioutil.TempDir("", "test-filter-driver") - if err != nil { - t.Fatal(err) - } - s, err := New(dir) - if err != nil { - t.Fatal(err) - } - - if _, err := s.Create("fake1", "fake", nil, nil); err != nil { - t.Fatal(err) - } - if _, err := s.Create("fake2", "fake", nil, nil); err != nil { - t.Fatal(err) - } - if _, err := s.Create("fake3", "noop", nil, nil); err != nil { - t.Fatal(err) - } - - if l, _ := s.FilterByDriver("fake"); len(l) != 2 { - t.Fatalf("Expected 2 volumes, got %v, %v", len(l), l) - } - - if l, _ := s.FilterByDriver("noop"); len(l) != 1 { - t.Fatalf("Expected 1 volume, got %v, %v", len(l), l) - } -} - -func TestFilterByUsed(t *testing.T) { - volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") - volumedrivers.Register(volumetestutils.NewFakeDriver("noop"), "noop") - dir, err := ioutil.TempDir("", "test-filter-used") - if err != nil { - t.Fatal(err) - } - - s, err := New(dir) - if err != nil { - t.Fatal(err) - } - - if _, err := s.CreateWithRef("fake1", "fake", "volReference", nil, nil); err != nil { - t.Fatal(err) - } - if _, err := s.Create("fake2", "fake", nil, nil); err != nil { - t.Fatal(err) - } - - vols, _, err := s.List() - if err != nil { - t.Fatal(err) - } - - dangling := s.FilterByUsed(vols, false) - if len(dangling) != 1 { - t.Fatalf("expected 1 danging volume, got %v", len(dangling)) - } - if dangling[0].Name() != "fake2" { - t.Fatalf("expected danging volume fake2, got %s", dangling[0].Name()) - } - - used := s.FilterByUsed(vols, true) - if len(used) != 1 { - t.Fatalf("expected 1 used volume, got %v", len(used)) - } - if used[0].Name() != "fake1" { - t.Fatalf("expected used volume fake1, got %s", used[0].Name()) - } -} - -func TestDerefMultipleOfSameRef(t *testing.T) { - volumedrivers.Register(volumetestutils.NewFakeDriver("fake"), "fake") - dir, err := ioutil.TempDir("", "test-same-deref") - if err != nil { - t.Fatal(err) - } - - s, err := New(dir) - if err != nil { - t.Fatal(err) - } - - v, err := s.CreateWithRef("fake1", "fake", "volReference", nil, nil) - if err != nil { - t.Fatal(err) - } - - if _, err := s.GetWithRef("fake1", "fake", "volReference"); err != nil { - t.Fatal(err) - } - - s.Dereference(v, "volReference") - if err := s.Remove(v); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/docker/docker/volume/store/store_unix.go b/vendor/github.com/docker/docker/volume/store/store_unix.go deleted file mode 100644 index 8ebc1f20c..000000000 --- a/vendor/github.com/docker/docker/volume/store/store_unix.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build linux freebsd solaris - -package store - -// normaliseVolumeName is a platform specific function to normalise the name -// of a volume. This is a no-op on Unix-like platforms -func normaliseVolumeName(name string) string { - return name -} diff --git a/vendor/github.com/docker/docker/volume/store/store_windows.go b/vendor/github.com/docker/docker/volume/store/store_windows.go deleted file mode 100644 index 8601cdd5c..000000000 --- a/vendor/github.com/docker/docker/volume/store/store_windows.go +++ /dev/null @@ -1,12 +0,0 @@ -package store - -import "strings" - -// normaliseVolumeName is a platform specific function to normalise the name -// of a volume. On Windows, as NTFS is case insensitive, under -// c:\ProgramData\Docker\Volumes\, the folders John and john would be synonymous. -// Hence we can't allow the volume "John" and "john" to be created as separate -// volumes. -func normaliseVolumeName(name string) string { - return strings.ToLower(name) -} diff --git a/vendor/github.com/docker/docker/volume/testutils/testutils.go b/vendor/github.com/docker/docker/volume/testutils/testutils.go deleted file mode 100644 index 2dbac02fd..000000000 --- a/vendor/github.com/docker/docker/volume/testutils/testutils.go +++ /dev/null @@ -1,116 +0,0 @@ -package testutils - -import ( - "fmt" - - "github.com/docker/docker/volume" -) - -// NoopVolume is a volume that doesn't perform any operation -type NoopVolume struct{} - -// Name is the name of the volume -func (NoopVolume) Name() string { return "noop" } - -// DriverName is the name of the driver -func (NoopVolume) DriverName() string { return "noop" } - -// Path is the filesystem path to the volume -func (NoopVolume) Path() string { return "noop" } - -// Mount mounts the volume in the container -func (NoopVolume) Mount(_ string) (string, error) { return "noop", nil } - -// Unmount unmounts the volume from the container -func (NoopVolume) Unmount(_ string) error { return nil } - -// Status proivdes low-level details about the volume -func (NoopVolume) Status() map[string]interface{} { return nil } - -// FakeVolume is a fake volume with a random name -type FakeVolume struct { - name string - driverName string -} - -// NewFakeVolume creates a new fake volume for testing -func NewFakeVolume(name string, driverName string) volume.Volume { - return FakeVolume{name: name, driverName: driverName} -} - -// Name is the name of the volume -func (f FakeVolume) Name() string { return f.name } - -// DriverName is the name of the driver -func (f FakeVolume) DriverName() string { return f.driverName } - -// Path is the filesystem path to the volume -func (FakeVolume) Path() string { return "fake" } - -// Mount mounts the volume in the container -func (FakeVolume) Mount(_ string) (string, error) { return "fake", nil } - -// Unmount unmounts the volume from the container -func (FakeVolume) Unmount(_ string) error { return nil } - -// Status proivdes low-level details about the volume -func (FakeVolume) Status() map[string]interface{} { return nil } - -// FakeDriver is a driver that generates fake volumes -type FakeDriver struct { - name string - vols map[string]volume.Volume -} - -// NewFakeDriver creates a new FakeDriver with the specified name -func NewFakeDriver(name string) volume.Driver { - return &FakeDriver{ - name: name, - vols: make(map[string]volume.Volume), - } -} - -// Name is the name of the driver -func (d *FakeDriver) Name() string { return d.name } - -// Create initializes a fake volume. -// It returns an error if the options include an "error" key with a message -func (d *FakeDriver) Create(name string, opts map[string]string) (volume.Volume, error) { - if opts != nil && opts["error"] != "" { - return nil, fmt.Errorf(opts["error"]) - } - v := NewFakeVolume(name, d.name) - d.vols[name] = v - return v, nil -} - -// Remove deletes a volume. -func (d *FakeDriver) Remove(v volume.Volume) error { - if _, exists := d.vols[v.Name()]; !exists { - return fmt.Errorf("no such volume") - } - delete(d.vols, v.Name()) - return nil -} - -// List lists the volumes -func (d *FakeDriver) List() ([]volume.Volume, error) { - var vols []volume.Volume - for _, v := range d.vols { - vols = append(vols, v) - } - return vols, nil -} - -// Get gets the volume -func (d *FakeDriver) Get(name string) (volume.Volume, error) { - if v, exists := d.vols[name]; exists { - return v, nil - } - return nil, fmt.Errorf("no such volume") -} - -// Scope returns the local scope -func (*FakeDriver) Scope() string { - return "local" -} diff --git a/vendor/github.com/docker/docker/volume/validate.go b/vendor/github.com/docker/docker/volume/validate.go deleted file mode 100644 index 27a8c5d5b..000000000 --- a/vendor/github.com/docker/docker/volume/validate.go +++ /dev/null @@ -1,125 +0,0 @@ -package volume - -import ( - "errors" - "fmt" - "os" - "path/filepath" - - "github.com/docker/docker/api/types/mount" -) - -var errBindNotExist = errors.New("bind source path does not exist") - -type validateOpts struct { - skipBindSourceCheck bool - skipAbsolutePathCheck bool -} - -func validateMountConfig(mnt *mount.Mount, options ...func(*validateOpts)) error { - opts := validateOpts{} - for _, o := range options { - o(&opts) - } - - if len(mnt.Target) == 0 { - return &errMountConfig{mnt, errMissingField("Target")} - } - - if err := validateNotRoot(mnt.Target); err != nil { - return &errMountConfig{mnt, err} - } - - if !opts.skipAbsolutePathCheck { - if err := validateAbsolute(mnt.Target); err != nil { - return &errMountConfig{mnt, err} - } - } - - switch mnt.Type { - case mount.TypeBind: - if len(mnt.Source) == 0 { - return &errMountConfig{mnt, errMissingField("Source")} - } - // Don't error out just because the propagation mode is not supported on the platform - if opts := mnt.BindOptions; opts != nil { - if len(opts.Propagation) > 0 && len(propagationModes) > 0 { - if _, ok := propagationModes[opts.Propagation]; !ok { - return &errMountConfig{mnt, fmt.Errorf("invalid propagation mode: %s", opts.Propagation)} - } - } - } - if mnt.VolumeOptions != nil { - return &errMountConfig{mnt, errExtraField("VolumeOptions")} - } - - if err := validateAbsolute(mnt.Source); err != nil { - return &errMountConfig{mnt, err} - } - - // Do not allow binding to non-existent path - if !opts.skipBindSourceCheck { - fi, err := os.Stat(mnt.Source) - if err != nil { - if !os.IsNotExist(err) { - return &errMountConfig{mnt, err} - } - return &errMountConfig{mnt, errBindNotExist} - } - if err := validateStat(fi); err != nil { - return &errMountConfig{mnt, err} - } - } - case mount.TypeVolume: - if mnt.BindOptions != nil { - return &errMountConfig{mnt, errExtraField("BindOptions")} - } - - if len(mnt.Source) == 0 && mnt.ReadOnly { - return &errMountConfig{mnt, fmt.Errorf("must not set ReadOnly mode when using anonymous volumes")} - } - - if len(mnt.Source) != 0 { - if valid, err := IsVolumeNameValid(mnt.Source); !valid { - if err == nil { - err = errors.New("invalid volume name") - } - return &errMountConfig{mnt, err} - } - } - case mount.TypeTmpfs: - if len(mnt.Source) != 0 { - return &errMountConfig{mnt, errExtraField("Source")} - } - if _, err := ConvertTmpfsOptions(mnt.TmpfsOptions, mnt.ReadOnly); err != nil { - return &errMountConfig{mnt, err} - } - default: - return &errMountConfig{mnt, errors.New("mount type unknown")} - } - return nil -} - -type errMountConfig struct { - mount *mount.Mount - err error -} - -func (e *errMountConfig) Error() string { - return fmt.Sprintf("invalid mount config for type %q: %v", e.mount.Type, e.err.Error()) -} - -func errExtraField(name string) error { - return fmt.Errorf("field %s must not be specified", name) -} -func errMissingField(name string) error { - return fmt.Errorf("field %s must not be empty", name) -} - -func validateAbsolute(p string) error { - p = convertSlash(p) - if filepath.IsAbs(p) { - return nil - } - return fmt.Errorf("invalid mount path: '%s' mount path must be absolute", p) -} diff --git a/vendor/github.com/docker/docker/volume/validate_test.go b/vendor/github.com/docker/docker/volume/validate_test.go deleted file mode 100644 index 8732500fc..000000000 --- a/vendor/github.com/docker/docker/volume/validate_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package volume - -import ( - "errors" - "io/ioutil" - "os" - "strings" - "testing" - - "github.com/docker/docker/api/types/mount" -) - -func TestValidateMount(t *testing.T) { - testDir, err := ioutil.TempDir("", "test-validate-mount") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(testDir) - - cases := []struct { - input mount.Mount - expected error - }{ - {mount.Mount{Type: mount.TypeVolume}, errMissingField("Target")}, - {mount.Mount{Type: mount.TypeVolume, Target: testDestinationPath, Source: "hello"}, nil}, - {mount.Mount{Type: mount.TypeVolume, Target: testDestinationPath}, nil}, - {mount.Mount{Type: mount.TypeBind}, errMissingField("Target")}, - {mount.Mount{Type: mount.TypeBind, Target: testDestinationPath}, errMissingField("Source")}, - {mount.Mount{Type: mount.TypeBind, Target: testDestinationPath, Source: testSourcePath, VolumeOptions: &mount.VolumeOptions{}}, errExtraField("VolumeOptions")}, - {mount.Mount{Type: mount.TypeBind, Source: testSourcePath, Target: testDestinationPath}, errBindNotExist}, - {mount.Mount{Type: mount.TypeBind, Source: testDir, Target: testDestinationPath}, nil}, - {mount.Mount{Type: "invalid", Target: testDestinationPath}, errors.New("mount type unknown")}, - } - for i, x := range cases { - err := validateMountConfig(&x.input) - if err == nil && x.expected == nil { - continue - } - if (err == nil && x.expected != nil) || (x.expected == nil && err != nil) || !strings.Contains(err.Error(), x.expected.Error()) { - t.Fatalf("expected %q, got %q, case: %d", x.expected, err, i) - } - } -} diff --git a/vendor/github.com/docker/docker/volume/validate_test_unix.go b/vendor/github.com/docker/docker/volume/validate_test_unix.go deleted file mode 100644 index dd1de2f64..000000000 --- a/vendor/github.com/docker/docker/volume/validate_test_unix.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !windows - -package volume - -var ( - testDestinationPath = "/foo" - testSourcePath = "/foo" -) diff --git a/vendor/github.com/docker/docker/volume/validate_test_windows.go b/vendor/github.com/docker/docker/volume/validate_test_windows.go deleted file mode 100644 index d5f86ac85..000000000 --- a/vendor/github.com/docker/docker/volume/validate_test_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -package volume - -var ( - testDestinationPath = `c:\foo` - testSourcePath = `c:\foo` -) diff --git a/vendor/github.com/docker/docker/volume/volume.go b/vendor/github.com/docker/docker/volume/volume.go deleted file mode 100644 index f3227fe48..000000000 --- a/vendor/github.com/docker/docker/volume/volume.go +++ /dev/null @@ -1,323 +0,0 @@ -package volume - -import ( - "fmt" - "os" - "path/filepath" - "strings" - "syscall" - - mounttypes "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/pkg/idtools" - "github.com/docker/docker/pkg/stringid" - "github.com/opencontainers/runc/libcontainer/label" - "github.com/pkg/errors" -) - -// DefaultDriverName is the driver name used for the driver -// implemented in the local package. -const DefaultDriverName = "local" - -// Scopes define if a volume has is cluster-wide (global) or local only. -// Scopes are returned by the volume driver when it is queried for capabilities and then set on a volume -const ( - LocalScope = "local" - GlobalScope = "global" -) - -// Driver is for creating and removing volumes. -type Driver interface { - // Name returns the name of the volume driver. - Name() string - // Create makes a new volume with the given id. - Create(name string, opts map[string]string) (Volume, error) - // Remove deletes the volume. - Remove(vol Volume) (err error) - // List lists all the volumes the driver has - List() ([]Volume, error) - // Get retrieves the volume with the requested name - Get(name string) (Volume, error) - // Scope returns the scope of the driver (e.g. `global` or `local`). - // Scope determines how the driver is handled at a cluster level - Scope() string -} - -// Capability defines a set of capabilities that a driver is able to handle. -type Capability struct { - // Scope is the scope of the driver, `global` or `local` - // A `global` scope indicates that the driver manages volumes across the cluster - // A `local` scope indicates that the driver only manages volumes resources local to the host - // Scope is declared by the driver - Scope string -} - -// Volume is a place to store data. It is backed by a specific driver, and can be mounted. -type Volume interface { - // Name returns the name of the volume - Name() string - // DriverName returns the name of the driver which owns this volume. - DriverName() string - // Path returns the absolute path to the volume. - Path() string - // Mount mounts the volume and returns the absolute path to - // where it can be consumed. - Mount(id string) (string, error) - // Unmount unmounts the volume when it is no longer in use. - Unmount(id string) error - // Status returns low-level status information about a volume - Status() map[string]interface{} -} - -// DetailedVolume wraps a Volume with user-defined labels, options, and cluster scope (e.g., `local` or `global`) -type DetailedVolume interface { - Labels() map[string]string - Options() map[string]string - Scope() string - Volume -} - -// MountPoint is the intersection point between a volume and a container. It -// specifies which volume is to be used and where inside a container it should -// be mounted. -type MountPoint struct { - // Source is the source path of the mount. - // E.g. `mount --bind /foo /bar`, `/foo` is the `Source`. - Source string - // Destination is the path relative to the container root (`/`) to the mount point - // It is where the `Source` is mounted to - Destination string - // RW is set to true when the mountpoint should be mounted as read-write - RW bool - // Name is the name reference to the underlying data defined by `Source` - // e.g., the volume name - Name string - // Driver is the volume driver used to create the volume (if it is a volume) - Driver string - // Type of mount to use, see `Type` definitions in github.com/docker/docker/api/types/mount - Type mounttypes.Type `json:",omitempty"` - // Volume is the volume providing data to this mountpoint. - // This is nil unless `Type` is set to `TypeVolume` - Volume Volume `json:"-"` - - // Mode is the comma separated list of options supplied by the user when creating - // the bind/volume mount. - // Note Mode is not used on Windows - Mode string `json:"Relabel,omitempty"` // Originally field was `Relabel`" - - // Propagation describes how the mounts are propagated from the host into the - // mount point, and vice-versa. - // See https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt - // Note Propagation is not used on Windows - Propagation mounttypes.Propagation `json:",omitempty"` // Mount propagation string - - // Specifies if data should be copied from the container before the first mount - // Use a pointer here so we can tell if the user set this value explicitly - // This allows us to error out when the user explicitly enabled copy but we can't copy due to the volume being populated - CopyData bool `json:"-"` - // ID is the opaque ID used to pass to the volume driver. - // This should be set by calls to `Mount` and unset by calls to `Unmount` - ID string `json:",omitempty"` - - // Sepc is a copy of the API request that created this mount. - Spec mounttypes.Mount -} - -// Setup sets up a mount point by either mounting the volume if it is -// configured, or creating the source directory if supplied. -func (m *MountPoint) Setup(mountLabel string, rootUID, rootGID int) (string, error) { - if m.Volume != nil { - id := m.ID - if id == "" { - id = stringid.GenerateNonCryptoID() - } - path, err := m.Volume.Mount(id) - if err != nil { - return "", errors.Wrapf(err, "error while mounting volume '%s'", m.Source) - } - m.ID = id - return path, nil - } - if len(m.Source) == 0 { - return "", fmt.Errorf("Unable to setup mount point, neither source nor volume defined") - } - // system.MkdirAll() produces an error if m.Source exists and is a file (not a directory), - if m.Type == mounttypes.TypeBind { - // idtools.MkdirAllNewAs() produces an error if m.Source exists and is a file (not a directory) - // also, makes sure that if the directory is created, the correct remapped rootUID/rootGID will own it - if err := idtools.MkdirAllNewAs(m.Source, 0755, rootUID, rootGID); err != nil { - if perr, ok := err.(*os.PathError); ok { - if perr.Err != syscall.ENOTDIR { - return "", errors.Wrapf(err, "error while creating mount source path '%s'", m.Source) - } - } - } - } - if label.RelabelNeeded(m.Mode) { - if err := label.Relabel(m.Source, mountLabel, label.IsShared(m.Mode)); err != nil { - return "", errors.Wrapf(err, "error setting label on mount source '%s'", m.Source) - } - } - return m.Source, nil -} - -// Path returns the path of a volume in a mount point. -func (m *MountPoint) Path() string { - if m.Volume != nil { - return m.Volume.Path() - } - return m.Source -} - -// ParseVolumesFrom ensures that the supplied volumes-from is valid. -func ParseVolumesFrom(spec string) (string, string, error) { - if len(spec) == 0 { - return "", "", fmt.Errorf("volumes-from specification cannot be an empty string") - } - - specParts := strings.SplitN(spec, ":", 2) - id := specParts[0] - mode := "rw" - - if len(specParts) == 2 { - mode = specParts[1] - if !ValidMountMode(mode) { - return "", "", errInvalidMode(mode) - } - // For now don't allow propagation properties while importing - // volumes from data container. These volumes will inherit - // the same propagation property as of the original volume - // in data container. This probably can be relaxed in future. - if HasPropagation(mode) { - return "", "", errInvalidMode(mode) - } - // Do not allow copy modes on volumes-from - if _, isSet := getCopyMode(mode); isSet { - return "", "", errInvalidMode(mode) - } - } - return id, mode, nil -} - -// ParseMountRaw parses a raw volume spec (e.g. `-v /foo:/bar:shared`) into a -// structured spec. Once the raw spec is parsed it relies on `ParseMountSpec` to -// validate the spec and create a MountPoint -func ParseMountRaw(raw, volumeDriver string) (*MountPoint, error) { - arr, err := splitRawSpec(convertSlash(raw)) - if err != nil { - return nil, err - } - - var spec mounttypes.Mount - var mode string - switch len(arr) { - case 1: - // Just a destination path in the container - spec.Target = arr[0] - case 2: - if ValidMountMode(arr[1]) { - // Destination + Mode is not a valid volume - volumes - // cannot include a mode. eg /foo:rw - return nil, errInvalidSpec(raw) - } - // Host Source Path or Name + Destination - spec.Source = arr[0] - spec.Target = arr[1] - case 3: - // HostSourcePath+DestinationPath+Mode - spec.Source = arr[0] - spec.Target = arr[1] - mode = arr[2] - default: - return nil, errInvalidSpec(raw) - } - - if !ValidMountMode(mode) { - return nil, errInvalidMode(mode) - } - - if filepath.IsAbs(spec.Source) { - spec.Type = mounttypes.TypeBind - } else { - spec.Type = mounttypes.TypeVolume - } - - spec.ReadOnly = !ReadWrite(mode) - - // cannot assume that if a volume driver is passed in that we should set it - if volumeDriver != "" && spec.Type == mounttypes.TypeVolume { - spec.VolumeOptions = &mounttypes.VolumeOptions{ - DriverConfig: &mounttypes.Driver{Name: volumeDriver}, - } - } - - if copyData, isSet := getCopyMode(mode); isSet { - if spec.VolumeOptions == nil { - spec.VolumeOptions = &mounttypes.VolumeOptions{} - } - spec.VolumeOptions.NoCopy = !copyData - } - if HasPropagation(mode) { - spec.BindOptions = &mounttypes.BindOptions{ - Propagation: GetPropagation(mode), - } - } - - mp, err := ParseMountSpec(spec, platformRawValidationOpts...) - if mp != nil { - mp.Mode = mode - } - if err != nil { - err = fmt.Errorf("%v: %v", errInvalidSpec(raw), err) - } - return mp, err -} - -// ParseMountSpec reads a mount config, validates it, and configures a mountpoint from it. -func ParseMountSpec(cfg mounttypes.Mount, options ...func(*validateOpts)) (*MountPoint, error) { - if err := validateMountConfig(&cfg, options...); err != nil { - return nil, err - } - mp := &MountPoint{ - RW: !cfg.ReadOnly, - Destination: clean(convertSlash(cfg.Target)), - Type: cfg.Type, - Spec: cfg, - } - - switch cfg.Type { - case mounttypes.TypeVolume: - if cfg.Source == "" { - mp.Name = stringid.GenerateNonCryptoID() - } else { - mp.Name = cfg.Source - } - mp.CopyData = DefaultCopyMode - - if cfg.VolumeOptions != nil { - if cfg.VolumeOptions.DriverConfig != nil { - mp.Driver = cfg.VolumeOptions.DriverConfig.Name - } - if cfg.VolumeOptions.NoCopy { - mp.CopyData = false - } - } - case mounttypes.TypeBind: - mp.Source = clean(convertSlash(cfg.Source)) - if cfg.BindOptions != nil { - if len(cfg.BindOptions.Propagation) > 0 { - mp.Propagation = cfg.BindOptions.Propagation - } - } - case mounttypes.TypeTmpfs: - // NOP - } - return mp, nil -} - -func errInvalidMode(mode string) error { - return fmt.Errorf("invalid mode: %v", mode) -} - -func errInvalidSpec(spec string) error { - return fmt.Errorf("invalid volume specification: '%s'", spec) -} diff --git a/vendor/github.com/docker/docker/volume/volume_copy.go b/vendor/github.com/docker/docker/volume/volume_copy.go deleted file mode 100644 index 77f06a0d1..000000000 --- a/vendor/github.com/docker/docker/volume/volume_copy.go +++ /dev/null @@ -1,23 +0,0 @@ -package volume - -import "strings" - -// {=isEnabled} -var copyModes = map[string]bool{ - "nocopy": false, -} - -func copyModeExists(mode string) bool { - _, exists := copyModes[mode] - return exists -} - -// GetCopyMode gets the copy mode from the mode string for mounts -func getCopyMode(mode string) (bool, bool) { - for _, o := range strings.Split(mode, ",") { - if isEnabled, exists := copyModes[o]; exists { - return isEnabled, true - } - } - return DefaultCopyMode, false -} diff --git a/vendor/github.com/docker/docker/volume/volume_copy_unix.go b/vendor/github.com/docker/docker/volume/volume_copy_unix.go deleted file mode 100644 index ad66e1763..000000000 --- a/vendor/github.com/docker/docker/volume/volume_copy_unix.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !windows - -package volume - -const ( - // DefaultCopyMode is the copy mode used by default for normal/named volumes - DefaultCopyMode = true -) diff --git a/vendor/github.com/docker/docker/volume/volume_copy_windows.go b/vendor/github.com/docker/docker/volume/volume_copy_windows.go deleted file mode 100644 index 798638c87..000000000 --- a/vendor/github.com/docker/docker/volume/volume_copy_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -package volume - -const ( - // DefaultCopyMode is the copy mode used by default for normal/named volumes - DefaultCopyMode = false -) diff --git a/vendor/github.com/docker/docker/volume/volume_linux.go b/vendor/github.com/docker/docker/volume/volume_linux.go deleted file mode 100644 index d4b4d800b..000000000 --- a/vendor/github.com/docker/docker/volume/volume_linux.go +++ /dev/null @@ -1,56 +0,0 @@ -// +build linux - -package volume - -import ( - "fmt" - "strings" - - mounttypes "github.com/docker/docker/api/types/mount" -) - -// ConvertTmpfsOptions converts *mounttypes.TmpfsOptions to the raw option string -// for mount(2). -func ConvertTmpfsOptions(opt *mounttypes.TmpfsOptions, readOnly bool) (string, error) { - var rawOpts []string - if readOnly { - rawOpts = append(rawOpts, "ro") - } - - if opt != nil && opt.Mode != 0 { - rawOpts = append(rawOpts, fmt.Sprintf("mode=%o", opt.Mode)) - } - - if opt != nil && opt.SizeBytes != 0 { - // calculate suffix here, making this linux specific, but that is - // okay, since API is that way anyways. - - // we do this by finding the suffix that divides evenly into the - // value, returing the value itself, with no suffix, if it fails. - // - // For the most part, we don't enforce any semantic to this values. - // The operating system will usually align this and enforce minimum - // and maximums. - var ( - size = opt.SizeBytes - suffix string - ) - for _, r := range []struct { - suffix string - divisor int64 - }{ - {"g", 1 << 30}, - {"m", 1 << 20}, - {"k", 1 << 10}, - } { - if size%r.divisor == 0 { - size = size / r.divisor - suffix = r.suffix - break - } - } - - rawOpts = append(rawOpts, fmt.Sprintf("size=%d%s", size, suffix)) - } - return strings.Join(rawOpts, ","), nil -} diff --git a/vendor/github.com/docker/docker/volume/volume_linux_test.go b/vendor/github.com/docker/docker/volume/volume_linux_test.go deleted file mode 100644 index 40ce5525a..000000000 --- a/vendor/github.com/docker/docker/volume/volume_linux_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// +build linux - -package volume - -import ( - "strings" - "testing" - - mounttypes "github.com/docker/docker/api/types/mount" -) - -func TestConvertTmpfsOptions(t *testing.T) { - type testCase struct { - opt mounttypes.TmpfsOptions - readOnly bool - expectedSubstrings []string - unexpectedSubstrings []string - } - cases := []testCase{ - { - opt: mounttypes.TmpfsOptions{SizeBytes: 1024 * 1024, Mode: 0700}, - readOnly: false, - expectedSubstrings: []string{"size=1m", "mode=700"}, - unexpectedSubstrings: []string{"ro"}, - }, - { - opt: mounttypes.TmpfsOptions{}, - readOnly: true, - expectedSubstrings: []string{"ro"}, - unexpectedSubstrings: []string{}, - }, - } - for _, c := range cases { - data, err := ConvertTmpfsOptions(&c.opt, c.readOnly) - if err != nil { - t.Fatalf("could not convert %+v (readOnly: %v) to string: %v", - c.opt, c.readOnly, err) - } - t.Logf("data=%q", data) - for _, s := range c.expectedSubstrings { - if !strings.Contains(data, s) { - t.Fatalf("expected substring: %s, got %v (case=%+v)", s, data, c) - } - } - for _, s := range c.unexpectedSubstrings { - if strings.Contains(data, s) { - t.Fatalf("unexpected substring: %s, got %v (case=%+v)", s, data, c) - } - } - } -} diff --git a/vendor/github.com/docker/docker/volume/volume_propagation_linux.go b/vendor/github.com/docker/docker/volume/volume_propagation_linux.go deleted file mode 100644 index 1de57ab52..000000000 --- a/vendor/github.com/docker/docker/volume/volume_propagation_linux.go +++ /dev/null @@ -1,47 +0,0 @@ -// +build linux - -package volume - -import ( - "strings" - - mounttypes "github.com/docker/docker/api/types/mount" -) - -// DefaultPropagationMode defines what propagation mode should be used by -// default if user has not specified one explicitly. -// propagation modes -const DefaultPropagationMode = mounttypes.PropagationRPrivate - -var propagationModes = map[mounttypes.Propagation]bool{ - mounttypes.PropagationPrivate: true, - mounttypes.PropagationRPrivate: true, - mounttypes.PropagationSlave: true, - mounttypes.PropagationRSlave: true, - mounttypes.PropagationShared: true, - mounttypes.PropagationRShared: true, -} - -// GetPropagation extracts and returns the mount propagation mode. If there -// are no specifications, then by default it is "private". -func GetPropagation(mode string) mounttypes.Propagation { - for _, o := range strings.Split(mode, ",") { - prop := mounttypes.Propagation(o) - if propagationModes[prop] { - return prop - } - } - return DefaultPropagationMode -} - -// HasPropagation checks if there is a valid propagation mode present in -// passed string. Returns true if a valid propagation mode specifier is -// present, false otherwise. -func HasPropagation(mode string) bool { - for _, o := range strings.Split(mode, ",") { - if propagationModes[mounttypes.Propagation(o)] { - return true - } - } - return false -} diff --git a/vendor/github.com/docker/docker/volume/volume_propagation_linux_test.go b/vendor/github.com/docker/docker/volume/volume_propagation_linux_test.go deleted file mode 100644 index 46d026506..000000000 --- a/vendor/github.com/docker/docker/volume/volume_propagation_linux_test.go +++ /dev/null @@ -1,65 +0,0 @@ -// +build linux - -package volume - -import ( - "strings" - "testing" -) - -func TestParseMountRawPropagation(t *testing.T) { - var ( - valid []string - invalid map[string]string - ) - - valid = []string{ - "/hostPath:/containerPath:shared", - "/hostPath:/containerPath:rshared", - "/hostPath:/containerPath:slave", - "/hostPath:/containerPath:rslave", - "/hostPath:/containerPath:private", - "/hostPath:/containerPath:rprivate", - "/hostPath:/containerPath:ro,shared", - "/hostPath:/containerPath:ro,slave", - "/hostPath:/containerPath:ro,private", - "/hostPath:/containerPath:ro,z,shared", - "/hostPath:/containerPath:ro,Z,slave", - "/hostPath:/containerPath:Z,ro,slave", - "/hostPath:/containerPath:slave,Z,ro", - "/hostPath:/containerPath:Z,slave,ro", - "/hostPath:/containerPath:slave,ro,Z", - "/hostPath:/containerPath:rslave,ro,Z", - "/hostPath:/containerPath:ro,rshared,Z", - "/hostPath:/containerPath:ro,Z,rprivate", - } - invalid = map[string]string{ - "/path:/path:ro,rshared,rslave": `invalid mode`, - "/path:/path:ro,z,rshared,rslave": `invalid mode`, - "/path:shared": "invalid volume specification", - "/path:slave": "invalid volume specification", - "/path:private": "invalid volume specification", - "name:/absolute-path:shared": "invalid volume specification", - "name:/absolute-path:rshared": "invalid volume specification", - "name:/absolute-path:slave": "invalid volume specification", - "name:/absolute-path:rslave": "invalid volume specification", - "name:/absolute-path:private": "invalid volume specification", - "name:/absolute-path:rprivate": "invalid volume specification", - } - - for _, path := range valid { - if _, err := ParseMountRaw(path, "local"); err != nil { - t.Fatalf("ParseMountRaw(`%q`) should succeed: error %q", path, err) - } - } - - for path, expectedError := range invalid { - if _, err := ParseMountRaw(path, "local"); err == nil { - t.Fatalf("ParseMountRaw(`%q`) should have failed validation. Err %v", path, err) - } else { - if !strings.Contains(err.Error(), expectedError) { - t.Fatalf("ParseMountRaw(`%q`) error should contain %q, got %v", path, expectedError, err.Error()) - } - } - } -} diff --git a/vendor/github.com/docker/docker/volume/volume_propagation_unsupported.go b/vendor/github.com/docker/docker/volume/volume_propagation_unsupported.go deleted file mode 100644 index 7311ffc2e..000000000 --- a/vendor/github.com/docker/docker/volume/volume_propagation_unsupported.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build !linux - -package volume - -import mounttypes "github.com/docker/docker/api/types/mount" - -// DefaultPropagationMode is used only in linux. In other cases it returns -// empty string. -const DefaultPropagationMode mounttypes.Propagation = "" - -// propagation modes not supported on this platform. -var propagationModes = map[mounttypes.Propagation]bool{} - -// GetPropagation is not supported. Return empty string. -func GetPropagation(mode string) mounttypes.Propagation { - return DefaultPropagationMode -} - -// HasPropagation checks if there is a valid propagation mode present in -// passed string. Returns true if a valid propagation mode specifier is -// present, false otherwise. -func HasPropagation(mode string) bool { - return false -} diff --git a/vendor/github.com/docker/docker/volume/volume_test.go b/vendor/github.com/docker/docker/volume/volume_test.go deleted file mode 100644 index 54df38053..000000000 --- a/vendor/github.com/docker/docker/volume/volume_test.go +++ /dev/null @@ -1,269 +0,0 @@ -package volume - -import ( - "io/ioutil" - "os" - "runtime" - "strings" - "testing" - - "github.com/docker/docker/api/types/mount" -) - -func TestParseMountRaw(t *testing.T) { - var ( - valid []string - invalid map[string]string - ) - - if runtime.GOOS == "windows" { - valid = []string{ - `d:\`, - `d:`, - `d:\path`, - `d:\path with space`, - // TODO Windows post TP5 - readonly support `d:\pathandmode:ro`, - `c:\:d:\`, - `c:\windows\:d:`, - `c:\windows:d:\s p a c e`, - `c:\windows:d:\s p a c e:RW`, - `c:\program files:d:\s p a c e i n h o s t d i r`, - `0123456789name:d:`, - `MiXeDcAsEnAmE:d:`, - `name:D:`, - `name:D::rW`, - `name:D::RW`, - // TODO Windows post TP5 - readonly support `name:D::RO`, - `c:/:d:/forward/slashes/are/good/too`, - // TODO Windows post TP5 - readonly support `c:/:d:/including with/spaces:ro`, - `c:\Windows`, // With capital - `c:\Program Files (x86)`, // With capitals and brackets - } - invalid = map[string]string{ - ``: "invalid volume specification: ", - `.`: "invalid volume specification: ", - `..\`: "invalid volume specification: ", - `c:\:..\`: "invalid volume specification: ", - `c:\:d:\:xyzzy`: "invalid volume specification: ", - `c:`: "cannot be `c:`", - `c:\`: "cannot be `c:`", - `c:\notexist:d:`: `source path does not exist`, - `c:\windows\system32\ntdll.dll:d:`: `source path must be a directory`, - `name<:d:`: `invalid volume specification`, - `name>:d:`: `invalid volume specification`, - `name::d:`: `invalid volume specification`, - `name":d:`: `invalid volume specification`, - `name\:d:`: `invalid volume specification`, - `name*:d:`: `invalid volume specification`, - `name|:d:`: `invalid volume specification`, - `name?:d:`: `invalid volume specification`, - `name/:d:`: `invalid volume specification`, - `d:\pathandmode:rw`: `invalid volume specification`, - `con:d:`: `cannot be a reserved word for Windows filenames`, - `PRN:d:`: `cannot be a reserved word for Windows filenames`, - `aUx:d:`: `cannot be a reserved word for Windows filenames`, - `nul:d:`: `cannot be a reserved word for Windows filenames`, - `com1:d:`: `cannot be a reserved word for Windows filenames`, - `com2:d:`: `cannot be a reserved word for Windows filenames`, - `com3:d:`: `cannot be a reserved word for Windows filenames`, - `com4:d:`: `cannot be a reserved word for Windows filenames`, - `com5:d:`: `cannot be a reserved word for Windows filenames`, - `com6:d:`: `cannot be a reserved word for Windows filenames`, - `com7:d:`: `cannot be a reserved word for Windows filenames`, - `com8:d:`: `cannot be a reserved word for Windows filenames`, - `com9:d:`: `cannot be a reserved word for Windows filenames`, - `lpt1:d:`: `cannot be a reserved word for Windows filenames`, - `lpt2:d:`: `cannot be a reserved word for Windows filenames`, - `lpt3:d:`: `cannot be a reserved word for Windows filenames`, - `lpt4:d:`: `cannot be a reserved word for Windows filenames`, - `lpt5:d:`: `cannot be a reserved word for Windows filenames`, - `lpt6:d:`: `cannot be a reserved word for Windows filenames`, - `lpt7:d:`: `cannot be a reserved word for Windows filenames`, - `lpt8:d:`: `cannot be a reserved word for Windows filenames`, - `lpt9:d:`: `cannot be a reserved word for Windows filenames`, - `c:\windows\system32\ntdll.dll`: `Only directories can be mapped on this platform`, - } - - } else { - valid = []string{ - "/home", - "/home:/home", - "/home:/something/else", - "/with space", - "/home:/with space", - "relative:/absolute-path", - "hostPath:/containerPath:ro", - "/hostPath:/containerPath:rw", - "/rw:/ro", - } - invalid = map[string]string{ - "": "invalid volume specification", - "./": "mount path must be absolute", - "../": "mount path must be absolute", - "/:../": "mount path must be absolute", - "/:path": "mount path must be absolute", - ":": "invalid volume specification", - "/tmp:": "invalid volume specification", - ":test": "invalid volume specification", - ":/test": "invalid volume specification", - "tmp:": "invalid volume specification", - ":test:": "invalid volume specification", - "::": "invalid volume specification", - ":::": "invalid volume specification", - "/tmp:::": "invalid volume specification", - ":/tmp::": "invalid volume specification", - "/path:rw": "invalid volume specification", - "/path:ro": "invalid volume specification", - "/rw:rw": "invalid volume specification", - "path:ro": "invalid volume specification", - "/path:/path:sw": `invalid mode`, - "/path:/path:rwz": `invalid mode`, - } - } - - for _, path := range valid { - if _, err := ParseMountRaw(path, "local"); err != nil { - t.Fatalf("ParseMountRaw(`%q`) should succeed: error %q", path, err) - } - } - - for path, expectedError := range invalid { - if mp, err := ParseMountRaw(path, "local"); err == nil { - t.Fatalf("ParseMountRaw(`%q`) should have failed validation. Err '%v' - MP: %v", path, err, mp) - } else { - if !strings.Contains(err.Error(), expectedError) { - t.Fatalf("ParseMountRaw(`%q`) error should contain %q, got %v", path, expectedError, err.Error()) - } - } - } -} - -// testParseMountRaw is a structure used by TestParseMountRawSplit for -// specifying test cases for the ParseMountRaw() function. -type testParseMountRaw struct { - bind string - driver string - expDest string - expSource string - expName string - expDriver string - expRW bool - fail bool -} - -func TestParseMountRawSplit(t *testing.T) { - var cases []testParseMountRaw - if runtime.GOOS == "windows" { - cases = []testParseMountRaw{ - {`c:\:d:`, "local", `d:`, `c:\`, ``, "", true, false}, - {`c:\:d:\`, "local", `d:\`, `c:\`, ``, "", true, false}, - // TODO Windows post TP5 - Add readonly support {`c:\:d:\:ro`, "local", `d:\`, `c:\`, ``, "", false, false}, - {`c:\:d:\:rw`, "local", `d:\`, `c:\`, ``, "", true, false}, - {`c:\:d:\:foo`, "local", `d:\`, `c:\`, ``, "", false, true}, - {`name:d::rw`, "local", `d:`, ``, `name`, "local", true, false}, - {`name:d:`, "local", `d:`, ``, `name`, "local", true, false}, - // TODO Windows post TP5 - Add readonly support {`name:d::ro`, "local", `d:`, ``, `name`, "local", false, false}, - {`name:c:`, "", ``, ``, ``, "", true, true}, - {`driver/name:c:`, "", ``, ``, ``, "", true, true}, - } - } else { - cases = []testParseMountRaw{ - {"/tmp:/tmp1", "", "/tmp1", "/tmp", "", "", true, false}, - {"/tmp:/tmp2:ro", "", "/tmp2", "/tmp", "", "", false, false}, - {"/tmp:/tmp3:rw", "", "/tmp3", "/tmp", "", "", true, false}, - {"/tmp:/tmp4:foo", "", "", "", "", "", false, true}, - {"name:/named1", "", "/named1", "", "name", "", true, false}, - {"name:/named2", "external", "/named2", "", "name", "external", true, false}, - {"name:/named3:ro", "local", "/named3", "", "name", "local", false, false}, - {"local/name:/tmp:rw", "", "/tmp", "", "local/name", "", true, false}, - {"/tmp:tmp", "", "", "", "", "", true, true}, - } - } - - for i, c := range cases { - t.Logf("case %d", i) - m, err := ParseMountRaw(c.bind, c.driver) - if c.fail { - if err == nil { - t.Fatalf("Expected error, was nil, for spec %s\n", c.bind) - } - continue - } - - if m == nil || err != nil { - t.Fatalf("ParseMountRaw failed for spec '%s', driver '%s', error '%v'", c.bind, c.driver, err.Error()) - continue - } - - if m.Destination != c.expDest { - t.Fatalf("Expected destination '%s, was %s', for spec '%s'", c.expDest, m.Destination, c.bind) - } - - if m.Source != c.expSource { - t.Fatalf("Expected source '%s', was '%s', for spec '%s'", c.expSource, m.Source, c.bind) - } - - if m.Name != c.expName { - t.Fatalf("Expected name '%s', was '%s' for spec '%s'", c.expName, m.Name, c.bind) - } - - if m.Driver != c.expDriver { - t.Fatalf("Expected driver '%s', was '%s', for spec '%s'", c.expDriver, m.Driver, c.bind) - } - - if m.RW != c.expRW { - t.Fatalf("Expected RW '%v', was '%v' for spec '%s'", c.expRW, m.RW, c.bind) - } - } -} - -func TestParseMountSpec(t *testing.T) { - type c struct { - input mount.Mount - expected MountPoint - } - testDir, err := ioutil.TempDir("", "test-mount-config") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(testDir) - - cases := []c{ - {mount.Mount{Type: mount.TypeBind, Source: testDir, Target: testDestinationPath, ReadOnly: true}, MountPoint{Type: mount.TypeBind, Source: testDir, Destination: testDestinationPath}}, - {mount.Mount{Type: mount.TypeBind, Source: testDir, Target: testDestinationPath}, MountPoint{Type: mount.TypeBind, Source: testDir, Destination: testDestinationPath, RW: true}}, - {mount.Mount{Type: mount.TypeBind, Source: testDir + string(os.PathSeparator), Target: testDestinationPath, ReadOnly: true}, MountPoint{Type: mount.TypeBind, Source: testDir, Destination: testDestinationPath}}, - {mount.Mount{Type: mount.TypeBind, Source: testDir, Target: testDestinationPath + string(os.PathSeparator), ReadOnly: true}, MountPoint{Type: mount.TypeBind, Source: testDir, Destination: testDestinationPath}}, - {mount.Mount{Type: mount.TypeVolume, Target: testDestinationPath}, MountPoint{Type: mount.TypeVolume, Destination: testDestinationPath, RW: true, CopyData: DefaultCopyMode}}, - {mount.Mount{Type: mount.TypeVolume, Target: testDestinationPath + string(os.PathSeparator)}, MountPoint{Type: mount.TypeVolume, Destination: testDestinationPath, RW: true, CopyData: DefaultCopyMode}}, - } - - for i, c := range cases { - t.Logf("case %d", i) - mp, err := ParseMountSpec(c.input) - if err != nil { - t.Fatal(err) - } - - if c.expected.Type != mp.Type { - t.Fatalf("Expected mount types to match. Expected: '%s', Actual: '%s'", c.expected.Type, mp.Type) - } - if c.expected.Destination != mp.Destination { - t.Fatalf("Expected mount destination to match. Expected: '%s', Actual: '%s'", c.expected.Destination, mp.Destination) - } - if c.expected.Source != mp.Source { - t.Fatalf("Expected mount source to match. Expected: '%s', Actual: '%s'", c.expected.Source, mp.Source) - } - if c.expected.RW != mp.RW { - t.Fatalf("Expected mount writable to match. Expected: '%v', Actual: '%v'", c.expected.RW, mp.RW) - } - if c.expected.Propagation != mp.Propagation { - t.Fatalf("Expected mount propagation to match. Expected: '%v', Actual: '%s'", c.expected.Propagation, mp.Propagation) - } - if c.expected.Driver != mp.Driver { - t.Fatalf("Expected mount driver to match. Expected: '%v', Actual: '%s'", c.expected.Driver, mp.Driver) - } - if c.expected.CopyData != mp.CopyData { - t.Fatalf("Expected mount copy data to match. Expected: '%v', Actual: '%v'", c.expected.CopyData, mp.CopyData) - } - } -} diff --git a/vendor/github.com/docker/docker/volume/volume_unix.go b/vendor/github.com/docker/docker/volume/volume_unix.go deleted file mode 100644 index 0256ebb2b..000000000 --- a/vendor/github.com/docker/docker/volume/volume_unix.go +++ /dev/null @@ -1,138 +0,0 @@ -// +build linux freebsd darwin solaris - -package volume - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - mounttypes "github.com/docker/docker/api/types/mount" -) - -var platformRawValidationOpts = []func(o *validateOpts){ - // need to make sure to not error out if the bind source does not exist on unix - // this is supported for historical reasons, the path will be automatically - // created later. - func(o *validateOpts) { o.skipBindSourceCheck = true }, -} - -// read-write modes -var rwModes = map[string]bool{ - "rw": true, - "ro": true, -} - -// label modes -var labelModes = map[string]bool{ - "Z": true, - "z": true, -} - -// BackwardsCompatible decides whether this mount point can be -// used in old versions of Docker or not. -// Only bind mounts and local volumes can be used in old versions of Docker. -func (m *MountPoint) BackwardsCompatible() bool { - return len(m.Source) > 0 || m.Driver == DefaultDriverName -} - -// HasResource checks whether the given absolute path for a container is in -// this mount point. If the relative path starts with `../` then the resource -// is outside of this mount point, but we can't simply check for this prefix -// because it misses `..` which is also outside of the mount, so check both. -func (m *MountPoint) HasResource(absolutePath string) bool { - relPath, err := filepath.Rel(m.Destination, absolutePath) - return err == nil && relPath != ".." && !strings.HasPrefix(relPath, fmt.Sprintf("..%c", filepath.Separator)) -} - -// IsVolumeNameValid checks a volume name in a platform specific manner. -func IsVolumeNameValid(name string) (bool, error) { - return true, nil -} - -// ValidMountMode will make sure the mount mode is valid. -// returns if it's a valid mount mode or not. -func ValidMountMode(mode string) bool { - if mode == "" { - return true - } - - rwModeCount := 0 - labelModeCount := 0 - propagationModeCount := 0 - copyModeCount := 0 - - for _, o := range strings.Split(mode, ",") { - switch { - case rwModes[o]: - rwModeCount++ - case labelModes[o]: - labelModeCount++ - case propagationModes[mounttypes.Propagation(o)]: - propagationModeCount++ - case copyModeExists(o): - copyModeCount++ - default: - return false - } - } - - // Only one string for each mode is allowed. - if rwModeCount > 1 || labelModeCount > 1 || propagationModeCount > 1 || copyModeCount > 1 { - return false - } - return true -} - -// ReadWrite tells you if a mode string is a valid read-write mode or not. -// If there are no specifications w.r.t read write mode, then by default -// it returns true. -func ReadWrite(mode string) bool { - if !ValidMountMode(mode) { - return false - } - - for _, o := range strings.Split(mode, ",") { - if o == "ro" { - return false - } - } - return true -} - -func validateNotRoot(p string) error { - p = filepath.Clean(convertSlash(p)) - if p == "/" { - return fmt.Errorf("invalid specification: destination can't be '/'") - } - return nil -} - -func validateCopyMode(mode bool) error { - return nil -} - -func convertSlash(p string) string { - return filepath.ToSlash(p) -} - -func splitRawSpec(raw string) ([]string, error) { - if strings.Count(raw, ":") > 2 { - return nil, errInvalidSpec(raw) - } - - arr := strings.SplitN(raw, ":", 3) - if arr[0] == "" { - return nil, errInvalidSpec(raw) - } - return arr, nil -} - -func clean(p string) string { - return filepath.Clean(p) -} - -func validateStat(fi os.FileInfo) error { - return nil -} diff --git a/vendor/github.com/docker/docker/volume/volume_unsupported.go b/vendor/github.com/docker/docker/volume/volume_unsupported.go deleted file mode 100644 index ff9d6afa2..000000000 --- a/vendor/github.com/docker/docker/volume/volume_unsupported.go +++ /dev/null @@ -1,16 +0,0 @@ -// +build !linux - -package volume - -import ( - "fmt" - "runtime" - - mounttypes "github.com/docker/docker/api/types/mount" -) - -// ConvertTmpfsOptions converts *mounttypes.TmpfsOptions to the raw option string -// for mount(2). -func ConvertTmpfsOptions(opt *mounttypes.TmpfsOptions, readOnly bool) (string, error) { - return "", fmt.Errorf("%s does not support tmpfs", runtime.GOOS) -} diff --git a/vendor/github.com/docker/docker/volume/volume_windows.go b/vendor/github.com/docker/docker/volume/volume_windows.go deleted file mode 100644 index 22f6fc7a1..000000000 --- a/vendor/github.com/docker/docker/volume/volume_windows.go +++ /dev/null @@ -1,201 +0,0 @@ -package volume - -import ( - "fmt" - "os" - "path/filepath" - "regexp" - "strings" -) - -// read-write modes -var rwModes = map[string]bool{ - "rw": true, -} - -// read-only modes -var roModes = map[string]bool{ - "ro": true, -} - -var platformRawValidationOpts = []func(*validateOpts){ - // filepath.IsAbs is weird on Windows: - // `c:` is not considered an absolute path - // `c:\` is considered an absolute path - // In any case, the regex matching below ensures absolute paths - // TODO: consider this a bug with filepath.IsAbs (?) - func(o *validateOpts) { o.skipAbsolutePathCheck = true }, -} - -const ( - // Spec should be in the format [source:]destination[:mode] - // - // Examples: c:\foo bar:d:rw - // c:\foo:d:\bar - // myname:d: - // d:\ - // - // Explanation of this regex! Thanks @thaJeztah on IRC and gist for help. See - // https://gist.github.com/thaJeztah/6185659e4978789fb2b2. A good place to - // test is https://regex-golang.appspot.com/assets/html/index.html - // - // Useful link for referencing named capturing groups: - // http://stackoverflow.com/questions/20750843/using-named-matches-from-go-regex - // - // There are three match groups: source, destination and mode. - // - - // RXHostDir is the first option of a source - RXHostDir = `[a-z]:\\(?:[^\\/:*?"<>|\r\n]+\\?)*` - // RXName is the second option of a source - RXName = `[^\\/:*?"<>|\r\n]+` - // RXReservedNames are reserved names not possible on Windows - RXReservedNames = `(con)|(prn)|(nul)|(aux)|(com[1-9])|(lpt[1-9])` - - // RXSource is the combined possibilities for a source - RXSource = `((?P((` + RXHostDir + `)|(` + RXName + `))):)?` - - // Source. Can be either a host directory, a name, or omitted: - // HostDir: - // - Essentially using the folder solution from - // https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch08s18.html - // but adding case insensitivity. - // - Must be an absolute path such as c:\path - // - Can include spaces such as `c:\program files` - // - And then followed by a colon which is not in the capture group - // - And can be optional - // Name: - // - Must not contain invalid NTFS filename characters (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx) - // - And then followed by a colon which is not in the capture group - // - And can be optional - - // RXDestination is the regex expression for the mount destination - RXDestination = `(?P([a-z]):((?:\\[^\\/:*?"<>\r\n]+)*\\?))` - // Destination (aka container path): - // - Variation on hostdir but can be a drive followed by colon as well - // - If a path, must be absolute. Can include spaces - // - Drive cannot be c: (explicitly checked in code, not RegEx) - - // RXMode is the regex expression for the mode of the mount - // Mode (optional): - // - Hopefully self explanatory in comparison to above regex's. - // - Colon is not in the capture group - RXMode = `(:(?P(?i)ro|rw))?` -) - -// BackwardsCompatible decides whether this mount point can be -// used in old versions of Docker or not. -// Windows volumes are never backwards compatible. -func (m *MountPoint) BackwardsCompatible() bool { - return false -} - -func splitRawSpec(raw string) ([]string, error) { - specExp := regexp.MustCompile(`^` + RXSource + RXDestination + RXMode + `$`) - match := specExp.FindStringSubmatch(strings.ToLower(raw)) - - // Must have something back - if len(match) == 0 { - return nil, errInvalidSpec(raw) - } - - var split []string - matchgroups := make(map[string]string) - // Pull out the sub expressions from the named capture groups - for i, name := range specExp.SubexpNames() { - matchgroups[name] = strings.ToLower(match[i]) - } - if source, exists := matchgroups["source"]; exists { - if source != "" { - split = append(split, source) - } - } - if destination, exists := matchgroups["destination"]; exists { - if destination != "" { - split = append(split, destination) - } - } - if mode, exists := matchgroups["mode"]; exists { - if mode != "" { - split = append(split, mode) - } - } - // Fix #26329. If the destination appears to be a file, and the source is null, - // it may be because we've fallen through the possible naming regex and hit a - // situation where the user intention was to map a file into a container through - // a local volume, but this is not supported by the platform. - if matchgroups["source"] == "" && matchgroups["destination"] != "" { - validName, err := IsVolumeNameValid(matchgroups["destination"]) - if err != nil { - return nil, err - } - if !validName { - if fi, err := os.Stat(matchgroups["destination"]); err == nil { - if !fi.IsDir() { - return nil, fmt.Errorf("file '%s' cannot be mapped. Only directories can be mapped on this platform", matchgroups["destination"]) - } - } - } - } - return split, nil -} - -// IsVolumeNameValid checks a volume name in a platform specific manner. -func IsVolumeNameValid(name string) (bool, error) { - nameExp := regexp.MustCompile(`^` + RXName + `$`) - if !nameExp.MatchString(name) { - return false, nil - } - nameExp = regexp.MustCompile(`^` + RXReservedNames + `$`) - if nameExp.MatchString(name) { - return false, fmt.Errorf("volume name %q cannot be a reserved word for Windows filenames", name) - } - return true, nil -} - -// ValidMountMode will make sure the mount mode is valid. -// returns if it's a valid mount mode or not. -func ValidMountMode(mode string) bool { - if mode == "" { - return true - } - return roModes[strings.ToLower(mode)] || rwModes[strings.ToLower(mode)] -} - -// ReadWrite tells you if a mode string is a valid read-write mode or not. -func ReadWrite(mode string) bool { - return rwModes[strings.ToLower(mode)] || mode == "" -} - -func validateNotRoot(p string) error { - p = strings.ToLower(convertSlash(p)) - if p == "c:" || p == `c:\` { - return fmt.Errorf("destination path cannot be `c:` or `c:\\`: %v", p) - } - return nil -} - -func validateCopyMode(mode bool) error { - if mode { - return fmt.Errorf("Windows does not support copying image path content") - } - return nil -} - -func convertSlash(p string) string { - return filepath.FromSlash(p) -} - -func clean(p string) string { - if match, _ := regexp.MatchString("^[a-z]:$", p); match { - return p - } - return filepath.Clean(p) -} - -func validateStat(fi os.FileInfo) error { - if !fi.IsDir() { - return fmt.Errorf("source path must be a directory") - } - return nil -} diff --git a/vendor/github.com/docker/go-connections/proxy/logger.go b/vendor/github.com/docker/go-connections/proxy/logger.go deleted file mode 100644 index cd8b5fd48..000000000 --- a/vendor/github.com/docker/go-connections/proxy/logger.go +++ /dev/null @@ -1,11 +0,0 @@ -package proxy - -type logger interface { - Printf(format string, args ...interface{}) -} - -type noopLogger struct{} - -func (l *noopLogger) Printf(_ string, _ ...interface{}) { - // Do nothing :) -} diff --git a/vendor/github.com/docker/go-connections/proxy/network_proxy_test.go b/vendor/github.com/docker/go-connections/proxy/network_proxy_test.go deleted file mode 100644 index 9a7354801..000000000 --- a/vendor/github.com/docker/go-connections/proxy/network_proxy_test.go +++ /dev/null @@ -1,216 +0,0 @@ -package proxy - -import ( - "bytes" - "fmt" - "io" - "net" - "strings" - "testing" - "time" -) - -var testBuf = []byte("Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo") -var testBufSize = len(testBuf) - -type EchoServer interface { - Run() - Close() - LocalAddr() net.Addr -} - -type TCPEchoServer struct { - listener net.Listener - testCtx *testing.T -} - -type UDPEchoServer struct { - conn net.PacketConn - testCtx *testing.T -} - -func NewEchoServer(t *testing.T, proto, address string) EchoServer { - var server EchoServer - if strings.HasPrefix(proto, "tcp") { - listener, err := net.Listen(proto, address) - if err != nil { - t.Fatal(err) - } - server = &TCPEchoServer{listener: listener, testCtx: t} - } else { - socket, err := net.ListenPacket(proto, address) - if err != nil { - t.Fatal(err) - } - server = &UDPEchoServer{conn: socket, testCtx: t} - } - return server -} - -func (server *TCPEchoServer) Run() { - go func() { - for { - client, err := server.listener.Accept() - if err != nil { - return - } - go func(client net.Conn) { - if _, err := io.Copy(client, client); err != nil { - server.testCtx.Logf("can't echo to the client: %v\n", err.Error()) - } - client.Close() - }(client) - } - }() -} - -func (server *TCPEchoServer) LocalAddr() net.Addr { return server.listener.Addr() } -func (server *TCPEchoServer) Close() { server.listener.Close() } - -func (server *UDPEchoServer) Run() { - go func() { - readBuf := make([]byte, 1024) - for { - read, from, err := server.conn.ReadFrom(readBuf) - if err != nil { - return - } - for i := 0; i != read; { - written, err := server.conn.WriteTo(readBuf[i:read], from) - if err != nil { - break - } - i += written - } - } - }() -} - -func (server *UDPEchoServer) LocalAddr() net.Addr { return server.conn.LocalAddr() } -func (server *UDPEchoServer) Close() { server.conn.Close() } - -func testProxyAt(t *testing.T, proto string, proxy Proxy, addr string) { - defer proxy.Close() - go proxy.Run() - client, err := net.Dial(proto, addr) - if err != nil { - t.Fatalf("Can't connect to the proxy: %v", err) - } - defer client.Close() - client.SetDeadline(time.Now().Add(10 * time.Second)) - if _, err = client.Write(testBuf); err != nil { - t.Fatal(err) - } - recvBuf := make([]byte, testBufSize) - if _, err = client.Read(recvBuf); err != nil { - t.Fatal(err) - } - if !bytes.Equal(testBuf, recvBuf) { - t.Fatal(fmt.Errorf("Expected [%v] but got [%v]", testBuf, recvBuf)) - } -} - -func testProxy(t *testing.T, proto string, proxy Proxy) { - testProxyAt(t, proto, proxy, proxy.FrontendAddr().String()) -} - -func TestTCP4Proxy(t *testing.T) { - backend := NewEchoServer(t, "tcp", "127.0.0.1:0") - defer backend.Close() - backend.Run() - frontendAddr := &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0} - proxy, err := NewProxy(frontendAddr, backend.LocalAddr()) - if err != nil { - t.Fatal(err) - } - testProxy(t, "tcp", proxy) -} - -func TestTCP6Proxy(t *testing.T) { - backend := NewEchoServer(t, "tcp", "[::1]:0") - defer backend.Close() - backend.Run() - frontendAddr := &net.TCPAddr{IP: net.IPv6loopback, Port: 0} - proxy, err := NewProxy(frontendAddr, backend.LocalAddr()) - if err != nil { - t.Fatal(err) - } - testProxy(t, "tcp", proxy) -} - -func TestTCPDualStackProxy(t *testing.T) { - // If I understand `godoc -src net favoriteAddrFamily` (used by the - // net.Listen* functions) correctly this should work, but it doesn't. - t.Skip("No support for dual stack yet") - backend := NewEchoServer(t, "tcp", "[::1]:0") - defer backend.Close() - backend.Run() - frontendAddr := &net.TCPAddr{IP: net.IPv6loopback, Port: 0} - proxy, err := NewProxy(frontendAddr, backend.LocalAddr()) - if err != nil { - t.Fatal(err) - } - ipv4ProxyAddr := &net.TCPAddr{ - IP: net.IPv4(127, 0, 0, 1), - Port: proxy.FrontendAddr().(*net.TCPAddr).Port, - } - testProxyAt(t, "tcp", proxy, ipv4ProxyAddr.String()) -} - -func TestUDP4Proxy(t *testing.T) { - backend := NewEchoServer(t, "udp", "127.0.0.1:0") - defer backend.Close() - backend.Run() - frontendAddr := &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0} - proxy, err := NewProxy(frontendAddr, backend.LocalAddr()) - if err != nil { - t.Fatal(err) - } - testProxy(t, "udp", proxy) -} - -func TestUDP6Proxy(t *testing.T) { - backend := NewEchoServer(t, "udp", "[::1]:0") - defer backend.Close() - backend.Run() - frontendAddr := &net.UDPAddr{IP: net.IPv6loopback, Port: 0} - proxy, err := NewProxy(frontendAddr, backend.LocalAddr()) - if err != nil { - t.Fatal(err) - } - testProxy(t, "udp", proxy) -} - -func TestUDPWriteError(t *testing.T) { - frontendAddr := &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0} - // Hopefully, this port will be free: */ - backendAddr := &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 25587} - proxy, err := NewProxy(frontendAddr, backendAddr) - if err != nil { - t.Fatal(err) - } - defer proxy.Close() - go proxy.Run() - client, err := net.Dial("udp", "127.0.0.1:25587") - if err != nil { - t.Fatalf("Can't connect to the proxy: %v", err) - } - defer client.Close() - // Make sure the proxy doesn't stop when there is no actual backend: - client.Write(testBuf) - client.Write(testBuf) - backend := NewEchoServer(t, "udp", "127.0.0.1:25587") - defer backend.Close() - backend.Run() - client.SetDeadline(time.Now().Add(10 * time.Second)) - if _, err = client.Write(testBuf); err != nil { - t.Fatal(err) - } - recvBuf := make([]byte, testBufSize) - if _, err = client.Read(recvBuf); err != nil { - t.Fatal(err) - } - if !bytes.Equal(testBuf, recvBuf) { - t.Fatal(fmt.Errorf("Expected [%v] but got [%v]", testBuf, recvBuf)) - } -} diff --git a/vendor/github.com/docker/go-connections/proxy/proxy.go b/vendor/github.com/docker/go-connections/proxy/proxy.go deleted file mode 100644 index 537aebb7c..000000000 --- a/vendor/github.com/docker/go-connections/proxy/proxy.go +++ /dev/null @@ -1,36 +0,0 @@ -// Package proxy provides a network Proxy interface and implementations for TCP and UDP. -package proxy - -import ( - "fmt" - "net" -) - -// Proxy defines the behavior of a proxy. It forwards traffic back and forth -// between two endpoints : the frontend and the backend. -// It can be used to do software port-mapping between two addresses. -// e.g. forward all traffic between the frontend (host) 127.0.0.1:3000 -// to the backend (container) at 172.17.42.108:4000. -type Proxy interface { - // Run starts forwarding traffic back and forth between the front - // and back-end addresses. - Run() - // Close stops forwarding traffic and close both ends of the Proxy. - Close() - // FrontendAddr returns the address on which the proxy is listening. - FrontendAddr() net.Addr - // BackendAddr returns the proxied address. - BackendAddr() net.Addr -} - -// NewProxy creates a Proxy according to the specified frontendAddr and backendAddr. -func NewProxy(frontendAddr, backendAddr net.Addr) (Proxy, error) { - switch frontendAddr.(type) { - case *net.UDPAddr: - return NewUDPProxy(frontendAddr.(*net.UDPAddr), backendAddr.(*net.UDPAddr)) - case *net.TCPAddr: - return NewTCPProxy(frontendAddr.(*net.TCPAddr), backendAddr.(*net.TCPAddr)) - default: - panic(fmt.Errorf("Unsupported protocol")) - } -} diff --git a/vendor/github.com/docker/go-connections/proxy/stub_proxy.go b/vendor/github.com/docker/go-connections/proxy/stub_proxy.go deleted file mode 100644 index 571749e46..000000000 --- a/vendor/github.com/docker/go-connections/proxy/stub_proxy.go +++ /dev/null @@ -1,31 +0,0 @@ -package proxy - -import ( - "net" -) - -// StubProxy is a proxy that is a stub (does nothing). -type StubProxy struct { - frontendAddr net.Addr - backendAddr net.Addr -} - -// Run does nothing. -func (p *StubProxy) Run() {} - -// Close does nothing. -func (p *StubProxy) Close() {} - -// FrontendAddr returns the frontend address. -func (p *StubProxy) FrontendAddr() net.Addr { return p.frontendAddr } - -// BackendAddr returns the backend address. -func (p *StubProxy) BackendAddr() net.Addr { return p.backendAddr } - -// NewStubProxy creates a new StubProxy -func NewStubProxy(frontendAddr, backendAddr net.Addr) (Proxy, error) { - return &StubProxy{ - frontendAddr: frontendAddr, - backendAddr: backendAddr, - }, nil -} diff --git a/vendor/github.com/docker/go-connections/proxy/tcp_proxy.go b/vendor/github.com/docker/go-connections/proxy/tcp_proxy.go deleted file mode 100644 index 8d97196d1..000000000 --- a/vendor/github.com/docker/go-connections/proxy/tcp_proxy.go +++ /dev/null @@ -1,105 +0,0 @@ -package proxy - -import ( - "io" - "net" - "syscall" -) - -// TCPProxy is a proxy for TCP connections. It implements the Proxy interface to -// handle TCP traffic forwarding between the frontend and backend addresses. -type TCPProxy struct { - Logger logger - listener *net.TCPListener - frontendAddr *net.TCPAddr - backendAddr *net.TCPAddr -} - -// NewTCPProxy creates a new TCPProxy. -func NewTCPProxy(frontendAddr, backendAddr *net.TCPAddr, ops ...func(*TCPProxy)) (*TCPProxy, error) { - listener, err := net.ListenTCP("tcp", frontendAddr) - if err != nil { - return nil, err - } - // If the port in frontendAddr was 0 then ListenTCP will have a picked - // a port to listen on, hence the call to Addr to get that actual port: - proxy := &TCPProxy{ - listener: listener, - frontendAddr: listener.Addr().(*net.TCPAddr), - backendAddr: backendAddr, - Logger: &noopLogger{}, - } - - for _, op := range ops { - op(proxy) - } - - return proxy, nil -} - -func (proxy *TCPProxy) clientLoop(client *net.TCPConn, quit chan bool) { - backend, err := net.DialTCP("tcp", nil, proxy.backendAddr) - if err != nil { - proxy.Logger.Printf("Can't forward traffic to backend tcp/%v: %s\n", proxy.backendAddr, err) - client.Close() - return - } - - event := make(chan int64) - var broker = func(to, from *net.TCPConn) { - written, err := io.Copy(to, from) - if err != nil { - // If the socket we are writing to is shutdown with - // SHUT_WR, forward it to the other end of the pipe: - if err, ok := err.(*net.OpError); ok && err.Err == syscall.EPIPE { - from.CloseWrite() - } - } - to.CloseRead() - event <- written - } - - go broker(client, backend) - go broker(backend, client) - - var transferred int64 - for i := 0; i < 2; i++ { - select { - case written := <-event: - transferred += written - case <-quit: - // Interrupt the two brokers and "join" them. - client.Close() - backend.Close() - for ; i < 2; i++ { - transferred += <-event - } - return - } - } - client.Close() - backend.Close() -} - -// Run starts forwarding the traffic using TCP. -func (proxy *TCPProxy) Run() { - quit := make(chan bool) - defer close(quit) - for { - client, err := proxy.listener.Accept() - if err != nil { - proxy.Logger.Printf("Stopping proxy on tcp/%v for tcp/%v (%s)", proxy.frontendAddr, proxy.backendAddr, err) - return - } - go proxy.clientLoop(client.(*net.TCPConn), quit) - } -} - -// Close stops forwarding the traffic. -func (proxy *TCPProxy) Close() { proxy.listener.Close() } - -// FrontendAddr returns the TCP address on which the proxy is listening. -func (proxy *TCPProxy) FrontendAddr() net.Addr { return proxy.frontendAddr } - -// BackendAddr returns the TCP proxied address. -func (proxy *TCPProxy) BackendAddr() net.Addr { return proxy.backendAddr } diff --git a/vendor/github.com/docker/go-connections/proxy/udp_proxy.go b/vendor/github.com/docker/go-connections/proxy/udp_proxy.go deleted file mode 100644 index 71ddf1268..000000000 --- a/vendor/github.com/docker/go-connections/proxy/udp_proxy.go +++ /dev/null @@ -1,176 +0,0 @@ -package proxy - -import ( - "encoding/binary" - "net" - "strings" - "sync" - "syscall" - "time" -) - -const ( - // UDPConnTrackTimeout is the timeout used for UDP connection tracking - UDPConnTrackTimeout = 90 * time.Second - // UDPBufSize is the buffer size for the UDP proxy - UDPBufSize = 65507 -) - -// A net.Addr where the IP is split into two fields so you can use it as a key -// in a map: -type connTrackKey struct { - IPHigh uint64 - IPLow uint64 - Port int -} - -func newConnTrackKey(addr *net.UDPAddr) *connTrackKey { - if len(addr.IP) == net.IPv4len { - return &connTrackKey{ - IPHigh: 0, - IPLow: uint64(binary.BigEndian.Uint32(addr.IP)), - Port: addr.Port, - } - } - return &connTrackKey{ - IPHigh: binary.BigEndian.Uint64(addr.IP[:8]), - IPLow: binary.BigEndian.Uint64(addr.IP[8:]), - Port: addr.Port, - } -} - -type connTrackMap map[connTrackKey]*net.UDPConn - -// UDPProxy is proxy for which handles UDP datagrams. It implements the Proxy -// interface to handle UDP traffic forwarding between the frontend and backend -// addresses. -type UDPProxy struct { - Logger logger - listener *net.UDPConn - frontendAddr *net.UDPAddr - backendAddr *net.UDPAddr - connTrackTable connTrackMap - connTrackLock sync.Mutex -} - -// NewUDPProxy creates a new UDPProxy. -func NewUDPProxy(frontendAddr, backendAddr *net.UDPAddr, ops ...func(*UDPProxy)) (*UDPProxy, error) { - listener, err := net.ListenUDP("udp", frontendAddr) - if err != nil { - return nil, err - } - - proxy := &UDPProxy{ - listener: listener, - frontendAddr: listener.LocalAddr().(*net.UDPAddr), - backendAddr: backendAddr, - connTrackTable: make(connTrackMap), - Logger: &noopLogger{}, - } - - for _, op := range ops { - op(proxy) - } - - return proxy, nil -} - -func (proxy *UDPProxy) replyLoop(proxyConn *net.UDPConn, clientAddr *net.UDPAddr, clientKey *connTrackKey) { - defer func() { - proxy.connTrackLock.Lock() - delete(proxy.connTrackTable, *clientKey) - proxy.connTrackLock.Unlock() - proxyConn.Close() - }() - - readBuf := make([]byte, UDPBufSize) - for { - proxyConn.SetReadDeadline(time.Now().Add(UDPConnTrackTimeout)) - again: - read, err := proxyConn.Read(readBuf) - if err != nil { - if err, ok := err.(*net.OpError); ok && err.Err == syscall.ECONNREFUSED { - // This will happen if the last write failed - // (e.g: nothing is actually listening on the - // proxied port on the container), ignore it - // and continue until UDPConnTrackTimeout - // expires: - goto again - } - return - } - for i := 0; i != read; { - written, err := proxy.listener.WriteToUDP(readBuf[i:read], clientAddr) - if err != nil { - return - } - i += written - } - } -} - -// Run starts forwarding the traffic using UDP. -func (proxy *UDPProxy) Run() { - readBuf := make([]byte, UDPBufSize) - for { - read, from, err := proxy.listener.ReadFromUDP(readBuf) - if err != nil { - // NOTE: Apparently ReadFrom doesn't return - // ECONNREFUSED like Read do (see comment in - // UDPProxy.replyLoop) - if !isClosedError(err) { - proxy.Logger.Printf("Stopping proxy on udp/%v for udp/%v (%s)", proxy.frontendAddr, proxy.backendAddr, err) - } - break - } - - fromKey := newConnTrackKey(from) - proxy.connTrackLock.Lock() - proxyConn, hit := proxy.connTrackTable[*fromKey] - if !hit { - proxyConn, err = net.DialUDP("udp", nil, proxy.backendAddr) - if err != nil { - proxy.Logger.Printf("Can't proxy a datagram to udp/%s: %s\n", proxy.backendAddr, err) - proxy.connTrackLock.Unlock() - continue - } - proxy.connTrackTable[*fromKey] = proxyConn - go proxy.replyLoop(proxyConn, from, fromKey) - } - proxy.connTrackLock.Unlock() - for i := 0; i != read; { - written, err := proxyConn.Write(readBuf[i:read]) - if err != nil { - proxy.Logger.Printf("Can't proxy a datagram to udp/%s: %s\n", proxy.backendAddr, err) - break - } - i += written - } - } -} - -// Close stops forwarding the traffic. -func (proxy *UDPProxy) Close() { - proxy.listener.Close() - proxy.connTrackLock.Lock() - defer proxy.connTrackLock.Unlock() - for _, conn := range proxy.connTrackTable { - conn.Close() - } -} - -// FrontendAddr returns the UDP address on which the proxy is listening. -func (proxy *UDPProxy) FrontendAddr() net.Addr { return proxy.frontendAddr } - -// BackendAddr returns the proxied UDP address. -func (proxy *UDPProxy) BackendAddr() net.Addr { return proxy.backendAddr } - -func isClosedError(err error) bool { - /* This comparison is ugly, but unfortunately, net.go doesn't export errClosing. - * See: - * http://golang.org/src/pkg/net/net.go - * https://code.google.com/p/go/issues/detail?id=4337 - * https://groups.google.com/forum/#!msg/golang-nuts/0_aaCvBmOcM/SptmDyX1XJMJ - */ - return strings.HasSuffix(err.Error(), "use of closed network connection") -} diff --git a/vendor/github.com/docker/go-connections/tlsconfig/fixtures/cert.pem b/vendor/github.com/docker/go-connections/tlsconfig/fixtures/cert.pem deleted file mode 100644 index 09bd69ed2..000000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/fixtures/cert.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC1jCCAb6gAwIBAgIDAw0/MA0GCSqGSIb3DQEBCwUAMA8xDTALBgNVBAMTBHRl -c3QwHhcNMTYwMzI4MTg0MTQ3WhcNMjcwMzI4MTg0MTQ3WjAPMQ0wCwYDVQQDEwR0 -ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1k1NO4wzCpxZ71Bo -SiYSWh8SE9jHtg6lz0QjMQXzFuLhpedjHJYx9fYbD+JVk5vnRbUqNUeZVKAGahfR -9vhm5I+cm359gYU0gHawLw91oh4JCiwUu77U2obHvtvcXLf6Fb/+MoSA5wH7vbL3 -T4vR1+hLt+R+kILAEHq/IlSdLD8CA0iA+ypHfCPOi5F2wVjAyMnQXgVDkAhzefpu -JkhN1yUgb5WK4qoSuOUDUYq/bRosLdHXDJiWRuqaU2zxO5cHVlrNAE5RuspfEzl4 -YP6boZTOomLEDbBTSJWgX2/ybvY7o4sCw7KrvyBIqSK9HbfaK1nFMFGoiSH6+1m4 -amWKrwIDAQABozswOTAOBgNVHQ8BAf8EBAMCBaAwGQYDVR0lBBIwEAYIKwYBBQUH -AwMGBFUdJQAwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAQEADuXjLtGk -tU5ql+LFB32Cc2Laa0iO8aqJccOcXYKg4FD0um+1+YQO1CBZZqWjItH4CuJl5+2j -Tc9sFgrIVH5CmvUkOUFPCNDAJtxBvF6RQqRpehjheHDaNsYo9JNKHKEJB6OJrDgy -N5krM5FKyAp/EDTbIrGIZFMdxQGxK5MfpfPkKK44JgOQM3QWeR+LqIpfd34MD1jZ -jjYdl0+quIHiIdFR0a4Uam7o9GfUmcWe1VFthLb5pNhV6t+wyuLyMXVMNacKZSz/ -nOMWVQfgViZk6rHOPSMrFMc7Pp488I907MJKCryd21LcLqMuhb4BpWcJghnY8Lbs -uIPLsUHr3Pfp9Q== ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/go-connections/tlsconfig/fixtures/cert_of_encrypted_key.pem b/vendor/github.com/docker/go-connections/tlsconfig/fixtures/cert_of_encrypted_key.pem deleted file mode 100644 index d0710768f..000000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/fixtures/cert_of_encrypted_key.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC1jCCAb6gAwIBAgIDAw0/MA0GCSqGSIb3DQEBCwUAMA8xDTALBgNVBAMTBHRl -c3QwHhcNMTYwNDIyMDQyMjM1WhcNMTgwNDIyMDQyMjM1WjAPMQ0wCwYDVQQDEwR0 -ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4GRTos+Ik6kQG7wn -8E4HqPwgWXbY0T59UQsrbR+YbyxbUKV67Pgl4VImuUmYaism6Tm3EFYzeom5baMc -vW0hC+WbwVr1rq5ddBE8akYhlPY40SxFlh563vOi7lcFGM7xuUbTlhtAhYa5xc5U -thHYa8Mdqc2kMrmU4JBhNHoRk2mnRBo2J2/8RfOfioM6mH0t/MVtB/jSGpcwbbfj -2twKOpB9CoX57szVo7+DCFHpLxeuop+69REu5Egc2a5BtBuUf0fkUBKuF7yUy2xI -IbgjCiGb3Z+PCIC0CjNt9wExowPAGfxAJ8s1nNlpZav3707VZRtz7Js1skRjm9aU -8fhYNQIDAQABozswOTAOBgNVHQ8BAf8EBAMCBaAwGQYDVR0lBBIwEAYIKwYBBQUH -AwMGBFUdJQAwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAQEAcKCCV5Os -O2U7Ekp0jzOusV2+ykZzUe4sEds+ikblxK9SHV/pAPIVuAevdyE1LKmJ6ZGgeU2M -4MC6jC/XTlYNhsYCfKaJn53UscKI2urXFlk1Gv5VQP5EOrMWb76A5uj1nElxKe2C -bMVoUuMwRd9jnz6594D80jGGYpHRaF7yLtGbiflDjB+yv1OU6WnuVNr0nOb9ShR6 -WPlrQj5TUSpRHF/oKy9LVWuxYA9aiY1YREDZhhauw9pGAMx1lImfJcJ077MdxN4A -DwKAx3ooajAu1n3McY1oncWW+rWs2Ptvp6lKMGoZ50ElEPCMw4/hPtPMLq/DTWNj -l342KLVWgchlIA== ------END CERTIFICATE----- diff --git a/vendor/github.com/docker/go-connections/tlsconfig/fixtures/encrypted_key.pem b/vendor/github.com/docker/go-connections/tlsconfig/fixtures/encrypted_key.pem deleted file mode 100644 index 64e949dcf..000000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/fixtures/encrypted_key.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: AES-256-CBC,68ce1d54f187b663e152d9c5dc900fd3 - -ZVBeXx7kWiF0yPOORntrN6BsyIJE7krqTVhRfk6GAllaLQv0jvb31XHB1oWOaqnx -tb7kUuoBeQdl1hs/iAnkDMc59WJfEK9A9cAD/SgxTgdENOrzFSRNEfqketLA4eHZ -2sOLkSfv58HwA0p0gzqSrLQBo/6ZtF/57HxH166PtErPNTS1Usu/f4Oj0UqxTfbZ -B5LHsepyNLt6q/15fcY0TFYJwvgEXa4SridjT+8bTz2T+bx3QFijGnl7EdkTElni -FIwnDjFZaAULqoyUIB1y8guEZVkaWKncxPdRfhId84HklWdrrLtP5D6db1xNNpsp -LzGdciD3phJp6K0hpl+WrhYxuCKURa27tXMCuYOFd1hw/kM29jFbxSIlNBGN4OLL -v4wYrJFM21iWsz9c7Cqw5Yls2Rsx0QrXRFIxwT25z+HNx1fysQxYuxf3r+e2oz8e -8Os7hvcxG2XDz01/zpx8kzxUcLuh+3o5UOYlo9z6qsjaD5NUXY+X90PUrVO9fk5y -8o8pnElPnV88Ihrog5YTYy6egiQWHhDk2I4qlYPOBQNKTLg3KulAcmC9vQ8mR5Sy -p3c3MTgh0A3Zk5Dib+sQ0tdbwDcB2JCTqGal1FNEW5Z7qTHA4Bdm2l7hGs8cRpy4 -Ehkhv3s5wWmKcbwwlPuJ0UfPeDn6v9qE2/IkOy+jWgTpaFyWtXHc1/XdqMsJ8xN0 -thJw/GMtNabB1+zuayJnvmbJd2qW1smsFTHqX3BovXIH4vx1hE2d0lJpEBynk+wr -gpPgrRoEiqsPcsRoVjvKH3qwJLRdcGYhKqhbvRdynlagCLmE8iAI99r82u6t+03h -YNpRbafY4ceAYyK0IlRiJvGkBMfH7bMXcBMmXyQSBF27ZpNidyZSCHrU5xyHqJZO -XWUhl9GHplBfueh5E831S7mDqobd8RqnUvKVygyEOol5VUFDrggTAAKKN9VzM3uT -MaVymt6fA7stzf01fT+Wi7uCm5legTXG3Ca+XxD6TdE0dNzewd5jDsuqwXnt1iC4 -slvuLRZeRZDNvBd0G7Ohhp6jb2HHwkv9kQTZ+UEDbR/Gwxty4oT1MnwSE0mi9ZFN -6PTjrSxpIKe+mAhgzrepLMfATGayYQzucEArPG7Vp+NJva+j6FKloqrzXMjlP0hN -XSBr7AL+j+OR/tzDOoUG3xdsCl/u5hFTpjsW2ti870zoRUcK0fqJ9UIYjh66L7yT -KNkXsC+OcGuGkhtQ0gxx60OI7wp4bh2pKdT6e111/WTvXxVR2C3XhFBLUfNIz/7A -Oj+s0CaV4pBmCjIobLYpxC0ofLplwBLGf9xnsBiQF5dsgKgOhACeDmDMwqAJ3U/t -54hK/8Yb8W46Tjgbm0Qsj5gFXHofnyqDeQxAjsdCXsdMaPB8nyZpEkuQSEj9HlKW -xIEErVufkvqyrzhX1pxPs+C839Ueyeob6ZWQurqCLTdZh+3bhKcvi5iP+aLLjMWK -JT9tmAuFVkbPerqObVQFbnM4/re33YYD7QXCqta5bxcVeBI8N1HdwMYrDVhXelEx -mqGleUkkDHTWzAa3u1GKOzLXAYnD0TsTwml0+k+Rf0QMBiDJiKujfy7fGqfZF2vR ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/go-connections/tlsconfig/fixtures/key.pem b/vendor/github.com/docker/go-connections/tlsconfig/fixtures/key.pem deleted file mode 100644 index 6a5e20a40..000000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/fixtures/key.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEA1k1NO4wzCpxZ71BoSiYSWh8SE9jHtg6lz0QjMQXzFuLhpedj -HJYx9fYbD+JVk5vnRbUqNUeZVKAGahfR9vhm5I+cm359gYU0gHawLw91oh4JCiwU -u77U2obHvtvcXLf6Fb/+MoSA5wH7vbL3T4vR1+hLt+R+kILAEHq/IlSdLD8CA0iA -+ypHfCPOi5F2wVjAyMnQXgVDkAhzefpuJkhN1yUgb5WK4qoSuOUDUYq/bRosLdHX -DJiWRuqaU2zxO5cHVlrNAE5RuspfEzl4YP6boZTOomLEDbBTSJWgX2/ybvY7o4sC -w7KrvyBIqSK9HbfaK1nFMFGoiSH6+1m4amWKrwIDAQABAoIBAQC802wj9grbZJzS -A1WBUD6Hbi0tk6uVPR7YnD8t6QIivlL5LgLko2ruQKXjvxiMcai8gT7pp2bxa/d6 -7/Yv2PxAlFH3qOLJhyeVsf7X2JVb/X8VmXXDYAiJbI0AHRX0FJ+lHoDK3nn+En9Q -zSqgyqBhz+s343uptauqWZ2kkE3VNyqlPBhmKc5NcbR7Sgb4nJ3CkNAcxRkl1NeI -BRFdsTUYRNR3Vd++OvOzI4uzZfCIeUVqx+r7/SeLW0UwqeprMm7g+hFQLfH+e9SA -9lx0EIRoQFwgvKju2eogpSwvkSlObXnESu5OHYtnc+jpsOC0EbQgO0d6CqVZiqjR -2dRYsZkhAoGBAO69loXSAsyqUj0rT5iq59PuMlBEAlW6hQTfl6c8bnu1JUo2s/CH -OJfswxfHN32qmi99WbK2iLyrnznNYsyPnYKW0ObwuoqAdrlydfu7Fq9HSOACoIvK -jRMOsiJtM3JX2bHHV7yIwJ1+h++o2Ly803j7tKtYsrRQVZiWeTcR2IRZAoGBAOXL -bJFLbAhm3zRqhbiWuORqqyLxrDmIB6RY8vTdX47vwzkFGZJlCuL+vs6877I6eOc9 -wjH9qcOiJQJ4DWkAE+VS5PAPoj0UDRw7AkE9v3RwnmxvAfP5rPo5KimYxKq4yX6r -+Qc4ixwftCj0rxFoG4lnipwBFq4NXuHtIhbZXMZHAoGBAOGfatGtV9f0XyRP+jld -yxoO0p3oqAw86dlhNgFmq0NePo+UgxmdsW5i4z1lmJu6z1xyKoMq3q7vwtrtr6GD -WGhB/8tBVgnuvkUkVzw/44Bi7gxGb1OtaQXJra+7ZBN70tCgg9o5o080dWOZPruf -+Hst5eDJQpoGEd7S1lulEeqBAoGBAKAqdIak6izE/wg6wu+Q5lgW3SejCOakoKb1 -dIoljkhDZ2/j1RoLoVXsNzRDzlIMnV6X1jYf1ubLqj4ZTUeFTVjGuVl1nCA0TJsD -qiOtFTfkkxeDG/pgaSeTFocdut4/o/nNhep5h8RXeKwfN7LLPH4+FAd+Xr98BEk2 -jk8cu6RbAoGAHI9yRXKjlADBZLvxxMGHRfe7eK4PgABmluZLdsXzNmXxybrZDvdC -teipvIUSym7tvdDB6LHXKVp4mYeqHe/ktRatlhbQyPso2VPoMFQyuRBYKKFFAh0V -3d6EyTRnIxn/NW+XdcCUeufFfd+3BHyux68PyUsTtKRCJYfhExzJf70= ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/docker/go-connections/tlsconfig/fixtures/multi.pem b/vendor/github.com/docker/go-connections/tlsconfig/fixtures/multi.pem deleted file mode 100644 index 9d61d2c53..000000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/fixtures/multi.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC3DCCAcSgAwIBAgIDAw0/MA0GCSqGSIb3DQEBCwUAMA8xDTALBgNVBAMTBHRl -c3QwHhcNMTYwMzI4MTg0MTQ3WhcNMjcwMzI4MTg0MTQ3WjAPMQ0wCwYDVQQDEwR0 -ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArVIJDnNnM1iX7Xj8 -bja4WsgHuENRBsBCROTDjQL1w7Ksin2jmCl/D7Gk9ifRJZ/HPE3BKo6B+3CDXygJ -Qvoe8SGWi6ae8lN4VgPoW7xDViAWhVmjIr+dNQXWD0hCq0YZuXyYSi5iXWeRaTvx -2eoG2VSkNnkc/0weEhX1nBGBscuz1UZqWp53m09eL7otngcNcdjmvLPiw4E3cric -UoLVonzf4ZE84Q7nNmfWfMKh4zJUyn8N766GAAoC6RAKsJ0xSDeRjkzSy7vGJKBv -nTBe6X1xyFZaN0mAjtRkYaxI9ZfI8K41Trhd88s4B4G61p70DY3dMLmuF8wGHVCF -lMMV6wIDAQABo0EwPzAOBgNVHQ8BAf8EBAMCAqQwGQYDVR0lBBIwEAYIKwYBBQUH -AwMGBFUdJQAwEgYDVR0TAQH/BAgwBgEB/wIBATANBgkqhkiG9w0BAQsFAAOCAQEA -LriCH0FTaOFIBl+kxAKjs7puhIZoYLwQ8IReXdEU7kYjPff3X/eiO82A0GwMM9Fp -/RdMlZGDSLyZ1a/gKCz55j9J4MW8ZH7RSEQs3dJQCvEPDO6UdgKy4Ft9yNh/ba1J -8/n0CqR+0QNov6Qp7eMDkQaDvKgCaABn8at6VLtuifJXFKDGt0LrR7wkQBJ85SZB -9GdfNSPzEZkb4FQ2gPgAk7ySoQ6Hi6mogEORbtJ7+Xiq57J+cEZQV6TOuwYgBG4e -MW3h37+7V5a/absybik1F/gcx4IbEBd/7an6a+a2l5FeTED5kpzvD4+yrQAoY8lT -gccRdP0O4CsLn7zlLRidPQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIBTzCB9qADAgECAgMDDT8wCgYIKoZIzj0EAwIwDzENMAsGA1UEAxMEdGVzdDAe -Fw0xNjAzMjgxODQxNDdaFw0yNzAzMjgxODQxNDdaMA8xDTALBgNVBAMTBHRlc3Qw -WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQy8xfFkSiJA10EC1MMJzkLgu6csocC -UNyix7zOqijLsASE4an5LQsZ1PuhgVYnL+B9rAcnXgJaLM8YOmLRPqNdo0EwPzAO -BgNVHQ8BAf8EBAMCAqQwGQYDVR0lBBIwEAYIKwYBBQUHAwMGBFUdJQAwEgYDVR0T -AQH/BAgwBgEB/wIBATAKBggqhkjOPQQDAgNIADBFAiEAwUrZY7fHwr4FWONiBJo6 -97V9GAbj70ZJqV5M7rt+hMECIFY66kUrv0sG2vlhicSIGwSOdB3VcijdZSelzLn1 -iRk5 ------END CERTIFICATE----- diff --git a/vendor/github.com/fsnotify/fsnotify/.github/ISSUE_TEMPLATE.md b/vendor/github.com/fsnotify/fsnotify/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 4ad1aed8f..000000000 --- a/vendor/github.com/fsnotify/fsnotify/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,11 +0,0 @@ -Before reporting an issue, please ensure you are using the latest release of fsnotify. - -### Which operating system (GOOS) and version are you using? - -Linux: lsb_release -a -macOS: sw_vers -Windows: systeminfo | findstr /B /C:OS - -### Please describe the issue that occurred. - -### Are you able to reproduce the issue? Please provide steps to reproduce and a code sample if possible. diff --git a/vendor/github.com/fsnotify/fsnotify/.github/PULL_REQUEST_TEMPLATE.md b/vendor/github.com/fsnotify/fsnotify/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 64ddf7cef..000000000 --- a/vendor/github.com/fsnotify/fsnotify/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,8 +0,0 @@ -#### What does this pull request do? - - -#### Where should the reviewer start? - - -#### How should this be manually tested? - diff --git a/vendor/github.com/hashicorp/hcl/.github/ISSUE_TEMPLATE.md b/vendor/github.com/hashicorp/hcl/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 2d7fc4bf6..000000000 --- a/vendor/github.com/hashicorp/hcl/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,21 +0,0 @@ -### HCL Template -```hcl -# Place your HCL configuration file here -``` - -### Expected behavior -What should have happened? - -### Actual behavior -What actually happened? - -### Steps to reproduce -1. -2. -3. - -### References -Are there any other GitHub issues (open or closed) that should -be linked here? For example: -- GH-1234 -- ... diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd.go b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd.go deleted file mode 100644 index 2380d71e3..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd.go +++ /dev/null @@ -1,162 +0,0 @@ -// Derivative work from: -// - https://golang.org/src/cmd/gofmt/gofmt.go -// - https://github.com/fatih/hclfmt - -package fmtcmd - -import ( - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/hashicorp/hcl/hcl/printer" -) - -var ( - ErrWriteStdin = errors.New("cannot use write option with standard input") -) - -type Options struct { - List bool // list files whose formatting differs - Write bool // write result to (source) file instead of stdout - Diff bool // display diffs of formatting changes -} - -func isValidFile(f os.FileInfo, extensions []string) bool { - if !f.IsDir() && !strings.HasPrefix(f.Name(), ".") { - for _, ext := range extensions { - if strings.HasSuffix(f.Name(), "."+ext) { - return true - } - } - } - - return false -} - -// If in == nil, the source is the contents of the file with the given filename. -func processFile(filename string, in io.Reader, out io.Writer, stdin bool, opts Options) error { - if in == nil { - f, err := os.Open(filename) - if err != nil { - return err - } - defer f.Close() - in = f - } - - src, err := ioutil.ReadAll(in) - if err != nil { - return err - } - - res, err := printer.Format(src) - if err != nil { - return fmt.Errorf("In %s: %s", filename, err) - } - - if !bytes.Equal(src, res) { - // formatting has changed - if opts.List { - fmt.Fprintln(out, filename) - } - if opts.Write { - err = ioutil.WriteFile(filename, res, 0644) - if err != nil { - return err - } - } - if opts.Diff { - data, err := diff(src, res) - if err != nil { - return fmt.Errorf("computing diff: %s", err) - } - fmt.Fprintf(out, "diff a/%s b/%s\n", filename, filename) - out.Write(data) - } - } - - if !opts.List && !opts.Write && !opts.Diff { - _, err = out.Write(res) - } - - return err -} - -func walkDir(path string, extensions []string, stdout io.Writer, opts Options) error { - visitFile := func(path string, f os.FileInfo, err error) error { - if err == nil && isValidFile(f, extensions) { - err = processFile(path, nil, stdout, false, opts) - } - return err - } - - return filepath.Walk(path, visitFile) -} - -func Run( - paths, extensions []string, - stdin io.Reader, - stdout io.Writer, - opts Options, -) error { - if len(paths) == 0 { - if opts.Write { - return ErrWriteStdin - } - if err := processFile("", stdin, stdout, true, opts); err != nil { - return err - } - return nil - } - - for _, path := range paths { - switch dir, err := os.Stat(path); { - case err != nil: - return err - case dir.IsDir(): - if err := walkDir(path, extensions, stdout, opts); err != nil { - return err - } - default: - if err := processFile(path, nil, stdout, false, opts); err != nil { - return err - } - } - } - - return nil -} - -func diff(b1, b2 []byte) (data []byte, err error) { - f1, err := ioutil.TempFile("", "") - if err != nil { - return - } - defer os.Remove(f1.Name()) - defer f1.Close() - - f2, err := ioutil.TempFile("", "") - if err != nil { - return - } - defer os.Remove(f2.Name()) - defer f2.Close() - - f1.Write(b1) - f2.Write(b2) - - data, err = exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput() - if len(data) > 0 { - // diff exits with a non-zero status when the files don't match. - // Ignore that failure as long as we get output. - err = nil - } - return -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd_test.go b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd_test.go deleted file mode 100644 index b952d76d8..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd_test.go +++ /dev/null @@ -1,440 +0,0 @@ -// +build !windows -// TODO(jen20): These need fixing on Windows but fmt is not used right now -// and red CI is making it harder to process other bugs, so ignore until -// we get around to fixing them. - -package fmtcmd - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "regexp" - "sort" - "syscall" - "testing" - - "github.com/hashicorp/hcl/testhelper" -) - -var fixtureExtensions = []string{"hcl"} - -func init() { - sort.Sort(ByFilename(fixtures)) -} - -func TestIsValidFile(t *testing.T) { - const fixtureDir = "./test-fixtures" - - cases := []struct { - Path string - Expected bool - }{ - {"good.hcl", true}, - {".hidden.ignore", false}, - {"file.ignore", false}, - {"dir.ignore", false}, - } - - for _, tc := range cases { - file, err := os.Stat(filepath.Join(fixtureDir, tc.Path)) - if err != nil { - t.Errorf("unexpected error: %s", err) - } - - if res := isValidFile(file, fixtureExtensions); res != tc.Expected { - t.Errorf("want: %b, got: %b", tc.Expected, res) - } - } -} - -func TestRunMultiplePaths(t *testing.T) { - path1, err := renderFixtures("") - if err != nil { - t.Errorf("unexpected error: %s", err) - } - defer os.RemoveAll(path1) - path2, err := renderFixtures("") - if err != nil { - t.Errorf("unexpected error: %s", err) - } - defer os.RemoveAll(path2) - - var expectedOut bytes.Buffer - for _, path := range []string{path1, path2} { - for _, fixture := range fixtures { - if !bytes.Equal(fixture.golden, fixture.input) { - expectedOut.WriteString(filepath.Join(path, fixture.filename) + "\n") - } - } - } - - _, stdout := mockIO() - err = Run( - []string{path1, path2}, - fixtureExtensions, - nil, stdout, - Options{ - List: true, - }, - ) - - if err != nil { - t.Errorf("unexpected error: %s", err) - } - if stdout.String() != expectedOut.String() { - t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) - } -} - -func TestRunSubDirectories(t *testing.T) { - pathParent, err := ioutil.TempDir("", "") - if err != nil { - t.Errorf("unexpected error: %s", err) - } - defer os.RemoveAll(pathParent) - - path1, err := renderFixtures(pathParent) - if err != nil { - t.Errorf("unexpected error: %s", err) - } - path2, err := renderFixtures(pathParent) - if err != nil { - t.Errorf("unexpected error: %s", err) - } - - paths := []string{path1, path2} - sort.Strings(paths) - - var expectedOut bytes.Buffer - for _, path := range paths { - for _, fixture := range fixtures { - if !bytes.Equal(fixture.golden, fixture.input) { - expectedOut.WriteString(filepath.Join(path, fixture.filename) + "\n") - } - } - } - - _, stdout := mockIO() - err = Run( - []string{pathParent}, - fixtureExtensions, - nil, stdout, - Options{ - List: true, - }, - ) - - if err != nil { - t.Errorf("unexpected error: %s", err) - } - if stdout.String() != expectedOut.String() { - t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) - } -} - -func TestRunStdin(t *testing.T) { - var expectedOut bytes.Buffer - for i, fixture := range fixtures { - if i != 0 { - expectedOut.WriteString("\n") - } - expectedOut.Write(fixture.golden) - } - - stdin, stdout := mockIO() - for _, fixture := range fixtures { - stdin.Write(fixture.input) - } - - err := Run( - []string{}, - fixtureExtensions, - stdin, stdout, - Options{}, - ) - - if err != nil { - t.Errorf("unexpected error: %s", err) - } - if !bytes.Equal(stdout.Bytes(), expectedOut.Bytes()) { - t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) - } -} - -func TestRunStdinAndWrite(t *testing.T) { - var expectedOut = []byte{} - - stdin, stdout := mockIO() - stdin.WriteString("") - err := Run( - []string{}, []string{}, - stdin, stdout, - Options{ - Write: true, - }, - ) - - if err != ErrWriteStdin { - t.Errorf("error want:\n%s\ngot:\n%s", ErrWriteStdin, err) - } - if !bytes.Equal(stdout.Bytes(), expectedOut) { - t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) - } -} - -func TestRunFileError(t *testing.T) { - path, err := ioutil.TempDir("", "") - if err != nil { - t.Errorf("unexpected error: %s", err) - } - defer os.RemoveAll(path) - filename := filepath.Join(path, "unreadable.hcl") - - var expectedError = &os.PathError{ - Op: "open", - Path: filename, - Err: syscall.EACCES, - } - - err = ioutil.WriteFile(filename, []byte{}, 0000) - if err != nil { - t.Errorf("unexpected error: %s", err) - } - - _, stdout := mockIO() - err = Run( - []string{path}, - fixtureExtensions, - nil, stdout, - Options{}, - ) - - if !reflect.DeepEqual(err, expectedError) { - t.Errorf("error want: %#v, got: %#v", expectedError, err) - } -} - -func TestRunNoOptions(t *testing.T) { - path, err := renderFixtures("") - if err != nil { - t.Errorf("unexpected error: %s", err) - } - defer os.RemoveAll(path) - - var expectedOut bytes.Buffer - for _, fixture := range fixtures { - expectedOut.Write(fixture.golden) - } - - _, stdout := mockIO() - err = Run( - []string{path}, - fixtureExtensions, - nil, stdout, - Options{}, - ) - - if err != nil { - t.Errorf("unexpected error: %s", err) - } - if stdout.String() != expectedOut.String() { - t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) - } -} - -func TestRunList(t *testing.T) { - path, err := renderFixtures("") - if err != nil { - t.Errorf("unexpected error: %s", err) - } - defer os.RemoveAll(path) - - var expectedOut bytes.Buffer - for _, fixture := range fixtures { - if !bytes.Equal(fixture.golden, fixture.input) { - expectedOut.WriteString(fmt.Sprintln(filepath.Join(path, fixture.filename))) - } - } - - _, stdout := mockIO() - err = Run( - []string{path}, - fixtureExtensions, - nil, stdout, - Options{ - List: true, - }, - ) - - if err != nil { - t.Errorf("unexpected error: %s", err) - } - if stdout.String() != expectedOut.String() { - t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) - } -} - -func TestRunWrite(t *testing.T) { - path, err := renderFixtures("") - if err != nil { - t.Errorf("unexpected error: %s", err) - } - defer os.RemoveAll(path) - - _, stdout := mockIO() - err = Run( - []string{path}, - fixtureExtensions, - nil, stdout, - Options{ - Write: true, - }, - ) - - if err != nil { - t.Errorf("unexpected error: %s", err) - } - for _, fixture := range fixtures { - res, err := ioutil.ReadFile(filepath.Join(path, fixture.filename)) - if err != nil { - t.Errorf("unexpected error: %s", err) - } - if !bytes.Equal(res, fixture.golden) { - t.Errorf("file %q contents want:\n%s\ngot:\n%s", fixture.filename, fixture.golden, res) - } - } -} - -func TestRunDiff(t *testing.T) { - path, err := renderFixtures("") - if err != nil { - t.Errorf("unexpected error: %s", err) - } - defer os.RemoveAll(path) - - var expectedOut bytes.Buffer - for _, fixture := range fixtures { - if len(fixture.diff) > 0 { - expectedOut.WriteString( - regexp.QuoteMeta( - fmt.Sprintf("diff a/%s/%s b/%s/%s\n", path, fixture.filename, path, fixture.filename), - ), - ) - // Need to use regex to ignore datetimes in diff. - expectedOut.WriteString(`--- .+?\n`) - expectedOut.WriteString(`\+\+\+ .+?\n`) - expectedOut.WriteString(regexp.QuoteMeta(string(fixture.diff))) - } - } - - expectedOutString := testhelper.Unix2dos(expectedOut.String()) - - _, stdout := mockIO() - err = Run( - []string{path}, - fixtureExtensions, - nil, stdout, - Options{ - Diff: true, - }, - ) - - if err != nil { - t.Errorf("unexpected error: %s", err) - } - if !regexp.MustCompile(expectedOutString).Match(stdout.Bytes()) { - t.Errorf("stdout want match:\n%s\ngot:\n%q", expectedOutString, stdout) - } -} - -func mockIO() (stdin, stdout *bytes.Buffer) { - return new(bytes.Buffer), new(bytes.Buffer) -} - -type fixture struct { - filename string - input, golden, diff []byte -} - -type ByFilename []fixture - -func (s ByFilename) Len() int { return len(s) } -func (s ByFilename) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s ByFilename) Less(i, j int) bool { return len(s[i].filename) > len(s[j].filename) } - -var fixtures = []fixture{ - { - "noop.hcl", - []byte(`resource "aws_security_group" "firewall" { - count = 5 -} -`), - []byte(`resource "aws_security_group" "firewall" { - count = 5 -} -`), - []byte(``), - }, { - "align_equals.hcl", - []byte(`variable "foo" { - default = "bar" - description = "bar" -} -`), - []byte(`variable "foo" { - default = "bar" - description = "bar" -} -`), - []byte(`@@ -1,4 +1,4 @@ - variable "foo" { -- default = "bar" -+ default = "bar" - description = "bar" - } -`), - }, { - "indentation.hcl", - []byte(`provider "aws" { - access_key = "foo" - secret_key = "bar" -} -`), - []byte(`provider "aws" { - access_key = "foo" - secret_key = "bar" -} -`), - []byte(`@@ -1,4 +1,4 @@ - provider "aws" { -- access_key = "foo" -- secret_key = "bar" -+ access_key = "foo" -+ secret_key = "bar" - } -`), - }, -} - -// parent can be an empty string, in which case the system's default -// temporary directory will be used. -func renderFixtures(parent string) (path string, err error) { - path, err = ioutil.TempDir(parent, "") - if err != nil { - return "", err - } - - for _, fixture := range fixtures { - err = ioutil.WriteFile(filepath.Join(path, fixture.filename), []byte(fixture.input), 0644) - if err != nil { - os.RemoveAll(path) - return "", err - } - } - - return path, nil -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/.hidden.ignore b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/.hidden.ignore deleted file mode 100644 index 9977a2836..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/.hidden.ignore +++ /dev/null @@ -1 +0,0 @@ -invalid diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/dir.ignore b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/dir.ignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/file.ignore b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/file.ignore deleted file mode 100644 index 9977a2836..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/file.ignore +++ /dev/null @@ -1 +0,0 @@ -invalid diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/good.hcl b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/good.hcl deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/array_comment.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/array_comment.hcl deleted file mode 100644 index 78c267582..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/array_comment.hcl +++ /dev/null @@ -1,4 +0,0 @@ -foo = [ - "1", - "2", # comment -] diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/array_comment_2.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/array_comment_2.hcl deleted file mode 100644 index f91667738..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/array_comment_2.hcl +++ /dev/null @@ -1,6 +0,0 @@ -provisioner "remote-exec" { - scripts = [ - "${path.module}/scripts/install-consul.sh" // missing comma - "${path.module}/scripts/install-haproxy.sh" - ] -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/assign_colon.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/assign_colon.hcl deleted file mode 100644 index eb5a99a69..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/assign_colon.hcl +++ /dev/null @@ -1,6 +0,0 @@ -resource = [{ - "foo": { - "bar": {}, - "baz": [1, 2, "foo"], - } -}] diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/assign_deep.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/assign_deep.hcl deleted file mode 100644 index dd3151cb7..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/assign_deep.hcl +++ /dev/null @@ -1,5 +0,0 @@ -resource = [{ - foo = [{ - bar = {} - }] -}] diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment.hcl deleted file mode 100644 index e32be87ed..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment.hcl +++ /dev/null @@ -1,15 +0,0 @@ -// Foo - -/* Bar */ - -/* -/* -Baz -*/ - -# Another - -# Multiple -# Lines - -foo = "bar" diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_crlf.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_crlf.hcl deleted file mode 100644 index 1ff7f29fd..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_crlf.hcl +++ /dev/null @@ -1,15 +0,0 @@ -// Foo - -/* Bar */ - -/* -/* -Baz -*/ - -# Another - -# Multiple -# Lines - -foo = "bar" diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_lastline.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_lastline.hcl deleted file mode 100644 index 5529b9b4c..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_lastline.hcl +++ /dev/null @@ -1 +0,0 @@ -#foo \ No newline at end of file diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_single.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_single.hcl deleted file mode 100644 index fec56017d..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/comment_single.hcl +++ /dev/null @@ -1 +0,0 @@ -# Hello diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex.hcl deleted file mode 100644 index 13b3c2726..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex.hcl +++ /dev/null @@ -1,42 +0,0 @@ -variable "foo" { - default = "bar" - description = "bar" -} - -variable "groups" { } - -provider "aws" { - access_key = "foo" - secret_key = "bar" -} - -provider "do" { - api_key = "${var.foo}" -} - -resource "aws_security_group" "firewall" { - count = 5 -} - -resource aws_instance "web" { - ami = "${var.foo}" - security_groups = [ - "foo", - "${aws_security_group.firewall.foo}", - "${element(split(\",\", var.groups)}", - ] - network_interface = { - device_index = 0 - description = "Main network interface" - } -} - -resource "aws_instance" "db" { - security_groups = "${aws_security_group.firewall.*.id}" - VPC = "foo" - depends_on = ["aws_instance.web"] -} - -output "web_ip" { - value = "${aws_instance.web.private_ip}" -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex_crlf.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex_crlf.hcl deleted file mode 100644 index 9b071d12b..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex_crlf.hcl +++ /dev/null @@ -1,42 +0,0 @@ -variable "foo" { - default = "bar" - description = "bar" -} - -variable "groups" { } - -provider "aws" { - access_key = "foo" - secret_key = "bar" -} - -provider "do" { - api_key = "${var.foo}" -} - -resource "aws_security_group" "firewall" { - count = 5 -} - -resource aws_instance "web" { - ami = "${var.foo}" - security_groups = [ - "foo", - "${aws_security_group.firewall.foo}", - "${element(split(\",\", var.groups)}", - ] - network_interface = { - device_index = 0 - description = "Main network interface" - } -} - -resource "aws_instance" "db" { - security_groups = "${aws_security_group.firewall.*.id}" - VPC = "foo" - depends_on = ["aws_instance.web"] -} - -output "web_ip" { - value = "${aws_instance.web.private_ip}" -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex_key.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex_key.hcl deleted file mode 100644 index 0007aaf5f..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/complex_key.hcl +++ /dev/null @@ -1 +0,0 @@ -foo.bar = "baz" diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/empty.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/empty.hcl deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/git_crypt.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/git_crypt.hcl deleted file mode 100644 index f691948e1b4238d680e670973bbae039c809e5ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10 RcmZQ@_Y83kiVO(h0ssw90)YSk diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/key_without_value.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/key_without_value.hcl deleted file mode 100644 index 257cc5642..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/key_without_value.hcl +++ /dev/null @@ -1 +0,0 @@ -foo diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/list.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/list.hcl deleted file mode 100644 index 059d4ce65..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/list.hcl +++ /dev/null @@ -1 +0,0 @@ -foo = [1, 2, "foo"] diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/list_comma.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/list_comma.hcl deleted file mode 100644 index 50f4218ac..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/list_comma.hcl +++ /dev/null @@ -1 +0,0 @@ -foo = [1, 2, "foo",] diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/missing_braces.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/missing_braces.hcl deleted file mode 100644 index 68e7274e6..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/missing_braces.hcl +++ /dev/null @@ -1,4 +0,0 @@ -# should error, but not crash -resource "template_file" "cloud_config" { - template = "$file("${path.module}/some/path")" -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/multiple.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/multiple.hcl deleted file mode 100644 index 029c54b0c..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/multiple.hcl +++ /dev/null @@ -1,2 +0,0 @@ -foo = "bar" -key = 7 diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value.hcl deleted file mode 100644 index 37a2c7a06..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value.hcl +++ /dev/null @@ -1,3 +0,0 @@ -foo { - bar = -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value2.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value2.hcl deleted file mode 100644 index 83ec5e66e..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value2.hcl +++ /dev/null @@ -1,4 +0,0 @@ -foo { - baz = 7 - bar = -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value3.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value3.hcl deleted file mode 100644 index 21136d1d5..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_assign_without_value3.hcl +++ /dev/null @@ -1,4 +0,0 @@ -foo { - bar = - baz = 7 -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_without_value.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_without_value.hcl deleted file mode 100644 index a9987318c..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_key_without_value.hcl +++ /dev/null @@ -1,3 +0,0 @@ -foo { - bar -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_list_comma.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_list_comma.hcl deleted file mode 100644 index 1921ec8f2..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/object_list_comma.hcl +++ /dev/null @@ -1 +0,0 @@ -foo = {one = 1, two = 2} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/old.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/old.hcl deleted file mode 100644 index e9f77cae9..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/old.hcl +++ /dev/null @@ -1,3 +0,0 @@ -default = { - "eu-west-1": "ami-b1cf19c6", -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure.hcl deleted file mode 100644 index 92592fbb3..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure.hcl +++ /dev/null @@ -1,5 +0,0 @@ -// This is a test structure for the lexer -foo bar "baz" { - key = 7 - foo = "bar" -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure_basic.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure_basic.hcl deleted file mode 100644 index 7229a1f01..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure_basic.hcl +++ /dev/null @@ -1,5 +0,0 @@ -foo { - value = 7 - "value" = 8 - "complex::value" = 9 -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure_empty.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure_empty.hcl deleted file mode 100644 index 4d156ddea..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/structure_empty.hcl +++ /dev/null @@ -1 +0,0 @@ -resource "foo" "bar" {} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/types.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/types.hcl deleted file mode 100644 index cf2747ea1..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/types.hcl +++ /dev/null @@ -1,7 +0,0 @@ -foo = "bar" -bar = 7 -baz = [1,2,3] -foo = -12 -bar = 3.14159 -foo = true -bar = false diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/unterminated_object.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/unterminated_object.hcl deleted file mode 100644 index 31b37c4f9..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/unterminated_object.hcl +++ /dev/null @@ -1,2 +0,0 @@ -foo "baz" { - bar = "baz" diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/unterminated_object_2.hcl b/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/unterminated_object_2.hcl deleted file mode 100644 index 294e36d65..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/test-fixtures/unterminated_object_2.hcl +++ /dev/null @@ -1,6 +0,0 @@ -resource "aws_eip" "EIP1" { a { a { a { a { a { - count = "1" - -resource "aws_eip" "EIP2" { - count = "1" -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go b/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go deleted file mode 100644 index c896d5844..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go +++ /dev/null @@ -1,779 +0,0 @@ -package printer - -import ( - "bytes" - "fmt" - "sort" - - "github.com/hashicorp/hcl/hcl/ast" - "github.com/hashicorp/hcl/hcl/token" -) - -const ( - blank = byte(' ') - newline = byte('\n') - tab = byte('\t') - infinity = 1 << 30 // offset or line -) - -var ( - unindent = []byte("\uE123") // in the private use space -) - -type printer struct { - cfg Config - prev token.Pos - - comments []*ast.CommentGroup // may be nil, contains all comments - standaloneComments []*ast.CommentGroup // contains all standalone comments (not assigned to any node) - - enableTrace bool - indentTrace int -} - -type ByPosition []*ast.CommentGroup - -func (b ByPosition) Len() int { return len(b) } -func (b ByPosition) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b ByPosition) Less(i, j int) bool { return b[i].Pos().Before(b[j].Pos()) } - -// collectComments comments all standalone comments which are not lead or line -// comment -func (p *printer) collectComments(node ast.Node) { - // first collect all comments. This is already stored in - // ast.File.(comments) - ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { - switch t := nn.(type) { - case *ast.File: - p.comments = t.Comments - return nn, false - } - return nn, true - }) - - standaloneComments := make(map[token.Pos]*ast.CommentGroup, 0) - for _, c := range p.comments { - standaloneComments[c.Pos()] = c - } - - // next remove all lead and line comments from the overall comment map. - // This will give us comments which are standalone, comments which are not - // assigned to any kind of node. - ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { - switch t := nn.(type) { - case *ast.LiteralType: - if t.LeadComment != nil { - for _, comment := range t.LeadComment.List { - if _, ok := standaloneComments[comment.Pos()]; ok { - delete(standaloneComments, comment.Pos()) - } - } - } - - if t.LineComment != nil { - for _, comment := range t.LineComment.List { - if _, ok := standaloneComments[comment.Pos()]; ok { - delete(standaloneComments, comment.Pos()) - } - } - } - case *ast.ObjectItem: - if t.LeadComment != nil { - for _, comment := range t.LeadComment.List { - if _, ok := standaloneComments[comment.Pos()]; ok { - delete(standaloneComments, comment.Pos()) - } - } - } - - if t.LineComment != nil { - for _, comment := range t.LineComment.List { - if _, ok := standaloneComments[comment.Pos()]; ok { - delete(standaloneComments, comment.Pos()) - } - } - } - } - - return nn, true - }) - - for _, c := range standaloneComments { - p.standaloneComments = append(p.standaloneComments, c) - } - - sort.Sort(ByPosition(p.standaloneComments)) -} - -// output prints creates b printable HCL output and returns it. -func (p *printer) output(n interface{}) []byte { - var buf bytes.Buffer - - switch t := n.(type) { - case *ast.File: - // File doesn't trace so we add the tracing here - defer un(trace(p, "File")) - return p.output(t.Node) - case *ast.ObjectList: - defer un(trace(p, "ObjectList")) - - var index int - for { - // Determine the location of the next actual non-comment - // item. If we're at the end, the next item is at "infinity" - var nextItem token.Pos - if index != len(t.Items) { - nextItem = t.Items[index].Pos() - } else { - nextItem = token.Pos{Offset: infinity, Line: infinity} - } - - // Go through the standalone comments in the file and print out - // the comments that we should be for this object item. - for _, c := range p.standaloneComments { - // Go through all the comments in the group. The group - // should be printed together, not separated by double newlines. - printed := false - newlinePrinted := false - for _, comment := range c.List { - // We only care about comments after the previous item - // we've printed so that comments are printed in the - // correct locations (between two objects for example). - // And before the next item. - if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { - // if we hit the end add newlines so we can print the comment - // we don't do this if prev is invalid which means the - // beginning of the file since the first comment should - // be at the first line. - if !newlinePrinted && p.prev.IsValid() && index == len(t.Items) { - buf.Write([]byte{newline, newline}) - newlinePrinted = true - } - - // Write the actual comment. - buf.WriteString(comment.Text) - buf.WriteByte(newline) - - // Set printed to true to note that we printed something - printed = true - } - } - - // If we're not at the last item, write a new line so - // that there is a newline separating this comment from - // the next object. - if printed && index != len(t.Items) { - buf.WriteByte(newline) - } - } - - if index == len(t.Items) { - break - } - - buf.Write(p.output(t.Items[index])) - if index != len(t.Items)-1 { - // Always write a newline to separate us from the next item - buf.WriteByte(newline) - - // Need to determine if we're going to separate the next item - // with a blank line. The logic here is simple, though there - // are a few conditions: - // - // 1. The next object is more than one line away anyways, - // so we need an empty line. - // - // 2. The next object is not a "single line" object, so - // we need an empty line. - // - // 3. This current object is not a single line object, - // so we need an empty line. - current := t.Items[index] - next := t.Items[index+1] - if next.Pos().Line != t.Items[index].Pos().Line+1 || - !p.isSingleLineObject(next) || - !p.isSingleLineObject(current) { - buf.WriteByte(newline) - } - } - index++ - } - case *ast.ObjectKey: - buf.WriteString(t.Token.Text) - case *ast.ObjectItem: - p.prev = t.Pos() - buf.Write(p.objectItem(t)) - case *ast.LiteralType: - buf.Write(p.literalType(t)) - case *ast.ListType: - buf.Write(p.list(t)) - case *ast.ObjectType: - buf.Write(p.objectType(t)) - default: - fmt.Printf(" unknown type: %T\n", n) - } - - return buf.Bytes() -} - -func (p *printer) literalType(lit *ast.LiteralType) []byte { - result := []byte(lit.Token.Text) - switch lit.Token.Type { - case token.HEREDOC: - // Clear the trailing newline from heredocs - if result[len(result)-1] == '\n' { - result = result[:len(result)-1] - } - - // Poison lines 2+ so that we don't indent them - result = p.heredocIndent(result) - case token.STRING: - // If this is a multiline string, poison lines 2+ so we don't - // indent them. - if bytes.IndexRune(result, '\n') >= 0 { - result = p.heredocIndent(result) - } - } - - return result -} - -// objectItem returns the printable HCL form of an object item. An object type -// starts with one/multiple keys and has a value. The value might be of any -// type. -func (p *printer) objectItem(o *ast.ObjectItem) []byte { - defer un(trace(p, fmt.Sprintf("ObjectItem: %s", o.Keys[0].Token.Text))) - var buf bytes.Buffer - - if o.LeadComment != nil { - for _, comment := range o.LeadComment.List { - buf.WriteString(comment.Text) - buf.WriteByte(newline) - } - } - - for i, k := range o.Keys { - buf.WriteString(k.Token.Text) - buf.WriteByte(blank) - - // reach end of key - if o.Assign.IsValid() && i == len(o.Keys)-1 && len(o.Keys) == 1 { - buf.WriteString("=") - buf.WriteByte(blank) - } - } - - buf.Write(p.output(o.Val)) - - if o.Val.Pos().Line == o.Keys[0].Pos().Line && o.LineComment != nil { - buf.WriteByte(blank) - for _, comment := range o.LineComment.List { - buf.WriteString(comment.Text) - } - } - - return buf.Bytes() -} - -// objectType returns the printable HCL form of an object type. An object type -// begins with a brace and ends with a brace. -func (p *printer) objectType(o *ast.ObjectType) []byte { - defer un(trace(p, "ObjectType")) - var buf bytes.Buffer - buf.WriteString("{") - - var index int - var nextItem token.Pos - var commented, newlinePrinted bool - for { - // Determine the location of the next actual non-comment - // item. If we're at the end, the next item is the closing brace - if index != len(o.List.Items) { - nextItem = o.List.Items[index].Pos() - } else { - nextItem = o.Rbrace - } - - // Go through the standalone comments in the file and print out - // the comments that we should be for this object item. - for _, c := range p.standaloneComments { - printed := false - var lastCommentPos token.Pos - for _, comment := range c.List { - // We only care about comments after the previous item - // we've printed so that comments are printed in the - // correct locations (between two objects for example). - // And before the next item. - if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { - // If there are standalone comments and the initial newline has not - // been printed yet, do it now. - if !newlinePrinted { - newlinePrinted = true - buf.WriteByte(newline) - } - - // add newline if it's between other printed nodes - if index > 0 { - commented = true - buf.WriteByte(newline) - } - - // Store this position - lastCommentPos = comment.Pos() - - // output the comment itself - buf.Write(p.indent(p.heredocIndent([]byte(comment.Text)))) - - // Set printed to true to note that we printed something - printed = true - - /* - if index != len(o.List.Items) { - buf.WriteByte(newline) // do not print on the end - } - */ - } - } - - // Stuff to do if we had comments - if printed { - // Always write a newline - buf.WriteByte(newline) - - // If there is another item in the object and our comment - // didn't hug it directly, then make sure there is a blank - // line separating them. - if nextItem != o.Rbrace && nextItem.Line != lastCommentPos.Line+1 { - buf.WriteByte(newline) - } - } - } - - if index == len(o.List.Items) { - p.prev = o.Rbrace - break - } - - // At this point we are sure that it's not a totally empty block: print - // the initial newline if it hasn't been printed yet by the previous - // block about standalone comments. - if !newlinePrinted { - buf.WriteByte(newline) - newlinePrinted = true - } - - // check if we have adjacent one liner items. If yes we'll going to align - // the comments. - var aligned []*ast.ObjectItem - for _, item := range o.List.Items[index:] { - // we don't group one line lists - if len(o.List.Items) == 1 { - break - } - - // one means a oneliner with out any lead comment - // two means a oneliner with lead comment - // anything else might be something else - cur := lines(string(p.objectItem(item))) - if cur > 2 { - break - } - - curPos := item.Pos() - - nextPos := token.Pos{} - if index != len(o.List.Items)-1 { - nextPos = o.List.Items[index+1].Pos() - } - - prevPos := token.Pos{} - if index != 0 { - prevPos = o.List.Items[index-1].Pos() - } - - // fmt.Println("DEBUG ----------------") - // fmt.Printf("prev = %+v prevPos: %s\n", prev, prevPos) - // fmt.Printf("cur = %+v curPos: %s\n", cur, curPos) - // fmt.Printf("next = %+v nextPos: %s\n", next, nextPos) - - if curPos.Line+1 == nextPos.Line { - aligned = append(aligned, item) - index++ - continue - } - - if curPos.Line-1 == prevPos.Line { - aligned = append(aligned, item) - index++ - - // finish if we have a new line or comment next. This happens - // if the next item is not adjacent - if curPos.Line+1 != nextPos.Line { - break - } - continue - } - - break - } - - // put newlines if the items are between other non aligned items. - // newlines are also added if there is a standalone comment already, so - // check it too - if !commented && index != len(aligned) { - buf.WriteByte(newline) - } - - if len(aligned) >= 1 { - p.prev = aligned[len(aligned)-1].Pos() - - items := p.alignedItems(aligned) - buf.Write(p.indent(items)) - } else { - p.prev = o.List.Items[index].Pos() - - buf.Write(p.indent(p.objectItem(o.List.Items[index]))) - index++ - } - - buf.WriteByte(newline) - } - - buf.WriteString("}") - return buf.Bytes() -} - -func (p *printer) alignedItems(items []*ast.ObjectItem) []byte { - var buf bytes.Buffer - - // find the longest key and value length, needed for alignment - var longestKeyLen int // longest key length - var longestValLen int // longest value length - for _, item := range items { - key := len(item.Keys[0].Token.Text) - val := len(p.output(item.Val)) - - if key > longestKeyLen { - longestKeyLen = key - } - - if val > longestValLen { - longestValLen = val - } - } - - for i, item := range items { - if item.LeadComment != nil { - for _, comment := range item.LeadComment.List { - buf.WriteString(comment.Text) - buf.WriteByte(newline) - } - } - - for i, k := range item.Keys { - keyLen := len(k.Token.Text) - buf.WriteString(k.Token.Text) - for i := 0; i < longestKeyLen-keyLen+1; i++ { - buf.WriteByte(blank) - } - - // reach end of key - if i == len(item.Keys)-1 && len(item.Keys) == 1 { - buf.WriteString("=") - buf.WriteByte(blank) - } - } - - val := p.output(item.Val) - valLen := len(val) - buf.Write(val) - - if item.Val.Pos().Line == item.Keys[0].Pos().Line && item.LineComment != nil { - for i := 0; i < longestValLen-valLen+1; i++ { - buf.WriteByte(blank) - } - - for _, comment := range item.LineComment.List { - buf.WriteString(comment.Text) - } - } - - // do not print for the last item - if i != len(items)-1 { - buf.WriteByte(newline) - } - } - - return buf.Bytes() -} - -// list returns the printable HCL form of an list type. -func (p *printer) list(l *ast.ListType) []byte { - var buf bytes.Buffer - buf.WriteString("[") - - var longestLine int - for _, item := range l.List { - // for now we assume that the list only contains literal types - if lit, ok := item.(*ast.LiteralType); ok { - lineLen := len(lit.Token.Text) - if lineLen > longestLine { - longestLine = lineLen - } - } - } - - insertSpaceBeforeItem := false - lastHadLeadComment := false - for i, item := range l.List { - // Keep track of whether this item is a heredoc since that has - // unique behavior. - heredoc := false - if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC { - heredoc = true - } - - if item.Pos().Line != l.Lbrack.Line { - // multiline list, add newline before we add each item - buf.WriteByte(newline) - insertSpaceBeforeItem = false - - // If we have a lead comment, then we want to write that first - leadComment := false - if lit, ok := item.(*ast.LiteralType); ok && lit.LeadComment != nil { - leadComment = true - - // If this isn't the first item and the previous element - // didn't have a lead comment, then we need to add an extra - // newline to properly space things out. If it did have a - // lead comment previously then this would be done - // automatically. - if i > 0 && !lastHadLeadComment { - buf.WriteByte(newline) - } - - for _, comment := range lit.LeadComment.List { - buf.Write(p.indent([]byte(comment.Text))) - buf.WriteByte(newline) - } - } - - // also indent each line - val := p.output(item) - curLen := len(val) - buf.Write(p.indent(val)) - - // if this item is a heredoc, then we output the comma on - // the next line. This is the only case this happens. - comma := []byte{','} - if heredoc { - buf.WriteByte(newline) - comma = p.indent(comma) - } - - buf.Write(comma) - - if lit, ok := item.(*ast.LiteralType); ok && lit.LineComment != nil { - // if the next item doesn't have any comments, do not align - buf.WriteByte(blank) // align one space - for i := 0; i < longestLine-curLen; i++ { - buf.WriteByte(blank) - } - - for _, comment := range lit.LineComment.List { - buf.WriteString(comment.Text) - } - } - - lastItem := i == len(l.List)-1 - if lastItem { - buf.WriteByte(newline) - } - - if leadComment && !lastItem { - buf.WriteByte(newline) - } - - lastHadLeadComment = leadComment - } else { - if insertSpaceBeforeItem { - buf.WriteByte(blank) - insertSpaceBeforeItem = false - } - - // Output the item itself - // also indent each line - val := p.output(item) - curLen := len(val) - buf.Write(val) - - // If this is a heredoc item we always have to output a newline - // so that it parses properly. - if heredoc { - buf.WriteByte(newline) - } - - // If this isn't the last element, write a comma. - if i != len(l.List)-1 { - buf.WriteString(",") - insertSpaceBeforeItem = true - } - - if lit, ok := item.(*ast.LiteralType); ok && lit.LineComment != nil { - // if the next item doesn't have any comments, do not align - buf.WriteByte(blank) // align one space - for i := 0; i < longestLine-curLen; i++ { - buf.WriteByte(blank) - } - - for _, comment := range lit.LineComment.List { - buf.WriteString(comment.Text) - } - } - } - - } - - buf.WriteString("]") - return buf.Bytes() -} - -// indent indents the lines of the given buffer for each non-empty line -func (p *printer) indent(buf []byte) []byte { - var prefix []byte - if p.cfg.SpacesWidth != 0 { - for i := 0; i < p.cfg.SpacesWidth; i++ { - prefix = append(prefix, blank) - } - } else { - prefix = []byte{tab} - } - - var res []byte - bol := true - for _, c := range buf { - if bol && c != '\n' { - res = append(res, prefix...) - } - - res = append(res, c) - bol = c == '\n' - } - return res -} - -// unindent removes all the indentation from the tombstoned lines -func (p *printer) unindent(buf []byte) []byte { - var res []byte - for i := 0; i < len(buf); i++ { - skip := len(buf)-i <= len(unindent) - if !skip { - skip = !bytes.Equal(unindent, buf[i:i+len(unindent)]) - } - if skip { - res = append(res, buf[i]) - continue - } - - // We have a marker. we have to backtrace here and clean out - // any whitespace ahead of our tombstone up to a \n - for j := len(res) - 1; j >= 0; j-- { - if res[j] == '\n' { - break - } - - res = res[:j] - } - - // Skip the entire unindent marker - i += len(unindent) - 1 - } - - return res -} - -// heredocIndent marks all the 2nd and further lines as unindentable -func (p *printer) heredocIndent(buf []byte) []byte { - var res []byte - bol := false - for _, c := range buf { - if bol && c != '\n' { - res = append(res, unindent...) - } - res = append(res, c) - bol = c == '\n' - } - return res -} - -// isSingleLineObject tells whether the given object item is a single -// line object such as "obj {}". -// -// A single line object: -// -// * has no lead comments (hence multi-line) -// * has no assignment -// * has no values in the stanza (within {}) -// -func (p *printer) isSingleLineObject(val *ast.ObjectItem) bool { - // If there is a lead comment, can't be one line - if val.LeadComment != nil { - return false - } - - // If there is assignment, we always break by line - if val.Assign.IsValid() { - return false - } - - // If it isn't an object type, then its not a single line object - ot, ok := val.Val.(*ast.ObjectType) - if !ok { - return false - } - - // If the object has no items, it is single line! - return len(ot.List.Items) == 0 -} - -func lines(txt string) int { - endline := 1 - for i := 0; i < len(txt); i++ { - if txt[i] == '\n' { - endline++ - } - } - return endline -} - -// ---------------------------------------------------------------------------- -// Tracing support - -func (p *printer) printTrace(a ...interface{}) { - if !p.enableTrace { - return - } - - const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " - const n = len(dots) - i := 2 * p.indentTrace - for i > n { - fmt.Print(dots) - i -= n - } - // i <= n - fmt.Print(dots[0:i]) - fmt.Println(a...) -} - -func trace(p *printer, msg string) *printer { - p.printTrace(msg, "(") - p.indentTrace++ - return p -} - -// Usage pattern: defer un(trace(p, "...")) -func un(p *printer) { - p.indentTrace-- - p.printTrace(")") -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go b/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go deleted file mode 100644 index 6617ab8e7..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go +++ /dev/null @@ -1,66 +0,0 @@ -// Package printer implements printing of AST nodes to HCL format. -package printer - -import ( - "bytes" - "io" - "text/tabwriter" - - "github.com/hashicorp/hcl/hcl/ast" - "github.com/hashicorp/hcl/hcl/parser" -) - -var DefaultConfig = Config{ - SpacesWidth: 2, -} - -// A Config node controls the output of Fprint. -type Config struct { - SpacesWidth int // if set, it will use spaces instead of tabs for alignment -} - -func (c *Config) Fprint(output io.Writer, node ast.Node) error { - p := &printer{ - cfg: *c, - comments: make([]*ast.CommentGroup, 0), - standaloneComments: make([]*ast.CommentGroup, 0), - // enableTrace: true, - } - - p.collectComments(node) - - if _, err := output.Write(p.unindent(p.output(node))); err != nil { - return err - } - - // flush tabwriter, if any - var err error - if tw, _ := output.(*tabwriter.Writer); tw != nil { - err = tw.Flush() - } - - return err -} - -// Fprint "pretty-prints" an HCL node to output -// It calls Config.Fprint with default settings. -func Fprint(output io.Writer, node ast.Node) error { - return DefaultConfig.Fprint(output, node) -} - -// Format formats src HCL and returns the result. -func Format(src []byte) ([]byte, error) { - node, err := parser.Parse(src) - if err != nil { - return nil, err - } - - var buf bytes.Buffer - if err := DefaultConfig.Fprint(&buf, node); err != nil { - return nil, err - } - - // Add trailing newline to result - buf.WriteString("\n") - return buf.Bytes(), nil -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/printer_test.go b/vendor/github.com/hashicorp/hcl/hcl/printer/printer_test.go deleted file mode 100644 index 5248259b9..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/printer_test.go +++ /dev/null @@ -1,149 +0,0 @@ -package printer - -import ( - "bytes" - "errors" - "flag" - "fmt" - "io/ioutil" - "path/filepath" - "testing" - - "github.com/hashicorp/hcl/hcl/parser" -) - -var update = flag.Bool("update", false, "update golden files") - -const ( - dataDir = "testdata" -) - -type entry struct { - source, golden string -} - -// Use go test -update to create/update the respective golden files. -var data = []entry{ - {"complexhcl.input", "complexhcl.golden"}, - {"list.input", "list.golden"}, - {"list_comment.input", "list_comment.golden"}, - {"comment.input", "comment.golden"}, - {"comment_crlf.input", "comment.golden"}, - {"comment_aligned.input", "comment_aligned.golden"}, - {"comment_array.input", "comment_array.golden"}, - {"comment_end_file.input", "comment_end_file.golden"}, - {"comment_multiline_indent.input", "comment_multiline_indent.golden"}, - {"comment_multiline_no_stanza.input", "comment_multiline_no_stanza.golden"}, - {"comment_multiline_stanza.input", "comment_multiline_stanza.golden"}, - {"comment_newline.input", "comment_newline.golden"}, - {"comment_object_multi.input", "comment_object_multi.golden"}, - {"comment_standalone.input", "comment_standalone.golden"}, - {"empty_block.input", "empty_block.golden"}, - {"list_of_objects.input", "list_of_objects.golden"}, - {"multiline_string.input", "multiline_string.golden"}, - {"object_singleline.input", "object_singleline.golden"}, - {"object_with_heredoc.input", "object_with_heredoc.golden"}, -} - -func TestFiles(t *testing.T) { - for _, e := range data { - source := filepath.Join(dataDir, e.source) - golden := filepath.Join(dataDir, e.golden) - t.Run(e.source, func(t *testing.T) { - check(t, source, golden) - }) - } -} - -func check(t *testing.T, source, golden string) { - src, err := ioutil.ReadFile(source) - if err != nil { - t.Error(err) - return - } - - res, err := format(src) - if err != nil { - t.Error(err) - return - } - - // update golden files if necessary - if *update { - if err := ioutil.WriteFile(golden, res, 0644); err != nil { - t.Error(err) - } - return - } - - // get golden - gld, err := ioutil.ReadFile(golden) - if err != nil { - t.Error(err) - return - } - - // formatted source and golden must be the same - if err := diff(source, golden, res, gld); err != nil { - t.Error(err) - return - } -} - -// diff compares a and b. -func diff(aname, bname string, a, b []byte) error { - var buf bytes.Buffer // holding long error message - - // compare lengths - if len(a) != len(b) { - fmt.Fprintf(&buf, "\nlength changed: len(%s) = %d, len(%s) = %d", aname, len(a), bname, len(b)) - } - - // compare contents - line := 1 - offs := 1 - for i := 0; i < len(a) && i < len(b); i++ { - ch := a[i] - if ch != b[i] { - fmt.Fprintf(&buf, "\n%s:%d:%d: %q", aname, line, i-offs+1, lineAt(a, offs)) - fmt.Fprintf(&buf, "\n%s:%d:%d: %q", bname, line, i-offs+1, lineAt(b, offs)) - fmt.Fprintf(&buf, "\n\n") - break - } - if ch == '\n' { - line++ - offs = i + 1 - } - } - - if buf.Len() > 0 { - return errors.New(buf.String()) - } - return nil -} - -// format parses src, prints the corresponding AST, verifies the resulting -// src is syntactically correct, and returns the resulting src or an error -// if any. -func format(src []byte) ([]byte, error) { - formatted, err := Format(src) - if err != nil { - return nil, err - } - - // make sure formatted output is syntactically correct - if _, err := parser.Parse(formatted); err != nil { - return nil, fmt.Errorf("parse: %s\n%s", err, formatted) - } - - return formatted, nil -} - -// lineAt returns the line in text starting at offset offs. -func lineAt(text []byte, offs int) []byte { - i := offs - for i < len(text) && text[i] != '\n' { - i++ - } - return text[offs:i] -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.golden b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.golden deleted file mode 100644 index 9d4b072a0..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.golden +++ /dev/null @@ -1,36 +0,0 @@ -// A standalone comment is a comment which is not attached to any kind of node - -// This comes from Terraform, as a test -variable "foo" { - # Standalone comment should be still here - - default = "bar" - description = "bar" # yooo -} - -/* This is a multi line standalone -comment*/ - -// fatih arslan -/* This is a developer test -account and a multine comment */ -developer = ["fatih", "arslan"] // fatih arslan - -# One line here -numbers = [1, 2] // another line here - -# Another comment -variable = { - description = "bar" # another yooo - - foo { - # Nested standalone - - bar = "fatih" - } -} - -// lead comment -foo { - bar = "fatih" // line comment 2 -} // line comment 3 diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.input b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.input deleted file mode 100644 index 57c37ac1d..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.input +++ /dev/null @@ -1,37 +0,0 @@ -// A standalone comment is a comment which is not attached to any kind of node - - // This comes from Terraform, as a test -variable "foo" { - # Standalone comment should be still here - - default = "bar" - description = "bar" # yooo -} - -/* This is a multi line standalone -comment*/ - - -// fatih arslan -/* This is a developer test -account and a multine comment */ -developer = [ "fatih", "arslan"] // fatih arslan - -# One line here -numbers = [1,2] // another line here - - # Another comment -variable = { - description = "bar" # another yooo - foo { - # Nested standalone - - bar = "fatih" - } -} - - // lead comment -foo { - bar = "fatih" // line comment 2 -} // line comment 3 - diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.golden b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.golden deleted file mode 100644 index 6ff21504c..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.golden +++ /dev/null @@ -1,32 +0,0 @@ -aligned { - # We have some aligned items below - foo = "fatih" # yoo1 - default = "bar" # yoo2 - bar = "bar and foo" # yoo3 - - default = { - bar = "example" - } - - #deneme arslan - fatih = ["fatih"] # yoo4 - - #fatih arslan - fatiharslan = ["arslan"] // yoo5 - - default = { - bar = "example" - } - - security_groups = [ - "foo", # kenya 1 - "${aws_security_group.firewall.foo}", # kenya 2 - ] - - security_groups2 = [ - "foo", # kenya 1 - "bar", # kenya 1.5 - "${aws_security_group.firewall.foo}", # kenya 2 - "foobar", # kenya 3 - ] -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.input b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.input deleted file mode 100644 index bd43ab1ad..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.input +++ /dev/null @@ -1,28 +0,0 @@ -aligned { -# We have some aligned items below - foo = "fatih" # yoo1 - default = "bar" # yoo2 - bar = "bar and foo" # yoo3 - default = { - bar = "example" - } - #deneme arslan - fatih = ["fatih"] # yoo4 - #fatih arslan - fatiharslan = ["arslan"] // yoo5 - default = { - bar = "example" - } - -security_groups = [ - "foo", # kenya 1 - "${aws_security_group.firewall.foo}", # kenya 2 -] - -security_groups2 = [ - "foo", # kenya 1 - "bar", # kenya 1.5 - "${aws_security_group.firewall.foo}", # kenya 2 - "foobar", # kenya 3 -] -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_array.golden b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_array.golden deleted file mode 100644 index e778eafa3..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_array.golden +++ /dev/null @@ -1,13 +0,0 @@ -banana = [ - # I really want to comment this item in the array. - "a", - - # This as well - "b", - - "c", # And C - "d", - - # And another - "e", -] diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_array.input b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_array.input deleted file mode 100644 index e778eafa3..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_array.input +++ /dev/null @@ -1,13 +0,0 @@ -banana = [ - # I really want to comment this item in the array. - "a", - - # This as well - "b", - - "c", # And C - "d", - - # And another - "e", -] diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_crlf.input b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_crlf.input deleted file mode 100644 index 5d2720672..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_crlf.input +++ /dev/null @@ -1,37 +0,0 @@ -// A standalone comment is a comment which is not attached to any kind of node - - // This comes from Terraform, as a test -variable "foo" { - # Standalone comment should be still here - - default = "bar" - description = "bar" # yooo -} - -/* This is a multi line standalone -comment*/ - - -// fatih arslan -/* This is a developer test -account and a multine comment */ -developer = [ "fatih", "arslan"] // fatih arslan - -# One line here -numbers = [1,2] // another line here - - # Another comment -variable = { - description = "bar" # another yooo - foo { - # Nested standalone - - bar = "fatih" - } -} - - // lead comment -foo { - bar = "fatih" // line comment 2 -} // line comment 3 - diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_end_file.golden b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_end_file.golden deleted file mode 100644 index dbeae36a8..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_end_file.golden +++ /dev/null @@ -1,6 +0,0 @@ -resource "blah" "blah" {} - -// -// -// - diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_end_file.input b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_end_file.input deleted file mode 100644 index 68c4c282e..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_end_file.input +++ /dev/null @@ -1,5 +0,0 @@ -resource "blah" "blah" {} - -// -// -// diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_multiline_indent.golden b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_multiline_indent.golden deleted file mode 100644 index 74c4ccd89..000000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_multiline_indent.golden +++ /dev/null @@ -1,12 +0,0 @@ -resource "provider" "resource" { - /* - SPACE_SENSITIVE_CODE = < y).Should(Equal(expected)) - }, - Entry("x > y", 1, 0, true), - Entry("x == y", 0, 0, false), - Entry("x < y", 0, 1, false), - ) - -The first argument to `DescribeTable` is a string description. -The second argument is a function that will be run for each table entry. Your assertions go here - the function is equivalent to a Ginkgo It. -The subsequent arguments must be of type `TableEntry`. We recommend using the `Entry` convenience constructors. - -The `Entry` constructor takes a string description followed by an arbitrary set of parameters. These parameters are passed into your function. - -Under the hood, `DescribeTable` simply generates a new Ginkgo `Describe`. Each `Entry` is turned into an `It` within the `Describe`. - -It's important to understand that the `Describe`s and `It`s are generated at evaluation time (i.e. when Ginkgo constructs the tree of tests and before the tests run). - -Individual Entries can be focused (with FEntry) or marked pending (with PEntry or XEntry). In addition, the entire table can be focused or marked pending with FDescribeTable and PDescribeTable/XDescribeTable. -*/ -func DescribeTable(description string, itBody interface{}, entries ...TableEntry) bool { - describeTable(description, itBody, entries, false, false) - return true -} - -/* -You can focus a table with `FDescribeTable`. This is equivalent to `FDescribe`. -*/ -func FDescribeTable(description string, itBody interface{}, entries ...TableEntry) bool { - describeTable(description, itBody, entries, false, true) - return true -} - -/* -You can mark a table as pending with `PDescribeTable`. This is equivalent to `PDescribe`. -*/ -func PDescribeTable(description string, itBody interface{}, entries ...TableEntry) bool { - describeTable(description, itBody, entries, true, false) - return true -} - -/* -You can mark a table as pending with `XDescribeTable`. This is equivalent to `XDescribe`. -*/ -func XDescribeTable(description string, itBody interface{}, entries ...TableEntry) bool { - describeTable(description, itBody, entries, true, false) - return true -} - -func describeTable(description string, itBody interface{}, entries []TableEntry, pending bool, focused bool) { - itBodyValue := reflect.ValueOf(itBody) - if itBodyValue.Kind() != reflect.Func { - panic(fmt.Sprintf("DescribeTable expects a function, got %#v", itBody)) - } - - if pending { - ginkgo.PDescribe(description, func() { - for _, entry := range entries { - entry.generateIt(itBodyValue) - } - }) - } else if focused { - ginkgo.FDescribe(description, func() { - for _, entry := range entries { - entry.generateIt(itBodyValue) - } - }) - } else { - ginkgo.Describe(description, func() { - for _, entry := range entries { - entry.generateIt(itBodyValue) - } - }) - } -} diff --git a/vendor/github.com/onsi/ginkgo/extensions/table/table_entry.go b/vendor/github.com/onsi/ginkgo/extensions/table/table_entry.go deleted file mode 100644 index 5fa645bce..000000000 --- a/vendor/github.com/onsi/ginkgo/extensions/table/table_entry.go +++ /dev/null @@ -1,81 +0,0 @@ -package table - -import ( - "reflect" - - "github.com/onsi/ginkgo" -) - -/* -TableEntry represents an entry in a table test. You generally use the `Entry` constructor. -*/ -type TableEntry struct { - Description string - Parameters []interface{} - Pending bool - Focused bool -} - -func (t TableEntry) generateIt(itBody reflect.Value) { - if t.Pending { - ginkgo.PIt(t.Description) - return - } - - values := []reflect.Value{} - for i, param := range t.Parameters { - var value reflect.Value - - if param == nil { - inType := itBody.Type().In(i) - value = reflect.Zero(inType) - } else { - value = reflect.ValueOf(param) - } - - values = append(values, value) - } - - body := func() { - itBody.Call(values) - } - - if t.Focused { - ginkgo.FIt(t.Description, body) - } else { - ginkgo.It(t.Description, body) - } -} - -/* -Entry constructs a TableEntry. - -The first argument is a required description (this becomes the content of the generated Ginkgo `It`). -Subsequent parameters are saved off and sent to the callback passed in to `DescribeTable`. - -Each Entry ends up generating an individual Ginkgo It. -*/ -func Entry(description string, parameters ...interface{}) TableEntry { - return TableEntry{description, parameters, false, false} -} - -/* -You can focus a particular entry with FEntry. This is equivalent to FIt. -*/ -func FEntry(description string, parameters ...interface{}) TableEntry { - return TableEntry{description, parameters, false, true} -} - -/* -You can mark a particular entry as pending with PEntry. This is equivalent to PIt. -*/ -func PEntry(description string, parameters ...interface{}) TableEntry { - return TableEntry{description, parameters, true, false} -} - -/* -You can mark a particular entry as pending with XEntry. This is equivalent to XIt. -*/ -func XEntry(description string, parameters ...interface{}) TableEntry { - return TableEntry{description, parameters, true, false} -} diff --git a/vendor/github.com/onsi/ginkgo/extensions/table/table_suite_test.go b/vendor/github.com/onsi/ginkgo/extensions/table/table_suite_test.go deleted file mode 100644 index f482ec3dc..000000000 --- a/vendor/github.com/onsi/ginkgo/extensions/table/table_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package table_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestTable(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Table Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/extensions/table/table_test.go b/vendor/github.com/onsi/ginkgo/extensions/table/table_test.go deleted file mode 100644 index b008e432b..000000000 --- a/vendor/github.com/onsi/ginkgo/extensions/table/table_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package table_test - -import ( - "strings" - - . "github.com/onsi/ginkgo/extensions/table" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("Table", func() { - DescribeTable("a simple table", - func(x int, y int, expected bool) { - Ω(x > y).Should(Equal(expected)) - }, - Entry("x > y", 1, 0, true), - Entry("x == y", 0, 0, false), - Entry("x < y", 0, 1, false), - ) - - type ComplicatedThings struct { - Superstructure string - Substructure string - Count int - } - - DescribeTable("a more complicated table", - func(c ComplicatedThings) { - Ω(strings.Count(c.Superstructure, c.Substructure)).Should(BeNumerically("==", c.Count)) - }, - Entry("with no matching substructures", ComplicatedThings{ - Superstructure: "the sixth sheikh's sixth sheep's sick", - Substructure: "emir", - Count: 0, - }), - Entry("with one matching substructure", ComplicatedThings{ - Superstructure: "the sixth sheikh's sixth sheep's sick", - Substructure: "sheep", - Count: 1, - }), - Entry("with many matching substructures", ComplicatedThings{ - Superstructure: "the sixth sheikh's sixth sheep's sick", - Substructure: "si", - Count: 3, - }), - ) - - PDescribeTable("a failure", - func(value bool) { - Ω(value).Should(BeFalse()) - }, - Entry("when true", true), - Entry("when false", false), - Entry("when malformed", 2), - ) - - DescribeTable("an untyped nil as an entry", - func(x interface{}) { - Expect(x).To(BeNil()) - }, - Entry("nil", nil), - ) -}) diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/bootstrap_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/bootstrap_command.go deleted file mode 100644 index 1e209e4f5..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/bootstrap_command.go +++ /dev/null @@ -1,202 +0,0 @@ -package main - -import ( - "bytes" - "flag" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strings" - "text/template" - - "go/build" - - "github.com/onsi/ginkgo/ginkgo/nodot" -) - -func BuildBootstrapCommand() *Command { - var ( - agouti, noDot, internal bool - customBootstrapFile string - ) - flagSet := flag.NewFlagSet("bootstrap", flag.ExitOnError) - flagSet.BoolVar(&agouti, "agouti", false, "If set, bootstrap will generate a bootstrap file for writing Agouti tests") - flagSet.BoolVar(&noDot, "nodot", false, "If set, bootstrap will generate a bootstrap file that does not . import ginkgo and gomega") - flagSet.BoolVar(&internal, "internal", false, "If set, generate will generate a test file that uses the regular package name") - flagSet.StringVar(&customBootstrapFile, "template", "", "If specified, generate will use the contents of the file passed as the bootstrap template") - - return &Command{ - Name: "bootstrap", - FlagSet: flagSet, - UsageCommand: "ginkgo bootstrap ", - Usage: []string{ - "Bootstrap a test suite for the current package", - "Accepts the following flags:", - }, - Command: func(args []string, additionalArgs []string) { - generateBootstrap(agouti, noDot, internal, customBootstrapFile) - }, - } -} - -var bootstrapText = `package {{.Package}} - -import ( - {{.GinkgoImport}} - {{.GomegaImport}} - - "testing" -) - -func Test{{.FormattedName}}(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "{{.FormattedName}} Suite") -} -` - -var agoutiBootstrapText = `package {{.Package}} - -import ( - {{.GinkgoImport}} - {{.GomegaImport}} - "github.com/sclevine/agouti" - - "testing" -) - -func Test{{.FormattedName}}(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "{{.FormattedName}} Suite") -} - -var agoutiDriver *agouti.WebDriver - -var _ = BeforeSuite(func() { - // Choose a WebDriver: - - agoutiDriver = agouti.PhantomJS() - // agoutiDriver = agouti.Selenium() - // agoutiDriver = agouti.ChromeDriver() - - Expect(agoutiDriver.Start()).To(Succeed()) -}) - -var _ = AfterSuite(func() { - Expect(agoutiDriver.Stop()).To(Succeed()) -}) -` - -type bootstrapData struct { - Package string - FormattedName string - GinkgoImport string - GomegaImport string -} - -func getPackageAndFormattedName() (string, string, string) { - path, err := os.Getwd() - if err != nil { - complainAndQuit("Could not get current working directory: \n" + err.Error()) - } - - dirName := strings.Replace(filepath.Base(path), "-", "_", -1) - dirName = strings.Replace(dirName, " ", "_", -1) - - pkg, err := build.ImportDir(path, 0) - packageName := pkg.Name - if err != nil { - packageName = dirName - } - - formattedName := prettifyPackageName(filepath.Base(path)) - return packageName, dirName, formattedName -} - -func prettifyPackageName(name string) string { - name = strings.Replace(name, "-", " ", -1) - name = strings.Replace(name, "_", " ", -1) - name = strings.Title(name) - name = strings.Replace(name, " ", "", -1) - return name -} - -func determinePackageName(name string, internal bool) string { - if internal { - return name - } - - return name + "_test" -} - -func fileExists(path string) bool { - _, err := os.Stat(path) - if err == nil { - return true - } - return false -} - -func generateBootstrap(agouti, noDot, internal bool, customBootstrapFile string) { - packageName, bootstrapFilePrefix, formattedName := getPackageAndFormattedName() - data := bootstrapData{ - Package: determinePackageName(packageName, internal), - FormattedName: formattedName, - GinkgoImport: `. "github.com/onsi/ginkgo"`, - GomegaImport: `. "github.com/onsi/gomega"`, - } - - if noDot { - data.GinkgoImport = `"github.com/onsi/ginkgo"` - data.GomegaImport = `"github.com/onsi/gomega"` - } - - targetFile := fmt.Sprintf("%s_suite_test.go", bootstrapFilePrefix) - if fileExists(targetFile) { - fmt.Printf("%s already exists.\n\n", targetFile) - os.Exit(1) - } else { - fmt.Printf("Generating ginkgo test suite bootstrap for %s in:\n\t%s\n", packageName, targetFile) - } - - f, err := os.Create(targetFile) - if err != nil { - complainAndQuit("Could not create file: " + err.Error()) - panic(err.Error()) - } - defer f.Close() - - var templateText string - if customBootstrapFile != "" { - tpl, err := ioutil.ReadFile(customBootstrapFile) - if err != nil { - panic(err.Error()) - } - templateText = string(tpl) - } else if agouti { - templateText = agoutiBootstrapText - } else { - templateText = bootstrapText - } - - bootstrapTemplate, err := template.New("bootstrap").Parse(templateText) - if err != nil { - panic(err.Error()) - } - - buf := &bytes.Buffer{} - bootstrapTemplate.Execute(buf, data) - - if noDot { - contents, err := nodot.ApplyNoDot(buf.Bytes()) - if err != nil { - complainAndQuit("Failed to import nodot declarations: " + err.Error()) - } - fmt.Println("To update the nodot declarations in the future, switch to this directory and run:\n\tginkgo nodot") - buf = bytes.NewBuffer(contents) - } - - buf.WriteTo(f) - - goFmt(targetFile) -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/build_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/build_command.go deleted file mode 100644 index f0eb375c3..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/build_command.go +++ /dev/null @@ -1,68 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - "path/filepath" - - "github.com/onsi/ginkgo/ginkgo/interrupthandler" - "github.com/onsi/ginkgo/ginkgo/testrunner" -) - -func BuildBuildCommand() *Command { - commandFlags := NewBuildCommandFlags(flag.NewFlagSet("build", flag.ExitOnError)) - interruptHandler := interrupthandler.NewInterruptHandler() - builder := &SpecBuilder{ - commandFlags: commandFlags, - interruptHandler: interruptHandler, - } - - return &Command{ - Name: "build", - FlagSet: commandFlags.FlagSet, - UsageCommand: "ginkgo build ", - Usage: []string{ - "Build the passed in (or the package in the current directory if left blank).", - "Accepts the following flags:", - }, - Command: builder.BuildSpecs, - } -} - -type SpecBuilder struct { - commandFlags *RunWatchAndBuildCommandFlags - interruptHandler *interrupthandler.InterruptHandler -} - -func (r *SpecBuilder) BuildSpecs(args []string, additionalArgs []string) { - r.commandFlags.computeNodes() - - suites, _ := findSuites(args, r.commandFlags.Recurse, r.commandFlags.SkipPackage, false) - - if len(suites) == 0 { - complainAndQuit("Found no test suites") - } - - passed := true - for _, suite := range suites { - runner := testrunner.New(suite, 1, false, 0, r.commandFlags.GoOpts, nil) - fmt.Printf("Compiling %s...\n", suite.PackageName) - - path, _ := filepath.Abs(filepath.Join(suite.Path, fmt.Sprintf("%s.test", suite.PackageName))) - err := runner.CompileTo(path) - if err != nil { - fmt.Println(err.Error()) - passed = false - } else { - fmt.Printf(" compiled %s.test\n", suite.PackageName) - } - - runner.CleanUp() - } - - if passed { - os.Exit(0) - } - os.Exit(1) -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/convert/ginkgo_ast_nodes.go b/vendor/github.com/onsi/ginkgo/ginkgo/convert/ginkgo_ast_nodes.go deleted file mode 100644 index 02e2b3b32..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/convert/ginkgo_ast_nodes.go +++ /dev/null @@ -1,123 +0,0 @@ -package convert - -import ( - "fmt" - "go/ast" - "strings" - "unicode" -) - -/* - * Creates a func init() node - */ -func createVarUnderscoreBlock() *ast.ValueSpec { - valueSpec := &ast.ValueSpec{} - object := &ast.Object{Kind: 4, Name: "_", Decl: valueSpec, Data: 0} - ident := &ast.Ident{Name: "_", Obj: object} - valueSpec.Names = append(valueSpec.Names, ident) - return valueSpec -} - -/* - * Creates a Describe("Testing with ginkgo", func() { }) node - */ -func createDescribeBlock() *ast.CallExpr { - blockStatement := &ast.BlockStmt{List: []ast.Stmt{}} - - fieldList := &ast.FieldList{} - funcType := &ast.FuncType{Params: fieldList} - funcLit := &ast.FuncLit{Type: funcType, Body: blockStatement} - basicLit := &ast.BasicLit{Kind: 9, Value: "\"Testing with Ginkgo\""} - describeIdent := &ast.Ident{Name: "Describe"} - return &ast.CallExpr{Fun: describeIdent, Args: []ast.Expr{basicLit, funcLit}} -} - -/* - * Convenience function to return the name of the *testing.T param - * for a Test function that will be rewritten. This is useful because - * we will want to replace the usage of this named *testing.T inside the - * body of the function with a GinktoT. - */ -func namedTestingTArg(node *ast.FuncDecl) string { - return node.Type.Params.List[0].Names[0].Name // *exhale* -} - -/* - * Convenience function to return the block statement node for a Describe statement - */ -func blockStatementFromDescribe(desc *ast.CallExpr) *ast.BlockStmt { - var funcLit *ast.FuncLit - var found = false - - for _, node := range desc.Args { - switch node := node.(type) { - case *ast.FuncLit: - found = true - funcLit = node - break - } - } - - if !found { - panic("Error finding ast.FuncLit inside describe statement. Somebody done goofed.") - } - - return funcLit.Body -} - -/* convenience function for creating an It("TestNameHere") - * with all the body of the test function inside the anonymous - * func passed to It() - */ -func createItStatementForTestFunc(testFunc *ast.FuncDecl) *ast.ExprStmt { - blockStatement := &ast.BlockStmt{List: testFunc.Body.List} - fieldList := &ast.FieldList{} - funcType := &ast.FuncType{Params: fieldList} - funcLit := &ast.FuncLit{Type: funcType, Body: blockStatement} - - testName := rewriteTestName(testFunc.Name.Name) - basicLit := &ast.BasicLit{Kind: 9, Value: fmt.Sprintf("\"%s\"", testName)} - itBlockIdent := &ast.Ident{Name: "It"} - callExpr := &ast.CallExpr{Fun: itBlockIdent, Args: []ast.Expr{basicLit, funcLit}} - return &ast.ExprStmt{X: callExpr} -} - -/* -* rewrite test names to be human readable -* eg: rewrites "TestSomethingAmazing" as "something amazing" - */ -func rewriteTestName(testName string) string { - nameComponents := []string{} - currentString := "" - indexOfTest := strings.Index(testName, "Test") - if indexOfTest != 0 { - return testName - } - - testName = strings.Replace(testName, "Test", "", 1) - first, rest := testName[0], testName[1:] - testName = string(unicode.ToLower(rune(first))) + rest - - for _, rune := range testName { - if unicode.IsUpper(rune) { - nameComponents = append(nameComponents, currentString) - currentString = string(unicode.ToLower(rune)) - } else { - currentString += string(rune) - } - } - - return strings.Join(append(nameComponents, currentString), " ") -} - -func newGinkgoTFromIdent(ident *ast.Ident) *ast.CallExpr { - return &ast.CallExpr{ - Lparen: ident.NamePos + 1, - Rparen: ident.NamePos + 2, - Fun: &ast.Ident{Name: "GinkgoT"}, - } -} - -func newGinkgoTInterface() *ast.Ident { - return &ast.Ident{Name: "GinkgoTInterface"} -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/convert/import.go b/vendor/github.com/onsi/ginkgo/ginkgo/convert/import.go deleted file mode 100644 index e226196f7..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/convert/import.go +++ /dev/null @@ -1,91 +0,0 @@ -package convert - -import ( - "errors" - "fmt" - "go/ast" -) - -/* - * Given the root node of an AST, returns the node containing the - * import statements for the file. - */ -func importsForRootNode(rootNode *ast.File) (imports *ast.GenDecl, err error) { - for _, declaration := range rootNode.Decls { - decl, ok := declaration.(*ast.GenDecl) - if !ok || len(decl.Specs) == 0 { - continue - } - - _, ok = decl.Specs[0].(*ast.ImportSpec) - if ok { - imports = decl - return - } - } - - err = errors.New(fmt.Sprintf("Could not find imports for root node:\n\t%#v\n", rootNode)) - return -} - -/* - * Removes "testing" import, if present - */ -func removeTestingImport(rootNode *ast.File) { - importDecl, err := importsForRootNode(rootNode) - if err != nil { - panic(err.Error()) - } - - var index int - for i, importSpec := range importDecl.Specs { - importSpec := importSpec.(*ast.ImportSpec) - if importSpec.Path.Value == "\"testing\"" { - index = i - break - } - } - - importDecl.Specs = append(importDecl.Specs[:index], importDecl.Specs[index+1:]...) -} - -/* - * Adds import statements for onsi/ginkgo, if missing - */ -func addGinkgoImports(rootNode *ast.File) { - importDecl, err := importsForRootNode(rootNode) - if err != nil { - panic(err.Error()) - } - - if len(importDecl.Specs) == 0 { - // TODO: might need to create a import decl here - panic("unimplemented : expected to find an imports block") - } - - needsGinkgo := true - for _, importSpec := range importDecl.Specs { - importSpec, ok := importSpec.(*ast.ImportSpec) - if !ok { - continue - } - - if importSpec.Path.Value == "\"github.com/onsi/ginkgo\"" { - needsGinkgo = false - } - } - - if needsGinkgo { - importDecl.Specs = append(importDecl.Specs, createImport(".", "\"github.com/onsi/ginkgo\"")) - } -} - -/* - * convenience function to create an import statement - */ -func createImport(name, path string) *ast.ImportSpec { - return &ast.ImportSpec{ - Name: &ast.Ident{Name: name}, - Path: &ast.BasicLit{Kind: 9, Value: path}, - } -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/convert/package_rewriter.go b/vendor/github.com/onsi/ginkgo/ginkgo/convert/package_rewriter.go deleted file mode 100644 index ed09c460d..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/convert/package_rewriter.go +++ /dev/null @@ -1,127 +0,0 @@ -package convert - -import ( - "fmt" - "go/build" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "regexp" -) - -/* - * RewritePackage takes a name (eg: my-package/tools), finds its test files using - * Go's build package, and then rewrites them. A ginkgo test suite file will - * also be added for this package, and all of its child packages. - */ -func RewritePackage(packageName string) { - pkg, err := packageWithName(packageName) - if err != nil { - panic(fmt.Sprintf("unexpected error reading package: '%s'\n%s\n", packageName, err.Error())) - } - - for _, filename := range findTestsInPackage(pkg) { - rewriteTestsInFile(filename) - } - return -} - -/* - * Given a package, findTestsInPackage reads the test files in the directory, - * and then recurses on each child package, returning a slice of all test files - * found in this process. - */ -func findTestsInPackage(pkg *build.Package) (testfiles []string) { - for _, file := range append(pkg.TestGoFiles, pkg.XTestGoFiles...) { - testfiles = append(testfiles, filepath.Join(pkg.Dir, file)) - } - - dirFiles, err := ioutil.ReadDir(pkg.Dir) - if err != nil { - panic(fmt.Sprintf("unexpected error reading dir: '%s'\n%s\n", pkg.Dir, err.Error())) - } - - re := regexp.MustCompile(`^[._]`) - - for _, file := range dirFiles { - if !file.IsDir() { - continue - } - - if re.Match([]byte(file.Name())) { - continue - } - - packageName := filepath.Join(pkg.ImportPath, file.Name()) - subPackage, err := packageWithName(packageName) - if err != nil { - panic(fmt.Sprintf("unexpected error reading package: '%s'\n%s\n", packageName, err.Error())) - } - - testfiles = append(testfiles, findTestsInPackage(subPackage)...) - } - - addGinkgoSuiteForPackage(pkg) - goFmtPackage(pkg) - return -} - -/* - * Shells out to `ginkgo bootstrap` to create a test suite file - */ -func addGinkgoSuiteForPackage(pkg *build.Package) { - originalDir, err := os.Getwd() - if err != nil { - panic(err) - } - - suite_test_file := filepath.Join(pkg.Dir, pkg.Name+"_suite_test.go") - - _, err = os.Stat(suite_test_file) - if err == nil { - return // test file already exists, this should be a no-op - } - - err = os.Chdir(pkg.Dir) - if err != nil { - panic(err) - } - - output, err := exec.Command("ginkgo", "bootstrap").Output() - - if err != nil { - panic(fmt.Sprintf("error running 'ginkgo bootstrap'.\nstdout: %s\n%s\n", output, err.Error())) - } - - err = os.Chdir(originalDir) - if err != nil { - panic(err) - } -} - -/* - * Shells out to `go fmt` to format the package - */ -func goFmtPackage(pkg *build.Package) { - output, err := exec.Command("go", "fmt", pkg.ImportPath).Output() - - if err != nil { - fmt.Printf("Warning: Error running 'go fmt %s'.\nstdout: %s\n%s\n", pkg.ImportPath, output, err.Error()) - } -} - -/* - * Attempts to return a package with its test files already read. - * The ImportMode arg to build.Import lets you specify if you want go to read the - * buildable go files inside the package, but it fails if the package has no go files - */ -func packageWithName(name string) (pkg *build.Package, err error) { - pkg, err = build.Default.Import(name, ".", build.ImportMode(0)) - if err == nil { - return - } - - pkg, err = build.Default.Import(name, ".", build.ImportMode(1)) - return -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/convert/test_finder.go b/vendor/github.com/onsi/ginkgo/ginkgo/convert/test_finder.go deleted file mode 100644 index b33595c9a..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/convert/test_finder.go +++ /dev/null @@ -1,56 +0,0 @@ -package convert - -import ( - "go/ast" - "regexp" -) - -/* - * Given a root node, walks its top level statements and returns - * points to function nodes to rewrite as It statements. - * These functions, according to Go testing convention, must be named - * TestWithCamelCasedName and receive a single *testing.T argument. - */ -func findTestFuncs(rootNode *ast.File) (testsToRewrite []*ast.FuncDecl) { - testNameRegexp := regexp.MustCompile("^Test[0-9A-Z].+") - - ast.Inspect(rootNode, func(node ast.Node) bool { - if node == nil { - return false - } - - switch node := node.(type) { - case *ast.FuncDecl: - matches := testNameRegexp.MatchString(node.Name.Name) - - if matches && receivesTestingT(node) { - testsToRewrite = append(testsToRewrite, node) - } - } - - return true - }) - - return -} - -/* - * convenience function that looks at args to a function and determines if its - * params include an argument of type *testing.T - */ -func receivesTestingT(node *ast.FuncDecl) bool { - if len(node.Type.Params.List) != 1 { - return false - } - - base, ok := node.Type.Params.List[0].Type.(*ast.StarExpr) - if !ok { - return false - } - - intermediate := base.X.(*ast.SelectorExpr) - isTestingPackage := intermediate.X.(*ast.Ident).Name == "testing" - isTestingT := intermediate.Sel.Name == "T" - - return isTestingPackage && isTestingT -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/convert/testfile_rewriter.go b/vendor/github.com/onsi/ginkgo/ginkgo/convert/testfile_rewriter.go deleted file mode 100644 index 4b001a7db..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/convert/testfile_rewriter.go +++ /dev/null @@ -1,163 +0,0 @@ -package convert - -import ( - "bytes" - "fmt" - "go/ast" - "go/format" - "go/parser" - "go/token" - "io/ioutil" - "os" -) - -/* - * Given a file path, rewrites any tests in the Ginkgo format. - * First, we parse the AST, and update the imports declaration. - * Then, we walk the first child elements in the file, returning tests to rewrite. - * A top level init func is declared, with a single Describe func inside. - * Then the test functions to rewrite are inserted as It statements inside the Describe. - * Finally we walk the rest of the file, replacing other usages of *testing.T - * Once that is complete, we write the AST back out again to its file. - */ -func rewriteTestsInFile(pathToFile string) { - fileSet := token.NewFileSet() - rootNode, err := parser.ParseFile(fileSet, pathToFile, nil, 0) - if err != nil { - panic(fmt.Sprintf("Error parsing test file '%s':\n%s\n", pathToFile, err.Error())) - } - - addGinkgoImports(rootNode) - removeTestingImport(rootNode) - - varUnderscoreBlock := createVarUnderscoreBlock() - describeBlock := createDescribeBlock() - varUnderscoreBlock.Values = []ast.Expr{describeBlock} - - for _, testFunc := range findTestFuncs(rootNode) { - rewriteTestFuncAsItStatement(testFunc, rootNode, describeBlock) - } - - underscoreDecl := &ast.GenDecl{ - Tok: 85, // gah, magick numbers are needed to make this work - TokPos: 14, // this tricks Go into writing "var _ = Describe" - Specs: []ast.Spec{varUnderscoreBlock}, - } - - imports := rootNode.Decls[0] - tail := rootNode.Decls[1:] - rootNode.Decls = append(append([]ast.Decl{imports}, underscoreDecl), tail...) - rewriteOtherFuncsToUseGinkgoT(rootNode.Decls) - walkNodesInRootNodeReplacingTestingT(rootNode) - - var buffer bytes.Buffer - if err = format.Node(&buffer, fileSet, rootNode); err != nil { - panic(fmt.Sprintf("Error formatting ast node after rewriting tests.\n%s\n", err.Error())) - } - - fileInfo, err := os.Stat(pathToFile) - if err != nil { - panic(fmt.Sprintf("Error stat'ing file: %s\n", pathToFile)) - } - - ioutil.WriteFile(pathToFile, buffer.Bytes(), fileInfo.Mode()) - return -} - -/* - * Given a test func named TestDoesSomethingNeat, rewrites it as - * It("does something neat", func() { __test_body_here__ }) and adds it - * to the Describe's list of statements - */ -func rewriteTestFuncAsItStatement(testFunc *ast.FuncDecl, rootNode *ast.File, describe *ast.CallExpr) { - var funcIndex int = -1 - for index, child := range rootNode.Decls { - if child == testFunc { - funcIndex = index - break - } - } - - if funcIndex < 0 { - panic(fmt.Sprintf("Assert failed: Error finding index for test node %s\n", testFunc.Name.Name)) - } - - var block *ast.BlockStmt = blockStatementFromDescribe(describe) - block.List = append(block.List, createItStatementForTestFunc(testFunc)) - replaceTestingTsWithGinkgoT(block, namedTestingTArg(testFunc)) - - // remove the old test func from the root node's declarations - rootNode.Decls = append(rootNode.Decls[:funcIndex], rootNode.Decls[funcIndex+1:]...) - return -} - -/* - * walks nodes inside of a test func's statements and replaces the usage of - * it's named *testing.T param with GinkgoT's - */ -func replaceTestingTsWithGinkgoT(statementsBlock *ast.BlockStmt, testingT string) { - ast.Inspect(statementsBlock, func(node ast.Node) bool { - if node == nil { - return false - } - - keyValueExpr, ok := node.(*ast.KeyValueExpr) - if ok { - replaceNamedTestingTsInKeyValueExpression(keyValueExpr, testingT) - return true - } - - funcLiteral, ok := node.(*ast.FuncLit) - if ok { - replaceTypeDeclTestingTsInFuncLiteral(funcLiteral) - return true - } - - callExpr, ok := node.(*ast.CallExpr) - if !ok { - return true - } - replaceTestingTsInArgsLists(callExpr, testingT) - - funCall, ok := callExpr.Fun.(*ast.SelectorExpr) - if ok { - replaceTestingTsMethodCalls(funCall, testingT) - } - - return true - }) -} - -/* - * rewrite t.Fail() or any other *testing.T method by replacing with T().Fail() - * This function receives a selector expression (eg: t.Fail()) and - * the name of the *testing.T param from the function declaration. Rewrites the - * selector expression in place if the target was a *testing.T - */ -func replaceTestingTsMethodCalls(selectorExpr *ast.SelectorExpr, testingT string) { - ident, ok := selectorExpr.X.(*ast.Ident) - if !ok { - return - } - - if ident.Name == testingT { - selectorExpr.X = newGinkgoTFromIdent(ident) - } -} - -/* - * replaces usages of a named *testing.T param inside of a call expression - * with a new GinkgoT object - */ -func replaceTestingTsInArgsLists(callExpr *ast.CallExpr, testingT string) { - for index, arg := range callExpr.Args { - ident, ok := arg.(*ast.Ident) - if !ok { - continue - } - - if ident.Name == testingT { - callExpr.Args[index] = newGinkgoTFromIdent(ident) - } - } -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/convert/testing_t_rewriter.go b/vendor/github.com/onsi/ginkgo/ginkgo/convert/testing_t_rewriter.go deleted file mode 100644 index 418cdc4e5..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/convert/testing_t_rewriter.go +++ /dev/null @@ -1,130 +0,0 @@ -package convert - -import ( - "go/ast" -) - -/* - * Rewrites any other top level funcs that receive a *testing.T param - */ -func rewriteOtherFuncsToUseGinkgoT(declarations []ast.Decl) { - for _, decl := range declarations { - decl, ok := decl.(*ast.FuncDecl) - if !ok { - continue - } - - for _, param := range decl.Type.Params.List { - starExpr, ok := param.Type.(*ast.StarExpr) - if !ok { - continue - } - - selectorExpr, ok := starExpr.X.(*ast.SelectorExpr) - if !ok { - continue - } - - xIdent, ok := selectorExpr.X.(*ast.Ident) - if !ok || xIdent.Name != "testing" { - continue - } - - if selectorExpr.Sel.Name != "T" { - continue - } - - param.Type = newGinkgoTInterface() - } - } -} - -/* - * Walks all of the nodes in the file, replacing *testing.T in struct - * and func literal nodes. eg: - * type foo struct { *testing.T } - * var bar = func(t *testing.T) { } - */ -func walkNodesInRootNodeReplacingTestingT(rootNode *ast.File) { - ast.Inspect(rootNode, func(node ast.Node) bool { - if node == nil { - return false - } - - switch node := node.(type) { - case *ast.StructType: - replaceTestingTsInStructType(node) - case *ast.FuncLit: - replaceTypeDeclTestingTsInFuncLiteral(node) - } - - return true - }) -} - -/* - * replaces named *testing.T inside a composite literal - */ -func replaceNamedTestingTsInKeyValueExpression(kve *ast.KeyValueExpr, testingT string) { - ident, ok := kve.Value.(*ast.Ident) - if !ok { - return - } - - if ident.Name == testingT { - kve.Value = newGinkgoTFromIdent(ident) - } -} - -/* - * replaces *testing.T params in a func literal with GinkgoT - */ -func replaceTypeDeclTestingTsInFuncLiteral(functionLiteral *ast.FuncLit) { - for _, arg := range functionLiteral.Type.Params.List { - starExpr, ok := arg.Type.(*ast.StarExpr) - if !ok { - continue - } - - selectorExpr, ok := starExpr.X.(*ast.SelectorExpr) - if !ok { - continue - } - - target, ok := selectorExpr.X.(*ast.Ident) - if !ok { - continue - } - - if target.Name == "testing" && selectorExpr.Sel.Name == "T" { - arg.Type = newGinkgoTInterface() - } - } -} - -/* - * Replaces *testing.T types inside of a struct declaration with a GinkgoT - * eg: type foo struct { *testing.T } - */ -func replaceTestingTsInStructType(structType *ast.StructType) { - for _, field := range structType.Fields.List { - starExpr, ok := field.Type.(*ast.StarExpr) - if !ok { - continue - } - - selectorExpr, ok := starExpr.X.(*ast.SelectorExpr) - if !ok { - continue - } - - xIdent, ok := selectorExpr.X.(*ast.Ident) - if !ok { - continue - } - - if xIdent.Name == "testing" && selectorExpr.Sel.Name == "T" { - field.Type = newGinkgoTInterface() - } - } -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/convert_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/convert_command.go deleted file mode 100644 index 89e60d393..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/convert_command.go +++ /dev/null @@ -1,44 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "github.com/onsi/ginkgo/ginkgo/convert" - "os" -) - -func BuildConvertCommand() *Command { - return &Command{ - Name: "convert", - FlagSet: flag.NewFlagSet("convert", flag.ExitOnError), - UsageCommand: "ginkgo convert /path/to/package", - Usage: []string{ - "Convert the package at the passed in path from an XUnit-style test to a Ginkgo-style test", - }, - Command: convertPackage, - } -} - -func convertPackage(args []string, additionalArgs []string) { - if len(args) != 1 { - println(fmt.Sprintf("usage: ginkgo convert /path/to/your/package")) - os.Exit(1) - } - - defer func() { - err := recover() - if err != nil { - switch err := err.(type) { - case error: - println(err.Error()) - case string: - println(err) - default: - println(fmt.Sprintf("unexpected error: %#v", err)) - } - os.Exit(1) - } - }() - - convert.RewritePackage(args[0]) -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go deleted file mode 100644 index 3b9405aa0..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go +++ /dev/null @@ -1,167 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - "path/filepath" - "strings" - "text/template" -) - -func BuildGenerateCommand() *Command { - var agouti, noDot, internal bool - flagSet := flag.NewFlagSet("generate", flag.ExitOnError) - flagSet.BoolVar(&agouti, "agouti", false, "If set, generate will generate a test file for writing Agouti tests") - flagSet.BoolVar(&noDot, "nodot", false, "If set, generate will generate a test file that does not . import ginkgo and gomega") - flagSet.BoolVar(&internal, "internal", false, "If set, generate will generate a test file that uses the regular package name") - - return &Command{ - Name: "generate", - FlagSet: flagSet, - UsageCommand: "ginkgo generate ", - Usage: []string{ - "Generate a test file named filename_test.go", - "If the optional argument is omitted, a file named after the package in the current directory will be created.", - "Accepts the following flags:", - }, - Command: func(args []string, additionalArgs []string) { - generateSpec(args, agouti, noDot, internal) - }, - } -} - -var specText = `package {{.Package}} - -import ( - {{if .DotImportPackage}}. "{{.PackageImportPath}}"{{end}} - - {{if .IncludeImports}}. "github.com/onsi/ginkgo"{{end}} - {{if .IncludeImports}}. "github.com/onsi/gomega"{{end}} -) - -var _ = Describe("{{.Subject}}", func() { - -}) -` - -var agoutiSpecText = `package {{.Package}}_test - -import ( - {{if .DotImportPackage}}. "{{.PackageImportPath}}"{{end}} - - {{if .IncludeImports}}. "github.com/onsi/ginkgo"{{end}} - {{if .IncludeImports}}. "github.com/onsi/gomega"{{end}} - . "github.com/sclevine/agouti/matchers" - "github.com/sclevine/agouti" -) - -var _ = Describe("{{.Subject}}", func() { - var page *agouti.Page - - BeforeEach(func() { - var err error - page, err = agoutiDriver.NewPage() - Expect(err).NotTo(HaveOccurred()) - }) - - AfterEach(func() { - Expect(page.Destroy()).To(Succeed()) - }) -}) -` - -type specData struct { - Package string - Subject string - PackageImportPath string - IncludeImports bool - DotImportPackage bool -} - -func generateSpec(args []string, agouti, noDot, internal bool) { - if len(args) == 0 { - err := generateSpecForSubject("", agouti, noDot, internal) - if err != nil { - fmt.Println(err.Error()) - fmt.Println("") - os.Exit(1) - } - fmt.Println("") - return - } - - var failed bool - for _, arg := range args { - err := generateSpecForSubject(arg, agouti, noDot, internal) - if err != nil { - failed = true - fmt.Println(err.Error()) - } - } - fmt.Println("") - if failed { - os.Exit(1) - } -} - -func generateSpecForSubject(subject string, agouti, noDot, internal bool) error { - packageName, specFilePrefix, formattedName := getPackageAndFormattedName() - if subject != "" { - subject = strings.Split(subject, ".go")[0] - subject = strings.Split(subject, "_test")[0] - specFilePrefix = subject - formattedName = prettifyPackageName(subject) - } - - data := specData{ - Package: determinePackageName(packageName, internal), - Subject: formattedName, - PackageImportPath: getPackageImportPath(), - IncludeImports: !noDot, - DotImportPackage: !internal, - } - - targetFile := fmt.Sprintf("%s_test.go", specFilePrefix) - if fileExists(targetFile) { - return fmt.Errorf("%s already exists.", targetFile) - } else { - fmt.Printf("Generating ginkgo test for %s in:\n %s\n", data.Subject, targetFile) - } - - f, err := os.Create(targetFile) - if err != nil { - return err - } - defer f.Close() - - var templateText string - if agouti { - templateText = agoutiSpecText - } else { - templateText = specText - } - - specTemplate, err := template.New("spec").Parse(templateText) - if err != nil { - return err - } - - specTemplate.Execute(f, data) - goFmt(targetFile) - return nil -} - -func getPackageImportPath() string { - workingDir, err := os.Getwd() - if err != nil { - panic(err.Error()) - } - sep := string(filepath.Separator) - paths := strings.Split(workingDir, sep+"src"+sep) - if len(paths) == 1 { - fmt.Printf("\nCouldn't identify package import path.\n\n\tginkgo generate\n\nMust be run within a package directory under $GOPATH/src/...\nYou're going to have to change UNKNOWN_PACKAGE_PATH in the generated file...\n\n") - return "UNKNOWN_PACKAGE_PATH" - } - return filepath.ToSlash(paths[len(paths)-1]) -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/help_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/help_command.go deleted file mode 100644 index 23b1d2f11..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/help_command.go +++ /dev/null @@ -1,31 +0,0 @@ -package main - -import ( - "flag" - "fmt" -) - -func BuildHelpCommand() *Command { - return &Command{ - Name: "help", - FlagSet: flag.NewFlagSet("help", flag.ExitOnError), - UsageCommand: "ginkgo help ", - Usage: []string{ - "Print usage information. If a command is passed in, print usage information just for that command.", - }, - Command: printHelp, - } -} - -func printHelp(args []string, additionalArgs []string) { - if len(args) == 0 { - usage() - } else { - command, found := commandMatching(args[0]) - if !found { - complainAndQuit(fmt.Sprintf("Unknown command: %s", args[0])) - } - - usageForCommand(command, true) - } -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/interrupt_handler.go b/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/interrupt_handler.go deleted file mode 100644 index c15db0b02..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/interrupt_handler.go +++ /dev/null @@ -1,52 +0,0 @@ -package interrupthandler - -import ( - "os" - "os/signal" - "sync" - "syscall" -) - -type InterruptHandler struct { - interruptCount int - lock *sync.Mutex - C chan bool -} - -func NewInterruptHandler() *InterruptHandler { - h := &InterruptHandler{ - lock: &sync.Mutex{}, - C: make(chan bool, 0), - } - - go h.handleInterrupt() - SwallowSigQuit() - - return h -} - -func (h *InterruptHandler) WasInterrupted() bool { - h.lock.Lock() - defer h.lock.Unlock() - - return h.interruptCount > 0 -} - -func (h *InterruptHandler) handleInterrupt() { - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt, syscall.SIGTERM) - - <-c - signal.Stop(c) - - h.lock.Lock() - h.interruptCount++ - if h.interruptCount == 1 { - close(h.C) - } else if h.interruptCount > 5 { - os.Exit(1) - } - h.lock.Unlock() - - go h.handleInterrupt() -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/sigquit_swallower_unix.go b/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/sigquit_swallower_unix.go deleted file mode 100644 index 43c18544a..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/sigquit_swallower_unix.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build freebsd openbsd netbsd dragonfly darwin linux solaris - -package interrupthandler - -import ( - "os" - "os/signal" - "syscall" -) - -func SwallowSigQuit() { - c := make(chan os.Signal, 1024) - signal.Notify(c, syscall.SIGQUIT) -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/sigquit_swallower_windows.go b/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/sigquit_swallower_windows.go deleted file mode 100644 index 7f4a50e19..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/interrupthandler/sigquit_swallower_windows.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build windows - -package interrupthandler - -func SwallowSigQuit() { - //noop -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/main.go b/vendor/github.com/onsi/ginkgo/ginkgo/main.go deleted file mode 100644 index 4a1aeef4f..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/main.go +++ /dev/null @@ -1,300 +0,0 @@ -/* -The Ginkgo CLI - -The Ginkgo CLI is fully documented [here](http://onsi.github.io/ginkgo/#the_ginkgo_cli) - -You can also learn more by running: - - ginkgo help - -Here are some of the more commonly used commands: - -To install: - - go install github.com/onsi/ginkgo/ginkgo - -To run tests: - - ginkgo - -To run tests in all subdirectories: - - ginkgo -r - -To run tests in particular packages: - - ginkgo /path/to/package /path/to/another/package - -To pass arguments/flags to your tests: - - ginkgo -- - -To run tests in parallel - - ginkgo -p - -this will automatically detect the optimal number of nodes to use. Alternatively, you can specify the number of nodes with: - - ginkgo -nodes=N - -(note that you don't need to provide -p in this case). - -By default the Ginkgo CLI will spin up a server that the individual test processes send test output to. The CLI aggregates this output and then presents coherent test output, one test at a time, as each test completes. -An alternative is to have the parallel nodes run and stream interleaved output back. This useful for debugging, particularly in contexts where tests hang/fail to start. To get this interleaved output: - - ginkgo -nodes=N -stream=true - -On windows, the default value for stream is true. - -By default, when running multiple tests (with -r or a list of packages) Ginkgo will abort when a test fails. To have Ginkgo run subsequent test suites instead you can: - - ginkgo -keepGoing - -To fail if there are ginkgo tests in a directory but no test suite (missing `RunSpecs`) - - ginkgo -requireSuite - -To monitor packages and rerun tests when changes occur: - - ginkgo watch <-r> - -passing `ginkgo watch` the `-r` flag will recursively detect all test suites under the current directory and monitor them. -`watch` does not detect *new* packages. Moreover, changes in package X only rerun the tests for package X, tests for packages -that depend on X are not rerun. - -[OSX & Linux only] To receive (desktop) notifications when a test run completes: - - ginkgo -notify - -this is particularly useful with `ginkgo watch`. Notifications are currently only supported on OS X and require that you `brew install terminal-notifier` - -Sometimes (to suss out race conditions/flakey tests, for example) you want to keep running a test suite until it fails. You can do this with: - - ginkgo -untilItFails - -To bootstrap a test suite: - - ginkgo bootstrap - -To generate a test file: - - ginkgo generate - -To bootstrap/generate test files without using "." imports: - - ginkgo bootstrap --nodot - ginkgo generate --nodot - -this will explicitly export all the identifiers in Ginkgo and Gomega allowing you to rename them to avoid collisions. When you pull to the latest Ginkgo/Gomega you'll want to run - - ginkgo nodot - -to refresh this list and pull in any new identifiers. In particular, this will pull in any new Gomega matchers that get added. - -To convert an existing XUnit style test suite to a Ginkgo-style test suite: - - ginkgo convert . - -To unfocus tests: - - ginkgo unfocus - -or - - ginkgo blur - -To compile a test suite: - - ginkgo build - -will output an executable file named `package.test`. This can be run directly or by invoking - - ginkgo - -To print out Ginkgo's version: - - ginkgo version - -To get more help: - - ginkgo help -*/ -package main - -import ( - "flag" - "fmt" - "os" - "os/exec" - "strings" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/ginkgo/testsuite" -) - -const greenColor = "\x1b[32m" -const redColor = "\x1b[91m" -const defaultStyle = "\x1b[0m" -const lightGrayColor = "\x1b[37m" - -type Command struct { - Name string - AltName string - FlagSet *flag.FlagSet - Usage []string - UsageCommand string - Command func(args []string, additionalArgs []string) - SuppressFlagDocumentation bool - FlagDocSubstitute []string -} - -func (c *Command) Matches(name string) bool { - return c.Name == name || (c.AltName != "" && c.AltName == name) -} - -func (c *Command) Run(args []string, additionalArgs []string) { - c.FlagSet.Parse(args) - c.Command(c.FlagSet.Args(), additionalArgs) -} - -var DefaultCommand *Command -var Commands []*Command - -func init() { - DefaultCommand = BuildRunCommand() - Commands = append(Commands, BuildWatchCommand()) - Commands = append(Commands, BuildBuildCommand()) - Commands = append(Commands, BuildBootstrapCommand()) - Commands = append(Commands, BuildGenerateCommand()) - Commands = append(Commands, BuildNodotCommand()) - Commands = append(Commands, BuildConvertCommand()) - Commands = append(Commands, BuildUnfocusCommand()) - Commands = append(Commands, BuildVersionCommand()) - Commands = append(Commands, BuildHelpCommand()) -} - -func main() { - args := []string{} - additionalArgs := []string{} - - foundDelimiter := false - - for _, arg := range os.Args[1:] { - if !foundDelimiter { - if arg == "--" { - foundDelimiter = true - continue - } - } - - if foundDelimiter { - additionalArgs = append(additionalArgs, arg) - } else { - args = append(args, arg) - } - } - - if len(args) > 0 { - commandToRun, found := commandMatching(args[0]) - if found { - commandToRun.Run(args[1:], additionalArgs) - return - } - } - - DefaultCommand.Run(args, additionalArgs) -} - -func commandMatching(name string) (*Command, bool) { - for _, command := range Commands { - if command.Matches(name) { - return command, true - } - } - return nil, false -} - -func usage() { - fmt.Fprintf(os.Stderr, "Ginkgo Version %s\n\n", config.VERSION) - usageForCommand(DefaultCommand, false) - for _, command := range Commands { - fmt.Fprintf(os.Stderr, "\n") - usageForCommand(command, false) - } -} - -func usageForCommand(command *Command, longForm bool) { - fmt.Fprintf(os.Stderr, "%s\n%s\n", command.UsageCommand, strings.Repeat("-", len(command.UsageCommand))) - fmt.Fprintf(os.Stderr, "%s\n", strings.Join(command.Usage, "\n")) - if command.SuppressFlagDocumentation && !longForm { - fmt.Fprintf(os.Stderr, "%s\n", strings.Join(command.FlagDocSubstitute, "\n ")) - } else { - command.FlagSet.PrintDefaults() - } -} - -func complainAndQuit(complaint string) { - fmt.Fprintf(os.Stderr, "%s\nFor usage instructions:\n\tginkgo help\n", complaint) - os.Exit(1) -} - -func findSuites(args []string, recurseForAll bool, skipPackage string, allowPrecompiled bool) ([]testsuite.TestSuite, []string) { - suites := []testsuite.TestSuite{} - - if len(args) > 0 { - for _, arg := range args { - if allowPrecompiled { - suite, err := testsuite.PrecompiledTestSuite(arg) - if err == nil { - suites = append(suites, suite) - continue - } - } - recurseForSuite := recurseForAll - if strings.HasSuffix(arg, "/...") && arg != "/..." { - arg = arg[:len(arg)-4] - recurseForSuite = true - } - suites = append(suites, testsuite.SuitesInDir(arg, recurseForSuite)...) - } - } else { - suites = testsuite.SuitesInDir(".", recurseForAll) - } - - skippedPackages := []string{} - if skipPackage != "" { - skipFilters := strings.Split(skipPackage, ",") - filteredSuites := []testsuite.TestSuite{} - for _, suite := range suites { - skip := false - for _, skipFilter := range skipFilters { - if strings.Contains(suite.Path, skipFilter) { - skip = true - break - } - } - if skip { - skippedPackages = append(skippedPackages, suite.Path) - } else { - filteredSuites = append(filteredSuites, suite) - } - } - suites = filteredSuites - } - - return suites, skippedPackages -} - -func goFmt(path string) { - err := exec.Command("go", "fmt", path).Run() - if err != nil { - complainAndQuit("Could not fmt: " + err.Error()) - } -} - -func pluralizedWord(singular, plural string, count int) string { - if count == 1 { - return singular - } - return plural -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot.go b/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot.go deleted file mode 100644 index 3f7237c60..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot.go +++ /dev/null @@ -1,194 +0,0 @@ -package nodot - -import ( - "fmt" - "go/ast" - "go/build" - "go/parser" - "go/token" - "path/filepath" - "strings" -) - -func ApplyNoDot(data []byte) ([]byte, error) { - sections, err := generateNodotSections() - if err != nil { - return nil, err - } - - for _, section := range sections { - data = section.createOrUpdateIn(data) - } - - return data, nil -} - -type nodotSection struct { - name string - pkg string - declarations []string - types []string -} - -func (s nodotSection) createOrUpdateIn(data []byte) []byte { - renames := map[string]string{} - - contents := string(data) - - lines := strings.Split(contents, "\n") - - comment := "// Declarations for " + s.name - - newLines := []string{} - for _, line := range lines { - if line == comment { - continue - } - - words := strings.Split(line, " ") - lastWord := words[len(words)-1] - - if s.containsDeclarationOrType(lastWord) { - renames[lastWord] = words[1] - continue - } - - newLines = append(newLines, line) - } - - if len(newLines[len(newLines)-1]) > 0 { - newLines = append(newLines, "") - } - - newLines = append(newLines, comment) - - for _, typ := range s.types { - name, ok := renames[s.prefix(typ)] - if !ok { - name = typ - } - newLines = append(newLines, fmt.Sprintf("type %s %s", name, s.prefix(typ))) - } - - for _, decl := range s.declarations { - name, ok := renames[s.prefix(decl)] - if !ok { - name = decl - } - newLines = append(newLines, fmt.Sprintf("var %s = %s", name, s.prefix(decl))) - } - - newLines = append(newLines, "") - - newContents := strings.Join(newLines, "\n") - - return []byte(newContents) -} - -func (s nodotSection) prefix(declOrType string) string { - return s.pkg + "." + declOrType -} - -func (s nodotSection) containsDeclarationOrType(word string) bool { - for _, declaration := range s.declarations { - if s.prefix(declaration) == word { - return true - } - } - - for _, typ := range s.types { - if s.prefix(typ) == word { - return true - } - } - - return false -} - -func generateNodotSections() ([]nodotSection, error) { - sections := []nodotSection{} - - declarations, err := getExportedDeclerationsForPackage("github.com/onsi/ginkgo", "ginkgo_dsl.go", "GINKGO_VERSION", "GINKGO_PANIC") - if err != nil { - return nil, err - } - sections = append(sections, nodotSection{ - name: "Ginkgo DSL", - pkg: "ginkgo", - declarations: declarations, - types: []string{"Done", "Benchmarker"}, - }) - - declarations, err = getExportedDeclerationsForPackage("github.com/onsi/gomega", "gomega_dsl.go", "GOMEGA_VERSION") - if err != nil { - return nil, err - } - sections = append(sections, nodotSection{ - name: "Gomega DSL", - pkg: "gomega", - declarations: declarations, - }) - - declarations, err = getExportedDeclerationsForPackage("github.com/onsi/gomega", "matchers.go") - if err != nil { - return nil, err - } - sections = append(sections, nodotSection{ - name: "Gomega Matchers", - pkg: "gomega", - declarations: declarations, - }) - - return sections, nil -} - -func getExportedDeclerationsForPackage(pkgPath string, filename string, blacklist ...string) ([]string, error) { - pkg, err := build.Import(pkgPath, ".", 0) - if err != nil { - return []string{}, err - } - - declarations, err := getExportedDeclarationsForFile(filepath.Join(pkg.Dir, filename)) - if err != nil { - return []string{}, err - } - - blacklistLookup := map[string]bool{} - for _, declaration := range blacklist { - blacklistLookup[declaration] = true - } - - filteredDeclarations := []string{} - for _, declaration := range declarations { - if blacklistLookup[declaration] { - continue - } - filteredDeclarations = append(filteredDeclarations, declaration) - } - - return filteredDeclarations, nil -} - -func getExportedDeclarationsForFile(path string) ([]string, error) { - fset := token.NewFileSet() - tree, err := parser.ParseFile(fset, path, nil, 0) - if err != nil { - return []string{}, err - } - - declarations := []string{} - ast.FileExports(tree) - for _, decl := range tree.Decls { - switch x := decl.(type) { - case *ast.GenDecl: - switch s := x.Specs[0].(type) { - case *ast.ValueSpec: - declarations = append(declarations, s.Names[0].Name) - } - case *ast.FuncDecl: - declarations = append(declarations, x.Name.Name) - } - } - - return declarations, nil -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot_suite_test.go b/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot_suite_test.go deleted file mode 100644 index ca4613e6f..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot_suite_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package nodot_test - -import ( - "github.com/onsi/ginkgo" - "github.com/onsi/gomega" - - "testing" -) - -func TestNodot(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Nodot Suite") -} - -// Declarations for Ginkgo DSL -type Done ginkgo.Done -type Benchmarker ginkgo.Benchmarker - -var GinkgoWriter = ginkgo.GinkgoWriter -var GinkgoParallelNode = ginkgo.GinkgoParallelNode -var GinkgoT = ginkgo.GinkgoT -var CurrentGinkgoTestDescription = ginkgo.CurrentGinkgoTestDescription -var RunSpecs = ginkgo.RunSpecs -var RunSpecsWithDefaultAndCustomReporters = ginkgo.RunSpecsWithDefaultAndCustomReporters -var RunSpecsWithCustomReporters = ginkgo.RunSpecsWithCustomReporters -var Fail = ginkgo.Fail -var GinkgoRecover = ginkgo.GinkgoRecover -var Describe = ginkgo.Describe -var FDescribe = ginkgo.FDescribe -var PDescribe = ginkgo.PDescribe -var XDescribe = ginkgo.XDescribe -var Context = ginkgo.Context -var FContext = ginkgo.FContext -var PContext = ginkgo.PContext -var XContext = ginkgo.XContext -var It = ginkgo.It -var FIt = ginkgo.FIt -var PIt = ginkgo.PIt -var XIt = ginkgo.XIt -var Measure = ginkgo.Measure -var FMeasure = ginkgo.FMeasure -var PMeasure = ginkgo.PMeasure -var XMeasure = ginkgo.XMeasure -var BeforeSuite = ginkgo.BeforeSuite -var AfterSuite = ginkgo.AfterSuite -var SynchronizedBeforeSuite = ginkgo.SynchronizedBeforeSuite -var SynchronizedAfterSuite = ginkgo.SynchronizedAfterSuite -var BeforeEach = ginkgo.BeforeEach -var JustBeforeEach = ginkgo.JustBeforeEach -var AfterEach = ginkgo.AfterEach - -// Declarations for Gomega DSL -var RegisterFailHandler = gomega.RegisterFailHandler -var RegisterTestingT = gomega.RegisterTestingT -var InterceptGomegaFailures = gomega.InterceptGomegaFailures -var Ω = gomega.Ω -var Expect = gomega.Expect -var ExpectWithOffset = gomega.ExpectWithOffset -var Eventually = gomega.Eventually -var EventuallyWithOffset = gomega.EventuallyWithOffset -var Consistently = gomega.Consistently -var ConsistentlyWithOffset = gomega.ConsistentlyWithOffset -var SetDefaultEventuallyTimeout = gomega.SetDefaultEventuallyTimeout -var SetDefaultEventuallyPollingInterval = gomega.SetDefaultEventuallyPollingInterval -var SetDefaultConsistentlyDuration = gomega.SetDefaultConsistentlyDuration -var SetDefaultConsistentlyPollingInterval = gomega.SetDefaultConsistentlyPollingInterval - -// Declarations for Gomega Matchers -var Equal = gomega.Equal -var BeEquivalentTo = gomega.BeEquivalentTo -var BeNil = gomega.BeNil -var BeTrue = gomega.BeTrue -var BeFalse = gomega.BeFalse -var HaveOccurred = gomega.HaveOccurred -var MatchError = gomega.MatchError -var BeClosed = gomega.BeClosed -var Receive = gomega.Receive -var MatchRegexp = gomega.MatchRegexp -var ContainSubstring = gomega.ContainSubstring -var MatchJSON = gomega.MatchJSON -var BeEmpty = gomega.BeEmpty -var HaveLen = gomega.HaveLen -var BeZero = gomega.BeZero -var ContainElement = gomega.ContainElement -var ConsistOf = gomega.ConsistOf -var HaveKey = gomega.HaveKey -var HaveKeyWithValue = gomega.HaveKeyWithValue -var BeNumerically = gomega.BeNumerically -var BeTemporally = gomega.BeTemporally -var BeAssignableToTypeOf = gomega.BeAssignableToTypeOf -var Panic = gomega.Panic diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot_test.go b/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot_test.go deleted file mode 100644 index 37260a89f..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/nodot/nodot_test.go +++ /dev/null @@ -1,81 +0,0 @@ -package nodot_test - -import ( - . "github.com/onsi/ginkgo/ginkgo/nodot" - "strings" -) - -var _ = Describe("ApplyNoDot", func() { - var result string - - apply := func(input string) string { - output, err := ApplyNoDot([]byte(input)) - Ω(err).ShouldNot(HaveOccurred()) - return string(output) - } - - Context("when no declarations have been imported yet", func() { - BeforeEach(func() { - result = apply("") - }) - - It("should add headings for the various declarations", func() { - Ω(result).Should(ContainSubstring("// Declarations for Ginkgo DSL")) - Ω(result).Should(ContainSubstring("// Declarations for Gomega DSL")) - Ω(result).Should(ContainSubstring("// Declarations for Gomega Matchers")) - }) - - It("should import Ginkgo's declarations", func() { - Ω(result).Should(ContainSubstring("var It = ginkgo.It")) - Ω(result).Should(ContainSubstring("var XDescribe = ginkgo.XDescribe")) - }) - - It("should import Ginkgo's types", func() { - Ω(result).Should(ContainSubstring("type Done ginkgo.Done")) - Ω(result).Should(ContainSubstring("type Benchmarker ginkgo.Benchmarker")) - Ω(strings.Count(result, "type ")).Should(Equal(2)) - }) - - It("should import Gomega's DSL and matchers", func() { - Ω(result).Should(ContainSubstring("var Ω = gomega.Ω")) - Ω(result).Should(ContainSubstring("var ContainSubstring = gomega.ContainSubstring")) - Ω(result).Should(ContainSubstring("var Equal = gomega.Equal")) - }) - - It("should not import blacklisted things", func() { - Ω(result).ShouldNot(ContainSubstring("GINKGO_VERSION")) - Ω(result).ShouldNot(ContainSubstring("GINKGO_PANIC")) - Ω(result).ShouldNot(ContainSubstring("GOMEGA_VERSION")) - }) - }) - - It("should be idempotent (module empty lines - go fmt can fix those for us)", func() { - first := apply("") - second := apply(first) - first = strings.Trim(first, "\n") - second = strings.Trim(second, "\n") - Ω(first).Should(Equal(second)) - }) - - It("should not mess with other things in the input", func() { - result = apply("var MyThing = SomethingThatsMine") - Ω(result).Should(ContainSubstring("var MyThing = SomethingThatsMine")) - }) - - Context("when the user has redefined a name", func() { - It("should honor the redefinition", func() { - result = apply(` -var _ = gomega.Ω -var When = ginkgo.It - `) - - Ω(result).Should(ContainSubstring("var _ = gomega.Ω")) - Ω(result).ShouldNot(ContainSubstring("var Ω = gomega.Ω")) - - Ω(result).Should(ContainSubstring("var When = ginkgo.It")) - Ω(result).ShouldNot(ContainSubstring("var It = ginkgo.It")) - - Ω(result).Should(ContainSubstring("var Context = ginkgo.Context")) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/nodot_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/nodot_command.go deleted file mode 100644 index 212235bae..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/nodot_command.go +++ /dev/null @@ -1,76 +0,0 @@ -package main - -import ( - "bufio" - "flag" - "github.com/onsi/ginkgo/ginkgo/nodot" - "io/ioutil" - "os" - "path/filepath" - "regexp" -) - -func BuildNodotCommand() *Command { - return &Command{ - Name: "nodot", - FlagSet: flag.NewFlagSet("bootstrap", flag.ExitOnError), - UsageCommand: "ginkgo nodot", - Usage: []string{ - "Update the nodot declarations in your test suite", - "Any missing declarations (from, say, a recently added matcher) will be added to your bootstrap file.", - "If you've renamed a declaration, that name will be honored and not overwritten.", - }, - Command: updateNodot, - } -} - -func updateNodot(args []string, additionalArgs []string) { - suiteFile, perm := findSuiteFile() - - data, err := ioutil.ReadFile(suiteFile) - if err != nil { - complainAndQuit("Failed to update nodot declarations: " + err.Error()) - } - - content, err := nodot.ApplyNoDot(data) - if err != nil { - complainAndQuit("Failed to update nodot declarations: " + err.Error()) - } - ioutil.WriteFile(suiteFile, content, perm) - - goFmt(suiteFile) -} - -func findSuiteFile() (string, os.FileMode) { - workingDir, err := os.Getwd() - if err != nil { - complainAndQuit("Could not find suite file for nodot: " + err.Error()) - } - - files, err := ioutil.ReadDir(workingDir) - if err != nil { - complainAndQuit("Could not find suite file for nodot: " + err.Error()) - } - - re := regexp.MustCompile(`RunSpecs\(|RunSpecsWithDefaultAndCustomReporters\(|RunSpecsWithCustomReporters\(`) - - for _, file := range files { - if file.IsDir() { - continue - } - path := filepath.Join(workingDir, file.Name()) - f, err := os.Open(path) - if err != nil { - complainAndQuit("Could not find suite file for nodot: " + err.Error()) - } - defer f.Close() - - if re.MatchReader(bufio.NewReader(f)) { - return path, file.Mode() - } - } - - complainAndQuit("Could not find a suite file for nodot: you need a bootstrap file that call's Ginkgo's RunSpecs() command.\nTry running ginkgo bootstrap first.") - - return "", 0 -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/notifications.go b/vendor/github.com/onsi/ginkgo/ginkgo/notifications.go deleted file mode 100644 index 368d61fb3..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/notifications.go +++ /dev/null @@ -1,141 +0,0 @@ -package main - -import ( - "fmt" - "os" - "os/exec" - "regexp" - "runtime" - "strings" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/ginkgo/testsuite" -) - -type Notifier struct { - commandFlags *RunWatchAndBuildCommandFlags -} - -func NewNotifier(commandFlags *RunWatchAndBuildCommandFlags) *Notifier { - return &Notifier{ - commandFlags: commandFlags, - } -} - -func (n *Notifier) VerifyNotificationsAreAvailable() { - if n.commandFlags.Notify { - onLinux := (runtime.GOOS == "linux") - onOSX := (runtime.GOOS == "darwin") - if onOSX { - - _, err := exec.LookPath("terminal-notifier") - if err != nil { - fmt.Printf(`--notify requires terminal-notifier, which you don't seem to have installed. - -OSX: - -To remedy this: - - brew install terminal-notifier - -To learn more about terminal-notifier: - - https://github.com/alloy/terminal-notifier -`) - os.Exit(1) - } - - } else if onLinux { - - _, err := exec.LookPath("notify-send") - if err != nil { - fmt.Printf(`--notify requires terminal-notifier or notify-send, which you don't seem to have installed. - -Linux: - -Download and install notify-send for your distribution -`) - os.Exit(1) - } - - } - } -} - -func (n *Notifier) SendSuiteCompletionNotification(suite testsuite.TestSuite, suitePassed bool) { - if suitePassed { - n.SendNotification("Ginkgo [PASS]", fmt.Sprintf(`Test suite for "%s" passed.`, suite.PackageName)) - } else { - n.SendNotification("Ginkgo [FAIL]", fmt.Sprintf(`Test suite for "%s" failed.`, suite.PackageName)) - } -} - -func (n *Notifier) SendNotification(title string, subtitle string) { - - if n.commandFlags.Notify { - onLinux := (runtime.GOOS == "linux") - onOSX := (runtime.GOOS == "darwin") - - if onOSX { - - _, err := exec.LookPath("terminal-notifier") - if err == nil { - args := []string{"-title", title, "-subtitle", subtitle, "-group", "com.onsi.ginkgo"} - terminal := os.Getenv("TERM_PROGRAM") - if terminal == "iTerm.app" { - args = append(args, "-activate", "com.googlecode.iterm2") - } else if terminal == "Apple_Terminal" { - args = append(args, "-activate", "com.apple.Terminal") - } - - exec.Command("terminal-notifier", args...).Run() - } - - } else if onLinux { - - _, err := exec.LookPath("notify-send") - if err == nil { - args := []string{"-a", "ginkgo", title, subtitle} - exec.Command("notify-send", args...).Run() - } - - } - } -} - -func (n *Notifier) RunCommand(suite testsuite.TestSuite, suitePassed bool) { - - command := n.commandFlags.AfterSuiteHook - if command != "" { - - // Allow for string replacement to pass input to the command - passed := "[FAIL]" - if suitePassed { - passed = "[PASS]" - } - command = strings.Replace(command, "(ginkgo-suite-passed)", passed, -1) - command = strings.Replace(command, "(ginkgo-suite-name)", suite.PackageName, -1) - - // Must break command into parts - splitArgs := regexp.MustCompile(`'.+'|".+"|\S+`) - parts := splitArgs.FindAllString(command, -1) - - output, err := exec.Command(parts[0], parts[1:]...).CombinedOutput() - if err != nil { - fmt.Println("Post-suite command failed:") - if config.DefaultReporterConfig.NoColor { - fmt.Printf("\t%s\n", output) - } else { - fmt.Printf("\t%s%s%s\n", redColor, string(output), defaultStyle) - } - n.SendNotification("Ginkgo [ERROR]", fmt.Sprintf(`After suite command "%s" failed`, n.commandFlags.AfterSuiteHook)) - } else { - fmt.Println("Post-suite command succeeded:") - if config.DefaultReporterConfig.NoColor { - fmt.Printf("\t%s\n", output) - } else { - fmt.Printf("\t%s%s%s\n", greenColor, string(output), defaultStyle) - } - } - } -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/run_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/run_command.go deleted file mode 100644 index d1483f602..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/run_command.go +++ /dev/null @@ -1,192 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "math/rand" - "os" - "time" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/ginkgo/interrupthandler" - "github.com/onsi/ginkgo/ginkgo/testrunner" - "github.com/onsi/ginkgo/types" -) - -func BuildRunCommand() *Command { - commandFlags := NewRunCommandFlags(flag.NewFlagSet("ginkgo", flag.ExitOnError)) - notifier := NewNotifier(commandFlags) - interruptHandler := interrupthandler.NewInterruptHandler() - runner := &SpecRunner{ - commandFlags: commandFlags, - notifier: notifier, - interruptHandler: interruptHandler, - suiteRunner: NewSuiteRunner(notifier, interruptHandler), - } - - return &Command{ - Name: "", - FlagSet: commandFlags.FlagSet, - UsageCommand: "ginkgo -- ", - Usage: []string{ - "Run the tests in the passed in (or the package in the current directory if left blank).", - "Any arguments after -- will be passed to the test.", - "Accepts the following flags:", - }, - Command: runner.RunSpecs, - } -} - -type SpecRunner struct { - commandFlags *RunWatchAndBuildCommandFlags - notifier *Notifier - interruptHandler *interrupthandler.InterruptHandler - suiteRunner *SuiteRunner -} - -func (r *SpecRunner) RunSpecs(args []string, additionalArgs []string) { - r.commandFlags.computeNodes() - r.notifier.VerifyNotificationsAreAvailable() - - suites, skippedPackages := findSuites(args, r.commandFlags.Recurse, r.commandFlags.SkipPackage, true) - if len(skippedPackages) > 0 { - fmt.Println("Will skip:") - for _, skippedPackage := range skippedPackages { - fmt.Println(" " + skippedPackage) - } - } - - if len(skippedPackages) > 0 && len(suites) == 0 { - fmt.Println("All tests skipped! Exiting...") - os.Exit(0) - } - - if len(suites) == 0 { - complainAndQuit("Found no test suites") - } - - r.ComputeSuccinctMode(len(suites)) - - t := time.Now() - - runners := []*testrunner.TestRunner{} - for _, suite := range suites { - runners = append(runners, testrunner.New(suite, r.commandFlags.NumCPU, r.commandFlags.ParallelStream, r.commandFlags.Timeout, r.commandFlags.GoOpts, additionalArgs)) - } - - numSuites := 0 - runResult := testrunner.PassingRunResult() - if r.commandFlags.UntilItFails { - iteration := 0 - for { - r.UpdateSeed() - randomizedRunners := r.randomizeOrder(runners) - runResult, numSuites = r.suiteRunner.RunSuites(randomizedRunners, r.commandFlags.NumCompilers, r.commandFlags.KeepGoing, nil) - iteration++ - - if r.interruptHandler.WasInterrupted() { - break - } - - if runResult.Passed { - fmt.Printf("\nAll tests passed...\nWill keep running them until they fail.\nThis was attempt #%d\n%s\n", iteration, orcMessage(iteration)) - } else { - fmt.Printf("\nTests failed on attempt #%d\n\n", iteration) - break - } - } - } else { - randomizedRunners := r.randomizeOrder(runners) - runResult, numSuites = r.suiteRunner.RunSuites(randomizedRunners, r.commandFlags.NumCompilers, r.commandFlags.KeepGoing, nil) - } - - for _, runner := range runners { - runner.CleanUp() - } - - fmt.Printf("\nGinkgo ran %d %s in %s\n", numSuites, pluralizedWord("suite", "suites", numSuites), time.Since(t)) - - if runResult.Passed { - if runResult.HasProgrammaticFocus { - fmt.Printf("Test Suite Passed\n") - fmt.Printf("Detected Programmatic Focus - setting exit status to %d\n", types.GINKGO_FOCUS_EXIT_CODE) - os.Exit(types.GINKGO_FOCUS_EXIT_CODE) - } else { - fmt.Printf("Test Suite Passed\n") - os.Exit(0) - } - } else { - fmt.Printf("Test Suite Failed\n") - os.Exit(1) - } -} - -func (r *SpecRunner) ComputeSuccinctMode(numSuites int) { - if config.DefaultReporterConfig.Verbose { - config.DefaultReporterConfig.Succinct = false - return - } - - if numSuites == 1 { - return - } - - if numSuites > 1 && !r.commandFlags.wasSet("succinct") { - config.DefaultReporterConfig.Succinct = true - } -} - -func (r *SpecRunner) UpdateSeed() { - if !r.commandFlags.wasSet("seed") { - config.GinkgoConfig.RandomSeed = time.Now().Unix() - } -} - -func (r *SpecRunner) randomizeOrder(runners []*testrunner.TestRunner) []*testrunner.TestRunner { - if !r.commandFlags.RandomizeSuites { - return runners - } - - if len(runners) <= 1 { - return runners - } - - randomizedRunners := make([]*testrunner.TestRunner, len(runners)) - randomizer := rand.New(rand.NewSource(config.GinkgoConfig.RandomSeed)) - permutation := randomizer.Perm(len(runners)) - for i, j := range permutation { - randomizedRunners[i] = runners[j] - } - return randomizedRunners -} - -func orcMessage(iteration int) string { - if iteration < 10 { - return "" - } else if iteration < 30 { - return []string{ - "If at first you succeed...", - "...try, try again.", - "Looking good!", - "Still good...", - "I think your tests are fine....", - "Yep, still passing", - "Oh boy, here I go testin' again!", - "Even the gophers are getting bored", - "Did you try -race?", - "Maybe you should stop now?", - "I'm getting tired...", - "What if I just made you a sandwich?", - "Hit ^C, hit ^C, please hit ^C", - "Make it stop. Please!", - "Come on! Enough is enough!", - "Dave, this conversation can serve no purpose anymore. Goodbye.", - "Just what do you think you're doing, Dave? ", - "I, Sisyphus", - "Insanity: doing the same thing over and over again and expecting different results. -Einstein", - "I guess Einstein never tried to churn butter", - }[iteration-10] + "\n" - } else { - return "No, seriously... you can probably stop now.\n" - } -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/run_watch_and_build_command_flags.go b/vendor/github.com/onsi/ginkgo/ginkgo/run_watch_and_build_command_flags.go deleted file mode 100644 index b7cb7f566..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/run_watch_and_build_command_flags.go +++ /dev/null @@ -1,167 +0,0 @@ -package main - -import ( - "flag" - "runtime" - - "time" - - "github.com/onsi/ginkgo/config" -) - -type RunWatchAndBuildCommandFlags struct { - Recurse bool - SkipPackage string - GoOpts map[string]interface{} - - //for run and watch commands - NumCPU int - NumCompilers int - ParallelStream bool - Notify bool - AfterSuiteHook string - AutoNodes bool - Timeout time.Duration - - //only for run command - KeepGoing bool - UntilItFails bool - RandomizeSuites bool - - //only for watch command - Depth int - WatchRegExp string - - FlagSet *flag.FlagSet -} - -const runMode = 1 -const watchMode = 2 -const buildMode = 3 - -func NewRunCommandFlags(flagSet *flag.FlagSet) *RunWatchAndBuildCommandFlags { - c := &RunWatchAndBuildCommandFlags{ - FlagSet: flagSet, - } - c.flags(runMode) - return c -} - -func NewWatchCommandFlags(flagSet *flag.FlagSet) *RunWatchAndBuildCommandFlags { - c := &RunWatchAndBuildCommandFlags{ - FlagSet: flagSet, - } - c.flags(watchMode) - return c -} - -func NewBuildCommandFlags(flagSet *flag.FlagSet) *RunWatchAndBuildCommandFlags { - c := &RunWatchAndBuildCommandFlags{ - FlagSet: flagSet, - } - c.flags(buildMode) - return c -} - -func (c *RunWatchAndBuildCommandFlags) wasSet(flagName string) bool { - wasSet := false - c.FlagSet.Visit(func(f *flag.Flag) { - if f.Name == flagName { - wasSet = true - } - }) - - return wasSet -} - -func (c *RunWatchAndBuildCommandFlags) computeNodes() { - if c.wasSet("nodes") { - return - } - if c.AutoNodes { - switch n := runtime.NumCPU(); { - case n <= 4: - c.NumCPU = n - default: - c.NumCPU = n - 1 - } - } -} - -func (c *RunWatchAndBuildCommandFlags) stringSlot(slot string) *string { - var opt string - c.GoOpts[slot] = &opt - return &opt -} - -func (c *RunWatchAndBuildCommandFlags) boolSlot(slot string) *bool { - var opt bool - c.GoOpts[slot] = &opt - return &opt -} - -func (c *RunWatchAndBuildCommandFlags) intSlot(slot string) *int { - var opt int - c.GoOpts[slot] = &opt - return &opt -} - -func (c *RunWatchAndBuildCommandFlags) flags(mode int) { - c.GoOpts = make(map[string]interface{}) - - onWindows := (runtime.GOOS == "windows") - - c.FlagSet.BoolVar(&(c.Recurse), "r", false, "Find and run test suites under the current directory recursively.") - c.FlagSet.BoolVar(c.boolSlot("race"), "race", false, "Run tests with race detection enabled.") - c.FlagSet.BoolVar(c.boolSlot("cover"), "cover", false, "Run tests with coverage analysis, will generate coverage profiles with the package name in the current directory.") - c.FlagSet.StringVar(c.stringSlot("coverpkg"), "coverpkg", "", "Run tests with coverage on the given external modules.") - c.FlagSet.StringVar(&(c.SkipPackage), "skipPackage", "", "A comma-separated list of package names to be skipped. If any part of the package's path matches, that package is ignored.") - c.FlagSet.StringVar(c.stringSlot("tags"), "tags", "", "A list of build tags to consider satisfied during the build.") - c.FlagSet.StringVar(c.stringSlot("gcflags"), "gcflags", "", "Arguments to pass on each go tool compile invocation.") - c.FlagSet.StringVar(c.stringSlot("covermode"), "covermode", "", "Set the mode for coverage analysis.") - c.FlagSet.BoolVar(c.boolSlot("a"), "a", false, "Force rebuilding of packages that are already up-to-date.") - c.FlagSet.BoolVar(c.boolSlot("n"), "n", false, "Have `go test` print the commands but do not run them.") - c.FlagSet.BoolVar(c.boolSlot("msan"), "msan", false, "Enable interoperation with memory sanitizer.") - c.FlagSet.BoolVar(c.boolSlot("x"), "x", false, "Have `go test` print the commands.") - c.FlagSet.BoolVar(c.boolSlot("work"), "work", false, "Print the name of the temporary work directory and do not delete it when exiting.") - c.FlagSet.StringVar(c.stringSlot("asmflags"), "asmflags", "", "Arguments to pass on each go tool asm invocation.") - c.FlagSet.StringVar(c.stringSlot("buildmode"), "buildmode", "", "Build mode to use. See 'go help buildmode' for more.") - c.FlagSet.StringVar(c.stringSlot("compiler"), "compiler", "", "Name of compiler to use, as in runtime.Compiler (gccgo or gc).") - c.FlagSet.StringVar(c.stringSlot("gccgoflags"), "gccgoflags", "", "Arguments to pass on each gccgo compiler/linker invocation.") - c.FlagSet.StringVar(c.stringSlot("installsuffix"), "installsuffix", "", "A suffix to use in the name of the package installation directory.") - c.FlagSet.StringVar(c.stringSlot("ldflags"), "ldflags", "", "Arguments to pass on each go tool link invocation.") - c.FlagSet.BoolVar(c.boolSlot("linkshared"), "linkshared", false, "Link against shared libraries previously created with -buildmode=shared.") - c.FlagSet.StringVar(c.stringSlot("pkgdir"), "pkgdir", "", "install and load all packages from the given dir instead of the usual locations.") - c.FlagSet.StringVar(c.stringSlot("toolexec"), "toolexec", "", "a program to use to invoke toolchain programs like vet and asm.") - c.FlagSet.IntVar(c.intSlot("blockprofilerate"), "blockprofilerate", 1, "Control the detail provided in goroutine blocking profiles by calling runtime.SetBlockProfileRate with the given value.") - c.FlagSet.StringVar(c.stringSlot("coverprofile"), "coverprofile", "", "Write a coverage profile to the specified file after all tests have passed.") - c.FlagSet.StringVar(c.stringSlot("cpuprofile"), "cpuprofile", "", "Write a CPU profile to the specified file before exiting.") - c.FlagSet.StringVar(c.stringSlot("memprofile"), "memprofile", "", "Write a memory profile to the specified file after all tests have passed.") - c.FlagSet.IntVar(c.intSlot("memprofilerate"), "memprofilerate", 0, "Enable more precise (and expensive) memory profiles by setting runtime.MemProfileRate.") - c.FlagSet.StringVar(c.stringSlot("outputdir"), "outputdir", "", "Place output files from profiling in the specified directory.") - c.FlagSet.BoolVar(c.boolSlot("requireSuite"), "requireSuite", false, "Fail if there are ginkgo tests in a directory but no test suite (missing RunSpecs)") - - if mode == runMode || mode == watchMode { - config.Flags(c.FlagSet, "", false) - c.FlagSet.IntVar(&(c.NumCPU), "nodes", 1, "The number of parallel test nodes to run") - c.FlagSet.IntVar(&(c.NumCompilers), "compilers", 0, "The number of concurrent compilations to run (0 will autodetect)") - c.FlagSet.BoolVar(&(c.AutoNodes), "p", false, "Run in parallel with auto-detected number of nodes") - c.FlagSet.BoolVar(&(c.ParallelStream), "stream", onWindows, "stream parallel test output in real time: less coherent, but useful for debugging") - if !onWindows { - c.FlagSet.BoolVar(&(c.Notify), "notify", false, "Send desktop notifications when a test run completes") - } - c.FlagSet.StringVar(&(c.AfterSuiteHook), "afterSuiteHook", "", "Run a command when a suite test run completes") - c.FlagSet.DurationVar(&(c.Timeout), "timeout", 24*time.Hour, "Suite fails if it does not complete within the specified timeout") - } - - if mode == runMode { - c.FlagSet.BoolVar(&(c.KeepGoing), "keepGoing", false, "When true, failures from earlier test suites do not prevent later test suites from running") - c.FlagSet.BoolVar(&(c.UntilItFails), "untilItFails", false, "When true, Ginkgo will keep rerunning tests until a failure occurs") - c.FlagSet.BoolVar(&(c.RandomizeSuites), "randomizeSuites", false, "When true, Ginkgo will randomize the order in which test suites run") - } - - if mode == watchMode { - c.FlagSet.IntVar(&(c.Depth), "depth", 1, "Ginkgo will watch dependencies down to this depth in the dependency tree") - c.FlagSet.StringVar(&(c.WatchRegExp), "watchRegExp", `\.go$`, "Files matching this regular expression will be watched for changes") - } -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/suite_runner.go b/vendor/github.com/onsi/ginkgo/ginkgo/suite_runner.go deleted file mode 100644 index ce6c94602..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/suite_runner.go +++ /dev/null @@ -1,173 +0,0 @@ -package main - -import ( - "fmt" - "runtime" - "sync" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/ginkgo/interrupthandler" - "github.com/onsi/ginkgo/ginkgo/testrunner" - "github.com/onsi/ginkgo/ginkgo/testsuite" - colorable "github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable" -) - -type compilationInput struct { - runner *testrunner.TestRunner - result chan compilationOutput -} - -type compilationOutput struct { - runner *testrunner.TestRunner - err error -} - -type SuiteRunner struct { - notifier *Notifier - interruptHandler *interrupthandler.InterruptHandler -} - -func NewSuiteRunner(notifier *Notifier, interruptHandler *interrupthandler.InterruptHandler) *SuiteRunner { - return &SuiteRunner{ - notifier: notifier, - interruptHandler: interruptHandler, - } -} - -func (r *SuiteRunner) compileInParallel(runners []*testrunner.TestRunner, numCompilers int, willCompile func(suite testsuite.TestSuite)) chan compilationOutput { - //we return this to the consumer, it will return each runner in order as it compiles - compilationOutputs := make(chan compilationOutput, len(runners)) - - //an array of channels - the nth runner's compilation output is sent to the nth channel in this array - //we read from these channels in order to ensure we run the suites in order - orderedCompilationOutputs := []chan compilationOutput{} - for _ = range runners { - orderedCompilationOutputs = append(orderedCompilationOutputs, make(chan compilationOutput, 1)) - } - - //we're going to spin up numCompilers compilers - they're going to run concurrently and will consume this channel - //we prefill the channel then close it, this ensures we compile things in the correct order - workPool := make(chan compilationInput, len(runners)) - for i, runner := range runners { - workPool <- compilationInput{runner, orderedCompilationOutputs[i]} - } - close(workPool) - - //pick a reasonable numCompilers - if numCompilers == 0 { - numCompilers = runtime.NumCPU() - } - - //a WaitGroup to help us wait for all compilers to shut down - wg := &sync.WaitGroup{} - wg.Add(numCompilers) - - //spin up the concurrent compilers - for i := 0; i < numCompilers; i++ { - go func() { - defer wg.Done() - for input := range workPool { - if r.interruptHandler.WasInterrupted() { - return - } - - if willCompile != nil { - willCompile(input.runner.Suite) - } - - //We retry because Go sometimes steps on itself when multiple compiles happen in parallel. This is ugly, but should help resolve flakiness... - var err error - retries := 0 - for retries <= 5 { - if r.interruptHandler.WasInterrupted() { - return - } - if err = input.runner.Compile(); err == nil { - break - } - retries++ - } - - input.result <- compilationOutput{input.runner, err} - } - }() - } - - //read from the compilation output channels *in order* and send them to the caller - //close the compilationOutputs channel to tell the caller we're done - go func() { - defer close(compilationOutputs) - for _, orderedCompilationOutput := range orderedCompilationOutputs { - select { - case compilationOutput := <-orderedCompilationOutput: - compilationOutputs <- compilationOutput - case <-r.interruptHandler.C: - //interrupt detected, wait for the compilers to shut down then bail - //this ensure we clean up after ourselves as we don't leave any compilation processes running - wg.Wait() - return - } - } - }() - - return compilationOutputs -} - -func (r *SuiteRunner) RunSuites(runners []*testrunner.TestRunner, numCompilers int, keepGoing bool, willCompile func(suite testsuite.TestSuite)) (testrunner.RunResult, int) { - runResult := testrunner.PassingRunResult() - - compilationOutputs := r.compileInParallel(runners, numCompilers, willCompile) - - numSuitesThatRan := 0 - suitesThatFailed := []testsuite.TestSuite{} - for compilationOutput := range compilationOutputs { - if compilationOutput.err != nil { - fmt.Print(compilationOutput.err.Error()) - } - numSuitesThatRan++ - suiteRunResult := testrunner.FailingRunResult() - if compilationOutput.err == nil { - suiteRunResult = compilationOutput.runner.Run() - } - r.notifier.SendSuiteCompletionNotification(compilationOutput.runner.Suite, suiteRunResult.Passed) - r.notifier.RunCommand(compilationOutput.runner.Suite, suiteRunResult.Passed) - runResult = runResult.Merge(suiteRunResult) - if !suiteRunResult.Passed { - suitesThatFailed = append(suitesThatFailed, compilationOutput.runner.Suite) - if !keepGoing { - break - } - } - if numSuitesThatRan < len(runners) && !config.DefaultReporterConfig.Succinct { - fmt.Println("") - } - } - - if keepGoing && !runResult.Passed { - r.listFailedSuites(suitesThatFailed) - } - - return runResult, numSuitesThatRan -} - -func (r *SuiteRunner) listFailedSuites(suitesThatFailed []testsuite.TestSuite) { - fmt.Println("") - fmt.Println("There were failures detected in the following suites:") - - maxPackageNameLength := 0 - for _, suite := range suitesThatFailed { - if len(suite.PackageName) > maxPackageNameLength { - maxPackageNameLength = len(suite.PackageName) - } - } - - packageNameFormatter := fmt.Sprintf("%%%ds", maxPackageNameLength) - - for _, suite := range suitesThatFailed { - if config.DefaultReporterConfig.NoColor { - fmt.Printf("\t"+packageNameFormatter+" %s\n", suite.PackageName, suite.Path) - } else { - fmt.Fprintf(colorable.NewColorableStdout(), "\t%s"+packageNameFormatter+"%s %s%s%s\n", redColor, suite.PackageName, defaultStyle, lightGrayColor, suite.Path, defaultStyle) - } - } -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/log_writer.go b/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/log_writer.go deleted file mode 100644 index a73a6e379..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/log_writer.go +++ /dev/null @@ -1,52 +0,0 @@ -package testrunner - -import ( - "bytes" - "fmt" - "io" - "log" - "strings" - "sync" -) - -type logWriter struct { - buffer *bytes.Buffer - lock *sync.Mutex - log *log.Logger -} - -func newLogWriter(target io.Writer, node int) *logWriter { - return &logWriter{ - buffer: &bytes.Buffer{}, - lock: &sync.Mutex{}, - log: log.New(target, fmt.Sprintf("[%d] ", node), 0), - } -} - -func (w *logWriter) Write(data []byte) (n int, err error) { - w.lock.Lock() - defer w.lock.Unlock() - - w.buffer.Write(data) - contents := w.buffer.String() - - lines := strings.Split(contents, "\n") - for _, line := range lines[0 : len(lines)-1] { - w.log.Println(line) - } - - w.buffer.Reset() - w.buffer.Write([]byte(lines[len(lines)-1])) - return len(data), nil -} - -func (w *logWriter) Close() error { - w.lock.Lock() - defer w.lock.Unlock() - - if w.buffer.Len() > 0 { - w.log.Println(w.buffer.String()) - } - - return nil -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/run_result.go b/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/run_result.go deleted file mode 100644 index 5d472acb8..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/run_result.go +++ /dev/null @@ -1,27 +0,0 @@ -package testrunner - -type RunResult struct { - Passed bool - HasProgrammaticFocus bool -} - -func PassingRunResult() RunResult { - return RunResult{ - Passed: true, - HasProgrammaticFocus: false, - } -} - -func FailingRunResult() RunResult { - return RunResult{ - Passed: false, - HasProgrammaticFocus: false, - } -} - -func (r RunResult) Merge(o RunResult) RunResult { - return RunResult{ - Passed: r.Passed && o.Passed, - HasProgrammaticFocus: r.HasProgrammaticFocus || o.HasProgrammaticFocus, - } -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner.go b/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner.go deleted file mode 100644 index f0a591b9d..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner.go +++ /dev/null @@ -1,488 +0,0 @@ -package testrunner - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" - "syscall" - "time" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/ginkgo/testsuite" - "github.com/onsi/ginkgo/internal/remote" - "github.com/onsi/ginkgo/reporters/stenographer" - "github.com/onsi/ginkgo/types" -) - -type TestRunner struct { - Suite testsuite.TestSuite - - compiled bool - compilationTargetPath string - - numCPU int - parallelStream bool - timeout time.Duration - goOpts map[string]interface{} - additionalArgs []string - stderr *bytes.Buffer -} - -func New(suite testsuite.TestSuite, numCPU int, parallelStream bool, timeout time.Duration, goOpts map[string]interface{}, additionalArgs []string) *TestRunner { - runner := &TestRunner{ - Suite: suite, - numCPU: numCPU, - parallelStream: parallelStream, - goOpts: goOpts, - additionalArgs: additionalArgs, - timeout: timeout, - stderr: new(bytes.Buffer), - } - - if !suite.Precompiled { - dir, err := ioutil.TempDir("", "ginkgo") - if err != nil { - panic(fmt.Sprintf("couldn't create temporary directory... might be time to rm -rf:\n%s", err.Error())) - } - runner.compilationTargetPath = filepath.Join(dir, suite.PackageName+".test") - } - - return runner -} - -func (t *TestRunner) Compile() error { - return t.CompileTo(t.compilationTargetPath) -} - -func (t *TestRunner) BuildArgs(path string) []string { - args := []string{"test", "-c", "-i", "-o", path, t.Suite.Path} - - if *t.goOpts["covermode"].(*string) != "" { - args = append(args, "-cover", fmt.Sprintf("-covermode=%s", *t.goOpts["covermode"].(*string))) - } else { - if *t.goOpts["cover"].(*bool) || *t.goOpts["coverpkg"].(*string) != "" { - args = append(args, "-cover", "-covermode=atomic") - } - } - - boolOpts := []string{ - "a", - "n", - "msan", - "race", - "x", - "work", - "linkshared", - } - - for _, opt := range boolOpts { - if s, found := t.goOpts[opt].(*bool); found && *s { - args = append(args, fmt.Sprintf("-%s", opt)) - } - } - - intOpts := []string{ - "memprofilerate", - "blockprofilerate", - } - - for _, opt := range intOpts { - if s, found := t.goOpts[opt].(*int); found { - args = append(args, fmt.Sprintf("-%s=%d", opt, *s)) - } - } - - stringOpts := []string{ - "asmflags", - "buildmode", - "compiler", - "gccgoflags", - "installsuffix", - "ldflags", - "pkgdir", - "toolexec", - "coverprofile", - "cpuprofile", - "memprofile", - "outputdir", - "coverpkg", - "tags", - "gcflags", - } - - for _, opt := range stringOpts { - if s, found := t.goOpts[opt].(*string); found && *s != "" { - args = append(args, fmt.Sprintf("-%s=%s", opt, *s)) - } - } - return args -} - -func (t *TestRunner) CompileTo(path string) error { - if t.compiled { - return nil - } - - if t.Suite.Precompiled { - return nil - } - - args := t.BuildArgs(path) - cmd := exec.Command("go", args...) - - output, err := cmd.CombinedOutput() - - if err != nil { - if len(output) > 0 { - return fmt.Errorf("Failed to compile %s:\n\n%s", t.Suite.PackageName, output) - } - return fmt.Errorf("Failed to compile %s", t.Suite.PackageName) - } - - if len(output) > 0 { - fmt.Println(string(output)) - } - - if fileExists(path) == false { - compiledFile := t.Suite.PackageName + ".test" - if fileExists(compiledFile) { - // seems like we are on an old go version that does not support the -o flag on go test - // move the compiled test file to the desired location by hand - err = os.Rename(compiledFile, path) - if err != nil { - // We cannot move the file, perhaps because the source and destination - // are on different partitions. We can copy the file, however. - err = copyFile(compiledFile, path) - if err != nil { - return fmt.Errorf("Failed to copy compiled file: %s", err) - } - } - } else { - return fmt.Errorf("Failed to compile %s: output file %q could not be found", t.Suite.PackageName, path) - } - } - - t.compiled = true - - return nil -} - -func fileExists(path string) bool { - _, err := os.Stat(path) - return err == nil || os.IsNotExist(err) == false -} - -// copyFile copies the contents of the file named src to the file named -// by dst. The file will be created if it does not already exist. If the -// destination file exists, all it's contents will be replaced by the contents -// of the source file. -func copyFile(src, dst string) error { - srcInfo, err := os.Stat(src) - if err != nil { - return err - } - mode := srcInfo.Mode() - - in, err := os.Open(src) - if err != nil { - return err - } - - defer in.Close() - - out, err := os.Create(dst) - if err != nil { - return err - } - - defer func() { - closeErr := out.Close() - if err == nil { - err = closeErr - } - }() - - _, err = io.Copy(out, in) - if err != nil { - return err - } - - err = out.Sync() - if err != nil { - return err - } - - return out.Chmod(mode) -} - -func (t *TestRunner) Run() RunResult { - if t.Suite.IsGinkgo { - if t.numCPU > 1 { - if t.parallelStream { - return t.runAndStreamParallelGinkgoSuite() - } else { - return t.runParallelGinkgoSuite() - } - } else { - return t.runSerialGinkgoSuite() - } - } else { - return t.runGoTestSuite() - } -} - -func (t *TestRunner) CleanUp() { - if t.Suite.Precompiled { - return - } - os.RemoveAll(filepath.Dir(t.compilationTargetPath)) -} - -func (t *TestRunner) runSerialGinkgoSuite() RunResult { - ginkgoArgs := config.BuildFlagArgs("ginkgo", config.GinkgoConfig, config.DefaultReporterConfig) - return t.run(t.cmd(ginkgoArgs, os.Stdout, 1), nil) -} - -func (t *TestRunner) runGoTestSuite() RunResult { - return t.run(t.cmd([]string{"-test.v"}, os.Stdout, 1), nil) -} - -func (t *TestRunner) runAndStreamParallelGinkgoSuite() RunResult { - completions := make(chan RunResult) - writers := make([]*logWriter, t.numCPU) - - server, err := remote.NewServer(t.numCPU) - if err != nil { - panic("Failed to start parallel spec server") - } - - server.Start() - defer server.Close() - - for cpu := 0; cpu < t.numCPU; cpu++ { - config.GinkgoConfig.ParallelNode = cpu + 1 - config.GinkgoConfig.ParallelTotal = t.numCPU - config.GinkgoConfig.SyncHost = server.Address() - - ginkgoArgs := config.BuildFlagArgs("ginkgo", config.GinkgoConfig, config.DefaultReporterConfig) - - writers[cpu] = newLogWriter(os.Stdout, cpu+1) - - cmd := t.cmd(ginkgoArgs, writers[cpu], cpu+1) - - server.RegisterAlive(cpu+1, func() bool { - if cmd.ProcessState == nil { - return true - } - return !cmd.ProcessState.Exited() - }) - - go t.run(cmd, completions) - } - - res := PassingRunResult() - - for cpu := 0; cpu < t.numCPU; cpu++ { - res = res.Merge(<-completions) - } - - for _, writer := range writers { - writer.Close() - } - - os.Stdout.Sync() - - if *t.goOpts["cover"].(*bool) || *t.goOpts["coverpkg"].(*string) != "" || *t.goOpts["covermode"].(*string) != "" { - t.combineCoverprofiles() - } - - return res -} - -func (t *TestRunner) runParallelGinkgoSuite() RunResult { - result := make(chan bool) - completions := make(chan RunResult) - writers := make([]*logWriter, t.numCPU) - reports := make([]*bytes.Buffer, t.numCPU) - - stenographer := stenographer.New(!config.DefaultReporterConfig.NoColor, config.GinkgoConfig.FlakeAttempts > 1) - aggregator := remote.NewAggregator(t.numCPU, result, config.DefaultReporterConfig, stenographer) - - server, err := remote.NewServer(t.numCPU) - if err != nil { - panic("Failed to start parallel spec server") - } - server.RegisterReporters(aggregator) - server.Start() - defer server.Close() - - for cpu := 0; cpu < t.numCPU; cpu++ { - config.GinkgoConfig.ParallelNode = cpu + 1 - config.GinkgoConfig.ParallelTotal = t.numCPU - config.GinkgoConfig.SyncHost = server.Address() - config.GinkgoConfig.StreamHost = server.Address() - - ginkgoArgs := config.BuildFlagArgs("ginkgo", config.GinkgoConfig, config.DefaultReporterConfig) - - reports[cpu] = &bytes.Buffer{} - writers[cpu] = newLogWriter(reports[cpu], cpu+1) - - cmd := t.cmd(ginkgoArgs, writers[cpu], cpu+1) - - server.RegisterAlive(cpu+1, func() bool { - if cmd.ProcessState == nil { - return true - } - return !cmd.ProcessState.Exited() - }) - - go t.run(cmd, completions) - } - - res := PassingRunResult() - - for cpu := 0; cpu < t.numCPU; cpu++ { - res = res.Merge(<-completions) - } - - //all test processes are done, at this point - //we should be able to wait for the aggregator to tell us that it's done - - select { - case <-result: - fmt.Println("") - case <-time.After(time.Second): - //the aggregator never got back to us! something must have gone wrong - fmt.Println(` - ------------------------------------------------------------------- - | | - | Ginkgo timed out waiting for all parallel nodes to report back! | - | | - ------------------------------------------------------------------- -`) - fmt.Println(t.Suite.PackageName, "timed out. path:", t.Suite.Path) - os.Stdout.Sync() - - for _, writer := range writers { - writer.Close() - } - - for _, report := range reports { - fmt.Print(report.String()) - } - - os.Stdout.Sync() - } - - if *t.goOpts["cover"].(*bool) || *t.goOpts["coverpkg"].(*string) != "" || *t.goOpts["covermode"].(*string) != "" { - t.combineCoverprofiles() - } - - return res -} - -func (t *TestRunner) cmd(ginkgoArgs []string, stream io.Writer, node int) *exec.Cmd { - args := []string{"--test.timeout=" + t.timeout.String()} - if *t.goOpts["cover"].(*bool) || *t.goOpts["coverpkg"].(*string) != "" || *t.goOpts["covermode"].(*string) != "" { - coverprofile := "--test.coverprofile=" + t.Suite.PackageName + ".coverprofile" - if t.numCPU > 1 { - coverprofile = fmt.Sprintf("%s.%d", coverprofile, node) - } - args = append(args, coverprofile) - } - - args = append(args, ginkgoArgs...) - args = append(args, t.additionalArgs...) - - path := t.compilationTargetPath - if t.Suite.Precompiled { - path, _ = filepath.Abs(filepath.Join(t.Suite.Path, fmt.Sprintf("%s.test", t.Suite.PackageName))) - } - - cmd := exec.Command(path, args...) - - cmd.Dir = t.Suite.Path - cmd.Stderr = io.MultiWriter(stream, t.stderr) - cmd.Stdout = stream - - return cmd -} - -func (t *TestRunner) run(cmd *exec.Cmd, completions chan RunResult) RunResult { - var res RunResult - - defer func() { - if completions != nil { - completions <- res - } - }() - - err := cmd.Start() - if err != nil { - fmt.Printf("Failed to run test suite!\n\t%s", err.Error()) - return res - } - - cmd.Wait() - - exitStatus := cmd.ProcessState.Sys().(syscall.WaitStatus).ExitStatus() - res.Passed = (exitStatus == 0) || (exitStatus == types.GINKGO_FOCUS_EXIT_CODE) - res.HasProgrammaticFocus = (exitStatus == types.GINKGO_FOCUS_EXIT_CODE) - - if strings.Contains(t.stderr.String(), "warning: no tests to run") { - if *t.goOpts["requireSuite"].(*bool) { - res.Passed = false - } - fmt.Fprintf(os.Stderr, `Found no test suites, did you forget to run "ginkgo bootstrap"?`) - } - - return res -} - -func (t *TestRunner) combineCoverprofiles() { - profiles := []string{} - for cpu := 1; cpu <= t.numCPU; cpu++ { - coverFile := fmt.Sprintf("%s.coverprofile.%d", t.Suite.PackageName, cpu) - coverFile = filepath.Join(t.Suite.Path, coverFile) - coverProfile, err := ioutil.ReadFile(coverFile) - os.Remove(coverFile) - - if err == nil { - profiles = append(profiles, string(coverProfile)) - } - } - - if len(profiles) != t.numCPU { - return - } - - lines := map[string]int{} - lineOrder := []string{} - for i, coverProfile := range profiles { - for _, line := range strings.Split(string(coverProfile), "\n")[1:] { - if len(line) == 0 { - continue - } - components := strings.Split(line, " ") - count, _ := strconv.Atoi(components[len(components)-1]) - prefix := strings.Join(components[0:len(components)-1], " ") - lines[prefix] += count - if i == 0 { - lineOrder = append(lineOrder, prefix) - } - } - } - - output := []string{"mode: atomic"} - for _, line := range lineOrder { - output = append(output, fmt.Sprintf("%s %d", line, lines[line])) - } - finalOutput := strings.Join(output, "\n") - ioutil.WriteFile(filepath.Join(t.Suite.Path, fmt.Sprintf("%s.coverprofile", t.Suite.PackageName)), []byte(finalOutput), 0666) -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner_test.go b/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner_test.go deleted file mode 100644 index b6f556770..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testrunner/test_runner_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package testrunner_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/ginkgo/testrunner" - "github.com/onsi/ginkgo/ginkgo/testsuite" - . "github.com/onsi/gomega" -) - -func strAddr(s string) interface{} { - return &s -} - -func boolAddr(s bool) interface{} { - return &s -} - -func intAddr(s int) interface{} { - return &s -} - -var _ = Describe("TestRunner", func() { - It("should pass through go opts", func() { - //var opts map[string]interface{} - opts := map[string]interface{}{ - "asmflags": strAddr("a"), - "pkgdir": strAddr("b"), - "gcflags": strAddr("c"), - "covermode": strAddr(""), - "coverpkg": strAddr(""), - "cover": boolAddr(false), - "blockprofilerate": intAddr(100), - } - tr := testrunner.New(testsuite.TestSuite{}, 1, false, 0, opts, []string{}) - - args := tr.BuildArgs(".") - Ω(args).Should(Equal([]string{ - "test", - "-c", - "-i", - "-o", - ".", - "", - "-blockprofilerate=100", - "-asmflags=a", - "-pkgdir=b", - "-gcflags=c", - })) - }) -}) - -func TestTestRunner(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Test Runner Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/test_suite.go b/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/test_suite.go deleted file mode 100644 index 09b16015a..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/test_suite.go +++ /dev/null @@ -1,115 +0,0 @@ -package testsuite - -import ( - "errors" - "io/ioutil" - "os" - "path/filepath" - "regexp" - "strings" -) - -type TestSuite struct { - Path string - PackageName string - IsGinkgo bool - Precompiled bool -} - -func PrecompiledTestSuite(path string) (TestSuite, error) { - info, err := os.Stat(path) - if err != nil { - return TestSuite{}, err - } - - if info.IsDir() { - return TestSuite{}, errors.New("this is a directory, not a file") - } - - if filepath.Ext(path) != ".test" { - return TestSuite{}, errors.New("this is not a .test binary") - } - - if info.Mode()&0111 == 0 { - return TestSuite{}, errors.New("this is not executable") - } - - dir := relPath(filepath.Dir(path)) - packageName := strings.TrimSuffix(filepath.Base(path), filepath.Ext(path)) - - return TestSuite{ - Path: dir, - PackageName: packageName, - IsGinkgo: true, - Precompiled: true, - }, nil -} - -func SuitesInDir(dir string, recurse bool) []TestSuite { - suites := []TestSuite{} - - if vendorExperimentCheck(dir) { - return suites - } - - files, _ := ioutil.ReadDir(dir) - re := regexp.MustCompile(`_test\.go$`) - for _, file := range files { - if !file.IsDir() && re.Match([]byte(file.Name())) { - suites = append(suites, New(dir, files)) - break - } - } - - if recurse { - re = regexp.MustCompile(`^[._]`) - for _, file := range files { - if file.IsDir() && !re.Match([]byte(file.Name())) { - suites = append(suites, SuitesInDir(dir+"/"+file.Name(), recurse)...) - } - } - } - - return suites -} - -func relPath(dir string) string { - dir, _ = filepath.Abs(dir) - cwd, _ := os.Getwd() - dir, _ = filepath.Rel(cwd, filepath.Clean(dir)) - - if string(dir[0]) != "." { - dir = "." + string(filepath.Separator) + dir - } - - return dir -} - -func New(dir string, files []os.FileInfo) TestSuite { - return TestSuite{ - Path: relPath(dir), - PackageName: packageNameForSuite(dir), - IsGinkgo: filesHaveGinkgoSuite(dir, files), - } -} - -func packageNameForSuite(dir string) string { - path, _ := filepath.Abs(dir) - return filepath.Base(path) -} - -func filesHaveGinkgoSuite(dir string, files []os.FileInfo) bool { - reTestFile := regexp.MustCompile(`_test\.go$`) - reGinkgo := regexp.MustCompile(`package ginkgo|\/ginkgo"`) - - for _, file := range files { - if !file.IsDir() && reTestFile.Match([]byte(file.Name())) { - contents, _ := ioutil.ReadFile(dir + "/" + file.Name()) - if reGinkgo.Match(contents) { - return true - } - } - } - - return false -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/testsuite_suite_test.go b/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/testsuite_suite_test.go deleted file mode 100644 index d1e8b21d3..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/testsuite_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package testsuite_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestTestsuite(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Testsuite Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/testsuite_test.go b/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/testsuite_test.go deleted file mode 100644 index 7f89f18a8..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/testsuite_test.go +++ /dev/null @@ -1,201 +0,0 @@ -// +build go1.6 - -package testsuite_test - -import ( - "io/ioutil" - "os" - "path/filepath" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/ginkgo/testsuite" - . "github.com/onsi/gomega" -) - -var _ = Describe("TestSuite", func() { - var tmpDir string - var relTmpDir string - - writeFile := func(folder string, filename string, content string, mode os.FileMode) { - path := filepath.Join(tmpDir, folder) - err := os.MkdirAll(path, 0700) - Ω(err).ShouldNot(HaveOccurred()) - - path = filepath.Join(path, filename) - ioutil.WriteFile(path, []byte(content), mode) - } - - var origVendor string - - BeforeSuite(func() { - origVendor = os.Getenv("GO15VENDOREXPERIMENT") - }) - - AfterSuite(func() { - os.Setenv("GO15VENDOREXPERIMENT", origVendor) - }) - - BeforeEach(func() { - var err error - tmpDir, err = ioutil.TempDir("/tmp", "ginkgo") - Ω(err).ShouldNot(HaveOccurred()) - - cwd, err := os.Getwd() - Ω(err).ShouldNot(HaveOccurred()) - relTmpDir, err = filepath.Rel(cwd, tmpDir) - Ω(err).ShouldNot(HaveOccurred()) - - //go files in the root directory (no tests) - writeFile("/", "main.go", "package main", 0666) - - //non-go files in a nested directory - writeFile("/redherring", "big_test.jpg", "package ginkgo", 0666) - - //non-ginkgo tests in a nested directory - writeFile("/professorplum", "professorplum_test.go", `import "testing"`, 0666) - - //ginkgo tests in a nested directory - writeFile("/colonelmustard", "colonelmustard_test.go", `import "github.com/onsi/ginkgo"`, 0666) - - //ginkgo tests in a deeply nested directory - writeFile("/colonelmustard/library", "library_test.go", `import "github.com/onsi/ginkgo"`, 0666) - - //ginkgo tests deeply nested in a vendored dependency - writeFile("/vendor/mrspeacock/lounge", "lounge_test.go", `import "github.com/onsi/ginkgo"`, 0666) - - //a precompiled ginkgo test - writeFile("/precompiled-dir", "precompiled.test", `fake-binary-file`, 0777) - writeFile("/precompiled-dir", "some-other-binary", `fake-binary-file`, 0777) - writeFile("/precompiled-dir", "nonexecutable.test", `fake-binary-file`, 0666) - }) - - AfterEach(func() { - os.RemoveAll(tmpDir) - }) - - Describe("Finding precompiled test suites", func() { - Context("if pointed at an executable file that ends with .test", func() { - It("should return a precompiled test suite", func() { - suite, err := PrecompiledTestSuite(filepath.Join(tmpDir, "precompiled-dir", "precompiled.test")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(suite).Should(Equal(TestSuite{ - Path: relTmpDir + "/precompiled-dir", - PackageName: "precompiled", - IsGinkgo: true, - Precompiled: true, - })) - }) - }) - - Context("if pointed at a directory", func() { - It("should error", func() { - suite, err := PrecompiledTestSuite(filepath.Join(tmpDir, "precompiled-dir")) - Ω(suite).Should(BeZero()) - Ω(err).Should(HaveOccurred()) - }) - }) - - Context("if pointed at an executable that doesn't have .test", func() { - It("should error", func() { - suite, err := PrecompiledTestSuite(filepath.Join(tmpDir, "precompiled-dir", "some-other-binary")) - Ω(suite).Should(BeZero()) - Ω(err).Should(HaveOccurred()) - }) - }) - - Context("if pointed at a .test that isn't executable", func() { - It("should error", func() { - suite, err := PrecompiledTestSuite(filepath.Join(tmpDir, "precompiled-dir", "nonexecutable.test")) - Ω(suite).Should(BeZero()) - Ω(err).Should(HaveOccurred()) - }) - }) - - Context("if pointed at a nonexisting file", func() { - It("should error", func() { - suite, err := PrecompiledTestSuite(filepath.Join(tmpDir, "precompiled-dir", "nope-nothing-to-see-here")) - Ω(suite).Should(BeZero()) - Ω(err).Should(HaveOccurred()) - }) - }) - }) - - Describe("scanning for suites in a directory", func() { - Context("when there are no tests in the specified directory", func() { - It("should come up empty", func() { - suites := SuitesInDir(tmpDir, false) - Ω(suites).Should(BeEmpty()) - }) - }) - - Context("when there are ginkgo tests in the specified directory", func() { - It("should return an appropriately configured suite", func() { - suites := SuitesInDir(filepath.Join(tmpDir, "colonelmustard"), false) - Ω(suites).Should(HaveLen(1)) - - Ω(suites[0].Path).Should(Equal(relTmpDir + "/colonelmustard")) - Ω(suites[0].PackageName).Should(Equal("colonelmustard")) - Ω(suites[0].IsGinkgo).Should(BeTrue()) - Ω(suites[0].Precompiled).Should(BeFalse()) - }) - }) - - Context("when there are non-ginkgo tests in the specified directory", func() { - It("should return an appropriately configured suite", func() { - suites := SuitesInDir(filepath.Join(tmpDir, "professorplum"), false) - Ω(suites).Should(HaveLen(1)) - - Ω(suites[0].Path).Should(Equal(relTmpDir + "/professorplum")) - Ω(suites[0].PackageName).Should(Equal("professorplum")) - Ω(suites[0].IsGinkgo).Should(BeFalse()) - Ω(suites[0].Precompiled).Should(BeFalse()) - }) - }) - - Context("given GO15VENDOREXPERIMENT disabled", func() { - BeforeEach(func() { - os.Setenv("GO15VENDOREXPERIMENT", "0") - }) - - AfterEach(func() { - os.Setenv("GO15VENDOREXPERIMENT", "") - }) - - It("should not skip vendor dirs", func() { - suites := SuitesInDir(filepath.Join(tmpDir+"/vendor"), true) - Ω(suites).Should(HaveLen(1)) - }) - - It("should recurse into vendor dirs", func() { - suites := SuitesInDir(filepath.Join(tmpDir), true) - Ω(suites).Should(HaveLen(4)) - }) - }) - - Context("when recursively scanning", func() { - It("should return suites for corresponding test suites, only", func() { - suites := SuitesInDir(tmpDir, true) - Ω(suites).Should(HaveLen(3)) - - Ω(suites).Should(ContainElement(TestSuite{ - Path: relTmpDir + "/colonelmustard", - PackageName: "colonelmustard", - IsGinkgo: true, - Precompiled: false, - })) - Ω(suites).Should(ContainElement(TestSuite{ - Path: relTmpDir + "/professorplum", - PackageName: "professorplum", - IsGinkgo: false, - Precompiled: false, - })) - Ω(suites).Should(ContainElement(TestSuite{ - Path: relTmpDir + "/colonelmustard/library", - PackageName: "library", - IsGinkgo: true, - Precompiled: false, - })) - }) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go15.go b/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go15.go deleted file mode 100644 index 75f827a12..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go15.go +++ /dev/null @@ -1,16 +0,0 @@ -// +build !go1.6 - -package testsuite - -import ( - "os" - "path" -) - -// "This change will only be enabled if the go command is run with -// GO15VENDOREXPERIMENT=1 in its environment." -// c.f. the vendor-experiment proposal https://goo.gl/2ucMeC -func vendorExperimentCheck(dir string) bool { - vendorExperiment := os.Getenv("GO15VENDOREXPERIMENT") - return vendorExperiment == "1" && path.Base(dir) == "vendor" -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go15_test.go b/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go15_test.go deleted file mode 100644 index dc3ca2a94..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go15_test.go +++ /dev/null @@ -1,201 +0,0 @@ -// +build !go1.6 - -package testsuite_test - -import ( - "io/ioutil" - "os" - "path/filepath" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/ginkgo/testsuite" - . "github.com/onsi/gomega" -) - -var _ = Describe("TestSuite", func() { - var tmpDir string - var relTmpDir string - - writeFile := func(folder string, filename string, content string, mode os.FileMode) { - path := filepath.Join(tmpDir, folder) - err := os.MkdirAll(path, 0700) - Ω(err).ShouldNot(HaveOccurred()) - - path = filepath.Join(path, filename) - ioutil.WriteFile(path, []byte(content), mode) - } - - var origVendor string - - BeforeSuite(func() { - origVendor = os.Getenv("GO15VENDOREXPERIMENT") - }) - - AfterSuite(func() { - os.Setenv("GO15VENDOREXPERIMENT", origVendor) - }) - - BeforeEach(func() { - var err error - tmpDir, err = ioutil.TempDir("/tmp", "ginkgo") - Ω(err).ShouldNot(HaveOccurred()) - - cwd, err := os.Getwd() - Ω(err).ShouldNot(HaveOccurred()) - relTmpDir, err = filepath.Rel(cwd, tmpDir) - Ω(err).ShouldNot(HaveOccurred()) - - //go files in the root directory (no tests) - writeFile("/", "main.go", "package main", 0666) - - //non-go files in a nested directory - writeFile("/redherring", "big_test.jpg", "package ginkgo", 0666) - - //non-ginkgo tests in a nested directory - writeFile("/professorplum", "professorplum_test.go", `import "testing"`, 0666) - - //ginkgo tests in a nested directory - writeFile("/colonelmustard", "colonelmustard_test.go", `import "github.com/onsi/ginkgo"`, 0666) - - //ginkgo tests in a deeply nested directory - writeFile("/colonelmustard/library", "library_test.go", `import "github.com/onsi/ginkgo"`, 0666) - - //ginkgo tests deeply nested in a vendored dependency - writeFile("/vendor/mrspeacock/lounge", "lounge_test.go", `import "github.com/onsi/ginkgo"`, 0666) - - //a precompiled ginkgo test - writeFile("/precompiled-dir", "precompiled.test", `fake-binary-file`, 0777) - writeFile("/precompiled-dir", "some-other-binary", `fake-binary-file`, 0777) - writeFile("/precompiled-dir", "nonexecutable.test", `fake-binary-file`, 0666) - }) - - AfterEach(func() { - os.RemoveAll(tmpDir) - }) - - Describe("Finding precompiled test suites", func() { - Context("if pointed at an executable file that ends with .test", func() { - It("should return a precompiled test suite", func() { - suite, err := PrecompiledTestSuite(filepath.Join(tmpDir, "precompiled-dir", "precompiled.test")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(suite).Should(Equal(TestSuite{ - Path: relTmpDir + "/precompiled-dir", - PackageName: "precompiled", - IsGinkgo: true, - Precompiled: true, - })) - }) - }) - - Context("if pointed at a directory", func() { - It("should error", func() { - suite, err := PrecompiledTestSuite(filepath.Join(tmpDir, "precompiled-dir")) - Ω(suite).Should(BeZero()) - Ω(err).Should(HaveOccurred()) - }) - }) - - Context("if pointed at an executable that doesn't have .test", func() { - It("should error", func() { - suite, err := PrecompiledTestSuite(filepath.Join(tmpDir, "precompiled-dir", "some-other-binary")) - Ω(suite).Should(BeZero()) - Ω(err).Should(HaveOccurred()) - }) - }) - - Context("if pointed at a .test that isn't executable", func() { - It("should error", func() { - suite, err := PrecompiledTestSuite(filepath.Join(tmpDir, "precompiled-dir", "nonexecutable.test")) - Ω(suite).Should(BeZero()) - Ω(err).Should(HaveOccurred()) - }) - }) - - Context("if pointed at a nonexisting file", func() { - It("should error", func() { - suite, err := PrecompiledTestSuite(filepath.Join(tmpDir, "precompiled-dir", "nope-nothing-to-see-here")) - Ω(suite).Should(BeZero()) - Ω(err).Should(HaveOccurred()) - }) - }) - }) - - Describe("scanning for suites in a directory", func() { - Context("when there are no tests in the specified directory", func() { - It("should come up empty", func() { - suites := SuitesInDir(tmpDir, false) - Ω(suites).Should(BeEmpty()) - }) - }) - - Context("when there are ginkgo tests in the specified directory", func() { - It("should return an appropriately configured suite", func() { - suites := SuitesInDir(filepath.Join(tmpDir, "colonelmustard"), false) - Ω(suites).Should(HaveLen(1)) - - Ω(suites[0].Path).Should(Equal(relTmpDir + "/colonelmustard")) - Ω(suites[0].PackageName).Should(Equal("colonelmustard")) - Ω(suites[0].IsGinkgo).Should(BeTrue()) - Ω(suites[0].Precompiled).Should(BeFalse()) - }) - }) - - Context("when there are non-ginkgo tests in the specified directory", func() { - It("should return an appropriately configured suite", func() { - suites := SuitesInDir(filepath.Join(tmpDir, "professorplum"), false) - Ω(suites).Should(HaveLen(1)) - - Ω(suites[0].Path).Should(Equal(relTmpDir + "/professorplum")) - Ω(suites[0].PackageName).Should(Equal("professorplum")) - Ω(suites[0].IsGinkgo).Should(BeFalse()) - Ω(suites[0].Precompiled).Should(BeFalse()) - }) - }) - - Context("given GO15VENDOREXPERIMENT", func() { - BeforeEach(func() { - os.Setenv("GO15VENDOREXPERIMENT", "1") - }) - - AfterEach(func() { - os.Setenv("GO15VENDOREXPERIMENT", "") - }) - - It("should skip vendor dirs", func() { - suites := SuitesInDir(filepath.Join(tmpDir+"/vendor"), false) - Ω(suites).Should(HaveLen(0)) - }) - - It("should not recurse into vendor dirs", func() { - suites := SuitesInDir(filepath.Join(tmpDir), true) - Ω(suites).Should(HaveLen(3)) - }) - }) - - Context("when recursively scanning", func() { - It("should return suites for corresponding test suites, only", func() { - suites := SuitesInDir(tmpDir, true) - Ω(suites).Should(HaveLen(4)) - - Ω(suites).Should(ContainElement(TestSuite{ - Path: relTmpDir + "/colonelmustard", - PackageName: "colonelmustard", - IsGinkgo: true, - Precompiled: false, - })) - Ω(suites).Should(ContainElement(TestSuite{ - Path: relTmpDir + "/professorplum", - PackageName: "professorplum", - IsGinkgo: false, - Precompiled: false, - })) - Ω(suites).Should(ContainElement(TestSuite{ - Path: relTmpDir + "/colonelmustard/library", - PackageName: "library", - IsGinkgo: true, - Precompiled: false, - })) - }) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go16.go b/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go16.go deleted file mode 100644 index 596e5e5c1..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/testsuite/vendor_check_go16.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build go1.6 - -package testsuite - -import ( - "os" - "path" -) - -// in 1.6 the vendor directory became the default go behaviour, so now -// check if its disabled. -func vendorExperimentCheck(dir string) bool { - vendorExperiment := os.Getenv("GO15VENDOREXPERIMENT") - return vendorExperiment != "0" && path.Base(dir) == "vendor" -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/unfocus_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/unfocus_command.go deleted file mode 100644 index 683c3a998..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/unfocus_command.go +++ /dev/null @@ -1,38 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os/exec" -) - -func BuildUnfocusCommand() *Command { - return &Command{ - Name: "unfocus", - AltName: "blur", - FlagSet: flag.NewFlagSet("unfocus", flag.ExitOnError), - UsageCommand: "ginkgo unfocus (or ginkgo blur)", - Usage: []string{ - "Recursively unfocuses any focused tests under the current directory", - }, - Command: unfocusSpecs, - } -} - -func unfocusSpecs([]string, []string) { - unfocus("Describe") - unfocus("Context") - unfocus("It") - unfocus("Measure") - unfocus("DescribeTable") - unfocus("Entry") -} - -func unfocus(component string) { - fmt.Printf("Removing F%s...\n", component) - cmd := exec.Command("gofmt", fmt.Sprintf("-r=F%s -> %s", component, component), "-w", ".") - out, _ := cmd.CombinedOutput() - if string(out) != "" { - println(string(out)) - } -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/version_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/version_command.go deleted file mode 100644 index cdca3a348..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/version_command.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "github.com/onsi/ginkgo/config" -) - -func BuildVersionCommand() *Command { - return &Command{ - Name: "version", - FlagSet: flag.NewFlagSet("version", flag.ExitOnError), - UsageCommand: "ginkgo version", - Usage: []string{ - "Print Ginkgo's version", - }, - Command: printVersion, - } -} - -func printVersion([]string, []string) { - fmt.Printf("Ginkgo Version %s\n", config.VERSION) -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/watch/delta.go b/vendor/github.com/onsi/ginkgo/ginkgo/watch/delta.go deleted file mode 100644 index 6c485c5b1..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/watch/delta.go +++ /dev/null @@ -1,22 +0,0 @@ -package watch - -import "sort" - -type Delta struct { - ModifiedPackages []string - - NewSuites []*Suite - RemovedSuites []*Suite - modifiedSuites []*Suite -} - -type DescendingByDelta []*Suite - -func (a DescendingByDelta) Len() int { return len(a) } -func (a DescendingByDelta) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a DescendingByDelta) Less(i, j int) bool { return a[i].Delta() > a[j].Delta() } - -func (d Delta) ModifiedSuites() []*Suite { - sort.Sort(DescendingByDelta(d.modifiedSuites)) - return d.modifiedSuites -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/watch/delta_tracker.go b/vendor/github.com/onsi/ginkgo/ginkgo/watch/delta_tracker.go deleted file mode 100644 index a628303d7..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/watch/delta_tracker.go +++ /dev/null @@ -1,75 +0,0 @@ -package watch - -import ( - "fmt" - - "regexp" - - "github.com/onsi/ginkgo/ginkgo/testsuite" -) - -type SuiteErrors map[testsuite.TestSuite]error - -type DeltaTracker struct { - maxDepth int - watchRegExp *regexp.Regexp - suites map[string]*Suite - packageHashes *PackageHashes -} - -func NewDeltaTracker(maxDepth int, watchRegExp *regexp.Regexp) *DeltaTracker { - return &DeltaTracker{ - maxDepth: maxDepth, - watchRegExp: watchRegExp, - packageHashes: NewPackageHashes(watchRegExp), - suites: map[string]*Suite{}, - } -} - -func (d *DeltaTracker) Delta(suites []testsuite.TestSuite) (delta Delta, errors SuiteErrors) { - errors = SuiteErrors{} - delta.ModifiedPackages = d.packageHashes.CheckForChanges() - - providedSuitePaths := map[string]bool{} - for _, suite := range suites { - providedSuitePaths[suite.Path] = true - } - - d.packageHashes.StartTrackingUsage() - - for _, suite := range d.suites { - if providedSuitePaths[suite.Suite.Path] { - if suite.Delta() > 0 { - delta.modifiedSuites = append(delta.modifiedSuites, suite) - } - } else { - delta.RemovedSuites = append(delta.RemovedSuites, suite) - } - } - - d.packageHashes.StopTrackingUsageAndPrune() - - for _, suite := range suites { - _, ok := d.suites[suite.Path] - if !ok { - s, err := NewSuite(suite, d.maxDepth, d.packageHashes) - if err != nil { - errors[suite] = err - continue - } - d.suites[suite.Path] = s - delta.NewSuites = append(delta.NewSuites, s) - } - } - - return delta, errors -} - -func (d *DeltaTracker) WillRun(suite testsuite.TestSuite) error { - s, ok := d.suites[suite.Path] - if !ok { - return fmt.Errorf("unknown suite %s", suite.Path) - } - - return s.MarkAsRunAndRecomputedDependencies(d.maxDepth) -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/watch/dependencies.go b/vendor/github.com/onsi/ginkgo/ginkgo/watch/dependencies.go deleted file mode 100644 index 82c25face..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/watch/dependencies.go +++ /dev/null @@ -1,91 +0,0 @@ -package watch - -import ( - "go/build" - "regexp" -) - -var ginkgoAndGomegaFilter = regexp.MustCompile(`github\.com/onsi/ginkgo|github\.com/onsi/gomega`) - -type Dependencies struct { - deps map[string]int -} - -func NewDependencies(path string, maxDepth int) (Dependencies, error) { - d := Dependencies{ - deps: map[string]int{}, - } - - if maxDepth == 0 { - return d, nil - } - - err := d.seedWithDepsForPackageAtPath(path) - if err != nil { - return d, err - } - - for depth := 1; depth < maxDepth; depth++ { - n := len(d.deps) - d.addDepsForDepth(depth) - if n == len(d.deps) { - break - } - } - - return d, nil -} - -func (d Dependencies) Dependencies() map[string]int { - return d.deps -} - -func (d Dependencies) seedWithDepsForPackageAtPath(path string) error { - pkg, err := build.ImportDir(path, 0) - if err != nil { - return err - } - - d.resolveAndAdd(pkg.Imports, 1) - d.resolveAndAdd(pkg.TestImports, 1) - d.resolveAndAdd(pkg.XTestImports, 1) - - delete(d.deps, pkg.Dir) - return nil -} - -func (d Dependencies) addDepsForDepth(depth int) { - for dep, depDepth := range d.deps { - if depDepth == depth { - d.addDepsForDep(dep, depth+1) - } - } -} - -func (d Dependencies) addDepsForDep(dep string, depth int) { - pkg, err := build.ImportDir(dep, 0) - if err != nil { - println(err.Error()) - return - } - d.resolveAndAdd(pkg.Imports, depth) -} - -func (d Dependencies) resolveAndAdd(deps []string, depth int) { - for _, dep := range deps { - pkg, err := build.Import(dep, ".", 0) - if err != nil { - continue - } - if pkg.Goroot == false && !ginkgoAndGomegaFilter.Match([]byte(pkg.Dir)) { - d.addDepIfNotPresent(pkg.Dir, depth) - } - } -} - -func (d Dependencies) addDepIfNotPresent(dep string, depth int) { - _, ok := d.deps[dep] - if !ok { - d.deps[dep] = depth - } -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/watch/package_hash.go b/vendor/github.com/onsi/ginkgo/ginkgo/watch/package_hash.go deleted file mode 100644 index 7e1e4192d..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/watch/package_hash.go +++ /dev/null @@ -1,104 +0,0 @@ -package watch - -import ( - "fmt" - "io/ioutil" - "os" - "regexp" - "time" -) - -var goTestRegExp = regexp.MustCompile(`_test\.go$`) - -type PackageHash struct { - CodeModifiedTime time.Time - TestModifiedTime time.Time - Deleted bool - - path string - codeHash string - testHash string - watchRegExp *regexp.Regexp -} - -func NewPackageHash(path string, watchRegExp *regexp.Regexp) *PackageHash { - p := &PackageHash{ - path: path, - watchRegExp: watchRegExp, - } - - p.codeHash, _, p.testHash, _, p.Deleted = p.computeHashes() - - return p -} - -func (p *PackageHash) CheckForChanges() bool { - codeHash, codeModifiedTime, testHash, testModifiedTime, deleted := p.computeHashes() - - if deleted { - if p.Deleted == false { - t := time.Now() - p.CodeModifiedTime = t - p.TestModifiedTime = t - } - p.Deleted = true - return true - } - - modified := false - p.Deleted = false - - if p.codeHash != codeHash { - p.CodeModifiedTime = codeModifiedTime - modified = true - } - if p.testHash != testHash { - p.TestModifiedTime = testModifiedTime - modified = true - } - - p.codeHash = codeHash - p.testHash = testHash - return modified -} - -func (p *PackageHash) computeHashes() (codeHash string, codeModifiedTime time.Time, testHash string, testModifiedTime time.Time, deleted bool) { - infos, err := ioutil.ReadDir(p.path) - - if err != nil { - deleted = true - return - } - - for _, info := range infos { - if info.IsDir() { - continue - } - - if goTestRegExp.Match([]byte(info.Name())) { - testHash += p.hashForFileInfo(info) - if info.ModTime().After(testModifiedTime) { - testModifiedTime = info.ModTime() - } - continue - } - - if p.watchRegExp.Match([]byte(info.Name())) { - codeHash += p.hashForFileInfo(info) - if info.ModTime().After(codeModifiedTime) { - codeModifiedTime = info.ModTime() - } - } - } - - testHash += codeHash - if codeModifiedTime.After(testModifiedTime) { - testModifiedTime = codeModifiedTime - } - - return -} - -func (p *PackageHash) hashForFileInfo(info os.FileInfo) string { - return fmt.Sprintf("%s_%d_%d", info.Name(), info.Size(), info.ModTime().UnixNano()) -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/watch/package_hashes.go b/vendor/github.com/onsi/ginkgo/ginkgo/watch/package_hashes.go deleted file mode 100644 index b4892bebf..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/watch/package_hashes.go +++ /dev/null @@ -1,85 +0,0 @@ -package watch - -import ( - "path/filepath" - "regexp" - "sync" -) - -type PackageHashes struct { - PackageHashes map[string]*PackageHash - usedPaths map[string]bool - watchRegExp *regexp.Regexp - lock *sync.Mutex -} - -func NewPackageHashes(watchRegExp *regexp.Regexp) *PackageHashes { - return &PackageHashes{ - PackageHashes: map[string]*PackageHash{}, - usedPaths: nil, - watchRegExp: watchRegExp, - lock: &sync.Mutex{}, - } -} - -func (p *PackageHashes) CheckForChanges() []string { - p.lock.Lock() - defer p.lock.Unlock() - - modified := []string{} - - for _, packageHash := range p.PackageHashes { - if packageHash.CheckForChanges() { - modified = append(modified, packageHash.path) - } - } - - return modified -} - -func (p *PackageHashes) Add(path string) *PackageHash { - p.lock.Lock() - defer p.lock.Unlock() - - path, _ = filepath.Abs(path) - _, ok := p.PackageHashes[path] - if !ok { - p.PackageHashes[path] = NewPackageHash(path, p.watchRegExp) - } - - if p.usedPaths != nil { - p.usedPaths[path] = true - } - return p.PackageHashes[path] -} - -func (p *PackageHashes) Get(path string) *PackageHash { - p.lock.Lock() - defer p.lock.Unlock() - - path, _ = filepath.Abs(path) - if p.usedPaths != nil { - p.usedPaths[path] = true - } - return p.PackageHashes[path] -} - -func (p *PackageHashes) StartTrackingUsage() { - p.lock.Lock() - defer p.lock.Unlock() - - p.usedPaths = map[string]bool{} -} - -func (p *PackageHashes) StopTrackingUsageAndPrune() { - p.lock.Lock() - defer p.lock.Unlock() - - for path := range p.PackageHashes { - if !p.usedPaths[path] { - delete(p.PackageHashes, path) - } - } - - p.usedPaths = nil -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/watch/suite.go b/vendor/github.com/onsi/ginkgo/ginkgo/watch/suite.go deleted file mode 100644 index 5deaba7cb..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/watch/suite.go +++ /dev/null @@ -1,87 +0,0 @@ -package watch - -import ( - "fmt" - "math" - "time" - - "github.com/onsi/ginkgo/ginkgo/testsuite" -) - -type Suite struct { - Suite testsuite.TestSuite - RunTime time.Time - Dependencies Dependencies - - sharedPackageHashes *PackageHashes -} - -func NewSuite(suite testsuite.TestSuite, maxDepth int, sharedPackageHashes *PackageHashes) (*Suite, error) { - deps, err := NewDependencies(suite.Path, maxDepth) - if err != nil { - return nil, err - } - - sharedPackageHashes.Add(suite.Path) - for dep := range deps.Dependencies() { - sharedPackageHashes.Add(dep) - } - - return &Suite{ - Suite: suite, - Dependencies: deps, - - sharedPackageHashes: sharedPackageHashes, - }, nil -} - -func (s *Suite) Delta() float64 { - delta := s.delta(s.Suite.Path, true, 0) * 1000 - for dep, depth := range s.Dependencies.Dependencies() { - delta += s.delta(dep, false, depth) - } - return delta -} - -func (s *Suite) MarkAsRunAndRecomputedDependencies(maxDepth int) error { - s.RunTime = time.Now() - - deps, err := NewDependencies(s.Suite.Path, maxDepth) - if err != nil { - return err - } - - s.sharedPackageHashes.Add(s.Suite.Path) - for dep := range deps.Dependencies() { - s.sharedPackageHashes.Add(dep) - } - - s.Dependencies = deps - - return nil -} - -func (s *Suite) Description() string { - numDeps := len(s.Dependencies.Dependencies()) - pluralizer := "ies" - if numDeps == 1 { - pluralizer = "y" - } - return fmt.Sprintf("%s [%d dependenc%s]", s.Suite.Path, numDeps, pluralizer) -} - -func (s *Suite) delta(packagePath string, includeTests bool, depth int) float64 { - return math.Max(float64(s.dt(packagePath, includeTests)), 0) / float64(depth+1) -} - -func (s *Suite) dt(packagePath string, includeTests bool) time.Duration { - packageHash := s.sharedPackageHashes.Get(packagePath) - var modifiedTime time.Time - if includeTests { - modifiedTime = packageHash.TestModifiedTime - } else { - modifiedTime = packageHash.CodeModifiedTime - } - - return modifiedTime.Sub(s.RunTime) -} diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/watch_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/watch_command.go deleted file mode 100644 index a6ef053c8..000000000 --- a/vendor/github.com/onsi/ginkgo/ginkgo/watch_command.go +++ /dev/null @@ -1,175 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "regexp" - "time" - - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/ginkgo/interrupthandler" - "github.com/onsi/ginkgo/ginkgo/testrunner" - "github.com/onsi/ginkgo/ginkgo/testsuite" - "github.com/onsi/ginkgo/ginkgo/watch" - colorable "github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable" -) - -func BuildWatchCommand() *Command { - commandFlags := NewWatchCommandFlags(flag.NewFlagSet("watch", flag.ExitOnError)) - interruptHandler := interrupthandler.NewInterruptHandler() - notifier := NewNotifier(commandFlags) - watcher := &SpecWatcher{ - commandFlags: commandFlags, - notifier: notifier, - interruptHandler: interruptHandler, - suiteRunner: NewSuiteRunner(notifier, interruptHandler), - } - - return &Command{ - Name: "watch", - FlagSet: commandFlags.FlagSet, - UsageCommand: "ginkgo watch -- ", - Usage: []string{ - "Watches the tests in the passed in and runs them when changes occur.", - "Any arguments after -- will be passed to the test.", - }, - Command: watcher.WatchSpecs, - SuppressFlagDocumentation: true, - FlagDocSubstitute: []string{ - "Accepts all the flags that the ginkgo command accepts except for --keepGoing and --untilItFails", - }, - } -} - -type SpecWatcher struct { - commandFlags *RunWatchAndBuildCommandFlags - notifier *Notifier - interruptHandler *interrupthandler.InterruptHandler - suiteRunner *SuiteRunner -} - -func (w *SpecWatcher) WatchSpecs(args []string, additionalArgs []string) { - w.commandFlags.computeNodes() - w.notifier.VerifyNotificationsAreAvailable() - - w.WatchSuites(args, additionalArgs) -} - -func (w *SpecWatcher) runnersForSuites(suites []testsuite.TestSuite, additionalArgs []string) []*testrunner.TestRunner { - runners := []*testrunner.TestRunner{} - - for _, suite := range suites { - runners = append(runners, testrunner.New(suite, w.commandFlags.NumCPU, w.commandFlags.ParallelStream, w.commandFlags.Timeout, w.commandFlags.GoOpts, additionalArgs)) - } - - return runners -} - -func (w *SpecWatcher) WatchSuites(args []string, additionalArgs []string) { - suites, _ := findSuites(args, w.commandFlags.Recurse, w.commandFlags.SkipPackage, false) - - if len(suites) == 0 { - complainAndQuit("Found no test suites") - } - - fmt.Printf("Identified %d test %s. Locating dependencies to a depth of %d (this may take a while)...\n", len(suites), pluralizedWord("suite", "suites", len(suites)), w.commandFlags.Depth) - deltaTracker := watch.NewDeltaTracker(w.commandFlags.Depth, regexp.MustCompile(w.commandFlags.WatchRegExp)) - delta, errors := deltaTracker.Delta(suites) - - fmt.Printf("Watching %d %s:\n", len(delta.NewSuites), pluralizedWord("suite", "suites", len(delta.NewSuites))) - for _, suite := range delta.NewSuites { - fmt.Println(" " + suite.Description()) - } - - for suite, err := range errors { - fmt.Printf("Failed to watch %s: %s\n", suite.PackageName, err) - } - - if len(suites) == 1 { - runners := w.runnersForSuites(suites, additionalArgs) - w.suiteRunner.RunSuites(runners, w.commandFlags.NumCompilers, true, nil) - runners[0].CleanUp() - } - - ticker := time.NewTicker(time.Second) - - for { - select { - case <-ticker.C: - suites, _ := findSuites(args, w.commandFlags.Recurse, w.commandFlags.SkipPackage, false) - delta, _ := deltaTracker.Delta(suites) - coloredStream := colorable.NewColorableStdout() - - suitesToRun := []testsuite.TestSuite{} - - if len(delta.NewSuites) > 0 { - fmt.Fprintf(coloredStream, greenColor+"Detected %d new %s:\n"+defaultStyle, len(delta.NewSuites), pluralizedWord("suite", "suites", len(delta.NewSuites))) - for _, suite := range delta.NewSuites { - suitesToRun = append(suitesToRun, suite.Suite) - fmt.Fprintln(coloredStream, " "+suite.Description()) - } - } - - modifiedSuites := delta.ModifiedSuites() - if len(modifiedSuites) > 0 { - fmt.Fprintln(coloredStream, greenColor+"\nDetected changes in:"+defaultStyle) - for _, pkg := range delta.ModifiedPackages { - fmt.Fprintln(coloredStream, " "+pkg) - } - fmt.Fprintf(coloredStream, greenColor+"Will run %d %s:\n"+defaultStyle, len(modifiedSuites), pluralizedWord("suite", "suites", len(modifiedSuites))) - for _, suite := range modifiedSuites { - suitesToRun = append(suitesToRun, suite.Suite) - fmt.Fprintln(coloredStream, " "+suite.Description()) - } - fmt.Fprintln(coloredStream, "") - } - - if len(suitesToRun) > 0 { - w.UpdateSeed() - w.ComputeSuccinctMode(len(suitesToRun)) - runners := w.runnersForSuites(suitesToRun, additionalArgs) - result, _ := w.suiteRunner.RunSuites(runners, w.commandFlags.NumCompilers, true, func(suite testsuite.TestSuite) { - deltaTracker.WillRun(suite) - }) - for _, runner := range runners { - runner.CleanUp() - } - if !w.interruptHandler.WasInterrupted() { - color := redColor - if result.Passed { - color = greenColor - } - fmt.Fprintln(coloredStream, color+"\nDone. Resuming watch..."+defaultStyle) - } - } - - case <-w.interruptHandler.C: - return - } - } -} - -func (w *SpecWatcher) ComputeSuccinctMode(numSuites int) { - if config.DefaultReporterConfig.Verbose { - config.DefaultReporterConfig.Succinct = false - return - } - - if w.commandFlags.wasSet("succinct") { - return - } - - if numSuites == 1 { - config.DefaultReporterConfig.Succinct = false - } - - if numSuites > 1 { - config.DefaultReporterConfig.Succinct = true - } -} - -func (w *SpecWatcher) UpdateSeed() { - if !w.commandFlags.wasSet("seed") { - config.GinkgoConfig.RandomSeed = time.Now().Unix() - } -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/extra_functions_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/extra_functions_test.go deleted file mode 100644 index ccb3669a5..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/extra_functions_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package tmp - -import ( - "testing" -) - -func TestSomethingLessImportant(t *testing.T) { - strp := "hello!" - somethingImportant(t, &strp) -} - -func somethingImportant(t *testing.T, message *string) { - t.Log("Something important happened in a test: " + *message) -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/nested/nested_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/nested/nested_test.go deleted file mode 100644 index cde42e470..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/nested/nested_test.go +++ /dev/null @@ -1,10 +0,0 @@ -package nested - -import ( - "testing" -) - -func TestSomethingLessImportant(t *testing.T) { - whatever := &UselessStruct{} - t.Fail(whatever.ImportantField != "SECRET_PASSWORD") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/nested_without_gofiles/subpackage/nested_subpackage_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/nested_without_gofiles/subpackage/nested_subpackage_test.go deleted file mode 100644 index 7cdd326c5..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/nested_without_gofiles/subpackage/nested_subpackage_test.go +++ /dev/null @@ -1,9 +0,0 @@ -package subpackage - -import ( - "testing" -) - -func TestNestedSubPackages(t *testing.T) { - t.Fail(true) -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/outside_package_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/outside_package_test.go deleted file mode 100644 index a682eeaff..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/outside_package_test.go +++ /dev/null @@ -1,16 +0,0 @@ -package tmp_test - -import ( - "testing" -) - -type UselessStruct struct { - ImportantField string -} - -func TestSomethingImportant(t *testing.T) { - whatever := &UselessStruct{} - if whatever.ImportantField != "SECRET_PASSWORD" { - t.Fail() - } -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/xunit_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/xunit_test.go deleted file mode 100644 index 049829a7d..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_fixtures/xunit_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package tmp - -import ( - "testing" -) - -type UselessStruct struct { - ImportantField string - T *testing.T -} - -var testFunc = func(t *testing.T, arg *string) {} - -func assertEqual(t *testing.T, arg1, arg2 interface{}) { - if arg1 != arg2 { - t.Fail() - } -} - -func TestSomethingImportant(t *testing.T) { - whatever := &UselessStruct{ - T: t, - ImportantField: "SECRET_PASSWORD", - } - something := &UselessStruct{ImportantField: "string value"} - assertEqual(t, whatever.ImportantField, "SECRET_PASSWORD") - assertEqual(t, something.ImportantField, "string value") - - var foo = func(t *testing.T) {} - foo(t) - - strp := "something" - testFunc(t, &strp) - t.Fail() -} - -func Test3Things(t *testing.T) { - if 3 != 3 { - t.Fail() - } -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/extra_functions_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/extra_functions_test.go deleted file mode 100644 index 1c2c56cea..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/extra_functions_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package tmp - -import ( - . "github.com/onsi/ginkgo" -) - -var _ = Describe("Testing with Ginkgo", func() { - It("something less important", func() { - - strp := "hello!" - somethingImportant(GinkgoT(), &strp) - }) -}) - -func somethingImportant(t GinkgoTInterface, message *string) { - t.Log("Something important happened in a test: " + *message) -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/fixtures_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/fixtures_suite_test.go deleted file mode 100644 index a9a404b5c..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/fixtures_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package tmp - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestTmp(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Tmp Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_subpackage_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_subpackage_test.go deleted file mode 100644 index 3653eae82..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_subpackage_test.go +++ /dev/null @@ -1,11 +0,0 @@ -package subpackage - -import ( - . "github.com/onsi/ginkgo" -) - -var _ = Describe("Testing with Ginkgo", func() { - It("nested sub packages", func() { - GinkgoT().Fail(true) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_suite_test.go deleted file mode 100644 index d3d35e817..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package nested_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestNested(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Nested Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_test.go deleted file mode 100644 index 47364b814..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/nested_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package nested - -import ( - . "github.com/onsi/ginkgo" -) - -var _ = Describe("Testing with Ginkgo", func() { - It("something less important", func() { - - whatever := &UselessStruct{} - GinkgoT().Fail(whatever.ImportantField != "SECRET_PASSWORD") - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/outside_package_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/outside_package_test.go deleted file mode 100644 index 1f2e332c4..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/outside_package_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package tmp_test - -import ( - . "github.com/onsi/ginkgo" -) - -var _ = Describe("Testing with Ginkgo", func() { - It("something important", func() { - - whatever := &UselessStruct{} - if whatever.ImportantField != "SECRET_PASSWORD" { - GinkgoT().Fail() - } - }) -}) - -type UselessStruct struct { - ImportantField string -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/suite_test.go deleted file mode 100644 index fd69d3336..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package tmp_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestConvertFixtures(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "ConvertFixtures Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/xunit_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/xunit_test.go deleted file mode 100644 index dbe3b419d..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/convert_goldmasters/xunit_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package tmp - -import ( - . "github.com/onsi/ginkgo" -) - -var _ = Describe("Testing with Ginkgo", func() { - It("something important", func() { - - whatever := &UselessStruct{ - T: GinkgoT(), - ImportantField: "SECRET_PASSWORD", - } - something := &UselessStruct{ImportantField: "string value"} - assertEqual(GinkgoT(), whatever.ImportantField, "SECRET_PASSWORD") - assertEqual(GinkgoT(), something.ImportantField, "string value") - - var foo = func(t GinkgoTInterface) {} - foo(GinkgoT()) - - strp := "something" - testFunc(GinkgoT(), &strp) - GinkgoT().Fail() - }) - It("3 things", func() { - - if 3 != 3 { - GinkgoT().Fail() - } - }) -}) - -type UselessStruct struct { - ImportantField string - T GinkgoTInterface -} - -var testFunc = func(t GinkgoTInterface, arg *string) {} - -func assertEqual(t GinkgoTInterface, arg1, arg2 interface{}) { - if arg1 != arg2 { - t.Fail() - } -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage.go deleted file mode 100644 index 436e21d18..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage.go +++ /dev/null @@ -1,21 +0,0 @@ -package coverage_fixture - -func A() string { - return "A" -} - -func B() string { - return "B" -} - -func C() string { - return "C" -} - -func D() string { - return "D" -} - -func E() string { - return "untested" -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage_fixture_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage_fixture_suite_test.go deleted file mode 100644 index 2831bf7d2..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage_fixture_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package coverage_fixture_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestCoverageFixture(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "CoverageFixture Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage_fixture_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage_fixture_test.go deleted file mode 100644 index 12a72dce8..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/coverage_fixture_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package coverage_fixture_test - -import ( - . "github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture" - . "github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/external_coverage_fixture" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("CoverageFixture", func() { - It("should test A", func() { - Ω(A()).Should(Equal("A")) - }) - - It("should test B", func() { - Ω(B()).Should(Equal("B")) - }) - - It("should test C", func() { - Ω(C()).Should(Equal("C")) - }) - - It("should test D", func() { - Ω(D()).Should(Equal("D")) - }) - - It("should test external package", func() { - Ω(Tested()).Should(Equal("tested")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/external_coverage_fixture/external_coverage.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/external_coverage_fixture/external_coverage.go deleted file mode 100644 index 5280d4ddf..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/external_coverage_fixture/external_coverage.go +++ /dev/null @@ -1,9 +0,0 @@ -package external_coverage - -func Tested() string { - return "tested" -} - -func Untested() string { - return "untested" -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/does_not_compile/does_not_compile_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/does_not_compile/does_not_compile_suite_test.go deleted file mode 100644 index 01e792696..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/does_not_compile/does_not_compile_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package does_not_compile_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestDoes_not_compile(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Does_not_compile Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/does_not_compile/does_not_compile_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/does_not_compile/does_not_compile_test.go deleted file mode 100644 index e4f22b3cc..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/does_not_compile/does_not_compile_test.go +++ /dev/null @@ -1,11 +0,0 @@ -package does_not_compile_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/integration/_fixtures/does_not_compile" - . "github.com/onsi/gomega" -) - -var _ = Describe("DoesNotCompile", func() { - -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/eventually_failing/eventually_failing_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/eventually_failing/eventually_failing_suite_test.go deleted file mode 100644 index 97fa2e775..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/eventually_failing/eventually_failing_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package eventually_failing_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestEventuallyFailing(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "EventuallyFailing Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/eventually_failing/eventually_failing_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/eventually_failing/eventually_failing_test.go deleted file mode 100644 index 6c83b4258..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/eventually_failing/eventually_failing_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package eventually_failing_test - -import ( - "fmt" - "io/ioutil" - "strings" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("EventuallyFailing", func() { - It("should fail on the third try", func() { - time.Sleep(time.Second) - files, err := ioutil.ReadDir(".") - Ω(err).ShouldNot(HaveOccurred()) - - numRuns := 1 - for _, file := range files { - if strings.HasPrefix(file.Name(), "counter") { - numRuns++ - } - } - - Ω(numRuns).Should(BeNumerically("<", 3)) - ioutil.WriteFile(fmt.Sprintf("./counter-%d", numRuns), []byte("foo"), 0777) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/exiting_synchronized_setup_tests/exiting_synchronized_setup_tests_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/exiting_synchronized_setup_tests/exiting_synchronized_setup_tests_suite_test.go deleted file mode 100644 index 045ca7c66..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/exiting_synchronized_setup_tests/exiting_synchronized_setup_tests_suite_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package synchronized_setup_tests_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "fmt" - "os" - "testing" -) - -func TestSynchronized_setup_tests(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Synchronized_setup_tests Suite") -} - -var beforeData string - -var _ = SynchronizedBeforeSuite(func() []byte { - fmt.Printf("BEFORE_A_%d\n", GinkgoParallelNode()) - os.Exit(1) - return []byte("WHAT EVZ") -}, func(data []byte) { - println("NEVER SEE THIS") -}) - -var _ = Describe("Synchronized Setup", func() { - It("should do nothing", func() { - Ω(true).Should(BeTrue()) - }) - - It("should do nothing", func() { - Ω(true).Should(BeTrue()) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/fail_fixture/fail_fixture_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/fail_fixture/fail_fixture_suite_test.go deleted file mode 100644 index 6e822643a..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/fail_fixture/fail_fixture_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package fail_fixture_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestFail_fixture(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Fail_fixture Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/fail_fixture/fail_fixture_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/fail_fixture/fail_fixture_test.go deleted file mode 100644 index 801acf135..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/fail_fixture/fail_fixture_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package fail_fixture_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = It("handles top level failures", func() { - Ω("a top level failure on line 9").Should(Equal("nope")) - println("NEVER SEE THIS") -}) - -var _ = It("handles async top level failures", func(done Done) { - Fail("an async top level failure on line 14") - println("NEVER SEE THIS") -}, 0.1) - -var _ = It("FAIL in a goroutine", func(done Done) { - go func() { - defer GinkgoRecover() - Fail("a top level goroutine failure on line 21") - println("NEVER SEE THIS") - }() -}, 0.1) - -var _ = Describe("Excercising different failure modes", func() { - It("synchronous failures", func() { - Ω("a sync failure").Should(Equal("nope")) - println("NEVER SEE THIS") - }) - - It("synchronous panics", func() { - panic("a sync panic") - println("NEVER SEE THIS") - }) - - It("synchronous failures with FAIL", func() { - Fail("a sync FAIL failure") - println("NEVER SEE THIS") - }) - - It("async timeout", func(done Done) { - Ω(true).Should(BeTrue()) - }, 0.1) - - It("async failure", func(done Done) { - Ω("an async failure").Should(Equal("nope")) - println("NEVER SEE THIS") - }, 0.1) - - It("async panic", func(done Done) { - panic("an async panic") - println("NEVER SEE THIS") - }, 0.1) - - It("async failure with FAIL", func(done Done) { - Fail("an async FAIL failure") - println("NEVER SEE THIS") - }, 0.1) - - It("FAIL in a goroutine", func(done Done) { - go func() { - defer GinkgoRecover() - Fail("a goroutine FAIL failure") - println("NEVER SEE THIS") - }() - }, 0.1) - - It("Gomega in a goroutine", func(done Done) { - go func() { - defer GinkgoRecover() - Ω("a goroutine failure").Should(Equal("nope")) - println("NEVER SEE THIS") - }() - }, 0.1) - - It("Panic in a goroutine", func(done Done) { - go func() { - defer GinkgoRecover() - panic("a goroutine panic") - println("NEVER SEE THIS") - }() - }, 0.1) - - Measure("a FAIL measure", func(Benchmarker) { - Fail("a measure FAIL failure") - println("NEVER SEE THIS") - }, 1) - - Measure("a gomega failed measure", func(Benchmarker) { - Ω("a measure failure").Should(Equal("nope")) - println("NEVER SEE THIS") - }, 1) - - Measure("a panicking measure", func(Benchmarker) { - panic("a measure panic") - println("NEVER SEE THIS") - }, 1) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_after_suite/failing_after_suite_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_after_suite/failing_after_suite_suite_test.go deleted file mode 100644 index 0e410aaea..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_after_suite/failing_after_suite_suite_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package failing_before_suite_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestFailingAfterSuite(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "FailingAfterSuite Suite") -} - -var _ = BeforeSuite(func() { - println("BEFORE SUITE") -}) - -var _ = AfterSuite(func() { - println("AFTER SUITE") - panic("BAM!") -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_after_suite/failing_after_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_after_suite/failing_after_suite_test.go deleted file mode 100644 index 3902ec6c5..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_after_suite/failing_after_suite_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package failing_before_suite_test - -import ( - . "github.com/onsi/ginkgo" -) - -var _ = Describe("FailingBeforeSuite", func() { - It("should run", func() { - println("A TEST") - }) - - It("should run", func() { - println("A TEST") - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_before_suite/failing_before_suite_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_before_suite/failing_before_suite_suite_test.go deleted file mode 100644 index 109ea3608..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_before_suite/failing_before_suite_suite_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package failing_before_suite_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestFailing_before_suite(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Failing_before_suite Suite") -} - -var _ = BeforeSuite(func() { - println("BEFORE SUITE") - panic("BAM!") -}) - -var _ = AfterSuite(func() { - println("AFTER SUITE") -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_before_suite/failing_before_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_before_suite/failing_before_suite_test.go deleted file mode 100644 index e8697c64a..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_before_suite/failing_before_suite_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package failing_before_suite_test - -import ( - . "github.com/onsi/ginkgo" -) - -var _ = Describe("FailingBeforeSuite", func() { - It("should never run", func() { - println("NEVER SEE THIS") - }) - - It("should never run", func() { - println("NEVER SEE THIS") - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests.go deleted file mode 100644 index e32cd619e..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests.go +++ /dev/null @@ -1,5 +0,0 @@ -package failing_ginkgo_tests - -func AlwaysFalse() bool { - return false -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests_suite_test.go deleted file mode 100644 index 49939bda5..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package failing_ginkgo_tests_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestFailing_ginkgo_tests(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Failing_ginkgo_tests Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests_test.go deleted file mode 100644 index d9c01e32c..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests/failing_ginkgo_tests_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package failing_ginkgo_tests_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/integration/_fixtures/failing_ginkgo_tests" - . "github.com/onsi/gomega" -) - -var _ = Describe("FailingGinkgoTests", func() { - It("should fail", func() { - Ω(AlwaysFalse()).Should(BeTrue()) - }) - - It("should pass", func() { - Ω(AlwaysFalse()).Should(BeFalse()) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags.go deleted file mode 100644 index a440abdaa..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags.go +++ /dev/null @@ -1,9 +0,0 @@ -package flags - -func Tested() string { - return "tested" -} - -func Untested() string { - return "untested" -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags_suite_test.go deleted file mode 100644 index 0b3071f62..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package flags_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestFlags(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Flags Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags_test.go deleted file mode 100644 index 5cd9b72f7..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/flags_tests/flags_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package flags_test - -import ( - "flag" - "fmt" - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/integration/_fixtures/flags_tests" - . "github.com/onsi/gomega" - "time" - remapped "math" -) - -var customFlag string - -func init() { - flag.StringVar(&customFlag, "customFlag", "default", "custom flag!") -} - -var _ = Describe("Testing various flags", func() { - FDescribe("the focused set", func() { - Measure("a measurement", func(b Benchmarker) { - b.RecordValue("a value", 3) - }, 3) - - It("should honor -cover", func() { - Ω(Tested()).Should(Equal("tested")) - }) - - It("should allow gcflags", func() { - fmt.Printf("NaN returns %T\n", remapped.NaN()) - }) - - PIt("should honor -failOnPending and -noisyPendings") - - Describe("smores", func() { - It("should honor -skip: marshmallow", func() { - println("marshmallow") - }) - - It("should honor -focus: chocolate", func() { - println("chocolate") - }) - }) - - It("should detect races", func(done Done) { - var a string - go func() { - a = "now you don't" - close(done) - }() - a = "now you see me" - println(a) - }) - - It("should randomize A", func() { - println("RANDOM_A") - }) - - It("should randomize B", func() { - println("RANDOM_B") - }) - - It("should randomize C", func() { - println("RANDOM_C") - }) - - It("should honor -slowSpecThreshold", func() { - time.Sleep(100 * time.Millisecond) - }) - - It("should pass in additional arguments after '--' directly to the test process", func() { - fmt.Printf("CUSTOM_FLAG: %s", customFlag) - }) - }) - - Describe("more smores", func() { - It("should not run these unless -focus is set", func() { - println("smores") - }) - }) - - Describe("a failing test", func() { - It("should fail", func() { - Ω(true).Should(Equal(false)) - }) - }) - - Describe("a flaky test", func() { - runs := 0 - It("should only pass the second time it's run", func() { - runs++ - Ω(runs).Should(BeNumerically("==", 2)) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/focused_fixture/focused_fixture_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/focused_fixture/focused_fixture_suite_test.go deleted file mode 100644 index 92d0c6e48..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/focused_fixture/focused_fixture_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package focused_fixture_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestFocused_fixture(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Focused_fixture Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/focused_fixture/focused_fixture_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/focused_fixture/focused_fixture_test.go deleted file mode 100644 index 16ad16de1..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/focused_fixture/focused_fixture_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package focused_fixture_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/extensions/table" -) - -var _ = Describe("FocusedFixture", func() { - FDescribe("focused", func() { - It("focused", func() { - - }) - }) - - FContext("focused", func() { - It("focused", func() { - - }) - }) - - FIt("focused", func() { - - }) - - FMeasure("focused", func(b Benchmarker) { - - }, 2) - - FDescribeTable("focused", - func() {}, - Entry("focused"), - ) - - DescribeTable("focused", - func() {}, - FEntry("focused"), - ) - - Describe("not focused", func() { - It("not focused", func() { - - }) - }) - - Context("not focused", func() { - It("not focused", func() { - - }) - }) - - It("not focused", func() { - - }) - - Measure("not focused", func(b Benchmarker) { - - }, 2) - - DescribeTable("not focused", - func() {}, - Entry("not focused"), - ) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/hanging_suite/hanging_suite_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/hanging_suite/hanging_suite_suite_test.go deleted file mode 100644 index e8dd54b52..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/hanging_suite/hanging_suite_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package hanging_suite_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestHangingSuite(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "HangingSuite Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/hanging_suite/hanging_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/hanging_suite/hanging_suite_test.go deleted file mode 100644 index 1728dcbe8..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/hanging_suite/hanging_suite_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package hanging_suite_test - -import ( - "fmt" - "time" - . "github.com/onsi/ginkgo" -) - -var _ = AfterSuite(func() { - fmt.Println("Heading Out After Suite") -}) - -var _ = Describe("HangingSuite", func() { - BeforeEach(func() { - fmt.Fprintln(GinkgoWriter, "Just beginning") - }) - - Context("inner context", func() { - BeforeEach(func() { - fmt.Fprintln(GinkgoWriter, "Almost there...") - }) - - It("should hang out for a while", func() { - fmt.Fprintln(GinkgoWriter, "Hanging Out") - fmt.Println("Sleeping...") - time.Sleep(time.Hour) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests.go deleted file mode 100644 index ca12c0d93..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests.go +++ /dev/null @@ -1,5 +0,0 @@ -package more_ginkgo_tests - -func AlwaysTrue() bool { - return true -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests_suite_test.go deleted file mode 100644 index 1e15c8857..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package more_ginkgo_tests_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestMore_ginkgo_tests(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "More_ginkgo_tests Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests_test.go deleted file mode 100644 index 0549f62fb..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests/more_ginkgo_tests_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package more_ginkgo_tests_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/integration/_fixtures/more_ginkgo_tests" - . "github.com/onsi/gomega" -) - -var _ = Describe("MoreGinkgoTests", func() { - It("should pass", func() { - Ω(AlwaysTrue()).Should(BeTrue()) - }) - - It("should always pass", func() { - Ω(AlwaysTrue()).Should(BeTrue()) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/no_test_fn/no_test_fn.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/no_test_fn/no_test_fn.go deleted file mode 100644 index bdf1b54b5..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/no_test_fn/no_test_fn.go +++ /dev/null @@ -1,5 +0,0 @@ -package no_test_fn - -func StringIdentity(a string) string { - return a -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/no_test_fn/no_test_fn_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/no_test_fn/no_test_fn_test.go deleted file mode 100644 index 6c38b1e43..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/no_test_fn/no_test_fn_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package no_test_fn_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/integration/_fixtures/no_test_fn" - . "github.com/onsi/gomega" -) - -var _ = Describe("NoTestFn", func() { - It("should proxy strings", func() { - Ω(StringIdentity("foo")).Should(Equal("foo")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/no_tests/no_tests.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/no_tests/no_tests.go deleted file mode 100644 index da29a2cad..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/no_tests/no_tests.go +++ /dev/null @@ -1,4 +0,0 @@ -package main - -func main() { -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests.go deleted file mode 100644 index b710dd129..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests.go +++ /dev/null @@ -1,9 +0,0 @@ -package passing_ginkgo_tests - -func StringIdentity(a string) string { - return a -} - -func IntegerIdentity(a int) int { - return a -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests_suite_test.go deleted file mode 100644 index 31a3f7d0c..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package passing_ginkgo_tests_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestPassing_ginkgo_tests(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Passing_ginkgo_tests Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests_test.go deleted file mode 100644 index a5822fdd7..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests/passing_ginkgo_tests_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package passing_ginkgo_tests_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/integration/_fixtures/passing_ginkgo_tests" - . "github.com/onsi/gomega" -) - -var _ = Describe("PassingGinkgoTests", func() { - It("should proxy strings", func() { - Ω(StringIdentity("foo")).Should(Equal("foo")) - }) - - It("should proxy integers", func() { - Ω(IntegerIdentity(3)).Should(Equal(3)) - }) - - It("should do it again", func() { - Ω(StringIdentity("foo")).Should(Equal("foo")) - Ω(IntegerIdentity(3)).Should(Equal(3)) - }) - - It("should be able to run Bys", func() { - By("emitting one By") - Ω(3).Should(Equal(3)) - - By("emitting another By") - Ω(4).Should(Equal(4)) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_suite_setup/passing_suite_setup_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_suite_setup/passing_suite_setup_suite_test.go deleted file mode 100644 index 86c9aa2ab..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_suite_setup/passing_suite_setup_suite_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package passing_before_suite_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestPassingSuiteSetup(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "PassingSuiteSetup Suite") -} - -var a string -var b string - -var _ = BeforeSuite(func() { - a = "ran before suite" - println("BEFORE SUITE") -}) - -var _ = AfterSuite(func() { - b = "ran after suite" - println("AFTER SUITE") -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_suite_setup/passing_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_suite_setup/passing_suite_test.go deleted file mode 100644 index f139e1d22..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/passing_suite_setup/passing_suite_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package passing_before_suite_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("PassingSuiteSetup", func() { - It("should pass", func() { - Ω(a).Should(Equal("ran before suite")) - Ω(b).Should(BeEmpty()) - }) - - It("should pass", func() { - Ω(a).Should(Equal("ran before suite")) - Ω(b).Should(BeEmpty()) - }) - - It("should pass", func() { - Ω(a).Should(Equal("ran before suite")) - Ω(b).Should(BeEmpty()) - }) - - It("should pass", func() { - Ω(a).Should(Equal("ran before suite")) - Ω(b).Should(BeEmpty()) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/progress_fixture/progress_fixture_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/progress_fixture/progress_fixture_suite_test.go deleted file mode 100644 index 74262bbc1..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/progress_fixture/progress_fixture_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package progress_fixture_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestProgressFixture(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "ProgressFixture Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/progress_fixture/progress_fixture_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/progress_fixture/progress_fixture_test.go deleted file mode 100644 index 1e0aa7950..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/progress_fixture/progress_fixture_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package progress_fixture_test - -import ( - "fmt" - - . "github.com/onsi/ginkgo" -) - -var _ = Describe("ProgressFixture", func() { - BeforeEach(func() { - fmt.Fprintln(GinkgoWriter, ">outer before<") - }) - - JustBeforeEach(func() { - fmt.Fprintln(GinkgoWriter, ">outer just before<") - }) - - AfterEach(func() { - fmt.Fprintln(GinkgoWriter, ">outer after<") - }) - - Context("Inner Context", func() { - BeforeEach(func() { - fmt.Fprintln(GinkgoWriter, ">inner before<") - }) - - JustBeforeEach(func() { - fmt.Fprintln(GinkgoWriter, ">inner just before<") - }) - - AfterEach(func() { - fmt.Fprintln(GinkgoWriter, ">inner after<") - }) - - It("should emit progress as it goes", func() { - fmt.Fprintln(GinkgoWriter, ">it<") - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/skip_fixture/skip_fixture_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/skip_fixture/skip_fixture_suite_test.go deleted file mode 100644 index b2028cf55..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/skip_fixture/skip_fixture_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package fail_fixture_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestFail_fixture(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Skip_fixture Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/skip_fixture/skip_fixture_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/skip_fixture/skip_fixture_test.go deleted file mode 100644 index 72aeb8f47..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/skip_fixture/skip_fixture_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package fail_fixture_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = It("handles top level skips", func() { - Skip("a top level skip on line 9") - println("NEVER SEE THIS") -}) - -var _ = It("handles async top level skips", func(done Done) { - Skip("an async top level skip on line 14") - println("NEVER SEE THIS") -}, 0.1) - -var _ = It("SKIP in a goroutine", func(done Done) { - go func() { - defer GinkgoRecover() - Skip("a top level goroutine skip on line 21") - println("NEVER SEE THIS") - }() -}, 0.1) - -var _ = Describe("Excercising different skip modes", func() { - It("synchronous skip", func() { - Skip("a sync SKIP") - println("NEVER SEE THIS") - }) - - It("async skip", func(done Done) { - Skip("an async SKIP") - println("NEVER SEE THIS") - }, 0.1) - - It("SKIP in a goroutine", func(done Done) { - go func() { - defer GinkgoRecover() - Skip("a goroutine SKIP") - println("NEVER SEE THIS") - }() - }, 0.1) - - Measure("a SKIP measure", func(Benchmarker) { - Skip("a measure SKIP") - println("NEVER SEE THIS") - }, 1) -}) - - -var _ = Describe("SKIP in a BeforeEach", func() { - BeforeEach(func() { - Skip("a BeforeEach SKIP") - println("NEVER SEE THIS") - }) - - It("a SKIP BeforeEach", func() { - println("NEVER SEE THIS") - }) -}) - -var _ = Describe("SKIP in an AfterEach", func() { - AfterEach(func() { - Skip("an AfterEach SKIP") - println("NEVER SEE THIS") - }) - - It("a SKIP AfterEach", func() { - Expect(true).To(BeTrue()) - }) -}) \ No newline at end of file diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command.go deleted file mode 100644 index 1d6704881..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command.go +++ /dev/null @@ -1,9 +0,0 @@ -package suite_command - -func Tested() string { - return "tested" -} - -func Untested() string { - return "untested" -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command_suite_test.go deleted file mode 100644 index 7f76d8b8f..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package suite_command_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestSuiteCommand(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Suite Command Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command_test.go deleted file mode 100644 index e083d27a2..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/suite_command_tests/suite_command_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package suite_command_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("Testing suite command", func() { - It("it should succeed", func() { - Ω(true).Should(Equal(true)) - }) - - PIt("a failing test", func() { - It("should fail", func() { - Ω(true).Should(Equal(false)) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/synchronized_setup_tests/synchronized_setup_tests_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/synchronized_setup_tests/synchronized_setup_tests_suite_test.go deleted file mode 100644 index b734854ee..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/synchronized_setup_tests/synchronized_setup_tests_suite_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package synchronized_setup_tests_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "fmt" - "testing" - "time" -) - -func TestSynchronized_setup_tests(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Synchronized_setup_tests Suite") -} - -var beforeData string - -var _ = SynchronizedBeforeSuite(func() []byte { - fmt.Printf("BEFORE_A_%d\n", GinkgoParallelNode()) - time.Sleep(100 * time.Millisecond) - return []byte("DATA") -}, func(data []byte) { - fmt.Printf("BEFORE_B_%d: %s\n", GinkgoParallelNode(), string(data)) - beforeData += string(data) + "OTHER" -}) - -var _ = SynchronizedAfterSuite(func() { - fmt.Printf("\nAFTER_A_%d\n", GinkgoParallelNode()) - time.Sleep(100 * time.Millisecond) -}, func() { - fmt.Printf("AFTER_B_%d\n", GinkgoParallelNode()) -}) - -var _ = Describe("Synchronized Setup", func() { - It("should run the before suite once", func() { - Ω(beforeData).Should(Equal("DATAOTHER")) - }) - - It("should run the before suite once", func() { - Ω(beforeData).Should(Equal("DATAOTHER")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/ignored_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/ignored_test.go deleted file mode 100644 index 517623536..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/ignored_test.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build complex_tests - -package tags_tests_test - -import ( - . "github.com/onsi/ginkgo" -) - -var _ = Describe("Ignored", func() { - It("should not have these tests", func() { - - }) - - It("should not have these tests", func() { - - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/tags_tests_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/tags_tests_suite_test.go deleted file mode 100644 index dcb11bb1b..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/tags_tests_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package tags_tests_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestTagsTests(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "TagsTests Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/tags_tests_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/tags_tests_test.go deleted file mode 100644 index b91a8923a..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/tags_tests/tags_tests_test.go +++ /dev/null @@ -1,11 +0,0 @@ -package tags_tests_test - -import ( - . "github.com/onsi/ginkgo" -) - -var _ = Describe("TagsTests", func() { - It("should have a test", func() { - - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/test_description/test_description_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/test_description/test_description_suite_test.go deleted file mode 100644 index 8976370d3..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/test_description/test_description_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package test_description_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestTestDescription(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "TestDescription Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/test_description/test_description_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/test_description/test_description_test.go deleted file mode 100644 index 53c2779ea..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/test_description/test_description_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package test_description_test - -import ( - "fmt" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("TestDescription", func() { - It("should pass", func() { - Ω(true).Should(BeTrue()) - }) - - It("should fail", func() { - Ω(true).Should(BeFalse()) - }) - - AfterEach(func() { - description := CurrentGinkgoTestDescription() - fmt.Printf("%s:%t\n", description.FullTestText, description.Failed) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A.go deleted file mode 100644 index de2c6bbb7..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A.go +++ /dev/null @@ -1,7 +0,0 @@ -package A - -import "github.com/onsi/B" - -func DoIt() string { - return B.DoIt() -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A_suite_test.go deleted file mode 100644 index 1b6cff4c7..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package A_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestA(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "A Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A_test.go deleted file mode 100644 index 003530aae..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A/A_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package A_test - -import ( - . "github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/A" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("A", func() { - It("should do it", func() { - Ω(DoIt()).Should(Equal("done!")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B.go deleted file mode 100644 index 990bab365..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B.go +++ /dev/null @@ -1,7 +0,0 @@ -package B - -import "github.com/onsi/C" - -func DoIt() string { - return C.DoIt() -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B_suite_test.go deleted file mode 100644 index e54fce668..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package B_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestB(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "B Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B_test.go deleted file mode 100644 index b147913c0..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B/B_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package B_test - -import ( - . "github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/B" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("B", func() { - It("should do it", func() { - Ω(DoIt()).Should(Equal("done!")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C.go deleted file mode 100644 index 205b68886..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C.go +++ /dev/null @@ -1,5 +0,0 @@ -package C - -func DoIt() string { - return "done!" -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C.json b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C.json deleted file mode 100644 index 421d025e0..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "fixture": "data" -} \ No newline at end of file diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C_suite_test.go deleted file mode 100644 index 57a7a96ba..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package C_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestC(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "C Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C_test.go deleted file mode 100644 index 7703fefa3..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C/C_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package C_test - -import ( - . "github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("C", func() { - It("should do it", func() { - Ω(DoIt()).Should(Equal("done!")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D.go deleted file mode 100644 index 4371b852f..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D.go +++ /dev/null @@ -1,7 +0,0 @@ -package D - -import "github.com/onsi/C" - -func DoIt() string { - return C.DoIt() -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D_suite_test.go deleted file mode 100644 index 0ebefe6b7..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package D_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestD(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "D Suite") -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D_test.go deleted file mode 100644 index 097945bf9..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/D/D_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package D_test - -import ( - . "github.com/onsi/ginkgo/integration/_fixtures/watch_fixtures/C" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("D", func() { - It("should do it", func() { - Ω(DoIt()).Should(Equal("done!")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/xunit_tests/xunit_tests.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/xunit_tests/xunit_tests.go deleted file mode 100644 index cb8fc8bc2..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/xunit_tests/xunit_tests.go +++ /dev/null @@ -1,5 +0,0 @@ -package xunit_tests - -func AlwaysTrue() bool { - return true -} diff --git a/vendor/github.com/onsi/ginkgo/integration/_fixtures/xunit_tests/xunit_tests_test.go b/vendor/github.com/onsi/ginkgo/integration/_fixtures/xunit_tests/xunit_tests_test.go deleted file mode 100644 index a6ebbe147..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/_fixtures/xunit_tests/xunit_tests_test.go +++ /dev/null @@ -1,11 +0,0 @@ -package xunit_tests - -import ( - "testing" -) - -func TestAlwaysTrue(t *testing.T) { - if AlwaysTrue() != true { - t.Errorf("Expected true, got false") - } -} diff --git a/vendor/github.com/onsi/ginkgo/integration/convert_test.go b/vendor/github.com/onsi/ginkgo/integration/convert_test.go deleted file mode 100644 index f4fd678c5..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/convert_test.go +++ /dev/null @@ -1,121 +0,0 @@ -package integration_test - -import ( - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("ginkgo convert", func() { - var tmpDir string - - readConvertedFileNamed := func(pathComponents ...string) string { - pathToFile := filepath.Join(tmpDir, "convert_fixtures", filepath.Join(pathComponents...)) - bytes, err := ioutil.ReadFile(pathToFile) - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - - return string(bytes) - } - - readGoldMasterNamed := func(filename string) string { - bytes, err := ioutil.ReadFile(filepath.Join("_fixtures", "convert_goldmasters", filename)) - Ω(err).ShouldNot(HaveOccurred()) - - return string(bytes) - } - - BeforeEach(func() { - var err error - - tmpDir, err = ioutil.TempDir("", "ginkgo-convert") - Ω(err).ShouldNot(HaveOccurred()) - - err = exec.Command("cp", "-r", filepath.Join("_fixtures", "convert_fixtures"), tmpDir).Run() - Ω(err).ShouldNot(HaveOccurred()) - }) - - JustBeforeEach(func() { - cwd, err := os.Getwd() - Ω(err).ShouldNot(HaveOccurred()) - - relPath, err := filepath.Rel(cwd, filepath.Join(tmpDir, "convert_fixtures")) - Ω(err).ShouldNot(HaveOccurred()) - - cmd := exec.Command(pathToGinkgo, "convert", relPath) - cmd.Env = os.Environ() - for i, env := range cmd.Env { - if strings.HasPrefix(env, "PATH") { - cmd.Env[i] = cmd.Env[i] + ":" + filepath.Dir(pathToGinkgo) - break - } - } - err = cmd.Run() - Ω(err).ShouldNot(HaveOccurred()) - }) - - AfterEach(func() { - err := os.RemoveAll(tmpDir) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("rewrites xunit tests as ginkgo tests", func() { - convertedFile := readConvertedFileNamed("xunit_test.go") - goldMaster := readGoldMasterNamed("xunit_test.go") - Ω(convertedFile).Should(Equal(goldMaster)) - }) - - It("rewrites all usages of *testing.T as mr.T()", func() { - convertedFile := readConvertedFileNamed("extra_functions_test.go") - goldMaster := readGoldMasterNamed("extra_functions_test.go") - Ω(convertedFile).Should(Equal(goldMaster)) - }) - - It("rewrites tests in the package dir that belong to other packages", func() { - convertedFile := readConvertedFileNamed("outside_package_test.go") - goldMaster := readGoldMasterNamed("outside_package_test.go") - Ω(convertedFile).Should(Equal(goldMaster)) - }) - - It("rewrites tests in nested packages", func() { - convertedFile := readConvertedFileNamed("nested", "nested_test.go") - goldMaster := readGoldMasterNamed("nested_test.go") - Ω(convertedFile).Should(Equal(goldMaster)) - }) - - Context("ginkgo test suite files", func() { - It("creates a ginkgo test suite file for the package you specified", func() { - testsuite := readConvertedFileNamed("convert_fixtures_suite_test.go") - goldMaster := readGoldMasterNamed("suite_test.go") - Ω(testsuite).Should(Equal(goldMaster)) - }) - - It("converts go tests in deeply nested packages (some may not contain go files)", func() { - testsuite := readConvertedFileNamed("nested_without_gofiles", "subpackage", "nested_subpackage_test.go") - goldMaster := readGoldMasterNamed("nested_subpackage_test.go") - Ω(testsuite).Should(Equal(goldMaster)) - }) - - It("creates ginkgo test suites for all nested packages", func() { - testsuite := readConvertedFileNamed("nested", "nested_suite_test.go") - goldMaster := readGoldMasterNamed("nested_suite_test.go") - Ω(testsuite).Should(Equal(goldMaster)) - }) - }) - - Context("with an existing test suite file", func() { - BeforeEach(func() { - goldMaster := readGoldMasterNamed("fixtures_suite_test.go") - err := ioutil.WriteFile(filepath.Join(tmpDir, "convert_fixtures", "tmp_suite_test.go"), []byte(goldMaster), 0600) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("gracefully handles existing test suite files", func() { - //nothing should have gone wrong! - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/coverage_test.go b/vendor/github.com/onsi/ginkgo/integration/coverage_test.go deleted file mode 100644 index 6b987a3b8..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/coverage_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package integration_test - -import ( - "os" - "os/exec" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Coverage Specs", func() { - AfterEach(func() { - os.RemoveAll("./_fixtures/coverage_fixture/coverage_fixture.coverprofile") - }) - - It("runs coverage analysis in series and in parallel", func() { - session := startGinkgo("./_fixtures/coverage_fixture", "-cover") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - Ω(output).Should(ContainSubstring("coverage: 80.0% of statements")) - - serialCoverProfileOutput, err := exec.Command("go", "tool", "cover", "-func=./_fixtures/coverage_fixture/coverage_fixture.coverprofile").CombinedOutput() - Ω(err).ShouldNot(HaveOccurred()) - - os.RemoveAll("./_fixtures/coverage_fixture/coverage_fixture.coverprofile") - - Eventually(startGinkgo("./_fixtures/coverage_fixture", "-cover", "-nodes=4")).Should(gexec.Exit(0)) - - parallelCoverProfileOutput, err := exec.Command("go", "tool", "cover", "-func=./_fixtures/coverage_fixture/coverage_fixture.coverprofile").CombinedOutput() - Ω(err).ShouldNot(HaveOccurred()) - - Ω(parallelCoverProfileOutput).Should(Equal(serialCoverProfileOutput)) - - By("handling external packages") - session = startGinkgo("./_fixtures/coverage_fixture", "-coverpkg=github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture,github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/external_coverage_fixture") - Eventually(session).Should(gexec.Exit(0)) - output = session.Out.Contents() - Ω(output).Should(ContainSubstring("coverage: 71.4% of statements in github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture, github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/external_coverage_fixture")) - - serialCoverProfileOutput, err = exec.Command("go", "tool", "cover", "-func=./_fixtures/coverage_fixture/coverage_fixture.coverprofile").CombinedOutput() - Ω(err).ShouldNot(HaveOccurred()) - - os.RemoveAll("./_fixtures/coverage_fixture/coverage_fixture.coverprofile") - - Eventually(startGinkgo("./_fixtures/coverage_fixture", "-coverpkg=github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture,github.com/onsi/ginkgo/integration/_fixtures/coverage_fixture/external_coverage_fixture", "-nodes=4")).Should(gexec.Exit(0)) - - parallelCoverProfileOutput, err = exec.Command("go", "tool", "cover", "-func=./_fixtures/coverage_fixture/coverage_fixture.coverprofile").CombinedOutput() - Ω(err).ShouldNot(HaveOccurred()) - - Ω(parallelCoverProfileOutput).Should(Equal(serialCoverProfileOutput)) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/fail_test.go b/vendor/github.com/onsi/ginkgo/integration/fail_test.go deleted file mode 100644 index 8dcf5e4ad..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/fail_test.go +++ /dev/null @@ -1,48 +0,0 @@ -package integration_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Failing Specs", func() { - var pathToTest string - - BeforeEach(func() { - pathToTest = tmpPath("failing") - copyIn("fail_fixture", pathToTest) - }) - - It("should fail in all the possible ways", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - Ω(output).ShouldNot(ContainSubstring("NEVER SEE THIS")) - - Ω(output).Should(ContainSubstring("a top level failure on line 9")) - Ω(output).Should(ContainSubstring("fail_fixture_test.go:9")) - Ω(output).Should(ContainSubstring("an async top level failure on line 14")) - Ω(output).Should(ContainSubstring("fail_fixture_test.go:14")) - Ω(output).Should(ContainSubstring("a top level goroutine failure on line 21")) - Ω(output).Should(ContainSubstring("fail_fixture_test.go:21")) - - Ω(output).Should(ContainSubstring("a sync failure")) - Ω(output).Should(MatchRegexp(`Test Panicked\n\s+a sync panic`)) - Ω(output).Should(ContainSubstring("a sync FAIL failure")) - Ω(output).Should(ContainSubstring("async timeout [It]")) - Ω(output).Should(ContainSubstring("Timed out")) - Ω(output).Should(ContainSubstring("an async failure")) - Ω(output).Should(MatchRegexp(`Test Panicked\n\s+an async panic`)) - Ω(output).Should(ContainSubstring("an async FAIL failure")) - Ω(output).Should(ContainSubstring("a goroutine FAIL failure")) - Ω(output).Should(ContainSubstring("a goroutine failure")) - Ω(output).Should(MatchRegexp(`Test Panicked\n\s+a goroutine panic`)) - Ω(output).Should(ContainSubstring("a measure failure")) - Ω(output).Should(ContainSubstring("a measure FAIL failure")) - Ω(output).Should(MatchRegexp(`Test Panicked\n\s+a measure panic`)) - - Ω(output).Should(ContainSubstring("0 Passed | 16 Failed")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/flags_test.go b/vendor/github.com/onsi/ginkgo/integration/flags_test.go deleted file mode 100644 index e34102d9f..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/flags_test.go +++ /dev/null @@ -1,236 +0,0 @@ -package integration_test - -import ( - "io/ioutil" - "os" - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/types" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Flags Specs", func() { - var pathToTest string - - BeforeEach(func() { - pathToTest = tmpPath("flags") - copyIn("flags_tests", pathToTest) - }) - - getRandomOrders := func(output string) []int { - return []int{strings.Index(output, "RANDOM_A"), strings.Index(output, "RANDOM_B"), strings.Index(output, "RANDOM_C")} - } - - It("normally passes, runs measurements, prints out noisy pendings, does not randomize tests, and honors the programmatic focus", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(types.GINKGO_FOCUS_EXIT_CODE)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("Ran 3 samples:"), "has a measurement") - Ω(output).Should(ContainSubstring("11 Passed")) - Ω(output).Should(ContainSubstring("0 Failed")) - Ω(output).Should(ContainSubstring("1 Pending")) - Ω(output).Should(ContainSubstring("3 Skipped")) - Ω(output).Should(ContainSubstring("[PENDING]")) - Ω(output).Should(ContainSubstring("marshmallow")) - Ω(output).Should(ContainSubstring("chocolate")) - Ω(output).Should(ContainSubstring("CUSTOM_FLAG: default")) - Ω(output).Should(ContainSubstring("Detected Programmatic Focus - setting exit status to %d", types.GINKGO_FOCUS_EXIT_CODE)) - Ω(output).ShouldNot(ContainSubstring("smores")) - Ω(output).ShouldNot(ContainSubstring("SLOW TEST")) - Ω(output).ShouldNot(ContainSubstring("should honor -slowSpecThreshold")) - - orders := getRandomOrders(output) - Ω(orders[0]).Should(BeNumerically("<", orders[1])) - Ω(orders[1]).Should(BeNumerically("<", orders[2])) - }) - - It("should run a coverprofile when passed -cover", func() { - session := startGinkgo(pathToTest, "--noColor", "--cover", "--focus=the focused set") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - _, err := os.Stat(filepath.Join(pathToTest, "flags.coverprofile")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(output).Should(ContainSubstring("coverage: ")) - }) - - It("should fail when there are pending tests and it is passed --failOnPending", func() { - session := startGinkgo(pathToTest, "--noColor", "--failOnPending") - Eventually(session).Should(gexec.Exit(1)) - }) - - It("should fail if the test suite takes longer than the timeout", func() { - session := startGinkgo(pathToTest, "--noColor", "--timeout=1ms") - Eventually(session).Should(gexec.Exit(1)) - }) - - It("should not print out pendings when --noisyPendings=false", func() { - session := startGinkgo(pathToTest, "--noColor", "--noisyPendings=false") - Eventually(session).Should(gexec.Exit(types.GINKGO_FOCUS_EXIT_CODE)) - output := string(session.Out.Contents()) - - Ω(output).ShouldNot(ContainSubstring("[PENDING]")) - Ω(output).Should(ContainSubstring("1 Pending")) - }) - - It("should override the programmatic focus when told to focus", func() { - session := startGinkgo(pathToTest, "--noColor", "--focus=smores") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("marshmallow")) - Ω(output).Should(ContainSubstring("chocolate")) - Ω(output).Should(ContainSubstring("smores")) - Ω(output).Should(ContainSubstring("3 Passed")) - Ω(output).Should(ContainSubstring("0 Failed")) - Ω(output).Should(ContainSubstring("0 Pending")) - Ω(output).Should(ContainSubstring("12 Skipped")) - }) - - It("should override the programmatic focus when told to skip", func() { - session := startGinkgo(pathToTest, "--noColor", "--skip=marshmallow|failing|flaky") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).ShouldNot(ContainSubstring("marshmallow")) - Ω(output).Should(ContainSubstring("chocolate")) - Ω(output).Should(ContainSubstring("smores")) - Ω(output).Should(ContainSubstring("11 Passed")) - Ω(output).Should(ContainSubstring("0 Failed")) - Ω(output).Should(ContainSubstring("1 Pending")) - Ω(output).Should(ContainSubstring("3 Skipped")) - }) - - It("should run the race detector when told to", func() { - session := startGinkgo(pathToTest, "--noColor", "--race") - Eventually(session).Should(gexec.Exit(types.GINKGO_FOCUS_EXIT_CODE)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("WARNING: DATA RACE")) - }) - - It("should randomize tests when told to", func() { - session := startGinkgo(pathToTest, "--noColor", "--randomizeAllSpecs", "--seed=17") - Eventually(session).Should(gexec.Exit(types.GINKGO_FOCUS_EXIT_CODE)) - output := string(session.Out.Contents()) - - orders := getRandomOrders(output) - Ω(orders[0]).ShouldNot(BeNumerically("<", orders[1])) - }) - - It("should skip measurements when told to", func() { - session := startGinkgo(pathToTest, "--skipMeasurements") - Eventually(session).Should(gexec.Exit(types.GINKGO_FOCUS_EXIT_CODE)) - output := string(session.Out.Contents()) - - Ω(output).ShouldNot(ContainSubstring("Ran 3 samples:"), "has a measurement") - Ω(output).Should(ContainSubstring("4 Skipped")) - }) - - It("should watch for slow specs", func() { - session := startGinkgo(pathToTest, "--slowSpecThreshold=0.05") - Eventually(session).Should(gexec.Exit(types.GINKGO_FOCUS_EXIT_CODE)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("SLOW TEST")) - Ω(output).Should(ContainSubstring("should honor -slowSpecThreshold")) - }) - - It("should pass additional arguments in", func() { - session := startGinkgo(pathToTest, "--", "--customFlag=madagascar") - Eventually(session).Should(gexec.Exit(types.GINKGO_FOCUS_EXIT_CODE)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("CUSTOM_FLAG: madagascar")) - }) - - It("should print out full stack traces for failures when told to", func() { - session := startGinkgo(pathToTest, "--focus=a failing test", "--trace") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("Full Stack Trace")) - }) - - It("should fail fast when told to", func() { - pathToTest = tmpPath("fail") - copyIn("fail_fixture", pathToTest) - session := startGinkgo(pathToTest, "--failFast") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("1 Failed")) - Ω(output).Should(ContainSubstring("15 Skipped")) - }) - - Context("with a flaky test", func() { - It("should normally fail", func() { - session := startGinkgo(pathToTest, "--focus=flaky") - Eventually(session).Should(gexec.Exit(1)) - }) - - It("should pass if retries are requested", func() { - session := startGinkgo(pathToTest, "--focus=flaky --flakeAttempts=2") - Eventually(session).Should(gexec.Exit(0)) - }) - }) - - It("should perform a dry run when told to", func() { - pathToTest = tmpPath("fail") - copyIn("fail_fixture", pathToTest) - session := startGinkgo(pathToTest, "--dryRun", "-v") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("synchronous failures")) - Ω(output).Should(ContainSubstring("16 Specs")) - Ω(output).Should(ContainSubstring("0 Passed")) - Ω(output).Should(ContainSubstring("0 Failed")) - }) - - regextest := func(regexOption string, skipOrFocus string) string { - pathToTest = tmpPath("passing") - copyIn("passing_ginkgo_tests", pathToTest) - session := startGinkgo(pathToTest, regexOption, "--dryRun", "-v", skipOrFocus) - Eventually(session).Should(gexec.Exit(0)) - return string(session.Out.Contents()) - } - - It("regexScansFilePath (enabled) should skip and focus on file names", func() { - output := regextest("-regexScansFilePath=true", "-skip=/passing/") // everything gets skipped (nothing runs) - Ω(output).Should(ContainSubstring("0 of 4 Specs")) - output = regextest("-regexScansFilePath=true", "-focus=/passing/") // everything gets focused (everything runs) - Ω(output).Should(ContainSubstring("4 of 4 Specs")) - }) - - It("regexScansFilePath (disabled) should not effect normal filtering", func() { - output := regextest("-regexScansFilePath=false", "-skip=/passing/") // nothing gets skipped (everything runs) - Ω(output).Should(ContainSubstring("4 of 4 Specs")) - output = regextest("-regexScansFilePath=false", "-focus=/passing/") // nothing gets focused (nothing runs) - Ω(output).Should(ContainSubstring("0 of 4 Specs")) - }) - It("should honor compiler flags", func() { - session := startGinkgo(pathToTest, "-gcflags=-importmap 'math=math/cmplx'") - Eventually(session).Should(gexec.Exit(types.GINKGO_FOCUS_EXIT_CODE)) - output := string(session.Out.Contents()) - Ω(output).Should(ContainSubstring("NaN returns complex128")) - }) - - It("should honor covermode flag", func() { - session := startGinkgo(pathToTest, "--noColor", "--covermode=count", "--focus=the focused set") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - Ω(output).Should(ContainSubstring("coverage: ")) - - coverageFile := filepath.Join(pathToTest, "flags.coverprofile") - _, err := os.Stat(coverageFile) - Ω(err).ShouldNot(HaveOccurred()) - contents, err := ioutil.ReadFile(coverageFile) - Ω(err).ShouldNot(HaveOccurred()) - Ω(contents).Should(ContainSubstring("mode: count")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/integration.go b/vendor/github.com/onsi/ginkgo/integration/integration.go deleted file mode 100644 index 76ab1b728..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/integration.go +++ /dev/null @@ -1 +0,0 @@ -package integration diff --git a/vendor/github.com/onsi/ginkgo/integration/integration_suite_test.go b/vendor/github.com/onsi/ginkgo/integration/integration_suite_test.go deleted file mode 100644 index 5cf9546db..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/integration_suite_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package integration_test - -import ( - "io" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" - - "testing" - "time" -) - -var tmpDir string -var pathToGinkgo string - -func TestIntegration(t *testing.T) { - SetDefaultEventuallyTimeout(15 * time.Second) - RegisterFailHandler(Fail) - RunSpecs(t, "Integration Suite") -} - -var _ = SynchronizedBeforeSuite(func() []byte { - pathToGinkgo, err := gexec.Build("github.com/onsi/ginkgo/ginkgo") - Ω(err).ShouldNot(HaveOccurred()) - return []byte(pathToGinkgo) -}, func(computedPathToGinkgo []byte) { - pathToGinkgo = string(computedPathToGinkgo) -}) - -var _ = BeforeEach(func() { - var err error - tmpDir, err = ioutil.TempDir("", "ginkgo-run") - Ω(err).ShouldNot(HaveOccurred()) -}) - -var _ = AfterEach(func() { - err := os.RemoveAll(tmpDir) - Ω(err).ShouldNot(HaveOccurred()) -}) - -var _ = SynchronizedAfterSuite(func() {}, func() { - gexec.CleanupBuildArtifacts() -}) - -func tmpPath(destination string) string { - return filepath.Join(tmpDir, destination) -} - -func copyIn(fixture string, destination string) { - err := os.MkdirAll(destination, 0777) - Ω(err).ShouldNot(HaveOccurred()) - - filepath.Walk(filepath.Join("_fixtures", fixture), func(path string, info os.FileInfo, err error) error { - if info.IsDir() { - return nil - } - - base := filepath.Base(path) - - src, err := os.Open(path) - Ω(err).ShouldNot(HaveOccurred()) - defer src.Close() - - dst, err := os.Create(filepath.Join(destination, base)) - Ω(err).ShouldNot(HaveOccurred()) - defer dst.Close() - - _, err = io.Copy(dst, src) - Ω(err).ShouldNot(HaveOccurred()) - return nil - }) -} - -func ginkgoCommand(dir string, args ...string) *exec.Cmd { - cmd := exec.Command(pathToGinkgo, args...) - cmd.Dir = dir - - return cmd -} - -func startGinkgo(dir string, args ...string) *gexec.Session { - cmd := ginkgoCommand(dir, args...) - session, err := gexec.Start(cmd, GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - return session -} diff --git a/vendor/github.com/onsi/ginkgo/integration/interrupt_test.go b/vendor/github.com/onsi/ginkgo/integration/interrupt_test.go deleted file mode 100644 index dc3bf2842..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/interrupt_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package integration_test - -import ( - "os/exec" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gbytes" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Interrupt", func() { - var pathToTest string - BeforeEach(func() { - pathToTest = tmpPath("hanging") - copyIn("hanging_suite", pathToTest) - }) - - Context("when interrupting a suite", func() { - var session *gexec.Session - BeforeEach(func() { - //we need to signal the actual process, so we must compile the test first - var err error - cmd := exec.Command("go", "test", "-c") - cmd.Dir = pathToTest - session, err = gexec.Start(cmd, GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - Eventually(session).Should(gexec.Exit(0)) - - //then run the compiled test directly - cmd = exec.Command("./hanging.test", "--test.v=true", "--ginkgo.noColor") - cmd.Dir = pathToTest - session, err = gexec.Start(cmd, GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - Eventually(session).Should(gbytes.Say("Sleeping...")) - session.Interrupt() - Eventually(session, 1000).Should(gexec.Exit(1)) - }) - - It("should emit the contents of the GinkgoWriter", func() { - Ω(session).Should(gbytes.Say("Just beginning")) - Ω(session).Should(gbytes.Say("Almost there...")) - Ω(session).Should(gbytes.Say("Hanging Out")) - }) - - It("should run the AfterSuite", func() { - Ω(session).Should(gbytes.Say("Heading Out After Suite")) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/precompiled_test.go b/vendor/github.com/onsi/ginkgo/integration/precompiled_test.go deleted file mode 100644 index d9b78e0b2..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/precompiled_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package integration_test - -import ( - "os" - "os/exec" - "path/filepath" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gbytes" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("ginkgo build", func() { - var pathToTest string - - BeforeEach(func() { - pathToTest = tmpPath("passing_ginkgo_tests") - copyIn("passing_ginkgo_tests", pathToTest) - session := startGinkgo(pathToTest, "build") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - Ω(output).Should(ContainSubstring("Compiling passing_ginkgo_tests")) - Ω(output).Should(ContainSubstring("compiled passing_ginkgo_tests.test")) - }) - - It("should build a test binary", func() { - _, err := os.Stat(filepath.Join(pathToTest, "passing_ginkgo_tests.test")) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should be possible to run the test binary directly", func() { - cmd := exec.Command("./passing_ginkgo_tests.test") - cmd.Dir = pathToTest - session, err := gexec.Start(cmd, GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - Eventually(session).Should(gexec.Exit(0)) - Ω(session).Should(gbytes.Say("Running Suite: Passing_ginkgo_tests Suite")) - }) - - It("should be possible to run the test binary via ginkgo", func() { - session := startGinkgo(pathToTest, "./passing_ginkgo_tests.test") - Eventually(session).Should(gexec.Exit(0)) - Ω(session).Should(gbytes.Say("Running Suite: Passing_ginkgo_tests Suite")) - }) - - It("should be possible to run the test binary in parallel", func() { - session := startGinkgo(pathToTest, "--nodes=4", "--noColor", "./passing_ginkgo_tests.test") - Eventually(session).Should(gexec.Exit(0)) - Ω(session).Should(gbytes.Say("Running Suite: Passing_ginkgo_tests Suite")) - Ω(session).Should(gbytes.Say("Running in parallel across 4 nodes")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/progress_test.go b/vendor/github.com/onsi/ginkgo/integration/progress_test.go deleted file mode 100644 index 8589c338a..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/progress_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package integration_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gbytes" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Emitting progress", func() { - var pathToTest string - var session *gexec.Session - var args []string - - BeforeEach(func() { - args = []string{"--noColor"} - pathToTest = tmpPath("progress") - copyIn("progress_fixture", pathToTest) - }) - - JustBeforeEach(func() { - session = startGinkgo(pathToTest, args...) - Eventually(session).Should(gexec.Exit(0)) - }) - - Context("with the -progress flag, but no -v flag", func() { - BeforeEach(func() { - args = append(args, "-progress") - }) - - It("should not emit progress", func() { - Ω(session).ShouldNot(gbytes.Say("[bB]efore")) - }) - }) - - Context("with the -v flag", func() { - BeforeEach(func() { - args = append(args, "-v") - }) - - It("should not emit progress", func() { - Ω(session).ShouldNot(gbytes.Say(`\[BeforeEach\]`)) - Ω(session).Should(gbytes.Say(`>outer before<`)) - }) - }) - - Context("with the -progress flag and the -v flag", func() { - BeforeEach(func() { - args = append(args, "-progress", "-v") - }) - - It("should emit progress (by writing to the GinkgoWriter)", func() { - Ω(session).Should(gbytes.Say(`\[BeforeEach\] ProgressFixture`)) - Ω(session).Should(gbytes.Say(`>outer before<`)) - - Ω(session).Should(gbytes.Say(`\[BeforeEach\] Inner Context`)) - Ω(session).Should(gbytes.Say(`>inner before<`)) - - Ω(session).Should(gbytes.Say(`\[JustBeforeEach\] ProgressFixture`)) - Ω(session).Should(gbytes.Say(`>outer just before<`)) - - Ω(session).Should(gbytes.Say(`\[JustBeforeEach\] Inner Context`)) - Ω(session).Should(gbytes.Say(`>inner just before<`)) - - Ω(session).Should(gbytes.Say(`\[It\] should emit progress as it goes`)) - Ω(session).Should(gbytes.Say(`>it<`)) - - Ω(session).Should(gbytes.Say(`\[AfterEach\] Inner Context`)) - Ω(session).Should(gbytes.Say(`>inner after<`)) - - Ω(session).Should(gbytes.Say(`\[AfterEach\] ProgressFixture`)) - Ω(session).Should(gbytes.Say(`>outer after<`)) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/run_test.go b/vendor/github.com/onsi/ginkgo/integration/run_test.go deleted file mode 100644 index 7f320bd53..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/run_test.go +++ /dev/null @@ -1,422 +0,0 @@ -package integration_test - -import ( - "fmt" - "regexp" - "runtime" - "strings" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/types" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gbytes" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Running Specs", func() { - var pathToTest string - - isWindows := (runtime.GOOS == "windows") - denoter := "•" - - if isWindows { - denoter = "+" - } - - Context("when pointed at the current directory", func() { - BeforeEach(func() { - pathToTest = tmpPath("ginkgo") - copyIn("passing_ginkgo_tests", pathToTest) - }) - - It("should run the tests in the working directory", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("Running Suite: Passing_ginkgo_tests Suite")) - Ω(output).Should(ContainSubstring(strings.Repeat(denoter, 4))) - Ω(output).Should(ContainSubstring("SUCCESS! -- 4 Passed")) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - }) - }) - - Context("when passed an explicit package to run", func() { - BeforeEach(func() { - pathToTest = tmpPath("ginkgo") - copyIn("passing_ginkgo_tests", pathToTest) - }) - - It("should run the ginkgo style tests", func() { - session := startGinkgo(tmpDir, "--noColor", pathToTest) - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("Running Suite: Passing_ginkgo_tests Suite")) - Ω(output).Should(ContainSubstring(strings.Repeat(denoter, 4))) - Ω(output).Should(ContainSubstring("SUCCESS! -- 4 Passed")) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - }) - }) - - Context("when passed a number of packages to run", func() { - BeforeEach(func() { - pathToTest = tmpPath("ginkgo") - otherPathToTest := tmpPath("other") - copyIn("passing_ginkgo_tests", pathToTest) - copyIn("more_ginkgo_tests", otherPathToTest) - }) - - It("should run the ginkgo style tests", func() { - session := startGinkgo(tmpDir, "--noColor", "--succinct=false", "ginkgo", "./other") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("Running Suite: Passing_ginkgo_tests Suite")) - Ω(output).Should(ContainSubstring("Running Suite: More_ginkgo_tests Suite")) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - }) - }) - - Context("when passed a number of packages to run, some of which have focused tests", func() { - BeforeEach(func() { - pathToTest = tmpPath("ginkgo") - otherPathToTest := tmpPath("other") - focusedPathToTest := tmpPath("focused") - copyIn("passing_ginkgo_tests", pathToTest) - copyIn("more_ginkgo_tests", otherPathToTest) - copyIn("focused_fixture", focusedPathToTest) - }) - - It("should exit with a status code of 2 and explain why", func() { - session := startGinkgo(tmpDir, "--noColor", "--succinct=false", "-r") - Eventually(session).Should(gexec.Exit(types.GINKGO_FOCUS_EXIT_CODE)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("Running Suite: Passing_ginkgo_tests Suite")) - Ω(output).Should(ContainSubstring("Running Suite: More_ginkgo_tests Suite")) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - Ω(output).Should(ContainSubstring("Detected Programmatic Focus - setting exit status to %d", types.GINKGO_FOCUS_EXIT_CODE)) - }) - }) - - Context("when told to skipPackages", func() { - BeforeEach(func() { - pathToTest = tmpPath("ginkgo") - otherPathToTest := tmpPath("other") - focusedPathToTest := tmpPath("focused") - copyIn("passing_ginkgo_tests", pathToTest) - copyIn("more_ginkgo_tests", otherPathToTest) - copyIn("focused_fixture", focusedPathToTest) - }) - - It("should skip packages that match the list", func() { - session := startGinkgo(tmpDir, "--noColor", "--skipPackage=other,focused", "-r") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("Passing_ginkgo_tests Suite")) - Ω(output).ShouldNot(ContainSubstring("More_ginkgo_tests Suite")) - Ω(output).ShouldNot(ContainSubstring("Focused_fixture Suite")) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - }) - - Context("when all packages are skipped", func() { - It("should not run anything, but still exit 0", func() { - session := startGinkgo(tmpDir, "--noColor", "--skipPackage=other,focused,ginkgo", "-r") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("All tests skipped!")) - Ω(output).ShouldNot(ContainSubstring("Passing_ginkgo_tests Suite")) - Ω(output).ShouldNot(ContainSubstring("More_ginkgo_tests Suite")) - Ω(output).ShouldNot(ContainSubstring("Focused_fixture Suite")) - Ω(output).ShouldNot(ContainSubstring("Test Suite Passed")) - }) - }) - }) - - Context("when there are no tests to run", func() { - It("should exit 1", func() { - session := startGinkgo(tmpDir, "--noColor", "--skipPackage=other,focused", "-r") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Err.Contents()) - - Ω(output).Should(ContainSubstring("Found no test suites")) - }) - }) - - Context("when there are test files but `go test` reports there are no tests to run", func() { - BeforeEach(func() { - pathToTest = tmpPath("ginkgo") - copyIn("no_test_fn", pathToTest) - }) - - It("suggests running ginkgo bootstrap", func() { - session := startGinkgo(tmpDir, "--noColor", "--skipPackage=other,focused", "-r") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Err.Contents()) - - Ω(output).Should(ContainSubstring(`Found no test suites, did you forget to run "ginkgo bootstrap"?`)) - }) - - It("fails if told to requireSuite", func() { - session := startGinkgo(tmpDir, "--noColor", "--skipPackage=other,focused", "-r", "-requireSuite") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Err.Contents()) - - Ω(output).Should(ContainSubstring(`Found no test suites, did you forget to run "ginkgo bootstrap"?`)) - }) - }) - - Context("when told to randomizeSuites", func() { - BeforeEach(func() { - pathToTest = tmpPath("ginkgo") - otherPathToTest := tmpPath("other") - copyIn("passing_ginkgo_tests", pathToTest) - copyIn("more_ginkgo_tests", otherPathToTest) - }) - - It("should skip packages that match the regexp", func() { - session := startGinkgo(tmpDir, "--noColor", "--randomizeSuites", "-r", "--seed=2") - Eventually(session).Should(gexec.Exit(0)) - - Ω(session).Should(gbytes.Say("More_ginkgo_tests Suite")) - Ω(session).Should(gbytes.Say("Passing_ginkgo_tests Suite")) - - session = startGinkgo(tmpDir, "--noColor", "--randomizeSuites", "-r", "--seed=3") - Eventually(session).Should(gexec.Exit(0)) - - Ω(session).Should(gbytes.Say("Passing_ginkgo_tests Suite")) - Ω(session).Should(gbytes.Say("More_ginkgo_tests Suite")) - }) - }) - - Context("when pointed at a package with xunit style tests", func() { - BeforeEach(func() { - pathToTest = tmpPath("xunit") - copyIn("xunit_tests", pathToTest) - }) - - It("should run the xunit style tests", func() { - session := startGinkgo(pathToTest) - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("--- PASS: TestAlwaysTrue")) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - }) - }) - - Context("when pointed at a package with no tests", func() { - BeforeEach(func() { - pathToTest = tmpPath("no_tests") - copyIn("no_tests", pathToTest) - }) - - It("should fail", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(1)) - - Ω(session.Err.Contents()).Should(ContainSubstring("Found no test suites")) - }) - }) - - Context("when pointed at a package that fails to compile", func() { - BeforeEach(func() { - pathToTest = tmpPath("does_not_compile") - copyIn("does_not_compile", pathToTest) - }) - - It("should fail", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("Failed to compile")) - }) - }) - - Context("when running in parallel", func() { - BeforeEach(func() { - pathToTest = tmpPath("ginkgo") - copyIn("passing_ginkgo_tests", pathToTest) - }) - - Context("with a specific number of -nodes", func() { - It("should use the specified number of nodes", func() { - session := startGinkgo(pathToTest, "--noColor", "-succinct", "-nodes=2") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(MatchRegexp(`\[\d+\] Passing_ginkgo_tests Suite - 4 specs - 2 nodes [%s]{4} SUCCESS! \d+(\.\d+)?[muµ]s`, regexp.QuoteMeta(denoter))) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - }) - }) - - Context("with -p", func() { - It("it should autocompute the number of nodes", func() { - session := startGinkgo(pathToTest, "--noColor", "-succinct", "-p") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - nodes := runtime.NumCPU() - if nodes == 1 { - Skip("Can't test parallel testings with 1 CPU") - } - if nodes > 4 { - nodes = nodes - 1 - } - Ω(output).Should(MatchRegexp(`\[\d+\] Passing_ginkgo_tests Suite - 4 specs - %d nodes [%s]{4} SUCCESS! \d+(\.\d+)?[muµ]?s`, nodes, regexp.QuoteMeta(denoter))) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - }) - }) - }) - - Context("when streaming in parallel", func() { - BeforeEach(func() { - pathToTest = tmpPath("ginkgo") - copyIn("passing_ginkgo_tests", pathToTest) - }) - - It("should print output in realtime", func() { - session := startGinkgo(pathToTest, "--noColor", "-stream", "-nodes=2") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring(`[1] Parallel test node 1/2.`)) - Ω(output).Should(ContainSubstring(`[2] Parallel test node 2/2.`)) - Ω(output).Should(ContainSubstring(`[1] SUCCESS!`)) - Ω(output).Should(ContainSubstring(`[2] SUCCESS!`)) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - }) - }) - - Context("when running recursively", func() { - BeforeEach(func() { - passingTest := tmpPath("A") - otherPassingTest := tmpPath("E") - copyIn("passing_ginkgo_tests", passingTest) - copyIn("more_ginkgo_tests", otherPassingTest) - }) - - Context("when all the tests pass", func() { - Context("with the -r flag", func() { - It("should run all the tests (in succinct mode) and succeed", func() { - session := startGinkgo(tmpDir, "--noColor", "-r", ".") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - outputLines := strings.Split(output, "\n") - Ω(outputLines[0]).Should(MatchRegexp(`\[\d+\] Passing_ginkgo_tests Suite - 4/4 specs [%s]{4} SUCCESS! \d+(\.\d+)?[muµ]s PASS`, regexp.QuoteMeta(denoter))) - Ω(outputLines[1]).Should(MatchRegexp(`\[\d+\] More_ginkgo_tests Suite - 2/2 specs [%s]{2} SUCCESS! \d+(\.\d+)?[muµ]s PASS`, regexp.QuoteMeta(denoter))) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - }) - }) - Context("with a trailing /...", func() { - It("should run all the tests (in succinct mode) and succeed", func() { - session := startGinkgo(tmpDir, "--noColor", "./...") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - outputLines := strings.Split(output, "\n") - Ω(outputLines[0]).Should(MatchRegexp(`\[\d+\] Passing_ginkgo_tests Suite - 4/4 specs [%s]{4} SUCCESS! \d+(\.\d+)?[muµ]s PASS`, regexp.QuoteMeta(denoter))) - Ω(outputLines[1]).Should(MatchRegexp(`\[\d+\] More_ginkgo_tests Suite - 2/2 specs [%s]{2} SUCCESS! \d+(\.\d+)?[muµ]s PASS`, regexp.QuoteMeta(denoter))) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - }) - }) - }) - - Context("when one of the packages has a failing tests", func() { - BeforeEach(func() { - failingTest := tmpPath("C") - copyIn("failing_ginkgo_tests", failingTest) - }) - - It("should fail and stop running tests", func() { - session := startGinkgo(tmpDir, "--noColor", "-r") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - outputLines := strings.Split(output, "\n") - Ω(outputLines[0]).Should(MatchRegexp(`\[\d+\] Passing_ginkgo_tests Suite - 4/4 specs [%s]{4} SUCCESS! \d+(\.\d+)?[muµ]s PASS`, regexp.QuoteMeta(denoter))) - Ω(outputLines[1]).Should(MatchRegexp(`\[\d+\] Failing_ginkgo_tests Suite - 2/2 specs`)) - Ω(output).Should(ContainSubstring(fmt.Sprintf("%s Failure", denoter))) - Ω(output).ShouldNot(ContainSubstring("More_ginkgo_tests Suite")) - Ω(output).Should(ContainSubstring("Test Suite Failed")) - - Ω(output).Should(ContainSubstring("Summarizing 1 Failure:")) - Ω(output).Should(ContainSubstring("[Fail] FailingGinkgoTests [It] should fail")) - }) - }) - - Context("when one of the packages fails to compile", func() { - BeforeEach(func() { - doesNotCompileTest := tmpPath("C") - copyIn("does_not_compile", doesNotCompileTest) - }) - - It("should fail and stop running tests", func() { - session := startGinkgo(tmpDir, "--noColor", "-r") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - outputLines := strings.Split(output, "\n") - Ω(outputLines[0]).Should(MatchRegexp(`\[\d+\] Passing_ginkgo_tests Suite - 4/4 specs [%s]{4} SUCCESS! \d+(\.\d+)?[muµ]s PASS`, regexp.QuoteMeta(denoter))) - Ω(outputLines[1]).Should(ContainSubstring("Failed to compile C:")) - Ω(output).ShouldNot(ContainSubstring("More_ginkgo_tests Suite")) - Ω(output).Should(ContainSubstring("Test Suite Failed")) - }) - }) - - Context("when either is the case, but the keepGoing flag is set", func() { - BeforeEach(func() { - doesNotCompileTest := tmpPath("B") - copyIn("does_not_compile", doesNotCompileTest) - - failingTest := tmpPath("C") - copyIn("failing_ginkgo_tests", failingTest) - }) - - It("should soldier on", func() { - session := startGinkgo(tmpDir, "--noColor", "-r", "-keepGoing") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - outputLines := strings.Split(output, "\n") - Ω(outputLines[0]).Should(MatchRegexp(`\[\d+\] Passing_ginkgo_tests Suite - 4/4 specs [%s]{4} SUCCESS! \d+(\.\d+)?[muµ]s PASS`, regexp.QuoteMeta(denoter))) - Ω(outputLines[1]).Should(ContainSubstring("Failed to compile B:")) - Ω(output).Should(MatchRegexp(`\[\d+\] Failing_ginkgo_tests Suite - 2/2 specs`)) - Ω(output).Should(ContainSubstring(fmt.Sprintf("%s Failure", denoter))) - Ω(output).Should(MatchRegexp(`\[\d+\] More_ginkgo_tests Suite - 2/2 specs [%s]{2} SUCCESS! \d+(\.\d+)?[muµ]s PASS`, regexp.QuoteMeta(denoter))) - Ω(output).Should(ContainSubstring("Test Suite Failed")) - }) - }) - }) - - Context("when told to keep going --untilItFails", func() { - BeforeEach(func() { - copyIn("eventually_failing", tmpDir) - }) - - It("should keep rerunning the tests, until a failure occurs", func() { - session := startGinkgo(tmpDir, "--untilItFails", "--noColor") - Eventually(session).Should(gexec.Exit(1)) - Ω(session).Should(gbytes.Say("This was attempt #1")) - Ω(session).Should(gbytes.Say("This was attempt #2")) - Ω(session).Should(gbytes.Say("Tests failed on attempt #3")) - - //it should change the random seed between each test - lines := strings.Split(string(session.Out.Contents()), "\n") - randomSeeds := []string{} - for _, line := range lines { - if strings.Contains(line, "Random Seed:") { - randomSeeds = append(randomSeeds, strings.Split(line, ": ")[1]) - } - } - Ω(randomSeeds[0]).ShouldNot(Equal(randomSeeds[1])) - Ω(randomSeeds[1]).ShouldNot(Equal(randomSeeds[2])) - Ω(randomSeeds[0]).ShouldNot(Equal(randomSeeds[2])) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/skip_test.go b/vendor/github.com/onsi/ginkgo/integration/skip_test.go deleted file mode 100644 index 59a12ee68..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/skip_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package integration_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Skipping Specs", func() { - var pathToTest string - - BeforeEach(func() { - pathToTest = tmpPath("skipping") - copyIn("skip_fixture", pathToTest) - }) - - It("should skip in all the possible ways", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).ShouldNot(ContainSubstring("NEVER SEE THIS")) - - Ω(output).Should(ContainSubstring("a top level skip on line 9")) - Ω(output).Should(ContainSubstring("skip_fixture_test.go:9")) - Ω(output).Should(ContainSubstring("an async top level skip on line 14")) - Ω(output).Should(ContainSubstring("skip_fixture_test.go:14")) - Ω(output).Should(ContainSubstring("a top level goroutine skip on line 21")) - Ω(output).Should(ContainSubstring("skip_fixture_test.go:21")) - - Ω(output).Should(ContainSubstring("a sync SKIP")) - Ω(output).Should(ContainSubstring("an async SKIP")) - Ω(output).Should(ContainSubstring("a goroutine SKIP")) - Ω(output).Should(ContainSubstring("a measure SKIP")) - - Ω(output).Should(ContainSubstring("S [SKIPPING] in Spec Setup (BeforeEach) [")) - Ω(output).Should(ContainSubstring("a BeforeEach SKIP")) - Ω(output).Should(ContainSubstring("S [SKIPPING] in Spec Teardown (AfterEach) [")) - Ω(output).Should(ContainSubstring("an AfterEach SKIP")) - - Ω(output).Should(ContainSubstring("0 Passed | 0 Failed | 0 Pending | 9 Skipped")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/subcommand_test.go b/vendor/github.com/onsi/ginkgo/integration/subcommand_test.go deleted file mode 100644 index 6a1913ad3..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/subcommand_test.go +++ /dev/null @@ -1,395 +0,0 @@ -package integration_test - -import ( - "io/ioutil" - "os" - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/types" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Subcommand", func() { - Describe("ginkgo bootstrap", func() { - var pkgPath string - BeforeEach(func() { - pkgPath = tmpPath("foo") - os.Mkdir(pkgPath, 0777) - }) - - It("should generate a bootstrap file, as long as one does not exist", func() { - session := startGinkgo(pkgPath, "bootstrap") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("foo_suite_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "foo_suite_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_test")) - Ω(content).Should(ContainSubstring("func TestFoo(t *testing.T) {")) - Ω(content).Should(ContainSubstring("RegisterFailHandler")) - Ω(content).Should(ContainSubstring("RunSpecs")) - - Ω(content).Should(ContainSubstring("\t" + `. "github.com/onsi/ginkgo"`)) - Ω(content).Should(ContainSubstring("\t" + `. "github.com/onsi/gomega"`)) - - session = startGinkgo(pkgPath, "bootstrap") - Eventually(session).Should(gexec.Exit(1)) - output = session.Out.Contents() - Ω(output).Should(ContainSubstring("foo_suite_test.go already exists")) - }) - - It("should import nodot declarations when told to", func() { - session := startGinkgo(pkgPath, "bootstrap", "--nodot") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("foo_suite_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "foo_suite_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_test")) - Ω(content).Should(ContainSubstring("func TestFoo(t *testing.T) {")) - Ω(content).Should(ContainSubstring("RegisterFailHandler")) - Ω(content).Should(ContainSubstring("RunSpecs")) - - Ω(content).Should(ContainSubstring("var It = ginkgo.It")) - Ω(content).Should(ContainSubstring("var Ω = gomega.Ω")) - - Ω(content).Should(ContainSubstring("\t" + `"github.com/onsi/ginkgo"`)) - Ω(content).Should(ContainSubstring("\t" + `"github.com/onsi/gomega"`)) - }) - - It("should generate an agouti bootstrap file when told to", func() { - session := startGinkgo(pkgPath, "bootstrap", "--agouti") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("foo_suite_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "foo_suite_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_test")) - Ω(content).Should(ContainSubstring("func TestFoo(t *testing.T) {")) - Ω(content).Should(ContainSubstring("RegisterFailHandler")) - Ω(content).Should(ContainSubstring("RunSpecs")) - - Ω(content).Should(ContainSubstring("\t" + `. "github.com/onsi/ginkgo"`)) - Ω(content).Should(ContainSubstring("\t" + `. "github.com/onsi/gomega"`)) - Ω(content).Should(ContainSubstring("\t" + `"github.com/sclevine/agouti"`)) - }) - - It("should generate a bootstrap file using a template when told to", func() { - templateFile := filepath.Join(pkgPath, ".bootstrap") - ioutil.WriteFile(templateFile, []byte(`package {{.Package}} - - import ( - {{.GinkgoImport}} - {{.GomegaImport}} - - "testing" - "binary" - ) - - func Test{{.FormattedName}}(t *testing.T) { - // This is a {{.Package}} test - }`), 0666) - session := startGinkgo(pkgPath, "bootstrap", "--template", templateFile) - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("foo_suite_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "foo_suite_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_test")) - Ω(content).Should(ContainSubstring(`. "github.com/onsi/ginkgo"`)) - Ω(content).Should(ContainSubstring(`. "github.com/onsi/gomega"`)) - Ω(content).Should(ContainSubstring(`"binary"`)) - Ω(content).Should(ContainSubstring("// This is a foo_test test")) - }) - }) - - Describe("nodot", func() { - It("should update the declarations in the bootstrap file", func() { - pkgPath := tmpPath("foo") - os.Mkdir(pkgPath, 0777) - - session := startGinkgo(pkgPath, "bootstrap", "--nodot") - Eventually(session).Should(gexec.Exit(0)) - - byteContent, err := ioutil.ReadFile(filepath.Join(pkgPath, "foo_suite_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - - content := string(byteContent) - content = strings.Replace(content, "var It =", "var MyIt =", -1) - content = strings.Replace(content, "var Ω = gomega.Ω\n", "", -1) - - err = ioutil.WriteFile(filepath.Join(pkgPath, "foo_suite_test.go"), []byte(content), os.ModePerm) - Ω(err).ShouldNot(HaveOccurred()) - - session = startGinkgo(pkgPath, "nodot") - Eventually(session).Should(gexec.Exit(0)) - - byteContent, err = ioutil.ReadFile(filepath.Join(pkgPath, "foo_suite_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(byteContent).Should(ContainSubstring("var MyIt = ginkgo.It")) - Ω(byteContent).ShouldNot(ContainSubstring("var It = ginkgo.It")) - Ω(byteContent).Should(ContainSubstring("var Ω = gomega.Ω")) - }) - }) - - Describe("ginkgo generate", func() { - var pkgPath string - - BeforeEach(func() { - pkgPath = tmpPath("foo_bar") - os.Mkdir(pkgPath, 0777) - }) - - Context("with no arguments", func() { - It("should generate a test file named after the package", func() { - session := startGinkgo(pkgPath, "generate") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("foo_bar_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "foo_bar_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_bar_test")) - Ω(content).Should(ContainSubstring(`var _ = Describe("FooBar", func() {`)) - Ω(content).Should(ContainSubstring("\t" + `. "github.com/onsi/ginkgo"`)) - Ω(content).Should(ContainSubstring("\t" + `. "github.com/onsi/gomega"`)) - - session = startGinkgo(pkgPath, "generate") - Eventually(session).Should(gexec.Exit(1)) - output = session.Out.Contents() - - Ω(output).Should(ContainSubstring("foo_bar_test.go already exists")) - }) - }) - - Context("with an argument of the form: foo", func() { - It("should generate a test file named after the argument", func() { - session := startGinkgo(pkgPath, "generate", "baz_buzz") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("baz_buzz_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "baz_buzz_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_bar_test")) - Ω(content).Should(ContainSubstring(`var _ = Describe("BazBuzz", func() {`)) - }) - }) - - Context("with an argument of the form: foo.go", func() { - It("should generate a test file named after the argument", func() { - session := startGinkgo(pkgPath, "generate", "baz_buzz.go") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("baz_buzz_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "baz_buzz_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_bar_test")) - Ω(content).Should(ContainSubstring(`var _ = Describe("BazBuzz", func() {`)) - - }) - }) - - Context("with an argument of the form: foo_test", func() { - It("should generate a test file named after the argument", func() { - session := startGinkgo(pkgPath, "generate", "baz_buzz_test") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("baz_buzz_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "baz_buzz_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_bar_test")) - Ω(content).Should(ContainSubstring(`var _ = Describe("BazBuzz", func() {`)) - }) - }) - - Context("with an argument of the form: foo_test.go", func() { - It("should generate a test file named after the argument", func() { - session := startGinkgo(pkgPath, "generate", "baz_buzz_test.go") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("baz_buzz_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "baz_buzz_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_bar_test")) - Ω(content).Should(ContainSubstring(`var _ = Describe("BazBuzz", func() {`)) - }) - }) - - Context("with multiple arguments", func() { - It("should generate a test file named after the argument", func() { - session := startGinkgo(pkgPath, "generate", "baz", "buzz") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("baz_test.go")) - Ω(output).Should(ContainSubstring("buzz_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "baz_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_bar_test")) - Ω(content).Should(ContainSubstring(`var _ = Describe("Baz", func() {`)) - - content, err = ioutil.ReadFile(filepath.Join(pkgPath, "buzz_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_bar_test")) - Ω(content).Should(ContainSubstring(`var _ = Describe("Buzz", func() {`)) - }) - }) - - Context("with nodot", func() { - It("should not import ginkgo or gomega", func() { - session := startGinkgo(pkgPath, "generate", "--nodot") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("foo_bar_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "foo_bar_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_bar_test")) - Ω(content).ShouldNot(ContainSubstring("\t" + `. "github.com/onsi/ginkgo"`)) - Ω(content).ShouldNot(ContainSubstring("\t" + `. "github.com/onsi/gomega"`)) - }) - }) - - Context("with agouti", func() { - It("should generate an agouti test file", func() { - session := startGinkgo(pkgPath, "generate", "--agouti") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("foo_bar_test.go")) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "foo_bar_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package foo_bar_test")) - Ω(content).Should(ContainSubstring("\t" + `. "github.com/onsi/ginkgo"`)) - Ω(content).Should(ContainSubstring("\t" + `. "github.com/onsi/gomega"`)) - Ω(content).Should(ContainSubstring("\t" + `. "github.com/sclevine/agouti/matchers"`)) - Ω(content).Should(ContainSubstring("\t" + `"github.com/sclevine/agouti"`)) - Ω(content).Should(ContainSubstring("page, err = agoutiDriver.NewPage()")) - }) - }) - }) - - Describe("ginkgo bootstrap/generate", func() { - var pkgPath string - BeforeEach(func() { - pkgPath = tmpPath("some crazy-thing") - os.Mkdir(pkgPath, 0777) - }) - - Context("when the working directory is empty", func() { - It("generates correctly named bootstrap and generate files with a package name derived from the directory", func() { - session := startGinkgo(pkgPath, "bootstrap") - Eventually(session).Should(gexec.Exit(0)) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "some_crazy_thing_suite_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package some_crazy_thing_test")) - Ω(content).Should(ContainSubstring("SomeCrazyThing Suite")) - - session = startGinkgo(pkgPath, "generate") - Eventually(session).Should(gexec.Exit(0)) - - content, err = ioutil.ReadFile(filepath.Join(pkgPath, "some_crazy_thing_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package some_crazy_thing_test")) - Ω(content).Should(ContainSubstring("SomeCrazyThing")) - }) - }) - - Context("when the working directory contains a file with a package name", func() { - BeforeEach(func() { - Ω(ioutil.WriteFile(filepath.Join(pkgPath, "foo.go"), []byte("package main\n\nfunc main() {}"), 0777)).Should(Succeed()) - }) - - It("generates correctly named bootstrap and generate files with the package name", func() { - session := startGinkgo(pkgPath, "bootstrap") - Eventually(session).Should(gexec.Exit(0)) - - content, err := ioutil.ReadFile(filepath.Join(pkgPath, "some_crazy_thing_suite_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package main_test")) - Ω(content).Should(ContainSubstring("SomeCrazyThing Suite")) - - session = startGinkgo(pkgPath, "generate") - Eventually(session).Should(gexec.Exit(0)) - - content, err = ioutil.ReadFile(filepath.Join(pkgPath, "some_crazy_thing_test.go")) - Ω(err).ShouldNot(HaveOccurred()) - Ω(content).Should(ContainSubstring("package main_test")) - Ω(content).Should(ContainSubstring("SomeCrazyThing")) - }) - }) - }) - - Describe("ginkgo blur", func() { - It("should unfocus tests", func() { - pathToTest := tmpPath("focused") - copyIn("focused_fixture", pathToTest) - - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(types.GINKGO_FOCUS_EXIT_CODE)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("6 Passed")) - Ω(output).Should(ContainSubstring("5 Skipped")) - - session = startGinkgo(pathToTest, "blur") - Eventually(session).Should(gexec.Exit(0)) - - session = startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(0)) - output = session.Out.Contents() - Ω(output).Should(ContainSubstring("11 Passed")) - Ω(output).Should(ContainSubstring("0 Skipped")) - }) - }) - - Describe("ginkgo version", func() { - It("should print out the version info", func() { - session := startGinkgo("", "version") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(MatchRegexp(`Ginkgo Version \d+\.\d+\.\d+`)) - }) - }) - - Describe("ginkgo help", func() { - It("should print out usage information", func() { - session := startGinkgo("", "help") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Err.Contents()) - - Ω(output).Should(MatchRegexp(`Ginkgo Version \d+\.\d+\.\d+`)) - Ω(output).Should(ContainSubstring("ginkgo watch")) - Ω(output).Should(ContainSubstring("-succinct")) - Ω(output).Should(ContainSubstring("-nodes")) - Ω(output).Should(ContainSubstring("ginkgo generate")) - Ω(output).Should(ContainSubstring("ginkgo help ")) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/suite_command_test.go b/vendor/github.com/onsi/ginkgo/integration/suite_command_test.go deleted file mode 100644 index 4bd46f015..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/suite_command_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package integration_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Suite Command Specs", func() { - var pathToTest string - - BeforeEach(func() { - pathToTest = tmpPath("suite_command") - copyIn("suite_command_tests", pathToTest) - }) - - It("Runs command after suite echoing out suite data, properly reporting suite name and passing status in successful command output", func() { - command := "-afterSuiteHook=echo THIS IS A (ginkgo-suite-passed) TEST OF THE (ginkgo-suite-name) SYSTEM, THIS IS ONLY A TEST" - expected := "THIS IS A [PASS] TEST OF THE suite_command SYSTEM, THIS IS ONLY A TEST" - session := startGinkgo(pathToTest, command) - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("1 Passed")) - Ω(output).Should(ContainSubstring("0 Failed")) - Ω(output).Should(ContainSubstring("1 Pending")) - Ω(output).Should(ContainSubstring("0 Skipped")) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - Ω(output).Should(ContainSubstring("Post-suite command succeeded:")) - Ω(output).Should(ContainSubstring(expected)) - }) - - It("Runs command after suite reporting that command failed", func() { - command := "-afterSuiteHook=exit 1" - session := startGinkgo(pathToTest, command) - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("1 Passed")) - Ω(output).Should(ContainSubstring("0 Failed")) - Ω(output).Should(ContainSubstring("1 Pending")) - Ω(output).Should(ContainSubstring("0 Skipped")) - Ω(output).Should(ContainSubstring("Test Suite Passed")) - Ω(output).Should(ContainSubstring("Post-suite command failed:")) - }) - - It("Runs command after suite echoing out suite data, properly reporting suite name and failing status in successful command output", func() { - command := "-afterSuiteHook=echo THIS IS A (ginkgo-suite-passed) TEST OF THE (ginkgo-suite-name) SYSTEM, THIS IS ONLY A TEST" - expected := "THIS IS A [FAIL] TEST OF THE suite_command SYSTEM, THIS IS ONLY A TEST" - session := startGinkgo(pathToTest, "-failOnPending=true", command) - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("1 Passed")) - Ω(output).Should(ContainSubstring("0 Failed")) - Ω(output).Should(ContainSubstring("1 Pending")) - Ω(output).Should(ContainSubstring("0 Skipped")) - Ω(output).Should(ContainSubstring("Test Suite Failed")) - Ω(output).Should(ContainSubstring("Post-suite command succeeded:")) - Ω(output).Should(ContainSubstring(expected)) - }) - -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/suite_setup_test.go b/vendor/github.com/onsi/ginkgo/integration/suite_setup_test.go deleted file mode 100644 index b9313db59..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/suite_setup_test.go +++ /dev/null @@ -1,178 +0,0 @@ -package integration_test - -import ( - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("SuiteSetup", func() { - var pathToTest string - - Context("when the BeforeSuite and AfterSuite pass", func() { - BeforeEach(func() { - pathToTest = tmpPath("suite_setup") - copyIn("passing_suite_setup", pathToTest) - }) - - It("should run the BeforeSuite once, then run all the tests", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(strings.Count(output, "BEFORE SUITE")).Should(Equal(1)) - Ω(strings.Count(output, "AFTER SUITE")).Should(Equal(1)) - }) - - It("should run the BeforeSuite once per parallel node, then run all the tests", func() { - session := startGinkgo(pathToTest, "--noColor", "--nodes=2") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(strings.Count(output, "BEFORE SUITE")).Should(Equal(2)) - Ω(strings.Count(output, "AFTER SUITE")).Should(Equal(2)) - }) - }) - - Context("when the BeforeSuite fails", func() { - BeforeEach(func() { - pathToTest = tmpPath("suite_setup") - copyIn("failing_before_suite", pathToTest) - }) - - It("should run the BeforeSuite once, none of the tests, but it should run the AfterSuite", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - Ω(strings.Count(output, "BEFORE SUITE")).Should(Equal(1)) - Ω(strings.Count(output, "Test Panicked")).Should(Equal(1)) - Ω(strings.Count(output, "AFTER SUITE")).Should(Equal(1)) - Ω(output).ShouldNot(ContainSubstring("NEVER SEE THIS")) - }) - - It("should run the BeforeSuite once per parallel node, none of the tests, but it should run the AfterSuite for each node", func() { - session := startGinkgo(pathToTest, "--noColor", "--nodes=2") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - Ω(strings.Count(output, "BEFORE SUITE")).Should(Equal(2)) - Ω(strings.Count(output, "Test Panicked")).Should(Equal(2)) - Ω(strings.Count(output, "AFTER SUITE")).Should(Equal(2)) - Ω(output).ShouldNot(ContainSubstring("NEVER SEE THIS")) - }) - }) - - Context("when the AfterSuite fails", func() { - BeforeEach(func() { - pathToTest = tmpPath("suite_setup") - copyIn("failing_after_suite", pathToTest) - }) - - It("should run the BeforeSuite once, none of the tests, but it should run the AfterSuite", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - Ω(strings.Count(output, "BEFORE SUITE")).Should(Equal(1)) - Ω(strings.Count(output, "AFTER SUITE")).Should(Equal(1)) - Ω(strings.Count(output, "Test Panicked")).Should(Equal(1)) - Ω(strings.Count(output, "A TEST")).Should(Equal(2)) - }) - - It("should run the BeforeSuite once per parallel node, none of the tests, but it should run the AfterSuite for each node", func() { - session := startGinkgo(pathToTest, "--noColor", "--nodes=2") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - Ω(strings.Count(output, "BEFORE SUITE")).Should(Equal(2)) - Ω(strings.Count(output, "AFTER SUITE")).Should(Equal(2)) - Ω(strings.Count(output, "Test Panicked")).Should(Equal(2)) - Ω(strings.Count(output, "A TEST")).Should(Equal(2)) - }) - }) - - Context("With passing synchronized before and after suites", func() { - BeforeEach(func() { - pathToTest = tmpPath("suite_setup") - copyIn("synchronized_setup_tests", pathToTest) - }) - - Context("when run with one node", func() { - It("should do all the work on that one node", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("BEFORE_A_1\nBEFORE_B_1: DATA")) - Ω(output).Should(ContainSubstring("AFTER_A_1\nAFTER_B_1")) - }) - }) - - Context("when run across multiple nodes", func() { - It("should run the first BeforeSuite function (BEFORE_A) on node 1, the second (BEFORE_B) on all the nodes, the first AfterSuite (AFTER_A) on all the nodes, and then the second (AFTER_B) on Node 1 *after* everything else is finished", func() { - session := startGinkgo(pathToTest, "--noColor", "--nodes=3") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("BEFORE_A_1")) - Ω(output).Should(ContainSubstring("BEFORE_B_1: DATA")) - Ω(output).Should(ContainSubstring("BEFORE_B_2: DATA")) - Ω(output).Should(ContainSubstring("BEFORE_B_3: DATA")) - - Ω(output).ShouldNot(ContainSubstring("BEFORE_A_2")) - Ω(output).ShouldNot(ContainSubstring("BEFORE_A_3")) - - Ω(output).Should(ContainSubstring("AFTER_A_1")) - Ω(output).Should(ContainSubstring("AFTER_A_2")) - Ω(output).Should(ContainSubstring("AFTER_A_3")) - Ω(output).Should(ContainSubstring("AFTER_B_1")) - - Ω(output).ShouldNot(ContainSubstring("AFTER_B_2")) - Ω(output).ShouldNot(ContainSubstring("AFTER_B_3")) - }) - }) - - Context("when streaming across multiple nodes", func() { - It("should run the first BeforeSuite function (BEFORE_A) on node 1, the second (BEFORE_B) on all the nodes, the first AfterSuite (AFTER_A) on all the nodes, and then the second (AFTER_B) on Node 1 *after* everything else is finished", func() { - session := startGinkgo(pathToTest, "--noColor", "--nodes=3", "--stream") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("[1] BEFORE_A_1")) - Ω(output).Should(ContainSubstring("[1] BEFORE_B_1: DATA")) - Ω(output).Should(ContainSubstring("[2] BEFORE_B_2: DATA")) - Ω(output).Should(ContainSubstring("[3] BEFORE_B_3: DATA")) - - Ω(output).ShouldNot(ContainSubstring("BEFORE_A_2")) - Ω(output).ShouldNot(ContainSubstring("BEFORE_A_3")) - - Ω(output).Should(ContainSubstring("[1] AFTER_A_1")) - Ω(output).Should(ContainSubstring("[2] AFTER_A_2")) - Ω(output).Should(ContainSubstring("[3] AFTER_A_3")) - Ω(output).Should(ContainSubstring("[1] AFTER_B_1")) - - Ω(output).ShouldNot(ContainSubstring("AFTER_B_2")) - Ω(output).ShouldNot(ContainSubstring("AFTER_B_3")) - }) - }) - }) - - Context("With a failing synchronized before suite", func() { - BeforeEach(func() { - pathToTest = tmpPath("suite_setup") - copyIn("exiting_synchronized_setup_tests", pathToTest) - }) - - It("should fail and let the user know that node 1 disappeared prematurely", func() { - session := startGinkgo(pathToTest, "--noColor", "--nodes=3") - Eventually(session).Should(gexec.Exit(1)) - output := string(session.Out.Contents()) - - Ω(output).Should(ContainSubstring("Node 1 disappeared before completing BeforeSuite")) - Ω(output).Should(ContainSubstring("Ginkgo timed out waiting for all parallel nodes to report back!")) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/tags_test.go b/vendor/github.com/onsi/ginkgo/integration/tags_test.go deleted file mode 100644 index 626635bf5..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/tags_test.go +++ /dev/null @@ -1,27 +0,0 @@ -package integration_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Tags", func() { - var pathToTest string - BeforeEach(func() { - pathToTest = tmpPath("tags") - copyIn("tags_tests", pathToTest) - }) - - It("should honor the passed in -tags flag", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(0)) - output := string(session.Out.Contents()) - Ω(output).Should(ContainSubstring("Ran 1 of 1 Specs")) - - session = startGinkgo(pathToTest, "--noColor", "-tags=complex_tests") - Eventually(session).Should(gexec.Exit(0)) - output = string(session.Out.Contents()) - Ω(output).Should(ContainSubstring("Ran 3 of 3 Specs")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/test_description_test.go b/vendor/github.com/onsi/ginkgo/integration/test_description_test.go deleted file mode 100644 index 70a8f04ef..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/test_description_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package integration_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gbytes" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("TestDescription", func() { - var pathToTest string - - BeforeEach(func() { - pathToTest = tmpPath("test_description") - copyIn("test_description", pathToTest) - }) - - It("should capture and emit information about the current test", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(1)) - - Ω(session).Should(gbytes.Say("TestDescription should pass:false")) - Ω(session).Should(gbytes.Say("TestDescription should fail:true")) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/verbose_and_succinct_test.go b/vendor/github.com/onsi/ginkgo/integration/verbose_and_succinct_test.go deleted file mode 100644 index aba9a6b0e..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/verbose_and_succinct_test.go +++ /dev/null @@ -1,90 +0,0 @@ -package integration_test - -import ( - "regexp" - "runtime" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Verbose And Succinct Mode", func() { - var pathToTest string - var otherPathToTest string - - isWindows := (runtime.GOOS == "windows") - denoter := "•" - - if isWindows { - denoter = "+" - } - - Context("when running one package", func() { - BeforeEach(func() { - pathToTest = tmpPath("ginkgo") - copyIn("passing_ginkgo_tests", pathToTest) - }) - - It("should default to non-succinct mode", func() { - session := startGinkgo(pathToTest, "--noColor") - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("Running Suite: Passing_ginkgo_tests Suite")) - }) - }) - - Context("when running more than one package", func() { - BeforeEach(func() { - pathToTest = tmpPath("ginkgo") - copyIn("passing_ginkgo_tests", pathToTest) - otherPathToTest = tmpPath("more_ginkgo") - copyIn("more_ginkgo_tests", otherPathToTest) - }) - - Context("with no flags set", func() { - It("should default to succinct mode", func() { - session := startGinkgo(pathToTest, "--noColor", pathToTest, otherPathToTest) - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(MatchRegexp(`\] Passing_ginkgo_tests Suite - 4/4 specs [%s]{4} SUCCESS!`, regexp.QuoteMeta(denoter))) - Ω(output).Should(MatchRegexp(`\] More_ginkgo_tests Suite - 2/2 specs [%s]{2} SUCCESS!`, regexp.QuoteMeta(denoter))) - }) - }) - - Context("with --succinct=false", func() { - It("should not be in succinct mode", func() { - session := startGinkgo(pathToTest, "--noColor", "--succinct=false", pathToTest, otherPathToTest) - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("Running Suite: Passing_ginkgo_tests Suite")) - Ω(output).Should(ContainSubstring("Running Suite: More_ginkgo_tests Suite")) - }) - }) - - Context("with -v", func() { - It("should not be in succinct mode, but should be verbose", func() { - session := startGinkgo(pathToTest, "--noColor", "-v", pathToTest, otherPathToTest) - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("Running Suite: Passing_ginkgo_tests Suite")) - Ω(output).Should(ContainSubstring("Running Suite: More_ginkgo_tests Suite")) - Ω(output).Should(ContainSubstring("should proxy strings")) - Ω(output).Should(ContainSubstring("should always pass")) - }) - - It("should emit output from Bys", func() { - session := startGinkgo(pathToTest, "--noColor", "-v", pathToTest) - Eventually(session).Should(gexec.Exit(0)) - output := session.Out.Contents() - - Ω(output).Should(ContainSubstring("emitting one By")) - Ω(output).Should(ContainSubstring("emitting another By")) - }) - }) - }) -}) diff --git a/vendor/github.com/onsi/ginkgo/integration/watch_test.go b/vendor/github.com/onsi/ginkgo/integration/watch_test.go deleted file mode 100644 index c18e8f871..000000000 --- a/vendor/github.com/onsi/ginkgo/integration/watch_test.go +++ /dev/null @@ -1,275 +0,0 @@ -package integration_test - -import ( - "io/ioutil" - "os" - "path/filepath" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gbytes" - "github.com/onsi/gomega/gexec" -) - -var _ = Describe("Watch", func() { - var rootPath string - var pathA string - var pathB string - var pathC string - var session *gexec.Session - - BeforeEach(func() { - rootPath = tmpPath("root") - pathA = filepath.Join(rootPath, "src", "github.com", "onsi", "A") - pathB = filepath.Join(rootPath, "src", "github.com", "onsi", "B") - pathC = filepath.Join(rootPath, "src", "github.com", "onsi", "C") - - err := os.MkdirAll(pathA, 0700) - Ω(err).ShouldNot(HaveOccurred()) - - err = os.MkdirAll(pathB, 0700) - Ω(err).ShouldNot(HaveOccurred()) - - err = os.MkdirAll(pathC, 0700) - Ω(err).ShouldNot(HaveOccurred()) - - copyIn(filepath.Join("watch_fixtures", "A"), pathA) - copyIn(filepath.Join("watch_fixtures", "B"), pathB) - copyIn(filepath.Join("watch_fixtures", "C"), pathC) - }) - - startGinkgoWithGopath := func(args ...string) *gexec.Session { - cmd := ginkgoCommand(rootPath, args...) - cmd.Env = append([]string{"GOPATH=" + rootPath + ":" + os.Getenv("GOPATH")}, os.Environ()...) - session, err := gexec.Start(cmd, GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - return session - } - - modifyFile := func(path string) { - time.Sleep(time.Second) - content, err := ioutil.ReadFile(path) - Ω(err).ShouldNot(HaveOccurred()) - content = append(content, []byte("//")...) - err = ioutil.WriteFile(path, content, 0666) - Ω(err).ShouldNot(HaveOccurred()) - } - - modifyCode := func(pkgToModify string) { - modifyFile(filepath.Join(rootPath, "src", "github.com", "onsi", pkgToModify, pkgToModify+".go")) - } - - modifyJSON := func(pkgToModify string) { - modifyFile(filepath.Join(rootPath, "src", "github.com", "onsi", pkgToModify, pkgToModify+".json")) - } - - modifyTest := func(pkgToModify string) { - modifyFile(filepath.Join(rootPath, "src", "github.com", "onsi", pkgToModify, pkgToModify+"_test.go")) - } - - AfterEach(func() { - if session != nil { - session.Kill().Wait() - } - }) - - It("should be set up correctly", func() { - session = startGinkgoWithGopath("-r") - Eventually(session).Should(gexec.Exit(0)) - Ω(session.Out.Contents()).Should(ContainSubstring("A Suite")) - Ω(session.Out.Contents()).Should(ContainSubstring("B Suite")) - Ω(session.Out.Contents()).Should(ContainSubstring("C Suite")) - Ω(session.Out.Contents()).Should(ContainSubstring("Ginkgo ran 3 suites")) - }) - - Context("when watching just one test suite", func() { - It("should immediately run, and should rerun when the test suite changes", func() { - session = startGinkgoWithGopath("watch", "-succinct", pathA) - Eventually(session).Should(gbytes.Say("A Suite")) - modifyCode("A") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("A Suite")) - session.Kill().Wait() - }) - }) - - Context("when watching several test suites", func() { - It("should not immediately run, but should rerun a test when its code changes", func() { - session = startGinkgoWithGopath("watch", "-succinct", "-r") - Eventually(session).Should(gbytes.Say("Identified 3 test suites")) - Consistently(session).ShouldNot(gbytes.Say("A Suite|B Suite|C Suite")) - modifyCode("A") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("A Suite")) - Consistently(session).ShouldNot(gbytes.Say("B Suite|C Suite")) - session.Kill().Wait() - }) - }) - - Describe("watching dependencies", func() { - Context("with a depth of 2", func() { - It("should watch down to that depth", func() { - session = startGinkgoWithGopath("watch", "-succinct", "-r", "-depth=2") - Eventually(session).Should(gbytes.Say("Identified 3 test suites")) - Eventually(session).Should(gbytes.Say(`A \[2 dependencies\]`)) - Eventually(session).Should(gbytes.Say(`B \[1 dependency\]`)) - Eventually(session).Should(gbytes.Say(`C \[0 dependencies\]`)) - - modifyCode("A") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("A Suite")) - Consistently(session).ShouldNot(gbytes.Say("B Suite|C Suite")) - - modifyCode("B") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("B Suite")) - Eventually(session).Should(gbytes.Say("A Suite")) - Consistently(session).ShouldNot(gbytes.Say("C Suite")) - - modifyCode("C") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("C Suite")) - Eventually(session).Should(gbytes.Say("B Suite")) - Eventually(session).Should(gbytes.Say("A Suite")) - }) - }) - - Context("with a depth of 1", func() { - It("should watch down to that depth", func() { - session = startGinkgoWithGopath("watch", "-succinct", "-r", "-depth=1") - Eventually(session).Should(gbytes.Say("Identified 3 test suites")) - Eventually(session).Should(gbytes.Say(`A \[1 dependency\]`)) - Eventually(session).Should(gbytes.Say(`B \[1 dependency\]`)) - Eventually(session).Should(gbytes.Say(`C \[0 dependencies\]`)) - - modifyCode("A") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("A Suite")) - Consistently(session).ShouldNot(gbytes.Say("B Suite|C Suite")) - - modifyCode("B") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("B Suite")) - Eventually(session).Should(gbytes.Say("A Suite")) - Consistently(session).ShouldNot(gbytes.Say("C Suite")) - - modifyCode("C") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("C Suite")) - Eventually(session).Should(gbytes.Say("B Suite")) - Consistently(session).ShouldNot(gbytes.Say("A Suite")) - }) - }) - - Context("with a depth of 0", func() { - It("should not watch any dependencies", func() { - session = startGinkgoWithGopath("watch", "-succinct", "-r", "-depth=0") - Eventually(session).Should(gbytes.Say("Identified 3 test suites")) - Eventually(session).Should(gbytes.Say(`A \[0 dependencies\]`)) - Eventually(session).Should(gbytes.Say(`B \[0 dependencies\]`)) - Eventually(session).Should(gbytes.Say(`C \[0 dependencies\]`)) - - modifyCode("A") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("A Suite")) - Consistently(session).ShouldNot(gbytes.Say("B Suite|C Suite")) - - modifyCode("B") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("B Suite")) - Consistently(session).ShouldNot(gbytes.Say("A Suite|C Suite")) - - modifyCode("C") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("C Suite")) - Consistently(session).ShouldNot(gbytes.Say("A Suite|B Suite")) - }) - }) - - It("should not trigger dependents when tests are changed", func() { - session = startGinkgoWithGopath("watch", "-succinct", "-r", "-depth=2") - Eventually(session).Should(gbytes.Say("Identified 3 test suites")) - Eventually(session).Should(gbytes.Say(`A \[2 dependencies\]`)) - Eventually(session).Should(gbytes.Say(`B \[1 dependency\]`)) - Eventually(session).Should(gbytes.Say(`C \[0 dependencies\]`)) - - modifyTest("A") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("A Suite")) - Consistently(session).ShouldNot(gbytes.Say("B Suite|C Suite")) - - modifyTest("B") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("B Suite")) - Consistently(session).ShouldNot(gbytes.Say("A Suite|C Suite")) - - modifyTest("C") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("C Suite")) - Consistently(session).ShouldNot(gbytes.Say("A Suite|B Suite")) - }) - }) - - Describe("adjusting the watch regular expression", func() { - Describe("the default regular expression", func() { - It("should only trigger when go files are changed", func() { - session = startGinkgoWithGopath("watch", "-succinct", "-r", "-depth=2") - Eventually(session).Should(gbytes.Say("Identified 3 test suites")) - Eventually(session).Should(gbytes.Say(`A \[2 dependencies\]`)) - Eventually(session).Should(gbytes.Say(`B \[1 dependency\]`)) - Eventually(session).Should(gbytes.Say(`C \[0 dependencies\]`)) - - modifyJSON("C") - Consistently(session).ShouldNot(gbytes.Say("Detected changes in")) - Consistently(session).ShouldNot(gbytes.Say("A Suite|B Suite|C Suite")) - }) - }) - - Describe("modifying the regular expression", func() { - It("should trigger if the regexp matches", func() { - session = startGinkgoWithGopath("watch", "-succinct", "-r", "-depth=2", `-watchRegExp=\.json$`) - Eventually(session).Should(gbytes.Say("Identified 3 test suites")) - Eventually(session).Should(gbytes.Say(`A \[2 dependencies\]`)) - Eventually(session).Should(gbytes.Say(`B \[1 dependency\]`)) - Eventually(session).Should(gbytes.Say(`C \[0 dependencies\]`)) - - modifyJSON("C") - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("C Suite")) - Eventually(session).Should(gbytes.Say("B Suite")) - Eventually(session).Should(gbytes.Say("A Suite")) - }) - }) - }) - - Describe("when new test suite is added", func() { - It("should start monitoring that test suite", func() { - session = startGinkgoWithGopath("watch", "-succinct", "-r") - - Eventually(session).Should(gbytes.Say("Watching 3 suites")) - - pathD := filepath.Join(rootPath, "src", "github.com", "onsi", "D") - - err := os.MkdirAll(pathD, 0700) - Ω(err).ShouldNot(HaveOccurred()) - - copyIn(filepath.Join("watch_fixtures", "D"), pathD) - - Eventually(session).Should(gbytes.Say("Detected 1 new suite")) - Eventually(session).Should(gbytes.Say(`D \[1 dependency\]`)) - Eventually(session).Should(gbytes.Say("D Suite")) - - modifyCode("D") - - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("D Suite")) - - modifyCode("C") - - Eventually(session).Should(gbytes.Say("Detected changes in")) - Eventually(session).Should(gbytes.Say("C Suite")) - Eventually(session).Should(gbytes.Say("D Suite")) - }) - }) -}) diff --git a/vendor/github.com/onsi/gomega/gbytes/buffer.go b/vendor/github.com/onsi/gomega/gbytes/buffer.go deleted file mode 100644 index 336086f4a..000000000 --- a/vendor/github.com/onsi/gomega/gbytes/buffer.go +++ /dev/null @@ -1,245 +0,0 @@ -/* -Package gbytes provides a buffer that supports incrementally detecting input. - -You use gbytes.Buffer with the gbytes.Say matcher. When Say finds a match, it fastforwards the buffer's read cursor to the end of that match. - -Subsequent matches against the buffer will only operate against data that appears *after* the read cursor. - -The read cursor is an opaque implementation detail that you cannot access. You should use the Say matcher to sift through the buffer. You can always -access the entire buffer's contents with Contents(). - -*/ -package gbytes - -import ( - "errors" - "fmt" - "io" - "regexp" - "sync" - "time" -) - -/* -gbytes.Buffer implements an io.Writer and can be used with the gbytes.Say matcher. - -You should only use a gbytes.Buffer in test code. It stores all writes in an in-memory buffer - behavior that is inappropriate for production code! -*/ -type Buffer struct { - contents []byte - readCursor uint64 - lock *sync.Mutex - detectCloser chan interface{} - closed bool -} - -/* -NewBuffer returns a new gbytes.Buffer -*/ -func NewBuffer() *Buffer { - return &Buffer{ - lock: &sync.Mutex{}, - } -} - -/* -BufferWithBytes returns a new gbytes.Buffer seeded with the passed in bytes -*/ -func BufferWithBytes(bytes []byte) *Buffer { - return &Buffer{ - lock: &sync.Mutex{}, - contents: bytes, - } -} - -/* -BufferReader returns a new gbytes.Buffer that wraps a reader. The reader's contents are read into -the Buffer via io.Copy -*/ -func BufferReader(reader io.Reader) *Buffer { - b := &Buffer{ - lock: &sync.Mutex{}, - } - - go func() { - io.Copy(b, reader) - b.Close() - }() - - return b -} - -/* -Write implements the io.Writer interface -*/ -func (b *Buffer) Write(p []byte) (n int, err error) { - b.lock.Lock() - defer b.lock.Unlock() - - if b.closed { - return 0, errors.New("attempt to write to closed buffer") - } - - b.contents = append(b.contents, p...) - return len(p), nil -} - -/* -Read implements the io.Reader interface. It advances the -cursor as it reads. - -Returns an error if called after Close. -*/ -func (b *Buffer) Read(d []byte) (int, error) { - b.lock.Lock() - defer b.lock.Unlock() - - if b.closed { - return 0, errors.New("attempt to read from closed buffer") - } - - if uint64(len(b.contents)) <= b.readCursor { - return 0, io.EOF - } - - n := copy(d, b.contents[b.readCursor:]) - b.readCursor += uint64(n) - - return n, nil -} - -/* -Close signifies that the buffer will no longer be written to -*/ -func (b *Buffer) Close() error { - b.lock.Lock() - defer b.lock.Unlock() - - b.closed = true - - return nil -} - -/* -Closed returns true if the buffer has been closed -*/ -func (b *Buffer) Closed() bool { - b.lock.Lock() - defer b.lock.Unlock() - - return b.closed -} - -/* -Contents returns all data ever written to the buffer. -*/ -func (b *Buffer) Contents() []byte { - b.lock.Lock() - defer b.lock.Unlock() - - contents := make([]byte, len(b.contents)) - copy(contents, b.contents) - return contents -} - -/* -Detect takes a regular expression and returns a channel. - -The channel will receive true the first time data matching the regular expression is written to the buffer. -The channel is subsequently closed and the buffer's read-cursor is fast-forwarded to just after the matching region. - -You typically don't need to use Detect and should use the ghttp.Say matcher instead. Detect is useful, however, in cases where your code must -be branch and handle different outputs written to the buffer. - -For example, consider a buffer hooked up to the stdout of a client library. You may (or may not, depending on state outside of your control) need to authenticate the client library. - -You could do something like: - -select { -case <-buffer.Detect("You are not logged in"): - //log in -case <-buffer.Detect("Success"): - //carry on -case <-time.After(time.Second): - //welp -} -buffer.CancelDetects() - -You should always call CancelDetects after using Detect. This will close any channels that have not detected and clean up the goroutines that were spawned to support them. - -Finally, you can pass detect a format string followed by variadic arguments. This will construct the regexp using fmt.Sprintf. -*/ -func (b *Buffer) Detect(desired string, args ...interface{}) chan bool { - formattedRegexp := desired - if len(args) > 0 { - formattedRegexp = fmt.Sprintf(desired, args...) - } - re := regexp.MustCompile(formattedRegexp) - - b.lock.Lock() - defer b.lock.Unlock() - - if b.detectCloser == nil { - b.detectCloser = make(chan interface{}) - } - - closer := b.detectCloser - response := make(chan bool) - go func() { - ticker := time.NewTicker(10 * time.Millisecond) - defer ticker.Stop() - defer close(response) - for { - select { - case <-ticker.C: - b.lock.Lock() - data, cursor := b.contents[b.readCursor:], b.readCursor - loc := re.FindIndex(data) - b.lock.Unlock() - - if loc != nil { - response <- true - b.lock.Lock() - newCursorPosition := cursor + uint64(loc[1]) - if newCursorPosition >= b.readCursor { - b.readCursor = newCursorPosition - } - b.lock.Unlock() - return - } - case <-closer: - return - } - } - }() - - return response -} - -/* -CancelDetects cancels any pending detects and cleans up their goroutines. You should always call this when you're done with a set of Detect channels. -*/ -func (b *Buffer) CancelDetects() { - b.lock.Lock() - defer b.lock.Unlock() - - close(b.detectCloser) - b.detectCloser = nil -} - -func (b *Buffer) didSay(re *regexp.Regexp) (bool, []byte) { - b.lock.Lock() - defer b.lock.Unlock() - - unreadBytes := b.contents[b.readCursor:] - copyOfUnreadBytes := make([]byte, len(unreadBytes)) - copy(copyOfUnreadBytes, unreadBytes) - - loc := re.FindIndex(unreadBytes) - - if loc != nil { - b.readCursor += uint64(loc[1]) - return true, copyOfUnreadBytes - } - return false, copyOfUnreadBytes -} diff --git a/vendor/github.com/onsi/gomega/gbytes/buffer_test.go b/vendor/github.com/onsi/gomega/gbytes/buffer_test.go deleted file mode 100644 index 655a3474b..000000000 --- a/vendor/github.com/onsi/gomega/gbytes/buffer_test.go +++ /dev/null @@ -1,205 +0,0 @@ -package gbytes_test - -import ( - "io" - "time" - - . "github.com/onsi/gomega/gbytes" - - "bytes" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -type SlowReader struct { - R io.Reader - D time.Duration -} - -func (s SlowReader) Read(p []byte) (int, error) { - time.Sleep(s.D) - return s.R.Read(p) -} - -var _ = Describe("Buffer", func() { - var buffer *Buffer - - BeforeEach(func() { - buffer = NewBuffer() - }) - - Describe("dumping the entire contents of the buffer", func() { - It("should return everything that's been written", func() { - buffer.Write([]byte("abc")) - buffer.Write([]byte("def")) - Ω(buffer.Contents()).Should(Equal([]byte("abcdef"))) - - Ω(buffer).Should(Say("bcd")) - Ω(buffer.Contents()).Should(Equal([]byte("abcdef"))) - }) - }) - - Describe("creating a buffer with bytes", func() { - It("should create the buffer with the cursor set to the beginning", func() { - buffer := BufferWithBytes([]byte("abcdef")) - Ω(buffer.Contents()).Should(Equal([]byte("abcdef"))) - Ω(buffer).Should(Say("abc")) - Ω(buffer).ShouldNot(Say("abc")) - Ω(buffer).Should(Say("def")) - }) - }) - - Describe("creating a buffer that wraps a reader", func() { - Context("for a well-behaved reader", func() { - It("should buffer the contents of the reader", func() { - reader := bytes.NewBuffer([]byte("abcdef")) - buffer := BufferReader(reader) - Eventually(buffer).Should(Say("abc")) - Ω(buffer).ShouldNot(Say("abc")) - Eventually(buffer).Should(Say("def")) - Eventually(buffer.Closed).Should(BeTrue()) - }) - }) - - Context("for a slow reader", func() { - It("should allow Eventually to time out", func() { - slowReader := SlowReader{ - R: bytes.NewBuffer([]byte("abcdef")), - D: time.Second, - } - buffer := BufferReader(slowReader) - failures := InterceptGomegaFailures(func() { - Eventually(buffer, 100*time.Millisecond).Should(Say("abc")) - }) - Ω(failures).ShouldNot(BeEmpty()) - - fastReader := SlowReader{ - R: bytes.NewBuffer([]byte("abcdef")), - D: time.Millisecond, - } - buffer = BufferReader(fastReader) - Eventually(buffer, 100*time.Millisecond).Should(Say("abc")) - Eventually(buffer.Closed).Should(BeTrue()) - }) - }) - }) - - Describe("reading from a buffer", func() { - It("should read the current contents of the buffer", func() { - buffer := BufferWithBytes([]byte("abcde")) - - dest := make([]byte, 3) - n, err := buffer.Read(dest) - Ω(err).ShouldNot(HaveOccurred()) - Ω(n).Should(Equal(3)) - Ω(string(dest)).Should(Equal("abc")) - - dest = make([]byte, 3) - n, err = buffer.Read(dest) - Ω(err).ShouldNot(HaveOccurred()) - Ω(n).Should(Equal(2)) - Ω(string(dest[:n])).Should(Equal("de")) - - n, err = buffer.Read(dest) - Ω(err).Should(Equal(io.EOF)) - Ω(n).Should(Equal(0)) - }) - - Context("after the buffer has been closed", func() { - It("returns an error", func() { - buffer := BufferWithBytes([]byte("abcde")) - - buffer.Close() - - dest := make([]byte, 3) - n, err := buffer.Read(dest) - Ω(err).Should(HaveOccurred()) - Ω(n).Should(Equal(0)) - }) - }) - }) - - Describe("detecting regular expressions", func() { - It("should fire the appropriate channel when the passed in pattern matches, then close it", func(done Done) { - go func() { - time.Sleep(10 * time.Millisecond) - buffer.Write([]byte("abcde")) - }() - - A := buffer.Detect("%s", "a.c") - B := buffer.Detect("def") - - var gotIt bool - select { - case gotIt = <-A: - case <-B: - Fail("should not have gotten here") - } - - Ω(gotIt).Should(BeTrue()) - Eventually(A).Should(BeClosed()) - - buffer.Write([]byte("f")) - Eventually(B).Should(Receive()) - Eventually(B).Should(BeClosed()) - - close(done) - }) - - It("should fast-forward the buffer upon detection", func(done Done) { - buffer.Write([]byte("abcde")) - <-buffer.Detect("abc") - Ω(buffer).ShouldNot(Say("abc")) - Ω(buffer).Should(Say("de")) - close(done) - }) - - It("should only fast-forward the buffer when the channel is read, and only if doing so would not rewind it", func(done Done) { - buffer.Write([]byte("abcde")) - A := buffer.Detect("abc") - time.Sleep(20 * time.Millisecond) //give the goroutine a chance to detect and write to the channel - Ω(buffer).Should(Say("abcd")) - <-A - Ω(buffer).ShouldNot(Say("d")) - Ω(buffer).Should(Say("e")) - Eventually(A).Should(BeClosed()) - close(done) - }) - - It("should be possible to cancel a detection", func(done Done) { - A := buffer.Detect("abc") - B := buffer.Detect("def") - buffer.CancelDetects() - buffer.Write([]byte("abcdef")) - Eventually(A).Should(BeClosed()) - Eventually(B).Should(BeClosed()) - - Ω(buffer).Should(Say("bcde")) - <-buffer.Detect("f") - close(done) - }) - }) - - Describe("closing the buffer", func() { - It("should error when further write attempts are made", func() { - _, err := buffer.Write([]byte("abc")) - Ω(err).ShouldNot(HaveOccurred()) - - buffer.Close() - - _, err = buffer.Write([]byte("def")) - Ω(err).Should(HaveOccurred()) - - Ω(buffer.Contents()).Should(Equal([]byte("abc"))) - }) - - It("should be closed", func() { - Ω(buffer.Closed()).Should(BeFalse()) - - buffer.Close() - - Ω(buffer.Closed()).Should(BeTrue()) - }) - }) -}) diff --git a/vendor/github.com/onsi/gomega/gbytes/gbuffer_suite_test.go b/vendor/github.com/onsi/gomega/gbytes/gbuffer_suite_test.go deleted file mode 100644 index 3a7dc0612..000000000 --- a/vendor/github.com/onsi/gomega/gbytes/gbuffer_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package gbytes_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestGbytes(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Gbytes Suite") -} diff --git a/vendor/github.com/onsi/gomega/gbytes/io_wrappers.go b/vendor/github.com/onsi/gomega/gbytes/io_wrappers.go deleted file mode 100644 index 3caed8769..000000000 --- a/vendor/github.com/onsi/gomega/gbytes/io_wrappers.go +++ /dev/null @@ -1,85 +0,0 @@ -package gbytes - -import ( - "errors" - "io" - "time" -) - -// ErrTimeout is returned by TimeoutCloser, TimeoutReader, and TimeoutWriter when the underlying Closer/Reader/Writer does not return within the specified timeout -var ErrTimeout = errors.New("timeout occurred") - -// TimeoutCloser returns an io.Closer that wraps the passed-in io.Closer. If the underlying Closer fails to close within the alloted timeout ErrTimeout is returned. -func TimeoutCloser(c io.Closer, timeout time.Duration) io.Closer { - return timeoutReaderWriterCloser{c: c, d: timeout} -} - -// TimeoutReader returns an io.Reader that wraps the passed-in io.Reader. If the underlying Reader fails to read within the alloted timeout ErrTimeout is returned. -func TimeoutReader(r io.Reader, timeout time.Duration) io.Reader { - return timeoutReaderWriterCloser{r: r, d: timeout} -} - -// TimeoutWriter returns an io.Writer that wraps the passed-in io.Writer. If the underlying Writer fails to write within the alloted timeout ErrTimeout is returned. -func TimeoutWriter(w io.Writer, timeout time.Duration) io.Writer { - return timeoutReaderWriterCloser{w: w, d: timeout} -} - -type timeoutReaderWriterCloser struct { - c io.Closer - w io.Writer - r io.Reader - d time.Duration -} - -func (t timeoutReaderWriterCloser) Close() error { - done := make(chan struct{}) - var err error - - go func() { - err = t.c.Close() - close(done) - }() - - select { - case <-done: - return err - case <-time.After(t.d): - return ErrTimeout - } -} - -func (t timeoutReaderWriterCloser) Read(p []byte) (int, error) { - done := make(chan struct{}) - var n int - var err error - - go func() { - n, err = t.r.Read(p) - close(done) - }() - - select { - case <-done: - return n, err - case <-time.After(t.d): - return 0, ErrTimeout - } -} - -func (t timeoutReaderWriterCloser) Write(p []byte) (int, error) { - done := make(chan struct{}) - var n int - var err error - - go func() { - n, err = t.w.Write(p) - close(done) - }() - - select { - case <-done: - return n, err - case <-time.After(t.d): - return 0, ErrTimeout - } -} diff --git a/vendor/github.com/onsi/gomega/gbytes/io_wrappers_test.go b/vendor/github.com/onsi/gomega/gbytes/io_wrappers_test.go deleted file mode 100644 index 2c74545d8..000000000 --- a/vendor/github.com/onsi/gomega/gbytes/io_wrappers_test.go +++ /dev/null @@ -1,188 +0,0 @@ -package gbytes_test - -import ( - "fmt" - "io" - "time" - - . "github.com/onsi/gomega/gbytes" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -type FakeCloser struct { - err error - duration time.Duration -} - -func (f FakeCloser) Close() error { - time.Sleep(f.duration) - return f.err -} - -type FakeReader struct { - err error - duration time.Duration -} - -func (f FakeReader) Read(p []byte) (int, error) { - time.Sleep(f.duration) - if f.err != nil { - return 0, f.err - } - - for i := 0; i < len(p); i++ { - p[i] = 'a' - } - - return len(p), nil -} - -type FakeWriter struct { - err error - duration time.Duration -} - -func (f FakeWriter) Write(p []byte) (int, error) { - time.Sleep(f.duration) - if f.err != nil { - return 0, f.err - } - - return len(p), nil -} - -var _ = Describe("Io Wrappers", func() { - Describe("TimeoutCloser", func() { - var innerCloser io.Closer - var timeoutCloser io.Closer - - JustBeforeEach(func() { - timeoutCloser = TimeoutCloser(innerCloser, 20*time.Millisecond) - }) - - Context("when the underlying Closer closes with no error", func() { - BeforeEach(func() { - innerCloser = FakeCloser{} - }) - - It("returns with no error", func() { - Ω(timeoutCloser.Close()).Should(Succeed()) - }) - }) - - Context("when the underlying Closer closes with an error", func() { - BeforeEach(func() { - innerCloser = FakeCloser{err: fmt.Errorf("boom")} - }) - - It("returns the error", func() { - Ω(timeoutCloser.Close()).Should(MatchError("boom")) - }) - }) - - Context("when the underlying Closer hangs", func() { - BeforeEach(func() { - innerCloser = FakeCloser{ - err: fmt.Errorf("boom"), - duration: time.Hour, - } - }) - - It("returns ErrTimeout", func() { - Ω(timeoutCloser.Close()).Should(MatchError(ErrTimeout)) - }) - }) - }) - - Describe("TimeoutReader", func() { - var innerReader io.Reader - var timeoutReader io.Reader - - JustBeforeEach(func() { - timeoutReader = TimeoutReader(innerReader, 20*time.Millisecond) - }) - - Context("when the underlying Reader returns no error", func() { - BeforeEach(func() { - innerReader = FakeReader{} - }) - - It("returns with no error", func() { - p := make([]byte, 5) - n, err := timeoutReader.Read(p) - Ω(n).Should(Equal(5)) - Ω(err).ShouldNot(HaveOccurred()) - Ω(p).Should(Equal([]byte("aaaaa"))) - }) - }) - - Context("when the underlying Reader returns an error", func() { - BeforeEach(func() { - innerReader = FakeReader{err: fmt.Errorf("boom")} - }) - - It("returns the error", func() { - p := make([]byte, 5) - _, err := timeoutReader.Read(p) - Ω(err).Should(MatchError("boom")) - }) - }) - - Context("when the underlying Reader hangs", func() { - BeforeEach(func() { - innerReader = FakeReader{err: fmt.Errorf("boom"), duration: time.Hour} - }) - - It("returns ErrTimeout", func() { - p := make([]byte, 5) - _, err := timeoutReader.Read(p) - Ω(err).Should(MatchError(ErrTimeout)) - }) - }) - }) - - Describe("TimeoutWriter", func() { - var innerWriter io.Writer - var timeoutWriter io.Writer - - JustBeforeEach(func() { - timeoutWriter = TimeoutWriter(innerWriter, 20*time.Millisecond) - }) - - Context("when the underlying Writer returns no error", func() { - BeforeEach(func() { - innerWriter = FakeWriter{} - }) - - It("returns with no error", func() { - n, err := timeoutWriter.Write([]byte("aaaaa")) - Ω(n).Should(Equal(5)) - Ω(err).ShouldNot(HaveOccurred()) - }) - }) - - Context("when the underlying Writer returns an error", func() { - BeforeEach(func() { - innerWriter = FakeWriter{err: fmt.Errorf("boom")} - }) - - It("returns the error", func() { - _, err := timeoutWriter.Write([]byte("aaaaa")) - Ω(err).Should(MatchError("boom")) - }) - }) - - Context("when the underlying Writer hangs", func() { - BeforeEach(func() { - innerWriter = FakeWriter{err: fmt.Errorf("boom"), duration: time.Hour} - }) - - It("returns ErrTimeout", func() { - _, err := timeoutWriter.Write([]byte("aaaaa")) - Ω(err).Should(MatchError(ErrTimeout)) - }) - }) - }) -}) diff --git a/vendor/github.com/onsi/gomega/gbytes/say_matcher.go b/vendor/github.com/onsi/gomega/gbytes/say_matcher.go deleted file mode 100644 index cbc266c56..000000000 --- a/vendor/github.com/onsi/gomega/gbytes/say_matcher.go +++ /dev/null @@ -1,105 +0,0 @@ -package gbytes - -import ( - "fmt" - "regexp" - - "github.com/onsi/gomega/format" -) - -//Objects satisfying the BufferProvider can be used with the Say matcher. -type BufferProvider interface { - Buffer() *Buffer -} - -/* -Say is a Gomega matcher that operates on gbytes.Buffers: - - Ω(buffer).Should(Say("something")) - -will succeed if the unread portion of the buffer matches the regular expression "something". - -When Say succeeds, it fast forwards the gbytes.Buffer's read cursor to just after the succesful match. -Thus, subsequent calls to Say will only match against the unread portion of the buffer - -Say pairs very well with Eventually. To assert that a buffer eventually receives data matching "[123]-star" within 3 seconds you can: - - Eventually(buffer, 3).Should(Say("[123]-star")) - -Ditto with consistently. To assert that a buffer does not receive data matching "never-see-this" for 1 second you can: - - Consistently(buffer, 1).ShouldNot(Say("never-see-this")) - -In addition to bytes.Buffers, Say can operate on objects that implement the gbytes.BufferProvider interface. -In such cases, Say simply operates on the *gbytes.Buffer returned by Buffer() - -If the buffer is closed, the Say matcher will tell Eventually to abort. -*/ -func Say(expected string, args ...interface{}) *sayMatcher { - formattedRegexp := expected - if len(args) > 0 { - formattedRegexp = fmt.Sprintf(expected, args...) - } - return &sayMatcher{ - re: regexp.MustCompile(formattedRegexp), - } -} - -type sayMatcher struct { - re *regexp.Regexp - receivedSayings []byte -} - -func (m *sayMatcher) buffer(actual interface{}) (*Buffer, bool) { - var buffer *Buffer - - switch x := actual.(type) { - case *Buffer: - buffer = x - case BufferProvider: - buffer = x.Buffer() - default: - return nil, false - } - - return buffer, true -} - -func (m *sayMatcher) Match(actual interface{}) (success bool, err error) { - buffer, ok := m.buffer(actual) - if !ok { - return false, fmt.Errorf("Say must be passed a *gbytes.Buffer or BufferProvider. Got:\n%s", format.Object(actual, 1)) - } - - didSay, sayings := buffer.didSay(m.re) - m.receivedSayings = sayings - - return didSay, nil -} - -func (m *sayMatcher) FailureMessage(actual interface{}) (message string) { - return fmt.Sprintf( - "Got stuck at:\n%s\nWaiting for:\n%s", - format.IndentString(string(m.receivedSayings), 1), - format.IndentString(m.re.String(), 1), - ) -} - -func (m *sayMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return fmt.Sprintf( - "Saw:\n%s\nWhich matches the unexpected:\n%s", - format.IndentString(string(m.receivedSayings), 1), - format.IndentString(m.re.String(), 1), - ) -} - -func (m *sayMatcher) MatchMayChangeInTheFuture(actual interface{}) bool { - switch x := actual.(type) { - case *Buffer: - return !x.Closed() - case BufferProvider: - return !x.Buffer().Closed() - default: - return true - } -} diff --git a/vendor/github.com/onsi/gomega/gbytes/say_matcher_test.go b/vendor/github.com/onsi/gomega/gbytes/say_matcher_test.go deleted file mode 100644 index 63fb3b3b8..000000000 --- a/vendor/github.com/onsi/gomega/gbytes/say_matcher_test.go +++ /dev/null @@ -1,163 +0,0 @@ -package gbytes_test - -import ( - . "github.com/onsi/gomega/gbytes" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -type speaker struct { - buffer *Buffer -} - -func (s *speaker) Buffer() *Buffer { - return s.buffer -} - -var _ = Describe("SayMatcher", func() { - var buffer *Buffer - - BeforeEach(func() { - buffer = NewBuffer() - buffer.Write([]byte("abc")) - }) - - Context("when actual is not a gexec Buffer, or a BufferProvider", func() { - It("should error", func() { - failures := InterceptGomegaFailures(func() { - Ω("foo").Should(Say("foo")) - }) - Ω(failures[0]).Should(ContainSubstring("*gbytes.Buffer")) - }) - }) - - Context("when a match is found", func() { - It("should succeed", func() { - Ω(buffer).Should(Say("abc")) - }) - - It("should support printf-like formatting", func() { - Ω(buffer).Should(Say("a%sc", "b")) - }) - - It("should use a regular expression", func() { - Ω(buffer).Should(Say("a.c")) - }) - - It("should fastforward the buffer", func() { - buffer.Write([]byte("def")) - Ω(buffer).Should(Say("abcd")) - Ω(buffer).Should(Say("ef")) - Ω(buffer).ShouldNot(Say("[a-z]")) - }) - }) - - Context("when no match is found", func() { - It("should not error", func() { - Ω(buffer).ShouldNot(Say("def")) - }) - - Context("when the buffer is closed", func() { - BeforeEach(func() { - buffer.Close() - }) - - It("should abort an eventually", func() { - t := time.Now() - failures := InterceptGomegaFailures(func() { - Eventually(buffer).Should(Say("def")) - }) - Eventually(buffer).ShouldNot(Say("def")) - Ω(time.Since(t)).Should(BeNumerically("<", 500*time.Millisecond)) - Ω(failures).Should(HaveLen(1)) - - t = time.Now() - Eventually(buffer).Should(Say("abc")) - Ω(time.Since(t)).Should(BeNumerically("<", 500*time.Millisecond)) - }) - - It("should abort a consistently", func() { - t := time.Now() - Consistently(buffer, 2.0).ShouldNot(Say("def")) - Ω(time.Since(t)).Should(BeNumerically("<", 500*time.Millisecond)) - }) - - It("should not error with a synchronous matcher", func() { - Ω(buffer).ShouldNot(Say("def")) - Ω(buffer).Should(Say("abc")) - }) - }) - }) - - Context("when a positive match fails", func() { - It("should report where it got stuck", func() { - Ω(buffer).Should(Say("abc")) - buffer.Write([]byte("def")) - failures := InterceptGomegaFailures(func() { - Ω(buffer).Should(Say("abc")) - }) - Ω(failures[0]).Should(ContainSubstring("Got stuck at:")) - Ω(failures[0]).Should(ContainSubstring("def")) - }) - }) - - Context("when a negative match fails", func() { - It("should report where it got stuck", func() { - failures := InterceptGomegaFailures(func() { - Ω(buffer).ShouldNot(Say("abc")) - }) - Ω(failures[0]).Should(ContainSubstring("Saw:")) - Ω(failures[0]).Should(ContainSubstring("Which matches the unexpected:")) - Ω(failures[0]).Should(ContainSubstring("abc")) - }) - }) - - Context("when a match is not found", func() { - It("should not fastforward the buffer", func() { - Ω(buffer).ShouldNot(Say("def")) - Ω(buffer).Should(Say("abc")) - }) - }) - - Context("a nice real-life example", func() { - It("should behave well", func() { - Ω(buffer).Should(Say("abc")) - go func() { - time.Sleep(10 * time.Millisecond) - buffer.Write([]byte("def")) - }() - Ω(buffer).ShouldNot(Say("def")) - Eventually(buffer).Should(Say("def")) - }) - }) - - Context("when actual is a BufferProvider", func() { - It("should use actual's buffer", func() { - s := &speaker{ - buffer: NewBuffer(), - } - - Ω(s).ShouldNot(Say("abc")) - - s.Buffer().Write([]byte("abc")) - Ω(s).Should(Say("abc")) - }) - - It("should abort an eventually", func() { - s := &speaker{ - buffer: NewBuffer(), - } - - s.buffer.Close() - - t := time.Now() - failures := InterceptGomegaFailures(func() { - Eventually(s).Should(Say("def")) - }) - Ω(failures).Should(HaveLen(1)) - Ω(time.Since(t)).Should(BeNumerically("<", 500*time.Millisecond)) - }) - }) -}) diff --git a/vendor/github.com/onsi/gomega/gexec/_fixture/firefly/main.go b/vendor/github.com/onsi/gomega/gexec/_fixture/firefly/main.go deleted file mode 100644 index 16091c22b..000000000 --- a/vendor/github.com/onsi/gomega/gexec/_fixture/firefly/main.go +++ /dev/null @@ -1,36 +0,0 @@ -package main - -import ( - "fmt" - "math/rand" - "os" - "strconv" - "time" -) - -var outQuote = "We've done the impossible, and that makes us mighty." -var errQuote = "Ah, curse your sudden but inevitable betrayal!" - -var randomQuotes = []string{ - "Can we maybe vote on the whole murdering people issue?", - "I swear by my pretty floral bonnet, I will end you.", - "My work's illegal, but at least it's honest.", -} - -func main() { - fmt.Fprintln(os.Stdout, outQuote) - fmt.Fprintln(os.Stderr, errQuote) - - randomIndex := rand.New(rand.NewSource(time.Now().UnixNano())).Intn(len(randomQuotes)) - - time.Sleep(100 * time.Millisecond) - - fmt.Fprintln(os.Stdout, randomQuotes[randomIndex]) - - if len(os.Args) == 2 { - exitCode, _ := strconv.Atoi(os.Args[1]) - os.Exit(exitCode) - } else { - os.Exit(randomIndex) - } -} diff --git a/vendor/github.com/onsi/gomega/gexec/build.go b/vendor/github.com/onsi/gomega/gexec/build.go deleted file mode 100644 index d11b2fd8a..000000000 --- a/vendor/github.com/onsi/gomega/gexec/build.go +++ /dev/null @@ -1,99 +0,0 @@ -package gexec - -import ( - "errors" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "runtime" - "sync" -) - -var ( - mu sync.Mutex - tmpDir string -) - -/* -Build uses go build to compile the package at packagePath. The resulting binary is saved off in a temporary directory. -A path pointing to this binary is returned. - -Build uses the $GOPATH set in your environment. It passes the variadic args on to `go build`. -*/ -func Build(packagePath string, args ...string) (compiledPath string, err error) { - return doBuild(os.Getenv("GOPATH"), packagePath, nil, args...) -} - -/* -BuildWithEnvironment is identical to Build but allows you to specify env vars to be set at build time. -*/ -func BuildWithEnvironment(packagePath string, env []string, args ...string) (compiledPath string, err error) { - return doBuild(os.Getenv("GOPATH"), packagePath, env, args...) -} - -/* -BuildIn is identical to Build but allows you to specify a custom $GOPATH (the first argument). -*/ -func BuildIn(gopath string, packagePath string, args ...string) (compiledPath string, err error) { - return doBuild(gopath, packagePath, nil, args...) -} - -func doBuild(gopath, packagePath string, env []string, args ...string) (compiledPath string, err error) { - tmpDir, err := temporaryDirectory() - if err != nil { - return "", err - } - - if len(gopath) == 0 { - return "", errors.New("$GOPATH not provided when building " + packagePath) - } - - executable := filepath.Join(tmpDir, path.Base(packagePath)) - if runtime.GOOS == "windows" { - executable = executable + ".exe" - } - - cmdArgs := append([]string{"build"}, args...) - cmdArgs = append(cmdArgs, "-o", executable, packagePath) - - build := exec.Command("go", cmdArgs...) - build.Env = append([]string{"GOPATH=" + gopath}, os.Environ()...) - build.Env = append(build.Env, env...) - - output, err := build.CombinedOutput() - if err != nil { - return "", fmt.Errorf("Failed to build %s:\n\nError:\n%s\n\nOutput:\n%s", packagePath, err, string(output)) - } - - return executable, nil -} - -/* -You should call CleanupBuildArtifacts before your test ends to clean up any temporary artifacts generated by -gexec. In Ginkgo this is typically done in an AfterSuite callback. -*/ -func CleanupBuildArtifacts() { - mu.Lock() - defer mu.Unlock() - if tmpDir != "" { - os.RemoveAll(tmpDir) - tmpDir = "" - } -} - -func temporaryDirectory() (string, error) { - var err error - mu.Lock() - defer mu.Unlock() - if tmpDir == "" { - tmpDir, err = ioutil.TempDir("", "gexec_artifacts") - if err != nil { - return "", err - } - } - - return ioutil.TempDir(tmpDir, "g") -} diff --git a/vendor/github.com/onsi/gomega/gexec/build_test.go b/vendor/github.com/onsi/gomega/gexec/build_test.go deleted file mode 100644 index 8df0790cd..000000000 --- a/vendor/github.com/onsi/gomega/gexec/build_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package gexec_test - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" -) - -var packagePath = "./_fixture/firefly" - -var _ = Describe(".Build", func() { - Context("when there have been previous calls to Build", func() { - BeforeEach(func() { - _, err := gexec.Build(packagePath) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("compiles the specified package", func() { - compiledPath, err := gexec.Build(packagePath) - Ω(err).ShouldNot(HaveOccurred()) - Ω(compiledPath).Should(BeAnExistingFile()) - }) - - Context("and CleanupBuildArtifacts has been called", func() { - BeforeEach(func() { - gexec.CleanupBuildArtifacts() - }) - - It("compiles the specified package", func() { - var err error - fireflyPath, err = gexec.Build(packagePath) - Ω(err).ShouldNot(HaveOccurred()) - Ω(fireflyPath).Should(BeAnExistingFile()) - }) - }) - }) -}) - -var _ = Describe(".BuildWithEnvironment", func() { - var err error - env := []string{ - "GOOS=linux", - "GOARCH=amd64", - } - - It("compiles the specified package with the specified env vars", func() { - compiledPath, err := gexec.BuildWithEnvironment(packagePath, env) - Ω(err).ShouldNot(HaveOccurred()) - Ω(compiledPath).Should(BeAnExistingFile()) - }) - - It("returns the environment to a good state", func() { - _, err = gexec.BuildWithEnvironment(packagePath, env) - Ω(err).ShouldNot(HaveOccurred()) - Ω(os.Environ()).ShouldNot(ContainElement("GOOS=linux")) - }) -}) diff --git a/vendor/github.com/onsi/gomega/gexec/exit_matcher.go b/vendor/github.com/onsi/gomega/gexec/exit_matcher.go deleted file mode 100644 index d872ec8fd..000000000 --- a/vendor/github.com/onsi/gomega/gexec/exit_matcher.go +++ /dev/null @@ -1,86 +0,0 @@ -package gexec - -import ( - "fmt" - - "github.com/onsi/gomega/format" -) - -/* -The Exit matcher operates on a session: - - Ω(session).Should(Exit()) - -Exit passes if the session has already exited. - -If no status code is provided, then Exit will succeed if the session has exited regardless of exit code. -Otherwise, Exit will only succeed if the process has exited with the provided status code. - -Note that the process must have already exited. To wait for a process to exit, use Eventually: - - Eventually(session, 3).Should(Exit(0)) -*/ -func Exit(optionalExitCode ...int) *exitMatcher { - exitCode := -1 - if len(optionalExitCode) > 0 { - exitCode = optionalExitCode[0] - } - - return &exitMatcher{ - exitCode: exitCode, - } -} - -type exitMatcher struct { - exitCode int - didExit bool - actualExitCode int -} - -type Exiter interface { - ExitCode() int -} - -func (m *exitMatcher) Match(actual interface{}) (success bool, err error) { - exiter, ok := actual.(Exiter) - if !ok { - return false, fmt.Errorf("Exit must be passed a gexec.Exiter (Missing method ExitCode() int) Got:\n%s", format.Object(actual, 1)) - } - - m.actualExitCode = exiter.ExitCode() - - if m.actualExitCode == -1 { - return false, nil - } - - if m.exitCode == -1 { - return true, nil - } - return m.exitCode == m.actualExitCode, nil -} - -func (m *exitMatcher) FailureMessage(actual interface{}) (message string) { - if m.actualExitCode == -1 { - return "Expected process to exit. It did not." - } - return format.Message(m.actualExitCode, "to match exit code:", m.exitCode) -} - -func (m *exitMatcher) NegatedFailureMessage(actual interface{}) (message string) { - if m.actualExitCode == -1 { - return "you really shouldn't be able to see this!" - } else { - if m.exitCode == -1 { - return "Expected process not to exit. It did." - } - return format.Message(m.actualExitCode, "not to match exit code:", m.exitCode) - } -} - -func (m *exitMatcher) MatchMayChangeInTheFuture(actual interface{}) bool { - session, ok := actual.(*Session) - if ok { - return session.ExitCode() == -1 - } - return true -} diff --git a/vendor/github.com/onsi/gomega/gexec/exit_matcher_test.go b/vendor/github.com/onsi/gomega/gexec/exit_matcher_test.go deleted file mode 100644 index 79615ddf8..000000000 --- a/vendor/github.com/onsi/gomega/gexec/exit_matcher_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package gexec_test - -import ( - . "github.com/onsi/gomega/gexec" - "os/exec" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -type NeverExits struct{} - -func (e NeverExits) ExitCode() int { - return -1 -} - -var _ = Describe("ExitMatcher", func() { - var command *exec.Cmd - var session *Session - - BeforeEach(func() { - var err error - command = exec.Command(fireflyPath, "0") - session, err = Start(command, nil, nil) - Ω(err).ShouldNot(HaveOccurred()) - }) - - Describe("when passed something that is an Exiter", func() { - It("should act normally", func() { - failures := InterceptGomegaFailures(func() { - Ω(NeverExits{}).Should(Exit()) - }) - - Ω(failures[0]).Should(ContainSubstring("Expected process to exit. It did not.")) - }) - }) - - Describe("when passed something that is not an Exiter", func() { - It("should error", func() { - failures := InterceptGomegaFailures(func() { - Ω("aardvark").Should(Exit()) - }) - - Ω(failures[0]).Should(ContainSubstring("Exit must be passed a gexec.Exiter")) - }) - }) - - Context("with no exit code", func() { - It("should say the right things when it fails", func() { - Ω(session).ShouldNot(Exit()) - - failures := InterceptGomegaFailures(func() { - Ω(session).Should(Exit()) - }) - - Ω(failures[0]).Should(ContainSubstring("Expected process to exit. It did not.")) - - Eventually(session).Should(Exit()) - - Ω(session).Should(Exit()) - - failures = InterceptGomegaFailures(func() { - Ω(session).ShouldNot(Exit()) - }) - - Ω(failures[0]).Should(ContainSubstring("Expected process not to exit. It did.")) - }) - }) - - Context("with an exit code", func() { - It("should say the right things when it fails", func() { - Ω(session).ShouldNot(Exit(0)) - Ω(session).ShouldNot(Exit(1)) - - failures := InterceptGomegaFailures(func() { - Ω(session).Should(Exit(0)) - }) - - Ω(failures[0]).Should(ContainSubstring("Expected process to exit. It did not.")) - - Eventually(session).Should(Exit(0)) - - Ω(session).Should(Exit(0)) - - failures = InterceptGomegaFailures(func() { - Ω(session).Should(Exit(1)) - }) - - Ω(failures[0]).Should(ContainSubstring("to match exit code:")) - - Ω(session).ShouldNot(Exit(1)) - - failures = InterceptGomegaFailures(func() { - Ω(session).ShouldNot(Exit(0)) - }) - - Ω(failures[0]).Should(ContainSubstring("not to match exit code:")) - }) - }) - - Describe("bailing out early", func() { - It("should bail out early once the process exits", func() { - t := time.Now() - - failures := InterceptGomegaFailures(func() { - Eventually(session).Should(Exit(1)) - }) - Ω(time.Since(t)).Should(BeNumerically("<=", 500*time.Millisecond)) - Ω(failures).Should(HaveLen(1)) - }) - }) -}) diff --git a/vendor/github.com/onsi/gomega/gexec/gexec_suite_test.go b/vendor/github.com/onsi/gomega/gexec/gexec_suite_test.go deleted file mode 100644 index 87672aafa..000000000 --- a/vendor/github.com/onsi/gomega/gexec/gexec_suite_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package gexec_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gexec" - - "testing" -) - -var fireflyPath string - -func TestGexec(t *testing.T) { - BeforeSuite(func() { - var err error - fireflyPath, err = gexec.Build("./_fixture/firefly") - Ω(err).ShouldNot(HaveOccurred()) - }) - - AfterSuite(func() { - gexec.CleanupBuildArtifacts() - }) - - RegisterFailHandler(Fail) - RunSpecs(t, "Gexec Suite") -} diff --git a/vendor/github.com/onsi/gomega/gexec/prefixed_writer.go b/vendor/github.com/onsi/gomega/gexec/prefixed_writer.go deleted file mode 100644 index 05e695abc..000000000 --- a/vendor/github.com/onsi/gomega/gexec/prefixed_writer.go +++ /dev/null @@ -1,53 +0,0 @@ -package gexec - -import ( - "io" - "sync" -) - -/* -PrefixedWriter wraps an io.Writer, emiting the passed in prefix at the beginning of each new line. -This can be useful when running multiple gexec.Sessions concurrently - you can prefix the log output of each -session by passing in a PrefixedWriter: - -gexec.Start(cmd, NewPrefixedWriter("[my-cmd] ", GinkgoWriter), NewPrefixedWriter("[my-cmd] ", GinkgoWriter)) -*/ -type PrefixedWriter struct { - prefix []byte - writer io.Writer - lock *sync.Mutex - atStartOfLine bool -} - -func NewPrefixedWriter(prefix string, writer io.Writer) *PrefixedWriter { - return &PrefixedWriter{ - prefix: []byte(prefix), - writer: writer, - lock: &sync.Mutex{}, - atStartOfLine: true, - } -} - -func (w *PrefixedWriter) Write(b []byte) (int, error) { - w.lock.Lock() - defer w.lock.Unlock() - - toWrite := []byte{} - - for _, c := range b { - if w.atStartOfLine { - toWrite = append(toWrite, w.prefix...) - } - - toWrite = append(toWrite, c) - - w.atStartOfLine = c == '\n' - } - - _, err := w.writer.Write(toWrite) - if err != nil { - return 0, err - } - - return len(b), nil -} diff --git a/vendor/github.com/onsi/gomega/gexec/prefixed_writer_test.go b/vendor/github.com/onsi/gomega/gexec/prefixed_writer_test.go deleted file mode 100644 index 8657d0c9d..000000000 --- a/vendor/github.com/onsi/gomega/gexec/prefixed_writer_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package gexec_test - -import ( - "bytes" - - . "github.com/onsi/gomega/gexec" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("PrefixedWriter", func() { - var buffer *bytes.Buffer - var writer *PrefixedWriter - BeforeEach(func() { - buffer = &bytes.Buffer{} - writer = NewPrefixedWriter("[p]", buffer) - }) - - It("should emit the prefix on newlines", func() { - writer.Write([]byte("abc")) - writer.Write([]byte("def\n")) - writer.Write([]byte("hij\n")) - writer.Write([]byte("\n\n")) - writer.Write([]byte("klm\n\nnop")) - writer.Write([]byte("")) - writer.Write([]byte("qrs")) - writer.Write([]byte("\ntuv\nwx")) - writer.Write([]byte("yz\n\n")) - - Ω(buffer.String()).Should(Equal(`[p]abcdef -[p]hij -[p] -[p] -[p]klm -[p] -[p]nopqrs -[p]tuv -[p]wxyz -[p] -`)) - }) -}) diff --git a/vendor/github.com/onsi/gomega/gexec/session.go b/vendor/github.com/onsi/gomega/gexec/session.go deleted file mode 100644 index 387a72cde..000000000 --- a/vendor/github.com/onsi/gomega/gexec/session.go +++ /dev/null @@ -1,305 +0,0 @@ -/* -Package gexec provides support for testing external processes. -*/ -package gexec - -import ( - "io" - "os" - "os/exec" - "reflect" - "sync" - "syscall" - - . "github.com/onsi/gomega" - "github.com/onsi/gomega/gbytes" -) - -const INVALID_EXIT_CODE = 254 - -type Session struct { - //The wrapped command - Command *exec.Cmd - - //A *gbytes.Buffer connected to the command's stdout - Out *gbytes.Buffer - - //A *gbytes.Buffer connected to the command's stderr - Err *gbytes.Buffer - - //A channel that will close when the command exits - Exited <-chan struct{} - - lock *sync.Mutex - exitCode int -} - -/* -Start starts the passed-in *exec.Cmd command. It wraps the command in a *gexec.Session. - -The session pipes the command's stdout and stderr to two *gbytes.Buffers available as properties on the session: session.Out and session.Err. -These buffers can be used with the gbytes.Say matcher to match against unread output: - - Ω(session.Out).Should(gbytes.Say("foo-out")) - Ω(session.Err).Should(gbytes.Say("foo-err")) - -In addition, Session satisfies the gbytes.BufferProvider interface and provides the stdout *gbytes.Buffer. This allows you to replace the first line, above, with: - - Ω(session).Should(gbytes.Say("foo-out")) - -When outWriter and/or errWriter are non-nil, the session will pipe stdout and/or stderr output both into the session *gybtes.Buffers and to the passed-in outWriter/errWriter. -This is useful for capturing the process's output or logging it to screen. In particular, when using Ginkgo it can be convenient to direct output to the GinkgoWriter: - - session, err := Start(command, GinkgoWriter, GinkgoWriter) - -This will log output when running tests in verbose mode, but - otherwise - will only log output when a test fails. - -The session wrapper is responsible for waiting on the *exec.Cmd command. You *should not* call command.Wait() yourself. -Instead, to assert that the command has exited you can use the gexec.Exit matcher: - - Ω(session).Should(gexec.Exit()) - -When the session exits it closes the stdout and stderr gbytes buffers. This will short circuit any -Eventuallys waiting for the buffers to Say something. -*/ -func Start(command *exec.Cmd, outWriter io.Writer, errWriter io.Writer) (*Session, error) { - exited := make(chan struct{}) - - session := &Session{ - Command: command, - Out: gbytes.NewBuffer(), - Err: gbytes.NewBuffer(), - Exited: exited, - lock: &sync.Mutex{}, - exitCode: -1, - } - - var commandOut, commandErr io.Writer - - commandOut, commandErr = session.Out, session.Err - - if outWriter != nil && !reflect.ValueOf(outWriter).IsNil() { - commandOut = io.MultiWriter(commandOut, outWriter) - } - - if errWriter != nil && !reflect.ValueOf(errWriter).IsNil() { - commandErr = io.MultiWriter(commandErr, errWriter) - } - - command.Stdout = commandOut - command.Stderr = commandErr - - err := command.Start() - if err == nil { - go session.monitorForExit(exited) - trackedSessionsMutex.Lock() - defer trackedSessionsMutex.Unlock() - trackedSessions = append(trackedSessions, session) - } - - return session, err -} - -/* -Buffer implements the gbytes.BufferProvider interface and returns s.Out -This allows you to make gbytes.Say matcher assertions against stdout without having to reference .Out: - - Eventually(session).Should(gbytes.Say("foo")) -*/ -func (s *Session) Buffer() *gbytes.Buffer { - return s.Out -} - -/* -ExitCode returns the wrapped command's exit code. If the command hasn't exited yet, ExitCode returns -1. - -To assert that the command has exited it is more convenient to use the Exit matcher: - - Eventually(s).Should(gexec.Exit()) - -When the process exits because it has received a particular signal, the exit code will be 128+signal-value -(See http://www.tldp.org/LDP/abs/html/exitcodes.html and http://man7.org/linux/man-pages/man7/signal.7.html) - -*/ -func (s *Session) ExitCode() int { - s.lock.Lock() - defer s.lock.Unlock() - return s.exitCode -} - -/* -Wait waits until the wrapped command exits. It can be passed an optional timeout. -If the command does not exit within the timeout, Wait will trigger a test failure. - -Wait returns the session, making it possible to chain: - - session.Wait().Out.Contents() - -will wait for the command to exit then return the entirety of Out's contents. - -Wait uses eventually under the hood and accepts the same timeout/polling intervals that eventually does. -*/ -func (s *Session) Wait(timeout ...interface{}) *Session { - EventuallyWithOffset(1, s, timeout...).Should(Exit()) - return s -} - -/* -Kill sends the running command a SIGKILL signal. It does not wait for the process to exit. - -If the command has already exited, Kill returns silently. - -The session is returned to enable chaining. -*/ -func (s *Session) Kill() *Session { - if s.ExitCode() != -1 { - return s - } - s.Command.Process.Kill() - return s -} - -/* -Interrupt sends the running command a SIGINT signal. It does not wait for the process to exit. - -If the command has already exited, Interrupt returns silently. - -The session is returned to enable chaining. -*/ -func (s *Session) Interrupt() *Session { - return s.Signal(syscall.SIGINT) -} - -/* -Terminate sends the running command a SIGTERM signal. It does not wait for the process to exit. - -If the command has already exited, Terminate returns silently. - -The session is returned to enable chaining. -*/ -func (s *Session) Terminate() *Session { - return s.Signal(syscall.SIGTERM) -} - -/* -Signal sends the running command the passed in signal. It does not wait for the process to exit. - -If the command has already exited, Signal returns silently. - -The session is returned to enable chaining. -*/ -func (s *Session) Signal(signal os.Signal) *Session { - if s.ExitCode() != -1 { - return s - } - s.Command.Process.Signal(signal) - return s -} - -func (s *Session) monitorForExit(exited chan<- struct{}) { - err := s.Command.Wait() - s.lock.Lock() - s.Out.Close() - s.Err.Close() - status := s.Command.ProcessState.Sys().(syscall.WaitStatus) - if status.Signaled() { - s.exitCode = 128 + int(status.Signal()) - } else { - exitStatus := status.ExitStatus() - if exitStatus == -1 && err != nil { - s.exitCode = INVALID_EXIT_CODE - } - s.exitCode = exitStatus - } - s.lock.Unlock() - - close(exited) -} - -var trackedSessions = []*Session{} -var trackedSessionsMutex = &sync.Mutex{} - -/* -Kill sends a SIGKILL signal to all the processes started by Run, and waits for them to exit. -The timeout specified is applied to each process killed. - -If any of the processes already exited, KillAndWait returns silently. -*/ -func KillAndWait(timeout ...interface{}) { - trackedSessionsMutex.Lock() - defer trackedSessionsMutex.Unlock() - for _, session := range trackedSessions { - session.Kill().Wait(timeout...) - } - trackedSessions = []*Session{} -} - -/* -Kill sends a SIGTERM signal to all the processes started by Run, and waits for them to exit. -The timeout specified is applied to each process killed. - -If any of the processes already exited, TerminateAndWait returns silently. -*/ -func TerminateAndWait(timeout ...interface{}) { - trackedSessionsMutex.Lock() - defer trackedSessionsMutex.Unlock() - for _, session := range trackedSessions { - session.Terminate().Wait(timeout...) - } -} - -/* -Kill sends a SIGKILL signal to all the processes started by Run. -It does not wait for the processes to exit. - -If any of the processes already exited, Kill returns silently. -*/ -func Kill() { - trackedSessionsMutex.Lock() - defer trackedSessionsMutex.Unlock() - for _, session := range trackedSessions { - session.Kill() - } -} - -/* -Terminate sends a SIGTERM signal to all the processes started by Run. -It does not wait for the processes to exit. - -If any of the processes already exited, Terminate returns silently. -*/ -func Terminate() { - trackedSessionsMutex.Lock() - defer trackedSessionsMutex.Unlock() - for _, session := range trackedSessions { - session.Terminate() - } -} - -/* -Signal sends the passed in signal to all the processes started by Run. -It does not wait for the processes to exit. - -If any of the processes already exited, Signal returns silently. -*/ -func Signal(signal os.Signal) { - trackedSessionsMutex.Lock() - defer trackedSessionsMutex.Unlock() - for _, session := range trackedSessions { - session.Signal(signal) - } -} - -/* -Interrupt sends the SIGINT signal to all the processes started by Run. -It does not wait for the processes to exit. - -If any of the processes already exited, Interrupt returns silently. -*/ -func Interrupt() { - trackedSessionsMutex.Lock() - defer trackedSessionsMutex.Unlock() - for _, session := range trackedSessions { - session.Interrupt() - } -} diff --git a/vendor/github.com/onsi/gomega/gexec/session_test.go b/vendor/github.com/onsi/gomega/gexec/session_test.go deleted file mode 100644 index b7841a090..000000000 --- a/vendor/github.com/onsi/gomega/gexec/session_test.go +++ /dev/null @@ -1,351 +0,0 @@ -package gexec_test - -import ( - "os/exec" - "syscall" - "time" - - . "github.com/onsi/gomega/gbytes" - . "github.com/onsi/gomega/gexec" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("Session", func() { - var command *exec.Cmd - var session *Session - - var outWriter, errWriter *Buffer - - BeforeEach(func() { - outWriter = nil - errWriter = nil - }) - - JustBeforeEach(func() { - command = exec.Command(fireflyPath) - var err error - session, err = Start(command, outWriter, errWriter) - Ω(err).ShouldNot(HaveOccurred()) - }) - - Context("running a command", func() { - It("should start the process", func() { - Ω(command.Process).ShouldNot(BeNil()) - }) - - It("should wrap the process's stdout and stderr with gbytes buffers", func(done Done) { - Eventually(session.Out).Should(Say("We've done the impossible, and that makes us mighty")) - Eventually(session.Err).Should(Say("Ah, curse your sudden but inevitable betrayal!")) - defer session.Out.CancelDetects() - - select { - case <-session.Out.Detect("Can we maybe vote on the whole murdering people issue"): - Eventually(session).Should(Exit(0)) - case <-session.Out.Detect("I swear by my pretty floral bonnet, I will end you."): - Eventually(session).Should(Exit(1)) - case <-session.Out.Detect("My work's illegal, but at least it's honest."): - Eventually(session).Should(Exit(2)) - } - - close(done) - }) - - It("should satisfy the gbytes.BufferProvider interface, passing Stdout", func() { - Eventually(session).Should(Say("We've done the impossible, and that makes us mighty")) - Eventually(session).Should(Exit()) - }) - }) - - Describe("providing the exit code", func() { - It("should provide the app's exit code", func() { - Ω(session.ExitCode()).Should(Equal(-1)) - - Eventually(session).Should(Exit()) - Ω(session.ExitCode()).Should(BeNumerically(">=", 0)) - Ω(session.ExitCode()).Should(BeNumerically("<", 3)) - }) - }) - - Describe("wait", func() { - It("should wait till the command exits", func() { - Ω(session.ExitCode()).Should(Equal(-1)) - Ω(session.Wait().ExitCode()).Should(BeNumerically(">=", 0)) - Ω(session.Wait().ExitCode()).Should(BeNumerically("<", 3)) - }) - }) - - Describe("exited", func() { - It("should close when the command exits", func() { - Eventually(session.Exited).Should(BeClosed()) - Ω(session.ExitCode()).ShouldNot(Equal(-1)) - }) - }) - - Describe("kill", func() { - It("should kill the command and don't wait for it to exit", func() { - session, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session.Kill() - Ω(session).ShouldNot(Exit(), "Should not exit immediately...") - Eventually(session).Should(Exit(128 + 9)) - }) - }) - - Describe("interrupt", func() { - It("should interrupt the command", func() { - session, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session.Interrupt() - Ω(session).ShouldNot(Exit(), "Should not exit immediately...") - Eventually(session).Should(Exit(128 + 2)) - }) - }) - - Describe("terminate", func() { - It("should terminate the command", func() { - session, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session.Terminate() - Ω(session).ShouldNot(Exit(), "Should not exit immediately...") - Eventually(session).Should(Exit(128 + 15)) - }) - }) - - Describe("signal", func() { - It("should send the signal to the command", func() { - session, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session.Signal(syscall.SIGABRT) - Ω(session).ShouldNot(Exit(), "Should not exit immediately...") - Eventually(session).Should(Exit(128 + 6)) - }) - }) - - Context("tracking sessions", func() { - BeforeEach(func() { - KillAndWait() - }) - - Describe("kill", func() { - It("should kill all the started sessions", func() { - session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session2, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session3, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - Kill() - - Eventually(session1).Should(Exit(128 + 9)) - Eventually(session2).Should(Exit(128 + 9)) - Eventually(session3).Should(Exit(128 + 9)) - }) - - It("should not wait for exit", func() { - session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - Kill() - Ω(session1).ShouldNot(Exit(), "Should not exit immediately...") - - Eventually(session1).Should(Exit(128 + 9)) - }) - - It("should not track unstarted sessions", func() { - _, err := Start(exec.Command("does not exist", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).Should(HaveOccurred()) - - session2, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session3, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - Kill() - - Eventually(session2).Should(Exit(128 + 9)) - Eventually(session3).Should(Exit(128 + 9)) - }) - - }) - - Describe("killAndWait", func() { - It("should kill all the started sessions and wait for them to finish", func() { - session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session2, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session3, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - KillAndWait() - Ω(session1).Should(Exit(128+9), "Should have exited") - Ω(session2).Should(Exit(128+9), "Should have exited") - Ω(session3).Should(Exit(128+9), "Should have exited") - }) - }) - - Describe("terminate", func() { - It("should terminate all the started sessions", func() { - session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session2, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session3, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - Terminate() - - Eventually(session1).Should(Exit(128 + 15)) - Eventually(session2).Should(Exit(128 + 15)) - Eventually(session3).Should(Exit(128 + 15)) - }) - - It("should not wait for exit", func() { - session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - Terminate() - - Ω(session1).ShouldNot(Exit(), "Should not exit immediately...") - }) - }) - - Describe("terminateAndWait", func() { - It("should terminate all the started sessions, and wait for them to exit", func() { - session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session2, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session3, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - TerminateAndWait() - - Ω(session1).Should(Exit(128+15), "Should have exited") - Ω(session2).Should(Exit(128+15), "Should have exited") - Ω(session3).Should(Exit(128+15), "Should have exited") - }) - }) - - Describe("signal", func() { - It("should signal all the started sessions", func() { - session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session2, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session3, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - Signal(syscall.SIGABRT) - - Eventually(session1).Should(Exit(128 + 6)) - Eventually(session2).Should(Exit(128 + 6)) - Eventually(session3).Should(Exit(128 + 6)) - }) - - It("should not wait", func() { - session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - Signal(syscall.SIGABRT) - - Ω(session1).ShouldNot(Exit(), "Should not exit immediately...") - }) - }) - - Describe("interrupt", func() { - It("should interrupt all the started sessions, and not wait", func() { - session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session2, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - session3, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - Interrupt() - - Eventually(session1).Should(Exit(128 + 2)) - Eventually(session2).Should(Exit(128 + 2)) - Eventually(session3).Should(Exit(128 + 2)) - }) - - It("should not wait", func() { - session1, err := Start(exec.Command("sleep", "10000000"), GinkgoWriter, GinkgoWriter) - Ω(err).ShouldNot(HaveOccurred()) - - Interrupt() - - Ω(session1).ShouldNot(Exit(), "Should not exit immediately...") - }) - }) - }) - - Context("when the command exits", func() { - It("should close the buffers", func() { - Eventually(session).Should(Exit()) - - Ω(session.Out.Closed()).Should(BeTrue()) - Ω(session.Err.Closed()).Should(BeTrue()) - - Ω(session.Out).Should(Say("We've done the impossible, and that makes us mighty")) - }) - - var So = It - - So("this means that eventually should short circuit", func() { - t := time.Now() - failures := InterceptGomegaFailures(func() { - Eventually(session).Should(Say("blah blah blah blah blah")) - }) - Ω(time.Since(t)).Should(BeNumerically("<=", 500*time.Millisecond)) - Ω(failures).Should(HaveLen(1)) - }) - }) - - Context("when wrapping out and err", func() { - BeforeEach(func() { - outWriter = NewBuffer() - errWriter = NewBuffer() - }) - - It("should route to both the provided writers and the gbytes buffers", func() { - Eventually(session.Out).Should(Say("We've done the impossible, and that makes us mighty")) - Eventually(session.Err).Should(Say("Ah, curse your sudden but inevitable betrayal!")) - - Ω(outWriter.Contents()).Should(ContainSubstring("We've done the impossible, and that makes us mighty")) - Ω(errWriter.Contents()).Should(ContainSubstring("Ah, curse your sudden but inevitable betrayal!")) - - Eventually(session).Should(Exit()) - - Ω(outWriter.Contents()).Should(Equal(session.Out.Contents())) - Ω(errWriter.Contents()).Should(Equal(session.Err.Contents())) - }) - }) - - Describe("when the command fails to start", func() { - It("should return an error", func() { - _, err := Start(exec.Command("agklsjdfas"), nil, nil) - Ω(err).Should(HaveOccurred()) - }) - }) -}) diff --git a/vendor/github.com/onsi/gomega/ghttp/handlers.go b/vendor/github.com/onsi/gomega/ghttp/handlers.go deleted file mode 100644 index 63ff6919a..000000000 --- a/vendor/github.com/onsi/gomega/ghttp/handlers.go +++ /dev/null @@ -1,313 +0,0 @@ -package ghttp - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "net/url" - "reflect" - - "github.com/golang/protobuf/proto" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/types" -) - -//CombineHandler takes variadic list of handlers and produces one handler -//that calls each handler in order. -func CombineHandlers(handlers ...http.HandlerFunc) http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - for _, handler := range handlers { - handler(w, req) - } - } -} - -//VerifyRequest returns a handler that verifies that a request uses the specified method to connect to the specified path -//You may also pass in an optional rawQuery string which is tested against the request's `req.URL.RawQuery` -// -//For path, you may pass in a string, in which case strict equality will be applied -//Alternatively you can pass in a matcher (ContainSubstring("/foo") and MatchRegexp("/foo/[a-f0-9]+") for example) -func VerifyRequest(method string, path interface{}, rawQuery ...string) http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - Ω(req.Method).Should(Equal(method), "Method mismatch") - switch p := path.(type) { - case types.GomegaMatcher: - Ω(req.URL.Path).Should(p, "Path mismatch") - default: - Ω(req.URL.Path).Should(Equal(path), "Path mismatch") - } - if len(rawQuery) > 0 { - values, err := url.ParseQuery(rawQuery[0]) - Ω(err).ShouldNot(HaveOccurred(), "Expected RawQuery is malformed") - - Ω(req.URL.Query()).Should(Equal(values), "RawQuery mismatch") - } - } -} - -//VerifyContentType returns a handler that verifies that a request has a Content-Type header set to the -//specified value -func VerifyContentType(contentType string) http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - Ω(req.Header.Get("Content-Type")).Should(Equal(contentType)) - } -} - -//VerifyBasicAuth returns a handler that verifies the request contains a BasicAuth Authorization header -//matching the passed in username and password -func VerifyBasicAuth(username string, password string) http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - auth := req.Header.Get("Authorization") - Ω(auth).ShouldNot(Equal(""), "Authorization header must be specified") - - decoded, err := base64.StdEncoding.DecodeString(auth[6:]) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(string(decoded)).Should(Equal(fmt.Sprintf("%s:%s", username, password)), "Authorization mismatch") - } -} - -//VerifyHeader returns a handler that verifies the request contains the passed in headers. -//The passed in header keys are first canonicalized via http.CanonicalHeaderKey. -// -//The request must contain *all* the passed in headers, but it is allowed to have additional headers -//beyond the passed in set. -func VerifyHeader(header http.Header) http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - for key, values := range header { - key = http.CanonicalHeaderKey(key) - Ω(req.Header[key]).Should(Equal(values), "Header mismatch for key: %s", key) - } - } -} - -//VerifyHeaderKV returns a handler that verifies the request contains a header matching the passed in key and values -//(recall that a `http.Header` is a mapping from string (key) to []string (values)) -//It is a convenience wrapper around `VerifyHeader` that allows you to avoid having to create an `http.Header` object. -func VerifyHeaderKV(key string, values ...string) http.HandlerFunc { - return VerifyHeader(http.Header{key: values}) -} - -//VerifyBody returns a handler that verifies that the body of the request matches the passed in byte array. -//It does this using Equal(). -func VerifyBody(expectedBody []byte) http.HandlerFunc { - return CombineHandlers( - func(w http.ResponseWriter, req *http.Request) { - body, err := ioutil.ReadAll(req.Body) - req.Body.Close() - Ω(err).ShouldNot(HaveOccurred()) - Ω(body).Should(Equal(expectedBody), "Body Mismatch") - }, - ) -} - -//VerifyJSON returns a handler that verifies that the body of the request is a valid JSON representation -//matching the passed in JSON string. It does this using Gomega's MatchJSON method -// -//VerifyJSON also verifies that the request's content type is application/json -func VerifyJSON(expectedJSON string) http.HandlerFunc { - return CombineHandlers( - VerifyContentType("application/json"), - func(w http.ResponseWriter, req *http.Request) { - body, err := ioutil.ReadAll(req.Body) - req.Body.Close() - Ω(err).ShouldNot(HaveOccurred()) - Ω(body).Should(MatchJSON(expectedJSON), "JSON Mismatch") - }, - ) -} - -//VerifyJSONRepresenting is similar to VerifyJSON. Instead of taking a JSON string, however, it -//takes an arbitrary JSON-encodable object and verifies that the requests's body is a JSON representation -//that matches the object -func VerifyJSONRepresenting(object interface{}) http.HandlerFunc { - data, err := json.Marshal(object) - Ω(err).ShouldNot(HaveOccurred()) - return CombineHandlers( - VerifyContentType("application/json"), - VerifyJSON(string(data)), - ) -} - -//VerifyForm returns a handler that verifies a request contains the specified form values. -// -//The request must contain *all* of the specified values, but it is allowed to have additional -//form values beyond the passed in set. -func VerifyForm(values url.Values) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - err := r.ParseForm() - Ω(err).ShouldNot(HaveOccurred()) - for key, vals := range values { - Ω(r.Form[key]).Should(Equal(vals), "Form mismatch for key: %s", key) - } - } -} - -//VerifyFormKV returns a handler that verifies a request contains a form key with the specified values. -// -//It is a convenience wrapper around `VerifyForm` that lets you avoid having to create a `url.Values` object. -func VerifyFormKV(key string, values ...string) http.HandlerFunc { - return VerifyForm(url.Values{key: values}) -} - -//VerifyProtoRepresenting returns a handler that verifies that the body of the request is a valid protobuf -//representation of the passed message. -// -//VerifyProtoRepresenting also verifies that the request's content type is application/x-protobuf -func VerifyProtoRepresenting(expected proto.Message) http.HandlerFunc { - return CombineHandlers( - VerifyContentType("application/x-protobuf"), - func(w http.ResponseWriter, req *http.Request) { - body, err := ioutil.ReadAll(req.Body) - Ω(err).ShouldNot(HaveOccurred()) - req.Body.Close() - - expectedType := reflect.TypeOf(expected) - actualValuePtr := reflect.New(expectedType.Elem()) - - actual, ok := actualValuePtr.Interface().(proto.Message) - Ω(ok).Should(BeTrue(), "Message value is not a proto.Message") - - err = proto.Unmarshal(body, actual) - Ω(err).ShouldNot(HaveOccurred(), "Failed to unmarshal protobuf") - - Ω(actual).Should(Equal(expected), "ProtoBuf Mismatch") - }, - ) -} - -func copyHeader(src http.Header, dst http.Header) { - for key, value := range src { - dst[key] = value - } -} - -/* -RespondWith returns a handler that responds to a request with the specified status code and body - -Body may be a string or []byte - -Also, RespondWith can be given an optional http.Header. The headers defined therein will be added to the response headers. -*/ -func RespondWith(statusCode int, body interface{}, optionalHeader ...http.Header) http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - if len(optionalHeader) == 1 { - copyHeader(optionalHeader[0], w.Header()) - } - w.WriteHeader(statusCode) - switch x := body.(type) { - case string: - w.Write([]byte(x)) - case []byte: - w.Write(x) - default: - Ω(body).Should(BeNil(), "Invalid type for body. Should be string or []byte.") - } - } -} - -/* -RespondWithPtr returns a handler that responds to a request with the specified status code and body - -Unlike RespondWith, you pass RepondWithPtr a pointer to the status code and body allowing different tests -to share the same setup but specify different status codes and bodies. - -Also, RespondWithPtr can be given an optional http.Header. The headers defined therein will be added to the response headers. -Since the http.Header can be mutated after the fact you don't need to pass in a pointer. -*/ -func RespondWithPtr(statusCode *int, body interface{}, optionalHeader ...http.Header) http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - if len(optionalHeader) == 1 { - copyHeader(optionalHeader[0], w.Header()) - } - w.WriteHeader(*statusCode) - if body != nil { - switch x := (body).(type) { - case *string: - w.Write([]byte(*x)) - case *[]byte: - w.Write(*x) - default: - Ω(body).Should(BeNil(), "Invalid type for body. Should be string or []byte.") - } - } - } -} - -/* -RespondWithJSONEncoded returns a handler that responds to a request with the specified status code and a body -containing the JSON-encoding of the passed in object - -Also, RespondWithJSONEncoded can be given an optional http.Header. The headers defined therein will be added to the response headers. -*/ -func RespondWithJSONEncoded(statusCode int, object interface{}, optionalHeader ...http.Header) http.HandlerFunc { - data, err := json.Marshal(object) - Ω(err).ShouldNot(HaveOccurred()) - - var headers http.Header - if len(optionalHeader) == 1 { - headers = optionalHeader[0] - } else { - headers = make(http.Header) - } - if _, found := headers["Content-Type"]; !found { - headers["Content-Type"] = []string{"application/json"} - } - return RespondWith(statusCode, string(data), headers) -} - -/* -RespondWithJSONEncodedPtr behaves like RespondWithJSONEncoded but takes a pointer -to a status code and object. - -This allows different tests to share the same setup but specify different status codes and JSON-encoded -objects. - -Also, RespondWithJSONEncodedPtr can be given an optional http.Header. The headers defined therein will be added to the response headers. -Since the http.Header can be mutated after the fact you don't need to pass in a pointer. -*/ -func RespondWithJSONEncodedPtr(statusCode *int, object interface{}, optionalHeader ...http.Header) http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - data, err := json.Marshal(object) - Ω(err).ShouldNot(HaveOccurred()) - var headers http.Header - if len(optionalHeader) == 1 { - headers = optionalHeader[0] - } else { - headers = make(http.Header) - } - if _, found := headers["Content-Type"]; !found { - headers["Content-Type"] = []string{"application/json"} - } - copyHeader(headers, w.Header()) - w.WriteHeader(*statusCode) - w.Write(data) - } -} - -//RespondWithProto returns a handler that responds to a request with the specified status code and a body -//containing the protobuf serialization of the provided message. -// -//Also, RespondWithProto can be given an optional http.Header. The headers defined therein will be added to the response headers. -func RespondWithProto(statusCode int, message proto.Message, optionalHeader ...http.Header) http.HandlerFunc { - return func(w http.ResponseWriter, req *http.Request) { - data, err := proto.Marshal(message) - Ω(err).ShouldNot(HaveOccurred()) - - var headers http.Header - if len(optionalHeader) == 1 { - headers = optionalHeader[0] - } else { - headers = make(http.Header) - } - if _, found := headers["Content-Type"]; !found { - headers["Content-Type"] = []string{"application/x-protobuf"} - } - copyHeader(headers, w.Header()) - - w.WriteHeader(statusCode) - w.Write(data) - } -} diff --git a/vendor/github.com/onsi/gomega/ghttp/protobuf/protobuf.go b/vendor/github.com/onsi/gomega/ghttp/protobuf/protobuf.go deleted file mode 100644 index b2972bc9f..000000000 --- a/vendor/github.com/onsi/gomega/ghttp/protobuf/protobuf.go +++ /dev/null @@ -1,3 +0,0 @@ -package protobuf - -//go:generate protoc --go_out=. simple_message.proto diff --git a/vendor/github.com/onsi/gomega/ghttp/protobuf/simple_message.pb.go b/vendor/github.com/onsi/gomega/ghttp/protobuf/simple_message.pb.go deleted file mode 100644 index c55a48448..000000000 --- a/vendor/github.com/onsi/gomega/ghttp/protobuf/simple_message.pb.go +++ /dev/null @@ -1,55 +0,0 @@ -// Code generated by protoc-gen-go. -// source: simple_message.proto -// DO NOT EDIT! - -/* -Package protobuf is a generated protocol buffer package. - -It is generated from these files: - simple_message.proto - -It has these top-level messages: - SimpleMessage -*/ -package protobuf - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -type SimpleMessage struct { - Description *string `protobuf:"bytes,1,req,name=description" json:"description,omitempty"` - Id *int32 `protobuf:"varint,2,req,name=id" json:"id,omitempty"` - Metadata *string `protobuf:"bytes,3,opt,name=metadata" json:"metadata,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *SimpleMessage) Reset() { *m = SimpleMessage{} } -func (m *SimpleMessage) String() string { return proto.CompactTextString(m) } -func (*SimpleMessage) ProtoMessage() {} - -func (m *SimpleMessage) GetDescription() string { - if m != nil && m.Description != nil { - return *m.Description - } - return "" -} - -func (m *SimpleMessage) GetId() int32 { - if m != nil && m.Id != nil { - return *m.Id - } - return 0 -} - -func (m *SimpleMessage) GetMetadata() string { - if m != nil && m.Metadata != nil { - return *m.Metadata - } - return "" -} diff --git a/vendor/github.com/onsi/gomega/ghttp/protobuf/simple_message.proto b/vendor/github.com/onsi/gomega/ghttp/protobuf/simple_message.proto deleted file mode 100644 index 35b7145c2..000000000 --- a/vendor/github.com/onsi/gomega/ghttp/protobuf/simple_message.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto2"; - -package protobuf; - -message SimpleMessage { - required string description = 1; - required int32 id = 2; - optional string metadata = 3; -} diff --git a/vendor/github.com/onsi/gomega/ghttp/test_server.go b/vendor/github.com/onsi/gomega/ghttp/test_server.go deleted file mode 100644 index 40d92dea2..000000000 --- a/vendor/github.com/onsi/gomega/ghttp/test_server.go +++ /dev/null @@ -1,381 +0,0 @@ -/* -Package ghttp supports testing HTTP clients by providing a test server (simply a thin wrapper around httptest's server) that supports -registering multiple handlers. Incoming requests are not routed between the different handlers -- rather it is merely the order of the handlers that matters. The first request is handled by the first -registered handler, the second request by the second handler, etc. - -The intent here is to have each handler *verify* that the incoming request is valid. To accomplish, ghttp -also provides a collection of bite-size handlers that each perform one aspect of request verification. These can -be composed together and registered with a ghttp server. The result is an expressive language for describing -the requests generated by the client under test. - -Here's a simple example, note that the server handler is only defined in one BeforeEach and then modified, as required, by the nested BeforeEaches. -A more comprehensive example is available at https://onsi.github.io/gomega/#_testing_http_clients - - var _ = Describe("A Sprockets Client", func() { - var server *ghttp.Server - var client *SprocketClient - BeforeEach(func() { - server = ghttp.NewServer() - client = NewSprocketClient(server.URL(), "skywalker", "tk427") - }) - - AfterEach(func() { - server.Close() - }) - - Describe("fetching sprockets", func() { - var statusCode int - var sprockets []Sprocket - BeforeEach(func() { - statusCode = http.StatusOK - sprockets = []Sprocket{} - server.AppendHandlers(ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/sprockets"), - ghttp.VerifyBasicAuth("skywalker", "tk427"), - ghttp.RespondWithJSONEncodedPtr(&statusCode, &sprockets), - )) - }) - - Context("when requesting all sprockets", func() { - Context("when the response is succesful", func() { - BeforeEach(func() { - sprockets = []Sprocket{ - NewSprocket("Alfalfa"), - NewSprocket("Banana"), - } - }) - - It("should return the returned sprockets", func() { - Ω(client.Sprockets()).Should(Equal(sprockets)) - }) - }) - - Context("when the response is missing", func() { - BeforeEach(func() { - statusCode = http.StatusNotFound - }) - - It("should return an empty list of sprockets", func() { - Ω(client.Sprockets()).Should(BeEmpty()) - }) - }) - - Context("when the response fails to authenticate", func() { - BeforeEach(func() { - statusCode = http.StatusUnauthorized - }) - - It("should return an AuthenticationError error", func() { - sprockets, err := client.Sprockets() - Ω(sprockets).Should(BeEmpty()) - Ω(err).Should(MatchError(AuthenticationError)) - }) - }) - - Context("when the response is a server failure", func() { - BeforeEach(func() { - statusCode = http.StatusInternalServerError - }) - - It("should return an InternalError error", func() { - sprockets, err := client.Sprockets() - Ω(sprockets).Should(BeEmpty()) - Ω(err).Should(MatchError(InternalError)) - }) - }) - }) - - Context("when requesting some sprockets", func() { - BeforeEach(func() { - sprockets = []Sprocket{ - NewSprocket("Alfalfa"), - NewSprocket("Banana"), - } - - server.WrapHandler(0, ghttp.VerifyRequest("GET", "/sprockets", "filter=FOOD")) - }) - - It("should make the request with a filter", func() { - Ω(client.Sprockets("food")).Should(Equal(sprockets)) - }) - }) - }) - }) -*/ -package ghttp - -import ( - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "reflect" - "regexp" - "strings" - "sync" - - . "github.com/onsi/gomega" -) - -func new() *Server { - return &Server{ - AllowUnhandledRequests: false, - UnhandledRequestStatusCode: http.StatusInternalServerError, - writeLock: &sync.Mutex{}, - } -} - -type routedHandler struct { - method string - pathRegexp *regexp.Regexp - path string - handler http.HandlerFunc -} - -// NewServer returns a new `*ghttp.Server` that wraps an `httptest` server. The server is started automatically. -func NewServer() *Server { - s := new() - s.HTTPTestServer = httptest.NewServer(s) - return s -} - -// NewUnstartedServer return a new, unstarted, `*ghttp.Server`. Useful for specifying a custom listener on `server.HTTPTestServer`. -func NewUnstartedServer() *Server { - s := new() - s.HTTPTestServer = httptest.NewUnstartedServer(s) - return s -} - -// NewTLSServer returns a new `*ghttp.Server` that wraps an `httptest` TLS server. The server is started automatically. -func NewTLSServer() *Server { - s := new() - s.HTTPTestServer = httptest.NewTLSServer(s) - return s -} - -type Server struct { - //The underlying httptest server - HTTPTestServer *httptest.Server - - //Defaults to false. If set to true, the Server will allow more requests than there are registered handlers. - AllowUnhandledRequests bool - - //The status code returned when receiving an unhandled request. - //Defaults to http.StatusInternalServerError. - //Only applies if AllowUnhandledRequests is true - UnhandledRequestStatusCode int - - //If provided, ghttp will log about each request received to the provided io.Writer - //Defaults to nil - //If you're using Ginkgo, set this to GinkgoWriter to get improved output during failures - Writer io.Writer - - receivedRequests []*http.Request - requestHandlers []http.HandlerFunc - routedHandlers []routedHandler - - writeLock *sync.Mutex - calls int -} - -//Start() starts an unstarted ghttp server. It is a catastrophic error to call Start more than once (thanks, httptest). -func (s *Server) Start() { - s.HTTPTestServer.Start() -} - -//URL() returns a url that will hit the server -func (s *Server) URL() string { - return s.HTTPTestServer.URL -} - -//Addr() returns the address on which the server is listening. -func (s *Server) Addr() string { - return s.HTTPTestServer.Listener.Addr().String() -} - -//Close() should be called at the end of each test. It spins down and cleans up the test server. -func (s *Server) Close() { - s.writeLock.Lock() - server := s.HTTPTestServer - s.HTTPTestServer = nil - s.writeLock.Unlock() - - if server != nil { - server.Close() - } -} - -//ServeHTTP() makes Server an http.Handler -//When the server receives a request it handles the request in the following order: -// -//1. If the request matches a handler registered with RouteToHandler, that handler is called. -//2. Otherwise, if there are handlers registered via AppendHandlers, those handlers are called in order. -//3. If all registered handlers have been called then: -// a) If AllowUnhandledRequests is true, the request will be handled with response code of UnhandledRequestStatusCode -// b) If AllowUnhandledRequests is false, the request will not be handled and the current test will be marked as failed. -func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { - s.writeLock.Lock() - defer func() { - e := recover() - if e != nil { - w.WriteHeader(http.StatusInternalServerError) - } - - //If the handler panics GHTTP will silently succeed. This is bad™. - //To catch this case we need to fail the test if the handler has panicked. - //However, if the handler is panicking because Ginkgo's causing it to panic (i.e. an assertion failed) - //then we shouldn't double-report the error as this will confuse people. - - //So: step 1, if this is a Ginkgo panic - do nothing, Ginkgo's aware of the failure - eAsString, ok := e.(string) - if ok && strings.Contains(eAsString, "defer GinkgoRecover()") { - return - } - - //If we're here, we have to do step 2: assert that the error is nil. This assertion will - //allow us to fail the test suite (note: we can't call Fail since Gomega is not allowed to import Ginkgo). - //Since a failed assertion throws a panic, and we are likely in a goroutine, we need to defer within our defer! - defer func() { - recover() - }() - Ω(e).Should(BeNil(), "Handler Panicked") - }() - - if s.Writer != nil { - s.Writer.Write([]byte(fmt.Sprintf("GHTTP Received Request: %s - %s\n", req.Method, req.URL))) - } - - s.receivedRequests = append(s.receivedRequests, req) - if routedHandler, ok := s.handlerForRoute(req.Method, req.URL.Path); ok { - s.writeLock.Unlock() - routedHandler(w, req) - } else if s.calls < len(s.requestHandlers) { - h := s.requestHandlers[s.calls] - s.calls++ - s.writeLock.Unlock() - h(w, req) - } else { - s.writeLock.Unlock() - if s.AllowUnhandledRequests { - ioutil.ReadAll(req.Body) - req.Body.Close() - w.WriteHeader(s.UnhandledRequestStatusCode) - } else { - Ω(req).Should(BeNil(), "Received Unhandled Request") - } - } -} - -//ReceivedRequests is an array containing all requests received by the server (both handled and unhandled requests) -func (s *Server) ReceivedRequests() []*http.Request { - s.writeLock.Lock() - defer s.writeLock.Unlock() - - return s.receivedRequests -} - -//RouteToHandler can be used to register handlers that will always handle requests that match -//the passed in method and path. -// -//The path may be either a string object or a *regexp.Regexp. -func (s *Server) RouteToHandler(method string, path interface{}, handler http.HandlerFunc) { - s.writeLock.Lock() - defer s.writeLock.Unlock() - - rh := routedHandler{ - method: method, - handler: handler, - } - - switch p := path.(type) { - case *regexp.Regexp: - rh.pathRegexp = p - case string: - rh.path = p - default: - panic("path must be a string or a regular expression") - } - - for i, existingRH := range s.routedHandlers { - if existingRH.method == method && - reflect.DeepEqual(existingRH.pathRegexp, rh.pathRegexp) && - existingRH.path == rh.path { - s.routedHandlers[i] = rh - return - } - } - s.routedHandlers = append(s.routedHandlers, rh) -} - -func (s *Server) handlerForRoute(method string, path string) (http.HandlerFunc, bool) { - for _, rh := range s.routedHandlers { - if rh.method == method { - if rh.pathRegexp != nil { - if rh.pathRegexp.Match([]byte(path)) { - return rh.handler, true - } - } else if rh.path == path { - return rh.handler, true - } - } - } - - return nil, false -} - -//AppendHandlers will appends http.HandlerFuncs to the server's list of registered handlers. The first incoming request is handled by the first handler, the second by the second, etc... -func (s *Server) AppendHandlers(handlers ...http.HandlerFunc) { - s.writeLock.Lock() - defer s.writeLock.Unlock() - - s.requestHandlers = append(s.requestHandlers, handlers...) -} - -//SetHandler overrides the registered handler at the passed in index with the passed in handler -//This is useful, for example, when a server has been set up in a shared context, but must be tweaked -//for a particular test. -func (s *Server) SetHandler(index int, handler http.HandlerFunc) { - s.writeLock.Lock() - defer s.writeLock.Unlock() - - s.requestHandlers[index] = handler -} - -//GetHandler returns the handler registered at the passed in index. -func (s *Server) GetHandler(index int) http.HandlerFunc { - s.writeLock.Lock() - defer s.writeLock.Unlock() - - return s.requestHandlers[index] -} - -func (s *Server) Reset() { - s.writeLock.Lock() - defer s.writeLock.Unlock() - - s.HTTPTestServer.CloseClientConnections() - s.calls = 0 - s.receivedRequests = nil - s.requestHandlers = nil - s.routedHandlers = nil -} - -//WrapHandler combines the passed in handler with the handler registered at the passed in index. -//This is useful, for example, when a server has been set up in a shared context but must be tweaked -//for a particular test. -// -//If the currently registered handler is A, and the new passed in handler is B then -//WrapHandler will generate a new handler that first calls A, then calls B, and assign it to index -func (s *Server) WrapHandler(index int, handler http.HandlerFunc) { - existingHandler := s.GetHandler(index) - s.SetHandler(index, CombineHandlers(existingHandler, handler)) -} - -func (s *Server) CloseClientConnections() { - s.writeLock.Lock() - defer s.writeLock.Unlock() - - s.HTTPTestServer.CloseClientConnections() -} diff --git a/vendor/github.com/onsi/gomega/ghttp/test_server_suite_test.go b/vendor/github.com/onsi/gomega/ghttp/test_server_suite_test.go deleted file mode 100644 index 7c1236082..000000000 --- a/vendor/github.com/onsi/gomega/ghttp/test_server_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package ghttp_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestGHTTP(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "GHTTP Suite") -} diff --git a/vendor/github.com/onsi/gomega/ghttp/test_server_test.go b/vendor/github.com/onsi/gomega/ghttp/test_server_test.go deleted file mode 100644 index 88b324654..000000000 --- a/vendor/github.com/onsi/gomega/ghttp/test_server_test.go +++ /dev/null @@ -1,1089 +0,0 @@ -package ghttp_test - -import ( - "bytes" - "io" - "io/ioutil" - "net/http" - "net/url" - "regexp" - - "github.com/golang/protobuf/proto" - "github.com/onsi/gomega/gbytes" - "github.com/onsi/gomega/ghttp/protobuf" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - . "github.com/onsi/gomega/ghttp" -) - -var _ = Describe("TestServer", func() { - var ( - resp *http.Response - err error - s *Server - ) - - BeforeEach(func() { - s = NewServer() - }) - - AfterEach(func() { - s.Close() - }) - - Describe("Resetting the server", func() { - BeforeEach(func() { - s.RouteToHandler("GET", "/", func(w http.ResponseWriter, req *http.Request) {}) - s.AppendHandlers(func(w http.ResponseWriter, req *http.Request) {}) - http.Get(s.URL() + "/") - - Ω(s.ReceivedRequests()).Should(HaveLen(1)) - }) - - It("clears all handlers and call counts", func() { - s.Reset() - Ω(s.ReceivedRequests()).Should(HaveLen(0)) - Ω(func() { s.GetHandler(0) }).Should(Panic()) - }) - }) - - Describe("closing client connections", func() { - It("closes", func() { - s.RouteToHandler("GET", "/", - func(w http.ResponseWriter, req *http.Request) { - io.WriteString(w, req.RemoteAddr) - }, - ) - client := http.Client{Transport: &http.Transport{DisableKeepAlives: true}} - resp, err := client.Get(s.URL()) - Ω(err).ShouldNot(HaveOccurred()) - Ω(resp.StatusCode).Should(Equal(200)) - - body, err := ioutil.ReadAll(resp.Body) - resp.Body.Close() - Ω(err).ShouldNot(HaveOccurred()) - - s.CloseClientConnections() - - resp, err = client.Get(s.URL()) - Ω(err).ShouldNot(HaveOccurred()) - Ω(resp.StatusCode).Should(Equal(200)) - - body2, err := ioutil.ReadAll(resp.Body) - resp.Body.Close() - Ω(err).ShouldNot(HaveOccurred()) - - Ω(body2).ShouldNot(Equal(body)) - }) - }) - - Describe("closing server mulitple times", func() { - It("should not fail", func() { - s.Close() - Ω(s.Close).ShouldNot(Panic()) - }) - }) - - Describe("allowing unhandled requests", func() { - Context("when true", func() { - BeforeEach(func() { - s.AllowUnhandledRequests = true - s.UnhandledRequestStatusCode = http.StatusForbidden - resp, err = http.Get(s.URL() + "/foo") - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should allow unhandled requests and respond with the passed in status code", func() { - Ω(err).ShouldNot(HaveOccurred()) - Ω(resp.StatusCode).Should(Equal(http.StatusForbidden)) - - data, err := ioutil.ReadAll(resp.Body) - Ω(err).ShouldNot(HaveOccurred()) - Ω(data).Should(BeEmpty()) - }) - - It("should record the requests", func() { - Ω(s.ReceivedRequests()).Should(HaveLen(1)) - Ω(s.ReceivedRequests()[0].URL.Path).Should(Equal("/foo")) - }) - }) - - Context("when false", func() { - It("should fail when attempting a request", func() { - failures := InterceptGomegaFailures(func() { - http.Get(s.URL() + "/foo") - }) - - Ω(failures[0]).Should(ContainSubstring("Received Unhandled Request")) - }) - }) - }) - - Describe("Managing Handlers", func() { - var called []string - BeforeEach(func() { - called = []string{} - s.RouteToHandler("GET", "/routed", func(w http.ResponseWriter, req *http.Request) { - called = append(called, "r1") - }) - s.RouteToHandler("POST", regexp.MustCompile(`/routed\d`), func(w http.ResponseWriter, req *http.Request) { - called = append(called, "r2") - }) - s.AppendHandlers(func(w http.ResponseWriter, req *http.Request) { - called = append(called, "A") - }, func(w http.ResponseWriter, req *http.Request) { - called = append(called, "B") - }) - }) - - It("should prefer routed handlers if there is a match", func() { - http.Get(s.URL() + "/routed") - http.Post(s.URL()+"/routed7", "application/json", nil) - http.Get(s.URL() + "/foo") - http.Get(s.URL() + "/routed") - http.Post(s.URL()+"/routed9", "application/json", nil) - http.Get(s.URL() + "/bar") - - failures := InterceptGomegaFailures(func() { - http.Get(s.URL() + "/foo") - http.Get(s.URL() + "/routed/not/a/match") - http.Get(s.URL() + "/routed7") - http.Post(s.URL()+"/routed", "application/json", nil) - }) - - Ω(failures[0]).Should(ContainSubstring("Received Unhandled Request")) - Ω(failures).Should(HaveLen(4)) - - http.Post(s.URL()+"/routed3", "application/json", nil) - - Ω(called).Should(Equal([]string{"r1", "r2", "A", "r1", "r2", "B", "r2"})) - }) - - It("should override routed handlers when reregistered", func() { - s.RouteToHandler("GET", "/routed", func(w http.ResponseWriter, req *http.Request) { - called = append(called, "r3") - }) - s.RouteToHandler("POST", regexp.MustCompile(`/routed\d`), func(w http.ResponseWriter, req *http.Request) { - called = append(called, "r4") - }) - - http.Get(s.URL() + "/routed") - http.Post(s.URL()+"/routed7", "application/json", nil) - - Ω(called).Should(Equal([]string{"r3", "r4"})) - }) - - It("should call the appended handlers, in order, as requests come in", func() { - http.Get(s.URL() + "/foo") - Ω(called).Should(Equal([]string{"A"})) - - http.Get(s.URL() + "/foo") - Ω(called).Should(Equal([]string{"A", "B"})) - - failures := InterceptGomegaFailures(func() { - http.Get(s.URL() + "/foo") - }) - - Ω(failures[0]).Should(ContainSubstring("Received Unhandled Request")) - }) - - Describe("Overwriting an existing handler", func() { - BeforeEach(func() { - s.SetHandler(0, func(w http.ResponseWriter, req *http.Request) { - called = append(called, "C") - }) - }) - - It("should override the specified handler", func() { - http.Get(s.URL() + "/foo") - http.Get(s.URL() + "/foo") - Ω(called).Should(Equal([]string{"C", "B"})) - }) - }) - - Describe("Getting an existing handler", func() { - It("should return the handler func", func() { - s.GetHandler(1)(nil, nil) - Ω(called).Should(Equal([]string{"B"})) - }) - }) - - Describe("Wrapping an existing handler", func() { - BeforeEach(func() { - s.WrapHandler(0, func(w http.ResponseWriter, req *http.Request) { - called = append(called, "C") - }) - }) - - It("should wrap the existing handler in a new handler", func() { - http.Get(s.URL() + "/foo") - http.Get(s.URL() + "/foo") - Ω(called).Should(Equal([]string{"A", "C", "B"})) - }) - }) - }) - - Describe("When a handler fails", func() { - BeforeEach(func() { - s.UnhandledRequestStatusCode = http.StatusForbidden //just to be clear that 500s aren't coming from unhandled requests - }) - - Context("because the handler has panicked", func() { - BeforeEach(func() { - s.AppendHandlers(func(w http.ResponseWriter, req *http.Request) { - panic("bam") - }) - }) - - It("should respond with a 500 and make a failing assertion", func() { - var resp *http.Response - var err error - - failures := InterceptGomegaFailures(func() { - resp, err = http.Get(s.URL()) - }) - - Ω(err).ShouldNot(HaveOccurred()) - Ω(resp.StatusCode).Should(Equal(http.StatusInternalServerError)) - Ω(failures).Should(ConsistOf(ContainSubstring("Handler Panicked"))) - }) - }) - - Context("because an assertion has failed", func() { - BeforeEach(func() { - s.AppendHandlers(func(w http.ResponseWriter, req *http.Request) { - // Ω(true).Should(BeFalse()) <-- would be nice to do it this way, but the test just can't be written this way - - By("We're cheating a bit here -- we're throwing a GINKGO_PANIC which simulates a failed assertion") - panic(GINKGO_PANIC) - }) - }) - - It("should respond with a 500 and *not* make a failing assertion, instead relying on Ginkgo to have already been notified of the error", func() { - resp, err := http.Get(s.URL()) - - Ω(err).ShouldNot(HaveOccurred()) - Ω(resp.StatusCode).Should(Equal(http.StatusInternalServerError)) - }) - }) - }) - - Describe("Logging to the Writer", func() { - var buf *gbytes.Buffer - BeforeEach(func() { - buf = gbytes.NewBuffer() - s.Writer = buf - s.AppendHandlers(func(w http.ResponseWriter, req *http.Request) {}) - s.AppendHandlers(func(w http.ResponseWriter, req *http.Request) {}) - }) - - It("should write to the buffer when a request comes in", func() { - http.Get(s.URL() + "/foo") - Ω(buf).Should(gbytes.Say("GHTTP Received Request: GET - /foo\n")) - - http.Post(s.URL()+"/bar", "", nil) - Ω(buf).Should(gbytes.Say("GHTTP Received Request: POST - /bar\n")) - }) - }) - - Describe("Request Handlers", func() { - Describe("VerifyRequest", func() { - BeforeEach(func() { - s.AppendHandlers(VerifyRequest("GET", "/foo")) - }) - - It("should verify the method, path", func() { - resp, err = http.Get(s.URL() + "/foo?baz=bar") - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should verify the method, path", func() { - failures := InterceptGomegaFailures(func() { - http.Get(s.URL() + "/foo2") - }) - Ω(failures).Should(HaveLen(1)) - }) - - It("should verify the method, path", func() { - failures := InterceptGomegaFailures(func() { - http.Post(s.URL()+"/foo", "application/json", nil) - }) - Ω(failures).Should(HaveLen(1)) - }) - - Context("when passed a rawQuery", func() { - It("should also be possible to verify the rawQuery", func() { - s.SetHandler(0, VerifyRequest("GET", "/foo", "baz=bar")) - resp, err = http.Get(s.URL() + "/foo?baz=bar") - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should match irregardless of query parameter ordering", func() { - s.SetHandler(0, VerifyRequest("GET", "/foo", "type=get&name=money")) - u, _ := url.Parse(s.URL() + "/foo") - u.RawQuery = url.Values{ - "type": []string{"get"}, - "name": []string{"money"}, - }.Encode() - - resp, err = http.Get(u.String()) - Ω(err).ShouldNot(HaveOccurred()) - }) - }) - - Context("when passed a matcher for path", func() { - It("should apply the matcher", func() { - s.SetHandler(0, VerifyRequest("GET", MatchRegexp(`/foo/[a-f]*/3`))) - resp, err = http.Get(s.URL() + "/foo/abcdefa/3") - Ω(err).ShouldNot(HaveOccurred()) - }) - }) - }) - - Describe("VerifyContentType", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("GET", "/foo"), - VerifyContentType("application/octet-stream"), - )) - }) - - It("should verify the content type", func() { - req, err := http.NewRequest("GET", s.URL()+"/foo", nil) - Ω(err).ShouldNot(HaveOccurred()) - req.Header.Set("Content-Type", "application/octet-stream") - - resp, err = http.DefaultClient.Do(req) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should verify the content type", func() { - req, err := http.NewRequest("GET", s.URL()+"/foo", nil) - Ω(err).ShouldNot(HaveOccurred()) - req.Header.Set("Content-Type", "application/json") - - failures := InterceptGomegaFailures(func() { - http.DefaultClient.Do(req) - }) - Ω(failures).Should(HaveLen(1)) - }) - }) - - Describe("Verify BasicAuth", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("GET", "/foo"), - VerifyBasicAuth("bob", "password"), - )) - }) - - It("should verify basic auth", func() { - req, err := http.NewRequest("GET", s.URL()+"/foo", nil) - Ω(err).ShouldNot(HaveOccurred()) - req.SetBasicAuth("bob", "password") - - resp, err = http.DefaultClient.Do(req) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should verify basic auth", func() { - req, err := http.NewRequest("GET", s.URL()+"/foo", nil) - Ω(err).ShouldNot(HaveOccurred()) - req.SetBasicAuth("bob", "bassword") - - failures := InterceptGomegaFailures(func() { - http.DefaultClient.Do(req) - }) - Ω(failures).Should(HaveLen(1)) - }) - - It("should require basic auth header", func() { - req, err := http.NewRequest("GET", s.URL()+"/foo", nil) - Ω(err).ShouldNot(HaveOccurred()) - - failures := InterceptGomegaFailures(func() { - http.DefaultClient.Do(req) - }) - Ω(failures).Should(ContainElement(ContainSubstring("Authorization header must be specified"))) - }) - }) - - Describe("VerifyHeader", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("GET", "/foo"), - VerifyHeader(http.Header{ - "accept": []string{"jpeg", "png"}, - "cache-control": []string{"omicron"}, - "Return-Path": []string{"hobbiton"}, - }), - )) - }) - - It("should verify the headers", func() { - req, err := http.NewRequest("GET", s.URL()+"/foo", nil) - Ω(err).ShouldNot(HaveOccurred()) - req.Header.Add("Accept", "jpeg") - req.Header.Add("Accept", "png") - req.Header.Add("Cache-Control", "omicron") - req.Header.Add("return-path", "hobbiton") - - resp, err = http.DefaultClient.Do(req) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should verify the headers", func() { - req, err := http.NewRequest("GET", s.URL()+"/foo", nil) - Ω(err).ShouldNot(HaveOccurred()) - req.Header.Add("Schmaccept", "jpeg") - req.Header.Add("Schmaccept", "png") - req.Header.Add("Cache-Control", "omicron") - req.Header.Add("return-path", "hobbiton") - - failures := InterceptGomegaFailures(func() { - http.DefaultClient.Do(req) - }) - Ω(failures).Should(HaveLen(1)) - }) - }) - - Describe("VerifyHeaderKV", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("GET", "/foo"), - VerifyHeaderKV("accept", "jpeg", "png"), - VerifyHeaderKV("cache-control", "omicron"), - VerifyHeaderKV("Return-Path", "hobbiton"), - )) - }) - - It("should verify the headers", func() { - req, err := http.NewRequest("GET", s.URL()+"/foo", nil) - Ω(err).ShouldNot(HaveOccurred()) - req.Header.Add("Accept", "jpeg") - req.Header.Add("Accept", "png") - req.Header.Add("Cache-Control", "omicron") - req.Header.Add("return-path", "hobbiton") - - resp, err = http.DefaultClient.Do(req) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should verify the headers", func() { - req, err := http.NewRequest("GET", s.URL()+"/foo", nil) - Ω(err).ShouldNot(HaveOccurred()) - req.Header.Add("Accept", "jpeg") - req.Header.Add("Cache-Control", "omicron") - req.Header.Add("return-path", "hobbiton") - - failures := InterceptGomegaFailures(func() { - http.DefaultClient.Do(req) - }) - Ω(failures).Should(HaveLen(1)) - }) - }) - - Describe("VerifyBody", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - VerifyBody([]byte("some body")), - )) - }) - - It("should verify the body", func() { - resp, err = http.Post(s.URL()+"/foo", "", bytes.NewReader([]byte("some body"))) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should verify the body", func() { - failures := InterceptGomegaFailures(func() { - http.Post(s.URL()+"/foo", "", bytes.NewReader([]byte("wrong body"))) - }) - Ω(failures).Should(HaveLen(1)) - }) - }) - - Describe("VerifyJSON", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - VerifyJSON(`{"a":3, "b":2}`), - )) - }) - - It("should verify the json body and the content type", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", bytes.NewReader([]byte(`{"b":2, "a":3}`))) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should verify the json body and the content type", func() { - failures := InterceptGomegaFailures(func() { - http.Post(s.URL()+"/foo", "application/json", bytes.NewReader([]byte(`{"b":2, "a":4}`))) - }) - Ω(failures).Should(HaveLen(1)) - }) - - It("should verify the json body and the content type", func() { - failures := InterceptGomegaFailures(func() { - http.Post(s.URL()+"/foo", "application/not-json", bytes.NewReader([]byte(`{"b":2, "a":3}`))) - }) - Ω(failures).Should(HaveLen(1)) - }) - }) - - Describe("VerifyJSONRepresenting", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - VerifyJSONRepresenting([]int{1, 3, 5}), - )) - }) - - It("should verify the json body and the content type", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", bytes.NewReader([]byte(`[1,3,5]`))) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should verify the json body and the content type", func() { - failures := InterceptGomegaFailures(func() { - http.Post(s.URL()+"/foo", "application/json", bytes.NewReader([]byte(`[1,3]`))) - }) - Ω(failures).Should(HaveLen(1)) - }) - }) - - Describe("VerifyForm", func() { - var formValues url.Values - - BeforeEach(func() { - formValues = make(url.Values) - formValues.Add("users", "user1") - formValues.Add("users", "user2") - formValues.Add("group", "users") - }) - - Context("when encoded in the URL", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("GET", "/foo"), - VerifyForm(url.Values{ - "users": []string{"user1", "user2"}, - "group": []string{"users"}, - }), - )) - }) - - It("should verify form values", func() { - resp, err = http.Get(s.URL() + "/foo?" + formValues.Encode()) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should ignore extra values", func() { - formValues.Add("extra", "value") - resp, err = http.Get(s.URL() + "/foo?" + formValues.Encode()) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("fail on missing values", func() { - formValues.Del("group") - failures := InterceptGomegaFailures(func() { - resp, err = http.Get(s.URL() + "/foo?" + formValues.Encode()) - }) - Ω(failures).Should(HaveLen(1)) - }) - - It("fail on incorrect values", func() { - formValues.Set("group", "wheel") - failures := InterceptGomegaFailures(func() { - resp, err = http.Get(s.URL() + "/foo?" + formValues.Encode()) - }) - Ω(failures).Should(HaveLen(1)) - }) - }) - - Context("when present in the body", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - VerifyForm(url.Values{ - "users": []string{"user1", "user2"}, - "group": []string{"users"}, - }), - )) - }) - - It("should verify form values", func() { - resp, err = http.PostForm(s.URL()+"/foo", formValues) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should ignore extra values", func() { - formValues.Add("extra", "value") - resp, err = http.PostForm(s.URL()+"/foo", formValues) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("fail on missing values", func() { - formValues.Del("group") - failures := InterceptGomegaFailures(func() { - resp, err = http.PostForm(s.URL()+"/foo", formValues) - }) - Ω(failures).Should(HaveLen(1)) - }) - - It("fail on incorrect values", func() { - formValues.Set("group", "wheel") - failures := InterceptGomegaFailures(func() { - resp, err = http.PostForm(s.URL()+"/foo", formValues) - }) - Ω(failures).Should(HaveLen(1)) - }) - }) - }) - - Describe("VerifyFormKV", func() { - Context("when encoded in the URL", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("GET", "/foo"), - VerifyFormKV("users", "user1", "user2"), - )) - }) - - It("verifies the form value", func() { - resp, err = http.Get(s.URL() + "/foo?users=user1&users=user2") - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("verifies the form value", func() { - failures := InterceptGomegaFailures(func() { - resp, err = http.Get(s.URL() + "/foo?users=user1") - }) - Ω(failures).Should(HaveLen(1)) - }) - }) - - Context("when present in the body", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - VerifyFormKV("users", "user1", "user2"), - )) - }) - - It("verifies the form value", func() { - resp, err = http.PostForm(s.URL()+"/foo", url.Values{"users": []string{"user1", "user2"}}) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("verifies the form value", func() { - failures := InterceptGomegaFailures(func() { - resp, err = http.PostForm(s.URL()+"/foo", url.Values{"users": []string{"user1"}}) - }) - Ω(failures).Should(HaveLen(1)) - }) - }) - }) - - Describe("VerifyProtoRepresenting", func() { - var message *protobuf.SimpleMessage - - BeforeEach(func() { - message = new(protobuf.SimpleMessage) - message.Description = proto.String("A description") - message.Id = proto.Int32(0) - - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/proto"), - VerifyProtoRepresenting(message), - )) - }) - - It("verifies the proto body and the content type", func() { - serialized, err := proto.Marshal(message) - Ω(err).ShouldNot(HaveOccurred()) - - resp, err = http.Post(s.URL()+"/proto", "application/x-protobuf", bytes.NewReader(serialized)) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should verify the proto body and the content type", func() { - serialized, err := proto.Marshal(&protobuf.SimpleMessage{ - Description: proto.String("A description"), - Id: proto.Int32(0), - Metadata: proto.String("some metadata"), - }) - Ω(err).ShouldNot(HaveOccurred()) - - failures := InterceptGomegaFailures(func() { - http.Post(s.URL()+"/proto", "application/x-protobuf", bytes.NewReader(serialized)) - }) - Ω(failures).Should(HaveLen(1)) - }) - - It("should verify the proto body and the content type", func() { - serialized, err := proto.Marshal(message) - Ω(err).ShouldNot(HaveOccurred()) - - failures := InterceptGomegaFailures(func() { - http.Post(s.URL()+"/proto", "application/not-x-protobuf", bytes.NewReader(serialized)) - }) - Ω(failures).Should(HaveLen(1)) - }) - }) - - Describe("RespondWith", func() { - Context("without headers", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - RespondWith(http.StatusCreated, "sweet"), - ), CombineHandlers( - VerifyRequest("POST", "/foo"), - RespondWith(http.StatusOK, []byte("sour")), - )) - }) - - It("should return the response", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.StatusCode).Should(Equal(http.StatusCreated)) - - body, err := ioutil.ReadAll(resp.Body) - Ω(err).ShouldNot(HaveOccurred()) - Ω(body).Should(Equal([]byte("sweet"))) - - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.StatusCode).Should(Equal(http.StatusOK)) - - body, err = ioutil.ReadAll(resp.Body) - Ω(err).ShouldNot(HaveOccurred()) - Ω(body).Should(Equal([]byte("sour"))) - }) - }) - - Context("with headers", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - RespondWith(http.StatusCreated, "sweet", http.Header{"X-Custom-Header": []string{"my header"}}), - )) - }) - - It("should return the headers too", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.StatusCode).Should(Equal(http.StatusCreated)) - Ω(ioutil.ReadAll(resp.Body)).Should(Equal([]byte("sweet"))) - Ω(resp.Header.Get("X-Custom-Header")).Should(Equal("my header")) - }) - }) - }) - - Describe("RespondWithPtr", func() { - var code int - var byteBody []byte - var stringBody string - BeforeEach(func() { - code = http.StatusOK - byteBody = []byte("sweet") - stringBody = "sour" - - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - RespondWithPtr(&code, &byteBody), - ), CombineHandlers( - VerifyRequest("POST", "/foo"), - RespondWithPtr(&code, &stringBody), - )) - }) - - It("should return the response", func() { - code = http.StatusCreated - byteBody = []byte("tasty") - stringBody = "treat" - - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.StatusCode).Should(Equal(http.StatusCreated)) - - body, err := ioutil.ReadAll(resp.Body) - Ω(err).ShouldNot(HaveOccurred()) - Ω(body).Should(Equal([]byte("tasty"))) - - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.StatusCode).Should(Equal(http.StatusCreated)) - - body, err = ioutil.ReadAll(resp.Body) - Ω(err).ShouldNot(HaveOccurred()) - Ω(body).Should(Equal([]byte("treat"))) - }) - - Context("when passed a nil body", func() { - BeforeEach(func() { - s.SetHandler(0, CombineHandlers( - VerifyRequest("POST", "/foo"), - RespondWithPtr(&code, nil), - )) - }) - - It("should return an empty body and not explode", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - - Ω(err).ShouldNot(HaveOccurred()) - Ω(resp.StatusCode).Should(Equal(http.StatusOK)) - body, err := ioutil.ReadAll(resp.Body) - Ω(err).ShouldNot(HaveOccurred()) - Ω(body).Should(BeEmpty()) - - Ω(s.ReceivedRequests()).Should(HaveLen(1)) - }) - }) - }) - - Describe("RespondWithJSON", func() { - Context("when no optional headers are set", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - RespondWithJSONEncoded(http.StatusCreated, []int{1, 2, 3}), - )) - }) - - It("should return the response", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.StatusCode).Should(Equal(http.StatusCreated)) - - body, err := ioutil.ReadAll(resp.Body) - Ω(err).ShouldNot(HaveOccurred()) - Ω(body).Should(MatchJSON("[1,2,3]")) - }) - - It("should set the Content-Type header to application/json", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Content-Type"]).Should(Equal([]string{"application/json"})) - }) - }) - - Context("when optional headers are set", func() { - var headers http.Header - BeforeEach(func() { - headers = http.Header{"Stuff": []string{"things"}} - }) - - JustBeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - RespondWithJSONEncoded(http.StatusCreated, []int{1, 2, 3}, headers), - )) - }) - - It("should preserve those headers", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Stuff"]).Should(Equal([]string{"things"})) - }) - - It("should set the Content-Type header to application/json", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Content-Type"]).Should(Equal([]string{"application/json"})) - }) - - Context("when setting the Content-Type explicitly", func() { - BeforeEach(func() { - headers["Content-Type"] = []string{"not-json"} - }) - - It("should use the Content-Type header that was explicitly set", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Content-Type"]).Should(Equal([]string{"not-json"})) - }) - }) - }) - }) - - Describe("RespondWithJSONPtr", func() { - type testObject struct { - Key string - Value string - } - - var code int - var object testObject - - Context("when no optional headers are set", func() { - BeforeEach(func() { - code = http.StatusOK - object = testObject{} - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - RespondWithJSONEncodedPtr(&code, &object), - )) - }) - - It("should return the response", func() { - code = http.StatusCreated - object = testObject{ - Key: "Jim", - Value: "Codes", - } - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.StatusCode).Should(Equal(http.StatusCreated)) - - body, err := ioutil.ReadAll(resp.Body) - Ω(err).ShouldNot(HaveOccurred()) - Ω(body).Should(MatchJSON(`{"Key": "Jim", "Value": "Codes"}`)) - }) - - It("should set the Content-Type header to application/json", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Content-Type"]).Should(Equal([]string{"application/json"})) - }) - }) - - Context("when optional headers are set", func() { - var headers http.Header - BeforeEach(func() { - headers = http.Header{"Stuff": []string{"things"}} - }) - - JustBeforeEach(func() { - code = http.StatusOK - object = testObject{} - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/foo"), - RespondWithJSONEncodedPtr(&code, &object, headers), - )) - }) - - It("should preserve those headers", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Stuff"]).Should(Equal([]string{"things"})) - }) - - It("should set the Content-Type header to application/json", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Content-Type"]).Should(Equal([]string{"application/json"})) - }) - - Context("when setting the Content-Type explicitly", func() { - BeforeEach(func() { - headers["Content-Type"] = []string{"not-json"} - }) - - It("should use the Content-Type header that was explicitly set", func() { - resp, err = http.Post(s.URL()+"/foo", "application/json", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Content-Type"]).Should(Equal([]string{"not-json"})) - }) - }) - }) - }) - - Describe("RespondWithProto", func() { - var message *protobuf.SimpleMessage - - BeforeEach(func() { - message = new(protobuf.SimpleMessage) - message.Description = proto.String("A description") - message.Id = proto.Int32(99) - }) - - Context("when no optional headers are set", func() { - BeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/proto"), - RespondWithProto(http.StatusCreated, message), - )) - }) - - It("should return the response", func() { - resp, err = http.Post(s.URL()+"/proto", "application/x-protobuf", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.StatusCode).Should(Equal(http.StatusCreated)) - - var received protobuf.SimpleMessage - body, err := ioutil.ReadAll(resp.Body) - err = proto.Unmarshal(body, &received) - Ω(err).ShouldNot(HaveOccurred()) - }) - - It("should set the Content-Type header to application/x-protobuf", func() { - resp, err = http.Post(s.URL()+"/proto", "application/x-protobuf", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Content-Type"]).Should(Equal([]string{"application/x-protobuf"})) - }) - }) - - Context("when optional headers are set", func() { - var headers http.Header - BeforeEach(func() { - headers = http.Header{"Stuff": []string{"things"}} - }) - - JustBeforeEach(func() { - s.AppendHandlers(CombineHandlers( - VerifyRequest("POST", "/proto"), - RespondWithProto(http.StatusCreated, message, headers), - )) - }) - - It("should preserve those headers", func() { - resp, err = http.Post(s.URL()+"/proto", "application/x-protobuf", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Stuff"]).Should(Equal([]string{"things"})) - }) - - It("should set the Content-Type header to application/x-protobuf", func() { - resp, err = http.Post(s.URL()+"/proto", "application/x-protobuf", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Content-Type"]).Should(Equal([]string{"application/x-protobuf"})) - }) - - Context("when setting the Content-Type explicitly", func() { - BeforeEach(func() { - headers["Content-Type"] = []string{"not-x-protobuf"} - }) - - It("should use the Content-Type header that was explicitly set", func() { - resp, err = http.Post(s.URL()+"/proto", "application/x-protobuf", nil) - Ω(err).ShouldNot(HaveOccurred()) - - Ω(resp.Header["Content-Type"]).Should(Equal([]string{"not-x-protobuf"})) - }) - }) - }) - }) - }) -}) diff --git a/vendor/github.com/onsi/gomega/gstruct/elements.go b/vendor/github.com/onsi/gomega/gstruct/elements.go deleted file mode 100644 index a315fa139..000000000 --- a/vendor/github.com/onsi/gomega/gstruct/elements.go +++ /dev/null @@ -1,145 +0,0 @@ -package gstruct - -import ( - "errors" - "fmt" - "reflect" - "runtime/debug" - - "github.com/onsi/gomega/format" - errorsutil "github.com/onsi/gomega/gstruct/errors" - "github.com/onsi/gomega/types" -) - -//MatchAllElements succeeds if every element of a slice matches the element matcher it maps to -//through the id function, and every element matcher is matched. -// Expect([]string{"a", "b"}).To(MatchAllElements(idFn, matchers.Elements{ -// "a": BeEqual("a"), -// "b": BeEqual("b"), -// }) -func MatchAllElements(identifier Identifier, elements Elements) types.GomegaMatcher { - return &ElementsMatcher{ - Identifier: identifier, - Elements: elements, - } -} - -//MatchElements succeeds if each element of a slice matches the element matcher it maps to -//through the id function. It can ignore extra elements and/or missing elements. -// Expect([]string{"a", "c"}).To(MatchElements(idFn, IgnoreMissing|IgnoreExtra, matchers.Elements{ -// "a": BeEqual("a") -// "b": BeEqual("b"), -// }) -func MatchElements(identifier Identifier, options Options, elements Elements) types.GomegaMatcher { - return &ElementsMatcher{ - Identifier: identifier, - Elements: elements, - IgnoreExtras: options&IgnoreExtras != 0, - IgnoreMissing: options&IgnoreMissing != 0, - AllowDuplicates: options&AllowDuplicates != 0, - } -} - -// ElementsMatcher is a NestingMatcher that applies custom matchers to each element of a slice mapped -// by the Identifier function. -// TODO: Extend this to work with arrays & maps (map the key) as well. -type ElementsMatcher struct { - // Matchers for each element. - Elements Elements - // Function mapping an element to the string key identifying its matcher. - Identifier Identifier - - // Whether to ignore extra elements or consider it an error. - IgnoreExtras bool - // Whether to ignore missing elements or consider it an error. - IgnoreMissing bool - // Whether to key duplicates when matching IDs. - AllowDuplicates bool - - // State. - failures []error -} - -// Element ID to matcher. -type Elements map[string]types.GomegaMatcher - -// Function for identifying (mapping) elements. -type Identifier func(element interface{}) string - -func (m *ElementsMatcher) Match(actual interface{}) (success bool, err error) { - if reflect.TypeOf(actual).Kind() != reflect.Slice { - return false, fmt.Errorf("%v is type %T, expected slice", actual, actual) - } - - m.failures = m.matchElements(actual) - if len(m.failures) > 0 { - return false, nil - } - return true, nil -} - -func (m *ElementsMatcher) matchElements(actual interface{}) (errs []error) { - // Provide more useful error messages in the case of a panic. - defer func() { - if err := recover(); err != nil { - errs = append(errs, fmt.Errorf("panic checking %+v: %v\n%s", actual, err, debug.Stack())) - } - }() - - val := reflect.ValueOf(actual) - elements := map[string]bool{} - for i := 0; i < val.Len(); i++ { - element := val.Index(i).Interface() - id := m.Identifier(element) - if elements[id] { - if !m.AllowDuplicates { - errs = append(errs, fmt.Errorf("found duplicate element ID %s", id)) - continue - } - } - elements[id] = true - - matcher, expected := m.Elements[id] - if !expected { - if !m.IgnoreExtras { - errs = append(errs, fmt.Errorf("unexpected element %s", id)) - } - continue - } - - match, err := matcher.Match(element) - if match { - continue - } - - if err == nil { - if nesting, ok := matcher.(errorsutil.NestingMatcher); ok { - err = errorsutil.AggregateError(nesting.Failures()) - } else { - err = errors.New(matcher.FailureMessage(element)) - } - } - errs = append(errs, errorsutil.Nest(fmt.Sprintf("[%s]", id), err)) - } - - for id := range m.Elements { - if !elements[id] && !m.IgnoreMissing { - errs = append(errs, fmt.Errorf("missing expected element %s", id)) - } - } - - return errs -} - -func (m *ElementsMatcher) FailureMessage(actual interface{}) (message string) { - failure := errorsutil.AggregateError(m.failures) - return format.Message(actual, fmt.Sprintf("to match elements: %v", failure)) -} - -func (m *ElementsMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to match elements") -} - -func (m *ElementsMatcher) Failures() []error { - return m.failures -} diff --git a/vendor/github.com/onsi/gomega/gstruct/elements_test.go b/vendor/github.com/onsi/gomega/gstruct/elements_test.go deleted file mode 100644 index 8ba78cb91..000000000 --- a/vendor/github.com/onsi/gomega/gstruct/elements_test.go +++ /dev/null @@ -1,144 +0,0 @@ -package gstruct_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gstruct" -) - -var _ = Describe("Slice", func() { - allElements := []string{"a", "b"} - missingElements := []string{"a"} - extraElements := []string{"a", "b", "c"} - duplicateElements := []string{"a", "a", "b"} - empty := []string{} - var nils []string - - It("should strictly match all elements", func() { - m := MatchAllElements(id, Elements{ - "b": Equal("b"), - "a": Equal("a"), - }) - Ω(allElements).Should(m, "should match all elements") - Ω(missingElements).ShouldNot(m, "should fail with missing elements") - Ω(extraElements).ShouldNot(m, "should fail with extra elements") - Ω(duplicateElements).ShouldNot(m, "should fail with duplicate elements") - Ω(nils).ShouldNot(m, "should fail with an uninitialized slice") - - m = MatchAllElements(id, Elements{ - "a": Equal("a"), - "b": Equal("fail"), - }) - Ω(allElements).ShouldNot(m, "should run nested matchers") - - m = MatchAllElements(id, Elements{}) - Ω(empty).Should(m, "should handle empty slices") - Ω(allElements).ShouldNot(m, "should handle only empty slices") - Ω(nils).Should(m, "should handle nil slices") - }) - - It("should ignore extra elements", func() { - m := MatchElements(id, IgnoreExtras, Elements{ - "b": Equal("b"), - "a": Equal("a"), - }) - Ω(allElements).Should(m, "should match all elements") - Ω(missingElements).ShouldNot(m, "should fail with missing elements") - Ω(extraElements).Should(m, "should ignore extra elements") - Ω(duplicateElements).ShouldNot(m, "should fail with duplicate elements") - Ω(nils).ShouldNot(m, "should fail with an uninitialized slice") - }) - - It("should ignore missing elements", func() { - m := MatchElements(id, IgnoreMissing, Elements{ - "a": Equal("a"), - "b": Equal("b"), - }) - Ω(allElements).Should(m, "should match all elements") - Ω(missingElements).Should(m, "should ignore missing elements") - Ω(extraElements).ShouldNot(m, "should fail with extra elements") - Ω(duplicateElements).ShouldNot(m, "should fail with duplicate elements") - Ω(nils).Should(m, "should ignore an uninitialized slice") - }) - - It("should ignore missing and extra elements", func() { - m := MatchElements(id, IgnoreMissing|IgnoreExtras, Elements{ - "a": Equal("a"), - "b": Equal("b"), - }) - Ω(allElements).Should(m, "should match all elements") - Ω(missingElements).Should(m, "should ignore missing elements") - Ω(extraElements).Should(m, "should ignore extra elements") - Ω(duplicateElements).ShouldNot(m, "should fail with duplicate elements") - Ω(nils).Should(m, "should ignore an uninitialized slice") - - m = MatchElements(id, IgnoreExtras|IgnoreMissing, Elements{ - "a": Equal("a"), - "b": Equal("fail"), - }) - Ω(allElements).ShouldNot(m, "should run nested matchers") - }) - - Context("with elements that share a key", func() { - nonUniqueID := func(element interface{}) string { - return element.(string)[0:1] - } - - allElements := []string{"a123", "a213", "b321"} - includingBadElements := []string{"a123", "b123", "b5555"} - extraElements := []string{"a123", "b1234", "c345"} - missingElements := []string{"b123", "b1234", "b1345"} - - It("should strictly allow multiple matches", func() { - m := MatchElements(nonUniqueID, AllowDuplicates, Elements{ - "a": ContainSubstring("1"), - "b": ContainSubstring("1"), - }) - Ω(allElements).Should(m, "should match all elements") - Ω(includingBadElements).ShouldNot(m, "should reject if a member fails the matcher") - Ω(extraElements).ShouldNot(m, "should reject with extra keys") - Ω(missingElements).ShouldNot(m, "should reject with missing keys") - Ω(nils).ShouldNot(m, "should fail with an uninitialized slice") - }) - - It("should ignore missing", func() { - m := MatchElements(nonUniqueID, AllowDuplicates|IgnoreMissing, Elements{ - "a": ContainSubstring("1"), - "b": ContainSubstring("1"), - }) - Ω(allElements).Should(m, "should match all elements") - Ω(includingBadElements).ShouldNot(m, "should reject if a member fails the matcher") - Ω(extraElements).ShouldNot(m, "should reject with extra keys") - Ω(missingElements).Should(m, "should allow missing keys") - Ω(nils).Should(m, "should allow an uninitialized slice") - }) - - It("should ignore extras", func() { - m := MatchElements(nonUniqueID, AllowDuplicates|IgnoreExtras, Elements{ - "a": ContainSubstring("1"), - "b": ContainSubstring("1"), - }) - Ω(allElements).Should(m, "should match all elements") - Ω(includingBadElements).ShouldNot(m, "should reject if a member fails the matcher") - Ω(extraElements).Should(m, "should allow extra keys") - Ω(missingElements).ShouldNot(m, "should reject missing keys") - Ω(nils).ShouldNot(m, "should reject an uninitialized slice") - }) - - It("should ignore missing and extras", func() { - m := MatchElements(nonUniqueID, AllowDuplicates|IgnoreExtras|IgnoreMissing, Elements{ - "a": ContainSubstring("1"), - "b": ContainSubstring("1"), - }) - Ω(allElements).Should(m, "should match all elements") - Ω(includingBadElements).ShouldNot(m, "should reject if a member fails the matcher") - Ω(extraElements).Should(m, "should allow extra keys") - Ω(missingElements).Should(m, "should allow missing keys") - Ω(nils).Should(m, "should allow an uninitialized slice") - }) - }) -}) - -func id(element interface{}) string { - return element.(string) -} diff --git a/vendor/github.com/onsi/gomega/gstruct/errors/nested_types.go b/vendor/github.com/onsi/gomega/gstruct/errors/nested_types.go deleted file mode 100644 index 188492b21..000000000 --- a/vendor/github.com/onsi/gomega/gstruct/errors/nested_types.go +++ /dev/null @@ -1,72 +0,0 @@ -package errors - -import ( - "fmt" - "strings" - - "github.com/onsi/gomega/types" -) - -// A stateful matcher that nests other matchers within it and preserves the error types of the -// nested matcher failures. -type NestingMatcher interface { - types.GomegaMatcher - - // Returns the failures of nested matchers. - Failures() []error -} - -// An error type for labeling errors on deeply nested matchers. -type NestedError struct { - Path string - Err error -} - -func (e *NestedError) Error() string { - // Indent Errors. - indented := strings.Replace(e.Err.Error(), "\n", "\n\t", -1) - return fmt.Sprintf("%s:\n\t%v", e.Path, indented) -} - -// Create a NestedError with the given path. -// If err is a NestedError, prepend the path to it. -// If err is an AggregateError, recursively Nest each error. -func Nest(path string, err error) error { - if ag, ok := err.(AggregateError); ok { - var errs AggregateError - for _, e := range ag { - errs = append(errs, Nest(path, e)) - } - return errs - } - if ne, ok := err.(*NestedError); ok { - return &NestedError{ - Path: path + ne.Path, - Err: ne.Err, - } - } - return &NestedError{ - Path: path, - Err: err, - } -} - -// An error type for treating multiple errors as a single error. -type AggregateError []error - -// Error is part of the error interface. -func (err AggregateError) Error() string { - if len(err) == 0 { - // This should never happen, really. - return "" - } - if len(err) == 1 { - return err[0].Error() - } - result := fmt.Sprintf("[%s", err[0].Error()) - for i := 1; i < len(err); i++ { - result += fmt.Sprintf(", %s", err[i].Error()) - } - result += "]" - return result -} diff --git a/vendor/github.com/onsi/gomega/gstruct/fields.go b/vendor/github.com/onsi/gomega/gstruct/fields.go deleted file mode 100644 index 0020b873d..000000000 --- a/vendor/github.com/onsi/gomega/gstruct/fields.go +++ /dev/null @@ -1,141 +0,0 @@ -package gstruct - -import ( - "errors" - "fmt" - "reflect" - "runtime/debug" - "strings" - - "github.com/onsi/gomega/format" - errorsutil "github.com/onsi/gomega/gstruct/errors" - "github.com/onsi/gomega/types" -) - -//MatchAllFields succeeds if every field of a struct matches the field matcher associated with -//it, and every element matcher is matched. -// Expect([]string{"a", "b"}).To(MatchAllFields(gstruct.Fields{ -// "a": BeEqual("a"), -// "b": BeEqual("b"), -// }) -func MatchAllFields(fields Fields) types.GomegaMatcher { - return &FieldsMatcher{ - Fields: fields, - } -} - -//MatchFields succeeds if each element of a struct matches the field matcher associated with -//it. It can ignore extra fields and/or missing fields. -// Expect([]string{"a", "c"}).To(MatchFields(IgnoreMissing|IgnoreExtra, gstruct.Fields{ -// "a": BeEqual("a") -// "b": BeEqual("b"), -// }) -func MatchFields(options Options, fields Fields) types.GomegaMatcher { - return &FieldsMatcher{ - Fields: fields, - IgnoreExtras: options&IgnoreExtras != 0, - IgnoreMissing: options&IgnoreMissing != 0, - } -} - -type FieldsMatcher struct { - // Matchers for each field. - Fields Fields - - // Whether to ignore extra elements or consider it an error. - IgnoreExtras bool - // Whether to ignore missing elements or consider it an error. - IgnoreMissing bool - - // State. - failures []error -} - -// Field name to matcher. -type Fields map[string]types.GomegaMatcher - -func (m *FieldsMatcher) Match(actual interface{}) (success bool, err error) { - if reflect.TypeOf(actual).Kind() != reflect.Struct { - return false, fmt.Errorf("%v is type %T, expected struct", actual, actual) - } - - m.failures = m.matchFields(actual) - if len(m.failures) > 0 { - return false, nil - } - return true, nil -} - -func (m *FieldsMatcher) matchFields(actual interface{}) (errs []error) { - val := reflect.ValueOf(actual) - typ := val.Type() - fields := map[string]bool{} - for i := 0; i < val.NumField(); i++ { - fieldName := typ.Field(i).Name - fields[fieldName] = true - - err := func() (err error) { - // This test relies heavily on reflect, which tends to panic. - // Recover here to provide more useful error messages in that case. - defer func() { - if r := recover(); r != nil { - err = fmt.Errorf("panic checking %+v: %v\n%s", actual, r, debug.Stack()) - } - }() - - matcher, expected := m.Fields[fieldName] - if !expected { - if !m.IgnoreExtras { - return fmt.Errorf("unexpected field %s: %+v", fieldName, actual) - } - return nil - } - - var field interface{} - if val.Field(i).IsValid() { - field = val.Field(i).Interface() - } else { - field = reflect.Zero(typ.Field(i).Type) - } - - match, err := matcher.Match(field) - if err != nil { - return err - } else if !match { - if nesting, ok := matcher.(errorsutil.NestingMatcher); ok { - return errorsutil.AggregateError(nesting.Failures()) - } - return errors.New(matcher.FailureMessage(field)) - } - return nil - }() - if err != nil { - errs = append(errs, errorsutil.Nest("."+fieldName, err)) - } - } - - for field := range m.Fields { - if !fields[field] && !m.IgnoreMissing { - errs = append(errs, fmt.Errorf("missing expected field %s", field)) - } - } - - return errs -} - -func (m *FieldsMatcher) FailureMessage(actual interface{}) (message string) { - failures := make([]string, len(m.failures)) - for i := range m.failures { - failures[i] = m.failures[i].Error() - } - return format.Message(reflect.TypeOf(actual).Name(), - fmt.Sprintf("to match fields: {\n%v\n}\n", strings.Join(failures, "\n"))) -} - -func (m *FieldsMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to match fields") -} - -func (m *FieldsMatcher) Failures() []error { - return m.failures -} diff --git a/vendor/github.com/onsi/gomega/gstruct/fields_test.go b/vendor/github.com/onsi/gomega/gstruct/fields_test.go deleted file mode 100644 index 61f4afc40..000000000 --- a/vendor/github.com/onsi/gomega/gstruct/fields_test.go +++ /dev/null @@ -1,76 +0,0 @@ -package gstruct_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gstruct" -) - -var _ = Describe("Struct", func() { - allFields := struct{ A, B string }{"a", "b"} - missingFields := struct{ A string }{"a"} - extraFields := struct{ A, B, C string }{"a", "b", "c"} - emptyFields := struct{ A, B string }{} - - It("should strictly match all fields", func() { - m := MatchAllFields(Fields{ - "B": Equal("b"), - "A": Equal("a"), - }) - Ω(allFields).Should(m, "should match all fields") - Ω(missingFields).ShouldNot(m, "should fail with missing fields") - Ω(extraFields).ShouldNot(m, "should fail with extra fields") - Ω(emptyFields).ShouldNot(m, "should fail with empty fields") - - m = MatchAllFields(Fields{ - "A": Equal("a"), - "B": Equal("fail"), - }) - Ω(allFields).ShouldNot(m, "should run nested matchers") - }) - - It("should handle empty structs", func() { - m := MatchAllFields(Fields{}) - Ω(struct{}{}).Should(m, "should handle empty structs") - Ω(allFields).ShouldNot(m, "should fail with extra fields") - }) - - It("should ignore missing fields", func() { - m := MatchFields(IgnoreMissing, Fields{ - "B": Equal("b"), - "A": Equal("a"), - }) - Ω(allFields).Should(m, "should match all fields") - Ω(missingFields).Should(m, "should ignore missing fields") - Ω(extraFields).ShouldNot(m, "should fail with extra fields") - Ω(emptyFields).ShouldNot(m, "should fail with empty fields") - }) - - It("should ignore extra fields", func() { - m := MatchFields(IgnoreExtras, Fields{ - "B": Equal("b"), - "A": Equal("a"), - }) - Ω(allFields).Should(m, "should match all fields") - Ω(missingFields).ShouldNot(m, "should fail with missing fields") - Ω(extraFields).Should(m, "should ignore extra fields") - Ω(emptyFields).ShouldNot(m, "should fail with empty fields") - }) - - It("should ignore missing and extra fields", func() { - m := MatchFields(IgnoreMissing|IgnoreExtras, Fields{ - "B": Equal("b"), - "A": Equal("a"), - }) - Ω(allFields).Should(m, "should match all fields") - Ω(missingFields).Should(m, "should ignore missing fields") - Ω(extraFields).Should(m, "should ignore extra fields") - Ω(emptyFields).ShouldNot(m, "should fail with empty fields") - - m = MatchFields(IgnoreMissing|IgnoreExtras, Fields{ - "A": Equal("a"), - "B": Equal("fail"), - }) - Ω(allFields).ShouldNot(m, "should run nested matchers") - }) -}) diff --git a/vendor/github.com/onsi/gomega/gstruct/gstruct_tests_suite_test.go b/vendor/github.com/onsi/gomega/gstruct/gstruct_tests_suite_test.go deleted file mode 100644 index d47566304..000000000 --- a/vendor/github.com/onsi/gomega/gstruct/gstruct_tests_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package gstruct_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func Test(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Gstruct Suite") -} diff --git a/vendor/github.com/onsi/gomega/gstruct/ignore.go b/vendor/github.com/onsi/gomega/gstruct/ignore.go deleted file mode 100644 index 0365f32ad..000000000 --- a/vendor/github.com/onsi/gomega/gstruct/ignore.go +++ /dev/null @@ -1,37 +0,0 @@ -package gstruct - -import ( - "github.com/onsi/gomega/types" -) - -//Ignore ignores the actual value and always succeeds. -// Expect(nil).To(Ignore()) -// Expect(true).To(Ignore()) -func Ignore() types.GomegaMatcher { - return &IgnoreMatcher{true} -} - -//Reject ignores the actual value and always fails. It can be used in conjunction with IgnoreMissing -//to catch problematic elements, or to verify tests are running. -// Expect(nil).NotTo(Reject()) -// Expect(true).NotTo(Reject()) -func Reject() types.GomegaMatcher { - return &IgnoreMatcher{false} -} - -// A matcher that either always succeeds or always fails. -type IgnoreMatcher struct { - Succeed bool -} - -func (m *IgnoreMatcher) Match(actual interface{}) (bool, error) { - return m.Succeed, nil -} - -func (m *IgnoreMatcher) FailureMessage(_ interface{}) (message string) { - return "Unconditional failure" -} - -func (m *IgnoreMatcher) NegatedFailureMessage(_ interface{}) (message string) { - return "Unconditional success" -} diff --git a/vendor/github.com/onsi/gomega/gstruct/ignore_test.go b/vendor/github.com/onsi/gomega/gstruct/ignore_test.go deleted file mode 100644 index 70e1d4007..000000000 --- a/vendor/github.com/onsi/gomega/gstruct/ignore_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package gstruct_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gstruct" -) - -var _ = Describe("Ignore", func() { - It("should always succeed", func() { - Ω(nil).Should(Ignore()) - Ω(struct{}{}).Should(Ignore()) - Ω(0).Should(Ignore()) - Ω(false).Should(Ignore()) - }) - - It("should always fail", func() { - Ω(nil).ShouldNot(Reject()) - Ω(struct{}{}).ShouldNot(Reject()) - Ω(1).ShouldNot(Reject()) - Ω(true).ShouldNot(Reject()) - }) -}) diff --git a/vendor/github.com/onsi/gomega/gstruct/pointer.go b/vendor/github.com/onsi/gomega/gstruct/pointer.go deleted file mode 100644 index 0a2f35de3..000000000 --- a/vendor/github.com/onsi/gomega/gstruct/pointer.go +++ /dev/null @@ -1,56 +0,0 @@ -package gstruct - -import ( - "fmt" - "reflect" - - "github.com/onsi/gomega/format" - "github.com/onsi/gomega/types" -) - -//PointTo applies the given matcher to the value pointed to by actual. It fails if the pointer is -//nil. -// actual := 5 -// Expect(&actual).To(PointTo(Equal(5))) -func PointTo(matcher types.GomegaMatcher) types.GomegaMatcher { - return &PointerMatcher{ - Matcher: matcher, - } -} - -type PointerMatcher struct { - Matcher types.GomegaMatcher - - // Failure message. - failure string -} - -func (m *PointerMatcher) Match(actual interface{}) (bool, error) { - val := reflect.ValueOf(actual) - - // return error if actual type is not a pointer - if val.Kind() != reflect.Ptr { - return false, fmt.Errorf("PointerMatcher expects a pointer but we have '%s'", val.Kind()) - } - - if !val.IsValid() || val.IsNil() { - m.failure = format.Message(actual, "not to be ") - return false, nil - } - - // Forward the value. - elem := val.Elem().Interface() - match, err := m.Matcher.Match(elem) - if !match { - m.failure = m.Matcher.FailureMessage(elem) - } - return match, err -} - -func (m *PointerMatcher) FailureMessage(_ interface{}) (message string) { - return m.failure -} - -func (m *PointerMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return m.Matcher.NegatedFailureMessage(actual) -} diff --git a/vendor/github.com/onsi/gomega/gstruct/pointer_test.go b/vendor/github.com/onsi/gomega/gstruct/pointer_test.go deleted file mode 100644 index b02081c4c..000000000 --- a/vendor/github.com/onsi/gomega/gstruct/pointer_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package gstruct_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - . "github.com/onsi/gomega/gstruct" -) - -var _ = Describe("PointTo", func() { - It("should fail when passed nil", func() { - var p *struct{} - Ω(p).Should(BeNil()) - }) - - It("should succeed when passed non-nil pointer", func() { - var s struct{} - Ω(&s).Should(PointTo(Ignore())) - }) - - It("should unwrap the pointee value", func() { - i := 1 - Ω(&i).Should(PointTo(Equal(1))) - Ω(&i).ShouldNot(PointTo(Equal(2))) - }) - - It("should work with nested pointers", func() { - i := 1 - ip := &i - ipp := &ip - Ω(ipp).Should(PointTo(PointTo(Equal(1)))) - Ω(ipp).ShouldNot(PointTo(PointTo(Equal(2)))) - }) -}) diff --git a/vendor/github.com/onsi/gomega/gstruct/types.go b/vendor/github.com/onsi/gomega/gstruct/types.go deleted file mode 100644 index 48cbbe8f6..000000000 --- a/vendor/github.com/onsi/gomega/gstruct/types.go +++ /dev/null @@ -1,15 +0,0 @@ -package gstruct - -//Options is the type for options passed to some matchers. -type Options int - -const ( - //IgnoreExtras tells the matcher to ignore extra elements or fields, rather than triggering a failure. - IgnoreExtras Options = 1 << iota - //IgnoreMissing tells the matcher to ignore missing elements or fields, rather than triggering a failure. - IgnoreMissing - //AllowDuplicates tells the matcher to permit multiple members of the slice to produce the same ID when - //considered by the indentifier function. All members that map to a given key must still match successfully - //with the matcher that is provided for that key. - AllowDuplicates -) diff --git a/vendor/github.com/onsi/gomega/internal/fakematcher/fake_matcher.go b/vendor/github.com/onsi/gomega/internal/fakematcher/fake_matcher.go deleted file mode 100644 index 6e351a7de..000000000 --- a/vendor/github.com/onsi/gomega/internal/fakematcher/fake_matcher.go +++ /dev/null @@ -1,23 +0,0 @@ -package fakematcher - -import "fmt" - -type FakeMatcher struct { - ReceivedActual interface{} - MatchesToReturn bool - ErrToReturn error -} - -func (matcher *FakeMatcher) Match(actual interface{}) (bool, error) { - matcher.ReceivedActual = actual - - return matcher.MatchesToReturn, matcher.ErrToReturn -} - -func (matcher *FakeMatcher) FailureMessage(actual interface{}) string { - return fmt.Sprintf("positive: %v", actual) -} - -func (matcher *FakeMatcher) NegatedFailureMessage(actual interface{}) string { - return fmt.Sprintf("negative: %v", actual) -} diff --git a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_01.xml b/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_01.xml deleted file mode 100644 index 90f0a1b45..000000000 --- a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_01.xml +++ /dev/null @@ -1,6 +0,0 @@ - - Tove - Jani - Reminder - Don't forget me this weekend! - \ No newline at end of file diff --git a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_02.xml b/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_02.xml deleted file mode 100644 index 3863b83c3..000000000 --- a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_02.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - Tove - Jani - Reminder - Don't forget me this weekend! - - diff --git a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_03.xml b/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_03.xml deleted file mode 100644 index a491c213c..000000000 --- a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_03.xml +++ /dev/null @@ -1 +0,0 @@ - Tove Jani Reminder Don't forget me this weekend! diff --git a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_04.xml b/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_04.xml deleted file mode 100644 index dcfd3db03..000000000 --- a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_04.xml +++ /dev/null @@ -1,6 +0,0 @@ - - Tove - John - Doe - Don't forget me this weekend! - \ No newline at end of file diff --git a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_05.xml b/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_05.xml deleted file mode 100644 index de15a6a55..000000000 --- a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_05.xml +++ /dev/null @@ -1,211 +0,0 @@ - - - - Empire Burlesque - Bob Dylan - USA - Columbia - 10.90 - 1985 - - - Hide your heart - Bonnie Tyler - UK - CBS Records - 9.90 - 1988 - - - Greatest Hits - Dolly Parton - USA - RCA - 9.90 - 1982 - - - Still got the blues - Gary Moore - UK - Virgin records - 10.20 - 1990 - - - Eros - Eros Ramazzotti - EU - BMG - 9.90 - 1997 - - - One night only - Bee Gees - UK - Polydor - 10.90 - 1998 - - - Sylvias Mother - Dr.Hook - UK - CBS - 8.10 - 1973 - - - Maggie May - Rod Stewart - UK - Pickwick - 8.50 - 1990 - - - Romanza - Andrea Bocelli - EU - Polydor - 10.80 - 1996 - - - When a man loves a woman - Percy Sledge - USA - Atlantic - 8.70 - 1987 - - - Black angel - Savage Rose - EU - Mega - 10.90 - 1995 - - - 1999 Grammy Nominees - Many - USA - Grammy - 10.20 - 1999 - - - For the good times - Kenny Rogers - UK - Mucik Master - 8.70 - 1995 - - - Big Willie style - Will Smith - USA - Columbia - 9.90 - 1997 - - - Tupelo Honey - Van Morrison - UK - Polydor - 8.20 - 1971 - - - Soulsville - Jorn Hoel - Norway - WEA - 7.90 - 1996 - - - The very best of - Cat Stevens - UK - Island - 8.90 - 1990 - - - Stop - Sam Brown - UK - A and M - 8.90 - 1988 - - - Bridge of Spies - T'Pau - UK - Siren - 7.90 - 1987 - - - Private Dancer - Tina Turner - UK - Capitol - 8.90 - 1983 - - - Midt om natten - Kim Larsen - EU - Medley - 7.80 - 1983 - - - Pavarotti Gala Concert - Luciano Pavarotti - UK - DECCA - 9.90 - 1991 - - - The dock of the bay - Otis Redding - USA - Stax Records - 7.90 - 1968 - - - Picture book - Simply Red - EU - Elektra - 7.20 - 1985 - - - Red - The Communards - UK - London - 7.80 - 1987 - - - Unchain my heart - Joe Cocker - USA - EMI - 8.20 - 1987 - - diff --git a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_06.xml b/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_06.xml deleted file mode 100644 index 4ba90fb97..000000000 --- a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_06.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - -
ApplesBananas
- - African Coffee Table - 80 - 120 -
-
\ No newline at end of file diff --git a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_07.xml b/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_07.xml deleted file mode 100644 index 34b9e9775..000000000 --- a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_07.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - Apples - Bananas - - - - African Coffee Table - 80 - 120 - - \ No newline at end of file diff --git a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_08.xml b/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_08.xml deleted file mode 100644 index ccaee4e1a..000000000 --- a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_08.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - Apples - Oranges - - - - African Coffee Table - 80 - 120 - - \ No newline at end of file diff --git a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_09.xml b/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_09.xml deleted file mode 100644 index 531f84d3f..000000000 --- a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_09.xml +++ /dev/null @@ -1,4 +0,0 @@ - - Foo - Bar - \ No newline at end of file diff --git a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_10.xml b/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_10.xml deleted file mode 100644 index b1e1e1fbe..000000000 --- a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_10.xml +++ /dev/null @@ -1,4 +0,0 @@ - - Foo - Bar - \ No newline at end of file diff --git a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_11.xml b/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_11.xml deleted file mode 100644 index 3132b0f90..000000000 --- a/vendor/github.com/onsi/gomega/matchers/test_data/xml/sample_11.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - Tove - Jani - Reminder - Don't forget me this weekend! - diff --git a/vendor/github.com/pelletier/go-toml/cmd/test_program.go b/vendor/github.com/pelletier/go-toml/cmd/test_program.go deleted file mode 100644 index 73077f614..000000000 --- a/vendor/github.com/pelletier/go-toml/cmd/test_program.go +++ /dev/null @@ -1,91 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "log" - "os" - "time" - - "github.com/pelletier/go-toml" -) - -func main() { - bytes, err := ioutil.ReadAll(os.Stdin) - if err != nil { - log.Fatalf("Error during TOML read: %s", err) - os.Exit(2) - } - tree, err := toml.Load(string(bytes)) - if err != nil { - log.Fatalf("Error during TOML load: %s", err) - os.Exit(1) - } - - typedTree := translate(*tree) - - if err := json.NewEncoder(os.Stdout).Encode(typedTree); err != nil { - log.Fatalf("Error encoding JSON: %s", err) - os.Exit(3) - } - - os.Exit(0) -} - -func translate(tomlData interface{}) interface{} { - switch orig := tomlData.(type) { - case map[string]interface{}: - typed := make(map[string]interface{}, len(orig)) - for k, v := range orig { - typed[k] = translate(v) - } - return typed - case *toml.Tree: - return translate(*orig) - case toml.Tree: - keys := orig.Keys() - typed := make(map[string]interface{}, len(keys)) - for _, k := range keys { - typed[k] = translate(orig.GetPath([]string{k})) - } - return typed - case []*toml.Tree: - typed := make([]map[string]interface{}, len(orig)) - for i, v := range orig { - typed[i] = translate(v).(map[string]interface{}) - } - return typed - case []map[string]interface{}: - typed := make([]map[string]interface{}, len(orig)) - for i, v := range orig { - typed[i] = translate(v).(map[string]interface{}) - } - return typed - case []interface{}: - typed := make([]interface{}, len(orig)) - for i, v := range orig { - typed[i] = translate(v) - } - return tag("array", typed) - case time.Time: - return tag("datetime", orig.Format("2006-01-02T15:04:05Z")) - case bool: - return tag("bool", fmt.Sprintf("%v", orig)) - case int64: - return tag("integer", fmt.Sprintf("%d", orig)) - case float64: - return tag("float", fmt.Sprintf("%v", orig)) - case string: - return tag("string", orig) - } - - panic(fmt.Sprintf("Unknown type: %T", tomlData)) -} - -func tag(typeName string, data interface{}) map[string]interface{} { - return map[string]interface{}{ - "type": typeName, - "value": data, - } -} diff --git a/vendor/github.com/pelletier/go-toml/cmd/tomljson/main.go b/vendor/github.com/pelletier/go-toml/cmd/tomljson/main.go deleted file mode 100644 index b2d6fc673..000000000 --- a/vendor/github.com/pelletier/go-toml/cmd/tomljson/main.go +++ /dev/null @@ -1,72 +0,0 @@ -// Tomljson reads TOML and converts to JSON. -// -// Usage: -// cat file.toml | tomljson > file.json -// tomljson file1.toml > file.json -package main - -import ( - "encoding/json" - "flag" - "fmt" - "io" - "os" - - "github.com/pelletier/go-toml" -) - -func main() { - flag.Usage = func() { - fmt.Fprintln(os.Stderr, `tomljson can be used in two ways: -Writing to STDIN and reading from STDOUT: - cat file.toml | tomljson > file.json - -Reading from a file name: - tomljson file.toml -`) - } - flag.Parse() - os.Exit(processMain(flag.Args(), os.Stdin, os.Stdout, os.Stderr)) -} - -func processMain(files []string, defaultInput io.Reader, output io.Writer, errorOutput io.Writer) int { - // read from stdin and print to stdout - inputReader := defaultInput - - if len(files) > 0 { - var err error - inputReader, err = os.Open(files[0]) - if err != nil { - printError(err, errorOutput) - return -1 - } - } - s, err := reader(inputReader) - if err != nil { - printError(err, errorOutput) - return -1 - } - io.WriteString(output, s+"\n") - return 0 -} - -func printError(err error, output io.Writer) { - io.WriteString(output, err.Error()+"\n") -} - -func reader(r io.Reader) (string, error) { - tree, err := toml.LoadReader(r) - if err != nil { - return "", err - } - return mapToJSON(tree) -} - -func mapToJSON(tree *toml.Tree) (string, error) { - treeMap := tree.ToMap() - bytes, err := json.MarshalIndent(treeMap, "", " ") - if err != nil { - return "", err - } - return string(bytes[:]), nil -} diff --git a/vendor/github.com/pelletier/go-toml/cmd/tomljson/main_test.go b/vendor/github.com/pelletier/go-toml/cmd/tomljson/main_test.go deleted file mode 100644 index 0b4bdbb11..000000000 --- a/vendor/github.com/pelletier/go-toml/cmd/tomljson/main_test.go +++ /dev/null @@ -1,82 +0,0 @@ -package main - -import ( - "bytes" - "io/ioutil" - "os" - "strings" - "testing" -) - -func expectBufferEquality(t *testing.T, name string, buffer *bytes.Buffer, expected string) { - output := buffer.String() - if output != expected { - t.Errorf("incorrect %s:\n%s\n\nexpected %s:\n%s", name, output, name, expected) - t.Log([]rune(output)) - t.Log([]rune(expected)) - } -} - -func expectProcessMainResults(t *testing.T, input string, args []string, exitCode int, expectedOutput string, expectedError string) { - inputReader := strings.NewReader(input) - outputBuffer := new(bytes.Buffer) - errorBuffer := new(bytes.Buffer) - - returnCode := processMain(args, inputReader, outputBuffer, errorBuffer) - - expectBufferEquality(t, "output", outputBuffer, expectedOutput) - expectBufferEquality(t, "error", errorBuffer, expectedError) - - if returnCode != exitCode { - t.Error("incorrect return code:", returnCode, "expected", exitCode) - } -} - -func TestProcessMainReadFromStdin(t *testing.T) { - input := ` - [mytoml] - a = 42` - expectedOutput := `{ - "mytoml": { - "a": 42 - } -} -` - expectedError := `` - expectedExitCode := 0 - - expectProcessMainResults(t, input, []string{}, expectedExitCode, expectedOutput, expectedError) -} - -func TestProcessMainReadFromFile(t *testing.T) { - input := ` - [mytoml] - a = 42` - - tmpfile, err := ioutil.TempFile("", "example.toml") - if err != nil { - t.Fatal(err) - } - if _, err := tmpfile.Write([]byte(input)); err != nil { - t.Fatal(err) - } - - defer os.Remove(tmpfile.Name()) - - expectedOutput := `{ - "mytoml": { - "a": 42 - } -} -` - expectedError := `` - expectedExitCode := 0 - - expectProcessMainResults(t, ``, []string{tmpfile.Name()}, expectedExitCode, expectedOutput, expectedError) -} - -func TestProcessMainReadFromMissingFile(t *testing.T) { - expectedError := `open /this/file/does/not/exist: no such file or directory -` - expectProcessMainResults(t, ``, []string{"/this/file/does/not/exist"}, -1, ``, expectedError) -} diff --git a/vendor/github.com/pelletier/go-toml/cmd/tomll/main.go b/vendor/github.com/pelletier/go-toml/cmd/tomll/main.go deleted file mode 100644 index 36c7e3759..000000000 --- a/vendor/github.com/pelletier/go-toml/cmd/tomll/main.go +++ /dev/null @@ -1,66 +0,0 @@ -// Tomll is a linter for TOML -// -// Usage: -// cat file.toml | tomll > file_linted.toml -// tomll file1.toml file2.toml # lint the two files in place -package main - -import ( - "flag" - "fmt" - "io" - "io/ioutil" - "os" - - "github.com/pelletier/go-toml" -) - -func main() { - flag.Usage = func() { - fmt.Fprintln(os.Stderr, `tomll can be used in two ways: -Writing to STDIN and reading from STDOUT: - cat file.toml | tomll > file.toml - -Reading and updating a list of files: - tomll a.toml b.toml c.toml - -When given a list of files, tomll will modify all files in place without asking. -`) - } - flag.Parse() - // read from stdin and print to stdout - if flag.NArg() == 0 { - s, err := lintReader(os.Stdin) - if err != nil { - io.WriteString(os.Stderr, err.Error()) - os.Exit(-1) - } - io.WriteString(os.Stdout, s) - } else { - // otherwise modify a list of files - for _, filename := range flag.Args() { - s, err := lintFile(filename) - if err != nil { - io.WriteString(os.Stderr, err.Error()) - os.Exit(-1) - } - ioutil.WriteFile(filename, []byte(s), 0644) - } - } -} - -func lintFile(filename string) (string, error) { - tree, err := toml.LoadFile(filename) - if err != nil { - return "", err - } - return tree.String(), nil -} - -func lintReader(r io.Reader) (string, error) { - tree, err := toml.LoadReader(r) - if err != nil { - return "", err - } - return tree.String(), nil -} diff --git a/vendor/github.com/pelletier/go-toml/query/doc.go b/vendor/github.com/pelletier/go-toml/query/doc.go deleted file mode 100644 index f999fc965..000000000 --- a/vendor/github.com/pelletier/go-toml/query/doc.go +++ /dev/null @@ -1,175 +0,0 @@ -// Package query performs JSONPath-like queries on a TOML document. -// -// The query path implementation is based loosely on the JSONPath specification: -// http://goessner.net/articles/JsonPath/. -// -// The idea behind a query path is to allow quick access to any element, or set -// of elements within TOML document, with a single expression. -// -// result, err := query.CompileAndExecute("$.foo.bar.baz", tree) -// -// This is roughly equivalent to: -// -// next := tree.Get("foo") -// if next != nil { -// next = next.Get("bar") -// if next != nil { -// next = next.Get("baz") -// } -// } -// result := next -// -// err is nil if any parsing exception occurs. -// -// If no node in the tree matches the query, result will simply contain an empty list of -// items. -// -// As illustrated above, the query path is much more efficient, especially since -// the structure of the TOML file can vary. Rather than making assumptions about -// a document's structure, a query allows the programmer to make structured -// requests into the document, and get zero or more values as a result. -// -// Query syntax -// -// The syntax of a query begins with a root token, followed by any number -// sub-expressions: -// -// $ -// Root of the TOML tree. This must always come first. -// .name -// Selects child of this node, where 'name' is a TOML key -// name. -// ['name'] -// Selects child of this node, where 'name' is a string -// containing a TOML key name. -// [index] -// Selcts child array element at 'index'. -// ..expr -// Recursively selects all children, filtered by an a union, -// index, or slice expression. -// ..* -// Recursive selection of all nodes at this point in the -// tree. -// .* -// Selects all children of the current node. -// [expr,expr] -// Union operator - a logical 'or' grouping of two or more -// sub-expressions: index, key name, or filter. -// [start:end:step] -// Slice operator - selects array elements from start to -// end-1, at the given step. All three arguments are -// optional. -// [?(filter)] -// Named filter expression - the function 'filter' is -// used to filter children at this node. -// -// Query Indexes And Slices -// -// Index expressions perform no bounds checking, and will contribute no -// values to the result set if the provided index or index range is invalid. -// Negative indexes represent values from the end of the array, counting backwards. -// -// // select the last index of the array named 'foo' -// query.CompileAndExecute("$.foo[-1]", tree) -// -// Slice expressions are supported, by using ':' to separate a start/end index pair. -// -// // select up to the first five elements in the array -// query.CompileAndExecute("$.foo[0:5]", tree) -// -// Slice expressions also allow negative indexes for the start and stop -// arguments. -// -// // select all array elements. -// query.CompileAndExecute("$.foo[0:-1]", tree) -// -// Slice expressions may have an optional stride/step parameter: -// -// // select every other element -// query.CompileAndExecute("$.foo[0:-1:2]", tree) -// -// Slice start and end parameters are also optional: -// -// // these are all equivalent and select all the values in the array -// query.CompileAndExecute("$.foo[:]", tree) -// query.CompileAndExecute("$.foo[0:]", tree) -// query.CompileAndExecute("$.foo[:-1]", tree) -// query.CompileAndExecute("$.foo[0:-1:]", tree) -// query.CompileAndExecute("$.foo[::1]", tree) -// query.CompileAndExecute("$.foo[0::1]", tree) -// query.CompileAndExecute("$.foo[:-1:1]", tree) -// query.CompileAndExecute("$.foo[0:-1:1]", tree) -// -// Query Filters -// -// Query filters are used within a Union [,] or single Filter [] expression. -// A filter only allows nodes that qualify through to the next expression, -// and/or into the result set. -// -// // returns children of foo that are permitted by the 'bar' filter. -// query.CompileAndExecute("$.foo[?(bar)]", tree) -// -// There are several filters provided with the library: -// -// tree -// Allows nodes of type Tree. -// int -// Allows nodes of type int64. -// float -// Allows nodes of type float64. -// string -// Allows nodes of type string. -// time -// Allows nodes of type time.Time. -// bool -// Allows nodes of type bool. -// -// Query Results -// -// An executed query returns a Result object. This contains the nodes -// in the TOML tree that qualify the query expression. Position information -// is also available for each value in the set. -// -// // display the results of a query -// results := query.CompileAndExecute("$.foo.bar.baz", tree) -// for idx, value := results.Values() { -// fmt.Println("%v: %v", results.Positions()[idx], value) -// } -// -// Compiled Queries -// -// Queries may be executed directly on a Tree object, or compiled ahead -// of time and executed discretely. The former is more convienent, but has the -// penalty of having to recompile the query expression each time. -// -// // basic query -// results := query.CompileAndExecute("$.foo.bar.baz", tree) -// -// // compiled query -// query, err := toml.Compile("$.foo.bar.baz") -// results := query.Execute(tree) -// -// // run the compiled query again on a different tree -// moreResults := query.Execute(anotherTree) -// -// User Defined Query Filters -// -// Filter expressions may also be user defined by using the SetFilter() -// function on the Query object. The function must return true/false, which -// signifies if the passed node is kept or discarded, respectively. -// -// // create a query that references a user-defined filter -// query, _ := query.Compile("$[?(bazOnly)]") -// -// // define the filter, and assign it to the query -// query.SetFilter("bazOnly", func(node interface{}) bool{ -// if tree, ok := node.(*Tree); ok { -// return tree.Has("baz") -// } -// return false // reject all other node types -// }) -// -// // run the query -// query.Execute(tree) -// -package query diff --git a/vendor/github.com/pelletier/go-toml/query/lexer.go b/vendor/github.com/pelletier/go-toml/query/lexer.go deleted file mode 100644 index 6336d52cd..000000000 --- a/vendor/github.com/pelletier/go-toml/query/lexer.go +++ /dev/null @@ -1,357 +0,0 @@ -// TOML JSONPath lexer. -// -// Written using the principles developed by Rob Pike in -// http://www.youtube.com/watch?v=HxaD_trXwRE - -package query - -import ( - "fmt" - "strconv" - "strings" - "unicode/utf8" - "github.com/pelletier/go-toml" -) - -// Lexer state function -type queryLexStateFn func() queryLexStateFn - -// Lexer definition -type queryLexer struct { - input string - start int - pos int - width int - tokens chan token - depth int - line int - col int - stringTerm string -} - -func (l *queryLexer) run() { - for state := l.lexVoid; state != nil; { - state = state() - } - close(l.tokens) -} - -func (l *queryLexer) nextStart() { - // iterate by runes (utf8 characters) - // search for newlines and advance line/col counts - for i := l.start; i < l.pos; { - r, width := utf8.DecodeRuneInString(l.input[i:]) - if r == '\n' { - l.line++ - l.col = 1 - } else { - l.col++ - } - i += width - } - // advance start position to next token - l.start = l.pos -} - -func (l *queryLexer) emit(t tokenType) { - l.tokens <- token{ - Position: toml.Position{Line:l.line, Col:l.col}, - typ: t, - val: l.input[l.start:l.pos], - } - l.nextStart() -} - -func (l *queryLexer) emitWithValue(t tokenType, value string) { - l.tokens <- token{ - Position: toml.Position{Line:l.line, Col:l.col}, - typ: t, - val: value, - } - l.nextStart() -} - -func (l *queryLexer) next() rune { - if l.pos >= len(l.input) { - l.width = 0 - return eof - } - var r rune - r, l.width = utf8.DecodeRuneInString(l.input[l.pos:]) - l.pos += l.width - return r -} - -func (l *queryLexer) ignore() { - l.nextStart() -} - -func (l *queryLexer) backup() { - l.pos -= l.width -} - -func (l *queryLexer) errorf(format string, args ...interface{}) queryLexStateFn { - l.tokens <- token{ - Position: toml.Position{Line:l.line, Col:l.col}, - typ: tokenError, - val: fmt.Sprintf(format, args...), - } - return nil -} - -func (l *queryLexer) peek() rune { - r := l.next() - l.backup() - return r -} - -func (l *queryLexer) accept(valid string) bool { - if strings.ContainsRune(valid, l.next()) { - return true - } - l.backup() - return false -} - -func (l *queryLexer) follow(next string) bool { - return strings.HasPrefix(l.input[l.pos:], next) -} - -func (l *queryLexer) lexVoid() queryLexStateFn { - for { - next := l.peek() - switch next { - case '$': - l.pos++ - l.emit(tokenDollar) - continue - case '.': - if l.follow("..") { - l.pos += 2 - l.emit(tokenDotDot) - } else { - l.pos++ - l.emit(tokenDot) - } - continue - case '[': - l.pos++ - l.emit(tokenLeftBracket) - continue - case ']': - l.pos++ - l.emit(tokenRightBracket) - continue - case ',': - l.pos++ - l.emit(tokenComma) - continue - case '*': - l.pos++ - l.emit(tokenStar) - continue - case '(': - l.pos++ - l.emit(tokenLeftParen) - continue - case ')': - l.pos++ - l.emit(tokenRightParen) - continue - case '?': - l.pos++ - l.emit(tokenQuestion) - continue - case ':': - l.pos++ - l.emit(tokenColon) - continue - case '\'': - l.ignore() - l.stringTerm = string(next) - return l.lexString - case '"': - l.ignore() - l.stringTerm = string(next) - return l.lexString - } - - if isSpace(next) { - l.next() - l.ignore() - continue - } - - if isAlphanumeric(next) { - return l.lexKey - } - - if next == '+' || next == '-' || isDigit(next) { - return l.lexNumber - } - - if l.next() == eof { - break - } - - return l.errorf("unexpected char: '%v'", next) - } - l.emit(tokenEOF) - return nil -} - -func (l *queryLexer) lexKey() queryLexStateFn { - for { - next := l.peek() - if !isAlphanumeric(next) { - l.emit(tokenKey) - return l.lexVoid - } - - if l.next() == eof { - break - } - } - l.emit(tokenEOF) - return nil -} - -func (l *queryLexer) lexString() queryLexStateFn { - l.pos++ - l.ignore() - growingString := "" - - for { - if l.follow(l.stringTerm) { - l.emitWithValue(tokenString, growingString) - l.pos++ - l.ignore() - return l.lexVoid - } - - if l.follow("\\\"") { - l.pos++ - growingString += "\"" - } else if l.follow("\\'") { - l.pos++ - growingString += "'" - } else if l.follow("\\n") { - l.pos++ - growingString += "\n" - } else if l.follow("\\b") { - l.pos++ - growingString += "\b" - } else if l.follow("\\f") { - l.pos++ - growingString += "\f" - } else if l.follow("\\/") { - l.pos++ - growingString += "/" - } else if l.follow("\\t") { - l.pos++ - growingString += "\t" - } else if l.follow("\\r") { - l.pos++ - growingString += "\r" - } else if l.follow("\\\\") { - l.pos++ - growingString += "\\" - } else if l.follow("\\u") { - l.pos += 2 - code := "" - for i := 0; i < 4; i++ { - c := l.peek() - l.pos++ - if !isHexDigit(c) { - return l.errorf("unfinished unicode escape") - } - code = code + string(c) - } - l.pos-- - intcode, err := strconv.ParseInt(code, 16, 32) - if err != nil { - return l.errorf("invalid unicode escape: \\u" + code) - } - growingString += string(rune(intcode)) - } else if l.follow("\\U") { - l.pos += 2 - code := "" - for i := 0; i < 8; i++ { - c := l.peek() - l.pos++ - if !isHexDigit(c) { - return l.errorf("unfinished unicode escape") - } - code = code + string(c) - } - l.pos-- - intcode, err := strconv.ParseInt(code, 16, 32) - if err != nil { - return l.errorf("invalid unicode escape: \\u" + code) - } - growingString += string(rune(intcode)) - } else if l.follow("\\") { - l.pos++ - return l.errorf("invalid escape sequence: \\" + string(l.peek())) - } else { - growingString += string(l.peek()) - } - - if l.next() == eof { - break - } - } - - return l.errorf("unclosed string") -} - -func (l *queryLexer) lexNumber() queryLexStateFn { - l.ignore() - if !l.accept("+") { - l.accept("-") - } - pointSeen := false - digitSeen := false - for { - next := l.next() - if next == '.' { - if pointSeen { - return l.errorf("cannot have two dots in one float") - } - if !isDigit(l.peek()) { - return l.errorf("float cannot end with a dot") - } - pointSeen = true - } else if isDigit(next) { - digitSeen = true - } else { - l.backup() - break - } - if pointSeen && !digitSeen { - return l.errorf("cannot start float with a dot") - } - } - - if !digitSeen { - return l.errorf("no digit in that number") - } - if pointSeen { - l.emit(tokenFloat) - } else { - l.emit(tokenInteger) - } - return l.lexVoid -} - -// Entry point -func lexQuery(input string) chan token { - l := &queryLexer{ - input: input, - tokens: make(chan token), - line: 1, - col: 1, - } - go l.run() - return l.tokens -} diff --git a/vendor/github.com/pelletier/go-toml/query/lexer_test.go b/vendor/github.com/pelletier/go-toml/query/lexer_test.go deleted file mode 100644 index e2b733a34..000000000 --- a/vendor/github.com/pelletier/go-toml/query/lexer_test.go +++ /dev/null @@ -1,179 +0,0 @@ -package query - -import ( - "testing" - "github.com/pelletier/go-toml" -) - -func testQLFlow(t *testing.T, input string, expectedFlow []token) { - ch := lexQuery(input) - for idx, expected := range expectedFlow { - token := <-ch - if token != expected { - t.Log("While testing #", idx, ":", input) - t.Log("compared (got)", token, "to (expected)", expected) - t.Log("\tvalue:", token.val, "<->", expected.val) - t.Log("\tvalue as bytes:", []byte(token.val), "<->", []byte(expected.val)) - t.Log("\ttype:", token.typ.String(), "<->", expected.typ.String()) - t.Log("\tline:", token.Line, "<->", expected.Line) - t.Log("\tcolumn:", token.Col, "<->", expected.Col) - t.Log("compared", token, "to", expected) - t.FailNow() - } - } - - tok, ok := <-ch - if ok { - t.Log("channel is not closed!") - t.Log(len(ch)+1, "tokens remaining:") - - t.Log("token ->", tok) - for token := range ch { - t.Log("token ->", token) - } - t.FailNow() - } -} - -func TestLexSpecialChars(t *testing.T) { - testQLFlow(t, " .$[]..()?*", []token{ - {toml.Position{1, 2}, tokenDot, "."}, - {toml.Position{1, 3}, tokenDollar, "$"}, - {toml.Position{1, 4}, tokenLeftBracket, "["}, - {toml.Position{1, 5}, tokenRightBracket, "]"}, - {toml.Position{1, 6}, tokenDotDot, ".."}, - {toml.Position{1, 8}, tokenLeftParen, "("}, - {toml.Position{1, 9}, tokenRightParen, ")"}, - {toml.Position{1, 10}, tokenQuestion, "?"}, - {toml.Position{1, 11}, tokenStar, "*"}, - {toml.Position{1, 12}, tokenEOF, ""}, - }) -} - -func TestLexString(t *testing.T) { - testQLFlow(t, "'foo\n'", []token{ - {toml.Position{1, 2}, tokenString, "foo\n"}, - {toml.Position{2, 2}, tokenEOF, ""}, - }) -} - -func TestLexDoubleString(t *testing.T) { - testQLFlow(t, `"bar"`, []token{ - {toml.Position{1, 2}, tokenString, "bar"}, - {toml.Position{1, 6}, tokenEOF, ""}, - }) -} - -func TestLexStringEscapes(t *testing.T) { - testQLFlow(t, `"foo \" \' \b \f \/ \t \r \\ \u03A9 \U00012345 \n bar"`, []token{ - {toml.Position{1, 2}, tokenString, "foo \" ' \b \f / \t \r \\ \u03A9 \U00012345 \n bar"}, - {toml.Position{1, 55}, tokenEOF, ""}, - }) -} - -func TestLexStringUnfinishedUnicode4(t *testing.T) { - testQLFlow(t, `"\u000"`, []token{ - {toml.Position{1, 2}, tokenError, "unfinished unicode escape"}, - }) -} - -func TestLexStringUnfinishedUnicode8(t *testing.T) { - testQLFlow(t, `"\U0000"`, []token{ - {toml.Position{1, 2}, tokenError, "unfinished unicode escape"}, - }) -} - -func TestLexStringInvalidEscape(t *testing.T) { - testQLFlow(t, `"\x"`, []token{ - {toml.Position{1, 2}, tokenError, "invalid escape sequence: \\x"}, - }) -} - -func TestLexStringUnfinished(t *testing.T) { - testQLFlow(t, `"bar`, []token{ - {toml.Position{1, 2}, tokenError, "unclosed string"}, - }) -} - -func TestLexKey(t *testing.T) { - testQLFlow(t, "foo", []token{ - {toml.Position{1, 1}, tokenKey, "foo"}, - {toml.Position{1, 4}, tokenEOF, ""}, - }) -} - -func TestLexRecurse(t *testing.T) { - testQLFlow(t, "$..*", []token{ - {toml.Position{1, 1}, tokenDollar, "$"}, - {toml.Position{1, 2}, tokenDotDot, ".."}, - {toml.Position{1, 4}, tokenStar, "*"}, - {toml.Position{1, 5}, tokenEOF, ""}, - }) -} - -func TestLexBracketKey(t *testing.T) { - testQLFlow(t, "$[foo]", []token{ - {toml.Position{1, 1}, tokenDollar, "$"}, - {toml.Position{1, 2}, tokenLeftBracket, "["}, - {toml.Position{1, 3}, tokenKey, "foo"}, - {toml.Position{1, 6}, tokenRightBracket, "]"}, - {toml.Position{1, 7}, tokenEOF, ""}, - }) -} - -func TestLexSpace(t *testing.T) { - testQLFlow(t, "foo bar baz", []token{ - {toml.Position{1, 1}, tokenKey, "foo"}, - {toml.Position{1, 5}, tokenKey, "bar"}, - {toml.Position{1, 9}, tokenKey, "baz"}, - {toml.Position{1, 12}, tokenEOF, ""}, - }) -} - -func TestLexInteger(t *testing.T) { - testQLFlow(t, "100 +200 -300", []token{ - {toml.Position{1, 1}, tokenInteger, "100"}, - {toml.Position{1, 5}, tokenInteger, "+200"}, - {toml.Position{1, 10}, tokenInteger, "-300"}, - {toml.Position{1, 14}, tokenEOF, ""}, - }) -} - -func TestLexFloat(t *testing.T) { - testQLFlow(t, "100.0 +200.0 -300.0", []token{ - {toml.Position{1, 1}, tokenFloat, "100.0"}, - {toml.Position{1, 7}, tokenFloat, "+200.0"}, - {toml.Position{1, 14}, tokenFloat, "-300.0"}, - {toml.Position{1, 20}, tokenEOF, ""}, - }) -} - -func TestLexFloatWithMultipleDots(t *testing.T) { - testQLFlow(t, "4.2.", []token{ - {toml.Position{1, 1}, tokenError, "cannot have two dots in one float"}, - }) -} - -func TestLexFloatLeadingDot(t *testing.T) { - testQLFlow(t, "+.1", []token{ - {toml.Position{1, 1}, tokenError, "cannot start float with a dot"}, - }) -} - -func TestLexFloatWithTrailingDot(t *testing.T) { - testQLFlow(t, "42.", []token{ - {toml.Position{1, 1}, tokenError, "float cannot end with a dot"}, - }) -} - -func TestLexNumberWithoutDigit(t *testing.T) { - testQLFlow(t, "+", []token{ - {toml.Position{1, 1}, tokenError, "no digit in that number"}, - }) -} - -func TestLexUnknown(t *testing.T) { - testQLFlow(t, "^", []token{ - {toml.Position{1, 1}, tokenError, "unexpected char: '94'"}, - }) -} diff --git a/vendor/github.com/pelletier/go-toml/query/match.go b/vendor/github.com/pelletier/go-toml/query/match.go deleted file mode 100644 index d7bb15a45..000000000 --- a/vendor/github.com/pelletier/go-toml/query/match.go +++ /dev/null @@ -1,232 +0,0 @@ -package query - -import ( - "fmt" - "github.com/pelletier/go-toml" -) - -// base match -type matchBase struct { - next pathFn -} - -func (f *matchBase) setNext(next pathFn) { - f.next = next -} - -// terminating functor - gathers results -type terminatingFn struct { - // empty -} - -func newTerminatingFn() *terminatingFn { - return &terminatingFn{} -} - -func (f *terminatingFn) setNext(next pathFn) { - // do nothing -} - -func (f *terminatingFn) call(node interface{}, ctx *queryContext) { - ctx.result.appendResult(node, ctx.lastPosition) -} - -// match single key -type matchKeyFn struct { - matchBase - Name string -} - -func newMatchKeyFn(name string) *matchKeyFn { - return &matchKeyFn{Name: name} -} - -func (f *matchKeyFn) call(node interface{}, ctx *queryContext) { - if array, ok := node.([]*toml.Tree); ok { - for _, tree := range array { - item := tree.Get(f.Name) - if item != nil { - ctx.lastPosition = tree.GetPosition(f.Name) - f.next.call(item, ctx) - } - } - } else if tree, ok := node.(*toml.Tree); ok { - item := tree.Get(f.Name) - if item != nil { - ctx.lastPosition = tree.GetPosition(f.Name) - f.next.call(item, ctx) - } - } -} - -// match single index -type matchIndexFn struct { - matchBase - Idx int -} - -func newMatchIndexFn(idx int) *matchIndexFn { - return &matchIndexFn{Idx: idx} -} - -func (f *matchIndexFn) call(node interface{}, ctx *queryContext) { - if arr, ok := node.([]interface{}); ok { - if f.Idx < len(arr) && f.Idx >= 0 { - if treesArray, ok := node.([]*toml.Tree); ok { - if len(treesArray) > 0 { - ctx.lastPosition = treesArray[0].Position() - } - } - f.next.call(arr[f.Idx], ctx) - } - } -} - -// filter by slicing -type matchSliceFn struct { - matchBase - Start, End, Step int -} - -func newMatchSliceFn(start, end, step int) *matchSliceFn { - return &matchSliceFn{Start: start, End: end, Step: step} -} - -func (f *matchSliceFn) call(node interface{}, ctx *queryContext) { - if arr, ok := node.([]interface{}); ok { - // adjust indexes for negative values, reverse ordering - realStart, realEnd := f.Start, f.End - if realStart < 0 { - realStart = len(arr) + realStart - } - if realEnd < 0 { - realEnd = len(arr) + realEnd - } - if realEnd < realStart { - realEnd, realStart = realStart, realEnd // swap - } - // loop and gather - for idx := realStart; idx < realEnd; idx += f.Step { - if treesArray, ok := node.([]*toml.Tree); ok { - if len(treesArray) > 0 { - ctx.lastPosition = treesArray[0].Position() - } - } - f.next.call(arr[idx], ctx) - } - } -} - -// match anything -type matchAnyFn struct { - matchBase -} - -func newMatchAnyFn() *matchAnyFn { - return &matchAnyFn{} -} - -func (f *matchAnyFn) call(node interface{}, ctx *queryContext) { - if tree, ok := node.(*toml.Tree); ok { - for _, k := range tree.Keys() { - v := tree.Get(k) - ctx.lastPosition = tree.GetPosition(k) - f.next.call(v, ctx) - } - } -} - -// filter through union -type matchUnionFn struct { - Union []pathFn -} - -func (f *matchUnionFn) setNext(next pathFn) { - for _, fn := range f.Union { - fn.setNext(next) - } -} - -func (f *matchUnionFn) call(node interface{}, ctx *queryContext) { - for _, fn := range f.Union { - fn.call(node, ctx) - } -} - -// match every single last node in the tree -type matchRecursiveFn struct { - matchBase -} - -func newMatchRecursiveFn() *matchRecursiveFn { - return &matchRecursiveFn{} -} - -func (f *matchRecursiveFn) call(node interface{}, ctx *queryContext) { - originalPosition := ctx.lastPosition - if tree, ok := node.(*toml.Tree); ok { - var visit func(tree *toml.Tree) - visit = func(tree *toml.Tree) { - for _, k := range tree.Keys() { - v := tree.Get(k) - ctx.lastPosition = tree.GetPosition(k) - f.next.call(v, ctx) - switch node := v.(type) { - case *toml.Tree: - visit(node) - case []*toml.Tree: - for _, subtree := range node { - visit(subtree) - } - } - } - } - ctx.lastPosition = originalPosition - f.next.call(tree, ctx) - visit(tree) - } -} - -// match based on an externally provided functional filter -type matchFilterFn struct { - matchBase - Pos toml.Position - Name string -} - -func newMatchFilterFn(name string, pos toml.Position) *matchFilterFn { - return &matchFilterFn{Name: name, Pos: pos} -} - -func (f *matchFilterFn) call(node interface{}, ctx *queryContext) { - fn, ok := (*ctx.filters)[f.Name] - if !ok { - panic(fmt.Sprintf("%s: query context does not have filter '%s'", - f.Pos.String(), f.Name)) - } - switch castNode := node.(type) { - case *toml.Tree: - for _, k := range castNode.Keys() { - v := castNode.Get(k) - if fn(v) { - ctx.lastPosition = castNode.GetPosition(k) - f.next.call(v, ctx) - } - } - case []*toml.Tree: - for _, v := range castNode { - if fn(v) { - if len(castNode) > 0 { - ctx.lastPosition = castNode[0].Position() - } - f.next.call(v, ctx) - } - } - case []interface{}: - for _, v := range castNode { - if fn(v) { - f.next.call(v, ctx) - } - } - } -} diff --git a/vendor/github.com/pelletier/go-toml/query/match_test.go b/vendor/github.com/pelletier/go-toml/query/match_test.go deleted file mode 100644 index 567b11cd7..000000000 --- a/vendor/github.com/pelletier/go-toml/query/match_test.go +++ /dev/null @@ -1,202 +0,0 @@ -package query - -import ( - "fmt" - "testing" - "github.com/pelletier/go-toml" -) - -// dump path tree to a string -func pathString(root pathFn) string { - result := fmt.Sprintf("%T:", root) - switch fn := root.(type) { - case *terminatingFn: - result += "{}" - case *matchKeyFn: - result += fmt.Sprintf("{%s}", fn.Name) - result += pathString(fn.next) - case *matchIndexFn: - result += fmt.Sprintf("{%d}", fn.Idx) - result += pathString(fn.next) - case *matchSliceFn: - result += fmt.Sprintf("{%d:%d:%d}", - fn.Start, fn.End, fn.Step) - result += pathString(fn.next) - case *matchAnyFn: - result += "{}" - result += pathString(fn.next) - case *matchUnionFn: - result += "{[" - for _, v := range fn.Union { - result += pathString(v) + ", " - } - result += "]}" - case *matchRecursiveFn: - result += "{}" - result += pathString(fn.next) - case *matchFilterFn: - result += fmt.Sprintf("{%s}", fn.Name) - result += pathString(fn.next) - } - return result -} - -func assertPathMatch(t *testing.T, path, ref *Query) bool { - pathStr := pathString(path.root) - refStr := pathString(ref.root) - if pathStr != refStr { - t.Errorf("paths do not match") - t.Log("test:", pathStr) - t.Log("ref: ", refStr) - return false - } - return true -} - -func assertPath(t *testing.T, query string, ref *Query) { - path, _ := parseQuery(lexQuery(query)) - assertPathMatch(t, path, ref) -} - -func buildPath(parts ...pathFn) *Query { - query := newQuery() - for _, v := range parts { - query.appendPath(v) - } - return query -} - -func TestPathRoot(t *testing.T) { - assertPath(t, - "$", - buildPath( - // empty - )) -} - -func TestPathKey(t *testing.T) { - assertPath(t, - "$.foo", - buildPath( - newMatchKeyFn("foo"), - )) -} - -func TestPathBracketKey(t *testing.T) { - assertPath(t, - "$[foo]", - buildPath( - newMatchKeyFn("foo"), - )) -} - -func TestPathBracketStringKey(t *testing.T) { - assertPath(t, - "$['foo']", - buildPath( - newMatchKeyFn("foo"), - )) -} - -func TestPathIndex(t *testing.T) { - assertPath(t, - "$[123]", - buildPath( - newMatchIndexFn(123), - )) -} - -func TestPathSliceStart(t *testing.T) { - assertPath(t, - "$[123:]", - buildPath( - newMatchSliceFn(123, maxInt, 1), - )) -} - -func TestPathSliceStartEnd(t *testing.T) { - assertPath(t, - "$[123:456]", - buildPath( - newMatchSliceFn(123, 456, 1), - )) -} - -func TestPathSliceStartEndColon(t *testing.T) { - assertPath(t, - "$[123:456:]", - buildPath( - newMatchSliceFn(123, 456, 1), - )) -} - -func TestPathSliceStartStep(t *testing.T) { - assertPath(t, - "$[123::7]", - buildPath( - newMatchSliceFn(123, maxInt, 7), - )) -} - -func TestPathSliceEndStep(t *testing.T) { - assertPath(t, - "$[:456:7]", - buildPath( - newMatchSliceFn(0, 456, 7), - )) -} - -func TestPathSliceStep(t *testing.T) { - assertPath(t, - "$[::7]", - buildPath( - newMatchSliceFn(0, maxInt, 7), - )) -} - -func TestPathSliceAll(t *testing.T) { - assertPath(t, - "$[123:456:7]", - buildPath( - newMatchSliceFn(123, 456, 7), - )) -} - -func TestPathAny(t *testing.T) { - assertPath(t, - "$.*", - buildPath( - newMatchAnyFn(), - )) -} - -func TestPathUnion(t *testing.T) { - assertPath(t, - "$[foo, bar, baz]", - buildPath( - &matchUnionFn{[]pathFn{ - newMatchKeyFn("foo"), - newMatchKeyFn("bar"), - newMatchKeyFn("baz"), - }}, - )) -} - -func TestPathRecurse(t *testing.T) { - assertPath(t, - "$..*", - buildPath( - newMatchRecursiveFn(), - )) -} - -func TestPathFilterExpr(t *testing.T) { - assertPath(t, - "$[?('foo'),?(bar)]", - buildPath( - &matchUnionFn{[]pathFn{ - newMatchFilterFn("foo", toml.Position{}), - newMatchFilterFn("bar", toml.Position{}), - }}, - )) -} diff --git a/vendor/github.com/pelletier/go-toml/query/parser.go b/vendor/github.com/pelletier/go-toml/query/parser.go deleted file mode 100644 index e4f91b97e..000000000 --- a/vendor/github.com/pelletier/go-toml/query/parser.go +++ /dev/null @@ -1,275 +0,0 @@ -/* - Based on the "jsonpath" spec/concept. - - http://goessner.net/articles/JsonPath/ - https://code.google.com/p/json-path/ -*/ - -package query - -import ( - "fmt" -) - -const maxInt = int(^uint(0) >> 1) - -type queryParser struct { - flow chan token - tokensBuffer []token - query *Query - union []pathFn - err error -} - -type queryParserStateFn func() queryParserStateFn - -// Formats and panics an error message based on a token -func (p *queryParser) parseError(tok *token, msg string, args ...interface{}) queryParserStateFn { - p.err = fmt.Errorf(tok.Position.String()+": "+msg, args...) - return nil // trigger parse to end -} - -func (p *queryParser) run() { - for state := p.parseStart; state != nil; { - state = state() - } -} - -func (p *queryParser) backup(tok *token) { - p.tokensBuffer = append(p.tokensBuffer, *tok) -} - -func (p *queryParser) peek() *token { - if len(p.tokensBuffer) != 0 { - return &(p.tokensBuffer[0]) - } - - tok, ok := <-p.flow - if !ok { - return nil - } - p.backup(&tok) - return &tok -} - -func (p *queryParser) lookahead(types ...tokenType) bool { - result := true - buffer := []token{} - - for _, typ := range types { - tok := p.getToken() - if tok == nil { - result = false - break - } - buffer = append(buffer, *tok) - if tok.typ != typ { - result = false - break - } - } - // add the tokens back to the buffer, and return - p.tokensBuffer = append(p.tokensBuffer, buffer...) - return result -} - -func (p *queryParser) getToken() *token { - if len(p.tokensBuffer) != 0 { - tok := p.tokensBuffer[0] - p.tokensBuffer = p.tokensBuffer[1:] - return &tok - } - tok, ok := <-p.flow - if !ok { - return nil - } - return &tok -} - -func (p *queryParser) parseStart() queryParserStateFn { - tok := p.getToken() - - if tok == nil || tok.typ == tokenEOF { - return nil - } - - if tok.typ != tokenDollar { - return p.parseError(tok, "Expected '$' at start of expression") - } - - return p.parseMatchExpr -} - -// handle '.' prefix, '[]', and '..' -func (p *queryParser) parseMatchExpr() queryParserStateFn { - tok := p.getToken() - switch tok.typ { - case tokenDotDot: - p.query.appendPath(&matchRecursiveFn{}) - // nested parse for '..' - tok := p.getToken() - switch tok.typ { - case tokenKey: - p.query.appendPath(newMatchKeyFn(tok.val)) - return p.parseMatchExpr - case tokenLeftBracket: - return p.parseBracketExpr - case tokenStar: - // do nothing - the recursive predicate is enough - return p.parseMatchExpr - } - - case tokenDot: - // nested parse for '.' - tok := p.getToken() - switch tok.typ { - case tokenKey: - p.query.appendPath(newMatchKeyFn(tok.val)) - return p.parseMatchExpr - case tokenStar: - p.query.appendPath(&matchAnyFn{}) - return p.parseMatchExpr - } - - case tokenLeftBracket: - return p.parseBracketExpr - - case tokenEOF: - return nil // allow EOF at this stage - } - return p.parseError(tok, "expected match expression") -} - -func (p *queryParser) parseBracketExpr() queryParserStateFn { - if p.lookahead(tokenInteger, tokenColon) { - return p.parseSliceExpr - } - if p.peek().typ == tokenColon { - return p.parseSliceExpr - } - return p.parseUnionExpr -} - -func (p *queryParser) parseUnionExpr() queryParserStateFn { - var tok *token - - // this state can be traversed after some sub-expressions - // so be careful when setting up state in the parser - if p.union == nil { - p.union = []pathFn{} - } - -loop: // labeled loop for easy breaking - for { - if len(p.union) > 0 { - // parse delimiter or terminator - tok = p.getToken() - switch tok.typ { - case tokenComma: - // do nothing - case tokenRightBracket: - break loop - default: - return p.parseError(tok, "expected ',' or ']', not '%s'", tok.val) - } - } - - // parse sub expression - tok = p.getToken() - switch tok.typ { - case tokenInteger: - p.union = append(p.union, newMatchIndexFn(tok.Int())) - case tokenKey: - p.union = append(p.union, newMatchKeyFn(tok.val)) - case tokenString: - p.union = append(p.union, newMatchKeyFn(tok.val)) - case tokenQuestion: - return p.parseFilterExpr - default: - return p.parseError(tok, "expected union sub expression, not '%s', %d", tok.val, len(p.union)) - } - } - - // if there is only one sub-expression, use that instead - if len(p.union) == 1 { - p.query.appendPath(p.union[0]) - } else { - p.query.appendPath(&matchUnionFn{p.union}) - } - - p.union = nil // clear out state - return p.parseMatchExpr -} - -func (p *queryParser) parseSliceExpr() queryParserStateFn { - // init slice to grab all elements - start, end, step := 0, maxInt, 1 - - // parse optional start - tok := p.getToken() - if tok.typ == tokenInteger { - start = tok.Int() - tok = p.getToken() - } - if tok.typ != tokenColon { - return p.parseError(tok, "expected ':'") - } - - // parse optional end - tok = p.getToken() - if tok.typ == tokenInteger { - end = tok.Int() - tok = p.getToken() - } - if tok.typ == tokenRightBracket { - p.query.appendPath(newMatchSliceFn(start, end, step)) - return p.parseMatchExpr - } - if tok.typ != tokenColon { - return p.parseError(tok, "expected ']' or ':'") - } - - // parse optional step - tok = p.getToken() - if tok.typ == tokenInteger { - step = tok.Int() - if step < 0 { - return p.parseError(tok, "step must be a positive value") - } - tok = p.getToken() - } - if tok.typ != tokenRightBracket { - return p.parseError(tok, "expected ']'") - } - - p.query.appendPath(newMatchSliceFn(start, end, step)) - return p.parseMatchExpr -} - -func (p *queryParser) parseFilterExpr() queryParserStateFn { - tok := p.getToken() - if tok.typ != tokenLeftParen { - return p.parseError(tok, "expected left-parenthesis for filter expression") - } - tok = p.getToken() - if tok.typ != tokenKey && tok.typ != tokenString { - return p.parseError(tok, "expected key or string for filter funciton name") - } - name := tok.val - tok = p.getToken() - if tok.typ != tokenRightParen { - return p.parseError(tok, "expected right-parenthesis for filter expression") - } - p.union = append(p.union, newMatchFilterFn(name, tok.Position)) - return p.parseUnionExpr -} - -func parseQuery(flow chan token) (*Query, error) { - parser := &queryParser{ - flow: flow, - tokensBuffer: []token{}, - query: newQuery(), - } - parser.run() - return parser.query, parser.err -} diff --git a/vendor/github.com/pelletier/go-toml/query/parser_test.go b/vendor/github.com/pelletier/go-toml/query/parser_test.go deleted file mode 100644 index b1d0a3ece..000000000 --- a/vendor/github.com/pelletier/go-toml/query/parser_test.go +++ /dev/null @@ -1,482 +0,0 @@ -package query - -import ( - "fmt" - "io/ioutil" - "sort" - "strings" - "testing" - "time" - "github.com/pelletier/go-toml" -) - -type queryTestNode struct { - value interface{} - position toml.Position -} - -func valueString(root interface{}) string { - result := "" //fmt.Sprintf("%T:", root) - switch node := root.(type) { - case *Result: - items := []string{} - for i, v := range node.Values() { - items = append(items, fmt.Sprintf("%s:%s", - node.Positions()[i].String(), valueString(v))) - } - sort.Strings(items) - result = "[" + strings.Join(items, ", ") + "]" - case queryTestNode: - result = fmt.Sprintf("%s:%s", - node.position.String(), valueString(node.value)) - case []interface{}: - items := []string{} - for _, v := range node { - items = append(items, valueString(v)) - } - sort.Strings(items) - result = "[" + strings.Join(items, ", ") + "]" - case *toml.Tree: - // workaround for unreliable map key ordering - items := []string{} - for _, k := range node.Keys() { - v := node.GetPath([]string{k}) - items = append(items, k+":"+valueString(v)) - } - sort.Strings(items) - result = "{" + strings.Join(items, ", ") + "}" - case map[string]interface{}: - // workaround for unreliable map key ordering - items := []string{} - for k, v := range node { - items = append(items, k+":"+valueString(v)) - } - sort.Strings(items) - result = "{" + strings.Join(items, ", ") + "}" - case int64: - result += fmt.Sprintf("%d", node) - case string: - result += "'" + node + "'" - case float64: - result += fmt.Sprintf("%f", node) - case bool: - result += fmt.Sprintf("%t", node) - case time.Time: - result += fmt.Sprintf("'%v'", node) - } - return result -} - -func assertValue(t *testing.T, result, ref interface{}) { - pathStr := valueString(result) - refStr := valueString(ref) - if pathStr != refStr { - t.Errorf("values do not match") - t.Log("test:", pathStr) - t.Log("ref: ", refStr) - } -} - -func assertQueryPositions(t *testing.T, tomlDoc string, query string, ref []interface{}) { - tree, err := toml.Load(tomlDoc) - if err != nil { - t.Errorf("Non-nil toml parse error: %v", err) - return - } - q, err := Compile(query) - if err != nil { - t.Error(err) - return - } - results := q.Execute(tree) - assertValue(t, results, ref) -} - -func TestQueryRoot(t *testing.T) { - assertQueryPositions(t, - "a = 42", - "$", - []interface{}{ - queryTestNode{ - map[string]interface{}{ - "a": int64(42), - }, toml.Position{1, 1}, - }, - }) -} - -func TestQueryKey(t *testing.T) { - assertQueryPositions(t, - "[foo]\na = 42", - "$.foo.a", - []interface{}{ - queryTestNode{ - int64(42), toml.Position{2, 1}, - }, - }) -} - -func TestQueryKeyString(t *testing.T) { - assertQueryPositions(t, - "[foo]\na = 42", - "$.foo['a']", - []interface{}{ - queryTestNode{ - int64(42), toml.Position{2, 1}, - }, - }) -} - -func TestQueryIndex(t *testing.T) { - assertQueryPositions(t, - "[foo]\na = [1,2,3,4,5,6,7,8,9,0]", - "$.foo.a[5]", - []interface{}{ - queryTestNode{ - int64(6), toml.Position{2, 1}, - }, - }) -} - -func TestQuerySliceRange(t *testing.T) { - assertQueryPositions(t, - "[foo]\na = [1,2,3,4,5,6,7,8,9,0]", - "$.foo.a[0:5]", - []interface{}{ - queryTestNode{ - int64(1), toml.Position{2, 1}, - }, - queryTestNode{ - int64(2), toml.Position{2, 1}, - }, - queryTestNode{ - int64(3), toml.Position{2, 1}, - }, - queryTestNode{ - int64(4), toml.Position{2, 1}, - }, - queryTestNode{ - int64(5), toml.Position{2, 1}, - }, - }) -} - -func TestQuerySliceStep(t *testing.T) { - assertQueryPositions(t, - "[foo]\na = [1,2,3,4,5,6,7,8,9,0]", - "$.foo.a[0:5:2]", - []interface{}{ - queryTestNode{ - int64(1), toml.Position{2, 1}, - }, - queryTestNode{ - int64(3), toml.Position{2, 1}, - }, - queryTestNode{ - int64(5), toml.Position{2, 1}, - }, - }) -} - -func TestQueryAny(t *testing.T) { - assertQueryPositions(t, - "[foo.bar]\na=1\nb=2\n[foo.baz]\na=3\nb=4", - "$.foo.*", - []interface{}{ - queryTestNode{ - map[string]interface{}{ - "a": int64(1), - "b": int64(2), - }, toml.Position{1, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "a": int64(3), - "b": int64(4), - }, toml.Position{4, 1}, - }, - }) -} -func TestQueryUnionSimple(t *testing.T) { - assertQueryPositions(t, - "[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6", - "$.*[bar,foo]", - []interface{}{ - queryTestNode{ - map[string]interface{}{ - "a": int64(1), - "b": int64(2), - }, toml.Position{1, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "a": int64(3), - "b": int64(4), - }, toml.Position{4, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "a": int64(5), - "b": int64(6), - }, toml.Position{7, 1}, - }, - }) -} - -func TestQueryRecursionAll(t *testing.T) { - assertQueryPositions(t, - "[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6", - "$..*", - []interface{}{ - queryTestNode{ - map[string]interface{}{ - "foo": map[string]interface{}{ - "bar": map[string]interface{}{ - "a": int64(1), - "b": int64(2), - }, - }, - "baz": map[string]interface{}{ - "foo": map[string]interface{}{ - "a": int64(3), - "b": int64(4), - }, - }, - "gorf": map[string]interface{}{ - "foo": map[string]interface{}{ - "a": int64(5), - "b": int64(6), - }, - }, - }, toml.Position{1, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "bar": map[string]interface{}{ - "a": int64(1), - "b": int64(2), - }, - }, toml.Position{1, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "a": int64(1), - "b": int64(2), - }, toml.Position{1, 1}, - }, - queryTestNode{ - int64(1), toml.Position{2, 1}, - }, - queryTestNode{ - int64(2), toml.Position{3, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "foo": map[string]interface{}{ - "a": int64(3), - "b": int64(4), - }, - }, toml.Position{4, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "a": int64(3), - "b": int64(4), - }, toml.Position{4, 1}, - }, - queryTestNode{ - int64(3), toml.Position{5, 1}, - }, - queryTestNode{ - int64(4), toml.Position{6, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "foo": map[string]interface{}{ - "a": int64(5), - "b": int64(6), - }, - }, toml.Position{7, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "a": int64(5), - "b": int64(6), - }, toml.Position{7, 1}, - }, - queryTestNode{ - int64(5), toml.Position{8, 1}, - }, - queryTestNode{ - int64(6), toml.Position{9, 1}, - }, - }) -} - -func TestQueryRecursionUnionSimple(t *testing.T) { - assertQueryPositions(t, - "[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6", - "$..['foo','bar']", - []interface{}{ - queryTestNode{ - map[string]interface{}{ - "bar": map[string]interface{}{ - "a": int64(1), - "b": int64(2), - }, - }, toml.Position{1, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "a": int64(3), - "b": int64(4), - }, toml.Position{4, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "a": int64(1), - "b": int64(2), - }, toml.Position{1, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "a": int64(5), - "b": int64(6), - }, toml.Position{7, 1}, - }, - }) -} - -func TestQueryFilterFn(t *testing.T) { - buff, err := ioutil.ReadFile("../example.toml") - if err != nil { - t.Error(err) - return - } - - assertQueryPositions(t, string(buff), - "$..[?(int)]", - []interface{}{ - queryTestNode{ - int64(8001), toml.Position{13, 1}, - }, - queryTestNode{ - int64(8001), toml.Position{13, 1}, - }, - queryTestNode{ - int64(8002), toml.Position{13, 1}, - }, - queryTestNode{ - int64(5000), toml.Position{14, 1}, - }, - }) - - assertQueryPositions(t, string(buff), - "$..[?(string)]", - []interface{}{ - queryTestNode{ - "TOML Example", toml.Position{3, 1}, - }, - queryTestNode{ - "Tom Preston-Werner", toml.Position{6, 1}, - }, - queryTestNode{ - "GitHub", toml.Position{7, 1}, - }, - queryTestNode{ - "GitHub Cofounder & CEO\nLikes tater tots and beer.", - toml.Position{8, 1}, - }, - queryTestNode{ - "192.168.1.1", toml.Position{12, 1}, - }, - queryTestNode{ - "10.0.0.1", toml.Position{21, 3}, - }, - queryTestNode{ - "eqdc10", toml.Position{22, 3}, - }, - queryTestNode{ - "10.0.0.2", toml.Position{25, 3}, - }, - queryTestNode{ - "eqdc10", toml.Position{26, 3}, - }, - }) - - assertQueryPositions(t, string(buff), - "$..[?(float)]", - []interface{}{ - // no float values in document - }) - - tv, _ := time.Parse(time.RFC3339, "1979-05-27T07:32:00Z") - assertQueryPositions(t, string(buff), - "$..[?(tree)]", - []interface{}{ - queryTestNode{ - map[string]interface{}{ - "name": "Tom Preston-Werner", - "organization": "GitHub", - "bio": "GitHub Cofounder & CEO\nLikes tater tots and beer.", - "dob": tv, - }, toml.Position{5, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "server": "192.168.1.1", - "ports": []interface{}{int64(8001), int64(8001), int64(8002)}, - "connection_max": int64(5000), - "enabled": true, - }, toml.Position{11, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "alpha": map[string]interface{}{ - "ip": "10.0.0.1", - "dc": "eqdc10", - }, - "beta": map[string]interface{}{ - "ip": "10.0.0.2", - "dc": "eqdc10", - }, - }, toml.Position{17, 1}, - }, - queryTestNode{ - map[string]interface{}{ - "ip": "10.0.0.1", - "dc": "eqdc10", - }, toml.Position{20, 3}, - }, - queryTestNode{ - map[string]interface{}{ - "ip": "10.0.0.2", - "dc": "eqdc10", - }, toml.Position{24, 3}, - }, - queryTestNode{ - map[string]interface{}{ - "data": []interface{}{ - []interface{}{"gamma", "delta"}, - []interface{}{int64(1), int64(2)}, - }, - }, toml.Position{28, 1}, - }, - }) - - assertQueryPositions(t, string(buff), - "$..[?(time)]", - []interface{}{ - queryTestNode{ - tv, toml.Position{9, 1}, - }, - }) - - assertQueryPositions(t, string(buff), - "$..[?(bool)]", - []interface{}{ - queryTestNode{ - true, toml.Position{15, 1}, - }, - }) -} diff --git a/vendor/github.com/pelletier/go-toml/query/query.go b/vendor/github.com/pelletier/go-toml/query/query.go deleted file mode 100644 index 1c6cd8014..000000000 --- a/vendor/github.com/pelletier/go-toml/query/query.go +++ /dev/null @@ -1,158 +0,0 @@ -package query - -import ( - "time" - - "github.com/pelletier/go-toml" -) - -// NodeFilterFn represents a user-defined filter function, for use with -// Query.SetFilter(). -// -// The return value of the function must indicate if 'node' is to be included -// at this stage of the TOML path. Returning true will include the node, and -// returning false will exclude it. -// -// NOTE: Care should be taken to write script callbacks such that they are safe -// to use from multiple goroutines. -type NodeFilterFn func(node interface{}) bool - -// Result is the result of Executing a Query. -type Result struct { - items []interface{} - positions []toml.Position -} - -// appends a value/position pair to the result set. -func (r *Result) appendResult(node interface{}, pos toml.Position) { - r.items = append(r.items, node) - r.positions = append(r.positions, pos) -} - -// Values is a set of values within a Result. The order of values is not -// guaranteed to be in document order, and may be different each time a query is -// executed. -func (r Result) Values() []interface{} { - return r.items -} - -// Positions is a set of positions for values within a Result. Each index -// in Positions() corresponds to the entry in Value() of the same index. -func (r Result) Positions() []toml.Position { - return r.positions -} - -// runtime context for executing query paths -type queryContext struct { - result *Result - filters *map[string]NodeFilterFn - lastPosition toml.Position -} - -// generic path functor interface -type pathFn interface { - setNext(next pathFn) - // it is the caller's responsibility to set the ctx.lastPosition before invoking call() - // node can be one of: *toml.Tree, []*toml.Tree, or a scalar - call(node interface{}, ctx *queryContext) -} - -// A Query is the representation of a compiled TOML path. A Query is safe -// for concurrent use by multiple goroutines. -type Query struct { - root pathFn - tail pathFn - filters *map[string]NodeFilterFn -} - -func newQuery() *Query { - return &Query{ - root: nil, - tail: nil, - filters: &defaultFilterFunctions, - } -} - -func (q *Query) appendPath(next pathFn) { - if q.root == nil { - q.root = next - } else { - q.tail.setNext(next) - } - q.tail = next - next.setNext(newTerminatingFn()) // init the next functor -} - -// Compile compiles a TOML path expression. The returned Query can be used -// to match elements within a Tree and its descendants. See Execute. -func Compile(path string) (*Query, error) { - return parseQuery(lexQuery(path)) -} - -// Execute executes a query against a Tree, and returns the result of the query. -func (q *Query) Execute(tree *toml.Tree) *Result { - result := &Result{ - items: []interface{}{}, - positions: []toml.Position{}, - } - if q.root == nil { - result.appendResult(tree, tree.GetPosition("")) - } else { - ctx := &queryContext{ - result: result, - filters: q.filters, - } - ctx.lastPosition = tree.Position() - q.root.call(tree, ctx) - } - return result -} - -// CompileAndExecute is a shorthand for Compile(path) followed by Execute(tree). -func CompileAndExecute(path string, tree *toml.Tree) (*Result, error) { - query, err := Compile(path) - if err != nil { - return nil, err - } - return query.Execute(tree), nil -} - -// SetFilter sets a user-defined filter function. These may be used inside -// "?(..)" query expressions to filter TOML document elements within a query. -func (q *Query) SetFilter(name string, fn NodeFilterFn) { - if q.filters == &defaultFilterFunctions { - // clone the static table - q.filters = &map[string]NodeFilterFn{} - for k, v := range defaultFilterFunctions { - (*q.filters)[k] = v - } - } - (*q.filters)[name] = fn -} - -var defaultFilterFunctions = map[string]NodeFilterFn{ - "tree": func(node interface{}) bool { - _, ok := node.(*toml.Tree) - return ok - }, - "int": func(node interface{}) bool { - _, ok := node.(int64) - return ok - }, - "float": func(node interface{}) bool { - _, ok := node.(float64) - return ok - }, - "string": func(node interface{}) bool { - _, ok := node.(string) - return ok - }, - "time": func(node interface{}) bool { - _, ok := node.(time.Time) - return ok - }, - "bool": func(node interface{}) bool { - _, ok := node.(bool) - return ok - }, -} diff --git a/vendor/github.com/pelletier/go-toml/query/query_test.go b/vendor/github.com/pelletier/go-toml/query/query_test.go deleted file mode 100644 index 903a8dc73..000000000 --- a/vendor/github.com/pelletier/go-toml/query/query_test.go +++ /dev/null @@ -1,157 +0,0 @@ -package query - -import ( - "fmt" - "testing" - - "github.com/pelletier/go-toml" -) - -func assertArrayContainsInAnyOrder(t *testing.T, array []interface{}, objects ...interface{}) { - if len(array) != len(objects) { - t.Fatalf("array contains %d objects but %d are expected", len(array), len(objects)) - } - - for _, o := range objects { - found := false - for _, a := range array { - if a == o { - found = true - break - } - } - if !found { - t.Fatal(o, "not found in array", array) - } - } -} - -func TestQueryExample(t *testing.T) { - config, _ := toml.Load(` - [[book]] - title = "The Stand" - author = "Stephen King" - [[book]] - title = "For Whom the Bell Tolls" - author = "Ernest Hemmingway" - [[book]] - title = "Neuromancer" - author = "William Gibson" - `) - authors, err := CompileAndExecute("$.book.author", config) - if err != nil { - t.Fatal("unexpected error:", err) - } - names := authors.Values() - if len(names) != 3 { - t.Fatalf("query should return 3 names but returned %d", len(names)) - } - assertArrayContainsInAnyOrder(t, names, "Stephen King", "Ernest Hemmingway", "William Gibson") -} - -func TestQueryReadmeExample(t *testing.T) { - config, _ := toml.Load(` -[postgres] -user = "pelletier" -password = "mypassword" -`) - - query, err := Compile("$..[user,password]") - if err != nil { - t.Fatal("unexpected error:", err) - } - results := query.Execute(config) - values := results.Values() - if len(values) != 2 { - t.Fatalf("query should return 2 values but returned %d", len(values)) - } - assertArrayContainsInAnyOrder(t, values, "pelletier", "mypassword") -} - -func TestQueryPathNotPresent(t *testing.T) { - config, _ := toml.Load(`a = "hello"`) - query, err := Compile("$.foo.bar") - if err != nil { - t.Fatal("unexpected error:", err) - } - results := query.Execute(config) - if err != nil { - t.Fatalf("err should be nil. got %s instead", err) - } - if len(results.items) != 0 { - t.Fatalf("no items should be matched. %d matched instead", len(results.items)) - } -} - -func ExampleNodeFilterFn_filterExample() { - tree, _ := toml.Load(` - [struct_one] - foo = "foo" - bar = "bar" - - [struct_two] - baz = "baz" - gorf = "gorf" - `) - - // create a query that references a user-defined-filter - query, _ := Compile("$[?(bazOnly)]") - - // define the filter, and assign it to the query - query.SetFilter("bazOnly", func(node interface{}) bool { - if tree, ok := node.(*toml.Tree); ok { - return tree.Has("baz") - } - return false // reject all other node types - }) - - // results contain only the 'struct_two' Tree - query.Execute(tree) -} - -func ExampleQuery_queryExample() { - config, _ := toml.Load(` - [[book]] - title = "The Stand" - author = "Stephen King" - [[book]] - title = "For Whom the Bell Tolls" - author = "Ernest Hemmingway" - [[book]] - title = "Neuromancer" - author = "William Gibson" - `) - - // find and print all the authors in the document - query, _ := Compile("$.book.author") - authors := query.Execute(config) - for _, name := range authors.Values() { - fmt.Println(name) - } -} - -func TestTomlQuery(t *testing.T) { - tree, err := toml.Load("[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6") - if err != nil { - t.Error(err) - return - } - query, err := Compile("$.foo.bar") - if err != nil { - t.Error(err) - return - } - result := query.Execute(tree) - values := result.Values() - if len(values) != 1 { - t.Errorf("Expected resultset of 1, got %d instead: %v", len(values), values) - } - - if tt, ok := values[0].(*toml.Tree); !ok { - t.Errorf("Expected type of Tree: %T", values[0]) - } else if tt.Get("a") != int64(1) { - t.Errorf("Expected 'a' with a value 1: %v", tt.Get("a")) - } else if tt.Get("b") != int64(2) { - t.Errorf("Expected 'b' with a value 2: %v", tt.Get("b")) - } -} diff --git a/vendor/github.com/pelletier/go-toml/query/tokens.go b/vendor/github.com/pelletier/go-toml/query/tokens.go deleted file mode 100644 index 429e289ab..000000000 --- a/vendor/github.com/pelletier/go-toml/query/tokens.go +++ /dev/null @@ -1,107 +0,0 @@ -package query - -import ( -"fmt" -"strconv" -"unicode" - "github.com/pelletier/go-toml" -) - -// Define tokens -type tokenType int - -const ( - eof = -(iota + 1) -) - -const ( - tokenError tokenType = iota - tokenEOF - tokenKey - tokenString - tokenInteger - tokenFloat - tokenLeftBracket - tokenRightBracket - tokenLeftParen - tokenRightParen - tokenComma - tokenColon - tokenDollar - tokenStar - tokenQuestion - tokenDot - tokenDotDot -) - -var tokenTypeNames = []string{ - "Error", - "EOF", - "Key", - "String", - "Integer", - "Float", - "[", - "]", - "(", - ")", - ",", - ":", - "$", - "*", - "?", - ".", - "..", -} - -type token struct { - toml.Position - typ tokenType - val string -} - -func (tt tokenType) String() string { - idx := int(tt) - if idx < len(tokenTypeNames) { - return tokenTypeNames[idx] - } - return "Unknown" -} - -func (t token) Int() int { - if result, err := strconv.Atoi(t.val); err != nil { - panic(err) - } else { - return result - } -} - -func (t token) String() string { - switch t.typ { - case tokenEOF: - return "EOF" - case tokenError: - return t.val - } - - return fmt.Sprintf("%q", t.val) -} - -func isSpace(r rune) bool { - return r == ' ' || r == '\t' -} - -func isAlphanumeric(r rune) bool { - return unicode.IsLetter(r) || r == '_' -} - -func isDigit(r rune) bool { - return unicode.IsNumber(r) -} - -func isHexDigit(r rune) bool { - return isDigit(r) || - (r >= 'a' && r <= 'f') || - (r >= 'A' && r <= 'F') -} - diff --git a/vendor/github.com/spf13/afero/sftpfs/file.go b/vendor/github.com/spf13/afero/sftpfs/file.go deleted file mode 100644 index e4ccb55c0..000000000 --- a/vendor/github.com/spf13/afero/sftpfs/file.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright © 2015 Jerry Jacobs . -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package sftpfs - -import ( - "github.com/pkg/sftp" - "os" -) - -type File struct { - fd *sftp.File -} - -func FileOpen(s *sftp.Client, name string) (*File, error) { - fd, err := s.Open(name) - if err != nil { - return &File{}, err - } - return &File{fd: fd}, nil -} - -func FileCreate(s *sftp.Client, name string) (*File, error) { - fd, err := s.Create(name) - if err != nil { - return &File{}, err - } - return &File{fd: fd}, nil -} - -func (f *File) Close() error { - return f.fd.Close() -} - -func (f *File) Name() string { - return f.fd.Name() -} - -func (f *File) Stat() (os.FileInfo, error) { - return f.fd.Stat() -} - -func (f *File) Sync() error { - return nil -} - -func (f *File) Truncate(size int64) error { - return f.fd.Truncate(size) -} - -func (f *File) Read(b []byte) (n int, err error) { - return f.fd.Read(b) -} - -// TODO -func (f *File) ReadAt(b []byte, off int64) (n int, err error) { - return 0, nil -} - -// TODO -func (f *File) Readdir(count int) (res []os.FileInfo, err error) { - return nil, nil -} - -// TODO -func (f *File) Readdirnames(n int) (names []string, err error) { - return nil, nil -} - -func (f *File) Seek(offset int64, whence int) (int64, error) { - return f.fd.Seek(offset, whence) -} - -func (f *File) Write(b []byte) (n int, err error) { - return f.fd.Write(b) -} - -// TODO -func (f *File) WriteAt(b []byte, off int64) (n int, err error) { - return 0, nil -} - -func (f *File) WriteString(s string) (ret int, err error) { - return f.fd.Write([]byte(s)) -} diff --git a/vendor/github.com/spf13/afero/sftpfs/sftp.go b/vendor/github.com/spf13/afero/sftpfs/sftp.go deleted file mode 100644 index 28721da76..000000000 --- a/vendor/github.com/spf13/afero/sftpfs/sftp.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright © 2015 Jerry Jacobs . -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package sftpfs - -import ( - "os" - "time" - - "github.com/pkg/sftp" - "github.com/spf13/afero" -) - -// Fs is a afero.Fs implementation that uses functions provided by the sftp package. -// -// For details in any method, check the documentation of the sftp package -// (github.com/pkg/sftp). -type Fs struct { - client *sftp.Client -} - -func New(client *sftp.Client) afero.Fs { - return &Fs{client: client} -} - -func (s Fs) Name() string { return "sftpfs" } - -func (s Fs) Create(name string) (afero.File, error) { - return FileCreate(s.client, name) -} - -func (s Fs) Mkdir(name string, perm os.FileMode) error { - err := s.client.Mkdir(name) - if err != nil { - return err - } - return s.client.Chmod(name, perm) -} - -func (s Fs) MkdirAll(path string, perm os.FileMode) error { - // Fast path: if we can tell whether path is a directory or file, stop with success or error. - dir, err := s.Stat(path) - if err == nil { - if dir.IsDir() { - return nil - } - return err - } - - // Slow path: make sure parent exists and then call Mkdir for path. - i := len(path) - for i > 0 && os.IsPathSeparator(path[i-1]) { // Skip trailing path separator. - i-- - } - - j := i - for j > 0 && !os.IsPathSeparator(path[j-1]) { // Scan backward over element. - j-- - } - - if j > 1 { - // Create parent - err = s.MkdirAll(path[0:j-1], perm) - if err != nil { - return err - } - } - - // Parent now exists; invoke Mkdir and use its result. - err = s.Mkdir(path, perm) - if err != nil { - // Handle arguments like "foo/." by - // double-checking that directory doesn't exist. - dir, err1 := s.Lstat(path) - if err1 == nil && dir.IsDir() { - return nil - } - return err - } - return nil -} - -func (s Fs) Open(name string) (afero.File, error) { - return FileOpen(s.client, name) -} - -func (s Fs) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) { - return nil, nil -} - -func (s Fs) Remove(name string) error { - return s.client.Remove(name) -} - -func (s Fs) RemoveAll(path string) error { - // TODO have a look at os.RemoveAll - // https://github.com/golang/go/blob/master/src/os/path.go#L66 - return nil -} - -func (s Fs) Rename(oldname, newname string) error { - return s.client.Rename(oldname, newname) -} - -func (s Fs) Stat(name string) (os.FileInfo, error) { - return s.client.Stat(name) -} - -func (s Fs) Lstat(p string) (os.FileInfo, error) { - return s.client.Lstat(p) -} - -func (s Fs) Chmod(name string, mode os.FileMode) error { - return s.client.Chmod(name, mode) -} - -func (s Fs) Chtimes(name string, atime time.Time, mtime time.Time) error { - return s.client.Chtimes(name, atime, mtime) -} diff --git a/vendor/github.com/spf13/afero/sftpfs/sftp_test_go b/vendor/github.com/spf13/afero/sftpfs/sftp_test_go deleted file mode 100644 index bb00535d8..000000000 --- a/vendor/github.com/spf13/afero/sftpfs/sftp_test_go +++ /dev/null @@ -1,286 +0,0 @@ -// Copyright © 2015 Jerry Jacobs . -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package afero - -import ( - "testing" - "os" - "log" - "fmt" - "net" - "flag" - "time" - "io/ioutil" - "crypto/rsa" - _rand "crypto/rand" - "encoding/pem" - "crypto/x509" - - "golang.org/x/crypto/ssh" - "github.com/pkg/sftp" -) - -type SftpFsContext struct { - sshc *ssh.Client - sshcfg *ssh.ClientConfig - sftpc *sftp.Client -} - -// TODO we only connect with hardcoded user+pass for now -// it should be possible to use $HOME/.ssh/id_rsa to login into the stub sftp server -func SftpConnect(user, password, host string) (*SftpFsContext, error) { -/* - pemBytes, err := ioutil.ReadFile(os.Getenv("HOME") + "/.ssh/id_rsa") - if err != nil { - return nil,err - } - - signer, err := ssh.ParsePrivateKey(pemBytes) - if err != nil { - return nil,err - } - - sshcfg := &ssh.ClientConfig{ - User: user, - Auth: []ssh.AuthMethod{ - ssh.Password(password), - ssh.PublicKeys(signer), - }, - } -*/ - - sshcfg := &ssh.ClientConfig{ - User: user, - Auth: []ssh.AuthMethod{ - ssh.Password(password), - }, - } - - sshc, err := ssh.Dial("tcp", host, sshcfg) - if err != nil { - return nil,err - } - - sftpc, err := sftp.NewClient(sshc) - if err != nil { - return nil,err - } - - ctx := &SftpFsContext{ - sshc: sshc, - sshcfg: sshcfg, - sftpc: sftpc, - } - - return ctx,nil -} - -func (ctx *SftpFsContext) Disconnect() error { - ctx.sftpc.Close() - ctx.sshc.Close() - return nil -} - -// TODO for such a weird reason rootpath is "." when writing "file1" with afero sftp backend -func RunSftpServer(rootpath string) { - var ( - readOnly bool - debugLevelStr string - debugLevel int - debugStderr bool - rootDir string - ) - - flag.BoolVar(&readOnly, "R", false, "read-only server") - flag.BoolVar(&debugStderr, "e", true, "debug to stderr") - flag.StringVar(&debugLevelStr, "l", "none", "debug level") - flag.StringVar(&rootDir, "root", rootpath, "root directory") - flag.Parse() - - debugStream := ioutil.Discard - if debugStderr { - debugStream = os.Stderr - debugLevel = 1 - } - - // An SSH server is represented by a ServerConfig, which holds - // certificate details and handles authentication of ServerConns. - config := &ssh.ServerConfig{ - PasswordCallback: func(c ssh.ConnMetadata, pass []byte) (*ssh.Permissions, error) { - // Should use constant-time compare (or better, salt+hash) in - // a production setting. - fmt.Fprintf(debugStream, "Login: %s\n", c.User()) - if c.User() == "test" && string(pass) == "test" { - return nil, nil - } - return nil, fmt.Errorf("password rejected for %q", c.User()) - }, - } - - privateBytes, err := ioutil.ReadFile("./test/id_rsa") - if err != nil { - log.Fatal("Failed to load private key", err) - } - - private, err := ssh.ParsePrivateKey(privateBytes) - if err != nil { - log.Fatal("Failed to parse private key", err) - } - - config.AddHostKey(private) - - // Once a ServerConfig has been configured, connections can be - // accepted. - listener, err := net.Listen("tcp", "0.0.0.0:2022") - if err != nil { - log.Fatal("failed to listen for connection", err) - } - fmt.Printf("Listening on %v\n", listener.Addr()) - - nConn, err := listener.Accept() - if err != nil { - log.Fatal("failed to accept incoming connection", err) - } - - // Before use, a handshake must be performed on the incoming - // net.Conn. - _, chans, reqs, err := ssh.NewServerConn(nConn, config) - if err != nil { - log.Fatal("failed to handshake", err) - } - fmt.Fprintf(debugStream, "SSH server established\n") - - // The incoming Request channel must be serviced. - go ssh.DiscardRequests(reqs) - - // Service the incoming Channel channel. - for newChannel := range chans { - // Channels have a type, depending on the application level - // protocol intended. In the case of an SFTP session, this is "subsystem" - // with a payload string of "sftp" - fmt.Fprintf(debugStream, "Incoming channel: %s\n", newChannel.ChannelType()) - if newChannel.ChannelType() != "session" { - newChannel.Reject(ssh.UnknownChannelType, "unknown channel type") - fmt.Fprintf(debugStream, "Unknown channel type: %s\n", newChannel.ChannelType()) - continue - } - channel, requests, err := newChannel.Accept() - if err != nil { - log.Fatal("could not accept channel.", err) - } - fmt.Fprintf(debugStream, "Channel accepted\n") - - // Sessions have out-of-band requests such as "shell", - // "pty-req" and "env". Here we handle only the - // "subsystem" request. - go func(in <-chan *ssh.Request) { - for req := range in { - fmt.Fprintf(debugStream, "Request: %v\n", req.Type) - ok := false - switch req.Type { - case "subsystem": - fmt.Fprintf(debugStream, "Subsystem: %s\n", req.Payload[4:]) - if string(req.Payload[4:]) == "sftp" { - ok = true - } - } - fmt.Fprintf(debugStream, " - accepted: %v\n", ok) - req.Reply(ok, nil) - } - }(requests) - - server, err := sftp.NewServer(channel, channel, debugStream, debugLevel, readOnly, rootpath) - if err != nil { - log.Fatal(err) - } - if err := server.Serve(); err != nil { - log.Fatal("sftp server completed with error:", err) - } - } -} - -// MakeSSHKeyPair make a pair of public and private keys for SSH access. -// Public key is encoded in the format for inclusion in an OpenSSH authorized_keys file. -// Private Key generated is PEM encoded -func MakeSSHKeyPair(bits int, pubKeyPath, privateKeyPath string) error { - privateKey, err := rsa.GenerateKey(_rand.Reader, bits) - if err != nil { - return err - } - - // generate and write private key as PEM - privateKeyFile, err := os.Create(privateKeyPath) - defer privateKeyFile.Close() - if err != nil { - return err - } - - privateKeyPEM := &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)} - if err := pem.Encode(privateKeyFile, privateKeyPEM); err != nil { - return err - } - - // generate and write public key - pub, err := ssh.NewPublicKey(&privateKey.PublicKey) - if err != nil { - return err - } - - return ioutil.WriteFile(pubKeyPath, ssh.MarshalAuthorizedKey(pub), 0655) -} - -func TestSftpCreate(t *testing.T) { - os.Mkdir("./test", 0777) - MakeSSHKeyPair(1024, "./test/id_rsa.pub", "./test/id_rsa") - - go RunSftpServer("./test/") - time.Sleep(5 * time.Second) - - ctx, err := SftpConnect("test", "test", "localhost:2022") - if err != nil { - t.Fatal(err) - } - defer ctx.Disconnect() - - var AppFs Fs = SftpFs{ - SftpClient: ctx.sftpc, - } - - AppFs.MkdirAll("test/dir1/dir2/dir3", os.FileMode(0777)) - AppFs.Mkdir("test/foo", os.FileMode(0000)) - AppFs.Chmod("test/foo", os.FileMode(0700)) - AppFs.Mkdir("test/bar", os.FileMode(0777)) - - file, err := AppFs.Create("file1") - if err != nil { - t.Error(err) - } - defer file.Close() - - file.Write([]byte("hello\t")) - file.WriteString("world!\n") - - f1, err := AppFs.Open("file1") - if err != nil { - log.Fatalf("open: %v", err) - } - defer f1.Close() - - b := make([]byte, 100) - - _, err = f1.Read(b) - fmt.Println(string(b)) - - // TODO check here if "hello\tworld\n" is in buffer b -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/add.go b/vendor/github.com/spf13/cobra/cobra/cmd/add.go deleted file mode 100644 index 993ae16f0..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/add.go +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cmd - -import ( - "fmt" - "os" - "path/filepath" - "unicode" - - "github.com/spf13/cobra" -) - -func init() { - addCmd.Flags().StringVarP(&packageName, "package", "t", "", "target package name (e.g. github.com/spf13/hugo)") - addCmd.Flags().StringVarP(&parentName, "parent", "p", "RootCmd", "variable name of parent command for this command") -} - -var packageName, parentName string - -var addCmd = &cobra.Command{ - Use: "add [command name]", - Aliases: []string{"command"}, - Short: "Add a command to a Cobra Application", - Long: `Add (cobra add) will create a new command, with a license and -the appropriate structure for a Cobra-based CLI application, -and register it to its parent (default RootCmd). - -If you want your command to be public, pass in the command name -with an initial uppercase letter. - -Example: cobra add server -> resulting in a new cmd/server.go`, - - Run: func(cmd *cobra.Command, args []string) { - if len(args) < 1 { - er("add needs a name for the command") - } - - var project *Project - if packageName != "" { - project = NewProject(packageName) - } else { - wd, err := os.Getwd() - if err != nil { - er(err) - } - project = NewProjectFromPath(wd) - } - - cmdName := validateCmdName(args[0]) - cmdPath := filepath.Join(project.CmdPath(), cmdName+".go") - createCmdFile(project.License(), cmdPath, cmdName) - - fmt.Fprintln(cmd.OutOrStdout(), cmdName, "created at", cmdPath) - }, -} - -// validateCmdName returns source without any dashes and underscore. -// If there will be dash or underscore, next letter will be uppered. -// It supports only ASCII (1-byte character) strings. -// https://github.com/spf13/cobra/issues/269 -func validateCmdName(source string) string { - i := 0 - l := len(source) - // The output is initialized on demand, then first dash or underscore - // occurs. - var output string - - for i < l { - if source[i] == '-' || source[i] == '_' { - if output == "" { - output = source[:i] - } - - // If it's last rune and it's dash or underscore, - // don't add it output and break the loop. - if i == l-1 { - break - } - - // If next character is dash or underscore, - // just skip the current character. - if source[i+1] == '-' || source[i+1] == '_' { - i++ - continue - } - - // If the current character is dash or underscore, - // upper next letter and add to output. - output += string(unicode.ToUpper(rune(source[i+1]))) - // We know, what source[i] is dash or underscore and source[i+1] is - // uppered character, so make i = i+2. - i += 2 - continue - } - - // If the current character isn't dash or underscore, - // just add it. - if output != "" { - output += string(source[i]) - } - i++ - } - - if output == "" { - return source // source is initially valid name. - } - return output -} - -func createCmdFile(license License, path, cmdName string) { - template := `{{comment .copyright}} -{{if .license}}{{comment .license}}{{end}} - -package {{.cmdPackage}} - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -// {{.cmdName}}Cmd represents the {{.cmdName}} command -var {{.cmdName}}Cmd = &cobra.Command{ - Use: "{{.cmdName}}", - Short: "A brief description of your command", - Long: ` + "`" + `A longer description that spans multiple lines and likely contains examples -and usage of using your command. For example: - -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.` + "`" + `, - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("{{.cmdName}} called") - }, -} - -func init() { - {{.parentName}}.AddCommand({{.cmdName}}Cmd) - - // Here you will define your flags and configuration settings. - - // Cobra supports Persistent Flags which will work for this command - // and all subcommands, e.g.: - // {{.cmdName}}Cmd.PersistentFlags().String("foo", "", "A help for foo") - - // Cobra supports local flags which will only run when this command - // is called directly, e.g.: - // {{.cmdName}}Cmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") -} -` - - data := make(map[string]interface{}) - data["copyright"] = copyrightLine() - data["license"] = license.Header - data["cmdPackage"] = filepath.Base(filepath.Dir(path)) // last dir of path - data["parentName"] = parentName - data["cmdName"] = cmdName - - cmdScript, err := executeTemplate(template, data) - if err != nil { - er(err) - } - err = writeStringToFile(path, cmdScript) - if err != nil { - er(err) - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/add_test.go b/vendor/github.com/spf13/cobra/cobra/cmd/add_test.go deleted file mode 100644 index b920e2b9d..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/add_test.go +++ /dev/null @@ -1,109 +0,0 @@ -package cmd - -import ( - "errors" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/spf13/viper" -) - -// TestGoldenAddCmd initializes the project "github.com/spf13/testproject" -// in GOPATH, adds "test" command -// and compares the content of all files in cmd directory of testproject -// with appropriate golden files. -// Use -update to update existing golden files. -func TestGoldenAddCmd(t *testing.T) { - projectName := "github.com/spf13/testproject" - project := NewProject(projectName) - defer os.RemoveAll(project.AbsPath()) - - viper.Set("author", "NAME HERE ") - viper.Set("license", "apache") - viper.Set("year", 2017) - defer viper.Set("author", nil) - defer viper.Set("license", nil) - defer viper.Set("year", nil) - - // Initialize the project first. - initializeProject(project) - - // Then add the "test" command. - cmdName := "test" - cmdPath := filepath.Join(project.CmdPath(), cmdName+".go") - createCmdFile(project.License(), cmdPath, cmdName) - - expectedFiles := []string{".", "root.go", "test.go"} - gotFiles := []string{} - - // Check project file hierarchy and compare the content of every single file - // with appropriate golden file. - err := filepath.Walk(project.CmdPath(), func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - // Make path relative to project.CmdPath(). - // E.g. path = "/home/user/go/src/github.com/spf13/testproject/cmd/root.go" - // then it returns just "root.go". - relPath, err := filepath.Rel(project.CmdPath(), path) - if err != nil { - return err - } - relPath = filepath.ToSlash(relPath) - gotFiles = append(gotFiles, relPath) - goldenPath := filepath.Join("testdata", filepath.Base(path)+".golden") - - switch relPath { - // Known directories. - case ".": - return nil - // Known files. - case "root.go", "test.go": - if *update { - got, err := ioutil.ReadFile(path) - if err != nil { - return err - } - ioutil.WriteFile(goldenPath, got, 0644) - } - return compareFiles(path, goldenPath) - } - // Unknown file. - return errors.New("unknown file: " + path) - }) - if err != nil { - t.Fatal(err) - } - - // Check if some files lack. - if err := checkLackFiles(expectedFiles, gotFiles); err != nil { - t.Fatal(err) - } -} - -func TestValidateCmdName(t *testing.T) { - testCases := []struct { - input string - expected string - }{ - {"cmdName", "cmdName"}, - {"cmd_name", "cmdName"}, - {"cmd-name", "cmdName"}, - {"cmd______Name", "cmdName"}, - {"cmd------Name", "cmdName"}, - {"cmd______name", "cmdName"}, - {"cmd------name", "cmdName"}, - {"cmdName-----", "cmdName"}, - {"cmdname-", "cmdname"}, - } - - for _, testCase := range testCases { - got := validateCmdName(testCase.input) - if testCase.expected != got { - t.Errorf("Expected %q, got %q", testCase.expected, got) - } - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/golden_test.go b/vendor/github.com/spf13/cobra/cobra/cmd/golden_test.go deleted file mode 100644 index 59a5a1c9f..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/golden_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package cmd - -import ( - "bytes" - "errors" - "flag" - "fmt" - "io/ioutil" - "os/exec" -) - -var update = flag.Bool("update", false, "update .golden files") - -func init() { - // Mute commands. - addCmd.SetOutput(new(bytes.Buffer)) - initCmd.SetOutput(new(bytes.Buffer)) -} - -// compareFiles compares the content of files with pathA and pathB. -// If contents are equal, it returns nil. -// If not, it returns which files are not equal -// and diff (if system has diff command) between these files. -func compareFiles(pathA, pathB string) error { - contentA, err := ioutil.ReadFile(pathA) - if err != nil { - return err - } - contentB, err := ioutil.ReadFile(pathB) - if err != nil { - return err - } - if !bytes.Equal(contentA, contentB) { - output := new(bytes.Buffer) - output.WriteString(fmt.Sprintf("%q and %q are not equal!\n\n", pathA, pathB)) - - diffPath, err := exec.LookPath("diff") - if err != nil { - // Don't execute diff if it can't be found. - return nil - } - diffCmd := exec.Command(diffPath, "-u", pathA, pathB) - diffCmd.Stdout = output - diffCmd.Stderr = output - - output.WriteString("$ diff -u " + pathA + " " + pathB + "\n") - if err := diffCmd.Run(); err != nil { - output.WriteString("\n" + err.Error()) - } - return errors.New(output.String()) - } - return nil -} - -// checkLackFiles checks if all elements of expected are in got. -func checkLackFiles(expected, got []string) error { - lacks := make([]string, 0, len(expected)) - for _, ev := range expected { - if !stringInStringSlice(ev, got) { - lacks = append(lacks, ev) - } - } - if len(lacks) > 0 { - return fmt.Errorf("Lack %v file(s): %v", len(lacks), lacks) - } - return nil -} - -// stringInStringSlice checks if s is an element of slice. -func stringInStringSlice(s string, slice []string) bool { - for _, v := range slice { - if s == v { - return true - } - } - return false -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/helpers.go b/vendor/github.com/spf13/cobra/cobra/cmd/helpers.go deleted file mode 100644 index c5e261ce3..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/helpers.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cmd - -import ( - "bytes" - "fmt" - "io" - "os" - "path/filepath" - "strings" - "text/template" -) - -var cmdDirs = [...]string{"cmd", "cmds", "command", "commands"} -var srcPaths []string - -func init() { - // Initialize srcPaths. - envGoPath := os.Getenv("GOPATH") - goPaths := filepath.SplitList(envGoPath) - if len(goPaths) == 0 { - er("$GOPATH is not set") - } - srcPaths = make([]string, 0, len(goPaths)) - for _, goPath := range goPaths { - srcPaths = append(srcPaths, filepath.Join(goPath, "src")) - } -} - -func er(msg interface{}) { - fmt.Println("Error:", msg) - os.Exit(1) -} - -// isEmpty checks if a given path is empty. -// Hidden files in path are ignored. -func isEmpty(path string) bool { - fi, err := os.Stat(path) - if err != nil { - er(err) - } - - if !fi.IsDir() { - return fi.Size() == 0 - } - - f, err := os.Open(path) - if err != nil { - er(err) - } - defer f.Close() - - names, err := f.Readdirnames(-1) - if err != nil && err != io.EOF { - er(err) - } - - for _, name := range names { - if len(name) > 0 && name[0] != '.' { - return false - } - } - return true -} - -// exists checks if a file or directory exists. -func exists(path string) bool { - if path == "" { - return false - } - _, err := os.Stat(path) - if err == nil { - return true - } - if !os.IsNotExist(err) { - er(err) - } - return false -} - -func executeTemplate(tmplStr string, data interface{}) (string, error) { - tmpl, err := template.New("").Funcs(template.FuncMap{"comment": commentifyString}).Parse(tmplStr) - if err != nil { - return "", err - } - - buf := new(bytes.Buffer) - err = tmpl.Execute(buf, data) - return buf.String(), err -} - -func writeStringToFile(path string, s string) error { - return writeToFile(path, strings.NewReader(s)) -} - -// writeToFile writes r to file with path only -// if file/directory on given path doesn't exist. -// If file/directory exists on given path, then -// it terminates app and prints an appropriate error. -func writeToFile(path string, r io.Reader) error { - if exists(path) { - return fmt.Errorf("%v already exists", path) - } - - dir := filepath.Dir(path) - if dir != "" { - if err := os.MkdirAll(dir, 0777); err != nil { - return err - } - } - - file, err := os.Create(path) - if err != nil { - return err - } - defer file.Close() - - _, err = io.Copy(file, r) - return err -} - -// commentfyString comments every line of in. -func commentifyString(in string) string { - var newlines []string - lines := strings.Split(in, "\n") - for _, line := range lines { - if strings.HasPrefix(line, "//") { - newlines = append(newlines, line) - } else { - if line == "" { - newlines = append(newlines, "//") - } else { - newlines = append(newlines, "// "+line) - } - } - } - return strings.Join(newlines, "\n") -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/init.go b/vendor/github.com/spf13/cobra/cobra/cmd/init.go deleted file mode 100644 index 149aabe1f..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/init.go +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cmd - -import ( - "fmt" - "os" - "path" - "path/filepath" - - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -var initCmd = &cobra.Command{ - Use: "init [name]", - Aliases: []string{"initialize", "initialise", "create"}, - Short: "Initialize a Cobra Application", - Long: `Initialize (cobra init) will create a new application, with a license -and the appropriate structure for a Cobra-based CLI application. - - * If a name is provided, it will be created in the current directory; - * If no name is provided, the current directory will be assumed; - * If a relative path is provided, it will be created inside $GOPATH - (e.g. github.com/spf13/hugo); - * If an absolute path is provided, it will be created; - * If the directory already exists but is empty, it will be used. - -Init will not use an existing directory with contents.`, - - Run: func(cmd *cobra.Command, args []string) { - wd, err := os.Getwd() - if err != nil { - er(err) - } - - var project *Project - if len(args) == 0 { - project = NewProjectFromPath(wd) - } else if len(args) == 1 { - arg := args[0] - if arg[0] == '.' { - arg = filepath.Join(wd, arg) - } - if filepath.IsAbs(arg) { - project = NewProjectFromPath(arg) - } else { - project = NewProject(arg) - } - } else { - er("please provide only one argument") - } - - initializeProject(project) - - fmt.Fprintln(cmd.OutOrStdout(), `Your Cobra application is ready at -`+project.AbsPath()+`. - -Give it a try by going there and running `+"`go run main.go`."+` -Add commands to it by running `+"`cobra add [cmdname]`.") - }, -} - -func initializeProject(project *Project) { - if !exists(project.AbsPath()) { // If path doesn't yet exist, create it - err := os.MkdirAll(project.AbsPath(), os.ModePerm) - if err != nil { - er(err) - } - } else if !isEmpty(project.AbsPath()) { // If path exists and is not empty don't use it - er("Cobra will not create a new project in a non empty directory: " + project.AbsPath()) - } - - // We have a directory and it's empty. Time to initialize it. - createLicenseFile(project.License(), project.AbsPath()) - createMainFile(project) - createRootCmdFile(project) -} - -func createLicenseFile(license License, path string) { - data := make(map[string]interface{}) - data["copyright"] = copyrightLine() - - // Generate license template from text and data. - text, err := executeTemplate(license.Text, data) - if err != nil { - er(err) - } - - // Write license text to LICENSE file. - err = writeStringToFile(filepath.Join(path, "LICENSE"), text) - if err != nil { - er(err) - } -} - -func createMainFile(project *Project) { - mainTemplate := `{{ comment .copyright }} -{{if .license}}{{ comment .license }}{{end}} - -package main - -import "{{ .importpath }}" - -func main() { - cmd.Execute() -} -` - data := make(map[string]interface{}) - data["copyright"] = copyrightLine() - data["license"] = project.License().Header - data["importpath"] = path.Join(project.Name(), filepath.Base(project.CmdPath())) - - mainScript, err := executeTemplate(mainTemplate, data) - if err != nil { - er(err) - } - - err = writeStringToFile(filepath.Join(project.AbsPath(), "main.go"), mainScript) - if err != nil { - er(err) - } -} - -func createRootCmdFile(project *Project) { - template := `{{comment .copyright}} -{{if .license}}{{comment .license}}{{end}} - -package cmd - -import ( - "fmt" - "os" -{{if .viper}} - homedir "github.com/mitchellh/go-homedir"{{end}} - "github.com/spf13/cobra"{{if .viper}} - "github.com/spf13/viper"{{end}} -){{if .viper}} - -var cfgFile string{{end}} - -// RootCmd represents the base command when called without any subcommands -var RootCmd = &cobra.Command{ - Use: "{{.appName}}", - Short: "A brief description of your application", - Long: ` + "`" + `A longer description that spans multiple lines and likely contains -examples and usage of using your application. For example: - -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.` + "`" + `, - // Uncomment the following line if your bare application - // has an action associated with it: - // Run: func(cmd *cobra.Command, args []string) { }, -} - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - if err := RootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func init() { {{if .viper}} - cobra.OnInitialize(initConfig) -{{end}} - // Here you will define your flags and configuration settings. - // Cobra supports persistent flags, which, if defined here, - // will be global for your application.{{ if .viper }} - RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.{{ .appName }}.yaml)"){{ else }} - // RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.{{ .appName }}.yaml)"){{ end }} - - // Cobra also supports local flags, which will only run - // when this action is called directly. - RootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") -}{{ if .viper }} - -// initConfig reads in config file and ENV variables if set. -func initConfig() { - if cfgFile != "" { - // Use config file from the flag. - viper.SetConfigFile(cfgFile) - } else { - // Find home directory. - home, err := homedir.Dir() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - // Search config in home directory with name ".{{ .appName }}" (without extension). - viper.AddConfigPath(home) - viper.SetConfigName(".{{ .appName }}") - } - - viper.AutomaticEnv() // read in environment variables that match - - // If a config file is found, read it in. - if err := viper.ReadInConfig(); err == nil { - fmt.Println("Using config file:", viper.ConfigFileUsed()) - } -}{{ end }} -` - - data := make(map[string]interface{}) - data["copyright"] = copyrightLine() - data["viper"] = viper.GetBool("useViper") - data["license"] = project.License().Header - data["appName"] = path.Base(project.Name()) - - rootCmdScript, err := executeTemplate(template, data) - if err != nil { - er(err) - } - - err = writeStringToFile(filepath.Join(project.CmdPath(), "root.go"), rootCmdScript) - if err != nil { - er(err) - } - -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/init_test.go b/vendor/github.com/spf13/cobra/cobra/cmd/init_test.go deleted file mode 100644 index 40eb4038e..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/init_test.go +++ /dev/null @@ -1,83 +0,0 @@ -package cmd - -import ( - "errors" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/spf13/viper" -) - -// TestGoldenInitCmd initializes the project "github.com/spf13/testproject" -// in GOPATH and compares the content of files in initialized project with -// appropriate golden files ("testdata/*.golden"). -// Use -update to update existing golden files. -func TestGoldenInitCmd(t *testing.T) { - projectName := "github.com/spf13/testproject" - project := NewProject(projectName) - defer os.RemoveAll(project.AbsPath()) - - viper.Set("author", "NAME HERE ") - viper.Set("license", "apache") - viper.Set("year", 2017) - defer viper.Set("author", nil) - defer viper.Set("license", nil) - defer viper.Set("year", nil) - - os.Args = []string{"cobra", "init", projectName} - if err := rootCmd.Execute(); err != nil { - t.Fatal("Error by execution:", err) - } - - expectedFiles := []string{".", "cmd", "LICENSE", "main.go", "cmd/root.go"} - gotFiles := []string{} - - // Check project file hierarchy and compare the content of every single file - // with appropriate golden file. - err := filepath.Walk(project.AbsPath(), func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - // Make path relative to project.AbsPath(). - // E.g. path = "/home/user/go/src/github.com/spf13/testproject/cmd/root.go" - // then it returns just "cmd/root.go". - relPath, err := filepath.Rel(project.AbsPath(), path) - if err != nil { - return err - } - relPath = filepath.ToSlash(relPath) - gotFiles = append(gotFiles, relPath) - goldenPath := filepath.Join("testdata", filepath.Base(path)+".golden") - - switch relPath { - // Known directories. - case ".", "cmd": - return nil - // Known files. - case "LICENSE", "main.go", "cmd/root.go": - if *update { - got, err := ioutil.ReadFile(path) - if err != nil { - return err - } - if err := ioutil.WriteFile(goldenPath, got, 0644); err != nil { - t.Fatal("Error while updating file:", err) - } - } - return compareFiles(path, goldenPath) - } - // Unknown file. - return errors.New("unknown file: " + path) - }) - if err != nil { - t.Fatal(err) - } - - // Check if some files lack. - if err := checkLackFiles(expectedFiles, gotFiles); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_agpl.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_agpl.go deleted file mode 100644 index bc22e9732..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_agpl.go +++ /dev/null @@ -1,683 +0,0 @@ -package cmd - -func initAgpl() { - Licenses["agpl"] = License{ - Name: "GNU Affero General Public License", - PossibleMatches: []string{"agpl", "affero gpl", "gnu agpl"}, - Header: ` -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see .`, - Text: ` GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. -`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_apache_2.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_apache_2.go deleted file mode 100644 index 38393d541..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_apache_2.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initApache2() { - Licenses["apache"] = License{ - Name: "Apache 2.0", - PossibleMatches: []string{"apache", "apache20", "apache 2.0", "apache2.0", "apache-2.0"}, - Header: ` -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.`, - Text: ` - 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/spf13/cobra/cobra/cmd/license_bsd_clause_2.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_2.go deleted file mode 100644 index 4a847e04a..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_2.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initBsdClause2() { - Licenses["freebsd"] = License{ - Name: "Simplified BSD License", - PossibleMatches: []string{"freebsd", "simpbsd", "simple bsd", "2-clause bsd", - "2 clause bsd", "simplified bsd license"}, - Header: `All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. 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.`, - Text: `{{ .copyright }} -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. 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/spf13/cobra/cobra/cmd/license_bsd_clause_3.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_3.go deleted file mode 100644 index c7476b31f..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_3.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initBsdClause3() { - Licenses["bsd"] = License{ - Name: "NewBSD", - PossibleMatches: []string{"bsd", "newbsd", "3 clause bsd", "3-clause bsd"}, - Header: `All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder 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 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.`, - Text: `{{ .copyright }} -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder 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 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/spf13/cobra/cobra/cmd/license_gpl_2.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_2.go deleted file mode 100644 index 03e05b3a7..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_2.go +++ /dev/null @@ -1,376 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initGpl2() { - Licenses["gpl2"] = License{ - Name: "GNU General Public License 2.0", - PossibleMatches: []string{"gpl2", "gnu gpl2", "gplv2"}, - Header: ` -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with this program. If not, see .`, - Text: ` GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type 'show c' for details. - -The hypothetical commands 'show w' and 'show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than 'show w' and 'show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - 'Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. -`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_3.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_3.go deleted file mode 100644 index ce07679c7..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_3.go +++ /dev/null @@ -1,711 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initGpl3() { - Licenses["gpl3"] = License{ - Name: "GNU General Public License 3.0", - PossibleMatches: []string{"gpl3", "gplv3", "gpl", "gnu gpl3", "gnu gpl"}, - Header: ` -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see .`, - Text: ` GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type 'show c' for details. - -The hypothetical commands 'show w' and 'show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. -`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_lgpl.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_lgpl.go deleted file mode 100644 index 0f8b96cad..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_lgpl.go +++ /dev/null @@ -1,186 +0,0 @@ -package cmd - -func initLgpl() { - Licenses["lgpl"] = License{ - Name: "GNU Lesser General Public License", - PossibleMatches: []string{"lgpl", "lesser gpl", "gnu lgpl"}, - Header: ` -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with this program. If not, see .`, - Text: ` GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library.`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_mit.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_mit.go deleted file mode 100644 index bd2d0c4fa..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_mit.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initMit() { - Licenses["mit"] = License{ - Name: "MIT License", - PossibleMatches: []string{"mit"}, - Header: ` -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.`, - Text: `The MIT License (MIT) - -{{ .copyright }} - -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/spf13/cobra/cobra/cmd/licenses.go b/vendor/github.com/spf13/cobra/cobra/cmd/licenses.go deleted file mode 100644 index cf2a6b7af..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/licenses.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -import ( - "strings" - "time" - - "github.com/spf13/viper" -) - -// Licenses contains all possible licenses a user can choose from. -var Licenses = make(map[string]License) - -// License represents a software license agreement, containing the Name of -// the license, its possible matches (on the command line as given to cobra), -// the header to be used with each file on the file's creating, and the text -// of the license -type License struct { - Name string // The type of license in use - PossibleMatches []string // Similar names to guess - Text string // License text data - Header string // License header for source files -} - -func init() { - // Allows a user to not use a license. - Licenses["none"] = License{"None", []string{"none", "false"}, "", ""} - - initApache2() - initMit() - initBsdClause3() - initBsdClause2() - initGpl2() - initGpl3() - initLgpl() - initAgpl() -} - -// getLicense returns license specified by user in flag or in config. -// If user didn't specify the license, it returns Apache License 2.0. -// -// TODO: Inspect project for existing license -func getLicense() License { - // If explicitly flagged, use that. - if userLicense != "" { - return findLicense(userLicense) - } - - // If user wants to have custom license, use that. - if viper.IsSet("license.header") || viper.IsSet("license.text") { - return License{Header: viper.GetString("license.header"), - Text: "license.text"} - } - - // If user wants to have built-in license, use that. - if viper.IsSet("license") { - return findLicense(viper.GetString("license")) - } - - // If user didn't set any license, use Apache 2.0 by default. - return Licenses["apache"] -} - -func copyrightLine() string { - author := viper.GetString("author") - - year := viper.GetString("year") // For tests. - if year == "" { - year = time.Now().Format("2006") - } - - return "Copyright © " + year + " " + author -} - -// findLicense looks for License object of built-in licenses. -// If it didn't find license, then the app will be terminated and -// error will be printed. -func findLicense(name string) License { - found := matchLicense(name) - if found == "" { - er("unknown license: " + name) - } - return Licenses[found] -} - -// matchLicense compares the given a license name -// to PossibleMatches of all built-in licenses. -// It returns blank string, if name is blank string or it didn't find -// then appropriate match to name. -func matchLicense(name string) string { - if name == "" { - return "" - } - - for key, lic := range Licenses { - for _, match := range lic.PossibleMatches { - if strings.EqualFold(name, match) { - return key - } - } - } - - return "" -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/project.go b/vendor/github.com/spf13/cobra/cobra/cmd/project.go deleted file mode 100644 index de1168a13..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/project.go +++ /dev/null @@ -1,195 +0,0 @@ -package cmd - -import ( - "os" - "path/filepath" - "runtime" - "strings" -) - -// Project contains name, license and paths to projects. -type Project struct { - absPath string - cmdPath string - srcPath string - license License - name string -} - -// NewProject returns Project with specified project name. -// If projectName is blank string, it returns nil. -func NewProject(projectName string) *Project { - if projectName == "" { - return nil - } - - p := new(Project) - p.name = projectName - - // 1. Find already created protect. - p.absPath = findPackage(projectName) - - // 2. If there are no created project with this path, and user is in GOPATH, - // then use GOPATH/src/projectName. - if p.absPath == "" { - wd, err := os.Getwd() - if err != nil { - er(err) - } - for _, srcPath := range srcPaths { - goPath := filepath.Dir(srcPath) - if filepathHasPrefix(wd, goPath) { - p.absPath = filepath.Join(srcPath, projectName) - break - } - } - } - - // 3. If user is not in GOPATH, then use (first GOPATH)/src/projectName. - if p.absPath == "" { - p.absPath = filepath.Join(srcPaths[0], projectName) - } - - return p -} - -// findPackage returns full path to existing go package in GOPATHs. -// findPackage returns "", if it can't find path. -// If packageName is "", findPackage returns "". -func findPackage(packageName string) string { - if packageName == "" { - return "" - } - - for _, srcPath := range srcPaths { - packagePath := filepath.Join(srcPath, packageName) - if exists(packagePath) { - return packagePath - } - } - - return "" -} - -// NewProjectFromPath returns Project with specified absolute path to -// package. -// If absPath is blank string or if absPath is not actually absolute, -// it returns nil. -func NewProjectFromPath(absPath string) *Project { - if absPath == "" || !filepath.IsAbs(absPath) { - return nil - } - - p := new(Project) - p.absPath = absPath - p.absPath = strings.TrimSuffix(p.absPath, findCmdDir(p.absPath)) - p.name = filepath.ToSlash(trimSrcPath(p.absPath, p.SrcPath())) - return p -} - -// trimSrcPath trims at the beginning of absPath the srcPath. -func trimSrcPath(absPath, srcPath string) string { - relPath, err := filepath.Rel(srcPath, absPath) - if err != nil { - er("Cobra supports project only within $GOPATH: " + err.Error()) - } - return relPath -} - -// License returns the License object of project. -func (p *Project) License() License { - if p.license.Text == "" && p.license.Name != "None" { - p.license = getLicense() - } - - return p.license -} - -// Name returns the name of project, e.g. "github.com/spf13/cobra" -func (p Project) Name() string { - return p.name -} - -// CmdPath returns absolute path to directory, where all commands are located. -// -// CmdPath returns blank string, only if p.AbsPath() is a blank string. -func (p *Project) CmdPath() string { - if p.absPath == "" { - return "" - } - if p.cmdPath == "" { - p.cmdPath = filepath.Join(p.absPath, findCmdDir(p.absPath)) - } - return p.cmdPath -} - -// findCmdDir checks if base of absPath is cmd dir and returns it or -// looks for existing cmd dir in absPath. -// If the cmd dir doesn't exist, empty, or cannot be found, -// it returns "cmd". -func findCmdDir(absPath string) string { - if !exists(absPath) || isEmpty(absPath) { - return "cmd" - } - - if isCmdDir(absPath) { - return filepath.Base(absPath) - } - - files, _ := filepath.Glob(filepath.Join(absPath, "c*")) - for _, file := range files { - if isCmdDir(file) { - return filepath.Base(file) - } - } - - return "cmd" -} - -// isCmdDir checks if base of name is one of cmdDir. -func isCmdDir(name string) bool { - name = filepath.Base(name) - for _, cmdDir := range cmdDirs { - if name == cmdDir { - return true - } - } - return false -} - -// AbsPath returns absolute path of project. -func (p Project) AbsPath() string { - return p.absPath -} - -// SrcPath returns absolute path to $GOPATH/src where project is located. -func (p *Project) SrcPath() string { - if p.srcPath != "" { - return p.srcPath - } - if p.absPath == "" { - p.srcPath = srcPaths[0] - return p.srcPath - } - - for _, srcPath := range srcPaths { - if filepathHasPrefix(p.absPath, srcPath) { - p.srcPath = srcPath - break - } - } - - return p.srcPath -} - -func filepathHasPrefix(path string, prefix string) bool { - if len(path) <= len(prefix) { - return false - } - if runtime.GOOS == "windows" { - // Paths in windows are case-insensitive. - return strings.EqualFold(path[0:len(prefix)], prefix) - } - return path[0:len(prefix)] == prefix - -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/project_test.go b/vendor/github.com/spf13/cobra/cobra/cmd/project_test.go deleted file mode 100644 index 037f7c554..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/project_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package cmd - -import ( - "testing" -) - -func TestFindExistingPackage(t *testing.T) { - path := findPackage("github.com/spf13/cobra") - if path == "" { - t.Fatal("findPackage didn't find the existing package") - } - if !hasGoPathPrefix(path) { - t.Fatalf("%q is not in GOPATH, but must be", path) - } -} - -func hasGoPathPrefix(path string) bool { - for _, srcPath := range srcPaths { - if filepathHasPrefix(path, srcPath) { - return true - } - } - return false -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/root.go b/vendor/github.com/spf13/cobra/cobra/cmd/root.go deleted file mode 100644 index 19568f980..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/root.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cmd - -import ( - "fmt" - - homedir "github.com/mitchellh/go-homedir" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -var ( - // Used for flags. - cfgFile, userLicense string - - rootCmd = &cobra.Command{ - Use: "cobra", - Short: "A generator for Cobra based Applications", - Long: `Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, - } -) - -// Execute executes the root command. -func Execute() { - rootCmd.Execute() -} - -func init() { - cobra.OnInitialize(initConfig) - - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)") - rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "author name for copyright attribution") - rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "name of license for the project") - rootCmd.PersistentFlags().Bool("viper", true, "use Viper for configuration") - viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author")) - viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper")) - viper.SetDefault("author", "NAME HERE ") - viper.SetDefault("license", "apache") - - rootCmd.AddCommand(addCmd) - rootCmd.AddCommand(initCmd) -} - -func initConfig() { - if cfgFile != "" { - // Use config file from the flag. - viper.SetConfigFile(cfgFile) - } else { - // Find home directory. - home, err := homedir.Dir() - if err != nil { - er(err) - } - - // Search config in home directory with name ".cobra" (without extension). - viper.AddConfigPath(home) - viper.SetConfigName(".cobra") - } - - viper.AutomaticEnv() - - if err := viper.ReadInConfig(); err == nil { - fmt.Println("Using config file:", viper.ConfigFileUsed()) - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden b/vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden deleted file mode 100644 index d64569567..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden +++ /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/spf13/cobra/cobra/cmd/testdata/main.go.golden b/vendor/github.com/spf13/cobra/cobra/cmd/testdata/main.go.golden deleted file mode 100644 index cdbe38d70..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/testdata/main.go.golden +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright © 2017 NAME HERE -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import "github.com/spf13/testproject/cmd" - -func main() { - cmd.Execute() -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/testdata/root.go.golden b/vendor/github.com/spf13/cobra/cobra/cmd/testdata/root.go.golden deleted file mode 100644 index 8eeeae89e..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/testdata/root.go.golden +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright © 2017 NAME HERE -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cmd - -import ( - "fmt" - "os" - - homedir "github.com/mitchellh/go-homedir" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -var cfgFile string - -// RootCmd represents the base command when called without any subcommands -var RootCmd = &cobra.Command{ - Use: "testproject", - Short: "A brief description of your application", - Long: `A longer description that spans multiple lines and likely contains -examples and usage of using your application. For example: - -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, - // Uncomment the following line if your bare application - // has an action associated with it: - // Run: func(cmd *cobra.Command, args []string) { }, -} - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - if err := RootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func init() { - cobra.OnInitialize(initConfig) - - // Here you will define your flags and configuration settings. - // Cobra supports persistent flags, which, if defined here, - // will be global for your application. - RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.testproject.yaml)") - - // Cobra also supports local flags, which will only run - // when this action is called directly. - RootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") -} - -// initConfig reads in config file and ENV variables if set. -func initConfig() { - if cfgFile != "" { - // Use config file from the flag. - viper.SetConfigFile(cfgFile) - } else { - // Find home directory. - home, err := homedir.Dir() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - // Search config in home directory with name ".testproject" (without extension). - viper.AddConfigPath(home) - viper.SetConfigName(".testproject") - } - - viper.AutomaticEnv() // read in environment variables that match - - // If a config file is found, read it in. - if err := viper.ReadInConfig(); err == nil { - fmt.Println("Using config file:", viper.ConfigFileUsed()) - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/testdata/test.go.golden b/vendor/github.com/spf13/cobra/cobra/cmd/testdata/test.go.golden deleted file mode 100644 index 584056802..000000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/testdata/test.go.golden +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2017 NAME HERE -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package cmd - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -// testCmd represents the test command -var testCmd = &cobra.Command{ - Use: "test", - Short: "A brief description of your command", - Long: `A longer description that spans multiple lines and likely contains examples -and usage of using your command. For example: - -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("test called") - }, -} - -func init() { - RootCmd.AddCommand(testCmd) - - // Here you will define your flags and configuration settings. - - // Cobra supports Persistent Flags which will work for this command - // and all subcommands, e.g.: - // testCmd.PersistentFlags().String("foo", "", "A help for foo") - - // Cobra supports local flags which will only run when this command - // is called directly, e.g.: - // testCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") -} diff --git a/vendor/github.com/spf13/cobra/cobra/main.go b/vendor/github.com/spf13/cobra/cobra/main.go deleted file mode 100644 index c3a9d9cb0..000000000 --- a/vendor/github.com/spf13/cobra/cobra/main.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import "github.com/spf13/cobra/cobra/cmd" - -func main() { - cmd.Execute() -} diff --git a/vendor/github.com/spf13/cobra/doc/cmd_test.go b/vendor/github.com/spf13/cobra/doc/cmd_test.go deleted file mode 100644 index a4b5568fa..000000000 --- a/vendor/github.com/spf13/cobra/doc/cmd_test.go +++ /dev/null @@ -1,145 +0,0 @@ -package doc - -import ( - "bytes" - "fmt" - "runtime" - "strings" - "testing" - - "github.com/spf13/cobra" -) - -var flagb1, flagb2, flagb3, flagbr, flagbp bool -var flags1, flags2a, flags2b, flags3 string -var flagi1, flagi2, flagi3, flagir int - -const strtwoParentHelp = "help message for parent flag strtwo" -const strtwoChildHelp = "help message for child flag strtwo" - -var cmdEcho = &cobra.Command{ - Use: "echo [string to echo]", - Aliases: []string{"say"}, - Short: "Echo anything to the screen", - Long: `an utterly useless command for testing.`, - Example: "Just run cobra-test echo", -} - -var cmdEchoSub = &cobra.Command{ - Use: "echosub [string to print]", - Short: "second sub command for echo", - Long: `an absolutely utterly useless command for testing gendocs!.`, - Run: func(cmd *cobra.Command, args []string) {}, -} - -var cmdDeprecated = &cobra.Command{ - Use: "deprecated [can't do anything here]", - Short: "A command which is deprecated", - Long: `an absolutely utterly useless command for testing deprecation!.`, - Deprecated: "Please use echo instead", -} - -var cmdTimes = &cobra.Command{ - Use: "times [# times] [string to echo]", - SuggestFor: []string{"counts"}, - Short: "Echo anything to the screen more times", - Long: `a slightly useless command for testing.`, - PersistentPreRun: func(cmd *cobra.Command, args []string) {}, - Run: func(cmd *cobra.Command, args []string) {}, -} - -var cmdPrint = &cobra.Command{ - Use: "print [string to print]", - Short: "Print anything to the screen", - Long: `an absolutely utterly useless command for testing.`, -} - -var cmdRootNoRun = &cobra.Command{ - Use: "cobra-test", - Short: "The root can run its own function", - Long: "The root description for help", -} - -var cmdRootSameName = &cobra.Command{ - Use: "print", - Short: "Root with the same name as a subcommand", - Long: "The root description for help", -} - -var cmdRootWithRun = &cobra.Command{ - Use: "cobra-test", - Short: "The root can run its own function", - Long: "The root description for help", -} - -var cmdSubNoRun = &cobra.Command{ - Use: "subnorun", - Short: "A subcommand without a Run function", - Long: "A long output about a subcommand without a Run function", -} - -var cmdVersion1 = &cobra.Command{ - Use: "version", - Short: "Print the version number", - Long: `First version of the version command`, -} - -var cmdVersion2 = &cobra.Command{ - Use: "version", - Short: "Print the version number", - Long: `Second version of the version command`, -} - -func flagInit() { - cmdEcho.ResetFlags() - cmdPrint.ResetFlags() - cmdTimes.ResetFlags() - cmdRootNoRun.ResetFlags() - cmdRootSameName.ResetFlags() - cmdRootWithRun.ResetFlags() - cmdSubNoRun.ResetFlags() - cmdRootNoRun.PersistentFlags().StringVarP(&flags2a, "strtwo", "t", "two", strtwoParentHelp) - cmdEcho.Flags().IntVarP(&flagi1, "intone", "i", 123, "help message for flag intone") - cmdTimes.Flags().IntVarP(&flagi2, "inttwo", "j", 234, "help message for flag inttwo") - cmdPrint.Flags().IntVarP(&flagi3, "intthree", "i", 345, "help message for flag intthree") - cmdEcho.PersistentFlags().StringVarP(&flags1, "strone", "s", "one", "help message for flag strone") - cmdEcho.PersistentFlags().BoolVarP(&flagbp, "persistentbool", "p", false, "help message for flag persistentbool") - cmdTimes.PersistentFlags().StringVarP(&flags2b, "strtwo", "t", "2", strtwoChildHelp) - cmdPrint.PersistentFlags().StringVarP(&flags3, "strthree", "s", "three", "help message for flag strthree") - cmdEcho.Flags().BoolVarP(&flagb1, "boolone", "b", true, "help message for flag boolone") - cmdTimes.Flags().BoolVarP(&flagb2, "booltwo", "c", false, "help message for flag booltwo") - cmdPrint.Flags().BoolVarP(&flagb3, "boolthree", "b", true, "help message for flag boolthree") - cmdVersion1.ResetFlags() - cmdVersion2.ResetFlags() -} - -func initializeWithRootCmd() *cobra.Command { - cmdRootWithRun.ResetCommands() - flagInit() - cmdRootWithRun.Flags().BoolVarP(&flagbr, "boolroot", "b", false, "help message for flag boolroot") - cmdRootWithRun.Flags().IntVarP(&flagir, "introot", "i", 321, "help message for flag introot") - return cmdRootWithRun -} - -func checkStringContains(t *testing.T, found, expected string) { - if !strings.Contains(found, expected) { - logErr(t, found, expected) - } -} - -func checkStringOmits(t *testing.T, found, expected string) { - if strings.Contains(found, expected) { - logErr(t, found, expected) - } -} - -func logErr(t *testing.T, found, expected string) { - out := new(bytes.Buffer) - - _, _, line, ok := runtime.Caller(2) - if ok { - fmt.Fprintf(out, "Line: %d ", line) - } - fmt.Fprintf(out, "Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - t.Errorf(out.String()) -} diff --git a/vendor/github.com/spf13/cobra/doc/man_docs.go b/vendor/github.com/spf13/cobra/doc/man_docs.go deleted file mode 100644 index ce92332dd..000000000 --- a/vendor/github.com/spf13/cobra/doc/man_docs.go +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright 2015 Red Hat Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package doc - -import ( - "bytes" - "fmt" - "io" - "os" - "path/filepath" - "sort" - "strings" - "time" - - "github.com/cpuguy83/go-md2man/md2man" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -// GenManTree will generate a man page for this command and all descendants -// in the directory given. The header may be nil. This function may not work -// correctly if your command names have `-` in them. If you have `cmd` with two -// subcmds, `sub` and `sub-third`, and `sub` has a subcommand called `third` -// it is undefined which help output will be in the file `cmd-sub-third.1`. -func GenManTree(cmd *cobra.Command, header *GenManHeader, dir string) error { - return GenManTreeFromOpts(cmd, GenManTreeOptions{ - Header: header, - Path: dir, - CommandSeparator: "-", - }) -} - -// GenManTreeFromOpts generates a man page for the command and all descendants. -// The pages are written to the opts.Path directory. -func GenManTreeFromOpts(cmd *cobra.Command, opts GenManTreeOptions) error { - header := opts.Header - if header == nil { - header = &GenManHeader{} - } - for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { - continue - } - if err := GenManTreeFromOpts(c, opts); err != nil { - return err - } - } - section := "1" - if header.Section != "" { - section = header.Section - } - - separator := "_" - if opts.CommandSeparator != "" { - separator = opts.CommandSeparator - } - basename := strings.Replace(cmd.CommandPath(), " ", separator, -1) - filename := filepath.Join(opts.Path, basename+"."+section) - f, err := os.Create(filename) - if err != nil { - return err - } - defer f.Close() - - headerCopy := *header - return GenMan(cmd, &headerCopy, f) -} - -// GenManTreeOptions is the options for generating the man pages. -// Used only in GenManTreeFromOpts. -type GenManTreeOptions struct { - Header *GenManHeader - Path string - CommandSeparator string -} - -// GenManHeader is a lot like the .TH header at the start of man pages. These -// include the title, section, date, source, and manual. We will use the -// current time if Date if unset and will use "Auto generated by spf13/cobra" -// if the Source is unset. -type GenManHeader struct { - Title string - Section string - Date *time.Time - date string - Source string - Manual string -} - -// GenMan will generate a man page for the given command and write it to -// w. The header argument may be nil, however obviously w may not. -func GenMan(cmd *cobra.Command, header *GenManHeader, w io.Writer) error { - if header == nil { - header = &GenManHeader{} - } - fillHeader(header, cmd.CommandPath()) - - b := genMan(cmd, header) - _, err := w.Write(md2man.Render(b)) - return err -} - -func fillHeader(header *GenManHeader, name string) { - if header.Title == "" { - header.Title = strings.ToUpper(strings.Replace(name, " ", "\\-", -1)) - } - if header.Section == "" { - header.Section = "1" - } - if header.Date == nil { - now := time.Now() - header.Date = &now - } - header.date = (*header.Date).Format("Jan 2006") - if header.Source == "" { - header.Source = "Auto generated by spf13/cobra" - } -} - -func manPreamble(buf *bytes.Buffer, header *GenManHeader, cmd *cobra.Command, dashedName string) { - description := cmd.Long - if len(description) == 0 { - description = cmd.Short - } - - buf.WriteString(fmt.Sprintf(`%% %s(%s)%s -%% %s -%% %s -# NAME -`, header.Title, header.Section, header.date, header.Source, header.Manual)) - buf.WriteString(fmt.Sprintf("%s \\- %s\n\n", dashedName, cmd.Short)) - buf.WriteString("# SYNOPSIS\n") - buf.WriteString(fmt.Sprintf("**%s**\n\n", cmd.UseLine())) - buf.WriteString("# DESCRIPTION\n") - buf.WriteString(description + "\n\n") -} - -func manPrintFlags(buf *bytes.Buffer, flags *pflag.FlagSet) { - flags.VisitAll(func(flag *pflag.Flag) { - if len(flag.Deprecated) > 0 || flag.Hidden { - return - } - format := "" - if len(flag.Shorthand) > 0 && len(flag.ShorthandDeprecated) == 0 { - format = fmt.Sprintf("**-%s**, **--%s**", flag.Shorthand, flag.Name) - } else { - format = fmt.Sprintf("**--%s**", flag.Name) - } - if len(flag.NoOptDefVal) > 0 { - format += "[" - } - if flag.Value.Type() == "string" { - // put quotes on the value - format += "=%q" - } else { - format += "=%s" - } - if len(flag.NoOptDefVal) > 0 { - format += "]" - } - format += "\n\t%s\n\n" - buf.WriteString(fmt.Sprintf(format, flag.DefValue, flag.Usage)) - }) -} - -func manPrintOptions(buf *bytes.Buffer, command *cobra.Command) { - flags := command.NonInheritedFlags() - if flags.HasFlags() { - buf.WriteString("# OPTIONS\n") - manPrintFlags(buf, flags) - buf.WriteString("\n") - } - flags = command.InheritedFlags() - if flags.HasFlags() { - buf.WriteString("# OPTIONS INHERITED FROM PARENT COMMANDS\n") - manPrintFlags(buf, flags) - buf.WriteString("\n") - } -} - -func genMan(cmd *cobra.Command, header *GenManHeader) []byte { - cmd.InitDefaultHelpCmd() - cmd.InitDefaultHelpFlag() - - // something like `rootcmd-subcmd1-subcmd2` - dashCommandName := strings.Replace(cmd.CommandPath(), " ", "-", -1) - - buf := new(bytes.Buffer) - - manPreamble(buf, header, cmd, dashCommandName) - manPrintOptions(buf, cmd) - if len(cmd.Example) > 0 { - buf.WriteString("# EXAMPLE\n") - buf.WriteString(fmt.Sprintf("```\n%s\n```\n", cmd.Example)) - } - if hasSeeAlso(cmd) { - buf.WriteString("# SEE ALSO\n") - seealsos := make([]string, 0) - if cmd.HasParent() { - parentPath := cmd.Parent().CommandPath() - dashParentPath := strings.Replace(parentPath, " ", "-", -1) - seealso := fmt.Sprintf("**%s(%s)**", dashParentPath, header.Section) - seealsos = append(seealsos, seealso) - cmd.VisitParents(func(c *cobra.Command) { - if c.DisableAutoGenTag { - cmd.DisableAutoGenTag = c.DisableAutoGenTag - } - }) - } - children := cmd.Commands() - sort.Sort(byName(children)) - for _, c := range children { - if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { - continue - } - seealso := fmt.Sprintf("**%s-%s(%s)**", dashCommandName, c.Name(), header.Section) - seealsos = append(seealsos, seealso) - } - buf.WriteString(strings.Join(seealsos, ", ") + "\n") - } - if !cmd.DisableAutoGenTag { - buf.WriteString(fmt.Sprintf("# HISTORY\n%s Auto generated by spf13/cobra\n", header.Date.Format("2-Jan-2006"))) - } - return buf.Bytes() -} diff --git a/vendor/github.com/spf13/cobra/doc/man_docs.md b/vendor/github.com/spf13/cobra/doc/man_docs.md deleted file mode 100644 index 3709160f3..000000000 --- a/vendor/github.com/spf13/cobra/doc/man_docs.md +++ /dev/null @@ -1,31 +0,0 @@ -# Generating Man Pages For Your Own cobra.Command - -Generating man pages from a cobra command is incredibly easy. An example is as follows: - -```go -package main - -import ( - "log" - - "github.com/spf13/cobra" - "github.com/spf13/cobra/doc" -) - -func main() { - cmd := &cobra.Command{ - Use: "test", - Short: "my test program", - } - header := &doc.GenManHeader{ - Title: "MINE", - Section: "3", - } - err := doc.GenManTree(cmd, header, "/tmp") - if err != nil { - log.Fatal(err) - } -} -``` - -That will get you a man page `/tmp/test.3` diff --git a/vendor/github.com/spf13/cobra/doc/man_docs_test.go b/vendor/github.com/spf13/cobra/doc/man_docs_test.go deleted file mode 100644 index 87991063e..000000000 --- a/vendor/github.com/spf13/cobra/doc/man_docs_test.go +++ /dev/null @@ -1,216 +0,0 @@ -package doc - -import ( - "bufio" - "bytes" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strings" - "testing" - - "github.com/spf13/cobra" -) - -func translate(in string) string { - return strings.Replace(in, "-", "\\-", -1) -} - -func TestGenManDoc(t *testing.T) { - c := initializeWithRootCmd() - // Need two commands to run the command alphabetical sort - cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated) - c.AddCommand(cmdPrint, cmdEcho) - cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp) - - out := new(bytes.Buffer) - - header := &GenManHeader{ - Title: "Project", - Section: "2", - } - // We generate on a subcommand so we have both subcommands and parents - if err := GenMan(cmdEcho, header, out); err != nil { - t.Fatal(err) - } - found := out.String() - - // Make sure parent has - in CommandPath() in SEE ALSO: - parentPath := cmdEcho.Parent().CommandPath() - dashParentPath := strings.Replace(parentPath, " ", "-", -1) - expected := translate(dashParentPath) - expected = expected + "(" + header.Section + ")" - checkStringContains(t, found, expected) - - // Our description - expected = translate(cmdEcho.Name()) - checkStringContains(t, found, expected) - - // Better have our example - expected = translate(cmdEcho.Name()) - checkStringContains(t, found, expected) - - // A local flag - expected = "boolone" - checkStringContains(t, found, expected) - - // persistent flag on parent - expected = "rootflag" - checkStringContains(t, found, expected) - - // We better output info about our parent - expected = translate(cmdRootWithRun.Name()) - checkStringContains(t, found, expected) - - // And about subcommands - expected = translate(cmdEchoSub.Name()) - checkStringContains(t, found, expected) - - unexpected := translate(cmdDeprecated.Name()) - checkStringOmits(t, found, unexpected) - - // auto generated - expected = translate("Auto generated") - checkStringContains(t, found, expected) -} - -func TestGenManNoGenTag(t *testing.T) { - c := initializeWithRootCmd() - // Need two commands to run the command alphabetical sort - cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated) - c.AddCommand(cmdPrint, cmdEcho) - cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp) - cmdEcho.DisableAutoGenTag = true - out := new(bytes.Buffer) - - header := &GenManHeader{ - Title: "Project", - Section: "2", - } - // We generate on a subcommand so we have both subcommands and parents - if err := GenMan(cmdEcho, header, out); err != nil { - t.Fatal(err) - } - found := out.String() - - unexpected := translate("#HISTORY") - checkStringOmits(t, found, unexpected) -} - -func TestGenManSeeAlso(t *testing.T) { - noop := func(cmd *cobra.Command, args []string) {} - - top := &cobra.Command{Use: "top", Run: noop} - aaa := &cobra.Command{Use: "aaa", Run: noop, Hidden: true} // #229 - bbb := &cobra.Command{Use: "bbb", Run: noop} - ccc := &cobra.Command{Use: "ccc", Run: noop} - top.AddCommand(aaa, bbb, ccc) - - out := new(bytes.Buffer) - header := &GenManHeader{} - if err := GenMan(top, header, out); err != nil { - t.Fatal(err) - } - - scanner := bufio.NewScanner(out) - - if err := AssertLineFound(scanner, ".SH SEE ALSO"); err != nil { - t.Fatal(fmt.Errorf("Couldn't find SEE ALSO section header: %s", err.Error())) - } - - if err := AssertNextLineEquals(scanner, ".PP"); err != nil { - t.Fatal(fmt.Errorf("First line after SEE ALSO wasn't break-indent: %s", err.Error())) - } - - if err := AssertNextLineEquals(scanner, `\fBtop\-bbb(1)\fP, \fBtop\-ccc(1)\fP`); err != nil { - t.Fatal(fmt.Errorf("Second line after SEE ALSO wasn't correct: %s", err.Error())) - } -} - -func TestManPrintFlagsHidesShortDeperecated(t *testing.T) { - cmd := &cobra.Command{} - flags := cmd.Flags() - flags.StringP("foo", "f", "default", "Foo flag") - flags.MarkShorthandDeprecated("foo", "don't use it no more") - - out := new(bytes.Buffer) - manPrintFlags(out, flags) - - expected := "**--foo**=\"default\"\n\tFoo flag\n\n" - if out.String() != expected { - t.Fatalf("Expected %s, but got %s", expected, out.String()) - } -} - -func TestGenManTree(t *testing.T) { - cmd := &cobra.Command{ - Use: "do [OPTIONS] arg1 arg2", - } - header := &GenManHeader{Section: "2"} - tmpdir, err := ioutil.TempDir("", "test-gen-man-tree") - if err != nil { - t.Fatalf("Failed to create tmpdir: %s", err.Error()) - } - defer os.RemoveAll(tmpdir) - - if err := GenManTree(cmd, header, tmpdir); err != nil { - t.Fatalf("GenManTree failed: %s", err.Error()) - } - - if _, err := os.Stat(filepath.Join(tmpdir, "do.2")); err != nil { - t.Fatalf("Expected file 'do.2' to exist") - } - - if header.Title != "" { - t.Fatalf("Expected header.Title to be unmodified") - } -} - -func AssertLineFound(scanner *bufio.Scanner, expectedLine string) error { - for scanner.Scan() { - line := scanner.Text() - if line == expectedLine { - return nil - } - } - - if err := scanner.Err(); err != nil { - return fmt.Errorf("AssertLineFound: scan failed: %s", err.Error()) - } - - return fmt.Errorf("AssertLineFound: hit EOF before finding %#v", expectedLine) -} - -func AssertNextLineEquals(scanner *bufio.Scanner, expectedLine string) error { - if scanner.Scan() { - line := scanner.Text() - if line == expectedLine { - return nil - } - return fmt.Errorf("AssertNextLineEquals: got %#v, not %#v", line, expectedLine) - } - - if err := scanner.Err(); err != nil { - return fmt.Errorf("AssertNextLineEquals: scan failed: %s", err.Error()) - } - - return fmt.Errorf("AssertNextLineEquals: hit EOF before finding %#v", expectedLine) -} - -func BenchmarkGenManToFile(b *testing.B) { - c := initializeWithRootCmd() - file, err := ioutil.TempFile("", "") - if err != nil { - b.Fatal(err) - } - defer os.Remove(file.Name()) - defer file.Close() - - b.ResetTimer() - for i := 0; i < b.N; i++ { - if err := GenMan(c, nil, file); err != nil { - b.Fatal(err) - } - } -} diff --git a/vendor/github.com/spf13/cobra/doc/man_examples_test.go b/vendor/github.com/spf13/cobra/doc/man_examples_test.go deleted file mode 100644 index db6604268..000000000 --- a/vendor/github.com/spf13/cobra/doc/man_examples_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package doc_test - -import ( - "bytes" - "fmt" - - "github.com/spf13/cobra" - "github.com/spf13/cobra/doc" -) - -func ExampleGenManTree() { - cmd := &cobra.Command{ - Use: "test", - Short: "my test program", - } - header := &doc.GenManHeader{ - Title: "MINE", - Section: "3", - } - doc.GenManTree(cmd, header, "/tmp") -} - -func ExampleGenMan() { - cmd := &cobra.Command{ - Use: "test", - Short: "my test program", - } - header := &doc.GenManHeader{ - Title: "MINE", - Section: "3", - } - out := new(bytes.Buffer) - doc.GenMan(cmd, header, out) - fmt.Print(out.String()) -} diff --git a/vendor/github.com/spf13/cobra/doc/md_docs.go b/vendor/github.com/spf13/cobra/doc/md_docs.go deleted file mode 100644 index 68cf5bf64..000000000 --- a/vendor/github.com/spf13/cobra/doc/md_docs.go +++ /dev/null @@ -1,159 +0,0 @@ -//Copyright 2015 Red Hat Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package doc - -import ( - "bytes" - "fmt" - "io" - "os" - "path/filepath" - "sort" - "strings" - "time" - - "github.com/spf13/cobra" -) - -func printOptions(buf *bytes.Buffer, cmd *cobra.Command, name string) error { - flags := cmd.NonInheritedFlags() - flags.SetOutput(buf) - if flags.HasFlags() { - buf.WriteString("### Options\n\n```\n") - flags.PrintDefaults() - buf.WriteString("```\n\n") - } - - parentFlags := cmd.InheritedFlags() - parentFlags.SetOutput(buf) - if parentFlags.HasFlags() { - buf.WriteString("### Options inherited from parent commands\n\n```\n") - parentFlags.PrintDefaults() - buf.WriteString("```\n\n") - } - return nil -} - -// GenMarkdown creates markdown output. -func GenMarkdown(cmd *cobra.Command, w io.Writer) error { - return GenMarkdownCustom(cmd, w, func(s string) string { return s }) -} - -// GenMarkdownCustom creates custom markdown output. -func GenMarkdownCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string) string) error { - cmd.InitDefaultHelpCmd() - cmd.InitDefaultHelpFlag() - - buf := new(bytes.Buffer) - name := cmd.CommandPath() - - short := cmd.Short - long := cmd.Long - if len(long) == 0 { - long = short - } - - buf.WriteString("## " + name + "\n\n") - buf.WriteString(short + "\n\n") - buf.WriteString("### Synopsis\n\n") - buf.WriteString("\n" + long + "\n\n") - - if cmd.Runnable() { - buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.UseLine())) - } - - if len(cmd.Example) > 0 { - buf.WriteString("### Examples\n\n") - buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.Example)) - } - - if err := printOptions(buf, cmd, name); err != nil { - return err - } - if hasSeeAlso(cmd) { - buf.WriteString("### SEE ALSO\n") - if cmd.HasParent() { - parent := cmd.Parent() - pname := parent.CommandPath() - link := pname + ".md" - link = strings.Replace(link, " ", "_", -1) - buf.WriteString(fmt.Sprintf("* [%s](%s)\t - %s\n", pname, linkHandler(link), parent.Short)) - cmd.VisitParents(func(c *cobra.Command) { - if c.DisableAutoGenTag { - cmd.DisableAutoGenTag = c.DisableAutoGenTag - } - }) - } - - children := cmd.Commands() - sort.Sort(byName(children)) - - for _, child := range children { - if !child.IsAvailableCommand() || child.IsAdditionalHelpTopicCommand() { - continue - } - cname := name + " " + child.Name() - link := cname + ".md" - link = strings.Replace(link, " ", "_", -1) - buf.WriteString(fmt.Sprintf("* [%s](%s)\t - %s\n", cname, linkHandler(link), child.Short)) - } - buf.WriteString("\n") - } - if !cmd.DisableAutoGenTag { - buf.WriteString("###### Auto generated by spf13/cobra on " + time.Now().Format("2-Jan-2006") + "\n") - } - _, err := buf.WriteTo(w) - return err -} - -// GenMarkdownTree will generate a markdown page for this command and all -// descendants in the directory given. The header may be nil. -// This function may not work correctly if your command names have `-` in them. -// If you have `cmd` with two subcmds, `sub` and `sub-third`, -// and `sub` has a subcommand called `third`, it is undefined which -// help output will be in the file `cmd-sub-third.1`. -func GenMarkdownTree(cmd *cobra.Command, dir string) error { - identity := func(s string) string { return s } - emptyStr := func(s string) string { return "" } - return GenMarkdownTreeCustom(cmd, dir, emptyStr, identity) -} - -// GenMarkdownTreeCustom is the the same as GenMarkdownTree, but -// with custom filePrepender and linkHandler. -func GenMarkdownTreeCustom(cmd *cobra.Command, dir string, filePrepender, linkHandler func(string) string) error { - for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { - continue - } - if err := GenMarkdownTreeCustom(c, dir, filePrepender, linkHandler); err != nil { - return err - } - } - - basename := strings.Replace(cmd.CommandPath(), " ", "_", -1) + ".md" - filename := filepath.Join(dir, basename) - f, err := os.Create(filename) - if err != nil { - return err - } - defer f.Close() - - if _, err := io.WriteString(f, filePrepender(filename)); err != nil { - return err - } - if err := GenMarkdownCustom(cmd, f, linkHandler); err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/spf13/cobra/doc/md_docs.md b/vendor/github.com/spf13/cobra/doc/md_docs.md deleted file mode 100644 index 56ce9fe81..000000000 --- a/vendor/github.com/spf13/cobra/doc/md_docs.md +++ /dev/null @@ -1,115 +0,0 @@ -# Generating Markdown Docs For Your Own cobra.Command - -Generating man pages from a cobra command is incredibly easy. An example is as follows: - -```go -package main - -import ( - "log" - - "github.com/spf13/cobra" - "github.com/spf13/cobra/doc" -) - -func main() { - cmd := &cobra.Command{ - Use: "test", - Short: "my test program", - } - err := doc.GenMarkdownTree(cmd, "/tmp") - if err != nil { - log.Fatal(err) - } -} -``` - -That will get you a Markdown document `/tmp/test.md` - -## Generate markdown docs for the entire command tree - -This program can actually generate docs for the kubectl command in the kubernetes project - -```go -package main - -import ( - "log" - "io/ioutil" - "os" - - "k8s.io/kubernetes/pkg/kubectl/cmd" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - - "github.com/spf13/cobra/doc" -) - -func main() { - kubectl := cmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) - err := doc.GenMarkdownTree(kubectl, "./") - if err != nil { - log.Fatal(err) - } -} -``` - -This will generate a whole series of files, one for each command in the tree, in the directory specified (in this case "./") - -## Generate markdown docs for a single command - -You may wish to have more control over the output, or only generate for a single command, instead of the entire command tree. If this is the case you may prefer to `GenMarkdown` instead of `GenMarkdownTree` - -```go - out := new(bytes.Buffer) - err := doc.GenMarkdown(cmd, out) - if err != nil { - log.Fatal(err) - } -``` - -This will write the markdown doc for ONLY "cmd" into the out, buffer. - -## Customize the output - -Both `GenMarkdown` and `GenMarkdownTree` have alternate versions with callbacks to get some control of the output: - -```go -func GenMarkdownTreeCustom(cmd *Command, dir string, filePrepender, linkHandler func(string) string) error { - //... -} -``` - -```go -func GenMarkdownCustom(cmd *Command, out *bytes.Buffer, linkHandler func(string) string) error { - //... -} -``` - -The `filePrepender` will prepend the return value given the full filepath to the rendered Markdown file. A common use case is to add front matter to use the generated documentation with [Hugo](http://gohugo.io/): - -```go -const fmTemplate = `--- -date: %s -title: "%s" -slug: %s -url: %s ---- -` - -filePrepender := func(filename string) string { - now := time.Now().Format(time.RFC3339) - name := filepath.Base(filename) - base := strings.TrimSuffix(name, path.Ext(name)) - url := "/commands/" + strings.ToLower(base) + "/" - return fmt.Sprintf(fmTemplate, now, strings.Replace(base, "_", " ", -1), base, url) -} -``` - -The `linkHandler` can be used to customize the rendered internal links to the commands, given a filename: - -```go -linkHandler := func(name string) string { - base := strings.TrimSuffix(name, path.Ext(name)) - return "/commands/" + strings.ToLower(base) + "/" -} -``` diff --git a/vendor/github.com/spf13/cobra/doc/md_docs_test.go b/vendor/github.com/spf13/cobra/doc/md_docs_test.go deleted file mode 100644 index ba6b9a46e..000000000 --- a/vendor/github.com/spf13/cobra/doc/md_docs_test.go +++ /dev/null @@ -1,124 +0,0 @@ -package doc - -import ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "strings" - "testing" - - "github.com/spf13/cobra" -) - -func TestGenMdDoc(t *testing.T) { - c := initializeWithRootCmd() - // Need two commands to run the command alphabetical sort - cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated) - c.AddCommand(cmdPrint, cmdEcho) - cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp) - - out := new(bytes.Buffer) - - // We generate on s subcommand so we have both subcommands and parents - if err := GenMarkdown(cmdEcho, out); err != nil { - t.Fatal(err) - } - found := out.String() - - // Our description - expected := cmdEcho.Long - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // Better have our example - expected = cmdEcho.Example - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // A local flag - expected = "boolone" - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // persistent flag on parent - expected = "rootflag" - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // We better output info about our parent - expected = cmdRootWithRun.Short - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // And about subcommands - expected = cmdEchoSub.Short - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - unexpected := cmdDeprecated.Short - if strings.Contains(found, unexpected) { - t.Errorf("Unexpected response.\nFound: %v\nBut should not have!!\n", unexpected) - } -} - -func TestGenMdNoTag(t *testing.T) { - c := initializeWithRootCmd() - // Need two commands to run the command alphabetical sort - cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated) - c.AddCommand(cmdPrint, cmdEcho) - c.DisableAutoGenTag = true - cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp) - out := new(bytes.Buffer) - - if err := GenMarkdown(c, out); err != nil { - t.Fatal(err) - } - found := out.String() - - unexpected := "Auto generated" - checkStringOmits(t, found, unexpected) - -} - -func TestGenMdTree(t *testing.T) { - cmd := &cobra.Command{ - Use: "do [OPTIONS] arg1 arg2", - } - tmpdir, err := ioutil.TempDir("", "test-gen-md-tree") - if err != nil { - t.Fatalf("Failed to create tmpdir: %s", err.Error()) - } - defer os.RemoveAll(tmpdir) - - if err := GenMarkdownTree(cmd, tmpdir); err != nil { - t.Fatalf("GenMarkdownTree failed: %s", err.Error()) - } - - if _, err := os.Stat(filepath.Join(tmpdir, "do.md")); err != nil { - t.Fatalf("Expected file 'do.md' to exist") - } -} - -func BenchmarkGenMarkdownToFile(b *testing.B) { - c := initializeWithRootCmd() - file, err := ioutil.TempFile("", "") - if err != nil { - b.Fatal(err) - } - defer os.Remove(file.Name()) - defer file.Close() - - b.ResetTimer() - for i := 0; i < b.N; i++ { - if err := GenMarkdown(c, file); err != nil { - b.Fatal(err) - } - } -} diff --git a/vendor/github.com/spf13/cobra/doc/util.go b/vendor/github.com/spf13/cobra/doc/util.go deleted file mode 100644 index 8d3dbecec..000000000 --- a/vendor/github.com/spf13/cobra/doc/util.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2015 Red Hat Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package doc - -import ( - "strings" - - "github.com/spf13/cobra" -) - -// Test to see if we have a reason to print See Also information in docs -// Basically this is a test for a parent commend or a subcommand which is -// both not deprecated and not the autogenerated help command. -func hasSeeAlso(cmd *cobra.Command) bool { - if cmd.HasParent() { - return true - } - for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { - continue - } - return true - } - return false -} - -// Temporary workaround for yaml lib generating incorrect yaml with long strings -// that do not contain \n. -func forceMultiLine(s string) string { - if len(s) > 60 && !strings.Contains(s, "\n") { - s = s + "\n" - } - return s -} - -type byName []*cobra.Command - -func (s byName) Len() int { return len(s) } -func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() } diff --git a/vendor/github.com/spf13/cobra/doc/yaml_docs.go b/vendor/github.com/spf13/cobra/doc/yaml_docs.go deleted file mode 100644 index ea00af07e..000000000 --- a/vendor/github.com/spf13/cobra/doc/yaml_docs.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2016 French Ben. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package doc - -import ( - "fmt" - "io" - "os" - "path/filepath" - "sort" - "strings" - - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "gopkg.in/yaml.v2" -) - -type cmdOption struct { - Name string - Shorthand string `yaml:",omitempty"` - DefaultValue string `yaml:"default_value,omitempty"` - Usage string `yaml:",omitempty"` -} - -type cmdDoc struct { - Name string - Synopsis string `yaml:",omitempty"` - Description string `yaml:",omitempty"` - Options []cmdOption `yaml:",omitempty"` - InheritedOptions []cmdOption `yaml:"inherited_options,omitempty"` - Example string `yaml:",omitempty"` - SeeAlso []string `yaml:"see_also,omitempty"` -} - -// GenYamlTree creates yaml structured ref files for this command and all descendants -// in the directory given. This function may not work -// correctly if your command names have `-` in them. If you have `cmd` with two -// subcmds, `sub` and `sub-third`, and `sub` has a subcommand called `third` -// it is undefined which help output will be in the file `cmd-sub-third.1`. -func GenYamlTree(cmd *cobra.Command, dir string) error { - identity := func(s string) string { return s } - emptyStr := func(s string) string { return "" } - return GenYamlTreeCustom(cmd, dir, emptyStr, identity) -} - -// GenYamlTreeCustom creates yaml structured ref files. -func GenYamlTreeCustom(cmd *cobra.Command, dir string, filePrepender, linkHandler func(string) string) error { - for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { - continue - } - if err := GenYamlTreeCustom(c, dir, filePrepender, linkHandler); err != nil { - return err - } - } - - basename := strings.Replace(cmd.CommandPath(), " ", "_", -1) + ".yaml" - filename := filepath.Join(dir, basename) - f, err := os.Create(filename) - if err != nil { - return err - } - defer f.Close() - - if _, err := io.WriteString(f, filePrepender(filename)); err != nil { - return err - } - if err := GenYamlCustom(cmd, f, linkHandler); err != nil { - return err - } - return nil -} - -// GenYaml creates yaml output. -func GenYaml(cmd *cobra.Command, w io.Writer) error { - return GenYamlCustom(cmd, w, func(s string) string { return s }) -} - -// GenYamlCustom creates custom yaml output. -func GenYamlCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string) string) error { - cmd.InitDefaultHelpCmd() - cmd.InitDefaultHelpFlag() - - yamlDoc := cmdDoc{} - yamlDoc.Name = cmd.CommandPath() - - yamlDoc.Synopsis = forceMultiLine(cmd.Short) - yamlDoc.Description = forceMultiLine(cmd.Long) - - if len(cmd.Example) > 0 { - yamlDoc.Example = cmd.Example - } - - flags := cmd.NonInheritedFlags() - if flags.HasFlags() { - yamlDoc.Options = genFlagResult(flags) - } - flags = cmd.InheritedFlags() - if flags.HasFlags() { - yamlDoc.InheritedOptions = genFlagResult(flags) - } - - if hasSeeAlso(cmd) { - result := []string{} - if cmd.HasParent() { - parent := cmd.Parent() - result = append(result, parent.CommandPath()+" - "+parent.Short) - } - children := cmd.Commands() - sort.Sort(byName(children)) - for _, child := range children { - if !child.IsAvailableCommand() || child.IsAdditionalHelpTopicCommand() { - continue - } - result = append(result, child.Name()+" - "+child.Short) - } - yamlDoc.SeeAlso = result - } - - final, err := yaml.Marshal(&yamlDoc) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - if _, err := w.Write(final); err != nil { - return err - } - return nil -} - -func genFlagResult(flags *pflag.FlagSet) []cmdOption { - var result []cmdOption - - flags.VisitAll(func(flag *pflag.Flag) { - // Todo, when we mark a shorthand is deprecated, but specify an empty message. - // The flag.ShorthandDeprecated is empty as the shorthand is deprecated. - // Using len(flag.ShorthandDeprecated) > 0 can't handle this, others are ok. - if !(len(flag.ShorthandDeprecated) > 0) && len(flag.Shorthand) > 0 { - opt := cmdOption{ - flag.Name, - flag.Shorthand, - flag.DefValue, - forceMultiLine(flag.Usage), - } - result = append(result, opt) - } else { - opt := cmdOption{ - Name: flag.Name, - DefaultValue: forceMultiLine(flag.DefValue), - Usage: forceMultiLine(flag.Usage), - } - result = append(result, opt) - } - }) - - return result -} diff --git a/vendor/github.com/spf13/cobra/doc/yaml_docs.md b/vendor/github.com/spf13/cobra/doc/yaml_docs.md deleted file mode 100644 index 1a9b7c6a3..000000000 --- a/vendor/github.com/spf13/cobra/doc/yaml_docs.md +++ /dev/null @@ -1,112 +0,0 @@ -# Generating Yaml Docs For Your Own cobra.Command - -Generating yaml files from a cobra command is incredibly easy. An example is as follows: - -```go -package main - -import ( - "log" - - "github.com/spf13/cobra" - "github.com/spf13/cobra/doc" -) - -func main() { - cmd := &cobra.Command{ - Use: "test", - Short: "my test program", - } - err := doc.GenYamlTree(cmd, "/tmp") - if err != nil { - log.Fatal(err) - } -} -``` - -That will get you a Yaml document `/tmp/test.yaml` - -## Generate yaml docs for the entire command tree - -This program can actually generate docs for the kubectl command in the kubernetes project - -```go -package main - -import ( - "io/ioutil" - "log" - "os" - - "k8s.io/kubernetes/pkg/kubectl/cmd" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - - "github.com/spf13/cobra/doc" -) - -func main() { - kubectl := cmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) - err := doc.GenYamlTree(kubectl, "./") - if err != nil { - log.Fatal(err) - } -} -``` - -This will generate a whole series of files, one for each command in the tree, in the directory specified (in this case "./") - -## Generate yaml docs for a single command - -You may wish to have more control over the output, or only generate for a single command, instead of the entire command tree. If this is the case you may prefer to `GenYaml` instead of `GenYamlTree` - -```go - out := new(bytes.Buffer) - doc.GenYaml(cmd, out) -``` - -This will write the yaml doc for ONLY "cmd" into the out, buffer. - -## Customize the output - -Both `GenYaml` and `GenYamlTree` have alternate versions with callbacks to get some control of the output: - -```go -func GenYamlTreeCustom(cmd *Command, dir string, filePrepender, linkHandler func(string) string) error { - //... -} -``` - -```go -func GenYamlCustom(cmd *Command, out *bytes.Buffer, linkHandler func(string) string) error { - //... -} -``` - -The `filePrepender` will prepend the return value given the full filepath to the rendered Yaml file. A common use case is to add front matter to use the generated documentation with [Hugo](http://gohugo.io/): - -```go -const fmTemplate = `--- -date: %s -title: "%s" -slug: %s -url: %s ---- -` - -filePrepender := func(filename string) string { - now := time.Now().Format(time.RFC3339) - name := filepath.Base(filename) - base := strings.TrimSuffix(name, path.Ext(name)) - url := "/commands/" + strings.ToLower(base) + "/" - return fmt.Sprintf(fmTemplate, now, strings.Replace(base, "_", " ", -1), base, url) -} -``` - -The `linkHandler` can be used to customize the rendered internal links to the commands, given a filename: - -```go -linkHandler := func(name string) string { - base := strings.TrimSuffix(name, path.Ext(name)) - return "/commands/" + strings.ToLower(base) + "/" -} -``` diff --git a/vendor/github.com/spf13/cobra/doc/yaml_docs_test.go b/vendor/github.com/spf13/cobra/doc/yaml_docs_test.go deleted file mode 100644 index 29e985e40..000000000 --- a/vendor/github.com/spf13/cobra/doc/yaml_docs_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package doc - -import ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "strings" - "testing" - - "github.com/spf13/cobra" -) - -func TestGenYamlDoc(t *testing.T) { - c := initializeWithRootCmd() - // Need two commands to run the command alphabetical sort - cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated) - c.AddCommand(cmdPrint, cmdEcho) - cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp) - - out := new(bytes.Buffer) - - // We generate on s subcommand so we have both subcommands and parents - if err := GenYaml(cmdEcho, out); err != nil { - t.Fatal(err) - } - found := out.String() - - // Our description - expected := cmdEcho.Long - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // Better have our example - expected = cmdEcho.Example - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // A local flag - expected = "boolone" - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // persistent flag on parent - expected = "rootflag" - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // We better output info about our parent - expected = cmdRootWithRun.Short - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - // And about subcommands - expected = cmdEchoSub.Short - if !strings.Contains(found, expected) { - t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found) - } - - unexpected := cmdDeprecated.Short - if strings.Contains(found, unexpected) { - t.Errorf("Unexpected response.\nFound: %v\nBut should not have!!\n", unexpected) - } -} - -func TestGenYamlNoTag(t *testing.T) { - c := initializeWithRootCmd() - // Need two commands to run the command alphabetical sort - cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated) - c.AddCommand(cmdPrint, cmdEcho) - c.DisableAutoGenTag = true - cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp) - out := new(bytes.Buffer) - - if err := GenYaml(c, out); err != nil { - t.Fatal(err) - } - found := out.String() - - unexpected := "Auto generated" - checkStringOmits(t, found, unexpected) - -} - -func TestGenYamlTree(t *testing.T) { - cmd := &cobra.Command{ - Use: "do [OPTIONS] arg1 arg2", - } - - tmpdir, err := ioutil.TempDir("", "test-gen-yaml-tree") - if err != nil { - t.Fatalf("Failed to create tmpdir: %s", err.Error()) - } - defer os.RemoveAll(tmpdir) - - if err := GenYamlTree(cmd, tmpdir); err != nil { - t.Fatalf("GenYamlTree failed: %s", err.Error()) - } - - if _, err := os.Stat(filepath.Join(tmpdir, "do.yaml")); err != nil { - t.Fatalf("Expected file 'do.yaml' to exist") - } -} - -func BenchmarkGenYamlToFile(b *testing.B) { - c := initializeWithRootCmd() - file, err := ioutil.TempFile("", "") - if err != nil { - b.Fatal(err) - } - defer os.Remove(file.Name()) - defer file.Close() - - b.ResetTimer() - for i := 0; i < b.N; i++ { - if err := GenYaml(c, file); err != nil { - b.Fatal(err) - } - } -} diff --git a/vendor/github.com/spf13/pflag/verify/all.sh b/vendor/github.com/spf13/pflag/verify/all.sh deleted file mode 100755 index 739f89c0b..000000000 --- a/vendor/github.com/spf13/pflag/verify/all.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash - -set -o errexit -set -o nounset -set -o pipefail - -ROOT=$(dirname "${BASH_SOURCE}")/.. - -# Some useful colors. -if [[ -z "${color_start-}" ]]; then - declare -r color_start="\033[" - declare -r color_red="${color_start}0;31m" - declare -r color_yellow="${color_start}0;33m" - declare -r color_green="${color_start}0;32m" - declare -r color_norm="${color_start}0m" -fi - -SILENT=true - -function is-excluded { - for e in $EXCLUDE; do - if [[ $1 -ef ${BASH_SOURCE} ]]; then - return - fi - if [[ $1 -ef "$ROOT/hack/$e" ]]; then - return - fi - done - return 1 -} - -while getopts ":v" opt; do - case $opt in - v) - SILENT=false - ;; - \?) - echo "Invalid flag: -$OPTARG" >&2 - exit 1 - ;; - esac -done - -if $SILENT ; then - echo "Running in the silent mode, run with -v if you want to see script logs." -fi - -EXCLUDE="all.sh" - -ret=0 -for t in `ls $ROOT/verify/*.sh` -do - if is-excluded $t ; then - echo "Skipping $t" - continue - fi - if $SILENT ; then - echo -e "Verifying $t" - if bash "$t" &> /dev/null; then - echo -e "${color_green}SUCCESS${color_norm}" - else - echo -e "${color_red}FAILED${color_norm}" - ret=1 - fi - else - bash "$t" || ret=1 - fi -done -exit $ret diff --git a/vendor/github.com/spf13/pflag/verify/gofmt.sh b/vendor/github.com/spf13/pflag/verify/gofmt.sh deleted file mode 100755 index f66acf803..000000000 --- a/vendor/github.com/spf13/pflag/verify/gofmt.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -set -o errexit -set -o nounset -set -o pipefail - -ROOT=$(dirname "${BASH_SOURCE}")/.. - -pushd "${ROOT}" > /dev/null - -GOFMT=${GOFMT:-"gofmt"} -bad_files=$(find . -name '*.go' | xargs $GOFMT -s -l) -if [[ -n "${bad_files}" ]]; then - echo "!!! '$GOFMT' needs to be run on the following files: " - echo "${bad_files}" - exit 1 -fi - -# ex: ts=2 sw=2 et filetype=sh diff --git a/vendor/github.com/spf13/pflag/verify/golint.sh b/vendor/github.com/spf13/pflag/verify/golint.sh deleted file mode 100755 index 685c1778e..000000000 --- a/vendor/github.com/spf13/pflag/verify/golint.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -ROOT=$(dirname "${BASH_SOURCE}")/.. -GOLINT=${GOLINT:-"golint"} - -pushd "${ROOT}" > /dev/null - bad_files=$($GOLINT -min_confidence=0.9 ./...) - if [[ -n "${bad_files}" ]]; then - echo "!!! '$GOLINT' problems: " - echo "${bad_files}" - exit 1 - fi -popd > /dev/null - -# ex: ts=2 sw=2 et filetype=sh diff --git a/vendor/github.com/spf13/viper/remote/remote.go b/vendor/github.com/spf13/viper/remote/remote.go deleted file mode 100644 index 68a35d692..000000000 --- a/vendor/github.com/spf13/viper/remote/remote.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file. - -// Package remote integrates the remote features of Viper. -package remote - -import ( - "bytes" - "github.com/spf13/viper" - crypt "github.com/xordataexchange/crypt/config" - "io" - "os" -) - -type remoteConfigProvider struct{} - -func (rc remoteConfigProvider) Get(rp viper.RemoteProvider) (io.Reader, error) { - cm, err := getConfigManager(rp) - if err != nil { - return nil, err - } - b, err := cm.Get(rp.Path()) - if err != nil { - return nil, err - } - return bytes.NewReader(b), nil -} - -func (rc remoteConfigProvider) Watch(rp viper.RemoteProvider) (io.Reader, error) { - cm, err := getConfigManager(rp) - if err != nil { - return nil, err - } - resp, err := cm.Get(rp.Path()) - if err != nil { - return nil, err - } - - return bytes.NewReader(resp), nil -} - -func (rc remoteConfigProvider) WatchChannel(rp viper.RemoteProvider) (<-chan *viper.RemoteResponse, chan bool) { - cm, err := getConfigManager(rp) - if err != nil { - return nil, nil - } - quit := make(chan bool) - quitwc := make(chan bool) - viperResponsCh := make(chan *viper.RemoteResponse) - cryptoResponseCh := cm.Watch(rp.Path(), quit) - // need this function to convert the Channel response form crypt.Response to viper.Response - go func(cr <-chan *crypt.Response, vr chan<- *viper.RemoteResponse, quitwc <-chan bool, quit chan<- bool) { - for { - select { - case <-quitwc: - quit <- true - return - case resp := <-cr: - vr <- &viper.RemoteResponse{ - Error: resp.Error, - Value: resp.Value, - } - - } - - } - }(cryptoResponseCh, viperResponsCh, quitwc, quit) - - return viperResponsCh, quitwc -} - -func getConfigManager(rp viper.RemoteProvider) (crypt.ConfigManager, error) { - var cm crypt.ConfigManager - var err error - - if rp.SecretKeyring() != "" { - kr, err := os.Open(rp.SecretKeyring()) - defer kr.Close() - if err != nil { - return nil, err - } - if rp.Provider() == "etcd" { - cm, err = crypt.NewEtcdConfigManager([]string{rp.Endpoint()}, kr) - } else { - cm, err = crypt.NewConsulConfigManager([]string{rp.Endpoint()}, kr) - } - } else { - if rp.Provider() == "etcd" { - cm, err = crypt.NewStandardEtcdConfigManager([]string{rp.Endpoint()}) - } else { - cm, err = crypt.NewStandardConsulConfigManager([]string{rp.Endpoint()}) - } - } - if err != nil { - return nil, err - } - return cm, nil -} - -func init() { - viper.RemoteConfig = &remoteConfigProvider{} -} diff --git a/vendor/github.com/stretchr/testify/Godeps/Godeps.json b/vendor/github.com/stretchr/testify/Godeps/Godeps.json deleted file mode 100644 index df032ac31..000000000 --- a/vendor/github.com/stretchr/testify/Godeps/Godeps.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "ImportPath": "github.com/stretchr/testify", - "GoVersion": "go1.5", - "GodepVersion": "v74", - "Packages": [ - "./..." - ], - "Deps": [ - { - "ImportPath": "github.com/davecgh/go-spew/spew", - "Comment": "v1.0.0-3-g6d21280", - "Rev": "6d212800a42e8ab5c146b8ace3490ee17e5225f9" - }, - { - "ImportPath": "github.com/pmezard/go-difflib/difflib", - "Rev": "d8ed2627bdf02c080bf22230dbb337003b7aba2d" - }, - { - "ImportPath": "github.com/stretchr/objx", - "Rev": "cbeaeb16a013161a98496fad62933b1d21786672" - } - ] -} diff --git a/vendor/github.com/stretchr/testify/Godeps/Readme b/vendor/github.com/stretchr/testify/Godeps/Readme deleted file mode 100644 index 4cdaa53d5..000000000 --- a/vendor/github.com/stretchr/testify/Godeps/Readme +++ /dev/null @@ -1,5 +0,0 @@ -This directory tree is generated automatically by godep. - -Please do not edit. - -See https://github.com/tools/godep for more information. diff --git a/vendor/github.com/stretchr/testify/_codegen/main.go b/vendor/github.com/stretchr/testify/_codegen/main.go deleted file mode 100644 index 328009f84..000000000 --- a/vendor/github.com/stretchr/testify/_codegen/main.go +++ /dev/null @@ -1,287 +0,0 @@ -// This program reads all assertion functions from the assert package and -// automatically generates the corersponding requires and forwarded assertions - -package main - -import ( - "bytes" - "flag" - "fmt" - "go/ast" - "go/build" - "go/doc" - "go/importer" - "go/parser" - "go/token" - "go/types" - "io" - "io/ioutil" - "log" - "os" - "path" - "strings" - "text/template" - - "github.com/ernesto-jimenez/gogen/imports" -) - -var ( - pkg = flag.String("assert-path", "github.com/stretchr/testify/assert", "Path to the assert package") - outputPkg = flag.String("output-package", "", "package for the resulting code") - tmplFile = flag.String("template", "", "What file to load the function template from") - out = flag.String("out", "", "What file to write the source code to") -) - -func main() { - flag.Parse() - - scope, docs, err := parsePackageSource(*pkg) - if err != nil { - log.Fatal(err) - } - - importer, funcs, err := analyzeCode(scope, docs) - if err != nil { - log.Fatal(err) - } - - if err := generateCode(importer, funcs); err != nil { - log.Fatal(err) - } -} - -func generateCode(importer imports.Importer, funcs []testFunc) error { - buff := bytes.NewBuffer(nil) - - tmplHead, tmplFunc, err := parseTemplates() - if err != nil { - return err - } - - // Generate header - if err := tmplHead.Execute(buff, struct { - Name string - Imports map[string]string - }{ - *outputPkg, - importer.Imports(), - }); err != nil { - return err - } - - // Generate funcs - for _, fn := range funcs { - buff.Write([]byte("\n\n")) - if err := tmplFunc.Execute(buff, &fn); err != nil { - return err - } - } - - // Write file - output, err := outputFile() - if err != nil { - return err - } - defer output.Close() - _, err = io.Copy(output, buff) - return err -} - -func parseTemplates() (*template.Template, *template.Template, error) { - tmplHead, err := template.New("header").Parse(headerTemplate) - if err != nil { - return nil, nil, err - } - if *tmplFile != "" { - f, err := ioutil.ReadFile(*tmplFile) - if err != nil { - return nil, nil, err - } - funcTemplate = string(f) - } - tmpl, err := template.New("function").Parse(funcTemplate) - if err != nil { - return nil, nil, err - } - return tmplHead, tmpl, nil -} - -func outputFile() (*os.File, error) { - filename := *out - if filename == "-" || (filename == "" && *tmplFile == "") { - return os.Stdout, nil - } - if filename == "" { - filename = strings.TrimSuffix(strings.TrimSuffix(*tmplFile, ".tmpl"), ".go") + ".go" - } - return os.Create(filename) -} - -// analyzeCode takes the types scope and the docs and returns the import -// information and information about all the assertion functions. -func analyzeCode(scope *types.Scope, docs *doc.Package) (imports.Importer, []testFunc, error) { - testingT := scope.Lookup("TestingT").Type().Underlying().(*types.Interface) - - importer := imports.New(*outputPkg) - var funcs []testFunc - // Go through all the top level functions - for _, fdocs := range docs.Funcs { - // Find the function - obj := scope.Lookup(fdocs.Name) - - fn, ok := obj.(*types.Func) - if !ok { - continue - } - // Check function signatuer has at least two arguments - sig := fn.Type().(*types.Signature) - if sig.Params().Len() < 2 { - continue - } - // Check first argument is of type testingT - first, ok := sig.Params().At(0).Type().(*types.Named) - if !ok { - continue - } - firstType, ok := first.Underlying().(*types.Interface) - if !ok { - continue - } - if !types.Implements(firstType, testingT) { - continue - } - - funcs = append(funcs, testFunc{*outputPkg, fdocs, fn}) - importer.AddImportsFrom(sig.Params()) - } - return importer, funcs, nil -} - -// parsePackageSource returns the types scope and the package documentation from the pa -func parsePackageSource(pkg string) (*types.Scope, *doc.Package, error) { - pd, err := build.Import(pkg, ".", 0) - if err != nil { - return nil, nil, err - } - - fset := token.NewFileSet() - files := make(map[string]*ast.File) - fileList := make([]*ast.File, len(pd.GoFiles)) - for i, fname := range pd.GoFiles { - src, err := ioutil.ReadFile(path.Join(pd.SrcRoot, pd.ImportPath, fname)) - if err != nil { - return nil, nil, err - } - f, err := parser.ParseFile(fset, fname, src, parser.ParseComments|parser.AllErrors) - if err != nil { - return nil, nil, err - } - files[fname] = f - fileList[i] = f - } - - cfg := types.Config{ - Importer: importer.Default(), - } - info := types.Info{ - Defs: make(map[*ast.Ident]types.Object), - } - tp, err := cfg.Check(pkg, fset, fileList, &info) - if err != nil { - return nil, nil, err - } - - scope := tp.Scope() - - ap, _ := ast.NewPackage(fset, files, nil, nil) - docs := doc.New(ap, pkg, 0) - - return scope, docs, nil -} - -type testFunc struct { - CurrentPkg string - DocInfo *doc.Func - TypeInfo *types.Func -} - -func (f *testFunc) Qualifier(p *types.Package) string { - if p == nil || p.Name() == f.CurrentPkg { - return "" - } - return p.Name() -} - -func (f *testFunc) Params() string { - sig := f.TypeInfo.Type().(*types.Signature) - params := sig.Params() - p := "" - comma := "" - to := params.Len() - var i int - - if sig.Variadic() { - to-- - } - for i = 1; i < to; i++ { - param := params.At(i) - p += fmt.Sprintf("%s%s %s", comma, param.Name(), types.TypeString(param.Type(), f.Qualifier)) - comma = ", " - } - if sig.Variadic() { - param := params.At(params.Len() - 1) - p += fmt.Sprintf("%s%s ...%s", comma, param.Name(), types.TypeString(param.Type().(*types.Slice).Elem(), f.Qualifier)) - } - return p -} - -func (f *testFunc) ForwardedParams() string { - sig := f.TypeInfo.Type().(*types.Signature) - params := sig.Params() - p := "" - comma := "" - to := params.Len() - var i int - - if sig.Variadic() { - to-- - } - for i = 1; i < to; i++ { - param := params.At(i) - p += fmt.Sprintf("%s%s", comma, param.Name()) - comma = ", " - } - if sig.Variadic() { - param := params.At(params.Len() - 1) - p += fmt.Sprintf("%s%s...", comma, param.Name()) - } - return p -} - -func (f *testFunc) Comment() string { - return "// " + strings.Replace(strings.TrimSpace(f.DocInfo.Doc), "\n", "\n// ", -1) -} - -func (f *testFunc) CommentWithoutT(receiver string) string { - search := fmt.Sprintf("assert.%s(t, ", f.DocInfo.Name) - replace := fmt.Sprintf("%s.%s(", receiver, f.DocInfo.Name) - return strings.Replace(f.Comment(), search, replace, -1) -} - -var headerTemplate = `/* -* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen -* THIS FILE MUST NOT BE EDITED BY HAND -*/ - -package {{.Name}} - -import ( -{{range $path, $name := .Imports}} - {{$name}} "{{$path}}"{{end}} -) -` - -var funcTemplate = `{{.Comment}} -func (fwd *AssertionsForwarder) {{.DocInfo.Name}}({{.Params}}) bool { - return assert.{{.DocInfo.Name}}({{.ForwardedParams}}) -}` diff --git a/vendor/github.com/stretchr/testify/http/doc.go b/vendor/github.com/stretchr/testify/http/doc.go deleted file mode 100644 index 695167c6d..000000000 --- a/vendor/github.com/stretchr/testify/http/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package http DEPRECATED USE net/http/httptest -package http diff --git a/vendor/github.com/stretchr/testify/http/test_response_writer.go b/vendor/github.com/stretchr/testify/http/test_response_writer.go deleted file mode 100644 index 5c3f813fa..000000000 --- a/vendor/github.com/stretchr/testify/http/test_response_writer.go +++ /dev/null @@ -1,49 +0,0 @@ -package http - -import ( - "net/http" -) - -// TestResponseWriter DEPRECATED: We recommend you use http://golang.org/pkg/net/http/httptest instead. -type TestResponseWriter struct { - - // StatusCode is the last int written by the call to WriteHeader(int) - StatusCode int - - // Output is a string containing the written bytes using the Write([]byte) func. - Output string - - // header is the internal storage of the http.Header object - header http.Header -} - -// Header DEPRECATED: We recommend you use http://golang.org/pkg/net/http/httptest instead. -func (rw *TestResponseWriter) Header() http.Header { - - if rw.header == nil { - rw.header = make(http.Header) - } - - return rw.header -} - -// Write DEPRECATED: We recommend you use http://golang.org/pkg/net/http/httptest instead. -func (rw *TestResponseWriter) Write(bytes []byte) (int, error) { - - // assume 200 success if no header has been set - if rw.StatusCode == 0 { - rw.WriteHeader(200) - } - - // add these bytes to the output string - rw.Output = rw.Output + string(bytes) - - // return normal values - return 0, nil - -} - -// WriteHeader DEPRECATED: We recommend you use http://golang.org/pkg/net/http/httptest instead. -func (rw *TestResponseWriter) WriteHeader(i int) { - rw.StatusCode = i -} diff --git a/vendor/github.com/stretchr/testify/http/test_round_tripper.go b/vendor/github.com/stretchr/testify/http/test_round_tripper.go deleted file mode 100644 index b1e32f1d8..000000000 --- a/vendor/github.com/stretchr/testify/http/test_round_tripper.go +++ /dev/null @@ -1,17 +0,0 @@ -package http - -import ( - "github.com/stretchr/testify/mock" - "net/http" -) - -// TestRoundTripper DEPRECATED USE net/http/httptest -type TestRoundTripper struct { - mock.Mock -} - -// RoundTrip DEPRECATED USE net/http/httptest -func (t *TestRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - args := t.Called(req) - return args.Get(0).(*http.Response), args.Error(1) -} diff --git a/vendor/github.com/stretchr/testify/mock/doc.go b/vendor/github.com/stretchr/testify/mock/doc.go deleted file mode 100644 index 7324128ef..000000000 --- a/vendor/github.com/stretchr/testify/mock/doc.go +++ /dev/null @@ -1,44 +0,0 @@ -// Package mock provides a system by which it is possible to mock your objects -// and verify calls are happening as expected. -// -// Example Usage -// -// The mock package provides an object, Mock, that tracks activity on another object. It is usually -// embedded into a test object as shown below: -// -// type MyTestObject struct { -// // add a Mock object instance -// mock.Mock -// -// // other fields go here as normal -// } -// -// When implementing the methods of an interface, you wire your functions up -// to call the Mock.Called(args...) method, and return the appropriate values. -// -// For example, to mock a method that saves the name and age of a person and returns -// the year of their birth or an error, you might write this: -// -// func (o *MyTestObject) SavePersonDetails(firstname, lastname string, age int) (int, error) { -// args := o.Called(firstname, lastname, age) -// return args.Int(0), args.Error(1) -// } -// -// The Int, Error and Bool methods are examples of strongly typed getters that take the argument -// index position. Given this argument list: -// -// (12, true, "Something") -// -// You could read them out strongly typed like this: -// -// args.Int(0) -// args.Bool(1) -// args.String(2) -// -// For objects of your own type, use the generic Arguments.Get(index) method and make a type assertion: -// -// return args.Get(0).(*MyObject), args.Get(1).(*AnotherObjectOfMine) -// -// This may cause a panic if the object you are getting is nil (the type assertion will fail), in those -// cases you should check for nil first. -package mock diff --git a/vendor/github.com/stretchr/testify/mock/mock.go b/vendor/github.com/stretchr/testify/mock/mock.go deleted file mode 100644 index 20d7b8b1f..000000000 --- a/vendor/github.com/stretchr/testify/mock/mock.go +++ /dev/null @@ -1,763 +0,0 @@ -package mock - -import ( - "fmt" - "reflect" - "regexp" - "runtime" - "strings" - "sync" - "time" - - "github.com/davecgh/go-spew/spew" - "github.com/pmezard/go-difflib/difflib" - "github.com/stretchr/objx" - "github.com/stretchr/testify/assert" -) - -func inin() { - spew.Config.SortKeys = true -} - -// TestingT is an interface wrapper around *testing.T -type TestingT interface { - Logf(format string, args ...interface{}) - Errorf(format string, args ...interface{}) - FailNow() -} - -/* - Call -*/ - -// Call represents a method call and is used for setting expectations, -// as well as recording activity. -type Call struct { - Parent *Mock - - // The name of the method that was or will be called. - Method string - - // Holds the arguments of the method. - Arguments Arguments - - // Holds the arguments that should be returned when - // this method is called. - ReturnArguments Arguments - - // The number of times to return the return arguments when setting - // expectations. 0 means to always return the value. - Repeatability int - - // Amount of times this call has been called - totalCalls int - - // Holds a channel that will be used to block the Return until it either - // receives a message or is closed. nil means it returns immediately. - WaitFor <-chan time.Time - - // Holds a handler used to manipulate arguments content that are passed by - // reference. It's useful when mocking methods such as unmarshalers or - // decoders. - RunFn func(Arguments) -} - -func newCall(parent *Mock, methodName string, methodArguments ...interface{}) *Call { - return &Call{ - Parent: parent, - Method: methodName, - Arguments: methodArguments, - ReturnArguments: make([]interface{}, 0), - Repeatability: 0, - WaitFor: nil, - RunFn: nil, - } -} - -func (c *Call) lock() { - c.Parent.mutex.Lock() -} - -func (c *Call) unlock() { - c.Parent.mutex.Unlock() -} - -// Return specifies the return arguments for the expectation. -// -// Mock.On("DoSomething").Return(errors.New("failed")) -func (c *Call) Return(returnArguments ...interface{}) *Call { - c.lock() - defer c.unlock() - - c.ReturnArguments = returnArguments - - return c -} - -// Once indicates that that the mock should only return the value once. -// -// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Once() -func (c *Call) Once() *Call { - return c.Times(1) -} - -// Twice indicates that that the mock should only return the value twice. -// -// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Twice() -func (c *Call) Twice() *Call { - return c.Times(2) -} - -// Times indicates that that the mock should only return the indicated number -// of times. -// -// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Times(5) -func (c *Call) Times(i int) *Call { - c.lock() - defer c.unlock() - c.Repeatability = i - return c -} - -// WaitUntil sets the channel that will block the mock's return until its closed -// or a message is received. -// -// Mock.On("MyMethod", arg1, arg2).WaitUntil(time.After(time.Second)) -func (c *Call) WaitUntil(w <-chan time.Time) *Call { - c.lock() - defer c.unlock() - c.WaitFor = w - return c -} - -// After sets how long to block until the call returns -// -// Mock.On("MyMethod", arg1, arg2).After(time.Second) -func (c *Call) After(d time.Duration) *Call { - return c.WaitUntil(time.After(d)) -} - -// Run sets a handler to be called before returning. It can be used when -// mocking a method such as unmarshalers that takes a pointer to a struct and -// sets properties in such struct -// -// Mock.On("Unmarshal", AnythingOfType("*map[string]interface{}").Return().Run(func(args Arguments) { -// arg := args.Get(0).(*map[string]interface{}) -// arg["foo"] = "bar" -// }) -func (c *Call) Run(fn func(Arguments)) *Call { - c.lock() - defer c.unlock() - c.RunFn = fn - return c -} - -// On chains a new expectation description onto the mocked interface. This -// allows syntax like. -// -// Mock. -// On("MyMethod", 1).Return(nil). -// On("MyOtherMethod", 'a', 'b', 'c').Return(errors.New("Some Error")) -func (c *Call) On(methodName string, arguments ...interface{}) *Call { - return c.Parent.On(methodName, arguments...) -} - -// Mock is the workhorse used to track activity on another object. -// For an example of its usage, refer to the "Example Usage" section at the top -// of this document. -type Mock struct { - // Represents the calls that are expected of - // an object. - ExpectedCalls []*Call - - // Holds the calls that were made to this mocked object. - Calls []Call - - // TestData holds any data that might be useful for testing. Testify ignores - // this data completely allowing you to do whatever you like with it. - testData objx.Map - - mutex sync.Mutex -} - -// TestData holds any data that might be useful for testing. Testify ignores -// this data completely allowing you to do whatever you like with it. -func (m *Mock) TestData() objx.Map { - - if m.testData == nil { - m.testData = make(objx.Map) - } - - return m.testData -} - -/* - Setting expectations -*/ - -// On starts a description of an expectation of the specified method -// being called. -// -// Mock.On("MyMethod", arg1, arg2) -func (m *Mock) On(methodName string, arguments ...interface{}) *Call { - for _, arg := range arguments { - if v := reflect.ValueOf(arg); v.Kind() == reflect.Func { - panic(fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg)) - } - } - - m.mutex.Lock() - defer m.mutex.Unlock() - c := newCall(m, methodName, arguments...) - m.ExpectedCalls = append(m.ExpectedCalls, c) - return c -} - -// /* -// Recording and responding to activity -// */ - -func (m *Mock) findExpectedCall(method string, arguments ...interface{}) (int, *Call) { - m.mutex.Lock() - defer m.mutex.Unlock() - for i, call := range m.ExpectedCalls { - if call.Method == method && call.Repeatability > -1 { - - _, diffCount := call.Arguments.Diff(arguments) - if diffCount == 0 { - return i, call - } - - } - } - return -1, nil -} - -func (m *Mock) findClosestCall(method string, arguments ...interface{}) (bool, *Call) { - diffCount := 0 - var closestCall *Call - - for _, call := range m.expectedCalls() { - if call.Method == method { - - _, tempDiffCount := call.Arguments.Diff(arguments) - if tempDiffCount < diffCount || diffCount == 0 { - diffCount = tempDiffCount - closestCall = call - } - - } - } - - if closestCall == nil { - return false, nil - } - - return true, closestCall -} - -func callString(method string, arguments Arguments, includeArgumentValues bool) string { - - var argValsString string - if includeArgumentValues { - var argVals []string - for argIndex, arg := range arguments { - argVals = append(argVals, fmt.Sprintf("%d: %#v", argIndex, arg)) - } - argValsString = fmt.Sprintf("\n\t\t%s", strings.Join(argVals, "\n\t\t")) - } - - return fmt.Sprintf("%s(%s)%s", method, arguments.String(), argValsString) -} - -// Called tells the mock object that a method has been called, and gets an array -// of arguments to return. Panics if the call is unexpected (i.e. not preceded by -// appropriate .On .Return() calls) -// If Call.WaitFor is set, blocks until the channel is closed or receives a message. -func (m *Mock) Called(arguments ...interface{}) Arguments { - // get the calling function's name - pc, _, _, ok := runtime.Caller(1) - if !ok { - panic("Couldn't get the caller information") - } - functionPath := runtime.FuncForPC(pc).Name() - //Next four lines are required to use GCCGO function naming conventions. - //For Ex: github_com_docker_libkv_store_mock.WatchTree.pN39_github_com_docker_libkv_store_mock.Mock - //uses inteface information unlike golang github.com/docker/libkv/store/mock.(*Mock).WatchTree - //With GCCGO we need to remove interface information starting from pN
. - re := regexp.MustCompile("\\.pN\\d+_") - if re.MatchString(functionPath) { - functionPath = re.Split(functionPath, -1)[0] - } - parts := strings.Split(functionPath, ".") - functionName := parts[len(parts)-1] - - found, call := m.findExpectedCall(functionName, arguments...) - - if found < 0 { - // we have to fail here - because we don't know what to do - // as the return arguments. This is because: - // - // a) this is a totally unexpected call to this method, - // b) the arguments are not what was expected, or - // c) the developer has forgotten to add an accompanying On...Return pair. - - closestFound, closestCall := m.findClosestCall(functionName, arguments...) - - if closestFound { - panic(fmt.Sprintf("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\n", callString(functionName, arguments, true), callString(functionName, closestCall.Arguments, true), diffArguments(arguments, closestCall.Arguments))) - } else { - panic(fmt.Sprintf("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", functionName, functionName, callString(functionName, arguments, true), assert.CallerInfo())) - } - } else { - m.mutex.Lock() - switch { - case call.Repeatability == 1: - call.Repeatability = -1 - call.totalCalls++ - - case call.Repeatability > 1: - call.Repeatability-- - call.totalCalls++ - - case call.Repeatability == 0: - call.totalCalls++ - } - m.mutex.Unlock() - } - - // add the call - m.mutex.Lock() - m.Calls = append(m.Calls, *newCall(m, functionName, arguments...)) - m.mutex.Unlock() - - // block if specified - if call.WaitFor != nil { - <-call.WaitFor - } - - if call.RunFn != nil { - call.RunFn(arguments) - } - - return call.ReturnArguments -} - -/* - Assertions -*/ - -type assertExpectationser interface { - AssertExpectations(TestingT) bool -} - -// AssertExpectationsForObjects asserts that everything specified with On and Return -// of the specified objects was in fact called as expected. -// -// Calls may have occurred in any order. -func AssertExpectationsForObjects(t TestingT, testObjects ...interface{}) bool { - for _, obj := range testObjects { - if m, ok := obj.(Mock); ok { - t.Logf("Deprecated mock.AssertExpectationsForObjects(myMock.Mock) use mock.AssertExpectationsForObjects(myMock)") - obj = &m - } - m := obj.(assertExpectationser) - if !m.AssertExpectations(t) { - return false - } - } - return true -} - -// AssertExpectations asserts that everything specified with On and Return was -// in fact called as expected. Calls may have occurred in any order. -func (m *Mock) AssertExpectations(t TestingT) bool { - var somethingMissing bool - var failedExpectations int - - // iterate through each expectation - expectedCalls := m.expectedCalls() - for _, expectedCall := range expectedCalls { - if !m.methodWasCalled(expectedCall.Method, expectedCall.Arguments) && expectedCall.totalCalls == 0 { - somethingMissing = true - failedExpectations++ - t.Logf("\u274C\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String()) - } else { - m.mutex.Lock() - if expectedCall.Repeatability > 0 { - somethingMissing = true - failedExpectations++ - } else { - t.Logf("\u2705\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String()) - } - m.mutex.Unlock() - } - } - - if somethingMissing { - t.Errorf("FAIL: %d out of %d expectation(s) were met.\n\tThe code you are testing needs to make %d more call(s).\n\tat: %s", len(expectedCalls)-failedExpectations, len(expectedCalls), failedExpectations, assert.CallerInfo()) - } - - return !somethingMissing -} - -// AssertNumberOfCalls asserts that the method was called expectedCalls times. -func (m *Mock) AssertNumberOfCalls(t TestingT, methodName string, expectedCalls int) bool { - var actualCalls int - for _, call := range m.calls() { - if call.Method == methodName { - actualCalls++ - } - } - return assert.Equal(t, expectedCalls, actualCalls, fmt.Sprintf("Expected number of calls (%d) does not match the actual number of calls (%d).", expectedCalls, actualCalls)) -} - -// AssertCalled asserts that the method was called. -// It can produce a false result when an argument is a pointer type and the underlying value changed after calling the mocked method. -func (m *Mock) AssertCalled(t TestingT, methodName string, arguments ...interface{}) bool { - if !assert.True(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method should have been called with %d argument(s), but was not.", methodName, len(arguments))) { - t.Logf("%v", m.expectedCalls()) - return false - } - return true -} - -// AssertNotCalled asserts that the method was not called. -// It can produce a false result when an argument is a pointer type and the underlying value changed after calling the mocked method. -func (m *Mock) AssertNotCalled(t TestingT, methodName string, arguments ...interface{}) bool { - if !assert.False(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method was called with %d argument(s), but should NOT have been.", methodName, len(arguments))) { - t.Logf("%v", m.expectedCalls()) - return false - } - return true -} - -func (m *Mock) methodWasCalled(methodName string, expected []interface{}) bool { - for _, call := range m.calls() { - if call.Method == methodName { - - _, differences := Arguments(expected).Diff(call.Arguments) - - if differences == 0 { - // found the expected call - return true - } - - } - } - // we didn't find the expected call - return false -} - -func (m *Mock) expectedCalls() []*Call { - m.mutex.Lock() - defer m.mutex.Unlock() - return append([]*Call{}, m.ExpectedCalls...) -} - -func (m *Mock) calls() []Call { - m.mutex.Lock() - defer m.mutex.Unlock() - return append([]Call{}, m.Calls...) -} - -/* - Arguments -*/ - -// Arguments holds an array of method arguments or return values. -type Arguments []interface{} - -const ( - // Anything is used in Diff and Assert when the argument being tested - // shouldn't be taken into consideration. - Anything string = "mock.Anything" -) - -// AnythingOfTypeArgument is a string that contains the type of an argument -// for use when type checking. Used in Diff and Assert. -type AnythingOfTypeArgument string - -// AnythingOfType returns an AnythingOfTypeArgument object containing the -// name of the type to check for. Used in Diff and Assert. -// -// For example: -// Assert(t, AnythingOfType("string"), AnythingOfType("int")) -func AnythingOfType(t string) AnythingOfTypeArgument { - return AnythingOfTypeArgument(t) -} - -// argumentMatcher performs custom argument matching, returning whether or -// not the argument is matched by the expectation fixture function. -type argumentMatcher struct { - // fn is a function which accepts one argument, and returns a bool. - fn reflect.Value -} - -func (f argumentMatcher) Matches(argument interface{}) bool { - expectType := f.fn.Type().In(0) - - if reflect.TypeOf(argument).AssignableTo(expectType) { - result := f.fn.Call([]reflect.Value{reflect.ValueOf(argument)}) - return result[0].Bool() - } - return false -} - -func (f argumentMatcher) String() string { - return fmt.Sprintf("func(%s) bool", f.fn.Type().In(0).Name()) -} - -// MatchedBy can be used to match a mock call based on only certain properties -// from a complex struct or some calculation. It takes a function that will be -// evaluated with the called argument and will return true when there's a match -// and false otherwise. -// -// Example: -// m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" })) -// -// |fn|, must be a function accepting a single argument (of the expected type) -// which returns a bool. If |fn| doesn't match the required signature, -// MathedBy() panics. -func MatchedBy(fn interface{}) argumentMatcher { - fnType := reflect.TypeOf(fn) - - if fnType.Kind() != reflect.Func { - panic(fmt.Sprintf("assert: arguments: %s is not a func", fn)) - } - if fnType.NumIn() != 1 { - panic(fmt.Sprintf("assert: arguments: %s does not take exactly one argument", fn)) - } - if fnType.NumOut() != 1 || fnType.Out(0).Kind() != reflect.Bool { - panic(fmt.Sprintf("assert: arguments: %s does not return a bool", fn)) - } - - return argumentMatcher{fn: reflect.ValueOf(fn)} -} - -// Get Returns the argument at the specified index. -func (args Arguments) Get(index int) interface{} { - if index+1 > len(args) { - panic(fmt.Sprintf("assert: arguments: Cannot call Get(%d) because there are %d argument(s).", index, len(args))) - } - return args[index] -} - -// Is gets whether the objects match the arguments specified. -func (args Arguments) Is(objects ...interface{}) bool { - for i, obj := range args { - if obj != objects[i] { - return false - } - } - return true -} - -// Diff gets a string describing the differences between the arguments -// and the specified objects. -// -// Returns the diff string and number of differences found. -func (args Arguments) Diff(objects []interface{}) (string, int) { - - var output = "\n" - var differences int - - var maxArgCount = len(args) - if len(objects) > maxArgCount { - maxArgCount = len(objects) - } - - for i := 0; i < maxArgCount; i++ { - var actual, expected interface{} - - if len(objects) <= i { - actual = "(Missing)" - } else { - actual = objects[i] - } - - if len(args) <= i { - expected = "(Missing)" - } else { - expected = args[i] - } - - if matcher, ok := expected.(argumentMatcher); ok { - if matcher.Matches(actual) { - output = fmt.Sprintf("%s\t%d: \u2705 %s matched by %s\n", output, i, actual, matcher) - } else { - differences++ - output = fmt.Sprintf("%s\t%d: \u2705 %s not matched by %s\n", output, i, actual, matcher) - } - } else if reflect.TypeOf(expected) == reflect.TypeOf((*AnythingOfTypeArgument)(nil)).Elem() { - - // type checking - if reflect.TypeOf(actual).Name() != string(expected.(AnythingOfTypeArgument)) && reflect.TypeOf(actual).String() != string(expected.(AnythingOfTypeArgument)) { - // not match - differences++ - output = fmt.Sprintf("%s\t%d: \u274C type %s != type %s - %s\n", output, i, expected, reflect.TypeOf(actual).Name(), actual) - } - - } else { - - // normal checking - - if assert.ObjectsAreEqual(expected, Anything) || assert.ObjectsAreEqual(actual, Anything) || assert.ObjectsAreEqual(actual, expected) { - // match - output = fmt.Sprintf("%s\t%d: \u2705 %s == %s\n", output, i, actual, expected) - } else { - // not match - differences++ - output = fmt.Sprintf("%s\t%d: \u274C %s != %s\n", output, i, actual, expected) - } - } - - } - - if differences == 0 { - return "No differences.", differences - } - - return output, differences - -} - -// Assert compares the arguments with the specified objects and fails if -// they do not exactly match. -func (args Arguments) Assert(t TestingT, objects ...interface{}) bool { - - // get the differences - diff, diffCount := args.Diff(objects) - - if diffCount == 0 { - return true - } - - // there are differences... report them... - t.Logf(diff) - t.Errorf("%sArguments do not match.", assert.CallerInfo()) - - return false - -} - -// String gets the argument at the specified index. Panics if there is no argument, or -// if the argument is of the wrong type. -// -// If no index is provided, String() returns a complete string representation -// of the arguments. -func (args Arguments) String(indexOrNil ...int) string { - - if len(indexOrNil) == 0 { - // normal String() method - return a string representation of the args - var argsStr []string - for _, arg := range args { - argsStr = append(argsStr, fmt.Sprintf("%s", reflect.TypeOf(arg))) - } - return strings.Join(argsStr, ",") - } else if len(indexOrNil) == 1 { - // Index has been specified - get the argument at that index - var index = indexOrNil[0] - var s string - var ok bool - if s, ok = args.Get(index).(string); !ok { - panic(fmt.Sprintf("assert: arguments: String(%d) failed because object wasn't correct type: %s", index, args.Get(index))) - } - return s - } - - panic(fmt.Sprintf("assert: arguments: Wrong number of arguments passed to String. Must be 0 or 1, not %d", len(indexOrNil))) - -} - -// Int gets the argument at the specified index. Panics if there is no argument, or -// if the argument is of the wrong type. -func (args Arguments) Int(index int) int { - var s int - var ok bool - if s, ok = args.Get(index).(int); !ok { - panic(fmt.Sprintf("assert: arguments: Int(%d) failed because object wasn't correct type: %v", index, args.Get(index))) - } - return s -} - -// Error gets the argument at the specified index. Panics if there is no argument, or -// if the argument is of the wrong type. -func (args Arguments) Error(index int) error { - obj := args.Get(index) - var s error - var ok bool - if obj == nil { - return nil - } - if s, ok = obj.(error); !ok { - panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, args.Get(index))) - } - return s -} - -// Bool gets the argument at the specified index. Panics if there is no argument, or -// if the argument is of the wrong type. -func (args Arguments) Bool(index int) bool { - var s bool - var ok bool - if s, ok = args.Get(index).(bool); !ok { - panic(fmt.Sprintf("assert: arguments: Bool(%d) failed because object wasn't correct type: %v", index, args.Get(index))) - } - return s -} - -func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { - t := reflect.TypeOf(v) - k := t.Kind() - - if k == reflect.Ptr { - t = t.Elem() - k = t.Kind() - } - return t, k -} - -func diffArguments(expected Arguments, actual Arguments) string { - for x := range expected { - if diffString := diff(expected[x], actual[x]); diffString != "" { - return fmt.Sprintf("Difference found in argument %v:\n\n%s", x, diffString) - } - } - - return "" -} - -// diff returns a diff of both values as long as both are of the same type and -// are a struct, map, slice or array. Otherwise it returns an empty string. -func diff(expected interface{}, actual interface{}) string { - if expected == nil || actual == nil { - return "" - } - - et, ek := typeAndKind(expected) - at, _ := typeAndKind(actual) - - if et != at { - return "" - } - - if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array { - return "" - } - - e := spew.Sdump(expected) - a := spew.Sdump(actual) - - diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ - A: difflib.SplitLines(e), - B: difflib.SplitLines(a), - FromFile: "Expected", - FromDate: "", - ToFile: "Actual", - ToDate: "", - Context: 1, - }) - - return diff -} diff --git a/vendor/github.com/stretchr/testify/mock/mock_test.go b/vendor/github.com/stretchr/testify/mock/mock_test.go deleted file mode 100644 index 8cb4615db..000000000 --- a/vendor/github.com/stretchr/testify/mock/mock_test.go +++ /dev/null @@ -1,1132 +0,0 @@ -package mock - -import ( - "errors" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "testing" - "time" -) - -/* - Test objects -*/ - -// ExampleInterface represents an example interface. -type ExampleInterface interface { - TheExampleMethod(a, b, c int) (int, error) -} - -// TestExampleImplementation is a test implementation of ExampleInterface -type TestExampleImplementation struct { - Mock -} - -func (i *TestExampleImplementation) TheExampleMethod(a, b, c int) (int, error) { - args := i.Called(a, b, c) - return args.Int(0), errors.New("Whoops") -} - -func (i *TestExampleImplementation) TheExampleMethod2(yesorno bool) { - i.Called(yesorno) -} - -type ExampleType struct { - ran bool -} - -func (i *TestExampleImplementation) TheExampleMethod3(et *ExampleType) error { - args := i.Called(et) - return args.Error(0) -} - -func (i *TestExampleImplementation) TheExampleMethodFunc(fn func(string) error) error { - args := i.Called(fn) - return args.Error(0) -} - -func (i *TestExampleImplementation) TheExampleMethodVariadic(a ...int) error { - args := i.Called(a) - return args.Error(0) -} - -func (i *TestExampleImplementation) TheExampleMethodVariadicInterface(a ...interface{}) error { - args := i.Called(a) - return args.Error(0) -} - -type ExampleFuncType func(string) error - -func (i *TestExampleImplementation) TheExampleMethodFuncType(fn ExampleFuncType) error { - args := i.Called(fn) - return args.Error(0) -} - -/* - Mock -*/ - -func Test_Mock_TestData(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - if assert.NotNil(t, mockedService.TestData()) { - - mockedService.TestData().Set("something", 123) - assert.Equal(t, 123, mockedService.TestData().Get("something").Data()) - } -} - -func Test_Mock_On(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService.On("TheExampleMethod") - assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - assert.Equal(t, "TheExampleMethod", c.Method) -} - -func Test_Mock_Chained_On(t *testing.T) { - // make a test impl object - var mockedService = new(TestExampleImplementation) - - mockedService. - On("TheExampleMethod", 1, 2, 3). - Return(0). - On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")). - Return(nil) - - expectedCalls := []*Call{ - &Call{ - Parent: &mockedService.Mock, - Method: "TheExampleMethod", - Arguments: []interface{}{1, 2, 3}, - ReturnArguments: []interface{}{0}, - }, - &Call{ - Parent: &mockedService.Mock, - Method: "TheExampleMethod3", - Arguments: []interface{}{AnythingOfType("*mock.ExampleType")}, - ReturnArguments: []interface{}{nil}, - }, - } - assert.Equal(t, expectedCalls, mockedService.ExpectedCalls) -} - -func Test_Mock_On_WithArgs(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService.On("TheExampleMethod", 1, 2, 3, 4) - - assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - assert.Equal(t, "TheExampleMethod", c.Method) - assert.Equal(t, Arguments{1, 2, 3, 4}, c.Arguments) -} - -func Test_Mock_On_WithFuncArg(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService. - On("TheExampleMethodFunc", AnythingOfType("func(string) error")). - Return(nil) - - assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - assert.Equal(t, "TheExampleMethodFunc", c.Method) - assert.Equal(t, 1, len(c.Arguments)) - assert.Equal(t, AnythingOfType("func(string) error"), c.Arguments[0]) - - fn := func(string) error { return nil } - - assert.NotPanics(t, func() { - mockedService.TheExampleMethodFunc(fn) - }) -} - -func Test_Mock_On_WithIntArgMatcher(t *testing.T) { - var mockedService TestExampleImplementation - - mockedService.On("TheExampleMethod", - MatchedBy(func(a int) bool { - return a == 1 - }), MatchedBy(func(b int) bool { - return b == 2 - }), MatchedBy(func(c int) bool { - return c == 3 - })).Return(0, nil) - - assert.Panics(t, func() { - mockedService.TheExampleMethod(1, 2, 4) - }) - assert.Panics(t, func() { - mockedService.TheExampleMethod(2, 2, 3) - }) - assert.NotPanics(t, func() { - mockedService.TheExampleMethod(1, 2, 3) - }) -} - -func Test_Mock_On_WithPtrArgMatcher(t *testing.T) { - var mockedService TestExampleImplementation - - mockedService.On("TheExampleMethod3", - MatchedBy(func(a *ExampleType) bool { return a.ran == true }), - ).Return(nil) - - mockedService.On("TheExampleMethod3", - MatchedBy(func(a *ExampleType) bool { return a.ran == false }), - ).Return(errors.New("error")) - - assert.Equal(t, mockedService.TheExampleMethod3(&ExampleType{true}), nil) - assert.EqualError(t, mockedService.TheExampleMethod3(&ExampleType{false}), "error") -} - -func Test_Mock_On_WithFuncArgMatcher(t *testing.T) { - var mockedService TestExampleImplementation - - fixture1, fixture2 := errors.New("fixture1"), errors.New("fixture2") - - mockedService.On("TheExampleMethodFunc", - MatchedBy(func(a func(string) error) bool { return a("string") == fixture1 }), - ).Return(errors.New("fixture1")) - - mockedService.On("TheExampleMethodFunc", - MatchedBy(func(a func(string) error) bool { return a("string") == fixture2 }), - ).Return(errors.New("fixture2")) - - assert.EqualError(t, mockedService.TheExampleMethodFunc( - func(string) error { return fixture1 }), "fixture1") - assert.EqualError(t, mockedService.TheExampleMethodFunc( - func(string) error { return fixture2 }), "fixture2") -} - -func Test_Mock_On_WithVariadicFunc(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService. - On("TheExampleMethodVariadic", []int{1, 2, 3}). - Return(nil) - - assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - assert.Equal(t, 1, len(c.Arguments)) - assert.Equal(t, []int{1, 2, 3}, c.Arguments[0]) - - assert.NotPanics(t, func() { - mockedService.TheExampleMethodVariadic(1, 2, 3) - }) - assert.Panics(t, func() { - mockedService.TheExampleMethodVariadic(1, 2) - }) - -} - -func Test_Mock_On_WithVariadicFuncWithInterface(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService.On("TheExampleMethodVariadicInterface", []interface{}{1, 2, 3}). - Return(nil) - - assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - assert.Equal(t, 1, len(c.Arguments)) - assert.Equal(t, []interface{}{1, 2, 3}, c.Arguments[0]) - - assert.NotPanics(t, func() { - mockedService.TheExampleMethodVariadicInterface(1, 2, 3) - }) - assert.Panics(t, func() { - mockedService.TheExampleMethodVariadicInterface(1, 2) - }) - -} - -func Test_Mock_On_WithVariadicFuncWithEmptyInterfaceArray(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - var expected []interface{} - c := mockedService. - On("TheExampleMethodVariadicInterface", expected). - Return(nil) - - assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - assert.Equal(t, 1, len(c.Arguments)) - assert.Equal(t, expected, c.Arguments[0]) - - assert.NotPanics(t, func() { - mockedService.TheExampleMethodVariadicInterface() - }) - assert.Panics(t, func() { - mockedService.TheExampleMethodVariadicInterface(1, 2) - }) - -} - -func Test_Mock_On_WithFuncPanics(t *testing.T) { - // make a test impl object - var mockedService = new(TestExampleImplementation) - - assert.Panics(t, func() { - mockedService.On("TheExampleMethodFunc", func(string) error { return nil }) - }) -} - -func Test_Mock_On_WithFuncTypeArg(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService. - On("TheExampleMethodFuncType", AnythingOfType("mock.ExampleFuncType")). - Return(nil) - - assert.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - assert.Equal(t, 1, len(c.Arguments)) - assert.Equal(t, AnythingOfType("mock.ExampleFuncType"), c.Arguments[0]) - - fn := func(string) error { return nil } - assert.NotPanics(t, func() { - mockedService.TheExampleMethodFuncType(fn) - }) -} - -func Test_Mock_Return(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService. - On("TheExampleMethod", "A", "B", true). - Return(1, "two", true) - - require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - - call := mockedService.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 1, call.ReturnArguments[0]) - assert.Equal(t, "two", call.ReturnArguments[1]) - assert.Equal(t, true, call.ReturnArguments[2]) - assert.Equal(t, 0, call.Repeatability) - assert.Nil(t, call.WaitFor) -} - -func Test_Mock_Return_WaitUntil(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - ch := time.After(time.Second) - - c := mockedService.Mock. - On("TheExampleMethod", "A", "B", true). - WaitUntil(ch). - Return(1, "two", true) - - // assert that the call was created - require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - - call := mockedService.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 1, call.ReturnArguments[0]) - assert.Equal(t, "two", call.ReturnArguments[1]) - assert.Equal(t, true, call.ReturnArguments[2]) - assert.Equal(t, 0, call.Repeatability) - assert.Equal(t, ch, call.WaitFor) -} - -func Test_Mock_Return_After(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService.Mock. - On("TheExampleMethod", "A", "B", true). - Return(1, "two", true). - After(time.Second) - - require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - - call := mockedService.Mock.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 1, call.ReturnArguments[0]) - assert.Equal(t, "two", call.ReturnArguments[1]) - assert.Equal(t, true, call.ReturnArguments[2]) - assert.Equal(t, 0, call.Repeatability) - assert.NotEqual(t, nil, call.WaitFor) - -} - -func Test_Mock_Return_Run(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - fn := func(args Arguments) { - arg := args.Get(0).(*ExampleType) - arg.ran = true - } - - c := mockedService.Mock. - On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")). - Return(nil). - Run(fn) - - require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - - call := mockedService.Mock.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod3", call.Method) - assert.Equal(t, AnythingOfType("*mock.ExampleType"), call.Arguments[0]) - assert.Equal(t, nil, call.ReturnArguments[0]) - assert.Equal(t, 0, call.Repeatability) - assert.NotEqual(t, nil, call.WaitFor) - assert.NotNil(t, call.Run) - - et := ExampleType{} - assert.Equal(t, false, et.ran) - mockedService.TheExampleMethod3(&et) - assert.Equal(t, true, et.ran) -} - -func Test_Mock_Return_Run_Out_Of_Order(t *testing.T) { - // make a test impl object - var mockedService = new(TestExampleImplementation) - f := func(args Arguments) { - arg := args.Get(0).(*ExampleType) - arg.ran = true - } - - c := mockedService.Mock. - On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")). - Run(f). - Return(nil) - - require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - - call := mockedService.Mock.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod3", call.Method) - assert.Equal(t, AnythingOfType("*mock.ExampleType"), call.Arguments[0]) - assert.Equal(t, nil, call.ReturnArguments[0]) - assert.Equal(t, 0, call.Repeatability) - assert.NotEqual(t, nil, call.WaitFor) - assert.NotNil(t, call.Run) -} - -func Test_Mock_Return_Once(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService.On("TheExampleMethod", "A", "B", true). - Return(1, "two", true). - Once() - - require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - - call := mockedService.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 1, call.ReturnArguments[0]) - assert.Equal(t, "two", call.ReturnArguments[1]) - assert.Equal(t, true, call.ReturnArguments[2]) - assert.Equal(t, 1, call.Repeatability) - assert.Nil(t, call.WaitFor) -} - -func Test_Mock_Return_Twice(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService. - On("TheExampleMethod", "A", "B", true). - Return(1, "two", true). - Twice() - - require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - - call := mockedService.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 1, call.ReturnArguments[0]) - assert.Equal(t, "two", call.ReturnArguments[1]) - assert.Equal(t, true, call.ReturnArguments[2]) - assert.Equal(t, 2, call.Repeatability) - assert.Nil(t, call.WaitFor) -} - -func Test_Mock_Return_Times(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService. - On("TheExampleMethod", "A", "B", true). - Return(1, "two", true). - Times(5) - - require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - - call := mockedService.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 1, call.ReturnArguments[0]) - assert.Equal(t, "two", call.ReturnArguments[1]) - assert.Equal(t, true, call.ReturnArguments[2]) - assert.Equal(t, 5, call.Repeatability) - assert.Nil(t, call.WaitFor) -} - -func Test_Mock_Return_Nothing(t *testing.T) { - - // make a test impl object - var mockedService = new(TestExampleImplementation) - - c := mockedService. - On("TheExampleMethod", "A", "B", true). - Return() - - require.Equal(t, []*Call{c}, mockedService.ExpectedCalls) - - call := mockedService.ExpectedCalls[0] - - assert.Equal(t, "TheExampleMethod", call.Method) - assert.Equal(t, "A", call.Arguments[0]) - assert.Equal(t, "B", call.Arguments[1]) - assert.Equal(t, true, call.Arguments[2]) - assert.Equal(t, 0, len(call.ReturnArguments)) -} - -func Test_Mock_findExpectedCall(t *testing.T) { - - m := new(Mock) - m.On("One", 1).Return("one") - m.On("Two", 2).Return("two") - m.On("Two", 3).Return("three") - - f, c := m.findExpectedCall("Two", 3) - - if assert.Equal(t, 2, f) { - if assert.NotNil(t, c) { - assert.Equal(t, "Two", c.Method) - assert.Equal(t, 3, c.Arguments[0]) - assert.Equal(t, "three", c.ReturnArguments[0]) - } - } - -} - -func Test_Mock_findExpectedCall_For_Unknown_Method(t *testing.T) { - - m := new(Mock) - m.On("One", 1).Return("one") - m.On("Two", 2).Return("two") - m.On("Two", 3).Return("three") - - f, _ := m.findExpectedCall("Two") - - assert.Equal(t, -1, f) - -} - -func Test_Mock_findExpectedCall_Respects_Repeatability(t *testing.T) { - - m := new(Mock) - m.On("One", 1).Return("one") - m.On("Two", 2).Return("two").Once() - m.On("Two", 3).Return("three").Twice() - m.On("Two", 3).Return("three").Times(8) - - f, c := m.findExpectedCall("Two", 3) - - if assert.Equal(t, 2, f) { - if assert.NotNil(t, c) { - assert.Equal(t, "Two", c.Method) - assert.Equal(t, 3, c.Arguments[0]) - assert.Equal(t, "three", c.ReturnArguments[0]) - } - } - -} - -func Test_callString(t *testing.T) { - - assert.Equal(t, `Method(int,bool,string)`, callString("Method", []interface{}{1, true, "something"}, false)) - -} - -func Test_Mock_Called(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_Called", 1, 2, 3).Return(5, "6", true) - - returnArguments := mockedService.Called(1, 2, 3) - - if assert.Equal(t, 1, len(mockedService.Calls)) { - assert.Equal(t, "Test_Mock_Called", mockedService.Calls[0].Method) - assert.Equal(t, 1, mockedService.Calls[0].Arguments[0]) - assert.Equal(t, 2, mockedService.Calls[0].Arguments[1]) - assert.Equal(t, 3, mockedService.Calls[0].Arguments[2]) - } - - if assert.Equal(t, 3, len(returnArguments)) { - assert.Equal(t, 5, returnArguments[0]) - assert.Equal(t, "6", returnArguments[1]) - assert.Equal(t, true, returnArguments[2]) - } - -} - -func asyncCall(m *Mock, ch chan Arguments) { - ch <- m.Called(1, 2, 3) -} - -func Test_Mock_Called_blocks(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.Mock.On("asyncCall", 1, 2, 3).Return(5, "6", true).After(2 * time.Millisecond) - - ch := make(chan Arguments) - - go asyncCall(&mockedService.Mock, ch) - - select { - case <-ch: - t.Fatal("should have waited") - case <-time.After(1 * time.Millisecond): - } - - returnArguments := <-ch - - if assert.Equal(t, 1, len(mockedService.Mock.Calls)) { - assert.Equal(t, "asyncCall", mockedService.Mock.Calls[0].Method) - assert.Equal(t, 1, mockedService.Mock.Calls[0].Arguments[0]) - assert.Equal(t, 2, mockedService.Mock.Calls[0].Arguments[1]) - assert.Equal(t, 3, mockedService.Mock.Calls[0].Arguments[2]) - } - - if assert.Equal(t, 3, len(returnArguments)) { - assert.Equal(t, 5, returnArguments[0]) - assert.Equal(t, "6", returnArguments[1]) - assert.Equal(t, true, returnArguments[2]) - } - -} - -func Test_Mock_Called_For_Bounded_Repeatability(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService. - On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3). - Return(5, "6", true). - Once() - mockedService. - On("Test_Mock_Called_For_Bounded_Repeatability", 1, 2, 3). - Return(-1, "hi", false) - - returnArguments1 := mockedService.Called(1, 2, 3) - returnArguments2 := mockedService.Called(1, 2, 3) - - if assert.Equal(t, 2, len(mockedService.Calls)) { - assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[0].Method) - assert.Equal(t, 1, mockedService.Calls[0].Arguments[0]) - assert.Equal(t, 2, mockedService.Calls[0].Arguments[1]) - assert.Equal(t, 3, mockedService.Calls[0].Arguments[2]) - - assert.Equal(t, "Test_Mock_Called_For_Bounded_Repeatability", mockedService.Calls[1].Method) - assert.Equal(t, 1, mockedService.Calls[1].Arguments[0]) - assert.Equal(t, 2, mockedService.Calls[1].Arguments[1]) - assert.Equal(t, 3, mockedService.Calls[1].Arguments[2]) - } - - if assert.Equal(t, 3, len(returnArguments1)) { - assert.Equal(t, 5, returnArguments1[0]) - assert.Equal(t, "6", returnArguments1[1]) - assert.Equal(t, true, returnArguments1[2]) - } - - if assert.Equal(t, 3, len(returnArguments2)) { - assert.Equal(t, -1, returnArguments2[0]) - assert.Equal(t, "hi", returnArguments2[1]) - assert.Equal(t, false, returnArguments2[2]) - } - -} - -func Test_Mock_Called_For_SetTime_Expectation(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("TheExampleMethod", 1, 2, 3).Return(5, "6", true).Times(4) - - mockedService.TheExampleMethod(1, 2, 3) - mockedService.TheExampleMethod(1, 2, 3) - mockedService.TheExampleMethod(1, 2, 3) - mockedService.TheExampleMethod(1, 2, 3) - assert.Panics(t, func() { - mockedService.TheExampleMethod(1, 2, 3) - }) - -} - -func Test_Mock_Called_Unexpected(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - // make sure it panics if no expectation was made - assert.Panics(t, func() { - mockedService.Called(1, 2, 3) - }, "Calling unexpected method should panic") - -} - -func Test_AssertExpectationsForObjects_Helper(t *testing.T) { - - var mockedService1 = new(TestExampleImplementation) - var mockedService2 = new(TestExampleImplementation) - var mockedService3 = new(TestExampleImplementation) - - mockedService1.On("Test_AssertExpectationsForObjects_Helper", 1).Return() - mockedService2.On("Test_AssertExpectationsForObjects_Helper", 2).Return() - mockedService3.On("Test_AssertExpectationsForObjects_Helper", 3).Return() - - mockedService1.Called(1) - mockedService2.Called(2) - mockedService3.Called(3) - - assert.True(t, AssertExpectationsForObjects(t, mockedService1.Mock, mockedService2.Mock, mockedService3.Mock)) - assert.True(t, AssertExpectationsForObjects(t, mockedService1, mockedService2, mockedService3)) - -} - -func Test_AssertExpectationsForObjects_Helper_Failed(t *testing.T) { - - var mockedService1 = new(TestExampleImplementation) - var mockedService2 = new(TestExampleImplementation) - var mockedService3 = new(TestExampleImplementation) - - mockedService1.On("Test_AssertExpectationsForObjects_Helper_Failed", 1).Return() - mockedService2.On("Test_AssertExpectationsForObjects_Helper_Failed", 2).Return() - mockedService3.On("Test_AssertExpectationsForObjects_Helper_Failed", 3).Return() - - mockedService1.Called(1) - mockedService3.Called(3) - - tt := new(testing.T) - assert.False(t, AssertExpectationsForObjects(tt, mockedService1.Mock, mockedService2.Mock, mockedService3.Mock)) - assert.False(t, AssertExpectationsForObjects(tt, mockedService1, mockedService2, mockedService3)) - -} - -func Test_Mock_AssertExpectations(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertExpectations", 1, 2, 3).Return(5, 6, 7) - - tt := new(testing.T) - assert.False(t, mockedService.AssertExpectations(tt)) - - // make the call now - mockedService.Called(1, 2, 3) - - // now assert expectations - assert.True(t, mockedService.AssertExpectations(tt)) - -} - -func Test_Mock_AssertExpectations_Placeholder_NoArgs(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertExpectations_Placeholder_NoArgs").Return(5, 6, 7).Once() - mockedService.On("Test_Mock_AssertExpectations_Placeholder_NoArgs").Return(7, 6, 5) - - tt := new(testing.T) - assert.False(t, mockedService.AssertExpectations(tt)) - - // make the call now - mockedService.Called() - - // now assert expectations - assert.True(t, mockedService.AssertExpectations(tt)) - -} - -func Test_Mock_AssertExpectations_Placeholder(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertExpectations_Placeholder", 1, 2, 3).Return(5, 6, 7).Once() - mockedService.On("Test_Mock_AssertExpectations_Placeholder", 3, 2, 1).Return(7, 6, 5) - - tt := new(testing.T) - assert.False(t, mockedService.AssertExpectations(tt)) - - // make the call now - mockedService.Called(1, 2, 3) - - // now assert expectations - assert.False(t, mockedService.AssertExpectations(tt)) - - // make call to the second expectation - mockedService.Called(3, 2, 1) - - // now assert expectations again - assert.True(t, mockedService.AssertExpectations(tt)) -} - -func Test_Mock_AssertExpectations_With_Pointers(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertExpectations_With_Pointers", &struct{ Foo int }{1}).Return(1) - mockedService.On("Test_Mock_AssertExpectations_With_Pointers", &struct{ Foo int }{2}).Return(2) - - tt := new(testing.T) - assert.False(t, mockedService.AssertExpectations(tt)) - - s := struct{ Foo int }{1} - // make the calls now - mockedService.Called(&s) - s.Foo = 2 - mockedService.Called(&s) - - // now assert expectations - assert.True(t, mockedService.AssertExpectations(tt)) - -} - -func Test_Mock_AssertExpectationsCustomType(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("TheExampleMethod3", AnythingOfType("*mock.ExampleType")).Return(nil).Once() - - tt := new(testing.T) - assert.False(t, mockedService.AssertExpectations(tt)) - - // make the call now - mockedService.TheExampleMethod3(&ExampleType{}) - - // now assert expectations - assert.True(t, mockedService.AssertExpectations(tt)) - -} - -func Test_Mock_AssertExpectations_With_Repeatability(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertExpectations_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Twice() - - tt := new(testing.T) - assert.False(t, mockedService.AssertExpectations(tt)) - - // make the call now - mockedService.Called(1, 2, 3) - - assert.False(t, mockedService.AssertExpectations(tt)) - - mockedService.Called(1, 2, 3) - - // now assert expectations - assert.True(t, mockedService.AssertExpectations(tt)) - -} - -func Test_Mock_TwoCallsWithDifferentArguments(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 1, 2, 3).Return(5, 6, 7) - mockedService.On("Test_Mock_TwoCallsWithDifferentArguments", 4, 5, 6).Return(5, 6, 7) - - args1 := mockedService.Called(1, 2, 3) - assert.Equal(t, 5, args1.Int(0)) - assert.Equal(t, 6, args1.Int(1)) - assert.Equal(t, 7, args1.Int(2)) - - args2 := mockedService.Called(4, 5, 6) - assert.Equal(t, 5, args2.Int(0)) - assert.Equal(t, 6, args2.Int(1)) - assert.Equal(t, 7, args2.Int(2)) - -} - -func Test_Mock_AssertNumberOfCalls(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertNumberOfCalls", 1, 2, 3).Return(5, 6, 7) - - mockedService.Called(1, 2, 3) - assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 1)) - - mockedService.Called(1, 2, 3) - assert.True(t, mockedService.AssertNumberOfCalls(t, "Test_Mock_AssertNumberOfCalls", 2)) - -} - -func Test_Mock_AssertCalled(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertCalled", 1, 2, 3).Return(5, 6, 7) - - mockedService.Called(1, 2, 3) - - assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled", 1, 2, 3)) - -} - -func Test_Mock_AssertCalled_WithAnythingOfTypeArgument(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService. - On("Test_Mock_AssertCalled_WithAnythingOfTypeArgument", Anything, Anything, Anything). - Return() - - mockedService.Called(1, "two", []uint8("three")) - - assert.True(t, mockedService.AssertCalled(t, "Test_Mock_AssertCalled_WithAnythingOfTypeArgument", AnythingOfType("int"), AnythingOfType("string"), AnythingOfType("[]uint8"))) - -} - -func Test_Mock_AssertCalled_WithArguments(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertCalled_WithArguments", 1, 2, 3).Return(5, 6, 7) - - mockedService.Called(1, 2, 3) - - tt := new(testing.T) - assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 1, 2, 3)) - assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments", 2, 3, 4)) - -} - -func Test_Mock_AssertCalled_WithArguments_With_Repeatability(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3).Return(5, 6, 7).Once() - mockedService.On("Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4).Return(5, 6, 7).Once() - - mockedService.Called(1, 2, 3) - mockedService.Called(2, 3, 4) - - tt := new(testing.T) - assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 1, 2, 3)) - assert.True(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 2, 3, 4)) - assert.False(t, mockedService.AssertCalled(tt, "Test_Mock_AssertCalled_WithArguments_With_Repeatability", 3, 4, 5)) - -} - -func Test_Mock_AssertNotCalled(t *testing.T) { - - var mockedService = new(TestExampleImplementation) - - mockedService.On("Test_Mock_AssertNotCalled", 1, 2, 3).Return(5, 6, 7) - - mockedService.Called(1, 2, 3) - - assert.True(t, mockedService.AssertNotCalled(t, "Test_Mock_NotCalled")) - -} - -/* - Arguments helper methods -*/ -func Test_Arguments_Get(t *testing.T) { - - var args = Arguments([]interface{}{"string", 123, true}) - - assert.Equal(t, "string", args.Get(0).(string)) - assert.Equal(t, 123, args.Get(1).(int)) - assert.Equal(t, true, args.Get(2).(bool)) - -} - -func Test_Arguments_Is(t *testing.T) { - - var args = Arguments([]interface{}{"string", 123, true}) - - assert.True(t, args.Is("string", 123, true)) - assert.False(t, args.Is("wrong", 456, false)) - -} - -func Test_Arguments_Diff(t *testing.T) { - - var args = Arguments([]interface{}{"Hello World", 123, true}) - var diff string - var count int - diff, count = args.Diff([]interface{}{"Hello World", 456, "false"}) - - assert.Equal(t, 2, count) - assert.Contains(t, diff, `%!s(int=456) != %!s(int=123)`) - assert.Contains(t, diff, `false != %!s(bool=true)`) - -} - -func Test_Arguments_Diff_DifferentNumberOfArgs(t *testing.T) { - - var args = Arguments([]interface{}{"string", 123, true}) - var diff string - var count int - diff, count = args.Diff([]interface{}{"string", 456, "false", "extra"}) - - assert.Equal(t, 3, count) - assert.Contains(t, diff, `extra != (Missing)`) - -} - -func Test_Arguments_Diff_WithAnythingArgument(t *testing.T) { - - var args = Arguments([]interface{}{"string", 123, true}) - var count int - _, count = args.Diff([]interface{}{"string", Anything, true}) - - assert.Equal(t, 0, count) - -} - -func Test_Arguments_Diff_WithAnythingArgument_InActualToo(t *testing.T) { - - var args = Arguments([]interface{}{"string", Anything, true}) - var count int - _, count = args.Diff([]interface{}{"string", 123, true}) - - assert.Equal(t, 0, count) - -} - -func Test_Arguments_Diff_WithAnythingOfTypeArgument(t *testing.T) { - - var args = Arguments([]interface{}{"string", AnythingOfType("int"), true}) - var count int - _, count = args.Diff([]interface{}{"string", 123, true}) - - assert.Equal(t, 0, count) - -} - -func Test_Arguments_Diff_WithAnythingOfTypeArgument_Failing(t *testing.T) { - - var args = Arguments([]interface{}{"string", AnythingOfType("string"), true}) - var count int - var diff string - diff, count = args.Diff([]interface{}{"string", 123, true}) - - assert.Equal(t, 1, count) - assert.Contains(t, diff, `string != type int - %!s(int=123)`) - -} - -func Test_Arguments_Diff_WithArgMatcher(t *testing.T) { - matchFn := func(a int) bool { - return a == 123 - } - var args = Arguments([]interface{}{"string", MatchedBy(matchFn), true}) - - diff, count := args.Diff([]interface{}{"string", 124, true}) - assert.Equal(t, 1, count) - assert.Contains(t, diff, `%!s(int=124) not matched by func(int) bool`) - - diff, count = args.Diff([]interface{}{"string", false, true}) - assert.Equal(t, 1, count) - assert.Contains(t, diff, `%!s(bool=false) not matched by func(int) bool`) - - diff, count = args.Diff([]interface{}{"string", 123, false}) - assert.Contains(t, diff, `%!s(int=123) matched by func(int) bool`) - - diff, count = args.Diff([]interface{}{"string", 123, true}) - assert.Equal(t, 0, count) - assert.Contains(t, diff, `No differences.`) -} - -func Test_Arguments_Assert(t *testing.T) { - - var args = Arguments([]interface{}{"string", 123, true}) - - assert.True(t, args.Assert(t, "string", 123, true)) - -} - -func Test_Arguments_String_Representation(t *testing.T) { - - var args = Arguments([]interface{}{"string", 123, true}) - assert.Equal(t, `string,int,bool`, args.String()) - -} - -func Test_Arguments_String(t *testing.T) { - - var args = Arguments([]interface{}{"string", 123, true}) - assert.Equal(t, "string", args.String(0)) - -} - -func Test_Arguments_Error(t *testing.T) { - - var err = errors.New("An Error") - var args = Arguments([]interface{}{"string", 123, true, err}) - assert.Equal(t, err, args.Error(3)) - -} - -func Test_Arguments_Error_Nil(t *testing.T) { - - var args = Arguments([]interface{}{"string", 123, true, nil}) - assert.Equal(t, nil, args.Error(3)) - -} - -func Test_Arguments_Int(t *testing.T) { - - var args = Arguments([]interface{}{"string", 123, true}) - assert.Equal(t, 123, args.Int(1)) - -} - -func Test_Arguments_Bool(t *testing.T) { - - var args = Arguments([]interface{}{"string", 123, true}) - assert.Equal(t, true, args.Bool(2)) - -} diff --git a/vendor/github.com/stretchr/testify/suite/doc.go b/vendor/github.com/stretchr/testify/suite/doc.go deleted file mode 100644 index f91a245d3..000000000 --- a/vendor/github.com/stretchr/testify/suite/doc.go +++ /dev/null @@ -1,65 +0,0 @@ -// Package suite contains logic for creating testing suite structs -// and running the methods on those structs as tests. The most useful -// piece of this package is that you can create setup/teardown methods -// on your testing suites, which will run before/after the whole suite -// or individual tests (depending on which interface(s) you -// implement). -// -// A testing suite is usually built by first extending the built-in -// suite functionality from suite.Suite in testify. Alternatively, -// you could reproduce that logic on your own if you wanted (you -// just need to implement the TestingSuite interface from -// suite/interfaces.go). -// -// After that, you can implement any of the interfaces in -// suite/interfaces.go to add setup/teardown functionality to your -// suite, and add any methods that start with "Test" to add tests. -// Methods that do not match any suite interfaces and do not begin -// with "Test" will not be run by testify, and can safely be used as -// helper methods. -// -// Once you've built your testing suite, you need to run the suite -// (using suite.Run from testify) inside any function that matches the -// identity that "go test" is already looking for (i.e. -// func(*testing.T)). -// -// Regular expression to select test suites specified command-line -// argument "-run". Regular expression to select the methods -// of test suites specified command-line argument "-m". -// Suite object has assertion methods. -// -// A crude example: -// // Basic imports -// import ( -// "testing" -// "github.com/stretchr/testify/assert" -// "github.com/stretchr/testify/suite" -// ) -// -// // Define the suite, and absorb the built-in basic suite -// // functionality from testify - including a T() method which -// // returns the current testing context -// type ExampleTestSuite struct { -// suite.Suite -// VariableThatShouldStartAtFive int -// } -// -// // Make sure that VariableThatShouldStartAtFive is set to five -// // before each test -// func (suite *ExampleTestSuite) SetupTest() { -// suite.VariableThatShouldStartAtFive = 5 -// } -// -// // All methods that begin with "Test" are run as tests within a -// // suite. -// func (suite *ExampleTestSuite) TestExample() { -// assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive) -// suite.Equal(5, suite.VariableThatShouldStartAtFive) -// } -// -// // In order for 'go test' to run this suite, we need to create -// // a normal test function and pass our suite to suite.Run -// func TestExampleTestSuite(t *testing.T) { -// suite.Run(t, new(ExampleTestSuite)) -// } -package suite diff --git a/vendor/github.com/stretchr/testify/suite/interfaces.go b/vendor/github.com/stretchr/testify/suite/interfaces.go deleted file mode 100644 index 20969472c..000000000 --- a/vendor/github.com/stretchr/testify/suite/interfaces.go +++ /dev/null @@ -1,34 +0,0 @@ -package suite - -import "testing" - -// TestingSuite can store and return the current *testing.T context -// generated by 'go test'. -type TestingSuite interface { - T() *testing.T - SetT(*testing.T) -} - -// SetupAllSuite has a SetupSuite method, which will run before the -// tests in the suite are run. -type SetupAllSuite interface { - SetupSuite() -} - -// SetupTestSuite has a SetupTest method, which will run before each -// test in the suite. -type SetupTestSuite interface { - SetupTest() -} - -// TearDownAllSuite has a TearDownSuite method, which will run after -// all the tests in the suite have been run. -type TearDownAllSuite interface { - TearDownSuite() -} - -// TearDownTestSuite has a TearDownTest method, which will run after -// each test in the suite. -type TearDownTestSuite interface { - TearDownTest() -} diff --git a/vendor/github.com/stretchr/testify/suite/suite.go b/vendor/github.com/stretchr/testify/suite/suite.go deleted file mode 100644 index db7413000..000000000 --- a/vendor/github.com/stretchr/testify/suite/suite.go +++ /dev/null @@ -1,115 +0,0 @@ -package suite - -import ( - "flag" - "fmt" - "os" - "reflect" - "regexp" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -var matchMethod = flag.String("testify.m", "", "regular expression to select tests of the testify suite to run") - -// Suite is a basic testing suite with methods for storing and -// retrieving the current *testing.T context. -type Suite struct { - *assert.Assertions - require *require.Assertions - t *testing.T -} - -// T retrieves the current *testing.T context. -func (suite *Suite) T() *testing.T { - return suite.t -} - -// SetT sets the current *testing.T context. -func (suite *Suite) SetT(t *testing.T) { - suite.t = t - suite.Assertions = assert.New(t) - suite.require = require.New(t) -} - -// Require returns a require context for suite. -func (suite *Suite) Require() *require.Assertions { - if suite.require == nil { - suite.require = require.New(suite.T()) - } - return suite.require -} - -// Assert returns an assert context for suite. Normally, you can call -// `suite.NoError(expected, actual)`, but for situations where the embedded -// methods are overridden (for example, you might want to override -// assert.Assertions with require.Assertions), this method is provided so you -// can call `suite.Assert().NoError()`. -func (suite *Suite) Assert() *assert.Assertions { - if suite.Assertions == nil { - suite.Assertions = assert.New(suite.T()) - } - return suite.Assertions -} - -// Run takes a testing suite and runs all of the tests attached -// to it. -func Run(t *testing.T, suite TestingSuite) { - suite.SetT(t) - - if setupAllSuite, ok := suite.(SetupAllSuite); ok { - setupAllSuite.SetupSuite() - } - defer func() { - if tearDownAllSuite, ok := suite.(TearDownAllSuite); ok { - tearDownAllSuite.TearDownSuite() - } - }() - - methodFinder := reflect.TypeOf(suite) - tests := []testing.InternalTest{} - for index := 0; index < methodFinder.NumMethod(); index++ { - method := methodFinder.Method(index) - ok, err := methodFilter(method.Name) - if err != nil { - fmt.Fprintf(os.Stderr, "testify: invalid regexp for -m: %s\n", err) - os.Exit(1) - } - if ok { - test := testing.InternalTest{ - Name: method.Name, - F: func(t *testing.T) { - parentT := suite.T() - suite.SetT(t) - if setupTestSuite, ok := suite.(SetupTestSuite); ok { - setupTestSuite.SetupTest() - } - defer func() { - if tearDownTestSuite, ok := suite.(TearDownTestSuite); ok { - tearDownTestSuite.TearDownTest() - } - suite.SetT(parentT) - }() - method.Func.Call([]reflect.Value{reflect.ValueOf(suite)}) - }, - } - tests = append(tests, test) - } - } - - if !testing.RunTests(func(_, _ string) (bool, error) { return true, nil }, - tests) { - t.Fail() - } -} - -// Filtering method according to set regular expression -// specified command-line argument -m -func methodFilter(name string) (bool, error) { - if ok, _ := regexp.MatchString("^Test", name); !ok { - return false, nil - } - return regexp.MatchString(*matchMethod, name) -} diff --git a/vendor/github.com/stretchr/testify/suite/suite_test.go b/vendor/github.com/stretchr/testify/suite/suite_test.go deleted file mode 100644 index c7c4e88f7..000000000 --- a/vendor/github.com/stretchr/testify/suite/suite_test.go +++ /dev/null @@ -1,239 +0,0 @@ -package suite - -import ( - "errors" - "io/ioutil" - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -// SuiteRequireTwice is intended to test the usage of suite.Require in two -// different tests -type SuiteRequireTwice struct{ Suite } - -// TestSuiteRequireTwice checks for regressions of issue #149 where -// suite.requirements was not initialised in suite.SetT() -// A regression would result on these tests panicking rather than failing. -func TestSuiteRequireTwice(t *testing.T) { - ok := testing.RunTests( - func(_, _ string) (bool, error) { return true, nil }, - []testing.InternalTest{{ - Name: "TestSuiteRequireTwice", - F: func(t *testing.T) { - suite := new(SuiteRequireTwice) - Run(t, suite) - }, - }}, - ) - assert.Equal(t, false, ok) -} - -func (s *SuiteRequireTwice) TestRequireOne() { - r := s.Require() - r.Equal(1, 2) -} - -func (s *SuiteRequireTwice) TestRequireTwo() { - r := s.Require() - r.Equal(1, 2) -} - -// This suite is intended to store values to make sure that only -// testing-suite-related methods are run. It's also a fully -// functional example of a testing suite, using setup/teardown methods -// and a helper method that is ignored by testify. To make this look -// more like a real world example, all tests in the suite perform some -// type of assertion. -type SuiteTester struct { - // Include our basic suite logic. - Suite - - // Keep counts of how many times each method is run. - SetupSuiteRunCount int - TearDownSuiteRunCount int - SetupTestRunCount int - TearDownTestRunCount int - TestOneRunCount int - TestTwoRunCount int - NonTestMethodRunCount int -} - -type SuiteSkipTester struct { - // Include our basic suite logic. - Suite - - // Keep counts of how many times each method is run. - SetupSuiteRunCount int - TearDownSuiteRunCount int -} - -// The SetupSuite method will be run by testify once, at the very -// start of the testing suite, before any tests are run. -func (suite *SuiteTester) SetupSuite() { - suite.SetupSuiteRunCount++ -} - -func (suite *SuiteSkipTester) SetupSuite() { - suite.SetupSuiteRunCount++ - suite.T().Skip() -} - -// The TearDownSuite method will be run by testify once, at the very -// end of the testing suite, after all tests have been run. -func (suite *SuiteTester) TearDownSuite() { - suite.TearDownSuiteRunCount++ -} - -func (suite *SuiteSkipTester) TearDownSuite() { - suite.TearDownSuiteRunCount++ -} - -// The SetupTest method will be run before every test in the suite. -func (suite *SuiteTester) SetupTest() { - suite.SetupTestRunCount++ -} - -// The TearDownTest method will be run after every test in the suite. -func (suite *SuiteTester) TearDownTest() { - suite.TearDownTestRunCount++ -} - -// Every method in a testing suite that begins with "Test" will be run -// as a test. TestOne is an example of a test. For the purposes of -// this example, we've included assertions in the tests, since most -// tests will issue assertions. -func (suite *SuiteTester) TestOne() { - beforeCount := suite.TestOneRunCount - suite.TestOneRunCount++ - assert.Equal(suite.T(), suite.TestOneRunCount, beforeCount+1) - suite.Equal(suite.TestOneRunCount, beforeCount+1) -} - -// TestTwo is another example of a test. -func (suite *SuiteTester) TestTwo() { - beforeCount := suite.TestTwoRunCount - suite.TestTwoRunCount++ - assert.NotEqual(suite.T(), suite.TestTwoRunCount, beforeCount) - suite.NotEqual(suite.TestTwoRunCount, beforeCount) -} - -func (suite *SuiteTester) TestSkip() { - suite.T().Skip() -} - -// NonTestMethod does not begin with "Test", so it will not be run by -// testify as a test in the suite. This is useful for creating helper -// methods for your tests. -func (suite *SuiteTester) NonTestMethod() { - suite.NonTestMethodRunCount++ -} - -// TestRunSuite will be run by the 'go test' command, so within it, we -// can run our suite using the Run(*testing.T, TestingSuite) function. -func TestRunSuite(t *testing.T) { - suiteTester := new(SuiteTester) - Run(t, suiteTester) - - // Normally, the test would end here. The following are simply - // some assertions to ensure that the Run function is working as - // intended - they are not part of the example. - - // The suite was only run once, so the SetupSuite and TearDownSuite - // methods should have each been run only once. - assert.Equal(t, suiteTester.SetupSuiteRunCount, 1) - assert.Equal(t, suiteTester.TearDownSuiteRunCount, 1) - - // There are three test methods (TestOne, TestTwo, and TestSkip), so - // the SetupTest and TearDownTest methods (which should be run once for - // each test) should have been run three times. - assert.Equal(t, suiteTester.SetupTestRunCount, 3) - assert.Equal(t, suiteTester.TearDownTestRunCount, 3) - - // Each test should have been run once. - assert.Equal(t, suiteTester.TestOneRunCount, 1) - assert.Equal(t, suiteTester.TestTwoRunCount, 1) - - // Methods that don't match the test method identifier shouldn't - // have been run at all. - assert.Equal(t, suiteTester.NonTestMethodRunCount, 0) - - suiteSkipTester := new(SuiteSkipTester) - Run(t, suiteSkipTester) - - // The suite was only run once, so the SetupSuite and TearDownSuite - // methods should have each been run only once, even though SetupSuite - // called Skip() - assert.Equal(t, suiteSkipTester.SetupSuiteRunCount, 1) - assert.Equal(t, suiteSkipTester.TearDownSuiteRunCount, 1) - -} - -func TestSuiteGetters(t *testing.T) { - suite := new(SuiteTester) - suite.SetT(t) - assert.NotNil(t, suite.Assert()) - assert.Equal(t, suite.Assertions, suite.Assert()) - assert.NotNil(t, suite.Require()) - assert.Equal(t, suite.require, suite.Require()) -} - -type SuiteLoggingTester struct { - Suite -} - -func (s *SuiteLoggingTester) TestLoggingPass() { - s.T().Log("TESTLOGPASS") -} - -func (s *SuiteLoggingTester) TestLoggingFail() { - s.T().Log("TESTLOGFAIL") - assert.NotNil(s.T(), nil) // expected to fail -} - -type StdoutCapture struct { - oldStdout *os.File - readPipe *os.File -} - -func (sc *StdoutCapture) StartCapture() { - sc.oldStdout = os.Stdout - sc.readPipe, os.Stdout, _ = os.Pipe() -} - -func (sc *StdoutCapture) StopCapture() (string, error) { - if sc.oldStdout == nil || sc.readPipe == nil { - return "", errors.New("StartCapture not called before StopCapture") - } - os.Stdout.Close() - os.Stdout = sc.oldStdout - bytes, err := ioutil.ReadAll(sc.readPipe) - if err != nil { - return "", err - } - return string(bytes), nil -} - -func TestSuiteLogging(t *testing.T) { - testT := testing.T{} - - suiteLoggingTester := new(SuiteLoggingTester) - - capture := StdoutCapture{} - capture.StartCapture() - Run(&testT, suiteLoggingTester) - output, err := capture.StopCapture() - - assert.Nil(t, err, "Got an error trying to capture stdout!") - - // Failed tests' output is always printed - assert.Contains(t, output, "TESTLOGFAIL") - - if testing.Verbose() { - // In verbose mode, output from successful tests is also printed - assert.Contains(t, output, "TESTLOGPASS") - } else { - assert.NotContains(t, output, "TESTLOGPASS") - } -} diff --git a/vendor/golang.org/x/net/bpf/asm.go b/vendor/golang.org/x/net/bpf/asm.go deleted file mode 100644 index 15e21b181..000000000 --- a/vendor/golang.org/x/net/bpf/asm.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf - -import "fmt" - -// Assemble converts insts into raw instructions suitable for loading -// into a BPF virtual machine. -// -// Currently, no optimization is attempted, the assembled program flow -// is exactly as provided. -func Assemble(insts []Instruction) ([]RawInstruction, error) { - ret := make([]RawInstruction, len(insts)) - var err error - for i, inst := range insts { - ret[i], err = inst.Assemble() - if err != nil { - return nil, fmt.Errorf("assembling instruction %d: %s", i+1, err) - } - } - return ret, nil -} - -// Disassemble attempts to parse raw back into -// Instructions. Unrecognized RawInstructions are assumed to be an -// extension not implemented by this package, and are passed through -// unchanged to the output. The allDecoded value reports whether insts -// contains no RawInstructions. -func Disassemble(raw []RawInstruction) (insts []Instruction, allDecoded bool) { - insts = make([]Instruction, len(raw)) - allDecoded = true - for i, r := range raw { - insts[i] = r.Disassemble() - if _, ok := insts[i].(RawInstruction); ok { - allDecoded = false - } - } - return insts, allDecoded -} diff --git a/vendor/golang.org/x/net/bpf/constants.go b/vendor/golang.org/x/net/bpf/constants.go deleted file mode 100644 index b89ca3523..000000000 --- a/vendor/golang.org/x/net/bpf/constants.go +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf - -// A Register is a register of the BPF virtual machine. -type Register uint16 - -const ( - // RegA is the accumulator register. RegA is always the - // destination register of ALU operations. - RegA Register = iota - // RegX is the indirection register, used by LoadIndirect - // operations. - RegX -) - -// An ALUOp is an arithmetic or logic operation. -type ALUOp uint16 - -// ALU binary operation types. -const ( - ALUOpAdd ALUOp = iota << 4 - ALUOpSub - ALUOpMul - ALUOpDiv - ALUOpOr - ALUOpAnd - ALUOpShiftLeft - ALUOpShiftRight - aluOpNeg // Not exported because it's the only unary ALU operation, and gets its own instruction type. - ALUOpMod - ALUOpXor -) - -// A JumpTest is a comparison operator used in conditional jumps. -type JumpTest uint16 - -// Supported operators for conditional jumps. -const ( - // K == A - JumpEqual JumpTest = iota - // K != A - JumpNotEqual - // K > A - JumpGreaterThan - // K < A - JumpLessThan - // K >= A - JumpGreaterOrEqual - // K <= A - JumpLessOrEqual - // K & A != 0 - JumpBitsSet - // K & A == 0 - JumpBitsNotSet -) - -// An Extension is a function call provided by the kernel that -// performs advanced operations that are expensive or impossible -// within the BPF virtual machine. -// -// Extensions are only implemented by the Linux kernel. -// -// TODO: should we prune this list? Some of these extensions seem -// either broken or near-impossible to use correctly, whereas other -// (len, random, ifindex) are quite useful. -type Extension int - -// Extension functions available in the Linux kernel. -const ( - // extOffset is the negative maximum number of instructions used - // to load instructions by overloading the K argument. - extOffset = -0x1000 - // ExtLen returns the length of the packet. - ExtLen Extension = 1 - // ExtProto returns the packet's L3 protocol type. - ExtProto Extension = 0 - // ExtType returns the packet's type (skb->pkt_type in the kernel) - // - // TODO: better documentation. How nice an API do we want to - // provide for these esoteric extensions? - ExtType Extension = 4 - // ExtPayloadOffset returns the offset of the packet payload, or - // the first protocol header that the kernel does not know how to - // parse. - ExtPayloadOffset Extension = 52 - // ExtInterfaceIndex returns the index of the interface on which - // the packet was received. - ExtInterfaceIndex Extension = 8 - // ExtNetlinkAttr returns the netlink attribute of type X at - // offset A. - ExtNetlinkAttr Extension = 12 - // ExtNetlinkAttrNested returns the nested netlink attribute of - // type X at offset A. - ExtNetlinkAttrNested Extension = 16 - // ExtMark returns the packet's mark value. - ExtMark Extension = 20 - // ExtQueue returns the packet's assigned hardware queue. - ExtQueue Extension = 24 - // ExtLinkLayerType returns the packet's hardware address type - // (e.g. Ethernet, Infiniband). - ExtLinkLayerType Extension = 28 - // ExtRXHash returns the packets receive hash. - // - // TODO: figure out what this rxhash actually is. - ExtRXHash Extension = 32 - // ExtCPUID returns the ID of the CPU processing the current - // packet. - ExtCPUID Extension = 36 - // ExtVLANTag returns the packet's VLAN tag. - ExtVLANTag Extension = 44 - // ExtVLANTagPresent returns non-zero if the packet has a VLAN - // tag. - // - // TODO: I think this might be a lie: it reads bit 0x1000 of the - // VLAN header, which changed meaning in recent revisions of the - // spec - this extension may now return meaningless information. - ExtVLANTagPresent Extension = 48 - // ExtVLANProto returns 0x8100 if the frame has a VLAN header, - // 0x88a8 if the frame has a "Q-in-Q" double VLAN header, or some - // other value if no VLAN information is present. - ExtVLANProto Extension = 60 - // ExtRand returns a uniformly random uint32. - ExtRand Extension = 56 -) - -// The following gives names to various bit patterns used in opcode construction. - -const ( - opMaskCls uint16 = 0x7 - // opClsLoad masks - opMaskLoadDest = 0x01 - opMaskLoadWidth = 0x18 - opMaskLoadMode = 0xe0 - // opClsALU - opMaskOperandSrc = 0x08 - opMaskOperator = 0xf0 - // opClsJump - opMaskJumpConst = 0x0f - opMaskJumpCond = 0xf0 -) - -const ( - // +---------------+-----------------+---+---+---+ - // | AddrMode (3b) | LoadWidth (2b) | 0 | 0 | 0 | - // +---------------+-----------------+---+---+---+ - opClsLoadA uint16 = iota - // +---------------+-----------------+---+---+---+ - // | AddrMode (3b) | LoadWidth (2b) | 0 | 0 | 1 | - // +---------------+-----------------+---+---+---+ - opClsLoadX - // +---+---+---+---+---+---+---+---+ - // | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | - // +---+---+---+---+---+---+---+---+ - opClsStoreA - // +---+---+---+---+---+---+---+---+ - // | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | - // +---+---+---+---+---+---+---+---+ - opClsStoreX - // +---------------+-----------------+---+---+---+ - // | Operator (4b) | OperandSrc (1b) | 1 | 0 | 0 | - // +---------------+-----------------+---+---+---+ - opClsALU - // +-----------------------------+---+---+---+---+ - // | TestOperator (4b) | 0 | 1 | 0 | 1 | - // +-----------------------------+---+---+---+---+ - opClsJump - // +---+-------------------------+---+---+---+---+ - // | 0 | 0 | 0 | RetSrc (1b) | 0 | 1 | 1 | 0 | - // +---+-------------------------+---+---+---+---+ - opClsReturn - // +---+-------------------------+---+---+---+---+ - // | 0 | 0 | 0 | TXAorTAX (1b) | 0 | 1 | 1 | 1 | - // +---+-------------------------+---+---+---+---+ - opClsMisc -) - -const ( - opAddrModeImmediate uint16 = iota << 5 - opAddrModeAbsolute - opAddrModeIndirect - opAddrModeScratch - opAddrModePacketLen // actually an extension, not an addressing mode. - opAddrModeMemShift -) - -const ( - opLoadWidth4 uint16 = iota << 3 - opLoadWidth2 - opLoadWidth1 -) - -// Operator defined by ALUOp* - -const ( - opALUSrcConstant uint16 = iota << 3 - opALUSrcX -) - -const ( - opJumpAlways = iota << 4 - opJumpEqual - opJumpGT - opJumpGE - opJumpSet -) - -const ( - opRetSrcConstant uint16 = iota << 4 - opRetSrcA -) - -const ( - opMiscTAX = 0x00 - opMiscTXA = 0x80 -) diff --git a/vendor/golang.org/x/net/bpf/doc.go b/vendor/golang.org/x/net/bpf/doc.go deleted file mode 100644 index ae62feb53..000000000 --- a/vendor/golang.org/x/net/bpf/doc.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* - -Package bpf implements marshaling and unmarshaling of programs for the -Berkeley Packet Filter virtual machine, and provides a Go implementation -of the virtual machine. - -BPF's main use is to specify a packet filter for network taps, so that -the kernel doesn't have to expensively copy every packet it sees to -userspace. However, it's been repurposed to other areas where running -user code in-kernel is needed. For example, Linux's seccomp uses BPF -to apply security policies to system calls. For simplicity, this -documentation refers only to packets, but other uses of BPF have their -own data payloads. - -BPF programs run in a restricted virtual machine. It has almost no -access to kernel functions, and while conditional branches are -allowed, they can only jump forwards, to guarantee that there are no -infinite loops. - -The virtual machine - -The BPF VM is an accumulator machine. Its main register, called -register A, is an implicit source and destination in all arithmetic -and logic operations. The machine also has 16 scratch registers for -temporary storage, and an indirection register (register X) for -indirect memory access. All registers are 32 bits wide. - -Each run of a BPF program is given one packet, which is placed in the -VM's read-only "main memory". LoadAbsolute and LoadIndirect -instructions can fetch up to 32 bits at a time into register A for -examination. - -The goal of a BPF program is to produce and return a verdict (uint32), -which tells the kernel what to do with the packet. In the context of -packet filtering, the returned value is the number of bytes of the -packet to forward to userspace, or 0 to ignore the packet. Other -contexts like seccomp define their own return values. - -In order to simplify programs, attempts to read past the end of the -packet terminate the program execution with a verdict of 0 (ignore -packet). This means that the vast majority of BPF programs don't need -to do any explicit bounds checking. - -In addition to the bytes of the packet, some BPF programs have access -to extensions, which are essentially calls to kernel utility -functions. Currently, the only extensions supported by this package -are the Linux packet filter extensions. - -Examples - -This packet filter selects all ARP packets. - - bpf.Assemble([]bpf.Instruction{ - // Load "EtherType" field from the ethernet header. - bpf.LoadAbsolute{Off: 12, Size: 2}, - // Skip over the next instruction if EtherType is not ARP. - bpf.JumpIf{Cond: bpf.JumpNotEqual, Val: 0x0806, SkipTrue: 1}, - // Verdict is "send up to 4k of the packet to userspace." - bpf.RetConstant{Val: 4096}, - // Verdict is "ignore packet." - bpf.RetConstant{Val: 0}, - }) - -This packet filter captures a random 1% sample of traffic. - - bpf.Assemble([]bpf.Instruction{ - // Get a 32-bit random number from the Linux kernel. - bpf.LoadExtension{Num: bpf.ExtRand}, - // 1% dice roll? - bpf.JumpIf{Cond: bpf.JumpLessThan, Val: 2^32/100, SkipFalse: 1}, - // Capture. - bpf.RetConstant{Val: 4096}, - // Ignore. - bpf.RetConstant{Val: 0}, - }) - -*/ -package bpf // import "golang.org/x/net/bpf" diff --git a/vendor/golang.org/x/net/bpf/instructions.go b/vendor/golang.org/x/net/bpf/instructions.go deleted file mode 100644 index 3b4fd0891..000000000 --- a/vendor/golang.org/x/net/bpf/instructions.go +++ /dev/null @@ -1,704 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf - -import "fmt" - -// An Instruction is one instruction executed by the BPF virtual -// machine. -type Instruction interface { - // Assemble assembles the Instruction into a RawInstruction. - Assemble() (RawInstruction, error) -} - -// A RawInstruction is a raw BPF virtual machine instruction. -type RawInstruction struct { - // Operation to execute. - Op uint16 - // For conditional jump instructions, the number of instructions - // to skip if the condition is true/false. - Jt uint8 - Jf uint8 - // Constant parameter. The meaning depends on the Op. - K uint32 -} - -// Assemble implements the Instruction Assemble method. -func (ri RawInstruction) Assemble() (RawInstruction, error) { return ri, nil } - -// Disassemble parses ri into an Instruction and returns it. If ri is -// not recognized by this package, ri itself is returned. -func (ri RawInstruction) Disassemble() Instruction { - switch ri.Op & opMaskCls { - case opClsLoadA, opClsLoadX: - reg := Register(ri.Op & opMaskLoadDest) - sz := 0 - switch ri.Op & opMaskLoadWidth { - case opLoadWidth4: - sz = 4 - case opLoadWidth2: - sz = 2 - case opLoadWidth1: - sz = 1 - default: - return ri - } - switch ri.Op & opMaskLoadMode { - case opAddrModeImmediate: - if sz != 4 { - return ri - } - return LoadConstant{Dst: reg, Val: ri.K} - case opAddrModeScratch: - if sz != 4 || ri.K > 15 { - return ri - } - return LoadScratch{Dst: reg, N: int(ri.K)} - case opAddrModeAbsolute: - if ri.K > extOffset+0xffffffff { - return LoadExtension{Num: Extension(-extOffset + ri.K)} - } - return LoadAbsolute{Size: sz, Off: ri.K} - case opAddrModeIndirect: - return LoadIndirect{Size: sz, Off: ri.K} - case opAddrModePacketLen: - if sz != 4 { - return ri - } - return LoadExtension{Num: ExtLen} - case opAddrModeMemShift: - return LoadMemShift{Off: ri.K} - default: - return ri - } - - case opClsStoreA: - if ri.Op != opClsStoreA || ri.K > 15 { - return ri - } - return StoreScratch{Src: RegA, N: int(ri.K)} - - case opClsStoreX: - if ri.Op != opClsStoreX || ri.K > 15 { - return ri - } - return StoreScratch{Src: RegX, N: int(ri.K)} - - case opClsALU: - switch op := ALUOp(ri.Op & opMaskOperator); op { - case ALUOpAdd, ALUOpSub, ALUOpMul, ALUOpDiv, ALUOpOr, ALUOpAnd, ALUOpShiftLeft, ALUOpShiftRight, ALUOpMod, ALUOpXor: - if ri.Op&opMaskOperandSrc != 0 { - return ALUOpX{Op: op} - } - return ALUOpConstant{Op: op, Val: ri.K} - case aluOpNeg: - return NegateA{} - default: - return ri - } - - case opClsJump: - if ri.Op&opMaskJumpConst != opClsJump { - return ri - } - switch ri.Op & opMaskJumpCond { - case opJumpAlways: - return Jump{Skip: ri.K} - case opJumpEqual: - if ri.Jt == 0 { - return JumpIf{ - Cond: JumpNotEqual, - Val: ri.K, - SkipTrue: ri.Jf, - SkipFalse: 0, - } - } - return JumpIf{ - Cond: JumpEqual, - Val: ri.K, - SkipTrue: ri.Jt, - SkipFalse: ri.Jf, - } - case opJumpGT: - if ri.Jt == 0 { - return JumpIf{ - Cond: JumpLessOrEqual, - Val: ri.K, - SkipTrue: ri.Jf, - SkipFalse: 0, - } - } - return JumpIf{ - Cond: JumpGreaterThan, - Val: ri.K, - SkipTrue: ri.Jt, - SkipFalse: ri.Jf, - } - case opJumpGE: - if ri.Jt == 0 { - return JumpIf{ - Cond: JumpLessThan, - Val: ri.K, - SkipTrue: ri.Jf, - SkipFalse: 0, - } - } - return JumpIf{ - Cond: JumpGreaterOrEqual, - Val: ri.K, - SkipTrue: ri.Jt, - SkipFalse: ri.Jf, - } - case opJumpSet: - return JumpIf{ - Cond: JumpBitsSet, - Val: ri.K, - SkipTrue: ri.Jt, - SkipFalse: ri.Jf, - } - default: - return ri - } - - case opClsReturn: - switch ri.Op { - case opClsReturn | opRetSrcA: - return RetA{} - case opClsReturn | opRetSrcConstant: - return RetConstant{Val: ri.K} - default: - return ri - } - - case opClsMisc: - switch ri.Op { - case opClsMisc | opMiscTAX: - return TAX{} - case opClsMisc | opMiscTXA: - return TXA{} - default: - return ri - } - - default: - panic("unreachable") // switch is exhaustive on the bit pattern - } -} - -// LoadConstant loads Val into register Dst. -type LoadConstant struct { - Dst Register - Val uint32 -} - -// Assemble implements the Instruction Assemble method. -func (a LoadConstant) Assemble() (RawInstruction, error) { - return assembleLoad(a.Dst, 4, opAddrModeImmediate, a.Val) -} - -// String returns the the instruction in assembler notation. -func (a LoadConstant) String() string { - switch a.Dst { - case RegA: - return fmt.Sprintf("ld #%d", a.Val) - case RegX: - return fmt.Sprintf("ldx #%d", a.Val) - default: - return fmt.Sprintf("unknown instruction: %#v", a) - } -} - -// LoadScratch loads scratch[N] into register Dst. -type LoadScratch struct { - Dst Register - N int // 0-15 -} - -// Assemble implements the Instruction Assemble method. -func (a LoadScratch) Assemble() (RawInstruction, error) { - if a.N < 0 || a.N > 15 { - return RawInstruction{}, fmt.Errorf("invalid scratch slot %d", a.N) - } - return assembleLoad(a.Dst, 4, opAddrModeScratch, uint32(a.N)) -} - -// String returns the the instruction in assembler notation. -func (a LoadScratch) String() string { - switch a.Dst { - case RegA: - return fmt.Sprintf("ld M[%d]", a.N) - case RegX: - return fmt.Sprintf("ldx M[%d]", a.N) - default: - return fmt.Sprintf("unknown instruction: %#v", a) - } -} - -// LoadAbsolute loads packet[Off:Off+Size] as an integer value into -// register A. -type LoadAbsolute struct { - Off uint32 - Size int // 1, 2 or 4 -} - -// Assemble implements the Instruction Assemble method. -func (a LoadAbsolute) Assemble() (RawInstruction, error) { - return assembleLoad(RegA, a.Size, opAddrModeAbsolute, a.Off) -} - -// String returns the the instruction in assembler notation. -func (a LoadAbsolute) String() string { - switch a.Size { - case 1: // byte - return fmt.Sprintf("ldb [%d]", a.Off) - case 2: // half word - return fmt.Sprintf("ldh [%d]", a.Off) - case 4: // word - if a.Off > extOffset+0xffffffff { - return LoadExtension{Num: Extension(a.Off + 0x1000)}.String() - } - return fmt.Sprintf("ld [%d]", a.Off) - default: - return fmt.Sprintf("unknown instruction: %#v", a) - } -} - -// LoadIndirect loads packet[X+Off:X+Off+Size] as an integer value -// into register A. -type LoadIndirect struct { - Off uint32 - Size int // 1, 2 or 4 -} - -// Assemble implements the Instruction Assemble method. -func (a LoadIndirect) Assemble() (RawInstruction, error) { - return assembleLoad(RegA, a.Size, opAddrModeIndirect, a.Off) -} - -// String returns the the instruction in assembler notation. -func (a LoadIndirect) String() string { - switch a.Size { - case 1: // byte - return fmt.Sprintf("ldb [x + %d]", a.Off) - case 2: // half word - return fmt.Sprintf("ldh [x + %d]", a.Off) - case 4: // word - return fmt.Sprintf("ld [x + %d]", a.Off) - default: - return fmt.Sprintf("unknown instruction: %#v", a) - } -} - -// LoadMemShift multiplies the first 4 bits of the byte at packet[Off] -// by 4 and stores the result in register X. -// -// This instruction is mainly useful to load into X the length of an -// IPv4 packet header in a single instruction, rather than have to do -// the arithmetic on the header's first byte by hand. -type LoadMemShift struct { - Off uint32 -} - -// Assemble implements the Instruction Assemble method. -func (a LoadMemShift) Assemble() (RawInstruction, error) { - return assembleLoad(RegX, 1, opAddrModeMemShift, a.Off) -} - -// String returns the the instruction in assembler notation. -func (a LoadMemShift) String() string { - return fmt.Sprintf("ldx 4*([%d]&0xf)", a.Off) -} - -// LoadExtension invokes a linux-specific extension and stores the -// result in register A. -type LoadExtension struct { - Num Extension -} - -// Assemble implements the Instruction Assemble method. -func (a LoadExtension) Assemble() (RawInstruction, error) { - if a.Num == ExtLen { - return assembleLoad(RegA, 4, opAddrModePacketLen, 0) - } - return assembleLoad(RegA, 4, opAddrModeAbsolute, uint32(extOffset+a.Num)) -} - -// String returns the the instruction in assembler notation. -func (a LoadExtension) String() string { - switch a.Num { - case ExtLen: - return "ld #len" - case ExtProto: - return "ld #proto" - case ExtType: - return "ld #type" - case ExtPayloadOffset: - return "ld #poff" - case ExtInterfaceIndex: - return "ld #ifidx" - case ExtNetlinkAttr: - return "ld #nla" - case ExtNetlinkAttrNested: - return "ld #nlan" - case ExtMark: - return "ld #mark" - case ExtQueue: - return "ld #queue" - case ExtLinkLayerType: - return "ld #hatype" - case ExtRXHash: - return "ld #rxhash" - case ExtCPUID: - return "ld #cpu" - case ExtVLANTag: - return "ld #vlan_tci" - case ExtVLANTagPresent: - return "ld #vlan_avail" - case ExtVLANProto: - return "ld #vlan_tpid" - case ExtRand: - return "ld #rand" - default: - return fmt.Sprintf("unknown instruction: %#v", a) - } -} - -// StoreScratch stores register Src into scratch[N]. -type StoreScratch struct { - Src Register - N int // 0-15 -} - -// Assemble implements the Instruction Assemble method. -func (a StoreScratch) Assemble() (RawInstruction, error) { - if a.N < 0 || a.N > 15 { - return RawInstruction{}, fmt.Errorf("invalid scratch slot %d", a.N) - } - var op uint16 - switch a.Src { - case RegA: - op = opClsStoreA - case RegX: - op = opClsStoreX - default: - return RawInstruction{}, fmt.Errorf("invalid source register %v", a.Src) - } - - return RawInstruction{ - Op: op, - K: uint32(a.N), - }, nil -} - -// String returns the the instruction in assembler notation. -func (a StoreScratch) String() string { - switch a.Src { - case RegA: - return fmt.Sprintf("st M[%d]", a.N) - case RegX: - return fmt.Sprintf("stx M[%d]", a.N) - default: - return fmt.Sprintf("unknown instruction: %#v", a) - } -} - -// ALUOpConstant executes A = A Val. -type ALUOpConstant struct { - Op ALUOp - Val uint32 -} - -// Assemble implements the Instruction Assemble method. -func (a ALUOpConstant) Assemble() (RawInstruction, error) { - return RawInstruction{ - Op: opClsALU | opALUSrcConstant | uint16(a.Op), - K: a.Val, - }, nil -} - -// String returns the the instruction in assembler notation. -func (a ALUOpConstant) String() string { - switch a.Op { - case ALUOpAdd: - return fmt.Sprintf("add #%d", a.Val) - case ALUOpSub: - return fmt.Sprintf("sub #%d", a.Val) - case ALUOpMul: - return fmt.Sprintf("mul #%d", a.Val) - case ALUOpDiv: - return fmt.Sprintf("div #%d", a.Val) - case ALUOpMod: - return fmt.Sprintf("mod #%d", a.Val) - case ALUOpAnd: - return fmt.Sprintf("and #%d", a.Val) - case ALUOpOr: - return fmt.Sprintf("or #%d", a.Val) - case ALUOpXor: - return fmt.Sprintf("xor #%d", a.Val) - case ALUOpShiftLeft: - return fmt.Sprintf("lsh #%d", a.Val) - case ALUOpShiftRight: - return fmt.Sprintf("rsh #%d", a.Val) - default: - return fmt.Sprintf("unknown instruction: %#v", a) - } -} - -// ALUOpX executes A = A X -type ALUOpX struct { - Op ALUOp -} - -// Assemble implements the Instruction Assemble method. -func (a ALUOpX) Assemble() (RawInstruction, error) { - return RawInstruction{ - Op: opClsALU | opALUSrcX | uint16(a.Op), - }, nil -} - -// String returns the the instruction in assembler notation. -func (a ALUOpX) String() string { - switch a.Op { - case ALUOpAdd: - return "add x" - case ALUOpSub: - return "sub x" - case ALUOpMul: - return "mul x" - case ALUOpDiv: - return "div x" - case ALUOpMod: - return "mod x" - case ALUOpAnd: - return "and x" - case ALUOpOr: - return "or x" - case ALUOpXor: - return "xor x" - case ALUOpShiftLeft: - return "lsh x" - case ALUOpShiftRight: - return "rsh x" - default: - return fmt.Sprintf("unknown instruction: %#v", a) - } -} - -// NegateA executes A = -A. -type NegateA struct{} - -// Assemble implements the Instruction Assemble method. -func (a NegateA) Assemble() (RawInstruction, error) { - return RawInstruction{ - Op: opClsALU | uint16(aluOpNeg), - }, nil -} - -// String returns the the instruction in assembler notation. -func (a NegateA) String() string { - return fmt.Sprintf("neg") -} - -// Jump skips the following Skip instructions in the program. -type Jump struct { - Skip uint32 -} - -// Assemble implements the Instruction Assemble method. -func (a Jump) Assemble() (RawInstruction, error) { - return RawInstruction{ - Op: opClsJump | opJumpAlways, - K: a.Skip, - }, nil -} - -// String returns the the instruction in assembler notation. -func (a Jump) String() string { - return fmt.Sprintf("ja %d", a.Skip) -} - -// JumpIf skips the following Skip instructions in the program if A -// Val is true. -type JumpIf struct { - Cond JumpTest - Val uint32 - SkipTrue uint8 - SkipFalse uint8 -} - -// Assemble implements the Instruction Assemble method. -func (a JumpIf) Assemble() (RawInstruction, error) { - var ( - cond uint16 - flip bool - ) - switch a.Cond { - case JumpEqual: - cond = opJumpEqual - case JumpNotEqual: - cond, flip = opJumpEqual, true - case JumpGreaterThan: - cond = opJumpGT - case JumpLessThan: - cond, flip = opJumpGE, true - case JumpGreaterOrEqual: - cond = opJumpGE - case JumpLessOrEqual: - cond, flip = opJumpGT, true - case JumpBitsSet: - cond = opJumpSet - case JumpBitsNotSet: - cond, flip = opJumpSet, true - default: - return RawInstruction{}, fmt.Errorf("unknown JumpTest %v", a.Cond) - } - jt, jf := a.SkipTrue, a.SkipFalse - if flip { - jt, jf = jf, jt - } - return RawInstruction{ - Op: opClsJump | cond, - Jt: jt, - Jf: jf, - K: a.Val, - }, nil -} - -// String returns the the instruction in assembler notation. -func (a JumpIf) String() string { - switch a.Cond { - // K == A - case JumpEqual: - return conditionalJump(a, "jeq", "jneq") - // K != A - case JumpNotEqual: - return fmt.Sprintf("jneq #%d,%d", a.Val, a.SkipTrue) - // K > A - case JumpGreaterThan: - return conditionalJump(a, "jgt", "jle") - // K < A - case JumpLessThan: - return fmt.Sprintf("jlt #%d,%d", a.Val, a.SkipTrue) - // K >= A - case JumpGreaterOrEqual: - return conditionalJump(a, "jge", "jlt") - // K <= A - case JumpLessOrEqual: - return fmt.Sprintf("jle #%d,%d", a.Val, a.SkipTrue) - // K & A != 0 - case JumpBitsSet: - if a.SkipFalse > 0 { - return fmt.Sprintf("jset #%d,%d,%d", a.Val, a.SkipTrue, a.SkipFalse) - } - return fmt.Sprintf("jset #%d,%d", a.Val, a.SkipTrue) - // K & A == 0, there is no assembler instruction for JumpBitNotSet, use JumpBitSet and invert skips - case JumpBitsNotSet: - return JumpIf{Cond: JumpBitsSet, SkipTrue: a.SkipFalse, SkipFalse: a.SkipTrue, Val: a.Val}.String() - default: - return fmt.Sprintf("unknown instruction: %#v", a) - } -} - -func conditionalJump(inst JumpIf, positiveJump, negativeJump string) string { - if inst.SkipTrue > 0 { - if inst.SkipFalse > 0 { - return fmt.Sprintf("%s #%d,%d,%d", positiveJump, inst.Val, inst.SkipTrue, inst.SkipFalse) - } - return fmt.Sprintf("%s #%d,%d", positiveJump, inst.Val, inst.SkipTrue) - } - return fmt.Sprintf("%s #%d,%d", negativeJump, inst.Val, inst.SkipFalse) -} - -// RetA exits the BPF program, returning the value of register A. -type RetA struct{} - -// Assemble implements the Instruction Assemble method. -func (a RetA) Assemble() (RawInstruction, error) { - return RawInstruction{ - Op: opClsReturn | opRetSrcA, - }, nil -} - -// String returns the the instruction in assembler notation. -func (a RetA) String() string { - return fmt.Sprintf("ret a") -} - -// RetConstant exits the BPF program, returning a constant value. -type RetConstant struct { - Val uint32 -} - -// Assemble implements the Instruction Assemble method. -func (a RetConstant) Assemble() (RawInstruction, error) { - return RawInstruction{ - Op: opClsReturn | opRetSrcConstant, - K: a.Val, - }, nil -} - -// String returns the the instruction in assembler notation. -func (a RetConstant) String() string { - return fmt.Sprintf("ret #%d", a.Val) -} - -// TXA copies the value of register X to register A. -type TXA struct{} - -// Assemble implements the Instruction Assemble method. -func (a TXA) Assemble() (RawInstruction, error) { - return RawInstruction{ - Op: opClsMisc | opMiscTXA, - }, nil -} - -// String returns the the instruction in assembler notation. -func (a TXA) String() string { - return fmt.Sprintf("txa") -} - -// TAX copies the value of register A to register X. -type TAX struct{} - -// Assemble implements the Instruction Assemble method. -func (a TAX) Assemble() (RawInstruction, error) { - return RawInstruction{ - Op: opClsMisc | opMiscTAX, - }, nil -} - -// String returns the the instruction in assembler notation. -func (a TAX) String() string { - return fmt.Sprintf("tax") -} - -func assembleLoad(dst Register, loadSize int, mode uint16, k uint32) (RawInstruction, error) { - var ( - cls uint16 - sz uint16 - ) - switch dst { - case RegA: - cls = opClsLoadA - case RegX: - cls = opClsLoadX - default: - return RawInstruction{}, fmt.Errorf("invalid target register %v", dst) - } - switch loadSize { - case 1: - sz = opLoadWidth1 - case 2: - sz = opLoadWidth2 - case 4: - sz = opLoadWidth4 - default: - return RawInstruction{}, fmt.Errorf("invalid load byte length %d", sz) - } - return RawInstruction{ - Op: cls | sz | mode, - K: k, - }, nil -} diff --git a/vendor/golang.org/x/net/bpf/instructions_test.go b/vendor/golang.org/x/net/bpf/instructions_test.go deleted file mode 100644 index dde474aba..000000000 --- a/vendor/golang.org/x/net/bpf/instructions_test.go +++ /dev/null @@ -1,525 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf - -import ( - "fmt" - "io/ioutil" - "reflect" - "strconv" - "strings" - "testing" -) - -// This is a direct translation of the program in -// testdata/all_instructions.txt. -var allInstructions = []Instruction{ - LoadConstant{Dst: RegA, Val: 42}, - LoadConstant{Dst: RegX, Val: 42}, - - LoadScratch{Dst: RegA, N: 3}, - LoadScratch{Dst: RegX, N: 3}, - - LoadAbsolute{Off: 42, Size: 1}, - LoadAbsolute{Off: 42, Size: 2}, - LoadAbsolute{Off: 42, Size: 4}, - - LoadIndirect{Off: 42, Size: 1}, - LoadIndirect{Off: 42, Size: 2}, - LoadIndirect{Off: 42, Size: 4}, - - LoadMemShift{Off: 42}, - - LoadExtension{Num: ExtLen}, - LoadExtension{Num: ExtProto}, - LoadExtension{Num: ExtType}, - LoadExtension{Num: ExtRand}, - - StoreScratch{Src: RegA, N: 3}, - StoreScratch{Src: RegX, N: 3}, - - ALUOpConstant{Op: ALUOpAdd, Val: 42}, - ALUOpConstant{Op: ALUOpSub, Val: 42}, - ALUOpConstant{Op: ALUOpMul, Val: 42}, - ALUOpConstant{Op: ALUOpDiv, Val: 42}, - ALUOpConstant{Op: ALUOpOr, Val: 42}, - ALUOpConstant{Op: ALUOpAnd, Val: 42}, - ALUOpConstant{Op: ALUOpShiftLeft, Val: 42}, - ALUOpConstant{Op: ALUOpShiftRight, Val: 42}, - ALUOpConstant{Op: ALUOpMod, Val: 42}, - ALUOpConstant{Op: ALUOpXor, Val: 42}, - - ALUOpX{Op: ALUOpAdd}, - ALUOpX{Op: ALUOpSub}, - ALUOpX{Op: ALUOpMul}, - ALUOpX{Op: ALUOpDiv}, - ALUOpX{Op: ALUOpOr}, - ALUOpX{Op: ALUOpAnd}, - ALUOpX{Op: ALUOpShiftLeft}, - ALUOpX{Op: ALUOpShiftRight}, - ALUOpX{Op: ALUOpMod}, - ALUOpX{Op: ALUOpXor}, - - NegateA{}, - - Jump{Skip: 10}, - JumpIf{Cond: JumpEqual, Val: 42, SkipTrue: 8, SkipFalse: 9}, - JumpIf{Cond: JumpNotEqual, Val: 42, SkipTrue: 8}, - JumpIf{Cond: JumpLessThan, Val: 42, SkipTrue: 7}, - JumpIf{Cond: JumpLessOrEqual, Val: 42, SkipTrue: 6}, - JumpIf{Cond: JumpGreaterThan, Val: 42, SkipTrue: 4, SkipFalse: 5}, - JumpIf{Cond: JumpGreaterOrEqual, Val: 42, SkipTrue: 3, SkipFalse: 4}, - JumpIf{Cond: JumpBitsSet, Val: 42, SkipTrue: 2, SkipFalse: 3}, - - TAX{}, - TXA{}, - - RetA{}, - RetConstant{Val: 42}, -} -var allInstructionsExpected = "testdata/all_instructions.bpf" - -// Check that we produce the same output as the canonical bpf_asm -// linux kernel tool. -func TestInterop(t *testing.T) { - out, err := Assemble(allInstructions) - if err != nil { - t.Fatalf("assembly of allInstructions program failed: %s", err) - } - t.Logf("Assembled program is %d instructions long", len(out)) - - bs, err := ioutil.ReadFile(allInstructionsExpected) - if err != nil { - t.Fatalf("reading %s: %s", allInstructionsExpected, err) - } - // First statement is the number of statements, last statement is - // empty. We just ignore both and rely on slice length. - stmts := strings.Split(string(bs), ",") - if len(stmts)-2 != len(out) { - t.Fatalf("test program lengths don't match: %s has %d, Go implementation has %d", allInstructionsExpected, len(stmts)-2, len(allInstructions)) - } - - for i, stmt := range stmts[1 : len(stmts)-2] { - nums := strings.Split(stmt, " ") - if len(nums) != 4 { - t.Fatalf("malformed instruction %d in %s: %s", i+1, allInstructionsExpected, stmt) - } - - actual := out[i] - - op, err := strconv.ParseUint(nums[0], 10, 16) - if err != nil { - t.Fatalf("malformed opcode %s in instruction %d of %s", nums[0], i+1, allInstructionsExpected) - } - if actual.Op != uint16(op) { - t.Errorf("opcode mismatch on instruction %d (%#v): got 0x%02x, want 0x%02x", i+1, allInstructions[i], actual.Op, op) - } - - jt, err := strconv.ParseUint(nums[1], 10, 8) - if err != nil { - t.Fatalf("malformed jt offset %s in instruction %d of %s", nums[1], i+1, allInstructionsExpected) - } - if actual.Jt != uint8(jt) { - t.Errorf("jt mismatch on instruction %d (%#v): got %d, want %d", i+1, allInstructions[i], actual.Jt, jt) - } - - jf, err := strconv.ParseUint(nums[2], 10, 8) - if err != nil { - t.Fatalf("malformed jf offset %s in instruction %d of %s", nums[2], i+1, allInstructionsExpected) - } - if actual.Jf != uint8(jf) { - t.Errorf("jf mismatch on instruction %d (%#v): got %d, want %d", i+1, allInstructions[i], actual.Jf, jf) - } - - k, err := strconv.ParseUint(nums[3], 10, 32) - if err != nil { - t.Fatalf("malformed constant %s in instruction %d of %s", nums[3], i+1, allInstructionsExpected) - } - if actual.K != uint32(k) { - t.Errorf("constant mismatch on instruction %d (%#v): got %d, want %d", i+1, allInstructions[i], actual.K, k) - } - } -} - -// Check that assembly and disassembly match each other. -func TestAsmDisasm(t *testing.T) { - prog1, err := Assemble(allInstructions) - if err != nil { - t.Fatalf("assembly of allInstructions program failed: %s", err) - } - t.Logf("Assembled program is %d instructions long", len(prog1)) - - got, allDecoded := Disassemble(prog1) - if !allDecoded { - t.Errorf("Disassemble(Assemble(allInstructions)) produced unrecognized instructions:") - for i, inst := range got { - if r, ok := inst.(RawInstruction); ok { - t.Logf(" insn %d, %#v --> %#v", i+1, allInstructions[i], r) - } - } - } - - if len(allInstructions) != len(got) { - t.Fatalf("disassembly changed program size: %d insns before, %d insns after", len(allInstructions), len(got)) - } - if !reflect.DeepEqual(allInstructions, got) { - t.Errorf("program mutated by disassembly:") - for i := range got { - if !reflect.DeepEqual(allInstructions[i], got[i]) { - t.Logf(" insn %d, s: %#v, p1: %#v, got: %#v", i+1, allInstructions[i], prog1[i], got[i]) - } - } - } -} - -type InvalidInstruction struct{} - -func (a InvalidInstruction) Assemble() (RawInstruction, error) { - return RawInstruction{}, fmt.Errorf("Invalid Instruction") -} - -func (a InvalidInstruction) String() string { - return fmt.Sprintf("unknown instruction: %#v", a) -} - -func TestString(t *testing.T) { - testCases := []struct { - instruction Instruction - assembler string - }{ - { - instruction: LoadConstant{Dst: RegA, Val: 42}, - assembler: "ld #42", - }, - { - instruction: LoadConstant{Dst: RegX, Val: 42}, - assembler: "ldx #42", - }, - { - instruction: LoadConstant{Dst: 0xffff, Val: 42}, - assembler: "unknown instruction: bpf.LoadConstant{Dst:0xffff, Val:0x2a}", - }, - { - instruction: LoadScratch{Dst: RegA, N: 3}, - assembler: "ld M[3]", - }, - { - instruction: LoadScratch{Dst: RegX, N: 3}, - assembler: "ldx M[3]", - }, - { - instruction: LoadScratch{Dst: 0xffff, N: 3}, - assembler: "unknown instruction: bpf.LoadScratch{Dst:0xffff, N:3}", - }, - { - instruction: LoadAbsolute{Off: 42, Size: 1}, - assembler: "ldb [42]", - }, - { - instruction: LoadAbsolute{Off: 42, Size: 2}, - assembler: "ldh [42]", - }, - { - instruction: LoadAbsolute{Off: 42, Size: 4}, - assembler: "ld [42]", - }, - { - instruction: LoadAbsolute{Off: 42, Size: -1}, - assembler: "unknown instruction: bpf.LoadAbsolute{Off:0x2a, Size:-1}", - }, - { - instruction: LoadIndirect{Off: 42, Size: 1}, - assembler: "ldb [x + 42]", - }, - { - instruction: LoadIndirect{Off: 42, Size: 2}, - assembler: "ldh [x + 42]", - }, - { - instruction: LoadIndirect{Off: 42, Size: 4}, - assembler: "ld [x + 42]", - }, - { - instruction: LoadIndirect{Off: 42, Size: -1}, - assembler: "unknown instruction: bpf.LoadIndirect{Off:0x2a, Size:-1}", - }, - { - instruction: LoadMemShift{Off: 42}, - assembler: "ldx 4*([42]&0xf)", - }, - { - instruction: LoadExtension{Num: ExtLen}, - assembler: "ld #len", - }, - { - instruction: LoadExtension{Num: ExtProto}, - assembler: "ld #proto", - }, - { - instruction: LoadExtension{Num: ExtType}, - assembler: "ld #type", - }, - { - instruction: LoadExtension{Num: ExtPayloadOffset}, - assembler: "ld #poff", - }, - { - instruction: LoadExtension{Num: ExtInterfaceIndex}, - assembler: "ld #ifidx", - }, - { - instruction: LoadExtension{Num: ExtNetlinkAttr}, - assembler: "ld #nla", - }, - { - instruction: LoadExtension{Num: ExtNetlinkAttrNested}, - assembler: "ld #nlan", - }, - { - instruction: LoadExtension{Num: ExtMark}, - assembler: "ld #mark", - }, - { - instruction: LoadExtension{Num: ExtQueue}, - assembler: "ld #queue", - }, - { - instruction: LoadExtension{Num: ExtLinkLayerType}, - assembler: "ld #hatype", - }, - { - instruction: LoadExtension{Num: ExtRXHash}, - assembler: "ld #rxhash", - }, - { - instruction: LoadExtension{Num: ExtCPUID}, - assembler: "ld #cpu", - }, - { - instruction: LoadExtension{Num: ExtVLANTag}, - assembler: "ld #vlan_tci", - }, - { - instruction: LoadExtension{Num: ExtVLANTagPresent}, - assembler: "ld #vlan_avail", - }, - { - instruction: LoadExtension{Num: ExtVLANProto}, - assembler: "ld #vlan_tpid", - }, - { - instruction: LoadExtension{Num: ExtRand}, - assembler: "ld #rand", - }, - { - instruction: LoadAbsolute{Off: 0xfffff038, Size: 4}, - assembler: "ld #rand", - }, - { - instruction: LoadExtension{Num: 0xfff}, - assembler: "unknown instruction: bpf.LoadExtension{Num:4095}", - }, - { - instruction: StoreScratch{Src: RegA, N: 3}, - assembler: "st M[3]", - }, - { - instruction: StoreScratch{Src: RegX, N: 3}, - assembler: "stx M[3]", - }, - { - instruction: StoreScratch{Src: 0xffff, N: 3}, - assembler: "unknown instruction: bpf.StoreScratch{Src:0xffff, N:3}", - }, - { - instruction: ALUOpConstant{Op: ALUOpAdd, Val: 42}, - assembler: "add #42", - }, - { - instruction: ALUOpConstant{Op: ALUOpSub, Val: 42}, - assembler: "sub #42", - }, - { - instruction: ALUOpConstant{Op: ALUOpMul, Val: 42}, - assembler: "mul #42", - }, - { - instruction: ALUOpConstant{Op: ALUOpDiv, Val: 42}, - assembler: "div #42", - }, - { - instruction: ALUOpConstant{Op: ALUOpOr, Val: 42}, - assembler: "or #42", - }, - { - instruction: ALUOpConstant{Op: ALUOpAnd, Val: 42}, - assembler: "and #42", - }, - { - instruction: ALUOpConstant{Op: ALUOpShiftLeft, Val: 42}, - assembler: "lsh #42", - }, - { - instruction: ALUOpConstant{Op: ALUOpShiftRight, Val: 42}, - assembler: "rsh #42", - }, - { - instruction: ALUOpConstant{Op: ALUOpMod, Val: 42}, - assembler: "mod #42", - }, - { - instruction: ALUOpConstant{Op: ALUOpXor, Val: 42}, - assembler: "xor #42", - }, - { - instruction: ALUOpConstant{Op: 0xffff, Val: 42}, - assembler: "unknown instruction: bpf.ALUOpConstant{Op:0xffff, Val:0x2a}", - }, - { - instruction: ALUOpX{Op: ALUOpAdd}, - assembler: "add x", - }, - { - instruction: ALUOpX{Op: ALUOpSub}, - assembler: "sub x", - }, - { - instruction: ALUOpX{Op: ALUOpMul}, - assembler: "mul x", - }, - { - instruction: ALUOpX{Op: ALUOpDiv}, - assembler: "div x", - }, - { - instruction: ALUOpX{Op: ALUOpOr}, - assembler: "or x", - }, - { - instruction: ALUOpX{Op: ALUOpAnd}, - assembler: "and x", - }, - { - instruction: ALUOpX{Op: ALUOpShiftLeft}, - assembler: "lsh x", - }, - { - instruction: ALUOpX{Op: ALUOpShiftRight}, - assembler: "rsh x", - }, - { - instruction: ALUOpX{Op: ALUOpMod}, - assembler: "mod x", - }, - { - instruction: ALUOpX{Op: ALUOpXor}, - assembler: "xor x", - }, - { - instruction: ALUOpX{Op: 0xffff}, - assembler: "unknown instruction: bpf.ALUOpX{Op:0xffff}", - }, - { - instruction: NegateA{}, - assembler: "neg", - }, - { - instruction: Jump{Skip: 10}, - assembler: "ja 10", - }, - { - instruction: JumpIf{Cond: JumpEqual, Val: 42, SkipTrue: 8, SkipFalse: 9}, - assembler: "jeq #42,8,9", - }, - { - instruction: JumpIf{Cond: JumpEqual, Val: 42, SkipTrue: 8}, - assembler: "jeq #42,8", - }, - { - instruction: JumpIf{Cond: JumpEqual, Val: 42, SkipFalse: 8}, - assembler: "jneq #42,8", - }, - { - instruction: JumpIf{Cond: JumpNotEqual, Val: 42, SkipTrue: 8}, - assembler: "jneq #42,8", - }, - { - instruction: JumpIf{Cond: JumpLessThan, Val: 42, SkipTrue: 7}, - assembler: "jlt #42,7", - }, - { - instruction: JumpIf{Cond: JumpLessOrEqual, Val: 42, SkipTrue: 6}, - assembler: "jle #42,6", - }, - { - instruction: JumpIf{Cond: JumpGreaterThan, Val: 42, SkipTrue: 4, SkipFalse: 5}, - assembler: "jgt #42,4,5", - }, - { - instruction: JumpIf{Cond: JumpGreaterThan, Val: 42, SkipTrue: 4}, - assembler: "jgt #42,4", - }, - { - instruction: JumpIf{Cond: JumpGreaterOrEqual, Val: 42, SkipTrue: 3, SkipFalse: 4}, - assembler: "jge #42,3,4", - }, - { - instruction: JumpIf{Cond: JumpGreaterOrEqual, Val: 42, SkipTrue: 3}, - assembler: "jge #42,3", - }, - { - instruction: JumpIf{Cond: JumpBitsSet, Val: 42, SkipTrue: 2, SkipFalse: 3}, - assembler: "jset #42,2,3", - }, - { - instruction: JumpIf{Cond: JumpBitsSet, Val: 42, SkipTrue: 2}, - assembler: "jset #42,2", - }, - { - instruction: JumpIf{Cond: JumpBitsNotSet, Val: 42, SkipTrue: 2, SkipFalse: 3}, - assembler: "jset #42,3,2", - }, - { - instruction: JumpIf{Cond: JumpBitsNotSet, Val: 42, SkipTrue: 2}, - assembler: "jset #42,0,2", - }, - { - instruction: JumpIf{Cond: 0xffff, Val: 42, SkipTrue: 1, SkipFalse: 2}, - assembler: "unknown instruction: bpf.JumpIf{Cond:0xffff, Val:0x2a, SkipTrue:0x1, SkipFalse:0x2}", - }, - { - instruction: TAX{}, - assembler: "tax", - }, - { - instruction: TXA{}, - assembler: "txa", - }, - { - instruction: RetA{}, - assembler: "ret a", - }, - { - instruction: RetConstant{Val: 42}, - assembler: "ret #42", - }, - // Invalid instruction - { - instruction: InvalidInstruction{}, - assembler: "unknown instruction: bpf.InvalidInstruction{}", - }, - } - - for _, testCase := range testCases { - if input, ok := testCase.instruction.(fmt.Stringer); ok { - got := input.String() - if got != testCase.assembler { - t.Errorf("String did not return expected assembler notation, expected: %s, got: %s", testCase.assembler, got) - } - } else { - t.Errorf("Instruction %#v is not a fmt.Stringer", testCase.instruction) - } - } -} diff --git a/vendor/golang.org/x/net/bpf/setter.go b/vendor/golang.org/x/net/bpf/setter.go deleted file mode 100644 index 43e35f0ac..000000000 --- a/vendor/golang.org/x/net/bpf/setter.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf - -// A Setter is a type which can attach a compiled BPF filter to itself. -type Setter interface { - SetBPF(filter []RawInstruction) error -} diff --git a/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf b/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf deleted file mode 100644 index f87144064..000000000 --- a/vendor/golang.org/x/net/bpf/testdata/all_instructions.bpf +++ /dev/null @@ -1 +0,0 @@ -50,0 0 0 42,1 0 0 42,96 0 0 3,97 0 0 3,48 0 0 42,40 0 0 42,32 0 0 42,80 0 0 42,72 0 0 42,64 0 0 42,177 0 0 42,128 0 0 0,32 0 0 4294963200,32 0 0 4294963204,32 0 0 4294963256,2 0 0 3,3 0 0 3,4 0 0 42,20 0 0 42,36 0 0 42,52 0 0 42,68 0 0 42,84 0 0 42,100 0 0 42,116 0 0 42,148 0 0 42,164 0 0 42,12 0 0 0,28 0 0 0,44 0 0 0,60 0 0 0,76 0 0 0,92 0 0 0,108 0 0 0,124 0 0 0,156 0 0 0,172 0 0 0,132 0 0 0,5 0 0 10,21 8 9 42,21 0 8 42,53 0 7 42,37 0 6 42,37 4 5 42,53 3 4 42,69 2 3 42,7 0 0 0,135 0 0 0,22 0 0 0,6 0 0 0, diff --git a/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt b/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt deleted file mode 100644 index 304550155..000000000 --- a/vendor/golang.org/x/net/bpf/testdata/all_instructions.txt +++ /dev/null @@ -1,79 +0,0 @@ -# This filter is compiled to all_instructions.bpf by the `bpf_asm` -# tool, which can be found in the linux kernel source tree under -# tools/net. - -# Load immediate -ld #42 -ldx #42 - -# Load scratch -ld M[3] -ldx M[3] - -# Load absolute -ldb [42] -ldh [42] -ld [42] - -# Load indirect -ldb [x + 42] -ldh [x + 42] -ld [x + 42] - -# Load IPv4 header length -ldx 4*([42]&0xf) - -# Run extension function -ld #len -ld #proto -ld #type -ld #rand - -# Store scratch -st M[3] -stx M[3] - -# A constant -add #42 -sub #42 -mul #42 -div #42 -or #42 -and #42 -lsh #42 -rsh #42 -mod #42 -xor #42 - -# A X -add x -sub x -mul x -div x -or x -and x -lsh x -rsh x -mod x -xor x - -# !A -neg - -# Jumps -ja end -jeq #42,prev,end -jne #42,end -jlt #42,end -jle #42,end -jgt #42,prev,end -jge #42,prev,end -jset #42,prev,end - -# Register transfers -tax -txa - -# Returns -prev: ret a -end: ret #42 diff --git a/vendor/golang.org/x/net/bpf/vm.go b/vendor/golang.org/x/net/bpf/vm.go deleted file mode 100644 index 4c656f1e1..000000000 --- a/vendor/golang.org/x/net/bpf/vm.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf - -import ( - "errors" - "fmt" -) - -// A VM is an emulated BPF virtual machine. -type VM struct { - filter []Instruction -} - -// NewVM returns a new VM using the input BPF program. -func NewVM(filter []Instruction) (*VM, error) { - if len(filter) == 0 { - return nil, errors.New("one or more Instructions must be specified") - } - - for i, ins := range filter { - check := len(filter) - (i + 1) - switch ins := ins.(type) { - // Check for out-of-bounds jumps in instructions - case Jump: - if check <= int(ins.Skip) { - return nil, fmt.Errorf("cannot jump %d instructions; jumping past program bounds", ins.Skip) - } - case JumpIf: - if check <= int(ins.SkipTrue) { - return nil, fmt.Errorf("cannot jump %d instructions in true case; jumping past program bounds", ins.SkipTrue) - } - if check <= int(ins.SkipFalse) { - return nil, fmt.Errorf("cannot jump %d instructions in false case; jumping past program bounds", ins.SkipFalse) - } - // Check for division or modulus by zero - case ALUOpConstant: - if ins.Val != 0 { - break - } - - switch ins.Op { - case ALUOpDiv, ALUOpMod: - return nil, errors.New("cannot divide by zero using ALUOpConstant") - } - // Check for unknown extensions - case LoadExtension: - switch ins.Num { - case ExtLen: - default: - return nil, fmt.Errorf("extension %d not implemented", ins.Num) - } - } - } - - // Make sure last instruction is a return instruction - switch filter[len(filter)-1].(type) { - case RetA, RetConstant: - default: - return nil, errors.New("BPF program must end with RetA or RetConstant") - } - - // Though our VM works using disassembled instructions, we - // attempt to assemble the input filter anyway to ensure it is compatible - // with an operating system VM. - _, err := Assemble(filter) - - return &VM{ - filter: filter, - }, err -} - -// Run runs the VM's BPF program against the input bytes. -// Run returns the number of bytes accepted by the BPF program, and any errors -// which occurred while processing the program. -func (v *VM) Run(in []byte) (int, error) { - var ( - // Registers of the virtual machine - regA uint32 - regX uint32 - regScratch [16]uint32 - - // OK is true if the program should continue processing the next - // instruction, or false if not, causing the loop to break - ok = true - ) - - // TODO(mdlayher): implement: - // - NegateA: - // - would require a change from uint32 registers to int32 - // registers - - // TODO(mdlayher): add interop tests that check signedness of ALU - // operations against kernel implementation, and make sure Go - // implementation matches behavior - - for i := 0; i < len(v.filter) && ok; i++ { - ins := v.filter[i] - - switch ins := ins.(type) { - case ALUOpConstant: - regA = aluOpConstant(ins, regA) - case ALUOpX: - regA, ok = aluOpX(ins, regA, regX) - case Jump: - i += int(ins.Skip) - case JumpIf: - jump := jumpIf(ins, regA) - i += jump - case LoadAbsolute: - regA, ok = loadAbsolute(ins, in) - case LoadConstant: - regA, regX = loadConstant(ins, regA, regX) - case LoadExtension: - regA = loadExtension(ins, in) - case LoadIndirect: - regA, ok = loadIndirect(ins, in, regX) - case LoadMemShift: - regX, ok = loadMemShift(ins, in) - case LoadScratch: - regA, regX = loadScratch(ins, regScratch, regA, regX) - case RetA: - return int(regA), nil - case RetConstant: - return int(ins.Val), nil - case StoreScratch: - regScratch = storeScratch(ins, regScratch, regA, regX) - case TAX: - regX = regA - case TXA: - regA = regX - default: - return 0, fmt.Errorf("unknown Instruction at index %d: %T", i, ins) - } - } - - return 0, nil -} diff --git a/vendor/golang.org/x/net/bpf/vm_aluop_test.go b/vendor/golang.org/x/net/bpf/vm_aluop_test.go deleted file mode 100644 index 16678244a..000000000 --- a/vendor/golang.org/x/net/bpf/vm_aluop_test.go +++ /dev/null @@ -1,512 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf_test - -import ( - "testing" - - "golang.org/x/net/bpf" -) - -func TestVMALUOpAdd(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.ALUOpConstant{ - Op: bpf.ALUOpAdd, - Val: 3, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 8, 2, 3, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 3, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpSub(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.TAX{}, - bpf.ALUOpX{ - Op: bpf.ALUOpSub, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 1, 2, 3, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 0, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpMul(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.ALUOpConstant{ - Op: bpf.ALUOpMul, - Val: 2, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 6, 2, 3, 4, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 4, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpDiv(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.ALUOpConstant{ - Op: bpf.ALUOpDiv, - Val: 2, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 20, 2, 3, 4, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 2, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpDivByZeroALUOpConstant(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.ALUOpConstant{ - Op: bpf.ALUOpDiv, - Val: 0, - }, - bpf.RetA{}, - }) - if errStr(err) != "cannot divide by zero using ALUOpConstant" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMALUOpDivByZeroALUOpX(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - // Load byte 0 into X - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.TAX{}, - // Load byte 1 into A - bpf.LoadAbsolute{ - Off: 9, - Size: 1, - }, - // Attempt to perform 1/0 - bpf.ALUOpX{ - Op: bpf.ALUOpDiv, - }, - // Return 4 bytes if program does not terminate - bpf.LoadConstant{ - Val: 12, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, 1, 3, 4, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 0, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpOr(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 2, - }, - bpf.ALUOpConstant{ - Op: bpf.ALUOpOr, - Val: 0x01, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0x00, 0x10, 0x03, 0x04, - 0x05, 0x06, 0x07, 0x08, - 0x09, 0xff, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 9, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpAnd(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 2, - }, - bpf.ALUOpConstant{ - Op: bpf.ALUOpAnd, - Val: 0x0019, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xaa, 0x09, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 1, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpShiftLeft(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.ALUOpConstant{ - Op: bpf.ALUOpShiftLeft, - Val: 0x01, - }, - bpf.JumpIf{ - Cond: bpf.JumpEqual, - Val: 0x02, - SkipTrue: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 9, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0x01, 0xaa, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 1, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpShiftRight(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.ALUOpConstant{ - Op: bpf.ALUOpShiftRight, - Val: 0x01, - }, - bpf.JumpIf{ - Cond: bpf.JumpEqual, - Val: 0x04, - SkipTrue: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 9, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0x08, 0xff, 0xff, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 1, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpMod(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.ALUOpConstant{ - Op: bpf.ALUOpMod, - Val: 20, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 30, 0, 0, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 2, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpModByZeroALUOpConstant(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.ALUOpConstant{ - Op: bpf.ALUOpMod, - Val: 0, - }, - bpf.RetA{}, - }) - if errStr(err) != "cannot divide by zero using ALUOpConstant" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMALUOpModByZeroALUOpX(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - // Load byte 0 into X - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.TAX{}, - // Load byte 1 into A - bpf.LoadAbsolute{ - Off: 9, - Size: 1, - }, - // Attempt to perform 1%0 - bpf.ALUOpX{ - Op: bpf.ALUOpMod, - }, - // Return 4 bytes if program does not terminate - bpf.LoadConstant{ - Val: 12, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, 1, 3, 4, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 0, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpXor(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.ALUOpConstant{ - Op: bpf.ALUOpXor, - Val: 0x0a, - }, - bpf.JumpIf{ - Cond: bpf.JumpEqual, - Val: 0x01, - SkipTrue: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 9, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0x0b, 0x00, 0x00, 0x00, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 1, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMALUOpUnknown(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.ALUOpConstant{ - Op: bpf.ALUOpAdd, - Val: 1, - }, - // Verify that an unknown operation is a no-op - bpf.ALUOpConstant{ - Op: 100, - }, - bpf.JumpIf{ - Cond: bpf.JumpEqual, - Val: 0x02, - SkipTrue: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 9, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 1, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 1, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} diff --git a/vendor/golang.org/x/net/bpf/vm_bpf_test.go b/vendor/golang.org/x/net/bpf/vm_bpf_test.go deleted file mode 100644 index 77fa8fe4a..000000000 --- a/vendor/golang.org/x/net/bpf/vm_bpf_test.go +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf_test - -import ( - "net" - "runtime" - "testing" - "time" - - "golang.org/x/net/bpf" - "golang.org/x/net/ipv4" -) - -// A virtualMachine is a BPF virtual machine which can process an -// input packet against a BPF program and render a verdict. -type virtualMachine interface { - Run(in []byte) (int, error) -} - -// canUseOSVM indicates if the OS BPF VM is available on this platform. -func canUseOSVM() bool { - // OS BPF VM can only be used on platforms where x/net/ipv4 supports - // attaching a BPF program to a socket. - switch runtime.GOOS { - case "linux": - return true - } - - return false -} - -// All BPF tests against both the Go VM and OS VM are assumed to -// be used with a UDP socket. As a result, the entire contents -// of a UDP datagram is sent through the BPF program, but only -// the body after the UDP header will ever be returned in output. - -// testVM sets up a Go BPF VM, and if available, a native OS BPF VM -// for integration testing. -func testVM(t *testing.T, filter []bpf.Instruction) (virtualMachine, func(), error) { - goVM, err := bpf.NewVM(filter) - if err != nil { - // Some tests expect an error, so this error must be returned - // instead of fatally exiting the test - return nil, nil, err - } - - mvm := &multiVirtualMachine{ - goVM: goVM, - - t: t, - } - - // If available, add the OS VM for tests which verify that both the Go - // VM and OS VM have exactly the same output for the same input program - // and packet. - done := func() {} - if canUseOSVM() { - osVM, osVMDone := testOSVM(t, filter) - done = func() { osVMDone() } - mvm.osVM = osVM - } - - return mvm, done, nil -} - -// udpHeaderLen is the length of a UDP header. -const udpHeaderLen = 8 - -// A multiVirtualMachine is a virtualMachine which can call out to both the Go VM -// and the native OS VM, if the OS VM is available. -type multiVirtualMachine struct { - goVM virtualMachine - osVM virtualMachine - - t *testing.T -} - -func (mvm *multiVirtualMachine) Run(in []byte) (int, error) { - if len(in) < udpHeaderLen { - mvm.t.Fatalf("input must be at least length of UDP header (%d), got: %d", - udpHeaderLen, len(in)) - } - - // All tests have a UDP header as part of input, because the OS VM - // packets always will. For the Go VM, this output is trimmed before - // being sent back to tests. - goOut, goErr := mvm.goVM.Run(in) - if goOut >= udpHeaderLen { - goOut -= udpHeaderLen - } - - // If Go output is larger than the size of the packet, packet filtering - // interop tests must trim the output bytes to the length of the packet. - // The BPF VM should not do this on its own, as other uses of it do - // not trim the output byte count. - trim := len(in) - udpHeaderLen - if goOut > trim { - goOut = trim - } - - // When the OS VM is not available, process using the Go VM alone - if mvm.osVM == nil { - return goOut, goErr - } - - // The OS VM will apply its own UDP header, so remove the pseudo header - // that the Go VM needs. - osOut, err := mvm.osVM.Run(in[udpHeaderLen:]) - if err != nil { - mvm.t.Fatalf("error while running OS VM: %v", err) - } - - // Verify both VMs return same number of bytes - var mismatch bool - if goOut != osOut { - mismatch = true - mvm.t.Logf("output byte count does not match:\n- go: %v\n- os: %v", goOut, osOut) - } - - if mismatch { - mvm.t.Fatal("Go BPF and OS BPF packet outputs do not match") - } - - return goOut, goErr -} - -// An osVirtualMachine is a virtualMachine which uses the OS's BPF VM for -// processing BPF programs. -type osVirtualMachine struct { - l net.PacketConn - s net.Conn -} - -// testOSVM creates a virtualMachine which uses the OS's BPF VM by injecting -// packets into a UDP listener with a BPF program attached to it. -func testOSVM(t *testing.T, filter []bpf.Instruction) (virtualMachine, func()) { - l, err := net.ListenPacket("udp4", "127.0.0.1:0") - if err != nil { - t.Fatalf("failed to open OS VM UDP listener: %v", err) - } - - prog, err := bpf.Assemble(filter) - if err != nil { - t.Fatalf("failed to compile BPF program: %v", err) - } - - p := ipv4.NewPacketConn(l) - if err = p.SetBPF(prog); err != nil { - t.Fatalf("failed to attach BPF program to listener: %v", err) - } - - s, err := net.Dial("udp4", l.LocalAddr().String()) - if err != nil { - t.Fatalf("failed to dial connection to listener: %v", err) - } - - done := func() { - _ = s.Close() - _ = l.Close() - } - - return &osVirtualMachine{ - l: l, - s: s, - }, done -} - -// Run sends the input bytes into the OS's BPF VM and returns its verdict. -func (vm *osVirtualMachine) Run(in []byte) (int, error) { - go func() { - _, _ = vm.s.Write(in) - }() - - vm.l.SetDeadline(time.Now().Add(50 * time.Millisecond)) - - var b [512]byte - n, _, err := vm.l.ReadFrom(b[:]) - if err != nil { - // A timeout indicates that BPF filtered out the packet, and thus, - // no input should be returned. - if nerr, ok := err.(net.Error); ok && nerr.Timeout() { - return n, nil - } - - return n, err - } - - return n, nil -} diff --git a/vendor/golang.org/x/net/bpf/vm_extension_test.go b/vendor/golang.org/x/net/bpf/vm_extension_test.go deleted file mode 100644 index 7a48c82f3..000000000 --- a/vendor/golang.org/x/net/bpf/vm_extension_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf_test - -import ( - "testing" - - "golang.org/x/net/bpf" -) - -func TestVMLoadExtensionNotImplemented(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.LoadExtension{ - Num: 100, - }, - bpf.RetA{}, - }) - if errStr(err) != "extension 100 not implemented" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMLoadExtensionExtLen(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadExtension{ - Num: bpf.ExtLen, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, 1, 2, 3, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 4, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} diff --git a/vendor/golang.org/x/net/bpf/vm_instructions.go b/vendor/golang.org/x/net/bpf/vm_instructions.go deleted file mode 100644 index 516f9462b..000000000 --- a/vendor/golang.org/x/net/bpf/vm_instructions.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf - -import ( - "encoding/binary" - "fmt" -) - -func aluOpConstant(ins ALUOpConstant, regA uint32) uint32 { - return aluOpCommon(ins.Op, regA, ins.Val) -} - -func aluOpX(ins ALUOpX, regA uint32, regX uint32) (uint32, bool) { - // Guard against division or modulus by zero by terminating - // the program, as the OS BPF VM does - if regX == 0 { - switch ins.Op { - case ALUOpDiv, ALUOpMod: - return 0, false - } - } - - return aluOpCommon(ins.Op, regA, regX), true -} - -func aluOpCommon(op ALUOp, regA uint32, value uint32) uint32 { - switch op { - case ALUOpAdd: - return regA + value - case ALUOpSub: - return regA - value - case ALUOpMul: - return regA * value - case ALUOpDiv: - // Division by zero not permitted by NewVM and aluOpX checks - return regA / value - case ALUOpOr: - return regA | value - case ALUOpAnd: - return regA & value - case ALUOpShiftLeft: - return regA << value - case ALUOpShiftRight: - return regA >> value - case ALUOpMod: - // Modulus by zero not permitted by NewVM and aluOpX checks - return regA % value - case ALUOpXor: - return regA ^ value - default: - return regA - } -} - -func jumpIf(ins JumpIf, value uint32) int { - var ok bool - inV := uint32(ins.Val) - - switch ins.Cond { - case JumpEqual: - ok = value == inV - case JumpNotEqual: - ok = value != inV - case JumpGreaterThan: - ok = value > inV - case JumpLessThan: - ok = value < inV - case JumpGreaterOrEqual: - ok = value >= inV - case JumpLessOrEqual: - ok = value <= inV - case JumpBitsSet: - ok = (value & inV) != 0 - case JumpBitsNotSet: - ok = (value & inV) == 0 - } - - if ok { - return int(ins.SkipTrue) - } - - return int(ins.SkipFalse) -} - -func loadAbsolute(ins LoadAbsolute, in []byte) (uint32, bool) { - offset := int(ins.Off) - size := int(ins.Size) - - return loadCommon(in, offset, size) -} - -func loadConstant(ins LoadConstant, regA uint32, regX uint32) (uint32, uint32) { - switch ins.Dst { - case RegA: - regA = ins.Val - case RegX: - regX = ins.Val - } - - return regA, regX -} - -func loadExtension(ins LoadExtension, in []byte) uint32 { - switch ins.Num { - case ExtLen: - return uint32(len(in)) - default: - panic(fmt.Sprintf("unimplemented extension: %d", ins.Num)) - } -} - -func loadIndirect(ins LoadIndirect, in []byte, regX uint32) (uint32, bool) { - offset := int(ins.Off) + int(regX) - size := int(ins.Size) - - return loadCommon(in, offset, size) -} - -func loadMemShift(ins LoadMemShift, in []byte) (uint32, bool) { - offset := int(ins.Off) - - if !inBounds(len(in), offset, 0) { - return 0, false - } - - // Mask off high 4 bits and multiply low 4 bits by 4 - return uint32(in[offset]&0x0f) * 4, true -} - -func inBounds(inLen int, offset int, size int) bool { - return offset+size <= inLen -} - -func loadCommon(in []byte, offset int, size int) (uint32, bool) { - if !inBounds(len(in), offset, size) { - return 0, false - } - - switch size { - case 1: - return uint32(in[offset]), true - case 2: - return uint32(binary.BigEndian.Uint16(in[offset : offset+size])), true - case 4: - return uint32(binary.BigEndian.Uint32(in[offset : offset+size])), true - default: - panic(fmt.Sprintf("invalid load size: %d", size)) - } -} - -func loadScratch(ins LoadScratch, regScratch [16]uint32, regA uint32, regX uint32) (uint32, uint32) { - switch ins.Dst { - case RegA: - regA = regScratch[ins.N] - case RegX: - regX = regScratch[ins.N] - } - - return regA, regX -} - -func storeScratch(ins StoreScratch, regScratch [16]uint32, regA uint32, regX uint32) [16]uint32 { - switch ins.Src { - case RegA: - regScratch[ins.N] = regA - case RegX: - regScratch[ins.N] = regX - } - - return regScratch -} diff --git a/vendor/golang.org/x/net/bpf/vm_jump_test.go b/vendor/golang.org/x/net/bpf/vm_jump_test.go deleted file mode 100644 index e0a3a988b..000000000 --- a/vendor/golang.org/x/net/bpf/vm_jump_test.go +++ /dev/null @@ -1,380 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf_test - -import ( - "testing" - - "golang.org/x/net/bpf" -) - -func TestVMJumpOne(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.Jump{ - Skip: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 9, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 1, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 1, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMJumpOutOfProgram(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.Jump{ - Skip: 1, - }, - bpf.RetA{}, - }) - if errStr(err) != "cannot jump 1 instructions; jumping past program bounds" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMJumpIfTrueOutOfProgram(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.JumpIf{ - Cond: bpf.JumpEqual, - SkipTrue: 2, - }, - bpf.RetA{}, - }) - if errStr(err) != "cannot jump 2 instructions in true case; jumping past program bounds" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMJumpIfFalseOutOfProgram(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.JumpIf{ - Cond: bpf.JumpEqual, - SkipFalse: 3, - }, - bpf.RetA{}, - }) - if errStr(err) != "cannot jump 3 instructions in false case; jumping past program bounds" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMJumpIfEqual(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.JumpIf{ - Cond: bpf.JumpEqual, - Val: 1, - SkipTrue: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 9, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 1, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 1, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMJumpIfNotEqual(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.JumpIf{ - Cond: bpf.JumpNotEqual, - Val: 1, - SkipFalse: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 9, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 1, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 1, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMJumpIfGreaterThan(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 4, - }, - bpf.JumpIf{ - Cond: bpf.JumpGreaterThan, - Val: 0x00010202, - SkipTrue: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 12, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, 1, 2, 3, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 4, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMJumpIfLessThan(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 4, - }, - bpf.JumpIf{ - Cond: bpf.JumpLessThan, - Val: 0xff010203, - SkipTrue: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 12, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, 1, 2, 3, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 4, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMJumpIfGreaterOrEqual(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 4, - }, - bpf.JumpIf{ - Cond: bpf.JumpGreaterOrEqual, - Val: 0x00010203, - SkipTrue: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 12, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, 1, 2, 3, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 4, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMJumpIfLessOrEqual(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 4, - }, - bpf.JumpIf{ - Cond: bpf.JumpLessOrEqual, - Val: 0xff010203, - SkipTrue: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 12, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, 1, 2, 3, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 4, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMJumpIfBitsSet(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 2, - }, - bpf.JumpIf{ - Cond: bpf.JumpBitsSet, - Val: 0x1122, - SkipTrue: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 10, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0x01, 0x02, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 2, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMJumpIfBitsNotSet(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 2, - }, - bpf.JumpIf{ - Cond: bpf.JumpBitsNotSet, - Val: 0x1221, - SkipTrue: 1, - }, - bpf.RetConstant{ - Val: 0, - }, - bpf.RetConstant{ - Val: 10, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0x01, 0x02, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 2, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} diff --git a/vendor/golang.org/x/net/bpf/vm_load_test.go b/vendor/golang.org/x/net/bpf/vm_load_test.go deleted file mode 100644 index 04578b66b..000000000 --- a/vendor/golang.org/x/net/bpf/vm_load_test.go +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf_test - -import ( - "net" - "testing" - - "golang.org/x/net/bpf" - "golang.org/x/net/ipv4" -) - -func TestVMLoadAbsoluteOffsetOutOfBounds(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 100, - Size: 2, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, 1, 2, 3, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 0, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMLoadAbsoluteOffsetPlusSizeOutOfBounds(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 2, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 0, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMLoadAbsoluteBadInstructionSize(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Size: 5, - }, - bpf.RetA{}, - }) - if errStr(err) != "assembling instruction 1: invalid load byte length 0" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMLoadConstantOK(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadConstant{ - Dst: bpf.RegX, - Val: 9, - }, - bpf.TXA{}, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 1, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMLoadIndirectOutOfBounds(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadIndirect{ - Off: 100, - Size: 1, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 0, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMLoadMemShiftOutOfBounds(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadMemShift{ - Off: 100, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 0, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -const ( - dhcp4Port = 53 -) - -func TestVMLoadMemShiftLoadIndirectNoResult(t *testing.T) { - vm, in, done := testDHCPv4(t) - defer done() - - // Append mostly empty UDP header with incorrect DHCPv4 port - in = append(in, []byte{ - 0, 0, - 0, dhcp4Port + 1, - 0, 0, - 0, 0, - }...) - - out, err := vm.Run(in) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 0, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMLoadMemShiftLoadIndirectOK(t *testing.T) { - vm, in, done := testDHCPv4(t) - defer done() - - // Append mostly empty UDP header with correct DHCPv4 port - in = append(in, []byte{ - 0, 0, - 0, dhcp4Port, - 0, 0, - 0, 0, - }...) - - out, err := vm.Run(in) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := len(in)-8, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func testDHCPv4(t *testing.T) (virtualMachine, []byte, func()) { - // DHCPv4 test data courtesy of David Anderson: - // https://github.com/google/netboot/blob/master/dhcp4/conn_linux.go#L59-L70 - vm, done, err := testVM(t, []bpf.Instruction{ - // Load IPv4 packet length - bpf.LoadMemShift{Off: 8}, - // Get UDP dport - bpf.LoadIndirect{Off: 8 + 2, Size: 2}, - // Correct dport? - bpf.JumpIf{Cond: bpf.JumpEqual, Val: dhcp4Port, SkipFalse: 1}, - // Accept - bpf.RetConstant{Val: 1500}, - // Ignore - bpf.RetConstant{Val: 0}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - - // Minimal requirements to make a valid IPv4 header - h := &ipv4.Header{ - Len: ipv4.HeaderLen, - Src: net.IPv4(192, 168, 1, 1), - Dst: net.IPv4(192, 168, 1, 2), - } - hb, err := h.Marshal() - if err != nil { - t.Fatalf("failed to marshal IPv4 header: %v", err) - } - - hb = append([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - }, hb...) - - return vm, hb, done -} diff --git a/vendor/golang.org/x/net/bpf/vm_ret_test.go b/vendor/golang.org/x/net/bpf/vm_ret_test.go deleted file mode 100644 index 2d86eae3e..000000000 --- a/vendor/golang.org/x/net/bpf/vm_ret_test.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf_test - -import ( - "testing" - - "golang.org/x/net/bpf" -) - -func TestVMRetA(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 9, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 1, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMRetALargerThanInput(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadAbsolute{ - Off: 8, - Size: 2, - }, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, 255, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 2, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMRetConstant(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.RetConstant{ - Val: 9, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, 1, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 1, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMRetConstantLargerThanInput(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.RetConstant{ - Val: 16, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0, 1, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 2, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} diff --git a/vendor/golang.org/x/net/bpf/vm_scratch_test.go b/vendor/golang.org/x/net/bpf/vm_scratch_test.go deleted file mode 100644 index e600e3c28..000000000 --- a/vendor/golang.org/x/net/bpf/vm_scratch_test.go +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf_test - -import ( - "testing" - - "golang.org/x/net/bpf" -) - -func TestVMStoreScratchInvalidScratchRegisterTooSmall(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.StoreScratch{ - Src: bpf.RegA, - N: -1, - }, - bpf.RetA{}, - }) - if errStr(err) != "assembling instruction 1: invalid scratch slot -1" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMStoreScratchInvalidScratchRegisterTooLarge(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.StoreScratch{ - Src: bpf.RegA, - N: 16, - }, - bpf.RetA{}, - }) - if errStr(err) != "assembling instruction 1: invalid scratch slot 16" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMStoreScratchUnknownSourceRegister(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.StoreScratch{ - Src: 100, - N: 0, - }, - bpf.RetA{}, - }) - if errStr(err) != "assembling instruction 1: invalid source register 100" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMLoadScratchInvalidScratchRegisterTooSmall(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.LoadScratch{ - Dst: bpf.RegX, - N: -1, - }, - bpf.RetA{}, - }) - if errStr(err) != "assembling instruction 1: invalid scratch slot -1" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMLoadScratchInvalidScratchRegisterTooLarge(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.LoadScratch{ - Dst: bpf.RegX, - N: 16, - }, - bpf.RetA{}, - }) - if errStr(err) != "assembling instruction 1: invalid scratch slot 16" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMLoadScratchUnknownDestinationRegister(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.LoadScratch{ - Dst: 100, - N: 0, - }, - bpf.RetA{}, - }) - if errStr(err) != "assembling instruction 1: invalid target register 100" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMStoreScratchLoadScratchOneValue(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - // Load byte 255 - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - // Copy to X and store in scratch[0] - bpf.TAX{}, - bpf.StoreScratch{ - Src: bpf.RegX, - N: 0, - }, - // Load byte 1 - bpf.LoadAbsolute{ - Off: 9, - Size: 1, - }, - // Overwrite 1 with 255 from scratch[0] - bpf.LoadScratch{ - Dst: bpf.RegA, - N: 0, - }, - // Return 255 - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 255, 1, 2, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 3, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} - -func TestVMStoreScratchLoadScratchMultipleValues(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - // Load byte 10 - bpf.LoadAbsolute{ - Off: 8, - Size: 1, - }, - // Store in scratch[0] - bpf.StoreScratch{ - Src: bpf.RegA, - N: 0, - }, - // Load byte 20 - bpf.LoadAbsolute{ - Off: 9, - Size: 1, - }, - // Store in scratch[1] - bpf.StoreScratch{ - Src: bpf.RegA, - N: 1, - }, - // Load byte 30 - bpf.LoadAbsolute{ - Off: 10, - Size: 1, - }, - // Store in scratch[2] - bpf.StoreScratch{ - Src: bpf.RegA, - N: 2, - }, - // Load byte 1 - bpf.LoadAbsolute{ - Off: 11, - Size: 1, - }, - // Store in scratch[3] - bpf.StoreScratch{ - Src: bpf.RegA, - N: 3, - }, - // Load in byte 10 to X - bpf.LoadScratch{ - Dst: bpf.RegX, - N: 0, - }, - // Copy X -> A - bpf.TXA{}, - // Verify value is 10 - bpf.JumpIf{ - Cond: bpf.JumpEqual, - Val: 10, - SkipTrue: 1, - }, - // Fail test if incorrect - bpf.RetConstant{ - Val: 0, - }, - // Load in byte 20 to A - bpf.LoadScratch{ - Dst: bpf.RegA, - N: 1, - }, - // Verify value is 20 - bpf.JumpIf{ - Cond: bpf.JumpEqual, - Val: 20, - SkipTrue: 1, - }, - // Fail test if incorrect - bpf.RetConstant{ - Val: 0, - }, - // Load in byte 30 to A - bpf.LoadScratch{ - Dst: bpf.RegA, - N: 2, - }, - // Verify value is 30 - bpf.JumpIf{ - Cond: bpf.JumpEqual, - Val: 30, - SkipTrue: 1, - }, - // Fail test if incorrect - bpf.RetConstant{ - Val: 0, - }, - // Return first two bytes on success - bpf.RetConstant{ - Val: 10, - }, - }) - if err != nil { - t.Fatalf("failed to load BPF program: %v", err) - } - defer done() - - out, err := vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 10, 20, 30, 1, - }) - if err != nil { - t.Fatalf("unexpected error while running program: %v", err) - } - if want, got := 2, out; want != got { - t.Fatalf("unexpected number of output bytes:\n- want: %d\n- got: %d", - want, got) - } -} diff --git a/vendor/golang.org/x/net/bpf/vm_test.go b/vendor/golang.org/x/net/bpf/vm_test.go deleted file mode 100644 index 6bd4dd5c3..000000000 --- a/vendor/golang.org/x/net/bpf/vm_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bpf_test - -import ( - "fmt" - "testing" - - "golang.org/x/net/bpf" -) - -var _ bpf.Instruction = unknown{} - -type unknown struct{} - -func (unknown) Assemble() (bpf.RawInstruction, error) { - return bpf.RawInstruction{}, nil -} - -func TestVMUnknownInstruction(t *testing.T) { - vm, done, err := testVM(t, []bpf.Instruction{ - bpf.LoadConstant{ - Dst: bpf.RegA, - Val: 100, - }, - // Should terminate the program with an error immediately - unknown{}, - bpf.RetA{}, - }) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - defer done() - - _, err = vm.Run([]byte{ - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, - }) - if errStr(err) != "unknown Instruction at index 1: bpf_test.unknown" { - t.Fatalf("unexpected error while running program: %v", err) - } -} - -func TestVMNoReturnInstruction(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{ - bpf.LoadConstant{ - Dst: bpf.RegA, - Val: 1, - }, - }) - if errStr(err) != "BPF program must end with RetA or RetConstant" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestVMNoInputInstructions(t *testing.T) { - _, _, err := testVM(t, []bpf.Instruction{}) - if errStr(err) != "one or more Instructions must be specified" { - t.Fatalf("unexpected error: %v", err) - } -} - -// ExampleNewVM demonstrates usage of a VM, using an Ethernet frame -// as input and checking its EtherType to determine if it should be accepted. -func ExampleNewVM() { - // Offset | Length | Comment - // ------------------------- - // 00 | 06 | Ethernet destination MAC address - // 06 | 06 | Ethernet source MAC address - // 12 | 02 | Ethernet EtherType - const ( - etOff = 12 - etLen = 2 - - etARP = 0x0806 - ) - - // Set up a VM to filter traffic based on if its EtherType - // matches the ARP EtherType. - vm, err := bpf.NewVM([]bpf.Instruction{ - // Load EtherType value from Ethernet header - bpf.LoadAbsolute{ - Off: etOff, - Size: etLen, - }, - // If EtherType is equal to the ARP EtherType, jump to allow - // packet to be accepted - bpf.JumpIf{ - Cond: bpf.JumpEqual, - Val: etARP, - SkipTrue: 1, - }, - // EtherType does not match the ARP EtherType - bpf.RetConstant{ - Val: 0, - }, - // EtherType matches the ARP EtherType, accept up to 1500 - // bytes of packet - bpf.RetConstant{ - Val: 1500, - }, - }) - if err != nil { - panic(fmt.Sprintf("failed to load BPF program: %v", err)) - } - - // Create an Ethernet frame with the ARP EtherType for testing - frame := []byte{ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, - 0x08, 0x06, - // Payload omitted for brevity - } - - // Run our VM's BPF program using the Ethernet frame as input - out, err := vm.Run(frame) - if err != nil { - panic(fmt.Sprintf("failed to accept Ethernet frame: %v", err)) - } - - // BPF VM can return a byte count greater than the number of input - // bytes, so trim the output to match the input byte length - if out > len(frame) { - out = len(frame) - } - - fmt.Printf("out: %d bytes", out) - - // Output: - // out: 14 bytes -} - -// errStr returns the string representation of an error, or -// "" if it is nil. -func errStr(err error) string { - if err == nil { - return "" - } - - return err.Error() -} diff --git a/vendor/golang.org/x/net/dict/dict.go b/vendor/golang.org/x/net/dict/dict.go deleted file mode 100644 index 93e65c03c..000000000 --- a/vendor/golang.org/x/net/dict/dict.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package dict implements the Dictionary Server Protocol -// as defined in RFC 2229. -package dict // import "golang.org/x/net/dict" - -import ( - "net/textproto" - "strconv" - "strings" -) - -// A Client represents a client connection to a dictionary server. -type Client struct { - text *textproto.Conn -} - -// Dial returns a new client connected to a dictionary server at -// addr on the given network. -func Dial(network, addr string) (*Client, error) { - text, err := textproto.Dial(network, addr) - if err != nil { - return nil, err - } - _, _, err = text.ReadCodeLine(220) - if err != nil { - text.Close() - return nil, err - } - return &Client{text: text}, nil -} - -// Close closes the connection to the dictionary server. -func (c *Client) Close() error { - return c.text.Close() -} - -// A Dict represents a dictionary available on the server. -type Dict struct { - Name string // short name of dictionary - Desc string // long description -} - -// Dicts returns a list of the dictionaries available on the server. -func (c *Client) Dicts() ([]Dict, error) { - id, err := c.text.Cmd("SHOW DB") - if err != nil { - return nil, err - } - - c.text.StartResponse(id) - defer c.text.EndResponse(id) - - _, _, err = c.text.ReadCodeLine(110) - if err != nil { - return nil, err - } - lines, err := c.text.ReadDotLines() - if err != nil { - return nil, err - } - _, _, err = c.text.ReadCodeLine(250) - - dicts := make([]Dict, len(lines)) - for i := range dicts { - d := &dicts[i] - a, _ := fields(lines[i]) - if len(a) < 2 { - return nil, textproto.ProtocolError("invalid dictionary: " + lines[i]) - } - d.Name = a[0] - d.Desc = a[1] - } - return dicts, err -} - -// A Defn represents a definition. -type Defn struct { - Dict Dict // Dict where definition was found - Word string // Word being defined - Text []byte // Definition text, typically multiple lines -} - -// Define requests the definition of the given word. -// The argument dict names the dictionary to use, -// the Name field of a Dict returned by Dicts. -// -// The special dictionary name "*" means to look in all the -// server's dictionaries. -// The special dictionary name "!" means to look in all the -// server's dictionaries in turn, stopping after finding the word -// in one of them. -func (c *Client) Define(dict, word string) ([]*Defn, error) { - id, err := c.text.Cmd("DEFINE %s %q", dict, word) - if err != nil { - return nil, err - } - - c.text.StartResponse(id) - defer c.text.EndResponse(id) - - _, line, err := c.text.ReadCodeLine(150) - if err != nil { - return nil, err - } - a, _ := fields(line) - if len(a) < 1 { - return nil, textproto.ProtocolError("malformed response: " + line) - } - n, err := strconv.Atoi(a[0]) - if err != nil { - return nil, textproto.ProtocolError("invalid definition count: " + a[0]) - } - def := make([]*Defn, n) - for i := 0; i < n; i++ { - _, line, err = c.text.ReadCodeLine(151) - if err != nil { - return nil, err - } - a, _ := fields(line) - if len(a) < 3 { - // skip it, to keep protocol in sync - i-- - n-- - def = def[0:n] - continue - } - d := &Defn{Word: a[0], Dict: Dict{a[1], a[2]}} - d.Text, err = c.text.ReadDotBytes() - if err != nil { - return nil, err - } - def[i] = d - } - _, _, err = c.text.ReadCodeLine(250) - return def, err -} - -// Fields returns the fields in s. -// Fields are space separated unquoted words -// or quoted with single or double quote. -func fields(s string) ([]string, error) { - var v []string - i := 0 - for { - for i < len(s) && (s[i] == ' ' || s[i] == '\t') { - i++ - } - if i >= len(s) { - break - } - if s[i] == '"' || s[i] == '\'' { - q := s[i] - // quoted string - var j int - for j = i + 1; ; j++ { - if j >= len(s) { - return nil, textproto.ProtocolError("malformed quoted string") - } - if s[j] == '\\' { - j++ - continue - } - if s[j] == q { - j++ - break - } - } - v = append(v, unquote(s[i+1:j-1])) - i = j - } else { - // atom - var j int - for j = i; j < len(s); j++ { - if s[j] == ' ' || s[j] == '\t' || s[j] == '\\' || s[j] == '"' || s[j] == '\'' { - break - } - } - v = append(v, s[i:j]) - i = j - } - if i < len(s) { - c := s[i] - if c != ' ' && c != '\t' { - return nil, textproto.ProtocolError("quotes not on word boundaries") - } - } - } - return v, nil -} - -func unquote(s string) string { - if strings.Index(s, "\\") < 0 { - return s - } - b := []byte(s) - w := 0 - for r := 0; r < len(b); r++ { - c := b[r] - if c == '\\' { - r++ - c = b[r] - } - b[w] = c - w++ - } - return string(b[0:w]) -} diff --git a/vendor/golang.org/x/net/dns/dnsmessage/example_test.go b/vendor/golang.org/x/net/dns/dnsmessage/example_test.go deleted file mode 100644 index 5415c2d3a..000000000 --- a/vendor/golang.org/x/net/dns/dnsmessage/example_test.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package dnsmessage_test - -import ( - "fmt" - "net" - "strings" - - "golang.org/x/net/dns/dnsmessage" -) - -func mustNewName(name string) dnsmessage.Name { - n, err := dnsmessage.NewName(name) - if err != nil { - panic(err) - } - return n -} - -func ExampleParser() { - msg := dnsmessage.Message{ - Header: dnsmessage.Header{Response: true, Authoritative: true}, - Questions: []dnsmessage.Question{ - { - Name: mustNewName("foo.bar.example.com."), - Type: dnsmessage.TypeA, - Class: dnsmessage.ClassINET, - }, - { - Name: mustNewName("bar.example.com."), - Type: dnsmessage.TypeA, - Class: dnsmessage.ClassINET, - }, - }, - Answers: []dnsmessage.Resource{ - { - dnsmessage.ResourceHeader{ - Name: mustNewName("foo.bar.example.com."), - Type: dnsmessage.TypeA, - Class: dnsmessage.ClassINET, - }, - &dnsmessage.AResource{[4]byte{127, 0, 0, 1}}, - }, - { - dnsmessage.ResourceHeader{ - Name: mustNewName("bar.example.com."), - Type: dnsmessage.TypeA, - Class: dnsmessage.ClassINET, - }, - &dnsmessage.AResource{[4]byte{127, 0, 0, 2}}, - }, - }, - } - - buf, err := msg.Pack() - if err != nil { - panic(err) - } - - wantName := "bar.example.com." - - var p dnsmessage.Parser - if _, err := p.Start(buf); err != nil { - panic(err) - } - - for { - q, err := p.Question() - if err == dnsmessage.ErrSectionDone { - break - } - if err != nil { - panic(err) - } - - if q.Name.String() != wantName { - continue - } - - fmt.Println("Found question for name", wantName) - if err := p.SkipAllQuestions(); err != nil { - panic(err) - } - break - } - - var gotIPs []net.IP - for { - h, err := p.AnswerHeader() - if err == dnsmessage.ErrSectionDone { - break - } - if err != nil { - panic(err) - } - - if (h.Type != dnsmessage.TypeA && h.Type != dnsmessage.TypeAAAA) || h.Class != dnsmessage.ClassINET { - continue - } - - if !strings.EqualFold(h.Name.String(), wantName) { - if err := p.SkipAnswer(); err != nil { - panic(err) - } - continue - } - - switch h.Type { - case dnsmessage.TypeA: - r, err := p.AResource() - if err != nil { - panic(err) - } - gotIPs = append(gotIPs, r.A[:]) - case dnsmessage.TypeAAAA: - r, err := p.AAAAResource() - if err != nil { - panic(err) - } - gotIPs = append(gotIPs, r.AAAA[:]) - } - } - - fmt.Printf("Found A/AAAA records for name %s: %v\n", wantName, gotIPs) - - // Output: - // Found question for name bar.example.com. - // Found A/AAAA records for name bar.example.com.: [127.0.0.2] -} diff --git a/vendor/golang.org/x/net/dns/dnsmessage/message.go b/vendor/golang.org/x/net/dns/dnsmessage/message.go deleted file mode 100644 index 19b260dea..000000000 --- a/vendor/golang.org/x/net/dns/dnsmessage/message.go +++ /dev/null @@ -1,1997 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package dnsmessage provides a mostly RFC 1035 compliant implementation of -// DNS message packing and unpacking. -// -// This implementation is designed to minimize heap allocations and avoid -// unnecessary packing and unpacking as much as possible. -package dnsmessage - -import ( - "errors" -) - -// Packet formats - -// A Type is a type of DNS request and response. -type Type uint16 - -// A Class is a type of network. -type Class uint16 - -// An OpCode is a DNS operation code. -type OpCode uint16 - -// An RCode is a DNS response status code. -type RCode uint16 - -// Wire constants. -const ( - // ResourceHeader.Type and Question.Type - TypeA Type = 1 - TypeNS Type = 2 - TypeCNAME Type = 5 - TypeSOA Type = 6 - TypePTR Type = 12 - TypeMX Type = 15 - TypeTXT Type = 16 - TypeAAAA Type = 28 - TypeSRV Type = 33 - - // Question.Type - TypeWKS Type = 11 - TypeHINFO Type = 13 - TypeMINFO Type = 14 - TypeAXFR Type = 252 - TypeALL Type = 255 - - // ResourceHeader.Class and Question.Class - ClassINET Class = 1 - ClassCSNET Class = 2 - ClassCHAOS Class = 3 - ClassHESIOD Class = 4 - - // Question.Class - ClassANY Class = 255 - - // Message.Rcode - RCodeSuccess RCode = 0 - RCodeFormatError RCode = 1 - RCodeServerFailure RCode = 2 - RCodeNameError RCode = 3 - RCodeNotImplemented RCode = 4 - RCodeRefused RCode = 5 -) - -var ( - // ErrNotStarted indicates that the prerequisite information isn't - // available yet because the previous records haven't been appropriately - // parsed, skipped or finished. - ErrNotStarted = errors.New("parsing/packing of this type isn't available yet") - - // ErrSectionDone indicated that all records in the section have been - // parsed or finished. - ErrSectionDone = errors.New("parsing/packing of this section has completed") - - errBaseLen = errors.New("insufficient data for base length type") - errCalcLen = errors.New("insufficient data for calculated length type") - errReserved = errors.New("segment prefix is reserved") - errTooManyPtr = errors.New("too many pointers (>10)") - errInvalidPtr = errors.New("invalid pointer") - errNilResouceBody = errors.New("nil resource body") - errResourceLen = errors.New("insufficient data for resource body length") - errSegTooLong = errors.New("segment length too long") - errZeroSegLen = errors.New("zero length segment") - errResTooLong = errors.New("resource length too long") - errTooManyQuestions = errors.New("too many Questions to pack (>65535)") - errTooManyAnswers = errors.New("too many Answers to pack (>65535)") - errTooManyAuthorities = errors.New("too many Authorities to pack (>65535)") - errTooManyAdditionals = errors.New("too many Additionals to pack (>65535)") - errNonCanonicalName = errors.New("name is not in canonical format (it must end with a .)") -) - -// Internal constants. -const ( - // packStartingCap is the default initial buffer size allocated during - // packing. - // - // The starting capacity doesn't matter too much, but most DNS responses - // Will be <= 512 bytes as it is the limit for DNS over UDP. - packStartingCap = 512 - - // uint16Len is the length (in bytes) of a uint16. - uint16Len = 2 - - // uint32Len is the length (in bytes) of a uint32. - uint32Len = 4 - - // headerLen is the length (in bytes) of a DNS header. - // - // A header is comprised of 6 uint16s and no padding. - headerLen = 6 * uint16Len -) - -type nestedError struct { - // s is the current level's error message. - s string - - // err is the nested error. - err error -} - -// nestedError implements error.Error. -func (e *nestedError) Error() string { - return e.s + ": " + e.err.Error() -} - -// Header is a representation of a DNS message header. -type Header struct { - ID uint16 - Response bool - OpCode OpCode - Authoritative bool - Truncated bool - RecursionDesired bool - RecursionAvailable bool - RCode RCode -} - -func (m *Header) pack() (id uint16, bits uint16) { - id = m.ID - bits = uint16(m.OpCode)<<11 | uint16(m.RCode) - if m.RecursionAvailable { - bits |= headerBitRA - } - if m.RecursionDesired { - bits |= headerBitRD - } - if m.Truncated { - bits |= headerBitTC - } - if m.Authoritative { - bits |= headerBitAA - } - if m.Response { - bits |= headerBitQR - } - return -} - -// Message is a representation of a DNS message. -type Message struct { - Header - Questions []Question - Answers []Resource - Authorities []Resource - Additionals []Resource -} - -type section uint8 - -const ( - sectionNotStarted section = iota - sectionHeader - sectionQuestions - sectionAnswers - sectionAuthorities - sectionAdditionals - sectionDone - - headerBitQR = 1 << 15 // query/response (response=1) - headerBitAA = 1 << 10 // authoritative - headerBitTC = 1 << 9 // truncated - headerBitRD = 1 << 8 // recursion desired - headerBitRA = 1 << 7 // recursion available -) - -var sectionNames = map[section]string{ - sectionHeader: "header", - sectionQuestions: "Question", - sectionAnswers: "Answer", - sectionAuthorities: "Authority", - sectionAdditionals: "Additional", -} - -// header is the wire format for a DNS message header. -type header struct { - id uint16 - bits uint16 - questions uint16 - answers uint16 - authorities uint16 - additionals uint16 -} - -func (h *header) count(sec section) uint16 { - switch sec { - case sectionQuestions: - return h.questions - case sectionAnswers: - return h.answers - case sectionAuthorities: - return h.authorities - case sectionAdditionals: - return h.additionals - } - return 0 -} - -func (h *header) pack(msg []byte) []byte { - msg = packUint16(msg, h.id) - msg = packUint16(msg, h.bits) - msg = packUint16(msg, h.questions) - msg = packUint16(msg, h.answers) - msg = packUint16(msg, h.authorities) - return packUint16(msg, h.additionals) -} - -func (h *header) unpack(msg []byte, off int) (int, error) { - newOff := off - var err error - if h.id, newOff, err = unpackUint16(msg, newOff); err != nil { - return off, &nestedError{"id", err} - } - if h.bits, newOff, err = unpackUint16(msg, newOff); err != nil { - return off, &nestedError{"bits", err} - } - if h.questions, newOff, err = unpackUint16(msg, newOff); err != nil { - return off, &nestedError{"questions", err} - } - if h.answers, newOff, err = unpackUint16(msg, newOff); err != nil { - return off, &nestedError{"answers", err} - } - if h.authorities, newOff, err = unpackUint16(msg, newOff); err != nil { - return off, &nestedError{"authorities", err} - } - if h.additionals, newOff, err = unpackUint16(msg, newOff); err != nil { - return off, &nestedError{"additionals", err} - } - return newOff, nil -} - -func (h *header) header() Header { - return Header{ - ID: h.id, - Response: (h.bits & headerBitQR) != 0, - OpCode: OpCode(h.bits>>11) & 0xF, - Authoritative: (h.bits & headerBitAA) != 0, - Truncated: (h.bits & headerBitTC) != 0, - RecursionDesired: (h.bits & headerBitRD) != 0, - RecursionAvailable: (h.bits & headerBitRA) != 0, - RCode: RCode(h.bits & 0xF), - } -} - -// A Resource is a DNS resource record. -type Resource struct { - Header ResourceHeader - Body ResourceBody -} - -// A ResourceBody is a DNS resource record minus the header. -type ResourceBody interface { - // pack packs a Resource except for its header. - pack(msg []byte, compression map[string]int) ([]byte, error) - - // realType returns the actual type of the Resource. This is used to - // fill in the header Type field. - realType() Type -} - -func (r *Resource) pack(msg []byte, compression map[string]int) ([]byte, error) { - if r.Body == nil { - return msg, errNilResouceBody - } - oldMsg := msg - r.Header.Type = r.Body.realType() - msg, length, err := r.Header.pack(msg, compression) - if err != nil { - return msg, &nestedError{"ResourceHeader", err} - } - preLen := len(msg) - msg, err = r.Body.pack(msg, compression) - if err != nil { - return msg, &nestedError{"content", err} - } - if err := r.Header.fixLen(msg, length, preLen); err != nil { - return oldMsg, err - } - return msg, nil -} - -// A Parser allows incrementally parsing a DNS message. -// -// When parsing is started, the Header is parsed. Next, each Question can be -// either parsed or skipped. Alternatively, all Questions can be skipped at -// once. When all Questions have been parsed, attempting to parse Questions -// will return (nil, nil) and attempting to skip Questions will return -// (true, nil). After all Questions have been either parsed or skipped, all -// Answers, Authorities and Additionals can be either parsed or skipped in the -// same way, and each type of Resource must be fully parsed or skipped before -// proceeding to the next type of Resource. -// -// Note that there is no requirement to fully skip or parse the message. -type Parser struct { - msg []byte - header header - - section section - off int - index int - resHeaderValid bool - resHeader ResourceHeader -} - -// Start parses the header and enables the parsing of Questions. -func (p *Parser) Start(msg []byte) (Header, error) { - if p.msg != nil { - *p = Parser{} - } - p.msg = msg - var err error - if p.off, err = p.header.unpack(msg, 0); err != nil { - return Header{}, &nestedError{"unpacking header", err} - } - p.section = sectionQuestions - return p.header.header(), nil -} - -func (p *Parser) checkAdvance(sec section) error { - if p.section < sec { - return ErrNotStarted - } - if p.section > sec { - return ErrSectionDone - } - p.resHeaderValid = false - if p.index == int(p.header.count(sec)) { - p.index = 0 - p.section++ - return ErrSectionDone - } - return nil -} - -func (p *Parser) resource(sec section) (Resource, error) { - var r Resource - var err error - r.Header, err = p.resourceHeader(sec) - if err != nil { - return r, err - } - p.resHeaderValid = false - r.Body, p.off, err = unpackResourceBody(p.msg, p.off, r.Header) - if err != nil { - return Resource{}, &nestedError{"unpacking " + sectionNames[sec], err} - } - p.index++ - return r, nil -} - -func (p *Parser) resourceHeader(sec section) (ResourceHeader, error) { - if p.resHeaderValid { - return p.resHeader, nil - } - if err := p.checkAdvance(sec); err != nil { - return ResourceHeader{}, err - } - var hdr ResourceHeader - off, err := hdr.unpack(p.msg, p.off) - if err != nil { - return ResourceHeader{}, err - } - p.resHeaderValid = true - p.resHeader = hdr - p.off = off - return hdr, nil -} - -func (p *Parser) skipResource(sec section) error { - if p.resHeaderValid { - newOff := p.off + int(p.resHeader.Length) - if newOff > len(p.msg) { - return errResourceLen - } - p.off = newOff - p.resHeaderValid = false - p.index++ - return nil - } - if err := p.checkAdvance(sec); err != nil { - return err - } - var err error - p.off, err = skipResource(p.msg, p.off) - if err != nil { - return &nestedError{"skipping: " + sectionNames[sec], err} - } - p.index++ - return nil -} - -// Question parses a single Question. -func (p *Parser) Question() (Question, error) { - if err := p.checkAdvance(sectionQuestions); err != nil { - return Question{}, err - } - var name Name - off, err := name.unpack(p.msg, p.off) - if err != nil { - return Question{}, &nestedError{"unpacking Question.Name", err} - } - typ, off, err := unpackType(p.msg, off) - if err != nil { - return Question{}, &nestedError{"unpacking Question.Type", err} - } - class, off, err := unpackClass(p.msg, off) - if err != nil { - return Question{}, &nestedError{"unpacking Question.Class", err} - } - p.off = off - p.index++ - return Question{name, typ, class}, nil -} - -// AllQuestions parses all Questions. -func (p *Parser) AllQuestions() ([]Question, error) { - qs := make([]Question, 0, p.header.questions) - for { - q, err := p.Question() - if err == ErrSectionDone { - return qs, nil - } - if err != nil { - return nil, err - } - qs = append(qs, q) - } -} - -// SkipQuestion skips a single Question. -func (p *Parser) SkipQuestion() error { - if err := p.checkAdvance(sectionQuestions); err != nil { - return err - } - off, err := skipName(p.msg, p.off) - if err != nil { - return &nestedError{"skipping Question Name", err} - } - if off, err = skipType(p.msg, off); err != nil { - return &nestedError{"skipping Question Type", err} - } - if off, err = skipClass(p.msg, off); err != nil { - return &nestedError{"skipping Question Class", err} - } - p.off = off - p.index++ - return nil -} - -// SkipAllQuestions skips all Questions. -func (p *Parser) SkipAllQuestions() error { - for { - if err := p.SkipQuestion(); err == ErrSectionDone { - return nil - } else if err != nil { - return err - } - } -} - -// AnswerHeader parses a single Answer ResourceHeader. -func (p *Parser) AnswerHeader() (ResourceHeader, error) { - return p.resourceHeader(sectionAnswers) -} - -// Answer parses a single Answer Resource. -func (p *Parser) Answer() (Resource, error) { - return p.resource(sectionAnswers) -} - -// AllAnswers parses all Answer Resources. -func (p *Parser) AllAnswers() ([]Resource, error) { - as := make([]Resource, 0, p.header.answers) - for { - a, err := p.Answer() - if err == ErrSectionDone { - return as, nil - } - if err != nil { - return nil, err - } - as = append(as, a) - } -} - -// SkipAnswer skips a single Answer Resource. -func (p *Parser) SkipAnswer() error { - return p.skipResource(sectionAnswers) -} - -// SkipAllAnswers skips all Answer Resources. -func (p *Parser) SkipAllAnswers() error { - for { - if err := p.SkipAnswer(); err == ErrSectionDone { - return nil - } else if err != nil { - return err - } - } -} - -// AuthorityHeader parses a single Authority ResourceHeader. -func (p *Parser) AuthorityHeader() (ResourceHeader, error) { - return p.resourceHeader(sectionAuthorities) -} - -// Authority parses a single Authority Resource. -func (p *Parser) Authority() (Resource, error) { - return p.resource(sectionAuthorities) -} - -// AllAuthorities parses all Authority Resources. -func (p *Parser) AllAuthorities() ([]Resource, error) { - as := make([]Resource, 0, p.header.authorities) - for { - a, err := p.Authority() - if err == ErrSectionDone { - return as, nil - } - if err != nil { - return nil, err - } - as = append(as, a) - } -} - -// SkipAuthority skips a single Authority Resource. -func (p *Parser) SkipAuthority() error { - return p.skipResource(sectionAuthorities) -} - -// SkipAllAuthorities skips all Authority Resources. -func (p *Parser) SkipAllAuthorities() error { - for { - if err := p.SkipAuthority(); err == ErrSectionDone { - return nil - } else if err != nil { - return err - } - } -} - -// AdditionalHeader parses a single Additional ResourceHeader. -func (p *Parser) AdditionalHeader() (ResourceHeader, error) { - return p.resourceHeader(sectionAdditionals) -} - -// Additional parses a single Additional Resource. -func (p *Parser) Additional() (Resource, error) { - return p.resource(sectionAdditionals) -} - -// AllAdditionals parses all Additional Resources. -func (p *Parser) AllAdditionals() ([]Resource, error) { - as := make([]Resource, 0, p.header.additionals) - for { - a, err := p.Additional() - if err == ErrSectionDone { - return as, nil - } - if err != nil { - return nil, err - } - as = append(as, a) - } -} - -// SkipAdditional skips a single Additional Resource. -func (p *Parser) SkipAdditional() error { - return p.skipResource(sectionAdditionals) -} - -// SkipAllAdditionals skips all Additional Resources. -func (p *Parser) SkipAllAdditionals() error { - for { - if err := p.SkipAdditional(); err == ErrSectionDone { - return nil - } else if err != nil { - return err - } - } -} - -// CNAMEResource parses a single CNAMEResource. -// -// One of the XXXHeader methods must have been called before calling this -// method. -func (p *Parser) CNAMEResource() (CNAMEResource, error) { - if !p.resHeaderValid || p.resHeader.Type != TypeCNAME { - return CNAMEResource{}, ErrNotStarted - } - r, err := unpackCNAMEResource(p.msg, p.off) - if err != nil { - return CNAMEResource{}, err - } - p.off += int(p.resHeader.Length) - p.resHeaderValid = false - p.index++ - return r, nil -} - -// MXResource parses a single MXResource. -// -// One of the XXXHeader methods must have been called before calling this -// method. -func (p *Parser) MXResource() (MXResource, error) { - if !p.resHeaderValid || p.resHeader.Type != TypeMX { - return MXResource{}, ErrNotStarted - } - r, err := unpackMXResource(p.msg, p.off) - if err != nil { - return MXResource{}, err - } - p.off += int(p.resHeader.Length) - p.resHeaderValid = false - p.index++ - return r, nil -} - -// NSResource parses a single NSResource. -// -// One of the XXXHeader methods must have been called before calling this -// method. -func (p *Parser) NSResource() (NSResource, error) { - if !p.resHeaderValid || p.resHeader.Type != TypeNS { - return NSResource{}, ErrNotStarted - } - r, err := unpackNSResource(p.msg, p.off) - if err != nil { - return NSResource{}, err - } - p.off += int(p.resHeader.Length) - p.resHeaderValid = false - p.index++ - return r, nil -} - -// PTRResource parses a single PTRResource. -// -// One of the XXXHeader methods must have been called before calling this -// method. -func (p *Parser) PTRResource() (PTRResource, error) { - if !p.resHeaderValid || p.resHeader.Type != TypePTR { - return PTRResource{}, ErrNotStarted - } - r, err := unpackPTRResource(p.msg, p.off) - if err != nil { - return PTRResource{}, err - } - p.off += int(p.resHeader.Length) - p.resHeaderValid = false - p.index++ - return r, nil -} - -// SOAResource parses a single SOAResource. -// -// One of the XXXHeader methods must have been called before calling this -// method. -func (p *Parser) SOAResource() (SOAResource, error) { - if !p.resHeaderValid || p.resHeader.Type != TypeSOA { - return SOAResource{}, ErrNotStarted - } - r, err := unpackSOAResource(p.msg, p.off) - if err != nil { - return SOAResource{}, err - } - p.off += int(p.resHeader.Length) - p.resHeaderValid = false - p.index++ - return r, nil -} - -// TXTResource parses a single TXTResource. -// -// One of the XXXHeader methods must have been called before calling this -// method. -func (p *Parser) TXTResource() (TXTResource, error) { - if !p.resHeaderValid || p.resHeader.Type != TypeTXT { - return TXTResource{}, ErrNotStarted - } - r, err := unpackTXTResource(p.msg, p.off, p.resHeader.Length) - if err != nil { - return TXTResource{}, err - } - p.off += int(p.resHeader.Length) - p.resHeaderValid = false - p.index++ - return r, nil -} - -// SRVResource parses a single SRVResource. -// -// One of the XXXHeader methods must have been called before calling this -// method. -func (p *Parser) SRVResource() (SRVResource, error) { - if !p.resHeaderValid || p.resHeader.Type != TypeSRV { - return SRVResource{}, ErrNotStarted - } - r, err := unpackSRVResource(p.msg, p.off) - if err != nil { - return SRVResource{}, err - } - p.off += int(p.resHeader.Length) - p.resHeaderValid = false - p.index++ - return r, nil -} - -// AResource parses a single AResource. -// -// One of the XXXHeader methods must have been called before calling this -// method. -func (p *Parser) AResource() (AResource, error) { - if !p.resHeaderValid || p.resHeader.Type != TypeA { - return AResource{}, ErrNotStarted - } - r, err := unpackAResource(p.msg, p.off) - if err != nil { - return AResource{}, err - } - p.off += int(p.resHeader.Length) - p.resHeaderValid = false - p.index++ - return r, nil -} - -// AAAAResource parses a single AAAAResource. -// -// One of the XXXHeader methods must have been called before calling this -// method. -func (p *Parser) AAAAResource() (AAAAResource, error) { - if !p.resHeaderValid || p.resHeader.Type != TypeAAAA { - return AAAAResource{}, ErrNotStarted - } - r, err := unpackAAAAResource(p.msg, p.off) - if err != nil { - return AAAAResource{}, err - } - p.off += int(p.resHeader.Length) - p.resHeaderValid = false - p.index++ - return r, nil -} - -// Unpack parses a full Message. -func (m *Message) Unpack(msg []byte) error { - var p Parser - var err error - if m.Header, err = p.Start(msg); err != nil { - return err - } - if m.Questions, err = p.AllQuestions(); err != nil { - return err - } - if m.Answers, err = p.AllAnswers(); err != nil { - return err - } - if m.Authorities, err = p.AllAuthorities(); err != nil { - return err - } - if m.Additionals, err = p.AllAdditionals(); err != nil { - return err - } - return nil -} - -// Pack packs a full Message. -func (m *Message) Pack() ([]byte, error) { - // Validate the lengths. It is very unlikely that anyone will try to - // pack more than 65535 of any particular type, but it is possible and - // we should fail gracefully. - if len(m.Questions) > int(^uint16(0)) { - return nil, errTooManyQuestions - } - if len(m.Answers) > int(^uint16(0)) { - return nil, errTooManyAnswers - } - if len(m.Authorities) > int(^uint16(0)) { - return nil, errTooManyAuthorities - } - if len(m.Additionals) > int(^uint16(0)) { - return nil, errTooManyAdditionals - } - - var h header - h.id, h.bits = m.Header.pack() - - h.questions = uint16(len(m.Questions)) - h.answers = uint16(len(m.Answers)) - h.authorities = uint16(len(m.Authorities)) - h.additionals = uint16(len(m.Additionals)) - - msg := make([]byte, 0, packStartingCap) - - msg = h.pack(msg) - - // RFC 1035 allows (but does not require) compression for packing. RFC - // 1035 requires unpacking implementations to support compression, so - // unconditionally enabling it is fine. - // - // DNS lookups are typically done over UDP, and RFC 1035 states that UDP - // DNS packets can be a maximum of 512 bytes long. Without compression, - // many DNS response packets are over this limit, so enabling - // compression will help ensure compliance. - compression := map[string]int{} - - for i := range m.Questions { - var err error - if msg, err = m.Questions[i].pack(msg, compression); err != nil { - return nil, &nestedError{"packing Question", err} - } - } - for i := range m.Answers { - var err error - if msg, err = m.Answers[i].pack(msg, compression); err != nil { - return nil, &nestedError{"packing Answer", err} - } - } - for i := range m.Authorities { - var err error - if msg, err = m.Authorities[i].pack(msg, compression); err != nil { - return nil, &nestedError{"packing Authority", err} - } - } - for i := range m.Additionals { - var err error - if msg, err = m.Additionals[i].pack(msg, compression); err != nil { - return nil, &nestedError{"packing Additional", err} - } - } - - return msg, nil -} - -// A Builder allows incrementally packing a DNS message. -type Builder struct { - msg []byte - header header - section section - compression map[string]int -} - -// Start initializes the builder. -// -// buf is optional (nil is fine), but if provided, Start takes ownership of buf. -func (b *Builder) Start(buf []byte, h Header) { - b.StartWithoutCompression(buf, h) - b.compression = map[string]int{} -} - -// StartWithoutCompression initializes the builder with compression disabled. -// -// This avoids compression related allocations, but can result in larger message -// sizes. Be careful with this mode as it can cause messages to exceed the UDP -// size limit. -// -// buf is optional (nil is fine), but if provided, Start takes ownership of buf. -func (b *Builder) StartWithoutCompression(buf []byte, h Header) { - *b = Builder{msg: buf} - b.header.id, b.header.bits = h.pack() - if cap(b.msg) < headerLen { - b.msg = make([]byte, 0, packStartingCap) - } - b.msg = b.msg[:headerLen] - b.section = sectionHeader -} - -func (b *Builder) startCheck(s section) error { - if b.section <= sectionNotStarted { - return ErrNotStarted - } - if b.section > s { - return ErrSectionDone - } - return nil -} - -// StartQuestions prepares the builder for packing Questions. -func (b *Builder) StartQuestions() error { - if err := b.startCheck(sectionQuestions); err != nil { - return err - } - b.section = sectionQuestions - return nil -} - -// StartAnswers prepares the builder for packing Answers. -func (b *Builder) StartAnswers() error { - if err := b.startCheck(sectionAnswers); err != nil { - return err - } - b.section = sectionAnswers - return nil -} - -// StartAuthorities prepares the builder for packing Authorities. -func (b *Builder) StartAuthorities() error { - if err := b.startCheck(sectionAuthorities); err != nil { - return err - } - b.section = sectionAuthorities - return nil -} - -// StartAdditionals prepares the builder for packing Additionals. -func (b *Builder) StartAdditionals() error { - if err := b.startCheck(sectionAdditionals); err != nil { - return err - } - b.section = sectionAdditionals - return nil -} - -func (b *Builder) incrementSectionCount() error { - var count *uint16 - var err error - switch b.section { - case sectionQuestions: - count = &b.header.questions - err = errTooManyQuestions - case sectionAnswers: - count = &b.header.answers - err = errTooManyAnswers - case sectionAuthorities: - count = &b.header.authorities - err = errTooManyAuthorities - case sectionAdditionals: - count = &b.header.additionals - err = errTooManyAdditionals - } - if *count == ^uint16(0) { - return err - } - *count++ - return nil -} - -// Question adds a single Question. -func (b *Builder) Question(q Question) error { - if b.section < sectionQuestions { - return ErrNotStarted - } - if b.section > sectionQuestions { - return ErrSectionDone - } - msg, err := q.pack(b.msg, b.compression) - if err != nil { - return err - } - if err := b.incrementSectionCount(); err != nil { - return err - } - b.msg = msg - return nil -} - -func (b *Builder) checkResourceSection() error { - if b.section < sectionAnswers { - return ErrNotStarted - } - if b.section > sectionAdditionals { - return ErrSectionDone - } - return nil -} - -// CNAMEResource adds a single CNAMEResource. -func (b *Builder) CNAMEResource(h ResourceHeader, r CNAMEResource) error { - if err := b.checkResourceSection(); err != nil { - return err - } - h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression) - if err != nil { - return &nestedError{"ResourceHeader", err} - } - preLen := len(msg) - if msg, err = r.pack(msg, b.compression); err != nil { - return &nestedError{"CNAMEResource body", err} - } - if err := h.fixLen(msg, length, preLen); err != nil { - return err - } - if err := b.incrementSectionCount(); err != nil { - return err - } - b.msg = msg - return nil -} - -// MXResource adds a single MXResource. -func (b *Builder) MXResource(h ResourceHeader, r MXResource) error { - if err := b.checkResourceSection(); err != nil { - return err - } - h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression) - if err != nil { - return &nestedError{"ResourceHeader", err} - } - preLen := len(msg) - if msg, err = r.pack(msg, b.compression); err != nil { - return &nestedError{"MXResource body", err} - } - if err := h.fixLen(msg, length, preLen); err != nil { - return err - } - if err := b.incrementSectionCount(); err != nil { - return err - } - b.msg = msg - return nil -} - -// NSResource adds a single NSResource. -func (b *Builder) NSResource(h ResourceHeader, r NSResource) error { - if err := b.checkResourceSection(); err != nil { - return err - } - h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression) - if err != nil { - return &nestedError{"ResourceHeader", err} - } - preLen := len(msg) - if msg, err = r.pack(msg, b.compression); err != nil { - return &nestedError{"NSResource body", err} - } - if err := h.fixLen(msg, length, preLen); err != nil { - return err - } - if err := b.incrementSectionCount(); err != nil { - return err - } - b.msg = msg - return nil -} - -// PTRResource adds a single PTRResource. -func (b *Builder) PTRResource(h ResourceHeader, r PTRResource) error { - if err := b.checkResourceSection(); err != nil { - return err - } - h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression) - if err != nil { - return &nestedError{"ResourceHeader", err} - } - preLen := len(msg) - if msg, err = r.pack(msg, b.compression); err != nil { - return &nestedError{"PTRResource body", err} - } - if err := h.fixLen(msg, length, preLen); err != nil { - return err - } - if err := b.incrementSectionCount(); err != nil { - return err - } - b.msg = msg - return nil -} - -// SOAResource adds a single SOAResource. -func (b *Builder) SOAResource(h ResourceHeader, r SOAResource) error { - if err := b.checkResourceSection(); err != nil { - return err - } - h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression) - if err != nil { - return &nestedError{"ResourceHeader", err} - } - preLen := len(msg) - if msg, err = r.pack(msg, b.compression); err != nil { - return &nestedError{"SOAResource body", err} - } - if err := h.fixLen(msg, length, preLen); err != nil { - return err - } - if err := b.incrementSectionCount(); err != nil { - return err - } - b.msg = msg - return nil -} - -// TXTResource adds a single TXTResource. -func (b *Builder) TXTResource(h ResourceHeader, r TXTResource) error { - if err := b.checkResourceSection(); err != nil { - return err - } - h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression) - if err != nil { - return &nestedError{"ResourceHeader", err} - } - preLen := len(msg) - if msg, err = r.pack(msg, b.compression); err != nil { - return &nestedError{"TXTResource body", err} - } - if err := h.fixLen(msg, length, preLen); err != nil { - return err - } - if err := b.incrementSectionCount(); err != nil { - return err - } - b.msg = msg - return nil -} - -// SRVResource adds a single SRVResource. -func (b *Builder) SRVResource(h ResourceHeader, r SRVResource) error { - if err := b.checkResourceSection(); err != nil { - return err - } - h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression) - if err != nil { - return &nestedError{"ResourceHeader", err} - } - preLen := len(msg) - if msg, err = r.pack(msg, b.compression); err != nil { - return &nestedError{"SRVResource body", err} - } - if err := h.fixLen(msg, length, preLen); err != nil { - return err - } - if err := b.incrementSectionCount(); err != nil { - return err - } - b.msg = msg - return nil -} - -// AResource adds a single AResource. -func (b *Builder) AResource(h ResourceHeader, r AResource) error { - if err := b.checkResourceSection(); err != nil { - return err - } - h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression) - if err != nil { - return &nestedError{"ResourceHeader", err} - } - preLen := len(msg) - if msg, err = r.pack(msg, b.compression); err != nil { - return &nestedError{"AResource body", err} - } - if err := h.fixLen(msg, length, preLen); err != nil { - return err - } - if err := b.incrementSectionCount(); err != nil { - return err - } - b.msg = msg - return nil -} - -// AAAAResource adds a single AAAAResource. -func (b *Builder) AAAAResource(h ResourceHeader, r AAAAResource) error { - if err := b.checkResourceSection(); err != nil { - return err - } - h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression) - if err != nil { - return &nestedError{"ResourceHeader", err} - } - preLen := len(msg) - if msg, err = r.pack(msg, b.compression); err != nil { - return &nestedError{"AAAAResource body", err} - } - if err := h.fixLen(msg, length, preLen); err != nil { - return err - } - if err := b.incrementSectionCount(); err != nil { - return err - } - b.msg = msg - return nil -} - -// Finish ends message building and generates a binary packet. -func (b *Builder) Finish() ([]byte, error) { - if b.section < sectionHeader { - return nil, ErrNotStarted - } - b.section = sectionDone - b.header.pack(b.msg[:0]) - return b.msg, nil -} - -// A ResourceHeader is the header of a DNS resource record. There are -// many types of DNS resource records, but they all share the same header. -type ResourceHeader struct { - // Name is the domain name for which this resource record pertains. - Name Name - - // Type is the type of DNS resource record. - // - // This field will be set automatically during packing. - Type Type - - // Class is the class of network to which this DNS resource record - // pertains. - Class Class - - // TTL is the length of time (measured in seconds) which this resource - // record is valid for (time to live). All Resources in a set should - // have the same TTL (RFC 2181 Section 5.2). - TTL uint32 - - // Length is the length of data in the resource record after the header. - // - // This field will be set automatically during packing. - Length uint16 -} - -// pack packs all of the fields in a ResourceHeader except for the length. The -// length bytes are returned as a slice so they can be filled in after the rest -// of the Resource has been packed. -func (h *ResourceHeader) pack(oldMsg []byte, compression map[string]int) (msg []byte, length []byte, err error) { - msg = oldMsg - if msg, err = h.Name.pack(msg, compression); err != nil { - return oldMsg, nil, &nestedError{"Name", err} - } - msg = packType(msg, h.Type) - msg = packClass(msg, h.Class) - msg = packUint32(msg, h.TTL) - lenBegin := len(msg) - msg = packUint16(msg, h.Length) - return msg, msg[lenBegin : lenBegin+uint16Len], nil -} - -func (h *ResourceHeader) unpack(msg []byte, off int) (int, error) { - newOff := off - var err error - if newOff, err = h.Name.unpack(msg, newOff); err != nil { - return off, &nestedError{"Name", err} - } - if h.Type, newOff, err = unpackType(msg, newOff); err != nil { - return off, &nestedError{"Type", err} - } - if h.Class, newOff, err = unpackClass(msg, newOff); err != nil { - return off, &nestedError{"Class", err} - } - if h.TTL, newOff, err = unpackUint32(msg, newOff); err != nil { - return off, &nestedError{"TTL", err} - } - if h.Length, newOff, err = unpackUint16(msg, newOff); err != nil { - return off, &nestedError{"Length", err} - } - return newOff, nil -} - -func (h *ResourceHeader) fixLen(msg []byte, length []byte, preLen int) error { - conLen := len(msg) - preLen - if conLen > int(^uint16(0)) { - return errResTooLong - } - - // Fill in the length now that we know how long the content is. - packUint16(length[:0], uint16(conLen)) - h.Length = uint16(conLen) - - return nil -} - -func skipResource(msg []byte, off int) (int, error) { - newOff, err := skipName(msg, off) - if err != nil { - return off, &nestedError{"Name", err} - } - if newOff, err = skipType(msg, newOff); err != nil { - return off, &nestedError{"Type", err} - } - if newOff, err = skipClass(msg, newOff); err != nil { - return off, &nestedError{"Class", err} - } - if newOff, err = skipUint32(msg, newOff); err != nil { - return off, &nestedError{"TTL", err} - } - length, newOff, err := unpackUint16(msg, newOff) - if err != nil { - return off, &nestedError{"Length", err} - } - if newOff += int(length); newOff > len(msg) { - return off, errResourceLen - } - return newOff, nil -} - -func packUint16(msg []byte, field uint16) []byte { - return append(msg, byte(field>>8), byte(field)) -} - -func unpackUint16(msg []byte, off int) (uint16, int, error) { - if off+uint16Len > len(msg) { - return 0, off, errBaseLen - } - return uint16(msg[off])<<8 | uint16(msg[off+1]), off + uint16Len, nil -} - -func skipUint16(msg []byte, off int) (int, error) { - if off+uint16Len > len(msg) { - return off, errBaseLen - } - return off + uint16Len, nil -} - -func packType(msg []byte, field Type) []byte { - return packUint16(msg, uint16(field)) -} - -func unpackType(msg []byte, off int) (Type, int, error) { - t, o, err := unpackUint16(msg, off) - return Type(t), o, err -} - -func skipType(msg []byte, off int) (int, error) { - return skipUint16(msg, off) -} - -func packClass(msg []byte, field Class) []byte { - return packUint16(msg, uint16(field)) -} - -func unpackClass(msg []byte, off int) (Class, int, error) { - c, o, err := unpackUint16(msg, off) - return Class(c), o, err -} - -func skipClass(msg []byte, off int) (int, error) { - return skipUint16(msg, off) -} - -func packUint32(msg []byte, field uint32) []byte { - return append( - msg, - byte(field>>24), - byte(field>>16), - byte(field>>8), - byte(field), - ) -} - -func unpackUint32(msg []byte, off int) (uint32, int, error) { - if off+uint32Len > len(msg) { - return 0, off, errBaseLen - } - v := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3]) - return v, off + uint32Len, nil -} - -func skipUint32(msg []byte, off int) (int, error) { - if off+uint32Len > len(msg) { - return off, errBaseLen - } - return off + uint32Len, nil -} - -func packText(msg []byte, field string) []byte { - for len(field) > 0 { - l := len(field) - if l > 255 { - l = 255 - } - msg = append(msg, byte(l)) - msg = append(msg, field[:l]...) - field = field[l:] - } - return msg -} - -func unpackText(msg []byte, off int) (string, int, error) { - if off >= len(msg) { - return "", off, errBaseLen - } - beginOff := off + 1 - endOff := beginOff + int(msg[off]) - if endOff > len(msg) { - return "", off, errCalcLen - } - return string(msg[beginOff:endOff]), endOff, nil -} - -func skipText(msg []byte, off int) (int, error) { - if off >= len(msg) { - return off, errBaseLen - } - endOff := off + 1 + int(msg[off]) - if endOff > len(msg) { - return off, errCalcLen - } - return endOff, nil -} - -func packBytes(msg []byte, field []byte) []byte { - return append(msg, field...) -} - -func unpackBytes(msg []byte, off int, field []byte) (int, error) { - newOff := off + len(field) - if newOff > len(msg) { - return off, errBaseLen - } - copy(field, msg[off:newOff]) - return newOff, nil -} - -func skipBytes(msg []byte, off int, field []byte) (int, error) { - newOff := off + len(field) - if newOff > len(msg) { - return off, errBaseLen - } - return newOff, nil -} - -const nameLen = 255 - -// A Name is a non-encoded domain name. It is used instead of strings to avoid -// allocations. -type Name struct { - Data [nameLen]byte - Length uint8 -} - -// NewName creates a new Name from a string. -func NewName(name string) (Name, error) { - if len([]byte(name)) > nameLen { - return Name{}, errCalcLen - } - n := Name{Length: uint8(len(name))} - copy(n.Data[:], []byte(name)) - return n, nil -} - -func (n Name) String() string { - return string(n.Data[:n.Length]) -} - -// pack packs a domain name. -// -// Domain names are a sequence of counted strings split at the dots. They end -// with a zero-length string. Compression can be used to reuse domain suffixes. -// -// The compression map will be updated with new domain suffixes. If compression -// is nil, compression will not be used. -func (n *Name) pack(msg []byte, compression map[string]int) ([]byte, error) { - oldMsg := msg - - // Add a trailing dot to canonicalize name. - if n.Length == 0 || n.Data[n.Length-1] != '.' { - return oldMsg, errNonCanonicalName - } - - // Allow root domain. - if n.Data[0] == '.' && n.Length == 1 { - return append(msg, 0), nil - } - - // Emit sequence of counted strings, chopping at dots. - for i, begin := 0, 0; i < int(n.Length); i++ { - // Check for the end of the segment. - if n.Data[i] == '.' { - // The two most significant bits have special meaning. - // It isn't allowed for segments to be long enough to - // need them. - if i-begin >= 1<<6 { - return oldMsg, errSegTooLong - } - - // Segments must have a non-zero length. - if i-begin == 0 { - return oldMsg, errZeroSegLen - } - - msg = append(msg, byte(i-begin)) - - for j := begin; j < i; j++ { - msg = append(msg, n.Data[j]) - } - - begin = i + 1 - continue - } - - // We can only compress domain suffixes starting with a new - // segment. A pointer is two bytes with the two most significant - // bits set to 1 to indicate that it is a pointer. - if (i == 0 || n.Data[i-1] == '.') && compression != nil { - if ptr, ok := compression[string(n.Data[i:])]; ok { - // Hit. Emit a pointer instead of the rest of - // the domain. - return append(msg, byte(ptr>>8|0xC0), byte(ptr)), nil - } - - // Miss. Add the suffix to the compression table if the - // offset can be stored in the available 14 bytes. - if len(msg) <= int(^uint16(0)>>2) { - compression[string(n.Data[i:])] = len(msg) - } - } - } - return append(msg, 0), nil -} - -// unpack unpacks a domain name. -func (n *Name) unpack(msg []byte, off int) (int, error) { - // currOff is the current working offset. - currOff := off - - // newOff is the offset where the next record will start. Pointers lead - // to data that belongs to other names and thus doesn't count towards to - // the usage of this name. - newOff := off - - // ptr is the number of pointers followed. - var ptr int - - // Name is a slice representation of the name data. - name := n.Data[:0] - -Loop: - for { - if currOff >= len(msg) { - return off, errBaseLen - } - c := int(msg[currOff]) - currOff++ - switch c & 0xC0 { - case 0x00: // String segment - if c == 0x00 { - // A zero length signals the end of the name. - break Loop - } - endOff := currOff + c - if endOff > len(msg) { - return off, errCalcLen - } - name = append(name, msg[currOff:endOff]...) - name = append(name, '.') - currOff = endOff - case 0xC0: // Pointer - if currOff >= len(msg) { - return off, errInvalidPtr - } - c1 := msg[currOff] - currOff++ - if ptr == 0 { - newOff = currOff - } - // Don't follow too many pointers, maybe there's a loop. - if ptr++; ptr > 10 { - return off, errTooManyPtr - } - currOff = (c^0xC0)<<8 | int(c1) - default: - // Prefixes 0x80 and 0x40 are reserved. - return off, errReserved - } - } - if len(name) == 0 { - name = append(name, '.') - } - if len(name) > len(n.Data) { - return off, errCalcLen - } - n.Length = uint8(len(name)) - if ptr == 0 { - newOff = currOff - } - return newOff, nil -} - -func skipName(msg []byte, off int) (int, error) { - // newOff is the offset where the next record will start. Pointers lead - // to data that belongs to other names and thus doesn't count towards to - // the usage of this name. - newOff := off - -Loop: - for { - if newOff >= len(msg) { - return off, errBaseLen - } - c := int(msg[newOff]) - newOff++ - switch c & 0xC0 { - case 0x00: - if c == 0x00 { - // A zero length signals the end of the name. - break Loop - } - // literal string - newOff += c - if newOff > len(msg) { - return off, errCalcLen - } - case 0xC0: - // Pointer to somewhere else in msg. - - // Pointers are two bytes. - newOff++ - - // Don't follow the pointer as the data here has ended. - break Loop - default: - // Prefixes 0x80 and 0x40 are reserved. - return off, errReserved - } - } - - return newOff, nil -} - -// A Question is a DNS query. -type Question struct { - Name Name - Type Type - Class Class -} - -func (q *Question) pack(msg []byte, compression map[string]int) ([]byte, error) { - msg, err := q.Name.pack(msg, compression) - if err != nil { - return msg, &nestedError{"Name", err} - } - msg = packType(msg, q.Type) - return packClass(msg, q.Class), nil -} - -func unpackResourceBody(msg []byte, off int, hdr ResourceHeader) (ResourceBody, int, error) { - var ( - r ResourceBody - err error - name string - ) - switch hdr.Type { - case TypeA: - var rb AResource - rb, err = unpackAResource(msg, off) - r = &rb - name = "A" - case TypeNS: - var rb NSResource - rb, err = unpackNSResource(msg, off) - r = &rb - name = "NS" - case TypeCNAME: - var rb CNAMEResource - rb, err = unpackCNAMEResource(msg, off) - r = &rb - name = "CNAME" - case TypeSOA: - var rb SOAResource - rb, err = unpackSOAResource(msg, off) - r = &rb - name = "SOA" - case TypePTR: - var rb PTRResource - rb, err = unpackPTRResource(msg, off) - r = &rb - name = "PTR" - case TypeMX: - var rb MXResource - rb, err = unpackMXResource(msg, off) - r = &rb - name = "MX" - case TypeTXT: - var rb TXTResource - rb, err = unpackTXTResource(msg, off, hdr.Length) - r = &rb - name = "TXT" - case TypeAAAA: - var rb AAAAResource - rb, err = unpackAAAAResource(msg, off) - r = &rb - name = "AAAA" - case TypeSRV: - var rb SRVResource - rb, err = unpackSRVResource(msg, off) - r = &rb - name = "SRV" - } - if err != nil { - return nil, off, &nestedError{name + " record", err} - } - if r == nil { - return nil, off, errors.New("invalid resource type: " + string(hdr.Type+'0')) - } - return r, off + int(hdr.Length), nil -} - -// A CNAMEResource is a CNAME Resource record. -type CNAMEResource struct { - CNAME Name -} - -func (r *CNAMEResource) realType() Type { - return TypeCNAME -} - -func (r *CNAMEResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - return r.CNAME.pack(msg, compression) -} - -func unpackCNAMEResource(msg []byte, off int) (CNAMEResource, error) { - var cname Name - if _, err := cname.unpack(msg, off); err != nil { - return CNAMEResource{}, err - } - return CNAMEResource{cname}, nil -} - -// An MXResource is an MX Resource record. -type MXResource struct { - Pref uint16 - MX Name -} - -func (r *MXResource) realType() Type { - return TypeMX -} - -func (r *MXResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - oldMsg := msg - msg = packUint16(msg, r.Pref) - msg, err := r.MX.pack(msg, compression) - if err != nil { - return oldMsg, &nestedError{"MXResource.MX", err} - } - return msg, nil -} - -func unpackMXResource(msg []byte, off int) (MXResource, error) { - pref, off, err := unpackUint16(msg, off) - if err != nil { - return MXResource{}, &nestedError{"Pref", err} - } - var mx Name - if _, err := mx.unpack(msg, off); err != nil { - return MXResource{}, &nestedError{"MX", err} - } - return MXResource{pref, mx}, nil -} - -// An NSResource is an NS Resource record. -type NSResource struct { - NS Name -} - -func (r *NSResource) realType() Type { - return TypeNS -} - -func (r *NSResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - return r.NS.pack(msg, compression) -} - -func unpackNSResource(msg []byte, off int) (NSResource, error) { - var ns Name - if _, err := ns.unpack(msg, off); err != nil { - return NSResource{}, err - } - return NSResource{ns}, nil -} - -// A PTRResource is a PTR Resource record. -type PTRResource struct { - PTR Name -} - -func (r *PTRResource) realType() Type { - return TypePTR -} - -func (r *PTRResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - return r.PTR.pack(msg, compression) -} - -func unpackPTRResource(msg []byte, off int) (PTRResource, error) { - var ptr Name - if _, err := ptr.unpack(msg, off); err != nil { - return PTRResource{}, err - } - return PTRResource{ptr}, nil -} - -// An SOAResource is an SOA Resource record. -type SOAResource struct { - NS Name - MBox Name - Serial uint32 - Refresh uint32 - Retry uint32 - Expire uint32 - - // MinTTL the is the default TTL of Resources records which did not - // contain a TTL value and the TTL of negative responses. (RFC 2308 - // Section 4) - MinTTL uint32 -} - -func (r *SOAResource) realType() Type { - return TypeSOA -} - -func (r *SOAResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - oldMsg := msg - msg, err := r.NS.pack(msg, compression) - if err != nil { - return oldMsg, &nestedError{"SOAResource.NS", err} - } - msg, err = r.MBox.pack(msg, compression) - if err != nil { - return oldMsg, &nestedError{"SOAResource.MBox", err} - } - msg = packUint32(msg, r.Serial) - msg = packUint32(msg, r.Refresh) - msg = packUint32(msg, r.Retry) - msg = packUint32(msg, r.Expire) - return packUint32(msg, r.MinTTL), nil -} - -func unpackSOAResource(msg []byte, off int) (SOAResource, error) { - var ns Name - off, err := ns.unpack(msg, off) - if err != nil { - return SOAResource{}, &nestedError{"NS", err} - } - var mbox Name - if off, err = mbox.unpack(msg, off); err != nil { - return SOAResource{}, &nestedError{"MBox", err} - } - serial, off, err := unpackUint32(msg, off) - if err != nil { - return SOAResource{}, &nestedError{"Serial", err} - } - refresh, off, err := unpackUint32(msg, off) - if err != nil { - return SOAResource{}, &nestedError{"Refresh", err} - } - retry, off, err := unpackUint32(msg, off) - if err != nil { - return SOAResource{}, &nestedError{"Retry", err} - } - expire, off, err := unpackUint32(msg, off) - if err != nil { - return SOAResource{}, &nestedError{"Expire", err} - } - minTTL, _, err := unpackUint32(msg, off) - if err != nil { - return SOAResource{}, &nestedError{"MinTTL", err} - } - return SOAResource{ns, mbox, serial, refresh, retry, expire, minTTL}, nil -} - -// A TXTResource is a TXT Resource record. -type TXTResource struct { - Txt string // Not a domain name. -} - -func (r *TXTResource) realType() Type { - return TypeTXT -} - -func (r *TXTResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - return packText(msg, r.Txt), nil -} - -func unpackTXTResource(msg []byte, off int, length uint16) (TXTResource, error) { - var txt string - for n := uint16(0); n < length; { - var t string - var err error - if t, off, err = unpackText(msg, off); err != nil { - return TXTResource{}, &nestedError{"text", err} - } - // Check if we got too many bytes. - if length-n < uint16(len(t))+1 { - return TXTResource{}, errCalcLen - } - n += uint16(len(t)) + 1 - txt += t - } - return TXTResource{txt}, nil -} - -// An SRVResource is an SRV Resource record. -type SRVResource struct { - Priority uint16 - Weight uint16 - Port uint16 - Target Name // Not compressed as per RFC 2782. -} - -func (r *SRVResource) realType() Type { - return TypeSRV -} - -func (r *SRVResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - oldMsg := msg - msg = packUint16(msg, r.Priority) - msg = packUint16(msg, r.Weight) - msg = packUint16(msg, r.Port) - msg, err := r.Target.pack(msg, nil) - if err != nil { - return oldMsg, &nestedError{"SRVResource.Target", err} - } - return msg, nil -} - -func unpackSRVResource(msg []byte, off int) (SRVResource, error) { - priority, off, err := unpackUint16(msg, off) - if err != nil { - return SRVResource{}, &nestedError{"Priority", err} - } - weight, off, err := unpackUint16(msg, off) - if err != nil { - return SRVResource{}, &nestedError{"Weight", err} - } - port, off, err := unpackUint16(msg, off) - if err != nil { - return SRVResource{}, &nestedError{"Port", err} - } - var target Name - if _, err := target.unpack(msg, off); err != nil { - return SRVResource{}, &nestedError{"Target", err} - } - return SRVResource{priority, weight, port, target}, nil -} - -// An AResource is an A Resource record. -type AResource struct { - A [4]byte -} - -func (r *AResource) realType() Type { - return TypeA -} - -func (r *AResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - return packBytes(msg, r.A[:]), nil -} - -func unpackAResource(msg []byte, off int) (AResource, error) { - var a [4]byte - if _, err := unpackBytes(msg, off, a[:]); err != nil { - return AResource{}, err - } - return AResource{a}, nil -} - -// An AAAAResource is an AAAA Resource record. -type AAAAResource struct { - AAAA [16]byte -} - -func (r *AAAAResource) realType() Type { - return TypeAAAA -} - -func (r *AAAAResource) pack(msg []byte, compression map[string]int) ([]byte, error) { - return packBytes(msg, r.AAAA[:]), nil -} - -func unpackAAAAResource(msg []byte, off int) (AAAAResource, error) { - var aaaa [16]byte - if _, err := unpackBytes(msg, off, aaaa[:]); err != nil { - return AAAAResource{}, err - } - return AAAAResource{aaaa}, nil -} diff --git a/vendor/golang.org/x/net/dns/dnsmessage/message_test.go b/vendor/golang.org/x/net/dns/dnsmessage/message_test.go deleted file mode 100644 index 9295d36ce..000000000 --- a/vendor/golang.org/x/net/dns/dnsmessage/message_test.go +++ /dev/null @@ -1,1116 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package dnsmessage - -import ( - "bytes" - "fmt" - "reflect" - "testing" -) - -func mustNewName(name string) Name { - n, err := NewName(name) - if err != nil { - panic(err) - } - return n -} - -func (m *Message) String() string { - s := fmt.Sprintf("Message: %#v\n", &m.Header) - if len(m.Questions) > 0 { - s += "-- Questions\n" - for _, q := range m.Questions { - s += fmt.Sprintf("%#v\n", q) - } - } - if len(m.Answers) > 0 { - s += "-- Answers\n" - for _, a := range m.Answers { - s += fmt.Sprintf("%#v\n", a) - } - } - if len(m.Authorities) > 0 { - s += "-- Authorities\n" - for _, ns := range m.Authorities { - s += fmt.Sprintf("%#v\n", ns) - } - } - if len(m.Additionals) > 0 { - s += "-- Additionals\n" - for _, e := range m.Additionals { - s += fmt.Sprintf("%#v\n", e) - } - } - return s -} - -func TestNameString(t *testing.T) { - want := "foo" - name := mustNewName(want) - if got := fmt.Sprint(name); got != want { - t.Errorf("got fmt.Sprint(%#v) = %s, want = %s", name, got, want) - } -} - -func TestQuestionPackUnpack(t *testing.T) { - want := Question{ - Name: mustNewName("."), - Type: TypeA, - Class: ClassINET, - } - buf, err := want.pack(make([]byte, 1, 50), map[string]int{}) - if err != nil { - t.Fatal("Packing failed:", err) - } - var p Parser - p.msg = buf - p.header.questions = 1 - p.section = sectionQuestions - p.off = 1 - got, err := p.Question() - if err != nil { - t.Fatalf("Unpacking failed: %v\n%s", err, string(buf[1:])) - } - if p.off != len(buf) { - t.Errorf("Unpacked different amount than packed: got n = %d, want = %d", p.off, len(buf)) - } - if !reflect.DeepEqual(got, want) { - t.Errorf("Got = %+v, want = %+v", got, want) - } -} - -func TestName(t *testing.T) { - tests := []string{ - "", - ".", - "google..com", - "google.com", - "google..com.", - "google.com.", - ".google.com.", - "www..google.com.", - "www.google.com.", - } - - for _, test := range tests { - n, err := NewName(test) - if err != nil { - t.Errorf("Creating name for %q: %v", test, err) - continue - } - if ns := n.String(); ns != test { - t.Errorf("Got %#v.String() = %q, want = %q", n, ns, test) - continue - } - } -} - -func TestNamePackUnpack(t *testing.T) { - tests := []struct { - in string - want string - err error - }{ - {"", "", errNonCanonicalName}, - {".", ".", nil}, - {"google..com", "", errNonCanonicalName}, - {"google.com", "", errNonCanonicalName}, - {"google..com.", "", errZeroSegLen}, - {"google.com.", "google.com.", nil}, - {".google.com.", "", errZeroSegLen}, - {"www..google.com.", "", errZeroSegLen}, - {"www.google.com.", "www.google.com.", nil}, - } - - for _, test := range tests { - in := mustNewName(test.in) - want := mustNewName(test.want) - buf, err := in.pack(make([]byte, 0, 30), map[string]int{}) - if err != test.err { - t.Errorf("Packing of %q: got err = %v, want err = %v", test.in, err, test.err) - continue - } - if test.err != nil { - continue - } - var got Name - n, err := got.unpack(buf, 0) - if err != nil { - t.Errorf("Unpacking for %q failed: %v", test.in, err) - continue - } - if n != len(buf) { - t.Errorf( - "Unpacked different amount than packed for %q: got n = %d, want = %d", - test.in, - n, - len(buf), - ) - } - if got != want { - t.Errorf("Unpacking packing of %q: got = %#v, want = %#v", test.in, got, want) - } - } -} - -func checkErrorPrefix(err error, prefix string) bool { - e, ok := err.(*nestedError) - return ok && e.s == prefix -} - -func TestHeaderUnpackError(t *testing.T) { - wants := []string{ - "id", - "bits", - "questions", - "answers", - "authorities", - "additionals", - } - var buf []byte - var h header - for _, want := range wants { - n, err := h.unpack(buf, 0) - if n != 0 || !checkErrorPrefix(err, want) { - t.Errorf("got h.unpack([%d]byte, 0) = %d, %v, want = 0, %s", len(buf), n, err, want) - } - buf = append(buf, 0, 0) - } -} - -func TestParserStart(t *testing.T) { - const want = "unpacking header" - var p Parser - for i := 0; i <= 1; i++ { - _, err := p.Start([]byte{}) - if !checkErrorPrefix(err, want) { - t.Errorf("got p.Start(nil) = _, %v, want = _, %s", err, want) - } - } -} - -func TestResourceNotStarted(t *testing.T) { - tests := []struct { - name string - fn func(*Parser) error - }{ - {"CNAMEResource", func(p *Parser) error { _, err := p.CNAMEResource(); return err }}, - {"MXResource", func(p *Parser) error { _, err := p.MXResource(); return err }}, - {"NSResource", func(p *Parser) error { _, err := p.NSResource(); return err }}, - {"PTRResource", func(p *Parser) error { _, err := p.PTRResource(); return err }}, - {"SOAResource", func(p *Parser) error { _, err := p.SOAResource(); return err }}, - {"TXTResource", func(p *Parser) error { _, err := p.TXTResource(); return err }}, - {"SRVResource", func(p *Parser) error { _, err := p.SRVResource(); return err }}, - {"AResource", func(p *Parser) error { _, err := p.AResource(); return err }}, - {"AAAAResource", func(p *Parser) error { _, err := p.AAAAResource(); return err }}, - } - - for _, test := range tests { - if err := test.fn(&Parser{}); err != ErrNotStarted { - t.Errorf("got _, %v = p.%s(), want = _, %v", err, test.name, ErrNotStarted) - } - } -} - -func TestDNSPackUnpack(t *testing.T) { - wants := []Message{ - { - Questions: []Question{ - { - Name: mustNewName("."), - Type: TypeAAAA, - Class: ClassINET, - }, - }, - Answers: []Resource{}, - Authorities: []Resource{}, - Additionals: []Resource{}, - }, - largeTestMsg(), - } - for i, want := range wants { - b, err := want.Pack() - if err != nil { - t.Fatalf("%d: packing failed: %v", i, err) - } - var got Message - err = got.Unpack(b) - if err != nil { - t.Fatalf("%d: unpacking failed: %v", i, err) - } - if !reflect.DeepEqual(got, want) { - t.Errorf("%d: got = %+v, want = %+v", i, &got, &want) - } - } -} - -func TestSkipAll(t *testing.T) { - msg := largeTestMsg() - buf, err := msg.Pack() - if err != nil { - t.Fatal("Packing large test message:", err) - } - var p Parser - if _, err := p.Start(buf); err != nil { - t.Fatal(err) - } - - tests := []struct { - name string - f func() error - }{ - {"SkipAllQuestions", p.SkipAllQuestions}, - {"SkipAllAnswers", p.SkipAllAnswers}, - {"SkipAllAuthorities", p.SkipAllAuthorities}, - {"SkipAllAdditionals", p.SkipAllAdditionals}, - } - for _, test := range tests { - for i := 1; i <= 3; i++ { - if err := test.f(); err != nil { - t.Errorf("Call #%d to %s(): %v", i, test.name, err) - } - } - } -} - -func TestSkipEach(t *testing.T) { - msg := smallTestMsg() - - buf, err := msg.Pack() - if err != nil { - t.Fatal("Packing test message:", err) - } - var p Parser - if _, err := p.Start(buf); err != nil { - t.Fatal(err) - } - - tests := []struct { - name string - f func() error - }{ - {"SkipQuestion", p.SkipQuestion}, - {"SkipAnswer", p.SkipAnswer}, - {"SkipAuthority", p.SkipAuthority}, - {"SkipAdditional", p.SkipAdditional}, - } - for _, test := range tests { - if err := test.f(); err != nil { - t.Errorf("First call: got %s() = %v, want = %v", test.name, err, nil) - } - if err := test.f(); err != ErrSectionDone { - t.Errorf("Second call: got %s() = %v, want = %v", test.name, err, ErrSectionDone) - } - } -} - -func TestSkipAfterRead(t *testing.T) { - msg := smallTestMsg() - - buf, err := msg.Pack() - if err != nil { - t.Fatal("Packing test message:", err) - } - var p Parser - if _, err := p.Start(buf); err != nil { - t.Fatal(err) - } - - tests := []struct { - name string - skip func() error - read func() error - }{ - {"Question", p.SkipQuestion, func() error { _, err := p.Question(); return err }}, - {"Answer", p.SkipAnswer, func() error { _, err := p.Answer(); return err }}, - {"Authority", p.SkipAuthority, func() error { _, err := p.Authority(); return err }}, - {"Additional", p.SkipAdditional, func() error { _, err := p.Additional(); return err }}, - } - for _, test := range tests { - if err := test.read(); err != nil { - t.Errorf("Got %s() = _, %v, want = _, %v", test.name, err, nil) - } - if err := test.skip(); err != ErrSectionDone { - t.Errorf("Got Skip%s() = %v, want = %v", test.name, err, ErrSectionDone) - } - } -} - -func TestSkipNotStarted(t *testing.T) { - var p Parser - - tests := []struct { - name string - f func() error - }{ - {"SkipAllQuestions", p.SkipAllQuestions}, - {"SkipAllAnswers", p.SkipAllAnswers}, - {"SkipAllAuthorities", p.SkipAllAuthorities}, - {"SkipAllAdditionals", p.SkipAllAdditionals}, - } - for _, test := range tests { - if err := test.f(); err != ErrNotStarted { - t.Errorf("Got %s() = %v, want = %v", test.name, err, ErrNotStarted) - } - } -} - -func TestTooManyRecords(t *testing.T) { - const recs = int(^uint16(0)) + 1 - tests := []struct { - name string - msg Message - want error - }{ - { - "Questions", - Message{ - Questions: make([]Question, recs), - }, - errTooManyQuestions, - }, - { - "Answers", - Message{ - Answers: make([]Resource, recs), - }, - errTooManyAnswers, - }, - { - "Authorities", - Message{ - Authorities: make([]Resource, recs), - }, - errTooManyAuthorities, - }, - { - "Additionals", - Message{ - Additionals: make([]Resource, recs), - }, - errTooManyAdditionals, - }, - } - - for _, test := range tests { - if _, got := test.msg.Pack(); got != test.want { - t.Errorf("Packing %d %s: got = %v, want = %v", recs, test.name, got, test.want) - } - } -} - -func TestVeryLongTxt(t *testing.T) { - want := Resource{ - ResourceHeader{ - Name: mustNewName("foo.bar.example.com."), - Type: TypeTXT, - Class: ClassINET, - }, - &TXTResource{loremIpsum}, - } - buf, err := want.pack(make([]byte, 0, 8000), map[string]int{}) - if err != nil { - t.Fatal("Packing failed:", err) - } - var got Resource - off, err := got.Header.unpack(buf, 0) - if err != nil { - t.Fatal("Unpacking ResourceHeader failed:", err) - } - body, n, err := unpackResourceBody(buf, off, got.Header) - if err != nil { - t.Fatal("Unpacking failed:", err) - } - got.Body = body - if n != len(buf) { - t.Errorf("Unpacked different amount than packed: got n = %d, want = %d", n, len(buf)) - } - if !reflect.DeepEqual(got, want) { - t.Errorf("Got = %#v, want = %#v", got, want) - } -} - -func TestStartError(t *testing.T) { - tests := []struct { - name string - fn func(*Builder) error - }{ - {"Questions", func(b *Builder) error { return b.StartQuestions() }}, - {"Answers", func(b *Builder) error { return b.StartAnswers() }}, - {"Authorities", func(b *Builder) error { return b.StartAuthorities() }}, - {"Additionals", func(b *Builder) error { return b.StartAdditionals() }}, - } - - envs := []struct { - name string - fn func() *Builder - want error - }{ - {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted}, - {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone}, - } - - for _, env := range envs { - for _, test := range tests { - if got := test.fn(env.fn()); got != env.want { - t.Errorf("got Builder{%s}.Start%s = %v, want = %v", env.name, test.name, got, env.want) - } - } - } -} - -func TestBuilderResourceError(t *testing.T) { - tests := []struct { - name string - fn func(*Builder) error - }{ - {"CNAMEResource", func(b *Builder) error { return b.CNAMEResource(ResourceHeader{}, CNAMEResource{}) }}, - {"MXResource", func(b *Builder) error { return b.MXResource(ResourceHeader{}, MXResource{}) }}, - {"NSResource", func(b *Builder) error { return b.NSResource(ResourceHeader{}, NSResource{}) }}, - {"PTRResource", func(b *Builder) error { return b.PTRResource(ResourceHeader{}, PTRResource{}) }}, - {"SOAResource", func(b *Builder) error { return b.SOAResource(ResourceHeader{}, SOAResource{}) }}, - {"TXTResource", func(b *Builder) error { return b.TXTResource(ResourceHeader{}, TXTResource{}) }}, - {"SRVResource", func(b *Builder) error { return b.SRVResource(ResourceHeader{}, SRVResource{}) }}, - {"AResource", func(b *Builder) error { return b.AResource(ResourceHeader{}, AResource{}) }}, - {"AAAAResource", func(b *Builder) error { return b.AAAAResource(ResourceHeader{}, AAAAResource{}) }}, - } - - envs := []struct { - name string - fn func() *Builder - want error - }{ - {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted}, - {"sectionHeader", func() *Builder { return &Builder{section: sectionHeader} }, ErrNotStarted}, - {"sectionQuestions", func() *Builder { return &Builder{section: sectionQuestions} }, ErrNotStarted}, - {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone}, - } - - for _, env := range envs { - for _, test := range tests { - if got := test.fn(env.fn()); got != env.want { - t.Errorf("got Builder{%s}.%s = %v, want = %v", env.name, test.name, got, env.want) - } - } - } -} - -func TestFinishError(t *testing.T) { - var b Builder - want := ErrNotStarted - if _, got := b.Finish(); got != want { - t.Errorf("got Builder{}.Finish() = %v, want = %v", got, want) - } -} - -func TestBuilder(t *testing.T) { - msg := largeTestMsg() - want, err := msg.Pack() - if err != nil { - t.Fatal("Packing without builder:", err) - } - - var b Builder - b.Start(nil, msg.Header) - - if err := b.StartQuestions(); err != nil { - t.Fatal("b.StartQuestions():", err) - } - for _, q := range msg.Questions { - if err := b.Question(q); err != nil { - t.Fatalf("b.Question(%#v): %v", q, err) - } - } - - if err := b.StartAnswers(); err != nil { - t.Fatal("b.StartAnswers():", err) - } - for _, a := range msg.Answers { - switch a.Header.Type { - case TypeA: - if err := b.AResource(a.Header, *a.Body.(*AResource)); err != nil { - t.Fatalf("b.AResource(%#v): %v", a, err) - } - case TypeNS: - if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil { - t.Fatalf("b.NSResource(%#v): %v", a, err) - } - case TypeCNAME: - if err := b.CNAMEResource(a.Header, *a.Body.(*CNAMEResource)); err != nil { - t.Fatalf("b.CNAMEResource(%#v): %v", a, err) - } - case TypeSOA: - if err := b.SOAResource(a.Header, *a.Body.(*SOAResource)); err != nil { - t.Fatalf("b.SOAResource(%#v): %v", a, err) - } - case TypePTR: - if err := b.PTRResource(a.Header, *a.Body.(*PTRResource)); err != nil { - t.Fatalf("b.PTRResource(%#v): %v", a, err) - } - case TypeMX: - if err := b.MXResource(a.Header, *a.Body.(*MXResource)); err != nil { - t.Fatalf("b.MXResource(%#v): %v", a, err) - } - case TypeTXT: - if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil { - t.Fatalf("b.TXTResource(%#v): %v", a, err) - } - case TypeAAAA: - if err := b.AAAAResource(a.Header, *a.Body.(*AAAAResource)); err != nil { - t.Fatalf("b.AAAAResource(%#v): %v", a, err) - } - case TypeSRV: - if err := b.SRVResource(a.Header, *a.Body.(*SRVResource)); err != nil { - t.Fatalf("b.SRVResource(%#v): %v", a, err) - } - } - } - - if err := b.StartAuthorities(); err != nil { - t.Fatal("b.StartAuthorities():", err) - } - for _, a := range msg.Authorities { - if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil { - t.Fatalf("b.NSResource(%#v): %v", a, err) - } - } - - if err := b.StartAdditionals(); err != nil { - t.Fatal("b.StartAdditionals():", err) - } - for _, a := range msg.Additionals { - if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil { - t.Fatalf("b.TXTResource(%#v): %v", a, err) - } - } - - got, err := b.Finish() - if err != nil { - t.Fatal("b.Finish():", err) - } - if !bytes.Equal(got, want) { - t.Fatalf("Got from Builder: %#v\nwant = %#v", got, want) - } -} - -func TestResourcePack(t *testing.T) { - for _, tt := range []struct { - m Message - err error - }{ - { - Message{ - Questions: []Question{ - { - Name: mustNewName("."), - Type: TypeAAAA, - Class: ClassINET, - }, - }, - Answers: []Resource{{ResourceHeader{}, nil}}, - }, - &nestedError{"packing Answer", errNilResouceBody}, - }, - { - Message{ - Questions: []Question{ - { - Name: mustNewName("."), - Type: TypeAAAA, - Class: ClassINET, - }, - }, - Authorities: []Resource{{ResourceHeader{}, (*NSResource)(nil)}}, - }, - &nestedError{"packing Authority", - &nestedError{"ResourceHeader", - &nestedError{"Name", errNonCanonicalName}, - }, - }, - }, - { - Message{ - Questions: []Question{ - { - Name: mustNewName("."), - Type: TypeA, - Class: ClassINET, - }, - }, - Additionals: []Resource{{ResourceHeader{}, nil}}, - }, - &nestedError{"packing Additional", errNilResouceBody}, - }, - } { - _, err := tt.m.Pack() - if !reflect.DeepEqual(err, tt.err) { - t.Errorf("got %v for %v; want %v", err, tt.m, tt.err) - } - } -} - -func BenchmarkParsing(b *testing.B) { - b.ReportAllocs() - - name := mustNewName("foo.bar.example.com.") - msg := Message{ - Header: Header{Response: true, Authoritative: true}, - Questions: []Question{ - { - Name: name, - Type: TypeA, - Class: ClassINET, - }, - }, - Answers: []Resource{ - { - ResourceHeader{ - Name: name, - Class: ClassINET, - }, - &AResource{[4]byte{}}, - }, - { - ResourceHeader{ - Name: name, - Class: ClassINET, - }, - &AAAAResource{[16]byte{}}, - }, - { - ResourceHeader{ - Name: name, - Class: ClassINET, - }, - &CNAMEResource{name}, - }, - { - ResourceHeader{ - Name: name, - Class: ClassINET, - }, - &NSResource{name}, - }, - }, - } - - buf, err := msg.Pack() - if err != nil { - b.Fatal("msg.Pack():", err) - } - - for i := 0; i < b.N; i++ { - var p Parser - if _, err := p.Start(buf); err != nil { - b.Fatal("p.Start(buf):", err) - } - - for { - _, err := p.Question() - if err == ErrSectionDone { - break - } - if err != nil { - b.Fatal("p.Question():", err) - } - } - - for { - h, err := p.AnswerHeader() - if err == ErrSectionDone { - break - } - if err != nil { - panic(err) - } - - switch h.Type { - case TypeA: - if _, err := p.AResource(); err != nil { - b.Fatal("p.AResource():", err) - } - case TypeAAAA: - if _, err := p.AAAAResource(); err != nil { - b.Fatal("p.AAAAResource():", err) - } - case TypeCNAME: - if _, err := p.CNAMEResource(); err != nil { - b.Fatal("p.CNAMEResource():", err) - } - case TypeNS: - if _, err := p.NSResource(); err != nil { - b.Fatal("p.NSResource():", err) - } - default: - b.Fatalf("unknown type: %T", h) - } - } - } -} - -func BenchmarkBuilding(b *testing.B) { - b.ReportAllocs() - - name := mustNewName("foo.bar.example.com.") - buf := make([]byte, 0, packStartingCap) - - for i := 0; i < b.N; i++ { - var bld Builder - bld.StartWithoutCompression(buf, Header{Response: true, Authoritative: true}) - - if err := bld.StartQuestions(); err != nil { - b.Fatal("bld.StartQuestions():", err) - } - q := Question{ - Name: name, - Type: TypeA, - Class: ClassINET, - } - if err := bld.Question(q); err != nil { - b.Fatalf("bld.Question(%+v): %v", q, err) - } - - hdr := ResourceHeader{ - Name: name, - Class: ClassINET, - } - if err := bld.StartAnswers(); err != nil { - b.Fatal("bld.StartQuestions():", err) - } - - ar := AResource{[4]byte{}} - if err := bld.AResource(hdr, ar); err != nil { - b.Fatalf("bld.AResource(%+v, %+v): %v", hdr, ar, err) - } - - aaar := AAAAResource{[16]byte{}} - if err := bld.AAAAResource(hdr, aaar); err != nil { - b.Fatalf("bld.AAAAResource(%+v, %+v): %v", hdr, aaar, err) - } - - cnr := CNAMEResource{name} - if err := bld.CNAMEResource(hdr, cnr); err != nil { - b.Fatalf("bld.CNAMEResource(%+v, %+v): %v", hdr, cnr, err) - } - - nsr := NSResource{name} - if err := bld.NSResource(hdr, nsr); err != nil { - b.Fatalf("bld.NSResource(%+v, %+v): %v", hdr, nsr, err) - } - - if _, err := bld.Finish(); err != nil { - b.Fatal("bld.Finish():", err) - } - } -} - -func smallTestMsg() Message { - name := mustNewName("example.com.") - return Message{ - Header: Header{Response: true, Authoritative: true}, - Questions: []Question{ - { - Name: name, - Type: TypeA, - Class: ClassINET, - }, - }, - Answers: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeA, - Class: ClassINET, - }, - &AResource{[4]byte{127, 0, 0, 1}}, - }, - }, - Authorities: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeA, - Class: ClassINET, - }, - &AResource{[4]byte{127, 0, 0, 1}}, - }, - }, - Additionals: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeA, - Class: ClassINET, - }, - &AResource{[4]byte{127, 0, 0, 1}}, - }, - }, - } -} - -func largeTestMsg() Message { - name := mustNewName("foo.bar.example.com.") - return Message{ - Header: Header{Response: true, Authoritative: true}, - Questions: []Question{ - { - Name: name, - Type: TypeA, - Class: ClassINET, - }, - }, - Answers: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeA, - Class: ClassINET, - }, - &AResource{[4]byte{127, 0, 0, 1}}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeA, - Class: ClassINET, - }, - &AResource{[4]byte{127, 0, 0, 2}}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeAAAA, - Class: ClassINET, - }, - &AAAAResource{[16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeCNAME, - Class: ClassINET, - }, - &CNAMEResource{mustNewName("alias.example.com.")}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeSOA, - Class: ClassINET, - }, - &SOAResource{ - NS: mustNewName("ns1.example.com."), - MBox: mustNewName("mb.example.com."), - Serial: 1, - Refresh: 2, - Retry: 3, - Expire: 4, - MinTTL: 5, - }, - }, - { - ResourceHeader{ - Name: name, - Type: TypePTR, - Class: ClassINET, - }, - &PTRResource{mustNewName("ptr.example.com.")}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeMX, - Class: ClassINET, - }, - &MXResource{ - 7, - mustNewName("mx.example.com."), - }, - }, - { - ResourceHeader{ - Name: name, - Type: TypeSRV, - Class: ClassINET, - }, - &SRVResource{ - 8, - 9, - 11, - mustNewName("srv.example.com."), - }, - }, - }, - Authorities: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeNS, - Class: ClassINET, - }, - &NSResource{mustNewName("ns1.example.com.")}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeNS, - Class: ClassINET, - }, - &NSResource{mustNewName("ns2.example.com.")}, - }, - }, - Additionals: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeTXT, - Class: ClassINET, - }, - &TXTResource{"So Long, and Thanks for All the Fish"}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeTXT, - Class: ClassINET, - }, - &TXTResource{"Hamster Huey and the Gooey Kablooie"}, - }, - }, - } -} - -const loremIpsum = ` -Lorem ipsum dolor sit amet, nec enim antiopam id, an ullum choro -nonumes qui, pro eu debet honestatis mediocritatem. No alia enim eos, -magna signiferumque ex vis. Mei no aperiri dissentias, cu vel quas -regione. Malorum quaeque vim ut, eum cu semper aliquid invidunt, ei -nam ipsum assentior. - -Nostrum appellantur usu no, vis ex probatus adipiscing. Cu usu illum -facilis eleifend. Iusto conceptam complectitur vim id. Tale omnesque -no usu, ei oblique sadipscing vim. At nullam voluptua usu, mei laudem -reformidans et. Qui ei eros porro reformidans, ius suas veritus -torquatos ex. Mea te facer alterum consequat. - -Soleat torquatos democritum sed et, no mea congue appareat, facer -aliquam nec in. Has te ipsum tritani. At justo dicta option nec, movet -phaedrum ad nam. Ea detracto verterem liberavisse has, delectus -suscipiantur in mei. Ex nam meliore complectitur. Ut nam omnis -honestatis quaerendum, ea mea nihil affert detracto, ad vix rebum -mollis. - -Ut epicurei praesent neglegentur pri, prima fuisset intellegebat ad -vim. An habemus comprehensam usu, at enim dignissim pro. Eam reque -vivendum adipisci ea. Vel ne odio choro minimum. Sea admodum -dissentiet ex. Mundi tamquam evertitur ius cu. Homero postea iisque ut -pro, vel ne saepe senserit consetetur. - -Nulla utamur facilisis ius ea, in viderer diceret pertinax eum. Mei no -enim quodsi facilisi, ex sed aeterno appareat mediocritatem, eum -sententiae deterruisset ut. At suas timeam euismod cum, offendit -appareat interpretaris ne vix. Vel ea civibus albucius, ex vim quidam -accusata intellegebat, noluisse instructior sea id. Nec te nonumes -habemus appellantur, quis dignissim vituperata eu nam. - -At vix apeirian patrioque vituperatoribus, an usu agam assum. Debet -iisque an mea. Per eu dicant ponderum accommodare. Pri alienum -placerat senserit an, ne eum ferri abhorreant vituperatoribus. Ut mea -eligendi disputationi. Ius no tation everti impedit, ei magna quidam -mediocritatem pri. - -Legendos perpetua iracundia ne usu, no ius ullum epicurei intellegam, -ad modus epicuri lucilius eam. In unum quaerendum usu. Ne diam paulo -has, ea veri virtute sed. Alia honestatis conclusionemque mea eu, ut -iudico albucius his. - -Usu essent probatus eu, sed omnis dolor delicatissimi ex. No qui augue -dissentias dissentiet. Laudem recteque no usu, vel an velit noluisse, -an sed utinam eirmod appetere. Ne mea fuisset inimicus ocurreret. At -vis dicant abhorreant, utinam forensibus nec ne, mei te docendi -consequat. Brute inermis persecuti cum id. Ut ipsum munere propriae -usu, dicit graeco disputando id has. - -Eros dolore quaerendum nam ei. Timeam ornatus inciderint pro id. Nec -torquatos sadipscing ei, ancillae molestie per in. Malis principes duo -ea, usu liber postulant ei. - -Graece timeam voluptatibus eu eam. Alia probatus quo no, ea scripta -feugiat duo. Congue option meliore ex qui, noster invenire appellantur -ea vel. Eu exerci legendos vel. Consetetur repudiandae vim ut. Vix an -probo minimum, et nam illud falli tempor. - -Cum dico signiferumque eu. Sed ut regione maiorum, id veritus insolens -tacimates vix. Eu mel sint tamquam lucilius, duo no oporteat -tacimates. Atqui augue concludaturque vix ei, id mel utroque menandri. - -Ad oratio blandit aliquando pro. Vis et dolorum rationibus -philosophia, ad cum nulla molestie. Hinc fuisset adversarium eum et, -ne qui nisl verear saperet, vel te quaestio forensibus. Per odio -option delenit an. Alii placerat has no, in pri nihil platonem -cotidieque. Est ut elit copiosae scaevola, debet tollit maluisset sea -an. - -Te sea hinc debet pericula, liber ridens fabulas cu sed, quem mutat -accusam mea et. Elitr labitur albucius et pri, an labore feugait mel. -Velit zril melius usu ea. Ad stet putent interpretaris qui. Mel no -error volumus scripserit. In pro paulo iudico, quo ei dolorem -verterem, affert fabellas dissentiet ea vix. - -Vis quot deserunt te. Error aliquid detraxit eu usu, vis alia eruditi -salutatus cu. Est nostrud bonorum an, ei usu alii salutatus. Vel at -nisl primis, eum ex aperiri noluisse reformidans. Ad veri velit -utroque vis, ex equidem detraxit temporibus has. - -Inermis appareat usu ne. Eros placerat periculis mea ad, in dictas -pericula pro. Errem postulant at usu, ea nec amet ornatus mentitum. Ad -mazim graeco eum, vel ex percipit volutpat iudicabit, sit ne delicata -interesset. Mel sapientem prodesset abhorreant et, oblique suscipit -eam id. - -An maluisset disputando mea, vidit mnesarchum pri et. Malis insolens -inciderint no sea. Ea persius maluisset vix, ne vim appellantur -instructior, consul quidam definiebas pri id. Cum integre feugiat -pericula in, ex sed persius similique, mel ne natum dicit percipitur. - -Primis discere ne pri, errem putent definitionem at vis. Ei mel dolore -neglegentur, mei tincidunt percipitur ei. Pro ad simul integre -rationibus. Eu vel alii honestatis definitiones, mea no nonumy -reprehendunt. - -Dicta appareat legendos est cu. Eu vel congue dicunt omittam, no vix -adhuc minimum constituam, quot noluisse id mel. Eu quot sale mutat -duo, ex nisl munere invenire duo. Ne nec ullum utamur. Pro alterum -debitis nostrum no, ut vel aliquid vivendo. - -Aliquip fierent praesent quo ne, id sit audiam recusabo delicatissimi. -Usu postulant incorrupte cu. At pro dicit tibique intellegam, cibo -dolore impedit id eam, et aeque feugait assentior has. Quando sensibus -nec ex. Possit sensibus pri ad, unum mutat periculis cu vix. - -Mundi tibique vix te, duo simul partiendo qualisque id, est at vidit -sonet tempor. No per solet aeterno deseruisse. Petentium salutandi -definiebas pri cu. Munere vivendum est in. Ei justo congue eligendi -vis, modus offendit omittantur te mel. - -Integre voluptaria in qui, sit habemus tractatos constituam no. Utinam -melius conceptam est ne, quo in minimum apeirian delicata, ut ius -porro recusabo. Dicant expetenda vix no, ludus scripserit sed ex, eu -his modo nostro. Ut etiam sonet his, quodsi inciderint philosophia te -per. Nullam lobortis eu cum, vix an sonet efficiendi repudiandae. Vis -ad idque fabellas intellegebat. - -Eum commodo senserit conclusionemque ex. Sed forensibus sadipscing ut, -mei in facer delicata periculis, sea ne hinc putent cetero. Nec ne -alia corpora invenire, alia prima soleat te cum. Eleifend posidonium -nam at. - -Dolorum indoctum cu quo, ex dolor legendos recteque eam, cu pri zril -discere. Nec civibus officiis dissentiunt ex, est te liber ludus -elaboraret. Cum ea fabellas invenire. Ex vim nostrud eripuit -comprehensam, nam te inermis delectus, saepe inermis senserit. -` diff --git a/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html b/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html deleted file mode 100644 index 9915fa0ee..000000000 --- a/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - HTTP charset - - - - - - - - - - - -

HTTP charset

- - -
- - -
 
- - - - - -
-

The character encoding of a page can be set using the HTTP header charset declaration.

-

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

The only character encoding declaration for this HTML file is in the HTTP header, which sets the encoding to ISO 8859-15.

-
-
-
HTML5
-

the-input-byte-stream-001
Result summary & related tests
Detailed results for this test
Link to spec

-
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • -
  • The test is read from a server that supports HTTP.
-
- - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html deleted file mode 100644 index 26e5d8b4e..000000000 --- a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - HTTP vs UTF-8 BOM - - - - - - - - - - - -

HTTP vs UTF-8 BOM

- - -
- - -
 
- - - - - -
-

A character encoding set in the HTTP header has lower precedence than the UTF-8 signature.

-

The HTTP header attempts to set the character encoding to ISO 8859-15. The page starts with a UTF-8 signature.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

If the test is unsuccessful, the characters  should appear at the top of the page. These represent the bytes that make up the UTF-8 signature when encountered in the ISO 8859-15 encoding.

-
-
-
HTML5
-

the-input-byte-stream-034
Result summary & related tests
Detailed results for this test
Link to spec

-
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • -
  • The test is read from a server that supports HTTP.
-
- - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html deleted file mode 100644 index 2f07e9515..000000000 --- a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - HTTP vs meta charset - - - - - - - - - - - -

HTTP vs meta charset

- - -
- - -
 
- - - - - -
-

The HTTP header has a higher precedence than an encoding declaration in a meta charset attribute.

-

The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-1.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

-
-
-
HTML5
-

the-input-byte-stream-018
Result summary & related tests
Detailed results for this test
Link to spec

-
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • -
  • The test is read from a server that supports HTTP.
-
- - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html deleted file mode 100644 index 6853cddec..000000000 --- a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - HTTP vs meta content - - - - - - - - - - - -

HTTP vs meta content

- - -
- - -
 
- - - - - -
-

The HTTP header has a higher precedence than an encoding declaration in a meta content attribute.

-

The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-1.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

-
-
-
HTML5
-

the-input-byte-stream-016
Result summary & related tests
Detailed results for this test
Link to spec

-
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • -
  • The test is read from a server that supports HTTP.
-
- - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html b/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html deleted file mode 100644 index 612e26c6c..000000000 --- a/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - No encoding declaration - - - - - - - - - - - -

No encoding declaration

- - -
- - -
 
- - - - - -
-

A page with no encoding information in HTTP, BOM, XML declaration or meta element will be treated as UTF-8.

-

The test on this page contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

-
-
-
HTML5
-

the-input-byte-stream-015
Result summary & related tests
Detailed results for this test
Link to spec

-
Assumptions:
  • The test is read from a server that supports HTTP.
-
- - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/README b/vendor/golang.org/x/net/html/charset/testdata/README deleted file mode 100644 index 38ef0f9f1..000000000 --- a/vendor/golang.org/x/net/html/charset/testdata/README +++ /dev/null @@ -1,9 +0,0 @@ -These test cases come from -http://www.w3.org/International/tests/repository/html5/the-input-byte-stream/results-basics - -Distributed under both the W3C Test Suite License -(http://www.w3.org/Consortium/Legal/2008/04-testsuite-license) -and the W3C 3-clause BSD License -(http://www.w3.org/Consortium/Legal/2008/03-bsd-license). -To contribute to a W3C Test Suite, see the policies and contribution -forms (http://www.w3.org/2004/10/27-testcases). diff --git a/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html b/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html deleted file mode 100644 index 3abf7a9343c20518e57dfea58b374fb0f4fb58a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2670 zcmcJR?QRoS5Qc}JAoU&=BQ-(7b^;2j8i*i3RV1JlO@;VXIsPurV!WHiDdLW}i`*CO z^UnC>tih=KsVr;H&Y7?C&O3AV(?534uG?e##U9y_y|!QNi4``n+D>d{2lky^LnFNx z?9HrarH$>rwQR_$g)Hk0*&STI*EYq|47~&U9sfUB+ji})9eR{QqCUra7oDsZ5obtB zdxP%<)-$4Q;rSHJiM>U(#ZI=;?n^BC?Dp6lu=~_1-lnX3u03&2BlmQIY>L+!Uq7XoytKw^Q#oZSM?3*J?)&ojG&yzQRkC!Ml5JE?ax;lp_NYEcdUht`ZswOviB~L5hmJ|pXI71nn20w;>vG! zQGB$EE9&wC``&J#_Ym~PgRu-Bd>1!pOp0||k`kr=VJ zfH6I6rmRaeHA7U-A^OTsT+|d2a^i(>DePzZ{)ibXoCBvJnuYrd-3kkN$uy{qQK;=*Y;S87ro12aTgu^i*%f8zC3>a}9DIe4cfxOzsCw&(cqvP9{ud{N6f` z#TNDY(B6@Gpr|uN+%&x^XZjBHdc@2vsM(Tyc2=vshHQ5w+obmp>tuWT(t4BTUGAQw zxeI$UGSLUBg=WFbF;4f@4=^P2AgY@CFn8A`bcC=_&~)fiDe)#cUARRBzJ^k|%X)69 z+{Cb`wq}Rsg%B62CC_tK!AV(W{(MV?#mndR46CU#BUN<{8e?*oT+!pE5wF#O#TR#a z$9qRT)tpbw8zAI~QQJg2C3|6$I%(T(;`zOMy6SO+&;pG=c#2P|P-WZn$$DpWJlC3U z3*nvmz zwP{u~r$L?-m3uqp9I1+#3yE|3M$(s-BEtih=LQ>`qYoiktOop(wi%!;yh%+Rm z{e|xntY<{q!1F1Z6MKtngPm-p-4|H&+3m4AVE3_AyiHm6Tzlf4M(*ht*%YrezJ6kr zHGj45pc?64*$Cm%-zseWMA`x;)v*~jA=i}szqts9xmQkS`M11|(H7bTXAycsXU53+ zJ?120SRZeyiFjW7enPN`bxk$IaWV3o48oJF7D&2ysoY;6(s6%6vVfaYd&mC=erK!) zNGI^7upQgN)53OHe_VE<@J+G8*Y|p*)zB2Thdi}+YR<5QWHm!|a_*AoZXuv7)$xe| zm3Q$D7{|#}{m4X&UY!6(ZhyYi2(5JLzGE$H)W6BQklnjPMwn<Yvv7Z*TVWwD*=E3QpH37* z#lqXJA0A~J9T_<^W5smspmDg2p6ac5Bjn+~LAoow%1TCdZ*$K8`O zw_$HaCi+0N&@7la#_7KL5r$+QL{)Pi=I&aDjt~|Knht#`CEi4*3%97i_fSfASlwUz0=3V0GCxY}z81UC-nP=CGt2OqYV$ zoRCo+qM9YX*3FFORLC=E3B~S@+KROyk4r5 yX7?DaslDfIebqXgC!KKp4IYy+W~X?ddE6o=`A+x#x0AK&6MF#W&AXxbRrv+SX}PNa diff --git a/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html b/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html deleted file mode 100644 index 83de43338..000000000 --- a/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - UTF-8 BOM vs meta charset - - - - - - - - - - - -

UTF-8 BOM vs meta charset

- - -
- - -
 
- - - - - -
-

A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta charset attribute declares a different encoding.

-

The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

-
-
-
HTML5
-

the-input-byte-stream-038
Result summary & related tests
Detailed results for this test
Link to spec

-
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • -
  • The test is read from a server that supports HTTP.
-
- - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html b/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html deleted file mode 100644 index 501aac2d6..000000000 --- a/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - UTF-8 BOM vs meta content - - - - - - - - - - - -

UTF-8 BOM vs meta content

- - -
- - -
 
- - - - - -
-

A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta content attribute declares a different encoding.

-

The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

-
-
-
HTML5
-

the-input-byte-stream-037
Result summary & related tests
Detailed results for this test
Link to spec

-
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • -
  • The test is read from a server that supports HTTP.
-
- - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html b/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html deleted file mode 100644 index 2d7d25aba..000000000 --- a/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - meta charset attribute - - - - - - - - - - - -

meta charset attribute

- - -
- - -
 
- - - - - -
-

The character encoding of the page can be set by a meta element with charset attribute.

-

The only character encoding declaration for this HTML file is in the charset attribute of the meta element, which declares the encoding to be ISO 8859-15.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

-
-
-
HTML5
-

the-input-byte-stream-009
Result summary & related tests
Detailed results for this test
Link to spec

-
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • -
  • The test is read from a server that supports HTTP.
-
- - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html b/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html deleted file mode 100644 index 1c3f228e7..000000000 --- a/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - meta content attribute - - - - - - - - - - - -

meta content attribute

- - -
- - -
 
- - - - - -
-

The character encoding of the page can be set by a meta element with http-equiv and content attributes.

-

The only character encoding declaration for this HTML file is in the content attribute of the meta element, which declares the encoding to be ISO 8859-15.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

-
-
-
HTML5
-

the-input-byte-stream-007
Result summary & related tests
Detailed results for this test
Link to spec

-
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • -
  • The test is read from a server that supports HTTP.
-
- - - - - - diff --git a/vendor/golang.org/x/net/html/testdata/go1.html b/vendor/golang.org/x/net/html/testdata/go1.html deleted file mode 100644 index d238257c3..000000000 --- a/vendor/golang.org/x/net/html/testdata/go1.html +++ /dev/null @@ -1,2237 +0,0 @@ - - - - - - Go 1 Release Notes - The Go Programming Language - - - - - - - - - - - - -
- - -
-

Go 1 Release Notes

- - - - - - - - - -

Introduction to Go 1

- -

-Go version 1, Go 1 for short, defines a language and a set of core libraries -that provide a stable foundation for creating reliable products, projects, and -publications. -

- -

-The driving motivation for Go 1 is stability for its users. People should be able to -write Go programs and expect that they will continue to compile and run without -change, on a time scale of years, including in production environments such as -Google App Engine. Similarly, people should be able to write books about Go, be -able to say which version of Go the book is describing, and have that version -number still be meaningful much later. -

- -

-Code that compiles in Go 1 should, with few exceptions, continue to compile and -run throughout the lifetime of that version, even as we issue updates and bug -fixes such as Go version 1.1, 1.2, and so on. Other than critical fixes, changes -made to the language and library for subsequent releases of Go 1 may -add functionality but will not break existing Go 1 programs. -The Go 1 compatibility document -explains the compatibility guidelines in more detail. -

- -

-Go 1 is a representation of Go as it used today, not a wholesale rethinking of -the language. We avoided designing new features and instead focused on cleaning -up problems and inconsistencies and improving portability. There are a number -changes to the Go language and packages that we had considered for some time and -prototyped but not released primarily because they are significant and -backwards-incompatible. Go 1 was an opportunity to get them out, which is -helpful for the long term, but also means that Go 1 introduces incompatibilities -for old programs. Fortunately, the go fix tool can -automate much of the work needed to bring programs up to the Go 1 standard. -

- -

-This document outlines the major changes in Go 1 that will affect programmers -updating existing code; its reference point is the prior release, r60 (tagged as -r60.3). It also explains how to update code from r60 to run under Go 1. -

- -

Changes to the language

- -

Append

- -

-The append predeclared variadic function makes it easy to grow a slice -by adding elements to the end. -A common use is to add bytes to the end of a byte slice when generating output. -However, append did not provide a way to append a string to a []byte, -which is another common case. -

- -
    greeting := []byte{}
-    greeting = append(greeting, []byte("hello ")...)
- -

-By analogy with the similar property of copy, Go 1 -permits a string to be appended (byte-wise) directly to a byte -slice, reducing the friction between strings and byte slices. -The conversion is no longer necessary: -

- -
    greeting = append(greeting, "world"...)
- -

-Updating: -This is a new feature, so existing code needs no changes. -

- -

Close

- -

-The close predeclared function provides a mechanism -for a sender to signal that no more values will be sent. -It is important to the implementation of for range -loops over channels and is helpful in other situations. -Partly by design and partly because of race conditions that can occur otherwise, -it is intended for use only by the goroutine sending on the channel, -not by the goroutine receiving data. -However, before Go 1 there was no compile-time checking that close -was being used correctly. -

- -

-To close this gap, at least in part, Go 1 disallows close on receive-only channels. -Attempting to close such a channel is a compile-time error. -

- -
-    var c chan int
-    var csend chan<- int = c
-    var crecv <-chan int = c
-    close(c)     // legal
-    close(csend) // legal
-    close(crecv) // illegal
-
- -

-Updating: -Existing code that attempts to close a receive-only channel was -erroneous even before Go 1 and should be fixed. The compiler will -now reject such code. -

- -

Composite literals

- -

-In Go 1, a composite literal of array, slice, or map type can elide the -type specification for the elements' initializers if they are of pointer type. -All four of the initializations in this example are legal; the last one was illegal before Go 1. -

- -
    type Date struct {
-        month string
-        day   int
-    }
-    // Struct values, fully qualified; always legal.
-    holiday1 := []Date{
-        Date{"Feb", 14},
-        Date{"Nov", 11},
-        Date{"Dec", 25},
-    }
-    // Struct values, type name elided; always legal.
-    holiday2 := []Date{
-        {"Feb", 14},
-        {"Nov", 11},
-        {"Dec", 25},
-    }
-    // Pointers, fully qualified, always legal.
-    holiday3 := []*Date{
-        &Date{"Feb", 14},
-        &Date{"Nov", 11},
-        &Date{"Dec", 25},
-    }
-    // Pointers, type name elided; legal in Go 1.
-    holiday4 := []*Date{
-        {"Feb", 14},
-        {"Nov", 11},
-        {"Dec", 25},
-    }
- -

-Updating: -This change has no effect on existing code, but the command -gofmt -s applied to existing source -will, among other things, elide explicit element types wherever permitted. -

- - -

Goroutines during init

- -

-The old language defined that go statements executed during initialization created goroutines but that they did not begin to run until initialization of the entire program was complete. -This introduced clumsiness in many places and, in effect, limited the utility -of the init construct: -if it was possible for another package to use the library during initialization, the library -was forced to avoid goroutines. -This design was done for reasons of simplicity and safety but, -as our confidence in the language grew, it seemed unnecessary. -Running goroutines during initialization is no more complex or unsafe than running them during normal execution. -

- -

-In Go 1, code that uses goroutines can be called from -init routines and global initialization expressions -without introducing a deadlock. -

- -
var PackageGlobal int
-
-func init() {
-    c := make(chan int)
-    go initializationFunction(c)
-    PackageGlobal = <-c
-}
- -

-Updating: -This is a new feature, so existing code needs no changes, -although it's possible that code that depends on goroutines not starting before main will break. -There was no such code in the standard repository. -

- -

The rune type

- -

-The language spec allows the int type to be 32 or 64 bits wide, but current implementations set int to 32 bits even on 64-bit platforms. -It would be preferable to have int be 64 bits on 64-bit platforms. -(There are important consequences for indexing large slices.) -However, this change would waste space when processing Unicode characters with -the old language because the int type was also used to hold Unicode code points: each code point would waste an extra 32 bits of storage if int grew from 32 bits to 64. -

- -

-To make changing to 64-bit int feasible, -Go 1 introduces a new basic type, rune, to represent -individual Unicode code points. -It is an alias for int32, analogous to byte -as an alias for uint8. -

- -

-Character literals such as 'a', '語', and '\u0345' -now have default type rune, -analogous to 1.0 having default type float64. -A variable initialized to a character constant will therefore -have type rune unless otherwise specified. -

- -

-Libraries have been updated to use rune rather than int -when appropriate. For instance, the functions unicode.ToLower and -relatives now take and return a rune. -

- -
    delta := 'δ' // delta has type rune.
-    var DELTA rune
-    DELTA = unicode.ToUpper(delta)
-    epsilon := unicode.ToLower(DELTA + 1)
-    if epsilon != 'δ'+1 {
-        log.Fatal("inconsistent casing for Greek")
-    }
- -

-Updating: -Most source code will be unaffected by this because the type inference from -:= initializers introduces the new type silently, and it propagates -from there. -Some code may get type errors that a trivial conversion will resolve. -

- -

The error type

- -

-Go 1 introduces a new built-in type, error, which has the following definition: -

- -
-    type error interface {
-        Error() string
-    }
-
- -

-Since the consequences of this type are all in the package library, -it is discussed below. -

- -

Deleting from maps

- -

-In the old language, to delete the entry with key k from map m, one wrote the statement, -

- -
-    m[k] = value, false
-
- -

-This syntax was a peculiar special case, the only two-to-one assignment. -It required passing a value (usually ignored) that is evaluated but discarded, -plus a boolean that was nearly always the constant false. -It did the job but was odd and a point of contention. -

- -

-In Go 1, that syntax has gone; instead there is a new built-in -function, delete. The call -

- -
    delete(m, k)
- -

-will delete the map entry retrieved by the expression m[k]. -There is no return value. Deleting a non-existent entry is a no-op. -

- -

-Updating: -Running go fix will convert expressions of the form m[k] = value, -false into delete(m, k) when it is clear that -the ignored value can be safely discarded from the program and -false refers to the predefined boolean constant. -The fix tool -will flag other uses of the syntax for inspection by the programmer. -

- -

Iterating in maps

- -

-The old language specification did not define the order of iteration for maps, -and in practice it differed across hardware platforms. -This caused tests that iterated over maps to be fragile and non-portable, with the -unpleasant property that a test might always pass on one machine but break on another. -

- -

-In Go 1, the order in which elements are visited when iterating -over a map using a for range statement -is defined to be unpredictable, even if the same loop is run multiple -times with the same map. -Code should not assume that the elements are visited in any particular order. -

- -

-This change means that code that depends on iteration order is very likely to break early and be fixed long before it becomes a problem. -Just as important, it allows the map implementation to ensure better map balancing even when programs are using range loops to select an element from a map. -

- -
    m := map[string]int{"Sunday": 0, "Monday": 1}
-    for name, value := range m {
-        // This loop should not assume Sunday will be visited first.
-        f(name, value)
-    }
- -

-Updating: -This is one change where tools cannot help. Most existing code -will be unaffected, but some programs may break or misbehave; we -recommend manual checking of all range statements over maps to -verify they do not depend on iteration order. There were a few such -examples in the standard repository; they have been fixed. -Note that it was already incorrect to depend on the iteration order, which -was unspecified. This change codifies the unpredictability. -

- -

Multiple assignment

- -

-The language specification has long guaranteed that in assignments -the right-hand-side expressions are all evaluated before any left-hand-side expressions are assigned. -To guarantee predictable behavior, -Go 1 refines the specification further. -

- -

-If the left-hand side of the assignment -statement contains expressions that require evaluation, such as -function calls or array indexing operations, these will all be done -using the usual left-to-right rule before any variables are assigned -their value. Once everything is evaluated, the actual assignments -proceed in left-to-right order. -

- -

-These examples illustrate the behavior. -

- -
    sa := []int{1, 2, 3}
-    i := 0
-    i, sa[i] = 1, 2 // sets i = 1, sa[0] = 2
-
-    sb := []int{1, 2, 3}
-    j := 0
-    sb[j], j = 2, 1 // sets sb[0] = 2, j = 1
-
-    sc := []int{1, 2, 3}
-    sc[0], sc[0] = 1, 2 // sets sc[0] = 1, then sc[0] = 2 (so sc[0] = 2 at end)
- -

-Updating: -This is one change where tools cannot help, but breakage is unlikely. -No code in the standard repository was broken by this change, and code -that depended on the previous unspecified behavior was already incorrect. -

- -

Returns and shadowed variables

- -

-A common mistake is to use return (without arguments) after an assignment to a variable that has the same name as a result variable but is not the same variable. -This situation is called shadowing: the result variable has been shadowed by another variable with the same name declared in an inner scope. -

- -

-In functions with named return values, -the Go 1 compilers disallow return statements without arguments if any of the named return values is shadowed at the point of the return statement. -(It isn't part of the specification, because this is one area we are still exploring; -the situation is analogous to the compilers rejecting functions that do not end with an explicit return statement.) -

- -

-This function implicitly returns a shadowed return value and will be rejected by the compiler: -

- -
-    func Bug() (i, j, k int) {
-        for i = 0; i < 5; i++ {
-            for j := 0; j < 5; j++ { // Redeclares j.
-                k += i*j
-                if k > 100 {
-                    return // Rejected: j is shadowed here.
-                }
-            }
-        }
-        return // OK: j is not shadowed here.
-    }
-
- -

-Updating: -Code that shadows return values in this way will be rejected by the compiler and will need to be fixed by hand. -The few cases that arose in the standard repository were mostly bugs. -

- -

Copying structs with unexported fields

- -

-The old language did not allow a package to make a copy of a struct value containing unexported fields belonging to a different package. -There was, however, a required exception for a method receiver; -also, the implementations of copy and append have never honored the restriction. -

- -

-Go 1 will allow packages to copy struct values containing unexported fields from other packages. -Besides resolving the inconsistency, -this change admits a new kind of API: a package can return an opaque value without resorting to a pointer or interface. -The new implementations of time.Time and -reflect.Value are examples of types taking advantage of this new property. -

- -

-As an example, if package p includes the definitions, -

- -
-    type Struct struct {
-        Public int
-        secret int
-    }
-    func NewStruct(a int) Struct {  // Note: not a pointer.
-        return Struct{a, f(a)}
-    }
-    func (s Struct) String() string {
-        return fmt.Sprintf("{%d (secret %d)}", s.Public, s.secret)
-    }
-
- -

-a package that imports p can assign and copy values of type -p.Struct at will. -Behind the scenes the unexported fields will be assigned and copied just -as if they were exported, -but the client code will never be aware of them. The code -

- -
-    import "p"
-
-    myStruct := p.NewStruct(23)
-    copyOfMyStruct := myStruct
-    fmt.Println(myStruct, copyOfMyStruct)
-
- -

-will show that the secret field of the struct has been copied to the new value. -

- -

-Updating: -This is a new feature, so existing code needs no changes. -

- -

Equality

- -

-Before Go 1, the language did not define equality on struct and array values. -This meant, -among other things, that structs and arrays could not be used as map keys. -On the other hand, Go did define equality on function and map values. -Function equality was problematic in the presence of closures -(when are two closures equal?) -while map equality compared pointers, not the maps' content, which was usually -not what the user would want. -

- -

-Go 1 addressed these issues. -First, structs and arrays can be compared for equality and inequality -(== and !=), -and therefore be used as map keys, -provided they are composed from elements for which equality is also defined, -using element-wise comparison. -

- -
    type Day struct {
-        long  string
-        short string
-    }
-    Christmas := Day{"Christmas", "XMas"}
-    Thanksgiving := Day{"Thanksgiving", "Turkey"}
-    holiday := map[Day]bool{
-        Christmas:    true,
-        Thanksgiving: true,
-    }
-    fmt.Printf("Christmas is a holiday: %t\n", holiday[Christmas])
- -

-Second, Go 1 removes the definition of equality for function values, -except for comparison with nil. -Finally, map equality is gone too, also except for comparison with nil. -

- -

-Note that equality is still undefined for slices, for which the -calculation is in general infeasible. Also note that the ordered -comparison operators (< <= -> >=) are still undefined for -structs and arrays. - -

-Updating: -Struct and array equality is a new feature, so existing code needs no changes. -Existing code that depends on function or map equality will be -rejected by the compiler and will need to be fixed by hand. -Few programs will be affected, but the fix may require some -redesign. -

- -

The package hierarchy

- -

-Go 1 addresses many deficiencies in the old standard library and -cleans up a number of packages, making them more internally consistent -and portable. -

- -

-This section describes how the packages have been rearranged in Go 1. -Some have moved, some have been renamed, some have been deleted. -New packages are described in later sections. -

- -

The package hierarchy

- -

-Go 1 has a rearranged package hierarchy that groups related items -into subdirectories. For instance, utf8 and -utf16 now occupy subdirectories of unicode. -Also, some packages have moved into -subrepositories of -code.google.com/p/go -while others have been deleted outright. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Old pathNew path

asn1 encoding/asn1
csv encoding/csv
gob encoding/gob
json encoding/json
xml encoding/xml

exp/template/html html/template

big math/big
cmath math/cmplx
rand math/rand

http net/http
http/cgi net/http/cgi
http/fcgi net/http/fcgi
http/httptest net/http/httptest
http/pprof net/http/pprof
mail net/mail
rpc net/rpc
rpc/jsonrpc net/rpc/jsonrpc
smtp net/smtp
url net/url

exec os/exec

scanner text/scanner
tabwriter text/tabwriter
template text/template
template/parse text/template/parse

utf8 unicode/utf8
utf16 unicode/utf16
- -

-Note that the package names for the old cmath and -exp/template/html packages have changed to cmplx -and template. -

- -

-Updating: -Running go fix will update all imports and package renames for packages that -remain inside the standard repository. Programs that import packages -that are no longer in the standard repository will need to be edited -by hand. -

- -

The package tree exp

- -

-Because they are not standardized, the packages under the exp directory will not be available in the -standard Go 1 release distributions, although they will be available in source code form -in the repository for -developers who wish to use them. -

- -

-Several packages have moved under exp at the time of Go 1's release: -

- -
    -
  • ebnf
  • -
  • html
  • -
  • go/types
  • -
- -

-(The EscapeString and UnescapeString types remain -in package html.) -

- -

-All these packages are available under the same names, with the prefix exp/: exp/ebnf etc. -

- -

-Also, the utf8.String type has been moved to its own package, exp/utf8string. -

- -

-Finally, the gotype command now resides in exp/gotype, while -ebnflint is now in exp/ebnflint. -If they are installed, they now reside in $GOROOT/bin/tool. -

- -

-Updating: -Code that uses packages in exp will need to be updated by hand, -or else compiled from an installation that has exp available. -The go fix tool or the compiler will complain about such uses. -

- -

The package tree old

- -

-Because they are deprecated, the packages under the old directory will not be available in the -standard Go 1 release distributions, although they will be available in source code form for -developers who wish to use them. -

- -

-The packages in their new locations are: -

- -
    -
  • old/netchan
  • -
  • old/regexp
  • -
  • old/template
  • -
- -

-Updating: -Code that uses packages now in old will need to be updated by hand, -or else compiled from an installation that has old available. -The go fix tool will warn about such uses. -

- -

Deleted packages

- -

-Go 1 deletes several packages outright: -

- -
    -
  • container/vector
  • -
  • exp/datafmt
  • -
  • go/typechecker
  • -
  • try
  • -
- -

-and also the command gotry. -

- -

-Updating: -Code that uses container/vector should be updated to use -slices directly. See -the Go -Language Community Wiki for some suggestions. -Code that uses the other packages (there should be almost zero) will need to be rethought. -

- -

Packages moving to subrepositories

- -

-Go 1 has moved a number of packages into other repositories, usually sub-repositories of -the main Go repository. -This table lists the old and new import paths: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OldNew

crypto/bcrypt code.google.com/p/go.crypto/bcrypt
crypto/blowfish code.google.com/p/go.crypto/blowfish
crypto/cast5 code.google.com/p/go.crypto/cast5
crypto/md4 code.google.com/p/go.crypto/md4
crypto/ocsp code.google.com/p/go.crypto/ocsp
crypto/openpgp code.google.com/p/go.crypto/openpgp
crypto/openpgp/armor code.google.com/p/go.crypto/openpgp/armor
crypto/openpgp/elgamal code.google.com/p/go.crypto/openpgp/elgamal
crypto/openpgp/errors code.google.com/p/go.crypto/openpgp/errors
crypto/openpgp/packet code.google.com/p/go.crypto/openpgp/packet
crypto/openpgp/s2k code.google.com/p/go.crypto/openpgp/s2k
crypto/ripemd160 code.google.com/p/go.crypto/ripemd160
crypto/twofish code.google.com/p/go.crypto/twofish
crypto/xtea code.google.com/p/go.crypto/xtea
exp/ssh code.google.com/p/go.crypto/ssh

image/bmp code.google.com/p/go.image/bmp
image/tiff code.google.com/p/go.image/tiff

net/dict code.google.com/p/go.net/dict
net/websocket code.google.com/p/go.net/websocket
exp/spdy code.google.com/p/go.net/spdy

encoding/git85 code.google.com/p/go.codereview/git85
patch code.google.com/p/go.codereview/patch

exp/wingui code.google.com/p/gowingui
- -

-Updating: -Running go fix will update imports of these packages to use the new import paths. -Installations that depend on these packages will need to install them using -a go get command. -

- -

Major changes to the library

- -

-This section describes significant changes to the core libraries, the ones that -affect the most programs. -

- -

The error type and errors package

- -

-The placement of os.Error in package os is mostly historical: errors first came up when implementing package os, and they seemed system-related at the time. -Since then it has become clear that errors are more fundamental than the operating system. For example, it would be nice to use Errors in packages that os depends on, like syscall. -Also, having Error in os introduces many dependencies on os that would otherwise not exist. -

- -

-Go 1 solves these problems by introducing a built-in error interface type and a separate errors package (analogous to bytes and strings) that contains utility functions. -It replaces os.NewError with -errors.New, -giving errors a more central place in the environment. -

- -

-So the widely-used String method does not cause accidental satisfaction -of the error interface, the error interface uses instead -the name Error for that method: -

- -
-    type error interface {
-        Error() string
-    }
-
- -

-The fmt library automatically invokes Error, as it already -does for String, for easy printing of error values. -

- -
type SyntaxError struct {
-    File    string
-    Line    int
-    Message string
-}
-
-func (se *SyntaxError) Error() string {
-    return fmt.Sprintf("%s:%d: %s", se.File, se.Line, se.Message)
-}
- -

-All standard packages have been updated to use the new interface; the old os.Error is gone. -

- -

-A new package, errors, contains the function -

- -
-func New(text string) error
-
- -

-to turn a string into an error. It replaces the old os.NewError. -

- -
    var ErrSyntax = errors.New("syntax error")
- -

-Updating: -Running go fix will update almost all code affected by the change. -Code that defines error types with a String method will need to be updated -by hand to rename the methods to Error. -

- -

System call errors

- -

-The old syscall package, which predated os.Error -(and just about everything else), -returned errors as int values. -In turn, the os package forwarded many of these errors, such -as EINVAL, but using a different set of errors on each platform. -This behavior was unpleasant and unportable. -

- -

-In Go 1, the -syscall -package instead returns an error for system call errors. -On Unix, the implementation is done by a -syscall.Errno type -that satisfies error and replaces the old os.Errno. -

- -

-The changes affecting os.EINVAL and relatives are -described elsewhere. - -

-Updating: -Running go fix will update almost all code affected by the change. -Regardless, most code should use the os package -rather than syscall and so will be unaffected. -

- -

Time

- -

-Time is always a challenge to support well in a programming language. -The old Go time package had int64 units, no -real type safety, -and no distinction between absolute times and durations. -

- -

-One of the most sweeping changes in the Go 1 library is therefore a -complete redesign of the -time package. -Instead of an integer number of nanoseconds as an int64, -and a separate *time.Time type to deal with human -units such as hours and years, -there are now two fundamental types: -time.Time -(a value, so the * is gone), which represents a moment in time; -and time.Duration, -which represents an interval. -Both have nanosecond resolution. -A Time can represent any time into the ancient -past and remote future, while a Duration can -span plus or minus only about 290 years. -There are methods on these types, plus a number of helpful -predefined constant durations such as time.Second. -

- -

-Among the new methods are things like -Time.Add, -which adds a Duration to a Time, and -Time.Sub, -which subtracts two Times to yield a Duration. -

- -

-The most important semantic change is that the Unix epoch (Jan 1, 1970) is now -relevant only for those functions and methods that mention Unix: -time.Unix -and the Unix -and UnixNano methods -of the Time type. -In particular, -time.Now -returns a time.Time value rather than, in the old -API, an integer nanosecond count since the Unix epoch. -

- -
// sleepUntil sleeps until the specified time. It returns immediately if it's too late.
-func sleepUntil(wakeup time.Time) {
-    now := time.Now() // A Time.
-    if !wakeup.After(now) {
-        return
-    }
-    delta := wakeup.Sub(now) // A Duration.
-    fmt.Printf("Sleeping for %.3fs\n", delta.Seconds())
-    time.Sleep(delta)
-}
- -

-The new types, methods, and constants have been propagated through -all the standard packages that use time, such as os and -its representation of file time stamps. -

- -

-Updating: -The go fix tool will update many uses of the old time package to use the new -types and methods, although it does not replace values such as 1e9 -representing nanoseconds per second. -Also, because of type changes in some of the values that arise, -some of the expressions rewritten by the fix tool may require -further hand editing; in such cases the rewrite will include -the correct function or method for the old functionality, but -may have the wrong type or require further analysis. -

- -

Minor changes to the library

- -

-This section describes smaller changes, such as those to less commonly -used packages or that affect -few programs beyond the need to run go fix. -This category includes packages that are new in Go 1. -Collectively they improve portability, regularize behavior, and -make the interfaces more modern and Go-like. -

- -

The archive/zip package

- -

-In Go 1, *zip.Writer no -longer has a Write method. Its presence was a mistake. -

- -

-Updating: -What little code is affected will be caught by the compiler and must be updated by hand. -

- -

The bufio package

- -

-In Go 1, bufio.NewReaderSize -and -bufio.NewWriterSize -functions no longer return an error for invalid sizes. -If the argument size is too small or invalid, it is adjusted. -

- -

-Updating: -Running go fix will update calls that assign the error to _. -Calls that aren't fixed will be caught by the compiler and must be updated by hand. -

- -

The compress/flate, compress/gzip and compress/zlib packages

- -

-In Go 1, the NewWriterXxx functions in -compress/flate, -compress/gzip and -compress/zlib -all return (*Writer, error) if they take a compression level, -and *Writer otherwise. Package gzip's -Compressor and Decompressor types have been renamed -to Writer and Reader. Package flate's -WrongValueError type has been removed. -

- -

-Updating -Running go fix will update old names and calls that assign the error to _. -Calls that aren't fixed will be caught by the compiler and must be updated by hand. -

- -

The crypto/aes and crypto/des packages

- -

-In Go 1, the Reset method has been removed. Go does not guarantee -that memory is not copied and therefore this method was misleading. -

- -

-The cipher-specific types *aes.Cipher, *des.Cipher, -and *des.TripleDESCipher have been removed in favor of -cipher.Block. -

- -

-Updating: -Remove the calls to Reset. Replace uses of the specific cipher types with -cipher.Block. -

- -

The crypto/elliptic package

- -

-In Go 1, elliptic.Curve -has been made an interface to permit alternative implementations. The curve -parameters have been moved to the -elliptic.CurveParams -structure. -

- -

-Updating: -Existing users of *elliptic.Curve will need to change to -simply elliptic.Curve. Calls to Marshal, -Unmarshal and GenerateKey are now functions -in crypto/elliptic that take an elliptic.Curve -as their first argument. -

- -

The crypto/hmac package

- -

-In Go 1, the hash-specific functions, such as hmac.NewMD5, have -been removed from crypto/hmac. Instead, hmac.New takes -a function that returns a hash.Hash, such as md5.New. -

- -

-Updating: -Running go fix will perform the needed changes. -

- -

The crypto/x509 package

- -

-In Go 1, the -CreateCertificate -and -CreateCRL -functions in crypto/x509 have been altered to take an -interface{} where they previously took a *rsa.PublicKey -or *rsa.PrivateKey. This will allow other public key algorithms -to be implemented in the future. -

- -

-Updating: -No changes will be needed. -

- -

The encoding/binary package

- -

-In Go 1, the binary.TotalSize function has been replaced by -Size, -which takes an interface{} argument rather than -a reflect.Value. -

- -

-Updating: -What little code is affected will be caught by the compiler and must be updated by hand. -

- -

The encoding/xml package

- -

-In Go 1, the xml package -has been brought closer in design to the other marshaling packages such -as encoding/gob. -

- -

-The old Parser type is renamed -Decoder and has a new -Decode method. An -Encoder type was also introduced. -

- -

-The functions Marshal -and Unmarshal -work with []byte values now. To work with streams, -use the new Encoder -and Decoder types. -

- -

-When marshaling or unmarshaling values, the format of supported flags in -field tags has changed to be closer to the -json package -(`xml:"name,flag"`). The matching done between field tags, field -names, and the XML attribute and element names is now case-sensitive. -The XMLName field tag, if present, must also match the name -of the XML element being marshaled. -

- -

-Updating: -Running go fix will update most uses of the package except for some calls to -Unmarshal. Special care must be taken with field tags, -since the fix tool will not update them and if not fixed by hand they will -misbehave silently in some cases. For example, the old -"attr" is now written ",attr" while plain -"attr" remains valid but with a different meaning. -

- -

The expvar package

- -

-In Go 1, the RemoveAll function has been removed. -The Iter function and Iter method on *Map have -been replaced by -Do -and -(*Map).Do. -

- -

-Updating: -Most code using expvar will not need changing. The rare code that used -Iter can be updated to pass a closure to Do to achieve the same effect. -

- -

The flag package

- -

-In Go 1, the interface flag.Value has changed slightly. -The Set method now returns an error instead of -a bool to indicate success or failure. -

- -

-There is also a new kind of flag, Duration, to support argument -values specifying time intervals. -Values for such flags must be given units, just as time.Duration -formats them: 10s, 1h30m, etc. -

- -
var timeout = flag.Duration("timeout", 30*time.Second, "how long to wait for completion")
- -

-Updating: -Programs that implement their own flags will need minor manual fixes to update their -Set methods. -The Duration flag is new and affects no existing code. -

- - -

The go/* packages

- -

-Several packages under go have slightly revised APIs. -

- -

-A concrete Mode type was introduced for configuration mode flags -in the packages -go/scanner, -go/parser, -go/printer, and -go/doc. -

- -

-The modes AllowIllegalChars and InsertSemis have been removed -from the go/scanner package. They were mostly -useful for scanning text other then Go source files. Instead, the -text/scanner package should be used -for that purpose. -

- -

-The ErrorHandler provided -to the scanner's Init method is -now simply a function rather than an interface. The ErrorVector type has -been removed in favor of the (existing) ErrorList -type, and the ErrorVector methods have been migrated. Instead of embedding -an ErrorVector in a client of the scanner, now a client should maintain -an ErrorList. -

- -

-The set of parse functions provided by the go/parser -package has been reduced to the primary parse function -ParseFile, and a couple of -convenience functions ParseDir -and ParseExpr. -

- -

-The go/printer package supports an additional -configuration mode SourcePos; -if set, the printer will emit //line comments such that the generated -output contains the original source code position information. The new type -CommentedNode can be -used to provide comments associated with an arbitrary -ast.Node (until now only -ast.File carried comment information). -

- -

-The type names of the go/doc package have been -streamlined by removing the Doc suffix: PackageDoc -is now Package, ValueDoc is Value, etc. -Also, all types now consistently have a Name field (or Names, -in the case of type Value) and Type.Factories has become -Type.Funcs. -Instead of calling doc.NewPackageDoc(pkg, importpath), -documentation for a package is created with: -

- -
-    doc.New(pkg, importpath, mode)
-
- -

-where the new mode parameter specifies the operation mode: -if set to AllDecls, all declarations -(not just exported ones) are considered. -The function NewFileDoc was removed, and the function -CommentText has become the method -Text of -ast.CommentGroup. -

- -

-In package go/token, the -token.FileSet method Files -(which originally returned a channel of *token.Files) has been replaced -with the iterator Iterate that -accepts a function argument instead. -

- -

-In package go/build, the API -has been nearly completely replaced. -The package still computes Go package information -but it does not run the build: the Cmd and Script -types are gone. -(To build code, use the new -go command instead.) -The DirInfo type is now named -Package. -FindTree and ScanDir are replaced by -Import -and -ImportDir. -

- -

-Updating: -Code that uses packages in go will have to be updated by hand; the -compiler will reject incorrect uses. Templates used in conjunction with any of the -go/doc types may need manual fixes; the renamed fields will lead -to run-time errors. -

- -

The hash package

- -

-In Go 1, the definition of hash.Hash includes -a new method, BlockSize. This new method is used primarily in the -cryptographic libraries. -

- -

-The Sum method of the -hash.Hash interface now takes a -[]byte argument, to which the hash value will be appended. -The previous behavior can be recreated by adding a nil argument to the call. -

- -

-Updating: -Existing implementations of hash.Hash will need to add a -BlockSize method. Hashes that process the input one byte at -a time can implement BlockSize to return 1. -Running go fix will update calls to the Sum methods of the various -implementations of hash.Hash. -

- -

-Updating: -Since the package's functionality is new, no updating is necessary. -

- -

The http package

- -

-In Go 1 the http package is refactored, -putting some of the utilities into a -httputil subdirectory. -These pieces are only rarely needed by HTTP clients. -The affected items are: -

- -
    -
  • ClientConn
  • -
  • DumpRequest
  • -
  • DumpRequestOut
  • -
  • DumpResponse
  • -
  • NewChunkedReader
  • -
  • NewChunkedWriter
  • -
  • NewClientConn
  • -
  • NewProxyClientConn
  • -
  • NewServerConn
  • -
  • NewSingleHostReverseProxy
  • -
  • ReverseProxy
  • -
  • ServerConn
  • -
- -

-The Request.RawURL field has been removed; it was a -historical artifact. -

- -

-The Handle and HandleFunc -functions, and the similarly-named methods of ServeMux, -now panic if an attempt is made to register the same pattern twice. -

- -

-Updating: -Running go fix will update the few programs that are affected except for -uses of RawURL, which must be fixed by hand. -

- -

The image package

- -

-The image package has had a number of -minor changes, rearrangements and renamings. -

- -

-Most of the color handling code has been moved into its own package, -image/color. -For the elements that moved, a symmetry arises; for instance, -each pixel of an -image.RGBA -is a -color.RGBA. -

- -

-The old image/ycbcr package has been folded, with some -renamings, into the -image -and -image/color -packages. -

- -

-The old image.ColorImage type is still in the image -package but has been renamed -image.Uniform, -while image.Tiled has been removed. -

- -

-This table lists the renamings. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OldNew

image.Color color.Color
image.ColorModel color.Model
image.ColorModelFunc color.ModelFunc
image.PalettedColorModel color.Palette

image.RGBAColor color.RGBA
image.RGBA64Color color.RGBA64
image.NRGBAColor color.NRGBA
image.NRGBA64Color color.NRGBA64
image.AlphaColor color.Alpha
image.Alpha16Color color.Alpha16
image.GrayColor color.Gray
image.Gray16Color color.Gray16

image.RGBAColorModel color.RGBAModel
image.RGBA64ColorModel color.RGBA64Model
image.NRGBAColorModel color.NRGBAModel
image.NRGBA64ColorModel color.NRGBA64Model
image.AlphaColorModel color.AlphaModel
image.Alpha16ColorModel color.Alpha16Model
image.GrayColorModel color.GrayModel
image.Gray16ColorModel color.Gray16Model

ycbcr.RGBToYCbCr color.RGBToYCbCr
ycbcr.YCbCrToRGB color.YCbCrToRGB
ycbcr.YCbCrColorModel color.YCbCrModel
ycbcr.YCbCrColor color.YCbCr
ycbcr.YCbCr image.YCbCr

ycbcr.SubsampleRatio444 image.YCbCrSubsampleRatio444
ycbcr.SubsampleRatio422 image.YCbCrSubsampleRatio422
ycbcr.SubsampleRatio420 image.YCbCrSubsampleRatio420

image.ColorImage image.Uniform
- -

-The image package's New functions -(NewRGBA, -NewRGBA64, etc.) -take an image.Rectangle as an argument -instead of four integers. -

- -

-Finally, there are new predefined color.Color variables -color.Black, -color.White, -color.Opaque -and -color.Transparent. -

- -

-Updating: -Running go fix will update almost all code affected by the change. -

- -

The log/syslog package

- -

-In Go 1, the syslog.NewLogger -function returns an error as well as a log.Logger. -

- -

-Updating: -What little code is affected will be caught by the compiler and must be updated by hand. -

- -

The mime package

- -

-In Go 1, the FormatMediaType function -of the mime package has been simplified to make it -consistent with -ParseMediaType. -It now takes "text/html" rather than "text" and "html". -

- -

-Updating: -What little code is affected will be caught by the compiler and must be updated by hand. -

- -

The net package

- -

-In Go 1, the various SetTimeout, -SetReadTimeout, and SetWriteTimeout methods -have been replaced with -SetDeadline, -SetReadDeadline, and -SetWriteDeadline, -respectively. Rather than taking a timeout value in nanoseconds that -apply to any activity on the connection, the new methods set an -absolute deadline (as a time.Time value) after which -reads and writes will time out and no longer block. -

- -

-There are also new functions -net.DialTimeout -to simplify timing out dialing a network address and -net.ListenMulticastUDP -to allow multicast UDP to listen concurrently across multiple listeners. -The net.ListenMulticastUDP function replaces the old -JoinGroup and LeaveGroup methods. -

- -

-Updating: -Code that uses the old methods will fail to compile and must be updated by hand. -The semantic change makes it difficult for the fix tool to update automatically. -

- -

The os package

- -

-The Time function has been removed; callers should use -the Time type from the -time package. -

- -

-The Exec function has been removed; callers should use -Exec from the syscall package, where available. -

- -

-The ShellExpand function has been renamed to ExpandEnv. -

- -

-The NewFile function -now takes a uintptr fd, instead of an int. -The Fd method on files now -also returns a uintptr. -

- -

-There are no longer error constants such as EINVAL -in the os package, since the set of values varied with -the underlying operating system. There are new portable functions like -IsPermission -to test common error properties, plus a few new error values -with more Go-like names, such as -ErrPermission -and -ErrNoEnv. -

- -

-The Getenverror function has been removed. To distinguish -between a non-existent environment variable and an empty string, -use os.Environ or -syscall.Getenv. -

- - -

-The Process.Wait method has -dropped its option argument and the associated constants are gone -from the package. -Also, the function Wait is gone; only the method of -the Process type persists. -

- -

-The Waitmsg type returned by -Process.Wait -has been replaced with a more portable -ProcessState -type with accessor methods to recover information about the -process. -Because of changes to Wait, the ProcessState -value always describes an exited process. -Portability concerns simplified the interface in other ways, but the values returned by the -ProcessState.Sys and -ProcessState.SysUsage -methods can be type-asserted to underlying system-specific data structures such as -syscall.WaitStatus and -syscall.Rusage on Unix. -

- -

-Updating: -Running go fix will drop a zero argument to Process.Wait. -All other changes will be caught by the compiler and must be updated by hand. -

- -

The os.FileInfo type

- -

-Go 1 redefines the os.FileInfo type, -changing it from a struct to an interface: -

- -
-    type FileInfo interface {
-        Name() string       // base name of the file
-        Size() int64        // length in bytes
-        Mode() FileMode     // file mode bits
-        ModTime() time.Time // modification time
-        IsDir() bool        // abbreviation for Mode().IsDir()
-        Sys() interface{}   // underlying data source (can return nil)
-    }
-
- -

-The file mode information has been moved into a subtype called -os.FileMode, -a simple integer type with IsDir, Perm, and String -methods. -

- -

-The system-specific details of file modes and properties such as (on Unix) -i-number have been removed from FileInfo altogether. -Instead, each operating system's os package provides an -implementation of the FileInfo interface, which -has a Sys method that returns the -system-specific representation of file metadata. -For instance, to discover the i-number of a file on a Unix system, unpack -the FileInfo like this: -

- -
-    fi, err := os.Stat("hello.go")
-    if err != nil {
-        log.Fatal(err)
-    }
-    // Check that it's a Unix file.
-    unixStat, ok := fi.Sys().(*syscall.Stat_t)
-    if !ok {
-        log.Fatal("hello.go: not a Unix file")
-    }
-    fmt.Printf("file i-number: %d\n", unixStat.Ino)
-
- -

-Assuming (which is unwise) that "hello.go" is a Unix file, -the i-number expression could be contracted to -

- -
-    fi.Sys().(*syscall.Stat_t).Ino
-
- -

-The vast majority of uses of FileInfo need only the methods -of the standard interface. -

- -

-The os package no longer contains wrappers for the POSIX errors -such as ENOENT. -For the few programs that need to verify particular error conditions, there are -now the boolean functions -IsExist, -IsNotExist -and -IsPermission. -

- -
    f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600)
-    if os.IsExist(err) {
-        log.Printf("%s already exists", name)
-    }
- -

-Updating: -Running go fix will update code that uses the old equivalent of the current os.FileInfo -and os.FileMode API. -Code that needs system-specific file details will need to be updated by hand. -Code that uses the old POSIX error values from the os package -will fail to compile and will also need to be updated by hand. -

- -

The os/signal package

- -

-The os/signal package in Go 1 replaces the -Incoming function, which returned a channel -that received all incoming signals, -with the selective Notify function, which asks -for delivery of specific signals on an existing channel. -

- -

-Updating: -Code must be updated by hand. -A literal translation of -

-
-c := signal.Incoming()
-
-

-is -

-
-c := make(chan os.Signal)
-signal.Notify(c) // ask for all signals
-
-

-but most code should list the specific signals it wants to handle instead: -

-
-c := make(chan os.Signal)
-signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT)
-
- -

The path/filepath package

- -

-In Go 1, the Walk function of the -path/filepath package -has been changed to take a function value of type -WalkFunc -instead of a Visitor interface value. -WalkFunc unifies the handling of both files and directories. -

- -
-    type WalkFunc func(path string, info os.FileInfo, err error) error
-
- -

-The WalkFunc function will be called even for files or directories that could not be opened; -in such cases the error argument will describe the failure. -If a directory's contents are to be skipped, -the function should return the value filepath.SkipDir -

- -
    markFn := func(path string, info os.FileInfo, err error) error {
-        if path == "pictures" { // Will skip walking of directory pictures and its contents.
-            return filepath.SkipDir
-        }
-        if err != nil {
-            return err
-        }
-        log.Println(path)
-        return nil
-    }
-    err := filepath.Walk(".", markFn)
-    if err != nil {
-        log.Fatal(err)
-    }
- -

-Updating: -The change simplifies most code but has subtle consequences, so affected programs -will need to be updated by hand. -The compiler will catch code using the old interface. -

- -

The regexp package

- -

-The regexp package has been rewritten. -It has the same interface but the specification of the regular expressions -it supports has changed from the old "egrep" form to that of -RE2. -

- -

-Updating: -Code that uses the package should have its regular expressions checked by hand. -

- -

The runtime package

- -

-In Go 1, much of the API exported by package -runtime has been removed in favor of -functionality provided by other packages. -Code using the runtime.Type interface -or its specific concrete type implementations should -now use package reflect. -Code using runtime.Semacquire or runtime.Semrelease -should use channels or the abstractions in package sync. -The runtime.Alloc, runtime.Free, -and runtime.Lookup functions, an unsafe API created for -debugging the memory allocator, have no replacement. -

- -

-Before, runtime.MemStats was a global variable holding -statistics about memory allocation, and calls to runtime.UpdateMemStats -ensured that it was up to date. -In Go 1, runtime.MemStats is a struct type, and code should use -runtime.ReadMemStats -to obtain the current statistics. -

- -

-The package adds a new function, -runtime.NumCPU, that returns the number of CPUs available -for parallel execution, as reported by the operating system kernel. -Its value can inform the setting of GOMAXPROCS. -The runtime.Cgocalls and runtime.Goroutines functions -have been renamed to runtime.NumCgoCall and runtime.NumGoroutine. -

- -

-Updating: -Running go fix will update code for the function renamings. -Other code will need to be updated by hand. -

- -

The strconv package

- -

-In Go 1, the -strconv -package has been significantly reworked to make it more Go-like and less C-like, -although Atoi lives on (it's similar to -int(ParseInt(x, 10, 0)), as does -Itoa(x) (FormatInt(int64(x), 10)). -There are also new variants of some of the functions that append to byte slices rather than -return strings, to allow control over allocation. -

- -

-This table summarizes the renamings; see the -package documentation -for full details. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Old callNew call

Atob(x) ParseBool(x)

Atof32(x) ParseFloat(x, 32)§
Atof64(x) ParseFloat(x, 64)
AtofN(x, n) ParseFloat(x, n)

Atoi(x) Atoi(x)
Atoi(x) ParseInt(x, 10, 0)§
Atoi64(x) ParseInt(x, 10, 64)

Atoui(x) ParseUint(x, 10, 0)§
Atoui64(x) ParseUint(x, 10, 64)

Btoi64(x, b) ParseInt(x, b, 64)
Btoui64(x, b) ParseUint(x, b, 64)

Btoa(x) FormatBool(x)

Ftoa32(x, f, p) FormatFloat(float64(x), f, p, 32)
Ftoa64(x, f, p) FormatFloat(x, f, p, 64)
FtoaN(x, f, p, n) FormatFloat(x, f, p, n)

Itoa(x) Itoa(x)
Itoa(x) FormatInt(int64(x), 10)
Itoa64(x) FormatInt(x, 10)

Itob(x, b) FormatInt(int64(x), b)
Itob64(x, b) FormatInt(x, b)

Uitoa(x) FormatUint(uint64(x), 10)
Uitoa64(x) FormatUint(x, 10)

Uitob(x, b) FormatUint(uint64(x), b)
Uitob64(x, b) FormatUint(x, b)
- -

-Updating: -Running go fix will update almost all code affected by the change. -
Atoi persists but Atoui and Atof32 do not, so -they may require -a cast that must be added by hand; the go fix tool will warn about it. -

- - -

The template packages

- -

-The template and exp/template/html packages have moved to -text/template and -html/template. -More significant, the interface to these packages has been simplified. -The template language is the same, but the concept of "template set" is gone -and the functions and methods of the packages have changed accordingly, -often by elimination. -

- -

-Instead of sets, a Template object -may contain multiple named template definitions, -in effect constructing -name spaces for template invocation. -A template can invoke any other template associated with it, but only those -templates associated with it. -The simplest way to associate templates is to parse them together, something -made easier with the new structure of the packages. -

- -

-Updating: -The imports will be updated by fix tool. -Single-template uses will be otherwise be largely unaffected. -Code that uses multiple templates in concert will need to be updated by hand. -The examples in -the documentation for text/template can provide guidance. -

- -

The testing package

- -

-The testing package has a type, B, passed as an argument to benchmark functions. -In Go 1, B has new methods, analogous to those of T, enabling -logging and failure reporting. -

- -
func BenchmarkSprintf(b *testing.B) {
-    // Verify correctness before running benchmark.
-    b.StopTimer()
-    got := fmt.Sprintf("%x", 23)
-    const expect = "17"
-    if expect != got {
-        b.Fatalf("expected %q; got %q", expect, got)
-    }
-    b.StartTimer()
-    for i := 0; i < b.N; i++ {
-        fmt.Sprintf("%x", 23)
-    }
-}
- -

-Updating: -Existing code is unaffected, although benchmarks that use println -or panic should be updated to use the new methods. -

- -

The testing/script package

- -

-The testing/script package has been deleted. It was a dreg. -

- -

-Updating: -No code is likely to be affected. -

- -

The unsafe package

- -

-In Go 1, the functions -unsafe.Typeof, unsafe.Reflect, -unsafe.Unreflect, unsafe.New, and -unsafe.NewArray have been removed; -they duplicated safer functionality provided by -package reflect. -

- -

-Updating: -Code using these functions must be rewritten to use -package reflect. -The changes to encoding/gob and the protocol buffer library -may be helpful as examples. -

- -

The url package

- -

-In Go 1 several fields from the url.URL type -were removed or replaced. -

- -

-The String method now -predictably rebuilds an encoded URL string using all of URL's -fields as necessary. The resulting string will also no longer have -passwords escaped. -

- -

-The Raw field has been removed. In most cases the String -method may be used in its place. -

- -

-The old RawUserinfo field is replaced by the User -field, of type *net.Userinfo. -Values of this type may be created using the new net.User -and net.UserPassword -functions. The EscapeUserinfo and UnescapeUserinfo -functions are also gone. -

- -

-The RawAuthority field has been removed. The same information is -available in the Host and User fields. -

- -

-The RawPath field and the EncodedPath method have -been removed. The path information in rooted URLs (with a slash following the -schema) is now available only in decoded form in the Path field. -Occasionally, the encoded data may be required to obtain information that -was lost in the decoding process. These cases must be handled by accessing -the data the URL was built from. -

- -

-URLs with non-rooted paths, such as "mailto:dev@golang.org?subject=Hi", -are also handled differently. The OpaquePath boolean field has been -removed and a new Opaque string field introduced to hold the encoded -path for such URLs. In Go 1, the cited URL parses as: -

- -
-    URL{
-        Scheme: "mailto",
-        Opaque: "dev@golang.org",
-        RawQuery: "subject=Hi",
-    }
-
- -

-A new RequestURI method was -added to URL. -

- -

-The ParseWithReference function has been renamed to ParseWithFragment. -

- -

-Updating: -Code that uses the old fields will fail to compile and must be updated by hand. -The semantic changes make it difficult for the fix tool to update automatically. -

- -

The go command

- -

-Go 1 introduces the go command, a tool for fetching, -building, and installing Go packages and commands. The go command -does away with makefiles, instead using Go source code to find dependencies and -determine build conditions. Most existing Go programs will no longer require -makefiles to be built. -

- -

-See How to Write Go Code for a primer on the -go command and the go command documentation -for the full details. -

- -

-Updating: -Projects that depend on the Go project's old makefile-based build -infrastructure (Make.pkg, Make.cmd, and so on) should -switch to using the go command for building Go code and, if -necessary, rewrite their makefiles to perform any auxiliary build tasks. -

- -

The cgo command

- -

-In Go 1, the cgo command -uses a different _cgo_export.h -file, which is generated for packages containing //export lines. -The _cgo_export.h file now begins with the C preamble comment, -so that exported function definitions can use types defined there. -This has the effect of compiling the preamble multiple times, so a -package using //export must not put function definitions -or variable initializations in the C preamble. -

- -

Packaged releases

- -

-One of the most significant changes associated with Go 1 is the availability -of prepackaged, downloadable distributions. -They are available for many combinations of architecture and operating system -(including Windows) and the list will grow. -Installation details are described on the -Getting Started page, while -the distributions themselves are listed on the -downloads page. - - -

- - - - - - - - diff --git a/vendor/golang.org/x/net/html/testdata/webkit/README b/vendor/golang.org/x/net/html/testdata/webkit/README deleted file mode 100644 index 9b4c2d8be..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/README +++ /dev/null @@ -1,28 +0,0 @@ -The *.dat files in this directory are copied from The WebKit Open Source -Project, specifically $WEBKITROOT/LayoutTests/html5lib/resources. -WebKit is licensed under a BSD style license. -http://webkit.org/coding/bsd-license.html says: - -Copyright (C) 2009 Apple Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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 APPLE INC. AND ITS 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 APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/golang.org/x/net/html/testdata/webkit/adoption01.dat b/vendor/golang.org/x/net/html/testdata/webkit/adoption01.dat deleted file mode 100644 index 787e1b01e..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/adoption01.dat +++ /dev/null @@ -1,194 +0,0 @@ -#data -

-#errors -#document -| -| -| -| -|

-| - -#data -1

23

-#errors -#document -| -| -| -| -| "1" -|

-| -| "2" -| "3" - -#data -1 -#errors -#document -| -| -| -| -| "1" -|

-#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end tag (strong) in table context caused voodoo mode. -Line: 1 Col: 20 End tag (strong) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 24 Unexpected end tag (b) in table context caused voodoo mode. -Line: 1 Col: 24 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 29 Unexpected end tag (em) in table context caused voodoo mode. -Line: 1 Col: 29 End tag (em) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 33 Unexpected end tag (i) in table context caused voodoo mode. -Line: 1 Col: 33 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 37 Unexpected end tag (u) in table context caused voodoo mode. -Line: 1 Col: 37 End tag (u) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 46 Unexpected end tag (strike) in table context caused voodoo mode. -Line: 1 Col: 46 End tag (strike) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 50 Unexpected end tag (s) in table context caused voodoo mode. -Line: 1 Col: 50 End tag (s) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 58 Unexpected end tag (blink) in table context caused voodoo mode. -Line: 1 Col: 58 Unexpected end tag (blink). Ignored. -Line: 1 Col: 63 Unexpected end tag (tt) in table context caused voodoo mode. -Line: 1 Col: 63 End tag (tt) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 69 Unexpected end tag (pre) in table context caused voodoo mode. -Line: 1 Col: 69 End tag (pre) seen too early. Expected other end tag. -Line: 1 Col: 75 Unexpected end tag (big) in table context caused voodoo mode. -Line: 1 Col: 75 End tag (big) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 83 Unexpected end tag (small) in table context caused voodoo mode. -Line: 1 Col: 83 End tag (small) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 90 Unexpected end tag (font) in table context caused voodoo mode. -Line: 1 Col: 90 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 99 Unexpected end tag (select) in table context caused voodoo mode. -Line: 1 Col: 99 Unexpected end tag (select). Ignored. -Line: 1 Col: 104 Unexpected end tag (h1) in table context caused voodoo mode. -Line: 1 Col: 104 End tag (h1) seen too early. Expected other end tag. -Line: 1 Col: 109 Unexpected end tag (h2) in table context caused voodoo mode. -Line: 1 Col: 109 End tag (h2) seen too early. Expected other end tag. -Line: 1 Col: 114 Unexpected end tag (h3) in table context caused voodoo mode. -Line: 1 Col: 114 End tag (h3) seen too early. Expected other end tag. -Line: 1 Col: 119 Unexpected end tag (h4) in table context caused voodoo mode. -Line: 1 Col: 119 End tag (h4) seen too early. Expected other end tag. -Line: 1 Col: 124 Unexpected end tag (h5) in table context caused voodoo mode. -Line: 1 Col: 124 End tag (h5) seen too early. Expected other end tag. -Line: 1 Col: 129 Unexpected end tag (h6) in table context caused voodoo mode. -Line: 1 Col: 129 End tag (h6) seen too early. Expected other end tag. -Line: 1 Col: 136 Unexpected end tag (body) in the table row phase. Ignored. -Line: 1 Col: 141 Unexpected end tag (br) in table context caused voodoo mode. -Line: 1 Col: 141 Unexpected end tag (br). Treated as br element. -Line: 1 Col: 145 Unexpected end tag (a) in table context caused voodoo mode. -Line: 1 Col: 145 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 151 Unexpected end tag (img) in table context caused voodoo mode. -Line: 1 Col: 151 This element (img) has no end tag. -Line: 1 Col: 159 Unexpected end tag (title) in table context caused voodoo mode. -Line: 1 Col: 159 Unexpected end tag (title). Ignored. -Line: 1 Col: 166 Unexpected end tag (span) in table context caused voodoo mode. -Line: 1 Col: 166 Unexpected end tag (span). Ignored. -Line: 1 Col: 174 Unexpected end tag (style) in table context caused voodoo mode. -Line: 1 Col: 174 Unexpected end tag (style). Ignored. -Line: 1 Col: 183 Unexpected end tag (script) in table context caused voodoo mode. -Line: 1 Col: 183 Unexpected end tag (script). Ignored. -Line: 1 Col: 196 Unexpected end tag (th). Ignored. -Line: 1 Col: 201 Unexpected end tag (td). Ignored. -Line: 1 Col: 206 Unexpected end tag (tr). Ignored. -Line: 1 Col: 214 This element (frame) has no end tag. -Line: 1 Col: 221 This element (area) has no end tag. -Line: 1 Col: 228 Unexpected end tag (link). Ignored. -Line: 1 Col: 236 This element (param) has no end tag. -Line: 1 Col: 241 This element (hr) has no end tag. -Line: 1 Col: 249 This element (input) has no end tag. -Line: 1 Col: 255 Unexpected end tag (col). Ignored. -Line: 1 Col: 262 Unexpected end tag (base). Ignored. -Line: 1 Col: 269 Unexpected end tag (meta). Ignored. -Line: 1 Col: 280 This element (basefont) has no end tag. -Line: 1 Col: 290 This element (bgsound) has no end tag. -Line: 1 Col: 298 This element (embed) has no end tag. -Line: 1 Col: 307 This element (spacer) has no end tag. -Line: 1 Col: 311 Unexpected end tag (p). Ignored. -Line: 1 Col: 316 End tag (dd) seen too early. Expected other end tag. -Line: 1 Col: 321 End tag (dt) seen too early. Expected other end tag. -Line: 1 Col: 331 Unexpected end tag (caption). Ignored. -Line: 1 Col: 342 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 350 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 358 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 366 Unexpected end tag (thead). Ignored. -Line: 1 Col: 376 End tag (address) seen too early. Expected other end tag. -Line: 1 Col: 389 End tag (blockquote) seen too early. Expected other end tag. -Line: 1 Col: 398 End tag (center) seen too early. Expected other end tag. -Line: 1 Col: 404 Unexpected end tag (dir). Ignored. -Line: 1 Col: 410 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 415 End tag (dl) seen too early. Expected other end tag. -Line: 1 Col: 426 End tag (fieldset) seen too early. Expected other end tag. -Line: 1 Col: 436 End tag (listing) seen too early. Expected other end tag. -Line: 1 Col: 443 End tag (menu) seen too early. Expected other end tag. -Line: 1 Col: 448 End tag (ol) seen too early. Expected other end tag. -Line: 1 Col: 453 End tag (ul) seen too early. Expected other end tag. -Line: 1 Col: 458 End tag (li) seen too early. Expected other end tag. -Line: 1 Col: 465 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 471 This element (wbr) has no end tag. -Line: 1 Col: 487 End tag (button) seen too early. Expected other end tag. -Line: 1 Col: 497 End tag (marquee) seen too early. Expected other end tag. -Line: 1 Col: 506 End tag (object) seen too early. Expected other end tag. -Line: 1 Col: 524 Unexpected end tag (html). Ignored. -Line: 1 Col: 524 Unexpected end tag (frameset). Ignored. -Line: 1 Col: 531 Unexpected end tag (head). Ignored. -Line: 1 Col: 540 Unexpected end tag (iframe). Ignored. -Line: 1 Col: 548 This element (image) has no end tag. -Line: 1 Col: 558 This element (isindex) has no end tag. -Line: 1 Col: 568 Unexpected end tag (noembed). Ignored. -Line: 1 Col: 579 Unexpected end tag (noframes). Ignored. -Line: 1 Col: 590 Unexpected end tag (noscript). Ignored. -Line: 1 Col: 601 Unexpected end tag (optgroup). Ignored. -Line: 1 Col: 610 Unexpected end tag (option). Ignored. -Line: 1 Col: 622 Unexpected end tag (plaintext). Ignored. -Line: 1 Col: 633 Unexpected end tag (textarea). Ignored. -#document -| -| -| -|
-| -| -| -|

- -#data - -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 1 Col: 10 Expected closing tag. Unexpected end of file. -#document -| -| -| diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat deleted file mode 100644 index 4f8df86f2..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat +++ /dev/null @@ -1,799 +0,0 @@ -#data - -#errors -#document -| -| -| -| -| - -#data -a -#errors -29: Bogus comment -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| - -#data - -#errors -35: Stray “svg” start tag. -42: Stray end tag “svg” -#document -| -| -| -| -| -#errors -43: Stray “svg” start tag. -50: Stray end tag “svg” -#document -| -| -| -| -|

-#errors -34: Start tag “svg” seen in “table”. -41: Stray end tag “svg”. -#document -| -| -| -| -| -| - -#data -
foo
-#errors -34: Start tag “svg” seen in “table”. -46: Stray end tag “g”. -53: Stray end tag “svg”. -#document -| -| -| -| -| -| -| "foo" -| - -#data -
foobar
-#errors -34: Start tag “svg” seen in “table”. -46: Stray end tag “g”. -58: Stray end tag “g”. -65: Stray end tag “svg”. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -| - -#data -
foobar
-#errors -41: Start tag “svg” seen in “table”. -53: Stray end tag “g”. -65: Stray end tag “g”. -72: Stray end tag “svg”. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -| -| - -#data -
foobar
-#errors -45: Start tag “svg” seen in “table”. -57: Stray end tag “g”. -69: Stray end tag “g”. -76: Stray end tag “svg”. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -| -| -| - -#data -
foobar
-#errors -#document -| -| -| -| -| -| -| -|
-| -| -| "foo" -| -| "bar" - -#data -
foobar

baz

-#errors -#document -| -| -| -| -| -| -| -|
-| -| -| "foo" -| -| "bar" -|

-| "baz" - -#data -
foobar

baz

-#errors -#document -| -| -| -| -| -|
-| -| -| "foo" -| -| "bar" -|

-| "baz" - -#data -
foobar

baz

quux -#errors -70: HTML start tag “p” in a foreign namespace context. -81: “table” closed but “caption” was still open. -#document -| -| -| -| -| -|
-| -| -| "foo" -| -| "bar" -|

-| "baz" -|

-| "quux" - -#data -
foobarbaz

quux -#errors -78: “table” closed but “caption” was still open. -78: Unclosed elements on stack. -#document -| -| -| -| -| -|
-| -| -| "foo" -| -| "bar" -| "baz" -|

-| "quux" - -#data -foobar

baz

quux -#errors -44: Start tag “svg” seen in “table”. -56: Stray end tag “g”. -68: Stray end tag “g”. -71: HTML start tag “p” in a foreign namespace context. -71: Start tag “p” seen in “table”. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -|

-| "baz" -| -| -|

-| "quux" - -#data -

quux -#errors -50: Stray “svg” start tag. -54: Stray “g” start tag. -62: Stray end tag “g” -66: Stray “g” start tag. -74: Stray end tag “g” -77: Stray “p” start tag. -88: “table” end tag with “select” open. -#document -| -| -| -| -| -| -| -|
-|

quux -#errors -36: Start tag “select” seen in “table”. -42: Stray “svg” start tag. -46: Stray “g” start tag. -54: Stray end tag “g” -58: Stray “g” start tag. -66: Stray end tag “g” -69: Stray “p” start tag. -80: “table” end tag with “select” open. -#document -| -| -| -| -| -|

-| "quux" - -#data -foobar

baz -#errors -41: Stray “svg” start tag. -68: HTML start tag “p” in a foreign namespace context. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -|

-| "baz" - -#data -foobar

baz -#errors -34: Stray “svg” start tag. -61: HTML start tag “p” in a foreign namespace context. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -|

-| "baz" - -#data -

-#errors -31: Stray “svg” start tag. -35: Stray “g” start tag. -40: Stray end tag “g” -44: Stray “g” start tag. -49: Stray end tag “g” -52: Stray “p” start tag. -58: Stray “span” start tag. -58: End of file seen and there were open elements. -#document -| -| -| -| - -#data -

-#errors -42: Stray “svg” start tag. -46: Stray “g” start tag. -51: Stray end tag “g” -55: Stray “g” start tag. -60: Stray end tag “g” -63: Stray “p” start tag. -69: Stray “span” start tag. -#document -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| xlink:href="foo" -| -| xlink href="foo" - -#data - -#errors -#document -| -| -| -| -| xlink:href="foo" -| xml:lang="en" -| -| -| xlink href="foo" -| xml lang="en" - -#data - -#errors -#document -| -| -| -| -| xlink:href="foo" -| xml:lang="en" -| -| -| xlink href="foo" -| xml lang="en" - -#data -bar -#errors -#document -| -| -| -| -| xlink:href="foo" -| xml:lang="en" -| -| -| xlink href="foo" -| xml lang="en" -| "bar" - -#data - -#errors -#document -| -| -| -| - -#data -

a -#errors -#document -| -| -| -|
-| -| "a" - -#data -
a -#errors -#document -| -| -| -|
-| -| -| "a" - -#data -
-#errors -#document -| -| -| -|
-| -| -| - -#data -
a -#errors -#document -| -| -| -|
-| -| -| -| -| "a" - -#data -

a -#errors -#document -| -| -| -|

-| -| -| -|

-| "a" - -#data -
    a -#errors -40: HTML start tag “ul” in a foreign namespace context. -41: End of file in a foreign namespace context. -#document -| -| -| -| -| -| -|
    -| -|
      -| "a" - -#data -
        a -#errors -35: HTML start tag “ul” in a foreign namespace context. -36: End of file in a foreign namespace context. -#document -| -| -| -| -| -| -| -|
          -| "a" - -#data -

          -#errors -#document -| -| -| -| -|

          -| -| -|

          - -#data -

          -#errors -#document -| -| -| -| -|

          -| -| -|

          - -#data -

          -#errors -#document -| -| -| -|

          -| -| -| -|

          -|

          - -#data -
          -#errors -#document -| -| -| -| -| -|
          -| -|
          -| -| - -#data -
          -#errors -#document -| -| -| -| -| -| -| -|
          -|
          -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data -

-#errors -#document -| -| -| -| -|
-| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| -| - -#data -
-#errors -#document -| -| -| -| -| -| -| -|
-| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| -| -| -| -| -| -| -| -| diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat deleted file mode 100644 index 638cde479..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat +++ /dev/null @@ -1,482 +0,0 @@ -#data - -#errors -#document -| -| -| -| -| -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data - -#errors -#document -| -| -| -| -| -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data - -#errors -#document -| -| -| -| -| -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data - -#errors -#document -| -| -| -| -| -| attributename="" -| attributetype="" -| basefrequency="" -| baseprofile="" -| calcmode="" -| clippathunits="" -| contentscripttype="" -| contentstyletype="" -| diffuseconstant="" -| edgemode="" -| externalresourcesrequired="" -| filterres="" -| filterunits="" -| glyphref="" -| gradienttransform="" -| gradientunits="" -| kernelmatrix="" -| kernelunitlength="" -| keypoints="" -| keysplines="" -| keytimes="" -| lengthadjust="" -| limitingconeangle="" -| markerheight="" -| markerunits="" -| markerwidth="" -| maskcontentunits="" -| maskunits="" -| numoctaves="" -| pathlength="" -| patterncontentunits="" -| patterntransform="" -| patternunits="" -| pointsatx="" -| pointsaty="" -| pointsatz="" -| preservealpha="" -| preserveaspectratio="" -| primitiveunits="" -| refx="" -| refy="" -| repeatcount="" -| repeatdur="" -| requiredextensions="" -| requiredfeatures="" -| specularconstant="" -| specularexponent="" -| spreadmethod="" -| startoffset="" -| stddeviation="" -| stitchtiles="" -| surfacescale="" -| systemlanguage="" -| tablevalues="" -| targetx="" -| targety="" -| textlength="" -| viewbox="" -| viewtarget="" -| xchannelselector="" -| ychannelselector="" -| zoomandpan="" - -#data - -#errors -#document -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat deleted file mode 100644 index 63107d277..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat +++ /dev/null @@ -1,62 +0,0 @@ -#data -

foobazeggs

spam

quuxbar -#errors -#document -| -| -| -| -|

-| "foo" -| -| -| -| "baz" -| -| -| -| -| "eggs" -| -| -|

-| "spam" -| -| -| -|
-| -| -| "quux" -| "bar" - -#data -foobazeggs

spam
quuxbar -#errors -#document -| -| -| -| -| "foo" -| -| -| -| "baz" -| -| -| -| -| "eggs" -| -| -|

-| "spam" -| -| -| -|
-| -| -| "quux" -| "bar" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat deleted file mode 100644 index b8713f885..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat +++ /dev/null @@ -1,74 +0,0 @@ -#data - -#errors -#document -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -15: Unexpected start tag html -#document -| -| -| abc:def="gh" -| -| -| - -#data - -#errors -15: Unexpected start tag html -#document -| -| -| xml:lang="bar" -| -| - -#data - -#errors -#document -| -| -| 123="456" -| -| - -#data - -#errors -#document -| -| -| 123="456" -| 789="012" -| -| - -#data - -#errors -#document -| -| -| -| -| 789="012" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat deleted file mode 100644 index 6ce1c0d16..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat +++ /dev/null @@ -1,208 +0,0 @@ -#data -

X -#errors -Line: 1 Col: 31 Unexpected end tag (p). Ignored. -Line: 1 Col: 36 Expected closing tag. Unexpected end of file. -#document -| -| -| -| -|

-| -| -| -| -| -| -| " " -|

-| "X" - -#data -

-

X -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end tag (p). Ignored. -Line: 2 Col: 4 Expected closing tag. Unexpected end of file. -#document -| -| -| -|

-| -| -| -| -| -| -| " -" -|

-| "X" - -#data - -#errors -Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element. -#document -| -| -| -| -| " " - -#data - -#errors -Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. -#document -| -| -| -| -| - -#data - -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element. -#document -| -| -| -| - -#data -X -#errors -Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. -#document -| -| -| -| -| -| "X" - -#data -<!doctype html><table> X<meta></table> -#errors -Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " X" -| <meta> -| <table> - -#data -<!doctype html><table> x</table> -#errors -Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x" -| <table> - -#data -<!doctype html><table> x </table> -#errors -Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x " -| <table> - -#data -<!doctype html><table><tr> x</table> -#errors -Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table>X<style> <tr>x </style> </table> -#errors -Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <table> -| <style> -| " <tr>x " -| " " - -#data -<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> -#errors -Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| <a> -| "foo" -| <table> -| " " -| <tbody> -| <tr> -| <td> -| "bar" -| " " - -#data -<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> -#errors -6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. -13: Stray start tag “frame”. -21: Stray end tag “frame”. -29: Stray end tag “frame”. -39: “frameset” start tag after “body” already open. -105: End of file seen inside an [R]CDATA element. -105: End of file seen and there were open elements. -XXX: These errors are wrong, please fix me! -#document -| <html> -| <head> -| <frameset> -| <frame> -| <frameset> -| <frame> -| <noframes> -| "</frameset><noframes>" - -#data -<!DOCTYPE html><object></html> -#errors -1: Expected closing tag. Unexpected end of file -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <object> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat deleted file mode 100644 index c8ef66f0e..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat +++ /dev/null @@ -1,2299 +0,0 @@ -#data -<!doctype html><script> -#errors -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script>a -#errors -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "a" -| <body> - -#data -<!doctype html><script>< -#errors -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<" -| <body> - -#data -<!doctype html><script></ -#errors -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</" -| <body> - -#data -<!doctype html><script></S -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</S" -| <body> - -#data -<!doctype html><script></SC -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SC" -| <body> - -#data -<!doctype html><script></SCR -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCR" -| <body> - -#data -<!doctype html><script></SCRI -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRI" -| <body> - -#data -<!doctype html><script></SCRIP -#errors -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRIP" -| <body> - -#data -<!doctype html><script></SCRIPT -#errors -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRIPT" -| <body> - -#data -<!doctype html><script></SCRIPT -#errors -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script></s -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</s" -| <body> - -#data -<!doctype html><script></sc -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</sc" -| <body> - -#data -<!doctype html><script></scr -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scr" -| <body> - -#data -<!doctype html><script></scri -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scri" -| <body> - -#data -<!doctype html><script></scrip -#errors -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scrip" -| <body> - -#data -<!doctype html><script></script -#errors -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</script" -| <body> - -#data -<!doctype html><script></script -#errors -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script><! -#errors -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!" -| <body> - -#data -<!doctype html><script><!a -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!a" -| <body> - -#data -<!doctype html><script><!- -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!-" -| <body> - -#data -<!doctype html><script><!-a -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!-a" -| <body> - -#data -<!doctype html><script><!-- -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<!doctype html><script><!--a -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--a" -| <body> - -#data -<!doctype html><script><!--< -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<" -| <body> - -#data -<!doctype html><script><!--<a -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<a" -| <body> - -#data -<!doctype html><script><!--</ -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--</" -| <body> - -#data -<!doctype html><script><!--</script -#errors -Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--</script" -| <body> - -#data -<!doctype html><script><!--</script -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<!doctype html><script><!--<s -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<s" -| <body> - -#data -<!doctype html><script><!--<script -#errors -Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script" -| <body> - -#data -<!doctype html><script><!--<script -#errors -Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script " -| <body> - -#data -<!doctype html><script><!--<script < -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script <" -| <body> - -#data -<!doctype html><script><!--<script <a -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script <a" -| <body> - -#data -<!doctype html><script><!--<script </ -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </" -| <body> - -#data -<!doctype html><script><!--<script </s -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </s" -| <body> - -#data -<!doctype html><script><!--<script </script -#errors -Line: 1 Col: 43 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script" -| <body> - -#data -<!doctype html><script><!--<script </scripta -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </scripta" -| <body> - -#data -<!doctype html><script><!--<script </script -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script> -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script>" -| <body> - -#data -<!doctype html><script><!--<script </script/ -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script/" -| <body> - -#data -<!doctype html><script><!--<script </script < -#errors -Line: 1 Col: 45 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script <" -| <body> - -#data -<!doctype html><script><!--<script </script <a -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script <a" -| <body> - -#data -<!doctype html><script><!--<script </script </ -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script </" -| <body> - -#data -<!doctype html><script><!--<script </script </script -#errors -Line: 1 Col: 52 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script </script" -| <body> - -#data -<!doctype html><script><!--<script </script </script -#errors -Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script </script/ -#errors -Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script </script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script - -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -" -| <body> - -#data -<!doctype html><script><!--<script -a -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -a" -| <body> - -#data -<!doctype html><script><!--<script -< -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -<" -| <body> - -#data -<!doctype html><script><!--<script -- -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --" -| <body> - -#data -<!doctype html><script><!--<script --a -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --a" -| <body> - -#data -<!doctype html><script><!--<script --< -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --<" -| <body> - -#data -<!doctype html><script><!--<script --> -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script -->< -#errors -Line: 1 Col: 39 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --><" -| <body> - -#data -<!doctype html><script><!--<script --></ -#errors -Line: 1 Col: 40 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --></" -| <body> - -#data -<!doctype html><script><!--<script --></script -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --></script" -| <body> - -#data -<!doctype html><script><!--<script --></script -#errors -Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script --></script/ -#errors -Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script --></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script><\/script>--></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script><\/script>-->" -| <body> - -#data -<!doctype html><script><!--<script></scr'+'ipt>--></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt>-->" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>--><!--</script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>--><!--" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>-- ></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>-- >" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>- -></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- ->" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>- - ></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- - >" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>-></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>->" -| <body> - -#data -<!doctype html><script><!--<script>--!></script>X -#errors -Line: 1 Col: 49 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script>--!></script>X" -| <body> - -#data -<!doctype html><script><!--<scr'+'ipt></script>--></script> -#errors -Line: 1 Col: 59 Unexpected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<scr'+'ipt>" -| <body> -| "-->" - -#data -<!doctype html><script><!--<script></scr'+'ipt></script>X -#errors -Line: 1 Col: 57 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt></script>X" -| <body> - -#data -<!doctype html><style><!--<style></style>--></style> -#errors -Line: 1 Col: 52 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--<style>" -| <body> -| "-->" - -#data -<!doctype html><style><!--</style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "X" - -#data -<!doctype html><style><!--...</style>...--></style> -#errors -Line: 1 Col: 51 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--..." -| <body> -| "...-->" - -#data -<!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" -| <body> -| "X" - -#data -<!doctype html><style><!--...<style><!--...--!></style>--></style> -#errors -Line: 1 Col: 66 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--...<style><!--...--!>" -| <body> -| "-->" - -#data -<!doctype html><style><!--...</style><!-- --><style>@import ...</style> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--..." -| <!-- --> -| <style> -| "@import ..." -| <body> - -#data -<!doctype html><style>...<style><!--...</style><!-- --></style> -#errors -Line: 1 Col: 63 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "...<style><!--..." -| <!-- --> -| <body> - -#data -<!doctype html><style>...<!--[if IE]><style>...</style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "...<!--[if IE]><style>..." -| <body> -| "X" - -#data -<!doctype html><title><!--<title>--> -#errors -Line: 1 Col: 52 Unexpected end tag (title). -#document -| -| -| -| -| "<!--<title>" -| <body> -| "-->" - -#data -<!doctype html><title></title> -#errors -#document -| -| -| -| -| "" -| - -#data -foo/title><link></head><body>X -#errors -Line: 1 Col: 52 Unexpected end of file. Expected end tag (title). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "foo/title><link></head><body>X" -| <body> - -#data -<!doctype html><noscript><!--<noscript></noscript>--></noscript> -#errors -Line: 1 Col: 64 Unexpected end tag (noscript). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<!--<noscript>" -| <body> -| "-->" - -#data -<!doctype html><noscript><!--</noscript>X<noscript>--></noscript> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<!--" -| <body> -| "X" -| <noscript> -| "-->" - -#data -<!doctype html><noscript><iframe></noscript>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<iframe>" -| <body> -| "X" - -#data -<!doctype html><noframes><!--<noframes></noframes>--></noframes> -#errors -Line: 1 Col: 64 Unexpected end tag (noframes). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noframes> -| "<!--<noframes>" -| <body> -| "-->" - -#data -<!doctype html><noframes><body><script><!--...</script></body></noframes></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noframes> -| "<body><script><!--...</script></body>" -| <body> - -#data -<!doctype html><textarea><!--<textarea></textarea>--></textarea> -#errors -Line: 1 Col: 64 Unexpected end tag (textarea). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "<!--<textarea>" -| "-->" - -#data -<!doctype html><textarea></textarea></textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "</textarea>" - -#data -<!doctype html><textarea><</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "<" - -#data -<!doctype html><textarea>a<b</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "a<b" - -#data -<!doctype html><iframe><!--<iframe></iframe>--></iframe> -#errors -Line: 1 Col: 56 Unexpected end tag (iframe). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> -| "<!--<iframe>" -| "-->" - -#data -<!doctype html><iframe>...<!--X->...<!--/X->...</iframe> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> -| "...<!--X->...<!--/X->..." - -#data -<!doctype html><xmp><!--<xmp></xmp>--></xmp> -#errors -Line: 1 Col: 44 Unexpected end tag (xmp). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xmp> -| "<!--<xmp>" -| "-->" - -#data -<!doctype html><noembed><!--<noembed></noembed>--></noembed> -#errors -Line: 1 Col: 60 Unexpected end tag (noembed). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <noembed> -| "<!--<noembed>" -| "-->" - -#data -<script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 8 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script>a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "a" -| <body> - -#data -<script>< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<" -| <body> - -#data -<script></ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</" -| <body> - -#data -<script></S -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</S" -| <body> - -#data -<script></SC -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SC" -| <body> - -#data -<script></SCR -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCR" -| <body> - -#data -<script></SCRI -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRI" -| <body> - -#data -<script></SCRIP -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRIP" -| <body> - -#data -<script></SCRIPT -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRIPT" -| <body> - -#data -<script></SCRIPT -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script></s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</s" -| <body> - -#data -<script></sc -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</sc" -| <body> - -#data -<script></scr -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scr" -| <body> - -#data -<script></scri -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scri" -| <body> - -#data -<script></scrip -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scrip" -| <body> - -#data -<script></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</script" -| <body> - -#data -<script></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script><! -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!" -| <body> - -#data -<script><!a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!a" -| <body> - -#data -<script><!- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!-" -| <body> - -#data -<script><!-a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!-a" -| <body> - -#data -<script><!-- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<script><!--a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--a" -| <body> - -#data -<script><!--< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<" -| <body> - -#data -<script><!--<a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<a" -| <body> - -#data -<script><!--</ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--</" -| <body> - -#data -<script><!--</script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--</script" -| <body> - -#data -<script><!--</script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<script><!--<s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<s" -| <body> - -#data -<script><!--<script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script" -| <body> - -#data -<script><!--<script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script " -| <body> - -#data -<script><!--<script < -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script <" -| <body> - -#data -<script><!--<script <a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script <a" -| <body> - -#data -<script><!--<script </ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </" -| <body> - -#data -<script><!--<script </s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </s" -| <body> - -#data -<script><!--<script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script" -| <body> - -#data -<script><!--<script </scripta -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </scripta" -| <body> - -#data -<script><!--<script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script>" -| <body> - -#data -<script><!--<script </script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script/" -| <body> - -#data -<script><!--<script </script < -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script <" -| <body> - -#data -<script><!--<script </script <a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script <a" -| <body> - -#data -<script><!--<script </script </ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script </" -| <body> - -#data -<script><!--<script </script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script </script" -| <body> - -#data -<script><!--<script </script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script </script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script </script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script - -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -" -| <body> - -#data -<script><!--<script -a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -a" -| <body> - -#data -<script><!--<script -- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --" -| <body> - -#data -<script><!--<script --a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --a" -| <body> - -#data -<script><!--<script --> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script -->< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --><" -| <body> - -#data -<script><!--<script --></ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --></" -| <body> - -#data -<script><!--<script --></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --></script" -| <body> - -#data -<script><!--<script --></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script --></script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script --></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script><\/script>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script><\/script>-->" -| <body> - -#data -<script><!--<script></scr'+'ipt>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt>-->" -| <body> - -#data -<script><!--<script></script><script></script></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>" -| <body> - -#data -<script><!--<script></script><script></script>--><!--</script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>--><!--" -| <body> - -#data -<script><!--<script></script><script></script>-- ></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>-- >" -| <body> - -#data -<script><!--<script></script><script></script>- -></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- ->" -| <body> - -#data -<script><!--<script></script><script></script>- - ></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- - >" -| <body> - -#data -<script><!--<script></script><script></script>-></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>->" -| <body> - -#data -<script><!--<script>--!></script>X -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script>--!></script>X" -| <body> - -#data -<script><!--<scr'+'ipt></script>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 44 Unexpected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<scr'+'ipt>" -| <body> -| "-->" - -#data -<script><!--<script></scr'+'ipt></script>X -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 42 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt></script>X" -| <body> - -#data -<style><!--<style></style>--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--<style>" -| <body> -| "-->" - -#data -<style><!--</style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "X" - -#data -<style><!--...</style>...--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 36 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--..." -| <body> -| "...-->" - -#data -<style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" -| <body> -| "X" - -#data -<style><!--...<style><!--...--!></style>--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 51 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--...<style><!--...--!>" -| <body> -| "-->" - -#data -<style><!--...</style><!-- --><style>@import ...</style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--..." -| <!-- --> -| <style> -| "@import ..." -| <body> - -#data -<style>...<style><!--...</style><!-- --></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 48 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "...<style><!--..." -| <!-- --> -| <body> - -#data -<style>...<!--[if IE]><style>...</style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "...<!--[if IE]><style>..." -| <body> -| "X" - -#data -<title><!--<title>--> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end tag (title). -#document -| -| -| -| "<!--<title>" -| <body> -| "-->" - -#data -<title></title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| -| -| -| "" -| - -#data -foo/title><link></head><body>X -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end of file. Expected end tag (title). -#document -| <html> -| <head> -| <title> -| "foo/title><link></head><body>X" -| <body> - -#data -<noscript><!--<noscript></noscript>--></noscript> -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (noscript). -#document -| <html> -| <head> -| <noscript> -| "<!--<noscript>" -| <body> -| "-->" - -#data -<noscript><!--</noscript>X<noscript>--></noscript> -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -#document -| <html> -| <head> -| <noscript> -| "<!--" -| <body> -| "X" -| <noscript> -| "-->" - -#data -<noscript><iframe></noscript>X -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -#document -| <html> -| <head> -| <noscript> -| "<iframe>" -| <body> -| "X" - -#data -<noframes><!--<noframes></noframes>--></noframes> -#errors -Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (noframes). -#document -| <html> -| <head> -| <noframes> -| "<!--<noframes>" -| <body> -| "-->" - -#data -<noframes><body><script><!--...</script></body></noframes></html> -#errors -Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. -#document -| <html> -| <head> -| <noframes> -| "<body><script><!--...</script></body>" -| <body> - -#data -<textarea><!--<textarea></textarea>--></textarea> -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (textarea). -#document -| <html> -| <head> -| <body> -| <textarea> -| "<!--<textarea>" -| "-->" - -#data -<textarea></textarea></textarea> -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <textarea> -| "</textarea>" - -#data -<iframe><!--<iframe></iframe>--></iframe> -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -Line: 1 Col: 41 Unexpected end tag (iframe). -#document -| <html> -| <head> -| <body> -| <iframe> -| "<!--<iframe>" -| "-->" - -#data -<iframe>...<!--X->...<!--/X->...</iframe> -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <iframe> -| "...<!--X->...<!--/X->..." - -#data -<xmp><!--<xmp></xmp>--></xmp> -#errors -Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end tag (xmp). -#document -| <html> -| <head> -| <body> -| <xmp> -| "<!--<xmp>" -| "-->" - -#data -<noembed><!--<noembed></noembed>--></noembed> -#errors -Line: 1 Col: 9 Unexpected start tag (noembed). Expected DOCTYPE. -Line: 1 Col: 45 Unexpected end tag (noembed). -#document -| <html> -| <head> -| <body> -| <noembed> -| "<!--<noembed>" -| "-->" - -#data -<!doctype html><table> - -#errors -Line 2 Col 0 Unexpected end of file. Expected table content. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " -" - -#data -<!doctype html><table><td><span><font></span><span> -#errors -Line 1 Col 26 Unexpected table cell start tag (td) in the table body phase. -Line 1 Col 45 Unexpected end tag (span). -Line 1 Col 51 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <span> -| <font> -| <font> -| <span> - -#data -<!doctype html><form><table></form><form></table></form> -#errors -35: Stray end tag “form”. -41: Start tag “form” seen in “table”. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <table> -| <form> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat deleted file mode 100644 index 7b555f888..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat +++ /dev/null @@ -1,153 +0,0 @@ -#data -<!doctype html><table><tbody><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><tr><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<!doctype html><table><tr><td><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <select> -| <td> - -#data -<!doctype html><table><tr><th><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <th> -| <select> -| <td> - -#data -<!doctype html><table><caption><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <select> -| <tbody> -| <tr> - -#data -<!doctype html><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><th> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><tbody> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><thead> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><tfoot> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><caption> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><table><tr></table>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| "a" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat deleted file mode 100644 index 680e1f068..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat +++ /dev/null @@ -1,269 +0,0 @@ -#data -<!doctype html><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> - -#data -<!doctype html><table><tbody><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> - -#data -<!doctype html><table><tbody><tr><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><tbody><tr><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><td><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><caption><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><tr><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <tbody> -| <tr> -| <style> -| "</script>" - -#data -<!doctype html><table><tr><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <tbody> -| <tr> -| <script> -| "</style>" - -#data -<!doctype html><table><caption><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <style> -| "</script>" -| "abc" - -#data -<!doctype html><table><td><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <style> -| "</script>" -| "abc" - -#data -<!doctype html><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" - -#data -<!doctype html><table><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" -| <table> - -#data -<!doctype html><table><tr><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><frameset></frameset><noframes>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" - -#data -<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" -| <!-- abc --> - -#data -<!doctype html><frameset></frameset></html><noframes>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" - -#data -<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" -| <!-- abc --> - -#data -<!doctype html><table><tr></tbody><tfoot> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <tfoot> - -#data -<!doctype html><table><td><svg></svg>abc<td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| "abc" -| <td> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat deleted file mode 100644 index 0d62f5a5b..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat +++ /dev/null @@ -1,1237 +0,0 @@ -#data -<!doctype html><math><mn DefinitionUrl="foo"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mn> -| definitionURL="foo" - -#data -<!doctype html><html></p><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <!-- foo --> -| <head> -| <body> - -#data -<!doctype html><head></head></p><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <!-- foo --> -| <body> - -#data -<!doctype html><body><p><pre> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <pre> - -#data -<!doctype html><body><p><listing> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <listing> - -#data -<!doctype html><p><plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <plaintext> - -#data -<!doctype html><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <h1> - -#data -<!doctype html><form><isindex> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> - -#data -<!doctype html><isindex action="POST"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| action="POST" -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><isindex prompt="this is isindex"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "this is isindex" -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><isindex type="hidden"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| type="hidden" -| <hr> - -#data -<!doctype html><isindex name="foo"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><ruby><p><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <p> -| <rp> - -#data -<!doctype html><ruby><div><span><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <span> -| <rp> - -#data -<!doctype html><ruby><div><p><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <p> -| <rp> - -#data -<!doctype html><ruby><p><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <p> -| <rt> - -#data -<!doctype html><ruby><div><span><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <span> -| <rt> - -#data -<!doctype html><ruby><div><p><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <p> -| <rt> - -#data -<!doctype html><math/><foo> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <foo> - -#data -<!doctype html><svg/><foo> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <foo> - -#data -<!doctype html><div></body><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| <!-- foo --> - -#data -<!doctype html><h1><div><h3><span></h1>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <h1> -| <div> -| <h3> -| <span> -| "foo" - -#data -<!doctype html><p></h3>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "foo" - -#data -<!doctype html><h3><li>abc</h2>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <h3> -| <li> -| "abc" -| "foo" - -#data -<!doctype html><table>abc<!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <!-- foo --> - -#data -<!doctype html><table> <!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " " -| <!-- foo --> - -#data -<!doctype html><table> b <!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " b " -| <table> -| <!-- foo --> - -#data -<!doctype html><select><option><option> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> -| <option> - -#data -<!doctype html><select><option></optgroup> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!doctype html><select><option></optgroup> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!doctype html><p><math><mi><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mi> -| <p> -| <h1> - -#data -<!doctype html><p><math><mo><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mo> -| <p> -| <h1> - -#data -<!doctype html><p><math><mn><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mn> -| <p> -| <h1> - -#data -<!doctype html><p><math><ms><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math ms> -| <p> -| <h1> - -#data -<!doctype html><p><math><mtext><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mtext> -| <p> -| <h1> - -#data -<!doctype html><frameset></noframes> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html c=d><body></html><html a=b> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <body> - -#data -<!doctype html><html c=d><frameset></frameset></html><html a=b> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <!-- foo --> - -#data -<!doctype html><html><frameset></frameset></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| " " - -#data -<!doctype html><html><frameset></frameset></html>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html></p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<html><frameset></frameset></html><!doctype html> -#errors -#document -| <html> -| <head> -| <frameset> - -#data -<!doctype html><body><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!doctype html><p><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><p>a<frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "a" - -#data -<!doctype html><p> <frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><pre><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> - -#data -<!doctype html><listing><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <listing> - -#data -<!doctype html><li><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <li> - -#data -<!doctype html><dd><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dd> - -#data -<!doctype html><dt><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dt> - -#data -<!doctype html><button><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <button> - -#data -<!doctype html><applet><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <applet> - -#data -<!doctype html><marquee><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <marquee> - -#data -<!doctype html><object><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <object> - -#data -<!doctype html><table><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> - -#data -<!doctype html><area><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <area> - -#data -<!doctype html><basefont><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <basefont> -| <frameset> - -#data -<!doctype html><bgsound><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <bgsound> -| <frameset> - -#data -<!doctype html><br><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <br> - -#data -<!doctype html><embed><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <embed> - -#data -<!doctype html><img><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <img> - -#data -<!doctype html><input><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <input> - -#data -<!doctype html><keygen><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <keygen> - -#data -<!doctype html><wbr><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <wbr> - -#data -<!doctype html><hr><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <hr> - -#data -<!doctype html><textarea></textarea><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> - -#data -<!doctype html><xmp></xmp><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xmp> - -#data -<!doctype html><iframe></iframe><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> - -#data -<!doctype html><select></select><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><svg></svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><math></math><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><svg><foreignObject><div> <frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><svg>a</svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| "a" - -#data -<!doctype html><svg> </svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<html>aaa<frameset></frameset> -#errors -#document -| <html> -| <head> -| <body> -| "aaa" - -#data -<html> a <frameset></frameset> -#errors -#document -| <html> -| <head> -| <body> -| "a " - -#data -<!doctype html><div><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><div><body><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> - -#data -<!doctype html><p><math></p>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| "a" - -#data -<!doctype html><p><math><mn><span></p>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mn> -| <span> -| <p> -| "a" - -#data -<!doctype html><math></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> - -#data -<!doctype html><meta charset="ascii"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <meta> -| charset="ascii" -| <body> - -#data -<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <meta> -| content="text/html;charset=ascii" -| http-equiv="content-type" -| <body> - -#data -<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --> -| <meta> -| charset="utf8" -| <body> - -#data -<!doctype html><html a=b><head></head><html c=d> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <body> - -#data -<!doctype html><image/> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <img> - -#data -<!doctype html>a<i>b<table>c<b>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "a" -| <i> -| "bc" -| <b> -| "de" -| "f" -| <table> - -#data -<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" -| <table> - -#data -<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" - -#data -<!doctype html><table><i>a<b>b<div>c</i> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <i> -| "c" -| <table> - -#data -<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" -| <table> - -#data -<!doctype html><table><i>a<div>b<tr>c<b>d</i>e -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <div> -| "b" -| <i> -| "c" -| <b> -| "d" -| <b> -| "e" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><td><table><i>a<div>b<b>c</i>d -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <i> -| "a" -| <div> -| <i> -| "b" -| <b> -| "c" -| <b> -| "d" -| <table> - -#data -<!doctype html><body><bgsound> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <bgsound> - -#data -<!doctype html><body><basefont> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <basefont> - -#data -<!doctype html><a><b></a><basefont> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <a> -| <b> -| <basefont> - -#data -<!doctype html><a><b></a><bgsound> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <a> -| <b> -| <bgsound> - -#data -<!doctype html><figcaption><article></figcaption>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <figcaption> -| <article> -| "a" - -#data -<!doctype html><summary><article></summary>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <summary> -| <article> -| "a" - -#data -<!doctype html><p><a><plaintext>b -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <a> -| <plaintext> -| <a> -| "b" - -#data -<!DOCTYPE html><div>a<a></div>b<p>c</p>d -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| "a" -| <a> -| <a> -| "b" -| <p> -| "c" -| "d" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat deleted file mode 100644 index 60d859221..000000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat +++ /dev/null @@ -1,763 +0,0 @@ -#data -<!DOCTYPE html>Test -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "Test" - -#data -<textarea>test</div>test -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -Line: 1 Col: 24 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <textarea> -| "test</div>test" - -#data -<table><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 11 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><td>test</tbody></table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "test" - -#data -<frame>test -#errors -Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE. -Line: 1 Col: 7 Unexpected start tag frame. Ignored. -#document -| <html> -| <head> -| <body> -| "test" - -#data -<!DOCTYPE html><frameset>test -#errors -Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored. -Line: 1 Col: 29 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><frameset><!DOCTYPE html> -#errors -Line: 1 Col: 40 Unexpected DOCTYPE. Ignored. -Line: 1 Col: 40 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><font><p><b>test</font> -#errors -Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <font> -| <p> -| <font> -| <b> -| "test" - -#data -<!DOCTYPE html><dt><div><dd> -#errors -Line: 1 Col: 28 Missing end tag (div, dt). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dt> -| <div> -| <dd> - -#data -<script></x -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</x" -| <body> - -#data -<table><plaintext><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode. -Line: 1 Col: 22 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <plaintext> -| "<td>" -| <table> - -#data -<plaintext></plaintext> -#errors -Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE. -Line: 1 Col: 23 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" - -#data -<!DOCTYPE html><table><tr>TEST -#errors -Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 30 Unexpected end of file. Expected table content. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "TEST" -| <table> -| <tbody> -| <tr> - -#data -<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> -#errors -Line: 1 Col: 37 Unexpected start tag (body). -Line: 1 Col: 53 Unexpected start tag (body). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| t1="1" -| t2="2" -| t3="3" -| t4="4" - -#data -</b test -#errors -Line: 1 Col: 8 Unexpected end of file in attribute name. -Line: 1 Col: 8 End tag contains unexpected attributes. -Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE. -Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element. -#document -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html></b test<b &=&>X -#errors -Line: 1 Col: 32 Named entity didn't end with ';'. -Line: 1 Col: 33 End tag contains unexpected attributes. -Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" - -#data -<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -Line: 1 Col: 54 Unexpected end of file in the tag name. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| type="text/x-foobar;baz" -| "X</SCRipt" -| <body> - -#data -& -#errors -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&" - -#data -&# -#errors -Line: 1 Col: 1 Numeric entity expected. Got end of file instead. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#" - -#data -&#X -#errors -Line: 1 Col: 3 Numeric entity expected but none found. -Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#X" - -#data -&#x -#errors -Line: 1 Col: 3 Numeric entity expected but none found. -Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#x" - -#data -- -#errors -Line: 1 Col: 4 Numeric entity didn't end with ';'. -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "-" - -#data -&x-test -#errors -Line: 1 Col: 1 Named entity expected. Got none. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&x-test" - -#data -<!doctypehtml><p><li> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <li> - -#data -<!doctypehtml><p><dt> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <dt> - -#data -<!doctypehtml><p><dd> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <dd> - -#data -<!doctypehtml><p><form> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -Line: 1 Col: 23 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <form> - -#data -<!DOCTYPE html><p></P>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "X" - -#data -& -#errors -Line: 1 Col: 4 Named entity didn't end with ';'. -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&" - -#data -&AMp; -#errors -Line: 1 Col: 1 Named entity expected. Got none. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&AMp;" - -#data -<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> -#errors -Line: 1 Col: 110 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> - -#data -<!DOCTYPE html>X</body>X -#errors -Line: 1 Col: 24 Unexpected non-space characters in the after body phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "XX" - -#data -<!DOCTYPE html><!-- X -#errors -Line: 1 Col: 21 Unexpected end of file in comment. -#document -| <!DOCTYPE html> -| <!-- X --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><table><caption>test TEST</caption><td>test -#errors -Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 58 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| "test TEST" -| <tbody> -| <tr> -| <td> -| "test" - -#data -<!DOCTYPE html><select><option><optgroup> -#errors -Line: 1 Col: 41 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> -| <optgroup> - -#data -<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> -#errors -Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag. -Line: 1 Col: 76 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> -| <option> -| <option> -| <option> - -#data -<!DOCTYPE html><select><optgroup><option><optgroup> -#errors -Line: 1 Col: 51 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> -| <option> -| <optgroup> - -#data -<!DOCTYPE html><datalist><option>foo</datalist>bar -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <datalist> -| <option> -| "foo" -| "bar" - -#data -<!DOCTYPE html><font><input><input></font> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <font> -| <input> -| <input> - -#data -<!DOCTYPE html><!-- XXX - XXX --> -#errors -#document -| <!DOCTYPE html> -| <!-- XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><!-- XXX - XXX -#errors -Line: 1 Col: 29 Unexpected end of file in comment (-) -#document -| <!DOCTYPE html> -| <!-- XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><!-- XXX - XXX - XXX --> -#errors -#document -| <!DOCTYPE html> -| <!-- XXX - XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<isindex test=x name=x> -#errors -Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected start tag isindex. Don't use it! -#document -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| test="x" -| <hr> - -#data -test -test -#errors -Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "test -test" - -#data -<!DOCTYPE html><body><title>test</body> -#errors -#document -| -| -| -| -| -| "test</body>" - -#data -<!DOCTYPE html><body><title>X -#errors -#document -| -| -| -| -| -| "X" -| <meta> -| name="z" -| <link> -| rel="foo" -| <style> -| " -x { content:"</style" } " - -#data -<!DOCTYPE html><select><optgroup></optgroup></select> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> - -#data - - -#errors -Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html> <html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><script> -</script> <title>x -#errors -#document -| -| -| -| -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved. -#document -| -| -| -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved. -#document -| -| -| -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -#document -| -| -| -| -| "x" -| x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (style). -#document -| -| -| --> x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| -| -| x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| -| -| x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| -| -| x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| -| -|

-#errors -#document -| -| -| -| -| -| ddd -#errors -#document -| -| -| -#errors -#document -| -| -| -| -|
  • -| -| - - -

    /debug/events

    - -
  • - {{range $i, $fam := .Families}} - - - - {{range $j, $bucket := $.Buckets}} - {{$n := index $.Counts $i $j}} - - {{end}} - - {{end}} -
    {{$fam}} - {{if $n}}{{end}} - [{{$n}} {{$bucket.String}}] - {{if $n}}{{end}} -
    - -{{if $.EventLogs}} -


    -

    Family: {{$.Family}}

    - -{{if $.Expanded}}
    {{end}} -[Summary]{{if $.Expanded}}{{end}} - -{{if not $.Expanded}}{{end}} -[Expanded]{{if not $.Expanded}}{{end}} - - - - {{range $el := $.EventLogs}} - - - - - {{if $.Expanded}} - - - - - - {{range $el.Events}} - - - - - - {{end}} - {{end}} - {{end}} -
    WhenElapsed
    {{$el.When}}{{$el.ElapsedTime}}{{$el.Title}} -
    {{$el.Stack|trimSpace}}
    {{.WhenString}}{{elapsed .Elapsed}}.{{if .IsErr}}E{{else}}.{{end}}. {{.What}}
    -{{end}} - - -` diff --git a/vendor/golang.org/x/net/trace/histogram.go b/vendor/golang.org/x/net/trace/histogram.go deleted file mode 100644 index 9bf4286c7..000000000 --- a/vendor/golang.org/x/net/trace/histogram.go +++ /dev/null @@ -1,365 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package trace - -// This file implements histogramming for RPC statistics collection. - -import ( - "bytes" - "fmt" - "html/template" - "log" - "math" - "sync" - - "golang.org/x/net/internal/timeseries" -) - -const ( - bucketCount = 38 -) - -// histogram keeps counts of values in buckets that are spaced -// out in powers of 2: 0-1, 2-3, 4-7... -// histogram implements timeseries.Observable -type histogram struct { - sum int64 // running total of measurements - sumOfSquares float64 // square of running total - buckets []int64 // bucketed values for histogram - value int // holds a single value as an optimization - valueCount int64 // number of values recorded for single value -} - -// AddMeasurement records a value measurement observation to the histogram. -func (h *histogram) addMeasurement(value int64) { - // TODO: assert invariant - h.sum += value - h.sumOfSquares += float64(value) * float64(value) - - bucketIndex := getBucket(value) - - if h.valueCount == 0 || (h.valueCount > 0 && h.value == bucketIndex) { - h.value = bucketIndex - h.valueCount++ - } else { - h.allocateBuckets() - h.buckets[bucketIndex]++ - } -} - -func (h *histogram) allocateBuckets() { - if h.buckets == nil { - h.buckets = make([]int64, bucketCount) - h.buckets[h.value] = h.valueCount - h.value = 0 - h.valueCount = -1 - } -} - -func log2(i int64) int { - n := 0 - for ; i >= 0x100; i >>= 8 { - n += 8 - } - for ; i > 0; i >>= 1 { - n += 1 - } - return n -} - -func getBucket(i int64) (index int) { - index = log2(i) - 1 - if index < 0 { - index = 0 - } - if index >= bucketCount { - index = bucketCount - 1 - } - return -} - -// Total returns the number of recorded observations. -func (h *histogram) total() (total int64) { - if h.valueCount >= 0 { - total = h.valueCount - } - for _, val := range h.buckets { - total += int64(val) - } - return -} - -// Average returns the average value of recorded observations. -func (h *histogram) average() float64 { - t := h.total() - if t == 0 { - return 0 - } - return float64(h.sum) / float64(t) -} - -// Variance returns the variance of recorded observations. -func (h *histogram) variance() float64 { - t := float64(h.total()) - if t == 0 { - return 0 - } - s := float64(h.sum) / t - return h.sumOfSquares/t - s*s -} - -// StandardDeviation returns the standard deviation of recorded observations. -func (h *histogram) standardDeviation() float64 { - return math.Sqrt(h.variance()) -} - -// PercentileBoundary estimates the value that the given fraction of recorded -// observations are less than. -func (h *histogram) percentileBoundary(percentile float64) int64 { - total := h.total() - - // Corner cases (make sure result is strictly less than Total()) - if total == 0 { - return 0 - } else if total == 1 { - return int64(h.average()) - } - - percentOfTotal := round(float64(total) * percentile) - var runningTotal int64 - - for i := range h.buckets { - value := h.buckets[i] - runningTotal += value - if runningTotal == percentOfTotal { - // We hit an exact bucket boundary. If the next bucket has data, it is a - // good estimate of the value. If the bucket is empty, we interpolate the - // midpoint between the next bucket's boundary and the next non-zero - // bucket. If the remaining buckets are all empty, then we use the - // boundary for the next bucket as the estimate. - j := uint8(i + 1) - min := bucketBoundary(j) - if runningTotal < total { - for h.buckets[j] == 0 { - j++ - } - } - max := bucketBoundary(j) - return min + round(float64(max-min)/2) - } else if runningTotal > percentOfTotal { - // The value is in this bucket. Interpolate the value. - delta := runningTotal - percentOfTotal - percentBucket := float64(value-delta) / float64(value) - bucketMin := bucketBoundary(uint8(i)) - nextBucketMin := bucketBoundary(uint8(i + 1)) - bucketSize := nextBucketMin - bucketMin - return bucketMin + round(percentBucket*float64(bucketSize)) - } - } - return bucketBoundary(bucketCount - 1) -} - -// Median returns the estimated median of the observed values. -func (h *histogram) median() int64 { - return h.percentileBoundary(0.5) -} - -// Add adds other to h. -func (h *histogram) Add(other timeseries.Observable) { - o := other.(*histogram) - if o.valueCount == 0 { - // Other histogram is empty - } else if h.valueCount >= 0 && o.valueCount > 0 && h.value == o.value { - // Both have a single bucketed value, aggregate them - h.valueCount += o.valueCount - } else { - // Two different values necessitate buckets in this histogram - h.allocateBuckets() - if o.valueCount >= 0 { - h.buckets[o.value] += o.valueCount - } else { - for i := range h.buckets { - h.buckets[i] += o.buckets[i] - } - } - } - h.sumOfSquares += o.sumOfSquares - h.sum += o.sum -} - -// Clear resets the histogram to an empty state, removing all observed values. -func (h *histogram) Clear() { - h.buckets = nil - h.value = 0 - h.valueCount = 0 - h.sum = 0 - h.sumOfSquares = 0 -} - -// CopyFrom copies from other, which must be a *histogram, into h. -func (h *histogram) CopyFrom(other timeseries.Observable) { - o := other.(*histogram) - if o.valueCount == -1 { - h.allocateBuckets() - copy(h.buckets, o.buckets) - } - h.sum = o.sum - h.sumOfSquares = o.sumOfSquares - h.value = o.value - h.valueCount = o.valueCount -} - -// Multiply scales the histogram by the specified ratio. -func (h *histogram) Multiply(ratio float64) { - if h.valueCount == -1 { - for i := range h.buckets { - h.buckets[i] = int64(float64(h.buckets[i]) * ratio) - } - } else { - h.valueCount = int64(float64(h.valueCount) * ratio) - } - h.sum = int64(float64(h.sum) * ratio) - h.sumOfSquares = h.sumOfSquares * ratio -} - -// New creates a new histogram. -func (h *histogram) New() timeseries.Observable { - r := new(histogram) - r.Clear() - return r -} - -func (h *histogram) String() string { - return fmt.Sprintf("%d, %f, %d, %d, %v", - h.sum, h.sumOfSquares, h.value, h.valueCount, h.buckets) -} - -// round returns the closest int64 to the argument -func round(in float64) int64 { - return int64(math.Floor(in + 0.5)) -} - -// bucketBoundary returns the first value in the bucket. -func bucketBoundary(bucket uint8) int64 { - if bucket == 0 { - return 0 - } - return 1 << bucket -} - -// bucketData holds data about a specific bucket for use in distTmpl. -type bucketData struct { - Lower, Upper int64 - N int64 - Pct, CumulativePct float64 - GraphWidth int -} - -// data holds data about a Distribution for use in distTmpl. -type data struct { - Buckets []*bucketData - Count, Median int64 - Mean, StandardDeviation float64 -} - -// maxHTMLBarWidth is the maximum width of the HTML bar for visualizing buckets. -const maxHTMLBarWidth = 350.0 - -// newData returns data representing h for use in distTmpl. -func (h *histogram) newData() *data { - // Force the allocation of buckets to simplify the rendering implementation - h.allocateBuckets() - // We scale the bars on the right so that the largest bar is - // maxHTMLBarWidth pixels in width. - maxBucket := int64(0) - for _, n := range h.buckets { - if n > maxBucket { - maxBucket = n - } - } - total := h.total() - barsizeMult := maxHTMLBarWidth / float64(maxBucket) - var pctMult float64 - if total == 0 { - pctMult = 1.0 - } else { - pctMult = 100.0 / float64(total) - } - - buckets := make([]*bucketData, len(h.buckets)) - runningTotal := int64(0) - for i, n := range h.buckets { - if n == 0 { - continue - } - runningTotal += n - var upperBound int64 - if i < bucketCount-1 { - upperBound = bucketBoundary(uint8(i + 1)) - } else { - upperBound = math.MaxInt64 - } - buckets[i] = &bucketData{ - Lower: bucketBoundary(uint8(i)), - Upper: upperBound, - N: n, - Pct: float64(n) * pctMult, - CumulativePct: float64(runningTotal) * pctMult, - GraphWidth: int(float64(n) * barsizeMult), - } - } - return &data{ - Buckets: buckets, - Count: total, - Median: h.median(), - Mean: h.average(), - StandardDeviation: h.standardDeviation(), - } -} - -func (h *histogram) html() template.HTML { - buf := new(bytes.Buffer) - if err := distTmpl().Execute(buf, h.newData()); err != nil { - buf.Reset() - log.Printf("net/trace: couldn't execute template: %v", err) - } - return template.HTML(buf.String()) -} - -var distTmplCache *template.Template -var distTmplOnce sync.Once - -func distTmpl() *template.Template { - distTmplOnce.Do(func() { - // Input: data - distTmplCache = template.Must(template.New("distTmpl").Parse(` - - - - - - - -
    Count: {{.Count}}Mean: {{printf "%.0f" .Mean}}StdDev: {{printf "%.0f" .StandardDeviation}}Median: {{.Median}}
    -
    - -{{range $b := .Buckets}} -{{if $b}} - - - - - - - - - -{{end}} -{{end}} -
    [{{.Lower}},{{.Upper}}){{.N}}{{printf "%#.3f" .Pct}}%{{printf "%#.3f" .CumulativePct}}%
    -`)) - }) - return distTmplCache -} diff --git a/vendor/golang.org/x/net/trace/histogram_test.go b/vendor/golang.org/x/net/trace/histogram_test.go deleted file mode 100644 index d384b9332..000000000 --- a/vendor/golang.org/x/net/trace/histogram_test.go +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package trace - -import ( - "math" - "testing" -) - -type sumTest struct { - value int64 - sum int64 - sumOfSquares float64 - total int64 -} - -var sumTests = []sumTest{ - {100, 100, 10000, 1}, - {50, 150, 12500, 2}, - {50, 200, 15000, 3}, - {50, 250, 17500, 4}, -} - -type bucketingTest struct { - in int64 - log int - bucket int -} - -var bucketingTests = []bucketingTest{ - {0, 0, 0}, - {1, 1, 0}, - {2, 2, 1}, - {3, 2, 1}, - {4, 3, 2}, - {1000, 10, 9}, - {1023, 10, 9}, - {1024, 11, 10}, - {1000000, 20, 19}, -} - -type multiplyTest struct { - in int64 - ratio float64 - expectedSum int64 - expectedTotal int64 - expectedSumOfSquares float64 -} - -var multiplyTests = []multiplyTest{ - {15, 2.5, 37, 2, 562.5}, - {128, 4.6, 758, 13, 77953.9}, -} - -type percentileTest struct { - fraction float64 - expected int64 -} - -var percentileTests = []percentileTest{ - {0.25, 48}, - {0.5, 96}, - {0.6, 109}, - {0.75, 128}, - {0.90, 205}, - {0.95, 230}, - {0.99, 256}, -} - -func TestSum(t *testing.T) { - var h histogram - - for _, test := range sumTests { - h.addMeasurement(test.value) - sum := h.sum - if sum != test.sum { - t.Errorf("h.Sum = %v WANT: %v", sum, test.sum) - } - - sumOfSquares := h.sumOfSquares - if sumOfSquares != test.sumOfSquares { - t.Errorf("h.SumOfSquares = %v WANT: %v", sumOfSquares, test.sumOfSquares) - } - - total := h.total() - if total != test.total { - t.Errorf("h.Total = %v WANT: %v", total, test.total) - } - } -} - -func TestMultiply(t *testing.T) { - var h histogram - for i, test := range multiplyTests { - h.addMeasurement(test.in) - h.Multiply(test.ratio) - if h.sum != test.expectedSum { - t.Errorf("#%v: h.sum = %v WANT: %v", i, h.sum, test.expectedSum) - } - if h.total() != test.expectedTotal { - t.Errorf("#%v: h.total = %v WANT: %v", i, h.total(), test.expectedTotal) - } - if h.sumOfSquares != test.expectedSumOfSquares { - t.Errorf("#%v: h.SumOfSquares = %v WANT: %v", i, test.expectedSumOfSquares, h.sumOfSquares) - } - } -} - -func TestBucketingFunctions(t *testing.T) { - for _, test := range bucketingTests { - log := log2(test.in) - if log != test.log { - t.Errorf("log2 = %v WANT: %v", log, test.log) - } - - bucket := getBucket(test.in) - if bucket != test.bucket { - t.Errorf("getBucket = %v WANT: %v", bucket, test.bucket) - } - } -} - -func TestAverage(t *testing.T) { - a := new(histogram) - average := a.average() - if average != 0 { - t.Errorf("Average of empty histogram was %v WANT: 0", average) - } - - a.addMeasurement(1) - a.addMeasurement(1) - a.addMeasurement(3) - const expected = float64(5) / float64(3) - average = a.average() - - if !isApproximate(average, expected) { - t.Errorf("Average = %g WANT: %v", average, expected) - } -} - -func TestStandardDeviation(t *testing.T) { - a := new(histogram) - add(a, 10, 1<<4) - add(a, 10, 1<<5) - add(a, 10, 1<<6) - stdDev := a.standardDeviation() - const expected = 19.95 - - if !isApproximate(stdDev, expected) { - t.Errorf("StandardDeviation = %v WANT: %v", stdDev, expected) - } - - // No values - a = new(histogram) - stdDev = a.standardDeviation() - - if !isApproximate(stdDev, 0) { - t.Errorf("StandardDeviation = %v WANT: 0", stdDev) - } - - add(a, 1, 1<<4) - if !isApproximate(stdDev, 0) { - t.Errorf("StandardDeviation = %v WANT: 0", stdDev) - } - - add(a, 10, 1<<4) - if !isApproximate(stdDev, 0) { - t.Errorf("StandardDeviation = %v WANT: 0", stdDev) - } -} - -func TestPercentileBoundary(t *testing.T) { - a := new(histogram) - add(a, 5, 1<<4) - add(a, 10, 1<<6) - add(a, 5, 1<<7) - - for _, test := range percentileTests { - percentile := a.percentileBoundary(test.fraction) - if percentile != test.expected { - t.Errorf("h.PercentileBoundary (fraction=%v) = %v WANT: %v", test.fraction, percentile, test.expected) - } - } -} - -func TestCopyFrom(t *testing.T) { - a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} - b := histogram{6, 36, []int64{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39}, 5, -1} - - a.CopyFrom(&b) - - if a.String() != b.String() { - t.Errorf("a.String = %s WANT: %s", a.String(), b.String()) - } -} - -func TestClear(t *testing.T) { - a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} - - a.Clear() - - expected := "0, 0.000000, 0, 0, []" - if a.String() != expected { - t.Errorf("a.String = %s WANT %s", a.String(), expected) - } -} - -func TestNew(t *testing.T) { - a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} - b := a.New() - - expected := "0, 0.000000, 0, 0, []" - if b.(*histogram).String() != expected { - t.Errorf("b.(*histogram).String = %s WANT: %s", b.(*histogram).String(), expected) - } -} - -func TestAdd(t *testing.T) { - // The tests here depend on the associativity of addMeasurement and Add. - // Add empty observation - a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} - b := a.New() - - expected := a.String() - a.Add(b) - if a.String() != expected { - t.Errorf("a.String = %s WANT: %s", a.String(), expected) - } - - // Add same bucketed value, no new buckets - c := new(histogram) - d := new(histogram) - e := new(histogram) - c.addMeasurement(12) - d.addMeasurement(11) - e.addMeasurement(12) - e.addMeasurement(11) - c.Add(d) - if c.String() != e.String() { - t.Errorf("c.String = %s WANT: %s", c.String(), e.String()) - } - - // Add bucketed values - f := new(histogram) - g := new(histogram) - h := new(histogram) - f.addMeasurement(4) - f.addMeasurement(12) - f.addMeasurement(100) - g.addMeasurement(18) - g.addMeasurement(36) - g.addMeasurement(255) - h.addMeasurement(4) - h.addMeasurement(12) - h.addMeasurement(100) - h.addMeasurement(18) - h.addMeasurement(36) - h.addMeasurement(255) - f.Add(g) - if f.String() != h.String() { - t.Errorf("f.String = %q WANT: %q", f.String(), h.String()) - } - - // add buckets to no buckets - i := new(histogram) - j := new(histogram) - k := new(histogram) - j.addMeasurement(18) - j.addMeasurement(36) - j.addMeasurement(255) - k.addMeasurement(18) - k.addMeasurement(36) - k.addMeasurement(255) - i.Add(j) - if i.String() != k.String() { - t.Errorf("i.String = %q WANT: %q", i.String(), k.String()) - } - - // add buckets to single value (no overlap) - l := new(histogram) - m := new(histogram) - n := new(histogram) - l.addMeasurement(0) - m.addMeasurement(18) - m.addMeasurement(36) - m.addMeasurement(255) - n.addMeasurement(0) - n.addMeasurement(18) - n.addMeasurement(36) - n.addMeasurement(255) - l.Add(m) - if l.String() != n.String() { - t.Errorf("l.String = %q WANT: %q", l.String(), n.String()) - } - - // mixed order - o := new(histogram) - p := new(histogram) - o.addMeasurement(0) - o.addMeasurement(2) - o.addMeasurement(0) - p.addMeasurement(0) - p.addMeasurement(0) - p.addMeasurement(2) - if o.String() != p.String() { - t.Errorf("o.String = %q WANT: %q", o.String(), p.String()) - } -} - -func add(h *histogram, times int, val int64) { - for i := 0; i < times; i++ { - h.addMeasurement(val) - } -} - -func isApproximate(x, y float64) bool { - return math.Abs(x-y) < 1e-2 -} diff --git a/vendor/golang.org/x/net/trace/trace.go b/vendor/golang.org/x/net/trace/trace.go deleted file mode 100644 index bb72a527e..000000000 --- a/vendor/golang.org/x/net/trace/trace.go +++ /dev/null @@ -1,1082 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package trace implements tracing of requests and long-lived objects. -It exports HTTP interfaces on /debug/requests and /debug/events. - -A trace.Trace provides tracing for short-lived objects, usually requests. -A request handler might be implemented like this: - - func fooHandler(w http.ResponseWriter, req *http.Request) { - tr := trace.New("mypkg.Foo", req.URL.Path) - defer tr.Finish() - ... - tr.LazyPrintf("some event %q happened", str) - ... - if err := somethingImportant(); err != nil { - tr.LazyPrintf("somethingImportant failed: %v", err) - tr.SetError() - } - } - -The /debug/requests HTTP endpoint organizes the traces by family, -errors, and duration. It also provides histogram of request duration -for each family. - -A trace.EventLog provides tracing for long-lived objects, such as RPC -connections. - - // A Fetcher fetches URL paths for a single domain. - type Fetcher struct { - domain string - events trace.EventLog - } - - func NewFetcher(domain string) *Fetcher { - return &Fetcher{ - domain, - trace.NewEventLog("mypkg.Fetcher", domain), - } - } - - func (f *Fetcher) Fetch(path string) (string, error) { - resp, err := http.Get("http://" + f.domain + "/" + path) - if err != nil { - f.events.Errorf("Get(%q) = %v", path, err) - return "", err - } - f.events.Printf("Get(%q) = %s", path, resp.Status) - ... - } - - func (f *Fetcher) Close() error { - f.events.Finish() - return nil - } - -The /debug/events HTTP endpoint organizes the event logs by family and -by time since the last error. The expanded view displays recent log -entries and the log's call stack. -*/ -package trace // import "golang.org/x/net/trace" - -import ( - "bytes" - "fmt" - "html/template" - "io" - "log" - "net" - "net/http" - "runtime" - "sort" - "strconv" - "sync" - "sync/atomic" - "time" - - "golang.org/x/net/internal/timeseries" -) - -// DebugUseAfterFinish controls whether to debug uses of Trace values after finishing. -// FOR DEBUGGING ONLY. This will slow down the program. -var DebugUseAfterFinish = false - -// AuthRequest determines whether a specific request is permitted to load the -// /debug/requests or /debug/events pages. -// -// It returns two bools; the first indicates whether the page may be viewed at all, -// and the second indicates whether sensitive events will be shown. -// -// AuthRequest may be replaced by a program to customize its authorization requirements. -// -// The default AuthRequest function returns (true, true) if and only if the request -// comes from localhost/127.0.0.1/[::1]. -var AuthRequest = func(req *http.Request) (any, sensitive bool) { - // RemoteAddr is commonly in the form "IP" or "IP:port". - // If it is in the form "IP:port", split off the port. - host, _, err := net.SplitHostPort(req.RemoteAddr) - if err != nil { - host = req.RemoteAddr - } - switch host { - case "localhost", "127.0.0.1", "::1": - return true, true - default: - return false, false - } -} - -func init() { - // TODO(jbd): Serve Traces from /debug/traces in the future? - // There is no requirement for a request to be present to have traces. - http.HandleFunc("/debug/requests", Traces) - http.HandleFunc("/debug/events", Events) -} - -// Traces responds with traces from the program. -// The package initialization registers it in http.DefaultServeMux -// at /debug/requests. -// -// It performs authorization by running AuthRequest. -func Traces(w http.ResponseWriter, req *http.Request) { - any, sensitive := AuthRequest(req) - if !any { - http.Error(w, "not allowed", http.StatusUnauthorized) - return - } - w.Header().Set("Content-Type", "text/html; charset=utf-8") - Render(w, req, sensitive) -} - -// Events responds with a page of events collected by EventLogs. -// The package initialization registers it in http.DefaultServeMux -// at /debug/events. -// -// It performs authorization by running AuthRequest. -func Events(w http.ResponseWriter, req *http.Request) { - any, sensitive := AuthRequest(req) - if !any { - http.Error(w, "not allowed", http.StatusUnauthorized) - return - } - w.Header().Set("Content-Type", "text/html; charset=utf-8") - RenderEvents(w, req, sensitive) -} - -// Render renders the HTML page typically served at /debug/requests. -// It does not do any auth checking. The request may be nil. -// -// Most users will use the Traces handler. -func Render(w io.Writer, req *http.Request, sensitive bool) { - data := &struct { - Families []string - ActiveTraceCount map[string]int - CompletedTraces map[string]*family - - // Set when a bucket has been selected. - Traces traceList - Family string - Bucket int - Expanded bool - Traced bool - Active bool - ShowSensitive bool // whether to show sensitive events - - Histogram template.HTML - HistogramWindow string // e.g. "last minute", "last hour", "all time" - - // If non-zero, the set of traces is a partial set, - // and this is the total number. - Total int - }{ - CompletedTraces: completedTraces, - } - - data.ShowSensitive = sensitive - if req != nil { - // Allow show_sensitive=0 to force hiding of sensitive data for testing. - // This only goes one way; you can't use show_sensitive=1 to see things. - if req.FormValue("show_sensitive") == "0" { - data.ShowSensitive = false - } - - if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { - data.Expanded = exp - } - if exp, err := strconv.ParseBool(req.FormValue("rtraced")); err == nil { - data.Traced = exp - } - } - - completedMu.RLock() - data.Families = make([]string, 0, len(completedTraces)) - for fam := range completedTraces { - data.Families = append(data.Families, fam) - } - completedMu.RUnlock() - sort.Strings(data.Families) - - // We are careful here to minimize the time spent locking activeMu, - // since that lock is required every time an RPC starts and finishes. - data.ActiveTraceCount = make(map[string]int, len(data.Families)) - activeMu.RLock() - for fam, s := range activeTraces { - data.ActiveTraceCount[fam] = s.Len() - } - activeMu.RUnlock() - - var ok bool - data.Family, data.Bucket, ok = parseArgs(req) - switch { - case !ok: - // No-op - case data.Bucket == -1: - data.Active = true - n := data.ActiveTraceCount[data.Family] - data.Traces = getActiveTraces(data.Family) - if len(data.Traces) < n { - data.Total = n - } - case data.Bucket < bucketsPerFamily: - if b := lookupBucket(data.Family, data.Bucket); b != nil { - data.Traces = b.Copy(data.Traced) - } - default: - if f := getFamily(data.Family, false); f != nil { - var obs timeseries.Observable - f.LatencyMu.RLock() - switch o := data.Bucket - bucketsPerFamily; o { - case 0: - obs = f.Latency.Minute() - data.HistogramWindow = "last minute" - case 1: - obs = f.Latency.Hour() - data.HistogramWindow = "last hour" - case 2: - obs = f.Latency.Total() - data.HistogramWindow = "all time" - } - f.LatencyMu.RUnlock() - if obs != nil { - data.Histogram = obs.(*histogram).html() - } - } - } - - if data.Traces != nil { - defer data.Traces.Free() - sort.Sort(data.Traces) - } - - completedMu.RLock() - defer completedMu.RUnlock() - if err := pageTmpl().ExecuteTemplate(w, "Page", data); err != nil { - log.Printf("net/trace: Failed executing template: %v", err) - } -} - -func parseArgs(req *http.Request) (fam string, b int, ok bool) { - if req == nil { - return "", 0, false - } - fam, bStr := req.FormValue("fam"), req.FormValue("b") - if fam == "" || bStr == "" { - return "", 0, false - } - b, err := strconv.Atoi(bStr) - if err != nil || b < -1 { - return "", 0, false - } - - return fam, b, true -} - -func lookupBucket(fam string, b int) *traceBucket { - f := getFamily(fam, false) - if f == nil || b < 0 || b >= len(f.Buckets) { - return nil - } - return f.Buckets[b] -} - -type contextKeyT string - -var contextKey = contextKeyT("golang.org/x/net/trace.Trace") - -// Trace represents an active request. -type Trace interface { - // LazyLog adds x to the event log. It will be evaluated each time the - // /debug/requests page is rendered. Any memory referenced by x will be - // pinned until the trace is finished and later discarded. - LazyLog(x fmt.Stringer, sensitive bool) - - // LazyPrintf evaluates its arguments with fmt.Sprintf each time the - // /debug/requests page is rendered. Any memory referenced by a will be - // pinned until the trace is finished and later discarded. - LazyPrintf(format string, a ...interface{}) - - // SetError declares that this trace resulted in an error. - SetError() - - // SetRecycler sets a recycler for the trace. - // f will be called for each event passed to LazyLog at a time when - // it is no longer required, whether while the trace is still active - // and the event is discarded, or when a completed trace is discarded. - SetRecycler(f func(interface{})) - - // SetTraceInfo sets the trace info for the trace. - // This is currently unused. - SetTraceInfo(traceID, spanID uint64) - - // SetMaxEvents sets the maximum number of events that will be stored - // in the trace. This has no effect if any events have already been - // added to the trace. - SetMaxEvents(m int) - - // Finish declares that this trace is complete. - // The trace should not be used after calling this method. - Finish() -} - -type lazySprintf struct { - format string - a []interface{} -} - -func (l *lazySprintf) String() string { - return fmt.Sprintf(l.format, l.a...) -} - -// New returns a new Trace with the specified family and title. -func New(family, title string) Trace { - tr := newTrace() - tr.ref() - tr.Family, tr.Title = family, title - tr.Start = time.Now() - tr.maxEvents = maxEventsPerTrace - tr.events = tr.eventsBuf[:0] - - activeMu.RLock() - s := activeTraces[tr.Family] - activeMu.RUnlock() - if s == nil { - activeMu.Lock() - s = activeTraces[tr.Family] // check again - if s == nil { - s = new(traceSet) - activeTraces[tr.Family] = s - } - activeMu.Unlock() - } - s.Add(tr) - - // Trigger allocation of the completed trace structure for this family. - // This will cause the family to be present in the request page during - // the first trace of this family. We don't care about the return value, - // nor is there any need for this to run inline, so we execute it in its - // own goroutine, but only if the family isn't allocated yet. - completedMu.RLock() - if _, ok := completedTraces[tr.Family]; !ok { - go allocFamily(tr.Family) - } - completedMu.RUnlock() - - return tr -} - -func (tr *trace) Finish() { - tr.Elapsed = time.Now().Sub(tr.Start) - if DebugUseAfterFinish { - buf := make([]byte, 4<<10) // 4 KB should be enough - n := runtime.Stack(buf, false) - tr.finishStack = buf[:n] - } - - activeMu.RLock() - m := activeTraces[tr.Family] - activeMu.RUnlock() - m.Remove(tr) - - f := getFamily(tr.Family, true) - for _, b := range f.Buckets { - if b.Cond.match(tr) { - b.Add(tr) - } - } - // Add a sample of elapsed time as microseconds to the family's timeseries - h := new(histogram) - h.addMeasurement(tr.Elapsed.Nanoseconds() / 1e3) - f.LatencyMu.Lock() - f.Latency.Add(h) - f.LatencyMu.Unlock() - - tr.unref() // matches ref in New -} - -const ( - bucketsPerFamily = 9 - tracesPerBucket = 10 - maxActiveTraces = 20 // Maximum number of active traces to show. - maxEventsPerTrace = 10 - numHistogramBuckets = 38 -) - -var ( - // The active traces. - activeMu sync.RWMutex - activeTraces = make(map[string]*traceSet) // family -> traces - - // Families of completed traces. - completedMu sync.RWMutex - completedTraces = make(map[string]*family) // family -> traces -) - -type traceSet struct { - mu sync.RWMutex - m map[*trace]bool - - // We could avoid the entire map scan in FirstN by having a slice of all the traces - // ordered by start time, and an index into that from the trace struct, with a periodic - // repack of the slice after enough traces finish; we could also use a skip list or similar. - // However, that would shift some of the expense from /debug/requests time to RPC time, - // which is probably the wrong trade-off. -} - -func (ts *traceSet) Len() int { - ts.mu.RLock() - defer ts.mu.RUnlock() - return len(ts.m) -} - -func (ts *traceSet) Add(tr *trace) { - ts.mu.Lock() - if ts.m == nil { - ts.m = make(map[*trace]bool) - } - ts.m[tr] = true - ts.mu.Unlock() -} - -func (ts *traceSet) Remove(tr *trace) { - ts.mu.Lock() - delete(ts.m, tr) - ts.mu.Unlock() -} - -// FirstN returns the first n traces ordered by time. -func (ts *traceSet) FirstN(n int) traceList { - ts.mu.RLock() - defer ts.mu.RUnlock() - - if n > len(ts.m) { - n = len(ts.m) - } - trl := make(traceList, 0, n) - - // Fast path for when no selectivity is needed. - if n == len(ts.m) { - for tr := range ts.m { - tr.ref() - trl = append(trl, tr) - } - sort.Sort(trl) - return trl - } - - // Pick the oldest n traces. - // This is inefficient. See the comment in the traceSet struct. - for tr := range ts.m { - // Put the first n traces into trl in the order they occur. - // When we have n, sort trl, and thereafter maintain its order. - if len(trl) < n { - tr.ref() - trl = append(trl, tr) - if len(trl) == n { - // This is guaranteed to happen exactly once during this loop. - sort.Sort(trl) - } - continue - } - if tr.Start.After(trl[n-1].Start) { - continue - } - - // Find where to insert this one. - tr.ref() - i := sort.Search(n, func(i int) bool { return trl[i].Start.After(tr.Start) }) - trl[n-1].unref() - copy(trl[i+1:], trl[i:]) - trl[i] = tr - } - - return trl -} - -func getActiveTraces(fam string) traceList { - activeMu.RLock() - s := activeTraces[fam] - activeMu.RUnlock() - if s == nil { - return nil - } - return s.FirstN(maxActiveTraces) -} - -func getFamily(fam string, allocNew bool) *family { - completedMu.RLock() - f := completedTraces[fam] - completedMu.RUnlock() - if f == nil && allocNew { - f = allocFamily(fam) - } - return f -} - -func allocFamily(fam string) *family { - completedMu.Lock() - defer completedMu.Unlock() - f := completedTraces[fam] - if f == nil { - f = newFamily() - completedTraces[fam] = f - } - return f -} - -// family represents a set of trace buckets and associated latency information. -type family struct { - // traces may occur in multiple buckets. - Buckets [bucketsPerFamily]*traceBucket - - // latency time series - LatencyMu sync.RWMutex - Latency *timeseries.MinuteHourSeries -} - -func newFamily() *family { - return &family{ - Buckets: [bucketsPerFamily]*traceBucket{ - {Cond: minCond(0)}, - {Cond: minCond(50 * time.Millisecond)}, - {Cond: minCond(100 * time.Millisecond)}, - {Cond: minCond(200 * time.Millisecond)}, - {Cond: minCond(500 * time.Millisecond)}, - {Cond: minCond(1 * time.Second)}, - {Cond: minCond(10 * time.Second)}, - {Cond: minCond(100 * time.Second)}, - {Cond: errorCond{}}, - }, - Latency: timeseries.NewMinuteHourSeries(func() timeseries.Observable { return new(histogram) }), - } -} - -// traceBucket represents a size-capped bucket of historic traces, -// along with a condition for a trace to belong to the bucket. -type traceBucket struct { - Cond cond - - // Ring buffer implementation of a fixed-size FIFO queue. - mu sync.RWMutex - buf [tracesPerBucket]*trace - start int // < tracesPerBucket - length int // <= tracesPerBucket -} - -func (b *traceBucket) Add(tr *trace) { - b.mu.Lock() - defer b.mu.Unlock() - - i := b.start + b.length - if i >= tracesPerBucket { - i -= tracesPerBucket - } - if b.length == tracesPerBucket { - // "Remove" an element from the bucket. - b.buf[i].unref() - b.start++ - if b.start == tracesPerBucket { - b.start = 0 - } - } - b.buf[i] = tr - if b.length < tracesPerBucket { - b.length++ - } - tr.ref() -} - -// Copy returns a copy of the traces in the bucket. -// If tracedOnly is true, only the traces with trace information will be returned. -// The logs will be ref'd before returning; the caller should call -// the Free method when it is done with them. -// TODO(dsymonds): keep track of traced requests in separate buckets. -func (b *traceBucket) Copy(tracedOnly bool) traceList { - b.mu.RLock() - defer b.mu.RUnlock() - - trl := make(traceList, 0, b.length) - for i, x := 0, b.start; i < b.length; i++ { - tr := b.buf[x] - if !tracedOnly || tr.spanID != 0 { - tr.ref() - trl = append(trl, tr) - } - x++ - if x == b.length { - x = 0 - } - } - return trl -} - -func (b *traceBucket) Empty() bool { - b.mu.RLock() - defer b.mu.RUnlock() - return b.length == 0 -} - -// cond represents a condition on a trace. -type cond interface { - match(t *trace) bool - String() string -} - -type minCond time.Duration - -func (m minCond) match(t *trace) bool { return t.Elapsed >= time.Duration(m) } -func (m minCond) String() string { return fmt.Sprintf("≥%gs", time.Duration(m).Seconds()) } - -type errorCond struct{} - -func (e errorCond) match(t *trace) bool { return t.IsError } -func (e errorCond) String() string { return "errors" } - -type traceList []*trace - -// Free calls unref on each element of the list. -func (trl traceList) Free() { - for _, t := range trl { - t.unref() - } -} - -// traceList may be sorted in reverse chronological order. -func (trl traceList) Len() int { return len(trl) } -func (trl traceList) Less(i, j int) bool { return trl[i].Start.After(trl[j].Start) } -func (trl traceList) Swap(i, j int) { trl[i], trl[j] = trl[j], trl[i] } - -// An event is a timestamped log entry in a trace. -type event struct { - When time.Time - Elapsed time.Duration // since previous event in trace - NewDay bool // whether this event is on a different day to the previous event - Recyclable bool // whether this event was passed via LazyLog - Sensitive bool // whether this event contains sensitive information - What interface{} // string or fmt.Stringer -} - -// WhenString returns a string representation of the elapsed time of the event. -// It will include the date if midnight was crossed. -func (e event) WhenString() string { - if e.NewDay { - return e.When.Format("2006/01/02 15:04:05.000000") - } - return e.When.Format("15:04:05.000000") -} - -// discarded represents a number of discarded events. -// It is stored as *discarded to make it easier to update in-place. -type discarded int - -func (d *discarded) String() string { - return fmt.Sprintf("(%d events discarded)", int(*d)) -} - -// trace represents an active or complete request, -// either sent or received by this program. -type trace struct { - // Family is the top-level grouping of traces to which this belongs. - Family string - - // Title is the title of this trace. - Title string - - // Timing information. - Start time.Time - Elapsed time.Duration // zero while active - - // Trace information if non-zero. - traceID uint64 - spanID uint64 - - // Whether this trace resulted in an error. - IsError bool - - // Append-only sequence of events (modulo discards). - mu sync.RWMutex - events []event - maxEvents int - - refs int32 // how many buckets this is in - recycler func(interface{}) - disc discarded // scratch space to avoid allocation - - finishStack []byte // where finish was called, if DebugUseAfterFinish is set - - eventsBuf [4]event // preallocated buffer in case we only log a few events -} - -func (tr *trace) reset() { - // Clear all but the mutex. Mutexes may not be copied, even when unlocked. - tr.Family = "" - tr.Title = "" - tr.Start = time.Time{} - tr.Elapsed = 0 - tr.traceID = 0 - tr.spanID = 0 - tr.IsError = false - tr.maxEvents = 0 - tr.events = nil - tr.refs = 0 - tr.recycler = nil - tr.disc = 0 - tr.finishStack = nil - for i := range tr.eventsBuf { - tr.eventsBuf[i] = event{} - } -} - -// delta returns the elapsed time since the last event or the trace start, -// and whether it spans midnight. -// L >= tr.mu -func (tr *trace) delta(t time.Time) (time.Duration, bool) { - if len(tr.events) == 0 { - return t.Sub(tr.Start), false - } - prev := tr.events[len(tr.events)-1].When - return t.Sub(prev), prev.Day() != t.Day() -} - -func (tr *trace) addEvent(x interface{}, recyclable, sensitive bool) { - if DebugUseAfterFinish && tr.finishStack != nil { - buf := make([]byte, 4<<10) // 4 KB should be enough - n := runtime.Stack(buf, false) - log.Printf("net/trace: trace used after finish:\nFinished at:\n%s\nUsed at:\n%s", tr.finishStack, buf[:n]) - } - - /* - NOTE TO DEBUGGERS - - If you are here because your program panicked in this code, - it is almost definitely the fault of code using this package, - and very unlikely to be the fault of this code. - - The most likely scenario is that some code elsewhere is using - a trace.Trace after its Finish method is called. - You can temporarily set the DebugUseAfterFinish var - to help discover where that is; do not leave that var set, - since it makes this package much less efficient. - */ - - e := event{When: time.Now(), What: x, Recyclable: recyclable, Sensitive: sensitive} - tr.mu.Lock() - e.Elapsed, e.NewDay = tr.delta(e.When) - if len(tr.events) < tr.maxEvents { - tr.events = append(tr.events, e) - } else { - // Discard the middle events. - di := int((tr.maxEvents - 1) / 2) - if d, ok := tr.events[di].What.(*discarded); ok { - (*d)++ - } else { - // disc starts at two to count for the event it is replacing, - // plus the next one that we are about to drop. - tr.disc = 2 - if tr.recycler != nil && tr.events[di].Recyclable { - go tr.recycler(tr.events[di].What) - } - tr.events[di].What = &tr.disc - } - // The timestamp of the discarded meta-event should be - // the time of the last event it is representing. - tr.events[di].When = tr.events[di+1].When - - if tr.recycler != nil && tr.events[di+1].Recyclable { - go tr.recycler(tr.events[di+1].What) - } - copy(tr.events[di+1:], tr.events[di+2:]) - tr.events[tr.maxEvents-1] = e - } - tr.mu.Unlock() -} - -func (tr *trace) LazyLog(x fmt.Stringer, sensitive bool) { - tr.addEvent(x, true, sensitive) -} - -func (tr *trace) LazyPrintf(format string, a ...interface{}) { - tr.addEvent(&lazySprintf{format, a}, false, false) -} - -func (tr *trace) SetError() { tr.IsError = true } - -func (tr *trace) SetRecycler(f func(interface{})) { - tr.recycler = f -} - -func (tr *trace) SetTraceInfo(traceID, spanID uint64) { - tr.traceID, tr.spanID = traceID, spanID -} - -func (tr *trace) SetMaxEvents(m int) { - // Always keep at least three events: first, discarded count, last. - if len(tr.events) == 0 && m > 3 { - tr.maxEvents = m - } -} - -func (tr *trace) ref() { - atomic.AddInt32(&tr.refs, 1) -} - -func (tr *trace) unref() { - if atomic.AddInt32(&tr.refs, -1) == 0 { - if tr.recycler != nil { - // freeTrace clears tr, so we hold tr.recycler and tr.events here. - go func(f func(interface{}), es []event) { - for _, e := range es { - if e.Recyclable { - f(e.What) - } - } - }(tr.recycler, tr.events) - } - - freeTrace(tr) - } -} - -func (tr *trace) When() string { - return tr.Start.Format("2006/01/02 15:04:05.000000") -} - -func (tr *trace) ElapsedTime() string { - t := tr.Elapsed - if t == 0 { - // Active trace. - t = time.Since(tr.Start) - } - return fmt.Sprintf("%.6f", t.Seconds()) -} - -func (tr *trace) Events() []event { - tr.mu.RLock() - defer tr.mu.RUnlock() - return tr.events -} - -var traceFreeList = make(chan *trace, 1000) // TODO(dsymonds): Use sync.Pool? - -// newTrace returns a trace ready to use. -func newTrace() *trace { - select { - case tr := <-traceFreeList: - return tr - default: - return new(trace) - } -} - -// freeTrace adds tr to traceFreeList if there's room. -// This is non-blocking. -func freeTrace(tr *trace) { - if DebugUseAfterFinish { - return // never reuse - } - tr.reset() - select { - case traceFreeList <- tr: - default: - } -} - -func elapsed(d time.Duration) string { - b := []byte(fmt.Sprintf("%.6f", d.Seconds())) - - // For subsecond durations, blank all zeros before decimal point, - // and all zeros between the decimal point and the first non-zero digit. - if d < time.Second { - dot := bytes.IndexByte(b, '.') - for i := 0; i < dot; i++ { - b[i] = ' ' - } - for i := dot + 1; i < len(b); i++ { - if b[i] == '0' { - b[i] = ' ' - } else { - break - } - } - } - - return string(b) -} - -var pageTmplCache *template.Template -var pageTmplOnce sync.Once - -func pageTmpl() *template.Template { - pageTmplOnce.Do(func() { - pageTmplCache = template.Must(template.New("Page").Funcs(template.FuncMap{ - "elapsed": elapsed, - "add": func(a, b int) int { return a + b }, - }).Parse(pageHTML)) - }) - return pageTmplCache -} - -const pageHTML = ` -{{template "Prolog" .}} -{{template "StatusTable" .}} -{{template "Epilog" .}} - -{{define "Prolog"}} - - - /debug/requests - - - - -

    /debug/requests

    -{{end}} {{/* end of Prolog */}} - -{{define "StatusTable"}} - - {{range $fam := .Families}} - - - - {{$n := index $.ActiveTraceCount $fam}} - - - {{$f := index $.CompletedTraces $fam}} - {{range $i, $b := $f.Buckets}} - {{$empty := $b.Empty}} - - {{end}} - - {{$nb := len $f.Buckets}} - - - - - - {{end}} -
    {{$fam}} - {{if $n}}{{end}} - [{{$n}} active] - {{if $n}}{{end}} - - {{if not $empty}}{{end}} - [{{.Cond}}] - {{if not $empty}}{{end}} - - [minute] - - [hour] - - [total] -
    -{{end}} {{/* end of StatusTable */}} - -{{define "Epilog"}} -{{if $.Traces}} -
    -

    Family: {{$.Family}}

    - -{{if or $.Expanded $.Traced}} - [Normal/Summary] -{{else}} - [Normal/Summary] -{{end}} - -{{if or (not $.Expanded) $.Traced}} - [Normal/Expanded] -{{else}} - [Normal/Expanded] -{{end}} - -{{if not $.Active}} - {{if or $.Expanded (not $.Traced)}} - [Traced/Summary] - {{else}} - [Traced/Summary] - {{end}} - {{if or (not $.Expanded) (not $.Traced)}} - [Traced/Expanded] - {{else}} - [Traced/Expanded] - {{end}} -{{end}} - -{{if $.Total}} -

    Showing {{len $.Traces}} of {{$.Total}} traces.

    -{{end}} - - - - - {{range $tr := $.Traces}} - - - - - {{/* TODO: include traceID/spanID */}} - - {{if $.Expanded}} - {{range $tr.Events}} - - - - - - {{end}} - {{end}} - {{end}} -
    - {{if $.Active}}Active{{else}}Completed{{end}} Requests -
    WhenElapsed (s)
    {{$tr.When}}{{$tr.ElapsedTime}}{{$tr.Title}}
    {{.WhenString}}{{elapsed .Elapsed}}{{if or $.ShowSensitive (not .Sensitive)}}... {{.What}}{{else}}[redacted]{{end}}
    -{{end}} {{/* if $.Traces */}} - -{{if $.Histogram}} -

    Latency (µs) of {{$.Family}} over {{$.HistogramWindow}}

    -{{$.Histogram}} -{{end}} {{/* if $.Histogram */}} - - - -{{end}} {{/* end of Epilog */}} -` diff --git a/vendor/golang.org/x/net/trace/trace_go16.go b/vendor/golang.org/x/net/trace/trace_go16.go deleted file mode 100644 index d60819118..000000000 --- a/vendor/golang.org/x/net/trace/trace_go16.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.7 - -package trace - -import "golang.org/x/net/context" - -// NewContext returns a copy of the parent context -// and associates it with a Trace. -func NewContext(ctx context.Context, tr Trace) context.Context { - return context.WithValue(ctx, contextKey, tr) -} - -// FromContext returns the Trace bound to the context, if any. -func FromContext(ctx context.Context) (tr Trace, ok bool) { - tr, ok = ctx.Value(contextKey).(Trace) - return -} diff --git a/vendor/golang.org/x/net/trace/trace_go17.go b/vendor/golang.org/x/net/trace/trace_go17.go deleted file mode 100644 index df6e1fba7..000000000 --- a/vendor/golang.org/x/net/trace/trace_go17.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7 - -package trace - -import "context" - -// NewContext returns a copy of the parent context -// and associates it with a Trace. -func NewContext(ctx context.Context, tr Trace) context.Context { - return context.WithValue(ctx, contextKey, tr) -} - -// FromContext returns the Trace bound to the context, if any. -func FromContext(ctx context.Context) (tr Trace, ok bool) { - tr, ok = ctx.Value(contextKey).(Trace) - return -} diff --git a/vendor/golang.org/x/net/trace/trace_test.go b/vendor/golang.org/x/net/trace/trace_test.go deleted file mode 100644 index bfd9dfe94..000000000 --- a/vendor/golang.org/x/net/trace/trace_test.go +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package trace - -import ( - "net/http" - "reflect" - "testing" -) - -type s struct{} - -func (s) String() string { return "lazy string" } - -// TestReset checks whether all the fields are zeroed after reset. -func TestReset(t *testing.T) { - tr := New("foo", "bar") - tr.LazyLog(s{}, false) - tr.LazyPrintf("%d", 1) - tr.SetRecycler(func(_ interface{}) {}) - tr.SetTraceInfo(3, 4) - tr.SetMaxEvents(100) - tr.SetError() - tr.Finish() - - tr.(*trace).reset() - - if !reflect.DeepEqual(tr, new(trace)) { - t.Errorf("reset didn't clear all fields: %+v", tr) - } -} - -// TestResetLog checks whether all the fields are zeroed after reset. -func TestResetLog(t *testing.T) { - el := NewEventLog("foo", "bar") - el.Printf("message") - el.Errorf("error") - el.Finish() - - el.(*eventLog).reset() - - if !reflect.DeepEqual(el, new(eventLog)) { - t.Errorf("reset didn't clear all fields: %+v", el) - } -} - -func TestAuthRequest(t *testing.T) { - testCases := []struct { - host string - want bool - }{ - {host: "192.168.23.1", want: false}, - {host: "192.168.23.1:8080", want: false}, - {host: "malformed remote addr", want: false}, - {host: "localhost", want: true}, - {host: "localhost:8080", want: true}, - {host: "127.0.0.1", want: true}, - {host: "127.0.0.1:8080", want: true}, - {host: "::1", want: true}, - {host: "[::1]:8080", want: true}, - } - for _, tt := range testCases { - req := &http.Request{RemoteAddr: tt.host} - any, sensitive := AuthRequest(req) - if any != tt.want || sensitive != tt.want { - t.Errorf("AuthRequest(%q) = %t, %t; want %t, %t", tt.host, any, sensitive, tt.want, tt.want) - } - } -} - -// TestParseTemplate checks that all templates used by this package are valid -// as they are parsed on first usage -func TestParseTemplate(t *testing.T) { - if tmpl := distTmpl(); tmpl == nil { - t.Error("invalid template returned from distTmpl()") - } - if tmpl := pageTmpl(); tmpl == nil { - t.Error("invalid template returned from pageTmpl()") - } - if tmpl := eventsTmpl(); tmpl == nil { - t.Error("invalid template returned from eventsTmpl()") - } -} - -func benchmarkTrace(b *testing.B, maxEvents, numEvents int) { - numSpans := (b.N + numEvents + 1) / numEvents - - for i := 0; i < numSpans; i++ { - tr := New("test", "test") - tr.SetMaxEvents(maxEvents) - for j := 0; j < numEvents; j++ { - tr.LazyPrintf("%d", j) - } - tr.Finish() - } -} - -func BenchmarkTrace_Default_2(b *testing.B) { - benchmarkTrace(b, 0, 2) -} - -func BenchmarkTrace_Default_10(b *testing.B) { - benchmarkTrace(b, 0, 10) -} - -func BenchmarkTrace_Default_100(b *testing.B) { - benchmarkTrace(b, 0, 100) -} - -func BenchmarkTrace_Default_1000(b *testing.B) { - benchmarkTrace(b, 0, 1000) -} - -func BenchmarkTrace_Default_10000(b *testing.B) { - benchmarkTrace(b, 0, 10000) -} - -func BenchmarkTrace_10_2(b *testing.B) { - benchmarkTrace(b, 10, 2) -} - -func BenchmarkTrace_10_10(b *testing.B) { - benchmarkTrace(b, 10, 10) -} - -func BenchmarkTrace_10_100(b *testing.B) { - benchmarkTrace(b, 10, 100) -} - -func BenchmarkTrace_10_1000(b *testing.B) { - benchmarkTrace(b, 10, 1000) -} - -func BenchmarkTrace_10_10000(b *testing.B) { - benchmarkTrace(b, 10, 10000) -} - -func BenchmarkTrace_100_2(b *testing.B) { - benchmarkTrace(b, 100, 2) -} - -func BenchmarkTrace_100_10(b *testing.B) { - benchmarkTrace(b, 100, 10) -} - -func BenchmarkTrace_100_100(b *testing.B) { - benchmarkTrace(b, 100, 100) -} - -func BenchmarkTrace_100_1000(b *testing.B) { - benchmarkTrace(b, 100, 1000) -} - -func BenchmarkTrace_100_10000(b *testing.B) { - benchmarkTrace(b, 100, 10000) -} - -func BenchmarkTrace_1000_2(b *testing.B) { - benchmarkTrace(b, 1000, 2) -} - -func BenchmarkTrace_1000_10(b *testing.B) { - benchmarkTrace(b, 1000, 10) -} - -func BenchmarkTrace_1000_100(b *testing.B) { - benchmarkTrace(b, 1000, 100) -} - -func BenchmarkTrace_1000_1000(b *testing.B) { - benchmarkTrace(b, 1000, 1000) -} - -func BenchmarkTrace_1000_10000(b *testing.B) { - benchmarkTrace(b, 1000, 10000) -} diff --git a/vendor/golang.org/x/net/webdav/file.go b/vendor/golang.org/x/net/webdav/file.go deleted file mode 100644 index 748118dd3..000000000 --- a/vendor/golang.org/x/net/webdav/file.go +++ /dev/null @@ -1,796 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "encoding/xml" - "io" - "net/http" - "os" - "path" - "path/filepath" - "strings" - "sync" - "time" - - "golang.org/x/net/context" -) - -// slashClean is equivalent to but slightly more efficient than -// path.Clean("/" + name). -func slashClean(name string) string { - if name == "" || name[0] != '/' { - name = "/" + name - } - return path.Clean(name) -} - -// A FileSystem implements access to a collection of named files. The elements -// in a file path are separated by slash ('/', U+002F) characters, regardless -// of host operating system convention. -// -// Each method has the same semantics as the os package's function of the same -// name. -// -// Note that the os.Rename documentation says that "OS-specific restrictions -// might apply". In particular, whether or not renaming a file or directory -// overwriting another existing file or directory is an error is OS-dependent. -type FileSystem interface { - Mkdir(ctx context.Context, name string, perm os.FileMode) error - OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) - RemoveAll(ctx context.Context, name string) error - Rename(ctx context.Context, oldName, newName string) error - Stat(ctx context.Context, name string) (os.FileInfo, error) -} - -// A File is returned by a FileSystem's OpenFile method and can be served by a -// Handler. -// -// A File may optionally implement the DeadPropsHolder interface, if it can -// load and save dead properties. -type File interface { - http.File - io.Writer -} - -// A Dir implements FileSystem using the native file system restricted to a -// specific directory tree. -// -// While the FileSystem.OpenFile method takes '/'-separated paths, a Dir's -// string value is a filename on the native file system, not a URL, so it is -// separated by filepath.Separator, which isn't necessarily '/'. -// -// An empty Dir is treated as ".". -type Dir string - -func (d Dir) resolve(name string) string { - // This implementation is based on Dir.Open's code in the standard net/http package. - if filepath.Separator != '/' && strings.IndexRune(name, filepath.Separator) >= 0 || - strings.Contains(name, "\x00") { - return "" - } - dir := string(d) - if dir == "" { - dir = "." - } - return filepath.Join(dir, filepath.FromSlash(slashClean(name))) -} - -func (d Dir) Mkdir(ctx context.Context, name string, perm os.FileMode) error { - if name = d.resolve(name); name == "" { - return os.ErrNotExist - } - return os.Mkdir(name, perm) -} - -func (d Dir) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { - if name = d.resolve(name); name == "" { - return nil, os.ErrNotExist - } - f, err := os.OpenFile(name, flag, perm) - if err != nil { - return nil, err - } - return f, nil -} - -func (d Dir) RemoveAll(ctx context.Context, name string) error { - if name = d.resolve(name); name == "" { - return os.ErrNotExist - } - if name == filepath.Clean(string(d)) { - // Prohibit removing the virtual root directory. - return os.ErrInvalid - } - return os.RemoveAll(name) -} - -func (d Dir) Rename(ctx context.Context, oldName, newName string) error { - if oldName = d.resolve(oldName); oldName == "" { - return os.ErrNotExist - } - if newName = d.resolve(newName); newName == "" { - return os.ErrNotExist - } - if root := filepath.Clean(string(d)); root == oldName || root == newName { - // Prohibit renaming from or to the virtual root directory. - return os.ErrInvalid - } - return os.Rename(oldName, newName) -} - -func (d Dir) Stat(ctx context.Context, name string) (os.FileInfo, error) { - if name = d.resolve(name); name == "" { - return nil, os.ErrNotExist - } - return os.Stat(name) -} - -// NewMemFS returns a new in-memory FileSystem implementation. -func NewMemFS() FileSystem { - return &memFS{ - root: memFSNode{ - children: make(map[string]*memFSNode), - mode: 0660 | os.ModeDir, - modTime: time.Now(), - }, - } -} - -// A memFS implements FileSystem, storing all metadata and actual file data -// in-memory. No limits on filesystem size are used, so it is not recommended -// this be used where the clients are untrusted. -// -// Concurrent access is permitted. The tree structure is protected by a mutex, -// and each node's contents and metadata are protected by a per-node mutex. -// -// TODO: Enforce file permissions. -type memFS struct { - mu sync.Mutex - root memFSNode -} - -// TODO: clean up and rationalize the walk/find code. - -// walk walks the directory tree for the fullname, calling f at each step. If f -// returns an error, the walk will be aborted and return that same error. -// -// dir is the directory at that step, frag is the name fragment, and final is -// whether it is the final step. For example, walking "/foo/bar/x" will result -// in 3 calls to f: -// - "/", "foo", false -// - "/foo/", "bar", false -// - "/foo/bar/", "x", true -// The frag argument will be empty only if dir is the root node and the walk -// ends at that root node. -func (fs *memFS) walk(op, fullname string, f func(dir *memFSNode, frag string, final bool) error) error { - original := fullname - fullname = slashClean(fullname) - - // Strip any leading "/"s to make fullname a relative path, as the walk - // starts at fs.root. - if fullname[0] == '/' { - fullname = fullname[1:] - } - dir := &fs.root - - for { - frag, remaining := fullname, "" - i := strings.IndexRune(fullname, '/') - final := i < 0 - if !final { - frag, remaining = fullname[:i], fullname[i+1:] - } - if frag == "" && dir != &fs.root { - panic("webdav: empty path fragment for a clean path") - } - if err := f(dir, frag, final); err != nil { - return &os.PathError{ - Op: op, - Path: original, - Err: err, - } - } - if final { - break - } - child := dir.children[frag] - if child == nil { - return &os.PathError{ - Op: op, - Path: original, - Err: os.ErrNotExist, - } - } - if !child.mode.IsDir() { - return &os.PathError{ - Op: op, - Path: original, - Err: os.ErrInvalid, - } - } - dir, fullname = child, remaining - } - return nil -} - -// find returns the parent of the named node and the relative name fragment -// from the parent to the child. For example, if finding "/foo/bar/baz" then -// parent will be the node for "/foo/bar" and frag will be "baz". -// -// If the fullname names the root node, then parent, frag and err will be zero. -// -// find returns an error if the parent does not already exist or the parent -// isn't a directory, but it will not return an error per se if the child does -// not already exist. The error returned is either nil or an *os.PathError -// whose Op is op. -func (fs *memFS) find(op, fullname string) (parent *memFSNode, frag string, err error) { - err = fs.walk(op, fullname, func(parent0 *memFSNode, frag0 string, final bool) error { - if !final { - return nil - } - if frag0 != "" { - parent, frag = parent0, frag0 - } - return nil - }) - return parent, frag, err -} - -func (fs *memFS) Mkdir(ctx context.Context, name string, perm os.FileMode) error { - fs.mu.Lock() - defer fs.mu.Unlock() - - dir, frag, err := fs.find("mkdir", name) - if err != nil { - return err - } - if dir == nil { - // We can't create the root. - return os.ErrInvalid - } - if _, ok := dir.children[frag]; ok { - return os.ErrExist - } - dir.children[frag] = &memFSNode{ - children: make(map[string]*memFSNode), - mode: perm.Perm() | os.ModeDir, - modTime: time.Now(), - } - return nil -} - -func (fs *memFS) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { - fs.mu.Lock() - defer fs.mu.Unlock() - - dir, frag, err := fs.find("open", name) - if err != nil { - return nil, err - } - var n *memFSNode - if dir == nil { - // We're opening the root. - if flag&(os.O_WRONLY|os.O_RDWR) != 0 { - return nil, os.ErrPermission - } - n, frag = &fs.root, "/" - - } else { - n = dir.children[frag] - if flag&(os.O_SYNC|os.O_APPEND) != 0 { - // memFile doesn't support these flags yet. - return nil, os.ErrInvalid - } - if flag&os.O_CREATE != 0 { - if flag&os.O_EXCL != 0 && n != nil { - return nil, os.ErrExist - } - if n == nil { - n = &memFSNode{ - mode: perm.Perm(), - } - dir.children[frag] = n - } - } - if n == nil { - return nil, os.ErrNotExist - } - if flag&(os.O_WRONLY|os.O_RDWR) != 0 && flag&os.O_TRUNC != 0 { - n.mu.Lock() - n.data = nil - n.mu.Unlock() - } - } - - children := make([]os.FileInfo, 0, len(n.children)) - for cName, c := range n.children { - children = append(children, c.stat(cName)) - } - return &memFile{ - n: n, - nameSnapshot: frag, - childrenSnapshot: children, - }, nil -} - -func (fs *memFS) RemoveAll(ctx context.Context, name string) error { - fs.mu.Lock() - defer fs.mu.Unlock() - - dir, frag, err := fs.find("remove", name) - if err != nil { - return err - } - if dir == nil { - // We can't remove the root. - return os.ErrInvalid - } - delete(dir.children, frag) - return nil -} - -func (fs *memFS) Rename(ctx context.Context, oldName, newName string) error { - fs.mu.Lock() - defer fs.mu.Unlock() - - oldName = slashClean(oldName) - newName = slashClean(newName) - if oldName == newName { - return nil - } - if strings.HasPrefix(newName, oldName+"/") { - // We can't rename oldName to be a sub-directory of itself. - return os.ErrInvalid - } - - oDir, oFrag, err := fs.find("rename", oldName) - if err != nil { - return err - } - if oDir == nil { - // We can't rename from the root. - return os.ErrInvalid - } - - nDir, nFrag, err := fs.find("rename", newName) - if err != nil { - return err - } - if nDir == nil { - // We can't rename to the root. - return os.ErrInvalid - } - - oNode, ok := oDir.children[oFrag] - if !ok { - return os.ErrNotExist - } - if oNode.children != nil { - if nNode, ok := nDir.children[nFrag]; ok { - if nNode.children == nil { - return errNotADirectory - } - if len(nNode.children) != 0 { - return errDirectoryNotEmpty - } - } - } - delete(oDir.children, oFrag) - nDir.children[nFrag] = oNode - return nil -} - -func (fs *memFS) Stat(ctx context.Context, name string) (os.FileInfo, error) { - fs.mu.Lock() - defer fs.mu.Unlock() - - dir, frag, err := fs.find("stat", name) - if err != nil { - return nil, err - } - if dir == nil { - // We're stat'ting the root. - return fs.root.stat("/"), nil - } - if n, ok := dir.children[frag]; ok { - return n.stat(path.Base(name)), nil - } - return nil, os.ErrNotExist -} - -// A memFSNode represents a single entry in the in-memory filesystem and also -// implements os.FileInfo. -type memFSNode struct { - // children is protected by memFS.mu. - children map[string]*memFSNode - - mu sync.Mutex - data []byte - mode os.FileMode - modTime time.Time - deadProps map[xml.Name]Property -} - -func (n *memFSNode) stat(name string) *memFileInfo { - n.mu.Lock() - defer n.mu.Unlock() - return &memFileInfo{ - name: name, - size: int64(len(n.data)), - mode: n.mode, - modTime: n.modTime, - } -} - -func (n *memFSNode) DeadProps() (map[xml.Name]Property, error) { - n.mu.Lock() - defer n.mu.Unlock() - if len(n.deadProps) == 0 { - return nil, nil - } - ret := make(map[xml.Name]Property, len(n.deadProps)) - for k, v := range n.deadProps { - ret[k] = v - } - return ret, nil -} - -func (n *memFSNode) Patch(patches []Proppatch) ([]Propstat, error) { - n.mu.Lock() - defer n.mu.Unlock() - pstat := Propstat{Status: http.StatusOK} - for _, patch := range patches { - for _, p := range patch.Props { - pstat.Props = append(pstat.Props, Property{XMLName: p.XMLName}) - if patch.Remove { - delete(n.deadProps, p.XMLName) - continue - } - if n.deadProps == nil { - n.deadProps = map[xml.Name]Property{} - } - n.deadProps[p.XMLName] = p - } - } - return []Propstat{pstat}, nil -} - -type memFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (f *memFileInfo) Name() string { return f.name } -func (f *memFileInfo) Size() int64 { return f.size } -func (f *memFileInfo) Mode() os.FileMode { return f.mode } -func (f *memFileInfo) ModTime() time.Time { return f.modTime } -func (f *memFileInfo) IsDir() bool { return f.mode.IsDir() } -func (f *memFileInfo) Sys() interface{} { return nil } - -// A memFile is a File implementation for a memFSNode. It is a per-file (not -// per-node) read/write position, and a snapshot of the memFS' tree structure -// (a node's name and children) for that node. -type memFile struct { - n *memFSNode - nameSnapshot string - childrenSnapshot []os.FileInfo - // pos is protected by n.mu. - pos int -} - -// A *memFile implements the optional DeadPropsHolder interface. -var _ DeadPropsHolder = (*memFile)(nil) - -func (f *memFile) DeadProps() (map[xml.Name]Property, error) { return f.n.DeadProps() } -func (f *memFile) Patch(patches []Proppatch) ([]Propstat, error) { return f.n.Patch(patches) } - -func (f *memFile) Close() error { - return nil -} - -func (f *memFile) Read(p []byte) (int, error) { - f.n.mu.Lock() - defer f.n.mu.Unlock() - if f.n.mode.IsDir() { - return 0, os.ErrInvalid - } - if f.pos >= len(f.n.data) { - return 0, io.EOF - } - n := copy(p, f.n.data[f.pos:]) - f.pos += n - return n, nil -} - -func (f *memFile) Readdir(count int) ([]os.FileInfo, error) { - f.n.mu.Lock() - defer f.n.mu.Unlock() - if !f.n.mode.IsDir() { - return nil, os.ErrInvalid - } - old := f.pos - if old >= len(f.childrenSnapshot) { - // The os.File Readdir docs say that at the end of a directory, - // the error is io.EOF if count > 0 and nil if count <= 0. - if count > 0 { - return nil, io.EOF - } - return nil, nil - } - if count > 0 { - f.pos += count - if f.pos > len(f.childrenSnapshot) { - f.pos = len(f.childrenSnapshot) - } - } else { - f.pos = len(f.childrenSnapshot) - old = 0 - } - return f.childrenSnapshot[old:f.pos], nil -} - -func (f *memFile) Seek(offset int64, whence int) (int64, error) { - f.n.mu.Lock() - defer f.n.mu.Unlock() - npos := f.pos - // TODO: How to handle offsets greater than the size of system int? - switch whence { - case os.SEEK_SET: - npos = int(offset) - case os.SEEK_CUR: - npos += int(offset) - case os.SEEK_END: - npos = len(f.n.data) + int(offset) - default: - npos = -1 - } - if npos < 0 { - return 0, os.ErrInvalid - } - f.pos = npos - return int64(f.pos), nil -} - -func (f *memFile) Stat() (os.FileInfo, error) { - return f.n.stat(f.nameSnapshot), nil -} - -func (f *memFile) Write(p []byte) (int, error) { - lenp := len(p) - f.n.mu.Lock() - defer f.n.mu.Unlock() - - if f.n.mode.IsDir() { - return 0, os.ErrInvalid - } - if f.pos < len(f.n.data) { - n := copy(f.n.data[f.pos:], p) - f.pos += n - p = p[n:] - } else if f.pos > len(f.n.data) { - // Write permits the creation of holes, if we've seek'ed past the - // existing end of file. - if f.pos <= cap(f.n.data) { - oldLen := len(f.n.data) - f.n.data = f.n.data[:f.pos] - hole := f.n.data[oldLen:] - for i := range hole { - hole[i] = 0 - } - } else { - d := make([]byte, f.pos, f.pos+len(p)) - copy(d, f.n.data) - f.n.data = d - } - } - - if len(p) > 0 { - // We should only get here if f.pos == len(f.n.data). - f.n.data = append(f.n.data, p...) - f.pos = len(f.n.data) - } - f.n.modTime = time.Now() - return lenp, nil -} - -// moveFiles moves files and/or directories from src to dst. -// -// See section 9.9.4 for when various HTTP status codes apply. -func moveFiles(ctx context.Context, fs FileSystem, src, dst string, overwrite bool) (status int, err error) { - created := false - if _, err := fs.Stat(ctx, dst); err != nil { - if !os.IsNotExist(err) { - return http.StatusForbidden, err - } - created = true - } else if overwrite { - // Section 9.9.3 says that "If a resource exists at the destination - // and the Overwrite header is "T", then prior to performing the move, - // the server must perform a DELETE with "Depth: infinity" on the - // destination resource. - if err := fs.RemoveAll(ctx, dst); err != nil { - return http.StatusForbidden, err - } - } else { - return http.StatusPreconditionFailed, os.ErrExist - } - if err := fs.Rename(ctx, src, dst); err != nil { - return http.StatusForbidden, err - } - if created { - return http.StatusCreated, nil - } - return http.StatusNoContent, nil -} - -func copyProps(dst, src File) error { - d, ok := dst.(DeadPropsHolder) - if !ok { - return nil - } - s, ok := src.(DeadPropsHolder) - if !ok { - return nil - } - m, err := s.DeadProps() - if err != nil { - return err - } - props := make([]Property, 0, len(m)) - for _, prop := range m { - props = append(props, prop) - } - _, err = d.Patch([]Proppatch{{Props: props}}) - return err -} - -// copyFiles copies files and/or directories from src to dst. -// -// See section 9.8.5 for when various HTTP status codes apply. -func copyFiles(ctx context.Context, fs FileSystem, src, dst string, overwrite bool, depth int, recursion int) (status int, err error) { - if recursion == 1000 { - return http.StatusInternalServerError, errRecursionTooDeep - } - recursion++ - - // TODO: section 9.8.3 says that "Note that an infinite-depth COPY of /A/ - // into /A/B/ could lead to infinite recursion if not handled correctly." - - srcFile, err := fs.OpenFile(ctx, src, os.O_RDONLY, 0) - if err != nil { - if os.IsNotExist(err) { - return http.StatusNotFound, err - } - return http.StatusInternalServerError, err - } - defer srcFile.Close() - srcStat, err := srcFile.Stat() - if err != nil { - if os.IsNotExist(err) { - return http.StatusNotFound, err - } - return http.StatusInternalServerError, err - } - srcPerm := srcStat.Mode() & os.ModePerm - - created := false - if _, err := fs.Stat(ctx, dst); err != nil { - if os.IsNotExist(err) { - created = true - } else { - return http.StatusForbidden, err - } - } else { - if !overwrite { - return http.StatusPreconditionFailed, os.ErrExist - } - if err := fs.RemoveAll(ctx, dst); err != nil && !os.IsNotExist(err) { - return http.StatusForbidden, err - } - } - - if srcStat.IsDir() { - if err := fs.Mkdir(ctx, dst, srcPerm); err != nil { - return http.StatusForbidden, err - } - if depth == infiniteDepth { - children, err := srcFile.Readdir(-1) - if err != nil { - return http.StatusForbidden, err - } - for _, c := range children { - name := c.Name() - s := path.Join(src, name) - d := path.Join(dst, name) - cStatus, cErr := copyFiles(ctx, fs, s, d, overwrite, depth, recursion) - if cErr != nil { - // TODO: MultiStatus. - return cStatus, cErr - } - } - } - - } else { - dstFile, err := fs.OpenFile(ctx, dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, srcPerm) - if err != nil { - if os.IsNotExist(err) { - return http.StatusConflict, err - } - return http.StatusForbidden, err - - } - _, copyErr := io.Copy(dstFile, srcFile) - propsErr := copyProps(dstFile, srcFile) - closeErr := dstFile.Close() - if copyErr != nil { - return http.StatusInternalServerError, copyErr - } - if propsErr != nil { - return http.StatusInternalServerError, propsErr - } - if closeErr != nil { - return http.StatusInternalServerError, closeErr - } - } - - if created { - return http.StatusCreated, nil - } - return http.StatusNoContent, nil -} - -// walkFS traverses filesystem fs starting at name up to depth levels. -// -// Allowed values for depth are 0, 1 or infiniteDepth. For each visited node, -// walkFS calls walkFn. If a visited file system node is a directory and -// walkFn returns filepath.SkipDir, walkFS will skip traversal of this node. -func walkFS(ctx context.Context, fs FileSystem, depth int, name string, info os.FileInfo, walkFn filepath.WalkFunc) error { - // This implementation is based on Walk's code in the standard path/filepath package. - err := walkFn(name, info, nil) - if err != nil { - if info.IsDir() && err == filepath.SkipDir { - return nil - } - return err - } - if !info.IsDir() || depth == 0 { - return nil - } - if depth == 1 { - depth = 0 - } - - // Read directory names. - f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) - if err != nil { - return walkFn(name, info, err) - } - fileInfos, err := f.Readdir(0) - f.Close() - if err != nil { - return walkFn(name, info, err) - } - - for _, fileInfo := range fileInfos { - filename := path.Join(name, fileInfo.Name()) - fileInfo, err := fs.Stat(ctx, filename) - if err != nil { - if err := walkFn(filename, fileInfo, err); err != nil && err != filepath.SkipDir { - return err - } - } else { - err = walkFS(ctx, fs, depth, filename, fileInfo, walkFn) - if err != nil { - if !fileInfo.IsDir() || err != filepath.SkipDir { - return err - } - } - } - } - return nil -} diff --git a/vendor/golang.org/x/net/webdav/file_go1.6.go b/vendor/golang.org/x/net/webdav/file_go1.6.go deleted file mode 100644 index fa387700d..000000000 --- a/vendor/golang.org/x/net/webdav/file_go1.6.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.7 - -package webdav - -import ( - "net/http" - - "golang.org/x/net/context" -) - -func getContext(r *http.Request) context.Context { - return context.Background() -} diff --git a/vendor/golang.org/x/net/webdav/file_go1.7.go b/vendor/golang.org/x/net/webdav/file_go1.7.go deleted file mode 100644 index d1c3de832..000000000 --- a/vendor/golang.org/x/net/webdav/file_go1.7.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7 - -package webdav - -import ( - "context" - "net/http" -) - -func getContext(r *http.Request) context.Context { - return r.Context() -} diff --git a/vendor/golang.org/x/net/webdav/file_test.go b/vendor/golang.org/x/net/webdav/file_test.go deleted file mode 100644 index bfd96e193..000000000 --- a/vendor/golang.org/x/net/webdav/file_test.go +++ /dev/null @@ -1,1184 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "encoding/xml" - "fmt" - "io" - "io/ioutil" - "os" - "path" - "path/filepath" - "reflect" - "runtime" - "sort" - "strconv" - "strings" - "testing" - - "golang.org/x/net/context" -) - -func TestSlashClean(t *testing.T) { - testCases := []string{ - "", - ".", - "/", - "/./", - "//", - "//.", - "//a", - "/a", - "/a/b/c", - "/a//b/./../c/d/", - "a", - "a/b/c", - } - for _, tc := range testCases { - got := slashClean(tc) - want := path.Clean("/" + tc) - if got != want { - t.Errorf("tc=%q: got %q, want %q", tc, got, want) - } - } -} - -func TestDirResolve(t *testing.T) { - testCases := []struct { - dir, name, want string - }{ - {"/", "", "/"}, - {"/", "/", "/"}, - {"/", ".", "/"}, - {"/", "./a", "/a"}, - {"/", "..", "/"}, - {"/", "..", "/"}, - {"/", "../", "/"}, - {"/", "../.", "/"}, - {"/", "../a", "/a"}, - {"/", "../..", "/"}, - {"/", "../bar/a", "/bar/a"}, - {"/", "../baz/a", "/baz/a"}, - {"/", "...", "/..."}, - {"/", ".../a", "/.../a"}, - {"/", ".../..", "/"}, - {"/", "a", "/a"}, - {"/", "a/./b", "/a/b"}, - {"/", "a/../../b", "/b"}, - {"/", "a/../b", "/b"}, - {"/", "a/b", "/a/b"}, - {"/", "a/b/c/../../d", "/a/d"}, - {"/", "a/b/c/../../../d", "/d"}, - {"/", "a/b/c/../../../../d", "/d"}, - {"/", "a/b/c/d", "/a/b/c/d"}, - - {"/foo/bar", "", "/foo/bar"}, - {"/foo/bar", "/", "/foo/bar"}, - {"/foo/bar", ".", "/foo/bar"}, - {"/foo/bar", "./a", "/foo/bar/a"}, - {"/foo/bar", "..", "/foo/bar"}, - {"/foo/bar", "../", "/foo/bar"}, - {"/foo/bar", "../.", "/foo/bar"}, - {"/foo/bar", "../a", "/foo/bar/a"}, - {"/foo/bar", "../..", "/foo/bar"}, - {"/foo/bar", "../bar/a", "/foo/bar/bar/a"}, - {"/foo/bar", "../baz/a", "/foo/bar/baz/a"}, - {"/foo/bar", "...", "/foo/bar/..."}, - {"/foo/bar", ".../a", "/foo/bar/.../a"}, - {"/foo/bar", ".../..", "/foo/bar"}, - {"/foo/bar", "a", "/foo/bar/a"}, - {"/foo/bar", "a/./b", "/foo/bar/a/b"}, - {"/foo/bar", "a/../../b", "/foo/bar/b"}, - {"/foo/bar", "a/../b", "/foo/bar/b"}, - {"/foo/bar", "a/b", "/foo/bar/a/b"}, - {"/foo/bar", "a/b/c/../../d", "/foo/bar/a/d"}, - {"/foo/bar", "a/b/c/../../../d", "/foo/bar/d"}, - {"/foo/bar", "a/b/c/../../../../d", "/foo/bar/d"}, - {"/foo/bar", "a/b/c/d", "/foo/bar/a/b/c/d"}, - - {"/foo/bar/", "", "/foo/bar"}, - {"/foo/bar/", "/", "/foo/bar"}, - {"/foo/bar/", ".", "/foo/bar"}, - {"/foo/bar/", "./a", "/foo/bar/a"}, - {"/foo/bar/", "..", "/foo/bar"}, - - {"/foo//bar///", "", "/foo/bar"}, - {"/foo//bar///", "/", "/foo/bar"}, - {"/foo//bar///", ".", "/foo/bar"}, - {"/foo//bar///", "./a", "/foo/bar/a"}, - {"/foo//bar///", "..", "/foo/bar"}, - - {"/x/y/z", "ab/c\x00d/ef", ""}, - - {".", "", "."}, - {".", "/", "."}, - {".", ".", "."}, - {".", "./a", "a"}, - {".", "..", "."}, - {".", "..", "."}, - {".", "../", "."}, - {".", "../.", "."}, - {".", "../a", "a"}, - {".", "../..", "."}, - {".", "../bar/a", "bar/a"}, - {".", "../baz/a", "baz/a"}, - {".", "...", "..."}, - {".", ".../a", ".../a"}, - {".", ".../..", "."}, - {".", "a", "a"}, - {".", "a/./b", "a/b"}, - {".", "a/../../b", "b"}, - {".", "a/../b", "b"}, - {".", "a/b", "a/b"}, - {".", "a/b/c/../../d", "a/d"}, - {".", "a/b/c/../../../d", "d"}, - {".", "a/b/c/../../../../d", "d"}, - {".", "a/b/c/d", "a/b/c/d"}, - - {"", "", "."}, - {"", "/", "."}, - {"", ".", "."}, - {"", "./a", "a"}, - {"", "..", "."}, - } - - for _, tc := range testCases { - d := Dir(filepath.FromSlash(tc.dir)) - if got := filepath.ToSlash(d.resolve(tc.name)); got != tc.want { - t.Errorf("dir=%q, name=%q: got %q, want %q", tc.dir, tc.name, got, tc.want) - } - } -} - -func TestWalk(t *testing.T) { - type walkStep struct { - name, frag string - final bool - } - - testCases := []struct { - dir string - want []walkStep - }{ - {"", []walkStep{ - {"", "", true}, - }}, - {"/", []walkStep{ - {"", "", true}, - }}, - {"/a", []walkStep{ - {"", "a", true}, - }}, - {"/a/", []walkStep{ - {"", "a", true}, - }}, - {"/a/b", []walkStep{ - {"", "a", false}, - {"a", "b", true}, - }}, - {"/a/b/", []walkStep{ - {"", "a", false}, - {"a", "b", true}, - }}, - {"/a/b/c", []walkStep{ - {"", "a", false}, - {"a", "b", false}, - {"b", "c", true}, - }}, - // The following test case is the one mentioned explicitly - // in the method description. - {"/foo/bar/x", []walkStep{ - {"", "foo", false}, - {"foo", "bar", false}, - {"bar", "x", true}, - }}, - } - - ctx := context.Background() - - for _, tc := range testCases { - fs := NewMemFS().(*memFS) - - parts := strings.Split(tc.dir, "/") - for p := 2; p < len(parts); p++ { - d := strings.Join(parts[:p], "/") - if err := fs.Mkdir(ctx, d, 0666); err != nil { - t.Errorf("tc.dir=%q: mkdir: %q: %v", tc.dir, d, err) - } - } - - i, prevFrag := 0, "" - err := fs.walk("test", tc.dir, func(dir *memFSNode, frag string, final bool) error { - got := walkStep{ - name: prevFrag, - frag: frag, - final: final, - } - want := tc.want[i] - - if got != want { - return fmt.Errorf("got %+v, want %+v", got, want) - } - i, prevFrag = i+1, frag - return nil - }) - if err != nil { - t.Errorf("tc.dir=%q: %v", tc.dir, err) - } - } -} - -// find appends to ss the names of the named file and its children. It is -// analogous to the Unix find command. -// -// The returned strings are not guaranteed to be in any particular order. -func find(ctx context.Context, ss []string, fs FileSystem, name string) ([]string, error) { - stat, err := fs.Stat(ctx, name) - if err != nil { - return nil, err - } - ss = append(ss, name) - if stat.IsDir() { - f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) - if err != nil { - return nil, err - } - defer f.Close() - children, err := f.Readdir(-1) - if err != nil { - return nil, err - } - for _, c := range children { - ss, err = find(ctx, ss, fs, path.Join(name, c.Name())) - if err != nil { - return nil, err - } - } - } - return ss, nil -} - -func testFS(t *testing.T, fs FileSystem) { - errStr := func(err error) string { - switch { - case os.IsExist(err): - return "errExist" - case os.IsNotExist(err): - return "errNotExist" - case err != nil: - return "err" - } - return "ok" - } - - // The non-"find" non-"stat" test cases should change the file system state. The - // indentation of the "find"s and "stat"s helps distinguish such test cases. - testCases := []string{ - " stat / want dir", - " stat /a want errNotExist", - " stat /d want errNotExist", - " stat /d/e want errNotExist", - "create /a A want ok", - " stat /a want 1", - "create /d/e EEE want errNotExist", - "mk-dir /a want errExist", - "mk-dir /d/m want errNotExist", - "mk-dir /d want ok", - " stat /d want dir", - "create /d/e EEE want ok", - " stat /d/e want 3", - " find / /a /d /d/e", - "create /d/f FFFF want ok", - "create /d/g GGGGGGG want ok", - "mk-dir /d/m want ok", - "mk-dir /d/m want errExist", - "create /d/m/p PPPPP want ok", - " stat /d/e want 3", - " stat /d/f want 4", - " stat /d/g want 7", - " stat /d/h want errNotExist", - " stat /d/m want dir", - " stat /d/m/p want 5", - " find / /a /d /d/e /d/f /d/g /d/m /d/m/p", - "rm-all /d want ok", - " stat /a want 1", - " stat /d want errNotExist", - " stat /d/e want errNotExist", - " stat /d/f want errNotExist", - " stat /d/g want errNotExist", - " stat /d/m want errNotExist", - " stat /d/m/p want errNotExist", - " find / /a", - "mk-dir /d/m want errNotExist", - "mk-dir /d want ok", - "create /d/f FFFF want ok", - "rm-all /d/f want ok", - "mk-dir /d/m want ok", - "rm-all /z want ok", - "rm-all / want err", - "create /b BB want ok", - " stat / want dir", - " stat /a want 1", - " stat /b want 2", - " stat /c want errNotExist", - " stat /d want dir", - " stat /d/m want dir", - " find / /a /b /d /d/m", - "move__ o=F /b /c want ok", - " stat /b want errNotExist", - " stat /c want 2", - " stat /d/m want dir", - " stat /d/n want errNotExist", - " find / /a /c /d /d/m", - "move__ o=F /d/m /d/n want ok", - "create /d/n/q QQQQ want ok", - " stat /d/m want errNotExist", - " stat /d/n want dir", - " stat /d/n/q want 4", - "move__ o=F /d /d/n/z want err", - "move__ o=T /c /d/n/q want ok", - " stat /c want errNotExist", - " stat /d/n/q want 2", - " find / /a /d /d/n /d/n/q", - "create /d/n/r RRRRR want ok", - "mk-dir /u want ok", - "mk-dir /u/v want ok", - "move__ o=F /d/n /u want errExist", - "create /t TTTTTT want ok", - "move__ o=F /d/n /t want errExist", - "rm-all /t want ok", - "move__ o=F /d/n /t want ok", - " stat /d want dir", - " stat /d/n want errNotExist", - " stat /d/n/r want errNotExist", - " stat /t want dir", - " stat /t/q want 2", - " stat /t/r want 5", - " find / /a /d /t /t/q /t/r /u /u/v", - "move__ o=F /t / want errExist", - "move__ o=T /t /u/v want ok", - " stat /u/v/r want 5", - "move__ o=F / /z want err", - " find / /a /d /u /u/v /u/v/q /u/v/r", - " stat /a want 1", - " stat /b want errNotExist", - " stat /c want errNotExist", - " stat /u/v/r want 5", - "copy__ o=F d=0 /a /b want ok", - "copy__ o=T d=0 /a /c want ok", - " stat /a want 1", - " stat /b want 1", - " stat /c want 1", - " stat /u/v/r want 5", - "copy__ o=F d=0 /u/v/r /b want errExist", - " stat /b want 1", - "copy__ o=T d=0 /u/v/r /b want ok", - " stat /a want 1", - " stat /b want 5", - " stat /u/v/r want 5", - "rm-all /a want ok", - "rm-all /b want ok", - "mk-dir /u/v/w want ok", - "create /u/v/w/s SSSSSSSS want ok", - " stat /d want dir", - " stat /d/x want errNotExist", - " stat /d/y want errNotExist", - " stat /u/v/r want 5", - " stat /u/v/w/s want 8", - " find / /c /d /u /u/v /u/v/q /u/v/r /u/v/w /u/v/w/s", - "copy__ o=T d=0 /u/v /d/x want ok", - "copy__ o=T d=∞ /u/v /d/y want ok", - "rm-all /u want ok", - " stat /d/x want dir", - " stat /d/x/q want errNotExist", - " stat /d/x/r want errNotExist", - " stat /d/x/w want errNotExist", - " stat /d/x/w/s want errNotExist", - " stat /d/y want dir", - " stat /d/y/q want 2", - " stat /d/y/r want 5", - " stat /d/y/w want dir", - " stat /d/y/w/s want 8", - " stat /u want errNotExist", - " find / /c /d /d/x /d/y /d/y/q /d/y/r /d/y/w /d/y/w/s", - "copy__ o=F d=∞ /d/y /d/x want errExist", - } - - ctx := context.Background() - - for i, tc := range testCases { - tc = strings.TrimSpace(tc) - j := strings.IndexByte(tc, ' ') - if j < 0 { - t.Fatalf("test case #%d %q: invalid command", i, tc) - } - op, arg := tc[:j], tc[j+1:] - - switch op { - default: - t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) - - case "create": - parts := strings.Split(arg, " ") - if len(parts) != 4 || parts[2] != "want" { - t.Fatalf("test case #%d %q: invalid write", i, tc) - } - f, opErr := fs.OpenFile(ctx, parts[0], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if got := errStr(opErr); got != parts[3] { - t.Fatalf("test case #%d %q: OpenFile: got %q (%v), want %q", i, tc, got, opErr, parts[3]) - } - if f != nil { - if _, err := f.Write([]byte(parts[1])); err != nil { - t.Fatalf("test case #%d %q: Write: %v", i, tc, err) - } - if err := f.Close(); err != nil { - t.Fatalf("test case #%d %q: Close: %v", i, tc, err) - } - } - - case "find": - got, err := find(ctx, nil, fs, "/") - if err != nil { - t.Fatalf("test case #%d %q: find: %v", i, tc, err) - } - sort.Strings(got) - want := strings.Split(arg, " ") - if !reflect.DeepEqual(got, want) { - t.Fatalf("test case #%d %q:\ngot %s\nwant %s", i, tc, got, want) - } - - case "copy__", "mk-dir", "move__", "rm-all", "stat": - nParts := 3 - switch op { - case "copy__": - nParts = 6 - case "move__": - nParts = 5 - } - parts := strings.Split(arg, " ") - if len(parts) != nParts { - t.Fatalf("test case #%d %q: invalid %s", i, tc, op) - } - - got, opErr := "", error(nil) - switch op { - case "copy__": - depth := 0 - if parts[1] == "d=∞" { - depth = infiniteDepth - } - _, opErr = copyFiles(ctx, fs, parts[2], parts[3], parts[0] == "o=T", depth, 0) - case "mk-dir": - opErr = fs.Mkdir(ctx, parts[0], 0777) - case "move__": - _, opErr = moveFiles(ctx, fs, parts[1], parts[2], parts[0] == "o=T") - case "rm-all": - opErr = fs.RemoveAll(ctx, parts[0]) - case "stat": - var stat os.FileInfo - fileName := parts[0] - if stat, opErr = fs.Stat(ctx, fileName); opErr == nil { - if stat.IsDir() { - got = "dir" - } else { - got = strconv.Itoa(int(stat.Size())) - } - - if fileName == "/" { - // For a Dir FileSystem, the virtual file system root maps to a - // real file system name like "/tmp/webdav-test012345", which does - // not end with "/". We skip such cases. - } else if statName := stat.Name(); path.Base(fileName) != statName { - t.Fatalf("test case #%d %q: file name %q inconsistent with stat name %q", - i, tc, fileName, statName) - } - } - } - if got == "" { - got = errStr(opErr) - } - - if parts[len(parts)-2] != "want" { - t.Fatalf("test case #%d %q: invalid %s", i, tc, op) - } - if want := parts[len(parts)-1]; got != want { - t.Fatalf("test case #%d %q: got %q (%v), want %q", i, tc, got, opErr, want) - } - } - } -} - -func TestDir(t *testing.T) { - switch runtime.GOOS { - case "nacl": - t.Skip("see golang.org/issue/12004") - case "plan9": - t.Skip("see golang.org/issue/11453") - } - - td, err := ioutil.TempDir("", "webdav-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(td) - testFS(t, Dir(td)) -} - -func TestMemFS(t *testing.T) { - testFS(t, NewMemFS()) -} - -func TestMemFSRoot(t *testing.T) { - ctx := context.Background() - fs := NewMemFS() - for i := 0; i < 5; i++ { - stat, err := fs.Stat(ctx, "/") - if err != nil { - t.Fatalf("i=%d: Stat: %v", i, err) - } - if !stat.IsDir() { - t.Fatalf("i=%d: Stat.IsDir is false, want true", i) - } - - f, err := fs.OpenFile(ctx, "/", os.O_RDONLY, 0) - if err != nil { - t.Fatalf("i=%d: OpenFile: %v", i, err) - } - defer f.Close() - children, err := f.Readdir(-1) - if err != nil { - t.Fatalf("i=%d: Readdir: %v", i, err) - } - if len(children) != i { - t.Fatalf("i=%d: got %d children, want %d", i, len(children), i) - } - - if _, err := f.Write(make([]byte, 1)); err == nil { - t.Fatalf("i=%d: Write: got nil error, want non-nil", i) - } - - if err := fs.Mkdir(ctx, fmt.Sprintf("/dir%d", i), 0777); err != nil { - t.Fatalf("i=%d: Mkdir: %v", i, err) - } - } -} - -func TestMemFileReaddir(t *testing.T) { - ctx := context.Background() - fs := NewMemFS() - if err := fs.Mkdir(ctx, "/foo", 0777); err != nil { - t.Fatalf("Mkdir: %v", err) - } - readdir := func(count int) ([]os.FileInfo, error) { - f, err := fs.OpenFile(ctx, "/foo", os.O_RDONLY, 0) - if err != nil { - t.Fatalf("OpenFile: %v", err) - } - defer f.Close() - return f.Readdir(count) - } - if got, err := readdir(-1); len(got) != 0 || err != nil { - t.Fatalf("readdir(-1): got %d fileInfos with err=%v, want 0, ", len(got), err) - } - if got, err := readdir(+1); len(got) != 0 || err != io.EOF { - t.Fatalf("readdir(+1): got %d fileInfos with err=%v, want 0, EOF", len(got), err) - } -} - -func TestMemFile(t *testing.T) { - testCases := []string{ - "wantData ", - "wantSize 0", - "write abc", - "wantData abc", - "write de", - "wantData abcde", - "wantSize 5", - "write 5*x", - "write 4*y+2*z", - "write 3*st", - "wantData abcdexxxxxyyyyzzststst", - "wantSize 22", - "seek set 4 want 4", - "write EFG", - "wantData abcdEFGxxxyyyyzzststst", - "wantSize 22", - "seek set 2 want 2", - "read cdEF", - "read Gx", - "seek cur 0 want 8", - "seek cur 2 want 10", - "seek cur -1 want 9", - "write J", - "wantData abcdEFGxxJyyyyzzststst", - "wantSize 22", - "seek cur -4 want 6", - "write ghijk", - "wantData abcdEFghijkyyyzzststst", - "wantSize 22", - "read yyyz", - "seek cur 0 want 15", - "write ", - "seek cur 0 want 15", - "read ", - "seek cur 0 want 15", - "seek end -3 want 19", - "write ZZ", - "wantData abcdEFghijkyyyzzstsZZt", - "wantSize 22", - "write 4*A", - "wantData abcdEFghijkyyyzzstsZZAAAA", - "wantSize 25", - "seek end 0 want 25", - "seek end -5 want 20", - "read Z+4*A", - "write 5*B", - "wantData abcdEFghijkyyyzzstsZZAAAABBBBB", - "wantSize 30", - "seek end 10 want 40", - "write C", - "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........C", - "wantSize 41", - "write D", - "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........CD", - "wantSize 42", - "seek set 43 want 43", - "write E", - "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........CD.E", - "wantSize 44", - "seek set 0 want 0", - "write 5*123456789_", - "wantData 123456789_123456789_123456789_123456789_123456789_", - "wantSize 50", - "seek cur 0 want 50", - "seek cur -99 want err", - } - - ctx := context.Background() - - const filename = "/foo" - fs := NewMemFS() - f, err := fs.OpenFile(ctx, filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - t.Fatalf("OpenFile: %v", err) - } - defer f.Close() - - for i, tc := range testCases { - j := strings.IndexByte(tc, ' ') - if j < 0 { - t.Fatalf("test case #%d %q: invalid command", i, tc) - } - op, arg := tc[:j], tc[j+1:] - - // Expand an arg like "3*a+2*b" to "aaabb". - parts := strings.Split(arg, "+") - for j, part := range parts { - if k := strings.IndexByte(part, '*'); k >= 0 { - repeatCount, repeatStr := part[:k], part[k+1:] - n, err := strconv.Atoi(repeatCount) - if err != nil { - t.Fatalf("test case #%d %q: invalid repeat count %q", i, tc, repeatCount) - } - parts[j] = strings.Repeat(repeatStr, n) - } - } - arg = strings.Join(parts, "") - - switch op { - default: - t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) - - case "read": - buf := make([]byte, len(arg)) - if _, err := io.ReadFull(f, buf); err != nil { - t.Fatalf("test case #%d %q: ReadFull: %v", i, tc, err) - } - if got := string(buf); got != arg { - t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, arg) - } - - case "seek": - parts := strings.Split(arg, " ") - if len(parts) != 4 { - t.Fatalf("test case #%d %q: invalid seek", i, tc) - } - - whence := 0 - switch parts[0] { - default: - t.Fatalf("test case #%d %q: invalid seek whence", i, tc) - case "set": - whence = os.SEEK_SET - case "cur": - whence = os.SEEK_CUR - case "end": - whence = os.SEEK_END - } - offset, err := strconv.Atoi(parts[1]) - if err != nil { - t.Fatalf("test case #%d %q: invalid offset %q", i, tc, parts[1]) - } - - if parts[2] != "want" { - t.Fatalf("test case #%d %q: invalid seek", i, tc) - } - if parts[3] == "err" { - _, err := f.Seek(int64(offset), whence) - if err == nil { - t.Fatalf("test case #%d %q: Seek returned nil error, want non-nil", i, tc) - } - } else { - got, err := f.Seek(int64(offset), whence) - if err != nil { - t.Fatalf("test case #%d %q: Seek: %v", i, tc, err) - } - want, err := strconv.Atoi(parts[3]) - if err != nil { - t.Fatalf("test case #%d %q: invalid want %q", i, tc, parts[3]) - } - if got != int64(want) { - t.Fatalf("test case #%d %q: got %d, want %d", i, tc, got, want) - } - } - - case "write": - n, err := f.Write([]byte(arg)) - if err != nil { - t.Fatalf("test case #%d %q: write: %v", i, tc, err) - } - if n != len(arg) { - t.Fatalf("test case #%d %q: write returned %d bytes, want %d", i, tc, n, len(arg)) - } - - case "wantData": - g, err := fs.OpenFile(ctx, filename, os.O_RDONLY, 0666) - if err != nil { - t.Fatalf("test case #%d %q: OpenFile: %v", i, tc, err) - } - gotBytes, err := ioutil.ReadAll(g) - if err != nil { - t.Fatalf("test case #%d %q: ReadAll: %v", i, tc, err) - } - for i, c := range gotBytes { - if c == '\x00' { - gotBytes[i] = '.' - } - } - got := string(gotBytes) - if got != arg { - t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, arg) - } - if err := g.Close(); err != nil { - t.Fatalf("test case #%d %q: Close: %v", i, tc, err) - } - - case "wantSize": - n, err := strconv.Atoi(arg) - if err != nil { - t.Fatalf("test case #%d %q: invalid size %q", i, tc, arg) - } - fi, err := fs.Stat(ctx, filename) - if err != nil { - t.Fatalf("test case #%d %q: Stat: %v", i, tc, err) - } - if got, want := fi.Size(), int64(n); got != want { - t.Fatalf("test case #%d %q: got %d, want %d", i, tc, got, want) - } - } - } -} - -// TestMemFileWriteAllocs tests that writing N consecutive 1KiB chunks to a -// memFile doesn't allocate a new buffer for each of those N times. Otherwise, -// calling io.Copy(aMemFile, src) is likely to have quadratic complexity. -func TestMemFileWriteAllocs(t *testing.T) { - if runtime.Compiler == "gccgo" { - t.Skip("gccgo allocates here") - } - ctx := context.Background() - fs := NewMemFS() - f, err := fs.OpenFile(ctx, "/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - t.Fatalf("OpenFile: %v", err) - } - defer f.Close() - - xxx := make([]byte, 1024) - for i := range xxx { - xxx[i] = 'x' - } - - a := testing.AllocsPerRun(100, func() { - f.Write(xxx) - }) - // AllocsPerRun returns an integral value, so we compare the rounded-down - // number to zero. - if a > 0 { - t.Fatalf("%v allocs per run, want 0", a) - } -} - -func BenchmarkMemFileWrite(b *testing.B) { - ctx := context.Background() - fs := NewMemFS() - xxx := make([]byte, 1024) - for i := range xxx { - xxx[i] = 'x' - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - f, err := fs.OpenFile(ctx, "/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - b.Fatalf("OpenFile: %v", err) - } - for j := 0; j < 100; j++ { - f.Write(xxx) - } - if err := f.Close(); err != nil { - b.Fatalf("Close: %v", err) - } - if err := fs.RemoveAll(ctx, "/xxx"); err != nil { - b.Fatalf("RemoveAll: %v", err) - } - } -} - -func TestCopyMoveProps(t *testing.T) { - ctx := context.Background() - fs := NewMemFS() - create := func(name string) error { - f, err := fs.OpenFile(ctx, name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - return err - } - _, wErr := f.Write([]byte("contents")) - cErr := f.Close() - if wErr != nil { - return wErr - } - return cErr - } - patch := func(name string, patches ...Proppatch) error { - f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0666) - if err != nil { - return err - } - _, pErr := f.(DeadPropsHolder).Patch(patches) - cErr := f.Close() - if pErr != nil { - return pErr - } - return cErr - } - props := func(name string) (map[xml.Name]Property, error) { - f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0666) - if err != nil { - return nil, err - } - m, pErr := f.(DeadPropsHolder).DeadProps() - cErr := f.Close() - if pErr != nil { - return nil, pErr - } - if cErr != nil { - return nil, cErr - } - return m, nil - } - - p0 := Property{ - XMLName: xml.Name{Space: "x:", Local: "boat"}, - InnerXML: []byte("pea-green"), - } - p1 := Property{ - XMLName: xml.Name{Space: "x:", Local: "ring"}, - InnerXML: []byte("1 shilling"), - } - p2 := Property{ - XMLName: xml.Name{Space: "x:", Local: "spoon"}, - InnerXML: []byte("runcible"), - } - p3 := Property{ - XMLName: xml.Name{Space: "x:", Local: "moon"}, - InnerXML: []byte("light"), - } - - if err := create("/src"); err != nil { - t.Fatalf("create /src: %v", err) - } - if err := patch("/src", Proppatch{Props: []Property{p0, p1}}); err != nil { - t.Fatalf("patch /src +p0 +p1: %v", err) - } - if _, err := copyFiles(ctx, fs, "/src", "/tmp", true, infiniteDepth, 0); err != nil { - t.Fatalf("copyFiles /src /tmp: %v", err) - } - if _, err := moveFiles(ctx, fs, "/tmp", "/dst", true); err != nil { - t.Fatalf("moveFiles /tmp /dst: %v", err) - } - if err := patch("/src", Proppatch{Props: []Property{p0}, Remove: true}); err != nil { - t.Fatalf("patch /src -p0: %v", err) - } - if err := patch("/src", Proppatch{Props: []Property{p2}}); err != nil { - t.Fatalf("patch /src +p2: %v", err) - } - if err := patch("/dst", Proppatch{Props: []Property{p1}, Remove: true}); err != nil { - t.Fatalf("patch /dst -p1: %v", err) - } - if err := patch("/dst", Proppatch{Props: []Property{p3}}); err != nil { - t.Fatalf("patch /dst +p3: %v", err) - } - - gotSrc, err := props("/src") - if err != nil { - t.Fatalf("props /src: %v", err) - } - wantSrc := map[xml.Name]Property{ - p1.XMLName: p1, - p2.XMLName: p2, - } - if !reflect.DeepEqual(gotSrc, wantSrc) { - t.Fatalf("props /src:\ngot %v\nwant %v", gotSrc, wantSrc) - } - - gotDst, err := props("/dst") - if err != nil { - t.Fatalf("props /dst: %v", err) - } - wantDst := map[xml.Name]Property{ - p0.XMLName: p0, - p3.XMLName: p3, - } - if !reflect.DeepEqual(gotDst, wantDst) { - t.Fatalf("props /dst:\ngot %v\nwant %v", gotDst, wantDst) - } -} - -func TestWalkFS(t *testing.T) { - testCases := []struct { - desc string - buildfs []string - startAt string - depth int - walkFn filepath.WalkFunc - want []string - }{{ - "just root", - []string{}, - "/", - infiniteDepth, - nil, - []string{ - "/", - }, - }, { - "infinite walk from root", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/d", - "mkdir /e", - "touch /f", - }, - "/", - infiniteDepth, - nil, - []string{ - "/", - "/a", - "/a/b", - "/a/b/c", - "/a/d", - "/e", - "/f", - }, - }, { - "infinite walk from subdir", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/d", - "mkdir /e", - "touch /f", - }, - "/a", - infiniteDepth, - nil, - []string{ - "/a", - "/a/b", - "/a/b/c", - "/a/d", - }, - }, { - "depth 1 walk from root", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/d", - "mkdir /e", - "touch /f", - }, - "/", - 1, - nil, - []string{ - "/", - "/a", - "/e", - "/f", - }, - }, { - "depth 1 walk from subdir", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/b/g", - "mkdir /a/b/g/h", - "touch /a/b/g/i", - "touch /a/b/g/h/j", - }, - "/a/b", - 1, - nil, - []string{ - "/a/b", - "/a/b/c", - "/a/b/g", - }, - }, { - "depth 0 walk from subdir", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/b/g", - "mkdir /a/b/g/h", - "touch /a/b/g/i", - "touch /a/b/g/h/j", - }, - "/a/b", - 0, - nil, - []string{ - "/a/b", - }, - }, { - "infinite walk from file", - []string{ - "mkdir /a", - "touch /a/b", - "touch /a/c", - }, - "/a/b", - 0, - nil, - []string{ - "/a/b", - }, - }, { - "infinite walk with skipped subdir", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/b/g", - "mkdir /a/b/g/h", - "touch /a/b/g/i", - "touch /a/b/g/h/j", - "touch /a/b/z", - }, - "/", - infiniteDepth, - func(path string, info os.FileInfo, err error) error { - if path == "/a/b/g" { - return filepath.SkipDir - } - return nil - }, - []string{ - "/", - "/a", - "/a/b", - "/a/b/c", - "/a/b/z", - }, - }} - ctx := context.Background() - for _, tc := range testCases { - fs, err := buildTestFS(tc.buildfs) - if err != nil { - t.Fatalf("%s: cannot create test filesystem: %v", tc.desc, err) - } - var got []string - traceFn := func(path string, info os.FileInfo, err error) error { - if tc.walkFn != nil { - err = tc.walkFn(path, info, err) - if err != nil { - return err - } - } - got = append(got, path) - return nil - } - fi, err := fs.Stat(ctx, tc.startAt) - if err != nil { - t.Fatalf("%s: cannot stat: %v", tc.desc, err) - } - err = walkFS(ctx, fs, tc.depth, tc.startAt, fi, traceFn) - if err != nil { - t.Errorf("%s:\ngot error %v, want nil", tc.desc, err) - continue - } - sort.Strings(got) - sort.Strings(tc.want) - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("%s:\ngot %q\nwant %q", tc.desc, got, tc.want) - continue - } - } -} - -func buildTestFS(buildfs []string) (FileSystem, error) { - // TODO: Could this be merged with the build logic in TestFS? - - ctx := context.Background() - fs := NewMemFS() - for _, b := range buildfs { - op := strings.Split(b, " ") - switch op[0] { - case "mkdir": - err := fs.Mkdir(ctx, op[1], os.ModeDir|0777) - if err != nil { - return nil, err - } - case "touch": - f, err := fs.OpenFile(ctx, op[1], os.O_RDWR|os.O_CREATE, 0666) - if err != nil { - return nil, err - } - f.Close() - case "write": - f, err := fs.OpenFile(ctx, op[1], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - return nil, err - } - _, err = f.Write([]byte(op[2])) - f.Close() - if err != nil { - return nil, err - } - default: - return nil, fmt.Errorf("unknown file operation %q", op[0]) - } - } - return fs, nil -} diff --git a/vendor/golang.org/x/net/webdav/if.go b/vendor/golang.org/x/net/webdav/if.go deleted file mode 100644 index 416e81cdf..000000000 --- a/vendor/golang.org/x/net/webdav/if.go +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -// The If header is covered by Section 10.4. -// http://www.webdav.org/specs/rfc4918.html#HEADER_If - -import ( - "strings" -) - -// ifHeader is a disjunction (OR) of ifLists. -type ifHeader struct { - lists []ifList -} - -// ifList is a conjunction (AND) of Conditions, and an optional resource tag. -type ifList struct { - resourceTag string - conditions []Condition -} - -// parseIfHeader parses the "If: foo bar" HTTP header. The httpHeader string -// should omit the "If:" prefix and have any "\r\n"s collapsed to a " ", as is -// returned by req.Header.Get("If") for a http.Request req. -func parseIfHeader(httpHeader string) (h ifHeader, ok bool) { - s := strings.TrimSpace(httpHeader) - switch tokenType, _, _ := lex(s); tokenType { - case '(': - return parseNoTagLists(s) - case angleTokenType: - return parseTaggedLists(s) - default: - return ifHeader{}, false - } -} - -func parseNoTagLists(s string) (h ifHeader, ok bool) { - for { - l, remaining, ok := parseList(s) - if !ok { - return ifHeader{}, false - } - h.lists = append(h.lists, l) - if remaining == "" { - return h, true - } - s = remaining - } -} - -func parseTaggedLists(s string) (h ifHeader, ok bool) { - resourceTag, n := "", 0 - for first := true; ; first = false { - tokenType, tokenStr, remaining := lex(s) - switch tokenType { - case angleTokenType: - if !first && n == 0 { - return ifHeader{}, false - } - resourceTag, n = tokenStr, 0 - s = remaining - case '(': - n++ - l, remaining, ok := parseList(s) - if !ok { - return ifHeader{}, false - } - l.resourceTag = resourceTag - h.lists = append(h.lists, l) - if remaining == "" { - return h, true - } - s = remaining - default: - return ifHeader{}, false - } - } -} - -func parseList(s string) (l ifList, remaining string, ok bool) { - tokenType, _, s := lex(s) - if tokenType != '(' { - return ifList{}, "", false - } - for { - tokenType, _, remaining = lex(s) - if tokenType == ')' { - if len(l.conditions) == 0 { - return ifList{}, "", false - } - return l, remaining, true - } - c, remaining, ok := parseCondition(s) - if !ok { - return ifList{}, "", false - } - l.conditions = append(l.conditions, c) - s = remaining - } -} - -func parseCondition(s string) (c Condition, remaining string, ok bool) { - tokenType, tokenStr, s := lex(s) - if tokenType == notTokenType { - c.Not = true - tokenType, tokenStr, s = lex(s) - } - switch tokenType { - case strTokenType, angleTokenType: - c.Token = tokenStr - case squareTokenType: - c.ETag = tokenStr - default: - return Condition{}, "", false - } - return c, s, true -} - -// Single-rune tokens like '(' or ')' have a token type equal to their rune. -// All other tokens have a negative token type. -const ( - errTokenType = rune(-1) - eofTokenType = rune(-2) - strTokenType = rune(-3) - notTokenType = rune(-4) - angleTokenType = rune(-5) - squareTokenType = rune(-6) -) - -func lex(s string) (tokenType rune, tokenStr string, remaining string) { - // The net/textproto Reader that parses the HTTP header will collapse - // Linear White Space that spans multiple "\r\n" lines to a single " ", - // so we don't need to look for '\r' or '\n'. - for len(s) > 0 && (s[0] == '\t' || s[0] == ' ') { - s = s[1:] - } - if len(s) == 0 { - return eofTokenType, "", "" - } - i := 0 -loop: - for ; i < len(s); i++ { - switch s[i] { - case '\t', ' ', '(', ')', '<', '>', '[', ']': - break loop - } - } - - if i != 0 { - tokenStr, remaining = s[:i], s[i:] - if tokenStr == "Not" { - return notTokenType, "", remaining - } - return strTokenType, tokenStr, remaining - } - - j := 0 - switch s[0] { - case '<': - j, tokenType = strings.IndexByte(s, '>'), angleTokenType - case '[': - j, tokenType = strings.IndexByte(s, ']'), squareTokenType - default: - return rune(s[0]), "", s[1:] - } - if j < 0 { - return errTokenType, "", "" - } - return tokenType, s[1:j], s[j+1:] -} diff --git a/vendor/golang.org/x/net/webdav/if_test.go b/vendor/golang.org/x/net/webdav/if_test.go deleted file mode 100644 index aad61a401..000000000 --- a/vendor/golang.org/x/net/webdav/if_test.go +++ /dev/null @@ -1,322 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "reflect" - "strings" - "testing" -) - -func TestParseIfHeader(t *testing.T) { - // The "section x.y.z" test cases come from section x.y.z of the spec at - // http://www.webdav.org/specs/rfc4918.html - testCases := []struct { - desc string - input string - want ifHeader - }{{ - "bad: empty", - ``, - ifHeader{}, - }, { - "bad: no parens", - `foobar`, - ifHeader{}, - }, { - "bad: empty list #1", - `()`, - ifHeader{}, - }, { - "bad: empty list #2", - `(a) (b c) () (d)`, - ifHeader{}, - }, { - "bad: no list after resource #1", - ``, - ifHeader{}, - }, { - "bad: no list after resource #2", - ` (a)`, - ifHeader{}, - }, { - "bad: no list after resource #3", - ` (a) (b) `, - ifHeader{}, - }, { - "bad: no-tag-list followed by tagged-list", - `(a) (b) (c)`, - ifHeader{}, - }, { - "bad: unfinished list", - `(a`, - ifHeader{}, - }, { - "bad: unfinished ETag", - `([b`, - ifHeader{}, - }, { - "bad: unfinished Notted list", - `(Not a`, - ifHeader{}, - }, { - "bad: double Not", - `(Not Not a)`, - ifHeader{}, - }, { - "good: one list with a Token", - `(a)`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `a`, - }}, - }}, - }, - }, { - "good: one list with an ETag", - `([a])`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - ETag: `a`, - }}, - }}, - }, - }, { - "good: one list with three Nots", - `(Not a Not b Not [d])`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Not: true, - Token: `a`, - }, { - Not: true, - Token: `b`, - }, { - Not: true, - ETag: `d`, - }}, - }}, - }, - }, { - "good: two lists", - `(a) (b)`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `a`, - }}, - }, { - conditions: []Condition{{ - Token: `b`, - }}, - }}, - }, - }, { - "good: two Notted lists", - `(Not a) (Not b)`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Not: true, - Token: `a`, - }}, - }, { - conditions: []Condition{{ - Not: true, - Token: `b`, - }}, - }}, - }, - }, { - "section 7.5.1", - ` - ()`, - ifHeader{ - lists: []ifList{{ - resourceTag: `http://www.example.com/users/f/fielding/index.html`, - conditions: []Condition{{ - Token: `urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6`, - }}, - }}, - }, - }, { - "section 7.5.2 #1", - `()`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, - }}, - }}, - }, - }, { - "section 7.5.2 #2", - ` - ()`, - ifHeader{ - lists: []ifList{{ - resourceTag: `http://example.com/locked/`, - conditions: []Condition{{ - Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, - }}, - }}, - }, - }, { - "section 7.5.2 #3", - ` - ()`, - ifHeader{ - lists: []ifList{{ - resourceTag: `http://example.com/locked/member`, - conditions: []Condition{{ - Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, - }}, - }}, - }, - }, { - "section 9.9.6", - `() - ()`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `urn:uuid:fe184f2e-6eec-41d0-c765-01adc56e6bb4`, - }}, - }, { - conditions: []Condition{{ - Token: `urn:uuid:e454f3f3-acdc-452a-56c7-00a5c91e4b77`, - }}, - }}, - }, - }, { - "section 9.10.8", - `()`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4`, - }}, - }}, - }, - }, { - "section 10.4.6", - `( - ["I am an ETag"]) - (["I am another ETag"])`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, - }, { - ETag: `"I am an ETag"`, - }}, - }, { - conditions: []Condition{{ - ETag: `"I am another ETag"`, - }}, - }}, - }, - }, { - "section 10.4.7", - `(Not - )`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Not: true, - Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, - }, { - Token: `urn:uuid:58f202ac-22cf-11d1-b12d-002035b29092`, - }}, - }}, - }, - }, { - "section 10.4.8", - `() - (Not )`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, - }}, - }, { - conditions: []Condition{{ - Not: true, - Token: `DAV:no-lock`, - }}, - }}, - }, - }, { - "section 10.4.9", - ` - ( - [W/"A weak ETag"]) (["strong ETag"])`, - ifHeader{ - lists: []ifList{{ - resourceTag: `/resource1`, - conditions: []Condition{{ - Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, - }, { - ETag: `W/"A weak ETag"`, - }}, - }, { - resourceTag: `/resource1`, - conditions: []Condition{{ - ETag: `"strong ETag"`, - }}, - }}, - }, - }, { - "section 10.4.10", - ` - ()`, - ifHeader{ - lists: []ifList{{ - resourceTag: `http://www.example.com/specs/`, - conditions: []Condition{{ - Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, - }}, - }}, - }, - }, { - "section 10.4.11 #1", - ` (["4217"])`, - ifHeader{ - lists: []ifList{{ - resourceTag: `/specs/rfc2518.doc`, - conditions: []Condition{{ - ETag: `"4217"`, - }}, - }}, - }, - }, { - "section 10.4.11 #2", - ` (Not ["4217"])`, - ifHeader{ - lists: []ifList{{ - resourceTag: `/specs/rfc2518.doc`, - conditions: []Condition{{ - Not: true, - ETag: `"4217"`, - }}, - }}, - }, - }} - - for _, tc := range testCases { - got, ok := parseIfHeader(strings.Replace(tc.input, "\n", "", -1)) - if gotEmpty := reflect.DeepEqual(got, ifHeader{}); gotEmpty == ok { - t.Errorf("%s: should be different: empty header == %t, ok == %t", tc.desc, gotEmpty, ok) - continue - } - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("%s:\ngot %v\nwant %v", tc.desc, got, tc.want) - continue - } - } -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/README b/vendor/golang.org/x/net/webdav/internal/xml/README deleted file mode 100644 index 89656f489..000000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/README +++ /dev/null @@ -1,11 +0,0 @@ -This is a fork of the encoding/xml package at ca1d6c4, the last commit before -https://go.googlesource.com/go/+/c0d6d33 "encoding/xml: restore Go 1.4 name -space behavior" made late in the lead-up to the Go 1.5 release. - -The list of encoding/xml changes is at -https://go.googlesource.com/go/+log/master/src/encoding/xml - -This fork is temporary, and I (nigeltao) expect to revert it after Go 1.6 is -released. - -See http://golang.org/issue/11841 diff --git a/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go b/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go deleted file mode 100644 index a71284312..000000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import "time" - -var atomValue = &Feed{ - XMLName: Name{"http://www.w3.org/2005/Atom", "feed"}, - Title: "Example Feed", - Link: []Link{{Href: "http://example.org/"}}, - Updated: ParseTime("2003-12-13T18:30:02Z"), - Author: Person{Name: "John Doe"}, - Id: "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6", - - Entry: []Entry{ - { - Title: "Atom-Powered Robots Run Amok", - Link: []Link{{Href: "http://example.org/2003/12/13/atom03"}}, - Id: "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", - Updated: ParseTime("2003-12-13T18:30:02Z"), - Summary: NewText("Some text."), - }, - }, -} - -var atomXml = `` + - `` + - `Example Feed` + - `urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6` + - `` + - `John Doe` + - `` + - `Atom-Powered Robots Run Amok` + - `urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a` + - `` + - `2003-12-13T18:30:02Z` + - `` + - `Some text.` + - `` + - `` - -func ParseTime(str string) time.Time { - t, err := time.Parse(time.RFC3339, str) - if err != nil { - panic(err) - } - return t -} - -func NewText(text string) Text { - return Text{ - Body: text, - } -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/example_test.go b/vendor/golang.org/x/net/webdav/internal/xml/example_test.go deleted file mode 100644 index 21b48dea5..000000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/example_test.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml_test - -import ( - "encoding/xml" - "fmt" - "os" -) - -func ExampleMarshalIndent() { - type Address struct { - City, State string - } - type Person struct { - XMLName xml.Name `xml:"person"` - Id int `xml:"id,attr"` - FirstName string `xml:"name>first"` - LastName string `xml:"name>last"` - Age int `xml:"age"` - Height float32 `xml:"height,omitempty"` - Married bool - Address - Comment string `xml:",comment"` - } - - v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} - v.Comment = " Need more details. " - v.Address = Address{"Hanga Roa", "Easter Island"} - - output, err := xml.MarshalIndent(v, " ", " ") - if err != nil { - fmt.Printf("error: %v\n", err) - } - - os.Stdout.Write(output) - // Output: - // - // - // John - // Doe - // - // 42 - // false - // Hanga Roa - // Easter Island - // - // -} - -func ExampleEncoder() { - type Address struct { - City, State string - } - type Person struct { - XMLName xml.Name `xml:"person"` - Id int `xml:"id,attr"` - FirstName string `xml:"name>first"` - LastName string `xml:"name>last"` - Age int `xml:"age"` - Height float32 `xml:"height,omitempty"` - Married bool - Address - Comment string `xml:",comment"` - } - - v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} - v.Comment = " Need more details. " - v.Address = Address{"Hanga Roa", "Easter Island"} - - enc := xml.NewEncoder(os.Stdout) - enc.Indent(" ", " ") - if err := enc.Encode(v); err != nil { - fmt.Printf("error: %v\n", err) - } - - // Output: - // - // - // John - // Doe - // - // 42 - // false - // Hanga Roa - // Easter Island - // - // -} - -// This example demonstrates unmarshaling an XML excerpt into a value with -// some preset fields. Note that the Phone field isn't modified and that -// the XML element is ignored. Also, the Groups field is assigned -// considering the element path provided in its tag. -func ExampleUnmarshal() { - type Email struct { - Where string `xml:"where,attr"` - Addr string - } - type Address struct { - City, State string - } - type Result struct { - XMLName xml.Name `xml:"Person"` - Name string `xml:"FullName"` - Phone string - Email []Email - Groups []string `xml:"Group>Value"` - Address - } - v := Result{Name: "none", Phone: "none"} - - data := ` - - Grace R. Emlin - Example Inc. - - gre@example.com - - - gre@work.com - - - Friends - Squash - - Hanga Roa - Easter Island - - ` - err := xml.Unmarshal([]byte(data), &v) - if err != nil { - fmt.Printf("error: %v", err) - return - } - fmt.Printf("XMLName: %#v\n", v.XMLName) - fmt.Printf("Name: %q\n", v.Name) - fmt.Printf("Phone: %q\n", v.Phone) - fmt.Printf("Email: %v\n", v.Email) - fmt.Printf("Groups: %v\n", v.Groups) - fmt.Printf("Address: %v\n", v.Address) - // Output: - // XMLName: xml.Name{Space:"", Local:"Person"} - // Name: "Grace R. Emlin" - // Phone: "none" - // Email: [{home gre@example.com} {work gre@work.com}] - // Groups: [Friends Squash] - // Address: {Hanga Roa Easter Island} -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/marshal.go b/vendor/golang.org/x/net/webdav/internal/xml/marshal.go deleted file mode 100644 index cb82ec214..000000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/marshal.go +++ /dev/null @@ -1,1223 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import ( - "bufio" - "bytes" - "encoding" - "fmt" - "io" - "reflect" - "strconv" - "strings" -) - -const ( - // A generic XML header suitable for use with the output of Marshal. - // This is not automatically added to any output of this package, - // it is provided as a convenience. - Header = `` + "\n" -) - -// Marshal returns the XML encoding of v. -// -// Marshal handles an array or slice by marshalling each of the elements. -// Marshal handles a pointer by marshalling the value it points at or, if the -// pointer is nil, by writing nothing. Marshal handles an interface value by -// marshalling the value it contains or, if the interface value is nil, by -// writing nothing. Marshal handles all other data by writing one or more XML -// elements containing the data. -// -// The name for the XML elements is taken from, in order of preference: -// - the tag on the XMLName field, if the data is a struct -// - the value of the XMLName field of type xml.Name -// - the tag of the struct field used to obtain the data -// - the name of the struct field used to obtain the data -// - the name of the marshalled type -// -// The XML element for a struct contains marshalled elements for each of the -// exported fields of the struct, with these exceptions: -// - the XMLName field, described above, is omitted. -// - a field with tag "-" is omitted. -// - a field with tag "name,attr" becomes an attribute with -// the given name in the XML element. -// - a field with tag ",attr" becomes an attribute with the -// field name in the XML element. -// - a field with tag ",chardata" is written as character data, -// not as an XML element. -// - a field with tag ",innerxml" is written verbatim, not subject -// to the usual marshalling procedure. -// - a field with tag ",comment" is written as an XML comment, not -// subject to the usual marshalling procedure. It must not contain -// the "--" string within it. -// - a field with a tag including the "omitempty" option is omitted -// if the field value is empty. The empty values are false, 0, any -// nil pointer or interface value, and any array, slice, map, or -// string of length zero. -// - an anonymous struct field is handled as if the fields of its -// value were part of the outer struct. -// -// If a field uses a tag "a>b>c", then the element c will be nested inside -// parent elements a and b. Fields that appear next to each other that name -// the same parent will be enclosed in one XML element. -// -// See MarshalIndent for an example. -// -// Marshal will return an error if asked to marshal a channel, function, or map. -func Marshal(v interface{}) ([]byte, error) { - var b bytes.Buffer - if err := NewEncoder(&b).Encode(v); err != nil { - return nil, err - } - return b.Bytes(), nil -} - -// Marshaler is the interface implemented by objects that can marshal -// themselves into valid XML elements. -// -// MarshalXML encodes the receiver as zero or more XML elements. -// By convention, arrays or slices are typically encoded as a sequence -// of elements, one per entry. -// Using start as the element tag is not required, but doing so -// will enable Unmarshal to match the XML elements to the correct -// struct field. -// One common implementation strategy is to construct a separate -// value with a layout corresponding to the desired XML and then -// to encode it using e.EncodeElement. -// Another common strategy is to use repeated calls to e.EncodeToken -// to generate the XML output one token at a time. -// The sequence of encoded tokens must make up zero or more valid -// XML elements. -type Marshaler interface { - MarshalXML(e *Encoder, start StartElement) error -} - -// MarshalerAttr is the interface implemented by objects that can marshal -// themselves into valid XML attributes. -// -// MarshalXMLAttr returns an XML attribute with the encoded value of the receiver. -// Using name as the attribute name is not required, but doing so -// will enable Unmarshal to match the attribute to the correct -// struct field. -// If MarshalXMLAttr returns the zero attribute Attr{}, no attribute -// will be generated in the output. -// MarshalXMLAttr is used only for struct fields with the -// "attr" option in the field tag. -type MarshalerAttr interface { - MarshalXMLAttr(name Name) (Attr, error) -} - -// MarshalIndent works like Marshal, but each XML element begins on a new -// indented line that starts with prefix and is followed by one or more -// copies of indent according to the nesting depth. -func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { - var b bytes.Buffer - enc := NewEncoder(&b) - enc.Indent(prefix, indent) - if err := enc.Encode(v); err != nil { - return nil, err - } - return b.Bytes(), nil -} - -// An Encoder writes XML data to an output stream. -type Encoder struct { - p printer -} - -// NewEncoder returns a new encoder that writes to w. -func NewEncoder(w io.Writer) *Encoder { - e := &Encoder{printer{Writer: bufio.NewWriter(w)}} - e.p.encoder = e - return e -} - -// Indent sets the encoder to generate XML in which each element -// begins on a new indented line that starts with prefix and is followed by -// one or more copies of indent according to the nesting depth. -func (enc *Encoder) Indent(prefix, indent string) { - enc.p.prefix = prefix - enc.p.indent = indent -} - -// Encode writes the XML encoding of v to the stream. -// -// See the documentation for Marshal for details about the conversion -// of Go values to XML. -// -// Encode calls Flush before returning. -func (enc *Encoder) Encode(v interface{}) error { - err := enc.p.marshalValue(reflect.ValueOf(v), nil, nil) - if err != nil { - return err - } - return enc.p.Flush() -} - -// EncodeElement writes the XML encoding of v to the stream, -// using start as the outermost tag in the encoding. -// -// See the documentation for Marshal for details about the conversion -// of Go values to XML. -// -// EncodeElement calls Flush before returning. -func (enc *Encoder) EncodeElement(v interface{}, start StartElement) error { - err := enc.p.marshalValue(reflect.ValueOf(v), nil, &start) - if err != nil { - return err - } - return enc.p.Flush() -} - -var ( - begComment = []byte("") - endProcInst = []byte("?>") - endDirective = []byte(">") -) - -// EncodeToken writes the given XML token to the stream. -// It returns an error if StartElement and EndElement tokens are not -// properly matched. -// -// EncodeToken does not call Flush, because usually it is part of a -// larger operation such as Encode or EncodeElement (or a custom -// Marshaler's MarshalXML invoked during those), and those will call -// Flush when finished. Callers that create an Encoder and then invoke -// EncodeToken directly, without using Encode or EncodeElement, need to -// call Flush when finished to ensure that the XML is written to the -// underlying writer. -// -// EncodeToken allows writing a ProcInst with Target set to "xml" only -// as the first token in the stream. -// -// When encoding a StartElement holding an XML namespace prefix -// declaration for a prefix that is not already declared, contained -// elements (including the StartElement itself) will use the declared -// prefix when encoding names with matching namespace URIs. -func (enc *Encoder) EncodeToken(t Token) error { - - p := &enc.p - switch t := t.(type) { - case StartElement: - if err := p.writeStart(&t); err != nil { - return err - } - case EndElement: - if err := p.writeEnd(t.Name); err != nil { - return err - } - case CharData: - escapeText(p, t, false) - case Comment: - if bytes.Contains(t, endComment) { - return fmt.Errorf("xml: EncodeToken of Comment containing --> marker") - } - p.WriteString("") - return p.cachedWriteError() - case ProcInst: - // First token to be encoded which is also a ProcInst with target of xml - // is the xml declaration. The only ProcInst where target of xml is allowed. - if t.Target == "xml" && p.Buffered() != 0 { - return fmt.Errorf("xml: EncodeToken of ProcInst xml target only valid for xml declaration, first token encoded") - } - if !isNameString(t.Target) { - return fmt.Errorf("xml: EncodeToken of ProcInst with invalid Target") - } - if bytes.Contains(t.Inst, endProcInst) { - return fmt.Errorf("xml: EncodeToken of ProcInst containing ?> marker") - } - p.WriteString(" 0 { - p.WriteByte(' ') - p.Write(t.Inst) - } - p.WriteString("?>") - case Directive: - if !isValidDirective(t) { - return fmt.Errorf("xml: EncodeToken of Directive containing wrong < or > markers") - } - p.WriteString("") - default: - return fmt.Errorf("xml: EncodeToken of invalid token type") - - } - return p.cachedWriteError() -} - -// isValidDirective reports whether dir is a valid directive text, -// meaning angle brackets are matched, ignoring comments and strings. -func isValidDirective(dir Directive) bool { - var ( - depth int - inquote uint8 - incomment bool - ) - for i, c := range dir { - switch { - case incomment: - if c == '>' { - if n := 1 + i - len(endComment); n >= 0 && bytes.Equal(dir[n:i+1], endComment) { - incomment = false - } - } - // Just ignore anything in comment - case inquote != 0: - if c == inquote { - inquote = 0 - } - // Just ignore anything within quotes - case c == '\'' || c == '"': - inquote = c - case c == '<': - if i+len(begComment) < len(dir) && bytes.Equal(dir[i:i+len(begComment)], begComment) { - incomment = true - } else { - depth++ - } - case c == '>': - if depth == 0 { - return false - } - depth-- - } - } - return depth == 0 && inquote == 0 && !incomment -} - -// Flush flushes any buffered XML to the underlying writer. -// See the EncodeToken documentation for details about when it is necessary. -func (enc *Encoder) Flush() error { - return enc.p.Flush() -} - -type printer struct { - *bufio.Writer - encoder *Encoder - seq int - indent string - prefix string - depth int - indentedIn bool - putNewline bool - defaultNS string - attrNS map[string]string // map prefix -> name space - attrPrefix map[string]string // map name space -> prefix - prefixes []printerPrefix - tags []Name -} - -// printerPrefix holds a namespace undo record. -// When an element is popped, the prefix record -// is set back to the recorded URL. The empty -// prefix records the URL for the default name space. -// -// The start of an element is recorded with an element -// that has mark=true. -type printerPrefix struct { - prefix string - url string - mark bool -} - -func (p *printer) prefixForNS(url string, isAttr bool) string { - // The "http://www.w3.org/XML/1998/namespace" name space is predefined as "xml" - // and must be referred to that way. - // (The "http://www.w3.org/2000/xmlns/" name space is also predefined as "xmlns", - // but users should not be trying to use that one directly - that's our job.) - if url == xmlURL { - return "xml" - } - if !isAttr && url == p.defaultNS { - // We can use the default name space. - return "" - } - return p.attrPrefix[url] -} - -// defineNS pushes any namespace definition found in the given attribute. -// If ignoreNonEmptyDefault is true, an xmlns="nonempty" -// attribute will be ignored. -func (p *printer) defineNS(attr Attr, ignoreNonEmptyDefault bool) error { - var prefix string - if attr.Name.Local == "xmlns" { - if attr.Name.Space != "" && attr.Name.Space != "xml" && attr.Name.Space != xmlURL { - return fmt.Errorf("xml: cannot redefine xmlns attribute prefix") - } - } else if attr.Name.Space == "xmlns" && attr.Name.Local != "" { - prefix = attr.Name.Local - if attr.Value == "" { - // Technically, an empty XML namespace is allowed for an attribute. - // From http://www.w3.org/TR/xml-names11/#scoping-defaulting: - // - // The attribute value in a namespace declaration for a prefix may be - // empty. This has the effect, within the scope of the declaration, of removing - // any association of the prefix with a namespace name. - // - // However our namespace prefixes here are used only as hints. There's - // no need to respect the removal of a namespace prefix, so we ignore it. - return nil - } - } else { - // Ignore: it's not a namespace definition - return nil - } - if prefix == "" { - if attr.Value == p.defaultNS { - // No need for redefinition. - return nil - } - if attr.Value != "" && ignoreNonEmptyDefault { - // We have an xmlns="..." value but - // it can't define a name space in this context, - // probably because the element has an empty - // name space. In this case, we just ignore - // the name space declaration. - return nil - } - } else if _, ok := p.attrPrefix[attr.Value]; ok { - // There's already a prefix for the given name space, - // so use that. This prevents us from - // having two prefixes for the same name space - // so attrNS and attrPrefix can remain bijective. - return nil - } - p.pushPrefix(prefix, attr.Value) - return nil -} - -// createNSPrefix creates a name space prefix attribute -// to use for the given name space, defining a new prefix -// if necessary. -// If isAttr is true, the prefix is to be created for an attribute -// prefix, which means that the default name space cannot -// be used. -func (p *printer) createNSPrefix(url string, isAttr bool) { - if _, ok := p.attrPrefix[url]; ok { - // We already have a prefix for the given URL. - return - } - switch { - case !isAttr && url == p.defaultNS: - // We can use the default name space. - return - case url == "": - // The only way we can encode names in the empty - // name space is by using the default name space, - // so we must use that. - if p.defaultNS != "" { - // The default namespace is non-empty, so we - // need to set it to empty. - p.pushPrefix("", "") - } - return - case url == xmlURL: - return - } - // TODO If the URL is an existing prefix, we could - // use it as is. That would enable the - // marshaling of elements that had been unmarshaled - // and with a name space prefix that was not found. - // although technically it would be incorrect. - - // Pick a name. We try to use the final element of the path - // but fall back to _. - prefix := strings.TrimRight(url, "/") - if i := strings.LastIndex(prefix, "/"); i >= 0 { - prefix = prefix[i+1:] - } - if prefix == "" || !isName([]byte(prefix)) || strings.Contains(prefix, ":") { - prefix = "_" - } - if strings.HasPrefix(prefix, "xml") { - // xmlanything is reserved. - prefix = "_" + prefix - } - if p.attrNS[prefix] != "" { - // Name is taken. Find a better one. - for p.seq++; ; p.seq++ { - if id := prefix + "_" + strconv.Itoa(p.seq); p.attrNS[id] == "" { - prefix = id - break - } - } - } - - p.pushPrefix(prefix, url) -} - -// writeNamespaces writes xmlns attributes for all the -// namespace prefixes that have been defined in -// the current element. -func (p *printer) writeNamespaces() { - for i := len(p.prefixes) - 1; i >= 0; i-- { - prefix := p.prefixes[i] - if prefix.mark { - return - } - p.WriteString(" ") - if prefix.prefix == "" { - // Default name space. - p.WriteString(`xmlns="`) - } else { - p.WriteString("xmlns:") - p.WriteString(prefix.prefix) - p.WriteString(`="`) - } - EscapeText(p, []byte(p.nsForPrefix(prefix.prefix))) - p.WriteString(`"`) - } -} - -// pushPrefix pushes a new prefix on the prefix stack -// without checking to see if it is already defined. -func (p *printer) pushPrefix(prefix, url string) { - p.prefixes = append(p.prefixes, printerPrefix{ - prefix: prefix, - url: p.nsForPrefix(prefix), - }) - p.setAttrPrefix(prefix, url) -} - -// nsForPrefix returns the name space for the given -// prefix. Note that this is not valid for the -// empty attribute prefix, which always has an empty -// name space. -func (p *printer) nsForPrefix(prefix string) string { - if prefix == "" { - return p.defaultNS - } - return p.attrNS[prefix] -} - -// markPrefix marks the start of an element on the prefix -// stack. -func (p *printer) markPrefix() { - p.prefixes = append(p.prefixes, printerPrefix{ - mark: true, - }) -} - -// popPrefix pops all defined prefixes for the current -// element. -func (p *printer) popPrefix() { - for len(p.prefixes) > 0 { - prefix := p.prefixes[len(p.prefixes)-1] - p.prefixes = p.prefixes[:len(p.prefixes)-1] - if prefix.mark { - break - } - p.setAttrPrefix(prefix.prefix, prefix.url) - } -} - -// setAttrPrefix sets an attribute name space prefix. -// If url is empty, the attribute is removed. -// If prefix is empty, the default name space is set. -func (p *printer) setAttrPrefix(prefix, url string) { - if prefix == "" { - p.defaultNS = url - return - } - if url == "" { - delete(p.attrPrefix, p.attrNS[prefix]) - delete(p.attrNS, prefix) - return - } - if p.attrPrefix == nil { - // Need to define a new name space. - p.attrPrefix = make(map[string]string) - p.attrNS = make(map[string]string) - } - // Remove any old prefix value. This is OK because we maintain a - // strict one-to-one mapping between prefix and URL (see - // defineNS) - delete(p.attrPrefix, p.attrNS[prefix]) - p.attrPrefix[url] = prefix - p.attrNS[prefix] = url -} - -var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() - marshalerAttrType = reflect.TypeOf((*MarshalerAttr)(nil)).Elem() - textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() -) - -// marshalValue writes one or more XML elements representing val. -// If val was obtained from a struct field, finfo must have its details. -func (p *printer) marshalValue(val reflect.Value, finfo *fieldInfo, startTemplate *StartElement) error { - if startTemplate != nil && startTemplate.Name.Local == "" { - return fmt.Errorf("xml: EncodeElement of StartElement with missing name") - } - - if !val.IsValid() { - return nil - } - if finfo != nil && finfo.flags&fOmitEmpty != 0 && isEmptyValue(val) { - return nil - } - - // Drill into interfaces and pointers. - // This can turn into an infinite loop given a cyclic chain, - // but it matches the Go 1 behavior. - for val.Kind() == reflect.Interface || val.Kind() == reflect.Ptr { - if val.IsNil() { - return nil - } - val = val.Elem() - } - - kind := val.Kind() - typ := val.Type() - - // Check for marshaler. - if val.CanInterface() && typ.Implements(marshalerType) { - return p.marshalInterface(val.Interface().(Marshaler), p.defaultStart(typ, finfo, startTemplate)) - } - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(marshalerType) { - return p.marshalInterface(pv.Interface().(Marshaler), p.defaultStart(pv.Type(), finfo, startTemplate)) - } - } - - // Check for text marshaler. - if val.CanInterface() && typ.Implements(textMarshalerType) { - return p.marshalTextInterface(val.Interface().(encoding.TextMarshaler), p.defaultStart(typ, finfo, startTemplate)) - } - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { - return p.marshalTextInterface(pv.Interface().(encoding.TextMarshaler), p.defaultStart(pv.Type(), finfo, startTemplate)) - } - } - - // Slices and arrays iterate over the elements. They do not have an enclosing tag. - if (kind == reflect.Slice || kind == reflect.Array) && typ.Elem().Kind() != reflect.Uint8 { - for i, n := 0, val.Len(); i < n; i++ { - if err := p.marshalValue(val.Index(i), finfo, startTemplate); err != nil { - return err - } - } - return nil - } - - tinfo, err := getTypeInfo(typ) - if err != nil { - return err - } - - // Create start element. - // Precedence for the XML element name is: - // 0. startTemplate - // 1. XMLName field in underlying struct; - // 2. field name/tag in the struct field; and - // 3. type name - var start StartElement - - // explicitNS records whether the element's name space has been - // explicitly set (for example an XMLName field). - explicitNS := false - - if startTemplate != nil { - start.Name = startTemplate.Name - explicitNS = true - start.Attr = append(start.Attr, startTemplate.Attr...) - } else if tinfo.xmlname != nil { - xmlname := tinfo.xmlname - if xmlname.name != "" { - start.Name.Space, start.Name.Local = xmlname.xmlns, xmlname.name - } else if v, ok := xmlname.value(val).Interface().(Name); ok && v.Local != "" { - start.Name = v - } - explicitNS = true - } - if start.Name.Local == "" && finfo != nil { - start.Name.Local = finfo.name - if finfo.xmlns != "" { - start.Name.Space = finfo.xmlns - explicitNS = true - } - } - if start.Name.Local == "" { - name := typ.Name() - if name == "" { - return &UnsupportedTypeError{typ} - } - start.Name.Local = name - } - - // defaultNS records the default name space as set by a xmlns="..." - // attribute. We don't set p.defaultNS because we want to let - // the attribute writing code (in p.defineNS) be solely responsible - // for maintaining that. - defaultNS := p.defaultNS - - // Attributes - for i := range tinfo.fields { - finfo := &tinfo.fields[i] - if finfo.flags&fAttr == 0 { - continue - } - attr, err := p.fieldAttr(finfo, val) - if err != nil { - return err - } - if attr.Name.Local == "" { - continue - } - start.Attr = append(start.Attr, attr) - if attr.Name.Space == "" && attr.Name.Local == "xmlns" { - defaultNS = attr.Value - } - } - if !explicitNS { - // Historic behavior: elements use the default name space - // they are contained in by default. - start.Name.Space = defaultNS - } - // Historic behaviour: an element that's in a namespace sets - // the default namespace for all elements contained within it. - start.setDefaultNamespace() - - if err := p.writeStart(&start); err != nil { - return err - } - - if val.Kind() == reflect.Struct { - err = p.marshalStruct(tinfo, val) - } else { - s, b, err1 := p.marshalSimple(typ, val) - if err1 != nil { - err = err1 - } else if b != nil { - EscapeText(p, b) - } else { - p.EscapeString(s) - } - } - if err != nil { - return err - } - - if err := p.writeEnd(start.Name); err != nil { - return err - } - - return p.cachedWriteError() -} - -// fieldAttr returns the attribute of the given field. -// If the returned attribute has an empty Name.Local, -// it should not be used. -// The given value holds the value containing the field. -func (p *printer) fieldAttr(finfo *fieldInfo, val reflect.Value) (Attr, error) { - fv := finfo.value(val) - name := Name{Space: finfo.xmlns, Local: finfo.name} - if finfo.flags&fOmitEmpty != 0 && isEmptyValue(fv) { - return Attr{}, nil - } - if fv.Kind() == reflect.Interface && fv.IsNil() { - return Attr{}, nil - } - if fv.CanInterface() && fv.Type().Implements(marshalerAttrType) { - attr, err := fv.Interface().(MarshalerAttr).MarshalXMLAttr(name) - return attr, err - } - if fv.CanAddr() { - pv := fv.Addr() - if pv.CanInterface() && pv.Type().Implements(marshalerAttrType) { - attr, err := pv.Interface().(MarshalerAttr).MarshalXMLAttr(name) - return attr, err - } - } - if fv.CanInterface() && fv.Type().Implements(textMarshalerType) { - text, err := fv.Interface().(encoding.TextMarshaler).MarshalText() - if err != nil { - return Attr{}, err - } - return Attr{name, string(text)}, nil - } - if fv.CanAddr() { - pv := fv.Addr() - if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { - text, err := pv.Interface().(encoding.TextMarshaler).MarshalText() - if err != nil { - return Attr{}, err - } - return Attr{name, string(text)}, nil - } - } - // Dereference or skip nil pointer, interface values. - switch fv.Kind() { - case reflect.Ptr, reflect.Interface: - if fv.IsNil() { - return Attr{}, nil - } - fv = fv.Elem() - } - s, b, err := p.marshalSimple(fv.Type(), fv) - if err != nil { - return Attr{}, err - } - if b != nil { - s = string(b) - } - return Attr{name, s}, nil -} - -// defaultStart returns the default start element to use, -// given the reflect type, field info, and start template. -func (p *printer) defaultStart(typ reflect.Type, finfo *fieldInfo, startTemplate *StartElement) StartElement { - var start StartElement - // Precedence for the XML element name is as above, - // except that we do not look inside structs for the first field. - if startTemplate != nil { - start.Name = startTemplate.Name - start.Attr = append(start.Attr, startTemplate.Attr...) - } else if finfo != nil && finfo.name != "" { - start.Name.Local = finfo.name - start.Name.Space = finfo.xmlns - } else if typ.Name() != "" { - start.Name.Local = typ.Name() - } else { - // Must be a pointer to a named type, - // since it has the Marshaler methods. - start.Name.Local = typ.Elem().Name() - } - // Historic behaviour: elements use the name space of - // the element they are contained in by default. - if start.Name.Space == "" { - start.Name.Space = p.defaultNS - } - start.setDefaultNamespace() - return start -} - -// marshalInterface marshals a Marshaler interface value. -func (p *printer) marshalInterface(val Marshaler, start StartElement) error { - // Push a marker onto the tag stack so that MarshalXML - // cannot close the XML tags that it did not open. - p.tags = append(p.tags, Name{}) - n := len(p.tags) - - err := val.MarshalXML(p.encoder, start) - if err != nil { - return err - } - - // Make sure MarshalXML closed all its tags. p.tags[n-1] is the mark. - if len(p.tags) > n { - return fmt.Errorf("xml: %s.MarshalXML wrote invalid XML: <%s> not closed", receiverType(val), p.tags[len(p.tags)-1].Local) - } - p.tags = p.tags[:n-1] - return nil -} - -// marshalTextInterface marshals a TextMarshaler interface value. -func (p *printer) marshalTextInterface(val encoding.TextMarshaler, start StartElement) error { - if err := p.writeStart(&start); err != nil { - return err - } - text, err := val.MarshalText() - if err != nil { - return err - } - EscapeText(p, text) - return p.writeEnd(start.Name) -} - -// writeStart writes the given start element. -func (p *printer) writeStart(start *StartElement) error { - if start.Name.Local == "" { - return fmt.Errorf("xml: start tag with no name") - } - - p.tags = append(p.tags, start.Name) - p.markPrefix() - // Define any name spaces explicitly declared in the attributes. - // We do this as a separate pass so that explicitly declared prefixes - // will take precedence over implicitly declared prefixes - // regardless of the order of the attributes. - ignoreNonEmptyDefault := start.Name.Space == "" - for _, attr := range start.Attr { - if err := p.defineNS(attr, ignoreNonEmptyDefault); err != nil { - return err - } - } - // Define any new name spaces implied by the attributes. - for _, attr := range start.Attr { - name := attr.Name - // From http://www.w3.org/TR/xml-names11/#defaulting - // "Default namespace declarations do not apply directly - // to attribute names; the interpretation of unprefixed - // attributes is determined by the element on which they - // appear." - // This means we don't need to create a new namespace - // when an attribute name space is empty. - if name.Space != "" && !name.isNamespace() { - p.createNSPrefix(name.Space, true) - } - } - p.createNSPrefix(start.Name.Space, false) - - p.writeIndent(1) - p.WriteByte('<') - p.writeName(start.Name, false) - p.writeNamespaces() - for _, attr := range start.Attr { - name := attr.Name - if name.Local == "" || name.isNamespace() { - // Namespaces have already been written by writeNamespaces above. - continue - } - p.WriteByte(' ') - p.writeName(name, true) - p.WriteString(`="`) - p.EscapeString(attr.Value) - p.WriteByte('"') - } - p.WriteByte('>') - return nil -} - -// writeName writes the given name. It assumes -// that p.createNSPrefix(name) has already been called. -func (p *printer) writeName(name Name, isAttr bool) { - if prefix := p.prefixForNS(name.Space, isAttr); prefix != "" { - p.WriteString(prefix) - p.WriteByte(':') - } - p.WriteString(name.Local) -} - -func (p *printer) writeEnd(name Name) error { - if name.Local == "" { - return fmt.Errorf("xml: end tag with no name") - } - if len(p.tags) == 0 || p.tags[len(p.tags)-1].Local == "" { - return fmt.Errorf("xml: end tag without start tag", name.Local) - } - if top := p.tags[len(p.tags)-1]; top != name { - if top.Local != name.Local { - return fmt.Errorf("xml: end tag does not match start tag <%s>", name.Local, top.Local) - } - return fmt.Errorf("xml: end tag in namespace %s does not match start tag <%s> in namespace %s", name.Local, name.Space, top.Local, top.Space) - } - p.tags = p.tags[:len(p.tags)-1] - - p.writeIndent(-1) - p.WriteByte('<') - p.WriteByte('/') - p.writeName(name, false) - p.WriteByte('>') - p.popPrefix() - return nil -} - -func (p *printer) marshalSimple(typ reflect.Type, val reflect.Value) (string, []byte, error) { - switch val.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return strconv.FormatInt(val.Int(), 10), nil, nil - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return strconv.FormatUint(val.Uint(), 10), nil, nil - case reflect.Float32, reflect.Float64: - return strconv.FormatFloat(val.Float(), 'g', -1, val.Type().Bits()), nil, nil - case reflect.String: - return val.String(), nil, nil - case reflect.Bool: - return strconv.FormatBool(val.Bool()), nil, nil - case reflect.Array: - if typ.Elem().Kind() != reflect.Uint8 { - break - } - // [...]byte - var bytes []byte - if val.CanAddr() { - bytes = val.Slice(0, val.Len()).Bytes() - } else { - bytes = make([]byte, val.Len()) - reflect.Copy(reflect.ValueOf(bytes), val) - } - return "", bytes, nil - case reflect.Slice: - if typ.Elem().Kind() != reflect.Uint8 { - break - } - // []byte - return "", val.Bytes(), nil - } - return "", nil, &UnsupportedTypeError{typ} -} - -var ddBytes = []byte("--") - -func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error { - s := parentStack{p: p} - for i := range tinfo.fields { - finfo := &tinfo.fields[i] - if finfo.flags&fAttr != 0 { - continue - } - vf := finfo.value(val) - - // Dereference or skip nil pointer, interface values. - switch vf.Kind() { - case reflect.Ptr, reflect.Interface: - if !vf.IsNil() { - vf = vf.Elem() - } - } - - switch finfo.flags & fMode { - case fCharData: - if err := s.setParents(&noField, reflect.Value{}); err != nil { - return err - } - if vf.CanInterface() && vf.Type().Implements(textMarshalerType) { - data, err := vf.Interface().(encoding.TextMarshaler).MarshalText() - if err != nil { - return err - } - Escape(p, data) - continue - } - if vf.CanAddr() { - pv := vf.Addr() - if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { - data, err := pv.Interface().(encoding.TextMarshaler).MarshalText() - if err != nil { - return err - } - Escape(p, data) - continue - } - } - var scratch [64]byte - switch vf.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - Escape(p, strconv.AppendInt(scratch[:0], vf.Int(), 10)) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - Escape(p, strconv.AppendUint(scratch[:0], vf.Uint(), 10)) - case reflect.Float32, reflect.Float64: - Escape(p, strconv.AppendFloat(scratch[:0], vf.Float(), 'g', -1, vf.Type().Bits())) - case reflect.Bool: - Escape(p, strconv.AppendBool(scratch[:0], vf.Bool())) - case reflect.String: - if err := EscapeText(p, []byte(vf.String())); err != nil { - return err - } - case reflect.Slice: - if elem, ok := vf.Interface().([]byte); ok { - if err := EscapeText(p, elem); err != nil { - return err - } - } - } - continue - - case fComment: - if err := s.setParents(&noField, reflect.Value{}); err != nil { - return err - } - k := vf.Kind() - if !(k == reflect.String || k == reflect.Slice && vf.Type().Elem().Kind() == reflect.Uint8) { - return fmt.Errorf("xml: bad type for comment field of %s", val.Type()) - } - if vf.Len() == 0 { - continue - } - p.writeIndent(0) - p.WriteString("" is invalid grammar. Make it "- -->" - p.WriteByte(' ') - } - p.WriteString("-->") - continue - - case fInnerXml: - iface := vf.Interface() - switch raw := iface.(type) { - case []byte: - p.Write(raw) - continue - case string: - p.WriteString(raw) - continue - } - - case fElement, fElement | fAny: - if err := s.setParents(finfo, vf); err != nil { - return err - } - } - if err := p.marshalValue(vf, finfo, nil); err != nil { - return err - } - } - if err := s.setParents(&noField, reflect.Value{}); err != nil { - return err - } - return p.cachedWriteError() -} - -var noField fieldInfo - -// return the bufio Writer's cached write error -func (p *printer) cachedWriteError() error { - _, err := p.Write(nil) - return err -} - -func (p *printer) writeIndent(depthDelta int) { - if len(p.prefix) == 0 && len(p.indent) == 0 { - return - } - if depthDelta < 0 { - p.depth-- - if p.indentedIn { - p.indentedIn = false - return - } - p.indentedIn = false - } - if p.putNewline { - p.WriteByte('\n') - } else { - p.putNewline = true - } - if len(p.prefix) > 0 { - p.WriteString(p.prefix) - } - if len(p.indent) > 0 { - for i := 0; i < p.depth; i++ { - p.WriteString(p.indent) - } - } - if depthDelta > 0 { - p.depth++ - p.indentedIn = true - } -} - -type parentStack struct { - p *printer - xmlns string - parents []string -} - -// setParents sets the stack of current parents to those found in finfo. -// It only writes the start elements if vf holds a non-nil value. -// If finfo is &noField, it pops all elements. -func (s *parentStack) setParents(finfo *fieldInfo, vf reflect.Value) error { - xmlns := s.p.defaultNS - if finfo.xmlns != "" { - xmlns = finfo.xmlns - } - commonParents := 0 - if xmlns == s.xmlns { - for ; commonParents < len(finfo.parents) && commonParents < len(s.parents); commonParents++ { - if finfo.parents[commonParents] != s.parents[commonParents] { - break - } - } - } - // Pop off any parents that aren't in common with the previous field. - for i := len(s.parents) - 1; i >= commonParents; i-- { - if err := s.p.writeEnd(Name{ - Space: s.xmlns, - Local: s.parents[i], - }); err != nil { - return err - } - } - s.parents = finfo.parents - s.xmlns = xmlns - if commonParents >= len(s.parents) { - // No new elements to push. - return nil - } - if (vf.Kind() == reflect.Ptr || vf.Kind() == reflect.Interface) && vf.IsNil() { - // The element is nil, so no need for the start elements. - s.parents = s.parents[:commonParents] - return nil - } - // Push any new parents required. - for _, name := range s.parents[commonParents:] { - start := &StartElement{ - Name: Name{ - Space: s.xmlns, - Local: name, - }, - } - // Set the default name space for parent elements - // to match what we do with other elements. - if s.xmlns != s.p.defaultNS { - start.setDefaultNamespace() - } - if err := s.p.writeStart(start); err != nil { - return err - } - } - return nil -} - -// A MarshalXMLError is returned when Marshal encounters a type -// that cannot be converted into XML. -type UnsupportedTypeError struct { - Type reflect.Type -} - -func (e *UnsupportedTypeError) Error() string { - return "xml: unsupported type: " + e.Type.String() -} - -func isEmptyValue(v reflect.Value) bool { - switch v.Kind() { - case reflect.Array, reflect.Map, reflect.Slice, reflect.String: - return v.Len() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Interface, reflect.Ptr: - return v.IsNil() - } - return false -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go b/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go deleted file mode 100644 index 226cfd013..000000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go +++ /dev/null @@ -1,1939 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import ( - "bytes" - "errors" - "fmt" - "io" - "reflect" - "strconv" - "strings" - "sync" - "testing" - "time" -) - -type DriveType int - -const ( - HyperDrive DriveType = iota - ImprobabilityDrive -) - -type Passenger struct { - Name []string `xml:"name"` - Weight float32 `xml:"weight"` -} - -type Ship struct { - XMLName struct{} `xml:"spaceship"` - - Name string `xml:"name,attr"` - Pilot string `xml:"pilot,attr"` - Drive DriveType `xml:"drive"` - Age uint `xml:"age"` - Passenger []*Passenger `xml:"passenger"` - secret string -} - -type NamedType string - -type Port struct { - XMLName struct{} `xml:"port"` - Type string `xml:"type,attr,omitempty"` - Comment string `xml:",comment"` - Number string `xml:",chardata"` -} - -type Domain struct { - XMLName struct{} `xml:"domain"` - Country string `xml:",attr,omitempty"` - Name []byte `xml:",chardata"` - Comment []byte `xml:",comment"` -} - -type Book struct { - XMLName struct{} `xml:"book"` - Title string `xml:",chardata"` -} - -type Event struct { - XMLName struct{} `xml:"event"` - Year int `xml:",chardata"` -} - -type Movie struct { - XMLName struct{} `xml:"movie"` - Length uint `xml:",chardata"` -} - -type Pi struct { - XMLName struct{} `xml:"pi"` - Approximation float32 `xml:",chardata"` -} - -type Universe struct { - XMLName struct{} `xml:"universe"` - Visible float64 `xml:",chardata"` -} - -type Particle struct { - XMLName struct{} `xml:"particle"` - HasMass bool `xml:",chardata"` -} - -type Departure struct { - XMLName struct{} `xml:"departure"` - When time.Time `xml:",chardata"` -} - -type SecretAgent struct { - XMLName struct{} `xml:"agent"` - Handle string `xml:"handle,attr"` - Identity string - Obfuscate string `xml:",innerxml"` -} - -type NestedItems struct { - XMLName struct{} `xml:"result"` - Items []string `xml:">item"` - Item1 []string `xml:"Items>item1"` -} - -type NestedOrder struct { - XMLName struct{} `xml:"result"` - Field1 string `xml:"parent>c"` - Field2 string `xml:"parent>b"` - Field3 string `xml:"parent>a"` -} - -type MixedNested struct { - XMLName struct{} `xml:"result"` - A string `xml:"parent1>a"` - B string `xml:"b"` - C string `xml:"parent1>parent2>c"` - D string `xml:"parent1>d"` -} - -type NilTest struct { - A interface{} `xml:"parent1>parent2>a"` - B interface{} `xml:"parent1>b"` - C interface{} `xml:"parent1>parent2>c"` -} - -type Service struct { - XMLName struct{} `xml:"service"` - Domain *Domain `xml:"host>domain"` - Port *Port `xml:"host>port"` - Extra1 interface{} - Extra2 interface{} `xml:"host>extra2"` -} - -var nilStruct *Ship - -type EmbedA struct { - EmbedC - EmbedB EmbedB - FieldA string -} - -type EmbedB struct { - FieldB string - *EmbedC -} - -type EmbedC struct { - FieldA1 string `xml:"FieldA>A1"` - FieldA2 string `xml:"FieldA>A2"` - FieldB string - FieldC string -} - -type NameCasing struct { - XMLName struct{} `xml:"casing"` - Xy string - XY string - XyA string `xml:"Xy,attr"` - XYA string `xml:"XY,attr"` -} - -type NamePrecedence struct { - XMLName Name `xml:"Parent"` - FromTag XMLNameWithoutTag `xml:"InTag"` - FromNameVal XMLNameWithoutTag - FromNameTag XMLNameWithTag - InFieldName string -} - -type XMLNameWithTag struct { - XMLName Name `xml:"InXMLNameTag"` - Value string `xml:",chardata"` -} - -type XMLNameWithNSTag struct { - XMLName Name `xml:"ns InXMLNameWithNSTag"` - Value string `xml:",chardata"` -} - -type XMLNameWithoutTag struct { - XMLName Name - Value string `xml:",chardata"` -} - -type NameInField struct { - Foo Name `xml:"ns foo"` -} - -type AttrTest struct { - Int int `xml:",attr"` - Named int `xml:"int,attr"` - Float float64 `xml:",attr"` - Uint8 uint8 `xml:",attr"` - Bool bool `xml:",attr"` - Str string `xml:",attr"` - Bytes []byte `xml:",attr"` -} - -type OmitAttrTest struct { - Int int `xml:",attr,omitempty"` - Named int `xml:"int,attr,omitempty"` - Float float64 `xml:",attr,omitempty"` - Uint8 uint8 `xml:",attr,omitempty"` - Bool bool `xml:",attr,omitempty"` - Str string `xml:",attr,omitempty"` - Bytes []byte `xml:",attr,omitempty"` -} - -type OmitFieldTest struct { - Int int `xml:",omitempty"` - Named int `xml:"int,omitempty"` - Float float64 `xml:",omitempty"` - Uint8 uint8 `xml:",omitempty"` - Bool bool `xml:",omitempty"` - Str string `xml:",omitempty"` - Bytes []byte `xml:",omitempty"` - Ptr *PresenceTest `xml:",omitempty"` -} - -type AnyTest struct { - XMLName struct{} `xml:"a"` - Nested string `xml:"nested>value"` - AnyField AnyHolder `xml:",any"` -} - -type AnyOmitTest struct { - XMLName struct{} `xml:"a"` - Nested string `xml:"nested>value"` - AnyField *AnyHolder `xml:",any,omitempty"` -} - -type AnySliceTest struct { - XMLName struct{} `xml:"a"` - Nested string `xml:"nested>value"` - AnyField []AnyHolder `xml:",any"` -} - -type AnyHolder struct { - XMLName Name - XML string `xml:",innerxml"` -} - -type RecurseA struct { - A string - B *RecurseB -} - -type RecurseB struct { - A *RecurseA - B string -} - -type PresenceTest struct { - Exists *struct{} -} - -type IgnoreTest struct { - PublicSecret string `xml:"-"` -} - -type MyBytes []byte - -type Data struct { - Bytes []byte - Attr []byte `xml:",attr"` - Custom MyBytes -} - -type Plain struct { - V interface{} -} - -type MyInt int - -type EmbedInt struct { - MyInt -} - -type Strings struct { - X []string `xml:"A>B,omitempty"` -} - -type PointerFieldsTest struct { - XMLName Name `xml:"dummy"` - Name *string `xml:"name,attr"` - Age *uint `xml:"age,attr"` - Empty *string `xml:"empty,attr"` - Contents *string `xml:",chardata"` -} - -type ChardataEmptyTest struct { - XMLName Name `xml:"test"` - Contents *string `xml:",chardata"` -} - -type MyMarshalerTest struct { -} - -var _ Marshaler = (*MyMarshalerTest)(nil) - -func (m *MyMarshalerTest) MarshalXML(e *Encoder, start StartElement) error { - e.EncodeToken(start) - e.EncodeToken(CharData([]byte("hello world"))) - e.EncodeToken(EndElement{start.Name}) - return nil -} - -type MyMarshalerAttrTest struct{} - -var _ MarshalerAttr = (*MyMarshalerAttrTest)(nil) - -func (m *MyMarshalerAttrTest) MarshalXMLAttr(name Name) (Attr, error) { - return Attr{name, "hello world"}, nil -} - -type MyMarshalerValueAttrTest struct{} - -var _ MarshalerAttr = MyMarshalerValueAttrTest{} - -func (m MyMarshalerValueAttrTest) MarshalXMLAttr(name Name) (Attr, error) { - return Attr{name, "hello world"}, nil -} - -type MarshalerStruct struct { - Foo MyMarshalerAttrTest `xml:",attr"` -} - -type MarshalerValueStruct struct { - Foo MyMarshalerValueAttrTest `xml:",attr"` -} - -type InnerStruct struct { - XMLName Name `xml:"testns outer"` -} - -type OuterStruct struct { - InnerStruct - IntAttr int `xml:"int,attr"` -} - -type OuterNamedStruct struct { - InnerStruct - XMLName Name `xml:"outerns test"` - IntAttr int `xml:"int,attr"` -} - -type OuterNamedOrderedStruct struct { - XMLName Name `xml:"outerns test"` - InnerStruct - IntAttr int `xml:"int,attr"` -} - -type OuterOuterStruct struct { - OuterStruct -} - -type NestedAndChardata struct { - AB []string `xml:"A>B"` - Chardata string `xml:",chardata"` -} - -type NestedAndComment struct { - AB []string `xml:"A>B"` - Comment string `xml:",comment"` -} - -type XMLNSFieldStruct struct { - Ns string `xml:"xmlns,attr"` - Body string -} - -type NamedXMLNSFieldStruct struct { - XMLName struct{} `xml:"testns test"` - Ns string `xml:"xmlns,attr"` - Body string -} - -type XMLNSFieldStructWithOmitEmpty struct { - Ns string `xml:"xmlns,attr,omitempty"` - Body string -} - -type NamedXMLNSFieldStructWithEmptyNamespace struct { - XMLName struct{} `xml:"test"` - Ns string `xml:"xmlns,attr"` - Body string -} - -type RecursiveXMLNSFieldStruct struct { - Ns string `xml:"xmlns,attr"` - Body *RecursiveXMLNSFieldStruct `xml:",omitempty"` - Text string `xml:",omitempty"` -} - -func ifaceptr(x interface{}) interface{} { - return &x -} - -var ( - nameAttr = "Sarah" - ageAttr = uint(12) - contentsAttr = "lorem ipsum" -) - -// Unless explicitly stated as such (or *Plain), all of the -// tests below are two-way tests. When introducing new tests, -// please try to make them two-way as well to ensure that -// marshalling and unmarshalling are as symmetrical as feasible. -var marshalTests = []struct { - Value interface{} - ExpectXML string - MarshalOnly bool - UnmarshalOnly bool -}{ - // Test nil marshals to nothing - {Value: nil, ExpectXML: ``, MarshalOnly: true}, - {Value: nilStruct, ExpectXML: ``, MarshalOnly: true}, - - // Test value types - {Value: &Plain{true}, ExpectXML: `true`}, - {Value: &Plain{false}, ExpectXML: `false`}, - {Value: &Plain{int(42)}, ExpectXML: `42`}, - {Value: &Plain{int8(42)}, ExpectXML: `42`}, - {Value: &Plain{int16(42)}, ExpectXML: `42`}, - {Value: &Plain{int32(42)}, ExpectXML: `42`}, - {Value: &Plain{uint(42)}, ExpectXML: `42`}, - {Value: &Plain{uint8(42)}, ExpectXML: `42`}, - {Value: &Plain{uint16(42)}, ExpectXML: `42`}, - {Value: &Plain{uint32(42)}, ExpectXML: `42`}, - {Value: &Plain{float32(1.25)}, ExpectXML: `1.25`}, - {Value: &Plain{float64(1.25)}, ExpectXML: `1.25`}, - {Value: &Plain{uintptr(0xFFDD)}, ExpectXML: `65501`}, - {Value: &Plain{"gopher"}, ExpectXML: `gopher`}, - {Value: &Plain{[]byte("gopher")}, ExpectXML: `gopher`}, - {Value: &Plain{""}, ExpectXML: `</>`}, - {Value: &Plain{[]byte("")}, ExpectXML: `</>`}, - {Value: &Plain{[3]byte{'<', '/', '>'}}, ExpectXML: `</>`}, - {Value: &Plain{NamedType("potato")}, ExpectXML: `potato`}, - {Value: &Plain{[]int{1, 2, 3}}, ExpectXML: `123`}, - {Value: &Plain{[3]int{1, 2, 3}}, ExpectXML: `123`}, - {Value: ifaceptr(true), MarshalOnly: true, ExpectXML: `true`}, - - // Test time. - { - Value: &Plain{time.Unix(1e9, 123456789).UTC()}, - ExpectXML: `2001-09-09T01:46:40.123456789Z`, - }, - - // A pointer to struct{} may be used to test for an element's presence. - { - Value: &PresenceTest{new(struct{})}, - ExpectXML: ``, - }, - { - Value: &PresenceTest{}, - ExpectXML: ``, - }, - - // A pointer to struct{} may be used to test for an element's presence. - { - Value: &PresenceTest{new(struct{})}, - ExpectXML: ``, - }, - { - Value: &PresenceTest{}, - ExpectXML: ``, - }, - - // A []byte field is only nil if the element was not found. - { - Value: &Data{}, - ExpectXML: ``, - UnmarshalOnly: true, - }, - { - Value: &Data{Bytes: []byte{}, Custom: MyBytes{}, Attr: []byte{}}, - ExpectXML: ``, - UnmarshalOnly: true, - }, - - // Check that []byte works, including named []byte types. - { - Value: &Data{Bytes: []byte("ab"), Custom: MyBytes("cd"), Attr: []byte{'v'}}, - ExpectXML: `abcd`, - }, - - // Test innerxml - { - Value: &SecretAgent{ - Handle: "007", - Identity: "James Bond", - Obfuscate: "", - }, - ExpectXML: `James Bond`, - MarshalOnly: true, - }, - { - Value: &SecretAgent{ - Handle: "007", - Identity: "James Bond", - Obfuscate: "James Bond", - }, - ExpectXML: `James Bond`, - UnmarshalOnly: true, - }, - - // Test structs - {Value: &Port{Type: "ssl", Number: "443"}, ExpectXML: `443`}, - {Value: &Port{Number: "443"}, ExpectXML: `443`}, - {Value: &Port{Type: ""}, ExpectXML: ``}, - {Value: &Port{Number: "443", Comment: "https"}, ExpectXML: `443`}, - {Value: &Port{Number: "443", Comment: "add space-"}, ExpectXML: `443`, MarshalOnly: true}, - {Value: &Domain{Name: []byte("google.com&friends")}, ExpectXML: `google.com&friends`}, - {Value: &Domain{Name: []byte("google.com"), Comment: []byte(" &friends ")}, ExpectXML: `google.com`}, - {Value: &Book{Title: "Pride & Prejudice"}, ExpectXML: `Pride & Prejudice`}, - {Value: &Event{Year: -3114}, ExpectXML: `-3114`}, - {Value: &Movie{Length: 13440}, ExpectXML: `13440`}, - {Value: &Pi{Approximation: 3.14159265}, ExpectXML: `3.1415927`}, - {Value: &Universe{Visible: 9.3e13}, ExpectXML: `9.3e+13`}, - {Value: &Particle{HasMass: true}, ExpectXML: `true`}, - {Value: &Departure{When: ParseTime("2013-01-09T00:15:00-09:00")}, ExpectXML: `2013-01-09T00:15:00-09:00`}, - {Value: atomValue, ExpectXML: atomXml}, - { - Value: &Ship{ - Name: "Heart of Gold", - Pilot: "Computer", - Age: 1, - Drive: ImprobabilityDrive, - Passenger: []*Passenger{ - { - Name: []string{"Zaphod", "Beeblebrox"}, - Weight: 7.25, - }, - { - Name: []string{"Trisha", "McMillen"}, - Weight: 5.5, - }, - { - Name: []string{"Ford", "Prefect"}, - Weight: 7, - }, - { - Name: []string{"Arthur", "Dent"}, - Weight: 6.75, - }, - }, - }, - ExpectXML: `` + - `` + strconv.Itoa(int(ImprobabilityDrive)) + `` + - `1` + - `` + - `Zaphod` + - `Beeblebrox` + - `7.25` + - `` + - `` + - `Trisha` + - `McMillen` + - `5.5` + - `` + - `` + - `Ford` + - `Prefect` + - `7` + - `` + - `` + - `Arthur` + - `Dent` + - `6.75` + - `` + - ``, - }, - - // Test a>b - { - Value: &NestedItems{Items: nil, Item1: nil}, - ExpectXML: `` + - `` + - `` + - ``, - }, - { - Value: &NestedItems{Items: []string{}, Item1: []string{}}, - ExpectXML: `` + - `` + - `` + - ``, - MarshalOnly: true, - }, - { - Value: &NestedItems{Items: nil, Item1: []string{"A"}}, - ExpectXML: `` + - `` + - `A` + - `` + - ``, - }, - { - Value: &NestedItems{Items: []string{"A", "B"}, Item1: nil}, - ExpectXML: `` + - `` + - `A` + - `B` + - `` + - ``, - }, - { - Value: &NestedItems{Items: []string{"A", "B"}, Item1: []string{"C"}}, - ExpectXML: `` + - `` + - `A` + - `B` + - `C` + - `` + - ``, - }, - { - Value: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"}, - ExpectXML: `` + - `` + - `C` + - `B` + - `A` + - `` + - ``, - }, - { - Value: &NilTest{A: "A", B: nil, C: "C"}, - ExpectXML: `` + - `` + - `A` + - `C` + - `` + - ``, - MarshalOnly: true, // Uses interface{} - }, - { - Value: &MixedNested{A: "A", B: "B", C: "C", D: "D"}, - ExpectXML: `` + - `A` + - `B` + - `` + - `C` + - `D` + - `` + - ``, - }, - { - Value: &Service{Port: &Port{Number: "80"}}, - ExpectXML: `80`, - }, - { - Value: &Service{}, - ExpectXML: ``, - }, - { - Value: &Service{Port: &Port{Number: "80"}, Extra1: "A", Extra2: "B"}, - ExpectXML: `` + - `80` + - `A` + - `B` + - ``, - MarshalOnly: true, - }, - { - Value: &Service{Port: &Port{Number: "80"}, Extra2: "example"}, - ExpectXML: `` + - `80` + - `example` + - ``, - MarshalOnly: true, - }, - { - Value: &struct { - XMLName struct{} `xml:"space top"` - A string `xml:"x>a"` - B string `xml:"x>b"` - C string `xml:"space x>c"` - C1 string `xml:"space1 x>c"` - D1 string `xml:"space1 x>d"` - E1 string `xml:"x>e"` - }{ - A: "a", - B: "b", - C: "c", - C1: "c1", - D1: "d1", - E1: "e1", - }, - ExpectXML: `` + - `abc` + - `` + - `c1` + - `d1` + - `` + - `` + - `e1` + - `` + - ``, - }, - { - Value: &struct { - XMLName Name - A string `xml:"x>a"` - B string `xml:"x>b"` - C string `xml:"space x>c"` - C1 string `xml:"space1 x>c"` - D1 string `xml:"space1 x>d"` - }{ - XMLName: Name{ - Space: "space0", - Local: "top", - }, - A: "a", - B: "b", - C: "c", - C1: "c1", - D1: "d1", - }, - ExpectXML: `` + - `ab` + - `c` + - `` + - `c1` + - `d1` + - `` + - ``, - }, - { - Value: &struct { - XMLName struct{} `xml:"top"` - B string `xml:"space x>b"` - B1 string `xml:"space1 x>b"` - }{ - B: "b", - B1: "b1", - }, - ExpectXML: `` + - `b` + - `b1` + - ``, - }, - - // Test struct embedding - { - Value: &EmbedA{ - EmbedC: EmbedC{ - FieldA1: "", // Shadowed by A.A - FieldA2: "", // Shadowed by A.A - FieldB: "A.C.B", - FieldC: "A.C.C", - }, - EmbedB: EmbedB{ - FieldB: "A.B.B", - EmbedC: &EmbedC{ - FieldA1: "A.B.C.A1", - FieldA2: "A.B.C.A2", - FieldB: "", // Shadowed by A.B.B - FieldC: "A.B.C.C", - }, - }, - FieldA: "A.A", - }, - ExpectXML: `` + - `A.C.B` + - `A.C.C` + - `` + - `A.B.B` + - `` + - `A.B.C.A1` + - `A.B.C.A2` + - `` + - `A.B.C.C` + - `` + - `A.A` + - ``, - }, - - // Test that name casing matters - { - Value: &NameCasing{Xy: "mixed", XY: "upper", XyA: "mixedA", XYA: "upperA"}, - ExpectXML: `mixedupper`, - }, - - // Test the order in which the XML element name is chosen - { - Value: &NamePrecedence{ - FromTag: XMLNameWithoutTag{Value: "A"}, - FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "InXMLName"}, Value: "B"}, - FromNameTag: XMLNameWithTag{Value: "C"}, - InFieldName: "D", - }, - ExpectXML: `` + - `A` + - `B` + - `C` + - `D` + - ``, - MarshalOnly: true, - }, - { - Value: &NamePrecedence{ - XMLName: Name{Local: "Parent"}, - FromTag: XMLNameWithoutTag{XMLName: Name{Local: "InTag"}, Value: "A"}, - FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "FromNameVal"}, Value: "B"}, - FromNameTag: XMLNameWithTag{XMLName: Name{Local: "InXMLNameTag"}, Value: "C"}, - InFieldName: "D", - }, - ExpectXML: `` + - `A` + - `B` + - `C` + - `D` + - ``, - UnmarshalOnly: true, - }, - - // xml.Name works in a plain field as well. - { - Value: &NameInField{Name{Space: "ns", Local: "foo"}}, - ExpectXML: ``, - }, - { - Value: &NameInField{Name{Space: "ns", Local: "foo"}}, - ExpectXML: ``, - UnmarshalOnly: true, - }, - - // Marshaling zero xml.Name uses the tag or field name. - { - Value: &NameInField{}, - ExpectXML: ``, - MarshalOnly: true, - }, - - // Test attributes - { - Value: &AttrTest{ - Int: 8, - Named: 9, - Float: 23.5, - Uint8: 255, - Bool: true, - Str: "str", - Bytes: []byte("byt"), - }, - ExpectXML: ``, - }, - { - Value: &AttrTest{Bytes: []byte{}}, - ExpectXML: ``, - }, - { - Value: &OmitAttrTest{ - Int: 8, - Named: 9, - Float: 23.5, - Uint8: 255, - Bool: true, - Str: "str", - Bytes: []byte("byt"), - }, - ExpectXML: ``, - }, - { - Value: &OmitAttrTest{}, - ExpectXML: ``, - }, - - // pointer fields - { - Value: &PointerFieldsTest{Name: &nameAttr, Age: &ageAttr, Contents: &contentsAttr}, - ExpectXML: `lorem ipsum`, - MarshalOnly: true, - }, - - // empty chardata pointer field - { - Value: &ChardataEmptyTest{}, - ExpectXML: ``, - MarshalOnly: true, - }, - - // omitempty on fields - { - Value: &OmitFieldTest{ - Int: 8, - Named: 9, - Float: 23.5, - Uint8: 255, - Bool: true, - Str: "str", - Bytes: []byte("byt"), - Ptr: &PresenceTest{}, - }, - ExpectXML: `` + - `8` + - `9` + - `23.5` + - `255` + - `true` + - `str` + - `byt` + - `` + - ``, - }, - { - Value: &OmitFieldTest{}, - ExpectXML: ``, - }, - - // Test ",any" - { - ExpectXML: `knownunknown`, - Value: &AnyTest{ - Nested: "known", - AnyField: AnyHolder{ - XMLName: Name{Local: "other"}, - XML: "unknown", - }, - }, - }, - { - Value: &AnyTest{Nested: "known", - AnyField: AnyHolder{ - XML: "", - XMLName: Name{Local: "AnyField"}, - }, - }, - ExpectXML: `known`, - }, - { - ExpectXML: `b`, - Value: &AnyOmitTest{ - Nested: "b", - }, - }, - { - ExpectXML: `bei`, - Value: &AnySliceTest{ - Nested: "b", - AnyField: []AnyHolder{ - { - XMLName: Name{Local: "c"}, - XML: "e", - }, - { - XMLName: Name{Space: "f", Local: "g"}, - XML: "i", - }, - }, - }, - }, - { - ExpectXML: `b`, - Value: &AnySliceTest{ - Nested: "b", - }, - }, - - // Test recursive types. - { - Value: &RecurseA{ - A: "a1", - B: &RecurseB{ - A: &RecurseA{"a2", nil}, - B: "b1", - }, - }, - ExpectXML: `a1a2b1`, - }, - - // Test ignoring fields via "-" tag - { - ExpectXML: ``, - Value: &IgnoreTest{}, - }, - { - ExpectXML: ``, - Value: &IgnoreTest{PublicSecret: "can't tell"}, - MarshalOnly: true, - }, - { - ExpectXML: `ignore me`, - Value: &IgnoreTest{}, - UnmarshalOnly: true, - }, - - // Test escaping. - { - ExpectXML: `dquote: "; squote: '; ampersand: &; less: <; greater: >;`, - Value: &AnyTest{ - Nested: `dquote: "; squote: '; ampersand: &; less: <; greater: >;`, - AnyField: AnyHolder{XMLName: Name{Local: "empty"}}, - }, - }, - { - ExpectXML: `newline: ; cr: ; tab: ;`, - Value: &AnyTest{ - Nested: "newline: \n; cr: \r; tab: \t;", - AnyField: AnyHolder{XMLName: Name{Local: "AnyField"}}, - }, - }, - { - ExpectXML: "1\r2\r\n3\n\r4\n5", - Value: &AnyTest{ - Nested: "1\n2\n3\n\n4\n5", - }, - UnmarshalOnly: true, - }, - { - ExpectXML: `42`, - Value: &EmbedInt{ - MyInt: 42, - }, - }, - // Test omitempty with parent chain; see golang.org/issue/4168. - { - ExpectXML: ``, - Value: &Strings{}, - }, - // Custom marshalers. - { - ExpectXML: `hello world`, - Value: &MyMarshalerTest{}, - }, - { - ExpectXML: ``, - Value: &MarshalerStruct{}, - }, - { - ExpectXML: ``, - Value: &MarshalerValueStruct{}, - }, - { - ExpectXML: ``, - Value: &OuterStruct{IntAttr: 10}, - }, - { - ExpectXML: ``, - Value: &OuterNamedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10}, - }, - { - ExpectXML: ``, - Value: &OuterNamedOrderedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10}, - }, - { - ExpectXML: ``, - Value: &OuterOuterStruct{OuterStruct{IntAttr: 10}}, - }, - { - ExpectXML: `test`, - Value: &NestedAndChardata{AB: make([]string, 2), Chardata: "test"}, - }, - { - ExpectXML: ``, - Value: &NestedAndComment{AB: make([]string, 2), Comment: "test"}, - }, - { - ExpectXML: `hello world`, - Value: &XMLNSFieldStruct{Ns: "http://example.com/ns", Body: "hello world"}, - }, - { - ExpectXML: `hello world`, - Value: &NamedXMLNSFieldStruct{Ns: "http://example.com/ns", Body: "hello world"}, - }, - { - ExpectXML: `hello world`, - Value: &NamedXMLNSFieldStruct{Ns: "", Body: "hello world"}, - }, - { - ExpectXML: `hello world`, - Value: &XMLNSFieldStructWithOmitEmpty{Body: "hello world"}, - }, - { - // The xmlns attribute must be ignored because the - // element is in the empty namespace, so it's not possible - // to set the default namespace to something non-empty. - ExpectXML: `hello world`, - Value: &NamedXMLNSFieldStructWithEmptyNamespace{Ns: "foo", Body: "hello world"}, - MarshalOnly: true, - }, - { - ExpectXML: `hello world`, - Value: &RecursiveXMLNSFieldStruct{ - Ns: "foo", - Body: &RecursiveXMLNSFieldStruct{ - Text: "hello world", - }, - }, - }, -} - -func TestMarshal(t *testing.T) { - for idx, test := range marshalTests { - if test.UnmarshalOnly { - continue - } - data, err := Marshal(test.Value) - if err != nil { - t.Errorf("#%d: marshal(%#v): %s", idx, test.Value, err) - continue - } - if got, want := string(data), test.ExpectXML; got != want { - if strings.Contains(want, "\n") { - t.Errorf("#%d: marshal(%#v):\nHAVE:\n%s\nWANT:\n%s", idx, test.Value, got, want) - } else { - t.Errorf("#%d: marshal(%#v):\nhave %#q\nwant %#q", idx, test.Value, got, want) - } - } - } -} - -type AttrParent struct { - X string `xml:"X>Y,attr"` -} - -type BadAttr struct { - Name []string `xml:"name,attr"` -} - -var marshalErrorTests = []struct { - Value interface{} - Err string - Kind reflect.Kind -}{ - { - Value: make(chan bool), - Err: "xml: unsupported type: chan bool", - Kind: reflect.Chan, - }, - { - Value: map[string]string{ - "question": "What do you get when you multiply six by nine?", - "answer": "42", - }, - Err: "xml: unsupported type: map[string]string", - Kind: reflect.Map, - }, - { - Value: map[*Ship]bool{nil: false}, - Err: "xml: unsupported type: map[*xml.Ship]bool", - Kind: reflect.Map, - }, - { - Value: &Domain{Comment: []byte("f--bar")}, - Err: `xml: comments must not contain "--"`, - }, - // Reject parent chain with attr, never worked; see golang.org/issue/5033. - { - Value: &AttrParent{}, - Err: `xml: X>Y chain not valid with attr flag`, - }, - { - Value: BadAttr{[]string{"X", "Y"}}, - Err: `xml: unsupported type: []string`, - }, -} - -var marshalIndentTests = []struct { - Value interface{} - Prefix string - Indent string - ExpectXML string -}{ - { - Value: &SecretAgent{ - Handle: "007", - Identity: "James Bond", - Obfuscate: "", - }, - Prefix: "", - Indent: "\t", - ExpectXML: fmt.Sprintf("\n\tJames Bond\n"), - }, -} - -func TestMarshalErrors(t *testing.T) { - for idx, test := range marshalErrorTests { - data, err := Marshal(test.Value) - if err == nil { - t.Errorf("#%d: marshal(%#v) = [success] %q, want error %v", idx, test.Value, data, test.Err) - continue - } - if err.Error() != test.Err { - t.Errorf("#%d: marshal(%#v) = [error] %v, want %v", idx, test.Value, err, test.Err) - } - if test.Kind != reflect.Invalid { - if kind := err.(*UnsupportedTypeError).Type.Kind(); kind != test.Kind { - t.Errorf("#%d: marshal(%#v) = [error kind] %s, want %s", idx, test.Value, kind, test.Kind) - } - } - } -} - -// Do invertibility testing on the various structures that we test -func TestUnmarshal(t *testing.T) { - for i, test := range marshalTests { - if test.MarshalOnly { - continue - } - if _, ok := test.Value.(*Plain); ok { - continue - } - vt := reflect.TypeOf(test.Value) - dest := reflect.New(vt.Elem()).Interface() - err := Unmarshal([]byte(test.ExpectXML), dest) - - switch fix := dest.(type) { - case *Feed: - fix.Author.InnerXML = "" - for i := range fix.Entry { - fix.Entry[i].Author.InnerXML = "" - } - } - - if err != nil { - t.Errorf("#%d: unexpected error: %#v", i, err) - } else if got, want := dest, test.Value; !reflect.DeepEqual(got, want) { - t.Errorf("#%d: unmarshal(%q):\nhave %#v\nwant %#v", i, test.ExpectXML, got, want) - } - } -} - -func TestMarshalIndent(t *testing.T) { - for i, test := range marshalIndentTests { - data, err := MarshalIndent(test.Value, test.Prefix, test.Indent) - if err != nil { - t.Errorf("#%d: Error: %s", i, err) - continue - } - if got, want := string(data), test.ExpectXML; got != want { - t.Errorf("#%d: MarshalIndent:\nGot:%s\nWant:\n%s", i, got, want) - } - } -} - -type limitedBytesWriter struct { - w io.Writer - remain int // until writes fail -} - -func (lw *limitedBytesWriter) Write(p []byte) (n int, err error) { - if lw.remain <= 0 { - println("error") - return 0, errors.New("write limit hit") - } - if len(p) > lw.remain { - p = p[:lw.remain] - n, _ = lw.w.Write(p) - lw.remain = 0 - return n, errors.New("write limit hit") - } - n, err = lw.w.Write(p) - lw.remain -= n - return n, err -} - -func TestMarshalWriteErrors(t *testing.T) { - var buf bytes.Buffer - const writeCap = 1024 - w := &limitedBytesWriter{&buf, writeCap} - enc := NewEncoder(w) - var err error - var i int - const n = 4000 - for i = 1; i <= n; i++ { - err = enc.Encode(&Passenger{ - Name: []string{"Alice", "Bob"}, - Weight: 5, - }) - if err != nil { - break - } - } - if err == nil { - t.Error("expected an error") - } - if i == n { - t.Errorf("expected to fail before the end") - } - if buf.Len() != writeCap { - t.Errorf("buf.Len() = %d; want %d", buf.Len(), writeCap) - } -} - -func TestMarshalWriteIOErrors(t *testing.T) { - enc := NewEncoder(errWriter{}) - - expectErr := "unwritable" - err := enc.Encode(&Passenger{}) - if err == nil || err.Error() != expectErr { - t.Errorf("EscapeTest = [error] %v, want %v", err, expectErr) - } -} - -func TestMarshalFlush(t *testing.T) { - var buf bytes.Buffer - enc := NewEncoder(&buf) - if err := enc.EncodeToken(CharData("hello world")); err != nil { - t.Fatalf("enc.EncodeToken: %v", err) - } - if buf.Len() > 0 { - t.Fatalf("enc.EncodeToken caused actual write: %q", buf.Bytes()) - } - if err := enc.Flush(); err != nil { - t.Fatalf("enc.Flush: %v", err) - } - if buf.String() != "hello world" { - t.Fatalf("after enc.Flush, buf.String() = %q, want %q", buf.String(), "hello world") - } -} - -var encodeElementTests = []struct { - desc string - value interface{} - start StartElement - expectXML string -}{{ - desc: "simple string", - value: "hello", - start: StartElement{ - Name: Name{Local: "a"}, - }, - expectXML: `hello`, -}, { - desc: "string with added attributes", - value: "hello", - start: StartElement{ - Name: Name{Local: "a"}, - Attr: []Attr{{ - Name: Name{Local: "x"}, - Value: "y", - }, { - Name: Name{Local: "foo"}, - Value: "bar", - }}, - }, - expectXML: `hello`, -}, { - desc: "start element with default name space", - value: struct { - Foo XMLNameWithNSTag - }{ - Foo: XMLNameWithNSTag{ - Value: "hello", - }, - }, - start: StartElement{ - Name: Name{Space: "ns", Local: "a"}, - Attr: []Attr{{ - Name: Name{Local: "xmlns"}, - // "ns" is the name space defined in XMLNameWithNSTag - Value: "ns", - }}, - }, - expectXML: `hello`, -}, { - desc: "start element in name space with different default name space", - value: struct { - Foo XMLNameWithNSTag - }{ - Foo: XMLNameWithNSTag{ - Value: "hello", - }, - }, - start: StartElement{ - Name: Name{Space: "ns2", Local: "a"}, - Attr: []Attr{{ - Name: Name{Local: "xmlns"}, - // "ns" is the name space defined in XMLNameWithNSTag - Value: "ns", - }}, - }, - expectXML: `hello`, -}, { - desc: "XMLMarshaler with start element with default name space", - value: &MyMarshalerTest{}, - start: StartElement{ - Name: Name{Space: "ns2", Local: "a"}, - Attr: []Attr{{ - Name: Name{Local: "xmlns"}, - // "ns" is the name space defined in XMLNameWithNSTag - Value: "ns", - }}, - }, - expectXML: `hello world`, -}} - -func TestEncodeElement(t *testing.T) { - for idx, test := range encodeElementTests { - var buf bytes.Buffer - enc := NewEncoder(&buf) - err := enc.EncodeElement(test.value, test.start) - if err != nil { - t.Fatalf("enc.EncodeElement: %v", err) - } - err = enc.Flush() - if err != nil { - t.Fatalf("enc.Flush: %v", err) - } - if got, want := buf.String(), test.expectXML; got != want { - t.Errorf("#%d(%s): EncodeElement(%#v, %#v):\nhave %#q\nwant %#q", idx, test.desc, test.value, test.start, got, want) - } - } -} - -func BenchmarkMarshal(b *testing.B) { - b.ReportAllocs() - for i := 0; i < b.N; i++ { - Marshal(atomValue) - } -} - -func BenchmarkUnmarshal(b *testing.B) { - b.ReportAllocs() - xml := []byte(atomXml) - for i := 0; i < b.N; i++ { - Unmarshal(xml, &Feed{}) - } -} - -// golang.org/issue/6556 -func TestStructPointerMarshal(t *testing.T) { - type A struct { - XMLName string `xml:"a"` - B []interface{} - } - type C struct { - XMLName Name - Value string `xml:"value"` - } - - a := new(A) - a.B = append(a.B, &C{ - XMLName: Name{Local: "c"}, - Value: "x", - }) - - b, err := Marshal(a) - if err != nil { - t.Fatal(err) - } - if x := string(b); x != "x" { - t.Fatal(x) - } - var v A - err = Unmarshal(b, &v) - if err != nil { - t.Fatal(err) - } -} - -var encodeTokenTests = []struct { - desc string - toks []Token - want string - err string -}{{ - desc: "start element with name space", - toks: []Token{ - StartElement{Name{"space", "local"}, nil}, - }, - want: ``, -}, { - desc: "start element with no name", - toks: []Token{ - StartElement{Name{"space", ""}, nil}, - }, - err: "xml: start tag with no name", -}, { - desc: "end element with no name", - toks: []Token{ - EndElement{Name{"space", ""}}, - }, - err: "xml: end tag with no name", -}, { - desc: "char data", - toks: []Token{ - CharData("foo"), - }, - want: `foo`, -}, { - desc: "char data with escaped chars", - toks: []Token{ - CharData(" \t\n"), - }, - want: " \n", -}, { - desc: "comment", - toks: []Token{ - Comment("foo"), - }, - want: ``, -}, { - desc: "comment with invalid content", - toks: []Token{ - Comment("foo-->"), - }, - err: "xml: EncodeToken of Comment containing --> marker", -}, { - desc: "proc instruction", - toks: []Token{ - ProcInst{"Target", []byte("Instruction")}, - }, - want: ``, -}, { - desc: "proc instruction with empty target", - toks: []Token{ - ProcInst{"", []byte("Instruction")}, - }, - err: "xml: EncodeToken of ProcInst with invalid Target", -}, { - desc: "proc instruction with bad content", - toks: []Token{ - ProcInst{"", []byte("Instruction?>")}, - }, - err: "xml: EncodeToken of ProcInst with invalid Target", -}, { - desc: "directive", - toks: []Token{ - Directive("foo"), - }, - want: ``, -}, { - desc: "more complex directive", - toks: []Token{ - Directive("DOCTYPE doc [ '> ]"), - }, - want: `'> ]>`, -}, { - desc: "directive instruction with bad name", - toks: []Token{ - Directive("foo>"), - }, - err: "xml: EncodeToken of Directive containing wrong < or > markers", -}, { - desc: "end tag without start tag", - toks: []Token{ - EndElement{Name{"foo", "bar"}}, - }, - err: "xml: end tag without start tag", -}, { - desc: "mismatching end tag local name", - toks: []Token{ - StartElement{Name{"", "foo"}, nil}, - EndElement{Name{"", "bar"}}, - }, - err: "xml: end tag does not match start tag ", - want: ``, -}, { - desc: "mismatching end tag namespace", - toks: []Token{ - StartElement{Name{"space", "foo"}, nil}, - EndElement{Name{"another", "foo"}}, - }, - err: "xml: end tag in namespace another does not match start tag in namespace space", - want: ``, -}, { - desc: "start element with explicit namespace", - toks: []Token{ - StartElement{Name{"space", "local"}, []Attr{ - {Name{"xmlns", "x"}, "space"}, - {Name{"space", "foo"}, "value"}, - }}, - }, - want: ``, -}, { - desc: "start element with explicit namespace and colliding prefix", - toks: []Token{ - StartElement{Name{"space", "local"}, []Attr{ - {Name{"xmlns", "x"}, "space"}, - {Name{"space", "foo"}, "value"}, - {Name{"x", "bar"}, "other"}, - }}, - }, - want: ``, -}, { - desc: "start element using previously defined namespace", - toks: []Token{ - StartElement{Name{"", "local"}, []Attr{ - {Name{"xmlns", "x"}, "space"}, - }}, - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"space", "x"}, "y"}, - }}, - }, - want: ``, -}, { - desc: "nested name space with same prefix", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"xmlns", "x"}, "space1"}, - }}, - StartElement{Name{"", "foo"}, []Attr{ - {Name{"xmlns", "x"}, "space2"}, - }}, - StartElement{Name{"", "foo"}, []Attr{ - {Name{"space1", "a"}, "space1 value"}, - {Name{"space2", "b"}, "space2 value"}, - }}, - EndElement{Name{"", "foo"}}, - EndElement{Name{"", "foo"}}, - StartElement{Name{"", "foo"}, []Attr{ - {Name{"space1", "a"}, "space1 value"}, - {Name{"space2", "b"}, "space2 value"}, - }}, - }, - want: ``, -}, { - desc: "start element defining several prefixes for the same name space", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"xmlns", "a"}, "space"}, - {Name{"xmlns", "b"}, "space"}, - {Name{"space", "x"}, "value"}, - }}, - }, - want: ``, -}, { - desc: "nested element redefines name space", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"xmlns", "x"}, "space"}, - }}, - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"xmlns", "y"}, "space"}, - {Name{"space", "a"}, "value"}, - }}, - }, - want: ``, -}, { - desc: "nested element creates alias for default name space", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - }}, - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"xmlns", "y"}, "space"}, - {Name{"space", "a"}, "value"}, - }}, - }, - want: ``, -}, { - desc: "nested element defines default name space with existing prefix", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"xmlns", "x"}, "space"}, - }}, - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - {Name{"space", "a"}, "value"}, - }}, - }, - want: ``, -}, { - desc: "nested element uses empty attribute name space when default ns defined", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - }}, - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "attr"}, "value"}, - }}, - }, - want: ``, -}, { - desc: "redefine xmlns", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"foo", "xmlns"}, "space"}, - }}, - }, - err: `xml: cannot redefine xmlns attribute prefix`, -}, { - desc: "xmlns with explicit name space #1", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"xml", "xmlns"}, "space"}, - }}, - }, - want: ``, -}, { - desc: "xmlns with explicit name space #2", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{xmlURL, "xmlns"}, "space"}, - }}, - }, - want: ``, -}, { - desc: "empty name space declaration is ignored", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"xmlns", "foo"}, ""}, - }}, - }, - want: ``, -}, { - desc: "attribute with no name is ignored", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"", ""}, "value"}, - }}, - }, - want: ``, -}, { - desc: "namespace URL with non-valid name", - toks: []Token{ - StartElement{Name{"/34", "foo"}, []Attr{ - {Name{"/34", "x"}, "value"}, - }}, - }, - want: `<_:foo xmlns:_="/34" _:x="value">`, -}, { - desc: "nested element resets default namespace to empty", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - }}, - StartElement{Name{"", "foo"}, []Attr{ - {Name{"", "xmlns"}, ""}, - {Name{"", "x"}, "value"}, - {Name{"space", "x"}, "value"}, - }}, - }, - want: ``, -}, { - desc: "nested element requires empty default name space", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - }}, - StartElement{Name{"", "foo"}, nil}, - }, - want: ``, -}, { - desc: "attribute uses name space from xmlns", - toks: []Token{ - StartElement{Name{"some/space", "foo"}, []Attr{ - {Name{"", "attr"}, "value"}, - {Name{"some/space", "other"}, "other value"}, - }}, - }, - want: ``, -}, { - desc: "default name space should not be used by attributes", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - {Name{"xmlns", "bar"}, "space"}, - {Name{"space", "baz"}, "foo"}, - }}, - StartElement{Name{"space", "baz"}, nil}, - EndElement{Name{"space", "baz"}}, - EndElement{Name{"space", "foo"}}, - }, - want: ``, -}, { - desc: "default name space not used by attributes, not explicitly defined", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - {Name{"space", "baz"}, "foo"}, - }}, - StartElement{Name{"space", "baz"}, nil}, - EndElement{Name{"space", "baz"}}, - EndElement{Name{"space", "foo"}}, - }, - want: ``, -}, { - desc: "impossible xmlns declaration", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - }}, - StartElement{Name{"space", "bar"}, []Attr{ - {Name{"space", "attr"}, "value"}, - }}, - }, - want: ``, -}} - -func TestEncodeToken(t *testing.T) { -loop: - for i, tt := range encodeTokenTests { - var buf bytes.Buffer - enc := NewEncoder(&buf) - var err error - for j, tok := range tt.toks { - err = enc.EncodeToken(tok) - if err != nil && j < len(tt.toks)-1 { - t.Errorf("#%d %s token #%d: %v", i, tt.desc, j, err) - continue loop - } - } - errorf := func(f string, a ...interface{}) { - t.Errorf("#%d %s token #%d:%s", i, tt.desc, len(tt.toks)-1, fmt.Sprintf(f, a...)) - } - switch { - case tt.err != "" && err == nil: - errorf(" expected error; got none") - continue - case tt.err == "" && err != nil: - errorf(" got error: %v", err) - continue - case tt.err != "" && err != nil && tt.err != err.Error(): - errorf(" error mismatch; got %v, want %v", err, tt.err) - continue - } - if err := enc.Flush(); err != nil { - errorf(" %v", err) - continue - } - if got := buf.String(); got != tt.want { - errorf("\ngot %v\nwant %v", got, tt.want) - continue - } - } -} - -func TestProcInstEncodeToken(t *testing.T) { - var buf bytes.Buffer - enc := NewEncoder(&buf) - - if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err != nil { - t.Fatalf("enc.EncodeToken: expected to be able to encode xml target ProcInst as first token, %s", err) - } - - if err := enc.EncodeToken(ProcInst{"Target", []byte("Instruction")}); err != nil { - t.Fatalf("enc.EncodeToken: expected to be able to add non-xml target ProcInst") - } - - if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err == nil { - t.Fatalf("enc.EncodeToken: expected to not be allowed to encode xml target ProcInst when not first token") - } -} - -func TestDecodeEncode(t *testing.T) { - var in, out bytes.Buffer - in.WriteString(` - - - -`) - dec := NewDecoder(&in) - enc := NewEncoder(&out) - for tok, err := dec.Token(); err == nil; tok, err = dec.Token() { - err = enc.EncodeToken(tok) - if err != nil { - t.Fatalf("enc.EncodeToken: Unable to encode token (%#v), %v", tok, err) - } - } -} - -// Issue 9796. Used to fail with GORACE="halt_on_error=1" -race. -func TestRace9796(t *testing.T) { - type A struct{} - type B struct { - C []A `xml:"X>Y"` - } - var wg sync.WaitGroup - for i := 0; i < 2; i++ { - wg.Add(1) - go func() { - Marshal(B{[]A{{}}}) - wg.Done() - }() - } - wg.Wait() -} - -func TestIsValidDirective(t *testing.T) { - testOK := []string{ - "<>", - "< < > >", - "' '>' >", - " ]>", - " '<' ' doc ANY> ]>", - ">>> a < comment --> [ ] >", - } - testKO := []string{ - "<", - ">", - "", - "< > > < < >", - " -->", - "", - "'", - "", - } - for _, s := range testOK { - if !isValidDirective(Directive(s)) { - t.Errorf("Directive %q is expected to be valid", s) - } - } - for _, s := range testKO { - if isValidDirective(Directive(s)) { - t.Errorf("Directive %q is expected to be invalid", s) - } - } -} - -// Issue 11719. EncodeToken used to silently eat tokens with an invalid type. -func TestSimpleUseOfEncodeToken(t *testing.T) { - var buf bytes.Buffer - enc := NewEncoder(&buf) - if err := enc.EncodeToken(&StartElement{Name: Name{"", "object1"}}); err == nil { - t.Errorf("enc.EncodeToken: pointer type should be rejected") - } - if err := enc.EncodeToken(&EndElement{Name: Name{"", "object1"}}); err == nil { - t.Errorf("enc.EncodeToken: pointer type should be rejected") - } - if err := enc.EncodeToken(StartElement{Name: Name{"", "object2"}}); err != nil { - t.Errorf("enc.EncodeToken: StartElement %s", err) - } - if err := enc.EncodeToken(EndElement{Name: Name{"", "object2"}}); err != nil { - t.Errorf("enc.EncodeToken: EndElement %s", err) - } - if err := enc.EncodeToken(Universe{}); err == nil { - t.Errorf("enc.EncodeToken: invalid type not caught") - } - if err := enc.Flush(); err != nil { - t.Errorf("enc.Flush: %s", err) - } - if buf.Len() == 0 { - t.Errorf("enc.EncodeToken: empty buffer") - } - want := "" - if buf.String() != want { - t.Errorf("enc.EncodeToken: expected %q; got %q", want, buf.String()) - } -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/read.go b/vendor/golang.org/x/net/webdav/internal/xml/read.go deleted file mode 100644 index 4089056a1..000000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/read.go +++ /dev/null @@ -1,692 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import ( - "bytes" - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" -) - -// BUG(rsc): Mapping between XML elements and data structures is inherently flawed: -// an XML element is an order-dependent collection of anonymous -// values, while a data structure is an order-independent collection -// of named values. -// See package json for a textual representation more suitable -// to data structures. - -// Unmarshal parses the XML-encoded data and stores the result in -// the value pointed to by v, which must be an arbitrary struct, -// slice, or string. Well-formed data that does not fit into v is -// discarded. -// -// Because Unmarshal uses the reflect package, it can only assign -// to exported (upper case) fields. Unmarshal uses a case-sensitive -// comparison to match XML element names to tag values and struct -// field names. -// -// Unmarshal maps an XML element to a struct using the following rules. -// In the rules, the tag of a field refers to the value associated with the -// key 'xml' in the struct field's tag (see the example above). -// -// * If the struct has a field of type []byte or string with tag -// ",innerxml", Unmarshal accumulates the raw XML nested inside the -// element in that field. The rest of the rules still apply. -// -// * If the struct has a field named XMLName of type xml.Name, -// Unmarshal records the element name in that field. -// -// * If the XMLName field has an associated tag of the form -// "name" or "namespace-URL name", the XML element must have -// the given name (and, optionally, name space) or else Unmarshal -// returns an error. -// -// * If the XML element has an attribute whose name matches a -// struct field name with an associated tag containing ",attr" or -// the explicit name in a struct field tag of the form "name,attr", -// Unmarshal records the attribute value in that field. -// -// * If the XML element contains character data, that data is -// accumulated in the first struct field that has tag ",chardata". -// The struct field may have type []byte or string. -// If there is no such field, the character data is discarded. -// -// * If the XML element contains comments, they are accumulated in -// the first struct field that has tag ",comment". The struct -// field may have type []byte or string. If there is no such -// field, the comments are discarded. -// -// * If the XML element contains a sub-element whose name matches -// the prefix of a tag formatted as "a" or "a>b>c", unmarshal -// will descend into the XML structure looking for elements with the -// given names, and will map the innermost elements to that struct -// field. A tag starting with ">" is equivalent to one starting -// with the field name followed by ">". -// -// * If the XML element contains a sub-element whose name matches -// a struct field's XMLName tag and the struct field has no -// explicit name tag as per the previous rule, unmarshal maps -// the sub-element to that struct field. -// -// * If the XML element contains a sub-element whose name matches a -// field without any mode flags (",attr", ",chardata", etc), Unmarshal -// maps the sub-element to that struct field. -// -// * If the XML element contains a sub-element that hasn't matched any -// of the above rules and the struct has a field with tag ",any", -// unmarshal maps the sub-element to that struct field. -// -// * An anonymous struct field is handled as if the fields of its -// value were part of the outer struct. -// -// * A struct field with tag "-" is never unmarshalled into. -// -// Unmarshal maps an XML element to a string or []byte by saving the -// concatenation of that element's character data in the string or -// []byte. The saved []byte is never nil. -// -// Unmarshal maps an attribute value to a string or []byte by saving -// the value in the string or slice. -// -// Unmarshal maps an XML element to a slice by extending the length of -// the slice and mapping the element to the newly created value. -// -// Unmarshal maps an XML element or attribute value to a bool by -// setting it to the boolean value represented by the string. -// -// Unmarshal maps an XML element or attribute value to an integer or -// floating-point field by setting the field to the result of -// interpreting the string value in decimal. There is no check for -// overflow. -// -// Unmarshal maps an XML element to an xml.Name by recording the -// element name. -// -// Unmarshal maps an XML element to a pointer by setting the pointer -// to a freshly allocated value and then mapping the element to that value. -// -func Unmarshal(data []byte, v interface{}) error { - return NewDecoder(bytes.NewReader(data)).Decode(v) -} - -// Decode works like xml.Unmarshal, except it reads the decoder -// stream to find the start element. -func (d *Decoder) Decode(v interface{}) error { - return d.DecodeElement(v, nil) -} - -// DecodeElement works like xml.Unmarshal except that it takes -// a pointer to the start XML element to decode into v. -// It is useful when a client reads some raw XML tokens itself -// but also wants to defer to Unmarshal for some elements. -func (d *Decoder) DecodeElement(v interface{}, start *StartElement) error { - val := reflect.ValueOf(v) - if val.Kind() != reflect.Ptr { - return errors.New("non-pointer passed to Unmarshal") - } - return d.unmarshal(val.Elem(), start) -} - -// An UnmarshalError represents an error in the unmarshalling process. -type UnmarshalError string - -func (e UnmarshalError) Error() string { return string(e) } - -// Unmarshaler is the interface implemented by objects that can unmarshal -// an XML element description of themselves. -// -// UnmarshalXML decodes a single XML element -// beginning with the given start element. -// If it returns an error, the outer call to Unmarshal stops and -// returns that error. -// UnmarshalXML must consume exactly one XML element. -// One common implementation strategy is to unmarshal into -// a separate value with a layout matching the expected XML -// using d.DecodeElement, and then to copy the data from -// that value into the receiver. -// Another common strategy is to use d.Token to process the -// XML object one token at a time. -// UnmarshalXML may not use d.RawToken. -type Unmarshaler interface { - UnmarshalXML(d *Decoder, start StartElement) error -} - -// UnmarshalerAttr is the interface implemented by objects that can unmarshal -// an XML attribute description of themselves. -// -// UnmarshalXMLAttr decodes a single XML attribute. -// If it returns an error, the outer call to Unmarshal stops and -// returns that error. -// UnmarshalXMLAttr is used only for struct fields with the -// "attr" option in the field tag. -type UnmarshalerAttr interface { - UnmarshalXMLAttr(attr Attr) error -} - -// receiverType returns the receiver type to use in an expression like "%s.MethodName". -func receiverType(val interface{}) string { - t := reflect.TypeOf(val) - if t.Name() != "" { - return t.String() - } - return "(" + t.String() + ")" -} - -// unmarshalInterface unmarshals a single XML element into val. -// start is the opening tag of the element. -func (p *Decoder) unmarshalInterface(val Unmarshaler, start *StartElement) error { - // Record that decoder must stop at end tag corresponding to start. - p.pushEOF() - - p.unmarshalDepth++ - err := val.UnmarshalXML(p, *start) - p.unmarshalDepth-- - if err != nil { - p.popEOF() - return err - } - - if !p.popEOF() { - return fmt.Errorf("xml: %s.UnmarshalXML did not consume entire <%s> element", receiverType(val), start.Name.Local) - } - - return nil -} - -// unmarshalTextInterface unmarshals a single XML element into val. -// The chardata contained in the element (but not its children) -// is passed to the text unmarshaler. -func (p *Decoder) unmarshalTextInterface(val encoding.TextUnmarshaler, start *StartElement) error { - var buf []byte - depth := 1 - for depth > 0 { - t, err := p.Token() - if err != nil { - return err - } - switch t := t.(type) { - case CharData: - if depth == 1 { - buf = append(buf, t...) - } - case StartElement: - depth++ - case EndElement: - depth-- - } - } - return val.UnmarshalText(buf) -} - -// unmarshalAttr unmarshals a single XML attribute into val. -func (p *Decoder) unmarshalAttr(val reflect.Value, attr Attr) error { - if val.Kind() == reflect.Ptr { - if val.IsNil() { - val.Set(reflect.New(val.Type().Elem())) - } - val = val.Elem() - } - - if val.CanInterface() && val.Type().Implements(unmarshalerAttrType) { - // This is an unmarshaler with a non-pointer receiver, - // so it's likely to be incorrect, but we do what we're told. - return val.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr) - } - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(unmarshalerAttrType) { - return pv.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr) - } - } - - // Not an UnmarshalerAttr; try encoding.TextUnmarshaler. - if val.CanInterface() && val.Type().Implements(textUnmarshalerType) { - // This is an unmarshaler with a non-pointer receiver, - // so it's likely to be incorrect, but we do what we're told. - return val.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value)) - } - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { - return pv.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value)) - } - } - - copyValue(val, []byte(attr.Value)) - return nil -} - -var ( - unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() - unmarshalerAttrType = reflect.TypeOf((*UnmarshalerAttr)(nil)).Elem() - textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() -) - -// Unmarshal a single XML element into val. -func (p *Decoder) unmarshal(val reflect.Value, start *StartElement) error { - // Find start element if we need it. - if start == nil { - for { - tok, err := p.Token() - if err != nil { - return err - } - if t, ok := tok.(StartElement); ok { - start = &t - break - } - } - } - - // Load value from interface, but only if the result will be - // usefully addressable. - if val.Kind() == reflect.Interface && !val.IsNil() { - e := val.Elem() - if e.Kind() == reflect.Ptr && !e.IsNil() { - val = e - } - } - - if val.Kind() == reflect.Ptr { - if val.IsNil() { - val.Set(reflect.New(val.Type().Elem())) - } - val = val.Elem() - } - - if val.CanInterface() && val.Type().Implements(unmarshalerType) { - // This is an unmarshaler with a non-pointer receiver, - // so it's likely to be incorrect, but we do what we're told. - return p.unmarshalInterface(val.Interface().(Unmarshaler), start) - } - - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(unmarshalerType) { - return p.unmarshalInterface(pv.Interface().(Unmarshaler), start) - } - } - - if val.CanInterface() && val.Type().Implements(textUnmarshalerType) { - return p.unmarshalTextInterface(val.Interface().(encoding.TextUnmarshaler), start) - } - - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { - return p.unmarshalTextInterface(pv.Interface().(encoding.TextUnmarshaler), start) - } - } - - var ( - data []byte - saveData reflect.Value - comment []byte - saveComment reflect.Value - saveXML reflect.Value - saveXMLIndex int - saveXMLData []byte - saveAny reflect.Value - sv reflect.Value - tinfo *typeInfo - err error - ) - - switch v := val; v.Kind() { - default: - return errors.New("unknown type " + v.Type().String()) - - case reflect.Interface: - // TODO: For now, simply ignore the field. In the near - // future we may choose to unmarshal the start - // element on it, if not nil. - return p.Skip() - - case reflect.Slice: - typ := v.Type() - if typ.Elem().Kind() == reflect.Uint8 { - // []byte - saveData = v - break - } - - // Slice of element values. - // Grow slice. - n := v.Len() - if n >= v.Cap() { - ncap := 2 * n - if ncap < 4 { - ncap = 4 - } - new := reflect.MakeSlice(typ, n, ncap) - reflect.Copy(new, v) - v.Set(new) - } - v.SetLen(n + 1) - - // Recur to read element into slice. - if err := p.unmarshal(v.Index(n), start); err != nil { - v.SetLen(n) - return err - } - return nil - - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.String: - saveData = v - - case reflect.Struct: - typ := v.Type() - if typ == nameType { - v.Set(reflect.ValueOf(start.Name)) - break - } - - sv = v - tinfo, err = getTypeInfo(typ) - if err != nil { - return err - } - - // Validate and assign element name. - if tinfo.xmlname != nil { - finfo := tinfo.xmlname - if finfo.name != "" && finfo.name != start.Name.Local { - return UnmarshalError("expected element type <" + finfo.name + "> but have <" + start.Name.Local + ">") - } - if finfo.xmlns != "" && finfo.xmlns != start.Name.Space { - e := "expected element <" + finfo.name + "> in name space " + finfo.xmlns + " but have " - if start.Name.Space == "" { - e += "no name space" - } else { - e += start.Name.Space - } - return UnmarshalError(e) - } - fv := finfo.value(sv) - if _, ok := fv.Interface().(Name); ok { - fv.Set(reflect.ValueOf(start.Name)) - } - } - - // Assign attributes. - // Also, determine whether we need to save character data or comments. - for i := range tinfo.fields { - finfo := &tinfo.fields[i] - switch finfo.flags & fMode { - case fAttr: - strv := finfo.value(sv) - // Look for attribute. - for _, a := range start.Attr { - if a.Name.Local == finfo.name && (finfo.xmlns == "" || finfo.xmlns == a.Name.Space) { - if err := p.unmarshalAttr(strv, a); err != nil { - return err - } - break - } - } - - case fCharData: - if !saveData.IsValid() { - saveData = finfo.value(sv) - } - - case fComment: - if !saveComment.IsValid() { - saveComment = finfo.value(sv) - } - - case fAny, fAny | fElement: - if !saveAny.IsValid() { - saveAny = finfo.value(sv) - } - - case fInnerXml: - if !saveXML.IsValid() { - saveXML = finfo.value(sv) - if p.saved == nil { - saveXMLIndex = 0 - p.saved = new(bytes.Buffer) - } else { - saveXMLIndex = p.savedOffset() - } - } - } - } - } - - // Find end element. - // Process sub-elements along the way. -Loop: - for { - var savedOffset int - if saveXML.IsValid() { - savedOffset = p.savedOffset() - } - tok, err := p.Token() - if err != nil { - return err - } - switch t := tok.(type) { - case StartElement: - consumed := false - if sv.IsValid() { - consumed, err = p.unmarshalPath(tinfo, sv, nil, &t) - if err != nil { - return err - } - if !consumed && saveAny.IsValid() { - consumed = true - if err := p.unmarshal(saveAny, &t); err != nil { - return err - } - } - } - if !consumed { - if err := p.Skip(); err != nil { - return err - } - } - - case EndElement: - if saveXML.IsValid() { - saveXMLData = p.saved.Bytes()[saveXMLIndex:savedOffset] - if saveXMLIndex == 0 { - p.saved = nil - } - } - break Loop - - case CharData: - if saveData.IsValid() { - data = append(data, t...) - } - - case Comment: - if saveComment.IsValid() { - comment = append(comment, t...) - } - } - } - - if saveData.IsValid() && saveData.CanInterface() && saveData.Type().Implements(textUnmarshalerType) { - if err := saveData.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil { - return err - } - saveData = reflect.Value{} - } - - if saveData.IsValid() && saveData.CanAddr() { - pv := saveData.Addr() - if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { - if err := pv.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil { - return err - } - saveData = reflect.Value{} - } - } - - if err := copyValue(saveData, data); err != nil { - return err - } - - switch t := saveComment; t.Kind() { - case reflect.String: - t.SetString(string(comment)) - case reflect.Slice: - t.Set(reflect.ValueOf(comment)) - } - - switch t := saveXML; t.Kind() { - case reflect.String: - t.SetString(string(saveXMLData)) - case reflect.Slice: - t.Set(reflect.ValueOf(saveXMLData)) - } - - return nil -} - -func copyValue(dst reflect.Value, src []byte) (err error) { - dst0 := dst - - if dst.Kind() == reflect.Ptr { - if dst.IsNil() { - dst.Set(reflect.New(dst.Type().Elem())) - } - dst = dst.Elem() - } - - // Save accumulated data. - switch dst.Kind() { - case reflect.Invalid: - // Probably a comment. - default: - return errors.New("cannot unmarshal into " + dst0.Type().String()) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - itmp, err := strconv.ParseInt(string(src), 10, dst.Type().Bits()) - if err != nil { - return err - } - dst.SetInt(itmp) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - utmp, err := strconv.ParseUint(string(src), 10, dst.Type().Bits()) - if err != nil { - return err - } - dst.SetUint(utmp) - case reflect.Float32, reflect.Float64: - ftmp, err := strconv.ParseFloat(string(src), dst.Type().Bits()) - if err != nil { - return err - } - dst.SetFloat(ftmp) - case reflect.Bool: - value, err := strconv.ParseBool(strings.TrimSpace(string(src))) - if err != nil { - return err - } - dst.SetBool(value) - case reflect.String: - dst.SetString(string(src)) - case reflect.Slice: - if len(src) == 0 { - // non-nil to flag presence - src = []byte{} - } - dst.SetBytes(src) - } - return nil -} - -// unmarshalPath walks down an XML structure looking for wanted -// paths, and calls unmarshal on them. -// The consumed result tells whether XML elements have been consumed -// from the Decoder until start's matching end element, or if it's -// still untouched because start is uninteresting for sv's fields. -func (p *Decoder) unmarshalPath(tinfo *typeInfo, sv reflect.Value, parents []string, start *StartElement) (consumed bool, err error) { - recurse := false -Loop: - for i := range tinfo.fields { - finfo := &tinfo.fields[i] - if finfo.flags&fElement == 0 || len(finfo.parents) < len(parents) || finfo.xmlns != "" && finfo.xmlns != start.Name.Space { - continue - } - for j := range parents { - if parents[j] != finfo.parents[j] { - continue Loop - } - } - if len(finfo.parents) == len(parents) && finfo.name == start.Name.Local { - // It's a perfect match, unmarshal the field. - return true, p.unmarshal(finfo.value(sv), start) - } - if len(finfo.parents) > len(parents) && finfo.parents[len(parents)] == start.Name.Local { - // It's a prefix for the field. Break and recurse - // since it's not ok for one field path to be itself - // the prefix for another field path. - recurse = true - - // We can reuse the same slice as long as we - // don't try to append to it. - parents = finfo.parents[:len(parents)+1] - break - } - } - if !recurse { - // We have no business with this element. - return false, nil - } - // The element is not a perfect match for any field, but one - // or more fields have the path to this element as a parent - // prefix. Recurse and attempt to match these. - for { - var tok Token - tok, err = p.Token() - if err != nil { - return true, err - } - switch t := tok.(type) { - case StartElement: - consumed2, err := p.unmarshalPath(tinfo, sv, parents, &t) - if err != nil { - return true, err - } - if !consumed2 { - if err := p.Skip(); err != nil { - return true, err - } - } - case EndElement: - return true, nil - } - } -} - -// Skip reads tokens until it has consumed the end element -// matching the most recent start element already consumed. -// It recurs if it encounters a start element, so it can be used to -// skip nested structures. -// It returns nil if it finds an end element matching the start -// element; otherwise it returns an error describing the problem. -func (d *Decoder) Skip() error { - for { - tok, err := d.Token() - if err != nil { - return err - } - switch tok.(type) { - case StartElement: - if err := d.Skip(); err != nil { - return err - } - case EndElement: - return nil - } - } -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/read_test.go b/vendor/golang.org/x/net/webdav/internal/xml/read_test.go deleted file mode 100644 index 02f1e10c3..000000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/read_test.go +++ /dev/null @@ -1,744 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import ( - "bytes" - "fmt" - "io" - "reflect" - "strings" - "testing" - "time" -) - -// Stripped down Atom feed data structures. - -func TestUnmarshalFeed(t *testing.T) { - var f Feed - if err := Unmarshal([]byte(atomFeedString), &f); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if !reflect.DeepEqual(f, atomFeed) { - t.Fatalf("have %#v\nwant %#v", f, atomFeed) - } -} - -// hget http://codereview.appspot.com/rss/mine/rsc -const atomFeedString = ` - -Code Review - My issueshttp://codereview.appspot.com/rietveld<>rietveld: an attempt at pubsubhubbub -2009-10-04T01:35:58+00:00email-address-removedurn:md5:134d9179c41f806be79b3a5f7877d19a - An attempt at adding pubsubhubbub support to Rietveld. -http://code.google.com/p/pubsubhubbub -http://code.google.com/p/rietveld/issues/detail?id=155 - -The server side of the protocol is trivial: - 1. add a &lt;link rel=&quot;hub&quot; href=&quot;hub-server&quot;&gt; tag to all - feeds that will be pubsubhubbubbed. - 2. every time one of those feeds changes, tell the hub - with a simple POST request. - -I have tested this by adding debug prints to a local hub -server and checking that the server got the right publish -requests. - -I can&#39;t quite get the server to work, but I think the bug -is not in my code. I think that the server expects to be -able to grab the feed and see the feed&#39;s actual URL in -the link rel=&quot;self&quot;, but the default value for that drops -the :port from the URL, and I cannot for the life of me -figure out how to get the Atom generator deep inside -django not to do that, or even where it is doing that, -or even what code is running to generate the Atom feed. -(I thought I knew but I added some assert False statements -and it kept running!) - -Ignoring that particular problem, I would appreciate -feedback on the right way to get the two values at -the top of feeds.py marked NOTE(rsc). - - -rietveld: correct tab handling -2009-10-03T23:02:17+00:00email-address-removedurn:md5:0a2a4f19bb815101f0ba2904aed7c35a - This fixes the buggy tab rendering that can be seen at -http://codereview.appspot.com/116075/diff/1/2 - -The fundamental problem was that the tab code was -not being told what column the text began in, so it -didn&#39;t know where to put the tab stops. Another problem -was that some of the code assumed that string byte -offsets were the same as column offsets, which is only -true if there are no tabs. - -In the process of fixing this, I cleaned up the arguments -to Fold and ExpandTabs and renamed them Break and -_ExpandTabs so that I could be sure that I found all the -call sites. I also wanted to verify that ExpandTabs was -not being used from outside intra_region_diff.py. - - - ` - -type Feed struct { - XMLName Name `xml:"http://www.w3.org/2005/Atom feed"` - Title string `xml:"title"` - Id string `xml:"id"` - Link []Link `xml:"link"` - Updated time.Time `xml:"updated,attr"` - Author Person `xml:"author"` - Entry []Entry `xml:"entry"` -} - -type Entry struct { - Title string `xml:"title"` - Id string `xml:"id"` - Link []Link `xml:"link"` - Updated time.Time `xml:"updated"` - Author Person `xml:"author"` - Summary Text `xml:"summary"` -} - -type Link struct { - Rel string `xml:"rel,attr,omitempty"` - Href string `xml:"href,attr"` -} - -type Person struct { - Name string `xml:"name"` - URI string `xml:"uri"` - Email string `xml:"email"` - InnerXML string `xml:",innerxml"` -} - -type Text struct { - Type string `xml:"type,attr,omitempty"` - Body string `xml:",chardata"` -} - -var atomFeed = Feed{ - XMLName: Name{"http://www.w3.org/2005/Atom", "feed"}, - Title: "Code Review - My issues", - Link: []Link{ - {Rel: "alternate", Href: "http://codereview.appspot.com/"}, - {Rel: "self", Href: "http://codereview.appspot.com/rss/mine/rsc"}, - }, - Id: "http://codereview.appspot.com/", - Updated: ParseTime("2009-10-04T01:35:58+00:00"), - Author: Person{ - Name: "rietveld<>", - InnerXML: "rietveld<>", - }, - Entry: []Entry{ - { - Title: "rietveld: an attempt at pubsubhubbub\n", - Link: []Link{ - {Rel: "alternate", Href: "http://codereview.appspot.com/126085"}, - }, - Updated: ParseTime("2009-10-04T01:35:58+00:00"), - Author: Person{ - Name: "email-address-removed", - InnerXML: "email-address-removed", - }, - Id: "urn:md5:134d9179c41f806be79b3a5f7877d19a", - Summary: Text{ - Type: "html", - Body: ` - An attempt at adding pubsubhubbub support to Rietveld. -http://code.google.com/p/pubsubhubbub -http://code.google.com/p/rietveld/issues/detail?id=155 - -The server side of the protocol is trivial: - 1. add a <link rel="hub" href="hub-server"> tag to all - feeds that will be pubsubhubbubbed. - 2. every time one of those feeds changes, tell the hub - with a simple POST request. - -I have tested this by adding debug prints to a local hub -server and checking that the server got the right publish -requests. - -I can't quite get the server to work, but I think the bug -is not in my code. I think that the server expects to be -able to grab the feed and see the feed's actual URL in -the link rel="self", but the default value for that drops -the :port from the URL, and I cannot for the life of me -figure out how to get the Atom generator deep inside -django not to do that, or even where it is doing that, -or even what code is running to generate the Atom feed. -(I thought I knew but I added some assert False statements -and it kept running!) - -Ignoring that particular problem, I would appreciate -feedback on the right way to get the two values at -the top of feeds.py marked NOTE(rsc). - - -`, - }, - }, - { - Title: "rietveld: correct tab handling\n", - Link: []Link{ - {Rel: "alternate", Href: "http://codereview.appspot.com/124106"}, - }, - Updated: ParseTime("2009-10-03T23:02:17+00:00"), - Author: Person{ - Name: "email-address-removed", - InnerXML: "email-address-removed", - }, - Id: "urn:md5:0a2a4f19bb815101f0ba2904aed7c35a", - Summary: Text{ - Type: "html", - Body: ` - This fixes the buggy tab rendering that can be seen at -http://codereview.appspot.com/116075/diff/1/2 - -The fundamental problem was that the tab code was -not being told what column the text began in, so it -didn't know where to put the tab stops. Another problem -was that some of the code assumed that string byte -offsets were the same as column offsets, which is only -true if there are no tabs. - -In the process of fixing this, I cleaned up the arguments -to Fold and ExpandTabs and renamed them Break and -_ExpandTabs so that I could be sure that I found all the -call sites. I also wanted to verify that ExpandTabs was -not being used from outside intra_region_diff.py. - - -`, - }, - }, - }, -} - -const pathTestString = ` - - 1 - - - A - - - B - - - C - D - - <_> - E - - - 2 - -` - -type PathTestItem struct { - Value string -} - -type PathTestA struct { - Items []PathTestItem `xml:">Item1"` - Before, After string -} - -type PathTestB struct { - Other []PathTestItem `xml:"Items>Item1"` - Before, After string -} - -type PathTestC struct { - Values1 []string `xml:"Items>Item1>Value"` - Values2 []string `xml:"Items>Item2>Value"` - Before, After string -} - -type PathTestSet struct { - Item1 []PathTestItem -} - -type PathTestD struct { - Other PathTestSet `xml:"Items"` - Before, After string -} - -type PathTestE struct { - Underline string `xml:"Items>_>Value"` - Before, After string -} - -var pathTests = []interface{}{ - &PathTestA{Items: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, - &PathTestB{Other: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, - &PathTestC{Values1: []string{"A", "C", "D"}, Values2: []string{"B"}, Before: "1", After: "2"}, - &PathTestD{Other: PathTestSet{Item1: []PathTestItem{{"A"}, {"D"}}}, Before: "1", After: "2"}, - &PathTestE{Underline: "E", Before: "1", After: "2"}, -} - -func TestUnmarshalPaths(t *testing.T) { - for _, pt := range pathTests { - v := reflect.New(reflect.TypeOf(pt).Elem()).Interface() - if err := Unmarshal([]byte(pathTestString), v); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if !reflect.DeepEqual(v, pt) { - t.Fatalf("have %#v\nwant %#v", v, pt) - } - } -} - -type BadPathTestA struct { - First string `xml:"items>item1"` - Other string `xml:"items>item2"` - Second string `xml:"items"` -} - -type BadPathTestB struct { - Other string `xml:"items>item2>value"` - First string `xml:"items>item1"` - Second string `xml:"items>item1>value"` -} - -type BadPathTestC struct { - First string - Second string `xml:"First"` -} - -type BadPathTestD struct { - BadPathEmbeddedA - BadPathEmbeddedB -} - -type BadPathEmbeddedA struct { - First string -} - -type BadPathEmbeddedB struct { - Second string `xml:"First"` -} - -var badPathTests = []struct { - v, e interface{} -}{ - {&BadPathTestA{}, &TagPathError{reflect.TypeOf(BadPathTestA{}), "First", "items>item1", "Second", "items"}}, - {&BadPathTestB{}, &TagPathError{reflect.TypeOf(BadPathTestB{}), "First", "items>item1", "Second", "items>item1>value"}}, - {&BadPathTestC{}, &TagPathError{reflect.TypeOf(BadPathTestC{}), "First", "", "Second", "First"}}, - {&BadPathTestD{}, &TagPathError{reflect.TypeOf(BadPathTestD{}), "First", "", "Second", "First"}}, -} - -func TestUnmarshalBadPaths(t *testing.T) { - for _, tt := range badPathTests { - err := Unmarshal([]byte(pathTestString), tt.v) - if !reflect.DeepEqual(err, tt.e) { - t.Fatalf("Unmarshal with %#v didn't fail properly:\nhave %#v,\nwant %#v", tt.v, err, tt.e) - } - } -} - -const OK = "OK" -const withoutNameTypeData = ` - -` - -type TestThree struct { - XMLName Name `xml:"Test3"` - Attr string `xml:",attr"` -} - -func TestUnmarshalWithoutNameType(t *testing.T) { - var x TestThree - if err := Unmarshal([]byte(withoutNameTypeData), &x); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if x.Attr != OK { - t.Fatalf("have %v\nwant %v", x.Attr, OK) - } -} - -func TestUnmarshalAttr(t *testing.T) { - type ParamVal struct { - Int int `xml:"int,attr"` - } - - type ParamPtr struct { - Int *int `xml:"int,attr"` - } - - type ParamStringPtr struct { - Int *string `xml:"int,attr"` - } - - x := []byte(``) - - p1 := &ParamPtr{} - if err := Unmarshal(x, p1); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if p1.Int == nil { - t.Fatalf("Unmarshal failed in to *int field") - } else if *p1.Int != 1 { - t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p1.Int, 1) - } - - p2 := &ParamVal{} - if err := Unmarshal(x, p2); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if p2.Int != 1 { - t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p2.Int, 1) - } - - p3 := &ParamStringPtr{} - if err := Unmarshal(x, p3); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if p3.Int == nil { - t.Fatalf("Unmarshal failed in to *string field") - } else if *p3.Int != "1" { - t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p3.Int, 1) - } -} - -type Tables struct { - HTable string `xml:"http://www.w3.org/TR/html4/ table"` - FTable string `xml:"http://www.w3schools.com/furniture table"` -} - -var tables = []struct { - xml string - tab Tables - ns string -}{ - { - xml: `` + - `hello
    ` + - `world
    ` + - `
    `, - tab: Tables{"hello", "world"}, - }, - { - xml: `` + - `world
    ` + - `hello
    ` + - `
    `, - tab: Tables{"hello", "world"}, - }, - { - xml: `` + - `world` + - `hello` + - ``, - tab: Tables{"hello", "world"}, - }, - { - xml: `` + - `bogus
    ` + - `
    `, - tab: Tables{}, - }, - { - xml: `` + - `only
    ` + - `
    `, - tab: Tables{HTable: "only"}, - ns: "http://www.w3.org/TR/html4/", - }, - { - xml: `` + - `only
    ` + - `
    `, - tab: Tables{FTable: "only"}, - ns: "http://www.w3schools.com/furniture", - }, - { - xml: `` + - `only
    ` + - `
    `, - tab: Tables{}, - ns: "something else entirely", - }, -} - -func TestUnmarshalNS(t *testing.T) { - for i, tt := range tables { - var dst Tables - var err error - if tt.ns != "" { - d := NewDecoder(strings.NewReader(tt.xml)) - d.DefaultSpace = tt.ns - err = d.Decode(&dst) - } else { - err = Unmarshal([]byte(tt.xml), &dst) - } - if err != nil { - t.Errorf("#%d: Unmarshal: %v", i, err) - continue - } - want := tt.tab - if dst != want { - t.Errorf("#%d: dst=%+v, want %+v", i, dst, want) - } - } -} - -func TestRoundTrip(t *testing.T) { - // From issue 7535 - const s = `` - in := bytes.NewBufferString(s) - for i := 0; i < 10; i++ { - out := &bytes.Buffer{} - d := NewDecoder(in) - e := NewEncoder(out) - - for { - t, err := d.Token() - if err == io.EOF { - break - } - if err != nil { - fmt.Println("failed:", err) - return - } - e.EncodeToken(t) - } - e.Flush() - in = out - } - if got := in.String(); got != s { - t.Errorf("have: %q\nwant: %q\n", got, s) - } -} - -func TestMarshalNS(t *testing.T) { - dst := Tables{"hello", "world"} - data, err := Marshal(&dst) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - want := `hello
    world
    ` - str := string(data) - if str != want { - t.Errorf("have: %q\nwant: %q\n", str, want) - } -} - -type TableAttrs struct { - TAttr TAttr -} - -type TAttr struct { - HTable string `xml:"http://www.w3.org/TR/html4/ table,attr"` - FTable string `xml:"http://www.w3schools.com/furniture table,attr"` - Lang string `xml:"http://www.w3.org/XML/1998/namespace lang,attr,omitempty"` - Other1 string `xml:"http://golang.org/xml/ other,attr,omitempty"` - Other2 string `xml:"http://golang.org/xmlfoo/ other,attr,omitempty"` - Other3 string `xml:"http://golang.org/json/ other,attr,omitempty"` - Other4 string `xml:"http://golang.org/2/json/ other,attr,omitempty"` -} - -var tableAttrs = []struct { - xml string - tab TableAttrs - ns string -}{ - { - xml: ``, - tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, - }, - { - xml: ``, - tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, - }, - { - xml: ``, - tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, - }, - { - // Default space does not apply to attribute names. - xml: ``, - tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}}, - }, - { - // Default space does not apply to attribute names. - xml: ``, - tab: TableAttrs{TAttr{HTable: "", FTable: "world"}}, - }, - { - xml: ``, - tab: TableAttrs{}, - }, - { - // Default space does not apply to attribute names. - xml: ``, - tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}}, - ns: "http://www.w3schools.com/furniture", - }, - { - // Default space does not apply to attribute names. - xml: ``, - tab: TableAttrs{TAttr{HTable: "", FTable: "world"}}, - ns: "http://www.w3.org/TR/html4/", - }, - { - xml: ``, - tab: TableAttrs{}, - ns: "something else entirely", - }, -} - -func TestUnmarshalNSAttr(t *testing.T) { - for i, tt := range tableAttrs { - var dst TableAttrs - var err error - if tt.ns != "" { - d := NewDecoder(strings.NewReader(tt.xml)) - d.DefaultSpace = tt.ns - err = d.Decode(&dst) - } else { - err = Unmarshal([]byte(tt.xml), &dst) - } - if err != nil { - t.Errorf("#%d: Unmarshal: %v", i, err) - continue - } - want := tt.tab - if dst != want { - t.Errorf("#%d: dst=%+v, want %+v", i, dst, want) - } - } -} - -func TestMarshalNSAttr(t *testing.T) { - src := TableAttrs{TAttr{"hello", "world", "en_US", "other1", "other2", "other3", "other4"}} - data, err := Marshal(&src) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - want := `` - str := string(data) - if str != want { - t.Errorf("Marshal:\nhave: %#q\nwant: %#q\n", str, want) - } - - var dst TableAttrs - if err := Unmarshal(data, &dst); err != nil { - t.Errorf("Unmarshal: %v", err) - } - - if dst != src { - t.Errorf("Unmarshal = %q, want %q", dst, src) - } -} - -type MyCharData struct { - body string -} - -func (m *MyCharData) UnmarshalXML(d *Decoder, start StartElement) error { - for { - t, err := d.Token() - if err == io.EOF { // found end of element - break - } - if err != nil { - return err - } - if char, ok := t.(CharData); ok { - m.body += string(char) - } - } - return nil -} - -var _ Unmarshaler = (*MyCharData)(nil) - -func (m *MyCharData) UnmarshalXMLAttr(attr Attr) error { - panic("must not call") -} - -type MyAttr struct { - attr string -} - -func (m *MyAttr) UnmarshalXMLAttr(attr Attr) error { - m.attr = attr.Value - return nil -} - -var _ UnmarshalerAttr = (*MyAttr)(nil) - -type MyStruct struct { - Data *MyCharData - Attr *MyAttr `xml:",attr"` - - Data2 MyCharData - Attr2 MyAttr `xml:",attr"` -} - -func TestUnmarshaler(t *testing.T) { - xml := ` - - hello world - howdy world - - ` - - var m MyStruct - if err := Unmarshal([]byte(xml), &m); err != nil { - t.Fatal(err) - } - - if m.Data == nil || m.Attr == nil || m.Data.body != "hello world" || m.Attr.attr != "attr1" || m.Data2.body != "howdy world" || m.Attr2.attr != "attr2" { - t.Errorf("m=%#+v\n", m) - } -} - -type Pea struct { - Cotelydon string -} - -type Pod struct { - Pea interface{} `xml:"Pea"` -} - -// https://golang.org/issue/6836 -func TestUnmarshalIntoInterface(t *testing.T) { - pod := new(Pod) - pod.Pea = new(Pea) - xml := `Green stuff` - err := Unmarshal([]byte(xml), pod) - if err != nil { - t.Fatalf("failed to unmarshal %q: %v", xml, err) - } - pea, ok := pod.Pea.(*Pea) - if !ok { - t.Fatalf("unmarshalled into wrong type: have %T want *Pea", pod.Pea) - } - have, want := pea.Cotelydon, "Green stuff" - if have != want { - t.Errorf("failed to unmarshal into interface, have %q want %q", have, want) - } -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go b/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go deleted file mode 100644 index fdde288bc..000000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go +++ /dev/null @@ -1,371 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import ( - "fmt" - "reflect" - "strings" - "sync" -) - -// typeInfo holds details for the xml representation of a type. -type typeInfo struct { - xmlname *fieldInfo - fields []fieldInfo -} - -// fieldInfo holds details for the xml representation of a single field. -type fieldInfo struct { - idx []int - name string - xmlns string - flags fieldFlags - parents []string -} - -type fieldFlags int - -const ( - fElement fieldFlags = 1 << iota - fAttr - fCharData - fInnerXml - fComment - fAny - - fOmitEmpty - - fMode = fElement | fAttr | fCharData | fInnerXml | fComment | fAny -) - -var tinfoMap = make(map[reflect.Type]*typeInfo) -var tinfoLock sync.RWMutex - -var nameType = reflect.TypeOf(Name{}) - -// getTypeInfo returns the typeInfo structure with details necessary -// for marshalling and unmarshalling typ. -func getTypeInfo(typ reflect.Type) (*typeInfo, error) { - tinfoLock.RLock() - tinfo, ok := tinfoMap[typ] - tinfoLock.RUnlock() - if ok { - return tinfo, nil - } - tinfo = &typeInfo{} - if typ.Kind() == reflect.Struct && typ != nameType { - n := typ.NumField() - for i := 0; i < n; i++ { - f := typ.Field(i) - if f.PkgPath != "" || f.Tag.Get("xml") == "-" { - continue // Private field - } - - // For embedded structs, embed its fields. - if f.Anonymous { - t := f.Type - if t.Kind() == reflect.Ptr { - t = t.Elem() - } - if t.Kind() == reflect.Struct { - inner, err := getTypeInfo(t) - if err != nil { - return nil, err - } - if tinfo.xmlname == nil { - tinfo.xmlname = inner.xmlname - } - for _, finfo := range inner.fields { - finfo.idx = append([]int{i}, finfo.idx...) - if err := addFieldInfo(typ, tinfo, &finfo); err != nil { - return nil, err - } - } - continue - } - } - - finfo, err := structFieldInfo(typ, &f) - if err != nil { - return nil, err - } - - if f.Name == "XMLName" { - tinfo.xmlname = finfo - continue - } - - // Add the field if it doesn't conflict with other fields. - if err := addFieldInfo(typ, tinfo, finfo); err != nil { - return nil, err - } - } - } - tinfoLock.Lock() - tinfoMap[typ] = tinfo - tinfoLock.Unlock() - return tinfo, nil -} - -// structFieldInfo builds and returns a fieldInfo for f. -func structFieldInfo(typ reflect.Type, f *reflect.StructField) (*fieldInfo, error) { - finfo := &fieldInfo{idx: f.Index} - - // Split the tag from the xml namespace if necessary. - tag := f.Tag.Get("xml") - if i := strings.Index(tag, " "); i >= 0 { - finfo.xmlns, tag = tag[:i], tag[i+1:] - } - - // Parse flags. - tokens := strings.Split(tag, ",") - if len(tokens) == 1 { - finfo.flags = fElement - } else { - tag = tokens[0] - for _, flag := range tokens[1:] { - switch flag { - case "attr": - finfo.flags |= fAttr - case "chardata": - finfo.flags |= fCharData - case "innerxml": - finfo.flags |= fInnerXml - case "comment": - finfo.flags |= fComment - case "any": - finfo.flags |= fAny - case "omitempty": - finfo.flags |= fOmitEmpty - } - } - - // Validate the flags used. - valid := true - switch mode := finfo.flags & fMode; mode { - case 0: - finfo.flags |= fElement - case fAttr, fCharData, fInnerXml, fComment, fAny: - if f.Name == "XMLName" || tag != "" && mode != fAttr { - valid = false - } - default: - // This will also catch multiple modes in a single field. - valid = false - } - if finfo.flags&fMode == fAny { - finfo.flags |= fElement - } - if finfo.flags&fOmitEmpty != 0 && finfo.flags&(fElement|fAttr) == 0 { - valid = false - } - if !valid { - return nil, fmt.Errorf("xml: invalid tag in field %s of type %s: %q", - f.Name, typ, f.Tag.Get("xml")) - } - } - - // Use of xmlns without a name is not allowed. - if finfo.xmlns != "" && tag == "" { - return nil, fmt.Errorf("xml: namespace without name in field %s of type %s: %q", - f.Name, typ, f.Tag.Get("xml")) - } - - if f.Name == "XMLName" { - // The XMLName field records the XML element name. Don't - // process it as usual because its name should default to - // empty rather than to the field name. - finfo.name = tag - return finfo, nil - } - - if tag == "" { - // If the name part of the tag is completely empty, get - // default from XMLName of underlying struct if feasible, - // or field name otherwise. - if xmlname := lookupXMLName(f.Type); xmlname != nil { - finfo.xmlns, finfo.name = xmlname.xmlns, xmlname.name - } else { - finfo.name = f.Name - } - return finfo, nil - } - - if finfo.xmlns == "" && finfo.flags&fAttr == 0 { - // If it's an element no namespace specified, get the default - // from the XMLName of enclosing struct if possible. - if xmlname := lookupXMLName(typ); xmlname != nil { - finfo.xmlns = xmlname.xmlns - } - } - - // Prepare field name and parents. - parents := strings.Split(tag, ">") - if parents[0] == "" { - parents[0] = f.Name - } - if parents[len(parents)-1] == "" { - return nil, fmt.Errorf("xml: trailing '>' in field %s of type %s", f.Name, typ) - } - finfo.name = parents[len(parents)-1] - if len(parents) > 1 { - if (finfo.flags & fElement) == 0 { - return nil, fmt.Errorf("xml: %s chain not valid with %s flag", tag, strings.Join(tokens[1:], ",")) - } - finfo.parents = parents[:len(parents)-1] - } - - // If the field type has an XMLName field, the names must match - // so that the behavior of both marshalling and unmarshalling - // is straightforward and unambiguous. - if finfo.flags&fElement != 0 { - ftyp := f.Type - xmlname := lookupXMLName(ftyp) - if xmlname != nil && xmlname.name != finfo.name { - return nil, fmt.Errorf("xml: name %q in tag of %s.%s conflicts with name %q in %s.XMLName", - finfo.name, typ, f.Name, xmlname.name, ftyp) - } - } - return finfo, nil -} - -// lookupXMLName returns the fieldInfo for typ's XMLName field -// in case it exists and has a valid xml field tag, otherwise -// it returns nil. -func lookupXMLName(typ reflect.Type) (xmlname *fieldInfo) { - for typ.Kind() == reflect.Ptr { - typ = typ.Elem() - } - if typ.Kind() != reflect.Struct { - return nil - } - for i, n := 0, typ.NumField(); i < n; i++ { - f := typ.Field(i) - if f.Name != "XMLName" { - continue - } - finfo, err := structFieldInfo(typ, &f) - if finfo.name != "" && err == nil { - return finfo - } - // Also consider errors as a non-existent field tag - // and let getTypeInfo itself report the error. - break - } - return nil -} - -func min(a, b int) int { - if a <= b { - return a - } - return b -} - -// addFieldInfo adds finfo to tinfo.fields if there are no -// conflicts, or if conflicts arise from previous fields that were -// obtained from deeper embedded structures than finfo. In the latter -// case, the conflicting entries are dropped. -// A conflict occurs when the path (parent + name) to a field is -// itself a prefix of another path, or when two paths match exactly. -// It is okay for field paths to share a common, shorter prefix. -func addFieldInfo(typ reflect.Type, tinfo *typeInfo, newf *fieldInfo) error { - var conflicts []int -Loop: - // First, figure all conflicts. Most working code will have none. - for i := range tinfo.fields { - oldf := &tinfo.fields[i] - if oldf.flags&fMode != newf.flags&fMode { - continue - } - if oldf.xmlns != "" && newf.xmlns != "" && oldf.xmlns != newf.xmlns { - continue - } - minl := min(len(newf.parents), len(oldf.parents)) - for p := 0; p < minl; p++ { - if oldf.parents[p] != newf.parents[p] { - continue Loop - } - } - if len(oldf.parents) > len(newf.parents) { - if oldf.parents[len(newf.parents)] == newf.name { - conflicts = append(conflicts, i) - } - } else if len(oldf.parents) < len(newf.parents) { - if newf.parents[len(oldf.parents)] == oldf.name { - conflicts = append(conflicts, i) - } - } else { - if newf.name == oldf.name { - conflicts = append(conflicts, i) - } - } - } - // Without conflicts, add the new field and return. - if conflicts == nil { - tinfo.fields = append(tinfo.fields, *newf) - return nil - } - - // If any conflict is shallower, ignore the new field. - // This matches the Go field resolution on embedding. - for _, i := range conflicts { - if len(tinfo.fields[i].idx) < len(newf.idx) { - return nil - } - } - - // Otherwise, if any of them is at the same depth level, it's an error. - for _, i := range conflicts { - oldf := &tinfo.fields[i] - if len(oldf.idx) == len(newf.idx) { - f1 := typ.FieldByIndex(oldf.idx) - f2 := typ.FieldByIndex(newf.idx) - return &TagPathError{typ, f1.Name, f1.Tag.Get("xml"), f2.Name, f2.Tag.Get("xml")} - } - } - - // Otherwise, the new field is shallower, and thus takes precedence, - // so drop the conflicting fields from tinfo and append the new one. - for c := len(conflicts) - 1; c >= 0; c-- { - i := conflicts[c] - copy(tinfo.fields[i:], tinfo.fields[i+1:]) - tinfo.fields = tinfo.fields[:len(tinfo.fields)-1] - } - tinfo.fields = append(tinfo.fields, *newf) - return nil -} - -// A TagPathError represents an error in the unmarshalling process -// caused by the use of field tags with conflicting paths. -type TagPathError struct { - Struct reflect.Type - Field1, Tag1 string - Field2, Tag2 string -} - -func (e *TagPathError) Error() string { - return fmt.Sprintf("%s field %q with tag %q conflicts with field %q with tag %q", e.Struct, e.Field1, e.Tag1, e.Field2, e.Tag2) -} - -// value returns v's field value corresponding to finfo. -// It's equivalent to v.FieldByIndex(finfo.idx), but initializes -// and dereferences pointers as necessary. -func (finfo *fieldInfo) value(v reflect.Value) reflect.Value { - for i, x := range finfo.idx { - if i > 0 { - t := v.Type() - if t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Struct { - if v.IsNil() { - v.Set(reflect.New(v.Type().Elem())) - } - v = v.Elem() - } - } - v = v.Field(x) - } - return v -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/xml.go b/vendor/golang.org/x/net/webdav/internal/xml/xml.go deleted file mode 100644 index 5b79cbecb..000000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/xml.go +++ /dev/null @@ -1,1998 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package xml implements a simple XML 1.0 parser that -// understands XML name spaces. -package xml - -// References: -// Annotated XML spec: http://www.xml.com/axml/testaxml.htm -// XML name spaces: http://www.w3.org/TR/REC-xml-names/ - -// TODO(rsc): -// Test error handling. - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "strconv" - "strings" - "unicode" - "unicode/utf8" -) - -// A SyntaxError represents a syntax error in the XML input stream. -type SyntaxError struct { - Msg string - Line int -} - -func (e *SyntaxError) Error() string { - return "XML syntax error on line " + strconv.Itoa(e.Line) + ": " + e.Msg -} - -// A Name represents an XML name (Local) annotated with a name space -// identifier (Space). In tokens returned by Decoder.Token, the Space -// identifier is given as a canonical URL, not the short prefix used in -// the document being parsed. -// -// As a special case, XML namespace declarations will use the literal -// string "xmlns" for the Space field instead of the fully resolved URL. -// See Encoder.EncodeToken for more information on namespace encoding -// behaviour. -type Name struct { - Space, Local string -} - -// isNamespace reports whether the name is a namespace-defining name. -func (name Name) isNamespace() bool { - return name.Local == "xmlns" || name.Space == "xmlns" -} - -// An Attr represents an attribute in an XML element (Name=Value). -type Attr struct { - Name Name - Value string -} - -// A Token is an interface holding one of the token types: -// StartElement, EndElement, CharData, Comment, ProcInst, or Directive. -type Token interface{} - -// A StartElement represents an XML start element. -type StartElement struct { - Name Name - Attr []Attr -} - -func (e StartElement) Copy() StartElement { - attrs := make([]Attr, len(e.Attr)) - copy(attrs, e.Attr) - e.Attr = attrs - return e -} - -// End returns the corresponding XML end element. -func (e StartElement) End() EndElement { - return EndElement{e.Name} -} - -// setDefaultNamespace sets the namespace of the element -// as the default for all elements contained within it. -func (e *StartElement) setDefaultNamespace() { - if e.Name.Space == "" { - // If there's no namespace on the element, don't - // set the default. Strictly speaking this might be wrong, as - // we can't tell if the element had no namespace set - // or was just using the default namespace. - return - } - // Don't add a default name space if there's already one set. - for _, attr := range e.Attr { - if attr.Name.Space == "" && attr.Name.Local == "xmlns" { - return - } - } - e.Attr = append(e.Attr, Attr{ - Name: Name{ - Local: "xmlns", - }, - Value: e.Name.Space, - }) -} - -// An EndElement represents an XML end element. -type EndElement struct { - Name Name -} - -// A CharData represents XML character data (raw text), -// in which XML escape sequences have been replaced by -// the characters they represent. -type CharData []byte - -func makeCopy(b []byte) []byte { - b1 := make([]byte, len(b)) - copy(b1, b) - return b1 -} - -func (c CharData) Copy() CharData { return CharData(makeCopy(c)) } - -// A Comment represents an XML comment of the form . -// The bytes do not include the comment markers. -type Comment []byte - -func (c Comment) Copy() Comment { return Comment(makeCopy(c)) } - -// A ProcInst represents an XML processing instruction of the form -type ProcInst struct { - Target string - Inst []byte -} - -func (p ProcInst) Copy() ProcInst { - p.Inst = makeCopy(p.Inst) - return p -} - -// A Directive represents an XML directive of the form . -// The bytes do not include the markers. -type Directive []byte - -func (d Directive) Copy() Directive { return Directive(makeCopy(d)) } - -// CopyToken returns a copy of a Token. -func CopyToken(t Token) Token { - switch v := t.(type) { - case CharData: - return v.Copy() - case Comment: - return v.Copy() - case Directive: - return v.Copy() - case ProcInst: - return v.Copy() - case StartElement: - return v.Copy() - } - return t -} - -// A Decoder represents an XML parser reading a particular input stream. -// The parser assumes that its input is encoded in UTF-8. -type Decoder struct { - // Strict defaults to true, enforcing the requirements - // of the XML specification. - // If set to false, the parser allows input containing common - // mistakes: - // * If an element is missing an end tag, the parser invents - // end tags as necessary to keep the return values from Token - // properly balanced. - // * In attribute values and character data, unknown or malformed - // character entities (sequences beginning with &) are left alone. - // - // Setting: - // - // d.Strict = false; - // d.AutoClose = HTMLAutoClose; - // d.Entity = HTMLEntity - // - // creates a parser that can handle typical HTML. - // - // Strict mode does not enforce the requirements of the XML name spaces TR. - // In particular it does not reject name space tags using undefined prefixes. - // Such tags are recorded with the unknown prefix as the name space URL. - Strict bool - - // When Strict == false, AutoClose indicates a set of elements to - // consider closed immediately after they are opened, regardless - // of whether an end element is present. - AutoClose []string - - // Entity can be used to map non-standard entity names to string replacements. - // The parser behaves as if these standard mappings are present in the map, - // regardless of the actual map content: - // - // "lt": "<", - // "gt": ">", - // "amp": "&", - // "apos": "'", - // "quot": `"`, - Entity map[string]string - - // CharsetReader, if non-nil, defines a function to generate - // charset-conversion readers, converting from the provided - // non-UTF-8 charset into UTF-8. If CharsetReader is nil or - // returns an error, parsing stops with an error. One of the - // the CharsetReader's result values must be non-nil. - CharsetReader func(charset string, input io.Reader) (io.Reader, error) - - // DefaultSpace sets the default name space used for unadorned tags, - // as if the entire XML stream were wrapped in an element containing - // the attribute xmlns="DefaultSpace". - DefaultSpace string - - r io.ByteReader - buf bytes.Buffer - saved *bytes.Buffer - stk *stack - free *stack - needClose bool - toClose Name - nextToken Token - nextByte int - ns map[string]string - err error - line int - offset int64 - unmarshalDepth int -} - -// NewDecoder creates a new XML parser reading from r. -// If r does not implement io.ByteReader, NewDecoder will -// do its own buffering. -func NewDecoder(r io.Reader) *Decoder { - d := &Decoder{ - ns: make(map[string]string), - nextByte: -1, - line: 1, - Strict: true, - } - d.switchToReader(r) - return d -} - -// Token returns the next XML token in the input stream. -// At the end of the input stream, Token returns nil, io.EOF. -// -// Slices of bytes in the returned token data refer to the -// parser's internal buffer and remain valid only until the next -// call to Token. To acquire a copy of the bytes, call CopyToken -// or the token's Copy method. -// -// Token expands self-closing elements such as
    -// into separate start and end elements returned by successive calls. -// -// Token guarantees that the StartElement and EndElement -// tokens it returns are properly nested and matched: -// if Token encounters an unexpected end element, -// it will return an error. -// -// Token implements XML name spaces as described by -// http://www.w3.org/TR/REC-xml-names/. Each of the -// Name structures contained in the Token has the Space -// set to the URL identifying its name space when known. -// If Token encounters an unrecognized name space prefix, -// it uses the prefix as the Space rather than report an error. -func (d *Decoder) Token() (t Token, err error) { - if d.stk != nil && d.stk.kind == stkEOF { - err = io.EOF - return - } - if d.nextToken != nil { - t = d.nextToken - d.nextToken = nil - } else if t, err = d.rawToken(); err != nil { - return - } - - if !d.Strict { - if t1, ok := d.autoClose(t); ok { - d.nextToken = t - t = t1 - } - } - switch t1 := t.(type) { - case StartElement: - // In XML name spaces, the translations listed in the - // attributes apply to the element name and - // to the other attribute names, so process - // the translations first. - for _, a := range t1.Attr { - if a.Name.Space == "xmlns" { - v, ok := d.ns[a.Name.Local] - d.pushNs(a.Name.Local, v, ok) - d.ns[a.Name.Local] = a.Value - } - if a.Name.Space == "" && a.Name.Local == "xmlns" { - // Default space for untagged names - v, ok := d.ns[""] - d.pushNs("", v, ok) - d.ns[""] = a.Value - } - } - - d.translate(&t1.Name, true) - for i := range t1.Attr { - d.translate(&t1.Attr[i].Name, false) - } - d.pushElement(t1.Name) - t = t1 - - case EndElement: - d.translate(&t1.Name, true) - if !d.popElement(&t1) { - return nil, d.err - } - t = t1 - } - return -} - -const xmlURL = "http://www.w3.org/XML/1998/namespace" - -// Apply name space translation to name n. -// The default name space (for Space=="") -// applies only to element names, not to attribute names. -func (d *Decoder) translate(n *Name, isElementName bool) { - switch { - case n.Space == "xmlns": - return - case n.Space == "" && !isElementName: - return - case n.Space == "xml": - n.Space = xmlURL - case n.Space == "" && n.Local == "xmlns": - return - } - if v, ok := d.ns[n.Space]; ok { - n.Space = v - } else if n.Space == "" { - n.Space = d.DefaultSpace - } -} - -func (d *Decoder) switchToReader(r io.Reader) { - // Get efficient byte at a time reader. - // Assume that if reader has its own - // ReadByte, it's efficient enough. - // Otherwise, use bufio. - if rb, ok := r.(io.ByteReader); ok { - d.r = rb - } else { - d.r = bufio.NewReader(r) - } -} - -// Parsing state - stack holds old name space translations -// and the current set of open elements. The translations to pop when -// ending a given tag are *below* it on the stack, which is -// more work but forced on us by XML. -type stack struct { - next *stack - kind int - name Name - ok bool -} - -const ( - stkStart = iota - stkNs - stkEOF -) - -func (d *Decoder) push(kind int) *stack { - s := d.free - if s != nil { - d.free = s.next - } else { - s = new(stack) - } - s.next = d.stk - s.kind = kind - d.stk = s - return s -} - -func (d *Decoder) pop() *stack { - s := d.stk - if s != nil { - d.stk = s.next - s.next = d.free - d.free = s - } - return s -} - -// Record that after the current element is finished -// (that element is already pushed on the stack) -// Token should return EOF until popEOF is called. -func (d *Decoder) pushEOF() { - // Walk down stack to find Start. - // It might not be the top, because there might be stkNs - // entries above it. - start := d.stk - for start.kind != stkStart { - start = start.next - } - // The stkNs entries below a start are associated with that - // element too; skip over them. - for start.next != nil && start.next.kind == stkNs { - start = start.next - } - s := d.free - if s != nil { - d.free = s.next - } else { - s = new(stack) - } - s.kind = stkEOF - s.next = start.next - start.next = s -} - -// Undo a pushEOF. -// The element must have been finished, so the EOF should be at the top of the stack. -func (d *Decoder) popEOF() bool { - if d.stk == nil || d.stk.kind != stkEOF { - return false - } - d.pop() - return true -} - -// Record that we are starting an element with the given name. -func (d *Decoder) pushElement(name Name) { - s := d.push(stkStart) - s.name = name -} - -// Record that we are changing the value of ns[local]. -// The old value is url, ok. -func (d *Decoder) pushNs(local string, url string, ok bool) { - s := d.push(stkNs) - s.name.Local = local - s.name.Space = url - s.ok = ok -} - -// Creates a SyntaxError with the current line number. -func (d *Decoder) syntaxError(msg string) error { - return &SyntaxError{Msg: msg, Line: d.line} -} - -// Record that we are ending an element with the given name. -// The name must match the record at the top of the stack, -// which must be a pushElement record. -// After popping the element, apply any undo records from -// the stack to restore the name translations that existed -// before we saw this element. -func (d *Decoder) popElement(t *EndElement) bool { - s := d.pop() - name := t.Name - switch { - case s == nil || s.kind != stkStart: - d.err = d.syntaxError("unexpected end element ") - return false - case s.name.Local != name.Local: - if !d.Strict { - d.needClose = true - d.toClose = t.Name - t.Name = s.name - return true - } - d.err = d.syntaxError("element <" + s.name.Local + "> closed by ") - return false - case s.name.Space != name.Space: - d.err = d.syntaxError("element <" + s.name.Local + "> in space " + s.name.Space + - "closed by in space " + name.Space) - return false - } - - // Pop stack until a Start or EOF is on the top, undoing the - // translations that were associated with the element we just closed. - for d.stk != nil && d.stk.kind != stkStart && d.stk.kind != stkEOF { - s := d.pop() - if s.ok { - d.ns[s.name.Local] = s.name.Space - } else { - delete(d.ns, s.name.Local) - } - } - - return true -} - -// If the top element on the stack is autoclosing and -// t is not the end tag, invent the end tag. -func (d *Decoder) autoClose(t Token) (Token, bool) { - if d.stk == nil || d.stk.kind != stkStart { - return nil, false - } - name := strings.ToLower(d.stk.name.Local) - for _, s := range d.AutoClose { - if strings.ToLower(s) == name { - // This one should be auto closed if t doesn't close it. - et, ok := t.(EndElement) - if !ok || et.Name.Local != name { - return EndElement{d.stk.name}, true - } - break - } - } - return nil, false -} - -var errRawToken = errors.New("xml: cannot use RawToken from UnmarshalXML method") - -// RawToken is like Token but does not verify that -// start and end elements match and does not translate -// name space prefixes to their corresponding URLs. -func (d *Decoder) RawToken() (Token, error) { - if d.unmarshalDepth > 0 { - return nil, errRawToken - } - return d.rawToken() -} - -func (d *Decoder) rawToken() (Token, error) { - if d.err != nil { - return nil, d.err - } - if d.needClose { - // The last element we read was self-closing and - // we returned just the StartElement half. - // Return the EndElement half now. - d.needClose = false - return EndElement{d.toClose}, nil - } - - b, ok := d.getc() - if !ok { - return nil, d.err - } - - if b != '<' { - // Text section. - d.ungetc(b) - data := d.text(-1, false) - if data == nil { - return nil, d.err - } - return CharData(data), nil - } - - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - switch b { - case '/': - // ' { - d.err = d.syntaxError("invalid characters between ") - return nil, d.err - } - return EndElement{name}, nil - - case '?': - // ' { - break - } - b0 = b - } - data := d.buf.Bytes() - data = data[0 : len(data)-2] // chop ?> - - if target == "xml" { - content := string(data) - ver := procInst("version", content) - if ver != "" && ver != "1.0" { - d.err = fmt.Errorf("xml: unsupported version %q; only version 1.0 is supported", ver) - return nil, d.err - } - enc := procInst("encoding", content) - if enc != "" && enc != "utf-8" && enc != "UTF-8" { - if d.CharsetReader == nil { - d.err = fmt.Errorf("xml: encoding %q declared but Decoder.CharsetReader is nil", enc) - return nil, d.err - } - newr, err := d.CharsetReader(enc, d.r.(io.Reader)) - if err != nil { - d.err = fmt.Errorf("xml: opening charset %q: %v", enc, err) - return nil, d.err - } - if newr == nil { - panic("CharsetReader returned a nil Reader for charset " + enc) - } - d.switchToReader(newr) - } - } - return ProcInst{target, data}, nil - - case '!': - // ' { - break - } - b0, b1 = b1, b - } - data := d.buf.Bytes() - data = data[0 : len(data)-3] // chop --> - return Comment(data), nil - - case '[': // . - data := d.text(-1, true) - if data == nil { - return nil, d.err - } - return CharData(data), nil - } - - // Probably a directive: , , etc. - // We don't care, but accumulate for caller. Quoted angle - // brackets do not count for nesting. - d.buf.Reset() - d.buf.WriteByte(b) - inquote := uint8(0) - depth := 0 - for { - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - if inquote == 0 && b == '>' && depth == 0 { - break - } - HandleB: - d.buf.WriteByte(b) - switch { - case b == inquote: - inquote = 0 - - case inquote != 0: - // in quotes, no special action - - case b == '\'' || b == '"': - inquote = b - - case b == '>' && inquote == 0: - depth-- - - case b == '<' && inquote == 0: - // Look for ` - -var testEntity = map[string]string{"何": "What", "is-it": "is it?"} - -var rawTokens = []Token{ - CharData("\n"), - ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)}, - CharData("\n"), - Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`), - CharData("\n"), - StartElement{Name{"", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}}, - CharData("\n "), - StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}}, - CharData("World <>'\" 白鵬翔"), - EndElement{Name{"", "hello"}}, - CharData("\n "), - StartElement{Name{"", "query"}, []Attr{}}, - CharData("What is it?"), - EndElement{Name{"", "query"}}, - CharData("\n "), - StartElement{Name{"", "goodbye"}, []Attr{}}, - EndElement{Name{"", "goodbye"}}, - CharData("\n "), - StartElement{Name{"", "outer"}, []Attr{{Name{"foo", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}}, - CharData("\n "), - StartElement{Name{"", "inner"}, []Attr{}}, - EndElement{Name{"", "inner"}}, - CharData("\n "), - EndElement{Name{"", "outer"}}, - CharData("\n "), - StartElement{Name{"tag", "name"}, []Attr{}}, - CharData("\n "), - CharData("Some text here."), - CharData("\n "), - EndElement{Name{"tag", "name"}}, - CharData("\n"), - EndElement{Name{"", "body"}}, - Comment(" missing final newline "), -} - -var cookedTokens = []Token{ - CharData("\n"), - ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)}, - CharData("\n"), - Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`), - CharData("\n"), - StartElement{Name{"ns2", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}}, - CharData("\n "), - StartElement{Name{"ns2", "hello"}, []Attr{{Name{"", "lang"}, "en"}}}, - CharData("World <>'\" 白鵬翔"), - EndElement{Name{"ns2", "hello"}}, - CharData("\n "), - StartElement{Name{"ns2", "query"}, []Attr{}}, - CharData("What is it?"), - EndElement{Name{"ns2", "query"}}, - CharData("\n "), - StartElement{Name{"ns2", "goodbye"}, []Attr{}}, - EndElement{Name{"ns2", "goodbye"}}, - CharData("\n "), - StartElement{Name{"ns2", "outer"}, []Attr{{Name{"ns1", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}}, - CharData("\n "), - StartElement{Name{"ns2", "inner"}, []Attr{}}, - EndElement{Name{"ns2", "inner"}}, - CharData("\n "), - EndElement{Name{"ns2", "outer"}}, - CharData("\n "), - StartElement{Name{"ns3", "name"}, []Attr{}}, - CharData("\n "), - CharData("Some text here."), - CharData("\n "), - EndElement{Name{"ns3", "name"}}, - CharData("\n"), - EndElement{Name{"ns2", "body"}}, - Comment(" missing final newline "), -} - -const testInputAltEncoding = ` - -VALUE` - -var rawTokensAltEncoding = []Token{ - CharData("\n"), - ProcInst{"xml", []byte(`version="1.0" encoding="x-testing-uppercase"`)}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("value"), - EndElement{Name{"", "tag"}}, -} - -var xmlInput = []string{ - // unexpected EOF cases - "<", - "", - "", - "", - // "", // let the Token() caller handle - "", - "", - "", - "", - " c;", - "", - "", - "", - // "", // let the Token() caller handle - "", - "", - "cdata]]>", -} - -func TestRawToken(t *testing.T) { - d := NewDecoder(strings.NewReader(testInput)) - d.Entity = testEntity - testRawToken(t, d, testInput, rawTokens) -} - -const nonStrictInput = ` -non&entity -&unknown;entity -{ -&#zzz; -&なまえ3; -<-gt; -&; -&0a; -` - -var nonStringEntity = map[string]string{"": "oops!", "0a": "oops!"} - -var nonStrictTokens = []Token{ - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("non&entity"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&unknown;entity"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("{"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&#zzz;"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&なまえ3;"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("<-gt;"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&;"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&0a;"), - EndElement{Name{"", "tag"}}, - CharData("\n"), -} - -func TestNonStrictRawToken(t *testing.T) { - d := NewDecoder(strings.NewReader(nonStrictInput)) - d.Strict = false - testRawToken(t, d, nonStrictInput, nonStrictTokens) -} - -type downCaser struct { - t *testing.T - r io.ByteReader -} - -func (d *downCaser) ReadByte() (c byte, err error) { - c, err = d.r.ReadByte() - if c >= 'A' && c <= 'Z' { - c += 'a' - 'A' - } - return -} - -func (d *downCaser) Read(p []byte) (int, error) { - d.t.Fatalf("unexpected Read call on downCaser reader") - panic("unreachable") -} - -func TestRawTokenAltEncoding(t *testing.T) { - d := NewDecoder(strings.NewReader(testInputAltEncoding)) - d.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) { - if charset != "x-testing-uppercase" { - t.Fatalf("unexpected charset %q", charset) - } - return &downCaser{t, input.(io.ByteReader)}, nil - } - testRawToken(t, d, testInputAltEncoding, rawTokensAltEncoding) -} - -func TestRawTokenAltEncodingNoConverter(t *testing.T) { - d := NewDecoder(strings.NewReader(testInputAltEncoding)) - token, err := d.RawToken() - if token == nil { - t.Fatalf("expected a token on first RawToken call") - } - if err != nil { - t.Fatal(err) - } - token, err = d.RawToken() - if token != nil { - t.Errorf("expected a nil token; got %#v", token) - } - if err == nil { - t.Fatalf("expected an error on second RawToken call") - } - const encoding = "x-testing-uppercase" - if !strings.Contains(err.Error(), encoding) { - t.Errorf("expected error to contain %q; got error: %v", - encoding, err) - } -} - -func testRawToken(t *testing.T, d *Decoder, raw string, rawTokens []Token) { - lastEnd := int64(0) - for i, want := range rawTokens { - start := d.InputOffset() - have, err := d.RawToken() - end := d.InputOffset() - if err != nil { - t.Fatalf("token %d: unexpected error: %s", i, err) - } - if !reflect.DeepEqual(have, want) { - var shave, swant string - if _, ok := have.(CharData); ok { - shave = fmt.Sprintf("CharData(%q)", have) - } else { - shave = fmt.Sprintf("%#v", have) - } - if _, ok := want.(CharData); ok { - swant = fmt.Sprintf("CharData(%q)", want) - } else { - swant = fmt.Sprintf("%#v", want) - } - t.Errorf("token %d = %s, want %s", i, shave, swant) - } - - // Check that InputOffset returned actual token. - switch { - case start < lastEnd: - t.Errorf("token %d: position [%d,%d) for %T is before previous token", i, start, end, have) - case start >= end: - // Special case: EndElement can be synthesized. - if start == end && end == lastEnd { - break - } - t.Errorf("token %d: position [%d,%d) for %T is empty", i, start, end, have) - case end > int64(len(raw)): - t.Errorf("token %d: position [%d,%d) for %T extends beyond input", i, start, end, have) - default: - text := raw[start:end] - if strings.ContainsAny(text, "<>") && (!strings.HasPrefix(text, "<") || !strings.HasSuffix(text, ">")) { - t.Errorf("token %d: misaligned raw token %#q for %T", i, text, have) - } - } - lastEnd = end - } -} - -// Ensure that directives (specifically !DOCTYPE) include the complete -// text of any nested directives, noting that < and > do not change -// nesting depth if they are in single or double quotes. - -var nestedDirectivesInput = ` -]> -">]> -]> -'>]> -]> -'>]> -]> -` - -var nestedDirectivesTokens = []Token{ - CharData("\n"), - Directive(`DOCTYPE []`), - CharData("\n"), - Directive(`DOCTYPE [">]`), - CharData("\n"), - Directive(`DOCTYPE []`), - CharData("\n"), - Directive(`DOCTYPE ['>]`), - CharData("\n"), - Directive(`DOCTYPE []`), - CharData("\n"), - Directive(`DOCTYPE ['>]`), - CharData("\n"), - Directive(`DOCTYPE []`), - CharData("\n"), -} - -func TestNestedDirectives(t *testing.T) { - d := NewDecoder(strings.NewReader(nestedDirectivesInput)) - - for i, want := range nestedDirectivesTokens { - have, err := d.Token() - if err != nil { - t.Fatalf("token %d: unexpected error: %s", i, err) - } - if !reflect.DeepEqual(have, want) { - t.Errorf("token %d = %#v want %#v", i, have, want) - } - } -} - -func TestToken(t *testing.T) { - d := NewDecoder(strings.NewReader(testInput)) - d.Entity = testEntity - - for i, want := range cookedTokens { - have, err := d.Token() - if err != nil { - t.Fatalf("token %d: unexpected error: %s", i, err) - } - if !reflect.DeepEqual(have, want) { - t.Errorf("token %d = %#v want %#v", i, have, want) - } - } -} - -func TestSyntax(t *testing.T) { - for i := range xmlInput { - d := NewDecoder(strings.NewReader(xmlInput[i])) - var err error - for _, err = d.Token(); err == nil; _, err = d.Token() { - } - if _, ok := err.(*SyntaxError); !ok { - t.Fatalf(`xmlInput "%s": expected SyntaxError not received`, xmlInput[i]) - } - } -} - -type allScalars struct { - True1 bool - True2 bool - False1 bool - False2 bool - Int int - Int8 int8 - Int16 int16 - Int32 int32 - Int64 int64 - Uint int - Uint8 uint8 - Uint16 uint16 - Uint32 uint32 - Uint64 uint64 - Uintptr uintptr - Float32 float32 - Float64 float64 - String string - PtrString *string -} - -var all = allScalars{ - True1: true, - True2: true, - False1: false, - False2: false, - Int: 1, - Int8: -2, - Int16: 3, - Int32: -4, - Int64: 5, - Uint: 6, - Uint8: 7, - Uint16: 8, - Uint32: 9, - Uint64: 10, - Uintptr: 11, - Float32: 13.0, - Float64: 14.0, - String: "15", - PtrString: &sixteen, -} - -var sixteen = "16" - -const testScalarsInput = ` - true - 1 - false - 0 - 1 - -2 - 3 - -4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12.0 - 13.0 - 14.0 - 15 - 16 -` - -func TestAllScalars(t *testing.T) { - var a allScalars - err := Unmarshal([]byte(testScalarsInput), &a) - - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(a, all) { - t.Errorf("have %+v want %+v", a, all) - } -} - -type item struct { - Field_a string -} - -func TestIssue569(t *testing.T) { - data := `abcd` - var i item - err := Unmarshal([]byte(data), &i) - - if err != nil || i.Field_a != "abcd" { - t.Fatal("Expecting abcd") - } -} - -func TestUnquotedAttrs(t *testing.T) { - data := "" - d := NewDecoder(strings.NewReader(data)) - d.Strict = false - token, err := d.Token() - if _, ok := err.(*SyntaxError); ok { - t.Errorf("Unexpected error: %v", err) - } - if token.(StartElement).Name.Local != "tag" { - t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local) - } - attr := token.(StartElement).Attr[0] - if attr.Value != "azAZ09:-_" { - t.Errorf("Unexpected attribute value: %v", attr.Value) - } - if attr.Name.Local != "attr" { - t.Errorf("Unexpected attribute name: %v", attr.Name.Local) - } -} - -func TestValuelessAttrs(t *testing.T) { - tests := [][3]string{ - {"

    ", "p", "nowrap"}, - {"

    ", "p", "nowrap"}, - {"", "input", "checked"}, - {"", "input", "checked"}, - } - for _, test := range tests { - d := NewDecoder(strings.NewReader(test[0])) - d.Strict = false - token, err := d.Token() - if _, ok := err.(*SyntaxError); ok { - t.Errorf("Unexpected error: %v", err) - } - if token.(StartElement).Name.Local != test[1] { - t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local) - } - attr := token.(StartElement).Attr[0] - if attr.Value != test[2] { - t.Errorf("Unexpected attribute value: %v", attr.Value) - } - if attr.Name.Local != test[2] { - t.Errorf("Unexpected attribute name: %v", attr.Name.Local) - } - } -} - -func TestCopyTokenCharData(t *testing.T) { - data := []byte("same data") - var tok1 Token = CharData(data) - tok2 := CopyToken(tok1) - if !reflect.DeepEqual(tok1, tok2) { - t.Error("CopyToken(CharData) != CharData") - } - data[1] = 'o' - if reflect.DeepEqual(tok1, tok2) { - t.Error("CopyToken(CharData) uses same buffer.") - } -} - -func TestCopyTokenStartElement(t *testing.T) { - elt := StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}} - var tok1 Token = elt - tok2 := CopyToken(tok1) - if tok1.(StartElement).Attr[0].Value != "en" { - t.Error("CopyToken overwrote Attr[0]") - } - if !reflect.DeepEqual(tok1, tok2) { - t.Error("CopyToken(StartElement) != StartElement") - } - tok1.(StartElement).Attr[0] = Attr{Name{"", "lang"}, "de"} - if reflect.DeepEqual(tok1, tok2) { - t.Error("CopyToken(CharData) uses same buffer.") - } -} - -func TestSyntaxErrorLineNum(t *testing.T) { - testInput := "

    Foo

    \n\n

    Bar\n" - d := NewDecoder(strings.NewReader(testInput)) - var err error - for _, err = d.Token(); err == nil; _, err = d.Token() { - } - synerr, ok := err.(*SyntaxError) - if !ok { - t.Error("Expected SyntaxError.") - } - if synerr.Line != 3 { - t.Error("SyntaxError didn't have correct line number.") - } -} - -func TestTrailingRawToken(t *testing.T) { - input := ` ` - d := NewDecoder(strings.NewReader(input)) - var err error - for _, err = d.RawToken(); err == nil; _, err = d.RawToken() { - } - if err != io.EOF { - t.Fatalf("d.RawToken() = _, %v, want _, io.EOF", err) - } -} - -func TestTrailingToken(t *testing.T) { - input := ` ` - d := NewDecoder(strings.NewReader(input)) - var err error - for _, err = d.Token(); err == nil; _, err = d.Token() { - } - if err != io.EOF { - t.Fatalf("d.Token() = _, %v, want _, io.EOF", err) - } -} - -func TestEntityInsideCDATA(t *testing.T) { - input := `` - d := NewDecoder(strings.NewReader(input)) - var err error - for _, err = d.Token(); err == nil; _, err = d.Token() { - } - if err != io.EOF { - t.Fatalf("d.Token() = _, %v, want _, io.EOF", err) - } -} - -var characterTests = []struct { - in string - err string -}{ - {"\x12", "illegal character code U+0012"}, - {"\x0b", "illegal character code U+000B"}, - {"\xef\xbf\xbe", "illegal character code U+FFFE"}, - {"\r\n\x07", "illegal character code U+0007"}, - {"what's up", "expected attribute name in element"}, - {"&abc\x01;", "invalid character entity &abc (no semicolon)"}, - {"&\x01;", "invalid character entity & (no semicolon)"}, - {"&\xef\xbf\xbe;", "invalid character entity &\uFFFE;"}, - {"&hello;", "invalid character entity &hello;"}, -} - -func TestDisallowedCharacters(t *testing.T) { - - for i, tt := range characterTests { - d := NewDecoder(strings.NewReader(tt.in)) - var err error - - for err == nil { - _, err = d.Token() - } - synerr, ok := err.(*SyntaxError) - if !ok { - t.Fatalf("input %d d.Token() = _, %v, want _, *SyntaxError", i, err) - } - if synerr.Msg != tt.err { - t.Fatalf("input %d synerr.Msg wrong: want %q, got %q", i, tt.err, synerr.Msg) - } - } -} - -type procInstEncodingTest struct { - expect, got string -} - -var procInstTests = []struct { - input string - expect [2]string -}{ - {`version="1.0" encoding="utf-8"`, [2]string{"1.0", "utf-8"}}, - {`version="1.0" encoding='utf-8'`, [2]string{"1.0", "utf-8"}}, - {`version="1.0" encoding='utf-8' `, [2]string{"1.0", "utf-8"}}, - {`version="1.0" encoding=utf-8`, [2]string{"1.0", ""}}, - {`encoding="FOO" `, [2]string{"", "FOO"}}, -} - -func TestProcInstEncoding(t *testing.T) { - for _, test := range procInstTests { - if got := procInst("version", test.input); got != test.expect[0] { - t.Errorf("procInst(version, %q) = %q; want %q", test.input, got, test.expect[0]) - } - if got := procInst("encoding", test.input); got != test.expect[1] { - t.Errorf("procInst(encoding, %q) = %q; want %q", test.input, got, test.expect[1]) - } - } -} - -// Ensure that directives with comments include the complete -// text of any nested directives. - -var directivesWithCommentsInput = ` -]> -]> - --> --> []> -` - -var directivesWithCommentsTokens = []Token{ - CharData("\n"), - Directive(`DOCTYPE []`), - CharData("\n"), - Directive(`DOCTYPE []`), - CharData("\n"), - Directive(`DOCTYPE []`), - CharData("\n"), -} - -func TestDirectivesWithComments(t *testing.T) { - d := NewDecoder(strings.NewReader(directivesWithCommentsInput)) - - for i, want := range directivesWithCommentsTokens { - have, err := d.Token() - if err != nil { - t.Fatalf("token %d: unexpected error: %s", i, err) - } - if !reflect.DeepEqual(have, want) { - t.Errorf("token %d = %#v want %#v", i, have, want) - } - } -} - -// Writer whose Write method always returns an error. -type errWriter struct{} - -func (errWriter) Write(p []byte) (n int, err error) { return 0, fmt.Errorf("unwritable") } - -func TestEscapeTextIOErrors(t *testing.T) { - expectErr := "unwritable" - err := EscapeText(errWriter{}, []byte{'A'}) - - if err == nil || err.Error() != expectErr { - t.Errorf("have %v, want %v", err, expectErr) - } -} - -func TestEscapeTextInvalidChar(t *testing.T) { - input := []byte("A \x00 terminated string.") - expected := "A \uFFFD terminated string." - - buff := new(bytes.Buffer) - if err := EscapeText(buff, input); err != nil { - t.Fatalf("have %v, want nil", err) - } - text := buff.String() - - if text != expected { - t.Errorf("have %v, want %v", text, expected) - } -} - -func TestIssue5880(t *testing.T) { - type T []byte - data, err := Marshal(T{192, 168, 0, 1}) - if err != nil { - t.Errorf("Marshal error: %v", err) - } - if !utf8.Valid(data) { - t.Errorf("Marshal generated invalid UTF-8: %x", data) - } -} diff --git a/vendor/golang.org/x/net/webdav/litmus_test_server.go b/vendor/golang.org/x/net/webdav/litmus_test_server.go deleted file mode 100644 index 514db5dd1..000000000 --- a/vendor/golang.org/x/net/webdav/litmus_test_server.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -This program is a server for the WebDAV 'litmus' compliance test at -http://www.webdav.org/neon/litmus/ -To run the test: - -go run litmus_test_server.go - -and separately, from the downloaded litmus-xxx directory: - -make URL=http://localhost:9999/ check -*/ -package main - -import ( - "flag" - "fmt" - "log" - "net/http" - "net/url" - - "golang.org/x/net/webdav" -) - -var port = flag.Int("port", 9999, "server port") - -func main() { - flag.Parse() - log.SetFlags(0) - h := &webdav.Handler{ - FileSystem: webdav.NewMemFS(), - LockSystem: webdav.NewMemLS(), - Logger: func(r *http.Request, err error) { - litmus := r.Header.Get("X-Litmus") - if len(litmus) > 19 { - litmus = litmus[:16] + "..." - } - - switch r.Method { - case "COPY", "MOVE": - dst := "" - if u, err := url.Parse(r.Header.Get("Destination")); err == nil { - dst = u.Path - } - o := r.Header.Get("Overwrite") - log.Printf("%-20s%-10s%-30s%-30so=%-2s%v", litmus, r.Method, r.URL.Path, dst, o, err) - default: - log.Printf("%-20s%-10s%-30s%v", litmus, r.Method, r.URL.Path, err) - } - }, - } - - // The next line would normally be: - // http.Handle("/", h) - // but we wrap that HTTP handler h to cater for a special case. - // - // The propfind_invalid2 litmus test case expects an empty namespace prefix - // declaration to be an error. The FAQ in the webdav litmus test says: - // - // "What does the "propfind_invalid2" test check for?... - // - // If a request was sent with an XML body which included an empty namespace - // prefix declaration (xmlns:ns1=""), then the server must reject that with - // a "400 Bad Request" response, as it is invalid according to the XML - // Namespace specification." - // - // On the other hand, the Go standard library's encoding/xml package - // accepts an empty xmlns namespace, as per the discussion at - // https://github.com/golang/go/issues/8068 - // - // Empty namespaces seem disallowed in the second (2006) edition of the XML - // standard, but allowed in a later edition. The grammar differs between - // http://www.w3.org/TR/2006/REC-xml-names-20060816/#ns-decl and - // http://www.w3.org/TR/REC-xml-names/#dt-prefix - // - // Thus, we assume that the propfind_invalid2 test is obsolete, and - // hard-code the 400 Bad Request response that the test expects. - http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("X-Litmus") == "props: 3 (propfind_invalid2)" { - http.Error(w, "400 Bad Request", http.StatusBadRequest) - return - } - h.ServeHTTP(w, r) - })) - - addr := fmt.Sprintf(":%d", *port) - log.Printf("Serving %v", addr) - log.Fatal(http.ListenAndServe(addr, nil)) -} diff --git a/vendor/golang.org/x/net/webdav/lock.go b/vendor/golang.org/x/net/webdav/lock.go deleted file mode 100644 index 344ac5cea..000000000 --- a/vendor/golang.org/x/net/webdav/lock.go +++ /dev/null @@ -1,445 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "container/heap" - "errors" - "strconv" - "strings" - "sync" - "time" -) - -var ( - // ErrConfirmationFailed is returned by a LockSystem's Confirm method. - ErrConfirmationFailed = errors.New("webdav: confirmation failed") - // ErrForbidden is returned by a LockSystem's Unlock method. - ErrForbidden = errors.New("webdav: forbidden") - // ErrLocked is returned by a LockSystem's Create, Refresh and Unlock methods. - ErrLocked = errors.New("webdav: locked") - // ErrNoSuchLock is returned by a LockSystem's Refresh and Unlock methods. - ErrNoSuchLock = errors.New("webdav: no such lock") -) - -// Condition can match a WebDAV resource, based on a token or ETag. -// Exactly one of Token and ETag should be non-empty. -type Condition struct { - Not bool - Token string - ETag string -} - -// LockSystem manages access to a collection of named resources. The elements -// in a lock name are separated by slash ('/', U+002F) characters, regardless -// of host operating system convention. -type LockSystem interface { - // Confirm confirms that the caller can claim all of the locks specified by - // the given conditions, and that holding the union of all of those locks - // gives exclusive access to all of the named resources. Up to two resources - // can be named. Empty names are ignored. - // - // Exactly one of release and err will be non-nil. If release is non-nil, - // all of the requested locks are held until release is called. Calling - // release does not unlock the lock, in the WebDAV UNLOCK sense, but once - // Confirm has confirmed that a lock claim is valid, that lock cannot be - // Confirmed again until it has been released. - // - // If Confirm returns ErrConfirmationFailed then the Handler will continue - // to try any other set of locks presented (a WebDAV HTTP request can - // present more than one set of locks). If it returns any other non-nil - // error, the Handler will write a "500 Internal Server Error" HTTP status. - Confirm(now time.Time, name0, name1 string, conditions ...Condition) (release func(), err error) - - // Create creates a lock with the given depth, duration, owner and root - // (name). The depth will either be negative (meaning infinite) or zero. - // - // If Create returns ErrLocked then the Handler will write a "423 Locked" - // HTTP status. If it returns any other non-nil error, the Handler will - // write a "500 Internal Server Error" HTTP status. - // - // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.10.6 for - // when to use each error. - // - // The token returned identifies the created lock. It should be an absolute - // URI as defined by RFC 3986, Section 4.3. In particular, it should not - // contain whitespace. - Create(now time.Time, details LockDetails) (token string, err error) - - // Refresh refreshes the lock with the given token. - // - // If Refresh returns ErrLocked then the Handler will write a "423 Locked" - // HTTP Status. If Refresh returns ErrNoSuchLock then the Handler will write - // a "412 Precondition Failed" HTTP Status. If it returns any other non-nil - // error, the Handler will write a "500 Internal Server Error" HTTP status. - // - // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.10.6 for - // when to use each error. - Refresh(now time.Time, token string, duration time.Duration) (LockDetails, error) - - // Unlock unlocks the lock with the given token. - // - // If Unlock returns ErrForbidden then the Handler will write a "403 - // Forbidden" HTTP Status. If Unlock returns ErrLocked then the Handler - // will write a "423 Locked" HTTP status. If Unlock returns ErrNoSuchLock - // then the Handler will write a "409 Conflict" HTTP Status. If it returns - // any other non-nil error, the Handler will write a "500 Internal Server - // Error" HTTP status. - // - // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.11.1 for - // when to use each error. - Unlock(now time.Time, token string) error -} - -// LockDetails are a lock's metadata. -type LockDetails struct { - // Root is the root resource name being locked. For a zero-depth lock, the - // root is the only resource being locked. - Root string - // Duration is the lock timeout. A negative duration means infinite. - Duration time.Duration - // OwnerXML is the verbatim XML given in a LOCK HTTP request. - // - // TODO: does the "verbatim" nature play well with XML namespaces? - // Does the OwnerXML field need to have more structure? See - // https://codereview.appspot.com/175140043/#msg2 - OwnerXML string - // ZeroDepth is whether the lock has zero depth. If it does not have zero - // depth, it has infinite depth. - ZeroDepth bool -} - -// NewMemLS returns a new in-memory LockSystem. -func NewMemLS() LockSystem { - return &memLS{ - byName: make(map[string]*memLSNode), - byToken: make(map[string]*memLSNode), - gen: uint64(time.Now().Unix()), - } -} - -type memLS struct { - mu sync.Mutex - byName map[string]*memLSNode - byToken map[string]*memLSNode - gen uint64 - // byExpiry only contains those nodes whose LockDetails have a finite - // Duration and are yet to expire. - byExpiry byExpiry -} - -func (m *memLS) nextToken() string { - m.gen++ - return strconv.FormatUint(m.gen, 10) -} - -func (m *memLS) collectExpiredNodes(now time.Time) { - for len(m.byExpiry) > 0 { - if now.Before(m.byExpiry[0].expiry) { - break - } - m.remove(m.byExpiry[0]) - } -} - -func (m *memLS) Confirm(now time.Time, name0, name1 string, conditions ...Condition) (func(), error) { - m.mu.Lock() - defer m.mu.Unlock() - m.collectExpiredNodes(now) - - var n0, n1 *memLSNode - if name0 != "" { - if n0 = m.lookup(slashClean(name0), conditions...); n0 == nil { - return nil, ErrConfirmationFailed - } - } - if name1 != "" { - if n1 = m.lookup(slashClean(name1), conditions...); n1 == nil { - return nil, ErrConfirmationFailed - } - } - - // Don't hold the same node twice. - if n1 == n0 { - n1 = nil - } - - if n0 != nil { - m.hold(n0) - } - if n1 != nil { - m.hold(n1) - } - return func() { - m.mu.Lock() - defer m.mu.Unlock() - if n1 != nil { - m.unhold(n1) - } - if n0 != nil { - m.unhold(n0) - } - }, nil -} - -// lookup returns the node n that locks the named resource, provided that n -// matches at least one of the given conditions and that lock isn't held by -// another party. Otherwise, it returns nil. -// -// n may be a parent of the named resource, if n is an infinite depth lock. -func (m *memLS) lookup(name string, conditions ...Condition) (n *memLSNode) { - // TODO: support Condition.Not and Condition.ETag. - for _, c := range conditions { - n = m.byToken[c.Token] - if n == nil || n.held { - continue - } - if name == n.details.Root { - return n - } - if n.details.ZeroDepth { - continue - } - if n.details.Root == "/" || strings.HasPrefix(name, n.details.Root+"/") { - return n - } - } - return nil -} - -func (m *memLS) hold(n *memLSNode) { - if n.held { - panic("webdav: memLS inconsistent held state") - } - n.held = true - if n.details.Duration >= 0 && n.byExpiryIndex >= 0 { - heap.Remove(&m.byExpiry, n.byExpiryIndex) - } -} - -func (m *memLS) unhold(n *memLSNode) { - if !n.held { - panic("webdav: memLS inconsistent held state") - } - n.held = false - if n.details.Duration >= 0 { - heap.Push(&m.byExpiry, n) - } -} - -func (m *memLS) Create(now time.Time, details LockDetails) (string, error) { - m.mu.Lock() - defer m.mu.Unlock() - m.collectExpiredNodes(now) - details.Root = slashClean(details.Root) - - if !m.canCreate(details.Root, details.ZeroDepth) { - return "", ErrLocked - } - n := m.create(details.Root) - n.token = m.nextToken() - m.byToken[n.token] = n - n.details = details - if n.details.Duration >= 0 { - n.expiry = now.Add(n.details.Duration) - heap.Push(&m.byExpiry, n) - } - return n.token, nil -} - -func (m *memLS) Refresh(now time.Time, token string, duration time.Duration) (LockDetails, error) { - m.mu.Lock() - defer m.mu.Unlock() - m.collectExpiredNodes(now) - - n := m.byToken[token] - if n == nil { - return LockDetails{}, ErrNoSuchLock - } - if n.held { - return LockDetails{}, ErrLocked - } - if n.byExpiryIndex >= 0 { - heap.Remove(&m.byExpiry, n.byExpiryIndex) - } - n.details.Duration = duration - if n.details.Duration >= 0 { - n.expiry = now.Add(n.details.Duration) - heap.Push(&m.byExpiry, n) - } - return n.details, nil -} - -func (m *memLS) Unlock(now time.Time, token string) error { - m.mu.Lock() - defer m.mu.Unlock() - m.collectExpiredNodes(now) - - n := m.byToken[token] - if n == nil { - return ErrNoSuchLock - } - if n.held { - return ErrLocked - } - m.remove(n) - return nil -} - -func (m *memLS) canCreate(name string, zeroDepth bool) bool { - return walkToRoot(name, func(name0 string, first bool) bool { - n := m.byName[name0] - if n == nil { - return true - } - if first { - if n.token != "" { - // The target node is already locked. - return false - } - if !zeroDepth { - // The requested lock depth is infinite, and the fact that n exists - // (n != nil) means that a descendent of the target node is locked. - return false - } - } else if n.token != "" && !n.details.ZeroDepth { - // An ancestor of the target node is locked with infinite depth. - return false - } - return true - }) -} - -func (m *memLS) create(name string) (ret *memLSNode) { - walkToRoot(name, func(name0 string, first bool) bool { - n := m.byName[name0] - if n == nil { - n = &memLSNode{ - details: LockDetails{ - Root: name0, - }, - byExpiryIndex: -1, - } - m.byName[name0] = n - } - n.refCount++ - if first { - ret = n - } - return true - }) - return ret -} - -func (m *memLS) remove(n *memLSNode) { - delete(m.byToken, n.token) - n.token = "" - walkToRoot(n.details.Root, func(name0 string, first bool) bool { - x := m.byName[name0] - x.refCount-- - if x.refCount == 0 { - delete(m.byName, name0) - } - return true - }) - if n.byExpiryIndex >= 0 { - heap.Remove(&m.byExpiry, n.byExpiryIndex) - } -} - -func walkToRoot(name string, f func(name0 string, first bool) bool) bool { - for first := true; ; first = false { - if !f(name, first) { - return false - } - if name == "/" { - break - } - name = name[:strings.LastIndex(name, "/")] - if name == "" { - name = "/" - } - } - return true -} - -type memLSNode struct { - // details are the lock metadata. Even if this node's name is not explicitly locked, - // details.Root will still equal the node's name. - details LockDetails - // token is the unique identifier for this node's lock. An empty token means that - // this node is not explicitly locked. - token string - // refCount is the number of self-or-descendent nodes that are explicitly locked. - refCount int - // expiry is when this node's lock expires. - expiry time.Time - // byExpiryIndex is the index of this node in memLS.byExpiry. It is -1 - // if this node does not expire, or has expired. - byExpiryIndex int - // held is whether this node's lock is actively held by a Confirm call. - held bool -} - -type byExpiry []*memLSNode - -func (b *byExpiry) Len() int { - return len(*b) -} - -func (b *byExpiry) Less(i, j int) bool { - return (*b)[i].expiry.Before((*b)[j].expiry) -} - -func (b *byExpiry) Swap(i, j int) { - (*b)[i], (*b)[j] = (*b)[j], (*b)[i] - (*b)[i].byExpiryIndex = i - (*b)[j].byExpiryIndex = j -} - -func (b *byExpiry) Push(x interface{}) { - n := x.(*memLSNode) - n.byExpiryIndex = len(*b) - *b = append(*b, n) -} - -func (b *byExpiry) Pop() interface{} { - i := len(*b) - 1 - n := (*b)[i] - (*b)[i] = nil - n.byExpiryIndex = -1 - *b = (*b)[:i] - return n -} - -const infiniteTimeout = -1 - -// parseTimeout parses the Timeout HTTP header, as per section 10.7. If s is -// empty, an infiniteTimeout is returned. -func parseTimeout(s string) (time.Duration, error) { - if s == "" { - return infiniteTimeout, nil - } - if i := strings.IndexByte(s, ','); i >= 0 { - s = s[:i] - } - s = strings.TrimSpace(s) - if s == "Infinite" { - return infiniteTimeout, nil - } - const pre = "Second-" - if !strings.HasPrefix(s, pre) { - return 0, errInvalidTimeout - } - s = s[len(pre):] - if s == "" || s[0] < '0' || '9' < s[0] { - return 0, errInvalidTimeout - } - n, err := strconv.ParseInt(s, 10, 64) - if err != nil || 1<<32-1 < n { - return 0, errInvalidTimeout - } - return time.Duration(n) * time.Second, nil -} diff --git a/vendor/golang.org/x/net/webdav/lock_test.go b/vendor/golang.org/x/net/webdav/lock_test.go deleted file mode 100644 index 5cf14cda4..000000000 --- a/vendor/golang.org/x/net/webdav/lock_test.go +++ /dev/null @@ -1,731 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "fmt" - "math/rand" - "path" - "reflect" - "sort" - "strconv" - "strings" - "testing" - "time" -) - -func TestWalkToRoot(t *testing.T) { - testCases := []struct { - name string - want []string - }{{ - "/a/b/c/d", - []string{ - "/a/b/c/d", - "/a/b/c", - "/a/b", - "/a", - "/", - }, - }, { - "/a", - []string{ - "/a", - "/", - }, - }, { - "/", - []string{ - "/", - }, - }} - - for _, tc := range testCases { - var got []string - if !walkToRoot(tc.name, func(name0 string, first bool) bool { - if first != (len(got) == 0) { - t.Errorf("name=%q: first=%t but len(got)==%d", tc.name, first, len(got)) - return false - } - got = append(got, name0) - return true - }) { - continue - } - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("name=%q:\ngot %q\nwant %q", tc.name, got, tc.want) - } - } -} - -var lockTestDurations = []time.Duration{ - infiniteTimeout, // infiniteTimeout means to never expire. - 0, // A zero duration means to expire immediately. - 100 * time.Hour, // A very large duration will not expire in these tests. -} - -// lockTestNames are the names of a set of mutually compatible locks. For each -// name fragment: -// - _ means no explicit lock. -// - i means an infinite-depth lock, -// - z means a zero-depth lock, -var lockTestNames = []string{ - "/_/_/_/_/z", - "/_/_/i", - "/_/z", - "/_/z/i", - "/_/z/z", - "/_/z/_/i", - "/_/z/_/z", - "/i", - "/z", - "/z/_/i", - "/z/_/z", -} - -func lockTestZeroDepth(name string) bool { - switch name[len(name)-1] { - case 'i': - return false - case 'z': - return true - } - panic(fmt.Sprintf("lock name %q did not end with 'i' or 'z'", name)) -} - -func TestMemLSCanCreate(t *testing.T) { - now := time.Unix(0, 0) - m := NewMemLS().(*memLS) - - for _, name := range lockTestNames { - _, err := m.Create(now, LockDetails{ - Root: name, - Duration: infiniteTimeout, - ZeroDepth: lockTestZeroDepth(name), - }) - if err != nil { - t.Fatalf("creating lock for %q: %v", name, err) - } - } - - wantCanCreate := func(name string, zeroDepth bool) bool { - for _, n := range lockTestNames { - switch { - case n == name: - // An existing lock has the same name as the proposed lock. - return false - case strings.HasPrefix(n, name): - // An existing lock would be a child of the proposed lock, - // which conflicts if the proposed lock has infinite depth. - if !zeroDepth { - return false - } - case strings.HasPrefix(name, n): - // An existing lock would be an ancestor of the proposed lock, - // which conflicts if the ancestor has infinite depth. - if n[len(n)-1] == 'i' { - return false - } - } - } - return true - } - - var check func(int, string) - check = func(recursion int, name string) { - for _, zeroDepth := range []bool{false, true} { - got := m.canCreate(name, zeroDepth) - want := wantCanCreate(name, zeroDepth) - if got != want { - t.Errorf("canCreate name=%q zeroDepth=%t: got %t, want %t", name, zeroDepth, got, want) - } - } - if recursion == 6 { - return - } - if name != "/" { - name += "/" - } - for _, c := range "_iz" { - check(recursion+1, name+string(c)) - } - } - check(0, "/") -} - -func TestMemLSLookup(t *testing.T) { - now := time.Unix(0, 0) - m := NewMemLS().(*memLS) - - badToken := m.nextToken() - t.Logf("badToken=%q", badToken) - - for _, name := range lockTestNames { - token, err := m.Create(now, LockDetails{ - Root: name, - Duration: infiniteTimeout, - ZeroDepth: lockTestZeroDepth(name), - }) - if err != nil { - t.Fatalf("creating lock for %q: %v", name, err) - } - t.Logf("%-15q -> node=%p token=%q", name, m.byName[name], token) - } - - baseNames := append([]string{"/a", "/b/c"}, lockTestNames...) - for _, baseName := range baseNames { - for _, suffix := range []string{"", "/0", "/1/2/3"} { - name := baseName + suffix - - goodToken := "" - base := m.byName[baseName] - if base != nil && (suffix == "" || !lockTestZeroDepth(baseName)) { - goodToken = base.token - } - - for _, token := range []string{badToken, goodToken} { - if token == "" { - continue - } - - got := m.lookup(name, Condition{Token: token}) - want := base - if token == badToken { - want = nil - } - if got != want { - t.Errorf("name=%-20qtoken=%q (bad=%t): got %p, want %p", - name, token, token == badToken, got, want) - } - } - } - } -} - -func TestMemLSConfirm(t *testing.T) { - now := time.Unix(0, 0) - m := NewMemLS().(*memLS) - alice, err := m.Create(now, LockDetails{ - Root: "/alice", - Duration: infiniteTimeout, - ZeroDepth: false, - }) - tweedle, err := m.Create(now, LockDetails{ - Root: "/tweedle", - Duration: infiniteTimeout, - ZeroDepth: false, - }) - if err != nil { - t.Fatalf("Create: %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Create: inconsistent state: %v", err) - } - - // Test a mismatch between name and condition. - _, err = m.Confirm(now, "/tweedle/dee", "", Condition{Token: alice}) - if err != ErrConfirmationFailed { - t.Fatalf("Confirm (mismatch): got %v, want ErrConfirmationFailed", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Confirm (mismatch): inconsistent state: %v", err) - } - - // Test two names (that fall under the same lock) in the one Confirm call. - release, err := m.Confirm(now, "/tweedle/dee", "/tweedle/dum", Condition{Token: tweedle}) - if err != nil { - t.Fatalf("Confirm (twins): %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Confirm (twins): inconsistent state: %v", err) - } - release() - if err := m.consistent(); err != nil { - t.Fatalf("release (twins): inconsistent state: %v", err) - } - - // Test the same two names in overlapping Confirm / release calls. - releaseDee, err := m.Confirm(now, "/tweedle/dee", "", Condition{Token: tweedle}) - if err != nil { - t.Fatalf("Confirm (sequence #0): %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Confirm (sequence #0): inconsistent state: %v", err) - } - - _, err = m.Confirm(now, "/tweedle/dum", "", Condition{Token: tweedle}) - if err != ErrConfirmationFailed { - t.Fatalf("Confirm (sequence #1): got %v, want ErrConfirmationFailed", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Confirm (sequence #1): inconsistent state: %v", err) - } - - releaseDee() - if err := m.consistent(); err != nil { - t.Fatalf("release (sequence #2): inconsistent state: %v", err) - } - - releaseDum, err := m.Confirm(now, "/tweedle/dum", "", Condition{Token: tweedle}) - if err != nil { - t.Fatalf("Confirm (sequence #3): %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Confirm (sequence #3): inconsistent state: %v", err) - } - - // Test that you can't unlock a held lock. - err = m.Unlock(now, tweedle) - if err != ErrLocked { - t.Fatalf("Unlock (sequence #4): got %v, want ErrLocked", err) - } - - releaseDum() - if err := m.consistent(); err != nil { - t.Fatalf("release (sequence #5): inconsistent state: %v", err) - } - - err = m.Unlock(now, tweedle) - if err != nil { - t.Fatalf("Unlock (sequence #6): %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Unlock (sequence #6): inconsistent state: %v", err) - } -} - -func TestMemLSNonCanonicalRoot(t *testing.T) { - now := time.Unix(0, 0) - m := NewMemLS().(*memLS) - token, err := m.Create(now, LockDetails{ - Root: "/foo/./bar//", - Duration: 1 * time.Second, - }) - if err != nil { - t.Fatalf("Create: %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Create: inconsistent state: %v", err) - } - if err := m.Unlock(now, token); err != nil { - t.Fatalf("Unlock: %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Unlock: inconsistent state: %v", err) - } -} - -func TestMemLSExpiry(t *testing.T) { - m := NewMemLS().(*memLS) - testCases := []string{ - "setNow 0", - "create /a.5", - "want /a.5", - "create /c.6", - "want /a.5 /c.6", - "create /a/b.7", - "want /a.5 /a/b.7 /c.6", - "setNow 4", - "want /a.5 /a/b.7 /c.6", - "setNow 5", - "want /a/b.7 /c.6", - "setNow 6", - "want /a/b.7", - "setNow 7", - "want ", - "setNow 8", - "want ", - "create /a.12", - "create /b.13", - "create /c.15", - "create /a/d.16", - "want /a.12 /a/d.16 /b.13 /c.15", - "refresh /a.14", - "want /a.14 /a/d.16 /b.13 /c.15", - "setNow 12", - "want /a.14 /a/d.16 /b.13 /c.15", - "setNow 13", - "want /a.14 /a/d.16 /c.15", - "setNow 14", - "want /a/d.16 /c.15", - "refresh /a/d.20", - "refresh /c.20", - "want /a/d.20 /c.20", - "setNow 20", - "want ", - } - - tokens := map[string]string{} - zTime := time.Unix(0, 0) - now := zTime - for i, tc := range testCases { - j := strings.IndexByte(tc, ' ') - if j < 0 { - t.Fatalf("test case #%d %q: invalid command", i, tc) - } - op, arg := tc[:j], tc[j+1:] - switch op { - default: - t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) - - case "create", "refresh": - parts := strings.Split(arg, ".") - if len(parts) != 2 { - t.Fatalf("test case #%d %q: invalid create", i, tc) - } - root := parts[0] - d, err := strconv.Atoi(parts[1]) - if err != nil { - t.Fatalf("test case #%d %q: invalid duration", i, tc) - } - dur := time.Unix(0, 0).Add(time.Duration(d) * time.Second).Sub(now) - - switch op { - case "create": - token, err := m.Create(now, LockDetails{ - Root: root, - Duration: dur, - ZeroDepth: true, - }) - if err != nil { - t.Fatalf("test case #%d %q: Create: %v", i, tc, err) - } - tokens[root] = token - - case "refresh": - token := tokens[root] - if token == "" { - t.Fatalf("test case #%d %q: no token for %q", i, tc, root) - } - got, err := m.Refresh(now, token, dur) - if err != nil { - t.Fatalf("test case #%d %q: Refresh: %v", i, tc, err) - } - want := LockDetails{ - Root: root, - Duration: dur, - ZeroDepth: true, - } - if got != want { - t.Fatalf("test case #%d %q:\ngot %v\nwant %v", i, tc, got, want) - } - } - - case "setNow": - d, err := strconv.Atoi(arg) - if err != nil { - t.Fatalf("test case #%d %q: invalid duration", i, tc) - } - now = time.Unix(0, 0).Add(time.Duration(d) * time.Second) - - case "want": - m.mu.Lock() - m.collectExpiredNodes(now) - got := make([]string, 0, len(m.byToken)) - for _, n := range m.byToken { - got = append(got, fmt.Sprintf("%s.%d", - n.details.Root, n.expiry.Sub(zTime)/time.Second)) - } - m.mu.Unlock() - sort.Strings(got) - want := []string{} - if arg != "" { - want = strings.Split(arg, " ") - } - if !reflect.DeepEqual(got, want) { - t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, want) - } - } - - if err := m.consistent(); err != nil { - t.Fatalf("test case #%d %q: inconsistent state: %v", i, tc, err) - } - } -} - -func TestMemLS(t *testing.T) { - now := time.Unix(0, 0) - m := NewMemLS().(*memLS) - rng := rand.New(rand.NewSource(0)) - tokens := map[string]string{} - nConfirm, nCreate, nRefresh, nUnlock := 0, 0, 0, 0 - const N = 2000 - - for i := 0; i < N; i++ { - name := lockTestNames[rng.Intn(len(lockTestNames))] - duration := lockTestDurations[rng.Intn(len(lockTestDurations))] - confirmed, unlocked := false, false - - // If the name was already locked, we randomly confirm/release, refresh - // or unlock it. Otherwise, we create a lock. - token := tokens[name] - if token != "" { - switch rng.Intn(3) { - case 0: - confirmed = true - nConfirm++ - release, err := m.Confirm(now, name, "", Condition{Token: token}) - if err != nil { - t.Fatalf("iteration #%d: Confirm %q: %v", i, name, err) - } - if err := m.consistent(); err != nil { - t.Fatalf("iteration #%d: inconsistent state: %v", i, err) - } - release() - - case 1: - nRefresh++ - if _, err := m.Refresh(now, token, duration); err != nil { - t.Fatalf("iteration #%d: Refresh %q: %v", i, name, err) - } - - case 2: - unlocked = true - nUnlock++ - if err := m.Unlock(now, token); err != nil { - t.Fatalf("iteration #%d: Unlock %q: %v", i, name, err) - } - } - - } else { - nCreate++ - var err error - token, err = m.Create(now, LockDetails{ - Root: name, - Duration: duration, - ZeroDepth: lockTestZeroDepth(name), - }) - if err != nil { - t.Fatalf("iteration #%d: Create %q: %v", i, name, err) - } - } - - if !confirmed { - if duration == 0 || unlocked { - // A zero-duration lock should expire immediately and is - // effectively equivalent to being unlocked. - tokens[name] = "" - } else { - tokens[name] = token - } - } - - if err := m.consistent(); err != nil { - t.Fatalf("iteration #%d: inconsistent state: %v", i, err) - } - } - - if nConfirm < N/10 { - t.Fatalf("too few Confirm calls: got %d, want >= %d", nConfirm, N/10) - } - if nCreate < N/10 { - t.Fatalf("too few Create calls: got %d, want >= %d", nCreate, N/10) - } - if nRefresh < N/10 { - t.Fatalf("too few Refresh calls: got %d, want >= %d", nRefresh, N/10) - } - if nUnlock < N/10 { - t.Fatalf("too few Unlock calls: got %d, want >= %d", nUnlock, N/10) - } -} - -func (m *memLS) consistent() error { - m.mu.Lock() - defer m.mu.Unlock() - - // If m.byName is non-empty, then it must contain an entry for the root "/", - // and its refCount should equal the number of locked nodes. - if len(m.byName) > 0 { - n := m.byName["/"] - if n == nil { - return fmt.Errorf(`non-empty m.byName does not contain the root "/"`) - } - if n.refCount != len(m.byToken) { - return fmt.Errorf("root node refCount=%d, differs from len(m.byToken)=%d", n.refCount, len(m.byToken)) - } - } - - for name, n := range m.byName { - // The map keys should be consistent with the node's copy of the key. - if n.details.Root != name { - return fmt.Errorf("node name %q != byName map key %q", n.details.Root, name) - } - - // A name must be clean, and start with a "/". - if len(name) == 0 || name[0] != '/' { - return fmt.Errorf(`node name %q does not start with "/"`, name) - } - if name != path.Clean(name) { - return fmt.Errorf(`node name %q is not clean`, name) - } - - // A node's refCount should be positive. - if n.refCount <= 0 { - return fmt.Errorf("non-positive refCount for node at name %q", name) - } - - // A node's refCount should be the number of self-or-descendents that - // are locked (i.e. have a non-empty token). - var list []string - for name0, n0 := range m.byName { - // All of lockTestNames' name fragments are one byte long: '_', 'i' or 'z', - // so strings.HasPrefix is equivalent to self-or-descendent name match. - // We don't have to worry about "/foo/bar" being a false positive match - // for "/foo/b". - if strings.HasPrefix(name0, name) && n0.token != "" { - list = append(list, name0) - } - } - if n.refCount != len(list) { - sort.Strings(list) - return fmt.Errorf("node at name %q has refCount %d but locked self-or-descendents are %q (len=%d)", - name, n.refCount, list, len(list)) - } - - // A node n is in m.byToken if it has a non-empty token. - if n.token != "" { - if _, ok := m.byToken[n.token]; !ok { - return fmt.Errorf("node at name %q has token %q but not in m.byToken", name, n.token) - } - } - - // A node n is in m.byExpiry if it has a non-negative byExpiryIndex. - if n.byExpiryIndex >= 0 { - if n.byExpiryIndex >= len(m.byExpiry) { - return fmt.Errorf("node at name %q has byExpiryIndex %d but m.byExpiry has length %d", name, n.byExpiryIndex, len(m.byExpiry)) - } - if n != m.byExpiry[n.byExpiryIndex] { - return fmt.Errorf("node at name %q has byExpiryIndex %d but that indexes a different node", name, n.byExpiryIndex) - } - } - } - - for token, n := range m.byToken { - // The map keys should be consistent with the node's copy of the key. - if n.token != token { - return fmt.Errorf("node token %q != byToken map key %q", n.token, token) - } - - // Every node in m.byToken is in m.byName. - if _, ok := m.byName[n.details.Root]; !ok { - return fmt.Errorf("node at name %q in m.byToken but not in m.byName", n.details.Root) - } - } - - for i, n := range m.byExpiry { - // The slice indices should be consistent with the node's copy of the index. - if n.byExpiryIndex != i { - return fmt.Errorf("node byExpiryIndex %d != byExpiry slice index %d", n.byExpiryIndex, i) - } - - // Every node in m.byExpiry is in m.byName. - if _, ok := m.byName[n.details.Root]; !ok { - return fmt.Errorf("node at name %q in m.byExpiry but not in m.byName", n.details.Root) - } - - // No node in m.byExpiry should be held. - if n.held { - return fmt.Errorf("node at name %q in m.byExpiry is held", n.details.Root) - } - } - return nil -} - -func TestParseTimeout(t *testing.T) { - testCases := []struct { - s string - want time.Duration - wantErr error - }{{ - "", - infiniteTimeout, - nil, - }, { - "Infinite", - infiniteTimeout, - nil, - }, { - "Infinitesimal", - 0, - errInvalidTimeout, - }, { - "infinite", - 0, - errInvalidTimeout, - }, { - "Second-0", - 0 * time.Second, - nil, - }, { - "Second-123", - 123 * time.Second, - nil, - }, { - " Second-456 ", - 456 * time.Second, - nil, - }, { - "Second-4100000000", - 4100000000 * time.Second, - nil, - }, { - "junk", - 0, - errInvalidTimeout, - }, { - "Second-", - 0, - errInvalidTimeout, - }, { - "Second--1", - 0, - errInvalidTimeout, - }, { - "Second--123", - 0, - errInvalidTimeout, - }, { - "Second-+123", - 0, - errInvalidTimeout, - }, { - "Second-0x123", - 0, - errInvalidTimeout, - }, { - "second-123", - 0, - errInvalidTimeout, - }, { - "Second-4294967295", - 4294967295 * time.Second, - nil, - }, { - // Section 10.7 says that "The timeout value for TimeType "Second" - // must not be greater than 2^32-1." - "Second-4294967296", - 0, - errInvalidTimeout, - }, { - // This test case comes from section 9.10.9 of the spec. It says, - // - // "In this request, the client has specified that it desires an - // infinite-length lock, if available, otherwise a timeout of 4.1 - // billion seconds, if available." - // - // The Go WebDAV package always supports infinite length locks, - // and ignores the fallback after the comma. - "Infinite, Second-4100000000", - infiniteTimeout, - nil, - }} - - for _, tc := range testCases { - got, gotErr := parseTimeout(tc.s) - if got != tc.want || gotErr != tc.wantErr { - t.Errorf("parsing %q:\ngot %v, %v\nwant %v, %v", tc.s, got, gotErr, tc.want, tc.wantErr) - } - } -} diff --git a/vendor/golang.org/x/net/webdav/prop.go b/vendor/golang.org/x/net/webdav/prop.go deleted file mode 100644 index e36a3b31d..000000000 --- a/vendor/golang.org/x/net/webdav/prop.go +++ /dev/null @@ -1,418 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "bytes" - "encoding/xml" - "fmt" - "io" - "mime" - "net/http" - "os" - "path/filepath" - "strconv" - - "golang.org/x/net/context" -) - -// Proppatch describes a property update instruction as defined in RFC 4918. -// See http://www.webdav.org/specs/rfc4918.html#METHOD_PROPPATCH -type Proppatch struct { - // Remove specifies whether this patch removes properties. If it does not - // remove them, it sets them. - Remove bool - // Props contains the properties to be set or removed. - Props []Property -} - -// Propstat describes a XML propstat element as defined in RFC 4918. -// See http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat -type Propstat struct { - // Props contains the properties for which Status applies. - Props []Property - - // Status defines the HTTP status code of the properties in Prop. - // Allowed values include, but are not limited to the WebDAV status - // code extensions for HTTP/1.1. - // http://www.webdav.org/specs/rfc4918.html#status.code.extensions.to.http11 - Status int - - // XMLError contains the XML representation of the optional error element. - // XML content within this field must not rely on any predefined - // namespace declarations or prefixes. If empty, the XML error element - // is omitted. - XMLError string - - // ResponseDescription contains the contents of the optional - // responsedescription field. If empty, the XML element is omitted. - ResponseDescription string -} - -// makePropstats returns a slice containing those of x and y whose Props slice -// is non-empty. If both are empty, it returns a slice containing an otherwise -// zero Propstat whose HTTP status code is 200 OK. -func makePropstats(x, y Propstat) []Propstat { - pstats := make([]Propstat, 0, 2) - if len(x.Props) != 0 { - pstats = append(pstats, x) - } - if len(y.Props) != 0 { - pstats = append(pstats, y) - } - if len(pstats) == 0 { - pstats = append(pstats, Propstat{ - Status: http.StatusOK, - }) - } - return pstats -} - -// DeadPropsHolder holds the dead properties of a resource. -// -// Dead properties are those properties that are explicitly defined. In -// comparison, live properties, such as DAV:getcontentlength, are implicitly -// defined by the underlying resource, and cannot be explicitly overridden or -// removed. See the Terminology section of -// http://www.webdav.org/specs/rfc4918.html#rfc.section.3 -// -// There is a whitelist of the names of live properties. This package handles -// all live properties, and will only pass non-whitelisted names to the Patch -// method of DeadPropsHolder implementations. -type DeadPropsHolder interface { - // DeadProps returns a copy of the dead properties held. - DeadProps() (map[xml.Name]Property, error) - - // Patch patches the dead properties held. - // - // Patching is atomic; either all or no patches succeed. It returns (nil, - // non-nil) if an internal server error occurred, otherwise the Propstats - // collectively contain one Property for each proposed patch Property. If - // all patches succeed, Patch returns a slice of length one and a Propstat - // element with a 200 OK HTTP status code. If none succeed, for reasons - // other than an internal server error, no Propstat has status 200 OK. - // - // For more details on when various HTTP status codes apply, see - // http://www.webdav.org/specs/rfc4918.html#PROPPATCH-status - Patch([]Proppatch) ([]Propstat, error) -} - -// liveProps contains all supported, protected DAV: properties. -var liveProps = map[xml.Name]struct { - // findFn implements the propfind function of this property. If nil, - // it indicates a hidden property. - findFn func(context.Context, FileSystem, LockSystem, string, os.FileInfo) (string, error) - // dir is true if the property applies to directories. - dir bool -}{ - {Space: "DAV:", Local: "resourcetype"}: { - findFn: findResourceType, - dir: true, - }, - {Space: "DAV:", Local: "displayname"}: { - findFn: findDisplayName, - dir: true, - }, - {Space: "DAV:", Local: "getcontentlength"}: { - findFn: findContentLength, - dir: false, - }, - {Space: "DAV:", Local: "getlastmodified"}: { - findFn: findLastModified, - // http://webdav.org/specs/rfc4918.html#PROPERTY_getlastmodified - // suggests that getlastmodified should only apply to GETable - // resources, and this package does not support GET on directories. - // - // Nonetheless, some WebDAV clients expect child directories to be - // sortable by getlastmodified date, so this value is true, not false. - // See golang.org/issue/15334. - dir: true, - }, - {Space: "DAV:", Local: "creationdate"}: { - findFn: nil, - dir: false, - }, - {Space: "DAV:", Local: "getcontentlanguage"}: { - findFn: nil, - dir: false, - }, - {Space: "DAV:", Local: "getcontenttype"}: { - findFn: findContentType, - dir: false, - }, - {Space: "DAV:", Local: "getetag"}: { - findFn: findETag, - // findETag implements ETag as the concatenated hex values of a file's - // modification time and size. This is not a reliable synchronization - // mechanism for directories, so we do not advertise getetag for DAV - // collections. - dir: false, - }, - - // TODO: The lockdiscovery property requires LockSystem to list the - // active locks on a resource. - {Space: "DAV:", Local: "lockdiscovery"}: {}, - {Space: "DAV:", Local: "supportedlock"}: { - findFn: findSupportedLock, - dir: true, - }, -} - -// TODO(nigeltao) merge props and allprop? - -// Props returns the status of the properties named pnames for resource name. -// -// Each Propstat has a unique status and each property name will only be part -// of one Propstat element. -func props(ctx context.Context, fs FileSystem, ls LockSystem, name string, pnames []xml.Name) ([]Propstat, error) { - f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) - if err != nil { - return nil, err - } - defer f.Close() - fi, err := f.Stat() - if err != nil { - return nil, err - } - isDir := fi.IsDir() - - var deadProps map[xml.Name]Property - if dph, ok := f.(DeadPropsHolder); ok { - deadProps, err = dph.DeadProps() - if err != nil { - return nil, err - } - } - - pstatOK := Propstat{Status: http.StatusOK} - pstatNotFound := Propstat{Status: http.StatusNotFound} - for _, pn := range pnames { - // If this file has dead properties, check if they contain pn. - if dp, ok := deadProps[pn]; ok { - pstatOK.Props = append(pstatOK.Props, dp) - continue - } - // Otherwise, it must either be a live property or we don't know it. - if prop := liveProps[pn]; prop.findFn != nil && (prop.dir || !isDir) { - innerXML, err := prop.findFn(ctx, fs, ls, name, fi) - if err != nil { - return nil, err - } - pstatOK.Props = append(pstatOK.Props, Property{ - XMLName: pn, - InnerXML: []byte(innerXML), - }) - } else { - pstatNotFound.Props = append(pstatNotFound.Props, Property{ - XMLName: pn, - }) - } - } - return makePropstats(pstatOK, pstatNotFound), nil -} - -// Propnames returns the property names defined for resource name. -func propnames(ctx context.Context, fs FileSystem, ls LockSystem, name string) ([]xml.Name, error) { - f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) - if err != nil { - return nil, err - } - defer f.Close() - fi, err := f.Stat() - if err != nil { - return nil, err - } - isDir := fi.IsDir() - - var deadProps map[xml.Name]Property - if dph, ok := f.(DeadPropsHolder); ok { - deadProps, err = dph.DeadProps() - if err != nil { - return nil, err - } - } - - pnames := make([]xml.Name, 0, len(liveProps)+len(deadProps)) - for pn, prop := range liveProps { - if prop.findFn != nil && (prop.dir || !isDir) { - pnames = append(pnames, pn) - } - } - for pn := range deadProps { - pnames = append(pnames, pn) - } - return pnames, nil -} - -// Allprop returns the properties defined for resource name and the properties -// named in include. -// -// Note that RFC 4918 defines 'allprop' to return the DAV: properties defined -// within the RFC plus dead properties. Other live properties should only be -// returned if they are named in 'include'. -// -// See http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND -func allprop(ctx context.Context, fs FileSystem, ls LockSystem, name string, include []xml.Name) ([]Propstat, error) { - pnames, err := propnames(ctx, fs, ls, name) - if err != nil { - return nil, err - } - // Add names from include if they are not already covered in pnames. - nameset := make(map[xml.Name]bool) - for _, pn := range pnames { - nameset[pn] = true - } - for _, pn := range include { - if !nameset[pn] { - pnames = append(pnames, pn) - } - } - return props(ctx, fs, ls, name, pnames) -} - -// Patch patches the properties of resource name. The return values are -// constrained in the same manner as DeadPropsHolder.Patch. -func patch(ctx context.Context, fs FileSystem, ls LockSystem, name string, patches []Proppatch) ([]Propstat, error) { - conflict := false -loop: - for _, patch := range patches { - for _, p := range patch.Props { - if _, ok := liveProps[p.XMLName]; ok { - conflict = true - break loop - } - } - } - if conflict { - pstatForbidden := Propstat{ - Status: http.StatusForbidden, - XMLError: ``, - } - pstatFailedDep := Propstat{ - Status: StatusFailedDependency, - } - for _, patch := range patches { - for _, p := range patch.Props { - if _, ok := liveProps[p.XMLName]; ok { - pstatForbidden.Props = append(pstatForbidden.Props, Property{XMLName: p.XMLName}) - } else { - pstatFailedDep.Props = append(pstatFailedDep.Props, Property{XMLName: p.XMLName}) - } - } - } - return makePropstats(pstatForbidden, pstatFailedDep), nil - } - - f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0) - if err != nil { - return nil, err - } - defer f.Close() - if dph, ok := f.(DeadPropsHolder); ok { - ret, err := dph.Patch(patches) - if err != nil { - return nil, err - } - // http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat says that - // "The contents of the prop XML element must only list the names of - // properties to which the result in the status element applies." - for _, pstat := range ret { - for i, p := range pstat.Props { - pstat.Props[i] = Property{XMLName: p.XMLName} - } - } - return ret, nil - } - // The file doesn't implement the optional DeadPropsHolder interface, so - // all patches are forbidden. - pstat := Propstat{Status: http.StatusForbidden} - for _, patch := range patches { - for _, p := range patch.Props { - pstat.Props = append(pstat.Props, Property{XMLName: p.XMLName}) - } - } - return []Propstat{pstat}, nil -} - -func escapeXML(s string) string { - for i := 0; i < len(s); i++ { - // As an optimization, if s contains only ASCII letters, digits or a - // few special characters, the escaped value is s itself and we don't - // need to allocate a buffer and convert between string and []byte. - switch c := s[i]; { - case c == ' ' || c == '_' || - ('+' <= c && c <= '9') || // Digits as well as + , - . and / - ('A' <= c && c <= 'Z') || - ('a' <= c && c <= 'z'): - continue - } - // Otherwise, go through the full escaping process. - var buf bytes.Buffer - xml.EscapeText(&buf, []byte(s)) - return buf.String() - } - return s -} - -func findResourceType(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - if fi.IsDir() { - return ``, nil - } - return "", nil -} - -func findDisplayName(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - if slashClean(name) == "/" { - // Hide the real name of a possibly prefixed root directory. - return "", nil - } - return escapeXML(fi.Name()), nil -} - -func findContentLength(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - return strconv.FormatInt(fi.Size(), 10), nil -} - -func findLastModified(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - return fi.ModTime().Format(http.TimeFormat), nil -} - -func findContentType(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) - if err != nil { - return "", err - } - defer f.Close() - // This implementation is based on serveContent's code in the standard net/http package. - ctype := mime.TypeByExtension(filepath.Ext(name)) - if ctype != "" { - return ctype, nil - } - // Read a chunk to decide between utf-8 text and binary. - var buf [512]byte - n, err := io.ReadFull(f, buf[:]) - if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { - return "", err - } - ctype = http.DetectContentType(buf[:n]) - // Rewind file. - _, err = f.Seek(0, os.SEEK_SET) - return ctype, err -} - -func findETag(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - // The Apache http 2.4 web server by default concatenates the - // modification time and size of a file. We replicate the heuristic - // with nanosecond granularity. - return fmt.Sprintf(`"%x%x"`, fi.ModTime().UnixNano(), fi.Size()), nil -} - -func findSupportedLock(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - return `` + - `` + - `` + - `` + - ``, nil -} diff --git a/vendor/golang.org/x/net/webdav/prop_test.go b/vendor/golang.org/x/net/webdav/prop_test.go deleted file mode 100644 index 57d0e826f..000000000 --- a/vendor/golang.org/x/net/webdav/prop_test.go +++ /dev/null @@ -1,613 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "encoding/xml" - "fmt" - "net/http" - "os" - "reflect" - "sort" - "testing" - - "golang.org/x/net/context" -) - -func TestMemPS(t *testing.T) { - ctx := context.Background() - // calcProps calculates the getlastmodified and getetag DAV: property - // values in pstats for resource name in file-system fs. - calcProps := func(name string, fs FileSystem, ls LockSystem, pstats []Propstat) error { - fi, err := fs.Stat(ctx, name) - if err != nil { - return err - } - for _, pst := range pstats { - for i, p := range pst.Props { - switch p.XMLName { - case xml.Name{Space: "DAV:", Local: "getlastmodified"}: - p.InnerXML = []byte(fi.ModTime().Format(http.TimeFormat)) - pst.Props[i] = p - case xml.Name{Space: "DAV:", Local: "getetag"}: - if fi.IsDir() { - continue - } - etag, err := findETag(ctx, fs, ls, name, fi) - if err != nil { - return err - } - p.InnerXML = []byte(etag) - pst.Props[i] = p - } - } - } - return nil - } - - const ( - lockEntry = `` + - `` + - `` + - `` + - `` - statForbiddenError = `` - ) - - type propOp struct { - op string - name string - pnames []xml.Name - patches []Proppatch - wantPnames []xml.Name - wantPropstats []Propstat - } - - testCases := []struct { - desc string - noDeadProps bool - buildfs []string - propOp []propOp - }{{ - desc: "propname", - buildfs: []string{"mkdir /dir", "touch /file"}, - propOp: []propOp{{ - op: "propname", - name: "/dir", - wantPnames: []xml.Name{ - {Space: "DAV:", Local: "resourcetype"}, - {Space: "DAV:", Local: "displayname"}, - {Space: "DAV:", Local: "supportedlock"}, - {Space: "DAV:", Local: "getlastmodified"}, - }, - }, { - op: "propname", - name: "/file", - wantPnames: []xml.Name{ - {Space: "DAV:", Local: "resourcetype"}, - {Space: "DAV:", Local: "displayname"}, - {Space: "DAV:", Local: "getcontentlength"}, - {Space: "DAV:", Local: "getlastmodified"}, - {Space: "DAV:", Local: "getcontenttype"}, - {Space: "DAV:", Local: "getetag"}, - {Space: "DAV:", Local: "supportedlock"}, - }, - }}, - }, { - desc: "allprop dir and file", - buildfs: []string{"mkdir /dir", "write /file foobarbaz"}, - propOp: []propOp{{ - op: "allprop", - name: "/dir", - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, - InnerXML: []byte(``), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, - InnerXML: []byte("dir"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, - InnerXML: nil, // Calculated during test. - }, { - XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, - InnerXML: []byte(lockEntry), - }}, - }}, - }, { - op: "allprop", - name: "/file", - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, - InnerXML: []byte(""), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, - InnerXML: []byte("file"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getcontentlength"}, - InnerXML: []byte("9"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, - InnerXML: nil, // Calculated during test. - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getcontenttype"}, - InnerXML: []byte("text/plain; charset=utf-8"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - InnerXML: nil, // Calculated during test. - }, { - XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, - InnerXML: []byte(lockEntry), - }}, - }}, - }, { - op: "allprop", - name: "/file", - pnames: []xml.Name{ - {"DAV:", "resourcetype"}, - {"foo", "bar"}, - }, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, - InnerXML: []byte(""), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, - InnerXML: []byte("file"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getcontentlength"}, - InnerXML: []byte("9"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, - InnerXML: nil, // Calculated during test. - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getcontenttype"}, - InnerXML: []byte("text/plain; charset=utf-8"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - InnerXML: nil, // Calculated during test. - }, { - XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, - InnerXML: []byte(lockEntry), - }}}, { - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}}, - }, - }}, - }, { - desc: "propfind DAV:resourcetype", - buildfs: []string{"mkdir /dir", "touch /file"}, - propOp: []propOp{{ - op: "propfind", - name: "/dir", - pnames: []xml.Name{{"DAV:", "resourcetype"}}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, - InnerXML: []byte(``), - }}, - }}, - }, { - op: "propfind", - name: "/file", - pnames: []xml.Name{{"DAV:", "resourcetype"}}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, - InnerXML: []byte(""), - }}, - }}, - }}, - }, { - desc: "propfind unsupported DAV properties", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "propfind", - name: "/dir", - pnames: []xml.Name{{"DAV:", "getcontentlanguage"}}, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "getcontentlanguage"}, - }}, - }}, - }, { - op: "propfind", - name: "/dir", - pnames: []xml.Name{{"DAV:", "creationdate"}}, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "creationdate"}, - }}, - }}, - }}, - }, { - desc: "propfind getetag for files but not for directories", - buildfs: []string{"mkdir /dir", "touch /file"}, - propOp: []propOp{{ - op: "propfind", - name: "/dir", - pnames: []xml.Name{{"DAV:", "getetag"}}, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - }}, - }}, - }, { - op: "propfind", - name: "/file", - pnames: []xml.Name{{"DAV:", "getetag"}}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - InnerXML: nil, // Calculated during test. - }}, - }}, - }}, - }, { - desc: "proppatch property on no-dead-properties file system", - buildfs: []string{"mkdir /dir"}, - noDeadProps: true, - propOp: []propOp{{ - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusForbidden, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }, { - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusForbidden, - XMLError: statForbiddenError, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - }}, - }}, - }}, - }, { - desc: "proppatch dead property", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }, { - op: "propfind", - name: "/dir", - pnames: []xml.Name{{Space: "foo", Local: "bar"}}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }}, - }}, - }}, - }, { - desc: "proppatch dead property with failed dependency", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }}, - }, { - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, - InnerXML: []byte("xxx"), - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusForbidden, - XMLError: statForbiddenError, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, - }}, - }, { - Status: StatusFailedDependency, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }, { - op: "propfind", - name: "/dir", - pnames: []xml.Name{{Space: "foo", Local: "bar"}}, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }}, - }, { - desc: "proppatch remove dead property", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }, { - XMLName: xml.Name{Space: "spam", Local: "ham"}, - InnerXML: []byte("eggs"), - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }, { - XMLName: xml.Name{Space: "spam", Local: "ham"}, - }}, - }}, - }, { - op: "propfind", - name: "/dir", - pnames: []xml.Name{ - {Space: "foo", Local: "bar"}, - {Space: "spam", Local: "ham"}, - }, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }, { - XMLName: xml.Name{Space: "spam", Local: "ham"}, - InnerXML: []byte("eggs"), - }}, - }}, - }, { - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Remove: true, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }, { - op: "propfind", - name: "/dir", - pnames: []xml.Name{ - {Space: "foo", Local: "bar"}, - {Space: "spam", Local: "ham"}, - }, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }, { - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "spam", Local: "ham"}, - InnerXML: []byte("eggs"), - }}, - }}, - }}, - }, { - desc: "propname with dead property", - buildfs: []string{"touch /file"}, - propOp: []propOp{{ - op: "proppatch", - name: "/file", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }, { - op: "propname", - name: "/file", - wantPnames: []xml.Name{ - {Space: "DAV:", Local: "resourcetype"}, - {Space: "DAV:", Local: "displayname"}, - {Space: "DAV:", Local: "getcontentlength"}, - {Space: "DAV:", Local: "getlastmodified"}, - {Space: "DAV:", Local: "getcontenttype"}, - {Space: "DAV:", Local: "getetag"}, - {Space: "DAV:", Local: "supportedlock"}, - {Space: "foo", Local: "bar"}, - }, - }}, - }, { - desc: "proppatch remove unknown dead property", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Remove: true, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }}, - }, { - desc: "bad: propfind unknown property", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "propfind", - name: "/dir", - pnames: []xml.Name{{"foo:", "bar"}}, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "foo:", Local: "bar"}, - }}, - }}, - }}, - }} - - for _, tc := range testCases { - fs, err := buildTestFS(tc.buildfs) - if err != nil { - t.Fatalf("%s: cannot create test filesystem: %v", tc.desc, err) - } - if tc.noDeadProps { - fs = noDeadPropsFS{fs} - } - ls := NewMemLS() - for _, op := range tc.propOp { - desc := fmt.Sprintf("%s: %s %s", tc.desc, op.op, op.name) - if err = calcProps(op.name, fs, ls, op.wantPropstats); err != nil { - t.Fatalf("%s: calcProps: %v", desc, err) - } - - // Call property system. - var propstats []Propstat - switch op.op { - case "propname": - pnames, err := propnames(ctx, fs, ls, op.name) - if err != nil { - t.Errorf("%s: got error %v, want nil", desc, err) - continue - } - sort.Sort(byXMLName(pnames)) - sort.Sort(byXMLName(op.wantPnames)) - if !reflect.DeepEqual(pnames, op.wantPnames) { - t.Errorf("%s: pnames\ngot %q\nwant %q", desc, pnames, op.wantPnames) - } - continue - case "allprop": - propstats, err = allprop(ctx, fs, ls, op.name, op.pnames) - case "propfind": - propstats, err = props(ctx, fs, ls, op.name, op.pnames) - case "proppatch": - propstats, err = patch(ctx, fs, ls, op.name, op.patches) - default: - t.Fatalf("%s: %s not implemented", desc, op.op) - } - if err != nil { - t.Errorf("%s: got error %v, want nil", desc, err) - continue - } - // Compare return values from allprop, propfind or proppatch. - for _, pst := range propstats { - sort.Sort(byPropname(pst.Props)) - } - for _, pst := range op.wantPropstats { - sort.Sort(byPropname(pst.Props)) - } - sort.Sort(byStatus(propstats)) - sort.Sort(byStatus(op.wantPropstats)) - if !reflect.DeepEqual(propstats, op.wantPropstats) { - t.Errorf("%s: propstat\ngot %q\nwant %q", desc, propstats, op.wantPropstats) - } - } - } -} - -func cmpXMLName(a, b xml.Name) bool { - if a.Space != b.Space { - return a.Space < b.Space - } - return a.Local < b.Local -} - -type byXMLName []xml.Name - -func (b byXMLName) Len() int { return len(b) } -func (b byXMLName) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b byXMLName) Less(i, j int) bool { return cmpXMLName(b[i], b[j]) } - -type byPropname []Property - -func (b byPropname) Len() int { return len(b) } -func (b byPropname) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b byPropname) Less(i, j int) bool { return cmpXMLName(b[i].XMLName, b[j].XMLName) } - -type byStatus []Propstat - -func (b byStatus) Len() int { return len(b) } -func (b byStatus) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b byStatus) Less(i, j int) bool { return b[i].Status < b[j].Status } - -type noDeadPropsFS struct { - FileSystem -} - -func (fs noDeadPropsFS) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { - f, err := fs.FileSystem.OpenFile(ctx, name, flag, perm) - if err != nil { - return nil, err - } - return noDeadPropsFile{f}, nil -} - -// noDeadPropsFile wraps a File but strips any optional DeadPropsHolder methods -// provided by the underlying File implementation. -type noDeadPropsFile struct { - f File -} - -func (f noDeadPropsFile) Close() error { return f.f.Close() } -func (f noDeadPropsFile) Read(p []byte) (int, error) { return f.f.Read(p) } -func (f noDeadPropsFile) Readdir(count int) ([]os.FileInfo, error) { return f.f.Readdir(count) } -func (f noDeadPropsFile) Seek(off int64, whence int) (int64, error) { return f.f.Seek(off, whence) } -func (f noDeadPropsFile) Stat() (os.FileInfo, error) { return f.f.Stat() } -func (f noDeadPropsFile) Write(p []byte) (int, error) { return f.f.Write(p) } diff --git a/vendor/golang.org/x/net/webdav/webdav.go b/vendor/golang.org/x/net/webdav/webdav.go deleted file mode 100644 index 7b56687fc..000000000 --- a/vendor/golang.org/x/net/webdav/webdav.go +++ /dev/null @@ -1,702 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package webdav provides a WebDAV server implementation. -package webdav // import "golang.org/x/net/webdav" - -import ( - "errors" - "fmt" - "io" - "net/http" - "net/url" - "os" - "path" - "strings" - "time" -) - -type Handler struct { - // Prefix is the URL path prefix to strip from WebDAV resource paths. - Prefix string - // FileSystem is the virtual file system. - FileSystem FileSystem - // LockSystem is the lock management system. - LockSystem LockSystem - // Logger is an optional error logger. If non-nil, it will be called - // for all HTTP requests. - Logger func(*http.Request, error) -} - -func (h *Handler) stripPrefix(p string) (string, int, error) { - if h.Prefix == "" { - return p, http.StatusOK, nil - } - if r := strings.TrimPrefix(p, h.Prefix); len(r) < len(p) { - return r, http.StatusOK, nil - } - return p, http.StatusNotFound, errPrefixMismatch -} - -func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - status, err := http.StatusBadRequest, errUnsupportedMethod - if h.FileSystem == nil { - status, err = http.StatusInternalServerError, errNoFileSystem - } else if h.LockSystem == nil { - status, err = http.StatusInternalServerError, errNoLockSystem - } else { - switch r.Method { - case "OPTIONS": - status, err = h.handleOptions(w, r) - case "GET", "HEAD", "POST": - status, err = h.handleGetHeadPost(w, r) - case "DELETE": - status, err = h.handleDelete(w, r) - case "PUT": - status, err = h.handlePut(w, r) - case "MKCOL": - status, err = h.handleMkcol(w, r) - case "COPY", "MOVE": - status, err = h.handleCopyMove(w, r) - case "LOCK": - status, err = h.handleLock(w, r) - case "UNLOCK": - status, err = h.handleUnlock(w, r) - case "PROPFIND": - status, err = h.handlePropfind(w, r) - case "PROPPATCH": - status, err = h.handleProppatch(w, r) - } - } - - if status != 0 { - w.WriteHeader(status) - if status != http.StatusNoContent { - w.Write([]byte(StatusText(status))) - } - } - if h.Logger != nil { - h.Logger(r, err) - } -} - -func (h *Handler) lock(now time.Time, root string) (token string, status int, err error) { - token, err = h.LockSystem.Create(now, LockDetails{ - Root: root, - Duration: infiniteTimeout, - ZeroDepth: true, - }) - if err != nil { - if err == ErrLocked { - return "", StatusLocked, err - } - return "", http.StatusInternalServerError, err - } - return token, 0, nil -} - -func (h *Handler) confirmLocks(r *http.Request, src, dst string) (release func(), status int, err error) { - hdr := r.Header.Get("If") - if hdr == "" { - // An empty If header means that the client hasn't previously created locks. - // Even if this client doesn't care about locks, we still need to check that - // the resources aren't locked by another client, so we create temporary - // locks that would conflict with another client's locks. These temporary - // locks are unlocked at the end of the HTTP request. - now, srcToken, dstToken := time.Now(), "", "" - if src != "" { - srcToken, status, err = h.lock(now, src) - if err != nil { - return nil, status, err - } - } - if dst != "" { - dstToken, status, err = h.lock(now, dst) - if err != nil { - if srcToken != "" { - h.LockSystem.Unlock(now, srcToken) - } - return nil, status, err - } - } - - return func() { - if dstToken != "" { - h.LockSystem.Unlock(now, dstToken) - } - if srcToken != "" { - h.LockSystem.Unlock(now, srcToken) - } - }, 0, nil - } - - ih, ok := parseIfHeader(hdr) - if !ok { - return nil, http.StatusBadRequest, errInvalidIfHeader - } - // ih is a disjunction (OR) of ifLists, so any ifList will do. - for _, l := range ih.lists { - lsrc := l.resourceTag - if lsrc == "" { - lsrc = src - } else { - u, err := url.Parse(lsrc) - if err != nil { - continue - } - if u.Host != r.Host { - continue - } - lsrc, status, err = h.stripPrefix(u.Path) - if err != nil { - return nil, status, err - } - } - release, err = h.LockSystem.Confirm(time.Now(), lsrc, dst, l.conditions...) - if err == ErrConfirmationFailed { - continue - } - if err != nil { - return nil, http.StatusInternalServerError, err - } - return release, 0, nil - } - // Section 10.4.1 says that "If this header is evaluated and all state lists - // fail, then the request must fail with a 412 (Precondition Failed) status." - // We follow the spec even though the cond_put_corrupt_token test case from - // the litmus test warns on seeing a 412 instead of a 423 (Locked). - return nil, http.StatusPreconditionFailed, ErrLocked -} - -func (h *Handler) handleOptions(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - ctx := getContext(r) - allow := "OPTIONS, LOCK, PUT, MKCOL" - if fi, err := h.FileSystem.Stat(ctx, reqPath); err == nil { - if fi.IsDir() { - allow = "OPTIONS, LOCK, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND" - } else { - allow = "OPTIONS, LOCK, GET, HEAD, POST, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND, PUT" - } - } - w.Header().Set("Allow", allow) - // http://www.webdav.org/specs/rfc4918.html#dav.compliance.classes - w.Header().Set("DAV", "1, 2") - // http://msdn.microsoft.com/en-au/library/cc250217.aspx - w.Header().Set("MS-Author-Via", "DAV") - return 0, nil -} - -func (h *Handler) handleGetHeadPost(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - // TODO: check locks for read-only access?? - ctx := getContext(r) - f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDONLY, 0) - if err != nil { - return http.StatusNotFound, err - } - defer f.Close() - fi, err := f.Stat() - if err != nil { - return http.StatusNotFound, err - } - if fi.IsDir() { - return http.StatusMethodNotAllowed, nil - } - etag, err := findETag(ctx, h.FileSystem, h.LockSystem, reqPath, fi) - if err != nil { - return http.StatusInternalServerError, err - } - w.Header().Set("ETag", etag) - // Let ServeContent determine the Content-Type header. - http.ServeContent(w, r, reqPath, fi.ModTime(), f) - return 0, nil -} - -func (h *Handler) handleDelete(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - release, status, err := h.confirmLocks(r, reqPath, "") - if err != nil { - return status, err - } - defer release() - - ctx := getContext(r) - - // TODO: return MultiStatus where appropriate. - - // "godoc os RemoveAll" says that "If the path does not exist, RemoveAll - // returns nil (no error)." WebDAV semantics are that it should return a - // "404 Not Found". We therefore have to Stat before we RemoveAll. - if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { - if os.IsNotExist(err) { - return http.StatusNotFound, err - } - return http.StatusMethodNotAllowed, err - } - if err := h.FileSystem.RemoveAll(ctx, reqPath); err != nil { - return http.StatusMethodNotAllowed, err - } - return http.StatusNoContent, nil -} - -func (h *Handler) handlePut(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - release, status, err := h.confirmLocks(r, reqPath, "") - if err != nil { - return status, err - } - defer release() - // TODO(rost): Support the If-Match, If-None-Match headers? See bradfitz' - // comments in http.checkEtag. - ctx := getContext(r) - - f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - return http.StatusNotFound, err - } - _, copyErr := io.Copy(f, r.Body) - fi, statErr := f.Stat() - closeErr := f.Close() - // TODO(rost): Returning 405 Method Not Allowed might not be appropriate. - if copyErr != nil { - return http.StatusMethodNotAllowed, copyErr - } - if statErr != nil { - return http.StatusMethodNotAllowed, statErr - } - if closeErr != nil { - return http.StatusMethodNotAllowed, closeErr - } - etag, err := findETag(ctx, h.FileSystem, h.LockSystem, reqPath, fi) - if err != nil { - return http.StatusInternalServerError, err - } - w.Header().Set("ETag", etag) - return http.StatusCreated, nil -} - -func (h *Handler) handleMkcol(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - release, status, err := h.confirmLocks(r, reqPath, "") - if err != nil { - return status, err - } - defer release() - - ctx := getContext(r) - - if r.ContentLength > 0 { - return http.StatusUnsupportedMediaType, nil - } - if err := h.FileSystem.Mkdir(ctx, reqPath, 0777); err != nil { - if os.IsNotExist(err) { - return http.StatusConflict, err - } - return http.StatusMethodNotAllowed, err - } - return http.StatusCreated, nil -} - -func (h *Handler) handleCopyMove(w http.ResponseWriter, r *http.Request) (status int, err error) { - hdr := r.Header.Get("Destination") - if hdr == "" { - return http.StatusBadRequest, errInvalidDestination - } - u, err := url.Parse(hdr) - if err != nil { - return http.StatusBadRequest, errInvalidDestination - } - if u.Host != r.Host { - return http.StatusBadGateway, errInvalidDestination - } - - src, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - - dst, status, err := h.stripPrefix(u.Path) - if err != nil { - return status, err - } - - if dst == "" { - return http.StatusBadGateway, errInvalidDestination - } - if dst == src { - return http.StatusForbidden, errDestinationEqualsSource - } - - ctx := getContext(r) - - if r.Method == "COPY" { - // Section 7.5.1 says that a COPY only needs to lock the destination, - // not both destination and source. Strictly speaking, this is racy, - // even though a COPY doesn't modify the source, if a concurrent - // operation modifies the source. However, the litmus test explicitly - // checks that COPYing a locked-by-another source is OK. - release, status, err := h.confirmLocks(r, "", dst) - if err != nil { - return status, err - } - defer release() - - // Section 9.8.3 says that "The COPY method on a collection without a Depth - // header must act as if a Depth header with value "infinity" was included". - depth := infiniteDepth - if hdr := r.Header.Get("Depth"); hdr != "" { - depth = parseDepth(hdr) - if depth != 0 && depth != infiniteDepth { - // Section 9.8.3 says that "A client may submit a Depth header on a - // COPY on a collection with a value of "0" or "infinity"." - return http.StatusBadRequest, errInvalidDepth - } - } - return copyFiles(ctx, h.FileSystem, src, dst, r.Header.Get("Overwrite") != "F", depth, 0) - } - - release, status, err := h.confirmLocks(r, src, dst) - if err != nil { - return status, err - } - defer release() - - // Section 9.9.2 says that "The MOVE method on a collection must act as if - // a "Depth: infinity" header was used on it. A client must not submit a - // Depth header on a MOVE on a collection with any value but "infinity"." - if hdr := r.Header.Get("Depth"); hdr != "" { - if parseDepth(hdr) != infiniteDepth { - return http.StatusBadRequest, errInvalidDepth - } - } - return moveFiles(ctx, h.FileSystem, src, dst, r.Header.Get("Overwrite") == "T") -} - -func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus int, retErr error) { - duration, err := parseTimeout(r.Header.Get("Timeout")) - if err != nil { - return http.StatusBadRequest, err - } - li, status, err := readLockInfo(r.Body) - if err != nil { - return status, err - } - - ctx := getContext(r) - token, ld, now, created := "", LockDetails{}, time.Now(), false - if li == (lockInfo{}) { - // An empty lockInfo means to refresh the lock. - ih, ok := parseIfHeader(r.Header.Get("If")) - if !ok { - return http.StatusBadRequest, errInvalidIfHeader - } - if len(ih.lists) == 1 && len(ih.lists[0].conditions) == 1 { - token = ih.lists[0].conditions[0].Token - } - if token == "" { - return http.StatusBadRequest, errInvalidLockToken - } - ld, err = h.LockSystem.Refresh(now, token, duration) - if err != nil { - if err == ErrNoSuchLock { - return http.StatusPreconditionFailed, err - } - return http.StatusInternalServerError, err - } - - } else { - // Section 9.10.3 says that "If no Depth header is submitted on a LOCK request, - // then the request MUST act as if a "Depth:infinity" had been submitted." - depth := infiniteDepth - if hdr := r.Header.Get("Depth"); hdr != "" { - depth = parseDepth(hdr) - if depth != 0 && depth != infiniteDepth { - // Section 9.10.3 says that "Values other than 0 or infinity must not be - // used with the Depth header on a LOCK method". - return http.StatusBadRequest, errInvalidDepth - } - } - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - ld = LockDetails{ - Root: reqPath, - Duration: duration, - OwnerXML: li.Owner.InnerXML, - ZeroDepth: depth == 0, - } - token, err = h.LockSystem.Create(now, ld) - if err != nil { - if err == ErrLocked { - return StatusLocked, err - } - return http.StatusInternalServerError, err - } - defer func() { - if retErr != nil { - h.LockSystem.Unlock(now, token) - } - }() - - // Create the resource if it didn't previously exist. - if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { - f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - // TODO: detect missing intermediate dirs and return http.StatusConflict? - return http.StatusInternalServerError, err - } - f.Close() - created = true - } - - // http://www.webdav.org/specs/rfc4918.html#HEADER_Lock-Token says that the - // Lock-Token value is a Coded-URL. We add angle brackets. - w.Header().Set("Lock-Token", "<"+token+">") - } - - w.Header().Set("Content-Type", "application/xml; charset=utf-8") - if created { - // This is "w.WriteHeader(http.StatusCreated)" and not "return - // http.StatusCreated, nil" because we write our own (XML) response to w - // and Handler.ServeHTTP would otherwise write "Created". - w.WriteHeader(http.StatusCreated) - } - writeLockInfo(w, token, ld) - return 0, nil -} - -func (h *Handler) handleUnlock(w http.ResponseWriter, r *http.Request) (status int, err error) { - // http://www.webdav.org/specs/rfc4918.html#HEADER_Lock-Token says that the - // Lock-Token value is a Coded-URL. We strip its angle brackets. - t := r.Header.Get("Lock-Token") - if len(t) < 2 || t[0] != '<' || t[len(t)-1] != '>' { - return http.StatusBadRequest, errInvalidLockToken - } - t = t[1 : len(t)-1] - - switch err = h.LockSystem.Unlock(time.Now(), t); err { - case nil: - return http.StatusNoContent, err - case ErrForbidden: - return http.StatusForbidden, err - case ErrLocked: - return StatusLocked, err - case ErrNoSuchLock: - return http.StatusConflict, err - default: - return http.StatusInternalServerError, err - } -} - -func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - ctx := getContext(r) - fi, err := h.FileSystem.Stat(ctx, reqPath) - if err != nil { - if os.IsNotExist(err) { - return http.StatusNotFound, err - } - return http.StatusMethodNotAllowed, err - } - depth := infiniteDepth - if hdr := r.Header.Get("Depth"); hdr != "" { - depth = parseDepth(hdr) - if depth == invalidDepth { - return http.StatusBadRequest, errInvalidDepth - } - } - pf, status, err := readPropfind(r.Body) - if err != nil { - return status, err - } - - mw := multistatusWriter{w: w} - - walkFn := func(reqPath string, info os.FileInfo, err error) error { - if err != nil { - return err - } - var pstats []Propstat - if pf.Propname != nil { - pnames, err := propnames(ctx, h.FileSystem, h.LockSystem, reqPath) - if err != nil { - return err - } - pstat := Propstat{Status: http.StatusOK} - for _, xmlname := range pnames { - pstat.Props = append(pstat.Props, Property{XMLName: xmlname}) - } - pstats = append(pstats, pstat) - } else if pf.Allprop != nil { - pstats, err = allprop(ctx, h.FileSystem, h.LockSystem, reqPath, pf.Prop) - } else { - pstats, err = props(ctx, h.FileSystem, h.LockSystem, reqPath, pf.Prop) - } - if err != nil { - return err - } - return mw.write(makePropstatResponse(path.Join(h.Prefix, reqPath), pstats)) - } - - walkErr := walkFS(ctx, h.FileSystem, depth, reqPath, fi, walkFn) - closeErr := mw.close() - if walkErr != nil { - return http.StatusInternalServerError, walkErr - } - if closeErr != nil { - return http.StatusInternalServerError, closeErr - } - return 0, nil -} - -func (h *Handler) handleProppatch(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - release, status, err := h.confirmLocks(r, reqPath, "") - if err != nil { - return status, err - } - defer release() - - ctx := getContext(r) - - if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { - if os.IsNotExist(err) { - return http.StatusNotFound, err - } - return http.StatusMethodNotAllowed, err - } - patches, status, err := readProppatch(r.Body) - if err != nil { - return status, err - } - pstats, err := patch(ctx, h.FileSystem, h.LockSystem, reqPath, patches) - if err != nil { - return http.StatusInternalServerError, err - } - mw := multistatusWriter{w: w} - writeErr := mw.write(makePropstatResponse(r.URL.Path, pstats)) - closeErr := mw.close() - if writeErr != nil { - return http.StatusInternalServerError, writeErr - } - if closeErr != nil { - return http.StatusInternalServerError, closeErr - } - return 0, nil -} - -func makePropstatResponse(href string, pstats []Propstat) *response { - resp := response{ - Href: []string{(&url.URL{Path: href}).EscapedPath()}, - Propstat: make([]propstat, 0, len(pstats)), - } - for _, p := range pstats { - var xmlErr *xmlError - if p.XMLError != "" { - xmlErr = &xmlError{InnerXML: []byte(p.XMLError)} - } - resp.Propstat = append(resp.Propstat, propstat{ - Status: fmt.Sprintf("HTTP/1.1 %d %s", p.Status, StatusText(p.Status)), - Prop: p.Props, - ResponseDescription: p.ResponseDescription, - Error: xmlErr, - }) - } - return &resp -} - -const ( - infiniteDepth = -1 - invalidDepth = -2 -) - -// parseDepth maps the strings "0", "1" and "infinity" to 0, 1 and -// infiniteDepth. Parsing any other string returns invalidDepth. -// -// Different WebDAV methods have further constraints on valid depths: -// - PROPFIND has no further restrictions, as per section 9.1. -// - COPY accepts only "0" or "infinity", as per section 9.8.3. -// - MOVE accepts only "infinity", as per section 9.9.2. -// - LOCK accepts only "0" or "infinity", as per section 9.10.3. -// These constraints are enforced by the handleXxx methods. -func parseDepth(s string) int { - switch s { - case "0": - return 0 - case "1": - return 1 - case "infinity": - return infiniteDepth - } - return invalidDepth -} - -// http://www.webdav.org/specs/rfc4918.html#status.code.extensions.to.http11 -const ( - StatusMulti = 207 - StatusUnprocessableEntity = 422 - StatusLocked = 423 - StatusFailedDependency = 424 - StatusInsufficientStorage = 507 -) - -func StatusText(code int) string { - switch code { - case StatusMulti: - return "Multi-Status" - case StatusUnprocessableEntity: - return "Unprocessable Entity" - case StatusLocked: - return "Locked" - case StatusFailedDependency: - return "Failed Dependency" - case StatusInsufficientStorage: - return "Insufficient Storage" - } - return http.StatusText(code) -} - -var ( - errDestinationEqualsSource = errors.New("webdav: destination equals source") - errDirectoryNotEmpty = errors.New("webdav: directory not empty") - errInvalidDepth = errors.New("webdav: invalid depth") - errInvalidDestination = errors.New("webdav: invalid destination") - errInvalidIfHeader = errors.New("webdav: invalid If header") - errInvalidLockInfo = errors.New("webdav: invalid lock info") - errInvalidLockToken = errors.New("webdav: invalid lock token") - errInvalidPropfind = errors.New("webdav: invalid propfind") - errInvalidProppatch = errors.New("webdav: invalid proppatch") - errInvalidResponse = errors.New("webdav: invalid response") - errInvalidTimeout = errors.New("webdav: invalid timeout") - errNoFileSystem = errors.New("webdav: no file system") - errNoLockSystem = errors.New("webdav: no lock system") - errNotADirectory = errors.New("webdav: not a directory") - errPrefixMismatch = errors.New("webdav: prefix mismatch") - errRecursionTooDeep = errors.New("webdav: recursion too deep") - errUnsupportedLockInfo = errors.New("webdav: unsupported lock info") - errUnsupportedMethod = errors.New("webdav: unsupported method") -) diff --git a/vendor/golang.org/x/net/webdav/webdav_test.go b/vendor/golang.org/x/net/webdav/webdav_test.go deleted file mode 100644 index 25e0d5421..000000000 --- a/vendor/golang.org/x/net/webdav/webdav_test.go +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "os" - "reflect" - "regexp" - "sort" - "strings" - "testing" - - "golang.org/x/net/context" -) - -// TODO: add tests to check XML responses with the expected prefix path -func TestPrefix(t *testing.T) { - const dst, blah = "Destination", "blah blah blah" - - // createLockBody comes from the example in Section 9.10.7. - const createLockBody = ` - - - - - http://example.org/~ejw/contact.html - - - ` - - do := func(method, urlStr string, body string, wantStatusCode int, headers ...string) (http.Header, error) { - var bodyReader io.Reader - if body != "" { - bodyReader = strings.NewReader(body) - } - req, err := http.NewRequest(method, urlStr, bodyReader) - if err != nil { - return nil, err - } - for len(headers) >= 2 { - req.Header.Add(headers[0], headers[1]) - headers = headers[2:] - } - res, err := http.DefaultTransport.RoundTrip(req) - if err != nil { - return nil, err - } - defer res.Body.Close() - if res.StatusCode != wantStatusCode { - return nil, fmt.Errorf("got status code %d, want %d", res.StatusCode, wantStatusCode) - } - return res.Header, nil - } - - prefixes := []string{ - "/", - "/a/", - "/a/b/", - "/a/b/c/", - } - ctx := context.Background() - for _, prefix := range prefixes { - fs := NewMemFS() - h := &Handler{ - FileSystem: fs, - LockSystem: NewMemLS(), - } - mux := http.NewServeMux() - if prefix != "/" { - h.Prefix = prefix - } - mux.Handle(prefix, h) - srv := httptest.NewServer(mux) - defer srv.Close() - - // The script is: - // MKCOL /a - // MKCOL /a/b - // PUT /a/b/c - // COPY /a/b/c /a/b/d - // MKCOL /a/b/e - // MOVE /a/b/d /a/b/e/f - // LOCK /a/b/e/g - // PUT /a/b/e/g - // which should yield the (possibly stripped) filenames /a/b/c, - // /a/b/e/f and /a/b/e/g, plus their parent directories. - - wantA := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusMovedPermanently, - "/a/b/": http.StatusNotFound, - "/a/b/c/": http.StatusNotFound, - }[prefix] - if _, err := do("MKCOL", srv.URL+"/a", "", wantA); err != nil { - t.Errorf("prefix=%-9q MKCOL /a: %v", prefix, err) - continue - } - - wantB := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusMovedPermanently, - "/a/b/c/": http.StatusNotFound, - }[prefix] - if _, err := do("MKCOL", srv.URL+"/a/b", "", wantB); err != nil { - t.Errorf("prefix=%-9q MKCOL /a/b: %v", prefix, err) - continue - } - - wantC := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusCreated, - "/a/b/c/": http.StatusMovedPermanently, - }[prefix] - if _, err := do("PUT", srv.URL+"/a/b/c", blah, wantC); err != nil { - t.Errorf("prefix=%-9q PUT /a/b/c: %v", prefix, err) - continue - } - - wantD := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusCreated, - "/a/b/c/": http.StatusMovedPermanently, - }[prefix] - if _, err := do("COPY", srv.URL+"/a/b/c", "", wantD, dst, srv.URL+"/a/b/d"); err != nil { - t.Errorf("prefix=%-9q COPY /a/b/c /a/b/d: %v", prefix, err) - continue - } - - wantE := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusCreated, - "/a/b/c/": http.StatusNotFound, - }[prefix] - if _, err := do("MKCOL", srv.URL+"/a/b/e", "", wantE); err != nil { - t.Errorf("prefix=%-9q MKCOL /a/b/e: %v", prefix, err) - continue - } - - wantF := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusCreated, - "/a/b/c/": http.StatusNotFound, - }[prefix] - if _, err := do("MOVE", srv.URL+"/a/b/d", "", wantF, dst, srv.URL+"/a/b/e/f"); err != nil { - t.Errorf("prefix=%-9q MOVE /a/b/d /a/b/e/f: %v", prefix, err) - continue - } - - var lockToken string - wantG := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusCreated, - "/a/b/c/": http.StatusNotFound, - }[prefix] - if h, err := do("LOCK", srv.URL+"/a/b/e/g", createLockBody, wantG); err != nil { - t.Errorf("prefix=%-9q LOCK /a/b/e/g: %v", prefix, err) - continue - } else { - lockToken = h.Get("Lock-Token") - } - - ifHeader := fmt.Sprintf("<%s/a/b/e/g> (%s)", srv.URL, lockToken) - wantH := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusCreated, - "/a/b/c/": http.StatusNotFound, - }[prefix] - if _, err := do("PUT", srv.URL+"/a/b/e/g", blah, wantH, "If", ifHeader); err != nil { - t.Errorf("prefix=%-9q PUT /a/b/e/g: %v", prefix, err) - continue - } - - got, err := find(ctx, nil, fs, "/") - if err != nil { - t.Errorf("prefix=%-9q find: %v", prefix, err) - continue - } - sort.Strings(got) - want := map[string][]string{ - "/": {"/", "/a", "/a/b", "/a/b/c", "/a/b/e", "/a/b/e/f", "/a/b/e/g"}, - "/a/": {"/", "/b", "/b/c", "/b/e", "/b/e/f", "/b/e/g"}, - "/a/b/": {"/", "/c", "/e", "/e/f", "/e/g"}, - "/a/b/c/": {"/"}, - }[prefix] - if !reflect.DeepEqual(got, want) { - t.Errorf("prefix=%-9q find:\ngot %v\nwant %v", prefix, got, want) - continue - } - } -} - -func TestEscapeXML(t *testing.T) { - // These test cases aren't exhaustive, and there is more than one way to - // escape e.g. a quot (as """ or """) or an apos. We presume that - // the encoding/xml package tests xml.EscapeText more thoroughly. This test - // here is just a sanity check for this package's escapeXML function, and - // its attempt to provide a fast path (and avoid a bytes.Buffer allocation) - // when escaping filenames is obviously a no-op. - testCases := map[string]string{ - "": "", - " ": " ", - "&": "&", - "*": "*", - "+": "+", - ",": ",", - "-": "-", - ".": ".", - "/": "/", - "0": "0", - "9": "9", - ":": ":", - "<": "<", - ">": ">", - "A": "A", - "_": "_", - "a": "a", - "~": "~", - "\u0201": "\u0201", - "&": "&amp;", - "foo&baz": "foo&<b/ar>baz", - } - - for in, want := range testCases { - if got := escapeXML(in); got != want { - t.Errorf("in=%q: got %q, want %q", in, got, want) - } - } -} - -func TestFilenameEscape(t *testing.T) { - hrefRe := regexp.MustCompile(`([^<]*)`) - displayNameRe := regexp.MustCompile(`([^<]*)`) - do := func(method, urlStr string) (string, string, error) { - req, err := http.NewRequest(method, urlStr, nil) - if err != nil { - return "", "", err - } - res, err := http.DefaultClient.Do(req) - if err != nil { - return "", "", err - } - defer res.Body.Close() - - b, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", "", err - } - hrefMatch := hrefRe.FindStringSubmatch(string(b)) - if len(hrefMatch) != 2 { - return "", "", errors.New("D:href not found") - } - displayNameMatch := displayNameRe.FindStringSubmatch(string(b)) - if len(displayNameMatch) != 2 { - return "", "", errors.New("D:displayname not found") - } - - return hrefMatch[1], displayNameMatch[1], nil - } - - testCases := []struct { - name, wantHref, wantDisplayName string - }{{ - name: `/foo%bar`, - wantHref: `/foo%25bar`, - wantDisplayName: `foo%bar`, - }, { - name: `/こんにちわ世界`, - wantHref: `/%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%82%8F%E4%B8%96%E7%95%8C`, - wantDisplayName: `こんにちわ世界`, - }, { - name: `/Program Files/`, - wantHref: `/Program%20Files`, - wantDisplayName: `Program Files`, - }, { - name: `/go+lang`, - wantHref: `/go+lang`, - wantDisplayName: `go+lang`, - }, { - name: `/go&lang`, - wantHref: `/go&lang`, - wantDisplayName: `go&lang`, - }, { - name: `/goexclusive"` - Shared *struct{} `xml:"lockscope>shared"` - Write *struct{} `xml:"locktype>write"` - Owner owner `xml:"owner"` -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_owner -type owner struct { - InnerXML string `xml:",innerxml"` -} - -func readLockInfo(r io.Reader) (li lockInfo, status int, err error) { - c := &countingReader{r: r} - if err = ixml.NewDecoder(c).Decode(&li); err != nil { - if err == io.EOF { - if c.n == 0 { - // An empty body means to refresh the lock. - // http://www.webdav.org/specs/rfc4918.html#refreshing-locks - return lockInfo{}, 0, nil - } - err = errInvalidLockInfo - } - return lockInfo{}, http.StatusBadRequest, err - } - // We only support exclusive (non-shared) write locks. In practice, these are - // the only types of locks that seem to matter. - if li.Exclusive == nil || li.Shared != nil || li.Write == nil { - return lockInfo{}, http.StatusNotImplemented, errUnsupportedLockInfo - } - return li, 0, nil -} - -type countingReader struct { - n int - r io.Reader -} - -func (c *countingReader) Read(p []byte) (int, error) { - n, err := c.r.Read(p) - c.n += n - return n, err -} - -func writeLockInfo(w io.Writer, token string, ld LockDetails) (int, error) { - depth := "infinity" - if ld.ZeroDepth { - depth = "0" - } - timeout := ld.Duration / time.Second - return fmt.Fprintf(w, "\n"+ - "\n"+ - " \n"+ - " \n"+ - " %s\n"+ - " %s\n"+ - " Second-%d\n"+ - " %s\n"+ - " %s\n"+ - "", - depth, ld.OwnerXML, timeout, escape(token), escape(ld.Root), - ) -} - -func escape(s string) string { - for i := 0; i < len(s); i++ { - switch s[i] { - case '"', '&', '\'', '<', '>': - b := bytes.NewBuffer(nil) - ixml.EscapeText(b, []byte(s)) - return b.String() - } - } - return s -} - -// Next returns the next token, if any, in the XML stream of d. -// RFC 4918 requires to ignore comments, processing instructions -// and directives. -// http://www.webdav.org/specs/rfc4918.html#property_values -// http://www.webdav.org/specs/rfc4918.html#xml-extensibility -func next(d *ixml.Decoder) (ixml.Token, error) { - for { - t, err := d.Token() - if err != nil { - return t, err - } - switch t.(type) { - case ixml.Comment, ixml.Directive, ixml.ProcInst: - continue - default: - return t, nil - } - } -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_prop (for propfind) -type propfindProps []xml.Name - -// UnmarshalXML appends the property names enclosed within start to pn. -// -// It returns an error if start does not contain any properties or if -// properties contain values. Character data between properties is ignored. -func (pn *propfindProps) UnmarshalXML(d *ixml.Decoder, start ixml.StartElement) error { - for { - t, err := next(d) - if err != nil { - return err - } - switch t.(type) { - case ixml.EndElement: - if len(*pn) == 0 { - return fmt.Errorf("%s must not be empty", start.Name.Local) - } - return nil - case ixml.StartElement: - name := t.(ixml.StartElement).Name - t, err = next(d) - if err != nil { - return err - } - if _, ok := t.(ixml.EndElement); !ok { - return fmt.Errorf("unexpected token %T", t) - } - *pn = append(*pn, xml.Name(name)) - } - } -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propfind -type propfind struct { - XMLName ixml.Name `xml:"DAV: propfind"` - Allprop *struct{} `xml:"DAV: allprop"` - Propname *struct{} `xml:"DAV: propname"` - Prop propfindProps `xml:"DAV: prop"` - Include propfindProps `xml:"DAV: include"` -} - -func readPropfind(r io.Reader) (pf propfind, status int, err error) { - c := countingReader{r: r} - if err = ixml.NewDecoder(&c).Decode(&pf); err != nil { - if err == io.EOF { - if c.n == 0 { - // An empty body means to propfind allprop. - // http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND - return propfind{Allprop: new(struct{})}, 0, nil - } - err = errInvalidPropfind - } - return propfind{}, http.StatusBadRequest, err - } - - if pf.Allprop == nil && pf.Include != nil { - return propfind{}, http.StatusBadRequest, errInvalidPropfind - } - if pf.Allprop != nil && (pf.Prop != nil || pf.Propname != nil) { - return propfind{}, http.StatusBadRequest, errInvalidPropfind - } - if pf.Prop != nil && pf.Propname != nil { - return propfind{}, http.StatusBadRequest, errInvalidPropfind - } - if pf.Propname == nil && pf.Allprop == nil && pf.Prop == nil { - return propfind{}, http.StatusBadRequest, errInvalidPropfind - } - return pf, 0, nil -} - -// Property represents a single DAV resource property as defined in RFC 4918. -// See http://www.webdav.org/specs/rfc4918.html#data.model.for.resource.properties -type Property struct { - // XMLName is the fully qualified name that identifies this property. - XMLName xml.Name - - // Lang is an optional xml:lang attribute. - Lang string `xml:"xml:lang,attr,omitempty"` - - // InnerXML contains the XML representation of the property value. - // See http://www.webdav.org/specs/rfc4918.html#property_values - // - // Property values of complex type or mixed-content must have fully - // expanded XML namespaces or be self-contained with according - // XML namespace declarations. They must not rely on any XML - // namespace declarations within the scope of the XML document, - // even including the DAV: namespace. - InnerXML []byte `xml:",innerxml"` -} - -// ixmlProperty is the same as the Property type except it holds an ixml.Name -// instead of an xml.Name. -type ixmlProperty struct { - XMLName ixml.Name - Lang string `xml:"xml:lang,attr,omitempty"` - InnerXML []byte `xml:",innerxml"` -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_error -// See multistatusWriter for the "D:" namespace prefix. -type xmlError struct { - XMLName ixml.Name `xml:"D:error"` - InnerXML []byte `xml:",innerxml"` -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat -// See multistatusWriter for the "D:" namespace prefix. -type propstat struct { - Prop []Property `xml:"D:prop>_ignored_"` - Status string `xml:"D:status"` - Error *xmlError `xml:"D:error"` - ResponseDescription string `xml:"D:responsedescription,omitempty"` -} - -// ixmlPropstat is the same as the propstat type except it holds an ixml.Name -// instead of an xml.Name. -type ixmlPropstat struct { - Prop []ixmlProperty `xml:"D:prop>_ignored_"` - Status string `xml:"D:status"` - Error *xmlError `xml:"D:error"` - ResponseDescription string `xml:"D:responsedescription,omitempty"` -} - -// MarshalXML prepends the "D:" namespace prefix on properties in the DAV: namespace -// before encoding. See multistatusWriter. -func (ps propstat) MarshalXML(e *ixml.Encoder, start ixml.StartElement) error { - // Convert from a propstat to an ixmlPropstat. - ixmlPs := ixmlPropstat{ - Prop: make([]ixmlProperty, len(ps.Prop)), - Status: ps.Status, - Error: ps.Error, - ResponseDescription: ps.ResponseDescription, - } - for k, prop := range ps.Prop { - ixmlPs.Prop[k] = ixmlProperty{ - XMLName: ixml.Name(prop.XMLName), - Lang: prop.Lang, - InnerXML: prop.InnerXML, - } - } - - for k, prop := range ixmlPs.Prop { - if prop.XMLName.Space == "DAV:" { - prop.XMLName = ixml.Name{Space: "", Local: "D:" + prop.XMLName.Local} - ixmlPs.Prop[k] = prop - } - } - // Distinct type to avoid infinite recursion of MarshalXML. - type newpropstat ixmlPropstat - return e.EncodeElement(newpropstat(ixmlPs), start) -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_response -// See multistatusWriter for the "D:" namespace prefix. -type response struct { - XMLName ixml.Name `xml:"D:response"` - Href []string `xml:"D:href"` - Propstat []propstat `xml:"D:propstat"` - Status string `xml:"D:status,omitempty"` - Error *xmlError `xml:"D:error"` - ResponseDescription string `xml:"D:responsedescription,omitempty"` -} - -// MultistatusWriter marshals one or more Responses into a XML -// multistatus response. -// See http://www.webdav.org/specs/rfc4918.html#ELEMENT_multistatus -// TODO(rsto, mpl): As a workaround, the "D:" namespace prefix, defined as -// "DAV:" on this element, is prepended on the nested response, as well as on all -// its nested elements. All property names in the DAV: namespace are prefixed as -// well. This is because some versions of Mini-Redirector (on windows 7) ignore -// elements with a default namespace (no prefixed namespace). A less intrusive fix -// should be possible after golang.org/cl/11074. See https://golang.org/issue/11177 -type multistatusWriter struct { - // ResponseDescription contains the optional responsedescription - // of the multistatus XML element. Only the latest content before - // close will be emitted. Empty response descriptions are not - // written. - responseDescription string - - w http.ResponseWriter - enc *ixml.Encoder -} - -// Write validates and emits a DAV response as part of a multistatus response -// element. -// -// It sets the HTTP status code of its underlying http.ResponseWriter to 207 -// (Multi-Status) and populates the Content-Type header. If r is the -// first, valid response to be written, Write prepends the XML representation -// of r with a multistatus tag. Callers must call close after the last response -// has been written. -func (w *multistatusWriter) write(r *response) error { - switch len(r.Href) { - case 0: - return errInvalidResponse - case 1: - if len(r.Propstat) > 0 != (r.Status == "") { - return errInvalidResponse - } - default: - if len(r.Propstat) > 0 || r.Status == "" { - return errInvalidResponse - } - } - err := w.writeHeader() - if err != nil { - return err - } - return w.enc.Encode(r) -} - -// writeHeader writes a XML multistatus start element on w's underlying -// http.ResponseWriter and returns the result of the write operation. -// After the first write attempt, writeHeader becomes a no-op. -func (w *multistatusWriter) writeHeader() error { - if w.enc != nil { - return nil - } - w.w.Header().Add("Content-Type", "text/xml; charset=utf-8") - w.w.WriteHeader(StatusMulti) - _, err := fmt.Fprintf(w.w, ``) - if err != nil { - return err - } - w.enc = ixml.NewEncoder(w.w) - return w.enc.EncodeToken(ixml.StartElement{ - Name: ixml.Name{ - Space: "DAV:", - Local: "multistatus", - }, - Attr: []ixml.Attr{{ - Name: ixml.Name{Space: "xmlns", Local: "D"}, - Value: "DAV:", - }}, - }) -} - -// Close completes the marshalling of the multistatus response. It returns -// an error if the multistatus response could not be completed. If both the -// return value and field enc of w are nil, then no multistatus response has -// been written. -func (w *multistatusWriter) close() error { - if w.enc == nil { - return nil - } - var end []ixml.Token - if w.responseDescription != "" { - name := ixml.Name{Space: "DAV:", Local: "responsedescription"} - end = append(end, - ixml.StartElement{Name: name}, - ixml.CharData(w.responseDescription), - ixml.EndElement{Name: name}, - ) - } - end = append(end, ixml.EndElement{ - Name: ixml.Name{Space: "DAV:", Local: "multistatus"}, - }) - for _, t := range end { - err := w.enc.EncodeToken(t) - if err != nil { - return err - } - } - return w.enc.Flush() -} - -var xmlLangName = ixml.Name{Space: "http://www.w3.org/XML/1998/namespace", Local: "lang"} - -func xmlLang(s ixml.StartElement, d string) string { - for _, attr := range s.Attr { - if attr.Name == xmlLangName { - return attr.Value - } - } - return d -} - -type xmlValue []byte - -func (v *xmlValue) UnmarshalXML(d *ixml.Decoder, start ixml.StartElement) error { - // The XML value of a property can be arbitrary, mixed-content XML. - // To make sure that the unmarshalled value contains all required - // namespaces, we encode all the property value XML tokens into a - // buffer. This forces the encoder to redeclare any used namespaces. - var b bytes.Buffer - e := ixml.NewEncoder(&b) - for { - t, err := next(d) - if err != nil { - return err - } - if e, ok := t.(ixml.EndElement); ok && e.Name == start.Name { - break - } - if err = e.EncodeToken(t); err != nil { - return err - } - } - err := e.Flush() - if err != nil { - return err - } - *v = b.Bytes() - return nil -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_prop (for proppatch) -type proppatchProps []Property - -// UnmarshalXML appends the property names and values enclosed within start -// to ps. -// -// An xml:lang attribute that is defined either on the DAV:prop or property -// name XML element is propagated to the property's Lang field. -// -// UnmarshalXML returns an error if start does not contain any properties or if -// property values contain syntactically incorrect XML. -func (ps *proppatchProps) UnmarshalXML(d *ixml.Decoder, start ixml.StartElement) error { - lang := xmlLang(start, "") - for { - t, err := next(d) - if err != nil { - return err - } - switch elem := t.(type) { - case ixml.EndElement: - if len(*ps) == 0 { - return fmt.Errorf("%s must not be empty", start.Name.Local) - } - return nil - case ixml.StartElement: - p := Property{ - XMLName: xml.Name(t.(ixml.StartElement).Name), - Lang: xmlLang(t.(ixml.StartElement), lang), - } - err = d.DecodeElement(((*xmlValue)(&p.InnerXML)), &elem) - if err != nil { - return err - } - *ps = append(*ps, p) - } - } -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_set -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_remove -type setRemove struct { - XMLName ixml.Name - Lang string `xml:"xml:lang,attr,omitempty"` - Prop proppatchProps `xml:"DAV: prop"` -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propertyupdate -type propertyupdate struct { - XMLName ixml.Name `xml:"DAV: propertyupdate"` - Lang string `xml:"xml:lang,attr,omitempty"` - SetRemove []setRemove `xml:",any"` -} - -func readProppatch(r io.Reader) (patches []Proppatch, status int, err error) { - var pu propertyupdate - if err = ixml.NewDecoder(r).Decode(&pu); err != nil { - return nil, http.StatusBadRequest, err - } - for _, op := range pu.SetRemove { - remove := false - switch op.XMLName { - case ixml.Name{Space: "DAV:", Local: "set"}: - // No-op. - case ixml.Name{Space: "DAV:", Local: "remove"}: - for _, p := range op.Prop { - if len(p.InnerXML) > 0 { - return nil, http.StatusBadRequest, errInvalidProppatch - } - } - remove = true - default: - return nil, http.StatusBadRequest, errInvalidProppatch - } - patches = append(patches, Proppatch{Remove: remove, Props: op.Prop}) - } - return patches, 0, nil -} diff --git a/vendor/golang.org/x/net/webdav/xml_test.go b/vendor/golang.org/x/net/webdav/xml_test.go deleted file mode 100644 index a3d9e1ed8..000000000 --- a/vendor/golang.org/x/net/webdav/xml_test.go +++ /dev/null @@ -1,906 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "bytes" - "encoding/xml" - "fmt" - "io" - "net/http" - "net/http/httptest" - "reflect" - "sort" - "strings" - "testing" - - ixml "golang.org/x/net/webdav/internal/xml" -) - -func TestReadLockInfo(t *testing.T) { - // The "section x.y.z" test cases come from section x.y.z of the spec at - // http://www.webdav.org/specs/rfc4918.html - testCases := []struct { - desc string - input string - wantLI lockInfo - wantStatus int - }{{ - "bad: junk", - "xxx", - lockInfo{}, - http.StatusBadRequest, - }, { - "bad: invalid owner XML", - "" + - "\n" + - " \n" + - " \n" + - " \n" + - " no end tag \n" + - " \n" + - "", - lockInfo{}, - http.StatusBadRequest, - }, { - "bad: invalid UTF-8", - "" + - "\n" + - " \n" + - " \n" + - " \n" + - " \xff \n" + - " \n" + - "", - lockInfo{}, - http.StatusBadRequest, - }, { - "bad: unfinished XML #1", - "" + - "\n" + - " \n" + - " \n", - lockInfo{}, - http.StatusBadRequest, - }, { - "bad: unfinished XML #2", - "" + - "\n" + - " \n" + - " \n" + - " \n", - lockInfo{}, - http.StatusBadRequest, - }, { - "good: empty", - "", - lockInfo{}, - 0, - }, { - "good: plain-text owner", - "" + - "\n" + - " \n" + - " \n" + - " gopher\n" + - "", - lockInfo{ - XMLName: ixml.Name{Space: "DAV:", Local: "lockinfo"}, - Exclusive: new(struct{}), - Write: new(struct{}), - Owner: owner{ - InnerXML: "gopher", - }, - }, - 0, - }, { - "section 9.10.7", - "" + - "\n" + - " \n" + - " \n" + - " \n" + - " http://example.org/~ejw/contact.html\n" + - " \n" + - "", - lockInfo{ - XMLName: ixml.Name{Space: "DAV:", Local: "lockinfo"}, - Exclusive: new(struct{}), - Write: new(struct{}), - Owner: owner{ - InnerXML: "\n http://example.org/~ejw/contact.html\n ", - }, - }, - 0, - }} - - for _, tc := range testCases { - li, status, err := readLockInfo(strings.NewReader(tc.input)) - if tc.wantStatus != 0 { - if err == nil { - t.Errorf("%s: got nil error, want non-nil", tc.desc) - continue - } - } else if err != nil { - t.Errorf("%s: %v", tc.desc, err) - continue - } - if !reflect.DeepEqual(li, tc.wantLI) || status != tc.wantStatus { - t.Errorf("%s:\ngot lockInfo=%v, status=%v\nwant lockInfo=%v, status=%v", - tc.desc, li, status, tc.wantLI, tc.wantStatus) - continue - } - } -} - -func TestReadPropfind(t *testing.T) { - testCases := []struct { - desc string - input string - wantPF propfind - wantStatus int - }{{ - desc: "propfind: propname", - input: "" + - "\n" + - " \n" + - "", - wantPF: propfind{ - XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, - Propname: new(struct{}), - }, - }, { - desc: "propfind: empty body means allprop", - input: "", - wantPF: propfind{ - Allprop: new(struct{}), - }, - }, { - desc: "propfind: allprop", - input: "" + - "\n" + - " \n" + - "", - wantPF: propfind{ - XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, - Allprop: new(struct{}), - }, - }, { - desc: "propfind: allprop followed by include", - input: "" + - "\n" + - " \n" + - " \n" + - "", - wantPF: propfind{ - XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, - Allprop: new(struct{}), - Include: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: include followed by allprop", - input: "" + - "\n" + - " \n" + - " \n" + - "", - wantPF: propfind{ - XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, - Allprop: new(struct{}), - Include: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: propfind", - input: "" + - "\n" + - " \n" + - "", - wantPF: propfind{ - XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, - Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: prop with ignored comments", - input: "" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - "", - wantPF: propfind{ - XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, - Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: propfind with ignored whitespace", - input: "" + - "\n" + - " \n" + - "", - wantPF: propfind{ - XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, - Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: propfind with ignored mixed-content", - input: "" + - "\n" + - " foobar\n" + - "", - wantPF: propfind{ - XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, - Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: propname with ignored element (section A.4)", - input: "" + - "\n" + - " \n" + - " *boss*\n" + - "", - wantPF: propfind{ - XMLName: ixml.Name{Space: "DAV:", Local: "propfind"}, - Propname: new(struct{}), - }, - }, { - desc: "propfind: bad: junk", - input: "xxx", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: propname and allprop (section A.3)", - input: "" + - "\n" + - " " + - " " + - "", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: propname and prop", - input: "" + - "\n" + - " \n" + - " \n" + - "", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: allprop and prop", - input: "" + - "\n" + - " \n" + - " \n" + - "", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: empty propfind with ignored element (section A.4)", - input: "" + - "\n" + - " \n" + - "", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: empty prop", - input: "" + - "\n" + - " \n" + - "", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: prop with just chardata", - input: "" + - "\n" + - " foo\n" + - "", - wantStatus: http.StatusBadRequest, - }, { - desc: "bad: interrupted prop", - input: "" + - "\n" + - " \n", - wantStatus: http.StatusBadRequest, - }, { - desc: "bad: malformed end element prop", - input: "" + - "\n" + - " \n", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: property with chardata value", - input: "" + - "\n" + - " bar\n" + - "", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: property with whitespace value", - input: "" + - "\n" + - " \n" + - "", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: include without allprop", - input: "" + - "\n" + - " \n" + - "", - wantStatus: http.StatusBadRequest, - }} - - for _, tc := range testCases { - pf, status, err := readPropfind(strings.NewReader(tc.input)) - if tc.wantStatus != 0 { - if err == nil { - t.Errorf("%s: got nil error, want non-nil", tc.desc) - continue - } - } else if err != nil { - t.Errorf("%s: %v", tc.desc, err) - continue - } - if !reflect.DeepEqual(pf, tc.wantPF) || status != tc.wantStatus { - t.Errorf("%s:\ngot propfind=%v, status=%v\nwant propfind=%v, status=%v", - tc.desc, pf, status, tc.wantPF, tc.wantStatus) - continue - } - } -} - -func TestMultistatusWriter(t *testing.T) { - ///The "section x.y.z" test cases come from section x.y.z of the spec at - // http://www.webdav.org/specs/rfc4918.html - testCases := []struct { - desc string - responses []response - respdesc string - writeHeader bool - wantXML string - wantCode int - wantErr error - }{{ - desc: "section 9.2.2 (failed dependency)", - responses: []response{{ - Href: []string{"http://example.com/foo"}, - Propstat: []propstat{{ - Prop: []Property{{ - XMLName: xml.Name{ - Space: "http://ns.example.com/", - Local: "Authors", - }, - }}, - Status: "HTTP/1.1 424 Failed Dependency", - }, { - Prop: []Property{{ - XMLName: xml.Name{ - Space: "http://ns.example.com/", - Local: "Copyright-Owner", - }, - }}, - Status: "HTTP/1.1 409 Conflict", - }}, - ResponseDescription: "Copyright Owner cannot be deleted or altered.", - }}, - wantXML: `` + - `` + - `` + - ` ` + - ` http://example.com/foo` + - ` ` + - ` ` + - ` ` + - ` ` + - ` HTTP/1.1 424 Failed Dependency` + - ` ` + - ` ` + - ` ` + - ` ` + - ` ` + - ` HTTP/1.1 409 Conflict` + - ` ` + - ` Copyright Owner cannot be deleted or altered.` + - `` + - ``, - wantCode: StatusMulti, - }, { - desc: "section 9.6.2 (lock-token-submitted)", - responses: []response{{ - Href: []string{"http://example.com/foo"}, - Status: "HTTP/1.1 423 Locked", - Error: &xmlError{ - InnerXML: []byte(``), - }, - }}, - wantXML: `` + - `` + - `` + - ` ` + - ` http://example.com/foo` + - ` HTTP/1.1 423 Locked` + - ` ` + - ` ` + - ``, - wantCode: StatusMulti, - }, { - desc: "section 9.1.3", - responses: []response{{ - Href: []string{"http://example.com/foo"}, - Propstat: []propstat{{ - Prop: []Property{{ - XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "bigbox"}, - InnerXML: []byte(`` + - `` + - `Box type A` + - ``), - }, { - XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "author"}, - InnerXML: []byte(`` + - `` + - `J.J. Johnson` + - ``), - }}, - Status: "HTTP/1.1 200 OK", - }, { - Prop: []Property{{ - XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "DingALing"}, - }, { - XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "Random"}, - }}, - Status: "HTTP/1.1 403 Forbidden", - ResponseDescription: "The user does not have access to the DingALing property.", - }}, - }}, - respdesc: "There has been an access violation error.", - wantXML: `` + - `` + - `` + - ` ` + - ` http://example.com/foo` + - ` ` + - ` ` + - ` Box type A` + - ` J.J. Johnson` + - ` ` + - ` HTTP/1.1 200 OK` + - ` ` + - ` ` + - ` ` + - ` ` + - ` ` + - ` ` + - ` HTTP/1.1 403 Forbidden` + - ` The user does not have access to the DingALing property.` + - ` ` + - ` ` + - ` There has been an access violation error.` + - ``, - wantCode: StatusMulti, - }, { - desc: "no response written", - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "no response written (with description)", - respdesc: "too bad", - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "empty multistatus with header", - writeHeader: true, - wantXML: ``, - wantCode: StatusMulti, - }, { - desc: "bad: no href", - responses: []response{{ - Propstat: []propstat{{ - Prop: []Property{{ - XMLName: xml.Name{ - Space: "http://example.com/", - Local: "foo", - }, - }}, - Status: "HTTP/1.1 200 OK", - }}, - }}, - wantErr: errInvalidResponse, - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "bad: multiple hrefs and no status", - responses: []response{{ - Href: []string{"http://example.com/foo", "http://example.com/bar"}, - }}, - wantErr: errInvalidResponse, - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "bad: one href and no propstat", - responses: []response{{ - Href: []string{"http://example.com/foo"}, - }}, - wantErr: errInvalidResponse, - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "bad: status with one href and propstat", - responses: []response{{ - Href: []string{"http://example.com/foo"}, - Propstat: []propstat{{ - Prop: []Property{{ - XMLName: xml.Name{ - Space: "http://example.com/", - Local: "foo", - }, - }}, - Status: "HTTP/1.1 200 OK", - }}, - Status: "HTTP/1.1 200 OK", - }}, - wantErr: errInvalidResponse, - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "bad: multiple hrefs and propstat", - responses: []response{{ - Href: []string{ - "http://example.com/foo", - "http://example.com/bar", - }, - Propstat: []propstat{{ - Prop: []Property{{ - XMLName: xml.Name{ - Space: "http://example.com/", - Local: "foo", - }, - }}, - Status: "HTTP/1.1 200 OK", - }}, - }}, - wantErr: errInvalidResponse, - // default of http.responseWriter - wantCode: http.StatusOK, - }} - - n := xmlNormalizer{omitWhitespace: true} -loop: - for _, tc := range testCases { - rec := httptest.NewRecorder() - w := multistatusWriter{w: rec, responseDescription: tc.respdesc} - if tc.writeHeader { - if err := w.writeHeader(); err != nil { - t.Errorf("%s: got writeHeader error %v, want nil", tc.desc, err) - continue - } - } - for _, r := range tc.responses { - if err := w.write(&r); err != nil { - if err != tc.wantErr { - t.Errorf("%s: got write error %v, want %v", - tc.desc, err, tc.wantErr) - } - continue loop - } - } - if err := w.close(); err != tc.wantErr { - t.Errorf("%s: got close error %v, want %v", - tc.desc, err, tc.wantErr) - continue - } - if rec.Code != tc.wantCode { - t.Errorf("%s: got HTTP status code %d, want %d\n", - tc.desc, rec.Code, tc.wantCode) - continue - } - gotXML := rec.Body.String() - eq, err := n.equalXML(strings.NewReader(gotXML), strings.NewReader(tc.wantXML)) - if err != nil { - t.Errorf("%s: equalXML: %v", tc.desc, err) - continue - } - if !eq { - t.Errorf("%s: XML body\ngot %s\nwant %s", tc.desc, gotXML, tc.wantXML) - } - } -} - -func TestReadProppatch(t *testing.T) { - ppStr := func(pps []Proppatch) string { - var outer []string - for _, pp := range pps { - var inner []string - for _, p := range pp.Props { - inner = append(inner, fmt.Sprintf("{XMLName: %q, Lang: %q, InnerXML: %q}", - p.XMLName, p.Lang, p.InnerXML)) - } - outer = append(outer, fmt.Sprintf("{Remove: %t, Props: [%s]}", - pp.Remove, strings.Join(inner, ", "))) - } - return "[" + strings.Join(outer, ", ") + "]" - } - - testCases := []struct { - desc string - input string - wantPP []Proppatch - wantStatus int - }{{ - desc: "proppatch: section 9.2 (with simple property value)", - input: `` + - `` + - `` + - ` ` + - ` somevalue` + - ` ` + - ` ` + - ` ` + - ` ` + - ``, - wantPP: []Proppatch{{ - Props: []Property{{ - xml.Name{Space: "http://ns.example.com/z/", Local: "Authors"}, - "", - []byte(`somevalue`), - }}, - }, { - Remove: true, - Props: []Property{{ - xml.Name{Space: "http://ns.example.com/z/", Local: "Copyright-Owner"}, - "", - nil, - }}, - }}, - }, { - desc: "proppatch: lang attribute on prop", - input: `` + - `` + - `` + - ` ` + - ` ` + - ` ` + - ` ` + - ` ` + - ``, - wantPP: []Proppatch{{ - Props: []Property{{ - xml.Name{Space: "http://example.com/ns", Local: "foo"}, - "en", - nil, - }}, - }}, - }, { - desc: "bad: remove with value", - input: `` + - `` + - `` + - ` ` + - ` ` + - ` ` + - ` Jim Whitehead` + - ` ` + - ` ` + - ` ` + - ``, - wantStatus: http.StatusBadRequest, - }, { - desc: "bad: empty propertyupdate", - input: `` + - `` + - ``, - wantStatus: http.StatusBadRequest, - }, { - desc: "bad: empty prop", - input: `` + - `` + - `` + - ` ` + - ` ` + - ` ` + - ``, - wantStatus: http.StatusBadRequest, - }} - - for _, tc := range testCases { - pp, status, err := readProppatch(strings.NewReader(tc.input)) - if tc.wantStatus != 0 { - if err == nil { - t.Errorf("%s: got nil error, want non-nil", tc.desc) - continue - } - } else if err != nil { - t.Errorf("%s: %v", tc.desc, err) - continue - } - if status != tc.wantStatus { - t.Errorf("%s: got status %d, want %d", tc.desc, status, tc.wantStatus) - continue - } - if !reflect.DeepEqual(pp, tc.wantPP) || status != tc.wantStatus { - t.Errorf("%s: proppatch\ngot %v\nwant %v", tc.desc, ppStr(pp), ppStr(tc.wantPP)) - } - } -} - -func TestUnmarshalXMLValue(t *testing.T) { - testCases := []struct { - desc string - input string - wantVal string - }{{ - desc: "simple char data", - input: "foo", - wantVal: "foo", - }, { - desc: "empty element", - input: "", - wantVal: "", - }, { - desc: "preserve namespace", - input: ``, - wantVal: ``, - }, { - desc: "preserve root element namespace", - input: ``, - wantVal: ``, - }, { - desc: "preserve whitespace", - input: " \t ", - wantVal: " \t ", - }, { - desc: "preserve mixed content", - input: ` a `, - wantVal: ` a `, - }, { - desc: "section 9.2", - input: `` + - `` + - ` Jim Whitehead` + - ` Roy Fielding` + - ``, - wantVal: `` + - ` Jim Whitehead` + - ` Roy Fielding`, - }, { - desc: "section 4.3.1 (mixed content)", - input: `` + - `` + - ` Jane Doe` + - ` ` + - ` mailto:jane.doe@example.com` + - ` http://www.example.com` + - ` ` + - ` Jane has been working way too long on the` + - ` long-awaited revision of ]]>.` + - ` ` + - ``, - wantVal: `` + - ` Jane Doe` + - ` ` + - ` mailto:jane.doe@example.com` + - ` http://www.example.com` + - ` ` + - ` Jane has been working way too long on the` + - ` long-awaited revision of <RFC2518>.` + - ` `, - }} - - var n xmlNormalizer - for _, tc := range testCases { - d := ixml.NewDecoder(strings.NewReader(tc.input)) - var v xmlValue - if err := d.Decode(&v); err != nil { - t.Errorf("%s: got error %v, want nil", tc.desc, err) - continue - } - eq, err := n.equalXML(bytes.NewReader(v), strings.NewReader(tc.wantVal)) - if err != nil { - t.Errorf("%s: equalXML: %v", tc.desc, err) - continue - } - if !eq { - t.Errorf("%s:\ngot %s\nwant %s", tc.desc, string(v), tc.wantVal) - } - } -} - -// xmlNormalizer normalizes XML. -type xmlNormalizer struct { - // omitWhitespace instructs to ignore whitespace between element tags. - omitWhitespace bool - // omitComments instructs to ignore XML comments. - omitComments bool -} - -// normalize writes the normalized XML content of r to w. It applies the -// following rules -// -// * Rename namespace prefixes according to an internal heuristic. -// * Remove unnecessary namespace declarations. -// * Sort attributes in XML start elements in lexical order of their -// fully qualified name. -// * Remove XML directives and processing instructions. -// * Remove CDATA between XML tags that only contains whitespace, if -// instructed to do so. -// * Remove comments, if instructed to do so. -// -func (n *xmlNormalizer) normalize(w io.Writer, r io.Reader) error { - d := ixml.NewDecoder(r) - e := ixml.NewEncoder(w) - for { - t, err := d.Token() - if err != nil { - if t == nil && err == io.EOF { - break - } - return err - } - switch val := t.(type) { - case ixml.Directive, ixml.ProcInst: - continue - case ixml.Comment: - if n.omitComments { - continue - } - case ixml.CharData: - if n.omitWhitespace && len(bytes.TrimSpace(val)) == 0 { - continue - } - case ixml.StartElement: - start, _ := ixml.CopyToken(val).(ixml.StartElement) - attr := start.Attr[:0] - for _, a := range start.Attr { - if a.Name.Space == "xmlns" || a.Name.Local == "xmlns" { - continue - } - attr = append(attr, a) - } - sort.Sort(byName(attr)) - start.Attr = attr - t = start - } - err = e.EncodeToken(t) - if err != nil { - return err - } - } - return e.Flush() -} - -// equalXML tests for equality of the normalized XML contents of a and b. -func (n *xmlNormalizer) equalXML(a, b io.Reader) (bool, error) { - var buf bytes.Buffer - if err := n.normalize(&buf, a); err != nil { - return false, err - } - normA := buf.String() - buf.Reset() - if err := n.normalize(&buf, b); err != nil { - return false, err - } - normB := buf.String() - return normA == normB, nil -} - -type byName []ixml.Attr - -func (a byName) Len() int { return len(a) } -func (a byName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byName) Less(i, j int) bool { - if a[i].Name.Space != a[j].Name.Space { - return a[i].Name.Space < a[j].Name.Space - } - return a[i].Name.Local < a[j].Name.Local -} diff --git a/vendor/golang.org/x/net/websocket/client.go b/vendor/golang.org/x/net/websocket/client.go deleted file mode 100644 index 69a4ac7ee..000000000 --- a/vendor/golang.org/x/net/websocket/client.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bufio" - "io" - "net" - "net/http" - "net/url" -) - -// DialError is an error that occurs while dialling a websocket server. -type DialError struct { - *Config - Err error -} - -func (e *DialError) Error() string { - return "websocket.Dial " + e.Config.Location.String() + ": " + e.Err.Error() -} - -// NewConfig creates a new WebSocket config for client connection. -func NewConfig(server, origin string) (config *Config, err error) { - config = new(Config) - config.Version = ProtocolVersionHybi13 - config.Location, err = url.ParseRequestURI(server) - if err != nil { - return - } - config.Origin, err = url.ParseRequestURI(origin) - if err != nil { - return - } - config.Header = http.Header(make(map[string][]string)) - return -} - -// NewClient creates a new WebSocket client connection over rwc. -func NewClient(config *Config, rwc io.ReadWriteCloser) (ws *Conn, err error) { - br := bufio.NewReader(rwc) - bw := bufio.NewWriter(rwc) - err = hybiClientHandshake(config, br, bw) - if err != nil { - return - } - buf := bufio.NewReadWriter(br, bw) - ws = newHybiClientConn(config, buf, rwc) - return -} - -// Dial opens a new client connection to a WebSocket. -func Dial(url_, protocol, origin string) (ws *Conn, err error) { - config, err := NewConfig(url_, origin) - if err != nil { - return nil, err - } - if protocol != "" { - config.Protocol = []string{protocol} - } - return DialConfig(config) -} - -var portMap = map[string]string{ - "ws": "80", - "wss": "443", -} - -func parseAuthority(location *url.URL) string { - if _, ok := portMap[location.Scheme]; ok { - if _, _, err := net.SplitHostPort(location.Host); err != nil { - return net.JoinHostPort(location.Host, portMap[location.Scheme]) - } - } - return location.Host -} - -// DialConfig opens a new client connection to a WebSocket with a config. -func DialConfig(config *Config) (ws *Conn, err error) { - var client net.Conn - if config.Location == nil { - return nil, &DialError{config, ErrBadWebSocketLocation} - } - if config.Origin == nil { - return nil, &DialError{config, ErrBadWebSocketOrigin} - } - dialer := config.Dialer - if dialer == nil { - dialer = &net.Dialer{} - } - client, err = dialWithDialer(dialer, config) - if err != nil { - goto Error - } - ws, err = NewClient(config, client) - if err != nil { - client.Close() - goto Error - } - return - -Error: - return nil, &DialError{config, err} -} diff --git a/vendor/golang.org/x/net/websocket/dial.go b/vendor/golang.org/x/net/websocket/dial.go deleted file mode 100644 index 2dab943a4..000000000 --- a/vendor/golang.org/x/net/websocket/dial.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "crypto/tls" - "net" -) - -func dialWithDialer(dialer *net.Dialer, config *Config) (conn net.Conn, err error) { - switch config.Location.Scheme { - case "ws": - conn, err = dialer.Dial("tcp", parseAuthority(config.Location)) - - case "wss": - conn, err = tls.DialWithDialer(dialer, "tcp", parseAuthority(config.Location), config.TlsConfig) - - default: - err = ErrBadScheme - } - return -} diff --git a/vendor/golang.org/x/net/websocket/dial_test.go b/vendor/golang.org/x/net/websocket/dial_test.go deleted file mode 100644 index aa03e30dd..000000000 --- a/vendor/golang.org/x/net/websocket/dial_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "crypto/tls" - "fmt" - "log" - "net" - "net/http/httptest" - "testing" - "time" -) - -// This test depend on Go 1.3+ because in earlier versions the Dialer won't be -// used in TLS connections and a timeout won't be triggered. -func TestDialConfigTLSWithDialer(t *testing.T) { - tlsServer := httptest.NewTLSServer(nil) - tlsServerAddr := tlsServer.Listener.Addr().String() - log.Print("Test TLS WebSocket server listening on ", tlsServerAddr) - defer tlsServer.Close() - config, _ := NewConfig(fmt.Sprintf("wss://%s/echo", tlsServerAddr), "http://localhost") - config.Dialer = &net.Dialer{ - Deadline: time.Now().Add(-time.Minute), - } - config.TlsConfig = &tls.Config{ - InsecureSkipVerify: true, - } - _, err := DialConfig(config) - dialerr, ok := err.(*DialError) - if !ok { - t.Fatalf("DialError expected, got %#v", err) - } - neterr, ok := dialerr.Err.(*net.OpError) - if !ok { - t.Fatalf("net.OpError error expected, got %#v", dialerr.Err) - } - if !neterr.Timeout() { - t.Fatalf("expected timeout error, got %#v", neterr) - } -} diff --git a/vendor/golang.org/x/net/websocket/exampledial_test.go b/vendor/golang.org/x/net/websocket/exampledial_test.go deleted file mode 100644 index 72bb9d48e..000000000 --- a/vendor/golang.org/x/net/websocket/exampledial_test.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket_test - -import ( - "fmt" - "log" - - "golang.org/x/net/websocket" -) - -// This example demonstrates a trivial client. -func ExampleDial() { - origin := "http://localhost/" - url := "ws://localhost:12345/ws" - ws, err := websocket.Dial(url, "", origin) - if err != nil { - log.Fatal(err) - } - if _, err := ws.Write([]byte("hello, world!\n")); err != nil { - log.Fatal(err) - } - var msg = make([]byte, 512) - var n int - if n, err = ws.Read(msg); err != nil { - log.Fatal(err) - } - fmt.Printf("Received: %s.\n", msg[:n]) -} diff --git a/vendor/golang.org/x/net/websocket/examplehandler_test.go b/vendor/golang.org/x/net/websocket/examplehandler_test.go deleted file mode 100644 index f22a98fcd..000000000 --- a/vendor/golang.org/x/net/websocket/examplehandler_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket_test - -import ( - "io" - "net/http" - - "golang.org/x/net/websocket" -) - -// Echo the data received on the WebSocket. -func EchoServer(ws *websocket.Conn) { - io.Copy(ws, ws) -} - -// This example demonstrates a trivial echo server. -func ExampleHandler() { - http.Handle("/echo", websocket.Handler(EchoServer)) - err := http.ListenAndServe(":12345", nil) - if err != nil { - panic("ListenAndServe: " + err.Error()) - } -} diff --git a/vendor/golang.org/x/net/websocket/hybi.go b/vendor/golang.org/x/net/websocket/hybi.go deleted file mode 100644 index 8cffdd16c..000000000 --- a/vendor/golang.org/x/net/websocket/hybi.go +++ /dev/null @@ -1,583 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -// This file implements a protocol of hybi draft. -// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 - -import ( - "bufio" - "bytes" - "crypto/rand" - "crypto/sha1" - "encoding/base64" - "encoding/binary" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "strings" -) - -const ( - websocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" - - closeStatusNormal = 1000 - closeStatusGoingAway = 1001 - closeStatusProtocolError = 1002 - closeStatusUnsupportedData = 1003 - closeStatusFrameTooLarge = 1004 - closeStatusNoStatusRcvd = 1005 - closeStatusAbnormalClosure = 1006 - closeStatusBadMessageData = 1007 - closeStatusPolicyViolation = 1008 - closeStatusTooBigData = 1009 - closeStatusExtensionMismatch = 1010 - - maxControlFramePayloadLength = 125 -) - -var ( - ErrBadMaskingKey = &ProtocolError{"bad masking key"} - ErrBadPongMessage = &ProtocolError{"bad pong message"} - ErrBadClosingStatus = &ProtocolError{"bad closing status"} - ErrUnsupportedExtensions = &ProtocolError{"unsupported extensions"} - ErrNotImplemented = &ProtocolError{"not implemented"} - - handshakeHeader = map[string]bool{ - "Host": true, - "Upgrade": true, - "Connection": true, - "Sec-Websocket-Key": true, - "Sec-Websocket-Origin": true, - "Sec-Websocket-Version": true, - "Sec-Websocket-Protocol": true, - "Sec-Websocket-Accept": true, - } -) - -// A hybiFrameHeader is a frame header as defined in hybi draft. -type hybiFrameHeader struct { - Fin bool - Rsv [3]bool - OpCode byte - Length int64 - MaskingKey []byte - - data *bytes.Buffer -} - -// A hybiFrameReader is a reader for hybi frame. -type hybiFrameReader struct { - reader io.Reader - - header hybiFrameHeader - pos int64 - length int -} - -func (frame *hybiFrameReader) Read(msg []byte) (n int, err error) { - n, err = frame.reader.Read(msg) - if frame.header.MaskingKey != nil { - for i := 0; i < n; i++ { - msg[i] = msg[i] ^ frame.header.MaskingKey[frame.pos%4] - frame.pos++ - } - } - return n, err -} - -func (frame *hybiFrameReader) PayloadType() byte { return frame.header.OpCode } - -func (frame *hybiFrameReader) HeaderReader() io.Reader { - if frame.header.data == nil { - return nil - } - if frame.header.data.Len() == 0 { - return nil - } - return frame.header.data -} - -func (frame *hybiFrameReader) TrailerReader() io.Reader { return nil } - -func (frame *hybiFrameReader) Len() (n int) { return frame.length } - -// A hybiFrameReaderFactory creates new frame reader based on its frame type. -type hybiFrameReaderFactory struct { - *bufio.Reader -} - -// NewFrameReader reads a frame header from the connection, and creates new reader for the frame. -// See Section 5.2 Base Framing protocol for detail. -// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2 -func (buf hybiFrameReaderFactory) NewFrameReader() (frame frameReader, err error) { - hybiFrame := new(hybiFrameReader) - frame = hybiFrame - var header []byte - var b byte - // First byte. FIN/RSV1/RSV2/RSV3/OpCode(4bits) - b, err = buf.ReadByte() - if err != nil { - return - } - header = append(header, b) - hybiFrame.header.Fin = ((header[0] >> 7) & 1) != 0 - for i := 0; i < 3; i++ { - j := uint(6 - i) - hybiFrame.header.Rsv[i] = ((header[0] >> j) & 1) != 0 - } - hybiFrame.header.OpCode = header[0] & 0x0f - - // Second byte. Mask/Payload len(7bits) - b, err = buf.ReadByte() - if err != nil { - return - } - header = append(header, b) - mask := (b & 0x80) != 0 - b &= 0x7f - lengthFields := 0 - switch { - case b <= 125: // Payload length 7bits. - hybiFrame.header.Length = int64(b) - case b == 126: // Payload length 7+16bits - lengthFields = 2 - case b == 127: // Payload length 7+64bits - lengthFields = 8 - } - for i := 0; i < lengthFields; i++ { - b, err = buf.ReadByte() - if err != nil { - return - } - if lengthFields == 8 && i == 0 { // MSB must be zero when 7+64 bits - b &= 0x7f - } - header = append(header, b) - hybiFrame.header.Length = hybiFrame.header.Length*256 + int64(b) - } - if mask { - // Masking key. 4 bytes. - for i := 0; i < 4; i++ { - b, err = buf.ReadByte() - if err != nil { - return - } - header = append(header, b) - hybiFrame.header.MaskingKey = append(hybiFrame.header.MaskingKey, b) - } - } - hybiFrame.reader = io.LimitReader(buf.Reader, hybiFrame.header.Length) - hybiFrame.header.data = bytes.NewBuffer(header) - hybiFrame.length = len(header) + int(hybiFrame.header.Length) - return -} - -// A HybiFrameWriter is a writer for hybi frame. -type hybiFrameWriter struct { - writer *bufio.Writer - - header *hybiFrameHeader -} - -func (frame *hybiFrameWriter) Write(msg []byte) (n int, err error) { - var header []byte - var b byte - if frame.header.Fin { - b |= 0x80 - } - for i := 0; i < 3; i++ { - if frame.header.Rsv[i] { - j := uint(6 - i) - b |= 1 << j - } - } - b |= frame.header.OpCode - header = append(header, b) - if frame.header.MaskingKey != nil { - b = 0x80 - } else { - b = 0 - } - lengthFields := 0 - length := len(msg) - switch { - case length <= 125: - b |= byte(length) - case length < 65536: - b |= 126 - lengthFields = 2 - default: - b |= 127 - lengthFields = 8 - } - header = append(header, b) - for i := 0; i < lengthFields; i++ { - j := uint((lengthFields - i - 1) * 8) - b = byte((length >> j) & 0xff) - header = append(header, b) - } - if frame.header.MaskingKey != nil { - if len(frame.header.MaskingKey) != 4 { - return 0, ErrBadMaskingKey - } - header = append(header, frame.header.MaskingKey...) - frame.writer.Write(header) - data := make([]byte, length) - for i := range data { - data[i] = msg[i] ^ frame.header.MaskingKey[i%4] - } - frame.writer.Write(data) - err = frame.writer.Flush() - return length, err - } - frame.writer.Write(header) - frame.writer.Write(msg) - err = frame.writer.Flush() - return length, err -} - -func (frame *hybiFrameWriter) Close() error { return nil } - -type hybiFrameWriterFactory struct { - *bufio.Writer - needMaskingKey bool -} - -func (buf hybiFrameWriterFactory) NewFrameWriter(payloadType byte) (frame frameWriter, err error) { - frameHeader := &hybiFrameHeader{Fin: true, OpCode: payloadType} - if buf.needMaskingKey { - frameHeader.MaskingKey, err = generateMaskingKey() - if err != nil { - return nil, err - } - } - return &hybiFrameWriter{writer: buf.Writer, header: frameHeader}, nil -} - -type hybiFrameHandler struct { - conn *Conn - payloadType byte -} - -func (handler *hybiFrameHandler) HandleFrame(frame frameReader) (frameReader, error) { - if handler.conn.IsServerConn() { - // The client MUST mask all frames sent to the server. - if frame.(*hybiFrameReader).header.MaskingKey == nil { - handler.WriteClose(closeStatusProtocolError) - return nil, io.EOF - } - } else { - // The server MUST NOT mask all frames. - if frame.(*hybiFrameReader).header.MaskingKey != nil { - handler.WriteClose(closeStatusProtocolError) - return nil, io.EOF - } - } - if header := frame.HeaderReader(); header != nil { - io.Copy(ioutil.Discard, header) - } - switch frame.PayloadType() { - case ContinuationFrame: - frame.(*hybiFrameReader).header.OpCode = handler.payloadType - case TextFrame, BinaryFrame: - handler.payloadType = frame.PayloadType() - case CloseFrame: - return nil, io.EOF - case PingFrame, PongFrame: - b := make([]byte, maxControlFramePayloadLength) - n, err := io.ReadFull(frame, b) - if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { - return nil, err - } - io.Copy(ioutil.Discard, frame) - if frame.PayloadType() == PingFrame { - if _, err := handler.WritePong(b[:n]); err != nil { - return nil, err - } - } - return nil, nil - } - return frame, nil -} - -func (handler *hybiFrameHandler) WriteClose(status int) (err error) { - handler.conn.wio.Lock() - defer handler.conn.wio.Unlock() - w, err := handler.conn.frameWriterFactory.NewFrameWriter(CloseFrame) - if err != nil { - return err - } - msg := make([]byte, 2) - binary.BigEndian.PutUint16(msg, uint16(status)) - _, err = w.Write(msg) - w.Close() - return err -} - -func (handler *hybiFrameHandler) WritePong(msg []byte) (n int, err error) { - handler.conn.wio.Lock() - defer handler.conn.wio.Unlock() - w, err := handler.conn.frameWriterFactory.NewFrameWriter(PongFrame) - if err != nil { - return 0, err - } - n, err = w.Write(msg) - w.Close() - return n, err -} - -// newHybiConn creates a new WebSocket connection speaking hybi draft protocol. -func newHybiConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { - if buf == nil { - br := bufio.NewReader(rwc) - bw := bufio.NewWriter(rwc) - buf = bufio.NewReadWriter(br, bw) - } - ws := &Conn{config: config, request: request, buf: buf, rwc: rwc, - frameReaderFactory: hybiFrameReaderFactory{buf.Reader}, - frameWriterFactory: hybiFrameWriterFactory{ - buf.Writer, request == nil}, - PayloadType: TextFrame, - defaultCloseStatus: closeStatusNormal} - ws.frameHandler = &hybiFrameHandler{conn: ws} - return ws -} - -// generateMaskingKey generates a masking key for a frame. -func generateMaskingKey() (maskingKey []byte, err error) { - maskingKey = make([]byte, 4) - if _, err = io.ReadFull(rand.Reader, maskingKey); err != nil { - return - } - return -} - -// generateNonce generates a nonce consisting of a randomly selected 16-byte -// value that has been base64-encoded. -func generateNonce() (nonce []byte) { - key := make([]byte, 16) - if _, err := io.ReadFull(rand.Reader, key); err != nil { - panic(err) - } - nonce = make([]byte, 24) - base64.StdEncoding.Encode(nonce, key) - return -} - -// removeZone removes IPv6 zone identifer from host. -// E.g., "[fe80::1%en0]:8080" to "[fe80::1]:8080" -func removeZone(host string) string { - if !strings.HasPrefix(host, "[") { - return host - } - i := strings.LastIndex(host, "]") - if i < 0 { - return host - } - j := strings.LastIndex(host[:i], "%") - if j < 0 { - return host - } - return host[:j] + host[i:] -} - -// getNonceAccept computes the base64-encoded SHA-1 of the concatenation of -// the nonce ("Sec-WebSocket-Key" value) with the websocket GUID string. -func getNonceAccept(nonce []byte) (expected []byte, err error) { - h := sha1.New() - if _, err = h.Write(nonce); err != nil { - return - } - if _, err = h.Write([]byte(websocketGUID)); err != nil { - return - } - expected = make([]byte, 28) - base64.StdEncoding.Encode(expected, h.Sum(nil)) - return -} - -// Client handshake described in draft-ietf-hybi-thewebsocket-protocol-17 -func hybiClientHandshake(config *Config, br *bufio.Reader, bw *bufio.Writer) (err error) { - bw.WriteString("GET " + config.Location.RequestURI() + " HTTP/1.1\r\n") - - // According to RFC 6874, an HTTP client, proxy, or other - // intermediary must remove any IPv6 zone identifier attached - // to an outgoing URI. - bw.WriteString("Host: " + removeZone(config.Location.Host) + "\r\n") - bw.WriteString("Upgrade: websocket\r\n") - bw.WriteString("Connection: Upgrade\r\n") - nonce := generateNonce() - if config.handshakeData != nil { - nonce = []byte(config.handshakeData["key"]) - } - bw.WriteString("Sec-WebSocket-Key: " + string(nonce) + "\r\n") - bw.WriteString("Origin: " + strings.ToLower(config.Origin.String()) + "\r\n") - - if config.Version != ProtocolVersionHybi13 { - return ErrBadProtocolVersion - } - - bw.WriteString("Sec-WebSocket-Version: " + fmt.Sprintf("%d", config.Version) + "\r\n") - if len(config.Protocol) > 0 { - bw.WriteString("Sec-WebSocket-Protocol: " + strings.Join(config.Protocol, ", ") + "\r\n") - } - // TODO(ukai): send Sec-WebSocket-Extensions. - err = config.Header.WriteSubset(bw, handshakeHeader) - if err != nil { - return err - } - - bw.WriteString("\r\n") - if err = bw.Flush(); err != nil { - return err - } - - resp, err := http.ReadResponse(br, &http.Request{Method: "GET"}) - if err != nil { - return err - } - if resp.StatusCode != 101 { - return ErrBadStatus - } - if strings.ToLower(resp.Header.Get("Upgrade")) != "websocket" || - strings.ToLower(resp.Header.Get("Connection")) != "upgrade" { - return ErrBadUpgrade - } - expectedAccept, err := getNonceAccept(nonce) - if err != nil { - return err - } - if resp.Header.Get("Sec-WebSocket-Accept") != string(expectedAccept) { - return ErrChallengeResponse - } - if resp.Header.Get("Sec-WebSocket-Extensions") != "" { - return ErrUnsupportedExtensions - } - offeredProtocol := resp.Header.Get("Sec-WebSocket-Protocol") - if offeredProtocol != "" { - protocolMatched := false - for i := 0; i < len(config.Protocol); i++ { - if config.Protocol[i] == offeredProtocol { - protocolMatched = true - break - } - } - if !protocolMatched { - return ErrBadWebSocketProtocol - } - config.Protocol = []string{offeredProtocol} - } - - return nil -} - -// newHybiClientConn creates a client WebSocket connection after handshake. -func newHybiClientConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser) *Conn { - return newHybiConn(config, buf, rwc, nil) -} - -// A HybiServerHandshaker performs a server handshake using hybi draft protocol. -type hybiServerHandshaker struct { - *Config - accept []byte -} - -func (c *hybiServerHandshaker) ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) { - c.Version = ProtocolVersionHybi13 - if req.Method != "GET" { - return http.StatusMethodNotAllowed, ErrBadRequestMethod - } - // HTTP version can be safely ignored. - - if strings.ToLower(req.Header.Get("Upgrade")) != "websocket" || - !strings.Contains(strings.ToLower(req.Header.Get("Connection")), "upgrade") { - return http.StatusBadRequest, ErrNotWebSocket - } - - key := req.Header.Get("Sec-Websocket-Key") - if key == "" { - return http.StatusBadRequest, ErrChallengeResponse - } - version := req.Header.Get("Sec-Websocket-Version") - switch version { - case "13": - c.Version = ProtocolVersionHybi13 - default: - return http.StatusBadRequest, ErrBadWebSocketVersion - } - var scheme string - if req.TLS != nil { - scheme = "wss" - } else { - scheme = "ws" - } - c.Location, err = url.ParseRequestURI(scheme + "://" + req.Host + req.URL.RequestURI()) - if err != nil { - return http.StatusBadRequest, err - } - protocol := strings.TrimSpace(req.Header.Get("Sec-Websocket-Protocol")) - if protocol != "" { - protocols := strings.Split(protocol, ",") - for i := 0; i < len(protocols); i++ { - c.Protocol = append(c.Protocol, strings.TrimSpace(protocols[i])) - } - } - c.accept, err = getNonceAccept([]byte(key)) - if err != nil { - return http.StatusInternalServerError, err - } - return http.StatusSwitchingProtocols, nil -} - -// Origin parses the Origin header in req. -// If the Origin header is not set, it returns nil and nil. -func Origin(config *Config, req *http.Request) (*url.URL, error) { - var origin string - switch config.Version { - case ProtocolVersionHybi13: - origin = req.Header.Get("Origin") - } - if origin == "" { - return nil, nil - } - return url.ParseRequestURI(origin) -} - -func (c *hybiServerHandshaker) AcceptHandshake(buf *bufio.Writer) (err error) { - if len(c.Protocol) > 0 { - if len(c.Protocol) != 1 { - // You need choose a Protocol in Handshake func in Server. - return ErrBadWebSocketProtocol - } - } - buf.WriteString("HTTP/1.1 101 Switching Protocols\r\n") - buf.WriteString("Upgrade: websocket\r\n") - buf.WriteString("Connection: Upgrade\r\n") - buf.WriteString("Sec-WebSocket-Accept: " + string(c.accept) + "\r\n") - if len(c.Protocol) > 0 { - buf.WriteString("Sec-WebSocket-Protocol: " + c.Protocol[0] + "\r\n") - } - // TODO(ukai): send Sec-WebSocket-Extensions. - if c.Header != nil { - err := c.Header.WriteSubset(buf, handshakeHeader) - if err != nil { - return err - } - } - buf.WriteString("\r\n") - return buf.Flush() -} - -func (c *hybiServerHandshaker) NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { - return newHybiServerConn(c.Config, buf, rwc, request) -} - -// newHybiServerConn returns a new WebSocket connection speaking hybi draft protocol. -func newHybiServerConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { - return newHybiConn(config, buf, rwc, request) -} diff --git a/vendor/golang.org/x/net/websocket/hybi_test.go b/vendor/golang.org/x/net/websocket/hybi_test.go deleted file mode 100644 index 9504aa2d3..000000000 --- a/vendor/golang.org/x/net/websocket/hybi_test.go +++ /dev/null @@ -1,608 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bufio" - "bytes" - "fmt" - "io" - "net/http" - "net/url" - "strings" - "testing" -) - -// Test the getNonceAccept function with values in -// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 -func TestSecWebSocketAccept(t *testing.T) { - nonce := []byte("dGhlIHNhbXBsZSBub25jZQ==") - expected := []byte("s3pPLMBiTxaQ9kYGzzhZRbK+xOo=") - accept, err := getNonceAccept(nonce) - if err != nil { - t.Errorf("getNonceAccept: returned error %v", err) - return - } - if !bytes.Equal(expected, accept) { - t.Errorf("getNonceAccept: expected %q got %q", expected, accept) - } -} - -func TestHybiClientHandshake(t *testing.T) { - type test struct { - url, host string - } - tests := []test{ - {"ws://server.example.com/chat", "server.example.com"}, - {"ws://127.0.0.1/chat", "127.0.0.1"}, - } - if _, err := url.ParseRequestURI("http://[fe80::1%25lo0]"); err == nil { - tests = append(tests, test{"ws://[fe80::1%25lo0]/chat", "[fe80::1]"}) - } - - for _, tt := range tests { - var b bytes.Buffer - bw := bufio.NewWriter(&b) - br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols -Upgrade: websocket -Connection: Upgrade -Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= -Sec-WebSocket-Protocol: chat - -`)) - var err error - var config Config - config.Location, err = url.ParseRequestURI(tt.url) - if err != nil { - t.Fatal("location url", err) - } - config.Origin, err = url.ParseRequestURI("http://example.com") - if err != nil { - t.Fatal("origin url", err) - } - config.Protocol = append(config.Protocol, "chat") - config.Protocol = append(config.Protocol, "superchat") - config.Version = ProtocolVersionHybi13 - config.handshakeData = map[string]string{ - "key": "dGhlIHNhbXBsZSBub25jZQ==", - } - if err := hybiClientHandshake(&config, br, bw); err != nil { - t.Fatal("handshake", err) - } - req, err := http.ReadRequest(bufio.NewReader(&b)) - if err != nil { - t.Fatal("read request", err) - } - if req.Method != "GET" { - t.Errorf("request method expected GET, but got %s", req.Method) - } - if req.URL.Path != "/chat" { - t.Errorf("request path expected /chat, but got %s", req.URL.Path) - } - if req.Proto != "HTTP/1.1" { - t.Errorf("request proto expected HTTP/1.1, but got %s", req.Proto) - } - if req.Host != tt.host { - t.Errorf("request host expected %s, but got %s", tt.host, req.Host) - } - var expectedHeader = map[string]string{ - "Connection": "Upgrade", - "Upgrade": "websocket", - "Sec-Websocket-Key": config.handshakeData["key"], - "Origin": config.Origin.String(), - "Sec-Websocket-Protocol": "chat, superchat", - "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), - } - for k, v := range expectedHeader { - if req.Header.Get(k) != v { - t.Errorf("%s expected %s, but got %v", k, v, req.Header.Get(k)) - } - } - } -} - -func TestHybiClientHandshakeWithHeader(t *testing.T) { - b := bytes.NewBuffer([]byte{}) - bw := bufio.NewWriter(b) - br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols -Upgrade: websocket -Connection: Upgrade -Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= -Sec-WebSocket-Protocol: chat - -`)) - var err error - config := new(Config) - config.Location, err = url.ParseRequestURI("ws://server.example.com/chat") - if err != nil { - t.Fatal("location url", err) - } - config.Origin, err = url.ParseRequestURI("http://example.com") - if err != nil { - t.Fatal("origin url", err) - } - config.Protocol = append(config.Protocol, "chat") - config.Protocol = append(config.Protocol, "superchat") - config.Version = ProtocolVersionHybi13 - config.Header = http.Header(make(map[string][]string)) - config.Header.Add("User-Agent", "test") - - config.handshakeData = map[string]string{ - "key": "dGhlIHNhbXBsZSBub25jZQ==", - } - err = hybiClientHandshake(config, br, bw) - if err != nil { - t.Errorf("handshake failed: %v", err) - } - req, err := http.ReadRequest(bufio.NewReader(b)) - if err != nil { - t.Fatalf("read request: %v", err) - } - if req.Method != "GET" { - t.Errorf("request method expected GET, but got %q", req.Method) - } - if req.URL.Path != "/chat" { - t.Errorf("request path expected /chat, but got %q", req.URL.Path) - } - if req.Proto != "HTTP/1.1" { - t.Errorf("request proto expected HTTP/1.1, but got %q", req.Proto) - } - if req.Host != "server.example.com" { - t.Errorf("request Host expected server.example.com, but got %v", req.Host) - } - var expectedHeader = map[string]string{ - "Connection": "Upgrade", - "Upgrade": "websocket", - "Sec-Websocket-Key": config.handshakeData["key"], - "Origin": config.Origin.String(), - "Sec-Websocket-Protocol": "chat, superchat", - "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), - "User-Agent": "test", - } - for k, v := range expectedHeader { - if req.Header.Get(k) != v { - t.Errorf(fmt.Sprintf("%s expected %q but got %q", k, v, req.Header.Get(k))) - } - } -} - -func TestHybiServerHandshake(t *testing.T) { - config := new(Config) - handshaker := &hybiServerHandshaker{Config: config} - br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 -Host: server.example.com -Upgrade: websocket -Connection: Upgrade -Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== -Origin: http://example.com -Sec-WebSocket-Protocol: chat, superchat -Sec-WebSocket-Version: 13 - -`)) - req, err := http.ReadRequest(br) - if err != nil { - t.Fatal("request", err) - } - code, err := handshaker.ReadHandshake(br, req) - if err != nil { - t.Errorf("handshake failed: %v", err) - } - if code != http.StatusSwitchingProtocols { - t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) - } - expectedProtocols := []string{"chat", "superchat"} - if fmt.Sprintf("%v", config.Protocol) != fmt.Sprintf("%v", expectedProtocols) { - t.Errorf("protocol expected %q but got %q", expectedProtocols, config.Protocol) - } - b := bytes.NewBuffer([]byte{}) - bw := bufio.NewWriter(b) - - config.Protocol = config.Protocol[:1] - - err = handshaker.AcceptHandshake(bw) - if err != nil { - t.Errorf("handshake response failed: %v", err) - } - expectedResponse := strings.Join([]string{ - "HTTP/1.1 101 Switching Protocols", - "Upgrade: websocket", - "Connection: Upgrade", - "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", - "Sec-WebSocket-Protocol: chat", - "", ""}, "\r\n") - - if b.String() != expectedResponse { - t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) - } -} - -func TestHybiServerHandshakeNoSubProtocol(t *testing.T) { - config := new(Config) - handshaker := &hybiServerHandshaker{Config: config} - br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 -Host: server.example.com -Upgrade: websocket -Connection: Upgrade -Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== -Origin: http://example.com -Sec-WebSocket-Version: 13 - -`)) - req, err := http.ReadRequest(br) - if err != nil { - t.Fatal("request", err) - } - code, err := handshaker.ReadHandshake(br, req) - if err != nil { - t.Errorf("handshake failed: %v", err) - } - if code != http.StatusSwitchingProtocols { - t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) - } - if len(config.Protocol) != 0 { - t.Errorf("len(config.Protocol) expected 0, but got %q", len(config.Protocol)) - } - b := bytes.NewBuffer([]byte{}) - bw := bufio.NewWriter(b) - - err = handshaker.AcceptHandshake(bw) - if err != nil { - t.Errorf("handshake response failed: %v", err) - } - expectedResponse := strings.Join([]string{ - "HTTP/1.1 101 Switching Protocols", - "Upgrade: websocket", - "Connection: Upgrade", - "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", - "", ""}, "\r\n") - - if b.String() != expectedResponse { - t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) - } -} - -func TestHybiServerHandshakeHybiBadVersion(t *testing.T) { - config := new(Config) - handshaker := &hybiServerHandshaker{Config: config} - br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 -Host: server.example.com -Upgrade: websocket -Connection: Upgrade -Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== -Sec-WebSocket-Origin: http://example.com -Sec-WebSocket-Protocol: chat, superchat -Sec-WebSocket-Version: 9 - -`)) - req, err := http.ReadRequest(br) - if err != nil { - t.Fatal("request", err) - } - code, err := handshaker.ReadHandshake(br, req) - if err != ErrBadWebSocketVersion { - t.Errorf("handshake expected err %q but got %q", ErrBadWebSocketVersion, err) - } - if code != http.StatusBadRequest { - t.Errorf("status expected %q but got %q", http.StatusBadRequest, code) - } -} - -func testHybiFrame(t *testing.T, testHeader, testPayload, testMaskedPayload []byte, frameHeader *hybiFrameHeader) { - b := bytes.NewBuffer([]byte{}) - frameWriterFactory := &hybiFrameWriterFactory{bufio.NewWriter(b), false} - w, _ := frameWriterFactory.NewFrameWriter(TextFrame) - w.(*hybiFrameWriter).header = frameHeader - _, err := w.Write(testPayload) - w.Close() - if err != nil { - t.Errorf("Write error %q", err) - } - var expectedFrame []byte - expectedFrame = append(expectedFrame, testHeader...) - expectedFrame = append(expectedFrame, testMaskedPayload...) - if !bytes.Equal(expectedFrame, b.Bytes()) { - t.Errorf("frame expected %q got %q", expectedFrame, b.Bytes()) - } - frameReaderFactory := &hybiFrameReaderFactory{bufio.NewReader(b)} - r, err := frameReaderFactory.NewFrameReader() - if err != nil { - t.Errorf("Read error %q", err) - } - if header := r.HeaderReader(); header == nil { - t.Errorf("no header") - } else { - actualHeader := make([]byte, r.Len()) - n, err := header.Read(actualHeader) - if err != nil { - t.Errorf("Read header error %q", err) - } else { - if n < len(testHeader) { - t.Errorf("header too short %q got %q", testHeader, actualHeader[:n]) - } - if !bytes.Equal(testHeader, actualHeader[:n]) { - t.Errorf("header expected %q got %q", testHeader, actualHeader[:n]) - } - } - } - if trailer := r.TrailerReader(); trailer != nil { - t.Errorf("unexpected trailer %q", trailer) - } - frame := r.(*hybiFrameReader) - if frameHeader.Fin != frame.header.Fin || - frameHeader.OpCode != frame.header.OpCode || - len(testPayload) != int(frame.header.Length) { - t.Errorf("mismatch %v (%d) vs %v", frameHeader, len(testPayload), frame) - } - payload := make([]byte, len(testPayload)) - _, err = r.Read(payload) - if err != nil && err != io.EOF { - t.Errorf("read %v", err) - } - if !bytes.Equal(testPayload, payload) { - t.Errorf("payload %q vs %q", testPayload, payload) - } -} - -func TestHybiShortTextFrame(t *testing.T) { - frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} - payload := []byte("hello") - testHybiFrame(t, []byte{0x81, 0x05}, payload, payload, frameHeader) - - payload = make([]byte, 125) - testHybiFrame(t, []byte{0x81, 125}, payload, payload, frameHeader) -} - -func TestHybiShortMaskedTextFrame(t *testing.T) { - frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame, - MaskingKey: []byte{0xcc, 0x55, 0x80, 0x20}} - payload := []byte("hello") - maskedPayload := []byte{0xa4, 0x30, 0xec, 0x4c, 0xa3} - header := []byte{0x81, 0x85} - header = append(header, frameHeader.MaskingKey...) - testHybiFrame(t, header, payload, maskedPayload, frameHeader) -} - -func TestHybiShortBinaryFrame(t *testing.T) { - frameHeader := &hybiFrameHeader{Fin: true, OpCode: BinaryFrame} - payload := []byte("hello") - testHybiFrame(t, []byte{0x82, 0x05}, payload, payload, frameHeader) - - payload = make([]byte, 125) - testHybiFrame(t, []byte{0x82, 125}, payload, payload, frameHeader) -} - -func TestHybiControlFrame(t *testing.T) { - payload := []byte("hello") - - frameHeader := &hybiFrameHeader{Fin: true, OpCode: PingFrame} - testHybiFrame(t, []byte{0x89, 0x05}, payload, payload, frameHeader) - - frameHeader = &hybiFrameHeader{Fin: true, OpCode: PingFrame} - testHybiFrame(t, []byte{0x89, 0x00}, nil, nil, frameHeader) - - frameHeader = &hybiFrameHeader{Fin: true, OpCode: PongFrame} - testHybiFrame(t, []byte{0x8A, 0x05}, payload, payload, frameHeader) - - frameHeader = &hybiFrameHeader{Fin: true, OpCode: PongFrame} - testHybiFrame(t, []byte{0x8A, 0x00}, nil, nil, frameHeader) - - frameHeader = &hybiFrameHeader{Fin: true, OpCode: CloseFrame} - payload = []byte{0x03, 0xe8} // 1000 - testHybiFrame(t, []byte{0x88, 0x02}, payload, payload, frameHeader) -} - -func TestHybiLongFrame(t *testing.T) { - frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} - payload := make([]byte, 126) - testHybiFrame(t, []byte{0x81, 126, 0x00, 126}, payload, payload, frameHeader) - - payload = make([]byte, 65535) - testHybiFrame(t, []byte{0x81, 126, 0xff, 0xff}, payload, payload, frameHeader) - - payload = make([]byte, 65536) - testHybiFrame(t, []byte{0x81, 127, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}, payload, payload, frameHeader) -} - -func TestHybiClientRead(t *testing.T) { - wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', - 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping - 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} - br := bufio.NewReader(bytes.NewBuffer(wireData)) - bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) - conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) - - msg := make([]byte, 512) - n, err := conn.Read(msg) - if err != nil { - t.Errorf("read 1st frame, error %q", err) - } - if n != 5 { - t.Errorf("read 1st frame, expect 5, got %d", n) - } - if !bytes.Equal(wireData[2:7], msg[:n]) { - t.Errorf("read 1st frame %v, got %v", wireData[2:7], msg[:n]) - } - n, err = conn.Read(msg) - if err != nil { - t.Errorf("read 2nd frame, error %q", err) - } - if n != 5 { - t.Errorf("read 2nd frame, expect 5, got %d", n) - } - if !bytes.Equal(wireData[16:21], msg[:n]) { - t.Errorf("read 2nd frame %v, got %v", wireData[16:21], msg[:n]) - } - n, err = conn.Read(msg) - if err == nil { - t.Errorf("read not EOF") - } - if n != 0 { - t.Errorf("expect read 0, got %d", n) - } -} - -func TestHybiShortRead(t *testing.T) { - wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', - 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping - 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} - br := bufio.NewReader(bytes.NewBuffer(wireData)) - bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) - conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) - - step := 0 - pos := 0 - expectedPos := []int{2, 5, 16, 19} - expectedLen := []int{3, 2, 3, 2} - for { - msg := make([]byte, 3) - n, err := conn.Read(msg) - if step >= len(expectedPos) { - if err == nil { - t.Errorf("read not EOF") - } - if n != 0 { - t.Errorf("expect read 0, got %d", n) - } - return - } - pos = expectedPos[step] - endPos := pos + expectedLen[step] - if err != nil { - t.Errorf("read from %d, got error %q", pos, err) - return - } - if n != endPos-pos { - t.Errorf("read from %d, expect %d, got %d", pos, endPos-pos, n) - } - if !bytes.Equal(wireData[pos:endPos], msg[:n]) { - t.Errorf("read from %d, frame %v, got %v", pos, wireData[pos:endPos], msg[:n]) - } - step++ - } -} - -func TestHybiServerRead(t *testing.T) { - wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, - 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello - 0x89, 0x85, 0xcc, 0x55, 0x80, 0x20, - 0xa4, 0x30, 0xec, 0x4c, 0xa3, // ping: hello - 0x81, 0x85, 0xed, 0x83, 0xb4, 0x24, - 0x9a, 0xec, 0xc6, 0x48, 0x89, // world - } - br := bufio.NewReader(bytes.NewBuffer(wireData)) - bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) - conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) - - expected := [][]byte{[]byte("hello"), []byte("world")} - - msg := make([]byte, 512) - n, err := conn.Read(msg) - if err != nil { - t.Errorf("read 1st frame, error %q", err) - } - if n != 5 { - t.Errorf("read 1st frame, expect 5, got %d", n) - } - if !bytes.Equal(expected[0], msg[:n]) { - t.Errorf("read 1st frame %q, got %q", expected[0], msg[:n]) - } - - n, err = conn.Read(msg) - if err != nil { - t.Errorf("read 2nd frame, error %q", err) - } - if n != 5 { - t.Errorf("read 2nd frame, expect 5, got %d", n) - } - if !bytes.Equal(expected[1], msg[:n]) { - t.Errorf("read 2nd frame %q, got %q", expected[1], msg[:n]) - } - - n, err = conn.Read(msg) - if err == nil { - t.Errorf("read not EOF") - } - if n != 0 { - t.Errorf("expect read 0, got %d", n) - } -} - -func TestHybiServerReadWithoutMasking(t *testing.T) { - wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o'} - br := bufio.NewReader(bytes.NewBuffer(wireData)) - bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) - conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) - // server MUST close the connection upon receiving a non-masked frame. - msg := make([]byte, 512) - _, err := conn.Read(msg) - if err != io.EOF { - t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) - } -} - -func TestHybiClientReadWithMasking(t *testing.T) { - wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, - 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello - } - br := bufio.NewReader(bytes.NewBuffer(wireData)) - bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) - conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) - - // client MUST close the connection upon receiving a masked frame. - msg := make([]byte, 512) - _, err := conn.Read(msg) - if err != io.EOF { - t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) - } -} - -// Test the hybiServerHandshaker supports firefox implementation and -// checks Connection request header include (but it's not necessary -// equal to) "upgrade" -func TestHybiServerFirefoxHandshake(t *testing.T) { - config := new(Config) - handshaker := &hybiServerHandshaker{Config: config} - br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 -Host: server.example.com -Upgrade: websocket -Connection: keep-alive, upgrade -Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== -Origin: http://example.com -Sec-WebSocket-Protocol: chat, superchat -Sec-WebSocket-Version: 13 - -`)) - req, err := http.ReadRequest(br) - if err != nil { - t.Fatal("request", err) - } - code, err := handshaker.ReadHandshake(br, req) - if err != nil { - t.Errorf("handshake failed: %v", err) - } - if code != http.StatusSwitchingProtocols { - t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) - } - b := bytes.NewBuffer([]byte{}) - bw := bufio.NewWriter(b) - - config.Protocol = []string{"chat"} - - err = handshaker.AcceptHandshake(bw) - if err != nil { - t.Errorf("handshake response failed: %v", err) - } - expectedResponse := strings.Join([]string{ - "HTTP/1.1 101 Switching Protocols", - "Upgrade: websocket", - "Connection: Upgrade", - "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", - "Sec-WebSocket-Protocol: chat", - "", ""}, "\r\n") - - if b.String() != expectedResponse { - t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) - } -} diff --git a/vendor/golang.org/x/net/websocket/server.go b/vendor/golang.org/x/net/websocket/server.go deleted file mode 100644 index 0895dea19..000000000 --- a/vendor/golang.org/x/net/websocket/server.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bufio" - "fmt" - "io" - "net/http" -) - -func newServerConn(rwc io.ReadWriteCloser, buf *bufio.ReadWriter, req *http.Request, config *Config, handshake func(*Config, *http.Request) error) (conn *Conn, err error) { - var hs serverHandshaker = &hybiServerHandshaker{Config: config} - code, err := hs.ReadHandshake(buf.Reader, req) - if err == ErrBadWebSocketVersion { - fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) - fmt.Fprintf(buf, "Sec-WebSocket-Version: %s\r\n", SupportedProtocolVersion) - buf.WriteString("\r\n") - buf.WriteString(err.Error()) - buf.Flush() - return - } - if err != nil { - fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) - buf.WriteString("\r\n") - buf.WriteString(err.Error()) - buf.Flush() - return - } - if handshake != nil { - err = handshake(config, req) - if err != nil { - code = http.StatusForbidden - fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) - buf.WriteString("\r\n") - buf.Flush() - return - } - } - err = hs.AcceptHandshake(buf.Writer) - if err != nil { - code = http.StatusBadRequest - fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) - buf.WriteString("\r\n") - buf.Flush() - return - } - conn = hs.NewServerConn(buf, rwc, req) - return -} - -// Server represents a server of a WebSocket. -type Server struct { - // Config is a WebSocket configuration for new WebSocket connection. - Config - - // Handshake is an optional function in WebSocket handshake. - // For example, you can check, or don't check Origin header. - // Another example, you can select config.Protocol. - Handshake func(*Config, *http.Request) error - - // Handler handles a WebSocket connection. - Handler -} - -// ServeHTTP implements the http.Handler interface for a WebSocket -func (s Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { - s.serveWebSocket(w, req) -} - -func (s Server) serveWebSocket(w http.ResponseWriter, req *http.Request) { - rwc, buf, err := w.(http.Hijacker).Hijack() - if err != nil { - panic("Hijack failed: " + err.Error()) - } - // The server should abort the WebSocket connection if it finds - // the client did not send a handshake that matches with protocol - // specification. - defer rwc.Close() - conn, err := newServerConn(rwc, buf, req, &s.Config, s.Handshake) - if err != nil { - return - } - if conn == nil { - panic("unexpected nil conn") - } - s.Handler(conn) -} - -// Handler is a simple interface to a WebSocket browser client. -// It checks if Origin header is valid URL by default. -// You might want to verify websocket.Conn.Config().Origin in the func. -// If you use Server instead of Handler, you could call websocket.Origin and -// check the origin in your Handshake func. So, if you want to accept -// non-browser clients, which do not send an Origin header, set a -// Server.Handshake that does not check the origin. -type Handler func(*Conn) - -func checkOrigin(config *Config, req *http.Request) (err error) { - config.Origin, err = Origin(config, req) - if err == nil && config.Origin == nil { - return fmt.Errorf("null origin") - } - return err -} - -// ServeHTTP implements the http.Handler interface for a WebSocket -func (h Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) { - s := Server{Handler: h, Handshake: checkOrigin} - s.serveWebSocket(w, req) -} diff --git a/vendor/golang.org/x/net/websocket/websocket.go b/vendor/golang.org/x/net/websocket/websocket.go deleted file mode 100644 index e242c89a7..000000000 --- a/vendor/golang.org/x/net/websocket/websocket.go +++ /dev/null @@ -1,448 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package websocket implements a client and server for the WebSocket protocol -// as specified in RFC 6455. -// -// This package currently lacks some features found in an alternative -// and more actively maintained WebSocket package: -// -// https://godoc.org/github.com/gorilla/websocket -// -package websocket // import "golang.org/x/net/websocket" - -import ( - "bufio" - "crypto/tls" - "encoding/json" - "errors" - "io" - "io/ioutil" - "net" - "net/http" - "net/url" - "sync" - "time" -) - -const ( - ProtocolVersionHybi13 = 13 - ProtocolVersionHybi = ProtocolVersionHybi13 - SupportedProtocolVersion = "13" - - ContinuationFrame = 0 - TextFrame = 1 - BinaryFrame = 2 - CloseFrame = 8 - PingFrame = 9 - PongFrame = 10 - UnknownFrame = 255 - - DefaultMaxPayloadBytes = 32 << 20 // 32MB -) - -// ProtocolError represents WebSocket protocol errors. -type ProtocolError struct { - ErrorString string -} - -func (err *ProtocolError) Error() string { return err.ErrorString } - -var ( - ErrBadProtocolVersion = &ProtocolError{"bad protocol version"} - ErrBadScheme = &ProtocolError{"bad scheme"} - ErrBadStatus = &ProtocolError{"bad status"} - ErrBadUpgrade = &ProtocolError{"missing or bad upgrade"} - ErrBadWebSocketOrigin = &ProtocolError{"missing or bad WebSocket-Origin"} - ErrBadWebSocketLocation = &ProtocolError{"missing or bad WebSocket-Location"} - ErrBadWebSocketProtocol = &ProtocolError{"missing or bad WebSocket-Protocol"} - ErrBadWebSocketVersion = &ProtocolError{"missing or bad WebSocket Version"} - ErrChallengeResponse = &ProtocolError{"mismatch challenge/response"} - ErrBadFrame = &ProtocolError{"bad frame"} - ErrBadFrameBoundary = &ProtocolError{"not on frame boundary"} - ErrNotWebSocket = &ProtocolError{"not websocket protocol"} - ErrBadRequestMethod = &ProtocolError{"bad method"} - ErrNotSupported = &ProtocolError{"not supported"} -) - -// ErrFrameTooLarge is returned by Codec's Receive method if payload size -// exceeds limit set by Conn.MaxPayloadBytes -var ErrFrameTooLarge = errors.New("websocket: frame payload size exceeds limit") - -// Addr is an implementation of net.Addr for WebSocket. -type Addr struct { - *url.URL -} - -// Network returns the network type for a WebSocket, "websocket". -func (addr *Addr) Network() string { return "websocket" } - -// Config is a WebSocket configuration -type Config struct { - // A WebSocket server address. - Location *url.URL - - // A Websocket client origin. - Origin *url.URL - - // WebSocket subprotocols. - Protocol []string - - // WebSocket protocol version. - Version int - - // TLS config for secure WebSocket (wss). - TlsConfig *tls.Config - - // Additional header fields to be sent in WebSocket opening handshake. - Header http.Header - - // Dialer used when opening websocket connections. - Dialer *net.Dialer - - handshakeData map[string]string -} - -// serverHandshaker is an interface to handle WebSocket server side handshake. -type serverHandshaker interface { - // ReadHandshake reads handshake request message from client. - // Returns http response code and error if any. - ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) - - // AcceptHandshake accepts the client handshake request and sends - // handshake response back to client. - AcceptHandshake(buf *bufio.Writer) (err error) - - // NewServerConn creates a new WebSocket connection. - NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) (conn *Conn) -} - -// frameReader is an interface to read a WebSocket frame. -type frameReader interface { - // Reader is to read payload of the frame. - io.Reader - - // PayloadType returns payload type. - PayloadType() byte - - // HeaderReader returns a reader to read header of the frame. - HeaderReader() io.Reader - - // TrailerReader returns a reader to read trailer of the frame. - // If it returns nil, there is no trailer in the frame. - TrailerReader() io.Reader - - // Len returns total length of the frame, including header and trailer. - Len() int -} - -// frameReaderFactory is an interface to creates new frame reader. -type frameReaderFactory interface { - NewFrameReader() (r frameReader, err error) -} - -// frameWriter is an interface to write a WebSocket frame. -type frameWriter interface { - // Writer is to write payload of the frame. - io.WriteCloser -} - -// frameWriterFactory is an interface to create new frame writer. -type frameWriterFactory interface { - NewFrameWriter(payloadType byte) (w frameWriter, err error) -} - -type frameHandler interface { - HandleFrame(frame frameReader) (r frameReader, err error) - WriteClose(status int) (err error) -} - -// Conn represents a WebSocket connection. -// -// Multiple goroutines may invoke methods on a Conn simultaneously. -type Conn struct { - config *Config - request *http.Request - - buf *bufio.ReadWriter - rwc io.ReadWriteCloser - - rio sync.Mutex - frameReaderFactory - frameReader - - wio sync.Mutex - frameWriterFactory - - frameHandler - PayloadType byte - defaultCloseStatus int - - // MaxPayloadBytes limits the size of frame payload received over Conn - // by Codec's Receive method. If zero, DefaultMaxPayloadBytes is used. - MaxPayloadBytes int -} - -// Read implements the io.Reader interface: -// it reads data of a frame from the WebSocket connection. -// if msg is not large enough for the frame data, it fills the msg and next Read -// will read the rest of the frame data. -// it reads Text frame or Binary frame. -func (ws *Conn) Read(msg []byte) (n int, err error) { - ws.rio.Lock() - defer ws.rio.Unlock() -again: - if ws.frameReader == nil { - frame, err := ws.frameReaderFactory.NewFrameReader() - if err != nil { - return 0, err - } - ws.frameReader, err = ws.frameHandler.HandleFrame(frame) - if err != nil { - return 0, err - } - if ws.frameReader == nil { - goto again - } - } - n, err = ws.frameReader.Read(msg) - if err == io.EOF { - if trailer := ws.frameReader.TrailerReader(); trailer != nil { - io.Copy(ioutil.Discard, trailer) - } - ws.frameReader = nil - goto again - } - return n, err -} - -// Write implements the io.Writer interface: -// it writes data as a frame to the WebSocket connection. -func (ws *Conn) Write(msg []byte) (n int, err error) { - ws.wio.Lock() - defer ws.wio.Unlock() - w, err := ws.frameWriterFactory.NewFrameWriter(ws.PayloadType) - if err != nil { - return 0, err - } - n, err = w.Write(msg) - w.Close() - return n, err -} - -// Close implements the io.Closer interface. -func (ws *Conn) Close() error { - err := ws.frameHandler.WriteClose(ws.defaultCloseStatus) - err1 := ws.rwc.Close() - if err != nil { - return err - } - return err1 -} - -func (ws *Conn) IsClientConn() bool { return ws.request == nil } -func (ws *Conn) IsServerConn() bool { return ws.request != nil } - -// LocalAddr returns the WebSocket Origin for the connection for client, or -// the WebSocket location for server. -func (ws *Conn) LocalAddr() net.Addr { - if ws.IsClientConn() { - return &Addr{ws.config.Origin} - } - return &Addr{ws.config.Location} -} - -// RemoteAddr returns the WebSocket location for the connection for client, or -// the Websocket Origin for server. -func (ws *Conn) RemoteAddr() net.Addr { - if ws.IsClientConn() { - return &Addr{ws.config.Location} - } - return &Addr{ws.config.Origin} -} - -var errSetDeadline = errors.New("websocket: cannot set deadline: not using a net.Conn") - -// SetDeadline sets the connection's network read & write deadlines. -func (ws *Conn) SetDeadline(t time.Time) error { - if conn, ok := ws.rwc.(net.Conn); ok { - return conn.SetDeadline(t) - } - return errSetDeadline -} - -// SetReadDeadline sets the connection's network read deadline. -func (ws *Conn) SetReadDeadline(t time.Time) error { - if conn, ok := ws.rwc.(net.Conn); ok { - return conn.SetReadDeadline(t) - } - return errSetDeadline -} - -// SetWriteDeadline sets the connection's network write deadline. -func (ws *Conn) SetWriteDeadline(t time.Time) error { - if conn, ok := ws.rwc.(net.Conn); ok { - return conn.SetWriteDeadline(t) - } - return errSetDeadline -} - -// Config returns the WebSocket config. -func (ws *Conn) Config() *Config { return ws.config } - -// Request returns the http request upgraded to the WebSocket. -// It is nil for client side. -func (ws *Conn) Request() *http.Request { return ws.request } - -// Codec represents a symmetric pair of functions that implement a codec. -type Codec struct { - Marshal func(v interface{}) (data []byte, payloadType byte, err error) - Unmarshal func(data []byte, payloadType byte, v interface{}) (err error) -} - -// Send sends v marshaled by cd.Marshal as single frame to ws. -func (cd Codec) Send(ws *Conn, v interface{}) (err error) { - data, payloadType, err := cd.Marshal(v) - if err != nil { - return err - } - ws.wio.Lock() - defer ws.wio.Unlock() - w, err := ws.frameWriterFactory.NewFrameWriter(payloadType) - if err != nil { - return err - } - _, err = w.Write(data) - w.Close() - return err -} - -// Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores -// in v. The whole frame payload is read to an in-memory buffer; max size of -// payload is defined by ws.MaxPayloadBytes. If frame payload size exceeds -// limit, ErrFrameTooLarge is returned; in this case frame is not read off wire -// completely. The next call to Receive would read and discard leftover data of -// previous oversized frame before processing next frame. -func (cd Codec) Receive(ws *Conn, v interface{}) (err error) { - ws.rio.Lock() - defer ws.rio.Unlock() - if ws.frameReader != nil { - _, err = io.Copy(ioutil.Discard, ws.frameReader) - if err != nil { - return err - } - ws.frameReader = nil - } -again: - frame, err := ws.frameReaderFactory.NewFrameReader() - if err != nil { - return err - } - frame, err = ws.frameHandler.HandleFrame(frame) - if err != nil { - return err - } - if frame == nil { - goto again - } - maxPayloadBytes := ws.MaxPayloadBytes - if maxPayloadBytes == 0 { - maxPayloadBytes = DefaultMaxPayloadBytes - } - if hf, ok := frame.(*hybiFrameReader); ok && hf.header.Length > int64(maxPayloadBytes) { - // payload size exceeds limit, no need to call Unmarshal - // - // set frameReader to current oversized frame so that - // the next call to this function can drain leftover - // data before processing the next frame - ws.frameReader = frame - return ErrFrameTooLarge - } - payloadType := frame.PayloadType() - data, err := ioutil.ReadAll(frame) - if err != nil { - return err - } - return cd.Unmarshal(data, payloadType, v) -} - -func marshal(v interface{}) (msg []byte, payloadType byte, err error) { - switch data := v.(type) { - case string: - return []byte(data), TextFrame, nil - case []byte: - return data, BinaryFrame, nil - } - return nil, UnknownFrame, ErrNotSupported -} - -func unmarshal(msg []byte, payloadType byte, v interface{}) (err error) { - switch data := v.(type) { - case *string: - *data = string(msg) - return nil - case *[]byte: - *data = msg - return nil - } - return ErrNotSupported -} - -/* -Message is a codec to send/receive text/binary data in a frame on WebSocket connection. -To send/receive text frame, use string type. -To send/receive binary frame, use []byte type. - -Trivial usage: - - import "websocket" - - // receive text frame - var message string - websocket.Message.Receive(ws, &message) - - // send text frame - message = "hello" - websocket.Message.Send(ws, message) - - // receive binary frame - var data []byte - websocket.Message.Receive(ws, &data) - - // send binary frame - data = []byte{0, 1, 2} - websocket.Message.Send(ws, data) - -*/ -var Message = Codec{marshal, unmarshal} - -func jsonMarshal(v interface{}) (msg []byte, payloadType byte, err error) { - msg, err = json.Marshal(v) - return msg, TextFrame, err -} - -func jsonUnmarshal(msg []byte, payloadType byte, v interface{}) (err error) { - return json.Unmarshal(msg, v) -} - -/* -JSON is a codec to send/receive JSON data in a frame from a WebSocket connection. - -Trivial usage: - - import "websocket" - - type T struct { - Msg string - Count int - } - - // receive JSON type T - var data T - websocket.JSON.Receive(ws, &data) - - // send JSON type T - websocket.JSON.Send(ws, data) -*/ -var JSON = Codec{jsonMarshal, jsonUnmarshal} diff --git a/vendor/golang.org/x/net/websocket/websocket_test.go b/vendor/golang.org/x/net/websocket/websocket_test.go deleted file mode 100644 index 2054ce85a..000000000 --- a/vendor/golang.org/x/net/websocket/websocket_test.go +++ /dev/null @@ -1,665 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bytes" - "crypto/rand" - "fmt" - "io" - "log" - "net" - "net/http" - "net/http/httptest" - "net/url" - "reflect" - "runtime" - "strings" - "sync" - "testing" - "time" -) - -var serverAddr string -var once sync.Once - -func echoServer(ws *Conn) { - defer ws.Close() - io.Copy(ws, ws) -} - -type Count struct { - S string - N int -} - -func countServer(ws *Conn) { - defer ws.Close() - for { - var count Count - err := JSON.Receive(ws, &count) - if err != nil { - return - } - count.N++ - count.S = strings.Repeat(count.S, count.N) - err = JSON.Send(ws, count) - if err != nil { - return - } - } -} - -type testCtrlAndDataHandler struct { - hybiFrameHandler -} - -func (h *testCtrlAndDataHandler) WritePing(b []byte) (int, error) { - h.hybiFrameHandler.conn.wio.Lock() - defer h.hybiFrameHandler.conn.wio.Unlock() - w, err := h.hybiFrameHandler.conn.frameWriterFactory.NewFrameWriter(PingFrame) - if err != nil { - return 0, err - } - n, err := w.Write(b) - w.Close() - return n, err -} - -func ctrlAndDataServer(ws *Conn) { - defer ws.Close() - h := &testCtrlAndDataHandler{hybiFrameHandler: hybiFrameHandler{conn: ws}} - ws.frameHandler = h - - go func() { - for i := 0; ; i++ { - var b []byte - if i%2 != 0 { // with or without payload - b = []byte(fmt.Sprintf("#%d-CONTROL-FRAME-FROM-SERVER", i)) - } - if _, err := h.WritePing(b); err != nil { - break - } - if _, err := h.WritePong(b); err != nil { // unsolicited pong - break - } - time.Sleep(10 * time.Millisecond) - } - }() - - b := make([]byte, 128) - for { - n, err := ws.Read(b) - if err != nil { - break - } - if _, err := ws.Write(b[:n]); err != nil { - break - } - } -} - -func subProtocolHandshake(config *Config, req *http.Request) error { - for _, proto := range config.Protocol { - if proto == "chat" { - config.Protocol = []string{proto} - return nil - } - } - return ErrBadWebSocketProtocol -} - -func subProtoServer(ws *Conn) { - for _, proto := range ws.Config().Protocol { - io.WriteString(ws, proto) - } -} - -func startServer() { - http.Handle("/echo", Handler(echoServer)) - http.Handle("/count", Handler(countServer)) - http.Handle("/ctrldata", Handler(ctrlAndDataServer)) - subproto := Server{ - Handshake: subProtocolHandshake, - Handler: Handler(subProtoServer), - } - http.Handle("/subproto", subproto) - server := httptest.NewServer(nil) - serverAddr = server.Listener.Addr().String() - log.Print("Test WebSocket server listening on ", serverAddr) -} - -func newConfig(t *testing.T, path string) *Config { - config, _ := NewConfig(fmt.Sprintf("ws://%s%s", serverAddr, path), "http://localhost") - return config -} - -func TestEcho(t *testing.T) { - once.Do(startServer) - - // websocket.Dial() - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - conn, err := NewClient(newConfig(t, "/echo"), client) - if err != nil { - t.Errorf("WebSocket handshake error: %v", err) - return - } - - msg := []byte("hello, world\n") - if _, err := conn.Write(msg); err != nil { - t.Errorf("Write: %v", err) - } - var actual_msg = make([]byte, 512) - n, err := conn.Read(actual_msg) - if err != nil { - t.Errorf("Read: %v", err) - } - actual_msg = actual_msg[0:n] - if !bytes.Equal(msg, actual_msg) { - t.Errorf("Echo: expected %q got %q", msg, actual_msg) - } - conn.Close() -} - -func TestAddr(t *testing.T) { - once.Do(startServer) - - // websocket.Dial() - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - conn, err := NewClient(newConfig(t, "/echo"), client) - if err != nil { - t.Errorf("WebSocket handshake error: %v", err) - return - } - - ra := conn.RemoteAddr().String() - if !strings.HasPrefix(ra, "ws://") || !strings.HasSuffix(ra, "/echo") { - t.Errorf("Bad remote addr: %v", ra) - } - la := conn.LocalAddr().String() - if !strings.HasPrefix(la, "http://") { - t.Errorf("Bad local addr: %v", la) - } - conn.Close() -} - -func TestCount(t *testing.T) { - once.Do(startServer) - - // websocket.Dial() - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - conn, err := NewClient(newConfig(t, "/count"), client) - if err != nil { - t.Errorf("WebSocket handshake error: %v", err) - return - } - - var count Count - count.S = "hello" - if err := JSON.Send(conn, count); err != nil { - t.Errorf("Write: %v", err) - } - if err := JSON.Receive(conn, &count); err != nil { - t.Errorf("Read: %v", err) - } - if count.N != 1 { - t.Errorf("count: expected %d got %d", 1, count.N) - } - if count.S != "hello" { - t.Errorf("count: expected %q got %q", "hello", count.S) - } - if err := JSON.Send(conn, count); err != nil { - t.Errorf("Write: %v", err) - } - if err := JSON.Receive(conn, &count); err != nil { - t.Errorf("Read: %v", err) - } - if count.N != 2 { - t.Errorf("count: expected %d got %d", 2, count.N) - } - if count.S != "hellohello" { - t.Errorf("count: expected %q got %q", "hellohello", count.S) - } - conn.Close() -} - -func TestWithQuery(t *testing.T) { - once.Do(startServer) - - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - - config := newConfig(t, "/echo") - config.Location, err = url.ParseRequestURI(fmt.Sprintf("ws://%s/echo?q=v", serverAddr)) - if err != nil { - t.Fatal("location url", err) - } - - ws, err := NewClient(config, client) - if err != nil { - t.Errorf("WebSocket handshake: %v", err) - return - } - ws.Close() -} - -func testWithProtocol(t *testing.T, subproto []string) (string, error) { - once.Do(startServer) - - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - - config := newConfig(t, "/subproto") - config.Protocol = subproto - - ws, err := NewClient(config, client) - if err != nil { - return "", err - } - msg := make([]byte, 16) - n, err := ws.Read(msg) - if err != nil { - return "", err - } - ws.Close() - return string(msg[:n]), nil -} - -func TestWithProtocol(t *testing.T) { - proto, err := testWithProtocol(t, []string{"chat"}) - if err != nil { - t.Errorf("SubProto: unexpected error: %v", err) - } - if proto != "chat" { - t.Errorf("SubProto: expected %q, got %q", "chat", proto) - } -} - -func TestWithTwoProtocol(t *testing.T) { - proto, err := testWithProtocol(t, []string{"test", "chat"}) - if err != nil { - t.Errorf("SubProto: unexpected error: %v", err) - } - if proto != "chat" { - t.Errorf("SubProto: expected %q, got %q", "chat", proto) - } -} - -func TestWithBadProtocol(t *testing.T) { - _, err := testWithProtocol(t, []string{"test"}) - if err != ErrBadStatus { - t.Errorf("SubProto: expected %v, got %v", ErrBadStatus, err) - } -} - -func TestHTTP(t *testing.T) { - once.Do(startServer) - - // If the client did not send a handshake that matches the protocol - // specification, the server MUST return an HTTP response with an - // appropriate error code (such as 400 Bad Request) - resp, err := http.Get(fmt.Sprintf("http://%s/echo", serverAddr)) - if err != nil { - t.Errorf("Get: error %#v", err) - return - } - if resp == nil { - t.Error("Get: resp is null") - return - } - if resp.StatusCode != http.StatusBadRequest { - t.Errorf("Get: expected %q got %q", http.StatusBadRequest, resp.StatusCode) - } -} - -func TestTrailingSpaces(t *testing.T) { - // http://code.google.com/p/go/issues/detail?id=955 - // The last runs of this create keys with trailing spaces that should not be - // generated by the client. - once.Do(startServer) - config := newConfig(t, "/echo") - for i := 0; i < 30; i++ { - // body - ws, err := DialConfig(config) - if err != nil { - t.Errorf("Dial #%d failed: %v", i, err) - break - } - ws.Close() - } -} - -func TestDialConfigBadVersion(t *testing.T) { - once.Do(startServer) - config := newConfig(t, "/echo") - config.Version = 1234 - - _, err := DialConfig(config) - - if dialerr, ok := err.(*DialError); ok { - if dialerr.Err != ErrBadProtocolVersion { - t.Errorf("dial expected err %q but got %q", ErrBadProtocolVersion, dialerr.Err) - } - } -} - -func TestDialConfigWithDialer(t *testing.T) { - once.Do(startServer) - config := newConfig(t, "/echo") - config.Dialer = &net.Dialer{ - Deadline: time.Now().Add(-time.Minute), - } - _, err := DialConfig(config) - dialerr, ok := err.(*DialError) - if !ok { - t.Fatalf("DialError expected, got %#v", err) - } - neterr, ok := dialerr.Err.(*net.OpError) - if !ok { - t.Fatalf("net.OpError error expected, got %#v", dialerr.Err) - } - if !neterr.Timeout() { - t.Fatalf("expected timeout error, got %#v", neterr) - } -} - -func TestSmallBuffer(t *testing.T) { - // http://code.google.com/p/go/issues/detail?id=1145 - // Read should be able to handle reading a fragment of a frame. - once.Do(startServer) - - // websocket.Dial() - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - conn, err := NewClient(newConfig(t, "/echo"), client) - if err != nil { - t.Errorf("WebSocket handshake error: %v", err) - return - } - - msg := []byte("hello, world\n") - if _, err := conn.Write(msg); err != nil { - t.Errorf("Write: %v", err) - } - var small_msg = make([]byte, 8) - n, err := conn.Read(small_msg) - if err != nil { - t.Errorf("Read: %v", err) - } - if !bytes.Equal(msg[:len(small_msg)], small_msg) { - t.Errorf("Echo: expected %q got %q", msg[:len(small_msg)], small_msg) - } - var second_msg = make([]byte, len(msg)) - n, err = conn.Read(second_msg) - if err != nil { - t.Errorf("Read: %v", err) - } - second_msg = second_msg[0:n] - if !bytes.Equal(msg[len(small_msg):], second_msg) { - t.Errorf("Echo: expected %q got %q", msg[len(small_msg):], second_msg) - } - conn.Close() -} - -var parseAuthorityTests = []struct { - in *url.URL - out string -}{ - { - &url.URL{ - Scheme: "ws", - Host: "www.google.com", - }, - "www.google.com:80", - }, - { - &url.URL{ - Scheme: "wss", - Host: "www.google.com", - }, - "www.google.com:443", - }, - { - &url.URL{ - Scheme: "ws", - Host: "www.google.com:80", - }, - "www.google.com:80", - }, - { - &url.URL{ - Scheme: "wss", - Host: "www.google.com:443", - }, - "www.google.com:443", - }, - // some invalid ones for parseAuthority. parseAuthority doesn't - // concern itself with the scheme unless it actually knows about it - { - &url.URL{ - Scheme: "http", - Host: "www.google.com", - }, - "www.google.com", - }, - { - &url.URL{ - Scheme: "http", - Host: "www.google.com:80", - }, - "www.google.com:80", - }, - { - &url.URL{ - Scheme: "asdf", - Host: "127.0.0.1", - }, - "127.0.0.1", - }, - { - &url.URL{ - Scheme: "asdf", - Host: "www.google.com", - }, - "www.google.com", - }, -} - -func TestParseAuthority(t *testing.T) { - for _, tt := range parseAuthorityTests { - out := parseAuthority(tt.in) - if out != tt.out { - t.Errorf("got %v; want %v", out, tt.out) - } - } -} - -type closerConn struct { - net.Conn - closed int // count of the number of times Close was called -} - -func (c *closerConn) Close() error { - c.closed++ - return c.Conn.Close() -} - -func TestClose(t *testing.T) { - if runtime.GOOS == "plan9" { - t.Skip("see golang.org/issue/11454") - } - - once.Do(startServer) - - conn, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - - cc := closerConn{Conn: conn} - - client, err := NewClient(newConfig(t, "/echo"), &cc) - if err != nil { - t.Fatalf("WebSocket handshake: %v", err) - } - - // set the deadline to ten minutes ago, which will have expired by the time - // client.Close sends the close status frame. - conn.SetDeadline(time.Now().Add(-10 * time.Minute)) - - if err := client.Close(); err == nil { - t.Errorf("ws.Close(): expected error, got %v", err) - } - if cc.closed < 1 { - t.Fatalf("ws.Close(): expected underlying ws.rwc.Close to be called > 0 times, got: %v", cc.closed) - } -} - -var originTests = []struct { - req *http.Request - origin *url.URL -}{ - { - req: &http.Request{ - Header: http.Header{ - "Origin": []string{"http://www.example.com"}, - }, - }, - origin: &url.URL{ - Scheme: "http", - Host: "www.example.com", - }, - }, - { - req: &http.Request{}, - }, -} - -func TestOrigin(t *testing.T) { - conf := newConfig(t, "/echo") - conf.Version = ProtocolVersionHybi13 - for i, tt := range originTests { - origin, err := Origin(conf, tt.req) - if err != nil { - t.Error(err) - continue - } - if !reflect.DeepEqual(origin, tt.origin) { - t.Errorf("#%d: got origin %v; want %v", i, origin, tt.origin) - continue - } - } -} - -func TestCtrlAndData(t *testing.T) { - once.Do(startServer) - - c, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal(err) - } - ws, err := NewClient(newConfig(t, "/ctrldata"), c) - if err != nil { - t.Fatal(err) - } - defer ws.Close() - - h := &testCtrlAndDataHandler{hybiFrameHandler: hybiFrameHandler{conn: ws}} - ws.frameHandler = h - - b := make([]byte, 128) - for i := 0; i < 2; i++ { - data := []byte(fmt.Sprintf("#%d-DATA-FRAME-FROM-CLIENT", i)) - if _, err := ws.Write(data); err != nil { - t.Fatalf("#%d: %v", i, err) - } - var ctrl []byte - if i%2 != 0 { // with or without payload - ctrl = []byte(fmt.Sprintf("#%d-CONTROL-FRAME-FROM-CLIENT", i)) - } - if _, err := h.WritePing(ctrl); err != nil { - t.Fatalf("#%d: %v", i, err) - } - n, err := ws.Read(b) - if err != nil { - t.Fatalf("#%d: %v", i, err) - } - if !bytes.Equal(b[:n], data) { - t.Fatalf("#%d: got %v; want %v", i, b[:n], data) - } - } -} - -func TestCodec_ReceiveLimited(t *testing.T) { - const limit = 2048 - var payloads [][]byte - for _, size := range []int{ - 1024, - 2048, - 4096, // receive of this message would be interrupted due to limit - 2048, // this one is to make sure next receive recovers discarding leftovers - } { - b := make([]byte, size) - rand.Read(b) - payloads = append(payloads, b) - } - handlerDone := make(chan struct{}) - limitedHandler := func(ws *Conn) { - defer close(handlerDone) - ws.MaxPayloadBytes = limit - defer ws.Close() - for i, p := range payloads { - t.Logf("payload #%d (size %d, exceeds limit: %v)", i, len(p), len(p) > limit) - var recv []byte - err := Message.Receive(ws, &recv) - switch err { - case nil: - case ErrFrameTooLarge: - if len(p) <= limit { - t.Fatalf("unexpected frame size limit: expected %d bytes of payload having limit at %d", len(p), limit) - } - continue - default: - t.Fatalf("unexpected error: %v (want either nil or ErrFrameTooLarge)", err) - } - if len(recv) > limit { - t.Fatalf("received %d bytes of payload having limit at %d", len(recv), limit) - } - if !bytes.Equal(p, recv) { - t.Fatalf("received payload differs:\ngot:\t%v\nwant:\t%v", recv, p) - } - } - } - server := httptest.NewServer(Handler(limitedHandler)) - defer server.CloseClientConnections() - defer server.Close() - addr := server.Listener.Addr().String() - ws, err := Dial("ws://"+addr+"/", "", "http://localhost/") - if err != nil { - t.Fatal(err) - } - defer ws.Close() - for i, p := range payloads { - if err := Message.Send(ws, p); err != nil { - t.Fatalf("payload #%d (size %d): %v", i, len(p), err) - } - } - <-handlerDone -} diff --git a/vendor/golang.org/x/net/xsrftoken/xsrf.go b/vendor/golang.org/x/net/xsrftoken/xsrf.go deleted file mode 100644 index bc861e1f3..000000000 --- a/vendor/golang.org/x/net/xsrftoken/xsrf.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package xsrftoken provides methods for generating and validating secure XSRF tokens. -package xsrftoken // import "golang.org/x/net/xsrftoken" - -import ( - "crypto/hmac" - "crypto/sha1" - "crypto/subtle" - "encoding/base64" - "fmt" - "strconv" - "strings" - "time" -) - -// Timeout is the duration for which XSRF tokens are valid. -// It is exported so clients may set cookie timeouts that match generated tokens. -const Timeout = 24 * time.Hour - -// clean sanitizes a string for inclusion in a token by replacing all ":"s. -func clean(s string) string { - return strings.Replace(s, ":", "_", -1) -} - -// Generate returns a URL-safe secure XSRF token that expires in 24 hours. -// -// key is a secret key for your application; it must be non-empty. -// userID is an optional unique identifier for the user. -// actionID is an optional action the user is taking (e.g. POSTing to a particular path). -func Generate(key, userID, actionID string) string { - return generateTokenAtTime(key, userID, actionID, time.Now()) -} - -// generateTokenAtTime is like Generate, but returns a token that expires 24 hours from now. -func generateTokenAtTime(key, userID, actionID string, now time.Time) string { - if len(key) == 0 { - panic("zero length xsrf secret key") - } - // Round time up and convert to milliseconds. - milliTime := (now.UnixNano() + 1e6 - 1) / 1e6 - - h := hmac.New(sha1.New, []byte(key)) - fmt.Fprintf(h, "%s:%s:%d", clean(userID), clean(actionID), milliTime) - - // Get the padded base64 string then removing the padding. - tok := string(h.Sum(nil)) - tok = base64.URLEncoding.EncodeToString([]byte(tok)) - tok = strings.TrimRight(tok, "=") - - return fmt.Sprintf("%s:%d", tok, milliTime) -} - -// Valid reports whether a token is a valid, unexpired token returned by Generate. -func Valid(token, key, userID, actionID string) bool { - return validTokenAtTime(token, key, userID, actionID, time.Now()) -} - -// validTokenAtTime reports whether a token is valid at the given time. -func validTokenAtTime(token, key, userID, actionID string, now time.Time) bool { - if len(key) == 0 { - panic("zero length xsrf secret key") - } - // Extract the issue time of the token. - sep := strings.LastIndex(token, ":") - if sep < 0 { - return false - } - millis, err := strconv.ParseInt(token[sep+1:], 10, 64) - if err != nil { - return false - } - issueTime := time.Unix(0, millis*1e6) - - // Check that the token is not expired. - if now.Sub(issueTime) >= Timeout { - return false - } - - // Check that the token is not from the future. - // Allow 1 minute grace period in case the token is being verified on a - // machine whose clock is behind the machine that issued the token. - if issueTime.After(now.Add(1 * time.Minute)) { - return false - } - - expected := generateTokenAtTime(key, userID, actionID, issueTime) - - // Check that the token matches the expected value. - // Use constant time comparison to avoid timing attacks. - return subtle.ConstantTimeCompare([]byte(token), []byte(expected)) == 1 -} diff --git a/vendor/golang.org/x/net/xsrftoken/xsrf_test.go b/vendor/golang.org/x/net/xsrftoken/xsrf_test.go deleted file mode 100644 index 6c8e7d9b5..000000000 --- a/vendor/golang.org/x/net/xsrftoken/xsrf_test.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xsrftoken - -import ( - "encoding/base64" - "testing" - "time" -) - -const ( - key = "quay" - userID = "12345678" - actionID = "POST /form" -) - -var ( - now = time.Now() - oneMinuteFromNow = now.Add(1 * time.Minute) -) - -func TestValidToken(t *testing.T) { - tok := generateTokenAtTime(key, userID, actionID, now) - if !validTokenAtTime(tok, key, userID, actionID, oneMinuteFromNow) { - t.Error("One second later: Expected token to be valid") - } - if !validTokenAtTime(tok, key, userID, actionID, now.Add(Timeout-1*time.Nanosecond)) { - t.Error("Just before timeout: Expected token to be valid") - } - if !validTokenAtTime(tok, key, userID, actionID, now.Add(-1*time.Minute+1*time.Millisecond)) { - t.Error("One minute in the past: Expected token to be valid") - } -} - -// TestSeparatorReplacement tests that separators are being correctly substituted -func TestSeparatorReplacement(t *testing.T) { - tok := generateTokenAtTime("foo:bar", "baz", "wah", now) - tok2 := generateTokenAtTime("foo", "bar:baz", "wah", now) - if tok == tok2 { - t.Errorf("Expected generated tokens to be different") - } -} - -func TestInvalidToken(t *testing.T) { - invalidTokenTests := []struct { - name, key, userID, actionID string - t time.Time - }{ - {"Bad key", "foobar", userID, actionID, oneMinuteFromNow}, - {"Bad userID", key, "foobar", actionID, oneMinuteFromNow}, - {"Bad actionID", key, userID, "foobar", oneMinuteFromNow}, - {"Expired", key, userID, actionID, now.Add(Timeout + 1*time.Millisecond)}, - {"More than 1 minute from the future", key, userID, actionID, now.Add(-1*time.Nanosecond - 1*time.Minute)}, - } - - tok := generateTokenAtTime(key, userID, actionID, now) - for _, itt := range invalidTokenTests { - if validTokenAtTime(tok, itt.key, itt.userID, itt.actionID, itt.t) { - t.Errorf("%v: Expected token to be invalid", itt.name) - } - } -} - -// TestValidateBadData primarily tests that no unexpected panics are triggered -// during parsing -func TestValidateBadData(t *testing.T) { - badDataTests := []struct { - name, tok string - }{ - {"Invalid Base64", "ASDab24(@)$*=="}, - {"No delimiter", base64.URLEncoding.EncodeToString([]byte("foobar12345678"))}, - {"Invalid time", base64.URLEncoding.EncodeToString([]byte("foobar:foobar"))}, - {"Wrong length", "1234" + generateTokenAtTime(key, userID, actionID, now)}, - } - - for _, bdt := range badDataTests { - if validTokenAtTime(bdt.tok, key, userID, actionID, oneMinuteFromNow) { - t.Errorf("%v: Expected token to be invalid", bdt.name) - } - } -} diff --git a/vendor/golang.org/x/sys/plan9/asm.s b/vendor/golang.org/x/sys/plan9/asm.s deleted file mode 100644 index d4ca868f1..000000000 --- a/vendor/golang.org/x/sys/plan9/asm.s +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -#include "textflag.h" - -TEXT ·use(SB),NOSPLIT,$0 - RET diff --git a/vendor/golang.org/x/sys/plan9/asm_plan9_386.s b/vendor/golang.org/x/sys/plan9/asm_plan9_386.s deleted file mode 100644 index bc5cab1f3..000000000 --- a/vendor/golang.org/x/sys/plan9/asm_plan9_386.s +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -#include "textflag.h" - -// -// System call support for 386, Plan 9 -// - -// Just jump to package syscall's implementation for all these functions. -// The runtime may know about them. - -TEXT ·Syscall(SB),NOSPLIT,$0-32 - JMP syscall·Syscall(SB) - -TEXT ·Syscall6(SB),NOSPLIT,$0-44 - JMP syscall·Syscall6(SB) - -TEXT ·RawSyscall(SB),NOSPLIT,$0-28 - JMP syscall·RawSyscall(SB) - -TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 - JMP syscall·RawSyscall6(SB) - -TEXT ·seek(SB),NOSPLIT,$0-36 - JMP syscall·seek(SB) - -TEXT ·exit(SB),NOSPLIT,$4-4 - JMP syscall·exit(SB) diff --git a/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s b/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s deleted file mode 100644 index d3448e675..000000000 --- a/vendor/golang.org/x/sys/plan9/asm_plan9_amd64.s +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -#include "textflag.h" - -// -// System call support for amd64, Plan 9 -// - -// Just jump to package syscall's implementation for all these functions. -// The runtime may know about them. - -TEXT ·Syscall(SB),NOSPLIT,$0-64 - JMP syscall·Syscall(SB) - -TEXT ·Syscall6(SB),NOSPLIT,$0-88 - JMP syscall·Syscall6(SB) - -TEXT ·RawSyscall(SB),NOSPLIT,$0-56 - JMP syscall·RawSyscall(SB) - -TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 - JMP syscall·RawSyscall6(SB) - -TEXT ·seek(SB),NOSPLIT,$0-56 - JMP syscall·seek(SB) - -TEXT ·exit(SB),NOSPLIT,$8-8 - JMP syscall·exit(SB) diff --git a/vendor/golang.org/x/sys/plan9/const_plan9.go b/vendor/golang.org/x/sys/plan9/const_plan9.go deleted file mode 100644 index b4e85a3a9..000000000 --- a/vendor/golang.org/x/sys/plan9/const_plan9.go +++ /dev/null @@ -1,70 +0,0 @@ -package plan9 - -// Plan 9 Constants - -// Open modes -const ( - O_RDONLY = 0 - O_WRONLY = 1 - O_RDWR = 2 - O_TRUNC = 16 - O_CLOEXEC = 32 - O_EXCL = 0x1000 -) - -// Rfork flags -const ( - RFNAMEG = 1 << 0 - RFENVG = 1 << 1 - RFFDG = 1 << 2 - RFNOTEG = 1 << 3 - RFPROC = 1 << 4 - RFMEM = 1 << 5 - RFNOWAIT = 1 << 6 - RFCNAMEG = 1 << 10 - RFCENVG = 1 << 11 - RFCFDG = 1 << 12 - RFREND = 1 << 13 - RFNOMNT = 1 << 14 -) - -// Qid.Type bits -const ( - QTDIR = 0x80 - QTAPPEND = 0x40 - QTEXCL = 0x20 - QTMOUNT = 0x10 - QTAUTH = 0x08 - QTTMP = 0x04 - QTFILE = 0x00 -) - -// Dir.Mode bits -const ( - DMDIR = 0x80000000 - DMAPPEND = 0x40000000 - DMEXCL = 0x20000000 - DMMOUNT = 0x10000000 - DMAUTH = 0x08000000 - DMTMP = 0x04000000 - DMREAD = 0x4 - DMWRITE = 0x2 - DMEXEC = 0x1 -) - -const ( - STATMAX = 65535 - ERRMAX = 128 - STATFIXLEN = 49 -) - -// Mount and bind flags -const ( - MREPL = 0x0000 - MBEFORE = 0x0001 - MAFTER = 0x0002 - MORDER = 0x0003 - MCREATE = 0x0004 - MCACHE = 0x0010 - MMASK = 0x0017 -) diff --git a/vendor/golang.org/x/sys/plan9/dir_plan9.go b/vendor/golang.org/x/sys/plan9/dir_plan9.go deleted file mode 100644 index 0955e0c53..000000000 --- a/vendor/golang.org/x/sys/plan9/dir_plan9.go +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Plan 9 directory marshalling. See intro(5). - -package plan9 - -import "errors" - -var ( - ErrShortStat = errors.New("stat buffer too short") - ErrBadStat = errors.New("malformed stat buffer") - ErrBadName = errors.New("bad character in file name") -) - -// A Qid represents a 9P server's unique identification for a file. -type Qid struct { - Path uint64 // the file server's unique identification for the file - Vers uint32 // version number for given Path - Type uint8 // the type of the file (plan9.QTDIR for example) -} - -// A Dir contains the metadata for a file. -type Dir struct { - // system-modified data - Type uint16 // server type - Dev uint32 // server subtype - - // file data - Qid Qid // unique id from server - Mode uint32 // permissions - Atime uint32 // last read time - Mtime uint32 // last write time - Length int64 // file length - Name string // last element of path - Uid string // owner name - Gid string // group name - Muid string // last modifier name -} - -var nullDir = Dir{ - Type: ^uint16(0), - Dev: ^uint32(0), - Qid: Qid{ - Path: ^uint64(0), - Vers: ^uint32(0), - Type: ^uint8(0), - }, - Mode: ^uint32(0), - Atime: ^uint32(0), - Mtime: ^uint32(0), - Length: ^int64(0), -} - -// Null assigns special "don't touch" values to members of d to -// avoid modifying them during plan9.Wstat. -func (d *Dir) Null() { *d = nullDir } - -// Marshal encodes a 9P stat message corresponding to d into b -// -// If there isn't enough space in b for a stat message, ErrShortStat is returned. -func (d *Dir) Marshal(b []byte) (n int, err error) { - n = STATFIXLEN + len(d.Name) + len(d.Uid) + len(d.Gid) + len(d.Muid) - if n > len(b) { - return n, ErrShortStat - } - - for _, c := range d.Name { - if c == '/' { - return n, ErrBadName - } - } - - b = pbit16(b, uint16(n)-2) - b = pbit16(b, d.Type) - b = pbit32(b, d.Dev) - b = pbit8(b, d.Qid.Type) - b = pbit32(b, d.Qid.Vers) - b = pbit64(b, d.Qid.Path) - b = pbit32(b, d.Mode) - b = pbit32(b, d.Atime) - b = pbit32(b, d.Mtime) - b = pbit64(b, uint64(d.Length)) - b = pstring(b, d.Name) - b = pstring(b, d.Uid) - b = pstring(b, d.Gid) - b = pstring(b, d.Muid) - - return n, nil -} - -// UnmarshalDir decodes a single 9P stat message from b and returns the resulting Dir. -// -// If b is too small to hold a valid stat message, ErrShortStat is returned. -// -// If the stat message itself is invalid, ErrBadStat is returned. -func UnmarshalDir(b []byte) (*Dir, error) { - if len(b) < STATFIXLEN { - return nil, ErrShortStat - } - size, buf := gbit16(b) - if len(b) != int(size)+2 { - return nil, ErrBadStat - } - b = buf - - var d Dir - d.Type, b = gbit16(b) - d.Dev, b = gbit32(b) - d.Qid.Type, b = gbit8(b) - d.Qid.Vers, b = gbit32(b) - d.Qid.Path, b = gbit64(b) - d.Mode, b = gbit32(b) - d.Atime, b = gbit32(b) - d.Mtime, b = gbit32(b) - - n, b := gbit64(b) - d.Length = int64(n) - - var ok bool - if d.Name, b, ok = gstring(b); !ok { - return nil, ErrBadStat - } - if d.Uid, b, ok = gstring(b); !ok { - return nil, ErrBadStat - } - if d.Gid, b, ok = gstring(b); !ok { - return nil, ErrBadStat - } - if d.Muid, b, ok = gstring(b); !ok { - return nil, ErrBadStat - } - - return &d, nil -} - -// pbit8 copies the 8-bit number v to b and returns the remaining slice of b. -func pbit8(b []byte, v uint8) []byte { - b[0] = byte(v) - return b[1:] -} - -// pbit16 copies the 16-bit number v to b in little-endian order and returns the remaining slice of b. -func pbit16(b []byte, v uint16) []byte { - b[0] = byte(v) - b[1] = byte(v >> 8) - return b[2:] -} - -// pbit32 copies the 32-bit number v to b in little-endian order and returns the remaining slice of b. -func pbit32(b []byte, v uint32) []byte { - b[0] = byte(v) - b[1] = byte(v >> 8) - b[2] = byte(v >> 16) - b[3] = byte(v >> 24) - return b[4:] -} - -// pbit64 copies the 64-bit number v to b in little-endian order and returns the remaining slice of b. -func pbit64(b []byte, v uint64) []byte { - b[0] = byte(v) - b[1] = byte(v >> 8) - b[2] = byte(v >> 16) - b[3] = byte(v >> 24) - b[4] = byte(v >> 32) - b[5] = byte(v >> 40) - b[6] = byte(v >> 48) - b[7] = byte(v >> 56) - return b[8:] -} - -// pstring copies the string s to b, prepending it with a 16-bit length in little-endian order, and -// returning the remaining slice of b.. -func pstring(b []byte, s string) []byte { - b = pbit16(b, uint16(len(s))) - n := copy(b, s) - return b[n:] -} - -// gbit8 reads an 8-bit number from b and returns it with the remaining slice of b. -func gbit8(b []byte) (uint8, []byte) { - return uint8(b[0]), b[1:] -} - -// gbit16 reads a 16-bit number in little-endian order from b and returns it with the remaining slice of b. -func gbit16(b []byte) (uint16, []byte) { - return uint16(b[0]) | uint16(b[1])<<8, b[2:] -} - -// gbit32 reads a 32-bit number in little-endian order from b and returns it with the remaining slice of b. -func gbit32(b []byte) (uint32, []byte) { - return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24, b[4:] -} - -// gbit64 reads a 64-bit number in little-endian order from b and returns it with the remaining slice of b. -func gbit64(b []byte) (uint64, []byte) { - lo := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - hi := uint32(b[4]) | uint32(b[5])<<8 | uint32(b[6])<<16 | uint32(b[7])<<24 - return uint64(lo) | uint64(hi)<<32, b[8:] -} - -// gstring reads a string from b, prefixed with a 16-bit length in little-endian order. -// It returns the string with the remaining slice of b and a boolean. If the length is -// greater than the number of bytes in b, the boolean will be false. -func gstring(b []byte) (string, []byte, bool) { - n, b := gbit16(b) - if int(n) > len(b) { - return "", b, false - } - return string(b[:n]), b[n:], true -} diff --git a/vendor/golang.org/x/sys/plan9/env_plan9.go b/vendor/golang.org/x/sys/plan9/env_plan9.go deleted file mode 100644 index 25a96e7ea..000000000 --- a/vendor/golang.org/x/sys/plan9/env_plan9.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Plan 9 environment variables. - -package plan9 - -import ( - "syscall" -) - -func Getenv(key string) (value string, found bool) { - return syscall.Getenv(key) -} - -func Setenv(key, value string) error { - return syscall.Setenv(key, value) -} - -func Clearenv() { - syscall.Clearenv() -} - -func Environ() []string { - return syscall.Environ() -} diff --git a/vendor/golang.org/x/sys/plan9/env_unset.go b/vendor/golang.org/x/sys/plan9/env_unset.go deleted file mode 100644 index c37fc26e4..000000000 --- a/vendor/golang.org/x/sys/plan9/env_unset.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.4 - -package plan9 - -import "syscall" - -func Unsetenv(key string) error { - // This was added in Go 1.4. - return syscall.Unsetenv(key) -} diff --git a/vendor/golang.org/x/sys/plan9/errors_plan9.go b/vendor/golang.org/x/sys/plan9/errors_plan9.go deleted file mode 100644 index 110cf6a30..000000000 --- a/vendor/golang.org/x/sys/plan9/errors_plan9.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package plan9 - -import "syscall" - -// Constants -const ( - // Invented values to support what package os expects. - O_CREAT = 0x02000 - O_APPEND = 0x00400 - O_NOCTTY = 0x00000 - O_NONBLOCK = 0x00000 - O_SYNC = 0x00000 - O_ASYNC = 0x00000 - - S_IFMT = 0x1f000 - S_IFIFO = 0x1000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFBLK = 0x6000 - S_IFREG = 0x8000 - S_IFLNK = 0xa000 - S_IFSOCK = 0xc000 -) - -// Errors -var ( - EINVAL = syscall.NewError("bad arg in system call") - ENOTDIR = syscall.NewError("not a directory") - EISDIR = syscall.NewError("file is a directory") - ENOENT = syscall.NewError("file does not exist") - EEXIST = syscall.NewError("file already exists") - EMFILE = syscall.NewError("no free file descriptors") - EIO = syscall.NewError("i/o error") - ENAMETOOLONG = syscall.NewError("file name too long") - EINTR = syscall.NewError("interrupted") - EPERM = syscall.NewError("permission denied") - EBUSY = syscall.NewError("no free devices") - ETIMEDOUT = syscall.NewError("connection timed out") - EPLAN9 = syscall.NewError("not supported by plan 9") - - // The following errors do not correspond to any - // Plan 9 system messages. Invented to support - // what package os and others expect. - EACCES = syscall.NewError("access permission denied") - EAFNOSUPPORT = syscall.NewError("address family not supported by protocol") -) diff --git a/vendor/golang.org/x/sys/plan9/mkall.sh b/vendor/golang.org/x/sys/plan9/mkall.sh deleted file mode 100755 index 9f73c6066..000000000 --- a/vendor/golang.org/x/sys/plan9/mkall.sh +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2009 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -# The plan9 package provides access to the raw system call -# interface of the underlying operating system. Porting Go to -# a new architecture/operating system combination requires -# some manual effort, though there are tools that automate -# much of the process. The auto-generated files have names -# beginning with z. -# -# This script runs or (given -n) prints suggested commands to generate z files -# for the current system. Running those commands is not automatic. -# This script is documentation more than anything else. -# -# * asm_${GOOS}_${GOARCH}.s -# -# This hand-written assembly file implements system call dispatch. -# There are three entry points: -# -# func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); -# func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); -# func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); -# -# The first and second are the standard ones; they differ only in -# how many arguments can be passed to the kernel. -# The third is for low-level use by the ForkExec wrapper; -# unlike the first two, it does not call into the scheduler to -# let it know that a system call is running. -# -# * syscall_${GOOS}.go -# -# This hand-written Go file implements system calls that need -# special handling and lists "//sys" comments giving prototypes -# for ones that can be auto-generated. Mksyscall reads those -# comments to generate the stubs. -# -# * syscall_${GOOS}_${GOARCH}.go -# -# Same as syscall_${GOOS}.go except that it contains code specific -# to ${GOOS} on one particular architecture. -# -# * types_${GOOS}.c -# -# This hand-written C file includes standard C headers and then -# creates typedef or enum names beginning with a dollar sign -# (use of $ in variable names is a gcc extension). The hardest -# part about preparing this file is figuring out which headers to -# include and which symbols need to be #defined to get the -# actual data structures that pass through to the kernel system calls. -# Some C libraries present alternate versions for binary compatibility -# and translate them on the way in and out of system calls, but -# there is almost always a #define that can get the real ones. -# See types_darwin.c and types_linux.c for examples. -# -# * zerror_${GOOS}_${GOARCH}.go -# -# This machine-generated file defines the system's error numbers, -# error strings, and signal numbers. The generator is "mkerrors.sh". -# Usually no arguments are needed, but mkerrors.sh will pass its -# arguments on to godefs. -# -# * zsyscall_${GOOS}_${GOARCH}.go -# -# Generated by mksyscall.pl; see syscall_${GOOS}.go above. -# -# * zsysnum_${GOOS}_${GOARCH}.go -# -# Generated by mksysnum_${GOOS}. -# -# * ztypes_${GOOS}_${GOARCH}.go -# -# Generated by godefs; see types_${GOOS}.c above. - -GOOSARCH="${GOOS}_${GOARCH}" - -# defaults -mksyscall="./mksyscall.pl" -mkerrors="./mkerrors.sh" -zerrors="zerrors_$GOOSARCH.go" -mksysctl="" -zsysctl="zsysctl_$GOOSARCH.go" -mksysnum= -mktypes= -run="sh" - -case "$1" in --syscalls) - for i in zsyscall*go - do - sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i - rm _$i - done - exit 0 - ;; --n) - run="cat" - shift -esac - -case "$#" in -0) - ;; -*) - echo 'usage: mkall.sh [-n]' 1>&2 - exit 2 -esac - -case "$GOOSARCH" in -_* | *_ | _) - echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 - exit 1 - ;; -plan9_386) - mkerrors= - mksyscall="./mksyscall.pl -l32 -plan9" - mksysnum="./mksysnum_plan9.sh /n/sources/plan9/sys/src/libc/9syscall/sys.h" - mktypes="XXX" - ;; -*) - echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 - exit 1 - ;; -esac - -( - if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi - case "$GOOS" in - plan9) - syscall_goos="syscall_$GOOS.go" - if [ -n "$mksyscall" ]; then echo "$mksyscall $syscall_goos syscall_$GOOSARCH.go |gofmt >zsyscall_$GOOSARCH.go"; fi - ;; - esac - if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi - if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi - if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go |gofmt >ztypes_$GOOSARCH.go"; fi -) | $run diff --git a/vendor/golang.org/x/sys/plan9/mkerrors.sh b/vendor/golang.org/x/sys/plan9/mkerrors.sh deleted file mode 100755 index 052c86d94..000000000 --- a/vendor/golang.org/x/sys/plan9/mkerrors.sh +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2009 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -# Generate Go code listing errors and other #defined constant -# values (ENAMETOOLONG etc.), by asking the preprocessor -# about the definitions. - -unset LANG -export LC_ALL=C -export LC_CTYPE=C - -CC=${CC:-gcc} - -uname=$(uname) - -includes=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -' - -ccflags="$@" - -# Write go tool cgo -godefs input. -( - echo package plan9 - echo - echo '/*' - indirect="includes_$(uname)" - echo "${!indirect} $includes" - echo '*/' - echo 'import "C"' - echo - echo 'const (' - - # The gcc command line prints all the #defines - # it encounters while processing the input - echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | - awk ' - $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} - - $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers - $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} - $2 ~ /^(SCM_SRCRT)$/ {next} - $2 ~ /^(MAP_FAILED)$/ {next} - - $2 !~ /^ETH_/ && - $2 !~ /^EPROC_/ && - $2 !~ /^EQUIV_/ && - $2 !~ /^EXPR_/ && - $2 ~ /^E[A-Z0-9_]+$/ || - $2 ~ /^B[0-9_]+$/ || - $2 ~ /^V[A-Z0-9]+$/ || - $2 ~ /^CS[A-Z0-9]/ || - $2 ~ /^I(SIG|CANON|CRNL|EXTEN|MAXBEL|STRIP|UTF8)$/ || - $2 ~ /^IGN/ || - $2 ~ /^IX(ON|ANY|OFF)$/ || - $2 ~ /^IN(LCR|PCK)$/ || - $2 ~ /(^FLU?SH)|(FLU?SH$)/ || - $2 ~ /^C(LOCAL|READ)$/ || - $2 == "BRKINT" || - $2 == "HUPCL" || - $2 == "PENDIN" || - $2 == "TOSTOP" || - $2 ~ /^PAR/ || - $2 ~ /^SIG[^_]/ || - $2 ~ /^O[CNPFP][A-Z]+[^_][A-Z]+$/ || - $2 ~ /^IN_/ || - $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || - $2 == "ICMPV6_FILTER" || - $2 == "SOMAXCONN" || - $2 == "NAME_MAX" || - $2 == "IFNAMSIZ" || - $2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ || - $2 ~ /^SYSCTL_VERS/ || - $2 ~ /^(MS|MNT)_/ || - $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || - $2 ~ /^(O|F|FD|NAME|S|PTRACE|PT)_/ || - $2 ~ /^LINUX_REBOOT_CMD_/ || - $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || - $2 !~ "NLA_TYPE_MASK" && - $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || - $2 ~ /^SIOC/ || - $2 ~ /^TIOC/ || - $2 !~ "RTF_BITS" && - $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || - $2 ~ /^BIOC/ || - $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || - $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|NOFILE|STACK)|RLIM_INFINITY/ || - $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || - $2 ~ /^CLONE_[A-Z_]+/ || - $2 !~ /^(BPF_TIMEVAL)$/ && - $2 ~ /^(BPF|DLT)_/ || - $2 !~ "WMESGLEN" && - $2 ~ /^W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", $2, $2)} - $2 ~ /^__WCOREFLAG$/ {next} - $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} - - {next} - ' | sort - - echo ')' -) >_const.go - -# Pull out the error names for later. -errors=$( - echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | - sort -) - -# Pull out the signal names for later. -signals=$( - echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | - egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | - sort -) - -# Again, writing regexps to a file. -echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | - sort >_error.grep -echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | - egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | - sort >_signal.grep - -echo '// mkerrors.sh' "$@" -echo '// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT' -echo -go tool cgo -godefs -- "$@" _const.go >_error.out -cat _error.out | grep -vf _error.grep | grep -vf _signal.grep -echo -echo '// Errors' -echo 'const (' -cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= Errno(\1)/' -echo ')' - -echo -echo '// Signals' -echo 'const (' -cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= Signal(\1)/' -echo ')' - -# Run C program to print error and syscall strings. -( - echo -E " -#include -#include -#include -#include -#include -#include - -#define nelem(x) (sizeof(x)/sizeof((x)[0])) - -enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below - -int errors[] = { -" - for i in $errors - do - echo -E ' '$i, - done - - echo -E " -}; - -int signals[] = { -" - for i in $signals - do - echo -E ' '$i, - done - - # Use -E because on some systems bash builtin interprets \n itself. - echo -E ' -}; - -static int -intcmp(const void *a, const void *b) -{ - return *(int*)a - *(int*)b; -} - -int -main(void) -{ - int i, j, e; - char buf[1024], *p; - - printf("\n\n// Error table\n"); - printf("var errors = [...]string {\n"); - qsort(errors, nelem(errors), sizeof errors[0], intcmp); - for(i=0; i 0 && errors[i-1] == e) - continue; - strcpy(buf, strerror(e)); - // lowercase first letter: Bad -> bad, but STREAM -> STREAM. - if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) - buf[0] += a - A; - printf("\t%d: \"%s\",\n", e, buf); - } - printf("}\n\n"); - - printf("\n\n// Signal table\n"); - printf("var signals = [...]string {\n"); - qsort(signals, nelem(signals), sizeof signals[0], intcmp); - for(i=0; i 0 && signals[i-1] == e) - continue; - strcpy(buf, strsignal(e)); - // lowercase first letter: Bad -> bad, but STREAM -> STREAM. - if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) - buf[0] += a - A; - // cut trailing : number. - p = strrchr(buf, ":"[0]); - if(p) - *p = '\0'; - printf("\t%d: \"%s\",\n", e, buf); - } - printf("}\n\n"); - - return 0; -} - -' -) >_errors.c - -$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/vendor/golang.org/x/sys/plan9/mksyscall.pl b/vendor/golang.org/x/sys/plan9/mksyscall.pl deleted file mode 100755 index ce8e1e4f3..000000000 --- a/vendor/golang.org/x/sys/plan9/mksyscall.pl +++ /dev/null @@ -1,319 +0,0 @@ -#!/usr/bin/env perl -# Copyright 2009 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -# This program reads a file containing function prototypes -# (like syscall_plan9.go) and generates system call bodies. -# The prototypes are marked by lines beginning with "//sys" -# and read like func declarations if //sys is replaced by func, but: -# * The parameter lists must give a name for each argument. -# This includes return parameters. -# * The parameter lists must give a type for each argument: -# the (x, y, z int) shorthand is not allowed. -# * If the return parameter is an error number, it must be named errno. - -# A line beginning with //sysnb is like //sys, except that the -# goroutine will not be suspended during the execution of the system -# call. This must only be used for system calls which can never -# block, as otherwise the system call could cause all goroutines to -# hang. - -use strict; - -my $cmdline = "mksyscall.pl " . join(' ', @ARGV); -my $errors = 0; -my $_32bit = ""; -my $plan9 = 0; -my $openbsd = 0; -my $netbsd = 0; -my $dragonfly = 0; -my $nacl = 0; -my $arm = 0; # 64-bit value should use (even, odd)-pair - -if($ARGV[0] eq "-b32") { - $_32bit = "big-endian"; - shift; -} elsif($ARGV[0] eq "-l32") { - $_32bit = "little-endian"; - shift; -} -if($ARGV[0] eq "-plan9") { - $plan9 = 1; - shift; -} -if($ARGV[0] eq "-openbsd") { - $openbsd = 1; - shift; -} -if($ARGV[0] eq "-netbsd") { - $netbsd = 1; - shift; -} -if($ARGV[0] eq "-dragonfly") { - $dragonfly = 1; - shift; -} -if($ARGV[0] eq "-nacl") { - $nacl = 1; - shift; -} -if($ARGV[0] eq "-arm") { - $arm = 1; - shift; -} - -if($ARGV[0] =~ /^-/) { - print STDERR "usage: mksyscall.pl [-b32 | -l32] [file ...]\n"; - exit 1; -} - -sub parseparamlist($) { - my ($list) = @_; - $list =~ s/^\s*//; - $list =~ s/\s*$//; - if($list eq "") { - return (); - } - return split(/\s*,\s*/, $list); -} - -sub parseparam($) { - my ($p) = @_; - if($p !~ /^(\S*) (\S*)$/) { - print STDERR "$ARGV:$.: malformed parameter: $p\n"; - $errors = 1; - return ("xx", "int"); - } - return ($1, $2); -} - -my $text = ""; -while(<>) { - chomp; - s/\s+/ /g; - s/^\s+//; - s/\s+$//; - my $nonblock = /^\/\/sysnb /; - next if !/^\/\/sys / && !$nonblock; - - # Line must be of the form - # func Open(path string, mode int, perm int) (fd int, errno error) - # Split into name, in params, out params. - if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) { - print STDERR "$ARGV:$.: malformed //sys declaration\n"; - $errors = 1; - next; - } - my ($func, $in, $out, $sysname) = ($2, $3, $4, $5); - - # Split argument lists on comma. - my @in = parseparamlist($in); - my @out = parseparamlist($out); - - # Try in vain to keep people from editing this file. - # The theory is that they jump into the middle of the file - # without reading the header. - $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; - - # Go function header. - my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : ""; - $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl; - - # Check if err return available - my $errvar = ""; - foreach my $p (@out) { - my ($name, $type) = parseparam($p); - if($type eq "error") { - $errvar = $name; - last; - } - } - - # Prepare arguments to Syscall. - my @args = (); - my @uses = (); - my $n = 0; - foreach my $p (@in) { - my ($name, $type) = parseparam($p); - if($type =~ /^\*/) { - push @args, "uintptr(unsafe.Pointer($name))"; - } elsif($type eq "string" && $errvar ne "") { - $text .= "\tvar _p$n *byte\n"; - $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; - $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; - push @args, "uintptr(unsafe.Pointer(_p$n))"; - push @uses, "use(unsafe.Pointer(_p$n))"; - $n++; - } elsif($type eq "string") { - print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; - $text .= "\tvar _p$n *byte\n"; - $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; - push @args, "uintptr(unsafe.Pointer(_p$n))"; - push @uses, "use(unsafe.Pointer(_p$n))"; - $n++; - } elsif($type =~ /^\[\](.*)/) { - # Convert slice into pointer, length. - # Have to be careful not to take address of &a[0] if len == 0: - # pass dummy pointer in that case. - # Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). - $text .= "\tvar _p$n unsafe.Pointer\n"; - $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}"; - $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}"; - $text .= "\n"; - push @args, "uintptr(_p$n)", "uintptr(len($name))"; - $n++; - } elsif($type eq "int64" && ($openbsd || $netbsd)) { - push @args, "0"; - if($_32bit eq "big-endian") { - push @args, "uintptr($name>>32)", "uintptr($name)"; - } elsif($_32bit eq "little-endian") { - push @args, "uintptr($name)", "uintptr($name>>32)"; - } else { - push @args, "uintptr($name)"; - } - } elsif($type eq "int64" && $dragonfly) { - if ($func !~ /^extp(read|write)/i) { - push @args, "0"; - } - if($_32bit eq "big-endian") { - push @args, "uintptr($name>>32)", "uintptr($name)"; - } elsif($_32bit eq "little-endian") { - push @args, "uintptr($name)", "uintptr($name>>32)"; - } else { - push @args, "uintptr($name)"; - } - } elsif($type eq "int64" && $_32bit ne "") { - if(@args % 2 && $arm) { - # arm abi specifies 64-bit argument uses - # (even, odd) pair - push @args, "0" - } - if($_32bit eq "big-endian") { - push @args, "uintptr($name>>32)", "uintptr($name)"; - } else { - push @args, "uintptr($name)", "uintptr($name>>32)"; - } - } else { - push @args, "uintptr($name)"; - } - } - - # Determine which form to use; pad args with zeros. - my $asm = "Syscall"; - if ($nonblock) { - $asm = "RawSyscall"; - } - if(@args <= 3) { - while(@args < 3) { - push @args, "0"; - } - } elsif(@args <= 6) { - $asm .= "6"; - while(@args < 6) { - push @args, "0"; - } - } elsif(@args <= 9) { - $asm .= "9"; - while(@args < 9) { - push @args, "0"; - } - } else { - print STDERR "$ARGV:$.: too many arguments to system call\n"; - } - - # System call number. - if($sysname eq "") { - $sysname = "SYS_$func"; - $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar - $sysname =~ y/a-z/A-Z/; - if($nacl) { - $sysname =~ y/A-Z/a-z/; - } - } - - # Actual call. - my $args = join(', ', @args); - my $call = "$asm($sysname, $args)"; - - # Assign return values. - my $body = ""; - my @ret = ("_", "_", "_"); - my $do_errno = 0; - for(my $i=0; $i<@out; $i++) { - my $p = $out[$i]; - my ($name, $type) = parseparam($p); - my $reg = ""; - if($name eq "err" && !$plan9) { - $reg = "e1"; - $ret[2] = $reg; - $do_errno = 1; - } elsif($name eq "err" && $plan9) { - $ret[0] = "r0"; - $ret[2] = "e1"; - next; - } else { - $reg = sprintf("r%d", $i); - $ret[$i] = $reg; - } - if($type eq "bool") { - $reg = "$reg != 0"; - } - if($type eq "int64" && $_32bit ne "") { - # 64-bit number in r1:r0 or r0:r1. - if($i+2 > @out) { - print STDERR "$ARGV:$.: not enough registers for int64 return\n"; - } - if($_32bit eq "big-endian") { - $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); - } else { - $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); - } - $ret[$i] = sprintf("r%d", $i); - $ret[$i+1] = sprintf("r%d", $i+1); - } - if($reg ne "e1" || $plan9) { - $body .= "\t$name = $type($reg)\n"; - } - } - if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { - $text .= "\t$call\n"; - } else { - $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; - } - foreach my $use (@uses) { - $text .= "\t$use\n"; - } - $text .= $body; - - if ($plan9 && $ret[2] eq "e1") { - $text .= "\tif int32(r0) == -1 {\n"; - $text .= "\t\terr = e1\n"; - $text .= "\t}\n"; - } elsif ($do_errno) { - $text .= "\tif e1 != 0 {\n"; - $text .= "\t\terr = e1\n"; - $text .= "\t}\n"; - } - $text .= "\treturn\n"; - $text .= "}\n\n"; -} - -chomp $text; -chomp $text; - -if($errors) { - exit 1; -} - -print <= 10 { - buf[i] = byte(val%10 + '0') - i-- - val /= 10 - } - buf[i] = byte(val + '0') - return string(buf[i:]) -} diff --git a/vendor/golang.org/x/sys/plan9/syscall.go b/vendor/golang.org/x/sys/plan9/syscall.go deleted file mode 100644 index df6f8c5b9..000000000 --- a/vendor/golang.org/x/sys/plan9/syscall.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build plan9 - -// Package plan9 contains an interface to the low-level operating system -// primitives. OS details vary depending on the underlying system, and -// by default, godoc will display the OS-specific documentation for the current -// system. If you want godoc to display documentation for another -// system, set $GOOS and $GOARCH to the desired system. For example, if -// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS -// to freebsd and $GOARCH to arm. -// The primary use of this package is inside other packages that provide a more -// portable interface to the system, such as "os", "time" and "net". Use -// those packages rather than this one if you can. -// For details of the functions and data types in this package consult -// the manuals for the appropriate operating system. -// These calls return err == nil to indicate success; otherwise -// err represents an operating system error describing the failure and -// holds a value of type syscall.ErrorString. -package plan9 // import "golang.org/x/sys/plan9" - -import "unsafe" - -// ByteSliceFromString returns a NUL-terminated slice of bytes -// containing the text of s. If s contains a NUL byte at any -// location, it returns (nil, EINVAL). -func ByteSliceFromString(s string) ([]byte, error) { - for i := 0; i < len(s); i++ { - if s[i] == 0 { - return nil, EINVAL - } - } - a := make([]byte, len(s)+1) - copy(a, s) - return a, nil -} - -// BytePtrFromString returns a pointer to a NUL-terminated array of -// bytes containing the text of s. If s contains a NUL byte at any -// location, it returns (nil, EINVAL). -func BytePtrFromString(s string) (*byte, error) { - a, err := ByteSliceFromString(s) - if err != nil { - return nil, err - } - return &a[0], nil -} - -// Single-word zero for use when we need a valid pointer to 0 bytes. -// See mksyscall.pl. -var _zero uintptr - -func (ts *Timespec) Unix() (sec int64, nsec int64) { - return int64(ts.Sec), int64(ts.Nsec) -} - -func (tv *Timeval) Unix() (sec int64, nsec int64) { - return int64(tv.Sec), int64(tv.Usec) * 1000 -} - -func (ts *Timespec) Nano() int64 { - return int64(ts.Sec)*1e9 + int64(ts.Nsec) -} - -func (tv *Timeval) Nano() int64 { - return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 -} - -// use is a no-op, but the compiler cannot see that it is. -// Calling use(p) ensures that p is kept live until that point. -//go:noescape -func use(p unsafe.Pointer) diff --git a/vendor/golang.org/x/sys/plan9/syscall_plan9.go b/vendor/golang.org/x/sys/plan9/syscall_plan9.go deleted file mode 100644 index d39d07de1..000000000 --- a/vendor/golang.org/x/sys/plan9/syscall_plan9.go +++ /dev/null @@ -1,349 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Plan 9 system calls. -// This file is compiled as ordinary Go code, -// but it is also input to mksyscall, -// which parses the //sys lines and generates system call stubs. -// Note that sometimes we use a lowercase //sys name and -// wrap it in our own nicer implementation. - -package plan9 - -import ( - "syscall" - "unsafe" -) - -// A Note is a string describing a process note. -// It implements the os.Signal interface. -type Note string - -func (n Note) Signal() {} - -func (n Note) String() string { - return string(n) -} - -var ( - Stdin = 0 - Stdout = 1 - Stderr = 2 -) - -// For testing: clients can set this flag to force -// creation of IPv6 sockets to return EAFNOSUPPORT. -var SocketDisableIPv6 bool - -func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.ErrorString) -func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.ErrorString) -func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) -func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) - -func atoi(b []byte) (n uint) { - n = 0 - for i := 0; i < len(b); i++ { - n = n*10 + uint(b[i]-'0') - } - return -} - -func cstring(s []byte) string { - for i := range s { - if s[i] == 0 { - return string(s[0:i]) - } - } - return string(s) -} - -func errstr() string { - var buf [ERRMAX]byte - - RawSyscall(SYS_ERRSTR, uintptr(unsafe.Pointer(&buf[0])), uintptr(len(buf)), 0) - - buf[len(buf)-1] = 0 - return cstring(buf[:]) -} - -// Implemented in assembly to import from runtime. -func exit(code int) - -func Exit(code int) { exit(code) } - -func readnum(path string) (uint, error) { - var b [12]byte - - fd, e := Open(path, O_RDONLY) - if e != nil { - return 0, e - } - defer Close(fd) - - n, e := Pread(fd, b[:], 0) - - if e != nil { - return 0, e - } - - m := 0 - for ; m < n && b[m] == ' '; m++ { - } - - return atoi(b[m : n-1]), nil -} - -func Getpid() (pid int) { - n, _ := readnum("#c/pid") - return int(n) -} - -func Getppid() (ppid int) { - n, _ := readnum("#c/ppid") - return int(n) -} - -func Read(fd int, p []byte) (n int, err error) { - return Pread(fd, p, -1) -} - -func Write(fd int, p []byte) (n int, err error) { - return Pwrite(fd, p, -1) -} - -var ioSync int64 - -//sys fd2path(fd int, buf []byte) (err error) -func Fd2path(fd int) (path string, err error) { - var buf [512]byte - - e := fd2path(fd, buf[:]) - if e != nil { - return "", e - } - return cstring(buf[:]), nil -} - -//sys pipe(p *[2]int32) (err error) -func Pipe(p []int) (err error) { - if len(p) != 2 { - return syscall.ErrorString("bad arg in system call") - } - var pp [2]int32 - err = pipe(&pp) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -// Underlying system call writes to newoffset via pointer. -// Implemented in assembly to avoid allocation. -func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string) - -func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { - newoffset, e := seek(0, fd, offset, whence) - - if newoffset == -1 { - err = syscall.ErrorString(e) - } - return -} - -func Mkdir(path string, mode uint32) (err error) { - fd, err := Create(path, O_RDONLY, DMDIR|mode) - - if fd != -1 { - Close(fd) - } - - return -} - -type Waitmsg struct { - Pid int - Time [3]uint32 - Msg string -} - -func (w Waitmsg) Exited() bool { return true } -func (w Waitmsg) Signaled() bool { return false } - -func (w Waitmsg) ExitStatus() int { - if len(w.Msg) == 0 { - // a normal exit returns no message - return 0 - } - return 1 -} - -//sys await(s []byte) (n int, err error) -func Await(w *Waitmsg) (err error) { - var buf [512]byte - var f [5][]byte - - n, err := await(buf[:]) - - if err != nil || w == nil { - return - } - - nf := 0 - p := 0 - for i := 0; i < n && nf < len(f)-1; i++ { - if buf[i] == ' ' { - f[nf] = buf[p:i] - p = i + 1 - nf++ - } - } - f[nf] = buf[p:] - nf++ - - if nf != len(f) { - return syscall.ErrorString("invalid wait message") - } - w.Pid = int(atoi(f[0])) - w.Time[0] = uint32(atoi(f[1])) - w.Time[1] = uint32(atoi(f[2])) - w.Time[2] = uint32(atoi(f[3])) - w.Msg = cstring(f[4]) - if w.Msg == "''" { - // await() returns '' for no error - w.Msg = "" - } - return -} - -func Unmount(name, old string) (err error) { - fixwd() - oldp, err := BytePtrFromString(old) - if err != nil { - return err - } - oldptr := uintptr(unsafe.Pointer(oldp)) - - var r0 uintptr - var e syscall.ErrorString - - // bind(2) man page: If name is zero, everything bound or mounted upon old is unbound or unmounted. - if name == "" { - r0, _, e = Syscall(SYS_UNMOUNT, _zero, oldptr, 0) - } else { - namep, err := BytePtrFromString(name) - if err != nil { - return err - } - r0, _, e = Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(namep)), oldptr, 0) - } - - if int32(r0) == -1 { - err = e - } - return -} - -func Fchdir(fd int) (err error) { - path, err := Fd2path(fd) - - if err != nil { - return - } - - return Chdir(path) -} - -type Timespec struct { - Sec int32 - Nsec int32 -} - -type Timeval struct { - Sec int32 - Usec int32 -} - -func NsecToTimeval(nsec int64) (tv Timeval) { - nsec += 999 // round up to microsecond - tv.Usec = int32(nsec % 1e9 / 1e3) - tv.Sec = int32(nsec / 1e9) - return -} - -func nsec() int64 { - var scratch int64 - - r0, _, _ := Syscall(SYS_NSEC, uintptr(unsafe.Pointer(&scratch)), 0, 0) - // TODO(aram): remove hack after I fix _nsec in the pc64 kernel. - if r0 == 0 { - return scratch - } - return int64(r0) -} - -func Gettimeofday(tv *Timeval) error { - nsec := nsec() - *tv = NsecToTimeval(nsec) - return nil -} - -func Getpagesize() int { return 0x1000 } - -func Getegid() (egid int) { return -1 } -func Geteuid() (euid int) { return -1 } -func Getgid() (gid int) { return -1 } -func Getuid() (uid int) { return -1 } - -func Getgroups() (gids []int, err error) { - return make([]int, 0), nil -} - -//sys open(path string, mode int) (fd int, err error) -func Open(path string, mode int) (fd int, err error) { - fixwd() - return open(path, mode) -} - -//sys create(path string, mode int, perm uint32) (fd int, err error) -func Create(path string, mode int, perm uint32) (fd int, err error) { - fixwd() - return create(path, mode, perm) -} - -//sys remove(path string) (err error) -func Remove(path string) error { - fixwd() - return remove(path) -} - -//sys stat(path string, edir []byte) (n int, err error) -func Stat(path string, edir []byte) (n int, err error) { - fixwd() - return stat(path, edir) -} - -//sys bind(name string, old string, flag int) (err error) -func Bind(name string, old string, flag int) (err error) { - fixwd() - return bind(name, old, flag) -} - -//sys mount(fd int, afd int, old string, flag int, aname string) (err error) -func Mount(fd int, afd int, old string, flag int, aname string) (err error) { - fixwd() - return mount(fd, afd, old, flag, aname) -} - -//sys wstat(path string, edir []byte) (err error) -func Wstat(path string, edir []byte) (err error) { - fixwd() - return wstat(path, edir) -} - -//sys chdir(path string) (err error) -//sys Dup(oldfd int, newfd int) (fd int, err error) -//sys Pread(fd int, p []byte, offset int64) (n int, err error) -//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) -//sys Close(fd int) (err error) -//sys Fstat(fd int, edir []byte) (n int, err error) -//sys Fwstat(fd int, edir []byte) (err error) diff --git a/vendor/golang.org/x/sys/plan9/syscall_test.go b/vendor/golang.org/x/sys/plan9/syscall_test.go deleted file mode 100644 index 8f829bad0..000000000 --- a/vendor/golang.org/x/sys/plan9/syscall_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build plan9 - -package plan9_test - -import ( - "testing" - - "golang.org/x/sys/plan9" -) - -func testSetGetenv(t *testing.T, key, value string) { - err := plan9.Setenv(key, value) - if err != nil { - t.Fatalf("Setenv failed to set %q: %v", value, err) - } - newvalue, found := plan9.Getenv(key) - if !found { - t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value) - } - if newvalue != value { - t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value) - } -} - -func TestEnv(t *testing.T) { - testSetGetenv(t, "TESTENV", "AVALUE") - // make sure TESTENV gets set to "", not deleted - testSetGetenv(t, "TESTENV", "") -} diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go deleted file mode 100644 index b35598ad9..000000000 --- a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go +++ /dev/null @@ -1,292 +0,0 @@ -// mksyscall.pl -l32 -plan9 syscall_plan9.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT - -package plan9 - -import "unsafe" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fd2path(fd int, buf []byte) (err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func pipe(p *[2]int32) (err error) { - r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func await(s []byte) (n int, err error) { - var _p0 unsafe.Pointer - if len(s) > 0 { - _p0 = unsafe.Pointer(&s[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) - n = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func open(path string, mode int) (fd int, err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) - fd = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func create(path string, mode int, perm uint32) (fd int, err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) - fd = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func remove(path string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func stat(path string, edir []byte) (n int, err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - var _p1 unsafe.Pointer - if len(edir) > 0 { - _p1 = unsafe.Pointer(&edir[0]) - } else { - _p1 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) - use(unsafe.Pointer(_p0)) - n = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func bind(name string, old string, flag int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(name) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(old) - if err != nil { - return - } - r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mount(fd int, afd int, old string, flag int, aname string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(old) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(aname) - if err != nil { - return - } - r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func wstat(path string, edir []byte) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - var _p1 unsafe.Pointer - if len(edir) > 0 { - _p1 = unsafe.Pointer(&edir[0]) - } else { - _p1 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) - use(unsafe.Pointer(_p0)) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func chdir(path string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Dup(oldfd int, newfd int) (fd int, err error) { - r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) - fd = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Pread(fd int, p []byte, offset int64) (n int, err error) { - var _p0 unsafe.Pointer - if len(p) > 0 { - _p0 = unsafe.Pointer(&p[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) - n = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { - var _p0 unsafe.Pointer - if len(p) > 0 { - _p0 = unsafe.Pointer(&p[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) - n = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Close(fd int) (err error) { - r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Fstat(fd int, edir []byte) (n int, err error) { - var _p0 unsafe.Pointer - if len(edir) > 0 { - _p0 = unsafe.Pointer(&edir[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) - n = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Fwstat(fd int, edir []byte) (err error) { - var _p0 unsafe.Pointer - if len(edir) > 0 { - _p0 = unsafe.Pointer(&edir[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) - if int32(r0) == -1 { - err = e1 - } - return -} diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go deleted file mode 100644 index b35598ad9..000000000 --- a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go +++ /dev/null @@ -1,292 +0,0 @@ -// mksyscall.pl -l32 -plan9 syscall_plan9.go -// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT - -package plan9 - -import "unsafe" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func fd2path(fd int, buf []byte) (err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_FD2PATH, uintptr(fd), uintptr(_p0), uintptr(len(buf))) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func pipe(p *[2]int32) (err error) { - r0, _, e1 := Syscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func await(s []byte) (n int, err error) { - var _p0 unsafe.Pointer - if len(s) > 0 { - _p0 = unsafe.Pointer(&s[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_AWAIT, uintptr(_p0), uintptr(len(s)), 0) - n = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func open(path string, mode int) (fd int, err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) - fd = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func create(path string, mode int, perm uint32) (fd int, err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - r0, _, e1 := Syscall(SYS_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) - fd = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func remove(path string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - r0, _, e1 := Syscall(SYS_REMOVE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func stat(path string, edir []byte) (n int, err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - var _p1 unsafe.Pointer - if len(edir) > 0 { - _p1 = unsafe.Pointer(&edir[0]) - } else { - _p1 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) - use(unsafe.Pointer(_p0)) - n = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func bind(name string, old string, flag int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(name) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(old) - if err != nil { - return - } - r0, _, e1 := Syscall(SYS_BIND, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func mount(fd int, afd int, old string, flag int, aname string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(old) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(aname) - if err != nil { - return - } - r0, _, e1 := Syscall6(SYS_MOUNT, uintptr(fd), uintptr(afd), uintptr(unsafe.Pointer(_p0)), uintptr(flag), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func wstat(path string, edir []byte) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - var _p1 unsafe.Pointer - if len(edir) > 0 { - _p1 = unsafe.Pointer(&edir[0]) - } else { - _p1 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_WSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(edir))) - use(unsafe.Pointer(_p0)) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func chdir(path string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - r0, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Dup(oldfd int, newfd int) (fd int, err error) { - r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), uintptr(newfd), 0) - fd = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Pread(fd int, p []byte, offset int64) (n int, err error) { - var _p0 unsafe.Pointer - if len(p) > 0 { - _p0 = unsafe.Pointer(&p[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) - n = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Pwrite(fd int, p []byte, offset int64) (n int, err error) { - var _p0 unsafe.Pointer - if len(p) > 0 { - _p0 = unsafe.Pointer(&p[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) - n = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Close(fd int) (err error) { - r0, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Fstat(fd int, edir []byte) (n int, err error) { - var _p0 unsafe.Pointer - if len(edir) > 0 { - _p0 = unsafe.Pointer(&edir[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) - n = int(r0) - if int32(r0) == -1 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func Fwstat(fd int, edir []byte) (err error) { - var _p0 unsafe.Pointer - if len(edir) > 0 { - _p0 = unsafe.Pointer(&edir[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_FWSTAT, uintptr(fd), uintptr(_p0), uintptr(len(edir))) - if int32(r0) == -1 { - err = e1 - } - return -} diff --git a/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go b/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go deleted file mode 100644 index 22e8abd43..000000000 --- a/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go +++ /dev/null @@ -1,49 +0,0 @@ -// mksysnum_plan9.sh /opt/plan9/sys/src/libc/9syscall/sys.h -// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT - -package plan9 - -const ( - SYS_SYSR1 = 0 - SYS_BIND = 2 - SYS_CHDIR = 3 - SYS_CLOSE = 4 - SYS_DUP = 5 - SYS_ALARM = 6 - SYS_EXEC = 7 - SYS_EXITS = 8 - SYS_FAUTH = 10 - SYS_SEGBRK = 12 - SYS_OPEN = 14 - SYS_OSEEK = 16 - SYS_SLEEP = 17 - SYS_RFORK = 19 - SYS_PIPE = 21 - SYS_CREATE = 22 - SYS_FD2PATH = 23 - SYS_BRK_ = 24 - SYS_REMOVE = 25 - SYS_NOTIFY = 28 - SYS_NOTED = 29 - SYS_SEGATTACH = 30 - SYS_SEGDETACH = 31 - SYS_SEGFREE = 32 - SYS_SEGFLUSH = 33 - SYS_RENDEZVOUS = 34 - SYS_UNMOUNT = 35 - SYS_SEMACQUIRE = 37 - SYS_SEMRELEASE = 38 - SYS_SEEK = 39 - SYS_FVERSION = 40 - SYS_ERRSTR = 41 - SYS_STAT = 42 - SYS_FSTAT = 43 - SYS_WSTAT = 44 - SYS_FWSTAT = 45 - SYS_MOUNT = 46 - SYS_AWAIT = 47 - SYS_PREAD = 50 - SYS_PWRITE = 51 - SYS_TSEMACQUIRE = 52 - SYS_NSEC = 53 -) diff --git a/vendor/golang.org/x/sys/unix/linux/Dockerfile b/vendor/golang.org/x/sys/unix/linux/Dockerfile deleted file mode 100644 index 4397143c9..000000000 --- a/vendor/golang.org/x/sys/unix/linux/Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -FROM ubuntu:16.04 - -# Dependencies to get the git sources and go binaries -RUN apt-get update && apt-get install -y \ - curl \ - git \ - && rm -rf /var/lib/apt/lists/* - -# Get the git sources. If not cached, this takes O(5 minutes). -WORKDIR /git -RUN git config --global advice.detachedHead false -# Linux Kernel: Released 19 Feb 2017 -RUN git clone --branch v4.10 --depth 1 https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux -# GNU C library: Released 05 Feb 2017 (we should try to get a secure way to clone this) -RUN git clone --branch glibc-2.25 --depth 1 git://sourceware.org/git/glibc.git - -# Get Go 1.8 (https://github.com/docker-library/golang/blob/master/1.8/Dockerfile) -ENV GOLANG_VERSION 1.8 -ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz -ENV GOLANG_DOWNLOAD_SHA256 53ab94104ee3923e228a2cb2116e5e462ad3ebaeea06ff04463479d7f12d27ca - -RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \ - && echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - \ - && tar -C /usr/local -xzf golang.tar.gz \ - && rm golang.tar.gz - -ENV PATH /usr/local/go/bin:$PATH - -# Linux and Glibc build dependencies -RUN apt-get update && apt-get install -y \ - gawk make python \ - gcc gcc-multilib \ - gettext texinfo \ - && rm -rf /var/lib/apt/lists/* -# Emulator and cross compilers -RUN apt-get update && apt-get install -y \ - qemu \ - gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi \ - gcc-mips-linux-gnu gcc-mips64-linux-gnuabi64 \ - gcc-mips64el-linux-gnuabi64 gcc-mipsel-linux-gnu \ - gcc-powerpc64-linux-gnu gcc-powerpc64le-linux-gnu \ - gcc-s390x-linux-gnu gcc-sparc64-linux-gnu \ - && rm -rf /var/lib/apt/lists/* - -# Let the scripts know they are in the docker environment -ENV GOLANG_SYS_BUILD docker -WORKDIR /build -ENTRYPOINT ["go", "run", "linux/mkall.go", "/git/linux", "/git/glibc"] diff --git a/vendor/golang.org/x/sys/unix/linux/mkall.go b/vendor/golang.org/x/sys/unix/linux/mkall.go deleted file mode 100644 index 429754f16..000000000 --- a/vendor/golang.org/x/sys/unix/linux/mkall.go +++ /dev/null @@ -1,379 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// linux/mkall.go - Generates all Linux zsysnum, zsyscall, zerror, and ztype -// files for all 11 linux architectures supported by the go compiler. See -// README.md for more information about the build system. - -// To run it you must have a git checkout of the Linux kernel and glibc. Once -// the appropriate sources are ready, the program is run as: -// go run linux/mkall.go - -// +build ignore - -package main - -import ( - "fmt" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" -) - -// These will be paths to the appropriate source directories. -var LinuxDir string -var GlibcDir string - -const TempDir = "/tmp" -const IncludeDir = TempDir + "/include" // To hold our C headers -const BuildDir = TempDir + "/build" // To hold intermediate build files - -const GOOS = "linux" // Only for Linux targets -const BuildArch = "amd64" // Must be built on this architecture -const MinKernel = "2.6.23" // https://golang.org/doc/install#requirements - -type target struct { - GoArch string // Architecture name according to Go - LinuxArch string // Architecture name according to the Linux Kernel - GNUArch string // Architecture name according to GNU tools (https://wiki.debian.org/Multiarch/Tuples) - BigEndian bool // Default Little Endian - SignedChar bool // Is -fsigned-char needed (default no) - Bits int -} - -// List of the 11 Linux targets supported by the go compiler. sparc64 is not -// currently supported, though a port is in progress. -var targets = []target{ - { - GoArch: "386", - LinuxArch: "x86", - GNUArch: "i686-linux-gnu", // Note "i686" not "i386" - Bits: 32, - }, - { - GoArch: "amd64", - LinuxArch: "x86", - GNUArch: "x86_64-linux-gnu", - Bits: 64, - }, - { - GoArch: "arm64", - LinuxArch: "arm64", - GNUArch: "aarch64-linux-gnu", - SignedChar: true, - Bits: 64, - }, - { - GoArch: "arm", - LinuxArch: "arm", - GNUArch: "arm-linux-gnueabi", - Bits: 32, - }, - { - GoArch: "mips", - LinuxArch: "mips", - GNUArch: "mips-linux-gnu", - BigEndian: true, - Bits: 32, - }, - { - GoArch: "mipsle", - LinuxArch: "mips", - GNUArch: "mipsel-linux-gnu", - Bits: 32, - }, - { - GoArch: "mips64", - LinuxArch: "mips", - GNUArch: "mips64-linux-gnuabi64", - BigEndian: true, - Bits: 64, - }, - { - GoArch: "mips64le", - LinuxArch: "mips", - GNUArch: "mips64el-linux-gnuabi64", - Bits: 64, - }, - { - GoArch: "ppc64", - LinuxArch: "powerpc", - GNUArch: "powerpc64-linux-gnu", - BigEndian: true, - Bits: 64, - }, - { - GoArch: "ppc64le", - LinuxArch: "powerpc", - GNUArch: "powerpc64le-linux-gnu", - Bits: 64, - }, - { - GoArch: "s390x", - LinuxArch: "s390", - GNUArch: "s390x-linux-gnu", - BigEndian: true, - SignedChar: true, - Bits: 64, - }, - // { - // GoArch: "sparc64", - // LinuxArch: "sparc", - // GNUArch: "sparc64-linux-gnu", - // BigEndian: true, - // Bits: 64, - // }, -} - -func main() { - if runtime.GOOS != GOOS || runtime.GOARCH != BuildArch { - fmt.Printf("Build system has GOOS_GOARCH = %s_%s, need %s_%s\n", - runtime.GOOS, runtime.GOARCH, GOOS, BuildArch) - return - } - - // Check that we are using the new build system if we should - if os.Getenv("GOLANG_SYS_BUILD") != "docker" { - fmt.Println("In the new build system, mkall.go should not be called directly.") - fmt.Println("See README.md") - return - } - - // Parse the command line options - if len(os.Args) != 3 { - fmt.Println("USAGE: go run linux/mkall.go ") - return - } - LinuxDir = os.Args[1] - GlibcDir = os.Args[2] - - for _, t := range targets { - fmt.Printf("----- GENERATING: %s -----\n", t.GoArch) - if err := t.generateFiles(); err != nil { - fmt.Printf("%v\n***** FAILURE: %s *****\n\n", err, t.GoArch) - } else { - fmt.Printf("----- SUCCESS: %s -----\n\n", t.GoArch) - } - } -} - -// Makes an exec.Cmd with Stderr attached to os.Stderr -func makeCommand(name string, args ...string) *exec.Cmd { - cmd := exec.Command(name, args...) - cmd.Stderr = os.Stderr - return cmd -} - -// Runs the command, pipes output to a formatter, pipes that to an output file. -func (t *target) commandFormatOutput(formatter string, outputFile string, - name string, args ...string) (err error) { - mainCmd := makeCommand(name, args...) - - fmtCmd := makeCommand(formatter) - if formatter == "mkpost" { - fmtCmd = makeCommand("go", "run", "mkpost.go") - // Set GOARCH_TARGET so mkpost knows what GOARCH is.. - fmtCmd.Env = append(os.Environ(), "GOARCH_TARGET="+t.GoArch) - // Set GOARCH to host arch for mkpost, so it can run natively. - for i, s := range fmtCmd.Env { - if strings.HasPrefix(s, "GOARCH=") { - fmtCmd.Env[i] = "GOARCH=" + BuildArch - } - } - } - - // mainCmd | fmtCmd > outputFile - if fmtCmd.Stdin, err = mainCmd.StdoutPipe(); err != nil { - return - } - if fmtCmd.Stdout, err = os.Create(outputFile); err != nil { - return - } - - // Make sure the formatter eventually closes - if err = fmtCmd.Start(); err != nil { - return - } - defer func() { - fmtErr := fmtCmd.Wait() - if err == nil { - err = fmtErr - } - }() - - return mainCmd.Run() -} - -// Generates all the files for a Linux target -func (t *target) generateFiles() error { - // Setup environment variables - os.Setenv("GOOS", GOOS) - os.Setenv("GOARCH", t.GoArch) - - // Get appropriate compiler and emulator (unless on x86) - if t.LinuxArch != "x86" { - // Check/Setup cross compiler - compiler := t.GNUArch + "-gcc" - if _, err := exec.LookPath(compiler); err != nil { - return err - } - os.Setenv("CC", compiler) - - // Check/Setup emulator (usually first component of GNUArch) - qemuArchName := t.GNUArch[:strings.Index(t.GNUArch, "-")] - if t.LinuxArch == "powerpc" { - qemuArchName = t.GoArch - } - os.Setenv("GORUN", "qemu-"+qemuArchName) - } else { - os.Setenv("CC", "gcc") - } - - // Make the include directory and fill it with headers - if err := os.MkdirAll(IncludeDir, os.ModePerm); err != nil { - return err - } - defer os.RemoveAll(IncludeDir) - if err := t.makeHeaders(); err != nil { - return fmt.Errorf("could not make header files: %v", err) - } - fmt.Println("header files generated") - - // Make each of the four files - if err := t.makeZSysnumFile(); err != nil { - return fmt.Errorf("could not make zsysnum file: %v", err) - } - fmt.Println("zsysnum file generated") - - if err := t.makeZSyscallFile(); err != nil { - return fmt.Errorf("could not make zsyscall file: %v", err) - } - fmt.Println("zsyscall file generated") - - if err := t.makeZTypesFile(); err != nil { - return fmt.Errorf("could not make ztypes file: %v", err) - } - fmt.Println("ztypes file generated") - - if err := t.makeZErrorsFile(); err != nil { - return fmt.Errorf("could not make zerrors file: %v", err) - } - fmt.Println("zerrors file generated") - - return nil -} - -// Create the Linux and glibc headers in the include directory. -func (t *target) makeHeaders() error { - // Make the Linux headers we need for this architecture - linuxMake := makeCommand("make", "headers_install", "ARCH="+t.LinuxArch, "INSTALL_HDR_PATH="+TempDir) - linuxMake.Dir = LinuxDir - if err := linuxMake.Run(); err != nil { - return err - } - - // A Temporary build directory for glibc - if err := os.MkdirAll(BuildDir, os.ModePerm); err != nil { - return err - } - defer os.RemoveAll(BuildDir) - - // Make the glibc headers we need for this architecture - confScript := filepath.Join(GlibcDir, "configure") - glibcConf := makeCommand(confScript, "--prefix="+TempDir, "--host="+t.GNUArch, "--enable-kernel="+MinKernel) - glibcConf.Dir = BuildDir - if err := glibcConf.Run(); err != nil { - return err - } - glibcMake := makeCommand("make", "install-headers") - glibcMake.Dir = BuildDir - if err := glibcMake.Run(); err != nil { - return err - } - // We only need an empty stubs file - stubsFile := filepath.Join(IncludeDir, "gnu/stubs.h") - if file, err := os.Create(stubsFile); err != nil { - return err - } else { - file.Close() - } - - return nil -} - -// makes the zsysnum_linux_$GOARCH.go file -func (t *target) makeZSysnumFile() error { - zsysnumFile := fmt.Sprintf("zsysnum_linux_%s.go", t.GoArch) - unistdFile := filepath.Join(IncludeDir, "asm/unistd.h") - - args := append(t.cFlags(), unistdFile) - return t.commandFormatOutput("gofmt", zsysnumFile, "linux/mksysnum.pl", args...) -} - -// makes the zsyscall_linux_$GOARCH.go file -func (t *target) makeZSyscallFile() error { - zsyscallFile := fmt.Sprintf("zsyscall_linux_%s.go", t.GoArch) - // Find the correct architecture syscall file (might end with x.go) - archSyscallFile := fmt.Sprintf("syscall_linux_%s.go", t.GoArch) - if _, err := os.Stat(archSyscallFile); os.IsNotExist(err) { - shortArch := strings.TrimSuffix(t.GoArch, "le") - archSyscallFile = fmt.Sprintf("syscall_linux_%sx.go", shortArch) - } - - args := append(t.mksyscallFlags(), "-tags", "linux,"+t.GoArch, - "syscall_linux.go", archSyscallFile) - return t.commandFormatOutput("gofmt", zsyscallFile, "./mksyscall.pl", args...) -} - -// makes the zerrors_linux_$GOARCH.go file -func (t *target) makeZErrorsFile() error { - zerrorsFile := fmt.Sprintf("zerrors_linux_%s.go", t.GoArch) - - return t.commandFormatOutput("gofmt", zerrorsFile, "./mkerrors.sh", t.cFlags()...) -} - -// makes the ztypes_linux_$GOARCH.go file -func (t *target) makeZTypesFile() error { - ztypesFile := fmt.Sprintf("ztypes_linux_%s.go", t.GoArch) - - args := []string{"tool", "cgo", "-godefs", "--"} - args = append(args, t.cFlags()...) - args = append(args, "linux/types.go") - return t.commandFormatOutput("mkpost", ztypesFile, "go", args...) -} - -// Flags that should be given to gcc and cgo for this target -func (t *target) cFlags() []string { - // Compile statically to avoid cross-architecture dynamic linking. - flags := []string{"-Wall", "-Werror", "-static", "-I" + IncludeDir} - - // Architecture-specific flags - if t.SignedChar { - flags = append(flags, "-fsigned-char") - } - if t.LinuxArch == "x86" { - flags = append(flags, fmt.Sprintf("-m%d", t.Bits)) - } - - return flags -} - -// Flags that should be given to mksyscall for this target -func (t *target) mksyscallFlags() (flags []string) { - if t.Bits == 32 { - if t.BigEndian { - flags = append(flags, "-b32") - } else { - flags = append(flags, "-l32") - } - } - - // This flag menas a 64-bit value should use (even, odd)-pair. - if t.GoArch == "arm" || (t.LinuxArch == "mips" && t.Bits == 32) { - flags = append(flags, "-arm") - } - return -} diff --git a/vendor/golang.org/x/sys/unix/linux/mksysnum.pl b/vendor/golang.org/x/sys/unix/linux/mksysnum.pl deleted file mode 100755 index 63fd800bc..000000000 --- a/vendor/golang.org/x/sys/unix/linux/mksysnum.pl +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env perl -# Copyright 2009 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -use strict; - -if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { - print STDERR "GOARCH or GOOS not defined in environment\n"; - exit 1; -} - -# Check that we are using the new build system if we should -if($ENV{'GOLANG_SYS_BUILD'} ne "docker") { - print STDERR "In the new build system, mksysnum should not be called directly.\n"; - print STDERR "See README.md\n"; - exit 1; -} - -my $command = "$0 ". join(' ', @ARGV); - -print < 999){ - # ignore deprecated syscalls that are no longer implemented - # https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/uapi/asm-generic/unistd.h?id=refs/heads/master#n716 - return; - } - $name =~ y/a-z/A-Z/; - $num = $num + $offset; - print " SYS_$name = $num;\n"; -} - -my $prev; -open(CC, "$ENV{'CC'} -E -dD @ARGV |") || die "can't run $ENV{'CC'}"; -while(){ - if(/^#define __NR_Linux\s+([0-9]+)/){ - # mips/mips64: extract offset - $offset = $1; - } - elsif(/^#define __NR(\w*)_SYSCALL_BASE\s+([0-9]+)/){ - # arm: extract offset - $offset = $1; - } - elsif(/^#define __NR_syscalls\s+/) { - # ignore redefinitions of __NR_syscalls - } - elsif(/^#define __NR_(\w*)Linux_syscalls\s+/) { - # mips/mips64: ignore definitions about the number of syscalls - } - elsif(/^#define __NR_(\w+)\s+([0-9]+)/){ - $prev = $2; - fmt($1, $2); - } - elsif(/^#define __NR3264_(\w+)\s+([0-9]+)/){ - $prev = $2; - fmt($1, $2); - } - elsif(/^#define __NR_(\w+)\s+\(\w+\+\s*([0-9]+)\)/){ - fmt($1, $prev+$2) - } - elsif(/^#define __NR_(\w+)\s+\(__NR_Linux \+ ([0-9]+)/){ - fmt($1, $2); - } - elsif(/^#define __NR_(\w+)\s+\(__NR_SYSCALL_BASE \+ ([0-9]+)/){ - fmt($1, $2); - } -} - -print < -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// On mips64, the glibc stat and kernel stat do not agree -#if (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI64) - -// Use the stat defined by the kernel with a few modifications. These are: -// * The time fields (like st_atime and st_atimensec) use the timespec -// struct (like st_atim) for consitancy with the glibc fields. -// * The padding fields get different names to not break compatibility. -// * st_blocks is signed, again for compatibility. -struct stat { - unsigned int st_dev; - unsigned int st_pad1[3]; // Reserved for st_dev expansion - - unsigned long st_ino; - - mode_t st_mode; - __u32 st_nlink; - - uid_t st_uid; - gid_t st_gid; - - unsigned int st_rdev; - unsigned int st_pad2[3]; // Reserved for st_rdev expansion - - off_t st_size; - - // These are declared as speperate fields in the kernel. Here we use - // the timespec struct for consistancy with the other stat structs. - struct timespec st_atim; - struct timespec st_mtim; - struct timespec st_ctim; - - unsigned int st_blksize; - unsigned int st_pad4; - - long st_blocks; -}; - -// These are needed because we do not include fcntl.h or sys/types.h -#include -#include - -#else - -// Use the stat defined by glibc -#include -#include - -#endif - -// Certain constants and structs are missing from the fs/crypto UAPI -#define FS_MAX_KEY_SIZE 64 -struct fscrypt_key { - __u32 mode; - __u8 raw[FS_MAX_KEY_SIZE]; - __u32 size; -}; - -#ifdef TCSETS2 -// On systems that have "struct termios2" use this as type Termios. -typedef struct termios2 termios_t; -#else -typedef struct termios termios_t; -#endif - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_ll s5; - struct sockaddr_nl s6; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -// copied from /usr/include/bluetooth/hci.h -struct sockaddr_hci { - sa_family_t hci_family; - unsigned short hci_dev; - unsigned short hci_channel; -};; - -// copied from /usr/include/linux/un.h -struct my_sockaddr_un { - sa_family_t sun_family; -#if defined(__ARM_EABI__) || defined(__powerpc64__) - // on ARM char is by default unsigned - signed char sun_path[108]; -#else - char sun_path[108]; -#endif -}; - -#ifdef __ARM_EABI__ -typedef struct user_regs PtraceRegs; -#elif defined(__aarch64__) -typedef struct user_pt_regs PtraceRegs; -#elif defined(__mips__) || defined(__powerpc64__) -typedef struct pt_regs PtraceRegs; -#elif defined(__s390x__) -typedef struct _user_regs_struct PtraceRegs; -#elif defined(__sparc__) -#include -typedef struct pt_regs PtraceRegs; -#else -typedef struct user_regs_struct PtraceRegs; -#endif - -#if defined(__s390x__) -typedef struct _user_psw_struct ptracePsw; -typedef struct _user_fpregs_struct ptraceFpregs; -typedef struct _user_per_struct ptracePer; -#else -typedef struct {} ptracePsw; -typedef struct {} ptraceFpregs; -typedef struct {} ptracePer; -#endif - -// The real epoll_event is a union, and godefs doesn't handle it well. -struct my_epoll_event { - uint32_t events; -#if defined(__ARM_EABI__) || defined(__aarch64__) || (defined(__mips__) && _MIPS_SIM == _ABIO32) - // padding is not specified in linux/eventpoll.h but added to conform to the - // alignment requirements of EABI - int32_t padFd; -#elif defined(__powerpc64__) || defined(__s390x__) || defined(__sparc__) - int32_t _padFd; -#endif - int32_t fd; - int32_t pad; -}; - -*/ -import "C" - -// Machine characteristics; for internal use. - -const ( - sizeofPtr = C.sizeofPtr - sizeofShort = C.sizeof_short - sizeofInt = C.sizeof_int - sizeofLong = C.sizeof_long - sizeofLongLong = C.sizeof_longlong - PathMax = C.PATH_MAX -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timex C.struct_timex - -type Time_t C.time_t - -type Tms C.struct_tms - -type Utimbuf C.struct_utimbuf - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Dirent C.struct_dirent - -type Fsid C.fsid_t - -type Flock_t C.struct_flock - -// Filesystem Encryption - -type FscryptPolicy C.struct_fscrypt_policy - -type FscryptKey C.struct_fscrypt_key - -// Structure for Keyctl - -type KeyctlDHParams C.struct_keyctl_dh_params - -// Advice to Fadvise - -const ( - FADV_NORMAL = C.POSIX_FADV_NORMAL - FADV_RANDOM = C.POSIX_FADV_RANDOM - FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL - FADV_WILLNEED = C.POSIX_FADV_WILLNEED - FADV_DONTNEED = C.POSIX_FADV_DONTNEED - FADV_NOREUSE = C.POSIX_FADV_NOREUSE -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_my_sockaddr_un - -type RawSockaddrLinklayer C.struct_sockaddr_ll - -type RawSockaddrNetlink C.struct_sockaddr_nl - -type RawSockaddrHCI C.struct_sockaddr_hci - -type RawSockaddrCAN C.struct_sockaddr_can - -type RawSockaddrALG C.struct_sockaddr_alg - -type RawSockaddrVM C.struct_sockaddr_vm - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPMreqn C.struct_ip_mreqn - -type IPv6Mreq C.struct_ipv6_mreq - -type PacketMreq C.struct_packet_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet4Pktinfo C.struct_in_pktinfo - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -type Ucred C.struct_ucred - -type TCPInfo C.struct_tcp_info - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrLinklayer = C.sizeof_struct_sockaddr_ll - SizeofSockaddrNetlink = C.sizeof_struct_sockaddr_nl - SizeofSockaddrHCI = C.sizeof_struct_sockaddr_hci - SizeofSockaddrCAN = C.sizeof_struct_sockaddr_can - SizeofSockaddrALG = C.sizeof_struct_sockaddr_alg - SizeofSockaddrVM = C.sizeof_struct_sockaddr_vm - SizeofLinger = C.sizeof_struct_linger - SizeofIovec = C.sizeof_struct_iovec - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPMreqn = C.sizeof_struct_ip_mreqn - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofPacketMreq = C.sizeof_struct_packet_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter - SizeofUcred = C.sizeof_struct_ucred - SizeofTCPInfo = C.sizeof_struct_tcp_info -) - -// Netlink routing and interface messages - -const ( - IFA_UNSPEC = C.IFA_UNSPEC - IFA_ADDRESS = C.IFA_ADDRESS - IFA_LOCAL = C.IFA_LOCAL - IFA_LABEL = C.IFA_LABEL - IFA_BROADCAST = C.IFA_BROADCAST - IFA_ANYCAST = C.IFA_ANYCAST - IFA_CACHEINFO = C.IFA_CACHEINFO - IFA_MULTICAST = C.IFA_MULTICAST - IFLA_UNSPEC = C.IFLA_UNSPEC - IFLA_ADDRESS = C.IFLA_ADDRESS - IFLA_BROADCAST = C.IFLA_BROADCAST - IFLA_IFNAME = C.IFLA_IFNAME - IFLA_MTU = C.IFLA_MTU - IFLA_LINK = C.IFLA_LINK - IFLA_QDISC = C.IFLA_QDISC - IFLA_STATS = C.IFLA_STATS - IFLA_COST = C.IFLA_COST - IFLA_PRIORITY = C.IFLA_PRIORITY - IFLA_MASTER = C.IFLA_MASTER - IFLA_WIRELESS = C.IFLA_WIRELESS - IFLA_PROTINFO = C.IFLA_PROTINFO - IFLA_TXQLEN = C.IFLA_TXQLEN - IFLA_MAP = C.IFLA_MAP - IFLA_WEIGHT = C.IFLA_WEIGHT - IFLA_OPERSTATE = C.IFLA_OPERSTATE - IFLA_LINKMODE = C.IFLA_LINKMODE - IFLA_LINKINFO = C.IFLA_LINKINFO - IFLA_NET_NS_PID = C.IFLA_NET_NS_PID - IFLA_IFALIAS = C.IFLA_IFALIAS - IFLA_MAX = C.IFLA_MAX - RT_SCOPE_UNIVERSE = C.RT_SCOPE_UNIVERSE - RT_SCOPE_SITE = C.RT_SCOPE_SITE - RT_SCOPE_LINK = C.RT_SCOPE_LINK - RT_SCOPE_HOST = C.RT_SCOPE_HOST - RT_SCOPE_NOWHERE = C.RT_SCOPE_NOWHERE - RT_TABLE_UNSPEC = C.RT_TABLE_UNSPEC - RT_TABLE_COMPAT = C.RT_TABLE_COMPAT - RT_TABLE_DEFAULT = C.RT_TABLE_DEFAULT - RT_TABLE_MAIN = C.RT_TABLE_MAIN - RT_TABLE_LOCAL = C.RT_TABLE_LOCAL - RT_TABLE_MAX = C.RT_TABLE_MAX - RTA_UNSPEC = C.RTA_UNSPEC - RTA_DST = C.RTA_DST - RTA_SRC = C.RTA_SRC - RTA_IIF = C.RTA_IIF - RTA_OIF = C.RTA_OIF - RTA_GATEWAY = C.RTA_GATEWAY - RTA_PRIORITY = C.RTA_PRIORITY - RTA_PREFSRC = C.RTA_PREFSRC - RTA_METRICS = C.RTA_METRICS - RTA_MULTIPATH = C.RTA_MULTIPATH - RTA_FLOW = C.RTA_FLOW - RTA_CACHEINFO = C.RTA_CACHEINFO - RTA_TABLE = C.RTA_TABLE - RTN_UNSPEC = C.RTN_UNSPEC - RTN_UNICAST = C.RTN_UNICAST - RTN_LOCAL = C.RTN_LOCAL - RTN_BROADCAST = C.RTN_BROADCAST - RTN_ANYCAST = C.RTN_ANYCAST - RTN_MULTICAST = C.RTN_MULTICAST - RTN_BLACKHOLE = C.RTN_BLACKHOLE - RTN_UNREACHABLE = C.RTN_UNREACHABLE - RTN_PROHIBIT = C.RTN_PROHIBIT - RTN_THROW = C.RTN_THROW - RTN_NAT = C.RTN_NAT - RTN_XRESOLVE = C.RTN_XRESOLVE - RTNLGRP_NONE = C.RTNLGRP_NONE - RTNLGRP_LINK = C.RTNLGRP_LINK - RTNLGRP_NOTIFY = C.RTNLGRP_NOTIFY - RTNLGRP_NEIGH = C.RTNLGRP_NEIGH - RTNLGRP_TC = C.RTNLGRP_TC - RTNLGRP_IPV4_IFADDR = C.RTNLGRP_IPV4_IFADDR - RTNLGRP_IPV4_MROUTE = C.RTNLGRP_IPV4_MROUTE - RTNLGRP_IPV4_ROUTE = C.RTNLGRP_IPV4_ROUTE - RTNLGRP_IPV4_RULE = C.RTNLGRP_IPV4_RULE - RTNLGRP_IPV6_IFADDR = C.RTNLGRP_IPV6_IFADDR - RTNLGRP_IPV6_MROUTE = C.RTNLGRP_IPV6_MROUTE - RTNLGRP_IPV6_ROUTE = C.RTNLGRP_IPV6_ROUTE - RTNLGRP_IPV6_IFINFO = C.RTNLGRP_IPV6_IFINFO - RTNLGRP_IPV6_PREFIX = C.RTNLGRP_IPV6_PREFIX - RTNLGRP_IPV6_RULE = C.RTNLGRP_IPV6_RULE - RTNLGRP_ND_USEROPT = C.RTNLGRP_ND_USEROPT - SizeofNlMsghdr = C.sizeof_struct_nlmsghdr - SizeofNlMsgerr = C.sizeof_struct_nlmsgerr - SizeofRtGenmsg = C.sizeof_struct_rtgenmsg - SizeofNlAttr = C.sizeof_struct_nlattr - SizeofRtAttr = C.sizeof_struct_rtattr - SizeofIfInfomsg = C.sizeof_struct_ifinfomsg - SizeofIfAddrmsg = C.sizeof_struct_ifaddrmsg - SizeofRtMsg = C.sizeof_struct_rtmsg - SizeofRtNexthop = C.sizeof_struct_rtnexthop -) - -type NlMsghdr C.struct_nlmsghdr - -type NlMsgerr C.struct_nlmsgerr - -type RtGenmsg C.struct_rtgenmsg - -type NlAttr C.struct_nlattr - -type RtAttr C.struct_rtattr - -type IfInfomsg C.struct_ifinfomsg - -type IfAddrmsg C.struct_ifaddrmsg - -type RtMsg C.struct_rtmsg - -type RtNexthop C.struct_rtnexthop - -// Linux socket filter - -const ( - SizeofSockFilter = C.sizeof_struct_sock_filter - SizeofSockFprog = C.sizeof_struct_sock_fprog -) - -type SockFilter C.struct_sock_filter - -type SockFprog C.struct_sock_fprog - -// Inotify - -type InotifyEvent C.struct_inotify_event - -const SizeofInotifyEvent = C.sizeof_struct_inotify_event - -// Ptrace - -// Register structures -type PtraceRegs C.PtraceRegs - -// Structures contained in PtraceRegs on s390x (exported by mkpost.go) -type PtracePsw C.ptracePsw - -type PtraceFpregs C.ptraceFpregs - -type PtracePer C.ptracePer - -// Misc - -type FdSet C.fd_set - -type Sysinfo_t C.struct_sysinfo - -type Utsname C.struct_utsname - -type Ustat_t C.struct_ustat - -type EpollEvent C.struct_my_epoll_event - -const ( - AT_FDCWD = C.AT_FDCWD - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -type PollFd C.struct_pollfd - -const ( - POLLIN = C.POLLIN - POLLPRI = C.POLLPRI - POLLOUT = C.POLLOUT - POLLRDHUP = C.POLLRDHUP - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLNVAL = C.POLLNVAL -) - -type Sigset_t C.sigset_t - -const RNDGETENTCNT = C.RNDGETENTCNT - -const PERF_IOC_FLAG_GROUP = C.PERF_IOC_FLAG_GROUP - -// sysconf information - -const _SC_PAGESIZE = C._SC_PAGESIZE - -// Terminal handling - -type Termios C.termios_t - -type Winsize C.struct_winsize - -// Taskstats - -type Taskstats C.struct_taskstats - -const ( - TASKSTATS_CMD_UNSPEC = C.TASKSTATS_CMD_UNSPEC - TASKSTATS_CMD_GET = C.TASKSTATS_CMD_GET - TASKSTATS_CMD_NEW = C.TASKSTATS_CMD_NEW - TASKSTATS_TYPE_UNSPEC = C.TASKSTATS_TYPE_UNSPEC - TASKSTATS_TYPE_PID = C.TASKSTATS_TYPE_PID - TASKSTATS_TYPE_TGID = C.TASKSTATS_TYPE_TGID - TASKSTATS_TYPE_STATS = C.TASKSTATS_TYPE_STATS - TASKSTATS_TYPE_AGGR_PID = C.TASKSTATS_TYPE_AGGR_PID - TASKSTATS_TYPE_AGGR_TGID = C.TASKSTATS_TYPE_AGGR_TGID - TASKSTATS_TYPE_NULL = C.TASKSTATS_TYPE_NULL - TASKSTATS_CMD_ATTR_UNSPEC = C.TASKSTATS_CMD_ATTR_UNSPEC - TASKSTATS_CMD_ATTR_PID = C.TASKSTATS_CMD_ATTR_PID - TASKSTATS_CMD_ATTR_TGID = C.TASKSTATS_CMD_ATTR_TGID - TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = C.TASKSTATS_CMD_ATTR_REGISTER_CPUMASK - TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = C.TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK -) - -// Generic netlink - -type Genlmsghdr C.struct_genlmsghdr - -const ( - CTRL_CMD_UNSPEC = C.CTRL_CMD_UNSPEC - CTRL_CMD_NEWFAMILY = C.CTRL_CMD_NEWFAMILY - CTRL_CMD_DELFAMILY = C.CTRL_CMD_DELFAMILY - CTRL_CMD_GETFAMILY = C.CTRL_CMD_GETFAMILY - CTRL_CMD_NEWOPS = C.CTRL_CMD_NEWOPS - CTRL_CMD_DELOPS = C.CTRL_CMD_DELOPS - CTRL_CMD_GETOPS = C.CTRL_CMD_GETOPS - CTRL_CMD_NEWMCAST_GRP = C.CTRL_CMD_NEWMCAST_GRP - CTRL_CMD_DELMCAST_GRP = C.CTRL_CMD_DELMCAST_GRP - CTRL_CMD_GETMCAST_GRP = C.CTRL_CMD_GETMCAST_GRP - CTRL_ATTR_UNSPEC = C.CTRL_ATTR_UNSPEC - CTRL_ATTR_FAMILY_ID = C.CTRL_ATTR_FAMILY_ID - CTRL_ATTR_FAMILY_NAME = C.CTRL_ATTR_FAMILY_NAME - CTRL_ATTR_VERSION = C.CTRL_ATTR_VERSION - CTRL_ATTR_HDRSIZE = C.CTRL_ATTR_HDRSIZE - CTRL_ATTR_MAXATTR = C.CTRL_ATTR_MAXATTR - CTRL_ATTR_OPS = C.CTRL_ATTR_OPS - CTRL_ATTR_MCAST_GROUPS = C.CTRL_ATTR_MCAST_GROUPS - CTRL_ATTR_OP_UNSPEC = C.CTRL_ATTR_OP_UNSPEC - CTRL_ATTR_OP_ID = C.CTRL_ATTR_OP_ID - CTRL_ATTR_OP_FLAGS = C.CTRL_ATTR_OP_FLAGS - CTRL_ATTR_MCAST_GRP_UNSPEC = C.CTRL_ATTR_MCAST_GRP_UNSPEC - CTRL_ATTR_MCAST_GRP_NAME = C.CTRL_ATTR_MCAST_GRP_NAME - CTRL_ATTR_MCAST_GRP_ID = C.CTRL_ATTR_MCAST_GRP_ID -) diff --git a/vendor/golang.org/x/sys/windows/registry/export_test.go b/vendor/golang.org/x/sys/windows/registry/export_test.go deleted file mode 100644 index 8badf6fdc..000000000 --- a/vendor/golang.org/x/sys/windows/registry/export_test.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package registry - -func (k Key) SetValue(name string, valtype uint32, data []byte) error { - return k.setValue(name, valtype, data) -} diff --git a/vendor/golang.org/x/sys/windows/registry/key.go b/vendor/golang.org/x/sys/windows/registry/key.go deleted file mode 100644 index d0beb1956..000000000 --- a/vendor/golang.org/x/sys/windows/registry/key.go +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// Package registry provides access to the Windows registry. -// -// Here is a simple example, opening a registry key and reading a string value from it. -// -// k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) -// if err != nil { -// log.Fatal(err) -// } -// defer k.Close() -// -// s, _, err := k.GetStringValue("SystemRoot") -// if err != nil { -// log.Fatal(err) -// } -// fmt.Printf("Windows system root is %q\n", s) -// -package registry - -import ( - "io" - "syscall" - "time" -) - -const ( - // Registry key security and access rights. - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878.aspx - // for details. - ALL_ACCESS = 0xf003f - CREATE_LINK = 0x00020 - CREATE_SUB_KEY = 0x00004 - ENUMERATE_SUB_KEYS = 0x00008 - EXECUTE = 0x20019 - NOTIFY = 0x00010 - QUERY_VALUE = 0x00001 - READ = 0x20019 - SET_VALUE = 0x00002 - WOW64_32KEY = 0x00200 - WOW64_64KEY = 0x00100 - WRITE = 0x20006 -) - -// Key is a handle to an open Windows registry key. -// Keys can be obtained by calling OpenKey; there are -// also some predefined root keys such as CURRENT_USER. -// Keys can be used directly in the Windows API. -type Key syscall.Handle - -const ( - // Windows defines some predefined root keys that are always open. - // An application can use these keys as entry points to the registry. - // Normally these keys are used in OpenKey to open new keys, - // but they can also be used anywhere a Key is required. - CLASSES_ROOT = Key(syscall.HKEY_CLASSES_ROOT) - CURRENT_USER = Key(syscall.HKEY_CURRENT_USER) - LOCAL_MACHINE = Key(syscall.HKEY_LOCAL_MACHINE) - USERS = Key(syscall.HKEY_USERS) - CURRENT_CONFIG = Key(syscall.HKEY_CURRENT_CONFIG) - PERFORMANCE_DATA = Key(syscall.HKEY_PERFORMANCE_DATA) -) - -// Close closes open key k. -func (k Key) Close() error { - return syscall.RegCloseKey(syscall.Handle(k)) -} - -// OpenKey opens a new key with path name relative to key k. -// It accepts any open key, including CURRENT_USER and others, -// and returns the new key and an error. -// The access parameter specifies desired access rights to the -// key to be opened. -func OpenKey(k Key, path string, access uint32) (Key, error) { - p, err := syscall.UTF16PtrFromString(path) - if err != nil { - return 0, err - } - var subkey syscall.Handle - err = syscall.RegOpenKeyEx(syscall.Handle(k), p, 0, access, &subkey) - if err != nil { - return 0, err - } - return Key(subkey), nil -} - -// OpenRemoteKey opens a predefined registry key on another -// computer pcname. The key to be opened is specified by k, but -// can only be one of LOCAL_MACHINE, PERFORMANCE_DATA or USERS. -// If pcname is "", OpenRemoteKey returns local computer key. -func OpenRemoteKey(pcname string, k Key) (Key, error) { - var err error - var p *uint16 - if pcname != "" { - p, err = syscall.UTF16PtrFromString(`\\` + pcname) - if err != nil { - return 0, err - } - } - var remoteKey syscall.Handle - err = regConnectRegistry(p, syscall.Handle(k), &remoteKey) - if err != nil { - return 0, err - } - return Key(remoteKey), nil -} - -// ReadSubKeyNames returns the names of subkeys of key k. -// The parameter n controls the number of returned names, -// analogous to the way os.File.Readdirnames works. -func (k Key) ReadSubKeyNames(n int) ([]string, error) { - ki, err := k.Stat() - if err != nil { - return nil, err - } - names := make([]string, 0, ki.SubKeyCount) - buf := make([]uint16, ki.MaxSubKeyLen+1) // extra room for terminating zero byte -loopItems: - for i := uint32(0); ; i++ { - if n > 0 { - if len(names) == n { - return names, nil - } - } - l := uint32(len(buf)) - for { - err := syscall.RegEnumKeyEx(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) - if err == nil { - break - } - if err == syscall.ERROR_MORE_DATA { - // Double buffer size and try again. - l = uint32(2 * len(buf)) - buf = make([]uint16, l) - continue - } - if err == _ERROR_NO_MORE_ITEMS { - break loopItems - } - return names, err - } - names = append(names, syscall.UTF16ToString(buf[:l])) - } - if n > len(names) { - return names, io.EOF - } - return names, nil -} - -// CreateKey creates a key named path under open key k. -// CreateKey returns the new key and a boolean flag that reports -// whether the key already existed. -// The access parameter specifies the access rights for the key -// to be created. -func CreateKey(k Key, path string, access uint32) (newk Key, openedExisting bool, err error) { - var h syscall.Handle - var d uint32 - err = regCreateKeyEx(syscall.Handle(k), syscall.StringToUTF16Ptr(path), - 0, nil, _REG_OPTION_NON_VOLATILE, access, nil, &h, &d) - if err != nil { - return 0, false, err - } - return Key(h), d == _REG_OPENED_EXISTING_KEY, nil -} - -// DeleteKey deletes the subkey path of key k and its values. -func DeleteKey(k Key, path string) error { - return regDeleteKey(syscall.Handle(k), syscall.StringToUTF16Ptr(path)) -} - -// A KeyInfo describes the statistics of a key. It is returned by Stat. -type KeyInfo struct { - SubKeyCount uint32 - MaxSubKeyLen uint32 // size of the key's subkey with the longest name, in Unicode characters, not including the terminating zero byte - ValueCount uint32 - MaxValueNameLen uint32 // size of the key's longest value name, in Unicode characters, not including the terminating zero byte - MaxValueLen uint32 // longest data component among the key's values, in bytes - lastWriteTime syscall.Filetime -} - -// ModTime returns the key's last write time. -func (ki *KeyInfo) ModTime() time.Time { - return time.Unix(0, ki.lastWriteTime.Nanoseconds()) -} - -// Stat retrieves information about the open key k. -func (k Key) Stat() (*KeyInfo, error) { - var ki KeyInfo - err := syscall.RegQueryInfoKey(syscall.Handle(k), nil, nil, nil, - &ki.SubKeyCount, &ki.MaxSubKeyLen, nil, &ki.ValueCount, - &ki.MaxValueNameLen, &ki.MaxValueLen, nil, &ki.lastWriteTime) - if err != nil { - return nil, err - } - return &ki, nil -} diff --git a/vendor/golang.org/x/sys/windows/registry/mksyscall.go b/vendor/golang.org/x/sys/windows/registry/mksyscall.go deleted file mode 100644 index 0ac95ffe7..000000000 --- a/vendor/golang.org/x/sys/windows/registry/mksyscall.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package registry - -//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go diff --git a/vendor/golang.org/x/sys/windows/registry/registry_test.go b/vendor/golang.org/x/sys/windows/registry/registry_test.go deleted file mode 100644 index 3cb9771ca..000000000 --- a/vendor/golang.org/x/sys/windows/registry/registry_test.go +++ /dev/null @@ -1,756 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package registry_test - -import ( - "bytes" - "crypto/rand" - "os" - "syscall" - "testing" - "time" - "unsafe" - - "golang.org/x/sys/windows/registry" -) - -func randKeyName(prefix string) string { - const numbers = "0123456789" - buf := make([]byte, 10) - rand.Read(buf) - for i, b := range buf { - buf[i] = numbers[b%byte(len(numbers))] - } - return prefix + string(buf) -} - -func TestReadSubKeyNames(t *testing.T) { - k, err := registry.OpenKey(registry.CLASSES_ROOT, "TypeLib", registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE) - if err != nil { - t.Fatal(err) - } - defer k.Close() - - names, err := k.ReadSubKeyNames(-1) - if err != nil { - t.Fatal(err) - } - var foundStdOle bool - for _, name := range names { - // Every PC has "stdole 2.0 OLE Automation" library installed. - if name == "{00020430-0000-0000-C000-000000000046}" { - foundStdOle = true - } - } - if !foundStdOle { - t.Fatal("could not find stdole 2.0 OLE Automation") - } -} - -func TestCreateOpenDeleteKey(t *testing.T) { - k, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) - if err != nil { - t.Fatal(err) - } - defer k.Close() - - testKName := randKeyName("TestCreateOpenDeleteKey_") - - testK, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY) - if err != nil { - t.Fatal(err) - } - defer testK.Close() - - if exist { - t.Fatalf("key %q already exists", testKName) - } - - testKAgain, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY) - if err != nil { - t.Fatal(err) - } - defer testKAgain.Close() - - if !exist { - t.Fatalf("key %q should already exist", testKName) - } - - testKOpened, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS) - if err != nil { - t.Fatal(err) - } - defer testKOpened.Close() - - err = registry.DeleteKey(k, testKName) - if err != nil { - t.Fatal(err) - } - - testKOpenedAgain, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS) - if err == nil { - defer testKOpenedAgain.Close() - t.Fatalf("key %q should already been deleted", testKName) - } - if err != registry.ErrNotExist { - t.Fatalf(`unexpected error ("not exist" expected): %v`, err) - } -} - -func equalStringSlice(a, b []string) bool { - if len(a) != len(b) { - return false - } - if a == nil { - return true - } - for i := range a { - if a[i] != b[i] { - return false - } - } - return true -} - -type ValueTest struct { - Type uint32 - Name string - Value interface{} - WillFail bool -} - -var ValueTests = []ValueTest{ - {Type: registry.SZ, Name: "String1", Value: ""}, - {Type: registry.SZ, Name: "String2", Value: "\000", WillFail: true}, - {Type: registry.SZ, Name: "String3", Value: "Hello World"}, - {Type: registry.SZ, Name: "String4", Value: "Hello World\000", WillFail: true}, - {Type: registry.EXPAND_SZ, Name: "ExpString1", Value: ""}, - {Type: registry.EXPAND_SZ, Name: "ExpString2", Value: "\000", WillFail: true}, - {Type: registry.EXPAND_SZ, Name: "ExpString3", Value: "Hello World"}, - {Type: registry.EXPAND_SZ, Name: "ExpString4", Value: "Hello\000World", WillFail: true}, - {Type: registry.EXPAND_SZ, Name: "ExpString5", Value: "%PATH%"}, - {Type: registry.EXPAND_SZ, Name: "ExpString6", Value: "%NO_SUCH_VARIABLE%"}, - {Type: registry.EXPAND_SZ, Name: "ExpString7", Value: "%PATH%;."}, - {Type: registry.BINARY, Name: "Binary1", Value: []byte{}}, - {Type: registry.BINARY, Name: "Binary2", Value: []byte{1, 2, 3}}, - {Type: registry.BINARY, Name: "Binary3", Value: []byte{3, 2, 1, 0, 1, 2, 3}}, - {Type: registry.DWORD, Name: "Dword1", Value: uint64(0)}, - {Type: registry.DWORD, Name: "Dword2", Value: uint64(1)}, - {Type: registry.DWORD, Name: "Dword3", Value: uint64(0xff)}, - {Type: registry.DWORD, Name: "Dword4", Value: uint64(0xffff)}, - {Type: registry.QWORD, Name: "Qword1", Value: uint64(0)}, - {Type: registry.QWORD, Name: "Qword2", Value: uint64(1)}, - {Type: registry.QWORD, Name: "Qword3", Value: uint64(0xff)}, - {Type: registry.QWORD, Name: "Qword4", Value: uint64(0xffff)}, - {Type: registry.QWORD, Name: "Qword5", Value: uint64(0xffffff)}, - {Type: registry.QWORD, Name: "Qword6", Value: uint64(0xffffffff)}, - {Type: registry.MULTI_SZ, Name: "MultiString1", Value: []string{"a", "b", "c"}}, - {Type: registry.MULTI_SZ, Name: "MultiString2", Value: []string{"abc", "", "cba"}}, - {Type: registry.MULTI_SZ, Name: "MultiString3", Value: []string{""}}, - {Type: registry.MULTI_SZ, Name: "MultiString4", Value: []string{"abcdef"}}, - {Type: registry.MULTI_SZ, Name: "MultiString5", Value: []string{"\000"}, WillFail: true}, - {Type: registry.MULTI_SZ, Name: "MultiString6", Value: []string{"a\000b"}, WillFail: true}, - {Type: registry.MULTI_SZ, Name: "MultiString7", Value: []string{"ab", "\000", "cd"}, WillFail: true}, - {Type: registry.MULTI_SZ, Name: "MultiString8", Value: []string{"\000", "cd"}, WillFail: true}, - {Type: registry.MULTI_SZ, Name: "MultiString9", Value: []string{"ab", "\000"}, WillFail: true}, -} - -func setValues(t *testing.T, k registry.Key) { - for _, test := range ValueTests { - var err error - switch test.Type { - case registry.SZ: - err = k.SetStringValue(test.Name, test.Value.(string)) - case registry.EXPAND_SZ: - err = k.SetExpandStringValue(test.Name, test.Value.(string)) - case registry.MULTI_SZ: - err = k.SetStringsValue(test.Name, test.Value.([]string)) - case registry.BINARY: - err = k.SetBinaryValue(test.Name, test.Value.([]byte)) - case registry.DWORD: - err = k.SetDWordValue(test.Name, uint32(test.Value.(uint64))) - case registry.QWORD: - err = k.SetQWordValue(test.Name, test.Value.(uint64)) - default: - t.Fatalf("unsupported type %d for %s value", test.Type, test.Name) - } - if test.WillFail { - if err == nil { - t.Fatalf("setting %s value %q should fail, but succeeded", test.Name, test.Value) - } - } else { - if err != nil { - t.Fatal(err) - } - } - } -} - -func enumerateValues(t *testing.T, k registry.Key) { - names, err := k.ReadValueNames(-1) - if err != nil { - t.Error(err) - return - } - haveNames := make(map[string]bool) - for _, n := range names { - haveNames[n] = false - } - for _, test := range ValueTests { - wantFound := !test.WillFail - _, haveFound := haveNames[test.Name] - if wantFound && !haveFound { - t.Errorf("value %s is not found while enumerating", test.Name) - } - if haveFound && !wantFound { - t.Errorf("value %s is found while enumerating, but expected to fail", test.Name) - } - if haveFound { - delete(haveNames, test.Name) - } - } - for n, v := range haveNames { - t.Errorf("value %s (%v) is found while enumerating, but has not been cretaed", n, v) - } -} - -func testErrNotExist(t *testing.T, name string, err error) { - if err == nil { - t.Errorf("%s value should not exist", name) - return - } - if err != registry.ErrNotExist { - t.Errorf("reading %s value should return 'not exist' error, but got: %s", name, err) - return - } -} - -func testErrUnexpectedType(t *testing.T, test ValueTest, gottype uint32, err error) { - if err == nil { - t.Errorf("GetXValue(%q) should not succeed", test.Name) - return - } - if err != registry.ErrUnexpectedType { - t.Errorf("reading %s value should return 'unexpected key value type' error, but got: %s", test.Name, err) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } -} - -func testGetStringValue(t *testing.T, k registry.Key, test ValueTest) { - got, gottype, err := k.GetStringValue(test.Name) - if err != nil { - t.Errorf("GetStringValue(%s) failed: %v", test.Name, err) - return - } - if got != test.Value { - t.Errorf("want %s value %q, got %q", test.Name, test.Value, got) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } - if gottype == registry.EXPAND_SZ { - _, err = registry.ExpandString(got) - if err != nil { - t.Errorf("ExpandString(%s) failed: %v", got, err) - return - } - } -} - -func testGetIntegerValue(t *testing.T, k registry.Key, test ValueTest) { - got, gottype, err := k.GetIntegerValue(test.Name) - if err != nil { - t.Errorf("GetIntegerValue(%s) failed: %v", test.Name, err) - return - } - if got != test.Value.(uint64) { - t.Errorf("want %s value %v, got %v", test.Name, test.Value, got) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } -} - -func testGetBinaryValue(t *testing.T, k registry.Key, test ValueTest) { - got, gottype, err := k.GetBinaryValue(test.Name) - if err != nil { - t.Errorf("GetBinaryValue(%s) failed: %v", test.Name, err) - return - } - if !bytes.Equal(got, test.Value.([]byte)) { - t.Errorf("want %s value %v, got %v", test.Name, test.Value, got) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } -} - -func testGetStringsValue(t *testing.T, k registry.Key, test ValueTest) { - got, gottype, err := k.GetStringsValue(test.Name) - if err != nil { - t.Errorf("GetStringsValue(%s) failed: %v", test.Name, err) - return - } - if !equalStringSlice(got, test.Value.([]string)) { - t.Errorf("want %s value %#v, got %#v", test.Name, test.Value, got) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } -} - -func testGetValue(t *testing.T, k registry.Key, test ValueTest, size int) { - if size <= 0 { - return - } - // read data with no buffer - gotsize, gottype, err := k.GetValue(test.Name, nil) - if err != nil { - t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err) - return - } - if gotsize != size { - t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } - // read data with short buffer - gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size-1)) - if err == nil { - t.Errorf("GetValue(%s, [%d]byte) should fail, but succeeded", test.Name, size-1) - return - } - if err != registry.ErrShortBuffer { - t.Errorf("reading %s value should return 'short buffer' error, but got: %s", test.Name, err) - return - } - if gotsize != size { - t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } - // read full data - gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size)) - if err != nil { - t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err) - return - } - if gotsize != size { - t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } - // check GetValue returns ErrNotExist as required - _, _, err = k.GetValue(test.Name+"_not_there", make([]byte, size)) - if err == nil { - t.Errorf("GetValue(%q) should not succeed", test.Name) - return - } - if err != registry.ErrNotExist { - t.Errorf("GetValue(%q) should return 'not exist' error, but got: %s", test.Name, err) - return - } -} - -func testValues(t *testing.T, k registry.Key) { - for _, test := range ValueTests { - switch test.Type { - case registry.SZ, registry.EXPAND_SZ: - if test.WillFail { - _, _, err := k.GetStringValue(test.Name) - testErrNotExist(t, test.Name, err) - } else { - testGetStringValue(t, k, test) - _, gottype, err := k.GetIntegerValue(test.Name) - testErrUnexpectedType(t, test, gottype, err) - // Size of utf16 string in bytes is not perfect, - // but correct for current test values. - // Size also includes terminating 0. - testGetValue(t, k, test, (len(test.Value.(string))+1)*2) - } - _, _, err := k.GetStringValue(test.Name + "_string_not_created") - testErrNotExist(t, test.Name+"_string_not_created", err) - case registry.DWORD, registry.QWORD: - testGetIntegerValue(t, k, test) - _, gottype, err := k.GetBinaryValue(test.Name) - testErrUnexpectedType(t, test, gottype, err) - _, _, err = k.GetIntegerValue(test.Name + "_int_not_created") - testErrNotExist(t, test.Name+"_int_not_created", err) - size := 8 - if test.Type == registry.DWORD { - size = 4 - } - testGetValue(t, k, test, size) - case registry.BINARY: - testGetBinaryValue(t, k, test) - _, gottype, err := k.GetStringsValue(test.Name) - testErrUnexpectedType(t, test, gottype, err) - _, _, err = k.GetBinaryValue(test.Name + "_byte_not_created") - testErrNotExist(t, test.Name+"_byte_not_created", err) - testGetValue(t, k, test, len(test.Value.([]byte))) - case registry.MULTI_SZ: - if test.WillFail { - _, _, err := k.GetStringsValue(test.Name) - testErrNotExist(t, test.Name, err) - } else { - testGetStringsValue(t, k, test) - _, gottype, err := k.GetStringValue(test.Name) - testErrUnexpectedType(t, test, gottype, err) - size := 0 - for _, s := range test.Value.([]string) { - size += len(s) + 1 // nil terminated - } - size += 1 // extra nil at the end - size *= 2 // count bytes, not uint16 - testGetValue(t, k, test, size) - } - _, _, err := k.GetStringsValue(test.Name + "_strings_not_created") - testErrNotExist(t, test.Name+"_strings_not_created", err) - default: - t.Errorf("unsupported type %d for %s value", test.Type, test.Name) - continue - } - } -} - -func testStat(t *testing.T, k registry.Key) { - subk, _, err := registry.CreateKey(k, "subkey", registry.CREATE_SUB_KEY) - if err != nil { - t.Error(err) - return - } - defer subk.Close() - - defer registry.DeleteKey(k, "subkey") - - ki, err := k.Stat() - if err != nil { - t.Error(err) - return - } - if ki.SubKeyCount != 1 { - t.Error("key must have 1 subkey") - } - if ki.MaxSubKeyLen != 6 { - t.Error("key max subkey name length must be 6") - } - if ki.ValueCount != 24 { - t.Errorf("key must have 24 values, but is %d", ki.ValueCount) - } - if ki.MaxValueNameLen != 12 { - t.Errorf("key max value name length must be 10, but is %d", ki.MaxValueNameLen) - } - if ki.MaxValueLen != 38 { - t.Errorf("key max value length must be 38, but is %d", ki.MaxValueLen) - } - if mt, ct := ki.ModTime(), time.Now(); ct.Sub(mt) > 100*time.Millisecond { - t.Errorf("key mod time is not close to current time: mtime=%v current=%v delta=%v", mt, ct, ct.Sub(mt)) - } -} - -func deleteValues(t *testing.T, k registry.Key) { - for _, test := range ValueTests { - if test.WillFail { - continue - } - err := k.DeleteValue(test.Name) - if err != nil { - t.Error(err) - continue - } - } - names, err := k.ReadValueNames(-1) - if err != nil { - t.Error(err) - return - } - if len(names) != 0 { - t.Errorf("some values remain after deletion: %v", names) - } -} - -func TestValues(t *testing.T) { - softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) - if err != nil { - t.Fatal(err) - } - defer softwareK.Close() - - testKName := randKeyName("TestValues_") - - k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE) - if err != nil { - t.Fatal(err) - } - defer k.Close() - - if exist { - t.Fatalf("key %q already exists", testKName) - } - - defer registry.DeleteKey(softwareK, testKName) - - setValues(t, k) - - enumerateValues(t, k) - - testValues(t, k) - - testStat(t, k) - - deleteValues(t, k) -} - -func walkKey(t *testing.T, k registry.Key, kname string) { - names, err := k.ReadValueNames(-1) - if err != nil { - t.Fatalf("reading value names of %s failed: %v", kname, err) - } - for _, name := range names { - _, valtype, err := k.GetValue(name, nil) - if err != nil { - t.Fatalf("reading value type of %s of %s failed: %v", name, kname, err) - } - switch valtype { - case registry.NONE: - case registry.SZ: - _, _, err := k.GetStringValue(name) - if err != nil { - t.Error(err) - } - case registry.EXPAND_SZ: - s, _, err := k.GetStringValue(name) - if err != nil { - t.Error(err) - } - _, err = registry.ExpandString(s) - if err != nil { - t.Error(err) - } - case registry.DWORD, registry.QWORD: - _, _, err := k.GetIntegerValue(name) - if err != nil { - t.Error(err) - } - case registry.BINARY: - _, _, err := k.GetBinaryValue(name) - if err != nil { - t.Error(err) - } - case registry.MULTI_SZ: - _, _, err := k.GetStringsValue(name) - if err != nil { - t.Error(err) - } - case registry.FULL_RESOURCE_DESCRIPTOR, registry.RESOURCE_LIST, registry.RESOURCE_REQUIREMENTS_LIST: - // TODO: not implemented - default: - t.Fatalf("value type %d of %s of %s failed: %v", valtype, name, kname, err) - } - } - - names, err = k.ReadSubKeyNames(-1) - if err != nil { - t.Fatalf("reading sub-keys of %s failed: %v", kname, err) - } - for _, name := range names { - func() { - subk, err := registry.OpenKey(k, name, registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE) - if err != nil { - if err == syscall.ERROR_ACCESS_DENIED { - // ignore error, if we are not allowed to access this key - return - } - t.Fatalf("opening sub-keys %s of %s failed: %v", name, kname, err) - } - defer subk.Close() - - walkKey(t, subk, kname+`\`+name) - }() - } -} - -func TestWalkFullRegistry(t *testing.T) { - if testing.Short() { - t.Skip("skipping long running test in short mode") - } - walkKey(t, registry.CLASSES_ROOT, "CLASSES_ROOT") - walkKey(t, registry.CURRENT_USER, "CURRENT_USER") - walkKey(t, registry.LOCAL_MACHINE, "LOCAL_MACHINE") - walkKey(t, registry.USERS, "USERS") - walkKey(t, registry.CURRENT_CONFIG, "CURRENT_CONFIG") -} - -func TestExpandString(t *testing.T) { - got, err := registry.ExpandString("%PATH%") - if err != nil { - t.Fatal(err) - } - want := os.Getenv("PATH") - if got != want { - t.Errorf("want %q string expanded, got %q", want, got) - } -} - -func TestInvalidValues(t *testing.T) { - softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) - if err != nil { - t.Fatal(err) - } - defer softwareK.Close() - - testKName := randKeyName("TestInvalidValues_") - - k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE) - if err != nil { - t.Fatal(err) - } - defer k.Close() - - if exist { - t.Fatalf("key %q already exists", testKName) - } - - defer registry.DeleteKey(softwareK, testKName) - - var tests = []struct { - Type uint32 - Name string - Data []byte - }{ - {registry.DWORD, "Dword1", nil}, - {registry.DWORD, "Dword2", []byte{1, 2, 3}}, - {registry.QWORD, "Qword1", nil}, - {registry.QWORD, "Qword2", []byte{1, 2, 3}}, - {registry.QWORD, "Qword3", []byte{1, 2, 3, 4, 5, 6, 7}}, - {registry.MULTI_SZ, "MultiString1", nil}, - {registry.MULTI_SZ, "MultiString2", []byte{0}}, - {registry.MULTI_SZ, "MultiString3", []byte{'a', 'b', 0}}, - {registry.MULTI_SZ, "MultiString4", []byte{'a', 0, 0, 'b', 0}}, - {registry.MULTI_SZ, "MultiString5", []byte{'a', 0, 0}}, - } - - for _, test := range tests { - err := k.SetValue(test.Name, test.Type, test.Data) - if err != nil { - t.Fatalf("SetValue for %q failed: %v", test.Name, err) - } - } - - for _, test := range tests { - switch test.Type { - case registry.DWORD, registry.QWORD: - value, valType, err := k.GetIntegerValue(test.Name) - if err == nil { - t.Errorf("GetIntegerValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value) - } - case registry.MULTI_SZ: - value, valType, err := k.GetStringsValue(test.Name) - if err == nil { - if len(value) != 0 { - t.Errorf("GetStringsValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value) - } - } - default: - t.Errorf("unsupported type %d for %s value", test.Type, test.Name) - } - } -} - -func TestGetMUIStringValue(t *testing.T) { - if err := registry.LoadRegLoadMUIString(); err != nil { - t.Skip("regLoadMUIString not supported; skipping") - } - if err := procGetDynamicTimeZoneInformation.Find(); err != nil { - t.Skipf("%s not supported; skipping", procGetDynamicTimeZoneInformation.Name) - } - var dtzi DynamicTimezoneinformation - if _, err := GetDynamicTimeZoneInformation(&dtzi); err != nil { - t.Fatal(err) - } - tzKeyName := syscall.UTF16ToString(dtzi.TimeZoneKeyName[:]) - timezoneK, err := registry.OpenKey(registry.LOCAL_MACHINE, - `SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\`+tzKeyName, registry.READ) - if err != nil { - t.Fatal(err) - } - defer timezoneK.Close() - - type testType struct { - name string - want string - } - var tests = []testType{ - {"MUI_Std", syscall.UTF16ToString(dtzi.StandardName[:])}, - } - if dtzi.DynamicDaylightTimeDisabled == 0 { - tests = append(tests, testType{"MUI_Dlt", syscall.UTF16ToString(dtzi.DaylightName[:])}) - } - - for _, test := range tests { - got, err := timezoneK.GetMUIStringValue(test.name) - if err != nil { - t.Error("GetMUIStringValue:", err) - } - - if got != test.want { - t.Errorf("GetMUIStringValue: %s: Got %q, want %q", test.name, got, test.want) - } - } -} - -type DynamicTimezoneinformation struct { - Bias int32 - StandardName [32]uint16 - StandardDate syscall.Systemtime - StandardBias int32 - DaylightName [32]uint16 - DaylightDate syscall.Systemtime - DaylightBias int32 - TimeZoneKeyName [128]uint16 - DynamicDaylightTimeDisabled uint8 -} - -var ( - kernel32DLL = syscall.NewLazyDLL("kernel32") - - procGetDynamicTimeZoneInformation = kernel32DLL.NewProc("GetDynamicTimeZoneInformation") -) - -func GetDynamicTimeZoneInformation(dtzi *DynamicTimezoneinformation) (rc uint32, err error) { - r0, _, e1 := syscall.Syscall(procGetDynamicTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(dtzi)), 0, 0) - rc = uint32(r0) - if rc == 0xffffffff { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} diff --git a/vendor/golang.org/x/sys/windows/registry/syscall.go b/vendor/golang.org/x/sys/windows/registry/syscall.go deleted file mode 100644 index e66643cba..000000000 --- a/vendor/golang.org/x/sys/windows/registry/syscall.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package registry - -import "syscall" - -const ( - _REG_OPTION_NON_VOLATILE = 0 - - _REG_CREATED_NEW_KEY = 1 - _REG_OPENED_EXISTING_KEY = 2 - - _ERROR_NO_MORE_ITEMS syscall.Errno = 259 -) - -func LoadRegLoadMUIString() error { - return procRegLoadMUIStringW.Find() -} - -//sys regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) = advapi32.RegCreateKeyExW -//sys regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) = advapi32.RegDeleteKeyW -//sys regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) = advapi32.RegSetValueExW -//sys regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegEnumValueW -//sys regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) = advapi32.RegDeleteValueW -//sys regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) = advapi32.RegLoadMUIStringW -//sys regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) = advapi32.RegConnectRegistryW - -//sys expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW diff --git a/vendor/golang.org/x/sys/windows/registry/value.go b/vendor/golang.org/x/sys/windows/registry/value.go deleted file mode 100644 index 71d4e15ba..000000000 --- a/vendor/golang.org/x/sys/windows/registry/value.go +++ /dev/null @@ -1,384 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package registry - -import ( - "errors" - "io" - "syscall" - "unicode/utf16" - "unsafe" -) - -const ( - // Registry value types. - NONE = 0 - SZ = 1 - EXPAND_SZ = 2 - BINARY = 3 - DWORD = 4 - DWORD_BIG_ENDIAN = 5 - LINK = 6 - MULTI_SZ = 7 - RESOURCE_LIST = 8 - FULL_RESOURCE_DESCRIPTOR = 9 - RESOURCE_REQUIREMENTS_LIST = 10 - QWORD = 11 -) - -var ( - // ErrShortBuffer is returned when the buffer was too short for the operation. - ErrShortBuffer = syscall.ERROR_MORE_DATA - - // ErrNotExist is returned when a registry key or value does not exist. - ErrNotExist = syscall.ERROR_FILE_NOT_FOUND - - // ErrUnexpectedType is returned by Get*Value when the value's type was unexpected. - ErrUnexpectedType = errors.New("unexpected key value type") -) - -// GetValue retrieves the type and data for the specified value associated -// with an open key k. It fills up buffer buf and returns the retrieved -// byte count n. If buf is too small to fit the stored value it returns -// ErrShortBuffer error along with the required buffer size n. -// If no buffer is provided, it returns true and actual buffer size n. -// If no buffer is provided, GetValue returns the value's type only. -// If the value does not exist, the error returned is ErrNotExist. -// -// GetValue is a low level function. If value's type is known, use the appropriate -// Get*Value function instead. -func (k Key) GetValue(name string, buf []byte) (n int, valtype uint32, err error) { - pname, err := syscall.UTF16PtrFromString(name) - if err != nil { - return 0, 0, err - } - var pbuf *byte - if len(buf) > 0 { - pbuf = (*byte)(unsafe.Pointer(&buf[0])) - } - l := uint32(len(buf)) - err = syscall.RegQueryValueEx(syscall.Handle(k), pname, nil, &valtype, pbuf, &l) - if err != nil { - return int(l), valtype, err - } - return int(l), valtype, nil -} - -func (k Key) getValue(name string, buf []byte) (date []byte, valtype uint32, err error) { - p, err := syscall.UTF16PtrFromString(name) - if err != nil { - return nil, 0, err - } - var t uint32 - n := uint32(len(buf)) - for { - err = syscall.RegQueryValueEx(syscall.Handle(k), p, nil, &t, (*byte)(unsafe.Pointer(&buf[0])), &n) - if err == nil { - return buf[:n], t, nil - } - if err != syscall.ERROR_MORE_DATA { - return nil, 0, err - } - if n <= uint32(len(buf)) { - return nil, 0, err - } - buf = make([]byte, n) - } -} - -// GetStringValue retrieves the string value for the specified -// value name associated with an open key k. It also returns the value's type. -// If value does not exist, GetStringValue returns ErrNotExist. -// If value is not SZ or EXPAND_SZ, it will return the correct value -// type and ErrUnexpectedType. -func (k Key) GetStringValue(name string) (val string, valtype uint32, err error) { - data, typ, err2 := k.getValue(name, make([]byte, 64)) - if err2 != nil { - return "", typ, err2 - } - switch typ { - case SZ, EXPAND_SZ: - default: - return "", typ, ErrUnexpectedType - } - if len(data) == 0 { - return "", typ, nil - } - u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:] - return syscall.UTF16ToString(u), typ, nil -} - -// GetMUIStringValue retrieves the localized string value for -// the specified value name associated with an open key k. -// If the value name doesn't exist or the localized string value -// can't be resolved, GetMUIStringValue returns ErrNotExist. -// GetMUIStringValue panics if the system doesn't support -// regLoadMUIString; use LoadRegLoadMUIString to check if -// regLoadMUIString is supported before calling this function. -func (k Key) GetMUIStringValue(name string) (string, error) { - pname, err := syscall.UTF16PtrFromString(name) - if err != nil { - return "", err - } - - buf := make([]uint16, 1024) - var buflen uint32 - var pdir *uint16 - - err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) - if err == syscall.ERROR_FILE_NOT_FOUND { // Try fallback path - - // Try to resolve the string value using the system directory as - // a DLL search path; this assumes the string value is of the form - // @[path]\dllname,-strID but with no path given, e.g. @tzres.dll,-320. - - // This approach works with tzres.dll but may have to be revised - // in the future to allow callers to provide custom search paths. - - var s string - s, err = ExpandString("%SystemRoot%\\system32\\") - if err != nil { - return "", err - } - pdir, err = syscall.UTF16PtrFromString(s) - if err != nil { - return "", err - } - - err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) - } - - for err == syscall.ERROR_MORE_DATA { // Grow buffer if needed - if buflen <= uint32(len(buf)) { - break // Buffer not growing, assume race; break - } - buf = make([]uint16, buflen) - err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) - } - - if err != nil { - return "", err - } - - return syscall.UTF16ToString(buf), nil -} - -// ExpandString expands environment-variable strings and replaces -// them with the values defined for the current user. -// Use ExpandString to expand EXPAND_SZ strings. -func ExpandString(value string) (string, error) { - if value == "" { - return "", nil - } - p, err := syscall.UTF16PtrFromString(value) - if err != nil { - return "", err - } - r := make([]uint16, 100) - for { - n, err := expandEnvironmentStrings(p, &r[0], uint32(len(r))) - if err != nil { - return "", err - } - if n <= uint32(len(r)) { - u := (*[1 << 29]uint16)(unsafe.Pointer(&r[0]))[:] - return syscall.UTF16ToString(u), nil - } - r = make([]uint16, n) - } -} - -// GetStringsValue retrieves the []string value for the specified -// value name associated with an open key k. It also returns the value's type. -// If value does not exist, GetStringsValue returns ErrNotExist. -// If value is not MULTI_SZ, it will return the correct value -// type and ErrUnexpectedType. -func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err error) { - data, typ, err2 := k.getValue(name, make([]byte, 64)) - if err2 != nil { - return nil, typ, err2 - } - if typ != MULTI_SZ { - return nil, typ, ErrUnexpectedType - } - if len(data) == 0 { - return nil, typ, nil - } - p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:len(data)/2] - if len(p) == 0 { - return nil, typ, nil - } - if p[len(p)-1] == 0 { - p = p[:len(p)-1] // remove terminating null - } - val = make([]string, 0, 5) - from := 0 - for i, c := range p { - if c == 0 { - val = append(val, string(utf16.Decode(p[from:i]))) - from = i + 1 - } - } - return val, typ, nil -} - -// GetIntegerValue retrieves the integer value for the specified -// value name associated with an open key k. It also returns the value's type. -// If value does not exist, GetIntegerValue returns ErrNotExist. -// If value is not DWORD or QWORD, it will return the correct value -// type and ErrUnexpectedType. -func (k Key) GetIntegerValue(name string) (val uint64, valtype uint32, err error) { - data, typ, err2 := k.getValue(name, make([]byte, 8)) - if err2 != nil { - return 0, typ, err2 - } - switch typ { - case DWORD: - if len(data) != 4 { - return 0, typ, errors.New("DWORD value is not 4 bytes long") - } - return uint64(*(*uint32)(unsafe.Pointer(&data[0]))), DWORD, nil - case QWORD: - if len(data) != 8 { - return 0, typ, errors.New("QWORD value is not 8 bytes long") - } - return uint64(*(*uint64)(unsafe.Pointer(&data[0]))), QWORD, nil - default: - return 0, typ, ErrUnexpectedType - } -} - -// GetBinaryValue retrieves the binary value for the specified -// value name associated with an open key k. It also returns the value's type. -// If value does not exist, GetBinaryValue returns ErrNotExist. -// If value is not BINARY, it will return the correct value -// type and ErrUnexpectedType. -func (k Key) GetBinaryValue(name string) (val []byte, valtype uint32, err error) { - data, typ, err2 := k.getValue(name, make([]byte, 64)) - if err2 != nil { - return nil, typ, err2 - } - if typ != BINARY { - return nil, typ, ErrUnexpectedType - } - return data, typ, nil -} - -func (k Key) setValue(name string, valtype uint32, data []byte) error { - p, err := syscall.UTF16PtrFromString(name) - if err != nil { - return err - } - if len(data) == 0 { - return regSetValueEx(syscall.Handle(k), p, 0, valtype, nil, 0) - } - return regSetValueEx(syscall.Handle(k), p, 0, valtype, &data[0], uint32(len(data))) -} - -// SetDWordValue sets the data and type of a name value -// under key k to value and DWORD. -func (k Key) SetDWordValue(name string, value uint32) error { - return k.setValue(name, DWORD, (*[4]byte)(unsafe.Pointer(&value))[:]) -} - -// SetQWordValue sets the data and type of a name value -// under key k to value and QWORD. -func (k Key) SetQWordValue(name string, value uint64) error { - return k.setValue(name, QWORD, (*[8]byte)(unsafe.Pointer(&value))[:]) -} - -func (k Key) setStringValue(name string, valtype uint32, value string) error { - v, err := syscall.UTF16FromString(value) - if err != nil { - return err - } - buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] - return k.setValue(name, valtype, buf) -} - -// SetStringValue sets the data and type of a name value -// under key k to value and SZ. The value must not contain a zero byte. -func (k Key) SetStringValue(name, value string) error { - return k.setStringValue(name, SZ, value) -} - -// SetExpandStringValue sets the data and type of a name value -// under key k to value and EXPAND_SZ. The value must not contain a zero byte. -func (k Key) SetExpandStringValue(name, value string) error { - return k.setStringValue(name, EXPAND_SZ, value) -} - -// SetStringsValue sets the data and type of a name value -// under key k to value and MULTI_SZ. The value strings -// must not contain a zero byte. -func (k Key) SetStringsValue(name string, value []string) error { - ss := "" - for _, s := range value { - for i := 0; i < len(s); i++ { - if s[i] == 0 { - return errors.New("string cannot have 0 inside") - } - } - ss += s + "\x00" - } - v := utf16.Encode([]rune(ss + "\x00")) - buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] - return k.setValue(name, MULTI_SZ, buf) -} - -// SetBinaryValue sets the data and type of a name value -// under key k to value and BINARY. -func (k Key) SetBinaryValue(name string, value []byte) error { - return k.setValue(name, BINARY, value) -} - -// DeleteValue removes a named value from the key k. -func (k Key) DeleteValue(name string) error { - return regDeleteValue(syscall.Handle(k), syscall.StringToUTF16Ptr(name)) -} - -// ReadValueNames returns the value names of key k. -// The parameter n controls the number of returned names, -// analogous to the way os.File.Readdirnames works. -func (k Key) ReadValueNames(n int) ([]string, error) { - ki, err := k.Stat() - if err != nil { - return nil, err - } - names := make([]string, 0, ki.ValueCount) - buf := make([]uint16, ki.MaxValueNameLen+1) // extra room for terminating null character -loopItems: - for i := uint32(0); ; i++ { - if n > 0 { - if len(names) == n { - return names, nil - } - } - l := uint32(len(buf)) - for { - err := regEnumValue(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) - if err == nil { - break - } - if err == syscall.ERROR_MORE_DATA { - // Double buffer size and try again. - l = uint32(2 * len(buf)) - buf = make([]uint16, l) - continue - } - if err == _ERROR_NO_MORE_ITEMS { - break loopItems - } - return names, err - } - names = append(names, syscall.UTF16ToString(buf[:l])) - } - if n > len(names) { - return names, io.EOF - } - return names, nil -} diff --git a/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go deleted file mode 100644 index ceebdd772..000000000 --- a/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go +++ /dev/null @@ -1,120 +0,0 @@ -// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT - -package registry - -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 ( - modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - - procRegCreateKeyExW = modadvapi32.NewProc("RegCreateKeyExW") - procRegDeleteKeyW = modadvapi32.NewProc("RegDeleteKeyW") - procRegSetValueExW = modadvapi32.NewProc("RegSetValueExW") - procRegEnumValueW = modadvapi32.NewProc("RegEnumValueW") - procRegDeleteValueW = modadvapi32.NewProc("RegDeleteValueW") - procRegLoadMUIStringW = modadvapi32.NewProc("RegLoadMUIStringW") - procRegConnectRegistryW = modadvapi32.NewProc("RegConnectRegistryW") - procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW") -) - -func regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) { - r0, _, _ := syscall.Syscall9(procRegCreateKeyExW.Addr(), 9, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(reserved), uintptr(unsafe.Pointer(class)), uintptr(options), uintptr(desired), uintptr(unsafe.Pointer(sa)), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition))) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) { - r0, _, _ := syscall.Syscall(procRegDeleteKeyW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(subkey)), 0) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) { - r0, _, _ := syscall.Syscall6(procRegSetValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(valueName)), uintptr(reserved), uintptr(vtype), uintptr(unsafe.Pointer(buf)), uintptr(bufsize)) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { - r0, _, _ := syscall.Syscall9(procRegEnumValueW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)), 0) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) { - r0, _, _ := syscall.Syscall(procRegDeleteValueW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(name)), 0) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) { - r0, _, _ := syscall.Syscall9(procRegLoadMUIStringW.Addr(), 7, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(unsafe.Pointer(buflenCopied)), uintptr(flags), uintptr(unsafe.Pointer(dir)), 0, 0) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) { - r0, _, _ := syscall.Syscall(procRegConnectRegistryW.Addr(), 3, uintptr(unsafe.Pointer(machinename)), uintptr(key), uintptr(unsafe.Pointer(result))) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) { - r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size)) - n = uint32(r0) - if n == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} diff --git a/vendor/golang.org/x/sys/windows/svc/debug/log.go b/vendor/golang.org/x/sys/windows/svc/debug/log.go deleted file mode 100644 index e51ab42a1..000000000 --- a/vendor/golang.org/x/sys/windows/svc/debug/log.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package debug - -import ( - "os" - "strconv" -) - -// Log interface allows different log implementations to be used. -type Log interface { - Close() error - Info(eid uint32, msg string) error - Warning(eid uint32, msg string) error - Error(eid uint32, msg string) error -} - -// ConsoleLog provides access to the console. -type ConsoleLog struct { - Name string -} - -// New creates new ConsoleLog. -func New(source string) *ConsoleLog { - return &ConsoleLog{Name: source} -} - -// Close closes console log l. -func (l *ConsoleLog) Close() error { - return nil -} - -func (l *ConsoleLog) report(kind string, eid uint32, msg string) error { - s := l.Name + "." + kind + "(" + strconv.Itoa(int(eid)) + "): " + msg + "\n" - _, err := os.Stdout.Write([]byte(s)) - return err -} - -// Info writes an information event msg with event id eid to the console l. -func (l *ConsoleLog) Info(eid uint32, msg string) error { - return l.report("info", eid, msg) -} - -// Warning writes an warning event msg with event id eid to the console l. -func (l *ConsoleLog) Warning(eid uint32, msg string) error { - return l.report("warn", eid, msg) -} - -// Error writes an error event msg with event id eid to the console l. -func (l *ConsoleLog) Error(eid uint32, msg string) error { - return l.report("error", eid, msg) -} diff --git a/vendor/golang.org/x/sys/windows/svc/debug/service.go b/vendor/golang.org/x/sys/windows/svc/debug/service.go deleted file mode 100644 index 123df9893..000000000 --- a/vendor/golang.org/x/sys/windows/svc/debug/service.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// Package debug provides facilities to execute svc.Handler on console. -// -package debug - -import ( - "os" - "os/signal" - "syscall" - - "golang.org/x/sys/windows/svc" -) - -// Run executes service name by calling appropriate handler function. -// The process is running on console, unlike real service. Use Ctrl+C to -// send "Stop" command to your service. -func Run(name string, handler svc.Handler) error { - cmds := make(chan svc.ChangeRequest) - changes := make(chan svc.Status) - - sig := make(chan os.Signal) - signal.Notify(sig) - - go func() { - status := svc.Status{State: svc.Stopped} - for { - select { - case <-sig: - cmds <- svc.ChangeRequest{svc.Stop, 0, 0, status} - case status = <-changes: - } - } - }() - - _, errno := handler.Execute([]string{name}, cmds, changes) - if errno != 0 { - return syscall.Errno(errno) - } - return nil -} diff --git a/vendor/golang.org/x/sys/windows/svc/event.go b/vendor/golang.org/x/sys/windows/svc/event.go deleted file mode 100644 index 0508e2288..000000000 --- a/vendor/golang.org/x/sys/windows/svc/event.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package svc - -import ( - "errors" - - "golang.org/x/sys/windows" -) - -// event represents auto-reset, initially non-signaled Windows event. -// It is used to communicate between go and asm parts of this package. -type event struct { - h windows.Handle -} - -func newEvent() (*event, error) { - h, err := windows.CreateEvent(nil, 0, 0, nil) - if err != nil { - return nil, err - } - return &event{h: h}, nil -} - -func (e *event) Close() error { - return windows.CloseHandle(e.h) -} - -func (e *event) Set() error { - return windows.SetEvent(e.h) -} - -func (e *event) Wait() error { - s, err := windows.WaitForSingleObject(e.h, windows.INFINITE) - switch s { - case windows.WAIT_OBJECT_0: - break - case windows.WAIT_FAILED: - return err - default: - return errors.New("unexpected result from WaitForSingleObject") - } - return nil -} diff --git a/vendor/golang.org/x/sys/windows/svc/eventlog/install.go b/vendor/golang.org/x/sys/windows/svc/eventlog/install.go deleted file mode 100644 index c76a3760a..000000000 --- a/vendor/golang.org/x/sys/windows/svc/eventlog/install.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package eventlog - -import ( - "errors" - - "golang.org/x/sys/windows" - "golang.org/x/sys/windows/registry" -) - -const ( - // Log levels. - Info = windows.EVENTLOG_INFORMATION_TYPE - Warning = windows.EVENTLOG_WARNING_TYPE - Error = windows.EVENTLOG_ERROR_TYPE -) - -const addKeyName = `SYSTEM\CurrentControlSet\Services\EventLog\Application` - -// Install modifies PC registry to allow logging with an event source src. -// It adds all required keys and values to the event log registry key. -// Install uses msgFile as the event message file. If useExpandKey is true, -// the event message file is installed as REG_EXPAND_SZ value, -// otherwise as REG_SZ. Use bitwise of log.Error, log.Warning and -// log.Info to specify events supported by the new event source. -func Install(src, msgFile string, useExpandKey bool, eventsSupported uint32) error { - appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.CREATE_SUB_KEY) - if err != nil { - return err - } - defer appkey.Close() - - sk, alreadyExist, err := registry.CreateKey(appkey, src, registry.SET_VALUE) - if err != nil { - return err - } - defer sk.Close() - if alreadyExist { - return errors.New(addKeyName + `\` + src + " registry key already exists") - } - - err = sk.SetDWordValue("CustomSource", 1) - if err != nil { - return err - } - if useExpandKey { - err = sk.SetExpandStringValue("EventMessageFile", msgFile) - } else { - err = sk.SetStringValue("EventMessageFile", msgFile) - } - if err != nil { - return err - } - err = sk.SetDWordValue("TypesSupported", eventsSupported) - if err != nil { - return err - } - return nil -} - -// InstallAsEventCreate is the same as Install, but uses -// %SystemRoot%\System32\EventCreate.exe as the event message file. -func InstallAsEventCreate(src string, eventsSupported uint32) error { - return Install(src, "%SystemRoot%\\System32\\EventCreate.exe", true, eventsSupported) -} - -// Remove deletes all registry elements installed by the correspondent Install. -func Remove(src string) error { - appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.SET_VALUE) - if err != nil { - return err - } - defer appkey.Close() - return registry.DeleteKey(appkey, src) -} diff --git a/vendor/golang.org/x/sys/windows/svc/eventlog/log.go b/vendor/golang.org/x/sys/windows/svc/eventlog/log.go deleted file mode 100644 index 46e5153d0..000000000 --- a/vendor/golang.org/x/sys/windows/svc/eventlog/log.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// Package eventlog implements access to Windows event log. -// -package eventlog - -import ( - "errors" - "syscall" - - "golang.org/x/sys/windows" -) - -// Log provides access to the system log. -type Log struct { - Handle windows.Handle -} - -// Open retrieves a handle to the specified event log. -func Open(source string) (*Log, error) { - return OpenRemote("", source) -} - -// OpenRemote does the same as Open, but on different computer host. -func OpenRemote(host, source string) (*Log, error) { - if source == "" { - return nil, errors.New("Specify event log source") - } - var s *uint16 - if host != "" { - s = syscall.StringToUTF16Ptr(host) - } - h, err := windows.RegisterEventSource(s, syscall.StringToUTF16Ptr(source)) - if err != nil { - return nil, err - } - return &Log{Handle: h}, nil -} - -// Close closes event log l. -func (l *Log) Close() error { - return windows.DeregisterEventSource(l.Handle) -} - -func (l *Log) report(etype uint16, eid uint32, msg string) error { - ss := []*uint16{syscall.StringToUTF16Ptr(msg)} - return windows.ReportEvent(l.Handle, etype, 0, eid, 0, 1, 0, &ss[0], nil) -} - -// Info writes an information event msg with event id eid to the end of event log l. -// When EventCreate.exe is used, eid must be between 1 and 1000. -func (l *Log) Info(eid uint32, msg string) error { - return l.report(windows.EVENTLOG_INFORMATION_TYPE, eid, msg) -} - -// Warning writes an warning event msg with event id eid to the end of event log l. -// When EventCreate.exe is used, eid must be between 1 and 1000. -func (l *Log) Warning(eid uint32, msg string) error { - return l.report(windows.EVENTLOG_WARNING_TYPE, eid, msg) -} - -// Error writes an error event msg with event id eid to the end of event log l. -// When EventCreate.exe is used, eid must be between 1 and 1000. -func (l *Log) Error(eid uint32, msg string) error { - return l.report(windows.EVENTLOG_ERROR_TYPE, eid, msg) -} diff --git a/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go b/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go deleted file mode 100644 index 4dd8ad9e7..000000000 --- a/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package eventlog_test - -import ( - "testing" - - "golang.org/x/sys/windows/svc/eventlog" -) - -func TestLog(t *testing.T) { - if testing.Short() { - t.Skip("skipping test in short mode - it modifies system logs") - } - - const name = "mylog" - const supports = eventlog.Error | eventlog.Warning | eventlog.Info - err := eventlog.InstallAsEventCreate(name, supports) - if err != nil { - t.Fatalf("Install failed: %s", err) - } - defer func() { - err = eventlog.Remove(name) - if err != nil { - t.Fatalf("Remove failed: %s", err) - } - }() - - l, err := eventlog.Open(name) - if err != nil { - t.Fatalf("Open failed: %s", err) - } - defer l.Close() - - err = l.Info(1, "info") - if err != nil { - t.Fatalf("Info failed: %s", err) - } - err = l.Warning(2, "warning") - if err != nil { - t.Fatalf("Warning failed: %s", err) - } - err = l.Error(3, "error") - if err != nil { - t.Fatalf("Error failed: %s", err) - } -} diff --git a/vendor/golang.org/x/sys/windows/svc/example/beep.go b/vendor/golang.org/x/sys/windows/svc/example/beep.go deleted file mode 100644 index dcf23408d..000000000 --- a/vendor/golang.org/x/sys/windows/svc/example/beep.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package main - -import ( - "syscall" -) - -// BUG(brainman): MessageBeep Windows api is broken on Windows 7, -// so this example does not beep when runs as service on Windows 7. - -var ( - beepFunc = syscall.MustLoadDLL("user32.dll").MustFindProc("MessageBeep") -) - -func beep() { - beepFunc.Call(0xffffffff) -} diff --git a/vendor/golang.org/x/sys/windows/svc/example/install.go b/vendor/golang.org/x/sys/windows/svc/example/install.go deleted file mode 100644 index 39cb00d2a..000000000 --- a/vendor/golang.org/x/sys/windows/svc/example/install.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package main - -import ( - "fmt" - "os" - "path/filepath" - - "golang.org/x/sys/windows/svc/eventlog" - "golang.org/x/sys/windows/svc/mgr" -) - -func exePath() (string, error) { - prog := os.Args[0] - p, err := filepath.Abs(prog) - if err != nil { - return "", err - } - fi, err := os.Stat(p) - if err == nil { - if !fi.Mode().IsDir() { - return p, nil - } - err = fmt.Errorf("%s is directory", p) - } - if filepath.Ext(p) == "" { - p += ".exe" - fi, err := os.Stat(p) - if err == nil { - if !fi.Mode().IsDir() { - return p, nil - } - err = fmt.Errorf("%s is directory", p) - } - } - return "", err -} - -func installService(name, desc string) error { - exepath, err := exePath() - if err != nil { - return err - } - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - s, err := m.OpenService(name) - if err == nil { - s.Close() - return fmt.Errorf("service %s already exists", name) - } - s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: desc}, "is", "auto-started") - if err != nil { - return err - } - defer s.Close() - err = eventlog.InstallAsEventCreate(name, eventlog.Error|eventlog.Warning|eventlog.Info) - if err != nil { - s.Delete() - return fmt.Errorf("SetupEventLogSource() failed: %s", err) - } - return nil -} - -func removeService(name string) error { - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - s, err := m.OpenService(name) - if err != nil { - return fmt.Errorf("service %s is not installed", name) - } - defer s.Close() - err = s.Delete() - if err != nil { - return err - } - err = eventlog.Remove(name) - if err != nil { - return fmt.Errorf("RemoveEventLogSource() failed: %s", err) - } - return nil -} diff --git a/vendor/golang.org/x/sys/windows/svc/example/main.go b/vendor/golang.org/x/sys/windows/svc/example/main.go deleted file mode 100644 index dc96c081a..000000000 --- a/vendor/golang.org/x/sys/windows/svc/example/main.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// Example service program that beeps. -// -// The program demonstrates how to create Windows service and -// install / remove it on a computer. It also shows how to -// stop / start / pause / continue any service, and how to -// write to event log. It also shows how to use debug -// facilities available in debug package. -// -package main - -import ( - "fmt" - "log" - "os" - "strings" - - "golang.org/x/sys/windows/svc" -) - -func usage(errmsg string) { - fmt.Fprintf(os.Stderr, - "%s\n\n"+ - "usage: %s \n"+ - " where is one of\n"+ - " install, remove, debug, start, stop, pause or continue.\n", - errmsg, os.Args[0]) - os.Exit(2) -} - -func main() { - const svcName = "myservice" - - isIntSess, err := svc.IsAnInteractiveSession() - if err != nil { - log.Fatalf("failed to determine if we are running in an interactive session: %v", err) - } - if !isIntSess { - runService(svcName, false) - return - } - - if len(os.Args) < 2 { - usage("no command specified") - } - - cmd := strings.ToLower(os.Args[1]) - switch cmd { - case "debug": - runService(svcName, true) - return - case "install": - err = installService(svcName, "my service") - case "remove": - err = removeService(svcName) - case "start": - err = startService(svcName) - case "stop": - err = controlService(svcName, svc.Stop, svc.Stopped) - case "pause": - err = controlService(svcName, svc.Pause, svc.Paused) - case "continue": - err = controlService(svcName, svc.Continue, svc.Running) - default: - usage(fmt.Sprintf("invalid command %s", cmd)) - } - if err != nil { - log.Fatalf("failed to %s %s: %v", cmd, svcName, err) - } - return -} diff --git a/vendor/golang.org/x/sys/windows/svc/example/manage.go b/vendor/golang.org/x/sys/windows/svc/example/manage.go deleted file mode 100644 index 782dbd96c..000000000 --- a/vendor/golang.org/x/sys/windows/svc/example/manage.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package main - -import ( - "fmt" - "time" - - "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/mgr" -) - -func startService(name string) error { - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - s, err := m.OpenService(name) - if err != nil { - return fmt.Errorf("could not access service: %v", err) - } - defer s.Close() - err = s.Start("is", "manual-started") - if err != nil { - return fmt.Errorf("could not start service: %v", err) - } - return nil -} - -func controlService(name string, c svc.Cmd, to svc.State) error { - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - s, err := m.OpenService(name) - if err != nil { - return fmt.Errorf("could not access service: %v", err) - } - defer s.Close() - status, err := s.Control(c) - if err != nil { - return fmt.Errorf("could not send control=%d: %v", c, err) - } - timeout := time.Now().Add(10 * time.Second) - for status.State != to { - if timeout.Before(time.Now()) { - return fmt.Errorf("timeout waiting for service to go to state=%d", to) - } - time.Sleep(300 * time.Millisecond) - status, err = s.Query() - if err != nil { - return fmt.Errorf("could not retrieve service status: %v", err) - } - } - return nil -} diff --git a/vendor/golang.org/x/sys/windows/svc/example/service.go b/vendor/golang.org/x/sys/windows/svc/example/service.go deleted file mode 100644 index 237e80984..000000000 --- a/vendor/golang.org/x/sys/windows/svc/example/service.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package main - -import ( - "fmt" - "time" - - "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/debug" - "golang.org/x/sys/windows/svc/eventlog" -) - -var elog debug.Log - -type myservice struct{} - -func (m *myservice) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) { - const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue - changes <- svc.Status{State: svc.StartPending} - fasttick := time.Tick(500 * time.Millisecond) - slowtick := time.Tick(2 * time.Second) - tick := fasttick - changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} -loop: - for { - select { - case <-tick: - beep() - elog.Info(1, "beep") - case c := <-r: - switch c.Cmd { - case svc.Interrogate: - changes <- c.CurrentStatus - // Testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4 - time.Sleep(100 * time.Millisecond) - changes <- c.CurrentStatus - case svc.Stop, svc.Shutdown: - break loop - case svc.Pause: - changes <- svc.Status{State: svc.Paused, Accepts: cmdsAccepted} - tick = slowtick - case svc.Continue: - changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} - tick = fasttick - default: - elog.Error(1, fmt.Sprintf("unexpected control request #%d", c)) - } - } - } - changes <- svc.Status{State: svc.StopPending} - return -} - -func runService(name string, isDebug bool) { - var err error - if isDebug { - elog = debug.New(name) - } else { - elog, err = eventlog.Open(name) - if err != nil { - return - } - } - defer elog.Close() - - elog.Info(1, fmt.Sprintf("starting %s service", name)) - run := svc.Run - if isDebug { - run = debug.Run - } - err = run(name, &myservice{}) - if err != nil { - elog.Error(1, fmt.Sprintf("%s service failed: %v", name, err)) - return - } - elog.Info(1, fmt.Sprintf("%s service stopped", name)) -} diff --git a/vendor/golang.org/x/sys/windows/svc/go12.c b/vendor/golang.org/x/sys/windows/svc/go12.c deleted file mode 100644 index 6f1be1fa3..000000000 --- a/vendor/golang.org/x/sys/windows/svc/go12.c +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows -// +build !go1.3 - -// copied from pkg/runtime -typedef unsigned int uint32; -typedef unsigned long long int uint64; -#ifdef _64BIT -typedef uint64 uintptr; -#else -typedef uint32 uintptr; -#endif - -// from sys_386.s or sys_amd64.s -void ·servicemain(void); - -void -·getServiceMain(uintptr *r) -{ - *r = (uintptr)·servicemain; -} diff --git a/vendor/golang.org/x/sys/windows/svc/go12.go b/vendor/golang.org/x/sys/windows/svc/go12.go deleted file mode 100644 index 6f0a924ea..000000000 --- a/vendor/golang.org/x/sys/windows/svc/go12.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows -// +build !go1.3 - -package svc - -// from go12.c -func getServiceMain(r *uintptr) diff --git a/vendor/golang.org/x/sys/windows/svc/go13.go b/vendor/golang.org/x/sys/windows/svc/go13.go deleted file mode 100644 index 432a9e796..000000000 --- a/vendor/golang.org/x/sys/windows/svc/go13.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows -// +build go1.3 - -package svc - -import "unsafe" - -const ptrSize = 4 << (^uintptr(0) >> 63) // unsafe.Sizeof(uintptr(0)) but an ideal const - -// Should be a built-in for unsafe.Pointer? -func add(p unsafe.Pointer, x uintptr) unsafe.Pointer { - return unsafe.Pointer(uintptr(p) + x) -} - -// funcPC returns the entry PC of the function f. -// It assumes that f is a func value. Otherwise the behavior is undefined. -func funcPC(f interface{}) uintptr { - return **(**uintptr)(add(unsafe.Pointer(&f), ptrSize)) -} - -// from sys_386.s and sys_amd64.s -func servicectlhandler(ctl uint32) uintptr -func servicemain(argc uint32, argv **uint16) - -func getServiceMain(r *uintptr) { - *r = funcPC(servicemain) -} diff --git a/vendor/golang.org/x/sys/windows/svc/mgr/config.go b/vendor/golang.org/x/sys/windows/svc/mgr/config.go deleted file mode 100644 index 0a6edba4f..000000000 --- a/vendor/golang.org/x/sys/windows/svc/mgr/config.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package mgr - -import ( - "syscall" - "unicode/utf16" - "unsafe" - - "golang.org/x/sys/windows" -) - -const ( - // Service start types. - StartManual = windows.SERVICE_DEMAND_START // the service must be started manually - StartAutomatic = windows.SERVICE_AUTO_START // the service will start by itself whenever the computer reboots - StartDisabled = windows.SERVICE_DISABLED // the service cannot be started - - // The severity of the error, and action taken, - // if this service fails to start. - ErrorCritical = windows.SERVICE_ERROR_CRITICAL - ErrorIgnore = windows.SERVICE_ERROR_IGNORE - ErrorNormal = windows.SERVICE_ERROR_NORMAL - ErrorSevere = windows.SERVICE_ERROR_SEVERE -) - -// TODO(brainman): Password is not returned by windows.QueryServiceConfig, not sure how to get it. - -type Config struct { - ServiceType uint32 - StartType uint32 - ErrorControl uint32 - BinaryPathName string // fully qualified path to the service binary file, can also include arguments for an auto-start service - LoadOrderGroup string - TagId uint32 - Dependencies []string - ServiceStartName string // name of the account under which the service should run - DisplayName string - Password string - Description string -} - -func toString(p *uint16) string { - if p == nil { - return "" - } - return syscall.UTF16ToString((*[4096]uint16)(unsafe.Pointer(p))[:]) -} - -func toStringSlice(ps *uint16) []string { - if ps == nil { - return nil - } - r := make([]string, 0) - for from, i, p := 0, 0, (*[1 << 24]uint16)(unsafe.Pointer(ps)); true; i++ { - if p[i] == 0 { - // empty string marks the end - if i <= from { - break - } - r = append(r, string(utf16.Decode(p[from:i]))) - from = i + 1 - } - } - return r -} - -// Config retrieves service s configuration paramteres. -func (s *Service) Config() (Config, error) { - var p *windows.QUERY_SERVICE_CONFIG - n := uint32(1024) - for { - b := make([]byte, n) - p = (*windows.QUERY_SERVICE_CONFIG)(unsafe.Pointer(&b[0])) - err := windows.QueryServiceConfig(s.Handle, p, n, &n) - if err == nil { - break - } - if err.(syscall.Errno) != syscall.ERROR_INSUFFICIENT_BUFFER { - return Config{}, err - } - if n <= uint32(len(b)) { - return Config{}, err - } - } - - var p2 *windows.SERVICE_DESCRIPTION - n = uint32(1024) - for { - b := make([]byte, n) - p2 = (*windows.SERVICE_DESCRIPTION)(unsafe.Pointer(&b[0])) - err := windows.QueryServiceConfig2(s.Handle, - windows.SERVICE_CONFIG_DESCRIPTION, &b[0], n, &n) - if err == nil { - break - } - if err.(syscall.Errno) != syscall.ERROR_INSUFFICIENT_BUFFER { - return Config{}, err - } - if n <= uint32(len(b)) { - return Config{}, err - } - } - - return Config{ - ServiceType: p.ServiceType, - StartType: p.StartType, - ErrorControl: p.ErrorControl, - BinaryPathName: toString(p.BinaryPathName), - LoadOrderGroup: toString(p.LoadOrderGroup), - TagId: p.TagId, - Dependencies: toStringSlice(p.Dependencies), - ServiceStartName: toString(p.ServiceStartName), - DisplayName: toString(p.DisplayName), - Description: toString(p2.Description), - }, nil -} - -func updateDescription(handle windows.Handle, desc string) error { - d := windows.SERVICE_DESCRIPTION{toPtr(desc)} - return windows.ChangeServiceConfig2(handle, - windows.SERVICE_CONFIG_DESCRIPTION, (*byte)(unsafe.Pointer(&d))) -} - -// UpdateConfig updates service s configuration parameters. -func (s *Service) UpdateConfig(c Config) error { - err := windows.ChangeServiceConfig(s.Handle, c.ServiceType, c.StartType, - c.ErrorControl, toPtr(c.BinaryPathName), toPtr(c.LoadOrderGroup), - nil, toStringBlock(c.Dependencies), toPtr(c.ServiceStartName), - toPtr(c.Password), toPtr(c.DisplayName)) - if err != nil { - return err - } - return updateDescription(s.Handle, c.Description) -} diff --git a/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go b/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go deleted file mode 100644 index 76965b560..000000000 --- a/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// Package mgr can be used to manage Windows service programs. -// It can be used to install and remove them. It can also start, -// stop and pause them. The package can query / change current -// service state and config parameters. -// -package mgr - -import ( - "syscall" - "unicode/utf16" - "unsafe" - - "golang.org/x/sys/windows" -) - -// Mgr is used to manage Windows service. -type Mgr struct { - Handle windows.Handle -} - -// Connect establishes a connection to the service control manager. -func Connect() (*Mgr, error) { - return ConnectRemote("") -} - -// ConnectRemote establishes a connection to the -// service control manager on computer named host. -func ConnectRemote(host string) (*Mgr, error) { - var s *uint16 - if host != "" { - s = syscall.StringToUTF16Ptr(host) - } - h, err := windows.OpenSCManager(s, nil, windows.SC_MANAGER_ALL_ACCESS) - if err != nil { - return nil, err - } - return &Mgr{Handle: h}, nil -} - -// Disconnect closes connection to the service control manager m. -func (m *Mgr) Disconnect() error { - return windows.CloseServiceHandle(m.Handle) -} - -func toPtr(s string) *uint16 { - if len(s) == 0 { - return nil - } - return syscall.StringToUTF16Ptr(s) -} - -// toStringBlock terminates strings in ss with 0, and then -// concatenates them together. It also adds extra 0 at the end. -func toStringBlock(ss []string) *uint16 { - if len(ss) == 0 { - return nil - } - t := "" - for _, s := range ss { - if s != "" { - t += s + "\x00" - } - } - if t == "" { - return nil - } - t += "\x00" - return &utf16.Encode([]rune(t))[0] -} - -// CreateService installs new service name on the system. -// The service will be executed by running exepath binary. -// Use config c to specify service parameters. -// Any args will be passed as command-line arguments when -// the service is started; these arguments are distinct from -// the arguments passed to Service.Start or via the "Start -// parameters" field in the service's Properties dialog box. -func (m *Mgr) CreateService(name, exepath string, c Config, args ...string) (*Service, error) { - if c.StartType == 0 { - c.StartType = StartManual - } - if c.ErrorControl == 0 { - c.ErrorControl = ErrorNormal - } - if c.ServiceType == 0 { - c.ServiceType = windows.SERVICE_WIN32_OWN_PROCESS - } - s := syscall.EscapeArg(exepath) - for _, v := range args { - s += " " + syscall.EscapeArg(v) - } - h, err := windows.CreateService(m.Handle, toPtr(name), toPtr(c.DisplayName), - windows.SERVICE_ALL_ACCESS, c.ServiceType, - c.StartType, c.ErrorControl, toPtr(s), toPtr(c.LoadOrderGroup), - nil, toStringBlock(c.Dependencies), toPtr(c.ServiceStartName), toPtr(c.Password)) - if err != nil { - return nil, err - } - if c.Description != "" { - err = updateDescription(h, c.Description) - if err != nil { - return nil, err - } - } - return &Service{Name: name, Handle: h}, nil -} - -// OpenService retrieves access to service name, so it can -// be interrogated and controlled. -func (m *Mgr) OpenService(name string) (*Service, error) { - h, err := windows.OpenService(m.Handle, syscall.StringToUTF16Ptr(name), windows.SERVICE_ALL_ACCESS) - if err != nil { - return nil, err - } - return &Service{Name: name, Handle: h}, nil -} - -// ListServices enumerates services in the specified -// service control manager database m. -// If the caller does not have the SERVICE_QUERY_STATUS -// access right to a service, the service is silently -// omitted from the list of services returned. -func (m *Mgr) ListServices() ([]string, error) { - var err error - var bytesNeeded, servicesReturned uint32 - var buf []byte - for { - var p *byte - if len(buf) > 0 { - p = &buf[0] - } - err = windows.EnumServicesStatusEx(m.Handle, windows.SC_ENUM_PROCESS_INFO, - windows.SERVICE_WIN32, windows.SERVICE_STATE_ALL, - p, uint32(len(buf)), &bytesNeeded, &servicesReturned, nil, nil) - if err == nil { - break - } - if err != syscall.ERROR_MORE_DATA { - return nil, err - } - if bytesNeeded <= uint32(len(buf)) { - return nil, err - } - buf = make([]byte, bytesNeeded) - } - if servicesReturned == 0 { - return nil, nil - } - services := (*[1 << 20]windows.ENUM_SERVICE_STATUS_PROCESS)(unsafe.Pointer(&buf[0]))[:servicesReturned] - var names []string - for _, s := range services { - name := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(s.ServiceName))[:]) - names = append(names, name) - } - return names, nil -} diff --git a/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go b/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go deleted file mode 100644 index e67407cf1..000000000 --- a/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package mgr_test - -import ( - "os" - "path/filepath" - "sort" - "strings" - "syscall" - "testing" - "time" - - "golang.org/x/sys/windows/svc/mgr" -) - -func TestOpenLanManServer(t *testing.T) { - m, err := mgr.Connect() - if err != nil { - if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERROR_ACCESS_DENIED { - t.Skip("Skipping test: we don't have rights to manage services.") - } - t.Fatalf("SCM connection failed: %s", err) - } - defer m.Disconnect() - - s, err := m.OpenService("LanmanServer") - if err != nil { - t.Fatalf("OpenService(lanmanserver) failed: %s", err) - } - defer s.Close() - - _, err = s.Config() - if err != nil { - t.Fatalf("Config failed: %s", err) - } -} - -func install(t *testing.T, m *mgr.Mgr, name, exepath string, c mgr.Config) { - // Sometimes it takes a while for the service to get - // removed after previous test run. - for i := 0; ; i++ { - s, err := m.OpenService(name) - if err != nil { - break - } - s.Close() - - if i > 10 { - t.Fatalf("service %s already exists", name) - } - time.Sleep(300 * time.Millisecond) - } - - s, err := m.CreateService(name, exepath, c) - if err != nil { - t.Fatalf("CreateService(%s) failed: %v", name, err) - } - defer s.Close() -} - -func depString(d []string) string { - if len(d) == 0 { - return "" - } - for i := range d { - d[i] = strings.ToLower(d[i]) - } - ss := sort.StringSlice(d) - ss.Sort() - return strings.Join([]string(ss), " ") -} - -func testConfig(t *testing.T, s *mgr.Service, should mgr.Config) mgr.Config { - is, err := s.Config() - if err != nil { - t.Fatalf("Config failed: %s", err) - } - if should.DisplayName != is.DisplayName { - t.Fatalf("config mismatch: DisplayName is %q, but should have %q", is.DisplayName, should.DisplayName) - } - if should.StartType != is.StartType { - t.Fatalf("config mismatch: StartType is %v, but should have %v", is.StartType, should.StartType) - } - if should.Description != is.Description { - t.Fatalf("config mismatch: Description is %q, but should have %q", is.Description, should.Description) - } - if depString(should.Dependencies) != depString(is.Dependencies) { - t.Fatalf("config mismatch: Dependencies is %v, but should have %v", is.Dependencies, should.Dependencies) - } - return is -} - -func remove(t *testing.T, s *mgr.Service) { - err := s.Delete() - if err != nil { - t.Fatalf("Delete failed: %s", err) - } -} - -func TestMyService(t *testing.T) { - if testing.Short() { - t.Skip("skipping test in short mode - it modifies system services") - } - - const name = "myservice" - - m, err := mgr.Connect() - if err != nil { - if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERROR_ACCESS_DENIED { - t.Skip("Skipping test: we don't have rights to manage services.") - } - t.Fatalf("SCM connection failed: %s", err) - } - defer m.Disconnect() - - c := mgr.Config{ - StartType: mgr.StartDisabled, - DisplayName: "my service", - Description: "my service is just a test", - Dependencies: []string{"LanmanServer", "W32Time"}, - } - - exename := os.Args[0] - exepath, err := filepath.Abs(exename) - if err != nil { - t.Fatalf("filepath.Abs(%s) failed: %s", exename, err) - } - - install(t, m, name, exepath, c) - - s, err := m.OpenService(name) - if err != nil { - t.Fatalf("service %s is not installed", name) - } - defer s.Close() - - c.BinaryPathName = exepath - c = testConfig(t, s, c) - - c.StartType = mgr.StartManual - err = s.UpdateConfig(c) - if err != nil { - t.Fatalf("UpdateConfig failed: %v", err) - } - - testConfig(t, s, c) - - svcnames, err := m.ListServices() - if err != nil { - t.Fatalf("ListServices failed: %v", err) - } - var myserviceIsInstalled bool - for _, sn := range svcnames { - if sn == name { - myserviceIsInstalled = true - break - } - } - if !myserviceIsInstalled { - t.Errorf("ListServices failed to find %q service", name) - } - - remove(t, s) -} diff --git a/vendor/golang.org/x/sys/windows/svc/mgr/service.go b/vendor/golang.org/x/sys/windows/svc/mgr/service.go deleted file mode 100644 index fdc46af5f..000000000 --- a/vendor/golang.org/x/sys/windows/svc/mgr/service.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package mgr - -import ( - "syscall" - - "golang.org/x/sys/windows" - "golang.org/x/sys/windows/svc" -) - -// TODO(brainman): Use EnumDependentServices to enumerate dependent services. - -// Service is used to access Windows service. -type Service struct { - Name string - Handle windows.Handle -} - -// Delete marks service s for deletion from the service control manager database. -func (s *Service) Delete() error { - return windows.DeleteService(s.Handle) -} - -// Close relinquish access to the service s. -func (s *Service) Close() error { - return windows.CloseServiceHandle(s.Handle) -} - -// Start starts service s. -// args will be passed to svc.Handler.Execute. -func (s *Service) Start(args ...string) error { - var p **uint16 - if len(args) > 0 { - vs := make([]*uint16, len(args)) - for i := range vs { - vs[i] = syscall.StringToUTF16Ptr(args[i]) - } - p = &vs[0] - } - return windows.StartService(s.Handle, uint32(len(args)), p) -} - -// Control sends state change request c to the servce s. -func (s *Service) Control(c svc.Cmd) (svc.Status, error) { - var t windows.SERVICE_STATUS - err := windows.ControlService(s.Handle, uint32(c), &t) - if err != nil { - return svc.Status{}, err - } - return svc.Status{ - State: svc.State(t.CurrentState), - Accepts: svc.Accepted(t.ControlsAccepted), - }, nil -} - -// Query returns current status of service s. -func (s *Service) Query() (svc.Status, error) { - var t windows.SERVICE_STATUS - err := windows.QueryServiceStatus(s.Handle, &t) - if err != nil { - return svc.Status{}, err - } - return svc.Status{ - State: svc.State(t.CurrentState), - Accepts: svc.Accepted(t.ControlsAccepted), - }, nil -} diff --git a/vendor/golang.org/x/sys/windows/svc/security.go b/vendor/golang.org/x/sys/windows/svc/security.go deleted file mode 100644 index 6fbc9236e..000000000 --- a/vendor/golang.org/x/sys/windows/svc/security.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package svc - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -func allocSid(subAuth0 uint32) (*windows.SID, error) { - var sid *windows.SID - err := windows.AllocateAndInitializeSid(&windows.SECURITY_NT_AUTHORITY, - 1, subAuth0, 0, 0, 0, 0, 0, 0, 0, &sid) - if err != nil { - return nil, err - } - return sid, nil -} - -// IsAnInteractiveSession determines if calling process is running interactively. -// It queries the process token for membership in the Interactive group. -// http://stackoverflow.com/questions/2668851/how-do-i-detect-that-my-application-is-running-as-service-or-in-an-interactive-s -func IsAnInteractiveSession() (bool, error) { - interSid, err := allocSid(windows.SECURITY_INTERACTIVE_RID) - if err != nil { - return false, err - } - defer windows.FreeSid(interSid) - - serviceSid, err := allocSid(windows.SECURITY_SERVICE_RID) - if err != nil { - return false, err - } - defer windows.FreeSid(serviceSid) - - t, err := windows.OpenCurrentProcessToken() - if err != nil { - return false, err - } - defer t.Close() - - gs, err := t.GetTokenGroups() - if err != nil { - return false, err - } - p := unsafe.Pointer(&gs.Groups[0]) - groups := (*[2 << 20]windows.SIDAndAttributes)(p)[:gs.GroupCount] - for _, g := range groups { - if windows.EqualSid(g.Sid, interSid) { - return true, nil - } - if windows.EqualSid(g.Sid, serviceSid) { - return false, nil - } - } - return false, nil -} diff --git a/vendor/golang.org/x/sys/windows/svc/service.go b/vendor/golang.org/x/sys/windows/svc/service.go deleted file mode 100644 index 903cba3f1..000000000 --- a/vendor/golang.org/x/sys/windows/svc/service.go +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// Package svc provides everything required to build Windows service. -// -package svc - -import ( - "errors" - "runtime" - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -// State describes service execution state (Stopped, Running and so on). -type State uint32 - -const ( - Stopped = State(windows.SERVICE_STOPPED) - StartPending = State(windows.SERVICE_START_PENDING) - StopPending = State(windows.SERVICE_STOP_PENDING) - Running = State(windows.SERVICE_RUNNING) - ContinuePending = State(windows.SERVICE_CONTINUE_PENDING) - PausePending = State(windows.SERVICE_PAUSE_PENDING) - Paused = State(windows.SERVICE_PAUSED) -) - -// Cmd represents service state change request. It is sent to a service -// by the service manager, and should be actioned upon by the service. -type Cmd uint32 - -const ( - Stop = Cmd(windows.SERVICE_CONTROL_STOP) - Pause = Cmd(windows.SERVICE_CONTROL_PAUSE) - Continue = Cmd(windows.SERVICE_CONTROL_CONTINUE) - Interrogate = Cmd(windows.SERVICE_CONTROL_INTERROGATE) - Shutdown = Cmd(windows.SERVICE_CONTROL_SHUTDOWN) - ParamChange = Cmd(windows.SERVICE_CONTROL_PARAMCHANGE) - NetBindAdd = Cmd(windows.SERVICE_CONTROL_NETBINDADD) - NetBindRemove = Cmd(windows.SERVICE_CONTROL_NETBINDREMOVE) - NetBindEnable = Cmd(windows.SERVICE_CONTROL_NETBINDENABLE) - NetBindDisable = Cmd(windows.SERVICE_CONTROL_NETBINDDISABLE) - DeviceEvent = Cmd(windows.SERVICE_CONTROL_DEVICEEVENT) - HardwareProfileChange = Cmd(windows.SERVICE_CONTROL_HARDWAREPROFILECHANGE) - PowerEvent = Cmd(windows.SERVICE_CONTROL_POWEREVENT) - SessionChange = Cmd(windows.SERVICE_CONTROL_SESSIONCHANGE) -) - -// Accepted is used to describe commands accepted by the service. -// Note that Interrogate is always accepted. -type Accepted uint32 - -const ( - AcceptStop = Accepted(windows.SERVICE_ACCEPT_STOP) - AcceptShutdown = Accepted(windows.SERVICE_ACCEPT_SHUTDOWN) - AcceptPauseAndContinue = Accepted(windows.SERVICE_ACCEPT_PAUSE_CONTINUE) - AcceptParamChange = Accepted(windows.SERVICE_ACCEPT_PARAMCHANGE) - AcceptNetBindChange = Accepted(windows.SERVICE_ACCEPT_NETBINDCHANGE) - AcceptHardwareProfileChange = Accepted(windows.SERVICE_ACCEPT_HARDWAREPROFILECHANGE) - AcceptPowerEvent = Accepted(windows.SERVICE_ACCEPT_POWEREVENT) - AcceptSessionChange = Accepted(windows.SERVICE_ACCEPT_SESSIONCHANGE) -) - -// Status combines State and Accepted commands to fully describe running service. -type Status struct { - State State - Accepts Accepted - CheckPoint uint32 // used to report progress during a lengthy operation - WaitHint uint32 // estimated time required for a pending operation, in milliseconds -} - -// ChangeRequest is sent to the service Handler to request service status change. -type ChangeRequest struct { - Cmd Cmd - EventType uint32 - EventData uintptr - CurrentStatus Status -} - -// Handler is the interface that must be implemented to build Windows service. -type Handler interface { - - // Execute will be called by the package code at the start of - // the service, and the service will exit once Execute completes. - // Inside Execute you must read service change requests from r and - // act accordingly. You must keep service control manager up to date - // about state of your service by writing into s as required. - // args contains service name followed by argument strings passed - // to the service. - // You can provide service exit code in exitCode return parameter, - // with 0 being "no error". You can also indicate if exit code, - // if any, is service specific or not by using svcSpecificEC - // parameter. - Execute(args []string, r <-chan ChangeRequest, s chan<- Status) (svcSpecificEC bool, exitCode uint32) -} - -var ( - // These are used by asm code. - goWaitsH uintptr - cWaitsH uintptr - ssHandle uintptr - sName *uint16 - sArgc uintptr - sArgv **uint16 - ctlHandlerExProc uintptr - cSetEvent uintptr - cWaitForSingleObject uintptr - cRegisterServiceCtrlHandlerExW uintptr -) - -func init() { - k := syscall.MustLoadDLL("kernel32.dll") - cSetEvent = k.MustFindProc("SetEvent").Addr() - cWaitForSingleObject = k.MustFindProc("WaitForSingleObject").Addr() - a := syscall.MustLoadDLL("advapi32.dll") - cRegisterServiceCtrlHandlerExW = a.MustFindProc("RegisterServiceCtrlHandlerExW").Addr() -} - -// The HandlerEx prototype also has a context pointer but since we don't use -// it at start-up time we don't have to pass it over either. -type ctlEvent struct { - cmd Cmd - eventType uint32 - eventData uintptr - errno uint32 -} - -// service provides access to windows service api. -type service struct { - name string - h windows.Handle - cWaits *event - goWaits *event - c chan ctlEvent - handler Handler -} - -func newService(name string, handler Handler) (*service, error) { - var s service - var err error - s.name = name - s.c = make(chan ctlEvent) - s.handler = handler - s.cWaits, err = newEvent() - if err != nil { - return nil, err - } - s.goWaits, err = newEvent() - if err != nil { - s.cWaits.Close() - return nil, err - } - return &s, nil -} - -func (s *service) close() error { - s.cWaits.Close() - s.goWaits.Close() - return nil -} - -type exitCode struct { - isSvcSpecific bool - errno uint32 -} - -func (s *service) updateStatus(status *Status, ec *exitCode) error { - if s.h == 0 { - return errors.New("updateStatus with no service status handle") - } - var t windows.SERVICE_STATUS - t.ServiceType = windows.SERVICE_WIN32_OWN_PROCESS - t.CurrentState = uint32(status.State) - if status.Accepts&AcceptStop != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_STOP - } - if status.Accepts&AcceptShutdown != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_SHUTDOWN - } - if status.Accepts&AcceptPauseAndContinue != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_PAUSE_CONTINUE - } - if status.Accepts&AcceptParamChange != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_PARAMCHANGE - } - if status.Accepts&AcceptNetBindChange != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_NETBINDCHANGE - } - if status.Accepts&AcceptHardwareProfileChange != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_HARDWAREPROFILECHANGE - } - if status.Accepts&AcceptPowerEvent != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_POWEREVENT - } - if status.Accepts&AcceptSessionChange != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_SESSIONCHANGE - } - if ec.errno == 0 { - t.Win32ExitCode = windows.NO_ERROR - t.ServiceSpecificExitCode = windows.NO_ERROR - } else if ec.isSvcSpecific { - t.Win32ExitCode = uint32(windows.ERROR_SERVICE_SPECIFIC_ERROR) - t.ServiceSpecificExitCode = ec.errno - } else { - t.Win32ExitCode = ec.errno - t.ServiceSpecificExitCode = windows.NO_ERROR - } - t.CheckPoint = status.CheckPoint - t.WaitHint = status.WaitHint - return windows.SetServiceStatus(s.h, &t) -} - -const ( - sysErrSetServiceStatusFailed = uint32(syscall.APPLICATION_ERROR) + iota - sysErrNewThreadInCallback -) - -func (s *service) run() { - s.goWaits.Wait() - s.h = windows.Handle(ssHandle) - argv := (*[100]*int16)(unsafe.Pointer(sArgv))[:sArgc] - args := make([]string, len(argv)) - for i, a := range argv { - args[i] = syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(a))[:]) - } - - cmdsToHandler := make(chan ChangeRequest) - changesFromHandler := make(chan Status) - exitFromHandler := make(chan exitCode) - - go func() { - ss, errno := s.handler.Execute(args, cmdsToHandler, changesFromHandler) - exitFromHandler <- exitCode{ss, errno} - }() - - status := Status{State: Stopped} - ec := exitCode{isSvcSpecific: true, errno: 0} - var outch chan ChangeRequest - inch := s.c - var cmd Cmd - var evtype uint32 - var evdata uintptr -loop: - for { - select { - case r := <-inch: - if r.errno != 0 { - ec.errno = r.errno - break loop - } - inch = nil - outch = cmdsToHandler - cmd = r.cmd - evtype = r.eventType - evdata = r.eventData - case outch <- ChangeRequest{cmd, evtype, evdata, status}: - inch = s.c - outch = nil - case c := <-changesFromHandler: - err := s.updateStatus(&c, &ec) - if err != nil { - // best suitable error number - ec.errno = sysErrSetServiceStatusFailed - if err2, ok := err.(syscall.Errno); ok { - ec.errno = uint32(err2) - } - break loop - } - status = c - case ec = <-exitFromHandler: - break loop - } - } - - s.updateStatus(&Status{State: Stopped}, &ec) - s.cWaits.Set() -} - -func newCallback(fn interface{}) (cb uintptr, err error) { - defer func() { - r := recover() - if r == nil { - return - } - cb = 0 - switch v := r.(type) { - case string: - err = errors.New(v) - case error: - err = v - default: - err = errors.New("unexpected panic in syscall.NewCallback") - } - }() - return syscall.NewCallback(fn), nil -} - -// BUG(brainman): There is no mechanism to run multiple services -// inside one single executable. Perhaps, it can be overcome by -// using RegisterServiceCtrlHandlerEx Windows api. - -// Run executes service name by calling appropriate handler function. -func Run(name string, handler Handler) error { - runtime.LockOSThread() - - tid := windows.GetCurrentThreadId() - - s, err := newService(name, handler) - if err != nil { - return err - } - - ctlHandler := func(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { - e := ctlEvent{cmd: Cmd(ctl), eventType: evtype, eventData: evdata} - // We assume that this callback function is running on - // the same thread as Run. Nowhere in MS documentation - // I could find statement to guarantee that. So putting - // check here to verify, otherwise things will go bad - // quickly, if ignored. - i := windows.GetCurrentThreadId() - if i != tid { - e.errno = sysErrNewThreadInCallback - } - s.c <- e - // Always return NO_ERROR (0) for now. - return 0 - } - - var svcmain uintptr - getServiceMain(&svcmain) - t := []windows.SERVICE_TABLE_ENTRY{ - {syscall.StringToUTF16Ptr(s.name), svcmain}, - {nil, 0}, - } - - goWaitsH = uintptr(s.goWaits.h) - cWaitsH = uintptr(s.cWaits.h) - sName = t[0].ServiceName - ctlHandlerExProc, err = newCallback(ctlHandler) - if err != nil { - return err - } - - go s.run() - - err = windows.StartServiceCtrlDispatcher(&t[0]) - if err != nil { - return err - } - return nil -} - -// StatusHandle returns service status handle. It is safe to call this function -// from inside the Handler.Execute because then it is guaranteed to be set. -// This code will have to change once multiple services are possible per process. -func StatusHandle() windows.Handle { - return windows.Handle(ssHandle) -} diff --git a/vendor/golang.org/x/sys/windows/svc/svc_test.go b/vendor/golang.org/x/sys/windows/svc/svc_test.go deleted file mode 100644 index 764da54a5..000000000 --- a/vendor/golang.org/x/sys/windows/svc/svc_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package svc_test - -import ( - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "testing" - "time" - - "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/mgr" -) - -func getState(t *testing.T, s *mgr.Service) svc.State { - status, err := s.Query() - if err != nil { - t.Fatalf("Query(%s) failed: %s", s.Name, err) - } - return status.State -} - -func testState(t *testing.T, s *mgr.Service, want svc.State) { - have := getState(t, s) - if have != want { - t.Fatalf("%s state is=%d want=%d", s.Name, have, want) - } -} - -func waitState(t *testing.T, s *mgr.Service, want svc.State) { - for i := 0; ; i++ { - have := getState(t, s) - if have == want { - return - } - if i > 10 { - t.Fatalf("%s state is=%d, waiting timeout", s.Name, have) - } - time.Sleep(300 * time.Millisecond) - } -} - -func TestExample(t *testing.T) { - if testing.Short() { - t.Skip("skipping test in short mode - it modifies system services") - } - - const name = "myservice" - - m, err := mgr.Connect() - if err != nil { - t.Fatalf("SCM connection failed: %s", err) - } - defer m.Disconnect() - - dir, err := ioutil.TempDir("", "svc") - if err != nil { - t.Fatalf("failed to create temp directory: %v", err) - } - defer os.RemoveAll(dir) - - exepath := filepath.Join(dir, "a.exe") - o, err := exec.Command("go", "build", "-o", exepath, "golang.org/x/sys/windows/svc/example").CombinedOutput() - if err != nil { - t.Fatalf("failed to build service program: %v\n%v", err, string(o)) - } - - s, err := m.OpenService(name) - if err == nil { - err = s.Delete() - if err != nil { - s.Close() - t.Fatalf("Delete failed: %s", err) - } - s.Close() - } - s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: "my service"}, "is", "auto-started") - if err != nil { - t.Fatalf("CreateService(%s) failed: %v", name, err) - } - defer s.Close() - - testState(t, s, svc.Stopped) - err = s.Start("is", "manual-started") - if err != nil { - t.Fatalf("Start(%s) failed: %s", s.Name, err) - } - waitState(t, s, svc.Running) - time.Sleep(1 * time.Second) - - // testing deadlock from issues 4. - _, err = s.Control(svc.Interrogate) - if err != nil { - t.Fatalf("Control(%s) failed: %s", s.Name, err) - } - _, err = s.Control(svc.Interrogate) - if err != nil { - t.Fatalf("Control(%s) failed: %s", s.Name, err) - } - time.Sleep(1 * time.Second) - - _, err = s.Control(svc.Stop) - if err != nil { - t.Fatalf("Control(%s) failed: %s", s.Name, err) - } - waitState(t, s, svc.Stopped) - - err = s.Delete() - if err != nil { - t.Fatalf("Delete failed: %s", err) - } -} diff --git a/vendor/golang.org/x/sys/windows/svc/sys_386.s b/vendor/golang.org/x/sys/windows/svc/sys_386.s deleted file mode 100644 index 2c82a9d91..000000000 --- a/vendor/golang.org/x/sys/windows/svc/sys_386.s +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// func servicemain(argc uint32, argv **uint16) -TEXT ·servicemain(SB),7,$0 - MOVL argc+0(FP), AX - MOVL AX, ·sArgc(SB) - MOVL argv+4(FP), AX - MOVL AX, ·sArgv(SB) - - PUSHL BP - PUSHL BX - PUSHL SI - PUSHL DI - - SUBL $12, SP - - MOVL ·sName(SB), AX - MOVL AX, (SP) - MOVL $·servicectlhandler(SB), AX - MOVL AX, 4(SP) - MOVL $0, 8(SP) - MOVL ·cRegisterServiceCtrlHandlerExW(SB), AX - MOVL SP, BP - CALL AX - MOVL BP, SP - CMPL AX, $0 - JE exit - MOVL AX, ·ssHandle(SB) - - MOVL ·goWaitsH(SB), AX - MOVL AX, (SP) - MOVL ·cSetEvent(SB), AX - MOVL SP, BP - CALL AX - MOVL BP, SP - - MOVL ·cWaitsH(SB), AX - MOVL AX, (SP) - MOVL $-1, AX - MOVL AX, 4(SP) - MOVL ·cWaitForSingleObject(SB), AX - MOVL SP, BP - CALL AX - MOVL BP, SP - -exit: - ADDL $12, SP - - POPL DI - POPL SI - POPL BX - POPL BP - - MOVL 0(SP), CX - ADDL $12, SP - JMP CX - -// I do not know why, but this seems to be the only way to call -// ctlHandlerProc on Windows 7. - -// func servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { -TEXT ·servicectlhandler(SB),7,$0 - MOVL ·ctlHandlerExProc(SB), CX - JMP CX diff --git a/vendor/golang.org/x/sys/windows/svc/sys_amd64.s b/vendor/golang.org/x/sys/windows/svc/sys_amd64.s deleted file mode 100644 index 06b425900..000000000 --- a/vendor/golang.org/x/sys/windows/svc/sys_amd64.s +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -// func servicemain(argc uint32, argv **uint16) -TEXT ·servicemain(SB),7,$0 - MOVL CX, ·sArgc(SB) - MOVL DX, ·sArgv(SB) - - SUBQ $32, SP // stack for the first 4 syscall params - - MOVQ ·sName(SB), CX - MOVQ $·servicectlhandler(SB), DX - // BUG(pastarmovj): Figure out a way to pass in context in R8. - MOVQ ·cRegisterServiceCtrlHandlerExW(SB), AX - CALL AX - CMPQ AX, $0 - JE exit - MOVQ AX, ·ssHandle(SB) - - MOVQ ·goWaitsH(SB), CX - MOVQ ·cSetEvent(SB), AX - CALL AX - - MOVQ ·cWaitsH(SB), CX - MOVQ $4294967295, DX - MOVQ ·cWaitForSingleObject(SB), AX - CALL AX - -exit: - ADDQ $32, SP - RET - -// I do not know why, but this seems to be the only way to call -// ctlHandlerProc on Windows 7. - -// func ·servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { -TEXT ·servicectlhandler(SB),7,$0 - MOVQ ·ctlHandlerExProc(SB), AX - JMP AX diff --git a/vendor/golang.org/x/text/cases/cases.go b/vendor/golang.org/x/text/cases/cases.go deleted file mode 100644 index 736c0c312..000000000 --- a/vendor/golang.org/x/text/cases/cases.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go gen_trieval.go - -// Package cases provides general and language-specific case mappers. -package cases // import "golang.org/x/text/cases" - -import ( - "golang.org/x/text/language" - "golang.org/x/text/transform" -) - -// References: -// - Unicode Reference Manual Chapter 3.13, 4.2, and 5.18. -// - http://www.unicode.org/reports/tr29/ -// - http://www.unicode.org/Public/6.3.0/ucd/CaseFolding.txt -// - http://www.unicode.org/Public/6.3.0/ucd/SpecialCasing.txt -// - http://www.unicode.org/Public/6.3.0/ucd/DerivedCoreProperties.txt -// - http://www.unicode.org/Public/6.3.0/ucd/auxiliary/WordBreakProperty.txt -// - http://www.unicode.org/Public/6.3.0/ucd/auxiliary/WordBreakTest.txt -// - http://userguide.icu-project.org/transforms/casemappings - -// TODO: -// - Case folding -// - Wide and Narrow? -// - Segmenter option for title casing. -// - ASCII fast paths -// - Encode Soft-Dotted property within trie somehow. - -// A Caser transforms given input to a certain case. It implements -// transform.Transformer. -// -// A Caser may be stateful and should therefore not be shared between -// goroutines. -type Caser struct { - t transform.SpanningTransformer -} - -// Bytes returns a new byte slice with the result of converting b to the case -// form implemented by c. -func (c Caser) Bytes(b []byte) []byte { - b, _, _ = transform.Bytes(c.t, b) - return b -} - -// String returns a string with the result of transforming s to the case form -// implemented by c. -func (c Caser) String(s string) string { - s, _, _ = transform.String(c.t, s) - return s -} - -// Reset resets the Caser to be reused for new input after a previous call to -// Transform. -func (c Caser) Reset() { c.t.Reset() } - -// Transform implements the transform.Transformer interface and transforms the -// given input to the case form implemented by c. -func (c Caser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - return c.t.Transform(dst, src, atEOF) -} - -// Span implements the transform.SpanningTransformer interface. -func (c Caser) Span(src []byte, atEOF bool) (n int, err error) { - return c.t.Span(src, atEOF) -} - -// Upper returns a Caser for language-specific uppercasing. -func Upper(t language.Tag, opts ...Option) Caser { - return Caser{makeUpper(t, getOpts(opts...))} -} - -// Lower returns a Caser for language-specific lowercasing. -func Lower(t language.Tag, opts ...Option) Caser { - return Caser{makeLower(t, getOpts(opts...))} -} - -// Title returns a Caser for language-specific title casing. It uses an -// approximation of the default Unicode Word Break algorithm. -func Title(t language.Tag, opts ...Option) Caser { - return Caser{makeTitle(t, getOpts(opts...))} -} - -// Fold returns a Caser that implements Unicode case folding. The returned Caser -// is stateless and safe to use concurrently by multiple goroutines. -// -// Case folding does not normalize the input and may not preserve a normal form. -// Use the collate or search package for more convenient and linguistically -// sound comparisons. Use golang.org/x/text/secure/precis for string comparisons -// where security aspects are a concern. -func Fold(opts ...Option) Caser { - return Caser{makeFold(getOpts(opts...))} -} - -// An Option is used to modify the behavior of a Caser. -type Option func(o options) options - -// TODO: consider these options to take a boolean as well, like FinalSigma. -// The advantage of using this approach is that other providers of a lower-case -// algorithm could set different defaults by prefixing a user-provided slice -// of options with their own. This is handy, for instance, for the precis -// package which would override the default to not handle the Greek final sigma. - -var ( - // NoLower disables the lowercasing of non-leading letters for a title - // caser. - NoLower Option = noLower - - // Compact omits mappings in case folding for characters that would grow the - // input. (Unimplemented.) - Compact Option = compact -) - -// TODO: option to preserve a normal form, if applicable? - -type options struct { - noLower bool - simple bool - - // TODO: segmenter, max ignorable, alternative versions, etc. - - ignoreFinalSigma bool -} - -func getOpts(o ...Option) (res options) { - for _, f := range o { - res = f(res) - } - return -} - -func noLower(o options) options { - o.noLower = true - return o -} - -func compact(o options) options { - o.simple = true - return o -} - -// HandleFinalSigma specifies whether the special handling of Greek final sigma -// should be enabled. Unicode prescribes handling the Greek final sigma for all -// locales, but standards like IDNA and PRECIS override this default. -func HandleFinalSigma(enable bool) Option { - if enable { - return handleFinalSigma - } - return ignoreFinalSigma -} - -func ignoreFinalSigma(o options) options { - o.ignoreFinalSigma = true - return o -} - -func handleFinalSigma(o options) options { - o.ignoreFinalSigma = false - return o -} diff --git a/vendor/golang.org/x/text/cases/context.go b/vendor/golang.org/x/text/cases/context.go deleted file mode 100644 index e9aa9e193..000000000 --- a/vendor/golang.org/x/text/cases/context.go +++ /dev/null @@ -1,376 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cases - -import "golang.org/x/text/transform" - -// A context is used for iterating over source bytes, fetching case info and -// writing to a destination buffer. -// -// Casing operations may need more than one rune of context to decide how a rune -// should be cased. Casing implementations should call checkpoint on context -// whenever it is known to be safe to return the runes processed so far. -// -// It is recommended for implementations to not allow for more than 30 case -// ignorables as lookahead (analogous to the limit in norm) and to use state if -// unbounded lookahead is needed for cased runes. -type context struct { - dst, src []byte - atEOF bool - - pDst int // pDst points past the last written rune in dst. - pSrc int // pSrc points to the start of the currently scanned rune. - - // checkpoints safe to return in Transform, where nDst <= pDst and nSrc <= pSrc. - nDst, nSrc int - err error - - sz int // size of current rune - info info // case information of currently scanned rune - - // State preserved across calls to Transform. - isMidWord bool // false if next cased letter needs to be title-cased. -} - -func (c *context) Reset() { - c.isMidWord = false -} - -// ret returns the return values for the Transform method. It checks whether -// there were insufficient bytes in src to complete and introduces an error -// accordingly, if necessary. -func (c *context) ret() (nDst, nSrc int, err error) { - if c.err != nil || c.nSrc == len(c.src) { - return c.nDst, c.nSrc, c.err - } - // This point is only reached by mappers if there was no short destination - // buffer. This means that the source buffer was exhausted and that c.sz was - // set to 0 by next. - if c.atEOF && c.pSrc == len(c.src) { - return c.pDst, c.pSrc, nil - } - return c.nDst, c.nSrc, transform.ErrShortSrc -} - -// retSpan returns the return values for the Span method. It checks whether -// there were insufficient bytes in src to complete and introduces an error -// accordingly, if necessary. -func (c *context) retSpan() (n int, err error) { - _, nSrc, err := c.ret() - return nSrc, err -} - -// checkpoint sets the return value buffer points for Transform to the current -// positions. -func (c *context) checkpoint() { - if c.err == nil { - c.nDst, c.nSrc = c.pDst, c.pSrc+c.sz - } -} - -// unreadRune causes the last rune read by next to be reread on the next -// invocation of next. Only one unreadRune may be called after a call to next. -func (c *context) unreadRune() { - c.sz = 0 -} - -func (c *context) next() bool { - c.pSrc += c.sz - if c.pSrc == len(c.src) || c.err != nil { - c.info, c.sz = 0, 0 - return false - } - v, sz := trie.lookup(c.src[c.pSrc:]) - c.info, c.sz = info(v), sz - if c.sz == 0 { - if c.atEOF { - // A zero size means we have an incomplete rune. If we are atEOF, - // this means it is an illegal rune, which we will consume one - // byte at a time. - c.sz = 1 - } else { - c.err = transform.ErrShortSrc - return false - } - } - return true -} - -// writeBytes adds bytes to dst. -func (c *context) writeBytes(b []byte) bool { - if len(c.dst)-c.pDst < len(b) { - c.err = transform.ErrShortDst - return false - } - // This loop is faster than using copy. - for _, ch := range b { - c.dst[c.pDst] = ch - c.pDst++ - } - return true -} - -// writeString writes the given string to dst. -func (c *context) writeString(s string) bool { - if len(c.dst)-c.pDst < len(s) { - c.err = transform.ErrShortDst - return false - } - // This loop is faster than using copy. - for i := 0; i < len(s); i++ { - c.dst[c.pDst] = s[i] - c.pDst++ - } - return true -} - -// copy writes the current rune to dst. -func (c *context) copy() bool { - return c.writeBytes(c.src[c.pSrc : c.pSrc+c.sz]) -} - -// copyXOR copies the current rune to dst and modifies it by applying the XOR -// pattern of the case info. It is the responsibility of the caller to ensure -// that this is a rune with a XOR pattern defined. -func (c *context) copyXOR() bool { - if !c.copy() { - return false - } - if c.info&xorIndexBit == 0 { - // Fast path for 6-bit XOR pattern, which covers most cases. - c.dst[c.pDst-1] ^= byte(c.info >> xorShift) - } else { - // Interpret XOR bits as an index. - // TODO: test performance for unrolling this loop. Verify that we have - // at least two bytes and at most three. - idx := c.info >> xorShift - for p := c.pDst - 1; ; p-- { - c.dst[p] ^= xorData[idx] - idx-- - if xorData[idx] == 0 { - break - } - } - } - return true -} - -// hasPrefix returns true if src[pSrc:] starts with the given string. -func (c *context) hasPrefix(s string) bool { - b := c.src[c.pSrc:] - if len(b) < len(s) { - return false - } - for i, c := range b[:len(s)] { - if c != s[i] { - return false - } - } - return true -} - -// caseType returns an info with only the case bits, normalized to either -// cLower, cUpper, cTitle or cUncased. -func (c *context) caseType() info { - cm := c.info & 0x7 - if cm < 4 { - return cm - } - if cm >= cXORCase { - // xor the last bit of the rune with the case type bits. - b := c.src[c.pSrc+c.sz-1] - return info(b&1) ^ cm&0x3 - } - if cm == cIgnorableCased { - return cLower - } - return cUncased -} - -// lower writes the lowercase version of the current rune to dst. -func lower(c *context) bool { - ct := c.caseType() - if c.info&hasMappingMask == 0 || ct == cLower { - return c.copy() - } - if c.info&exceptionBit == 0 { - return c.copyXOR() - } - e := exceptions[c.info>>exceptionShift:] - offset := 2 + e[0]&lengthMask // size of header + fold string - if nLower := (e[1] >> lengthBits) & lengthMask; nLower != noChange { - return c.writeString(e[offset : offset+nLower]) - } - return c.copy() -} - -func isLower(c *context) bool { - ct := c.caseType() - if c.info&hasMappingMask == 0 || ct == cLower { - return true - } - if c.info&exceptionBit == 0 { - c.err = transform.ErrEndOfSpan - return false - } - e := exceptions[c.info>>exceptionShift:] - if nLower := (e[1] >> lengthBits) & lengthMask; nLower != noChange { - c.err = transform.ErrEndOfSpan - return false - } - return true -} - -// upper writes the uppercase version of the current rune to dst. -func upper(c *context) bool { - ct := c.caseType() - if c.info&hasMappingMask == 0 || ct == cUpper { - return c.copy() - } - if c.info&exceptionBit == 0 { - return c.copyXOR() - } - e := exceptions[c.info>>exceptionShift:] - offset := 2 + e[0]&lengthMask // size of header + fold string - // Get length of first special case mapping. - n := (e[1] >> lengthBits) & lengthMask - if ct == cTitle { - // The first special case mapping is for lower. Set n to the second. - if n == noChange { - n = 0 - } - n, e = e[1]&lengthMask, e[n:] - } - if n != noChange { - return c.writeString(e[offset : offset+n]) - } - return c.copy() -} - -// isUpper writes the isUppercase version of the current rune to dst. -func isUpper(c *context) bool { - ct := c.caseType() - if c.info&hasMappingMask == 0 || ct == cUpper { - return true - } - if c.info&exceptionBit == 0 { - c.err = transform.ErrEndOfSpan - return false - } - e := exceptions[c.info>>exceptionShift:] - // Get length of first special case mapping. - n := (e[1] >> lengthBits) & lengthMask - if ct == cTitle { - n = e[1] & lengthMask - } - if n != noChange { - c.err = transform.ErrEndOfSpan - return false - } - return true -} - -// title writes the title case version of the current rune to dst. -func title(c *context) bool { - ct := c.caseType() - if c.info&hasMappingMask == 0 || ct == cTitle { - return c.copy() - } - if c.info&exceptionBit == 0 { - if ct == cLower { - return c.copyXOR() - } - return c.copy() - } - // Get the exception data. - e := exceptions[c.info>>exceptionShift:] - offset := 2 + e[0]&lengthMask // size of header + fold string - - nFirst := (e[1] >> lengthBits) & lengthMask - if nTitle := e[1] & lengthMask; nTitle != noChange { - if nFirst != noChange { - e = e[nFirst:] - } - return c.writeString(e[offset : offset+nTitle]) - } - if ct == cLower && nFirst != noChange { - // Use the uppercase version instead. - return c.writeString(e[offset : offset+nFirst]) - } - // Already in correct case. - return c.copy() -} - -// isTitle reports whether the current rune is in title case. -func isTitle(c *context) bool { - ct := c.caseType() - if c.info&hasMappingMask == 0 || ct == cTitle { - return true - } - if c.info&exceptionBit == 0 { - if ct == cLower { - c.err = transform.ErrEndOfSpan - return false - } - return true - } - // Get the exception data. - e := exceptions[c.info>>exceptionShift:] - if nTitle := e[1] & lengthMask; nTitle != noChange { - c.err = transform.ErrEndOfSpan - return false - } - nFirst := (e[1] >> lengthBits) & lengthMask - if ct == cLower && nFirst != noChange { - c.err = transform.ErrEndOfSpan - return false - } - return true -} - -// foldFull writes the foldFull version of the current rune to dst. -func foldFull(c *context) bool { - if c.info&hasMappingMask == 0 { - return c.copy() - } - ct := c.caseType() - if c.info&exceptionBit == 0 { - if ct != cLower || c.info&inverseFoldBit != 0 { - return c.copyXOR() - } - return c.copy() - } - e := exceptions[c.info>>exceptionShift:] - n := e[0] & lengthMask - if n == 0 { - if ct == cLower { - return c.copy() - } - n = (e[1] >> lengthBits) & lengthMask - } - return c.writeString(e[2 : 2+n]) -} - -// isFoldFull reports whether the current run is mapped to foldFull -func isFoldFull(c *context) bool { - if c.info&hasMappingMask == 0 { - return true - } - ct := c.caseType() - if c.info&exceptionBit == 0 { - if ct != cLower || c.info&inverseFoldBit != 0 { - c.err = transform.ErrEndOfSpan - return false - } - return true - } - e := exceptions[c.info>>exceptionShift:] - n := e[0] & lengthMask - if n == 0 && ct == cLower { - return true - } - c.err = transform.ErrEndOfSpan - return false -} diff --git a/vendor/golang.org/x/text/cases/context_test.go b/vendor/golang.org/x/text/cases/context_test.go deleted file mode 100644 index f59087807..000000000 --- a/vendor/golang.org/x/text/cases/context_test.go +++ /dev/null @@ -1,438 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cases - -import ( - "strings" - "testing" - "unicode" - - "golang.org/x/text/internal/testtext" - "golang.org/x/text/language" - "golang.org/x/text/transform" - "golang.org/x/text/unicode/norm" - "golang.org/x/text/unicode/rangetable" -) - -// The following definitions are taken directly from Chapter 3 of The Unicode -// Standard. - -func propCased(r rune) bool { - return propLower(r) || propUpper(r) || unicode.IsTitle(r) -} - -func propLower(r rune) bool { - return unicode.IsLower(r) || unicode.Is(unicode.Other_Lowercase, r) -} - -func propUpper(r rune) bool { - return unicode.IsUpper(r) || unicode.Is(unicode.Other_Uppercase, r) -} - -func propIgnore(r rune) bool { - if unicode.In(r, unicode.Mn, unicode.Me, unicode.Cf, unicode.Lm, unicode.Sk) { - return true - } - return caseIgnorable[r] -} - -func hasBreakProp(r rune) bool { - // binary search over ranges - lo := 0 - hi := len(breakProp) - for lo < hi { - m := lo + (hi-lo)/2 - bp := &breakProp[m] - if bp.lo <= r && r <= bp.hi { - return true - } - if r < bp.lo { - hi = m - } else { - lo = m + 1 - } - } - return false -} - -func contextFromRune(r rune) *context { - c := context{dst: make([]byte, 128), src: []byte(string(r)), atEOF: true} - c.next() - return &c -} - -func TestCaseProperties(t *testing.T) { - if unicode.Version != UnicodeVersion { - // Properties of existing code points may change by Unicode version, so - // we need to skip. - t.Skipf("Skipping as core Unicode version %s different than %s", unicode.Version, UnicodeVersion) - } - assigned := rangetable.Assigned(UnicodeVersion) - coreVersion := rangetable.Assigned(unicode.Version) - for r := rune(0); r <= lastRuneForTesting; r++ { - if !unicode.In(r, assigned) || !unicode.In(r, coreVersion) { - continue - } - c := contextFromRune(r) - if got, want := c.info.isCaseIgnorable(), propIgnore(r); got != want { - t.Errorf("caseIgnorable(%U): got %v; want %v (%x)", r, got, want, c.info) - } - // New letters may change case types, but existing case pairings should - // not change. See Case Pair Stability in - // http://unicode.org/policies/stability_policy.html. - if rf := unicode.SimpleFold(r); rf != r && unicode.In(rf, assigned) { - if got, want := c.info.isCased(), propCased(r); got != want { - t.Errorf("cased(%U): got %v; want %v (%x)", r, got, want, c.info) - } - if got, want := c.caseType() == cUpper, propUpper(r); got != want { - t.Errorf("upper(%U): got %v; want %v (%x)", r, got, want, c.info) - } - if got, want := c.caseType() == cLower, propLower(r); got != want { - t.Errorf("lower(%U): got %v; want %v (%x)", r, got, want, c.info) - } - } - if got, want := c.info.isBreak(), hasBreakProp(r); got != want { - t.Errorf("isBreak(%U): got %v; want %v (%x)", r, got, want, c.info) - } - } - // TODO: get title case from unicode file. -} - -func TestMapping(t *testing.T) { - assigned := rangetable.Assigned(UnicodeVersion) - coreVersion := rangetable.Assigned(unicode.Version) - if coreVersion == nil { - coreVersion = assigned - } - apply := func(r rune, f func(c *context) bool) string { - c := contextFromRune(r) - f(c) - return string(c.dst[:c.pDst]) - } - - for r, tt := range special { - if got, want := apply(r, lower), tt.toLower; got != want { - t.Errorf("lowerSpecial:(%U): got %+q; want %+q", r, got, want) - } - if got, want := apply(r, title), tt.toTitle; got != want { - t.Errorf("titleSpecial:(%U): got %+q; want %+q", r, got, want) - } - if got, want := apply(r, upper), tt.toUpper; got != want { - t.Errorf("upperSpecial:(%U): got %+q; want %+q", r, got, want) - } - } - - for r := rune(0); r <= lastRuneForTesting; r++ { - if !unicode.In(r, assigned) || !unicode.In(r, coreVersion) { - continue - } - if rf := unicode.SimpleFold(r); rf == r || !unicode.In(rf, assigned) { - continue - } - if _, ok := special[r]; ok { - continue - } - want := string(unicode.ToLower(r)) - if got := apply(r, lower); got != want { - t.Errorf("lower:%q (%U): got %q %U; want %q %U", r, r, got, []rune(got), want, []rune(want)) - } - - want = string(unicode.ToUpper(r)) - if got := apply(r, upper); got != want { - t.Errorf("upper:%q (%U): got %q %U; want %q %U", r, r, got, []rune(got), want, []rune(want)) - } - - want = string(unicode.ToTitle(r)) - if got := apply(r, title); got != want { - t.Errorf("title:%q (%U): got %q %U; want %q %U", r, r, got, []rune(got), want, []rune(want)) - } - } -} - -func runeFoldData(r rune) (x struct{ simple, full, special string }) { - x = foldMap[r] - if x.simple == "" { - x.simple = string(unicode.ToLower(r)) - } - if x.full == "" { - x.full = string(unicode.ToLower(r)) - } - if x.special == "" { - x.special = x.full - } - return -} - -func TestFoldData(t *testing.T) { - assigned := rangetable.Assigned(UnicodeVersion) - coreVersion := rangetable.Assigned(unicode.Version) - if coreVersion == nil { - coreVersion = assigned - } - apply := func(r rune, f func(c *context) bool) (string, info) { - c := contextFromRune(r) - f(c) - return string(c.dst[:c.pDst]), c.info.cccType() - } - for r := rune(0); r <= lastRuneForTesting; r++ { - if !unicode.In(r, assigned) || !unicode.In(r, coreVersion) { - continue - } - x := runeFoldData(r) - if got, info := apply(r, foldFull); got != x.full { - t.Errorf("full:%q (%U): got %q %U; want %q %U (ccc=%x)", r, r, got, []rune(got), x.full, []rune(x.full), info) - } - // TODO: special and simple. - } -} - -func TestCCC(t *testing.T) { - assigned := rangetable.Assigned(UnicodeVersion) - normVersion := rangetable.Assigned(norm.Version) - for r := rune(0); r <= lastRuneForTesting; r++ { - if !unicode.In(r, assigned) || !unicode.In(r, normVersion) { - continue - } - c := contextFromRune(r) - - p := norm.NFC.PropertiesString(string(r)) - want := cccOther - switch p.CCC() { - case 0: - want = cccZero - case above: - want = cccAbove - } - if got := c.info.cccType(); got != want { - t.Errorf("%U: got %x; want %x", r, got, want) - } - } -} - -func TestWordBreaks(t *testing.T) { - for _, tt := range breakTest { - testtext.Run(t, tt, func(t *testing.T) { - parts := strings.Split(tt, "|") - want := "" - for _, s := range parts { - found := false - // This algorithm implements title casing given word breaks - // as defined in the Unicode standard 3.13 R3. - for _, r := range s { - title := unicode.ToTitle(r) - lower := unicode.ToLower(r) - if !found && title != lower { - found = true - want += string(title) - } else { - want += string(lower) - } - } - } - src := strings.Join(parts, "") - got := Title(language.Und).String(src) - if got != want { - t.Errorf("got %q; want %q", got, want) - } - }) - } -} - -func TestContext(t *testing.T) { - tests := []struct { - desc string - dstSize int - atEOF bool - src string - out string - nSrc int - err error - ops string - prefixArg string - prefixWant bool - }{{ - desc: "next: past end, atEOF, no checkpoint", - dstSize: 10, - atEOF: true, - src: "12", - out: "", - nSrc: 2, - ops: "next;next;next", - // Test that calling prefix with a non-empty argument when the buffer - // is depleted returns false. - prefixArg: "x", - prefixWant: false, - }, { - desc: "next: not at end, atEOF, no checkpoint", - dstSize: 10, - atEOF: false, - src: "12", - out: "", - nSrc: 0, - err: transform.ErrShortSrc, - ops: "next;next", - prefixArg: "", - prefixWant: true, - }, { - desc: "next: past end, !atEOF, no checkpoint", - dstSize: 10, - atEOF: false, - src: "12", - out: "", - nSrc: 0, - err: transform.ErrShortSrc, - ops: "next;next;next", - prefixArg: "", - prefixWant: true, - }, { - desc: "next: past end, !atEOF, checkpoint", - dstSize: 10, - atEOF: false, - src: "12", - out: "", - nSrc: 2, - ops: "next;next;checkpoint;next", - prefixArg: "", - prefixWant: true, - }, { - desc: "copy: exact count, atEOF, no checkpoint", - dstSize: 2, - atEOF: true, - src: "12", - out: "12", - nSrc: 2, - ops: "next;copy;next;copy;next", - prefixArg: "", - prefixWant: true, - }, { - desc: "copy: past end, !atEOF, no checkpoint", - dstSize: 2, - atEOF: false, - src: "12", - out: "", - nSrc: 0, - err: transform.ErrShortSrc, - ops: "next;copy;next;copy;next", - prefixArg: "", - prefixWant: true, - }, { - desc: "copy: past end, !atEOF, checkpoint", - dstSize: 2, - atEOF: false, - src: "12", - out: "12", - nSrc: 2, - ops: "next;copy;next;copy;checkpoint;next", - prefixArg: "", - prefixWant: true, - }, { - desc: "copy: short dst", - dstSize: 1, - atEOF: false, - src: "12", - out: "", - nSrc: 0, - err: transform.ErrShortDst, - ops: "next;copy;next;copy;checkpoint;next", - prefixArg: "12", - prefixWant: false, - }, { - desc: "copy: short dst, checkpointed", - dstSize: 1, - atEOF: false, - src: "12", - out: "1", - nSrc: 1, - err: transform.ErrShortDst, - ops: "next;copy;checkpoint;next;copy;next", - prefixArg: "", - prefixWant: true, - }, { - desc: "writeString: simple", - dstSize: 3, - atEOF: true, - src: "1", - out: "1ab", - nSrc: 1, - ops: "next;copy;writeab;next", - prefixArg: "", - prefixWant: true, - }, { - desc: "writeString: short dst", - dstSize: 2, - atEOF: true, - src: "12", - out: "", - nSrc: 0, - err: transform.ErrShortDst, - ops: "next;copy;writeab;next", - prefixArg: "2", - prefixWant: true, - }, { - desc: "writeString: simple", - dstSize: 3, - atEOF: true, - src: "12", - out: "1ab", - nSrc: 2, - ops: "next;copy;next;writeab;next", - prefixArg: "", - prefixWant: true, - }, { - desc: "writeString: short dst", - dstSize: 2, - atEOF: true, - src: "12", - out: "", - nSrc: 0, - err: transform.ErrShortDst, - ops: "next;copy;next;writeab;next", - prefixArg: "1", - prefixWant: false, - }, { - desc: "prefix", - dstSize: 2, - atEOF: true, - src: "12", - out: "", - nSrc: 0, - // Context will assign an ErrShortSrc if the input wasn't exhausted. - err: transform.ErrShortSrc, - prefixArg: "12", - prefixWant: true, - }} - for _, tt := range tests { - c := context{dst: make([]byte, tt.dstSize), src: []byte(tt.src), atEOF: tt.atEOF} - - for _, op := range strings.Split(tt.ops, ";") { - switch op { - case "next": - c.next() - case "checkpoint": - c.checkpoint() - case "writeab": - c.writeString("ab") - case "copy": - c.copy() - case "": - default: - t.Fatalf("unknown op %q", op) - } - } - if got := c.hasPrefix(tt.prefixArg); got != tt.prefixWant { - t.Errorf("%s:\nprefix was %v; want %v", tt.desc, got, tt.prefixWant) - } - nDst, nSrc, err := c.ret() - if err != tt.err { - t.Errorf("%s:\nerror was %v; want %v", tt.desc, err, tt.err) - } - if out := string(c.dst[:nDst]); out != tt.out { - t.Errorf("%s:\nout was %q; want %q", tt.desc, out, tt.out) - } - if nSrc != tt.nSrc { - t.Errorf("%s:\nnSrc was %d; want %d", tt.desc, nSrc, tt.nSrc) - } - } -} diff --git a/vendor/golang.org/x/text/cases/example_test.go b/vendor/golang.org/x/text/cases/example_test.go deleted file mode 100644 index 56e6e33ee..000000000 --- a/vendor/golang.org/x/text/cases/example_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cases_test - -import ( - "fmt" - - "golang.org/x/text/cases" - "golang.org/x/text/language" -) - -func Example() { - src := []string{ - "hello world!", - "i with dot", - "'n ijsberg", - "here comes O'Brian", - } - for _, c := range []cases.Caser{ - cases.Lower(language.Und), - cases.Upper(language.Turkish), - cases.Title(language.Dutch), - cases.Title(language.Und, cases.NoLower), - } { - fmt.Println() - for _, s := range src { - fmt.Println(c.String(s)) - } - } - - // Output: - // hello world! - // i with dot - // 'n ijsberg - // here comes o'brian - // - // HELLO WORLD! - // İ WİTH DOT - // 'N İJSBERG - // HERE COMES O'BRİAN - // - // Hello World! - // I With Dot - // 'n IJsberg - // Here Comes O'brian - // - // Hello World! - // I With Dot - // 'N Ijsberg - // Here Comes O'Brian -} diff --git a/vendor/golang.org/x/text/cases/fold.go b/vendor/golang.org/x/text/cases/fold.go deleted file mode 100644 index 85cc434fa..000000000 --- a/vendor/golang.org/x/text/cases/fold.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cases - -import "golang.org/x/text/transform" - -type caseFolder struct{ transform.NopResetter } - -// caseFolder implements the Transformer interface for doing case folding. -func (t *caseFolder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - c := context{dst: dst, src: src, atEOF: atEOF} - for c.next() { - foldFull(&c) - c.checkpoint() - } - return c.ret() -} - -func (t *caseFolder) Span(src []byte, atEOF bool) (n int, err error) { - c := context{src: src, atEOF: atEOF} - for c.next() && isFoldFull(&c) { - c.checkpoint() - } - return c.retSpan() -} - -func makeFold(o options) transform.SpanningTransformer { - // TODO: Special case folding, through option Language, Special/Turkic, or - // both. - // TODO: Implement Compact options. - return &caseFolder{} -} diff --git a/vendor/golang.org/x/text/cases/fold_test.go b/vendor/golang.org/x/text/cases/fold_test.go deleted file mode 100644 index ca939c7c1..000000000 --- a/vendor/golang.org/x/text/cases/fold_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cases - -import ( - "testing" - - "golang.org/x/text/internal/testtext" -) - -var foldTestCases = []string{ - "βß\u13f8", // "βssᏰ" - "ab\u13fc\uab7aꭰ", // abᏴᎪᎠ - "affifflast", // affifflast - "Iİiı\u0345", // ii̇iıι - "µµΜΜςσΣΣ", // μμμμσσσσ -} - -func TestFold(t *testing.T) { - for _, tc := range foldTestCases { - testEntry := func(name string, c Caser, m func(r rune) string) { - want := "" - for _, r := range tc { - want += m(r) - } - if got := c.String(tc); got != want { - t.Errorf("%s(%s) = %+q; want %+q", name, tc, got, want) - } - dst := make([]byte, 256) // big enough to hold any result - src := []byte(tc) - v := testtext.AllocsPerRun(20, func() { - c.Transform(dst, src, true) - }) - if v > 0 { - t.Errorf("%s(%s): number of allocs was %f; want 0", name, tc, v) - } - } - testEntry("FullFold", Fold(), func(r rune) string { - return runeFoldData(r).full - }) - // TODO: - // testEntry("SimpleFold", Fold(Compact), func(r rune) string { - // return runeFoldData(r).simple - // }) - // testEntry("SpecialFold", Fold(Turkic), func(r rune) string { - // return runeFoldData(r).special - // }) - } -} diff --git a/vendor/golang.org/x/text/cases/gen.go b/vendor/golang.org/x/text/cases/gen.go deleted file mode 100644 index 24b723003..000000000 --- a/vendor/golang.org/x/text/cases/gen.go +++ /dev/null @@ -1,839 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// This program generates the trie for casing operations. The Unicode casing -// algorithm requires the lookup of various properties and mappings for each -// rune. The table generated by this generator combines several of the most -// frequently used of these into a single trie so that they can be accessed -// with a single lookup. -package main - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "log" - "reflect" - "strconv" - "strings" - "unicode" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" - "golang.org/x/text/internal/ucd" - "golang.org/x/text/unicode/norm" -) - -func main() { - gen.Init() - genTables() - genTablesTest() - gen.Repackage("gen_trieval.go", "trieval.go", "cases") -} - -// runeInfo contains all information for a rune that we care about for casing -// operations. -type runeInfo struct { - Rune rune - - entry info // trie value for this rune. - - CaseMode info - - // Simple case mappings. - Simple [1 + maxCaseMode][]rune - - // Special casing - HasSpecial bool - Conditional bool - Special [1 + maxCaseMode][]rune - - // Folding - FoldSimple rune - FoldSpecial rune - FoldFull []rune - - // TODO: FC_NFKC, or equivalent data. - - // Properties - SoftDotted bool - CaseIgnorable bool - Cased bool - DecomposeGreek bool - BreakType string - BreakCat breakCategory - - // We care mostly about 0, Above, and IotaSubscript. - CCC byte -} - -type breakCategory int - -const ( - breakBreak breakCategory = iota - breakLetter - breakMid -) - -// mapping returns the case mapping for the given case type. -func (r *runeInfo) mapping(c info) string { - if r.HasSpecial { - return string(r.Special[c]) - } - if len(r.Simple[c]) != 0 { - return string(r.Simple[c]) - } - return string(r.Rune) -} - -func parse(file string, f func(p *ucd.Parser)) { - ucd.Parse(gen.OpenUCDFile(file), f) -} - -func parseUCD() []runeInfo { - chars := make([]runeInfo, unicode.MaxRune) - - get := func(r rune) *runeInfo { - c := &chars[r] - c.Rune = r - return c - } - - parse("UnicodeData.txt", func(p *ucd.Parser) { - ri := get(p.Rune(0)) - ri.CCC = byte(p.Int(ucd.CanonicalCombiningClass)) - ri.Simple[cLower] = p.Runes(ucd.SimpleLowercaseMapping) - ri.Simple[cUpper] = p.Runes(ucd.SimpleUppercaseMapping) - ri.Simple[cTitle] = p.Runes(ucd.SimpleTitlecaseMapping) - if p.String(ucd.GeneralCategory) == "Lt" { - ri.CaseMode = cTitle - } - }) - - // ; - parse("PropList.txt", func(p *ucd.Parser) { - if p.String(1) == "Soft_Dotted" { - chars[p.Rune(0)].SoftDotted = true - } - }) - - // ; - parse("DerivedCoreProperties.txt", func(p *ucd.Parser) { - ri := get(p.Rune(0)) - switch p.String(1) { - case "Case_Ignorable": - ri.CaseIgnorable = true - case "Cased": - ri.Cased = true - case "Lowercase": - ri.CaseMode = cLower - case "Uppercase": - ri.CaseMode = cUpper - } - }) - - // ; ; ; <upper> ; (<condition_list> ;)? - parse("SpecialCasing.txt", func(p *ucd.Parser) { - // We drop all conditional special casing and deal with them manually in - // the language-specific case mappers. Rune 0x03A3 is the only one with - // a conditional formatting that is not language-specific. However, - // dealing with this letter is tricky, especially in a streaming - // context, so we deal with it in the Caser for Greek specifically. - ri := get(p.Rune(0)) - if p.String(4) == "" { - ri.HasSpecial = true - ri.Special[cLower] = p.Runes(1) - ri.Special[cTitle] = p.Runes(2) - ri.Special[cUpper] = p.Runes(3) - } else { - ri.Conditional = true - } - }) - - // TODO: Use text breaking according to UAX #29. - // <code>; <word break type> - parse("auxiliary/WordBreakProperty.txt", func(p *ucd.Parser) { - ri := get(p.Rune(0)) - ri.BreakType = p.String(1) - - // We collapse the word breaking properties onto the categories we need. - switch p.String(1) { // TODO: officially we need to canonicalize. - case "MidLetter", "MidNumLet", "Single_Quote": - ri.BreakCat = breakMid - if !ri.CaseIgnorable { - // finalSigma relies on the fact that all breakMid runes are - // also a Case_Ignorable. Revisit this code when this changes. - log.Fatalf("Rune %U, which has a break category mid, is not a case ignorable", ri) - } - case "ALetter", "Hebrew_Letter", "Numeric", "Extend", "ExtendNumLet", "Format", "ZWJ": - ri.BreakCat = breakLetter - } - }) - - // <code>; <type>; <mapping> - parse("CaseFolding.txt", func(p *ucd.Parser) { - ri := get(p.Rune(0)) - switch p.String(1) { - case "C": - ri.FoldSimple = p.Rune(2) - ri.FoldFull = p.Runes(2) - case "S": - ri.FoldSimple = p.Rune(2) - case "T": - ri.FoldSpecial = p.Rune(2) - case "F": - ri.FoldFull = p.Runes(2) - default: - log.Fatalf("%U: unknown type: %s", p.Rune(0), p.String(1)) - } - }) - - return chars -} - -func genTables() { - chars := parseUCD() - verifyProperties(chars) - - t := triegen.NewTrie("case") - for i := range chars { - c := &chars[i] - makeEntry(c) - t.Insert(rune(i), uint64(c.entry)) - } - - w := gen.NewCodeWriter() - defer w.WriteGoFile("tables.go", "cases") - - gen.WriteUnicodeVersion(w) - - // TODO: write CLDR version after adding a mechanism to detect that the - // tables on which the manually created locale-sensitive casing code is - // based hasn't changed. - - w.WriteVar("xorData", string(xorData)) - w.WriteVar("exceptions", string(exceptionData)) - - sz, err := t.Gen(w, triegen.Compact(&sparseCompacter{})) - if err != nil { - log.Fatal(err) - } - w.Size += sz -} - -func makeEntry(ri *runeInfo) { - if ri.CaseIgnorable { - if ri.Cased { - ri.entry = cIgnorableCased - } else { - ri.entry = cIgnorableUncased - } - } else { - ri.entry = ri.CaseMode - } - - // TODO: handle soft-dotted. - - ccc := cccOther - switch ri.CCC { - case 0: // Not_Reordered - ccc = cccZero - case above: // Above - ccc = cccAbove - } - switch ri.BreakCat { - case breakBreak: - ccc = cccBreak - case breakMid: - ri.entry |= isMidBit - } - - ri.entry |= ccc - - if ri.CaseMode == cUncased { - return - } - - // Need to do something special. - if ri.CaseMode == cTitle || ri.HasSpecial || ri.mapping(cTitle) != ri.mapping(cUpper) { - makeException(ri) - return - } - if f := string(ri.FoldFull); len(f) > 0 && f != ri.mapping(cUpper) && f != ri.mapping(cLower) { - makeException(ri) - return - } - - // Rune is either lowercase or uppercase. - - orig := string(ri.Rune) - mapped := "" - if ri.CaseMode == cUpper { - mapped = ri.mapping(cLower) - } else { - mapped = ri.mapping(cUpper) - } - - if len(orig) != len(mapped) { - makeException(ri) - return - } - - if string(ri.FoldFull) == ri.mapping(cUpper) { - ri.entry |= inverseFoldBit - } - - n := len(orig) - - // Create per-byte XOR mask. - var b []byte - for i := 0; i < n; i++ { - b = append(b, orig[i]^mapped[i]) - } - - // Remove leading 0 bytes, but keep at least one byte. - for ; len(b) > 1 && b[0] == 0; b = b[1:] { - } - - if len(b) == 1 && b[0]&0xc0 == 0 { - ri.entry |= info(b[0]) << xorShift - return - } - - key := string(b) - x, ok := xorCache[key] - if !ok { - xorData = append(xorData, 0) // for detecting start of sequence - xorData = append(xorData, b...) - - x = len(xorData) - 1 - xorCache[key] = x - } - ri.entry |= info(x<<xorShift) | xorIndexBit -} - -var xorCache = map[string]int{} - -// xorData contains byte-wise XOR data for the least significant bytes of a -// UTF-8 encoded rune. An index points to the last byte. The sequence starts -// with a zero terminator. -var xorData = []byte{} - -// See the comments in gen_trieval.go re "the exceptions slice". -var exceptionData = []byte{0} - -// makeException encodes case mappings that cannot be expressed in a simple -// XOR diff. -func makeException(ri *runeInfo) { - ccc := ri.entry & cccMask - // Set exception bit and retain case type. - ri.entry &= 0x0007 - ri.entry |= exceptionBit - - if len(exceptionData) >= 1<<numExceptionBits { - log.Fatalf("%U:exceptionData too large %x > %d bits", ri.Rune, len(exceptionData), numExceptionBits) - } - - // Set the offset in the exceptionData array. - ri.entry |= info(len(exceptionData) << exceptionShift) - - orig := string(ri.Rune) - tc := ri.mapping(cTitle) - uc := ri.mapping(cUpper) - lc := ri.mapping(cLower) - ff := string(ri.FoldFull) - - // addString sets the length of a string and adds it to the expansions array. - addString := func(s string, b *byte) { - if len(s) == 0 { - // Zero-length mappings exist, but only for conditional casing, - // which we are representing outside of this table. - log.Fatalf("%U: has zero-length mapping.", ri.Rune) - } - *b <<= 3 - if s != orig { - n := len(s) - if n > 7 { - log.Fatalf("%U: mapping larger than 7 (%d)", ri.Rune, n) - } - *b |= byte(n) - exceptionData = append(exceptionData, s...) - } - } - - // byte 0: - exceptionData = append(exceptionData, byte(ccc)|byte(len(ff))) - - // byte 1: - p := len(exceptionData) - exceptionData = append(exceptionData, 0) - - if len(ff) > 7 { // May be zero-length. - log.Fatalf("%U: fold string larger than 7 (%d)", ri.Rune, len(ff)) - } - exceptionData = append(exceptionData, ff...) - ct := ri.CaseMode - if ct != cLower { - addString(lc, &exceptionData[p]) - } - if ct != cUpper { - addString(uc, &exceptionData[p]) - } - if ct != cTitle { - // If title is the same as upper, we set it to the original string so - // that it will be marked as not present. This implies title case is - // the same as upper case. - if tc == uc { - tc = orig - } - addString(tc, &exceptionData[p]) - } -} - -// sparseCompacter is a trie value block Compacter. There are many cases where -// successive runes alternate between lower- and upper-case. This Compacter -// exploits this by adding a special case type where the case value is obtained -// from or-ing it with the least-significant bit of the rune, creating large -// ranges of equal case values that compress well. -type sparseCompacter struct { - sparseBlocks [][]uint16 - sparseOffsets []uint16 - sparseCount int -} - -// makeSparse returns the number of elements that compact block would contain -// as well as the modified values. -func makeSparse(vals []uint64) ([]uint16, int) { - // Copy the values. - values := make([]uint16, len(vals)) - for i, v := range vals { - values[i] = uint16(v) - } - - alt := func(i int, v uint16) uint16 { - if cm := info(v & fullCasedMask); cm == cUpper || cm == cLower { - // Convert cLower or cUpper to cXORCase value, which has the form 11x. - xor := v - xor &^= 1 - xor |= uint16(i&1) ^ (v & 1) - xor |= 0x4 - return xor - } - return v - } - - var count int - var previous uint16 - for i, v := range values { - if v != 0 { - // Try if the unmodified value is equal to the previous. - if v == previous { - continue - } - - // Try if the xor-ed value is equal to the previous value. - a := alt(i, v) - if a == previous { - values[i] = a - continue - } - - // This is a new value. - count++ - - // Use the xor-ed value if it will be identical to the next value. - if p := i + 1; p < len(values) && alt(p, values[p]) == a { - values[i] = a - v = a - } - } - previous = v - } - return values, count -} - -func (s *sparseCompacter) Size(v []uint64) (int, bool) { - _, n := makeSparse(v) - - // We limit using this method to having 16 entries. - if n > 16 { - return 0, false - } - - return 2 + int(reflect.TypeOf(valueRange{}).Size())*n, true -} - -func (s *sparseCompacter) Store(v []uint64) uint32 { - h := uint32(len(s.sparseOffsets)) - values, sz := makeSparse(v) - s.sparseBlocks = append(s.sparseBlocks, values) - s.sparseOffsets = append(s.sparseOffsets, uint16(s.sparseCount)) - s.sparseCount += sz - return h -} - -func (s *sparseCompacter) Handler() string { - // The sparse global variable and its lookup method is defined in gen_trieval.go. - return "sparse.lookup" -} - -func (s *sparseCompacter) Print(w io.Writer) (retErr error) { - p := func(format string, args ...interface{}) { - _, err := fmt.Fprintf(w, format, args...) - if retErr == nil && err != nil { - retErr = err - } - } - - ls := len(s.sparseBlocks) - if ls == len(s.sparseOffsets) { - s.sparseOffsets = append(s.sparseOffsets, uint16(s.sparseCount)) - } - p("// sparseOffsets: %d entries, %d bytes\n", ls+1, (ls+1)*2) - p("var sparseOffsets = %#v\n\n", s.sparseOffsets) - - ns := s.sparseCount - p("// sparseValues: %d entries, %d bytes\n", ns, ns*4) - p("var sparseValues = [%d]valueRange {", ns) - for i, values := range s.sparseBlocks { - p("\n// Block %#x, offset %#x", i, s.sparseOffsets[i]) - var v uint16 - for i, nv := range values { - if nv != v { - if v != 0 { - p(",hi:%#02x},", 0x80+i-1) - } - if nv != 0 { - p("\n{value:%#04x,lo:%#02x", nv, 0x80+i) - } - } - v = nv - } - if v != 0 { - p(",hi:%#02x},", 0x80+len(values)-1) - } - } - p("\n}\n\n") - return -} - -// verifyProperties that properties of the runes that are relied upon in the -// implementation. Each property is marked with an identifier that is referred -// to in the places where it is used. -func verifyProperties(chars []runeInfo) { - for i, c := range chars { - r := rune(i) - - // Rune properties. - - // A.1: modifier never changes on lowercase. [ltLower] - if c.CCC > 0 && unicode.ToLower(r) != r { - log.Fatalf("%U: non-starter changes when lowercased", r) - } - - // A.2: properties of decompositions starting with I or J. [ltLower] - d := norm.NFD.PropertiesString(string(r)).Decomposition() - if len(d) > 0 { - if d[0] == 'I' || d[0] == 'J' { - // A.2.1: we expect at least an ASCII character and a modifier. - if len(d) < 3 { - log.Fatalf("%U: length of decomposition was %d; want >= 3", r, len(d)) - } - - // All subsequent runes are modifiers and all have the same CCC. - runes := []rune(string(d[1:])) - ccc := chars[runes[0]].CCC - - for _, mr := range runes[1:] { - mc := chars[mr] - - // A.2.2: all modifiers have a CCC of Above or less. - if ccc == 0 || ccc > above { - log.Fatalf("%U: CCC of successive rune (%U) was %d; want (0,230]", r, mr, ccc) - } - - // A.2.3: a sequence of modifiers all have the same CCC. - if mc.CCC != ccc { - log.Fatalf("%U: CCC of follow-up modifier (%U) was %d; want %d", r, mr, mc.CCC, ccc) - } - - // A.2.4: for each trailing r, r in [0x300, 0x311] <=> CCC == Above. - if (ccc == above) != (0x300 <= mr && mr <= 0x311) { - log.Fatalf("%U: modifier %U in [U+0300, U+0311] != ccc(%U) == 230", r, mr, mr) - } - - if i += len(string(mr)); i >= len(d) { - break - } - } - } - } - - // A.3: no U+0307 in decomposition of Soft-Dotted rune. [ltUpper] - if unicode.Is(unicode.Soft_Dotted, r) && strings.Contains(string(d), "\u0307") { - log.Fatalf("%U: decomposition of soft-dotted rune may not contain U+0307", r) - } - - // A.4: only rune U+0345 may be of CCC Iota_Subscript. [elUpper] - if c.CCC == iotaSubscript && r != 0x0345 { - log.Fatalf("%U: only rune U+0345 may have CCC Iota_Subscript", r) - } - - // A.5: soft-dotted runes do not have exceptions. - if c.SoftDotted && c.entry&exceptionBit != 0 { - log.Fatalf("%U: soft-dotted has exception", r) - } - - // A.6: Greek decomposition. [elUpper] - if unicode.Is(unicode.Greek, r) { - if b := norm.NFD.PropertiesString(string(r)).Decomposition(); b != nil { - runes := []rune(string(b)) - // A.6.1: If a Greek rune decomposes and the first rune of the - // decomposition is greater than U+00FF, the rune is always - // great and not a modifier. - if f := runes[0]; unicode.IsMark(f) || f > 0xFF && !unicode.Is(unicode.Greek, f) { - log.Fatalf("%U: expected first rune of Greek decomposition to be letter, found %U", r, f) - } - // A.6.2: Any follow-up rune in a Greek decomposition is a - // modifier of which the first should be gobbled in - // decomposition. - for _, m := range runes[1:] { - switch m { - case 0x0313, 0x0314, 0x0301, 0x0300, 0x0306, 0x0342, 0x0308, 0x0304, 0x345: - default: - log.Fatalf("%U: modifier %U is outside of expected Greek modifier set", r, m) - } - } - } - } - - // Breaking properties. - - // B.1: all runes with CCC > 0 are of break type Extend. - if c.CCC > 0 && c.BreakType != "Extend" { - log.Fatalf("%U: CCC == %d, but got break type %s; want Extend", r, c.CCC, c.BreakType) - } - - // B.2: all cased runes with c.CCC == 0 are of break type ALetter. - if c.CCC == 0 && c.Cased && c.BreakType != "ALetter" { - log.Fatalf("%U: cased, but got break type %s; want ALetter", r, c.BreakType) - } - - // B.3: letter category. - if c.CCC == 0 && c.BreakCat != breakBreak && !c.CaseIgnorable { - if c.BreakCat != breakLetter { - log.Fatalf("%U: check for letter break type gave %d; want %d", r, c.BreakCat, breakLetter) - } - } - } -} - -func genTablesTest() { - w := &bytes.Buffer{} - - fmt.Fprintln(w, "var (") - printProperties(w, "DerivedCoreProperties.txt", "Case_Ignorable", verifyIgnore) - - // We discard the output as we know we have perfect functions. We run them - // just to verify the properties are correct. - n := printProperties(ioutil.Discard, "DerivedCoreProperties.txt", "Cased", verifyCased) - n += printProperties(ioutil.Discard, "DerivedCoreProperties.txt", "Lowercase", verifyLower) - n += printProperties(ioutil.Discard, "DerivedCoreProperties.txt", "Uppercase", verifyUpper) - if n > 0 { - log.Fatalf("One of the discarded properties does not have a perfect filter.") - } - - // <code>; <lower> ; <title> ; <upper> ; (<condition_list> ;)? - fmt.Fprintln(w, "\tspecial = map[rune]struct{ toLower, toTitle, toUpper string }{") - parse("SpecialCasing.txt", func(p *ucd.Parser) { - // Skip conditional entries. - if p.String(4) != "" { - return - } - r := p.Rune(0) - fmt.Fprintf(w, "\t\t0x%04x: {%q, %q, %q},\n", - r, string(p.Runes(1)), string(p.Runes(2)), string(p.Runes(3))) - }) - fmt.Fprint(w, "\t}\n\n") - - // <code>; <type>; <runes> - table := map[rune]struct{ simple, full, special string }{} - parse("CaseFolding.txt", func(p *ucd.Parser) { - r := p.Rune(0) - t := p.String(1) - v := string(p.Runes(2)) - if t != "T" && v == string(unicode.ToLower(r)) { - return - } - x := table[r] - switch t { - case "C": - x.full = v - x.simple = v - case "S": - x.simple = v - case "F": - x.full = v - case "T": - x.special = v - } - table[r] = x - }) - fmt.Fprintln(w, "\tfoldMap = map[rune]struct{ simple, full, special string }{") - for r := rune(0); r < 0x10FFFF; r++ { - x, ok := table[r] - if !ok { - continue - } - fmt.Fprintf(w, "\t\t0x%04x: {%q, %q, %q},\n", r, x.simple, x.full, x.special) - } - fmt.Fprint(w, "\t}\n\n") - - // Break property - notBreak := map[rune]bool{} - parse("auxiliary/WordBreakProperty.txt", func(p *ucd.Parser) { - switch p.String(1) { - case "Extend", "Format", "MidLetter", "MidNumLet", "Single_Quote", - "ALetter", "Hebrew_Letter", "Numeric", "ExtendNumLet", "ZWJ": - notBreak[p.Rune(0)] = true - } - }) - - fmt.Fprintln(w, "\tbreakProp = []struct{ lo, hi rune }{") - inBreak := false - for r := rune(0); r <= lastRuneForTesting; r++ { - if isBreak := !notBreak[r]; isBreak != inBreak { - if isBreak { - fmt.Fprintf(w, "\t\t{0x%x, ", r) - } else { - fmt.Fprintf(w, "0x%x},\n", r-1) - } - inBreak = isBreak - } - } - if inBreak { - fmt.Fprintf(w, "0x%x},\n", lastRuneForTesting) - } - fmt.Fprint(w, "\t}\n\n") - - // Word break test - // Filter out all samples that do not contain cased characters. - cased := map[rune]bool{} - parse("DerivedCoreProperties.txt", func(p *ucd.Parser) { - if p.String(1) == "Cased" { - cased[p.Rune(0)] = true - } - }) - - fmt.Fprintln(w, "\tbreakTest = []string{") - parse("auxiliary/WordBreakTest.txt", func(p *ucd.Parser) { - c := strings.Split(p.String(0), " ") - - const sep = '|' - numCased := 0 - test := "" - for ; len(c) >= 2; c = c[2:] { - if c[0] == "÷" && test != "" { - test += string(sep) - } - i, err := strconv.ParseUint(c[1], 16, 32) - r := rune(i) - if err != nil { - log.Fatalf("Invalid rune %q.", c[1]) - } - if r == sep { - log.Fatalf("Separator %q not allowed in test data. Pick another one.", sep) - } - if cased[r] { - numCased++ - } - test += string(r) - } - if numCased > 1 { - fmt.Fprintf(w, "\t\t%q,\n", test) - } - }) - fmt.Fprintln(w, "\t}") - - fmt.Fprintln(w, ")") - - gen.WriteGoFile("tables_test.go", "cases", w.Bytes()) -} - -// These functions are just used for verification that their definition have not -// changed in the Unicode Standard. - -func verifyCased(r rune) bool { - return verifyLower(r) || verifyUpper(r) || unicode.IsTitle(r) -} - -func verifyLower(r rune) bool { - return unicode.IsLower(r) || unicode.Is(unicode.Other_Lowercase, r) -} - -func verifyUpper(r rune) bool { - return unicode.IsUpper(r) || unicode.Is(unicode.Other_Uppercase, r) -} - -// verifyIgnore is an approximation of the Case_Ignorable property using the -// core unicode package. It is used to reduce the size of the test data. -func verifyIgnore(r rune) bool { - props := []*unicode.RangeTable{ - unicode.Mn, - unicode.Me, - unicode.Cf, - unicode.Lm, - unicode.Sk, - } - for _, p := range props { - if unicode.Is(p, r) { - return true - } - } - return false -} - -// printProperties prints tables of rune properties from the given UCD file. -// A filter func f can be given to exclude certain values. A rune r will have -// the indicated property if it is in the generated table or if f(r). -func printProperties(w io.Writer, file, property string, f func(r rune) bool) int { - verify := map[rune]bool{} - n := 0 - varNameParts := strings.Split(property, "_") - varNameParts[0] = strings.ToLower(varNameParts[0]) - fmt.Fprintf(w, "\t%s = map[rune]bool{\n", strings.Join(varNameParts, "")) - parse(file, func(p *ucd.Parser) { - if p.String(1) == property { - r := p.Rune(0) - verify[r] = true - if !f(r) { - n++ - fmt.Fprintf(w, "\t\t0x%.4x: true,\n", r) - } - } - }) - fmt.Fprint(w, "\t}\n\n") - - // Verify that f is correct, that is, it represents a subset of the property. - for r := rune(0); r <= lastRuneForTesting; r++ { - if !verify[r] && f(r) { - log.Fatalf("Incorrect filter func for property %q.", property) - } - } - return n -} - -// The newCaseTrie, sparseValues and sparseOffsets definitions below are -// placeholders referred to by gen_trieval.go. The real definitions are -// generated by this program and written to tables.go. - -func newCaseTrie(int) int { return 0 } - -var ( - sparseValues [0]valueRange - sparseOffsets [0]uint16 -) diff --git a/vendor/golang.org/x/text/cases/gen_trieval.go b/vendor/golang.org/x/text/cases/gen_trieval.go deleted file mode 100644 index 376d22c8f..000000000 --- a/vendor/golang.org/x/text/cases/gen_trieval.go +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This file contains definitions for interpreting the trie value of the case -// trie generated by "go run gen*.go". It is shared by both the generator -// program and the resultant package. Sharing is achieved by the generator -// copying gen_trieval.go to trieval.go and changing what's above this comment. - -// info holds case information for a single rune. It is the value returned -// by a trie lookup. Most mapping information can be stored in a single 16-bit -// value. If not, for example when a rune is mapped to multiple runes, the value -// stores some basic case data and an index into an array with additional data. -// -// The per-rune values have the following format: -// -// if (exception) { -// 15..5 unsigned exception index -// 4 unused -// } else { -// 15..8 XOR pattern or index to XOR pattern for case mapping -// Only 13..8 are used for XOR patterns. -// 7 inverseFold (fold to upper, not to lower) -// 6 index: interpret the XOR pattern as an index -// or isMid if case mode is cIgnorableUncased. -// 5..4 CCC: zero (normal or break), above or other -// } -// 3 exception: interpret this value as an exception index -// (TODO: is this bit necessary? Probably implied from case mode.) -// 2..0 case mode -// -// For the non-exceptional cases, a rune must be either uncased, lowercase or -// uppercase. If the rune is cased, the XOR pattern maps either a lowercase -// rune to uppercase or an uppercase rune to lowercase (applied to the 10 -// least-significant bits of the rune). -// -// See the definitions below for a more detailed description of the various -// bits. -type info uint16 - -const ( - casedMask = 0x0003 - fullCasedMask = 0x0007 - ignorableMask = 0x0006 - ignorableValue = 0x0004 - - inverseFoldBit = 1 << 7 - isMidBit = 1 << 6 - - exceptionBit = 1 << 3 - exceptionShift = 5 - numExceptionBits = 11 - - xorIndexBit = 1 << 6 - xorShift = 8 - - // There is no mapping if all xor bits and the exception bit are zero. - hasMappingMask = 0xff80 | exceptionBit -) - -// The case mode bits encodes the case type of a rune. This includes uncased, -// title, upper and lower case and case ignorable. (For a definition of these -// terms see Chapter 3 of The Unicode Standard Core Specification.) In some rare -// cases, a rune can be both cased and case-ignorable. This is encoded by -// cIgnorableCased. A rune of this type is always lower case. Some runes are -// cased while not having a mapping. -// -// A common pattern for scripts in the Unicode standard is for upper and lower -// case runes to alternate for increasing rune values (e.g. the accented Latin -// ranges starting from U+0100 and U+1E00 among others and some Cyrillic -// characters). We use this property by defining a cXORCase mode, where the case -// mode (always upper or lower case) is derived from the rune value. As the XOR -// pattern for case mappings is often identical for successive runes, using -// cXORCase can result in large series of identical trie values. This, in turn, -// allows us to better compress the trie blocks. -const ( - cUncased info = iota // 000 - cTitle // 001 - cLower // 010 - cUpper // 011 - cIgnorableUncased // 100 - cIgnorableCased // 101 // lower case if mappings exist - cXORCase // 11x // case is cLower | ((rune&1) ^ x) - - maxCaseMode = cUpper -) - -func (c info) isCased() bool { - return c&casedMask != 0 -} - -func (c info) isCaseIgnorable() bool { - return c&ignorableMask == ignorableValue -} - -func (c info) isNotCasedAndNotCaseIgnorable() bool { - return c&fullCasedMask == 0 -} - -func (c info) isCaseIgnorableAndNotCased() bool { - return c&fullCasedMask == cIgnorableUncased -} - -func (c info) isMid() bool { - return c&(fullCasedMask|isMidBit) == isMidBit|cIgnorableUncased -} - -// The case mapping implementation will need to know about various Canonical -// Combining Class (CCC) values. We encode two of these in the trie value: -// cccZero (0) and cccAbove (230). If the value is cccOther, it means that -// CCC(r) > 0, but not 230. A value of cccBreak means that CCC(r) == 0 and that -// the rune also has the break category Break (see below). -const ( - cccBreak info = iota << 4 - cccZero - cccAbove - cccOther - - cccMask = cccBreak | cccZero | cccAbove | cccOther -) - -const ( - starter = 0 - above = 230 - iotaSubscript = 240 -) - -// The exceptions slice holds data that does not fit in a normal info entry. -// The entry is pointed to by the exception index in an entry. It has the -// following format: -// -// Header -// byte 0: -// 7..6 unused -// 5..4 CCC type (same bits as entry) -// 3 unused -// 2..0 length of fold -// -// byte 1: -// 7..6 unused -// 5..3 length of 1st mapping of case type -// 2..0 length of 2nd mapping of case type -// -// case 1st 2nd -// lower -> upper, title -// upper -> lower, title -// title -> lower, upper -// -// Lengths with the value 0x7 indicate no value and implies no change. -// A length of 0 indicates a mapping to zero-length string. -// -// Body bytes: -// case folding bytes -// lowercase mapping bytes -// uppercase mapping bytes -// titlecase mapping bytes -// closure mapping bytes (for NFKC_Casefold). (TODO) -// -// Fallbacks: -// missing fold -> lower -// missing title -> upper -// all missing -> original rune -// -// exceptions starts with a dummy byte to enforce that there is no zero index -// value. -const ( - lengthMask = 0x07 - lengthBits = 3 - noChange = 0 -) - -// References to generated trie. - -var trie = newCaseTrie(0) - -var sparse = sparseBlocks{ - values: sparseValues[:], - offsets: sparseOffsets[:], -} - -// Sparse block lookup code. - -// valueRange is an entry in a sparse block. -type valueRange struct { - value uint16 - lo, hi byte -} - -type sparseBlocks struct { - values []valueRange - offsets []uint16 -} - -// lookup returns the value from values block n for byte b using binary search. -func (s *sparseBlocks) lookup(n uint32, b byte) uint16 { - lo := s.offsets[n] - hi := s.offsets[n+1] - for lo < hi { - m := lo + (hi-lo)/2 - r := s.values[m] - if r.lo <= b && b <= r.hi { - return r.value - } - if b < r.lo { - hi = m - } else { - lo = m + 1 - } - } - return 0 -} - -// lastRuneForTesting is the last rune used for testing. Everything after this -// is boring. -const lastRuneForTesting = rune(0x1FFFF) diff --git a/vendor/golang.org/x/text/cases/icu.go b/vendor/golang.org/x/text/cases/icu.go deleted file mode 100644 index 46530d1e4..000000000 --- a/vendor/golang.org/x/text/cases/icu.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build icu - -package cases - -// Ideally these functions would be defined in a test file, but go test doesn't -// allow CGO in tests. The build tag should ensure either way that these -// functions will not end up in the package. - -// TODO: Ensure that the correct ICU version is set. - -/* -#cgo LDFLAGS: -licui18n.57 -licuuc.57 -#include <stdlib.h> -#include <unicode/ustring.h> -#include <unicode/utypes.h> -#include <unicode/localpointer.h> -#include <unicode/ucasemap.h> -*/ -import "C" - -import "unsafe" - -func doICU(tag, caser, input string) string { - err := C.UErrorCode(0) - loc := C.CString(tag) - cm := C.ucasemap_open(loc, C.uint32_t(0), &err) - - buf := make([]byte, len(input)*4) - dst := (*C.char)(unsafe.Pointer(&buf[0])) - src := C.CString(input) - - cn := C.int32_t(0) - - switch caser { - case "fold": - cn = C.ucasemap_utf8FoldCase(cm, - dst, C.int32_t(len(buf)), - src, C.int32_t(len(input)), - &err) - case "lower": - cn = C.ucasemap_utf8ToLower(cm, - dst, C.int32_t(len(buf)), - src, C.int32_t(len(input)), - &err) - case "upper": - cn = C.ucasemap_utf8ToUpper(cm, - dst, C.int32_t(len(buf)), - src, C.int32_t(len(input)), - &err) - case "title": - cn = C.ucasemap_utf8ToTitle(cm, - dst, C.int32_t(len(buf)), - src, C.int32_t(len(input)), - &err) - } - return string(buf[:cn]) -} diff --git a/vendor/golang.org/x/text/cases/icu_test.go b/vendor/golang.org/x/text/cases/icu_test.go deleted file mode 100644 index 3d07e2588..000000000 --- a/vendor/golang.org/x/text/cases/icu_test.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build icu - -package cases - -import ( - "path" - "strings" - "testing" - - "golang.org/x/text/internal/testtext" - "golang.org/x/text/language" - "golang.org/x/text/unicode/norm" -) - -func TestICUConformance(t *testing.T) { - // Build test set. - input := []string{ - "a.a a_a", - "a\u05d0a", - "\u05d0'a", - "a\u03084a", - "a\u0308a", - "a3\u30a3a", - "a\u303aa", - "a_\u303a_a", - "1_a..a", - "1_a.a", - "a..a.", - "a--a-", - "a-a-", - "a\u200ba", - "a\u200b\u200ba", - "a\u00ad\u00ada", // Format - "a\u00ada", - "a''a", // SingleQuote - "a'a", - "a::a", // MidLetter - "a:a", - "a..a", // MidNumLet - "a.a", - "a;;a", // MidNum - "a;a", - "a__a", // ExtendNumlet - "a_a", - "ΟΣ''a", - } - add := func(x interface{}) { - switch v := x.(type) { - case string: - input = append(input, v) - case []string: - for _, s := range v { - input = append(input, s) - } - } - } - for _, tc := range testCases { - add(tc.src) - add(tc.lower) - add(tc.upper) - add(tc.title) - } - for _, tc := range bufferTests { - add(tc.src) - } - for _, tc := range breakTest { - add(strings.Replace(tc, "|", "", -1)) - } - for _, tc := range foldTestCases { - add(tc) - } - - // Compare ICU to Go. - for _, c := range []string{"lower", "upper", "title", "fold"} { - for _, tag := range []string{ - "und", "af", "az", "el", "lt", "nl", "tr", - } { - for _, s := range input { - if exclude(c, tag, s) { - continue - } - testtext.Run(t, path.Join(c, tag, s), func(t *testing.T) { - want := doICU(tag, c, s) - got := doGo(tag, c, s) - if norm.NFC.String(got) != norm.NFC.String(want) { - t.Errorf("\n in %[3]q (%+[3]q)\n got %[1]q (%+[1]q)\n want %[2]q (%+[2]q)", got, want, s) - } - }) - } - } - } -} - -// exclude indicates if a string should be excluded from testing. -func exclude(cm, tag, s string) bool { - list := []struct{ cm, tags, pattern string }{ - // TODO: Go does not handle certain esoteric breaks correctly. This will be - // fixed once we have a real word break iterator. Alternatively, it - // seems like we're not too far off from making it work, so we could - // fix these last steps. But first verify that using a separate word - // breaker does not hurt performance. - {"title", "af nl", "a''a"}, - {"", "", "א'a"}, - - // All the exclusions below seem to be issues with the ICU - // implementation (at version 57) and thus are not marked as TODO. - - // ICU does not handle leading apostrophe for Dutch and - // Afrikaans correctly. See http://unicode.org/cldr/trac/ticket/7078. - {"title", "af nl", "'n"}, - {"title", "af nl", "'N"}, - - // Go terminates the final sigma check after a fixed number of - // ignorables have been found. This ensures that the algorithm can make - // progress in a streaming scenario. - {"lower title", "", "\u039f\u03a3...............................a"}, - // This also applies to upper in Greek. - // NOTE: we could fix the following two cases by adding state to elUpper - // and aztrLower. However, considering a modifier to not belong to the - // preceding letter after the maximum modifiers count is reached is - // consistent with the behavior of unicode/norm. - {"upper", "el", "\u03bf" + strings.Repeat("\u0321", 29) + "\u0313"}, - {"lower", "az tr lt", "I" + strings.Repeat("\u0321", 30) + "\u0307\u0300"}, - {"upper", "lt", "i" + strings.Repeat("\u0321", 30) + "\u0307\u0300"}, - {"lower", "lt", "I" + strings.Repeat("\u0321", 30) + "\u0300"}, - - // ICU title case seems to erroneously removes \u0307 from an upper case - // I unconditionally, instead of only when lowercasing. The ICU - // transform algorithm transforms these cases consistently with our - // implementation. - {"title", "az tr", "\u0307"}, - - // The spec says to remove \u0307 after Soft-Dotted characters. ICU - // transforms conform but ucasemap_utf8ToUpper does not. - {"upper title", "lt", "i\u0307"}, - {"upper title", "lt", "i" + strings.Repeat("\u0321", 29) + "\u0307\u0300"}, - - // Both Unicode and CLDR prescribe an extra explicit dot above after a - // Soft_Dotted character if there are other modifiers. - // ucasemap_utf8ToUpper does not do this; ICU transforms do. - // The issue with ucasemap_utf8ToUpper seems to be that it does not - // consider the modifiers that are part of composition in the evaluation - // of More_Above. For instance, according to the More_Above rule for lt, - // a dotted capital I (U+0130) becomes i\u0307\u0307 (an small i with - // two additional dots). This seems odd, but is correct. ICU is - // definitely not correct as it produces different results for different - // normal forms. For instance, for an İ: - // \u0130 (NFC) -> i\u0307 (incorrect) - // I\u0307 (NFD) -> i\u0307\u0307 (correct) - // We could argue that we should not add a \u0307 if there already is - // one, but this may be hard to get correct and is not conform the - // standard. - {"lower title", "lt", "\u0130"}, - {"lower title", "lt", "\u00cf"}, - - // We are conform ICU ucasemap_utf8ToUpper if we remove support for - // elUpper. However, this is clearly not conform the spec. Moreover, the - // ICU transforms _do_ implement this transform and produces results - // consistent with our implementation. Note that we still prefer to use - // ucasemap_utf8ToUpper instead of transforms as the latter have - // inconsistencies in the word breaking algorithm. - {"upper", "el", "\u0386"}, // GREEK CAPITAL LETTER ALPHA WITH TONOS - {"upper", "el", "\u0389"}, // GREEK CAPITAL LETTER ETA WITH TONOS - {"upper", "el", "\u038A"}, // GREEK CAPITAL LETTER IOTA WITH TONOS - - {"upper", "el", "\u0391"}, // GREEK CAPITAL LETTER ALPHA - {"upper", "el", "\u0397"}, // GREEK CAPITAL LETTER ETA - {"upper", "el", "\u0399"}, // GREEK CAPITAL LETTER IOTA - - {"upper", "el", "\u03AC"}, // GREEK SMALL LETTER ALPHA WITH TONOS - {"upper", "el", "\u03AE"}, // GREEK SMALL LETTER ALPHA WITH ETA - {"upper", "el", "\u03AF"}, // GREEK SMALL LETTER ALPHA WITH IOTA - - {"upper", "el", "\u03B1"}, // GREEK SMALL LETTER ALPHA - {"upper", "el", "\u03B7"}, // GREEK SMALL LETTER ETA - {"upper", "el", "\u03B9"}, // GREEK SMALL LETTER IOTA - } - for _, x := range list { - if x.cm != "" && strings.Index(x.cm, cm) == -1 { - continue - } - if x.tags != "" && strings.Index(x.tags, tag) == -1 { - continue - } - if strings.Index(s, x.pattern) != -1 { - return true - } - } - return false -} - -func doGo(tag, caser, input string) string { - var c Caser - t := language.MustParse(tag) - switch caser { - case "lower": - c = Lower(t) - case "upper": - c = Upper(t) - case "title": - c = Title(t) - case "fold": - c = Fold() - } - return c.String(input) -} diff --git a/vendor/golang.org/x/text/cases/info.go b/vendor/golang.org/x/text/cases/info.go deleted file mode 100644 index 3b51f03d6..000000000 --- a/vendor/golang.org/x/text/cases/info.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cases - -func (c info) cccVal() info { - if c&exceptionBit != 0 { - return info(exceptions[c>>exceptionShift]) & cccMask - } - return c & cccMask -} - -func (c info) cccType() info { - ccc := c.cccVal() - if ccc <= cccZero { - return cccZero - } - return ccc -} - -// TODO: Implement full Unicode breaking algorithm: -// 1) Implement breaking in separate package. -// 2) Use the breaker here. -// 3) Compare table size and performance of using the more generic breaker. -// -// Note that we can extend the current algorithm to be much more accurate. This -// only makes sense, though, if the performance and/or space penalty of using -// the generic breaker is big. Extra data will only be needed for non-cased -// runes, which means there are sufficient bits left in the caseType. -// ICU prohibits breaking in such cases as well. - -// For the purpose of title casing we use an approximation of the Unicode Word -// Breaking algorithm defined in Annex #29: -// http://www.unicode.org/reports/tr29/#Default_Grapheme_Cluster_Table. -// -// For our approximation, we group the Word Break types into the following -// categories, with associated rules: -// -// 1) Letter: -// ALetter, Hebrew_Letter, Numeric, ExtendNumLet, Extend, Format_FE, ZWJ. -// Rule: Never break between consecutive runes of this category. -// -// 2) Mid: -// MidLetter, MidNumLet, Single_Quote. -// (Cf. case-ignorable: MidLetter, MidNumLet, Single_Quote or cat is Mn, -// Me, Cf, Lm or Sk). -// Rule: Don't break between Letter and Mid, but break between two Mids. -// -// 3) Break: -// Any other category: NewLine, MidNum, CR, LF, Double_Quote, Katakana, and -// Other. -// These categories should always result in a break between two cased letters. -// Rule: Always break. -// -// Note 1: the Katakana and MidNum categories can, in esoteric cases, result in -// preventing a break between two cased letters. For now we will ignore this -// (e.g. [ALetter] [ExtendNumLet] [Katakana] [ExtendNumLet] [ALetter] and -// [ALetter] [Numeric] [MidNum] [Numeric] [ALetter].) -// -// Note 2: the rule for Mid is very approximate, but works in most cases. To -// improve, we could store the categories in the trie value and use a FA to -// manage breaks. See TODO comment above. -// -// Note 3: according to the spec, it is possible for the Extend category to -// introduce breaks between other categories grouped in Letter. However, this -// is undesirable for our purposes. ICU prevents breaks in such cases as well. - -// isBreak returns whether this rune should introduce a break. -func (c info) isBreak() bool { - return c.cccVal() == cccBreak -} - -// isLetter returns whether the rune is of break type ALetter, Hebrew_Letter, -// Numeric, ExtendNumLet, or Extend. -func (c info) isLetter() bool { - ccc := c.cccVal() - if ccc == cccZero { - return !c.isCaseIgnorable() - } - return ccc != cccBreak -} diff --git a/vendor/golang.org/x/text/cases/map.go b/vendor/golang.org/x/text/cases/map.go deleted file mode 100644 index 4baebaaa6..000000000 --- a/vendor/golang.org/x/text/cases/map.go +++ /dev/null @@ -1,816 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cases - -// This file contains the definitions of case mappings for all supported -// languages. The rules for the language-specific tailorings were taken and -// modified from the CLDR transform definitions in common/transforms. - -import ( - "strings" - "unicode" - "unicode/utf8" - - "golang.org/x/text/internal" - "golang.org/x/text/language" - "golang.org/x/text/transform" - "golang.org/x/text/unicode/norm" -) - -// A mapFunc takes a context set to the current rune and writes the mapped -// version to the same context. It may advance the context to the next rune. It -// returns whether a checkpoint is possible: whether the pDst bytes written to -// dst so far won't need changing as we see more source bytes. -type mapFunc func(*context) bool - -// A spanFunc takes a context set to the current rune and returns whether this -// rune would be altered when written to the output. It may advance the context -// to the next rune. It returns whether a checkpoint is possible. -type spanFunc func(*context) bool - -// maxIgnorable defines the maximum number of ignorables to consider for -// lookahead operations. -const maxIgnorable = 30 - -// supported lists the language tags for which we have tailorings. -const supported = "und af az el lt nl tr" - -func init() { - tags := []language.Tag{} - for _, s := range strings.Split(supported, " ") { - tags = append(tags, language.MustParse(s)) - } - matcher = internal.NewInheritanceMatcher(tags) - Supported = language.NewCoverage(tags) -} - -var ( - matcher *internal.InheritanceMatcher - - Supported language.Coverage - - // We keep the following lists separate, instead of having a single per- - // language struct, to give the compiler a chance to remove unused code. - - // Some uppercase mappers are stateless, so we can precompute the - // Transformers and save a bit on runtime allocations. - upperFunc = []struct { - upper mapFunc - span spanFunc - }{ - {nil, nil}, // und - {nil, nil}, // af - {aztrUpper(upper), isUpper}, // az - {elUpper, noSpan}, // el - {ltUpper(upper), noSpan}, // lt - {nil, nil}, // nl - {aztrUpper(upper), isUpper}, // tr - } - - undUpper transform.SpanningTransformer = &undUpperCaser{} - undLower transform.SpanningTransformer = &undLowerCaser{} - undLowerIgnoreSigma transform.SpanningTransformer = &undLowerIgnoreSigmaCaser{} - - lowerFunc = []mapFunc{ - nil, // und - nil, // af - aztrLower, // az - nil, // el - ltLower, // lt - nil, // nl - aztrLower, // tr - } - - titleInfos = []struct { - title mapFunc - lower mapFunc - titleSpan spanFunc - rewrite func(*context) - }{ - {title, lower, isTitle, nil}, // und - {title, lower, isTitle, afnlRewrite}, // af - {aztrUpper(title), aztrLower, isTitle, nil}, // az - {title, lower, isTitle, nil}, // el - {ltUpper(title), ltLower, noSpan, nil}, // lt - {nlTitle, lower, nlTitleSpan, afnlRewrite}, // nl - {aztrUpper(title), aztrLower, isTitle, nil}, // tr - } -) - -func makeUpper(t language.Tag, o options) transform.SpanningTransformer { - _, i, _ := matcher.Match(t) - f := upperFunc[i].upper - if f == nil { - return undUpper - } - return &simpleCaser{f: f, span: upperFunc[i].span} -} - -func makeLower(t language.Tag, o options) transform.SpanningTransformer { - _, i, _ := matcher.Match(t) - f := lowerFunc[i] - if f == nil { - if o.ignoreFinalSigma { - return undLowerIgnoreSigma - } - return undLower - } - if o.ignoreFinalSigma { - return &simpleCaser{f: f, span: isLower} - } - return &lowerCaser{ - first: f, - midWord: finalSigma(f), - } -} - -func makeTitle(t language.Tag, o options) transform.SpanningTransformer { - _, i, _ := matcher.Match(t) - x := &titleInfos[i] - lower := x.lower - if o.noLower { - lower = (*context).copy - } else if !o.ignoreFinalSigma { - lower = finalSigma(lower) - } - return &titleCaser{ - title: x.title, - lower: lower, - titleSpan: x.titleSpan, - rewrite: x.rewrite, - } -} - -func noSpan(c *context) bool { - c.err = transform.ErrEndOfSpan - return false -} - -// TODO: consider a similar special case for the fast majority lower case. This -// is a bit more involved so will require some more precise benchmarking to -// justify it. - -type undUpperCaser struct{ transform.NopResetter } - -// undUpperCaser implements the Transformer interface for doing an upper case -// mapping for the root locale (und). It eliminates the need for an allocation -// as it prevents escaping by not using function pointers. -func (t undUpperCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - c := context{dst: dst, src: src, atEOF: atEOF} - for c.next() { - upper(&c) - c.checkpoint() - } - return c.ret() -} - -func (t undUpperCaser) Span(src []byte, atEOF bool) (n int, err error) { - c := context{src: src, atEOF: atEOF} - for c.next() && isUpper(&c) { - c.checkpoint() - } - return c.retSpan() -} - -// undLowerIgnoreSigmaCaser implements the Transformer interface for doing -// a lower case mapping for the root locale (und) ignoring final sigma -// handling. This casing algorithm is used in some performance-critical packages -// like secure/precis and x/net/http/idna, which warrants its special-casing. -type undLowerIgnoreSigmaCaser struct{ transform.NopResetter } - -func (t undLowerIgnoreSigmaCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - c := context{dst: dst, src: src, atEOF: atEOF} - for c.next() && lower(&c) { - c.checkpoint() - } - return c.ret() - -} - -// Span implements a generic lower-casing. This is possible as isLower works -// for all lowercasing variants. All lowercase variants only vary in how they -// transform a non-lowercase letter. They will never change an already lowercase -// letter. In addition, there is no state. -func (t undLowerIgnoreSigmaCaser) Span(src []byte, atEOF bool) (n int, err error) { - c := context{src: src, atEOF: atEOF} - for c.next() && isLower(&c) { - c.checkpoint() - } - return c.retSpan() -} - -type simpleCaser struct { - context - f mapFunc - span spanFunc -} - -// simpleCaser implements the Transformer interface for doing a case operation -// on a rune-by-rune basis. -func (t *simpleCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - c := context{dst: dst, src: src, atEOF: atEOF} - for c.next() && t.f(&c) { - c.checkpoint() - } - return c.ret() -} - -func (t *simpleCaser) Span(src []byte, atEOF bool) (n int, err error) { - c := context{src: src, atEOF: atEOF} - for c.next() && t.span(&c) { - c.checkpoint() - } - return c.retSpan() -} - -// undLowerCaser implements the Transformer interface for doing a lower case -// mapping for the root locale (und) ignoring final sigma handling. This casing -// algorithm is used in some performance-critical packages like secure/precis -// and x/net/http/idna, which warrants its special-casing. -type undLowerCaser struct{ transform.NopResetter } - -func (t undLowerCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - c := context{dst: dst, src: src, atEOF: atEOF} - - for isInterWord := true; c.next(); { - if isInterWord { - if c.info.isCased() { - if !lower(&c) { - break - } - isInterWord = false - } else if !c.copy() { - break - } - } else { - if c.info.isNotCasedAndNotCaseIgnorable() { - if !c.copy() { - break - } - isInterWord = true - } else if !c.hasPrefix("Σ") { - if !lower(&c) { - break - } - } else if !finalSigmaBody(&c) { - break - } - } - c.checkpoint() - } - return c.ret() -} - -func (t undLowerCaser) Span(src []byte, atEOF bool) (n int, err error) { - c := context{src: src, atEOF: atEOF} - for c.next() && isLower(&c) { - c.checkpoint() - } - return c.retSpan() -} - -// lowerCaser implements the Transformer interface. The default Unicode lower -// casing requires different treatment for the first and subsequent characters -// of a word, most notably to handle the Greek final Sigma. -type lowerCaser struct { - undLowerIgnoreSigmaCaser - - context - - first, midWord mapFunc -} - -func (t *lowerCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - t.context = context{dst: dst, src: src, atEOF: atEOF} - c := &t.context - - for isInterWord := true; c.next(); { - if isInterWord { - if c.info.isCased() { - if !t.first(c) { - break - } - isInterWord = false - } else if !c.copy() { - break - } - } else { - if c.info.isNotCasedAndNotCaseIgnorable() { - if !c.copy() { - break - } - isInterWord = true - } else if !t.midWord(c) { - break - } - } - c.checkpoint() - } - return c.ret() -} - -// titleCaser implements the Transformer interface. Title casing algorithms -// distinguish between the first letter of a word and subsequent letters of the -// same word. It uses state to avoid requiring a potentially infinite lookahead. -type titleCaser struct { - context - - // rune mappings used by the actual casing algorithms. - title mapFunc - lower mapFunc - titleSpan spanFunc - - rewrite func(*context) -} - -// Transform implements the standard Unicode title case algorithm as defined in -// Chapter 3 of The Unicode Standard: -// toTitlecase(X): Find the word boundaries in X according to Unicode Standard -// Annex #29, "Unicode Text Segmentation." For each word boundary, find the -// first cased character F following the word boundary. If F exists, map F to -// Titlecase_Mapping(F); then map all characters C between F and the following -// word boundary to Lowercase_Mapping(C). -func (t *titleCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - t.context = context{dst: dst, src: src, atEOF: atEOF, isMidWord: t.isMidWord} - c := &t.context - - if !c.next() { - return c.ret() - } - - for { - p := c.info - if t.rewrite != nil { - t.rewrite(c) - } - - wasMid := p.isMid() - // Break out of this loop on failure to ensure we do not modify the - // state incorrectly. - if p.isCased() { - if !c.isMidWord { - if !t.title(c) { - break - } - c.isMidWord = true - } else if !t.lower(c) { - break - } - } else if !c.copy() { - break - } else if p.isBreak() { - c.isMidWord = false - } - - // As we save the state of the transformer, it is safe to call - // checkpoint after any successful write. - if !(c.isMidWord && wasMid) { - c.checkpoint() - } - - if !c.next() { - break - } - if wasMid && c.info.isMid() { - c.isMidWord = false - } - } - return c.ret() -} - -func (t *titleCaser) Span(src []byte, atEOF bool) (n int, err error) { - t.context = context{src: src, atEOF: atEOF, isMidWord: t.isMidWord} - c := &t.context - - if !c.next() { - return c.retSpan() - } - - for { - p := c.info - if t.rewrite != nil { - t.rewrite(c) - } - - wasMid := p.isMid() - // Break out of this loop on failure to ensure we do not modify the - // state incorrectly. - if p.isCased() { - if !c.isMidWord { - if !t.titleSpan(c) { - break - } - c.isMidWord = true - } else if !isLower(c) { - break - } - } else if p.isBreak() { - c.isMidWord = false - } - // As we save the state of the transformer, it is safe to call - // checkpoint after any successful write. - if !(c.isMidWord && wasMid) { - c.checkpoint() - } - - if !c.next() { - break - } - if wasMid && c.info.isMid() { - c.isMidWord = false - } - } - return c.retSpan() -} - -// finalSigma adds Greek final Sigma handing to another casing function. It -// determines whether a lowercased sigma should be σ or ς, by looking ahead for -// case-ignorables and a cased letters. -func finalSigma(f mapFunc) mapFunc { - return func(c *context) bool { - if !c.hasPrefix("Σ") { - return f(c) - } - return finalSigmaBody(c) - } -} - -func finalSigmaBody(c *context) bool { - // Current rune must be ∑. - - // ::NFD(); - // # 03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA - // Σ } [:case-ignorable:]* [:cased:] → σ; - // [:cased:] [:case-ignorable:]* { Σ → ς; - // ::Any-Lower; - // ::NFC(); - - p := c.pDst - c.writeString("ς") - - // TODO: we should do this here, but right now this will never have an - // effect as this is called when the prefix is Sigma, whereas Dutch and - // Afrikaans only test for an apostrophe. - // - // if t.rewrite != nil { - // t.rewrite(c) - // } - - // We need to do one more iteration after maxIgnorable, as a cased - // letter is not an ignorable and may modify the result. - wasMid := false - for i := 0; i < maxIgnorable+1; i++ { - if !c.next() { - return false - } - if !c.info.isCaseIgnorable() { - // All Midword runes are also case ignorable, so we are - // guaranteed to have a letter or word break here. As we are - // unreading the run, there is no need to unset c.isMidWord; - // the title caser will handle this. - if c.info.isCased() { - // p+1 is guaranteed to be in bounds: if writing ς was - // successful, p+1 will contain the second byte of ς. If not, - // this function will have returned after c.next returned false. - c.dst[p+1]++ // ς → σ - } - c.unreadRune() - return true - } - // A case ignorable may also introduce a word break, so we may need - // to continue searching even after detecting a break. - isMid := c.info.isMid() - if (wasMid && isMid) || c.info.isBreak() { - c.isMidWord = false - } - wasMid = isMid - c.copy() - } - return true -} - -// finalSigmaSpan would be the same as isLower. - -// elUpper implements Greek upper casing, which entails removing a predefined -// set of non-blocked modifiers. Note that these accents should not be removed -// for title casing! -// Example: "Οδός" -> "ΟΔΟΣ". -func elUpper(c *context) bool { - // From CLDR: - // [:Greek:] [^[:ccc=Not_Reordered:][:ccc=Above:]]*? { [\u0313\u0314\u0301\u0300\u0306\u0342\u0308\u0304] → ; - // [:Greek:] [^[:ccc=Not_Reordered:][:ccc=Iota_Subscript:]]*? { \u0345 → ; - - r, _ := utf8.DecodeRune(c.src[c.pSrc:]) - oldPDst := c.pDst - if !upper(c) { - return false - } - if !unicode.Is(unicode.Greek, r) { - return true - } - i := 0 - // Take the properties of the uppercased rune that is already written to the - // destination. This saves us the trouble of having to uppercase the - // decomposed rune again. - if b := norm.NFD.Properties(c.dst[oldPDst:]).Decomposition(); b != nil { - // Restore the destination position and process the decomposed rune. - r, sz := utf8.DecodeRune(b) - if r <= 0xFF { // See A.6.1 - return true - } - c.pDst = oldPDst - // Insert the first rune and ignore the modifiers. See A.6.2. - c.writeBytes(b[:sz]) - i = len(b[sz:]) / 2 // Greek modifiers are always of length 2. - } - - for ; i < maxIgnorable && c.next(); i++ { - switch r, _ := utf8.DecodeRune(c.src[c.pSrc:]); r { - // Above and Iota Subscript - case 0x0300, // U+0300 COMBINING GRAVE ACCENT - 0x0301, // U+0301 COMBINING ACUTE ACCENT - 0x0304, // U+0304 COMBINING MACRON - 0x0306, // U+0306 COMBINING BREVE - 0x0308, // U+0308 COMBINING DIAERESIS - 0x0313, // U+0313 COMBINING COMMA ABOVE - 0x0314, // U+0314 COMBINING REVERSED COMMA ABOVE - 0x0342, // U+0342 COMBINING GREEK PERISPOMENI - 0x0345: // U+0345 COMBINING GREEK YPOGEGRAMMENI - // No-op. Gobble the modifier. - - default: - switch v, _ := trie.lookup(c.src[c.pSrc:]); info(v).cccType() { - case cccZero: - c.unreadRune() - return true - - // We don't need to test for IotaSubscript as the only rune that - // qualifies (U+0345) was already excluded in the switch statement - // above. See A.4. - - case cccAbove: - return c.copy() - default: - // Some other modifier. We're still allowed to gobble Greek - // modifiers after this. - c.copy() - } - } - } - return i == maxIgnorable -} - -// TODO: implement elUpperSpan (low-priority: complex and infrequent). - -func ltLower(c *context) bool { - // From CLDR: - // # Introduce an explicit dot above when lowercasing capital I's and J's - // # whenever there are more accents above. - // # (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek) - // # 0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I - // # 004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J - // # 012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK - // # 00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE - // # 00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE - // # 0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE - // ::NFD(); - // I } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → i \u0307; - // J } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → j \u0307; - // I \u0328 (Į) } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → i \u0328 \u0307; - // I \u0300 (Ì) → i \u0307 \u0300; - // I \u0301 (Í) → i \u0307 \u0301; - // I \u0303 (Ĩ) → i \u0307 \u0303; - // ::Any-Lower(); - // ::NFC(); - - i := 0 - if r := c.src[c.pSrc]; r < utf8.RuneSelf { - lower(c) - if r != 'I' && r != 'J' { - return true - } - } else { - p := norm.NFD.Properties(c.src[c.pSrc:]) - if d := p.Decomposition(); len(d) >= 3 && (d[0] == 'I' || d[0] == 'J') { - // UTF-8 optimization: the decomposition will only have an above - // modifier if the last rune of the decomposition is in [U+300-U+311]. - // In all other cases, a decomposition starting with I is always - // an I followed by modifiers that are not cased themselves. See A.2. - if d[1] == 0xCC && d[2] <= 0x91 { // A.2.4. - if !c.writeBytes(d[:1]) { - return false - } - c.dst[c.pDst-1] += 'a' - 'A' // lower - - // Assumption: modifier never changes on lowercase. See A.1. - // Assumption: all modifiers added have CCC = Above. See A.2.3. - return c.writeString("\u0307") && c.writeBytes(d[1:]) - } - // In all other cases the additional modifiers will have a CCC - // that is less than 230 (Above). We will insert the U+0307, if - // needed, after these modifiers so that a string in FCD form - // will remain so. See A.2.2. - lower(c) - i = 1 - } else { - return lower(c) - } - } - - for ; i < maxIgnorable && c.next(); i++ { - switch c.info.cccType() { - case cccZero: - c.unreadRune() - return true - case cccAbove: - return c.writeString("\u0307") && c.copy() // See A.1. - default: - c.copy() // See A.1. - } - } - return i == maxIgnorable -} - -// ltLowerSpan would be the same as isLower. - -func ltUpper(f mapFunc) mapFunc { - return func(c *context) bool { - // Unicode: - // 0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE - // - // From CLDR: - // # Remove \u0307 following soft-dotteds (i, j, and the like), with possible - // # intervening non-230 marks. - // ::NFD(); - // [:Soft_Dotted:] [^[:ccc=Not_Reordered:][:ccc=Above:]]* { \u0307 → ; - // ::Any-Upper(); - // ::NFC(); - - // TODO: See A.5. A soft-dotted rune never has an exception. This would - // allow us to overload the exception bit and encode this property in - // info. Need to measure performance impact of this. - r, _ := utf8.DecodeRune(c.src[c.pSrc:]) - oldPDst := c.pDst - if !f(c) { - return false - } - if !unicode.Is(unicode.Soft_Dotted, r) { - return true - } - - // We don't need to do an NFD normalization, as a soft-dotted rune never - // contains U+0307. See A.3. - - i := 0 - for ; i < maxIgnorable && c.next(); i++ { - switch c.info.cccType() { - case cccZero: - c.unreadRune() - return true - case cccAbove: - if c.hasPrefix("\u0307") { - // We don't do a full NFC, but rather combine runes for - // some of the common cases. (Returning NFC or - // preserving normal form is neither a requirement nor - // a possibility anyway). - if !c.next() { - return false - } - if c.dst[oldPDst] == 'I' && c.pDst == oldPDst+1 && c.src[c.pSrc] == 0xcc { - s := "" - switch c.src[c.pSrc+1] { - case 0x80: // U+0300 COMBINING GRAVE ACCENT - s = "\u00cc" // U+00CC LATIN CAPITAL LETTER I WITH GRAVE - case 0x81: // U+0301 COMBINING ACUTE ACCENT - s = "\u00cd" // U+00CD LATIN CAPITAL LETTER I WITH ACUTE - case 0x83: // U+0303 COMBINING TILDE - s = "\u0128" // U+0128 LATIN CAPITAL LETTER I WITH TILDE - case 0x88: // U+0308 COMBINING DIAERESIS - s = "\u00cf" // U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS - default: - } - if s != "" { - c.pDst = oldPDst - return c.writeString(s) - } - } - } - return c.copy() - default: - c.copy() - } - } - return i == maxIgnorable - } -} - -// TODO: implement ltUpperSpan (low priority: complex and infrequent). - -func aztrUpper(f mapFunc) mapFunc { - return func(c *context) bool { - // i→İ; - if c.src[c.pSrc] == 'i' { - return c.writeString("İ") - } - return f(c) - } -} - -func aztrLower(c *context) (done bool) { - // From CLDR: - // # I and i-dotless; I-dot and i are case pairs in Turkish and Azeri - // # 0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE - // İ→i; - // # When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. - // # This matches the behavior of the canonically equivalent I-dot_above - // # 0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE - // # When lowercasing, unless an I is before a dot_above, it turns into a dotless i. - // # 0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I - // I([^[:ccc=Not_Reordered:][:ccc=Above:]]*)\u0307 → i$1 ; - // I→ı ; - // ::Any-Lower(); - if c.hasPrefix("\u0130") { // İ - return c.writeString("i") - } - if c.src[c.pSrc] != 'I' { - return lower(c) - } - - // We ignore the lower-case I for now, but insert it later when we know - // which form we need. - start := c.pSrc + c.sz - - i := 0 -Loop: - // We check for up to n ignorables before \u0307. As \u0307 is an - // ignorable as well, n is maxIgnorable-1. - for ; i < maxIgnorable && c.next(); i++ { - switch c.info.cccType() { - case cccAbove: - if c.hasPrefix("\u0307") { - return c.writeString("i") && c.writeBytes(c.src[start:c.pSrc]) // ignore U+0307 - } - done = true - break Loop - case cccZero: - c.unreadRune() - done = true - break Loop - default: - // We'll write this rune after we know which starter to use. - } - } - if i == maxIgnorable { - done = true - } - return c.writeString("ı") && c.writeBytes(c.src[start:c.pSrc+c.sz]) && done -} - -// aztrLowerSpan would be the same as isLower. - -func nlTitle(c *context) bool { - // From CLDR: - // # Special titlecasing for Dutch initial "ij". - // ::Any-Title(); - // # Fix up Ij at the beginning of a "word" (per Any-Title, notUAX #29) - // [:^WB=ALetter:] [:WB=Extend:]* [[:WB=MidLetter:][:WB=MidNumLet:]]? { Ij } → IJ ; - if c.src[c.pSrc] != 'I' && c.src[c.pSrc] != 'i' { - return title(c) - } - - if !c.writeString("I") || !c.next() { - return false - } - if c.src[c.pSrc] == 'j' || c.src[c.pSrc] == 'J' { - return c.writeString("J") - } - c.unreadRune() - return true -} - -func nlTitleSpan(c *context) bool { - // From CLDR: - // # Special titlecasing for Dutch initial "ij". - // ::Any-Title(); - // # Fix up Ij at the beginning of a "word" (per Any-Title, notUAX #29) - // [:^WB=ALetter:] [:WB=Extend:]* [[:WB=MidLetter:][:WB=MidNumLet:]]? { Ij } → IJ ; - if c.src[c.pSrc] != 'I' { - return isTitle(c) - } - if !c.next() || c.src[c.pSrc] == 'j' { - return false - } - if c.src[c.pSrc] != 'J' { - c.unreadRune() - } - return true -} - -// Not part of CLDR, but see http://unicode.org/cldr/trac/ticket/7078. -func afnlRewrite(c *context) { - if c.hasPrefix("'") || c.hasPrefix("’") { - c.isMidWord = true - } -} diff --git a/vendor/golang.org/x/text/cases/map_test.go b/vendor/golang.org/x/text/cases/map_test.go deleted file mode 100644 index 8ac39118d..000000000 --- a/vendor/golang.org/x/text/cases/map_test.go +++ /dev/null @@ -1,950 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cases - -import ( - "bytes" - "fmt" - "path" - "strings" - "testing" - "unicode/utf8" - - "golang.org/x/text/internal/testtext" - "golang.org/x/text/language" - "golang.org/x/text/transform" - "golang.org/x/text/unicode/norm" -) - -type testCase struct { - lang string - src interface{} // string, []string, or nil to skip test - title interface{} // string, []string, or nil to skip test - lower interface{} // string, []string, or nil to skip test - upper interface{} // string, []string, or nil to skip test - opts options -} - -var testCases = []testCase{ - 0: { - lang: "und", - src: "abc aBc ABC abC İsıI ΕΣΆΣ", - title: "Abc Abc Abc Abc İsıi Εσάσ", - lower: "abc abc abc abc i\u0307sıi εσάσ", - upper: "ABC ABC ABC ABC İSII ΕΣΆΣ", - opts: getOpts(HandleFinalSigma(false)), - }, - - 1: { - lang: "und", - src: "abc aBc ABC abC İsıI ΕΣΆΣ Σ _Σ -Σ", - title: "Abc Abc Abc Abc İsıi Εσάς Σ _Σ -Σ", - lower: "abc abc abc abc i\u0307sıi εσάς σ _σ -σ", - upper: "ABC ABC ABC ABC İSII ΕΣΆΣ Σ _Σ -Σ", - opts: getOpts(HandleFinalSigma(true)), - }, - - 2: { // Title cased runes. - lang: supported, - src: "DžA", - title: "Dža", - lower: "dža", - upper: "DŽA", - }, - - 3: { - // Title breaking. - lang: supported, - src: []string{ - "FOO CASE TEST", - "DON'T DO THiS", - "χωΡΊΣ χωΡΊΣ^a χωΡΊΣ:a χωΡΊΣ:^a χωΡΊΣ^ όμΩΣ Σ", - "with-hyphens", - "49ers 49ers", - `"capitalize a^a -hyphen 0X _u a_u:a`, - "MidNumLet a.b\u2018c\u2019d\u2024e\ufe52f\uff07f\uff0eg", - "MidNum a,b;c\u037ed\u0589e\u060cf\u2044g\ufe50h", - "\u0345 x\u3031x x\u05d0x \u05d0x a'.a a.a a4,a", - }, - title: []string{ - "Foo Case Test", - "Don't Do This", - "Χωρίς Χωρίσ^A Χωρίσ:a Χωρίσ:^A Χωρίς^ Όμως Σ", - "With-Hyphens", - // Note that 49Ers is correct according to the spec. - // TODO: provide some option to the user to treat different - // characters as cased. - "49Ers 49Ers", - `"Capitalize A^A -Hyphen 0X _U A_u:a`, - "Midnumlet A.b\u2018c\u2019d\u2024e\ufe52f\uff07f\uff0eg", - "Midnum A,B;C\u037eD\u0589E\u060cF\u2044G\ufe50H", - "\u0399 X\u3031X X\u05d0x \u05d0X A'.A A.a A4,A", - }, - }, - - // TODO: These are known deviations from the options{} Unicode Word Breaking - // Algorithm. - // { - // "und", - // "x_\u3031_x a4,4a", - // "X_\u3031_x A4,4a", // Currently is "X_\U3031_X A4,4A". - // "x_\u3031_x a4,4a", - // "X_\u3031_X A4,4A", - // options{}, - // }, - - 4: { - // Tests title options - lang: "und", - src: "abc aBc ABC abC İsıI o'Brien", - title: "Abc ABc ABC AbC İsıI O'Brien", - opts: getOpts(NoLower), - }, - - 5: { - lang: "el", - src: "aBc ΟΔΌΣ Οδός Σο ΣΟ Σ oΣ ΟΣ σ ἕξ \u03ac", - title: "Abc Οδός Οδός Σο Σο Σ Oς Ος Σ Ἕξ \u0386", - lower: "abc οδός οδός σο σο σ oς ος σ ἕξ \u03ac", - upper: "ABC ΟΔΟΣ ΟΔΟΣ ΣΟ ΣΟ Σ OΣ ΟΣ Σ ΕΞ \u0391", // Uppercase removes accents - }, - - 6: { - lang: "tr az", - src: "Isiİ İsıI I\u0307sIiİ İsıI\u0307 I\u0300\u0307", - title: "Isii İsıı I\u0307sıii İsıi I\u0300\u0307", - lower: "ısii isıı isıii isıi \u0131\u0300\u0307", - upper: "ISİİ İSII I\u0307SIİİ İSII\u0307 I\u0300\u0307", - }, - - 7: { - lang: "lt", - src: "I Ï J J̈ Į Į̈ Ì Í Ĩ xi̇̈ xj̇̈ xį̇̈ xi̇̀ xi̇́ xi̇̃ XI XÏ XJ XJ̈ XĮ XĮ̈ XI̟̤", - title: "I Ï J J̈ Į Į̈ Ì Í Ĩ Xi̇̈ Xj̇̈ Xį̇̈ Xi̇̀ Xi̇́ Xi̇̃ Xi Xi̇̈ Xj Xj̇̈ Xį Xį̇̈ Xi̟̤", - lower: "i i̇̈ j j̇̈ į į̇̈ i̇̀ i̇́ i̇̃ xi̇̈ xj̇̈ xį̇̈ xi̇̀ xi̇́ xi̇̃ xi xi̇̈ xj xj̇̈ xį xį̇̈ xi̟̤", - upper: "I Ï J J̈ Į Į̈ Ì Í Ĩ XÏ XJ̈ XĮ̈ XÌ XÍ XĨ XI XÏ XJ XJ̈ XĮ XĮ̈ XI̟̤", - }, - - 8: { - lang: "lt", - src: "\u012e\u0300 \u00cc i\u0307\u0300 i\u0307\u0301 i\u0307\u0303 i\u0307\u0308 i\u0300\u0307", - title: "\u012e\u0300 \u00cc \u00cc \u00cd \u0128 \u00cf I\u0300\u0307", - lower: "\u012f\u0307\u0300 i\u0307\u0300 i\u0307\u0300 i\u0307\u0301 i\u0307\u0303 i\u0307\u0308 i\u0300\u0307", - upper: "\u012e\u0300 \u00cc \u00cc \u00cd \u0128 \u00cf I\u0300\u0307", - }, - - 9: { - lang: "nl", - src: "ijs IJs Ij Ijs İJ İJs aa aA 'ns 'S", - title: "IJs IJs IJ IJs İj İjs Aa Aa 'ns 's", - }, - - // Note: this specification is not currently part of CLDR. The same holds - // for the leading apostrophe handling for Dutch. - // See http://unicode.org/cldr/trac/ticket/7078. - 10: { - lang: "af", - src: "wag 'n bietjie", - title: "Wag 'n Bietjie", - lower: "wag 'n bietjie", - upper: "WAG 'N BIETJIE", - }, -} - -func TestCaseMappings(t *testing.T) { - for i, tt := range testCases { - src, ok := tt.src.([]string) - if !ok { - src = strings.Split(tt.src.(string), " ") - } - - for _, lang := range strings.Split(tt.lang, " ") { - tag := language.MustParse(lang) - testEntry := func(name string, mk func(language.Tag, options) transform.SpanningTransformer, gold interface{}) { - c := Caser{mk(tag, tt.opts)} - if gold != nil { - wants, ok := gold.([]string) - if !ok { - wants = strings.Split(gold.(string), " ") - } - for j, want := range wants { - if got := c.String(src[j]); got != want { - t.Errorf("%d:%s:\n%s.String(%+q):\ngot %+q;\nwant %+q", i, lang, name, src[j], got, want) - } - } - } - dst := make([]byte, 256) // big enough to hold any result - src := []byte(strings.Join(src, " ")) - v := testtext.AllocsPerRun(20, func() { - c.Transform(dst, src, true) - }) - if v > 1.1 { - t.Errorf("%d:%s:\n%s: number of allocs was %f; want 0", i, lang, name, v) - } - } - testEntry("Upper", makeUpper, tt.upper) - testEntry("Lower", makeLower, tt.lower) - testEntry("Title", makeTitle, tt.title) - } - } -} - -// TestAlloc tests that some mapping methods should not cause any allocation. -func TestAlloc(t *testing.T) { - dst := make([]byte, 256) // big enough to hold any result - src := []byte(txtNonASCII) - - for i, f := range []func() Caser{ - func() Caser { return Upper(language.Und) }, - func() Caser { return Lower(language.Und) }, - func() Caser { return Lower(language.Und, HandleFinalSigma(false)) }, - // TODO: use a shared copy for these casers as well, in order of - // importance, starting with the most important: - // func() Caser { return Title(language.Und) }, - // func() Caser { return Title(language.Und, HandleFinalSigma(false)) }, - } { - testtext.Run(t, "", func(t *testing.T) { - var c Caser - v := testtext.AllocsPerRun(10, func() { - c = f() - }) - if v > 0 { - // TODO: Right now only Upper has 1 allocation. Special-case Lower - // and Title as well to have less allocations for the root locale. - t.Errorf("%d:init: number of allocs was %f; want 0", i, v) - } - v = testtext.AllocsPerRun(2, func() { - c.Transform(dst, src, true) - }) - if v > 0 { - t.Errorf("%d:transform: number of allocs was %f; want 0", i, v) - } - }) - } -} - -func testHandover(t *testing.T, c Caser, src string) { - want := c.String(src) - // Find the common prefix. - pSrc := 0 - for ; pSrc < len(src) && pSrc < len(want) && want[pSrc] == src[pSrc]; pSrc++ { - } - - // Test handover for each substring of the prefix. - for i := 0; i < pSrc; i++ { - testtext.Run(t, fmt.Sprint("interleave/", i), func(t *testing.T) { - dst := make([]byte, 4*len(src)) - c.Reset() - nSpan, _ := c.Span([]byte(src[:i]), false) - copy(dst, src[:nSpan]) - nTransform, _, _ := c.Transform(dst[nSpan:], []byte(src[nSpan:]), true) - got := string(dst[:nSpan+nTransform]) - if got != want { - t.Errorf("full string: got %q; want %q", got, want) - } - }) - } -} - -func TestHandover(t *testing.T) { - testCases := []struct { - desc string - t Caser - first, second string - }{{ - "title/nosigma/single midword", - Title(language.Und, HandleFinalSigma(false)), - "A.", "a", - }, { - "title/nosigma/single midword", - Title(language.Und, HandleFinalSigma(false)), - "A", ".a", - }, { - "title/nosigma/double midword", - Title(language.Und, HandleFinalSigma(false)), - "A..", "a", - }, { - "title/nosigma/double midword", - Title(language.Und, HandleFinalSigma(false)), - "A.", ".a", - }, { - "title/nosigma/double midword", - Title(language.Und, HandleFinalSigma(false)), - "A", "..a", - }, { - "title/sigma/single midword", - Title(language.Und), - "ΟΣ.", "a", - }, { - "title/sigma/single midword", - Title(language.Und), - "ΟΣ", ".a", - }, { - "title/sigma/double midword", - Title(language.Und), - "ΟΣ..", "a", - }, { - "title/sigma/double midword", - Title(language.Und), - "ΟΣ.", ".a", - }, { - "title/sigma/double midword", - Title(language.Und), - "ΟΣ", "..a", - }, { - "title/af/leading apostrophe", - Title(language.Afrikaans), - "'", "n bietje", - }} - for _, tc := range testCases { - testtext.Run(t, tc.desc, func(t *testing.T) { - src := tc.first + tc.second - want := tc.t.String(src) - tc.t.Reset() - n, _ := tc.t.Span([]byte(tc.first), false) - - dst := make([]byte, len(want)) - copy(dst, tc.first[:n]) - - nDst, _, _ := tc.t.Transform(dst[n:], []byte(src[n:]), true) - got := string(dst[:n+nDst]) - if got != want { - t.Errorf("got %q; want %q", got, want) - } - }) - } -} - -// minBufSize is the size of the buffer by which the casing operation in -// this package are guaranteed to make progress. -const minBufSize = norm.MaxSegmentSize - -type bufferTest struct { - desc, src, want string - firstErr error - dstSize, srcSize int - t transform.SpanningTransformer -} - -var bufferTests []bufferTest - -func init() { - bufferTests = []bufferTest{{ - desc: "und/upper/short dst", - src: "abcdefg", - want: "ABCDEFG", - firstErr: transform.ErrShortDst, - dstSize: 3, - srcSize: minBufSize, - t: Upper(language.Und), - }, { - desc: "und/upper/short src", - src: "123é56", - want: "123É56", - firstErr: transform.ErrShortSrc, - dstSize: 4, - srcSize: 4, - t: Upper(language.Und), - }, { - desc: "und/upper/no error on short", - src: "12", - want: "12", - firstErr: nil, - dstSize: 1, - srcSize: 1, - t: Upper(language.Und), - }, { - desc: "und/lower/short dst", - src: "ABCDEFG", - want: "abcdefg", - firstErr: transform.ErrShortDst, - dstSize: 3, - srcSize: minBufSize, - t: Lower(language.Und), - }, { - desc: "und/lower/short src", - src: "123É56", - want: "123é56", - firstErr: transform.ErrShortSrc, - dstSize: 4, - srcSize: 4, - t: Lower(language.Und), - }, { - desc: "und/lower/no error on short", - src: "12", - want: "12", - firstErr: nil, - dstSize: 1, - srcSize: 1, - t: Lower(language.Und), - }, { - desc: "und/lower/simple (no final sigma)", - src: "ΟΣ ΟΣΣ", - want: "οσ οσσ", - dstSize: minBufSize, - srcSize: minBufSize, - t: Lower(language.Und, HandleFinalSigma(false)), - }, { - desc: "und/title/simple (no final sigma)", - src: "ΟΣ ΟΣΣ", - want: "Οσ Οσσ", - dstSize: minBufSize, - srcSize: minBufSize, - t: Title(language.Und, HandleFinalSigma(false)), - }, { - desc: "und/title/final sigma: no error", - src: "ΟΣ", - want: "Ος", - dstSize: minBufSize, - srcSize: minBufSize, - t: Title(language.Und), - }, { - desc: "und/title/final sigma: short source", - src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ", - want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς", - firstErr: transform.ErrShortSrc, - dstSize: minBufSize, - srcSize: 10, - t: Title(language.Und), - }, { - desc: "und/title/final sigma: short destination 1", - src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ", - want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς", - firstErr: transform.ErrShortDst, - dstSize: 10, - srcSize: minBufSize, - t: Title(language.Und), - }, { - desc: "und/title/final sigma: short destination 2", - src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ", - want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς", - firstErr: transform.ErrShortDst, - dstSize: 9, - srcSize: minBufSize, - t: Title(language.Und), - }, { - desc: "und/title/final sigma: short destination 3", - src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ", - want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς", - firstErr: transform.ErrShortDst, - dstSize: 8, - srcSize: minBufSize, - t: Title(language.Und), - }, { - desc: "und/title/clipped UTF-8 rune", - src: "σσσσσσσσσσσ", - want: "Σσσσσσσσσσσ", - firstErr: transform.ErrShortSrc, - dstSize: minBufSize, - srcSize: 5, - t: Title(language.Und), - }, { - desc: "und/title/clipped UTF-8 rune atEOF", - src: "σσσ" + string([]byte{0xCF}), - want: "Σσσ" + string([]byte{0xCF}), - dstSize: minBufSize, - srcSize: minBufSize, - t: Title(language.Und), - }, { - // Note: the choice to change the final sigma at the end in case of - // too many case ignorables is arbitrary. The main reason for this - // choice is that it results in simpler code. - desc: "und/title/final sigma: max ignorables", - src: "ΟΣ" + strings.Repeat(".", maxIgnorable) + "a", - want: "Οσ" + strings.Repeat(".", maxIgnorable) + "A", - dstSize: minBufSize, - srcSize: minBufSize, - t: Title(language.Und), - }, { - // Note: the choice to change the final sigma at the end in case of - // too many case ignorables is arbitrary. The main reason for this - // choice is that it results in simpler code. - desc: "und/title/long string", - src: "AA" + strings.Repeat(".", maxIgnorable+1) + "a", - want: "Aa" + strings.Repeat(".", maxIgnorable+1) + "A", - dstSize: minBufSize, - srcSize: len("AA" + strings.Repeat(".", maxIgnorable+1)), - t: Title(language.Und), - }, { - // Note: the choice to change the final sigma at the end in case of - // too many case ignorables is arbitrary. The main reason for this - // choice is that it results in simpler code. - desc: "und/title/final sigma: too many ignorables", - src: "ΟΣ" + strings.Repeat(".", maxIgnorable+1) + "a", - want: "Ος" + strings.Repeat(".", maxIgnorable+1) + "A", - dstSize: minBufSize, - srcSize: len("ΟΣ" + strings.Repeat(".", maxIgnorable+1)), - t: Title(language.Und), - }, { - desc: "und/title/final sigma: apostrophe", - src: "ΟΣ''a", - want: "Οσ''A", - dstSize: minBufSize, - srcSize: minBufSize, - t: Title(language.Und), - }, { - desc: "el/upper/max ignorables", - src: "ο" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0313", - want: "Ο" + strings.Repeat("\u0321", maxIgnorable-1), - dstSize: minBufSize, - srcSize: minBufSize, - t: Upper(language.Greek), - }, { - desc: "el/upper/too many ignorables", - src: "ο" + strings.Repeat("\u0321", maxIgnorable) + "\u0313", - want: "Ο" + strings.Repeat("\u0321", maxIgnorable) + "\u0313", - dstSize: minBufSize, - srcSize: len("ο" + strings.Repeat("\u0321", maxIgnorable)), - t: Upper(language.Greek), - }, { - desc: "el/upper/short dst", - src: "123ο", - want: "123Ο", - firstErr: transform.ErrShortDst, - dstSize: 3, - srcSize: minBufSize, - t: Upper(language.Greek), - }, { - desc: "lt/lower/max ignorables", - src: "I" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0300", - want: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300", - dstSize: minBufSize, - srcSize: minBufSize, - t: Lower(language.Lithuanian), - }, { - desc: "lt/lower/too many ignorables", - src: "I" + strings.Repeat("\u0321", maxIgnorable) + "\u0300", - want: "i" + strings.Repeat("\u0321", maxIgnorable) + "\u0300", - dstSize: minBufSize, - srcSize: len("I" + strings.Repeat("\u0321", maxIgnorable)), - t: Lower(language.Lithuanian), - }, { - desc: "lt/lower/decomposition with short dst buffer 1", - src: "aaaaa\u00cc", // U+00CC LATIN CAPITAL LETTER I GRAVE - firstErr: transform.ErrShortDst, - want: "aaaaai\u0307\u0300", - dstSize: 5, - srcSize: minBufSize, - t: Lower(language.Lithuanian), - }, { - desc: "lt/lower/decomposition with short dst buffer 2", - src: "aaaa\u00cc", // U+00CC LATIN CAPITAL LETTER I GRAVE - firstErr: transform.ErrShortDst, - want: "aaaai\u0307\u0300", - dstSize: 5, - srcSize: minBufSize, - t: Lower(language.Lithuanian), - }, { - desc: "lt/upper/max ignorables", - src: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300", - want: "I" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0300", - dstSize: minBufSize, - srcSize: minBufSize, - t: Upper(language.Lithuanian), - }, { - desc: "lt/upper/too many ignorables", - src: "i" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300", - want: "I" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300", - dstSize: minBufSize, - srcSize: len("i" + strings.Repeat("\u0321", maxIgnorable)), - t: Upper(language.Lithuanian), - }, { - desc: "lt/upper/short dst", - src: "12i\u0307\u0300", - want: "12\u00cc", - firstErr: transform.ErrShortDst, - dstSize: 3, - srcSize: minBufSize, - t: Upper(language.Lithuanian), - }, { - desc: "aztr/lower/max ignorables", - src: "I" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300", - want: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0300", - dstSize: minBufSize, - srcSize: minBufSize, - t: Lower(language.Turkish), - }, { - desc: "aztr/lower/too many ignorables", - src: "I" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300", - want: "\u0131" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300", - dstSize: minBufSize, - srcSize: len("I" + strings.Repeat("\u0321", maxIgnorable)), - t: Lower(language.Turkish), - }, { - desc: "nl/title/pre-IJ cutoff", - src: " ij", - want: " IJ", - firstErr: transform.ErrShortDst, - dstSize: 2, - srcSize: minBufSize, - t: Title(language.Dutch), - }, { - desc: "nl/title/mid-IJ cutoff", - src: " ij", - want: " IJ", - firstErr: transform.ErrShortDst, - dstSize: 3, - srcSize: minBufSize, - t: Title(language.Dutch), - }, { - desc: "af/title/apostrophe", - src: "'n bietje", - want: "'n Bietje", - firstErr: transform.ErrShortDst, - dstSize: 3, - srcSize: minBufSize, - t: Title(language.Afrikaans), - }} -} - -func TestShortBuffersAndOverflow(t *testing.T) { - for i, tt := range bufferTests { - testtext.Run(t, tt.desc, func(t *testing.T) { - buf := make([]byte, tt.dstSize) - got := []byte{} - var nSrc, nDst int - var err error - for p := 0; p < len(tt.src); p += nSrc { - q := p + tt.srcSize - if q > len(tt.src) { - q = len(tt.src) - } - nDst, nSrc, err = tt.t.Transform(buf, []byte(tt.src[p:q]), q == len(tt.src)) - got = append(got, buf[:nDst]...) - - if p == 0 && err != tt.firstErr { - t.Errorf("%d:%s:\n error was %v; want %v", i, tt.desc, err, tt.firstErr) - break - } - } - if string(got) != tt.want { - t.Errorf("%d:%s:\ngot %+q;\nwant %+q", i, tt.desc, got, tt.want) - } - testHandover(t, Caser{tt.t}, tt.src) - }) - } -} - -func TestSpan(t *testing.T) { - for _, tt := range []struct { - desc string - src string - want string - atEOF bool - err error - t Caser - }{{ - desc: "und/upper/basic", - src: "abcdefg", - want: "", - atEOF: true, - err: transform.ErrEndOfSpan, - t: Upper(language.Und), - }, { - desc: "und/upper/short src", - src: "123É"[:4], - want: "123", - atEOF: false, - err: transform.ErrShortSrc, - t: Upper(language.Und), - }, { - desc: "und/upper/no error on short", - src: "12", - want: "12", - atEOF: false, - t: Upper(language.Und), - }, { - desc: "und/lower/basic", - src: "ABCDEFG", - want: "", - atEOF: true, - err: transform.ErrEndOfSpan, - t: Lower(language.Und), - }, { - desc: "und/lower/short src num", - src: "123é"[:4], - want: "123", - atEOF: false, - err: transform.ErrShortSrc, - t: Lower(language.Und), - }, { - desc: "und/lower/short src greek", - src: "αβγé"[:7], - want: "αβγ", - atEOF: false, - err: transform.ErrShortSrc, - t: Lower(language.Und), - }, { - desc: "und/lower/no error on short", - src: "12", - want: "12", - atEOF: false, - t: Lower(language.Und), - }, { - desc: "und/lower/simple (no final sigma)", - src: "ος οσσ", - want: "οσ οσσ", - atEOF: true, - t: Lower(language.Und, HandleFinalSigma(false)), - }, { - desc: "und/title/simple (no final sigma)", - src: "Οσ Οσσ", - want: "Οσ Οσσ", - atEOF: true, - t: Title(language.Und, HandleFinalSigma(false)), - }, { - desc: "und/lower/final sigma: no error", - src: "οΣ", // Oς - want: "ο", // Oς - err: transform.ErrEndOfSpan, - t: Lower(language.Und), - }, { - desc: "und/title/final sigma: no error", - src: "ΟΣ", // Oς - want: "Ο", // Oς - err: transform.ErrEndOfSpan, - t: Title(language.Und), - }, { - desc: "und/title/final sigma: no short source!", - src: "ΟσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσΣ", - want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσ", - err: transform.ErrEndOfSpan, - t: Title(language.Und), - }, { - desc: "und/title/clipped UTF-8 rune", - src: "Σσ" + string([]byte{0xCF}), - want: "Σσ", - atEOF: false, - err: transform.ErrShortSrc, - t: Title(language.Und), - }, { - desc: "und/title/clipped UTF-8 rune atEOF", - src: "Σσσ" + string([]byte{0xCF}), - want: "Σσσ" + string([]byte{0xCF}), - atEOF: true, - t: Title(language.Und), - }, { - // Note: the choice to change the final sigma at the end in case of - // too many case ignorables is arbitrary. The main reason for this - // choice is that it results in simpler code. - desc: "und/title/long string", - src: "A" + strings.Repeat("a", maxIgnorable+5), - want: "A" + strings.Repeat("a", maxIgnorable+5), - t: Title(language.Und), - }, { - // Note: the choice to change the final sigma at the end in case of - // too many case ignorables is arbitrary. The main reason for this - // choice is that it results in simpler code. - desc: "und/title/cyrillic", - src: "При", - want: "При", - atEOF: true, - t: Title(language.Und, HandleFinalSigma(false)), - }, { - // Note: the choice to change the final sigma at the end in case of - // too many case ignorables is arbitrary. The main reason for this - // choice is that it results in simpler code. - desc: "und/title/final sigma: max ignorables", - src: "Οσ" + strings.Repeat(".", maxIgnorable) + "A", - want: "Οσ" + strings.Repeat(".", maxIgnorable) + "A", - t: Title(language.Und), - }, { - desc: "el/upper/max ignorables - not implemented", - src: "Ο" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0313", - want: "", - err: transform.ErrEndOfSpan, - t: Upper(language.Greek), - }, { - desc: "el/upper/too many ignorables - not implemented", - src: "Ο" + strings.Repeat("\u0321", maxIgnorable) + "\u0313", - want: "", - err: transform.ErrEndOfSpan, - t: Upper(language.Greek), - }, { - desc: "el/upper/short dst", - src: "123ο", - want: "", - err: transform.ErrEndOfSpan, - t: Upper(language.Greek), - }, { - desc: "lt/lower/max ignorables", - src: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300", - want: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300", - t: Lower(language.Lithuanian), - }, { - desc: "lt/lower/isLower", - src: "I" + strings.Repeat("\u0321", maxIgnorable) + "\u0300", - want: "", - err: transform.ErrEndOfSpan, - t: Lower(language.Lithuanian), - }, { - desc: "lt/lower/not identical", - src: "aaaaa\u00cc", // U+00CC LATIN CAPITAL LETTER I GRAVE - err: transform.ErrEndOfSpan, - want: "aaaaa", - t: Lower(language.Lithuanian), - }, { - desc: "lt/lower/identical", - src: "aaaai\u0307\u0300", // U+00CC LATIN CAPITAL LETTER I GRAVE - want: "aaaai\u0307\u0300", - t: Lower(language.Lithuanian), - }, { - desc: "lt/upper/not implemented", - src: "I" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0300", - want: "", - err: transform.ErrEndOfSpan, - t: Upper(language.Lithuanian), - }, { - desc: "lt/upper/not implemented, ascii", - src: "AB", - want: "", - err: transform.ErrEndOfSpan, - t: Upper(language.Lithuanian), - }, { - desc: "nl/title/pre-IJ cutoff", - src: " IJ", - want: " IJ", - t: Title(language.Dutch), - }, { - desc: "nl/title/mid-IJ cutoff", - src: " Ia", - want: " Ia", - t: Title(language.Dutch), - }, { - desc: "af/title/apostrophe", - src: "'n Bietje", - want: "'n Bietje", - t: Title(language.Afrikaans), - }, { - desc: "af/title/apostrophe-incorrect", - src: "'N Bietje", - // The Single_Quote (a MidWord), needs to be retained as unspanned so - // that a successive call to Transform can detect that N should not be - // capitalized. - want: "", - err: transform.ErrEndOfSpan, - t: Title(language.Afrikaans), - }} { - testtext.Run(t, tt.desc, func(t *testing.T) { - for p := 0; p < len(tt.want); p += utf8.RuneLen([]rune(tt.src[p:])[0]) { - tt.t.Reset() - n, err := tt.t.Span([]byte(tt.src[:p]), false) - if err != nil && err != transform.ErrShortSrc { - t.Errorf("early failure:Span(%+q): %v (%d < %d)", tt.src[:p], err, n, len(tt.want)) - break - } - } - tt.t.Reset() - n, err := tt.t.Span([]byte(tt.src), tt.atEOF) - if n != len(tt.want) || err != tt.err { - t.Errorf("Span(%+q, %v): got %d, %v; want %d, %v", tt.src, tt.atEOF, n, err, len(tt.want), tt.err) - } - testHandover(t, tt.t, tt.src) - }) - } -} - -var txtASCII = strings.Repeat("The quick brown fox jumps over the lazy dog. ", 50) - -// Taken from http://creativecommons.org/licenses/by-sa/3.0/vn/ -const txt_vn = `Với các điều kiện sau: Ghi nhận công của tác giả. Nếu bạn sử -dụng, chuyển đổi, hoặc xây dựng dự án từ nội dung được chia sẻ này, bạn phải áp -dụng giấy phép này hoặc một giấy phép khác có các điều khoản tương tự như giấy -phép này cho dự án của bạn. Hiểu rằng: Miễn — Bất kỳ các điều kiện nào trên đây -cũng có thể được miễn bỏ nếu bạn được sự cho phép của người sở hữu bản quyền. -Phạm vi công chúng — Khi tác phẩm hoặc bất kỳ chương nào của tác phẩm đã trong -vùng dành cho công chúng theo quy định của pháp luật thì tình trạng của nó không -bị ảnh hưởng bởi giấy phép trong bất kỳ trường hợp nào.` - -// http://creativecommons.org/licenses/by-sa/2.5/cn/ -const txt_cn = `您可以自由: 复制、发行、展览、表演、放映、 -广播或通过信息网络传播本作品 创作演绎作品 -对本作品进行商业性使用 惟须遵守下列条件: -署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。 -相同方式共享 — 如果您改变、转换本作品或者以本作品为基础进行创作, -您只能采用与本协议相同的许可协议发布基于本作品的演绎作品。` - -// Taken from http://creativecommons.org/licenses/by-sa/1.0/deed.ru -const txt_ru = `При обязательном соблюдении следующих условий: Attribution — Вы -должны атрибутировать произведение (указывать автора и источник) в порядке, -предусмотренном автором или лицензиаром (но только так, чтобы никоим образом не -подразумевалось, что они поддерживают вас или использование вами данного -произведения). Υπό τις ακόλουθες προϋποθέσεις:` - -// Taken from http://creativecommons.org/licenses/by-sa/3.0/gr/ -const txt_gr = `Αναφορά Δημιουργού — Θα πρέπει να κάνετε την αναφορά στο έργο με -τον τρόπο που έχει οριστεί από το δημιουργό ή το χορηγούντο την άδεια (χωρίς -όμως να εννοείται με οποιονδήποτε τρόπο ότι εγκρίνουν εσάς ή τη χρήση του έργου -από εσάς). Παρόμοια Διανομή — Εάν αλλοιώσετε, τροποποιήσετε ή δημιουργήσετε -περαιτέρω βασισμένοι στο έργο θα μπορείτε να διανέμετε το έργο που θα προκύψει -μόνο με την ίδια ή παρόμοια άδεια.` - -const txtNonASCII = txt_vn + txt_cn + txt_ru + txt_gr - -// TODO: Improve ASCII performance. - -func BenchmarkCasers(b *testing.B) { - for _, s := range []struct{ name, text string }{ - {"ascii", txtASCII}, - {"nonASCII", txtNonASCII}, - {"short", "При"}, - } { - src := []byte(s.text) - // Measure case mappings in bytes package for comparison. - for _, f := range []struct { - name string - fn func(b []byte) []byte - }{ - {"lower", bytes.ToLower}, - {"title", bytes.ToTitle}, - {"upper", bytes.ToUpper}, - } { - testtext.Bench(b, path.Join(s.name, "bytes", f.name), func(b *testing.B) { - b.SetBytes(int64(len(src))) - for i := 0; i < b.N; i++ { - f.fn(src) - } - }) - } - for _, t := range []struct { - name string - caser transform.SpanningTransformer - }{ - {"fold/default", Fold()}, - {"upper/default", Upper(language.Und)}, - {"lower/sigma", Lower(language.Und)}, - {"lower/simple", Lower(language.Und, HandleFinalSigma(false))}, - {"title/sigma", Title(language.Und)}, - {"title/simple", Title(language.Und, HandleFinalSigma(false))}, - } { - c := Caser{t.caser} - dst := make([]byte, len(src)) - testtext.Bench(b, path.Join(s.name, t.name, "transform"), func(b *testing.B) { - b.SetBytes(int64(len(src))) - for i := 0; i < b.N; i++ { - c.Reset() - c.Transform(dst, src, true) - } - }) - // No need to check span for simple cases, as they will be the same - // as sigma. - if strings.HasSuffix(t.name, "/simple") { - continue - } - spanSrc := c.Bytes(src) - testtext.Bench(b, path.Join(s.name, t.name, "span"), func(b *testing.B) { - c.Reset() - if n, _ := c.Span(spanSrc, true); n < len(spanSrc) { - b.Fatalf("spanner is not recognizing text %q as done (at %d)", spanSrc, n) - } - b.SetBytes(int64(len(spanSrc))) - for i := 0; i < b.N; i++ { - c.Reset() - c.Span(spanSrc, true) - } - }) - } - } -} diff --git a/vendor/golang.org/x/text/cases/tables.go b/vendor/golang.org/x/text/cases/tables.go deleted file mode 100644 index e6e95a685..000000000 --- a/vendor/golang.org/x/text/cases/tables.go +++ /dev/null @@ -1,2211 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package cases - -// UnicodeVersion is the Unicode version from which the tables in this package are derived. -const UnicodeVersion = "9.0.0" - -var xorData string = "" + // Size: 185 bytes - "\x00\x06\x07\x00\x01?\x00\x0f\x03\x00\x0f\x12\x00\x0f\x1f\x00\x0f\x1d" + - "\x00\x01\x13\x00\x0f\x16\x00\x0f\x0b\x00\x0f3\x00\x0f7\x00\x01#\x00\x0f?" + - "\x00\x0e'\x00\x0f/\x00\x0e>\x00\x0f*\x00\x0c&\x00\x0c*\x00\x0c;\x00\x0c9" + - "\x00\x0c%\x00\x01\x08\x00\x03\x0d\x00\x03\x09\x00\x02\x06\x00\x02\x02" + - "\x00\x02\x0c\x00\x01\x00\x00\x01\x03\x00\x01\x01\x00\x01 \x00\x01\x0c" + - "\x00\x01\x10\x00\x03\x10\x00\x036 \x00\x037 \x00\x0b#\x10\x00\x0b 0\x00" + - "\x0b!\x10\x00\x0b!0\x00\x0b(\x04\x00\x03\x04\x1e\x00\x03\x0a\x00\x02:" + - "\x00\x02>\x00\x02,\x00\x02\x00\x00\x02\x10\x00\x01<\x00\x01&\x00\x01*" + - "\x00\x01.\x00\x010\x003 \x00\x01\x18\x00\x01(\x00\x01\x1e\x00\x01\x22" - -var exceptions string = "" + // Size: 1852 bytes - "\x00\x12\x10μΜ\x12\x12ssSSSs\x13\x18i̇i̇\x10\x08I\x13\x18ʼnʼN\x11\x08sS" + - "\x12\x12dždžDž\x12\x12dždžDŽ\x10\x12DŽDž\x12\x12ljljLj\x12\x12ljljLJ\x10\x12LJLj\x12\x12" + - "njnjNj\x12\x12njnjNJ\x10\x12NJNj\x13\x18ǰJ̌\x12\x12dzdzDz\x12\x12dzdzDZ\x10\x12DZDz" + - "\x13\x18ⱥⱥ\x13\x18ⱦⱦ\x10\x18Ȿ\x10\x18Ɀ\x10\x18Ɐ\x10\x18Ɑ\x10\x18Ɒ\x10" + - "\x18Ɜ\x10\x18Ɡ\x10\x18Ɥ\x10\x18Ɦ\x10\x18Ɪ\x10\x18Ɫ\x10\x18Ɬ\x10\x18Ɱ\x10" + - "\x18Ɽ\x10\x18Ʇ\x10\x18Ʝ\x10\x18Ʞ2\x10ιΙ\x160ΐΪ́\x160ΰΫ́\x12\x10σΣ" + - "\x12\x10βΒ\x12\x10θΘ\x12\x10φΦ\x12\x10πΠ\x12\x10κΚ\x12\x10ρΡ\x12\x10εΕ" + - "\x14$եւԵՒԵւ\x12\x10вВ\x12\x10дД\x12\x10оО\x12\x10сС\x12\x10тТ\x12\x10тТ" + - "\x12\x10ъЪ\x12\x10ѣѢ\x13\x18ꙋꙊ\x13\x18ẖH̱\x13\x18ẗT̈\x13\x18ẘW̊\x13" + - "\x18ẙY̊\x13\x18aʾAʾ\x13\x18ṡṠ\x12\x10ssß\x14 ὐΥ̓\x160ὒΥ̓̀\x160ὔΥ̓́" + - "\x160ὖΥ̓͂\x15+ἀιἈΙᾈ\x15+ἁιἉΙᾉ\x15+ἂιἊΙᾊ\x15+ἃιἋΙᾋ\x15+ἄιἌΙᾌ\x15+ἅιἍΙᾍ" + - "\x15+ἆιἎΙᾎ\x15+ἇιἏΙᾏ\x15\x1dἀιᾀἈΙ\x15\x1dἁιᾁἉΙ\x15\x1dἂιᾂἊΙ\x15\x1dἃιᾃἋΙ" + - "\x15\x1dἄιᾄἌΙ\x15\x1dἅιᾅἍΙ\x15\x1dἆιᾆἎΙ\x15\x1dἇιᾇἏΙ\x15+ἠιἨΙᾘ\x15+ἡιἩΙᾙ" + - "\x15+ἢιἪΙᾚ\x15+ἣιἫΙᾛ\x15+ἤιἬΙᾜ\x15+ἥιἭΙᾝ\x15+ἦιἮΙᾞ\x15+ἧιἯΙᾟ\x15\x1dἠιᾐἨ" + - "Ι\x15\x1dἡιᾑἩΙ\x15\x1dἢιᾒἪΙ\x15\x1dἣιᾓἫΙ\x15\x1dἤιᾔἬΙ\x15\x1dἥιᾕἭΙ\x15" + - "\x1dἦιᾖἮΙ\x15\x1dἧιᾗἯΙ\x15+ὠιὨΙᾨ\x15+ὡιὩΙᾩ\x15+ὢιὪΙᾪ\x15+ὣιὫΙᾫ\x15+ὤιὬΙᾬ" + - "\x15+ὥιὭΙᾭ\x15+ὦιὮΙᾮ\x15+ὧιὯΙᾯ\x15\x1dὠιᾠὨΙ\x15\x1dὡιᾡὩΙ\x15\x1dὢιᾢὪΙ" + - "\x15\x1dὣιᾣὫΙ\x15\x1dὤιᾤὬΙ\x15\x1dὥιᾥὭΙ\x15\x1dὦιᾦὮΙ\x15\x1dὧιᾧὯΙ\x15-ὰι" + - "ᾺΙᾺͅ\x14#αιΑΙᾼ\x14$άιΆΙΆͅ\x14 ᾶΑ͂\x166ᾶιΑ͂Ιᾼ͂\x14\x1cαιᾳΑΙ\x12\x10ι" + - "Ι\x15-ὴιῊΙῊͅ\x14#ηιΗΙῌ\x14$ήιΉΙΉͅ\x14 ῆΗ͂\x166ῆιΗ͂Ιῌ͂\x14\x1cηιῃΗΙ" + - "\x160ῒΪ̀\x160ΐΪ́\x14 ῖΙ͂\x160ῗΪ͂\x160ῢΫ̀\x160ΰΫ́\x14 ῤΡ" + - "̓\x14 ῦΥ͂\x160ῧΫ͂\x15-ὼιῺΙῺͅ\x14#ωιΩΙῼ\x14$ώιΏΙΏͅ\x14 ῶΩ͂\x166ῶιΩ" + - "͂Ιῼ͂\x14\x1cωιῳΩΙ\x12\x10ωω\x11\x08kk\x12\x10åå\x12\x10ɫɫ\x12\x10ɽɽ" + - "\x10\x10Ⱥ\x10\x10Ⱦ\x12\x10ɑɑ\x12\x10ɱɱ\x12\x10ɐɐ\x12\x10ɒɒ\x12\x10ȿȿ\x12" + - "\x10ɀɀ\x12\x10ɥɥ\x12\x10ɦɦ\x12\x10ɜɜ\x12\x10ɡɡ\x12\x10ɬɬ\x12\x10ɪɪ\x12" + - "\x10ʞʞ\x12\x10ʇʇ\x12\x10ʝʝ\x12\x12ffFFFf\x12\x12fiFIFi\x12\x12flFLFl\x13" + - "\x1bffiFFIFfi\x13\x1bfflFFLFfl\x12\x12stSTSt\x12\x12stSTSt\x14$մնՄՆՄն" + - "\x14$մեՄԵՄե\x14$միՄԻՄի\x14$վնՎՆՎն\x14$մխՄԽՄխ" - -// lookup returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *caseTrie) lookup(s []byte) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return caseValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := caseIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := caseIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = caseIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := caseIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = caseIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = caseIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *caseTrie) lookupUnsafe(s []byte) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return caseValues[c0] - } - i := caseIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = caseIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = caseIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// lookupString returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *caseTrie) lookupString(s string) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return caseValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := caseIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := caseIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = caseIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := caseIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = caseIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = caseIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *caseTrie) lookupStringUnsafe(s string) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return caseValues[c0] - } - i := caseIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = caseIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = caseIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// caseTrie. Total size: 11742 bytes (11.47 KiB). Checksum: 147a11466b427436. -type caseTrie struct{} - -func newCaseTrie(i int) *caseTrie { - return &caseTrie{} -} - -// lookupValue determines the type of block n and looks up the value for b. -func (t *caseTrie) lookupValue(n uint32, b byte) uint16 { - switch { - case n < 18: - return uint16(caseValues[n<<6+uint32(b)]) - default: - n -= 18 - return uint16(sparse.lookup(n, b)) - } -} - -// caseValues: 20 blocks, 1280 entries, 2560 bytes -// The third block is the zero block. -var caseValues = [1280]uint16{ - // Block 0x0, offset 0x0 - 0x27: 0x0054, - 0x2e: 0x0054, - 0x30: 0x0010, 0x31: 0x0010, 0x32: 0x0010, 0x33: 0x0010, 0x34: 0x0010, 0x35: 0x0010, - 0x36: 0x0010, 0x37: 0x0010, 0x38: 0x0010, 0x39: 0x0010, 0x3a: 0x0054, - // Block 0x1, offset 0x40 - 0x41: 0x2013, 0x42: 0x2013, 0x43: 0x2013, 0x44: 0x2013, 0x45: 0x2013, - 0x46: 0x2013, 0x47: 0x2013, 0x48: 0x2013, 0x49: 0x2013, 0x4a: 0x2013, 0x4b: 0x2013, - 0x4c: 0x2013, 0x4d: 0x2013, 0x4e: 0x2013, 0x4f: 0x2013, 0x50: 0x2013, 0x51: 0x2013, - 0x52: 0x2013, 0x53: 0x2013, 0x54: 0x2013, 0x55: 0x2013, 0x56: 0x2013, 0x57: 0x2013, - 0x58: 0x2013, 0x59: 0x2013, 0x5a: 0x2013, - 0x5e: 0x0004, 0x5f: 0x0010, 0x60: 0x0004, 0x61: 0x2012, 0x62: 0x2012, 0x63: 0x2012, - 0x64: 0x2012, 0x65: 0x2012, 0x66: 0x2012, 0x67: 0x2012, 0x68: 0x2012, 0x69: 0x2012, - 0x6a: 0x2012, 0x6b: 0x2012, 0x6c: 0x2012, 0x6d: 0x2012, 0x6e: 0x2012, 0x6f: 0x2012, - 0x70: 0x2012, 0x71: 0x2012, 0x72: 0x2012, 0x73: 0x2012, 0x74: 0x2012, 0x75: 0x2012, - 0x76: 0x2012, 0x77: 0x2012, 0x78: 0x2012, 0x79: 0x2012, 0x7a: 0x2012, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc0: 0x0852, 0xc1: 0x0b53, 0xc2: 0x0113, 0xc3: 0x0112, 0xc4: 0x0113, 0xc5: 0x0112, - 0xc6: 0x0b53, 0xc7: 0x0f13, 0xc8: 0x0f12, 0xc9: 0x0e53, 0xca: 0x1153, 0xcb: 0x0713, - 0xcc: 0x0712, 0xcd: 0x0012, 0xce: 0x1453, 0xcf: 0x1753, 0xd0: 0x1a53, 0xd1: 0x0313, - 0xd2: 0x0312, 0xd3: 0x1d53, 0xd4: 0x2053, 0xd5: 0x2352, 0xd6: 0x2653, 0xd7: 0x2653, - 0xd8: 0x0113, 0xd9: 0x0112, 0xda: 0x2952, 0xdb: 0x0012, 0xdc: 0x1d53, 0xdd: 0x2c53, - 0xde: 0x2f52, 0xdf: 0x3253, 0xe0: 0x0113, 0xe1: 0x0112, 0xe2: 0x0113, 0xe3: 0x0112, - 0xe4: 0x0113, 0xe5: 0x0112, 0xe6: 0x3553, 0xe7: 0x0f13, 0xe8: 0x0f12, 0xe9: 0x3853, - 0xea: 0x0012, 0xeb: 0x0012, 0xec: 0x0113, 0xed: 0x0112, 0xee: 0x3553, 0xef: 0x1f13, - 0xf0: 0x1f12, 0xf1: 0x3b53, 0xf2: 0x3e53, 0xf3: 0x0713, 0xf4: 0x0712, 0xf5: 0x0313, - 0xf6: 0x0312, 0xf7: 0x4153, 0xf8: 0x0113, 0xf9: 0x0112, 0xfa: 0x0012, 0xfb: 0x0010, - 0xfc: 0x0113, 0xfd: 0x0112, 0xfe: 0x0012, 0xff: 0x4452, - // Block 0x4, offset 0x100 - 0x100: 0x0010, 0x101: 0x0010, 0x102: 0x0010, 0x103: 0x0010, 0x104: 0x04cb, 0x105: 0x05c9, - 0x106: 0x06ca, 0x107: 0x078b, 0x108: 0x0889, 0x109: 0x098a, 0x10a: 0x0a4b, 0x10b: 0x0b49, - 0x10c: 0x0c4a, 0x10d: 0x0313, 0x10e: 0x0312, 0x10f: 0x1f13, 0x110: 0x1f12, 0x111: 0x0313, - 0x112: 0x0312, 0x113: 0x0713, 0x114: 0x0712, 0x115: 0x0313, 0x116: 0x0312, 0x117: 0x0f13, - 0x118: 0x0f12, 0x119: 0x0313, 0x11a: 0x0312, 0x11b: 0x0713, 0x11c: 0x0712, 0x11d: 0x1452, - 0x11e: 0x0113, 0x11f: 0x0112, 0x120: 0x0113, 0x121: 0x0112, 0x122: 0x0113, 0x123: 0x0112, - 0x124: 0x0113, 0x125: 0x0112, 0x126: 0x0113, 0x127: 0x0112, 0x128: 0x0113, 0x129: 0x0112, - 0x12a: 0x0113, 0x12b: 0x0112, 0x12c: 0x0113, 0x12d: 0x0112, 0x12e: 0x0113, 0x12f: 0x0112, - 0x130: 0x0d0a, 0x131: 0x0e0b, 0x132: 0x0f09, 0x133: 0x100a, 0x134: 0x0113, 0x135: 0x0112, - 0x136: 0x2353, 0x137: 0x4453, 0x138: 0x0113, 0x139: 0x0112, 0x13a: 0x0113, 0x13b: 0x0112, - 0x13c: 0x0113, 0x13d: 0x0112, 0x13e: 0x0113, 0x13f: 0x0112, - // Block 0x5, offset 0x140 - 0x140: 0x136a, 0x141: 0x0313, 0x142: 0x0312, 0x143: 0x0853, 0x144: 0x4753, 0x145: 0x4a53, - 0x146: 0x0113, 0x147: 0x0112, 0x148: 0x0113, 0x149: 0x0112, 0x14a: 0x0113, 0x14b: 0x0112, - 0x14c: 0x0113, 0x14d: 0x0112, 0x14e: 0x0113, 0x14f: 0x0112, 0x150: 0x140a, 0x151: 0x14aa, - 0x152: 0x154a, 0x153: 0x0b52, 0x154: 0x0b52, 0x155: 0x0012, 0x156: 0x0e52, 0x157: 0x1152, - 0x158: 0x0012, 0x159: 0x1752, 0x15a: 0x0012, 0x15b: 0x1a52, 0x15c: 0x15ea, 0x15d: 0x0012, - 0x15e: 0x0012, 0x15f: 0x0012, 0x160: 0x1d52, 0x161: 0x168a, 0x162: 0x0012, 0x163: 0x2052, - 0x164: 0x0012, 0x165: 0x172a, 0x166: 0x17ca, 0x167: 0x0012, 0x168: 0x2652, 0x169: 0x2652, - 0x16a: 0x186a, 0x16b: 0x190a, 0x16c: 0x19aa, 0x16d: 0x0012, 0x16e: 0x0012, 0x16f: 0x1d52, - 0x170: 0x0012, 0x171: 0x1a4a, 0x172: 0x2c52, 0x173: 0x0012, 0x174: 0x0012, 0x175: 0x3252, - 0x176: 0x0012, 0x177: 0x0012, 0x178: 0x0012, 0x179: 0x0012, 0x17a: 0x0012, 0x17b: 0x0012, - 0x17c: 0x0012, 0x17d: 0x1aea, 0x17e: 0x0012, 0x17f: 0x0012, - // Block 0x6, offset 0x180 - 0x180: 0x3552, 0x181: 0x0012, 0x182: 0x0012, 0x183: 0x3852, 0x184: 0x0012, 0x185: 0x0012, - 0x186: 0x0012, 0x187: 0x1b8a, 0x188: 0x3552, 0x189: 0x4752, 0x18a: 0x3b52, 0x18b: 0x3e52, - 0x18c: 0x4a52, 0x18d: 0x0012, 0x18e: 0x0012, 0x18f: 0x0012, 0x190: 0x0012, 0x191: 0x0012, - 0x192: 0x4152, 0x193: 0x0012, 0x194: 0x0010, 0x195: 0x0012, 0x196: 0x0012, 0x197: 0x0012, - 0x198: 0x0012, 0x199: 0x0012, 0x19a: 0x0012, 0x19b: 0x0012, 0x19c: 0x0012, 0x19d: 0x1c2a, - 0x19e: 0x1cca, 0x19f: 0x0012, 0x1a0: 0x0012, 0x1a1: 0x0012, 0x1a2: 0x0012, 0x1a3: 0x0012, - 0x1a4: 0x0012, 0x1a5: 0x0012, 0x1a6: 0x0012, 0x1a7: 0x0012, 0x1a8: 0x0012, 0x1a9: 0x0012, - 0x1aa: 0x0012, 0x1ab: 0x0012, 0x1ac: 0x0012, 0x1ad: 0x0012, 0x1ae: 0x0012, 0x1af: 0x0012, - 0x1b0: 0x0015, 0x1b1: 0x0015, 0x1b2: 0x0015, 0x1b3: 0x0015, 0x1b4: 0x0015, 0x1b5: 0x0015, - 0x1b6: 0x0015, 0x1b7: 0x0015, 0x1b8: 0x0015, 0x1b9: 0x0014, 0x1ba: 0x0014, 0x1bb: 0x0014, - 0x1bc: 0x0014, 0x1bd: 0x0014, 0x1be: 0x0014, 0x1bf: 0x0014, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x0024, 0x1c1: 0x0024, 0x1c2: 0x0024, 0x1c3: 0x0024, 0x1c4: 0x0024, 0x1c5: 0x1d6d, - 0x1c6: 0x0024, 0x1c7: 0x0034, 0x1c8: 0x0034, 0x1c9: 0x0034, 0x1ca: 0x0024, 0x1cb: 0x0024, - 0x1cc: 0x0024, 0x1cd: 0x0034, 0x1ce: 0x0034, 0x1cf: 0x0014, 0x1d0: 0x0024, 0x1d1: 0x0024, - 0x1d2: 0x0024, 0x1d3: 0x0034, 0x1d4: 0x0034, 0x1d5: 0x0034, 0x1d6: 0x0034, 0x1d7: 0x0024, - 0x1d8: 0x0034, 0x1d9: 0x0034, 0x1da: 0x0034, 0x1db: 0x0024, 0x1dc: 0x0034, 0x1dd: 0x0034, - 0x1de: 0x0034, 0x1df: 0x0034, 0x1e0: 0x0034, 0x1e1: 0x0034, 0x1e2: 0x0034, 0x1e3: 0x0024, - 0x1e4: 0x0024, 0x1e5: 0x0024, 0x1e6: 0x0024, 0x1e7: 0x0024, 0x1e8: 0x0024, 0x1e9: 0x0024, - 0x1ea: 0x0024, 0x1eb: 0x0024, 0x1ec: 0x0024, 0x1ed: 0x0024, 0x1ee: 0x0024, 0x1ef: 0x0024, - 0x1f0: 0x0113, 0x1f1: 0x0112, 0x1f2: 0x0113, 0x1f3: 0x0112, 0x1f4: 0x0014, 0x1f5: 0x0004, - 0x1f6: 0x0113, 0x1f7: 0x0112, 0x1fa: 0x0015, 0x1fb: 0x4d52, - 0x1fc: 0x5052, 0x1fd: 0x5052, 0x1ff: 0x5353, - // Block 0x8, offset 0x200 - 0x204: 0x0004, 0x205: 0x0004, - 0x206: 0x2a13, 0x207: 0x0054, 0x208: 0x2513, 0x209: 0x2713, 0x20a: 0x2513, - 0x20c: 0x5653, 0x20e: 0x5953, 0x20f: 0x5c53, 0x210: 0x1e2a, 0x211: 0x2013, - 0x212: 0x2013, 0x213: 0x2013, 0x214: 0x2013, 0x215: 0x2013, 0x216: 0x2013, 0x217: 0x2013, - 0x218: 0x2013, 0x219: 0x2013, 0x21a: 0x2013, 0x21b: 0x2013, 0x21c: 0x2013, 0x21d: 0x2013, - 0x21e: 0x2013, 0x21f: 0x2013, 0x220: 0x5f53, 0x221: 0x5f53, 0x223: 0x5f53, - 0x224: 0x5f53, 0x225: 0x5f53, 0x226: 0x5f53, 0x227: 0x5f53, 0x228: 0x5f53, 0x229: 0x5f53, - 0x22a: 0x5f53, 0x22b: 0x5f53, 0x22c: 0x2a12, 0x22d: 0x2512, 0x22e: 0x2712, 0x22f: 0x2512, - 0x230: 0x1fea, 0x231: 0x2012, 0x232: 0x2012, 0x233: 0x2012, 0x234: 0x2012, 0x235: 0x2012, - 0x236: 0x2012, 0x237: 0x2012, 0x238: 0x2012, 0x239: 0x2012, 0x23a: 0x2012, 0x23b: 0x2012, - 0x23c: 0x2012, 0x23d: 0x2012, 0x23e: 0x2012, 0x23f: 0x2012, - // Block 0x9, offset 0x240 - 0x240: 0x5f52, 0x241: 0x5f52, 0x242: 0x21aa, 0x243: 0x5f52, 0x244: 0x5f52, 0x245: 0x5f52, - 0x246: 0x5f52, 0x247: 0x5f52, 0x248: 0x5f52, 0x249: 0x5f52, 0x24a: 0x5f52, 0x24b: 0x5f52, - 0x24c: 0x5652, 0x24d: 0x5952, 0x24e: 0x5c52, 0x24f: 0x1813, 0x250: 0x226a, 0x251: 0x232a, - 0x252: 0x0013, 0x253: 0x0013, 0x254: 0x0013, 0x255: 0x23ea, 0x256: 0x24aa, 0x257: 0x1812, - 0x258: 0x0113, 0x259: 0x0112, 0x25a: 0x0113, 0x25b: 0x0112, 0x25c: 0x0113, 0x25d: 0x0112, - 0x25e: 0x0113, 0x25f: 0x0112, 0x260: 0x0113, 0x261: 0x0112, 0x262: 0x0113, 0x263: 0x0112, - 0x264: 0x0113, 0x265: 0x0112, 0x266: 0x0113, 0x267: 0x0112, 0x268: 0x0113, 0x269: 0x0112, - 0x26a: 0x0113, 0x26b: 0x0112, 0x26c: 0x0113, 0x26d: 0x0112, 0x26e: 0x0113, 0x26f: 0x0112, - 0x270: 0x256a, 0x271: 0x262a, 0x272: 0x0b12, 0x273: 0x5352, 0x274: 0x6253, 0x275: 0x26ea, - 0x277: 0x0f13, 0x278: 0x0f12, 0x279: 0x0b13, 0x27a: 0x0113, 0x27b: 0x0112, - 0x27c: 0x0012, 0x27d: 0x4d53, 0x27e: 0x5053, 0x27f: 0x5053, - // Block 0xa, offset 0x280 - 0x280: 0x0812, 0x281: 0x0812, 0x282: 0x0812, 0x283: 0x0812, 0x284: 0x0812, 0x285: 0x0812, - 0x288: 0x0813, 0x289: 0x0813, 0x28a: 0x0813, 0x28b: 0x0813, - 0x28c: 0x0813, 0x28d: 0x0813, 0x290: 0x372a, 0x291: 0x0812, - 0x292: 0x386a, 0x293: 0x0812, 0x294: 0x3a2a, 0x295: 0x0812, 0x296: 0x3bea, 0x297: 0x0812, - 0x299: 0x0813, 0x29b: 0x0813, 0x29d: 0x0813, - 0x29f: 0x0813, 0x2a0: 0x0812, 0x2a1: 0x0812, 0x2a2: 0x0812, 0x2a3: 0x0812, - 0x2a4: 0x0812, 0x2a5: 0x0812, 0x2a6: 0x0812, 0x2a7: 0x0812, 0x2a8: 0x0813, 0x2a9: 0x0813, - 0x2aa: 0x0813, 0x2ab: 0x0813, 0x2ac: 0x0813, 0x2ad: 0x0813, 0x2ae: 0x0813, 0x2af: 0x0813, - 0x2b0: 0x8b52, 0x2b1: 0x8b52, 0x2b2: 0x8e52, 0x2b3: 0x8e52, 0x2b4: 0x9152, 0x2b5: 0x9152, - 0x2b6: 0x9452, 0x2b7: 0x9452, 0x2b8: 0x9752, 0x2b9: 0x9752, 0x2ba: 0x9a52, 0x2bb: 0x9a52, - 0x2bc: 0x4d52, 0x2bd: 0x4d52, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x3daa, 0x2c1: 0x3f8a, 0x2c2: 0x416a, 0x2c3: 0x434a, 0x2c4: 0x452a, 0x2c5: 0x470a, - 0x2c6: 0x48ea, 0x2c7: 0x4aca, 0x2c8: 0x4ca9, 0x2c9: 0x4e89, 0x2ca: 0x5069, 0x2cb: 0x5249, - 0x2cc: 0x5429, 0x2cd: 0x5609, 0x2ce: 0x57e9, 0x2cf: 0x59c9, 0x2d0: 0x5baa, 0x2d1: 0x5d8a, - 0x2d2: 0x5f6a, 0x2d3: 0x614a, 0x2d4: 0x632a, 0x2d5: 0x650a, 0x2d6: 0x66ea, 0x2d7: 0x68ca, - 0x2d8: 0x6aa9, 0x2d9: 0x6c89, 0x2da: 0x6e69, 0x2db: 0x7049, 0x2dc: 0x7229, 0x2dd: 0x7409, - 0x2de: 0x75e9, 0x2df: 0x77c9, 0x2e0: 0x79aa, 0x2e1: 0x7b8a, 0x2e2: 0x7d6a, 0x2e3: 0x7f4a, - 0x2e4: 0x812a, 0x2e5: 0x830a, 0x2e6: 0x84ea, 0x2e7: 0x86ca, 0x2e8: 0x88a9, 0x2e9: 0x8a89, - 0x2ea: 0x8c69, 0x2eb: 0x8e49, 0x2ec: 0x9029, 0x2ed: 0x9209, 0x2ee: 0x93e9, 0x2ef: 0x95c9, - 0x2f0: 0x0812, 0x2f1: 0x0812, 0x2f2: 0x97aa, 0x2f3: 0x99ca, 0x2f4: 0x9b6a, - 0x2f6: 0x9d2a, 0x2f7: 0x9e6a, 0x2f8: 0x0813, 0x2f9: 0x0813, 0x2fa: 0x8b53, 0x2fb: 0x8b53, - 0x2fc: 0xa0e9, 0x2fd: 0x0004, 0x2fe: 0xa28a, 0x2ff: 0x0004, - // Block 0xc, offset 0x300 - 0x300: 0x0004, 0x301: 0x0004, 0x302: 0xa34a, 0x303: 0xa56a, 0x304: 0xa70a, - 0x306: 0xa8ca, 0x307: 0xaa0a, 0x308: 0x8e53, 0x309: 0x8e53, 0x30a: 0x9153, 0x30b: 0x9153, - 0x30c: 0xac89, 0x30d: 0x0004, 0x30e: 0x0004, 0x30f: 0x0004, 0x310: 0x0812, 0x311: 0x0812, - 0x312: 0xae2a, 0x313: 0xafea, 0x316: 0xb1aa, 0x317: 0xb2ea, - 0x318: 0x0813, 0x319: 0x0813, 0x31a: 0x9453, 0x31b: 0x9453, 0x31d: 0x0004, - 0x31e: 0x0004, 0x31f: 0x0004, 0x320: 0x0812, 0x321: 0x0812, 0x322: 0xb4aa, 0x323: 0xb66a, - 0x324: 0xb82a, 0x325: 0x0912, 0x326: 0xb96a, 0x327: 0xbaaa, 0x328: 0x0813, 0x329: 0x0813, - 0x32a: 0x9a53, 0x32b: 0x9a53, 0x32c: 0x0913, 0x32d: 0x0004, 0x32e: 0x0004, 0x32f: 0x0004, - 0x332: 0xbc6a, 0x333: 0xbe8a, 0x334: 0xc02a, - 0x336: 0xc1ea, 0x337: 0xc32a, 0x338: 0x9753, 0x339: 0x9753, 0x33a: 0x4d53, 0x33b: 0x4d53, - 0x33c: 0xc5a9, 0x33d: 0x0004, 0x33e: 0x0004, - // Block 0xd, offset 0x340 - 0x342: 0x0013, - 0x347: 0x0013, 0x34a: 0x0012, 0x34b: 0x0013, - 0x34c: 0x0013, 0x34d: 0x0013, 0x34e: 0x0012, 0x34f: 0x0012, 0x350: 0x0013, 0x351: 0x0013, - 0x352: 0x0013, 0x353: 0x0012, 0x355: 0x0013, - 0x359: 0x0013, 0x35a: 0x0013, 0x35b: 0x0013, 0x35c: 0x0013, 0x35d: 0x0013, - 0x364: 0x0013, 0x366: 0xc74b, 0x368: 0x0013, - 0x36a: 0xc80b, 0x36b: 0xc88b, 0x36c: 0x0013, 0x36d: 0x0013, 0x36f: 0x0012, - 0x370: 0x0013, 0x371: 0x0013, 0x372: 0x9d53, 0x373: 0x0013, 0x374: 0x0012, 0x375: 0x0010, - 0x376: 0x0010, 0x377: 0x0010, 0x378: 0x0010, 0x379: 0x0012, - 0x37c: 0x0012, 0x37d: 0x0012, 0x37e: 0x0013, 0x37f: 0x0013, - // Block 0xe, offset 0x380 - 0x380: 0x1a13, 0x381: 0x1a13, 0x382: 0x1e13, 0x383: 0x1e13, 0x384: 0x1a13, 0x385: 0x1a13, - 0x386: 0x2613, 0x387: 0x2613, 0x388: 0x2a13, 0x389: 0x2a13, 0x38a: 0x2e13, 0x38b: 0x2e13, - 0x38c: 0x2a13, 0x38d: 0x2a13, 0x38e: 0x2613, 0x38f: 0x2613, 0x390: 0xa052, 0x391: 0xa052, - 0x392: 0xa352, 0x393: 0xa352, 0x394: 0xa652, 0x395: 0xa652, 0x396: 0xa352, 0x397: 0xa352, - 0x398: 0xa052, 0x399: 0xa052, 0x39a: 0x1a12, 0x39b: 0x1a12, 0x39c: 0x1e12, 0x39d: 0x1e12, - 0x39e: 0x1a12, 0x39f: 0x1a12, 0x3a0: 0x2612, 0x3a1: 0x2612, 0x3a2: 0x2a12, 0x3a3: 0x2a12, - 0x3a4: 0x2e12, 0x3a5: 0x2e12, 0x3a6: 0x2a12, 0x3a7: 0x2a12, 0x3a8: 0x2612, 0x3a9: 0x2612, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x6552, 0x3c1: 0x6552, 0x3c2: 0x6552, 0x3c3: 0x6552, 0x3c4: 0x6552, 0x3c5: 0x6552, - 0x3c6: 0x6552, 0x3c7: 0x6552, 0x3c8: 0x6552, 0x3c9: 0x6552, 0x3ca: 0x6552, 0x3cb: 0x6552, - 0x3cc: 0x6552, 0x3cd: 0x6552, 0x3ce: 0x6552, 0x3cf: 0x6552, 0x3d0: 0xa952, 0x3d1: 0xa952, - 0x3d2: 0xa952, 0x3d3: 0xa952, 0x3d4: 0xa952, 0x3d5: 0xa952, 0x3d6: 0xa952, 0x3d7: 0xa952, - 0x3d8: 0xa952, 0x3d9: 0xa952, 0x3da: 0xa952, 0x3db: 0xa952, 0x3dc: 0xa952, 0x3dd: 0xa952, - 0x3de: 0xa952, 0x3e0: 0x0113, 0x3e1: 0x0112, 0x3e2: 0xc94b, 0x3e3: 0x8853, - 0x3e4: 0xca0b, 0x3e5: 0xcaca, 0x3e6: 0xcb4a, 0x3e7: 0x0f13, 0x3e8: 0x0f12, 0x3e9: 0x0313, - 0x3ea: 0x0312, 0x3eb: 0x0713, 0x3ec: 0x0712, 0x3ed: 0xcbcb, 0x3ee: 0xcc8b, 0x3ef: 0xcd4b, - 0x3f0: 0xce0b, 0x3f1: 0x0012, 0x3f2: 0x0113, 0x3f3: 0x0112, 0x3f4: 0x0012, 0x3f5: 0x0313, - 0x3f6: 0x0312, 0x3f7: 0x0012, 0x3f8: 0x0012, 0x3f9: 0x0012, 0x3fa: 0x0012, 0x3fb: 0x0012, - 0x3fc: 0x0015, 0x3fd: 0x0015, 0x3fe: 0xcecb, 0x3ff: 0xcf8b, - // Block 0x10, offset 0x400 - 0x400: 0x0113, 0x401: 0x0112, 0x402: 0x0113, 0x403: 0x0112, 0x404: 0x0113, 0x405: 0x0112, - 0x406: 0x0113, 0x407: 0x0112, 0x408: 0x0014, 0x409: 0x0004, 0x40a: 0x0004, 0x40b: 0x0713, - 0x40c: 0x0712, 0x40d: 0xd04b, 0x40e: 0x0012, 0x40f: 0x0010, 0x410: 0x0113, 0x411: 0x0112, - 0x412: 0x0113, 0x413: 0x0112, 0x414: 0x0012, 0x415: 0x0012, 0x416: 0x0113, 0x417: 0x0112, - 0x418: 0x0113, 0x419: 0x0112, 0x41a: 0x0113, 0x41b: 0x0112, 0x41c: 0x0113, 0x41d: 0x0112, - 0x41e: 0x0113, 0x41f: 0x0112, 0x420: 0x0113, 0x421: 0x0112, 0x422: 0x0113, 0x423: 0x0112, - 0x424: 0x0113, 0x425: 0x0112, 0x426: 0x0113, 0x427: 0x0112, 0x428: 0x0113, 0x429: 0x0112, - 0x42a: 0xd10b, 0x42b: 0xd1cb, 0x42c: 0xd28b, 0x42d: 0xd34b, 0x42e: 0xd40b, - 0x430: 0xd4cb, 0x431: 0xd58b, 0x432: 0xd64b, 0x433: 0xac53, 0x434: 0x0113, 0x435: 0x0112, - 0x436: 0x0113, 0x437: 0x0112, - // Block 0x11, offset 0x440 - 0x440: 0xd70a, 0x441: 0xd80a, 0x442: 0xd90a, 0x443: 0xda0a, 0x444: 0xdb6a, 0x445: 0xdcca, - 0x446: 0xddca, - 0x453: 0xdeca, 0x454: 0xe08a, 0x455: 0xe24a, 0x456: 0xe40a, 0x457: 0xe5ca, - 0x45d: 0x0010, - 0x45e: 0x0034, 0x45f: 0x0010, 0x460: 0x0010, 0x461: 0x0010, 0x462: 0x0010, 0x463: 0x0010, - 0x464: 0x0010, 0x465: 0x0010, 0x466: 0x0010, 0x467: 0x0010, 0x468: 0x0010, - 0x46a: 0x0010, 0x46b: 0x0010, 0x46c: 0x0010, 0x46d: 0x0010, 0x46e: 0x0010, 0x46f: 0x0010, - 0x470: 0x0010, 0x471: 0x0010, 0x472: 0x0010, 0x473: 0x0010, 0x474: 0x0010, 0x475: 0x0010, - 0x476: 0x0010, 0x478: 0x0010, 0x479: 0x0010, 0x47a: 0x0010, 0x47b: 0x0010, - 0x47c: 0x0010, 0x47e: 0x0010, - // Block 0x12, offset 0x480 - 0x480: 0x2213, 0x481: 0x2213, 0x482: 0x2613, 0x483: 0x2613, 0x484: 0x2213, 0x485: 0x2213, - 0x486: 0x2e13, 0x487: 0x2e13, 0x488: 0x2213, 0x489: 0x2213, 0x48a: 0x2613, 0x48b: 0x2613, - 0x48c: 0x2213, 0x48d: 0x2213, 0x48e: 0x3e13, 0x48f: 0x3e13, 0x490: 0x2213, 0x491: 0x2213, - 0x492: 0x2613, 0x493: 0x2613, 0x494: 0x2213, 0x495: 0x2213, 0x496: 0x2e13, 0x497: 0x2e13, - 0x498: 0x2213, 0x499: 0x2213, 0x49a: 0x2613, 0x49b: 0x2613, 0x49c: 0x2213, 0x49d: 0x2213, - 0x49e: 0xb553, 0x49f: 0xb553, 0x4a0: 0xb853, 0x4a1: 0xb853, 0x4a2: 0x2212, 0x4a3: 0x2212, - 0x4a4: 0x2612, 0x4a5: 0x2612, 0x4a6: 0x2212, 0x4a7: 0x2212, 0x4a8: 0x2e12, 0x4a9: 0x2e12, - 0x4aa: 0x2212, 0x4ab: 0x2212, 0x4ac: 0x2612, 0x4ad: 0x2612, 0x4ae: 0x2212, 0x4af: 0x2212, - 0x4b0: 0x3e12, 0x4b1: 0x3e12, 0x4b2: 0x2212, 0x4b3: 0x2212, 0x4b4: 0x2612, 0x4b5: 0x2612, - 0x4b6: 0x2212, 0x4b7: 0x2212, 0x4b8: 0x2e12, 0x4b9: 0x2e12, 0x4ba: 0x2212, 0x4bb: 0x2212, - 0x4bc: 0x2612, 0x4bd: 0x2612, 0x4be: 0x2212, 0x4bf: 0x2212, - // Block 0x13, offset 0x4c0 - 0x4c2: 0x0010, - 0x4c7: 0x0010, 0x4c9: 0x0010, 0x4cb: 0x0010, - 0x4cd: 0x0010, 0x4ce: 0x0010, 0x4cf: 0x0010, 0x4d1: 0x0010, - 0x4d2: 0x0010, 0x4d4: 0x0010, 0x4d7: 0x0010, - 0x4d9: 0x0010, 0x4db: 0x0010, 0x4dd: 0x0010, - 0x4df: 0x0010, 0x4e1: 0x0010, 0x4e2: 0x0010, - 0x4e4: 0x0010, 0x4e7: 0x0010, 0x4e8: 0x0010, 0x4e9: 0x0010, - 0x4ea: 0x0010, 0x4ec: 0x0010, 0x4ed: 0x0010, 0x4ee: 0x0010, 0x4ef: 0x0010, - 0x4f0: 0x0010, 0x4f1: 0x0010, 0x4f2: 0x0010, 0x4f4: 0x0010, 0x4f5: 0x0010, - 0x4f6: 0x0010, 0x4f7: 0x0010, 0x4f9: 0x0010, 0x4fa: 0x0010, 0x4fb: 0x0010, - 0x4fc: 0x0010, 0x4fe: 0x0010, -} - -// caseIndex: 25 blocks, 1600 entries, 3200 bytes -// Block 0 is the zero block. -var caseIndex = [1600]uint16{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc2: 0x12, 0xc3: 0x13, 0xc4: 0x14, 0xc5: 0x15, 0xc6: 0x01, 0xc7: 0x02, - 0xc8: 0x16, 0xc9: 0x03, 0xca: 0x04, 0xcb: 0x17, 0xcc: 0x18, 0xcd: 0x05, 0xce: 0x06, 0xcf: 0x07, - 0xd0: 0x19, 0xd1: 0x1a, 0xd2: 0x1b, 0xd3: 0x1c, 0xd4: 0x1d, 0xd5: 0x1e, 0xd6: 0x1f, 0xd7: 0x20, - 0xd8: 0x21, 0xd9: 0x22, 0xda: 0x23, 0xdb: 0x24, 0xdc: 0x25, 0xdd: 0x26, 0xde: 0x27, 0xdf: 0x28, - 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, - 0xea: 0x06, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x08, 0xef: 0x09, - 0xf0: 0x14, 0xf3: 0x16, - // Block 0x4, offset 0x100 - 0x120: 0x29, 0x121: 0x2a, 0x122: 0x2b, 0x123: 0x2c, 0x124: 0x2d, 0x125: 0x2e, 0x126: 0x2f, 0x127: 0x30, - 0x128: 0x31, 0x129: 0x32, 0x12a: 0x33, 0x12b: 0x34, 0x12c: 0x35, 0x12d: 0x36, 0x12e: 0x37, 0x12f: 0x38, - 0x130: 0x39, 0x131: 0x3a, 0x132: 0x3b, 0x133: 0x3c, 0x134: 0x3d, 0x135: 0x3e, 0x136: 0x3f, 0x137: 0x40, - 0x138: 0x41, 0x139: 0x42, 0x13a: 0x43, 0x13b: 0x44, 0x13c: 0x45, 0x13d: 0x46, 0x13e: 0x47, 0x13f: 0x48, - // Block 0x5, offset 0x140 - 0x140: 0x49, 0x141: 0x4a, 0x142: 0x4b, 0x143: 0x4c, 0x144: 0x23, 0x145: 0x23, 0x146: 0x23, 0x147: 0x23, - 0x148: 0x23, 0x149: 0x4d, 0x14a: 0x4e, 0x14b: 0x4f, 0x14c: 0x50, 0x14d: 0x51, 0x14e: 0x52, 0x14f: 0x53, - 0x150: 0x54, 0x151: 0x23, 0x152: 0x23, 0x153: 0x23, 0x154: 0x23, 0x155: 0x23, 0x156: 0x23, 0x157: 0x23, - 0x158: 0x23, 0x159: 0x55, 0x15a: 0x56, 0x15b: 0x57, 0x15c: 0x58, 0x15d: 0x59, 0x15e: 0x5a, 0x15f: 0x5b, - 0x160: 0x5c, 0x161: 0x5d, 0x162: 0x5e, 0x163: 0x5f, 0x164: 0x60, 0x165: 0x61, 0x167: 0x62, - 0x168: 0x63, 0x169: 0x64, 0x16a: 0x65, 0x16c: 0x66, 0x16d: 0x67, 0x16e: 0x68, 0x16f: 0x69, - 0x170: 0x6a, 0x171: 0x6b, 0x172: 0x6c, 0x173: 0x6d, 0x174: 0x6e, 0x175: 0x6f, 0x176: 0x70, 0x177: 0x71, - 0x178: 0x72, 0x179: 0x72, 0x17a: 0x73, 0x17b: 0x72, 0x17c: 0x74, 0x17d: 0x08, 0x17e: 0x09, 0x17f: 0x0a, - // Block 0x6, offset 0x180 - 0x180: 0x75, 0x181: 0x76, 0x182: 0x77, 0x183: 0x78, 0x184: 0x0b, 0x185: 0x79, 0x186: 0x7a, - 0x192: 0x7b, 0x193: 0x0c, - 0x1b0: 0x7c, 0x1b1: 0x0d, 0x1b2: 0x72, 0x1b3: 0x7d, 0x1b4: 0x7e, 0x1b5: 0x7f, 0x1b6: 0x80, 0x1b7: 0x81, - 0x1b8: 0x82, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x83, 0x1c2: 0x84, 0x1c3: 0x85, 0x1c4: 0x86, 0x1c5: 0x23, 0x1c6: 0x87, - // Block 0x8, offset 0x200 - 0x200: 0x88, 0x201: 0x23, 0x202: 0x23, 0x203: 0x23, 0x204: 0x23, 0x205: 0x23, 0x206: 0x23, 0x207: 0x23, - 0x208: 0x23, 0x209: 0x23, 0x20a: 0x23, 0x20b: 0x23, 0x20c: 0x23, 0x20d: 0x23, 0x20e: 0x23, 0x20f: 0x23, - 0x210: 0x23, 0x211: 0x23, 0x212: 0x89, 0x213: 0x8a, 0x214: 0x23, 0x215: 0x23, 0x216: 0x23, 0x217: 0x23, - 0x218: 0x8b, 0x219: 0x8c, 0x21a: 0x8d, 0x21b: 0x8e, 0x21c: 0x8f, 0x21d: 0x90, 0x21e: 0x0e, 0x21f: 0x91, - 0x220: 0x92, 0x221: 0x93, 0x222: 0x23, 0x223: 0x94, 0x224: 0x95, 0x225: 0x96, 0x226: 0x97, 0x227: 0x98, - 0x228: 0x99, 0x229: 0x9a, 0x22a: 0x9b, 0x22b: 0x9c, 0x22c: 0x9d, 0x22d: 0x9e, 0x22e: 0x9f, 0x22f: 0xa0, - 0x230: 0x23, 0x231: 0x23, 0x232: 0x23, 0x233: 0x23, 0x234: 0x23, 0x235: 0x23, 0x236: 0x23, 0x237: 0x23, - 0x238: 0x23, 0x239: 0x23, 0x23a: 0x23, 0x23b: 0x23, 0x23c: 0x23, 0x23d: 0x23, 0x23e: 0x23, 0x23f: 0x23, - // Block 0x9, offset 0x240 - 0x240: 0x23, 0x241: 0x23, 0x242: 0x23, 0x243: 0x23, 0x244: 0x23, 0x245: 0x23, 0x246: 0x23, 0x247: 0x23, - 0x248: 0x23, 0x249: 0x23, 0x24a: 0x23, 0x24b: 0x23, 0x24c: 0x23, 0x24d: 0x23, 0x24e: 0x23, 0x24f: 0x23, - 0x250: 0x23, 0x251: 0x23, 0x252: 0x23, 0x253: 0x23, 0x254: 0x23, 0x255: 0x23, 0x256: 0x23, 0x257: 0x23, - 0x258: 0x23, 0x259: 0x23, 0x25a: 0x23, 0x25b: 0x23, 0x25c: 0x23, 0x25d: 0x23, 0x25e: 0x23, 0x25f: 0x23, - 0x260: 0x23, 0x261: 0x23, 0x262: 0x23, 0x263: 0x23, 0x264: 0x23, 0x265: 0x23, 0x266: 0x23, 0x267: 0x23, - 0x268: 0x23, 0x269: 0x23, 0x26a: 0x23, 0x26b: 0x23, 0x26c: 0x23, 0x26d: 0x23, 0x26e: 0x23, 0x26f: 0x23, - 0x270: 0x23, 0x271: 0x23, 0x272: 0x23, 0x273: 0x23, 0x274: 0x23, 0x275: 0x23, 0x276: 0x23, 0x277: 0x23, - 0x278: 0x23, 0x279: 0x23, 0x27a: 0x23, 0x27b: 0x23, 0x27c: 0x23, 0x27d: 0x23, 0x27e: 0x23, 0x27f: 0x23, - // Block 0xa, offset 0x280 - 0x280: 0x23, 0x281: 0x23, 0x282: 0x23, 0x283: 0x23, 0x284: 0x23, 0x285: 0x23, 0x286: 0x23, 0x287: 0x23, - 0x288: 0x23, 0x289: 0x23, 0x28a: 0x23, 0x28b: 0x23, 0x28c: 0x23, 0x28d: 0x23, 0x28e: 0x23, 0x28f: 0x23, - 0x290: 0x23, 0x291: 0x23, 0x292: 0x23, 0x293: 0x23, 0x294: 0x23, 0x295: 0x23, 0x296: 0x23, 0x297: 0x23, - 0x298: 0x23, 0x299: 0x23, 0x29a: 0x23, 0x29b: 0x23, 0x29c: 0x23, 0x29d: 0x23, 0x29e: 0xa1, 0x29f: 0xa2, - // Block 0xb, offset 0x2c0 - 0x2ec: 0x0f, 0x2ed: 0xa3, 0x2ee: 0xa4, 0x2ef: 0xa5, - 0x2f0: 0x23, 0x2f1: 0x23, 0x2f2: 0x23, 0x2f3: 0x23, 0x2f4: 0xa6, 0x2f5: 0xa7, 0x2f6: 0xa8, 0x2f7: 0xa9, - 0x2f8: 0xaa, 0x2f9: 0xab, 0x2fa: 0x23, 0x2fb: 0xac, 0x2fc: 0xad, 0x2fd: 0xae, 0x2fe: 0xaf, 0x2ff: 0xb0, - // Block 0xc, offset 0x300 - 0x300: 0xb1, 0x301: 0xb2, 0x302: 0x23, 0x303: 0xb3, 0x305: 0xb4, 0x307: 0xb5, - 0x30a: 0xb6, 0x30b: 0xb7, 0x30c: 0xb8, 0x30d: 0xb9, 0x30e: 0xba, 0x30f: 0xbb, - 0x310: 0xbc, 0x311: 0xbd, 0x312: 0xbe, 0x313: 0xbf, 0x314: 0xc0, 0x315: 0xc1, - 0x318: 0x23, 0x319: 0x23, 0x31a: 0x23, 0x31b: 0x23, 0x31c: 0xc2, 0x31d: 0xc3, - 0x320: 0xc4, 0x321: 0xc5, 0x322: 0xc6, 0x323: 0xc7, 0x324: 0xc8, 0x326: 0xc9, - 0x328: 0xca, 0x329: 0xcb, 0x32a: 0xcc, 0x32b: 0xcd, 0x32c: 0x5f, 0x32d: 0xce, 0x32e: 0xcf, - 0x330: 0x23, 0x331: 0xd0, 0x332: 0xd1, 0x333: 0xd2, - // Block 0xd, offset 0x340 - 0x340: 0xd3, 0x341: 0xd4, 0x342: 0xd5, 0x343: 0xd6, 0x344: 0xd7, 0x345: 0xd8, 0x346: 0xd9, 0x347: 0xda, - 0x348: 0xdb, 0x34a: 0xdc, 0x34b: 0xdd, 0x34c: 0xde, 0x34d: 0xdf, - 0x350: 0xe0, 0x351: 0xe1, 0x352: 0xe2, 0x353: 0xe3, 0x356: 0xe4, 0x357: 0xe5, - 0x358: 0xe6, 0x359: 0xe7, 0x35a: 0xe8, 0x35b: 0xe9, 0x35c: 0xea, - 0x362: 0xeb, 0x363: 0xec, - 0x36b: 0xed, - 0x370: 0xee, 0x371: 0xef, 0x372: 0xf0, - // Block 0xe, offset 0x380 - 0x380: 0x23, 0x381: 0x23, 0x382: 0x23, 0x383: 0x23, 0x384: 0x23, 0x385: 0x23, 0x386: 0x23, 0x387: 0x23, - 0x388: 0x23, 0x389: 0x23, 0x38a: 0x23, 0x38b: 0x23, 0x38c: 0x23, 0x38d: 0x23, 0x38e: 0xf1, - 0x390: 0x23, 0x391: 0xf2, 0x392: 0x23, 0x393: 0x23, 0x394: 0x23, 0x395: 0xf3, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x23, 0x3c1: 0x23, 0x3c2: 0x23, 0x3c3: 0x23, 0x3c4: 0x23, 0x3c5: 0x23, 0x3c6: 0x23, 0x3c7: 0x23, - 0x3c8: 0x23, 0x3c9: 0x23, 0x3ca: 0x23, 0x3cb: 0x23, 0x3cc: 0x23, 0x3cd: 0x23, 0x3ce: 0x23, 0x3cf: 0x23, - 0x3d0: 0xf2, - // Block 0x10, offset 0x400 - 0x410: 0x23, 0x411: 0x23, 0x412: 0x23, 0x413: 0x23, 0x414: 0x23, 0x415: 0x23, 0x416: 0x23, 0x417: 0x23, - 0x418: 0x23, 0x419: 0xf4, - // Block 0x11, offset 0x440 - 0x460: 0x23, 0x461: 0x23, 0x462: 0x23, 0x463: 0x23, 0x464: 0x23, 0x465: 0x23, 0x466: 0x23, 0x467: 0x23, - 0x468: 0xed, 0x469: 0xf5, 0x46b: 0xf6, 0x46c: 0xf7, 0x46d: 0xf8, 0x46e: 0xf9, - 0x47c: 0x23, 0x47d: 0xfa, 0x47e: 0xfb, 0x47f: 0xfc, - // Block 0x12, offset 0x480 - 0x4b0: 0x23, 0x4b1: 0xfd, 0x4b2: 0xfe, - // Block 0x13, offset 0x4c0 - 0x4c5: 0xff, 0x4c6: 0x100, - 0x4c9: 0x101, - 0x4d0: 0x102, 0x4d1: 0x103, 0x4d2: 0x104, 0x4d3: 0x105, 0x4d4: 0x106, 0x4d5: 0x107, 0x4d6: 0x108, 0x4d7: 0x109, - 0x4d8: 0x10a, 0x4d9: 0x10b, 0x4da: 0x10c, 0x4db: 0x10d, 0x4dc: 0x10e, 0x4dd: 0x10f, 0x4de: 0x110, 0x4df: 0x111, - 0x4e8: 0x112, 0x4e9: 0x113, 0x4ea: 0x114, - // Block 0x14, offset 0x500 - 0x500: 0x115, - 0x520: 0x23, 0x521: 0x23, 0x522: 0x23, 0x523: 0x116, 0x524: 0x10, 0x525: 0x117, - 0x538: 0x118, 0x539: 0x11, 0x53a: 0x119, - // Block 0x15, offset 0x540 - 0x544: 0x11a, 0x545: 0x11b, 0x546: 0x11c, - 0x54f: 0x11d, - // Block 0x16, offset 0x580 - 0x590: 0x0a, 0x591: 0x0b, 0x592: 0x0c, 0x593: 0x0d, 0x594: 0x0e, 0x596: 0x0f, - 0x59b: 0x10, 0x59d: 0x11, 0x59e: 0x12, 0x59f: 0x13, - // Block 0x17, offset 0x5c0 - 0x5c0: 0x11e, 0x5c1: 0x11f, 0x5c4: 0x11f, 0x5c5: 0x11f, 0x5c6: 0x11f, 0x5c7: 0x120, - // Block 0x18, offset 0x600 - 0x620: 0x15, -} - -// sparseOffsets: 272 entries, 544 bytes -var sparseOffsets = []uint16{0x0, 0x9, 0xf, 0x18, 0x24, 0x2e, 0x3a, 0x3d, 0x41, 0x44, 0x48, 0x52, 0x54, 0x59, 0x69, 0x70, 0x75, 0x83, 0x84, 0x92, 0xa1, 0xab, 0xae, 0xb4, 0xbc, 0xbe, 0xc0, 0xce, 0xd4, 0xe2, 0xed, 0xf8, 0x103, 0x10f, 0x119, 0x124, 0x12f, 0x13b, 0x147, 0x14f, 0x157, 0x161, 0x16c, 0x178, 0x17e, 0x189, 0x18e, 0x196, 0x199, 0x19e, 0x1a2, 0x1a6, 0x1ad, 0x1b6, 0x1be, 0x1bf, 0x1c8, 0x1cf, 0x1d7, 0x1dd, 0x1e3, 0x1e8, 0x1ec, 0x1ef, 0x1f1, 0x1f4, 0x1f9, 0x1fa, 0x1fc, 0x1fe, 0x200, 0x207, 0x20c, 0x210, 0x219, 0x21c, 0x21f, 0x225, 0x226, 0x231, 0x232, 0x233, 0x238, 0x245, 0x24d, 0x255, 0x25e, 0x267, 0x270, 0x275, 0x278, 0x281, 0x28e, 0x290, 0x297, 0x299, 0x2a4, 0x2a5, 0x2b0, 0x2b8, 0x2c0, 0x2c6, 0x2c7, 0x2d5, 0x2da, 0x2dd, 0x2e2, 0x2e6, 0x2ec, 0x2f1, 0x2f4, 0x2f9, 0x2fe, 0x2ff, 0x305, 0x307, 0x308, 0x30a, 0x30c, 0x30f, 0x310, 0x312, 0x315, 0x31b, 0x31f, 0x321, 0x327, 0x32e, 0x332, 0x33b, 0x33c, 0x344, 0x348, 0x34d, 0x355, 0x35b, 0x361, 0x36b, 0x370, 0x379, 0x37f, 0x386, 0x38a, 0x392, 0x394, 0x396, 0x399, 0x39b, 0x39d, 0x39e, 0x39f, 0x3a1, 0x3a3, 0x3a9, 0x3ae, 0x3b0, 0x3b6, 0x3b9, 0x3bb, 0x3c1, 0x3c6, 0x3c8, 0x3c9, 0x3ca, 0x3cb, 0x3cd, 0x3cf, 0x3d1, 0x3d4, 0x3d6, 0x3d9, 0x3e1, 0x3e4, 0x3e8, 0x3f0, 0x3f2, 0x3f3, 0x3f4, 0x3f6, 0x3fc, 0x3fe, 0x3ff, 0x401, 0x403, 0x405, 0x412, 0x413, 0x414, 0x418, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, 0x422, 0x426, 0x42c, 0x42e, 0x435, 0x438, 0x43c, 0x442, 0x44b, 0x451, 0x457, 0x461, 0x46b, 0x46d, 0x474, 0x47a, 0x480, 0x486, 0x489, 0x48f, 0x492, 0x49a, 0x49b, 0x4a2, 0x4a3, 0x4a6, 0x4a7, 0x4ad, 0x4b0, 0x4b8, 0x4b9, 0x4ba, 0x4bb, 0x4bc, 0x4be, 0x4c0, 0x4c2, 0x4c6, 0x4c7, 0x4c9, 0x4ca, 0x4cb, 0x4cd, 0x4d2, 0x4d7, 0x4db, 0x4dc, 0x4df, 0x4e3, 0x4ee, 0x4f2, 0x4fa, 0x4ff, 0x503, 0x506, 0x50a, 0x50d, 0x510, 0x515, 0x519, 0x51d, 0x521, 0x525, 0x527, 0x529, 0x52c, 0x531, 0x533, 0x538, 0x541, 0x546, 0x547, 0x54a, 0x54b, 0x54c, 0x54e, 0x54f, 0x550} - -// sparseValues: 1360 entries, 5440 bytes -var sparseValues = [1360]valueRange{ - // Block 0x0, offset 0x0 - {value: 0x0004, lo: 0xa8, hi: 0xa8}, - {value: 0x0012, lo: 0xaa, hi: 0xaa}, - {value: 0x0014, lo: 0xad, hi: 0xad}, - {value: 0x0004, lo: 0xaf, hi: 0xaf}, - {value: 0x0004, lo: 0xb4, hi: 0xb4}, - {value: 0x002a, lo: 0xb5, hi: 0xb5}, - {value: 0x0054, lo: 0xb7, hi: 0xb7}, - {value: 0x0004, lo: 0xb8, hi: 0xb8}, - {value: 0x0012, lo: 0xba, hi: 0xba}, - // Block 0x1, offset 0x9 - {value: 0x2013, lo: 0x80, hi: 0x96}, - {value: 0x2013, lo: 0x98, hi: 0x9e}, - {value: 0x00ea, lo: 0x9f, hi: 0x9f}, - {value: 0x2012, lo: 0xa0, hi: 0xb6}, - {value: 0x2012, lo: 0xb8, hi: 0xbe}, - {value: 0x0252, lo: 0xbf, hi: 0xbf}, - // Block 0x2, offset 0xf - {value: 0x0117, lo: 0x80, hi: 0xaf}, - {value: 0x01eb, lo: 0xb0, hi: 0xb0}, - {value: 0x02ea, lo: 0xb1, hi: 0xb1}, - {value: 0x0117, lo: 0xb2, hi: 0xb7}, - {value: 0x0012, lo: 0xb8, hi: 0xb8}, - {value: 0x0316, lo: 0xb9, hi: 0xba}, - {value: 0x0716, lo: 0xbb, hi: 0xbc}, - {value: 0x0316, lo: 0xbd, hi: 0xbe}, - {value: 0x0553, lo: 0xbf, hi: 0xbf}, - // Block 0x3, offset 0x18 - {value: 0x0552, lo: 0x80, hi: 0x80}, - {value: 0x0316, lo: 0x81, hi: 0x82}, - {value: 0x0716, lo: 0x83, hi: 0x84}, - {value: 0x0316, lo: 0x85, hi: 0x86}, - {value: 0x0f16, lo: 0x87, hi: 0x88}, - {value: 0x034a, lo: 0x89, hi: 0x89}, - {value: 0x0117, lo: 0x8a, hi: 0xb7}, - {value: 0x0253, lo: 0xb8, hi: 0xb8}, - {value: 0x0316, lo: 0xb9, hi: 0xba}, - {value: 0x0716, lo: 0xbb, hi: 0xbc}, - {value: 0x0316, lo: 0xbd, hi: 0xbe}, - {value: 0x044a, lo: 0xbf, hi: 0xbf}, - // Block 0x4, offset 0x24 - {value: 0x0117, lo: 0x80, hi: 0x9f}, - {value: 0x2f53, lo: 0xa0, hi: 0xa0}, - {value: 0x0012, lo: 0xa1, hi: 0xa1}, - {value: 0x0117, lo: 0xa2, hi: 0xb3}, - {value: 0x0012, lo: 0xb4, hi: 0xb9}, - {value: 0x10cb, lo: 0xba, hi: 0xba}, - {value: 0x0716, lo: 0xbb, hi: 0xbc}, - {value: 0x2953, lo: 0xbd, hi: 0xbd}, - {value: 0x11cb, lo: 0xbe, hi: 0xbe}, - {value: 0x12ca, lo: 0xbf, hi: 0xbf}, - // Block 0x5, offset 0x2e - {value: 0x0015, lo: 0x80, hi: 0x81}, - {value: 0x0004, lo: 0x82, hi: 0x85}, - {value: 0x0014, lo: 0x86, hi: 0x91}, - {value: 0x0004, lo: 0x92, hi: 0x96}, - {value: 0x0054, lo: 0x97, hi: 0x97}, - {value: 0x0004, lo: 0x98, hi: 0x9f}, - {value: 0x0015, lo: 0xa0, hi: 0xa4}, - {value: 0x0004, lo: 0xa5, hi: 0xab}, - {value: 0x0014, lo: 0xac, hi: 0xac}, - {value: 0x0004, lo: 0xad, hi: 0xad}, - {value: 0x0014, lo: 0xae, hi: 0xae}, - {value: 0x0004, lo: 0xaf, hi: 0xbf}, - // Block 0x6, offset 0x3a - {value: 0x0024, lo: 0x80, hi: 0x94}, - {value: 0x0034, lo: 0x95, hi: 0xbc}, - {value: 0x0024, lo: 0xbd, hi: 0xbf}, - // Block 0x7, offset 0x3d - {value: 0x6553, lo: 0x80, hi: 0x8f}, - {value: 0x2013, lo: 0x90, hi: 0x9f}, - {value: 0x5f53, lo: 0xa0, hi: 0xaf}, - {value: 0x2012, lo: 0xb0, hi: 0xbf}, - // Block 0x8, offset 0x41 - {value: 0x5f52, lo: 0x80, hi: 0x8f}, - {value: 0x6552, lo: 0x90, hi: 0x9f}, - {value: 0x0117, lo: 0xa0, hi: 0xbf}, - // Block 0x9, offset 0x44 - {value: 0x0117, lo: 0x80, hi: 0x81}, - {value: 0x0024, lo: 0x83, hi: 0x87}, - {value: 0x0014, lo: 0x88, hi: 0x89}, - {value: 0x0117, lo: 0x8a, hi: 0xbf}, - // Block 0xa, offset 0x48 - {value: 0x0f13, lo: 0x80, hi: 0x80}, - {value: 0x0316, lo: 0x81, hi: 0x82}, - {value: 0x0716, lo: 0x83, hi: 0x84}, - {value: 0x0316, lo: 0x85, hi: 0x86}, - {value: 0x0f16, lo: 0x87, hi: 0x88}, - {value: 0x0316, lo: 0x89, hi: 0x8a}, - {value: 0x0716, lo: 0x8b, hi: 0x8c}, - {value: 0x0316, lo: 0x8d, hi: 0x8e}, - {value: 0x0f12, lo: 0x8f, hi: 0x8f}, - {value: 0x0117, lo: 0x90, hi: 0xbf}, - // Block 0xb, offset 0x52 - {value: 0x0117, lo: 0x80, hi: 0xaf}, - {value: 0x6553, lo: 0xb1, hi: 0xbf}, - // Block 0xc, offset 0x54 - {value: 0x3013, lo: 0x80, hi: 0x8f}, - {value: 0x6853, lo: 0x90, hi: 0x96}, - {value: 0x0014, lo: 0x99, hi: 0x99}, - {value: 0x6552, lo: 0xa1, hi: 0xaf}, - {value: 0x3012, lo: 0xb0, hi: 0xbf}, - // Block 0xd, offset 0x59 - {value: 0x6852, lo: 0x80, hi: 0x86}, - {value: 0x27aa, lo: 0x87, hi: 0x87}, - {value: 0x0034, lo: 0x91, hi: 0x91}, - {value: 0x0024, lo: 0x92, hi: 0x95}, - {value: 0x0034, lo: 0x96, hi: 0x96}, - {value: 0x0024, lo: 0x97, hi: 0x99}, - {value: 0x0034, lo: 0x9a, hi: 0x9b}, - {value: 0x0024, lo: 0x9c, hi: 0xa1}, - {value: 0x0034, lo: 0xa2, hi: 0xa7}, - {value: 0x0024, lo: 0xa8, hi: 0xa9}, - {value: 0x0034, lo: 0xaa, hi: 0xaa}, - {value: 0x0024, lo: 0xab, hi: 0xac}, - {value: 0x0034, lo: 0xad, hi: 0xae}, - {value: 0x0024, lo: 0xaf, hi: 0xaf}, - {value: 0x0034, lo: 0xb0, hi: 0xbd}, - {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0xe, offset 0x69 - {value: 0x0034, lo: 0x81, hi: 0x82}, - {value: 0x0024, lo: 0x84, hi: 0x84}, - {value: 0x0034, lo: 0x85, hi: 0x85}, - {value: 0x0034, lo: 0x87, hi: 0x87}, - {value: 0x0010, lo: 0x90, hi: 0xaa}, - {value: 0x0010, lo: 0xb0, hi: 0xb3}, - {value: 0x0054, lo: 0xb4, hi: 0xb4}, - // Block 0xf, offset 0x70 - {value: 0x0014, lo: 0x80, hi: 0x85}, - {value: 0x0024, lo: 0x90, hi: 0x97}, - {value: 0x0034, lo: 0x98, hi: 0x9a}, - {value: 0x0014, lo: 0x9c, hi: 0x9c}, - {value: 0x0010, lo: 0xa0, hi: 0xbf}, - // Block 0x10, offset 0x75 - {value: 0x0014, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x81, hi: 0x8a}, - {value: 0x0034, lo: 0x8b, hi: 0x92}, - {value: 0x0024, lo: 0x93, hi: 0x94}, - {value: 0x0034, lo: 0x95, hi: 0x96}, - {value: 0x0024, lo: 0x97, hi: 0x9b}, - {value: 0x0034, lo: 0x9c, hi: 0x9c}, - {value: 0x0024, lo: 0x9d, hi: 0x9e}, - {value: 0x0034, lo: 0x9f, hi: 0x9f}, - {value: 0x0010, lo: 0xa0, hi: 0xa9}, - {value: 0x0010, lo: 0xab, hi: 0xab}, - {value: 0x0010, lo: 0xae, hi: 0xaf}, - {value: 0x0034, lo: 0xb0, hi: 0xb0}, - {value: 0x0010, lo: 0xb1, hi: 0xbf}, - // Block 0x11, offset 0x83 - {value: 0x0010, lo: 0x80, hi: 0xbf}, - // Block 0x12, offset 0x84 - {value: 0x0010, lo: 0x80, hi: 0x93}, - {value: 0x0010, lo: 0x95, hi: 0x95}, - {value: 0x0024, lo: 0x96, hi: 0x9c}, - {value: 0x0014, lo: 0x9d, hi: 0x9d}, - {value: 0x0024, lo: 0x9f, hi: 0xa2}, - {value: 0x0034, lo: 0xa3, hi: 0xa3}, - {value: 0x0024, lo: 0xa4, hi: 0xa4}, - {value: 0x0014, lo: 0xa5, hi: 0xa6}, - {value: 0x0024, lo: 0xa7, hi: 0xa8}, - {value: 0x0034, lo: 0xaa, hi: 0xaa}, - {value: 0x0024, lo: 0xab, hi: 0xac}, - {value: 0x0034, lo: 0xad, hi: 0xad}, - {value: 0x0010, lo: 0xae, hi: 0xbc}, - {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0x13, offset 0x92 - {value: 0x0014, lo: 0x8f, hi: 0x8f}, - {value: 0x0010, lo: 0x90, hi: 0x90}, - {value: 0x0034, lo: 0x91, hi: 0x91}, - {value: 0x0010, lo: 0x92, hi: 0xaf}, - {value: 0x0024, lo: 0xb0, hi: 0xb0}, - {value: 0x0034, lo: 0xb1, hi: 0xb1}, - {value: 0x0024, lo: 0xb2, hi: 0xb3}, - {value: 0x0034, lo: 0xb4, hi: 0xb4}, - {value: 0x0024, lo: 0xb5, hi: 0xb6}, - {value: 0x0034, lo: 0xb7, hi: 0xb9}, - {value: 0x0024, lo: 0xba, hi: 0xba}, - {value: 0x0034, lo: 0xbb, hi: 0xbc}, - {value: 0x0024, lo: 0xbd, hi: 0xbd}, - {value: 0x0034, lo: 0xbe, hi: 0xbe}, - {value: 0x0024, lo: 0xbf, hi: 0xbf}, - // Block 0x14, offset 0xa1 - {value: 0x0024, lo: 0x80, hi: 0x81}, - {value: 0x0034, lo: 0x82, hi: 0x82}, - {value: 0x0024, lo: 0x83, hi: 0x83}, - {value: 0x0034, lo: 0x84, hi: 0x84}, - {value: 0x0024, lo: 0x85, hi: 0x85}, - {value: 0x0034, lo: 0x86, hi: 0x86}, - {value: 0x0024, lo: 0x87, hi: 0x87}, - {value: 0x0034, lo: 0x88, hi: 0x88}, - {value: 0x0024, lo: 0x89, hi: 0x8a}, - {value: 0x0010, lo: 0x8d, hi: 0xbf}, - // Block 0x15, offset 0xab - {value: 0x0010, lo: 0x80, hi: 0xa5}, - {value: 0x0014, lo: 0xa6, hi: 0xb0}, - {value: 0x0010, lo: 0xb1, hi: 0xb1}, - // Block 0x16, offset 0xae - {value: 0x0010, lo: 0x80, hi: 0xaa}, - {value: 0x0024, lo: 0xab, hi: 0xb1}, - {value: 0x0034, lo: 0xb2, hi: 0xb2}, - {value: 0x0024, lo: 0xb3, hi: 0xb3}, - {value: 0x0014, lo: 0xb4, hi: 0xb5}, - {value: 0x0014, lo: 0xba, hi: 0xba}, - // Block 0x17, offset 0xb4 - {value: 0x0010, lo: 0x80, hi: 0x95}, - {value: 0x0024, lo: 0x96, hi: 0x99}, - {value: 0x0014, lo: 0x9a, hi: 0x9a}, - {value: 0x0024, lo: 0x9b, hi: 0xa3}, - {value: 0x0014, lo: 0xa4, hi: 0xa4}, - {value: 0x0024, lo: 0xa5, hi: 0xa7}, - {value: 0x0014, lo: 0xa8, hi: 0xa8}, - {value: 0x0024, lo: 0xa9, hi: 0xad}, - // Block 0x18, offset 0xbc - {value: 0x0010, lo: 0x80, hi: 0x98}, - {value: 0x0034, lo: 0x99, hi: 0x9b}, - // Block 0x19, offset 0xbe - {value: 0x0010, lo: 0xa0, hi: 0xb4}, - {value: 0x0010, lo: 0xb6, hi: 0xbd}, - // Block 0x1a, offset 0xc0 - {value: 0x0024, lo: 0x94, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa2}, - {value: 0x0034, lo: 0xa3, hi: 0xa3}, - {value: 0x0024, lo: 0xa4, hi: 0xa5}, - {value: 0x0034, lo: 0xa6, hi: 0xa6}, - {value: 0x0024, lo: 0xa7, hi: 0xa8}, - {value: 0x0034, lo: 0xa9, hi: 0xa9}, - {value: 0x0024, lo: 0xaa, hi: 0xac}, - {value: 0x0034, lo: 0xad, hi: 0xb2}, - {value: 0x0024, lo: 0xb3, hi: 0xb5}, - {value: 0x0034, lo: 0xb6, hi: 0xb6}, - {value: 0x0024, lo: 0xb7, hi: 0xb8}, - {value: 0x0034, lo: 0xb9, hi: 0xba}, - {value: 0x0024, lo: 0xbb, hi: 0xbf}, - // Block 0x1b, offset 0xce - {value: 0x0014, lo: 0x80, hi: 0x82}, - {value: 0x0010, lo: 0x83, hi: 0xb9}, - {value: 0x0014, lo: 0xba, hi: 0xba}, - {value: 0x0010, lo: 0xbb, hi: 0xbb}, - {value: 0x0034, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0x1c, offset 0xd4 - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x81, hi: 0x88}, - {value: 0x0010, lo: 0x89, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x8d}, - {value: 0x0010, lo: 0x8e, hi: 0x90}, - {value: 0x0024, lo: 0x91, hi: 0x91}, - {value: 0x0034, lo: 0x92, hi: 0x92}, - {value: 0x0024, lo: 0x93, hi: 0x94}, - {value: 0x0014, lo: 0x95, hi: 0x97}, - {value: 0x0010, lo: 0x98, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa3}, - {value: 0x0010, lo: 0xa6, hi: 0xaf}, - {value: 0x0014, lo: 0xb1, hi: 0xb1}, - {value: 0x0010, lo: 0xb2, hi: 0xbf}, - // Block 0x1d, offset 0xe2 - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x81, hi: 0x81}, - {value: 0x0010, lo: 0x82, hi: 0x83}, - {value: 0x0010, lo: 0x85, hi: 0x8c}, - {value: 0x0010, lo: 0x8f, hi: 0x90}, - {value: 0x0010, lo: 0x93, hi: 0xa8}, - {value: 0x0010, lo: 0xaa, hi: 0xb0}, - {value: 0x0010, lo: 0xb2, hi: 0xb2}, - {value: 0x0010, lo: 0xb6, hi: 0xb9}, - {value: 0x0034, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0x1e, offset 0xed - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x81, hi: 0x84}, - {value: 0x0010, lo: 0x87, hi: 0x88}, - {value: 0x0010, lo: 0x8b, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x8d}, - {value: 0x0010, lo: 0x8e, hi: 0x8e}, - {value: 0x0010, lo: 0x97, hi: 0x97}, - {value: 0x0010, lo: 0x9c, hi: 0x9d}, - {value: 0x0010, lo: 0x9f, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa3}, - {value: 0x0010, lo: 0xa6, hi: 0xb1}, - // Block 0x1f, offset 0xf8 - {value: 0x0014, lo: 0x81, hi: 0x82}, - {value: 0x0010, lo: 0x83, hi: 0x83}, - {value: 0x0010, lo: 0x85, hi: 0x8a}, - {value: 0x0010, lo: 0x8f, hi: 0x90}, - {value: 0x0010, lo: 0x93, hi: 0xa8}, - {value: 0x0010, lo: 0xaa, hi: 0xb0}, - {value: 0x0010, lo: 0xb2, hi: 0xb3}, - {value: 0x0010, lo: 0xb5, hi: 0xb6}, - {value: 0x0010, lo: 0xb8, hi: 0xb9}, - {value: 0x0034, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbe, hi: 0xbf}, - // Block 0x20, offset 0x103 - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x81, hi: 0x82}, - {value: 0x0014, lo: 0x87, hi: 0x88}, - {value: 0x0014, lo: 0x8b, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x8d}, - {value: 0x0014, lo: 0x91, hi: 0x91}, - {value: 0x0010, lo: 0x99, hi: 0x9c}, - {value: 0x0010, lo: 0x9e, hi: 0x9e}, - {value: 0x0010, lo: 0xa6, hi: 0xaf}, - {value: 0x0014, lo: 0xb0, hi: 0xb1}, - {value: 0x0010, lo: 0xb2, hi: 0xb4}, - {value: 0x0014, lo: 0xb5, hi: 0xb5}, - // Block 0x21, offset 0x10f - {value: 0x0014, lo: 0x81, hi: 0x82}, - {value: 0x0010, lo: 0x83, hi: 0x83}, - {value: 0x0010, lo: 0x85, hi: 0x8d}, - {value: 0x0010, lo: 0x8f, hi: 0x91}, - {value: 0x0010, lo: 0x93, hi: 0xa8}, - {value: 0x0010, lo: 0xaa, hi: 0xb0}, - {value: 0x0010, lo: 0xb2, hi: 0xb3}, - {value: 0x0010, lo: 0xb5, hi: 0xb9}, - {value: 0x0034, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0x22, offset 0x119 - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x81, hi: 0x85}, - {value: 0x0014, lo: 0x87, hi: 0x88}, - {value: 0x0010, lo: 0x89, hi: 0x89}, - {value: 0x0010, lo: 0x8b, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x8d}, - {value: 0x0010, lo: 0x90, hi: 0x90}, - {value: 0x0010, lo: 0xa0, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa3}, - {value: 0x0010, lo: 0xa6, hi: 0xaf}, - {value: 0x0010, lo: 0xb9, hi: 0xb9}, - // Block 0x23, offset 0x124 - {value: 0x0014, lo: 0x81, hi: 0x81}, - {value: 0x0010, lo: 0x82, hi: 0x83}, - {value: 0x0010, lo: 0x85, hi: 0x8c}, - {value: 0x0010, lo: 0x8f, hi: 0x90}, - {value: 0x0010, lo: 0x93, hi: 0xa8}, - {value: 0x0010, lo: 0xaa, hi: 0xb0}, - {value: 0x0010, lo: 0xb2, hi: 0xb3}, - {value: 0x0010, lo: 0xb5, hi: 0xb9}, - {value: 0x0034, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbd, hi: 0xbe}, - {value: 0x0014, lo: 0xbf, hi: 0xbf}, - // Block 0x24, offset 0x12f - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x81, hi: 0x84}, - {value: 0x0010, lo: 0x87, hi: 0x88}, - {value: 0x0010, lo: 0x8b, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x8d}, - {value: 0x0014, lo: 0x96, hi: 0x96}, - {value: 0x0010, lo: 0x97, hi: 0x97}, - {value: 0x0010, lo: 0x9c, hi: 0x9d}, - {value: 0x0010, lo: 0x9f, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa3}, - {value: 0x0010, lo: 0xa6, hi: 0xaf}, - {value: 0x0010, lo: 0xb1, hi: 0xb1}, - // Block 0x25, offset 0x13b - {value: 0x0014, lo: 0x82, hi: 0x82}, - {value: 0x0010, lo: 0x83, hi: 0x83}, - {value: 0x0010, lo: 0x85, hi: 0x8a}, - {value: 0x0010, lo: 0x8e, hi: 0x90}, - {value: 0x0010, lo: 0x92, hi: 0x95}, - {value: 0x0010, lo: 0x99, hi: 0x9a}, - {value: 0x0010, lo: 0x9c, hi: 0x9c}, - {value: 0x0010, lo: 0x9e, hi: 0x9f}, - {value: 0x0010, lo: 0xa3, hi: 0xa4}, - {value: 0x0010, lo: 0xa8, hi: 0xaa}, - {value: 0x0010, lo: 0xae, hi: 0xb9}, - {value: 0x0010, lo: 0xbe, hi: 0xbf}, - // Block 0x26, offset 0x147 - {value: 0x0014, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x81, hi: 0x82}, - {value: 0x0010, lo: 0x86, hi: 0x88}, - {value: 0x0010, lo: 0x8a, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x8d}, - {value: 0x0010, lo: 0x90, hi: 0x90}, - {value: 0x0010, lo: 0x97, hi: 0x97}, - {value: 0x0010, lo: 0xa6, hi: 0xaf}, - // Block 0x27, offset 0x14f - {value: 0x0014, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x81, hi: 0x83}, - {value: 0x0010, lo: 0x85, hi: 0x8c}, - {value: 0x0010, lo: 0x8e, hi: 0x90}, - {value: 0x0010, lo: 0x92, hi: 0xa8}, - {value: 0x0010, lo: 0xaa, hi: 0xb9}, - {value: 0x0010, lo: 0xbd, hi: 0xbd}, - {value: 0x0014, lo: 0xbe, hi: 0xbf}, - // Block 0x28, offset 0x157 - {value: 0x0014, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x81, hi: 0x84}, - {value: 0x0014, lo: 0x86, hi: 0x88}, - {value: 0x0014, lo: 0x8a, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x8d}, - {value: 0x0034, lo: 0x95, hi: 0x96}, - {value: 0x0010, lo: 0x98, hi: 0x9a}, - {value: 0x0010, lo: 0xa0, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa3}, - {value: 0x0010, lo: 0xa6, hi: 0xaf}, - // Block 0x29, offset 0x161 - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x81, hi: 0x81}, - {value: 0x0010, lo: 0x82, hi: 0x83}, - {value: 0x0010, lo: 0x85, hi: 0x8c}, - {value: 0x0010, lo: 0x8e, hi: 0x90}, - {value: 0x0010, lo: 0x92, hi: 0xa8}, - {value: 0x0010, lo: 0xaa, hi: 0xb3}, - {value: 0x0010, lo: 0xb5, hi: 0xb9}, - {value: 0x0034, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbd, hi: 0xbe}, - {value: 0x0014, lo: 0xbf, hi: 0xbf}, - // Block 0x2a, offset 0x16c - {value: 0x0010, lo: 0x80, hi: 0x84}, - {value: 0x0014, lo: 0x86, hi: 0x86}, - {value: 0x0010, lo: 0x87, hi: 0x88}, - {value: 0x0010, lo: 0x8a, hi: 0x8b}, - {value: 0x0014, lo: 0x8c, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x8d}, - {value: 0x0010, lo: 0x95, hi: 0x96}, - {value: 0x0010, lo: 0x9e, hi: 0x9e}, - {value: 0x0010, lo: 0xa0, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa3}, - {value: 0x0010, lo: 0xa6, hi: 0xaf}, - {value: 0x0010, lo: 0xb1, hi: 0xb2}, - // Block 0x2b, offset 0x178 - {value: 0x0014, lo: 0x81, hi: 0x81}, - {value: 0x0010, lo: 0x82, hi: 0x83}, - {value: 0x0010, lo: 0x85, hi: 0x8c}, - {value: 0x0010, lo: 0x8e, hi: 0x90}, - {value: 0x0010, lo: 0x92, hi: 0xba}, - {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0x2c, offset 0x17e - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x81, hi: 0x84}, - {value: 0x0010, lo: 0x86, hi: 0x88}, - {value: 0x0010, lo: 0x8a, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x8d}, - {value: 0x0010, lo: 0x8e, hi: 0x8e}, - {value: 0x0010, lo: 0x94, hi: 0x97}, - {value: 0x0010, lo: 0x9f, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa3}, - {value: 0x0010, lo: 0xa6, hi: 0xaf}, - {value: 0x0010, lo: 0xba, hi: 0xbf}, - // Block 0x2d, offset 0x189 - {value: 0x0010, lo: 0x82, hi: 0x83}, - {value: 0x0010, lo: 0x85, hi: 0x96}, - {value: 0x0010, lo: 0x9a, hi: 0xb1}, - {value: 0x0010, lo: 0xb3, hi: 0xbb}, - {value: 0x0010, lo: 0xbd, hi: 0xbd}, - // Block 0x2e, offset 0x18e - {value: 0x0010, lo: 0x80, hi: 0x86}, - {value: 0x0034, lo: 0x8a, hi: 0x8a}, - {value: 0x0010, lo: 0x8f, hi: 0x91}, - {value: 0x0014, lo: 0x92, hi: 0x94}, - {value: 0x0014, lo: 0x96, hi: 0x96}, - {value: 0x0010, lo: 0x98, hi: 0x9f}, - {value: 0x0010, lo: 0xa6, hi: 0xaf}, - {value: 0x0010, lo: 0xb2, hi: 0xb3}, - // Block 0x2f, offset 0x196 - {value: 0x0014, lo: 0xb1, hi: 0xb1}, - {value: 0x0014, lo: 0xb4, hi: 0xb7}, - {value: 0x0034, lo: 0xb8, hi: 0xba}, - // Block 0x30, offset 0x199 - {value: 0x0004, lo: 0x86, hi: 0x86}, - {value: 0x0014, lo: 0x87, hi: 0x87}, - {value: 0x0034, lo: 0x88, hi: 0x8b}, - {value: 0x0014, lo: 0x8c, hi: 0x8e}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - // Block 0x31, offset 0x19e - {value: 0x0014, lo: 0xb1, hi: 0xb1}, - {value: 0x0014, lo: 0xb4, hi: 0xb7}, - {value: 0x0034, lo: 0xb8, hi: 0xb9}, - {value: 0x0014, lo: 0xbb, hi: 0xbc}, - // Block 0x32, offset 0x1a2 - {value: 0x0004, lo: 0x86, hi: 0x86}, - {value: 0x0034, lo: 0x88, hi: 0x8b}, - {value: 0x0014, lo: 0x8c, hi: 0x8d}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - // Block 0x33, offset 0x1a6 - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0034, lo: 0x98, hi: 0x99}, - {value: 0x0010, lo: 0xa0, hi: 0xa9}, - {value: 0x0034, lo: 0xb5, hi: 0xb5}, - {value: 0x0034, lo: 0xb7, hi: 0xb7}, - {value: 0x0034, lo: 0xb9, hi: 0xb9}, - {value: 0x0010, lo: 0xbe, hi: 0xbf}, - // Block 0x34, offset 0x1ad - {value: 0x0010, lo: 0x80, hi: 0x87}, - {value: 0x0010, lo: 0x89, hi: 0xac}, - {value: 0x0034, lo: 0xb1, hi: 0xb2}, - {value: 0x0014, lo: 0xb3, hi: 0xb3}, - {value: 0x0034, lo: 0xb4, hi: 0xb4}, - {value: 0x0014, lo: 0xb5, hi: 0xb9}, - {value: 0x0034, lo: 0xba, hi: 0xbd}, - {value: 0x0014, lo: 0xbe, hi: 0xbe}, - {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0x35, offset 0x1b6 - {value: 0x0034, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x81, hi: 0x81}, - {value: 0x0024, lo: 0x82, hi: 0x83}, - {value: 0x0034, lo: 0x84, hi: 0x84}, - {value: 0x0024, lo: 0x86, hi: 0x87}, - {value: 0x0010, lo: 0x88, hi: 0x8c}, - {value: 0x0014, lo: 0x8d, hi: 0x97}, - {value: 0x0014, lo: 0x99, hi: 0xbc}, - // Block 0x36, offset 0x1be - {value: 0x0034, lo: 0x86, hi: 0x86}, - // Block 0x37, offset 0x1bf - {value: 0x0010, lo: 0xab, hi: 0xac}, - {value: 0x0014, lo: 0xad, hi: 0xb0}, - {value: 0x0010, lo: 0xb1, hi: 0xb1}, - {value: 0x0014, lo: 0xb2, hi: 0xb6}, - {value: 0x0034, lo: 0xb7, hi: 0xb7}, - {value: 0x0010, lo: 0xb8, hi: 0xb8}, - {value: 0x0034, lo: 0xb9, hi: 0xba}, - {value: 0x0010, lo: 0xbb, hi: 0xbc}, - {value: 0x0014, lo: 0xbd, hi: 0xbe}, - // Block 0x38, offset 0x1c8 - {value: 0x0010, lo: 0x80, hi: 0x89}, - {value: 0x0010, lo: 0x96, hi: 0x97}, - {value: 0x0014, lo: 0x98, hi: 0x99}, - {value: 0x0014, lo: 0x9e, hi: 0xa0}, - {value: 0x0010, lo: 0xa2, hi: 0xa4}, - {value: 0x0010, lo: 0xa7, hi: 0xad}, - {value: 0x0014, lo: 0xb1, hi: 0xb4}, - // Block 0x39, offset 0x1cf - {value: 0x0014, lo: 0x82, hi: 0x82}, - {value: 0x0010, lo: 0x83, hi: 0x84}, - {value: 0x0014, lo: 0x85, hi: 0x86}, - {value: 0x0010, lo: 0x87, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x8d}, - {value: 0x0010, lo: 0x8f, hi: 0x9c}, - {value: 0x0014, lo: 0x9d, hi: 0x9d}, - {value: 0x6c53, lo: 0xa0, hi: 0xbf}, - // Block 0x3a, offset 0x1d7 - {value: 0x7053, lo: 0x80, hi: 0x85}, - {value: 0x7053, lo: 0x87, hi: 0x87}, - {value: 0x7053, lo: 0x8d, hi: 0x8d}, - {value: 0x0010, lo: 0x90, hi: 0xba}, - {value: 0x0014, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0x3b, offset 0x1dd - {value: 0x0010, lo: 0x80, hi: 0x88}, - {value: 0x0010, lo: 0x8a, hi: 0x8d}, - {value: 0x0010, lo: 0x90, hi: 0x96}, - {value: 0x0010, lo: 0x98, hi: 0x98}, - {value: 0x0010, lo: 0x9a, hi: 0x9d}, - {value: 0x0010, lo: 0xa0, hi: 0xbf}, - // Block 0x3c, offset 0x1e3 - {value: 0x0010, lo: 0x80, hi: 0x88}, - {value: 0x0010, lo: 0x8a, hi: 0x8d}, - {value: 0x0010, lo: 0x90, hi: 0xb0}, - {value: 0x0010, lo: 0xb2, hi: 0xb5}, - {value: 0x0010, lo: 0xb8, hi: 0xbe}, - // Block 0x3d, offset 0x1e8 - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x82, hi: 0x85}, - {value: 0x0010, lo: 0x88, hi: 0x96}, - {value: 0x0010, lo: 0x98, hi: 0xbf}, - // Block 0x3e, offset 0x1ec - {value: 0x0010, lo: 0x80, hi: 0x90}, - {value: 0x0010, lo: 0x92, hi: 0x95}, - {value: 0x0010, lo: 0x98, hi: 0xbf}, - // Block 0x3f, offset 0x1ef - {value: 0x0010, lo: 0x80, hi: 0x9a}, - {value: 0x0024, lo: 0x9d, hi: 0x9f}, - // Block 0x40, offset 0x1f1 - {value: 0x0010, lo: 0x80, hi: 0x8f}, - {value: 0x7453, lo: 0xa0, hi: 0xaf}, - {value: 0x7853, lo: 0xb0, hi: 0xbf}, - // Block 0x41, offset 0x1f4 - {value: 0x7c53, lo: 0x80, hi: 0x8f}, - {value: 0x8053, lo: 0x90, hi: 0x9f}, - {value: 0x7c53, lo: 0xa0, hi: 0xaf}, - {value: 0x0813, lo: 0xb0, hi: 0xb5}, - {value: 0x0892, lo: 0xb8, hi: 0xbd}, - // Block 0x42, offset 0x1f9 - {value: 0x0010, lo: 0x81, hi: 0xbf}, - // Block 0x43, offset 0x1fa - {value: 0x0010, lo: 0x80, hi: 0xac}, - {value: 0x0010, lo: 0xaf, hi: 0xbf}, - // Block 0x44, offset 0x1fc - {value: 0x0010, lo: 0x81, hi: 0x9a}, - {value: 0x0010, lo: 0xa0, hi: 0xbf}, - // Block 0x45, offset 0x1fe - {value: 0x0010, lo: 0x80, hi: 0xaa}, - {value: 0x0010, lo: 0xae, hi: 0xb8}, - // Block 0x46, offset 0x200 - {value: 0x0010, lo: 0x80, hi: 0x8c}, - {value: 0x0010, lo: 0x8e, hi: 0x91}, - {value: 0x0014, lo: 0x92, hi: 0x93}, - {value: 0x0034, lo: 0x94, hi: 0x94}, - {value: 0x0010, lo: 0xa0, hi: 0xb1}, - {value: 0x0014, lo: 0xb2, hi: 0xb3}, - {value: 0x0034, lo: 0xb4, hi: 0xb4}, - // Block 0x47, offset 0x207 - {value: 0x0010, lo: 0x80, hi: 0x91}, - {value: 0x0014, lo: 0x92, hi: 0x93}, - {value: 0x0010, lo: 0xa0, hi: 0xac}, - {value: 0x0010, lo: 0xae, hi: 0xb0}, - {value: 0x0014, lo: 0xb2, hi: 0xb3}, - // Block 0x48, offset 0x20c - {value: 0x0014, lo: 0xb4, hi: 0xb5}, - {value: 0x0010, lo: 0xb6, hi: 0xb6}, - {value: 0x0014, lo: 0xb7, hi: 0xbd}, - {value: 0x0010, lo: 0xbe, hi: 0xbf}, - // Block 0x49, offset 0x210 - {value: 0x0010, lo: 0x80, hi: 0x85}, - {value: 0x0014, lo: 0x86, hi: 0x86}, - {value: 0x0010, lo: 0x87, hi: 0x88}, - {value: 0x0014, lo: 0x89, hi: 0x91}, - {value: 0x0034, lo: 0x92, hi: 0x92}, - {value: 0x0014, lo: 0x93, hi: 0x93}, - {value: 0x0004, lo: 0x97, hi: 0x97}, - {value: 0x0024, lo: 0x9d, hi: 0x9d}, - {value: 0x0010, lo: 0xa0, hi: 0xa9}, - // Block 0x4a, offset 0x219 - {value: 0x0014, lo: 0x8b, hi: 0x8e}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - {value: 0x0010, lo: 0xa0, hi: 0xbf}, - // Block 0x4b, offset 0x21c - {value: 0x0010, lo: 0x80, hi: 0x82}, - {value: 0x0014, lo: 0x83, hi: 0x83}, - {value: 0x0010, lo: 0x84, hi: 0xb7}, - // Block 0x4c, offset 0x21f - {value: 0x0010, lo: 0x80, hi: 0x84}, - {value: 0x0014, lo: 0x85, hi: 0x86}, - {value: 0x0010, lo: 0x87, hi: 0xa8}, - {value: 0x0034, lo: 0xa9, hi: 0xa9}, - {value: 0x0010, lo: 0xaa, hi: 0xaa}, - {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0x4d, offset 0x225 - {value: 0x0010, lo: 0x80, hi: 0xb5}, - // Block 0x4e, offset 0x226 - {value: 0x0010, lo: 0x80, hi: 0x9e}, - {value: 0x0014, lo: 0xa0, hi: 0xa2}, - {value: 0x0010, lo: 0xa3, hi: 0xa6}, - {value: 0x0014, lo: 0xa7, hi: 0xa8}, - {value: 0x0010, lo: 0xa9, hi: 0xab}, - {value: 0x0010, lo: 0xb0, hi: 0xb1}, - {value: 0x0014, lo: 0xb2, hi: 0xb2}, - {value: 0x0010, lo: 0xb3, hi: 0xb8}, - {value: 0x0034, lo: 0xb9, hi: 0xb9}, - {value: 0x0024, lo: 0xba, hi: 0xba}, - {value: 0x0034, lo: 0xbb, hi: 0xbb}, - // Block 0x4f, offset 0x231 - {value: 0x0010, lo: 0x86, hi: 0x8f}, - // Block 0x50, offset 0x232 - {value: 0x0010, lo: 0x90, hi: 0x99}, - // Block 0x51, offset 0x233 - {value: 0x0010, lo: 0x80, hi: 0x96}, - {value: 0x0024, lo: 0x97, hi: 0x97}, - {value: 0x0034, lo: 0x98, hi: 0x98}, - {value: 0x0010, lo: 0x99, hi: 0x9a}, - {value: 0x0014, lo: 0x9b, hi: 0x9b}, - // Block 0x52, offset 0x238 - {value: 0x0010, lo: 0x95, hi: 0x95}, - {value: 0x0014, lo: 0x96, hi: 0x96}, - {value: 0x0010, lo: 0x97, hi: 0x97}, - {value: 0x0014, lo: 0x98, hi: 0x9e}, - {value: 0x0034, lo: 0xa0, hi: 0xa0}, - {value: 0x0010, lo: 0xa1, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa2}, - {value: 0x0010, lo: 0xa3, hi: 0xa4}, - {value: 0x0014, lo: 0xa5, hi: 0xac}, - {value: 0x0010, lo: 0xad, hi: 0xb2}, - {value: 0x0014, lo: 0xb3, hi: 0xb4}, - {value: 0x0024, lo: 0xb5, hi: 0xbc}, - {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0x53, offset 0x245 - {value: 0x0010, lo: 0x80, hi: 0x89}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - {value: 0x0004, lo: 0xa7, hi: 0xa7}, - {value: 0x0024, lo: 0xb0, hi: 0xb4}, - {value: 0x0034, lo: 0xb5, hi: 0xba}, - {value: 0x0024, lo: 0xbb, hi: 0xbc}, - {value: 0x0034, lo: 0xbd, hi: 0xbd}, - {value: 0x0014, lo: 0xbe, hi: 0xbe}, - // Block 0x54, offset 0x24d - {value: 0x0014, lo: 0x80, hi: 0x83}, - {value: 0x0010, lo: 0x84, hi: 0xb3}, - {value: 0x0034, lo: 0xb4, hi: 0xb4}, - {value: 0x0010, lo: 0xb5, hi: 0xb5}, - {value: 0x0014, lo: 0xb6, hi: 0xba}, - {value: 0x0010, lo: 0xbb, hi: 0xbb}, - {value: 0x0014, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0x55, offset 0x255 - {value: 0x0010, lo: 0x80, hi: 0x81}, - {value: 0x0014, lo: 0x82, hi: 0x82}, - {value: 0x0010, lo: 0x83, hi: 0x83}, - {value: 0x0030, lo: 0x84, hi: 0x84}, - {value: 0x0010, lo: 0x85, hi: 0x8b}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - {value: 0x0024, lo: 0xab, hi: 0xab}, - {value: 0x0034, lo: 0xac, hi: 0xac}, - {value: 0x0024, lo: 0xad, hi: 0xb3}, - // Block 0x56, offset 0x25e - {value: 0x0014, lo: 0x80, hi: 0x81}, - {value: 0x0010, lo: 0x82, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa5}, - {value: 0x0010, lo: 0xa6, hi: 0xa7}, - {value: 0x0014, lo: 0xa8, hi: 0xa9}, - {value: 0x0030, lo: 0xaa, hi: 0xaa}, - {value: 0x0034, lo: 0xab, hi: 0xab}, - {value: 0x0014, lo: 0xac, hi: 0xad}, - {value: 0x0010, lo: 0xae, hi: 0xbf}, - // Block 0x57, offset 0x267 - {value: 0x0010, lo: 0x80, hi: 0xa5}, - {value: 0x0034, lo: 0xa6, hi: 0xa6}, - {value: 0x0010, lo: 0xa7, hi: 0xa7}, - {value: 0x0014, lo: 0xa8, hi: 0xa9}, - {value: 0x0010, lo: 0xaa, hi: 0xac}, - {value: 0x0014, lo: 0xad, hi: 0xad}, - {value: 0x0010, lo: 0xae, hi: 0xae}, - {value: 0x0014, lo: 0xaf, hi: 0xb1}, - {value: 0x0030, lo: 0xb2, hi: 0xb3}, - // Block 0x58, offset 0x270 - {value: 0x0010, lo: 0x80, hi: 0xab}, - {value: 0x0014, lo: 0xac, hi: 0xb3}, - {value: 0x0010, lo: 0xb4, hi: 0xb5}, - {value: 0x0014, lo: 0xb6, hi: 0xb6}, - {value: 0x0034, lo: 0xb7, hi: 0xb7}, - // Block 0x59, offset 0x275 - {value: 0x0010, lo: 0x80, hi: 0x89}, - {value: 0x0010, lo: 0x8d, hi: 0xb7}, - {value: 0x0014, lo: 0xb8, hi: 0xbd}, - // Block 0x5a, offset 0x278 - {value: 0x296a, lo: 0x80, hi: 0x80}, - {value: 0x2a2a, lo: 0x81, hi: 0x81}, - {value: 0x2aea, lo: 0x82, hi: 0x82}, - {value: 0x2baa, lo: 0x83, hi: 0x83}, - {value: 0x2c6a, lo: 0x84, hi: 0x84}, - {value: 0x2d2a, lo: 0x85, hi: 0x85}, - {value: 0x2dea, lo: 0x86, hi: 0x86}, - {value: 0x2eaa, lo: 0x87, hi: 0x87}, - {value: 0x2f6a, lo: 0x88, hi: 0x88}, - // Block 0x5b, offset 0x281 - {value: 0x0024, lo: 0x90, hi: 0x92}, - {value: 0x0034, lo: 0x94, hi: 0x99}, - {value: 0x0024, lo: 0x9a, hi: 0x9b}, - {value: 0x0034, lo: 0x9c, hi: 0x9f}, - {value: 0x0024, lo: 0xa0, hi: 0xa0}, - {value: 0x0010, lo: 0xa1, hi: 0xa1}, - {value: 0x0034, lo: 0xa2, hi: 0xa8}, - {value: 0x0010, lo: 0xa9, hi: 0xac}, - {value: 0x0034, lo: 0xad, hi: 0xad}, - {value: 0x0010, lo: 0xae, hi: 0xb3}, - {value: 0x0024, lo: 0xb4, hi: 0xb4}, - {value: 0x0010, lo: 0xb5, hi: 0xb6}, - {value: 0x0024, lo: 0xb8, hi: 0xb9}, - // Block 0x5c, offset 0x28e - {value: 0x0012, lo: 0x80, hi: 0xab}, - {value: 0x0015, lo: 0xac, hi: 0xbf}, - // Block 0x5d, offset 0x290 - {value: 0x0015, lo: 0x80, hi: 0xaa}, - {value: 0x0012, lo: 0xab, hi: 0xb7}, - {value: 0x0015, lo: 0xb8, hi: 0xb8}, - {value: 0x8452, lo: 0xb9, hi: 0xb9}, - {value: 0x0012, lo: 0xba, hi: 0xbc}, - {value: 0x8852, lo: 0xbd, hi: 0xbd}, - {value: 0x0012, lo: 0xbe, hi: 0xbf}, - // Block 0x5e, offset 0x297 - {value: 0x0012, lo: 0x80, hi: 0x9a}, - {value: 0x0015, lo: 0x9b, hi: 0xbf}, - // Block 0x5f, offset 0x299 - {value: 0x0024, lo: 0x80, hi: 0x81}, - {value: 0x0034, lo: 0x82, hi: 0x82}, - {value: 0x0024, lo: 0x83, hi: 0x89}, - {value: 0x0034, lo: 0x8a, hi: 0x8a}, - {value: 0x0024, lo: 0x8b, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x90}, - {value: 0x0024, lo: 0x91, hi: 0xb5}, - {value: 0x0024, lo: 0xbb, hi: 0xbb}, - {value: 0x0034, lo: 0xbc, hi: 0xbd}, - {value: 0x0024, lo: 0xbe, hi: 0xbe}, - {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0x60, offset 0x2a4 - {value: 0x0117, lo: 0x80, hi: 0xbf}, - // Block 0x61, offset 0x2a5 - {value: 0x0117, lo: 0x80, hi: 0x95}, - {value: 0x306a, lo: 0x96, hi: 0x96}, - {value: 0x316a, lo: 0x97, hi: 0x97}, - {value: 0x326a, lo: 0x98, hi: 0x98}, - {value: 0x336a, lo: 0x99, hi: 0x99}, - {value: 0x346a, lo: 0x9a, hi: 0x9a}, - {value: 0x356a, lo: 0x9b, hi: 0x9b}, - {value: 0x0012, lo: 0x9c, hi: 0x9d}, - {value: 0x366b, lo: 0x9e, hi: 0x9e}, - {value: 0x0012, lo: 0x9f, hi: 0x9f}, - {value: 0x0117, lo: 0xa0, hi: 0xbf}, - // Block 0x62, offset 0x2b0 - {value: 0x0812, lo: 0x80, hi: 0x87}, - {value: 0x0813, lo: 0x88, hi: 0x8f}, - {value: 0x0812, lo: 0x90, hi: 0x95}, - {value: 0x0813, lo: 0x98, hi: 0x9d}, - {value: 0x0812, lo: 0xa0, hi: 0xa7}, - {value: 0x0813, lo: 0xa8, hi: 0xaf}, - {value: 0x0812, lo: 0xb0, hi: 0xb7}, - {value: 0x0813, lo: 0xb8, hi: 0xbf}, - // Block 0x63, offset 0x2b8 - {value: 0x0004, lo: 0x8b, hi: 0x8b}, - {value: 0x0014, lo: 0x8c, hi: 0x8f}, - {value: 0x0054, lo: 0x98, hi: 0x99}, - {value: 0x0054, lo: 0xa4, hi: 0xa4}, - {value: 0x0054, lo: 0xa7, hi: 0xa7}, - {value: 0x0014, lo: 0xaa, hi: 0xae}, - {value: 0x0010, lo: 0xaf, hi: 0xaf}, - {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0x64, offset 0x2c0 - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x94, hi: 0x94}, - {value: 0x0014, lo: 0xa0, hi: 0xa4}, - {value: 0x0014, lo: 0xa6, hi: 0xaf}, - {value: 0x0015, lo: 0xb1, hi: 0xb1}, - {value: 0x0015, lo: 0xbf, hi: 0xbf}, - // Block 0x65, offset 0x2c6 - {value: 0x0015, lo: 0x90, hi: 0x9c}, - // Block 0x66, offset 0x2c7 - {value: 0x0024, lo: 0x90, hi: 0x91}, - {value: 0x0034, lo: 0x92, hi: 0x93}, - {value: 0x0024, lo: 0x94, hi: 0x97}, - {value: 0x0034, lo: 0x98, hi: 0x9a}, - {value: 0x0024, lo: 0x9b, hi: 0x9c}, - {value: 0x0014, lo: 0x9d, hi: 0xa0}, - {value: 0x0024, lo: 0xa1, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa4}, - {value: 0x0034, lo: 0xa5, hi: 0xa6}, - {value: 0x0024, lo: 0xa7, hi: 0xa7}, - {value: 0x0034, lo: 0xa8, hi: 0xa8}, - {value: 0x0024, lo: 0xa9, hi: 0xa9}, - {value: 0x0034, lo: 0xaa, hi: 0xaf}, - {value: 0x0024, lo: 0xb0, hi: 0xb0}, - // Block 0x67, offset 0x2d5 - {value: 0x0016, lo: 0x85, hi: 0x86}, - {value: 0x0012, lo: 0x87, hi: 0x89}, - {value: 0x9d52, lo: 0x8e, hi: 0x8e}, - {value: 0x1013, lo: 0xa0, hi: 0xaf}, - {value: 0x1012, lo: 0xb0, hi: 0xbf}, - // Block 0x68, offset 0x2da - {value: 0x0010, lo: 0x80, hi: 0x82}, - {value: 0x0716, lo: 0x83, hi: 0x84}, - {value: 0x0010, lo: 0x85, hi: 0x88}, - // Block 0x69, offset 0x2dd - {value: 0xa053, lo: 0xb6, hi: 0xb7}, - {value: 0xa353, lo: 0xb8, hi: 0xb9}, - {value: 0xa653, lo: 0xba, hi: 0xbb}, - {value: 0xa353, lo: 0xbc, hi: 0xbd}, - {value: 0xa053, lo: 0xbe, hi: 0xbf}, - // Block 0x6a, offset 0x2e2 - {value: 0x3013, lo: 0x80, hi: 0x8f}, - {value: 0x6553, lo: 0x90, hi: 0x9f}, - {value: 0xa953, lo: 0xa0, hi: 0xae}, - {value: 0x3012, lo: 0xb0, hi: 0xbf}, - // Block 0x6b, offset 0x2e6 - {value: 0x0117, lo: 0x80, hi: 0xa3}, - {value: 0x0012, lo: 0xa4, hi: 0xa4}, - {value: 0x0716, lo: 0xab, hi: 0xac}, - {value: 0x0316, lo: 0xad, hi: 0xae}, - {value: 0x0024, lo: 0xaf, hi: 0xb1}, - {value: 0x0117, lo: 0xb2, hi: 0xb3}, - // Block 0x6c, offset 0x2ec - {value: 0x6c52, lo: 0x80, hi: 0x9f}, - {value: 0x7052, lo: 0xa0, hi: 0xa5}, - {value: 0x7052, lo: 0xa7, hi: 0xa7}, - {value: 0x7052, lo: 0xad, hi: 0xad}, - {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0x6d, offset 0x2f1 - {value: 0x0010, lo: 0x80, hi: 0xa7}, - {value: 0x0014, lo: 0xaf, hi: 0xaf}, - {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0x6e, offset 0x2f4 - {value: 0x0010, lo: 0x80, hi: 0x96}, - {value: 0x0010, lo: 0xa0, hi: 0xa6}, - {value: 0x0010, lo: 0xa8, hi: 0xae}, - {value: 0x0010, lo: 0xb0, hi: 0xb6}, - {value: 0x0010, lo: 0xb8, hi: 0xbe}, - // Block 0x6f, offset 0x2f9 - {value: 0x0010, lo: 0x80, hi: 0x86}, - {value: 0x0010, lo: 0x88, hi: 0x8e}, - {value: 0x0010, lo: 0x90, hi: 0x96}, - {value: 0x0010, lo: 0x98, hi: 0x9e}, - {value: 0x0024, lo: 0xa0, hi: 0xbf}, - // Block 0x70, offset 0x2fe - {value: 0x0014, lo: 0xaf, hi: 0xaf}, - // Block 0x71, offset 0x2ff - {value: 0x0014, lo: 0x85, hi: 0x85}, - {value: 0x0034, lo: 0xaa, hi: 0xad}, - {value: 0x0030, lo: 0xae, hi: 0xaf}, - {value: 0x0004, lo: 0xb1, hi: 0xb5}, - {value: 0x0014, lo: 0xbb, hi: 0xbb}, - {value: 0x0010, lo: 0xbc, hi: 0xbc}, - // Block 0x72, offset 0x305 - {value: 0x0034, lo: 0x99, hi: 0x9a}, - {value: 0x0004, lo: 0x9b, hi: 0x9e}, - // Block 0x73, offset 0x307 - {value: 0x0004, lo: 0xbc, hi: 0xbe}, - // Block 0x74, offset 0x308 - {value: 0x0010, lo: 0x85, hi: 0xad}, - {value: 0x0010, lo: 0xb1, hi: 0xbf}, - // Block 0x75, offset 0x30a - {value: 0x0010, lo: 0x80, hi: 0x8e}, - {value: 0x0010, lo: 0xa0, hi: 0xba}, - // Block 0x76, offset 0x30c - {value: 0x0010, lo: 0x80, hi: 0x94}, - {value: 0x0014, lo: 0x95, hi: 0x95}, - {value: 0x0010, lo: 0x96, hi: 0xbf}, - // Block 0x77, offset 0x30f - {value: 0x0010, lo: 0x80, hi: 0x8c}, - // Block 0x78, offset 0x310 - {value: 0x0010, lo: 0x90, hi: 0xb7}, - {value: 0x0014, lo: 0xb8, hi: 0xbd}, - // Block 0x79, offset 0x312 - {value: 0x0010, lo: 0x80, hi: 0x8b}, - {value: 0x0014, lo: 0x8c, hi: 0x8c}, - {value: 0x0010, lo: 0x90, hi: 0xab}, - // Block 0x7a, offset 0x315 - {value: 0x0117, lo: 0x80, hi: 0xad}, - {value: 0x0010, lo: 0xae, hi: 0xae}, - {value: 0x0024, lo: 0xaf, hi: 0xaf}, - {value: 0x0014, lo: 0xb0, hi: 0xb2}, - {value: 0x0024, lo: 0xb4, hi: 0xbd}, - {value: 0x0014, lo: 0xbf, hi: 0xbf}, - // Block 0x7b, offset 0x31b - {value: 0x0117, lo: 0x80, hi: 0x9b}, - {value: 0x0015, lo: 0x9c, hi: 0x9d}, - {value: 0x0024, lo: 0x9e, hi: 0x9f}, - {value: 0x0010, lo: 0xa0, hi: 0xbf}, - // Block 0x7c, offset 0x31f - {value: 0x0010, lo: 0x80, hi: 0xaf}, - {value: 0x0024, lo: 0xb0, hi: 0xb1}, - // Block 0x7d, offset 0x321 - {value: 0x0004, lo: 0x80, hi: 0x96}, - {value: 0x0014, lo: 0x97, hi: 0x9f}, - {value: 0x0004, lo: 0xa0, hi: 0xa1}, - {value: 0x0117, lo: 0xa2, hi: 0xaf}, - {value: 0x0012, lo: 0xb0, hi: 0xb1}, - {value: 0x0117, lo: 0xb2, hi: 0xbf}, - // Block 0x7e, offset 0x327 - {value: 0x0117, lo: 0x80, hi: 0xaf}, - {value: 0x0015, lo: 0xb0, hi: 0xb0}, - {value: 0x0012, lo: 0xb1, hi: 0xb8}, - {value: 0x0316, lo: 0xb9, hi: 0xba}, - {value: 0x0716, lo: 0xbb, hi: 0xbc}, - {value: 0x8453, lo: 0xbd, hi: 0xbd}, - {value: 0x0117, lo: 0xbe, hi: 0xbf}, - // Block 0x7f, offset 0x32e - {value: 0x0010, lo: 0xb7, hi: 0xb7}, - {value: 0x0015, lo: 0xb8, hi: 0xb9}, - {value: 0x0012, lo: 0xba, hi: 0xba}, - {value: 0x0010, lo: 0xbb, hi: 0xbf}, - // Block 0x80, offset 0x332 - {value: 0x0010, lo: 0x80, hi: 0x81}, - {value: 0x0014, lo: 0x82, hi: 0x82}, - {value: 0x0010, lo: 0x83, hi: 0x85}, - {value: 0x0034, lo: 0x86, hi: 0x86}, - {value: 0x0010, lo: 0x87, hi: 0x8a}, - {value: 0x0014, lo: 0x8b, hi: 0x8b}, - {value: 0x0010, lo: 0x8c, hi: 0xa4}, - {value: 0x0014, lo: 0xa5, hi: 0xa6}, - {value: 0x0010, lo: 0xa7, hi: 0xa7}, - // Block 0x81, offset 0x33b - {value: 0x0010, lo: 0x80, hi: 0xb3}, - // Block 0x82, offset 0x33c - {value: 0x0010, lo: 0x80, hi: 0x83}, - {value: 0x0034, lo: 0x84, hi: 0x84}, - {value: 0x0014, lo: 0x85, hi: 0x85}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - {value: 0x0024, lo: 0xa0, hi: 0xb1}, - {value: 0x0010, lo: 0xb2, hi: 0xb7}, - {value: 0x0010, lo: 0xbb, hi: 0xbb}, - {value: 0x0010, lo: 0xbd, hi: 0xbd}, - // Block 0x83, offset 0x344 - {value: 0x0010, lo: 0x80, hi: 0xa5}, - {value: 0x0014, lo: 0xa6, hi: 0xaa}, - {value: 0x0034, lo: 0xab, hi: 0xad}, - {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0x84, offset 0x348 - {value: 0x0010, lo: 0x80, hi: 0x86}, - {value: 0x0014, lo: 0x87, hi: 0x91}, - {value: 0x0010, lo: 0x92, hi: 0x92}, - {value: 0x0030, lo: 0x93, hi: 0x93}, - {value: 0x0010, lo: 0xa0, hi: 0xbc}, - // Block 0x85, offset 0x34d - {value: 0x0014, lo: 0x80, hi: 0x82}, - {value: 0x0010, lo: 0x83, hi: 0xb2}, - {value: 0x0034, lo: 0xb3, hi: 0xb3}, - {value: 0x0010, lo: 0xb4, hi: 0xb5}, - {value: 0x0014, lo: 0xb6, hi: 0xb9}, - {value: 0x0010, lo: 0xba, hi: 0xbb}, - {value: 0x0014, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0x86, offset 0x355 - {value: 0x0030, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x8f, hi: 0x8f}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - {value: 0x0014, lo: 0xa5, hi: 0xa5}, - {value: 0x0004, lo: 0xa6, hi: 0xa6}, - {value: 0x0010, lo: 0xb0, hi: 0xb9}, - // Block 0x87, offset 0x35b - {value: 0x0010, lo: 0x80, hi: 0xa8}, - {value: 0x0014, lo: 0xa9, hi: 0xae}, - {value: 0x0010, lo: 0xaf, hi: 0xb0}, - {value: 0x0014, lo: 0xb1, hi: 0xb2}, - {value: 0x0010, lo: 0xb3, hi: 0xb4}, - {value: 0x0014, lo: 0xb5, hi: 0xb6}, - // Block 0x88, offset 0x361 - {value: 0x0010, lo: 0x80, hi: 0x82}, - {value: 0x0014, lo: 0x83, hi: 0x83}, - {value: 0x0010, lo: 0x84, hi: 0x8b}, - {value: 0x0014, lo: 0x8c, hi: 0x8c}, - {value: 0x0010, lo: 0x8d, hi: 0x8d}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - {value: 0x0004, lo: 0xb0, hi: 0xb0}, - {value: 0x0010, lo: 0xbb, hi: 0xbb}, - {value: 0x0014, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbd, hi: 0xbd}, - // Block 0x89, offset 0x36b - {value: 0x0024, lo: 0xb0, hi: 0xb0}, - {value: 0x0024, lo: 0xb2, hi: 0xb3}, - {value: 0x0034, lo: 0xb4, hi: 0xb4}, - {value: 0x0024, lo: 0xb7, hi: 0xb8}, - {value: 0x0024, lo: 0xbe, hi: 0xbf}, - // Block 0x8a, offset 0x370 - {value: 0x0024, lo: 0x81, hi: 0x81}, - {value: 0x0004, lo: 0x9d, hi: 0x9d}, - {value: 0x0010, lo: 0xa0, hi: 0xab}, - {value: 0x0014, lo: 0xac, hi: 0xad}, - {value: 0x0010, lo: 0xae, hi: 0xaf}, - {value: 0x0010, lo: 0xb2, hi: 0xb2}, - {value: 0x0014, lo: 0xb3, hi: 0xb4}, - {value: 0x0010, lo: 0xb5, hi: 0xb5}, - {value: 0x0034, lo: 0xb6, hi: 0xb6}, - // Block 0x8b, offset 0x379 - {value: 0x0010, lo: 0x81, hi: 0x86}, - {value: 0x0010, lo: 0x89, hi: 0x8e}, - {value: 0x0010, lo: 0x91, hi: 0x96}, - {value: 0x0010, lo: 0xa0, hi: 0xa6}, - {value: 0x0010, lo: 0xa8, hi: 0xae}, - {value: 0x0012, lo: 0xb0, hi: 0xbf}, - // Block 0x8c, offset 0x37f - {value: 0x0012, lo: 0x80, hi: 0x92}, - {value: 0xac52, lo: 0x93, hi: 0x93}, - {value: 0x0012, lo: 0x94, hi: 0x9a}, - {value: 0x0004, lo: 0x9b, hi: 0x9b}, - {value: 0x0015, lo: 0x9c, hi: 0x9f}, - {value: 0x0012, lo: 0xa0, hi: 0xa5}, - {value: 0x74d2, lo: 0xb0, hi: 0xbf}, - // Block 0x8d, offset 0x386 - {value: 0x78d2, lo: 0x80, hi: 0x8f}, - {value: 0x7cd2, lo: 0x90, hi: 0x9f}, - {value: 0x80d2, lo: 0xa0, hi: 0xaf}, - {value: 0x7cd2, lo: 0xb0, hi: 0xbf}, - // Block 0x8e, offset 0x38a - {value: 0x0010, lo: 0x80, hi: 0xa4}, - {value: 0x0014, lo: 0xa5, hi: 0xa5}, - {value: 0x0010, lo: 0xa6, hi: 0xa7}, - {value: 0x0014, lo: 0xa8, hi: 0xa8}, - {value: 0x0010, lo: 0xa9, hi: 0xaa}, - {value: 0x0010, lo: 0xac, hi: 0xac}, - {value: 0x0034, lo: 0xad, hi: 0xad}, - {value: 0x0010, lo: 0xb0, hi: 0xb9}, - // Block 0x8f, offset 0x392 - {value: 0x0010, lo: 0x80, hi: 0xa3}, - {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0x90, offset 0x394 - {value: 0x0010, lo: 0x80, hi: 0x86}, - {value: 0x0010, lo: 0x8b, hi: 0xbb}, - // Block 0x91, offset 0x396 - {value: 0x0010, lo: 0x80, hi: 0x81}, - {value: 0x0010, lo: 0x83, hi: 0x84}, - {value: 0x0010, lo: 0x86, hi: 0xbf}, - // Block 0x92, offset 0x399 - {value: 0x0010, lo: 0x80, hi: 0xb1}, - {value: 0x0004, lo: 0xb2, hi: 0xbf}, - // Block 0x93, offset 0x39b - {value: 0x0004, lo: 0x80, hi: 0x81}, - {value: 0x0010, lo: 0x93, hi: 0xbf}, - // Block 0x94, offset 0x39d - {value: 0x0010, lo: 0x80, hi: 0xbd}, - // Block 0x95, offset 0x39e - {value: 0x0010, lo: 0x90, hi: 0xbf}, - // Block 0x96, offset 0x39f - {value: 0x0010, lo: 0x80, hi: 0x8f}, - {value: 0x0010, lo: 0x92, hi: 0xbf}, - // Block 0x97, offset 0x3a1 - {value: 0x0010, lo: 0x80, hi: 0x87}, - {value: 0x0010, lo: 0xb0, hi: 0xbb}, - // Block 0x98, offset 0x3a3 - {value: 0x0014, lo: 0x80, hi: 0x8f}, - {value: 0x0054, lo: 0x93, hi: 0x93}, - {value: 0x0024, lo: 0xa0, hi: 0xa6}, - {value: 0x0034, lo: 0xa7, hi: 0xad}, - {value: 0x0024, lo: 0xae, hi: 0xaf}, - {value: 0x0010, lo: 0xb3, hi: 0xb4}, - // Block 0x99, offset 0x3a9 - {value: 0x0010, lo: 0x8d, hi: 0x8f}, - {value: 0x0054, lo: 0x92, hi: 0x92}, - {value: 0x0054, lo: 0x95, hi: 0x95}, - {value: 0x0010, lo: 0xb0, hi: 0xb4}, - {value: 0x0010, lo: 0xb6, hi: 0xbf}, - // Block 0x9a, offset 0x3ae - {value: 0x0010, lo: 0x80, hi: 0xbc}, - {value: 0x0014, lo: 0xbf, hi: 0xbf}, - // Block 0x9b, offset 0x3b0 - {value: 0x0054, lo: 0x87, hi: 0x87}, - {value: 0x0054, lo: 0x8e, hi: 0x8e}, - {value: 0x0054, lo: 0x9a, hi: 0x9a}, - {value: 0x5f53, lo: 0xa1, hi: 0xba}, - {value: 0x0004, lo: 0xbe, hi: 0xbe}, - {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0x9c, offset 0x3b6 - {value: 0x0004, lo: 0x80, hi: 0x80}, - {value: 0x5f52, lo: 0x81, hi: 0x9a}, - {value: 0x0004, lo: 0xb0, hi: 0xb0}, - // Block 0x9d, offset 0x3b9 - {value: 0x0014, lo: 0x9e, hi: 0x9f}, - {value: 0x0010, lo: 0xa0, hi: 0xbe}, - // Block 0x9e, offset 0x3bb - {value: 0x0010, lo: 0x82, hi: 0x87}, - {value: 0x0010, lo: 0x8a, hi: 0x8f}, - {value: 0x0010, lo: 0x92, hi: 0x97}, - {value: 0x0010, lo: 0x9a, hi: 0x9c}, - {value: 0x0004, lo: 0xa3, hi: 0xa3}, - {value: 0x0014, lo: 0xb9, hi: 0xbb}, - // Block 0x9f, offset 0x3c1 - {value: 0x0010, lo: 0x80, hi: 0x8b}, - {value: 0x0010, lo: 0x8d, hi: 0xa6}, - {value: 0x0010, lo: 0xa8, hi: 0xba}, - {value: 0x0010, lo: 0xbc, hi: 0xbd}, - {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0xa0, offset 0x3c6 - {value: 0x0010, lo: 0x80, hi: 0x8d}, - {value: 0x0010, lo: 0x90, hi: 0x9d}, - // Block 0xa1, offset 0x3c8 - {value: 0x0010, lo: 0x80, hi: 0xba}, - // Block 0xa2, offset 0x3c9 - {value: 0x0010, lo: 0x80, hi: 0xb4}, - // Block 0xa3, offset 0x3ca - {value: 0x0034, lo: 0xbd, hi: 0xbd}, - // Block 0xa4, offset 0x3cb - {value: 0x0010, lo: 0x80, hi: 0x9c}, - {value: 0x0010, lo: 0xa0, hi: 0xbf}, - // Block 0xa5, offset 0x3cd - {value: 0x0010, lo: 0x80, hi: 0x90}, - {value: 0x0034, lo: 0xa0, hi: 0xa0}, - // Block 0xa6, offset 0x3cf - {value: 0x0010, lo: 0x80, hi: 0x9f}, - {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0xa7, offset 0x3d1 - {value: 0x0010, lo: 0x80, hi: 0x8a}, - {value: 0x0010, lo: 0x90, hi: 0xb5}, - {value: 0x0024, lo: 0xb6, hi: 0xba}, - // Block 0xa8, offset 0x3d4 - {value: 0x0010, lo: 0x80, hi: 0x9d}, - {value: 0x0010, lo: 0xa0, hi: 0xbf}, - // Block 0xa9, offset 0x3d6 - {value: 0x0010, lo: 0x80, hi: 0x83}, - {value: 0x0010, lo: 0x88, hi: 0x8f}, - {value: 0x0010, lo: 0x91, hi: 0x95}, - // Block 0xaa, offset 0x3d9 - {value: 0x2813, lo: 0x80, hi: 0x87}, - {value: 0x3813, lo: 0x88, hi: 0x8f}, - {value: 0x2813, lo: 0x90, hi: 0x97}, - {value: 0xaf53, lo: 0x98, hi: 0x9f}, - {value: 0xb253, lo: 0xa0, hi: 0xa7}, - {value: 0x2812, lo: 0xa8, hi: 0xaf}, - {value: 0x3812, lo: 0xb0, hi: 0xb7}, - {value: 0x2812, lo: 0xb8, hi: 0xbf}, - // Block 0xab, offset 0x3e1 - {value: 0xaf52, lo: 0x80, hi: 0x87}, - {value: 0xb252, lo: 0x88, hi: 0x8f}, - {value: 0x0010, lo: 0x90, hi: 0xbf}, - // Block 0xac, offset 0x3e4 - {value: 0x0010, lo: 0x80, hi: 0x9d}, - {value: 0x0010, lo: 0xa0, hi: 0xa9}, - {value: 0xb253, lo: 0xb0, hi: 0xb7}, - {value: 0xaf53, lo: 0xb8, hi: 0xbf}, - // Block 0xad, offset 0x3e8 - {value: 0x2813, lo: 0x80, hi: 0x87}, - {value: 0x3813, lo: 0x88, hi: 0x8f}, - {value: 0x2813, lo: 0x90, hi: 0x93}, - {value: 0xb252, lo: 0x98, hi: 0x9f}, - {value: 0xaf52, lo: 0xa0, hi: 0xa7}, - {value: 0x2812, lo: 0xa8, hi: 0xaf}, - {value: 0x3812, lo: 0xb0, hi: 0xb7}, - {value: 0x2812, lo: 0xb8, hi: 0xbb}, - // Block 0xae, offset 0x3f0 - {value: 0x0010, lo: 0x80, hi: 0xa7}, - {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0xaf, offset 0x3f2 - {value: 0x0010, lo: 0x80, hi: 0xa3}, - // Block 0xb0, offset 0x3f3 - {value: 0x0010, lo: 0x80, hi: 0xb6}, - // Block 0xb1, offset 0x3f4 - {value: 0x0010, lo: 0x80, hi: 0x95}, - {value: 0x0010, lo: 0xa0, hi: 0xa7}, - // Block 0xb2, offset 0x3f6 - {value: 0x0010, lo: 0x80, hi: 0x85}, - {value: 0x0010, lo: 0x88, hi: 0x88}, - {value: 0x0010, lo: 0x8a, hi: 0xb5}, - {value: 0x0010, lo: 0xb7, hi: 0xb8}, - {value: 0x0010, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0xb3, offset 0x3fc - {value: 0x0010, lo: 0x80, hi: 0x95}, - {value: 0x0010, lo: 0xa0, hi: 0xb6}, - // Block 0xb4, offset 0x3fe - {value: 0x0010, lo: 0x80, hi: 0x9e}, - // Block 0xb5, offset 0x3ff - {value: 0x0010, lo: 0xa0, hi: 0xb2}, - {value: 0x0010, lo: 0xb4, hi: 0xb5}, - // Block 0xb6, offset 0x401 - {value: 0x0010, lo: 0x80, hi: 0x95}, - {value: 0x0010, lo: 0xa0, hi: 0xb9}, - // Block 0xb7, offset 0x403 - {value: 0x0010, lo: 0x80, hi: 0xb7}, - {value: 0x0010, lo: 0xbe, hi: 0xbf}, - // Block 0xb8, offset 0x405 - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x81, hi: 0x83}, - {value: 0x0014, lo: 0x85, hi: 0x86}, - {value: 0x0014, lo: 0x8c, hi: 0x8c}, - {value: 0x0034, lo: 0x8d, hi: 0x8d}, - {value: 0x0014, lo: 0x8e, hi: 0x8e}, - {value: 0x0024, lo: 0x8f, hi: 0x8f}, - {value: 0x0010, lo: 0x90, hi: 0x93}, - {value: 0x0010, lo: 0x95, hi: 0x97}, - {value: 0x0010, lo: 0x99, hi: 0xb3}, - {value: 0x0024, lo: 0xb8, hi: 0xb8}, - {value: 0x0034, lo: 0xb9, hi: 0xba}, - {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0xb9, offset 0x412 - {value: 0x0010, lo: 0xa0, hi: 0xbc}, - // Block 0xba, offset 0x413 - {value: 0x0010, lo: 0x80, hi: 0x9c}, - // Block 0xbb, offset 0x414 - {value: 0x0010, lo: 0x80, hi: 0x87}, - {value: 0x0010, lo: 0x89, hi: 0xa4}, - {value: 0x0024, lo: 0xa5, hi: 0xa5}, - {value: 0x0034, lo: 0xa6, hi: 0xa6}, - // Block 0xbc, offset 0x418 - {value: 0x0010, lo: 0x80, hi: 0x95}, - {value: 0x0010, lo: 0xa0, hi: 0xb2}, - // Block 0xbd, offset 0x41a - {value: 0x0010, lo: 0x80, hi: 0x91}, - // Block 0xbe, offset 0x41b - {value: 0x0010, lo: 0x80, hi: 0x88}, - // Block 0xbf, offset 0x41c - {value: 0x5653, lo: 0x80, hi: 0xb2}, - // Block 0xc0, offset 0x41d - {value: 0x5652, lo: 0x80, hi: 0xb2}, - // Block 0xc1, offset 0x41e - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0014, lo: 0x81, hi: 0x81}, - {value: 0x0010, lo: 0x82, hi: 0xb7}, - {value: 0x0014, lo: 0xb8, hi: 0xbf}, - // Block 0xc2, offset 0x422 - {value: 0x0014, lo: 0x80, hi: 0x85}, - {value: 0x0034, lo: 0x86, hi: 0x86}, - {value: 0x0010, lo: 0xa6, hi: 0xaf}, - {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0xc3, offset 0x426 - {value: 0x0014, lo: 0x80, hi: 0x81}, - {value: 0x0010, lo: 0x82, hi: 0xb2}, - {value: 0x0014, lo: 0xb3, hi: 0xb6}, - {value: 0x0010, lo: 0xb7, hi: 0xb8}, - {value: 0x0034, lo: 0xb9, hi: 0xba}, - {value: 0x0014, lo: 0xbd, hi: 0xbd}, - // Block 0xc4, offset 0x42c - {value: 0x0010, lo: 0x90, hi: 0xa8}, - {value: 0x0010, lo: 0xb0, hi: 0xb9}, - // Block 0xc5, offset 0x42e - {value: 0x0024, lo: 0x80, hi: 0x82}, - {value: 0x0010, lo: 0x83, hi: 0xa6}, - {value: 0x0014, lo: 0xa7, hi: 0xab}, - {value: 0x0010, lo: 0xac, hi: 0xac}, - {value: 0x0014, lo: 0xad, hi: 0xb2}, - {value: 0x0034, lo: 0xb3, hi: 0xb4}, - {value: 0x0010, lo: 0xb6, hi: 0xbf}, - // Block 0xc6, offset 0x435 - {value: 0x0010, lo: 0x90, hi: 0xb2}, - {value: 0x0034, lo: 0xb3, hi: 0xb3}, - {value: 0x0010, lo: 0xb6, hi: 0xb6}, - // Block 0xc7, offset 0x438 - {value: 0x0014, lo: 0x80, hi: 0x81}, - {value: 0x0010, lo: 0x82, hi: 0xb5}, - {value: 0x0014, lo: 0xb6, hi: 0xbe}, - {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0xc8, offset 0x43c - {value: 0x0030, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x81, hi: 0x84}, - {value: 0x0034, lo: 0x8a, hi: 0x8a}, - {value: 0x0014, lo: 0x8b, hi: 0x8c}, - {value: 0x0010, lo: 0x90, hi: 0x9a}, - {value: 0x0010, lo: 0x9c, hi: 0x9c}, - // Block 0xc9, offset 0x442 - {value: 0x0010, lo: 0x80, hi: 0x91}, - {value: 0x0010, lo: 0x93, hi: 0xae}, - {value: 0x0014, lo: 0xaf, hi: 0xb1}, - {value: 0x0010, lo: 0xb2, hi: 0xb3}, - {value: 0x0014, lo: 0xb4, hi: 0xb4}, - {value: 0x0030, lo: 0xb5, hi: 0xb5}, - {value: 0x0034, lo: 0xb6, hi: 0xb6}, - {value: 0x0014, lo: 0xb7, hi: 0xb7}, - {value: 0x0014, lo: 0xbe, hi: 0xbe}, - // Block 0xca, offset 0x44b - {value: 0x0010, lo: 0x80, hi: 0x86}, - {value: 0x0010, lo: 0x88, hi: 0x88}, - {value: 0x0010, lo: 0x8a, hi: 0x8d}, - {value: 0x0010, lo: 0x8f, hi: 0x9d}, - {value: 0x0010, lo: 0x9f, hi: 0xa8}, - {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0xcb, offset 0x451 - {value: 0x0010, lo: 0x80, hi: 0x9e}, - {value: 0x0014, lo: 0x9f, hi: 0x9f}, - {value: 0x0010, lo: 0xa0, hi: 0xa2}, - {value: 0x0014, lo: 0xa3, hi: 0xa8}, - {value: 0x0034, lo: 0xa9, hi: 0xaa}, - {value: 0x0010, lo: 0xb0, hi: 0xb9}, - // Block 0xcc, offset 0x457 - {value: 0x0014, lo: 0x80, hi: 0x81}, - {value: 0x0010, lo: 0x82, hi: 0x83}, - {value: 0x0010, lo: 0x85, hi: 0x8c}, - {value: 0x0010, lo: 0x8f, hi: 0x90}, - {value: 0x0010, lo: 0x93, hi: 0xa8}, - {value: 0x0010, lo: 0xaa, hi: 0xb0}, - {value: 0x0010, lo: 0xb2, hi: 0xb3}, - {value: 0x0010, lo: 0xb5, hi: 0xb9}, - {value: 0x0034, lo: 0xbc, hi: 0xbc}, - {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0xcd, offset 0x461 - {value: 0x0014, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x81, hi: 0x84}, - {value: 0x0010, lo: 0x87, hi: 0x88}, - {value: 0x0010, lo: 0x8b, hi: 0x8c}, - {value: 0x0030, lo: 0x8d, hi: 0x8d}, - {value: 0x0010, lo: 0x90, hi: 0x90}, - {value: 0x0010, lo: 0x97, hi: 0x97}, - {value: 0x0010, lo: 0x9d, hi: 0xa3}, - {value: 0x0024, lo: 0xa6, hi: 0xac}, - {value: 0x0024, lo: 0xb0, hi: 0xb4}, - // Block 0xce, offset 0x46b - {value: 0x0010, lo: 0x80, hi: 0xb7}, - {value: 0x0014, lo: 0xb8, hi: 0xbf}, - // Block 0xcf, offset 0x46d - {value: 0x0010, lo: 0x80, hi: 0x81}, - {value: 0x0034, lo: 0x82, hi: 0x82}, - {value: 0x0014, lo: 0x83, hi: 0x84}, - {value: 0x0010, lo: 0x85, hi: 0x85}, - {value: 0x0034, lo: 0x86, hi: 0x86}, - {value: 0x0010, lo: 0x87, hi: 0x8a}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - // Block 0xd0, offset 0x474 - {value: 0x0010, lo: 0x80, hi: 0xb2}, - {value: 0x0014, lo: 0xb3, hi: 0xb8}, - {value: 0x0010, lo: 0xb9, hi: 0xb9}, - {value: 0x0014, lo: 0xba, hi: 0xba}, - {value: 0x0010, lo: 0xbb, hi: 0xbe}, - {value: 0x0014, lo: 0xbf, hi: 0xbf}, - // Block 0xd1, offset 0x47a - {value: 0x0014, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x81, hi: 0x81}, - {value: 0x0034, lo: 0x82, hi: 0x83}, - {value: 0x0010, lo: 0x84, hi: 0x85}, - {value: 0x0010, lo: 0x87, hi: 0x87}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - // Block 0xd2, offset 0x480 - {value: 0x0010, lo: 0x80, hi: 0xb1}, - {value: 0x0014, lo: 0xb2, hi: 0xb5}, - {value: 0x0010, lo: 0xb8, hi: 0xbb}, - {value: 0x0014, lo: 0xbc, hi: 0xbd}, - {value: 0x0010, lo: 0xbe, hi: 0xbe}, - {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0xd3, offset 0x486 - {value: 0x0034, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x98, hi: 0x9b}, - {value: 0x0014, lo: 0x9c, hi: 0x9d}, - // Block 0xd4, offset 0x489 - {value: 0x0010, lo: 0x80, hi: 0xb2}, - {value: 0x0014, lo: 0xb3, hi: 0xba}, - {value: 0x0010, lo: 0xbb, hi: 0xbc}, - {value: 0x0014, lo: 0xbd, hi: 0xbd}, - {value: 0x0010, lo: 0xbe, hi: 0xbe}, - {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0xd5, offset 0x48f - {value: 0x0014, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x84, hi: 0x84}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - // Block 0xd6, offset 0x492 - {value: 0x0010, lo: 0x80, hi: 0xaa}, - {value: 0x0014, lo: 0xab, hi: 0xab}, - {value: 0x0010, lo: 0xac, hi: 0xac}, - {value: 0x0014, lo: 0xad, hi: 0xad}, - {value: 0x0010, lo: 0xae, hi: 0xaf}, - {value: 0x0014, lo: 0xb0, hi: 0xb5}, - {value: 0x0030, lo: 0xb6, hi: 0xb6}, - {value: 0x0034, lo: 0xb7, hi: 0xb7}, - // Block 0xd7, offset 0x49a - {value: 0x0010, lo: 0x80, hi: 0x89}, - // Block 0xd8, offset 0x49b - {value: 0x0014, lo: 0x9d, hi: 0x9f}, - {value: 0x0010, lo: 0xa0, hi: 0xa1}, - {value: 0x0014, lo: 0xa2, hi: 0xa5}, - {value: 0x0010, lo: 0xa6, hi: 0xa6}, - {value: 0x0014, lo: 0xa7, hi: 0xaa}, - {value: 0x0034, lo: 0xab, hi: 0xab}, - {value: 0x0010, lo: 0xb0, hi: 0xb9}, - // Block 0xd9, offset 0x4a2 - {value: 0x5f53, lo: 0xa0, hi: 0xbf}, - // Block 0xda, offset 0x4a3 - {value: 0x5f52, lo: 0x80, hi: 0x9f}, - {value: 0x0010, lo: 0xa0, hi: 0xa9}, - {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0xdb, offset 0x4a6 - {value: 0x0010, lo: 0x80, hi: 0xb8}, - // Block 0xdc, offset 0x4a7 - {value: 0x0010, lo: 0x80, hi: 0x88}, - {value: 0x0010, lo: 0x8a, hi: 0xaf}, - {value: 0x0014, lo: 0xb0, hi: 0xb6}, - {value: 0x0014, lo: 0xb8, hi: 0xbd}, - {value: 0x0010, lo: 0xbe, hi: 0xbe}, - {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0xdd, offset 0x4ad - {value: 0x0010, lo: 0x80, hi: 0x80}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - {value: 0x0010, lo: 0xb2, hi: 0xbf}, - // Block 0xde, offset 0x4b0 - {value: 0x0010, lo: 0x80, hi: 0x8f}, - {value: 0x0014, lo: 0x92, hi: 0xa7}, - {value: 0x0010, lo: 0xa9, hi: 0xa9}, - {value: 0x0014, lo: 0xaa, hi: 0xb0}, - {value: 0x0010, lo: 0xb1, hi: 0xb1}, - {value: 0x0014, lo: 0xb2, hi: 0xb3}, - {value: 0x0010, lo: 0xb4, hi: 0xb4}, - {value: 0x0014, lo: 0xb5, hi: 0xb6}, - // Block 0xdf, offset 0x4b8 - {value: 0x0010, lo: 0x80, hi: 0x99}, - // Block 0xe0, offset 0x4b9 - {value: 0x0010, lo: 0x80, hi: 0xae}, - // Block 0xe1, offset 0x4ba - {value: 0x0010, lo: 0x80, hi: 0x83}, - // Block 0xe2, offset 0x4bb - {value: 0x0010, lo: 0x80, hi: 0x86}, - // Block 0xe3, offset 0x4bc - {value: 0x0010, lo: 0x80, hi: 0x9e}, - {value: 0x0010, lo: 0xa0, hi: 0xa9}, - // Block 0xe4, offset 0x4be - {value: 0x0010, lo: 0x90, hi: 0xad}, - {value: 0x0034, lo: 0xb0, hi: 0xb4}, - // Block 0xe5, offset 0x4c0 - {value: 0x0010, lo: 0x80, hi: 0xaf}, - {value: 0x0024, lo: 0xb0, hi: 0xb6}, - // Block 0xe6, offset 0x4c2 - {value: 0x0014, lo: 0x80, hi: 0x83}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - {value: 0x0010, lo: 0xa3, hi: 0xb7}, - {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0xe7, offset 0x4c6 - {value: 0x0010, lo: 0x80, hi: 0x8f}, - // Block 0xe8, offset 0x4c7 - {value: 0x0010, lo: 0x80, hi: 0x84}, - {value: 0x0010, lo: 0x90, hi: 0xbe}, - // Block 0xe9, offset 0x4c9 - {value: 0x0014, lo: 0x8f, hi: 0x9f}, - // Block 0xea, offset 0x4ca - {value: 0x0014, lo: 0xa0, hi: 0xa0}, - // Block 0xeb, offset 0x4cb - {value: 0x0010, lo: 0x80, hi: 0xaa}, - {value: 0x0010, lo: 0xb0, hi: 0xbc}, - // Block 0xec, offset 0x4cd - {value: 0x0010, lo: 0x80, hi: 0x88}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - {value: 0x0014, lo: 0x9d, hi: 0x9d}, - {value: 0x0034, lo: 0x9e, hi: 0x9e}, - {value: 0x0014, lo: 0xa0, hi: 0xa3}, - // Block 0xed, offset 0x4d2 - {value: 0x0030, lo: 0xa5, hi: 0xa6}, - {value: 0x0034, lo: 0xa7, hi: 0xa9}, - {value: 0x0030, lo: 0xad, hi: 0xb2}, - {value: 0x0014, lo: 0xb3, hi: 0xba}, - {value: 0x0034, lo: 0xbb, hi: 0xbf}, - // Block 0xee, offset 0x4d7 - {value: 0x0034, lo: 0x80, hi: 0x82}, - {value: 0x0024, lo: 0x85, hi: 0x89}, - {value: 0x0034, lo: 0x8a, hi: 0x8b}, - {value: 0x0024, lo: 0xaa, hi: 0xad}, - // Block 0xef, offset 0x4db - {value: 0x0024, lo: 0x82, hi: 0x84}, - // Block 0xf0, offset 0x4dc - {value: 0x0013, lo: 0x80, hi: 0x99}, - {value: 0x0012, lo: 0x9a, hi: 0xb3}, - {value: 0x0013, lo: 0xb4, hi: 0xbf}, - // Block 0xf1, offset 0x4df - {value: 0x0013, lo: 0x80, hi: 0x8d}, - {value: 0x0012, lo: 0x8e, hi: 0x94}, - {value: 0x0012, lo: 0x96, hi: 0xa7}, - {value: 0x0013, lo: 0xa8, hi: 0xbf}, - // Block 0xf2, offset 0x4e3 - {value: 0x0013, lo: 0x80, hi: 0x81}, - {value: 0x0012, lo: 0x82, hi: 0x9b}, - {value: 0x0013, lo: 0x9c, hi: 0x9c}, - {value: 0x0013, lo: 0x9e, hi: 0x9f}, - {value: 0x0013, lo: 0xa2, hi: 0xa2}, - {value: 0x0013, lo: 0xa5, hi: 0xa6}, - {value: 0x0013, lo: 0xa9, hi: 0xac}, - {value: 0x0013, lo: 0xae, hi: 0xb5}, - {value: 0x0012, lo: 0xb6, hi: 0xb9}, - {value: 0x0012, lo: 0xbb, hi: 0xbb}, - {value: 0x0012, lo: 0xbd, hi: 0xbf}, - // Block 0xf3, offset 0x4ee - {value: 0x0012, lo: 0x80, hi: 0x83}, - {value: 0x0012, lo: 0x85, hi: 0x8f}, - {value: 0x0013, lo: 0x90, hi: 0xa9}, - {value: 0x0012, lo: 0xaa, hi: 0xbf}, - // Block 0xf4, offset 0x4f2 - {value: 0x0012, lo: 0x80, hi: 0x83}, - {value: 0x0013, lo: 0x84, hi: 0x85}, - {value: 0x0013, lo: 0x87, hi: 0x8a}, - {value: 0x0013, lo: 0x8d, hi: 0x94}, - {value: 0x0013, lo: 0x96, hi: 0x9c}, - {value: 0x0012, lo: 0x9e, hi: 0xb7}, - {value: 0x0013, lo: 0xb8, hi: 0xb9}, - {value: 0x0013, lo: 0xbb, hi: 0xbe}, - // Block 0xf5, offset 0x4fa - {value: 0x0013, lo: 0x80, hi: 0x84}, - {value: 0x0013, lo: 0x86, hi: 0x86}, - {value: 0x0013, lo: 0x8a, hi: 0x90}, - {value: 0x0012, lo: 0x92, hi: 0xab}, - {value: 0x0013, lo: 0xac, hi: 0xbf}, - // Block 0xf6, offset 0x4ff - {value: 0x0013, lo: 0x80, hi: 0x85}, - {value: 0x0012, lo: 0x86, hi: 0x9f}, - {value: 0x0013, lo: 0xa0, hi: 0xb9}, - {value: 0x0012, lo: 0xba, hi: 0xbf}, - // Block 0xf7, offset 0x503 - {value: 0x0012, lo: 0x80, hi: 0x93}, - {value: 0x0013, lo: 0x94, hi: 0xad}, - {value: 0x0012, lo: 0xae, hi: 0xbf}, - // Block 0xf8, offset 0x506 - {value: 0x0012, lo: 0x80, hi: 0x87}, - {value: 0x0013, lo: 0x88, hi: 0xa1}, - {value: 0x0012, lo: 0xa2, hi: 0xbb}, - {value: 0x0013, lo: 0xbc, hi: 0xbf}, - // Block 0xf9, offset 0x50a - {value: 0x0013, lo: 0x80, hi: 0x95}, - {value: 0x0012, lo: 0x96, hi: 0xaf}, - {value: 0x0013, lo: 0xb0, hi: 0xbf}, - // Block 0xfa, offset 0x50d - {value: 0x0013, lo: 0x80, hi: 0x89}, - {value: 0x0012, lo: 0x8a, hi: 0xa5}, - {value: 0x0013, lo: 0xa8, hi: 0xbf}, - // Block 0xfb, offset 0x510 - {value: 0x0013, lo: 0x80, hi: 0x80}, - {value: 0x0012, lo: 0x82, hi: 0x9a}, - {value: 0x0012, lo: 0x9c, hi: 0xa1}, - {value: 0x0013, lo: 0xa2, hi: 0xba}, - {value: 0x0012, lo: 0xbc, hi: 0xbf}, - // Block 0xfc, offset 0x515 - {value: 0x0012, lo: 0x80, hi: 0x94}, - {value: 0x0012, lo: 0x96, hi: 0x9b}, - {value: 0x0013, lo: 0x9c, hi: 0xb4}, - {value: 0x0012, lo: 0xb6, hi: 0xbf}, - // Block 0xfd, offset 0x519 - {value: 0x0012, lo: 0x80, hi: 0x8e}, - {value: 0x0012, lo: 0x90, hi: 0x95}, - {value: 0x0013, lo: 0x96, hi: 0xae}, - {value: 0x0012, lo: 0xb0, hi: 0xbf}, - // Block 0xfe, offset 0x51d - {value: 0x0012, lo: 0x80, hi: 0x88}, - {value: 0x0012, lo: 0x8a, hi: 0x8f}, - {value: 0x0013, lo: 0x90, hi: 0xa8}, - {value: 0x0012, lo: 0xaa, hi: 0xbf}, - // Block 0xff, offset 0x521 - {value: 0x0012, lo: 0x80, hi: 0x82}, - {value: 0x0012, lo: 0x84, hi: 0x89}, - {value: 0x0017, lo: 0x8a, hi: 0x8b}, - {value: 0x0010, lo: 0x8e, hi: 0xbf}, - // Block 0x100, offset 0x525 - {value: 0x0014, lo: 0x80, hi: 0xb6}, - {value: 0x0014, lo: 0xbb, hi: 0xbf}, - // Block 0x101, offset 0x527 - {value: 0x0014, lo: 0x80, hi: 0xac}, - {value: 0x0014, lo: 0xb5, hi: 0xb5}, - // Block 0x102, offset 0x529 - {value: 0x0014, lo: 0x84, hi: 0x84}, - {value: 0x0014, lo: 0x9b, hi: 0x9f}, - {value: 0x0014, lo: 0xa1, hi: 0xaf}, - // Block 0x103, offset 0x52c - {value: 0x0024, lo: 0x80, hi: 0x86}, - {value: 0x0024, lo: 0x88, hi: 0x98}, - {value: 0x0024, lo: 0x9b, hi: 0xa1}, - {value: 0x0024, lo: 0xa3, hi: 0xa4}, - {value: 0x0024, lo: 0xa6, hi: 0xaa}, - // Block 0x104, offset 0x531 - {value: 0x0010, lo: 0x80, hi: 0x84}, - {value: 0x0034, lo: 0x90, hi: 0x96}, - // Block 0x105, offset 0x533 - {value: 0xb552, lo: 0x80, hi: 0x81}, - {value: 0xb852, lo: 0x82, hi: 0x83}, - {value: 0x0024, lo: 0x84, hi: 0x89}, - {value: 0x0034, lo: 0x8a, hi: 0x8a}, - {value: 0x0010, lo: 0x90, hi: 0x99}, - // Block 0x106, offset 0x538 - {value: 0x0010, lo: 0x80, hi: 0x83}, - {value: 0x0010, lo: 0x85, hi: 0x9f}, - {value: 0x0010, lo: 0xa1, hi: 0xa2}, - {value: 0x0010, lo: 0xa4, hi: 0xa4}, - {value: 0x0010, lo: 0xa7, hi: 0xa7}, - {value: 0x0010, lo: 0xa9, hi: 0xb2}, - {value: 0x0010, lo: 0xb4, hi: 0xb7}, - {value: 0x0010, lo: 0xb9, hi: 0xb9}, - {value: 0x0010, lo: 0xbb, hi: 0xbb}, - // Block 0x107, offset 0x541 - {value: 0x0010, lo: 0x80, hi: 0x89}, - {value: 0x0010, lo: 0x8b, hi: 0x9b}, - {value: 0x0010, lo: 0xa1, hi: 0xa3}, - {value: 0x0010, lo: 0xa5, hi: 0xa9}, - {value: 0x0010, lo: 0xab, hi: 0xbb}, - // Block 0x108, offset 0x546 - {value: 0x0013, lo: 0xb0, hi: 0xbf}, - // Block 0x109, offset 0x547 - {value: 0x0013, lo: 0x80, hi: 0x89}, - {value: 0x0013, lo: 0x90, hi: 0xa9}, - {value: 0x0013, lo: 0xb0, hi: 0xbf}, - // Block 0x10a, offset 0x54a - {value: 0x0013, lo: 0x80, hi: 0x89}, - // Block 0x10b, offset 0x54b - {value: 0x0004, lo: 0xbb, hi: 0xbf}, - // Block 0x10c, offset 0x54c - {value: 0x0014, lo: 0x81, hi: 0x81}, - {value: 0x0014, lo: 0xa0, hi: 0xbf}, - // Block 0x10d, offset 0x54e - {value: 0x0014, lo: 0x80, hi: 0xbf}, - // Block 0x10e, offset 0x54f - {value: 0x0014, lo: 0x80, hi: 0xaf}, -} - -// Total table size 13811 bytes (13KiB); checksum: 4CC48DA3 diff --git a/vendor/golang.org/x/text/cases/tables_test.go b/vendor/golang.org/x/text/cases/tables_test.go deleted file mode 100644 index 85ae23767..000000000 --- a/vendor/golang.org/x/text/cases/tables_test.go +++ /dev/null @@ -1,1154 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package cases - -var ( - caseIgnorable = map[rune]bool{ - 0x0027: true, - 0x002e: true, - 0x003a: true, - 0x00b7: true, - 0x0387: true, - 0x05f4: true, - 0x2018: true, - 0x2019: true, - 0x2024: true, - 0x2027: true, - 0xfe13: true, - 0xfe52: true, - 0xfe55: true, - 0xff07: true, - 0xff0e: true, - 0xff1a: true, - } - - special = map[rune]struct{ toLower, toTitle, toUpper string }{ - 0x00df: {"ß", "Ss", "SS"}, - 0x0130: {"i̇", "İ", "İ"}, - 0xfb00: {"ff", "Ff", "FF"}, - 0xfb01: {"fi", "Fi", "FI"}, - 0xfb02: {"fl", "Fl", "FL"}, - 0xfb03: {"ffi", "Ffi", "FFI"}, - 0xfb04: {"ffl", "Ffl", "FFL"}, - 0xfb05: {"ſt", "St", "ST"}, - 0xfb06: {"st", "St", "ST"}, - 0x0587: {"և", "Եւ", "ԵՒ"}, - 0xfb13: {"ﬓ", "Մն", "ՄՆ"}, - 0xfb14: {"ﬔ", "Մե", "ՄԵ"}, - 0xfb15: {"ﬕ", "Մի", "ՄԻ"}, - 0xfb16: {"ﬖ", "Վն", "ՎՆ"}, - 0xfb17: {"ﬗ", "Մխ", "ՄԽ"}, - 0x0149: {"ʼn", "ʼN", "ʼN"}, - 0x0390: {"ΐ", "Ϊ́", "Ϊ́"}, - 0x03b0: {"ΰ", "Ϋ́", "Ϋ́"}, - 0x01f0: {"ǰ", "J̌", "J̌"}, - 0x1e96: {"ẖ", "H̱", "H̱"}, - 0x1e97: {"ẗ", "T̈", "T̈"}, - 0x1e98: {"ẘ", "W̊", "W̊"}, - 0x1e99: {"ẙ", "Y̊", "Y̊"}, - 0x1e9a: {"ẚ", "Aʾ", "Aʾ"}, - 0x1f50: {"ὐ", "Υ̓", "Υ̓"}, - 0x1f52: {"ὒ", "Υ̓̀", "Υ̓̀"}, - 0x1f54: {"ὔ", "Υ̓́", "Υ̓́"}, - 0x1f56: {"ὖ", "Υ̓͂", "Υ̓͂"}, - 0x1fb6: {"ᾶ", "Α͂", "Α͂"}, - 0x1fc6: {"ῆ", "Η͂", "Η͂"}, - 0x1fd2: {"ῒ", "Ϊ̀", "Ϊ̀"}, - 0x1fd3: {"ΐ", "Ϊ́", "Ϊ́"}, - 0x1fd6: {"ῖ", "Ι͂", "Ι͂"}, - 0x1fd7: {"ῗ", "Ϊ͂", "Ϊ͂"}, - 0x1fe2: {"ῢ", "Ϋ̀", "Ϋ̀"}, - 0x1fe3: {"ΰ", "Ϋ́", "Ϋ́"}, - 0x1fe4: {"ῤ", "Ρ̓", "Ρ̓"}, - 0x1fe6: {"ῦ", "Υ͂", "Υ͂"}, - 0x1fe7: {"ῧ", "Ϋ͂", "Ϋ͂"}, - 0x1ff6: {"ῶ", "Ω͂", "Ω͂"}, - 0x1f80: {"ᾀ", "ᾈ", "ἈΙ"}, - 0x1f81: {"ᾁ", "ᾉ", "ἉΙ"}, - 0x1f82: {"ᾂ", "ᾊ", "ἊΙ"}, - 0x1f83: {"ᾃ", "ᾋ", "ἋΙ"}, - 0x1f84: {"ᾄ", "ᾌ", "ἌΙ"}, - 0x1f85: {"ᾅ", "ᾍ", "ἍΙ"}, - 0x1f86: {"ᾆ", "ᾎ", "ἎΙ"}, - 0x1f87: {"ᾇ", "ᾏ", "ἏΙ"}, - 0x1f88: {"ᾀ", "ᾈ", "ἈΙ"}, - 0x1f89: {"ᾁ", "ᾉ", "ἉΙ"}, - 0x1f8a: {"ᾂ", "ᾊ", "ἊΙ"}, - 0x1f8b: {"ᾃ", "ᾋ", "ἋΙ"}, - 0x1f8c: {"ᾄ", "ᾌ", "ἌΙ"}, - 0x1f8d: {"ᾅ", "ᾍ", "ἍΙ"}, - 0x1f8e: {"ᾆ", "ᾎ", "ἎΙ"}, - 0x1f8f: {"ᾇ", "ᾏ", "ἏΙ"}, - 0x1f90: {"ᾐ", "ᾘ", "ἨΙ"}, - 0x1f91: {"ᾑ", "ᾙ", "ἩΙ"}, - 0x1f92: {"ᾒ", "ᾚ", "ἪΙ"}, - 0x1f93: {"ᾓ", "ᾛ", "ἫΙ"}, - 0x1f94: {"ᾔ", "ᾜ", "ἬΙ"}, - 0x1f95: {"ᾕ", "ᾝ", "ἭΙ"}, - 0x1f96: {"ᾖ", "ᾞ", "ἮΙ"}, - 0x1f97: {"ᾗ", "ᾟ", "ἯΙ"}, - 0x1f98: {"ᾐ", "ᾘ", "ἨΙ"}, - 0x1f99: {"ᾑ", "ᾙ", "ἩΙ"}, - 0x1f9a: {"ᾒ", "ᾚ", "ἪΙ"}, - 0x1f9b: {"ᾓ", "ᾛ", "ἫΙ"}, - 0x1f9c: {"ᾔ", "ᾜ", "ἬΙ"}, - 0x1f9d: {"ᾕ", "ᾝ", "ἭΙ"}, - 0x1f9e: {"ᾖ", "ᾞ", "ἮΙ"}, - 0x1f9f: {"ᾗ", "ᾟ", "ἯΙ"}, - 0x1fa0: {"ᾠ", "ᾨ", "ὨΙ"}, - 0x1fa1: {"ᾡ", "ᾩ", "ὩΙ"}, - 0x1fa2: {"ᾢ", "ᾪ", "ὪΙ"}, - 0x1fa3: {"ᾣ", "ᾫ", "ὫΙ"}, - 0x1fa4: {"ᾤ", "ᾬ", "ὬΙ"}, - 0x1fa5: {"ᾥ", "ᾭ", "ὭΙ"}, - 0x1fa6: {"ᾦ", "ᾮ", "ὮΙ"}, - 0x1fa7: {"ᾧ", "ᾯ", "ὯΙ"}, - 0x1fa8: {"ᾠ", "ᾨ", "ὨΙ"}, - 0x1fa9: {"ᾡ", "ᾩ", "ὩΙ"}, - 0x1faa: {"ᾢ", "ᾪ", "ὪΙ"}, - 0x1fab: {"ᾣ", "ᾫ", "ὫΙ"}, - 0x1fac: {"ᾤ", "ᾬ", "ὬΙ"}, - 0x1fad: {"ᾥ", "ᾭ", "ὭΙ"}, - 0x1fae: {"ᾦ", "ᾮ", "ὮΙ"}, - 0x1faf: {"ᾧ", "ᾯ", "ὯΙ"}, - 0x1fb3: {"ᾳ", "ᾼ", "ΑΙ"}, - 0x1fbc: {"ᾳ", "ᾼ", "ΑΙ"}, - 0x1fc3: {"ῃ", "ῌ", "ΗΙ"}, - 0x1fcc: {"ῃ", "ῌ", "ΗΙ"}, - 0x1ff3: {"ῳ", "ῼ", "ΩΙ"}, - 0x1ffc: {"ῳ", "ῼ", "ΩΙ"}, - 0x1fb2: {"ᾲ", "Ὰͅ", "ᾺΙ"}, - 0x1fb4: {"ᾴ", "Άͅ", "ΆΙ"}, - 0x1fc2: {"ῂ", "Ὴͅ", "ῊΙ"}, - 0x1fc4: {"ῄ", "Ήͅ", "ΉΙ"}, - 0x1ff2: {"ῲ", "Ὼͅ", "ῺΙ"}, - 0x1ff4: {"ῴ", "Ώͅ", "ΏΙ"}, - 0x1fb7: {"ᾷ", "ᾼ͂", "Α͂Ι"}, - 0x1fc7: {"ῇ", "ῌ͂", "Η͂Ι"}, - 0x1ff7: {"ῷ", "ῼ͂", "Ω͂Ι"}, - } - - foldMap = map[rune]struct{ simple, full, special string }{ - 0x0049: {"", "", "ı"}, - 0x00b5: {"μ", "μ", ""}, - 0x00df: {"", "ss", ""}, - 0x0130: {"", "i̇", "i"}, - 0x0149: {"", "ʼn", ""}, - 0x017f: {"s", "s", ""}, - 0x01f0: {"", "ǰ", ""}, - 0x0345: {"ι", "ι", ""}, - 0x0390: {"", "ΐ", ""}, - 0x03b0: {"", "ΰ", ""}, - 0x03c2: {"σ", "σ", ""}, - 0x03d0: {"β", "β", ""}, - 0x03d1: {"θ", "θ", ""}, - 0x03d5: {"φ", "φ", ""}, - 0x03d6: {"π", "π", ""}, - 0x03f0: {"κ", "κ", ""}, - 0x03f1: {"ρ", "ρ", ""}, - 0x03f5: {"ε", "ε", ""}, - 0x0587: {"", "եւ", ""}, - 0x13f8: {"Ᏸ", "Ᏸ", ""}, - 0x13f9: {"Ᏹ", "Ᏹ", ""}, - 0x13fa: {"Ᏺ", "Ᏺ", ""}, - 0x13fb: {"Ᏻ", "Ᏻ", ""}, - 0x13fc: {"Ᏼ", "Ᏼ", ""}, - 0x13fd: {"Ᏽ", "Ᏽ", ""}, - 0x1c80: {"в", "в", ""}, - 0x1c81: {"д", "д", ""}, - 0x1c82: {"о", "о", ""}, - 0x1c83: {"с", "с", ""}, - 0x1c84: {"т", "т", ""}, - 0x1c85: {"т", "т", ""}, - 0x1c86: {"ъ", "ъ", ""}, - 0x1c87: {"ѣ", "ѣ", ""}, - 0x1c88: {"ꙋ", "ꙋ", ""}, - 0x1e96: {"", "ẖ", ""}, - 0x1e97: {"", "ẗ", ""}, - 0x1e98: {"", "ẘ", ""}, - 0x1e99: {"", "ẙ", ""}, - 0x1e9a: {"", "aʾ", ""}, - 0x1e9b: {"ṡ", "ṡ", ""}, - 0x1e9e: {"", "ss", ""}, - 0x1f50: {"", "ὐ", ""}, - 0x1f52: {"", "ὒ", ""}, - 0x1f54: {"", "ὔ", ""}, - 0x1f56: {"", "ὖ", ""}, - 0x1f80: {"", "ἀι", ""}, - 0x1f81: {"", "ἁι", ""}, - 0x1f82: {"", "ἂι", ""}, - 0x1f83: {"", "ἃι", ""}, - 0x1f84: {"", "ἄι", ""}, - 0x1f85: {"", "ἅι", ""}, - 0x1f86: {"", "ἆι", ""}, - 0x1f87: {"", "ἇι", ""}, - 0x1f88: {"", "ἀι", ""}, - 0x1f89: {"", "ἁι", ""}, - 0x1f8a: {"", "ἂι", ""}, - 0x1f8b: {"", "ἃι", ""}, - 0x1f8c: {"", "ἄι", ""}, - 0x1f8d: {"", "ἅι", ""}, - 0x1f8e: {"", "ἆι", ""}, - 0x1f8f: {"", "ἇι", ""}, - 0x1f90: {"", "ἠι", ""}, - 0x1f91: {"", "ἡι", ""}, - 0x1f92: {"", "ἢι", ""}, - 0x1f93: {"", "ἣι", ""}, - 0x1f94: {"", "ἤι", ""}, - 0x1f95: {"", "ἥι", ""}, - 0x1f96: {"", "ἦι", ""}, - 0x1f97: {"", "ἧι", ""}, - 0x1f98: {"", "ἠι", ""}, - 0x1f99: {"", "ἡι", ""}, - 0x1f9a: {"", "ἢι", ""}, - 0x1f9b: {"", "ἣι", ""}, - 0x1f9c: {"", "ἤι", ""}, - 0x1f9d: {"", "ἥι", ""}, - 0x1f9e: {"", "ἦι", ""}, - 0x1f9f: {"", "ἧι", ""}, - 0x1fa0: {"", "ὠι", ""}, - 0x1fa1: {"", "ὡι", ""}, - 0x1fa2: {"", "ὢι", ""}, - 0x1fa3: {"", "ὣι", ""}, - 0x1fa4: {"", "ὤι", ""}, - 0x1fa5: {"", "ὥι", ""}, - 0x1fa6: {"", "ὦι", ""}, - 0x1fa7: {"", "ὧι", ""}, - 0x1fa8: {"", "ὠι", ""}, - 0x1fa9: {"", "ὡι", ""}, - 0x1faa: {"", "ὢι", ""}, - 0x1fab: {"", "ὣι", ""}, - 0x1fac: {"", "ὤι", ""}, - 0x1fad: {"", "ὥι", ""}, - 0x1fae: {"", "ὦι", ""}, - 0x1faf: {"", "ὧι", ""}, - 0x1fb2: {"", "ὰι", ""}, - 0x1fb3: {"", "αι", ""}, - 0x1fb4: {"", "άι", ""}, - 0x1fb6: {"", "ᾶ", ""}, - 0x1fb7: {"", "ᾶι", ""}, - 0x1fbc: {"", "αι", ""}, - 0x1fbe: {"ι", "ι", ""}, - 0x1fc2: {"", "ὴι", ""}, - 0x1fc3: {"", "ηι", ""}, - 0x1fc4: {"", "ήι", ""}, - 0x1fc6: {"", "ῆ", ""}, - 0x1fc7: {"", "ῆι", ""}, - 0x1fcc: {"", "ηι", ""}, - 0x1fd2: {"", "ῒ", ""}, - 0x1fd3: {"", "ΐ", ""}, - 0x1fd6: {"", "ῖ", ""}, - 0x1fd7: {"", "ῗ", ""}, - 0x1fe2: {"", "ῢ", ""}, - 0x1fe3: {"", "ΰ", ""}, - 0x1fe4: {"", "ῤ", ""}, - 0x1fe6: {"", "ῦ", ""}, - 0x1fe7: {"", "ῧ", ""}, - 0x1ff2: {"", "ὼι", ""}, - 0x1ff3: {"", "ωι", ""}, - 0x1ff4: {"", "ώι", ""}, - 0x1ff6: {"", "ῶ", ""}, - 0x1ff7: {"", "ῶι", ""}, - 0x1ffc: {"", "ωι", ""}, - 0xab70: {"Ꭰ", "Ꭰ", ""}, - 0xab71: {"Ꭱ", "Ꭱ", ""}, - 0xab72: {"Ꭲ", "Ꭲ", ""}, - 0xab73: {"Ꭳ", "Ꭳ", ""}, - 0xab74: {"Ꭴ", "Ꭴ", ""}, - 0xab75: {"Ꭵ", "Ꭵ", ""}, - 0xab76: {"Ꭶ", "Ꭶ", ""}, - 0xab77: {"Ꭷ", "Ꭷ", ""}, - 0xab78: {"Ꭸ", "Ꭸ", ""}, - 0xab79: {"Ꭹ", "Ꭹ", ""}, - 0xab7a: {"Ꭺ", "Ꭺ", ""}, - 0xab7b: {"Ꭻ", "Ꭻ", ""}, - 0xab7c: {"Ꭼ", "Ꭼ", ""}, - 0xab7d: {"Ꭽ", "Ꭽ", ""}, - 0xab7e: {"Ꭾ", "Ꭾ", ""}, - 0xab7f: {"Ꭿ", "Ꭿ", ""}, - 0xab80: {"Ꮀ", "Ꮀ", ""}, - 0xab81: {"Ꮁ", "Ꮁ", ""}, - 0xab82: {"Ꮂ", "Ꮂ", ""}, - 0xab83: {"Ꮃ", "Ꮃ", ""}, - 0xab84: {"Ꮄ", "Ꮄ", ""}, - 0xab85: {"Ꮅ", "Ꮅ", ""}, - 0xab86: {"Ꮆ", "Ꮆ", ""}, - 0xab87: {"Ꮇ", "Ꮇ", ""}, - 0xab88: {"Ꮈ", "Ꮈ", ""}, - 0xab89: {"Ꮉ", "Ꮉ", ""}, - 0xab8a: {"Ꮊ", "Ꮊ", ""}, - 0xab8b: {"Ꮋ", "Ꮋ", ""}, - 0xab8c: {"Ꮌ", "Ꮌ", ""}, - 0xab8d: {"Ꮍ", "Ꮍ", ""}, - 0xab8e: {"Ꮎ", "Ꮎ", ""}, - 0xab8f: {"Ꮏ", "Ꮏ", ""}, - 0xab90: {"Ꮐ", "Ꮐ", ""}, - 0xab91: {"Ꮑ", "Ꮑ", ""}, - 0xab92: {"Ꮒ", "Ꮒ", ""}, - 0xab93: {"Ꮓ", "Ꮓ", ""}, - 0xab94: {"Ꮔ", "Ꮔ", ""}, - 0xab95: {"Ꮕ", "Ꮕ", ""}, - 0xab96: {"Ꮖ", "Ꮖ", ""}, - 0xab97: {"Ꮗ", "Ꮗ", ""}, - 0xab98: {"Ꮘ", "Ꮘ", ""}, - 0xab99: {"Ꮙ", "Ꮙ", ""}, - 0xab9a: {"Ꮚ", "Ꮚ", ""}, - 0xab9b: {"Ꮛ", "Ꮛ", ""}, - 0xab9c: {"Ꮜ", "Ꮜ", ""}, - 0xab9d: {"Ꮝ", "Ꮝ", ""}, - 0xab9e: {"Ꮞ", "Ꮞ", ""}, - 0xab9f: {"Ꮟ", "Ꮟ", ""}, - 0xaba0: {"Ꮠ", "Ꮠ", ""}, - 0xaba1: {"Ꮡ", "Ꮡ", ""}, - 0xaba2: {"Ꮢ", "Ꮢ", ""}, - 0xaba3: {"Ꮣ", "Ꮣ", ""}, - 0xaba4: {"Ꮤ", "Ꮤ", ""}, - 0xaba5: {"Ꮥ", "Ꮥ", ""}, - 0xaba6: {"Ꮦ", "Ꮦ", ""}, - 0xaba7: {"Ꮧ", "Ꮧ", ""}, - 0xaba8: {"Ꮨ", "Ꮨ", ""}, - 0xaba9: {"Ꮩ", "Ꮩ", ""}, - 0xabaa: {"Ꮪ", "Ꮪ", ""}, - 0xabab: {"Ꮫ", "Ꮫ", ""}, - 0xabac: {"Ꮬ", "Ꮬ", ""}, - 0xabad: {"Ꮭ", "Ꮭ", ""}, - 0xabae: {"Ꮮ", "Ꮮ", ""}, - 0xabaf: {"Ꮯ", "Ꮯ", ""}, - 0xabb0: {"Ꮰ", "Ꮰ", ""}, - 0xabb1: {"Ꮱ", "Ꮱ", ""}, - 0xabb2: {"Ꮲ", "Ꮲ", ""}, - 0xabb3: {"Ꮳ", "Ꮳ", ""}, - 0xabb4: {"Ꮴ", "Ꮴ", ""}, - 0xabb5: {"Ꮵ", "Ꮵ", ""}, - 0xabb6: {"Ꮶ", "Ꮶ", ""}, - 0xabb7: {"Ꮷ", "Ꮷ", ""}, - 0xabb8: {"Ꮸ", "Ꮸ", ""}, - 0xabb9: {"Ꮹ", "Ꮹ", ""}, - 0xabba: {"Ꮺ", "Ꮺ", ""}, - 0xabbb: {"Ꮻ", "Ꮻ", ""}, - 0xabbc: {"Ꮼ", "Ꮼ", ""}, - 0xabbd: {"Ꮽ", "Ꮽ", ""}, - 0xabbe: {"Ꮾ", "Ꮾ", ""}, - 0xabbf: {"Ꮿ", "Ꮿ", ""}, - 0xfb00: {"", "ff", ""}, - 0xfb01: {"", "fi", ""}, - 0xfb02: {"", "fl", ""}, - 0xfb03: {"", "ffi", ""}, - 0xfb04: {"", "ffl", ""}, - 0xfb05: {"", "st", ""}, - 0xfb06: {"", "st", ""}, - 0xfb13: {"", "մն", ""}, - 0xfb14: {"", "մե", ""}, - 0xfb15: {"", "մի", ""}, - 0xfb16: {"", "վն", ""}, - 0xfb17: {"", "մխ", ""}, - } - - breakProp = []struct{ lo, hi rune }{ - {0x0, 0x26}, - {0x28, 0x2d}, - {0x2f, 0x2f}, - {0x3b, 0x40}, - {0x5b, 0x5e}, - {0x60, 0x60}, - {0x7b, 0xa9}, - {0xab, 0xac}, - {0xae, 0xb4}, - {0xb6, 0xb6}, - {0xb8, 0xb9}, - {0xbb, 0xbf}, - {0xd7, 0xd7}, - {0xf7, 0xf7}, - {0x2c2, 0x2c5}, - {0x2d2, 0x2d6}, - {0x2d8, 0x2df}, - {0x2e5, 0x2eb}, - {0x2ed, 0x2ed}, - {0x2ef, 0x2ff}, - {0x375, 0x375}, - {0x378, 0x379}, - {0x37e, 0x37e}, - {0x380, 0x385}, - {0x38b, 0x38b}, - {0x38d, 0x38d}, - {0x3a2, 0x3a2}, - {0x3f6, 0x3f6}, - {0x482, 0x482}, - {0x530, 0x530}, - {0x557, 0x558}, - {0x55a, 0x560}, - {0x588, 0x590}, - {0x5be, 0x5be}, - {0x5c0, 0x5c0}, - {0x5c3, 0x5c3}, - {0x5c6, 0x5c6}, - {0x5c8, 0x5cf}, - {0x5eb, 0x5ef}, - {0x5f5, 0x5ff}, - {0x606, 0x60f}, - {0x61b, 0x61b}, - {0x61d, 0x61f}, - {0x66a, 0x66a}, - {0x66c, 0x66d}, - {0x6d4, 0x6d4}, - {0x6de, 0x6de}, - {0x6e9, 0x6e9}, - {0x6fd, 0x6fe}, - {0x700, 0x70e}, - {0x74b, 0x74c}, - {0x7b2, 0x7bf}, - {0x7f6, 0x7f9}, - {0x7fb, 0x7ff}, - {0x82e, 0x83f}, - {0x85c, 0x89f}, - {0x8b5, 0x8b5}, - {0x8be, 0x8d3}, - {0x964, 0x965}, - {0x970, 0x970}, - {0x984, 0x984}, - {0x98d, 0x98e}, - {0x991, 0x992}, - {0x9a9, 0x9a9}, - {0x9b1, 0x9b1}, - {0x9b3, 0x9b5}, - {0x9ba, 0x9bb}, - {0x9c5, 0x9c6}, - {0x9c9, 0x9ca}, - {0x9cf, 0x9d6}, - {0x9d8, 0x9db}, - {0x9de, 0x9de}, - {0x9e4, 0x9e5}, - {0x9f2, 0xa00}, - {0xa04, 0xa04}, - {0xa0b, 0xa0e}, - {0xa11, 0xa12}, - {0xa29, 0xa29}, - {0xa31, 0xa31}, - {0xa34, 0xa34}, - {0xa37, 0xa37}, - {0xa3a, 0xa3b}, - {0xa3d, 0xa3d}, - {0xa43, 0xa46}, - {0xa49, 0xa4a}, - {0xa4e, 0xa50}, - {0xa52, 0xa58}, - {0xa5d, 0xa5d}, - {0xa5f, 0xa65}, - {0xa76, 0xa80}, - {0xa84, 0xa84}, - {0xa8e, 0xa8e}, - {0xa92, 0xa92}, - {0xaa9, 0xaa9}, - {0xab1, 0xab1}, - {0xab4, 0xab4}, - {0xaba, 0xabb}, - {0xac6, 0xac6}, - {0xaca, 0xaca}, - {0xace, 0xacf}, - {0xad1, 0xadf}, - {0xae4, 0xae5}, - {0xaf0, 0xaf8}, - {0xafa, 0xb00}, - {0xb04, 0xb04}, - {0xb0d, 0xb0e}, - {0xb11, 0xb12}, - {0xb29, 0xb29}, - {0xb31, 0xb31}, - {0xb34, 0xb34}, - {0xb3a, 0xb3b}, - {0xb45, 0xb46}, - {0xb49, 0xb4a}, - {0xb4e, 0xb55}, - {0xb58, 0xb5b}, - {0xb5e, 0xb5e}, - {0xb64, 0xb65}, - {0xb70, 0xb70}, - {0xb72, 0xb81}, - {0xb84, 0xb84}, - {0xb8b, 0xb8d}, - {0xb91, 0xb91}, - {0xb96, 0xb98}, - {0xb9b, 0xb9b}, - {0xb9d, 0xb9d}, - {0xba0, 0xba2}, - {0xba5, 0xba7}, - {0xbab, 0xbad}, - {0xbba, 0xbbd}, - {0xbc3, 0xbc5}, - {0xbc9, 0xbc9}, - {0xbce, 0xbcf}, - {0xbd1, 0xbd6}, - {0xbd8, 0xbe5}, - {0xbf0, 0xbff}, - {0xc04, 0xc04}, - {0xc0d, 0xc0d}, - {0xc11, 0xc11}, - {0xc29, 0xc29}, - {0xc3a, 0xc3c}, - {0xc45, 0xc45}, - {0xc49, 0xc49}, - {0xc4e, 0xc54}, - {0xc57, 0xc57}, - {0xc5b, 0xc5f}, - {0xc64, 0xc65}, - {0xc70, 0xc7f}, - {0xc84, 0xc84}, - {0xc8d, 0xc8d}, - {0xc91, 0xc91}, - {0xca9, 0xca9}, - {0xcb4, 0xcb4}, - {0xcba, 0xcbb}, - {0xcc5, 0xcc5}, - {0xcc9, 0xcc9}, - {0xcce, 0xcd4}, - {0xcd7, 0xcdd}, - {0xcdf, 0xcdf}, - {0xce4, 0xce5}, - {0xcf0, 0xcf0}, - {0xcf3, 0xd00}, - {0xd04, 0xd04}, - {0xd0d, 0xd0d}, - {0xd11, 0xd11}, - {0xd3b, 0xd3c}, - {0xd45, 0xd45}, - {0xd49, 0xd49}, - {0xd4f, 0xd53}, - {0xd58, 0xd5e}, - {0xd64, 0xd65}, - {0xd70, 0xd79}, - {0xd80, 0xd81}, - {0xd84, 0xd84}, - {0xd97, 0xd99}, - {0xdb2, 0xdb2}, - {0xdbc, 0xdbc}, - {0xdbe, 0xdbf}, - {0xdc7, 0xdc9}, - {0xdcb, 0xdce}, - {0xdd5, 0xdd5}, - {0xdd7, 0xdd7}, - {0xde0, 0xde5}, - {0xdf0, 0xdf1}, - {0xdf4, 0xe30}, - {0xe32, 0xe33}, - {0xe3b, 0xe46}, - {0xe4f, 0xe4f}, - {0xe5a, 0xeb0}, - {0xeb2, 0xeb3}, - {0xeba, 0xeba}, - {0xebd, 0xec7}, - {0xece, 0xecf}, - {0xeda, 0xeff}, - {0xf01, 0xf17}, - {0xf1a, 0xf1f}, - {0xf2a, 0xf34}, - {0xf36, 0xf36}, - {0xf38, 0xf38}, - {0xf3a, 0xf3d}, - {0xf48, 0xf48}, - {0xf6d, 0xf70}, - {0xf85, 0xf85}, - {0xf98, 0xf98}, - {0xfbd, 0xfc5}, - {0xfc7, 0x102a}, - {0x103f, 0x103f}, - {0x104a, 0x1055}, - {0x105a, 0x105d}, - {0x1061, 0x1061}, - {0x1065, 0x1066}, - {0x106e, 0x1070}, - {0x1075, 0x1081}, - {0x108e, 0x108e}, - {0x109e, 0x109f}, - {0x10c6, 0x10c6}, - {0x10c8, 0x10cc}, - {0x10ce, 0x10cf}, - {0x10fb, 0x10fb}, - {0x1249, 0x1249}, - {0x124e, 0x124f}, - {0x1257, 0x1257}, - {0x1259, 0x1259}, - {0x125e, 0x125f}, - {0x1289, 0x1289}, - {0x128e, 0x128f}, - {0x12b1, 0x12b1}, - {0x12b6, 0x12b7}, - {0x12bf, 0x12bf}, - {0x12c1, 0x12c1}, - {0x12c6, 0x12c7}, - {0x12d7, 0x12d7}, - {0x1311, 0x1311}, - {0x1316, 0x1317}, - {0x135b, 0x135c}, - {0x1360, 0x137f}, - {0x1390, 0x139f}, - {0x13f6, 0x13f7}, - {0x13fe, 0x1400}, - {0x166d, 0x166e}, - {0x1680, 0x1680}, - {0x169b, 0x169f}, - {0x16eb, 0x16ed}, - {0x16f9, 0x16ff}, - {0x170d, 0x170d}, - {0x1715, 0x171f}, - {0x1735, 0x173f}, - {0x1754, 0x175f}, - {0x176d, 0x176d}, - {0x1771, 0x1771}, - {0x1774, 0x17b3}, - {0x17d4, 0x17dc}, - {0x17de, 0x17df}, - {0x17ea, 0x180a}, - {0x180f, 0x180f}, - {0x181a, 0x181f}, - {0x1878, 0x187f}, - {0x18ab, 0x18af}, - {0x18f6, 0x18ff}, - {0x191f, 0x191f}, - {0x192c, 0x192f}, - {0x193c, 0x1945}, - {0x1950, 0x19cf}, - {0x19da, 0x19ff}, - {0x1a1c, 0x1a54}, - {0x1a5f, 0x1a5f}, - {0x1a7d, 0x1a7e}, - {0x1a8a, 0x1a8f}, - {0x1a9a, 0x1aaf}, - {0x1abf, 0x1aff}, - {0x1b4c, 0x1b4f}, - {0x1b5a, 0x1b6a}, - {0x1b74, 0x1b7f}, - {0x1bf4, 0x1bff}, - {0x1c38, 0x1c3f}, - {0x1c4a, 0x1c4c}, - {0x1c7e, 0x1c7f}, - {0x1c89, 0x1ccf}, - {0x1cd3, 0x1cd3}, - {0x1cf7, 0x1cf7}, - {0x1cfa, 0x1cff}, - {0x1df6, 0x1dfa}, - {0x1f16, 0x1f17}, - {0x1f1e, 0x1f1f}, - {0x1f46, 0x1f47}, - {0x1f4e, 0x1f4f}, - {0x1f58, 0x1f58}, - {0x1f5a, 0x1f5a}, - {0x1f5c, 0x1f5c}, - {0x1f5e, 0x1f5e}, - {0x1f7e, 0x1f7f}, - {0x1fb5, 0x1fb5}, - {0x1fbd, 0x1fbd}, - {0x1fbf, 0x1fc1}, - {0x1fc5, 0x1fc5}, - {0x1fcd, 0x1fcf}, - {0x1fd4, 0x1fd5}, - {0x1fdc, 0x1fdf}, - {0x1fed, 0x1ff1}, - {0x1ff5, 0x1ff5}, - {0x1ffd, 0x200b}, - {0x2010, 0x2017}, - {0x201a, 0x2023}, - {0x2025, 0x2026}, - {0x2028, 0x2029}, - {0x2030, 0x203e}, - {0x2041, 0x2053}, - {0x2055, 0x205f}, - {0x2065, 0x2065}, - {0x2070, 0x2070}, - {0x2072, 0x207e}, - {0x2080, 0x208f}, - {0x209d, 0x20cf}, - {0x20f1, 0x2101}, - {0x2103, 0x2106}, - {0x2108, 0x2109}, - {0x2114, 0x2114}, - {0x2116, 0x2118}, - {0x211e, 0x2123}, - {0x2125, 0x2125}, - {0x2127, 0x2127}, - {0x2129, 0x2129}, - {0x212e, 0x212e}, - {0x213a, 0x213b}, - {0x2140, 0x2144}, - {0x214a, 0x214d}, - {0x214f, 0x215f}, - {0x2189, 0x24b5}, - {0x24ea, 0x2bff}, - {0x2c2f, 0x2c2f}, - {0x2c5f, 0x2c5f}, - {0x2ce5, 0x2cea}, - {0x2cf4, 0x2cff}, - {0x2d26, 0x2d26}, - {0x2d28, 0x2d2c}, - {0x2d2e, 0x2d2f}, - {0x2d68, 0x2d6e}, - {0x2d70, 0x2d7e}, - {0x2d97, 0x2d9f}, - {0x2da7, 0x2da7}, - {0x2daf, 0x2daf}, - {0x2db7, 0x2db7}, - {0x2dbf, 0x2dbf}, - {0x2dc7, 0x2dc7}, - {0x2dcf, 0x2dcf}, - {0x2dd7, 0x2dd7}, - {0x2ddf, 0x2ddf}, - {0x2e00, 0x2e2e}, - {0x2e30, 0x3004}, - {0x3006, 0x3029}, - {0x3030, 0x303a}, - {0x303d, 0x3098}, - {0x309b, 0x3104}, - {0x312e, 0x3130}, - {0x318f, 0x319f}, - {0x31bb, 0x9fff}, - {0xa48d, 0xa4cf}, - {0xa4fe, 0xa4ff}, - {0xa60d, 0xa60f}, - {0xa62c, 0xa63f}, - {0xa673, 0xa673}, - {0xa67e, 0xa67e}, - {0xa6f2, 0xa716}, - {0xa720, 0xa721}, - {0xa789, 0xa78a}, - {0xa7af, 0xa7af}, - {0xa7b8, 0xa7f6}, - {0xa828, 0xa83f}, - {0xa874, 0xa87f}, - {0xa8c6, 0xa8cf}, - {0xa8da, 0xa8df}, - {0xa8f8, 0xa8fa}, - {0xa8fc, 0xa8fc}, - {0xa8fe, 0xa8ff}, - {0xa92e, 0xa92f}, - {0xa954, 0xa95f}, - {0xa97d, 0xa97f}, - {0xa9c1, 0xa9ce}, - {0xa9da, 0xa9e4}, - {0xa9e6, 0xa9ef}, - {0xa9fa, 0xa9ff}, - {0xaa37, 0xaa3f}, - {0xaa4e, 0xaa4f}, - {0xaa5a, 0xaa7a}, - {0xaa7e, 0xaaaf}, - {0xaab1, 0xaab1}, - {0xaab5, 0xaab6}, - {0xaab9, 0xaabd}, - {0xaac0, 0xaac0}, - {0xaac2, 0xaadf}, - {0xaaf0, 0xaaf1}, - {0xaaf7, 0xab00}, - {0xab07, 0xab08}, - {0xab0f, 0xab10}, - {0xab17, 0xab1f}, - {0xab27, 0xab27}, - {0xab2f, 0xab2f}, - {0xab5b, 0xab5b}, - {0xab66, 0xab6f}, - {0xabeb, 0xabeb}, - {0xabee, 0xabef}, - {0xabfa, 0xabff}, - {0xd7a4, 0xd7af}, - {0xd7c7, 0xd7ca}, - {0xd7fc, 0xfaff}, - {0xfb07, 0xfb12}, - {0xfb18, 0xfb1c}, - {0xfb29, 0xfb29}, - {0xfb37, 0xfb37}, - {0xfb3d, 0xfb3d}, - {0xfb3f, 0xfb3f}, - {0xfb42, 0xfb42}, - {0xfb45, 0xfb45}, - {0xfbb2, 0xfbd2}, - {0xfd3e, 0xfd4f}, - {0xfd90, 0xfd91}, - {0xfdc8, 0xfdef}, - {0xfdfc, 0xfdff}, - {0xfe10, 0xfe12}, - {0xfe14, 0xfe1f}, - {0xfe30, 0xfe32}, - {0xfe35, 0xfe4c}, - {0xfe50, 0xfe51}, - {0xfe53, 0xfe54}, - {0xfe56, 0xfe6f}, - {0xfe75, 0xfe75}, - {0xfefd, 0xfefe}, - {0xff00, 0xff06}, - {0xff08, 0xff0d}, - {0xff0f, 0xff19}, - {0xff1b, 0xff20}, - {0xff3b, 0xff3e}, - {0xff40, 0xff40}, - {0xff5b, 0xff9d}, - {0xffbf, 0xffc1}, - {0xffc8, 0xffc9}, - {0xffd0, 0xffd1}, - {0xffd8, 0xffd9}, - {0xffdd, 0xfff8}, - {0xfffc, 0xffff}, - {0x1000c, 0x1000c}, - {0x10027, 0x10027}, - {0x1003b, 0x1003b}, - {0x1003e, 0x1003e}, - {0x1004e, 0x1004f}, - {0x1005e, 0x1007f}, - {0x100fb, 0x1013f}, - {0x10175, 0x101fc}, - {0x101fe, 0x1027f}, - {0x1029d, 0x1029f}, - {0x102d1, 0x102df}, - {0x102e1, 0x102ff}, - {0x10320, 0x1032f}, - {0x1034b, 0x1034f}, - {0x1037b, 0x1037f}, - {0x1039e, 0x1039f}, - {0x103c4, 0x103c7}, - {0x103d0, 0x103d0}, - {0x103d6, 0x103ff}, - {0x1049e, 0x1049f}, - {0x104aa, 0x104af}, - {0x104d4, 0x104d7}, - {0x104fc, 0x104ff}, - {0x10528, 0x1052f}, - {0x10564, 0x105ff}, - {0x10737, 0x1073f}, - {0x10756, 0x1075f}, - {0x10768, 0x107ff}, - {0x10806, 0x10807}, - {0x10809, 0x10809}, - {0x10836, 0x10836}, - {0x10839, 0x1083b}, - {0x1083d, 0x1083e}, - {0x10856, 0x1085f}, - {0x10877, 0x1087f}, - {0x1089f, 0x108df}, - {0x108f3, 0x108f3}, - {0x108f6, 0x108ff}, - {0x10916, 0x1091f}, - {0x1093a, 0x1097f}, - {0x109b8, 0x109bd}, - {0x109c0, 0x109ff}, - {0x10a04, 0x10a04}, - {0x10a07, 0x10a0b}, - {0x10a14, 0x10a14}, - {0x10a18, 0x10a18}, - {0x10a34, 0x10a37}, - {0x10a3b, 0x10a3e}, - {0x10a40, 0x10a5f}, - {0x10a7d, 0x10a7f}, - {0x10a9d, 0x10abf}, - {0x10ac8, 0x10ac8}, - {0x10ae7, 0x10aff}, - {0x10b36, 0x10b3f}, - {0x10b56, 0x10b5f}, - {0x10b73, 0x10b7f}, - {0x10b92, 0x10bff}, - {0x10c49, 0x10c7f}, - {0x10cb3, 0x10cbf}, - {0x10cf3, 0x10fff}, - {0x11047, 0x11065}, - {0x11070, 0x1107e}, - {0x110bb, 0x110bc}, - {0x110be, 0x110cf}, - {0x110e9, 0x110ef}, - {0x110fa, 0x110ff}, - {0x11135, 0x11135}, - {0x11140, 0x1114f}, - {0x11174, 0x11175}, - {0x11177, 0x1117f}, - {0x111c5, 0x111c9}, - {0x111cd, 0x111cf}, - {0x111db, 0x111db}, - {0x111dd, 0x111ff}, - {0x11212, 0x11212}, - {0x11238, 0x1123d}, - {0x1123f, 0x1127f}, - {0x11287, 0x11287}, - {0x11289, 0x11289}, - {0x1128e, 0x1128e}, - {0x1129e, 0x1129e}, - {0x112a9, 0x112af}, - {0x112eb, 0x112ef}, - {0x112fa, 0x112ff}, - {0x11304, 0x11304}, - {0x1130d, 0x1130e}, - {0x11311, 0x11312}, - {0x11329, 0x11329}, - {0x11331, 0x11331}, - {0x11334, 0x11334}, - {0x1133a, 0x1133b}, - {0x11345, 0x11346}, - {0x11349, 0x1134a}, - {0x1134e, 0x1134f}, - {0x11351, 0x11356}, - {0x11358, 0x1135c}, - {0x11364, 0x11365}, - {0x1136d, 0x1136f}, - {0x11375, 0x113ff}, - {0x1144b, 0x1144f}, - {0x1145a, 0x1147f}, - {0x114c6, 0x114c6}, - {0x114c8, 0x114cf}, - {0x114da, 0x1157f}, - {0x115b6, 0x115b7}, - {0x115c1, 0x115d7}, - {0x115de, 0x115ff}, - {0x11641, 0x11643}, - {0x11645, 0x1164f}, - {0x1165a, 0x1167f}, - {0x116b8, 0x116bf}, - {0x116ca, 0x1171c}, - {0x1172c, 0x1172f}, - {0x1173a, 0x1189f}, - {0x118ea, 0x118fe}, - {0x11900, 0x11abf}, - {0x11af9, 0x11bff}, - {0x11c09, 0x11c09}, - {0x11c37, 0x11c37}, - {0x11c41, 0x11c4f}, - {0x11c5a, 0x11c71}, - {0x11c90, 0x11c91}, - {0x11ca8, 0x11ca8}, - {0x11cb7, 0x11fff}, - {0x1239a, 0x123ff}, - {0x1246f, 0x1247f}, - {0x12544, 0x12fff}, - {0x1342f, 0x143ff}, - {0x14647, 0x167ff}, - {0x16a39, 0x16a3f}, - {0x16a5f, 0x16a5f}, - {0x16a6a, 0x16acf}, - {0x16aee, 0x16aef}, - {0x16af5, 0x16aff}, - {0x16b37, 0x16b3f}, - {0x16b44, 0x16b4f}, - {0x16b5a, 0x16b62}, - {0x16b78, 0x16b7c}, - {0x16b90, 0x16eff}, - {0x16f45, 0x16f4f}, - {0x16f7f, 0x16f8e}, - {0x16fa0, 0x16fdf}, - {0x16fe1, 0x1bbff}, - {0x1bc6b, 0x1bc6f}, - {0x1bc7d, 0x1bc7f}, - {0x1bc89, 0x1bc8f}, - {0x1bc9a, 0x1bc9c}, - {0x1bc9f, 0x1bc9f}, - {0x1bca4, 0x1d164}, - {0x1d16a, 0x1d16c}, - {0x1d183, 0x1d184}, - {0x1d18c, 0x1d1a9}, - {0x1d1ae, 0x1d241}, - {0x1d245, 0x1d3ff}, - {0x1d455, 0x1d455}, - {0x1d49d, 0x1d49d}, - {0x1d4a0, 0x1d4a1}, - {0x1d4a3, 0x1d4a4}, - {0x1d4a7, 0x1d4a8}, - {0x1d4ad, 0x1d4ad}, - {0x1d4ba, 0x1d4ba}, - {0x1d4bc, 0x1d4bc}, - {0x1d4c4, 0x1d4c4}, - {0x1d506, 0x1d506}, - {0x1d50b, 0x1d50c}, - {0x1d515, 0x1d515}, - {0x1d51d, 0x1d51d}, - {0x1d53a, 0x1d53a}, - {0x1d53f, 0x1d53f}, - {0x1d545, 0x1d545}, - {0x1d547, 0x1d549}, - {0x1d551, 0x1d551}, - {0x1d6a6, 0x1d6a7}, - {0x1d6c1, 0x1d6c1}, - {0x1d6db, 0x1d6db}, - {0x1d6fb, 0x1d6fb}, - {0x1d715, 0x1d715}, - {0x1d735, 0x1d735}, - {0x1d74f, 0x1d74f}, - {0x1d76f, 0x1d76f}, - {0x1d789, 0x1d789}, - {0x1d7a9, 0x1d7a9}, - {0x1d7c3, 0x1d7c3}, - {0x1d7cc, 0x1d7cd}, - {0x1d800, 0x1d9ff}, - {0x1da37, 0x1da3a}, - {0x1da6d, 0x1da74}, - {0x1da76, 0x1da83}, - {0x1da85, 0x1da9a}, - {0x1daa0, 0x1daa0}, - {0x1dab0, 0x1dfff}, - {0x1e007, 0x1e007}, - {0x1e019, 0x1e01a}, - {0x1e022, 0x1e022}, - {0x1e025, 0x1e025}, - {0x1e02b, 0x1e7ff}, - {0x1e8c5, 0x1e8cf}, - {0x1e8d7, 0x1e8ff}, - {0x1e94b, 0x1e94f}, - {0x1e95a, 0x1edff}, - {0x1ee04, 0x1ee04}, - {0x1ee20, 0x1ee20}, - {0x1ee23, 0x1ee23}, - {0x1ee25, 0x1ee26}, - {0x1ee28, 0x1ee28}, - {0x1ee33, 0x1ee33}, - {0x1ee38, 0x1ee38}, - {0x1ee3a, 0x1ee3a}, - {0x1ee3c, 0x1ee41}, - {0x1ee43, 0x1ee46}, - {0x1ee48, 0x1ee48}, - {0x1ee4a, 0x1ee4a}, - {0x1ee4c, 0x1ee4c}, - {0x1ee50, 0x1ee50}, - {0x1ee53, 0x1ee53}, - {0x1ee55, 0x1ee56}, - {0x1ee58, 0x1ee58}, - {0x1ee5a, 0x1ee5a}, - {0x1ee5c, 0x1ee5c}, - {0x1ee5e, 0x1ee5e}, - {0x1ee60, 0x1ee60}, - {0x1ee63, 0x1ee63}, - {0x1ee65, 0x1ee66}, - {0x1ee6b, 0x1ee6b}, - {0x1ee73, 0x1ee73}, - {0x1ee78, 0x1ee78}, - {0x1ee7d, 0x1ee7d}, - {0x1ee7f, 0x1ee7f}, - {0x1ee8a, 0x1ee8a}, - {0x1ee9c, 0x1eea0}, - {0x1eea4, 0x1eea4}, - {0x1eeaa, 0x1eeaa}, - {0x1eebc, 0x1f12f}, - {0x1f14a, 0x1f14f}, - {0x1f16a, 0x1f16f}, - {0x1f18a, 0x1ffff}, - } - - breakTest = []string{ - "AA", - "ÄA", - "Aa\u2060", - "Äa\u2060", - "Aa|:", - "Äa|:", - "Aa|'", - "Äa|'", - "Aa|'\u2060", - "Äa|'\u2060", - "Aa|,", - "Äa|,", - "a\u2060A", - "a\u2060̈A", - "a\u2060a\u2060", - "a\u2060̈a\u2060", - "a\u2060a|:", - "a\u2060̈a|:", - "a\u2060a|'", - "a\u2060̈a|'", - "a\u2060a|'\u2060", - "a\u2060̈a|'\u2060", - "a\u2060a|,", - "a\u2060̈a|,", - "a:A", - "a:̈A", - "a:a\u2060", - "a:̈a\u2060", - "a:a|:", - "a:̈a|:", - "a:a|'", - "a:̈a|'", - "a:a|'\u2060", - "a:̈a|'\u2060", - "a:a|,", - "a:̈a|,", - "a'A", - "a'̈A", - "a'a\u2060", - "a'̈a\u2060", - "a'a|:", - "a'̈a|:", - "a'a|'", - "a'̈a|'", - "a'a|'\u2060", - "a'̈a|'\u2060", - "a'a|,", - "a'̈a|,", - "a'\u2060A", - "a'\u2060̈A", - "a'\u2060a\u2060", - "a'\u2060̈a\u2060", - "a'\u2060a|:", - "a'\u2060̈a|:", - "a'\u2060a|'", - "a'\u2060̈a|'", - "a'\u2060a|'\u2060", - "a'\u2060̈a|'\u2060", - "a'\u2060a|,", - "a'\u2060̈a|,", - "a|,|A", - "a|,̈|A", - "a|,|a\u2060", - "a|,̈|a\u2060", - "a|,|a|:", - "a|,̈|a|:", - "a|,|a|'", - "a|,̈|a|'", - "a|,|a|'\u2060", - "a|,̈|a|'\u2060", - "a|,|a|,", - "a|,̈|a|,", - "AAA", - "A:A", - "A|:|:|A", - "A00A", - "A__A", - "a|🇦🇧|🇨|b", - "a|🇦🇧\u200d|🇨|b", - "a|🇦\u200d🇧|🇨|b", - "a|🇦🇧|🇨🇩|b", - "ä\u200d̈b", - "1_a|:|:|a", - "1_a|:|.|a", - "1_a|:|,|a", - "1_a|.|:|a", - "1_a|.|.|a", - "1_a|.|,|a", - "1_a|,|:|a", - "1_a|,|.|a", - "1_a|,|,|a", - "a_a|:|:|1", - "a|:|:|a", - "a_1|:|:|a", - "a_a|:|:|a", - "a_a|:|.|1", - "a|:|.|a", - "a_1|:|.|a", - "a_a|:|.|a", - "a_a|:|,|1", - "a|:|,|a", - "a_1|:|,|a", - "a_a|:|,|a", - "a_a|.|:|1", - "a|.|:|a", - "a_1|.|:|a", - "a_a|.|:|a", - "a_a|.|.|1", - "a|.|.|a", - "a_1|.|.|a", - "a_a|.|.|a", - "a_a|.|,|1", - "a|.|,|a", - "a_1|.|,|a", - "a_a|.|,|a", - "a_a|,|:|1", - "a|,|:|a", - "a_1|,|:|a", - "a_a|,|:|a", - "a_a|,|.|1", - "a|,|.|a", - "a_1|,|.|a", - "a_a|,|.|a", - "a_a|,|,|1", - "a|,|,|a", - "a_1|,|,|a", - "a_a|,|,|a", - } -) diff --git a/vendor/golang.org/x/text/cases/trieval.go b/vendor/golang.org/x/text/cases/trieval.go deleted file mode 100644 index fb221f843..000000000 --- a/vendor/golang.org/x/text/cases/trieval.go +++ /dev/null @@ -1,215 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package cases - -// This file contains definitions for interpreting the trie value of the case -// trie generated by "go run gen*.go". It is shared by both the generator -// program and the resultant package. Sharing is achieved by the generator -// copying gen_trieval.go to trieval.go and changing what's above this comment. - -// info holds case information for a single rune. It is the value returned -// by a trie lookup. Most mapping information can be stored in a single 16-bit -// value. If not, for example when a rune is mapped to multiple runes, the value -// stores some basic case data and an index into an array with additional data. -// -// The per-rune values have the following format: -// -// if (exception) { -// 15..5 unsigned exception index -// 4 unused -// } else { -// 15..8 XOR pattern or index to XOR pattern for case mapping -// Only 13..8 are used for XOR patterns. -// 7 inverseFold (fold to upper, not to lower) -// 6 index: interpret the XOR pattern as an index -// or isMid if case mode is cIgnorableUncased. -// 5..4 CCC: zero (normal or break), above or other -// } -// 3 exception: interpret this value as an exception index -// (TODO: is this bit necessary? Probably implied from case mode.) -// 2..0 case mode -// -// For the non-exceptional cases, a rune must be either uncased, lowercase or -// uppercase. If the rune is cased, the XOR pattern maps either a lowercase -// rune to uppercase or an uppercase rune to lowercase (applied to the 10 -// least-significant bits of the rune). -// -// See the definitions below for a more detailed description of the various -// bits. -type info uint16 - -const ( - casedMask = 0x0003 - fullCasedMask = 0x0007 - ignorableMask = 0x0006 - ignorableValue = 0x0004 - - inverseFoldBit = 1 << 7 - isMidBit = 1 << 6 - - exceptionBit = 1 << 3 - exceptionShift = 5 - numExceptionBits = 11 - - xorIndexBit = 1 << 6 - xorShift = 8 - - // There is no mapping if all xor bits and the exception bit are zero. - hasMappingMask = 0xff80 | exceptionBit -) - -// The case mode bits encodes the case type of a rune. This includes uncased, -// title, upper and lower case and case ignorable. (For a definition of these -// terms see Chapter 3 of The Unicode Standard Core Specification.) In some rare -// cases, a rune can be both cased and case-ignorable. This is encoded by -// cIgnorableCased. A rune of this type is always lower case. Some runes are -// cased while not having a mapping. -// -// A common pattern for scripts in the Unicode standard is for upper and lower -// case runes to alternate for increasing rune values (e.g. the accented Latin -// ranges starting from U+0100 and U+1E00 among others and some Cyrillic -// characters). We use this property by defining a cXORCase mode, where the case -// mode (always upper or lower case) is derived from the rune value. As the XOR -// pattern for case mappings is often identical for successive runes, using -// cXORCase can result in large series of identical trie values. This, in turn, -// allows us to better compress the trie blocks. -const ( - cUncased info = iota // 000 - cTitle // 001 - cLower // 010 - cUpper // 011 - cIgnorableUncased // 100 - cIgnorableCased // 101 // lower case if mappings exist - cXORCase // 11x // case is cLower | ((rune&1) ^ x) - - maxCaseMode = cUpper -) - -func (c info) isCased() bool { - return c&casedMask != 0 -} - -func (c info) isCaseIgnorable() bool { - return c&ignorableMask == ignorableValue -} - -func (c info) isNotCasedAndNotCaseIgnorable() bool { - return c&fullCasedMask == 0 -} - -func (c info) isCaseIgnorableAndNotCased() bool { - return c&fullCasedMask == cIgnorableUncased -} - -func (c info) isMid() bool { - return c&(fullCasedMask|isMidBit) == isMidBit|cIgnorableUncased -} - -// The case mapping implementation will need to know about various Canonical -// Combining Class (CCC) values. We encode two of these in the trie value: -// cccZero (0) and cccAbove (230). If the value is cccOther, it means that -// CCC(r) > 0, but not 230. A value of cccBreak means that CCC(r) == 0 and that -// the rune also has the break category Break (see below). -const ( - cccBreak info = iota << 4 - cccZero - cccAbove - cccOther - - cccMask = cccBreak | cccZero | cccAbove | cccOther -) - -const ( - starter = 0 - above = 230 - iotaSubscript = 240 -) - -// The exceptions slice holds data that does not fit in a normal info entry. -// The entry is pointed to by the exception index in an entry. It has the -// following format: -// -// Header -// byte 0: -// 7..6 unused -// 5..4 CCC type (same bits as entry) -// 3 unused -// 2..0 length of fold -// -// byte 1: -// 7..6 unused -// 5..3 length of 1st mapping of case type -// 2..0 length of 2nd mapping of case type -// -// case 1st 2nd -// lower -> upper, title -// upper -> lower, title -// title -> lower, upper -// -// Lengths with the value 0x7 indicate no value and implies no change. -// A length of 0 indicates a mapping to zero-length string. -// -// Body bytes: -// case folding bytes -// lowercase mapping bytes -// uppercase mapping bytes -// titlecase mapping bytes -// closure mapping bytes (for NFKC_Casefold). (TODO) -// -// Fallbacks: -// missing fold -> lower -// missing title -> upper -// all missing -> original rune -// -// exceptions starts with a dummy byte to enforce that there is no zero index -// value. -const ( - lengthMask = 0x07 - lengthBits = 3 - noChange = 0 -) - -// References to generated trie. - -var trie = newCaseTrie(0) - -var sparse = sparseBlocks{ - values: sparseValues[:], - offsets: sparseOffsets[:], -} - -// Sparse block lookup code. - -// valueRange is an entry in a sparse block. -type valueRange struct { - value uint16 - lo, hi byte -} - -type sparseBlocks struct { - values []valueRange - offsets []uint16 -} - -// lookup returns the value from values block n for byte b using binary search. -func (s *sparseBlocks) lookup(n uint32, b byte) uint16 { - lo := s.offsets[n] - hi := s.offsets[n+1] - for lo < hi { - m := lo + (hi-lo)/2 - r := s.values[m] - if r.lo <= b && b <= r.hi { - return r.value - } - if b < r.lo { - hi = m - } else { - lo = m + 1 - } - } - return 0 -} - -// lastRuneForTesting is the last rune used for testing. Everything after this -// is boring. -const lastRuneForTesting = rune(0x1FFFF) diff --git a/vendor/golang.org/x/text/cmd/gotext/doc.go b/vendor/golang.org/x/text/cmd/gotext/doc.go deleted file mode 100644 index 54eb485d5..000000000 --- a/vendor/golang.org/x/text/cmd/gotext/doc.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// DO NOT EDIT THIS FILE. GENERATED BY go generate. -// Edit the documentation in other files and rerun go generate to generate this one. - -// gotext is a tool for managing text in Go source code. -// -// Usage: -// -// gotext command [arguments] -// -// The commands are: -// -// extract extract strings to be translated from code -// -// Use "go help [command]" for more information about a command. -// -// Additional help topics: -// -// -// Use "gotext help [topic]" for more information about that topic. -// -// -// Extract strings to be translated from code -// -// Usage: -// -// go extract <package>* -// -// -// -// -package main diff --git a/vendor/golang.org/x/text/cmd/gotext/extract.go b/vendor/golang.org/x/text/cmd/gotext/extract.go deleted file mode 100644 index 79a9b596d..000000000 --- a/vendor/golang.org/x/text/cmd/gotext/extract.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "go/ast" - "go/build" - "go/constant" - "go/format" - "go/parser" - "go/types" - "io/ioutil" - "os" - "path" - "path/filepath" - "strings" - - "golang.org/x/tools/go/loader" -) - -// TODO: -// - merge information into existing files -// - handle different file formats (PO, XLIFF) -// - handle features (gender, plural) -// - message rewriting - -var cmdExtract = &Command{ - Run: runExtract, - UsageLine: "extract <package>*", - Short: "extract strings to be translated from code", -} - -func runExtract(cmd *Command, args []string) error { - if len(args) == 0 { - args = []string{"."} - } - - conf := loader.Config{ - Build: &build.Default, - ParserMode: parser.ParseComments, - } - - // Use the initial packages from the command line. - args, err := conf.FromArgs(args, false) - if err != nil { - return err - } - - // Load, parse and type-check the whole program. - iprog, err := conf.Load() - if err != nil { - return err - } - - // print returns Go syntax for the specified node. - print := func(n ast.Node) string { - var buf bytes.Buffer - format.Node(&buf, conf.Fset, n) - return buf.String() - } - - var translations []Translation - - for _, info := range iprog.InitialPackages() { - for _, f := range info.Files { - // Associate comments with nodes. - cmap := ast.NewCommentMap(iprog.Fset, f, f.Comments) - getComment := func(n ast.Node) string { - cs := cmap.Filter(n).Comments() - if len(cs) > 0 { - return strings.TrimSpace(cs[0].Text()) - } - return "" - } - - // Find function calls. - ast.Inspect(f, func(n ast.Node) bool { - call, ok := n.(*ast.CallExpr) - if !ok { - return true - } - - // Skip calls of functions other than - // (*message.Printer).{Sp,Fp,P}rintf. - sel, ok := call.Fun.(*ast.SelectorExpr) - if !ok { - return true - } - meth := info.Selections[sel] - if meth == nil || meth.Kind() != types.MethodVal { - return true - } - // TODO: remove cheap hack and check if the type either - // implements some interface or is specifically of type - // "golang.org/x/text/message".Printer. - m, ok := extractFuncs[path.Base(meth.Recv().String())] - if !ok { - return true - } - - // argn is the index of the format string. - argn, ok := m[meth.Obj().Name()] - if !ok || argn >= len(call.Args) { - return true - } - - // Skip calls with non-constant format string. - fmtstr := info.Types[call.Args[argn]].Value - if fmtstr == nil || fmtstr.Kind() != constant.String { - return true - } - - posn := conf.Fset.Position(call.Lparen) - filepos := fmt.Sprintf("%s:%d:%d", filepath.Base(posn.Filename), posn.Line, posn.Column) - - // TODO: identify the type of the format argument. If it is not - // a string, multiple keys may be defined. - var key []string - - // TODO: replace substitutions (%v) with a translator friendly - // notation. For instance: - // "%d files remaining" -> "{numFiles} files remaining", or - // "%d files remaining" -> "{arg1} files remaining" - // Alternatively, this could be done at a later stage. - msg := constant.StringVal(fmtstr) - - // Construct a Translation unit. - c := Translation{ - Key: key, - Position: filepath.Join(info.Pkg.Path(), filepos), - Original: Text{Msg: msg}, - ExtractedComment: getComment(call.Args[0]), - // TODO(fix): this doesn't get the before comment. - // Comment: getComment(call), - } - - for i, arg := range call.Args[argn+1:] { - var val string - if v := info.Types[arg].Value; v != nil { - val = v.ExactString() - } - posn := conf.Fset.Position(arg.Pos()) - filepos := fmt.Sprintf("%s:%d:%d", filepath.Base(posn.Filename), posn.Line, posn.Column) - c.Args = append(c.Args, Argument{ - ID: i + 1, - Type: info.Types[arg].Type.String(), - UnderlyingType: info.Types[arg].Type.Underlying().String(), - Expr: print(arg), - Value: val, - Comment: getComment(arg), - Position: filepath.Join(info.Pkg.Path(), filepos), - // TODO report whether it implements - // interfaces plural.Interface, - // gender.Interface. - }) - } - - translations = append(translations, c) - return true - }) - } - } - - data, err := json.MarshalIndent(translations, "", " ") - if err != nil { - return err - } - for _, tag := range getLangs() { - // TODO: merge with existing files, don't overwrite. - os.MkdirAll(*dir, 0744) - file := filepath.Join(*dir, fmt.Sprintf("gotext_%v.out.json", tag)) - if err := ioutil.WriteFile(file, data, 0744); err != nil { - return fmt.Errorf("could not create file: %v", err) - } - } - return nil -} - -// extractFuncs indicates the types and methods for which to extract strings, -// and which argument to extract. -// TODO: use the types in conf.Import("golang.org/x/text/message") to extract -// the correct instances. -var extractFuncs = map[string]map[string]int{ - // TODO: Printer -> *golang.org/x/text/message.Printer - "message.Printer": { - "Printf": 0, - "Sprintf": 0, - "Fprintf": 1, - }, -} diff --git a/vendor/golang.org/x/text/cmd/gotext/main.go b/vendor/golang.org/x/text/cmd/gotext/main.go deleted file mode 100644 index b03eb5565..000000000 --- a/vendor/golang.org/x/text/cmd/gotext/main.go +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go build -o gotext.latest -//go:generate ./gotext.latest help gendocumentation -//go:generate rm gotext.latest - -package main - -import ( - "bufio" - "bytes" - "flag" - "fmt" - "go/build" - "go/format" - "io" - "io/ioutil" - "log" - "os" - "strings" - "sync" - "text/template" - "unicode" - "unicode/utf8" - - "golang.org/x/text/language" - "golang.org/x/tools/go/buildutil" -) - -func init() { - flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) -} - -var ( - dir = flag.String("dir", "textdata", "default subdirectory to store translation files") - langs = flag.String("lang", "en", "comma-separated list of languages to process") -) - -// NOTE: the Command struct is copied from the go tool in core. - -// A Command is an implementation of a go command -// like go build or go fix. -type Command struct { - // Run runs the command. - // The args are the arguments after the command name. - Run func(cmd *Command, args []string) error - - // UsageLine is the one-line usage message. - // The first word in the line is taken to be the command name. - UsageLine string - - // Short is the short description shown in the 'go help' output. - Short string - - // Long is the long message shown in the 'go help <this-command>' output. - Long string - - // Flag is a set of flags specific to this command. - Flag flag.FlagSet -} - -// Name returns the command's name: the first word in the usage line. -func (c *Command) Name() string { - name := c.UsageLine - i := strings.Index(name, " ") - if i >= 0 { - name = name[:i] - } - return name -} - -func (c *Command) Usage() { - fmt.Fprintf(os.Stderr, "usage: %s\n\n", c.UsageLine) - fmt.Fprintf(os.Stderr, "%s\n", strings.TrimSpace(c.Long)) - os.Exit(2) -} - -// Runnable reports whether the command can be run; otherwise -// it is a documentation pseudo-command such as importpath. -func (c *Command) Runnable() bool { - return c.Run != nil -} - -// Commands lists the available commands and help topics. -// The order here is the order in which they are printed by 'go help'. -var commands = []*Command{ - cmdExtract, - // TODO: - // - generate code from translations. - // - update: full-cycle update of extraction, sending, and integration - // - report: report of freshness of translations -} - -var exitStatus = 0 -var exitMu sync.Mutex - -func setExitStatus(n int) { - exitMu.Lock() - if exitStatus < n { - exitStatus = n - } - exitMu.Unlock() -} - -var origEnv []string - -func main() { - flag.Usage = usage - flag.Parse() - log.SetFlags(0) - - args := flag.Args() - if len(args) < 1 { - usage() - } - - if args[0] == "help" { - help(args[1:]) - return - } - - for _, cmd := range commands { - if cmd.Name() == args[0] && cmd.Runnable() { - cmd.Flag.Usage = func() { cmd.Usage() } - cmd.Flag.Parse(args[1:]) - args = cmd.Flag.Args() - if err := cmd.Run(cmd, args); err != nil { - fatalf("gotext: %v", err) - } - exit() - return - } - } - - fmt.Fprintf(os.Stderr, "gotext: unknown subcommand %q\nRun 'go help' for usage.\n", args[0]) - setExitStatus(2) - exit() -} - -var usageTemplate = `gotext is a tool for managing text in Go source code. - -Usage: - - gotext command [arguments] - -The commands are: -{{range .}}{{if .Runnable}} - {{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}} - -Use "go help [command]" for more information about a command. - -Additional help topics: -{{range .}}{{if not .Runnable}} - {{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}} - -Use "gotext help [topic]" for more information about that topic. - -` - -var helpTemplate = `{{if .Runnable}}usage: go {{.UsageLine}} - -{{end}}{{.Long | trim}} -` - -var documentationTemplate = `{{range .}}{{if .Short}}{{.Short | capitalize}} - -{{end}}{{if .Runnable}}Usage: - - go {{.UsageLine}} - -{{end}}{{.Long | trim}} - - -{{end}}` - -// commentWriter writes a Go comment to the underlying io.Writer, -// using line comment form (//). -type commentWriter struct { - W io.Writer - wroteSlashes bool // Wrote "//" at the beginning of the current line. -} - -func (c *commentWriter) Write(p []byte) (int, error) { - var n int - for i, b := range p { - if !c.wroteSlashes { - s := "//" - if b != '\n' { - s = "// " - } - if _, err := io.WriteString(c.W, s); err != nil { - return n, err - } - c.wroteSlashes = true - } - n0, err := c.W.Write(p[i : i+1]) - n += n0 - if err != nil { - return n, err - } - if b == '\n' { - c.wroteSlashes = false - } - } - return len(p), nil -} - -// An errWriter wraps a writer, recording whether a write error occurred. -type errWriter struct { - w io.Writer - err error -} - -func (w *errWriter) Write(b []byte) (int, error) { - n, err := w.w.Write(b) - if err != nil { - w.err = err - } - return n, err -} - -// tmpl executes the given template text on data, writing the result to w. -func tmpl(w io.Writer, text string, data interface{}) { - t := template.New("top") - t.Funcs(template.FuncMap{"trim": strings.TrimSpace, "capitalize": capitalize}) - template.Must(t.Parse(text)) - ew := &errWriter{w: w} - err := t.Execute(ew, data) - if ew.err != nil { - // I/O error writing. Ignore write on closed pipe. - if strings.Contains(ew.err.Error(), "pipe") { - os.Exit(1) - } - fatalf("writing output: %v", ew.err) - } - if err != nil { - panic(err) - } -} - -func capitalize(s string) string { - if s == "" { - return s - } - r, n := utf8.DecodeRuneInString(s) - return string(unicode.ToTitle(r)) + s[n:] -} - -func printUsage(w io.Writer) { - bw := bufio.NewWriter(w) - tmpl(bw, usageTemplate, commands) - bw.Flush() -} - -func usage() { - printUsage(os.Stderr) - os.Exit(2) -} - -// help implements the 'help' command. -func help(args []string) { - if len(args) == 0 { - printUsage(os.Stdout) - // not exit 2: succeeded at 'go help'. - return - } - if len(args) != 1 { - fmt.Fprintf(os.Stderr, "usage: go help command\n\nToo many arguments given.\n") - os.Exit(2) // failed at 'go help' - } - - arg := args[0] - - // 'go help documentation' generates doc.go. - if strings.HasSuffix(arg, "documentation") { - w := &bytes.Buffer{} - - fmt.Fprintln(w, "// Copyright 2016 The Go Authors. All rights reserved.") - fmt.Fprintln(w, "// Use of this source code is governed by a BSD-style") - fmt.Fprintln(w, "// license that can be found in the LICENSE file.") - fmt.Fprintln(w) - fmt.Fprintln(w, "// DO NOT EDIT THIS FILE. GENERATED BY go generate.") - fmt.Fprintln(w, "// Edit the documentation in other files and rerun go generate to generate this one.") - fmt.Fprintln(w) - buf := new(bytes.Buffer) - printUsage(buf) - usage := &Command{Long: buf.String()} - tmpl(&commentWriter{W: w}, documentationTemplate, append([]*Command{usage}, commands...)) - fmt.Fprintln(w, "package main") - if arg == "gendocumentation" { - b, err := format.Source(w.Bytes()) - if err != nil { - errorf("Could not format generated docs: %v\n", err) - } - if err := ioutil.WriteFile("doc.go", b, 0666); err != nil { - errorf("Could not create file alldocs.go: %v\n", err) - } - } else { - fmt.Println(w.String()) - } - return - } - - for _, cmd := range commands { - if cmd.Name() == arg { - tmpl(os.Stdout, helpTemplate, cmd) - // not exit 2: succeeded at 'go help cmd'. - return - } - } - - fmt.Fprintf(os.Stderr, "Unknown help topic %#q. Run 'go help'.\n", arg) - os.Exit(2) // failed at 'go help cmd' -} - -func getLangs() (tags []language.Tag) { - for _, t := range strings.Split(*langs, ",") { - tag, err := language.Parse(t) - if err != nil { - fatalf("gotext: could not parse language %q: %v", t, err) - } - tags = append(tags, tag) - } - return tags -} - -var atexitFuncs []func() - -func atexit(f func()) { - atexitFuncs = append(atexitFuncs, f) -} - -func exit() { - for _, f := range atexitFuncs { - f() - } - os.Exit(exitStatus) -} - -func fatalf(format string, args ...interface{}) { - errorf(format, args...) - exit() -} - -func errorf(format string, args ...interface{}) { - log.Printf(format, args...) - setExitStatus(1) -} - -func exitIfErrors() { - if exitStatus != 0 { - exit() - } -} diff --git a/vendor/golang.org/x/text/cmd/gotext/message.go b/vendor/golang.org/x/text/cmd/gotext/message.go deleted file mode 100644 index 67a622fd7..000000000 --- a/vendor/golang.org/x/text/cmd/gotext/message.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -// TODO: these definitions should be moved to a package so that the can be used -// by other tools. - -// The file contains the structures used to define translations of a certain -// messages. -// -// A translation may have multiple translations strings, or messages, depending -// on the feature values of the various arguments. For instance, consider -// a hypothetical translation from English to English, where the source defines -// the format string "%d file(s) remaining". A completed translation, expressed -// in JS, for this format string could look like: -// -// { -// "Key": [ -// "\"%d files(s) remaining\"" -// ], -// "Original": { -// "Msg": "\"%d files(s) remaining\"" -// }, -// "Translation": { -// "Select": { -// "Feature": "plural", -// "Arg": 1, -// "Case": { -// "one": { "Msg": "1 file remaining" }, -// "other": { "Msg": "%d files remaining" } -// }, -// }, -// }, -// "Args": [ -// { -// "ID": 2, -// "Type": "int", -// "UnderlyingType": "int", -// "Expr": "nFiles", -// "Comment": "number of files remaining", -// "Position": "golang.org/x/text/cmd/gotext/demo.go:34:3" -// } -// ], -// "Position": "golang.org/x/text/cmd/gotext/demo.go:33:10", -// } -// -// Alternatively, the Translation section could be written as: -// -// "Translation": { -// "Msg": "%d %[files]s remaining", -// "Var": { -// "files" : { -// "Select": { -// "Feature": "plural", -// "Arg": 1, -// "Case": { -// "one": { "Msg": "file" }, -// "other": { "Msg": "files" } -// } -// } -// } -// } -// } - -// A Translation describes a translation for a single language for a single -// message. -type Translation struct { - // Key contains a list of identifiers for the message. If this list is empty - // Original is used as the key. - Key []string `json:"key,omitempty"` - Original Text `json:"original"` - Translation Text `json:"translation"` - ExtractedComment string `json:"extractedComment,omitempty"` - TranslatorComment string `json:"translatorComment,omitempty"` - - Args []Argument `json:"args,omitempty"` - - // Extraction information. - Position string `json:"position,omitempty"` // filePosition:line -} - -// An Argument contains information about the arguments passed to a message. -type Argument struct { - ID interface{} `json:"id"` // An int for printf-style calls, but could be a string. - Type string `json:"type"` - UnderlyingType string `json:"underlyingType"` - Expr string `json:"expr"` - Value string `json:"value,omitempty"` - Comment string `json:"comment,omitempty"` - Position string `json:"position,omitempty"` - - // Features contains the features that are available for the implementation - // of this argument. - Features []Feature `json:"features,omitempty"` -} - -// Feature holds information about a feature that can be implemented by -// an Argument. -type Feature struct { - Type string `json:"type"` // Right now this is only gender and plural. - - // TODO: possible values and examples for the language under consideration. - -} - -// Text defines a message to be displayed. -type Text struct { - // Msg and Select contains the message to be displayed. Within a Text value - // either Msg or Select is defined. - Msg string `json:"msg,omitempty"` - Select *Select `json:"select,omitempty"` - // Var defines a map of variables that may be substituted in the selected - // message. - Var map[string]Text `json:"var,omitempty"` - // Example contains an example message formatted with default values. - Example string `json:"example,omitempty"` -} - -// Type Select selects a Text based on the feature value associated with -// a feature of a certain argument. -type Select struct { - Feature string `json:"feature"` // Name of variable or Feature type - Arg interface{} `json:"arg"` // The argument ID. - Cases map[string]Text `json:"cases"` -} diff --git a/vendor/golang.org/x/text/collate/build/builder.go b/vendor/golang.org/x/text/collate/build/builder.go deleted file mode 100644 index 11042841b..000000000 --- a/vendor/golang.org/x/text/collate/build/builder.go +++ /dev/null @@ -1,702 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build // import "golang.org/x/text/collate/build" - -import ( - "fmt" - "io" - "log" - "sort" - "strings" - "unicode/utf8" - - "golang.org/x/text/internal/colltab" - "golang.org/x/text/language" - "golang.org/x/text/unicode/norm" -) - -// TODO: optimizations: -// - expandElem is currently 20K. By putting unique colElems in a separate -// table and having a byte array of indexes into this table, we can reduce -// the total size to about 7K. By also factoring out the length bytes, we -// can reduce this to about 6K. -// - trie valueBlocks are currently 100K. There are a lot of sparse blocks -// and many consecutive values with the same stride. This can be further -// compacted. -// - Compress secondary weights into 8 bits. -// - Some LDML specs specify a context element. Currently we simply concatenate -// those. Context can be implemented using the contraction trie. If Builder -// could analyze and detect when using a context makes sense, there is no -// need to expose this construct in the API. - -// A Builder builds a root collation table. The user must specify the -// collation elements for each entry. A common use will be to base the weights -// on those specified in the allkeys* file as provided by the UCA or CLDR. -type Builder struct { - index *trieBuilder - root ordering - locale []*Tailoring - t *table - err error - built bool - - minNonVar int // lowest primary recorded for a variable - varTop int // highest primary recorded for a non-variable - - // indexes used for reusing expansions and contractions - expIndex map[string]int // positions of expansions keyed by their string representation - ctHandle map[string]ctHandle // contraction handles keyed by a concatenation of the suffixes - ctElem map[string]int // contraction elements keyed by their string representation -} - -// A Tailoring builds a collation table based on another collation table. -// The table is defined by specifying tailorings to the underlying table. -// See http://unicode.org/reports/tr35/ for an overview of tailoring -// collation tables. The CLDR contains pre-defined tailorings for a variety -// of languages (See http://www.unicode.org/Public/cldr/<version>/core.zip.) -type Tailoring struct { - id string - builder *Builder - index *ordering - - anchor *entry - before bool -} - -// NewBuilder returns a new Builder. -func NewBuilder() *Builder { - return &Builder{ - index: newTrieBuilder(), - root: makeRootOrdering(), - expIndex: make(map[string]int), - ctHandle: make(map[string]ctHandle), - ctElem: make(map[string]int), - } -} - -// Tailoring returns a Tailoring for the given locale. One should -// have completed all calls to Add before calling Tailoring. -func (b *Builder) Tailoring(loc language.Tag) *Tailoring { - t := &Tailoring{ - id: loc.String(), - builder: b, - index: b.root.clone(), - } - t.index.id = t.id - b.locale = append(b.locale, t) - return t -} - -// Add adds an entry to the collation element table, mapping -// a slice of runes to a sequence of collation elements. -// A collation element is specified as list of weights: []int{primary, secondary, ...}. -// The entries are typically obtained from a collation element table -// as defined in http://www.unicode.org/reports/tr10/#Data_Table_Format. -// Note that the collation elements specified by colelems are only used -// as a guide. The actual weights generated by Builder may differ. -// The argument variables is a list of indices into colelems that should contain -// a value for each colelem that is a variable. (See the reference above.) -func (b *Builder) Add(runes []rune, colelems [][]int, variables []int) error { - str := string(runes) - elems := make([]rawCE, len(colelems)) - for i, ce := range colelems { - if len(ce) == 0 { - break - } - elems[i] = makeRawCE(ce, 0) - if len(ce) == 1 { - elems[i].w[1] = defaultSecondary - } - if len(ce) <= 2 { - elems[i].w[2] = defaultTertiary - } - if len(ce) <= 3 { - elems[i].w[3] = ce[0] - } - } - for i, ce := range elems { - p := ce.w[0] - isvar := false - for _, j := range variables { - if i == j { - isvar = true - } - } - if isvar { - if p >= b.minNonVar && b.minNonVar > 0 { - return fmt.Errorf("primary value %X of variable is larger than the smallest non-variable %X", p, b.minNonVar) - } - if p > b.varTop { - b.varTop = p - } - } else if p > 1 { // 1 is a special primary value reserved for FFFE - if p <= b.varTop { - return fmt.Errorf("primary value %X of non-variable is smaller than the highest variable %X", p, b.varTop) - } - if b.minNonVar == 0 || p < b.minNonVar { - b.minNonVar = p - } - } - } - elems, err := convertLargeWeights(elems) - if err != nil { - return err - } - cccs := []uint8{} - nfd := norm.NFD.String(str) - for i := range nfd { - cccs = append(cccs, norm.NFD.PropertiesString(nfd[i:]).CCC()) - } - if len(cccs) < len(elems) { - if len(cccs) > 2 { - return fmt.Errorf("number of decomposed characters should be greater or equal to the number of collation elements for len(colelems) > 3 (%d < %d)", len(cccs), len(elems)) - } - p := len(elems) - 1 - for ; p > 0 && elems[p].w[0] == 0; p-- { - elems[p].ccc = cccs[len(cccs)-1] - } - for ; p >= 0; p-- { - elems[p].ccc = cccs[0] - } - } else { - for i := range elems { - elems[i].ccc = cccs[i] - } - } - // doNorm in collate.go assumes that the following conditions hold. - if len(elems) > 1 && len(cccs) > 1 && cccs[0] != 0 && cccs[0] != cccs[len(cccs)-1] { - return fmt.Errorf("incompatible CCC values for expansion %X (%d)", runes, cccs) - } - b.root.newEntry(str, elems) - return nil -} - -func (t *Tailoring) setAnchor(anchor string) error { - anchor = norm.NFC.String(anchor) - a := t.index.find(anchor) - if a == nil { - a = t.index.newEntry(anchor, nil) - a.implicit = true - a.modified = true - for _, r := range []rune(anchor) { - e := t.index.find(string(r)) - e.lock = true - } - } - t.anchor = a - return nil -} - -// SetAnchor sets the point after which elements passed in subsequent calls to -// Insert will be inserted. It is equivalent to the reset directive in an LDML -// specification. See Insert for an example. -// SetAnchor supports the following logical reset positions: -// <first_tertiary_ignorable/>, <last_teriary_ignorable/>, <first_primary_ignorable/>, -// and <last_non_ignorable/>. -func (t *Tailoring) SetAnchor(anchor string) error { - if err := t.setAnchor(anchor); err != nil { - return err - } - t.before = false - return nil -} - -// SetAnchorBefore is similar to SetAnchor, except that subsequent calls to -// Insert will insert entries before the anchor. -func (t *Tailoring) SetAnchorBefore(anchor string) error { - if err := t.setAnchor(anchor); err != nil { - return err - } - t.before = true - return nil -} - -// Insert sets the ordering of str relative to the entry set by the previous -// call to SetAnchor or Insert. The argument extend corresponds -// to the extend elements as defined in LDML. A non-empty value for extend -// will cause the collation elements corresponding to extend to be appended -// to the collation elements generated for the entry added by Insert. -// This has the same net effect as sorting str after the string anchor+extend. -// See http://www.unicode.org/reports/tr10/#Tailoring_Example for details -// on parametric tailoring and http://unicode.org/reports/tr35/#Collation_Elements -// for full details on LDML. -// -// Examples: create a tailoring for Swedish, where "ä" is ordered after "z" -// at the primary sorting level: -// t := b.Tailoring("se") -// t.SetAnchor("z") -// t.Insert(colltab.Primary, "ä", "") -// Order "ü" after "ue" at the secondary sorting level: -// t.SetAnchor("ue") -// t.Insert(colltab.Secondary, "ü","") -// or -// t.SetAnchor("u") -// t.Insert(colltab.Secondary, "ü", "e") -// Order "q" afer "ab" at the secondary level and "Q" after "q" -// at the tertiary level: -// t.SetAnchor("ab") -// t.Insert(colltab.Secondary, "q", "") -// t.Insert(colltab.Tertiary, "Q", "") -// Order "b" before "a": -// t.SetAnchorBefore("a") -// t.Insert(colltab.Primary, "b", "") -// Order "0" after the last primary ignorable: -// t.SetAnchor("<last_primary_ignorable/>") -// t.Insert(colltab.Primary, "0", "") -func (t *Tailoring) Insert(level colltab.Level, str, extend string) error { - if t.anchor == nil { - return fmt.Errorf("%s:Insert: no anchor point set for tailoring of %s", t.id, str) - } - str = norm.NFC.String(str) - e := t.index.find(str) - if e == nil { - e = t.index.newEntry(str, nil) - } else if e.logical != noAnchor { - return fmt.Errorf("%s:Insert: cannot reinsert logical reset position %q", t.id, e.str) - } - if e.lock { - return fmt.Errorf("%s:Insert: cannot reinsert element %q", t.id, e.str) - } - a := t.anchor - // Find the first element after the anchor which differs at a level smaller or - // equal to the given level. Then insert at this position. - // See http://unicode.org/reports/tr35/#Collation_Elements, Section 5.14.5 for details. - e.before = t.before - if t.before { - t.before = false - if a.prev == nil { - a.insertBefore(e) - } else { - for a = a.prev; a.level > level; a = a.prev { - } - a.insertAfter(e) - } - e.level = level - } else { - for ; a.level > level; a = a.next { - } - e.level = a.level - if a != e { - a.insertAfter(e) - a.level = level - } else { - // We don't set a to prev itself. This has the effect of the entry - // getting new collation elements that are an increment of itself. - // This is intentional. - a.prev.level = level - } - } - e.extend = norm.NFD.String(extend) - e.exclude = false - e.modified = true - e.elems = nil - t.anchor = e - return nil -} - -func (o *ordering) getWeight(e *entry) []rawCE { - if len(e.elems) == 0 && e.logical == noAnchor { - if e.implicit { - for _, r := range e.runes { - e.elems = append(e.elems, o.getWeight(o.find(string(r)))...) - } - } else if e.before { - count := [colltab.Identity + 1]int{} - a := e - for ; a.elems == nil && !a.implicit; a = a.next { - count[a.level]++ - } - e.elems = []rawCE{makeRawCE(a.elems[0].w, a.elems[0].ccc)} - for i := colltab.Primary; i < colltab.Quaternary; i++ { - if count[i] != 0 { - e.elems[0].w[i] -= count[i] - break - } - } - if e.prev != nil { - o.verifyWeights(e.prev, e, e.prev.level) - } - } else { - prev := e.prev - e.elems = nextWeight(prev.level, o.getWeight(prev)) - o.verifyWeights(e, e.next, e.level) - } - } - return e.elems -} - -func (o *ordering) addExtension(e *entry) { - if ex := o.find(e.extend); ex != nil { - e.elems = append(e.elems, ex.elems...) - } else { - for _, r := range []rune(e.extend) { - e.elems = append(e.elems, o.find(string(r)).elems...) - } - } - e.extend = "" -} - -func (o *ordering) verifyWeights(a, b *entry, level colltab.Level) error { - if level == colltab.Identity || b == nil || b.elems == nil || a.elems == nil { - return nil - } - for i := colltab.Primary; i < level; i++ { - if a.elems[0].w[i] < b.elems[0].w[i] { - return nil - } - } - if a.elems[0].w[level] >= b.elems[0].w[level] { - err := fmt.Errorf("%s:overflow: collation elements of %q (%X) overflows those of %q (%X) at level %d (%X >= %X)", o.id, a.str, a.runes, b.str, b.runes, level, a.elems, b.elems) - log.Println(err) - // TODO: return the error instead, or better, fix the conflicting entry by making room. - } - return nil -} - -func (b *Builder) error(e error) { - if e != nil { - b.err = e - } -} - -func (b *Builder) errorID(locale string, e error) { - if e != nil { - b.err = fmt.Errorf("%s:%v", locale, e) - } -} - -// patchNorm ensures that NFC and NFD counterparts are consistent. -func (o *ordering) patchNorm() { - // Insert the NFD counterparts, if necessary. - for _, e := range o.ordered { - nfd := norm.NFD.String(e.str) - if nfd != e.str { - if e0 := o.find(nfd); e0 != nil && !e0.modified { - e0.elems = e.elems - } else if e.modified && !equalCEArrays(o.genColElems(nfd), e.elems) { - e := o.newEntry(nfd, e.elems) - e.modified = true - } - } - } - // Update unchanged composed forms if one of their parts changed. - for _, e := range o.ordered { - nfd := norm.NFD.String(e.str) - if e.modified || nfd == e.str { - continue - } - if e0 := o.find(nfd); e0 != nil { - e.elems = e0.elems - } else { - e.elems = o.genColElems(nfd) - if norm.NFD.LastBoundary([]byte(nfd)) == 0 { - r := []rune(nfd) - head := string(r[0]) - tail := "" - for i := 1; i < len(r); i++ { - s := norm.NFC.String(head + string(r[i])) - if e0 := o.find(s); e0 != nil && e0.modified { - head = s - } else { - tail += string(r[i]) - } - } - e.elems = append(o.genColElems(head), o.genColElems(tail)...) - } - } - } - // Exclude entries for which the individual runes generate the same collation elements. - for _, e := range o.ordered { - if len(e.runes) > 1 && equalCEArrays(o.genColElems(e.str), e.elems) { - e.exclude = true - } - } -} - -func (b *Builder) buildOrdering(o *ordering) { - for _, e := range o.ordered { - o.getWeight(e) - } - for _, e := range o.ordered { - o.addExtension(e) - } - o.patchNorm() - o.sort() - simplify(o) - b.processExpansions(o) // requires simplify - b.processContractions(o) // requires simplify - - t := newNode() - for e := o.front(); e != nil; e, _ = e.nextIndexed() { - if !e.skip() { - ce, err := e.encode() - b.errorID(o.id, err) - t.insert(e.runes[0], ce) - } - } - o.handle = b.index.addTrie(t) -} - -func (b *Builder) build() (*table, error) { - if b.built { - return b.t, b.err - } - b.built = true - b.t = &table{ - Table: colltab.Table{ - MaxContractLen: utf8.UTFMax, - VariableTop: uint32(b.varTop), - }, - } - - b.buildOrdering(&b.root) - b.t.root = b.root.handle - for _, t := range b.locale { - b.buildOrdering(t.index) - if b.err != nil { - break - } - } - i, err := b.index.generate() - b.t.trie = *i - b.t.Index = colltab.Trie{ - Index: i.index, - Values: i.values, - Index0: i.index[blockSize*b.t.root.lookupStart:], - Values0: i.values[blockSize*b.t.root.valueStart:], - } - b.error(err) - return b.t, b.err -} - -// Build builds the root Collator. -func (b *Builder) Build() (colltab.Weighter, error) { - table, err := b.build() - if err != nil { - return nil, err - } - return table, nil -} - -// Build builds a Collator for Tailoring t. -func (t *Tailoring) Build() (colltab.Weighter, error) { - // TODO: implement. - return nil, nil -} - -// Print prints the tables for b and all its Tailorings as a Go file -// that can be included in the Collate package. -func (b *Builder) Print(w io.Writer) (n int, err error) { - p := func(nn int, e error) { - n += nn - if err == nil { - err = e - } - } - t, err := b.build() - if err != nil { - return 0, err - } - p(fmt.Fprintf(w, `var availableLocales = "und`)) - for _, loc := range b.locale { - if loc.id != "und" { - p(fmt.Fprintf(w, ",%s", loc.id)) - } - } - p(fmt.Fprint(w, "\"\n\n")) - p(fmt.Fprintf(w, "const varTop = 0x%x\n\n", b.varTop)) - p(fmt.Fprintln(w, "var locales = [...]tableIndex{")) - for _, loc := range b.locale { - if loc.id == "und" { - p(t.fprintIndex(w, loc.index.handle, loc.id)) - } - } - for _, loc := range b.locale { - if loc.id != "und" { - p(t.fprintIndex(w, loc.index.handle, loc.id)) - } - } - p(fmt.Fprint(w, "}\n\n")) - n, _, err = t.fprint(w, "main") - return -} - -// reproducibleFromNFKD checks whether the given expansion could be generated -// from an NFKD expansion. -func reproducibleFromNFKD(e *entry, exp, nfkd []rawCE) bool { - // Length must be equal. - if len(exp) != len(nfkd) { - return false - } - for i, ce := range exp { - // Primary and secondary values should be equal. - if ce.w[0] != nfkd[i].w[0] || ce.w[1] != nfkd[i].w[1] { - return false - } - // Tertiary values should be equal to maxTertiary for third element onwards. - // TODO: there seem to be a lot of cases in CLDR (e.g. ㏭ in zh.xml) that can - // simply be dropped. Try this out by dropping the following code. - if i >= 2 && ce.w[2] != maxTertiary { - return false - } - if _, err := makeCE(ce); err != nil { - // Simply return false. The error will be caught elsewhere. - return false - } - } - return true -} - -func simplify(o *ordering) { - // Runes that are a starter of a contraction should not be removed. - // (To date, there is only Kannada character 0CCA.) - keep := make(map[rune]bool) - for e := o.front(); e != nil; e, _ = e.nextIndexed() { - if len(e.runes) > 1 { - keep[e.runes[0]] = true - } - } - // Tag entries for which the runes NFKD decompose to identical values. - for e := o.front(); e != nil; e, _ = e.nextIndexed() { - s := e.str - nfkd := norm.NFKD.String(s) - nfd := norm.NFD.String(s) - if e.decompose || len(e.runes) > 1 || len(e.elems) == 1 || keep[e.runes[0]] || nfkd == nfd { - continue - } - if reproducibleFromNFKD(e, e.elems, o.genColElems(nfkd)) { - e.decompose = true - } - } -} - -// appendExpansion converts the given collation sequence to -// collation elements and adds them to the expansion table. -// It returns an index to the expansion table. -func (b *Builder) appendExpansion(e *entry) int { - t := b.t - i := len(t.ExpandElem) - ce := uint32(len(e.elems)) - t.ExpandElem = append(t.ExpandElem, ce) - for _, w := range e.elems { - ce, err := makeCE(w) - if err != nil { - b.error(err) - return -1 - } - t.ExpandElem = append(t.ExpandElem, ce) - } - return i -} - -// processExpansions extracts data necessary to generate -// the extraction tables. -func (b *Builder) processExpansions(o *ordering) { - for e := o.front(); e != nil; e, _ = e.nextIndexed() { - if !e.expansion() { - continue - } - key := fmt.Sprintf("%v", e.elems) - i, ok := b.expIndex[key] - if !ok { - i = b.appendExpansion(e) - b.expIndex[key] = i - } - e.expansionIndex = i - } -} - -func (b *Builder) processContractions(o *ordering) { - // Collate contractions per starter rune. - starters := []rune{} - cm := make(map[rune][]*entry) - for e := o.front(); e != nil; e, _ = e.nextIndexed() { - if e.contraction() { - if len(e.str) > b.t.MaxContractLen { - b.t.MaxContractLen = len(e.str) - } - r := e.runes[0] - if _, ok := cm[r]; !ok { - starters = append(starters, r) - } - cm[r] = append(cm[r], e) - } - } - // Add entries of single runes that are at a start of a contraction. - for e := o.front(); e != nil; e, _ = e.nextIndexed() { - if !e.contraction() { - r := e.runes[0] - if _, ok := cm[r]; ok { - cm[r] = append(cm[r], e) - } - } - } - // Build the tries for the contractions. - t := b.t - for _, r := range starters { - l := cm[r] - // Compute suffix strings. There are 31 different contraction suffix - // sets for 715 contractions and 82 contraction starter runes as of - // version 6.0.0. - sufx := []string{} - hasSingle := false - for _, e := range l { - if len(e.runes) > 1 { - sufx = append(sufx, string(e.runes[1:])) - } else { - hasSingle = true - } - } - if !hasSingle { - b.error(fmt.Errorf("no single entry for starter rune %U found", r)) - continue - } - // Unique the suffix set. - sort.Strings(sufx) - key := strings.Join(sufx, "\n") - handle, ok := b.ctHandle[key] - if !ok { - var err error - handle, err = appendTrie(&t.ContractTries, sufx) - if err != nil { - b.error(err) - } - b.ctHandle[key] = handle - } - // Bucket sort entries in index order. - es := make([]*entry, len(l)) - for _, e := range l { - var p, sn int - if len(e.runes) > 1 { - str := []byte(string(e.runes[1:])) - p, sn = lookup(&t.ContractTries, handle, str) - if sn != len(str) { - log.Fatalf("%s: processContractions: unexpected length for '%X'; len=%d; want %d", o.id, e.runes, sn, len(str)) - } - } - if es[p] != nil { - log.Fatalf("%s: multiple contractions for position %d for rune %U", o.id, p, e.runes[0]) - } - es[p] = e - } - // Create collation elements for contractions. - elems := []uint32{} - for _, e := range es { - ce, err := e.encodeBase() - b.errorID(o.id, err) - elems = append(elems, ce) - } - key = fmt.Sprintf("%v", elems) - i, ok := b.ctElem[key] - if !ok { - i = len(t.ContractElem) - b.ctElem[key] = i - t.ContractElem = append(t.ContractElem, elems...) - } - // Store info in entry for starter rune. - es[0].contractionIndex = i - es[0].contractionHandle = handle - } -} diff --git a/vendor/golang.org/x/text/collate/build/builder_test.go b/vendor/golang.org/x/text/collate/build/builder_test.go deleted file mode 100644 index ff0aba3ae..000000000 --- a/vendor/golang.org/x/text/collate/build/builder_test.go +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import "testing" - -// cjk returns an implicit collation element for a CJK rune. -func cjk(r rune) []rawCE { - // A CJK character C is represented in the DUCET as - // [.AAAA.0020.0002.C][.BBBB.0000.0000.C] - // Where AAAA is the most significant 15 bits plus a base value. - // Any base value will work for the test, so we pick the common value of FB40. - const base = 0xFB40 - return []rawCE{ - {w: []int{base + int(r>>15), defaultSecondary, defaultTertiary, int(r)}}, - {w: []int{int(r&0x7FFF) | 0x8000, 0, 0, int(r)}}, - } -} - -func pCE(p int) []rawCE { - return mkCE([]int{p, defaultSecondary, defaultTertiary, 0}, 0) -} - -func pqCE(p, q int) []rawCE { - return mkCE([]int{p, defaultSecondary, defaultTertiary, q}, 0) -} - -func ptCE(p, t int) []rawCE { - return mkCE([]int{p, defaultSecondary, t, 0}, 0) -} - -func ptcCE(p, t int, ccc uint8) []rawCE { - return mkCE([]int{p, defaultSecondary, t, 0}, ccc) -} - -func sCE(s int) []rawCE { - return mkCE([]int{0, s, defaultTertiary, 0}, 0) -} - -func stCE(s, t int) []rawCE { - return mkCE([]int{0, s, t, 0}, 0) -} - -func scCE(s int, ccc uint8) []rawCE { - return mkCE([]int{0, s, defaultTertiary, 0}, ccc) -} - -func mkCE(w []int, ccc uint8) []rawCE { - return []rawCE{rawCE{w, ccc}} -} - -// ducetElem is used to define test data that is used to generate a table. -type ducetElem struct { - str string - ces []rawCE -} - -func newBuilder(t *testing.T, ducet []ducetElem) *Builder { - b := NewBuilder() - for _, e := range ducet { - ces := [][]int{} - for _, ce := range e.ces { - ces = append(ces, ce.w) - } - if err := b.Add([]rune(e.str), ces, nil); err != nil { - t.Errorf(err.Error()) - } - } - b.t = &table{} - b.root.sort() - return b -} - -type convertTest struct { - in, out []rawCE - err bool -} - -var convLargeTests = []convertTest{ - {pCE(0xFB39), pCE(0xFB39), false}, - {cjk(0x2F9B2), pqCE(0x3F9B2, 0x2F9B2), false}, - {pCE(0xFB40), pCE(0), true}, - {append(pCE(0xFB40), pCE(0)[0]), pCE(0), true}, - {pCE(0xFFFE), pCE(illegalOffset), false}, - {pCE(0xFFFF), pCE(illegalOffset + 1), false}, -} - -func TestConvertLarge(t *testing.T) { - for i, tt := range convLargeTests { - e := new(entry) - for _, ce := range tt.in { - e.elems = append(e.elems, makeRawCE(ce.w, ce.ccc)) - } - elems, err := convertLargeWeights(e.elems) - if tt.err { - if err == nil { - t.Errorf("%d: expected error; none found", i) - } - continue - } else if err != nil { - t.Errorf("%d: unexpected error: %v", i, err) - } - if !equalCEArrays(elems, tt.out) { - t.Errorf("%d: conversion was %x; want %x", i, elems, tt.out) - } - } -} - -// Collation element table for simplify tests. -var simplifyTest = []ducetElem{ - {"\u0300", sCE(30)}, // grave - {"\u030C", sCE(40)}, // caron - {"A", ptCE(100, 8)}, - {"D", ptCE(104, 8)}, - {"E", ptCE(105, 8)}, - {"I", ptCE(110, 8)}, - {"z", ptCE(130, 8)}, - {"\u05F2", append(ptCE(200, 4), ptCE(200, 4)[0])}, - {"\u05B7", sCE(80)}, - {"\u00C0", append(ptCE(100, 8), sCE(30)...)}, // A with grave, can be removed - {"\u00C8", append(ptCE(105, 8), sCE(30)...)}, // E with grave - {"\uFB1F", append(ptCE(200, 4), ptCE(200, 4)[0], sCE(80)[0])}, // eliminated by NFD - {"\u00C8\u0302", ptCE(106, 8)}, // block previous from simplifying - {"\u01C5", append(ptCE(104, 9), ptCE(130, 4)[0], stCE(40, maxTertiary)[0])}, // eliminated by NFKD - // no removal: tertiary value of third element is not maxTertiary - {"\u2162", append(ptCE(110, 9), ptCE(110, 4)[0], ptCE(110, 8)[0])}, -} - -var genColTests = []ducetElem{ - {"\uFA70", pqCE(0x1FA70, 0xFA70)}, - {"A\u0300", append(ptCE(100, 8), sCE(30)...)}, - {"A\u0300\uFA70", append(ptCE(100, 8), sCE(30)[0], pqCE(0x1FA70, 0xFA70)[0])}, - {"A\u0300A\u0300", append(ptCE(100, 8), sCE(30)[0], ptCE(100, 8)[0], sCE(30)[0])}, -} - -func TestGenColElems(t *testing.T) { - b := newBuilder(t, simplifyTest[:5]) - - for i, tt := range genColTests { - res := b.root.genColElems(tt.str) - if !equalCEArrays(tt.ces, res) { - t.Errorf("%d: result %X; want %X", i, res, tt.ces) - } - } -} - -type strArray []string - -func (sa strArray) contains(s string) bool { - for _, e := range sa { - if e == s { - return true - } - } - return false -} - -var simplifyRemoved = strArray{"\u00C0", "\uFB1F"} -var simplifyMarked = strArray{"\u01C5"} - -func TestSimplify(t *testing.T) { - b := newBuilder(t, simplifyTest) - o := &b.root - simplify(o) - - for i, tt := range simplifyTest { - if simplifyRemoved.contains(tt.str) { - continue - } - e := o.find(tt.str) - if e.str != tt.str || !equalCEArrays(e.elems, tt.ces) { - t.Errorf("%d: found element %s -> %X; want %s -> %X", i, e.str, e.elems, tt.str, tt.ces) - break - } - } - var i, k int - for e := o.front(); e != nil; e, _ = e.nextIndexed() { - gold := simplifyMarked.contains(e.str) - if gold { - k++ - } - if gold != e.decompose { - t.Errorf("%d: %s has decompose %v; want %v", i, e.str, e.decompose, gold) - } - i++ - } - if k != len(simplifyMarked) { - t.Errorf(" an entry that should be marked as decompose was deleted") - } -} - -var expandTest = []ducetElem{ - {"\u0300", append(scCE(29, 230), scCE(30, 230)...)}, - {"\u00C0", append(ptCE(100, 8), scCE(30, 230)...)}, - {"\u00C8", append(ptCE(105, 8), scCE(30, 230)...)}, - {"\u00C9", append(ptCE(105, 8), scCE(30, 230)...)}, // identical expansion - {"\u05F2", append(ptCE(200, 4), ptCE(200, 4)[0], ptCE(200, 4)[0])}, - {"\u01FF", append(ptCE(200, 4), ptcCE(201, 4, 0)[0], scCE(30, 230)[0])}, -} - -func TestExpand(t *testing.T) { - const ( - totalExpansions = 5 - totalElements = 2 + 2 + 2 + 3 + 3 + totalExpansions - ) - b := newBuilder(t, expandTest) - o := &b.root - b.processExpansions(o) - - e := o.front() - for _, tt := range expandTest { - exp := b.t.ExpandElem[e.expansionIndex:] - if int(exp[0]) != len(tt.ces) { - t.Errorf("%U: len(expansion)==%d; want %d", []rune(tt.str)[0], exp[0], len(tt.ces)) - } - exp = exp[1:] - for j, w := range tt.ces { - if ce, _ := makeCE(w); exp[j] != ce { - t.Errorf("%U: element %d is %X; want %X", []rune(tt.str)[0], j, exp[j], ce) - } - } - e, _ = e.nextIndexed() - } - // Verify uniquing. - if len(b.t.ExpandElem) != totalElements { - t.Errorf("len(expandElem)==%d; want %d", len(b.t.ExpandElem), totalElements) - } -} - -var contractTest = []ducetElem{ - {"abc", pCE(102)}, - {"abd", pCE(103)}, - {"a", pCE(100)}, - {"ab", pCE(101)}, - {"ac", pCE(104)}, - {"bcd", pCE(202)}, - {"b", pCE(200)}, - {"bc", pCE(201)}, - {"bd", pCE(203)}, - // shares suffixes with a* - {"Ab", pCE(301)}, - {"A", pCE(300)}, - {"Ac", pCE(304)}, - {"Abc", pCE(302)}, - {"Abd", pCE(303)}, - // starter to be ignored - {"z", pCE(1000)}, -} - -func TestContract(t *testing.T) { - const ( - totalElements = 5 + 5 + 4 - ) - b := newBuilder(t, contractTest) - o := &b.root - b.processContractions(o) - - indexMap := make(map[int]bool) - handleMap := make(map[rune]*entry) - for e := o.front(); e != nil; e, _ = e.nextIndexed() { - if e.contractionHandle.n > 0 { - handleMap[e.runes[0]] = e - indexMap[e.contractionHandle.index] = true - } - } - // Verify uniquing. - if len(indexMap) != 2 { - t.Errorf("number of tries is %d; want %d", len(indexMap), 2) - } - for _, tt := range contractTest { - e, ok := handleMap[[]rune(tt.str)[0]] - if !ok { - continue - } - str := tt.str[1:] - offset, n := lookup(&b.t.ContractTries, e.contractionHandle, []byte(str)) - if len(str) != n { - t.Errorf("%s: bytes consumed==%d; want %d", tt.str, n, len(str)) - } - ce := b.t.ContractElem[offset+e.contractionIndex] - if want, _ := makeCE(tt.ces[0]); want != ce { - t.Errorf("%s: element %X; want %X", tt.str, ce, want) - } - } - if len(b.t.ContractElem) != totalElements { - t.Errorf("len(expandElem)==%d; want %d", len(b.t.ContractElem), totalElements) - } -} diff --git a/vendor/golang.org/x/text/collate/build/colelem.go b/vendor/golang.org/x/text/collate/build/colelem.go deleted file mode 100644 index 726fe5427..000000000 --- a/vendor/golang.org/x/text/collate/build/colelem.go +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "fmt" - "unicode" - - "golang.org/x/text/internal/colltab" -) - -const ( - defaultSecondary = 0x20 - defaultTertiary = 0x2 - maxTertiary = 0x1F -) - -type rawCE struct { - w []int - ccc uint8 -} - -func makeRawCE(w []int, ccc uint8) rawCE { - ce := rawCE{w: make([]int, 4), ccc: ccc} - copy(ce.w, w) - return ce -} - -// A collation element is represented as an uint32. -// In the typical case, a rune maps to a single collation element. If a rune -// can be the start of a contraction or expands into multiple collation elements, -// then the collation element that is associated with a rune will have a special -// form to represent such m to n mappings. Such special collation elements -// have a value >= 0x80000000. - -const ( - maxPrimaryBits = 21 - maxSecondaryBits = 12 - maxTertiaryBits = 8 -) - -func makeCE(ce rawCE) (uint32, error) { - v, e := colltab.MakeElem(ce.w[0], ce.w[1], ce.w[2], ce.ccc) - return uint32(v), e -} - -// For contractions, collation elements are of the form -// 110bbbbb bbbbbbbb iiiiiiii iiiinnnn, where -// - n* is the size of the first node in the contraction trie. -// - i* is the index of the first node in the contraction trie. -// - b* is the offset into the contraction collation element table. -// See contract.go for details on the contraction trie. -const ( - contractID = 0xC0000000 - maxNBits = 4 - maxTrieIndexBits = 12 - maxContractOffsetBits = 13 -) - -func makeContractIndex(h ctHandle, offset int) (uint32, error) { - if h.n >= 1<<maxNBits { - return 0, fmt.Errorf("size of contraction trie node too large: %d >= %d", h.n, 1<<maxNBits) - } - if h.index >= 1<<maxTrieIndexBits { - return 0, fmt.Errorf("size of contraction trie offset too large: %d >= %d", h.index, 1<<maxTrieIndexBits) - } - if offset >= 1<<maxContractOffsetBits { - return 0, fmt.Errorf("contraction offset out of bounds: %x >= %x", offset, 1<<maxContractOffsetBits) - } - ce := uint32(contractID) - ce += uint32(offset << (maxNBits + maxTrieIndexBits)) - ce += uint32(h.index << maxNBits) - ce += uint32(h.n) - return ce, nil -} - -// For expansions, collation elements are of the form -// 11100000 00000000 bbbbbbbb bbbbbbbb, -// where b* is the index into the expansion sequence table. -const ( - expandID = 0xE0000000 - maxExpandIndexBits = 16 -) - -func makeExpandIndex(index int) (uint32, error) { - if index >= 1<<maxExpandIndexBits { - return 0, fmt.Errorf("expansion index out of bounds: %x >= %x", index, 1<<maxExpandIndexBits) - } - return expandID + uint32(index), nil -} - -// Each list of collation elements corresponding to an expansion starts with -// a header indicating the length of the sequence. -func makeExpansionHeader(n int) (uint32, error) { - return uint32(n), nil -} - -// Some runes can be expanded using NFKD decomposition. Instead of storing the full -// sequence of collation elements, we decompose the rune and lookup the collation -// elements for each rune in the decomposition and modify the tertiary weights. -// The collation element, in this case, is of the form -// 11110000 00000000 wwwwwwww vvvvvvvv, where -// - v* is the replacement tertiary weight for the first rune, -// - w* is the replacement tertiary weight for the second rune, -// Tertiary weights of subsequent runes should be replaced with maxTertiary. -// See http://www.unicode.org/reports/tr10/#Compatibility_Decompositions for more details. -const ( - decompID = 0xF0000000 -) - -func makeDecompose(t1, t2 int) (uint32, error) { - if t1 >= 256 || t1 < 0 { - return 0, fmt.Errorf("first tertiary weight out of bounds: %d >= 256", t1) - } - if t2 >= 256 || t2 < 0 { - return 0, fmt.Errorf("second tertiary weight out of bounds: %d >= 256", t2) - } - return uint32(t2<<8+t1) + decompID, nil -} - -const ( - // These constants were taken from http://www.unicode.org/versions/Unicode6.0.0/ch12.pdf. - minUnified rune = 0x4E00 - maxUnified = 0x9FFF - minCompatibility = 0xF900 - maxCompatibility = 0xFAFF - minRare = 0x3400 - maxRare = 0x4DBF -) -const ( - commonUnifiedOffset = 0x10000 - rareUnifiedOffset = 0x20000 // largest rune in common is U+FAFF - otherOffset = 0x50000 // largest rune in rare is U+2FA1D - illegalOffset = otherOffset + int(unicode.MaxRune) - maxPrimary = illegalOffset + 1 -) - -// implicitPrimary returns the primary weight for the a rune -// for which there is no entry for the rune in the collation table. -// We take a different approach from the one specified in -// http://unicode.org/reports/tr10/#Implicit_Weights, -// but preserve the resulting relative ordering of the runes. -func implicitPrimary(r rune) int { - if unicode.Is(unicode.Ideographic, r) { - if r >= minUnified && r <= maxUnified { - // The most common case for CJK. - return int(r) + commonUnifiedOffset - } - if r >= minCompatibility && r <= maxCompatibility { - // This will typically not hit. The DUCET explicitly specifies mappings - // for all characters that do not decompose. - return int(r) + commonUnifiedOffset - } - return int(r) + rareUnifiedOffset - } - return int(r) + otherOffset -} - -// convertLargeWeights converts collation elements with large -// primaries (either double primaries or for illegal runes) -// to our own representation. -// A CJK character C is represented in the DUCET as -// [.FBxx.0020.0002.C][.BBBB.0000.0000.C] -// We will rewrite these characters to a single CE. -// We assume the CJK values start at 0x8000. -// See http://unicode.org/reports/tr10/#Implicit_Weights -func convertLargeWeights(elems []rawCE) (res []rawCE, err error) { - const ( - cjkPrimaryStart = 0xFB40 - rarePrimaryStart = 0xFB80 - otherPrimaryStart = 0xFBC0 - illegalPrimary = 0xFFFE - highBitsMask = 0x3F - lowBitsMask = 0x7FFF - lowBitsFlag = 0x8000 - shiftBits = 15 - ) - for i := 0; i < len(elems); i++ { - ce := elems[i].w - p := ce[0] - if p < cjkPrimaryStart { - continue - } - if p > 0xFFFF { - return elems, fmt.Errorf("found primary weight %X; should be <= 0xFFFF", p) - } - if p >= illegalPrimary { - ce[0] = illegalOffset + p - illegalPrimary - } else { - if i+1 >= len(elems) { - return elems, fmt.Errorf("second part of double primary weight missing: %v", elems) - } - if elems[i+1].w[0]&lowBitsFlag == 0 { - return elems, fmt.Errorf("malformed second part of double primary weight: %v", elems) - } - np := ((p & highBitsMask) << shiftBits) + elems[i+1].w[0]&lowBitsMask - switch { - case p < rarePrimaryStart: - np += commonUnifiedOffset - case p < otherPrimaryStart: - np += rareUnifiedOffset - default: - p += otherOffset - } - ce[0] = np - for j := i + 1; j+1 < len(elems); j++ { - elems[j] = elems[j+1] - } - elems = elems[:len(elems)-1] - } - } - return elems, nil -} - -// nextWeight computes the first possible collation weights following elems -// for the given level. -func nextWeight(level colltab.Level, elems []rawCE) []rawCE { - if level == colltab.Identity { - next := make([]rawCE, len(elems)) - copy(next, elems) - return next - } - next := []rawCE{makeRawCE(elems[0].w, elems[0].ccc)} - next[0].w[level]++ - if level < colltab.Secondary { - next[0].w[colltab.Secondary] = defaultSecondary - } - if level < colltab.Tertiary { - next[0].w[colltab.Tertiary] = defaultTertiary - } - // Filter entries that cannot influence ordering. - for _, ce := range elems[1:] { - skip := true - for i := colltab.Primary; i < level; i++ { - skip = skip && ce.w[i] == 0 - } - if !skip { - next = append(next, ce) - } - } - return next -} - -func nextVal(elems []rawCE, i int, level colltab.Level) (index, value int) { - for ; i < len(elems) && elems[i].w[level] == 0; i++ { - } - if i < len(elems) { - return i, elems[i].w[level] - } - return i, 0 -} - -// compareWeights returns -1 if a < b, 1 if a > b, or 0 otherwise. -// It also returns the collation level at which the difference is found. -func compareWeights(a, b []rawCE) (result int, level colltab.Level) { - for level := colltab.Primary; level < colltab.Identity; level++ { - var va, vb int - for ia, ib := 0, 0; ia < len(a) || ib < len(b); ia, ib = ia+1, ib+1 { - ia, va = nextVal(a, ia, level) - ib, vb = nextVal(b, ib, level) - if va != vb { - if va < vb { - return -1, level - } else { - return 1, level - } - } - } - } - return 0, colltab.Identity -} - -func equalCE(a, b rawCE) bool { - for i := 0; i < 3; i++ { - if b.w[i] != a.w[i] { - return false - } - } - return true -} - -func equalCEArrays(a, b []rawCE) bool { - if len(a) != len(b) { - return false - } - for i := range a { - if !equalCE(a[i], b[i]) { - return false - } - } - return true -} diff --git a/vendor/golang.org/x/text/collate/build/colelem_test.go b/vendor/golang.org/x/text/collate/build/colelem_test.go deleted file mode 100644 index d0c8d07d8..000000000 --- a/vendor/golang.org/x/text/collate/build/colelem_test.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "testing" - - "golang.org/x/text/internal/colltab" -) - -type ceTest struct { - f func(in []int) (uint32, error) - arg []int - val uint32 -} - -func normalCE(in []int) (ce uint32, err error) { - return makeCE(rawCE{w: in[:3], ccc: uint8(in[3])}) -} - -func expandCE(in []int) (ce uint32, err error) { - return makeExpandIndex(in[0]) -} - -func contractCE(in []int) (ce uint32, err error) { - return makeContractIndex(ctHandle{in[0], in[1]}, in[2]) -} - -func decompCE(in []int) (ce uint32, err error) { - return makeDecompose(in[0], in[1]) -} - -var ceTests = []ceTest{ - {normalCE, []int{0, 0, 0, 0}, 0xA0000000}, - {normalCE, []int{0, 0x28, 3, 0}, 0xA0002803}, - {normalCE, []int{0, 0x28, 3, 0xFF}, 0xAFF02803}, - {normalCE, []int{100, defaultSecondary, 3, 0}, 0x0000C883}, - // non-ignorable primary with non-default secondary - {normalCE, []int{100, 0x28, defaultTertiary, 0}, 0x4000C828}, - {normalCE, []int{100, defaultSecondary + 8, 3, 0}, 0x0000C983}, - {normalCE, []int{100, 0, 3, 0}, 0xFFFF}, // non-ignorable primary with non-supported secondary - {normalCE, []int{100, 1, 3, 0}, 0xFFFF}, - {normalCE, []int{1 << maxPrimaryBits, defaultSecondary, 0, 0}, 0xFFFF}, - {normalCE, []int{0, 1 << maxSecondaryBits, 0, 0}, 0xFFFF}, - {normalCE, []int{100, defaultSecondary, 1 << maxTertiaryBits, 0}, 0xFFFF}, - {normalCE, []int{0x123, defaultSecondary, 8, 0xFF}, 0x88FF0123}, - {normalCE, []int{0x123, defaultSecondary + 1, 8, 0xFF}, 0xFFFF}, - - {contractCE, []int{0, 0, 0}, 0xC0000000}, - {contractCE, []int{1, 1, 1}, 0xC0010011}, - {contractCE, []int{1, (1 << maxNBits) - 1, 1}, 0xC001001F}, - {contractCE, []int{(1 << maxTrieIndexBits) - 1, 1, 1}, 0xC001FFF1}, - {contractCE, []int{1, 1, (1 << maxContractOffsetBits) - 1}, 0xDFFF0011}, - {contractCE, []int{1, (1 << maxNBits), 1}, 0xFFFF}, - {contractCE, []int{(1 << maxTrieIndexBits), 1, 1}, 0xFFFF}, - {contractCE, []int{1, (1 << maxContractOffsetBits), 1}, 0xFFFF}, - - {expandCE, []int{0}, 0xE0000000}, - {expandCE, []int{5}, 0xE0000005}, - {expandCE, []int{(1 << maxExpandIndexBits) - 1}, 0xE000FFFF}, - {expandCE, []int{1 << maxExpandIndexBits}, 0xFFFF}, - - {decompCE, []int{0, 0}, 0xF0000000}, - {decompCE, []int{1, 1}, 0xF0000101}, - {decompCE, []int{0x1F, 0x1F}, 0xF0001F1F}, - {decompCE, []int{256, 0x1F}, 0xFFFF}, - {decompCE, []int{0x1F, 256}, 0xFFFF}, -} - -func TestColElem(t *testing.T) { - for i, tt := range ceTests { - in := make([]int, len(tt.arg)) - copy(in, tt.arg) - ce, err := tt.f(in) - if tt.val == 0xFFFF { - if err == nil { - t.Errorf("%d: expected error for args %x", i, tt.arg) - } - continue - } - if err != nil { - t.Errorf("%d: unexpected error: %v", i, err.Error()) - } - if ce != tt.val { - t.Errorf("%d: colElem=%X; want %X", i, ce, tt.val) - } - } -} - -func mkRawCES(in [][]int) []rawCE { - out := []rawCE{} - for _, w := range in { - out = append(out, rawCE{w: w}) - } - return out -} - -type weightsTest struct { - a, b [][]int - level colltab.Level - result int -} - -var nextWeightTests = []weightsTest{ - { - a: [][]int{{100, 20, 5, 0}}, - b: [][]int{{101, defaultSecondary, defaultTertiary, 0}}, - level: colltab.Primary, - }, - { - a: [][]int{{100, 20, 5, 0}}, - b: [][]int{{100, 21, defaultTertiary, 0}}, - level: colltab.Secondary, - }, - { - a: [][]int{{100, 20, 5, 0}}, - b: [][]int{{100, 20, 6, 0}}, - level: colltab.Tertiary, - }, - { - a: [][]int{{100, 20, 5, 0}}, - b: [][]int{{100, 20, 5, 0}}, - level: colltab.Identity, - }, -} - -var extra = [][]int{{200, 32, 8, 0}, {0, 32, 8, 0}, {0, 0, 8, 0}, {0, 0, 0, 0}} - -func TestNextWeight(t *testing.T) { - for i, tt := range nextWeightTests { - test := func(l colltab.Level, tt weightsTest, a, gold [][]int) { - res := nextWeight(tt.level, mkRawCES(a)) - if !equalCEArrays(mkRawCES(gold), res) { - t.Errorf("%d:%d: expected weights %d; found %d", i, l, gold, res) - } - } - test(-1, tt, tt.a, tt.b) - for l := colltab.Primary; l <= colltab.Tertiary; l++ { - if tt.level <= l { - test(l, tt, append(tt.a, extra[l]), tt.b) - } else { - test(l, tt, append(tt.a, extra[l]), append(tt.b, extra[l])) - } - } - } -} - -var compareTests = []weightsTest{ - { - [][]int{{100, 20, 5, 0}}, - [][]int{{100, 20, 5, 0}}, - colltab.Identity, - 0, - }, - { - [][]int{{100, 20, 5, 0}, extra[0]}, - [][]int{{100, 20, 5, 1}}, - colltab.Primary, - 1, - }, - { - [][]int{{100, 20, 5, 0}}, - [][]int{{101, 20, 5, 0}}, - colltab.Primary, - -1, - }, - { - [][]int{{101, 20, 5, 0}}, - [][]int{{100, 20, 5, 0}}, - colltab.Primary, - 1, - }, - { - [][]int{{100, 0, 0, 0}, {0, 20, 5, 0}}, - [][]int{{0, 20, 5, 0}, {100, 0, 0, 0}}, - colltab.Identity, - 0, - }, - { - [][]int{{100, 20, 5, 0}}, - [][]int{{100, 21, 5, 0}}, - colltab.Secondary, - -1, - }, - { - [][]int{{100, 20, 5, 0}}, - [][]int{{100, 20, 2, 0}}, - colltab.Tertiary, - 1, - }, - { - [][]int{{100, 20, 5, 1}}, - [][]int{{100, 20, 5, 2}}, - colltab.Quaternary, - -1, - }, -} - -func TestCompareWeights(t *testing.T) { - for i, tt := range compareTests { - test := func(tt weightsTest, a, b [][]int) { - res, level := compareWeights(mkRawCES(a), mkRawCES(b)) - if res != tt.result { - t.Errorf("%d: expected comparison result %d; found %d", i, tt.result, res) - } - if level != tt.level { - t.Errorf("%d: expected level %d; found %d", i, tt.level, level) - } - } - test(tt, tt.a, tt.b) - test(tt, append(tt.a, extra[0]), append(tt.b, extra[0])) - } -} diff --git a/vendor/golang.org/x/text/collate/build/contract.go b/vendor/golang.org/x/text/collate/build/contract.go deleted file mode 100644 index d96af7896..000000000 --- a/vendor/golang.org/x/text/collate/build/contract.go +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "fmt" - "io" - "reflect" - "sort" - "strings" - - "golang.org/x/text/internal/colltab" -) - -// This file contains code for detecting contractions and generating -// the necessary tables. -// Any Unicode Collation Algorithm (UCA) table entry that has more than -// one rune one the left-hand side is called a contraction. -// See http://www.unicode.org/reports/tr10/#Contractions for more details. -// -// We define the following terms: -// initial: a rune that appears as the first rune in a contraction. -// suffix: a sequence of runes succeeding the initial rune -// in a given contraction. -// non-initial: a rune that appears in a suffix. -// -// A rune may be both a initial and a non-initial and may be so in -// many contractions. An initial may typically also appear by itself. -// In case of ambiguities, the UCA requires we match the longest -// contraction. -// -// Many contraction rules share the same set of possible suffixes. -// We store sets of suffixes in a trie that associates an index with -// each suffix in the set. This index can be used to look up a -// collation element associated with the (starter rune, suffix) pair. -// -// The trie is defined on a UTF-8 byte sequence. -// The overall trie is represented as an array of ctEntries. Each node of the trie -// is represented as a subsequence of ctEntries, where each entry corresponds to -// a possible match of a next character in the search string. An entry -// also includes the length and offset to the next sequence of entries -// to check in case of a match. - -const ( - final = 0 - noIndex = 0xFF -) - -// ctEntry associates to a matching byte an offset and/or next sequence of -// bytes to check. A ctEntry c is called final if a match means that the -// longest suffix has been found. An entry c is final if c.N == 0. -// A single final entry can match a range of characters to an offset. -// A non-final entry always matches a single byte. Note that a non-final -// entry might still resemble a completed suffix. -// Examples: -// The suffix strings "ab" and "ac" can be represented as: -// []ctEntry{ -// {'a', 1, 1, noIndex}, // 'a' by itself does not match, so i is 0xFF. -// {'b', 'c', 0, 1}, // "ab" -> 1, "ac" -> 2 -// } -// -// The suffix strings "ab", "abc", "abd", and "abcd" can be represented as: -// []ctEntry{ -// {'a', 1, 1, noIndex}, // 'a' must be followed by 'b'. -// {'b', 1, 2, 1}, // "ab" -> 1, may be followed by 'c' or 'd'. -// {'d', 'd', final, 3}, // "abd" -> 3 -// {'c', 4, 1, 2}, // "abc" -> 2, may be followed by 'd'. -// {'d', 'd', final, 4}, // "abcd" -> 4 -// } -// See genStateTests in contract_test.go for more examples. -type ctEntry struct { - L uint8 // non-final: byte value to match; final: lowest match in range. - H uint8 // non-final: relative index to next block; final: highest match in range. - N uint8 // non-final: length of next block; final: final - I uint8 // result offset. Will be noIndex if more bytes are needed to complete. -} - -// contractTrieSet holds a set of contraction tries. The tries are stored -// consecutively in the entry field. -type contractTrieSet []struct{ l, h, n, i uint8 } - -// ctHandle is used to identify a trie in the trie set, consisting in an offset -// in the array and the size of the first node. -type ctHandle struct { - index, n int -} - -// appendTrie adds a new trie for the given suffixes to the trie set and returns -// a handle to it. The handle will be invalid on error. -func appendTrie(ct *colltab.ContractTrieSet, suffixes []string) (ctHandle, error) { - es := make([]stridx, len(suffixes)) - for i, s := range suffixes { - es[i].str = s - } - sort.Sort(offsetSort(es)) - for i := range es { - es[i].index = i + 1 - } - sort.Sort(genidxSort(es)) - i := len(*ct) - n, err := genStates(ct, es) - if err != nil { - *ct = (*ct)[:i] - return ctHandle{}, err - } - return ctHandle{i, n}, nil -} - -// genStates generates ctEntries for a given suffix set and returns -// the number of entries for the first node. -func genStates(ct *colltab.ContractTrieSet, sis []stridx) (int, error) { - if len(sis) == 0 { - return 0, fmt.Errorf("genStates: list of suffices must be non-empty") - } - start := len(*ct) - // create entries for differing first bytes. - for _, si := range sis { - s := si.str - if len(s) == 0 { - continue - } - added := false - c := s[0] - if len(s) > 1 { - for j := len(*ct) - 1; j >= start; j-- { - if (*ct)[j].L == c { - added = true - break - } - } - if !added { - *ct = append(*ct, ctEntry{L: c, I: noIndex}) - } - } else { - for j := len(*ct) - 1; j >= start; j-- { - // Update the offset for longer suffixes with the same byte. - if (*ct)[j].L == c { - (*ct)[j].I = uint8(si.index) - added = true - } - // Extend range of final ctEntry, if possible. - if (*ct)[j].H+1 == c { - (*ct)[j].H = c - added = true - } - } - if !added { - *ct = append(*ct, ctEntry{L: c, H: c, N: final, I: uint8(si.index)}) - } - } - } - n := len(*ct) - start - // Append nodes for the remainder of the suffixes for each ctEntry. - sp := 0 - for i, end := start, len(*ct); i < end; i++ { - fe := (*ct)[i] - if fe.H == 0 { // uninitialized non-final - ln := len(*ct) - start - n - if ln > 0xFF { - return 0, fmt.Errorf("genStates: relative block offset too large: %d > 255", ln) - } - fe.H = uint8(ln) - // Find first non-final strings with same byte as current entry. - for ; sis[sp].str[0] != fe.L; sp++ { - } - se := sp + 1 - for ; se < len(sis) && len(sis[se].str) > 1 && sis[se].str[0] == fe.L; se++ { - } - sl := sis[sp:se] - sp = se - for i, si := range sl { - sl[i].str = si.str[1:] - } - nn, err := genStates(ct, sl) - if err != nil { - return 0, err - } - fe.N = uint8(nn) - (*ct)[i] = fe - } - } - sort.Sort(entrySort((*ct)[start : start+n])) - return n, nil -} - -// There may be both a final and non-final entry for a byte if the byte -// is implied in a range of matches in the final entry. -// We need to ensure that the non-final entry comes first in that case. -type entrySort colltab.ContractTrieSet - -func (fe entrySort) Len() int { return len(fe) } -func (fe entrySort) Swap(i, j int) { fe[i], fe[j] = fe[j], fe[i] } -func (fe entrySort) Less(i, j int) bool { - return fe[i].L > fe[j].L -} - -// stridx is used for sorting suffixes and their associated offsets. -type stridx struct { - str string - index int -} - -// For computing the offsets, we first sort by size, and then by string. -// This ensures that strings that only differ in the last byte by 1 -// are sorted consecutively in increasing order such that they can -// be packed as a range in a final ctEntry. -type offsetSort []stridx - -func (si offsetSort) Len() int { return len(si) } -func (si offsetSort) Swap(i, j int) { si[i], si[j] = si[j], si[i] } -func (si offsetSort) Less(i, j int) bool { - if len(si[i].str) != len(si[j].str) { - return len(si[i].str) > len(si[j].str) - } - return si[i].str < si[j].str -} - -// For indexing, we want to ensure that strings are sorted in string order, where -// for strings with the same prefix, we put longer strings before shorter ones. -type genidxSort []stridx - -func (si genidxSort) Len() int { return len(si) } -func (si genidxSort) Swap(i, j int) { si[i], si[j] = si[j], si[i] } -func (si genidxSort) Less(i, j int) bool { - if strings.HasPrefix(si[j].str, si[i].str) { - return false - } - if strings.HasPrefix(si[i].str, si[j].str) { - return true - } - return si[i].str < si[j].str -} - -// lookup matches the longest suffix in str and returns the associated offset -// and the number of bytes consumed. -func lookup(ct *colltab.ContractTrieSet, h ctHandle, str []byte) (index, ns int) { - states := (*ct)[h.index:] - p := 0 - n := h.n - for i := 0; i < n && p < len(str); { - e := states[i] - c := str[p] - if c >= e.L { - if e.L == c { - p++ - if e.I != noIndex { - index, ns = int(e.I), p - } - if e.N != final { - // set to new state - i, states, n = 0, states[int(e.H)+n:], int(e.N) - } else { - return - } - continue - } else if e.N == final && c <= e.H { - p++ - return int(c-e.L) + int(e.I), p - } - } - i++ - } - return -} - -// print writes the contractTrieSet t as compilable Go code to w. It returns -// the total number of bytes written and the size of the resulting data structure in bytes. -func print(t *colltab.ContractTrieSet, w io.Writer, name string) (n, size int, err error) { - update3 := func(nn, sz int, e error) { - n += nn - if err == nil { - err = e - } - size += sz - } - update2 := func(nn int, e error) { update3(nn, 0, e) } - - update3(printArray(*t, w, name)) - update2(fmt.Fprintf(w, "var %sContractTrieSet = ", name)) - update3(printStruct(*t, w, name)) - update2(fmt.Fprintln(w)) - return -} - -func printArray(ct colltab.ContractTrieSet, w io.Writer, name string) (n, size int, err error) { - p := func(f string, a ...interface{}) { - nn, e := fmt.Fprintf(w, f, a...) - n += nn - if err == nil { - err = e - } - } - size = len(ct) * 4 - p("// %sCTEntries: %d entries, %d bytes\n", name, len(ct), size) - p("var %sCTEntries = [%d]struct{L,H,N,I uint8}{\n", name, len(ct)) - for _, fe := range ct { - p("\t{0x%X, 0x%X, %d, %d},\n", fe.L, fe.H, fe.N, fe.I) - } - p("}\n") - return -} - -func printStruct(ct colltab.ContractTrieSet, w io.Writer, name string) (n, size int, err error) { - n, err = fmt.Fprintf(w, "colltab.ContractTrieSet( %sCTEntries[:] )", name) - size = int(reflect.TypeOf(ct).Size()) - return -} diff --git a/vendor/golang.org/x/text/collate/build/contract_test.go b/vendor/golang.org/x/text/collate/build/contract_test.go deleted file mode 100644 index 2e0eaecd5..000000000 --- a/vendor/golang.org/x/text/collate/build/contract_test.go +++ /dev/null @@ -1,266 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "bytes" - "sort" - "testing" - - "golang.org/x/text/internal/colltab" -) - -var largetosmall = []stridx{ - {"a", 5}, - {"ab", 4}, - {"abc", 3}, - {"abcd", 2}, - {"abcde", 1}, - {"abcdef", 0}, -} - -var offsetSortTests = [][]stridx{ - { - {"bcde", 1}, - {"bc", 5}, - {"ab", 4}, - {"bcd", 3}, - {"abcd", 0}, - {"abc", 2}, - }, - largetosmall, -} - -func TestOffsetSort(t *testing.T) { - for i, st := range offsetSortTests { - sort.Sort(offsetSort(st)) - for j, si := range st { - if j != si.index { - t.Errorf("%d: failed: %v", i, st) - } - } - } - for i, tt := range genStateTests { - // ensure input is well-formed - sort.Sort(offsetSort(tt.in)) - for j, si := range tt.in { - if si.index != j+1 { - t.Errorf("%dth sort failed: %v", i, tt.in) - } - } - } -} - -var genidxtest1 = []stridx{ - {"bcde", 3}, - {"bc", 6}, - {"ab", 2}, - {"bcd", 5}, - {"abcd", 0}, - {"abc", 1}, - {"bcdf", 4}, -} - -var genidxSortTests = [][]stridx{ - genidxtest1, - largetosmall, -} - -func TestGenIdxSort(t *testing.T) { - for i, st := range genidxSortTests { - sort.Sort(genidxSort(st)) - for j, si := range st { - if j != si.index { - t.Errorf("%dth sort failed %v", i, st) - break - } - } - } -} - -var entrySortTests = []colltab.ContractTrieSet{ - { - {10, 0, 1, 3}, - {99, 0, 1, 0}, - {20, 50, 0, 2}, - {30, 0, 1, 1}, - }, -} - -func TestEntrySort(t *testing.T) { - for i, et := range entrySortTests { - sort.Sort(entrySort(et)) - for j, fe := range et { - if j != int(fe.I) { - t.Errorf("%dth sort failed %v", i, et) - break - } - } - } -} - -type GenStateTest struct { - in []stridx - firstBlockLen int - out colltab.ContractTrieSet -} - -var genStateTests = []GenStateTest{ - {[]stridx{ - {"abc", 1}, - }, - 1, - colltab.ContractTrieSet{ - {'a', 0, 1, noIndex}, - {'b', 0, 1, noIndex}, - {'c', 'c', final, 1}, - }, - }, - {[]stridx{ - {"abc", 1}, - {"abd", 2}, - {"abe", 3}, - }, - 1, - colltab.ContractTrieSet{ - {'a', 0, 1, noIndex}, - {'b', 0, 1, noIndex}, - {'c', 'e', final, 1}, - }, - }, - {[]stridx{ - {"abc", 1}, - {"ab", 2}, - {"a", 3}, - }, - 1, - colltab.ContractTrieSet{ - {'a', 0, 1, 3}, - {'b', 0, 1, 2}, - {'c', 'c', final, 1}, - }, - }, - {[]stridx{ - {"abc", 1}, - {"abd", 2}, - {"ab", 3}, - {"ac", 4}, - {"a", 5}, - {"b", 6}, - }, - 2, - colltab.ContractTrieSet{ - {'b', 'b', final, 6}, - {'a', 0, 2, 5}, - {'c', 'c', final, 4}, - {'b', 0, 1, 3}, - {'c', 'd', final, 1}, - }, - }, - {[]stridx{ - {"bcde", 2}, - {"bc", 7}, - {"ab", 6}, - {"bcd", 5}, - {"abcd", 1}, - {"abc", 4}, - {"bcdf", 3}, - }, - 2, - colltab.ContractTrieSet{ - {'b', 3, 1, noIndex}, - {'a', 0, 1, noIndex}, - {'b', 0, 1, 6}, - {'c', 0, 1, 4}, - {'d', 'd', final, 1}, - {'c', 0, 1, 7}, - {'d', 0, 1, 5}, - {'e', 'f', final, 2}, - }, - }, -} - -func TestGenStates(t *testing.T) { - for i, tt := range genStateTests { - si := []stridx{} - for _, e := range tt.in { - si = append(si, e) - } - // ensure input is well-formed - sort.Sort(genidxSort(si)) - ct := colltab.ContractTrieSet{} - n, _ := genStates(&ct, si) - if nn := tt.firstBlockLen; nn != n { - t.Errorf("%d: block len %v; want %v", i, n, nn) - } - if lv, lw := len(ct), len(tt.out); lv != lw { - t.Errorf("%d: len %v; want %v", i, lv, lw) - continue - } - for j, fe := range tt.out { - const msg = "%d:%d: value %s=%v; want %v" - if fe.L != ct[j].L { - t.Errorf(msg, i, j, "l", ct[j].L, fe.L) - } - if fe.H != ct[j].H { - t.Errorf(msg, i, j, "h", ct[j].H, fe.H) - } - if fe.N != ct[j].N { - t.Errorf(msg, i, j, "n", ct[j].N, fe.N) - } - if fe.I != ct[j].I { - t.Errorf(msg, i, j, "i", ct[j].I, fe.I) - } - } - } -} - -func TestLookupContraction(t *testing.T) { - for i, tt := range genStateTests { - input := []string{} - for _, e := range tt.in { - input = append(input, e.str) - } - cts := colltab.ContractTrieSet{} - h, _ := appendTrie(&cts, input) - for j, si := range tt.in { - str := si.str - for _, s := range []string{str, str + "X"} { - msg := "%d:%d: %s(%s) %v; want %v" - idx, sn := lookup(&cts, h, []byte(s)) - if idx != si.index { - t.Errorf(msg, i, j, "index", s, idx, si.index) - } - if sn != len(str) { - t.Errorf(msg, i, j, "sn", s, sn, len(str)) - } - } - } - } -} - -func TestPrintContractionTrieSet(t *testing.T) { - testdata := colltab.ContractTrieSet(genStateTests[4].out) - buf := &bytes.Buffer{} - print(&testdata, buf, "test") - if contractTrieOutput != buf.String() { - t.Errorf("output differs; found\n%s", buf.String()) - println(string(buf.Bytes())) - } -} - -const contractTrieOutput = `// testCTEntries: 8 entries, 32 bytes -var testCTEntries = [8]struct{L,H,N,I uint8}{ - {0x62, 0x3, 1, 255}, - {0x61, 0x0, 1, 255}, - {0x62, 0x0, 1, 6}, - {0x63, 0x0, 1, 4}, - {0x64, 0x64, 0, 1}, - {0x63, 0x0, 1, 7}, - {0x64, 0x0, 1, 5}, - {0x65, 0x66, 0, 2}, -} -var testContractTrieSet = colltab.ContractTrieSet( testCTEntries[:] ) -` diff --git a/vendor/golang.org/x/text/collate/build/order.go b/vendor/golang.org/x/text/collate/build/order.go deleted file mode 100644 index 2c568dbba..000000000 --- a/vendor/golang.org/x/text/collate/build/order.go +++ /dev/null @@ -1,393 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "fmt" - "log" - "sort" - "strings" - "unicode" - - "golang.org/x/text/internal/colltab" - "golang.org/x/text/unicode/norm" -) - -type logicalAnchor int - -const ( - firstAnchor logicalAnchor = -1 - noAnchor = 0 - lastAnchor = 1 -) - -// entry is used to keep track of a single entry in the collation element table -// during building. Examples of entries can be found in the Default Unicode -// Collation Element Table. -// See http://www.unicode.org/Public/UCA/6.0.0/allkeys.txt. -type entry struct { - str string // same as string(runes) - runes []rune - elems []rawCE // the collation elements - extend string // weights of extend to be appended to elems - before bool // weights relative to next instead of previous. - lock bool // entry is used in extension and can no longer be moved. - - // prev, next, and level are used to keep track of tailorings. - prev, next *entry - level colltab.Level // next differs at this level - skipRemove bool // do not unlink when removed - - decompose bool // can use NFKD decomposition to generate elems - exclude bool // do not include in table - implicit bool // derived, is not included in the list - modified bool // entry was modified in tailoring - logical logicalAnchor - - expansionIndex int // used to store index into expansion table - contractionHandle ctHandle - contractionIndex int // index into contraction elements -} - -func (e *entry) String() string { - return fmt.Sprintf("%X (%q) -> %X (ch:%x; ci:%d, ei:%d)", - e.runes, e.str, e.elems, e.contractionHandle, e.contractionIndex, e.expansionIndex) -} - -func (e *entry) skip() bool { - return e.contraction() -} - -func (e *entry) expansion() bool { - return !e.decompose && len(e.elems) > 1 -} - -func (e *entry) contraction() bool { - return len(e.runes) > 1 -} - -func (e *entry) contractionStarter() bool { - return e.contractionHandle.n != 0 -} - -// nextIndexed gets the next entry that needs to be stored in the table. -// It returns the entry and the collation level at which the next entry differs -// from the current entry. -// Entries that can be explicitly derived and logical reset positions are -// examples of entries that will not be indexed. -func (e *entry) nextIndexed() (*entry, colltab.Level) { - level := e.level - for e = e.next; e != nil && (e.exclude || len(e.elems) == 0); e = e.next { - if e.level < level { - level = e.level - } - } - return e, level -} - -// remove unlinks entry e from the sorted chain and clears the collation -// elements. e may not be at the front or end of the list. This should always -// be the case, as the front and end of the list are always logical anchors, -// which may not be removed. -func (e *entry) remove() { - if e.logical != noAnchor { - log.Fatalf("may not remove anchor %q", e.str) - } - // TODO: need to set e.prev.level to e.level if e.level is smaller? - e.elems = nil - if !e.skipRemove { - if e.prev != nil { - e.prev.next = e.next - } - if e.next != nil { - e.next.prev = e.prev - } - } - e.skipRemove = false -} - -// insertAfter inserts n after e. -func (e *entry) insertAfter(n *entry) { - if e == n { - panic("e == anchor") - } - if e == nil { - panic("unexpected nil anchor") - } - n.remove() - n.decompose = false // redo decomposition test - - n.next = e.next - n.prev = e - if e.next != nil { - e.next.prev = n - } - e.next = n -} - -// insertBefore inserts n before e. -func (e *entry) insertBefore(n *entry) { - if e == n { - panic("e == anchor") - } - if e == nil { - panic("unexpected nil anchor") - } - n.remove() - n.decompose = false // redo decomposition test - - n.prev = e.prev - n.next = e - if e.prev != nil { - e.prev.next = n - } - e.prev = n -} - -func (e *entry) encodeBase() (ce uint32, err error) { - switch { - case e.expansion(): - ce, err = makeExpandIndex(e.expansionIndex) - default: - if e.decompose { - log.Fatal("decompose should be handled elsewhere") - } - ce, err = makeCE(e.elems[0]) - } - return -} - -func (e *entry) encode() (ce uint32, err error) { - if e.skip() { - log.Fatal("cannot build colElem for entry that should be skipped") - } - switch { - case e.decompose: - t1 := e.elems[0].w[2] - t2 := 0 - if len(e.elems) > 1 { - t2 = e.elems[1].w[2] - } - ce, err = makeDecompose(t1, t2) - case e.contractionStarter(): - ce, err = makeContractIndex(e.contractionHandle, e.contractionIndex) - default: - if len(e.runes) > 1 { - log.Fatal("colElem: contractions are handled in contraction trie") - } - ce, err = e.encodeBase() - } - return -} - -// entryLess returns true if a sorts before b and false otherwise. -func entryLess(a, b *entry) bool { - if res, _ := compareWeights(a.elems, b.elems); res != 0 { - return res == -1 - } - if a.logical != noAnchor { - return a.logical == firstAnchor - } - if b.logical != noAnchor { - return b.logical == lastAnchor - } - return a.str < b.str -} - -type sortedEntries []*entry - -func (s sortedEntries) Len() int { - return len(s) -} - -func (s sortedEntries) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func (s sortedEntries) Less(i, j int) bool { - return entryLess(s[i], s[j]) -} - -type ordering struct { - id string - entryMap map[string]*entry - ordered []*entry - handle *trieHandle -} - -// insert inserts e into both entryMap and ordered. -// Note that insert simply appends e to ordered. To reattain a sorted -// order, o.sort() should be called. -func (o *ordering) insert(e *entry) { - if e.logical == noAnchor { - o.entryMap[e.str] = e - } else { - // Use key format as used in UCA rules. - o.entryMap[fmt.Sprintf("[%s]", e.str)] = e - // Also add index entry for XML format. - o.entryMap[fmt.Sprintf("<%s/>", strings.Replace(e.str, " ", "_", -1))] = e - } - o.ordered = append(o.ordered, e) -} - -// newEntry creates a new entry for the given info and inserts it into -// the index. -func (o *ordering) newEntry(s string, ces []rawCE) *entry { - e := &entry{ - runes: []rune(s), - elems: ces, - str: s, - } - o.insert(e) - return e -} - -// find looks up and returns the entry for the given string. -// It returns nil if str is not in the index and if an implicit value -// cannot be derived, that is, if str represents more than one rune. -func (o *ordering) find(str string) *entry { - e := o.entryMap[str] - if e == nil { - r := []rune(str) - if len(r) == 1 { - const ( - firstHangul = 0xAC00 - lastHangul = 0xD7A3 - ) - if r[0] >= firstHangul && r[0] <= lastHangul { - ce := []rawCE{} - nfd := norm.NFD.String(str) - for _, r := range nfd { - ce = append(ce, o.find(string(r)).elems...) - } - e = o.newEntry(nfd, ce) - } else { - e = o.newEntry(string(r[0]), []rawCE{ - {w: []int{ - implicitPrimary(r[0]), - defaultSecondary, - defaultTertiary, - int(r[0]), - }, - }, - }) - e.modified = true - } - e.exclude = true // do not index implicits - } - } - return e -} - -// makeRootOrdering returns a newly initialized ordering value and populates -// it with a set of logical reset points that can be used as anchors. -// The anchors first_tertiary_ignorable and __END__ will always sort at -// the beginning and end, respectively. This means that prev and next are non-nil -// for any indexed entry. -func makeRootOrdering() ordering { - const max = unicode.MaxRune - o := ordering{ - entryMap: make(map[string]*entry), - } - insert := func(typ logicalAnchor, s string, ce []int) { - e := &entry{ - elems: []rawCE{{w: ce}}, - str: s, - exclude: true, - logical: typ, - } - o.insert(e) - } - insert(firstAnchor, "first tertiary ignorable", []int{0, 0, 0, 0}) - insert(lastAnchor, "last tertiary ignorable", []int{0, 0, 0, max}) - insert(lastAnchor, "last primary ignorable", []int{0, defaultSecondary, defaultTertiary, max}) - insert(lastAnchor, "last non ignorable", []int{maxPrimary, defaultSecondary, defaultTertiary, max}) - insert(lastAnchor, "__END__", []int{1 << maxPrimaryBits, defaultSecondary, defaultTertiary, max}) - return o -} - -// patchForInsert eleminates entries from the list with more than one collation element. -// The next and prev fields of the eliminated entries still point to appropriate -// values in the newly created list. -// It requires that sort has been called. -func (o *ordering) patchForInsert() { - for i := 0; i < len(o.ordered)-1; { - e := o.ordered[i] - lev := e.level - n := e.next - for ; n != nil && len(n.elems) > 1; n = n.next { - if n.level < lev { - lev = n.level - } - n.skipRemove = true - } - for ; o.ordered[i] != n; i++ { - o.ordered[i].level = lev - o.ordered[i].next = n - o.ordered[i+1].prev = e - } - } -} - -// clone copies all ordering of es into a new ordering value. -func (o *ordering) clone() *ordering { - o.sort() - oo := ordering{ - entryMap: make(map[string]*entry), - } - for _, e := range o.ordered { - ne := &entry{ - runes: e.runes, - elems: e.elems, - str: e.str, - decompose: e.decompose, - exclude: e.exclude, - logical: e.logical, - } - oo.insert(ne) - } - oo.sort() // link all ordering. - oo.patchForInsert() - return &oo -} - -// front returns the first entry to be indexed. -// It assumes that sort() has been called. -func (o *ordering) front() *entry { - e := o.ordered[0] - if e.prev != nil { - log.Panicf("unexpected first entry: %v", e) - } - // The first entry is always a logical position, which should not be indexed. - e, _ = e.nextIndexed() - return e -} - -// sort sorts all ordering based on their collation elements and initializes -// the prev, next, and level fields accordingly. -func (o *ordering) sort() { - sort.Sort(sortedEntries(o.ordered)) - l := o.ordered - for i := 1; i < len(l); i++ { - k := i - 1 - l[k].next = l[i] - _, l[k].level = compareWeights(l[k].elems, l[i].elems) - l[i].prev = l[k] - } -} - -// genColElems generates a collation element array from the runes in str. This -// assumes that all collation elements have already been added to the Builder. -func (o *ordering) genColElems(str string) []rawCE { - elems := []rawCE{} - for _, r := range []rune(str) { - for _, ce := range o.find(string(r)).elems { - if ce.w[0] != 0 || ce.w[1] != 0 || ce.w[2] != 0 { - elems = append(elems, ce) - } - } - } - return elems -} diff --git a/vendor/golang.org/x/text/collate/build/order_test.go b/vendor/golang.org/x/text/collate/build/order_test.go deleted file mode 100644 index 0e174bfbd..000000000 --- a/vendor/golang.org/x/text/collate/build/order_test.go +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "strconv" - "testing" - - "golang.org/x/text/internal/colltab" -) - -type entryTest struct { - f func(in []int) (uint32, error) - arg []int - val uint32 -} - -// makeList returns a list of entries of length n+2, with n normal -// entries plus a leading and trailing anchor. -func makeList(n int) []*entry { - es := make([]*entry, n+2) - weights := []rawCE{{w: []int{100, 20, 5, 0}}} - for i := range es { - runes := []rune{rune(i)} - es[i] = &entry{ - runes: runes, - elems: weights, - } - weights = nextWeight(colltab.Primary, weights) - } - for i := 1; i < len(es); i++ { - es[i-1].next = es[i] - es[i].prev = es[i-1] - _, es[i-1].level = compareWeights(es[i-1].elems, es[i].elems) - } - es[0].exclude = true - es[0].logical = firstAnchor - es[len(es)-1].exclude = true - es[len(es)-1].logical = lastAnchor - return es -} - -func TestNextIndexed(t *testing.T) { - const n = 5 - es := makeList(n) - for i := int64(0); i < 1<<n; i++ { - mask := strconv.FormatInt(i+(1<<n), 2) - for i, c := range mask { - es[i].exclude = c == '1' - } - e := es[0] - for i, c := range mask { - if c == '0' { - e, _ = e.nextIndexed() - if e != es[i] { - t.Errorf("%d: expected entry %d; found %d", i, es[i].elems, e.elems) - } - } - } - if e, _ = e.nextIndexed(); e != nil { - t.Errorf("%d: expected nil entry; found %d", i, e.elems) - } - } -} - -func TestRemove(t *testing.T) { - const n = 5 - for i := int64(0); i < 1<<n; i++ { - es := makeList(n) - mask := strconv.FormatInt(i+(1<<n), 2) - for i, c := range mask { - if c == '0' { - es[i].remove() - } - } - e := es[0] - for i, c := range mask { - if c == '1' { - if e != es[i] { - t.Errorf("%d: expected entry %d; found %d", i, es[i].elems, e.elems) - } - e, _ = e.nextIndexed() - } - } - if e != nil { - t.Errorf("%d: expected nil entry; found %d", i, e.elems) - } - } -} - -// nextPerm generates the next permutation of the array. The starting -// permutation is assumed to be a list of integers sorted in increasing order. -// It returns false if there are no more permuations left. -func nextPerm(a []int) bool { - i := len(a) - 2 - for ; i >= 0; i-- { - if a[i] < a[i+1] { - break - } - } - if i < 0 { - return false - } - for j := len(a) - 1; j >= i; j-- { - if a[j] > a[i] { - a[i], a[j] = a[j], a[i] - break - } - } - for j := i + 1; j < (len(a)+i+1)/2; j++ { - a[j], a[len(a)+i-j] = a[len(a)+i-j], a[j] - } - return true -} - -func TestInsertAfter(t *testing.T) { - const n = 5 - orig := makeList(n) - perm := make([]int, n) - for i := range perm { - perm[i] = i + 1 - } - for ok := true; ok; ok = nextPerm(perm) { - es := makeList(n) - last := es[0] - for _, i := range perm { - last.insertAfter(es[i]) - last = es[i] - } - for _, e := range es { - e.elems = es[0].elems - } - e := es[0] - for _, i := range perm { - e, _ = e.nextIndexed() - if e.runes[0] != orig[i].runes[0] { - t.Errorf("%d:%d: expected entry %X; found %X", perm, i, orig[i].runes, e.runes) - break - } - } - } -} - -func TestInsertBefore(t *testing.T) { - const n = 5 - orig := makeList(n) - perm := make([]int, n) - for i := range perm { - perm[i] = i + 1 - } - for ok := true; ok; ok = nextPerm(perm) { - es := makeList(n) - last := es[len(es)-1] - for _, i := range perm { - last.insertBefore(es[i]) - last = es[i] - } - for _, e := range es { - e.elems = es[0].elems - } - e := es[0] - for i := n - 1; i >= 0; i-- { - e, _ = e.nextIndexed() - if e.runes[0] != rune(perm[i]) { - t.Errorf("%d:%d: expected entry %X; found %X", perm, i, orig[i].runes, e.runes) - break - } - } - } -} - -type entryLessTest struct { - a, b *entry - res bool -} - -var ( - w1 = []rawCE{{w: []int{100, 20, 5, 5}}} - w2 = []rawCE{{w: []int{101, 20, 5, 5}}} -) - -var entryLessTests = []entryLessTest{ - {&entry{str: "a", elems: w1}, - &entry{str: "a", elems: w1}, - false, - }, - {&entry{str: "a", elems: w1}, - &entry{str: "a", elems: w2}, - true, - }, - {&entry{str: "a", elems: w1}, - &entry{str: "b", elems: w1}, - true, - }, - {&entry{str: "a", elems: w2}, - &entry{str: "a", elems: w1}, - false, - }, - {&entry{str: "c", elems: w1}, - &entry{str: "b", elems: w1}, - false, - }, - {&entry{str: "a", elems: w1, logical: firstAnchor}, - &entry{str: "a", elems: w1}, - true, - }, - {&entry{str: "a", elems: w1}, - &entry{str: "b", elems: w1, logical: firstAnchor}, - false, - }, - {&entry{str: "b", elems: w1}, - &entry{str: "a", elems: w1, logical: lastAnchor}, - true, - }, - {&entry{str: "a", elems: w1, logical: lastAnchor}, - &entry{str: "c", elems: w1}, - false, - }, -} - -func TestEntryLess(t *testing.T) { - for i, tt := range entryLessTests { - if res := entryLess(tt.a, tt.b); res != tt.res { - t.Errorf("%d: was %v; want %v", i, res, tt.res) - } - } -} diff --git a/vendor/golang.org/x/text/collate/build/table.go b/vendor/golang.org/x/text/collate/build/table.go deleted file mode 100644 index 7eea7a63f..000000000 --- a/vendor/golang.org/x/text/collate/build/table.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "fmt" - "io" - "reflect" - - "golang.org/x/text/internal/colltab" -) - -// table is an intermediate structure that roughly resembles the table in collate. -type table struct { - colltab.Table - trie trie - root *trieHandle -} - -// print writes the table as Go compilable code to w. It prefixes the -// variable names with name. It returns the number of bytes written -// and the size of the resulting table. -func (t *table) fprint(w io.Writer, name string) (n, size int, err error) { - update := func(nn, sz int, e error) { - n += nn - if err == nil { - err = e - } - size += sz - } - // Write arrays needed for the structure. - update(printColElems(w, t.ExpandElem, name+"ExpandElem")) - update(printColElems(w, t.ContractElem, name+"ContractElem")) - update(t.trie.printArrays(w, name)) - update(printArray(t.ContractTries, w, name)) - - nn, e := fmt.Fprintf(w, "// Total size of %sTable is %d bytes\n", name, size) - update(nn, 0, e) - return -} - -func (t *table) fprintIndex(w io.Writer, h *trieHandle, id string) (n int, err error) { - p := func(f string, a ...interface{}) { - nn, e := fmt.Fprintf(w, f, a...) - n += nn - if err == nil { - err = e - } - } - p("\t{ // %s\n", id) - p("\t\tlookupOffset: 0x%x,\n", h.lookupStart) - p("\t\tvaluesOffset: 0x%x,\n", h.valueStart) - p("\t},\n") - return -} - -func printColElems(w io.Writer, a []uint32, name string) (n, sz int, err error) { - p := func(f string, a ...interface{}) { - nn, e := fmt.Fprintf(w, f, a...) - n += nn - if err == nil { - err = e - } - } - sz = len(a) * int(reflect.TypeOf(uint32(0)).Size()) - p("// %s: %d entries, %d bytes\n", name, len(a), sz) - p("var %s = [%d]uint32 {", name, len(a)) - for i, c := range a { - switch { - case i%64 == 0: - p("\n\t// Block %d, offset 0x%x\n", i/64, i) - case (i%64)%6 == 0: - p("\n\t") - } - p("0x%.8X, ", c) - } - p("\n}\n\n") - return -} diff --git a/vendor/golang.org/x/text/collate/build/trie.go b/vendor/golang.org/x/text/collate/build/trie.go deleted file mode 100644 index 9404a3465..000000000 --- a/vendor/golang.org/x/text/collate/build/trie.go +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// The trie in this file is used to associate the first full character -// in a UTF-8 string to a collation element. -// All but the last byte in a UTF-8 byte sequence are -// used to look up offsets in the index table to be used for the next byte. -// The last byte is used to index into a table of collation elements. -// This file contains the code for the generation of the trie. - -package build - -import ( - "fmt" - "hash/fnv" - "io" - "reflect" -) - -const ( - blockSize = 64 - blockOffset = 2 // Subtract 2 blocks to compensate for the 0x80 added to continuation bytes. -) - -type trieHandle struct { - lookupStart uint16 // offset in table for first byte - valueStart uint16 // offset in table for first byte -} - -type trie struct { - index []uint16 - values []uint32 -} - -// trieNode is the intermediate trie structure used for generating a trie. -type trieNode struct { - index []*trieNode - value []uint32 - b byte - refValue uint16 - refIndex uint16 -} - -func newNode() *trieNode { - return &trieNode{ - index: make([]*trieNode, 64), - value: make([]uint32, 128), // root node size is 128 instead of 64 - } -} - -func (n *trieNode) isInternal() bool { - return n.value != nil -} - -func (n *trieNode) insert(r rune, value uint32) { - const maskx = 0x3F // mask out two most-significant bits - str := string(r) - if len(str) == 1 { - n.value[str[0]] = value - return - } - for i := 0; i < len(str)-1; i++ { - b := str[i] & maskx - if n.index == nil { - n.index = make([]*trieNode, blockSize) - } - nn := n.index[b] - if nn == nil { - nn = &trieNode{} - nn.b = b - n.index[b] = nn - } - n = nn - } - if n.value == nil { - n.value = make([]uint32, blockSize) - } - b := str[len(str)-1] & maskx - n.value[b] = value -} - -type trieBuilder struct { - t *trie - - roots []*trieHandle - - lookupBlocks []*trieNode - valueBlocks []*trieNode - - lookupBlockIdx map[uint32]*trieNode - valueBlockIdx map[uint32]*trieNode -} - -func newTrieBuilder() *trieBuilder { - index := &trieBuilder{} - index.lookupBlocks = make([]*trieNode, 0) - index.valueBlocks = make([]*trieNode, 0) - index.lookupBlockIdx = make(map[uint32]*trieNode) - index.valueBlockIdx = make(map[uint32]*trieNode) - // The third nil is the default null block. The other two blocks - // are used to guarantee an offset of at least 3 for each block. - index.lookupBlocks = append(index.lookupBlocks, nil, nil, nil) - index.t = &trie{} - return index -} - -func (b *trieBuilder) computeOffsets(n *trieNode) *trieNode { - hasher := fnv.New32() - if n.index != nil { - for i, nn := range n.index { - var vi, vv uint16 - if nn != nil { - nn = b.computeOffsets(nn) - n.index[i] = nn - vi = nn.refIndex - vv = nn.refValue - } - hasher.Write([]byte{byte(vi >> 8), byte(vi)}) - hasher.Write([]byte{byte(vv >> 8), byte(vv)}) - } - h := hasher.Sum32() - nn, ok := b.lookupBlockIdx[h] - if !ok { - n.refIndex = uint16(len(b.lookupBlocks)) - blockOffset - b.lookupBlocks = append(b.lookupBlocks, n) - b.lookupBlockIdx[h] = n - } else { - n = nn - } - } else { - for _, v := range n.value { - hasher.Write([]byte{byte(v >> 24), byte(v >> 16), byte(v >> 8), byte(v)}) - } - h := hasher.Sum32() - nn, ok := b.valueBlockIdx[h] - if !ok { - n.refValue = uint16(len(b.valueBlocks)) - blockOffset - n.refIndex = n.refValue - b.valueBlocks = append(b.valueBlocks, n) - b.valueBlockIdx[h] = n - } else { - n = nn - } - } - return n -} - -func (b *trieBuilder) addStartValueBlock(n *trieNode) uint16 { - hasher := fnv.New32() - for _, v := range n.value[:2*blockSize] { - hasher.Write([]byte{byte(v >> 24), byte(v >> 16), byte(v >> 8), byte(v)}) - } - h := hasher.Sum32() - nn, ok := b.valueBlockIdx[h] - if !ok { - n.refValue = uint16(len(b.valueBlocks)) - n.refIndex = n.refValue - b.valueBlocks = append(b.valueBlocks, n) - // Add a dummy block to accommodate the double block size. - b.valueBlocks = append(b.valueBlocks, nil) - b.valueBlockIdx[h] = n - } else { - n = nn - } - return n.refValue -} - -func genValueBlock(t *trie, n *trieNode) { - if n != nil { - for _, v := range n.value { - t.values = append(t.values, v) - } - } -} - -func genLookupBlock(t *trie, n *trieNode) { - for _, nn := range n.index { - v := uint16(0) - if nn != nil { - if n.index != nil { - v = nn.refIndex - } else { - v = nn.refValue - } - } - t.index = append(t.index, v) - } -} - -func (b *trieBuilder) addTrie(n *trieNode) *trieHandle { - h := &trieHandle{} - b.roots = append(b.roots, h) - h.valueStart = b.addStartValueBlock(n) - if len(b.roots) == 1 { - // We insert a null block after the first start value block. - // This ensures that continuation bytes UTF-8 sequences of length - // greater than 2 will automatically hit a null block if there - // was an undefined entry. - b.valueBlocks = append(b.valueBlocks, nil) - } - n = b.computeOffsets(n) - // Offset by one extra block as the first byte starts at 0xC0 instead of 0x80. - h.lookupStart = n.refIndex - 1 - return h -} - -// generate generates and returns the trie for n. -func (b *trieBuilder) generate() (t *trie, err error) { - t = b.t - if len(b.valueBlocks) >= 1<<16 { - return nil, fmt.Errorf("maximum number of value blocks exceeded (%d > %d)", len(b.valueBlocks), 1<<16) - } - if len(b.lookupBlocks) >= 1<<16 { - return nil, fmt.Errorf("maximum number of lookup blocks exceeded (%d > %d)", len(b.lookupBlocks), 1<<16) - } - genValueBlock(t, b.valueBlocks[0]) - genValueBlock(t, &trieNode{value: make([]uint32, 64)}) - for i := 2; i < len(b.valueBlocks); i++ { - genValueBlock(t, b.valueBlocks[i]) - } - n := &trieNode{index: make([]*trieNode, 64)} - genLookupBlock(t, n) - genLookupBlock(t, n) - genLookupBlock(t, n) - for i := 3; i < len(b.lookupBlocks); i++ { - genLookupBlock(t, b.lookupBlocks[i]) - } - return b.t, nil -} - -func (t *trie) printArrays(w io.Writer, name string) (n, size int, err error) { - p := func(f string, a ...interface{}) { - nn, e := fmt.Fprintf(w, f, a...) - n += nn - if err == nil { - err = e - } - } - nv := len(t.values) - p("// %sValues: %d entries, %d bytes\n", name, nv, nv*4) - p("// Block 2 is the null block.\n") - p("var %sValues = [%d]uint32 {", name, nv) - var printnewline bool - for i, v := range t.values { - if i%blockSize == 0 { - p("\n\t// Block %#x, offset %#x", i/blockSize, i) - } - if i%4 == 0 { - printnewline = true - } - if v != 0 { - if printnewline { - p("\n\t") - printnewline = false - } - p("%#04x:%#08x, ", i, v) - } - } - p("\n}\n\n") - ni := len(t.index) - p("// %sLookup: %d entries, %d bytes\n", name, ni, ni*2) - p("// Block 0 is the null block.\n") - p("var %sLookup = [%d]uint16 {", name, ni) - printnewline = false - for i, v := range t.index { - if i%blockSize == 0 { - p("\n\t// Block %#x, offset %#x", i/blockSize, i) - } - if i%8 == 0 { - printnewline = true - } - if v != 0 { - if printnewline { - p("\n\t") - printnewline = false - } - p("%#03x:%#02x, ", i, v) - } - } - p("\n}\n\n") - return n, nv*4 + ni*2, err -} - -func (t *trie) printStruct(w io.Writer, handle *trieHandle, name string) (n, sz int, err error) { - const msg = "trie{ %sLookup[%d:], %sValues[%d:], %sLookup[:], %sValues[:]}" - n, err = fmt.Fprintf(w, msg, name, handle.lookupStart*blockSize, name, handle.valueStart*blockSize, name, name) - sz += int(reflect.TypeOf(trie{}).Size()) - return -} diff --git a/vendor/golang.org/x/text/collate/build/trie_test.go b/vendor/golang.org/x/text/collate/build/trie_test.go deleted file mode 100644 index 4d4f6e4d1..000000000 --- a/vendor/golang.org/x/text/collate/build/trie_test.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package build - -import ( - "bytes" - "fmt" - "testing" -) - -// We take the smallest, largest and an arbitrary value for each -// of the UTF-8 sequence lengths. -var testRunes = []rune{ - 0x01, 0x0C, 0x7F, // 1-byte sequences - 0x80, 0x100, 0x7FF, // 2-byte sequences - 0x800, 0x999, 0xFFFF, // 3-byte sequences - 0x10000, 0x10101, 0x10FFFF, // 4-byte sequences - 0x200, 0x201, 0x202, 0x210, 0x215, // five entries in one sparse block -} - -func makeTestTrie(t *testing.T) trie { - n := newNode() - for i, r := range testRunes { - n.insert(r, uint32(i)) - } - idx := newTrieBuilder() - idx.addTrie(n) - tr, err := idx.generate() - if err != nil { - t.Errorf(err.Error()) - } - return *tr -} - -func TestGenerateTrie(t *testing.T) { - testdata := makeTestTrie(t) - buf := &bytes.Buffer{} - testdata.printArrays(buf, "test") - fmt.Fprintf(buf, "var testTrie = ") - testdata.printStruct(buf, &trieHandle{19, 0}, "test") - if output != buf.String() { - t.Error("output differs") - } -} - -var output = `// testValues: 832 entries, 3328 bytes -// Block 2 is the null block. -var testValues = [832]uint32 { - // Block 0x0, offset 0x0 - 0x000c:0x00000001, - // Block 0x1, offset 0x40 - 0x007f:0x00000002, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0x00c0:0x00000003, - // Block 0x4, offset 0x100 - 0x0100:0x00000004, - // Block 0x5, offset 0x140 - 0x0140:0x0000000c, 0x0141:0x0000000d, 0x0142:0x0000000e, - 0x0150:0x0000000f, - 0x0155:0x00000010, - // Block 0x6, offset 0x180 - 0x01bf:0x00000005, - // Block 0x7, offset 0x1c0 - 0x01c0:0x00000006, - // Block 0x8, offset 0x200 - 0x0219:0x00000007, - // Block 0x9, offset 0x240 - 0x027f:0x00000008, - // Block 0xa, offset 0x280 - 0x0280:0x00000009, - // Block 0xb, offset 0x2c0 - 0x02c1:0x0000000a, - // Block 0xc, offset 0x300 - 0x033f:0x0000000b, -} - -// testLookup: 640 entries, 1280 bytes -// Block 0 is the null block. -var testLookup = [640]uint16 { - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0x0e0:0x05, 0x0e6:0x06, - // Block 0x4, offset 0x100 - 0x13f:0x07, - // Block 0x5, offset 0x140 - 0x140:0x08, 0x144:0x09, - // Block 0x6, offset 0x180 - 0x190:0x03, - // Block 0x7, offset 0x1c0 - 0x1ff:0x0a, - // Block 0x8, offset 0x200 - 0x20f:0x05, - // Block 0x9, offset 0x240 - 0x242:0x01, 0x244:0x02, - 0x248:0x03, - 0x25f:0x04, - 0x260:0x01, - 0x26f:0x02, - 0x270:0x04, 0x274:0x06, -} - -var testTrie = trie{ testLookup[1216:], testValues[0:], testLookup[:], testValues[:]}` diff --git a/vendor/golang.org/x/text/collate/collate.go b/vendor/golang.org/x/text/collate/collate.go deleted file mode 100644 index 2ce968907..000000000 --- a/vendor/golang.org/x/text/collate/collate.go +++ /dev/null @@ -1,403 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// TODO: remove hard-coded versions when we have implemented fractional weights. -// The current implementation is incompatible with later CLDR versions. -//go:generate go run maketables.go -cldr=23 -unicode=6.2.0 - -// Package collate contains types for comparing and sorting Unicode strings -// according to a given collation order. -package collate // import "golang.org/x/text/collate" - -import ( - "bytes" - "strings" - - "golang.org/x/text/internal/colltab" - "golang.org/x/text/language" -) - -// Collator provides functionality for comparing strings for a given -// collation order. -type Collator struct { - options - - sorter sorter - - _iter [2]iter -} - -func (c *Collator) iter(i int) *iter { - // TODO: evaluate performance for making the second iterator optional. - return &c._iter[i] -} - -// Supported returns the list of languages for which collating differs from its parent. -func Supported() []language.Tag { - // TODO: use language.Coverage instead. - - t := make([]language.Tag, len(tags)) - copy(t, tags) - return t -} - -func init() { - ids := strings.Split(availableLocales, ",") - tags = make([]language.Tag, len(ids)) - for i, s := range ids { - tags[i] = language.Raw.MustParse(s) - } -} - -var tags []language.Tag - -// New returns a new Collator initialized for the given locale. -func New(t language.Tag, o ...Option) *Collator { - index := colltab.MatchLang(t, tags) - c := newCollator(getTable(locales[index])) - - // Set options from the user-supplied tag. - c.setFromTag(t) - - // Set the user-supplied options. - c.setOptions(o) - - c.init() - return c -} - -// NewFromTable returns a new Collator for the given Weighter. -func NewFromTable(w colltab.Weighter, o ...Option) *Collator { - c := newCollator(w) - c.setOptions(o) - c.init() - return c -} - -func (c *Collator) init() { - if c.numeric { - c.t = colltab.NewNumericWeighter(c.t) - } - c._iter[0].init(c) - c._iter[1].init(c) -} - -// Buffer holds keys generated by Key and KeyString. -type Buffer struct { - buf [4096]byte - key []byte -} - -func (b *Buffer) init() { - if b.key == nil { - b.key = b.buf[:0] - } -} - -// Reset clears the buffer from previous results generated by Key and KeyString. -func (b *Buffer) Reset() { - b.key = b.key[:0] -} - -// Compare returns an integer comparing the two byte slices. -// The result will be 0 if a==b, -1 if a < b, and +1 if a > b. -func (c *Collator) Compare(a, b []byte) int { - // TODO: skip identical prefixes once we have a fast way to detect if a rune is - // part of a contraction. This would lead to roughly a 10% speedup for the colcmp regtest. - c.iter(0).SetInput(a) - c.iter(1).SetInput(b) - if res := c.compare(); res != 0 { - return res - } - if !c.ignore[colltab.Identity] { - return bytes.Compare(a, b) - } - return 0 -} - -// CompareString returns an integer comparing the two strings. -// The result will be 0 if a==b, -1 if a < b, and +1 if a > b. -func (c *Collator) CompareString(a, b string) int { - // TODO: skip identical prefixes once we have a fast way to detect if a rune is - // part of a contraction. This would lead to roughly a 10% speedup for the colcmp regtest. - c.iter(0).SetInputString(a) - c.iter(1).SetInputString(b) - if res := c.compare(); res != 0 { - return res - } - if !c.ignore[colltab.Identity] { - if a < b { - return -1 - } else if a > b { - return 1 - } - } - return 0 -} - -func compareLevel(f func(i *iter) int, a, b *iter) int { - a.pce = 0 - b.pce = 0 - for { - va := f(a) - vb := f(b) - if va != vb { - if va < vb { - return -1 - } - return 1 - } else if va == 0 { - break - } - } - return 0 -} - -func (c *Collator) compare() int { - ia, ib := c.iter(0), c.iter(1) - // Process primary level - if c.alternate != altShifted { - // TODO: implement script reordering - if res := compareLevel((*iter).nextPrimary, ia, ib); res != 0 { - return res - } - } else { - // TODO: handle shifted - } - if !c.ignore[colltab.Secondary] { - f := (*iter).nextSecondary - if c.backwards { - f = (*iter).prevSecondary - } - if res := compareLevel(f, ia, ib); res != 0 { - return res - } - } - // TODO: special case handling (Danish?) - if !c.ignore[colltab.Tertiary] || c.caseLevel { - if res := compareLevel((*iter).nextTertiary, ia, ib); res != 0 { - return res - } - if !c.ignore[colltab.Quaternary] { - if res := compareLevel((*iter).nextQuaternary, ia, ib); res != 0 { - return res - } - } - } - return 0 -} - -// Key returns the collation key for str. -// Passing the buffer buf may avoid memory allocations. -// The returned slice will point to an allocation in Buffer and will remain -// valid until the next call to buf.Reset(). -func (c *Collator) Key(buf *Buffer, str []byte) []byte { - // See http://www.unicode.org/reports/tr10/#Main_Algorithm for more details. - buf.init() - return c.key(buf, c.getColElems(str)) -} - -// KeyFromString returns the collation key for str. -// Passing the buffer buf may avoid memory allocations. -// The returned slice will point to an allocation in Buffer and will retain -// valid until the next call to buf.ResetKeys(). -func (c *Collator) KeyFromString(buf *Buffer, str string) []byte { - // See http://www.unicode.org/reports/tr10/#Main_Algorithm for more details. - buf.init() - return c.key(buf, c.getColElemsString(str)) -} - -func (c *Collator) key(buf *Buffer, w []colltab.Elem) []byte { - processWeights(c.alternate, c.t.Top(), w) - kn := len(buf.key) - c.keyFromElems(buf, w) - return buf.key[kn:] -} - -func (c *Collator) getColElems(str []byte) []colltab.Elem { - i := c.iter(0) - i.SetInput(str) - for i.Next() { - } - return i.Elems -} - -func (c *Collator) getColElemsString(str string) []colltab.Elem { - i := c.iter(0) - i.SetInputString(str) - for i.Next() { - } - return i.Elems -} - -type iter struct { - wa [512]colltab.Elem - - colltab.Iter - pce int -} - -func (i *iter) init(c *Collator) { - i.Weighter = c.t - i.Elems = i.wa[:0] -} - -func (i *iter) nextPrimary() int { - for { - for ; i.pce < i.N; i.pce++ { - if v := i.Elems[i.pce].Primary(); v != 0 { - i.pce++ - return v - } - } - if !i.Next() { - return 0 - } - } - panic("should not reach here") -} - -func (i *iter) nextSecondary() int { - for ; i.pce < len(i.Elems); i.pce++ { - if v := i.Elems[i.pce].Secondary(); v != 0 { - i.pce++ - return v - } - } - return 0 -} - -func (i *iter) prevSecondary() int { - for ; i.pce < len(i.Elems); i.pce++ { - if v := i.Elems[len(i.Elems)-i.pce-1].Secondary(); v != 0 { - i.pce++ - return v - } - } - return 0 -} - -func (i *iter) nextTertiary() int { - for ; i.pce < len(i.Elems); i.pce++ { - if v := i.Elems[i.pce].Tertiary(); v != 0 { - i.pce++ - return int(v) - } - } - return 0 -} - -func (i *iter) nextQuaternary() int { - for ; i.pce < len(i.Elems); i.pce++ { - if v := i.Elems[i.pce].Quaternary(); v != 0 { - i.pce++ - return v - } - } - return 0 -} - -func appendPrimary(key []byte, p int) []byte { - // Convert to variable length encoding; supports up to 23 bits. - if p <= 0x7FFF { - key = append(key, uint8(p>>8), uint8(p)) - } else { - key = append(key, uint8(p>>16)|0x80, uint8(p>>8), uint8(p)) - } - return key -} - -// keyFromElems converts the weights ws to a compact sequence of bytes. -// The result will be appended to the byte buffer in buf. -func (c *Collator) keyFromElems(buf *Buffer, ws []colltab.Elem) { - for _, v := range ws { - if w := v.Primary(); w > 0 { - buf.key = appendPrimary(buf.key, w) - } - } - if !c.ignore[colltab.Secondary] { - buf.key = append(buf.key, 0, 0) - // TODO: we can use one 0 if we can guarantee that all non-zero weights are > 0xFF. - if !c.backwards { - for _, v := range ws { - if w := v.Secondary(); w > 0 { - buf.key = append(buf.key, uint8(w>>8), uint8(w)) - } - } - } else { - for i := len(ws) - 1; i >= 0; i-- { - if w := ws[i].Secondary(); w > 0 { - buf.key = append(buf.key, uint8(w>>8), uint8(w)) - } - } - } - } else if c.caseLevel { - buf.key = append(buf.key, 0, 0) - } - if !c.ignore[colltab.Tertiary] || c.caseLevel { - buf.key = append(buf.key, 0, 0) - for _, v := range ws { - if w := v.Tertiary(); w > 0 { - buf.key = append(buf.key, uint8(w)) - } - } - // Derive the quaternary weights from the options and other levels. - // Note that we represent MaxQuaternary as 0xFF. The first byte of the - // representation of a primary weight is always smaller than 0xFF, - // so using this single byte value will compare correctly. - if !c.ignore[colltab.Quaternary] && c.alternate >= altShifted { - if c.alternate == altShiftTrimmed { - lastNonFFFF := len(buf.key) - buf.key = append(buf.key, 0) - for _, v := range ws { - if w := v.Quaternary(); w == colltab.MaxQuaternary { - buf.key = append(buf.key, 0xFF) - } else if w > 0 { - buf.key = appendPrimary(buf.key, w) - lastNonFFFF = len(buf.key) - } - } - buf.key = buf.key[:lastNonFFFF] - } else { - buf.key = append(buf.key, 0) - for _, v := range ws { - if w := v.Quaternary(); w == colltab.MaxQuaternary { - buf.key = append(buf.key, 0xFF) - } else if w > 0 { - buf.key = appendPrimary(buf.key, w) - } - } - } - } - } -} - -func processWeights(vw alternateHandling, top uint32, wa []colltab.Elem) { - ignore := false - vtop := int(top) - switch vw { - case altShifted, altShiftTrimmed: - for i := range wa { - if p := wa[i].Primary(); p <= vtop && p != 0 { - wa[i] = colltab.MakeQuaternary(p) - ignore = true - } else if p == 0 { - if ignore { - wa[i] = colltab.Ignore - } - } else { - ignore = false - } - } - case altBlanked: - for i := range wa { - if p := wa[i].Primary(); p <= vtop && (ignore || p != 0) { - wa[i] = colltab.Ignore - ignore = true - } else { - ignore = false - } - } - } -} diff --git a/vendor/golang.org/x/text/collate/collate_test.go b/vendor/golang.org/x/text/collate/collate_test.go deleted file mode 100644 index 0e78b96fa..000000000 --- a/vendor/golang.org/x/text/collate/collate_test.go +++ /dev/null @@ -1,482 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package collate - -import ( - "bytes" - "testing" - - "golang.org/x/text/internal/colltab" - "golang.org/x/text/language" -) - -type weightsTest struct { - opt opts - in, out ColElems -} - -type opts struct { - lev int - alt alternateHandling - top int - - backwards bool - caseLevel bool -} - -// ignore returns an initialized boolean array based on the given Level. -// A negative value means using the default setting of quaternary. -func ignore(level colltab.Level) (ignore [colltab.NumLevels]bool) { - if level < 0 { - level = colltab.Quaternary - } - for i := range ignore { - ignore[i] = level < colltab.Level(i) - } - return ignore -} - -func makeCE(w []int) colltab.Elem { - ce, err := colltab.MakeElem(w[0], w[1], w[2], uint8(w[3])) - if err != nil { - panic(err) - } - return ce -} - -func (o opts) collator() *Collator { - c := &Collator{ - options: options{ - ignore: ignore(colltab.Level(o.lev - 1)), - alternate: o.alt, - backwards: o.backwards, - caseLevel: o.caseLevel, - variableTop: uint32(o.top), - }, - } - return c -} - -const ( - maxQ = 0x1FFFFF -) - -func wpq(p, q int) Weights { - return W(p, defaults.Secondary, defaults.Tertiary, q) -} - -func wsq(s, q int) Weights { - return W(0, s, defaults.Tertiary, q) -} - -func wq(q int) Weights { - return W(0, 0, 0, q) -} - -var zero = W(0, 0, 0, 0) - -var processTests = []weightsTest{ - // Shifted - { // simple sequence of non-variables - opt: opts{alt: altShifted, top: 100}, - in: ColElems{W(200), W(300), W(400)}, - out: ColElems{wpq(200, maxQ), wpq(300, maxQ), wpq(400, maxQ)}, - }, - { // first is a variable - opt: opts{alt: altShifted, top: 250}, - in: ColElems{W(200), W(300), W(400)}, - out: ColElems{wq(200), wpq(300, maxQ), wpq(400, maxQ)}, - }, - { // all but first are variable - opt: opts{alt: altShifted, top: 999}, - in: ColElems{W(1000), W(200), W(300), W(400)}, - out: ColElems{wpq(1000, maxQ), wq(200), wq(300), wq(400)}, - }, - { // first is a modifier - opt: opts{alt: altShifted, top: 999}, - in: ColElems{W(0, 10), W(1000)}, - out: ColElems{wsq(10, maxQ), wpq(1000, maxQ)}, - }, - { // primary ignorables - opt: opts{alt: altShifted, top: 250}, - in: ColElems{W(200), W(0, 10), W(300), W(0, 15), W(400)}, - out: ColElems{wq(200), zero, wpq(300, maxQ), wsq(15, maxQ), wpq(400, maxQ)}, - }, - { // secondary ignorables - opt: opts{alt: altShifted, top: 250}, - in: ColElems{W(200), W(0, 0, 10), W(300), W(0, 0, 15), W(400)}, - out: ColElems{wq(200), zero, wpq(300, maxQ), W(0, 0, 15, maxQ), wpq(400, maxQ)}, - }, - { // tertiary ignorables, no change - opt: opts{alt: altShifted, top: 250}, - in: ColElems{W(200), zero, W(300), zero, W(400)}, - out: ColElems{wq(200), zero, wpq(300, maxQ), zero, wpq(400, maxQ)}, - }, - - // ShiftTrimmed (same as Shifted) - { // simple sequence of non-variables - opt: opts{alt: altShiftTrimmed, top: 100}, - in: ColElems{W(200), W(300), W(400)}, - out: ColElems{wpq(200, maxQ), wpq(300, maxQ), wpq(400, maxQ)}, - }, - { // first is a variable - opt: opts{alt: altShiftTrimmed, top: 250}, - in: ColElems{W(200), W(300), W(400)}, - out: ColElems{wq(200), wpq(300, maxQ), wpq(400, maxQ)}, - }, - { // all but first are variable - opt: opts{alt: altShiftTrimmed, top: 999}, - in: ColElems{W(1000), W(200), W(300), W(400)}, - out: ColElems{wpq(1000, maxQ), wq(200), wq(300), wq(400)}, - }, - { // first is a modifier - opt: opts{alt: altShiftTrimmed, top: 999}, - in: ColElems{W(0, 10), W(1000)}, - out: ColElems{wsq(10, maxQ), wpq(1000, maxQ)}, - }, - { // primary ignorables - opt: opts{alt: altShiftTrimmed, top: 250}, - in: ColElems{W(200), W(0, 10), W(300), W(0, 15), W(400)}, - out: ColElems{wq(200), zero, wpq(300, maxQ), wsq(15, maxQ), wpq(400, maxQ)}, - }, - { // secondary ignorables - opt: opts{alt: altShiftTrimmed, top: 250}, - in: ColElems{W(200), W(0, 0, 10), W(300), W(0, 0, 15), W(400)}, - out: ColElems{wq(200), zero, wpq(300, maxQ), W(0, 0, 15, maxQ), wpq(400, maxQ)}, - }, - { // tertiary ignorables, no change - opt: opts{alt: altShiftTrimmed, top: 250}, - in: ColElems{W(200), zero, W(300), zero, W(400)}, - out: ColElems{wq(200), zero, wpq(300, maxQ), zero, wpq(400, maxQ)}, - }, - - // Blanked - { // simple sequence of non-variables - opt: opts{alt: altBlanked, top: 100}, - in: ColElems{W(200), W(300), W(400)}, - out: ColElems{W(200), W(300), W(400)}, - }, - { // first is a variable - opt: opts{alt: altBlanked, top: 250}, - in: ColElems{W(200), W(300), W(400)}, - out: ColElems{zero, W(300), W(400)}, - }, - { // all but first are variable - opt: opts{alt: altBlanked, top: 999}, - in: ColElems{W(1000), W(200), W(300), W(400)}, - out: ColElems{W(1000), zero, zero, zero}, - }, - { // first is a modifier - opt: opts{alt: altBlanked, top: 999}, - in: ColElems{W(0, 10), W(1000)}, - out: ColElems{W(0, 10), W(1000)}, - }, - { // primary ignorables - opt: opts{alt: altBlanked, top: 250}, - in: ColElems{W(200), W(0, 10), W(300), W(0, 15), W(400)}, - out: ColElems{zero, zero, W(300), W(0, 15), W(400)}, - }, - { // secondary ignorables - opt: opts{alt: altBlanked, top: 250}, - in: ColElems{W(200), W(0, 0, 10), W(300), W(0, 0, 15), W(400)}, - out: ColElems{zero, zero, W(300), W(0, 0, 15), W(400)}, - }, - { // tertiary ignorables, no change - opt: opts{alt: altBlanked, top: 250}, - in: ColElems{W(200), zero, W(300), zero, W(400)}, - out: ColElems{zero, zero, W(300), zero, W(400)}, - }, - - // Non-ignorable: input is always equal to output. - { // all but first are variable - opt: opts{alt: altNonIgnorable, top: 999}, - in: ColElems{W(1000), W(200), W(300), W(400)}, - out: ColElems{W(1000), W(200), W(300), W(400)}, - }, - { // primary ignorables - opt: opts{alt: altNonIgnorable, top: 250}, - in: ColElems{W(200), W(0, 10), W(300), W(0, 15), W(400)}, - out: ColElems{W(200), W(0, 10), W(300), W(0, 15), W(400)}, - }, - { // secondary ignorables - opt: opts{alt: altNonIgnorable, top: 250}, - in: ColElems{W(200), W(0, 0, 10), W(300), W(0, 0, 15), W(400)}, - out: ColElems{W(200), W(0, 0, 10), W(300), W(0, 0, 15), W(400)}, - }, - { // tertiary ignorables, no change - opt: opts{alt: altNonIgnorable, top: 250}, - in: ColElems{W(200), zero, W(300), zero, W(400)}, - out: ColElems{W(200), zero, W(300), zero, W(400)}, - }, -} - -func TestProcessWeights(t *testing.T) { - for i, tt := range processTests { - in := convertFromWeights(tt.in) - out := convertFromWeights(tt.out) - processWeights(tt.opt.alt, uint32(tt.opt.top), in) - for j, w := range in { - if w != out[j] { - t.Errorf("%d: Weights %d was %v; want %v", i, j, w, out[j]) - } - } - } -} - -type keyFromElemTest struct { - opt opts - in ColElems - out []byte -} - -var defS = byte(defaults.Secondary) -var defT = byte(defaults.Tertiary) - -const sep = 0 // separator byte - -var keyFromElemTests = []keyFromElemTest{ - { // simple primary and secondary weights. - opts{alt: altShifted}, - ColElems{W(0x200), W(0x7FFF), W(0, 0x30), W(0x100)}, - []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary - sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary - sep, sep, defT, defT, defT, defT, // tertiary - sep, 0xFF, 0xFF, 0xFF, 0xFF, // quaternary - }, - }, - { // same as first, but with zero element that need to be removed - opts{alt: altShifted}, - ColElems{W(0x200), zero, W(0x7FFF), W(0, 0x30), zero, W(0x100)}, - []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary - sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary - sep, sep, defT, defT, defT, defT, // tertiary - sep, 0xFF, 0xFF, 0xFF, 0xFF, // quaternary - }, - }, - { // same as first, with large primary values - opts{alt: altShifted}, - ColElems{W(0x200), W(0x8000), W(0, 0x30), W(0x12345)}, - []byte{0x2, 0, 0x80, 0x80, 0x00, 0x81, 0x23, 0x45, // primary - sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary - sep, sep, defT, defT, defT, defT, // tertiary - sep, 0xFF, 0xFF, 0xFF, 0xFF, // quaternary - }, - }, - { // same as first, but with the secondary level backwards - opts{alt: altShifted, backwards: true}, - ColElems{W(0x200), W(0x7FFF), W(0, 0x30), W(0x100)}, - []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary - sep, sep, 0, defS, 0, 0x30, 0, defS, 0, defS, // secondary - sep, sep, defT, defT, defT, defT, // tertiary - sep, 0xFF, 0xFF, 0xFF, 0xFF, // quaternary - }, - }, - { // same as first, ignoring quaternary level - opts{alt: altShifted, lev: 3}, - ColElems{W(0x200), zero, W(0x7FFF), W(0, 0x30), zero, W(0x100)}, - []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary - sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary - sep, sep, defT, defT, defT, defT, // tertiary - }, - }, - { // same as first, ignoring tertiary level - opts{alt: altShifted, lev: 2}, - ColElems{W(0x200), zero, W(0x7FFF), W(0, 0x30), zero, W(0x100)}, - []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary - sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary - }, - }, - { // same as first, ignoring secondary level - opts{alt: altShifted, lev: 1}, - ColElems{W(0x200), zero, W(0x7FFF), W(0, 0x30), zero, W(0x100)}, - []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00}, - }, - { // simple primary and secondary weights. - opts{alt: altShiftTrimmed, top: 0x250}, - ColElems{W(0x300), W(0x200), W(0x7FFF), W(0, 0x30), W(0x800)}, - []byte{0x3, 0, 0x7F, 0xFF, 0x8, 0x00, // primary - sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary - sep, sep, defT, defT, defT, defT, // tertiary - sep, 0xFF, 0x2, 0, // quaternary - }, - }, - { // as first, primary with case level enabled - opts{alt: altShifted, lev: 1, caseLevel: true}, - ColElems{W(0x200), W(0x7FFF), W(0, 0x30), W(0x100)}, - []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary - sep, sep, // secondary - sep, sep, defT, defT, defT, defT, // tertiary - }, - }, -} - -func TestKeyFromElems(t *testing.T) { - buf := Buffer{} - for i, tt := range keyFromElemTests { - buf.Reset() - in := convertFromWeights(tt.in) - processWeights(tt.opt.alt, uint32(tt.opt.top), in) - tt.opt.collator().keyFromElems(&buf, in) - res := buf.key - if len(res) != len(tt.out) { - t.Errorf("%d: len(ws) was %d; want %d (%X should be %X)", i, len(res), len(tt.out), res, tt.out) - } - n := len(res) - if len(tt.out) < n { - n = len(tt.out) - } - for j, c := range res[:n] { - if c != tt.out[j] { - t.Errorf("%d: byte %d was %X; want %X", i, j, c, tt.out[j]) - } - } - } -} - -func TestGetColElems(t *testing.T) { - for i, tt := range appendNextTests { - c, err := makeTable(tt.in) - if err != nil { - // error is reported in TestAppendNext - continue - } - // Create one large test per table - str := make([]byte, 0, 4000) - out := ColElems{} - for len(str) < 3000 { - for _, chk := range tt.chk { - str = append(str, chk.in[:chk.n]...) - out = append(out, chk.out...) - } - } - for j, chk := range append(tt.chk, check{string(str), len(str), out}) { - out := convertFromWeights(chk.out) - ce := c.getColElems([]byte(chk.in)[:chk.n]) - if len(ce) != len(out) { - t.Errorf("%d:%d: len(ws) was %d; want %d", i, j, len(ce), len(out)) - continue - } - cnt := 0 - for k, w := range ce { - w, _ = colltab.MakeElem(w.Primary(), w.Secondary(), int(w.Tertiary()), 0) - if w != out[k] { - t.Errorf("%d:%d: Weights %d was %X; want %X", i, j, k, w, out[k]) - cnt++ - } - if cnt > 10 { - break - } - } - } - } -} - -type keyTest struct { - in string - out []byte -} - -var keyTests = []keyTest{ - {"abc", - []byte{0, 100, 0, 200, 1, 44, 0, 0, 0, 32, 0, 32, 0, 32, 0, 0, 2, 2, 2, 0, 255, 255, 255}, - }, - {"a\u0301", - []byte{0, 102, 0, 0, 0, 32, 0, 0, 2, 0, 255}, - }, - {"aaaaa", - []byte{0, 100, 0, 100, 0, 100, 0, 100, 0, 100, 0, 0, - 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 0, - 2, 2, 2, 2, 2, 0, - 255, 255, 255, 255, 255, - }, - }, - // Issue 16391: incomplete rune at end of UTF-8 sequence. - {"\xc2", []byte{133, 255, 253, 0, 0, 0, 32, 0, 0, 2, 0, 255}}, - {"\xc2a", []byte{133, 255, 253, 0, 100, 0, 0, 0, 32, 0, 32, 0, 0, 2, 2, 0, 255, 255}}, -} - -func TestKey(t *testing.T) { - c, _ := makeTable(appendNextTests[4].in) - c.alternate = altShifted - c.ignore = ignore(colltab.Quaternary) - buf := Buffer{} - keys1 := [][]byte{} - keys2 := [][]byte{} - for _, tt := range keyTests { - keys1 = append(keys1, c.Key(&buf, []byte(tt.in))) - keys2 = append(keys2, c.KeyFromString(&buf, tt.in)) - } - // Separate generation from testing to ensure buffers are not overwritten. - for i, tt := range keyTests { - if !bytes.Equal(keys1[i], tt.out) { - t.Errorf("%d: Key(%q) = %d; want %d", i, tt.in, keys1[i], tt.out) - } - if !bytes.Equal(keys2[i], tt.out) { - t.Errorf("%d: KeyFromString(%q) = %d; want %d", i, tt.in, keys2[i], tt.out) - } - } -} - -type compareTest struct { - a, b string - res int // comparison result -} - -var compareTests = []compareTest{ - {"a\u0301", "a", 1}, - {"a\u0301b", "ab", 1}, - {"a", "a\u0301", -1}, - {"ab", "a\u0301b", -1}, - {"bc", "a\u0301c", 1}, - {"ab", "aB", -1}, - {"a\u0301", "a\u0301", 0}, - {"a", "a", 0}, - // Only clip prefixes of whole runes. - {"\u302E", "\u302F", 1}, - // Don't clip prefixes when last rune of prefix may be part of contraction. - {"a\u035E", "a\u0301\u035F", -1}, - {"a\u0301\u035Fb", "a\u0301\u035F", -1}, -} - -func TestCompare(t *testing.T) { - c, _ := makeTable(appendNextTests[4].in) - for i, tt := range compareTests { - if res := c.Compare([]byte(tt.a), []byte(tt.b)); res != tt.res { - t.Errorf("%d: Compare(%q, %q) == %d; want %d", i, tt.a, tt.b, res, tt.res) - } - if res := c.CompareString(tt.a, tt.b); res != tt.res { - t.Errorf("%d: CompareString(%q, %q) == %d; want %d", i, tt.a, tt.b, res, tt.res) - } - } -} - -func TestNumeric(t *testing.T) { - c := New(language.English, Loose, Numeric) - - for i, tt := range []struct { - a, b string - want int - }{ - {"1", "2", -1}, - {"2", "12", -1}, - {"2", "12", -1}, // Fullwidth is sorted as usual. - {"₂", "₁₂", 1}, // Subscript is not sorted as numbers. - {"②", "①②", 1}, // Circled is not sorted as numbers. - { // Imperial Aramaic, is not sorted as number. - "\U00010859", - "\U00010858\U00010859", - 1, - }, - {"12", "2", 1}, - {"A-1", "A-2", -1}, - {"A-2", "A-12", -1}, - {"A-12", "A-2", 1}, - {"A-0001", "A-1", 0}, - } { - if got := c.CompareString(tt.a, tt.b); got != tt.want { - t.Errorf("%d: CompareString(%s, %s) = %d; want %d", i, tt.a, tt.b, got, tt.want) - } - } -} diff --git a/vendor/golang.org/x/text/collate/export_test.go b/vendor/golang.org/x/text/collate/export_test.go deleted file mode 100644 index 69bfeaf1a..000000000 --- a/vendor/golang.org/x/text/collate/export_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package collate - -// Export for testing. -// TODO: no longer necessary. Remove at some point. - -import ( - "fmt" - - "golang.org/x/text/internal/colltab" -) - -const ( - defaultSecondary = 0x20 - defaultTertiary = 0x2 -) - -type Weights struct { - Primary, Secondary, Tertiary, Quaternary int -} - -func W(ce ...int) Weights { - w := Weights{ce[0], defaultSecondary, defaultTertiary, 0} - if len(ce) > 1 { - w.Secondary = ce[1] - } - if len(ce) > 2 { - w.Tertiary = ce[2] - } - if len(ce) > 3 { - w.Quaternary = ce[3] - } - return w -} -func (w Weights) String() string { - return fmt.Sprintf("[%X.%X.%X.%X]", w.Primary, w.Secondary, w.Tertiary, w.Quaternary) -} - -func convertFromWeights(ws []Weights) []colltab.Elem { - out := make([]colltab.Elem, len(ws)) - for i, w := range ws { - out[i], _ = colltab.MakeElem(w.Primary, w.Secondary, w.Tertiary, 0) - if out[i] == colltab.Ignore && w.Quaternary > 0 { - out[i] = colltab.MakeQuaternary(w.Quaternary) - } - } - return out -} diff --git a/vendor/golang.org/x/text/collate/index.go b/vendor/golang.org/x/text/collate/index.go deleted file mode 100644 index 535fb5402..000000000 --- a/vendor/golang.org/x/text/collate/index.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package collate - -import "golang.org/x/text/internal/colltab" - -const blockSize = 64 - -func getTable(t tableIndex) *colltab.Table { - return &colltab.Table{ - Index: colltab.Trie{ - Index0: mainLookup[:][blockSize*t.lookupOffset:], - Values0: mainValues[:][blockSize*t.valuesOffset:], - Index: mainLookup[:], - Values: mainValues[:], - }, - ExpandElem: mainExpandElem[:], - ContractTries: colltab.ContractTrieSet(mainCTEntries[:]), - ContractElem: mainContractElem[:], - MaxContractLen: 18, - VariableTop: varTop, - } -} - -// tableIndex holds information for constructing a table -// for a certain locale based on the main table. -type tableIndex struct { - lookupOffset uint32 - valuesOffset uint32 -} diff --git a/vendor/golang.org/x/text/collate/maketables.go b/vendor/golang.org/x/text/collate/maketables.go deleted file mode 100644 index b4c835ed4..000000000 --- a/vendor/golang.org/x/text/collate/maketables.go +++ /dev/null @@ -1,553 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Collation table generator. -// Data read from the web. - -package main - -import ( - "archive/zip" - "bufio" - "bytes" - "flag" - "fmt" - "io" - "io/ioutil" - "log" - "os" - "regexp" - "sort" - "strconv" - "strings" - "unicode/utf8" - - "golang.org/x/text/collate" - "golang.org/x/text/collate/build" - "golang.org/x/text/internal/colltab" - "golang.org/x/text/internal/gen" - "golang.org/x/text/language" - "golang.org/x/text/unicode/cldr" -) - -var ( - test = flag.Bool("test", false, - "test existing tables; can be used to compare web data with package data.") - short = flag.Bool("short", false, `Use "short" alternatives, when available.`) - draft = flag.Bool("draft", false, `Use draft versions, when available.`) - tags = flag.String("tags", "", "build tags to be included after +build directive") - pkg = flag.String("package", "collate", - "the name of the package in which the generated file is to be included") - - tables = flagStringSetAllowAll("tables", "collate", "collate,chars", - "comma-spearated list of tables to generate.") - exclude = flagStringSet("exclude", "zh2", "", - "comma-separated list of languages to exclude.") - include = flagStringSet("include", "", "", - "comma-separated list of languages to include. Include trumps exclude.") - // TODO: Not included: unihan gb2312han zhuyin big5han (for size reasons) - // TODO: Not included: traditional (buggy for Bengali) - types = flagStringSetAllowAll("types", "standard,phonebook,phonetic,reformed,pinyin,stroke", "", - "comma-separated list of types that should be included.") -) - -// stringSet implements an ordered set based on a list. It implements flag.Value -// to allow a set to be specified as a comma-separated list. -type stringSet struct { - s []string - allowed *stringSet - dirty bool // needs compaction if true - all bool - allowAll bool -} - -func flagStringSet(name, def, allowed, usage string) *stringSet { - ss := &stringSet{} - if allowed != "" { - usage += fmt.Sprintf(" (allowed values: any of %s)", allowed) - ss.allowed = &stringSet{} - failOnError(ss.allowed.Set(allowed)) - } - ss.Set(def) - flag.Var(ss, name, usage) - return ss -} - -func flagStringSetAllowAll(name, def, allowed, usage string) *stringSet { - ss := &stringSet{allowAll: true} - if allowed == "" { - flag.Var(ss, name, usage+fmt.Sprintf(` Use "all" to select all.`)) - } else { - ss.allowed = &stringSet{} - failOnError(ss.allowed.Set(allowed)) - flag.Var(ss, name, usage+fmt.Sprintf(` (allowed values: "all" or any of %s)`, allowed)) - } - ss.Set(def) - return ss -} - -func (ss stringSet) Len() int { - return len(ss.s) -} - -func (ss stringSet) String() string { - return strings.Join(ss.s, ",") -} - -func (ss *stringSet) Set(s string) error { - if ss.allowAll && s == "all" { - ss.s = nil - ss.all = true - return nil - } - ss.s = ss.s[:0] - for _, s := range strings.Split(s, ",") { - if s := strings.TrimSpace(s); s != "" { - if ss.allowed != nil && !ss.allowed.contains(s) { - return fmt.Errorf("unsupported value %q; must be one of %s", s, ss.allowed) - } - ss.add(s) - } - } - ss.compact() - return nil -} - -func (ss *stringSet) add(s string) { - ss.s = append(ss.s, s) - ss.dirty = true -} - -func (ss *stringSet) values() []string { - ss.compact() - return ss.s -} - -func (ss *stringSet) contains(s string) bool { - if ss.all { - return true - } - for _, v := range ss.s { - if v == s { - return true - } - } - return false -} - -func (ss *stringSet) compact() { - if !ss.dirty { - return - } - a := ss.s - sort.Strings(a) - k := 0 - for i := 1; i < len(a); i++ { - if a[k] != a[i] { - a[k+1] = a[i] - k++ - } - } - ss.s = a[:k+1] - ss.dirty = false -} - -func skipLang(l string) bool { - if include.Len() > 0 { - return !include.contains(l) - } - return exclude.contains(l) -} - -// altInclude returns a list of alternatives (for the LDML alt attribute) -// in order of preference. An empty string in this list indicates the -// default entry. -func altInclude() []string { - l := []string{} - if *short { - l = append(l, "short") - } - l = append(l, "") - // TODO: handle draft using cldr.SetDraftLevel - if *draft { - l = append(l, "proposed") - } - return l -} - -func failOnError(e error) { - if e != nil { - log.Panic(e) - } -} - -func openArchive() *zip.Reader { - f := gen.OpenCLDRCoreZip() - buffer, err := ioutil.ReadAll(f) - f.Close() - failOnError(err) - archive, err := zip.NewReader(bytes.NewReader(buffer), int64(len(buffer))) - failOnError(err) - return archive -} - -// parseUCA parses a Default Unicode Collation Element Table of the format -// specified in http://www.unicode.org/reports/tr10/#File_Format. -// It returns the variable top. -func parseUCA(builder *build.Builder) { - var r io.ReadCloser - var err error - for _, f := range openArchive().File { - if strings.HasSuffix(f.Name, "allkeys_CLDR.txt") { - r, err = f.Open() - } - } - if r == nil { - log.Fatal("File allkeys_CLDR.txt not found in archive.") - } - failOnError(err) - defer r.Close() - scanner := bufio.NewScanner(r) - colelem := regexp.MustCompile(`\[([.*])([0-9A-F.]+)\]`) - for i := 1; scanner.Scan(); i++ { - line := scanner.Text() - if len(line) == 0 || line[0] == '#' { - continue - } - if line[0] == '@' { - // parse properties - switch { - case strings.HasPrefix(line[1:], "version "): - a := strings.Split(line[1:], " ") - if a[1] != gen.UnicodeVersion() { - log.Fatalf("incompatible version %s; want %s", a[1], gen.UnicodeVersion()) - } - case strings.HasPrefix(line[1:], "backwards "): - log.Fatalf("%d: unsupported option backwards", i) - default: - log.Printf("%d: unknown option %s", i, line[1:]) - } - } else { - // parse entries - part := strings.Split(line, " ; ") - if len(part) != 2 { - log.Fatalf("%d: production rule without ';': %v", i, line) - } - lhs := []rune{} - for _, v := range strings.Split(part[0], " ") { - if v == "" { - continue - } - lhs = append(lhs, rune(convHex(i, v))) - } - var n int - var vars []int - rhs := [][]int{} - for i, m := range colelem.FindAllStringSubmatch(part[1], -1) { - n += len(m[0]) - elem := []int{} - for _, h := range strings.Split(m[2], ".") { - elem = append(elem, convHex(i, h)) - } - if m[1] == "*" { - vars = append(vars, i) - } - rhs = append(rhs, elem) - } - if len(part[1]) < n+3 || part[1][n+1] != '#' { - log.Fatalf("%d: expected comment; found %s", i, part[1][n:]) - } - if *test { - testInput.add(string(lhs)) - } - failOnError(builder.Add(lhs, rhs, vars)) - } - } - if scanner.Err() != nil { - log.Fatal(scanner.Err()) - } -} - -func convHex(line int, s string) int { - r, e := strconv.ParseInt(s, 16, 32) - if e != nil { - log.Fatalf("%d: %v", line, e) - } - return int(r) -} - -var testInput = stringSet{} - -var charRe = regexp.MustCompile(`&#x([0-9A-F]*);`) -var tagRe = regexp.MustCompile(`<([a-z_]*) */>`) - -var mainLocales = []string{} - -// charsets holds a list of exemplar characters per category. -type charSets map[string][]string - -func (p charSets) fprint(w io.Writer) { - fmt.Fprintln(w, "[exN]string{") - for i, k := range []string{"", "contractions", "punctuation", "auxiliary", "currencySymbol", "index"} { - if set := p[k]; len(set) != 0 { - fmt.Fprintf(w, "\t\t%d: %q,\n", i, strings.Join(set, " ")) - } - } - fmt.Fprintln(w, "\t},") -} - -var localeChars = make(map[string]charSets) - -const exemplarHeader = ` -type exemplarType int -const ( - exCharacters exemplarType = iota - exContractions - exPunctuation - exAuxiliary - exCurrency - exIndex - exN -) -` - -func printExemplarCharacters(w io.Writer) { - fmt.Fprintln(w, exemplarHeader) - fmt.Fprintln(w, "var exemplarCharacters = map[string][exN]string{") - for _, loc := range mainLocales { - fmt.Fprintf(w, "\t%q: ", loc) - localeChars[loc].fprint(w) - } - fmt.Fprintln(w, "}") -} - -func decodeCLDR(d *cldr.Decoder) *cldr.CLDR { - r := gen.OpenCLDRCoreZip() - data, err := d.DecodeZip(r) - failOnError(err) - return data -} - -// parseMain parses XML files in the main directory of the CLDR core.zip file. -func parseMain() { - d := &cldr.Decoder{} - d.SetDirFilter("main") - d.SetSectionFilter("characters") - data := decodeCLDR(d) - for _, loc := range data.Locales() { - x := data.RawLDML(loc) - if skipLang(x.Identity.Language.Type) { - continue - } - if x.Characters != nil { - x, _ = data.LDML(loc) - loc = language.Make(loc).String() - for _, ec := range x.Characters.ExemplarCharacters { - if ec.Draft != "" { - continue - } - if _, ok := localeChars[loc]; !ok { - mainLocales = append(mainLocales, loc) - localeChars[loc] = make(charSets) - } - localeChars[loc][ec.Type] = parseCharacters(ec.Data()) - } - } - } -} - -func parseCharacters(chars string) []string { - parseSingle := func(s string) (r rune, tail string, escaped bool) { - if s[0] == '\\' { - return rune(s[1]), s[2:], true - } - r, sz := utf8.DecodeRuneInString(s) - return r, s[sz:], false - } - chars = strings.TrimSpace(chars) - if n := len(chars) - 1; chars[n] == ']' && chars[0] == '[' { - chars = chars[1:n] - } - list := []string{} - var r, last, end rune - for len(chars) > 0 { - if chars[0] == '{' { // character sequence - buf := []rune{} - for chars = chars[1:]; len(chars) > 0; { - r, chars, _ = parseSingle(chars) - if r == '}' { - break - } - if r == ' ' { - log.Fatalf("space not supported in sequence %q", chars) - } - buf = append(buf, r) - } - list = append(list, string(buf)) - last = 0 - } else { // single character - escaped := false - r, chars, escaped = parseSingle(chars) - if r != ' ' { - if r == '-' && !escaped { - if last == 0 { - log.Fatal("'-' should be preceded by a character") - } - end, chars, _ = parseSingle(chars) - for ; last <= end; last++ { - list = append(list, string(last)) - } - last = 0 - } else { - list = append(list, string(r)) - last = r - } - } - } - } - return list -} - -var fileRe = regexp.MustCompile(`.*/collation/(.*)\.xml`) - -// typeMap translates legacy type keys to their BCP47 equivalent. -var typeMap = map[string]string{ - "phonebook": "phonebk", - "traditional": "trad", -} - -// parseCollation parses XML files in the collation directory of the CLDR core.zip file. -func parseCollation(b *build.Builder) { - d := &cldr.Decoder{} - d.SetDirFilter("collation") - data := decodeCLDR(d) - for _, loc := range data.Locales() { - x, err := data.LDML(loc) - failOnError(err) - if skipLang(x.Identity.Language.Type) { - continue - } - cs := x.Collations.Collation - sl := cldr.MakeSlice(&cs) - if len(types.s) == 0 { - sl.SelectAnyOf("type", x.Collations.Default()) - } else if !types.all { - sl.SelectAnyOf("type", types.s...) - } - sl.SelectOnePerGroup("alt", altInclude()) - - for _, c := range cs { - id, err := language.Parse(loc) - if err != nil { - fmt.Fprintf(os.Stderr, "invalid locale: %q", err) - continue - } - // Support both old- and new-style defaults. - d := c.Type - if x.Collations.DefaultCollation == nil { - d = x.Collations.Default() - } else { - d = x.Collations.DefaultCollation.Data() - } - // We assume tables are being built either for search or collation, - // but not both. For search the default is always "search". - if d != c.Type && c.Type != "search" { - typ := c.Type - if len(c.Type) > 8 { - typ = typeMap[c.Type] - } - id, err = id.SetTypeForKey("co", typ) - failOnError(err) - } - t := b.Tailoring(id) - c.Process(processor{t}) - } - } -} - -type processor struct { - t *build.Tailoring -} - -func (p processor) Reset(anchor string, before int) (err error) { - if before != 0 { - err = p.t.SetAnchorBefore(anchor) - } else { - err = p.t.SetAnchor(anchor) - } - failOnError(err) - return nil -} - -func (p processor) Insert(level int, str, context, extend string) error { - str = context + str - if *test { - testInput.add(str) - } - // TODO: mimic bug in old maketables: remove. - err := p.t.Insert(colltab.Level(level-1), str, context+extend) - failOnError(err) - return nil -} - -func (p processor) Index(id string) { -} - -func testCollator(c *collate.Collator) { - c0 := collate.New(language.Und) - - // iterator over all characters for all locales and check - // whether Key is equal. - buf := collate.Buffer{} - - // Add all common and not too uncommon runes to the test set. - for i := rune(0); i < 0x30000; i++ { - testInput.add(string(i)) - } - for i := rune(0xE0000); i < 0xF0000; i++ { - testInput.add(string(i)) - } - for _, str := range testInput.values() { - k0 := c0.KeyFromString(&buf, str) - k := c.KeyFromString(&buf, str) - if !bytes.Equal(k0, k) { - failOnError(fmt.Errorf("test:%U: keys differ (%x vs %x)", []rune(str), k0, k)) - } - buf.Reset() - } - fmt.Println("PASS") -} - -func main() { - gen.Init() - b := build.NewBuilder() - parseUCA(b) - if tables.contains("chars") { - parseMain() - } - parseCollation(b) - - c, err := b.Build() - failOnError(err) - - if *test { - testCollator(collate.NewFromTable(c)) - } else { - w := &bytes.Buffer{} - - gen.WriteUnicodeVersion(w) - gen.WriteCLDRVersion(w) - - if tables.contains("collate") { - _, err = b.Print(w) - failOnError(err) - } - if tables.contains("chars") { - printExemplarCharacters(w) - } - gen.WriteGoFile("tables.go", *pkg, w.Bytes()) - } -} diff --git a/vendor/golang.org/x/text/collate/option.go b/vendor/golang.org/x/text/collate/option.go deleted file mode 100644 index f39ef6841..000000000 --- a/vendor/golang.org/x/text/collate/option.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package collate - -import ( - "sort" - - "golang.org/x/text/internal/colltab" - "golang.org/x/text/language" - "golang.org/x/text/unicode/norm" -) - -// newCollator creates a new collator with default options configured. -func newCollator(t colltab.Weighter) *Collator { - // Initialize a collator with default options. - c := &Collator{ - options: options{ - ignore: [colltab.NumLevels]bool{ - colltab.Quaternary: true, - colltab.Identity: true, - }, - f: norm.NFD, - t: t, - }, - } - - // TODO: store vt in tags or remove. - c.variableTop = t.Top() - - return c -} - -// An Option is used to change the behavior of a Collator. Options override the -// settings passed through the locale identifier. -type Option struct { - priority int - f func(o *options) -} - -type prioritizedOptions []Option - -func (p prioritizedOptions) Len() int { - return len(p) -} - -func (p prioritizedOptions) Swap(i, j int) { - p[i], p[j] = p[j], p[i] -} - -func (p prioritizedOptions) Less(i, j int) bool { - return p[i].priority < p[j].priority -} - -type options struct { - // ignore specifies which levels to ignore. - ignore [colltab.NumLevels]bool - - // caseLevel is true if there is an additional level of case matching - // between the secondary and tertiary levels. - caseLevel bool - - // backwards specifies the order of sorting at the secondary level. - // This option exists predominantly to support reverse sorting of accents in French. - backwards bool - - // numeric specifies whether any sequence of decimal digits (category is Nd) - // is sorted at a primary level with its numeric value. - // For example, "A-21" < "A-123". - // This option is set by wrapping the main Weighter with NewNumericWeighter. - numeric bool - - // alternate specifies an alternative handling of variables. - alternate alternateHandling - - // variableTop is the largest primary value that is considered to be - // variable. - variableTop uint32 - - t colltab.Weighter - - f norm.Form -} - -func (o *options) setOptions(opts []Option) { - sort.Sort(prioritizedOptions(opts)) - for _, x := range opts { - x.f(o) - } -} - -// OptionsFromTag extracts the BCP47 collation options from the tag and -// configures a collator accordingly. These options are set before any other -// option. -func OptionsFromTag(t language.Tag) Option { - return Option{0, func(o *options) { - o.setFromTag(t) - }} -} - -func (o *options) setFromTag(t language.Tag) { - o.caseLevel = ldmlBool(t, o.caseLevel, "kc") - o.backwards = ldmlBool(t, o.backwards, "kb") - o.numeric = ldmlBool(t, o.numeric, "kn") - - // Extract settings from the BCP47 u extension. - switch t.TypeForKey("ks") { // strength - case "level1": - o.ignore[colltab.Secondary] = true - o.ignore[colltab.Tertiary] = true - case "level2": - o.ignore[colltab.Tertiary] = true - case "level3", "": - // The default. - case "level4": - o.ignore[colltab.Quaternary] = false - case "identic": - o.ignore[colltab.Quaternary] = false - o.ignore[colltab.Identity] = false - } - - switch t.TypeForKey("ka") { - case "shifted": - o.alternate = altShifted - // The following two types are not official BCP47, but we support them to - // give access to this otherwise hidden functionality. The name blanked is - // derived from the LDML name blanked and posix reflects the main use of - // the shift-trimmed option. - case "blanked": - o.alternate = altBlanked - case "posix": - o.alternate = altShiftTrimmed - } - - // TODO: caseFirst ("kf"), reorder ("kr"), and maybe variableTop ("vt"). - - // Not used: - // - normalization ("kk", not necessary for this implementation) - // - hiraganaQuatenary ("kh", obsolete) -} - -func ldmlBool(t language.Tag, old bool, key string) bool { - switch t.TypeForKey(key) { - case "true": - return true - case "false": - return false - default: - return old - } -} - -var ( - // IgnoreCase sets case-insensitive comparison. - IgnoreCase Option = ignoreCase - ignoreCase = Option{3, ignoreCaseF} - - // IgnoreDiacritics causes diacritical marks to be ignored. ("o" == "ö"). - IgnoreDiacritics Option = ignoreDiacritics - ignoreDiacritics = Option{3, ignoreDiacriticsF} - - // IgnoreWidth causes full-width characters to match their half-width - // equivalents. - IgnoreWidth Option = ignoreWidth - ignoreWidth = Option{2, ignoreWidthF} - - // Loose sets the collator to ignore diacritics, case and weight. - Loose Option = loose - loose = Option{4, looseF} - - // Force ordering if strings are equivalent but not equal. - Force Option = force - force = Option{5, forceF} - - // Numeric specifies that numbers should sort numerically ("2" < "12"). - Numeric Option = numeric - numeric = Option{5, numericF} -) - -func ignoreWidthF(o *options) { - o.ignore[colltab.Tertiary] = true - o.caseLevel = true -} - -func ignoreDiacriticsF(o *options) { - o.ignore[colltab.Secondary] = true -} - -func ignoreCaseF(o *options) { - o.ignore[colltab.Tertiary] = true - o.caseLevel = false -} - -func looseF(o *options) { - ignoreWidthF(o) - ignoreDiacriticsF(o) - ignoreCaseF(o) -} - -func forceF(o *options) { - o.ignore[colltab.Identity] = false -} - -func numericF(o *options) { o.numeric = true } - -// Reorder overrides the pre-defined ordering of scripts and character sets. -func Reorder(s ...string) Option { - // TODO: need fractional weights to implement this. - panic("TODO: implement") -} - -// TODO: consider making these public again. These options cannot be fully -// specified in BCP47, so an API interface seems warranted. Still a higher-level -// interface would be nice (e.g. a POSIX option for enabling altShiftTrimmed) - -// alternateHandling identifies the various ways in which variables are handled. -// A rune with a primary weight lower than the variable top is considered a -// variable. -// See http://www.unicode.org/reports/tr10/#Variable_Weighting for details. -type alternateHandling int - -const ( - // altNonIgnorable turns off special handling of variables. - altNonIgnorable alternateHandling = iota - - // altBlanked sets variables and all subsequent primary ignorables to be - // ignorable at all levels. This is identical to removing all variables - // and subsequent primary ignorables from the input. - altBlanked - - // altShifted sets variables to be ignorable for levels one through three and - // adds a fourth level based on the values of the ignored levels. - altShifted - - // altShiftTrimmed is a slight variant of altShifted that is used to - // emulate POSIX. - altShiftTrimmed -) diff --git a/vendor/golang.org/x/text/collate/option_test.go b/vendor/golang.org/x/text/collate/option_test.go deleted file mode 100644 index 0f6ba9bc8..000000000 --- a/vendor/golang.org/x/text/collate/option_test.go +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -package collate - -import ( - "reflect" - "strings" - "testing" - - "golang.org/x/text/internal/colltab" - "golang.org/x/text/language" -) - -var ( - defaultIgnore = ignore(colltab.Tertiary) - defaultTable = getTable(locales[0]) -) - -func TestOptions(t *testing.T) { - for i, tt := range []struct { - in []Option - out options - }{ - 0: { - out: options{ - ignore: defaultIgnore, - }, - }, - 1: { - in: []Option{IgnoreDiacritics}, - out: options{ - ignore: [colltab.NumLevels]bool{false, true, false, true, true}, - }, - }, - 2: { - in: []Option{IgnoreCase, IgnoreDiacritics}, - out: options{ - ignore: ignore(colltab.Primary), - }, - }, - 3: { - in: []Option{ignoreDiacritics, IgnoreWidth}, - out: options{ - ignore: ignore(colltab.Primary), - caseLevel: true, - }, - }, - 4: { - in: []Option{IgnoreWidth, ignoreDiacritics}, - out: options{ - ignore: ignore(colltab.Primary), - caseLevel: true, - }, - }, - 5: { - in: []Option{IgnoreCase, IgnoreWidth}, - out: options{ - ignore: ignore(colltab.Secondary), - }, - }, - 6: { - in: []Option{IgnoreCase, IgnoreWidth, Loose}, - out: options{ - ignore: ignore(colltab.Primary), - }, - }, - 7: { - in: []Option{Force, IgnoreCase, IgnoreWidth, Loose}, - out: options{ - ignore: [colltab.NumLevels]bool{false, true, true, true, false}, - }, - }, - 8: { - in: []Option{IgnoreDiacritics, IgnoreCase}, - out: options{ - ignore: ignore(colltab.Primary), - }, - }, - 9: { - in: []Option{Numeric}, - out: options{ - ignore: defaultIgnore, - numeric: true, - }, - }, - 10: { - in: []Option{OptionsFromTag(language.MustParse("und-u-ks-level1"))}, - out: options{ - ignore: ignore(colltab.Primary), - }, - }, - 11: { - in: []Option{OptionsFromTag(language.MustParse("und-u-ks-level4"))}, - out: options{ - ignore: ignore(colltab.Quaternary), - }, - }, - 12: { - in: []Option{OptionsFromTag(language.MustParse("und-u-ks-identic"))}, - out: options{}, - }, - 13: { - in: []Option{ - OptionsFromTag(language.MustParse("und-u-kn-true-kb-true-kc-true")), - }, - out: options{ - ignore: defaultIgnore, - caseLevel: true, - backwards: true, - numeric: true, - }, - }, - 14: { - in: []Option{ - OptionsFromTag(language.MustParse("und-u-kn-true-kb-true-kc-true")), - OptionsFromTag(language.MustParse("und-u-kn-false-kb-false-kc-false")), - }, - out: options{ - ignore: defaultIgnore, - }, - }, - 15: { - in: []Option{ - OptionsFromTag(language.MustParse("und-u-kn-true-kb-true-kc-true")), - OptionsFromTag(language.MustParse("und-u-kn-foo-kb-foo-kc-foo")), - }, - out: options{ - ignore: defaultIgnore, - caseLevel: true, - backwards: true, - numeric: true, - }, - }, - 16: { // Normal options take precedence over tag options. - in: []Option{ - Numeric, IgnoreCase, - OptionsFromTag(language.MustParse("und-u-kn-false-kc-true")), - }, - out: options{ - ignore: ignore(colltab.Secondary), - caseLevel: false, - numeric: true, - }, - }, - 17: { - in: []Option{ - OptionsFromTag(language.MustParse("und-u-ka-shifted")), - }, - out: options{ - ignore: defaultIgnore, - alternate: altShifted, - }, - }, - 18: { - in: []Option{ - OptionsFromTag(language.MustParse("und-u-ka-blanked")), - }, - out: options{ - ignore: defaultIgnore, - alternate: altBlanked, - }, - }, - 19: { - in: []Option{ - OptionsFromTag(language.MustParse("und-u-ka-posix")), - }, - out: options{ - ignore: defaultIgnore, - alternate: altShiftTrimmed, - }, - }, - } { - c := newCollator(defaultTable) - c.t = nil - c.variableTop = 0 - c.f = 0 - - c.setOptions(tt.in) - if !reflect.DeepEqual(c.options, tt.out) { - t.Errorf("%d: got %v; want %v", i, c.options, tt.out) - } - } -} - -func TestAlternateSortTypes(t *testing.T) { - testCases := []struct { - lang string - in []string - want []string - }{{ - lang: "zh,cmn,zh-Hant-u-co-pinyin,zh-HK-u-co-pinyin,zh-pinyin", - in: []string{"爸爸", "妈妈", "儿子", "女儿"}, - want: []string{"爸爸", "儿子", "妈妈", "女儿"}, - }, { - lang: "zh-Hant,zh-u-co-stroke,zh-Hant-u-co-stroke", - in: []string{"爸爸", "妈妈", "儿子", "女儿"}, - want: []string{"儿子", "女儿", "妈妈", "爸爸"}, - }} - for _, tc := range testCases { - for _, tag := range strings.Split(tc.lang, ",") { - got := append([]string{}, tc.in...) - New(language.MustParse(tag)).SortStrings(got) - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("New(%s).SortStrings(%v) = %v; want %v", tag, tc.in, got, tc.want) - } - } - } -} diff --git a/vendor/golang.org/x/text/collate/reg_test.go b/vendor/golang.org/x/text/collate/reg_test.go deleted file mode 100644 index 1ac5fedc8..000000000 --- a/vendor/golang.org/x/text/collate/reg_test.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package collate - -import ( - "archive/zip" - "bufio" - "bytes" - "flag" - "io" - "io/ioutil" - "log" - "path" - "regexp" - "strconv" - "strings" - "testing" - "unicode/utf8" - - "golang.org/x/text/collate/build" - "golang.org/x/text/internal/gen" - "golang.org/x/text/language" -) - -var long = flag.Bool("long", false, - "run time-consuming tests, such as tests that fetch data online") - -// This regression test runs tests for the test files in CollationTest.zip -// (taken from http://www.unicode.org/Public/UCA/<gen.UnicodeVersion()>/). -// -// The test files have the following form: -// # header -// 0009 0021; # ('\u0009') <CHARACTER TABULATION> [| | | 0201 025E] -// 0009 003F; # ('\u0009') <CHARACTER TABULATION> [| | | 0201 0263] -// 000A 0021; # ('\u000A') <LINE FEED (LF)> [| | | 0202 025E] -// 000A 003F; # ('\u000A') <LINE FEED (LF)> [| | | 0202 0263] -// -// The part before the semicolon is the hex representation of a sequence -// of runes. After the hash mark is a comment. The strings -// represented by rune sequence are in the file in sorted order, as -// defined by the DUCET. - -type Test struct { - name string - str [][]byte - comment []string -} - -var versionRe = regexp.MustCompile(`# UCA Version: (.*)\n?$`) -var testRe = regexp.MustCompile(`^([\dA-F ]+);.*# (.*)\n?$`) - -func TestCollation(t *testing.T) { - if !gen.IsLocal() && !*long { - t.Skip("skipping test to prevent downloading; to run use -long or use -local to specify a local source") - } - t.Skip("must first update to new file format to support test") - for _, test := range loadTestData() { - doTest(t, test) - } -} - -func Error(e error) { - if e != nil { - log.Fatal(e) - } -} - -// parseUCA parses a Default Unicode Collation Element Table of the format -// specified in http://www.unicode.org/reports/tr10/#File_Format. -// It returns the variable top. -func parseUCA(builder *build.Builder) { - r := gen.OpenUnicodeFile("UCA", "", "allkeys.txt") - defer r.Close() - input := bufio.NewReader(r) - colelem := regexp.MustCompile(`\[([.*])([0-9A-F.]+)\]`) - for i := 1; true; i++ { - l, prefix, err := input.ReadLine() - if err == io.EOF { - break - } - Error(err) - line := string(l) - if prefix { - log.Fatalf("%d: buffer overflow", i) - } - if len(line) == 0 || line[0] == '#' { - continue - } - if line[0] == '@' { - if strings.HasPrefix(line[1:], "version ") { - if v := strings.Split(line[1:], " ")[1]; v != gen.UnicodeVersion() { - log.Fatalf("incompatible version %s; want %s", v, gen.UnicodeVersion()) - } - } - } else { - // parse entries - part := strings.Split(line, " ; ") - if len(part) != 2 { - log.Fatalf("%d: production rule without ';': %v", i, line) - } - lhs := []rune{} - for _, v := range strings.Split(part[0], " ") { - if v != "" { - lhs = append(lhs, rune(convHex(i, v))) - } - } - vars := []int{} - rhs := [][]int{} - for i, m := range colelem.FindAllStringSubmatch(part[1], -1) { - if m[1] == "*" { - vars = append(vars, i) - } - elem := []int{} - for _, h := range strings.Split(m[2], ".") { - elem = append(elem, convHex(i, h)) - } - rhs = append(rhs, elem) - } - builder.Add(lhs, rhs, vars) - } - } -} - -func convHex(line int, s string) int { - r, e := strconv.ParseInt(s, 16, 32) - if e != nil { - log.Fatalf("%d: %v", line, e) - } - return int(r) -} - -func loadTestData() []Test { - f := gen.OpenUnicodeFile("UCA", "", "CollationTest.zip") - buffer, err := ioutil.ReadAll(f) - f.Close() - Error(err) - archive, err := zip.NewReader(bytes.NewReader(buffer), int64(len(buffer))) - Error(err) - tests := []Test{} - for _, f := range archive.File { - // Skip the short versions, which are simply duplicates of the long versions. - if strings.Contains(f.Name, "SHORT") || f.FileInfo().IsDir() { - continue - } - ff, err := f.Open() - Error(err) - defer ff.Close() - scanner := bufio.NewScanner(ff) - test := Test{name: path.Base(f.Name)} - for scanner.Scan() { - line := scanner.Text() - if len(line) <= 1 || line[0] == '#' { - if m := versionRe.FindStringSubmatch(line); m != nil { - if m[1] != gen.UnicodeVersion() { - log.Printf("warning:%s: version is %s; want %s", f.Name, m[1], gen.UnicodeVersion()) - } - } - continue - } - m := testRe.FindStringSubmatch(line) - if m == nil || len(m) < 3 { - log.Fatalf(`Failed to parse: "%s" result: %#v`, line, m) - } - str := []byte{} - // In the regression test data (unpaired) surrogates are assigned a weight - // corresponding to their code point value. However, utf8.DecodeRune, - // which is used to compute the implicit weight, assigns FFFD to surrogates. - // We therefore skip tests with surrogates. This skips about 35 entries - // per test. - valid := true - for _, split := range strings.Split(m[1], " ") { - r, err := strconv.ParseUint(split, 16, 64) - Error(err) - valid = valid && utf8.ValidRune(rune(r)) - str = append(str, string(rune(r))...) - } - if valid { - test.str = append(test.str, str) - test.comment = append(test.comment, m[2]) - } - } - if scanner.Err() != nil { - log.Fatal(scanner.Err()) - } - tests = append(tests, test) - } - return tests -} - -var errorCount int - -func runes(b []byte) []rune { - return []rune(string(b)) -} - -var shifted = language.MustParse("und-u-ka-shifted-ks-level4") - -func doTest(t *testing.T, tc Test) { - bld := build.NewBuilder() - parseUCA(bld) - w, err := bld.Build() - Error(err) - var tag language.Tag - if !strings.Contains(tc.name, "NON_IGNOR") { - tag = shifted - } - c := NewFromTable(w, OptionsFromTag(tag)) - b := &Buffer{} - prev := tc.str[0] - for i := 1; i < len(tc.str); i++ { - b.Reset() - s := tc.str[i] - ka := c.Key(b, prev) - kb := c.Key(b, s) - if r := bytes.Compare(ka, kb); r == 1 { - t.Errorf("%s:%d: Key(%.4X) < Key(%.4X) (%X < %X) == %d; want -1 or 0", tc.name, i, []rune(string(prev)), []rune(string(s)), ka, kb, r) - prev = s - continue - } - if r := c.Compare(prev, s); r == 1 { - t.Errorf("%s:%d: Compare(%.4X, %.4X) == %d; want -1 or 0", tc.name, i, runes(prev), runes(s), r) - } - if r := c.Compare(s, prev); r == -1 { - t.Errorf("%s:%d: Compare(%.4X, %.4X) == %d; want 1 or 0", tc.name, i, runes(s), runes(prev), r) - } - prev = s - } -} diff --git a/vendor/golang.org/x/text/collate/sort.go b/vendor/golang.org/x/text/collate/sort.go deleted file mode 100644 index 62f1e75a3..000000000 --- a/vendor/golang.org/x/text/collate/sort.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package collate - -import ( - "bytes" - "sort" -) - -const ( - maxSortBuffer = 40960 - maxSortEntries = 4096 -) - -type swapper interface { - Swap(i, j int) -} - -type sorter struct { - buf *Buffer - keys [][]byte - src swapper -} - -func (s *sorter) init(n int) { - if s.buf == nil { - s.buf = &Buffer{} - s.buf.init() - } - if cap(s.keys) < n { - s.keys = make([][]byte, n) - } - s.keys = s.keys[0:n] -} - -func (s *sorter) sort(src swapper) { - s.src = src - sort.Sort(s) -} - -func (s sorter) Len() int { - return len(s.keys) -} - -func (s sorter) Less(i, j int) bool { - return bytes.Compare(s.keys[i], s.keys[j]) == -1 -} - -func (s sorter) Swap(i, j int) { - s.keys[i], s.keys[j] = s.keys[j], s.keys[i] - s.src.Swap(i, j) -} - -// A Lister can be sorted by Collator's Sort method. -type Lister interface { - Len() int - Swap(i, j int) - // Bytes returns the bytes of the text at index i. - Bytes(i int) []byte -} - -// Sort uses sort.Sort to sort the strings represented by x using the rules of c. -func (c *Collator) Sort(x Lister) { - n := x.Len() - c.sorter.init(n) - for i := 0; i < n; i++ { - c.sorter.keys[i] = c.Key(c.sorter.buf, x.Bytes(i)) - } - c.sorter.sort(x) -} - -// SortStrings uses sort.Sort to sort the strings in x using the rules of c. -func (c *Collator) SortStrings(x []string) { - c.sorter.init(len(x)) - for i, s := range x { - c.sorter.keys[i] = c.KeyFromString(c.sorter.buf, s) - } - c.sorter.sort(sort.StringSlice(x)) -} diff --git a/vendor/golang.org/x/text/collate/sort_test.go b/vendor/golang.org/x/text/collate/sort_test.go deleted file mode 100644 index d9e7f31cc..000000000 --- a/vendor/golang.org/x/text/collate/sort_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package collate_test - -import ( - "fmt" - "testing" - - "golang.org/x/text/collate" - "golang.org/x/text/language" -) - -func ExampleCollator_Strings() { - c := collate.New(language.Und) - strings := []string{ - "ad", - "ab", - "äb", - "ac", - } - c.SortStrings(strings) - fmt.Println(strings) - // Output: [ab äb ac ad] -} - -type sorter []string - -func (s sorter) Len() int { - return len(s) -} - -func (s sorter) Swap(i, j int) { - s[j], s[i] = s[i], s[j] -} - -func (s sorter) Bytes(i int) []byte { - return []byte(s[i]) -} - -func TestSort(t *testing.T) { - c := collate.New(language.English) - strings := []string{ - "bcd", - "abc", - "ddd", - } - c.Sort(sorter(strings)) - res := fmt.Sprint(strings) - want := "[abc bcd ddd]" - if res != want { - t.Errorf("found %s; want %s", res, want) - } -} diff --git a/vendor/golang.org/x/text/collate/table_test.go b/vendor/golang.org/x/text/collate/table_test.go deleted file mode 100644 index 3a6b12fd6..000000000 --- a/vendor/golang.org/x/text/collate/table_test.go +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package collate - -import ( - "testing" - - "golang.org/x/text/collate/build" - "golang.org/x/text/internal/colltab" - "golang.org/x/text/unicode/norm" -) - -type ColElems []Weights - -type input struct { - str string - ces [][]int -} - -type check struct { - in string - n int - out ColElems -} - -type tableTest struct { - in []input - chk []check -} - -func w(ce ...int) Weights { - return W(ce...) -} - -var defaults = w(0) - -func pt(p, t int) []int { - return []int{p, defaults.Secondary, t} -} - -func makeTable(in []input) (*Collator, error) { - b := build.NewBuilder() - for _, r := range in { - if e := b.Add([]rune(r.str), r.ces, nil); e != nil { - panic(e) - } - } - t, err := b.Build() - if err != nil { - return nil, err - } - return NewFromTable(t), nil -} - -// modSeq holds a seqeunce of modifiers in increasing order of CCC long enough -// to cause a segment overflow if not handled correctly. The last rune in this -// list has a CCC of 214. -var modSeq = []rune{ - 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x05BB, - 0x05BC, 0x05BD, 0x05BF, 0x05C1, 0x05C2, 0xFB1E, 0x064B, 0x064C, 0x064D, 0x064E, - 0x064F, 0x0650, 0x0651, 0x0652, 0x0670, 0x0711, 0x0C55, 0x0C56, 0x0E38, 0x0E48, - 0x0EB8, 0x0EC8, 0x0F71, 0x0F72, 0x0F74, 0x0321, 0x1DCE, -} - -var mods []input -var modW = func() ColElems { - ws := ColElems{} - for _, r := range modSeq { - rune := norm.NFC.PropertiesString(string(r)) - ws = append(ws, w(0, int(rune.CCC()))) - mods = append(mods, input{string(r), [][]int{{0, int(rune.CCC())}}}) - } - return ws -}() - -var appendNextTests = []tableTest{ - { // test getWeights - []input{ - {"a", [][]int{{100}}}, - {"b", [][]int{{105}}}, - {"c", [][]int{{110}}}, - {"ß", [][]int{{120}}}, - }, - []check{ - {"a", 1, ColElems{w(100)}}, - {"b", 1, ColElems{w(105)}}, - {"c", 1, ColElems{w(110)}}, - {"d", 1, ColElems{w(0x50064)}}, - {"ab", 1, ColElems{w(100)}}, - {"bc", 1, ColElems{w(105)}}, - {"dd", 1, ColElems{w(0x50064)}}, - {"ß", 2, ColElems{w(120)}}, - }, - }, - { // test expansion - []input{ - {"u", [][]int{{100}}}, - {"U", [][]int{{100}, {0, 25}}}, - {"w", [][]int{{100}, {100}}}, - {"W", [][]int{{100}, {0, 25}, {100}, {0, 25}}}, - }, - []check{ - {"u", 1, ColElems{w(100)}}, - {"U", 1, ColElems{w(100), w(0, 25)}}, - {"w", 1, ColElems{w(100), w(100)}}, - {"W", 1, ColElems{w(100), w(0, 25), w(100), w(0, 25)}}, - }, - }, - { // test decompose - []input{ - {"D", [][]int{pt(104, 8)}}, - {"z", [][]int{pt(130, 8)}}, - {"\u030C", [][]int{{0, 40}}}, // Caron - {"\u01C5", [][]int{pt(104, 9), pt(130, 4), {0, 40, 0x1F}}}, // Dž = D+z+caron - }, - []check{ - {"\u01C5", 2, ColElems{w(pt(104, 9)...), w(pt(130, 4)...), w(0, 40, 0x1F)}}, - }, - }, - { // test basic contraction - []input{ - {"a", [][]int{{100}}}, - {"ab", [][]int{{101}}}, - {"aab", [][]int{{101}, {101}}}, - {"abc", [][]int{{102}}}, - {"b", [][]int{{200}}}, - {"c", [][]int{{300}}}, - {"d", [][]int{{400}}}, - }, - []check{ - {"a", 1, ColElems{w(100)}}, - {"aa", 1, ColElems{w(100)}}, - {"aac", 1, ColElems{w(100)}}, - {"d", 1, ColElems{w(400)}}, - {"ab", 2, ColElems{w(101)}}, - {"abb", 2, ColElems{w(101)}}, - {"aab", 3, ColElems{w(101), w(101)}}, - {"aaba", 3, ColElems{w(101), w(101)}}, - {"abc", 3, ColElems{w(102)}}, - {"abcd", 3, ColElems{w(102)}}, - }, - }, - { // test discontinuous contraction - append(mods, []input{ - // modifiers; secondary weight equals ccc - {"\u0316", [][]int{{0, 220}}}, - {"\u0317", [][]int{{0, 220}, {0, 220}}}, - {"\u302D", [][]int{{0, 222}}}, - {"\u302E", [][]int{{0, 225}}}, // used as starter - {"\u302F", [][]int{{0, 224}}}, // used as starter - {"\u18A9", [][]int{{0, 228}}}, - {"\u0300", [][]int{{0, 230}}}, - {"\u0301", [][]int{{0, 230}}}, - {"\u0315", [][]int{{0, 232}}}, - {"\u031A", [][]int{{0, 232}}}, - {"\u035C", [][]int{{0, 233}}}, - {"\u035F", [][]int{{0, 233}}}, - {"\u035D", [][]int{{0, 234}}}, - {"\u035E", [][]int{{0, 234}}}, - {"\u0345", [][]int{{0, 240}}}, - - // starters - {"a", [][]int{{100}}}, - {"b", [][]int{{200}}}, - {"c", [][]int{{300}}}, - {"\u03B1", [][]int{{900}}}, - {"\x01", [][]int{{0, 0, 0, 0}}}, - - // contractions - {"a\u0300", [][]int{{101}}}, - {"a\u0301", [][]int{{102}}}, - {"a\u035E", [][]int{{110}}}, - {"a\u035Eb\u035E", [][]int{{115}}}, - {"ac\u035Eaca\u035E", [][]int{{116}}}, - {"a\u035Db\u035D", [][]int{{117}}}, - {"a\u0301\u035Db", [][]int{{120}}}, - {"a\u0301\u035F", [][]int{{121}}}, - {"a\u0301\u035Fb", [][]int{{119}}}, - {"\u03B1\u0345", [][]int{{901}, {902}}}, - {"\u302E\u302F", [][]int{{0, 131}, {0, 131}}}, - {"\u302F\u18A9", [][]int{{0, 130}}}, - }...), - []check{ - {"a\x01\u0300", 1, ColElems{w(100)}}, - {"ab", 1, ColElems{w(100)}}, // closing segment - {"a\u0316\u0300b", 5, ColElems{w(101), w(0, 220)}}, // closing segment - {"a\u0316\u0300", 5, ColElems{w(101), w(0, 220)}}, // no closing segment - {"a\u0316\u0300\u035Cb", 5, ColElems{w(101), w(0, 220)}}, // completes before segment end - {"a\u0316\u0300\u035C", 5, ColElems{w(101), w(0, 220)}}, // completes before segment end - - {"a\u0316\u0301b", 5, ColElems{w(102), w(0, 220)}}, // closing segment - {"a\u0316\u0301", 5, ColElems{w(102), w(0, 220)}}, // no closing segment - {"a\u0316\u0301\u035Cb", 5, ColElems{w(102), w(0, 220)}}, // completes before segment end - {"a\u0316\u0301\u035C", 5, ColElems{w(102), w(0, 220)}}, // completes before segment end - - // match blocked by modifier with same ccc - {"a\u0301\u0315\u031A\u035Fb", 3, ColElems{w(102)}}, - - // multiple gaps - {"a\u0301\u035Db", 6, ColElems{w(120)}}, - {"a\u0301\u035F", 5, ColElems{w(121)}}, - {"a\u0301\u035Fb", 6, ColElems{w(119)}}, - {"a\u0316\u0301\u035F", 7, ColElems{w(121), w(0, 220)}}, - {"a\u0301\u0315\u035Fb", 7, ColElems{w(121), w(0, 232)}}, - {"a\u0316\u0301\u0315\u035Db", 5, ColElems{w(102), w(0, 220)}}, - {"a\u0316\u0301\u0315\u035F", 9, ColElems{w(121), w(0, 220), w(0, 232)}}, - {"a\u0316\u0301\u0315\u035Fb", 9, ColElems{w(121), w(0, 220), w(0, 232)}}, - {"a\u0316\u0301\u0315\u035F\u035D", 9, ColElems{w(121), w(0, 220), w(0, 232)}}, - {"a\u0316\u0301\u0315\u035F\u035Db", 9, ColElems{w(121), w(0, 220), w(0, 232)}}, - - // handling of segment overflow - { // just fits within segment - "a" + string(modSeq[:30]) + "\u0301", - 3 + len(string(modSeq[:30])), - append(ColElems{w(102)}, modW[:30]...), - }, - {"a" + string(modSeq[:31]) + "\u0301", 1, ColElems{w(100)}}, // overflow - {"a" + string(modSeq) + "\u0301", 1, ColElems{w(100)}}, - { // just fits within segment with two interstitial runes - "a" + string(modSeq[:28]) + "\u0301\u0315\u035F", - 7 + len(string(modSeq[:28])), - append(append(ColElems{w(121)}, modW[:28]...), w(0, 232)), - }, - { // second half does not fit within segment - "a" + string(modSeq[:29]) + "\u0301\u0315\u035F", - 3 + len(string(modSeq[:29])), - append(ColElems{w(102)}, modW[:29]...), - }, - - // discontinuity can only occur in last normalization segment - {"a\u035Eb\u035E", 6, ColElems{w(115)}}, - {"a\u0316\u035Eb\u035E", 5, ColElems{w(110), w(0, 220)}}, - {"a\u035Db\u035D", 6, ColElems{w(117)}}, - {"a\u0316\u035Db\u035D", 1, ColElems{w(100)}}, - {"a\u035Eb\u0316\u035E", 8, ColElems{w(115), w(0, 220)}}, - {"a\u035Db\u0316\u035D", 8, ColElems{w(117), w(0, 220)}}, - {"ac\u035Eaca\u035E", 9, ColElems{w(116)}}, - {"a\u0316c\u035Eaca\u035E", 1, ColElems{w(100)}}, - {"ac\u035Eac\u0316a\u035E", 1, ColElems{w(100)}}, - - // expanding contraction - {"\u03B1\u0345", 4, ColElems{w(901), w(902)}}, - - // Theoretical possibilities - // contraction within a gap - {"a\u302F\u18A9\u0301", 9, ColElems{w(102), w(0, 130)}}, - // expansion within a gap - {"a\u0317\u0301", 5, ColElems{w(102), w(0, 220), w(0, 220)}}, - // repeating CCC blocks last modifier - {"a\u302E\u302F\u0301", 1, ColElems{w(100)}}, - // The trailing combining characters (with lower CCC) should block the first one. - // TODO: make the following pass. - // {"a\u035E\u0316\u0316", 1, ColElems{w(100)}}, - {"a\u035F\u035Eb", 5, ColElems{w(110), w(0, 233)}}, - // Last combiner should match after normalization. - // TODO: make the following pass. - // {"a\u035D\u0301", 3, ColElems{w(102), w(0, 234)}}, - // The first combiner is blocking the second one as they have the same CCC. - {"a\u035D\u035Eb", 1, ColElems{w(100)}}, - }, - }, -} - -func TestAppendNext(t *testing.T) { - for i, tt := range appendNextTests { - c, err := makeTable(tt.in) - if err != nil { - t.Errorf("%d: error creating table: %v", i, err) - continue - } - for j, chk := range tt.chk { - ws, n := c.t.AppendNext(nil, []byte(chk.in)) - if n != chk.n { - t.Errorf("%d:%d: bytes consumed was %d; want %d", i, j, n, chk.n) - } - out := convertFromWeights(chk.out) - if len(ws) != len(out) { - t.Errorf("%d:%d: len(ws) was %d; want %d (%X vs %X)\n%X", i, j, len(ws), len(out), ws, out, chk.in) - continue - } - for k, w := range ws { - w, _ = colltab.MakeElem(w.Primary(), w.Secondary(), int(w.Tertiary()), 0) - if w != out[k] { - t.Errorf("%d:%d: Weights %d was %X; want %X", i, j, k, w, out[k]) - } - } - } - } -} diff --git a/vendor/golang.org/x/text/collate/tables.go b/vendor/golang.org/x/text/collate/tables.go deleted file mode 100644 index 9ec4f3d49..000000000 --- a/vendor/golang.org/x/text/collate/tables.go +++ /dev/null @@ -1,73789 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package collate - -// UnicodeVersion is the Unicode version from which the tables in this package are derived. -const UnicodeVersion = "6.2.0" - -// CLDRVersion is the CLDR version from which the tables in this package are derived. -const CLDRVersion = "23" - -var availableLocales = "und,aa,af,ar,as,az,be,bg,bn,bs,bs-Cyrl,ca,cs,cy,da,de-u-co-phonebk,de,dz,ee,el,en,en-US,en-US-u-va-posix,eo,es,et,fa,fa-AF,fi,fi-u-co-standard,fil,fo,fr,fr-CA,gu,ha,haw,he,hi,hr,hu,hy,ig,is,ja,kk,kl,km,kn,ko,kok,ln-u-co-phonetic,ln,lt,lv,mk,ml,mr,mt,my,nb,nn,nso,om,or,pa,pl,ps,ro,ru,se,si,sk,sl,sq,sr,sr-Latn,ssy,sv,sv-u-co-standard,ta,te,th,tn,to,tr,uk,ur,vi,wae,yo,zh,zh-u-co-stroke,zh-Hant-u-co-pinyin,zh-Hant" - -const varTop = 0x30e - -var locales = [...]tableIndex{ - { // und - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // aa - lookupOffset: 0x1c, - valuesOffset: 0x1b4, - }, - { // af - lookupOffset: 0x1d, - valuesOffset: 0x0, - }, - { // ar - lookupOffset: 0x1f, - valuesOffset: 0x0, - }, - { // as - lookupOffset: 0x21, - valuesOffset: 0x0, - }, - { // az - lookupOffset: 0x27, - valuesOffset: 0x1d7, - }, - { // be - lookupOffset: 0x28, - valuesOffset: 0x0, - }, - { // bg - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // bn - lookupOffset: 0x2a, - valuesOffset: 0x0, - }, - { // bs - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // bs-Cyrl - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // ca - lookupOffset: 0x2b, - valuesOffset: 0x1ec, - }, - { // cs - lookupOffset: 0x2d, - valuesOffset: 0x1f0, - }, - { // cy - lookupOffset: 0x15, - valuesOffset: 0x1f5, - }, - { // da - lookupOffset: 0x30, - valuesOffset: 0x1f7, - }, - { // de-u-co-phonebk - lookupOffset: 0x32, - valuesOffset: 0x201, - }, - { // de - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // dz - lookupOffset: 0x34, - valuesOffset: 0x0, - }, - { // ee - lookupOffset: 0x3a, - valuesOffset: 0x20a, - }, - { // el - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // en - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // en-US - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // en-US-u-va-posix - lookupOffset: 0x41, - valuesOffset: 0x219, - }, - { // eo - lookupOffset: 0x42, - valuesOffset: 0x23b, - }, - { // es - lookupOffset: 0x43, - valuesOffset: 0x23f, - }, - { // et - lookupOffset: 0x49, - valuesOffset: 0x242, - }, - { // fa - lookupOffset: 0x4b, - valuesOffset: 0x0, - }, - { // fa-AF - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // fi - lookupOffset: 0x4e, - valuesOffset: 0x25a, - }, - { // fi-u-co-standard - lookupOffset: 0x54, - valuesOffset: 0x265, - }, - { // fil - lookupOffset: 0x43, - valuesOffset: 0x272, - }, - { // fo - lookupOffset: 0x30, - valuesOffset: 0x1f7, - }, - { // fr - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // fr-CA - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // gu - lookupOffset: 0x56, - valuesOffset: 0x0, - }, - { // ha - lookupOffset: 0x57, - valuesOffset: 0x275, - }, - { // haw - lookupOffset: 0x5e, - valuesOffset: 0x27a, - }, - { // he - lookupOffset: 0x5f, - valuesOffset: 0x0, - }, - { // hi - lookupOffset: 0x61, - valuesOffset: 0x0, - }, - { // hr - lookupOffset: 0x63, - valuesOffset: 0x291, - }, - { // hu - lookupOffset: 0x65, - valuesOffset: 0x297, - }, - { // hy - lookupOffset: 0x66, - valuesOffset: 0x0, - }, - { // ig - lookupOffset: 0x68, - valuesOffset: 0x29f, - }, - { // is - lookupOffset: 0x6a, - valuesOffset: 0x2a3, - }, - { // ja - lookupOffset: 0x76, - valuesOffset: 0x0, - }, - { // kk - lookupOffset: 0x77, - valuesOffset: 0x0, - }, - { // kl - lookupOffset: 0x78, - valuesOffset: 0x414, - }, - { // km - lookupOffset: 0x7a, - valuesOffset: 0x0, - }, - { // kn - lookupOffset: 0x7c, - valuesOffset: 0x0, - }, - { // ko - lookupOffset: 0x88, - valuesOffset: 0x0, - }, - { // kok - lookupOffset: 0x8a, - valuesOffset: 0x0, - }, - { // ln-u-co-phonetic - lookupOffset: 0x8b, - valuesOffset: 0x570, - }, - { // ln - lookupOffset: 0x8b, - valuesOffset: 0x0, - }, - { // lt - lookupOffset: 0x91, - valuesOffset: 0x574, - }, - { // lv - lookupOffset: 0x93, - valuesOffset: 0x582, - }, - { // mk - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // ml - lookupOffset: 0x95, - valuesOffset: 0x0, - }, - { // mr - lookupOffset: 0x97, - valuesOffset: 0x0, - }, - { // mt - lookupOffset: 0x9a, - valuesOffset: 0x58a, - }, - { // my - lookupOffset: 0x9c, - valuesOffset: 0x0, - }, - { // nb - lookupOffset: 0x30, - valuesOffset: 0x593, - }, - { // nn - lookupOffset: 0x30, - valuesOffset: 0x593, - }, - { // nso - lookupOffset: 0x9e, - valuesOffset: 0x595, - }, - { // om - lookupOffset: 0x15, - valuesOffset: 0x59b, - }, - { // or - lookupOffset: 0xa0, - valuesOffset: 0x0, - }, - { // pa - lookupOffset: 0xa2, - valuesOffset: 0x0, - }, - { // pl - lookupOffset: 0xa4, - valuesOffset: 0x5a1, - }, - { // ps - lookupOffset: 0xa7, - valuesOffset: 0x0, - }, - { // ro - lookupOffset: 0xa9, - valuesOffset: 0x5b3, - }, - { // ru - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // se - lookupOffset: 0xab, - valuesOffset: 0x5ba, - }, - { // si - lookupOffset: 0xad, - valuesOffset: 0x0, - }, - { // sk - lookupOffset: 0xaf, - valuesOffset: 0x5c7, - }, - { // sl - lookupOffset: 0xb0, - valuesOffset: 0x5cc, - }, - { // sq - lookupOffset: 0xb2, - valuesOffset: 0x5cf, - }, - { // sr - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // sr-Latn - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // ssy - lookupOffset: 0x1c, - valuesOffset: 0x1b4, - }, - { // sv - lookupOffset: 0xb4, - valuesOffset: 0x5d3, - }, - { // sv-u-co-standard - lookupOffset: 0xb6, - valuesOffset: 0x5d9, - }, - { // ta - lookupOffset: 0xb8, - valuesOffset: 0x0, - }, - { // te - lookupOffset: 0xba, - valuesOffset: 0x0, - }, - { // th - lookupOffset: 0xbc, - valuesOffset: 0x0, - }, - { // tn - lookupOffset: 0x9e, - valuesOffset: 0x595, - }, - { // to - lookupOffset: 0xbe, - valuesOffset: 0x5e1, - }, - { // tr - lookupOffset: 0xc4, - valuesOffset: 0x5ed, - }, - { // uk - lookupOffset: 0xc5, - valuesOffset: 0x0, - }, - { // ur - lookupOffset: 0xc7, - valuesOffset: 0x0, - }, - { // vi - lookupOffset: 0xc9, - valuesOffset: 0x5fc, - }, - { // wae - lookupOffset: 0xca, - valuesOffset: 0x610, - }, - { // yo - lookupOffset: 0xcc, - valuesOffset: 0x613, - }, - { // zh - lookupOffset: 0xe6, - valuesOffset: 0x618, - }, - { // zh-u-co-stroke - lookupOffset: 0xff, - valuesOffset: 0x618, - }, - { // zh-Hant-u-co-pinyin - lookupOffset: 0xe6, - valuesOffset: 0x618, - }, - { // zh-Hant - lookupOffset: 0xff, - valuesOffset: 0x618, - }, -} - -// mainExpandElem: 46864 entries, 187456 bytes -var mainExpandElem = [46864]uint32{ - // Block 0, offset 0x0 - 0x00000002, 0xAE604702, 0xAE603202, 0x00000002, 0xA000A51A, 0xA000BA1A, - 0x00000002, 0xA000A91A, 0xA000BA1A, 0x00000002, 0xA000AD1A, 0xA000BA1A, - 0x00000002, 0xA000B21A, 0xA000BA1A, 0x00000002, 0xA000B61A, 0xA000BA1A, - 0x00000002, 0xA000BA1A, 0xA000D11A, 0x00000004, 0x0003F484, 0x0029CE84, - 0x0029CC84, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029CE84, - 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029D084, 0x0003F69F, - 0x00000004, 0x0003F484, 0x0029CE84, 0x0029D284, 0x0003F69F, 0x00000004, - 0x0003F484, 0x0029CE84, 0x0029D484, 0x0003F69F, 0x00000004, 0x0003F484, - 0x0029CE84, 0x0029D684, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, - 0x0029D884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029DA84, - 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, - // Block 1, offset 0x40 - 0x0029DC84, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029DE84, - 0x0003F69F, 0x00000004, 0x0003F484, 0x0029D084, 0x0029CC84, 0x0003F69F, - 0x00000004, 0x0003F484, 0x0062AC84, 0x0063A884, 0x0003F69F, 0x00000004, - 0x0003F484, 0x0062B084, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, - 0x0062B284, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062B684, - 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062B884, 0x0063A884, - 0x0003F69F, 0x00000004, 0x0003F484, 0x0062BA84, 0x0063A884, 0x0003F69F, - 0x00000004, 0x0003F484, 0x0062BE84, 0x0063A884, 0x0003F69F, 0x00000004, - 0x0003F484, 0x0062C284, 0x0063A884, 0x0003F69F, 0x00000007, 0x0003F484, - 0x0062C284, 0x0063B884, 0x0062C484, 0x0063B084, 0x00646A84, 0x0003F69F, - 0x00000006, 0x0003F484, 0x0062C284, 0x0063B884, - // Block 2, offset 0x80 - 0x0062D084, 0x0063C284, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C484, - 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C484, 0x0063C284, - 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C884, 0x0063A884, 0x0003F69F, - 0x00000004, 0x0003F484, 0x0062CA84, 0x0063A884, 0x0003F69F, 0x00000004, - 0x0003F484, 0x0062CC84, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, - 0x0062CE84, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062D084, - 0x0063A884, 0x0003F69F, 0x00000004, 0x00050E84, 0x00050E84, 0x00050E84, - 0x00050E9F, 0x00000002, 0x40062C20, 0xAE603202, 0x00000002, 0x40062C20, - 0xAE603502, 0x00000002, 0x40062C20, 0xAE604502, 0x00000002, 0x40063620, - 0xAE603202, 0x00000002, 0x40063620, 0xAE603502, 0x00000002, 0x40063620, - 0xAE604502, 0x00000002, 0x40063820, 0xAE603202, - // Block 3, offset 0xc0 - 0x00000002, 0x40063820, 0xAE603502, 0x00000002, 0x40063820, 0xAE604502, - 0x00000002, 0x40084420, 0xA0105402, 0x00000002, 0x40084620, 0xA0105402, - 0x00000002, 0x40084C20, 0xA0105402, 0x00000002, 0x4008B820, 0xA0105402, - 0x00000002, 0x4008BC20, 0xA0105402, 0x00000002, 0x4008C020, 0xA0105402, - 0x00000002, 0x40091E20, 0xA0105402, 0x00000002, 0x40092620, 0xA0105402, - 0x00000002, 0x40092A20, 0xA0105402, 0x00000002, 0x40094020, 0xA0105402, - 0x00000002, 0x40094220, 0xA0105402, 0x00000002, 0x40094420, 0xA0105402, - 0x00000002, 0x40097820, 0xA0105402, 0x00000002, 0x40097A20, 0xA0105402, - 0x00000004, 0x00098484, 0x00098484, 0x00098484, 0x0009849F, 0x00000002, - 0x40099E20, 0xA0105402, 0x00000002, 0x4009AA20, 0xA0105402, 0x00000002, - 0x4009AC20, 0xA0105402, 0x00000002, 0x4009B020, - // Block 4, offset 0x100 - 0xA0105402, 0x00000002, 0x4009B820, 0xA0105402, 0x00000002, 0x4009DE20, - 0xA0105402, 0x00000002, 0x4009E220, 0xA0105402, 0x00000002, 0x4009E420, - 0xA0105402, 0x00000002, 0x4009F420, 0xA0105402, 0x00000002, 0x4009F620, - 0xA0105402, 0x00000002, 0x4009F820, 0xA0105402, 0x00000002, 0x4009FA20, - 0xA0105402, 0x00000002, 0x4009FC20, 0xA0105402, 0x00000002, 0x4009FE20, - 0xA0105402, 0x00000002, 0x400A0020, 0xA0105402, 0x00000002, 0x400A0220, - 0xA0105402, 0x00000002, 0x400A0820, 0xA0105402, 0x00000002, 0x400A0A20, - 0xA0105402, 0x00000002, 0x400A0C20, 0xA0105402, 0x00000002, 0x400A0E20, - 0xA0105402, 0x00000002, 0x400A1E20, 0xA0105402, 0x00000002, 0x400A2020, - 0xA0105402, 0x00000002, 0x400A4020, 0xA0105402, 0x00000002, 0x400A4C20, - 0xA0105402, 0x00000002, 0x400A4E20, 0xA0105402, - // Block 5, offset 0x140 - 0x00000002, 0x400A5220, 0xA0105402, 0x00000002, 0x400A5820, 0xA0105402, - 0x00000002, 0x400A5A20, 0xA0105402, 0x00000002, 0x400A5C20, 0xA0105402, - 0x00000002, 0x400A5E20, 0xA0105402, 0x00000002, 0x40164620, 0xA0105402, - 0x00000002, 0x4027CE20, 0xA0012802, 0x00000002, 0x4027D020, 0xA0012802, - 0x00000002, 0x4027D420, 0xA0812802, 0x00000002, 0x4027D820, 0xA0812802, - 0x00000002, 0x4029CC20, 0xA0013F02, 0x00000002, 0x4029CC20, 0xA0014002, - 0x00000002, 0x4029CC20, 0xA0014202, 0x00000002, 0x4029CC20, 0xA0014402, - 0x00000002, 0x4029CC20, 0xA0014502, 0x00000002, 0x4029CC20, 0xA0014602, - 0x00000002, 0x4029CC20, 0xA0014702, 0x00000002, 0x4029CC20, 0xA0014802, - 0x00000002, 0x4029CC20, 0xA0014902, 0x00000002, 0x4029CC20, 0xA0014A02, - 0x00000002, 0x4029CC20, 0xA0014B02, 0x00000002, - // Block 6, offset 0x180 - 0x4029CC20, 0xA0014B02, 0x00000002, 0x4029CC20, 0xA0014C02, 0x00000002, - 0x4029CC20, 0xA0014D02, 0x00000002, 0x4029CC20, 0xA0014E02, 0x00000002, - 0x4029CC20, 0xA0014F02, 0x00000002, 0x4029CC20, 0xA0015002, 0x00000002, - 0x4029CC20, 0xA0015102, 0x00000002, 0x4029CC20, 0xA0015202, 0x00000002, - 0x4029CC20, 0xA0015302, 0x00000002, 0x4029CC20, 0xA0015402, 0x00000002, - 0x4029CC20, 0xA0015502, 0x00000002, 0x4029CC20, 0xA0015602, 0x00000002, - 0x0029CC84, 0xA0015604, 0x00000002, 0x4029CC20, 0xA0015702, 0x00000002, - 0x4029CC20, 0xA0015802, 0x00000002, 0x4029CC20, 0xA0015902, 0x00000002, - 0x4029CC20, 0xA0015A02, 0x00000002, 0x4029CC20, 0xA0015B02, 0x00000002, - 0x4029CC20, 0xA0015C02, 0x00000002, 0x4029CC20, 0xA0015D02, 0x00000002, - 0x4029CC20, 0xA0015E02, 0x00000002, 0x4029CC20, - // Block 7, offset 0x1c0 - 0xA0015F02, 0x00000002, 0x4029CC20, 0xA0016002, 0x00000002, 0x4029CC20, - 0xA0016102, 0x00000002, 0x4029CC20, 0xA0016202, 0x00000002, 0x4029CC20, - 0xA0016302, 0x00000002, 0x4029CC20, 0xA0016402, 0x00000002, 0x4029CC20, - 0xA0016502, 0x00000002, 0x4029CC20, 0xA0016602, 0x00000002, 0x4029CC20, - 0xA0016802, 0x00000002, 0x4029CC20, 0xA0017202, 0x00000002, 0x4029CC20, - 0xA0017302, 0x00000002, 0x4029CC20, 0xA0017402, 0x00000003, 0x0029CC9E, - 0x0009589E, 0x0029D29E, 0x00000002, 0x4029CE20, 0xA0013F02, 0x00000002, - 0x4029CE20, 0xA0014002, 0x00000002, 0x4029CE20, 0xA0014102, 0x00000002, - 0x4029CE20, 0xA0014202, 0x00000002, 0x4029CE20, 0xA0014302, 0x00000002, - 0x4029CE20, 0xA0014402, 0x00000002, 0x4029CE20, 0xA0014502, 0x00000002, - 0x4029CE20, 0xA0014602, 0x00000002, 0x4029CE20, - // Block 8, offset 0x200 - 0xA0014702, 0x00000002, 0x4029CE20, 0xA0014802, 0x00000002, 0x4029CE20, - 0xA0014902, 0x00000002, 0x4029CE20, 0xA0014A02, 0x00000002, 0x4029CE20, - 0xA0014B02, 0x00000002, 0x4029CE20, 0xA0014B02, 0x00000002, 0x4029CE20, - 0xA0014B02, 0x00000002, 0x4029CE20, 0xA0014C02, 0x00000002, 0x4029CE20, - 0xA0014D02, 0x00000002, 0x4029CE20, 0xA0014E02, 0x00000002, 0x4029CE20, - 0xA0014F02, 0x00000002, 0x4029CE20, 0xA0015002, 0x00000002, 0x4029CE20, - 0xA0015102, 0x00000002, 0x4029CE20, 0xA0015102, 0x00000002, 0x4029CE20, - 0xA0015202, 0x00000002, 0x4029CE20, 0xA0015302, 0x00000002, 0x4029CE20, - 0xA0015402, 0x00000002, 0x4029CE20, 0xA0015502, 0x00000002, 0x4029CE20, - 0xA0015602, 0x00000002, 0x0029CE84, 0xA0015604, 0x00000002, 0x4029CE20, - 0xA0015702, 0x00000002, 0x4029CE20, 0xA0015802, - // Block 9, offset 0x240 - 0x00000002, 0x4029CE20, 0xA0015902, 0x00000002, 0x4029CE20, 0xA0015A02, - 0x00000002, 0x4029CE20, 0xA0015B02, 0x00000002, 0x4029CE20, 0xA0015C02, - 0x00000002, 0x4029CE20, 0xA0015D02, 0x00000002, 0x4029CE20, 0xA0015E02, - 0x00000002, 0x4029CE20, 0xA0015F02, 0x00000002, 0x4029CE20, 0xA0016002, - 0x00000002, 0x4029CE20, 0xA0016102, 0x00000002, 0x4029CE20, 0xA0016202, - 0x00000002, 0x4029CE20, 0xA0016302, 0x00000002, 0x4029CE20, 0xA0016402, - 0x00000002, 0x4029CE20, 0xA0016502, 0x00000002, 0x4029CE20, 0xA0016602, - 0x00000002, 0x4029CE20, 0xA0016702, 0x00000002, 0x4029CE20, 0xA0016802, - 0x00000002, 0x4029CE20, 0xA0016802, 0x00000002, 0x4029CE20, 0xA0016802, - 0x00000002, 0x4029CE20, 0xA0016802, 0x00000002, 0x4029CE20, 0xA0016A02, - 0x00000002, 0x4029CE20, 0xA0016B02, 0x00000002, - // Block 10, offset 0x280 - 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, - 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, - 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, - 0x4029CE20, 0xA0016D02, 0x00000002, 0x4029CE20, 0xA0016E02, 0x00000002, - 0x4029CE20, 0xA0016F02, 0x00000002, 0x4029CE20, 0xA0017002, 0x00000002, - 0x4029CE20, 0xA0017102, 0x00000002, 0x4029CE20, 0xA0017202, 0x00000002, - 0x4029CE20, 0xA0017302, 0x00000002, 0x4029CE20, 0xA0017402, 0x00000002, - 0x4029CE20, 0xA0017502, 0x00000002, 0x4029CE20, 0xA0017602, 0x00000002, - 0x4029CE20, 0xA0017702, 0x00000004, 0x0029CE9E, 0x0009589E, 0x0029CE9E, - 0x0029CC9E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029D09E, 0x00000003, - 0x0029CE9E, 0x0009589E, 0x0029D29E, 0x00000003, - // Block 11, offset 0x2c0 - 0x0029CE9E, 0x0009589E, 0x0029D49E, 0x00000003, 0x0029CE9E, 0x0009589E, - 0x0029D69E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029D89E, 0x00000003, - 0x0029CE9E, 0x0009589E, 0x0029DA9E, 0x00000003, 0x0029CE9E, 0x0009589E, - 0x0029DC9E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029DE9E, 0x00000002, - 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CC86, 0x00000002, - 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CC86, 0x00000002, - 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CE86, 0x00000002, - 0x0029CE86, 0x0029D086, 0x00000002, 0x0029CE86, 0x0029D286, 0x00000002, - 0x0029CE86, 0x0029D486, 0x00000002, 0x0029CE86, 0x0029D686, 0x00000002, - 0x0029CE86, 0x0029D886, 0x00000002, 0x0029CE86, 0x0029DA86, 0x00000002, - 0x0029CE86, 0x0029DC86, 0x00000002, 0x0029CE86, - // Block 12, offset 0x300 - 0x0029DE86, 0x00000002, 0x4029D020, 0xA0013F02, 0x00000002, 0x4029D020, - 0xA0014002, 0x00000002, 0x4029D020, 0xA0014102, 0x00000002, 0x4029D020, - 0xA0014202, 0x00000002, 0x4029D020, 0xA0014302, 0x00000002, 0x4029D020, - 0xA0014402, 0x00000002, 0x4029D020, 0xA0014502, 0x00000002, 0x4029D020, - 0xA0014602, 0x00000002, 0x4029D020, 0xA0014702, 0x00000002, 0x4029D020, - 0xA0014802, 0x00000002, 0x4029D020, 0xA0014902, 0x00000002, 0x4029D020, - 0xA0014A02, 0x00000002, 0x4029D020, 0xA0014B02, 0x00000002, 0x4029D020, - 0xA0014B02, 0x00000002, 0x4029D020, 0xA0014B02, 0x00000002, 0x4029D020, - 0xA0014C02, 0x00000002, 0x4029D020, 0xA0014D02, 0x00000002, 0x4029D020, - 0xA0014E02, 0x00000002, 0x4029D020, 0xA0014F02, 0x00000002, 0x4029D020, - 0xA0015002, 0x00000002, 0x4029D020, 0xA0015102, - // Block 13, offset 0x340 - 0x00000002, 0x4029D020, 0xA0015202, 0x00000002, 0x4029D020, 0xA0015302, - 0x00000002, 0x4029D020, 0xA0015402, 0x00000002, 0x4029D020, 0xA0015502, - 0x00000002, 0x4029D020, 0xA0015602, 0x00000002, 0x0029D084, 0xA0015604, - 0x00000002, 0x4029D020, 0xA0015702, 0x00000002, 0x4029D020, 0xA0015802, - 0x00000002, 0x4029D020, 0xA0015902, 0x00000002, 0x4029D020, 0xA0015A02, - 0x00000002, 0x4029D020, 0xA0015B02, 0x00000002, 0x4029D020, 0xA0015C02, - 0x00000002, 0x4029D020, 0xA0015D02, 0x00000002, 0x4029D020, 0xA0015E02, - 0x00000002, 0x4029D020, 0xA0015F02, 0x00000002, 0x4029D020, 0xA0016002, - 0x00000002, 0x4029D020, 0xA0016102, 0x00000002, 0x4029D020, 0xA0016202, - 0x00000002, 0x4029D020, 0xA0016302, 0x00000002, 0x4029D020, 0xA0016402, - 0x00000002, 0x4029D020, 0xA0016502, 0x00000002, - // Block 14, offset 0x380 - 0x4029D020, 0xA0016602, 0x00000002, 0x4029D020, 0xA0016702, 0x00000002, - 0x4029D020, 0xA0016802, 0x00000002, 0x4029D020, 0xA0016802, 0x00000002, - 0x4029D020, 0xA0016802, 0x00000002, 0x4029D020, 0xA0016802, 0x00000002, - 0x4029D020, 0xA0016B02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, - 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, - 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, - 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, - 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, - 0x4029D020, 0xA0016E02, 0x00000002, 0x4029D020, 0xA0016F02, 0x00000002, - 0x4029D020, 0xA0017002, 0x00000002, 0x4029D020, 0xA0017102, 0x00000002, - 0x4029D020, 0xA0017202, 0x00000002, 0x4029D020, - // Block 15, offset 0x3c0 - 0xA0017302, 0x00000002, 0x4029D020, 0xA0017402, 0x00000002, 0x4029D020, - 0xA0017502, 0x00000002, 0x4029D020, 0xA0017602, 0x00000002, 0x4029D020, - 0xA0017702, 0x00000003, 0x0029D09E, 0x0009589E, 0x0029D29E, 0x00000003, - 0x0029D09E, 0x0009589E, 0x0029D69E, 0x00000002, 0x0029D086, 0x0029CC86, - 0x00000002, 0x0029D086, 0x0029CC86, 0x00000002, 0x4029D220, 0xA0013F02, - 0x00000002, 0x4029D220, 0xA0014002, 0x00000002, 0x4029D220, 0xA0014102, - 0x00000002, 0x4029D220, 0xA0014202, 0x00000002, 0x4029D220, 0xA0014302, - 0x00000002, 0x4029D220, 0xA0014402, 0x00000002, 0x4029D220, 0xA0014502, - 0x00000002, 0x4029D220, 0xA0014602, 0x00000002, 0x4029D220, 0xA0014702, - 0x00000002, 0x4029D220, 0xA0014802, 0x00000002, 0x4029D220, 0xA0014902, - 0x00000002, 0x4029D220, 0xA0014A02, 0x00000002, - // Block 16, offset 0x400 - 0x4029D220, 0xA0014B02, 0x00000002, 0x4029D220, 0xA0014B02, 0x00000002, - 0x4029D220, 0xA0014B02, 0x00000002, 0x4029D220, 0xA0014C02, 0x00000002, - 0x4029D220, 0xA0014D02, 0x00000002, 0x4029D220, 0xA0014E02, 0x00000002, - 0x4029D220, 0xA0014F02, 0x00000002, 0x4029D220, 0xA0015002, 0x00000002, - 0x4029D220, 0xA0015102, 0x00000002, 0x4029D220, 0xA0015202, 0x00000002, - 0x4029D220, 0xA0015302, 0x00000002, 0x4029D220, 0xA0015402, 0x00000002, - 0x4029D220, 0xA0015502, 0x00000002, 0x4029D220, 0xA0015602, 0x00000002, - 0x0029D284, 0xA0015604, 0x00000002, 0x4029D220, 0xA0015702, 0x00000002, - 0x4029D220, 0xA0015802, 0x00000002, 0x4029D220, 0xA0015902, 0x00000002, - 0x4029D220, 0xA0015A02, 0x00000002, 0x4029D220, 0xA0015B02, 0x00000002, - 0x4029D220, 0xA0015C02, 0x00000002, 0x4029D220, - // Block 17, offset 0x440 - 0xA0015D02, 0x00000002, 0x4029D220, 0xA0015E02, 0x00000002, 0x4029D220, - 0xA0015F02, 0x00000002, 0x4029D220, 0xA0016002, 0x00000002, 0x4029D220, - 0xA0016102, 0x00000002, 0x4029D220, 0xA0016202, 0x00000002, 0x4029D220, - 0xA0016302, 0x00000002, 0x4029D220, 0xA0016402, 0x00000002, 0x4029D220, - 0xA0016502, 0x00000002, 0x4029D220, 0xA0016602, 0x00000002, 0x4029D220, - 0xA0016702, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, - 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, - 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, - 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, - 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, - 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, - // Block 18, offset 0x480 - 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, - 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016E02, - 0x00000002, 0x4029D220, 0xA0016F02, 0x00000002, 0x4029D220, 0xA0017002, - 0x00000002, 0x4029D220, 0xA0017102, 0x00000002, 0x4029D220, 0xA0017202, - 0x00000002, 0x4029D220, 0xA0017302, 0x00000002, 0x4029D220, 0xA0017402, - 0x00000002, 0x4029D220, 0xA0017502, 0x00000002, 0x4029D220, 0xA0017602, - 0x00000002, 0x4029D220, 0xA0017702, 0x00000003, 0x0029D29E, 0x0009589E, - 0x0029D49E, 0x00000003, 0x0029D29E, 0x0009589E, 0x0029D69E, 0x00000003, - 0x0029D29E, 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029D286, 0x0029CC86, - 0x00000002, 0x4029D420, 0xA0013F02, 0x00000002, 0x4029D420, 0xA0014002, - 0x00000002, 0x4029D420, 0xA0014102, 0x00000002, - // Block 19, offset 0x4c0 - 0x4029D420, 0xA0014202, 0x00000002, 0x4029D420, 0xA0014302, 0x00000002, - 0x4029D420, 0xA0014402, 0x00000002, 0x4029D420, 0xA0014502, 0x00000002, - 0x4029D420, 0xA0014602, 0x00000002, 0x4029D420, 0xA0014702, 0x00000002, - 0x4029D420, 0xA0014802, 0x00000002, 0x4029D420, 0xA0014902, 0x00000002, - 0x4029D420, 0xA0014A02, 0x00000002, 0x4029D420, 0xA0014B02, 0x00000002, - 0x4029D420, 0xA0014C02, 0x00000002, 0x4029D420, 0xA0014D02, 0x00000002, - 0x4029D420, 0xA0014E02, 0x00000002, 0x4029D420, 0xA0014F02, 0x00000002, - 0x4029D420, 0xA0015002, 0x00000002, 0x4029D420, 0xA0015102, 0x00000002, - 0x4029D420, 0xA0015202, 0x00000002, 0x4029D420, 0xA0015302, 0x00000002, - 0x4029D420, 0xA0015402, 0x00000002, 0x4029D420, 0xA0015502, 0x00000002, - 0x4029D420, 0xA0015602, 0x00000002, 0x0029D484, - // Block 20, offset 0x500 - 0xA0015604, 0x00000002, 0x4029D420, 0xA0015702, 0x00000002, 0x4029D420, - 0xA0015802, 0x00000002, 0x4029D420, 0xA0015902, 0x00000002, 0x4029D420, - 0xA0015A02, 0x00000002, 0x4029D420, 0xA0015B02, 0x00000002, 0x4029D420, - 0xA0015C02, 0x00000002, 0x4029D420, 0xA0015D02, 0x00000002, 0x4029D420, - 0xA0015E02, 0x00000002, 0x4029D420, 0xA0015F02, 0x00000002, 0x4029D420, - 0xA0016002, 0x00000002, 0x4029D420, 0xA0016102, 0x00000002, 0x4029D420, - 0xA0016202, 0x00000002, 0x4029D420, 0xA0016302, 0x00000002, 0x4029D420, - 0xA0016402, 0x00000002, 0x4029D420, 0xA0016502, 0x00000002, 0x4029D420, - 0xA0016602, 0x00000002, 0x4029D420, 0xA0016702, 0x00000002, 0x4029D420, - 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, - 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - // Block 21, offset 0x540 - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0017002, - 0x00000002, 0x4029D420, 0xA0017102, 0x00000002, 0x4029D420, 0xA0017202, - 0x00000002, 0x4029D420, 0xA0017302, 0x00000002, 0x4029D420, 0xA0017402, - 0x00000002, 0x4029D420, 0xA0017502, 0x00000002, 0x4029D420, 0xA0017602, - 0x00000002, 0x4029D420, 0xA0017702, 0x00000003, 0x0029D49E, 0x0009589E, - 0x0029D69E, 0x00000002, 0x0029D486, 0x0029CC86, - // Block 22, offset 0x580 - 0x00000002, 0x4029D620, 0xA0013F02, 0x00000002, 0x4029D620, 0xA0014002, - 0x00000002, 0x4029D620, 0xA0014102, 0x00000002, 0x4029D620, 0xA0014202, - 0x00000002, 0x4029D620, 0xA0014302, 0x00000002, 0x4029D620, 0xA0014402, - 0x00000002, 0x4029D620, 0xA0014502, 0x00000002, 0x4029D620, 0xA0014602, - 0x00000002, 0x4029D620, 0xA0014702, 0x00000002, 0x4029D620, 0xA0014802, - 0x00000002, 0x4029D620, 0xA0014902, 0x00000002, 0x4029D620, 0xA0014A02, - 0x00000002, 0x4029D620, 0xA0014B02, 0x00000002, 0x4029D620, 0xA0014C02, - 0x00000002, 0x4029D620, 0xA0014D02, 0x00000002, 0x4029D620, 0xA0014E02, - 0x00000002, 0x4029D620, 0xA0014F02, 0x00000002, 0x4029D620, 0xA0015002, - 0x00000002, 0x4029D620, 0xA0015102, 0x00000002, 0x4029D620, 0xA0015202, - 0x00000002, 0x4029D620, 0xA0015302, 0x00000002, - // Block 23, offset 0x5c0 - 0x4029D620, 0xA0015402, 0x00000002, 0x4029D620, 0xA0015502, 0x00000002, - 0x4029D620, 0xA0015602, 0x00000002, 0x0029D684, 0xA0015604, 0x00000002, - 0x4029D620, 0xA0015702, 0x00000002, 0x4029D620, 0xA0015802, 0x00000002, - 0x4029D620, 0xA0015902, 0x00000002, 0x4029D620, 0xA0015A02, 0x00000002, - 0x4029D620, 0xA0015B02, 0x00000002, 0x4029D620, 0xA0015C02, 0x00000002, - 0x4029D620, 0xA0015D02, 0x00000002, 0x4029D620, 0xA0015E02, 0x00000002, - 0x4029D620, 0xA0015F02, 0x00000002, 0x4029D620, 0xA0016002, 0x00000002, - 0x4029D620, 0xA0016102, 0x00000002, 0x4029D620, 0xA0016202, 0x00000002, - 0x4029D620, 0xA0016302, 0x00000002, 0x4029D620, 0xA0016402, 0x00000002, - 0x4029D620, 0xA0016502, 0x00000002, 0x4029D620, 0xA0016602, 0x00000002, - 0x4029D620, 0xA0016702, 0x00000002, 0x4029D620, - // Block 24, offset 0x600 - 0xA0016802, 0x00000002, 0x4029D620, 0xA0016802, 0x00000002, 0x4029D620, - 0xA0016802, 0x00000002, 0x4029D620, 0xA0016802, 0x00000002, 0x4029D620, - 0xA0016802, 0x00000002, 0x4029D620, 0xA0016A02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0017202, 0x00000002, 0x4029D620, - 0xA0017302, 0x00000002, 0x4029D620, 0xA0017402, 0x00000002, 0x4029D620, - 0xA0017502, 0x00000002, 0x4029D620, 0xA0017702, - // Block 25, offset 0x640 - 0x00000003, 0x0029D69E, 0x0009589E, 0x0029D89E, 0x00000003, 0x0029D69E, - 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029D686, 0x0029CC86, 0x00000002, - 0x4029D820, 0xA0013F02, 0x00000002, 0x4029D820, 0xA0014002, 0x00000002, - 0x4029D820, 0xA0014102, 0x00000002, 0x4029D820, 0xA0014202, 0x00000002, - 0x4029D820, 0xA0014302, 0x00000002, 0x4029D820, 0xA0014402, 0x00000002, - 0x4029D820, 0xA0014502, 0x00000002, 0x4029D820, 0xA0014602, 0x00000002, - 0x4029D820, 0xA0014702, 0x00000002, 0x4029D820, 0xA0014802, 0x00000002, - 0x4029D820, 0xA0014902, 0x00000002, 0x4029D820, 0xA0014A02, 0x00000002, - 0x4029D820, 0xA0014B02, 0x00000002, 0x4029D820, 0xA0014C02, 0x00000002, - 0x4029D820, 0xA0014D02, 0x00000002, 0x4029D820, 0xA0014E02, 0x00000002, - 0x4029D820, 0xA0014F02, 0x00000002, 0x4029D820, - // Block 26, offset 0x680 - 0xA0015002, 0x00000002, 0x4029D820, 0xA0015102, 0x00000002, 0x4029D820, - 0xA0015202, 0x00000002, 0x4029D820, 0xA0015302, 0x00000002, 0x4029D820, - 0xA0015402, 0x00000002, 0x4029D820, 0xA0015502, 0x00000002, 0x4029D820, - 0xA0015602, 0x00000002, 0x0029D884, 0xA0015604, 0x00000002, 0x4029D820, - 0xA0015702, 0x00000002, 0x4029D820, 0xA0015802, 0x00000002, 0x4029D820, - 0xA0015902, 0x00000002, 0x4029D820, 0xA0015A02, 0x00000002, 0x4029D820, - 0xA0015B02, 0x00000002, 0x4029D820, 0xA0015C02, 0x00000002, 0x4029D820, - 0xA0015D02, 0x00000002, 0x4029D820, 0xA0015E02, 0x00000002, 0x4029D820, - 0xA0015F02, 0x00000002, 0x4029D820, 0xA0016002, 0x00000002, 0x4029D820, - 0xA0016102, 0x00000002, 0x4029D820, 0xA0016202, 0x00000002, 0x4029D820, - 0xA0016302, 0x00000002, 0x4029D820, 0xA0016402, - // Block 27, offset 0x6c0 - 0x00000002, 0x4029D820, 0xA0016502, 0x00000002, 0x4029D820, 0xA0016602, - 0x00000002, 0x4029D820, 0xA0016702, 0x00000002, 0x4029D820, 0xA0016902, - 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, - 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, - 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, - 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0017202, - 0x00000002, 0x4029D820, 0xA0017302, 0x00000002, 0x4029D820, 0xA0017402, - 0x00000002, 0x4029D820, 0xA0017502, 0x00000002, 0x4029D820, 0xA0017702, - 0x00000002, 0x0029D886, 0x0029CC86, 0x00000002, 0x4029DA20, 0xA0013F02, - 0x00000002, 0x4029DA20, 0xA0014002, 0x00000002, 0x4029DA20, 0xA0014102, - 0x00000002, 0x4029DA20, 0xA0014202, 0x00000002, - // Block 28, offset 0x700 - 0x4029DA20, 0xA0014302, 0x00000002, 0x4029DA20, 0xA0014402, 0x00000002, - 0x4029DA20, 0xA0014502, 0x00000002, 0x4029DA20, 0xA0014602, 0x00000002, - 0x4029DA20, 0xA0014702, 0x00000002, 0x4029DA20, 0xA0014802, 0x00000002, - 0x4029DA20, 0xA0014902, 0x00000002, 0x4029DA20, 0xA0014A02, 0x00000002, - 0x4029DA20, 0xA0014B02, 0x00000002, 0x4029DA20, 0xA0014C02, 0x00000002, - 0x4029DA20, 0xA0014D02, 0x00000002, 0x4029DA20, 0xA0014E02, 0x00000002, - 0x4029DA20, 0xA0014F02, 0x00000002, 0x4029DA20, 0xA0015002, 0x00000002, - 0x4029DA20, 0xA0015102, 0x00000002, 0x4029DA20, 0xA0015202, 0x00000002, - 0x4029DA20, 0xA0015302, 0x00000002, 0x4029DA20, 0xA0015402, 0x00000002, - 0x4029DA20, 0xA0015502, 0x00000002, 0x4029DA20, 0xA0015602, 0x00000002, - 0x0029DA84, 0xA0015604, 0x00000002, 0x4029DA20, - // Block 29, offset 0x740 - 0xA0015702, 0x00000002, 0x4029DA20, 0xA0015802, 0x00000002, 0x4029DA20, - 0xA0015902, 0x00000002, 0x4029DA20, 0xA0015A02, 0x00000002, 0x4029DA20, - 0xA0015B02, 0x00000002, 0x4029DA20, 0xA0015C02, 0x00000002, 0x4029DA20, - 0xA0015D02, 0x00000002, 0x4029DA20, 0xA0015E02, 0x00000002, 0x4029DA20, - 0xA0015F02, 0x00000002, 0x4029DA20, 0xA0016002, 0x00000002, 0x4029DA20, - 0xA0016102, 0x00000002, 0x4029DA20, 0xA0016202, 0x00000002, 0x4029DA20, - 0xA0016302, 0x00000002, 0x4029DA20, 0xA0016402, 0x00000002, 0x4029DA20, - 0xA0016502, 0x00000002, 0x4029DA20, 0xA0016602, 0x00000002, 0x4029DA20, - 0xA0016702, 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, - 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, - 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, - // Block 30, offset 0x780 - 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, - 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0017202, - 0x00000002, 0x4029DA20, 0xA0017302, 0x00000002, 0x4029DA20, 0xA0017402, - 0x00000002, 0x4029DA20, 0xA0017502, 0x00000002, 0x4029DA20, 0xA0017702, - 0x00000003, 0x0029DA9E, 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029DA86, - 0x0029CC86, 0x00000002, 0x4029DC20, 0xA0013F02, 0x00000002, 0x4029DC20, - 0xA0014002, 0x00000002, 0x4029DC20, 0xA0014102, 0x00000002, 0x4029DC20, - 0xA0014202, 0x00000002, 0x4029DC20, 0xA0014302, 0x00000002, 0x4029DC20, - 0xA0014402, 0x00000002, 0x4029DC20, 0xA0014502, 0x00000002, 0x4029DC20, - 0xA0014602, 0x00000002, 0x4029DC20, 0xA0014702, 0x00000002, 0x4029DC20, - 0xA0014802, 0x00000002, 0x4029DC20, 0xA0014902, - // Block 31, offset 0x7c0 - 0x00000002, 0x4029DC20, 0xA0014A02, 0x00000002, 0x4029DC20, 0xA0014B02, - 0x00000002, 0x4029DC20, 0xA0014C02, 0x00000002, 0x4029DC20, 0xA0014D02, - 0x00000002, 0x4029DC20, 0xA0014E02, 0x00000002, 0x4029DC20, 0xA0014F02, - 0x00000002, 0x4029DC20, 0xA0015002, 0x00000002, 0x4029DC20, 0xA0015102, - 0x00000002, 0x4029DC20, 0xA0015202, 0x00000002, 0x4029DC20, 0xA0015302, - 0x00000002, 0x4029DC20, 0xA0015402, 0x00000002, 0x4029DC20, 0xA0015502, - 0x00000002, 0x4029DC20, 0xA0015602, 0x00000002, 0x0029DC84, 0xA0015604, - 0x00000002, 0x4029DC20, 0xA0015702, 0x00000002, 0x4029DC20, 0xA0015802, - 0x00000002, 0x4029DC20, 0xA0015902, 0x00000002, 0x4029DC20, 0xA0015A02, - 0x00000002, 0x4029DC20, 0xA0015B02, 0x00000002, 0x4029DC20, 0xA0015C02, - 0x00000002, 0x4029DC20, 0xA0015D02, 0x00000002, - // Block 32, offset 0x800 - 0x4029DC20, 0xA0015E02, 0x00000002, 0x4029DC20, 0xA0015F02, 0x00000002, - 0x4029DC20, 0xA0016002, 0x00000002, 0x4029DC20, 0xA0016102, 0x00000002, - 0x4029DC20, 0xA0016202, 0x00000002, 0x4029DC20, 0xA0016302, 0x00000002, - 0x4029DC20, 0xA0016402, 0x00000002, 0x4029DC20, 0xA0016502, 0x00000002, - 0x4029DC20, 0xA0016602, 0x00000002, 0x4029DC20, 0xA0016702, 0x00000002, - 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, - 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, - 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, - 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0017202, 0x00000002, - 0x4029DC20, 0xA0017302, 0x00000002, 0x4029DC20, 0xA0017402, 0x00000002, - 0x4029DC20, 0xA0017502, 0x00000002, 0x4029DC20, - // Block 33, offset 0x840 - 0xA0017702, 0x00000002, 0x0029DC86, 0x0029CC86, 0x00000002, 0x4029DE20, - 0xA0013F02, 0x00000002, 0x4029DE20, 0xA0014002, 0x00000002, 0x4029DE20, - 0xA0014102, 0x00000002, 0x4029DE20, 0xA0014202, 0x00000002, 0x4029DE20, - 0xA0014302, 0x00000002, 0x4029DE20, 0xA0014402, 0x00000002, 0x4029DE20, - 0xA0014502, 0x00000002, 0x4029DE20, 0xA0014602, 0x00000002, 0x4029DE20, - 0xA0014702, 0x00000002, 0x4029DE20, 0xA0014802, 0x00000002, 0x4029DE20, - 0xA0014902, 0x00000002, 0x4029DE20, 0xA0014A02, 0x00000002, 0x4029DE20, - 0xA0014B02, 0x00000002, 0x4029DE20, 0xA0014C02, 0x00000002, 0x4029DE20, - 0xA0014D02, 0x00000002, 0x4029DE20, 0xA0014E02, 0x00000002, 0x4029DE20, - 0xA0014F02, 0x00000002, 0x4029DE20, 0xA0015002, 0x00000002, 0x4029DE20, - 0xA0015102, 0x00000002, 0x4029DE20, 0xA0015202, - // Block 34, offset 0x880 - 0x00000002, 0x4029DE20, 0xA0015302, 0x00000002, 0x4029DE20, 0xA0015402, - 0x00000002, 0x4029DE20, 0xA0015502, 0x00000002, 0x4029DE20, 0xA0015602, - 0x00000002, 0x0029DE84, 0xA0015604, 0x00000002, 0x4029DE20, 0xA0015702, - 0x00000002, 0x4029DE20, 0xA0015802, 0x00000002, 0x4029DE20, 0xA0015902, - 0x00000002, 0x4029DE20, 0xA0015A02, 0x00000002, 0x4029DE20, 0xA0015B02, - 0x00000002, 0x4029DE20, 0xA0015C02, 0x00000002, 0x4029DE20, 0xA0015D02, - 0x00000002, 0x4029DE20, 0xA0015E02, 0x00000002, 0x4029DE20, 0xA0015F02, - 0x00000002, 0x4029DE20, 0xA0016002, 0x00000002, 0x4029DE20, 0xA0016102, - 0x00000002, 0x4029DE20, 0xA0016202, 0x00000002, 0x4029DE20, 0xA0016302, - 0x00000002, 0x4029DE20, 0xA0016402, 0x00000002, 0x4029DE20, 0xA0016502, - 0x00000002, 0x4029DE20, 0xA0016602, 0x00000002, - // Block 35, offset 0x8c0 - 0x4029DE20, 0xA0016702, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, - 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, - 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, - 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, - 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, - 0x4029DE20, 0xA0017202, 0x00000002, 0x4029DE20, 0xA0017302, 0x00000002, - 0x4029DE20, 0xA0017402, 0x00000002, 0x4029DE20, 0xA0017502, 0x00000002, - 0x4029DE20, 0xA0017702, 0x00000002, 0x402BDE20, 0xAE603202, 0x00000002, - 0x002BDE88, 0xAE603202, 0x00000002, 0x402BDE20, 0xAE603502, 0x00000002, - 0x002BDE88, 0xAE603502, 0x00000002, 0x402BDE20, 0xAE603702, 0x00000002, - 0x002BDE88, 0xAE603702, 0x00000003, 0x402BDE20, - // Block 36, offset 0x900 - 0xAE603702, 0xAE603202, 0x00000003, 0x002BDE88, 0xAE603702, 0xAE603202, - 0x00000003, 0x402BDE20, 0xAE603702, 0xAE603502, 0x00000003, 0x002BDE88, - 0xAE603702, 0xAE603502, 0x00000003, 0x402BDE20, 0xAE603702, 0xAE604E02, - 0x00000003, 0x002BDE88, 0xAE603702, 0xAE604E02, 0x00000003, 0x402BDE20, - 0xAE603702, 0xAE606402, 0x00000003, 0x002BDE88, 0xAE603702, 0xAE606402, - 0x00000002, 0x402BDE20, 0xAE603C02, 0x00000002, 0x002BDE88, 0xAE603C02, - 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE603202, 0x00000003, 0x002BDE88, - 0xAE603C02, 0xAE603202, 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE603502, - 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE603502, 0x00000003, 0x402BDE20, - 0xAE603C02, 0xAE604E02, 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE604E02, - 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE606402, - // Block 37, offset 0x940 - 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE606402, 0x00000002, 0x402BDE20, - 0xAE604102, 0x00000002, 0x002BDE88, 0xAE604102, 0x00000002, 0x402BDE20, - 0xAE604302, 0x00000002, 0x002BDE88, 0xAE604302, 0x00000003, 0x402BDE20, - 0xAE604302, 0xAE603202, 0x00000003, 0x002BDE88, 0xAE604302, 0xAE603202, - 0x00000002, 0x402BDE20, 0xAE604702, 0x00000002, 0x002BDE88, 0xAE604702, - 0x00000003, 0x402BDE20, 0xAE604702, 0xAE605B02, 0x00000003, 0x002BDE88, - 0xAE604702, 0xAE605B02, 0x00000002, 0x402BDE20, 0xAE604E02, 0x00000002, - 0x002BDE88, 0xAE604E02, 0x00000002, 0x402BDE20, 0xAE605202, 0x00000002, - 0x002BDE88, 0xAE605202, 0x00000003, 0x402BDE20, 0xAE605202, 0xAE605B02, - 0x00000003, 0x002BDE88, 0xAE605202, 0xAE605B02, 0x00000002, 0x402BDE20, - 0xACA05902, 0x00000002, 0x002BDE88, 0xACA05902, - // Block 38, offset 0x980 - 0x00000002, 0x402BDE20, 0xAE605B02, 0x00000002, 0x002BDE88, 0xAE605B02, - 0x00000002, 0x402BDE20, 0xAE606402, 0x00000002, 0x002BDE88, 0xAE606402, - 0x00000002, 0x402BDE20, 0xAE606502, 0x00000002, 0x002BDE88, 0xAE606502, - 0x00000002, 0x402BDE20, 0xAE606702, 0x00000002, 0x002BDE88, 0xAE606702, - 0x00000002, 0x402BDE20, 0xADC07002, 0x00000002, 0x002BDE88, 0xADC07002, - 0x00000003, 0x402BDE20, 0xADC07002, 0xAE603702, 0x00000003, 0x002BDE88, - 0xADC07002, 0xAE603702, 0x00000003, 0x402BDE20, 0xADC07002, 0xAE603C02, - 0x00000003, 0x002BDE88, 0xADC07002, 0xAE603C02, 0x00000002, 0x402BDE20, - 0xADC07602, 0x00000002, 0x002BDE88, 0xADC07602, 0x00000002, 0x84E615EF, - 0xAE613904, 0x00000004, 0x002BDE9C, 0x0002E49C, 0x002E829C, 0x0002E49C, - 0x00000003, 0x002BDE84, 0x0004E284, 0x002C3A84, - // Block 39, offset 0x9c0 - 0x00000003, 0x002BDE84, 0x0004E284, 0x002FE684, 0x00000003, 0x002BDE8A, - 0x0004E284, 0x002FE68A, 0x00000003, 0x002BDE9D, 0x0009569C, 0x002E829C, - 0x00000002, 0x002BDE84, 0x002BDE84, 0x00000002, 0x002BDE8A, 0x002BDE8A, - 0x00000002, 0x002BDE9D, 0x002C0A9D, 0x00000003, 0x002BDE84, 0xA0013904, - 0x002C9884, 0x00000003, 0x84E615EF, 0xAE613904, 0x84E6164C, 0x00000003, - 0x002BDE8A, 0xA0013904, 0x002C988A, 0x00000003, 0x002BDE94, 0xA0013914, - 0x002C9894, 0x00000004, 0x002BDE84, 0xA0013904, 0x002C9884, 0xAE603202, - 0x00000004, 0x002BDE8A, 0xA0013904, 0x002C988A, 0xAE603202, 0x00000004, - 0x002BDE84, 0xA0013904, 0x002C9884, 0xAE605B02, 0x00000004, 0x002BDE8A, - 0xA0013904, 0x002C988A, 0xAE605B02, 0x00000002, 0x84E615EF, 0x84E61771, - 0x00000002, 0x002BDE84, 0x002EE284, 0x00000002, - // Block 40, offset 0xa00 - 0x002BDE8A, 0x002EE28A, 0x00000002, 0x002BDE84, 0x00306C84, 0x00000002, - 0x002BDE8A, 0x00306C8A, 0x00000002, 0x84E615EF, 0x84E6185F, 0x00000002, - 0x002BDE84, 0x0030BE84, 0x00000002, 0x002BDE8A, 0x0030BE8A, 0x00000003, - 0x002BDE84, 0xA0013904, 0x0030BE84, 0x00000003, 0x002BDE8A, 0xA0013904, - 0x0030BE8A, 0x00000002, 0x002BDE84, 0x00310084, 0x00000002, 0x002BDE8A, - 0x0031008A, 0x00000002, 0x402C0A20, 0xAE605202, 0x00000002, 0x002C0A88, - 0xAE605202, 0x00000002, 0x402C0A20, 0xADC07002, 0x00000002, 0x002C0A88, - 0xADC07002, 0x00000002, 0x402C0A20, 0xADC07B02, 0x00000002, 0x002C0A88, - 0xADC07B02, 0x00000003, 0x002C0A9C, 0x002BDE9C, 0x002F7A9C, 0x00000002, - 0x402C3A20, 0xAE603202, 0x00000002, 0x002C3A88, 0xAE603202, 0x00000002, - 0x402C3A20, 0xAE603C02, 0x00000002, 0x002C3A88, - // Block 41, offset 0xa40 - 0xAE603C02, 0x00000002, 0x402C3A20, 0xAE604102, 0x00000002, 0x002C3A88, - 0xAE604102, 0x00000002, 0x402C3A20, 0xAE605202, 0x00000002, 0x002C3A88, - 0xAE605202, 0x00000002, 0x402C3A20, 0xACA05602, 0x00000002, 0x84E6161D, - 0xAE605604, 0x00000002, 0x002C3A88, 0xACA05602, 0x00000003, 0x402C3A20, - 0xACA05602, 0xAE603202, 0x00000003, 0x002C3A88, 0xACA05602, 0xAE603202, - 0x00000003, 0x002C3A84, 0x0004E284, 0x002EE284, 0x00000003, 0x002C3A84, - 0x0004E284, 0x00306C84, 0x00000004, 0x002C3A9D, 0x0009569C, 0x002DFE9C, - 0x002D229C, 0x00000003, 0x002C3A9C, 0x002BDE9C, 0x002E229C, 0x00000002, - 0x002C3A9D, 0x002E229D, 0x00000003, 0x002C3A9C, 0x002E829C, 0x0029D09C, - 0x00000003, 0x002C3A9C, 0x002E829C, 0x0029D29C, 0x00000003, 0x002C3A9D, - 0x002EE29C, 0x0002E49C, 0x00000004, 0x002C3A9D, - // Block 42, offset 0xa80 - 0x002EE29D, 0x002EE29D, 0x002E229D, 0x00000002, 0x402C6220, 0xAE604102, - 0x00000002, 0x002C6288, 0xAE604102, 0x00000002, 0x402C6220, 0xAE605202, - 0x00000002, 0x002C6288, 0xAE605202, 0x00000002, 0x402C6220, 0xACA05602, - 0x00000002, 0x002C6288, 0xACA05602, 0x00000002, 0x402C6220, 0xADC07002, - 0x00000002, 0x002C6288, 0xADC07002, 0x00000002, 0x402C6220, 0xADC07802, - 0x00000002, 0x002C6288, 0xADC07802, 0x00000002, 0x402C6220, 0xADC07B02, - 0x00000002, 0x002C6288, 0xADC07B02, 0x00000002, 0x402C6220, 0xA0007D02, - 0x00000002, 0x002C6288, 0xA0007D02, 0x00000002, 0x002C6284, 0xA0013904, - 0x00000002, 0x84E61631, 0xAE613904, 0x00000002, 0x002C628A, 0xA0013904, - 0x00000002, 0x84E61631, 0xAE613A04, 0x00000002, 0x002C6284, 0xA0013A04, - 0x00000002, 0x002C628A, 0xA0013A04, 0x00000002, - // Block 43, offset 0xac0 - 0x002C6284, 0x002C0A84, 0x00000003, 0x002C629C, 0x002E829C, 0x0029D09C, - 0x00000003, 0x002C629C, 0x002E829C, 0x0029D29C, 0x00000002, 0x002C6284, - 0x00312A84, 0x00000003, 0x002C6284, 0x00312A84, 0xA0004104, 0x00000003, - 0x002C628A, 0x00312A84, 0xA0004104, 0x00000003, 0x002C628A, 0x00312A8A, - 0xA0004104, 0x00000002, 0x002C6284, 0x00315084, 0x00000002, 0x002C6284, - 0x00316484, 0x00000002, 0x402C9820, 0xAE603202, 0x00000002, 0x002C9888, - 0xAE603202, 0x00000002, 0x402C9820, 0xAE603502, 0x00000002, 0x002C9888, - 0xAE603502, 0x00000002, 0x402C9820, 0xAE603702, 0x00000002, 0x002C9888, - 0xAE603702, 0x00000002, 0x402C9820, 0xAE603C02, 0x00000002, 0x002C9888, - 0xAE603C02, 0x00000003, 0x402C9820, 0xAE603C02, 0xAE603202, 0x00000003, - 0x002C9888, 0xAE603C02, 0xAE603202, 0x00000003, - // Block 44, offset 0xb00 - 0x402C9820, 0xAE603C02, 0xAE603502, 0x00000003, 0x002C9888, 0xAE603C02, - 0xAE603502, 0x00000003, 0x402C9820, 0xAE603C02, 0xAE604E02, 0x00000003, - 0x002C9888, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C9820, 0xAE603C02, - 0xAE606402, 0x00000003, 0x002C9888, 0xAE603C02, 0xAE606402, 0x00000002, - 0x402C9820, 0xAE604102, 0x00000002, 0x002C9888, 0xAE604102, 0x00000002, - 0x402C9820, 0xAE604702, 0x00000002, 0x002C9888, 0xAE604702, 0x00000002, - 0x402C9820, 0xAE604E02, 0x00000002, 0x002C9888, 0xAE604E02, 0x00000002, - 0x402C9820, 0xAE605202, 0x00000002, 0x002C9888, 0xAE605202, 0x00000002, - 0x402C9820, 0xACA05602, 0x00000002, 0x002C9888, 0xACA05602, 0x00000003, - 0x402C9820, 0xACA05602, 0xAE603702, 0x00000003, 0x002C9888, 0xACA05602, - 0xAE603702, 0x00000002, 0x402C9820, 0xACA05902, - // Block 45, offset 0xb40 - 0x00000002, 0x002C9888, 0xACA05902, 0x00000002, 0x402C9820, 0xAE605B02, - 0x00000002, 0x002C9888, 0xAE605B02, 0x00000003, 0x402C9820, 0xAE605B02, - 0xAE603202, 0x00000003, 0x002C9888, 0xAE605B02, 0xAE603202, 0x00000003, - 0x402C9820, 0xAE605B02, 0xAE603502, 0x00000003, 0x002C9888, 0xAE605B02, - 0xAE603502, 0x00000002, 0x402C9820, 0xAE606402, 0x00000002, 0x002C9888, - 0xAE606402, 0x00000002, 0x402C9820, 0xAE606502, 0x00000002, 0x002C9888, - 0xAE606502, 0x00000002, 0x402C9820, 0xAE606702, 0x00000002, 0x002C9888, - 0xAE606702, 0x00000002, 0x402C9820, 0xADC07002, 0x00000002, 0x002C9888, - 0xADC07002, 0x00000003, 0x402C9820, 0xADC07002, 0xAE603C02, 0x00000003, - 0x002C9888, 0xADC07002, 0xAE603C02, 0x00000002, 0x402C9820, 0xADC07802, - 0x00000002, 0x002C9888, 0xADC07802, 0x00000002, - // Block 46, offset 0xb80 - 0x402C9820, 0xADC07A02, 0x00000002, 0x002C9888, 0xADC07A02, 0x00000003, - 0x002C989C, 0x002F7A9C, 0x002D229C, 0x00000002, 0x402D0820, 0xAE605202, - 0x00000002, 0x002D0888, 0xAE605202, 0x00000002, 0x002D0884, 0xA0013A04, - 0x00000002, 0x002D088A, 0xA0013A04, 0x00000003, 0x002D088A, 0x002BDE8A, - 0x0030F68A, 0x00000003, 0x002D0884, 0x002D0884, 0x002D9A84, 0x00000003, - 0x002D0884, 0x002D0884, 0x002E2284, 0x00000002, 0x002D0884, 0x002EDA84, - 0x00000004, 0x002D089D, 0x002F7A9D, 0x002C989D, 0x002C989D, 0x00000002, - 0x402D2220, 0xAE603202, 0x00000002, 0x002D2288, 0xAE603202, 0x00000002, - 0x402D2220, 0xAE603702, 0x00000002, 0x002D2288, 0xAE603702, 0x00000002, - 0x402D2220, 0xAE603C02, 0x00000002, 0x002D2288, 0xAE603C02, 0x00000002, - 0x402D2220, 0xAE604102, 0x00000002, 0x002D2288, - // Block 47, offset 0xbc0 - 0xAE604102, 0x00000002, 0x402D2220, 0xAE605202, 0x00000002, 0x002D2288, - 0xAE605202, 0x00000002, 0x402D2220, 0xACA05602, 0x00000002, 0x002D2288, - 0xACA05602, 0x00000002, 0x402D2220, 0xAE605B02, 0x00000002, 0x002D2288, - 0xAE605B02, 0x00000002, 0x002D2284, 0xA0006104, 0x00000002, 0x002D228A, - 0xA0006104, 0x00000002, 0x002D2284, 0xA0013A04, 0x00000002, 0x002D228A, - 0xA0013A04, 0x00000003, 0x002D229C, 0x002BDE9C, 0x002E229C, 0x00000003, - 0x002D229D, 0x002D689D, 0x00312A9C, 0x00000003, 0x002D229D, 0x002F2C9D, - 0x002BDE9C, 0x00000002, 0x402D6820, 0xAE603C02, 0x00000002, 0x002D6888, - 0xAE603C02, 0x00000002, 0x402D6820, 0xAE604102, 0x00000002, 0x002D6888, - 0xAE604102, 0x00000002, 0x402D6820, 0xAE604702, 0x00000002, 0x002D6888, - 0xAE604702, 0x00000002, 0x402D6820, 0xAE605202, - // Block 48, offset 0xc00 - 0x00000002, 0x002D6888, 0xAE605202, 0x00000002, 0x402D6820, 0xACA05602, - 0x00000002, 0x002D6888, 0xACA05602, 0x00000002, 0x402D6820, 0xADC07002, - 0x00000002, 0x002D6888, 0xADC07002, 0x00000002, 0x402D6820, 0xADC07902, - 0x00000002, 0x002D6888, 0xADC07902, 0x00000002, 0x402D6820, 0xADC07B02, - 0x00000002, 0x402D6820, 0xA0007D02, 0x00000002, 0x002D6888, 0xA0007D02, - 0x00000003, 0x002D689C, 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402D9A20, - 0xAE603202, 0x00000002, 0x002D9A88, 0xAE603202, 0x00000002, 0x402D9A20, - 0xAE603502, 0x00000002, 0x002D9A88, 0xAE603502, 0x00000002, 0x402D9A20, - 0xAE603702, 0x00000002, 0x002D9A88, 0xAE603702, 0x00000002, 0x402D9A20, - 0xAE603C02, 0x00000002, 0x002D9A88, 0xAE603C02, 0x00000002, 0x402D9A20, - 0xAE604102, 0x00000002, 0x002D9A88, 0xAE604102, - // Block 49, offset 0xc40 - 0x00000002, 0x402D9A20, 0xAE604702, 0x00000002, 0x002D9A88, 0xAE604702, - 0x00000003, 0x402D9A20, 0xAE604702, 0xAE603202, 0x00000003, 0x002D9A88, - 0xAE604702, 0xAE603202, 0x00000002, 0x402D9A20, 0xAE604E02, 0x00000002, - 0x002D9A88, 0xAE604E02, 0x00000002, 0x002D9A88, 0xAE605202, 0x00000002, - 0x402D9A20, 0xACA05902, 0x00000002, 0x002D9A88, 0xACA05902, 0x00000002, - 0x402D9A20, 0xAE605B02, 0x00000002, 0x002D9A88, 0xAE605B02, 0x00000002, - 0x402D9A20, 0xAE606402, 0x00000002, 0x002D9A88, 0xAE606402, 0x00000002, - 0x402D9A20, 0xAE606502, 0x00000002, 0x002D9A88, 0xAE606502, 0x00000002, - 0x402D9A20, 0xAE606702, 0x00000002, 0x002D9A88, 0xAE606702, 0x00000002, - 0x402D9A20, 0xADC07002, 0x00000002, 0x002D9A88, 0xADC07002, 0x00000002, - 0x402D9A20, 0xADC07A02, 0x00000002, 0x002D9A88, - // Block 50, offset 0xc80 - 0xADC07A02, 0x00000002, 0x002D9A9D, 0x002C3A9D, 0x00000002, 0x002D9A9D, - 0x002C629D, 0x00000002, 0x402DCC20, 0xAE603C02, 0x00000002, 0x002DCC88, - 0xAE603C02, 0x00000002, 0x402DCC20, 0xAE604102, 0x00000002, 0x402DFE20, - 0xAE603202, 0x00000002, 0x002DFE88, 0xAE603202, 0x00000002, 0x402DFE20, - 0xAE604102, 0x00000002, 0x002DFE88, 0xAE604102, 0x00000002, 0x402DFE20, - 0xACA05602, 0x00000002, 0x002DFE88, 0xACA05602, 0x00000002, 0x002DFE84, - 0xA0006104, 0x00000002, 0x002DFE8A, 0xA0006104, 0x00000002, 0x402DFE20, - 0xADC07002, 0x00000002, 0x002DFE88, 0xADC07002, 0x00000002, 0x402DFE20, - 0xADC07B02, 0x00000002, 0x002DFE88, 0xADC07B02, 0x00000004, 0x002DFE9C, - 0x002C3A9C, 0x002BDE9C, 0x002E229C, 0x00000003, 0x002DFE9C, 0x002D689D, - 0x00312A9C, 0x00000003, 0x002DFE9C, 0x002E829C, - // Block 51, offset 0xcc0 - 0x0029D09C, 0x00000003, 0x002DFE9C, 0x002E829C, 0x0029D29C, 0x00000003, - 0x002DFE9C, 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402E2220, 0xAE603202, - 0x00000002, 0x002E2288, 0xAE603202, 0x00000002, 0x402E2220, 0xAE604102, - 0x00000002, 0x002E2288, 0xAE604102, 0x00000002, 0x402E2220, 0xACA05602, - 0x00000002, 0x002E2288, 0xACA05602, 0x00000002, 0x402E2220, 0xADC07002, - 0x00000002, 0x002E2288, 0xADC07002, 0x00000003, 0x402E2220, 0xADC07002, - 0xAE605B02, 0x00000003, 0x002E2288, 0xADC07002, 0xAE605B02, 0x00000002, - 0x402E2220, 0xADC07802, 0x00000002, 0x002E2288, 0xADC07802, 0x00000002, - 0x402E2220, 0xADC07B02, 0x00000002, 0x002E2288, 0xADC07B02, 0x00000002, - 0x402E2220, 0xA0007D02, 0x00000002, 0x002E2288, 0xA0007D02, 0x00000002, - 0x402E2220, 0xA0013902, 0x00000002, 0x402E2220, - // Block 52, offset 0xd00 - 0xA0013902, 0x00000002, 0x002E2288, 0xA0013902, 0x00000002, 0x002E2288, - 0xA0013902, 0x00000002, 0x002E2284, 0x002E2284, 0x00000002, 0x002E228A, - 0x002E228A, 0x00000003, 0x002E229C, 0x002EE29C, 0x002D229C, 0x00000002, - 0x002E2284, 0x002FE684, 0x00000003, 0x002E229D, 0x00302C9D, 0x002C629D, - 0x00000002, 0x002E2284, 0x00312A84, 0x00000002, 0x402E8220, 0xAE603202, - 0x00000002, 0x002E8288, 0xAE603202, 0x00000002, 0x402E8220, 0xAE605202, - 0x00000002, 0x002E8288, 0xAE605202, 0x00000002, 0x402E8220, 0xADC07002, - 0x00000002, 0x002E8288, 0xADC07002, 0x00000003, 0x002E829C, 0x0009569C, - 0x002FE69C, 0x00000004, 0x002E829C, 0x0009569C, 0x002FE69C, 0x0029D09C, - 0x00000003, 0x002E829D, 0x002D689D, 0x00312A9C, 0x00000003, 0x002E829C, - 0x002D9A9C, 0x002E229C, 0x00000003, 0x002E829C, - // Block 53, offset 0xd40 - 0x002E829C, 0x0029D09C, 0x00000003, 0x002E829C, 0x002E829C, 0x0029D29C, - 0x00000003, 0x002E829C, 0x002EE29C, 0x002E229C, 0x00000003, 0x002E829D, - 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402E9E20, 0xAE603202, 0x00000002, - 0x002E9E88, 0xAE603202, 0x00000002, 0x402E9E20, 0xAE603502, 0x00000002, - 0x002E9E88, 0xAE603502, 0x00000002, 0x402E9E20, 0xAE604102, 0x00000002, - 0x002E9E88, 0xAE604102, 0x00000002, 0x402E9E20, 0xAE604E02, 0x00000002, - 0x002E9E88, 0xAE604E02, 0x00000002, 0x402E9E20, 0xAE605202, 0x00000002, - 0x002E9E88, 0xAE605202, 0x00000002, 0x402E9E20, 0xACA05602, 0x00000002, - 0x002E9E88, 0xACA05602, 0x00000002, 0x002E9E84, 0xA0006104, 0x00000002, - 0x002E9E8A, 0xA0006104, 0x00000002, 0x402E9E20, 0xADC07002, 0x00000002, - 0x002E9E88, 0xADC07002, 0x00000002, 0x402E9E20, - // Block 54, offset 0xd80 - 0xADC07802, 0x00000002, 0x002E9E88, 0xADC07802, 0x00000002, 0x402E9E20, - 0xADC07B02, 0x00000002, 0x002E9E88, 0xADC07B02, 0x00000003, 0x002E9E9D, - 0x002C989D, 0x0030E29D, 0x00000002, 0x002E9E9D, 0x002D229D, 0x00000002, - 0x402EE220, 0xAE603202, 0x00000002, 0x002EE288, 0xAE603202, 0x00000002, - 0x402EE220, 0xAE603502, 0x00000002, 0x002EE288, 0xAE603502, 0x00000002, - 0x402EE220, 0xAE603702, 0x00000002, 0x002EE288, 0xAE603702, 0x00000002, - 0x402EE220, 0xAE603C02, 0x00000002, 0x002EE288, 0xAE603C02, 0x00000003, - 0x402EE220, 0xAE603C02, 0xAE603202, 0x00000003, 0x002EE288, 0xAE603C02, - 0xAE603202, 0x00000003, 0x402EE220, 0xAE603C02, 0xAE603502, 0x00000003, - 0x002EE288, 0xAE603C02, 0xAE603502, 0x00000003, 0x402EE220, 0xAE603C02, - 0xAE604E02, 0x00000003, 0x002EE288, 0xAE603C02, - // Block 55, offset 0xdc0 - 0xAE604E02, 0x00000003, 0x402EE220, 0xAE603C02, 0xAE606402, 0x00000003, - 0x002EE288, 0xAE603C02, 0xAE606402, 0x00000002, 0x402EE220, 0xAE604102, - 0x00000002, 0x002EE288, 0xAE604102, 0x00000002, 0x402EE220, 0xAE604702, - 0x00000002, 0x002EE288, 0xAE604702, 0x00000003, 0x402EE220, 0xAE604702, - 0xAE605B02, 0x00000003, 0x002EE288, 0xAE604702, 0xAE605B02, 0x00000002, - 0x402EE220, 0xAE604D02, 0x00000002, 0x002EE288, 0xAE604D02, 0x00000002, - 0x402EE220, 0xAE604E02, 0x00000002, 0x002EE288, 0xAE604E02, 0x00000003, - 0x402EE220, 0xAE604E02, 0xAE603202, 0x00000003, 0x002EE288, 0xAE604E02, - 0xAE603202, 0x00000003, 0x402EE220, 0xAE604E02, 0xAE604702, 0x00000003, - 0x002EE288, 0xAE604E02, 0xAE604702, 0x00000003, 0x402EE220, 0xAE604E02, - 0xAE605B02, 0x00000003, 0x002EE288, 0xAE604E02, - // Block 56, offset 0xe00 - 0xAE605B02, 0x00000002, 0x402EE220, 0xAE605202, 0x00000002, 0x002EE288, - 0xAE605202, 0x00000003, 0x402EE220, 0xAE605202, 0xAE605B02, 0x00000003, - 0x002EE288, 0xAE605202, 0xAE605B02, 0x00000002, 0x402EE220, 0xA0005402, - 0x00000002, 0x002EE288, 0xA0005402, 0x00000003, 0x402EE220, 0xA0005402, - 0xAE603202, 0x00000003, 0x002EE288, 0xA0005402, 0xAE603202, 0x00000002, - 0x402EE220, 0xACA05902, 0x00000002, 0x002EE288, 0xACA05902, 0x00000003, - 0x402EE220, 0xACA05902, 0xAE605B02, 0x00000003, 0x002EE288, 0xACA05902, - 0xAE605B02, 0x00000002, 0x402EE220, 0xAE605B02, 0x00000002, 0x002EE288, - 0xAE605B02, 0x00000003, 0x402EE220, 0xAE605B02, 0xAE603202, 0x00000003, - 0x002EE288, 0xAE605B02, 0xAE603202, 0x00000003, 0x402EE220, 0xAE605B02, - 0xAE603502, 0x00000003, 0x002EE288, 0xAE605B02, - // Block 57, offset 0xe40 - 0xAE603502, 0x00000002, 0x402EE220, 0xAE606402, 0x00000002, 0x002EE288, - 0xAE606402, 0x00000002, 0x402EE220, 0xAE606502, 0x00000002, 0x002EE288, - 0xAE606502, 0x00000002, 0x402EE220, 0xAE606702, 0x00000002, 0x002EE288, - 0xAE606702, 0x00000002, 0x402EE220, 0xAD806802, 0x00000002, 0x002EE288, - 0xAD806802, 0x00000003, 0x402EE220, 0xAD806802, 0xAE603202, 0x00000003, - 0x002EE288, 0xAD806802, 0xAE603202, 0x00000003, 0x402EE220, 0xAD806802, - 0xAE603502, 0x00000003, 0x002EE288, 0xAD806802, 0xAE603502, 0x00000003, - 0x402EE220, 0xAD806802, 0xAE604E02, 0x00000003, 0x002EE288, 0xAD806802, - 0xAE604E02, 0x00000003, 0x402EE220, 0xAD806802, 0xAE606402, 0x00000003, - 0x002EE288, 0xAD806802, 0xAE606402, 0x00000003, 0x402EE220, 0xAD806802, - 0xADC07002, 0x00000003, 0x002EE288, 0xAD806802, - // Block 58, offset 0xe80 - 0xADC07002, 0x00000002, 0x402EE220, 0xADC07002, 0x00000002, 0x002EE288, - 0xADC07002, 0x00000003, 0x402EE220, 0xADC07002, 0xAE603C02, 0x00000003, - 0x002EE288, 0xADC07002, 0xAE603C02, 0x00000003, 0x002EE284, 0xA0013904, - 0x002C9884, 0x00000003, 0x002EE28A, 0xA0013904, 0x002C988A, 0x00000003, - 0x002EE294, 0xA0013914, 0x002C9894, 0x00000002, 0x002EE29D, 0x002DFE9D, - 0x00000002, 0x002EE284, 0x002EE284, 0x00000002, 0x002EE28A, 0x002EE28A, - 0x00000002, 0x402F2C20, 0xAE603202, 0x00000002, 0x002F2C88, 0xAE603202, - 0x00000002, 0x402F2C20, 0xAE605202, 0x00000002, 0x002F2C88, 0xAE605202, - 0x00000004, 0x002F2C9C, 0x0002E49C, 0x002E829C, 0x0002E49C, 0x00000002, - 0x002F2C9D, 0x002BDE9D, 0x00000003, 0x002F2C9D, 0x002F2C9D, 0x002E829D, - 0x00000003, 0x002F2C9D, 0x002F2C9D, 0x0030BE9D, - // Block 59, offset 0xec0 - 0x00000003, 0x002F2C9D, 0x00302C9D, 0x002C989D, 0x00000002, 0x002F5684, - 0x002F2C84, 0x00000002, 0x402F7A20, 0xAE603202, 0x00000002, 0x002F7A88, - 0xAE603202, 0x00000002, 0x402F7A20, 0xAE604102, 0x00000002, 0x002F7A88, - 0xAE604102, 0x00000002, 0x402F7A20, 0xAE605202, 0x00000002, 0x002F7A88, - 0xAE605202, 0x00000002, 0x402F7A20, 0xACA05602, 0x00000002, 0x002F7A88, - 0xACA05602, 0x00000002, 0x002F7A84, 0xA0006104, 0x00000002, 0x002F7A8A, - 0xA0006104, 0x00000002, 0x402F7A20, 0xAE606502, 0x00000002, 0x002F7A88, - 0xAE606502, 0x00000002, 0x402F7A20, 0xAE606702, 0x00000002, 0x002F7A88, - 0xAE606702, 0x00000002, 0x402F7A20, 0xADC07002, 0x00000002, 0x002F7A88, - 0xADC07002, 0x00000003, 0x402F7A20, 0xADC07002, 0xAE605B02, 0x00000003, - 0x002F7A88, 0xADC07002, 0xAE605B02, 0x00000002, - // Block 60, offset 0xf00 - 0x402F7A20, 0xADC07B02, 0x00000002, 0x002F7A88, 0xADC07B02, 0x00000002, - 0x002F7A84, 0xA0013A04, 0x00000002, 0x002F7A8A, 0xA0013A04, 0x00000003, - 0x002F7A9C, 0x002BDE9C, 0x002C629C, 0x00000005, 0x002F7A9C, 0x002BDE9C, - 0x002C629C, 0x0009569C, 0x002FE69C, 0x00000006, 0x002F7A9C, 0x002BDE9C, - 0x002C629C, 0x0009569C, 0x002FE69C, 0x0029D09C, 0x00000002, 0x402FE620, - 0xAE603202, 0x00000002, 0x002FE688, 0xAE603202, 0x00000003, 0x402FE620, - 0xAE603202, 0xAE605202, 0x00000003, 0x002FE688, 0xAE603202, 0xAE605202, - 0x00000002, 0x402FE620, 0xAE603C02, 0x00000002, 0x002FE688, 0xAE603C02, - 0x00000002, 0x402FE620, 0xAE604102, 0x00000002, 0x002FE688, 0xAE604102, - 0x00000003, 0x402FE620, 0xAE604102, 0xAE605202, 0x00000003, 0x002FE688, - 0xAE604102, 0xAE605202, 0x00000002, 0x402FE620, - // Block 61, offset 0xf40 - 0xAE605202, 0x00000002, 0x002FE688, 0xAE605202, 0x00000002, 0x402FE620, - 0xACA05602, 0x00000002, 0x002FE688, 0xACA05602, 0x00000002, 0x002FE684, - 0xA0006104, 0x00000002, 0x002FE68A, 0xA0006104, 0x00000002, 0x402FE620, - 0xADC07002, 0x00000002, 0x002FE688, 0xADC07002, 0x00000003, 0x402FE620, - 0xADC07002, 0xAE605202, 0x00000003, 0x002FE688, 0xADC07002, 0xAE605202, - 0x00000002, 0x402FE620, 0xADC07702, 0x00000002, 0x002FE688, 0xADC07702, - 0x00000002, 0x002FE684, 0xA0013A04, 0x00000002, 0x84E617F3, 0xAE613A04, - 0x00000002, 0x002FE684, 0xA0013A04, 0x00000002, 0x002FE68A, 0xA0013A04, - 0x00000003, 0x002FE684, 0xA0013A04, 0xAE605202, 0x00000002, 0x002FE69D, - 0x002BDE9D, 0x00000003, 0x002FE69D, 0x002EE29D, 0x002FE69D, 0x00000003, - 0x002FE684, 0xA0013904, 0x002FE684, 0x00000003, - // Block 62, offset 0xf80 - 0x002FE68A, 0xA0013904, 0x002FE68A, 0x00000003, 0x002FE684, 0xA0013A04, - 0x00302C84, 0x00000002, 0x40302C20, 0xAE604102, 0x00000002, 0x00302C88, - 0xAE604102, 0x00000002, 0x40302C20, 0xAE604702, 0x00000002, 0x40302C20, - 0xAE605202, 0x00000002, 0x00302C88, 0xAE605202, 0x00000002, 0x40302C20, - 0xACA05602, 0x00000002, 0x00302C88, 0xACA05602, 0x00000002, 0x40302C20, - 0xADC07002, 0x00000002, 0x00302C88, 0xADC07002, 0x00000002, 0x40302C20, - 0xADC07702, 0x00000002, 0x00302C88, 0xADC07702, 0x00000002, 0x40302C20, - 0xADC07802, 0x00000002, 0x00302C88, 0xADC07802, 0x00000002, 0x40302C20, - 0xADC07B02, 0x00000002, 0x00302C88, 0xADC07B02, 0x00000002, 0x00302C84, - 0xA0013A04, 0x00000002, 0x00302C8A, 0xA0013A04, 0x00000002, 0x00302C84, - 0x002C5684, 0x00000003, 0x00302C8A, 0x002C988A, - // Block 63, offset 0xfc0 - 0x002E228A, 0x00000003, 0x00302C84, 0xA0013904, 0x002D6884, 0x00000003, - 0x00302C9D, 0x002D689D, 0x00312A9C, 0x00000002, 0x00302C84, 0x002FE684, - 0x00000002, 0x00302C84, 0x002FE684, 0x00000002, 0x00302C84, 0x00300884, - 0x00000002, 0x00302C84, 0x00312A84, 0x00000002, 0x00302C8A, 0x00312A84, - 0x00000002, 0x40306C20, 0xAE603202, 0x00000002, 0x00306C88, 0xAE603202, - 0x00000002, 0x40306C20, 0xAE603502, 0x00000002, 0x00306C88, 0xAE603502, - 0x00000002, 0x40306C20, 0xAE603702, 0x00000002, 0x00306C88, 0xAE603702, - 0x00000002, 0x40306C20, 0xAE603C02, 0x00000002, 0x00306C88, 0xAE603C02, - 0x00000002, 0x40306C20, 0xAE604102, 0x00000002, 0x00306C88, 0xAE604102, - 0x00000002, 0x40306C20, 0xAE604302, 0x00000002, 0x00306C88, 0xAE604302, - 0x00000002, 0x40306C20, 0xAE604702, 0x00000002, - // Block 64, offset 0x1000 - 0x00306C88, 0xAE604702, 0x00000003, 0x40306C20, 0xAE604702, 0xAE603202, - 0x00000003, 0x00306C88, 0xAE604702, 0xAE603202, 0x00000003, 0x40306C20, - 0xAE604702, 0xAE603502, 0x00000003, 0x00306C88, 0xAE604702, 0xAE603502, - 0x00000003, 0x40306C20, 0xAE604702, 0xAE604102, 0x00000003, 0x00306C88, - 0xAE604702, 0xAE604102, 0x00000003, 0x40306C20, 0xAE604702, 0xAE605B02, - 0x00000003, 0x00306C88, 0xAE604702, 0xAE605B02, 0x00000002, 0x40306C20, - 0xAE604D02, 0x00000002, 0x00306C88, 0xAE604D02, 0x00000002, 0x40306C20, - 0xAE604E02, 0x00000002, 0x00306C88, 0xAE604E02, 0x00000003, 0x40306C20, - 0xAE604E02, 0xAE603202, 0x00000003, 0x00306C88, 0xAE604E02, 0xAE603202, - 0x00000002, 0x40306C20, 0xACA05902, 0x00000002, 0x00306C88, 0xACA05902, - 0x00000002, 0x40306C20, 0xAE605B02, 0x00000002, - // Block 65, offset 0x1040 - 0x00306C88, 0xAE605B02, 0x00000003, 0x40306C20, 0xAE605B02, 0xAE604702, - 0x00000003, 0x00306C88, 0xAE605B02, 0xAE604702, 0x00000002, 0x40306C20, - 0xAE606402, 0x00000002, 0x00306C88, 0xAE606402, 0x00000002, 0x40306C20, - 0xAE606502, 0x00000002, 0x00306C88, 0xAE606502, 0x00000002, 0x40306C20, - 0xAE606702, 0x00000002, 0x00306C88, 0xAE606702, 0x00000002, 0x40306C20, - 0xAD806802, 0x00000002, 0x00306C88, 0xAD806802, 0x00000003, 0x40306C20, - 0xAD806802, 0xAE603202, 0x00000003, 0x00306C88, 0xAD806802, 0xAE603202, - 0x00000003, 0x40306C20, 0xAD806802, 0xAE603502, 0x00000003, 0x00306C88, - 0xAD806802, 0xAE603502, 0x00000003, 0x40306C20, 0xAD806802, 0xAE604E02, - 0x00000003, 0x00306C88, 0xAD806802, 0xAE604E02, 0x00000003, 0x40306C20, - 0xAD806802, 0xAE606402, 0x00000003, 0x00306C88, - // Block 66, offset 0x1080 - 0xAD806802, 0xAE606402, 0x00000003, 0x40306C20, 0xAD806802, 0xADC07002, - 0x00000003, 0x00306C88, 0xAD806802, 0xADC07002, 0x00000002, 0x40306C20, - 0xADC07002, 0x00000002, 0x00306C88, 0xADC07002, 0x00000002, 0x40306C20, - 0xADC07502, 0x00000002, 0x00306C88, 0xADC07502, 0x00000002, 0x40306C20, - 0xADC07802, 0x00000002, 0x00306C88, 0xADC07802, 0x00000002, 0x40306C20, - 0xADC07A02, 0x00000002, 0x00306C88, 0xADC07A02, 0x00000003, 0x00306C9D, - 0x002F2C9D, 0x0002BA9C, 0x00000002, 0x4030BE20, 0xAE604E02, 0x00000002, - 0x0030BE88, 0xAE604E02, 0x00000002, 0x4030BE20, 0xADC07002, 0x00000002, - 0x0030BE88, 0xADC07002, 0x00000003, 0x0030BE9D, 0x0009569C, 0x002E829C, - 0x00000004, 0x0030BE84, 0x002D9A84, 0x002D9A84, 0x002D9A9F, 0x00000004, - 0x0030BE8A, 0x002D9A8A, 0x002D9A8A, 0x002D9A9F, - // Block 67, offset 0x10c0 - 0x00000002, 0x0030BE9D, 0x002FE69D, 0x00000002, 0x0030BE84, 0x00310084, - 0x00000002, 0x0030BE8A, 0x0031008A, 0x00000002, 0x4030E220, 0xAE603202, - 0x00000002, 0x0030E288, 0xAE603202, 0x00000002, 0x4030E220, 0xAE603502, - 0x00000002, 0x0030E288, 0xAE603502, 0x00000002, 0x4030E220, 0xAE603C02, - 0x00000002, 0x0030E288, 0xAE603C02, 0x00000002, 0x4030E220, 0xAE604302, - 0x00000002, 0x4030E220, 0xAE604702, 0x00000002, 0x0030E288, 0xAE604702, - 0x00000002, 0x4030E220, 0xAE605202, 0x00000002, 0x0030E288, 0xAE605202, - 0x00000002, 0x4030E220, 0xADC07002, 0x00000002, 0x0030E288, 0xADC07002, - 0x00000002, 0x0030E29D, 0x002C3A9D, 0x00000002, 0x4030F620, 0xAE604702, - 0x00000002, 0x0030F688, 0xAE604702, 0x00000002, 0x4030F620, 0xAE605202, - 0x00000002, 0x0030F688, 0xAE605202, 0x00000002, - // Block 68, offset 0x1100 - 0x40310020, 0xAE603202, 0x00000002, 0x00310088, 0xAE603202, 0x00000002, - 0x40310020, 0xAE603502, 0x00000002, 0x00310088, 0xAE603502, 0x00000002, - 0x40310020, 0xAE603C02, 0x00000002, 0x00310088, 0xAE603C02, 0x00000002, - 0x40310020, 0xAE604302, 0x00000002, 0x40310020, 0xAE604702, 0x00000002, - 0x00310088, 0xAE604702, 0x00000002, 0x40310020, 0xAE604E02, 0x00000002, - 0x00310088, 0xAE604E02, 0x00000002, 0x40310020, 0xAE605202, 0x00000002, - 0x00310088, 0xAE605202, 0x00000002, 0x40310020, 0xAE605B02, 0x00000002, - 0x00310088, 0xAE605B02, 0x00000002, 0x40310020, 0xAE606402, 0x00000002, - 0x00310088, 0xAE606402, 0x00000002, 0x40310020, 0xADC07002, 0x00000002, - 0x00310088, 0xADC07002, 0x00000002, 0x40312A20, 0xAE603202, 0x00000002, - 0x00312A88, 0xAE603202, 0x00000002, 0x40312A20, - // Block 69, offset 0x1140 - 0xAE603C02, 0x00000002, 0x00312A88, 0xAE603C02, 0x00000002, 0x40312A20, - 0xAE604102, 0x00000002, 0x00312A88, 0xAE604102, 0x00000002, 0x40312A20, - 0xAE605202, 0x00000002, 0x00312A88, 0xAE605202, 0x00000002, 0x40312A20, - 0xADC07002, 0x00000002, 0x00312A88, 0xADC07002, 0x00000002, 0x40312A20, - 0xADC07B02, 0x00000002, 0x00312A88, 0xADC07B02, 0x00000002, 0x00312A84, - 0x0030E284, 0x00000002, 0x40316420, 0xAE604102, 0x00000002, 0x00316488, - 0xAE604102, 0x00000002, 0x40325220, 0xAE602202, 0x00000002, 0x00325288, - 0xAE602202, 0x00000003, 0x40325220, 0xAE602202, 0xAE603202, 0x00000003, - 0x00325288, 0xAE602202, 0xAE603202, 0x00000004, 0x40325220, 0xAE602202, - 0xAE603202, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602202, 0xAE603202, - 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, - // Block 70, offset 0x1180 - 0xAE603502, 0x00000003, 0x00325288, 0xAE602202, 0xAE603502, 0x00000004, - 0x40325220, 0xAE602202, 0xAE603502, 0xAF007F02, 0x00000004, 0x00325288, - 0xAE602202, 0xAE603502, 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, - 0xAE604502, 0x00000003, 0x00325288, 0xAE602202, 0xAE604502, 0x00000004, - 0x40325220, 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000004, 0x00325288, - 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, - 0xAF007F02, 0x00000003, 0x00325288, 0xAE602202, 0xAF007F02, 0x00000002, - 0x40325220, 0xAE602A02, 0x00000002, 0x00325288, 0xAE602A02, 0x00000003, - 0x40325220, 0xAE602A02, 0xAE603202, 0x00000003, 0x00325288, 0xAE602A02, - 0xAE603202, 0x00000004, 0x40325220, 0xAE602A02, 0xAE603202, 0xAF007F02, - 0x00000004, 0x00325288, 0xAE602A02, 0xAE603202, - // Block 71, offset 0x11c0 - 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAE603502, 0x00000003, - 0x00325288, 0xAE602A02, 0xAE603502, 0x00000004, 0x40325220, 0xAE602A02, - 0xAE603502, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602A02, 0xAE603502, - 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAE604502, 0x00000003, - 0x00325288, 0xAE602A02, 0xAE604502, 0x00000004, 0x40325220, 0xAE602A02, - 0xAE604502, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602A02, 0xAE604502, - 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAF007F02, 0x00000003, - 0x00325288, 0xAE602A02, 0xAF007F02, 0x00000002, 0x40325220, 0xAE603202, - 0x00000002, 0x00325288, 0xAE603202, 0x00000003, 0x40325220, 0xAE603202, - 0xAF007F02, 0x00000002, 0x40325220, 0xAE603502, 0x00000002, 0x00325288, - 0xAE603502, 0x00000003, 0x40325220, 0xAE603502, - // Block 72, offset 0x1200 - 0xAF007F02, 0x00000002, 0x40325220, 0xAE603702, 0x00000002, 0x00325288, - 0xAE603702, 0x00000002, 0x40325220, 0xAE604502, 0x00000003, 0x40325220, - 0xAE604502, 0xAF007F02, 0x00000002, 0x40325220, 0xAE605B02, 0x00000002, - 0x00325288, 0xAE605B02, 0x00000002, 0x40325220, 0xAF007F02, 0x00000002, - 0x00325288, 0xAF007F02, 0x00000002, 0x40325C20, 0xAE602202, 0x00000002, - 0x00325C88, 0xAE602202, 0x00000003, 0x40325C20, 0xAE602202, 0xAE603202, - 0x00000003, 0x00325C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40325C20, - 0xAE602202, 0xAE603502, 0x00000003, 0x00325C88, 0xAE602202, 0xAE603502, - 0x00000002, 0x40325C20, 0xAE602A02, 0x00000002, 0x00325C88, 0xAE602A02, - 0x00000003, 0x40325C20, 0xAE602A02, 0xAE603202, 0x00000003, 0x00325C88, - 0xAE602A02, 0xAE603202, 0x00000003, 0x40325C20, - // Block 73, offset 0x1240 - 0xAE602A02, 0xAE603502, 0x00000003, 0x00325C88, 0xAE602A02, 0xAE603502, - 0x00000002, 0x40325C20, 0xAE603202, 0x00000002, 0x00325C88, 0xAE603202, - 0x00000002, 0x40325C20, 0xAE603502, 0x00000002, 0x00325C88, 0xAE603502, - 0x00000002, 0x40326820, 0xAE602202, 0x00000002, 0x00326888, 0xAE602202, - 0x00000003, 0x40326820, 0xAE602202, 0xAE603202, 0x00000003, 0x00326888, - 0xAE602202, 0xAE603202, 0x00000004, 0x40326820, 0xAE602202, 0xAE603202, - 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, 0xAE603202, 0xAF007F02, - 0x00000003, 0x40326820, 0xAE602202, 0xAE603502, 0x00000003, 0x00326888, - 0xAE602202, 0xAE603502, 0x00000004, 0x40326820, 0xAE602202, 0xAE603502, - 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, 0xAE603502, 0xAF007F02, - 0x00000003, 0x40326820, 0xAE602202, 0xAE604502, - // Block 74, offset 0x1280 - 0x00000003, 0x00326888, 0xAE602202, 0xAE604502, 0x00000004, 0x40326820, - 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, - 0xAE604502, 0xAF007F02, 0x00000003, 0x40326820, 0xAE602202, 0xAF007F02, - 0x00000003, 0x00326888, 0xAE602202, 0xAF007F02, 0x00000002, 0x40326820, - 0xAE602A02, 0x00000002, 0x00326888, 0xAE602A02, 0x00000003, 0x40326820, - 0xAE602A02, 0xAE603202, 0x00000003, 0x00326888, 0xAE602A02, 0xAE603202, - 0x00000004, 0x40326820, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000004, - 0x00326888, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000003, 0x40326820, - 0xAE602A02, 0xAE603502, 0x00000003, 0x00326888, 0xAE602A02, 0xAE603502, - 0x00000004, 0x40326820, 0xAE602A02, 0xAE603502, 0xAF007F02, 0x00000004, - 0x00326888, 0xAE602A02, 0xAE603502, 0xAF007F02, - // Block 75, offset 0x12c0 - 0x00000003, 0x40326820, 0xAE602A02, 0xAE604502, 0x00000003, 0x00326888, - 0xAE602A02, 0xAE604502, 0x00000004, 0x40326820, 0xAE602A02, 0xAE604502, - 0xAF007F02, 0x00000004, 0x00326888, 0xAE602A02, 0xAE604502, 0xAF007F02, - 0x00000003, 0x40326820, 0xAE602A02, 0xAF007F02, 0x00000003, 0x00326888, - 0xAE602A02, 0xAF007F02, 0x00000002, 0x40326820, 0xAE603202, 0x00000002, - 0x00326888, 0xAE603202, 0x00000003, 0x40326820, 0xAE603202, 0xAF007F02, - 0x00000002, 0x40326820, 0xAE603502, 0x00000002, 0x00326888, 0xAE603502, - 0x00000003, 0x40326820, 0xAE603502, 0xAF007F02, 0x00000002, 0x40326820, - 0xAE604502, 0x00000003, 0x40326820, 0xAE604502, 0xAF007F02, 0x00000002, - 0x40326820, 0xAF007F02, 0x00000002, 0x00326888, 0xAF007F02, 0x00000002, - 0x40326C20, 0xAE602202, 0x00000002, 0x00326C88, - // Block 76, offset 0x1300 - 0xAE602202, 0x00000003, 0x40326C20, 0xAE602202, 0xAE603202, 0x00000003, - 0x00326C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40326C20, 0xAE602202, - 0xAE603502, 0x00000003, 0x00326C88, 0xAE602202, 0xAE603502, 0x00000003, - 0x40326C20, 0xAE602202, 0xAE604502, 0x00000003, 0x00326C88, 0xAE602202, - 0xAE604502, 0x00000002, 0x40326C20, 0xAE602A02, 0x00000002, 0x00326C88, - 0xAE602A02, 0x00000003, 0x40326C20, 0xAE602A02, 0xAE603202, 0x00000003, - 0x00326C88, 0xAE602A02, 0xAE603202, 0x00000003, 0x40326C20, 0xAE602A02, - 0xAE603502, 0x00000003, 0x00326C88, 0xAE602A02, 0xAE603502, 0x00000003, - 0x40326C20, 0xAE602A02, 0xAE604502, 0x00000003, 0x00326C88, 0xAE602A02, - 0xAE604502, 0x00000002, 0x40326C20, 0xAE603202, 0x00000002, 0x00326C88, - 0xAE603202, 0x00000002, 0x40326C20, 0xAE603502, - // Block 77, offset 0x1340 - 0x00000002, 0x00326C88, 0xAE603502, 0x00000002, 0x40326C20, 0xAE603702, - 0x00000002, 0x00326C88, 0xAE603702, 0x00000002, 0x40326C20, 0xAE604502, - 0x00000002, 0x40326C20, 0xAE604702, 0x00000002, 0x00326C88, 0xAE604702, - 0x00000003, 0x40326C20, 0xAE604702, 0xAE603202, 0x00000003, 0x40326C20, - 0xAE604702, 0xAE603502, 0x00000003, 0x40326C20, 0xAE604702, 0xAE604502, - 0x00000002, 0x40326C20, 0xAE605B02, 0x00000002, 0x00326C88, 0xAE605B02, - 0x00000003, 0x00327084, 0x00325284, 0x00326C84, 0x00000003, 0x0032708A, - 0x00325284, 0x00326C84, 0x00000002, 0x40327C20, 0xAE602202, 0x00000002, - 0x00327C88, 0xAE602202, 0x00000003, 0x40327C20, 0xAE602202, 0xAE603202, - 0x00000003, 0x00327C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40327C20, - 0xAE602202, 0xAE603502, 0x00000003, 0x00327C88, - // Block 78, offset 0x1380 - 0xAE602202, 0xAE603502, 0x00000002, 0x40327C20, 0xAE602A02, 0x00000002, - 0x00327C88, 0xAE602A02, 0x00000003, 0x40327C20, 0xAE602A02, 0xAE603202, - 0x00000003, 0x00327C88, 0xAE602A02, 0xAE603202, 0x00000003, 0x40327C20, - 0xAE602A02, 0xAE603502, 0x00000003, 0x00327C88, 0xAE602A02, 0xAE603502, - 0x00000002, 0x40327C20, 0xAE603202, 0x00000002, 0x00327C88, 0xAE603202, - 0x00000002, 0x40327C20, 0xAE603502, 0x00000002, 0x00327C88, 0xAE603502, - 0x00000002, 0x40328820, 0xAE602202, 0x00000002, 0x40328820, 0xAE602A02, - 0x00000002, 0x00328888, 0xAE602A02, 0x00000002, 0x40329820, 0xAE602202, - 0x00000003, 0x40329820, 0xAE602202, 0xAE603202, 0x00000003, 0x40329820, - 0xAE602202, 0xAE603502, 0x00000003, 0x40329820, 0xAE602202, 0xAE604502, - 0x00000002, 0x40329820, 0xAE602A02, 0x00000002, - // Block 79, offset 0x13c0 - 0x00329888, 0xAE602A02, 0x00000003, 0x40329820, 0xAE602A02, 0xAE603202, - 0x00000003, 0x00329888, 0xAE602A02, 0xAE603202, 0x00000003, 0x40329820, - 0xAE602A02, 0xAE603502, 0x00000003, 0x00329888, 0xAE602A02, 0xAE603502, - 0x00000003, 0x40329820, 0xAE602A02, 0xAE604502, 0x00000003, 0x00329888, - 0xAE602A02, 0xAE604502, 0x00000002, 0x40329820, 0xAE603202, 0x00000002, - 0x00329888, 0xAE603202, 0x00000002, 0x40329820, 0xAE603502, 0x00000002, - 0x00329888, 0xAE603502, 0x00000002, 0x40329820, 0xAE603702, 0x00000002, - 0x00329888, 0xAE603702, 0x00000002, 0x40329820, 0xAE604502, 0x00000002, - 0x40329820, 0xAE604702, 0x00000002, 0x00329888, 0xAE604702, 0x00000003, - 0x40329820, 0xAE604702, 0xAE603202, 0x00000003, 0x40329820, 0xAE604702, - 0xAE603502, 0x00000003, 0x40329820, 0xAE604702, - // Block 80, offset 0x1400 - 0xAE604502, 0x00000002, 0x40329820, 0xAE605B02, 0x00000002, 0x00329888, - 0xAE605B02, 0x00000002, 0x4032A220, 0xAE602202, 0x00000002, 0x0032A288, - 0xAE602202, 0x00000003, 0x4032A220, 0xAE602202, 0xAE603202, 0x00000003, - 0x0032A288, 0xAE602202, 0xAE603202, 0x00000004, 0x4032A220, 0xAE602202, - 0xAE603202, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602202, 0xAE603202, - 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, 0xAE603502, 0x00000003, - 0x0032A288, 0xAE602202, 0xAE603502, 0x00000004, 0x4032A220, 0xAE602202, - 0xAE603502, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602202, 0xAE603502, - 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, 0xAE604502, 0x00000003, - 0x0032A288, 0xAE602202, 0xAE604502, 0x00000004, 0x4032A220, 0xAE602202, - 0xAE604502, 0xAF007F02, 0x00000004, 0x0032A288, - // Block 81, offset 0x1440 - 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, - 0xAF007F02, 0x00000003, 0x0032A288, 0xAE602202, 0xAF007F02, 0x00000002, - 0x4032A220, 0xAE602A02, 0x00000002, 0x0032A288, 0xAE602A02, 0x00000003, - 0x4032A220, 0xAE602A02, 0xAE603202, 0x00000003, 0x0032A288, 0xAE602A02, - 0xAE603202, 0x00000004, 0x4032A220, 0xAE602A02, 0xAE603202, 0xAF007F02, - 0x00000004, 0x0032A288, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000003, - 0x4032A220, 0xAE602A02, 0xAE603502, 0x00000003, 0x0032A288, 0xAE602A02, - 0xAE603502, 0x00000004, 0x4032A220, 0xAE602A02, 0xAE603502, 0xAF007F02, - 0x00000004, 0x0032A288, 0xAE602A02, 0xAE603502, 0xAF007F02, 0x00000003, - 0x4032A220, 0xAE602A02, 0xAE604502, 0x00000003, 0x0032A288, 0xAE602A02, - 0xAE604502, 0x00000004, 0x4032A220, 0xAE602A02, - // Block 82, offset 0x1480 - 0xAE604502, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602A02, 0xAE604502, - 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602A02, 0xAF007F02, 0x00000003, - 0x0032A288, 0xAE602A02, 0xAF007F02, 0x00000002, 0x4032A220, 0xAE603202, - 0x00000002, 0x0032A288, 0xAE603202, 0x00000003, 0x4032A220, 0xAE603202, - 0xAF007F02, 0x00000002, 0x4032A220, 0xAE603502, 0x00000002, 0x0032A288, - 0xAE603502, 0x00000003, 0x4032A220, 0xAE603502, 0xAF007F02, 0x00000002, - 0x4032A220, 0xAE604502, 0x00000003, 0x4032A220, 0xAE604502, 0xAF007F02, - 0x00000002, 0x4032A220, 0xAF007F02, 0x00000002, 0x0032A288, 0xAF007F02, - 0x00000003, 0x0032C084, 0x0032AA84, 0x0032BE84, 0x00000002, 0x00336284, - 0xA0013A04, 0x00000002, 0x0033628A, 0xA0013A04, 0x00000002, 0x4033B220, - 0xAE603502, 0x00000002, 0x0033B288, 0xAE603502, - // Block 83, offset 0x14c0 - 0x00000002, 0x4033B220, 0xAE604702, 0x00000002, 0x0033B288, 0xAE604702, - 0x00000002, 0x4033CA20, 0xAE603702, 0x00000002, 0x0033CA88, 0xAE603702, - 0x00000002, 0x40341420, 0xAE603502, 0x00000002, 0x00341488, 0xAE603502, - 0x00000002, 0x40341420, 0xAE605B02, 0x00000002, 0x00341488, 0xAE605B02, - 0x00000002, 0x84E61A9D, 0x84E61AA6, 0x00000002, 0x40357220, 0xAE605B02, - 0x00000002, 0x00357288, 0xAE605B02, 0x00000002, 0x40389020, 0xA1108C02, - 0x00000002, 0x40389020, 0xA1208D02, 0x00000002, 0x40389020, 0xA1509202, - 0x00000002, 0x40389220, 0xA1509202, 0x00000002, 0x40389220, 0xA1709502, - 0x00000002, 0x40389420, 0xA1509202, 0x00000002, 0x40389620, 0xA1509202, - 0x00000002, 0x40389820, 0xA1509202, 0x00000002, 0x40389A20, 0xA1308E02, - 0x00000002, 0x40389A20, 0xA1509202, 0x00000002, - // Block 84, offset 0x1500 - 0x00389A84, 0x00389A84, 0x00000002, 0x00389A84, 0x0038A284, 0x00000002, - 0x40389C20, 0xA1509202, 0x00000002, 0x4038A020, 0xA1509202, 0x00000002, - 0x4038A220, 0xA0E08902, 0x00000002, 0x4038A220, 0xA1509202, 0x00000002, - 0x0038A284, 0x0038A284, 0x00000003, 0x0038A284, 0x0038A284, 0xA1108C02, - 0x00000002, 0x4038A420, 0xA1509202, 0x00000002, 0x0038A499, 0xA1509202, - 0x00000002, 0x4038A420, 0xA1709502, 0x00000002, 0x4038A620, 0xA1509202, - 0x00000002, 0x4038A820, 0xA1509202, 0x00000002, 0x4038AA20, 0xA1509202, - 0x00000002, 0x4038AC20, 0xA1509202, 0x00000002, 0x4038B020, 0xA1509202, - 0x00000002, 0x0038B099, 0xA1509202, 0x00000002, 0x4038B020, 0xA1709502, - 0x00000002, 0x4038B220, 0xA1509202, 0x00000002, 0x4038B420, 0xA1509202, - 0x00000002, 0x4038B620, 0xA1509202, 0x00000002, - // Block 85, offset 0x1540 - 0x4038B820, 0xA1909002, 0x00000002, 0x4038B820, 0xA1809102, 0x00000002, - 0x4038B820, 0xA1509202, 0x00000003, 0x4038B820, 0xA1509202, 0xA1909002, - 0x00000003, 0x4038B820, 0xA1509202, 0xA1809102, 0x00000002, 0x4038BA20, - 0xA1509202, 0x00000002, 0x00391C84, 0xA0013A04, 0x00000002, 0x00393099, - 0x00393899, 0x00000002, 0x0039309A, 0x0039389A, 0x00000002, 0x00393097, - 0x00396497, 0x00000002, 0x0039309A, 0x0039649A, 0x00000002, 0x00393097, - 0x00397297, 0x00000002, 0x0039309A, 0x0039729A, 0x00000002, 0x00393097, - 0x00397497, 0x00000002, 0x00393099, 0x0039A499, 0x00000002, 0x00393099, - 0x0039A699, 0x00000002, 0x00393097, 0x003A4E97, 0x00000002, 0x00393098, - 0x003A4E98, 0x00000002, 0x00393099, 0x003A4E99, 0x00000002, 0x0039309A, - 0x003A4E9A, 0x00000002, 0x00393099, 0x003A5699, - // Block 86, offset 0x1580 - 0x00000002, 0x00393097, 0x003A6897, 0x00000002, 0x00393098, 0x003A6898, - 0x00000002, 0x00393099, 0x003A7299, 0x00000002, 0x0039309A, 0x003A729A, - 0x00000002, 0x00393099, 0x003A7499, 0x00000002, 0x0039309A, 0x003A749A, - 0x00000002, 0x00393099, 0x003A7A99, 0x00000002, 0x0039309A, 0x003A7A9A, - 0x00000002, 0x00393099, 0x003A7C99, 0x00000002, 0x0039309A, 0x003A7C9A, - 0x00000002, 0x00393099, 0x003A7E99, 0x00000002, 0x0039309A, 0x003A7E9A, - 0x00000002, 0x00393097, 0x003A8E97, 0x00000002, 0x00393099, 0x003A8E99, - 0x00000002, 0x00393099, 0x003A8E99, 0x00000002, 0x0039309A, 0x003A8E9A, - 0x00000002, 0x0039309A, 0x003A8E9A, 0x00000002, 0x00393099, 0x003A9099, - 0x00000002, 0x0039309A, 0x003A909A, 0x00000002, 0x00393097, 0x003A9897, - 0x00000002, 0x00393099, 0x003A9899, 0x00000002, - // Block 87, offset 0x15c0 - 0x0039309A, 0x003A989A, 0x00000004, 0x0039389A, 0x003A1A9A, 0x00393C9A, - 0x0039A49A, 0x00000004, 0x0039389A, 0x003A409A, 0x003A409A, 0x003A689A, - 0x00000003, 0x00393C99, 0x00397299, 0x003A9099, 0x00000003, 0x00393C99, - 0x00397499, 0x003A9099, 0x00000003, 0x00395697, 0x00396497, 0x003A4E97, - 0x00000003, 0x00395699, 0x00396499, 0x003A8E99, 0x00000003, 0x00395699, - 0x00396499, 0x003A9099, 0x00000003, 0x00395697, 0x00397297, 0x00396497, - 0x00000003, 0x00395699, 0x00397299, 0x00396499, 0x00000003, 0x00395697, - 0x00397297, 0x003A4E97, 0x00000003, 0x00395697, 0x00397497, 0x003A4E97, - 0x00000003, 0x00395699, 0x00397499, 0x003A8E99, 0x00000003, 0x00395699, - 0x00397499, 0x003A9099, 0x00000003, 0x00395697, 0x003A4E97, 0x00396497, - 0x00000003, 0x00395697, 0x003A4E97, 0x00397297, - // Block 88, offset 0x1600 - 0x00000003, 0x00395697, 0x003A4E97, 0x00397497, 0x00000003, 0x00395699, - 0x003A4E99, 0x003A8E99, 0x00000003, 0x00395699, 0x003A4E99, 0x003A9099, - 0x00000003, 0x00396499, 0x00397299, 0x003A8E99, 0x00000003, 0x00396499, - 0x00397299, 0x003A9099, 0x00000008, 0x0039649A, 0x003A409A, 0x0002129A, - 0x0039649A, 0x003A409A, 0x0039389A, 0x003A409A, 0x003A689A, 0x00000003, - 0x00396497, 0x003A4E97, 0x00397297, 0x00000003, 0x00396499, 0x003A4E99, - 0x00397299, 0x00000003, 0x00396499, 0x003A4E99, 0x003A8E99, 0x00000003, - 0x00396499, 0x003A4E99, 0x003A9099, 0x00000003, 0x00397299, 0x00396499, - 0x003A9099, 0x00000003, 0x00397299, 0x003A4E99, 0x003A8E99, 0x00000003, - 0x00397299, 0x003A4E99, 0x003A9099, 0x00000004, 0x0039A49A, 0x0039C69A, - 0x003A749A, 0x003A409A, 0x00000003, 0x0039C697, - // Block 89, offset 0x1640 - 0x00396497, 0x00397297, 0x00000003, 0x0039C699, 0x00396499, 0x003A8E99, - 0x00000003, 0x0039C697, 0x00397297, 0x00396497, 0x00000003, 0x0039C699, - 0x00397499, 0x003A8E99, 0x00000003, 0x0039C699, 0x00397499, 0x003A9099, - 0x00000003, 0x0039C697, 0x003A4E97, 0x00396497, 0x00000003, 0x0039C697, - 0x003A4E97, 0x00397297, 0x00000003, 0x0039C699, 0x003A4E99, 0x00397299, - 0x00000003, 0x0039C697, 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039C699, - 0x003A4E99, 0x003A4E99, 0x00000003, 0x0039C899, 0x00396499, 0x003A9099, - 0x00000003, 0x0039C897, 0x00397297, 0x003A4E97, 0x00000003, 0x0039C899, - 0x00397299, 0x003A4E99, 0x00000003, 0x0039C899, 0x00397299, 0x003A9099, - 0x00000003, 0x0039C897, 0x003A4E97, 0x00397497, 0x00000003, 0x0039C899, - 0x003A4E99, 0x00397499, 0x00000003, 0x0039C897, - // Block 90, offset 0x1680 - 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039C899, 0x003A4E99, 0x003A4E99, - 0x00000003, 0x0039DC97, 0x00397297, 0x00397297, 0x00000003, 0x0039DC99, - 0x00397299, 0x00397299, 0x00000003, 0x0039DC99, 0x00397299, 0x003A9099, - 0x00000004, 0x0039DC9A, 0x003A409A, 0x0039EE9A, 0x003A4E9A, 0x00000003, - 0x0039DC9A, 0x003A409A, 0x003A8E9A, 0x00000012, 0x0039DC9A, 0x003A409A, - 0x003A8E9A, 0x0002129A, 0x0039389A, 0x003A409A, 0x003A409A, 0x003A689A, - 0x0002129A, 0x0039EE9A, 0x003A409A, 0x003A909A, 0x003A689A, 0x0002129A, - 0x003A749A, 0x0039C69A, 0x003A409A, 0x003A4E9A, 0x00000003, 0x0039DC9A, - 0x003A409A, 0x003AAA9A, 0x00000003, 0x0039DC97, 0x003A4E97, 0x003A4E97, - 0x00000003, 0x0039DC99, 0x003A4E99, 0x003A4E99, 0x00000003, 0x0039DE99, - 0x00397299, 0x003A8E99, 0x00000003, 0x0039DE99, - // Block 91, offset 0x16c0 - 0x00397299, 0x003A9099, 0x00000003, 0x0039DE97, 0x00397497, 0x003A4E97, - 0x00000003, 0x0039DE99, 0x00397499, 0x003A4E99, 0x00000003, 0x0039E697, - 0x003A4E97, 0x00397297, 0x00000003, 0x0039E699, 0x003A4E99, 0x00397299, - 0x00000003, 0x0039E697, 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039E699, - 0x003A4E99, 0x003A9099, 0x00000003, 0x0039EE97, 0x00396497, 0x003A4E97, - 0x00000003, 0x0039EE99, 0x00396499, 0x003A4E99, 0x00000004, 0x0039EE9A, - 0x003A409A, 0x003A909A, 0x003A689A, 0x00000003, 0x0039EE97, 0x003A4E97, - 0x003A4E97, 0x00000003, 0x0039EE99, 0x003A4E99, 0x003A4E99, 0x00000003, - 0x0039EE99, 0x003A4E99, 0x003A8E99, 0x00000003, 0x0039EE99, 0x003A4E99, - 0x003A9099, 0x00000003, 0x0039F099, 0x003A4E99, 0x003A4E99, 0x00000003, - 0x0039F099, 0x003A4E99, 0x003A8E99, 0x00000003, - // Block 92, offset 0x1700 - 0x0039F099, 0x003A4E99, 0x003A9099, 0x00000003, 0x0039FC97, 0x00397497, - 0x003A4E97, 0x00000003, 0x0039FC99, 0x00397499, 0x003A4E99, 0x00000003, - 0x0039FC99, 0x003A4E99, 0x003A9099, 0x00000003, 0x003A129A, 0x003A409A, - 0x003AAA9A, 0x00000003, 0x003A1297, 0x003A4E97, 0x00397297, 0x00000003, - 0x003A1299, 0x003A4E99, 0x00397299, 0x00000003, 0x003A1299, 0x003A4E99, - 0x003A4E99, 0x00000003, 0x003A1299, 0x003A4E99, 0x003A9099, 0x00000003, - 0x003A1A97, 0x003A4E97, 0x003A4E97, 0x00000003, 0x003A1A99, 0x003A4E99, - 0x003A4E99, 0x00000003, 0x003A1A99, 0x003A4E99, 0x003A9099, 0x00000002, - 0x003A4099, 0x00391E99, 0x00000002, 0x003A409A, 0x00391E9A, 0x00000002, - 0x003A4099, 0x00392099, 0x00000002, 0x003A409A, 0x0039209A, 0x00000002, - 0x003A4099, 0x00392899, 0x00000002, 0x003A409A, - // Block 93, offset 0x1740 - 0x0039289A, 0x00000003, 0x003A4097, 0x00396497, 0x00396497, 0x00000003, - 0x003A4099, 0x00396499, 0x00396499, 0x00000003, 0x003A4097, 0x00396497, - 0x003A4E97, 0x00000003, 0x003A4099, 0x00396499, 0x003A4E99, 0x00000003, - 0x003A4099, 0x00396499, 0x003A9099, 0x00000003, 0x003A4097, 0x00397297, - 0x003A4E97, 0x00000003, 0x003A4099, 0x00397299, 0x003A4E99, 0x00000003, - 0x003A4099, 0x00397299, 0x003A8E99, 0x00000003, 0x003A4099, 0x00397299, - 0x003A9099, 0x00000003, 0x003A4097, 0x00397497, 0x003A4E97, 0x00000003, - 0x003A4099, 0x00397499, 0x003A4E99, 0x00000003, 0x003A4097, 0x003A4E97, - 0x00397297, 0x00000003, 0x003A4099, 0x003A4E99, 0x00397299, 0x00000003, - 0x003A4099, 0x003A4E99, 0x003A9099, 0x00000002, 0x003A4E84, 0xA0013A04, - 0x00000003, 0x003A4E97, 0x00396497, 0x00397297, - // Block 94, offset 0x1780 - 0x00000003, 0x003A4E97, 0x00396497, 0x00397497, 0x00000003, 0x003A4E97, - 0x00396497, 0x003A4E97, 0x00000003, 0x003A4E99, 0x00396499, 0x003A9099, - 0x00000003, 0x003A4E97, 0x00397297, 0x00396497, 0x00000003, 0x003A4E97, - 0x00397297, 0x003A4E97, 0x00000004, 0x003A4E9A, 0x0039729A, 0x003A4E9A, - 0x0039889A, 0x00000003, 0x003A4E99, 0x00397299, 0x003A9099, 0x00000003, - 0x003A4E97, 0x00397497, 0x00396497, 0x00000003, 0x003A4E97, 0x00397497, - 0x003A4E97, 0x00000003, 0x003A4E99, 0x00397499, 0x003A9099, 0x00000003, - 0x003A4E99, 0x003A4E99, 0x003A9099, 0x00000003, 0x003A5697, 0x00396497, - 0x00397297, 0x00000003, 0x003A5699, 0x00396499, 0x00397299, 0x00000003, - 0x003A5697, 0x00396497, 0x003A4E97, 0x00000003, 0x003A5699, 0x00396499, - 0x003A4E99, 0x00000003, 0x003A5699, 0x00396499, - // Block 95, offset 0x17c0 - 0x003A8E99, 0x00000003, 0x003A5699, 0x00396499, 0x003A9099, 0x00000003, - 0x003A5697, 0x00397297, 0x003A4E97, 0x00000003, 0x003A5699, 0x00397299, - 0x003A8E99, 0x00000003, 0x003A5699, 0x00397299, 0x003A9099, 0x00000003, - 0x003A5699, 0x003A4E99, 0x003A8E99, 0x00000003, 0x003A5699, 0x003A4E99, - 0x003A9099, 0x00000003, 0x003A6897, 0x003A4E97, 0x00396497, 0x00000003, - 0x003A6897, 0x003A4E97, 0x003A4E97, 0x00000002, 0x403A6C20, 0xAE60BE02, - 0x00000002, 0x403A7220, 0xAE60BE02, 0x00000004, 0x003A749A, 0x0039C69A, - 0x003A409A, 0x003A4E9A, 0x00000003, 0x003A9099, 0x00396499, 0x003A9099, - 0x00000003, 0x003A9099, 0x00397299, 0x003A9099, 0x00000003, 0x003A9097, - 0x003A4E97, 0x003A4E97, 0x00000003, 0x003A9099, 0x003A4E99, 0x003A4E99, - 0x00000003, 0x003A9099, 0x003A4E99, 0x003A9099, - // Block 96, offset 0x1800 - 0x00000002, 0x403AAA20, 0xAE60BE02, 0x00000002, 0x003AB284, 0xA0013C04, - 0x00000002, 0x003AB484, 0xA0013A04, 0x00000002, 0x003AB484, 0xA0013C04, - 0x00000002, 0x003AB884, 0xA0013C04, 0x00000002, 0x003AC484, 0xA0013A04, - 0x00000002, 0x003AD884, 0xA0013A04, 0x00000002, 0x003B9484, 0xA0013904, - 0x00000002, 0x003B9684, 0xA0013904, 0x00000002, 0x003B9A84, 0xA0013904, - 0x00000002, 0x403FEC20, 0xA070F102, 0x00000002, 0x403FEE20, 0xA070F102, - 0x00000002, 0x403FF020, 0xA070F102, 0x00000002, 0x403FFC20, 0xA070F102, - 0x00000002, 0x40400A20, 0xA070F102, 0x00000002, 0x40400E20, 0xA070F102, - 0x00000002, 0x40401A20, 0xA070F102, 0x00000002, 0x40401E20, 0xA070F102, - 0x00000002, 0x40402820, 0xA070F102, 0x00000002, 0x40402C20, 0xA070F102, - 0x00000002, 0x40403020, 0xA070F102, 0x00000002, - // Block 97, offset 0x1840 - 0x4040B020, 0xA070F102, 0x00000002, 0x4040B220, 0xA070F102, 0x00000002, - 0x0040B684, 0x0040F884, 0x00000002, 0x4040CA20, 0xA070F102, 0x00000002, - 0x40411620, 0xA070F102, 0x00000002, 0x40411E20, 0xA070F102, 0x00000002, - 0x40412020, 0xA070F102, 0x00000002, 0x40412A20, 0xA070F102, 0x00000002, - 0x40414620, 0xA070F102, 0x00000002, 0x40415420, 0xA070F102, 0x00000002, - 0x40422A20, 0xA070F102, 0x00000002, 0x40422C20, 0xA070F102, 0x00000002, - 0x00442284, 0x00449084, 0x00000002, 0x00443E84, 0x00449084, 0x00000002, - 0x00444884, 0x00449084, 0x00000002, 0x00445884, 0x00449084, 0x00000002, - 0x00445884, 0x00449084, 0x00000002, 0x00445A84, 0x00449084, 0x00000002, - 0x00446684, 0x00449084, 0x00000002, 0x4046AA20, 0xA070F102, 0x00000002, - 0x4046AC20, 0xA070F102, 0x00000002, 0x4046BE20, - // Block 98, offset 0x1880 - 0xA070F102, 0x00000002, 0x40491020, 0x40498420, 0x00000002, 0x40491020, - 0x40498620, 0x00000002, 0x40491020, 0x40498820, 0x00000002, 0x40491020, - 0x40498A20, 0x00000002, 0x40491020, 0x40498C20, 0x00000002, 0x40491220, - 0x40498420, 0x00000002, 0x40491220, 0x40498620, 0x00000002, 0x40491220, - 0x40498820, 0x00000002, 0x40491220, 0x40498A20, 0x00000002, 0x40491220, - 0x40498C20, 0x00000002, 0x40491420, 0x40498420, 0x00000002, 0x40491420, - 0x40498620, 0x00000002, 0x40491420, 0x40498820, 0x00000002, 0x40491420, - 0x40498A20, 0x00000002, 0x40491420, 0x40498C20, 0x00000002, 0x40491620, - 0x40498420, 0x00000002, 0x40491620, 0x40498620, 0x00000002, 0x40491620, - 0x40498820, 0x00000002, 0x40491620, 0x40498A20, 0x00000002, 0x40491620, - 0x40498C20, 0x00000002, 0x40491820, 0x40498420, - // Block 99, offset 0x18c0 - 0x00000002, 0x40491820, 0x40498620, 0x00000002, 0x40491820, 0x40498820, - 0x00000002, 0x40491820, 0x40498A20, 0x00000002, 0x40491820, 0x40498C20, - 0x00000002, 0x40491A20, 0x40498420, 0x00000002, 0x40491A20, 0x40498620, - 0x00000002, 0x40491A20, 0x40498820, 0x00000002, 0x40491A20, 0x40498A20, - 0x00000002, 0x40491A20, 0x40498C20, 0x00000002, 0x40491C20, 0x40498420, - 0x00000002, 0x40491C20, 0x40498620, 0x00000002, 0x40491C20, 0x40498820, - 0x00000002, 0x40491C20, 0x40498A20, 0x00000002, 0x40491C20, 0x40498C20, - 0x00000002, 0x40491E20, 0x40498420, 0x00000002, 0x40491E20, 0x40498620, - 0x00000002, 0x40491E20, 0x40498820, 0x00000002, 0x40491E20, 0x40498A20, - 0x00000002, 0x40491E20, 0x40498C20, 0x00000002, 0x40492020, 0x40498420, - 0x00000002, 0x40492020, 0x40498620, 0x00000002, - // Block 100, offset 0x1900 - 0x40492020, 0x40498820, 0x00000002, 0x40492020, 0x40498A20, 0x00000002, - 0x40492020, 0x40498C20, 0x00000002, 0x40492220, 0x40498420, 0x00000002, - 0x40492220, 0x40498620, 0x00000002, 0x40492220, 0x40498820, 0x00000002, - 0x40492220, 0x40498A20, 0x00000002, 0x40492220, 0x40498C20, 0x00000002, - 0x40492420, 0x40498420, 0x00000002, 0x40492420, 0x40498620, 0x00000002, - 0x40492420, 0x40498820, 0x00000002, 0x40492420, 0x40498A20, 0x00000002, - 0x40492420, 0x40498C20, 0x00000002, 0x40492620, 0x40498420, 0x00000002, - 0x40492620, 0x40498620, 0x00000002, 0x40492620, 0x40498820, 0x00000002, - 0x40492620, 0x40498A20, 0x00000002, 0x40492620, 0x40498C20, 0x00000002, - 0x40492820, 0x40498420, 0x00000002, 0x40492820, 0x40498620, 0x00000002, - 0x40492820, 0x40498820, 0x00000002, 0x40492820, - // Block 101, offset 0x1940 - 0x40498A20, 0x00000002, 0x40492820, 0x40498C20, 0x00000002, 0x40492A20, - 0x40498420, 0x00000002, 0x40492A20, 0x40498620, 0x00000002, 0x40492A20, - 0x40498820, 0x00000002, 0x40492A20, 0x40498A20, 0x00000002, 0x40492A20, - 0x40498C20, 0x00000002, 0x40492C20, 0x40498420, 0x00000002, 0x40492C20, - 0x40498620, 0x00000002, 0x40492C20, 0x40498820, 0x00000002, 0x40492C20, - 0x40498A20, 0x00000002, 0x40492C20, 0x40498C20, 0x00000002, 0x40492E20, - 0x40498420, 0x00000002, 0x40492E20, 0x40498620, 0x00000002, 0x40492E20, - 0x40498820, 0x00000002, 0x40492E20, 0x40498A20, 0x00000002, 0x40492E20, - 0x40498C20, 0x00000002, 0x40493020, 0x40498420, 0x00000002, 0x40493020, - 0x40498620, 0x00000002, 0x40493020, 0x40498820, 0x00000002, 0x40493020, - 0x40498A20, 0x00000002, 0x40493020, 0x40498C20, - // Block 102, offset 0x1980 - 0x00000002, 0x40493220, 0x40498420, 0x00000002, 0x40493220, 0x40498620, - 0x00000002, 0x40493220, 0x40498820, 0x00000002, 0x40493220, 0x40498A20, - 0x00000002, 0x40493220, 0x40498C20, 0x00000002, 0x40493420, 0x40498420, - 0x00000002, 0x40493420, 0x40498620, 0x00000002, 0x40493420, 0x40498820, - 0x00000002, 0x40493420, 0x40498A20, 0x00000002, 0x40493420, 0x40498C20, - 0x00000002, 0x40493620, 0x40498420, 0x00000002, 0x40493620, 0x40498620, - 0x00000002, 0x40493620, 0x40498820, 0x00000002, 0x40493620, 0x40498A20, - 0x00000002, 0x40493620, 0x40498C20, 0x00000002, 0x40493820, 0x40498420, - 0x00000002, 0x40493820, 0x40498620, 0x00000002, 0x40493820, 0x40498820, - 0x00000002, 0x40493820, 0x40498A20, 0x00000002, 0x40493820, 0x40498C20, - 0x00000002, 0x40493A20, 0x40498420, 0x00000002, - // Block 103, offset 0x19c0 - 0x40493A20, 0x40498620, 0x00000002, 0x40493A20, 0x40498820, 0x00000002, - 0x40493A20, 0x40498A20, 0x00000002, 0x40493A20, 0x40498C20, 0x00000002, - 0x40493C20, 0x40498420, 0x00000002, 0x40493C20, 0x40498620, 0x00000002, - 0x40493C20, 0x40498820, 0x00000002, 0x40493C20, 0x40498A20, 0x00000002, - 0x40493C20, 0x40498C20, 0x00000002, 0x40493E20, 0x40498420, 0x00000002, - 0x40493E20, 0x40498620, 0x00000002, 0x40493E20, 0x40498820, 0x00000002, - 0x40493E20, 0x40498A20, 0x00000002, 0x40493E20, 0x40498C20, 0x00000002, - 0x40494020, 0x40498420, 0x00000002, 0x40494020, 0x40498620, 0x00000002, - 0x40494020, 0x40498820, 0x00000002, 0x40494020, 0x40498A20, 0x00000002, - 0x40494020, 0x40498C20, 0x00000002, 0x40494220, 0x40498420, 0x00000002, - 0x40494220, 0x40498620, 0x00000002, 0x40494220, - // Block 104, offset 0x1a00 - 0x40498820, 0x00000002, 0x40494220, 0x40498A20, 0x00000002, 0x40494220, - 0x40498C20, 0x00000002, 0x40494420, 0x40498420, 0x00000002, 0x40494420, - 0x40498620, 0x00000002, 0x40494420, 0x40498820, 0x00000002, 0x40494420, - 0x40498A20, 0x00000002, 0x40494420, 0x40498C20, 0x00000002, 0x40494620, - 0x40498420, 0x00000002, 0x40494620, 0x40498620, 0x00000002, 0x40494620, - 0x40498820, 0x00000002, 0x40494620, 0x40498A20, 0x00000002, 0x40494620, - 0x40498C20, 0x00000002, 0x40494820, 0x40498420, 0x00000002, 0x40494820, - 0x40498620, 0x00000002, 0x40494820, 0x40498820, 0x00000002, 0x40494820, - 0x40498A20, 0x00000002, 0x40494820, 0x40498C20, 0x00000002, 0x40494A20, - 0x40498420, 0x00000002, 0x40494A20, 0x40498620, 0x00000002, 0x40494A20, - 0x40498820, 0x00000002, 0x40494A20, 0x40498A20, - // Block 105, offset 0x1a40 - 0x00000002, 0x40494A20, 0x40498C20, 0x00000002, 0x40494C20, 0x40498420, - 0x00000002, 0x40494C20, 0x40498620, 0x00000002, 0x40494C20, 0x40498820, - 0x00000002, 0x40494C20, 0x40498A20, 0x00000002, 0x40494C20, 0x40498C20, - 0x00000002, 0x40494E20, 0x40498420, 0x00000002, 0x40494E20, 0x40498620, - 0x00000002, 0x40494E20, 0x40498820, 0x00000002, 0x40494E20, 0x40498A20, - 0x00000002, 0x40494E20, 0x40498C20, 0x00000002, 0x40495020, 0x40498420, - 0x00000002, 0x40495020, 0x40498620, 0x00000002, 0x40495020, 0x40498820, - 0x00000002, 0x40495020, 0x40498A20, 0x00000002, 0x40495020, 0x40498C20, - 0x00000002, 0x40495220, 0x40498420, 0x00000002, 0x40495220, 0x40498620, - 0x00000002, 0x40495220, 0x40498820, 0x00000002, 0x40495220, 0x40498A20, - 0x00000002, 0x40495220, 0x40498C20, 0x00000002, - // Block 106, offset 0x1a80 - 0x40495420, 0x40498420, 0x00000002, 0x40495420, 0x40498620, 0x00000002, - 0x40495420, 0x40498820, 0x00000002, 0x40495420, 0x40498A20, 0x00000002, - 0x40495420, 0x40498C20, 0x00000002, 0x40495620, 0x40498420, 0x00000002, - 0x40495620, 0x40498620, 0x00000002, 0x40495620, 0x40498820, 0x00000002, - 0x40495620, 0x40498A20, 0x00000002, 0x40495620, 0x40498C20, 0x00000002, - 0x40495820, 0x40498420, 0x00000002, 0x40495820, 0x40498620, 0x00000002, - 0x40495820, 0x40498820, 0x00000002, 0x40495820, 0x40498A20, 0x00000002, - 0x40495820, 0x40498C20, 0x00000002, 0x40495A20, 0x40498420, 0x00000002, - 0x40495A20, 0x40498620, 0x00000002, 0x40495A20, 0x40498820, 0x00000002, - 0x40495A20, 0x40498A20, 0x00000002, 0x40495A20, 0x40498C20, 0x00000002, - 0x40495C20, 0x40498420, 0x00000002, 0x40495C20, - // Block 107, offset 0x1ac0 - 0x40498620, 0x00000002, 0x40495C20, 0x40498820, 0x00000002, 0x40495C20, - 0x40498A20, 0x00000002, 0x40495C20, 0x40498C20, 0x00000002, 0x40495E20, - 0x40498420, 0x00000002, 0x40495E20, 0x40498620, 0x00000002, 0x40495E20, - 0x40498820, 0x00000002, 0x40495E20, 0x40498A20, 0x00000002, 0x40495E20, - 0x40498C20, 0x00000002, 0x40496020, 0x40498420, 0x00000002, 0x40496020, - 0x40498620, 0x00000002, 0x40496020, 0x40498820, 0x00000002, 0x40496020, - 0x40498A20, 0x00000002, 0x40496020, 0x40498C20, 0x00000002, 0x40496220, - 0x40498420, 0x00000002, 0x40496220, 0x40498620, 0x00000002, 0x40496220, - 0x40498820, 0x00000002, 0x40496220, 0x40498A20, 0x00000002, 0x40496220, - 0x40498C20, 0x00000002, 0x40496420, 0x40498420, 0x00000002, 0x40496420, - 0x40498620, 0x00000002, 0x40496420, 0x40498820, - // Block 108, offset 0x1b00 - 0x00000002, 0x40496420, 0x40498A20, 0x00000002, 0x40496420, 0x40498C20, - 0x00000002, 0x40496620, 0x40498420, 0x00000002, 0x40496620, 0x40498620, - 0x00000002, 0x40496620, 0x40498820, 0x00000002, 0x40496620, 0x40498A20, - 0x00000002, 0x40496620, 0x40498C20, 0x00000002, 0x40496820, 0x40498420, - 0x00000002, 0x40496820, 0x40498620, 0x00000002, 0x40496820, 0x40498820, - 0x00000002, 0x40496820, 0x40498A20, 0x00000002, 0x40496820, 0x40498C20, - 0x00000002, 0x40496A20, 0x40498420, 0x00000002, 0x40496A20, 0x40498620, - 0x00000002, 0x40496A20, 0x40498820, 0x00000002, 0x40496A20, 0x40498A20, - 0x00000002, 0x40496A20, 0x40498C20, 0x00000002, 0x40499020, 0x4049E620, - 0x00000002, 0x40499020, 0x4049E820, 0x00000002, 0x40499020, 0x4049EA20, - 0x00000002, 0x40499020, 0x4049EC20, 0x00000002, - // Block 109, offset 0x1b40 - 0x40499020, 0x4049EE20, 0x00000002, 0x40499220, 0x4049E620, 0x00000002, - 0x40499220, 0x4049E820, 0x00000002, 0x40499220, 0x4049EA20, 0x00000002, - 0x40499220, 0x4049EC20, 0x00000002, 0x40499220, 0x4049EE20, 0x00000002, - 0x40499420, 0x4049E620, 0x00000002, 0x40499420, 0x4049E820, 0x00000002, - 0x40499420, 0x4049EA20, 0x00000002, 0x40499420, 0x4049EC20, 0x00000002, - 0x40499420, 0x4049EE20, 0x00000002, 0x40499620, 0x4049E620, 0x00000002, - 0x40499620, 0x4049E820, 0x00000002, 0x40499620, 0x4049EA20, 0x00000002, - 0x40499620, 0x4049EC20, 0x00000002, 0x40499620, 0x4049EE20, 0x00000002, - 0x40499820, 0x4049E620, 0x00000002, 0x40499820, 0x4049E820, 0x00000002, - 0x40499820, 0x4049EA20, 0x00000002, 0x40499820, 0x4049EC20, 0x00000002, - 0x40499820, 0x4049EE20, 0x00000002, 0x40499A20, - // Block 110, offset 0x1b80 - 0x4049E620, 0x00000002, 0x40499A20, 0x4049E820, 0x00000002, 0x40499A20, - 0x4049EA20, 0x00000002, 0x40499A20, 0x4049EC20, 0x00000002, 0x40499A20, - 0x4049EE20, 0x00000002, 0x40499C20, 0x4049E620, 0x00000002, 0x40499C20, - 0x4049E820, 0x00000002, 0x40499C20, 0x4049EA20, 0x00000002, 0x40499C20, - 0x4049EC20, 0x00000002, 0x40499C20, 0x4049EE20, 0x00000002, 0x40499E20, - 0x4049E620, 0x00000002, 0x40499E20, 0x4049E820, 0x00000002, 0x40499E20, - 0x4049EA20, 0x00000002, 0x40499E20, 0x4049EC20, 0x00000002, 0x40499E20, - 0x4049EE20, 0x00000002, 0x4049A020, 0x4049E620, 0x00000002, 0x4049A020, - 0x4049E820, 0x00000002, 0x4049A020, 0x4049EA20, 0x00000002, 0x4049A020, - 0x4049EC20, 0x00000002, 0x4049A020, 0x4049EE20, 0x00000002, 0x4049A220, - 0x4049E620, 0x00000002, 0x4049A220, 0x4049E820, - // Block 111, offset 0x1bc0 - 0x00000002, 0x4049A220, 0x4049EA20, 0x00000002, 0x4049A220, 0x4049EC20, - 0x00000002, 0x4049A220, 0x4049EE20, 0x00000002, 0x4049A420, 0x4049E620, - 0x00000002, 0x4049A420, 0x4049E820, 0x00000002, 0x4049A420, 0x4049EA20, - 0x00000002, 0x4049A420, 0x4049EC20, 0x00000002, 0x4049A420, 0x4049EE20, - 0x00000002, 0x4049A620, 0x4049E620, 0x00000002, 0x4049A620, 0x4049E820, - 0x00000002, 0x4049A620, 0x4049EA20, 0x00000002, 0x4049A620, 0x4049EC20, - 0x00000002, 0x4049A620, 0x4049EE20, 0x00000002, 0x4049A820, 0x4049E620, - 0x00000002, 0x4049A820, 0x4049E820, 0x00000002, 0x4049A820, 0x4049EA20, - 0x00000002, 0x4049A820, 0x4049EC20, 0x00000002, 0x4049A820, 0x4049EE20, - 0x00000002, 0x4049AA20, 0x4049E620, 0x00000002, 0x4049AA20, 0x4049E820, - 0x00000002, 0x4049AA20, 0x4049EA20, 0x00000002, - // Block 112, offset 0x1c00 - 0x4049AA20, 0x4049EC20, 0x00000002, 0x4049AA20, 0x4049EE20, 0x00000002, - 0x4049AC20, 0x4049E620, 0x00000002, 0x4049AC20, 0x4049E820, 0x00000002, - 0x4049AC20, 0x4049EA20, 0x00000002, 0x4049AC20, 0x4049EC20, 0x00000002, - 0x4049AC20, 0x4049EE20, 0x00000002, 0x4049AE20, 0x4049E620, 0x00000002, - 0x4049AE20, 0x4049E820, 0x00000002, 0x4049AE20, 0x4049EA20, 0x00000002, - 0x4049AE20, 0x4049EC20, 0x00000002, 0x4049AE20, 0x4049EE20, 0x00000002, - 0x4049B020, 0x4049E620, 0x00000002, 0x4049B020, 0x4049E820, 0x00000002, - 0x4049B020, 0x4049EA20, 0x00000002, 0x4049B020, 0x4049EC20, 0x00000002, - 0x4049B020, 0x4049EE20, 0x00000002, 0x4049B220, 0x4049E620, 0x00000002, - 0x4049B220, 0x4049E820, 0x00000002, 0x4049B220, 0x4049EA20, 0x00000002, - 0x4049B220, 0x4049EC20, 0x00000002, 0x4049B220, - // Block 113, offset 0x1c40 - 0x4049EE20, 0x00000002, 0x4049B420, 0x4049E620, 0x00000002, 0x4049B420, - 0x4049E820, 0x00000002, 0x4049B420, 0x4049EA20, 0x00000002, 0x4049B420, - 0x4049EC20, 0x00000002, 0x4049B420, 0x4049EE20, 0x00000002, 0x4049B620, - 0x4049E620, 0x00000002, 0x4049B620, 0x4049E820, 0x00000002, 0x4049B620, - 0x4049EA20, 0x00000002, 0x4049B620, 0x4049EC20, 0x00000002, 0x4049B620, - 0x4049EE20, 0x00000002, 0x4049B820, 0x4049E620, 0x00000002, 0x4049B820, - 0x4049E820, 0x00000002, 0x4049B820, 0x4049EA20, 0x00000002, 0x4049B820, - 0x4049EC20, 0x00000002, 0x4049B820, 0x4049EE20, 0x00000002, 0x4049BA20, - 0x4049E620, 0x00000002, 0x4049BA20, 0x4049E820, 0x00000002, 0x4049BA20, - 0x4049EA20, 0x00000002, 0x4049BA20, 0x4049EC20, 0x00000002, 0x4049BA20, - 0x4049EE20, 0x00000002, 0x4049BC20, 0x4049E620, - // Block 114, offset 0x1c80 - 0x00000002, 0x4049BC20, 0x4049E820, 0x00000002, 0x4049BC20, 0x4049EA20, - 0x00000002, 0x4049BC20, 0x4049EC20, 0x00000002, 0x4049BC20, 0x4049EE20, - 0x00000002, 0x4049BE20, 0x4049E620, 0x00000002, 0x4049BE20, 0x4049E820, - 0x00000002, 0x4049BE20, 0x4049EA20, 0x00000002, 0x4049BE20, 0x4049EC20, - 0x00000002, 0x4049BE20, 0x4049EE20, 0x00000002, 0x4049C020, 0x4049E620, - 0x00000002, 0x4049C020, 0x4049E820, 0x00000002, 0x4049C020, 0x4049EA20, - 0x00000002, 0x4049C020, 0x4049EC20, 0x00000002, 0x4049C020, 0x4049EE20, - 0x00000002, 0x4049C220, 0x4049E620, 0x00000002, 0x4049C220, 0x4049E820, - 0x00000002, 0x4049C220, 0x4049EA20, 0x00000002, 0x4049C220, 0x4049EC20, - 0x00000002, 0x4049C220, 0x4049EE20, 0x00000003, 0x0049C484, 0x0049AC84, - 0x4049E620, 0x00000003, 0x0049C484, 0x0049AC84, - // Block 115, offset 0x1cc0 - 0x4049E820, 0x00000003, 0x0049C484, 0x0049AC84, 0x4049EA20, 0x00000003, - 0x0049C484, 0x0049AC84, 0x4049EC20, 0x00000003, 0x0049C484, 0x0049AC84, - 0x4049EE20, 0x00000003, 0x0049C484, 0x0049BA84, 0x4049E620, 0x00000003, - 0x0049C484, 0x0049BA84, 0x4049E820, 0x00000003, 0x0049C484, 0x0049BA84, - 0x4049EA20, 0x00000003, 0x0049C484, 0x0049BA84, 0x4049EC20, 0x00000003, - 0x0049C484, 0x0049BA84, 0x4049EE20, 0x00000002, 0x4049C420, 0x4049E620, - 0x00000002, 0x4049C420, 0x4049E820, 0x00000002, 0x4049C420, 0x4049EA20, - 0x00000002, 0x4049C420, 0x4049EC20, 0x00000002, 0x4049C420, 0x4049EE20, - 0x00000002, 0x4049C620, 0x4049E620, 0x00000002, 0x4049C620, 0x4049E820, - 0x00000002, 0x4049C620, 0x4049EA20, 0x00000002, 0x4049C620, 0x4049EC20, - 0x00000002, 0x4049C620, 0x4049EE20, 0x00000002, - // Block 116, offset 0x1d00 - 0x4049C820, 0x4049E620, 0x00000002, 0x4049C820, 0x4049E820, 0x00000002, - 0x4049C820, 0x4049EA20, 0x00000002, 0x4049C820, 0x4049EC20, 0x00000002, - 0x4049C820, 0x4049EE20, 0x00000002, 0x4049F020, 0x404A5A20, 0x00000002, - 0x4049F020, 0x404A5C20, 0x00000002, 0x4049F020, 0x404A6220, 0x00000002, - 0x4049F020, 0x404A6620, 0x00000002, 0x4049F020, 0x404A6820, 0x00000002, - 0x4049F220, 0x404A5A20, 0x00000002, 0x4049F220, 0x404A5C20, 0x00000002, - 0x4049F220, 0x404A6220, 0x00000002, 0x4049F220, 0x404A6620, 0x00000002, - 0x4049F220, 0x404A6820, 0x00000002, 0x4049F420, 0x404A5A20, 0x00000002, - 0x4049F420, 0x404A5C20, 0x00000002, 0x4049F420, 0x404A6220, 0x00000002, - 0x4049F420, 0x404A6620, 0x00000002, 0x4049F420, 0x404A6820, 0x00000002, - 0x4049F620, 0x404A5A20, 0x00000002, 0x4049F620, - // Block 117, offset 0x1d40 - 0x404A5C20, 0x00000002, 0x4049F620, 0x404A6220, 0x00000002, 0x4049F620, - 0x404A6620, 0x00000002, 0x4049F620, 0x404A6820, 0x00000002, 0x4049F820, - 0x404A5A20, 0x00000002, 0x4049F820, 0x404A5C20, 0x00000002, 0x4049F820, - 0x404A6220, 0x00000002, 0x4049F820, 0x404A6620, 0x00000002, 0x4049F820, - 0x404A6820, 0x00000002, 0x4049FA20, 0x404A5A20, 0x00000002, 0x4049FA20, - 0x404A5C20, 0x00000002, 0x4049FA20, 0x404A6220, 0x00000002, 0x4049FA20, - 0x404A6620, 0x00000002, 0x4049FA20, 0x404A6820, 0x00000002, 0x4049FC20, - 0x404A5A20, 0x00000002, 0x4049FC20, 0x404A5C20, 0x00000002, 0x4049FC20, - 0x404A6220, 0x00000002, 0x4049FC20, 0x404A6620, 0x00000002, 0x4049FC20, - 0x404A6820, 0x00000002, 0x4049FE20, 0x404A5A20, 0x00000002, 0x4049FE20, - 0x404A5C20, 0x00000002, 0x4049FE20, 0x404A6220, - // Block 118, offset 0x1d80 - 0x00000002, 0x4049FE20, 0x404A6620, 0x00000002, 0x4049FE20, 0x404A6820, - 0x00000002, 0x404A0020, 0x404A5A20, 0x00000002, 0x404A0020, 0x404A5C20, - 0x00000002, 0x404A0020, 0x404A6220, 0x00000002, 0x404A0020, 0x404A6620, - 0x00000002, 0x404A0020, 0x404A6820, 0x00000002, 0x404A0220, 0x404A5A20, - 0x00000002, 0x404A0220, 0x404A5C20, 0x00000002, 0x404A0220, 0x404A6220, - 0x00000002, 0x404A0220, 0x404A6620, 0x00000002, 0x404A0220, 0x404A6820, - 0x00000002, 0x404A0420, 0x404A5A20, 0x00000002, 0x404A0420, 0x404A5C20, - 0x00000002, 0x404A0420, 0x404A6220, 0x00000002, 0x404A0420, 0x404A6620, - 0x00000002, 0x404A0420, 0x404A6820, 0x00000002, 0x404A0620, 0x404A5A20, - 0x00000002, 0x404A0620, 0x404A5C20, 0x00000002, 0x404A0620, 0x404A6220, - 0x00000002, 0x404A0620, 0x404A6620, 0x00000002, - // Block 119, offset 0x1dc0 - 0x404A0620, 0x404A6820, 0x00000002, 0x404A0820, 0x404A5A20, 0x00000002, - 0x404A0820, 0x404A5C20, 0x00000002, 0x404A0820, 0x404A6220, 0x00000002, - 0x404A0820, 0x404A6620, 0x00000002, 0x404A0820, 0x404A6820, 0x00000002, - 0x404A0A20, 0x404A5A20, 0x00000002, 0x404A0A20, 0x404A5C20, 0x00000002, - 0x404A0A20, 0x404A6220, 0x00000002, 0x404A0A20, 0x404A6620, 0x00000002, - 0x404A0A20, 0x404A6820, 0x00000002, 0x404A0C20, 0x404A5A20, 0x00000002, - 0x404A0C20, 0x404A5C20, 0x00000002, 0x404A0C20, 0x404A6220, 0x00000002, - 0x404A0C20, 0x404A6620, 0x00000002, 0x404A0C20, 0x404A6820, 0x00000002, - 0x404A0E20, 0x404A5A20, 0x00000002, 0x404A0E20, 0x404A5C20, 0x00000002, - 0x404A0E20, 0x404A6220, 0x00000002, 0x404A0E20, 0x404A6620, 0x00000002, - 0x404A0E20, 0x404A6820, 0x00000002, 0x404A1020, - // Block 120, offset 0x1e00 - 0x404A5A20, 0x00000002, 0x404A1020, 0x404A5C20, 0x00000002, 0x404A1020, - 0x404A6220, 0x00000002, 0x404A1020, 0x404A6620, 0x00000002, 0x404A1020, - 0x404A6820, 0x00000002, 0x404A1220, 0x404A5A20, 0x00000002, 0x404A1220, - 0x404A5C20, 0x00000002, 0x404A1220, 0x404A6220, 0x00000002, 0x404A1220, - 0x404A6620, 0x00000002, 0x404A1220, 0x404A6820, 0x00000002, 0x404A1420, - 0x404A5A20, 0x00000002, 0x404A1420, 0x404A5C20, 0x00000002, 0x404A1420, - 0x404A6220, 0x00000002, 0x404A1420, 0x404A6620, 0x00000002, 0x404A1420, - 0x404A6820, 0x00000002, 0x404A1620, 0x404A5A20, 0x00000002, 0x404A1620, - 0x404A5C20, 0x00000002, 0x404A1620, 0x404A6220, 0x00000002, 0x404A1620, - 0x404A6620, 0x00000002, 0x404A1620, 0x404A6820, 0x00000002, 0x404A1820, - 0x404A5A20, 0x00000002, 0x404A1820, 0x404A5C20, - // Block 121, offset 0x1e40 - 0x00000002, 0x404A1820, 0x404A6220, 0x00000002, 0x404A1820, 0x404A6620, - 0x00000002, 0x404A1820, 0x404A6820, 0x00000002, 0x404A1A20, 0x404A5A20, - 0x00000002, 0x404A1A20, 0x404A5C20, 0x00000002, 0x404A1A20, 0x404A6220, - 0x00000002, 0x404A1A20, 0x404A6620, 0x00000002, 0x404A1A20, 0x404A6820, - 0x00000002, 0x404A1C20, 0x404A5A20, 0x00000002, 0x404A1C20, 0x404A5C20, - 0x00000002, 0x404A1C20, 0x404A6220, 0x00000002, 0x404A1C20, 0x404A6620, - 0x00000002, 0x404A1C20, 0x404A6820, 0x00000002, 0x404A1E20, 0x404A5A20, - 0x00000002, 0x404A1E20, 0x404A5C20, 0x00000002, 0x404A1E20, 0x404A6220, - 0x00000002, 0x404A1E20, 0x404A6620, 0x00000002, 0x404A1E20, 0x404A6820, - 0x00000002, 0x404A2020, 0x404A5A20, 0x00000002, 0x404A2020, 0x404A5C20, - 0x00000002, 0x404A2020, 0x404A6220, 0x00000002, - // Block 122, offset 0x1e80 - 0x404A2020, 0x404A6620, 0x00000002, 0x404A2020, 0x404A6820, 0x00000002, - 0x404A2220, 0x404A5A20, 0x00000002, 0x404A2220, 0x404A5C20, 0x00000002, - 0x404A2220, 0x404A6220, 0x00000002, 0x404A2220, 0x404A6620, 0x00000002, - 0x404A2220, 0x404A6820, 0x00000002, 0x404A2420, 0x404A5A20, 0x00000002, - 0x404A2420, 0x404A5C20, 0x00000002, 0x404A2420, 0x404A6220, 0x00000002, - 0x404A2420, 0x404A6620, 0x00000002, 0x404A2420, 0x404A6820, 0x00000002, - 0x404A2620, 0x404A5A20, 0x00000002, 0x404A2620, 0x404A5C20, 0x00000002, - 0x404A2620, 0x404A6220, 0x00000002, 0x404A2620, 0x404A6620, 0x00000002, - 0x404A2620, 0x404A6820, 0x00000002, 0x404A2820, 0x404A5A20, 0x00000002, - 0x404A2820, 0x404A5C20, 0x00000002, 0x404A2820, 0x404A6220, 0x00000002, - 0x404A2820, 0x404A6620, 0x00000002, 0x404A2820, - // Block 123, offset 0x1ec0 - 0x404A6820, 0x00000002, 0x404A2A20, 0x404A5A20, 0x00000002, 0x404A2A20, - 0x404A5C20, 0x00000002, 0x404A2A20, 0x404A6220, 0x00000002, 0x404A2A20, - 0x404A6620, 0x00000002, 0x404A2A20, 0x404A6820, 0x00000002, 0x404A2C20, - 0x404A5A20, 0x00000002, 0x404A2C20, 0x404A5C20, 0x00000002, 0x404A2C20, - 0x404A6220, 0x00000002, 0x404A2C20, 0x404A6620, 0x00000002, 0x404A2C20, - 0x404A6820, 0x00000002, 0x404A2E20, 0x404A5A20, 0x00000002, 0x404A2E20, - 0x404A5C20, 0x00000002, 0x404A2E20, 0x404A6220, 0x00000002, 0x404A2E20, - 0x404A6620, 0x00000002, 0x404A2E20, 0x404A6820, 0x00000002, 0x404A3020, - 0x404A5A20, 0x00000002, 0x404A3020, 0x404A5C20, 0x00000002, 0x404A3020, - 0x404A6220, 0x00000002, 0x404A3020, 0x404A6620, 0x00000002, 0x404A3020, - 0x404A6820, 0x00000002, 0x404A3220, 0x404A5A20, - // Block 124, offset 0x1f00 - 0x00000002, 0x404A3220, 0x404A5C20, 0x00000002, 0x404A3220, 0x404A6220, - 0x00000002, 0x404A3220, 0x404A6620, 0x00000002, 0x404A3220, 0x404A6820, - 0x00000002, 0x404A3420, 0x404A5A20, 0x00000002, 0x404A3420, 0x404A5C20, - 0x00000002, 0x404A3420, 0x404A6220, 0x00000002, 0x404A3420, 0x404A6620, - 0x00000002, 0x404A3420, 0x404A6820, 0x00000002, 0x404A3620, 0x404A5A20, - 0x00000002, 0x404A3620, 0x404A5C20, 0x00000002, 0x404A3620, 0x404A6220, - 0x00000002, 0x404A3620, 0x404A6620, 0x00000002, 0x404A3620, 0x404A6820, - 0x00000002, 0x404A3820, 0x404A5A20, 0x00000002, 0x404A3820, 0x404A5C20, - 0x00000002, 0x404A3820, 0x404A6220, 0x00000002, 0x404A3820, 0x404A6620, - 0x00000002, 0x404A3820, 0x404A6820, 0x00000002, 0x404A3A20, 0x404A5A20, - 0x00000002, 0x404A3A20, 0x404A5C20, 0x00000002, - // Block 125, offset 0x1f40 - 0x404A3A20, 0x404A6220, 0x00000002, 0x404A3A20, 0x404A6620, 0x00000002, - 0x404A3A20, 0x404A6820, 0x00000002, 0x404A3C20, 0x404A5A20, 0x00000002, - 0x404A3C20, 0x404A5C20, 0x00000002, 0x404A3C20, 0x404A6220, 0x00000002, - 0x404A3C20, 0x404A6620, 0x00000002, 0x404A3C20, 0x404A6820, 0x00000002, - 0x404A3E20, 0x404A5A20, 0x00000002, 0x404A3E20, 0x404A5C20, 0x00000002, - 0x404A3E20, 0x404A6220, 0x00000002, 0x404A3E20, 0x404A6620, 0x00000002, - 0x404A3E20, 0x404A6820, 0x00000002, 0x404A4020, 0x404A5A20, 0x00000002, - 0x404A4020, 0x404A5C20, 0x00000002, 0x404A4020, 0x404A6220, 0x00000002, - 0x404A4020, 0x404A6620, 0x00000002, 0x404A4020, 0x404A6820, 0x00000002, - 0x404A4220, 0x404A5A20, 0x00000002, 0x404A4220, 0x404A5C20, 0x00000002, - 0x404A4220, 0x404A6220, 0x00000002, 0x404A4220, - // Block 126, offset 0x1f80 - 0x404A6620, 0x00000002, 0x404A4220, 0x404A6820, 0x00000002, 0x404A4420, - 0x404A5A20, 0x00000002, 0x404A4420, 0x404A5C20, 0x00000002, 0x404A4420, - 0x404A6220, 0x00000002, 0x404A4420, 0x404A6620, 0x00000002, 0x404A4420, - 0x404A6820, 0x00000002, 0x404A4620, 0x404A5A20, 0x00000002, 0x404A4620, - 0x404A5C20, 0x00000002, 0x404A4620, 0x404A6220, 0x00000002, 0x404A4620, - 0x404A6620, 0x00000002, 0x404A4620, 0x404A6820, 0x00000002, 0x404A4820, - 0x404A5A20, 0x00000002, 0x404A4820, 0x404A5C20, 0x00000002, 0x404A4820, - 0x404A6220, 0x00000002, 0x404A4820, 0x404A6620, 0x00000002, 0x404A4820, - 0x404A6820, 0x00000002, 0x404A4A20, 0x404A5A20, 0x00000002, 0x404A4A20, - 0x404A5C20, 0x00000002, 0x404A4A20, 0x404A6220, 0x00000002, 0x404A4A20, - 0x404A6620, 0x00000002, 0x404A4A20, 0x404A6820, - // Block 127, offset 0x1fc0 - 0x00000002, 0x404A4C20, 0x404A5A20, 0x00000002, 0x404A4C20, 0x404A5C20, - 0x00000002, 0x404A4C20, 0x404A6220, 0x00000002, 0x404A4C20, 0x404A6620, - 0x00000002, 0x404A4C20, 0x404A6820, 0x00000002, 0x404A4E20, 0x404A5A20, - 0x00000002, 0x404A4E20, 0x404A5C20, 0x00000002, 0x404A4E20, 0x404A6220, - 0x00000002, 0x404A4E20, 0x404A6620, 0x00000002, 0x404A4E20, 0x404A6820, - 0x00000002, 0x404A7620, 0x404AF820, 0x00000002, 0x404A7820, 0x404AF820, - 0x00000002, 0x404A8020, 0x404B0020, 0x00000002, 0x404A8220, 0x404B0020, - 0x00000002, 0x404AA020, 0x404B0020, 0x00000002, 0x404AA220, 0x404B0020, - 0x00000002, 0x404AB020, 0x404B0020, 0x00000002, 0x404AB220, 0x404B0020, - 0x00000002, 0x404AC020, 0x404B0020, 0x00000002, 0x404AC220, 0x404B0020, - 0x00000002, 0x404AD020, 0x404B0020, 0x00000002, - // Block 128, offset 0x2000 - 0x404AD220, 0x404B0020, 0x00000002, 0x004AD684, 0xA0013A04, 0x00000002, - 0x004AE684, 0xA0013A04, 0x00000002, 0x004AE884, 0xA0013A04, 0x00000002, - 0x004AEA84, 0xA0013A04, 0x00000002, 0x404AEA20, 0x8281258D, 0x00000002, - 0x404AEA20, 0x82812591, 0x00000002, 0x404AF020, 0x8281258D, 0x00000002, - 0x404AF020, 0x82812591, 0x00000003, 0x004B0284, 0x004B3084, 0xA000F304, - 0x00000003, 0x004EA684, 0x004F1484, 0x004EA684, 0x00000002, 0x0050AE84, - 0x0050DA84, 0x00000003, 0x0050AE84, 0x0050DA84, 0x0050F084, 0x00000003, - 0x00514E84, 0x00519A84, 0x00514E84, 0x00000002, 0x005ADA84, 0xA0013904, - 0x00000002, 0x005ADC84, 0xA0013904, 0x00000002, 0x005ADC84, 0xA0013A04, - 0x00000002, 0x005ADE84, 0xA0013904, 0x00000002, 0x005ADE84, 0x005ADE84, - 0x00000002, 0x005AE084, 0xA0013904, 0x00000002, - // Block 129, offset 0x2040 - 0x005AE084, 0xA0013A04, 0x00000002, 0x005AE084, 0xA0013C04, 0x00000002, - 0x005AE084, 0xA0013D04, 0x00000002, 0x005AE884, 0xA0013904, 0x00000002, - 0x005AE884, 0xA0013A04, 0x00000002, 0x005AE884, 0xA0013C04, 0x00000002, - 0x005AE884, 0xA0013D04, 0x00000002, 0x005AEC84, 0xA0013904, 0x00000002, - 0x005AEE84, 0xA0013904, 0x00000002, 0x005AEE84, 0xA0013A04, 0x00000002, - 0x005AEE84, 0xA0013C04, 0x00000002, 0x005AF084, 0xA0013904, 0x00000002, - 0x005AF084, 0xA0013A04, 0x00000002, 0x005AF284, 0xA0013904, 0x00000002, - 0x005AF484, 0xA0013904, 0x00000002, 0x005AF684, 0xA0013904, 0x00000002, - 0x005AF684, 0x005B0884, 0x00000002, 0x005AFA84, 0xA0013904, 0x00000002, - 0x005AFE84, 0xA0013904, 0x00000002, 0x005AFE84, 0xA0013A04, 0x00000002, - 0x005AFE84, 0xA0013C04, 0x00000002, 0x005AFE84, - // Block 130, offset 0x2080 - 0xA0013D04, 0x00000002, 0x005AFE84, 0xA0013E04, 0x00000002, 0x005B0084, - 0xA0013904, 0x00000002, 0x005B0084, 0xA0013A04, 0x00000002, 0x005B0284, - 0xA0013904, 0x00000002, 0x005B0284, 0xA0013A04, 0x00000002, 0x005B0684, - 0xA0013904, 0x00000002, 0x005B0684, 0xA0013A04, 0x00000004, 0x005B0684, - 0xA0013904, 0x005B0684, 0xA0013904, 0x00000002, 0x005B0884, 0xA0013904, - 0x00000002, 0x005B0A84, 0xA0013904, 0x00000002, 0x005B2484, 0xA0013904, - 0x00000002, 0x005B2484, 0xA0013A04, 0x00000002, 0x005B2684, 0xA0013904, - 0x00000002, 0x005B2A84, 0xA0013904, 0x00000002, 0x005B3084, 0xA0013904, - 0x00000002, 0x005B3284, 0xA0013904, 0x00000002, 0x005B3484, 0xA0013904, - 0x00000002, 0x005B3684, 0xA0013904, 0x00000002, 0x005B3884, 0xA0013904, - 0x00000002, 0x005B3A84, 0xA0013904, 0x00000002, - // Block 131, offset 0x20c0 - 0x005B3E84, 0xA0013904, 0x00000002, 0x005B4084, 0xA0013904, 0x00000002, - 0x005B4284, 0xA0013904, 0x00000002, 0x005B4484, 0xA0013904, 0x00000002, - 0x005B4684, 0xA0013904, 0x00000002, 0x005B4884, 0xA0013904, 0x00000002, - 0x005B5284, 0xA0013904, 0x00000002, 0x005B5484, 0xA0013904, 0x00000002, - 0x005B5684, 0xA0013904, 0x00000002, 0x005B5884, 0xA0013904, 0x00000002, - 0x005B5C84, 0xA0013904, 0x00000002, 0x005B6484, 0xA0013904, 0x00000002, - 0x005B6684, 0xA0013904, 0x00000002, 0x005B6884, 0xA0013904, 0x00000002, - 0x005B6A84, 0xA0013904, 0x00000002, 0x005B6C84, 0xA0013904, 0x00000002, - 0x005B7484, 0xA0013904, 0x00000002, 0x005B7684, 0xA0013904, 0x00000002, - 0x005B7884, 0xA0013904, 0x00000002, 0x005B7A84, 0xA0013904, 0x00000002, - 0x005B9884, 0x005D9684, 0x00000002, 0x005BBC84, - // Block 132, offset 0x2100 - 0x005D9684, 0x00000002, 0x005BE684, 0x005D9684, 0x00000002, 0x005C0E84, - 0x005D9884, 0x00000002, 0x005C2484, 0x005D9684, 0x00000002, 0x005C3084, - 0x005D9884, 0x00000002, 0x005C3484, 0x005D9884, 0x00000002, 0x005C4084, - 0x005D9684, 0x00000002, 0x005C8A84, 0x005D9684, 0x00000002, 0x005CE884, - 0x005D9684, 0x00000002, 0x005D1684, 0x005D9684, 0x00000002, 0x005D2284, - 0x005D9884, 0x00000002, 0x005D3084, 0x005D9684, 0x00000004, 0x0062C486, - 0x0063C286, 0x0062C286, 0x0063CE86, 0x00000005, 0x0062C886, 0x0063A886, - 0x00648286, 0x0062AC86, 0x0063B886, 0x00000003, 0x0065769C, 0x0027D69C, - 0x0065CA9C, 0x00000005, 0x0065769C, 0x0065AA9C, 0xA001291C, 0x0027D69C, - 0x00659E9C, 0x00000004, 0x0065769C, 0x0065CA9C, 0x0065AE9C, 0x0065769C, - 0x00000005, 0x0065769C, 0x0065D89C, 0x0065B09C, - // Block 133, offset 0x2140 - 0xA001291C, 0x0065769C, 0x00000005, 0x0065789C, 0x0065A29C, 0x0065D89C, - 0x0065869C, 0xA001281C, 0x00000003, 0x0065789C, 0x0065D89C, 0x0065989C, - 0x00000002, 0x00657A8E, 0xA0812802, 0x00000002, 0x00657A91, 0xA0812802, - 0x00000003, 0x00657A9C, 0x0065809C, 0x0065D89C, 0x00000004, 0x00657E9C, - 0x0027D69C, 0x0065829C, 0x0027D69C, 0x00000006, 0x00657E9C, 0x0065909C, - 0x0065869C, 0x0027D69C, 0x00659E9C, 0xA001281C, 0x00000003, 0x0065809C, - 0x0027D69C, 0x0065B89C, 0x00000003, 0x0065809C, 0x0065D89C, 0x0065909C, - 0x00000002, 0x0065828E, 0xA0812802, 0x00000002, 0x00658291, 0xA0812802, - 0x00000003, 0x0065829C, 0x0065789C, 0x0065C89C, 0x00000004, 0x0065829C, - 0x0065C69C, 0x00659A9C, 0x00659E9C, 0x00000004, 0x0065829C, 0x0065CE9C, - 0x0065C89C, 0x0027D69C, 0x00000004, 0x0065829C, - // Block 134, offset 0x2180 - 0xA001281C, 0x0065CE9C, 0x0065D89C, 0x00000004, 0x0065829C, 0xA001281C, - 0x0065D89C, 0x0065B49C, 0x00000002, 0x0065848E, 0xA0812802, 0x00000002, - 0x00658491, 0xA0812802, 0x00000004, 0x0065849C, 0xA001281C, 0x0065829C, - 0xA001281C, 0x00000004, 0x0065849C, 0xA001281C, 0x0065A29C, 0x0027D69C, - 0x00000004, 0x0065849C, 0x0065C09C, 0x0065C89C, 0x0027D69C, 0x00000006, - 0x0065849C, 0xA001281C, 0x0065CA9C, 0x0065969C, 0xA001281C, 0x0027D69C, - 0x00000006, 0x0065849C, 0x0065CE9C, 0x0065869C, 0xA001281C, 0x0065C69C, - 0x0065B89C, 0x00000006, 0x0065849C, 0x0065CE9C, 0x0065BA9C, 0x0027D69C, - 0x00659E9C, 0x0065CA9C, 0x00000005, 0x0065849C, 0x0065CE9C, 0x0065D09C, - 0x00659A9C, 0x00659E9C, 0x00000002, 0x0065868E, 0xA0812802, 0x00000002, - 0x00658691, 0xA0812802, 0x00000004, 0x0065869C, - // Block 135, offset 0x21c0 - 0xA001281C, 0x0065C69C, 0x0065B89C, 0x00000006, 0x0065869C, 0xA001281C, - 0x0065C69C, 0x0065B89C, 0x00659E9C, 0x0065D89C, 0x00000006, 0x0065869C, - 0x0065CA9C, 0x0065929C, 0xA001281C, 0x0065789C, 0x0065CE9C, 0x00000004, - 0x0065869C, 0x0065CE9C, 0x0027D69C, 0x0065A69C, 0x00000002, 0x0065888E, - 0xA0812802, 0x00000002, 0x00658891, 0xA0812802, 0x00000003, 0x0065889C, - 0x0027D69C, 0x0065909C, 0x00000002, 0x00658A8E, 0xA0812802, 0x00000002, - 0x00658A91, 0xA0812802, 0x00000004, 0x00658A9C, 0x0027D69C, 0x0065B29C, - 0xA001291C, 0x00000003, 0x00658A9C, 0x0065CA9C, 0x0065A09C, 0x00000002, - 0x00658C8E, 0xA0812802, 0x00000002, 0x00658C91, 0xA0812802, 0x00000004, - 0x00658C9C, 0x0065789C, 0x0065869C, 0x0065CA9C, 0x00000005, 0x00658C9C, - 0x0065D89C, 0x0065989C, 0x0027D69C, 0x0065B89C, - // Block 136, offset 0x2200 - 0x00000002, 0x00658E8E, 0xA0812802, 0x00000002, 0x00658E91, 0xA0812802, - 0x00000002, 0x00658E84, 0x0065BA84, 0x00000005, 0x00658E9C, 0x0065C89C, - 0x0065D89C, 0x0065869C, 0xA001281C, 0x00000002, 0x0065908E, 0xA0812802, - 0x00000002, 0x00659091, 0xA0812802, 0x00000002, 0x0065928E, 0xA0812802, - 0x00000002, 0x00659291, 0xA0812802, 0x00000003, 0x0065929C, 0x0065D89C, - 0x0065989C, 0x00000003, 0x0065929C, 0x0065D89C, 0x00659E9C, 0x00000002, - 0x0065948E, 0xA0812802, 0x00000002, 0x00659491, 0xA0812802, 0x00000002, - 0x0065968E, 0xA0812802, 0x00000002, 0x00659691, 0xA0812802, 0x00000004, - 0x0065969C, 0xA001281C, 0x0027D69C, 0x0065909C, 0x00000002, 0x0065988E, - 0xA0812802, 0x00000002, 0x00659891, 0xA0812802, 0x00000002, 0x00659A8E, - 0xA0812802, 0x00000002, 0x00659A91, 0xA0812802, - // Block 137, offset 0x2240 - 0x00000002, 0x00659C8E, 0xA0812802, 0x00000002, 0x00659C91, 0xA0812802, - 0x00000003, 0x00659C9C, 0xA001281C, 0x00658E9C, 0x00000002, 0x00659E8E, - 0xA0812802, 0x00000002, 0x00659E91, 0xA0812802, 0x00000003, 0x00659E9C, - 0xA001281C, 0x0065CA9C, 0x00000003, 0x0065A89C, 0x00659A9C, 0x00659E9C, - 0x00000002, 0x0065AA8E, 0xA0812802, 0x00000002, 0x0065AA91, 0xA0812802, - 0x00000002, 0x0065AA8E, 0xA0812902, 0x00000002, 0x0065AA91, 0xA0812902, - 0x00000006, 0x0065AA9C, 0xA001291C, 0x0027D69C, 0x0065929C, 0x0065D89C, - 0x00659E9C, 0x00000004, 0x0065AA9C, 0xA001291C, 0x0027D69C, 0x00659A9C, - 0x00000005, 0x0065AA9C, 0xA001281C, 0x0027D69C, 0x0065CC9C, 0x0065CA9C, - 0x00000003, 0x0065AA9C, 0x0065789C, 0x00659A9C, 0x00000002, 0x0065AC8E, - 0xA0812802, 0x00000002, 0x0065AC91, 0xA0812802, - // Block 138, offset 0x2280 - 0x00000002, 0x0065AC8E, 0xA0812902, 0x00000002, 0x0065AC91, 0xA0812902, - 0x00000006, 0x0065AC9C, 0xA001291C, 0x0065769C, 0x0065909C, 0x00659E9C, - 0x0065CA9C, 0x00000004, 0x0065AC9C, 0xA001291C, 0x0065869C, 0x0065CA9C, - 0x00000003, 0x0065AC9C, 0xA001291C, 0x00658A9C, 0x00000003, 0x0065AC9C, - 0xA001281C, 0x0065CA9C, 0x00000002, 0x0065AE8E, 0xA0812802, 0x00000002, - 0x0065AE91, 0xA0812802, 0x00000002, 0x0065AE8E, 0xA0812902, 0x00000002, - 0x0065AE91, 0xA0812902, 0x00000006, 0x0065AE9C, 0x0065769C, 0x0065C69C, - 0x00659A9C, 0x00659E9C, 0xA001281C, 0x00000004, 0x0065AE9C, 0x0065789C, - 0x0027D69C, 0x00659E9C, 0x00000006, 0x0065AE9C, 0xA001281C, 0x00659A9C, - 0x00658E9C, 0x00657E9C, 0x0065CA9C, 0x00000003, 0x0065AE9C, 0x0065C69C, - 0x0065D89C, 0x00000002, 0x0065B08E, 0xA0812802, - // Block 139, offset 0x22c0 - 0x00000002, 0x0065B091, 0xA0812802, 0x00000002, 0x0065B08E, 0xA0812902, - 0x00000002, 0x0065B091, 0xA0812902, 0x00000005, 0x0065B09C, 0xA001291C, - 0x0027D69C, 0x00658E9C, 0xA001281C, 0x00000004, 0x0065B09C, 0xA001281C, - 0x0027D69C, 0x0065969C, 0x00000005, 0x0065B09C, 0x0065869C, 0x0065969C, - 0x0027D69C, 0x0065CA9C, 0x00000003, 0x0065B09C, 0xA001291C, 0x0065949C, - 0x00000004, 0x0065B09C, 0xA001291C, 0x0065A29C, 0x0065AC9C, 0x00000003, - 0x0065B09C, 0x0065CA9C, 0x00659A9C, 0x00000004, 0x0065B09C, 0xA001291C, - 0x0065D89C, 0x0065909C, 0x00000002, 0x0065B28E, 0xA0812802, 0x00000002, - 0x0065B291, 0xA0812802, 0x00000002, 0x0065B28E, 0xA0812902, 0x00000002, - 0x0065B291, 0xA0812902, 0x00000003, 0x0065B29C, 0x0027D69C, 0x0065CA9C, - 0x00000003, 0x0065B29C, 0x0027D69C, 0x0065D89C, - // Block 140, offset 0x2300 - 0x00000005, 0x0065B29C, 0xA001291C, 0x0065789C, 0x0065D89C, 0x00659E9C, - 0x00000004, 0x0065B29C, 0xA001281C, 0x0065CA9C, 0x00659E9C, 0x00000005, - 0x0065B29C, 0xA001291C, 0x0065D89C, 0x00659E9C, 0xA001281C, 0x00000004, - 0x0065B49C, 0x0065789C, 0x0065869C, 0x0065CE9C, 0x00000003, 0x0065B49C, - 0x0065789C, 0x0065CA9C, 0x00000002, 0x0065B484, 0x00659084, 0x00000003, - 0x0065B49C, 0x00659A9C, 0x0065AA9C, 0x00000003, 0x0065B49C, 0x0065CA9C, - 0x0065869C, 0x00000005, 0x0065B49C, 0x0065D89C, 0x00658E9C, 0x0065C49C, - 0x0065D89C, 0x00000004, 0x0065B69C, 0x0065869C, 0x0065CE9C, 0x0065D89C, - 0x00000006, 0x0065B69C, 0x0065C89C, 0x0065AA9C, 0xA001281C, 0x0027D69C, - 0x0065CA9C, 0x00000004, 0x0065BA9C, 0x0027D69C, 0x00659E9C, 0x0065CA9C, - 0x00000003, 0x0065BA9C, 0x0065829C, 0xA001281C, - // Block 141, offset 0x2340 - 0x00000005, 0x0065BA9C, 0x0065829C, 0xA001281C, 0x00659E9C, 0x0065D89C, - 0x00000004, 0x0065BE9C, 0x0027D69C, 0x00659E9C, 0xA001281C, 0x00000003, - 0x0065BE9C, 0x0027D69C, 0x0065CA9C, 0x00000003, 0x0065C09C, 0x0065769C, - 0x0065D89C, 0x00000004, 0x0065C89C, 0x00659A9C, 0x00659E9C, 0x0065CA9C, - 0x00000005, 0x0065CA9C, 0x0027D69C, 0x0065AE9C, 0xA001281C, 0x0065CA9C, - 0x00000004, 0x0065CA9C, 0x0065AC9C, 0xA001291C, 0x0027D69C, 0x00000006, - 0x0065CC9C, 0x0065D89C, 0x00659E9C, 0x0065889C, 0xA001281C, 0x0065D89C, - 0x00000002, 0x0065D091, 0xA0812802, 0x00000003, 0x0065D09C, 0x00659A9C, - 0x00659E9C, 0x00000002, 0x0065D291, 0xA0812802, 0x00000002, 0x0065D491, - 0xA0812802, 0x00000002, 0x0065D691, 0xA0812802, 0x00000002, 0x0065DA84, - 0xA0013A04, 0x00000002, 0x0065EC84, 0xA0013A04, - // Block 142, offset 0x2380 - 0x00000002, 0x0065F684, 0xA0013A04, 0x00000002, 0x00660684, 0xA0013A04, - 0x00000002, 0x00661284, 0xA0013A04, 0x00000002, 0x00661484, 0xA0013A04, - 0x00000002, 0x00661C84, 0xA0013A04, 0x00000002, 0x00661E84, 0xA0013A04, - 0x00000002, 0x00662284, 0xA0013A04, 0x00000002, 0x00663884, 0xA0013A04, - 0x00000002, 0x00663896, 0xA0013A16, 0x00000002, 0x00663A84, 0xA0013A04, - 0x00000002, 0x00663A84, 0xA0013C04, 0x00000002, 0x0075C284, 0xA0013904, - 0x00000002, 0x00862084, 0xA0013904, 0x00000002, 0x00862284, 0xA0013904, - 0x00000002, 0x00862484, 0xA0013904, 0x00000002, 0x00862684, 0xA0013904, - 0x00000002, 0x00862884, 0xA0013904, 0x00000002, 0x00862A84, 0xA0013904, - 0x00000002, 0x00862C84, 0xA0013904, 0x00000002, 0x00862C84, 0xA0013A04, - 0x00000002, 0x00862E84, 0xA0013904, 0x00000002, - // Block 143, offset 0x23c0 - 0x00863084, 0xA0013904, 0x00000002, 0x00863284, 0xA0013904, 0x00000002, - 0x00863284, 0xA0013A04, 0x00000002, 0x00863484, 0xA0013904, 0x00000002, - 0x00863484, 0xA0013A04, 0x00000002, 0x00863684, 0xA0013904, 0x00000002, - 0x00863684, 0xA0013A04, 0x00000002, 0x00863884, 0xA0013904, 0x00000002, - 0x00863A84, 0xA0013904, 0x00000002, 0x00863C84, 0xA0013904, 0x00000002, - 0x00863E84, 0xA0013904, 0x00000002, 0x00863E84, 0xA0013A04, 0x00000002, - 0x00863E84, 0xA0013C04, 0x00000002, 0x00864084, 0xA0013904, 0x00000002, - 0x00864284, 0xA0013904, 0x00000002, 0x00864484, 0xA0013904, 0x00000002, - 0x00864684, 0xA0013904, 0x00000002, 0x00864684, 0xA0013A04, 0x00000002, - 0x00864884, 0xA0013904, 0x00000002, 0x00864884, 0xA0013A04, 0x00000002, - 0x00864A84, 0xA0013904, 0x00000002, 0x00864C84, - // Block 144, offset 0x2400 - 0xA0013904, 0x00000002, 0x029C6C84, 0xA0013904, 0x00000002, 0x029CB284, - 0xA0013904, 0x00000002, 0x02A30484, 0xA0013904, 0x00000002, 0x02A3C084, - 0xA0013904, 0x00000002, 0x02A40084, 0xA0013904, 0x00000002, 0x02A6B884, - 0xA0013904, 0x00000002, 0x02A6D284, 0xA0013904, 0x00000002, 0x02A70484, - 0xA0013904, 0x00000002, 0x02B81E84, 0xA0013904, 0x00000002, 0x02B81E84, - 0xA0013A04, 0x00000002, 0x02B84484, 0xA0013904, 0x00000002, 0x02B84684, - 0xA0013904, 0x00000002, 0x02BEA084, 0xA0013904, 0x00000002, 0x02BF8684, - 0xA0013904, 0x00000002, 0x02CBCA84, 0xA0013904, 0x00000002, 0x02CE1084, - 0xA0013904, 0x00000004, 0x02D0549C, 0x02BE1E9C, 0x029E349C, 0x02F27C9C, - 0x00000002, 0x02D6F484, 0xA0013904, 0x00000002, 0x02E45684, 0xA0013904, - 0x00000002, 0x02E4B684, 0xA0013904, 0x00000002, - // Block 145, offset 0x2440 - 0x02E71684, 0xA0013904, 0x00000002, 0x02EB1684, 0xA0013904, 0x00000002, - 0x02EDDC84, 0xA0013904, 0x00000002, 0x02F27484, 0xA0013904, 0x00000002, - 0x02F5F284, 0xA0013904, 0x00000002, 0x02FEA484, 0xA0013904, 0x00000002, - 0x02FEA684, 0xA0013904, 0x00000002, 0x02FEA684, 0xA0013A04, 0x00000002, - 0x02FF1484, 0xA0013904, 0x00000002, 0x02FF1484, 0xA0013A04, 0x00000002, - 0x0300FE84, 0xA0013904, 0x00000002, 0x03011284, 0xA0013904, 0x00000002, - 0x0303F884, 0xA0013904, 0x00000002, 0x0304F284, 0xA0013904, 0x00000002, - 0x0304F284, 0xA0013A04, 0x00000002, 0x0313A484, 0xA0013904, 0x00000002, - 0x031B6684, 0xA0013904, 0x00000002, 0x031F6C84, 0xA0013904, 0x00000002, - 0x031F6C84, 0xA0013A04, 0x00000002, 0x03212284, 0xA0013904, 0x00000002, - 0x032C3884, 0xA0013904, 0x00000002, 0x032DD084, - // Block 146, offset 0x2480 - 0xA0013904, 0x00000002, 0x0331C084, 0xA0013904, 0x00000002, 0x03332C84, - 0xA0013904, 0x00000002, 0x03355084, 0xA0013904, 0x00000002, 0x03367884, - 0xA0013904, 0x00000002, 0x033CEA84, 0xA0013904, 0x00000002, 0x033E9484, - 0xA0013904, 0x00000002, 0x033EA484, 0xA0013904, 0x00000002, 0x033F1A84, - 0xA0013904, 0x00000002, 0x033F3884, 0xA0013904, 0x00000002, 0x033F3884, - 0xA0013A04, 0x00000003, 0x0003F484, 0x002C9884, 0x0003F69F, 0x00000003, - 0x0003F484, 0x002C988A, 0x0003F69F, 0x00000003, 0x0003F484, 0x002D6884, - 0x0003F69F, 0x00000003, 0x0003F484, 0x002D688A, 0x0003F69F, 0x00000003, - 0x0003F484, 0x002D9A84, 0x0003F69F, 0x00000003, 0x0003F484, 0x002D9A8A, - 0x0003F69F, 0x00000003, 0x0003F484, 0x002DFE84, 0x0003F69F, 0x00000003, - 0x0003F484, 0x002DFE8A, 0x0003F69F, 0x00000003, - // Block 147, offset 0x24c0 - 0x0003F484, 0x002EE284, 0x0003F69F, 0x00000003, 0x0003F484, 0x002EE28A, - 0x0003F69F, 0x00000003, 0x0003F484, 0x002F5684, 0x0003F69F, 0x00000003, - 0x0003F484, 0x002F568A, 0x0003F69F, 0x00000003, 0x0003F484, 0x002F7A84, - 0x0003F69F, 0x00000003, 0x0003F484, 0x002F7A8A, 0x0003F69F, 0x00000003, - 0x0003F484, 0x002FE684, 0x0003F69F, 0x00000003, 0x0003F484, 0x002FE68A, - 0x0003F69F, 0x00000003, 0x0003F484, 0x00302C84, 0x0003F69F, 0x00000003, - 0x0003F484, 0x00302C8A, 0x0003F69F, 0x00000003, 0x0003F484, 0x0030F684, - 0x0003F69F, 0x00000003, 0x0003F484, 0x0030F68A, 0x0003F69F, 0x00000003, - 0x0004B084, 0x002FE68A, 0x0004B29F, 0x00000002, 0x002C0A9D, 0x002F569C, - 0x00000002, 0x402C0C20, 0xAE604102, 0x00000002, 0x002C0C83, 0xAE604102, - 0x00000002, 0x402C0C20, 0xAE604702, 0x00000002, - // Block 148, offset 0x2500 - 0x402C0C20, 0xAE605202, 0x00000002, 0x002C0C83, 0xAE605202, 0x00000002, - 0x402C0C20, 0xACA05602, 0x00000002, 0x002C0C83, 0xACA05602, 0x00000002, - 0x402C0C20, 0xADC07002, 0x00000002, 0x002C0C83, 0xADC07002, 0x00000002, - 0x402C0C20, 0xADC07702, 0x00000002, 0x002C0C83, 0xADC07702, 0x00000002, - 0x402C0C20, 0xADC07802, 0x00000002, 0x002C0C83, 0xADC07802, 0x00000002, - 0x402C0C20, 0xADC07B02, 0x00000002, 0x002C0C83, 0xADC07B02, 0x00000002, - 0x402C0E20, 0xAE603202, 0x00000002, 0x002C0E83, 0xAE603202, 0x00000003, - 0x402C0E20, 0xAE603202, 0xAE605202, 0x00000003, 0x002C0E83, 0xAE603202, - 0xAE605202, 0x00000002, 0x402C0E20, 0xAE603C02, 0x00000002, 0x002C0E83, - 0xAE603C02, 0x00000002, 0x402C0E20, 0xAE604102, 0x00000002, 0x002C0E83, - 0xAE604102, 0x00000003, 0x402C0E20, 0xAE604102, - // Block 149, offset 0x2540 - 0xAE605202, 0x00000003, 0x002C0E83, 0xAE604102, 0xAE605202, 0x00000002, - 0x402C0E20, 0xAE605202, 0x00000002, 0x002C0E83, 0xAE605202, 0x00000002, - 0x402C0E20, 0xACA05602, 0x00000002, 0x002C0E83, 0xACA05602, 0x00000002, - 0x402C0E20, 0xADC07002, 0x00000002, 0x002C0E83, 0xADC07002, 0x00000003, - 0x402C0E20, 0xADC07002, 0xAE605202, 0x00000003, 0x002C0E83, 0xADC07002, - 0xAE605202, 0x00000002, 0x402C0E20, 0xADC07702, 0x00000002, 0x002C0E83, - 0xADC07702, 0x00000002, 0x402C1020, 0xAE603202, 0x00000002, 0x002C1083, - 0xAE603202, 0x00000002, 0x402C1020, 0xAE603502, 0x00000002, 0x002C1083, - 0xAE603502, 0x00000002, 0x402C1020, 0xAE603702, 0x00000002, 0x002C1083, - 0xAE603702, 0x00000002, 0x402C1020, 0xAE603C02, 0x00000002, 0x002C1083, - 0xAE603C02, 0x00000003, 0x402C1020, 0xAE603C02, - // Block 150, offset 0x2580 - 0xAE603202, 0x00000003, 0x002C1083, 0xAE603C02, 0xAE603202, 0x00000003, - 0x402C1020, 0xAE603C02, 0xAE603502, 0x00000003, 0x002C1083, 0xAE603C02, - 0xAE603502, 0x00000003, 0x402C1020, 0xAE603C02, 0xAE604E02, 0x00000003, - 0x002C1083, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C1020, 0xAE603C02, - 0xAE606402, 0x00000003, 0x002C1083, 0xAE603C02, 0xAE606402, 0x00000002, - 0x402C1020, 0xAE604102, 0x00000002, 0x002C1083, 0xAE604102, 0x00000002, - 0x402C1020, 0xAE604702, 0x00000002, 0x002C1083, 0xAE604702, 0x00000002, - 0x402C1020, 0xAE604E02, 0x00000002, 0x002C1083, 0xAE604E02, 0x00000002, - 0x402C1020, 0xAE605202, 0x00000002, 0x002C1083, 0xAE605202, 0x00000002, - 0x402C1020, 0xACA05602, 0x00000002, 0x002C1083, 0xACA05602, 0x00000003, - 0x402C1020, 0xACA05602, 0xAE603702, 0x00000003, - // Block 151, offset 0x25c0 - 0x002C1083, 0xACA05602, 0xAE603702, 0x00000002, 0x402C1020, 0xACA05902, - 0x00000002, 0x002C1083, 0xACA05902, 0x00000002, 0x402C1020, 0xAE605B02, - 0x00000002, 0x002C1083, 0xAE605B02, 0x00000003, 0x402C1020, 0xAE605B02, - 0xAE603202, 0x00000003, 0x002C1083, 0xAE605B02, 0xAE603202, 0x00000003, - 0x402C1020, 0xAE605B02, 0xAE603502, 0x00000003, 0x002C1083, 0xAE605B02, - 0xAE603502, 0x00000002, 0x402C1020, 0xAE606402, 0x00000002, 0x002C1083, - 0xAE606402, 0x00000002, 0x402C1020, 0xAE606502, 0x00000002, 0x002C1083, - 0xAE606502, 0x00000002, 0x402C1020, 0xAE606702, 0x00000002, 0x002C1083, - 0xAE606702, 0x00000002, 0x402C1020, 0xADC07002, 0x00000002, 0x002C1083, - 0xADC07002, 0x00000003, 0x402C1020, 0xADC07002, 0xAE603C02, 0x00000003, - 0x002C1083, 0xADC07002, 0xAE603C02, 0x00000002, - // Block 152, offset 0x2600 - 0x402C1020, 0xADC07802, 0x00000002, 0x002C1083, 0xADC07802, 0x00000002, - 0x402C1020, 0xADC07A02, 0x00000002, 0x002C1083, 0xADC07A02, 0x00000002, - 0x402C3C20, 0xAE603202, 0x00000002, 0x002C3C83, 0xAE603202, 0x00000002, - 0x402C3C20, 0xAE604102, 0x00000002, 0x002C3C83, 0xAE604102, 0x00000002, - 0x402C3C20, 0xACA05602, 0x00000002, 0x002C3C83, 0xACA05602, 0x00000002, - 0x402C3C20, 0xADC07002, 0x00000002, 0x002C3C83, 0xADC07002, 0x00000002, - 0x402C3C20, 0xADC07B02, 0x00000002, 0x002C3C83, 0xADC07B02, 0x00000002, - 0x402C3E20, 0xAE604702, 0x00000002, 0x002C3E83, 0xAE604702, 0x00000002, - 0x402C3E20, 0xAE605202, 0x00000002, 0x002C3E83, 0xAE605202, 0x00000002, - 0x402C4020, 0xAE603202, 0x00000002, 0x002C4083, 0xAE603202, 0x00000002, - 0x402C4020, 0xAE603502, 0x00000002, 0x002C4083, - // Block 153, offset 0x2640 - 0xAE603502, 0x00000002, 0x402C4020, 0xAE603702, 0x00000002, 0x002C4083, - 0xAE603702, 0x00000002, 0x402C4020, 0xAE603C02, 0x00000002, 0x002C4083, - 0xAE603C02, 0x00000002, 0x402C4020, 0xAE604102, 0x00000002, 0x002C4083, - 0xAE604102, 0x00000002, 0x402C4020, 0xAE604702, 0x00000002, 0x002C4083, - 0xAE604702, 0x00000003, 0x402C4020, 0xAE604702, 0xAE603202, 0x00000003, - 0x002C4083, 0xAE604702, 0xAE603202, 0x00000002, 0x402C4020, 0xAE604E02, - 0x00000002, 0x002C4083, 0xAE604E02, 0x00000002, 0x002C4083, 0xAE605202, - 0x00000002, 0x402C4020, 0xACA05902, 0x00000002, 0x002C4083, 0xACA05902, - 0x00000002, 0x402C4020, 0xAE605B02, 0x00000002, 0x002C4083, 0xAE605B02, - 0x00000002, 0x402C4020, 0xAE606402, 0x00000002, 0x002C4083, 0xAE606402, - 0x00000002, 0x402C4020, 0xAE606502, 0x00000002, - // Block 154, offset 0x2680 - 0x002C4083, 0xAE606502, 0x00000002, 0x402C4020, 0xAE606702, 0x00000002, - 0x002C4083, 0xAE606702, 0x00000002, 0x402C4020, 0xADC07002, 0x00000002, - 0x002C4083, 0xADC07002, 0x00000002, 0x402C4020, 0xADC07A02, 0x00000002, - 0x002C4083, 0xADC07A02, 0x00000002, 0x402C6620, 0xAE603202, 0x00000002, - 0x002C6683, 0xAE603202, 0x00000002, 0x402C6620, 0xAE604102, 0x00000002, - 0x002C6683, 0xAE604102, 0x00000002, 0x402C6620, 0xAE605202, 0x00000002, - 0x002C6683, 0xAE605202, 0x00000002, 0x402C6620, 0xACA05602, 0x00000002, - 0x002C6683, 0xACA05602, 0x00000002, 0x402C6620, 0xAE606502, 0x00000002, - 0x002C6683, 0xAE606502, 0x00000002, 0x402C6620, 0xAE606702, 0x00000002, - 0x002C6683, 0xAE606702, 0x00000002, 0x402C6620, 0xADC07002, 0x00000002, - 0x002C6683, 0xADC07002, 0x00000003, 0x402C6620, - // Block 155, offset 0x26c0 - 0xADC07002, 0xAE605B02, 0x00000003, 0x002C6683, 0xADC07002, 0xAE605B02, - 0x00000002, 0x402C6620, 0xADC07B02, 0x00000002, 0x002C6683, 0xADC07B02, - 0x00000002, 0x002C989C, 0x0030BE9D, 0x00000002, 0x002D0884, 0x002D9A84, - 0x00000002, 0x402D2420, 0xAE603202, 0x00000002, 0x002D2483, 0xAE603202, - 0x00000002, 0x402D2420, 0xAE603502, 0x00000002, 0x002D2483, 0xAE603502, - 0x00000002, 0x402D2420, 0xAE603702, 0x00000002, 0x002D2483, 0xAE603702, - 0x00000002, 0x402D2420, 0xAE603C02, 0x00000002, 0x002D2483, 0xAE603C02, - 0x00000003, 0x402D2420, 0xAE603C02, 0xAE603202, 0x00000003, 0x002D2483, - 0xAE603C02, 0xAE603202, 0x00000003, 0x402D2420, 0xAE603C02, 0xAE603502, - 0x00000003, 0x002D2483, 0xAE603C02, 0xAE603502, 0x00000003, 0x402D2420, - 0xAE603C02, 0xAE604E02, 0x00000003, 0x002D2483, - // Block 156, offset 0x2700 - 0xAE603C02, 0xAE604E02, 0x00000003, 0x402D2420, 0xAE603C02, 0xAE606402, - 0x00000003, 0x002D2483, 0xAE603C02, 0xAE606402, 0x00000002, 0x402D2420, - 0xAE604102, 0x00000002, 0x002D2483, 0xAE604102, 0x00000002, 0x402D2420, - 0xAE604702, 0x00000002, 0x002D2483, 0xAE604702, 0x00000003, 0x402D2420, - 0xAE604702, 0xAE605B02, 0x00000003, 0x002D2483, 0xAE604702, 0xAE605B02, - 0x00000002, 0x402D2420, 0xAE604D02, 0x00000002, 0x002D2483, 0xAE604D02, - 0x00000002, 0x402D2420, 0xAE604E02, 0x00000002, 0x002D2483, 0xAE604E02, - 0x00000003, 0x402D2420, 0xAE604E02, 0xAE603202, 0x00000003, 0x002D2483, - 0xAE604E02, 0xAE603202, 0x00000003, 0x402D2420, 0xAE604E02, 0xAE604702, - 0x00000003, 0x002D2483, 0xAE604E02, 0xAE604702, 0x00000003, 0x402D2420, - 0xAE604E02, 0xAE605B02, 0x00000003, 0x002D2483, - // Block 157, offset 0x2740 - 0xAE604E02, 0xAE605B02, 0x00000002, 0x402D2420, 0xAE605202, 0x00000002, - 0x002D2483, 0xAE605202, 0x00000003, 0x402D2420, 0xAE605202, 0xAE605B02, - 0x00000003, 0x002D2483, 0xAE605202, 0xAE605B02, 0x00000002, 0x402D2420, - 0xACA05902, 0x00000002, 0x002D2483, 0xACA05902, 0x00000003, 0x402D2420, - 0xACA05902, 0xAE605B02, 0x00000003, 0x002D2483, 0xACA05902, 0xAE605B02, - 0x00000002, 0x402D2420, 0xAE605B02, 0x00000002, 0x002D2483, 0xAE605B02, - 0x00000003, 0x402D2420, 0xAE605B02, 0xAE603202, 0x00000003, 0x002D2483, - 0xAE605B02, 0xAE603202, 0x00000003, 0x402D2420, 0xAE605B02, 0xAE603502, - 0x00000003, 0x002D2483, 0xAE605B02, 0xAE603502, 0x00000002, 0x402D2420, - 0xAE606402, 0x00000002, 0x002D2483, 0xAE606402, 0x00000002, 0x402D2420, - 0xAE606502, 0x00000002, 0x002D2483, 0xAE606502, - // Block 158, offset 0x2780 - 0x00000002, 0x402D2420, 0xAE606702, 0x00000002, 0x002D2483, 0xAE606702, - 0x00000002, 0x402D2420, 0xAD806802, 0x00000002, 0x002D2483, 0xAD806802, - 0x00000003, 0x402D2420, 0xAD806802, 0xAE603202, 0x00000003, 0x002D2483, - 0xAD806802, 0xAE603202, 0x00000003, 0x402D2420, 0xAD806802, 0xAE603502, - 0x00000003, 0x002D2483, 0xAD806802, 0xAE603502, 0x00000003, 0x402D2420, - 0xAD806802, 0xAE604E02, 0x00000003, 0x002D2483, 0xAD806802, 0xAE604E02, - 0x00000003, 0x402D2420, 0xAD806802, 0xAE606402, 0x00000003, 0x002D2483, - 0xAD806802, 0xAE606402, 0x00000003, 0x402D2420, 0xAD806802, 0xADC07002, - 0x00000003, 0x002D2483, 0xAD806802, 0xADC07002, 0x00000002, 0x402D2420, - 0xADC07002, 0x00000002, 0x002D2483, 0xADC07002, 0x00000003, 0x402D2420, - 0xADC07002, 0xAE603C02, 0x00000003, 0x002D2483, - // Block 159, offset 0x27c0 - 0xADC07002, 0xAE603C02, 0x00000002, 0x002D689C, 0x002BDE9C, 0x00000002, - 0x002D689D, 0x002D229C, 0x00000002, 0x002D689D, 0x002F2C9D, 0x00000002, - 0x002D689D, 0x0030BE9D, 0x00000002, 0x002D689D, 0x00312A9C, 0x00000002, - 0x002D9A84, 0x002D9A9F, 0x00000002, 0x002D9A8A, 0x002D9A9F, 0x00000003, - 0x002D9A84, 0x002D9A84, 0x002D9A9F, 0x00000003, 0x002D9A8A, 0x002D9A8A, - 0x002D9A9F, 0x00000002, 0x002D9A84, 0x002DCC84, 0x00000002, 0x002D9A8A, - 0x002DCC8A, 0x00000002, 0x002D9A9C, 0x002E9E9C, 0x00000002, 0x002D9A9D, - 0x00306C9D, 0x00000002, 0x002D9A84, 0x0030BE9F, 0x00000002, 0x002D9A8A, - 0x0030BE9F, 0x00000002, 0x002D9A84, 0x0030F69F, 0x00000002, 0x002D9A8A, - 0x0030F69F, 0x00000002, 0x002DFE9C, 0x002BDE9D, 0x00000002, 0x002DFE9D, - 0x002C0A9D, 0x00000002, 0x002DFE9C, 0x002D229C, - // Block 160, offset 0x2800 - 0x00000002, 0x002DFE9D, 0x002DFE9D, 0x00000002, 0x002DFE9C, 0x002E229C, - 0x00000002, 0x002DFE9C, 0x002E829C, 0x00000002, 0x002DFE9D, 0x002E829D, - 0x00000002, 0x002DFE9C, 0x00302C9C, 0x00000002, 0x002DFE9C, 0x0030BE9D, - 0x00000002, 0x002DFE9C, 0x0030E29D, 0x00000002, 0x002DFE9C, 0x0032A29D, - 0x00000002, 0x002E229C, 0x0030F69C, 0x00000002, 0x002E829C, 0x002FE69C, - 0x00000002, 0x002E9E8A, 0x002EE284, 0x00000002, 0x002E9E9C, 0x002FE69C, - 0x00000002, 0x002EE29C, 0x0030BE9D, 0x00000002, 0x002F2C9D, 0x002D689D, - 0x00000002, 0x002F2C9D, 0x002F7A9D, 0x00000002, 0x002F2C9C, 0x002FE69C, - 0x00000002, 0x002FE69D, 0x002C629D, 0x00000002, 0x002FE694, 0x002E8294, - 0x00000002, 0x002FE69C, 0x002F7A9C, 0x00000002, 0x002FE69D, 0x002FE69D, - 0x00000002, 0x002FE684, 0x00302C84, 0x00000002, - // Block 161, offset 0x2840 - 0x002FE69D, 0x0030BE9C, 0x00000002, 0x00302C94, 0x002E8294, 0x00000002, - 0x0030BE84, 0x002D9A9F, 0x00000002, 0x0030BE8A, 0x002D9A9F, 0x00000003, - 0x0030BE84, 0x002D9A84, 0x002D9A9F, 0x00000003, 0x0030BE8A, 0x002D9A8A, - 0x002D9A9F, 0x00000002, 0x4030E420, 0xAE603C02, 0x00000002, 0x0030E483, - 0xAE603C02, 0x00000002, 0x4030E420, 0xAE604102, 0x00000002, 0x0030E483, - 0xAE604102, 0x00000002, 0x4030E420, 0xAE604702, 0x00000002, 0x0030E483, - 0xAE604702, 0x00000002, 0x4030E420, 0xAE605202, 0x00000002, 0x0030E483, - 0xAE605202, 0x00000002, 0x4030E420, 0xACA05602, 0x00000002, 0x0030E483, - 0xACA05602, 0x00000002, 0x4030E420, 0xADC07002, 0x00000002, 0x0030E483, - 0xADC07002, 0x00000002, 0x4030E420, 0xADC07902, 0x00000002, 0x0030E483, - 0xADC07902, 0x00000002, 0x4030E420, 0xADC07B02, - // Block 162, offset 0x2880 - 0x00000002, 0x0030F684, 0x002D9A9F, 0x00000002, 0x0030F68A, 0x002D9A9F, - 0x00000003, 0x0030F684, 0x002D9A84, 0x002D9A9F, 0x00000003, 0x0030F68A, - 0x002D9A8A, 0x002D9A9F, 0x00000002, 0x0032769C, 0x002FE69C, 0x00000002, - 0x00393C99, 0x003A8E99, 0x00000002, 0x00393C9A, 0x003A8E9A, 0x00000002, - 0x00395699, 0x003A8E99, 0x00000002, 0x0039569A, 0x003A8E9A, 0x00000002, - 0x00395899, 0x003A8E99, 0x00000002, 0x0039589A, 0x003A8E9A, 0x00000002, - 0x00396499, 0x003A8E99, 0x00000002, 0x0039649A, 0x003A8E9A, 0x00000002, - 0x00397299, 0x003A8E99, 0x00000002, 0x0039729A, 0x003A8E9A, 0x00000002, - 0x00397499, 0x003A8E99, 0x00000002, 0x0039749A, 0x003A8E9A, 0x00000002, - 0x0039C699, 0x003A8E99, 0x00000002, 0x0039C69A, 0x003A8E9A, 0x00000002, - 0x0039C899, 0x003A8E99, 0x00000002, 0x0039C89A, - // Block 163, offset 0x28c0 - 0x003A8E9A, 0x00000002, 0x0039DC99, 0x003A8E99, 0x00000002, 0x0039DC9A, - 0x003A8E9A, 0x00000002, 0x0039DE99, 0x003A8E99, 0x00000002, 0x0039DE9A, - 0x003A8E9A, 0x00000002, 0x0039E699, 0x003A8E99, 0x00000002, 0x0039E69A, - 0x003A8E9A, 0x00000002, 0x0039EE99, 0x003A8E99, 0x00000002, 0x0039EE9A, - 0x003A8E9A, 0x00000002, 0x0039F099, 0x003A8E99, 0x00000002, 0x0039F09A, - 0x003A8E9A, 0x00000002, 0x0039FC99, 0x003A8E99, 0x00000002, 0x0039FC9A, - 0x003A8E9A, 0x00000002, 0x003A1299, 0x003A8E99, 0x00000002, 0x003A129A, - 0x003A8E9A, 0x00000002, 0x003A1A99, 0x003A8E99, 0x00000002, 0x003A1A9A, - 0x003A8E9A, 0x00000002, 0x003A4099, 0x003A8E99, 0x00000002, 0x003A409A, - 0x003A8E9A, 0x00000002, 0x003A4E9A, 0x003A8E9A, 0x00000002, 0x003A5699, - 0x003A8E99, 0x00000002, 0x003A569A, 0x003A8E9A, - // Block 164, offset 0x2900 - 0x00000002, 0x003A689A, 0x003A8E9A, 0x00000002, 0x003A9099, 0x003A8E99, - 0x00000002, 0x003A909A, 0x003A8E9A, 0x00000002, 0x402D6A20, 0xAE604702, - 0x00000002, 0x002D6A83, 0xAE604702, 0x00000002, 0x402D6A20, 0xAE605202, - 0x00000002, 0x002D6A83, 0xAE605202, 0x00000002, 0x002D9883, 0xAE603202, - 0x00000002, 0x002D9883, 0xAE603502, 0x00000002, 0x002D9883, 0xAE603702, - 0x00000002, 0x002D9883, 0xAE603C02, 0x00000002, 0x002D9883, 0xAE604102, - 0x00000002, 0x002D9883, 0xAE604702, 0x00000003, 0x002D9883, 0xAE604702, - 0xAE603202, 0x00000002, 0x002D9883, 0xAE604E02, 0x00000002, 0x002D9883, - 0xACA05902, 0x00000002, 0x002D9883, 0xAE605B02, 0x00000002, 0x002D9883, - 0xAE606402, 0x00000002, 0x002D9883, 0xAE606502, 0x00000002, 0x002D9883, - 0xAE606702, 0x00000002, 0x002D9883, 0xADC07002, - // Block 165, offset 0x2940 - 0x00000002, 0x002D9883, 0xADC07A02, 0x00000002, 0x402EE420, 0xAE604E02, - 0x00000002, 0x002EE483, 0xAE604E02, 0x00000002, 0x402EE420, 0xAE605B02, - 0x00000002, 0x002EE483, 0xAE605B02, 0x00000002, 0x40306E20, 0xAE603202, - 0x00000002, 0x00306E83, 0xAE603202, 0x00000002, 0x40306E20, 0xAE603502, - 0x00000002, 0x00306E83, 0xAE603502, 0x00000002, 0x40306E20, 0xAE604102, - 0x00000002, 0x00306E83, 0xAE604102, 0x00000002, 0x40306E20, 0xAE605B02, - 0x00000002, 0x00306E83, 0xAE605B02, 0x00000002, 0x402FE820, 0xAE605202, - 0x00000002, 0x002FE883, 0xAE605202, 0x00000002, 0x002C6294, 0xA0013914, - 0x00000002, 0x00302C83, 0x402D6820, 0x00000002, 0x00302C89, 0x002D6888, - 0x00000002, 0x40310021, 0xAE603202, 0x00000002, 0x003100A3, 0xAE603202, - 0x00000002, 0x40310021, 0xAE603502, 0x00000002, - // Block 166, offset 0x2980 - 0x003100A3, 0xAE603502, 0x00000002, 0x40310021, 0xAE604102, 0x00000002, - 0x003100A3, 0xAE604102, 0x00000002, 0x40310021, 0xAE605B02, 0x00000002, - 0x003100A3, 0xAE605B02, 0x00000002, 0x40320C20, 0xAE603202, 0x00000002, - 0x00320C83, 0xAE603202, 0x00000002, 0x40320C20, 0xAE605B02, 0x00000002, - 0x00320C83, 0xAE605B02, 0x00000002, 0x40320C21, 0xAE605B02, 0x00000002, - 0x00320CA3, 0xAE605B02, 0x00000002, 0x40320E20, 0xAE603202, 0x00000002, - 0x00320E83, 0xAE603202, 0x00000002, 0x40320E21, 0xAE604E02, 0x00000002, - 0x00320EA3, 0xAE604E02, 0x00000002, 0x40320E21, 0xAE605B02, 0x00000002, - 0x00320EA3, 0xAE605B02, 0x00000002, 0x40321020, 0xAE603202, 0x00000002, - 0x00321083, 0xAE603202, 0x00000002, 0x402BDE21, 0x002C9888, 0x00000002, - 0x002BDEA3, 0x002C9888, 0x00000003, 0x402BDE21, - // Block 167, offset 0x29c0 - 0x002C9888, 0xAE605B02, 0x00000003, 0x002BDEA3, 0x002C9888, 0xAE605B02, - 0x00000002, 0x402EE221, 0x002C9888, 0x00000002, 0x002EE2A3, 0x002C9888, - 0x00000003, 0x402EE221, 0x002C9888, 0xAE604E02, 0x00000003, 0x002EE2A3, - 0x002C9888, 0xAE604E02, 0x00000003, 0x402EE221, 0x002C9888, 0xAE605B02, - 0x00000003, 0x002EE2A3, 0x002C9888, 0xAE605B02, 0x00000002, 0x40306C21, - 0x002C9888, 0x00000002, 0x00306CA3, 0x002C9888, 0x00000003, 0x40306C21, - 0x002C9888, 0xAE603202, 0x00000003, 0x00306CA3, 0x002C9888, 0xAE603202, - 0x00000003, 0x40306C21, 0x002C9888, 0xAE603502, 0x00000003, 0x00306CA3, - 0x002C9888, 0xAE603502, 0x00000003, 0x40306C21, 0x002C9888, 0xAE604102, - 0x00000003, 0x00306CA3, 0x002C9888, 0xAE604102, 0x00000003, 0x40306C21, - 0x002C9888, 0xAE605B02, 0x00000003, 0x00306CA3, - // Block 168, offset 0x2a00 - 0x002C9888, 0xAE605B02, 0x00000002, 0x404A7620, 0x838225B3, 0x00000004, - 0x004A8083, 0x404AB020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004A8084, - 0x404AB020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004A8083, 0x404AB420, - 0x404A8020, 0x404AFA20, 0x00000004, 0x004A8084, 0x404AB420, 0x404A8020, - 0x404AFA20, 0x00000004, 0x004A8083, 0x404AFA20, 0x404A8020, 0x404AFA20, - 0x00000004, 0x004A8084, 0x404AFA20, 0x404A8020, 0x404AFA20, 0x00000002, - 0x404A8020, 0x828225B5, 0x00000004, 0x004AB083, 0x404A8020, 0x404A8020, - 0x404AFA20, 0x00000004, 0x004AB084, 0x404A8020, 0x404A8020, 0x404AFA20, - 0x00000004, 0x004AB083, 0x404A8420, 0x404A8020, 0x404AFA20, 0x00000004, - 0x004AB084, 0x404A8420, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AB083, - 0x404AB820, 0x404A8020, 0x404AFA20, 0x00000004, - // Block 169, offset 0x2a40 - 0x004AB084, 0x404AB820, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AB083, - 0x404AC020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AB084, 0x404AC020, - 0x404A8020, 0x404AFA20, 0x00000004, 0x004AB083, 0x404AC420, 0x404A8020, - 0x404AFA20, 0x00000004, 0x004AB084, 0x404AC420, 0x404A8020, 0x404AFA20, - 0x00000002, 0x404AB020, 0x828225B5, 0x00000002, 0x004AB083, 0x828225B5, - 0x00000004, 0x004AC083, 0x404A8020, 0x404A8020, 0x404AFA20, 0x00000004, - 0x004AC084, 0x404A8020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC083, - 0x404AB020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC084, 0x404AB020, - 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC083, 0x404AFA20, 0x404A8020, - 0x404AFA20, 0x00000004, 0x004AC084, 0x404AFA20, 0x404A8020, 0x404AFA20, - 0x00000002, 0x404AC020, 0x828225B5, 0x00000004, - // Block 170, offset 0x2a80 - 0x004AC483, 0x404A8420, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC484, - 0x404A8420, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC483, 0x404AB020, - 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC484, 0x404AB020, 0x404A8020, - 0x404AFA20, 0x00000004, 0x004AC483, 0x404AB420, 0x404A8020, 0x404AFA20, - 0x00000004, 0x004AC484, 0x404AB420, 0x404A8020, 0x404AFA20, 0x00000002, - 0x404AD020, 0x828225B5, 0x00000004, 0x004AE083, 0x404A8020, 0x404A8020, - 0x404AFA20, 0x00000004, 0x004AE084, 0x404A8020, 0x404A8020, 0x404AFA20, - 0x00000004, 0x004AE083, 0x404AB020, 0x404A8020, 0x404AFA20, 0x00000004, - 0x004AE084, 0x404AB020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AE083, - 0x404AC020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AE084, 0x404AC020, - 0x404A8020, 0x404AFA20, 0x00000002, 0x404AEA20, - // Block 171, offset 0x2ac0 - 0x8281258B, 0x00000002, 0x404AF020, 0x8281258B, 0x00000002, 0x82822599, - 0x838225B3, 0x00000002, 0x8282259B, 0x828225B5, 0x00000002, 0x828225A3, - 0x828225B5, 0x00000002, 0x838225A3, 0x828225B5, 0x00000002, 0x828225A7, - 0x828225B5, 0x00000002, 0x828225AB, 0x828225B5, 0x00000002, 0x402BDE20, - 0xAE604202, 0x00000002, 0x002BDE88, 0xAE604202, 0x00000003, 0x402BDE20, - 0xAE604202, 0xAE603202, 0x00000003, 0x002BDE88, 0xAE604202, 0xAE603202, - 0x00000003, 0x402BDE20, 0xAE604202, 0xAE603502, 0x00000003, 0x002BDE88, - 0xAE604202, 0xAE603502, 0x00000003, 0x402BDE20, 0xAE604202, 0xAE604E02, - 0x00000003, 0x002BDE88, 0xAE604202, 0xAE604E02, 0x00000003, 0x402BDE20, - 0xAE604202, 0xAE606402, 0x00000003, 0x002BDE88, 0xAE604202, 0xAE606402, - 0x00000003, 0x402BDE20, 0xADC07002, 0xAE604202, - // Block 172, offset 0x2b00 - 0x00000003, 0x002BDE88, 0xADC07002, 0xAE604202, 0x00000002, 0x402C3A20, - 0xAE604202, 0x00000002, 0x002C3A88, 0xAE604202, 0x00000002, 0x402C9820, - 0xAE604202, 0x00000002, 0x002C9888, 0xAE604202, 0x00000003, 0x402C9820, - 0xAE604202, 0xAE603202, 0x00000003, 0x002C9888, 0xAE604202, 0xAE603202, - 0x00000003, 0x402C9820, 0xAE604202, 0xAE603502, 0x00000003, 0x002C9888, - 0xAE604202, 0xAE603502, 0x00000003, 0x402C9820, 0xAE604202, 0xAE604E02, - 0x00000003, 0x002C9888, 0xAE604202, 0xAE604E02, 0x00000003, 0x402C9820, - 0xAE604202, 0xAE606402, 0x00000003, 0x002C9888, 0xAE604202, 0xAE606402, - 0x00000003, 0x402C9820, 0xADC07002, 0xAE604202, 0x00000003, 0x002C9888, - 0xADC07002, 0xAE604202, 0x00000002, 0x402D2220, 0xAE604202, 0x00000002, - 0x002D2288, 0xAE604202, 0x00000002, 0x402D6820, - // Block 173, offset 0x2b40 - 0xAE604202, 0x00000002, 0x002D6888, 0xAE604202, 0x00000002, 0x402D9A20, - 0xAE604202, 0x00000002, 0x002D9A88, 0xAE604202, 0x00000002, 0x402DCC20, - 0xAE604202, 0x00000002, 0x002DCC88, 0xAE604202, 0x00000002, 0x402EE220, - 0xAE604202, 0x00000002, 0x002EE288, 0xAE604202, 0x00000003, 0x402EE220, - 0xAE604202, 0xAE603202, 0x00000003, 0x002EE288, 0xAE604202, 0xAE603202, - 0x00000003, 0x402EE220, 0xAE604202, 0xAE603502, 0x00000003, 0x002EE288, - 0xAE604202, 0xAE603502, 0x00000003, 0x402EE220, 0xAE604202, 0xAE604E02, - 0x00000003, 0x002EE288, 0xAE604202, 0xAE604E02, 0x00000003, 0x402EE220, - 0xAE604202, 0xAE606402, 0x00000003, 0x002EE288, 0xAE604202, 0xAE606402, - 0x00000003, 0x402EE220, 0xADC07002, 0xAE604202, 0x00000003, 0x002EE288, - 0xADC07002, 0xAE604202, 0x00000002, 0x402FE620, - // Block 174, offset 0x2b80 - 0xAE604202, 0x00000002, 0x002FE688, 0xAE604202, 0x00000002, 0x40306C20, - 0xAE604202, 0x00000002, 0x00306C88, 0xAE604202, 0x00000002, 0x4030E220, - 0xAE604202, 0x00000002, 0x0030E288, 0xAE604202, 0x00000002, 0x40310020, - 0xAE604202, 0x00000002, 0x00310088, 0xAE604202, 0x00000002, 0x40312A20, - 0xAE604202, 0x00000002, 0x00312A88, 0xAE604202, 0x00000003, 0x00026C84, - 0x00026C84, 0x0009429F, 0x00000002, 0x0002BA84, 0x0002BA9F, 0x00000002, - 0x0002BA84, 0x0002C49F, 0x00000002, 0x0002C484, 0x0002BA9F, 0x00000002, - 0x0002C484, 0x0002C49F, 0x00000002, 0x0002E484, 0x0002E49F, 0x00000002, - 0x0002E496, 0x0002E49F, 0x00000003, 0x0002E484, 0x0002E484, 0x0002E49F, - 0x00000003, 0x0002E496, 0x0002E496, 0x0002E49F, 0x00000003, 0x0003F484, - 0x0029CE84, 0x0003F69F, 0x00000003, 0x0003F484, - // Block 175, offset 0x2bc0 - 0x0029D084, 0x0003F69F, 0x00000003, 0x0003F484, 0x0029D284, 0x0003F69F, - 0x00000003, 0x0003F484, 0x0029D484, 0x0003F69F, 0x00000003, 0x0003F484, - 0x0029D684, 0x0003F69F, 0x00000003, 0x0003F484, 0x0029D884, 0x0003F69F, - 0x00000003, 0x0003F484, 0x0029DA84, 0x0003F69F, 0x00000003, 0x0003F484, - 0x0029DC84, 0x0003F69F, 0x00000003, 0x0003F484, 0x0029DE84, 0x0003F69F, - 0x00000003, 0x0003F484, 0x002BDE84, 0x0003F69F, 0x00000003, 0x0003F484, - 0x002BDE8A, 0x0003F69F, 0x00000003, 0x0003F484, 0x002C0A84, 0x0003F69F, - 0x00000003, 0x0003F484, 0x002C0A8A, 0x0003F69F, 0x00000003, 0x0003F484, - 0x002C3A84, 0x0003F69F, 0x00000003, 0x0003F484, 0x002C3A8A, 0x0003F69F, - 0x00000003, 0x0003F484, 0x002C6284, 0x0003F69F, 0x00000003, 0x0003F484, - 0x002C628A, 0x0003F69F, 0x00000003, 0x0003F484, - // Block 176, offset 0x2c00 - 0x002D0884, 0x0003F69F, 0x00000003, 0x0003F484, 0x002D088A, 0x0003F69F, - 0x00000003, 0x0003F484, 0x002D2284, 0x0003F69F, 0x00000003, 0x0003F484, - 0x002D228A, 0x0003F69F, 0x00000003, 0x0003F484, 0x002DCC84, 0x0003F69F, - 0x00000003, 0x0003F484, 0x002DCC8A, 0x0003F69F, 0x00000003, 0x0003F484, - 0x002E2284, 0x0003F69F, 0x00000003, 0x0003F484, 0x002E228A, 0x0003F69F, - 0x00000003, 0x0003F484, 0x002E8284, 0x0003F69F, 0x00000003, 0x0003F484, - 0x002E828A, 0x0003F69F, 0x00000003, 0x0003F484, 0x002E9E84, 0x0003F69F, - 0x00000003, 0x0003F484, 0x002E9E8A, 0x0003F69F, 0x00000003, 0x0003F484, - 0x002F2C84, 0x0003F69F, 0x00000003, 0x0003F484, 0x002F2C8A, 0x0003F69F, - 0x00000003, 0x0003F484, 0x00306C84, 0x0003F69F, 0x00000003, 0x0003F484, - 0x00306C8A, 0x0003F69F, 0x00000003, 0x0003F484, - // Block 177, offset 0x2c40 - 0x0030BE84, 0x0003F69F, 0x00000003, 0x0003F484, 0x0030BE8A, 0x0003F69F, - 0x00000003, 0x0003F484, 0x0030E284, 0x0003F69F, 0x00000003, 0x0003F484, - 0x0030E28A, 0x0003F69F, 0x00000003, 0x0003F484, 0x00310084, 0x0003F69F, - 0x00000003, 0x0003F484, 0x0031008A, 0x0003F69F, 0x00000003, 0x0003F484, - 0x00312A84, 0x0003F69F, 0x00000003, 0x0003F484, 0x00312A8A, 0x0003F69F, - 0x00000003, 0x0003F484, 0x0062AC84, 0x0003F69F, 0x00000003, 0x0003F484, - 0x0062B084, 0x0003F69F, 0x00000003, 0x0003F484, 0x0062B284, 0x0003F69F, - 0x00000003, 0x0003F484, 0x0062B684, 0x0003F69F, 0x00000003, 0x0003F484, - 0x0062B884, 0x0003F69F, 0x00000003, 0x0003F484, 0x0062BA84, 0x0003F69F, - 0x00000003, 0x0003F484, 0x0062BE84, 0x0003F69F, 0x00000003, 0x0003F484, - 0x0062C284, 0x0003F69F, 0x00000003, 0x0003F484, - // Block 178, offset 0x2c80 - 0x0062C484, 0x0003F69F, 0x00000003, 0x0003F484, 0x0062C884, 0x0003F69F, - 0x00000003, 0x0003F484, 0x0062CA84, 0x0003F69F, 0x00000003, 0x0003F484, - 0x0062CC84, 0x0003F69F, 0x00000003, 0x0003F484, 0x0062CE84, 0x0003F69F, - 0x00000003, 0x0003F484, 0x0062D084, 0x0003F69F, 0x00000003, 0x0003F484, - 0x029C0084, 0x0003F69F, 0x00000003, 0x0003F484, 0x029C0684, 0x0003F69F, - 0x00000003, 0x0003F484, 0x029C1284, 0x0003F69F, 0x00000003, 0x0003F484, - 0x029CBA84, 0x0003F69F, 0x00000003, 0x0003F484, 0x029D1884, 0x0003F69F, - 0x00000003, 0x0003F484, 0x029D2884, 0x0003F69F, 0x00000003, 0x0003F484, - 0x029DC684, 0x0003F69F, 0x00000003, 0x0003F484, 0x029E0284, 0x0003F69F, - 0x00000003, 0x0003F484, 0x029E2284, 0x0003F69F, 0x00000003, 0x0003F484, - 0x02A2D684, 0x0003F69F, 0x00000003, 0x0003F484, - // Block 179, offset 0x2cc0 - 0x02A2DA84, 0x0003F69F, 0x00000003, 0x0003F484, 0x02A56884, 0x0003F69F, - 0x00000003, 0x0003F484, 0x02A68284, 0x0003F69F, 0x00000003, 0x0003F484, - 0x02A6A884, 0x0003F69F, 0x00000003, 0x0003F484, 0x02A81A84, 0x0003F69F, - 0x00000003, 0x0003F484, 0x02A8F884, 0x0003F69F, 0x00000003, 0x0003F484, - 0x02ADB684, 0x0003F69F, 0x00000003, 0x0003F484, 0x02AE3E84, 0x0003F69F, - 0x00000003, 0x0003F484, 0x02B6CC84, 0x0003F69F, 0x00000003, 0x0003F484, - 0x02CBCA84, 0x0003F69F, 0x00000003, 0x0003F484, 0x02CE1084, 0x0003F69F, - 0x00000003, 0x0003F484, 0x02CE1284, 0x0003F69F, 0x00000003, 0x0003F484, - 0x02CE5084, 0x0003F69F, 0x00000003, 0x0003F484, 0x02D05484, 0x0003F69F, - 0x00000003, 0x0003F484, 0x02D86884, 0x0003F69F, 0x00000003, 0x0003F484, - 0x02E0D684, 0x0003F69F, 0x00000003, 0x0003F484, - // Block 180, offset 0x2d00 - 0x02E4F284, 0x0003F69F, 0x00000003, 0x0003F484, 0x02EDC684, 0x0003F69F, - 0x00000003, 0x0003F484, 0x02F27C84, 0x0003F69F, 0x00000003, 0x0003F484, - 0x02F2BA84, 0x0003F69F, 0x00000003, 0x0003F484, 0x02F2DA84, 0x0003F69F, - 0x00000003, 0x0003F484, 0x0303D484, 0x0003F69F, 0x00000003, 0x0003F484, - 0x0303E684, 0x0003F69F, 0x00000003, 0x0003F484, 0x03194284, 0x0003F69F, - 0x00000003, 0x0003F484, 0x03198E84, 0x0003F69F, 0x00000003, 0x0003F484, - 0x0323A284, 0x0003F69F, 0x00000002, 0x00070484, 0x002C3A8A, 0x00000002, - 0x00070484, 0x002D088A, 0x00000002, 0x00094284, 0x0009429F, 0x00000003, - 0x00094284, 0x00094284, 0x0009429F, 0x00000002, 0x0029CC84, 0x0002409F, - 0x00000002, 0x0029CC84, 0x0002E49F, 0x00000002, 0x0029CC84, 0x02E1729F, - 0x00000002, 0x0029CE84, 0x0002409F, 0x00000002, - // Block 181, offset 0x2d40 - 0x0029CE84, 0x0002E49F, 0x00000002, 0x0029CE9E, 0x0009589E, 0x00000002, - 0x0029CE86, 0x0029CC86, 0x00000003, 0x0029CE84, 0x0029CC84, 0x0002E49F, - 0x00000003, 0x0029CE84, 0x0029CC84, 0x02CBCA9F, 0x00000003, 0x0029CE84, - 0x0029CC84, 0x02CE109F, 0x00000003, 0x0029CE84, 0x0029CC84, 0x02E1729F, - 0x00000002, 0x0029CE86, 0x0029CE86, 0x00000003, 0x0029CE84, 0x0029CE84, - 0x0002E49F, 0x00000003, 0x0029CE84, 0x0029CE84, 0x02CBCA9F, 0x00000003, - 0x0029CE84, 0x0029CE84, 0x02CE109F, 0x00000003, 0x0029CE84, 0x0029CE84, - 0x02E1729F, 0x00000002, 0x0029CE86, 0x0029D086, 0x00000003, 0x0029CE84, - 0x0029D084, 0x0002E49F, 0x00000003, 0x0029CE84, 0x0029D084, 0x02CBCA9F, - 0x00000003, 0x0029CE84, 0x0029D084, 0x02CE109F, 0x00000003, 0x0029CE84, - 0x0029D084, 0x02E1729F, 0x00000002, 0x0029CE86, - // Block 182, offset 0x2d80 - 0x0029D286, 0x00000003, 0x0029CE84, 0x0029D284, 0x0002E49F, 0x00000003, - 0x0029CE84, 0x0029D284, 0x02CBCA9F, 0x00000003, 0x0029CE84, 0x0029D284, - 0x02E1729F, 0x00000002, 0x0029CE86, 0x0029D486, 0x00000003, 0x0029CE84, - 0x0029D484, 0x0002E49F, 0x00000003, 0x0029CE84, 0x0029D484, 0x02CBCA9F, - 0x00000003, 0x0029CE84, 0x0029D484, 0x02E1729F, 0x00000002, 0x0029CE86, - 0x0029D686, 0x00000003, 0x0029CE84, 0x0029D684, 0x0002E49F, 0x00000003, - 0x0029CE84, 0x0029D684, 0x02CBCA9F, 0x00000003, 0x0029CE84, 0x0029D684, - 0x02E1729F, 0x00000002, 0x0029CE86, 0x0029D886, 0x00000003, 0x0029CE84, - 0x0029D884, 0x0002E49F, 0x00000003, 0x0029CE84, 0x0029D884, 0x02CBCA9F, - 0x00000003, 0x0029CE84, 0x0029D884, 0x02E1729F, 0x00000002, 0x0029CE86, - 0x0029DA86, 0x00000003, 0x0029CE84, 0x0029DA84, - // Block 183, offset 0x2dc0 - 0x0002E49F, 0x00000003, 0x0029CE84, 0x0029DA84, 0x02CBCA9F, 0x00000003, - 0x0029CE84, 0x0029DA84, 0x02E1729F, 0x00000002, 0x0029CE86, 0x0029DC86, - 0x00000003, 0x0029CE84, 0x0029DC84, 0x0002E49F, 0x00000003, 0x0029CE84, - 0x0029DC84, 0x02CBCA9F, 0x00000003, 0x0029CE84, 0x0029DC84, 0x02E1729F, - 0x00000002, 0x0029CE86, 0x0029DE86, 0x00000003, 0x0029CE84, 0x0029DE84, - 0x0002E49F, 0x00000003, 0x0029CE84, 0x0029DE84, 0x02CBCA9F, 0x00000003, - 0x0029CE84, 0x0029DE84, 0x02E1729F, 0x00000002, 0x0029CE84, 0x02CBCA9F, - 0x00000002, 0x0029CE84, 0x02CE109F, 0x00000002, 0x0029CE84, 0x02E1729F, - 0x00000002, 0x0029D084, 0x0002409F, 0x00000002, 0x0029D084, 0x0002E49F, - 0x00000002, 0x0029D086, 0x0029CC86, 0x00000003, 0x0029D084, 0x0029CC84, - 0x0002E49F, 0x00000003, 0x0029D084, 0x0029CC84, - // Block 184, offset 0x2e00 - 0x02CBCA9F, 0x00000003, 0x0029D084, 0x0029CC84, 0x02E1729F, 0x00000002, - 0x0029D086, 0x0029CE86, 0x00000003, 0x0029D084, 0x0029CE84, 0x02CBCA9F, - 0x00000003, 0x0029D084, 0x0029CE84, 0x02E1729F, 0x00000002, 0x0029D086, - 0x0029D086, 0x00000003, 0x0029D084, 0x0029D084, 0x02CBCA9F, 0x00000003, - 0x0029D084, 0x0029D084, 0x02E1729F, 0x00000002, 0x0029D086, 0x0029D286, - 0x00000003, 0x0029D084, 0x0029D284, 0x02CBCA9F, 0x00000003, 0x0029D084, - 0x0029D284, 0x02E1729F, 0x00000002, 0x0029D086, 0x0029D486, 0x00000003, - 0x0029D084, 0x0029D484, 0x02CBCA9F, 0x00000003, 0x0029D084, 0x0029D484, - 0x02E1729F, 0x00000002, 0x0029D086, 0x0029D686, 0x00000003, 0x0029D084, - 0x0029D684, 0x02CBCA9F, 0x00000002, 0x0029D086, 0x0029D886, 0x00000003, - 0x0029D084, 0x0029D884, 0x02CBCA9F, 0x00000002, - // Block 185, offset 0x2e40 - 0x0029D086, 0x0029DA86, 0x00000003, 0x0029D084, 0x0029DA84, 0x02CBCA9F, - 0x00000002, 0x0029D086, 0x0029DC86, 0x00000003, 0x0029D084, 0x0029DC84, - 0x02CBCA9F, 0x00000002, 0x0029D086, 0x0029DE86, 0x00000003, 0x0029D084, - 0x0029DE84, 0x02CBCA9F, 0x00000002, 0x0029D084, 0x02CBCA9F, 0x00000002, - 0x0029D084, 0x02CE109F, 0x00000002, 0x0029D084, 0x02E1729F, 0x00000002, - 0x0029D284, 0x0002409F, 0x00000002, 0x0029D284, 0x0002E49F, 0x00000002, - 0x0029D286, 0x0029CC86, 0x00000003, 0x0029D284, 0x0029CC84, 0x02CBCA9F, - 0x00000002, 0x0029D286, 0x0029CE86, 0x00000003, 0x0029D284, 0x0029CE84, - 0x02CBCA9F, 0x00000002, 0x0029D286, 0x0029D086, 0x00000002, 0x0029D286, - 0x0029D286, 0x00000002, 0x0029D286, 0x0029D486, 0x00000002, 0x0029D286, - 0x0029D686, 0x00000002, 0x0029D286, 0x0029D886, - // Block 186, offset 0x2e80 - 0x00000002, 0x0029D286, 0x0029DA86, 0x00000002, 0x0029D286, 0x0029DC86, - 0x00000002, 0x0029D286, 0x0029DE86, 0x00000002, 0x0029D284, 0x02CBCA9F, - 0x00000002, 0x0029D284, 0x02CE109F, 0x00000002, 0x0029D284, 0x02E1729F, - 0x00000002, 0x0029D484, 0x0002409F, 0x00000002, 0x0029D484, 0x0002E49F, - 0x00000002, 0x0029D486, 0x0029CC86, 0x00000002, 0x0029D486, 0x0029CE86, - 0x00000002, 0x0029D486, 0x0029D086, 0x00000002, 0x0029D486, 0x0029D286, - 0x00000002, 0x0029D486, 0x0029D486, 0x00000002, 0x0029D486, 0x0029D686, - 0x00000002, 0x0029D486, 0x0029D886, 0x00000002, 0x0029D486, 0x0029DA86, - 0x00000002, 0x0029D486, 0x0029DC86, 0x00000002, 0x0029D486, 0x0029DE86, - 0x00000002, 0x0029D484, 0x02CBCA9F, 0x00000002, 0x0029D484, 0x02CE109F, - 0x00000002, 0x0029D484, 0x02E1729F, 0x00000002, - // Block 187, offset 0x2ec0 - 0x0029D684, 0x0002409F, 0x00000002, 0x0029D684, 0x0002E49F, 0x00000002, - 0x0029D686, 0x0029CC86, 0x00000002, 0x0029D684, 0x02CBCA9F, 0x00000002, - 0x0029D684, 0x02CE109F, 0x00000002, 0x0029D684, 0x02E1729F, 0x00000002, - 0x0029D884, 0x0002409F, 0x00000002, 0x0029D884, 0x0002E49F, 0x00000002, - 0x0029D884, 0x02CBCA9F, 0x00000002, 0x0029D884, 0x02CE109F, 0x00000002, - 0x0029D884, 0x02E1729F, 0x00000002, 0x0029DA84, 0x0002409F, 0x00000002, - 0x0029DA84, 0x0002E49F, 0x00000002, 0x0029DA84, 0x02CBCA9F, 0x00000002, - 0x0029DA84, 0x02CE109F, 0x00000002, 0x0029DA84, 0x02E1729F, 0x00000002, - 0x0029DC84, 0x0002409F, 0x00000002, 0x0029DC84, 0x0002E49F, 0x00000002, - 0x0029DC84, 0x02CBCA9F, 0x00000002, 0x0029DC84, 0x02CE109F, 0x00000002, - 0x0029DC84, 0x02E1729F, 0x00000002, 0x0029DE84, - // Block 188, offset 0x2f00 - 0x0002409F, 0x00000002, 0x0029DE84, 0x0002E49F, 0x00000002, 0x0029DE84, - 0x02CBCA9F, 0x00000002, 0x0029DE84, 0x02CE109F, 0x00000002, 0x0029DE84, - 0x02E1729F, 0x00000002, 0x002BDE9D, 0x00306C9D, 0x00000002, 0x002BDE84, - 0x0031E284, 0x00000002, 0x402C1820, 0xA0105402, 0x00000002, 0x402C1A20, - 0xA0105402, 0x00000002, 0x402C1C20, 0xA0105402, 0x00000002, 0x402C2220, - 0xAE603202, 0x00000002, 0x402C2220, 0xAE603502, 0x00000002, 0x402C2220, - 0xAE603702, 0x00000003, 0x402C2220, 0xAE603702, 0xAE603202, 0x00000003, - 0x402C2220, 0xAE603702, 0xAE603502, 0x00000003, 0x402C2220, 0xAE603702, - 0xAE604E02, 0x00000003, 0x402C2220, 0xAE603702, 0xAE606402, 0x00000002, - 0x402C2220, 0xAE603C02, 0x00000003, 0x402C2220, 0xAE603C02, 0xAE603202, - 0x00000003, 0x402C2220, 0xAE603C02, 0xAE603502, - // Block 189, offset 0x2f40 - 0x00000003, 0x402C2220, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C2220, - 0xAE603C02, 0xAE606402, 0x00000002, 0x402C2220, 0xAE604102, 0x00000002, - 0x402C2220, 0xAE604302, 0x00000003, 0x402C2220, 0xAE604302, 0xAE603202, - 0x00000002, 0x402C2220, 0xAE604702, 0x00000003, 0x402C2220, 0xAE604702, - 0xAE605B02, 0x00000002, 0x402C2220, 0xAE604E02, 0x00000002, 0x402C2220, - 0xAE605202, 0x00000003, 0x402C2220, 0xAE605202, 0xAE605B02, 0x00000002, - 0x402C2220, 0xACA05902, 0x00000002, 0x402C2220, 0xAE605B02, 0x00000002, - 0x402C2220, 0xAE606402, 0x00000002, 0x402C2220, 0xAE606502, 0x00000002, - 0x402C2220, 0xAE606702, 0x00000002, 0x402C2220, 0xADC07002, 0x00000003, - 0x402C2220, 0xADC07002, 0xAE603702, 0x00000003, 0x402C2220, 0xADC07002, - 0xAE603C02, 0x00000002, 0x402C2220, 0xADC07602, - // Block 190, offset 0x2f80 - 0x00000002, 0x402C2420, 0xAE605202, 0x00000002, 0x402C2420, 0xADC07002, - 0x00000002, 0x402C2420, 0xADC07B02, 0x00000002, 0x402C2620, 0xAE603202, - 0x00000002, 0x402C2620, 0xAE603C02, 0x00000002, 0x402C2620, 0xAE604102, - 0x00000002, 0x402C2620, 0xAE605202, 0x00000002, 0x402C2620, 0xACA05602, - 0x00000003, 0x402C2620, 0xACA05602, 0xAE603202, 0x00000002, 0x402C2820, - 0xAE604102, 0x00000002, 0x402C2820, 0xAE605202, 0x00000002, 0x402C2820, - 0xACA05602, 0x00000002, 0x402C2820, 0xADC07002, 0x00000002, 0x402C2820, - 0xADC07802, 0x00000002, 0x402C2820, 0xADC07B02, 0x00000002, 0x402C2A20, - 0xAE603202, 0x00000002, 0x402C2A20, 0xAE603502, 0x00000002, 0x402C2A20, - 0xAE603702, 0x00000002, 0x402C2A20, 0xAE603C02, 0x00000003, 0x402C2A20, - 0xAE603C02, 0xAE603202, 0x00000003, 0x402C2A20, - // Block 191, offset 0x2fc0 - 0xAE603C02, 0xAE603502, 0x00000003, 0x402C2A20, 0xAE603C02, 0xAE604E02, - 0x00000003, 0x402C2A20, 0xAE603C02, 0xAE606402, 0x00000002, 0x402C2A20, - 0xAE604102, 0x00000002, 0x402C2A20, 0xAE604702, 0x00000002, 0x402C2A20, - 0xAE604E02, 0x00000002, 0x402C2A20, 0xAE605202, 0x00000002, 0x402C2A20, - 0xACA05602, 0x00000003, 0x402C2A20, 0xACA05602, 0xAE603702, 0x00000002, - 0x402C2A20, 0xACA05902, 0x00000002, 0x402C2A20, 0xAE605B02, 0x00000003, - 0x402C2A20, 0xAE605B02, 0xAE603202, 0x00000003, 0x402C2A20, 0xAE605B02, - 0xAE603502, 0x00000002, 0x402C2A20, 0xAE606402, 0x00000002, 0x402C2A20, - 0xAE606502, 0x00000002, 0x402C2A20, 0xAE606702, 0x00000002, 0x402C2A20, - 0xADC07002, 0x00000003, 0x402C2A20, 0xADC07002, 0xAE603C02, 0x00000002, - 0x402C2A20, 0xADC07802, 0x00000002, 0x402C2A20, - // Block 192, offset 0x3000 - 0xADC07A02, 0x00000002, 0x402C2C20, 0xAE605202, 0x00000002, 0x402C2E20, - 0xAE603202, 0x00000002, 0x402C2E20, 0xAE603702, 0x00000002, 0x402C2E20, - 0xAE603C02, 0x00000002, 0x402C2E20, 0xAE604102, 0x00000002, 0x402C2E20, - 0xAE605202, 0x00000002, 0x402C2E20, 0xACA05602, 0x00000002, 0x402C2E20, - 0xAE605B02, 0x00000002, 0x402C3020, 0xAE603C02, 0x00000002, 0x402C3020, - 0xAE604102, 0x00000002, 0x402C3020, 0xAE604702, 0x00000002, 0x402C3020, - 0xAE605202, 0x00000002, 0x402C3020, 0xACA05602, 0x00000002, 0x402C3020, - 0xADC07002, 0x00000002, 0x402C3020, 0xADC07902, 0x00000002, 0x402C3220, - 0xAE603202, 0x00000002, 0x402C3220, 0xAE603502, 0x00000002, 0x402C3220, - 0xAE603702, 0x00000002, 0x402C3220, 0xAE603C02, 0x00000002, 0x402C3220, - 0xAE604102, 0x00000002, 0x402C3220, 0xAE604702, - // Block 193, offset 0x3040 - 0x00000003, 0x402C3220, 0xAE604702, 0xAE603202, 0x00000002, 0x402C3220, - 0xAE604E02, 0x00000002, 0x402C3220, 0xAE605202, 0x00000002, 0x402C3220, - 0xACA05902, 0x00000002, 0x402C3220, 0xAE605B02, 0x00000002, 0x402C3220, - 0xAE606402, 0x00000002, 0x402C3220, 0xAE606502, 0x00000002, 0x402C3220, - 0xAE606702, 0x00000002, 0x402C3220, 0xADC07002, 0x00000002, 0x402C3220, - 0xADC07A02, 0x00000002, 0x402C3420, 0xAE603C02, 0x00000002, 0x402C3620, - 0xAE603202, 0x00000002, 0x402C3620, 0xAE604102, 0x00000002, 0x402C3620, - 0xACA05602, 0x00000002, 0x402C3620, 0xADC07002, 0x00000002, 0x402C3620, - 0xADC07B02, 0x00000002, 0x402C3820, 0xAE603202, 0x00000002, 0x402C3820, - 0xAE604102, 0x00000002, 0x402C3820, 0xACA05602, 0x00000002, 0x402C3820, - 0xADC07002, 0x00000003, 0x402C3820, 0xADC07002, - // Block 194, offset 0x3080 - 0xAE605B02, 0x00000002, 0x402C3820, 0xADC07802, 0x00000002, 0x402C3820, - 0xADC07B02, 0x00000002, 0x402C3A20, 0xAE603202, 0x00000002, 0x402C3A20, - 0xAE605202, 0x00000002, 0x402C3A20, 0xADC07002, 0x00000002, 0x002C3A9C, - 0x002C3A9C, 0x00000002, 0x002C3A8C, 0x002C628C, 0x00000002, 0x002C3A9C, - 0x002C629C, 0x00000002, 0x002C3A9C, 0x002E829C, 0x00000002, 0x402C3C20, - 0xAE603202, 0x00000002, 0x402C3C20, 0xAE603502, 0x00000002, 0x402C3C20, - 0xAE604102, 0x00000002, 0x402C3C20, 0xAE604E02, 0x00000002, 0x402C3C20, - 0xAE605202, 0x00000002, 0x402C3C20, 0xACA05602, 0x00000002, 0x402C3C20, - 0xADC07002, 0x00000002, 0x402C3C20, 0xADC07802, 0x00000002, 0x402C3C20, - 0xADC07B02, 0x00000002, 0x402C3E20, 0xAE603202, 0x00000002, 0x402C3E20, - 0xAE603502, 0x00000002, 0x402C3E20, 0xAE603702, - // Block 195, offset 0x30c0 - 0x00000002, 0x402C3E20, 0xAE603C02, 0x00000003, 0x402C3E20, 0xAE603C02, - 0xAE603202, 0x00000003, 0x402C3E20, 0xAE603C02, 0xAE603502, 0x00000003, - 0x402C3E20, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C3E20, 0xAE603C02, - 0xAE606402, 0x00000002, 0x402C3E20, 0xAE604102, 0x00000002, 0x402C3E20, - 0xAE604702, 0x00000003, 0x402C3E20, 0xAE604702, 0xAE605B02, 0x00000002, - 0x402C3E20, 0xAE604D02, 0x00000002, 0x402C3E20, 0xAE604E02, 0x00000003, - 0x402C3E20, 0xAE604E02, 0xAE603202, 0x00000003, 0x402C3E20, 0xAE604E02, - 0xAE604702, 0x00000003, 0x402C3E20, 0xAE604E02, 0xAE605B02, 0x00000002, - 0x402C3E20, 0xAE605202, 0x00000003, 0x402C3E20, 0xAE605202, 0xAE605B02, - 0x00000002, 0x402C3E20, 0xACA05902, 0x00000003, 0x402C3E20, 0xACA05902, - 0xAE605B02, 0x00000002, 0x402C3E20, 0xAE605B02, - // Block 196, offset 0x3100 - 0x00000003, 0x402C3E20, 0xAE605B02, 0xAE603202, 0x00000003, 0x402C3E20, - 0xAE605B02, 0xAE603502, 0x00000002, 0x402C3E20, 0xAE606402, 0x00000002, - 0x402C3E20, 0xAE606502, 0x00000002, 0x402C3E20, 0xAE606702, 0x00000002, - 0x402C3E20, 0xAD806802, 0x00000003, 0x402C3E20, 0xAD806802, 0xAE603202, - 0x00000003, 0x402C3E20, 0xAD806802, 0xAE603502, 0x00000003, 0x402C3E20, - 0xAD806802, 0xAE604E02, 0x00000003, 0x402C3E20, 0xAD806802, 0xAE606402, - 0x00000003, 0x402C3E20, 0xAD806802, 0xADC07002, 0x00000002, 0x402C3E20, - 0xADC07002, 0x00000003, 0x402C3E20, 0xADC07002, 0xAE603C02, 0x00000002, - 0x402C4020, 0xAE603202, 0x00000002, 0x402C4020, 0xAE605202, 0x00000002, - 0x402C4420, 0xAE603202, 0x00000002, 0x402C4420, 0xAE604102, 0x00000002, - 0x402C4420, 0xAE605202, 0x00000002, 0x402C4420, - // Block 197, offset 0x3140 - 0xACA05602, 0x00000002, 0x402C4420, 0xAE606502, 0x00000002, 0x402C4420, - 0xAE606702, 0x00000002, 0x402C4420, 0xADC07002, 0x00000003, 0x402C4420, - 0xADC07002, 0xAE605B02, 0x00000002, 0x402C4420, 0xADC07B02, 0x00000002, - 0x402C4620, 0xAE603202, 0x00000003, 0x402C4620, 0xAE603202, 0xAE605202, - 0x00000002, 0x402C4620, 0xAE603C02, 0x00000002, 0x402C4620, 0xAE604102, - 0x00000003, 0x402C4620, 0xAE604102, 0xAE605202, 0x00000002, 0x402C4620, - 0xAE605202, 0x00000002, 0x402C4620, 0xACA05602, 0x00000002, 0x402C4620, - 0xADC07002, 0x00000003, 0x402C4620, 0xADC07002, 0xAE605202, 0x00000002, - 0x402C4620, 0xADC07702, 0x00000002, 0x402C4820, 0xAE604102, 0x00000002, - 0x402C4820, 0xAE605202, 0x00000002, 0x402C4820, 0xACA05602, 0x00000002, - 0x402C4820, 0xADC07002, 0x00000002, 0x402C4820, - // Block 198, offset 0x3180 - 0xADC07702, 0x00000002, 0x402C4820, 0xADC07802, 0x00000002, 0x402C4820, - 0xADC07B02, 0x00000002, 0x402C4A20, 0xAE603202, 0x00000002, 0x402C4A20, - 0xAE603502, 0x00000002, 0x402C4A20, 0xAE603702, 0x00000002, 0x402C4A20, - 0xAE603C02, 0x00000002, 0x402C4A20, 0xAE604102, 0x00000002, 0x402C4A20, - 0xAE604302, 0x00000002, 0x402C4A20, 0xAE604702, 0x00000003, 0x402C4A20, - 0xAE604702, 0xAE603202, 0x00000003, 0x402C4A20, 0xAE604702, 0xAE603502, - 0x00000003, 0x402C4A20, 0xAE604702, 0xAE604102, 0x00000003, 0x402C4A20, - 0xAE604702, 0xAE605B02, 0x00000002, 0x402C4A20, 0xAE604D02, 0x00000002, - 0x402C4A20, 0xAE604E02, 0x00000003, 0x402C4A20, 0xAE604E02, 0xAE603202, - 0x00000002, 0x402C4A20, 0xACA05902, 0x00000002, 0x402C4A20, 0xAE605B02, - 0x00000003, 0x402C4A20, 0xAE605B02, 0xAE604702, - // Block 199, offset 0x31c0 - 0x00000002, 0x402C4A20, 0xAE606402, 0x00000002, 0x402C4A20, 0xAE606502, - 0x00000002, 0x402C4A20, 0xAE606702, 0x00000002, 0x402C4A20, 0xAD806802, - 0x00000003, 0x402C4A20, 0xAD806802, 0xAE603202, 0x00000003, 0x402C4A20, - 0xAD806802, 0xAE603502, 0x00000003, 0x402C4A20, 0xAD806802, 0xAE604E02, - 0x00000003, 0x402C4A20, 0xAD806802, 0xAE606402, 0x00000003, 0x402C4A20, - 0xAD806802, 0xADC07002, 0x00000002, 0x402C4A20, 0xADC07002, 0x00000002, - 0x402C4A20, 0xADC07502, 0x00000002, 0x402C4A20, 0xADC07802, 0x00000002, - 0x402C4A20, 0xADC07A02, 0x00000002, 0x402C4C20, 0xAE604E02, 0x00000002, - 0x402C4C20, 0xADC07002, 0x00000002, 0x402C4E20, 0xAE603202, 0x00000002, - 0x402C4E20, 0xAE603502, 0x00000002, 0x402C4E20, 0xAE603C02, 0x00000002, - 0x402C4E20, 0xAE604702, 0x00000002, 0x402C4E20, - // Block 200, offset 0x3200 - 0xAE605202, 0x00000002, 0x402C4E20, 0xADC07002, 0x00000002, 0x402C5020, - 0xAE604702, 0x00000002, 0x402C5020, 0xAE605202, 0x00000002, 0x402C5220, - 0xAE603202, 0x00000002, 0x402C5220, 0xAE603502, 0x00000002, 0x402C5220, - 0xAE603C02, 0x00000002, 0x402C5220, 0xAE604702, 0x00000002, 0x402C5220, - 0xAE604E02, 0x00000002, 0x402C5220, 0xAE605202, 0x00000002, 0x402C5220, - 0xAE605B02, 0x00000002, 0x402C5220, 0xAE606402, 0x00000002, 0x402C5220, - 0xADC07002, 0x00000002, 0x402C5420, 0xAE603202, 0x00000002, 0x402C5420, - 0xAE603C02, 0x00000002, 0x402C5420, 0xAE604102, 0x00000002, 0x402C5420, - 0xAE605202, 0x00000002, 0x402C5420, 0xADC07002, 0x00000002, 0x402C5420, - 0xADC07B02, 0x00000002, 0x402C6220, 0xAE603202, 0x00000002, 0x402C6220, - 0xAE603502, 0x00000002, 0x402C6220, 0xAE603702, - // Block 201, offset 0x3240 - 0x00000003, 0x402C6220, 0xAE603702, 0xAE603202, 0x00000003, 0x402C6220, - 0xAE603702, 0xAE603502, 0x00000003, 0x402C6220, 0xAE603702, 0xAE604E02, - 0x00000003, 0x402C6220, 0xAE603702, 0xAE606402, 0x00000002, 0x402C6220, - 0xAE603C02, 0x00000003, 0x402C6220, 0xAE603C02, 0xAE603202, 0x00000003, - 0x402C6220, 0xAE603C02, 0xAE603502, 0x00000003, 0x402C6220, 0xAE603C02, - 0xAE604E02, 0x00000003, 0x402C6220, 0xAE603C02, 0xAE606402, 0x00000002, - 0x402C6220, 0xAE604102, 0x00000002, 0x402C6220, 0xAE604302, 0x00000003, - 0x402C6220, 0xAE604302, 0xAE603202, 0x00000002, 0x402C6220, 0xAE604702, - 0x00000003, 0x402C6220, 0xAE604702, 0xAE605B02, 0x00000002, 0x402C6220, - 0xAE604E02, 0x00000002, 0x402C6220, 0xAE605202, 0x00000003, 0x402C6220, - 0xAE605202, 0xAE605B02, 0x00000002, 0x402C6220, - // Block 202, offset 0x3280 - 0xACA05902, 0x00000002, 0x402C6220, 0xAE605B02, 0x00000002, 0x402C6220, - 0xAE606402, 0x00000002, 0x402C6220, 0xAE606502, 0x00000002, 0x402C6220, - 0xAE606702, 0x00000002, 0x402C6220, 0xADC07002, 0x00000003, 0x402C6220, - 0xADC07002, 0xAE603702, 0x00000003, 0x402C6220, 0xADC07002, 0xAE603C02, - 0x00000002, 0x402C6220, 0xADC07602, 0x00000002, 0x002C629C, 0x002BDE9C, - 0x00000002, 0x002C629C, 0x002C0A9D, 0x00000002, 0x002C629D, 0x002DCC9D, - 0x00000002, 0x002C629C, 0x002E229C, 0x00000002, 0x002C629C, 0x002E829C, - 0x00000002, 0x002C6284, 0x00312A84, 0x00000002, 0x002C628A, 0x00312A84, - 0x00000002, 0x002C628A, 0x00312A8A, 0x00000002, 0x402C6420, 0xAE605202, - 0x00000002, 0x402C6420, 0xADC07002, 0x00000002, 0x402C6420, 0xADC07B02, - 0x00000002, 0x402C6620, 0xAE603202, 0x00000002, - // Block 203, offset 0x32c0 - 0x402C6620, 0xAE603C02, 0x00000002, 0x402C6620, 0xAE604102, 0x00000002, - 0x402C6620, 0xAE605202, 0x00000002, 0x402C6620, 0xACA05602, 0x00000003, - 0x402C6620, 0xACA05602, 0xAE603202, 0x00000002, 0x402C6820, 0xAE604102, - 0x00000002, 0x402C6820, 0xAE605202, 0x00000002, 0x402C6820, 0xACA05602, - 0x00000002, 0x402C6820, 0xADC07002, 0x00000002, 0x402C6820, 0xADC07802, - 0x00000002, 0x402C6820, 0xADC07B02, 0x00000002, 0x402C6A20, 0xAE603202, - 0x00000002, 0x402C6A20, 0xAE603502, 0x00000002, 0x402C6A20, 0xAE603702, - 0x00000002, 0x402C6A20, 0xAE603C02, 0x00000003, 0x402C6A20, 0xAE603C02, - 0xAE603202, 0x00000003, 0x402C6A20, 0xAE603C02, 0xAE603502, 0x00000003, - 0x402C6A20, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C6A20, 0xAE603C02, - 0xAE606402, 0x00000002, 0x402C6A20, 0xAE604102, - // Block 204, offset 0x3300 - 0x00000002, 0x402C6A20, 0xAE604702, 0x00000002, 0x402C6A20, 0xAE604E02, - 0x00000002, 0x402C6A20, 0xAE605202, 0x00000002, 0x402C6A20, 0xACA05602, - 0x00000003, 0x402C6A20, 0xACA05602, 0xAE603702, 0x00000002, 0x402C6A20, - 0xACA05902, 0x00000002, 0x402C6A20, 0xAE605B02, 0x00000003, 0x402C6A20, - 0xAE605B02, 0xAE603202, 0x00000003, 0x402C6A20, 0xAE605B02, 0xAE603502, - 0x00000002, 0x402C6A20, 0xAE606402, 0x00000002, 0x402C6A20, 0xAE606502, - 0x00000002, 0x402C6A20, 0xAE606702, 0x00000002, 0x402C6A20, 0xADC07002, - 0x00000003, 0x402C6A20, 0xADC07002, 0xAE603C02, 0x00000002, 0x402C6A20, - 0xADC07802, 0x00000002, 0x402C6A20, 0xADC07A02, 0x00000002, 0x402C6C20, - 0xAE605202, 0x00000002, 0x402C6E20, 0xAE603202, 0x00000002, 0x402C6E20, - 0xAE603702, 0x00000002, 0x402C6E20, 0xAE603C02, - // Block 205, offset 0x3340 - 0x00000002, 0x402C6E20, 0xAE604102, 0x00000002, 0x402C6E20, 0xAE605202, - 0x00000002, 0x402C6E20, 0xACA05602, 0x00000002, 0x402C6E20, 0xAE605B02, - 0x00000002, 0x402C7020, 0xAE603C02, 0x00000002, 0x402C7020, 0xAE604102, - 0x00000002, 0x402C7020, 0xAE604702, 0x00000002, 0x402C7020, 0xAE605202, - 0x00000002, 0x402C7020, 0xACA05602, 0x00000002, 0x402C7020, 0xADC07002, - 0x00000002, 0x402C7020, 0xADC07902, 0x00000002, 0x402C7020, 0xADC07B02, - 0x00000002, 0x402C7220, 0xAE603202, 0x00000002, 0x402C7220, 0xAE603502, - 0x00000002, 0x402C7220, 0xAE603702, 0x00000002, 0x402C7220, 0xAE603C02, - 0x00000002, 0x402C7220, 0xAE604102, 0x00000002, 0x402C7220, 0xAE604702, - 0x00000003, 0x402C7220, 0xAE604702, 0xAE603202, 0x00000002, 0x402C7220, - 0xAE604E02, 0x00000002, 0x402C7220, 0xACA05902, - // Block 206, offset 0x3380 - 0x00000002, 0x402C7220, 0xAE605B02, 0x00000002, 0x402C7220, 0xAE606402, - 0x00000002, 0x402C7220, 0xAE606502, 0x00000002, 0x402C7220, 0xAE606702, - 0x00000002, 0x402C7220, 0xADC07002, 0x00000002, 0x402C7220, 0xADC07A02, - 0x00000002, 0x402C7420, 0xAE603C02, 0x00000002, 0x402C7420, 0xAE604102, - 0x00000002, 0x402C7620, 0xAE603202, 0x00000002, 0x402C7620, 0xAE604102, - 0x00000002, 0x402C7620, 0xACA05602, 0x00000002, 0x402C7620, 0xADC07002, - 0x00000002, 0x402C7620, 0xADC07B02, 0x00000002, 0x402C7820, 0xAE603202, - 0x00000002, 0x402C7820, 0xAE604102, 0x00000002, 0x402C7820, 0xACA05602, - 0x00000002, 0x402C7820, 0xADC07002, 0x00000003, 0x402C7820, 0xADC07002, - 0xAE605B02, 0x00000002, 0x402C7820, 0xADC07802, 0x00000002, 0x402C7820, - 0xADC07B02, 0x00000002, 0x402C7A20, 0xAE603202, - // Block 207, offset 0x33c0 - 0x00000002, 0x402C7A20, 0xAE605202, 0x00000002, 0x402C7A20, 0xADC07002, - 0x00000002, 0x402C7C20, 0xAE603202, 0x00000002, 0x402C7C20, 0xAE603502, - 0x00000002, 0x402C7C20, 0xAE604102, 0x00000002, 0x402C7C20, 0xAE604E02, - 0x00000002, 0x402C7C20, 0xAE605202, 0x00000002, 0x402C7C20, 0xACA05602, - 0x00000002, 0x402C7C20, 0xADC07002, 0x00000002, 0x402C7C20, 0xADC07802, - 0x00000002, 0x402C7C20, 0xADC07B02, 0x00000002, 0x402C7E20, 0xAE603202, - 0x00000002, 0x402C7E20, 0xAE603502, 0x00000002, 0x402C7E20, 0xAE603702, - 0x00000002, 0x402C7E20, 0xAE603C02, 0x00000003, 0x402C7E20, 0xAE603C02, - 0xAE603202, 0x00000003, 0x402C7E20, 0xAE603C02, 0xAE603502, 0x00000003, - 0x402C7E20, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C7E20, 0xAE603C02, - 0xAE606402, 0x00000002, 0x402C7E20, 0xAE604102, - // Block 208, offset 0x3400 - 0x00000002, 0x402C7E20, 0xAE604702, 0x00000003, 0x402C7E20, 0xAE604702, - 0xAE605B02, 0x00000002, 0x402C7E20, 0xAE604D02, 0x00000002, 0x402C7E20, - 0xAE604E02, 0x00000003, 0x402C7E20, 0xAE604E02, 0xAE603202, 0x00000003, - 0x402C7E20, 0xAE604E02, 0xAE604702, 0x00000003, 0x402C7E20, 0xAE604E02, - 0xAE605B02, 0x00000002, 0x402C7E20, 0xAE605202, 0x00000003, 0x402C7E20, - 0xAE605202, 0xAE605B02, 0x00000002, 0x402C7E20, 0xACA05902, 0x00000003, - 0x402C7E20, 0xACA05902, 0xAE605B02, 0x00000002, 0x402C7E20, 0xAE605B02, - 0x00000003, 0x402C7E20, 0xAE605B02, 0xAE603202, 0x00000003, 0x402C7E20, - 0xAE605B02, 0xAE603502, 0x00000002, 0x402C7E20, 0xAE606402, 0x00000002, - 0x402C7E20, 0xAE606502, 0x00000002, 0x402C7E20, 0xAE606702, 0x00000002, - 0x402C7E20, 0xAD806802, 0x00000003, 0x402C7E20, - // Block 209, offset 0x3440 - 0xAD806802, 0xAE603202, 0x00000003, 0x402C7E20, 0xAD806802, 0xAE603502, - 0x00000003, 0x402C7E20, 0xAD806802, 0xAE604E02, 0x00000003, 0x402C7E20, - 0xAD806802, 0xAE606402, 0x00000003, 0x402C7E20, 0xAD806802, 0xADC07002, - 0x00000002, 0x402C7E20, 0xADC07002, 0x00000003, 0x402C7E20, 0xADC07002, - 0xAE603C02, 0x00000002, 0x402C8020, 0xAE603202, 0x00000002, 0x402C8020, - 0xAE605202, 0x00000002, 0x402C8420, 0xAE603202, 0x00000002, 0x402C8420, - 0xAE604102, 0x00000002, 0x402C8420, 0xAE605202, 0x00000002, 0x402C8420, - 0xACA05602, 0x00000002, 0x402C8420, 0xAE606502, 0x00000002, 0x402C8420, - 0xAE606702, 0x00000002, 0x402C8420, 0xADC07002, 0x00000003, 0x402C8420, - 0xADC07002, 0xAE605B02, 0x00000002, 0x402C8420, 0xADC07B02, 0x00000002, - 0x402C8620, 0xAE603202, 0x00000003, 0x402C8620, - // Block 210, offset 0x3480 - 0xAE603202, 0xAE605202, 0x00000002, 0x402C8620, 0xAE603C02, 0x00000002, - 0x402C8620, 0xAE604102, 0x00000003, 0x402C8620, 0xAE604102, 0xAE605202, - 0x00000002, 0x402C8620, 0xAE605202, 0x00000002, 0x402C8620, 0xACA05602, - 0x00000002, 0x402C8620, 0xADC07002, 0x00000003, 0x402C8620, 0xADC07002, - 0xAE605202, 0x00000002, 0x402C8620, 0xADC07702, 0x00000002, 0x402C8820, - 0xAE604102, 0x00000002, 0x402C8820, 0xAE604702, 0x00000002, 0x402C8820, - 0xAE605202, 0x00000002, 0x402C8820, 0xACA05602, 0x00000002, 0x402C8820, - 0xADC07002, 0x00000002, 0x402C8820, 0xADC07702, 0x00000002, 0x402C8820, - 0xADC07802, 0x00000002, 0x402C8820, 0xADC07B02, 0x00000002, 0x402C8A20, - 0xAE603202, 0x00000002, 0x402C8A20, 0xAE603502, 0x00000002, 0x402C8A20, - 0xAE603702, 0x00000002, 0x402C8A20, 0xAE603C02, - // Block 211, offset 0x34c0 - 0x00000002, 0x402C8A20, 0xAE604102, 0x00000002, 0x402C8A20, 0xAE604302, - 0x00000002, 0x402C8A20, 0xAE604702, 0x00000003, 0x402C8A20, 0xAE604702, - 0xAE603202, 0x00000003, 0x402C8A20, 0xAE604702, 0xAE603502, 0x00000003, - 0x402C8A20, 0xAE604702, 0xAE604102, 0x00000003, 0x402C8A20, 0xAE604702, - 0xAE605B02, 0x00000002, 0x402C8A20, 0xAE604D02, 0x00000002, 0x402C8A20, - 0xAE604E02, 0x00000003, 0x402C8A20, 0xAE604E02, 0xAE603202, 0x00000002, - 0x402C8A20, 0xACA05902, 0x00000002, 0x402C8A20, 0xAE605B02, 0x00000003, - 0x402C8A20, 0xAE605B02, 0xAE604702, 0x00000002, 0x402C8A20, 0xAE606402, - 0x00000002, 0x402C8A20, 0xAE606502, 0x00000002, 0x402C8A20, 0xAE606702, - 0x00000002, 0x402C8A20, 0xAD806802, 0x00000003, 0x402C8A20, 0xAD806802, - 0xAE603202, 0x00000003, 0x402C8A20, 0xAD806802, - // Block 212, offset 0x3500 - 0xAE603502, 0x00000003, 0x402C8A20, 0xAD806802, 0xAE604E02, 0x00000003, - 0x402C8A20, 0xAD806802, 0xAE606402, 0x00000003, 0x402C8A20, 0xAD806802, - 0xADC07002, 0x00000002, 0x402C8A20, 0xADC07002, 0x00000002, 0x402C8A20, - 0xADC07502, 0x00000002, 0x402C8A20, 0xADC07802, 0x00000002, 0x402C8A20, - 0xADC07A02, 0x00000002, 0x402C8C20, 0xAE604E02, 0x00000002, 0x402C8C20, - 0xADC07002, 0x00000002, 0x402C8E20, 0xAE603202, 0x00000002, 0x402C8E20, - 0xAE603502, 0x00000002, 0x402C8E20, 0xAE603C02, 0x00000002, 0x402C8E20, - 0xAE604302, 0x00000002, 0x402C8E20, 0xAE604702, 0x00000002, 0x402C8E20, - 0xAE605202, 0x00000002, 0x402C8E20, 0xADC07002, 0x00000002, 0x402C9020, - 0xAE604702, 0x00000002, 0x402C9020, 0xAE605202, 0x00000002, 0x402C9220, - 0xAE603202, 0x00000002, 0x402C9220, 0xAE603502, - // Block 213, offset 0x3540 - 0x00000002, 0x402C9220, 0xAE603C02, 0x00000002, 0x402C9220, 0xAE604302, - 0x00000002, 0x402C9220, 0xAE604702, 0x00000002, 0x402C9220, 0xAE604E02, - 0x00000002, 0x402C9220, 0xAE605202, 0x00000002, 0x402C9220, 0xAE605B02, - 0x00000002, 0x402C9220, 0xAE606402, 0x00000002, 0x402C9220, 0xADC07002, - 0x00000002, 0x402C9420, 0xAE603202, 0x00000002, 0x402C9420, 0xAE603C02, - 0x00000002, 0x402C9420, 0xAE604102, 0x00000002, 0x402C9420, 0xAE605202, - 0x00000002, 0x402C9420, 0xADC07002, 0x00000002, 0x402C9420, 0xADC07B02, - 0x00000002, 0x002D0884, 0x002D0884, 0x00000002, 0x002D0884, 0x002E2284, - 0x00000002, 0x002D089C, 0x002E829C, 0x00000002, 0x002D229D, 0x002C0A9D, - 0x00000002, 0x002D229D, 0x0031009C, 0x00000002, 0x002E2284, 0x002DCC84, - 0x00000002, 0x002E228A, 0x002DCC84, 0x00000002, - // Block 214, offset 0x3580 - 0x002E228A, 0x002DCC8A, 0x00000002, 0x002E229C, 0x002E829C, 0x00000002, - 0x002E229C, 0x002E9E9C, 0x00000002, 0x002E829C, 0x0029D09C, 0x00000002, - 0x002E829C, 0x0029D29C, 0x00000002, 0x002E829C, 0x002BDE9D, 0x00000002, - 0x002E829C, 0x002C0A9C, 0x00000002, 0x002E829D, 0x002C0A9D, 0x00000002, - 0x002E8294, 0x002C3A94, 0x00000002, 0x002E8294, 0x002C6294, 0x00000002, - 0x002E829C, 0x002D229C, 0x00000002, 0x002E829C, 0x002E229C, 0x00000002, - 0x002E829C, 0x002E829C, 0x00000002, 0x002E829C, 0x0030BE9D, 0x00000002, - 0x002E829D, 0x0030BE9D, 0x00000002, 0x002E829D, 0x0030BE9D, 0x00000002, - 0x002E829C, 0x0030E29D, 0x00000002, 0x002E829D, 0x0030E29D, 0x00000002, - 0x002E829D, 0x0032A29D, 0x00000002, 0x002E9E9C, 0x002BDE9D, 0x00000002, - 0x002E9E9C, 0x002D089D, 0x00000002, 0x002E9E84, - // Block 215, offset 0x35c0 - 0x002DCC84, 0x00000002, 0x002E9E8A, 0x002DCC84, 0x00000002, 0x002E9E8A, - 0x002DCC8A, 0x00000002, 0x002E9E9C, 0x002E829C, 0x00000002, 0x002E9E9C, - 0x0030BE9D, 0x00000002, 0x002E9E9C, 0x0030E29D, 0x00000002, 0x002F2C9C, - 0x002BDE9D, 0x00000002, 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x002F2C9C, - 0x002C3A9C, 0x00000002, 0x002F2C9C, 0x002D089D, 0x00000002, 0x002F2C9C, - 0x0030BE9D, 0x00000002, 0x002F2C9C, 0x0030E29D, 0x00000002, 0x0030E29D, - 0x002C0A9C, 0x00000002, 0x0030E29D, 0x002C3A9D, 0x00000002, 0x0030E28C, - 0x00312A8C, 0x00000002, 0x0031DE84, 0x002E9E84, 0x00000002, 0x0032769C, - 0x002BDE9D, 0x00000002, 0x0032769C, 0x002D089D, 0x00000002, 0x0032769C, - 0x002D229C, 0x00000002, 0x0032769C, 0x002E229C, 0x00000002, 0x0032769C, - 0x002E829C, 0x00000002, 0x0032769C, 0x0030BE9D, - // Block 216, offset 0x3600 - 0x00000002, 0x0032769C, 0x0030E29D, 0x00000002, 0x40302620, 0xAE605202, - 0x00000002, 0x00302683, 0xAE605202, 0x00000002, 0x40302820, 0xAE603202, - 0x00000002, 0x00302883, 0xAE603202, 0x00000002, 0x40302820, 0xAE603C02, - 0x00000002, 0x00302883, 0xAE603C02, 0x00000002, 0x40302820, 0xAE605202, - 0x00000002, 0x00302883, 0xAE605202, 0x00000002, 0x40302820, 0xADC07002, - 0x00000002, 0x00302883, 0xADC07002, 0x00000002, 0x40302820, 0xADC07B02, - 0x00000002, 0x00302883, 0xADC07B02, 0x00000002, 0x4030BE21, 0xAE603202, - 0x00000002, 0x0030BEA3, 0xAE603202, 0x00000002, 0x4030BE21, 0xAE603502, - 0x00000002, 0x0030BEA3, 0xAE603502, 0x00000002, 0x4030BE21, 0xAE603C02, - 0x00000002, 0x0030BEA3, 0xAE603C02, 0x00000002, 0x4030BE21, 0xAE604302, - 0x00000002, 0x4030BE21, 0xAE604702, 0x00000002, - // Block 217, offset 0x3640 - 0x0030BEA3, 0xAE604702, 0x00000002, 0x4030BE21, 0xAE605202, 0x00000002, - 0x0030BEA3, 0xAE605202, 0x00000002, 0x4030BE21, 0xADC07002, 0x00000002, - 0x0030BEA3, 0xADC07002, 0x00000002, 0x4030EE20, 0xAE603202, 0x00000002, - 0x0030EE83, 0xAE603202, 0x00000002, 0x4030EE20, 0xAE603C02, 0x00000002, - 0x0030EE83, 0xAE603C02, 0x00000002, 0x4030EE20, 0xAE604702, 0x00000002, - 0x0030EE83, 0xAE604702, 0x00000002, 0x4030EE20, 0xAE605B02, 0x00000002, - 0x0030EE83, 0xAE605B02, 0x00000002, 0x4030EE20, 0xAD806802, 0x00000002, - 0x0030EE83, 0xAD806802, 0x00000002, 0x4030F020, 0xAE605B02, 0x00000002, - 0x0030F083, 0xAE605B02, 0x00000002, 0x4030F220, 0xAE605B02, 0x00000002, - 0x0030F283, 0xAE605B02, 0x00000002, 0x4030F420, 0xAE603202, 0x00000002, - 0x0030F483, 0xAE603202, 0x00000002, 0x4030F420, - // Block 218, offset 0x3680 - 0xAE603502, 0x00000002, 0x0030F483, 0xAE603502, 0x00000002, 0x4030F420, - 0xAE604102, 0x00000002, 0x0030F483, 0xAE604102, 0x00000002, 0x4030F420, - 0xAE605B02, 0x00000002, 0x0030F483, 0xAE605B02, 0x00000002, 0xA000B218, - 0xA000BA18, 0x00000002, 0xA000B618, 0xA000BA18, 0x00000002, 0x00393899, - 0xA000A219, 0x00000002, 0x0039389A, 0xA000A21A, 0x00000002, 0x00393C97, - 0x003A6897, 0x00000002, 0x00393C98, 0x003A6898, 0x00000002, 0x00393C99, - 0x003A9099, 0x00000002, 0x00393C9A, 0x003A909A, 0x00000002, 0x00395697, - 0x003A6897, 0x00000002, 0x00395698, 0x003A6898, 0x00000002, 0x00395699, - 0x003A9099, 0x00000002, 0x0039569A, 0x003A909A, 0x00000002, 0x00395898, - 0x003A6898, 0x00000002, 0x00395899, 0x003A9099, 0x00000002, 0x0039589A, - 0x003A909A, 0x00000002, 0x00396499, 0x003A9099, - // Block 219, offset 0x36c0 - 0x00000002, 0x0039649A, 0x003A909A, 0x00000002, 0x00397299, 0x003A9099, - 0x00000002, 0x0039729A, 0x003A909A, 0x00000002, 0x00397499, 0x003A9099, - 0x00000002, 0x0039749A, 0x003A909A, 0x00000002, 0x0039C697, 0x003A6897, - 0x00000002, 0x0039C698, 0x003A6898, 0x00000002, 0x0039C699, 0x003A9099, - 0x00000002, 0x0039C69A, 0x003A909A, 0x00000002, 0x0039C897, 0x003A6897, - 0x00000002, 0x0039C898, 0x003A6898, 0x00000002, 0x0039C899, 0x003A9099, - 0x00000002, 0x0039C89A, 0x003A909A, 0x00000002, 0x0039DC99, 0x003A9099, - 0x00000002, 0x0039DC9A, 0x003A909A, 0x00000002, 0x0039DE99, 0x003A9099, - 0x00000002, 0x0039DE9A, 0x003A909A, 0x00000002, 0x0039E699, 0x003A9099, - 0x00000002, 0x0039E69A, 0x003A909A, 0x00000002, 0x0039EE99, 0x003A9099, - 0x00000002, 0x0039EE9A, 0x003A909A, 0x00000002, - // Block 220, offset 0x3700 - 0x0039F099, 0x003A9099, 0x00000002, 0x0039F09A, 0x003A909A, 0x00000002, - 0x0039FC99, 0x003A9099, 0x00000002, 0x0039FC9A, 0x003A909A, 0x00000002, - 0x003A1299, 0x003A9099, 0x00000002, 0x003A129A, 0x003A909A, 0x00000002, - 0x003A1A99, 0x00393899, 0x00000002, 0x003A1A9A, 0x0039389A, 0x00000002, - 0x003A1A97, 0x00396497, 0x00000002, 0x003A1A9A, 0x0039649A, 0x00000002, - 0x003A1A97, 0x00397297, 0x00000002, 0x003A1A9A, 0x0039729A, 0x00000002, - 0x003A1A97, 0x00397497, 0x00000002, 0x003A1A9A, 0x0039749A, 0x00000002, - 0x003A1A97, 0x003A4097, 0x00000002, 0x003A1A98, 0x003A4098, 0x00000002, - 0x003A1A99, 0x003A4099, 0x00000002, 0x003A1A9A, 0x003A409A, 0x00000002, - 0x003A1A97, 0x003A4E97, 0x00000002, 0x003A1A98, 0x003A4E98, 0x00000002, - 0x003A1A99, 0x003A4E99, 0x00000002, 0x003A1A9A, - // Block 221, offset 0x3740 - 0x003A4E9A, 0x00000002, 0x003A1A99, 0x003A9099, 0x00000002, 0x003A1A9A, - 0x003A909A, 0x00000002, 0x003A4097, 0x003A6897, 0x00000002, 0x003A4099, - 0x003A9099, 0x00000002, 0x003A409A, 0x003A909A, 0x00000002, 0x003A4E9A, - 0x003A909A, 0x00000002, 0x003A5697, 0x003A6897, 0x00000002, 0x003A5698, - 0x003A6898, 0x00000002, 0x003A5699, 0x003A9099, 0x00000002, 0x003A569A, - 0x003A909A, 0x00000002, 0x003A6897, 0xA000D117, 0x00000002, 0x003A6897, - 0x00396497, 0x00000002, 0x003A689A, 0x0039649A, 0x00000002, 0x003A6897, - 0x003A4E97, 0x00000002, 0x003A689A, 0x003A4E9A, 0x00000002, 0x003A689A, - 0x003A909A, 0x00000002, 0x003A7299, 0xA000BE19, 0x00000002, 0x003A729A, - 0xA000BE1A, 0x00000002, 0x403A8822, 0xAE60BE02, 0x00000002, 0x003A8E99, - 0xA000D119, 0x00000002, 0x003A8E9A, 0xA000D11A, - // Block 222, offset 0x3780 - 0x00000002, 0x003A9084, 0x00391C84, 0x00000002, 0x003A9097, 0x00396497, - 0x00000002, 0x003A909A, 0x0039649A, 0x00000002, 0x003A9097, 0x00397297, - 0x00000002, 0x003A909A, 0x0039729A, 0x00000002, 0x003A9097, 0x00397497, - 0x00000002, 0x003A909A, 0x0039749A, 0x00000002, 0x003A9099, 0x0039A499, - 0x00000002, 0x003A9099, 0x0039A699, 0x00000002, 0x003A9097, 0x003A4E97, - 0x00000002, 0x003A9098, 0x003A4E98, 0x00000002, 0x003A9099, 0x003A4E99, - 0x00000002, 0x003A909A, 0x003A4E9A, 0x00000002, 0x003A9099, 0x003A5699, - 0x00000002, 0x003A9097, 0x003A6897, 0x00000002, 0x003A9098, 0x003A6898, - 0x00000002, 0x003A9099, 0x003A9099, 0x00000002, 0x003A909A, 0x003A909A, - 0x00000002, 0x403A9222, 0xAE60BE02, 0x00000002, 0x003AAA99, 0xA000BE19, - 0x00000002, 0x003AAA9A, 0xA000BE1A, 0x00000002, - // Block 223, offset 0x37c0 - 0x402C6221, 0x40021220, 0x00000002, 0x002C62A3, 0x40021220, 0x00000002, - 0x402D2221, 0x40021220, 0x00000002, 0x002D22A3, 0x40021220, 0x00000002, - 0x402E9E21, 0x40021220, 0x00000002, 0x002E9EA3, 0x40021220, 0x00000002, - 0x40302C21, 0x40021220, 0x00000002, 0x00302CA3, 0x40021220, 0x00000002, - 0x40312A21, 0x40021220, 0x00000002, 0x00312AA3, 0x40021220, 0x00000003, - 0x40312A21, 0x40021220, 0xAE604102, 0x00000003, 0x00312AA3, 0x40021220, - 0xAE604102, 0x00000002, 0x40320E20, 0xAE605B02, 0x00000002, 0x00320E83, - 0xAE605B02, 0x00000002, 0x40320E21, 0xAE603202, 0x00000002, 0x00320EA3, - 0xAE603202, 0x00000002, 0x40321020, 0xAE604E02, 0x00000002, 0x00321083, - 0xAE604E02, 0x00000002, 0x40321020, 0xAE605B02, 0x00000002, 0x00321083, - 0xAE605B02, 0x00000002, 0x40321021, 0xAE603202, - // Block 224, offset 0x3800 - 0x00000002, 0x003210A3, 0xAE603202, 0x00000002, 0x40302C21, 0x402D6820, - 0x00000002, 0x00302CA3, 0x402D6820, 0x00000002, 0x40321023, 0xAE603202, - 0x00000002, 0x003210E3, 0xAE603202, 0x00000002, 0x40321023, 0xAE603C02, - 0x00000002, 0x003210E3, 0xAE603C02, 0x00000002, 0x40321023, 0xAE604702, - 0x00000002, 0x003210E3, 0xAE604702, 0x00000002, 0x40321023, 0xAE605B02, - 0x00000002, 0x003210E3, 0xAE605B02, 0x00000002, 0x40321023, 0xAD806802, - 0x00000002, 0x003210E3, 0xAD806802, 0x00000002, 0x002BDE83, 0xAE603202, - 0x00000002, 0x002BDE83, 0xAE603502, 0x00000002, 0x002BDE83, 0xAE603702, - 0x00000003, 0x002BDE83, 0xAE603702, 0xAE603202, 0x00000003, 0x002BDE83, - 0xAE603702, 0xAE603502, 0x00000003, 0x002BDE83, 0xAE603702, 0xAE604E02, - 0x00000003, 0x002BDE83, 0xAE603702, 0xAE606402, - // Block 225, offset 0x3840 - 0x00000002, 0x002BDE83, 0xAE603C02, 0x00000003, 0x002BDE83, 0xAE603C02, - 0xAE603202, 0x00000003, 0x002BDE83, 0xAE603C02, 0xAE603502, 0x00000003, - 0x002BDE83, 0xAE603C02, 0xAE604E02, 0x00000003, 0x002BDE83, 0xAE603C02, - 0xAE606402, 0x00000002, 0x002BDE83, 0xAE604102, 0x00000002, 0x002BDE83, - 0xAE604302, 0x00000003, 0x002BDE83, 0xAE604302, 0xAE603202, 0x00000002, - 0x002BDE83, 0xAE604702, 0x00000003, 0x002BDE83, 0xAE604702, 0xAE605B02, - 0x00000002, 0x002BDE83, 0xAE604E02, 0x00000002, 0x002BDE83, 0xAE605202, - 0x00000003, 0x002BDE83, 0xAE605202, 0xAE605B02, 0x00000002, 0x002BDE83, - 0xACA05902, 0x00000002, 0x002BDE83, 0xAE605B02, 0x00000002, 0x002BDE83, - 0xAE606402, 0x00000002, 0x002BDE83, 0xAE606502, 0x00000002, 0x002BDE83, - 0xAE606702, 0x00000002, 0x002BDE83, 0xADC07002, - // Block 226, offset 0x3880 - 0x00000003, 0x002BDE83, 0xADC07002, 0xAE603702, 0x00000003, 0x002BDE83, - 0xADC07002, 0xAE603C02, 0x00000002, 0x002BDE83, 0xADC07602, 0x00000002, - 0x402BE020, 0xAE603202, 0x00000002, 0x002BE083, 0xAE603202, 0x00000002, - 0x402BE020, 0xAE603502, 0x00000002, 0x002BE083, 0xAE603502, 0x00000002, - 0x402BE020, 0xAE603702, 0x00000002, 0x002BE083, 0xAE603702, 0x00000002, - 0x402BE020, 0xAE603C02, 0x00000002, 0x002BE083, 0xAE603C02, 0x00000003, - 0x402BE020, 0xAE603C02, 0xAE603202, 0x00000003, 0x002BE083, 0xAE603C02, - 0xAE603202, 0x00000003, 0x402BE020, 0xAE603C02, 0xAE603502, 0x00000003, - 0x002BE083, 0xAE603C02, 0xAE603502, 0x00000003, 0x402BE020, 0xAE603C02, - 0xAE604E02, 0x00000003, 0x002BE083, 0xAE603C02, 0xAE604E02, 0x00000003, - 0x402BE020, 0xAE603C02, 0xAE606402, 0x00000003, - // Block 227, offset 0x38c0 - 0x002BE083, 0xAE603C02, 0xAE606402, 0x00000002, 0x402BE020, 0xAE604102, - 0x00000002, 0x002BE083, 0xAE604102, 0x00000002, 0x402BE020, 0xAE604702, - 0x00000002, 0x002BE083, 0xAE604702, 0x00000002, 0x402BE020, 0xAE604E02, - 0x00000002, 0x002BE083, 0xAE604E02, 0x00000002, 0x402BE020, 0xAE605202, - 0x00000002, 0x002BE083, 0xAE605202, 0x00000002, 0x402BE020, 0xACA05602, - 0x00000002, 0x002BE083, 0xACA05602, 0x00000003, 0x402BE020, 0xACA05602, - 0xAE603702, 0x00000003, 0x002BE083, 0xACA05602, 0xAE603702, 0x00000002, - 0x402BE020, 0xACA05902, 0x00000002, 0x002BE083, 0xACA05902, 0x00000002, - 0x402BE020, 0xAE605B02, 0x00000002, 0x002BE083, 0xAE605B02, 0x00000003, - 0x402BE020, 0xAE605B02, 0xAE603202, 0x00000003, 0x002BE083, 0xAE605B02, - 0xAE603202, 0x00000003, 0x402BE020, 0xAE605B02, - // Block 228, offset 0x3900 - 0xAE603502, 0x00000003, 0x002BE083, 0xAE605B02, 0xAE603502, 0x00000002, - 0x402BE020, 0xAE606402, 0x00000002, 0x002BE083, 0xAE606402, 0x00000002, - 0x402BE020, 0xAE606502, 0x00000002, 0x002BE083, 0xAE606502, 0x00000002, - 0x402BE020, 0xAE606702, 0x00000002, 0x002BE083, 0xAE606702, 0x00000002, - 0x402BE020, 0xADC07002, 0x00000002, 0x002BE083, 0xADC07002, 0x00000003, - 0x402BE020, 0xADC07002, 0xAE603C02, 0x00000003, 0x002BE083, 0xADC07002, - 0xAE603C02, 0x00000002, 0x402BE020, 0xADC07802, 0x00000002, 0x002BE083, - 0xADC07802, 0x00000002, 0x402BE020, 0xADC07A02, 0x00000002, 0x002BE083, - 0xADC07A02, 0x00000002, 0x402BE220, 0xAE603202, 0x00000002, 0x002BE283, - 0xAE603202, 0x00000002, 0x402BE220, 0xAE603502, 0x00000002, 0x002BE283, - 0xAE603502, 0x00000002, 0x402BE220, 0xAE603702, - // Block 229, offset 0x3940 - 0x00000002, 0x002BE283, 0xAE603702, 0x00000002, 0x402BE220, 0xAE603C02, - 0x00000002, 0x002BE283, 0xAE603C02, 0x00000002, 0x402BE220, 0xAE604102, - 0x00000002, 0x002BE283, 0xAE604102, 0x00000002, 0x402BE220, 0xAE604702, - 0x00000002, 0x002BE283, 0xAE604702, 0x00000003, 0x402BE220, 0xAE604702, - 0xAE603202, 0x00000003, 0x002BE283, 0xAE604702, 0xAE603202, 0x00000002, - 0x402BE220, 0xAE604E02, 0x00000002, 0x002BE283, 0xAE604E02, 0x00000002, - 0x002BE283, 0xAE605202, 0x00000002, 0x402BE220, 0xACA05902, 0x00000002, - 0x002BE283, 0xACA05902, 0x00000002, 0x402BE220, 0xAE605B02, 0x00000002, - 0x002BE283, 0xAE605B02, 0x00000002, 0x402BE220, 0xAE606402, 0x00000002, - 0x002BE283, 0xAE606402, 0x00000002, 0x402BE220, 0xAE606502, 0x00000002, - 0x002BE283, 0xAE606502, 0x00000002, 0x402BE220, - // Block 230, offset 0x3980 - 0xAE606702, 0x00000002, 0x002BE283, 0xAE606702, 0x00000002, 0x402BE220, - 0xADC07002, 0x00000002, 0x002BE283, 0xADC07002, 0x00000002, 0x402BE220, - 0xADC07A02, 0x00000002, 0x002BE283, 0xADC07A02, 0x00000002, 0x402BE420, - 0xAE603202, 0x00000002, 0x002BE483, 0xAE603202, 0x00000002, 0x402BE420, - 0xAE603502, 0x00000002, 0x002BE483, 0xAE603502, 0x00000002, 0x402BE420, - 0xAE603702, 0x00000002, 0x002BE483, 0xAE603702, 0x00000002, 0x402BE420, - 0xAE603C02, 0x00000002, 0x002BE483, 0xAE603C02, 0x00000003, 0x402BE420, - 0xAE603C02, 0xAE603202, 0x00000003, 0x002BE483, 0xAE603C02, 0xAE603202, - 0x00000003, 0x402BE420, 0xAE603C02, 0xAE603502, 0x00000003, 0x002BE483, - 0xAE603C02, 0xAE603502, 0x00000003, 0x402BE420, 0xAE603C02, 0xAE604E02, - 0x00000003, 0x002BE483, 0xAE603C02, 0xAE604E02, - // Block 231, offset 0x39c0 - 0x00000003, 0x402BE420, 0xAE603C02, 0xAE606402, 0x00000003, 0x002BE483, - 0xAE603C02, 0xAE606402, 0x00000002, 0x402BE420, 0xAE604102, 0x00000002, - 0x002BE483, 0xAE604102, 0x00000002, 0x402BE420, 0xAE604702, 0x00000002, - 0x002BE483, 0xAE604702, 0x00000003, 0x402BE420, 0xAE604702, 0xAE605B02, - 0x00000003, 0x002BE483, 0xAE604702, 0xAE605B02, 0x00000002, 0x402BE420, - 0xAE604D02, 0x00000002, 0x002BE483, 0xAE604D02, 0x00000002, 0x402BE420, - 0xAE604E02, 0x00000002, 0x002BE483, 0xAE604E02, 0x00000003, 0x402BE420, - 0xAE604E02, 0xAE603202, 0x00000003, 0x002BE483, 0xAE604E02, 0xAE603202, - 0x00000003, 0x402BE420, 0xAE604E02, 0xAE604702, 0x00000003, 0x002BE483, - 0xAE604E02, 0xAE604702, 0x00000003, 0x402BE420, 0xAE604E02, 0xAE605B02, - 0x00000003, 0x002BE483, 0xAE604E02, 0xAE605B02, - // Block 232, offset 0x3a00 - 0x00000002, 0x402BE420, 0xAE605202, 0x00000002, 0x002BE483, 0xAE605202, - 0x00000003, 0x402BE420, 0xAE605202, 0xAE605B02, 0x00000003, 0x002BE483, - 0xAE605202, 0xAE605B02, 0x00000002, 0x402BE420, 0xACA05902, 0x00000002, - 0x002BE483, 0xACA05902, 0x00000003, 0x402BE420, 0xACA05902, 0xAE605B02, - 0x00000003, 0x002BE483, 0xACA05902, 0xAE605B02, 0x00000002, 0x402BE420, - 0xAE605B02, 0x00000002, 0x002BE483, 0xAE605B02, 0x00000003, 0x402BE420, - 0xAE605B02, 0xAE603202, 0x00000003, 0x002BE483, 0xAE605B02, 0xAE603202, - 0x00000003, 0x402BE420, 0xAE605B02, 0xAE603502, 0x00000003, 0x002BE483, - 0xAE605B02, 0xAE603502, 0x00000002, 0x402BE420, 0xAE606402, 0x00000002, - 0x002BE483, 0xAE606402, 0x00000002, 0x402BE420, 0xAE606502, 0x00000002, - 0x002BE483, 0xAE606502, 0x00000002, 0x402BE420, - // Block 233, offset 0x3a40 - 0xAE606702, 0x00000002, 0x002BE483, 0xAE606702, 0x00000002, 0x402BE420, - 0xAD806802, 0x00000002, 0x002BE483, 0xAD806802, 0x00000003, 0x402BE420, - 0xAD806802, 0xAE603202, 0x00000003, 0x002BE483, 0xAD806802, 0xAE603202, - 0x00000003, 0x402BE420, 0xAD806802, 0xAE603502, 0x00000003, 0x002BE483, - 0xAD806802, 0xAE603502, 0x00000003, 0x402BE420, 0xAD806802, 0xAE604E02, - 0x00000003, 0x002BE483, 0xAD806802, 0xAE604E02, 0x00000003, 0x402BE420, - 0xAD806802, 0xAE606402, 0x00000003, 0x002BE483, 0xAD806802, 0xAE606402, - 0x00000003, 0x402BE420, 0xAD806802, 0xADC07002, 0x00000003, 0x002BE483, - 0xAD806802, 0xADC07002, 0x00000002, 0x402BE420, 0xADC07002, 0x00000002, - 0x002BE483, 0xADC07002, 0x00000003, 0x402BE420, 0xADC07002, 0xAE603C02, - 0x00000003, 0x002BE483, 0xADC07002, 0xAE603C02, - // Block 234, offset 0x3a80 - 0x00000002, 0x402BE620, 0xAE603202, 0x00000002, 0x002BE683, 0xAE603202, - 0x00000002, 0x402BE620, 0xAE603502, 0x00000002, 0x002BE683, 0xAE603502, - 0x00000002, 0x402BE620, 0xAE603702, 0x00000002, 0x002BE683, 0xAE603702, - 0x00000002, 0x402BE620, 0xAE603C02, 0x00000002, 0x002BE683, 0xAE603C02, - 0x00000002, 0x402BE620, 0xAE604102, 0x00000002, 0x002BE683, 0xAE604102, - 0x00000002, 0x402BE620, 0xAE604302, 0x00000002, 0x002BE683, 0xAE604302, - 0x00000002, 0x402BE620, 0xAE604702, 0x00000002, 0x002BE683, 0xAE604702, - 0x00000003, 0x402BE620, 0xAE604702, 0xAE603202, 0x00000003, 0x002BE683, - 0xAE604702, 0xAE603202, 0x00000003, 0x402BE620, 0xAE604702, 0xAE603502, - 0x00000003, 0x002BE683, 0xAE604702, 0xAE603502, 0x00000003, 0x402BE620, - 0xAE604702, 0xAE604102, 0x00000003, 0x002BE683, - // Block 235, offset 0x3ac0 - 0xAE604702, 0xAE604102, 0x00000003, 0x402BE620, 0xAE604702, 0xAE605B02, - 0x00000003, 0x002BE683, 0xAE604702, 0xAE605B02, 0x00000002, 0x402BE620, - 0xAE604D02, 0x00000002, 0x002BE683, 0xAE604D02, 0x00000002, 0x402BE620, - 0xAE604E02, 0x00000002, 0x002BE683, 0xAE604E02, 0x00000003, 0x402BE620, - 0xAE604E02, 0xAE603202, 0x00000003, 0x002BE683, 0xAE604E02, 0xAE603202, - 0x00000002, 0x402BE620, 0xACA05902, 0x00000002, 0x002BE683, 0xACA05902, - 0x00000002, 0x402BE620, 0xAE605B02, 0x00000002, 0x002BE683, 0xAE605B02, - 0x00000003, 0x402BE620, 0xAE605B02, 0xAE604702, 0x00000003, 0x002BE683, - 0xAE605B02, 0xAE604702, 0x00000002, 0x402BE620, 0xAE606402, 0x00000002, - 0x002BE683, 0xAE606402, 0x00000002, 0x402BE620, 0xAE606502, 0x00000002, - 0x002BE683, 0xAE606502, 0x00000002, 0x402BE620, - // Block 236, offset 0x3b00 - 0xAE606702, 0x00000002, 0x002BE683, 0xAE606702, 0x00000002, 0x402BE620, - 0xAD806802, 0x00000002, 0x002BE683, 0xAD806802, 0x00000003, 0x402BE620, - 0xAD806802, 0xAE603202, 0x00000003, 0x002BE683, 0xAD806802, 0xAE603202, - 0x00000003, 0x402BE620, 0xAD806802, 0xAE603502, 0x00000003, 0x002BE683, - 0xAD806802, 0xAE603502, 0x00000003, 0x402BE620, 0xAD806802, 0xAE604E02, - 0x00000003, 0x002BE683, 0xAD806802, 0xAE604E02, 0x00000003, 0x402BE620, - 0xAD806802, 0xAE606402, 0x00000003, 0x002BE683, 0xAD806802, 0xAE606402, - 0x00000003, 0x402BE620, 0xAD806802, 0xADC07002, 0x00000003, 0x002BE683, - 0xAD806802, 0xADC07002, 0x00000002, 0x402BE620, 0xADC07002, 0x00000002, - 0x002BE683, 0xADC07002, 0x00000002, 0x402BE620, 0xADC07502, 0x00000002, - 0x002BE683, 0xADC07502, 0x00000002, 0x402BE620, - // Block 237, offset 0x3b40 - 0xADC07802, 0x00000002, 0x002BE683, 0xADC07802, 0x00000002, 0x402BE620, - 0xADC07A02, 0x00000002, 0x002BE683, 0xADC07A02, 0x00000002, 0x402BE820, - 0xAE603C02, 0x00000002, 0x002BE883, 0xAE603C02, 0x00000002, 0x402BE820, - 0xAE604102, 0x00000002, 0x002BE883, 0xAE604102, 0x00000002, 0x402BE820, - 0xAE604702, 0x00000002, 0x002BE883, 0xAE604702, 0x00000002, 0x402BE820, - 0xAE605202, 0x00000002, 0x002BE883, 0xAE605202, 0x00000002, 0x402BE820, - 0xACA05602, 0x00000002, 0x002BE883, 0xACA05602, 0x00000002, 0x402BE820, - 0xADC07002, 0x00000002, 0x002BE883, 0xADC07002, 0x00000002, 0x402BE820, - 0xADC07902, 0x00000002, 0x002BE883, 0xADC07902, 0x00000002, 0x402BE820, - 0xADC07B02, 0x00000002, 0x402BEA20, 0xAE603202, 0x00000002, 0x002BEA83, - 0xAE603202, 0x00000002, 0x402BEA20, 0xAE604102, - // Block 238, offset 0x3b80 - 0x00000002, 0x002BEA83, 0xAE604102, 0x00000002, 0x402BEA20, 0xACA05602, - 0x00000002, 0x002BEA83, 0xACA05602, 0x00000002, 0x402BEA20, 0xADC07002, - 0x00000002, 0x002BEA83, 0xADC07002, 0x00000002, 0x402BEA20, 0xADC07B02, - 0x00000002, 0x002BEA83, 0xADC07B02, 0x00000002, 0x402BEC20, 0xAE603202, - 0x00000002, 0x002BEC83, 0xAE603202, 0x00000002, 0x402BEC20, 0xAE604102, - 0x00000002, 0x002BEC83, 0xAE604102, 0x00000002, 0x402BEC20, 0xACA05602, - 0x00000002, 0x002BEC83, 0xACA05602, 0x00000002, 0x402BEC20, 0xADC07002, - 0x00000002, 0x002BEC83, 0xADC07002, 0x00000003, 0x402BEC20, 0xADC07002, - 0xAE605B02, 0x00000003, 0x002BEC83, 0xADC07002, 0xAE605B02, 0x00000002, - 0x402BEC20, 0xADC07802, 0x00000002, 0x002BEC83, 0xADC07802, 0x00000002, - 0x402BEC20, 0xADC07B02, 0x00000002, 0x002BEC83, - // Block 239, offset 0x3bc0 - 0xADC07B02, 0x00000002, 0x402BEE20, 0xAE603202, 0x00000002, 0x002BEE83, - 0xAE603202, 0x00000002, 0x402BEE20, 0xAE605202, 0x00000002, 0x002BEE83, - 0xAE605202, 0x00000002, 0x402BEE20, 0xADC07002, 0x00000002, 0x002BEE83, - 0xADC07002, 0x00000002, 0x402BF020, 0xAE603202, 0x00000002, 0x002BF083, - 0xAE603202, 0x00000002, 0x402BF020, 0xAE603502, 0x00000002, 0x002BF083, - 0xAE603502, 0x00000002, 0x402BF020, 0xAE604102, 0x00000002, 0x002BF083, - 0xAE604102, 0x00000002, 0x402BF020, 0xAE604E02, 0x00000002, 0x002BF083, - 0xAE604E02, 0x00000002, 0x402BF020, 0xAE605202, 0x00000002, 0x002BF083, - 0xAE605202, 0x00000002, 0x402BF020, 0xACA05602, 0x00000002, 0x002BF083, - 0xACA05602, 0x00000002, 0x402BF020, 0xADC07002, 0x00000002, 0x002BF083, - 0xADC07002, 0x00000002, 0x402BF020, 0xADC07802, - // Block 240, offset 0x3c00 - 0x00000002, 0x002BF083, 0xADC07802, 0x00000002, 0x402BF020, 0xADC07B02, - 0x00000002, 0x002BF083, 0xADC07B02, 0x00000002, 0x402BF220, 0xAE603202, - 0x00000002, 0x002BF283, 0xAE603202, 0x00000002, 0x402BF220, 0xAE605202, - 0x00000002, 0x002BF283, 0xAE605202, 0x00000002, 0x402BF420, 0xAE603202, - 0x00000002, 0x002BF483, 0xAE603202, 0x00000002, 0x402BF420, 0xAE603502, - 0x00000002, 0x002BF483, 0xAE603502, 0x00000002, 0x402BF420, 0xAE603C02, - 0x00000002, 0x002BF483, 0xAE603C02, 0x00000002, 0x402BF420, 0xAE604302, - 0x00000002, 0x402BF420, 0xAE604702, 0x00000002, 0x002BF483, 0xAE604702, - 0x00000002, 0x402BF420, 0xAE605202, 0x00000002, 0x002BF483, 0xAE605202, - 0x00000002, 0x402BF420, 0xADC07002, 0x00000002, 0x002BF483, 0xADC07002, - 0x00000002, 0x402C3E20, 0xACA05602, 0x00000002, - // Block 241, offset 0x3c40 - 0x002C3E83, 0xACA05602, 0x00000002, 0x002C3C83, 0x402C3C20, 0x00000002, - 0x002C3C85, 0x402C3C20, 0x00000002, 0x002C3C87, 0x002C3C86, 0x00000002, - 0x002C6483, 0x402C6420, 0x00000002, 0x002C6485, 0x402C6420, 0x00000002, - 0x002C6487, 0x002C6486, 0x00000002, 0x002C6683, 0x402C6620, 0x00000002, - 0x002C6685, 0x402C6620, 0x00000002, 0x002C6687, 0x002C6686, 0x00000002, - 0x002D2483, 0x402D2420, 0x00000002, 0x002D2485, 0x402D2420, 0x00000002, - 0x002D2487, 0x002D2486, 0x00000002, 0x002E2483, 0x402E2420, 0x00000002, - 0x002E2485, 0x402E2420, 0x00000002, 0x002E2487, 0x002E2486, 0x00000002, - 0x002EA083, 0x402EA020, 0x00000002, 0x002EA085, 0x402EA020, 0x00000002, - 0x002EA087, 0x002EA086, 0x00000002, 0x002FE883, 0x402FE820, 0x00000002, - 0x002FE885, 0x402FE820, 0x00000002, 0x002FE887, - // Block 242, offset 0x3c80 - 0x002FE886, 0x00000002, 0x00302E83, 0x40302E20, 0x00000002, 0x00302E85, - 0x40302E20, 0x00000002, 0x00302E87, 0x00302E86, 0x00000002, 0x00312C83, - 0x40312C20, 0x00000002, 0x00312C85, 0x40312C20, 0x00000002, 0x00312C87, - 0x00312C86, 0x00000002, 0x402EE420, 0xAE603C02, 0x00000002, 0x002EE483, - 0xAE603C02, 0x00000002, 0x402EE420, 0xAD806802, 0x00000002, 0x002EE483, - 0xAD806802, 0x00000002, 0x40306E20, 0xAD806802, 0x00000002, 0x00306E83, - 0xAD806802, 0x00000002, 0x402C0820, 0xAE603702, 0x00000002, 0x002C0883, - 0xAE603702, 0x00000002, 0x402C0820, 0xAE603C02, 0x00000002, 0x002C0883, - 0xAE603C02, 0x00000002, 0x402D0620, 0xAE603C02, 0x00000002, 0x002D0683, - 0xAE603C02, 0x00000002, 0x402D0620, 0xAE605B02, 0x00000002, 0x002D0683, - 0xAE605B02, 0x00000002, 0x402DCA20, 0xAE604702, - // Block 243, offset 0x3cc0 - 0x00000002, 0x002DCA83, 0xAE604702, 0x00000002, 0x402F2A20, 0xAE603C02, - 0x00000002, 0x002F2A83, 0xAE603C02, 0x00000002, 0x402F2A20, 0xAE604E02, - 0x00000002, 0x002F2A83, 0xAE604E02, 0x00000002, 0x402F2A20, 0xAE605B02, - 0x00000002, 0x002F2A83, 0xAE605B02, 0x00000002, 0x402F2A20, 0xAD806802, - 0x00000002, 0x002F2A83, 0xAD806802, 0x00000002, 0x4030BC20, 0xAE604702, - 0x00000002, 0x0030BC83, 0xAE604702, 0x00000002, 0x4030BC20, 0xAE604E02, - 0x00000002, 0x0030BC83, 0xAE604E02, 0x00000002, 0x4030BC20, 0xAD806802, - 0x00000002, 0x0030BC83, 0xAD806802, 0x00000002, 0x40320E20, 0xAE604E02, - 0x00000002, 0x00320E83, 0xAE604E02, 0x00000003, 0x0004B084, 0x029C1284, - 0x0004B29F, 0x00000003, 0x0004B084, 0x029D1884, 0x0004B29F, 0x00000003, - 0x0004B084, 0x02A5BA84, 0x0004B29F, 0x00000003, - // Block 244, offset 0x3d00 - 0x0004B084, 0x02B71284, 0x0004B29F, 0x00000003, 0x0004B084, 0x02C4A684, - 0x0004B29F, 0x00000003, 0x0004B084, 0x02CAAE84, 0x0004B29F, 0x00000003, - 0x0004B084, 0x02CE5884, 0x0004B29F, 0x00000003, 0x0004B084, 0x02E17284, - 0x0004B29F, 0x00000003, 0x0004B084, 0x02EDAE84, 0x0004B29F, 0x00000002, - 0x0065768E, 0x0065768F, 0x00000002, 0x0065768E, 0x00657691, 0x00000002, - 0x00657690, 0x0065768F, 0x00000002, 0x00657690, 0x00657691, 0x00000002, - 0x0065768E, 0x0065828F, 0x00000002, 0x0065768E, 0x00658291, 0x00000003, - 0x0065768E, 0x00658291, 0xA0812802, 0x00000002, 0x0065768E, 0x00658C91, - 0x00000003, 0x0065768E, 0x00658C91, 0xA0812802, 0x00000002, 0x0065768E, - 0x00659691, 0x00000003, 0x0065768E, 0x00659691, 0xA0812802, 0x00000002, - 0x0065768E, 0x0065A091, 0x00000002, 0x0065768E, - // Block 245, offset 0x3d40 - 0x0065AA8F, 0x00000002, 0x0065768E, 0x0065AA91, 0x00000003, 0x0065768E, - 0x0065AA91, 0xA0812802, 0x00000003, 0x0065768E, 0x0065AA91, 0xA0812902, - 0x00000002, 0x0065768E, 0x0065B491, 0x00000002, 0x0065768E, 0x0065BE8F, - 0x00000002, 0x0065768E, 0x0065BE91, 0x00000002, 0x0065768E, 0x0065C68F, - 0x00000002, 0x0065768E, 0x0065C691, 0x00000002, 0x0065768E, 0x0065D08F, - 0x00000002, 0x0065768E, 0x0065D091, 0x00000003, 0x0065768E, 0x0065D091, - 0xA0812802, 0x00000002, 0x0065788E, 0x0065788F, 0x00000002, 0x0065788E, - 0x00657891, 0x00000002, 0x00657890, 0x0065788F, 0x00000002, 0x00657890, - 0x00657891, 0x00000002, 0x0065788E, 0x00658491, 0x00000003, 0x0065788E, - 0x00658491, 0xA0812802, 0x00000002, 0x0065788E, 0x00658E8F, 0x00000002, - 0x0065788E, 0x00658E91, 0x00000003, 0x0065788E, - // Block 246, offset 0x3d80 - 0x00658E91, 0xA0812802, 0x00000002, 0x0065788E, 0x00659891, 0x00000003, - 0x0065788E, 0x00659891, 0xA0812802, 0x00000002, 0x0065788E, 0x0065A291, - 0x00000002, 0x0065788E, 0x0065AC8F, 0x00000002, 0x0065788E, 0x0065AC91, - 0x00000003, 0x0065788E, 0x0065AC91, 0xA0812802, 0x00000003, 0x0065788E, - 0x0065AC91, 0xA0812902, 0x00000002, 0x0065788E, 0x0065B691, 0x00000002, - 0x0065788E, 0x0065C88F, 0x00000002, 0x0065788E, 0x0065C891, 0x00000002, - 0x0065788E, 0x0065D291, 0x00000003, 0x0065788E, 0x0065D291, 0xA0812802, - 0x00000002, 0x00657A8E, 0x00657A8F, 0x00000002, 0x00657A8E, 0x00657A91, - 0x00000002, 0x00657A90, 0x00657A8F, 0x00000002, 0x00657A90, 0x00657A91, - 0x00000003, 0x00657A8E, 0x00657A91, 0xA0812802, 0x00000003, 0x00657A90, - 0x00657A8F, 0xA0812802, 0x00000003, 0x00657A90, - // Block 247, offset 0x3dc0 - 0x00657A91, 0xA0812802, 0x00000004, 0x00657A90, 0x00657A91, 0xA0812802, - 0xA0812802, 0x00000002, 0x00657A8E, 0x0065868F, 0x00000002, 0x00657A8E, - 0x00658691, 0x00000003, 0x00657A8E, 0x00658691, 0xA0812802, 0x00000002, - 0x00657A8E, 0x0065908F, 0x00000002, 0x00657A8E, 0x00659091, 0x00000003, - 0x00657A8E, 0x00659091, 0xA0812802, 0x00000002, 0x00657A8E, 0x00659A8F, - 0x00000002, 0x00657A8E, 0x00659A91, 0x00000003, 0x00657A8E, 0x00659A91, - 0xA0812802, 0x00000002, 0x00657A8E, 0x0065A48F, 0x00000002, 0x00657A8E, - 0x0065A491, 0x00000002, 0x00657A8E, 0x0065AE8F, 0x00000002, 0x00657A8E, - 0x0065AE91, 0x00000003, 0x00657A8E, 0x0065AE91, 0xA0812802, 0x00000003, - 0x00657A8E, 0x0065AE91, 0xA0812902, 0x00000002, 0x00657A8E, 0x0065B88F, - 0x00000002, 0x00657A8E, 0x0065B891, 0x00000002, - // Block 248, offset 0x3e00 - 0x00657A8E, 0x0065C08F, 0x00000002, 0x00657A8E, 0x0065C091, 0x00000002, - 0x00657A8E, 0x0065CA8F, 0x00000002, 0x00657A8E, 0x0065CA91, 0x00000002, - 0x00657E8E, 0x00657E8F, 0x00000002, 0x00657E8E, 0x00657E91, 0x00000002, - 0x00657E90, 0x00657E8F, 0x00000002, 0x00657E90, 0x00657E91, 0x00000002, - 0x00657E8E, 0x0065888F, 0x00000002, 0x00657E8E, 0x00658891, 0x00000003, - 0x00657E8E, 0x00658891, 0xA0812802, 0x00000002, 0x00657E8E, 0x00659291, - 0x00000003, 0x00657E8E, 0x00659291, 0xA0812802, 0x00000002, 0x00657E8E, - 0x00659C91, 0x00000003, 0x00657E8E, 0x00659C91, 0xA0812802, 0x00000002, - 0x00657E8E, 0x0065A691, 0x00000002, 0x00657E8E, 0x0065B08F, 0x00000002, - 0x00657E8E, 0x0065B091, 0x00000003, 0x00657E8E, 0x0065B091, 0xA0812802, - 0x00000003, 0x00657E8E, 0x0065B091, 0xA0812902, - // Block 249, offset 0x3e40 - 0x00000002, 0x00657E8E, 0x0065BA91, 0x00000002, 0x00657E8E, 0x0065CC8F, - 0x00000002, 0x00657E8E, 0x0065CC91, 0x00000002, 0x00657E8E, 0x0065D491, - 0x00000003, 0x00657E8E, 0x0065D491, 0xA0812802, 0x00000002, 0x0065808E, - 0x0065808F, 0x00000002, 0x0065808E, 0x00658091, 0x00000002, 0x00658090, - 0x0065808F, 0x00000002, 0x00658090, 0x00658091, 0x00000002, 0x0065808E, - 0x00658A91, 0x00000003, 0x0065808E, 0x00658A91, 0xA0812802, 0x00000002, - 0x0065808E, 0x00659491, 0x00000003, 0x0065808E, 0x00659491, 0xA0812802, - 0x00000002, 0x0065808E, 0x00659E8F, 0x00000002, 0x0065808E, 0x00659E91, - 0x00000003, 0x0065808E, 0x00659E91, 0xA0812802, 0x00000002, 0x0065808E, - 0x0065A891, 0x00000002, 0x0065808E, 0x0065B28F, 0x00000002, 0x0065808E, - 0x0065B291, 0x00000003, 0x0065808E, 0x0065B291, - // Block 250, offset 0x3e80 - 0xA0812802, 0x00000003, 0x0065808E, 0x0065B291, 0xA0812902, 0x00000002, - 0x0065808E, 0x0065BC91, 0x00000002, 0x0065808E, 0x0065C48F, 0x00000002, - 0x0065808E, 0x0065C491, 0x00000002, 0x0065808E, 0x0065CE8F, 0x00000002, - 0x0065808E, 0x0065CE91, 0x00000002, 0x0065808E, 0x0065D691, 0x00000003, - 0x0065808E, 0x0065D691, 0xA0812802, 0x00000002, 0x00658290, 0x0065828F, - 0x00000002, 0x00658290, 0x00658291, 0x00000003, 0x0065848F, 0x00658291, - 0xA0812802, 0x00000002, 0x00658490, 0x00658491, 0x00000003, 0x00658490, - 0x00658491, 0xA0812802, 0x00000004, 0x00658490, 0x00658491, 0xA0812802, - 0xA0812802, 0x00000002, 0x00658690, 0x0065868F, 0x00000002, 0x00658690, - 0x00658691, 0x00000003, 0x00658690, 0x0065868F, 0xA0812802, 0x00000003, - 0x00658690, 0x00658691, 0xA0812802, 0x00000004, - // Block 251, offset 0x3ec0 - 0x00658690, 0x00658691, 0xA0812802, 0xA0812802, 0x00000002, 0x00658890, - 0x0065888F, 0x00000002, 0x00658890, 0x00658891, 0x00000003, 0x00658A8F, - 0x00658891, 0xA0812802, 0x00000002, 0x00658A90, 0x00658A91, 0x00000003, - 0x00658A90, 0x00658A91, 0xA0812802, 0x00000004, 0x00658A90, 0x00658A91, - 0xA0812802, 0xA0812802, 0x00000002, 0x40658A21, 0x00659E91, 0x00000002, - 0x00658C90, 0x00658C91, 0x00000003, 0x00658C90, 0x00658C91, 0xA0812802, - 0x00000004, 0x00658C90, 0x00658C91, 0xA0812802, 0xA0812802, 0x00000002, - 0x00658E90, 0x00658E8F, 0x00000002, 0x00658E90, 0x00658E91, 0x00000003, - 0x00658E90, 0x00658E8F, 0xA0812802, 0x00000003, 0x00658E90, 0x00658E91, - 0xA0812802, 0x00000004, 0x00658E90, 0x00658E91, 0xA0812802, 0xA0812802, - 0x00000002, 0x00659090, 0x0065908F, 0x00000002, - // Block 252, offset 0x3f00 - 0x00659090, 0x00659091, 0x00000003, 0x00659090, 0x0065908F, 0xA0812802, - 0x00000003, 0x00659090, 0x00659091, 0xA0812802, 0x00000004, 0x00659090, - 0x00659091, 0xA0812802, 0xA0812802, 0x00000002, 0x00659290, 0x00659291, - 0x00000003, 0x00659290, 0x00659291, 0xA0812802, 0x00000004, 0x00659290, - 0x00659291, 0xA0812802, 0xA0812802, 0x00000002, 0x00659490, 0x00659491, - 0x00000003, 0x00659490, 0x00659491, 0xA0812802, 0x00000004, 0x00659490, - 0x00659491, 0xA0812802, 0xA0812802, 0x00000002, 0x00659690, 0x00659691, - 0x00000003, 0x00659690, 0x00659691, 0xA0812802, 0x00000004, 0x00659690, - 0x00659691, 0xA0812802, 0xA0812802, 0x00000002, 0x00659890, 0x00659891, - 0x00000003, 0x00659890, 0x00659891, 0xA0812802, 0x00000004, 0x00659890, - 0x00659891, 0xA0812802, 0xA0812802, 0x00000002, - // Block 253, offset 0x3f40 - 0x00659A90, 0x00659A8F, 0x00000002, 0x00659A90, 0x00659A91, 0x00000003, - 0x00659A90, 0x00659A8F, 0xA0812802, 0x00000003, 0x00659A90, 0x00659A91, - 0xA0812802, 0x00000004, 0x00659A90, 0x00659A91, 0xA0812802, 0xA0812802, - 0x00000002, 0x00659C90, 0x00659C91, 0x00000003, 0x00659C90, 0x00659C91, - 0xA0812802, 0x00000004, 0x00659C90, 0x00659C91, 0xA0812802, 0xA0812802, - 0x00000002, 0x00659E90, 0x00659E8F, 0x00000002, 0x00659E90, 0x00659E91, - 0x00000003, 0x00659E90, 0x00659E8F, 0xA0812802, 0x00000003, 0x00659E90, - 0x00659E91, 0xA0812802, 0x00000004, 0x00659E90, 0x00659E91, 0xA0812802, - 0xA0812802, 0x00000002, 0x0065A090, 0x0065A091, 0x00000002, 0x0065A290, - 0x0065A291, 0x00000002, 0x0065A490, 0x0065A48F, 0x00000002, 0x0065A490, - 0x0065A491, 0x00000002, 0x0065A690, 0x0065A691, - // Block 254, offset 0x3f80 - 0x00000002, 0x0065A890, 0x0065A891, 0x00000002, 0x0065AA90, 0x0065AA8F, - 0x00000002, 0x0065AA90, 0x0065AA91, 0x00000003, 0x0065AA90, 0x0065AA8F, - 0xA0812802, 0x00000003, 0x0065AA90, 0x0065AA91, 0xA0812802, 0x00000004, - 0x0065AA90, 0x0065AA91, 0xA0812802, 0xA0812802, 0x00000003, 0x0065AA90, - 0x0065AA91, 0xA0812902, 0x00000004, 0x0065AA90, 0x0065AA91, 0xA0812902, - 0xA0812802, 0x00000002, 0x0065AC90, 0x0065AC8F, 0x00000002, 0x0065AC90, - 0x0065AC91, 0x00000003, 0x0065AC90, 0x0065AC8F, 0xA0812802, 0x00000003, - 0x0065AC90, 0x0065AC91, 0xA0812802, 0x00000004, 0x0065AC90, 0x0065AC91, - 0xA0812802, 0xA0812802, 0x00000003, 0x0065AC90, 0x0065AC91, 0xA0812902, - 0x00000004, 0x0065AC90, 0x0065AC91, 0xA0812902, 0xA0812802, 0x00000002, - 0x0065AE90, 0x0065AE8F, 0x00000002, 0x0065AE90, - // Block 255, offset 0x3fc0 - 0x0065AE91, 0x00000003, 0x0065AE90, 0x0065AE8F, 0xA0812802, 0x00000003, - 0x0065AE90, 0x0065AE91, 0xA0812802, 0x00000004, 0x0065AE90, 0x0065AE91, - 0xA0812802, 0xA0812802, 0x00000003, 0x0065AE90, 0x0065AE91, 0xA0812902, - 0x00000004, 0x0065AE90, 0x0065AE91, 0xA0812902, 0xA0812802, 0x00000002, - 0x0065B090, 0x0065B08F, 0x00000002, 0x0065B090, 0x0065B091, 0x00000003, - 0x0065B090, 0x0065B08F, 0xA0812802, 0x00000003, 0x0065B090, 0x0065B091, - 0xA0812802, 0x00000004, 0x0065B090, 0x0065B091, 0xA0812802, 0xA0812802, - 0x00000003, 0x0065B090, 0x0065B091, 0xA0812902, 0x00000004, 0x0065B090, - 0x0065B091, 0xA0812902, 0xA0812802, 0x00000002, 0x0065B290, 0x0065B28F, - 0x00000002, 0x0065B290, 0x0065B291, 0x00000003, 0x0065B290, 0x0065B28F, - 0xA0812802, 0x00000003, 0x0065B290, 0x0065B291, - // Block 256, offset 0x4000 - 0xA0812802, 0x00000004, 0x0065B290, 0x0065B291, 0xA0812802, 0xA0812802, - 0x00000003, 0x0065B290, 0x0065B291, 0xA0812902, 0x00000004, 0x0065B290, - 0x0065B291, 0xA0812902, 0xA0812802, 0x00000002, 0x0065B490, 0x0065B491, - 0x00000002, 0x0065B690, 0x0065B691, 0x00000002, 0x0065B890, 0x0065B88F, - 0x00000002, 0x0065B890, 0x0065B891, 0x00000002, 0x0065BA90, 0x0065BA91, - 0x00000002, 0x0065BC90, 0x0065BC91, 0x00000002, 0x0065BE90, 0x0065BE8F, - 0x00000002, 0x0065BE90, 0x0065BE91, 0x00000002, 0x0065C090, 0x0065C08F, - 0x00000002, 0x0065C090, 0x0065C091, 0x00000002, 0x0065C490, 0x0065C48F, - 0x00000002, 0x0065C490, 0x0065C491, 0x00000002, 0x4065C421, 0x0065C891, - 0x00000002, 0x0065C690, 0x0065C68F, 0x00000002, 0x0065C690, 0x0065C691, - 0x00000002, 0x0065C890, 0x0065C88F, 0x00000002, - // Block 257, offset 0x4040 - 0x0065C890, 0x0065C891, 0x00000002, 0x0065CA90, 0x0065CA8F, 0x00000002, - 0x0065CA90, 0x0065CA91, 0x00000002, 0x0065CC90, 0x0065CC8F, 0x00000002, - 0x0065CC90, 0x0065CC91, 0x00000002, 0x0065CE90, 0x0065CE8F, 0x00000002, - 0x0065CE90, 0x0065CE91, 0x00000002, 0x0065D090, 0x0065D08F, 0x00000002, - 0x0065D090, 0x0065D091, 0x00000003, 0x0065D090, 0x0065D08F, 0xA0812802, - 0x00000003, 0x0065D090, 0x0065D091, 0xA0812802, 0x00000004, 0x0065D090, - 0x0065D091, 0xA0812802, 0xA0812802, 0x00000002, 0x0065D290, 0x0065D291, - 0x00000003, 0x0065D290, 0x0065D291, 0xA0812802, 0x00000004, 0x0065D290, - 0x0065D291, 0xA0812802, 0xA0812802, 0x00000002, 0x0065D490, 0x0065D491, - 0x00000003, 0x0065D490, 0x0065D491, 0xA0812802, 0x00000004, 0x0065D490, - 0x0065D491, 0xA0812802, 0xA0812802, 0x00000002, - // Block 258, offset 0x4080 - 0x0065D690, 0x0065D691, 0x00000003, 0x0065D690, 0x0065D691, 0xA0812802, - 0x00000004, 0x0065D690, 0x0065D691, 0xA0812802, 0xA0812802, 0x00000002, - 0x0065D890, 0x0065D891, 0x00000002, 0x02B24E9C, 0x02D6C69C, 0x00000002, - 0x02BCE69C, 0x02C4209C, 0x00000002, 0x02CC1C9C, 0x02D9769C, 0x00000002, - 0x02CC5A9C, 0x02A9189C, 0x00000003, 0x00032683, 0x404FDA20, 0x40032620, - 0x00000003, 0x404FD821, 0x82092817, 0x404FA420, 0x00000003, 0x404FD821, - 0x82092817, 0x404FA620, 0x00000003, 0x404FD821, 0x82092817, 0x404FA820, - 0x00000003, 0x404FD821, 0x82092817, 0x404FAA20, 0x00000003, 0x404FD821, - 0x82092817, 0x404FAC20, 0x00000003, 0x404FD821, 0x82092817, 0x404FAE20, - 0x00000003, 0x404FD821, 0x82092817, 0x404FB020, 0x00000003, 0x404FD821, - 0x82092817, 0x404FB220, 0x00000003, 0x404FD821, - // Block 259, offset 0x40c0 - 0x82092817, 0x404FB420, 0x00000003, 0x404FD821, 0x82092817, 0x404FB620, - 0x00000003, 0x404FD821, 0x82092817, 0x404FB820, 0x00000003, 0x404FD821, - 0x82092817, 0x404FBA20, 0x00000003, 0x404FD821, 0x82092817, 0x404FBC20, - 0x00000003, 0x404FD821, 0x82092817, 0x404FBE20, 0x00000003, 0x404FD821, - 0x82092817, 0x404FC020, 0x00000003, 0x404FD821, 0x82092817, 0x404FC220, - 0x00000003, 0x404FD821, 0x82092817, 0x404FC420, 0x00000003, 0x404FD821, - 0x82092817, 0x404FC620, 0x00000003, 0x404FD821, 0x82092817, 0x404FC820, - 0x00000003, 0x404FD821, 0x82092817, 0x404FCA20, 0x00000003, 0x404FD821, - 0x82092817, 0x404FCC20, 0x00000003, 0x404FD821, 0x82092817, 0x404FCE20, - 0x00000003, 0x404FD821, 0x82092817, 0x404FD020, 0x00000003, 0x404FD821, - 0x82092817, 0x404FD220, 0x00000003, 0x404FD821, - // Block 260, offset 0x4100 - 0x82092817, 0x404FD420, 0x00000003, 0x404FD821, 0x82092817, 0x404FD620, - 0x00000003, 0x404FD821, 0x82092817, 0x404FD820, 0x00000003, 0x404FD821, - 0x82092817, 0x404FDA20, 0x00000003, 0x404FD821, 0x82092817, 0x404FDA20, - 0x00000003, 0x404FD821, 0x82092817, 0x404FDC20, 0x00000003, 0x404FD821, - 0x82092817, 0x404FDC20, 0x00000003, 0x404FD821, 0x82092817, 0x404FDC20, - 0x00000003, 0x404FD821, 0x82092817, 0x404FDE20, 0x00000003, 0x404FD821, - 0x82092817, 0x404FDE20, 0x00000003, 0x404FD821, 0x82092817, 0x404FE020, - 0x00000003, 0x404FD821, 0x82092817, 0x404FE220, 0x00000003, 0x404FD821, - 0x82092817, 0x404FE420, 0x00000003, 0x404FD821, 0x82092817, 0x404FE620, - 0x00000003, 0x404FD821, 0x82092817, 0x404FE820, 0x00000002, 0x404FE820, - 0x40500E20, 0x00000002, 0x404FE821, 0x40501020, - // Block 261, offset 0x4140 - 0x00000002, 0x404FE821, 0x40501220, 0x00000002, 0x404FE821, 0x40501820, - 0x00000003, 0x004FE8A3, 0x40501820, 0x404FA420, 0x00000002, 0x404FE821, - 0x40501A20, 0x00000003, 0x004FE8A3, 0x40501A20, 0x404FDC20, 0x00000002, - 0x404FE821, 0x40502620, 0x00000002, 0x404FE821, 0x40502820, 0x00000002, - 0x404FE821, 0x40502A20, 0x00000002, 0x004FE8A3, 0x40502A20, 0x00000002, - 0x404FE821, 0x40502C20, 0x00000002, 0x4062AC21, 0x4063A820, 0x00000002, - 0x4062AC22, 0x4063A820, 0x00000002, 0x4062AC23, 0x4063A820, 0x00000002, - 0x4062AC24, 0x4063A820, 0x00000002, 0x4062AC25, 0x4063A820, 0x00000002, - 0x4062AC26, 0x4063A820, 0x00000002, 0x4062AC27, 0x4063A820, 0x00000002, - 0x4062AC28, 0x4063A820, 0x00000002, 0x4062AC29, 0x4063A820, 0x00000002, - 0x4062AC2A, 0x4063A820, 0x00000002, 0x4062AC2B, - // Block 262, offset 0x4180 - 0x4063A820, 0x00000002, 0x4062AC2C, 0x4063A820, 0x00000002, 0x4062AC2D, - 0x4063A820, 0x00000002, 0x4062AC2E, 0x4063A820, 0x00000002, 0x4062AC2F, - 0x4063A820, 0x00000002, 0x4062AC30, 0x4063A820, 0x00000002, 0x4062AC31, - 0x4063A820, 0x00000002, 0x4062AC32, 0x4063A820, 0x00000002, 0x4062AC33, - 0x4063A820, 0x00000002, 0x4062AC34, 0x4063A820, 0x00000002, 0x4062AC35, - 0x4063A820, 0x00000002, 0x4062AC36, 0x4063A820, 0x00000002, 0x4062AC37, - 0x4063A820, 0x00000002, 0x4062AC38, 0x4063A820, 0x00000002, 0x4062AC39, - 0x4063A820, 0x00000002, 0x4062AC3A, 0x4063A820, 0x00000002, 0x4062AC3B, - 0x4063A820, 0x00000002, 0x4062AC3C, 0x4063A820, 0x00000002, 0x4062AC3D, - 0x4063A820, 0x00000002, 0x4062AC3E, 0x4063A820, 0x00000002, 0x4062AC3F, - 0x4063A820, 0x00000002, 0x4062AC40, 0x4063A820, - // Block 263, offset 0x41c0 - 0x00000002, 0x4062AC41, 0x4063A820, 0x00000002, 0x4062AC42, 0x4063A820, - 0x00000002, 0x4062AC43, 0x4063A820, 0x00000002, 0x4062AC44, 0x4063A820, - 0x00000002, 0x4062AC45, 0x4063A820, 0x00000002, 0x4062AC46, 0x4063A820, - 0x00000002, 0x4062AC47, 0x4063A820, 0x00000002, 0x4062AC48, 0x4063A820, - 0x00000002, 0x4062AC49, 0x4063A820, 0x00000002, 0x4062AC4A, 0x4063A820, - 0x00000002, 0x4062AC4B, 0x4063A820, 0x00000002, 0x4062AC4C, 0x4063A820, - 0x00000003, 0x4062AC21, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC22, - 0x4063A820, 0x40646420, 0x00000003, 0x4062AC23, 0x4063A820, 0x40646420, - 0x00000003, 0x4062AC24, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC25, - 0x4063A820, 0x40646420, 0x00000003, 0x4062AC26, 0x4063A820, 0x40646420, - 0x00000003, 0x4062AC27, 0x4063A820, 0x40646420, - // Block 264, offset 0x4200 - 0x00000003, 0x4062AC28, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC29, - 0x4063A820, 0x40646420, 0x00000003, 0x4062AC2A, 0x4063A820, 0x40646420, - 0x00000003, 0x4062AC2B, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC2C, - 0x4063A820, 0x40646420, 0x00000003, 0x4062AC2D, 0x4063A820, 0x40646420, - 0x00000003, 0x4062AC2E, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC2F, - 0x4063A820, 0x40646420, 0x00000003, 0x4062AC30, 0x4063A820, 0x40646420, - 0x00000003, 0x4062AC31, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC21, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC22, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062AC23, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC24, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC25, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062AC26, 0x4063A820, 0x40646A20, - // Block 265, offset 0x4240 - 0x00000003, 0x4062AC27, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC28, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC29, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062AC2A, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC2B, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC2C, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062AC2D, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC2E, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC2F, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062AC30, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC31, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC32, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062AC33, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC34, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC35, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062AC36, 0x4063A820, 0x40646A20, - // Block 266, offset 0x4280 - 0x00000003, 0x4062AC37, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC38, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC39, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062AC3A, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC3B, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC3C, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062AC3D, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC3E, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC3F, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062AC40, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC41, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC42, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062AC43, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC21, - 0x4063A820, 0x40647220, 0x00000003, 0x4062AC22, 0x4063A820, 0x40647220, - 0x00000003, 0x4062AC23, 0x4063A820, 0x40647220, - // Block 267, offset 0x42c0 - 0x00000003, 0x4062AC24, 0x4063A820, 0x40647220, 0x00000003, 0x4062AC25, - 0x4063A820, 0x40647220, 0x00000003, 0x4062AC26, 0x4063A820, 0x40647220, - 0x00000003, 0x4062AC27, 0x4063A820, 0x40647220, 0x00000003, 0x4062AC28, - 0x4063A820, 0x40647220, 0x00000003, 0x4062AC29, 0x4063A820, 0x40647220, - 0x00000003, 0x4062AC2A, 0x4063A820, 0x40647220, 0x00000003, 0x4062AC2B, - 0x4063A820, 0x40647220, 0x00000003, 0x4062AC2C, 0x4063A820, 0x40647220, - 0x00000003, 0x4062AC2D, 0x4063A820, 0x40647220, 0x00000003, 0x4062AC2E, - 0x4063A820, 0x40647220, 0x00000003, 0x4062AC2F, 0x4063A820, 0x40647220, - 0x00000003, 0x4062AC30, 0x4063A820, 0x40647220, 0x00000003, 0x4062AC21, - 0x4063A820, 0x40648220, 0x00000003, 0x4062AC22, 0x4063A820, 0x40648220, - 0x00000003, 0x4062AC23, 0x4063A820, 0x40648220, - // Block 268, offset 0x4300 - 0x00000003, 0x4062AC24, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC25, - 0x4063A820, 0x40648220, 0x00000003, 0x4062AC26, 0x4063A820, 0x40648220, - 0x00000003, 0x4062AC27, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC28, - 0x4063A820, 0x40648220, 0x00000003, 0x4062AC29, 0x4063A820, 0x40648220, - 0x00000003, 0x4062AC2A, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC2B, - 0x4063A820, 0x40648220, 0x00000003, 0x4062AC2C, 0x4063A820, 0x40648220, - 0x00000003, 0x4062AC2D, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC2E, - 0x4063A820, 0x40648220, 0x00000003, 0x4062AC2F, 0x4063A820, 0x40648220, - 0x00000003, 0x4062AC30, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC31, - 0x4063A820, 0x40648220, 0x00000003, 0x4062AC32, 0x4063A820, 0x40648220, - 0x00000003, 0x4062AC33, 0x4063A820, 0x40648220, - // Block 269, offset 0x4340 - 0x00000003, 0x4062AC34, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC35, - 0x4063A820, 0x40648220, 0x00000003, 0x4062AC36, 0x4063A820, 0x40648220, - 0x00000003, 0x4062AC37, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC38, - 0x4063A820, 0x40648220, 0x00000003, 0x4062AC39, 0x4063A820, 0x40648220, - 0x00000003, 0x4062AC3A, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC3B, - 0x4063A820, 0x40648220, 0x00000003, 0x4062AC3C, 0x4063A820, 0x40648220, - 0x00000003, 0x4062AC3D, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC3E, - 0x4063A820, 0x40648220, 0x00000003, 0x4062AC3F, 0x4063A820, 0x40648220, - 0x00000003, 0x4062AC40, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC41, - 0x4063A820, 0x40648220, 0x00000003, 0x4062AC42, 0x4063A820, 0x40648220, - 0x00000003, 0x4062AC43, 0x4063A820, 0x40648220, - // Block 270, offset 0x4380 - 0x00000003, 0x4062AC21, 0x4063A820, 0x40648420, 0x00000003, 0x4062AC22, - 0x4063A820, 0x40648420, 0x00000003, 0x4062AC23, 0x4063A820, 0x40648420, - 0x00000003, 0x4062AC24, 0x4063A820, 0x40648420, 0x00000003, 0x4062AC25, - 0x4063A820, 0x40648420, 0x00000003, 0x4062AC26, 0x4063A820, 0x40648420, - 0x00000003, 0x4062AC27, 0x4063A820, 0x40648420, 0x00000003, 0x4062AC21, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC22, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC23, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC24, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC25, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC26, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC27, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC28, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC29, 0x4063A820, 0x40648C20, - // Block 271, offset 0x43c0 - 0x00000003, 0x4062AC2A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC2B, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC2C, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC2D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC2E, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC2F, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC30, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC31, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC32, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC33, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC34, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC35, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC36, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC37, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC38, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC39, 0x4063A820, 0x40648C20, - // Block 272, offset 0x4400 - 0x00000003, 0x4062AC3A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC3B, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC3C, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC3D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC3E, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC3F, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC40, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC41, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC42, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC43, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC44, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC45, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC46, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC47, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC48, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062AC49, 0x4063A820, 0x40648C20, - // Block 273, offset 0x4440 - 0x00000002, 0x4062AC21, 0x4063AA20, 0x00000002, 0x4062AC22, 0x4063AA20, - 0x00000002, 0x4062AC23, 0x4063AA20, 0x00000002, 0x4062AC24, 0x4063AA20, - 0x00000002, 0x4062AC25, 0x4063AA20, 0x00000002, 0x4062AC26, 0x4063AA20, - 0x00000002, 0x4062AC27, 0x4063AA20, 0x00000002, 0x4062AC28, 0x4063AA20, - 0x00000002, 0x4062AC29, 0x4063AA20, 0x00000002, 0x4062AC2A, 0x4063AA20, - 0x00000002, 0x4062AC2B, 0x4063AA20, 0x00000002, 0x4062AC2C, 0x4063AA20, - 0x00000002, 0x4062AC2D, 0x4063AA20, 0x00000002, 0x4062AC2E, 0x4063AA20, - 0x00000002, 0x4062AC2F, 0x4063AA20, 0x00000002, 0x4062AC30, 0x4063AA20, - 0x00000002, 0x4062AC31, 0x4063AA20, 0x00000002, 0x4062AC32, 0x4063AA20, - 0x00000002, 0x4062AC33, 0x4063AA20, 0x00000002, 0x4062AC34, 0x4063AA20, - 0x00000002, 0x4062AC35, 0x4063AA20, 0x00000002, - // Block 274, offset 0x4480 - 0x4062AC36, 0x4063AA20, 0x00000002, 0x4062AC37, 0x4063AA20, 0x00000002, - 0x4062AC38, 0x4063AA20, 0x00000002, 0x4062AC39, 0x4063AA20, 0x00000002, - 0x4062AC3A, 0x4063AA20, 0x00000003, 0x4062AC21, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062AC22, 0x4063AA20, 0x40646420, 0x00000003, 0x4062AC21, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062AC22, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062AC23, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062AC24, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062AC25, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062AC26, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062AC21, - 0x4063AC20, 0x40646420, 0x00000002, 0x4062AC21, 0x4063B020, 0x00000002, - 0x4062AC22, 0x4063B020, 0x00000002, 0x4062AC23, 0x4063B020, 0x00000002, - 0x4062AC24, 0x4063B020, 0x00000002, 0x4062AC25, - // Block 275, offset 0x44c0 - 0x4063B020, 0x00000002, 0x4062AC26, 0x4063B020, 0x00000002, 0x4062AC27, - 0x4063B020, 0x00000002, 0x4062AC28, 0x4063B020, 0x00000002, 0x4062AC29, - 0x4063B020, 0x00000002, 0x4062AC2A, 0x4063B020, 0x00000002, 0x4062AC2B, - 0x4063B020, 0x00000002, 0x4062AC2C, 0x4063B020, 0x00000002, 0x4062AC2D, - 0x4063B020, 0x00000002, 0x4062AC2E, 0x4063B020, 0x00000002, 0x4062AC2F, - 0x4063B020, 0x00000002, 0x4062AC30, 0x4063B020, 0x00000002, 0x4062AC31, - 0x4063B020, 0x00000002, 0x4062AC32, 0x4063B020, 0x00000002, 0x4062AC33, - 0x4063B020, 0x00000002, 0x4062AC34, 0x4063B020, 0x00000002, 0x4062AC35, - 0x4063B020, 0x00000002, 0x4062AC36, 0x4063B020, 0x00000002, 0x4062AC37, - 0x4063B020, 0x00000002, 0x4062AC38, 0x4063B020, 0x00000002, 0x4062AC39, - 0x4063B020, 0x00000002, 0x4062AC3A, 0x4063B020, - // Block 276, offset 0x4500 - 0x00000002, 0x4062AC3B, 0x4063B020, 0x00000002, 0x4062AC3C, 0x4063B020, - 0x00000002, 0x4062AC3D, 0x4063B020, 0x00000002, 0x4062AC3E, 0x4063B020, - 0x00000003, 0x4062AC21, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC22, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC23, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062AC24, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC25, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC26, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062AC27, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC28, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC29, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062AC2A, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC2B, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC2C, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062AC2D, 0x4063B020, 0x40646A20, - // Block 277, offset 0x4540 - 0x00000003, 0x4062AC2E, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC2F, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC30, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062AC31, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC32, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC21, 0x4063B020, 0x40647220, - 0x00000003, 0x4062AC22, 0x4063B020, 0x40647220, 0x00000003, 0x4062AC23, - 0x4063B020, 0x40647220, 0x00000003, 0x4062AC24, 0x4063B020, 0x40647220, - 0x00000003, 0x4062AC25, 0x4063B020, 0x40647220, 0x00000003, 0x4062AC26, - 0x4063B020, 0x40647220, 0x00000003, 0x4062AC27, 0x4063B020, 0x40647220, - 0x00000003, 0x4062AC21, 0x4063B020, 0x40648220, 0x00000003, 0x4062AC22, - 0x4063B020, 0x40648220, 0x00000003, 0x4062AC23, 0x4063B020, 0x40648220, - 0x00000003, 0x4062AC24, 0x4063B020, 0x40648220, - // Block 278, offset 0x4580 - 0x00000003, 0x4062AC25, 0x4063B020, 0x40648220, 0x00000003, 0x4062AC26, - 0x4063B020, 0x40648220, 0x00000003, 0x4062AC27, 0x4063B020, 0x40648220, - 0x00000003, 0x4062AC28, 0x4063B020, 0x40648220, 0x00000003, 0x4062AC29, - 0x4063B020, 0x40648220, 0x00000003, 0x4062AC21, 0x4063B020, 0x40648420, - 0x00000003, 0x4062AC22, 0x4063B020, 0x40648420, 0x00000003, 0x4062AC23, - 0x4063B020, 0x40648420, 0x00000003, 0x4062AC24, 0x4063B020, 0x40648420, - 0x00000003, 0x4062AC25, 0x4063B020, 0x40648420, 0x00000002, 0x4062AC21, - 0x4063B220, 0x00000002, 0x4062AC22, 0x4063B220, 0x00000002, 0x4062AC23, - 0x4063B220, 0x00000003, 0x4062AC21, 0x4063B420, 0x40646420, 0x00000003, - 0x4062AC22, 0x4063B420, 0x40646420, 0x00000003, 0x4062AC23, 0x4063B420, - 0x40646420, 0x00000003, 0x4062AC24, 0x4063B420, - // Block 279, offset 0x45c0 - 0x40646420, 0x00000003, 0x4062AC25, 0x4063B420, 0x40646420, 0x00000003, - 0x4062AC26, 0x4063B420, 0x40646420, 0x00000003, 0x4062AC27, 0x4063B420, - 0x40646420, 0x00000003, 0x4062AC28, 0x4063B420, 0x40646420, 0x00000003, - 0x4062AC29, 0x4063B420, 0x40646420, 0x00000003, 0x4062AC2A, 0x4063B420, - 0x40646420, 0x00000003, 0x4062AC2B, 0x4063B420, 0x40646420, 0x00000003, - 0x4062AC2C, 0x4063B420, 0x40646420, 0x00000003, 0x4062AC2D, 0x4063B420, - 0x40646420, 0x00000003, 0x4062AC21, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062AC22, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC23, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062AC24, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062AC25, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC26, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062AC27, 0x4063B420, - // Block 280, offset 0x4600 - 0x40646A20, 0x00000003, 0x4062AC28, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062AC29, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC2A, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062AC2B, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062AC2C, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC2D, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062AC2E, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062AC2F, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC30, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062AC31, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062AC32, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC33, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062AC34, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062AC21, 0x4063B420, 0x40647220, 0x00000003, 0x4062AC22, 0x4063B420, - 0x40647220, 0x00000003, 0x4062AC23, 0x4063B420, - // Block 281, offset 0x4640 - 0x40647220, 0x00000003, 0x4062AC24, 0x4063B420, 0x40647220, 0x00000003, - 0x4062AC25, 0x4063B420, 0x40647220, 0x00000003, 0x4062AC26, 0x4063B420, - 0x40647220, 0x00000003, 0x4062AC27, 0x4063B420, 0x40647220, 0x00000003, - 0x4062AC28, 0x4063B420, 0x40647220, 0x00000003, 0x4062AC29, 0x4063B420, - 0x40647220, 0x00000003, 0x4062AC21, 0x4063B420, 0x40648220, 0x00000003, - 0x4062AC22, 0x4063B420, 0x40648220, 0x00000003, 0x4062AC23, 0x4063B420, - 0x40648220, 0x00000003, 0x4062AC24, 0x4063B420, 0x40648220, 0x00000003, - 0x4062AC25, 0x4063B420, 0x40648220, 0x00000003, 0x4062AC26, 0x4063B420, - 0x40648220, 0x00000003, 0x4062AC27, 0x4063B420, 0x40648220, 0x00000003, - 0x4062AC28, 0x4063B420, 0x40648220, 0x00000003, 0x4062AC29, 0x4063B420, - 0x40648220, 0x00000003, 0x4062AC2A, 0x4063B420, - // Block 282, offset 0x4680 - 0x40648220, 0x00000003, 0x4062AC2B, 0x4063B420, 0x40648220, 0x00000003, - 0x4062AC2C, 0x4063B420, 0x40648220, 0x00000003, 0x4062AC2D, 0x4063B420, - 0x40648220, 0x00000003, 0x4062AC2E, 0x4063B420, 0x40648220, 0x00000003, - 0x4062AC2F, 0x4063B420, 0x40648220, 0x00000003, 0x4062AC21, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC22, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC23, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC24, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC25, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC26, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC27, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC28, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC29, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC2A, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC2B, 0x4063B420, - // Block 283, offset 0x46c0 - 0x40648C20, 0x00000003, 0x4062AC2C, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC2D, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC2E, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC2F, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC30, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC31, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC32, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC33, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC34, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC35, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC36, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC37, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC38, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC39, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC3A, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC3B, 0x4063B420, - // Block 284, offset 0x4700 - 0x40648C20, 0x00000003, 0x4062AC3C, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC3D, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC3E, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC3F, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC40, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC41, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC42, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC43, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC44, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC45, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC46, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC47, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC48, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC49, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC4A, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC4B, 0x4063B420, - // Block 285, offset 0x4740 - 0x40648C20, 0x00000003, 0x4062AC4C, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC4D, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC4E, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC4F, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC50, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC51, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC52, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC53, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC54, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC55, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC56, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC57, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC58, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC59, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC5A, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC5B, 0x4063B420, - // Block 286, offset 0x4780 - 0x40648C20, 0x00000003, 0x4062AC5C, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC5D, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC5E, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062AC5F, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062AC60, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC61, 0x4063B420, - 0x40648C20, 0x00000002, 0x4062AC21, 0x4063B620, 0x00000002, 0x4062AC22, - 0x4063B620, 0x00000002, 0x4062AC23, 0x4063B620, 0x00000002, 0x4062AC24, - 0x4063B620, 0x00000002, 0x4062AC25, 0x4063B620, 0x00000002, 0x4062AC26, - 0x4063B620, 0x00000002, 0x4062AC27, 0x4063B620, 0x00000002, 0x4062AC28, - 0x4063B620, 0x00000002, 0x4062AC29, 0x4063B620, 0x00000002, 0x4062AC2A, - 0x4063B620, 0x00000002, 0x4062AC2B, 0x4063B620, 0x00000002, 0x4062AC2C, - 0x4063B620, 0x00000002, 0x4062AC2D, 0x4063B620, - // Block 287, offset 0x47c0 - 0x00000002, 0x4062AC2E, 0x4063B620, 0x00000002, 0x4062AC2F, 0x4063B620, - 0x00000002, 0x4062AC30, 0x4063B620, 0x00000002, 0x4062AC31, 0x4063B620, - 0x00000002, 0x4062AC32, 0x4063B620, 0x00000002, 0x4062AC33, 0x4063B620, - 0x00000002, 0x4062AC34, 0x4063B620, 0x00000002, 0x4062AC35, 0x4063B620, - 0x00000002, 0x4062AC36, 0x4063B620, 0x00000002, 0x4062AC37, 0x4063B620, - 0x00000002, 0x4062AC38, 0x4063B620, 0x00000002, 0x4062AC39, 0x4063B620, - 0x00000002, 0x4062AC3A, 0x4063B620, 0x00000002, 0x4062AC3B, 0x4063B620, - 0x00000002, 0x4062AC3C, 0x4063B620, 0x00000002, 0x4062AC3D, 0x4063B620, - 0x00000002, 0x4062AC3E, 0x4063B620, 0x00000002, 0x4062AC3F, 0x4063B620, - 0x00000002, 0x4062AC40, 0x4063B620, 0x00000002, 0x4062AC41, 0x4063B620, - 0x00000002, 0x4062AC42, 0x4063B620, 0x00000002, - // Block 288, offset 0x4800 - 0x4062AC43, 0x4063B620, 0x00000002, 0x4062AC44, 0x4063B620, 0x00000002, - 0x4062AC21, 0x4063B820, 0x00000002, 0x4062AC22, 0x4063B820, 0x00000002, - 0x4062AC23, 0x4063B820, 0x00000002, 0x4062AC24, 0x4063B820, 0x00000002, - 0x4062AC25, 0x4063B820, 0x00000002, 0x4062AC26, 0x4063B820, 0x00000002, - 0x4062AC27, 0x4063B820, 0x00000002, 0x4062AC28, 0x4063B820, 0x00000002, - 0x4062AC29, 0x4063B820, 0x00000002, 0x4062AC2A, 0x4063B820, 0x00000002, - 0x4062AC2B, 0x4063B820, 0x00000002, 0x4062AC2C, 0x4063B820, 0x00000002, - 0x4062AC2D, 0x4063B820, 0x00000002, 0x4062AC2E, 0x4063B820, 0x00000002, - 0x4062AC2F, 0x4063B820, 0x00000002, 0x4062AC30, 0x4063B820, 0x00000002, - 0x4062AC31, 0x4063B820, 0x00000002, 0x4062AC32, 0x4063B820, 0x00000002, - 0x4062AC33, 0x4063B820, 0x00000002, 0x4062AC34, - // Block 289, offset 0x4840 - 0x4063B820, 0x00000002, 0x4062AC35, 0x4063B820, 0x00000002, 0x4062AC36, - 0x4063B820, 0x00000002, 0x4062AC37, 0x4063B820, 0x00000002, 0x4062AC38, - 0x4063B820, 0x00000002, 0x4062AC39, 0x4063B820, 0x00000002, 0x4062AC3A, - 0x4063B820, 0x00000002, 0x4062AC3B, 0x4063B820, 0x00000002, 0x4062AC3C, - 0x4063B820, 0x00000002, 0x4062AC3D, 0x4063B820, 0x00000002, 0x4062AC3E, - 0x4063B820, 0x00000002, 0x4062AC3F, 0x4063B820, 0x00000002, 0x4062AC40, - 0x4063B820, 0x00000002, 0x4062AC41, 0x4063B820, 0x00000002, 0x4062AC42, - 0x4063B820, 0x00000002, 0x4062AC43, 0x4063B820, 0x00000002, 0x4062AC44, - 0x4063B820, 0x00000002, 0x4062AC45, 0x4063B820, 0x00000002, 0x4062AC46, - 0x4063B820, 0x00000002, 0x4062AC47, 0x4063B820, 0x00000002, 0x4062AC48, - 0x4063B820, 0x00000002, 0x4062AC49, 0x4063B820, - // Block 290, offset 0x4880 - 0x00000002, 0x4062AC4A, 0x4063B820, 0x00000002, 0x4062AC4B, 0x4063B820, - 0x00000002, 0x4062AC4C, 0x4063B820, 0x00000002, 0x4062AC4D, 0x4063B820, - 0x00000002, 0x4062AC4E, 0x4063B820, 0x00000002, 0x4062AC4F, 0x4063B820, - 0x00000002, 0x4062AC50, 0x4063B820, 0x00000002, 0x4062AC51, 0x4063B820, - 0x00000002, 0x4062AC52, 0x4063B820, 0x00000002, 0x4062AC53, 0x4063B820, - 0x00000002, 0x4062AC54, 0x4063B820, 0x00000002, 0x4062AC55, 0x4063B820, - 0x00000002, 0x4062AC56, 0x4063B820, 0x00000002, 0x4062AC57, 0x4063B820, - 0x00000002, 0x4062AC58, 0x4063B820, 0x00000002, 0x4062AC59, 0x4063B820, - 0x00000002, 0x4062AC5A, 0x4063B820, 0x00000002, 0x4062AC5B, 0x4063B820, - 0x00000002, 0x4062AC5C, 0x4063B820, 0x00000002, 0x4062AC5D, 0x4063B820, - 0x00000002, 0x4062AC5E, 0x4063B820, 0x00000002, - // Block 291, offset 0x48c0 - 0x4062AC5F, 0x4063B820, 0x00000002, 0x4062AC60, 0x4063B820, 0x00000002, - 0x4062AC61, 0x4063B820, 0x00000002, 0x4062AC62, 0x4063B820, 0x00000002, - 0x4062AC63, 0x4063B820, 0x00000003, 0x4062AC21, 0x4063B820, 0x40646420, - 0x00000003, 0x4062AC22, 0x4063B820, 0x40646420, 0x00000003, 0x4062AC23, - 0x4063B820, 0x40646420, 0x00000003, 0x4062AC24, 0x4063B820, 0x40646420, - 0x00000003, 0x4062AC25, 0x4063B820, 0x40646420, 0x00000003, 0x4062AC26, - 0x4063B820, 0x40646420, 0x00000003, 0x4062AC27, 0x4063B820, 0x40646420, - 0x00000003, 0x4062AC28, 0x4063B820, 0x40646420, 0x00000003, 0x4062AC29, - 0x4063B820, 0x40646420, 0x00000003, 0x4062AC2A, 0x4063B820, 0x40646420, - 0x00000003, 0x4062AC2B, 0x4063B820, 0x40646420, 0x00000003, 0x4062AC2C, - 0x4063B820, 0x40646420, 0x00000003, 0x4062AC21, - // Block 292, offset 0x4900 - 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC22, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062AC23, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC24, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC25, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062AC26, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC27, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC28, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062AC29, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC2A, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC2B, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062AC2C, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC2D, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC2E, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062AC2F, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC30, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC31, - // Block 293, offset 0x4940 - 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC32, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062AC33, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC34, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC35, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062AC36, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC37, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC38, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062AC21, 0x4063B820, 0x40647220, 0x00000003, 0x4062AC22, - 0x4063B820, 0x40647220, 0x00000003, 0x4062AC23, 0x4063B820, 0x40647220, - 0x00000003, 0x4062AC24, 0x4063B820, 0x40647220, 0x00000003, 0x4062AC25, - 0x4063B820, 0x40647220, 0x00000003, 0x4062AC26, 0x4063B820, 0x40647220, - 0x00000003, 0x4062AC21, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC22, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC23, - // Block 294, offset 0x4980 - 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC24, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062AC25, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC26, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC27, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062AC28, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC29, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC2A, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062AC2B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC2C, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC2D, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062AC2E, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC2F, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC30, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062AC31, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC32, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC33, - // Block 295, offset 0x49c0 - 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC34, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062AC35, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC36, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC37, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062AC38, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC39, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC3A, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062AC3B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC3C, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC21, 0x4063B820, 0x40648E20, - 0x00000002, 0x4062AC21, 0x4063BA20, 0x00000002, 0x4062AC22, 0x4063BA20, - 0x00000002, 0x4062AC23, 0x4063BA20, 0x00000002, 0x4062AC24, 0x4063BA20, - 0x00000002, 0x4062AC25, 0x4063BA20, 0x00000002, 0x4062AC26, 0x4063BA20, - 0x00000002, 0x4062AC27, 0x4063BA20, 0x00000002, - // Block 296, offset 0x4a00 - 0x4062AC28, 0x4063BA20, 0x00000002, 0x4062AC29, 0x4063BA20, 0x00000002, - 0x4062AC2A, 0x4063BA20, 0x00000002, 0x4062AC2B, 0x4063BA20, 0x00000002, - 0x4062AC2C, 0x4063BA20, 0x00000002, 0x4062AC2D, 0x4063BA20, 0x00000002, - 0x4062AC2E, 0x4063BA20, 0x00000002, 0x4062AC2F, 0x4063BA20, 0x00000002, - 0x4062AC30, 0x4063BA20, 0x00000002, 0x4062AC31, 0x4063BA20, 0x00000002, - 0x4062AC32, 0x4063BA20, 0x00000002, 0x4062AC33, 0x4063BA20, 0x00000002, - 0x4062AC34, 0x4063BA20, 0x00000002, 0x4062AC35, 0x4063BA20, 0x00000002, - 0x4062AC36, 0x4063BA20, 0x00000002, 0x4062AC37, 0x4063BA20, 0x00000002, - 0x4062AC38, 0x4063BA20, 0x00000002, 0x4062AC39, 0x4063BA20, 0x00000003, - 0x4062AC21, 0x4063BA20, 0x40646420, 0x00000003, 0x4062AC22, 0x4063BA20, - 0x40646420, 0x00000003, 0x4062AC23, 0x4063BA20, - // Block 297, offset 0x4a40 - 0x40646420, 0x00000003, 0x4062AC24, 0x4063BA20, 0x40646420, 0x00000003, - 0x4062AC25, 0x4063BA20, 0x40646420, 0x00000003, 0x4062AC26, 0x4063BA20, - 0x40646420, 0x00000003, 0x4062AC27, 0x4063BA20, 0x40646420, 0x00000003, - 0x4062AC28, 0x4063BA20, 0x40646420, 0x00000003, 0x4062AC29, 0x4063BA20, - 0x40646420, 0x00000003, 0x4062AC21, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062AC22, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC23, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062AC24, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062AC25, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC26, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062AC27, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062AC28, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC29, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062AC2A, 0x4063BA20, - // Block 298, offset 0x4a80 - 0x40646A20, 0x00000003, 0x4062AC2B, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062AC2C, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC2D, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062AC2E, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062AC2F, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC30, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062AC31, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062AC32, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC33, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062AC34, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062AC35, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC36, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062AC37, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062AC38, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC39, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062AC3A, 0x4063BA20, - // Block 299, offset 0x4ac0 - 0x40646A20, 0x00000003, 0x4062AC3B, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062AC3C, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC3D, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062AC3E, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062AC3F, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC21, 0x4063BA20, - 0x40647220, 0x00000003, 0x4062AC22, 0x4063BA20, 0x40647220, 0x00000003, - 0x4062AC23, 0x4063BA20, 0x40647220, 0x00000003, 0x4062AC24, 0x4063BA20, - 0x40647220, 0x00000003, 0x4062AC25, 0x4063BA20, 0x40647220, 0x00000003, - 0x4062AC26, 0x4063BA20, 0x40647220, 0x00000003, 0x4062AC27, 0x4063BA20, - 0x40647220, 0x00000003, 0x4062AC28, 0x4063BA20, 0x40647220, 0x00000003, - 0x4062AC29, 0x4063BA20, 0x40647220, 0x00000003, 0x4062AC2A, 0x4063BA20, - 0x40647220, 0x00000003, 0x4062AC21, 0x4063BA20, - // Block 300, offset 0x4b00 - 0x40648C20, 0x00000003, 0x4062AC22, 0x4063BA20, 0x40648C20, 0x00000003, - 0x4062AC23, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC24, 0x4063BA20, - 0x40648C20, 0x00000003, 0x4062AC25, 0x4063BA20, 0x40648C20, 0x00000003, - 0x4062AC26, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC27, 0x4063BA20, - 0x40648C20, 0x00000003, 0x4062AC28, 0x4063BA20, 0x40648C20, 0x00000003, - 0x4062AC29, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC2A, 0x4063BA20, - 0x40648C20, 0x00000003, 0x4062AC2B, 0x4063BA20, 0x40648C20, 0x00000003, - 0x4062AC2C, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC2D, 0x4063BA20, - 0x40648C20, 0x00000003, 0x4062AC2E, 0x4063BA20, 0x40648C20, 0x00000003, - 0x4062AC2F, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC30, 0x4063BA20, - 0x40648C20, 0x00000003, 0x4062AC31, 0x4063BA20, - // Block 301, offset 0x4b40 - 0x40648C20, 0x00000003, 0x4062AC32, 0x4063BA20, 0x40648C20, 0x00000003, - 0x4062AC33, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC34, 0x4063BA20, - 0x40648C20, 0x00000003, 0x4062AC35, 0x4063BA20, 0x40648C20, 0x00000003, - 0x4062AC36, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC37, 0x4063BA20, - 0x40648C20, 0x00000003, 0x4062AC38, 0x4063BA20, 0x40648C20, 0x00000002, - 0x4062AC21, 0x4063BC20, 0x00000002, 0x4062AC22, 0x4063BC20, 0x00000002, - 0x4062AC23, 0x4063BC20, 0x00000002, 0x4062AC24, 0x4063BC20, 0x00000002, - 0x4062AC25, 0x4063BC20, 0x00000002, 0x4062AC26, 0x4063BC20, 0x00000002, - 0x4062AC27, 0x4063BC20, 0x00000002, 0x4062AC21, 0x4063BE20, 0x00000002, - 0x4062AC22, 0x4063BE20, 0x00000002, 0x4062AC23, 0x4063BE20, 0x00000002, - 0x4062AC24, 0x4063BE20, 0x00000002, 0x4062AC25, - // Block 302, offset 0x4b80 - 0x4063BE20, 0x00000002, 0x4062AC26, 0x4063BE20, 0x00000002, 0x4062AC27, - 0x4063BE20, 0x00000002, 0x4062AC28, 0x4063BE20, 0x00000002, 0x4062AC29, - 0x4063BE20, 0x00000002, 0x4062AC2A, 0x4063BE20, 0x00000002, 0x4062AC2B, - 0x4063BE20, 0x00000002, 0x4062AC2C, 0x4063BE20, 0x00000002, 0x4062AC2D, - 0x4063BE20, 0x00000002, 0x4062AC2E, 0x4063BE20, 0x00000002, 0x4062AC2F, - 0x4063BE20, 0x00000002, 0x4062AC30, 0x4063BE20, 0x00000003, 0x4062AC21, - 0x4063BE20, 0x40646420, 0x00000003, 0x4062AC21, 0x4063BE20, 0x40648C20, - 0x00000003, 0x4062AC22, 0x4063BE20, 0x40648C20, 0x00000003, 0x4062AC23, - 0x4063BE20, 0x40648C20, 0x00000003, 0x4062AC24, 0x4063BE20, 0x40648C20, - 0x00000003, 0x4062AC25, 0x4063BE20, 0x40648C20, 0x00000003, 0x4062AC26, - 0x4063BE20, 0x40648C20, 0x00000003, 0x4062AC27, - // Block 303, offset 0x4bc0 - 0x4063BE20, 0x40648C20, 0x00000003, 0x4062AC28, 0x4063BE20, 0x40648C20, - 0x00000002, 0x4062AC21, 0x4063C020, 0x00000002, 0x4062AC22, 0x4063C020, - 0x00000002, 0x4062AC23, 0x4063C020, 0x00000002, 0x4062AC24, 0x4063C020, - 0x00000002, 0x4062AC25, 0x4063C020, 0x00000002, 0x4062AC26, 0x4063C020, - 0x00000002, 0x4062AC27, 0x4063C020, 0x00000002, 0x4062AC28, 0x4063C020, - 0x00000002, 0x4062AC29, 0x4063C020, 0x00000002, 0x4062AC2A, 0x4063C020, - 0x00000002, 0x4062AC2B, 0x4063C020, 0x00000002, 0x4062AC2C, 0x4063C020, - 0x00000002, 0x4062AC2D, 0x4063C020, 0x00000002, 0x4062AC2E, 0x4063C020, - 0x00000002, 0x4062AC2F, 0x4063C020, 0x00000002, 0x4062AC30, 0x4063C020, - 0x00000002, 0x4062AC31, 0x4063C020, 0x00000002, 0x4062AC32, 0x4063C020, - 0x00000002, 0x4062AC33, 0x4063C020, 0x00000002, - // Block 304, offset 0x4c00 - 0x4062AC34, 0x4063C020, 0x00000002, 0x4062AC35, 0x4063C020, 0x00000002, - 0x4062AC36, 0x4063C020, 0x00000002, 0x4062AC37, 0x4063C020, 0x00000002, - 0x4062AC38, 0x4063C020, 0x00000002, 0x4062AC39, 0x4063C020, 0x00000002, - 0x4062AC3A, 0x4063C020, 0x00000002, 0x4062AC3B, 0x4063C020, 0x00000002, - 0x4062AC3C, 0x4063C020, 0x00000002, 0x4062AC3D, 0x4063C020, 0x00000002, - 0x4062AC3E, 0x4063C020, 0x00000002, 0x4062AC3F, 0x4063C020, 0x00000002, - 0x4062AC40, 0x4063C020, 0x00000002, 0x4062AC41, 0x4063C020, 0x00000002, - 0x4062AC42, 0x4063C020, 0x00000002, 0x4062AC43, 0x4063C020, 0x00000002, - 0x4062AC44, 0x4063C020, 0x00000002, 0x4062AC45, 0x4063C020, 0x00000002, - 0x4062AC46, 0x4063C020, 0x00000002, 0x4062AC47, 0x4063C020, 0x00000002, - 0x4062AC48, 0x4063C020, 0x00000002, 0x4062AC49, - // Block 305, offset 0x4c40 - 0x4063C020, 0x00000002, 0x4062AC4A, 0x4063C020, 0x00000002, 0x4062AC4B, - 0x4063C020, 0x00000002, 0x4062AC4C, 0x4063C020, 0x00000002, 0x4062AC21, - 0x4063C220, 0x00000002, 0x4062AC22, 0x4063C220, 0x00000002, 0x4062AC23, - 0x4063C220, 0x00000002, 0x4062AC24, 0x4063C220, 0x00000002, 0x4062AC25, - 0x4063C220, 0x00000002, 0x4062AC26, 0x4063C220, 0x00000002, 0x4062AC27, - 0x4063C220, 0x00000002, 0x4062AC28, 0x4063C220, 0x00000002, 0x4062AC29, - 0x4063C220, 0x00000002, 0x4062AC2A, 0x4063C220, 0x00000002, 0x4062AC2B, - 0x4063C220, 0x00000002, 0x4062AC2C, 0x4063C220, 0x00000002, 0x4062AC2D, - 0x4063C220, 0x00000002, 0x4062AC2E, 0x4063C220, 0x00000002, 0x4062AC2F, - 0x4063C220, 0x00000002, 0x4062AC30, 0x4063C220, 0x00000002, 0x4062AC31, - 0x4063C220, 0x00000002, 0x4062AC32, 0x4063C220, - // Block 306, offset 0x4c80 - 0x00000002, 0x4062AC33, 0x4063C220, 0x00000002, 0x4062AC34, 0x4063C220, - 0x00000002, 0x4062AC35, 0x4063C220, 0x00000002, 0x4062AC36, 0x4063C220, - 0x00000002, 0x4062AC37, 0x4063C220, 0x00000002, 0x4062AC38, 0x4063C220, - 0x00000002, 0x4062AC39, 0x4063C220, 0x00000002, 0x4062AC3A, 0x4063C220, - 0x00000002, 0x4062AC3B, 0x4063C220, 0x00000002, 0x4062AC3C, 0x4063C220, - 0x00000002, 0x4062AC3D, 0x4063C220, 0x00000002, 0x4062AC3E, 0x4063C220, - 0x00000002, 0x4062AC3F, 0x4063C220, 0x00000002, 0x4062AC40, 0x4063C220, - 0x00000002, 0x4062AC41, 0x4063C220, 0x00000002, 0x4062AC42, 0x4063C220, - 0x00000002, 0x4062AC43, 0x4063C220, 0x00000002, 0x4062AC44, 0x4063C220, - 0x00000002, 0x4062AC45, 0x4063C220, 0x00000002, 0x4062AC46, 0x4063C220, - 0x00000002, 0x4062AC47, 0x4063C220, 0x00000002, - // Block 307, offset 0x4cc0 - 0x4062AC48, 0x4063C220, 0x00000002, 0x4062AC49, 0x4063C220, 0x00000002, - 0x4062AC4A, 0x4063C220, 0x00000002, 0x4062AC4B, 0x4063C220, 0x00000002, - 0x4062AC4C, 0x4063C220, 0x00000002, 0x4062AC4D, 0x4063C220, 0x00000002, - 0x4062AC4E, 0x4063C220, 0x00000002, 0x4062AC4F, 0x4063C220, 0x00000002, - 0x4062AC50, 0x4063C220, 0x00000002, 0x4062AC51, 0x4063C220, 0x00000002, - 0x4062AC52, 0x4063C220, 0x00000002, 0x4062AC53, 0x4063C220, 0x00000002, - 0x4062AC54, 0x4063C220, 0x00000002, 0x4062AC55, 0x4063C220, 0x00000002, - 0x4062AC56, 0x4063C220, 0x00000002, 0x4062AC57, 0x4063C220, 0x00000002, - 0x4062AC58, 0x4063C220, 0x00000002, 0x4062AC59, 0x4063C220, 0x00000002, - 0x4062AC5A, 0x4063C220, 0x00000002, 0x4062AC5B, 0x4063C220, 0x00000002, - 0x4062AC5C, 0x4063C220, 0x00000002, 0x4062AC5D, - // Block 308, offset 0x4d00 - 0x4063C220, 0x00000002, 0x4062AC5E, 0x4063C220, 0x00000002, 0x4062AC5F, - 0x4063C220, 0x00000002, 0x4062AC60, 0x4063C220, 0x00000002, 0x4062AC61, - 0x4063C220, 0x00000002, 0x4062AC62, 0x4063C220, 0x00000002, 0x4062AC63, - 0x4063C220, 0x00000002, 0x4062AC64, 0x4063C220, 0x00000002, 0x4062AC65, - 0x4063C220, 0x00000002, 0x4062AC66, 0x4063C220, 0x00000002, 0x4062AC67, - 0x4063C220, 0x00000002, 0x4062AC68, 0x4063C220, 0x00000002, 0x4062AC69, - 0x4063C220, 0x00000002, 0x4062AC6A, 0x4063C220, 0x00000002, 0x4062AC6B, - 0x4063C220, 0x00000002, 0x4062AC6C, 0x4063C220, 0x00000002, 0x4062AC6D, - 0x4063C220, 0x00000002, 0x4062AC6E, 0x4063C220, 0x00000002, 0x4062AC6F, - 0x4063C220, 0x00000002, 0x4062AC70, 0x4063C220, 0x00000002, 0x4062AC71, - 0x4063C220, 0x00000002, 0x4062AC72, 0x4063C220, - // Block 309, offset 0x4d40 - 0x00000002, 0x4062AC73, 0x4063C220, 0x00000002, 0x4062AC74, 0x4063C220, - 0x00000002, 0x4062AC75, 0x4063C220, 0x00000002, 0x4062AC76, 0x4063C220, - 0x00000002, 0x4062AC77, 0x4063C220, 0x00000002, 0x4062AC78, 0x4063C220, - 0x00000002, 0x4062AC79, 0x4063C220, 0x00000002, 0x4062AC7A, 0x4063C220, - 0x00000002, 0x4062AC7B, 0x4063C220, 0x00000002, 0x4062AC7C, 0x4063C220, - 0x00000002, 0x4062AC7D, 0x4063C220, 0x00000002, 0x4062AC7E, 0x4063C220, - 0x00000002, 0x4062AC7F, 0x4063C220, 0x00000002, 0x4062AC80, 0x4063C220, - 0x00000002, 0x4062AC81, 0x4063C220, 0x00000002, 0x4062AC82, 0x4063C220, - 0x00000002, 0x4062AC83, 0x4063C220, 0x00000002, 0x4062AC84, 0x4063C220, - 0x00000002, 0x4062AC85, 0x4063C220, 0x00000002, 0x4062AC86, 0x4063C220, - 0x00000002, 0x4062AC87, 0x4063C220, 0x00000003, - // Block 310, offset 0x4d80 - 0x4062AC21, 0x4063C220, 0x40646420, 0x00000003, 0x4062AC22, 0x4063C220, - 0x40646420, 0x00000003, 0x4062AC23, 0x4063C220, 0x40646420, 0x00000003, - 0x4062AC24, 0x4063C220, 0x40646420, 0x00000003, 0x4062AC25, 0x4063C220, - 0x40646420, 0x00000003, 0x4062AC26, 0x4063C220, 0x40646420, 0x00000003, - 0x4062AC27, 0x4063C220, 0x40646420, 0x00000003, 0x4062AC28, 0x4063C220, - 0x40646420, 0x00000003, 0x4062AC29, 0x4063C220, 0x40646420, 0x00000003, - 0x4062AC2A, 0x4063C220, 0x40646420, 0x00000003, 0x4062AC21, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062AC22, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062AC23, 0x4063C220, 0x40646A20, 0x00000003, 0x4062AC24, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062AC25, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062AC26, 0x4063C220, 0x40646A20, 0x00000003, - // Block 311, offset 0x4dc0 - 0x4062AC27, 0x4063C220, 0x40646A20, 0x00000003, 0x4062AC28, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062AC29, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062AC21, 0x4063C220, 0x40647220, 0x00000003, 0x4062AC22, 0x4063C220, - 0x40647220, 0x00000003, 0x4062AC23, 0x4063C220, 0x40647220, 0x00000003, - 0x4062AC24, 0x4063C220, 0x40647220, 0x00000003, 0x4062AC25, 0x4063C220, - 0x40647220, 0x00000003, 0x4062AC26, 0x4063C220, 0x40647220, 0x00000003, - 0x4062AC27, 0x4063C220, 0x40647220, 0x00000003, 0x4062AC28, 0x4063C220, - 0x40647220, 0x00000003, 0x4062AC21, 0x4063C220, 0x40648C20, 0x00000003, - 0x4062AC22, 0x4063C220, 0x40648C20, 0x00000003, 0x4062AC23, 0x4063C220, - 0x40648C20, 0x00000003, 0x4062AC24, 0x4063C220, 0x40648C20, 0x00000003, - 0x4062AC25, 0x4063C220, 0x40648C20, 0x00000003, - // Block 312, offset 0x4e00 - 0x4062AC26, 0x4063C220, 0x40648C20, 0x00000003, 0x4062AC27, 0x4063C220, - 0x40648C20, 0x00000003, 0x4062AC21, 0x4063C420, 0x40646A20, 0x00000003, - 0x4062AC22, 0x4063C420, 0x40646A20, 0x00000003, 0x4062AC23, 0x4063C420, - 0x40646A20, 0x00000003, 0x4062AC24, 0x4063C420, 0x40646A20, 0x00000003, - 0x4062AC25, 0x4063C420, 0x40646A20, 0x00000003, 0x4062AC26, 0x4063C420, - 0x40646A20, 0x00000003, 0x4062AC27, 0x4063C420, 0x40646A20, 0x00000003, - 0x4062AC28, 0x4063C420, 0x40646A20, 0x00000003, 0x4062AC29, 0x4063C420, - 0x40646A20, 0x00000003, 0x4062AC2A, 0x4063C420, 0x40646A20, 0x00000003, - 0x4062AC2B, 0x4063C420, 0x40646A20, 0x00000003, 0x4062AC2C, 0x4063C420, - 0x40646A20, 0x00000003, 0x4062AC2D, 0x4063C420, 0x40646A20, 0x00000003, - 0x4062AC2E, 0x4063C420, 0x40646A20, 0x00000003, - // Block 313, offset 0x4e40 - 0x4062AC2F, 0x4063C420, 0x40646A20, 0x00000003, 0x4062AC30, 0x4063C420, - 0x40646A20, 0x00000003, 0x4062AC21, 0x4063C420, 0x40647220, 0x00000003, - 0x4062AC22, 0x4063C420, 0x40647220, 0x00000003, 0x4062AC23, 0x4063C420, - 0x40647220, 0x00000003, 0x4062AC24, 0x4063C420, 0x40647220, 0x00000003, - 0x4062AC25, 0x4063C420, 0x40647220, 0x00000002, 0x4062AC21, 0x4063C620, - 0x00000002, 0x4062AC22, 0x4063C620, 0x00000002, 0x4062AC23, 0x4063C620, - 0x00000002, 0x4062AC24, 0x4063C620, 0x00000002, 0x4062AC25, 0x4063C620, - 0x00000002, 0x4062AC26, 0x4063C620, 0x00000002, 0x4062AC27, 0x4063C620, - 0x00000002, 0x4062AC28, 0x4063C620, 0x00000002, 0x4062AC29, 0x4063C620, - 0x00000002, 0x4062AC2A, 0x4063C620, 0x00000002, 0x4062AC2B, 0x4063C620, - 0x00000002, 0x4062AC2C, 0x4063C620, 0x00000002, - // Block 314, offset 0x4e80 - 0x4062AC2D, 0x4063C620, 0x00000002, 0x4062AC2E, 0x4063C620, 0x00000002, - 0x4062AC2F, 0x4063C620, 0x00000002, 0x4062AC30, 0x4063C620, 0x00000002, - 0x4062AC31, 0x4063C620, 0x00000002, 0x4062AC32, 0x4063C620, 0x00000002, - 0x4062AC33, 0x4063C620, 0x00000002, 0x4062AC34, 0x4063C620, 0x00000002, - 0x4062AC21, 0x4063C820, 0x00000002, 0x4062AC22, 0x4063C820, 0x00000002, - 0x4062AC23, 0x4063C820, 0x00000002, 0x4062AC24, 0x4063C820, 0x00000002, - 0x4062AC21, 0x4063CA20, 0x00000002, 0x4062AC22, 0x4063CA20, 0x00000002, - 0x4062AC23, 0x4063CA20, 0x00000002, 0x4062AC24, 0x4063CA20, 0x00000002, - 0x4062AC25, 0x4063CA20, 0x00000002, 0x4062AC26, 0x4063CA20, 0x00000002, - 0x4062AC27, 0x4063CA20, 0x00000002, 0x4062AC28, 0x4063CA20, 0x00000002, - 0x4062AC29, 0x4063CA20, 0x00000002, 0x4062AC2A, - // Block 315, offset 0x4ec0 - 0x4063CA20, 0x00000002, 0x4062AC2B, 0x4063CA20, 0x00000002, 0x4062AC2C, - 0x4063CA20, 0x00000002, 0x4062AC2D, 0x4063CA20, 0x00000002, 0x4062AC2E, - 0x4063CA20, 0x00000002, 0x4062AC2F, 0x4063CA20, 0x00000002, 0x4062AC30, - 0x4063CA20, 0x00000002, 0x4062AC31, 0x4063CA20, 0x00000002, 0x4062AC32, - 0x4063CA20, 0x00000002, 0x4062AC33, 0x4063CA20, 0x00000002, 0x4062AC34, - 0x4063CA20, 0x00000002, 0x4062AC35, 0x4063CA20, 0x00000002, 0x4062AC36, - 0x4063CA20, 0x00000002, 0x4062AC37, 0x4063CA20, 0x00000002, 0x4062AC38, - 0x4063CA20, 0x00000002, 0x4062AC39, 0x4063CA20, 0x00000002, 0x4062AC3A, - 0x4063CA20, 0x00000002, 0x4062AC3B, 0x4063CA20, 0x00000002, 0x4062AC3C, - 0x4063CA20, 0x00000002, 0x4062AC3D, 0x4063CA20, 0x00000002, 0x4062AC3E, - 0x4063CA20, 0x00000002, 0x4062AC3F, 0x4063CA20, - // Block 316, offset 0x4f00 - 0x00000002, 0x4062AC40, 0x4063CA20, 0x00000003, 0x4062AC21, 0x4063CA20, - 0x40646A20, 0x00000003, 0x4062AC22, 0x4063CA20, 0x40646A20, 0x00000003, - 0x4062AC23, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062AC24, 0x4063CA20, - 0x40646A20, 0x00000003, 0x4062AC25, 0x4063CA20, 0x40646A20, 0x00000003, - 0x4062AC26, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062AC27, 0x4063CA20, - 0x40646A20, 0x00000003, 0x4062AC28, 0x4063CA20, 0x40646A20, 0x00000003, - 0x4062AC21, 0x4063CA20, 0x40647220, 0x00000003, 0x4062AC21, 0x4063CC20, - 0x40646420, 0x00000003, 0x4062AC22, 0x4063CC20, 0x40646420, 0x00000003, - 0x4062AC23, 0x4063CC20, 0x40646420, 0x00000003, 0x4062AC24, 0x4063CC20, - 0x40646420, 0x00000003, 0x4062AC25, 0x4063CC20, 0x40646420, 0x00000003, - 0x4062AC26, 0x4063CC20, 0x40646420, 0x00000003, - // Block 317, offset 0x4f40 - 0x4062AC27, 0x4063CC20, 0x40646420, 0x00000003, 0x4062AC28, 0x4063CC20, - 0x40646420, 0x00000003, 0x4062AC29, 0x4063CC20, 0x40646420, 0x00000003, - 0x4062AC2A, 0x4063CC20, 0x40646420, 0x00000003, 0x4062AC2B, 0x4063CC20, - 0x40646420, 0x00000003, 0x4062AC21, 0x4063CC20, 0x40646A20, 0x00000003, - 0x4062AC22, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC23, 0x4063CC20, - 0x40646A20, 0x00000003, 0x4062AC24, 0x4063CC20, 0x40646A20, 0x00000003, - 0x4062AC25, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC26, 0x4063CC20, - 0x40646A20, 0x00000003, 0x4062AC27, 0x4063CC20, 0x40646A20, 0x00000003, - 0x4062AC28, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC29, 0x4063CC20, - 0x40646A20, 0x00000003, 0x4062AC2A, 0x4063CC20, 0x40646A20, 0x00000003, - 0x4062AC2B, 0x4063CC20, 0x40646A20, 0x00000003, - // Block 318, offset 0x4f80 - 0x4062AC2C, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC2D, 0x4063CC20, - 0x40646A20, 0x00000003, 0x4062AC2E, 0x4063CC20, 0x40646A20, 0x00000003, - 0x4062AC2F, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC30, 0x4063CC20, - 0x40646A20, 0x00000003, 0x4062AC31, 0x4063CC20, 0x40646A20, 0x00000003, - 0x4062AC32, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC33, 0x4063CC20, - 0x40646A20, 0x00000003, 0x4062AC34, 0x4063CC20, 0x40646A20, 0x00000003, - 0x4062AC35, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC36, 0x4063CC20, - 0x40646A20, 0x00000003, 0x4062AC37, 0x4063CC20, 0x40646A20, 0x00000003, - 0x4062AC38, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC39, 0x4063CC20, - 0x40646A20, 0x00000003, 0x4062AC21, 0x4063CC20, 0x40648220, 0x00000003, - 0x4062AC22, 0x4063CC20, 0x40648220, 0x00000003, - // Block 319, offset 0x4fc0 - 0x4062AC23, 0x4063CC20, 0x40648220, 0x00000003, 0x4062AC24, 0x4063CC20, - 0x40648220, 0x00000003, 0x4062AC25, 0x4063CC20, 0x40648220, 0x00000003, - 0x4062AC26, 0x4063CC20, 0x40648220, 0x00000003, 0x4062AC27, 0x4063CC20, - 0x40648220, 0x00000003, 0x4062AC28, 0x4063CC20, 0x40648220, 0x00000003, - 0x4062AC29, 0x4063CC20, 0x40648220, 0x00000003, 0x4062AC2A, 0x4063CC20, - 0x40648220, 0x00000003, 0x4062AC2B, 0x4063CC20, 0x40648220, 0x00000003, - 0x4062AC2C, 0x4063CC20, 0x40648220, 0x00000003, 0x4062AC2D, 0x4063CC20, - 0x40648220, 0x00000003, 0x4062AC2E, 0x4063CC20, 0x40648220, 0x00000003, - 0x4062AC2F, 0x4063CC20, 0x40648220, 0x00000003, 0x4062AC30, 0x4063CC20, - 0x40648220, 0x00000003, 0x4062AC31, 0x4063CC20, 0x40648220, 0x00000003, - 0x4062AC32, 0x4063CC20, 0x40648220, 0x00000003, - // Block 320, offset 0x5000 - 0x4062AC21, 0x4063CC20, 0x40648420, 0x00000003, 0x4062AC22, 0x4063CC20, - 0x40648420, 0x00000003, 0x4062AC23, 0x4063CC20, 0x40648420, 0x00000003, - 0x4062AC24, 0x4063CC20, 0x40648420, 0x00000003, 0x4062AC25, 0x4063CC20, - 0x40648420, 0x00000003, 0x4062AC26, 0x4063CC20, 0x40648420, 0x00000003, - 0x4062AC27, 0x4063CC20, 0x40648420, 0x00000003, 0x4062AC28, 0x4063CC20, - 0x40648420, 0x00000003, 0x4062AC29, 0x4063CC20, 0x40648420, 0x00000003, - 0x4062AC2A, 0x4063CC20, 0x40648420, 0x00000003, 0x4062AC2B, 0x4063CC20, - 0x40648420, 0x00000003, 0x4062AC2C, 0x4063CC20, 0x40648420, 0x00000003, - 0x4062AC2D, 0x4063CC20, 0x40648420, 0x00000003, 0x4062AC21, 0x4063CC20, - 0x40648C20, 0x00000003, 0x4062AC22, 0x4063CC20, 0x40648C20, 0x00000003, - 0x4062AC23, 0x4063CC20, 0x40648C20, 0x00000003, - // Block 321, offset 0x5040 - 0x4062AC24, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062AC25, 0x4063CC20, - 0x40648C20, 0x00000003, 0x4062AC26, 0x4063CC20, 0x40648C20, 0x00000002, - 0x4062AC21, 0x4063D020, 0x00000002, 0x4062AC22, 0x4063D020, 0x00000002, - 0x4062AC23, 0x4063D020, 0x00000002, 0x4062AC24, 0x4063D020, 0x00000002, - 0x4062AC25, 0x4063D020, 0x00000002, 0x4062AC26, 0x4063D020, 0x00000002, - 0x4062AC27, 0x4063D020, 0x00000002, 0x4062AC28, 0x4063D020, 0x00000002, - 0x4062AC29, 0x4063D020, 0x00000002, 0x4062AC2A, 0x4063D020, 0x00000002, - 0x4062AC2B, 0x4063D020, 0x00000002, 0x4062AC2C, 0x4063D020, 0x00000002, - 0x4062AC2D, 0x4063D020, 0x00000002, 0x4062AC2E, 0x4063D020, 0x00000002, - 0x4062AC2F, 0x4063D020, 0x00000002, 0x4062AC30, 0x4063D020, 0x00000002, - 0x4062AC31, 0x4063D020, 0x00000002, 0x4062AC32, - // Block 322, offset 0x5080 - 0x4063D020, 0x00000002, 0x4062AC33, 0x4063D020, 0x00000002, 0x4062AC34, - 0x4063D020, 0x00000002, 0x4062AC35, 0x4063D020, 0x00000002, 0x4062AC36, - 0x4063D020, 0x00000002, 0x4062AC37, 0x4063D020, 0x00000002, 0x4062AC38, - 0x4063D020, 0x00000002, 0x4062AC39, 0x4063D020, 0x00000002, 0x4062AC3A, - 0x4063D020, 0x00000002, 0x4062AC3B, 0x4063D020, 0x00000002, 0x4062AC3C, - 0x4063D020, 0x00000002, 0x4062AC3D, 0x4063D020, 0x00000002, 0x4062AC3E, - 0x4063D020, 0x00000002, 0x4062AC3F, 0x4063D020, 0x00000002, 0x4062AC40, - 0x4063D020, 0x00000002, 0x4062AC41, 0x4063D020, 0x00000002, 0x4062AC42, - 0x4063D020, 0x00000002, 0x4062AC43, 0x4063D020, 0x00000002, 0x4062AC44, - 0x4063D020, 0x00000002, 0x4062AC45, 0x4063D020, 0x00000002, 0x4062AC46, - 0x4063D020, 0x00000002, 0x4062AC47, 0x4063D020, - // Block 323, offset 0x50c0 - 0x00000002, 0x4062AC48, 0x4063D020, 0x00000002, 0x4062AC49, 0x4063D020, - 0x00000002, 0x4062AC4A, 0x4063D020, 0x00000002, 0x4062AC4B, 0x4063D020, - 0x00000002, 0x4062AC4C, 0x4063D020, 0x00000002, 0x4062AC4D, 0x4063D020, - 0x00000002, 0x4062AC4E, 0x4063D020, 0x00000002, 0x4062AC4F, 0x4063D020, - 0x00000002, 0x4062AC50, 0x4063D020, 0x00000002, 0x4062AC51, 0x4063D020, - 0x00000002, 0x4062AC52, 0x4063D020, 0x00000002, 0x4062AC53, 0x4063D020, - 0x00000002, 0x4062AC54, 0x4063D020, 0x00000002, 0x4062AC55, 0x4063D020, - 0x00000002, 0x4062AC56, 0x4063D020, 0x00000002, 0x4062AC57, 0x4063D020, - 0x00000002, 0x4062AC58, 0x4063D020, 0x00000002, 0x4062AC59, 0x4063D020, - 0x00000002, 0x4062AC5A, 0x4063D020, 0x00000002, 0x4062AC5B, 0x4063D020, - 0x00000002, 0x4062AC5C, 0x4063D020, 0x00000002, - // Block 324, offset 0x5100 - 0x4062AC5D, 0x4063D020, 0x00000002, 0x4062AC5E, 0x4063D020, 0x00000002, - 0x4062AC5F, 0x4063D020, 0x00000002, 0x4062AC60, 0x4063D020, 0x00000002, - 0x4062AC61, 0x4063D020, 0x00000002, 0x4062AC62, 0x4063D020, 0x00000002, - 0x4062AC63, 0x4063D020, 0x00000002, 0x4062AC64, 0x4063D020, 0x00000002, - 0x4062AC65, 0x4063D020, 0x00000002, 0x4062AC66, 0x4063D020, 0x00000002, - 0x4062AC67, 0x4063D020, 0x00000002, 0x4062AC68, 0x4063D020, 0x00000002, - 0x4062AC69, 0x4063D020, 0x00000002, 0x4062AC6A, 0x4063D020, 0x00000002, - 0x4062AC6B, 0x4063D020, 0x00000002, 0x4062AC6C, 0x4063D020, 0x00000002, - 0x4062AC6D, 0x4063D020, 0x00000002, 0x4062AC6E, 0x4063D020, 0x00000002, - 0x4062AC6F, 0x4063D020, 0x00000002, 0x4062AC70, 0x4063D020, 0x00000002, - 0x4062AC71, 0x4063D020, 0x00000002, 0x4062AC72, - // Block 325, offset 0x5140 - 0x4063D020, 0x00000002, 0x4062AC73, 0x4063D020, 0x00000002, 0x4062AC74, - 0x4063D020, 0x00000002, 0x4062AC75, 0x4063D020, 0x00000002, 0x4062AC76, - 0x4063D020, 0x00000002, 0x4062AC77, 0x4063D020, 0x00000002, 0x4062AC78, - 0x4063D020, 0x00000002, 0x4062AC79, 0x4063D020, 0x00000002, 0x4062AC7A, - 0x4063D020, 0x00000002, 0x4062AC7B, 0x4063D020, 0x00000002, 0x4062AC7C, - 0x4063D020, 0x00000002, 0x4062AC7D, 0x4063D020, 0x00000002, 0x4062AC7E, - 0x4063D020, 0x00000002, 0x4062AC7F, 0x4063D020, 0x00000002, 0x4062AC80, - 0x4063D020, 0x00000002, 0x4062AC81, 0x4063D020, 0x00000002, 0x4062AC82, - 0x4063D020, 0x00000002, 0x4062AC83, 0x4063D020, 0x00000002, 0x4062AC84, - 0x4063D020, 0x00000003, 0x4062AC21, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062AC21, 0x4063D020, 0x40647220, 0x00000003, - // Block 326, offset 0x5180 - 0x4062AC22, 0x4063D020, 0x40647220, 0x00000003, 0x4062AC23, 0x4063D020, - 0x40647220, 0x00000003, 0x4062AC24, 0x4063D020, 0x40647220, 0x00000003, - 0x4062AC25, 0x4063D020, 0x40647220, 0x00000003, 0x4062AC26, 0x4063D020, - 0x40647220, 0x00000003, 0x4062AC21, 0x4063D020, 0x40648220, 0x00000003, - 0x4062AE21, 0x4063D020, 0x40646420, 0x00000002, 0x4062B021, 0x4063A820, - 0x00000002, 0x4062B022, 0x4063A820, 0x00000002, 0x4062B023, 0x4063A820, - 0x00000002, 0x4062B024, 0x4063A820, 0x00000002, 0x4062B025, 0x4063A820, - 0x00000002, 0x4062B026, 0x4063A820, 0x00000002, 0x4062B027, 0x4063A820, - 0x00000002, 0x4062B028, 0x4063A820, 0x00000002, 0x4062B029, 0x4063A820, - 0x00000002, 0x4062B02A, 0x4063A820, 0x00000002, 0x4062B02B, 0x4063A820, - 0x00000003, 0x4062B021, 0x4063A820, 0x40646420, - // Block 327, offset 0x51c0 - 0x00000003, 0x4062B021, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B022, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B023, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062B024, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B025, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B026, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062B027, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B021, - 0x4063A820, 0x40647220, 0x00000003, 0x4062B022, 0x4063A820, 0x40647220, - 0x00000003, 0x4062B021, 0x4063A820, 0x40648220, 0x00000003, 0x4062B022, - 0x4063A820, 0x40648220, 0x00000003, 0x4062B023, 0x4063A820, 0x40648220, - 0x00000003, 0x4062B024, 0x4063A820, 0x40648220, 0x00000003, 0x4062B025, - 0x4063A820, 0x40648220, 0x00000003, 0x4062B026, 0x4063A820, 0x40648220, - 0x00000003, 0x4062B027, 0x4063A820, 0x40648220, - // Block 328, offset 0x5200 - 0x00000003, 0x4062B021, 0x4063A820, 0x40648420, 0x00000003, 0x4062B022, - 0x4063A820, 0x40648420, 0x00000003, 0x4062B021, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062B022, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B023, - 0x4063A820, 0x40648C20, 0x00000002, 0x4062B021, 0x4063AA20, 0x00000002, - 0x4062B022, 0x4063AA20, 0x00000002, 0x4062B023, 0x4063AA20, 0x00000002, - 0x4062B024, 0x4063AA20, 0x00000002, 0x4062B025, 0x4063AA20, 0x00000002, - 0x4062B026, 0x4063AA20, 0x00000002, 0x4062B027, 0x4063AA20, 0x00000002, - 0x4062B028, 0x4063AA20, 0x00000002, 0x4062B029, 0x4063AA20, 0x00000002, - 0x4062B02A, 0x4063AA20, 0x00000002, 0x4062B021, 0x4063B420, 0x00000003, - 0x4062B021, 0x4063B420, 0x40646420, 0x00000003, 0x4062B021, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062B022, 0x4063B420, - // Block 329, offset 0x5240 - 0x40646A20, 0x00000003, 0x4062B023, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062B024, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B021, 0x4063B420, - 0x40648220, 0x00000003, 0x4062B022, 0x4063B420, 0x40648220, 0x00000003, - 0x4062B023, 0x4063B420, 0x40648220, 0x00000003, 0x4062B024, 0x4063B420, - 0x40648220, 0x00000003, 0x4062B021, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062B022, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B023, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062B024, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062B025, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B026, 0x4063B420, - 0x40648C20, 0x00000002, 0x4062B021, 0x4063B820, 0x00000002, 0x4062B022, - 0x4063B820, 0x00000002, 0x4062B023, 0x4063B820, 0x00000002, 0x4062B024, - 0x4063B820, 0x00000002, 0x4062B025, 0x4063B820, - // Block 330, offset 0x5280 - 0x00000002, 0x4062B026, 0x4063B820, 0x00000002, 0x4062B027, 0x4063B820, - 0x00000002, 0x4062B028, 0x4063B820, 0x00000002, 0x4062B029, 0x4063B820, - 0x00000002, 0x4062B02A, 0x4063B820, 0x00000002, 0x4062B02B, 0x4063B820, - 0x00000002, 0x4062B02C, 0x4063B820, 0x00000003, 0x4062B021, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B022, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B023, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B024, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B025, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B026, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B027, 0x4063B820, - 0x40648C20, 0x00000002, 0x4062B021, 0x4063BE20, 0x00000002, 0x4062B022, - 0x4063BE20, 0x00000002, 0x4062B023, 0x4063BE20, 0x00000002, 0x4062B021, - 0x4063C020, 0x00000002, 0x4062B022, 0x4063C020, - // Block 331, offset 0x52c0 - 0x00000002, 0x4062B023, 0x4063C020, 0x00000002, 0x4062B024, 0x4063C020, - 0x00000002, 0x4062B025, 0x4063C020, 0x00000002, 0x4062B026, 0x4063C020, - 0x00000002, 0x4062B027, 0x4063C020, 0x00000002, 0x4062B021, 0x4063C220, - 0x00000002, 0x4062B022, 0x4063C220, 0x00000003, 0x4062B021, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062B021, 0x4063C220, 0x40647220, 0x00000003, - 0x4062B022, 0x4063C220, 0x40647220, 0x00000003, 0x4062B023, 0x4063C220, - 0x40647220, 0x00000002, 0x4062B021, 0x4063CA20, 0x00000002, 0x4062B022, - 0x4063CA20, 0x00000002, 0x4062B023, 0x4063CA20, 0x00000002, 0x4062B024, - 0x4063CA20, 0x00000003, 0x4062B021, 0x4063CA20, 0x40646420, 0x00000003, - 0x4062B021, 0x4063CC20, 0x40648C20, 0x00000002, 0x4062B021, 0x4063D020, - 0x00000002, 0x4062B022, 0x4063D020, 0x00000002, - // Block 332, offset 0x5300 - 0x4062B023, 0x4063D020, 0x00000002, 0x4062B024, 0x4063D020, 0x00000002, - 0x4062B025, 0x4063D020, 0x00000002, 0x4062B026, 0x4063D020, 0x00000002, - 0x4062B027, 0x4063D020, 0x00000002, 0x4062B028, 0x4063D020, 0x00000003, - 0x4062B021, 0x4063D020, 0x40646420, 0x00000003, 0x4062B022, 0x4063D020, - 0x40646420, 0x00000003, 0x4062B023, 0x4063D020, 0x40646420, 0x00000003, - 0x4062B024, 0x4063D020, 0x40646420, 0x00000002, 0x4062B221, 0x4063A820, - 0x00000002, 0x4062B222, 0x4063A820, 0x00000002, 0x4062B223, 0x4063A820, - 0x00000003, 0x4062B221, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B222, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B223, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062B224, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B225, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B226, - // Block 333, offset 0x5340 - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B227, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062B228, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B229, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B22A, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062B22B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B22C, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B22D, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062B22E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B22F, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B230, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062B231, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B232, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B233, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062B234, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B235, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B236, - // Block 334, offset 0x5380 - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B237, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062B238, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B239, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B23A, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062B23B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B23C, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062B23D, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062B221, 0x4063A820, 0x40647220, 0x00000003, 0x4062B222, - 0x4063A820, 0x40647220, 0x00000003, 0x4062B223, 0x4063A820, 0x40647220, - 0x00000003, 0x4062B224, 0x4063A820, 0x40647220, 0x00000003, 0x4062B225, - 0x4063A820, 0x40647220, 0x00000003, 0x4062B226, 0x4063A820, 0x40647220, - 0x00000003, 0x4062B227, 0x4063A820, 0x40647220, 0x00000003, 0x4062B228, - 0x4063A820, 0x40647220, 0x00000003, 0x4062B229, - // Block 335, offset 0x53c0 - 0x4063A820, 0x40647220, 0x00000003, 0x4062B22A, 0x4063A820, 0x40647220, - 0x00000003, 0x4062B221, 0x4063A820, 0x40648220, 0x00000003, 0x4062B222, - 0x4063A820, 0x40648220, 0x00000003, 0x4062B223, 0x4063A820, 0x40648220, - 0x00000003, 0x4062B224, 0x4063A820, 0x40648220, 0x00000003, 0x4062B225, - 0x4063A820, 0x40648220, 0x00000003, 0x4062B226, 0x4063A820, 0x40648220, - 0x00000003, 0x4062B227, 0x4063A820, 0x40648220, 0x00000003, 0x4062B228, - 0x4063A820, 0x40648220, 0x00000003, 0x4062B229, 0x4063A820, 0x40648220, - 0x00000003, 0x4062B22A, 0x4063A820, 0x40648220, 0x00000003, 0x4062B22B, - 0x4063A820, 0x40648220, 0x00000003, 0x4062B22C, 0x4063A820, 0x40648220, - 0x00000003, 0x4062B22D, 0x4063A820, 0x40648220, 0x00000003, 0x4062B22E, - 0x4063A820, 0x40648220, 0x00000003, 0x4062B22F, - // Block 336, offset 0x5400 - 0x4063A820, 0x40648220, 0x00000003, 0x4062B230, 0x4063A820, 0x40648220, - 0x00000003, 0x4062B231, 0x4063A820, 0x40648220, 0x00000003, 0x4062B232, - 0x4063A820, 0x40648220, 0x00000003, 0x4062B233, 0x4063A820, 0x40648220, - 0x00000003, 0x4062B234, 0x4063A820, 0x40648220, 0x00000003, 0x4062B235, - 0x4063A820, 0x40648220, 0x00000003, 0x4062B236, 0x4063A820, 0x40648220, - 0x00000003, 0x4062B237, 0x4063A820, 0x40648220, 0x00000003, 0x4062B238, - 0x4063A820, 0x40648220, 0x00000003, 0x4062B239, 0x4063A820, 0x40648220, - 0x00000003, 0x4062B23A, 0x4063A820, 0x40648220, 0x00000003, 0x4062B23B, - 0x4063A820, 0x40648220, 0x00000003, 0x4062B23C, 0x4063A820, 0x40648220, - 0x00000003, 0x4062B23D, 0x4063A820, 0x40648220, 0x00000003, 0x4062B221, - 0x4063A820, 0x40648420, 0x00000003, 0x4062B222, - // Block 337, offset 0x5440 - 0x4063A820, 0x40648420, 0x00000003, 0x4062B223, 0x4063A820, 0x40648420, - 0x00000003, 0x4062B224, 0x4063A820, 0x40648420, 0x00000003, 0x4062B225, - 0x4063A820, 0x40648420, 0x00000003, 0x4062B221, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062B222, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B223, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062B224, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062B225, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B226, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062B227, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062B228, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B229, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062B22A, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062B22B, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B22C, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062B22D, - // Block 338, offset 0x5480 - 0x4063A820, 0x40648C20, 0x00000003, 0x4062B22E, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062B22F, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B230, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062B231, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062B232, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B233, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062B234, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062B235, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B236, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062B237, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062B238, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B239, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062B23A, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062B23B, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B23C, - 0x4063A820, 0x40648C20, 0x00000002, 0x4062B221, - // Block 339, offset 0x54c0 - 0x4063AA20, 0x00000002, 0x4062B222, 0x4063AA20, 0x00000002, 0x4062B223, - 0x4063AA20, 0x00000002, 0x4062B224, 0x4063AA20, 0x00000002, 0x4062B225, - 0x4063AA20, 0x00000002, 0x4062B226, 0x4063AA20, 0x00000002, 0x4062B227, - 0x4063AA20, 0x00000002, 0x4062B228, 0x4063AA20, 0x00000002, 0x4062B229, - 0x4063AA20, 0x00000002, 0x4062B22A, 0x4063AA20, 0x00000002, 0x4062B22B, - 0x4063AA20, 0x00000002, 0x4062B22C, 0x4063AA20, 0x00000002, 0x4062B22D, - 0x4063AA20, 0x00000002, 0x4062B22E, 0x4063AA20, 0x00000002, 0x4062B22F, - 0x4063AA20, 0x00000002, 0x4062B230, 0x4063AA20, 0x00000002, 0x4062B231, - 0x4063AA20, 0x00000002, 0x4062B232, 0x4063AA20, 0x00000002, 0x4062B233, - 0x4063AA20, 0x00000002, 0x4062B234, 0x4063AA20, 0x00000002, 0x4062B235, - 0x4063AA20, 0x00000002, 0x4062B236, 0x4063AA20, - // Block 340, offset 0x5500 - 0x00000003, 0x4062B221, 0x4063AA20, 0x40646420, 0x00000003, 0x4062B221, - 0x4063B020, 0x40646420, 0x00000003, 0x4062B222, 0x4063B020, 0x40646420, - 0x00000002, 0x4062B221, 0x4063B820, 0x00000002, 0x4062B222, 0x4063B820, - 0x00000002, 0x4062B223, 0x4063B820, 0x00000002, 0x4062B224, 0x4063B820, - 0x00000002, 0x4062B225, 0x4063B820, 0x00000002, 0x4062B226, 0x4063B820, - 0x00000002, 0x4062B227, 0x4063B820, 0x00000002, 0x4062B228, 0x4063B820, - 0x00000002, 0x4062B229, 0x4063B820, 0x00000002, 0x4062B22A, 0x4063B820, - 0x00000002, 0x4062B22B, 0x4063B820, 0x00000002, 0x4062B22C, 0x4063B820, - 0x00000002, 0x4062B22D, 0x4063B820, 0x00000002, 0x4062B22E, 0x4063B820, - 0x00000002, 0x4062B22F, 0x4063B820, 0x00000002, 0x4062B230, 0x4063B820, - 0x00000002, 0x4062B231, 0x4063B820, 0x00000002, - // Block 341, offset 0x5540 - 0x4062B232, 0x4063B820, 0x00000002, 0x4062B233, 0x4063B820, 0x00000002, - 0x4062B234, 0x4063B820, 0x00000002, 0x4062B235, 0x4063B820, 0x00000002, - 0x4062B236, 0x4063B820, 0x00000002, 0x4062B237, 0x4063B820, 0x00000002, - 0x4062B238, 0x4063B820, 0x00000002, 0x4062B239, 0x4063B820, 0x00000002, - 0x4062B23A, 0x4063B820, 0x00000002, 0x4062B23B, 0x4063B820, 0x00000002, - 0x4062B23C, 0x4063B820, 0x00000002, 0x4062B23D, 0x4063B820, 0x00000002, - 0x4062B23E, 0x4063B820, 0x00000002, 0x4062B23F, 0x4063B820, 0x00000002, - 0x4062B240, 0x4063B820, 0x00000002, 0x4062B241, 0x4063B820, 0x00000002, - 0x4062B242, 0x4063B820, 0x00000002, 0x4062B243, 0x4063B820, 0x00000002, - 0x4062B244, 0x4063B820, 0x00000002, 0x4062B245, 0x4063B820, 0x00000002, - 0x4062B246, 0x4063B820, 0x00000002, 0x4062B247, - // Block 342, offset 0x5580 - 0x4063B820, 0x00000002, 0x4062B248, 0x4063B820, 0x00000002, 0x4062B249, - 0x4063B820, 0x00000002, 0x4062B24A, 0x4063B820, 0x00000002, 0x4062B24B, - 0x4063B820, 0x00000002, 0x4062B24C, 0x4063B820, 0x00000002, 0x4062B24D, - 0x4063B820, 0x00000002, 0x4062B24E, 0x4063B820, 0x00000002, 0x4062B24F, - 0x4063B820, 0x00000002, 0x4062B250, 0x4063B820, 0x00000002, 0x4062B251, - 0x4063B820, 0x00000002, 0x4062B252, 0x4063B820, 0x00000002, 0x4062B253, - 0x4063B820, 0x00000002, 0x4062B254, 0x4063B820, 0x00000002, 0x4062B255, - 0x4063B820, 0x00000002, 0x4062B256, 0x4063B820, 0x00000002, 0x4062B257, - 0x4063B820, 0x00000002, 0x4062B258, 0x4063B820, 0x00000002, 0x4062B259, - 0x4063B820, 0x00000002, 0x4062B25A, 0x4063B820, 0x00000002, 0x4062B25B, - 0x4063B820, 0x00000003, 0x4062B221, 0x4063B820, - // Block 343, offset 0x55c0 - 0x40646420, 0x00000003, 0x4062B222, 0x4063B820, 0x40646420, 0x00000003, - 0x4062B223, 0x4063B820, 0x40646420, 0x00000003, 0x4062B224, 0x4063B820, - 0x40646420, 0x00000003, 0x4062B225, 0x4063B820, 0x40646420, 0x00000003, - 0x4062B226, 0x4063B820, 0x40646420, 0x00000003, 0x4062B227, 0x4063B820, - 0x40646420, 0x00000003, 0x4062B228, 0x4063B820, 0x40646420, 0x00000003, - 0x4062B229, 0x4063B820, 0x40646420, 0x00000003, 0x4062B22A, 0x4063B820, - 0x40646420, 0x00000003, 0x4062B22B, 0x4063B820, 0x40646420, 0x00000003, - 0x4062B22C, 0x4063B820, 0x40646420, 0x00000003, 0x4062B221, 0x4063B820, - 0x40646A20, 0x00000003, 0x4062B222, 0x4063B820, 0x40646A20, 0x00000003, - 0x4062B223, 0x4063B820, 0x40646A20, 0x00000003, 0x4062B224, 0x4063B820, - 0x40646A20, 0x00000003, 0x4062B225, 0x4063B820, - // Block 344, offset 0x5600 - 0x40646A20, 0x00000003, 0x4062B226, 0x4063B820, 0x40646A20, 0x00000003, - 0x4062B227, 0x4063B820, 0x40646A20, 0x00000003, 0x4062B228, 0x4063B820, - 0x40646A20, 0x00000003, 0x4062B229, 0x4063B820, 0x40646A20, 0x00000003, - 0x4062B22A, 0x4063B820, 0x40646A20, 0x00000003, 0x4062B22B, 0x4063B820, - 0x40646A20, 0x00000003, 0x4062B22C, 0x4063B820, 0x40646A20, 0x00000003, - 0x4062B22D, 0x4063B820, 0x40646A20, 0x00000003, 0x4062B221, 0x4063B820, - 0x40647220, 0x00000003, 0x4062B222, 0x4063B820, 0x40647220, 0x00000003, - 0x4062B223, 0x4063B820, 0x40647220, 0x00000003, 0x4062B224, 0x4063B820, - 0x40647220, 0x00000003, 0x4062B221, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B222, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B223, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B224, 0x4063B820, - // Block 345, offset 0x5640 - 0x40648C20, 0x00000003, 0x4062B225, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B226, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B227, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B228, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B229, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B22A, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B22B, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B22C, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B22D, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B22E, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B22F, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B230, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B231, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B232, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B233, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B234, 0x4063B820, - // Block 346, offset 0x5680 - 0x40648C20, 0x00000003, 0x4062B235, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B236, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B237, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B238, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B239, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B23A, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B23B, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B23C, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B23D, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B23E, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062B23F, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B240, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062B241, 0x4063B820, 0x40648C20, 0x00000002, - 0x4062B221, 0x4063C220, 0x00000002, 0x4062B222, 0x4063C220, 0x00000002, - 0x4062B223, 0x4063C220, 0x00000002, 0x4062B224, - // Block 347, offset 0x56c0 - 0x4063C220, 0x00000002, 0x4062B225, 0x4063C220, 0x00000002, 0x4062B226, - 0x4063C220, 0x00000002, 0x4062B227, 0x4063C220, 0x00000002, 0x4062B228, - 0x4063C220, 0x00000002, 0x4062B229, 0x4063C220, 0x00000002, 0x4062B22A, - 0x4063C220, 0x00000002, 0x4062B22B, 0x4063C220, 0x00000002, 0x4062B22C, - 0x4063C220, 0x00000002, 0x4062B22D, 0x4063C220, 0x00000002, 0x4062B22E, - 0x4063C220, 0x00000002, 0x4062B22F, 0x4063C220, 0x00000002, 0x4062B230, - 0x4063C220, 0x00000002, 0x4062B231, 0x4063C220, 0x00000003, 0x4062B221, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062B222, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062B223, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B224, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062B225, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062B226, 0x4063C220, 0x40646A20, - // Block 348, offset 0x5700 - 0x00000003, 0x4062B227, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B228, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062B221, 0x4063C220, 0x40647220, - 0x00000003, 0x4062B221, 0x4063CC20, 0x40646420, 0x00000003, 0x4062B221, - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B222, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062B223, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B224, - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B225, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062B226, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B227, - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B228, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062B229, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B22A, - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B22B, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062B22C, 0x4063CC20, 0x40648C20, - // Block 349, offset 0x5740 - 0x00000003, 0x4062B22D, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B22E, - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B22F, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062B230, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B231, - 0x4063CC20, 0x40648C20, 0x00000002, 0x4062B621, 0x4063A820, 0x00000002, - 0x4062B622, 0x4063A820, 0x00000002, 0x4062B623, 0x4063A820, 0x00000002, - 0x4062B624, 0x4063A820, 0x00000002, 0x4062B625, 0x4063A820, 0x00000002, - 0x4062B626, 0x4063A820, 0x00000002, 0x4062B627, 0x4063A820, 0x00000002, - 0x4062B628, 0x4063A820, 0x00000002, 0x4062B629, 0x4063A820, 0x00000002, - 0x4062B62A, 0x4063A820, 0x00000002, 0x4062B62B, 0x4063A820, 0x00000002, - 0x4062B62C, 0x4063A820, 0x00000002, 0x4062B62D, 0x4063A820, 0x00000002, - 0x4062B62E, 0x4063A820, 0x00000002, 0x4062B62F, - // Block 350, offset 0x5780 - 0x4063A820, 0x00000002, 0x4062B630, 0x4063A820, 0x00000002, 0x4062B631, - 0x4063A820, 0x00000003, 0x4062B621, 0x4063A820, 0x40646420, 0x00000003, - 0x4062B622, 0x4063A820, 0x40646420, 0x00000003, 0x4062B623, 0x4063A820, - 0x40646420, 0x00000003, 0x4062B624, 0x4063A820, 0x40646420, 0x00000003, - 0x4062B625, 0x4063A820, 0x40646420, 0x00000003, 0x4062B626, 0x4063A820, - 0x40646420, 0x00000003, 0x4062B627, 0x4063A820, 0x40646420, 0x00000003, - 0x4062B628, 0x4063A820, 0x40646420, 0x00000003, 0x4062B629, 0x4063A820, - 0x40646420, 0x00000003, 0x4062B621, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B622, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B623, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B624, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B625, 0x4063A820, 0x40646A20, 0x00000003, - // Block 351, offset 0x57c0 - 0x4062B626, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B627, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B628, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B629, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B62A, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B62B, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B62C, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B62D, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B62E, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B62F, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B621, 0x4063A820, - 0x40647220, 0x00000003, 0x4062B622, 0x4063A820, 0x40647220, 0x00000003, - 0x4062B623, 0x4063A820, 0x40647220, 0x00000003, 0x4062B624, 0x4063A820, - 0x40647220, 0x00000003, 0x4062B621, 0x4063A820, 0x40648220, 0x00000003, - 0x4062B622, 0x4063A820, 0x40648220, 0x00000003, - // Block 352, offset 0x5800 - 0x4062B623, 0x4063A820, 0x40648220, 0x00000003, 0x4062B624, 0x4063A820, - 0x40648220, 0x00000003, 0x4062B625, 0x4063A820, 0x40648220, 0x00000003, - 0x4062B626, 0x4063A820, 0x40648220, 0x00000003, 0x4062B627, 0x4063A820, - 0x40648220, 0x00000003, 0x4062B628, 0x4063A820, 0x40648220, 0x00000003, - 0x4062B629, 0x4063A820, 0x40648220, 0x00000003, 0x4062B62A, 0x4063A820, - 0x40648220, 0x00000003, 0x4062B62B, 0x4063A820, 0x40648220, 0x00000003, - 0x4062B62C, 0x4063A820, 0x40648220, 0x00000003, 0x4062B621, 0x4063A820, - 0x40648420, 0x00000003, 0x4062B622, 0x4063A820, 0x40648420, 0x00000003, - 0x4062B623, 0x4063A820, 0x40648420, 0x00000003, 0x4062B624, 0x4063A820, - 0x40648420, 0x00000003, 0x4062B621, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062B622, 0x4063A820, 0x40648C20, 0x00000003, - // Block 353, offset 0x5840 - 0x4062B623, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B624, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062B625, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062B626, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B627, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062B628, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062B629, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B62A, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062B62B, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062B62C, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B62D, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062B62E, 0x4063A820, 0x40648C20, 0x00000002, - 0x4062B621, 0x4063AA20, 0x00000002, 0x4062B622, 0x4063AA20, 0x00000002, - 0x4062B623, 0x4063AA20, 0x00000002, 0x4062B624, 0x4063AA20, 0x00000002, - 0x4062B625, 0x4063AA20, 0x00000002, 0x4062B626, - // Block 354, offset 0x5880 - 0x4063AA20, 0x00000003, 0x4062B621, 0x4063AA20, 0x40648C20, 0x00000003, - 0x4062B621, 0x4063AC20, 0x40646420, 0x00000003, 0x4062B622, 0x4063AC20, - 0x40646420, 0x00000003, 0x4062B623, 0x4063AC20, 0x40646420, 0x00000003, - 0x4062B621, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B622, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062B623, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062B624, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B625, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062B626, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062B627, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B628, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062B629, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062B62A, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B62B, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062B62C, 0x4063AC20, - // Block 355, offset 0x58c0 - 0x40648C20, 0x00000003, 0x4062B62D, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062B62E, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B62F, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062B630, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062B631, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B632, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062B633, 0x4063AC20, 0x40648C20, 0x00000002, - 0x4062B621, 0x4063B420, 0x00000002, 0x4062B622, 0x4063B420, 0x00000002, - 0x4062B623, 0x4063B420, 0x00000002, 0x4062B624, 0x4063B420, 0x00000002, - 0x4062B625, 0x4063B420, 0x00000002, 0x4062B626, 0x4063B420, 0x00000002, - 0x4062B627, 0x4063B420, 0x00000002, 0x4062B628, 0x4063B420, 0x00000002, - 0x4062B629, 0x4063B420, 0x00000002, 0x4062B62A, 0x4063B420, 0x00000002, - 0x4062B62B, 0x4063B420, 0x00000002, 0x4062B62C, - // Block 356, offset 0x5900 - 0x4063B420, 0x00000002, 0x4062B62D, 0x4063B420, 0x00000002, 0x4062B62E, - 0x4063B420, 0x00000002, 0x4062B62F, 0x4063B420, 0x00000002, 0x4062B630, - 0x4063B420, 0x00000002, 0x4062B631, 0x4063B420, 0x00000002, 0x4062B632, - 0x4063B420, 0x00000002, 0x4062B633, 0x4063B420, 0x00000002, 0x4062B634, - 0x4063B420, 0x00000002, 0x4062B635, 0x4063B420, 0x00000002, 0x4062B636, - 0x4063B420, 0x00000002, 0x4062B637, 0x4063B420, 0x00000002, 0x4062B638, - 0x4063B420, 0x00000002, 0x4062B639, 0x4063B420, 0x00000002, 0x4062B63A, - 0x4063B420, 0x00000002, 0x4062B63B, 0x4063B420, 0x00000002, 0x4062B63C, - 0x4063B420, 0x00000002, 0x4062B63D, 0x4063B420, 0x00000003, 0x4062B621, - 0x4063B420, 0x40646420, 0x00000003, 0x4062B622, 0x4063B420, 0x40646420, - 0x00000003, 0x4062B623, 0x4063B420, 0x40646420, - // Block 357, offset 0x5940 - 0x00000003, 0x4062B624, 0x4063B420, 0x40646420, 0x00000003, 0x4062B625, - 0x4063B420, 0x40646420, 0x00000003, 0x4062B626, 0x4063B420, 0x40646420, - 0x00000003, 0x4062B627, 0x4063B420, 0x40646420, 0x00000003, 0x4062B628, - 0x4063B420, 0x40646420, 0x00000003, 0x4062B629, 0x4063B420, 0x40646420, - 0x00000003, 0x4062B62A, 0x4063B420, 0x40646420, 0x00000003, 0x4062B62B, - 0x4063B420, 0x40646420, 0x00000003, 0x4062B62C, 0x4063B420, 0x40646420, - 0x00000003, 0x4062B62D, 0x4063B420, 0x40646420, 0x00000003, 0x4062B621, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062B622, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062B623, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B624, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062B625, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062B626, 0x4063B420, 0x40646A20, - // Block 358, offset 0x5980 - 0x00000003, 0x4062B627, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B628, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062B629, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062B62A, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B62B, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062B62C, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062B62D, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B62E, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062B62F, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062B630, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B631, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062B632, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062B633, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B621, - 0x4063B420, 0x40647220, 0x00000003, 0x4062B622, 0x4063B420, 0x40647220, - 0x00000003, 0x4062B623, 0x4063B420, 0x40647220, - // Block 359, offset 0x59c0 - 0x00000003, 0x4062B624, 0x4063B420, 0x40647220, 0x00000003, 0x4062B625, - 0x4063B420, 0x40647220, 0x00000003, 0x4062B626, 0x4063B420, 0x40647220, - 0x00000003, 0x4062B627, 0x4063B420, 0x40647220, 0x00000003, 0x4062B628, - 0x4063B420, 0x40647220, 0x00000003, 0x4062B629, 0x4063B420, 0x40647220, - 0x00000003, 0x4062B621, 0x4063B420, 0x40648220, 0x00000003, 0x4062B622, - 0x4063B420, 0x40648220, 0x00000003, 0x4062B623, 0x4063B420, 0x40648220, - 0x00000003, 0x4062B624, 0x4063B420, 0x40648220, 0x00000003, 0x4062B625, - 0x4063B420, 0x40648220, 0x00000003, 0x4062B626, 0x4063B420, 0x40648220, - 0x00000003, 0x4062B627, 0x4063B420, 0x40648220, 0x00000003, 0x4062B628, - 0x4063B420, 0x40648220, 0x00000003, 0x4062B621, 0x4063B420, 0x40648420, - 0x00000003, 0x4062B622, 0x4063B420, 0x40648420, - // Block 360, offset 0x5a00 - 0x00000003, 0x4062B623, 0x4063B420, 0x40648420, 0x00000003, 0x4062B621, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B622, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B623, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B624, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B625, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B626, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B627, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B628, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B629, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B62A, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B62B, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B62C, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B62D, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B62E, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B62F, 0x4063B420, 0x40648C20, - // Block 361, offset 0x5a40 - 0x00000003, 0x4062B630, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B631, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B632, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B633, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B634, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B635, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B636, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B637, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B638, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B639, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B63A, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B63B, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B63C, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B63D, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B63E, 0x4063B420, 0x40648C20, - 0x00000002, 0x4062B621, 0x4063B620, 0x00000002, - // Block 362, offset 0x5a80 - 0x4062B622, 0x4063B620, 0x00000002, 0x4062B623, 0x4063B620, 0x00000002, - 0x4062B624, 0x4063B620, 0x00000002, 0x4062B625, 0x4063B620, 0x00000002, - 0x4062B626, 0x4063B620, 0x00000002, 0x4062B627, 0x4063B620, 0x00000002, - 0x4062B621, 0x4063B820, 0x00000002, 0x4062B622, 0x4063B820, 0x00000002, - 0x4062B623, 0x4063B820, 0x00000002, 0x4062B624, 0x4063B820, 0x00000002, - 0x4062B625, 0x4063B820, 0x00000002, 0x4062B626, 0x4063B820, 0x00000002, - 0x4062B627, 0x4063B820, 0x00000002, 0x4062B628, 0x4063B820, 0x00000002, - 0x4062B629, 0x4063B820, 0x00000002, 0x4062B62A, 0x4063B820, 0x00000002, - 0x4062B62B, 0x4063B820, 0x00000002, 0x4062B62C, 0x4063B820, 0x00000002, - 0x4062B62D, 0x4063B820, 0x00000002, 0x4062B62E, 0x4063B820, 0x00000002, - 0x4062B62F, 0x4063B820, 0x00000002, 0x4062B630, - // Block 363, offset 0x5ac0 - 0x4063B820, 0x00000002, 0x4062B631, 0x4063B820, 0x00000002, 0x4062B632, - 0x4063B820, 0x00000002, 0x4062B633, 0x4063B820, 0x00000002, 0x4062B634, - 0x4063B820, 0x00000002, 0x4062B635, 0x4063B820, 0x00000002, 0x4062B636, - 0x4063B820, 0x00000002, 0x4062B637, 0x4063B820, 0x00000002, 0x4062B638, - 0x4063B820, 0x00000002, 0x4062B639, 0x4063B820, 0x00000002, 0x4062B63A, - 0x4063B820, 0x00000002, 0x4062B63B, 0x4063B820, 0x00000002, 0x4062B63C, - 0x4063B820, 0x00000002, 0x4062B63D, 0x4063B820, 0x00000002, 0x4062B63E, - 0x4063B820, 0x00000002, 0x4062B63F, 0x4063B820, 0x00000003, 0x4062B621, - 0x4063B820, 0x40646420, 0x00000003, 0x4062B622, 0x4063B820, 0x40646420, - 0x00000003, 0x4062B623, 0x4063B820, 0x40646420, 0x00000003, 0x4062B624, - 0x4063B820, 0x40646420, 0x00000003, 0x4062B625, - // Block 364, offset 0x5b00 - 0x4063B820, 0x40646420, 0x00000003, 0x4062B626, 0x4063B820, 0x40646420, - 0x00000003, 0x4062B627, 0x4063B820, 0x40646420, 0x00000003, 0x4062B628, - 0x4063B820, 0x40646420, 0x00000003, 0x4062B629, 0x4063B820, 0x40646420, - 0x00000003, 0x4062B62A, 0x4063B820, 0x40646420, 0x00000003, 0x4062B62B, - 0x4063B820, 0x40646420, 0x00000003, 0x4062B62C, 0x4063B820, 0x40646420, - 0x00000003, 0x4062B62D, 0x4063B820, 0x40646420, 0x00000003, 0x4062B62E, - 0x4063B820, 0x40646420, 0x00000003, 0x4062B621, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062B621, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B622, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062B623, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062B624, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B625, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062B626, - // Block 365, offset 0x5b40 - 0x4063B820, 0x40648C20, 0x00000003, 0x4062B627, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062B628, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B629, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062B62A, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062B62B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B62C, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062B62D, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062B62E, 0x4063B820, 0x40648C20, 0x00000002, 0x4062B621, - 0x4063BE20, 0x00000002, 0x4062B622, 0x4063BE20, 0x00000002, 0x4062B623, - 0x4063BE20, 0x00000002, 0x4062B624, 0x4063BE20, 0x00000002, 0x4062B625, - 0x4063BE20, 0x00000002, 0x4062B626, 0x4063BE20, 0x00000002, 0x4062B627, - 0x4063BE20, 0x00000002, 0x4062B628, 0x4063BE20, 0x00000002, 0x4062B629, - 0x4063BE20, 0x00000002, 0x4062B62A, 0x4063BE20, - // Block 366, offset 0x5b80 - 0x00000002, 0x4062B62B, 0x4063BE20, 0x00000002, 0x4062B62C, 0x4063BE20, - 0x00000002, 0x4062B62D, 0x4063BE20, 0x00000002, 0x4062B62E, 0x4063BE20, - 0x00000002, 0x4062B62F, 0x4063BE20, 0x00000002, 0x4062B630, 0x4063BE20, - 0x00000002, 0x4062B631, 0x4063BE20, 0x00000002, 0x4062B632, 0x4063BE20, - 0x00000002, 0x4062B633, 0x4063BE20, 0x00000002, 0x4062B621, 0x4063C020, - 0x00000002, 0x4062B622, 0x4063C020, 0x00000002, 0x4062B623, 0x4063C020, - 0x00000002, 0x4062B624, 0x4063C020, 0x00000002, 0x4062B625, 0x4063C020, - 0x00000002, 0x4062B626, 0x4063C020, 0x00000002, 0x4062B627, 0x4063C020, - 0x00000002, 0x4062B628, 0x4063C020, 0x00000002, 0x4062B629, 0x4063C020, - 0x00000002, 0x4062B62A, 0x4063C020, 0x00000002, 0x4062B62B, 0x4063C020, - 0x00000002, 0x4062B62C, 0x4063C020, 0x00000002, - // Block 367, offset 0x5bc0 - 0x4062B62D, 0x4063C020, 0x00000002, 0x4062B62E, 0x4063C020, 0x00000002, - 0x4062B62F, 0x4063C020, 0x00000002, 0x4062B630, 0x4063C020, 0x00000002, - 0x4062B631, 0x4063C020, 0x00000002, 0x4062B632, 0x4063C020, 0x00000002, - 0x4062B633, 0x4063C020, 0x00000002, 0x4062B634, 0x4063C020, 0x00000002, - 0x4062B635, 0x4063C020, 0x00000002, 0x4062B636, 0x4063C020, 0x00000002, - 0x4062B637, 0x4063C020, 0x00000002, 0x4062B638, 0x4063C020, 0x00000003, - 0x4062B621, 0x4063C020, 0x40648C20, 0x00000003, 0x4062B622, 0x4063C020, - 0x40648C20, 0x00000002, 0x4062B621, 0x4063C220, 0x00000002, 0x4062B622, - 0x4063C220, 0x00000002, 0x4062B623, 0x4063C220, 0x00000002, 0x4062B624, - 0x4063C220, 0x00000002, 0x4062B625, 0x4063C220, 0x00000002, 0x4062B626, - 0x4063C220, 0x00000002, 0x4062B627, 0x4063C220, - // Block 368, offset 0x5c00 - 0x00000002, 0x4062B628, 0x4063C220, 0x00000002, 0x4062B629, 0x4063C220, - 0x00000002, 0x4062B62A, 0x4063C220, 0x00000002, 0x4062B62B, 0x4063C220, - 0x00000002, 0x4062B62C, 0x4063C220, 0x00000002, 0x4062B62D, 0x4063C220, - 0x00000002, 0x4062B62E, 0x4063C220, 0x00000002, 0x4062B62F, 0x4063C220, - 0x00000002, 0x4062B630, 0x4063C220, 0x00000002, 0x4062B631, 0x4063C220, - 0x00000002, 0x4062B632, 0x4063C220, 0x00000002, 0x4062B633, 0x4063C220, - 0x00000002, 0x4062B634, 0x4063C220, 0x00000002, 0x4062B621, 0x4063CA20, - 0x00000002, 0x4062B622, 0x4063CA20, 0x00000002, 0x4062B623, 0x4063CA20, - 0x00000002, 0x4062B624, 0x4063CA20, 0x00000002, 0x4062B625, 0x4063CA20, - 0x00000002, 0x4062B626, 0x4063CA20, 0x00000002, 0x4062B627, 0x4063CA20, - 0x00000002, 0x4062B628, 0x4063CA20, 0x00000002, - // Block 369, offset 0x5c40 - 0x4062B629, 0x4063CA20, 0x00000002, 0x4062B62A, 0x4063CA20, 0x00000002, - 0x4062B62B, 0x4063CA20, 0x00000002, 0x4062B62C, 0x4063CA20, 0x00000002, - 0x4062B62D, 0x4063CA20, 0x00000002, 0x4062B62E, 0x4063CA20, 0x00000002, - 0x4062B62F, 0x4063CA20, 0x00000002, 0x4062B630, 0x4063CA20, 0x00000002, - 0x4062B631, 0x4063CA20, 0x00000002, 0x4062B632, 0x4063CA20, 0x00000002, - 0x4062B633, 0x4063CA20, 0x00000003, 0x4062B621, 0x4063CA20, 0x40646420, - 0x00000003, 0x4062B622, 0x4063CA20, 0x40646420, 0x00000003, 0x4062B623, - 0x4063CA20, 0x40646420, 0x00000003, 0x4062B624, 0x4063CA20, 0x40646420, - 0x00000003, 0x4062B621, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062B622, - 0x4063CA20, 0x40646A20, 0x00000003, 0x4062B623, 0x4063CA20, 0x40646A20, - 0x00000003, 0x4062B624, 0x4063CA20, 0x40646A20, - // Block 370, offset 0x5c80 - 0x00000003, 0x4062B625, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062B626, - 0x4063CA20, 0x40646A20, 0x00000003, 0x4062B627, 0x4063CA20, 0x40646A20, - 0x00000003, 0x4062B621, 0x4063CA20, 0x40647220, 0x00000003, 0x4062B622, - 0x4063CA20, 0x40647220, 0x00000003, 0x4062B623, 0x4063CA20, 0x40647220, - 0x00000003, 0x4062B624, 0x4063CA20, 0x40647220, 0x00000003, 0x4062B625, - 0x4063CA20, 0x40647220, 0x00000003, 0x4062B621, 0x4063CA20, 0x40648C20, - 0x00000003, 0x4062B622, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062B623, - 0x4063CA20, 0x40648C20, 0x00000003, 0x4062B621, 0x4063CC20, 0x40646420, - 0x00000003, 0x4062B622, 0x4063CC20, 0x40646420, 0x00000003, 0x4062B623, - 0x4063CC20, 0x40646420, 0x00000003, 0x4062B621, 0x4063CC20, 0x40648220, - 0x00000003, 0x4062B622, 0x4063CC20, 0x40648220, - // Block 371, offset 0x5cc0 - 0x00000003, 0x4062B623, 0x4063CC20, 0x40648220, 0x00000003, 0x4062B624, - 0x4063CC20, 0x40648220, 0x00000003, 0x4062B621, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062B622, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B623, - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B624, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062B625, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B626, - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B627, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062B628, 0x4063CC20, 0x40648C20, 0x00000002, 0x4062B621, - 0x4063D020, 0x00000002, 0x4062B622, 0x4063D020, 0x00000002, 0x4062B623, - 0x4063D020, 0x00000002, 0x4062B624, 0x4063D020, 0x00000002, 0x4062B625, - 0x4063D020, 0x00000002, 0x4062B626, 0x4063D020, 0x00000002, 0x4062B627, - 0x4063D020, 0x00000002, 0x4062B628, 0x4063D020, - // Block 372, offset 0x5d00 - 0x00000002, 0x4062B629, 0x4063D020, 0x00000002, 0x4062B62A, 0x4063D020, - 0x00000002, 0x4062B62B, 0x4063D020, 0x00000002, 0x4062B62C, 0x4063D020, - 0x00000002, 0x4062B62D, 0x4063D020, 0x00000002, 0x4062B62E, 0x4063D020, - 0x00000002, 0x4062B62F, 0x4063D020, 0x00000002, 0x4062B630, 0x4063D020, - 0x00000002, 0x4062B631, 0x4063D020, 0x00000002, 0x4062B632, 0x4063D020, - 0x00000002, 0x4062B633, 0x4063D020, 0x00000002, 0x4062B634, 0x4063D020, - 0x00000002, 0x4062B635, 0x4063D020, 0x00000002, 0x4062B636, 0x4063D020, - 0x00000002, 0x4062B637, 0x4063D020, 0x00000002, 0x4062B638, 0x4063D020, - 0x00000002, 0x4062B639, 0x4063D020, 0x00000002, 0x4062B63A, 0x4063D020, - 0x00000002, 0x4062B63B, 0x4063D020, 0x00000002, 0x4062B63C, 0x4063D020, - 0x00000002, 0x4062B63D, 0x4063D020, 0x00000002, - // Block 373, offset 0x5d40 - 0x4062B63E, 0x4063D020, 0x00000002, 0x4062B63F, 0x4063D020, 0x00000002, - 0x4062B640, 0x4063D020, 0x00000002, 0x4062B641, 0x4063D020, 0x00000002, - 0x4062B642, 0x4063D020, 0x00000002, 0x4062B643, 0x4063D020, 0x00000002, - 0x4062B644, 0x4063D020, 0x00000002, 0x4062B645, 0x4063D020, 0x00000002, - 0x4062B646, 0x4063D020, 0x00000002, 0x4062B647, 0x4063D020, 0x00000003, - 0x4062B621, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B622, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062B623, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062B624, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B625, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062B626, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062B627, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B628, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062B629, 0x4063D020, - // Block 374, offset 0x5d80 - 0x40646A20, 0x00000003, 0x4062B62A, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062B62B, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B62C, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062B62D, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062B62E, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B62F, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062B630, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062B631, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B632, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062B633, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062B634, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B635, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062B621, 0x4063D020, 0x40648220, 0x00000003, - 0x4062B622, 0x4063D020, 0x40648220, 0x00000003, 0x4062B623, 0x4063D020, - 0x40648220, 0x00000003, 0x4062B624, 0x4063D020, - // Block 375, offset 0x5dc0 - 0x40648220, 0x00000003, 0x4062B625, 0x4063D020, 0x40648220, 0x00000003, - 0x4062B626, 0x4063D020, 0x40648220, 0x00000003, 0x4062B621, 0x4063D020, - 0x40648420, 0x00000003, 0x4062B622, 0x4063D020, 0x40648420, 0x00000003, - 0x4062B623, 0x4063D020, 0x40648420, 0x00000003, 0x4062B624, 0x4063D020, - 0x40648420, 0x00000003, 0x4062B625, 0x4063D020, 0x40648420, 0x00000002, - 0x4062B821, 0x4063A820, 0x00000002, 0x4062B822, 0x4063A820, 0x00000002, - 0x4062B823, 0x4063A820, 0x00000002, 0x4062B824, 0x4063A820, 0x00000002, - 0x4062B825, 0x4063A820, 0x00000002, 0x4062B826, 0x4063A820, 0x00000002, - 0x4062B827, 0x4063A820, 0x00000002, 0x4062B828, 0x4063A820, 0x00000002, - 0x4062B829, 0x4063A820, 0x00000002, 0x4062B82A, 0x4063A820, 0x00000002, - 0x4062B82B, 0x4063A820, 0x00000002, 0x4062B82C, - // Block 376, offset 0x5e00 - 0x4063A820, 0x00000002, 0x4062B82D, 0x4063A820, 0x00000002, 0x4062B82E, - 0x4063A820, 0x00000003, 0x4062B821, 0x4063A820, 0x40646420, 0x00000003, - 0x4062B822, 0x4063A820, 0x40646420, 0x00000003, 0x4062B823, 0x4063A820, - 0x40646420, 0x00000003, 0x4062B824, 0x4063A820, 0x40646420, 0x00000003, - 0x4062B825, 0x4063A820, 0x40646420, 0x00000003, 0x4062B826, 0x4063A820, - 0x40646420, 0x00000003, 0x4062B827, 0x4063A820, 0x40646420, 0x00000003, - 0x4062B828, 0x4063A820, 0x40646420, 0x00000003, 0x4062B821, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B822, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B823, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B824, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B825, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B826, 0x4063A820, 0x40646A20, 0x00000003, - // Block 377, offset 0x5e40 - 0x4062B827, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B828, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B829, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B82A, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B82B, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B82C, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B82D, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B82E, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B82F, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B830, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B831, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B832, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B833, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B834, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B835, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B836, 0x4063A820, 0x40646A20, 0x00000003, - // Block 378, offset 0x5e80 - 0x4062B837, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B838, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B839, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B83A, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B83B, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062B83C, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062B821, 0x4063A820, 0x40647220, 0x00000003, 0x4062B822, 0x4063A820, - 0x40647220, 0x00000003, 0x4062B823, 0x4063A820, 0x40647220, 0x00000003, - 0x4062B824, 0x4063A820, 0x40647220, 0x00000003, 0x4062B825, 0x4063A820, - 0x40647220, 0x00000003, 0x4062B826, 0x4063A820, 0x40647220, 0x00000003, - 0x4062B827, 0x4063A820, 0x40647220, 0x00000003, 0x4062B828, 0x4063A820, - 0x40647220, 0x00000003, 0x4062B829, 0x4063A820, 0x40647220, 0x00000003, - 0x4062B821, 0x4063A820, 0x40648C20, 0x00000003, - // Block 379, offset 0x5ec0 - 0x4062B822, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B823, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062B824, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062B825, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B826, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062B827, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062B828, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B829, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062B82A, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062B82B, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B82C, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062B82D, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062B82E, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B82F, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062B830, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062B831, 0x4063A820, 0x40648C20, 0x00000003, - // Block 380, offset 0x5f00 - 0x4062B832, 0x4063A820, 0x40648C20, 0x00000002, 0x4062B821, 0x4063AA20, - 0x00000002, 0x4062B822, 0x4063AA20, 0x00000002, 0x4062B823, 0x4063AA20, - 0x00000002, 0x4062B824, 0x4063AA20, 0x00000002, 0x4062B825, 0x4063AA20, - 0x00000002, 0x4062B826, 0x4063AA20, 0x00000002, 0x4062B827, 0x4063AA20, - 0x00000002, 0x4062B828, 0x4063AA20, 0x00000002, 0x4062B829, 0x4063AA20, - 0x00000002, 0x4062B82A, 0x4063AA20, 0x00000002, 0x4062B82B, 0x4063AA20, - 0x00000002, 0x4062B82C, 0x4063AA20, 0x00000002, 0x4062B82D, 0x4063AA20, - 0x00000002, 0x4062B82E, 0x4063AA20, 0x00000002, 0x4062B82F, 0x4063AA20, - 0x00000002, 0x4062B830, 0x4063AA20, 0x00000002, 0x4062B831, 0x4063AA20, - 0x00000002, 0x4062B832, 0x4063AA20, 0x00000002, 0x4062B833, 0x4063AA20, - 0x00000002, 0x4062B834, 0x4063AA20, 0x00000002, - // Block 381, offset 0x5f40 - 0x4062B835, 0x4063AA20, 0x00000002, 0x4062B836, 0x4063AA20, 0x00000002, - 0x4062B837, 0x4063AA20, 0x00000003, 0x4062B821, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062B822, 0x4063AA20, 0x40646420, 0x00000003, 0x4062B823, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062B824, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062B825, 0x4063AA20, 0x40646420, 0x00000003, 0x4062B826, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062B827, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062B828, 0x4063AA20, 0x40646420, 0x00000003, 0x4062B821, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B822, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062B823, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B824, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B825, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062B826, 0x4063AA20, 0x40648C20, - // Block 382, offset 0x5f80 - 0x00000003, 0x4062B827, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B828, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B829, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062B82A, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B821, - 0x4063B420, 0x40646420, 0x00000003, 0x4062B822, 0x4063B420, 0x40646420, - 0x00000003, 0x4062B823, 0x4063B420, 0x40646420, 0x00000003, 0x4062B824, - 0x4063B420, 0x40646420, 0x00000003, 0x4062B821, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062B822, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B823, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062B824, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062B825, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B826, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062B827, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062B828, 0x4063B420, 0x40646A20, - // Block 383, offset 0x5fc0 - 0x00000003, 0x4062B829, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B82A, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062B82B, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062B82C, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B82D, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062B82E, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062B82F, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B830, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062B821, 0x4063B420, 0x40647220, - 0x00000003, 0x4062B822, 0x4063B420, 0x40647220, 0x00000003, 0x4062B823, - 0x4063B420, 0x40647220, 0x00000003, 0x4062B824, 0x4063B420, 0x40647220, - 0x00000003, 0x4062B821, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B822, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B823, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B824, 0x4063B420, 0x40648C20, - // Block 384, offset 0x6000 - 0x00000003, 0x4062B825, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B826, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B827, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B828, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B829, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B82A, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B82B, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B82C, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B82D, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062B82E, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B82F, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062B830, 0x4063B420, 0x40648C20, - 0x00000002, 0x4062B821, 0x4063B620, 0x00000002, 0x4062B821, 0x4063B820, - 0x00000002, 0x4062B822, 0x4063B820, 0x00000002, 0x4062B823, 0x4063B820, - 0x00000002, 0x4062B824, 0x4063B820, 0x00000002, - // Block 385, offset 0x6040 - 0x4062B825, 0x4063B820, 0x00000002, 0x4062B826, 0x4063B820, 0x00000002, - 0x4062B827, 0x4063B820, 0x00000002, 0x4062B828, 0x4063B820, 0x00000002, - 0x4062B829, 0x4063B820, 0x00000002, 0x4062B82A, 0x4063B820, 0x00000002, - 0x4062B82B, 0x4063B820, 0x00000002, 0x4062B82C, 0x4063B820, 0x00000002, - 0x4062B82D, 0x4063B820, 0x00000002, 0x4062B82E, 0x4063B820, 0x00000002, - 0x4062B82F, 0x4063B820, 0x00000002, 0x4062B830, 0x4063B820, 0x00000002, - 0x4062B831, 0x4063B820, 0x00000002, 0x4062B832, 0x4063B820, 0x00000002, - 0x4062B833, 0x4063B820, 0x00000002, 0x4062B834, 0x4063B820, 0x00000002, - 0x4062B835, 0x4063B820, 0x00000002, 0x4062B836, 0x4063B820, 0x00000002, - 0x4062B837, 0x4063B820, 0x00000002, 0x4062B838, 0x4063B820, 0x00000002, - 0x4062B839, 0x4063B820, 0x00000002, 0x4062B83A, - // Block 386, offset 0x6080 - 0x4063B820, 0x00000002, 0x4062B83B, 0x4063B820, 0x00000002, 0x4062B83C, - 0x4063B820, 0x00000002, 0x4062B83D, 0x4063B820, 0x00000002, 0x4062B83E, - 0x4063B820, 0x00000002, 0x4062B83F, 0x4063B820, 0x00000002, 0x4062B840, - 0x4063B820, 0x00000002, 0x4062B841, 0x4063B820, 0x00000002, 0x4062B842, - 0x4063B820, 0x00000002, 0x4062B843, 0x4063B820, 0x00000002, 0x4062B844, - 0x4063B820, 0x00000002, 0x4062B845, 0x4063B820, 0x00000002, 0x4062B846, - 0x4063B820, 0x00000002, 0x4062B847, 0x4063B820, 0x00000003, 0x4062B821, - 0x4063B820, 0x40646420, 0x00000003, 0x4062B822, 0x4063B820, 0x40646420, - 0x00000003, 0x4062B823, 0x4063B820, 0x40646420, 0x00000003, 0x4062B824, - 0x4063B820, 0x40646420, 0x00000003, 0x4062B825, 0x4063B820, 0x40646420, - 0x00000003, 0x4062B826, 0x4063B820, 0x40646420, - // Block 387, offset 0x60c0 - 0x00000003, 0x4062B827, 0x4063B820, 0x40646420, 0x00000003, 0x4062B828, - 0x4063B820, 0x40646420, 0x00000003, 0x4062B829, 0x4063B820, 0x40646420, - 0x00000003, 0x4062B821, 0x4063B820, 0x40647220, 0x00000003, 0x4062B822, - 0x4063B820, 0x40647220, 0x00000003, 0x4062B821, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062B822, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B823, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062B824, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062B825, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B826, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062B827, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062B828, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B829, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062B82A, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062B82B, 0x4063B820, 0x40648C20, - // Block 388, offset 0x6100 - 0x00000003, 0x4062B82C, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B82D, - 0x4063B820, 0x40648C20, 0x00000002, 0x4062B821, 0x4063C020, 0x00000002, - 0x4062B822, 0x4063C020, 0x00000002, 0x4062B823, 0x4063C020, 0x00000002, - 0x4062B824, 0x4063C020, 0x00000002, 0x4062B825, 0x4063C020, 0x00000002, - 0x4062B826, 0x4063C020, 0x00000002, 0x4062B827, 0x4063C020, 0x00000002, - 0x4062B828, 0x4063C020, 0x00000002, 0x4062B829, 0x4063C020, 0x00000002, - 0x4062B82A, 0x4063C020, 0x00000002, 0x4062B82B, 0x4063C020, 0x00000002, - 0x4062B82C, 0x4063C020, 0x00000002, 0x4062B82D, 0x4063C020, 0x00000002, - 0x4062B82E, 0x4063C020, 0x00000002, 0x4062B82F, 0x4063C020, 0x00000002, - 0x4062B830, 0x4063C020, 0x00000002, 0x4062B821, 0x4063C220, 0x00000002, - 0x4062B822, 0x4063C220, 0x00000002, 0x4062B823, - // Block 389, offset 0x6140 - 0x4063C220, 0x00000002, 0x4062B824, 0x4063C220, 0x00000002, 0x4062B825, - 0x4063C220, 0x00000002, 0x4062B826, 0x4063C220, 0x00000002, 0x4062B827, - 0x4063C220, 0x00000002, 0x4062B828, 0x4063C220, 0x00000002, 0x4062B829, - 0x4063C220, 0x00000002, 0x4062B82A, 0x4063C220, 0x00000002, 0x4062B82B, - 0x4063C220, 0x00000002, 0x4062B82C, 0x4063C220, 0x00000002, 0x4062B82D, - 0x4063C220, 0x00000002, 0x4062B82E, 0x4063C220, 0x00000002, 0x4062B82F, - 0x4063C220, 0x00000002, 0x4062B830, 0x4063C220, 0x00000002, 0x4062B831, - 0x4063C220, 0x00000002, 0x4062B832, 0x4063C220, 0x00000002, 0x4062B833, - 0x4063C220, 0x00000002, 0x4062B834, 0x4063C220, 0x00000002, 0x4062B835, - 0x4063C220, 0x00000002, 0x4062B836, 0x4063C220, 0x00000002, 0x4062B837, - 0x4063C220, 0x00000002, 0x4062B838, 0x4063C220, - // Block 390, offset 0x6180 - 0x00000002, 0x4062B839, 0x4063C220, 0x00000002, 0x4062B83A, 0x4063C220, - 0x00000002, 0x4062B83B, 0x4063C220, 0x00000003, 0x4062B821, 0x4063C220, - 0x40646420, 0x00000003, 0x4062B822, 0x4063C220, 0x40646420, 0x00000003, - 0x4062B823, 0x4063C220, 0x40646420, 0x00000003, 0x4062B821, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062B822, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062B823, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B824, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062B825, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062B826, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B827, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062B828, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062B829, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B82A, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062B82B, 0x4063C220, - // Block 391, offset 0x61c0 - 0x40646A20, 0x00000003, 0x4062B82C, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062B82D, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B82E, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062B82F, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062B830, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B831, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062B832, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062B833, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B821, 0x4063C220, - 0x40647220, 0x00000003, 0x4062B822, 0x4063C220, 0x40647220, 0x00000003, - 0x4062B823, 0x4063C220, 0x40647220, 0x00000002, 0x4062B821, 0x4063D020, - 0x00000002, 0x4062B822, 0x4063D020, 0x00000002, 0x4062B823, 0x4063D020, - 0x00000002, 0x4062B824, 0x4063D020, 0x00000002, 0x4062B825, 0x4063D020, - 0x00000002, 0x4062B826, 0x4063D020, 0x00000002, - // Block 392, offset 0x6200 - 0x4062B827, 0x4063D020, 0x00000002, 0x4062B828, 0x4063D020, 0x00000002, - 0x4062B829, 0x4063D020, 0x00000002, 0x4062B82A, 0x4063D020, 0x00000002, - 0x4062B82B, 0x4063D020, 0x00000002, 0x4062B82C, 0x4063D020, 0x00000002, - 0x4062B82D, 0x4063D020, 0x00000002, 0x4062B82E, 0x4063D020, 0x00000002, - 0x4062B82F, 0x4063D020, 0x00000002, 0x4062B830, 0x4063D020, 0x00000002, - 0x4062B831, 0x4063D020, 0x00000002, 0x4062B832, 0x4063D020, 0x00000002, - 0x4062B833, 0x4063D020, 0x00000002, 0x4062B834, 0x4063D020, 0x00000002, - 0x4062B835, 0x4063D020, 0x00000002, 0x4062B836, 0x4063D020, 0x00000002, - 0x4062B837, 0x4063D020, 0x00000002, 0x4062B838, 0x4063D020, 0x00000002, - 0x4062B839, 0x4063D020, 0x00000002, 0x4062B83A, 0x4063D020, 0x00000002, - 0x4062B83B, 0x4063D020, 0x00000002, 0x4062B83C, - // Block 393, offset 0x6240 - 0x4063D020, 0x00000002, 0x4062B83D, 0x4063D020, 0x00000002, 0x4062B83E, - 0x4063D020, 0x00000002, 0x4062B83F, 0x4063D020, 0x00000002, 0x4062B840, - 0x4063D020, 0x00000002, 0x4062B841, 0x4063D020, 0x00000003, 0x4062B821, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062B822, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062B823, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B824, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062B825, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062B826, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B827, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062B828, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062B829, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B82A, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062B82B, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062B82C, 0x4063D020, 0x40646A20, - // Block 394, offset 0x6280 - 0x00000003, 0x4062B82D, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B82E, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062B82F, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062B830, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B831, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062B832, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062B833, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B834, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062B835, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062B836, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B837, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062B821, 0x4063D020, 0x40647220, - 0x00000003, 0x4062B822, 0x4063D020, 0x40647220, 0x00000003, 0x4062B823, - 0x4063D020, 0x40647220, 0x00000003, 0x4062B824, 0x4063D020, 0x40647220, - 0x00000003, 0x4062B825, 0x4063D020, 0x40647220, - // Block 395, offset 0x62c0 - 0x00000003, 0x4062BA21, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA22, - 0x4063A820, 0x40646420, 0x00000003, 0x4062BA23, 0x4063A820, 0x40646420, - 0x00000003, 0x4062BA24, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA25, - 0x4063A820, 0x40646420, 0x00000003, 0x4062BA26, 0x4063A820, 0x40646420, - 0x00000003, 0x4062BA27, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA28, - 0x4063A820, 0x40646420, 0x00000003, 0x4062BA29, 0x4063A820, 0x40646420, - 0x00000003, 0x4062BA2A, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA2B, - 0x4063A820, 0x40646420, 0x00000003, 0x4062BA2C, 0x4063A820, 0x40646420, - 0x00000003, 0x4062BA2D, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA2E, - 0x4063A820, 0x40646420, 0x00000003, 0x4062BA2F, 0x4063A820, 0x40646420, - 0x00000003, 0x4062BA30, 0x4063A820, 0x40646420, - // Block 396, offset 0x6300 - 0x00000003, 0x4062BA31, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA32, - 0x4063A820, 0x40646420, 0x00000003, 0x4062BA33, 0x4063A820, 0x40646420, - 0x00000003, 0x4062BA34, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA35, - 0x4063A820, 0x40646420, 0x00000003, 0x4062BA36, 0x4063A820, 0x40646420, - 0x00000003, 0x4062BA37, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA38, - 0x4063A820, 0x40646420, 0x00000003, 0x4062BA39, 0x4063A820, 0x40646420, - 0x00000003, 0x4062BA21, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA22, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA23, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BA24, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA25, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA26, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BA27, 0x4063A820, 0x40646A20, - // Block 397, offset 0x6340 - 0x00000003, 0x4062BA28, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA29, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA2A, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BA2B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA2C, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA2D, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BA2E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA2F, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA30, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BA31, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA32, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA33, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BA34, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA35, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA36, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BA37, 0x4063A820, 0x40646A20, - // Block 398, offset 0x6380 - 0x00000003, 0x4062BA38, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA39, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA3A, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BA3B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA3C, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA3D, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BA3E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA3F, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA40, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BA41, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA21, - 0x4063A820, 0x40647220, 0x00000003, 0x4062BA22, 0x4063A820, 0x40647220, - 0x00000003, 0x4062BA23, 0x4063A820, 0x40647220, 0x00000003, 0x4062BA24, - 0x4063A820, 0x40647220, 0x00000003, 0x4062BA25, 0x4063A820, 0x40647220, - 0x00000003, 0x4062BA26, 0x4063A820, 0x40647220, - // Block 399, offset 0x63c0 - 0x00000003, 0x4062BA27, 0x4063A820, 0x40647220, 0x00000003, 0x4062BA28, - 0x4063A820, 0x40647220, 0x00000003, 0x4062BA29, 0x4063A820, 0x40647220, - 0x00000003, 0x4062BA2A, 0x4063A820, 0x40647220, 0x00000003, 0x4062BA2B, - 0x4063A820, 0x40647220, 0x00000003, 0x4062BA2C, 0x4063A820, 0x40647220, - 0x00000003, 0x4062BA2D, 0x4063A820, 0x40647220, 0x00000003, 0x4062BA2E, - 0x4063A820, 0x40647220, 0x00000003, 0x4062BA2F, 0x4063A820, 0x40647220, - 0x00000003, 0x4062BA30, 0x4063A820, 0x40647220, 0x00000003, 0x4062BA21, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA22, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA23, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA24, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA25, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA26, 0x4063A820, 0x40648C20, - // Block 400, offset 0x6400 - 0x00000003, 0x4062BA27, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA28, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA29, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA2A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA2B, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA2C, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA2D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA2E, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA2F, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA30, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA31, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA32, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA33, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA34, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA35, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA36, 0x4063A820, 0x40648C20, - // Block 401, offset 0x6440 - 0x00000003, 0x4062BA37, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA38, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA39, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA3A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA3B, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA3C, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA3D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA3E, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA3F, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA40, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA41, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA42, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA43, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA44, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA45, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BA46, 0x4063A820, 0x40648C20, - // Block 402, offset 0x6480 - 0x00000003, 0x4062BA47, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA48, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA49, 0x4063A820, 0x40648C20, - 0x00000002, 0x4062BA21, 0x4063AA20, 0x00000002, 0x4062BA22, 0x4063AA20, - 0x00000002, 0x4062BA23, 0x4063AA20, 0x00000002, 0x4062BA24, 0x4063AA20, - 0x00000002, 0x4062BA25, 0x4063AA20, 0x00000002, 0x4062BA26, 0x4063AA20, - 0x00000002, 0x4062BA27, 0x4063AA20, 0x00000002, 0x4062BA28, 0x4063AA20, - 0x00000002, 0x4062BA29, 0x4063AA20, 0x00000002, 0x4062BA2A, 0x4063AA20, - 0x00000002, 0x4062BA2B, 0x4063AA20, 0x00000002, 0x4062BA2C, 0x4063AA20, - 0x00000002, 0x4062BA2D, 0x4063AA20, 0x00000002, 0x4062BA2E, 0x4063AA20, - 0x00000002, 0x4062BA2F, 0x4063AA20, 0x00000002, 0x4062BA30, 0x4063AA20, - 0x00000002, 0x4062BA31, 0x4063AA20, 0x00000002, - // Block 403, offset 0x64c0 - 0x4062BA32, 0x4063AA20, 0x00000002, 0x4062BA33, 0x4063AA20, 0x00000002, - 0x4062BA34, 0x4063AA20, 0x00000002, 0x4062BA35, 0x4063AA20, 0x00000002, - 0x4062BA36, 0x4063AA20, 0x00000002, 0x4062BA37, 0x4063AA20, 0x00000002, - 0x4062BA38, 0x4063AA20, 0x00000003, 0x4062BA21, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062BA22, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA23, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA24, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062BA25, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA26, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA27, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062BA28, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA29, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA21, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BA22, 0x4063B020, 0x40646A20, - // Block 404, offset 0x6500 - 0x00000003, 0x4062BA23, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA24, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA25, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BA26, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA27, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA28, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BA29, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA2A, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA2B, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BA2C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA2D, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA2E, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BA21, 0x4063B020, 0x40647220, 0x00000003, 0x4062BA22, - 0x4063B020, 0x40647220, 0x00000003, 0x4062BA23, 0x4063B020, 0x40647220, - 0x00000003, 0x4062BA24, 0x4063B020, 0x40647220, - // Block 405, offset 0x6540 - 0x00000003, 0x4062BA25, 0x4063B020, 0x40647220, 0x00000003, 0x4062BA26, - 0x4063B020, 0x40647220, 0x00000003, 0x4062BA21, 0x4063B020, 0x40648220, - 0x00000003, 0x4062BA22, 0x4063B020, 0x40648220, 0x00000003, 0x4062BA23, - 0x4063B020, 0x40648220, 0x00000003, 0x4062BA24, 0x4063B020, 0x40648220, - 0x00000003, 0x4062BA25, 0x4063B020, 0x40648220, 0x00000003, 0x4062BA26, - 0x4063B020, 0x40648220, 0x00000003, 0x4062BA27, 0x4063B020, 0x40648220, - 0x00000003, 0x4062BA28, 0x4063B020, 0x40648220, 0x00000003, 0x4062BA29, - 0x4063B020, 0x40648220, 0x00000003, 0x4062BA2A, 0x4063B020, 0x40648220, - 0x00000003, 0x4062BA2B, 0x4063B020, 0x40648220, 0x00000003, 0x4062BA2C, - 0x4063B020, 0x40648220, 0x00000003, 0x4062BA21, 0x4063B020, 0x40648420, - 0x00000003, 0x4062BA22, 0x4063B020, 0x40648420, - // Block 406, offset 0x6580 - 0x00000003, 0x4062BA21, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA22, - 0x4063B420, 0x40646420, 0x00000003, 0x4062BA23, 0x4063B420, 0x40646420, - 0x00000003, 0x4062BA24, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA25, - 0x4063B420, 0x40646420, 0x00000003, 0x4062BA26, 0x4063B420, 0x40646420, - 0x00000003, 0x4062BA27, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA28, - 0x4063B420, 0x40646420, 0x00000003, 0x4062BA29, 0x4063B420, 0x40646420, - 0x00000003, 0x4062BA2A, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA2B, - 0x4063B420, 0x40646420, 0x00000003, 0x4062BA2C, 0x4063B420, 0x40646420, - 0x00000003, 0x4062BA2D, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA2E, - 0x4063B420, 0x40646420, 0x00000003, 0x4062BA2F, 0x4063B420, 0x40646420, - 0x00000003, 0x4062BA30, 0x4063B420, 0x40646420, - // Block 407, offset 0x65c0 - 0x00000003, 0x4062BA31, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA21, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA22, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062BA23, 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA24, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA25, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062BA26, 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA27, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA28, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062BA29, 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA2A, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA2B, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062BA2C, 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA2D, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA2E, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062BA2F, 0x4063B420, 0x40646A20, - // Block 408, offset 0x6600 - 0x00000003, 0x4062BA21, 0x4063B420, 0x40647220, 0x00000003, 0x4062BA22, - 0x4063B420, 0x40647220, 0x00000003, 0x4062BA23, 0x4063B420, 0x40647220, - 0x00000003, 0x4062BA24, 0x4063B420, 0x40647220, 0x00000003, 0x4062BA25, - 0x4063B420, 0x40647220, 0x00000003, 0x4062BA26, 0x4063B420, 0x40647220, - 0x00000003, 0x4062BA21, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA22, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA23, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062BA24, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA25, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA26, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062BA27, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA28, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA29, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062BA2A, 0x4063B420, 0x40648C20, - // Block 409, offset 0x6640 - 0x00000003, 0x4062BA2B, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA2C, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA2D, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062BA2E, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA2F, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA30, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062BA31, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA32, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA33, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062BA34, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA35, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA36, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062BA37, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA38, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA39, 0x4063B420, 0x40648C20, - 0x00000002, 0x4062BA21, 0x4063B820, 0x00000002, - // Block 410, offset 0x6680 - 0x4062BA22, 0x4063B820, 0x00000002, 0x4062BA23, 0x4063B820, 0x00000002, - 0x4062BA24, 0x4063B820, 0x00000002, 0x4062BA25, 0x4063B820, 0x00000002, - 0x4062BA26, 0x4063B820, 0x00000002, 0x4062BA27, 0x4063B820, 0x00000002, - 0x4062BA28, 0x4063B820, 0x00000002, 0x4062BA29, 0x4063B820, 0x00000002, - 0x4062BA2A, 0x4063B820, 0x00000002, 0x4062BA2B, 0x4063B820, 0x00000002, - 0x4062BA2C, 0x4063B820, 0x00000002, 0x4062BA2D, 0x4063B820, 0x00000002, - 0x4062BA2E, 0x4063B820, 0x00000002, 0x4062BA2F, 0x4063B820, 0x00000002, - 0x4062BA30, 0x4063B820, 0x00000002, 0x4062BA31, 0x4063B820, 0x00000002, - 0x4062BA32, 0x4063B820, 0x00000002, 0x4062BA33, 0x4063B820, 0x00000002, - 0x4062BA34, 0x4063B820, 0x00000002, 0x4062BA35, 0x4063B820, 0x00000002, - 0x4062BA36, 0x4063B820, 0x00000002, 0x4062BA37, - // Block 411, offset 0x66c0 - 0x4063B820, 0x00000003, 0x4062BA21, 0x4063B820, 0x40646420, 0x00000003, - 0x4062BA22, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA23, 0x4063B820, - 0x40646420, 0x00000003, 0x4062BA24, 0x4063B820, 0x40646420, 0x00000003, - 0x4062BA25, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA26, 0x4063B820, - 0x40646420, 0x00000003, 0x4062BA27, 0x4063B820, 0x40646420, 0x00000003, - 0x4062BA28, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA29, 0x4063B820, - 0x40646420, 0x00000003, 0x4062BA2A, 0x4063B820, 0x40646420, 0x00000003, - 0x4062BA2B, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA2C, 0x4063B820, - 0x40646420, 0x00000003, 0x4062BA2D, 0x4063B820, 0x40646420, 0x00000003, - 0x4062BA2E, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA2F, 0x4063B820, - 0x40646420, 0x00000003, 0x4062BA30, 0x4063B820, - // Block 412, offset 0x6700 - 0x40646420, 0x00000003, 0x4062BA31, 0x4063B820, 0x40646420, 0x00000003, - 0x4062BA32, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA33, 0x4063B820, - 0x40646420, 0x00000003, 0x4062BA34, 0x4063B820, 0x40646420, 0x00000003, - 0x4062BA35, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA36, 0x4063B820, - 0x40646420, 0x00000003, 0x4062BA37, 0x4063B820, 0x40646420, 0x00000003, - 0x4062BA38, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA39, 0x4063B820, - 0x40646420, 0x00000003, 0x4062BA3A, 0x4063B820, 0x40646420, 0x00000003, - 0x4062BA21, 0x4063B820, 0x40646A20, 0x00000003, 0x4062BA21, 0x4063B820, - 0x40647220, 0x00000003, 0x4062BA21, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062BA22, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA23, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062BA24, 0x4063B820, - // Block 413, offset 0x6740 - 0x40648C20, 0x00000003, 0x4062BA25, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062BA26, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA27, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062BA28, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062BA29, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA2A, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062BA2B, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062BA2C, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA2D, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062BA2E, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062BA2F, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA30, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062BA31, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062BA32, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA33, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062BA34, 0x4063B820, - // Block 414, offset 0x6780 - 0x40648C20, 0x00000003, 0x4062BA35, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062BA36, 0x4063B820, 0x40648C20, 0x00000002, 0x4062BA21, 0x4063C220, - 0x00000002, 0x4062BA22, 0x4063C220, 0x00000002, 0x4062BA23, 0x4063C220, - 0x00000002, 0x4062BA24, 0x4063C220, 0x00000002, 0x4062BA25, 0x4063C220, - 0x00000002, 0x4062BA26, 0x4063C220, 0x00000002, 0x4062BA27, 0x4063C220, - 0x00000002, 0x4062BA28, 0x4063C220, 0x00000002, 0x4062BA29, 0x4063C220, - 0x00000002, 0x4062BA2A, 0x4063C220, 0x00000002, 0x4062BA2B, 0x4063C220, - 0x00000002, 0x4062BA2C, 0x4063C220, 0x00000002, 0x4062BA2D, 0x4063C220, - 0x00000002, 0x4062BA2E, 0x4063C220, 0x00000002, 0x4062BA2F, 0x4063C220, - 0x00000002, 0x4062BA30, 0x4063C220, 0x00000002, 0x4062BA31, 0x4063C220, - 0x00000002, 0x4062BA32, 0x4063C220, 0x00000002, - // Block 415, offset 0x67c0 - 0x4062BA33, 0x4063C220, 0x00000002, 0x4062BA34, 0x4063C220, 0x00000002, - 0x4062BA35, 0x4063C220, 0x00000002, 0x4062BA36, 0x4063C220, 0x00000002, - 0x4062BA37, 0x4063C220, 0x00000002, 0x4062BA38, 0x4063C220, 0x00000002, - 0x4062BA39, 0x4063C220, 0x00000002, 0x4062BA3A, 0x4063C220, 0x00000002, - 0x4062BA3B, 0x4063C220, 0x00000002, 0x4062BA3C, 0x4063C220, 0x00000002, - 0x4062BA3D, 0x4063C220, 0x00000002, 0x4062BA3E, 0x4063C220, 0x00000002, - 0x4062BA3F, 0x4063C220, 0x00000002, 0x4062BA40, 0x4063C220, 0x00000002, - 0x4062BA41, 0x4063C220, 0x00000002, 0x4062BA42, 0x4063C220, 0x00000002, - 0x4062BA43, 0x4063C220, 0x00000002, 0x4062BA44, 0x4063C220, 0x00000002, - 0x4062BA45, 0x4063C220, 0x00000002, 0x4062BA46, 0x4063C220, 0x00000002, - 0x4062BA47, 0x4063C220, 0x00000002, 0x4062BA48, - // Block 416, offset 0x6800 - 0x4063C220, 0x00000002, 0x4062BA49, 0x4063C220, 0x00000002, 0x4062BA4A, - 0x4063C220, 0x00000002, 0x4062BA4B, 0x4063C220, 0x00000002, 0x4062BA4C, - 0x4063C220, 0x00000002, 0x4062BA4D, 0x4063C220, 0x00000002, 0x4062BA4E, - 0x4063C220, 0x00000002, 0x4062BA4F, 0x4063C220, 0x00000002, 0x4062BA50, - 0x4063C220, 0x00000002, 0x4062BA51, 0x4063C220, 0x00000002, 0x4062BA52, - 0x4063C220, 0x00000002, 0x4062BA53, 0x4063C220, 0x00000002, 0x4062BA54, - 0x4063C220, 0x00000002, 0x4062BA55, 0x4063C220, 0x00000002, 0x4062BA56, - 0x4063C220, 0x00000002, 0x4062BA57, 0x4063C220, 0x00000002, 0x4062BA58, - 0x4063C220, 0x00000002, 0x4062BA59, 0x4063C220, 0x00000002, 0x4062BA5A, - 0x4063C220, 0x00000002, 0x4062BA5B, 0x4063C220, 0x00000002, 0x4062BA5C, - 0x4063C220, 0x00000002, 0x4062BA5D, 0x4063C220, - // Block 417, offset 0x6840 - 0x00000002, 0x4062BA5E, 0x4063C220, 0x00000002, 0x4062BA5F, 0x4063C220, - 0x00000002, 0x4062BA60, 0x4063C220, 0x00000002, 0x4062BA61, 0x4063C220, - 0x00000002, 0x4062BA62, 0x4063C220, 0x00000002, 0x4062BA63, 0x4063C220, - 0x00000002, 0x4062BA64, 0x4063C220, 0x00000002, 0x4062BA65, 0x4063C220, - 0x00000003, 0x4062BA21, 0x4063C220, 0x40646420, 0x00000003, 0x4062BA21, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA22, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA23, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA24, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA25, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA26, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA27, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA28, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA29, 0x4063C220, 0x40646A20, - // Block 418, offset 0x6880 - 0x00000003, 0x4062BA2A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA2B, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA2C, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA2D, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA2E, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA2F, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA30, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA31, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA32, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA33, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA34, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA35, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA36, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA37, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA38, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA39, 0x4063C220, 0x40646A20, - // Block 419, offset 0x68c0 - 0x00000003, 0x4062BA3A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA3B, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA3C, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA3D, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA3E, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA3F, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA40, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA41, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA42, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA43, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA44, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA45, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062BA46, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA21, - 0x4063C220, 0x40647220, 0x00000003, 0x4062BA22, 0x4063C220, 0x40647220, - 0x00000003, 0x4062BA23, 0x4063C220, 0x40647220, - // Block 420, offset 0x6900 - 0x00000003, 0x4062BA24, 0x4063C220, 0x40647220, 0x00000003, 0x4062BA25, - 0x4063C220, 0x40647220, 0x00000003, 0x4062BA26, 0x4063C220, 0x40647220, - 0x00000003, 0x4062BA27, 0x4063C220, 0x40647220, 0x00000003, 0x4062BA28, - 0x4063C220, 0x40647220, 0x00000003, 0x4062BA29, 0x4063C220, 0x40647220, - 0x00000003, 0x4062BA2A, 0x4063C220, 0x40647220, 0x00000003, 0x4062BA2B, - 0x4063C220, 0x40647220, 0x00000003, 0x4062BA2C, 0x4063C220, 0x40647220, - 0x00000003, 0x4062BA21, 0x4063C220, 0x40648C20, 0x00000003, 0x4062BA22, - 0x4063C220, 0x40648C20, 0x00000003, 0x4062BA23, 0x4063C220, 0x40648C20, - 0x00000003, 0x4062BA24, 0x4063C220, 0x40648C20, 0x00000003, 0x4062BA25, - 0x4063C220, 0x40648C20, 0x00000003, 0x4062BA26, 0x4063C220, 0x40648C20, - 0x00000003, 0x4062BA27, 0x4063C220, 0x40648C20, - // Block 421, offset 0x6940 - 0x00000003, 0x4062BA28, 0x4063C220, 0x40648C20, 0x00000003, 0x4062BA29, - 0x4063C220, 0x40648C20, 0x00000002, 0x4062BA21, 0x4063D020, 0x00000002, - 0x4062BA22, 0x4063D020, 0x00000002, 0x4062BA23, 0x4063D020, 0x00000002, - 0x4062BA24, 0x4063D020, 0x00000002, 0x4062BA25, 0x4063D020, 0x00000002, - 0x4062BA26, 0x4063D020, 0x00000002, 0x4062BA27, 0x4063D020, 0x00000002, - 0x4062BA28, 0x4063D020, 0x00000002, 0x4062BA29, 0x4063D020, 0x00000002, - 0x4062BA2A, 0x4063D020, 0x00000002, 0x4062BA2B, 0x4063D020, 0x00000002, - 0x4062BA2C, 0x4063D020, 0x00000002, 0x4062BA2D, 0x4063D020, 0x00000002, - 0x4062BA2E, 0x4063D020, 0x00000002, 0x4062BA2F, 0x4063D020, 0x00000002, - 0x4062BA30, 0x4063D020, 0x00000002, 0x4062BA31, 0x4063D020, 0x00000002, - 0x4062BA32, 0x4063D020, 0x00000002, 0x4062BA33, - // Block 422, offset 0x6980 - 0x4063D020, 0x00000002, 0x4062BA34, 0x4063D020, 0x00000002, 0x4062BA35, - 0x4063D020, 0x00000002, 0x4062BA36, 0x4063D020, 0x00000002, 0x4062BA37, - 0x4063D020, 0x00000002, 0x4062BA38, 0x4063D020, 0x00000002, 0x4062BA39, - 0x4063D020, 0x00000002, 0x4062BA3A, 0x4063D020, 0x00000002, 0x4062BA3B, - 0x4063D020, 0x00000002, 0x4062BA3C, 0x4063D020, 0x00000002, 0x4062BA3D, - 0x4063D020, 0x00000002, 0x4062BA3E, 0x4063D020, 0x00000002, 0x4062BA3F, - 0x4063D020, 0x00000002, 0x4062BA40, 0x4063D020, 0x00000002, 0x4062BA41, - 0x4063D020, 0x00000002, 0x4062BA42, 0x4063D020, 0x00000002, 0x4062BA43, - 0x4063D020, 0x00000002, 0x4062BA44, 0x4063D020, 0x00000002, 0x4062BA45, - 0x4063D020, 0x00000002, 0x4062BA46, 0x4063D020, 0x00000002, 0x4062BA47, - 0x4063D020, 0x00000002, 0x4062BA48, 0x4063D020, - // Block 423, offset 0x69c0 - 0x00000002, 0x4062BA49, 0x4063D020, 0x00000002, 0x4062BA4A, 0x4063D020, - 0x00000002, 0x4062BA4B, 0x4063D020, 0x00000002, 0x4062BA4C, 0x4063D020, - 0x00000002, 0x4062BA4D, 0x4063D020, 0x00000002, 0x4062BA4E, 0x4063D020, - 0x00000002, 0x4062BA4F, 0x4063D020, 0x00000002, 0x4062BA50, 0x4063D020, - 0x00000002, 0x4062BA51, 0x4063D020, 0x00000002, 0x4062BA52, 0x4063D020, - 0x00000002, 0x4062BA53, 0x4063D020, 0x00000002, 0x4062BA54, 0x4063D020, - 0x00000002, 0x4062BA55, 0x4063D020, 0x00000002, 0x4062BA56, 0x4063D020, - 0x00000002, 0x4062BA57, 0x4063D020, 0x00000002, 0x4062BA58, 0x4063D020, - 0x00000002, 0x4062BA59, 0x4063D020, 0x00000002, 0x4062BA5A, 0x4063D020, - 0x00000002, 0x4062BA5B, 0x4063D020, 0x00000002, 0x4062BA5C, 0x4063D020, - 0x00000002, 0x4062BA5D, 0x4063D020, 0x00000002, - // Block 424, offset 0x6a00 - 0x4062BA5E, 0x4063D020, 0x00000002, 0x4062BA5F, 0x4063D020, 0x00000002, - 0x4062BA60, 0x4063D020, 0x00000002, 0x4062BA61, 0x4063D020, 0x00000002, - 0x4062BA62, 0x4063D020, 0x00000002, 0x4062BA63, 0x4063D020, 0x00000002, - 0x4062BA64, 0x4063D020, 0x00000002, 0x4062BA65, 0x4063D020, 0x00000002, - 0x4062BA66, 0x4063D020, 0x00000002, 0x4062BA67, 0x4063D020, 0x00000002, - 0x4062BA68, 0x4063D020, 0x00000002, 0x4062BA69, 0x4063D020, 0x00000002, - 0x4062BA6A, 0x4063D020, 0x00000002, 0x4062BA6B, 0x4063D020, 0x00000002, - 0x4062BA6C, 0x4063D020, 0x00000002, 0x4062BA6D, 0x4063D020, 0x00000002, - 0x4062BA6E, 0x4063D020, 0x00000002, 0x4062BA6F, 0x4063D020, 0x00000002, - 0x4062BA70, 0x4063D020, 0x00000002, 0x4062BA71, 0x4063D020, 0x00000002, - 0x4062BA72, 0x4063D020, 0x00000002, 0x4062BA73, - // Block 425, offset 0x6a40 - 0x4063D020, 0x00000002, 0x4062BA74, 0x4063D020, 0x00000002, 0x4062BA75, - 0x4063D020, 0x00000003, 0x4062BA21, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BA22, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA23, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BA24, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BA25, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA26, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BA27, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BA28, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA29, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BA2A, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BA2B, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA2C, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BA2D, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BA2E, 0x4063D020, 0x40646A20, 0x00000003, - // Block 426, offset 0x6a80 - 0x4062BA2F, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA30, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BA31, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BA32, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA33, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BA34, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BA35, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA36, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BA37, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BA38, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA39, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BA3A, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BA3B, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA21, 0x4063D020, - 0x40648C20, 0x00000003, 0x4062BA22, 0x4063D020, 0x40648C20, 0x00000003, - 0x4062BA23, 0x4063D020, 0x40648C20, 0x00000003, - // Block 427, offset 0x6ac0 - 0x4062BA24, 0x4063D020, 0x40648C20, 0x00000003, 0x4062BA25, 0x4063D020, - 0x40648C20, 0x00000003, 0x4062BA26, 0x4063D020, 0x40648C20, 0x00000003, - 0x4062BA27, 0x4063D020, 0x40648C20, 0x00000003, 0x4062BA28, 0x4063D020, - 0x40648C20, 0x00000002, 0x4062BE21, 0x4063A820, 0x00000002, 0x4062BE22, - 0x4063A820, 0x00000002, 0x4062BE23, 0x4063A820, 0x00000002, 0x4062BE24, - 0x4063A820, 0x00000002, 0x4062BE25, 0x4063A820, 0x00000002, 0x4062BE26, - 0x4063A820, 0x00000002, 0x4062BE27, 0x4063A820, 0x00000002, 0x4062BE28, - 0x4063A820, 0x00000002, 0x4062BE29, 0x4063A820, 0x00000002, 0x4062BE2A, - 0x4063A820, 0x00000002, 0x4062BE2B, 0x4063A820, 0x00000002, 0x4062BE2C, - 0x4063A820, 0x00000002, 0x4062BE2D, 0x4063A820, 0x00000002, 0x4062BE2E, - 0x4063A820, 0x00000002, 0x4062BE2F, 0x4063A820, - // Block 428, offset 0x6b00 - 0x00000002, 0x4062BE30, 0x4063A820, 0x00000002, 0x4062BE31, 0x4063A820, - 0x00000002, 0x4062BE32, 0x4063A820, 0x00000002, 0x4062BE33, 0x4063A820, - 0x00000002, 0x4062BE34, 0x4063A820, 0x00000002, 0x4062BE35, 0x4063A820, - 0x00000002, 0x4062BE36, 0x4063A820, 0x00000002, 0x4062BE37, 0x4063A820, - 0x00000002, 0x4062BE38, 0x4063A820, 0x00000002, 0x4062BE39, 0x4063A820, - 0x00000002, 0x4062BE3A, 0x4063A820, 0x00000002, 0x4062BE3B, 0x4063A820, - 0x00000002, 0x4062BE3C, 0x4063A820, 0x00000002, 0x4062BE3D, 0x4063A820, - 0x00000002, 0x4062BE3E, 0x4063A820, 0x00000002, 0x4062BE3F, 0x4063A820, - 0x00000002, 0x4062BE40, 0x4063A820, 0x00000002, 0x4062BE41, 0x4063A820, - 0x00000002, 0x4062BE42, 0x4063A820, 0x00000002, 0x4062BE43, 0x4063A820, - 0x00000002, 0x4062BE44, 0x4063A820, 0x00000002, - // Block 429, offset 0x6b40 - 0x4062BE45, 0x4063A820, 0x00000002, 0x4062BE46, 0x4063A820, 0x00000002, - 0x4062BE47, 0x4063A820, 0x00000002, 0x4062BE48, 0x4063A820, 0x00000002, - 0x4062BE49, 0x4063A820, 0x00000002, 0x4062BE4A, 0x4063A820, 0x00000002, - 0x4062BE4B, 0x4063A820, 0x00000002, 0x4062BE4C, 0x4063A820, 0x00000002, - 0x4062BE4D, 0x4063A820, 0x00000002, 0x4062BE4E, 0x4063A820, 0x00000002, - 0x4062BE4F, 0x4063A820, 0x00000002, 0x4062BE50, 0x4063A820, 0x00000002, - 0x4062BE51, 0x4063A820, 0x00000002, 0x4062BE52, 0x4063A820, 0x00000002, - 0x4062BE53, 0x4063A820, 0x00000002, 0x4062BE54, 0x4063A820, 0x00000002, - 0x4062BE55, 0x4063A820, 0x00000002, 0x4062BE56, 0x4063A820, 0x00000002, - 0x4062BE57, 0x4063A820, 0x00000002, 0x4062BE58, 0x4063A820, 0x00000002, - 0x4062BE59, 0x4063A820, 0x00000002, 0x4062BE5A, - // Block 430, offset 0x6b80 - 0x4063A820, 0x00000002, 0x4062BE5B, 0x4063A820, 0x00000002, 0x4062BE5C, - 0x4063A820, 0x00000002, 0x4062BE5D, 0x4063A820, 0x00000002, 0x4062BE5E, - 0x4063A820, 0x00000002, 0x4062BE5F, 0x4063A820, 0x00000002, 0x4062BE60, - 0x4063A820, 0x00000002, 0x4062BE61, 0x4063A820, 0x00000002, 0x4062BE62, - 0x4063A820, 0x00000002, 0x4062BE63, 0x4063A820, 0x00000002, 0x4062BE64, - 0x4063A820, 0x00000002, 0x4062BE65, 0x4063A820, 0x00000002, 0x4062BE66, - 0x4063A820, 0x00000002, 0x4062BE67, 0x4063A820, 0x00000002, 0x4062BE68, - 0x4063A820, 0x00000002, 0x4062BE69, 0x4063A820, 0x00000002, 0x4062BE6A, - 0x4063A820, 0x00000002, 0x4062BE6B, 0x4063A820, 0x00000002, 0x4062BE6C, - 0x4063A820, 0x00000002, 0x4062BE6D, 0x4063A820, 0x00000002, 0x4062BE6E, - 0x4063A820, 0x00000002, 0x4062BE6F, 0x4063A820, - // Block 431, offset 0x6bc0 - 0x00000003, 0x4062BE21, 0x4063A820, 0x40646420, 0x00000003, 0x4062BE22, - 0x4063A820, 0x40646420, 0x00000003, 0x4062BE23, 0x4063A820, 0x40646420, - 0x00000003, 0x4062BE24, 0x4063A820, 0x40646420, 0x00000003, 0x4062BE25, - 0x4063A820, 0x40646420, 0x00000003, 0x4062BE26, 0x4063A820, 0x40646420, - 0x00000003, 0x4062BE21, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE22, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE23, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BE24, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE25, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE26, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BE27, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE28, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE29, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BE2A, 0x4063A820, 0x40646A20, - // Block 432, offset 0x6c00 - 0x00000003, 0x4062BE2B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE2C, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE2D, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BE2E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE2F, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE30, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BE31, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE32, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE33, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BE34, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE35, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE36, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062BE37, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE38, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE21, 0x4063A820, 0x40647220, - 0x00000003, 0x4062BE22, 0x4063A820, 0x40647220, - // Block 433, offset 0x6c40 - 0x00000003, 0x4062BE23, 0x4063A820, 0x40647220, 0x00000003, 0x4062BE24, - 0x4063A820, 0x40647220, 0x00000003, 0x4062BE25, 0x4063A820, 0x40647220, - 0x00000003, 0x4062BE21, 0x4063A820, 0x40648220, 0x00000003, 0x4062BE22, - 0x4063A820, 0x40648220, 0x00000003, 0x4062BE23, 0x4063A820, 0x40648220, - 0x00000003, 0x4062BE24, 0x4063A820, 0x40648220, 0x00000003, 0x4062BE25, - 0x4063A820, 0x40648220, 0x00000003, 0x4062BE26, 0x4063A820, 0x40648220, - 0x00000003, 0x4062BE27, 0x4063A820, 0x40648220, 0x00000003, 0x4062BE28, - 0x4063A820, 0x40648220, 0x00000003, 0x4062BE29, 0x4063A820, 0x40648220, - 0x00000003, 0x4062BE2A, 0x4063A820, 0x40648220, 0x00000003, 0x4062BE21, - 0x4063A820, 0x40648420, 0x00000003, 0x4062BE22, 0x4063A820, 0x40648420, - 0x00000003, 0x4062BE23, 0x4063A820, 0x40648420, - // Block 434, offset 0x6c80 - 0x00000003, 0x4062BE24, 0x4063A820, 0x40648420, 0x00000003, 0x4062BE25, - 0x4063A820, 0x40648420, 0x00000003, 0x4062BE26, 0x4063A820, 0x40648420, - 0x00000003, 0x4062BE27, 0x4063A820, 0x40648420, 0x00000003, 0x4062BE28, - 0x4063A820, 0x40648420, 0x00000003, 0x4062BE29, 0x4063A820, 0x40648420, - 0x00000003, 0x4062BE2A, 0x4063A820, 0x40648420, 0x00000003, 0x4062BE2B, - 0x4063A820, 0x40648420, 0x00000003, 0x4062BE21, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE22, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE23, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE24, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE25, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE26, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE27, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE28, 0x4063A820, 0x40648C20, - // Block 435, offset 0x6cc0 - 0x00000003, 0x4062BE29, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE2A, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE2B, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE2C, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE2D, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE2E, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE2F, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE30, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE31, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE32, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE33, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE34, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE35, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE36, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE37, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE38, 0x4063A820, 0x40648C20, - // Block 436, offset 0x6d00 - 0x00000003, 0x4062BE39, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE3A, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE3B, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE3C, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE3D, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE3E, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE3F, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE40, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE41, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE42, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE43, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE44, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE45, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE46, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE47, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062BE48, 0x4063A820, 0x40648C20, - // Block 437, offset 0x6d40 - 0x00000002, 0x4062BE21, 0x4063AA20, 0x00000002, 0x4062BE22, 0x4063AA20, - 0x00000002, 0x4062BE23, 0x4063AA20, 0x00000002, 0x4062BE24, 0x4063AA20, - 0x00000003, 0x4062BE21, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BE22, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062BE23, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062BE24, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BE25, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062BE26, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062BE27, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BE21, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062BE22, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062BE23, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062BE24, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062BE25, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062BE26, 0x4063AA20, 0x40648C20, - // Block 438, offset 0x6d80 - 0x00000002, 0x4062BE21, 0x4063B020, 0x00000002, 0x4062BE22, 0x4063B020, - 0x00000002, 0x4062BE23, 0x4063B020, 0x00000002, 0x4062BE24, 0x4063B020, - 0x00000002, 0x4062BE25, 0x4063B020, 0x00000002, 0x4062BE26, 0x4063B020, - 0x00000002, 0x4062BE27, 0x4063B020, 0x00000002, 0x4062BE28, 0x4063B020, - 0x00000002, 0x4062BE29, 0x4063B020, 0x00000002, 0x4062BE2A, 0x4063B020, - 0x00000002, 0x4062BE2B, 0x4063B020, 0x00000002, 0x4062BE2C, 0x4063B020, - 0x00000002, 0x4062BE2D, 0x4063B020, 0x00000002, 0x4062BE2E, 0x4063B020, - 0x00000002, 0x4062BE2F, 0x4063B020, 0x00000002, 0x4062BE30, 0x4063B020, - 0x00000002, 0x4062BE31, 0x4063B020, 0x00000002, 0x4062BE32, 0x4063B020, - 0x00000002, 0x4062BE33, 0x4063B020, 0x00000002, 0x4062BE34, 0x4063B020, - 0x00000002, 0x4062BE35, 0x4063B020, 0x00000002, - // Block 439, offset 0x6dc0 - 0x4062BE36, 0x4063B020, 0x00000002, 0x4062BE37, 0x4063B020, 0x00000002, - 0x4062BE38, 0x4063B020, 0x00000002, 0x4062BE39, 0x4063B020, 0x00000002, - 0x4062BE3A, 0x4063B020, 0x00000002, 0x4062BE3B, 0x4063B020, 0x00000002, - 0x4062BE3C, 0x4063B020, 0x00000002, 0x4062BE3D, 0x4063B020, 0x00000002, - 0x4062BE3E, 0x4063B020, 0x00000002, 0x4062BE3F, 0x4063B020, 0x00000002, - 0x4062BE40, 0x4063B020, 0x00000002, 0x4062BE41, 0x4063B020, 0x00000002, - 0x4062BE42, 0x4063B020, 0x00000002, 0x4062BE43, 0x4063B020, 0x00000002, - 0x4062BE44, 0x4063B020, 0x00000002, 0x4062BE45, 0x4063B020, 0x00000002, - 0x4062BE46, 0x4063B020, 0x00000002, 0x4062BE47, 0x4063B020, 0x00000002, - 0x4062BE48, 0x4063B020, 0x00000003, 0x4062BE21, 0x4063B020, 0x40646420, - 0x00000003, 0x4062BE22, 0x4063B020, 0x40646420, - // Block 440, offset 0x6e00 - 0x00000003, 0x4062BE23, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE24, - 0x4063B020, 0x40646420, 0x00000003, 0x4062BE25, 0x4063B020, 0x40646420, - 0x00000003, 0x4062BE26, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE27, - 0x4063B020, 0x40646420, 0x00000003, 0x4062BE28, 0x4063B020, 0x40646420, - 0x00000003, 0x4062BE29, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE2A, - 0x4063B020, 0x40646420, 0x00000003, 0x4062BE2B, 0x4063B020, 0x40646420, - 0x00000003, 0x4062BE2C, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE2D, - 0x4063B020, 0x40646420, 0x00000003, 0x4062BE2E, 0x4063B020, 0x40646420, - 0x00000003, 0x4062BE2F, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE30, - 0x4063B020, 0x40646420, 0x00000003, 0x4062BE31, 0x4063B020, 0x40646420, - 0x00000003, 0x4062BE32, 0x4063B020, 0x40646420, - // Block 441, offset 0x6e40 - 0x00000003, 0x4062BE33, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE34, - 0x4063B020, 0x40646420, 0x00000003, 0x4062BE35, 0x4063B020, 0x40646420, - 0x00000003, 0x4062BE36, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE21, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE22, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE23, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE24, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE25, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE26, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE27, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE28, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE29, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE2A, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE2B, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE2C, 0x4063B020, 0x40646A20, - // Block 442, offset 0x6e80 - 0x00000003, 0x4062BE2D, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE2E, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE2F, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE30, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE31, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE32, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE33, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE34, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE35, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE36, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE37, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE38, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE39, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE3A, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE3B, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE3C, 0x4063B020, 0x40646A20, - // Block 443, offset 0x6ec0 - 0x00000003, 0x4062BE3D, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE3E, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE3F, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE40, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE41, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE42, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE43, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE44, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE45, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE46, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE47, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE48, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE49, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE4A, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE4B, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE4C, 0x4063B020, 0x40646A20, - // Block 444, offset 0x6f00 - 0x00000003, 0x4062BE4D, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE4E, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE4F, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062BE50, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE21, - 0x4063B020, 0x40647220, 0x00000003, 0x4062BE22, 0x4063B020, 0x40647220, - 0x00000003, 0x4062BE23, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE24, - 0x4063B020, 0x40647220, 0x00000003, 0x4062BE25, 0x4063B020, 0x40647220, - 0x00000003, 0x4062BE26, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE27, - 0x4063B020, 0x40647220, 0x00000003, 0x4062BE28, 0x4063B020, 0x40647220, - 0x00000003, 0x4062BE29, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE2A, - 0x4063B020, 0x40647220, 0x00000003, 0x4062BE2B, 0x4063B020, 0x40647220, - 0x00000003, 0x4062BE2C, 0x4063B020, 0x40647220, - // Block 445, offset 0x6f40 - 0x00000003, 0x4062BE2D, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE2E, - 0x4063B020, 0x40647220, 0x00000003, 0x4062BE2F, 0x4063B020, 0x40647220, - 0x00000003, 0x4062BE30, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE31, - 0x4063B020, 0x40647220, 0x00000003, 0x4062BE32, 0x4063B020, 0x40647220, - 0x00000003, 0x4062BE33, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE34, - 0x4063B020, 0x40647220, 0x00000003, 0x4062BE35, 0x4063B020, 0x40647220, - 0x00000003, 0x4062BE21, 0x4063B020, 0x40648220, 0x00000003, 0x4062BE22, - 0x4063B020, 0x40648220, 0x00000003, 0x4062BE23, 0x4063B020, 0x40648220, - 0x00000003, 0x4062BE24, 0x4063B020, 0x40648220, 0x00000003, 0x4062BE25, - 0x4063B020, 0x40648220, 0x00000003, 0x4062BE26, 0x4063B020, 0x40648220, - 0x00000003, 0x4062BE27, 0x4063B020, 0x40648220, - // Block 446, offset 0x6f80 - 0x00000003, 0x4062BE28, 0x4063B020, 0x40648220, 0x00000003, 0x4062BE29, - 0x4063B020, 0x40648220, 0x00000003, 0x4062BE2A, 0x4063B020, 0x40648220, - 0x00000003, 0x4062BE2B, 0x4063B020, 0x40648220, 0x00000003, 0x4062BE2C, - 0x4063B020, 0x40648220, 0x00000003, 0x4062BE2D, 0x4063B020, 0x40648220, - 0x00000003, 0x4062BE2E, 0x4063B020, 0x40648220, 0x00000003, 0x4062BE2F, - 0x4063B020, 0x40648220, 0x00000003, 0x4062BE21, 0x4063B020, 0x40648420, - 0x00000003, 0x4062BE22, 0x4063B020, 0x40648420, 0x00000003, 0x4062BE23, - 0x4063B020, 0x40648420, 0x00000003, 0x4062BE24, 0x4063B020, 0x40648420, - 0x00000003, 0x4062BE25, 0x4063B020, 0x40648420, 0x00000003, 0x4062BE26, - 0x4063B020, 0x40648420, 0x00000003, 0x4062BE27, 0x4063B020, 0x40648420, - 0x00000003, 0x4062BE28, 0x4063B020, 0x40648420, - // Block 447, offset 0x6fc0 - 0x00000003, 0x4062BE29, 0x4063B020, 0x40648420, 0x00000003, 0x4062BE2A, - 0x4063B020, 0x40648420, 0x00000003, 0x4062BE21, 0x4063B020, 0x40648C20, - 0x00000003, 0x4062BE22, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE23, - 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE24, 0x4063B020, 0x40648C20, - 0x00000003, 0x4062BE25, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE26, - 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE27, 0x4063B020, 0x40648C20, - 0x00000003, 0x4062BE28, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE29, - 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE2A, 0x4063B020, 0x40648C20, - 0x00000003, 0x4062BE2B, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE2C, - 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE2D, 0x4063B020, 0x40648C20, - 0x00000003, 0x4062BE2E, 0x4063B020, 0x40648C20, - // Block 448, offset 0x7000 - 0x00000003, 0x4062BE2F, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE30, - 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE31, 0x4063B020, 0x40648C20, - 0x00000003, 0x4062BE32, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE33, - 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE34, 0x4063B020, 0x40648C20, - 0x00000002, 0x4062BE21, 0x4063B220, 0x00000002, 0x4062BE22, 0x4063B220, - 0x00000002, 0x4062BE23, 0x4063B220, 0x00000002, 0x4062BE24, 0x4063B220, - 0x00000002, 0x4062BE25, 0x4063B220, 0x00000002, 0x4062BE26, 0x4063B220, - 0x00000002, 0x4062BE27, 0x4063B220, 0x00000002, 0x4062BE28, 0x4063B220, - 0x00000002, 0x4062BE29, 0x4063B220, 0x00000002, 0x4062BE2A, 0x4063B220, - 0x00000002, 0x4062BE2B, 0x4063B220, 0x00000002, 0x4062BE2C, 0x4063B220, - 0x00000002, 0x4062BE21, 0x4063B820, 0x00000002, - // Block 449, offset 0x7040 - 0x4062BE22, 0x4063B820, 0x00000002, 0x4062BE23, 0x4063B820, 0x00000002, - 0x4062BE24, 0x4063B820, 0x00000002, 0x4062BE25, 0x4063B820, 0x00000002, - 0x4062BE26, 0x4063B820, 0x00000002, 0x4062BE27, 0x4063B820, 0x00000002, - 0x4062BE28, 0x4063B820, 0x00000002, 0x4062BE29, 0x4063B820, 0x00000002, - 0x4062BE2A, 0x4063B820, 0x00000002, 0x4062BE2B, 0x4063B820, 0x00000002, - 0x4062BE2C, 0x4063B820, 0x00000002, 0x4062BE2D, 0x4063B820, 0x00000002, - 0x4062BE2E, 0x4063B820, 0x00000002, 0x4062BE2F, 0x4063B820, 0x00000002, - 0x4062BE30, 0x4063B820, 0x00000002, 0x4062BE31, 0x4063B820, 0x00000002, - 0x4062BE32, 0x4063B820, 0x00000002, 0x4062BE33, 0x4063B820, 0x00000002, - 0x4062BE34, 0x4063B820, 0x00000002, 0x4062BE35, 0x4063B820, 0x00000002, - 0x4062BE36, 0x4063B820, 0x00000002, 0x4062BE37, - // Block 450, offset 0x7080 - 0x4063B820, 0x00000002, 0x4062BE38, 0x4063B820, 0x00000002, 0x4062BE39, - 0x4063B820, 0x00000002, 0x4062BE3A, 0x4063B820, 0x00000002, 0x4062BE3B, - 0x4063B820, 0x00000002, 0x4062BE3C, 0x4063B820, 0x00000002, 0x4062BE3D, - 0x4063B820, 0x00000002, 0x4062BE3E, 0x4063B820, 0x00000002, 0x4062BE3F, - 0x4063B820, 0x00000002, 0x4062BE40, 0x4063B820, 0x00000002, 0x4062BE41, - 0x4063B820, 0x00000002, 0x4062BE42, 0x4063B820, 0x00000002, 0x4062BE43, - 0x4063B820, 0x00000002, 0x4062BE44, 0x4063B820, 0x00000002, 0x4062BE45, - 0x4063B820, 0x00000002, 0x4062BE46, 0x4063B820, 0x00000002, 0x4062BE47, - 0x4063B820, 0x00000002, 0x4062BE48, 0x4063B820, 0x00000002, 0x4062BE49, - 0x4063B820, 0x00000002, 0x4062BE4A, 0x4063B820, 0x00000002, 0x4062BE4B, - 0x4063B820, 0x00000002, 0x4062BE4C, 0x4063B820, - // Block 451, offset 0x70c0 - 0x00000002, 0x4062BE4D, 0x4063B820, 0x00000002, 0x4062BE4E, 0x4063B820, - 0x00000002, 0x4062BE4F, 0x4063B820, 0x00000002, 0x4062BE50, 0x4063B820, - 0x00000002, 0x4062BE51, 0x4063B820, 0x00000002, 0x4062BE52, 0x4063B820, - 0x00000002, 0x4062BE53, 0x4063B820, 0x00000002, 0x4062BE54, 0x4063B820, - 0x00000002, 0x4062BE55, 0x4063B820, 0x00000002, 0x4062BE56, 0x4063B820, - 0x00000002, 0x4062BE57, 0x4063B820, 0x00000002, 0x4062BE58, 0x4063B820, - 0x00000002, 0x4062BE59, 0x4063B820, 0x00000002, 0x4062BE5A, 0x4063B820, - 0x00000002, 0x4062BE5B, 0x4063B820, 0x00000002, 0x4062BE5C, 0x4063B820, - 0x00000003, 0x4062BE21, 0x4063B820, 0x40646420, 0x00000003, 0x4062BE22, - 0x4063B820, 0x40646420, 0x00000003, 0x4062BE23, 0x4063B820, 0x40646420, - 0x00000003, 0x4062BE24, 0x4063B820, 0x40646420, - // Block 452, offset 0x7100 - 0x00000003, 0x4062BE25, 0x4063B820, 0x40646420, 0x00000003, 0x4062BE26, - 0x4063B820, 0x40646420, 0x00000003, 0x4062BE27, 0x4063B820, 0x40646420, - 0x00000003, 0x4062BE28, 0x4063B820, 0x40646420, 0x00000003, 0x4062BE29, - 0x4063B820, 0x40646420, 0x00000003, 0x4062BE2A, 0x4063B820, 0x40646420, - 0x00000003, 0x4062BE2B, 0x4063B820, 0x40646420, 0x00000003, 0x4062BE21, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062BE22, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062BE23, 0x4063B820, 0x40646A20, 0x00000003, 0x4062BE24, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062BE25, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062BE26, 0x4063B820, 0x40646A20, 0x00000003, 0x4062BE27, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062BE28, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062BE21, 0x4063B820, 0x40647220, - // Block 453, offset 0x7140 - 0x00000003, 0x4062BE22, 0x4063B820, 0x40647220, 0x00000003, 0x4062BE23, - 0x4063B820, 0x40647220, 0x00000003, 0x4062BE21, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062BE22, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE23, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE24, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062BE25, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE26, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE27, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062BE28, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE29, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE2A, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062BE2B, 0x4063B820, 0x40648C20, 0x00000002, 0x4062BE21, - 0x4063BC20, 0x00000002, 0x4062BE22, 0x4063BC20, 0x00000002, 0x4062BE23, - 0x4063BC20, 0x00000002, 0x4062BE24, 0x4063BC20, - // Block 454, offset 0x7180 - 0x00000002, 0x4062BE25, 0x4063BC20, 0x00000002, 0x4062BE26, 0x4063BC20, - 0x00000002, 0x4062BE27, 0x4063BC20, 0x00000002, 0x4062BE21, 0x4063BE20, - 0x00000002, 0x4062BE22, 0x4063BE20, 0x00000002, 0x4062BE21, 0x4063C220, - 0x00000002, 0x4062BE22, 0x4063C220, 0x00000002, 0x4062BE23, 0x4063C220, - 0x00000002, 0x4062BE24, 0x4063C220, 0x00000002, 0x4062BE25, 0x4063C220, - 0x00000002, 0x4062BE26, 0x4063C220, 0x00000002, 0x4062BE27, 0x4063C220, - 0x00000002, 0x4062BE28, 0x4063C220, 0x00000002, 0x4062BE29, 0x4063C220, - 0x00000002, 0x4062BE2A, 0x4063C220, 0x00000002, 0x4062BE2B, 0x4063C220, - 0x00000002, 0x4062BE2C, 0x4063C220, 0x00000002, 0x4062BE2D, 0x4063C220, - 0x00000002, 0x4062BE2E, 0x4063C220, 0x00000002, 0x4062BE2F, 0x4063C220, - 0x00000002, 0x4062BE30, 0x4063C220, 0x00000002, - // Block 455, offset 0x71c0 - 0x4062BE31, 0x4063C220, 0x00000002, 0x4062BE32, 0x4063C220, 0x00000002, - 0x4062BE33, 0x4063C220, 0x00000002, 0x4062BE34, 0x4063C220, 0x00000002, - 0x4062BE35, 0x4063C220, 0x00000002, 0x4062BE36, 0x4063C220, 0x00000002, - 0x4062BE37, 0x4063C220, 0x00000002, 0x4062BE38, 0x4063C220, 0x00000002, - 0x4062BE39, 0x4063C220, 0x00000002, 0x4062BE3A, 0x4063C220, 0x00000002, - 0x4062BE3B, 0x4063C220, 0x00000002, 0x4062BE3C, 0x4063C220, 0x00000002, - 0x4062BE3D, 0x4063C220, 0x00000002, 0x4062BE3E, 0x4063C220, 0x00000002, - 0x4062BE3F, 0x4063C220, 0x00000002, 0x4062BE40, 0x4063C220, 0x00000002, - 0x4062BE41, 0x4063C220, 0x00000002, 0x4062BE42, 0x4063C220, 0x00000002, - 0x4062BE43, 0x4063C220, 0x00000002, 0x4062BE44, 0x4063C220, 0x00000002, - 0x4062BE45, 0x4063C220, 0x00000002, 0x4062BE46, - // Block 456, offset 0x7200 - 0x4063C220, 0x00000002, 0x4062BE47, 0x4063C220, 0x00000002, 0x4062BE48, - 0x4063C220, 0x00000002, 0x4062BE49, 0x4063C220, 0x00000002, 0x4062BE4A, - 0x4063C220, 0x00000002, 0x4062BE4B, 0x4063C220, 0x00000002, 0x4062BE4C, - 0x4063C220, 0x00000002, 0x4062BE4D, 0x4063C220, 0x00000002, 0x4062BE4E, - 0x4063C220, 0x00000002, 0x4062BE4F, 0x4063C220, 0x00000002, 0x4062BE50, - 0x4063C220, 0x00000002, 0x4062BE51, 0x4063C220, 0x00000002, 0x4062BE52, - 0x4063C220, 0x00000002, 0x4062BE53, 0x4063C220, 0x00000002, 0x4062BE54, - 0x4063C220, 0x00000002, 0x4062BE55, 0x4063C220, 0x00000002, 0x4062BE56, - 0x4063C220, 0x00000002, 0x4062BE57, 0x4063C220, 0x00000002, 0x4062BE58, - 0x4063C220, 0x00000002, 0x4062BE59, 0x4063C220, 0x00000002, 0x4062BE5A, - 0x4063C220, 0x00000002, 0x4062BE5B, 0x4063C220, - // Block 457, offset 0x7240 - 0x00000002, 0x4062BE5C, 0x4063C220, 0x00000002, 0x4062BE5D, 0x4063C220, - 0x00000002, 0x4062BE5E, 0x4063C220, 0x00000002, 0x4062BE5F, 0x4063C220, - 0x00000002, 0x4062BE60, 0x4063C220, 0x00000002, 0x4062BE61, 0x4063C220, - 0x00000002, 0x4062BE62, 0x4063C220, 0x00000002, 0x4062BE63, 0x4063C220, - 0x00000002, 0x4062BE64, 0x4063C220, 0x00000002, 0x4062BE65, 0x4063C220, - 0x00000002, 0x4062BE66, 0x4063C220, 0x00000002, 0x4062BE67, 0x4063C220, - 0x00000002, 0x4062BE68, 0x4063C220, 0x00000002, 0x4062BE69, 0x4063C220, - 0x00000002, 0x4062BE6A, 0x4063C220, 0x00000002, 0x4062BE6B, 0x4063C220, - 0x00000002, 0x4062BE6C, 0x4063C220, 0x00000002, 0x4062BE6D, 0x4063C220, - 0x00000002, 0x4062BE6E, 0x4063C220, 0x00000002, 0x4062BE6F, 0x4063C220, - 0x00000002, 0x4062BE70, 0x4063C220, 0x00000002, - // Block 458, offset 0x7280 - 0x4062BE71, 0x4063C220, 0x00000002, 0x4062BE72, 0x4063C220, 0x00000003, - 0x4062BE21, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE22, 0x4063C220, - 0x40646420, 0x00000003, 0x4062BE23, 0x4063C220, 0x40646420, 0x00000003, - 0x4062BE24, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE25, 0x4063C220, - 0x40646420, 0x00000003, 0x4062BE26, 0x4063C220, 0x40646420, 0x00000003, - 0x4062BE27, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE28, 0x4063C220, - 0x40646420, 0x00000003, 0x4062BE29, 0x4063C220, 0x40646420, 0x00000003, - 0x4062BE2A, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE2B, 0x4063C220, - 0x40646420, 0x00000003, 0x4062BE2C, 0x4063C220, 0x40646420, 0x00000003, - 0x4062BE2D, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE2E, 0x4063C220, - 0x40646420, 0x00000003, 0x4062BE2F, 0x4063C220, - // Block 459, offset 0x72c0 - 0x40646420, 0x00000003, 0x4062BE30, 0x4063C220, 0x40646420, 0x00000003, - 0x4062BE31, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE32, 0x4063C220, - 0x40646420, 0x00000003, 0x4062BE33, 0x4063C220, 0x40646420, 0x00000003, - 0x4062BE21, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE22, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062BE23, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062BE24, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE25, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062BE26, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062BE27, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE28, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062BE29, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062BE2A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE2B, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062BE2C, 0x4063C220, - // Block 460, offset 0x7300 - 0x40646A20, 0x00000003, 0x4062BE2D, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062BE2E, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE2F, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062BE30, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062BE31, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE32, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062BE33, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062BE34, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE35, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062BE36, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062BE37, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE38, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062BE39, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062BE3A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE3B, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062BE3C, 0x4063C220, - // Block 461, offset 0x7340 - 0x40646A20, 0x00000003, 0x4062BE3D, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062BE3E, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE3F, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062BE40, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062BE41, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE42, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062BE43, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062BE44, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE21, 0x4063C220, - 0x40647220, 0x00000003, 0x4062BE22, 0x4063C220, 0x40647220, 0x00000003, - 0x4062BE23, 0x4063C220, 0x40647220, 0x00000003, 0x4062BE24, 0x4063C220, - 0x40647220, 0x00000003, 0x4062BE25, 0x4063C220, 0x40647220, 0x00000003, - 0x4062BE21, 0x4063C220, 0x40648C20, 0x00000003, 0x4062BE22, 0x4063C220, - 0x40648C20, 0x00000003, 0x4062BE23, 0x4063C220, - // Block 462, offset 0x7380 - 0x40648C20, 0x00000003, 0x4062BE24, 0x4063C220, 0x40648C20, 0x00000002, - 0x4062BE21, 0x4063C820, 0x00000002, 0x4062BE22, 0x4063C820, 0x00000002, - 0x4062BE23, 0x4063C820, 0x00000003, 0x4062BE21, 0x4063CC20, 0x40647220, - 0x00000003, 0x4062BE22, 0x4063CC20, 0x40647220, 0x00000003, 0x4062BE23, - 0x4063CC20, 0x40647220, 0x00000003, 0x4062BE24, 0x4063CC20, 0x40647220, - 0x00000003, 0x4062BE21, 0x4063CC20, 0x40648420, 0x00000003, 0x4062BE22, - 0x4063CC20, 0x40648420, 0x00000003, 0x4062BE23, 0x4063CC20, 0x40648420, - 0x00000003, 0x4062BE24, 0x4063CC20, 0x40648420, 0x00000003, 0x4062BE25, - 0x4063CC20, 0x40648420, 0x00000003, 0x4062BE26, 0x4063CC20, 0x40648420, - 0x00000003, 0x4062BE27, 0x4063CC20, 0x40648420, 0x00000003, 0x4062BE28, - 0x4063CC20, 0x40648420, 0x00000003, 0x4062BE21, - // Block 463, offset 0x73c0 - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE22, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062BE23, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE24, - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE25, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062BE26, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE27, - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE28, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062BE29, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE2A, - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE2B, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062BE2C, 0x4063CC20, 0x40648C20, 0x00000002, 0x4062BE21, - 0x4063D020, 0x00000002, 0x4062BE22, 0x4063D020, 0x00000002, 0x4062BE23, - 0x4063D020, 0x00000002, 0x4062BE24, 0x4063D020, 0x00000002, 0x4062BE25, - 0x4063D020, 0x00000002, 0x4062BE26, 0x4063D020, - // Block 464, offset 0x7400 - 0x00000002, 0x4062BE27, 0x4063D020, 0x00000002, 0x4062BE28, 0x4063D020, - 0x00000002, 0x4062BE29, 0x4063D020, 0x00000002, 0x4062BE2A, 0x4063D020, - 0x00000002, 0x4062BE2B, 0x4063D020, 0x00000002, 0x4062BE2C, 0x4063D020, - 0x00000002, 0x4062BE2D, 0x4063D020, 0x00000002, 0x4062BE2E, 0x4063D020, - 0x00000002, 0x4062BE2F, 0x4063D020, 0x00000002, 0x4062BE30, 0x4063D020, - 0x00000002, 0x4062BE31, 0x4063D020, 0x00000002, 0x4062BE32, 0x4063D020, - 0x00000002, 0x4062BE33, 0x4063D020, 0x00000002, 0x4062BE34, 0x4063D020, - 0x00000002, 0x4062BE35, 0x4063D020, 0x00000002, 0x4062BE36, 0x4063D020, - 0x00000002, 0x4062BE37, 0x4063D020, 0x00000002, 0x4062BE38, 0x4063D020, - 0x00000002, 0x4062BE39, 0x4063D020, 0x00000002, 0x4062BE3A, 0x4063D020, - 0x00000002, 0x4062BE3B, 0x4063D020, 0x00000002, - // Block 465, offset 0x7440 - 0x4062BE3C, 0x4063D020, 0x00000002, 0x4062BE3D, 0x4063D020, 0x00000002, - 0x4062BE3E, 0x4063D020, 0x00000002, 0x4062BE3F, 0x4063D020, 0x00000002, - 0x4062BE40, 0x4063D020, 0x00000002, 0x4062BE41, 0x4063D020, 0x00000002, - 0x4062BE42, 0x4063D020, 0x00000002, 0x4062BE43, 0x4063D020, 0x00000002, - 0x4062BE44, 0x4063D020, 0x00000002, 0x4062BE45, 0x4063D020, 0x00000002, - 0x4062BE46, 0x4063D020, 0x00000002, 0x4062BE47, 0x4063D020, 0x00000002, - 0x4062BE48, 0x4063D020, 0x00000002, 0x4062BE49, 0x4063D020, 0x00000002, - 0x4062BE4A, 0x4063D020, 0x00000002, 0x4062BE4B, 0x4063D020, 0x00000002, - 0x4062BE4C, 0x4063D020, 0x00000002, 0x4062BE4D, 0x4063D020, 0x00000003, - 0x4062BE21, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE22, 0x4063D020, - 0x40646420, 0x00000003, 0x4062BE23, 0x4063D020, - // Block 466, offset 0x7480 - 0x40646420, 0x00000003, 0x4062BE24, 0x4063D020, 0x40646420, 0x00000003, - 0x4062BE25, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE26, 0x4063D020, - 0x40646420, 0x00000003, 0x4062BE27, 0x4063D020, 0x40646420, 0x00000003, - 0x4062BE28, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE29, 0x4063D020, - 0x40646420, 0x00000003, 0x4062BE2A, 0x4063D020, 0x40646420, 0x00000003, - 0x4062BE2B, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE2C, 0x4063D020, - 0x40646420, 0x00000003, 0x4062BE2D, 0x4063D020, 0x40646420, 0x00000003, - 0x4062BE2E, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE2F, 0x4063D020, - 0x40646420, 0x00000003, 0x4062BE30, 0x4063D020, 0x40646420, 0x00000003, - 0x4062BE31, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE32, 0x4063D020, - 0x40646420, 0x00000003, 0x4062BE21, 0x4063D020, - // Block 467, offset 0x74c0 - 0x40646A20, 0x00000003, 0x4062BE22, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BE23, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE24, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BE25, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BE26, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE27, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BE28, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BE29, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE2A, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BE2B, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BE2C, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE2D, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BE2E, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BE2F, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE30, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BE31, 0x4063D020, - // Block 468, offset 0x7500 - 0x40646A20, 0x00000003, 0x4062BE32, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BE33, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE34, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BE35, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BE36, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE37, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BE38, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BE39, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE3A, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BE3B, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BE3C, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE3D, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BE3E, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062BE3F, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE40, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062BE41, 0x4063D020, - // Block 469, offset 0x7540 - 0x40646A20, 0x00000003, 0x4062BE21, 0x4063D020, 0x40647220, 0x00000003, - 0x4062BE22, 0x4063D020, 0x40647220, 0x00000003, 0x4062BE23, 0x4063D020, - 0x40647220, 0x00000003, 0x4062BE24, 0x4063D020, 0x40647220, 0x00000003, - 0x4062BE25, 0x4063D020, 0x40647220, 0x00000003, 0x4062BE26, 0x4063D020, - 0x40647220, 0x00000003, 0x4062BE21, 0x4063D020, 0x40648220, 0x00000003, - 0x4062BE22, 0x4063D020, 0x40648220, 0x00000003, 0x4062BE23, 0x4063D020, - 0x40648220, 0x00000003, 0x4062BE24, 0x4063D020, 0x40648220, 0x00000003, - 0x4062BE25, 0x4063D020, 0x40648220, 0x00000003, 0x4062BE26, 0x4063D020, - 0x40648220, 0x00000003, 0x4062BE27, 0x4063D020, 0x40648220, 0x00000003, - 0x4062BE28, 0x4063D020, 0x40648220, 0x00000003, 0x4062BE29, 0x4063D020, - 0x40648220, 0x00000003, 0x4062BE2A, 0x4063D020, - // Block 470, offset 0x7580 - 0x40648220, 0x00000003, 0x4062BE2B, 0x4063D020, 0x40648220, 0x00000003, - 0x4062BE2C, 0x4063D020, 0x40648220, 0x00000003, 0x4062BE2D, 0x4063D020, - 0x40648220, 0x00000003, 0x4062BE2E, 0x4063D020, 0x40648220, 0x00000003, - 0x4062BE2F, 0x4063D020, 0x40648220, 0x00000003, 0x4062BE21, 0x4063D020, - 0x40648420, 0x00000003, 0x4062BE22, 0x4063D020, 0x40648420, 0x00000003, - 0x4062BE23, 0x4063D020, 0x40648420, 0x00000003, 0x4062C021, 0x4063A820, - 0x40648C20, 0x00000002, 0x4062C021, 0x4063D020, 0x00000002, 0x4062C221, - 0x4063A820, 0x00000002, 0x4062C222, 0x4063A820, 0x00000002, 0x4062C223, - 0x4063A820, 0x00000002, 0x4062C224, 0x4063A820, 0x00000002, 0x4062C225, - 0x4063A820, 0x00000002, 0x4062C226, 0x4063A820, 0x00000002, 0x4062C227, - 0x4063A820, 0x00000002, 0x4062C228, 0x4063A820, - // Block 471, offset 0x75c0 - 0x00000002, 0x4062C229, 0x4063A820, 0x00000002, 0x4062C22A, 0x4063A820, - 0x00000002, 0x4062C22B, 0x4063A820, 0x00000002, 0x4062C22C, 0x4063A820, - 0x00000002, 0x4062C22D, 0x4063A820, 0x00000002, 0x4062C22E, 0x4063A820, - 0x00000002, 0x4062C22F, 0x4063A820, 0x00000002, 0x4062C230, 0x4063A820, - 0x00000002, 0x4062C231, 0x4063A820, 0x00000002, 0x4062C232, 0x4063A820, - 0x00000002, 0x4062C233, 0x4063A820, 0x00000002, 0x4062C234, 0x4063A820, - 0x00000002, 0x4062C235, 0x4063A820, 0x00000002, 0x4062C236, 0x4063A820, - 0x00000002, 0x4062C237, 0x4063A820, 0x00000002, 0x4062C238, 0x4063A820, - 0x00000002, 0x4062C239, 0x4063A820, 0x00000002, 0x4062C23A, 0x4063A820, - 0x00000002, 0x4062C23B, 0x4063A820, 0x00000002, 0x4062C23C, 0x4063A820, - 0x00000002, 0x4062C23D, 0x4063A820, 0x00000003, - // Block 472, offset 0x7600 - 0x4062C221, 0x4063A820, 0x40646420, 0x00000003, 0x4062C222, 0x4063A820, - 0x40646420, 0x00000003, 0x4062C223, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C224, 0x4063A820, 0x40646420, 0x00000003, 0x4062C225, 0x4063A820, - 0x40646420, 0x00000003, 0x4062C226, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C227, 0x4063A820, 0x40646420, 0x00000003, 0x4062C228, 0x4063A820, - 0x40646420, 0x00000003, 0x4062C229, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C22A, 0x4063A820, 0x40646420, 0x00000003, 0x4062C22B, 0x4063A820, - 0x40646420, 0x00000003, 0x4062C22C, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C22D, 0x4063A820, 0x40646420, 0x00000003, 0x4062C22E, 0x4063A820, - 0x40646420, 0x00000003, 0x4062C22F, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C230, 0x4063A820, 0x40646420, 0x00000003, - // Block 473, offset 0x7640 - 0x4062C231, 0x4063A820, 0x40646420, 0x00000003, 0x4062C232, 0x4063A820, - 0x40646420, 0x00000003, 0x4062C233, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C234, 0x4063A820, 0x40646420, 0x00000003, 0x4062C235, 0x4063A820, - 0x40646420, 0x00000003, 0x4062C236, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C237, 0x4063A820, 0x40646420, 0x00000003, 0x4062C238, 0x4063A820, - 0x40646420, 0x00000003, 0x4062C239, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C221, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C222, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062C223, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062C224, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C225, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062C226, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062C227, 0x4063A820, 0x40646A20, 0x00000003, - // Block 474, offset 0x7680 - 0x4062C228, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C229, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062C22A, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062C22B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C22C, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062C22D, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062C22E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C221, 0x4063A820, - 0x40647220, 0x00000003, 0x4062C222, 0x4063A820, 0x40647220, 0x00000003, - 0x4062C223, 0x4063A820, 0x40647220, 0x00000003, 0x4062C224, 0x4063A820, - 0x40647220, 0x00000003, 0x4062C225, 0x4063A820, 0x40647220, 0x00000003, - 0x4062C226, 0x4063A820, 0x40647220, 0x00000003, 0x4062C227, 0x4063A820, - 0x40647220, 0x00000003, 0x4062C228, 0x4063A820, 0x40647220, 0x00000003, - 0x4062C229, 0x4063A820, 0x40647220, 0x00000003, - // Block 475, offset 0x76c0 - 0x4062C22A, 0x4063A820, 0x40647220, 0x00000003, 0x4062C22B, 0x4063A820, - 0x40647220, 0x00000003, 0x4062C22C, 0x4063A820, 0x40647220, 0x00000003, - 0x4062C221, 0x4063A820, 0x40648220, 0x00000003, 0x4062C222, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C223, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C224, 0x4063A820, 0x40648220, 0x00000003, 0x4062C225, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C226, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C227, 0x4063A820, 0x40648220, 0x00000003, 0x4062C228, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C229, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C22A, 0x4063A820, 0x40648220, 0x00000003, 0x4062C22B, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C22C, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C22D, 0x4063A820, 0x40648220, 0x00000003, - // Block 476, offset 0x7700 - 0x4062C22E, 0x4063A820, 0x40648220, 0x00000003, 0x4062C22F, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C230, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C231, 0x4063A820, 0x40648220, 0x00000003, 0x4062C232, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C233, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C221, 0x4063A820, 0x40648420, 0x00000003, 0x4062C222, 0x4063A820, - 0x40648420, 0x00000003, 0x4062C223, 0x4063A820, 0x40648420, 0x00000003, - 0x4062C224, 0x4063A820, 0x40648420, 0x00000003, 0x4062C221, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C222, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C223, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C224, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C225, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C226, 0x4063A820, 0x40648C20, 0x00000003, - // Block 477, offset 0x7740 - 0x4062C227, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C228, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C229, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C22A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C22B, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C22C, 0x4063A820, 0x40648C20, 0x00000002, - 0x4062C221, 0x4063AA20, 0x00000002, 0x4062C222, 0x4063AA20, 0x00000002, - 0x4062C223, 0x4063AA20, 0x00000002, 0x4062C224, 0x4063AA20, 0x00000002, - 0x4062C225, 0x4063AA20, 0x00000002, 0x4062C226, 0x4063AA20, 0x00000002, - 0x4062C227, 0x4063AA20, 0x00000002, 0x4062C228, 0x4063AA20, 0x00000002, - 0x4062C229, 0x4063AA20, 0x00000002, 0x4062C22A, 0x4063AA20, 0x00000002, - 0x4062C22B, 0x4063AA20, 0x00000002, 0x4062C22C, 0x4063AA20, 0x00000002, - 0x4062C22D, 0x4063AA20, 0x00000002, 0x4062C22E, - // Block 478, offset 0x7780 - 0x4063AA20, 0x00000002, 0x4062C22F, 0x4063AA20, 0x00000002, 0x4062C230, - 0x4063AA20, 0x00000002, 0x4062C231, 0x4063AA20, 0x00000002, 0x4062C232, - 0x4063AA20, 0x00000002, 0x4062C233, 0x4063AA20, 0x00000002, 0x4062C234, - 0x4063AA20, 0x00000002, 0x4062C235, 0x4063AA20, 0x00000002, 0x4062C236, - 0x4063AA20, 0x00000002, 0x4062C237, 0x4063AA20, 0x00000002, 0x4062C238, - 0x4063AA20, 0x00000002, 0x4062C239, 0x4063AA20, 0x00000002, 0x4062C23A, - 0x4063AA20, 0x00000002, 0x4062C23B, 0x4063AA20, 0x00000002, 0x4062C23C, - 0x4063AA20, 0x00000002, 0x4062C23D, 0x4063AA20, 0x00000002, 0x4062C23E, - 0x4063AA20, 0x00000002, 0x4062C23F, 0x4063AA20, 0x00000003, 0x4062C221, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062C222, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062C223, 0x4063AA20, 0x40646420, - // Block 479, offset 0x77c0 - 0x00000003, 0x4062C224, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C225, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062C226, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062C227, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C228, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062C229, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062C22A, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C22B, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062C221, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062C222, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C223, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C224, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062C225, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C226, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C227, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062C228, 0x4063AA20, 0x40648C20, - // Block 480, offset 0x7800 - 0x00000002, 0x4062C221, 0x4063AC20, 0x00000002, 0x4062C222, 0x4063AC20, - 0x00000002, 0x4062C223, 0x4063AC20, 0x00000002, 0x4062C224, 0x4063AC20, - 0x00000002, 0x4062C225, 0x4063AC20, 0x00000002, 0x4062C226, 0x4063AC20, - 0x00000002, 0x4062C227, 0x4063AC20, 0x00000002, 0x4062C228, 0x4063AC20, - 0x00000002, 0x4062C229, 0x4063AC20, 0x00000002, 0x4062C22A, 0x4063AC20, - 0x00000002, 0x4062C22B, 0x4063AC20, 0x00000003, 0x4062C221, 0x4063AC20, - 0x40646420, 0x00000003, 0x4062C222, 0x4063AC20, 0x40646420, 0x00000003, - 0x4062C223, 0x4063AC20, 0x40646420, 0x00000003, 0x4062C224, 0x4063AC20, - 0x40646420, 0x00000003, 0x4062C225, 0x4063AC20, 0x40646420, 0x00000003, - 0x4062C226, 0x4063AC20, 0x40646420, 0x00000003, 0x4062C227, 0x4063AC20, - 0x40646420, 0x00000003, 0x4062C228, 0x4063AC20, - // Block 481, offset 0x7840 - 0x40646420, 0x00000003, 0x4062C229, 0x4063AC20, 0x40646420, 0x00000003, - 0x4062C22A, 0x4063AC20, 0x40646420, 0x00000003, 0x4062C22B, 0x4063AC20, - 0x40646420, 0x00000003, 0x4062C22C, 0x4063AC20, 0x40646420, 0x00000003, - 0x4062C22D, 0x4063AC20, 0x40646420, 0x00000003, 0x4062C22E, 0x4063AC20, - 0x40646420, 0x00000003, 0x4062C22F, 0x4063AC20, 0x40646420, 0x00000003, - 0x4062C221, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C222, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062C223, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062C224, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C225, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062C226, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062C227, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C228, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062C229, 0x4063AC20, - // Block 482, offset 0x7880 - 0x40648C20, 0x00000003, 0x4062C22A, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062C22B, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C22C, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062C22D, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062C22E, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C22F, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062C230, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062C231, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C232, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062C233, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062C234, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C235, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062C236, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062C237, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C238, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062C239, 0x4063AC20, - // Block 483, offset 0x78c0 - 0x40648C20, 0x00000003, 0x4062C23A, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062C23B, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C23C, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062C23D, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062C23E, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C23F, 0x4063AC20, - 0x40648C20, 0x00000003, 0x4062C240, 0x4063AC20, 0x40648C20, 0x00000003, - 0x4062C241, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C242, 0x4063AC20, - 0x40648C20, 0x00000002, 0x4062C221, 0x4063B020, 0x00000002, 0x4062C222, - 0x4063B020, 0x00000002, 0x4062C223, 0x4063B020, 0x00000002, 0x4062C224, - 0x4063B020, 0x00000002, 0x4062C225, 0x4063B020, 0x00000002, 0x4062C226, - 0x4063B020, 0x00000002, 0x4062C227, 0x4063B020, 0x00000002, 0x4062C228, - 0x4063B020, 0x00000002, 0x4062C229, 0x4063B020, - // Block 484, offset 0x7900 - 0x00000002, 0x4062C22A, 0x4063B020, 0x00000002, 0x4062C22B, 0x4063B020, - 0x00000002, 0x4062C22C, 0x4063B020, 0x00000002, 0x4062C22D, 0x4063B020, - 0x00000002, 0x4062C22E, 0x4063B020, 0x00000003, 0x4062C221, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C222, 0x4063B020, 0x40646420, 0x00000003, - 0x4062C223, 0x4063B020, 0x40646420, 0x00000003, 0x4062C224, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C225, 0x4063B020, 0x40646420, 0x00000003, - 0x4062C226, 0x4063B020, 0x40646420, 0x00000003, 0x4062C221, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C222, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C223, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C224, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C225, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C226, 0x4063B020, 0x40646A20, 0x00000003, - // Block 485, offset 0x7940 - 0x4062C227, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C228, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C229, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C22A, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C22B, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C22C, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C22D, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C221, 0x4063B020, - 0x40647220, 0x00000003, 0x4062C222, 0x4063B020, 0x40647220, 0x00000003, - 0x4062C223, 0x4063B020, 0x40647220, 0x00000003, 0x4062C221, 0x4063B020, - 0x40648220, 0x00000003, 0x4062C222, 0x4063B020, 0x40648220, 0x00000003, - 0x4062C223, 0x4063B020, 0x40648220, 0x00000003, 0x4062C224, 0x4063B020, - 0x40648220, 0x00000003, 0x4062C225, 0x4063B020, 0x40648220, 0x00000003, - 0x4062C226, 0x4063B020, 0x40648220, 0x00000003, - // Block 486, offset 0x7980 - 0x4062C227, 0x4063B020, 0x40648220, 0x00000003, 0x4062C228, 0x4063B020, - 0x40648220, 0x00000003, 0x4062C229, 0x4063B020, 0x40648220, 0x00000003, - 0x4062C22A, 0x4063B020, 0x40648220, 0x00000003, 0x4062C22B, 0x4063B020, - 0x40648220, 0x00000003, 0x4062C22C, 0x4063B020, 0x40648220, 0x00000003, - 0x4062C221, 0x4063B020, 0x40648420, 0x00000003, 0x4062C222, 0x4063B020, - 0x40648420, 0x00000003, 0x4062C223, 0x4063B020, 0x40648420, 0x00000003, - 0x4062C224, 0x4063B020, 0x40648420, 0x00000002, 0x4062C221, 0x4063B220, - 0x00000002, 0x4062C222, 0x4063B220, 0x00000003, 0x4062C221, 0x4063B220, - 0x40646A20, 0x00000002, 0x4062C221, 0x4063B420, 0x00000002, 0x4062C222, - 0x4063B420, 0x00000002, 0x4062C223, 0x4063B420, 0x00000002, 0x4062C224, - 0x4063B420, 0x00000002, 0x4062C225, 0x4063B420, - // Block 487, offset 0x79c0 - 0x00000002, 0x4062C226, 0x4063B420, 0x00000002, 0x4062C227, 0x4063B420, - 0x00000002, 0x4062C228, 0x4063B420, 0x00000002, 0x4062C229, 0x4063B420, - 0x00000002, 0x4062C22A, 0x4063B420, 0x00000002, 0x4062C22B, 0x4063B420, - 0x00000002, 0x4062C22C, 0x4063B420, 0x00000002, 0x4062C22D, 0x4063B420, - 0x00000002, 0x4062C22E, 0x4063B420, 0x00000003, 0x4062C221, 0x4063B420, - 0x40646420, 0x00000003, 0x4062C222, 0x4063B420, 0x40646420, 0x00000003, - 0x4062C223, 0x4063B420, 0x40646420, 0x00000003, 0x4062C224, 0x4063B420, - 0x40646420, 0x00000003, 0x4062C225, 0x4063B420, 0x40646420, 0x00000003, - 0x4062C226, 0x4063B420, 0x40646420, 0x00000003, 0x4062C227, 0x4063B420, - 0x40646420, 0x00000003, 0x4062C228, 0x4063B420, 0x40646420, 0x00000003, - 0x4062C229, 0x4063B420, 0x40646420, 0x00000003, - // Block 488, offset 0x7a00 - 0x4062C22A, 0x4063B420, 0x40646420, 0x00000003, 0x4062C22B, 0x4063B420, - 0x40646420, 0x00000003, 0x4062C22C, 0x4063B420, 0x40646420, 0x00000003, - 0x4062C22D, 0x4063B420, 0x40646420, 0x00000003, 0x4062C221, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C222, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C223, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C224, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C225, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C226, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C227, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C228, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C229, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C22A, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C22B, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C22C, 0x4063B420, 0x40646A20, 0x00000003, - // Block 489, offset 0x7a40 - 0x4062C22D, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C22E, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C22F, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C230, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C231, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C232, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C233, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C234, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C235, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C236, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C237, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C238, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C239, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C23A, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C23B, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C23C, 0x4063B420, 0x40646A20, 0x00000003, - // Block 490, offset 0x7a80 - 0x4062C23D, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C23E, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C23F, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C240, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C241, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C242, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C243, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C244, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C245, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C246, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C247, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C248, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C249, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C24A, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062C24B, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062C24C, 0x4063B420, 0x40646A20, 0x00000003, - // Block 491, offset 0x7ac0 - 0x4062C221, 0x4063B420, 0x40647220, 0x00000003, 0x4062C222, 0x4063B420, - 0x40647220, 0x00000003, 0x4062C223, 0x4063B420, 0x40647220, 0x00000003, - 0x4062C224, 0x4063B420, 0x40647220, 0x00000003, 0x4062C225, 0x4063B420, - 0x40647220, 0x00000003, 0x4062C221, 0x4063B420, 0x40648220, 0x00000003, - 0x4062C222, 0x4063B420, 0x40648220, 0x00000003, 0x4062C223, 0x4063B420, - 0x40648220, 0x00000003, 0x4062C224, 0x4063B420, 0x40648220, 0x00000003, - 0x4062C225, 0x4063B420, 0x40648220, 0x00000003, 0x4062C226, 0x4063B420, - 0x40648220, 0x00000003, 0x4062C227, 0x4063B420, 0x40648220, 0x00000003, - 0x4062C228, 0x4063B420, 0x40648220, 0x00000003, 0x4062C229, 0x4063B420, - 0x40648220, 0x00000003, 0x4062C22A, 0x4063B420, 0x40648220, 0x00000003, - 0x4062C22B, 0x4063B420, 0x40648220, 0x00000003, - // Block 492, offset 0x7b00 - 0x4062C22C, 0x4063B420, 0x40648220, 0x00000003, 0x4062C22D, 0x4063B420, - 0x40648220, 0x00000003, 0x4062C22E, 0x4063B420, 0x40648220, 0x00000003, - 0x4062C22F, 0x4063B420, 0x40648220, 0x00000003, 0x4062C230, 0x4063B420, - 0x40648220, 0x00000003, 0x4062C231, 0x4063B420, 0x40648220, 0x00000003, - 0x4062C232, 0x4063B420, 0x40648220, 0x00000003, 0x4062C233, 0x4063B420, - 0x40648220, 0x00000003, 0x4062C234, 0x4063B420, 0x40648220, 0x00000003, - 0x4062C235, 0x4063B420, 0x40648220, 0x00000003, 0x4062C236, 0x4063B420, - 0x40648220, 0x00000003, 0x4062C221, 0x4063B420, 0x40648420, 0x00000003, - 0x4062C222, 0x4063B420, 0x40648420, 0x00000003, 0x4062C223, 0x4063B420, - 0x40648420, 0x00000003, 0x4062C224, 0x4063B420, 0x40648420, 0x00000003, - 0x4062C225, 0x4063B420, 0x40648420, 0x00000003, - // Block 493, offset 0x7b40 - 0x4062C226, 0x4063B420, 0x40648420, 0x00000003, 0x4062C227, 0x4063B420, - 0x40648420, 0x00000003, 0x4062C221, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C222, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C223, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C224, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C225, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C226, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C227, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C228, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C229, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C22A, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C22B, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C22C, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C22D, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C22E, 0x4063B420, 0x40648C20, 0x00000003, - // Block 494, offset 0x7b80 - 0x4062C22F, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C230, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C231, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C232, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C233, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C234, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C235, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C236, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C237, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C238, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C239, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C23A, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C23B, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C23C, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C23D, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C23E, 0x4063B420, 0x40648C20, 0x00000003, - // Block 495, offset 0x7bc0 - 0x4062C23F, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C240, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C241, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C242, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C243, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C244, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062C245, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C246, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062C247, 0x4063B420, 0x40648C20, 0x00000002, - 0x4062C221, 0x4063B620, 0x00000002, 0x4062C222, 0x4063B620, 0x00000002, - 0x4062C223, 0x4063B620, 0x00000002, 0x4062C224, 0x4063B620, 0x00000002, - 0x4062C225, 0x4063B620, 0x00000002, 0x4062C226, 0x4063B620, 0x00000002, - 0x4062C227, 0x4063B620, 0x00000002, 0x4062C228, 0x4063B620, 0x00000002, - 0x4062C229, 0x4063B620, 0x00000002, 0x4062C22A, - // Block 496, offset 0x7c00 - 0x4063B620, 0x00000002, 0x4062C22B, 0x4063B620, 0x00000002, 0x4062C22C, - 0x4063B620, 0x00000002, 0x4062C22D, 0x4063B620, 0x00000002, 0x4062C22E, - 0x4063B620, 0x00000002, 0x4062C22F, 0x4063B620, 0x00000002, 0x4062C230, - 0x4063B620, 0x00000002, 0x4062C231, 0x4063B620, 0x00000002, 0x4062C232, - 0x4063B620, 0x00000002, 0x4062C233, 0x4063B620, 0x00000002, 0x4062C234, - 0x4063B620, 0x00000002, 0x4062C235, 0x4063B620, 0x00000002, 0x4062C236, - 0x4063B620, 0x00000002, 0x4062C237, 0x4063B620, 0x00000002, 0x4062C238, - 0x4063B620, 0x00000002, 0x4062C239, 0x4063B620, 0x00000002, 0x4062C23A, - 0x4063B620, 0x00000002, 0x4062C23B, 0x4063B620, 0x00000002, 0x4062C23C, - 0x4063B620, 0x00000002, 0x4062C23D, 0x4063B620, 0x00000002, 0x4062C23E, - 0x4063B620, 0x00000002, 0x4062C23F, 0x4063B620, - // Block 497, offset 0x7c40 - 0x00000002, 0x4062C240, 0x4063B620, 0x00000002, 0x4062C241, 0x4063B620, - 0x00000002, 0x4062C242, 0x4063B620, 0x00000002, 0x4062C243, 0x4063B620, - 0x00000002, 0x4062C244, 0x4063B620, 0x00000002, 0x4062C245, 0x4063B620, - 0x00000002, 0x4062C246, 0x4063B620, 0x00000002, 0x4062C247, 0x4063B620, - 0x00000002, 0x4062C221, 0x4063B820, 0x00000002, 0x4062C222, 0x4063B820, - 0x00000002, 0x4062C223, 0x4063B820, 0x00000002, 0x4062C224, 0x4063B820, - 0x00000002, 0x4062C225, 0x4063B820, 0x00000002, 0x4062C226, 0x4063B820, - 0x00000002, 0x4062C227, 0x4063B820, 0x00000002, 0x4062C228, 0x4063B820, - 0x00000002, 0x4062C229, 0x4063B820, 0x00000002, 0x4062C22A, 0x4063B820, - 0x00000002, 0x4062C22B, 0x4063B820, 0x00000002, 0x4062C22C, 0x4063B820, - 0x00000002, 0x4062C22D, 0x4063B820, 0x00000002, - // Block 498, offset 0x7c80 - 0x4062C22E, 0x4063B820, 0x00000002, 0x4062C22F, 0x4063B820, 0x00000002, - 0x4062C230, 0x4063B820, 0x00000002, 0x4062C231, 0x4063B820, 0x00000002, - 0x4062C232, 0x4063B820, 0x00000002, 0x4062C233, 0x4063B820, 0x00000002, - 0x4062C234, 0x4063B820, 0x00000002, 0x4062C235, 0x4063B820, 0x00000002, - 0x4062C236, 0x4063B820, 0x00000002, 0x4062C237, 0x4063B820, 0x00000002, - 0x4062C238, 0x4063B820, 0x00000002, 0x4062C239, 0x4063B820, 0x00000002, - 0x4062C23A, 0x4063B820, 0x00000002, 0x4062C23B, 0x4063B820, 0x00000002, - 0x4062C23C, 0x4063B820, 0x00000002, 0x4062C23D, 0x4063B820, 0x00000002, - 0x4062C23E, 0x4063B820, 0x00000002, 0x4062C23F, 0x4063B820, 0x00000002, - 0x4062C240, 0x4063B820, 0x00000002, 0x4062C241, 0x4063B820, 0x00000002, - 0x4062C242, 0x4063B820, 0x00000002, 0x4062C243, - // Block 499, offset 0x7cc0 - 0x4063B820, 0x00000002, 0x4062C244, 0x4063B820, 0x00000002, 0x4062C245, - 0x4063B820, 0x00000002, 0x4062C246, 0x4063B820, 0x00000002, 0x4062C247, - 0x4063B820, 0x00000002, 0x4062C248, 0x4063B820, 0x00000002, 0x4062C249, - 0x4063B820, 0x00000002, 0x4062C24A, 0x4063B820, 0x00000002, 0x4062C24B, - 0x4063B820, 0x00000002, 0x4062C24C, 0x4063B820, 0x00000002, 0x4062C24D, - 0x4063B820, 0x00000002, 0x4062C24E, 0x4063B820, 0x00000002, 0x4062C24F, - 0x4063B820, 0x00000002, 0x4062C250, 0x4063B820, 0x00000002, 0x4062C251, - 0x4063B820, 0x00000002, 0x4062C252, 0x4063B820, 0x00000002, 0x4062C253, - 0x4063B820, 0x00000002, 0x4062C254, 0x4063B820, 0x00000002, 0x4062C255, - 0x4063B820, 0x00000002, 0x4062C256, 0x4063B820, 0x00000003, 0x4062C221, - 0x4063B820, 0x40646420, 0x00000003, 0x4062C222, - // Block 500, offset 0x7d00 - 0x4063B820, 0x40646420, 0x00000003, 0x4062C223, 0x4063B820, 0x40646420, - 0x00000003, 0x4062C224, 0x4063B820, 0x40646420, 0x00000003, 0x4062C225, - 0x4063B820, 0x40646420, 0x00000003, 0x4062C221, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062C222, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C223, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062C224, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062C225, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C226, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062C227, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062C228, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C229, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062C22A, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062C22B, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C22C, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062C22D, - // Block 501, offset 0x7d40 - 0x4063B820, 0x40646A20, 0x00000003, 0x4062C22E, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062C22F, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C230, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062C231, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062C221, 0x4063B820, 0x40647220, 0x00000003, 0x4062C222, - 0x4063B820, 0x40647220, 0x00000003, 0x4062C223, 0x4063B820, 0x40647220, - 0x00000003, 0x4062C221, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C222, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062C223, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062C224, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C225, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062C226, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062C227, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C228, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062C229, - // Block 502, offset 0x7d80 - 0x4063B820, 0x40648C20, 0x00000003, 0x4062C22A, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062C22B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C22C, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062C22D, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062C22E, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C22F, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062C230, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062C231, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C232, - 0x4063B820, 0x40648C20, 0x00000002, 0x4062C221, 0x4063BA20, 0x00000002, - 0x4062C222, 0x4063BA20, 0x00000002, 0x4062C223, 0x4063BA20, 0x00000002, - 0x4062C224, 0x4063BA20, 0x00000002, 0x4062C225, 0x4063BA20, 0x00000002, - 0x4062C226, 0x4063BA20, 0x00000002, 0x4062C227, 0x4063BA20, 0x00000002, - 0x4062C228, 0x4063BA20, 0x00000002, 0x4062C229, - // Block 503, offset 0x7dc0 - 0x4063BA20, 0x00000002, 0x4062C22A, 0x4063BA20, 0x00000002, 0x4062C22B, - 0x4063BA20, 0x00000002, 0x4062C22C, 0x4063BA20, 0x00000002, 0x4062C22D, - 0x4063BA20, 0x00000002, 0x4062C22E, 0x4063BA20, 0x00000002, 0x4062C22F, - 0x4063BA20, 0x00000002, 0x4062C230, 0x4063BA20, 0x00000002, 0x4062C231, - 0x4063BA20, 0x00000003, 0x4062C221, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062C222, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C223, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062C224, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062C225, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C226, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062C227, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062C228, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C229, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062C22A, 0x4063BA20, - // Block 504, offset 0x7e00 - 0x40646A20, 0x00000003, 0x4062C22B, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062C22C, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C22D, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062C22E, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062C22F, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C230, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062C231, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062C232, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C233, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062C234, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062C235, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C236, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062C237, 0x4063BA20, 0x40646A20, 0x00000003, - 0x4062C238, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C239, 0x4063BA20, - 0x40646A20, 0x00000003, 0x4062C23A, 0x4063BA20, - // Block 505, offset 0x7e40 - 0x40646A20, 0x00000003, 0x4062C221, 0x4063BA20, 0x40647220, 0x00000003, - 0x4062C221, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062C222, 0x4063BA20, - 0x40648C20, 0x00000003, 0x4062C223, 0x4063BA20, 0x40648C20, 0x00000003, - 0x4062C224, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062C225, 0x4063BA20, - 0x40648C20, 0x00000003, 0x4062C226, 0x4063BA20, 0x40648C20, 0x00000003, - 0x4062C227, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062C228, 0x4063BA20, - 0x40648C20, 0x00000002, 0x4062C221, 0x4063BC20, 0x00000002, 0x4062C222, - 0x4063BC20, 0x00000002, 0x4062C223, 0x4063BC20, 0x00000002, 0x4062C224, - 0x4063BC20, 0x00000002, 0x4062C225, 0x4063BC20, 0x00000002, 0x4062C221, - 0x4063BE20, 0x00000002, 0x4062C222, 0x4063BE20, 0x00000002, 0x4062C223, - 0x4063BE20, 0x00000002, 0x4062C224, 0x4063BE20, - // Block 506, offset 0x7e80 - 0x00000002, 0x4062C225, 0x4063BE20, 0x00000002, 0x4062C226, 0x4063BE20, - 0x00000002, 0x4062C227, 0x4063BE20, 0x00000002, 0x4062C228, 0x4063BE20, - 0x00000002, 0x4062C229, 0x4063BE20, 0x00000002, 0x4062C22A, 0x4063BE20, - 0x00000002, 0x4062C22B, 0x4063BE20, 0x00000002, 0x4062C22C, 0x4063BE20, - 0x00000002, 0x4062C22D, 0x4063BE20, 0x00000002, 0x4062C22E, 0x4063BE20, - 0x00000002, 0x4062C221, 0x4063C020, 0x00000002, 0x4062C222, 0x4063C020, - 0x00000002, 0x4062C223, 0x4063C020, 0x00000002, 0x4062C224, 0x4063C020, - 0x00000002, 0x4062C225, 0x4063C020, 0x00000002, 0x4062C226, 0x4063C020, - 0x00000002, 0x4062C227, 0x4063C020, 0x00000002, 0x4062C228, 0x4063C020, - 0x00000002, 0x4062C229, 0x4063C020, 0x00000002, 0x4062C22A, 0x4063C020, - 0x00000002, 0x4062C22B, 0x4063C020, 0x00000002, - // Block 507, offset 0x7ec0 - 0x4062C22C, 0x4063C020, 0x00000002, 0x4062C22D, 0x4063C020, 0x00000002, - 0x4062C22E, 0x4063C020, 0x00000002, 0x4062C22F, 0x4063C020, 0x00000002, - 0x4062C230, 0x4063C020, 0x00000002, 0x4062C231, 0x4063C020, 0x00000002, - 0x4062C232, 0x4063C020, 0x00000002, 0x4062C233, 0x4063C020, 0x00000002, - 0x4062C234, 0x4063C020, 0x00000002, 0x4062C235, 0x4063C020, 0x00000002, - 0x4062C236, 0x4063C020, 0x00000002, 0x4062C237, 0x4063C020, 0x00000002, - 0x4062C238, 0x4063C020, 0x00000002, 0x4062C239, 0x4063C020, 0x00000002, - 0x4062C23A, 0x4063C020, 0x00000002, 0x4062C23B, 0x4063C020, 0x00000002, - 0x4062C23C, 0x4063C020, 0x00000002, 0x4062C23D, 0x4063C020, 0x00000002, - 0x4062C23E, 0x4063C020, 0x00000002, 0x4062C23F, 0x4063C020, 0x00000002, - 0x4062C240, 0x4063C020, 0x00000002, 0x4062C241, - // Block 508, offset 0x7f00 - 0x4063C020, 0x00000002, 0x4062C242, 0x4063C020, 0x00000002, 0x4062C243, - 0x4063C020, 0x00000002, 0x4062C244, 0x4063C020, 0x00000002, 0x4062C245, - 0x4063C020, 0x00000002, 0x4062C246, 0x4063C020, 0x00000002, 0x4062C247, - 0x4063C020, 0x00000002, 0x4062C248, 0x4063C020, 0x00000002, 0x4062C249, - 0x4063C020, 0x00000002, 0x4062C24A, 0x4063C020, 0x00000002, 0x4062C24B, - 0x4063C020, 0x00000002, 0x4062C24C, 0x4063C020, 0x00000003, 0x4062C221, - 0x4063C020, 0x40646420, 0x00000003, 0x4062C222, 0x4063C020, 0x40646420, - 0x00000003, 0x4062C223, 0x4063C020, 0x40646420, 0x00000003, 0x4062C224, - 0x4063C020, 0x40646420, 0x00000003, 0x4062C225, 0x4063C020, 0x40646420, - 0x00000003, 0x4062C226, 0x4063C020, 0x40646420, 0x00000003, 0x4062C227, - 0x4063C020, 0x40646420, 0x00000003, 0x4062C228, - // Block 509, offset 0x7f40 - 0x4063C020, 0x40646420, 0x00000003, 0x4062C221, 0x4063C020, 0x40648C20, - 0x00000003, 0x4062C222, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C223, - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C224, 0x4063C020, 0x40648C20, - 0x00000003, 0x4062C225, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C226, - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C227, 0x4063C020, 0x40648C20, - 0x00000003, 0x4062C228, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C229, - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C22A, 0x4063C020, 0x40648C20, - 0x00000003, 0x4062C22B, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C22C, - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C22D, 0x4063C020, 0x40648C20, - 0x00000003, 0x4062C22E, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C22F, - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C230, - // Block 510, offset 0x7f80 - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C231, 0x4063C020, 0x40648C20, - 0x00000003, 0x4062C232, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C233, - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C234, 0x4063C020, 0x40648C20, - 0x00000003, 0x4062C235, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C236, - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C237, 0x4063C020, 0x40648C20, - 0x00000003, 0x4062C238, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C239, - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C23A, 0x4063C020, 0x40648C20, - 0x00000003, 0x4062C23B, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C23C, - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C23D, 0x4063C020, 0x40648C20, - 0x00000003, 0x4062C23E, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C23F, - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C240, - // Block 511, offset 0x7fc0 - 0x4063C020, 0x40648C20, 0x00000003, 0x4062C241, 0x4063C020, 0x40648C20, - 0x00000002, 0x4062C221, 0x4063C220, 0x00000002, 0x4062C222, 0x4063C220, - 0x00000002, 0x4062C223, 0x4063C220, 0x00000002, 0x4062C224, 0x4063C220, - 0x00000002, 0x4062C225, 0x4063C220, 0x00000002, 0x4062C226, 0x4063C220, - 0x00000002, 0x4062C227, 0x4063C220, 0x00000002, 0x4062C228, 0x4063C220, - 0x00000002, 0x4062C229, 0x4063C220, 0x00000002, 0x4062C22A, 0x4063C220, - 0x00000002, 0x4062C22B, 0x4063C220, 0x00000002, 0x4062C22C, 0x4063C220, - 0x00000002, 0x4062C22D, 0x4063C220, 0x00000002, 0x4062C22E, 0x4063C220, - 0x00000002, 0x4062C22F, 0x4063C220, 0x00000002, 0x4062C230, 0x4063C220, - 0x00000002, 0x4062C231, 0x4063C220, 0x00000002, 0x4062C232, 0x4063C220, - 0x00000002, 0x4062C233, 0x4063C220, 0x00000002, - // Block 512, offset 0x8000 - 0x4062C234, 0x4063C220, 0x00000002, 0x4062C235, 0x4063C220, 0x00000002, - 0x4062C236, 0x4063C220, 0x00000002, 0x4062C237, 0x4063C220, 0x00000002, - 0x4062C238, 0x4063C220, 0x00000002, 0x4062C239, 0x4063C220, 0x00000002, - 0x4062C23A, 0x4063C220, 0x00000002, 0x4062C23B, 0x4063C220, 0x00000002, - 0x4062C23C, 0x4063C220, 0x00000002, 0x4062C23D, 0x4063C220, 0x00000002, - 0x4062C23E, 0x4063C220, 0x00000002, 0x4062C23F, 0x4063C220, 0x00000002, - 0x4062C240, 0x4063C220, 0x00000002, 0x4062C241, 0x4063C220, 0x00000002, - 0x4062C242, 0x4063C220, 0x00000002, 0x4062C243, 0x4063C220, 0x00000002, - 0x4062C244, 0x4063C220, 0x00000002, 0x4062C245, 0x4063C220, 0x00000002, - 0x4062C246, 0x4063C220, 0x00000002, 0x4062C247, 0x4063C220, 0x00000002, - 0x4062C248, 0x4063C220, 0x00000002, 0x4062C249, - // Block 513, offset 0x8040 - 0x4063C220, 0x00000002, 0x4062C24A, 0x4063C220, 0x00000002, 0x4062C24B, - 0x4063C220, 0x00000002, 0x4062C24C, 0x4063C220, 0x00000002, 0x4062C24D, - 0x4063C220, 0x00000002, 0x4062C24E, 0x4063C220, 0x00000002, 0x4062C24F, - 0x4063C220, 0x00000002, 0x4062C250, 0x4063C220, 0x00000002, 0x4062C251, - 0x4063C220, 0x00000002, 0x4062C252, 0x4063C220, 0x00000002, 0x4062C253, - 0x4063C220, 0x00000002, 0x4062C254, 0x4063C220, 0x00000003, 0x4062C221, - 0x4063C220, 0x40646420, 0x00000003, 0x4062C222, 0x4063C220, 0x40646420, - 0x00000003, 0x4062C223, 0x4063C220, 0x40646420, 0x00000003, 0x4062C224, - 0x4063C220, 0x40646420, 0x00000003, 0x4062C225, 0x4063C220, 0x40646420, - 0x00000003, 0x4062C226, 0x4063C220, 0x40646420, 0x00000003, 0x4062C227, - 0x4063C220, 0x40646420, 0x00000003, 0x4062C228, - // Block 514, offset 0x8080 - 0x4063C220, 0x40646420, 0x00000003, 0x4062C229, 0x4063C220, 0x40646420, - 0x00000003, 0x4062C22A, 0x4063C220, 0x40646420, 0x00000003, 0x4062C221, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062C222, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062C223, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C224, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062C225, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062C226, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C227, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062C228, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062C229, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C22A, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062C22B, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062C22C, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C22D, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062C22E, - // Block 515, offset 0x80c0 - 0x4063C220, 0x40646A20, 0x00000003, 0x4062C22F, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062C230, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C231, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062C232, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062C221, 0x4063C220, 0x40647220, 0x00000003, 0x4062C222, - 0x4063C220, 0x40647220, 0x00000003, 0x4062C223, 0x4063C220, 0x40647220, - 0x00000003, 0x4062C221, 0x4063C220, 0x40648C20, 0x00000003, 0x4062C222, - 0x4063C220, 0x40648C20, 0x00000003, 0x4062C221, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C222, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C223, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C224, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C225, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C226, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C227, - // Block 516, offset 0x8100 - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C228, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C229, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C22A, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C22B, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C22C, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C22D, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C22E, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C22F, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C230, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C231, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C232, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C233, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C234, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C235, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C236, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C237, - // Block 517, offset 0x8140 - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C238, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C239, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C23A, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C23B, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C23C, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C23D, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C23E, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C23F, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C240, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C241, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C242, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C243, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C244, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C245, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C246, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C247, - // Block 518, offset 0x8180 - 0x4063C420, 0x40646A20, 0x00000003, 0x4062C248, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062C221, 0x4063C420, 0x40647220, 0x00000003, 0x4062C222, - 0x4063C420, 0x40647220, 0x00000003, 0x4062C223, 0x4063C420, 0x40647220, - 0x00000003, 0x4062C224, 0x4063C420, 0x40647220, 0x00000003, 0x4062C225, - 0x4063C420, 0x40647220, 0x00000002, 0x4062C221, 0x4063C820, 0x00000002, - 0x4062C222, 0x4063C820, 0x00000002, 0x4062C223, 0x4063C820, 0x00000002, - 0x4062C224, 0x4063C820, 0x00000002, 0x4062C225, 0x4063C820, 0x00000002, - 0x4062C226, 0x4063C820, 0x00000002, 0x4062C227, 0x4063C820, 0x00000002, - 0x4062C228, 0x4063C820, 0x00000002, 0x4062C229, 0x4063C820, 0x00000002, - 0x4062C22A, 0x4063C820, 0x00000002, 0x4062C22B, 0x4063C820, 0x00000002, - 0x4062C22C, 0x4063C820, 0x00000002, 0x4062C22D, - // Block 519, offset 0x81c0 - 0x4063C820, 0x00000002, 0x4062C22E, 0x4063C820, 0x00000002, 0x4062C22F, - 0x4063C820, 0x00000002, 0x4062C230, 0x4063C820, 0x00000002, 0x4062C231, - 0x4063C820, 0x00000002, 0x4062C232, 0x4063C820, 0x00000002, 0x4062C233, - 0x4063C820, 0x00000002, 0x4062C234, 0x4063C820, 0x00000002, 0x4062C235, - 0x4063C820, 0x00000002, 0x4062C236, 0x4063C820, 0x00000002, 0x4062C237, - 0x4063C820, 0x00000002, 0x4062C238, 0x4063C820, 0x00000002, 0x4062C239, - 0x4063C820, 0x00000002, 0x4062C23A, 0x4063C820, 0x00000002, 0x4062C23B, - 0x4063C820, 0x00000002, 0x4062C23C, 0x4063C820, 0x00000002, 0x4062C23D, - 0x4063C820, 0x00000002, 0x4062C23E, 0x4063C820, 0x00000002, 0x4062C23F, - 0x4063C820, 0x00000002, 0x4062C240, 0x4063C820, 0x00000002, 0x4062C241, - 0x4063C820, 0x00000002, 0x4062C242, 0x4063C820, - // Block 520, offset 0x8200 - 0x00000002, 0x4062C243, 0x4063C820, 0x00000002, 0x4062C244, 0x4063C820, - 0x00000002, 0x4062C245, 0x4063C820, 0x00000002, 0x4062C246, 0x4063C820, - 0x00000002, 0x4062C247, 0x4063C820, 0x00000002, 0x4062C221, 0x4063CA20, - 0x00000002, 0x4062C222, 0x4063CA20, 0x00000002, 0x4062C223, 0x4063CA20, - 0x00000002, 0x4062C224, 0x4063CA20, 0x00000002, 0x4062C225, 0x4063CA20, - 0x00000002, 0x4062C226, 0x4063CA20, 0x00000002, 0x4062C227, 0x4063CA20, - 0x00000002, 0x4062C228, 0x4063CA20, 0x00000002, 0x4062C229, 0x4063CA20, - 0x00000002, 0x4062C22A, 0x4063CA20, 0x00000002, 0x4062C22B, 0x4063CA20, - 0x00000002, 0x4062C22C, 0x4063CA20, 0x00000002, 0x4062C22D, 0x4063CA20, - 0x00000002, 0x4062C22E, 0x4063CA20, 0x00000002, 0x4062C22F, 0x4063CA20, - 0x00000002, 0x4062C230, 0x4063CA20, 0x00000002, - // Block 521, offset 0x8240 - 0x4062C231, 0x4063CA20, 0x00000002, 0x4062C232, 0x4063CA20, 0x00000002, - 0x4062C233, 0x4063CA20, 0x00000002, 0x4062C234, 0x4063CA20, 0x00000002, - 0x4062C235, 0x4063CA20, 0x00000002, 0x4062C236, 0x4063CA20, 0x00000002, - 0x4062C237, 0x4063CA20, 0x00000002, 0x4062C238, 0x4063CA20, 0x00000002, - 0x4062C239, 0x4063CA20, 0x00000002, 0x4062C23A, 0x4063CA20, 0x00000002, - 0x4062C23B, 0x4063CA20, 0x00000002, 0x4062C23C, 0x4063CA20, 0x00000002, - 0x4062C23D, 0x4063CA20, 0x00000002, 0x4062C23E, 0x4063CA20, 0x00000002, - 0x4062C23F, 0x4063CA20, 0x00000002, 0x4062C240, 0x4063CA20, 0x00000002, - 0x4062C241, 0x4063CA20, 0x00000002, 0x4062C242, 0x4063CA20, 0x00000002, - 0x4062C243, 0x4063CA20, 0x00000002, 0x4062C244, 0x4063CA20, 0x00000002, - 0x4062C245, 0x4063CA20, 0x00000002, 0x4062C246, - // Block 522, offset 0x8280 - 0x4063CA20, 0x00000002, 0x4062C247, 0x4063CA20, 0x00000002, 0x4062C248, - 0x4063CA20, 0x00000002, 0x4062C249, 0x4063CA20, 0x00000002, 0x4062C24A, - 0x4063CA20, 0x00000002, 0x4062C24B, 0x4063CA20, 0x00000002, 0x4062C24C, - 0x4063CA20, 0x00000002, 0x4062C24D, 0x4063CA20, 0x00000002, 0x4062C24E, - 0x4063CA20, 0x00000002, 0x4062C24F, 0x4063CA20, 0x00000002, 0x4062C250, - 0x4063CA20, 0x00000002, 0x4062C251, 0x4063CA20, 0x00000002, 0x4062C252, - 0x4063CA20, 0x00000002, 0x4062C253, 0x4063CA20, 0x00000002, 0x4062C254, - 0x4063CA20, 0x00000002, 0x4062C255, 0x4063CA20, 0x00000002, 0x4062C256, - 0x4063CA20, 0x00000002, 0x4062C257, 0x4063CA20, 0x00000002, 0x4062C258, - 0x4063CA20, 0x00000002, 0x4062C259, 0x4063CA20, 0x00000002, 0x4062C25A, - 0x4063CA20, 0x00000002, 0x4062C25B, 0x4063CA20, - // Block 523, offset 0x82c0 - 0x00000002, 0x4062C25C, 0x4063CA20, 0x00000002, 0x4062C25D, 0x4063CA20, - 0x00000002, 0x4062C25E, 0x4063CA20, 0x00000002, 0x4062C25F, 0x4063CA20, - 0x00000002, 0x4062C260, 0x4063CA20, 0x00000002, 0x4062C261, 0x4063CA20, - 0x00000002, 0x4062C262, 0x4063CA20, 0x00000002, 0x4062C263, 0x4063CA20, - 0x00000002, 0x4062C264, 0x4063CA20, 0x00000002, 0x4062C265, 0x4063CA20, - 0x00000002, 0x4062C266, 0x4063CA20, 0x00000002, 0x4062C267, 0x4063CA20, - 0x00000002, 0x4062C268, 0x4063CA20, 0x00000002, 0x4062C269, 0x4063CA20, - 0x00000002, 0x4062C26A, 0x4063CA20, 0x00000002, 0x4062C26B, 0x4063CA20, - 0x00000002, 0x4062C26C, 0x4063CA20, 0x00000002, 0x4062C26D, 0x4063CA20, - 0x00000003, 0x4062C221, 0x4063CA20, 0x40646420, 0x00000003, 0x4062C222, - 0x4063CA20, 0x40646420, 0x00000003, 0x4062C223, - // Block 524, offset 0x8300 - 0x4063CA20, 0x40646420, 0x00000003, 0x4062C224, 0x4063CA20, 0x40646420, - 0x00000003, 0x4062C225, 0x4063CA20, 0x40646420, 0x00000003, 0x4062C221, - 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C222, 0x4063CA20, 0x40646A20, - 0x00000003, 0x4062C223, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C224, - 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C225, 0x4063CA20, 0x40646A20, - 0x00000003, 0x4062C226, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C227, - 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C228, 0x4063CA20, 0x40646A20, - 0x00000003, 0x4062C229, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C22A, - 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C22B, 0x4063CA20, 0x40646A20, - 0x00000003, 0x4062C221, 0x4063CA20, 0x40647220, 0x00000003, 0x4062C222, - 0x4063CA20, 0x40647220, 0x00000003, 0x4062C223, - // Block 525, offset 0x8340 - 0x4063CA20, 0x40647220, 0x00000003, 0x4062C221, 0x4063CA20, 0x40648C20, - 0x00000003, 0x4062C222, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062C223, - 0x4063CA20, 0x40648C20, 0x00000003, 0x4062C224, 0x4063CA20, 0x40648C20, - 0x00000003, 0x4062C225, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062C221, - 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C222, 0x4063CC20, 0x40646A20, - 0x00000003, 0x4062C223, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C224, - 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C225, 0x4063CC20, 0x40646A20, - 0x00000003, 0x4062C226, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C227, - 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C228, 0x4063CC20, 0x40646A20, - 0x00000003, 0x4062C229, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C22A, - 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C22B, - // Block 526, offset 0x8380 - 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C22C, 0x4063CC20, 0x40646A20, - 0x00000003, 0x4062C22D, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C22E, - 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C22F, 0x4063CC20, 0x40646A20, - 0x00000003, 0x4062C230, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C231, - 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C232, 0x4063CC20, 0x40646A20, - 0x00000003, 0x4062C233, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C234, - 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C221, 0x4063CC20, 0x40647220, - 0x00000003, 0x4062C222, 0x4063CC20, 0x40647220, 0x00000003, 0x4062C221, - 0x4063CC20, 0x40648220, 0x00000003, 0x4062C222, 0x4063CC20, 0x40648220, - 0x00000003, 0x4062C223, 0x4063CC20, 0x40648220, 0x00000003, 0x4062C224, - 0x4063CC20, 0x40648220, 0x00000003, 0x4062C225, - // Block 527, offset 0x83c0 - 0x4063CC20, 0x40648220, 0x00000003, 0x4062C226, 0x4063CC20, 0x40648220, - 0x00000003, 0x4062C227, 0x4063CC20, 0x40648220, 0x00000003, 0x4062C228, - 0x4063CC20, 0x40648220, 0x00000003, 0x4062C229, 0x4063CC20, 0x40648220, - 0x00000003, 0x4062C22A, 0x4063CC20, 0x40648220, 0x00000003, 0x4062C22B, - 0x4063CC20, 0x40648220, 0x00000003, 0x4062C221, 0x4063CC20, 0x40648420, - 0x00000003, 0x4062C222, 0x4063CC20, 0x40648420, 0x00000003, 0x4062C223, - 0x4063CC20, 0x40648420, 0x00000003, 0x4062C224, 0x4063CC20, 0x40648420, - 0x00000003, 0x4062C225, 0x4063CC20, 0x40648420, 0x00000003, 0x4062C226, - 0x4063CC20, 0x40648420, 0x00000003, 0x4062C221, 0x4063CC20, 0x40648C20, - 0x00000003, 0x4062C222, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C223, - 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C224, - // Block 528, offset 0x8400 - 0x4063CC20, 0x40648C20, 0x00000002, 0x4062C221, 0x4063CE20, 0x00000002, - 0x4062C222, 0x4063CE20, 0x00000002, 0x4062C223, 0x4063CE20, 0x00000002, - 0x4062C224, 0x4063CE20, 0x00000002, 0x4062C225, 0x4063CE20, 0x00000002, - 0x4062C226, 0x4063CE20, 0x00000002, 0x4062C227, 0x4063CE20, 0x00000002, - 0x4062C228, 0x4063CE20, 0x00000002, 0x4062C229, 0x4063CE20, 0x00000002, - 0x4062C22A, 0x4063CE20, 0x00000002, 0x4062C22B, 0x4063CE20, 0x00000002, - 0x4062C22C, 0x4063CE20, 0x00000002, 0x4062C22D, 0x4063CE20, 0x00000002, - 0x4062C22E, 0x4063CE20, 0x00000002, 0x4062C22F, 0x4063CE20, 0x00000002, - 0x4062C230, 0x4063CE20, 0x00000002, 0x4062C231, 0x4063CE20, 0x00000002, - 0x4062C232, 0x4063CE20, 0x00000002, 0x4062C233, 0x4063CE20, 0x00000002, - 0x4062C234, 0x4063CE20, 0x00000002, 0x4062C235, - // Block 529, offset 0x8440 - 0x4063CE20, 0x00000002, 0x4062C236, 0x4063CE20, 0x00000002, 0x4062C237, - 0x4063CE20, 0x00000002, 0x4062C238, 0x4063CE20, 0x00000002, 0x4062C239, - 0x4063CE20, 0x00000002, 0x4062C23A, 0x4063CE20, 0x00000002, 0x4062C23B, - 0x4063CE20, 0x00000002, 0x4062C23C, 0x4063CE20, 0x00000002, 0x4062C23D, - 0x4063CE20, 0x00000002, 0x4062C221, 0x4063D020, 0x00000002, 0x4062C222, - 0x4063D020, 0x00000002, 0x4062C223, 0x4063D020, 0x00000002, 0x4062C224, - 0x4063D020, 0x00000002, 0x4062C225, 0x4063D020, 0x00000002, 0x4062C226, - 0x4063D020, 0x00000002, 0x4062C227, 0x4063D020, 0x00000002, 0x4062C228, - 0x4063D020, 0x00000002, 0x4062C229, 0x4063D020, 0x00000002, 0x4062C22A, - 0x4063D020, 0x00000002, 0x4062C22B, 0x4063D020, 0x00000002, 0x4062C22C, - 0x4063D020, 0x00000002, 0x4062C22D, 0x4063D020, - // Block 530, offset 0x8480 - 0x00000002, 0x4062C22E, 0x4063D020, 0x00000002, 0x4062C22F, 0x4063D020, - 0x00000002, 0x4062C230, 0x4063D020, 0x00000002, 0x4062C231, 0x4063D020, - 0x00000002, 0x4062C232, 0x4063D020, 0x00000002, 0x4062C233, 0x4063D020, - 0x00000002, 0x4062C234, 0x4063D020, 0x00000002, 0x4062C235, 0x4063D020, - 0x00000002, 0x4062C236, 0x4063D020, 0x00000002, 0x4062C237, 0x4063D020, - 0x00000002, 0x4062C238, 0x4063D020, 0x00000002, 0x4062C239, 0x4063D020, - 0x00000002, 0x4062C23A, 0x4063D020, 0x00000002, 0x4062C23B, 0x4063D020, - 0x00000002, 0x4062C23C, 0x4063D020, 0x00000002, 0x4062C23D, 0x4063D020, - 0x00000002, 0x4062C23E, 0x4063D020, 0x00000002, 0x4062C23F, 0x4063D020, - 0x00000002, 0x4062C240, 0x4063D020, 0x00000002, 0x4062C241, 0x4063D020, - 0x00000002, 0x4062C242, 0x4063D020, 0x00000002, - // Block 531, offset 0x84c0 - 0x4062C243, 0x4063D020, 0x00000003, 0x4062C221, 0x4063D020, 0x40646420, - 0x00000003, 0x4062C222, 0x4063D020, 0x40646420, 0x00000003, 0x4062C223, - 0x4063D020, 0x40646420, 0x00000003, 0x4062C224, 0x4063D020, 0x40646420, - 0x00000003, 0x4062C225, 0x4063D020, 0x40646420, 0x00000003, 0x4062C226, - 0x4063D020, 0x40646420, 0x00000003, 0x4062C227, 0x4063D020, 0x40646420, - 0x00000003, 0x4062C228, 0x4063D020, 0x40646420, 0x00000003, 0x4062C229, - 0x4063D020, 0x40646420, 0x00000003, 0x4062C221, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062C222, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C223, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C224, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062C225, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C226, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C227, - // Block 532, offset 0x8500 - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C228, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062C229, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C22A, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C22B, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062C22C, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C22D, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C22E, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062C22F, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C230, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C231, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062C232, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C233, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C234, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062C235, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C236, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C237, - // Block 533, offset 0x8540 - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C238, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062C239, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C23A, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C23B, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062C23C, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C221, - 0x4063D020, 0x40647220, 0x00000003, 0x4062C222, 0x4063D020, 0x40647220, - 0x00000003, 0x4062C223, 0x4063D020, 0x40647220, 0x00000003, 0x4062C224, - 0x4063D020, 0x40647220, 0x00000003, 0x4062C225, 0x4063D020, 0x40647220, - 0x00000003, 0x4062C226, 0x4063D020, 0x40647220, 0x00000003, 0x4062C227, - 0x4063D020, 0x40647220, 0x00000003, 0x4062C228, 0x4063D020, 0x40647220, - 0x00000003, 0x4062C229, 0x4063D020, 0x40647220, 0x00000003, 0x4062C22A, - 0x4063D020, 0x40647220, 0x00000003, 0x4062C22B, - // Block 534, offset 0x8580 - 0x4063D020, 0x40647220, 0x00000003, 0x4062C221, 0x4063D020, 0x40648220, - 0x00000003, 0x4062C222, 0x4063D020, 0x40648220, 0x00000003, 0x4062C223, - 0x4063D020, 0x40648220, 0x00000003, 0x4062C224, 0x4063D020, 0x40648220, - 0x00000003, 0x4062C225, 0x4063D020, 0x40648220, 0x00000003, 0x4062C226, - 0x4063D020, 0x40648220, 0x00000003, 0x4062C227, 0x4063D020, 0x40648220, - 0x00000003, 0x4062C228, 0x4063D020, 0x40648220, 0x00000003, 0x4062C229, - 0x4063D020, 0x40648220, 0x00000003, 0x4062C22A, 0x4063D020, 0x40648220, - 0x00000003, 0x4062C22B, 0x4063D020, 0x40648220, 0x00000003, 0x4062C22C, - 0x4063D020, 0x40648220, 0x00000003, 0x4062C221, 0x4063D020, 0x40648420, - 0x00000003, 0x4062C222, 0x4063D020, 0x40648420, 0x00000003, 0x4062C223, - 0x4063D020, 0x40648420, 0x00000003, 0x4062C221, - // Block 535, offset 0x85c0 - 0x4063D020, 0x40648C20, 0x00000003, 0x4062C222, 0x4063D020, 0x40648C20, - 0x00000003, 0x4062C223, 0x4063D020, 0x40648C20, 0x00000003, 0x4062C224, - 0x4063D020, 0x40648C20, 0x00000003, 0x4062C225, 0x4063D020, 0x40648C20, - 0x00000002, 0x4062C421, 0x4063A820, 0x00000002, 0x4062C422, 0x4063A820, - 0x00000002, 0x4062C423, 0x4063A820, 0x00000002, 0x4062C424, 0x4063A820, - 0x00000002, 0x4062C425, 0x4063A820, 0x00000002, 0x4062C426, 0x4063A820, - 0x00000002, 0x4062C427, 0x4063A820, 0x00000002, 0x4062C428, 0x4063A820, - 0x00000002, 0x4062C429, 0x4063A820, 0x00000002, 0x4062C42A, 0x4063A820, - 0x00000002, 0x4062C42B, 0x4063A820, 0x00000002, 0x4062C42C, 0x4063A820, - 0x00000002, 0x4062C42D, 0x4063A820, 0x00000002, 0x4062C42E, 0x4063A820, - 0x00000002, 0x4062C42F, 0x4063A820, 0x00000002, - // Block 536, offset 0x8600 - 0x4062C430, 0x4063A820, 0x00000002, 0x4062C431, 0x4063A820, 0x00000002, - 0x4062C432, 0x4063A820, 0x00000002, 0x4062C433, 0x4063A820, 0x00000002, - 0x4062C434, 0x4063A820, 0x00000002, 0x4062C435, 0x4063A820, 0x00000002, - 0x4062C436, 0x4063A820, 0x00000002, 0x4062C437, 0x4063A820, 0x00000002, - 0x4062C438, 0x4063A820, 0x00000002, 0x4062C439, 0x4063A820, 0x00000002, - 0x4062C43A, 0x4063A820, 0x00000002, 0x4062C43B, 0x4063A820, 0x00000002, - 0x4062C43C, 0x4063A820, 0x00000002, 0x4062C43D, 0x4063A820, 0x00000002, - 0x4062C43E, 0x4063A820, 0x00000002, 0x4062C43F, 0x4063A820, 0x00000002, - 0x4062C440, 0x4063A820, 0x00000002, 0x4062C441, 0x4063A820, 0x00000002, - 0x4062C442, 0x4063A820, 0x00000002, 0x4062C443, 0x4063A820, 0x00000002, - 0x4062C444, 0x4063A820, 0x00000002, 0x4062C445, - // Block 537, offset 0x8640 - 0x4063A820, 0x00000002, 0x4062C446, 0x4063A820, 0x00000002, 0x4062C447, - 0x4063A820, 0x00000002, 0x4062C448, 0x4063A820, 0x00000002, 0x4062C449, - 0x4063A820, 0x00000002, 0x4062C44A, 0x4063A820, 0x00000002, 0x4062C44B, - 0x4063A820, 0x00000002, 0x4062C44C, 0x4063A820, 0x00000002, 0x4062C44D, - 0x4063A820, 0x00000002, 0x4062C44E, 0x4063A820, 0x00000002, 0x4062C44F, - 0x4063A820, 0x00000002, 0x4062C450, 0x4063A820, 0x00000002, 0x4062C451, - 0x4063A820, 0x00000002, 0x4062C452, 0x4063A820, 0x00000002, 0x4062C453, - 0x4063A820, 0x00000002, 0x4062C454, 0x4063A820, 0x00000003, 0x4062C421, - 0x4063A820, 0x40646420, 0x00000003, 0x4062C422, 0x4063A820, 0x40646420, - 0x00000003, 0x4062C423, 0x4063A820, 0x40646420, 0x00000003, 0x4062C424, - 0x4063A820, 0x40646420, 0x00000003, 0x4062C425, - // Block 538, offset 0x8680 - 0x4063A820, 0x40646420, 0x00000003, 0x4062C426, 0x4063A820, 0x40646420, - 0x00000003, 0x4062C427, 0x4063A820, 0x40646420, 0x00000003, 0x4062C428, - 0x4063A820, 0x40646420, 0x00000003, 0x4062C429, 0x4063A820, 0x40646420, - 0x00000003, 0x4062C42A, 0x4063A820, 0x40646420, 0x00000003, 0x4062C42B, - 0x4063A820, 0x40646420, 0x00000003, 0x4062C42C, 0x4063A820, 0x40646420, - 0x00000003, 0x4062C42D, 0x4063A820, 0x40646420, 0x00000003, 0x4062C42E, - 0x4063A820, 0x40646420, 0x00000003, 0x4062C42F, 0x4063A820, 0x40646420, - 0x00000003, 0x4062C430, 0x4063A820, 0x40646420, 0x00000003, 0x4062C431, - 0x4063A820, 0x40646420, 0x00000003, 0x4062C432, 0x4063A820, 0x40646420, - 0x00000003, 0x4062C433, 0x4063A820, 0x40646420, 0x00000003, 0x4062C434, - 0x4063A820, 0x40646420, 0x00000003, 0x4062C435, - // Block 539, offset 0x86c0 - 0x4063A820, 0x40646420, 0x00000003, 0x4062C421, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062C422, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C423, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062C424, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062C425, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C426, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062C427, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062C428, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C421, - 0x4063A820, 0x40648220, 0x00000003, 0x4062C422, 0x4063A820, 0x40648220, - 0x00000003, 0x4062C423, 0x4063A820, 0x40648220, 0x00000003, 0x4062C424, - 0x4063A820, 0x40648220, 0x00000003, 0x4062C425, 0x4063A820, 0x40648220, - 0x00000003, 0x4062C426, 0x4063A820, 0x40648220, 0x00000003, 0x4062C427, - 0x4063A820, 0x40648220, 0x00000003, 0x4062C428, - // Block 540, offset 0x8700 - 0x4063A820, 0x40648220, 0x00000003, 0x4062C429, 0x4063A820, 0x40648220, - 0x00000003, 0x4062C421, 0x4063A820, 0x40648420, 0x00000003, 0x4062C422, - 0x4063A820, 0x40648420, 0x00000003, 0x4062C423, 0x4063A820, 0x40648420, - 0x00000003, 0x4062C424, 0x4063A820, 0x40648420, 0x00000003, 0x4062C425, - 0x4063A820, 0x40648420, 0x00000003, 0x4062C426, 0x4063A820, 0x40648420, - 0x00000003, 0x4062C421, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C422, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C423, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C424, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C425, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C426, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C427, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C428, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C429, - // Block 541, offset 0x8740 - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C42A, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C42B, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C42C, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C42D, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C42E, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C42F, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C430, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C431, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C432, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C433, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C434, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C435, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C436, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C437, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C438, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C439, - // Block 542, offset 0x8780 - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C43A, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C43B, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C43C, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C43D, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C43E, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C43F, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C440, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C441, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C442, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C443, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C444, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C445, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C446, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C447, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C448, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C449, - // Block 543, offset 0x87c0 - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C44A, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C44B, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C44C, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C44D, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C44E, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C44F, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C450, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C451, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C452, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C453, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C454, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C455, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062C456, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062C457, 0x4063A820, 0x40648C20, 0x00000002, 0x4062C421, - 0x4063AA20, 0x00000002, 0x4062C422, 0x4063AA20, - // Block 544, offset 0x8800 - 0x00000002, 0x4062C423, 0x4063AA20, 0x00000002, 0x4062C424, 0x4063AA20, - 0x00000002, 0x4062C425, 0x4063AA20, 0x00000002, 0x4062C426, 0x4063AA20, - 0x00000002, 0x4062C427, 0x4063AA20, 0x00000002, 0x4062C428, 0x4063AA20, - 0x00000002, 0x4062C429, 0x4063AA20, 0x00000002, 0x4062C42A, 0x4063AA20, - 0x00000002, 0x4062C42B, 0x4063AA20, 0x00000002, 0x4062C42C, 0x4063AA20, - 0x00000002, 0x4062C42D, 0x4063AA20, 0x00000002, 0x4062C42E, 0x4063AA20, - 0x00000002, 0x4062C42F, 0x4063AA20, 0x00000002, 0x4062C430, 0x4063AA20, - 0x00000002, 0x4062C431, 0x4063AA20, 0x00000002, 0x4062C432, 0x4063AA20, - 0x00000002, 0x4062C433, 0x4063AA20, 0x00000002, 0x4062C434, 0x4063AA20, - 0x00000002, 0x4062C435, 0x4063AA20, 0x00000002, 0x4062C436, 0x4063AA20, - 0x00000002, 0x4062C437, 0x4063AA20, 0x00000003, - // Block 545, offset 0x8840 - 0x4062C421, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C422, 0x4063AA20, - 0x40648C20, 0x00000003, 0x4062C423, 0x4063AA20, 0x40648C20, 0x00000003, - 0x4062C424, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C425, 0x4063AA20, - 0x40648C20, 0x00000003, 0x4062C426, 0x4063AA20, 0x40648C20, 0x00000003, - 0x4062C427, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C428, 0x4063AA20, - 0x40648C20, 0x00000002, 0x4062C421, 0x4063B020, 0x00000002, 0x4062C422, - 0x4063B020, 0x00000002, 0x4062C423, 0x4063B020, 0x00000002, 0x4062C424, - 0x4063B020, 0x00000002, 0x4062C425, 0x4063B020, 0x00000002, 0x4062C426, - 0x4063B020, 0x00000002, 0x4062C427, 0x4063B020, 0x00000002, 0x4062C428, - 0x4063B020, 0x00000002, 0x4062C429, 0x4063B020, 0x00000002, 0x4062C42A, - 0x4063B020, 0x00000002, 0x4062C42B, 0x4063B020, - // Block 546, offset 0x8880 - 0x00000002, 0x4062C42C, 0x4063B020, 0x00000002, 0x4062C42D, 0x4063B020, - 0x00000002, 0x4062C42E, 0x4063B020, 0x00000002, 0x4062C42F, 0x4063B020, - 0x00000002, 0x4062C430, 0x4063B020, 0x00000002, 0x4062C431, 0x4063B020, - 0x00000002, 0x4062C432, 0x4063B020, 0x00000002, 0x4062C433, 0x4063B020, - 0x00000002, 0x4062C434, 0x4063B020, 0x00000002, 0x4062C435, 0x4063B020, - 0x00000002, 0x4062C436, 0x4063B020, 0x00000002, 0x4062C437, 0x4063B020, - 0x00000002, 0x4062C438, 0x4063B020, 0x00000002, 0x4062C439, 0x4063B020, - 0x00000002, 0x4062C43A, 0x4063B020, 0x00000002, 0x4062C43B, 0x4063B020, - 0x00000002, 0x4062C43C, 0x4063B020, 0x00000002, 0x4062C43D, 0x4063B020, - 0x00000002, 0x4062C43E, 0x4063B020, 0x00000002, 0x4062C43F, 0x4063B020, - 0x00000002, 0x4062C440, 0x4063B020, 0x00000002, - // Block 547, offset 0x88c0 - 0x4062C441, 0x4063B020, 0x00000002, 0x4062C442, 0x4063B020, 0x00000002, - 0x4062C443, 0x4063B020, 0x00000002, 0x4062C444, 0x4063B020, 0x00000002, - 0x4062C445, 0x4063B020, 0x00000002, 0x4062C446, 0x4063B020, 0x00000002, - 0x4062C447, 0x4063B020, 0x00000002, 0x4062C448, 0x4063B020, 0x00000002, - 0x4062C449, 0x4063B020, 0x00000002, 0x4062C44A, 0x4063B020, 0x00000002, - 0x4062C44B, 0x4063B020, 0x00000002, 0x4062C44C, 0x4063B020, 0x00000002, - 0x4062C44D, 0x4063B020, 0x00000002, 0x4062C44E, 0x4063B020, 0x00000003, - 0x4062C421, 0x4063B020, 0x40646420, 0x00000003, 0x4062C422, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C423, 0x4063B020, 0x40646420, 0x00000003, - 0x4062C424, 0x4063B020, 0x40646420, 0x00000003, 0x4062C425, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C426, 0x4063B020, - // Block 548, offset 0x8900 - 0x40646420, 0x00000003, 0x4062C427, 0x4063B020, 0x40646420, 0x00000003, - 0x4062C428, 0x4063B020, 0x40646420, 0x00000003, 0x4062C429, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C42A, 0x4063B020, 0x40646420, 0x00000003, - 0x4062C42B, 0x4063B020, 0x40646420, 0x00000003, 0x4062C42C, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C42D, 0x4063B020, 0x40646420, 0x00000003, - 0x4062C42E, 0x4063B020, 0x40646420, 0x00000003, 0x4062C42F, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C430, 0x4063B020, 0x40646420, 0x00000003, - 0x4062C431, 0x4063B020, 0x40646420, 0x00000003, 0x4062C432, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C433, 0x4063B020, 0x40646420, 0x00000003, - 0x4062C434, 0x4063B020, 0x40646420, 0x00000003, 0x4062C435, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C436, 0x4063B020, - // Block 549, offset 0x8940 - 0x40646420, 0x00000003, 0x4062C437, 0x4063B020, 0x40646420, 0x00000003, - 0x4062C438, 0x4063B020, 0x40646420, 0x00000003, 0x4062C439, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C43A, 0x4063B020, 0x40646420, 0x00000003, - 0x4062C43B, 0x4063B020, 0x40646420, 0x00000003, 0x4062C43C, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C43D, 0x4063B020, 0x40646420, 0x00000003, - 0x4062C43E, 0x4063B020, 0x40646420, 0x00000003, 0x4062C43F, 0x4063B020, - 0x40646420, 0x00000003, 0x4062C421, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C422, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C423, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C424, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C425, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C426, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C427, 0x4063B020, - // Block 550, offset 0x8980 - 0x40646A20, 0x00000003, 0x4062C428, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C429, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C42A, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C42B, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C42C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C42D, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C42E, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C42F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C430, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C431, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C432, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C433, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C434, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C435, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C436, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C437, 0x4063B020, - // Block 551, offset 0x89c0 - 0x40646A20, 0x00000003, 0x4062C438, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C439, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C43A, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C43B, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C43C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C43D, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C43E, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C43F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C440, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C441, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C442, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C443, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C444, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C445, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C446, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C447, 0x4063B020, - // Block 552, offset 0x8a00 - 0x40646A20, 0x00000003, 0x4062C448, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C449, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C44A, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C44B, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C44C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C44D, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C44E, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C44F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C450, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C451, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C452, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C453, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C454, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C455, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C456, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C457, 0x4063B020, - // Block 553, offset 0x8a40 - 0x40646A20, 0x00000003, 0x4062C458, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C459, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C45A, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C45B, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C45C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C45D, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C45E, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C45F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C460, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C461, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C462, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C463, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C464, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C465, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C466, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C467, 0x4063B020, - // Block 554, offset 0x8a80 - 0x40646A20, 0x00000003, 0x4062C468, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C469, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C46A, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C46B, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C46C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C46D, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C46E, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C46F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C470, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062C471, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062C421, 0x4063B020, 0x40647220, 0x00000003, 0x4062C422, 0x4063B020, - 0x40647220, 0x00000003, 0x4062C423, 0x4063B020, 0x40647220, 0x00000003, - 0x4062C424, 0x4063B020, 0x40647220, 0x00000003, 0x4062C425, 0x4063B020, - 0x40647220, 0x00000003, 0x4062C426, 0x4063B020, - // Block 555, offset 0x8ac0 - 0x40647220, 0x00000003, 0x4062C427, 0x4063B020, 0x40647220, 0x00000003, - 0x4062C428, 0x4063B020, 0x40647220, 0x00000003, 0x4062C429, 0x4063B020, - 0x40647220, 0x00000003, 0x4062C42A, 0x4063B020, 0x40647220, 0x00000003, - 0x4062C42B, 0x4063B020, 0x40647220, 0x00000003, 0x4062C421, 0x4063B020, - 0x40648220, 0x00000003, 0x4062C422, 0x4063B020, 0x40648220, 0x00000003, - 0x4062C423, 0x4063B020, 0x40648220, 0x00000003, 0x4062C424, 0x4063B020, - 0x40648220, 0x00000003, 0x4062C425, 0x4063B020, 0x40648220, 0x00000003, - 0x4062C426, 0x4063B020, 0x40648220, 0x00000003, 0x4062C427, 0x4063B020, - 0x40648220, 0x00000003, 0x4062C428, 0x4063B020, 0x40648220, 0x00000003, - 0x4062C429, 0x4063B020, 0x40648220, 0x00000003, 0x4062C42A, 0x4063B020, - 0x40648220, 0x00000003, 0x4062C42B, 0x4063B020, - // Block 556, offset 0x8b00 - 0x40648220, 0x00000003, 0x4062C42C, 0x4063B020, 0x40648220, 0x00000003, - 0x4062C42D, 0x4063B020, 0x40648220, 0x00000003, 0x4062C42E, 0x4063B020, - 0x40648220, 0x00000003, 0x4062C42F, 0x4063B020, 0x40648220, 0x00000003, - 0x4062C430, 0x4063B020, 0x40648220, 0x00000003, 0x4062C431, 0x4063B020, - 0x40648220, 0x00000003, 0x4062C432, 0x4063B020, 0x40648220, 0x00000003, - 0x4062C433, 0x4063B020, 0x40648220, 0x00000003, 0x4062C434, 0x4063B020, - 0x40648220, 0x00000003, 0x4062C421, 0x4063B020, 0x40648420, 0x00000003, - 0x4062C422, 0x4063B020, 0x40648420, 0x00000003, 0x4062C423, 0x4063B020, - 0x40648420, 0x00000003, 0x4062C424, 0x4063B020, 0x40648420, 0x00000003, - 0x4062C425, 0x4063B020, 0x40648420, 0x00000003, 0x4062C426, 0x4063B020, - 0x40648420, 0x00000003, 0x4062C427, 0x4063B020, - // Block 557, offset 0x8b40 - 0x40648420, 0x00000003, 0x4062C428, 0x4063B020, 0x40648420, 0x00000003, - 0x4062C429, 0x4063B020, 0x40648420, 0x00000003, 0x4062C421, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C422, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C423, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C424, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C425, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C426, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C427, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C428, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C429, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C42A, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C42B, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C42C, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C42D, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C42E, 0x4063B020, - // Block 558, offset 0x8b80 - 0x40648C20, 0x00000003, 0x4062C42F, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C430, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C431, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C432, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C433, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C434, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C435, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C436, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C437, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C438, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C439, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C43A, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C43B, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C43C, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C43D, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C43E, 0x4063B020, - // Block 559, offset 0x8bc0 - 0x40648C20, 0x00000003, 0x4062C43F, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C440, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C441, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C442, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C443, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C444, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C445, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C446, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C447, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C448, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C449, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C44A, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C44B, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C44C, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C44D, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C44E, 0x4063B020, - // Block 560, offset 0x8c00 - 0x40648C20, 0x00000003, 0x4062C44F, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C450, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C451, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C452, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C453, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C454, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C455, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C456, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C457, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C458, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C459, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C45A, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C45B, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C45C, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C45D, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C45E, 0x4063B020, - // Block 561, offset 0x8c40 - 0x40648C20, 0x00000003, 0x4062C45F, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C460, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C461, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C462, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C463, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C464, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C465, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C466, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C467, 0x4063B020, - 0x40648C20, 0x00000003, 0x4062C468, 0x4063B020, 0x40648C20, 0x00000003, - 0x4062C469, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C46A, 0x4063B020, - 0x40648C20, 0x00000002, 0x4062C421, 0x4063B220, 0x00000002, 0x4062C422, - 0x4063B220, 0x00000002, 0x4062C423, 0x4063B220, 0x00000002, 0x4062C424, - 0x4063B220, 0x00000002, 0x4062C425, 0x4063B220, - // Block 562, offset 0x8c80 - 0x00000002, 0x4062C426, 0x4063B220, 0x00000002, 0x4062C427, 0x4063B220, - 0x00000002, 0x4062C428, 0x4063B220, 0x00000002, 0x4062C429, 0x4063B220, - 0x00000002, 0x4062C42A, 0x4063B220, 0x00000002, 0x4062C42B, 0x4063B220, - 0x00000002, 0x4062C42C, 0x4063B220, 0x00000002, 0x4062C42D, 0x4063B220, - 0x00000002, 0x4062C42E, 0x4063B220, 0x00000002, 0x4062C42F, 0x4063B220, - 0x00000002, 0x4062C430, 0x4063B220, 0x00000002, 0x4062C431, 0x4063B220, - 0x00000002, 0x4062C432, 0x4063B220, 0x00000002, 0x4062C433, 0x4063B220, - 0x00000002, 0x4062C434, 0x4063B220, 0x00000002, 0x4062C435, 0x4063B220, - 0x00000002, 0x4062C436, 0x4063B220, 0x00000002, 0x4062C437, 0x4063B220, - 0x00000002, 0x4062C438, 0x4063B220, 0x00000002, 0x4062C439, 0x4063B220, - 0x00000002, 0x4062C43A, 0x4063B220, 0x00000002, - // Block 563, offset 0x8cc0 - 0x4062C43B, 0x4063B220, 0x00000002, 0x4062C43C, 0x4063B220, 0x00000002, - 0x4062C43D, 0x4063B220, 0x00000002, 0x4062C43E, 0x4063B220, 0x00000002, - 0x4062C43F, 0x4063B220, 0x00000002, 0x4062C440, 0x4063B220, 0x00000002, - 0x4062C441, 0x4063B220, 0x00000002, 0x4062C442, 0x4063B220, 0x00000002, - 0x4062C443, 0x4063B220, 0x00000002, 0x4062C444, 0x4063B220, 0x00000002, - 0x4062C445, 0x4063B220, 0x00000002, 0x4062C446, 0x4063B220, 0x00000002, - 0x4062C447, 0x4063B220, 0x00000002, 0x4062C448, 0x4063B220, 0x00000002, - 0x4062C421, 0x4063B820, 0x00000002, 0x4062C422, 0x4063B820, 0x00000002, - 0x4062C423, 0x4063B820, 0x00000002, 0x4062C424, 0x4063B820, 0x00000002, - 0x4062C425, 0x4063B820, 0x00000002, 0x4062C426, 0x4063B820, 0x00000002, - 0x4062C427, 0x4063B820, 0x00000002, 0x4062C428, - // Block 564, offset 0x8d00 - 0x4063B820, 0x00000002, 0x4062C429, 0x4063B820, 0x00000002, 0x4062C42A, - 0x4063B820, 0x00000002, 0x4062C42B, 0x4063B820, 0x00000002, 0x4062C42C, - 0x4063B820, 0x00000002, 0x4062C42D, 0x4063B820, 0x00000002, 0x4062C42E, - 0x4063B820, 0x00000002, 0x4062C42F, 0x4063B820, 0x00000002, 0x4062C430, - 0x4063B820, 0x00000002, 0x4062C431, 0x4063B820, 0x00000002, 0x4062C432, - 0x4063B820, 0x00000002, 0x4062C433, 0x4063B820, 0x00000002, 0x4062C434, - 0x4063B820, 0x00000002, 0x4062C435, 0x4063B820, 0x00000002, 0x4062C436, - 0x4063B820, 0x00000002, 0x4062C437, 0x4063B820, 0x00000002, 0x4062C438, - 0x4063B820, 0x00000002, 0x4062C439, 0x4063B820, 0x00000002, 0x4062C43A, - 0x4063B820, 0x00000002, 0x4062C43B, 0x4063B820, 0x00000002, 0x4062C43C, - 0x4063B820, 0x00000002, 0x4062C43D, 0x4063B820, - // Block 565, offset 0x8d40 - 0x00000002, 0x4062C43E, 0x4063B820, 0x00000002, 0x4062C43F, 0x4063B820, - 0x00000002, 0x4062C440, 0x4063B820, 0x00000002, 0x4062C441, 0x4063B820, - 0x00000002, 0x4062C442, 0x4063B820, 0x00000002, 0x4062C443, 0x4063B820, - 0x00000002, 0x4062C444, 0x4063B820, 0x00000002, 0x4062C445, 0x4063B820, - 0x00000002, 0x4062C446, 0x4063B820, 0x00000002, 0x4062C447, 0x4063B820, - 0x00000002, 0x4062C448, 0x4063B820, 0x00000002, 0x4062C449, 0x4063B820, - 0x00000002, 0x4062C44A, 0x4063B820, 0x00000002, 0x4062C44B, 0x4063B820, - 0x00000002, 0x4062C44C, 0x4063B820, 0x00000002, 0x4062C44D, 0x4063B820, - 0x00000002, 0x4062C44E, 0x4063B820, 0x00000002, 0x4062C44F, 0x4063B820, - 0x00000002, 0x4062C450, 0x4063B820, 0x00000002, 0x4062C451, 0x4063B820, - 0x00000002, 0x4062C452, 0x4063B820, 0x00000002, - // Block 566, offset 0x8d80 - 0x4062C453, 0x4063B820, 0x00000002, 0x4062C454, 0x4063B820, 0x00000002, - 0x4062C455, 0x4063B820, 0x00000002, 0x4062C456, 0x4063B820, 0x00000002, - 0x4062C457, 0x4063B820, 0x00000002, 0x4062C458, 0x4063B820, 0x00000002, - 0x4062C459, 0x4063B820, 0x00000002, 0x4062C45A, 0x4063B820, 0x00000002, - 0x4062C45B, 0x4063B820, 0x00000002, 0x4062C45C, 0x4063B820, 0x00000002, - 0x4062C45D, 0x4063B820, 0x00000002, 0x4062C45E, 0x4063B820, 0x00000002, - 0x4062C45F, 0x4063B820, 0x00000002, 0x4062C460, 0x4063B820, 0x00000002, - 0x4062C461, 0x4063B820, 0x00000002, 0x4062C462, 0x4063B820, 0x00000002, - 0x4062C463, 0x4063B820, 0x00000002, 0x4062C464, 0x4063B820, 0x00000002, - 0x4062C465, 0x4063B820, 0x00000002, 0x4062C466, 0x4063B820, 0x00000002, - 0x4062C467, 0x4063B820, 0x00000002, 0x4062C468, - // Block 567, offset 0x8dc0 - 0x4063B820, 0x00000002, 0x4062C469, 0x4063B820, 0x00000002, 0x4062C46A, - 0x4063B820, 0x00000002, 0x4062C46B, 0x4063B820, 0x00000002, 0x4062C46C, - 0x4063B820, 0x00000002, 0x4062C46D, 0x4063B820, 0x00000002, 0x4062C46E, - 0x4063B820, 0x00000002, 0x4062C46F, 0x4063B820, 0x00000002, 0x4062C470, - 0x4063B820, 0x00000003, 0x4062C421, 0x4063B820, 0x40646420, 0x00000003, - 0x4062C422, 0x4063B820, 0x40646420, 0x00000003, 0x4062C423, 0x4063B820, - 0x40646420, 0x00000003, 0x4062C424, 0x4063B820, 0x40646420, 0x00000003, - 0x4062C425, 0x4063B820, 0x40646420, 0x00000003, 0x4062C421, 0x4063B820, - 0x40646A20, 0x00000003, 0x4062C422, 0x4063B820, 0x40646A20, 0x00000003, - 0x4062C423, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C421, 0x4063B820, - 0x40647220, 0x00000003, 0x4062C422, 0x4063B820, - // Block 568, offset 0x8e00 - 0x40647220, 0x00000003, 0x4062C423, 0x4063B820, 0x40647220, 0x00000003, - 0x4062C421, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C422, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062C423, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062C424, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C425, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062C426, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062C427, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C428, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062C429, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062C42A, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C42B, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062C42C, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062C42D, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C42E, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062C42F, 0x4063B820, - // Block 569, offset 0x8e40 - 0x40648C20, 0x00000003, 0x4062C430, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062C431, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C432, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062C433, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062C434, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C435, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062C436, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062C437, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C438, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062C439, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062C43A, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C43B, 0x4063B820, - 0x40648C20, 0x00000002, 0x4062C421, 0x4063BA20, 0x00000002, 0x4062C422, - 0x4063BA20, 0x00000002, 0x4062C423, 0x4063BA20, 0x00000002, 0x4062C424, - 0x4063BA20, 0x00000002, 0x4062C425, 0x4063BA20, - // Block 570, offset 0x8e80 - 0x00000002, 0x4062C426, 0x4063BA20, 0x00000002, 0x4062C427, 0x4063BA20, - 0x00000002, 0x4062C428, 0x4063BA20, 0x00000002, 0x4062C429, 0x4063BA20, - 0x00000002, 0x4062C421, 0x4063BE20, 0x00000002, 0x4062C421, 0x4063C220, - 0x00000002, 0x4062C422, 0x4063C220, 0x00000002, 0x4062C423, 0x4063C220, - 0x00000002, 0x4062C424, 0x4063C220, 0x00000002, 0x4062C425, 0x4063C220, - 0x00000002, 0x4062C426, 0x4063C220, 0x00000002, 0x4062C427, 0x4063C220, - 0x00000002, 0x4062C428, 0x4063C220, 0x00000002, 0x4062C429, 0x4063C220, - 0x00000002, 0x4062C42A, 0x4063C220, 0x00000002, 0x4062C42B, 0x4063C220, - 0x00000002, 0x4062C42C, 0x4063C220, 0x00000002, 0x4062C42D, 0x4063C220, - 0x00000002, 0x4062C42E, 0x4063C220, 0x00000002, 0x4062C42F, 0x4063C220, - 0x00000002, 0x4062C430, 0x4063C220, 0x00000002, - // Block 571, offset 0x8ec0 - 0x4062C431, 0x4063C220, 0x00000002, 0x4062C432, 0x4063C220, 0x00000002, - 0x4062C433, 0x4063C220, 0x00000002, 0x4062C434, 0x4063C220, 0x00000002, - 0x4062C435, 0x4063C220, 0x00000002, 0x4062C436, 0x4063C220, 0x00000002, - 0x4062C437, 0x4063C220, 0x00000002, 0x4062C438, 0x4063C220, 0x00000002, - 0x4062C439, 0x4063C220, 0x00000002, 0x4062C43A, 0x4063C220, 0x00000002, - 0x4062C43B, 0x4063C220, 0x00000002, 0x4062C43C, 0x4063C220, 0x00000002, - 0x4062C43D, 0x4063C220, 0x00000002, 0x4062C43E, 0x4063C220, 0x00000002, - 0x4062C43F, 0x4063C220, 0x00000002, 0x4062C440, 0x4063C220, 0x00000002, - 0x4062C441, 0x4063C220, 0x00000002, 0x4062C442, 0x4063C220, 0x00000002, - 0x4062C443, 0x4063C220, 0x00000002, 0x4062C444, 0x4063C220, 0x00000002, - 0x4062C445, 0x4063C220, 0x00000002, 0x4062C446, - // Block 572, offset 0x8f00 - 0x4063C220, 0x00000002, 0x4062C447, 0x4063C220, 0x00000002, 0x4062C448, - 0x4063C220, 0x00000002, 0x4062C449, 0x4063C220, 0x00000002, 0x4062C44A, - 0x4063C220, 0x00000002, 0x4062C44B, 0x4063C220, 0x00000002, 0x4062C44C, - 0x4063C220, 0x00000002, 0x4062C44D, 0x4063C220, 0x00000002, 0x4062C44E, - 0x4063C220, 0x00000002, 0x4062C44F, 0x4063C220, 0x00000002, 0x4062C450, - 0x4063C220, 0x00000002, 0x4062C451, 0x4063C220, 0x00000002, 0x4062C452, - 0x4063C220, 0x00000002, 0x4062C453, 0x4063C220, 0x00000002, 0x4062C454, - 0x4063C220, 0x00000002, 0x4062C455, 0x4063C220, 0x00000002, 0x4062C456, - 0x4063C220, 0x00000002, 0x4062C457, 0x4063C220, 0x00000002, 0x4062C458, - 0x4063C220, 0x00000002, 0x4062C459, 0x4063C220, 0x00000002, 0x4062C45A, - 0x4063C220, 0x00000002, 0x4062C45B, 0x4063C220, - // Block 573, offset 0x8f40 - 0x00000002, 0x4062C45C, 0x4063C220, 0x00000002, 0x4062C45D, 0x4063C220, - 0x00000002, 0x4062C45E, 0x4063C220, 0x00000003, 0x4062C421, 0x4063C220, - 0x40646420, 0x00000003, 0x4062C422, 0x4063C220, 0x40646420, 0x00000003, - 0x4062C421, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C422, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062C423, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062C424, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C425, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062C426, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062C427, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C428, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062C429, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062C42A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C42B, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062C42C, 0x4063C220, - // Block 574, offset 0x8f80 - 0x40646A20, 0x00000003, 0x4062C42D, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062C42E, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C42F, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062C430, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062C431, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C432, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062C433, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062C434, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C435, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062C436, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062C437, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C438, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062C439, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062C43A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C43B, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062C43C, 0x4063C220, - // Block 575, offset 0x8fc0 - 0x40646A20, 0x00000003, 0x4062C43D, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062C43E, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C43F, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062C440, 0x4063C220, 0x40646A20, 0x00000003, - 0x4062C441, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C442, 0x4063C220, - 0x40646A20, 0x00000003, 0x4062C421, 0x4063C220, 0x40647220, 0x00000003, - 0x4062C422, 0x4063C220, 0x40647220, 0x00000003, 0x4062C421, 0x4063C220, - 0x40648C20, 0x00000003, 0x4062C422, 0x4063C220, 0x40648C20, 0x00000003, - 0x4062C423, 0x4063C220, 0x40648C20, 0x00000003, 0x4062C424, 0x4063C220, - 0x40648C20, 0x00000003, 0x4062C425, 0x4063C220, 0x40648C20, 0x00000003, - 0x4062C421, 0x4063CC20, 0x40646420, 0x00000003, 0x4062C422, 0x4063CC20, - 0x40646420, 0x00000003, 0x4062C423, 0x4063CC20, - // Block 576, offset 0x9000 - 0x40646420, 0x00000003, 0x4062C421, 0x4063CC20, 0x40647220, 0x00000003, - 0x4062C422, 0x4063CC20, 0x40647220, 0x00000003, 0x4062C421, 0x4063CC20, - 0x40648420, 0x00000003, 0x4062C422, 0x4063CC20, 0x40648420, 0x00000003, - 0x4062C423, 0x4063CC20, 0x40648420, 0x00000003, 0x4062C424, 0x4063CC20, - 0x40648420, 0x00000003, 0x4062C425, 0x4063CC20, 0x40648420, 0x00000003, - 0x4062C421, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C422, 0x4063CC20, - 0x40648C20, 0x00000003, 0x4062C423, 0x4063CC20, 0x40648C20, 0x00000003, - 0x4062C424, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C425, 0x4063CC20, - 0x40648C20, 0x00000003, 0x4062C426, 0x4063CC20, 0x40648C20, 0x00000003, - 0x4062C427, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C428, 0x4063CC20, - 0x40648C20, 0x00000003, 0x4062C429, 0x4063CC20, - // Block 577, offset 0x9040 - 0x40648C20, 0x00000003, 0x4062C42A, 0x4063CC20, 0x40648C20, 0x00000003, - 0x4062C42B, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C42C, 0x4063CC20, - 0x40648C20, 0x00000003, 0x4062C42D, 0x4063CC20, 0x40648C20, 0x00000003, - 0x4062C42E, 0x4063CC20, 0x40648C20, 0x00000002, 0x4062C421, 0x4063D020, - 0x00000002, 0x4062C422, 0x4063D020, 0x00000002, 0x4062C423, 0x4063D020, - 0x00000002, 0x4062C424, 0x4063D020, 0x00000002, 0x4062C425, 0x4063D020, - 0x00000002, 0x4062C426, 0x4063D020, 0x00000002, 0x4062C427, 0x4063D020, - 0x00000002, 0x4062C428, 0x4063D020, 0x00000002, 0x4062C429, 0x4063D020, - 0x00000002, 0x4062C42A, 0x4063D020, 0x00000002, 0x4062C42B, 0x4063D020, - 0x00000002, 0x4062C42C, 0x4063D020, 0x00000002, 0x4062C42D, 0x4063D020, - 0x00000002, 0x4062C42E, 0x4063D020, 0x00000002, - // Block 578, offset 0x9080 - 0x4062C42F, 0x4063D020, 0x00000002, 0x4062C430, 0x4063D020, 0x00000002, - 0x4062C431, 0x4063D020, 0x00000002, 0x4062C432, 0x4063D020, 0x00000002, - 0x4062C433, 0x4063D020, 0x00000002, 0x4062C434, 0x4063D020, 0x00000002, - 0x4062C435, 0x4063D020, 0x00000002, 0x4062C436, 0x4063D020, 0x00000002, - 0x4062C437, 0x4063D020, 0x00000002, 0x4062C438, 0x4063D020, 0x00000002, - 0x4062C439, 0x4063D020, 0x00000002, 0x4062C43A, 0x4063D020, 0x00000002, - 0x4062C43B, 0x4063D020, 0x00000002, 0x4062C43C, 0x4063D020, 0x00000002, - 0x4062C43D, 0x4063D020, 0x00000002, 0x4062C43E, 0x4063D020, 0x00000002, - 0x4062C43F, 0x4063D020, 0x00000002, 0x4062C440, 0x4063D020, 0x00000002, - 0x4062C441, 0x4063D020, 0x00000002, 0x4062C442, 0x4063D020, 0x00000002, - 0x4062C443, 0x4063D020, 0x00000002, 0x4062C444, - // Block 579, offset 0x90c0 - 0x4063D020, 0x00000002, 0x4062C445, 0x4063D020, 0x00000002, 0x4062C446, - 0x4063D020, 0x00000002, 0x4062C447, 0x4063D020, 0x00000002, 0x4062C448, - 0x4063D020, 0x00000002, 0x4062C449, 0x4063D020, 0x00000002, 0x4062C44A, - 0x4063D020, 0x00000002, 0x4062C44B, 0x4063D020, 0x00000002, 0x4062C44C, - 0x4063D020, 0x00000002, 0x4062C44D, 0x4063D020, 0x00000002, 0x4062C44E, - 0x4063D020, 0x00000002, 0x4062C44F, 0x4063D020, 0x00000002, 0x4062C450, - 0x4063D020, 0x00000003, 0x4062C421, 0x4063D020, 0x40646420, 0x00000003, - 0x4062C422, 0x4063D020, 0x40646420, 0x00000003, 0x4062C423, 0x4063D020, - 0x40646420, 0x00000003, 0x4062C424, 0x4063D020, 0x40646420, 0x00000003, - 0x4062C425, 0x4063D020, 0x40646420, 0x00000003, 0x4062C426, 0x4063D020, - 0x40646420, 0x00000003, 0x4062C421, 0x4063D020, - // Block 580, offset 0x9100 - 0x40646A20, 0x00000003, 0x4062C422, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C423, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C424, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C425, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C426, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C427, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C428, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C429, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C42A, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C42B, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C42C, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C42D, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C42E, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C42F, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C430, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C431, 0x4063D020, - // Block 581, offset 0x9140 - 0x40646A20, 0x00000003, 0x4062C432, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C433, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C434, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C435, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C436, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C437, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C438, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C439, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C43A, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C43B, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C43C, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C43D, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C43E, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C43F, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C440, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C441, 0x4063D020, - // Block 582, offset 0x9180 - 0x40646A20, 0x00000003, 0x4062C442, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C443, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C444, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C445, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C446, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C447, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C448, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C449, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C44A, 0x4063D020, - 0x40646A20, 0x00000003, 0x4062C44B, 0x4063D020, 0x40646A20, 0x00000003, - 0x4062C44C, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C421, 0x4063D020, - 0x40647220, 0x00000003, 0x4062C422, 0x4063D020, 0x40647220, 0x00000003, - 0x4062C423, 0x4063D020, 0x40647220, 0x00000003, 0x4062C424, 0x4063D020, - 0x40647220, 0x00000003, 0x4062C425, 0x4063D020, - // Block 583, offset 0x91c0 - 0x40647220, 0x00000003, 0x4062C426, 0x4063D020, 0x40647220, 0x00000003, - 0x4062C427, 0x4063D020, 0x40647220, 0x00000003, 0x4062C428, 0x4063D020, - 0x40647220, 0x00000003, 0x4062C429, 0x4063D020, 0x40647220, 0x00000003, - 0x4062C42A, 0x4063D020, 0x40647220, 0x00000003, 0x4062C42B, 0x4063D020, - 0x40647220, 0x00000003, 0x4062C42C, 0x4063D020, 0x40647220, 0x00000003, - 0x4062C42D, 0x4063D020, 0x40647220, 0x00000003, 0x4062C42E, 0x4063D020, - 0x40647220, 0x00000003, 0x4062C42F, 0x4063D020, 0x40647220, 0x00000003, - 0x4062C430, 0x4063D020, 0x40647220, 0x00000003, 0x4062C431, 0x4063D020, - 0x40647220, 0x00000003, 0x4062C432, 0x4063D020, 0x40647220, 0x00000003, - 0x4062C433, 0x4063D020, 0x40647220, 0x00000003, 0x4062C434, 0x4063D020, - 0x40647220, 0x00000003, 0x4062C421, 0x4063D020, - // Block 584, offset 0x9200 - 0x40648220, 0x00000003, 0x4062C422, 0x4063D020, 0x40648220, 0x00000003, - 0x4062C423, 0x4063D020, 0x40648220, 0x00000003, 0x4062C421, 0x4063D020, - 0x40648420, 0x00000003, 0x4062C422, 0x4063D020, 0x40648420, 0x00000003, - 0x4062C423, 0x4063D020, 0x40648420, 0x00000003, 0x4062C424, 0x4063D020, - 0x40648420, 0x00000003, 0x4062C425, 0x4063D020, 0x40648420, 0x00000003, - 0x4062C426, 0x4063D020, 0x40648420, 0x00000003, 0x4062C427, 0x4063D020, - 0x40648420, 0x00000003, 0x4062C428, 0x4063D020, 0x40648420, 0x00000003, - 0x4062C421, 0x4063D020, 0x40648C20, 0x00000003, 0x4062C422, 0x4063D020, - 0x40648C20, 0x00000003, 0x4062C423, 0x4063D020, 0x40648C20, 0x00000003, - 0x4062C424, 0x4063D020, 0x40648C20, 0x00000003, 0x4062C425, 0x4063D020, - 0x40648C20, 0x00000003, 0x4062C426, 0x4063D020, - // Block 585, offset 0x9240 - 0x40648C20, 0x00000003, 0x4062C427, 0x4063D020, 0x40648C20, 0x00000002, - 0x4062C821, 0x4063A820, 0x00000002, 0x4062C822, 0x4063A820, 0x00000002, - 0x4062C823, 0x4063A820, 0x00000002, 0x4062C824, 0x4063A820, 0x00000002, - 0x4062C825, 0x4063A820, 0x00000002, 0x4062C826, 0x4063A820, 0x00000002, - 0x4062C827, 0x4063A820, 0x00000002, 0x4062C828, 0x4063A820, 0x00000002, - 0x4062C829, 0x4063A820, 0x00000002, 0x4062C82A, 0x4063A820, 0x00000002, - 0x4062C82B, 0x4063A820, 0x00000002, 0x4062C82C, 0x4063A820, 0x00000002, - 0x4062C82D, 0x4063A820, 0x00000002, 0x4062C82E, 0x4063A820, 0x00000002, - 0x4062C82F, 0x4063A820, 0x00000002, 0x4062C830, 0x4063A820, 0x00000002, - 0x4062C831, 0x4063A820, 0x00000002, 0x4062C832, 0x4063A820, 0x00000002, - 0x4062C833, 0x4063A820, 0x00000002, 0x4062C834, - // Block 586, offset 0x9280 - 0x4063A820, 0x00000002, 0x4062C835, 0x4063A820, 0x00000002, 0x4062C836, - 0x4063A820, 0x00000003, 0x4062C821, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C822, 0x4063A820, 0x40646420, 0x00000003, 0x4062C823, 0x4063A820, - 0x40646420, 0x00000003, 0x4062C824, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C825, 0x4063A820, 0x40646420, 0x00000003, 0x4062C826, 0x4063A820, - 0x40646420, 0x00000003, 0x4062C827, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C828, 0x4063A820, 0x40646420, 0x00000003, 0x4062C829, 0x4063A820, - 0x40646420, 0x00000003, 0x4062C82A, 0x4063A820, 0x40646420, 0x00000003, - 0x4062C821, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C822, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062C823, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062C824, 0x4063A820, 0x40646A20, 0x00000003, - // Block 587, offset 0x92c0 - 0x4062C825, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C826, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062C827, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062C828, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C829, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062C82A, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062C82B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C82C, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062C82D, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062C82E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C82F, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062C830, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062C831, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C832, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062C833, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062C834, 0x4063A820, 0x40646A20, 0x00000003, - // Block 588, offset 0x9300 - 0x4062C835, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C836, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062C837, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062C821, 0x4063A820, 0x40647220, 0x00000003, 0x4062C822, 0x4063A820, - 0x40647220, 0x00000003, 0x4062C823, 0x4063A820, 0x40647220, 0x00000003, - 0x4062C824, 0x4063A820, 0x40647220, 0x00000003, 0x4062C825, 0x4063A820, - 0x40647220, 0x00000003, 0x4062C826, 0x4063A820, 0x40647220, 0x00000003, - 0x4062C827, 0x4063A820, 0x40647220, 0x00000003, 0x4062C821, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C822, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C823, 0x4063A820, 0x40648220, 0x00000003, 0x4062C824, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C825, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C826, 0x4063A820, 0x40648220, 0x00000003, - // Block 589, offset 0x9340 - 0x4062C827, 0x4063A820, 0x40648220, 0x00000003, 0x4062C828, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C829, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C82A, 0x4063A820, 0x40648220, 0x00000003, 0x4062C82B, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C82C, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C82D, 0x4063A820, 0x40648220, 0x00000003, 0x4062C82E, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C82F, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C830, 0x4063A820, 0x40648220, 0x00000003, 0x4062C831, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C832, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C833, 0x4063A820, 0x40648220, 0x00000003, 0x4062C834, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C835, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C836, 0x4063A820, 0x40648220, 0x00000003, - // Block 590, offset 0x9380 - 0x4062C837, 0x4063A820, 0x40648220, 0x00000003, 0x4062C838, 0x4063A820, - 0x40648220, 0x00000003, 0x4062C839, 0x4063A820, 0x40648220, 0x00000003, - 0x4062C83A, 0x4063A820, 0x40648220, 0x00000003, 0x4062C821, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C822, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C823, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C824, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C825, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C826, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C827, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C828, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C829, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C82A, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C82B, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C82C, 0x4063A820, 0x40648C20, 0x00000003, - // Block 591, offset 0x93c0 - 0x4062C82D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C82E, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C82F, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C830, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C831, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C832, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C833, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C834, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C835, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C836, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C837, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C838, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C839, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C83A, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C83B, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C83C, 0x4063A820, 0x40648C20, 0x00000003, - // Block 592, offset 0x9400 - 0x4062C83D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C83E, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C83F, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C840, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C841, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C842, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C843, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C844, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C845, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C846, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C847, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062C848, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062C849, 0x4063A820, 0x40648C20, 0x00000002, 0x4062C821, 0x4063AA20, - 0x00000002, 0x4062C822, 0x4063AA20, 0x00000002, 0x4062C823, 0x4063AA20, - 0x00000002, 0x4062C824, 0x4063AA20, 0x00000002, - // Block 593, offset 0x9440 - 0x4062C825, 0x4063AA20, 0x00000002, 0x4062C826, 0x4063AA20, 0x00000002, - 0x4062C827, 0x4063AA20, 0x00000002, 0x4062C828, 0x4063AA20, 0x00000002, - 0x4062C829, 0x4063AA20, 0x00000002, 0x4062C82A, 0x4063AA20, 0x00000002, - 0x4062C82B, 0x4063AA20, 0x00000002, 0x4062C82C, 0x4063AA20, 0x00000002, - 0x4062C82D, 0x4063AA20, 0x00000002, 0x4062C82E, 0x4063AA20, 0x00000003, - 0x4062C821, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C822, 0x4063AA20, - 0x40646420, 0x00000003, 0x4062C823, 0x4063AA20, 0x40646420, 0x00000003, - 0x4062C824, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C825, 0x4063AA20, - 0x40646420, 0x00000003, 0x4062C826, 0x4063AA20, 0x40646420, 0x00000003, - 0x4062C827, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C828, 0x4063AA20, - 0x40646420, 0x00000003, 0x4062C829, 0x4063AA20, - // Block 594, offset 0x9480 - 0x40646420, 0x00000003, 0x4062C82A, 0x4063AA20, 0x40646420, 0x00000002, - 0x4062C821, 0x4063B020, 0x00000002, 0x4062C822, 0x4063B020, 0x00000002, - 0x4062C823, 0x4063B020, 0x00000002, 0x4062C824, 0x4063B020, 0x00000002, - 0x4062C825, 0x4063B020, 0x00000002, 0x4062C826, 0x4063B020, 0x00000002, - 0x4062C827, 0x4063B020, 0x00000002, 0x4062C828, 0x4063B020, 0x00000002, - 0x4062C829, 0x4063B020, 0x00000003, 0x4062C821, 0x4063B020, 0x40646420, - 0x00000003, 0x4062C822, 0x4063B020, 0x40646420, 0x00000003, 0x4062C823, - 0x4063B020, 0x40646420, 0x00000003, 0x4062C824, 0x4063B020, 0x40646420, - 0x00000003, 0x4062C825, 0x4063B020, 0x40646420, 0x00000003, 0x4062C826, - 0x4063B020, 0x40646420, 0x00000003, 0x4062C827, 0x4063B020, 0x40646420, - 0x00000003, 0x4062C828, 0x4063B020, 0x40646420, - // Block 595, offset 0x94c0 - 0x00000003, 0x4062C829, 0x4063B020, 0x40646420, 0x00000003, 0x4062C82A, - 0x4063B020, 0x40646420, 0x00000003, 0x4062C82B, 0x4063B020, 0x40646420, - 0x00000003, 0x4062C82C, 0x4063B020, 0x40646420, 0x00000003, 0x4062C82D, - 0x4063B020, 0x40646420, 0x00000003, 0x4062C82E, 0x4063B020, 0x40646420, - 0x00000003, 0x4062C82F, 0x4063B020, 0x40646420, 0x00000003, 0x4062C830, - 0x4063B020, 0x40646420, 0x00000003, 0x4062C831, 0x4063B020, 0x40646420, - 0x00000003, 0x4062C832, 0x4063B020, 0x40646420, 0x00000003, 0x4062C833, - 0x4063B020, 0x40646420, 0x00000003, 0x4062C834, 0x4063B020, 0x40646420, - 0x00000003, 0x4062C835, 0x4063B020, 0x40646420, 0x00000003, 0x4062C836, - 0x4063B020, 0x40646420, 0x00000003, 0x4062C837, 0x4063B020, 0x40646420, - 0x00000003, 0x4062C821, 0x4063B020, 0x40646A20, - // Block 596, offset 0x9500 - 0x00000003, 0x4062C822, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C823, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062C824, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062C825, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C826, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062C827, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062C828, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C829, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062C82A, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062C82B, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C82C, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062C82D, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062C82E, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C82F, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062C830, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062C831, 0x4063B020, 0x40646A20, - // Block 597, offset 0x9540 - 0x00000003, 0x4062C832, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C833, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062C834, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062C835, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C836, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062C837, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062C838, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C839, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062C83A, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062C83B, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C83C, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062C83D, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062C83E, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C83F, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062C840, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062C841, 0x4063B020, 0x40646A20, - // Block 598, offset 0x9580 - 0x00000003, 0x4062C842, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C843, - 0x4063B020, 0x40646A20, 0x00000003, 0x4062C844, 0x4063B020, 0x40646A20, - 0x00000003, 0x4062C845, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C821, - 0x4063B020, 0x40647220, 0x00000003, 0x4062C822, 0x4063B020, 0x40647220, - 0x00000003, 0x4062C823, 0x4063B020, 0x40647220, 0x00000003, 0x4062C824, - 0x4063B020, 0x40647220, 0x00000003, 0x4062C825, 0x4063B020, 0x40647220, - 0x00000003, 0x4062C826, 0x4063B020, 0x40647220, 0x00000003, 0x4062C827, - 0x4063B020, 0x40647220, 0x00000003, 0x4062C828, 0x4063B020, 0x40647220, - 0x00000003, 0x4062C829, 0x4063B020, 0x40647220, 0x00000003, 0x4062C82A, - 0x4063B020, 0x40647220, 0x00000003, 0x4062C82B, 0x4063B020, 0x40647220, - 0x00000003, 0x4062C82C, 0x4063B020, 0x40647220, - // Block 599, offset 0x95c0 - 0x00000003, 0x4062C82D, 0x4063B020, 0x40647220, 0x00000003, 0x4062C82E, - 0x4063B020, 0x40647220, 0x00000003, 0x4062C82F, 0x4063B020, 0x40647220, - 0x00000003, 0x4062C830, 0x4063B020, 0x40647220, 0x00000003, 0x4062C831, - 0x4063B020, 0x40647220, 0x00000003, 0x4062C832, 0x4063B020, 0x40647220, - 0x00000003, 0x4062C833, 0x4063B020, 0x40647220, 0x00000003, 0x4062C834, - 0x4063B020, 0x40647220, 0x00000003, 0x4062C821, 0x4063B020, 0x40648220, - 0x00000003, 0x4062C822, 0x4063B020, 0x40648220, 0x00000003, 0x4062C823, - 0x4063B020, 0x40648220, 0x00000003, 0x4062C824, 0x4063B020, 0x40648220, - 0x00000003, 0x4062C825, 0x4063B020, 0x40648220, 0x00000003, 0x4062C826, - 0x4063B020, 0x40648220, 0x00000003, 0x4062C827, 0x4063B020, 0x40648220, - 0x00000003, 0x4062C828, 0x4063B020, 0x40648220, - // Block 600, offset 0x9600 - 0x00000003, 0x4062C829, 0x4063B020, 0x40648220, 0x00000003, 0x4062C82A, - 0x4063B020, 0x40648220, 0x00000003, 0x4062C82B, 0x4063B020, 0x40648220, - 0x00000003, 0x4062C82C, 0x4063B020, 0x40648220, 0x00000003, 0x4062C82D, - 0x4063B020, 0x40648220, 0x00000003, 0x4062C82E, 0x4063B020, 0x40648220, - 0x00000003, 0x4062C82F, 0x4063B020, 0x40648220, 0x00000003, 0x4062C830, - 0x4063B020, 0x40648220, 0x00000003, 0x4062C831, 0x4063B020, 0x40648220, - 0x00000003, 0x4062C832, 0x4063B020, 0x40648220, 0x00000003, 0x4062C821, - 0x4063B020, 0x40648420, 0x00000003, 0x4062C822, 0x4063B020, 0x40648420, - 0x00000003, 0x4062C823, 0x4063B020, 0x40648420, 0x00000003, 0x4062C824, - 0x4063B020, 0x40648420, 0x00000003, 0x4062C825, 0x4063B020, 0x40648420, - 0x00000003, 0x4062C826, 0x4063B020, 0x40648420, - // Block 601, offset 0x9640 - 0x00000003, 0x4062C827, 0x4063B020, 0x40648420, 0x00000003, 0x4062C828, - 0x4063B020, 0x40648420, 0x00000003, 0x4062C829, 0x4063B020, 0x40648420, - 0x00000003, 0x4062C82A, 0x4063B020, 0x40648420, 0x00000003, 0x4062C82B, - 0x4063B020, 0x40648420, 0x00000003, 0x4062C82C, 0x4063B020, 0x40648420, - 0x00000003, 0x4062C82D, 0x4063B020, 0x40648420, 0x00000003, 0x4062C82E, - 0x4063B020, 0x40648420, 0x00000003, 0x4062C82F, 0x4063B020, 0x40648420, - 0x00000003, 0x4062C821, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C822, - 0x4063B020, 0x40648C20, 0x00000003, 0x4062C823, 0x4063B020, 0x40648C20, - 0x00000003, 0x4062C824, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C825, - 0x4063B020, 0x40648C20, 0x00000003, 0x4062C826, 0x4063B020, 0x40648C20, - 0x00000003, 0x4062C827, 0x4063B020, 0x40648C20, - // Block 602, offset 0x9680 - 0x00000003, 0x4062C828, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C829, - 0x4063B020, 0x40648C20, 0x00000003, 0x4062C82A, 0x4063B020, 0x40648C20, - 0x00000003, 0x4062C82B, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C82C, - 0x4063B020, 0x40648C20, 0x00000002, 0x4062C821, 0x4063B220, 0x00000002, - 0x4062C822, 0x4063B220, 0x00000002, 0x4062C823, 0x4063B220, 0x00000002, - 0x4062C824, 0x4063B220, 0x00000002, 0x4062C825, 0x4063B220, 0x00000002, - 0x4062C826, 0x4063B220, 0x00000002, 0x4062C827, 0x4063B220, 0x00000002, - 0x4062C828, 0x4063B220, 0x00000002, 0x4062C829, 0x4063B220, 0x00000002, - 0x4062C82A, 0x4063B220, 0x00000002, 0x4062C82B, 0x4063B220, 0x00000002, - 0x4062C82C, 0x4063B220, 0x00000002, 0x4062C82D, 0x4063B220, 0x00000002, - 0x4062C82E, 0x4063B220, 0x00000002, 0x4062C82F, - // Block 603, offset 0x96c0 - 0x4063B220, 0x00000002, 0x4062C830, 0x4063B220, 0x00000002, 0x4062C831, - 0x4063B220, 0x00000002, 0x4062C832, 0x4063B220, 0x00000002, 0x4062C833, - 0x4063B220, 0x00000002, 0x4062C834, 0x4063B220, 0x00000002, 0x4062C821, - 0x4063B820, 0x00000002, 0x4062C822, 0x4063B820, 0x00000002, 0x4062C823, - 0x4063B820, 0x00000002, 0x4062C824, 0x4063B820, 0x00000002, 0x4062C825, - 0x4063B820, 0x00000002, 0x4062C826, 0x4063B820, 0x00000002, 0x4062C827, - 0x4063B820, 0x00000002, 0x4062C828, 0x4063B820, 0x00000002, 0x4062C829, - 0x4063B820, 0x00000002, 0x4062C82A, 0x4063B820, 0x00000002, 0x4062C82B, - 0x4063B820, 0x00000002, 0x4062C82C, 0x4063B820, 0x00000002, 0x4062C82D, - 0x4063B820, 0x00000002, 0x4062C82E, 0x4063B820, 0x00000002, 0x4062C82F, - 0x4063B820, 0x00000002, 0x4062C830, 0x4063B820, - // Block 604, offset 0x9700 - 0x00000002, 0x4062C831, 0x4063B820, 0x00000002, 0x4062C832, 0x4063B820, - 0x00000002, 0x4062C833, 0x4063B820, 0x00000002, 0x4062C834, 0x4063B820, - 0x00000002, 0x4062C835, 0x4063B820, 0x00000002, 0x4062C836, 0x4063B820, - 0x00000002, 0x4062C837, 0x4063B820, 0x00000002, 0x4062C838, 0x4063B820, - 0x00000002, 0x4062C839, 0x4063B820, 0x00000002, 0x4062C83A, 0x4063B820, - 0x00000002, 0x4062C83B, 0x4063B820, 0x00000002, 0x4062C83C, 0x4063B820, - 0x00000002, 0x4062C83D, 0x4063B820, 0x00000002, 0x4062C83E, 0x4063B820, - 0x00000002, 0x4062C83F, 0x4063B820, 0x00000002, 0x4062C840, 0x4063B820, - 0x00000002, 0x4062C841, 0x4063B820, 0x00000002, 0x4062C842, 0x4063B820, - 0x00000002, 0x4062C843, 0x4063B820, 0x00000002, 0x4062C844, 0x4063B820, - 0x00000002, 0x4062C845, 0x4063B820, 0x00000002, - // Block 605, offset 0x9740 - 0x4062C846, 0x4063B820, 0x00000002, 0x4062C847, 0x4063B820, 0x00000002, - 0x4062C848, 0x4063B820, 0x00000002, 0x4062C849, 0x4063B820, 0x00000002, - 0x4062C84A, 0x4063B820, 0x00000002, 0x4062C84B, 0x4063B820, 0x00000002, - 0x4062C84C, 0x4063B820, 0x00000002, 0x4062C84D, 0x4063B820, 0x00000002, - 0x4062C84E, 0x4063B820, 0x00000002, 0x4062C84F, 0x4063B820, 0x00000002, - 0x4062C850, 0x4063B820, 0x00000002, 0x4062C851, 0x4063B820, 0x00000002, - 0x4062C852, 0x4063B820, 0x00000002, 0x4062C853, 0x4063B820, 0x00000002, - 0x4062C854, 0x4063B820, 0x00000002, 0x4062C855, 0x4063B820, 0x00000002, - 0x4062C856, 0x4063B820, 0x00000002, 0x4062C857, 0x4063B820, 0x00000002, - 0x4062C858, 0x4063B820, 0x00000003, 0x4062C821, 0x4063B820, 0x40646420, - 0x00000003, 0x4062C822, 0x4063B820, 0x40646420, - // Block 606, offset 0x9780 - 0x00000003, 0x4062C823, 0x4063B820, 0x40646420, 0x00000003, 0x4062C824, - 0x4063B820, 0x40646420, 0x00000003, 0x4062C825, 0x4063B820, 0x40646420, - 0x00000003, 0x4062C826, 0x4063B820, 0x40646420, 0x00000003, 0x4062C827, - 0x4063B820, 0x40646420, 0x00000003, 0x4062C828, 0x4063B820, 0x40646420, - 0x00000003, 0x4062C829, 0x4063B820, 0x40646420, 0x00000003, 0x4062C82A, - 0x4063B820, 0x40646420, 0x00000003, 0x4062C82B, 0x4063B820, 0x40646420, - 0x00000003, 0x4062C82C, 0x4063B820, 0x40646420, 0x00000003, 0x4062C821, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062C822, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062C823, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C824, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062C825, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062C821, 0x4063B820, 0x40648C20, - // Block 607, offset 0x97c0 - 0x00000003, 0x4062C822, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C823, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062C824, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062C825, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C826, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062C827, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062C828, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C829, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062C82A, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062C82B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C82C, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062C82D, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062C82E, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C82F, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062C821, 0x4063BA20, 0x40647220, - 0x00000002, 0x4062C821, 0x4063BE20, 0x00000002, - // Block 608, offset 0x9800 - 0x4062C822, 0x4063BE20, 0x00000002, 0x4062C823, 0x4063BE20, 0x00000002, - 0x4062C824, 0x4063BE20, 0x00000002, 0x4062C825, 0x4063BE20, 0x00000002, - 0x4062C826, 0x4063BE20, 0x00000002, 0x4062C827, 0x4063BE20, 0x00000002, - 0x4062C828, 0x4063BE20, 0x00000002, 0x4062C829, 0x4063BE20, 0x00000002, - 0x4062C82A, 0x4063BE20, 0x00000002, 0x4062C82B, 0x4063BE20, 0x00000002, - 0x4062C821, 0x4063C220, 0x00000002, 0x4062C822, 0x4063C220, 0x00000002, - 0x4062C823, 0x4063C220, 0x00000002, 0x4062C824, 0x4063C220, 0x00000002, - 0x4062C825, 0x4063C220, 0x00000002, 0x4062C826, 0x4063C220, 0x00000002, - 0x4062C827, 0x4063C220, 0x00000002, 0x4062C828, 0x4063C220, 0x00000002, - 0x4062C829, 0x4063C220, 0x00000002, 0x4062C82A, 0x4063C220, 0x00000002, - 0x4062C82B, 0x4063C220, 0x00000002, 0x4062C82C, - // Block 609, offset 0x9840 - 0x4063C220, 0x00000002, 0x4062C82D, 0x4063C220, 0x00000002, 0x4062C82E, - 0x4063C220, 0x00000002, 0x4062C82F, 0x4063C220, 0x00000002, 0x4062C830, - 0x4063C220, 0x00000002, 0x4062C831, 0x4063C220, 0x00000002, 0x4062C832, - 0x4063C220, 0x00000002, 0x4062C833, 0x4063C220, 0x00000002, 0x4062C834, - 0x4063C220, 0x00000002, 0x4062C835, 0x4063C220, 0x00000002, 0x4062C836, - 0x4063C220, 0x00000002, 0x4062C837, 0x4063C220, 0x00000002, 0x4062C838, - 0x4063C220, 0x00000002, 0x4062C839, 0x4063C220, 0x00000002, 0x4062C83A, - 0x4063C220, 0x00000002, 0x4062C83B, 0x4063C220, 0x00000002, 0x4062C83C, - 0x4063C220, 0x00000002, 0x4062C83D, 0x4063C220, 0x00000002, 0x4062C83E, - 0x4063C220, 0x00000002, 0x4062C83F, 0x4063C220, 0x00000002, 0x4062C840, - 0x4063C220, 0x00000002, 0x4062C841, 0x4063C220, - // Block 610, offset 0x9880 - 0x00000002, 0x4062C842, 0x4063C220, 0x00000002, 0x4062C843, 0x4063C220, - 0x00000002, 0x4062C844, 0x4063C220, 0x00000002, 0x4062C845, 0x4063C220, - 0x00000002, 0x4062C846, 0x4063C220, 0x00000002, 0x4062C847, 0x4063C220, - 0x00000002, 0x4062C848, 0x4063C220, 0x00000002, 0x4062C849, 0x4063C220, - 0x00000002, 0x4062C84A, 0x4063C220, 0x00000002, 0x4062C84B, 0x4063C220, - 0x00000002, 0x4062C84C, 0x4063C220, 0x00000002, 0x4062C84D, 0x4063C220, - 0x00000002, 0x4062C84E, 0x4063C220, 0x00000002, 0x4062C84F, 0x4063C220, - 0x00000002, 0x4062C850, 0x4063C220, 0x00000002, 0x4062C851, 0x4063C220, - 0x00000002, 0x4062C852, 0x4063C220, 0x00000002, 0x4062C853, 0x4063C220, - 0x00000003, 0x4062C821, 0x4063C220, 0x40646420, 0x00000003, 0x4062C822, - 0x4063C220, 0x40646420, 0x00000003, 0x4062C823, - // Block 611, offset 0x98c0 - 0x4063C220, 0x40646420, 0x00000003, 0x4062C824, 0x4063C220, 0x40646420, - 0x00000003, 0x4062C825, 0x4063C220, 0x40646420, 0x00000003, 0x4062C826, - 0x4063C220, 0x40646420, 0x00000003, 0x4062C827, 0x4063C220, 0x40646420, - 0x00000003, 0x4062C828, 0x4063C220, 0x40646420, 0x00000003, 0x4062C829, - 0x4063C220, 0x40646420, 0x00000003, 0x4062C82A, 0x4063C220, 0x40646420, - 0x00000003, 0x4062C82B, 0x4063C220, 0x40646420, 0x00000003, 0x4062C82C, - 0x4063C220, 0x40646420, 0x00000003, 0x4062C82D, 0x4063C220, 0x40646420, - 0x00000003, 0x4062C82E, 0x4063C220, 0x40646420, 0x00000003, 0x4062C82F, - 0x4063C220, 0x40646420, 0x00000003, 0x4062C830, 0x4063C220, 0x40646420, - 0x00000003, 0x4062C831, 0x4063C220, 0x40646420, 0x00000003, 0x4062C821, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062C822, - // Block 612, offset 0x9900 - 0x4063C220, 0x40646A20, 0x00000003, 0x4062C823, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062C821, 0x4063C220, 0x40647220, 0x00000003, 0x4062C822, - 0x4063C220, 0x40647220, 0x00000003, 0x4062C823, 0x4063C220, 0x40647220, - 0x00000003, 0x4062C824, 0x4063C220, 0x40647220, 0x00000003, 0x4062C821, - 0x4063C220, 0x40648C20, 0x00000003, 0x4062C822, 0x4063C220, 0x40648C20, - 0x00000003, 0x4062C823, 0x4063C220, 0x40648C20, 0x00000003, 0x4062C824, - 0x4063C220, 0x40648C20, 0x00000003, 0x4062C825, 0x4063C220, 0x40648C20, - 0x00000003, 0x4062C826, 0x4063C220, 0x40648C20, 0x00000003, 0x4062C827, - 0x4063C220, 0x40648C20, 0x00000003, 0x4062C828, 0x4063C220, 0x40648C20, - 0x00000003, 0x4062C829, 0x4063C220, 0x40648C20, 0x00000002, 0x4062C821, - 0x4063C620, 0x00000002, 0x4062C822, 0x4063C620, - // Block 613, offset 0x9940 - 0x00000002, 0x4062C823, 0x4063C620, 0x00000002, 0x4062C824, 0x4063C620, - 0x00000002, 0x4062C825, 0x4063C620, 0x00000002, 0x4062C826, 0x4063C620, - 0x00000002, 0x4062C827, 0x4063C620, 0x00000002, 0x4062C828, 0x4063C620, - 0x00000002, 0x4062C829, 0x4063C620, 0x00000002, 0x4062C821, 0x4063C820, - 0x00000002, 0x4062C822, 0x4063C820, 0x00000002, 0x4062C823, 0x4063C820, - 0x00000002, 0x4062C824, 0x4063C820, 0x00000002, 0x4062C825, 0x4063C820, - 0x00000002, 0x4062C826, 0x4063C820, 0x00000002, 0x4062C827, 0x4063C820, - 0x00000002, 0x4062C828, 0x4063C820, 0x00000002, 0x4062C829, 0x4063C820, - 0x00000002, 0x4062C82A, 0x4063C820, 0x00000002, 0x4062C82B, 0x4063C820, - 0x00000002, 0x4062C82C, 0x4063C820, 0x00000002, 0x4062C82D, 0x4063C820, - 0x00000002, 0x4062C82E, 0x4063C820, 0x00000002, - // Block 614, offset 0x9980 - 0x4062C82F, 0x4063C820, 0x00000002, 0x4062C830, 0x4063C820, 0x00000002, - 0x4062C831, 0x4063C820, 0x00000003, 0x4062C821, 0x4063CC20, 0x40646420, - 0x00000003, 0x4062C822, 0x4063CC20, 0x40646420, 0x00000003, 0x4062C823, - 0x4063CC20, 0x40646420, 0x00000003, 0x4062C824, 0x4063CC20, 0x40646420, - 0x00000003, 0x4062C825, 0x4063CC20, 0x40646420, 0x00000003, 0x4062C826, - 0x4063CC20, 0x40646420, 0x00000003, 0x4062C827, 0x4063CC20, 0x40646420, - 0x00000003, 0x4062C821, 0x4063CC20, 0x40648C20, 0x00000002, 0x4062C821, - 0x4063D020, 0x00000002, 0x4062C822, 0x4063D020, 0x00000002, 0x4062C823, - 0x4063D020, 0x00000002, 0x4062C824, 0x4063D020, 0x00000002, 0x4062C825, - 0x4063D020, 0x00000002, 0x4062C826, 0x4063D020, 0x00000002, 0x4062C827, - 0x4063D020, 0x00000002, 0x4062C828, 0x4063D020, - // Block 615, offset 0x99c0 - 0x00000002, 0x4062C829, 0x4063D020, 0x00000002, 0x4062C82A, 0x4063D020, - 0x00000002, 0x4062C82B, 0x4063D020, 0x00000002, 0x4062C82C, 0x4063D020, - 0x00000002, 0x4062C82D, 0x4063D020, 0x00000002, 0x4062C82E, 0x4063D020, - 0x00000002, 0x4062C82F, 0x4063D020, 0x00000002, 0x4062C830, 0x4063D020, - 0x00000002, 0x4062C831, 0x4063D020, 0x00000002, 0x4062C832, 0x4063D020, - 0x00000002, 0x4062C833, 0x4063D020, 0x00000002, 0x4062C834, 0x4063D020, - 0x00000002, 0x4062C835, 0x4063D020, 0x00000002, 0x4062C836, 0x4063D020, - 0x00000002, 0x4062C837, 0x4063D020, 0x00000002, 0x4062C838, 0x4063D020, - 0x00000002, 0x4062C839, 0x4063D020, 0x00000002, 0x4062C83A, 0x4063D020, - 0x00000002, 0x4062C83B, 0x4063D020, 0x00000002, 0x4062C83C, 0x4063D020, - 0x00000002, 0x4062C83D, 0x4063D020, 0x00000002, - // Block 616, offset 0x9a00 - 0x4062C83E, 0x4063D020, 0x00000002, 0x4062C83F, 0x4063D020, 0x00000002, - 0x4062C840, 0x4063D020, 0x00000002, 0x4062C841, 0x4063D020, 0x00000002, - 0x4062C842, 0x4063D020, 0x00000002, 0x4062C843, 0x4063D020, 0x00000002, - 0x4062C844, 0x4063D020, 0x00000002, 0x4062C845, 0x4063D020, 0x00000002, - 0x4062C846, 0x4063D020, 0x00000002, 0x4062C847, 0x4063D020, 0x00000002, - 0x4062C848, 0x4063D020, 0x00000002, 0x4062C849, 0x4063D020, 0x00000002, - 0x4062C84A, 0x4063D020, 0x00000003, 0x4062C821, 0x4063D020, 0x40646420, - 0x00000003, 0x4062C822, 0x4063D020, 0x40646420, 0x00000003, 0x4062C823, - 0x4063D020, 0x40646420, 0x00000003, 0x4062C824, 0x4063D020, 0x40646420, - 0x00000003, 0x4062C821, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C822, - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C823, - // Block 617, offset 0x9a40 - 0x4063D020, 0x40646A20, 0x00000003, 0x4062C824, 0x4063D020, 0x40646A20, - 0x00000003, 0x4062C825, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C821, - 0x4063D020, 0x40647220, 0x00000003, 0x4062C822, 0x4063D020, 0x40647220, - 0x00000003, 0x4062C823, 0x4063D020, 0x40647220, 0x00000003, 0x4062C821, - 0x4063D020, 0x40648220, 0x00000003, 0x4062C822, 0x4063D020, 0x40648220, - 0x00000003, 0x4062C823, 0x4063D020, 0x40648220, 0x00000003, 0x4062C824, - 0x4063D020, 0x40648220, 0x00000003, 0x4062C825, 0x4063D020, 0x40648220, - 0x00000003, 0x4062C826, 0x4063D020, 0x40648220, 0x00000003, 0x4062C827, - 0x4063D020, 0x40648220, 0x00000003, 0x4062C828, 0x4063D020, 0x40648220, - 0x00000003, 0x4062C829, 0x4063D020, 0x40648220, 0x00000003, 0x4062C82A, - 0x4063D020, 0x40648220, 0x00000003, 0x4062C82B, - // Block 618, offset 0x9a80 - 0x4063D020, 0x40648220, 0x00000003, 0x4062C82C, 0x4063D020, 0x40648220, - 0x00000003, 0x4062C82D, 0x4063D020, 0x40648220, 0x00000003, 0x4062C82E, - 0x4063D020, 0x40648220, 0x00000003, 0x4062C82F, 0x4063D020, 0x40648220, - 0x00000003, 0x4062C830, 0x4063D020, 0x40648220, 0x00000003, 0x4062C821, - 0x4063D020, 0x40648420, 0x00000003, 0x4062C821, 0x4063D020, 0x40648C20, - 0x00000003, 0x4062C822, 0x4063D020, 0x40648C20, 0x00000002, 0x4062CA21, - 0x4063BC20, 0x00000002, 0x4062CA22, 0x4063BC20, 0x00000002, 0x4062CA23, - 0x4063BC20, 0x00000002, 0x4062CC21, 0x4063A820, 0x00000002, 0x4062CC22, - 0x4063A820, 0x00000002, 0x4062CC23, 0x4063A820, 0x00000002, 0x4062CC24, - 0x4063A820, 0x00000002, 0x4062CC25, 0x4063A820, 0x00000002, 0x4062CC26, - 0x4063A820, 0x00000002, 0x4062CC27, 0x4063A820, - // Block 619, offset 0x9ac0 - 0x00000002, 0x4062CC28, 0x4063A820, 0x00000002, 0x4062CC29, 0x4063A820, - 0x00000002, 0x4062CC2A, 0x4063A820, 0x00000002, 0x4062CC2B, 0x4063A820, - 0x00000002, 0x4062CC2C, 0x4063A820, 0x00000002, 0x4062CC2D, 0x4063A820, - 0x00000002, 0x4062CC2E, 0x4063A820, 0x00000002, 0x4062CC2F, 0x4063A820, - 0x00000002, 0x4062CC30, 0x4063A820, 0x00000002, 0x4062CC31, 0x4063A820, - 0x00000002, 0x4062CC32, 0x4063A820, 0x00000002, 0x4062CC33, 0x4063A820, - 0x00000002, 0x4062CC34, 0x4063A820, 0x00000002, 0x4062CC35, 0x4063A820, - 0x00000002, 0x4062CC36, 0x4063A820, 0x00000002, 0x4062CC37, 0x4063A820, - 0x00000002, 0x4062CC38, 0x4063A820, 0x00000002, 0x4062CC39, 0x4063A820, - 0x00000002, 0x4062CC3A, 0x4063A820, 0x00000002, 0x4062CC3B, 0x4063A820, - 0x00000003, 0x4062CC21, 0x4063A820, 0x40646420, - // Block 620, offset 0x9b00 - 0x00000003, 0x4062CC22, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC23, - 0x4063A820, 0x40646420, 0x00000003, 0x4062CC24, 0x4063A820, 0x40646420, - 0x00000003, 0x4062CC25, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC26, - 0x4063A820, 0x40646420, 0x00000003, 0x4062CC27, 0x4063A820, 0x40646420, - 0x00000003, 0x4062CC28, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC29, - 0x4063A820, 0x40646420, 0x00000003, 0x4062CC2A, 0x4063A820, 0x40646420, - 0x00000003, 0x4062CC2B, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC2C, - 0x4063A820, 0x40646420, 0x00000003, 0x4062CC2D, 0x4063A820, 0x40646420, - 0x00000003, 0x4062CC2E, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC2F, - 0x4063A820, 0x40646420, 0x00000003, 0x4062CC30, 0x4063A820, 0x40646420, - 0x00000003, 0x4062CC31, 0x4063A820, 0x40646420, - // Block 621, offset 0x9b40 - 0x00000003, 0x4062CC32, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC33, - 0x4063A820, 0x40646420, 0x00000003, 0x4062CC34, 0x4063A820, 0x40646420, - 0x00000003, 0x4062CC35, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC36, - 0x4063A820, 0x40646420, 0x00000003, 0x4062CC37, 0x4063A820, 0x40646420, - 0x00000003, 0x4062CC21, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC22, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC23, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062CC24, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC25, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC26, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062CC27, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC28, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC29, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062CC2A, 0x4063A820, 0x40646A20, - // Block 622, offset 0x9b80 - 0x00000003, 0x4062CC2B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC2C, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC2D, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062CC2E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC2F, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC21, 0x4063A820, 0x40647220, - 0x00000003, 0x4062CC22, 0x4063A820, 0x40647220, 0x00000003, 0x4062CC23, - 0x4063A820, 0x40647220, 0x00000003, 0x4062CC21, 0x4063A820, 0x40648220, - 0x00000003, 0x4062CC22, 0x4063A820, 0x40648220, 0x00000003, 0x4062CC23, - 0x4063A820, 0x40648220, 0x00000003, 0x4062CC24, 0x4063A820, 0x40648220, - 0x00000003, 0x4062CC25, 0x4063A820, 0x40648220, 0x00000003, 0x4062CC26, - 0x4063A820, 0x40648220, 0x00000003, 0x4062CC27, 0x4063A820, 0x40648220, - 0x00000003, 0x4062CC21, 0x4063A820, 0x40648420, - // Block 623, offset 0x9bc0 - 0x00000003, 0x4062CC22, 0x4063A820, 0x40648420, 0x00000003, 0x4062CC23, - 0x4063A820, 0x40648420, 0x00000003, 0x4062CC24, 0x4063A820, 0x40648420, - 0x00000003, 0x4062CC25, 0x4063A820, 0x40648420, 0x00000003, 0x4062CC26, - 0x4063A820, 0x40648420, 0x00000003, 0x4062CC21, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062CC22, 0x4063A820, 0x40648C20, 0x00000003, 0x4062CC23, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062CC24, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062CC25, 0x4063A820, 0x40648C20, 0x00000003, 0x4062CC26, - 0x4063A820, 0x40648C20, 0x00000003, 0x4062CC27, 0x4063A820, 0x40648C20, - 0x00000003, 0x4062CC28, 0x4063A820, 0x40648C20, 0x00000002, 0x4062CC21, - 0x4063AA20, 0x00000002, 0x4062CC22, 0x4063AA20, 0x00000002, 0x4062CC23, - 0x4063AA20, 0x00000002, 0x4062CC24, 0x4063AA20, - // Block 624, offset 0x9c00 - 0x00000002, 0x4062CC25, 0x4063AA20, 0x00000002, 0x4062CC26, 0x4063AA20, - 0x00000002, 0x4062CC27, 0x4063AA20, 0x00000002, 0x4062CC28, 0x4063AA20, - 0x00000002, 0x4062CC29, 0x4063AA20, 0x00000002, 0x4062CC2A, 0x4063AA20, - 0x00000002, 0x4062CC2B, 0x4063AA20, 0x00000002, 0x4062CC2C, 0x4063AA20, - 0x00000002, 0x4062CC2D, 0x4063AA20, 0x00000002, 0x4062CC2E, 0x4063AA20, - 0x00000002, 0x4062CC2F, 0x4063AA20, 0x00000002, 0x4062CC30, 0x4063AA20, - 0x00000002, 0x4062CC31, 0x4063AA20, 0x00000002, 0x4062CC32, 0x4063AA20, - 0x00000002, 0x4062CC33, 0x4063AA20, 0x00000002, 0x4062CC34, 0x4063AA20, - 0x00000002, 0x4062CC35, 0x4063AA20, 0x00000003, 0x4062CC21, 0x4063AA20, - 0x40646420, 0x00000003, 0x4062CC22, 0x4063AA20, 0x40646420, 0x00000003, - 0x4062CC21, 0x4063AA20, 0x40648C20, 0x00000003, - // Block 625, offset 0x9c40 - 0x4062CC22, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CC23, 0x4063AA20, - 0x40648C20, 0x00000002, 0x4062CC21, 0x4063B020, 0x00000002, 0x4062CC21, - 0x4063B820, 0x00000002, 0x4062CC22, 0x4063B820, 0x00000002, 0x4062CC23, - 0x4063B820, 0x00000002, 0x4062CC24, 0x4063B820, 0x00000003, 0x4062CC21, - 0x4063B820, 0x40646A20, 0x00000003, 0x4062CC22, 0x4063B820, 0x40646A20, - 0x00000003, 0x4062CC23, 0x4063B820, 0x40646A20, 0x00000003, 0x4062CC21, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062CC22, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062CC23, 0x4063B820, 0x40648C20, 0x00000003, 0x4062CC24, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062CC25, 0x4063B820, 0x40648C20, - 0x00000003, 0x4062CC26, 0x4063B820, 0x40648C20, 0x00000003, 0x4062CC27, - 0x4063B820, 0x40648C20, 0x00000003, 0x4062CC28, - // Block 626, offset 0x9c80 - 0x4063B820, 0x40648C20, 0x00000003, 0x4062CC29, 0x4063B820, 0x40648C20, - 0x00000002, 0x4062CC21, 0x4063BE20, 0x00000002, 0x4062CC22, 0x4063BE20, - 0x00000002, 0x4062CC23, 0x4063BE20, 0x00000002, 0x4062CC24, 0x4063BE20, - 0x00000002, 0x4062CC25, 0x4063BE20, 0x00000002, 0x4062CC26, 0x4063BE20, - 0x00000002, 0x4062CC27, 0x4063BE20, 0x00000002, 0x4062CC21, 0x4063C220, - 0x00000002, 0x4062CC22, 0x4063C220, 0x00000002, 0x4062CC23, 0x4063C220, - 0x00000002, 0x4062CC24, 0x4063C220, 0x00000002, 0x4062CC25, 0x4063C220, - 0x00000002, 0x4062CC26, 0x4063C220, 0x00000002, 0x4062CC27, 0x4063C220, - 0x00000002, 0x4062CC28, 0x4063C220, 0x00000002, 0x4062CC29, 0x4063C220, - 0x00000003, 0x4062CC21, 0x4063C220, 0x40648C20, 0x00000003, 0x4062CC21, - 0x4063CC20, 0x40646420, 0x00000003, 0x4062CC22, - // Block 627, offset 0x9cc0 - 0x4063CC20, 0x40646420, 0x00000003, 0x4062CC23, 0x4063CC20, 0x40646420, - 0x00000003, 0x4062CC21, 0x4063CC20, 0x40648220, 0x00000002, 0x4062CE21, - 0x4063A820, 0x00000002, 0x4062CE22, 0x4063A820, 0x00000002, 0x4062CE23, - 0x4063A820, 0x00000002, 0x4062CE24, 0x4063A820, 0x00000002, 0x4062CE25, - 0x4063A820, 0x00000002, 0x4062CE26, 0x4063A820, 0x00000002, 0x4062CE27, - 0x4063A820, 0x00000002, 0x4062CE28, 0x4063A820, 0x00000002, 0x4062CE29, - 0x4063A820, 0x00000002, 0x4062CE2A, 0x4063A820, 0x00000002, 0x4062CE2B, - 0x4063A820, 0x00000002, 0x4062CE2C, 0x4063A820, 0x00000002, 0x4062CE2D, - 0x4063A820, 0x00000002, 0x4062CE2E, 0x4063A820, 0x00000002, 0x4062CE2F, - 0x4063A820, 0x00000002, 0x4062CE30, 0x4063A820, 0x00000002, 0x4062CE31, - 0x4063A820, 0x00000002, 0x4062CE32, 0x4063A820, - // Block 628, offset 0x9d00 - 0x00000002, 0x4062CE33, 0x4063A820, 0x00000002, 0x4062CE34, 0x4063A820, - 0x00000002, 0x4062CE35, 0x4063A820, 0x00000002, 0x4062CE36, 0x4063A820, - 0x00000002, 0x4062CE37, 0x4063A820, 0x00000002, 0x4062CE38, 0x4063A820, - 0x00000002, 0x4062CE39, 0x4063A820, 0x00000002, 0x4062CE3A, 0x4063A820, - 0x00000002, 0x4062CE3B, 0x4063A820, 0x00000002, 0x4062CE3C, 0x4063A820, - 0x00000002, 0x4062CE3D, 0x4063A820, 0x00000002, 0x4062CE3E, 0x4063A820, - 0x00000003, 0x4062CE21, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE22, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE23, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062CE24, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE25, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE26, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062CE27, 0x4063A820, 0x40646A20, - // Block 629, offset 0x9d40 - 0x00000003, 0x4062CE28, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE29, - 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE2A, 0x4063A820, 0x40646A20, - 0x00000003, 0x4062CE21, 0x4063A820, 0x40647220, 0x00000003, 0x4062CE22, - 0x4063A820, 0x40647220, 0x00000003, 0x4062CE23, 0x4063A820, 0x40647220, - 0x00000003, 0x4062CE24, 0x4063A820, 0x40647220, 0x00000003, 0x4062CE25, - 0x4063A820, 0x40647220, 0x00000002, 0x4062CE21, 0x4063AA20, 0x00000002, - 0x4062CE22, 0x4063AA20, 0x00000002, 0x4062CE23, 0x4063AA20, 0x00000002, - 0x4062CE24, 0x4063AA20, 0x00000002, 0x4062CE25, 0x4063AA20, 0x00000002, - 0x4062CE26, 0x4063AA20, 0x00000002, 0x4062CE27, 0x4063AA20, 0x00000002, - 0x4062CE28, 0x4063AA20, 0x00000002, 0x4062CE29, 0x4063AA20, 0x00000002, - 0x4062CE2A, 0x4063AA20, 0x00000002, 0x4062CE2B, - // Block 630, offset 0x9d80 - 0x4063AA20, 0x00000002, 0x4062CE2C, 0x4063AA20, 0x00000002, 0x4062CE2D, - 0x4063AA20, 0x00000002, 0x4062CE2E, 0x4063AA20, 0x00000002, 0x4062CE2F, - 0x4063AA20, 0x00000002, 0x4062CE30, 0x4063AA20, 0x00000003, 0x4062CE21, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CE22, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062CE23, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CE24, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CE25, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062CE26, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CE27, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CE28, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062CE21, 0x4063AC20, 0x40646420, 0x00000003, 0x4062CE21, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE22, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062CE23, 0x4063B420, 0x40646A20, - // Block 631, offset 0x9dc0 - 0x00000003, 0x4062CE24, 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE25, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE26, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062CE27, 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE28, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE29, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062CE2A, 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE2B, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE2C, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062CE2D, 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE2E, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE2F, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062CE30, 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE31, - 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE32, 0x4063B420, 0x40646A20, - 0x00000003, 0x4062CE33, 0x4063B420, 0x40646A20, - // Block 632, offset 0x9e00 - 0x00000003, 0x4062CE21, 0x4063B420, 0x40648220, 0x00000003, 0x4062CE22, - 0x4063B420, 0x40648220, 0x00000003, 0x4062CE23, 0x4063B420, 0x40648220, - 0x00000003, 0x4062CE21, 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE22, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE23, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062CE24, 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE25, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE26, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062CE27, 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE28, - 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE29, 0x4063B420, 0x40648C20, - 0x00000003, 0x4062CE2A, 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE2B, - 0x4063B420, 0x40648C20, 0x00000002, 0x4062CE21, 0x4063B620, 0x00000002, - 0x4062CE22, 0x4063B620, 0x00000002, 0x4062CE23, - // Block 633, offset 0x9e40 - 0x4063B620, 0x00000002, 0x4062CE24, 0x4063B620, 0x00000002, 0x4062CE25, - 0x4063B620, 0x00000002, 0x4062CE26, 0x4063B620, 0x00000002, 0x4062CE27, - 0x4063B620, 0x00000002, 0x4062CE28, 0x4063B620, 0x00000002, 0x4062CE29, - 0x4063B620, 0x00000002, 0x4062CE2A, 0x4063B620, 0x00000002, 0x4062CE2B, - 0x4063B620, 0x00000002, 0x4062CE2C, 0x4063B620, 0x00000002, 0x4062CE2D, - 0x4063B620, 0x00000002, 0x4062CE2E, 0x4063B620, 0x00000002, 0x4062CE21, - 0x4063B820, 0x00000002, 0x4062CE22, 0x4063B820, 0x00000002, 0x4062CE23, - 0x4063B820, 0x00000002, 0x4062CE24, 0x4063B820, 0x00000002, 0x4062CE25, - 0x4063B820, 0x00000002, 0x4062CE26, 0x4063B820, 0x00000002, 0x4062CE27, - 0x4063B820, 0x00000002, 0x4062CE28, 0x4063B820, 0x00000002, 0x4062CE29, - 0x4063B820, 0x00000002, 0x4062CE2A, 0x4063B820, - // Block 634, offset 0x9e80 - 0x00000002, 0x4062CE2B, 0x4063B820, 0x00000002, 0x4062CE2C, 0x4063B820, - 0x00000002, 0x4062CE2D, 0x4063B820, 0x00000002, 0x4062CE2E, 0x4063B820, - 0x00000002, 0x4062CE2F, 0x4063B820, 0x00000002, 0x4062CE30, 0x4063B820, - 0x00000002, 0x4062CE31, 0x4063B820, 0x00000002, 0x4062CE32, 0x4063B820, - 0x00000002, 0x4062CE33, 0x4063B820, 0x00000002, 0x4062CE34, 0x4063B820, - 0x00000002, 0x4062CE35, 0x4063B820, 0x00000002, 0x4062CE36, 0x4063B820, - 0x00000002, 0x4062CE37, 0x4063B820, 0x00000002, 0x4062CE38, 0x4063B820, - 0x00000002, 0x4062CE39, 0x4063B820, 0x00000002, 0x4062CE3A, 0x4063B820, - 0x00000002, 0x4062CE3B, 0x4063B820, 0x00000002, 0x4062CE3C, 0x4063B820, - 0x00000002, 0x4062CE3D, 0x4063B820, 0x00000002, 0x4062CE3E, 0x4063B820, - 0x00000002, 0x4062CE3F, 0x4063B820, 0x00000002, - // Block 635, offset 0x9ec0 - 0x4062CE40, 0x4063B820, 0x00000002, 0x4062CE41, 0x4063B820, 0x00000002, - 0x4062CE42, 0x4063B820, 0x00000002, 0x4062CE43, 0x4063B820, 0x00000002, - 0x4062CE44, 0x4063B820, 0x00000002, 0x4062CE45, 0x4063B820, 0x00000002, - 0x4062CE46, 0x4063B820, 0x00000002, 0x4062CE47, 0x4063B820, 0x00000003, - 0x4062CE21, 0x4063B820, 0x40646420, 0x00000003, 0x4062CE22, 0x4063B820, - 0x40646420, 0x00000003, 0x4062CE23, 0x4063B820, 0x40646420, 0x00000003, - 0x4062CE24, 0x4063B820, 0x40646420, 0x00000003, 0x4062CE25, 0x4063B820, - 0x40646420, 0x00000002, 0x4062CE21, 0x4063C020, 0x00000002, 0x4062CE22, - 0x4063C020, 0x00000002, 0x4062CE23, 0x4063C020, 0x00000002, 0x4062CE24, - 0x4063C020, 0x00000002, 0x4062CE25, 0x4063C020, 0x00000002, 0x4062CE26, - 0x4063C020, 0x00000002, 0x4062CE27, 0x4063C020, - // Block 636, offset 0x9f00 - 0x00000002, 0x4062CE28, 0x4063C020, 0x00000002, 0x4062CE29, 0x4063C020, - 0x00000002, 0x4062CE2A, 0x4063C020, 0x00000002, 0x4062CE2B, 0x4063C020, - 0x00000002, 0x4062CE2C, 0x4063C020, 0x00000002, 0x4062CE2D, 0x4063C020, - 0x00000002, 0x4062CE2E, 0x4063C020, 0x00000002, 0x4062CE2F, 0x4063C020, - 0x00000002, 0x4062CE30, 0x4063C020, 0x00000002, 0x4062CE31, 0x4063C020, - 0x00000002, 0x4062CE32, 0x4063C020, 0x00000002, 0x4062CE33, 0x4063C020, - 0x00000002, 0x4062CE34, 0x4063C020, 0x00000002, 0x4062CE35, 0x4063C020, - 0x00000002, 0x4062CE36, 0x4063C020, 0x00000002, 0x4062CE37, 0x4063C020, - 0x00000002, 0x4062CE38, 0x4063C020, 0x00000002, 0x4062CE39, 0x4063C020, - 0x00000002, 0x4062CE3A, 0x4063C020, 0x00000002, 0x4062CE3B, 0x4063C020, - 0x00000003, 0x4062CE21, 0x4063C220, 0x40648220, - // Block 637, offset 0x9f40 - 0x00000003, 0x4062CE22, 0x4063C220, 0x40648220, 0x00000003, 0x4062CE23, - 0x4063C220, 0x40648220, 0x00000003, 0x4062CE21, 0x4063C220, 0x40648C20, - 0x00000003, 0x4062CE22, 0x4063C220, 0x40648C20, 0x00000003, 0x4062CE23, - 0x4063C220, 0x40648C20, 0x00000003, 0x4062CE24, 0x4063C220, 0x40648C20, - 0x00000003, 0x4062CE25, 0x4063C220, 0x40648C20, 0x00000003, 0x4062CE26, - 0x4063C220, 0x40648C20, 0x00000003, 0x4062CE27, 0x4063C220, 0x40648C20, - 0x00000002, 0x4062CE21, 0x4063D020, 0x00000002, 0x4062CE22, 0x4063D020, - 0x00000002, 0x4062CE23, 0x4063D020, 0x00000002, 0x4062CE24, 0x4063D020, - 0x00000002, 0x4062CE25, 0x4063D020, 0x00000002, 0x4062CE26, 0x4063D020, - 0x00000002, 0x4062CE27, 0x4063D020, 0x00000002, 0x4062CE28, 0x4063D020, - 0x00000002, 0x4062CE29, 0x4063D020, 0x00000002, - // Block 638, offset 0x9f80 - 0x4062CE2A, 0x4063D020, 0x00000002, 0x4062CE2B, 0x4063D020, 0x00000003, - 0x4062CE21, 0x4063D020, 0x40646420, 0x00000003, 0x4062CE21, 0x4063D020, - 0x40647220, 0x00000003, 0x4062CE22, 0x4063D020, 0x40647220, 0x00000003, - 0x4062CE23, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE24, 0x4063D020, - 0x40647220, 0x00000003, 0x4062CE25, 0x4063D020, 0x40647220, 0x00000003, - 0x4062CE26, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE27, 0x4063D020, - 0x40647220, 0x00000003, 0x4062CE28, 0x4063D020, 0x40647220, 0x00000003, - 0x4062CE29, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE2A, 0x4063D020, - 0x40647220, 0x00000003, 0x4062CE2B, 0x4063D020, 0x40647220, 0x00000003, - 0x4062CE2C, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE2D, 0x4063D020, - 0x40647220, 0x00000003, 0x4062CE2E, 0x4063D020, - // Block 639, offset 0x9fc0 - 0x40647220, 0x00000003, 0x4062CE2F, 0x4063D020, 0x40647220, 0x00000003, - 0x4062CE30, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE31, 0x4063D020, - 0x40647220, 0x00000003, 0x4062CE32, 0x4063D020, 0x40647220, 0x00000003, - 0x4062CE33, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE34, 0x4063D020, - 0x40647220, 0x00000003, 0x4062CE35, 0x4063D020, 0x40647220, 0x00000003, - 0x4062CE36, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE21, 0x4063D020, - 0x40648420, 0x00000003, 0x4062CE22, 0x4063D020, 0x40648420, 0x00000003, - 0x4062CE23, 0x4063D020, 0x40648420, 0x00000002, 0x4062D021, 0x4063A820, - 0x00000002, 0x4062D022, 0x4063A820, 0x00000002, 0x4062D023, 0x4063A820, - 0x00000002, 0x4062D024, 0x4063A820, 0x00000002, 0x4062D025, 0x4063A820, - 0x00000002, 0x4062D026, 0x4063A820, 0x00000002, - // Block 640, offset 0xa000 - 0x4062D027, 0x4063A820, 0x00000002, 0x4062D028, 0x4063A820, 0x00000002, - 0x4062D029, 0x4063A820, 0x00000002, 0x4062D02A, 0x4063A820, 0x00000002, - 0x4062D02B, 0x4063A820, 0x00000002, 0x4062D02C, 0x4063A820, 0x00000002, - 0x4062D02D, 0x4063A820, 0x00000002, 0x4062D02E, 0x4063A820, 0x00000002, - 0x4062D02F, 0x4063A820, 0x00000002, 0x4062D030, 0x4063A820, 0x00000002, - 0x4062D031, 0x4063A820, 0x00000002, 0x4062D032, 0x4063A820, 0x00000002, - 0x4062D033, 0x4063A820, 0x00000002, 0x4062D034, 0x4063A820, 0x00000002, - 0x4062D035, 0x4063A820, 0x00000002, 0x4062D036, 0x4063A820, 0x00000003, - 0x4062D021, 0x4063A820, 0x40646420, 0x00000003, 0x4062D022, 0x4063A820, - 0x40646420, 0x00000003, 0x4062D023, 0x4063A820, 0x40646420, 0x00000003, - 0x4062D024, 0x4063A820, 0x40646420, 0x00000003, - // Block 641, offset 0xa040 - 0x4062D025, 0x4063A820, 0x40646420, 0x00000003, 0x4062D026, 0x4063A820, - 0x40646420, 0x00000003, 0x4062D027, 0x4063A820, 0x40646420, 0x00000003, - 0x4062D028, 0x4063A820, 0x40646420, 0x00000003, 0x4062D029, 0x4063A820, - 0x40646420, 0x00000003, 0x4062D02A, 0x4063A820, 0x40646420, 0x00000003, - 0x4062D02B, 0x4063A820, 0x40646420, 0x00000003, 0x4062D021, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062D022, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062D023, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D024, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062D025, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062D026, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D027, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062D028, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062D029, 0x4063A820, 0x40646A20, 0x00000003, - // Block 642, offset 0xa080 - 0x4062D02A, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D02B, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062D02C, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062D02D, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D02E, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062D02F, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062D030, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D031, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062D032, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062D033, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D034, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062D035, 0x4063A820, 0x40646A20, 0x00000003, - 0x4062D036, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D037, 0x4063A820, - 0x40646A20, 0x00000003, 0x4062D021, 0x4063A820, 0x40647220, 0x00000003, - 0x4062D022, 0x4063A820, 0x40647220, 0x00000003, - // Block 643, offset 0xa0c0 - 0x4062D023, 0x4063A820, 0x40647220, 0x00000003, 0x4062D021, 0x4063A820, - 0x40648220, 0x00000003, 0x4062D022, 0x4063A820, 0x40648220, 0x00000003, - 0x4062D023, 0x4063A820, 0x40648220, 0x00000003, 0x4062D024, 0x4063A820, - 0x40648220, 0x00000003, 0x4062D025, 0x4063A820, 0x40648220, 0x00000003, - 0x4062D026, 0x4063A820, 0x40648220, 0x00000003, 0x4062D027, 0x4063A820, - 0x40648220, 0x00000003, 0x4062D028, 0x4063A820, 0x40648220, 0x00000003, - 0x4062D029, 0x4063A820, 0x40648220, 0x00000003, 0x4062D02A, 0x4063A820, - 0x40648220, 0x00000003, 0x4062D02B, 0x4063A820, 0x40648220, 0x00000003, - 0x4062D02C, 0x4063A820, 0x40648220, 0x00000003, 0x4062D02D, 0x4063A820, - 0x40648220, 0x00000003, 0x4062D02E, 0x4063A820, 0x40648220, 0x00000003, - 0x4062D02F, 0x4063A820, 0x40648220, 0x00000003, - // Block 644, offset 0xa100 - 0x4062D030, 0x4063A820, 0x40648220, 0x00000003, 0x4062D031, 0x4063A820, - 0x40648220, 0x00000003, 0x4062D021, 0x4063A820, 0x40648420, 0x00000003, - 0x4062D022, 0x4063A820, 0x40648420, 0x00000003, 0x4062D023, 0x4063A820, - 0x40648420, 0x00000003, 0x4062D024, 0x4063A820, 0x40648420, 0x00000003, - 0x4062D025, 0x4063A820, 0x40648420, 0x00000003, 0x4062D026, 0x4063A820, - 0x40648420, 0x00000003, 0x4062D027, 0x4063A820, 0x40648420, 0x00000003, - 0x4062D028, 0x4063A820, 0x40648420, 0x00000003, 0x4062D029, 0x4063A820, - 0x40648420, 0x00000003, 0x4062D02A, 0x4063A820, 0x40648420, 0x00000003, - 0x4062D02B, 0x4063A820, 0x40648420, 0x00000003, 0x4062D02C, 0x4063A820, - 0x40648420, 0x00000003, 0x4062D02D, 0x4063A820, 0x40648420, 0x00000003, - 0x4062D02E, 0x4063A820, 0x40648420, 0x00000003, - // Block 645, offset 0xa140 - 0x4062D021, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D022, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062D023, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062D024, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D025, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062D026, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062D027, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D028, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062D029, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062D02A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D02B, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062D02C, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062D02D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D02E, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062D02F, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062D030, 0x4063A820, 0x40648C20, 0x00000003, - // Block 646, offset 0xa180 - 0x4062D031, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D032, 0x4063A820, - 0x40648C20, 0x00000003, 0x4062D033, 0x4063A820, 0x40648C20, 0x00000003, - 0x4062D034, 0x4063A820, 0x40648C20, 0x00000002, 0x4062D021, 0x4063AA20, - 0x00000002, 0x4062D022, 0x4063AA20, 0x00000002, 0x4062D023, 0x4063AA20, - 0x00000002, 0x4062D024, 0x4063AA20, 0x00000002, 0x4062D025, 0x4063AA20, - 0x00000002, 0x4062D026, 0x4063AA20, 0x00000002, 0x4062D027, 0x4063AA20, - 0x00000002, 0x4062D028, 0x4063AA20, 0x00000002, 0x4062D029, 0x4063AA20, - 0x00000002, 0x4062D02A, 0x4063AA20, 0x00000002, 0x4062D02B, 0x4063AA20, - 0x00000002, 0x4062D02C, 0x4063AA20, 0x00000002, 0x4062D02D, 0x4063AA20, - 0x00000002, 0x4062D02E, 0x4063AA20, 0x00000002, 0x4062D02F, 0x4063AA20, - 0x00000002, 0x4062D030, 0x4063AA20, 0x00000002, - // Block 647, offset 0xa1c0 - 0x4062D031, 0x4063AA20, 0x00000002, 0x4062D032, 0x4063AA20, 0x00000002, - 0x4062D033, 0x4063AA20, 0x00000002, 0x4062D034, 0x4063AA20, 0x00000002, - 0x4062D035, 0x4063AA20, 0x00000002, 0x4062D036, 0x4063AA20, 0x00000002, - 0x4062D037, 0x4063AA20, 0x00000002, 0x4062D038, 0x4063AA20, 0x00000002, - 0x4062D039, 0x4063AA20, 0x00000002, 0x4062D03A, 0x4063AA20, 0x00000002, - 0x4062D03B, 0x4063AA20, 0x00000002, 0x4062D03C, 0x4063AA20, 0x00000002, - 0x4062D03D, 0x4063AA20, 0x00000003, 0x4062D021, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062D022, 0x4063AA20, 0x40646420, 0x00000003, 0x4062D023, - 0x4063AA20, 0x40646420, 0x00000003, 0x4062D024, 0x4063AA20, 0x40646420, - 0x00000003, 0x4062D021, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062D022, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062D023, - // Block 648, offset 0xa200 - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062D024, 0x4063AA20, 0x40648C20, - 0x00000003, 0x4062D025, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062D026, - 0x4063AA20, 0x40648C20, 0x00000003, 0x4062D021, 0x4063AC20, 0x40648C20, - 0x00000003, 0x4062D022, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062D023, - 0x4063AC20, 0x40648C20, 0x00000003, 0x4062D024, 0x4063AC20, 0x40648C20, - 0x00000003, 0x4062D025, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062D026, - 0x4063AC20, 0x40648C20, 0x00000003, 0x4062D027, 0x4063AC20, 0x40648C20, - 0x00000003, 0x4062D028, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062D029, - 0x4063AC20, 0x40648C20, 0x00000003, 0x4062D02A, 0x4063AC20, 0x40648C20, - 0x00000002, 0x4062D021, 0x4063B020, 0x00000002, 0x4062D022, 0x4063B020, - 0x00000002, 0x4062D023, 0x4063B020, 0x00000002, - // Block 649, offset 0xa240 - 0x4062D024, 0x4063B020, 0x00000002, 0x4062D025, 0x4063B020, 0x00000003, - 0x4062D021, 0x4063B020, 0x40646A20, 0x00000003, 0x4062D022, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062D023, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062D024, 0x4063B020, 0x40646A20, 0x00000003, 0x4062D025, 0x4063B020, - 0x40646A20, 0x00000003, 0x4062D026, 0x4063B020, 0x40646A20, 0x00000003, - 0x4062D027, 0x4063B020, 0x40646A20, 0x00000003, 0x4062D021, 0x4063B020, - 0x40647220, 0x00000003, 0x4062D021, 0x4063B020, 0x40648220, 0x00000003, - 0x4062D022, 0x4063B020, 0x40648220, 0x00000003, 0x4062D023, 0x4063B020, - 0x40648220, 0x00000003, 0x4062D024, 0x4063B020, 0x40648220, 0x00000003, - 0x4062D025, 0x4063B020, 0x40648220, 0x00000003, 0x4062D021, 0x4063B420, - 0x40646420, 0x00000003, 0x4062D022, 0x4063B420, - // Block 650, offset 0xa280 - 0x40646420, 0x00000003, 0x4062D023, 0x4063B420, 0x40646420, 0x00000003, - 0x4062D024, 0x4063B420, 0x40646420, 0x00000003, 0x4062D025, 0x4063B420, - 0x40646420, 0x00000003, 0x4062D026, 0x4063B420, 0x40646420, 0x00000003, - 0x4062D027, 0x4063B420, 0x40646420, 0x00000003, 0x4062D028, 0x4063B420, - 0x40646420, 0x00000003, 0x4062D021, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062D022, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D023, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062D024, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062D025, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D026, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062D027, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062D028, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D029, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062D02A, 0x4063B420, - // Block 651, offset 0xa2c0 - 0x40646A20, 0x00000003, 0x4062D02B, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062D02C, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D02D, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062D02E, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062D02F, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D030, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062D031, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062D032, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D033, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062D034, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062D035, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D036, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062D037, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062D038, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D039, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062D03A, 0x4063B420, - // Block 652, offset 0xa300 - 0x40646A20, 0x00000003, 0x4062D03B, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062D03C, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D03D, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062D03E, 0x4063B420, 0x40646A20, 0x00000003, - 0x4062D03F, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D040, 0x4063B420, - 0x40646A20, 0x00000003, 0x4062D021, 0x4063B420, 0x40647220, 0x00000003, - 0x4062D022, 0x4063B420, 0x40647220, 0x00000003, 0x4062D023, 0x4063B420, - 0x40647220, 0x00000003, 0x4062D024, 0x4063B420, 0x40647220, 0x00000003, - 0x4062D025, 0x4063B420, 0x40647220, 0x00000003, 0x4062D026, 0x4063B420, - 0x40647220, 0x00000003, 0x4062D021, 0x4063B420, 0x40648220, 0x00000003, - 0x4062D021, 0x4063B420, 0x40648420, 0x00000003, 0x4062D022, 0x4063B420, - 0x40648420, 0x00000003, 0x4062D023, 0x4063B420, - // Block 653, offset 0xa340 - 0x40648420, 0x00000003, 0x4062D024, 0x4063B420, 0x40648420, 0x00000003, - 0x4062D025, 0x4063B420, 0x40648420, 0x00000003, 0x4062D026, 0x4063B420, - 0x40648420, 0x00000003, 0x4062D027, 0x4063B420, 0x40648420, 0x00000003, - 0x4062D028, 0x4063B420, 0x40648420, 0x00000003, 0x4062D029, 0x4063B420, - 0x40648420, 0x00000003, 0x4062D02A, 0x4063B420, 0x40648420, 0x00000003, - 0x4062D02B, 0x4063B420, 0x40648420, 0x00000003, 0x4062D02C, 0x4063B420, - 0x40648420, 0x00000003, 0x4062D02D, 0x4063B420, 0x40648420, 0x00000003, - 0x4062D02E, 0x4063B420, 0x40648420, 0x00000003, 0x4062D02F, 0x4063B420, - 0x40648420, 0x00000003, 0x4062D030, 0x4063B420, 0x40648420, 0x00000003, - 0x4062D031, 0x4063B420, 0x40648420, 0x00000003, 0x4062D032, 0x4063B420, - 0x40648420, 0x00000003, 0x4062D033, 0x4063B420, - // Block 654, offset 0xa380 - 0x40648420, 0x00000003, 0x4062D021, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062D022, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D023, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062D024, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062D025, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D026, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062D027, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062D028, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D029, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062D02A, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062D02B, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D02C, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062D02D, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062D02E, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D02F, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062D030, 0x4063B420, - // Block 655, offset 0xa3c0 - 0x40648C20, 0x00000003, 0x4062D031, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062D032, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D033, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062D034, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062D035, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D036, 0x4063B420, - 0x40648C20, 0x00000003, 0x4062D037, 0x4063B420, 0x40648C20, 0x00000003, - 0x4062D038, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D039, 0x4063B420, - 0x40648C20, 0x00000002, 0x4062D021, 0x4063B620, 0x00000002, 0x4062D022, - 0x4063B620, 0x00000002, 0x4062D023, 0x4063B620, 0x00000002, 0x4062D024, - 0x4063B620, 0x00000002, 0x4062D025, 0x4063B620, 0x00000002, 0x4062D026, - 0x4063B620, 0x00000002, 0x4062D027, 0x4063B620, 0x00000002, 0x4062D028, - 0x4063B620, 0x00000002, 0x4062D029, 0x4063B620, - // Block 656, offset 0xa400 - 0x00000002, 0x4062D02A, 0x4063B620, 0x00000002, 0x4062D02B, 0x4063B620, - 0x00000002, 0x4062D02C, 0x4063B620, 0x00000002, 0x4062D02D, 0x4063B620, - 0x00000002, 0x4062D02E, 0x4063B620, 0x00000002, 0x4062D02F, 0x4063B620, - 0x00000002, 0x4062D030, 0x4063B620, 0x00000002, 0x4062D031, 0x4063B620, - 0x00000002, 0x4062D021, 0x4063B820, 0x00000002, 0x4062D022, 0x4063B820, - 0x00000002, 0x4062D023, 0x4063B820, 0x00000002, 0x4062D024, 0x4063B820, - 0x00000002, 0x4062D025, 0x4063B820, 0x00000002, 0x4062D026, 0x4063B820, - 0x00000002, 0x4062D027, 0x4063B820, 0x00000002, 0x4062D028, 0x4063B820, - 0x00000002, 0x4062D029, 0x4063B820, 0x00000002, 0x4062D02A, 0x4063B820, - 0x00000002, 0x4062D02B, 0x4063B820, 0x00000002, 0x4062D02C, 0x4063B820, - 0x00000002, 0x4062D02D, 0x4063B820, 0x00000002, - // Block 657, offset 0xa440 - 0x4062D02E, 0x4063B820, 0x00000002, 0x4062D02F, 0x4063B820, 0x00000002, - 0x4062D030, 0x4063B820, 0x00000002, 0x4062D031, 0x4063B820, 0x00000002, - 0x4062D032, 0x4063B820, 0x00000002, 0x4062D033, 0x4063B820, 0x00000002, - 0x4062D034, 0x4063B820, 0x00000002, 0x4062D035, 0x4063B820, 0x00000002, - 0x4062D036, 0x4063B820, 0x00000002, 0x4062D037, 0x4063B820, 0x00000002, - 0x4062D038, 0x4063B820, 0x00000002, 0x4062D039, 0x4063B820, 0x00000002, - 0x4062D03A, 0x4063B820, 0x00000002, 0x4062D03B, 0x4063B820, 0x00000002, - 0x4062D03C, 0x4063B820, 0x00000002, 0x4062D03D, 0x4063B820, 0x00000002, - 0x4062D03E, 0x4063B820, 0x00000002, 0x4062D03F, 0x4063B820, 0x00000002, - 0x4062D040, 0x4063B820, 0x00000002, 0x4062D041, 0x4063B820, 0x00000002, - 0x4062D042, 0x4063B820, 0x00000002, 0x4062D043, - // Block 658, offset 0xa480 - 0x4063B820, 0x00000002, 0x4062D044, 0x4063B820, 0x00000002, 0x4062D045, - 0x4063B820, 0x00000002, 0x4062D046, 0x4063B820, 0x00000002, 0x4062D047, - 0x4063B820, 0x00000002, 0x4062D048, 0x4063B820, 0x00000002, 0x4062D049, - 0x4063B820, 0x00000002, 0x4062D04A, 0x4063B820, 0x00000002, 0x4062D04B, - 0x4063B820, 0x00000002, 0x4062D04C, 0x4063B820, 0x00000002, 0x4062D04D, - 0x4063B820, 0x00000002, 0x4062D04E, 0x4063B820, 0x00000002, 0x4062D04F, - 0x4063B820, 0x00000002, 0x4062D050, 0x4063B820, 0x00000002, 0x4062D051, - 0x4063B820, 0x00000002, 0x4062D052, 0x4063B820, 0x00000002, 0x4062D053, - 0x4063B820, 0x00000002, 0x4062D054, 0x4063B820, 0x00000002, 0x4062D055, - 0x4063B820, 0x00000002, 0x4062D056, 0x4063B820, 0x00000002, 0x4062D057, - 0x4063B820, 0x00000002, 0x4062D058, 0x4063B820, - // Block 659, offset 0xa4c0 - 0x00000002, 0x4062D059, 0x4063B820, 0x00000002, 0x4062D05A, 0x4063B820, - 0x00000002, 0x4062D05B, 0x4063B820, 0x00000003, 0x4062D021, 0x4063B820, - 0x40646420, 0x00000003, 0x4062D022, 0x4063B820, 0x40646420, 0x00000003, - 0x4062D023, 0x4063B820, 0x40646420, 0x00000003, 0x4062D021, 0x4063B820, - 0x40646A20, 0x00000003, 0x4062D022, 0x4063B820, 0x40646A20, 0x00000003, - 0x4062D023, 0x4063B820, 0x40646A20, 0x00000003, 0x4062D024, 0x4063B820, - 0x40646A20, 0x00000003, 0x4062D025, 0x4063B820, 0x40646A20, 0x00000003, - 0x4062D026, 0x4063B820, 0x40646A20, 0x00000003, 0x4062D027, 0x4063B820, - 0x40646A20, 0x00000003, 0x4062D028, 0x4063B820, 0x40646A20, 0x00000003, - 0x4062D029, 0x4063B820, 0x40646A20, 0x00000003, 0x4062D02A, 0x4063B820, - 0x40646A20, 0x00000003, 0x4062D02B, 0x4063B820, - // Block 660, offset 0xa500 - 0x40646A20, 0x00000003, 0x4062D021, 0x4063B820, 0x40647220, 0x00000003, - 0x4062D022, 0x4063B820, 0x40647220, 0x00000003, 0x4062D023, 0x4063B820, - 0x40647220, 0x00000003, 0x4062D024, 0x4063B820, 0x40647220, 0x00000003, - 0x4062D021, 0x4063B820, 0x40648C20, 0x00000003, 0x4062D022, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062D023, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062D024, 0x4063B820, 0x40648C20, 0x00000003, 0x4062D025, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062D026, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062D027, 0x4063B820, 0x40648C20, 0x00000003, 0x4062D028, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062D029, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062D02A, 0x4063B820, 0x40648C20, 0x00000003, 0x4062D02B, 0x4063B820, - 0x40648C20, 0x00000003, 0x4062D02C, 0x4063B820, - // Block 661, offset 0xa540 - 0x40648C20, 0x00000003, 0x4062D02D, 0x4063B820, 0x40648C20, 0x00000003, - 0x4062D02E, 0x4063B820, 0x40648C20, 0x00000003, 0x4062D02F, 0x4063B820, - 0x40648C20, 0x00000002, 0x4062D021, 0x4063BA20, 0x00000002, 0x4062D022, - 0x4063BA20, 0x00000002, 0x4062D023, 0x4063BA20, 0x00000002, 0x4062D024, - 0x4063BA20, 0x00000002, 0x4062D025, 0x4063BA20, 0x00000002, 0x4062D026, - 0x4063BA20, 0x00000002, 0x4062D027, 0x4063BA20, 0x00000002, 0x4062D028, - 0x4063BA20, 0x00000002, 0x4062D029, 0x4063BA20, 0x00000002, 0x4062D02A, - 0x4063BA20, 0x00000002, 0x4062D02B, 0x4063BA20, 0x00000002, 0x4062D02C, - 0x4063BA20, 0x00000002, 0x4062D02D, 0x4063BA20, 0x00000002, 0x4062D02E, - 0x4063BA20, 0x00000002, 0x4062D02F, 0x4063BA20, 0x00000002, 0x4062D030, - 0x4063BA20, 0x00000002, 0x4062D031, 0x4063BA20, - // Block 662, offset 0xa580 - 0x00000002, 0x4062D032, 0x4063BA20, 0x00000002, 0x4062D033, 0x4063BA20, - 0x00000002, 0x4062D034, 0x4063BA20, 0x00000002, 0x4062D035, 0x4063BA20, - 0x00000003, 0x4062D021, 0x4063BA20, 0x40646420, 0x00000003, 0x4062D022, - 0x4063BA20, 0x40646420, 0x00000003, 0x4062D023, 0x4063BA20, 0x40646420, - 0x00000003, 0x4062D024, 0x4063BA20, 0x40646420, 0x00000003, 0x4062D025, - 0x4063BA20, 0x40646420, 0x00000003, 0x4062D026, 0x4063BA20, 0x40646420, - 0x00000003, 0x4062D027, 0x4063BA20, 0x40646420, 0x00000003, 0x4062D028, - 0x4063BA20, 0x40646420, 0x00000003, 0x4062D029, 0x4063BA20, 0x40646420, - 0x00000003, 0x4062D021, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D022, - 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D023, 0x4063BA20, 0x40646A20, - 0x00000003, 0x4062D024, 0x4063BA20, 0x40646A20, - // Block 663, offset 0xa5c0 - 0x00000003, 0x4062D025, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D026, - 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D027, 0x4063BA20, 0x40646A20, - 0x00000003, 0x4062D028, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D029, - 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D02A, 0x4063BA20, 0x40646A20, - 0x00000003, 0x4062D02B, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D02C, - 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D02D, 0x4063BA20, 0x40646A20, - 0x00000003, 0x4062D02E, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D02F, - 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D030, 0x4063BA20, 0x40646A20, - 0x00000003, 0x4062D031, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D032, - 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D033, 0x4063BA20, 0x40646A20, - 0x00000003, 0x4062D034, 0x4063BA20, 0x40646A20, - // Block 664, offset 0xa600 - 0x00000003, 0x4062D035, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D036, - 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D037, 0x4063BA20, 0x40646A20, - 0x00000003, 0x4062D038, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D039, - 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D03A, 0x4063BA20, 0x40646A20, - 0x00000003, 0x4062D03B, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D03C, - 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D03D, 0x4063BA20, 0x40646A20, - 0x00000003, 0x4062D021, 0x4063BA20, 0x40647220, 0x00000003, 0x4062D022, - 0x4063BA20, 0x40647220, 0x00000003, 0x4062D023, 0x4063BA20, 0x40647220, - 0x00000003, 0x4062D024, 0x4063BA20, 0x40647220, 0x00000003, 0x4062D025, - 0x4063BA20, 0x40647220, 0x00000003, 0x4062D026, 0x4063BA20, 0x40647220, - 0x00000003, 0x4062D021, 0x4063BA20, 0x40648C20, - // Block 665, offset 0xa640 - 0x00000003, 0x4062D022, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D023, - 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D024, 0x4063BA20, 0x40648C20, - 0x00000003, 0x4062D025, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D026, - 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D027, 0x4063BA20, 0x40648C20, - 0x00000003, 0x4062D028, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D029, - 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D02A, 0x4063BA20, 0x40648C20, - 0x00000003, 0x4062D02B, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D02C, - 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D02D, 0x4063BA20, 0x40648C20, - 0x00000003, 0x4062D02E, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D02F, - 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D030, 0x4063BA20, 0x40648C20, - 0x00000003, 0x4062D031, 0x4063BA20, 0x40648C20, - // Block 666, offset 0xa680 - 0x00000003, 0x4062D032, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D033, - 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D034, 0x4063BA20, 0x40648C20, - 0x00000003, 0x4062D035, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D036, - 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D037, 0x4063BA20, 0x40648C20, - 0x00000003, 0x4062D038, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D039, - 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D03A, 0x4063BA20, 0x40648C20, - 0x00000003, 0x4062D03B, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D03C, - 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D03D, 0x4063BA20, 0x40648C20, - 0x00000003, 0x4062D03E, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D03F, - 0x4063BA20, 0x40648C20, 0x00000002, 0x4062D021, 0x4063BE20, 0x00000002, - 0x4062D022, 0x4063BE20, 0x00000002, 0x4062D023, - // Block 667, offset 0xa6c0 - 0x4063BE20, 0x00000002, 0x4062D024, 0x4063BE20, 0x00000002, 0x4062D025, - 0x4063BE20, 0x00000002, 0x4062D026, 0x4063BE20, 0x00000002, 0x4062D027, - 0x4063BE20, 0x00000002, 0x4062D028, 0x4063BE20, 0x00000002, 0x4062D029, - 0x4063BE20, 0x00000002, 0x4062D02A, 0x4063BE20, 0x00000002, 0x4062D02B, - 0x4063BE20, 0x00000002, 0x4062D02C, 0x4063BE20, 0x00000002, 0x4062D02D, - 0x4063BE20, 0x00000002, 0x4062D02E, 0x4063BE20, 0x00000002, 0x4062D02F, - 0x4063BE20, 0x00000002, 0x4062D030, 0x4063BE20, 0x00000002, 0x4062D031, - 0x4063BE20, 0x00000002, 0x4062D032, 0x4063BE20, 0x00000002, 0x4062D033, - 0x4063BE20, 0x00000002, 0x4062D034, 0x4063BE20, 0x00000002, 0x4062D035, - 0x4063BE20, 0x00000002, 0x4062D036, 0x4063BE20, 0x00000002, 0x4062D037, - 0x4063BE20, 0x00000002, 0x4062D038, 0x4063BE20, - // Block 668, offset 0xa700 - 0x00000002, 0x4062D039, 0x4063BE20, 0x00000002, 0x4062D03A, 0x4063BE20, - 0x00000002, 0x4062D03B, 0x4063BE20, 0x00000002, 0x4062D03C, 0x4063BE20, - 0x00000002, 0x4062D03D, 0x4063BE20, 0x00000003, 0x4062D021, 0x4063BE20, - 0x40646420, 0x00000003, 0x4062D022, 0x4063BE20, 0x40646420, 0x00000003, - 0x4062D023, 0x4063BE20, 0x40646420, 0x00000003, 0x4062D021, 0x4063BE20, - 0x40648C20, 0x00000003, 0x4062D022, 0x4063BE20, 0x40648C20, 0x00000003, - 0x4062D023, 0x4063BE20, 0x40648C20, 0x00000003, 0x4062D024, 0x4063BE20, - 0x40648C20, 0x00000003, 0x4062D025, 0x4063BE20, 0x40648C20, 0x00000003, - 0x4062D026, 0x4063BE20, 0x40648C20, 0x00000002, 0x4062D021, 0x4063C020, - 0x00000002, 0x4062D022, 0x4063C020, 0x00000002, 0x4062D023, 0x4063C020, - 0x00000002, 0x4062D024, 0x4063C020, 0x00000002, - // Block 669, offset 0xa740 - 0x4062D025, 0x4063C020, 0x00000002, 0x4062D026, 0x4063C020, 0x00000002, - 0x4062D027, 0x4063C020, 0x00000002, 0x4062D028, 0x4063C020, 0x00000002, - 0x4062D029, 0x4063C020, 0x00000002, 0x4062D02A, 0x4063C020, 0x00000002, - 0x4062D02B, 0x4063C020, 0x00000002, 0x4062D02C, 0x4063C020, 0x00000002, - 0x4062D02D, 0x4063C020, 0x00000002, 0x4062D02E, 0x4063C020, 0x00000002, - 0x4062D02F, 0x4063C020, 0x00000002, 0x4062D030, 0x4063C020, 0x00000002, - 0x4062D031, 0x4063C020, 0x00000002, 0x4062D032, 0x4063C020, 0x00000002, - 0x4062D033, 0x4063C020, 0x00000002, 0x4062D034, 0x4063C020, 0x00000002, - 0x4062D035, 0x4063C020, 0x00000002, 0x4062D021, 0x4063C220, 0x00000002, - 0x4062D022, 0x4063C220, 0x00000002, 0x4062D023, 0x4063C220, 0x00000002, - 0x4062D024, 0x4063C220, 0x00000002, 0x4062D025, - // Block 670, offset 0xa780 - 0x4063C220, 0x00000002, 0x4062D026, 0x4063C220, 0x00000002, 0x4062D027, - 0x4063C220, 0x00000002, 0x4062D028, 0x4063C220, 0x00000002, 0x4062D029, - 0x4063C220, 0x00000002, 0x4062D02A, 0x4063C220, 0x00000002, 0x4062D02B, - 0x4063C220, 0x00000002, 0x4062D02C, 0x4063C220, 0x00000002, 0x4062D02D, - 0x4063C220, 0x00000002, 0x4062D02E, 0x4063C220, 0x00000002, 0x4062D02F, - 0x4063C220, 0x00000002, 0x4062D030, 0x4063C220, 0x00000002, 0x4062D031, - 0x4063C220, 0x00000002, 0x4062D032, 0x4063C220, 0x00000002, 0x4062D033, - 0x4063C220, 0x00000002, 0x4062D034, 0x4063C220, 0x00000002, 0x4062D035, - 0x4063C220, 0x00000002, 0x4062D036, 0x4063C220, 0x00000002, 0x4062D037, - 0x4063C220, 0x00000002, 0x4062D038, 0x4063C220, 0x00000003, 0x4062D021, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062D022, - // Block 671, offset 0xa7c0 - 0x4063C220, 0x40646A20, 0x00000003, 0x4062D023, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062D024, 0x4063C220, 0x40646A20, 0x00000003, 0x4062D025, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062D026, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062D027, 0x4063C220, 0x40646A20, 0x00000003, 0x4062D028, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062D029, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062D02A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062D02B, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062D02C, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062D02D, 0x4063C220, 0x40646A20, 0x00000003, 0x4062D02E, - 0x4063C220, 0x40646A20, 0x00000003, 0x4062D02F, 0x4063C220, 0x40646A20, - 0x00000003, 0x4062D030, 0x4063C220, 0x40646A20, 0x00000003, 0x4062D021, - 0x4063C220, 0x40647220, 0x00000003, 0x4062D021, - // Block 672, offset 0xa800 - 0x4063C220, 0x40648C20, 0x00000003, 0x4062D021, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062D022, 0x4063C420, 0x40646A20, 0x00000003, 0x4062D023, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062D024, 0x4063C420, 0x40646A20, - 0x00000003, 0x4062D025, 0x4063C420, 0x40646A20, 0x00000003, 0x4062D026, - 0x4063C420, 0x40646A20, 0x00000003, 0x4062D027, 0x4063C420, 0x40646A20, - 0x00000002, 0x4062D021, 0x4063C620, 0x00000002, 0x4062D022, 0x4063C620, - 0x00000002, 0x4062D023, 0x4063C620, 0x00000002, 0x4062D024, 0x4063C620, - 0x00000002, 0x4062D025, 0x4063C620, 0x00000002, 0x4062D026, 0x4063C620, - 0x00000002, 0x4062D027, 0x4063C620, 0x00000002, 0x4062D021, 0x4063C820, - 0x00000002, 0x4062D022, 0x4063C820, 0x00000002, 0x4062D023, 0x4063C820, - 0x00000002, 0x4062D024, 0x4063C820, 0x00000002, - // Block 673, offset 0xa840 - 0x4062D025, 0x4063C820, 0x00000002, 0x4062D026, 0x4063C820, 0x00000002, - 0x4062D027, 0x4063C820, 0x00000002, 0x4062D028, 0x4063C820, 0x00000002, - 0x4062D029, 0x4063C820, 0x00000002, 0x4062D02A, 0x4063C820, 0x00000002, - 0x4062D021, 0x4063CA20, 0x00000002, 0x4062D022, 0x4063CA20, 0x00000002, - 0x4062D023, 0x4063CA20, 0x00000002, 0x4062D024, 0x4063CA20, 0x00000002, - 0x4062D025, 0x4063CA20, 0x00000002, 0x4062D026, 0x4063CA20, 0x00000002, - 0x4062D027, 0x4063CA20, 0x00000002, 0x4062D028, 0x4063CA20, 0x00000002, - 0x4062D029, 0x4063CA20, 0x00000002, 0x4062D02A, 0x4063CA20, 0x00000003, - 0x4062D021, 0x4063CA20, 0x40647220, 0x00000003, 0x4062D022, 0x4063CA20, - 0x40647220, 0x00000003, 0x4062D023, 0x4063CA20, 0x40647220, 0x00000003, - 0x4062D024, 0x4063CA20, 0x40647220, 0x00000003, - // Block 674, offset 0xa880 - 0x4062D021, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062D022, 0x4063CA20, - 0x40648C20, 0x00000003, 0x4062D023, 0x4063CA20, 0x40648C20, 0x00000003, - 0x4062D024, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062D025, 0x4063CA20, - 0x40648C20, 0x00000003, 0x4062D026, 0x4063CA20, 0x40648C20, 0x00000003, - 0x4062D027, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062D021, 0x4063CC20, - 0x40646420, 0x00000003, 0x4062D021, 0x4063CC20, 0x40646A20, 0x00000003, - 0x4062D022, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062D023, 0x4063CC20, - 0x40646A20, 0x00000003, 0x4062D024, 0x4063CC20, 0x40646A20, 0x00000003, - 0x4062D025, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062D026, 0x4063CC20, - 0x40646A20, 0x00000003, 0x4062D027, 0x4063CC20, 0x40646A20, 0x00000003, - 0x4062D028, 0x4063CC20, 0x40646A20, 0x00000003, - // Block 675, offset 0xa8c0 - 0x4062D029, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062D02A, 0x4063CC20, - 0x40646A20, 0x00000003, 0x4062D021, 0x4063CC20, 0x40647220, 0x00000003, - 0x4062D022, 0x4063CC20, 0x40647220, 0x00000003, 0x4062D023, 0x4063CC20, - 0x40647220, 0x00000003, 0x4062D024, 0x4063CC20, 0x40647220, 0x00000003, - 0x4062D025, 0x4063CC20, 0x40647220, 0x00000003, 0x4062D026, 0x4063CC20, - 0x40647220, 0x00000003, 0x4062D027, 0x4063CC20, 0x40647220, 0x00000003, - 0x4062D028, 0x4063CC20, 0x40647220, 0x00000003, 0x4062D029, 0x4063CC20, - 0x40647220, 0x00000003, 0x4062D021, 0x4063CC20, 0x40648220, 0x00000003, - 0x4062D022, 0x4063CC20, 0x40648220, 0x00000003, 0x4062D023, 0x4063CC20, - 0x40648220, 0x00000003, 0x4062D024, 0x4063CC20, 0x40648220, 0x00000003, - 0x4062D021, 0x4063CC20, 0x40648420, 0x00000003, - // Block 676, offset 0xa900 - 0x4062D022, 0x4063CC20, 0x40648420, 0x00000003, 0x4062D023, 0x4063CC20, - 0x40648420, 0x00000003, 0x4062D024, 0x4063CC20, 0x40648420, 0x00000003, - 0x4062D025, 0x4063CC20, 0x40648420, 0x00000003, 0x4062D026, 0x4063CC20, - 0x40648420, 0x00000003, 0x4062D027, 0x4063CC20, 0x40648420, 0x00000003, - 0x4062D028, 0x4063CC20, 0x40648420, 0x00000003, 0x4062D021, 0x4063CC20, - 0x40648C20, 0x00000002, 0x4062D021, 0x4063CE20, 0x00000002, 0x4062D022, - 0x4063CE20, 0x00000002, 0x4062D023, 0x4063CE20, 0x00000002, 0x4062D024, - 0x4063CE20, 0x00000002, 0x4062D025, 0x4063CE20, 0x00000002, 0x4062D026, - 0x4063CE20, 0x00000002, 0x4062D027, 0x4063CE20, 0x00000002, 0x4062D028, - 0x4063CE20, 0x00000002, 0x4062D029, 0x4063CE20, 0x00000002, 0x4062D02A, - 0x4063CE20, 0x00000002, 0x4062D02B, 0x4063CE20, - // Block 677, offset 0xa940 - 0x00000002, 0x4062D02C, 0x4063CE20, 0x00000002, 0x4062D02D, 0x4063CE20, - 0x00000002, 0x4062D02E, 0x4063CE20, 0x00000002, 0x4062D02F, 0x4063CE20, - 0x00000002, 0x4062D030, 0x4063CE20, 0x00000002, 0x4062D031, 0x4063CE20, - 0x00000002, 0x4062D032, 0x4063CE20, 0x00000002, 0x4062D033, 0x4063CE20, - 0x00000002, 0x4062D034, 0x4063CE20, 0x00000002, 0x4062D035, 0x4063CE20, - 0x00000002, 0x4062D036, 0x4063CE20, 0x00000002, 0x4062D037, 0x4063CE20, - 0x00000002, 0x4062D038, 0x4063CE20, 0x00000002, 0x4062D039, 0x4063CE20, - 0x00000002, 0x4062D03A, 0x4063CE20, 0x00000002, 0x4062D03B, 0x4063CE20, - 0x00000002, 0x4062D03C, 0x4063CE20, 0x00000002, 0x4062D03D, 0x4063CE20, - 0x00000002, 0x4062D03E, 0x4063CE20, 0x00000002, 0x4062D03F, 0x4063CE20, - 0x00000003, 0x4062D021, 0x4063D020, 0x40647220, - // Block 678, offset 0xa980 - 0x00000003, 0x4062D022, 0x4063D020, 0x40647220, 0x00000003, 0x4062D023, - 0x4063D020, 0x40647220, 0x00000003, 0x4062D024, 0x4063D020, 0x40647220, - 0x00000003, 0x4062D025, 0x4063D020, 0x40647220, 0x00000003, 0x4062D026, - 0x4063D020, 0x40647220, 0x00000002, 0x40403C20, 0xA070F102, 0x00000002, - 0x402D9A22, 0xAE603202, 0x00000002, 0x002D9AC3, 0xAE603202, 0x00000002, - 0x402D9A22, 0xAE603502, 0x00000002, 0x002D9AC3, 0xAE603502, 0x00000002, - 0x402D9A22, 0xAE603C02, 0x00000002, 0x002D9AC3, 0xAE603C02, 0x00000002, - 0x402D9A22, 0xAE604302, 0x00000002, 0x402D9A22, 0xAE604702, 0x00000002, - 0x002D9AC3, 0xAE604702, 0x00000002, 0x402D9A22, 0xAE604E02, 0x00000002, - 0x002D9AC3, 0xAE604E02, 0x00000002, 0x402D9A22, 0xAE605202, 0x00000002, - 0x002D9AC3, 0xAE605202, 0x00000002, 0x402D9A22, - // Block 679, offset 0xa9c0 - 0xAE605B02, 0x00000002, 0x002D9AC3, 0xAE605B02, 0x00000002, 0x402D9A22, - 0xAE606402, 0x00000002, 0x002D9AC3, 0xAE606402, 0x00000002, 0x402D9A22, - 0xADC07002, 0x00000002, 0x002D9AC3, 0xADC07002, 0x00000002, 0x40306C22, - 0xAE604702, 0x00000002, 0x00306CC3, 0xAE604702, 0x00000002, 0x40302A20, - 0xAE605202, 0x00000002, 0x00302A83, 0xAE605202, 0x00000002, 0x40442221, - 0x82092248, 0x00000002, 0x004422A3, 0x82092248, 0x00000002, 0x40443E21, - 0x82092248, 0x00000002, 0x00443EA3, 0x82092248, 0x00000002, 0x00444883, - 0x82092248, 0x00000002, 0x40444821, 0x82092248, 0x00000002, 0x004448A3, - 0x82092248, 0x00000002, 0x40445421, 0x82092248, 0x00000002, 0x40445821, - 0x82092248, 0x00000002, 0x004458A3, 0x82092248, 0x00000002, 0x40445A21, - 0x82092248, 0x00000002, 0x00445AA3, 0x82092248, - // Block 680, offset 0xaa00 - 0x00000002, 0x40446621, 0x82092248, 0x00000002, 0x004466A3, 0x82092248, - 0x00000002, 0x402D6820, 0xA0007D02, 0x00000002, 0x002D6894, 0xA0007D14, - 0x00000005, 0x404E6020, 0x404E8420, 0x404E2420, 0x8209278B, 0x404F3020, - 0x00000006, 0x404E6A20, 0x8209278B, 0x404E6A20, 0x404EEE20, 0x404E7220, - 0x8209278B, 0x00000006, 0x404E6A21, 0x40510E20, 0x404EE620, 0x404EEE20, - 0x404E1420, 0x8209278B, 0x00000004, 0x404E8C21, 0x40510A20, 0x404EFE20, - 0x404F2E20, 0x00000006, 0x404E9420, 0x404E1420, 0x8209278B, 0x404E8220, - 0x404E1420, 0x8209278B, 0x00000005, 0x404E9420, 0x404E1420, 0x8209278B, - 0x404E8820, 0x404EDE20, 0x0000000A, 0x404E9421, 0x404E4820, 0x8209278B, - 0x404F3020, 0x404E1420, 0x404EFE20, 0x404EDE20, 0x404E2420, 0x8209278B, - 0x404F3020, 0x00000003, 0x404EA620, 0x404E8420, - // Block 681, offset 0xaa40 - 0x404EEA20, 0x00000003, 0x404EA620, 0x8209278A, 0x404EA620, 0x00000002, - 0x004EC283, 0x404EE620, 0x00000002, 0x404EC221, 0x404EE620, 0x00000002, - 0x004EC283, 0x404EEA20, 0x00000002, 0x004EC283, 0x404EEE20, 0x00000003, - 0x004EC283, 0x404EEE20, 0x404F0C20, 0x00000002, 0x004EC283, 0x404EF420, - 0x00000002, 0x004EC283, 0x404EFE20, 0x00000002, 0x004EC284, 0x404EFE20, - 0x00000003, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E1420, 0x8209278A, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E1420, 0x8209278A, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E1420, 0x8209278B, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E1420, 0x8209278B, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E1820, 0x8209278A, - // Block 682, offset 0xaa80 - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E1820, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E1820, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E1820, 0x8209278B, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E1C20, 0x8209278A, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E1C20, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E1C20, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E1C20, 0x8209278B, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E2220, 0x8209278A, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E2220, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E2220, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - // Block 683, offset 0xaac0 - 0x404E2220, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E2420, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E2420, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E2420, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E2420, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E2820, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E2820, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E2820, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E2820, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E2E20, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E2E20, 0x8209278A, 0x00000005, 0x004EC283, - // Block 684, offset 0xab00 - 0x404EFE20, 0x404EDE20, 0x404E2E20, 0x8209278B, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E2E20, 0x8209278B, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E3220, 0x8209278A, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E3220, 0x8209278A, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E3220, 0x8209278B, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E3220, 0x8209278B, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E4220, 0x8209278A, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E4220, 0x8209278A, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E4220, 0x8209278B, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E4220, 0x8209278B, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E4820, 0x8209278A, - // Block 685, offset 0xab40 - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E4820, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E4820, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E4820, 0x8209278B, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E4A20, 0x8209278A, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E4A20, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E4A20, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E4A20, 0x8209278B, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E4E20, 0x8209278A, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E4E20, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E4E20, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - // Block 686, offset 0xab80 - 0x404E4E20, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E5220, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E5220, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E5220, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E5220, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E5620, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E5620, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E5620, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E5620, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E5A20, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E5A20, 0x8209278A, 0x00000005, 0x004EC283, - // Block 687, offset 0xabc0 - 0x404EFE20, 0x404EDE20, 0x404E5A20, 0x8209278B, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E5A20, 0x8209278B, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E5E20, 0x8209278A, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E5E20, 0x8209278A, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E5E20, 0x8209278B, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E5E20, 0x8209278B, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E6020, 0x8209278A, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E6020, 0x8209278A, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E6020, 0x8209278B, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E6020, 0x8209278B, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E6220, 0x8209278A, - // Block 688, offset 0xac00 - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E6220, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E6220, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E6220, 0x8209278B, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E6620, 0x8209278A, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E6620, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E6620, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E6620, 0x8209278B, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E6A20, 0x8209278A, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E6A20, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E6A20, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - // Block 689, offset 0xac40 - 0x404E6A20, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E7220, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E7220, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E7220, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E7220, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E7420, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E7420, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E7420, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E7420, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404E7E20, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404E7E20, 0x8209278A, 0x00000005, 0x004EC283, - // Block 690, offset 0xac80 - 0x404EFE20, 0x404EDE20, 0x404E7E20, 0x8209278B, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E7E20, 0x8209278B, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E8220, 0x8209278A, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E8220, 0x8209278A, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E8220, 0x8209278B, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E8220, 0x8209278B, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E8420, 0x8209278A, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E8420, 0x8209278A, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E8420, 0x8209278B, 0x00000005, 0x004EC284, - 0x404EFE20, 0x404EDE20, 0x404E8420, 0x8209278B, 0x00000005, 0x004EC283, - 0x404EFE20, 0x404EDE20, 0x404E8820, 0x8209278A, - // Block 691, offset 0xacc0 - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E8820, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E8820, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E8820, 0x8209278B, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E8C20, 0x8209278A, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E8C20, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E8C20, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E8C20, 0x8209278B, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E9420, 0x8209278A, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E9420, 0x8209278A, - 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E9420, 0x8209278B, - 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - // Block 692, offset 0xad00 - 0x404E9420, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404EA620, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404EA620, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404EA620, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404EA620, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404EAA20, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404EAA20, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x404EAA20, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, - 0x404EAA20, 0x8209278B, 0x00000004, 0x004EC283, 0x404EFE20, 0x404EDE20, - 0x8209278B, 0x00000006, 0x404EFE20, 0x404EDE20, 0x404E1420, 0x8209278B, - 0x404E1420, 0x40510420, 0x00000002, 0x402C9A20, - // Block 693, offset 0xad40 - 0xAE603202, 0x00000002, 0x002C9A83, 0xAE603202, 0x00000002, 0x402C9A20, - 0xAE603502, 0x00000002, 0x002C9A83, 0xAE603502, 0x00000002, 0x402C9A20, - 0xAE604E02, 0x00000002, 0x002C9A83, 0xAE604E02, 0x00000002, 0x402C9A20, - 0xAE606402, 0x00000002, 0x002C9A83, 0xAE606402, 0x00000002, 0x402C9A20, - 0xADC07002, 0x00000002, 0x002C9A83, 0xADC07002, 0x00000002, 0x402EE420, - 0xAE603202, 0x00000002, 0x002EE483, 0xAE603202, 0x00000002, 0x402EE420, - 0xAE603502, 0x00000002, 0x002EE483, 0xAE603502, 0x00000002, 0x402EE420, - 0xAE606402, 0x00000002, 0x002EE483, 0xAE606402, 0x00000002, 0x402EE420, - 0xADC07002, 0x00000002, 0x002EE483, 0xADC07002, 0x00000002, 0x40411620, - 0xA000FA02, 0x00000002, 0x40411E20, 0xA000FA02, 0x00000002, 0x40412020, - 0xA000FA02, 0x00000002, 0x40412A20, 0xA000FA02, - // Block 694, offset 0xad80 - 0x00000002, 0x40414620, 0xA000FA02, 0x00000002, 0x40415420, 0xA000FA02, - 0x00000002, 0x403A6822, 0xAE60BE02, 0x00000002, 0x003A7C84, 0x00391C84, - 0x00000002, 0x003A7C9A, 0x00391C9A, 0x00000002, 0x40320820, 0xAE603202, - 0x00000002, 0x00320883, 0xAE603202, 0x00000002, 0x40320A20, 0xAE603202, - 0x00000002, 0x00320A83, 0xAE603202, 0x00000002, 0x40320A20, 0xAE605B02, - 0x00000002, 0x00320A83, 0xAE605B02, 0x00000002, 0x40320E21, 0xAE603702, - 0x00000002, 0x00320EA3, 0xAE603702, 0x00000002, 0x40320E21, 0xAE603C02, - 0x00000002, 0x00320EA3, 0xAE603C02, 0x00000002, 0x40321022, 0xAE603202, - 0x00000002, 0x003210C3, 0xAE603202, 0x00000002, 0x40321022, 0xAE604702, - 0x00000002, 0x003210C3, 0xAE604702, 0x00000002, 0x40321022, 0xAE605B02, - 0x00000002, 0x003210C3, 0xAE605B02, 0x00000002, - // Block 695, offset 0xadc0 - 0x40321022, 0xAD806802, 0x00000002, 0x003210C3, 0xAD806802, 0x00000002, - 0x40321023, 0xAE603502, 0x00000002, 0x003210E3, 0xAE603502, 0x00000002, - 0x40321023, 0xAE604E02, 0x00000002, 0x003210E3, 0xAE604E02, 0x00000002, - 0x40321023, 0xAE606402, 0x00000002, 0x003210E3, 0xAE606402, 0x00000002, - 0x40321023, 0xADC07002, 0x00000002, 0x003210E3, 0xADC07002, 0x00000002, - 0x40321024, 0xAE605B02, 0x00000002, 0x00321103, 0xAE605B02, 0x00000002, - 0x402C6020, 0xAE603202, 0x00000002, 0x002C6083, 0xAE603202, 0x00000002, - 0x40321024, 0xAE603202, 0x00000002, 0x00321103, 0xAE603202, 0x00000002, - 0x40321024, 0xAE603502, 0x00000002, 0x00321103, 0xAE603502, 0x00000002, - 0x40321024, 0xAE604E02, 0x00000002, 0x00321103, 0xAE604E02, 0x00000002, - 0x40321024, 0xAE606402, 0x00000002, 0x00321103, - // Block 696, offset 0xae00 - 0xAE606402, 0x00000002, 0x40321024, 0xADC07002, 0x00000002, 0x00321103, - 0xADC07002, 0x00000002, 0x0030BE83, 0xAE604E02, 0x00000002, 0x0030BE83, - 0xADC07002, 0x00000002, 0x00497283, 0x40496C20, 0x00000002, 0x00497284, - 0x40496C20, 0x00000002, 0x402BDE21, 0xAE603702, 0x00000002, 0x002BDEA3, - 0xAE603702, 0x00000002, 0x402BDE21, 0xAE603C02, 0x00000002, 0x002BDEA3, - 0xAE603C02, 0x00000002, 0x402BDE21, 0xAE604302, 0x00000002, 0x002BDEA3, - 0xAE604302, 0x00000002, 0x402BDE22, 0xAE604702, 0x00000002, 0x002BDEC3, - 0xAE604702, 0x00000002, 0x402BDE22, 0xAE605202, 0x00000002, 0x002BDEC3, - 0xAE605202, 0x00000002, 0x402C9821, 0xAE603C02, 0x00000002, 0x002C98A3, - 0xAE603C02, 0x00000002, 0x402C9822, 0xAE603202, 0x00000002, 0x002C98C3, - 0xAE603202, 0x00000002, 0x402C9822, 0xAE603502, - // Block 697, offset 0xae40 - 0x00000002, 0x002C98C3, 0xAE603502, 0x00000002, 0x402D9A21, 0xAE604702, - 0x00000002, 0x002D9AA3, 0xAE604702, 0x00000002, 0x402EE221, 0xAE603C02, - 0x00000002, 0x002EE2A3, 0xAE603C02, 0x00000002, 0x402EE221, 0xAE604E02, - 0x00000002, 0x002EE2A3, 0xAE604E02, 0x00000002, 0x402EE221, 0xAD806802, - 0x00000002, 0x002EE2A3, 0xAD806802, 0x00000002, 0x402EE222, 0xAE603202, - 0x00000002, 0x002EE2C3, 0xAE603202, 0x00000002, 0x402EE222, 0xAE603502, - 0x00000002, 0x002EE2C3, 0xAE603502, 0x00000002, 0x402EE222, 0xAE604702, - 0x00000002, 0x002EE2C3, 0xAE604702, 0x00000002, 0x402EE222, 0xAE604E02, - 0x00000002, 0x002EE2C3, 0xAE604E02, 0x00000002, 0x402EE222, 0xAE605202, - 0x00000002, 0x002EE2C3, 0xAE605202, 0x00000002, 0x402EE222, 0xACA05902, - 0x00000002, 0x002EE2C3, 0xACA05902, 0x00000002, - // Block 698, offset 0xae80 - 0x40306C21, 0xAE604702, 0x00000002, 0x00306CA3, 0xAE604702, 0x00000002, - 0x40306C21, 0xAE604E02, 0x00000002, 0x00306CA3, 0xAE604E02, 0x00000002, - 0x40306C21, 0xAD806802, 0x00000002, 0x00306CA3, 0xAD806802, 0x00000002, - 0xA000AD18, 0xA000BA18, 0x00000002, 0x00393C97, 0x00396497, 0x00000002, - 0x00393C9A, 0x0039649A, 0x00000002, 0x00393C97, 0x00397297, 0x00000002, - 0x00393C9A, 0x0039729A, 0x00000002, 0x00393C97, 0x00397497, 0x00000002, - 0x00393C9A, 0x0039749A, 0x00000002, 0x00393C99, 0x0039A499, 0x00000002, - 0x00393C99, 0x0039A699, 0x00000002, 0x00393C97, 0x003A4E97, 0x00000002, - 0x00393C98, 0x003A4E98, 0x00000002, 0x00393C99, 0x003A4E99, 0x00000002, - 0x00393C9A, 0x003A4E9A, 0x00000002, 0x00393C99, 0x003A5699, 0x00000002, - 0x00395697, 0x00396497, 0x00000002, 0x0039569A, - // Block 699, offset 0xaec0 - 0x0039649A, 0x00000002, 0x00395697, 0x00397297, 0x00000002, 0x0039569A, - 0x0039729A, 0x00000002, 0x00395697, 0x00397497, 0x00000002, 0x0039569A, - 0x0039749A, 0x00000002, 0x00395699, 0x0039A499, 0x00000002, 0x00395699, - 0x0039A699, 0x00000002, 0x00395697, 0x003A4E97, 0x00000002, 0x00395698, - 0x003A4E98, 0x00000002, 0x00395699, 0x003A4E99, 0x00000002, 0x0039569A, - 0x003A4E9A, 0x00000002, 0x00395699, 0x003A5699, 0x00000002, 0x0039589A, - 0x0039649A, 0x00000002, 0x00395899, 0x0039A499, 0x00000002, 0x00395899, - 0x0039A699, 0x00000002, 0x00395897, 0x003A4E97, 0x00000002, 0x00395898, - 0x003A4E98, 0x00000002, 0x00395899, 0x003A4E99, 0x00000002, 0x0039589A, - 0x003A4E9A, 0x00000002, 0x00395899, 0x003A5699, 0x00000002, 0x00396497, - 0x00397297, 0x00000002, 0x0039649A, 0x0039729A, - // Block 700, offset 0xaf00 - 0x00000002, 0x00396497, 0x003A4E97, 0x00000002, 0x0039649A, 0x003A4E9A, - 0x00000002, 0x00397297, 0x00396497, 0x00000002, 0x0039729A, 0x0039649A, - 0x00000002, 0x00397297, 0x003A4E97, 0x00000002, 0x0039729A, 0x003A4E9A, - 0x00000002, 0x00397497, 0x00396497, 0x00000002, 0x0039749A, 0x0039649A, - 0x00000002, 0x0039749A, 0x0039729A, 0x00000002, 0x00397497, 0x003A4E97, - 0x00000002, 0x0039749A, 0x003A4E9A, 0x00000002, 0x00398A9A, 0xA000D11A, - 0x00000002, 0x0039A49A, 0xA000D11A, 0x00000002, 0x0039C697, 0x00396497, - 0x00000002, 0x0039C698, 0x00396498, 0x00000002, 0x0039C69A, 0x0039649A, - 0x00000002, 0x0039C697, 0x00397297, 0x00000002, 0x0039C698, 0x00397298, - 0x00000002, 0x0039C69A, 0x0039729A, 0x00000002, 0x0039C697, 0x00397497, - 0x00000002, 0x0039C698, 0x00397498, 0x00000002, - // Block 701, offset 0xaf40 - 0x0039C69A, 0x0039749A, 0x00000002, 0x0039C699, 0x0039A499, 0x00000002, - 0x0039C69A, 0x0039A49A, 0x00000002, 0x0039C697, 0x003A4E97, 0x00000002, - 0x0039C698, 0x003A4E98, 0x00000002, 0x0039C69A, 0x003A4E9A, 0x00000002, - 0x0039C897, 0x00396497, 0x00000002, 0x0039C898, 0x00396498, 0x00000002, - 0x0039C899, 0x00396499, 0x00000002, 0x0039C89A, 0x0039649A, 0x00000002, - 0x0039C897, 0x00397297, 0x00000002, 0x0039C898, 0x00397298, 0x00000002, - 0x0039C899, 0x00397299, 0x00000002, 0x0039C89A, 0x0039729A, 0x00000002, - 0x0039C897, 0x00397497, 0x00000002, 0x0039C898, 0x00397498, 0x00000002, - 0x0039C899, 0x00397499, 0x00000002, 0x0039C89A, 0x0039749A, 0x00000002, - 0x0039C899, 0x0039A499, 0x00000002, 0x0039C89A, 0x0039A49A, 0x00000002, - 0x0039C897, 0x003A4E97, 0x00000002, 0x0039C898, - // Block 702, offset 0xaf80 - 0x003A4E98, 0x00000002, 0x0039C899, 0x003A4E99, 0x00000002, 0x0039C89A, - 0x003A4E9A, 0x00000002, 0x0039DC97, 0x00397297, 0x00000002, 0x0039DC9A, - 0x0039729A, 0x00000002, 0x0039DC97, 0x00397497, 0x00000002, 0x0039DC99, - 0x0039A499, 0x00000002, 0x0039DC9A, 0x0039A49A, 0x00000002, 0x0039DC97, - 0x003A4E97, 0x00000002, 0x0039DC9A, 0x003A4E9A, 0x00000002, 0x0039DE97, - 0x00396497, 0x00000002, 0x0039DE9A, 0x0039649A, 0x00000002, 0x0039DE97, - 0x00397297, 0x00000002, 0x0039DE9A, 0x0039729A, 0x00000002, 0x0039DE97, - 0x00397497, 0x00000002, 0x0039DE9A, 0x0039749A, 0x00000002, 0x0039DE99, - 0x0039A499, 0x00000002, 0x0039DE9A, 0x0039A49A, 0x00000002, 0x0039DE97, - 0x003A4E97, 0x00000002, 0x0039DE9A, 0x003A4E9A, 0x00000002, 0x0039E697, - 0x00397297, 0x00000002, 0x0039E69A, 0x0039729A, - // Block 703, offset 0xafc0 - 0x00000002, 0x0039E697, 0x003A4E97, 0x00000002, 0x0039E698, 0x003A4E98, - 0x00000002, 0x0039E69A, 0x003A4E9A, 0x00000002, 0x0039E897, 0x003A4E97, - 0x00000002, 0x0039E898, 0x003A4E98, 0x00000002, 0x0039E89A, 0x003A4E9A, - 0x00000002, 0x0039EE97, 0x00396497, 0x00000002, 0x0039EE9A, 0x0039649A, - 0x00000002, 0x0039EE97, 0x003A4E97, 0x00000002, 0x0039EE9A, 0x003A4E9A, - 0x00000002, 0x0039F097, 0x00396497, 0x00000002, 0x0039F09A, 0x0039649A, - 0x00000002, 0x0039F097, 0x003A4E97, 0x00000002, 0x0039F09A, 0x003A4E9A, - 0x00000002, 0x0039FC97, 0x00396497, 0x00000002, 0x0039FC9A, 0x0039649A, - 0x00000002, 0x0039FC97, 0x00397297, 0x00000002, 0x0039FC9A, 0x0039729A, - 0x00000002, 0x0039FC97, 0x00397497, 0x00000002, 0x0039FC9A, 0x0039749A, - 0x00000002, 0x0039FC97, 0x003A4E97, 0x00000002, - // Block 704, offset 0xb000 - 0x0039FC9A, 0x003A4E9A, 0x00000002, 0x003A1297, 0x00397297, 0x00000002, - 0x003A129A, 0x0039729A, 0x00000002, 0x003A1297, 0x003A4E97, 0x00000002, - 0x003A129A, 0x003A4E9A, 0x00000002, 0x003A4099, 0x00393899, 0x00000002, - 0x003A409A, 0x0039389A, 0x00000002, 0x003A4097, 0x00396497, 0x00000002, - 0x003A409A, 0x0039649A, 0x00000002, 0x003A4097, 0x00397297, 0x00000002, - 0x003A409A, 0x0039729A, 0x00000002, 0x003A4097, 0x00397497, 0x00000002, - 0x003A409A, 0x0039749A, 0x00000002, 0x003A4097, 0x003A4E97, 0x00000002, - 0x003A4098, 0x003A4E98, 0x00000002, 0x003A4099, 0x003A4E99, 0x00000002, - 0x003A409A, 0x003A4E9A, 0x00000002, 0x003A4E99, 0x00393899, 0x00000002, - 0x003A4E97, 0x00396497, 0x00000002, 0x003A4E9A, 0x0039649A, 0x00000002, - 0x003A4E97, 0x00397297, 0x00000002, 0x003A4E9A, - // Block 705, offset 0xb040 - 0x0039729A, 0x00000002, 0x003A4E97, 0x00397497, 0x00000002, 0x003A4E9A, - 0x0039749A, 0x00000002, 0x003A4E97, 0x003A4E97, 0x00000002, 0x003A4E99, - 0x003A4E99, 0x00000002, 0x003A4E9A, 0x003A4E9A, 0x00000002, 0x003A5697, - 0x00396497, 0x00000002, 0x003A569A, 0x0039649A, 0x00000002, 0x003A5697, - 0x00397297, 0x00000002, 0x003A569A, 0x0039729A, 0x00000002, 0x003A5697, - 0x00397497, 0x00000002, 0x003A569A, 0x0039749A, 0x00000002, 0x003A5699, - 0x0039A499, 0x00000002, 0x003A5699, 0x0039A699, 0x00000002, 0x003A5697, - 0x003A4E97, 0x00000002, 0x003A5698, 0x003A4E98, 0x00000002, 0x003A5699, - 0x003A4E99, 0x00000002, 0x003A569A, 0x003A4E9A, 0x00000002, 0x003A5699, - 0x003A5699, 0x00000002, 0x403A7220, 0xA000C602, 0x00000002, 0x003A7484, - 0x00391C84, 0x00000002, 0xAE604702, 0xAE603802, - // Block 706, offset 0xb080 - 0x00000002, 0x40062C20, 0xAE603802, 0x00000002, 0x40063620, 0xAE603802, - 0x00000002, 0x40063820, 0xAE603802, 0x00000002, 0x402BDE20, 0xAE603602, - 0x00000002, 0x002BDE88, 0xAE603602, 0x00000002, 0x402BDE20, 0xAE603702, - 0x00000002, 0x002BDE88, 0xAE603702, 0x00000002, 0x402BDE20, 0xAE603802, - 0x00000002, 0x002BDE88, 0xAE603802, 0x00000002, 0x402BDE20, 0xAE603902, - 0x00000002, 0x002BDE88, 0xAE603902, 0x00000003, 0x402BDE20, 0xAE604302, - 0xAE603802, 0x00000003, 0x002BDE88, 0xAE604302, 0xAE603802, 0x00000004, - 0x002BDE84, 0xA0013904, 0x002C9884, 0xAE603802, 0x00000004, 0x002BDE8A, - 0xA0013904, 0x002C988A, 0xAE603802, 0x00000002, 0x402BE020, 0xAE603602, - 0x00000002, 0x002BE083, 0xAE603602, 0x00000002, 0x402BE020, 0xAE603702, - 0x00000002, 0x002BE083, 0xAE603702, 0x00000002, - // Block 707, offset 0xb0c0 - 0x402BE020, 0xAE603802, 0x00000002, 0x002BE083, 0xAE603802, 0x00000002, - 0x402BE020, 0xAE603902, 0x00000002, 0x002BE083, 0xAE603902, 0x00000002, - 0x402BE220, 0xAE603602, 0x00000002, 0x002BE283, 0xAE603602, 0x00000002, - 0x402BE220, 0xAE603702, 0x00000002, 0x002BE283, 0xAE603702, 0x00000002, - 0x402BE220, 0xAE603802, 0x00000002, 0x002BE283, 0xAE603802, 0x00000002, - 0x402BE220, 0xAE603902, 0x00000002, 0x002BE283, 0xAE603902, 0x00000002, - 0x402C0A20, 0xAE603902, 0x00000002, 0x002C0A88, 0xAE603902, 0x00000002, - 0x402C3A20, 0xAE603802, 0x00000002, 0x002C3A88, 0xAE603802, 0x00000003, - 0x402C3A20, 0xACA05602, 0xAE603802, 0x00000003, 0x002C3A88, 0xACA05602, - 0xAE603802, 0x00000002, 0x402C6220, 0xAE603902, 0x00000002, 0x002C6288, - 0xAE603902, 0x00000002, 0x402C9820, 0xAE603602, - // Block 708, offset 0xb100 - 0x00000002, 0x002C9888, 0xAE603602, 0x00000002, 0x402C9820, 0xAE603702, - 0x00000002, 0x002C9888, 0xAE603702, 0x00000002, 0x402C9820, 0xAE603802, - 0x00000002, 0x002C9888, 0xAE603802, 0x00000002, 0x402C9820, 0xAE603902, - 0x00000002, 0x002C9888, 0xAE603902, 0x00000003, 0x402C9820, 0xAE605B02, - 0xAE603802, 0x00000003, 0x002C9888, 0xAE605B02, 0xAE603802, 0x00000002, - 0x402C9A20, 0xAE603602, 0x00000002, 0x002C9A83, 0xAE603602, 0x00000002, - 0x402C9A20, 0xAE603702, 0x00000002, 0x002C9A83, 0xAE603702, 0x00000002, - 0x402C9A20, 0xAE603802, 0x00000002, 0x002C9A83, 0xAE603802, 0x00000002, - 0x402C9A20, 0xAE603902, 0x00000002, 0x002C9A83, 0xAE603902, 0x00000002, - 0x402D2220, 0xAE603802, 0x00000002, 0x002D2288, 0xAE603802, 0x00000002, - 0x402D6820, 0xAE603902, 0x00000002, 0x002D6888, - // Block 709, offset 0xb140 - 0xAE603902, 0x00000002, 0x402D9A20, 0xAE603602, 0x00000002, 0x002D9A88, - 0xAE603602, 0x00000002, 0x402D9A20, 0xAE603702, 0x00000002, 0x002D9A88, - 0xAE603702, 0x00000002, 0x402D9A20, 0xAE603802, 0x00000002, 0x002D9A88, - 0xAE603802, 0x00000002, 0x402D9A20, 0xAE603902, 0x00000002, 0x002D9A88, - 0xAE603902, 0x00000003, 0x402D9A20, 0xAE604702, 0xAE603802, 0x00000003, - 0x002D9A88, 0xAE604702, 0xAE603802, 0x00000002, 0x402DFE20, 0xAE603802, - 0x00000002, 0x002DFE88, 0xAE603802, 0x00000002, 0x402DFE20, 0xAE603902, - 0x00000002, 0x002DFE88, 0xAE603902, 0x00000002, 0x402E2220, 0xAE603802, - 0x00000002, 0x002E2288, 0xAE603802, 0x00000002, 0x402E2220, 0xAE603902, - 0x00000002, 0x002E2288, 0xAE603902, 0x00000003, 0x402E2220, 0xAE603902, - 0xAE605B02, 0x00000003, 0x002E2288, 0xAE603902, - // Block 710, offset 0xb180 - 0xAE605B02, 0x00000002, 0x402E8220, 0xAE603802, 0x00000002, 0x002E8288, - 0xAE603802, 0x00000002, 0x402E8220, 0xAE603902, 0x00000002, 0x002E8288, - 0xAE603902, 0x00000002, 0x402E9E20, 0xAE603702, 0x00000002, 0x002E9E88, - 0xAE603702, 0x00000002, 0x402E9E20, 0xAE603802, 0x00000002, 0x002E9E88, - 0xAE603802, 0x00000002, 0x402E9E20, 0xAE603902, 0x00000002, 0x002E9E88, - 0xAE603902, 0x00000002, 0x402EE220, 0xAE603602, 0x00000002, 0x002EE288, - 0xAE603602, 0x00000002, 0x402EE220, 0xAE603702, 0x00000002, 0x002EE288, - 0xAE603702, 0x00000003, 0x402EE220, 0xAE603702, 0xAE603802, 0x00000003, - 0x002EE288, 0xAE603702, 0xAE603802, 0x00000003, 0x402EE220, 0xAE603702, - 0xAE604702, 0x00000003, 0x002EE288, 0xAE603702, 0xAE604702, 0x00000003, - 0x402EE220, 0xAE603702, 0xAE605B02, 0x00000003, - // Block 711, offset 0xb1c0 - 0x002EE288, 0xAE603702, 0xAE605B02, 0x00000002, 0x402EE220, 0xAE603802, - 0x00000002, 0x002EE288, 0xAE603802, 0x00000002, 0x402EE220, 0xAE603902, - 0x00000002, 0x002EE288, 0xAE603902, 0x00000003, 0x402EE220, 0xA0005402, - 0xAE603802, 0x00000003, 0x002EE288, 0xA0005402, 0xAE603802, 0x00000003, - 0x402EE220, 0xAE605B02, 0xAE603802, 0x00000003, 0x002EE288, 0xAE605B02, - 0xAE603802, 0x00000002, 0x402EE420, 0xAE603602, 0x00000002, 0x002EE483, - 0xAE603602, 0x00000002, 0x402EE420, 0xAE603702, 0x00000002, 0x002EE483, - 0xAE603702, 0x00000002, 0x402EE420, 0xAE603802, 0x00000002, 0x002EE483, - 0xAE603802, 0x00000002, 0x402EE420, 0xAE603902, 0x00000002, 0x002EE483, - 0xAE603902, 0x00000002, 0x402EE620, 0xAE603502, 0x00000002, 0x002EE683, - 0xAE603502, 0x00000002, 0x402EE620, 0xAE603602, - // Block 712, offset 0xb200 - 0x00000002, 0x002EE683, 0xAE603602, 0x00000002, 0x402EE620, 0xAE603702, - 0x00000002, 0x002EE683, 0xAE603702, 0x00000002, 0x402EE620, 0xAE603802, - 0x00000002, 0x002EE683, 0xAE603802, 0x00000002, 0x402EE620, 0xAE603902, - 0x00000002, 0x002EE683, 0xAE603902, 0x00000002, 0x402F2C20, 0xAE603802, - 0x00000002, 0x002F2C88, 0xAE603802, 0x00000002, 0x402F7A20, 0xAE603802, - 0x00000002, 0x002F7A88, 0xAE603802, 0x00000002, 0x402F7A20, 0xAE603902, - 0x00000002, 0x002F7A88, 0xAE603902, 0x00000003, 0x402F7A20, 0xAE603902, - 0xAE605B02, 0x00000003, 0x002F7A88, 0xAE603902, 0xAE605B02, 0x00000002, - 0x402FE620, 0xAE603802, 0x00000002, 0x002FE688, 0xAE603802, 0x00000003, - 0x402FE620, 0xAE603802, 0xAE605202, 0x00000003, 0x002FE688, 0xAE603802, - 0xAE605202, 0x00000002, 0x402FE620, 0xAE603902, - // Block 713, offset 0xb240 - 0x00000002, 0x002FE688, 0xAE603902, 0x00000003, 0x402FE620, 0xAE603902, - 0xAE605202, 0x00000003, 0x002FE688, 0xAE603902, 0xAE605202, 0x00000002, - 0x40302C20, 0xAE603902, 0x00000002, 0x00302C88, 0xAE603902, 0x00000002, - 0x40306C20, 0xAE603602, 0x00000002, 0x00306C88, 0xAE603602, 0x00000002, - 0x40306C20, 0xAE603702, 0x00000002, 0x00306C88, 0xAE603702, 0x00000003, - 0x40306C20, 0xAE603702, 0xAE603802, 0x00000003, 0x00306C88, 0xAE603702, - 0xAE603802, 0x00000002, 0x40306C20, 0xAE603802, 0x00000002, 0x00306C88, - 0xAE603802, 0x00000002, 0x40306C20, 0xAE603902, 0x00000002, 0x00306C88, - 0xAE603902, 0x00000003, 0x40306C20, 0xAE604702, 0xAE603802, 0x00000003, - 0x00306C88, 0xAE604702, 0xAE603802, 0x00000002, 0x40306E20, 0xAE603602, - 0x00000002, 0x00306E83, 0xAE603602, 0x00000002, - // Block 714, offset 0xb280 - 0x40306E20, 0xAE603702, 0x00000002, 0x00306E83, 0xAE603702, 0x00000002, - 0x40306E20, 0xAE603802, 0x00000002, 0x00306E83, 0xAE603802, 0x00000002, - 0x40306E20, 0xAE603902, 0x00000002, 0x00306E83, 0xAE603902, 0x00000002, - 0x4030BE20, 0xAE603702, 0x00000002, 0x0030BE88, 0xAE603702, 0x00000002, - 0x4030BE20, 0xAE603902, 0x00000002, 0x0030BE88, 0xAE603902, 0x00000002, - 0x4030E220, 0xAE603802, 0x00000002, 0x0030E288, 0xAE603802, 0x00000002, - 0x4030E220, 0xAE603902, 0x00000002, 0x0030E288, 0xAE603902, 0x00000002, - 0x40310020, 0xAE603602, 0x00000002, 0x00310088, 0xAE603602, 0x00000002, - 0x40310020, 0xAE603702, 0x00000002, 0x00310088, 0xAE603702, 0x00000002, - 0x40310020, 0xAE603802, 0x00000002, 0x00310088, 0xAE603802, 0x00000002, - 0x40310020, 0xAE603902, 0x00000002, 0x00310088, - // Block 715, offset 0xb2c0 - 0xAE603902, 0x00000002, 0x40312A20, 0xAE603802, 0x00000002, 0x00312A88, - 0xAE603802, 0x00000002, 0x40312A20, 0xAE603902, 0x00000002, 0x00312A88, - 0xAE603902, 0x00000003, 0x40325220, 0xAE602202, 0xAE603802, 0x00000003, - 0x00325288, 0xAE602202, 0xAE603802, 0x00000004, 0x40325220, 0xAE602202, - 0xAE603802, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602202, 0xAE603802, - 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAE603802, 0x00000003, - 0x00325288, 0xAE602A02, 0xAE603802, 0x00000004, 0x40325220, 0xAE602A02, - 0xAE603802, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602A02, 0xAE603802, - 0xAF007F02, 0x00000002, 0x40325220, 0xAE603802, 0x00000002, 0x00325288, - 0xAE603802, 0x00000003, 0x40325220, 0xAE603802, 0xAF007F02, 0x00000003, - 0x40325C20, 0xAE602202, 0xAE603802, 0x00000003, - // Block 716, offset 0xb300 - 0x00325C88, 0xAE602202, 0xAE603802, 0x00000003, 0x40325C20, 0xAE602A02, - 0xAE603802, 0x00000003, 0x00325C88, 0xAE602A02, 0xAE603802, 0x00000002, - 0x40325C20, 0xAE603802, 0x00000002, 0x00325C88, 0xAE603802, 0x00000003, - 0x40326820, 0xAE602202, 0xAE603802, 0x00000003, 0x00326888, 0xAE602202, - 0xAE603802, 0x00000004, 0x40326820, 0xAE602202, 0xAE603802, 0xAF007F02, - 0x00000004, 0x00326888, 0xAE602202, 0xAE603802, 0xAF007F02, 0x00000003, - 0x40326820, 0xAE602A02, 0xAE603802, 0x00000003, 0x00326888, 0xAE602A02, - 0xAE603802, 0x00000004, 0x40326820, 0xAE602A02, 0xAE603802, 0xAF007F02, - 0x00000004, 0x00326888, 0xAE602A02, 0xAE603802, 0xAF007F02, 0x00000002, - 0x40326820, 0xAE603802, 0x00000002, 0x00326888, 0xAE603802, 0x00000003, - 0x40326820, 0xAE603802, 0xAF007F02, 0x00000003, - // Block 717, offset 0xb340 - 0x40326C20, 0xAE602202, 0xAE603802, 0x00000003, 0x00326C88, 0xAE602202, - 0xAE603802, 0x00000003, 0x40326C20, 0xAE602A02, 0xAE603802, 0x00000003, - 0x00326C88, 0xAE602A02, 0xAE603802, 0x00000002, 0x40326C20, 0xAE603802, - 0x00000002, 0x00326C88, 0xAE603802, 0x00000003, 0x40326C20, 0xAE604702, - 0xAE603802, 0x00000003, 0x40327C20, 0xAE602202, 0xAE603802, 0x00000003, - 0x00327C88, 0xAE602202, 0xAE603802, 0x00000003, 0x40327C20, 0xAE602A02, - 0xAE603802, 0x00000003, 0x00327C88, 0xAE602A02, 0xAE603802, 0x00000002, - 0x40327C20, 0xAE603802, 0x00000002, 0x00327C88, 0xAE603802, 0x00000003, - 0x40329820, 0xAE602202, 0xAE603802, 0x00000003, 0x40329820, 0xAE602A02, - 0xAE603802, 0x00000003, 0x00329888, 0xAE602A02, 0xAE603802, 0x00000002, - 0x40329820, 0xAE603802, 0x00000002, 0x00329888, - // Block 718, offset 0xb380 - 0xAE603802, 0x00000003, 0x40329820, 0xAE604702, 0xAE603802, 0x00000003, - 0x4032A220, 0xAE602202, 0xAE603802, 0x00000003, 0x0032A288, 0xAE602202, - 0xAE603802, 0x00000004, 0x4032A220, 0xAE602202, 0xAE603802, 0xAF007F02, - 0x00000004, 0x0032A288, 0xAE602202, 0xAE603802, 0xAF007F02, 0x00000003, - 0x4032A220, 0xAE602A02, 0xAE603802, 0x00000003, 0x0032A288, 0xAE602A02, - 0xAE603802, 0x00000004, 0x4032A220, 0xAE602A02, 0xAE603802, 0xAF007F02, - 0x00000004, 0x0032A288, 0xAE602A02, 0xAE603802, 0xAF007F02, 0x00000002, - 0x4032A220, 0xAE603802, 0x00000002, 0x0032A288, 0xAE603802, 0x00000003, - 0x4032A220, 0xAE603802, 0xAF007F02, 0x00000002, 0x402BDE20, 0xAE603202, - 0x00000002, 0x402C9820, 0xAE603202, 0x00000002, 0x402D9A20, 0xAE603202, - 0x00000002, 0x402EE220, 0xAE603202, 0x00000002, - // Block 719, offset 0xb3c0 - 0x40306C20, 0xAE603202, 0x00000002, 0x402C9A20, 0xAE603C02, 0x00000002, - 0x002C9A83, 0xAE603C02, 0x00000003, 0x0003F483, 0x6C030A20, 0x4003F620, - 0x00000003, 0x0003F483, 0x6C110E20, 0x4003F620, 0x00000003, 0x0003F483, - 0x6C272220, 0x4003F620, 0x00000003, 0x0003F483, 0x6C37B420, 0x4003F620, - 0x00000003, 0x0003F483, 0x6C549820, 0x4003F620, 0x00000003, 0x0003F483, - 0x6C5D8420, 0x4003F620, 0x00000003, 0x0003F483, 0x6C61F420, 0x4003F620, - 0x00000003, 0x0003F483, 0x6C64CA20, 0x4003F620, 0x00000003, 0x0003F483, - 0x6C6C2E20, 0x4003F620, 0x00000003, 0x0003F483, 0x6C6F9A20, 0x4003F620, - 0x00000003, 0x0003F483, 0x6C814020, 0x4003F620, 0x00000003, 0x0003F483, - 0x6C8F2420, 0x4003F620, 0x00000003, 0x0003F483, 0x6C9FE620, 0x4003F620, - 0x00000003, 0x0003F483, 0x6CA25C20, 0x4003F620, - // Block 720, offset 0xb400 - 0x00000003, 0x0003F483, 0x6CB4C620, 0x4003F620, 0x00000003, 0x0003F483, - 0x6CB6C820, 0x4003F620, 0x00000003, 0x0003F483, 0x6CC63620, 0x4003F620, - 0x00000003, 0x0003F483, 0x6CC9F220, 0x4003F620, 0x00000003, 0x0003F483, - 0x6CCF3620, 0x4003F620, 0x00000003, 0x0003F483, 0x6CD22420, 0x4003F620, - 0x00000003, 0x0003F483, 0x6CD70220, 0x4003F620, 0x00000003, 0x0003F483, - 0x6CD87420, 0x4003F620, 0x00000003, 0x0003F483, 0x6CE27020, 0x4003F620, - 0x00000003, 0x0003F483, 0x6CE91020, 0x4003F620, 0x00000003, 0x0003F483, - 0x6CF41420, 0x4003F620, 0x00000003, 0x0003F483, 0x6D007020, 0x4003F620, - 0x00000003, 0x0003F483, 0x6D04B220, 0x4003F620, 0x00000003, 0x0003F483, - 0x6D08F820, 0x4003F620, 0x00000003, 0x0003F483, 0x6D13B620, 0x4003F620, - 0x00000003, 0x0003F483, 0x6D1F9820, 0x4003F620, - // Block 721, offset 0xb440 - 0x00000003, 0x0003F483, 0x6D266820, 0x4003F620, 0x00000003, 0x0003F483, - 0x6D357020, 0x4003F620, 0x00000003, 0x0003F483, 0x6D399220, 0x4003F620, - 0x00000003, 0x0003F483, 0x6D3AC620, 0x4003F620, 0x00000003, 0x0003F483, - 0x6D3E6020, 0x4003F620, 0x00000003, 0x0003F483, 0x6D3F2A20, 0x4003F620, - 0x00000003, 0x0004B083, 0x6C011220, 0x4004B220, 0x00000003, 0x0004B083, - 0x6C044020, 0x4004B220, 0x00000003, 0x0004B083, 0x6C079220, 0x4004B220, - 0x00000003, 0x0004B083, 0x6C26E020, 0x4004B220, 0x00000003, 0x0004B083, - 0x6C2A1220, 0x4004B220, 0x00000003, 0x0004B083, 0x6C2D0A20, 0x4004B220, - 0x00000003, 0x0004B083, 0x6C37B420, 0x4004B220, 0x00000003, 0x0004B083, - 0x6CC9F220, 0x4004B220, 0x00000003, 0x0004B083, 0x6CD16420, 0x4004B220, - 0x00000003, 0x0029CE83, 0x4029CC20, 0x6C2D0A20, - // Block 722, offset 0xb480 - 0x00000003, 0x0029CE83, 0x4029CC20, 0x6CC63620, 0x00000003, 0x0029CE83, - 0x4029CC20, 0x6D266820, 0x00000003, 0x0029CE83, 0x4029CE20, 0x6C2D0A20, - 0x00000003, 0x0029CE83, 0x4029CE20, 0x6CC63620, 0x00000003, 0x0029CE83, - 0x4029CE20, 0x6D266820, 0x00000003, 0x0029CE83, 0x4029D020, 0x6C2D0A20, - 0x00000003, 0x0029CE83, 0x4029D020, 0x6CC63620, 0x00000003, 0x0029CE83, - 0x4029D020, 0x6D266820, 0x00000003, 0x0029CE83, 0x4029D220, 0x6C2D0A20, - 0x00000003, 0x0029CE83, 0x4029D220, 0x6CC63620, 0x00000003, 0x0029CE83, - 0x4029D420, 0x6C2D0A20, 0x00000003, 0x0029CE83, 0x4029D420, 0x6CC63620, - 0x00000003, 0x0029CE83, 0x4029D620, 0x6C2D0A20, 0x00000003, 0x0029CE83, - 0x4029D620, 0x6CC63620, 0x00000003, 0x0029CE83, 0x4029D820, 0x6C2D0A20, - 0x00000003, 0x0029CE83, 0x4029D820, 0x6CC63620, - // Block 723, offset 0xb4c0 - 0x00000003, 0x0029CE83, 0x4029DA20, 0x6C2D0A20, 0x00000003, 0x0029CE83, - 0x4029DA20, 0x6CC63620, 0x00000003, 0x0029CE83, 0x4029DC20, 0x6C2D0A20, - 0x00000003, 0x0029CE83, 0x4029DC20, 0x6CC63620, 0x00000003, 0x0029CE83, - 0x4029DE20, 0x6C2D0A20, 0x00000003, 0x0029CE83, 0x4029DE20, 0x6CC63620, - 0x00000003, 0x0029D083, 0x4029CC20, 0x6C2D0A20, 0x00000003, 0x0029D083, - 0x4029CC20, 0x6CC63620, 0x00000003, 0x0029D083, 0x4029CE20, 0x6C2D0A20, - 0x00000003, 0x0029D083, 0x4029CE20, 0x6CC63620, 0x00000003, 0x0029D083, - 0x4029D020, 0x6C2D0A20, 0x00000003, 0x0029D083, 0x4029D020, 0x6CC63620, - 0x00000003, 0x0029D083, 0x4029D220, 0x6C2D0A20, 0x00000003, 0x0029D083, - 0x4029D220, 0x6CC63620, 0x00000003, 0x0029D083, 0x4029D420, 0x6C2D0A20, - 0x00000003, 0x0029D083, 0x4029D420, 0x6CC63620, - // Block 724, offset 0xb500 - 0x00000003, 0x0029D083, 0x4029D620, 0x6CC63620, 0x00000003, 0x0029D083, - 0x4029D820, 0x6CC63620, 0x00000003, 0x0029D083, 0x4029DA20, 0x6CC63620, - 0x00000003, 0x0029D083, 0x4029DC20, 0x6CC63620, 0x00000003, 0x0029D083, - 0x4029DE20, 0x6CC63620, 0x00000003, 0x0029D283, 0x4029CC20, 0x6CC63620, - 0x00000003, 0x0029D283, 0x4029CE20, 0x6CC63620, 0x00000002, 0x402BDE1C, - 0xAE604702, 0x00000002, 0x002BDE03, 0xAE604702, 0x00000002, 0x402BDE1C, - 0xAE605202, 0x00000002, 0x002BDE03, 0xAE605202, 0x00000002, 0x402BDE1D, - 0xAE603702, 0x00000002, 0x002BDE23, 0xAE603702, 0x00000002, 0x402BDE1D, - 0xAE603C02, 0x00000002, 0x002BDE23, 0xAE603C02, 0x00000002, 0x402BDE1D, - 0xAE604302, 0x00000002, 0x002BDE23, 0xAE604302, 0x00000002, 0x402BDE1F, - 0xAE603702, 0x00000002, 0x002BDE63, 0xAE603702, - // Block 725, offset 0xb540 - 0x00000002, 0x402BDE1F, 0xAE603C02, 0x00000002, 0x002BDE63, 0xAE603C02, - 0x00000002, 0x402C981C, 0xAE603202, 0x00000002, 0x002C9803, 0xAE603202, - 0x00000002, 0x402C981C, 0xAE603502, 0x00000002, 0x002C9803, 0xAE603502, - 0x00000002, 0x402D9A1D, 0xAE604702, 0x00000002, 0x002D9A23, 0xAE604702, - 0x00000002, 0x402EE21C, 0xAE603202, 0x00000002, 0x002EE203, 0xAE603202, - 0x00000002, 0x402EE21C, 0xAE603502, 0x00000002, 0x002EE203, 0xAE603502, - 0x00000002, 0x402EE21C, 0xAE604702, 0x00000002, 0x002EE203, 0xAE604702, - 0x00000002, 0x402EE21C, 0xAE604E02, 0x00000002, 0x002EE203, 0xAE604E02, - 0x00000002, 0x402EE21C, 0xAE605202, 0x00000002, 0x002EE203, 0xAE605202, - 0x00000002, 0x402EE21C, 0xACA05902, 0x00000002, 0x002EE203, 0xACA05902, - 0x00000002, 0x402EE21D, 0xAE603C02, 0x00000002, - // Block 726, offset 0xb580 - 0x002EE223, 0xAE603C02, 0x00000002, 0x402EE21D, 0xAE604E02, 0x00000002, - 0x002EE223, 0xAE604E02, 0x00000002, 0x402EE21D, 0xAD806802, 0x00000002, - 0x002EE223, 0xAD806802, 0x00000002, 0x402EE21F, 0xAE603C02, 0x00000002, - 0x002EE263, 0xAE603C02, 0x00000002, 0x402EE21F, 0xAD806802, 0x00000002, - 0x002EE263, 0xAD806802, 0x00000002, 0x40306C1C, 0xAE604702, 0x00000002, - 0x00306C03, 0xAE604702, 0x00000002, 0x40306C1D, 0xAE604E02, 0x00000002, - 0x00306C23, 0xAE604E02, 0x00000002, 0x40306C1D, 0xAD806802, 0x00000002, - 0x00306C23, 0xAD806802, 0x00000002, 0x40306C1F, 0xAD806802, 0x00000002, - 0x00306C63, 0xAD806802, 0x00000004, 0x2D399283, 0x6CD2FC20, 0x6C5B8A20, - 0x6CCF3620, 0x00000003, 0x0003F483, 0x6C000220, 0x4003F620, 0x00000003, - 0x0003F483, 0x6C003620, 0x4003F620, 0x00000003, - // Block 727, offset 0xb5c0 - 0x0003F483, 0x6C006220, 0x4003F620, 0x00000003, 0x0003F483, 0x6C007420, - 0x4003F620, 0x00000003, 0x0003F483, 0x6C008820, 0x4003F620, 0x00000003, - 0x0003F483, 0x6C00B620, 0x4003F620, 0x00000003, 0x0003F483, 0x6C00DC20, - 0x4003F620, 0x00000003, 0x0003F483, 0x6C018420, 0x4003F620, 0x00000003, - 0x0003F483, 0x6C028820, 0x4003F620, 0x00000003, 0x0003F483, 0x6C02D820, - 0x4003F620, 0x00000003, 0x0003F483, 0x6C049620, 0x4003F620, 0x00000003, - 0x0003F483, 0x6C049C20, 0x4003F620, 0x00000003, 0x0003F483, 0x6C049E20, - 0x4003F620, 0x00000003, 0x0003F483, 0x6C04C620, 0x4003F620, 0x00000003, - 0x0003F483, 0x6C04D020, 0x4003F620, 0x00000003, 0x0003F483, 0x6C05E620, - 0x4003F620, 0x00000003, 0x0003F483, 0x6C079020, 0x4003F620, 0x00000003, - 0x0003F483, 0x6C0BA020, 0x4003F620, 0x00000003, - // Block 728, offset 0xb600 - 0x0003F483, 0x6C0BC020, 0x4003F620, 0x00000003, 0x0003F483, 0x6C0E3E20, - 0x4003F620, 0x00000003, 0x0003F483, 0x6C127420, 0x4003F620, 0x00000003, - 0x0003F483, 0x6C147E20, 0x4003F620, 0x00000003, 0x0003F483, 0x6C148220, - 0x4003F620, 0x00000003, 0x0003F483, 0x6C185220, 0x4003F620, 0x00000003, - 0x0003F483, 0x6C2BB220, 0x4003F620, 0x00000003, 0x0003F483, 0x6C2CA220, - 0x4003F620, 0x00000003, 0x0003F483, 0x6C2FD820, 0x4003F620, 0x00000003, - 0x0003F483, 0x6C3CEE20, 0x4003F620, 0x00000003, 0x0003F483, 0x6C41DC20, - 0x4003F620, 0x00000003, 0x0003F483, 0x6C741620, 0x4003F620, 0x00000003, - 0x0003F483, 0x6C791620, 0x4003F620, 0x00000003, 0x0003F483, 0x6C7DE020, - 0x4003F620, 0x00000003, 0x0003F483, 0x6C86F020, 0x4003F620, 0x00000003, - 0x0003F483, 0x6CA6A420, 0x4003F620, 0x00000003, - // Block 729, offset 0xb640 - 0x0003F483, 0x6D0F3820, 0x4003F620, 0x00000003, 0x0003F483, 0x6D2EFA20, - 0x4003F620, 0x00000003, 0x0004B083, 0x6C007420, 0x4004B220, 0x00000003, - 0x0004B083, 0x6C00DC20, 0x4004B220, 0x00000003, 0x0004B083, 0x6C093E20, - 0x4004B220, 0x00000003, 0x0004B083, 0x6C096620, 0x4004B220, 0x00000003, - 0x0004B083, 0x6C0FC420, 0x4004B220, 0x00000003, 0x0004B083, 0x6C555C20, - 0x4004B220, 0x00000003, 0x0004B083, 0x6C9AC020, 0x4004B220, 0x00000003, - 0x0004B083, 0x6CA4CC20, 0x4004B220, 0x00000003, 0x0004B083, 0x6CB9B020, - 0x4004B220, 0x00000003, 0x0029CE83, 0x4029CC20, 0x6C049620, 0x00000003, - 0x0029CE83, 0x4029CC20, 0x6C049C20, 0x00000003, 0x0029CE83, 0x4029CC20, - 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029CE20, 0x6C049620, 0x00000003, - 0x0029CE83, 0x4029CE20, 0x6C049C20, 0x00000003, - // Block 730, offset 0xb680 - 0x0029CE83, 0x4029CE20, 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029D020, - 0x6C049620, 0x00000003, 0x0029CE83, 0x4029D020, 0x6C049C20, 0x00000003, - 0x0029CE83, 0x4029D020, 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029D220, - 0x6C049620, 0x00000003, 0x0029CE83, 0x4029D220, 0x6C555C20, 0x00000003, - 0x0029CE83, 0x4029D420, 0x6C049620, 0x00000003, 0x0029CE83, 0x4029D420, - 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029D620, 0x6C049620, 0x00000003, - 0x0029CE83, 0x4029D620, 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029D820, - 0x6C049620, 0x00000003, 0x0029CE83, 0x4029D820, 0x6C555C20, 0x00000003, - 0x0029CE83, 0x4029DA20, 0x6C049620, 0x00000003, 0x0029CE83, 0x4029DA20, - 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029DC20, 0x6C049620, 0x00000003, - 0x0029CE83, 0x4029DC20, 0x6C555C20, 0x00000003, - // Block 731, offset 0xb6c0 - 0x0029CE83, 0x4029DE20, 0x6C049620, 0x00000003, 0x0029CE83, 0x4029DE20, - 0x6C555C20, 0x00000003, 0x0029D083, 0x4029CC20, 0x6C049620, 0x00000003, - 0x0029D083, 0x4029CC20, 0x6C555C20, 0x00000003, 0x0029D083, 0x4029CE20, - 0x6C049620, 0x00000003, 0x0029D083, 0x4029CE20, 0x6C555C20, 0x00000003, - 0x0029D083, 0x4029D020, 0x6C049620, 0x00000003, 0x0029D083, 0x4029D020, - 0x6C555C20, 0x00000003, 0x0029D083, 0x4029D220, 0x6C049620, 0x00000003, - 0x0029D083, 0x4029D220, 0x6C555C20, 0x00000003, 0x0029D083, 0x4029D420, - 0x6C049620, 0x00000003, 0x0029D083, 0x4029D420, 0x6C555C20, 0x00000003, - 0x0029D083, 0x4029D620, 0x6C049620, 0x00000003, 0x0029D083, 0x4029D820, - 0x6C049620, 0x00000003, 0x0029D083, 0x4029DA20, 0x6C049620, 0x00000003, - 0x0029D083, 0x4029DC20, 0x6C049620, 0x00000003, - // Block 732, offset 0xb700 - 0x0029D083, 0x4029DE20, 0x6C049620, 0x00000003, 0x0029D283, 0x4029CC20, - 0x6C049620, 0x00000003, 0x0029D283, 0x4029CE20, 0x6C049620, 0x00000004, - 0x2C741683, 0x6C111820, 0x6C0BD220, 0x6C3CEE20, -} - -// mainContractElem: 4120 entries, 16480 bytes -var mainContractElem = [4120]uint32{ - // Block 0, offset 0x0 - 0x402E2220, 0xE0000CFB, 0xE0000CFB, 0x002E2288, 0xE0000D01, 0xE0000D01, - 0x40332220, 0x40332A20, 0x40333220, 0x00332288, 0x00332A88, 0x00333288, - 0x40333A20, 0x40334220, 0x00333A88, 0x00334288, 0x40336220, 0x4033A220, - 0x4033A220, 0x00336288, 0x0033A288, 0x0033A288, 0x4033B220, 0x4033BA20, - 0x0033B288, 0x0033BA88, 0x4033CA20, 0x4033D420, 0x0033CA88, 0x0033D488, - 0x4033E420, 0x4033F220, 0x0033E488, 0x0033F288, 0x40341420, 0x40343E20, - 0x40342420, 0x00341488, 0x00343E88, 0x00342488, 0x40342C20, 0x40343620, - 0x00342C88, 0x00343688, 0x4034EE20, 0x4034F620, 0x0034EE88, 0x0034F688, - 0x4034FE20, 0x40350620, 0x0034FE88, 0x00350688, 0x40345020, 0x40356A20, - 0x40356A20, 0x00345088, 0x00356A88, 0x00356A88, 0x40357220, 0x40357A20, - 0x40358220, 0x40358A20, 0x00357288, 0x00357A88, - // Block 1, offset 0x40 - 0x00358288, 0x00358A88, 0x40361820, 0x40362220, 0x00361888, 0x00362288, - 0x40367E20, 0x40368620, 0x00367E88, 0x00368688, 0x4036A820, 0x4036B020, - 0x0036A888, 0x0036B088, 0x40371420, 0x40371C20, 0x00371488, 0x00371C88, - 0x40393820, 0x40391E20, 0x40392020, 0x40392820, 0x403A7420, 0x40392620, - 0x403A9020, 0x40393020, 0x4040F020, 0x4040F420, 0x4040F620, 0x40426E20, - 0x40427220, 0x40427020, 0x40427420, 0x40429020, 0x40429420, 0x4042D020, - 0x4042D620, 0x4042DA20, 0x4042D220, 0x4042D820, 0x40435E20, 0x40436220, - 0x4043E020, 0x4043E220, 0x4043F020, 0x4043F820, 0x4043F620, 0x4043F220, - 0x4043F420, 0x4043F620, 0x4043F820, 0x40448220, 0x40448820, 0x40448C20, - 0x40448420, 0x40448A20, 0x40451E20, 0x40452620, 0x40452020, 0x40452420, - 0x40452820, 0x40452420, 0x40452620, 0x40498420, - // Block 2, offset 0x80 - 0xE0001881, 0xE0001890, 0xE000189F, 0xE00018AE, 0xE00018BD, 0xE00018CC, - 0xE00018DB, 0xE00018EA, 0xE00018F9, 0xE0001908, 0xE0001917, 0xE0001926, - 0xE0001935, 0xE0001944, 0xE0001953, 0xE0001962, 0xE0001971, 0xE0001980, - 0xE000198F, 0xE000199E, 0xE00019AD, 0xE00019BC, 0xE00019CB, 0xE00019DA, - 0xE00019E9, 0xE00019F8, 0xE0001A07, 0xE0001A16, 0xE0001A25, 0xE0001A34, - 0xE0001A43, 0xE0001A52, 0xE0001A61, 0xE0001A70, 0xE0001A7F, 0xE0001A8E, - 0xE0001A9D, 0xE0001AAC, 0xE0001ABB, 0xE0001ACA, 0xE0001AD9, 0xE0001AE8, - 0xE0001AF7, 0xE0001B06, 0xE0001B15, 0xE0001B24, 0x40498620, 0xE0001884, - 0xE0001893, 0xE00018A2, 0xE00018B1, 0xE00018C0, 0xE00018CF, 0xE00018DE, - 0xE00018ED, 0xE00018FC, 0xE000190B, 0xE000191A, 0xE0001929, 0xE0001938, - 0xE0001947, 0xE0001956, 0xE0001965, 0xE0001974, - // Block 3, offset 0xc0 - 0xE0001983, 0xE0001992, 0xE00019A1, 0xE00019B0, 0xE00019BF, 0xE00019CE, - 0xE00019DD, 0xE00019EC, 0xE00019FB, 0xE0001A0A, 0xE0001A19, 0xE0001A28, - 0xE0001A37, 0xE0001A46, 0xE0001A55, 0xE0001A64, 0xE0001A73, 0xE0001A82, - 0xE0001A91, 0xE0001AA0, 0xE0001AAF, 0xE0001ABE, 0xE0001ACD, 0xE0001ADC, - 0xE0001AEB, 0xE0001AFA, 0xE0001B09, 0xE0001B18, 0xE0001B27, 0x40498820, - 0xE0001887, 0xE0001896, 0xE00018A5, 0xE00018B4, 0xE00018C3, 0xE00018D2, - 0xE00018E1, 0xE00018F0, 0xE00018FF, 0xE000190E, 0xE000191D, 0xE000192C, - 0xE000193B, 0xE000194A, 0xE0001959, 0xE0001968, 0xE0001977, 0xE0001986, - 0xE0001995, 0xE00019A4, 0xE00019B3, 0xE00019C2, 0xE00019D1, 0xE00019E0, - 0xE00019EF, 0xE00019FE, 0xE0001A0D, 0xE0001A1C, 0xE0001A2B, 0xE0001A3A, - 0xE0001A49, 0xE0001A58, 0xE0001A67, 0xE0001A76, - // Block 4, offset 0x100 - 0xE0001A85, 0xE0001A94, 0xE0001AA3, 0xE0001AB2, 0xE0001AC1, 0xE0001AD0, - 0xE0001ADF, 0xE0001AEE, 0xE0001AFD, 0xE0001B0C, 0xE0001B1B, 0xE0001B2A, - 0x40498A20, 0xE000188A, 0xE0001899, 0xE00018A8, 0xE00018B7, 0xE00018C6, - 0xE00018D5, 0xE00018E4, 0xE00018F3, 0xE0001902, 0xE0001911, 0xE0001920, - 0xE000192F, 0xE000193E, 0xE000194D, 0xE000195C, 0xE000196B, 0xE000197A, - 0xE0001989, 0xE0001998, 0xE00019A7, 0xE00019B6, 0xE00019C5, 0xE00019D4, - 0xE00019E3, 0xE00019F2, 0xE0001A01, 0xE0001A10, 0xE0001A1F, 0xE0001A2E, - 0xE0001A3D, 0xE0001A4C, 0xE0001A5B, 0xE0001A6A, 0xE0001A79, 0xE0001A88, - 0xE0001A97, 0xE0001AA6, 0xE0001AB5, 0xE0001AC4, 0xE0001AD3, 0xE0001AE2, - 0xE0001AF1, 0xE0001B00, 0xE0001B0F, 0xE0001B1E, 0xE0001B2D, 0x40498C20, - 0xE000188D, 0xE000189C, 0xE00018AB, 0xE00018BA, - // Block 5, offset 0x140 - 0xE00018C9, 0xE00018D8, 0xE00018E7, 0xE00018F6, 0xE0001905, 0xE0001914, - 0xE0001923, 0xE0001932, 0xE0001941, 0xE0001950, 0xE000195F, 0xE000196E, - 0xE000197D, 0xE000198C, 0xE000199B, 0xE00019AA, 0xE00019B9, 0xE00019C8, - 0xE00019D7, 0xE00019E6, 0xE00019F5, 0xE0001A04, 0xE0001A13, 0xE0001A22, - 0xE0001A31, 0xE0001A40, 0xE0001A4F, 0xE0001A5E, 0xE0001A6D, 0xE0001A7C, - 0xE0001A8B, 0xE0001A9A, 0xE0001AA9, 0xE0001AB8, 0xE0001AC7, 0xE0001AD6, - 0xE0001AE5, 0xE0001AF4, 0xE0001B03, 0xE0001B12, 0xE0001B21, 0xE0001B30, - 0xA0010502, 0x40497420, 0x4049E620, 0xE0001B42, 0xE0001B51, 0xE0001B60, - 0xE0001B6F, 0xE0001B7E, 0xE0001B9C, 0xE0001BBA, 0xE0001BC9, 0xE0001BD8, - 0xE0001BE7, 0xE0001BF6, 0xE0001C05, 0xE0001C14, 0xE0001C23, 0xE0001C32, - 0xE0001C41, 0xE0001C50, 0xE0001C5F, 0xE0001C6E, - // Block 6, offset 0x180 - 0xE0001C7D, 0xE0001C8C, 0xE0001C9B, 0xE0001CAA, 0xE0001B8D, 0xE0001CE1, - 0xE0001CF0, 0xE0001CFF, 0xE0001CB9, 0xE0001CCD, 0xE0001B33, 0xE0001BAB, - 0x4049E820, 0xE0001B45, 0xE0001B54, 0xE0001B63, 0xE0001B72, 0xE0001B81, - 0xE0001B9F, 0xE0001BBD, 0xE0001BCC, 0xE0001BDB, 0xE0001BEA, 0xE0001BF9, - 0xE0001C08, 0xE0001C17, 0xE0001C26, 0xE0001C35, 0xE0001C44, 0xE0001C53, - 0xE0001C62, 0xE0001C71, 0xE0001C80, 0xE0001C8F, 0xE0001C9E, 0xE0001CAD, - 0xE0001B90, 0xE0001CE4, 0xE0001CF3, 0xE0001D02, 0xE0001CBD, 0xE0001CD1, - 0xE0001B36, 0xE0001BAE, 0x4049EA20, 0xE0001B48, 0xE0001B57, 0xE0001B66, - 0xE0001B75, 0xE0001B84, 0xE0001BA2, 0xE0001BC0, 0xE0001BCF, 0xE0001BDE, - 0xE0001BED, 0xE0001BFC, 0xE0001C0B, 0xE0001C1A, 0xE0001C29, 0xE0001C38, - 0xE0001C47, 0xE0001C56, 0xE0001C65, 0xE0001C74, - // Block 7, offset 0x1c0 - 0xE0001C83, 0xE0001C92, 0xE0001CA1, 0xE0001CB0, 0xE0001B93, 0xE0001CE7, - 0xE0001CF6, 0xE0001D05, 0xE0001CC1, 0xE0001CD5, 0xE0001B39, 0xE0001BB1, - 0x4049EC20, 0xE0001B4B, 0xE0001B5A, 0xE0001B69, 0xE0001B78, 0xE0001B87, - 0xE0001BA5, 0xE0001BC3, 0xE0001BD2, 0xE0001BE1, 0xE0001BF0, 0xE0001BFF, - 0xE0001C0E, 0xE0001C1D, 0xE0001C2C, 0xE0001C3B, 0xE0001C4A, 0xE0001C59, - 0xE0001C68, 0xE0001C77, 0xE0001C86, 0xE0001C95, 0xE0001CA4, 0xE0001CB3, - 0xE0001B96, 0xE0001CEA, 0xE0001CF9, 0xE0001D08, 0xE0001CC5, 0xE0001CD9, - 0xE0001B3C, 0xE0001BB4, 0x4049EE20, 0xE0001B4E, 0xE0001B5D, 0xE0001B6C, - 0xE0001B7B, 0xE0001B8A, 0xE0001BA8, 0xE0001BC6, 0xE0001BD5, 0xE0001BE4, - 0xE0001BF3, 0xE0001C02, 0xE0001C11, 0xE0001C20, 0xE0001C2F, 0xE0001C3E, - 0xE0001C4D, 0xE0001C5C, 0xE0001C6B, 0xE0001C7A, - // Block 8, offset 0x200 - 0xE0001C89, 0xE0001C98, 0xE0001CA7, 0xE0001CB6, 0xE0001B99, 0xE0001CED, - 0xE0001CFC, 0xE0001D0B, 0xE0001CC9, 0xE0001CDD, 0xE0001B3F, 0xE0001BB7, - 0xA0010B02, 0x4049D220, 0x404A5A20, 0xE0001D0E, 0xE0001D1D, 0xE0001D2C, - 0xE0001D3B, 0xE0001D4A, 0xE0001D59, 0xE0001D68, 0xE0001D77, 0xE0001D86, - 0xE0001D95, 0xE0001DA4, 0xE0001DB3, 0xE0001DC2, 0xE0001DD1, 0xE0001DE0, - 0xE0001DEF, 0xE0001DFE, 0xE0001E0D, 0xE0001E1C, 0xE0001E2B, 0xE0001E3A, - 0xE0001E49, 0xE0001E58, 0xE0001E67, 0xE0001E76, 0xE0001E85, 0xE0001E94, - 0xE0001EA3, 0xE0001EB2, 0xE0001EC1, 0xE0001ED0, 0xE0001EDF, 0xE0001EEE, - 0xE0001EFD, 0xE0001F0C, 0xE0001F1B, 0xE0001F2A, 0xE0001F39, 0xE0001F48, - 0xE0001F57, 0xE0001F66, 0xE0001F75, 0xE0001F84, 0xE0001F93, 0xE0001FA2, - 0xE0001FB1, 0xE0001FC0, 0xE0001FCF, 0x404A5C20, - // Block 9, offset 0x240 - 0xE0001D11, 0xE0001D20, 0xE0001D2F, 0xE0001D3E, 0xE0001D4D, 0xE0001D5C, - 0xE0001D6B, 0xE0001D7A, 0xE0001D89, 0xE0001D98, 0xE0001DA7, 0xE0001DB6, - 0xE0001DC5, 0xE0001DD4, 0xE0001DE3, 0xE0001DF2, 0xE0001E01, 0xE0001E10, - 0xE0001E1F, 0xE0001E2E, 0xE0001E3D, 0xE0001E4C, 0xE0001E5B, 0xE0001E6A, - 0xE0001E79, 0xE0001E88, 0xE0001E97, 0xE0001EA6, 0xE0001EB5, 0xE0001EC4, - 0xE0001ED3, 0xE0001EE2, 0xE0001EF1, 0xE0001F00, 0xE0001F0F, 0xE0001F1E, - 0xE0001F2D, 0xE0001F3C, 0xE0001F4B, 0xE0001F5A, 0xE0001F69, 0xE0001F78, - 0xE0001F87, 0xE0001F96, 0xE0001FA5, 0xE0001FB4, 0xE0001FC3, 0xE0001FD2, - 0x404A6220, 0xE0001D14, 0xE0001D23, 0xE0001D32, 0xE0001D41, 0xE0001D50, - 0xE0001D5F, 0xE0001D6E, 0xE0001D7D, 0xE0001D8C, 0xE0001D9B, 0xE0001DAA, - 0xE0001DB9, 0xE0001DC8, 0xE0001DD7, 0xE0001DE6, - // Block 10, offset 0x280 - 0xE0001DF5, 0xE0001E04, 0xE0001E13, 0xE0001E22, 0xE0001E31, 0xE0001E40, - 0xE0001E4F, 0xE0001E5E, 0xE0001E6D, 0xE0001E7C, 0xE0001E8B, 0xE0001E9A, - 0xE0001EA9, 0xE0001EB8, 0xE0001EC7, 0xE0001ED6, 0xE0001EE5, 0xE0001EF4, - 0xE0001F03, 0xE0001F12, 0xE0001F21, 0xE0001F30, 0xE0001F3F, 0xE0001F4E, - 0xE0001F5D, 0xE0001F6C, 0xE0001F7B, 0xE0001F8A, 0xE0001F99, 0xE0001FA8, - 0xE0001FB7, 0xE0001FC6, 0xE0001FD5, 0x404A6620, 0xE0001D17, 0xE0001D26, - 0xE0001D35, 0xE0001D44, 0xE0001D53, 0xE0001D62, 0xE0001D71, 0xE0001D80, - 0xE0001D8F, 0xE0001D9E, 0xE0001DAD, 0xE0001DBC, 0xE0001DCB, 0xE0001DDA, - 0xE0001DE9, 0xE0001DF8, 0xE0001E07, 0xE0001E16, 0xE0001E25, 0xE0001E34, - 0xE0001E43, 0xE0001E52, 0xE0001E61, 0xE0001E70, 0xE0001E7F, 0xE0001E8E, - 0xE0001E9D, 0xE0001EAC, 0xE0001EBB, 0xE0001ECA, - // Block 11, offset 0x2c0 - 0xE0001ED9, 0xE0001EE8, 0xE0001EF7, 0xE0001F06, 0xE0001F15, 0xE0001F24, - 0xE0001F33, 0xE0001F42, 0xE0001F51, 0xE0001F60, 0xE0001F6F, 0xE0001F7E, - 0xE0001F8D, 0xE0001F9C, 0xE0001FAB, 0xE0001FBA, 0xE0001FC9, 0xE0001FD8, - 0x404A6820, 0xE0001D1A, 0xE0001D29, 0xE0001D38, 0xE0001D47, 0xE0001D56, - 0xE0001D65, 0xE0001D74, 0xE0001D83, 0xE0001D92, 0xE0001DA1, 0xE0001DB0, - 0xE0001DBF, 0xE0001DCE, 0xE0001DDD, 0xE0001DEC, 0xE0001DFB, 0xE0001E0A, - 0xE0001E19, 0xE0001E28, 0xE0001E37, 0xE0001E46, 0xE0001E55, 0xE0001E64, - 0xE0001E73, 0xE0001E82, 0xE0001E91, 0xE0001EA0, 0xE0001EAF, 0xE0001EBE, - 0xE0001ECD, 0xE0001EDC, 0xE0001EEB, 0xE0001EFA, 0xE0001F09, 0xE0001F18, - 0xE0001F27, 0xE0001F36, 0xE0001F45, 0xE0001F54, 0xE0001F63, 0xE0001F72, - 0xE0001F81, 0xE0001F90, 0xE0001F9F, 0xE0001FAE, - // Block 12, offset 0x300 - 0xE0001FBD, 0xE0001FCC, 0xE0001FDB, 0x404AEA20, 0xE000200E, 0xE0002011, - 0x404B2620, 0x404B2420, 0x404B2620, 0x404AF020, 0xE0002014, 0xE0002017, - 0x404B2A20, 0x404B2820, 0x404B2A20, 0x8281258B, 0x8281258D, 0x82812591, - 0x8281258F, 0x404ECA20, 0x404ECC20, 0x404F9C20, 0x404F9620, 0x404F9E20, - 0x404F9820, 0x40522620, 0x40522820, 0x40522A20, 0x40522C20, 0x40522E20, - 0x40523020, 0x40523220, 0x40523420, 0x40523620, 0x40523820, 0x40523E20, - 0x40524020, 0x40529C20, 0x40529E20, 0x4052A020, 0x4052A220, 0x4052A420, - 0x4052A820, 0x4052A620, 0x4052AA20, 0x4052AC20, 0x4052AE20, 0x4040B620, - 0x4040B420, 0x40409820, 0x4040DC20, 0x402C3A20, 0x402C3C20, 0x002C3A88, - 0x002C3C83, 0x402D2220, 0x402D2420, 0x002D2288, 0x002D2483, 0x002D9883, - 0x002D9A83, 0x402EE220, 0x402EE420, 0x002EE288, - // Block 13, offset 0x340 - 0x002EE483, 0x402FE620, 0x402FE820, 0x002FE688, 0x002FE883, 0x40306C20, - 0x40306E20, 0x00306C88, 0x00306E83, 0x4033B220, 0x4033BA20, 0x4033B420, - 0x0033B288, 0x0033BA88, 0x0033B483, 0x402E2220, 0x402E2221, 0x402E2221, - 0x002E2288, 0x002E22A3, 0x002E22A3, 0x402C3A20, 0x402C3C20, 0x002D6A83, - 0x402D6A20, 0x002C3A88, 0x002C3C83, 0x002D6A85, 0x002D6A84, 0x402F7A20, - 0x402F7C20, 0x002F7A88, 0x002F7C83, 0x40312A20, 0x40312C20, 0x00312A88, - 0x00312C83, 0x002C3A88, 0x002C3C84, 0x002C3C83, 0x402C6220, 0x402C6420, - 0x002C6288, 0x002C6484, 0x002C6483, 0x402D0820, 0x402D0A20, 0x002D0888, - 0x002D0A84, 0x002D0A83, 0x402E9E20, 0x402D2420, 0x002E9E88, 0x002D2484, - 0x002D2483, 0x402E2220, 0xE0000CFB, 0xE0000CFB, 0x402E2420, 0x002E2288, - 0xE0000D01, 0xE0000D01, 0x002E2484, 0x002E2483, - // Block 14, offset 0x380 - 0x402F2C20, 0x402F2E20, 0x002F2C88, 0x002F2E84, 0x002F2E83, 0x002F7A88, - 0x002F7C84, 0x002F7C83, 0x40302C20, 0x40302E20, 0x00302C88, 0x00302E84, - 0x00302E83, 0x40306C20, 0x40310021, 0x40310022, 0x00306C88, 0x003100A3, - 0x003100C3, 0x402BDE20, 0x40320C21, 0x40321020, 0x00321084, 0x002BDE88, - 0x00320CA3, 0x00321083, 0x00321086, 0x00321085, 0x402C9820, 0x40320C22, - 0x002C9888, 0x00320CC3, 0x402EE220, 0x40320E21, 0x40320E22, 0x002EE288, - 0x00320EA3, 0x00320EC3, 0x402BDE20, 0xE00029B8, 0x002BDE88, 0xE00029BB, - 0x402EE220, 0xE00029C6, 0x002EE288, 0xE00029C9, 0x40306C20, 0xE00029DC, - 0x00306C88, 0xE00029DF, 0xAE611302, 0x404A7621, 0x404A7C21, 0x404AB020, - 0x404ACC20, 0x404ACE20, 0x404AD020, 0x404AD220, 0x404AD420, 0x404ADA20, - 0x404A8220, 0x404A8420, 0xE0002A26, 0xE0002A2B, - // Block 15, offset 0x3c0 - 0x404A8620, 0x404A8820, 0x404A8A20, 0x404A8C20, 0x404A8E20, 0x404A9020, - 0x404A9220, 0x404A9420, 0x404A9620, 0x404A9820, 0x404A9A20, 0x404A9C20, - 0x404A8620, 0x404A8820, 0xE0002A30, 0xE0002A35, 0x404A8A20, 0x404A8C20, - 0x404A8E20, 0x404A9020, 0x404ABA20, 0x404ABC20, 0xE0002A3A, 0xE0002A3F, - 0x404ABE20, 0x404AC020, 0x404AC220, 0x404AC420, 0x404AC620, 0x404AC820, - 0x404ACA20, 0x404AD620, 0x404AD820, 0x404AC220, 0x404AC420, 0xE0002A44, - 0xE0002A49, 0x404AC620, 0x404AC820, 0x404ACA20, 0x404ACC20, 0x404ACE20, - 0x404AD020, 0x404AD220, 0x404AD420, 0x404AD620, 0x404AD820, 0x404ADA20, - 0x404ADC20, 0x404AC620, 0x404AC820, 0xE0002A4E, 0xE0002A53, 0x404ACA20, - 0x404ACC20, 0x404ACE20, 0x404AD020, 0x404AD220, 0x404AD420, 0x404AD620, - 0x404AD820, 0x404ADC20, 0x404A7820, 0x404AC020, - // Block 16, offset 0x400 - 0x404A9E20, 0xE0002A5E, 0xE0002A63, 0x404AA020, 0x404AA220, 0x404AA420, - 0x404AA620, 0x404AA820, 0x404AAA20, 0x404AAC20, 0x004AA283, 0x404AAE20, - 0x404AB020, 0x404AB220, 0x404ACC20, 0xE0002A68, 0xE0002A6D, 0x404ACE20, - 0x404AD020, 0x404AD220, 0x404AD420, 0x404AD620, 0x404AD820, 0x404ADA20, - 0x404ADC20, 0x004ACE83, 0x404A8220, 0x404AE820, 0x404AA420, 0x404A9A20, - 0x404A9E20, 0x404AB420, 0x404B1420, 0x404AE420, 0x404AD220, 0x404AD820, - 0x404AEA20, 0x404A9020, 0x404AB620, 0x404B1620, 0x404B1620, 0x404B1820, - 0xE0002A72, 0xE0002A77, 0x404B1A20, 0x404B1C20, 0x404B1E20, 0x404B2020, - 0x404B2220, 0x404B2420, 0x404B2620, 0x404B2820, 0x404B2A20, 0x004B1E83, - 0x404A8420, 0x404AEA20, 0x404AA620, 0x404AA020, 0x404AB820, 0x404B1820, - 0x404AE620, 0x404AD420, 0x404B2C20, 0x404B2E20, - // Block 17, offset 0x440 - 0x404B3020, 0x404A7A20, 0x404A8C20, 0x404AAC20, 0x404ACC20, 0x404ADC20, - 0x404AE020, 0x404AF620, 0x404AE820, 0x404A7C20, 0x404AE220, 0x404A9E20, - 0x404A9620, 0x404A9A20, 0x404AAE20, 0x404B0E20, 0x404AE020, 0x404AFC20, - 0x404ADE20, 0x404ACE20, 0x404AD620, 0x404AEE20, 0x404A7E20, 0x404AE420, - 0x404AA020, 0x404A8E20, 0x404A9820, 0x404AB020, 0x404B1020, 0x404ADA20, - 0x404AFE20, 0x404B0020, 0x404AC420, 0x404AB420, 0x404AB620, 0x404AB820, - 0x404ABA20, 0x404ABC20, 0x404ABE20, 0x404AC020, 0x404A9220, 0xE0002A7F, - 0xE0002A84, 0x404A9420, 0x404A9620, 0x404A9820, 0x404A9A20, 0x404A9C20, - 0x404ADE20, 0x404AE020, 0xE0002A89, 0xE0002A8E, 0x404AE220, 0x404AE420, - 0x404AE620, 0x404AE820, 0x404AEA20, 0x404AEC20, 0x404ACA20, 0x404ACC20, - 0xE0002A93, 0xE0002A98, 0x404ACE20, 0x404AD020, - // Block 18, offset 0x480 - 0x404AD220, 0x404AD420, 0x404AD620, 0x404AD820, 0x404ADA20, 0x404ADC20, - 0x404ADE20, 0x004AD283, 0x404A7E20, 0x404A8E20, 0x404A9220, 0x404A9820, - 0x404AAE20, 0x404ACE20, 0x404AD220, 0x404AFA20, 0x404A8020, 0x404AE620, - 0x404AA220, 0x404A9C20, 0x404AB220, 0x404B1220, 0x404AE220, 0x404ADC20, - 0x404B0020, 0x404AE020, 0x404AD020, 0x404AE020, 0x404AC220, 0x404AC420, - 0xE0002AA0, 0xE0002AA5, 0x404AC620, 0x404AC820, 0x404ACA20, 0x404ACC20, - 0x404ACE20, 0x404AD020, 0x404AD220, 0x404AD420, 0x404AD620, 0x404AD820, - 0x404ADA20, 0x404ADC20, 0x004ACC83, 0x404ADE20, 0x404AE020, 0x404AEE20, - 0x404AF020, 0xE0002AAA, 0xE0002AAF, 0x404AF220, 0x404AF420, 0x404AF620, - 0x404AF820, 0x404AFA20, 0x404AFC20, 0x404AFE20, 0x404B0020, 0x404B0220, - 0x404B0420, 0x404B0620, 0x404B0820, 0x404B0A20, - // Block 19, offset 0x4c0 - 0x004AF883, 0x404B0C20, 0x404ADE20, 0x404AE020, 0xE0002AB4, 0xE0002AB9, - 0x404AE220, 0x404AE420, 0x404AE620, 0x404AE820, 0x404AEA20, 0x404AEC20, - 0x404AEE20, 0x404AF020, 0x404AF220, 0x404AF420, 0x404AF620, 0x004AE883, - 0x404AF820, 0x404AFA20, 0x404A8020, 0x404A9020, 0x404A9420, 0x404AB020, - 0x404ABE20, 0x404AD020, 0x404AD420, 0x404A8020, 0x404AB220, 0x404AB420, - 0xE0002A05, 0xE0002A0A, 0x404AB620, 0x404AB820, 0x404ABA20, 0x404ABC20, - 0x404ABE20, 0x404AC020, 0x404AC220, 0x404AC420, 0x404AC620, 0x404AC820, - 0x404ACA20, 0x004ABA83, 0x404AB620, 0x404AB820, 0xE0002A0F, 0xE0002A14, - 0x404ABA20, 0x404ABC20, 0x404ABE20, 0x404AC020, 0x404AC220, 0x404AC420, - 0x404AC620, 0x404AC820, 0x004ABE83, 0x404AFC20, 0x404AFE20, 0xE0002A19, - 0xE0002A1E, 0x404B0020, 0x404B0220, 0x404B0420, - // Block 20, offset 0x500 - 0x404B0620, 0x404B0820, 0x404B0A20, 0x404B0C20, 0x404B0E20, 0x404B1020, - 0x404B1220, 0x404B1420, 0x404A8A20, 0x404A9620, 0x404AAA20, 0x404ACA20, - 0x404ADA20, 0x404ADE20, 0x404AE620, 0x404AF420, 0xAE611602, 0x404A9421, - 0xAE611402, 0x404AB821, 0x404ABC21, 0x828225B1, 0xE000200E, 0xE0002011, - 0x404B2620, 0xE0002ABE, 0xE000200E, 0xE0002011, 0x404B2420, 0x404B2620, - 0x828225B2, 0xE0002014, 0xE0002017, 0x404B2A20, 0xE0002AC1, 0xE0002014, - 0xE0002017, 0x404B2820, 0x404B2A20, 0xAE610F02, 0x8281258D, 0x82812591, - 0x8281258F, 0x002D2288, 0x002D2484, 0x002D2483, 0x402DFE20, 0x402E0020, - 0x002DFE88, 0x002E0084, 0x002E0083, 0x402E9E20, 0x402EA020, 0x002E9E88, - 0x002EA084, 0x002EA083, 0x402C7820, 0xE0000CFB, 0xE0000CFB, 0x402C3820, - 0xE0000D01, 0xE0000D01, 0x402D6820, 0x402D6A20, - // Block 21, offset 0x540 - 0x002D6888, 0x002D6A83, 0x402DCC20, 0x402DCE20, 0x002DCC88, 0x002DCE83, - 0x002E9E88, 0x002EA083, 0x402FE620, 0x40302620, 0x002FE688, 0x00302683, - 0x40302820, 0x40302A20, 0x00302883, 0x00302A83, 0x402EE220, 0x4030EE20, - 0x4030F220, 0x002EE288, 0x0030EE83, 0x0030F283, 0x402BDE20, 0x4030F020, - 0x002BDE88, 0x0030F083, 0x40306C20, 0x4030F420, 0x00306C88, 0x0030F483, - 0x40393820, 0x40393620, 0x40393A21, 0x40393A23, 0x403A7420, 0x40393A25, - 0x403A9220, 0x40393A26, 0x403A9221, 0x00393B43, 0x403A9223, 0x00393B44, - 0x403A8821, 0x403A8825, 0x40306C20, 0x40310021, 0x00306C88, 0x003100A3, - 0x402BDE20, 0x40320E20, 0x40320C20, 0x002BDE88, 0x00320E83, 0x00320C83, - 0x402EE220, 0x40321020, 0x002EE288, 0x00321083, 0x402EE220, 0x40321023, - 0x40321020, 0x40321022, 0x002EE288, 0x003210E3, - // Block 22, offset 0x580 - 0x00321083, 0x003210C3, 0x402E9E20, 0x402EA020, 0x402EA220, 0x002E9E88, - 0x002EA083, 0x002EA284, 0x002EA283, 0x002FE688, 0x002FE884, 0x002FE883, - 0x4031DE20, 0x00310286, 0x00310283, 0x4003D220, 0x00310287, 0x00310284, - 0x402BEC20, 0xE0000CFB, 0xE0000CFB, 0x002BEC83, 0xE0000D01, 0xE0000D01, - 0x402C3A20, 0x402C3E20, 0x402C3C20, 0x002C3A88, 0x002C3E83, 0x002C3C83, - 0x402C6220, 0x402C6420, 0x402C6420, 0x002C6288, 0x002C6486, 0x002C6484, - 0x002C6486, 0x002C6484, 0x002E2288, 0xE0000D01, 0xE0000D01, 0x002E2486, - 0x002E2484, 0x002E9E88, 0x002EA086, 0x002EA084, 0x402C3A20, 0xE0003C42, - 0x402C3C20, 0x002C3A88, 0xE0003C48, 0xE0003C45, 0x002C3C86, 0x002C3C84, - 0x402C6220, 0xE0003C54, 0xE0003C4B, 0x402C6620, 0x402C6420, 0x002C6288, - 0xE0003C5A, 0xE0003C57, 0xE0003C51, 0x002C6686, - // Block 23, offset 0x5c0 - 0xE0003C4E, 0x002C6684, 0x002C6486, 0x002C6484, 0x402D2220, 0xE0003C5D, - 0x402D2420, 0x002D2288, 0xE0003C63, 0xE0003C60, 0x002D2486, 0x002D2484, - 0x402E2220, 0xE0003C66, 0xE0000CFB, 0xE0000CFB, 0x402E2420, 0x002E2288, - 0xE0003C6C, 0xE0003C69, 0xE0000D01, 0xE0000D01, 0x002E2486, 0x002E2484, - 0x402E9E20, 0xE0003C6F, 0x402EA020, 0x002E9E88, 0xE0003C75, 0xE0003C72, - 0x002EA086, 0x002EA084, 0x402EE220, 0x402EE420, 0x402EE421, 0x002EE288, - 0x002EE483, 0x002EE4A3, 0x402FE620, 0xE0003C78, 0x402FE820, 0x002FE688, - 0xE0003C7E, 0xE0003C7B, 0x002FE886, 0x002FE884, 0x40302C20, 0xE0003C81, - 0x40302E20, 0x00302C88, 0xE0003C87, 0xE0003C84, 0x00302E86, 0x00302E84, - 0x40306C20, 0x40306E20, 0x40306E21, 0x00306C88, 0x00306E83, 0x00306EA3, - 0x40312A20, 0xE0003C8A, 0x40312C20, 0x00312A88, - // Block 24, offset 0x600 - 0xE0003C90, 0xE0003C8D, 0x00312C86, 0x00312C84, 0x00384A88, 0x00388A83, - 0x402C3A20, 0x402C0C20, 0x002C3A88, 0x002C0C84, 0x002C0C83, 0x402D2220, - 0x402D2420, 0x402D2620, 0x402D2820, 0x002D2288, 0x002D2484, 0x002D2684, - 0x002D2884, 0x002D2483, 0x002D2683, 0x002D2883, 0x402D9A20, 0x402D9C20, - 0x002D9A88, 0x002D9C83, 0x402DFE20, 0x402E0020, 0x402E0220, 0x002DFE88, - 0x002E0084, 0x002E0284, 0x002E0083, 0x002E0283, 0x402E9E20, 0x402EA020, - 0x402EA220, 0x402EA420, 0x002E9E88, 0x002EA083, 0x002EA284, 0x002EA484, - 0x002EA283, 0x002EA483, 0x402BDE20, 0x402C0820, 0x40320C21, 0x40321020, - 0x002BDE88, 0x002C0883, 0x00320CA3, 0x00321083, 0x402C9820, 0x402D0620, - 0x002C9888, 0x002D0683, 0x402D9A20, 0x402DCA20, 0x002D9A88, 0x002DCA83, - 0x402EE220, 0x402F2A20, 0x40320E20, 0x002EE288, - // Block 25, offset 0x640 - 0x002F2A83, 0x00320E83, 0x40306C20, 0x4030BC20, 0x00306C88, 0x0030BC83, - 0x40310020, 0x40312820, 0x00310088, 0x00312883, 0x0065768F, 0xE0003D1D, - 0xE0003D17, 0x0065768F, 0xE0003D17, 0xE0003D1D, 0x00657691, 0xE0003D20, - 0xE0003D1A, 0x00657691, 0xE0003D1A, 0xE0003D20, 0x0065828F, 0xE0003E9B, - 0xE0003D23, 0x0065828F, 0xE0003D23, 0xE0003E9B, 0x00658291, 0xE0003EA1, - 0xE0003D29, 0xE0003E9E, 0xE0003D26, 0x00658291, 0xE0003D29, 0xE0003EA1, - 0xE0003D26, 0xE0003E9E, 0x00658291, 0xE0003D26, 0xE0003E9E, 0xE000216D, - 0xE0003EA1, 0xE0003D29, 0xE000216D, 0xE0003D29, 0xE0003EA1, 0x00658C91, - 0xE0003EE4, 0xE0003EE0, 0xE0003D30, 0xE0003EE0, 0xE0003EDD, 0xE0003EE0, - 0xE0003D2D, 0x00658C91, 0xE0003EE4, 0xE0003D30, 0xE0003EE0, 0xE0003EE0, - 0xE0003D2D, 0xE0003EDD, 0xE0003EE0, 0x00658C91, - // Block 26, offset 0x680 - 0xE0003EE0, 0xE0003D2D, 0xE0003EDD, 0xE0003EE0, 0xE00021F2, 0xE0003EE0, - 0xE0003EE4, 0xE0003D30, 0xE00021F2, 0xE0003D30, 0xE0003EE0, 0xE0003EE4, - 0x00659691, 0xE0003F2E, 0xE0003F2A, 0xE0003D37, 0xE0003F2A, 0xE0003F27, - 0xE0003F2A, 0xE0003D34, 0x00659691, 0xE0003F2E, 0xE0003D37, 0xE0003F2A, - 0xE0003F2A, 0xE0003D34, 0xE0003F27, 0xE0003F2A, 0x00659691, 0xE0003F2A, - 0xE0003D34, 0xE0003F27, 0xE0003F2A, 0xE000222C, 0xE0003F2A, 0xE0003F2E, - 0xE0003D37, 0xE000222C, 0xE0003D37, 0xE0003F2A, 0xE0003F2E, 0x0065A091, - 0xE0003F71, 0xE0003D3B, 0x0065A091, 0xE0003D3B, 0xE0003F71, 0x0065AA8F, - 0xE0003F89, 0xE0003D3E, 0xE0003F83, 0xE0003F89, 0x0065AA91, 0xE0003F91, - 0xE0003F9A, 0xE0003F8D, 0xE0003D44, 0xE0003F96, 0xE0003D48, 0xE0003F8D, - 0xE0003F86, 0xE0003F8D, 0xE0003D41, 0x0065AA91, - // Block 27, offset 0x6c0 - 0xE0003F91, 0xE0003F9A, 0xE0003D44, 0xE0003F8D, 0xE0003D48, 0xE0003F96, - 0xE0003F8D, 0xE0003D41, 0xE0003F86, 0xE0003F8D, 0x0065AA91, 0xE0003F8D, - 0xE0003D41, 0xE0003F86, 0xE0003F8D, 0xE000225B, 0xE0003F8D, 0xE0003F91, - 0xE0003D44, 0xE000225B, 0xE0003D44, 0xE0003F8D, 0xE0003F91, 0xE0002261, - 0xE0003F96, 0xE0003F9A, 0xE0003D48, 0xE0002261, 0xE0003D48, 0xE0003F96, - 0xE0003F9A, 0x0065B491, 0xE000400F, 0xE0003D4C, 0x0065B491, 0xE0003D4C, - 0xE000400F, 0x0065BE8F, 0xE0004021, 0xE0003D4F, 0x0065BE8F, 0xE0003D4F, - 0xE0004021, 0x0065BE91, 0xE0004024, 0xE0003D52, 0x0065BE91, 0xE0003D52, - 0xE0004024, 0x0065C68F, 0xE0003D55, 0xE0004036, 0x0065C691, 0xE0004039, - 0xE0003D58, 0x0065C691, 0xE0003D58, 0xE0004039, 0x0065D08F, 0xE000405A, - 0xE0004054, 0xE000405A, 0xE0003D5B, 0x0065D08F, - // Block 28, offset 0x700 - 0xE000405A, 0xE0003D5B, 0xE0004054, 0xE000405A, 0x0065D091, 0xE000405E, - 0xE0004057, 0xE000405E, 0xE0003D5E, 0x0065D091, 0xE0004062, 0xE0003D61, - 0xE000405E, 0xE000405E, 0xE0003D5E, 0xE0004057, 0xE000405E, 0x0065D091, - 0xE000405E, 0xE0003D5E, 0xE0004057, 0xE000405E, 0xE000236A, 0xE0003D61, - 0xE000405E, 0xE0004062, 0x0065788F, 0xE0003D6B, 0xE0003D65, 0x0065788F, - 0xE0003D65, 0xE0003D6B, 0x00657891, 0xE0003D6E, 0xE0003D68, 0x00657891, - 0xE0003D68, 0xE0003D6E, 0x00658491, 0xE0003EAC, 0xE0003EA8, 0xE0003D74, - 0xE0003EA8, 0xE0003EA5, 0xE0003EA8, 0xE0003D71, 0x00658491, 0xE0003EAC, - 0xE0003D74, 0xE0003EA8, 0xE0003EA8, 0xE0003D71, 0xE0003EA5, 0xE0003EA8, - 0x00658491, 0xE0003EA8, 0xE0003D71, 0xE0003EA5, 0xE0003EA8, 0xE000218B, - 0xE0003EA8, 0xE0003EAC, 0xE0003D74, 0xE000218B, - // Block 29, offset 0x740 - 0xE0003D74, 0xE0003EA8, 0xE0003EAC, 0x00658E8F, 0xE0003EEF, 0xE0003D78, - 0xE0003EE9, 0xE0003EEF, 0x00658E91, 0xE0003EF7, 0xE0003EF3, 0xE0003D7E, - 0xE0003EF3, 0xE0003EEC, 0xE0003EF3, 0xE0003D7B, 0x00658E91, 0xE0003EF7, - 0xE0003D7E, 0xE0003EF3, 0xE0003EF3, 0xE0003D7B, 0xE0003EEC, 0xE0003EF3, - 0x00658E91, 0xE0003EF3, 0xE0003D7B, 0xE0003EEC, 0xE0003EF3, 0xE0002203, - 0xE0003EF3, 0xE0003EF7, 0xE0003D7E, 0xE0002203, 0xE0003D7E, 0xE0003EF3, - 0xE0003EF7, 0x00659891, 0xE0003F3A, 0xE0003F36, 0xE0003D85, 0xE0003F36, - 0xE0003F33, 0xE0003F36, 0xE0003D82, 0x00659891, 0xE0003F3A, 0xE0003D85, - 0xE0003F36, 0xE0003F36, 0xE0003D82, 0xE0003F33, 0xE0003F36, 0x00659891, - 0xE0003F36, 0xE0003D82, 0xE0003F33, 0xE0003F36, 0xE0002237, 0xE0003F36, - 0xE0003F3A, 0xE0003D85, 0xE0002237, 0xE0003D85, - // Block 30, offset 0x780 - 0xE0003F36, 0xE0003F3A, 0x0065A291, 0xE0003F74, 0xE0003D89, 0x0065A291, - 0xE0003D89, 0xE0003F74, 0x0065AC8F, 0xE0003FA5, 0xE0003D8C, 0xE0003F9F, - 0xE0003FA5, 0x0065AC91, 0xE0003FAD, 0xE0003FB6, 0xE0003FA9, 0xE0003D92, - 0xE0003FB2, 0xE0003D96, 0xE0003FA9, 0xE0003FA2, 0xE0003FA9, 0xE0003D8F, - 0x0065AC91, 0xE0003FAD, 0xE0003FB6, 0xE0003D92, 0xE0003FA9, 0xE0003D96, - 0xE0003FB2, 0xE0003FA9, 0xE0003D8F, 0xE0003FA2, 0xE0003FA9, 0x0065AC91, - 0xE0003FA9, 0xE0003D8F, 0xE0003FA2, 0xE0003FA9, 0xE000227D, 0xE0003FA9, - 0xE0003FAD, 0xE0003D92, 0xE000227D, 0xE0003D92, 0xE0003FA9, 0xE0003FAD, - 0xE0002283, 0xE0003FB2, 0xE0003FB6, 0xE0003D96, 0xE0002283, 0xE0003D96, - 0xE0003FB2, 0xE0003FB6, 0x0065B691, 0xE0004012, 0xE0003D9A, 0x0065B691, - 0xE0003D9A, 0xE0004012, 0x0065C88F, 0xE0003D9D, - // Block 31, offset 0x7c0 - 0xE000403C, 0x0065C891, 0xE000403F, 0xE0003DA0, 0x0065C891, 0xE0003DA0, - 0xE000403F, 0x0065D291, 0xE000406A, 0xE0004067, 0xE000406A, 0xE0003DA3, - 0x0065D291, 0xE000406E, 0xE0003DA6, 0xE000406A, 0xE000406A, 0xE0003DA3, - 0xE0004067, 0xE000406A, 0xE0002371, 0xE0003DA6, 0xE000406A, 0xE000406E, - 0x00657A8F, 0xE0003DBA, 0xE0003DB0, 0xE0003DBA, 0xE0003DAA, 0x00657A8F, - 0xE0003DBA, 0xE0003DAA, 0xE0003DB0, 0xE0003DBA, 0x00657A91, 0xE0003DC2, - 0xE0003DBE, 0xE0003DB6, 0xE0003DBE, 0xE0003DB3, 0xE0003DBE, 0xE0003DAD, - 0x00657A91, 0xE0003DC2, 0xE0003DB6, 0xE0003DBE, 0xE0003DBE, 0xE0003DAD, - 0xE0003DB3, 0xE0003DBE, 0x00657A91, 0xE0003DBE, 0xE0003DAD, 0xE0003DB3, - 0xE0003DBE, 0xE000214F, 0xE0003DBE, 0xE0003DC2, 0xE0003DB6, 0xE000214F, - 0xE0003DB6, 0xE0003DBE, 0xE0003DC2, 0x0065868F, - // Block 32, offset 0x800 - 0xE0003EB7, 0xE0003DC7, 0xE0003EB1, 0xE0003EB7, 0x00658691, 0xE0003EBF, - 0xE0003EBB, 0xE0003DCD, 0xE0003EBB, 0xE0003EB4, 0xE0003EBB, 0xE0003DCA, - 0x00658691, 0xE0003EBF, 0xE0003DCD, 0xE0003EBB, 0xE0003EBB, 0xE0003DCA, - 0xE0003EB4, 0xE0003EBB, 0x00658691, 0xE0003EBB, 0xE0003DCA, 0xE0003EB4, - 0xE0003EBB, 0xE00021BB, 0xE0003EBB, 0xE0003EBF, 0xE0003DCD, 0xE00021BB, - 0xE0003DCD, 0xE0003EBB, 0xE0003EBF, 0x0065908F, 0xE0003F02, 0xE0003DD1, - 0xE0003EFC, 0xE0003F02, 0x00659091, 0xE0003F0A, 0xE0003F06, 0xE0003DD7, - 0xE0003F06, 0xE0003EFF, 0xE0003F06, 0xE0003DD4, 0x00659091, 0xE0003F0A, - 0xE0003DD7, 0xE0003F06, 0xE0003F06, 0xE0003DD4, 0xE0003EFF, 0xE0003F06, - 0x00659091, 0xE0003F06, 0xE0003DD4, 0xE0003EFF, 0xE0003F06, 0xE0002212, - 0xE0003F06, 0xE0003F0A, 0xE0003DD7, 0xE0002212, - // Block 33, offset 0x840 - 0xE0003DD7, 0xE0003F06, 0xE0003F0A, 0x00659A8F, 0xE0003F45, 0xE0003F3F, - 0xE0003F45, 0xE0003DDB, 0x00659A8F, 0xE0003F45, 0xE0003DDB, 0xE0003F3F, - 0xE0003F45, 0x00659A91, 0xE0003F4D, 0xE0003F49, 0xE0003DE1, 0xE0003F49, - 0xE0003F42, 0xE0003F49, 0xE0003DDE, 0x00659A91, 0xE0003F4D, 0xE0003DE1, - 0xE0003F49, 0xE0003F49, 0xE0003DDE, 0xE0003F42, 0xE0003F49, 0x00659A91, - 0xE0003F49, 0xE0003DDE, 0xE0003F42, 0xE0003F49, 0xE000223D, 0xE0003F49, - 0xE0003F4D, 0xE0003DE1, 0xE000223D, 0xE0003DE1, 0xE0003F49, 0xE0003F4D, - 0x0065A48F, 0xE0003DE5, 0xE0003F77, 0x0065A491, 0xE0003F7A, 0xE0003DE8, - 0x0065A491, 0xE0003DE8, 0xE0003F7A, 0x0065AE8F, 0xE0003FC1, 0xE0003DEB, - 0xE0003FBB, 0xE0003FC1, 0x0065AE91, 0xE0003FC9, 0xE0003FD2, 0xE0003FC5, - 0xE0003DF1, 0xE0003FCE, 0xE0003DF5, 0xE0003FC5, - // Block 34, offset 0x880 - 0xE0003FBE, 0xE0003FC5, 0xE0003DEE, 0x0065AE91, 0xE0003FC9, 0xE0003FD2, - 0xE0003DF1, 0xE0003FC5, 0xE0003DF5, 0xE0003FCE, 0xE0003FC5, 0xE0003DEE, - 0xE0003FBE, 0xE0003FC5, 0x0065AE91, 0xE0003FC5, 0xE0003DEE, 0xE0003FBE, - 0xE0003FC5, 0xE000229D, 0xE0003FC5, 0xE0003FC9, 0xE0003DF1, 0xE000229D, - 0xE0003DF1, 0xE0003FC5, 0xE0003FC9, 0xE00022A3, 0xE0003FCE, 0xE0003FD2, - 0xE0003DF5, 0xE00022A3, 0xE0003DF5, 0xE0003FCE, 0xE0003FD2, 0x0065B88F, - 0xE0003DF9, 0xE0004015, 0x0065B891, 0xE0004018, 0xE0003DFC, 0x0065B891, - 0xE0003DFC, 0xE0004018, 0x0065C08F, 0xE0004027, 0xE0003DFF, 0x0065C08F, - 0xE0003DFF, 0xE0004027, 0x0065C091, 0xE000402A, 0xE0003E02, 0x0065C091, - 0xE0003E02, 0xE000402A, 0x0065CA8F, 0xE0003E05, 0xE0004042, 0x0065CA91, - 0xE0004045, 0xE0003E08, 0x0065CA91, 0xE0003E08, - // Block 35, offset 0x8c0 - 0xE0004045, 0x00657E8F, 0xE0003E11, 0xE0003E0B, 0x00657E8F, 0xE0003E0B, - 0xE0003E11, 0x00657E91, 0xE0003E14, 0xE0003E0E, 0x00657E91, 0xE0003E0E, - 0xE0003E14, 0x0065888F, 0xE0003EC4, 0xE0003E17, 0x0065888F, 0xE0003E17, - 0xE0003EC4, 0x00658891, 0xE0003ECA, 0xE0003E1D, 0xE0003EC7, 0xE0003E1A, - 0x00658891, 0xE0003E1D, 0xE0003ECA, 0xE0003E1A, 0xE0003EC7, 0x00658891, - 0xE0003E1A, 0xE0003EC7, 0xE00021D9, 0xE0003ECA, 0xE0003E1D, 0xE00021D9, - 0xE0003E1D, 0xE0003ECA, 0x00659291, 0xE0003F16, 0xE0003F12, 0xE0003E24, - 0xE0003F12, 0xE0003F0F, 0xE0003F12, 0xE0003E21, 0x00659291, 0xE0003F16, - 0xE0003E24, 0xE0003F12, 0xE0003F12, 0xE0003E21, 0xE0003F0F, 0xE0003F12, - 0x00659291, 0xE0003F12, 0xE0003E21, 0xE0003F0F, 0xE0003F12, 0xE0002218, - 0xE0003F12, 0xE0003F16, 0xE0003E24, 0xE0002218, - // Block 36, offset 0x900 - 0xE0003E24, 0xE0003F12, 0xE0003F16, 0x00659C91, 0xE0003F59, 0xE0003F55, - 0xE0003E2B, 0xE0003F55, 0xE0003F52, 0xE0003F55, 0xE0003E28, 0x00659C91, - 0xE0003F59, 0xE0003E2B, 0xE0003F55, 0xE0003F55, 0xE0003E28, 0xE0003F52, - 0xE0003F55, 0x00659C91, 0xE0003F55, 0xE0003E28, 0xE0003F52, 0xE0003F55, - 0xE0002243, 0xE0003F55, 0xE0003F59, 0xE0003E2B, 0xE0002243, 0xE0003E2B, - 0xE0003F55, 0xE0003F59, 0x0065A691, 0xE0003F7D, 0xE0003E2F, 0x0065A691, - 0xE0003E2F, 0xE0003F7D, 0x0065B08F, 0xE0003FDD, 0xE0003E32, 0xE0003FD7, - 0xE0003FDD, 0x0065B091, 0xE0003FE5, 0xE0003FEE, 0xE0003FE1, 0xE0003E38, - 0xE0003FEA, 0xE0003E3C, 0xE0003FE1, 0xE0003FDA, 0xE0003FE1, 0xE0003E35, - 0x0065B091, 0xE0003FE5, 0xE0003FEE, 0xE0003E38, 0xE0003FE1, 0xE0003E3C, - 0xE0003FEA, 0xE0003FE1, 0xE0003E35, 0xE0003FDA, - // Block 37, offset 0x940 - 0xE0003FE1, 0x0065B091, 0xE0003FE1, 0xE0003E35, 0xE0003FDA, 0xE0003FE1, - 0xE00022C0, 0xE0003FE1, 0xE0003FE5, 0xE0003E38, 0xE00022C0, 0xE0003E38, - 0xE0003FE1, 0xE0003FE5, 0xE00022C6, 0xE0003FEA, 0xE0003FEE, 0xE0003E3C, - 0xE00022C6, 0xE0003E3C, 0xE0003FEA, 0xE0003FEE, 0x0065BA91, 0xE000401B, - 0xE0003E40, 0x0065BA91, 0xE0003E40, 0xE000401B, 0x0065CC8F, 0xE0003E43, - 0xE0004048, 0x0065CC91, 0xE000404B, 0xE0003E46, 0x0065CC91, 0xE0003E46, - 0xE000404B, 0x0065D491, 0xE0004076, 0xE0004073, 0xE0004076, 0xE0003E49, - 0x0065D491, 0xE000407A, 0xE0003E4C, 0xE0004076, 0xE0004076, 0xE0003E49, - 0xE0004073, 0xE0004076, 0xE0002374, 0xE0003E4C, 0xE0004076, 0xE000407A, - 0x0065808F, 0xE0003E56, 0xE0003E50, 0x0065808F, 0xE0003E50, 0xE0003E56, - 0x00658091, 0xE0003E59, 0xE0003E53, 0x00658091, - // Block 38, offset 0x980 - 0xE0003E53, 0xE0003E59, 0x00658A91, 0xE0003ED5, 0xE0003ED1, 0xE0003E5F, - 0xE0003ED1, 0xE0003ECE, 0xE0003ED1, 0xE0003E5C, 0x00658A91, 0xE0003ED5, - 0xE0003E5F, 0xE0003ED1, 0xE0003ED1, 0xE0003E5C, 0xE0003ECE, 0xE0003ED1, - 0x00658A91, 0xE0003ED1, 0xE0003E5C, 0xE0003ECE, 0xE0003ED1, 0xE00021E3, - 0xE0003ED1, 0xE0003ED5, 0xE0003E5F, 0xE00021E3, 0xE0003E5F, 0xE0003ED1, - 0xE0003ED5, 0x00659491, 0xE0003F22, 0xE0003F1E, 0xE0003E66, 0xE0003F1E, - 0xE0003F1B, 0xE0003F1E, 0xE0003E63, 0x00659491, 0xE0003F22, 0xE0003E66, - 0xE0003F1E, 0xE0003F1E, 0xE0003E63, 0xE0003F1B, 0xE0003F1E, 0x00659491, - 0xE0003F1E, 0xE0003E63, 0xE0003F1B, 0xE0003F1E, 0xE0002226, 0xE0003F1E, - 0xE0003F22, 0xE0003E66, 0xE0002226, 0xE0003E66, 0xE0003F1E, 0xE0003F22, - 0x00659E8F, 0xE0003F64, 0xE0003E6A, 0xE0003F5E, - // Block 39, offset 0x9c0 - 0xE0003F64, 0x00659E91, 0xE0003F6C, 0xE0003F68, 0xE0003E70, 0xE0003F68, - 0xE0003F61, 0xE0003F68, 0xE0003E6D, 0x00659E91, 0xE0003F6C, 0xE0003E70, - 0xE0003F68, 0xE0003F68, 0xE0003E6D, 0xE0003F61, 0xE0003F68, 0x00659E91, - 0xE0003F68, 0xE0003E6D, 0xE0003F61, 0xE0003F68, 0xE000224D, 0xE0003F68, - 0xE0003F6C, 0xE0003E70, 0xE000224D, 0xE0003E70, 0xE0003F68, 0xE0003F6C, - 0x0065A891, 0xE0003F80, 0xE0003E74, 0x0065A891, 0xE0003E74, 0xE0003F80, - 0x0065B28F, 0xE0003FF9, 0xE0003E77, 0xE0003FF3, 0xE0003FF9, 0x0065B291, - 0xE0004001, 0xE000400A, 0xE0003FFD, 0xE0003E7D, 0xE0004006, 0xE0003E81, - 0xE0003FFD, 0xE0003FF6, 0xE0003FFD, 0xE0003E7A, 0x0065B291, 0xE0004001, - 0xE000400A, 0xE0003E7D, 0xE0003FFD, 0xE0003E81, 0xE0004006, 0xE0003FFD, - 0xE0003E7A, 0xE0003FF6, 0xE0003FFD, 0x0065B291, - // Block 40, offset 0xa00 - 0xE0003FFD, 0xE0003E7A, 0xE0003FF6, 0xE0003FFD, 0xE00022EF, 0xE0003FFD, - 0xE0004001, 0xE0003E7D, 0xE00022EF, 0xE0003E7D, 0xE0003FFD, 0xE0004001, - 0xE00022F5, 0xE0004006, 0xE000400A, 0xE0003E81, 0xE00022F5, 0xE0003E81, - 0xE0004006, 0xE000400A, 0x0065BC91, 0xE000401E, 0xE0003E85, 0x0065BC91, - 0xE0003E85, 0xE000401E, 0x0065C48F, 0xE000402D, 0xE0003E88, 0x0065C48F, - 0xE0003E88, 0xE000402D, 0x0065C491, 0xE0004030, 0xE0003E8B, 0x0065C491, - 0xE0003E8B, 0xE0004030, 0x0065CE8F, 0xE0003E8E, 0xE000404E, 0x0065CE91, - 0xE0004051, 0xE0003E91, 0x0065CE91, 0xE0003E91, 0xE0004051, 0x0065D691, - 0xE0004082, 0xE000407F, 0xE0004082, 0xE0003E94, 0x0065D691, 0xE0004086, - 0xE0003E97, 0xE0004082, 0xE0004082, 0xE0003E94, 0xE000407F, 0xE0004082, - 0x0065D691, 0xE0004082, 0xE0003E94, 0xE000407F, - // Block 41, offset 0xa40 - 0xE0004082, 0xE0002377, 0xE0003E97, 0xE0004082, 0xE0004086, 0x0065D891, - 0xE000408B, 0x40368C20, 0x40343620, 0x00368C83, 0x00343688, 0x002DFE88, - 0x002F56A3, 0x402BDE20, 0x40320C21, 0x40321020, 0x002BDE88, 0x00320CA3, - 0x00321083, 0x404FA420, 0xE000409E, 0x404FA620, 0xE00040A2, 0x404FA820, - 0xE00040A6, 0x404FAA20, 0xE00040AA, 0x404FAC20, 0xE00040AE, 0x404FAE20, - 0xE00040B2, 0x404FB020, 0xE00040B6, 0x404FB220, 0xE00040BA, 0x404FB420, - 0xE00040BE, 0x404FB620, 0xE00040C2, 0x404FB820, 0xE00040C6, 0x404FBA20, - 0xE00040CA, 0x404FBC20, 0xE00040CE, 0x404FBE20, 0xE00040D2, 0x404FC020, - 0xE00040D6, 0x404FC220, 0xE00040DA, 0x404FC420, 0xE00040DE, 0x404FC620, - 0xE00040E2, 0x404FC820, 0xE00040E6, 0x404FCA20, 0xE00040EA, 0x404FCC20, - 0xE00040EE, 0x404FCE20, 0xE00040F2, 0x404FD020, - // Block 42, offset 0xa80 - 0xE00040F6, 0x404FD220, 0xE00040FA, 0x404FD420, 0xE00040FE, 0x404FD620, - 0xE0004102, 0x404FD820, 0xE0004106, 0x404FDA20, 0xE000410A, 0x404FDA20, - 0xE000410E, 0x404FDC20, 0xE0004112, 0x404FDC20, 0xE0004116, 0x404FDC20, - 0xE000411A, 0x404FDE20, 0xE000411E, 0x404FDE20, 0xE0004122, 0x404FE020, - 0xE0004126, 0x404FE220, 0xE000412A, 0x404FE420, 0xE000412E, 0x404FE620, - 0xE0004132, 0x404FE820, 0xE0004136, 0x40501820, 0x40502E20, 0x40503820, - 0x40500E20, 0x40503220, 0x40501020, 0x40503620, 0x40502420, 0x40503A20, - 0x40502A20, 0x40503C20, 0x403FEC20, 0x40403E20, 0x402D2220, 0x002D2483, - 0x402D2420, 0x002D2288, 0x002D2485, 0x002D2484, 0x402DFE20, 0x002E0083, - 0x402E0020, 0x002DFE88, 0x002E0085, 0x002E0084, 0x402E8220, 0x002E8483, - 0x002E8683, 0x002E8883, 0x002E8A83, 0x402E8420, - // Block 43, offset 0xac0 - 0x402E8620, 0x402E8820, 0x402E8A20, 0x002E8288, 0x002E8485, 0x002E8685, - 0x002E8885, 0x002E8A85, 0x002E8484, 0x002E8684, 0x002E8884, 0x002E8A84, - 0x402E9E20, 0x002EA485, 0x002EA484, 0x002EA483, 0x402EA420, 0x002EA083, - 0x002EA283, 0x002EA683, 0x002EA883, 0x002EAA83, 0x002EAC83, 0x002EAE83, - 0x402EA020, 0x402EA220, 0x402EA620, 0x402EA820, 0x402EAA20, 0x402EAC20, - 0x402EAE20, 0x002E9E88, 0x002EA488, 0x002EA487, 0x002EA486, 0x002EA085, - 0x002EA285, 0x002EA685, 0x002EA885, 0x002EAA85, 0x002EAC85, 0x002EAE85, - 0x002EA084, 0x002EA284, 0x002EA684, 0x002EA884, 0x002EAA84, 0x002EAC84, - 0x002EAE84, 0x402FE620, 0x002FE883, 0x402FE820, 0x002FE688, 0x002FE885, - 0x002FE884, 0x40302C20, 0x00302E83, 0x40302E20, 0x00302C88, 0x00302E85, - 0x00302E84, 0xAE605202, 0xAE603502, 0xAE603202, - // Block 44, offset 0xb00 - 0xAE604E02, 0x402BDE20, 0x402BDE21, 0x002BDE88, 0x002BDEA3, 0x402C9820, - 0x402C9822, 0x402C9821, 0x002C9888, 0x002C98C3, 0x002C98A3, 0x402D9A20, - 0x402D9A21, 0x002D9A88, 0x002D9AA3, 0x40306C20, 0x40306C22, 0x40306C21, - 0x00306C88, 0x00306CC3, 0x00306CA3, 0x402C3A20, 0x402C6020, 0x002C3A88, - 0x002C6083, 0x402D2220, 0x402D6620, 0x002D2288, 0x002D6683, 0x402DFE20, - 0x402E2020, 0x002DFE88, 0x002E2083, 0x402E2220, 0xE0000CFB, 0x402E8020, - 0xE0000CFB, 0x002E2288, 0xE0000D01, 0x002E8083, 0xE0000D01, 0x402E9E20, - 0x402EE020, 0x002E9E88, 0x002EE083, 0x402F7A20, 0x402FE420, 0x002F7A88, - 0x002FE483, 0x402FE620, 0x40302A20, 0x002FE688, 0x00302A83, 0x40312A20, - 0x40316220, 0x00312A88, 0x00316283, 0x40442220, 0xE000A9DC, 0x40443E20, - 0xE000A9E2, 0xE000A9EE, 0xE000A9E8, 0x40444820, - // Block 45, offset 0xb40 - 0xE000A9EB, 0x40445820, 0xE000A9F4, 0x40445A20, 0xE000A9FA, 0x40446620, - 0xE000AA00, 0x40448220, 0x40448820, 0x00448C83, 0x403FFC20, 0x40404020, - 0x002C3A88, 0x402C3820, 0x402C3A20, 0x002C3883, 0x002D2288, 0x402D6620, - 0x002D6683, 0x402D2020, 0x402D2220, 0x002D6684, 0x002D6685, 0x002D2083, - 0x00312A88, 0x40312820, 0x40312A20, 0x00312883, 0x404E6020, 0xE000AA0C, - 0x404FFE20, 0x404FFE21, 0x404E6A20, 0xE000AA12, 0x40502820, 0x40502821, - 0x404E9420, 0xE000AA2C, 0xE000AA25, 0x4050AC20, 0x4050AC21, 0x4005B820, - 0xE000AA32, 0x404EA620, 0xE000AA3D, 0x4050C820, 0x4050C821, 0xE000AA4E, - 0xE000AA51, 0xE000AA55, 0xE000AA5E, 0xE000AA62, 0xE000AA6E, 0xE000AA7A, - 0xE000AA86, 0xE000AA92, 0xE000AA9E, 0xE000AAAA, 0xE000AAB6, 0xE000AAC2, - 0xE000AACE, 0xE000AADA, 0xE000AAE6, 0xE000AAF2, - // Block 46, offset 0xb80 - 0xE000AAFE, 0xE000AB0A, 0xE000AB16, 0xE000AB22, 0xE000AB2E, 0xE000AB3A, - 0xE000AB46, 0xE000AB52, 0xE000AB5E, 0xE000AB6A, 0xE000AB76, 0xE000AB82, - 0xE000AB8E, 0xE000AB9A, 0xE000ABA6, 0xE000ABB2, 0xE000ABBE, 0xE000ABCA, - 0xE000ABD6, 0xE000ABE2, 0xE000ABEE, 0xE000ABFA, 0xE000AC06, 0xE000AC12, - 0xE000AC1E, 0xE000AC2A, 0xE000AC36, 0xE000AC42, 0xE000AC4E, 0xE000AC5A, - 0xE000AC66, 0xE000AC72, 0xE000AC7E, 0xE000AC8A, 0xE000AC96, 0xE000ACA2, - 0xE000ACAE, 0xE000ACBA, 0xE000ACC6, 0xE000ACD2, 0xE000ACDE, 0xE000ACEA, - 0xE000ACF6, 0xE000AD02, 0xE000AD0E, 0xE000AD1A, 0xE000AD26, 0xE000AA68, - 0xE000AA74, 0xE000AA80, 0xE000AA8C, 0xE000AA98, 0xE000AAA4, 0xE000AAB0, - 0xE000AABC, 0xE000AAC8, 0xE000AAD4, 0xE000AAE0, 0xE000AAEC, 0xE000AAF8, - 0xE000AB04, 0xE000AB10, 0xE000AB1C, 0xE000AB28, - // Block 47, offset 0xbc0 - 0xE000AB34, 0xE000AB40, 0xE000AB4C, 0xE000AB58, 0xE000AB64, 0xE000AB70, - 0xE000AB7C, 0xE000AB88, 0xE000AB94, 0xE000ABA0, 0xE000ABAC, 0xE000ABB8, - 0xE000ABC4, 0xE000ABD0, 0xE000ABDC, 0xE000ABE8, 0xE000ABF4, 0xE000AC00, - 0xE000AC0C, 0xE000AC18, 0xE000AC24, 0xE000AC30, 0xE000AC3C, 0xE000AC48, - 0xE000AC54, 0xE000AC60, 0xE000AC6C, 0xE000AC78, 0xE000AC84, 0xE000AC90, - 0xE000AC9C, 0xE000ACA8, 0xE000ACB4, 0xE000ACC0, 0xE000ACCC, 0xE000ACD8, - 0xE000ACE4, 0xE000ACF0, 0xE000ACFC, 0xE000AD08, 0xE000AD14, 0xE000AD20, - 0xE000AD2C, 0x404EFE20, 0x404F5222, 0xE000AD37, 0x404F5220, 0x404F5020, - 0x404F1A22, 0x404F1A23, 0x404F2822, 0x404F2823, 0x404F3622, 0x404F3623, - 0x404F4422, 0x404F4423, 0x404F5223, 0x404F6022, 0x404F6023, 0x404F6E22, - 0x404F6E23, 0x404F7C22, 0x404F7C23, 0x404F8A21, - // Block 48, offset 0xc00 - 0x404F9822, 0x404F9823, 0x404FA622, 0x404FA623, 0x404FB422, 0x404FB423, - 0x404FC222, 0x404FC223, 0x404FD022, 0x404FD023, 0x404FDE22, 0x404FDE23, - 0x404FEC22, 0x404FEC23, 0x404FFA22, 0x404FFA23, 0x40500822, 0x40500823, - 0x40501622, 0x40501623, 0x40502422, 0x40502423, 0x40503222, 0x40503223, - 0x40504022, 0x40504023, 0x40504E22, 0x40504E23, 0x40505C22, 0x40505C23, - 0x40506A22, 0x40506A23, 0x40508C22, 0x40508C23, 0x40509A22, 0x40509A23, - 0x4050A822, 0x4050A823, 0x4050B622, 0x4050B623, 0x4050C421, 0x4050D222, - 0x4050D223, 0x4050E022, 0x4050E023, 0x4050EE21, 0x4050FC21, 0x404F1A20, - 0x404F1A21, 0x404F2820, 0x404F2821, 0x404F3620, 0x404F3621, 0x404F4420, - 0x404F4421, 0x404F5221, 0x404F6020, 0x404F6021, 0x404F6E20, 0x404F6E21, - 0x404F7C20, 0x404F7C21, 0x404F8A20, 0x404F9820, - // Block 49, offset 0xc40 - 0x404F9821, 0x404FA620, 0x404FA621, 0x404FB420, 0x404FB421, 0x404FC220, - 0x404FC221, 0x404FD020, 0x404FD021, 0x404FDE20, 0x404FDE21, 0x404FEC20, - 0x404FEC21, 0x404FFA20, 0x404FFA21, 0x40500820, 0x40500821, 0x40501620, - 0x40501621, 0x40502420, 0x40502421, 0x40503220, 0x40503221, 0x40504020, - 0x40504021, 0x40504E20, 0x40504E21, 0x40505C20, 0x40505C21, 0x40506A20, - 0x40506A21, 0x40508C20, 0x40508C21, 0x40509A20, 0x40509A21, 0x4050A820, - 0x4050A821, 0x4050B620, 0x4050B621, 0x4050C420, 0x4050D220, 0x4050D221, - 0x4050E020, 0x4050E021, 0x4050EE20, 0x4050FC20, 0x404F1820, 0x404F1821, - 0x404F2620, 0x404F2621, 0x404F3420, 0x404F3421, 0x404F4220, 0x404F4221, - 0x404F5021, 0x404F5E20, 0x404F5E21, 0x404F6C20, 0x404F6C21, 0x404F7A20, - 0x404F7A21, 0x404F8820, 0x404F9620, 0x404F9621, - // Block 50, offset 0xc80 - 0x404FA420, 0x404FA421, 0x404FB220, 0x404FB221, 0x404FC020, 0x404FC021, - 0x404FCE20, 0x404FCE21, 0x404FDC20, 0x404FDC21, 0x404FEA20, 0x404FEA21, - 0x404FF820, 0x404FF821, 0x40500620, 0x40500621, 0x40501420, 0x40501421, - 0x40502220, 0x40502221, 0x40503020, 0x40503021, 0x40503E20, 0x40503E21, - 0x40504C20, 0x40504C21, 0x40505A20, 0x40505A21, 0x40506820, 0x40506821, - 0x40508A20, 0x40508A21, 0x40509820, 0x40509821, 0x4050A620, 0x4050A621, - 0x4050B420, 0x4050B421, 0x4050C220, 0x4050D020, 0x4050D021, 0x4050DE20, - 0x4050DE21, 0x4050EC20, 0x4050FA20, 0x404F0A21, 0x404F0A20, 0x404F0821, - 0x404F0820, 0x404EE620, 0x404F5420, 0x404F4C20, 0x40507620, 0x40507A20, - 0x404F1C20, 0x404F1C21, 0x404F2A20, 0x404F2A21, 0x404F3820, 0x404F3821, - 0x404F4620, 0x404F4621, 0x404F5421, 0x404F6220, - // Block 51, offset 0xcc0 - 0x404F6221, 0x404F7020, 0x404F7021, 0x404F7E20, 0x404F7E21, 0x404F8C20, - 0x404F9A20, 0x404F9A21, 0x404FA820, 0x404FA821, 0x404FB620, 0x404FB621, - 0x404FC420, 0x404FC421, 0x404FD220, 0x404FD221, 0x404FE020, 0x404FE021, - 0x404FEE20, 0x404FEE21, 0x404FFC20, 0x404FFC21, 0x40500A20, 0x40500A21, - 0x40501820, 0x40501821, 0x40502620, 0x40502621, 0x40503420, 0x40503421, - 0x40504220, 0x40504221, 0x40505020, 0x40505021, 0x40505E20, 0x40505E21, - 0x40506C20, 0x40506C21, 0x40508E20, 0x40508E21, 0x40509C20, 0x40509C21, - 0x4050AA20, 0x4050AA21, 0x4050B820, 0x4050B821, 0x4050C620, 0x4050D420, - 0x4050D421, 0x4050E220, 0x4050E221, 0x4050F020, 0x4050FE20, 0x404F1420, - 0x404F1421, 0x404F2220, 0x404F2221, 0x404F3020, 0x404F3021, 0x404F3E20, - 0x404F3E21, 0x404F4C21, 0x404F5A20, 0x404F5A21, - // Block 52, offset 0xd00 - 0x404F6820, 0x404F6821, 0x404F7620, 0x404F7621, 0x404F8420, 0x404F9220, - 0x404F9221, 0x404FA020, 0x404FA021, 0x404FAE20, 0x404FAE21, 0x404FBC20, - 0x404FBC21, 0x404FCA20, 0x404FCA21, 0x404FD820, 0x404FD821, 0x404FE620, - 0x404FE621, 0x404FF420, 0x404FF421, 0x40500220, 0x40500221, 0x40501020, - 0x40501021, 0x40501E20, 0x40501E21, 0x40502C20, 0x40502C21, 0x40503A20, - 0x40503A21, 0x40504820, 0x40504821, 0x40505620, 0x40505621, 0x40506420, - 0x40506421, 0x40507220, 0x40507221, 0x40509420, 0x40509421, 0x4050A220, - 0x4050A221, 0x4050B020, 0x4050B021, 0x4050BE20, 0x4050CC20, 0x4050CC21, - 0x4050DA20, 0x4050DA21, 0x4050E820, 0x4050F620, 0x40507820, 0x40507C20, - 0x404F0E20, 0x40507420, 0x404E1420, 0x404F1020, 0x404F1021, 0x404EDE20, - 0x404F4A20, 0x404F1220, 0x404F1221, 0x404F2020, - // Block 53, offset 0xd40 - 0x404F2021, 0x404F2E20, 0x404F2E21, 0x404F3C20, 0x404F3C21, 0x404F4A21, - 0x404F5820, 0x404F5821, 0x404F6620, 0x404F6621, 0x404F7420, 0x404F7421, - 0x404F8220, 0x404F9020, 0x404F9021, 0x404F9E20, 0x404F9E21, 0x404FAC20, - 0x404FAC21, 0x404FBA20, 0x404FBA21, 0x404FC820, 0x404FC821, 0x404FD620, - 0x404FD621, 0x404FE420, 0x404FE421, 0x404FF220, 0x404FF221, 0x40500020, - 0x40500021, 0x40500E20, 0x40500E21, 0x40501C20, 0x40501C21, 0x40502A20, - 0x40502A21, 0x40503820, 0x40503821, 0x40504620, 0x40504621, 0x40505420, - 0x40505421, 0x40506220, 0x40506221, 0x40507020, 0x40507021, 0x40509220, - 0x40509221, 0x4050A020, 0x4050A021, 0x4050AE20, 0x4050AE21, 0x4050BC20, - 0x4050CA20, 0x4050CA21, 0x4050D820, 0x4050D821, 0x4050E620, 0x4050F420, - 0x404EDE21, 0x404F4A22, 0x404F1222, 0x404F1223, - // Block 54, offset 0xd80 - 0x404F2022, 0x404F2023, 0x404F2E22, 0x404F2E23, 0x404F3C22, 0x404F3C23, - 0x404F4A23, 0x404F5822, 0x404F5823, 0x404F6622, 0x404F6623, 0x404F7422, - 0x404F7423, 0x404F8221, 0x404F9022, 0x404F9023, 0x404F9E22, 0x404F9E23, - 0x404FAC22, 0x404FAC23, 0x404FBA22, 0x404FBA23, 0x404FC822, 0x404FC823, - 0x404FD622, 0x404FD623, 0x404FE422, 0x404FE423, 0x404FF222, 0x404FF223, - 0x40500022, 0x40500023, 0x40500E22, 0x40500E23, 0x40501C22, 0x40501C23, - 0x40502A22, 0x40502A23, 0x40503822, 0x40503823, 0x40504622, 0x40504623, - 0x40505422, 0x40505423, 0x40506222, 0x40506223, 0x40507022, 0x40507023, - 0x40509222, 0x40509223, 0x4050A022, 0x4050A023, 0x4050AE22, 0x4050AE23, - 0x4050BC21, 0x4050CA22, 0x4050CA23, 0x4050D822, 0x4050D823, 0x4050E621, - 0x4050F421, 0x404EEE20, 0x404F4E20, 0x40508220, - // Block 55, offset 0xdc0 - 0x40508620, 0x404F1620, 0x404F1621, 0x404F2420, 0x404F2421, 0x404F3220, - 0x404F3221, 0x404F4020, 0x404F4021, 0x404F4E21, 0x404F5C20, 0x404F5C21, - 0x404F6A20, 0x404F6A21, 0x404F7820, 0x404F7821, 0x404F8620, 0x404F9420, - 0x404F9421, 0x404FA220, 0x404FA221, 0x404FB020, 0x404FB021, 0x404FBE20, - 0x404FBE21, 0x404FCC20, 0x404FCC21, 0x404FDA20, 0x404FDA21, 0x404FE820, - 0x404FE821, 0x404FF620, 0x404FF621, 0x40500420, 0x40500421, 0x40501220, - 0x40501221, 0x40502020, 0x40502021, 0x40502E20, 0x40502E21, 0x40503C20, - 0x40503C21, 0x40504A20, 0x40504A21, 0x40505820, 0x40505821, 0x40506620, - 0x40506621, 0x40507E20, 0x40507E21, 0x40509620, 0x40509621, 0x4050A420, - 0x4050A421, 0x4050B220, 0x4050B221, 0x4050C020, 0x4050CE20, 0x4050CE21, - 0x4050DC20, 0x4050DC21, 0x4050EA20, 0x4050F820, - // Block 56, offset 0xe00 - 0x40508420, 0x40508820, 0x40508020, 0x404E1820, 0x404F1E20, 0x404F1E21, - 0x404E1C20, 0x404F2C20, 0x404F2C21, 0x404F2E20, 0x404F3220, 0x404E2220, - 0x404F3A20, 0x404F3A21, 0x404E2420, 0x404F4820, 0x404F4821, 0x404E2820, - 0x404F5620, 0x404F5621, 0x404E2E20, 0x404F6420, 0x404F6421, 0x404E3220, - 0x404F7220, 0x404F7221, 0x404E3A20, 0x404F8020, 0x404E4220, 0x404F8E20, - 0x404F8E21, 0x404E4820, 0x404F9C20, 0x404F9C21, 0x404E4A20, 0x404FAA20, - 0x404FAA21, 0x404E4E20, 0x404FB820, 0x404FB821, 0x404E5220, 0x404FC620, - 0x404FC621, 0x404E5620, 0x404FD420, 0x404FD421, 0x404E5A20, 0x404FE220, - 0x404FE221, 0x404E5E20, 0x404FF020, 0x404FF021, 0x404E6220, 0x40500C20, - 0x40500C21, 0x404E6620, 0x40501A20, 0x40501A21, 0x404E7220, 0x40503620, - 0x40503621, 0x404E7420, 0x40504420, 0x40504421, - // Block 57, offset 0xe40 - 0x404E7E20, 0x40505220, 0x40505221, 0x404E8220, 0x40506020, 0x40506021, - 0x404E8420, 0x40506E20, 0x40506E21, 0x404E8820, 0x40509020, 0x40509021, - 0x404E8C20, 0x40509E20, 0x40509E21, 0x404E9820, 0x4050BA20, 0x404EAA20, - 0x4050D620, 0x4050D621, 0x404EB620, 0x4050E420, 0x404EC220, 0x4050F220, - 0x40510420, 0x40511A20, 0x40511020, 0x40511420, 0x40510620, 0x40511C20, - 0x40511220, 0x40511620, 0x40510A20, 0x40511820, 0x402BDE20, 0x40320C21, - 0x40321020, 0x40321021, 0x002BDE88, 0x00320CA3, 0x00321083, 0x003210A4, - 0x003210A3, 0x402C9820, 0x402C9A20, 0x002C9888, 0x002C9A83, 0x402C3A20, - 0x40312C20, 0x002C3A88, 0x00312C84, 0x00312C83, 0x402C6220, 0x40312E20, - 0x002C6288, 0x00312E84, 0x00312E83, 0x402DFE20, 0x40313020, 0x002DFE88, - 0x00313084, 0x00313083, 0x402E9E20, 0x40313220, - // Block 58, offset 0xe80 - 0x002E9E88, 0x00313284, 0x00313283, 0x402F2C20, 0x40313420, 0x002F2C88, - 0x00313484, 0x00313483, 0x402FE620, 0x40313620, 0x002FE688, 0x00313683, - 0x40421220, 0x40425A20, 0x402BDE20, 0x402BE020, 0x002BDE88, 0x002BE083, - 0x40312A20, 0x40312C20, 0x40312E20, 0x00312A88, 0x00312C83, 0x00312E83, - 0x40393820, 0x40393620, 0x40393821, 0x40393824, 0x40397220, 0x40396621, - 0x403A6821, 0x003A6883, 0x403A6820, 0x003A6884, 0x403A7420, 0x403A7421, - 0x403A9220, 0x403A9226, 0x403A9221, 0x003A9343, 0x403A9223, 0x003A9344, - 0x402BDE20, 0x402BE220, 0x402BE020, 0x002BDE88, 0x002BE283, 0x002BE083, - 0x402FE620, 0x402FE820, 0x402FE820, 0x002FE688, 0x002FE883, 0x002FE883, - 0x40302C20, 0x40302E20, 0x40302E20, 0x00302C88, 0x00302E83, 0x00302E83, - 0x402BDE20, 0x402C0820, 0x40320E21, 0x40320C21, - // Block 59, offset 0xec0 - 0x40320E20, 0x40320C20, 0x002BDE88, 0x002C0883, 0x00320EA3, 0x00320CA3, - 0x00320E83, 0x00320C83, 0x402C3A20, 0x402C5C20, 0x002C3A88, 0x002C5C83, - 0x402C5E20, 0x402C6020, 0x002C5E83, 0x002C6083, 0x402D2220, 0x402D6420, - 0x002D2288, 0x002D6483, 0x402E9E20, 0x402EE021, 0x402EE022, 0x002E9E88, - 0x002EE0A3, 0x002EE0C3, 0x40312A20, 0x40320620, 0x00312A88, 0x00320683, - 0x402EE220, 0x40321023, 0x40321022, 0x40321020, 0x40321021, 0x40321024, - 0x002EE288, 0x003210E3, 0x003210C3, 0x00321083, 0x003210A3, 0x00321103, - 0x402C6220, 0x402C9620, 0x002C6288, 0x002C9684, 0x002C9683, 0x002D2288, - 0x002D6684, 0x002D6683, 0x402E2220, 0xE0000CFB, 0xE0000CFB, 0x402E8020, - 0x002E2288, 0xE0000D01, 0xE0000D01, 0x002E8084, 0x002E8083, 0x002E9E88, - 0x002EE084, 0x002EE083, 0x002F7A88, 0x002FE484, - // Block 60, offset 0xf00 - 0x002FE483, 0x002FE688, 0x00302A84, 0x00302A83, 0x40302C20, 0x40306A20, - 0x00302C88, 0x00306A84, 0x00306A83, 0x4030F620, 0x4030FE20, 0x0030F688, - 0x0030FE84, 0x0030FE83, 0x00312A88, 0x00316284, 0x00316283, 0x402C9820, - 0x40320E22, 0x002C9888, 0x00320EC3, 0x402EE220, 0x40321024, 0x40321020, - 0x40321022, 0x002EE288, 0x00321103, 0x00321083, 0x003210C3, 0x40429820, - 0x4042C220, 0x4042C420, 0x40429620, 0x40429A20, 0x40429820, 0x40429C20, - 0x40429A20, 0x40429E20, 0x40429C20, 0x4042A020, 0x40429E20, 0x4042A220, - 0x4042A020, 0x4042A420, 0x4042A220, 0x4042A620, 0x4042A420, 0x4042A820, - 0x4042A620, 0x4042AA20, 0x4042A820, 0x4042AC20, 0x4042AA20, 0x4042AE20, - 0x4042AC20, 0x4042B020, 0x4042AE20, 0x4042B220, 0x4042B020, 0x4042B420, - 0x4042B220, 0x4042B620, 0x4042B420, 0x4042B820, - // Block 61, offset 0xf40 - 0x4042B620, 0x4042BA20, 0x4042B820, 0x4042BC20, 0x4042BA20, 0x4042BE20, - 0x4042BC20, 0x4042C020, 0x4042BE20, 0x4042C220, 0x4042C020, 0x4042C420, - 0x4042C220, 0x40496C20, 0xE000AE0D, 0xE000AE10, 0x402BDE20, 0x402BDE21, - 0x402BDE22, 0x002BDE88, 0x002BDEA3, 0x002BDEC3, 0x402C9820, 0x402C9821, - 0x402C9822, 0x002C9888, 0x002C98A3, 0x002C98C3, 0x402D9A20, 0x402D9A21, - 0x402D9A22, 0x002D9A88, 0x002D9AA3, 0x002D9AC3, 0x402EE220, 0x402EE221, - 0x402EE222, 0x002EE288, 0x002EE2A3, 0x002EE2C3, 0x40306C20, 0x40306C21, - 0x40306C22, 0x00306C88, 0x00306CA3, 0x00306CC3, 0x40393820, 0x40393A20, - 0x40393821, 0x40392820, 0x40393C20, 0x40393E20, 0x40394020, 0x40394220, - 0x40394420, 0x40394620, 0x40394820, 0x40394A20, 0x40394E20, 0x40395020, - 0x40395220, 0x40395420, 0x40395A20, 0x40395C20, - // Block 62, offset 0xf80 - 0x40395E20, 0x40396020, 0x40396420, 0x40396620, 0x40396820, 0x40396A20, - 0x40398420, 0x40398620, 0x40398820, 0x40398A20, 0x40398C20, 0x40398E20, - 0x40399020, 0x40399220, 0x40399420, 0x40399620, 0x40399820, 0x40399A20, - 0x40399C20, 0x40399C21, 0x40399E20, 0x4039A020, 0x4039A021, 0x403A9020, - 0x4039A821, 0x4039A820, 0x4039AA20, 0x4039AC20, 0x4039AC21, 0x402EE220, - 0x402EE420, 0x402EE620, 0x002EE288, 0x002EE483, 0x002EE683, 0x402BDE20, - 0xE0000966, 0xE000B3B3, 0xE0000958, 0xE0000966, 0x402C3A20, 0xE0000A41, - 0x402C9820, 0xE000B3B6, 0x402D9A20, 0xE000B3B9, 0x402EE220, 0xE0000DE3, - 0xE000B3BC, 0xE0000DCF, 0xE0000DE3, 0x402FE620, 0xE0000F30, 0x40306C20, - 0xE0001028, 0xE000B3BF, 0xE0000FFC, 0xE0001028, 0x402BDE20, 0x402BDE1F, - 0x402BDE1D, 0x402BDE1C, 0x402BDE1E, 0x002BDE88, - // Block 63, offset 0xfc0 - 0x002BDE63, 0x002BDE23, 0x002BDE03, 0x002BDE43, 0x402C9820, 0x402C9824, - 0x402C9822, 0x402C9821, 0x402C9823, 0x402C981F, 0x402C981D, 0x402C981C, - 0x402C981E, 0x002C9888, 0x002C9903, 0x002C98C3, 0x002C98A3, 0x002C98E3, - 0x002C9863, 0x002C9823, 0x002C9803, 0x002C9843, 0xE0000AF1, 0x402C9821, - 0x402C9823, 0xE0000AF4, 0x002C98A3, 0x002C98E3, 0x402D9A20, 0x402D9A1F, - 0x402D9A1D, 0x402D9A1C, 0x402D9A1E, 0x002D9A88, 0x002D9A63, 0x002D9A23, - 0x002D9A03, 0x002D9A43, 0x402E8220, 0x402E821F, 0x402E821D, 0x402E821C, - 0x402E821E, 0x002E8288, 0x002E8263, 0x002E8223, 0x002E8203, 0x002E8243, - 0x402E9E20, 0x402E9E1F, 0x402E9E1D, 0x402E9E1C, 0x402E9E1E, 0x002E9E88, - 0x002E9E63, 0x002E9E23, 0x002E9E03, 0x002E9E43, 0x402EE220, 0x402EE21F, - 0x402EE21D, 0x402EE21C, 0x402EE21E, 0x002EE288, - // Block 64, offset 0x1000 - 0x002EE263, 0x002EE223, 0x002EE203, 0x002EE243, 0x40306C20, 0x40306C24, - 0x40306C22, 0x40306C21, 0x40306C23, 0x40306C1F, 0x40306C1D, 0x40306C1C, - 0x40306C25, 0x40306C1E, 0x00306C88, 0x00306D03, 0x00306CC3, 0x00306CA3, - 0x00306CE3, 0x00306C63, 0x00306C23, 0x00306C03, 0x00306D23, 0x00306C43, -} - -// mainValues: 251456 entries, 1005824 bytes -// Block 2 is the null block. -var mainValues = [251456]uint32{ - // Block 0x0, offset 0x0 - 0x0000: 0xa0000000, 0x0001: 0xa0000000, 0x0002: 0xa0000000, 0x0003: 0xa0000000, - 0x0004: 0xa0000000, 0x0005: 0xa0000000, 0x0006: 0xa0000000, 0x0007: 0xa0000000, - 0x0008: 0xa0000000, 0x0009: 0x40020020, 0x000a: 0x40020220, 0x000b: 0x40020420, - 0x000c: 0x40020620, 0x000d: 0x40020820, 0x000e: 0xa0000000, 0x000f: 0xa0000000, - 0x0010: 0xa0000000, 0x0011: 0xa0000000, 0x0012: 0xa0000000, 0x0013: 0xa0000000, - 0x0014: 0xa0000000, 0x0015: 0xa0000000, 0x0016: 0xa0000000, 0x0017: 0xa0000000, - 0x0018: 0xa0000000, 0x0019: 0xa0000000, 0x001a: 0xa0000000, 0x001b: 0xa0000000, - 0x001c: 0xa0000000, 0x001d: 0xa0000000, 0x001e: 0xa0000000, 0x001f: 0xa0000000, - 0x0020: 0x40021220, 0x0021: 0x4002ba20, 0x0022: 0x4003e020, 0x0023: 0x4004ea20, - 0x0024: 0x4027de20, 0x0025: 0x4004ec20, 0x0026: 0x4004e620, 0x0027: 0x4003d220, - 0x0028: 0x4003f420, 0x0029: 0x4003f620, 0x002a: 0x4004d820, 0x002b: 0x40093820, - 0x002c: 0x40024020, 0x002d: 0x40021a20, 0x002e: 0x4002e420, 0x002f: 0x4004e220, - 0x0030: 0x4029cc20, 0x0031: 0x4029ce20, 0x0032: 0x4029d020, 0x0033: 0x4029d220, - 0x0034: 0x4029d420, 0x0035: 0x4029d620, 0x0036: 0x4029d820, 0x0037: 0x4029da20, - 0x0038: 0x4029dc20, 0x0039: 0x4029de20, 0x003a: 0x40026c20, 0x003b: 0x40026220, - 0x003c: 0x40094020, 0x003d: 0x40094220, 0x003e: 0x40094420, 0x003f: 0x4002c420, - // Block 0x1, offset 0x40 - 0x0040: 0x4004d620, 0x0041: 0x002bde88, 0x0042: 0x002c0a88, 0x0043: 0x002c3a88, - 0x0044: 0x002c6288, 0x0045: 0x002c9888, 0x0046: 0x002d0888, 0x0047: 0x002d2288, - 0x0048: 0x002d6888, 0x0049: 0x002d9a88, 0x004a: 0x002dcc88, 0x004b: 0x002dfe88, - 0x004c: 0xc0030002, 0x004d: 0x002e8288, 0x004e: 0x002e9e88, 0x004f: 0x002ee288, - 0x0050: 0x002f2c88, 0x0051: 0x002f5688, 0x0052: 0x002f7a88, 0x0053: 0x002fe688, - 0x0054: 0x00302c88, 0x0055: 0x00306c88, 0x0056: 0x0030be88, 0x0057: 0x0030e288, - 0x0058: 0x0030f688, 0x0059: 0x00310088, 0x005a: 0x00312a88, 0x005b: 0x4003f820, - 0x005c: 0x4004e420, 0x005d: 0x4003fa20, 0x005e: 0x40062420, 0x005f: 0x40021620, - 0x0060: 0x40061e20, 0x0061: 0x402bde20, 0x0062: 0x402c0a20, 0x0063: 0x402c3a20, - 0x0064: 0x402c6220, 0x0065: 0x402c9820, 0x0066: 0x402d0820, 0x0067: 0x402d2220, - 0x0068: 0x402d6820, 0x0069: 0x402d9a20, 0x006a: 0x402dcc20, 0x006b: 0x402dfe20, - 0x006c: 0xc0000002, 0x006d: 0x402e8220, 0x006e: 0x402e9e20, 0x006f: 0x402ee220, - 0x0070: 0x402f2c20, 0x0071: 0x402f5620, 0x0072: 0x402f7a20, 0x0073: 0x402fe620, - 0x0074: 0x40302c20, 0x0075: 0x40306c20, 0x0076: 0x4030be20, 0x0077: 0x4030e220, - 0x0078: 0x4030f620, 0x0079: 0x40310020, 0x007a: 0x40312a20, 0x007b: 0x4003fc20, - 0x007c: 0x40094820, 0x007d: 0x4003fe20, 0x007e: 0x40094c20, 0x007f: 0xa0000000, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0x00c0: 0xa0000000, 0x00c1: 0xa0000000, 0x00c2: 0xa0000000, 0x00c3: 0xa0000000, - 0x00c4: 0xa0000000, 0x00c5: 0x40020a20, 0x00c6: 0xa0000000, 0x00c7: 0xa0000000, - 0x00c8: 0xa0000000, 0x00c9: 0xa0000000, 0x00ca: 0xa0000000, 0x00cb: 0xa0000000, - 0x00cc: 0xa0000000, 0x00cd: 0xa0000000, 0x00ce: 0xa0000000, 0x00cf: 0xa0000000, - 0x00d0: 0xa0000000, 0x00d1: 0xa0000000, 0x00d2: 0xa0000000, 0x00d3: 0xa0000000, - 0x00d4: 0xa0000000, 0x00d5: 0xa0000000, 0x00d6: 0xa0000000, 0x00d7: 0xa0000000, - 0x00d8: 0xa0000000, 0x00d9: 0xa0000000, 0x00da: 0xa0000000, 0x00db: 0xa0000000, - 0x00dc: 0xa0000000, 0x00dd: 0xa0000000, 0x00de: 0xa0000000, 0x00df: 0xa0000000, - 0x00e0: 0x0002129b, 0x00e1: 0x4002bc20, 0x00e2: 0x4027dc20, 0x00e3: 0x4027e020, - 0x00e4: 0x4027da20, 0x00e5: 0x4027e220, 0x00e6: 0x40094a20, 0x00e7: 0x4004ce20, - 0x00e8: 0x40062c20, 0x00e9: 0x40081820, 0x00ea: 0x002bde94, 0x00eb: 0x4003f020, - 0x00ec: 0x40094620, 0x00ed: 0xa0000000, 0x00ee: 0x40081a20, 0x00ef: 0x40062620, - 0x00f0: 0x40070420, 0x00f1: 0x40093a20, 0x00f2: 0x0029d094, 0x00f3: 0x0029d294, - 0x00f4: 0x40062020, 0x00f5: 0x00327684, 0x00f6: 0x4004d220, 0x00f7: 0x40030620, - 0x00f8: 0x40063220, 0x00f9: 0x0029ce94, 0x00fa: 0x002ee294, 0x00fb: 0x4003f220, - 0x00fc: 0xe00002bf, 0x00fd: 0xe00002b7, 0x00fe: 0xe00004a7, 0x00ff: 0x4002c620, - // Block 0x4, offset 0x100 - 0x0100: 0xe00008f5, 0x0101: 0xe00008ef, 0x0102: 0xe0000921, 0x0103: 0xe0000969, - 0x0104: 0xe000095b, 0x0105: 0xe000094d, 0x0106: 0xe00009dd, 0x0107: 0xe0000a53, - 0x0108: 0xe0000ae8, 0x0109: 0xe0000ae2, 0x010a: 0xe0000af4, 0x010b: 0xe0000b20, - 0x010c: 0xe0000c2b, 0x010d: 0xe0000c25, 0x010e: 0xe0000c37, 0x010f: 0xe0000c43, - 0x0110: 0xe0000ab3, 0x0111: 0xe0000d63, 0x0112: 0xe0000d9a, 0x0113: 0xe0000d94, - 0x0114: 0xe0000da6, 0x0115: 0xe0000de6, 0x0116: 0xe0000dd2, 0x0117: 0x40093e20, - 0x0118: 0xe0000e12, 0x0119: 0xe0000fe1, 0x011a: 0xe0000fdb, 0x011b: 0xe0000fed, - 0x011c: 0xe0000fff, 0x011d: 0xe0001102, 0x011e: 0x00318888, 0x011f: 0xe0000f7b, - 0x0120: 0xe00008f2, 0x0121: 0xe00008ec, 0x0122: 0xe000091e, 0x0123: 0xe0000966, - 0x0124: 0xe0000958, 0x0125: 0xe000094a, 0x0126: 0xe00009d5, 0x0127: 0xe0000a4d, - 0x0128: 0xe0000ae5, 0x0129: 0xe0000adf, 0x012a: 0xe0000af1, 0x012b: 0xe0000b1d, - 0x012c: 0xe0000c28, 0x012d: 0xe0000c22, 0x012e: 0xe0000c34, 0x012f: 0xe0000c40, - 0x0130: 0xe0000aad, 0x0131: 0xe0000d60, 0x0132: 0xe0000d97, 0x0133: 0xe0000d91, - 0x0134: 0xe0000da3, 0x0135: 0xe0000de3, 0x0136: 0xe0000dcf, 0x0137: 0x40093c20, - 0x0138: 0xe0000e0f, 0x0139: 0xe0000fde, 0x013a: 0xe0000fd8, 0x013b: 0xe0000fea, - 0x013c: 0xe0000ffc, 0x013d: 0xe00010ff, 0x013e: 0x40318820, 0x013f: 0xe0001114, - // Block 0x5, offset 0x140 - 0x0140: 0xe0000983, 0x0141: 0xe0000980, 0x0142: 0xe00008fb, 0x0143: 0xe00008f8, - 0x0144: 0xe000097d, 0x0145: 0xe000097a, 0x0146: 0xe0000a38, 0x0147: 0xe0000a35, - 0x0148: 0xe0000a3e, 0x0149: 0xe0000a3b, 0x014a: 0xe0000a4a, 0x014b: 0xe0000a47, - 0x014c: 0xe0000a44, 0x014d: 0xe0000a41, 0x014e: 0xe0000a86, 0x014f: 0xe0000a83, - 0x0150: 0xe0000aaa, 0x0151: 0xe0000aa7, 0x0152: 0xe0000b46, 0x0153: 0xe0000b43, - 0x0154: 0xe0000aee, 0x0155: 0xe0000aeb, 0x0156: 0xe0000b2c, 0x0157: 0xe0000b29, - 0x0158: 0xe0000b40, 0x0159: 0xe0000b3d, 0x015a: 0xe0000b1a, 0x015b: 0xe0000b17, - 0x015c: 0xe0000bb8, 0x015d: 0xe0000bb5, 0x015e: 0xe0000bb2, 0x015f: 0xe0000baf, - 0x0160: 0xe0000bc4, 0x0161: 0xe0000bc1, 0x0162: 0xe0000bca, 0x0163: 0xe0000bc7, - 0x0164: 0xe0000bee, 0x0165: 0xe0000beb, 0x0166: 0xe0000c1b, 0x0167: 0xe0000c18, - 0x0168: 0xe0000c51, 0x0169: 0xe0000c4e, 0x016a: 0xe0000c60, 0x016b: 0xe0000c5d, - 0x016c: 0xe0000c31, 0x016d: 0xe0000c2e, 0x016e: 0xe0000c5a, 0x016f: 0xe0000c57, - 0x0170: 0xe0000c54, 0x0171: 0x402da220, 0x0172: 0xf0000a0a, 0x0173: 0xf0000404, - 0x0174: 0xe0000c8a, 0x0175: 0xe0000c87, 0x0176: 0xe0000c9f, 0x0177: 0xe0000c9c, - 0x0178: 0x402f7220, 0x0179: 0xe0000ccc, 0x017a: 0xe0000cc9, 0x017b: 0xe0000cd8, - 0x017c: 0xe0000cd5, 0x017d: 0xe0000cd2, 0x017e: 0xe0000ccf, 0x017f: 0xe0000d04, - // Block 0x6, offset 0x180 - 0x0180: 0xe0000cfe, 0x0181: 0xe0000cf8, 0x0182: 0xe0000cf5, 0x0183: 0xe0000d51, - 0x0184: 0xe0000d4e, 0x0185: 0xe0000d6f, 0x0186: 0xe0000d6c, 0x0187: 0xe0000d5d, - 0x0188: 0xe0000d5a, 0x0189: 0xf0000404, 0x018a: 0x002eda88, 0x018b: 0x402eda20, - 0x018c: 0xe0000e2e, 0x018d: 0xe0000e2b, 0x018e: 0xe0000da0, 0x018f: 0xe0000d9d, - 0x0190: 0xe0000de0, 0x0191: 0xe0000ddd, 0x0192: 0xe0000e93, 0x0193: 0xe0000e8f, - 0x0194: 0xe0000eca, 0x0195: 0xe0000ec7, 0x0196: 0xe0000edc, 0x0197: 0xe0000ed9, - 0x0198: 0xe0000ed0, 0x0199: 0xe0000ecd, 0x019a: 0xe0000f1f, 0x019b: 0xe0000f1c, - 0x019c: 0xe0000f2d, 0x019d: 0xe0000f2a, 0x019e: 0xe0000f47, 0x019f: 0xe0000f44, - 0x01a0: 0xe0000f33, 0x01a1: 0xe0000f30, 0x01a2: 0xe0000f99, 0x01a3: 0xe0000f96, - 0x01a4: 0xe0000f8a, 0x01a5: 0xe0000f87, 0x01a6: 0x00303688, 0x01a7: 0x40303620, - 0x01a8: 0xe000102b, 0x01a9: 0xe0001028, 0x01aa: 0xe000103f, 0x01ab: 0xe000103c, - 0x01ac: 0xe0000fe7, 0x01ad: 0xe0000fe4, 0x01ae: 0xe0000ff9, 0x01af: 0xe0000ff6, - 0x01b0: 0xe0001025, 0x01b1: 0xe0001022, 0x01b2: 0xe0001039, 0x01b3: 0xe0001036, - 0x01b4: 0xe00010d8, 0x01b5: 0xe00010d5, 0x01b6: 0xe000110e, 0x01b7: 0xe000110b, - 0x01b8: 0xe0001117, 0x01b9: 0xe000113b, 0x01ba: 0xe0001138, 0x01bb: 0xe000114d, - 0x01bc: 0xe000114a, 0x01bd: 0xe0001147, 0x01be: 0xe0001144, 0x01bf: 0xe0000f64, - // Block 0x7, offset 0x1c0 - 0x01c0: 0x402c1a20, 0x01c1: 0x002c2a88, 0x01c2: 0x002c3288, 0x01c3: 0x402c3220, - 0x01c4: 0x0031c488, 0x01c5: 0x4031c420, 0x01c6: 0x002efa88, 0x01c7: 0x002c4e88, - 0x01c8: 0x402c4e20, 0x01c9: 0x002c7288, 0x01ca: 0x002c7a88, 0x01cb: 0x002c8488, - 0x01cc: 0x402c8420, 0x01cd: 0xe000115c, 0x01ce: 0x002cae88, 0x01cf: 0x002cb888, - 0x01d0: 0x002cc288, 0x01d1: 0x002d1688, 0x01d2: 0x402d1620, 0x01d3: 0x002d4488, - 0x01d4: 0x002d5888, 0x01d5: 0x402d7820, 0x01d6: 0x002dc288, 0x01d7: 0x002db688, - 0x01d8: 0x002e0a88, 0x01d9: 0x402e0a20, 0x01da: 0x402e3820, 0x01db: 0x402e7220, - 0x01dc: 0x0030a088, 0x01dd: 0x002eb488, 0x01de: 0x402ebc20, 0x01df: 0x002f1088, - 0x01e0: 0xe0000e56, 0x01e1: 0xe0000e53, 0x01e2: 0x002d6088, 0x01e3: 0x402d6020, - 0x01e4: 0x002f3e88, 0x01e5: 0x402f3e20, 0x01e6: 0x002f8288, 0x01e7: 0x0031b488, - 0x01e8: 0x4031b420, 0x01e9: 0x00300888, 0x01ea: 0x40301220, 0x01eb: 0x40304220, - 0x01ec: 0x00304a88, 0x01ed: 0x40304a20, 0x01ee: 0x00305288, 0x01ef: 0xe000105f, - 0x01f0: 0xe000105c, 0x01f1: 0x0030b488, 0x01f2: 0x0030cc88, 0x01f3: 0x00311888, - 0x01f4: 0x40311820, 0x01f5: 0x00313488, 0x01f6: 0x40313420, 0x01f7: 0x00316488, - 0x01f8: 0x00316e88, 0x01f9: 0x40316e20, 0x01fa: 0x40317820, 0x01fb: 0x4031a620, - 0x01fc: 0x0031bc88, 0x01fd: 0x4031bc20, 0x01fe: 0xe0000fc9, 0x01ff: 0x40319420, - // Block 0x8, offset 0x200 - 0x0200: 0x40321220, 0x0201: 0x40321a20, 0x0202: 0x40322220, 0x0203: 0x40322a20, - 0x0204: 0xe0000ad5, 0x0205: 0xe0000ad1, 0x0206: 0xe0000acd, 0x0207: 0xf0000a0a, - 0x0208: 0xf000040a, 0x0209: 0xf0000404, 0x020a: 0xf0000a0a, 0x020b: 0xf000040a, - 0x020c: 0xf0000404, 0x020d: 0xe0000947, 0x020e: 0xe0000944, 0x020f: 0xe0000c3d, - 0x0210: 0xe0000c3a, 0x0211: 0xe0000dcc, 0x0212: 0xe0000dc9, 0x0213: 0xe0000ff3, - 0x0214: 0xe0000ff0, 0x0215: 0xe000101e, 0x0216: 0xe000101a, 0x0217: 0xe0001006, - 0x0218: 0xe0001002, 0x0219: 0xe0001016, 0x021a: 0xe0001012, 0x021b: 0xe000100e, - 0x021c: 0xe000100a, 0x021d: 0x402cae20, 0x021e: 0xe0000962, 0x021f: 0xe000095e, - 0x0220: 0xe0000976, 0x0221: 0xe0000972, 0x0222: 0xe00009f4, 0x0223: 0xe00009ef, - 0x0224: 0x002d3a88, 0x0225: 0x402d3a20, 0x0226: 0xe0000bbe, 0x0227: 0xe0000bbb, - 0x0228: 0xe0000c99, 0x0229: 0xe0000c96, 0x022a: 0xe0000e20, 0x022b: 0xe0000e1d, - 0x022c: 0xe0000e27, 0x022d: 0xe0000e23, 0x022e: 0xe0001162, 0x022f: 0xe000115f, - 0x0230: 0xe0000c8d, 0x0231: 0xf0000a0a, 0x0232: 0xf000040a, 0x0233: 0xf0000404, - 0x0234: 0xe0000bac, 0x0235: 0xe0000ba9, 0x0236: 0x002d7888, 0x0237: 0x00319488, - 0x0238: 0xe0000d57, 0x0239: 0xe0000d54, 0x023a: 0xe0000954, 0x023b: 0xe0000950, - 0x023c: 0xe00009ea, 0x023d: 0xe00009e5, 0x023e: 0xe0000e19, 0x023f: 0xe0000e15, - // Block 0x9, offset 0x240 - 0x0240: 0xe000098f, 0x0241: 0xe000098c, 0x0242: 0xe0000995, 0x0243: 0xe0000992, - 0x0244: 0xe0000b62, 0x0245: 0xe0000b5f, 0x0246: 0xe0000b68, 0x0247: 0xe0000b65, - 0x0248: 0xe0000c6c, 0x0249: 0xe0000c69, 0x024a: 0xe0000c72, 0x024b: 0xe0000c6f, - 0x024c: 0xe0000e4a, 0x024d: 0xe0000e47, 0x024e: 0xe0000e50, 0x024f: 0xe0000e4d, - 0x0250: 0xe0000ee8, 0x0251: 0xe0000ee5, 0x0252: 0xe0000eee, 0x0253: 0xe0000eeb, - 0x0254: 0xe0001053, 0x0255: 0xe0001050, 0x0256: 0xe0001059, 0x0257: 0xe0001056, - 0x0258: 0xe0000f61, 0x0259: 0xe0000f5e, 0x025a: 0xe0000fa5, 0x025b: 0xe0000fa2, - 0x025c: 0x00312288, 0x025d: 0x40312220, 0x025e: 0xe0000bf4, 0x025f: 0xe0000bf1, - 0x0260: 0x002ebc88, 0x0261: 0x402c8c20, 0x0262: 0x002f2288, 0x0263: 0x402f2220, - 0x0264: 0x00314088, 0x0265: 0x40314020, 0x0266: 0xe000096f, 0x0267: 0xe000096c, - 0x0268: 0xe0000b32, 0x0269: 0xe0000b2f, 0x026a: 0xe0000dd9, 0x026b: 0xe0000dd5, - 0x026c: 0xe0000dfd, 0x026d: 0xe0000df9, 0x026e: 0xe0000e04, 0x026f: 0xe0000e01, - 0x0270: 0xe0000e0b, 0x0271: 0xe0000e07, 0x0272: 0xe0001129, 0x0273: 0xe0001126, - 0x0274: 0x402e5e20, 0x0275: 0x402ed020, 0x0276: 0x40305a20, 0x0277: 0x402dd420, - 0x0278: 0xe0000abf, 0x0279: 0xe0000ec4, 0x027a: 0x002be888, 0x027b: 0x002c4488, - 0x027c: 0x402c4420, 0x027d: 0x002e3888, 0x027e: 0x00303e88, 0x027f: 0x402ffc20, - // Block 0xa, offset 0x280 - 0x0280: 0x40315820, 0x0281: 0x0031d488, 0x0282: 0x4031d420, 0x0283: 0x002c1a88, - 0x0284: 0x00307c88, 0x0285: 0x0030da88, 0x0286: 0x002ca288, 0x0287: 0x402ca220, - 0x0288: 0x002dde88, 0x0289: 0x402dde20, 0x028a: 0x002f6a88, 0x028b: 0x402f6a20, - 0x028c: 0x002f8e88, 0x028d: 0x402f8e20, 0x028e: 0x00311088, 0x028f: 0x40311020, - 0x0290: 0x402bf020, 0x0291: 0x402bf820, 0x0292: 0x402c0220, 0x0293: 0x402c2a20, - 0x0294: 0x402efa20, 0x0295: 0x402c5620, 0x0296: 0x402c7220, 0x0297: 0x402c7a20, - 0x0298: 0x402ccc20, 0x0299: 0x402cb820, 0x029a: 0x402cd420, 0x029b: 0x402cc220, - 0x029c: 0x402cdc20, 0x029d: 0x402ce820, 0x029e: 0x402cf020, 0x029f: 0x402dee20, - 0x02a0: 0x402d4420, 0x02a1: 0x402d2a20, 0x02a2: 0x402d3220, 0x02a3: 0x402d5820, - 0x02a4: 0x402d0020, 0x02a5: 0x40308820, 0x02a6: 0x402d8020, 0x02a7: 0x402d8e20, - 0x02a8: 0x402db620, 0x02a9: 0x402dc220, 0x02aa: 0x402daa20, 0x02ab: 0x402e4220, - 0x02ac: 0x402e4a20, 0x02ad: 0x402e5420, 0x02ae: 0x402e6820, 0x02af: 0x4030a020, - 0x02b0: 0x4030ac20, 0x02b1: 0x402e9020, 0x02b2: 0x402eb420, 0x02b3: 0x402ec820, - 0x02b4: 0x402ea620, 0x02b5: 0x402f1020, 0x02b6: 0x402eee20, 0x02b7: 0x402f1a20, - 0x02b8: 0x402f4c20, 0x02b9: 0x402f9820, 0x02ba: 0x402fa220, 0x02bb: 0x402fac20, - 0x02bc: 0x402fb620, 0x02bd: 0x402fbe20, 0x02be: 0x402fc620, 0x02bf: 0x402fd020, - // Block 0xb, offset 0x2c0 - 0x02c0: 0x402f8220, 0x02c1: 0x402fd820, 0x02c2: 0x402ff420, 0x02c3: 0x40300820, - 0x02c4: 0x402df620, 0x02c5: 0x40301a20, 0x02c6: 0x40302420, 0x02c7: 0x40306420, - 0x02c8: 0x40305220, 0x02c9: 0x40307c20, 0x02ca: 0x4030b420, 0x02cb: 0x4030cc20, - 0x02cc: 0x4030da20, 0x02cd: 0x4030ee20, 0x02ce: 0x402e7a20, 0x02cf: 0x40310820, - 0x02d0: 0x40314820, 0x02d1: 0x40315020, 0x02d2: 0x40316420, 0x02d3: 0x40318020, - 0x02d4: 0x4031cc20, 0x02d5: 0x4031e820, 0x02d6: 0x40320a20, 0x02d7: 0x40323220, - 0x02d8: 0x40323a20, 0x02d9: 0x402c1220, 0x02da: 0x402cf820, 0x02db: 0x402d4c20, - 0x02dc: 0x402d7020, 0x02dd: 0x402de620, 0x02de: 0x402e1a20, 0x02df: 0x402e2a20, - 0x02e0: 0x402f6220, 0x02e1: 0x4031fa20, 0x02e2: 0x40320220, 0x02e3: 0xe0000aca, - 0x02e4: 0xe0000adc, 0x02e5: 0xe0000ad9, 0x02e6: 0xe0000fcc, 0x02e7: 0xe0000fcf, - 0x02e8: 0xe0000fba, 0x02e9: 0xe0000ba1, 0x02ea: 0xe0000d11, 0x02eb: 0xe0000d18, - 0x02ec: 0x40324220, 0x02ed: 0x40324a20, 0x02ee: 0x40309020, 0x02ef: 0x40309820, - 0x02f0: 0x002d6894, 0x02f1: 0x002d8094, 0x02f2: 0x002dcc94, 0x02f3: 0x002f7a94, - 0x02f4: 0x002f9894, 0x02f5: 0x002fac94, 0x02f6: 0x002fd894, 0x02f7: 0x0030e294, - 0x02f8: 0x00310094, 0x02f9: 0x40064020, 0x02fa: 0x40064420, 0x02fb: 0x402d9620, - 0x02fc: 0x4031de20, 0x02fd: 0x402d9820, 0x02fe: 0x4031e220, 0x02ff: 0x4031f020, - // Block 0xc, offset 0x300 - 0x0300: 0x4031dc20, 0x0301: 0x4031f220, 0x0302: 0x40064620, 0x0303: 0x40064820, - 0x0304: 0x40064a20, 0x0305: 0x40064c20, 0x0306: 0x40064e20, 0x0307: 0x40065020, - 0x0308: 0x40065220, 0x0309: 0x40065420, 0x030a: 0x40065620, 0x030b: 0x40065820, - 0x030c: 0x40065a20, 0x030d: 0x40065c20, 0x030e: 0x40065e20, 0x030f: 0x40066020, - 0x0310: 0x4027b220, 0x0311: 0x4027b420, 0x0312: 0x40066220, 0x0313: 0x40066420, - 0x0314: 0x40066620, 0x0315: 0x40066820, 0x0316: 0x40066a20, 0x0317: 0x40066c20, - 0x0318: 0x40062820, 0x0319: 0x40062a20, 0x031a: 0x40062e20, 0x031b: 0x40063420, - 0x031c: 0x40062220, 0x031d: 0x40063020, 0x031e: 0x40066e20, 0x031f: 0x40067020, - 0x0320: 0x002d5894, 0x0321: 0x002e2294, 0x0322: 0x002fe694, 0x0323: 0x0030f694, - 0x0324: 0x0031e894, 0x0325: 0x40067220, 0x0326: 0x40067420, 0x0327: 0x40067620, - 0x0328: 0x40067820, 0x0329: 0x40067a20, 0x032a: 0x40067c20, 0x032b: 0x40067e20, - 0x032c: 0x40068020, 0x032d: 0x40068220, 0x032e: 0x4031e020, 0x032f: 0x40068420, - 0x0330: 0x40068620, 0x0331: 0x40068820, 0x0332: 0x40068a20, 0x0333: 0x40068c20, - 0x0334: 0x40068e20, 0x0335: 0x40069020, 0x0336: 0x40069220, 0x0337: 0x40069420, - 0x0338: 0x40069620, 0x0339: 0x40069820, 0x033a: 0x40069a20, 0x033b: 0x40069c20, - 0x033c: 0x40069e20, 0x033d: 0x4006a020, 0x033e: 0x4006a220, 0x033f: 0x4006a420, - // Block 0xd, offset 0x340 - 0x0340: 0xae603502, 0x0341: 0xae603202, 0x0342: 0xae603c02, 0x0343: 0xae604e02, - 0x0344: 0xae605b02, 0x0345: 0xae606302, 0x0346: 0xae603702, 0x0347: 0xae605202, - 0x0348: 0xae604702, 0x0349: 0xae606402, 0x034a: 0xae604302, 0x034b: 0xae604d02, - 0x034c: 0xae604102, 0x034d: 0xae605f02, 0x034e: 0xae605f02, 0x034f: 0xae606502, - 0x0350: 0xae606602, 0x0351: 0xae606702, 0x0352: 0xae605f02, 0x0353: 0xae602202, - 0x0354: 0xae602a02, 0x0355: 0xae805f02, 0x0356: 0xadc06002, 0x0357: 0xadc06002, - 0x0358: 0xadc06002, 0x0359: 0xadc06002, 0x035a: 0xae805f02, 0x035b: 0xad806802, - 0x035c: 0xadc06002, 0x035d: 0xadc06002, 0x035e: 0xadc06002, 0x035f: 0xadc06002, - 0x0360: 0xadc06002, 0x0361: 0xaca06e02, 0x0362: 0xaca06f02, 0x0363: 0xadc07002, - 0x0364: 0xadc07502, 0x0365: 0xadc07602, 0x0366: 0xadc07702, 0x0367: 0xaca05602, - 0x0368: 0xaca05902, 0x0369: 0xadc06002, 0x036a: 0xadc06002, 0x036b: 0xadc06002, - 0x036c: 0xadc06002, 0x036d: 0xadc07802, 0x036e: 0xadc07902, 0x036f: 0xadc06002, - 0x0370: 0xadc07a02, 0x0371: 0xadc07b02, 0x0372: 0xadc02102, 0x0373: 0xadc06002, - 0x0374: 0xa0107c02, 0x0375: 0xa0107d02, 0x0376: 0xa0106102, 0x0377: 0xa0106102, - 0x0378: 0xa0105402, 0x0379: 0xadc07e02, 0x037a: 0xadc06002, 0x037b: 0xadc06002, - 0x037c: 0xadc06002, 0x037d: 0xae605f02, 0x037e: 0xae605f02, 0x037f: 0xae605f02, - // Block 0xe, offset 0x380 - 0x0380: 0xae603502, 0x0381: 0xae603202, 0x0382: 0xae604502, 0x0383: 0xae602202, - 0x0384: 0xe0000000, 0x0385: 0xaf007f02, 0x0386: 0xae605f02, 0x0387: 0xadc06002, - 0x0388: 0xadc06002, 0x0389: 0xadc06002, 0x038a: 0xae605f02, 0x038b: 0xae605f02, - 0x038c: 0xae605f02, 0x038d: 0xadc06002, 0x038e: 0xadc06002, 0x038f: 0xa0000000, - 0x0390: 0xae605f02, 0x0391: 0xae605f02, 0x0392: 0xae605f02, 0x0393: 0xadc06002, - 0x0394: 0xadc06002, 0x0395: 0xadc06002, 0x0396: 0xadc06002, 0x0397: 0xae605f02, - 0x0398: 0xae808002, 0x0399: 0xadc06002, 0x039a: 0xadc06002, 0x039b: 0xae605f02, - 0x039c: 0xae906002, 0x039d: 0xaea05f02, 0x039e: 0xaea05f02, 0x039f: 0xae906002, - 0x03a0: 0xaea08102, 0x03a1: 0xaea08202, 0x03a2: 0xae906002, 0x03a3: 0x84e615ef, - 0x03a4: 0x84e6164c, 0x03a5: 0x84e616cd, 0x03a6: 0x84e61771, 0x03a7: 0x84e61836, - 0x03a8: 0x84e6161d, 0x03a9: 0x84e61631, 0x03aa: 0x84e616b4, 0x03ab: 0x84e61741, - 0x03ac: 0x84e617bd, 0x03ad: 0x84e61816, 0x03ae: 0x84e6185f, 0x03af: 0x84e6187b, - 0x03b0: 0x00326688, 0x03b1: 0x40326620, 0x03b2: 0x0032a688, 0x03b3: 0x4032a620, - 0x03b4: 0x40064020, 0x03b5: 0x40064220, 0x03b6: 0x00326088, 0x03b7: 0x40326020, - 0x03ba: 0x00326c84, 0x03bb: 0x40329220, - 0x03bc: 0x40329020, 0x03bd: 0x40329420, 0x03be: 0x40026220, - // Block 0xf, offset 0x3c0 - 0x03c4: 0x40062020, 0x03c5: 0xe00000ab, 0x03c6: 0xe00011f0, 0x03c7: 0x40030620, - 0x03c8: 0xe0001249, 0x03c9: 0xe00012dd, 0x03ca: 0xe000133a, - 0x03cc: 0xe000139b, 0x03ce: 0xe00013dd, 0x03cf: 0xe0001492, - 0x03d0: 0xe0001352, 0x03d1: 0x00325288, 0x03d2: 0x00325488, 0x03d3: 0x00325688, - 0x03d4: 0x00325a88, 0x03d5: 0x00325c88, 0x03d6: 0x00326488, 0x03d7: 0x00326888, - 0x03d8: 0x00326a88, 0x03d9: 0x00326c88, 0x03da: 0x00327088, 0x03db: 0x00327288, - 0x03dc: 0x00327688, 0x03dd: 0x00327888, 0x03de: 0x00327a88, 0x03df: 0x00327c88, - 0x03e0: 0x00327e88, 0x03e1: 0x00328888, 0x03e3: 0x00328e88, - 0x03e4: 0x00329688, 0x03e5: 0x00329888, 0x03e6: 0x00329a88, 0x03e7: 0x00329c88, - 0x03e8: 0x00329e88, 0x03e9: 0x0032a288, 0x03ea: 0xe000134f, 0x03eb: 0xe00013f2, - 0x03ec: 0xe00011ed, 0x03ed: 0xe0001246, 0x03ee: 0xe00012da, 0x03ef: 0xe0001337, - 0x03f0: 0xe00013f5, 0x03f1: 0x40325220, 0x03f2: 0x40325420, 0x03f3: 0x40325620, - 0x03f4: 0x40325a20, 0x03f5: 0x40325c20, 0x03f6: 0x40326420, 0x03f7: 0x40326820, - 0x03f8: 0x40326a20, 0x03f9: 0x40326c20, 0x03fa: 0x40327020, 0x03fb: 0x40327220, - 0x03fc: 0x40327620, 0x03fd: 0x40327820, 0x03fe: 0x40327a20, 0x03ff: 0x40327c20, - // Block 0x10, offset 0x400 - 0x0400: 0x40327e20, 0x0401: 0x40328820, 0x0402: 0x00328e99, 0x0403: 0x40328e20, - 0x0404: 0x40329620, 0x0405: 0x40329820, 0x0406: 0x40329a20, 0x0407: 0x40329c20, - 0x0408: 0x40329e20, 0x0409: 0x4032a220, 0x040a: 0xe000134c, 0x040b: 0xe00013ef, - 0x040c: 0xe0001398, 0x040d: 0xe00013da, 0x040e: 0xe000148f, 0x040f: 0xe0001368, - 0x0410: 0x00325484, 0x0411: 0x00326a84, 0x0412: 0x0032988a, 0x0413: 0xf000020a, - 0x0414: 0xf000020a, 0x0415: 0x00329a84, 0x0416: 0x00327e84, 0x0417: 0xe0001364, - 0x0418: 0x00328688, 0x0419: 0x40328620, 0x041a: 0x00326288, 0x041b: 0x40326220, - 0x041c: 0x00325e88, 0x041d: 0x40325e20, 0x041e: 0x00328488, 0x041f: 0x40328420, - 0x0420: 0x0032a488, 0x0421: 0x4032a420, 0x0422: 0x0032e888, 0x0423: 0x4032e820, - 0x0424: 0x0032f288, 0x0425: 0x4032f220, 0x0426: 0x0032f488, 0x0427: 0x4032f420, - 0x0428: 0x0032fa88, 0x0429: 0x4032fa20, 0x042a: 0x00330888, 0x042b: 0x40330820, - 0x042c: 0x00330e88, 0x042d: 0x40330e20, 0x042e: 0x00331688, 0x042f: 0x40331620, - 0x0430: 0x00327084, 0x0431: 0x00328884, 0x0432: 0x00328e84, 0x0433: 0x40326e20, - 0x0434: 0x00326a8a, 0x0435: 0x00325c84, 0x0436: 0x40092e20, 0x0437: 0x0032a888, - 0x0438: 0x4032a820, 0x0439: 0x00328e8a, 0x043a: 0x00328288, 0x043b: 0x40328220, - 0x043c: 0x40328c20, 0x043d: 0x00329288, 0x043e: 0x00329088, 0x043f: 0x00329488, - // Block 0x11, offset 0x440 - 0x0440: 0xe00014bd, 0x0441: 0xe00014c3, 0x0442: 0x00339688, 0x0443: 0x0033a288, - 0x0444: 0x0033c288, 0x0445: 0x0033fc88, 0x0446: 0xc02a0071, 0x0447: 0x00343688, - 0x0448: 0x00344688, 0x0449: 0x00349a88, 0x044a: 0x0034e488, 0x044b: 0x00356288, - 0x044c: 0x00356a88, 0x044d: 0xe00014cf, 0x044e: 0x00357a88, 0x044f: 0x00365488, - 0x0450: 0xc0090041, 0x0451: 0x00335288, 0x0452: 0x00335a88, 0x0453: 0xc0130092, - 0x0454: 0x00338a88, 0x0455: 0xc01800d1, 0x0456: 0xc01c0071, 0x0457: 0xc0200071, - 0x0458: 0xc0250041, 0x0459: 0x00343e88, 0x045a: 0xc0370092, 0x045b: 0x00348488, - 0x045c: 0x0034a888, 0x045d: 0x0034ba88, 0x045e: 0xc02e0071, 0x045f: 0x00350e88, - 0x0460: 0x00352888, 0x0461: 0x00353a88, 0x0462: 0x00354c88, 0x0463: 0xc03e00f1, - 0x0464: 0x0035ac88, 0x0465: 0x0035b488, 0x0466: 0x00360288, 0x0467: 0xc0440071, - 0x0468: 0x00365c88, 0x0469: 0x00366688, 0x046a: 0x00367488, 0x046b: 0xc0480071, - 0x046c: 0x00368e88, 0x046d: 0xc04c0071, 0x046e: 0x0036b888, 0x046f: 0x0036c488, - 0x0470: 0xc0060041, 0x0471: 0x40335220, 0x0472: 0x40335a20, 0x0473: 0xc0100092, - 0x0474: 0x40338a20, 0x0475: 0xc01600d1, 0x0476: 0xc01a0071, 0x0477: 0xc01e0071, - 0x0478: 0xc0220041, 0x0479: 0x40343e20, 0x047a: 0xc0340092, 0x047b: 0x40348420, - 0x047c: 0x4034a820, 0x047d: 0x4034ba20, 0x047e: 0xc02c0071, 0x047f: 0x40350e20, - // Block 0x12, offset 0x480 - 0x0480: 0x40352820, 0x0481: 0x40353a20, 0x0482: 0x40354c20, 0x0483: 0xc03a00f1, - 0x0484: 0x4035ac20, 0x0485: 0x4035b420, 0x0486: 0x40360220, 0x0487: 0xc0420071, - 0x0488: 0x40365c20, 0x0489: 0x40366620, 0x048a: 0x40367420, 0x048b: 0xc0460071, - 0x048c: 0x40368e20, 0x048d: 0xc04a0071, 0x048e: 0x4036b820, 0x048f: 0x4036c420, - 0x0490: 0xe00014ba, 0x0491: 0xe00014c0, 0x0492: 0x40339620, 0x0493: 0x4033a220, - 0x0494: 0x4033c220, 0x0495: 0x4033fc20, 0x0496: 0xc0280071, 0x0497: 0x40343620, - 0x0498: 0x40344620, 0x0499: 0x40349a20, 0x049a: 0x4034e420, 0x049b: 0x40356220, - 0x049c: 0x40356a20, 0x049d: 0xe00014cc, 0x049e: 0x40357a20, 0x049f: 0x40365420, - 0x04a0: 0x0035e088, 0x04a1: 0x4035e020, 0x04a2: 0x00369e88, 0x04a3: 0x40369e20, - 0x04a4: 0x0036ce88, 0x04a5: 0x4036ce20, 0x04a6: 0x0036d688, 0x04a7: 0x4036d620, - 0x04a8: 0x0036ea88, 0x04a9: 0x4036ea20, 0x04aa: 0x0036e088, 0x04ab: 0x4036e020, - 0x04ac: 0x0036f488, 0x04ad: 0x4036f420, 0x04ae: 0x0036fc88, 0x04af: 0x4036fc20, - 0x04b0: 0x00370488, 0x04b1: 0x40370420, 0x04b2: 0x00370c88, 0x04b3: 0x40370c20, - 0x04b4: 0xc0500131, 0x04b5: 0xc04e0131, 0x04b6: 0x00371c88, 0x04b7: 0x40371c20, - 0x04b8: 0x0035a488, 0x04b9: 0x4035a420, 0x04ba: 0x0035fa88, 0x04bb: 0x4035fa20, - 0x04bc: 0x0035f288, 0x04bd: 0x4035f220, 0x04be: 0x0035e888, 0x04bf: 0x4035e820, - // Block 0x13, offset 0x4c0 - 0x04c0: 0x00352088, 0x04c1: 0x40352020, 0x04c2: 0x40070620, 0x04c3: 0xae608302, - 0x04c4: 0xae605f02, 0x04c5: 0xae602a02, 0x04c6: 0xae602202, 0x04c7: 0xae605f02, - 0x04c8: 0xa0000000, 0x04c9: 0xa0000000, 0x04ca: 0x00341c88, 0x04cb: 0x40341c20, - 0x04cc: 0x00369688, 0x04cd: 0x40369620, 0x04ce: 0x00353088, 0x04cf: 0x40353020, - 0x04d0: 0xe00014b7, 0x04d1: 0xe00014b4, 0x04d2: 0x00336a88, 0x04d3: 0x40336a20, - 0x04d4: 0x00337a88, 0x04d5: 0x40337a20, 0x04d6: 0x0033dc88, 0x04d7: 0x4033dc20, - 0x04d8: 0x0033aa88, 0x04d9: 0x4033aa20, 0x04da: 0x00345888, 0x04db: 0x40345820, - 0x04dc: 0x00347888, 0x04dd: 0x40347820, 0x04de: 0x00347088, 0x04df: 0x40347020, - 0x04e0: 0x00346888, 0x04e1: 0x40346820, 0x04e2: 0x0034ca88, 0x04e3: 0x4034ca20, - 0x04e4: 0x0034dc88, 0x04e5: 0x4034dc20, 0x04e6: 0x00351888, 0x04e7: 0x40351820, - 0x04e8: 0x00372688, 0x04e9: 0x40372620, 0x04ea: 0x00354488, 0x04eb: 0x40354420, - 0x04ec: 0x00355888, 0x04ed: 0x40355820, 0x04ee: 0x00359288, 0x04ef: 0x40359220, - 0x04f0: 0x00359a88, 0x04f1: 0x40359a20, 0x04f2: 0x0035cc88, 0x04f3: 0x4035cc20, - 0x04f4: 0x00360e88, 0x04f5: 0x40360e20, 0x04f6: 0x00362a88, 0x04f7: 0x40362a20, - 0x04f8: 0x00363a88, 0x04f9: 0x40363a20, 0x04fa: 0x0035d488, 0x04fb: 0x4035d420, - 0x04fc: 0x00364488, 0x04fd: 0x40364420, 0x04fe: 0x00364c88, 0x04ff: 0x40364c20, - // Block 0x14, offset 0x500 - 0x0500: 0x00373088, 0x0501: 0xe00014c9, 0x0502: 0xe00014c6, 0x0503: 0x00346088, - 0x0504: 0x40346020, 0x0505: 0x00348e88, 0x0506: 0x40348e20, 0x0507: 0x0034d288, - 0x0508: 0x4034d220, 0x0509: 0x0034c288, 0x050a: 0x4034c220, 0x050b: 0x00363288, - 0x050c: 0x40363220, 0x050d: 0x0034b088, 0x050e: 0x4034b020, 0x050f: 0x40373020, - 0x0510: 0x00332a88, 0x0511: 0x40332a20, 0x0512: 0x00333288, 0x0513: 0x40333220, - 0x0514: 0x00334a88, 0x0515: 0x40334a20, 0x0516: 0x0033ba88, 0x0517: 0x4033ba20, - 0x0518: 0xc00e0071, 0x0519: 0xc00c0071, 0x051a: 0x00334288, 0x051b: 0x40334220, - 0x051c: 0x0033d488, 0x051d: 0x4033d420, 0x051e: 0x0033f288, 0x051f: 0x4033f220, - 0x0520: 0x00340688, 0x0521: 0x40340620, 0x0522: 0xe00014d5, 0x0523: 0xe00014d2, - 0x0524: 0x00342488, 0x0525: 0x40342420, 0x0526: 0x0034f688, 0x0527: 0x4034f620, - 0x0528: 0xc0320071, 0x0529: 0xc0300071, 0x052a: 0x00350688, 0x052b: 0x40350620, - 0x052c: 0x0036b088, 0x052d: 0x4036b020, 0x052e: 0xe00014de, 0x052f: 0xe00014db, - 0x0530: 0x00358288, 0x0531: 0x40358220, 0x0532: 0x00358a88, 0x0533: 0x40358a20, - 0x0534: 0x00362288, 0x0535: 0x40362220, 0x0536: 0x00338288, 0x0537: 0x40338220, - 0x0538: 0x00368688, 0x0539: 0x40368620, 0x053a: 0x00337288, 0x053b: 0x40337220, - 0x053c: 0x0035bc88, 0x053d: 0x4035bc20, 0x053e: 0x0035c488, 0x053f: 0x4035c420, - // Block 0x15, offset 0x540 - 0x0540: 0x00339288, 0x0541: 0x40339220, 0x0542: 0x0033a088, 0x0543: 0x4033a020, - 0x0544: 0x0033ee88, 0x0545: 0x4033ee20, 0x0546: 0x00341088, 0x0547: 0x40341020, - 0x0548: 0x0034a488, 0x0549: 0x4034a420, 0x054a: 0x0034ec88, 0x054b: 0x4034ec20, - 0x054c: 0x00354288, 0x054d: 0x40354220, 0x054e: 0x00355688, 0x054f: 0x40355620, - 0x0550: 0x0033f088, 0x0551: 0x4033f020, 0x0552: 0x00349688, 0x0553: 0x40349620, - 0x0554: 0x0034a688, 0x0555: 0x4034a620, 0x0556: 0x00353888, 0x0557: 0x40353820, - 0x0558: 0x0036cc88, 0x0559: 0x4036cc20, 0x055a: 0x00348288, 0x055b: 0x40348220, - 0x055c: 0x00372e88, 0x055d: 0x40372e20, 0x055e: 0x00348088, 0x055f: 0x40348020, - 0x0560: 0x00349888, 0x0561: 0x40349820, 0x0562: 0x0034da88, 0x0563: 0x4034da20, - 0x0564: 0x00351688, 0x0565: 0x40351620, 0x0566: 0x0035dc88, 0x0567: 0x4035dc20, - 0x0571: 0x00384288, 0x0572: 0x00384488, 0x0573: 0x00384688, - 0x0574: 0x00384888, 0x0575: 0x00384a88, 0x0576: 0x00384c88, 0x0577: 0x00384e88, - 0x0578: 0x00385088, 0x0579: 0x00385288, 0x057a: 0x00385488, 0x057b: 0x00385688, - 0x057c: 0x00385888, 0x057d: 0x00385a88, 0x057e: 0x00385c88, 0x057f: 0x00385e88, - // Block 0x16, offset 0x580 - 0x0580: 0x00386088, 0x0581: 0x00386288, 0x0582: 0x00386488, 0x0583: 0x00386688, - 0x0584: 0x00386888, 0x0585: 0x00386a88, 0x0586: 0x00386c88, 0x0587: 0x00386e88, - 0x0588: 0x00387088, 0x0589: 0x00387288, 0x058a: 0x00387488, 0x058b: 0x00387688, - 0x058c: 0x00387888, 0x058d: 0x00387a88, 0x058e: 0x00387c88, 0x058f: 0x00387e88, - 0x0590: 0x00388088, 0x0591: 0x00388288, 0x0592: 0x00388488, 0x0593: 0x00388688, - 0x0594: 0x00388888, 0x0595: 0x00388a88, 0x0596: 0x00388c88, - 0x0599: 0x40388e20, 0x059a: 0x40054e20, 0x059b: 0x40055020, - 0x059c: 0x4002be20, 0x059d: 0x40024620, 0x059e: 0x4002ca20, 0x059f: 0x40055220, - 0x05a1: 0x40384220, 0x05a2: 0x40384420, 0x05a3: 0x40384620, - 0x05a4: 0x40384820, 0x05a5: 0x40384a20, 0x05a6: 0x40384c20, 0x05a7: 0x40384e20, - 0x05a8: 0x40385020, 0x05a9: 0x40385220, 0x05aa: 0x40385420, 0x05ab: 0x40385620, - 0x05ac: 0x40385820, 0x05ad: 0x40385a20, 0x05ae: 0x40385c20, 0x05af: 0x40385e20, - 0x05b0: 0x40386020, 0x05b1: 0x40386220, 0x05b2: 0x40386420, 0x05b3: 0x40386620, - 0x05b4: 0x40386820, 0x05b5: 0x40386a20, 0x05b6: 0x40386c20, 0x05b7: 0x40386e20, - 0x05b8: 0x40387020, 0x05b9: 0x40387220, 0x05ba: 0x40387420, 0x05bb: 0x40387620, - 0x05bc: 0x40387820, 0x05bd: 0x40387a20, 0x05be: 0x40387c20, 0x05bf: 0x40387e20, - // Block 0x17, offset 0x5c0 - 0x05c0: 0x40388020, 0x05c1: 0x40388220, 0x05c2: 0x40388420, 0x05c3: 0x40388620, - 0x05c4: 0x40388820, 0x05c5: 0x40388a20, 0x05c6: 0x40388c20, 0x05c7: 0xf0000404, - 0x05c9: 0x40026e20, 0x05ca: 0x40021c20, - 0x05cf: 0x4027e420, - 0x05d1: 0xadc00000, 0x05d2: 0xae600000, 0x05d3: 0xae600000, - 0x05d4: 0xae600000, 0x05d5: 0xae600000, 0x05d6: 0xadc00000, 0x05d7: 0xae600000, - 0x05d8: 0xae600000, 0x05d9: 0xae600000, 0x05da: 0xade00000, 0x05db: 0xadc00000, - 0x05dc: 0xae600000, 0x05dd: 0xae600000, 0x05de: 0xae600000, 0x05df: 0xae600000, - 0x05e0: 0xae600000, 0x05e1: 0xae600000, 0x05e2: 0xadc00000, 0x05e3: 0xadc00000, - 0x05e4: 0xadc00000, 0x05e5: 0xadc00000, 0x05e6: 0xadc00000, 0x05e7: 0xadc00000, - 0x05e8: 0xae600000, 0x05e9: 0xae600000, 0x05ea: 0xadc00000, 0x05eb: 0xae600000, - 0x05ec: 0xae600000, 0x05ed: 0xade00000, 0x05ee: 0xae400000, 0x05ef: 0xae600000, - 0x05f0: 0xa0a08502, 0x05f1: 0xa0b08602, 0x05f2: 0xa0c08702, 0x05f3: 0xa0d08802, - 0x05f4: 0xa0e08902, 0x05f5: 0xa0f08a02, 0x05f6: 0xa1008b02, 0x05f7: 0xa1108c02, - 0x05f8: 0xa1208d02, 0x05f9: 0xa1308e02, 0x05fa: 0xa1308e02, 0x05fb: 0xa1408f02, - 0x05fc: 0xa1509202, 0x05fd: 0xa1600000, 0x05fe: 0x40055420, 0x05ff: 0xa1709502, - // Block 0x18, offset 0x600 - 0x0600: 0x40055620, 0x0601: 0xa1809102, 0x0602: 0xa1909002, 0x0603: 0x40055820, - 0x0604: 0xae600000, 0x0605: 0xadc00000, 0x0606: 0x40055a20, 0x0607: 0xa1208d02, - 0x0610: 0x40389020, 0x0611: 0x40389220, 0x0612: 0x40389420, 0x0613: 0x40389620, - 0x0614: 0x40389820, 0x0615: 0x40389a20, 0x0616: 0x40389c20, 0x0617: 0x40389e20, - 0x0618: 0x4038a020, 0x0619: 0x4038a220, 0x061a: 0x0038a499, 0x061b: 0x4038a420, - 0x061c: 0x4038a620, 0x061d: 0x0038a899, 0x061e: 0x4038a820, 0x061f: 0x0038aa99, - 0x0620: 0x4038aa20, 0x0621: 0x4038ac20, 0x0622: 0x4038ae20, 0x0623: 0x0038b099, - 0x0624: 0x4038b020, 0x0625: 0x0038b299, 0x0626: 0x4038b220, 0x0627: 0x4038b420, - 0x0628: 0x4038b620, 0x0629: 0x4038b820, 0x062a: 0x4038ba20, - 0x0630: 0xe00014ff, 0x0631: 0xe0001502, 0x0632: 0xe0001511, 0x0633: 0x40055c20, - 0x0634: 0x40055e20, - // Block 0x19, offset 0x640 - 0x0640: 0xa0000000, 0x0641: 0xa0000000, 0x0642: 0xa0000000, 0x0643: 0xa0000000, - 0x0644: 0xa0000000, 0x0646: 0x40096620, 0x0647: 0x40096a20, - 0x0648: 0x40070820, 0x0649: 0x4004f220, 0x064a: 0x4004f620, 0x064b: 0x4027e620, - 0x064c: 0x40024820, 0x064d: 0x40024a20, 0x064e: 0x40070e20, 0x064f: 0x40071020, - 0x0650: 0xae600000, 0x0651: 0xae600000, 0x0652: 0xae600000, 0x0653: 0xae600000, - 0x0654: 0xae600000, 0x0655: 0xae600000, 0x0656: 0xae600000, 0x0657: 0xae600000, - 0x0658: 0xa1e00000, 0x0659: 0xa1f00000, 0x065a: 0xa2000000, 0x065b: 0x40026420, - 0x065e: 0x40027020, 0x065f: 0x4002cc20, - 0x0660: 0x403aa220, 0x0661: 0x40391c20, 0x0662: 0x40391e20, 0x0663: 0x40392020, - 0x0664: 0x40392620, 0x0665: 0x40392820, 0x0666: 0x40393020, 0x0667: 0xc0520151, - 0x0668: 0x40393c20, 0x0669: 0x40395420, 0x066a: 0x40395620, 0x066b: 0x40395820, - 0x066c: 0x40396420, 0x066d: 0x40397220, 0x066e: 0x40397420, 0x066f: 0x40398820, - 0x0670: 0x40398a20, 0x0671: 0x4039a420, 0x0672: 0x4039a620, 0x0673: 0x4039c620, - 0x0674: 0x4039c820, 0x0675: 0x4039dc20, 0x0676: 0x4039de20, 0x0677: 0x4039e620, - 0x0678: 0x4039e820, 0x0679: 0x4039ee20, 0x067a: 0x4039f020, 0x067b: 0x403a3820, - 0x067c: 0x403a3a20, 0x067d: 0x403a9c20, 0x067e: 0x403a9e20, 0x067f: 0x403aa020, - // Block 0x1a, offset 0x680 - 0x0680: 0xa0000000, 0x0681: 0x4039fc20, 0x0682: 0x403a1220, 0x0683: 0x403a1a20, - 0x0684: 0x403a4020, 0x0685: 0x403a4e20, 0x0686: 0x403a5620, 0x0687: 0x403a6820, - 0x0688: 0xc0560171, 0x0689: 0x403a8e20, 0x068a: 0xc0580171, 0x068b: 0xa1b0a202, - 0x068c: 0xa1c0a502, 0x068d: 0xa1d0a902, 0x068e: 0xa1e0ad02, 0x068f: 0xa1f0b202, - 0x0690: 0xa200b602, 0x0691: 0xa210ba02, 0x0692: 0xa220bc02, 0x0693: 0xae60bd02, - 0x0694: 0xae60be02, 0x0695: 0xadc0bf02, 0x0696: 0xadc0c102, 0x0697: 0xae60c202, - 0x0698: 0xae60c302, 0x0699: 0xae60c402, 0x069a: 0xae60c502, 0x069b: 0xae60c602, - 0x069c: 0xadc0c702, 0x069d: 0xae60c802, 0x069e: 0xae60c902, 0x069f: 0xadc0c002, - 0x06a0: 0xe000015e, 0x06a1: 0xe00001e6, 0x06a2: 0xe0000301, 0x06a3: 0xe00003db, - 0x06a4: 0xe00004b6, 0x06a5: 0xe0000580, 0x06a6: 0xe000064b, 0x06a7: 0xe00006f3, - 0x06a8: 0xe000079f, 0x06a9: 0xe0000844, 0x06aa: 0x4004ee20, 0x06ab: 0x40024c20, - 0x06ac: 0x40024e20, 0x06ad: 0x4004de20, 0x06ae: 0x40393a20, 0x06af: 0x403a1020, - 0x06b0: 0xa230d102, 0x06b1: 0x40392420, 0x06b2: 0x40392220, 0x06b3: 0x40392a20, - 0x06b4: 0x00391c84, 0x06b5: 0xf0000404, 0x06b6: 0xf0000404, 0x06b7: 0xf0000404, - 0x06b8: 0xf0000404, 0x06b9: 0x40395a20, 0x06ba: 0x40395c20, 0x06bb: 0x40393e20, - 0x06bc: 0x40395e20, 0x06bd: 0x40396020, 0x06be: 0x40394020, 0x06bf: 0x40396220, - // Block 0x1b, offset 0x6c0 - 0x06c0: 0x40394220, 0x06c1: 0x40397620, 0x06c2: 0x40397820, 0x06c3: 0x40396620, - 0x06c4: 0x40396820, 0x06c5: 0x40397a20, 0x06c6: 0x40396a20, 0x06c7: 0x40396e20, - 0x06c8: 0x40398c20, 0x06c9: 0x40398e20, 0x06ca: 0x40399020, 0x06cb: 0x40399220, - 0x06cc: 0x40399420, 0x06cd: 0x40399620, 0x06ce: 0x40399820, 0x06cf: 0x40399a20, - 0x06d0: 0x40399c20, 0x06d1: 0x4039a820, 0x06d2: 0x4039aa20, 0x06d3: 0x4039ac20, - 0x06d4: 0x4039ae20, 0x06d5: 0x4039b020, 0x06d6: 0x4039b220, 0x06d7: 0x4039b420, - 0x06d8: 0x4039b620, 0x06d9: 0x4039b820, 0x06da: 0x4039ca20, 0x06db: 0x4039cc20, - 0x06dc: 0x4039ce20, 0x06dd: 0x4039e020, 0x06de: 0x4039e220, 0x06df: 0x4039ea20, - 0x06e0: 0x4039f220, 0x06e1: 0x4039fe20, 0x06e2: 0x403a0020, 0x06e3: 0x403a0220, - 0x06e4: 0x403a0420, 0x06e5: 0x403a0820, 0x06e6: 0x403a0a20, 0x06e7: 0x403a1420, - 0x06e8: 0x403a1620, 0x06e9: 0x403a1c20, 0x06ea: 0x403a1e20, 0x06eb: 0x403a2020, - 0x06ec: 0x403a2220, 0x06ed: 0x403a2620, 0x06ee: 0x403a2820, 0x06ef: 0x403a2a20, - 0x06f0: 0x403a2c20, 0x06f1: 0x403a2e20, 0x06f2: 0x403a3020, 0x06f3: 0x403a3220, - 0x06f4: 0x403a3420, 0x06f5: 0x403a4220, 0x06f6: 0x403a4420, 0x06f7: 0x403a4620, - 0x06f8: 0x403a4820, 0x06f9: 0x403a6020, 0x06fa: 0x403a5820, 0x06fb: 0x403a5a20, - 0x06fc: 0x403a5c20, 0x06fd: 0x403a5e20, 0x06fe: 0x403a6a20, 0x06ff: 0x40396c20, - // Block 0x1c, offset 0x700 - 0x0700: 0xe00017e4, 0x0701: 0x403a6c20, 0x0702: 0xe00017e1, 0x0703: 0x403a6e20, - 0x0704: 0x403a7620, 0x0705: 0x403a7820, 0x0706: 0x403a7a20, 0x0707: 0x403a7c20, - 0x0708: 0x403a7e20, 0x0709: 0x403a8020, 0x070a: 0x403a8220, 0x070b: 0x403a8420, - 0x070c: 0x403a9220, 0x070d: 0x403a9420, 0x070e: 0x403a9620, 0x070f: 0x403a8620, - 0x0710: 0x403a9820, 0x0711: 0x403a9a20, 0x0712: 0x403aaa20, 0x0713: 0xe0001800, - 0x0714: 0x4002e820, 0x0715: 0x403a7220, 0x0716: 0xae600000, 0x0717: 0xae600000, - 0x0718: 0xae600000, 0x0719: 0xae600000, 0x071a: 0xae600000, 0x071b: 0xae600000, - 0x071c: 0xae600000, 0x071d: 0xa0000000, 0x071e: 0x40071220, 0x071f: 0xae600000, - 0x0720: 0xae600000, 0x0721: 0xae600000, 0x0722: 0xae600000, 0x0723: 0xadc00000, - 0x0724: 0xae600000, 0x0725: 0x003a7484, 0x0726: 0x003a9084, 0x0727: 0xae600000, - 0x0728: 0xae600000, 0x0729: 0x40071420, 0x072a: 0xadc00000, 0x072b: 0xae600000, - 0x072c: 0xae600000, 0x072d: 0xadc00000, 0x072e: 0x40399e20, 0x072f: 0x4039ba20, - 0x0730: 0xe0000161, 0x0731: 0xe00001e9, 0x0732: 0xe0000304, 0x0733: 0xe00003de, - 0x0734: 0xe00004b9, 0x0735: 0xe0000583, 0x0736: 0xe000064e, 0x0737: 0xe00006f6, - 0x0738: 0xe00007a2, 0x0739: 0xe0000847, 0x073a: 0x4039d020, 0x073b: 0x4039e420, - 0x073c: 0x4039f420, 0x073d: 0xe0001553, 0x073e: 0xe0001779, 0x073f: 0x403a7020, - // Block 0x1d, offset 0x740 - 0x0740: 0x40035c20, 0x0741: 0x4002ea20, 0x0742: 0x4002ec20, 0x0743: 0x40027220, - 0x0744: 0x40027420, 0x0745: 0x40027620, 0x0746: 0x40027820, 0x0747: 0x40027a20, - 0x0748: 0x40027c20, 0x0749: 0x4002ce20, 0x074a: 0x40056020, 0x074b: 0x40056220, - 0x074c: 0x40056420, 0x074d: 0x40056620, 0x074f: 0xa0000000, - 0x0750: 0x403ab020, 0x0751: 0xa240d202, 0x0752: 0x403ab220, 0x0753: 0x403ab420, - 0x0754: 0xe0001806, 0x0755: 0x403ab820, 0x0756: 0x403ab620, 0x0757: 0x403aba20, - 0x0758: 0x403abc20, 0x0759: 0x403abe20, 0x075a: 0x403ac220, 0x075b: 0x403ac420, - 0x075c: 0xe000180f, 0x075d: 0x403ac620, 0x075e: 0x403ac820, 0x075f: 0x403aca20, - 0x0760: 0x403ace20, 0x0761: 0x403ad020, 0x0762: 0x403ad220, 0x0763: 0x403ad420, - 0x0764: 0x003ad499, 0x0765: 0x403ad620, 0x0766: 0x403ad820, 0x0767: 0xe0001812, - 0x0768: 0x403adc20, 0x0769: 0x403ade20, 0x076a: 0x403ae020, 0x076b: 0x403ae220, - 0x076c: 0x403ae420, 0x076d: 0xe0001803, 0x076e: 0xe0001809, 0x076f: 0xe000180c, - 0x0770: 0xae60d302, 0x0771: 0xadc0d402, 0x0772: 0xae60d502, 0x0773: 0xae60d602, - 0x0774: 0xadc0d702, 0x0775: 0xae60d802, 0x0776: 0xae60d902, 0x0777: 0xadc0da02, - 0x0778: 0xadc0db02, 0x0779: 0xadc0dc02, 0x077a: 0xae60dd02, 0x077b: 0xadc0de02, - 0x077c: 0xadc0df02, 0x077d: 0xae60e002, 0x077e: 0xadc0e102, 0x077f: 0xae60e202, - // Block 0x1e, offset 0x780 - 0x0780: 0xae600000, 0x0781: 0xae605f02, 0x0782: 0xadc06002, 0x0783: 0xae600000, - 0x0784: 0xadc00000, 0x0785: 0xae605f02, 0x0786: 0xadc06002, 0x0787: 0xae600000, - 0x0788: 0xadc00000, 0x0789: 0xae600000, 0x078a: 0xae600000, - 0x078d: 0x403ac020, 0x078e: 0x403acc20, 0x078f: 0x403ada20, - 0x0790: 0x40394420, 0x0791: 0x40394620, 0x0792: 0x40394820, 0x0793: 0x40394a20, - 0x0794: 0x40394c20, 0x0795: 0x40394e20, 0x0796: 0x40395220, 0x0797: 0x40397c20, - 0x0798: 0x40397e20, 0x0799: 0x4039a020, 0x079a: 0x4039a220, 0x079b: 0x4039bc20, - 0x079c: 0x4039d220, 0x079d: 0x4039f620, 0x079e: 0x4039f820, 0x079f: 0x4039fa20, - 0x07a0: 0x403a0c20, 0x07a1: 0x403a0e20, 0x07a2: 0x403a3620, 0x07a3: 0x403a3c20, - 0x07a4: 0x403a3e20, 0x07a5: 0x403a5020, 0x07a6: 0x403a5220, 0x07a7: 0x403a6220, - 0x07a8: 0x403a6420, 0x07a9: 0x403a6620, 0x07aa: 0x403a4a20, 0x07ab: 0x4039be20, - 0x07ac: 0x4039c020, 0x07ad: 0x4039d420, 0x07ae: 0x40398020, 0x07af: 0x40398220, - 0x07b0: 0x4039d620, 0x07b1: 0x4039c220, 0x07b2: 0x40398420, 0x07b3: 0x40392c20, - 0x07b4: 0x40392e20, 0x07b5: 0x403aa420, 0x07b6: 0x403aa620, 0x07b7: 0x403aa820, - 0x07b8: 0x403a8820, 0x07b9: 0x403a8a20, 0x07ba: 0x403aac20, 0x07bb: 0x403aae20, - 0x07bc: 0x40398620, 0x07bd: 0x4039d820, 0x07be: 0x4039da20, 0x07bf: 0x403a2420, - // Block 0x1f, offset 0x7c0 - 0x07c0: 0x403b1820, 0x07c1: 0x403b1e20, 0x07c2: 0x403b2020, 0x07c3: 0x403b2220, - 0x07c4: 0x403b2620, 0x07c5: 0x403b2820, 0x07c6: 0x403b2a20, 0x07c7: 0x403b2c20, - 0x07c8: 0x403b3220, 0x07c9: 0x403b3620, 0x07ca: 0x403b3820, 0x07cb: 0x403b3a20, - 0x07cc: 0x403b3e20, 0x07cd: 0x403b4620, 0x07ce: 0x403b4820, 0x07cf: 0x403b4c20, - 0x07d0: 0x403b4e20, 0x07d1: 0x403b5620, 0x07d2: 0x403b5820, 0x07d3: 0x403b5a20, - 0x07d4: 0x403b5c20, 0x07d5: 0x403b5e20, 0x07d6: 0x403b6020, 0x07d7: 0x403b6220, - 0x07d8: 0x403b4020, 0x07d9: 0x403b1a20, 0x07da: 0x403b1c20, 0x07db: 0x403b3c20, - 0x07dc: 0x403b2420, 0x07dd: 0x403b5020, 0x07de: 0x403b5220, 0x07df: 0x403b5420, - 0x07e0: 0x403b4220, 0x07e1: 0x403b4420, 0x07e2: 0x403b2e20, 0x07e3: 0x403b3020, - 0x07e4: 0x403b4a20, 0x07e5: 0x403b3420, 0x07e6: 0x403b6620, 0x07e7: 0x403b6820, - 0x07e8: 0x403b6a20, 0x07e9: 0x403b6c20, 0x07ea: 0x403b6e20, 0x07eb: 0x403b7020, - 0x07ec: 0x403b7220, 0x07ed: 0x403b7420, 0x07ee: 0x403b7620, 0x07ef: 0x403b7820, - 0x07f0: 0x403b7a20, 0x07f1: 0x403b6420, - // Block 0x20, offset 0x800 - 0x0800: 0xe0000164, 0x0801: 0xe00001ef, 0x0802: 0xe000030a, 0x0803: 0xe00003e4, - 0x0804: 0xe00004bf, 0x0805: 0xe0000589, 0x0806: 0xe0000654, 0x0807: 0xe00006fc, - 0x0808: 0xe00007a8, 0x0809: 0xe000084d, 0x080a: 0x403b7c20, 0x080b: 0x403b7e20, - 0x080c: 0x403b8020, 0x080d: 0x403b8220, 0x080e: 0x403b8420, 0x080f: 0x403b8620, - 0x0810: 0x403b8820, 0x0811: 0x403b8a20, 0x0812: 0x403b8c20, 0x0813: 0x403b8e20, - 0x0814: 0x403b9020, 0x0815: 0x403b9220, 0x0816: 0x403b9420, 0x0817: 0x403b9620, - 0x0818: 0x403b9820, 0x0819: 0x403b9a20, 0x081a: 0x403b9c20, 0x081b: 0x403b9e20, - 0x081c: 0x403ba020, 0x081d: 0x403ba220, 0x081e: 0x403ba420, 0x081f: 0x403ba620, - 0x0820: 0x403ba820, 0x0821: 0x403baa20, 0x0822: 0x403bac20, 0x0823: 0x403bae20, - 0x0824: 0x403bb020, 0x0825: 0x403bb220, 0x0826: 0x403bb420, 0x0827: 0x403bb620, - 0x0828: 0xe0001815, 0x0829: 0xe0001818, 0x082a: 0xe000181b, 0x082b: 0xae60e302, - 0x082c: 0xae60e402, 0x082d: 0xae60e502, 0x082e: 0xae60e602, 0x082f: 0xae60e702, - 0x0830: 0xae60e802, 0x0831: 0xae60e902, 0x0832: 0xadc0ea02, 0x0833: 0xae60eb02, - 0x0834: 0x403bb820, 0x0835: 0x403bba20, 0x0836: 0x40073820, 0x0837: 0x40035e20, - 0x0838: 0x40025020, 0x0839: 0x4002c020, 0x083a: 0xa0000000, - // Block 0x21, offset 0x840 - 0x0840: 0x4038e820, 0x0841: 0x4038ea20, 0x0842: 0x4038ec20, 0x0843: 0x4038ee20, - 0x0844: 0x4038f020, 0x0845: 0x4038f220, 0x0846: 0x4038f420, 0x0847: 0x4038f620, - 0x0848: 0x4038f820, 0x0849: 0x4038fa20, 0x084a: 0x4038fc20, 0x084b: 0x4038fe20, - 0x084c: 0x40390020, 0x084d: 0x40390220, 0x084e: 0x40390420, 0x084f: 0x40390620, - 0x0850: 0x40390820, 0x0851: 0x40390a20, 0x0852: 0x40390c20, 0x0853: 0x40390e20, - 0x0854: 0x40391020, 0x0855: 0x40391220, 0x0856: 0x82e61c8a, 0x0857: 0x82e61c8b, - 0x0858: 0xae609f02, 0x0859: 0xae60a002, 0x085a: 0x40391820, 0x085b: 0x82e61c8d, - 0x085c: 0xae609702, 0x085d: 0xae609702, 0x085e: 0xae609802, 0x085f: 0xae609802, - 0x0860: 0xae609802, 0x0861: 0xae609902, 0x0862: 0xae609902, 0x0863: 0xae609902, - 0x0864: 0xa0009a02, 0x0865: 0xae609a02, 0x0866: 0xae609b02, 0x0867: 0xae609b02, - 0x0868: 0xa0009c02, 0x0869: 0xae609c02, 0x086a: 0xae609c02, 0x086b: 0xae609d02, - 0x086c: 0xae609e02, 0x086d: 0xae60a102, - 0x0870: 0x40027e20, 0x0871: 0x40028020, 0x0872: 0x40028220, 0x0873: 0x40028420, - 0x0874: 0x40028620, 0x0875: 0x40028820, 0x0876: 0x40028a20, 0x0877: 0x40028c20, - 0x0878: 0x40028e20, 0x0879: 0x40029020, 0x087a: 0x40029220, 0x087b: 0x40029420, - 0x087c: 0x40029620, 0x087d: 0x40029820, 0x087e: 0x40029a20, - // Block 0x22, offset 0x880 - 0x0880: 0x403ae620, 0x0881: 0x403ae820, 0x0882: 0x403aea20, 0x0883: 0x403aec20, - 0x0884: 0x403aee20, 0x0885: 0x403af020, 0x0886: 0x403af220, 0x0887: 0x403af420, - 0x0888: 0x403af620, 0x0889: 0x403af820, 0x088a: 0x403afa20, 0x088b: 0x403afc20, - 0x088c: 0x403afe20, 0x088d: 0x403b0020, 0x088e: 0x403b0220, 0x088f: 0x403b0420, - 0x0890: 0x403b0620, 0x0891: 0x403b0820, 0x0892: 0x403b0a20, 0x0893: 0x403b0c20, - 0x0894: 0x403b0e20, 0x0895: 0x403b1020, 0x0896: 0x403b1220, 0x0897: 0x403b1420, - 0x0898: 0x403b1620, 0x0899: 0xadc06002, 0x089a: 0xadc06002, 0x089b: 0xadc06002, - 0x089e: 0x40056820, - // Block 0x23, offset 0x8c0 - 0x08e0: 0x40395020, 0x08e2: 0x40397020, 0x08e3: 0x4039ec20, - 0x08e4: 0x403a0620, 0x08e5: 0x403a1820, 0x08e6: 0x403a4c20, 0x08e7: 0x403a5420, - 0x08e8: 0x40393220, 0x08e9: 0x40393420, 0x08ea: 0x4039c420, 0x08eb: 0x403a8c20, - 0x08ec: 0x40393620, - // Block 0x24, offset 0x900 - 0x0924: 0xae60af02, 0x0925: 0xae60b402, 0x0926: 0xadc0b802, 0x0927: 0xae60a402, - 0x0928: 0xae60a802, 0x0929: 0xadc0ac02, 0x092a: 0xae600000, 0x092b: 0xae600000, - 0x092c: 0xae600000, 0x092d: 0xadc00000, 0x092e: 0xadc00000, 0x092f: 0xadc00000, - 0x0930: 0xa1b0a302, 0x0931: 0xa1c0a702, 0x0932: 0xa1d0ab02, 0x0933: 0xae600000, - 0x0934: 0xae60b002, 0x0935: 0xae60b102, 0x0936: 0xadc0b902, 0x0937: 0xae60ca02, - 0x0938: 0xae60cb02, 0x0939: 0xadc0cf02, 0x093a: 0xadc0d002, 0x093b: 0xae60cd02, - 0x093c: 0xae60ce02, 0x093d: 0xae60cc02, 0x093e: 0xae60b502, - // Block 0x25, offset 0x940 - 0x0940: 0xa000f202, 0x0941: 0xa000f202, 0x0942: 0xa000f302, 0x0943: 0xa000f402, - 0x0944: 0x403fbc20, 0x0945: 0x403fbe20, 0x0946: 0x403fc020, 0x0947: 0x403fcc20, - 0x0948: 0x403fce20, 0x0949: 0x403fd020, 0x094a: 0x403fd220, 0x094b: 0x403fd420, - 0x094c: 0x403fd820, 0x094d: 0x403fdc20, 0x094e: 0x403fde20, 0x094f: 0x403fe020, - 0x0950: 0x403fe220, 0x0951: 0x403fe420, 0x0952: 0x403fe620, 0x0953: 0x403fe820, - 0x0954: 0x403fea20, 0x0955: 0x403fec20, 0x0956: 0x403fee20, 0x0957: 0x403ff020, - 0x0958: 0x403ff420, 0x0959: 0x403ff620, 0x095a: 0x403ff820, 0x095b: 0x403ffa20, - 0x095c: 0x403ffc20, 0x095d: 0x40400220, 0x095e: 0x40400420, 0x095f: 0x40400620, - 0x0960: 0x40400820, 0x0961: 0x40400a20, 0x0962: 0x40400e20, 0x0963: 0x40401020, - 0x0964: 0x40401220, 0x0965: 0x40401420, 0x0966: 0x40401620, 0x0967: 0x40401820, - 0x0968: 0x40401a20, 0x0969: 0xe0001830, 0x096a: 0x40401c20, 0x096b: 0x40401e20, - 0x096c: 0x40402020, 0x096d: 0x40402420, 0x096e: 0x40402620, 0x096f: 0x40402820, - 0x0970: 0x40402c20, 0x0971: 0xe0001839, 0x0972: 0x40402e20, 0x0973: 0x40403020, - 0x0974: 0xe000183c, 0x0975: 0x40403220, 0x0976: 0x40403420, 0x0977: 0x40403620, - 0x0978: 0x40403820, 0x0979: 0x40403a20, 0x097a: 0x40404c20, 0x097b: 0x40404e20, - 0x097c: 0xa070f102, 0x097d: 0x40403c20, 0x097e: 0x40404a20, 0x097f: 0x40405620, - // Block 0x26, offset 0x980 - 0x0980: 0x40405820, 0x0981: 0x40405a20, 0x0982: 0x40405c20, 0x0983: 0x40405e20, - 0x0984: 0x40406020, 0x0985: 0x40406620, 0x0986: 0x40406a20, 0x0987: 0x40406c20, - 0x0988: 0x40407020, 0x0989: 0x40407220, 0x098a: 0x40407420, 0x098b: 0x40407620, - 0x098c: 0x40407820, 0x098d: 0x8209203d, 0x098e: 0x40406e20, 0x098f: 0x40405020, - 0x0990: 0x403fb820, 0x0991: 0xae600000, 0x0992: 0xadc00000, 0x0993: 0xae603502, - 0x0994: 0xae603202, 0x0995: 0x40406820, 0x0996: 0x40405220, 0x0997: 0x40405420, - 0x0998: 0xe000181e, 0x0999: 0xe0001821, 0x099a: 0xe0001824, 0x099b: 0xe0001827, - 0x099c: 0xe000182a, 0x099d: 0xe000182d, 0x099e: 0xe0001833, 0x099f: 0xe0001836, - 0x09a0: 0x403fd620, 0x09a1: 0x403fda20, 0x09a2: 0x40406220, 0x09a3: 0x40406420, - 0x09a4: 0x40030c20, 0x09a5: 0x40030e20, 0x09a6: 0xe000016a, 0x09a7: 0xe00001f8, - 0x09a8: 0xe0000313, 0x09a9: 0xe00003ed, 0x09aa: 0xe00004c8, 0x09ab: 0xe0000592, - 0x09ac: 0xe000065d, 0x09ad: 0xe0000705, 0x09ae: 0xe00007b1, 0x09af: 0xe0000856, - 0x09b0: 0x40056c20, 0x09b1: 0x4027b620, 0x09b2: 0x403fba20, 0x09b3: 0x403fc220, - 0x09b4: 0x403fc420, 0x09b5: 0x403fc620, 0x09b6: 0x403fc820, 0x09b7: 0x403fca20, - 0x09b9: 0x403ffe20, 0x09ba: 0x40402a20, 0x09bb: 0x403ff220, - 0x09bc: 0x40400020, 0x09bd: 0x40403e20, 0x09be: 0x40400c20, 0x09bf: 0x40402220, - // Block 0x27, offset 0x9c0 - 0x09c1: 0xa000f202, 0x09c2: 0xa000f302, 0x09c3: 0xa000f402, - 0x09c5: 0x40407c20, 0x09c6: 0x40407e20, 0x09c7: 0x40408020, - 0x09c8: 0x40408220, 0x09c9: 0x40408420, 0x09ca: 0x40408620, 0x09cb: 0x40408820, - 0x09cc: 0x40408c20, 0x09cf: 0x40409020, - 0x09d0: 0x40409220, 0x09d3: 0x40409420, - 0x09d4: 0x40409620, 0x09d5: 0x40409820, 0x09d6: 0x40409a20, 0x09d7: 0x40409c20, - 0x09d8: 0x40409e20, 0x09d9: 0x4040a020, 0x09da: 0x4040a220, 0x09db: 0x4040a420, - 0x09dc: 0x4040a620, 0x09dd: 0x4040a820, 0x09de: 0x4040aa20, 0x09df: 0x4040ac20, - 0x09e0: 0x4040ae20, 0x09e1: 0x4040b020, 0x09e2: 0x4040b220, 0x09e3: 0x4040b420, - 0x09e4: 0x4040b620, 0x09e5: 0x4040b820, 0x09e6: 0x4040ba20, 0x09e7: 0x4040bc20, - 0x09e8: 0x4040be20, 0x09ea: 0x4040c020, 0x09eb: 0x4040c220, - 0x09ec: 0x4040c420, 0x09ed: 0x4040c620, 0x09ee: 0x4040c820, 0x09ef: 0x4040ca20, - 0x09f0: 0x4040cc20, 0x09f2: 0x4040d020, - 0x09f6: 0x4040d420, 0x09f7: 0x4040d620, - 0x09f8: 0x4040d820, 0x09f9: 0x4040da20, - 0x09fc: 0xa070f102, 0x09fd: 0x4040dc20, 0x09fe: 0x4040de20, 0x09ff: 0x4040e020, - // Block 0x28, offset 0xa00 - 0x0a00: 0x4040e220, 0x0a01: 0x4040e420, 0x0a02: 0x4040e620, 0x0a03: 0x4040e820, - 0x0a04: 0x4040ea20, 0x0a07: 0xc05a0191, - 0x0a08: 0x4040f220, 0x0a0b: 0x4040f420, - 0x0a0c: 0x4040f620, 0x0a0d: 0x8209207c, 0x0a0e: 0xe0001845, - 0x0a17: 0x4040fa20, - 0x0a1c: 0xe000183f, 0x0a1d: 0xe0001842, 0x0a1f: 0xe0001848, - 0x0a20: 0x40408a20, 0x0a21: 0x40408e20, 0x0a22: 0x4040ec20, 0x0a23: 0x4040ee20, - 0x0a26: 0xe000016d, 0x0a27: 0xe00001fb, - 0x0a28: 0xe0000316, 0x0a29: 0xe00003f0, 0x0a2a: 0xe00004cb, 0x0a2b: 0xe0000595, - 0x0a2c: 0xe0000660, 0x0a2d: 0xe0000708, 0x0a2e: 0xe00007b4, 0x0a2f: 0xe0000859, - 0x0a30: 0x4040ce20, 0x0a31: 0x4040d220, 0x0a32: 0x4027e820, 0x0a33: 0x4027ea20, - 0x0a34: 0x40283020, 0x0a35: 0x40283220, 0x0a36: 0x40283420, 0x0a37: 0x40283620, - 0x0a38: 0x40283820, 0x0a39: 0x40283a20, 0x0a3a: 0x40073a20, 0x0a3b: 0x4027ec20, - // Block 0x29, offset 0xa40 - 0x0a41: 0xa000f202, 0x0a42: 0xa000f302, 0x0a43: 0xa000f402, - 0x0a45: 0x40410620, 0x0a46: 0x40410820, 0x0a47: 0x40411020, - 0x0a48: 0x40411220, 0x0a49: 0x40410020, 0x0a4a: 0x40410220, - 0x0a4f: 0x40411420, - 0x0a50: 0x40410a20, 0x0a53: 0x40410420, - 0x0a54: 0x40410c20, 0x0a55: 0x40411c20, 0x0a56: 0x40411e20, 0x0a57: 0x40412020, - 0x0a58: 0x40412220, 0x0a59: 0x40412420, 0x0a5a: 0x40412620, 0x0a5b: 0x40412820, - 0x0a5c: 0x40412a20, 0x0a5d: 0x40412c20, 0x0a5e: 0x40412e20, 0x0a5f: 0x40413020, - 0x0a60: 0x40413220, 0x0a61: 0x40413420, 0x0a62: 0x40413620, 0x0a63: 0x40413820, - 0x0a64: 0x40413a20, 0x0a65: 0x40413c20, 0x0a66: 0x40413e20, 0x0a67: 0x40414020, - 0x0a68: 0x40414220, 0x0a6a: 0x40414420, 0x0a6b: 0x40414620, - 0x0a6c: 0x40414820, 0x0a6d: 0x40414a20, 0x0a6e: 0x40414c20, 0x0a6f: 0x40414e20, - 0x0a70: 0x40415220, 0x0a72: 0x40415420, 0x0a73: 0xe000185a, - 0x0a75: 0x40415620, 0x0a76: 0xe000184b, - 0x0a78: 0x40411620, 0x0a79: 0x40411820, - 0x0a7c: 0xa070f102, 0x0a7e: 0x40415a20, 0x0a7f: 0x40415c20, - // Block 0x2a, offset 0xa80 - 0x0a80: 0x40415e20, 0x0a81: 0x40416020, 0x0a82: 0x40416220, - 0x0a87: 0x40416420, - 0x0a88: 0x40416620, 0x0a8b: 0x40416820, - 0x0a8c: 0x40416a20, 0x0a8d: 0x820920b6, - 0x0a91: 0x40411a20, - 0x0a99: 0xe000184e, 0x0a9a: 0xe0001851, 0x0a9b: 0xe0001854, - 0x0a9c: 0x40415820, 0x0a9e: 0xe0001857, - 0x0aa6: 0xe0000170, 0x0aa7: 0xe00001fe, - 0x0aa8: 0xe0000319, 0x0aa9: 0xe00003f3, 0x0aaa: 0xe00004ce, 0x0aab: 0xe0000598, - 0x0aac: 0xe0000663, 0x0aad: 0xe000070b, 0x0aae: 0xe00007b7, 0x0aaf: 0xe000085c, - 0x0ab0: 0xa000f502, 0x0ab1: 0xa000f602, 0x0ab2: 0x40410e20, 0x0ab3: 0x4040fe20, - 0x0ab4: 0x4040fc20, 0x0ab5: 0x40415020, - // Block 0x2b, offset 0xac0 - 0x0ac1: 0xa000f202, 0x0ac2: 0xa000f302, 0x0ac3: 0xa000f402, - 0x0ac5: 0x40417020, 0x0ac6: 0x40417220, 0x0ac7: 0x40417420, - 0x0ac8: 0x40417620, 0x0ac9: 0x40417820, 0x0aca: 0x40417a20, 0x0acb: 0x40417c20, - 0x0acc: 0x40418020, 0x0acd: 0x40418420, 0x0acf: 0x40418620, - 0x0ad0: 0x40418820, 0x0ad1: 0x40418a20, 0x0ad3: 0x40418c20, - 0x0ad4: 0x40418e20, 0x0ad5: 0x40419020, 0x0ad6: 0x40419220, 0x0ad7: 0x40419420, - 0x0ad8: 0x40419620, 0x0ad9: 0x40419820, 0x0ada: 0x40419a20, 0x0adb: 0x40419c20, - 0x0adc: 0x40419e20, 0x0add: 0x4041a020, 0x0ade: 0x4041a220, 0x0adf: 0x4041a420, - 0x0ae0: 0x4041a620, 0x0ae1: 0x4041a820, 0x0ae2: 0x4041aa20, 0x0ae3: 0x4041ac20, - 0x0ae4: 0x4041ae20, 0x0ae5: 0x4041b020, 0x0ae6: 0x4041b220, 0x0ae7: 0x4041b420, - 0x0ae8: 0x4041b620, 0x0aea: 0x4041b820, 0x0aeb: 0x4041ba20, - 0x0aec: 0x4041bc20, 0x0aed: 0x4041be20, 0x0aee: 0x4041c020, 0x0aef: 0x4041c220, - 0x0af0: 0x4041c420, 0x0af2: 0x4041c620, 0x0af3: 0x4041d220, - 0x0af5: 0x4041c820, 0x0af6: 0x4041ca20, 0x0af7: 0x4041cc20, - 0x0af8: 0x4041ce20, 0x0af9: 0x4041d020, - 0x0afc: 0xa070f102, 0x0afd: 0x4041d420, 0x0afe: 0x4041d620, 0x0aff: 0x4041d820, - // Block 0x2c, offset 0xb00 - 0x0b00: 0x4041da20, 0x0b01: 0x4041dc20, 0x0b02: 0x4041de20, 0x0b03: 0x4041e020, - 0x0b04: 0x4041e220, 0x0b05: 0x4041e820, 0x0b07: 0x4041ea20, - 0x0b08: 0x4041ec20, 0x0b09: 0x4041ee20, 0x0b0b: 0x4041f020, - 0x0b0c: 0x4041f220, 0x0b0d: 0x820920fa, - 0x0b10: 0x40416e20, - 0x0b20: 0x40417e20, 0x0b21: 0x40418220, 0x0b22: 0x4041e420, 0x0b23: 0x4041e620, - 0x0b26: 0xe0000173, 0x0b27: 0xe0000201, - 0x0b28: 0xe000031c, 0x0b29: 0xe00003f6, 0x0b2a: 0xe00004d1, 0x0b2b: 0xe000059b, - 0x0b2c: 0xe0000666, 0x0b2d: 0xe000070e, 0x0b2e: 0xe00007ba, 0x0b2f: 0xe000085f, - 0x0b30: 0x40057420, 0x0b31: 0x4027ee20, - // Block 0x2d, offset 0xb40 - 0x0b41: 0xa000f202, 0x0b42: 0xa000f302, 0x0b43: 0xa000f402, - 0x0b45: 0x4041f620, 0x0b46: 0x4041f820, 0x0b47: 0x4041fa20, - 0x0b48: 0x4041fc20, 0x0b49: 0x4041fe20, 0x0b4a: 0x40420020, 0x0b4b: 0x40420220, - 0x0b4c: 0x40420620, 0x0b4f: 0x40420a20, - 0x0b50: 0x40420c20, 0x0b53: 0x40420e20, - 0x0b54: 0x40421020, 0x0b55: 0x40421220, 0x0b56: 0x40421420, 0x0b57: 0x40421620, - 0x0b58: 0x40421820, 0x0b59: 0x40421a20, 0x0b5a: 0x40421c20, 0x0b5b: 0x40421e20, - 0x0b5c: 0x40422020, 0x0b5d: 0x40422220, 0x0b5e: 0x40422420, 0x0b5f: 0x40422620, - 0x0b60: 0x40422820, 0x0b61: 0x40422a20, 0x0b62: 0x40422c20, 0x0b63: 0x40422e20, - 0x0b64: 0x40423020, 0x0b65: 0x40423220, 0x0b66: 0x40423420, 0x0b67: 0x40423620, - 0x0b68: 0x40423820, 0x0b6a: 0x40423a20, 0x0b6b: 0x40423c20, - 0x0b6c: 0x40423e20, 0x0b6d: 0x40424020, 0x0b6e: 0x40424220, 0x0b6f: 0x40424420, - 0x0b70: 0x40424820, 0x0b72: 0x40424a20, 0x0b73: 0x40424c20, - 0x0b75: 0x40424e20, 0x0b76: 0x40425220, 0x0b77: 0x40425420, - 0x0b78: 0x40425620, 0x0b79: 0x40425820, - 0x0b7c: 0xa070f102, 0x0b7d: 0x40425a20, 0x0b7e: 0x40425c20, 0x0b7f: 0x40425e20, - // Block 0x2e, offset 0xb80 - 0x0b80: 0x40426020, 0x0b81: 0x40426220, 0x0b82: 0x40426420, 0x0b83: 0x40426620, - 0x0b84: 0x40426820, 0x0b87: 0xc05d01e1, - 0x0b88: 0x40427020, 0x0b8b: 0x40427220, - 0x0b8c: 0x40427420, 0x0b8d: 0x8209213b, - 0x0b96: 0x40427820, 0x0b97: 0x40427a20, - 0x0b9c: 0xe000185d, 0x0b9d: 0xe0001860, 0x0b9f: 0x40424620, - 0x0ba0: 0x40420420, 0x0ba1: 0x40420820, 0x0ba2: 0x40426a20, 0x0ba3: 0x40426c20, - 0x0ba6: 0xe0000176, 0x0ba7: 0xe0000204, - 0x0ba8: 0xe000031f, 0x0ba9: 0xe00003f9, 0x0baa: 0xe00004d4, 0x0bab: 0xe000059e, - 0x0bac: 0xe0000669, 0x0bad: 0xe0000711, 0x0bae: 0xe00007bd, 0x0baf: 0xe0000862, - 0x0bb0: 0x40073c20, 0x0bb1: 0x40425020, 0x0bb2: 0x40283c20, 0x0bb3: 0x40283e20, - 0x0bb4: 0x40284020, 0x0bb5: 0x40284220, 0x0bb6: 0x40284420, 0x0bb7: 0x40284620, - // Block 0x2f, offset 0xbc0 - 0x0bc2: 0xa000f302, 0x0bc3: 0x40429620, - 0x0bc5: 0x40427e20, 0x0bc6: 0x40428020, 0x0bc7: 0x40428220, - 0x0bc8: 0x40428420, 0x0bc9: 0x40428620, 0x0bca: 0x40428820, - 0x0bce: 0x40428a20, 0x0bcf: 0x40428c20, - 0x0bd0: 0x40428e20, 0x0bd2: 0xc0610231, 0x0bd3: 0x40429220, - 0x0bd4: 0x40429420, 0x0bd5: 0x40429820, - 0x0bd9: 0x40429a20, 0x0bda: 0x40429c20, - 0x0bdc: 0x4042bc20, 0x0bde: 0x40429e20, 0x0bdf: 0x4042a020, - 0x0be3: 0x4042a220, - 0x0be4: 0x4042a420, - 0x0be8: 0x4042a620, 0x0be9: 0x4042ba20, 0x0bea: 0x4042a820, - 0x0bee: 0x4042aa20, 0x0bef: 0x4042ac20, - 0x0bf0: 0x4042ae20, 0x0bf1: 0x4042b820, 0x0bf2: 0x4042b020, 0x0bf3: 0x4042b620, - 0x0bf4: 0x4042b420, 0x0bf5: 0x4042b220, 0x0bf6: 0x4042be20, 0x0bf7: 0x4042c020, - 0x0bf8: 0x4042c220, 0x0bf9: 0x4042c420, - 0x0bfe: 0x4042c620, 0x0bff: 0x4042c820, - // Block 0x30, offset 0xc00 - 0x0c00: 0x4042ca20, 0x0c01: 0x4042cc20, 0x0c02: 0x4042ce20, - 0x0c06: 0xc0630261, 0x0c07: 0xc06602b1, - 0x0c08: 0x4042d420, 0x0c0a: 0x4042d620, 0x0c0b: 0x4042d820, - 0x0c0c: 0x4042da20, 0x0c0d: 0x8209216e, - 0x0c10: 0x40427c20, - 0x0c17: 0x4042de20, - 0x0c26: 0xe0000179, 0x0c27: 0xe0000207, - 0x0c28: 0xe0000322, 0x0c29: 0xe00003fc, 0x0c2a: 0xe00004d7, 0x0c2b: 0xe00005a1, - 0x0c2c: 0xe000066c, 0x0c2d: 0xe0000714, 0x0c2e: 0xe00007c0, 0x0c2f: 0xe0000865, - 0x0c30: 0x40285420, 0x0c31: 0x40285620, 0x0c32: 0x40285820, 0x0c33: 0x40073e20, - 0x0c34: 0x40074020, 0x0c35: 0x40074220, 0x0c36: 0x40074420, 0x0c37: 0x40074620, - 0x0c38: 0x40074820, 0x0c39: 0x4027f220, 0x0c3a: 0x40074a20, - // Block 0x31, offset 0xc40 - 0x0c41: 0xa000f202, 0x0c42: 0xa000f302, 0x0c43: 0xa000f402, - 0x0c45: 0x4042e020, 0x0c46: 0x4042e220, 0x0c47: 0x4042e420, - 0x0c48: 0x4042e620, 0x0c49: 0x4042e820, 0x0c4a: 0x4042ea20, 0x0c4b: 0x4042ec20, - 0x0c4c: 0x4042f020, 0x0c4e: 0x4042f420, 0x0c4f: 0x4042f620, - 0x0c50: 0x4042f820, 0x0c52: 0x4042fa20, 0x0c53: 0x4042fc20, - 0x0c54: 0x4042fe20, 0x0c55: 0x40430020, 0x0c56: 0x40430220, 0x0c57: 0x40430420, - 0x0c58: 0x40430620, 0x0c59: 0x40430820, 0x0c5a: 0x40430a20, 0x0c5b: 0x40430e20, - 0x0c5c: 0x40431020, 0x0c5d: 0x40431420, 0x0c5e: 0x40431620, 0x0c5f: 0x40431820, - 0x0c60: 0x40431a20, 0x0c61: 0x40431c20, 0x0c62: 0x40431e20, 0x0c63: 0x40432020, - 0x0c64: 0x40432220, 0x0c65: 0x40432420, 0x0c66: 0x40432620, 0x0c67: 0x40432820, - 0x0c68: 0x40432a20, 0x0c6a: 0x40432c20, 0x0c6b: 0x40432e20, - 0x0c6c: 0x40433020, 0x0c6d: 0x40433220, 0x0c6e: 0x40433420, 0x0c6f: 0x40433620, - 0x0c70: 0x40433820, 0x0c71: 0x40433a20, 0x0c72: 0x40433c20, 0x0c73: 0x40434820, - 0x0c75: 0x40433e20, 0x0c76: 0x40434020, 0x0c77: 0x40434220, - 0x0c78: 0x40434420, 0x0c79: 0x40434620, - 0x0c7d: 0x40434a20, 0x0c7e: 0x40434c20, 0x0c7f: 0x40434e20, - // Block 0x32, offset 0xc80 - 0x0c80: 0x40435020, 0x0c81: 0x40435220, 0x0c82: 0x40435420, 0x0c83: 0x40435620, - 0x0c84: 0x40435820, 0x0c86: 0xc06802e1, 0x0c87: 0x40436020, - 0x0c88: 0x40436220, 0x0c8a: 0x40436420, 0x0c8b: 0x40436620, - 0x0c8c: 0x40436820, 0x0c8d: 0x820921b5, - 0x0c95: 0x825421b6, 0x0c96: 0x825b21b7, - 0x0c98: 0x40430c20, 0x0c99: 0x40431220, - 0x0ca0: 0x4042ee20, 0x0ca1: 0x4042f220, 0x0ca2: 0x40435a20, 0x0ca3: 0x40435c20, - 0x0ca6: 0xe000017c, 0x0ca7: 0xe000020a, - 0x0ca8: 0xe0000325, 0x0ca9: 0xe00003ff, 0x0caa: 0xe00004da, 0x0cab: 0xe00005a4, - 0x0cac: 0xe000066f, 0x0cad: 0xe0000717, 0x0cae: 0xe00007c3, 0x0caf: 0xe0000868, - 0x0cb8: 0xe000017f, 0x0cb9: 0xe000020d, 0x0cba: 0xe0000328, 0x0cbb: 0xe0000402, - 0x0cbc: 0xe0000210, 0x0cbd: 0xe000032b, 0x0cbe: 0xe0000405, 0x0cbf: 0x40074c20, - // Block 0x33, offset 0xcc0 - 0x0cc2: 0xa000f302, 0x0cc3: 0xa000f402, - 0x0cc5: 0x40437020, 0x0cc6: 0x40437220, 0x0cc7: 0x40437420, - 0x0cc8: 0x40437620, 0x0cc9: 0x40437820, 0x0cca: 0x40437a20, 0x0ccb: 0x40437c20, - 0x0ccc: 0x40438020, 0x0cce: 0x40438420, 0x0ccf: 0x40438620, - 0x0cd0: 0x40438820, 0x0cd2: 0x40438a20, 0x0cd3: 0x40438c20, - 0x0cd4: 0x40438e20, 0x0cd5: 0x40439020, 0x0cd6: 0x40439220, 0x0cd7: 0x40439420, - 0x0cd8: 0x40439620, 0x0cd9: 0x40439820, 0x0cda: 0x40439a20, 0x0cdb: 0x40439c20, - 0x0cdc: 0x40439e20, 0x0cdd: 0x4043a020, 0x0cde: 0x4043a220, 0x0cdf: 0x4043a420, - 0x0ce0: 0x4043a620, 0x0ce1: 0x4043a820, 0x0ce2: 0x4043aa20, 0x0ce3: 0x4043ac20, - 0x0ce4: 0x4043ae20, 0x0ce5: 0x4043b020, 0x0ce6: 0x4043b220, 0x0ce7: 0x4043b420, - 0x0ce8: 0x4043b620, 0x0cea: 0x4043b820, 0x0ceb: 0x4043ba20, - 0x0cec: 0x4043bc20, 0x0ced: 0x4043be20, 0x0cee: 0x4043c020, 0x0cef: 0x4043c220, - 0x0cf0: 0x4043c420, 0x0cf1: 0x4043c620, 0x0cf2: 0x4043c820, 0x0cf3: 0x4043d420, - 0x0cf5: 0x4043ca20, 0x0cf6: 0x4043cc20, 0x0cf7: 0x4043ce20, - 0x0cf8: 0x4043d020, 0x0cf9: 0x4043d220, - 0x0cfc: 0xa070f102, 0x0cfd: 0x4043d820, 0x0cfe: 0x4043de20, 0x0cff: 0xc06a0311, - // Block 0x34, offset 0xd00 - 0x0d00: 0x4043e220, 0x0d01: 0x4043e420, 0x0d02: 0x4043e620, 0x0d03: 0x4043e820, - 0x0d04: 0x4043ea20, 0x0d06: 0xc06c0341, 0x0d07: 0x4043f220, - 0x0d08: 0x4043f420, 0x0d0a: 0xc0710311, 0x0d0b: 0x4043f820, - 0x0d0c: 0x4043fa20, 0x0d0d: 0x820921fe, - 0x0d15: 0x4043fe20, 0x0d16: 0x40440020, - 0x0d1e: 0x4043d620, - 0x0d20: 0x40437e20, 0x0d21: 0x40438220, 0x0d22: 0x4043ec20, 0x0d23: 0x4043ee20, - 0x0d26: 0xe0000182, 0x0d27: 0xe0000213, - 0x0d28: 0xe000032e, 0x0d29: 0xe0000408, 0x0d2a: 0xe00004dd, 0x0d2b: 0xe00005a7, - 0x0d2c: 0xe0000672, 0x0d2d: 0xe000071a, 0x0d2e: 0xe00007c6, 0x0d2f: 0xe000086b, - 0x0d31: 0x4043da20, 0x0d32: 0x4043dc20, - // Block 0x35, offset 0xd40 - 0x0d42: 0xa000f302, 0x0d43: 0xa000f402, - 0x0d45: 0x40440220, 0x0d46: 0x40440420, 0x0d47: 0x40440620, - 0x0d48: 0x40440820, 0x0d49: 0x40440a20, 0x0d4a: 0x40440c20, 0x0d4b: 0x40440e20, - 0x0d4c: 0x40441220, 0x0d4e: 0x40441620, 0x0d4f: 0x40441820, - 0x0d50: 0x40441a20, 0x0d52: 0x40441c20, 0x0d53: 0x40441e20, - 0x0d54: 0x40442020, 0x0d55: 0x40442220, 0x0d56: 0x40442420, 0x0d57: 0x40442620, - 0x0d58: 0x40442820, 0x0d59: 0x40442a20, 0x0d5a: 0x40442c20, 0x0d5b: 0x40442e20, - 0x0d5c: 0x40443020, 0x0d5d: 0x40443220, 0x0d5e: 0x40443420, 0x0d5f: 0x40443620, - 0x0d60: 0x40443820, 0x0d61: 0x40443a20, 0x0d62: 0x40443c20, 0x0d63: 0x40443e20, - 0x0d64: 0x40444020, 0x0d65: 0x40444220, 0x0d66: 0x40444420, 0x0d67: 0x40444620, - 0x0d68: 0x40444820, 0x0d69: 0x40444a20, 0x0d6a: 0x40444c20, 0x0d6b: 0x40444e20, - 0x0d6c: 0x40445020, 0x0d6d: 0x40445220, 0x0d6e: 0x40445420, 0x0d6f: 0x40445620, - 0x0d70: 0x40445820, 0x0d71: 0x40446a20, 0x0d72: 0x40445a20, 0x0d73: 0x40446620, - 0x0d74: 0x40446820, 0x0d75: 0x40445c20, 0x0d76: 0x40445e20, 0x0d77: 0x40446020, - 0x0d78: 0x40446220, 0x0d79: 0x40446420, 0x0d7a: 0x40446c20, - 0x0d7d: 0x40446e20, 0x0d7e: 0x40447020, 0x0d7f: 0x40447220, - // Block 0x36, offset 0xd80 - 0x0d80: 0x40447420, 0x0d81: 0x40447620, 0x0d82: 0x40447820, 0x0d83: 0x40447a20, - 0x0d84: 0x40447c20, 0x0d86: 0xc07303b1, 0x0d87: 0xc0760401, - 0x0d88: 0x40448620, 0x0d8a: 0x40448820, 0x0d8b: 0x40448a20, - 0x0d8c: 0x40448c20, 0x0d8d: 0x82092248, 0x0d8e: 0xe000186c, - 0x0d97: 0x40448e20, - 0x0da0: 0x40441020, 0x0da1: 0x40441420, 0x0da2: 0x40447e20, 0x0da3: 0x40448020, - 0x0da6: 0xe0000185, 0x0da7: 0xe0000216, - 0x0da8: 0xe0000331, 0x0da9: 0xe000040b, 0x0daa: 0xe00004e0, 0x0dab: 0xe00005aa, - 0x0dac: 0xe0000675, 0x0dad: 0xe000071d, 0x0dae: 0xe00007c9, 0x0daf: 0xe000086e, - 0x0db0: 0x40285a20, 0x0db1: 0x40285c20, 0x0db2: 0x40285e20, 0x0db3: 0x40286020, - 0x0db4: 0x40286220, 0x0db5: 0x40286420, - 0x0db9: 0x40074e20, 0x0dba: 0xe0001866, 0x0dbb: 0xe0001869, - 0x0dbc: 0xe000186f, 0x0dbd: 0xe0001872, 0x0dbe: 0xe0001875, 0x0dbf: 0xe0001863, - // Block 0x37, offset 0xdc0 - 0x0dc2: 0xa000f302, 0x0dc3: 0xa000f402, - 0x0dc5: 0x40449220, 0x0dc6: 0x40449420, 0x0dc7: 0x40449620, - 0x0dc8: 0x40449820, 0x0dc9: 0x40449a20, 0x0dca: 0x40449c20, 0x0dcb: 0x40449e20, - 0x0dcc: 0x4044a020, 0x0dcd: 0x4044a220, 0x0dce: 0x4044a420, 0x0dcf: 0x4044a620, - 0x0dd0: 0x4044a820, 0x0dd1: 0x4044aa20, 0x0dd2: 0x4044ac20, 0x0dd3: 0x4044ae20, - 0x0dd4: 0x4044b020, 0x0dd5: 0x4044b220, 0x0dd6: 0x4044b420, - 0x0dda: 0x4044b620, 0x0ddb: 0x4044b820, - 0x0ddc: 0x4044ba20, 0x0ddd: 0x4044bc20, 0x0dde: 0x4044be20, 0x0ddf: 0x4044c020, - 0x0de0: 0x4044c220, 0x0de1: 0x4044c420, 0x0de2: 0x4044c620, 0x0de3: 0x4044c820, - 0x0de4: 0x4044ca20, 0x0de5: 0x4044cc20, 0x0de6: 0x4044ce20, 0x0de7: 0x4044d020, - 0x0de8: 0x4044d220, 0x0de9: 0x4044d420, 0x0dea: 0x4044d620, 0x0deb: 0x4044d820, - 0x0dec: 0x4044da20, 0x0ded: 0x4044dc20, 0x0dee: 0x4044de20, 0x0def: 0x4044e020, - 0x0df0: 0x4044e220, 0x0df1: 0x4044e420, 0x0df3: 0x4044e620, - 0x0df4: 0x4044e820, 0x0df5: 0x4044ea20, 0x0df6: 0x4044ec20, 0x0df7: 0x4044ee20, - 0x0df8: 0x4044f020, 0x0df9: 0x4044f220, 0x0dfa: 0x4044f420, 0x0dfb: 0x4044f620, - 0x0dfd: 0x4044f820, - // Block 0x38, offset 0xe00 - 0x0e00: 0x4044fa20, 0x0e01: 0x4044fc20, 0x0e02: 0x4044fe20, 0x0e03: 0x40450020, - 0x0e04: 0x40450220, 0x0e05: 0x40450420, 0x0e06: 0x40450620, - 0x0e0a: 0x82092295, - 0x0e0f: 0x40450820, - 0x0e10: 0x40450a20, 0x0e11: 0x40450c20, 0x0e12: 0x40450e20, 0x0e13: 0x40451020, - 0x0e14: 0x40451220, 0x0e16: 0x40451420, - 0x0e18: 0x40451620, 0x0e19: 0xc0780431, 0x0e1a: 0x40452020, 0x0e1b: 0x40452220, - 0x0e1c: 0xc07d04b1, 0x0e1d: 0x40452620, 0x0e1e: 0x40452820, 0x0e1f: 0x40451a20, - 0x0e32: 0x40451820, 0x0e33: 0x40451c20, - 0x0e34: 0x40057620, - // Block 0x39, offset 0xe40 - 0x0e41: 0x40491020, 0x0e42: 0x40491220, 0x0e43: 0x40491420, - 0x0e44: 0x40491620, 0x0e45: 0x40491820, 0x0e46: 0x40491a20, 0x0e47: 0x40491c20, - 0x0e48: 0x40491e20, 0x0e49: 0x40492020, 0x0e4a: 0x40492220, 0x0e4b: 0x40492420, - 0x0e4c: 0x40492620, 0x0e4d: 0x40492820, 0x0e4e: 0x40492a20, 0x0e4f: 0x40492c20, - 0x0e50: 0x40492e20, 0x0e51: 0x40493020, 0x0e52: 0x40493220, 0x0e53: 0x40493420, - 0x0e54: 0x40493620, 0x0e55: 0x40493820, 0x0e56: 0x40493a20, 0x0e57: 0x40493c20, - 0x0e58: 0x40493e20, 0x0e59: 0x40494020, 0x0e5a: 0x40494220, 0x0e5b: 0x40494420, - 0x0e5c: 0x40494620, 0x0e5d: 0x40494820, 0x0e5e: 0x40494a20, 0x0e5f: 0x40494c20, - 0x0e60: 0x40494e20, 0x0e61: 0x40495020, 0x0e62: 0x40495220, 0x0e63: 0x40495420, - 0x0e64: 0x40495620, 0x0e65: 0x40495820, 0x0e66: 0x40495a20, 0x0e67: 0x40495c20, - 0x0e68: 0x40495e20, 0x0e69: 0x40496020, 0x0e6a: 0x40496220, 0x0e6b: 0x40496420, - 0x0e6c: 0x40496620, 0x0e6d: 0x40496820, 0x0e6e: 0x40496a20, 0x0e6f: 0x40496c20, - 0x0e70: 0x40496e20, 0x0e71: 0x40497020, 0x0e72: 0x40497220, 0x0e73: 0x40497420, - 0x0e74: 0x40497620, 0x0e75: 0x40497820, 0x0e76: 0x40497a20, 0x0e77: 0x40497c20, - 0x0e78: 0x826724bf, 0x0e79: 0x826724c0, 0x0e7a: 0x820924c1, - 0x0e7f: 0x4027f420, - // Block 0x3a, offset 0xe80 - 0x0e80: 0xc07f04e1, 0x0e81: 0xc0ae04e1, 0x0e82: 0xc0dd04e1, 0x0e83: 0xc10c04e1, - 0x0e84: 0xc13b04e1, 0x0e85: 0x40498e20, 0x0e86: 0x4027b820, 0x0e87: 0xa000ff02, - 0x0e88: 0xa6b10002, 0x0e89: 0xa6b10102, 0x0e8a: 0xa6b10202, 0x0e8b: 0xa6b10302, - 0x0e8c: 0xa0010402, 0x0e8d: 0xc16a0511, 0x0e8e: 0xa000fe02, 0x0e8f: 0x40057820, - 0x0e90: 0xe000019a, 0x0e91: 0xe000022e, 0x0e92: 0xe0000346, 0x0e93: 0xe0000420, - 0x0e94: 0xe00004f5, 0x0e95: 0xe00005bf, 0x0e96: 0xe000068a, 0x0e97: 0xe0000732, - 0x0e98: 0xe00007de, 0x0e99: 0xe0000883, 0x0e9a: 0x40057a20, 0x0e9b: 0x40057c20, - // Block 0x3b, offset 0xec0 - 0x0ec1: 0x40499220, 0x0ec2: 0x40499420, - 0x0ec4: 0x40499620, 0x0ec7: 0x40499820, - 0x0ec8: 0x40499a20, 0x0eca: 0x40499e20, - 0x0ecd: 0x4049a220, - 0x0ed4: 0x4049a420, 0x0ed5: 0x4049a620, 0x0ed6: 0x4049a820, 0x0ed7: 0x4049aa20, - 0x0ed9: 0x4049ac20, 0x0eda: 0x4049ae20, 0x0edb: 0x4049b020, - 0x0edc: 0x4049b220, 0x0edd: 0x4049b420, 0x0ede: 0x4049b620, 0x0edf: 0x4049b820, - 0x0ee1: 0x4049ba20, 0x0ee2: 0x4049bc20, 0x0ee3: 0x4049be20, - 0x0ee5: 0x4049c020, 0x0ee7: 0x4049c220, - 0x0eea: 0x40499c20, 0x0eeb: 0x4049c420, - 0x0eed: 0x4049c620, 0x0eee: 0x4049c820, 0x0eef: 0x4049ca20, - 0x0ef0: 0x4049cc20, 0x0ef1: 0x4049ce20, 0x0ef2: 0x4049d020, 0x0ef3: 0x4049d220, - 0x0ef4: 0x4049d420, 0x0ef5: 0x4049d620, 0x0ef6: 0x4049d820, 0x0ef7: 0x4049da20, - 0x0ef8: 0x827624ee, 0x0ef9: 0x827624ef, 0x0efb: 0x4049e020, - 0x0efc: 0x4049e220, 0x0efd: 0x4049e420, - // Block 0x3c, offset 0xf00 - 0x0f00: 0xc16c0541, 0x0f01: 0xc18c0541, 0x0f02: 0xc1ac0541, 0x0f03: 0xc1cc0541, - 0x0f04: 0xc1ec0541, 0x0f06: 0x4027ba20, - 0x0f08: 0xa7a10602, 0x0f09: 0xa7a10702, 0x0f0a: 0xa7a10802, 0x0f0b: 0xa7a10902, - 0x0f0c: 0xa0010a02, 0x0f0d: 0xc20c0641, - 0x0f10: 0xe000019d, 0x0f11: 0xe0000231, 0x0f12: 0xe0000349, 0x0f13: 0xe0000423, - 0x0f14: 0xe00004f8, 0x0f15: 0xe00005c2, 0x0f16: 0xe000068d, 0x0f17: 0xe0000735, - 0x0f18: 0xe00007e1, 0x0f19: 0xe0000886, - 0x0f1c: 0xf0000404, 0x0f1d: 0xf0000404, 0x0f1e: 0x40499020, 0x0f1f: 0x4049a020, - // Block 0x3d, offset 0xf40 - 0x0f40: 0xe000201a, 0x0f41: 0x40075e20, 0x0f42: 0x40076020, 0x0f43: 0x40076220, - 0x0f44: 0x40058220, 0x0f45: 0x40058420, 0x0f46: 0x40058620, 0x0f47: 0x40058820, - 0x0f48: 0x40058a20, 0x0f49: 0x40058c20, 0x0f4a: 0x40058e20, 0x0f4b: 0x40059420, - 0x0f4c: 0x0005949b, 0x0f4d: 0x40059620, 0x0f4e: 0x40059820, 0x0f4f: 0x40059a20, - 0x0f50: 0x40059c20, 0x0f51: 0x40059e20, 0x0f52: 0x4005a020, 0x0f53: 0x40076420, - 0x0f54: 0x4002aa20, 0x0f55: 0x40076620, 0x0f56: 0x40076820, 0x0f57: 0x40076a20, - 0x0f58: 0xadc00000, 0x0f59: 0xadc00000, 0x0f5a: 0x40076c20, 0x0f5b: 0x40076e20, - 0x0f5c: 0x40077020, 0x0f5d: 0x40077220, 0x0f5e: 0x40077420, 0x0f5f: 0x40077620, - 0x0f60: 0xe00001a0, 0x0f61: 0xe0000234, 0x0f62: 0xe000034c, 0x0f63: 0xe0000426, - 0x0f64: 0xe00004fb, 0x0f65: 0xe00005c5, 0x0f66: 0xe0000690, 0x0f67: 0xe0000738, - 0x0f68: 0xe00007e4, 0x0f69: 0xe0000889, 0x0f6a: 0xe0000237, 0x0f6b: 0xe000034f, - 0x0f6c: 0xe0000429, 0x0f6d: 0xe00004fe, 0x0f6e: 0xe00005c8, 0x0f6f: 0xe0000693, - 0x0f70: 0xe000073b, 0x0f71: 0xe00007e7, 0x0f72: 0xe000088c, 0x0f73: 0xe00001a3, - 0x0f74: 0x40077820, 0x0f75: 0xadc00000, 0x0f76: 0x40077a20, 0x0f77: 0xadc00000, - 0x0f78: 0x40077c20, 0x0f79: 0xad810e02, 0x0f7a: 0x40040020, 0x0f7b: 0x40040220, - 0x0f7c: 0x40040420, 0x0f7d: 0x40040620, 0x0f7e: 0xa0000000, 0x0f7f: 0xa0000000, - // Block 0x3e, offset 0xf80 - 0x0f80: 0x404a7620, 0x0f81: 0x404a7c20, 0x0f82: 0x404a8020, 0x0f83: 0xe0001fe4, - 0x0f84: 0x404a8420, 0x0f85: 0x404a8820, 0x0f86: 0x404a8c20, 0x0f87: 0x404a9020, - 0x0f89: 0x404a9420, 0x0f8a: 0x404a9820, 0x0f8b: 0x404a9c20, - 0x0f8c: 0x404aa020, 0x0f8d: 0xe0001fea, 0x0f8e: 0x404aa420, 0x0f8f: 0x404aa820, - 0x0f90: 0x404aac20, 0x0f91: 0x404ab020, 0x0f92: 0xe0001ff0, 0x0f93: 0x404ab420, - 0x0f94: 0x404ab820, 0x0f95: 0x404abc20, 0x0f96: 0x404ac020, 0x0f97: 0xe0001ff6, - 0x0f98: 0x404ac420, 0x0f99: 0x404ac820, 0x0f9a: 0x404acc20, 0x0f9b: 0x404ad020, - 0x0f9c: 0xe0001ffc, 0x0f9d: 0x404ad420, 0x0f9e: 0x404ad820, 0x0f9f: 0x404adc20, - 0x0fa0: 0x404ae020, 0x0fa1: 0x404ae420, 0x0fa2: 0x404ae820, 0x0fa3: 0x404aee20, - 0x0fa4: 0x404af220, 0x0fa5: 0x404af620, 0x0fa6: 0x404afa20, 0x0fa7: 0x404afe20, - 0x0fa8: 0x404b0220, 0x0fa9: 0xe0001fde, 0x0faa: 0xe0002008, 0x0fab: 0x404a7a20, - 0x0fac: 0x404aec20, - 0x0fb1: 0xc30f0751, 0x0fb2: 0x8282258c, 0x0fb3: 0x8281258d, - 0x0fb4: 0x82842590, 0x0fb5: 0x82812591, 0x0fb6: 0x404b2420, 0x0fb7: 0x404b2620, - 0x0fb8: 0x404b2820, 0x0fb9: 0x404b2a20, 0x0fba: 0x82822596, 0x0fbb: 0x82822597, - 0x0fbc: 0x82822598, 0x0fbd: 0x82822599, 0x0fbe: 0xa000f302, 0x0fbf: 0xa000f402, - // Block 0x3f, offset 0xfc0 - 0x0fc0: 0x8282258e, 0x0fc1: 0x8281258f, 0x0fc2: 0xae600000, 0x0fc3: 0xae600000, - 0x0fc4: 0x8209259a, 0x0fc5: 0x4005a220, 0x0fc6: 0xae600000, 0x0fc7: 0xae600000, - 0x0fc8: 0x404b0620, 0x0fc9: 0x404b0a20, 0x0fca: 0x404b1220, 0x0fcb: 0x404b1420, - 0x0fcc: 0x404b0e20, 0x0fcd: 0x404b0820, 0x0fce: 0x404b0c20, 0x0fcf: 0x404b1020, - 0x0fd0: 0x404a7820, 0x0fd1: 0x404a7e20, 0x0fd2: 0x404a8220, 0x0fd3: 0xe0001fe7, - 0x0fd4: 0x404a8620, 0x0fd5: 0x404a8a20, 0x0fd6: 0x404a8e20, 0x0fd7: 0x404a9220, - 0x0fd9: 0x404a9620, 0x0fda: 0x404a9a20, 0x0fdb: 0x404a9e20, - 0x0fdc: 0x404aa220, 0x0fdd: 0xe0001fed, 0x0fde: 0x404aa620, 0x0fdf: 0x404aaa20, - 0x0fe0: 0x404aae20, 0x0fe1: 0x404ab220, 0x0fe2: 0xe0001ff3, 0x0fe3: 0x404ab620, - 0x0fe4: 0x404aba20, 0x0fe5: 0x404abe20, 0x0fe6: 0x404ac220, 0x0fe7: 0xe0001ff9, - 0x0fe8: 0x404ac620, 0x0fe9: 0x404aca20, 0x0fea: 0x404ace20, 0x0feb: 0x404ad220, - 0x0fec: 0xe0001fff, 0x0fed: 0x404ad620, 0x0fee: 0x404ada20, 0x0fef: 0x404ade20, - 0x0ff0: 0x404ae220, 0x0ff1: 0x404ae620, 0x0ff2: 0xc30306a1, 0x0ff3: 0xc30906a1, - 0x0ff4: 0x404af420, 0x0ff5: 0x404af820, 0x0ff6: 0x404afc20, 0x0ff7: 0x404b0020, - 0x0ff8: 0x404b0420, 0x0ff9: 0xe0001fe1, 0x0ffa: 0xe0002002, 0x0ffb: 0xe0002005, - 0x0ffc: 0xe000200b, 0x0ffe: 0x40077e20, 0x0fff: 0x40078020, - // Block 0x40, offset 0x1000 - 0x1000: 0x40078220, 0x1001: 0x40078420, 0x1002: 0x40078620, 0x1003: 0x40078820, - 0x1004: 0x40078a20, 0x1005: 0x40078c20, 0x1006: 0xadc00000, 0x1007: 0x40078e20, - 0x1008: 0x40079020, 0x1009: 0x40079220, 0x100a: 0x40079420, 0x100b: 0x40079620, - 0x100c: 0x40079820, 0x100e: 0x40079a20, 0x100f: 0x40079c20, - 0x1010: 0x40059020, 0x1011: 0x40059220, 0x1012: 0x4005a420, 0x1013: 0x4005a620, - 0x1014: 0x4005a820, 0x1015: 0x40079e20, 0x1016: 0x4007a020, 0x1017: 0x4007a220, - 0x1018: 0x4007a420, 0x1019: 0x4005aa20, 0x101a: 0x4005ac20, - // Block 0x41, offset 0x1040 - 0x1040: 0x404e1420, 0x1041: 0x404e1820, 0x1042: 0x404e1c20, 0x1043: 0x404e2220, - 0x1044: 0x404e2420, 0x1045: 0x404e2820, 0x1046: 0x404e2e20, 0x1047: 0x404e3220, - 0x1048: 0x404e3a20, 0x1049: 0x404e4220, 0x104a: 0x404e4820, 0x104b: 0x404e4a20, - 0x104c: 0x404e4e20, 0x104d: 0x404e5220, 0x104e: 0x404e5620, 0x104f: 0x404e5a20, - 0x1050: 0x404e5e20, 0x1051: 0x404e6020, 0x1052: 0x404e6220, 0x1053: 0x404e6620, - 0x1054: 0x404e6a20, 0x1055: 0x404e7220, 0x1056: 0x404e7420, 0x1057: 0x404e7e20, - 0x1058: 0x404e8220, 0x1059: 0x404e8420, 0x105a: 0x404e8820, 0x105b: 0x404e8c20, - 0x105c: 0x404e9420, 0x105d: 0x404e9820, 0x105e: 0x404ea620, 0x105f: 0x404eaa20, - 0x1060: 0x404eb620, 0x1061: 0x404ec220, 0x1062: 0x404ec420, 0x1063: 0x404ec620, - 0x1064: 0x404ec820, 0x1065: 0xc31307b1, 0x1066: 0x404ecc20, 0x1067: 0x404ed620, - 0x1068: 0x404ed820, 0x1069: 0x404eda20, 0x106a: 0x404edc20, 0x106b: 0x004ede84, - 0x106c: 0x404ede20, 0x106d: 0x404ee620, 0x106e: 0x404eea20, 0x106f: 0x404eee20, - 0x1070: 0x404ef420, 0x1071: 0x404efe20, 0x1072: 0x404f0620, 0x1073: 0x404eec20, - 0x1074: 0x404f0a20, 0x1075: 0x404f0220, 0x1076: 0xa000f302, 0x1077: 0xa0711202, - 0x1078: 0xa000f402, 0x1079: 0x8209278a, 0x107a: 0x8209278b, 0x107b: 0x404e8a20, - 0x107c: 0x404e9220, 0x107d: 0x404e9a20, 0x107e: 0x404eb020, 0x107f: 0xe000201e, - // Block 0x42, offset 0x1080 - 0x1080: 0xe00001ac, 0x1081: 0xe0000240, 0x1082: 0xe0000358, 0x1083: 0xe0000432, - 0x1084: 0xe0000507, 0x1085: 0xe00005d1, 0x1086: 0xe000069c, 0x1087: 0xe0000744, - 0x1088: 0xe00007f0, 0x1089: 0xe0000895, 0x108a: 0x40032220, 0x108b: 0x40032420, - 0x108c: 0x4005b420, 0x108d: 0x4005b620, 0x108e: 0x4005b820, 0x108f: 0x4005ba20, - 0x1090: 0x404ea020, 0x1091: 0x404ea220, 0x1092: 0x404ece20, 0x1093: 0x404ed020, - 0x1094: 0x404ed220, 0x1095: 0x404ed420, 0x1096: 0x404ef620, 0x1097: 0x404ef820, - 0x1098: 0x404efa20, 0x1099: 0x404efc20, 0x109a: 0x404e2620, 0x109b: 0x404e3c20, - 0x109c: 0x404eb820, 0x109d: 0x404eba20, 0x109e: 0x404e7020, 0x109f: 0x404e8620, - 0x10a0: 0x404e9620, 0x10a1: 0x404e4020, 0x10a2: 0x404f0c20, 0x10a3: 0x404f1820, - 0x10a4: 0x404f1a20, 0x10a5: 0x404ea420, 0x10a6: 0x404ec020, 0x10a7: 0x404f0e20, - 0x10a8: 0x404f1020, 0x10a9: 0x404f1c20, 0x10aa: 0x404f1e20, 0x10ab: 0x404f2020, - 0x10ac: 0x404f2220, 0x10ad: 0x404f2420, 0x10ae: 0x404e5c20, 0x10af: 0x404ebc20, - 0x10b0: 0x404ebe20, 0x10b1: 0x404ee820, 0x10b2: 0x404ee220, 0x10b3: 0x404ef020, - 0x10b4: 0x404ef220, 0x10b5: 0x404e1620, 0x10b6: 0x404e1a20, 0x10b7: 0x404e1e20, - 0x10b8: 0x404e2a20, 0x10b9: 0x404e3620, 0x10ba: 0x404e4420, 0x10bb: 0x404e6420, - 0x10bc: 0x404e6c20, 0x10bd: 0x404e7620, 0x10be: 0x404e7820, 0x10bf: 0x404e8020, - // Block 0x43, offset 0x10c0 - 0x10c0: 0x404e9e20, 0x10c1: 0x404eac20, 0x10c2: 0x404e9c20, 0x10c3: 0x404ee020, - 0x10c4: 0x404f0020, 0x10c5: 0x404f0420, 0x10c6: 0x404f1220, 0x10c7: 0x404f2620, - 0x10c8: 0x404f2a20, 0x10c9: 0x404f2e20, 0x10ca: 0x404f3020, 0x10cb: 0x404f2820, - 0x10cc: 0x404f2c20, 0x10cd: 0xadc11302, 0x10ce: 0x404e7c20, 0x10cf: 0x404f3220, - 0x10d0: 0xe00001af, 0x10d1: 0xe0000243, 0x10d2: 0xe000035b, 0x10d3: 0xe0000435, - 0x10d4: 0xe000050a, 0x10d5: 0xe00005d4, 0x10d6: 0xe000069f, 0x10d7: 0xe0000747, - 0x10d8: 0xe00007f3, 0x10d9: 0xe0000898, 0x10da: 0x404f3420, 0x10db: 0x404f3620, - 0x10dc: 0x404ee420, 0x10dd: 0x404f0820, 0x10de: 0x4007a820, 0x10df: 0x4007aa20, - 0x10e0: 0x00379888, 0x10e1: 0x00379c88, 0x10e2: 0x0037a088, 0x10e3: 0x0037a488, - 0x10e4: 0x0037a888, 0x10e5: 0x0037ac88, 0x10e6: 0x0037b088, 0x10e7: 0x0037b888, - 0x10e8: 0x0037bc88, 0x10e9: 0x0037c088, 0x10ea: 0x0037c488, 0x10eb: 0x0037c888, - 0x10ec: 0x0037cc88, 0x10ed: 0x0037d488, 0x10ee: 0x0037d888, 0x10ef: 0x0037dc88, - 0x10f0: 0x0037e088, 0x10f1: 0x0037e488, 0x10f2: 0x0037e888, 0x10f3: 0x0037f088, - 0x10f4: 0x0037f488, 0x10f5: 0x0037f888, 0x10f6: 0x0037fc88, 0x10f7: 0x00380088, - 0x10f8: 0x00380488, 0x10f9: 0x00380888, 0x10fa: 0x00380c88, 0x10fb: 0x00381088, - 0x10fc: 0x00381488, 0x10fd: 0x00381888, 0x10fe: 0x00381c88, 0x10ff: 0x00382488, - // Block 0x44, offset 0x1100 - 0x1100: 0x00382888, 0x1101: 0x0037b488, 0x1102: 0x0037d088, 0x1103: 0x0037ec88, - 0x1104: 0x00382088, 0x1105: 0x00382c88, 0x1107: 0x00383288, - 0x110d: 0x00383c88, - 0x1110: 0x40379620, 0x1111: 0x40379a20, 0x1112: 0x40379e20, 0x1113: 0x4037a220, - 0x1114: 0x4037a620, 0x1115: 0x4037aa20, 0x1116: 0x4037ae20, 0x1117: 0x4037b620, - 0x1118: 0x4037ba20, 0x1119: 0x4037be20, 0x111a: 0x4037c220, 0x111b: 0x4037c620, - 0x111c: 0x4037ca20, 0x111d: 0x4037d220, 0x111e: 0x4037d620, 0x111f: 0x4037da20, - 0x1120: 0x4037de20, 0x1121: 0x4037e220, 0x1122: 0x4037e620, 0x1123: 0x4037ee20, - 0x1124: 0x4037f220, 0x1125: 0x4037f620, 0x1126: 0x4037fa20, 0x1127: 0x4037fe20, - 0x1128: 0x40380220, 0x1129: 0x40380620, 0x112a: 0x40380a20, 0x112b: 0x40380e20, - 0x112c: 0x40381220, 0x112d: 0x40381620, 0x112e: 0x40381a20, 0x112f: 0x40382220, - 0x1130: 0x40382620, 0x1131: 0x4037b220, 0x1132: 0x4037ce20, 0x1133: 0x4037ea20, - 0x1134: 0x40381e20, 0x1135: 0x40382a20, 0x1136: 0x40382e20, 0x1137: 0x40383020, - 0x1138: 0x40383420, 0x1139: 0x40383620, 0x113a: 0x40383820, 0x113b: 0x40036020, - 0x113c: 0x0037ca94, 0x113d: 0x40383a20, 0x113e: 0x40383e20, 0x113f: 0x40384020, - // Block 0x45, offset 0x1140 - 0x1140: 0x4062ac20, 0x1141: 0x4062ae20, 0x1142: 0x4062b020, 0x1143: 0x4062b220, - 0x1144: 0x4062b420, 0x1145: 0x4062b620, 0x1146: 0x4062b820, 0x1147: 0x4062ba20, - 0x1148: 0x4062bc20, 0x1149: 0x4062be20, 0x114a: 0x4062c020, 0x114b: 0x4062c220, - 0x114c: 0x4062c420, 0x114d: 0x4062c620, 0x114e: 0x4062c820, 0x114f: 0x4062ca20, - 0x1150: 0x4062cc20, 0x1151: 0x4062ce20, 0x1152: 0x4062d020, 0x1153: 0x4062d220, - 0x1154: 0x4062d420, 0x1155: 0x4062d620, 0x1156: 0x4062d820, 0x1157: 0x4062da20, - 0x1158: 0x4062dc20, 0x1159: 0x4062de20, 0x115a: 0x4062e020, 0x115b: 0x4062e220, - 0x115c: 0x4062e420, 0x115d: 0x4062e620, 0x115e: 0x4062e820, 0x115f: 0x4062ea20, - 0x1160: 0x4062ec20, 0x1161: 0x4062ee20, 0x1162: 0x4062f020, 0x1163: 0x4062f220, - 0x1164: 0x4062f420, 0x1165: 0x4062f620, 0x1166: 0x4062f820, 0x1167: 0x4062fa20, - 0x1168: 0x4062fc20, 0x1169: 0x4062fe20, 0x116a: 0x40630020, 0x116b: 0x40630220, - 0x116c: 0x40630420, 0x116d: 0x40630620, 0x116e: 0x40630820, 0x116f: 0x40630a20, - 0x1170: 0x40630c20, 0x1171: 0x40630e20, 0x1172: 0x40631020, 0x1173: 0x40631220, - 0x1174: 0x40631420, 0x1175: 0x40631620, 0x1176: 0x40631820, 0x1177: 0x40631a20, - 0x1178: 0x40631c20, 0x1179: 0x40631e20, 0x117a: 0x40632020, 0x117b: 0x40632220, - 0x117c: 0x40632420, 0x117d: 0x40632620, 0x117e: 0x40632820, 0x117f: 0x40632a20, - // Block 0x46, offset 0x1180 - 0x1180: 0x40632c20, 0x1181: 0x40632e20, 0x1182: 0x40633020, 0x1183: 0x40633220, - 0x1184: 0x40633420, 0x1185: 0x40633620, 0x1186: 0x40633820, 0x1187: 0x40633a20, - 0x1188: 0x40633c20, 0x1189: 0x40633e20, 0x118a: 0x40634020, 0x118b: 0x40634220, - 0x118c: 0x40634420, 0x118d: 0x40634620, 0x118e: 0x40634820, 0x118f: 0x40634a20, - 0x1190: 0x40634c20, 0x1191: 0x40634e20, 0x1192: 0x40635020, 0x1193: 0x40635220, - 0x1194: 0x40635420, 0x1195: 0x40635620, 0x1196: 0x40635820, 0x1197: 0x40635a20, - 0x1198: 0x40635c20, 0x1199: 0x40635e20, 0x119a: 0x40636020, 0x119b: 0x40636220, - 0x119c: 0x40636420, 0x119d: 0x40636620, 0x119e: 0x40636820, 0x119f: 0x4063a420, - 0x11a0: 0x4063a620, 0x11a1: 0x4063a820, 0x11a2: 0x4063aa20, 0x11a3: 0x4063ac20, - 0x11a4: 0x4063ae20, 0x11a5: 0x4063b020, 0x11a6: 0x4063b220, 0x11a7: 0x4063b420, - 0x11a8: 0x4063b620, 0x11a9: 0x4063b820, 0x11aa: 0x4063ba20, 0x11ab: 0x4063bc20, - 0x11ac: 0x4063be20, 0x11ad: 0x4063c020, 0x11ae: 0x4063c220, 0x11af: 0x4063c420, - 0x11b0: 0x4063c620, 0x11b1: 0x4063c820, 0x11b2: 0x4063ca20, 0x11b3: 0x4063cc20, - 0x11b4: 0x4063ce20, 0x11b5: 0x4063d020, 0x11b6: 0x4063d220, 0x11b7: 0x4063d420, - 0x11b8: 0x4063d620, 0x11b9: 0x4063d820, 0x11ba: 0x4063da20, 0x11bb: 0x4063dc20, - 0x11bc: 0x4063de20, 0x11bd: 0x4063e020, 0x11be: 0x4063e220, 0x11bf: 0x4063e420, - // Block 0x47, offset 0x11c0 - 0x11c0: 0x4063e620, 0x11c1: 0x4063e820, 0x11c2: 0x4063ea20, 0x11c3: 0x4063ec20, - 0x11c4: 0x4063ee20, 0x11c5: 0x4063f020, 0x11c6: 0x4063f220, 0x11c7: 0x4063f420, - 0x11c8: 0x4063f620, 0x11c9: 0x4063f820, 0x11ca: 0x4063fa20, 0x11cb: 0x4063fc20, - 0x11cc: 0x4063fe20, 0x11cd: 0x40640020, 0x11ce: 0x40640220, 0x11cf: 0x40640420, - 0x11d0: 0x40640620, 0x11d1: 0x40640820, 0x11d2: 0x40640a20, 0x11d3: 0x40640c20, - 0x11d4: 0x40640e20, 0x11d5: 0x40641020, 0x11d6: 0x40641220, 0x11d7: 0x40641420, - 0x11d8: 0x40641620, 0x11d9: 0x40641820, 0x11da: 0x40641a20, 0x11db: 0x40641c20, - 0x11dc: 0x40641e20, 0x11dd: 0x40642020, 0x11de: 0x40642220, 0x11df: 0x40642420, - 0x11e0: 0x40642620, 0x11e1: 0x40642820, 0x11e2: 0x40642a20, 0x11e3: 0x40642c20, - 0x11e4: 0x40642e20, 0x11e5: 0x40643020, 0x11e6: 0x40643220, 0x11e7: 0x40643420, - 0x11e8: 0x40646420, 0x11e9: 0x40646620, 0x11ea: 0x40646820, 0x11eb: 0x40646a20, - 0x11ec: 0x40646c20, 0x11ed: 0x40646e20, 0x11ee: 0x40647020, 0x11ef: 0x40647220, - 0x11f0: 0x40647420, 0x11f1: 0x40647620, 0x11f2: 0x40647820, 0x11f3: 0x40647a20, - 0x11f4: 0x40647c20, 0x11f5: 0x40647e20, 0x11f6: 0x40648020, 0x11f7: 0x40648220, - 0x11f8: 0x40648420, 0x11f9: 0x40648620, 0x11fa: 0x40648820, 0x11fb: 0x40648a20, - 0x11fc: 0x40648c20, 0x11fd: 0x40648e20, 0x11fe: 0x40649020, 0x11ff: 0x40649220, - // Block 0x48, offset 0x1200 - 0x1200: 0x40649420, 0x1201: 0x40649620, 0x1202: 0x40649820, 0x1203: 0x40649a20, - 0x1204: 0x40649c20, 0x1205: 0x40649e20, 0x1206: 0x4064a020, 0x1207: 0x4064a220, - 0x1208: 0x4064a420, 0x1209: 0x4064a620, 0x120a: 0x4064a820, 0x120b: 0x4064aa20, - 0x120c: 0x4064ac20, 0x120d: 0x4064ae20, 0x120e: 0x4064b020, 0x120f: 0x4064b220, - 0x1210: 0x4064b420, 0x1211: 0x4064b620, 0x1212: 0x4064b820, 0x1213: 0x4064ba20, - 0x1214: 0x4064bc20, 0x1215: 0x4064be20, 0x1216: 0x4064c020, 0x1217: 0x4064c220, - 0x1218: 0x4064c420, 0x1219: 0x4064c620, 0x121a: 0x4064c820, 0x121b: 0x4064ca20, - 0x121c: 0x4064cc20, 0x121d: 0x4064ce20, 0x121e: 0x4064d020, 0x121f: 0x4064d220, - 0x1220: 0x4064d420, 0x1221: 0x4064d620, 0x1222: 0x4064d820, 0x1223: 0x4064da20, - 0x1224: 0x4064dc20, 0x1225: 0x4064de20, 0x1226: 0x4064e020, 0x1227: 0x4064e220, - 0x1228: 0x4064e420, 0x1229: 0x4064e620, 0x122a: 0x4064e820, 0x122b: 0x4064ea20, - 0x122c: 0x4064ec20, 0x122d: 0x4064ee20, 0x122e: 0x4064f020, 0x122f: 0x4064f220, - 0x1230: 0x4064f420, 0x1231: 0x4064f620, 0x1232: 0x4064f820, 0x1233: 0x4064fa20, - 0x1234: 0x4064fc20, 0x1235: 0x4064fe20, 0x1236: 0x40650020, 0x1237: 0x40650220, - 0x1238: 0x40650420, 0x1239: 0x40650620, 0x123a: 0x40650820, 0x123b: 0x40650a20, - 0x123c: 0x40650c20, 0x123d: 0x40650e20, 0x123e: 0x40651020, 0x123f: 0x40651220, - // Block 0x49, offset 0x1240 - 0x1240: 0x403c2e20, 0x1241: 0x403c3020, 0x1242: 0x403c3220, 0x1243: 0x403c3420, - 0x1244: 0x403c3620, 0x1245: 0x403c3820, 0x1246: 0x403c3a20, 0x1247: 0x403c3c20, - 0x1248: 0x403c3e20, 0x1249: 0x403c4020, 0x124a: 0x403c4220, 0x124b: 0x403c4420, - 0x124c: 0x403c4620, 0x124d: 0x403c4820, 0x124e: 0x403c4a20, 0x124f: 0x403c4c20, - 0x1250: 0x403c5020, 0x1251: 0x403c5220, 0x1252: 0x403c5420, 0x1253: 0x403c5620, - 0x1254: 0x403c5820, 0x1255: 0x403c5a20, 0x1256: 0x403c5c20, 0x1257: 0x403c5e20, - 0x1258: 0x403c6020, 0x1259: 0x403c6220, 0x125a: 0x403c6420, 0x125b: 0x403c6620, - 0x125c: 0x403c6820, 0x125d: 0x403c6a20, 0x125e: 0x403c6c20, 0x125f: 0x403c6e20, - 0x1260: 0x403c7a20, 0x1261: 0x403c7c20, 0x1262: 0x403c7e20, 0x1263: 0x403c8020, - 0x1264: 0x403c8220, 0x1265: 0x403c8420, 0x1266: 0x403c8620, 0x1267: 0x403c8820, - 0x1268: 0x403c8a20, 0x1269: 0x403c8c20, 0x126a: 0x403c8e20, 0x126b: 0x403c9020, - 0x126c: 0x403c9220, 0x126d: 0x403c9420, 0x126e: 0x403c9620, 0x126f: 0x403c9820, - 0x1270: 0x403c9c20, 0x1271: 0x403c9e20, 0x1272: 0x403ca020, 0x1273: 0x403ca220, - 0x1274: 0x403ca420, 0x1275: 0x403ca620, 0x1276: 0x403ca820, 0x1277: 0x403caa20, - 0x1278: 0x403cba20, 0x1279: 0x403cbc20, 0x127a: 0x403cbe20, 0x127b: 0x403cc020, - 0x127c: 0x403cc220, 0x127d: 0x403cc420, 0x127e: 0x403cc620, 0x127f: 0x403cc820, - // Block 0x4a, offset 0x1280 - 0x1280: 0x403ccc20, 0x1281: 0x403cce20, 0x1282: 0x403cd020, 0x1283: 0x403cd220, - 0x1284: 0x403cd420, 0x1285: 0x403cd620, 0x1286: 0x403cd820, 0x1287: 0x403cda20, - 0x1288: 0x403cdc20, 0x128a: 0x403cde20, 0x128b: 0x403ce020, - 0x128c: 0x403ce220, 0x128d: 0x403ce420, - 0x1290: 0x403ce620, 0x1291: 0x403ce820, 0x1292: 0x403cea20, 0x1293: 0x403cec20, - 0x1294: 0x403cee20, 0x1295: 0x403cf020, 0x1296: 0x403cf220, - 0x1298: 0x403cf420, 0x129a: 0x403cf620, 0x129b: 0x403cf820, - 0x129c: 0x403cfa20, 0x129d: 0x403cfc20, - 0x12a0: 0x403cfe20, 0x12a1: 0x403d0020, 0x12a2: 0x403d0220, 0x12a3: 0x403d0420, - 0x12a4: 0x403d0620, 0x12a5: 0x403d0820, 0x12a6: 0x403d0a20, 0x12a7: 0x403d0c20, - 0x12a8: 0x403d1820, 0x12a9: 0x403d1a20, 0x12aa: 0x403d1c20, 0x12ab: 0x403d1e20, - 0x12ac: 0x403d2020, 0x12ad: 0x403d2220, 0x12ae: 0x403d2420, 0x12af: 0x403d2620, - 0x12b0: 0x403d2820, 0x12b1: 0x403d2a20, 0x12b2: 0x403d2c20, 0x12b3: 0x403d2e20, - 0x12b4: 0x403d3020, 0x12b5: 0x403d3220, 0x12b6: 0x403d3420, 0x12b7: 0x403d3620, - 0x12b8: 0x403d3a20, 0x12b9: 0x403d3c20, 0x12ba: 0x403d3e20, 0x12bb: 0x403d4020, - 0x12bc: 0x403d4220, 0x12bd: 0x403d4420, 0x12be: 0x403d4620, 0x12bf: 0x403d4820, - // Block 0x4b, offset 0x12c0 - 0x12c0: 0x403d4c20, 0x12c1: 0x403d4e20, 0x12c2: 0x403d5020, 0x12c3: 0x403d5220, - 0x12c4: 0x403d5420, 0x12c5: 0x403d5620, 0x12c6: 0x403d5820, 0x12c7: 0x403d5a20, - 0x12c8: 0x403d5c20, 0x12ca: 0x403d5e20, 0x12cb: 0x403d6020, - 0x12cc: 0x403d6220, 0x12cd: 0x403d6420, - 0x12d0: 0x403d6620, 0x12d1: 0x403d6820, 0x12d2: 0x403d6a20, 0x12d3: 0x403d6c20, - 0x12d4: 0x403d6e20, 0x12d5: 0x403d7020, 0x12d6: 0x403d7220, 0x12d7: 0x403d7420, - 0x12d8: 0x403d7820, 0x12d9: 0x403d7a20, 0x12da: 0x403d7c20, 0x12db: 0x403d7e20, - 0x12dc: 0x403d8020, 0x12dd: 0x403d8220, 0x12de: 0x403d8420, 0x12df: 0x403d8620, - 0x12e0: 0x403d8a20, 0x12e1: 0x403d8c20, 0x12e2: 0x403d8e20, 0x12e3: 0x403d9020, - 0x12e4: 0x403d9220, 0x12e5: 0x403d9420, 0x12e6: 0x403d9620, 0x12e7: 0x403d9820, - 0x12e8: 0x403d9c20, 0x12e9: 0x403d9e20, 0x12ea: 0x403da020, 0x12eb: 0x403da220, - 0x12ec: 0x403da420, 0x12ed: 0x403da620, 0x12ee: 0x403da820, 0x12ef: 0x403daa20, - 0x12f0: 0x403dac20, 0x12f2: 0x403dae20, 0x12f3: 0x403db020, - 0x12f4: 0x403db220, 0x12f5: 0x403db420, - 0x12f8: 0x403db620, 0x12f9: 0x403db820, 0x12fa: 0x403dba20, 0x12fb: 0x403dbc20, - 0x12fc: 0x403dbe20, 0x12fd: 0x403dc020, 0x12fe: 0x403dc220, - // Block 0x4c, offset 0x1300 - 0x1300: 0x403dc420, 0x1302: 0x403dc620, 0x1303: 0x403dc820, - 0x1304: 0x403dca20, 0x1305: 0x403dcc20, - 0x1308: 0x403dce20, 0x1309: 0x403dd020, 0x130a: 0x403dd220, 0x130b: 0x403dd420, - 0x130c: 0x403dd620, 0x130d: 0x403dd820, 0x130e: 0x403dda20, 0x130f: 0x403ddc20, - 0x1310: 0x403dde20, 0x1311: 0x403de020, 0x1312: 0x403de220, 0x1313: 0x403de420, - 0x1314: 0x403de620, 0x1315: 0x403de820, 0x1316: 0x403dea20, - 0x1318: 0x403dec20, 0x1319: 0x403dee20, 0x131a: 0x403df020, 0x131b: 0x403df220, - 0x131c: 0x403df420, 0x131d: 0x403df620, 0x131e: 0x403df820, 0x131f: 0x403dfa20, - 0x1320: 0x403e0a20, 0x1321: 0x403e0c20, 0x1322: 0x403e0e20, 0x1323: 0x403e1020, - 0x1324: 0x403e1220, 0x1325: 0x403e1420, 0x1326: 0x403e1620, 0x1327: 0x403e1820, - 0x1328: 0x403e1a20, 0x1329: 0x403e1c20, 0x132a: 0x403e1e20, 0x132b: 0x403e2020, - 0x132c: 0x403e2220, 0x132d: 0x403e2420, 0x132e: 0x403e2620, 0x132f: 0x403e2820, - 0x1330: 0x403e2a20, 0x1331: 0x403e2c20, 0x1332: 0x403e2e20, 0x1333: 0x403e3020, - 0x1334: 0x403e3220, 0x1335: 0x403e3420, 0x1336: 0x403e3620, 0x1337: 0x403e3820, - 0x1338: 0x403e4820, 0x1339: 0x403e4a20, 0x133a: 0x403e4c20, 0x133b: 0x403e4e20, - 0x133c: 0x403e5020, 0x133d: 0x403e5220, 0x133e: 0x403e5420, 0x133f: 0x403e5620, - // Block 0x4d, offset 0x1340 - 0x1340: 0x403e5a20, 0x1341: 0x403e5c20, 0x1342: 0x403e5e20, 0x1343: 0x403e6020, - 0x1344: 0x403e6220, 0x1345: 0x403e6420, 0x1346: 0x403e6620, 0x1347: 0x403e6820, - 0x1348: 0x403e6c20, 0x1349: 0x403e6e20, 0x134a: 0x403e7020, 0x134b: 0x403e7220, - 0x134c: 0x403e7420, 0x134d: 0x403e7620, 0x134e: 0x403e7820, 0x134f: 0x403e7a20, - 0x1350: 0x403e7c20, 0x1352: 0x403e7e20, 0x1353: 0x403e8020, - 0x1354: 0x403e8220, 0x1355: 0x403e8420, - 0x1358: 0x403e8620, 0x1359: 0x403e8820, 0x135a: 0x403e8a20, 0x135b: 0x403e8c20, - 0x135c: 0x403e8e20, 0x135d: 0x403e9020, 0x135e: 0x403e9220, 0x135f: 0x403e9420, - 0x1360: 0x403e9e20, 0x1361: 0x403ea020, 0x1362: 0x403ea220, 0x1363: 0x403ea420, - 0x1364: 0x403ea620, 0x1365: 0x403ea820, 0x1366: 0x403eaa20, 0x1367: 0x403eac20, - 0x1368: 0x403eb020, 0x1369: 0x403eb220, 0x136a: 0x403eb420, 0x136b: 0x403eb620, - 0x136c: 0x403eb820, 0x136d: 0x403eba20, 0x136e: 0x403ebc20, 0x136f: 0x403ebe20, - 0x1370: 0x403ed020, 0x1371: 0x403ed220, 0x1372: 0x403ed420, 0x1373: 0x403ed620, - 0x1374: 0x403ed820, 0x1375: 0x403eda20, 0x1376: 0x403edc20, 0x1377: 0x403ede20, - 0x1378: 0x403ee220, 0x1379: 0x403ee420, 0x137a: 0x403ee620, 0x137b: 0x403ee820, - 0x137c: 0x403eea20, 0x137d: 0x403eec20, 0x137e: 0x403eee20, 0x137f: 0x403ef020, - // Block 0x4e, offset 0x1380 - 0x1380: 0x403f0020, 0x1381: 0x403f0220, 0x1382: 0x403f0420, 0x1383: 0x403f0620, - 0x1384: 0x403f0820, 0x1385: 0x403f0a20, 0x1386: 0x403f0c20, 0x1387: 0x403f0e20, - 0x1388: 0x403f1020, 0x1389: 0x403f1220, 0x138a: 0x403f1420, 0x138b: 0x403f1620, - 0x138c: 0x403f1820, 0x138d: 0x403f1a20, 0x138e: 0x403f1c20, 0x138f: 0x403f1e20, - 0x1390: 0x403f2820, 0x1391: 0x403f2a20, 0x1392: 0x403f2c20, 0x1393: 0x403f2e20, - 0x1394: 0x403f3020, 0x1395: 0x403f3220, 0x1396: 0x403f3420, 0x1397: 0x403f3620, - 0x1398: 0x403f4220, 0x1399: 0x403f4420, 0x139a: 0x403f4620, - 0x139d: 0xae60ee02, 0x139e: 0xae60ed02, 0x139f: 0xae60ec02, - 0x13a0: 0x40036220, 0x13a1: 0x40029c20, 0x13a2: 0x4002ee20, 0x13a3: 0x40029e20, - 0x13a4: 0x4002a020, 0x13a5: 0x4002a220, 0x13a6: 0x4002a420, 0x13a7: 0x4002d020, - 0x13a8: 0x40036420, 0x13a9: 0xe00001f2, 0x13aa: 0xe000030d, 0x13ab: 0xe00003e7, - 0x13ac: 0xe00004c2, 0x13ad: 0xe000058c, 0x13ae: 0xe0000657, 0x13af: 0xe00006ff, - 0x13b0: 0xe00007ab, 0x13b1: 0xe0000850, 0x13b2: 0x40286620, 0x13b3: 0x40286820, - 0x13b4: 0x40286a20, 0x13b5: 0x40286c20, 0x13b6: 0x40286e20, 0x13b7: 0x40287020, - 0x13b8: 0x40287220, 0x13b9: 0x40287420, 0x13ba: 0x40287620, 0x13bb: 0x40287820, - 0x13bc: 0x40287a20, - // Block 0x4f, offset 0x13c0 - 0x13c0: 0x403c7020, 0x13c1: 0x403c7220, 0x13c2: 0x403c7420, 0x13c3: 0x403c7620, - 0x13c4: 0x403d0e20, 0x13c5: 0x403d1020, 0x13c6: 0x403d1220, 0x13c7: 0x403d1420, - 0x13c8: 0x403f2020, 0x13c9: 0x403f2220, 0x13ca: 0x403f2420, 0x13cb: 0x403f2620, - 0x13cc: 0x403f3820, 0x13cd: 0x403f3a20, 0x13ce: 0x403f3c20, 0x13cf: 0x403f3e20, - 0x13d0: 0x4006a620, 0x13d1: 0x4006a820, 0x13d2: 0x4006aa20, 0x13d3: 0x4006ac20, - 0x13d4: 0x4006ae20, 0x13d5: 0x4006b020, 0x13d6: 0x4006b220, 0x13d7: 0x4006b420, - 0x13d8: 0x4006b620, 0x13d9: 0x4006b820, - 0x13e0: 0x40547620, 0x13e1: 0x40547820, 0x13e2: 0x40547a20, 0x13e3: 0x40547c20, - 0x13e4: 0x40547e20, 0x13e5: 0x40548020, 0x13e6: 0x40548220, 0x13e7: 0x40548420, - 0x13e8: 0x40548620, 0x13e9: 0x40548820, 0x13ea: 0x40548a20, 0x13eb: 0x40548c20, - 0x13ec: 0x40548e20, 0x13ed: 0x40549020, 0x13ee: 0x40549220, 0x13ef: 0x40549420, - 0x13f0: 0x40549620, 0x13f1: 0x40549820, 0x13f2: 0x40549a20, 0x13f3: 0x40549c20, - 0x13f4: 0x40549e20, 0x13f5: 0x4054a020, 0x13f6: 0x4054a220, 0x13f7: 0x4054a420, - 0x13f8: 0x4054a620, 0x13f9: 0x4054a820, 0x13fa: 0x4054aa20, 0x13fb: 0x4054ac20, - 0x13fc: 0x4054ae20, 0x13fd: 0x4054b020, 0x13fe: 0x4054b220, 0x13ff: 0x4054b420, - // Block 0x50, offset 0x1400 - 0x1400: 0x4054b620, 0x1401: 0x4054b820, 0x1402: 0x4054ba20, 0x1403: 0x4054bc20, - 0x1404: 0x4054be20, 0x1405: 0x4054c020, 0x1406: 0x4054c220, 0x1407: 0x4054c420, - 0x1408: 0x4054c620, 0x1409: 0x4054c820, 0x140a: 0x4054ca20, 0x140b: 0x4054cc20, - 0x140c: 0x4054ce20, 0x140d: 0x4054d020, 0x140e: 0x4054d220, 0x140f: 0x4054d420, - 0x1410: 0x4054d620, 0x1411: 0x4054d820, 0x1412: 0x4054da20, 0x1413: 0x4054dc20, - 0x1414: 0x4054de20, 0x1415: 0x4054e020, 0x1416: 0x4054e220, 0x1417: 0x4054e420, - 0x1418: 0x4054e620, 0x1419: 0x4054e820, 0x141a: 0x4054ea20, 0x141b: 0x4054ec20, - 0x141c: 0x4054ee20, 0x141d: 0x4054f020, 0x141e: 0x4054f220, 0x141f: 0x4054f420, - 0x1420: 0x4054f620, 0x1421: 0x4054f820, 0x1422: 0x4054fa20, 0x1423: 0x4054fc20, - 0x1424: 0x4054fe20, 0x1425: 0x40550020, 0x1426: 0x40550220, 0x1427: 0x40550420, - 0x1428: 0x40550620, 0x1429: 0x40550820, 0x142a: 0x40550a20, 0x142b: 0x40550c20, - 0x142c: 0x40550e20, 0x142d: 0x40551020, 0x142e: 0x40551220, 0x142f: 0x40551420, - 0x1430: 0x40551620, 0x1431: 0x40551820, 0x1432: 0x40551a20, 0x1433: 0x40551c20, - 0x1434: 0x40551e20, - // Block 0x51, offset 0x1440 - 0x1440: 0x40021e20, 0x1441: 0x40552020, 0x1442: 0x40552220, 0x1443: 0x40552420, - 0x1444: 0x40552620, 0x1445: 0x40552820, 0x1446: 0x40552a20, 0x1447: 0x40552c20, - 0x1448: 0x40552e20, 0x1449: 0x40553020, 0x144a: 0x40553220, 0x144b: 0x40553420, - 0x144c: 0x40553620, 0x144d: 0x40553820, 0x144e: 0x40553a20, 0x144f: 0x40553c20, - 0x1450: 0x40553e20, 0x1451: 0x40554020, 0x1452: 0x40554220, 0x1453: 0x40554420, - 0x1454: 0x40554620, 0x1455: 0x40554820, 0x1456: 0x40554a20, 0x1457: 0x40554c20, - 0x1458: 0x40554e20, 0x1459: 0x40555020, 0x145a: 0x40555220, 0x145b: 0x40555420, - 0x145c: 0x40555620, 0x145d: 0x40555820, 0x145e: 0x40555a20, 0x145f: 0x40555c20, - 0x1460: 0x40555e20, 0x1461: 0x40556020, 0x1462: 0x40556220, 0x1463: 0x40556420, - 0x1464: 0x40556620, 0x1465: 0x40556820, 0x1466: 0x40556a20, 0x1467: 0x40556c20, - 0x1468: 0x40556e20, 0x1469: 0x40557020, 0x146a: 0x40557220, 0x146b: 0x40557420, - 0x146c: 0x40557620, 0x146d: 0x40557820, 0x146e: 0x40557a20, 0x146f: 0x40557c20, - 0x1470: 0x40557e20, 0x1471: 0x40558020, 0x1472: 0x40558220, 0x1473: 0x40558420, - 0x1474: 0x40558620, 0x1475: 0x40558820, 0x1476: 0x40558a20, 0x1477: 0x40558c20, - 0x1478: 0x40558e20, 0x1479: 0x40559020, 0x147a: 0x40559220, 0x147b: 0x40559420, - 0x147c: 0x40559620, 0x147d: 0x40559820, 0x147e: 0x40559a20, 0x147f: 0x40559c20, - // Block 0x52, offset 0x1480 - 0x1480: 0x40559e20, 0x1481: 0x4055a020, 0x1482: 0x4055a220, 0x1483: 0x4055a420, - 0x1484: 0x4055a620, 0x1485: 0x4055a820, 0x1486: 0x4055aa20, 0x1487: 0x4055ac20, - 0x1488: 0x4055ae20, 0x1489: 0x4055b020, 0x148a: 0x4055b220, 0x148b: 0x4055b420, - 0x148c: 0x4055b620, 0x148d: 0x4055b820, 0x148e: 0x4055ba20, 0x148f: 0x4055bc20, - 0x1490: 0x4055be20, 0x1491: 0x4055c020, 0x1492: 0x4055c220, 0x1493: 0x4055c420, - 0x1494: 0x4055c620, 0x1495: 0x4055c820, 0x1496: 0x4055ca20, 0x1497: 0x4055cc20, - 0x1498: 0x4055ce20, 0x1499: 0x4055d020, 0x149a: 0x4055d220, 0x149b: 0x4055d420, - 0x149c: 0x4055d620, 0x149d: 0x4055d820, 0x149e: 0x4055da20, 0x149f: 0x4055dc20, - 0x14a0: 0x4055de20, 0x14a1: 0x4055e020, 0x14a2: 0x4055e220, 0x14a3: 0x4055e420, - 0x14a4: 0x4055e620, 0x14a5: 0x4055e820, 0x14a6: 0x4055ea20, 0x14a7: 0x4055ec20, - 0x14a8: 0x4055ee20, 0x14a9: 0x4055f020, 0x14aa: 0x4055f220, 0x14ab: 0x4055f420, - 0x14ac: 0x4055f620, 0x14ad: 0x4055f820, 0x14ae: 0x4055fa20, 0x14af: 0x4055fc20, - 0x14b0: 0x4055fe20, 0x14b1: 0x40560020, 0x14b2: 0x40560220, 0x14b3: 0x40560420, - 0x14b4: 0x40560620, 0x14b5: 0x40560820, 0x14b6: 0x40560a20, 0x14b7: 0x40560c20, - 0x14b8: 0x40560e20, 0x14b9: 0x40561020, 0x14ba: 0x40561220, 0x14bb: 0x40561420, - 0x14bc: 0x40561620, 0x14bd: 0x40561820, 0x14be: 0x40561a20, 0x14bf: 0x40561c20, - // Block 0x53, offset 0x14c0 - 0x14c0: 0x40561e20, 0x14c1: 0x40562020, 0x14c2: 0x40562220, 0x14c3: 0x40562420, - 0x14c4: 0x40562620, 0x14c5: 0x40562820, 0x14c6: 0x40562a20, 0x14c7: 0x40562c20, - 0x14c8: 0x40562e20, 0x14c9: 0x40563020, 0x14ca: 0x40563220, 0x14cb: 0x40563420, - 0x14cc: 0x40563620, 0x14cd: 0x40563820, 0x14ce: 0x40563a20, 0x14cf: 0x40563c20, - 0x14d0: 0x40563e20, 0x14d1: 0x40564020, 0x14d2: 0x40564220, 0x14d3: 0x40564420, - 0x14d4: 0x40564620, 0x14d5: 0x40564820, 0x14d6: 0x40564a20, 0x14d7: 0x40564c20, - 0x14d8: 0x40564e20, 0x14d9: 0x40565020, 0x14da: 0x40565220, 0x14db: 0x40565420, - 0x14dc: 0x40565620, 0x14dd: 0x40565820, 0x14de: 0x40565a20, 0x14df: 0x40565c20, - 0x14e0: 0x40565e20, 0x14e1: 0x40566020, 0x14e2: 0x40566220, 0x14e3: 0x40566420, - 0x14e4: 0x40566620, 0x14e5: 0x40566820, 0x14e6: 0x40566a20, 0x14e7: 0x40566c20, - 0x14e8: 0x40566e20, 0x14e9: 0x40567020, 0x14ea: 0x40567220, 0x14eb: 0x40567420, - 0x14ec: 0x40567620, 0x14ed: 0x40567820, 0x14ee: 0x40567a20, 0x14ef: 0x40567c20, - 0x14f0: 0x40567e20, 0x14f1: 0x40568020, 0x14f2: 0x40568220, 0x14f3: 0x40568420, - 0x14f4: 0x40568620, 0x14f5: 0x40568820, 0x14f6: 0x40568a20, 0x14f7: 0x40568c20, - 0x14f8: 0x40568e20, 0x14f9: 0x40569020, 0x14fa: 0x40569220, 0x14fb: 0x40569420, - 0x14fc: 0x40569620, 0x14fd: 0x40569820, 0x14fe: 0x40569a20, 0x14ff: 0x40569c20, - // Block 0x54, offset 0x1500 - 0x1500: 0x40569e20, 0x1501: 0x4056a020, 0x1502: 0x4056a220, 0x1503: 0x4056a420, - 0x1504: 0x4056a620, 0x1505: 0x4056a820, 0x1506: 0x4056aa20, 0x1507: 0x4056ac20, - 0x1508: 0x4056ae20, 0x1509: 0x4056b020, 0x150a: 0x4056b220, 0x150b: 0x4056b420, - 0x150c: 0x4056b620, 0x150d: 0x4056b820, 0x150e: 0x4056ba20, 0x150f: 0x4056bc20, - 0x1510: 0x4056be20, 0x1511: 0x4056c020, 0x1512: 0x4056c220, 0x1513: 0x4056c420, - 0x1514: 0x4056c620, 0x1515: 0x4056c820, 0x1516: 0x4056ca20, 0x1517: 0x4056cc20, - 0x1518: 0x4056ce20, 0x1519: 0x4056d020, 0x151a: 0x4056d220, 0x151b: 0x4056d420, - 0x151c: 0x4056d620, 0x151d: 0x4056d820, 0x151e: 0x4056da20, 0x151f: 0x4056dc20, - 0x1520: 0x4056de20, 0x1521: 0x4056e020, 0x1522: 0x4056e220, 0x1523: 0x4056e420, - 0x1524: 0x4056e620, 0x1525: 0x4056e820, 0x1526: 0x4056ea20, 0x1527: 0x4056ec20, - 0x1528: 0x4056ee20, 0x1529: 0x4056f020, 0x152a: 0x4056f220, 0x152b: 0x4056f420, - 0x152c: 0x4056f620, 0x152d: 0x4056f820, 0x152e: 0x4056fa20, 0x152f: 0x4056fc20, - 0x1530: 0x4056fe20, 0x1531: 0x40570020, 0x1532: 0x40570220, 0x1533: 0x40570420, - 0x1534: 0x40570620, 0x1535: 0x40570820, 0x1536: 0x40570a20, 0x1537: 0x40570c20, - 0x1538: 0x40570e20, 0x1539: 0x40571020, 0x153a: 0x40571220, 0x153b: 0x40571420, - 0x153c: 0x40571620, 0x153d: 0x40571820, 0x153e: 0x40571a20, 0x153f: 0x40571c20, - // Block 0x55, offset 0x1540 - 0x1540: 0x40571e20, 0x1541: 0x40572020, 0x1542: 0x40572220, 0x1543: 0x40572420, - 0x1544: 0x40572620, 0x1545: 0x40572820, 0x1546: 0x40572a20, 0x1547: 0x40572c20, - 0x1548: 0x40572e20, 0x1549: 0x40573020, 0x154a: 0x40573220, 0x154b: 0x40573420, - 0x154c: 0x40573620, 0x154d: 0x40573820, 0x154e: 0x40573a20, 0x154f: 0x40573c20, - 0x1550: 0x40573e20, 0x1551: 0x40574020, 0x1552: 0x40574220, 0x1553: 0x40574420, - 0x1554: 0x40574620, 0x1555: 0x40574820, 0x1556: 0x40574a20, 0x1557: 0x40574c20, - 0x1558: 0x40574e20, 0x1559: 0x40575020, 0x155a: 0x40575220, 0x155b: 0x40575420, - 0x155c: 0x40575620, 0x155d: 0x40575820, 0x155e: 0x40575a20, 0x155f: 0x40575c20, - 0x1560: 0x40575e20, 0x1561: 0x40576020, 0x1562: 0x40576220, 0x1563: 0x40576420, - 0x1564: 0x40576620, 0x1565: 0x40576820, 0x1566: 0x40576a20, 0x1567: 0x40576c20, - 0x1568: 0x40576e20, 0x1569: 0x40577020, 0x156a: 0x40577220, 0x156b: 0x40577420, - 0x156c: 0x40577620, 0x156d: 0x40577820, 0x156e: 0x40577a20, 0x156f: 0x40577c20, - 0x1570: 0x40577e20, 0x1571: 0x40578020, 0x1572: 0x40578220, 0x1573: 0x40578420, - 0x1574: 0x40578620, 0x1575: 0x40578820, 0x1576: 0x40578a20, 0x1577: 0x40578c20, - 0x1578: 0x40578e20, 0x1579: 0x40579020, 0x157a: 0x40579220, 0x157b: 0x40579420, - 0x157c: 0x40579620, 0x157d: 0x40579820, 0x157e: 0x40579a20, 0x157f: 0x40579c20, - // Block 0x56, offset 0x1580 - 0x1580: 0x40579e20, 0x1581: 0x4057a020, 0x1582: 0x4057a220, 0x1583: 0x4057a420, - 0x1584: 0x4057a620, 0x1585: 0x4057a820, 0x1586: 0x4057aa20, 0x1587: 0x4057ac20, - 0x1588: 0x4057ae20, 0x1589: 0x4057b020, 0x158a: 0x4057b220, 0x158b: 0x4057b420, - 0x158c: 0x4057b620, 0x158d: 0x4057b820, 0x158e: 0x4057ba20, 0x158f: 0x4057bc20, - 0x1590: 0x4057be20, 0x1591: 0x4057c020, 0x1592: 0x4057c220, 0x1593: 0x4057c420, - 0x1594: 0x4057c620, 0x1595: 0x4057c820, 0x1596: 0x4057ca20, 0x1597: 0x4057cc20, - 0x1598: 0x4057ce20, 0x1599: 0x4057d020, 0x159a: 0x4057d220, 0x159b: 0x4057d420, - 0x159c: 0x4057d620, 0x159d: 0x4057d820, 0x159e: 0x4057da20, 0x159f: 0x4057dc20, - 0x15a0: 0x4057de20, 0x15a1: 0x4057e020, 0x15a2: 0x4057e220, 0x15a3: 0x4057e420, - 0x15a4: 0x4057e620, 0x15a5: 0x4057e820, 0x15a6: 0x4057ea20, 0x15a7: 0x4057ec20, - 0x15a8: 0x4057ee20, 0x15a9: 0x4057f020, 0x15aa: 0x4057f220, 0x15ab: 0x4057f420, - 0x15ac: 0x4057f620, 0x15ad: 0x4057f820, 0x15ae: 0x4057fa20, 0x15af: 0x4057fc20, - 0x15b0: 0x4057fe20, 0x15b1: 0x40580020, 0x15b2: 0x40580220, 0x15b3: 0x40580420, - 0x15b4: 0x40580620, 0x15b5: 0x40580820, 0x15b6: 0x40580a20, 0x15b7: 0x40580c20, - 0x15b8: 0x40580e20, 0x15b9: 0x40581020, 0x15ba: 0x40581220, 0x15bb: 0x40581420, - 0x15bc: 0x40587a20, 0x15bd: 0x40581620, 0x15be: 0x40581a20, 0x15bf: 0x40581c20, - // Block 0x57, offset 0x15c0 - 0x15c0: 0x40581e20, 0x15c1: 0x40582020, 0x15c2: 0x40582220, 0x15c3: 0x40582420, - 0x15c4: 0x40582620, 0x15c5: 0x40582820, 0x15c6: 0x40582a20, 0x15c7: 0x40582c20, - 0x15c8: 0x40582e20, 0x15c9: 0x40583020, 0x15ca: 0x40583220, 0x15cb: 0x40583420, - 0x15cc: 0x40583620, 0x15cd: 0x40583820, 0x15ce: 0x40583c20, 0x15cf: 0x40583e20, - 0x15d0: 0x40584020, 0x15d1: 0x40584220, 0x15d2: 0x40584420, 0x15d3: 0x40584620, - 0x15d4: 0x40584820, 0x15d5: 0x40584a20, 0x15d6: 0x40585820, 0x15d7: 0x40585a20, - 0x15d8: 0x40585c20, 0x15d9: 0x40585e20, 0x15da: 0x40586020, 0x15db: 0x40586220, - 0x15dc: 0x40586420, 0x15dd: 0x40586620, 0x15de: 0x40586820, 0x15df: 0x40586a20, - 0x15e0: 0x40586c20, 0x15e1: 0x40586e20, 0x15e2: 0x40587020, 0x15e3: 0x40587220, - 0x15e4: 0x40587420, 0x15e5: 0x40587620, 0x15e6: 0x40587820, 0x15e7: 0x40587c20, - 0x15e8: 0x40587e20, 0x15e9: 0x40588020, 0x15ea: 0x40588220, 0x15eb: 0x40588420, - 0x15ec: 0x40588620, 0x15ed: 0x40588820, 0x15ee: 0x40588a20, 0x15ef: 0x40588c20, - 0x15f0: 0x40588e20, 0x15f1: 0x40589020, 0x15f2: 0x40589220, 0x15f3: 0x40589420, - 0x15f4: 0x40589620, 0x15f5: 0x40589820, 0x15f6: 0x40589a20, 0x15f7: 0x40589c20, - 0x15f8: 0x40589e20, 0x15f9: 0x4058a020, 0x15fa: 0x4058a220, 0x15fb: 0x4058a420, - 0x15fc: 0x4058a620, 0x15fd: 0x4058a820, 0x15fe: 0x4058aa20, 0x15ff: 0x4058ac20, - // Block 0x58, offset 0x1600 - 0x1600: 0x4058ae20, 0x1601: 0x4058b020, 0x1602: 0x4058b220, 0x1603: 0x4058b420, - 0x1604: 0x4058b620, 0x1605: 0x4058b820, 0x1606: 0x4058ba20, 0x1607: 0x4058bc20, - 0x1608: 0x4058be20, 0x1609: 0x4058c020, 0x160a: 0x4058c220, 0x160b: 0x4058c420, - 0x160c: 0x4058c620, 0x160d: 0x4058c820, 0x160e: 0x4058ca20, 0x160f: 0x4058cc20, - 0x1610: 0x4058ce20, 0x1611: 0x4058d020, 0x1612: 0x4058d220, 0x1613: 0x4058d420, - 0x1614: 0x4058d620, 0x1615: 0x4058d820, 0x1616: 0x4058da20, 0x1617: 0x4058dc20, - 0x1618: 0x4058de20, 0x1619: 0x4058e020, 0x161a: 0x4058e220, 0x161b: 0x4058e420, - 0x161c: 0x4058e620, 0x161d: 0x4058e820, 0x161e: 0x4058ea20, 0x161f: 0x4058ec20, - 0x1620: 0x4058ee20, 0x1621: 0x4058f020, 0x1622: 0x4058f220, 0x1623: 0x4058f420, - 0x1624: 0x4058f620, 0x1625: 0x4058f820, 0x1626: 0x4058fa20, 0x1627: 0x4058fc20, - 0x1628: 0x4058fe20, 0x1629: 0x40590020, 0x162a: 0x40590220, 0x162b: 0x40590420, - 0x162c: 0x40590620, 0x162d: 0x40590820, 0x162e: 0x40590a20, 0x162f: 0x40590c20, - 0x1630: 0x40590e20, 0x1631: 0x40591020, 0x1632: 0x40591220, 0x1633: 0x40591420, - 0x1634: 0x40591620, 0x1635: 0x40591820, 0x1636: 0x40591a20, 0x1637: 0x40591c20, - 0x1638: 0x40591e20, 0x1639: 0x40592020, 0x163a: 0x40592220, 0x163b: 0x40592420, - 0x163c: 0x40592620, 0x163d: 0x40592820, 0x163e: 0x40592a20, 0x163f: 0x40592c20, - // Block 0x59, offset 0x1640 - 0x1640: 0x40592e20, 0x1641: 0x40593020, 0x1642: 0x40593220, 0x1643: 0x40593420, - 0x1644: 0x40593620, 0x1645: 0x40593820, 0x1646: 0x40593a20, 0x1647: 0x40593c20, - 0x1648: 0x40593e20, 0x1649: 0x40594020, 0x164a: 0x40594220, 0x164b: 0x40594420, - 0x164c: 0x40594620, 0x164d: 0x40594820, 0x164e: 0x40594a20, 0x164f: 0x40594c20, - 0x1650: 0x40594e20, 0x1651: 0x40595020, 0x1652: 0x40595220, 0x1653: 0x40595420, - 0x1654: 0x40595620, 0x1655: 0x40595820, 0x1656: 0x40595a20, 0x1657: 0x40595c20, - 0x1658: 0x40595e20, 0x1659: 0x40596020, 0x165a: 0x40596220, 0x165b: 0x40596420, - 0x165c: 0x40596620, 0x165d: 0x40596820, 0x165e: 0x40596a20, 0x165f: 0x40596c20, - 0x1660: 0x40596e20, 0x1661: 0x40597020, 0x1662: 0x40597220, 0x1663: 0x40597420, - 0x1664: 0x40597620, 0x1665: 0x40597820, 0x1666: 0x40597a20, 0x1667: 0x40597c20, - 0x1668: 0x40597e20, 0x1669: 0x40598020, 0x166a: 0x40598220, 0x166b: 0x40598420, - 0x166c: 0x40598620, 0x166d: 0x40598820, 0x166e: 0x40598a20, 0x166f: 0x40598c20, - 0x1670: 0x40598e20, 0x1671: 0x40599020, 0x1672: 0x40599220, 0x1673: 0x40599420, - 0x1674: 0x40599620, 0x1675: 0x40599820, 0x1676: 0x40599a20, 0x1677: 0x40599c20, - 0x1678: 0x40599e20, 0x1679: 0x4059a020, 0x167a: 0x4059a220, 0x167b: 0x4059a420, - 0x167c: 0x4059a620, 0x167d: 0x4059a820, 0x167e: 0x4059aa20, 0x167f: 0x4059ac20, - // Block 0x5a, offset 0x1680 - 0x1680: 0x4059ae20, 0x1681: 0x4059b020, 0x1682: 0x4059b220, 0x1683: 0x4059b420, - 0x1684: 0x4059b620, 0x1685: 0x4059b820, 0x1686: 0x4059ba20, 0x1687: 0x4059bc20, - 0x1688: 0x4059be20, 0x1689: 0x4059c020, 0x168a: 0x4059c220, 0x168b: 0x4059c420, - 0x168c: 0x4059c620, 0x168d: 0x4059c820, 0x168e: 0x4059ca20, 0x168f: 0x4059cc20, - 0x1690: 0x4059ce20, 0x1691: 0x4059d020, 0x1692: 0x4059d220, 0x1693: 0x4059d420, - 0x1694: 0x4059d620, 0x1695: 0x4059d820, 0x1696: 0x4059da20, 0x1697: 0x4059dc20, - 0x1698: 0x4059de20, 0x1699: 0x4059e020, 0x169a: 0x4059e220, 0x169b: 0x4059e420, - 0x169c: 0x4059e620, 0x169d: 0x4059e820, 0x169e: 0x4059ea20, 0x169f: 0x4059ec20, - 0x16a0: 0x4059ee20, 0x16a1: 0x4059f020, 0x16a2: 0x4059f220, 0x16a3: 0x4059f420, - 0x16a4: 0x4059f620, 0x16a5: 0x4059f820, 0x16a6: 0x4059fa20, 0x16a7: 0x4059fc20, - 0x16a8: 0x4059fe20, 0x16a9: 0x405a0020, 0x16aa: 0x405a0220, 0x16ab: 0x405a0420, - 0x16ac: 0x405a0620, 0x16ad: 0x4005d420, 0x16ae: 0x4002f420, 0x16af: 0x40581820, - 0x16b0: 0x40583a20, 0x16b1: 0x40584c20, 0x16b2: 0x40584e20, 0x16b3: 0x40585020, - 0x16b4: 0x40585220, 0x16b5: 0x40585420, 0x16b6: 0x40585620, 0x16b7: 0x405a0820, - 0x16b8: 0x405a0a20, 0x16b9: 0x405a0c20, 0x16ba: 0x405a0e20, 0x16bb: 0x405a1020, - 0x16bc: 0x405a1220, 0x16bd: 0x405a1420, 0x16be: 0x405a1620, 0x16bf: 0x405a1820, - // Block 0x5b, offset 0x16c0 - 0x16c0: 0x00021284, 0x16c1: 0x405aa620, 0x16c2: 0x405aa820, 0x16c3: 0x405aaa20, - 0x16c4: 0x405aac20, 0x16c5: 0x405aae20, 0x16c6: 0x405ab020, 0x16c7: 0x405ab220, - 0x16c8: 0x405ab420, 0x16c9: 0x405ab620, 0x16ca: 0x405ab820, 0x16cb: 0x405aba20, - 0x16cc: 0x405abc20, 0x16cd: 0x405abe20, 0x16ce: 0x405ac020, 0x16cf: 0x405ac220, - 0x16d0: 0x405ac420, 0x16d1: 0x405ac620, 0x16d2: 0x405ac820, 0x16d3: 0x405aca20, - 0x16d4: 0x405acc20, 0x16d5: 0x405ace20, 0x16d6: 0x405ad020, 0x16d7: 0x405ad220, - 0x16d8: 0x405ad420, 0x16d9: 0x405ad620, 0x16da: 0x405ad820, 0x16db: 0x40040820, - 0x16dc: 0x40040a20, - 0x16e0: 0x405ada20, 0x16e1: 0xe000202d, 0x16e2: 0x405adc20, 0x16e3: 0x405b1420, - 0x16e4: 0xe0002030, 0x16e5: 0xe0002033, 0x16e6: 0x405ade20, 0x16e7: 0xe0002036, - 0x16e8: 0x405ae020, 0x16e9: 0xe000203c, 0x16ea: 0x405b1020, 0x16eb: 0x405b1220, - 0x16ec: 0xe000203f, 0x16ed: 0xe0002042, 0x16ee: 0xe0002045, 0x16ef: 0x405ae220, - 0x16f0: 0x405ae420, 0x16f1: 0x405ae620, 0x16f2: 0x405ae820, 0x16f3: 0xe0002048, - 0x16f4: 0xe000204b, 0x16f5: 0xe000204e, 0x16f6: 0xe0002051, 0x16f7: 0x405aea20, - 0x16f8: 0x405b1a20, 0x16f9: 0x405aec20, 0x16fa: 0x405aee20, 0x16fb: 0xe0002057, - 0x16fc: 0xe000205a, 0x16fd: 0xe000205d, 0x16fe: 0x405af020, 0x16ff: 0xe0002060, - // Block 0x5c, offset 0x1700 - 0x1700: 0xe0002063, 0x1701: 0x405af220, 0x1702: 0xe0002066, 0x1703: 0x405af420, - 0x1704: 0xe0002069, 0x1705: 0x405af620, 0x1706: 0xe000206c, 0x1707: 0x405af820, - 0x1708: 0x405afa20, 0x1709: 0x405afc20, 0x170a: 0x405afe20, 0x170b: 0xe0002075, - 0x170c: 0xe000207b, 0x170d: 0xe000207e, 0x170e: 0xe0002081, 0x170f: 0x405b0020, - 0x1710: 0xe0002084, 0x1711: 0xe0002087, 0x1712: 0x405b0220, 0x1713: 0xe000208a, - 0x1714: 0xe000208d, 0x1715: 0xe0002072, 0x1716: 0x405b0420, 0x1717: 0x405b0620, - 0x1718: 0xe0002090, 0x1719: 0xe0002093, 0x171a: 0x405b0820, 0x171b: 0xe000209b, - 0x171c: 0x405b0a20, 0x171d: 0xe000209e, 0x171e: 0x405b0c20, 0x171f: 0x405b0e20, - 0x1720: 0x405b1620, 0x1721: 0x405b1e20, 0x1722: 0x405b2020, 0x1723: 0x405b1820, - 0x1724: 0x405b1c20, 0x1725: 0x405b2220, 0x1726: 0x405b2420, 0x1727: 0xe00020a1, - 0x1728: 0xe00020a4, 0x1729: 0xe0002054, 0x172a: 0xe0002078, 0x172b: 0x4002b220, - 0x172c: 0x4002b420, 0x172d: 0x4002b620, 0x172e: 0xe000206f, 0x172f: 0xe0002096, - 0x1730: 0xe0002039, - // Block 0x5d, offset 0x1740 - 0x1740: 0x404c7620, 0x1741: 0x404c7820, 0x1742: 0x404c7a20, 0x1743: 0x404c7c20, - 0x1744: 0x404c7e20, 0x1745: 0x404c8020, 0x1746: 0x404c8220, 0x1747: 0x404c8420, - 0x1748: 0x404c8620, 0x1749: 0x404c8820, 0x174a: 0x404c8a20, 0x174b: 0x404c8c20, - 0x174c: 0x404c8e20, 0x174e: 0x404c9020, 0x174f: 0x404c9220, - 0x1750: 0x404c9420, 0x1751: 0x404c9620, 0x1752: 0x404c9820, 0x1753: 0x404c9a20, - 0x1754: 0x8209264e, - 0x1760: 0x404c9e20, 0x1761: 0x404ca020, 0x1762: 0x404ca220, 0x1763: 0x404ca420, - 0x1764: 0x404ca620, 0x1765: 0x404ca820, 0x1766: 0x404caa20, 0x1767: 0x404cac20, - 0x1768: 0x404cae20, 0x1769: 0x404cb020, 0x176a: 0x404cb220, 0x176b: 0x404cb420, - 0x176c: 0x404cb620, 0x176d: 0x404cb820, 0x176e: 0x404cba20, 0x176f: 0x404cbc20, - 0x1770: 0x404cbe20, 0x1771: 0x404cc020, 0x1772: 0x404cc220, 0x1773: 0x404cc420, - 0x1774: 0x82092663, 0x1775: 0x40031c20, 0x1776: 0x40031e20, - // Block 0x5e, offset 0x1780 - 0x1780: 0x404cc820, 0x1781: 0x404cca20, 0x1782: 0x404ccc20, 0x1783: 0x404cce20, - 0x1784: 0x404cd020, 0x1785: 0x404cd220, 0x1786: 0x404cd420, 0x1787: 0x404cd620, - 0x1788: 0x404cd820, 0x1789: 0x404cda20, 0x178a: 0x404cdc20, 0x178b: 0x404cde20, - 0x178c: 0x404ce020, 0x178d: 0x404ce220, 0x178e: 0x404ce420, 0x178f: 0x404ce620, - 0x1790: 0x404ce820, 0x1791: 0x404cea20, 0x1792: 0x404cec20, 0x1793: 0x404cee20, - 0x17a0: 0x404cf020, 0x17a1: 0x404cf220, 0x17a2: 0x404cf420, 0x17a3: 0x404cf620, - 0x17a4: 0x404cf820, 0x17a5: 0x404cfa20, 0x17a6: 0x404cfc20, 0x17a7: 0x404cfe20, - 0x17a8: 0x404d0020, 0x17a9: 0x404d0220, 0x17aa: 0x404d0420, 0x17ab: 0x404d0620, - 0x17ac: 0x404d0820, 0x17ae: 0x404d0a20, 0x17af: 0x404d0c20, - 0x17b0: 0x404d0e20, 0x17b2: 0x404d1020, 0x17b3: 0x404d1220, - // Block 0x5f, offset 0x17c0 - 0x17c0: 0x404fa420, 0x17c1: 0x404fa620, 0x17c2: 0x404fa820, 0x17c3: 0x404faa20, - 0x17c4: 0x404fac20, 0x17c5: 0x404fae20, 0x17c6: 0x404fb020, 0x17c7: 0x404fb220, - 0x17c8: 0x404fb420, 0x17c9: 0x404fb620, 0x17ca: 0x404fb820, 0x17cb: 0x404fba20, - 0x17cc: 0x404fbc20, 0x17cd: 0x404fbe20, 0x17ce: 0x404fc020, 0x17cf: 0x404fc220, - 0x17d0: 0x404fc420, 0x17d1: 0x404fc620, 0x17d2: 0x404fc820, 0x17d3: 0x404fca20, - 0x17d4: 0x404fcc20, 0x17d5: 0x404fce20, 0x17d6: 0x404fd020, 0x17d7: 0x404fd220, - 0x17d8: 0x404fd420, 0x17d9: 0x404fd620, 0x17da: 0x404fd820, 0x17db: 0x404fda20, - 0x17dc: 0x404fdc20, 0x17dd: 0x404fde20, 0x17de: 0x404fe020, 0x17df: 0x404fe220, - 0x17e0: 0x404fe420, 0x17e1: 0x404fe620, 0x17e2: 0x404fe820, 0x17e3: 0x404fec20, - 0x17e4: 0x404fee20, 0x17e5: 0x404ff020, 0x17e6: 0x404ff220, 0x17e7: 0x404ff420, - 0x17e8: 0x404ff620, 0x17e9: 0x404ff820, 0x17ea: 0x404ffa20, 0x17eb: 0x404ffc20, - 0x17ec: 0x404ffe20, 0x17ed: 0x40500020, 0x17ee: 0x40500220, 0x17ef: 0x40500420, - 0x17f0: 0x40500620, 0x17f1: 0x40500820, 0x17f2: 0x40500a20, 0x17f3: 0x40500c20, - 0x17f4: 0xa0000000, 0x17f5: 0xa0000000, 0x17f6: 0x40500e20, 0x17f7: 0x40501020, - 0x17f8: 0x40501220, 0x17f9: 0x40501420, 0x17fa: 0x40501620, 0x17fb: 0x40501820, - 0x17fc: 0x40501a20, 0x17fd: 0x40501c20, 0x17fe: 0x40501e20, 0x17ff: 0x40502020, - // Block 0x60, offset 0x1800 - 0x1800: 0x40502220, 0x1801: 0x40502420, 0x1802: 0x40502620, 0x1803: 0x40502820, - 0x1804: 0x40502a20, 0x1805: 0x40502c20, 0x1806: 0xa000f302, 0x1807: 0xa000f402, - 0x1808: 0xa0011402, 0x1809: 0xa0011502, 0x180a: 0xa0011602, 0x180b: 0xa0005f02, - 0x180c: 0xa0005f02, 0x180d: 0xa0005f02, 0x180e: 0xa0005f02, 0x180f: 0xa0005f02, - 0x1810: 0xa0005f02, 0x1811: 0xa0005f02, 0x1812: 0x82092817, 0x1813: 0xa0000000, - 0x1814: 0x40032620, 0x1815: 0x40032820, 0x1816: 0x4002ac20, 0x1817: 0x4027bc20, - 0x1818: 0x4005bc20, 0x1819: 0x4005be20, 0x181a: 0x4005c020, 0x181b: 0x4027f620, - 0x181c: 0x404fea20, 0x181d: 0xae605f02, - 0x1820: 0xe00001b5, 0x1821: 0xe0000249, 0x1822: 0xe0000361, 0x1823: 0xe000043b, - 0x1824: 0xe0000510, 0x1825: 0xe00005da, 0x1826: 0xe00006a5, 0x1827: 0xe000074d, - 0x1828: 0xe00007f9, 0x1829: 0xe000089e, - 0x1830: 0xe00001b8, 0x1831: 0xe000024c, 0x1832: 0xe0000364, 0x1833: 0xe000043e, - 0x1834: 0xe0000513, 0x1835: 0xe00005dd, 0x1836: 0xe00006a8, 0x1837: 0xe0000750, - 0x1838: 0xe00007fc, 0x1839: 0xe00008a1, - // Block 0x61, offset 0x1840 - 0x1840: 0x40056a20, 0x1841: 0x4002e620, 0x1842: 0x40025220, 0x1843: 0x4002f020, - 0x1844: 0x4002a620, 0x1845: 0x4002a820, 0x1846: 0x40022220, 0x1847: 0x40022420, - 0x1848: 0x40025420, 0x1849: 0x4002f220, 0x184a: 0xa0000000, 0x184b: 0xa0000000, - 0x184c: 0xa0000000, 0x184d: 0xa0000000, 0x184e: 0x40020c20, - 0x1850: 0xe00001c7, 0x1851: 0xe000025b, 0x1852: 0xe0000373, 0x1853: 0xe000044d, - 0x1854: 0xe0000522, 0x1855: 0xe00005ec, 0x1856: 0xe00006b7, 0x1857: 0xe000075f, - 0x1858: 0xe000080b, 0x1859: 0xe00008b0, - 0x1860: 0x40533820, 0x1861: 0x40533c20, 0x1862: 0x40534220, 0x1863: 0x40534e20, - 0x1864: 0x40535220, 0x1865: 0x40535820, 0x1866: 0x40535c20, 0x1867: 0x40536220, - 0x1868: 0x40536420, 0x1869: 0x40536620, 0x186a: 0x40537020, 0x186b: 0x40537420, - 0x186c: 0x40537a20, 0x186d: 0x40537e20, 0x186e: 0x40538820, 0x186f: 0x40538c20, - 0x1870: 0x40538e20, 0x1871: 0x40539020, 0x1872: 0x40539e20, 0x1873: 0x4053a420, - 0x1874: 0x4053aa20, 0x1875: 0x4053b420, 0x1876: 0x4053bc20, 0x1877: 0x4053c220, - 0x1878: 0x4053c620, 0x1879: 0x4053ca20, 0x187a: 0x4053d020, 0x187b: 0x4053da20, - 0x187c: 0x4053dc20, 0x187d: 0x4053e220, 0x187e: 0x4053ea20, 0x187f: 0x4053f020, - // Block 0x62, offset 0x1880 - 0x1880: 0x4053f220, 0x1881: 0x4053f420, 0x1882: 0x4053f620, 0x1883: 0x40533620, - 0x1884: 0x40533e20, 0x1885: 0x40534420, 0x1886: 0x40535020, 0x1887: 0x40535420, - 0x1888: 0x40535a20, 0x1889: 0x40535e20, 0x188a: 0x40536820, 0x188b: 0x40537220, - 0x188c: 0x40537620, 0x188d: 0x40537c20, 0x188e: 0x40538020, 0x188f: 0x40538a20, - 0x1890: 0x4053a020, 0x1891: 0x4053a620, 0x1892: 0x4053ac20, 0x1893: 0x4053b620, - 0x1894: 0x4053de20, 0x1895: 0x4053be20, 0x1896: 0x4053c820, 0x1897: 0x4053d220, - 0x1898: 0x4053e620, 0x1899: 0x4053ec20, 0x189a: 0x4053f820, 0x189b: 0x4053fa20, - 0x189c: 0x4053b020, 0x189d: 0x40534020, 0x189e: 0x40534620, 0x189f: 0x40534c20, - 0x18a0: 0x40536020, 0x18a1: 0x40535620, 0x18a2: 0x40536a20, 0x18a3: 0x4053d420, - 0x18a4: 0x40538220, 0x18a5: 0x40538620, 0x18a6: 0x40537820, 0x18a7: 0x40539220, - 0x18a8: 0x4053a220, 0x18a9: 0x4053a820, 0x18aa: 0x4053b820, 0x18ab: 0x4053cc20, - 0x18ac: 0x4053e820, 0x18ad: 0x4053ee20, 0x18ae: 0x4053e020, 0x18af: 0x4053e420, - 0x18b0: 0x4053fc20, 0x18b1: 0x4053ae20, 0x18b2: 0x4053c020, 0x18b3: 0x40534820, - 0x18b4: 0x4053d620, 0x18b5: 0x4053c420, 0x18b6: 0x4053ce20, 0x18b7: 0x4053ba20, - // Block 0x63, offset 0x18c0 - 0x18c0: 0x40532820, 0x18c1: 0x40532a20, 0x18c2: 0x40532c20, 0x18c3: 0x40532e20, - 0x18c4: 0x40533020, 0x18c5: 0x40533220, 0x18c6: 0x40533420, 0x18c7: 0x40533a20, - 0x18c8: 0x40534a20, 0x18c9: 0x4053d820, 0x18ca: 0x40536c20, 0x18cb: 0x4053b220, - 0x18cc: 0x4053fe20, 0x18cd: 0x40540220, 0x18ce: 0x40540420, 0x18cf: 0x40540820, - 0x18d0: 0x40540a20, 0x18d1: 0x40541020, 0x18d2: 0x40541420, 0x18d3: 0x40541620, - 0x18d4: 0x40541a20, 0x18d5: 0x40541e20, 0x18d6: 0x40542220, 0x18d7: 0x40542420, - 0x18d8: 0x40540c20, 0x18d9: 0x40542020, 0x18da: 0x40538420, 0x18db: 0x40536e20, - 0x18dc: 0x40539420, 0x18dd: 0x40539620, 0x18de: 0x40540020, 0x18df: 0x40540620, - 0x18e0: 0x40540e20, 0x18e1: 0x40541220, 0x18e2: 0x40539820, 0x18e3: 0x40541c20, - 0x18e4: 0x40539a20, 0x18e5: 0x40539c20, 0x18e6: 0x40542620, 0x18e7: 0x40542820, - 0x18e8: 0x40541820, 0x18e9: 0x82e42a16, 0x18ea: 0x40542a20, - 0x18f0: 0x405a1a20, 0x18f1: 0x405a1c20, 0x18f2: 0x405a1e20, 0x18f3: 0x405a2020, - 0x18f4: 0x405a2220, 0x18f5: 0x405a2420, 0x18f6: 0x405a2620, 0x18f7: 0x405a2820, - 0x18f8: 0x405a2a20, 0x18f9: 0x405a2c20, 0x18fa: 0x405a2e20, 0x18fb: 0x405a3020, - 0x18fc: 0x405a3220, 0x18fd: 0x405a3420, 0x18fe: 0x405a3620, 0x18ff: 0x405a3820, - // Block 0x64, offset 0x1900 - 0x1900: 0x405a3a20, 0x1901: 0x405a3c20, 0x1902: 0x405a3e20, 0x1903: 0x405a4020, - 0x1904: 0x405a4220, 0x1905: 0x405a4420, 0x1906: 0x405a4620, 0x1907: 0x405a4820, - 0x1908: 0x405a4a20, 0x1909: 0x405a4c20, 0x190a: 0x405a4e20, 0x190b: 0x405a5020, - 0x190c: 0x405a5220, 0x190d: 0x405a5420, 0x190e: 0x405a5620, 0x190f: 0x405a5820, - 0x1910: 0x405a5a20, 0x1911: 0x405a5c20, 0x1912: 0x405a5e20, 0x1913: 0x405a6020, - 0x1914: 0x405a6220, 0x1915: 0x405a6420, 0x1916: 0x405a6620, 0x1917: 0x405a6820, - 0x1918: 0x405a6a20, 0x1919: 0x405a6c20, 0x191a: 0x405a6e20, 0x191b: 0x405a7020, - 0x191c: 0x405a7220, 0x191d: 0x405a7420, 0x191e: 0x405a7620, 0x191f: 0x405a7820, - 0x1920: 0x405a7a20, 0x1921: 0x405a7c20, 0x1922: 0x405a7e20, 0x1923: 0x405a8020, - 0x1924: 0x405a8220, 0x1925: 0x405a8420, 0x1926: 0x405a8620, 0x1927: 0x405a8820, - 0x1928: 0x405a8a20, 0x1929: 0x405a8c20, 0x192a: 0x405a8e20, 0x192b: 0x405a9020, - 0x192c: 0x405a9220, 0x192d: 0x405a9420, 0x192e: 0x405a9620, 0x192f: 0x405a9820, - 0x1930: 0x405a9a20, 0x1931: 0x405a9c20, 0x1932: 0x405a9e20, 0x1933: 0x405aa020, - 0x1934: 0x405aa220, 0x1935: 0x405aa420, - // Block 0x65, offset 0x1940 - 0x1940: 0x404c1220, 0x1941: 0x404c1420, 0x1942: 0x404c1620, 0x1943: 0x404c1820, - 0x1944: 0x404c1a20, 0x1945: 0x404c1c20, 0x1946: 0x404c1e20, 0x1947: 0x404c2020, - 0x1948: 0x404c2220, 0x1949: 0x404c2420, 0x194a: 0x404c2620, 0x194b: 0x404c2820, - 0x194c: 0x404c2a20, 0x194d: 0x404c2c20, 0x194e: 0x404c2e20, 0x194f: 0x404c3020, - 0x1950: 0x404c3220, 0x1951: 0x404c3420, 0x1952: 0x404c3620, 0x1953: 0x404c3820, - 0x1954: 0x404c3a20, 0x1955: 0x404c3c20, 0x1956: 0x404c3e20, 0x1957: 0x404c4020, - 0x1958: 0x404c4220, 0x1959: 0x404c4420, 0x195a: 0x404c4620, 0x195b: 0x404c4820, - 0x195c: 0x404c4a20, - 0x1960: 0x404c4c20, 0x1961: 0x404c4e20, 0x1962: 0x404c5020, 0x1963: 0x404c5220, - 0x1964: 0x404c5420, 0x1965: 0x404c5620, 0x1966: 0x404c5820, 0x1967: 0x404c5a20, - 0x1968: 0x404c5c20, 0x1969: 0x404c5e20, 0x196a: 0x404c6020, 0x196b: 0x404c6220, - 0x1970: 0x404c6420, 0x1971: 0x404c6620, 0x1972: 0x404c6820, 0x1973: 0x404c6a20, - 0x1974: 0x404c6c20, 0x1975: 0x404c6e20, 0x1976: 0x404c7020, 0x1977: 0x404c7220, - 0x1978: 0x404c7420, 0x1979: 0xade11f02, 0x197a: 0xae612002, 0x197b: 0xadc12102, - // Block 0x66, offset 0x1980 - 0x1980: 0x4007a620, - 0x1984: 0x4002c220, 0x1985: 0x4002d220, 0x1986: 0xe000018e, 0x1987: 0xe000021f, - 0x1988: 0xe000033a, 0x1989: 0xe0000414, 0x198a: 0xe00004e9, 0x198b: 0xe00005b3, - 0x198c: 0xe000067e, 0x198d: 0xe0000726, 0x198e: 0xe00007d2, 0x198f: 0xe0000877, - 0x1990: 0x40503020, 0x1991: 0x40503220, 0x1992: 0x40503420, 0x1993: 0x40503620, - 0x1994: 0x40503820, 0x1995: 0x40503a20, 0x1996: 0x40503c20, 0x1997: 0x40503e20, - 0x1998: 0x40504020, 0x1999: 0x40504220, 0x199a: 0x40504420, 0x199b: 0x40504620, - 0x199c: 0x40504820, 0x199d: 0x40504a20, 0x199e: 0x40504c20, 0x199f: 0x40504e20, - 0x19a0: 0x40505020, 0x19a1: 0x40505220, 0x19a2: 0x40505420, 0x19a3: 0x40505620, - 0x19a4: 0x40505820, 0x19a5: 0x40505a20, 0x19a6: 0x40505c20, 0x19a7: 0x40505e20, - 0x19a8: 0x40506020, 0x19a9: 0x40506220, 0x19aa: 0x40506420, 0x19ab: 0x40506620, - 0x19ac: 0x40506820, 0x19ad: 0x40506a20, - 0x19b0: 0x40506c20, 0x19b1: 0x40506e20, 0x19b2: 0x40507020, 0x19b3: 0x40507220, - 0x19b4: 0x40507420, - // Block 0x67, offset 0x19c0 - 0x19c0: 0x40507620, 0x19c1: 0x40507820, 0x19c2: 0x40507a20, 0x19c3: 0x40507c20, - 0x19c4: 0x40507e20, 0x19c5: 0x40508020, 0x19c6: 0x40508220, 0x19c7: 0x40508420, - 0x19c8: 0x40508620, 0x19c9: 0x40508820, 0x19ca: 0x40508a20, 0x19cb: 0x40508c20, - 0x19cc: 0x40508e20, 0x19cd: 0x40509020, 0x19ce: 0x40509220, 0x19cf: 0x40509420, - 0x19d0: 0x40509620, 0x19d1: 0x40509820, 0x19d2: 0x40509a20, 0x19d3: 0x40509c20, - 0x19d4: 0x40509e20, 0x19d5: 0x4050a020, 0x19d6: 0x4050a220, 0x19d7: 0x4050a420, - 0x19d8: 0x4050a620, 0x19d9: 0x4050a820, 0x19da: 0x4050aa20, 0x19db: 0x4050ac20, - 0x19dc: 0x4050ae20, 0x19dd: 0x4050b020, 0x19de: 0x4050b220, 0x19df: 0x4050b420, - 0x19e0: 0x4050b620, 0x19e1: 0x4050b820, 0x19e2: 0x4050ba20, 0x19e3: 0x4050bc20, - 0x19e4: 0x4050be20, 0x19e5: 0x4050c020, 0x19e6: 0x4050c220, 0x19e7: 0x4050c420, - 0x19e8: 0x4050c620, 0x19e9: 0x4050c820, 0x19ea: 0x4050ca20, 0x19eb: 0x4050cc20, - 0x19f0: 0x4050ce20, 0x19f1: 0x4050d020, 0x19f2: 0x4050d220, 0x19f3: 0x4050d420, - 0x19f4: 0x4050d620, 0x19f5: 0x4050d820, 0x19f6: 0x4050da20, 0x19f7: 0x4050dc20, - 0x19f8: 0x4050de20, 0x19f9: 0x4050e020, 0x19fa: 0x4050e220, 0x19fb: 0x4050e420, - 0x19fc: 0x4050e620, 0x19fd: 0x4050e820, 0x19fe: 0x4050ea20, 0x19ff: 0x4050ec20, - // Block 0x68, offset 0x1a00 - 0x1a00: 0x4050ee20, 0x1a01: 0x4050f020, 0x1a02: 0x4050f220, 0x1a03: 0x4050f420, - 0x1a04: 0x4050f620, 0x1a05: 0x4050f820, 0x1a06: 0x4050fa20, 0x1a07: 0x4050fc20, - 0x1a08: 0x4050fe20, 0x1a09: 0x40510020, - 0x1a10: 0xe0000191, 0x1a11: 0xe0000222, 0x1a12: 0xe000033d, 0x1a13: 0xe0000417, - 0x1a14: 0xe00004ec, 0x1a15: 0xe00005b6, 0x1a16: 0xe0000681, 0x1a17: 0xe0000729, - 0x1a18: 0xe00007d5, 0x1a19: 0xe000087a, 0x1a1a: 0xe0000225, - 0x1a1e: 0xe0002022, 0x1a1f: 0xe0002025, - 0x1a20: 0x4007b220, 0x1a21: 0x4007b420, 0x1a22: 0x4007b620, 0x1a23: 0x4007b820, - 0x1a24: 0x4007ba20, 0x1a25: 0x4007bc20, 0x1a26: 0x4007be20, 0x1a27: 0x4007c020, - 0x1a28: 0x4007c220, 0x1a29: 0x4007c420, 0x1a2a: 0x4007c620, 0x1a2b: 0x4007c820, - 0x1a2c: 0x4007ca20, 0x1a2d: 0x4007cc20, 0x1a2e: 0x4007ce20, 0x1a2f: 0x4007d020, - 0x1a30: 0x4007d220, 0x1a31: 0x4007d420, 0x1a32: 0x4007d620, 0x1a33: 0x4007d820, - 0x1a34: 0x4007da20, 0x1a35: 0x4007dc20, 0x1a36: 0x4007de20, 0x1a37: 0x4007e020, - 0x1a38: 0x4007e220, 0x1a39: 0x4007e420, 0x1a3a: 0x4007e620, 0x1a3b: 0x4007e820, - 0x1a3c: 0x4007ea20, 0x1a3d: 0x4007ec20, 0x1a3e: 0x4007ee20, 0x1a3f: 0x4007f020, - // Block 0x69, offset 0x1a40 - 0x1a40: 0x404d1420, 0x1a41: 0x404d1620, 0x1a42: 0x404d1820, 0x1a43: 0x404d1a20, - 0x1a44: 0x404d1c20, 0x1a45: 0x404d1e20, 0x1a46: 0x404d2020, 0x1a47: 0x404d2220, - 0x1a48: 0x404d2420, 0x1a49: 0x404d2620, 0x1a4a: 0x404d2820, 0x1a4b: 0x404d2a20, - 0x1a4c: 0x404d2c20, 0x1a4d: 0x404d2e20, 0x1a4e: 0x404d3020, 0x1a4f: 0x404d3220, - 0x1a50: 0x404d3420, 0x1a51: 0x404d3620, 0x1a52: 0x404d3820, 0x1a53: 0x404d3a20, - 0x1a54: 0x404d3c20, 0x1a55: 0x404d3e20, 0x1a56: 0x404d4020, 0x1a57: 0x82e626a1, - 0x1a58: 0x82dc26a2, 0x1a59: 0x404d4620, 0x1a5a: 0x404d4820, 0x1a5b: 0x404d4a20, - 0x1a5e: 0x40036620, 0x1a5f: 0x40036820, - 0x1a60: 0x40510220, 0x1a61: 0x40510420, 0x1a62: 0x40510620, 0x1a63: 0x40510820, - 0x1a64: 0x40510a20, 0x1a65: 0x40510c20, 0x1a66: 0x40510e20, 0x1a67: 0x40511020, - 0x1a68: 0x40511220, 0x1a69: 0x40511420, 0x1a6a: 0x40511620, 0x1a6b: 0x40511820, - 0x1a6c: 0x40511a20, 0x1a6d: 0x40511c20, 0x1a6e: 0x40511e20, 0x1a6f: 0x40512020, - 0x1a70: 0x40512220, 0x1a71: 0x40512420, 0x1a72: 0x40512620, 0x1a73: 0x40512820, - 0x1a74: 0x40512a20, 0x1a75: 0x40512c20, 0x1a76: 0x40512e20, 0x1a77: 0x40513020, - 0x1a78: 0x40513220, 0x1a79: 0x40513420, 0x1a7a: 0x40513620, 0x1a7b: 0x40513820, - 0x1a7c: 0x40513a20, 0x1a7d: 0x40513c20, 0x1a7e: 0x40513e20, 0x1a7f: 0x40514020, - // Block 0x6a, offset 0x1a80 - 0x1a80: 0x40514220, 0x1a81: 0x40514420, 0x1a82: 0x40514620, 0x1a83: 0x40514820, - 0x1a84: 0x40514a20, 0x1a85: 0x40514c20, 0x1a86: 0x40514e20, 0x1a87: 0x40515020, - 0x1a88: 0x40515220, 0x1a89: 0x40515420, 0x1a8a: 0x40515620, 0x1a8b: 0x40515820, - 0x1a8c: 0x40515a20, 0x1a8d: 0x40516c20, 0x1a8e: 0x40516e20, 0x1a8f: 0x40517020, - 0x1a90: 0x40517220, 0x1a91: 0x40517420, 0x1a92: 0x40517620, 0x1a93: 0x40515c20, - 0x1a94: 0xe0002029, 0x1a95: 0x40516020, 0x1a96: 0x40516220, 0x1a97: 0x40516420, - 0x1a98: 0x00510e84, 0x1a99: 0x00510e84, 0x1a9a: 0x00513884, 0x1a9b: 0x00513884, - 0x1a9c: 0x40516620, 0x1a9d: 0x40516820, 0x1a9e: 0x40516a20, - 0x1aa0: 0x820928cd, 0x1aa1: 0x40517820, 0x1aa2: 0x40517c20, 0x1aa3: 0x40517e20, - 0x1aa4: 0x00517e84, 0x1aa5: 0x40518020, 0x1aa6: 0x40518220, 0x1aa7: 0x40518420, - 0x1aa8: 0x40518620, 0x1aa9: 0x40518820, 0x1aaa: 0x40518a20, 0x1aab: 0x40515e20, - 0x1aac: 0x40517a20, 0x1aad: 0x40519820, 0x1aae: 0x40518c20, 0x1aaf: 0x40518e20, - 0x1ab0: 0x40519220, 0x1ab1: 0x40519420, 0x1ab2: 0x40519620, 0x1ab3: 0x40519020, - 0x1ab4: 0xa000f302, 0x1ab5: 0xae611702, 0x1ab6: 0xae611802, 0x1ab7: 0xae611902, - 0x1ab8: 0xae611a02, 0x1ab9: 0xae611b02, 0x1aba: 0xae611c02, 0x1abb: 0xae611d02, - 0x1abc: 0xae611e02, 0x1abf: 0xadc00000, - // Block 0x6b, offset 0x1ac0 - 0x1ac0: 0xe0000194, 0x1ac1: 0xe0000228, 0x1ac2: 0xe0000340, 0x1ac3: 0xe000041a, - 0x1ac4: 0xe00004ef, 0x1ac5: 0xe00005b9, 0x1ac6: 0xe0000684, 0x1ac7: 0xe000072c, - 0x1ac8: 0xe00007d8, 0x1ac9: 0xe000087d, - 0x1ad0: 0xe0000197, 0x1ad1: 0xe000022b, 0x1ad2: 0xe0000343, 0x1ad3: 0xe000041d, - 0x1ad4: 0xe00004f2, 0x1ad5: 0xe00005bc, 0x1ad6: 0xe0000687, 0x1ad7: 0xe000072f, - 0x1ad8: 0xe00007db, 0x1ad9: 0xe0000880, - 0x1ae0: 0x4005c220, 0x1ae1: 0x4005c420, 0x1ae2: 0x4005c620, 0x1ae3: 0x4005c820, - 0x1ae4: 0x4005ca20, 0x1ae5: 0x4005cc20, 0x1ae6: 0x4005ce20, 0x1ae7: 0x4027be20, - 0x1ae8: 0x40032a20, 0x1ae9: 0x40032c20, 0x1aea: 0x40032e20, 0x1aeb: 0x40033020, - 0x1aec: 0x4005d020, 0x1aed: 0x4005d220, - // Block 0x6c, offset 0x1b00 - 0x1b00: 0xa000f202, 0x1b01: 0xa000f202, 0x1b02: 0xa000f302, 0x1b03: 0xa000f702, - 0x1b04: 0xa000f402, 0x1b05: 0xc3190821, 0x1b06: 0x40522820, 0x1b07: 0xc31b0821, - 0x1b08: 0x40522c20, 0x1b09: 0xc31d0821, 0x1b0a: 0x40523020, 0x1b0b: 0xc31f0821, - 0x1b0c: 0x40523420, 0x1b0d: 0xc3210821, 0x1b0e: 0x40523820, 0x1b0f: 0x40523a20, - 0x1b10: 0x40523c20, 0x1b11: 0xc3230821, 0x1b12: 0x40524020, 0x1b13: 0x40524220, - 0x1b14: 0x40524820, 0x1b15: 0x40524a20, 0x1b16: 0x40524c20, 0x1b17: 0x40524e20, - 0x1b18: 0x40525020, 0x1b19: 0x40525220, 0x1b1a: 0x40525420, 0x1b1b: 0x40525620, - 0x1b1c: 0x40525820, 0x1b1d: 0x40525a20, 0x1b1e: 0x40525c20, 0x1b1f: 0x40525e20, - 0x1b20: 0x40526020, 0x1b21: 0x40526220, 0x1b22: 0x40526420, 0x1b23: 0x40526820, - 0x1b24: 0x40526a20, 0x1b25: 0x40526c20, 0x1b26: 0x40526e20, 0x1b27: 0x40527020, - 0x1b28: 0x40527420, 0x1b29: 0x40527620, 0x1b2a: 0x40527820, 0x1b2b: 0x40527a20, - 0x1b2c: 0x40527c20, 0x1b2d: 0x40527e20, 0x1b2e: 0x40528020, 0x1b2f: 0x40528220, - 0x1b30: 0x40528620, 0x1b31: 0x40528820, 0x1b32: 0x40528a20, 0x1b33: 0x40529020, - 0x1b34: 0xa070f102, 0x1b35: 0x40529220, 0x1b36: 0x40529420, 0x1b37: 0x40529620, - 0x1b38: 0x40529820, 0x1b39: 0x40529a20, 0x1b3a: 0xc3250821, 0x1b3b: 0x40529e20, - 0x1b3c: 0xc3270821, 0x1b3d: 0x4052a220, 0x1b3e: 0xc3290821, 0x1b3f: 0xc32b0821, - // Block 0x6d, offset 0x1b40 - 0x1b40: 0x4052a820, 0x1b41: 0x4052aa20, 0x1b42: 0xc32d0821, 0x1b43: 0x4052ae20, - 0x1b44: 0x82092958, 0x1b45: 0x40524420, 0x1b46: 0x40524620, 0x1b47: 0x40526620, - 0x1b48: 0x40527220, 0x1b49: 0x40528420, 0x1b4a: 0x40528c20, 0x1b4b: 0x40528e20, - 0x1b50: 0xe00001be, 0x1b51: 0xe0000252, 0x1b52: 0xe000036a, 0x1b53: 0xe0000444, - 0x1b54: 0xe0000519, 0x1b55: 0xe00005e3, 0x1b56: 0xe00006ae, 0x1b57: 0xe0000756, - 0x1b58: 0xe0000802, 0x1b59: 0xe00008a7, 0x1b5a: 0x40036a20, 0x1b5b: 0x40036c20, - 0x1b5c: 0x4002f620, 0x1b5d: 0x4002ae20, 0x1b5e: 0x40033220, 0x1b5f: 0x40033420, - 0x1b60: 0x40022020, 0x1b61: 0x4007f220, 0x1b62: 0x4007f420, 0x1b63: 0x4007f620, - 0x1b64: 0x4007f820, 0x1b65: 0x4007fa20, 0x1b66: 0x4007fc20, 0x1b67: 0x4007fe20, - 0x1b68: 0x40080020, 0x1b69: 0x40080220, 0x1b6a: 0x40080420, 0x1b6b: 0xae600000, - 0x1b6c: 0xadc00000, 0x1b6d: 0xae600000, 0x1b6e: 0xae600000, 0x1b6f: 0xae600000, - 0x1b70: 0xae600000, 0x1b71: 0xae600000, 0x1b72: 0xae600000, 0x1b73: 0xae600000, - 0x1b74: 0x40080620, 0x1b75: 0x40080820, 0x1b76: 0x40080a20, 0x1b77: 0x40080c20, - 0x1b78: 0x40080e20, 0x1b79: 0x40081020, 0x1b7a: 0x40081220, 0x1b7b: 0x40081420, - 0x1b7c: 0x40081620, - // Block 0x6e, offset 0x1b80 - 0x1b80: 0xa000f302, 0x1b81: 0xa000f902, 0x1b82: 0xa000f402, 0x1b83: 0x4047d420, - 0x1b84: 0x4047d620, 0x1b85: 0x4047d820, 0x1b86: 0x4047da20, 0x1b87: 0x4047dc20, - 0x1b88: 0x4047de20, 0x1b89: 0x4047e020, 0x1b8a: 0x4047e220, 0x1b8b: 0x4047e620, - 0x1b8c: 0x4047e820, 0x1b8d: 0x4047ea20, 0x1b8e: 0x4047ec20, 0x1b8f: 0x4047ee20, - 0x1b90: 0x4047f020, 0x1b91: 0x4047f220, 0x1b92: 0x4047f420, 0x1b93: 0x4047f620, - 0x1b94: 0x4047f820, 0x1b95: 0x4047fa20, 0x1b96: 0x4047fc20, 0x1b97: 0x4047fe20, - 0x1b98: 0x40480020, 0x1b99: 0x40480420, 0x1b9a: 0x40480820, 0x1b9b: 0x40480c20, - 0x1b9c: 0x40481220, 0x1b9d: 0x40481820, 0x1b9e: 0x40481c20, 0x1b9f: 0x40481e20, - 0x1ba0: 0x40482220, 0x1ba1: 0x40480a20, 0x1ba2: 0x40480e20, 0x1ba3: 0x40481420, - 0x1ba4: 0x40482420, 0x1ba5: 0x40482620, 0x1ba6: 0x40482820, 0x1ba7: 0x40482a20, - 0x1ba8: 0x40482c20, 0x1ba9: 0x40482e20, 0x1baa: 0x82092418, 0x1bab: 0x82092419, - 0x1bac: 0x40480620, 0x1bad: 0x40481a20, 0x1bae: 0x4047e420, 0x1baf: 0x40482020, - 0x1bb0: 0xe00001c4, 0x1bb1: 0xe0000258, 0x1bb2: 0xe0000370, 0x1bb3: 0xe000044a, - 0x1bb4: 0xe000051f, 0x1bb5: 0xe00005e9, 0x1bb6: 0xe00006b4, 0x1bb7: 0xe000075c, - 0x1bb8: 0xe0000808, 0x1bb9: 0xe00008ad, 0x1bba: 0x0047d484, 0x1bbb: 0x40481020, - 0x1bbc: 0x40481620, 0x1bbd: 0x40480220, 0x1bbe: 0x0047e299, 0x1bbf: 0x00480499, - // Block 0x6f, offset 0x1bc0 - 0x1bc0: 0x404d4c20, 0x1bc1: 0x004d4c84, 0x1bc2: 0x404d4e20, 0x1bc3: 0x004d4e84, - 0x1bc4: 0x004d4e84, 0x1bc5: 0x404d5020, 0x1bc6: 0x004d5084, 0x1bc7: 0x404d5220, - 0x1bc8: 0x004d5284, 0x1bc9: 0x404d5420, 0x1bca: 0x004d5484, 0x1bcb: 0x404d5620, - 0x1bcc: 0x004d5684, 0x1bcd: 0x004d5684, 0x1bce: 0x404d5820, 0x1bcf: 0x004d5884, - 0x1bd0: 0x404d5a20, 0x1bd1: 0x404d5c20, 0x1bd2: 0x404d5e20, 0x1bd3: 0x004d5e84, - 0x1bd4: 0x404d6020, 0x1bd5: 0x004d6084, 0x1bd6: 0x404d6220, 0x1bd7: 0x004d6284, - 0x1bd8: 0x404d6420, 0x1bd9: 0x004d6484, 0x1bda: 0x004d6484, 0x1bdb: 0x404d6620, - 0x1bdc: 0x004d6684, 0x1bdd: 0x404d6820, 0x1bde: 0x404d6a20, 0x1bdf: 0x004d6a84, - 0x1be0: 0x404d6c20, 0x1be1: 0x404d6e20, 0x1be2: 0x404d7020, 0x1be3: 0x404d7220, - 0x1be4: 0x404d7420, 0x1be5: 0x404d7620, 0x1be6: 0xa070f102, 0x1be7: 0x404d7820, - 0x1be8: 0x004d7884, 0x1be9: 0x404d7a20, 0x1bea: 0x404d7c20, 0x1beb: 0x004d7c84, - 0x1bec: 0x404d7e20, 0x1bed: 0x004d7e84, 0x1bee: 0x404d8020, 0x1bef: 0x004d8084, - 0x1bf0: 0x404d8220, 0x1bf1: 0x404d8420, 0x1bf2: 0x820926c3, 0x1bf3: 0x820926c4, - 0x1bfc: 0x4005ec20, 0x1bfd: 0x4005ee20, 0x1bfe: 0x4005f020, 0x1bff: 0x4005f220, - // Block 0x70, offset 0x1c00 - 0x1c00: 0x404b3620, 0x1c01: 0x404b3820, 0x1c02: 0x404b3a20, 0x1c03: 0x404b3c20, - 0x1c04: 0x404b3e20, 0x1c05: 0x404b4020, 0x1c06: 0x404b4220, 0x1c07: 0x404b4420, - 0x1c08: 0x404b4620, 0x1c09: 0x404b4820, 0x1c0a: 0x404b5020, 0x1c0b: 0x404b5220, - 0x1c0c: 0x404b5420, 0x1c0d: 0x404b5620, 0x1c0e: 0x404b5820, 0x1c0f: 0x404b5a20, - 0x1c10: 0x404b5c20, 0x1c11: 0x404b5e20, 0x1c12: 0x404b6020, 0x1c13: 0x404b6220, - 0x1c14: 0x404b6420, 0x1c15: 0x404b6620, 0x1c16: 0x404b6820, 0x1c17: 0x404b6a20, - 0x1c18: 0x404b6c20, 0x1c19: 0x404b6e20, 0x1c1a: 0x404b7020, 0x1c1b: 0x404b7420, - 0x1c1c: 0x404b7820, 0x1c1d: 0x404b7a20, 0x1c1e: 0x404b7c20, 0x1c1f: 0x404b7e20, - 0x1c20: 0x404b8020, 0x1c21: 0x404b8220, 0x1c22: 0x404b8420, 0x1c23: 0x404b8620, - 0x1c24: 0x404b7220, 0x1c25: 0x404b7620, 0x1c26: 0x404b8a20, 0x1c27: 0x404b8c20, - 0x1c28: 0x404b8e20, 0x1c29: 0x404b9020, 0x1c2a: 0x404b9220, 0x1c2b: 0x404b9420, - 0x1c2c: 0x404b9620, 0x1c2d: 0x404b9820, 0x1c2e: 0x404b9a20, 0x1c2f: 0x404b9c20, - 0x1c30: 0x404b9e20, 0x1c31: 0x404ba020, 0x1c32: 0x404ba220, 0x1c33: 0x404ba420, - 0x1c34: 0x404ba620, 0x1c35: 0x404ba820, 0x1c36: 0x404b8820, 0x1c37: 0xa070f102, - 0x1c3b: 0x40031420, - 0x1c3c: 0x40031620, 0x1c3d: 0x4005ae20, 0x1c3e: 0x4005b020, 0x1c3f: 0x4005b220, - // Block 0x71, offset 0x1c40 - 0x1c40: 0xe00001a6, 0x1c41: 0xe000023a, 0x1c42: 0xe0000352, 0x1c43: 0xe000042c, - 0x1c44: 0xe0000501, 0x1c45: 0xe00005cb, 0x1c46: 0xe0000696, 0x1c47: 0xe000073e, - 0x1c48: 0xe00007ea, 0x1c49: 0xe000088f, - 0x1c4d: 0x404b4a20, 0x1c4e: 0x404b4c20, 0x1c4f: 0x404b4e20, - 0x1c50: 0xe00001ca, 0x1c51: 0xe000025e, 0x1c52: 0xe0000376, 0x1c53: 0xe0000450, - 0x1c54: 0xe0000525, 0x1c55: 0xe00005ef, 0x1c56: 0xe00006ba, 0x1c57: 0xe0000762, - 0x1c58: 0xe000080e, 0x1c59: 0xe00008b3, 0x1c5a: 0x40542e20, 0x1c5b: 0x40543020, - 0x1c5c: 0x40543220, 0x1c5d: 0x40543420, 0x1c5e: 0x40543620, 0x1c5f: 0x40543820, - 0x1c60: 0x40543a20, 0x1c61: 0x40543c20, 0x1c62: 0x40543e20, 0x1c63: 0x40544020, - 0x1c64: 0x40544220, 0x1c65: 0x40544420, 0x1c66: 0x40544620, 0x1c67: 0x40544820, - 0x1c68: 0x40544a20, 0x1c69: 0x40544c20, 0x1c6a: 0x40544e20, 0x1c6b: 0x40545020, - 0x1c6c: 0x40545220, 0x1c6d: 0x40545420, 0x1c6e: 0x40545620, 0x1c6f: 0x40545820, - 0x1c70: 0x40545a20, 0x1c71: 0x40545c20, 0x1c72: 0x40545e20, 0x1c73: 0x40546020, - 0x1c74: 0x40546220, 0x1c75: 0x40546420, 0x1c76: 0x40546620, 0x1c77: 0x40546820, - 0x1c78: 0x40546a20, 0x1c79: 0x40546c20, 0x1c7a: 0x40546e20, 0x1c7b: 0x40547020, - 0x1c7c: 0x40547220, 0x1c7d: 0x40547420, 0x1c7e: 0x40035820, 0x1c7f: 0x40035a20, - // Block 0x72, offset 0x1c80 - 0x1c80: 0x4005d620, 0x1c81: 0x4005d820, 0x1c82: 0x4005da20, 0x1c83: 0x4005dc20, - 0x1c84: 0x4005de20, 0x1c85: 0x4005e020, 0x1c86: 0x4005e220, 0x1c87: 0x4005e420, - 0x1c90: 0xae600000, 0x1c91: 0xae600000, 0x1c92: 0xae600000, 0x1c93: 0xa0000000, - 0x1c94: 0xa0100000, 0x1c95: 0xadc00000, 0x1c96: 0xadc00000, 0x1c97: 0xadc00000, - 0x1c98: 0xadc00000, 0x1c99: 0xadc00000, 0x1c9a: 0xae600000, 0x1c9b: 0xae600000, - 0x1c9c: 0xadc00000, 0x1c9d: 0xadc00000, 0x1c9e: 0xadc00000, 0x1c9f: 0xadc00000, - 0x1ca0: 0xae600000, 0x1ca1: 0xa0000000, 0x1ca2: 0xa0100000, 0x1ca3: 0xa0100000, - 0x1ca4: 0xa0100000, 0x1ca5: 0xa0100000, 0x1ca6: 0xa0100000, 0x1ca7: 0xa0100000, - 0x1ca8: 0xa0100000, 0x1ca9: 0x40404020, 0x1caa: 0x00404084, 0x1cab: 0x00404084, - 0x1cac: 0x00404084, 0x1cad: 0xadc0f302, 0x1cae: 0x00404084, 0x1caf: 0x00404084, - 0x1cb0: 0x00404084, 0x1cb1: 0x00404084, 0x1cb2: 0xa000f402, 0x1cb3: 0xa000f402, - 0x1cb4: 0xae600000, 0x1cb5: 0x40404220, 0x1cb6: 0x40404420, - // Block 0x73, offset 0x1cc0 - 0x1cc0: 0x402be620, 0x1cc1: 0x402bec20, 0x1cc2: 0x402bee20, 0x1cc3: 0x402c2420, - 0x1cc4: 0x402c4220, 0x1cc5: 0x402c6a20, 0x1cc6: 0x402c6c20, 0x1cc7: 0x402ca020, - 0x1cc8: 0x402ce620, 0x1cc9: 0x402db420, 0x1cca: 0x402ddc20, 0x1ccb: 0x402e0620, - 0x1ccc: 0x402e3420, 0x1ccd: 0x402e8a20, 0x1cce: 0x402eb020, 0x1ccf: 0x402eea20, - 0x1cd0: 0x402f0220, 0x1cd1: 0x402eec20, 0x1cd2: 0x402f0420, 0x1cd3: 0x402ef820, - 0x1cd4: 0x402ef620, 0x1cd5: 0x402f2a20, 0x1cd6: 0x402f0a20, 0x1cd7: 0x402f0c20, - 0x1cd8: 0x402f3420, 0x1cd9: 0x402f8c20, 0x1cda: 0x402fa020, 0x1cdb: 0x40303420, - 0x1cdc: 0x40307420, 0x1cdd: 0x40307620, 0x1cde: 0x40307820, 0x1cdf: 0x4030aa20, - 0x1ce0: 0x4030c620, 0x1ce1: 0x4030ea20, 0x1ce2: 0x40313220, 0x1ce3: 0x40316c20, - 0x1ce4: 0x4031f420, 0x1ce5: 0x4031f620, 0x1ce6: 0x40325820, 0x1ce7: 0x40327420, - 0x1ce8: 0x40328020, 0x1ce9: 0x40328a20, 0x1cea: 0x4032a020, 0x1ceb: 0x40348c20, - 0x1cec: 0x002bde9d, 0x1ced: 0xe00009e1, 0x1cee: 0x002c0a9d, 0x1cef: 0x402c2220, - 0x1cf0: 0x002c629d, 0x1cf1: 0x002c989d, 0x1cf2: 0x002cae9d, 0x1cf3: 0x002d229d, - 0x1cf4: 0x002d689d, 0x1cf5: 0x002d9a9d, 0x1cf6: 0x002dcc9d, 0x1cf7: 0x002dfe9d, - 0x1cf8: 0x002e229d, 0x1cf9: 0x002e829d, 0x1cfa: 0x002e9e9d, 0x1cfb: 0x402eae20, - 0x1cfc: 0x002ee29d, 0x1cfd: 0x002f229d, 0x1cfe: 0x002f2c9d, 0x1cff: 0x002f7a9d, - // Block 0x74, offset 0x1d00 - 0x1d00: 0x00302c9d, 0x1d01: 0x00306c9d, 0x1d02: 0x0030e29d, 0x1d03: 0x002bde94, - 0x1d04: 0x002bf094, 0x1d05: 0x002bf894, 0x1d06: 0x002bee94, 0x1d07: 0x002c0a94, - 0x1d08: 0x002c6294, 0x1d09: 0x002c9894, 0x1d0a: 0x002cb894, 0x1d0b: 0x002cc294, - 0x1d0c: 0x002ce694, 0x1d0d: 0x002d2294, 0x1d0e: 0x002db494, 0x1d0f: 0x002dfe94, - 0x1d10: 0x002e8294, 0x1d11: 0x002eda94, 0x1d12: 0x002ee294, 0x1d13: 0x002efa94, - 0x1d14: 0x002f0a94, 0x1d15: 0x002f0c94, 0x1d16: 0x002f2c94, 0x1d17: 0x00302c94, - 0x1d18: 0x00306c94, 0x1d19: 0x00307694, 0x1d1a: 0x0030a094, 0x1d1b: 0x0030be94, - 0x1d1c: 0x0031f694, 0x1d1d: 0x00325494, 0x1d1e: 0x00325694, 0x1d1f: 0x00325a94, - 0x1d20: 0x00329a94, 0x1d21: 0x00329c94, 0x1d22: 0x002d9a95, 0x1d23: 0x002f7a95, - 0x1d24: 0x00306c95, 0x1d25: 0x0030be95, 0x1d26: 0x00325495, 0x1d27: 0x00325695, - 0x1d28: 0x00328895, 0x1d29: 0x00329a95, 0x1d2a: 0x00329c95, 0x1d2b: 0x40307a20, - 0x1d2c: 0x402c2620, 0x1d2d: 0x402c6e20, 0x1d2e: 0x402d1220, 0x1d2f: 0x402e8c20, - 0x1d30: 0x402eb220, 0x1d31: 0x402f3a20, 0x1d32: 0x402f9620, 0x1d33: 0x402fce20, - 0x1d34: 0x402ff020, 0x1d35: 0x40304020, 0x1d36: 0x40313c20, 0x1d37: 0x402d5420, - 0x1d38: 0x0034ba94, 0x1d39: 0xe0000bd9, 0x1d3a: 0xe0000fc1, 0x1d3b: 0x402dbe20, - 0x1d3c: 0x402dca20, 0x1d3d: 0x402f3620, 0x1d3e: 0x40308420, 0x1d3f: 0x4030bc20, - // Block 0x75, offset 0x1d40 - 0x1d40: 0x402c2820, 0x1d41: 0x402c7020, 0x1d42: 0x402d1420, 0x1d43: 0x402d4220, - 0x1d44: 0x402e0820, 0x1d45: 0x402e5220, 0x1d46: 0x402e8e20, 0x1d47: 0x402ec620, - 0x1d48: 0x402f3c20, 0x1d49: 0x402faa20, 0x1d4a: 0x402ff220, 0x1d4b: 0x40301020, - 0x1d4c: 0x4030ca20, 0x1d4d: 0x4030fe20, 0x1d4e: 0x40313e20, 0x1d4f: 0x402bea20, - 0x1d50: 0x402c0020, 0x1d51: 0x402c8220, 0x1d52: 0x402caa20, 0x1d53: 0x402cca20, - 0x1d54: 0x402ce420, 0x1d55: 0x402cc020, 0x1d56: 0x402dc020, 0x1d57: 0x402f0620, - 0x1d58: 0x40302220, 0x1d59: 0x40308620, 0x1d5a: 0x40317620, 0x1d5b: 0x002c0294, - 0x1d5c: 0x002c3a94, 0x1d5d: 0x002c5694, 0x1d5e: 0xf0001414, 0x1d5f: 0x002cdc94, - 0x1d60: 0x002d0894, 0x1d61: 0x002dee94, 0x1d62: 0x002d2a94, 0x1d63: 0x00308894, - 0x1d64: 0x002db694, 0x1d65: 0x002dc294, 0x1d66: 0x002daa94, 0x1d67: 0x002dbe94, - 0x1d68: 0x002de694, 0x1d69: 0x002e5494, 0x1d6a: 0x002e5294, 0x1d6b: 0x002e2a94, - 0x1d6c: 0x002e9094, 0x1d6d: 0x0030ac94, 0x1d6e: 0x002eb494, 0x1d6f: 0x002ec894, - 0x1d70: 0x002ea694, 0x1d71: 0x002f1094, 0x1d72: 0x002f4c94, 0x1d73: 0x002ff494, - 0x1d74: 0x00300894, 0x1d75: 0x00304294, 0x1d76: 0x00307c94, 0x1d77: 0x0030b494, - 0x1d78: 0x00307494, 0x1d79: 0x0030cc94, 0x1d7a: 0x0030da94, 0x1d7b: 0x00312a94, - 0x1d7c: 0x00314894, 0x1d7d: 0x00315094, 0x1d7e: 0x00316494, 0x1d7f: 0x00326a94, - // Block 0x76, offset 0x1d80 - 0x1d80: 0xae605f02, 0x1d81: 0xae605f02, 0x1d82: 0xadc06002, 0x1d83: 0xae605f02, - 0x1d84: 0xae605f02, 0x1d85: 0xae605f02, 0x1d86: 0xae605f02, 0x1d87: 0xae605f02, - 0x1d88: 0xae605f02, 0x1d89: 0xae605f02, 0x1d8a: 0x84dc17bd, 0x1d8b: 0xae605f02, - 0x1d8c: 0xae605f02, 0x1d8d: 0xaea05f02, 0x1d8e: 0xad605f02, 0x1d8f: 0xadc06002, - 0x1d90: 0xaca06002, 0x1d91: 0xae605f02, 0x1d92: 0x84e618d1, 0x1d93: 0xe00009b4, - 0x1d94: 0xe00009d9, 0x1d95: 0xe00009f9, 0x1d96: 0xe0000a08, 0x1d97: 0xe0000a50, - 0x1d98: 0xe0000ab6, 0x1d99: 0xe0000ab0, 0x1d9a: 0x84e61691, 0x1d9b: 0x84e61699, - 0x1d9c: 0x84e616ff, 0x1d9d: 0x84e61711, 0x1d9e: 0x84e61715, 0x1d9f: 0x84e61745, - 0x1da0: 0x84e6174f, 0x1da1: 0x84e61753, 0x1da2: 0x84e617c1, 0x1da3: 0x84e617c5, - 0x1da4: 0x84e617f3, 0x1da5: 0xe0000f67, 0x1da6: 0x84e61895, - 0x1dbc: 0xae906002, 0x1dbd: 0xadc06002, 0x1dbe: 0xae605f02, 0x1dbf: 0xadc06002, - // Block 0x77, offset 0x1dc0 - 0x1dc0: 0xe00009b1, 0x1dc1: 0xe00009ae, 0x1dc2: 0xe0000a22, 0x1dc3: 0xe0000a1f, - 0x1dc4: 0xe0000a28, 0x1dc5: 0xe0000a25, 0x1dc6: 0xe0000a2e, 0x1dc7: 0xe0000a2b, - 0x1dc8: 0xe0000a5a, 0x1dc9: 0xe0000a56, 0x1dca: 0xe0000a8c, 0x1dcb: 0xe0000a89, - 0x1dcc: 0xe0000a98, 0x1dcd: 0xe0000a95, 0x1dce: 0xe0000aa4, 0x1dcf: 0xe0000aa1, - 0x1dd0: 0xe0000a92, 0x1dd1: 0xe0000a8f, 0x1dd2: 0xe0000a9e, 0x1dd3: 0xe0000a9b, - 0x1dd4: 0xe0000b55, 0x1dd5: 0xe0000b51, 0x1dd6: 0xe0000b4d, 0x1dd7: 0xe0000b49, - 0x1dd8: 0xe0000b7c, 0x1dd9: 0xe0000b79, 0x1dda: 0xe0000b82, 0x1ddb: 0xe0000b7f, - 0x1ddc: 0xe0000b39, 0x1ddd: 0xe0000b35, 0x1dde: 0xe0000b8c, 0x1ddf: 0xe0000b89, - 0x1de0: 0xe0000bd0, 0x1de1: 0xe0000bcd, 0x1de2: 0xe0000c00, 0x1de3: 0xe0000bfd, - 0x1de4: 0xe0000c0c, 0x1de5: 0xe0000c09, 0x1de6: 0xe0000bfa, 0x1de7: 0xe0000bf7, - 0x1de8: 0xe0000c06, 0x1de9: 0xe0000c03, 0x1dea: 0xe0000c12, 0x1deb: 0xe0000c0f, - 0x1dec: 0xe0000c7e, 0x1ded: 0xe0000c7b, 0x1dee: 0xe0000c4a, 0x1def: 0xe0000c46, - 0x1df0: 0xe0000c93, 0x1df1: 0xe0000c90, 0x1df2: 0xe0000cab, 0x1df3: 0xe0000ca8, - 0x1df4: 0xe0000cb1, 0x1df5: 0xe0000cae, 0x1df6: 0xe0000cde, 0x1df7: 0xe0000cdb, - 0x1df8: 0xe0000ce5, 0x1df9: 0xe0000ce1, 0x1dfa: 0xe0000cf2, 0x1dfb: 0xe0000cef, - 0x1dfc: 0xe0000cec, 0x1dfd: 0xe0000ce9, 0x1dfe: 0xe0000d1e, 0x1dff: 0xe0000d1b, - // Block 0x78, offset 0x1e00 - 0x1e00: 0xe0000d24, 0x1e01: 0xe0000d21, 0x1e02: 0xe0000d2a, 0x1e03: 0xe0000d27, - 0x1e04: 0xe0000d69, 0x1e05: 0xe0000d66, 0x1e06: 0xe0000d7b, 0x1e07: 0xe0000d78, - 0x1e08: 0xe0000d87, 0x1e09: 0xe0000d84, 0x1e0a: 0xe0000d81, 0x1e0b: 0xe0000d7e, - 0x1e0c: 0xe0000ded, 0x1e0d: 0xe0000de9, 0x1e0e: 0xe0000df5, 0x1e0f: 0xe0000df1, - 0x1e10: 0xe0000e3d, 0x1e11: 0xe0000e39, 0x1e12: 0xe0000e35, 0x1e13: 0xe0000e31, - 0x1e14: 0xe0000ea7, 0x1e15: 0xe0000ea4, 0x1e16: 0xe0000ead, 0x1e17: 0xe0000eaa, - 0x1e18: 0xe0000ed6, 0x1e19: 0xe0000ed3, 0x1e1a: 0xe0000ef4, 0x1e1b: 0xe0000ef1, - 0x1e1c: 0xe0000efb, 0x1e1d: 0xe0000ef7, 0x1e1e: 0xe0000f02, 0x1e1f: 0xe0000eff, - 0x1e20: 0xe0000f41, 0x1e21: 0xe0000f3e, 0x1e22: 0xe0000f53, 0x1e23: 0xe0000f50, - 0x1e24: 0xe0000f26, 0x1e25: 0xe0000f22, 0x1e26: 0xe0000f3a, 0x1e27: 0xe0000f36, - 0x1e28: 0xe0000f5a, 0x1e29: 0xe0000f56, 0x1e2a: 0xe0000f93, 0x1e2b: 0xe0000f90, - 0x1e2c: 0xe0000f9f, 0x1e2d: 0xe0000f9c, 0x1e2e: 0xe0000fb1, 0x1e2f: 0xe0000fae, - 0x1e30: 0xe0000fab, 0x1e31: 0xe0000fa8, 0x1e32: 0xe0001093, 0x1e33: 0xe0001090, - 0x1e34: 0xe000109f, 0x1e35: 0xe000109c, 0x1e36: 0xe0001099, 0x1e37: 0xe0001096, - 0x1e38: 0xe0001032, 0x1e39: 0xe000102e, 0x1e3a: 0xe0001046, 0x1e3b: 0xe0001042, - 0x1e3c: 0xe00010a9, 0x1e3d: 0xe00010a6, 0x1e3e: 0xe00010af, 0x1e3f: 0xe00010ac, - // Block 0x79, offset 0x1e40 - 0x1e40: 0xe00010d2, 0x1e41: 0xe00010cf, 0x1e42: 0xe00010cc, 0x1e43: 0xe00010c9, - 0x1e44: 0xe00010e1, 0x1e45: 0xe00010de, 0x1e46: 0xe00010e7, 0x1e47: 0xe00010e4, - 0x1e48: 0xe00010ed, 0x1e49: 0xe00010ea, 0x1e4a: 0xe00010fc, 0x1e4b: 0xe00010f9, - 0x1e4c: 0xe00010f6, 0x1e4d: 0xe00010f3, 0x1e4e: 0xe0001123, 0x1e4f: 0xe0001120, - 0x1e50: 0xe0001141, 0x1e51: 0xe000113e, 0x1e52: 0xe0001153, 0x1e53: 0xe0001150, - 0x1e54: 0xe0001159, 0x1e55: 0xe0001156, 0x1e56: 0xe0000c15, 0x1e57: 0xe0000f8d, - 0x1e58: 0xe00010db, 0x1e59: 0xe0001111, 0x1e5a: 0xf0000404, 0x1e5b: 0xe0000f70, - 0x1e5c: 0x40300420, 0x1e5d: 0x40300620, 0x1e5e: 0xe0000f7f, 0x1e5f: 0x402c9620, - 0x1e60: 0xe000099b, 0x1e61: 0xe0000998, 0x1e62: 0xe0000989, 0x1e63: 0xe0000986, - 0x1e64: 0xe0000928, 0x1e65: 0xe0000924, 0x1e66: 0xe0000930, 0x1e67: 0xe000092c, - 0x1e68: 0xe0000940, 0x1e69: 0xe000093c, 0x1e6a: 0xe0000938, 0x1e6b: 0xe0000934, - 0x1e6c: 0xe00009aa, 0x1e6d: 0xe00009a6, 0x1e6e: 0xe0000902, 0x1e6f: 0xe00008fe, - 0x1e70: 0xe000090a, 0x1e71: 0xe0000906, 0x1e72: 0xe000091a, 0x1e73: 0xe0000916, - 0x1e74: 0xe0000912, 0x1e75: 0xe000090e, 0x1e76: 0xe00009a2, 0x1e77: 0xe000099e, - 0x1e78: 0xe0000b6e, 0x1e79: 0xe0000b6b, 0x1e7a: 0xe0000b5c, 0x1e7b: 0xe0000b59, - 0x1e7c: 0xe0000b26, 0x1e7d: 0xe0000b23, 0x1e7e: 0xe0000afb, 0x1e7f: 0xe0000af7, - // Block 0x7a, offset 0x1e80 - 0x1e80: 0xe0000b03, 0x1e81: 0xe0000aff, 0x1e82: 0xe0000b13, 0x1e83: 0xe0000b0f, - 0x1e84: 0xe0000b0b, 0x1e85: 0xe0000b07, 0x1e86: 0xe0000b75, 0x1e87: 0xe0000b71, - 0x1e88: 0xe0000c66, 0x1e89: 0xe0000c63, 0x1e8a: 0xe0000c78, 0x1e8b: 0xe0000c75, - 0x1e8c: 0xe0000e84, 0x1e8d: 0xe0000e81, 0x1e8e: 0xe0000e44, 0x1e8f: 0xe0000e41, - 0x1e90: 0xe0000dad, 0x1e91: 0xe0000da9, 0x1e92: 0xe0000db5, 0x1e93: 0xe0000db1, - 0x1e94: 0xe0000dc5, 0x1e95: 0xe0000dc1, 0x1e96: 0xe0000dbd, 0x1e97: 0xe0000db9, - 0x1e98: 0xe0000e8b, 0x1e99: 0xe0000e87, 0x1e9a: 0xe0000e5d, 0x1e9b: 0xe0000e59, - 0x1e9c: 0xe0000e65, 0x1e9d: 0xe0000e61, 0x1e9e: 0xe0000e75, 0x1e9f: 0xe0000e71, - 0x1ea0: 0xe0000e6d, 0x1ea1: 0xe0000e69, 0x1ea2: 0xe0000e7d, 0x1ea3: 0xe0000e79, - 0x1ea4: 0xe000108d, 0x1ea5: 0xe000108a, 0x1ea6: 0xe000104d, 0x1ea7: 0xe000104a, - 0x1ea8: 0xe0001066, 0x1ea9: 0xe0001062, 0x1eaa: 0xe000106e, 0x1eab: 0xe000106a, - 0x1eac: 0xe000107e, 0x1ead: 0xe000107a, 0x1eae: 0xe0001076, 0x1eaf: 0xe0001072, - 0x1eb0: 0xe0001086, 0x1eb1: 0xe0001082, 0x1eb2: 0xe0001108, 0x1eb3: 0xe0001105, - 0x1eb4: 0xe0001135, 0x1eb5: 0xe0001132, 0x1eb6: 0xe000112f, 0x1eb7: 0xe000112c, - 0x1eb8: 0xe000111d, 0x1eb9: 0xe000111a, 0x1eba: 0xe0000d0a, 0x1ebb: 0xe0000d07, - 0x1ebc: 0x0030d888, 0x1ebd: 0x4030d820, 0x1ebe: 0x00312088, 0x1ebf: 0x40312020, - // Block 0x7b, offset 0x1ec0 - 0x1ec0: 0xe0001165, 0x1ec1: 0xe00011a9, 0x1ec2: 0xe000117d, 0x1ec3: 0xe00011c1, - 0x1ec4: 0xe000116b, 0x1ec5: 0xe00011af, 0x1ec6: 0xe000118f, 0x1ec7: 0xe00011d3, - 0x1ec8: 0xe0001168, 0x1ec9: 0xe00011ac, 0x1eca: 0xe0001181, 0x1ecb: 0xe00011c5, - 0x1ecc: 0xe000116f, 0x1ecd: 0xe00011b3, 0x1ece: 0xe0001193, 0x1ecf: 0xe00011d7, - 0x1ed0: 0xe000121a, 0x1ed1: 0xe0001230, 0x1ed2: 0xe0001228, 0x1ed3: 0xe000123e, - 0x1ed4: 0xe0001220, 0x1ed5: 0xe0001236, - 0x1ed8: 0xe000121d, 0x1ed9: 0xe0001233, 0x1eda: 0xe000122c, 0x1edb: 0xe0001242, - 0x1edc: 0xe0001224, 0x1edd: 0xe000123a, - 0x1ee0: 0xe0001252, 0x1ee1: 0xe0001296, 0x1ee2: 0xe000126a, 0x1ee3: 0xe00012ae, - 0x1ee4: 0xe0001258, 0x1ee5: 0xe000129c, 0x1ee6: 0xe000127c, 0x1ee7: 0xe00012c0, - 0x1ee8: 0xe0001255, 0x1ee9: 0xe0001299, 0x1eea: 0xe000126e, 0x1eeb: 0xe00012b2, - 0x1eec: 0xe000125c, 0x1eed: 0xe00012a0, 0x1eee: 0xe0001280, 0x1eef: 0xe00012c4, - 0x1ef0: 0xe00012fb, 0x1ef1: 0xe0001319, 0x1ef2: 0xe0001309, 0x1ef3: 0xe0001327, - 0x1ef4: 0xe0001301, 0x1ef5: 0xe000131f, 0x1ef6: 0xe0001311, 0x1ef7: 0xe000132f, - 0x1ef8: 0xe00012fe, 0x1ef9: 0xe000131c, 0x1efa: 0xe000130d, 0x1efb: 0xe000132b, - 0x1efc: 0xe0001305, 0x1efd: 0xe0001323, 0x1efe: 0xe0001315, 0x1eff: 0xe0001333, - // Block 0x7c, offset 0x1f00 - 0x1f00: 0xe000136c, 0x1f01: 0xe0001382, 0x1f02: 0xe000137a, 0x1f03: 0xe0001390, - 0x1f04: 0xe0001372, 0x1f05: 0xe0001388, - 0x1f08: 0xe000136f, 0x1f09: 0xe0001385, 0x1f0a: 0xe000137e, 0x1f0b: 0xe0001394, - 0x1f0c: 0xe0001376, 0x1f0d: 0xe000138c, - 0x1f10: 0xe00013ad, 0x1f11: 0xe00013bc, 0x1f12: 0xe00013b4, 0x1f13: 0xe00013ca, - 0x1f14: 0xe00013b0, 0x1f15: 0xe00013c2, 0x1f16: 0xe00013b8, 0x1f17: 0xe00013d2, - 0x1f19: 0xe00013bf, 0x1f1b: 0xe00013ce, - 0x1f1d: 0xe00013c6, 0x1f1f: 0xe00013d6, - 0x1f20: 0xe0001407, 0x1f21: 0xe000144b, 0x1f22: 0xe000141f, 0x1f23: 0xe0001463, - 0x1f24: 0xe000140d, 0x1f25: 0xe0001451, 0x1f26: 0xe0001431, 0x1f27: 0xe0001475, - 0x1f28: 0xe000140a, 0x1f29: 0xe000144e, 0x1f2a: 0xe0001423, 0x1f2b: 0xe0001467, - 0x1f2c: 0xe0001411, 0x1f2d: 0xe0001455, 0x1f2e: 0xe0001435, 0x1f2f: 0xe0001479, - 0x1f30: 0xe00011f7, 0x1f31: 0xe00011ed, 0x1f32: 0xe000124c, 0x1f33: 0xe0001246, - 0x1f34: 0xe00012e4, 0x1f35: 0xe00012da, 0x1f36: 0xe000133d, 0x1f37: 0xe0001337, - 0x1f38: 0xe000139e, 0x1f39: 0xe0001398, 0x1f3a: 0xe00013e0, 0x1f3b: 0xe00013da, - 0x1f3c: 0xe0001499, 0x1f3d: 0xe000148f, - // Block 0x7d, offset 0x1f40 - 0x1f40: 0xe00011a1, 0x1f41: 0xe00011e5, 0x1f42: 0xe0001185, 0x1f43: 0xe00011c9, - 0x1f44: 0xe0001173, 0x1f45: 0xe00011b7, 0x1f46: 0xe0001197, 0x1f47: 0xe00011db, - 0x1f48: 0xe00011a5, 0x1f49: 0xe00011e9, 0x1f4a: 0xe000118a, 0x1f4b: 0xe00011ce, - 0x1f4c: 0xe0001178, 0x1f4d: 0xe00011bc, 0x1f4e: 0xe000119c, 0x1f4f: 0xe00011e0, - 0x1f50: 0xe000128e, 0x1f51: 0xe00012d2, 0x1f52: 0xe0001272, 0x1f53: 0xe00012b6, - 0x1f54: 0xe0001260, 0x1f55: 0xe00012a4, 0x1f56: 0xe0001284, 0x1f57: 0xe00012c8, - 0x1f58: 0xe0001292, 0x1f59: 0xe00012d6, 0x1f5a: 0xe0001277, 0x1f5b: 0xe00012bb, - 0x1f5c: 0xe0001265, 0x1f5d: 0xe00012a9, 0x1f5e: 0xe0001289, 0x1f5f: 0xe00012cd, - 0x1f60: 0xe0001443, 0x1f61: 0xe0001487, 0x1f62: 0xe0001427, 0x1f63: 0xe000146b, - 0x1f64: 0xe0001415, 0x1f65: 0xe0001459, 0x1f66: 0xe0001439, 0x1f67: 0xe000147d, - 0x1f68: 0xe0001447, 0x1f69: 0xe000148b, 0x1f6a: 0xe000142c, 0x1f6b: 0xe0001470, - 0x1f6c: 0xe000141a, 0x1f6d: 0xe000145e, 0x1f6e: 0xe000143e, 0x1f6f: 0xe0001482, - 0x1f70: 0xe0001201, 0x1f71: 0xe000120e, 0x1f72: 0xe00011fd, 0x1f73: 0xe0001214, - 0x1f74: 0xe00011f3, 0x1f76: 0xe0001207, 0x1f77: 0xe000120a, - 0x1f78: 0xe0001204, 0x1f79: 0xe0001211, 0x1f7a: 0xe00011fa, 0x1f7b: 0xe00011f0, - 0x1f7c: 0xe0001217, 0x1f7d: 0x40063620, 0x1f7e: 0x40326c20, 0x1f7f: 0x40063620, - // Block 0x7e, offset 0x1f80 - 0x1f80: 0x40063a20, 0x1f81: 0xe00000b1, 0x1f82: 0xe00012ea, 0x1f83: 0xe00012f5, - 0x1f84: 0xe00012e0, 0x1f86: 0xe00012ee, 0x1f87: 0xe00012f1, - 0x1f88: 0xe000124f, 0x1f89: 0xe0001249, 0x1f8a: 0xe00012e7, 0x1f8b: 0xe00012dd, - 0x1f8c: 0xe00012f8, 0x1f8d: 0xe00000b7, 0x1f8e: 0xe00000b4, 0x1f8f: 0xe00000ba, - 0x1f90: 0xe0001343, 0x1f91: 0xe000135e, 0x1f92: 0xe0001356, 0x1f93: 0xe0001352, - 0x1f96: 0xe0001349, 0x1f97: 0xe000135a, - 0x1f98: 0xe0001346, 0x1f99: 0xe0001361, 0x1f9a: 0xe0001340, 0x1f9b: 0xe000133a, - 0x1f9d: 0xe00000c0, 0x1f9e: 0xe00000bd, 0x1f9f: 0xe00000c3, - 0x1fa0: 0xe00013e6, 0x1fa1: 0xe0001401, 0x1fa2: 0xe00013f9, 0x1fa3: 0xe00013f5, - 0x1fa4: 0xe00013a4, 0x1fa5: 0xe00013a7, 0x1fa6: 0xe00013ec, 0x1fa7: 0xe00013fd, - 0x1fa8: 0xe00013e9, 0x1fa9: 0xe0001404, 0x1faa: 0xe00013e3, 0x1fab: 0xe00013dd, - 0x1fac: 0xe00013aa, 0x1fad: 0xe00000ae, 0x1fae: 0xe00000ab, 0x1faf: 0x40061e20, - 0x1fb2: 0xe000149f, 0x1fb3: 0xe00014aa, - 0x1fb4: 0xe0001495, 0x1fb6: 0xe00014a3, 0x1fb7: 0xe00014a6, - 0x1fb8: 0xe00013a1, 0x1fb9: 0xe000139b, 0x1fba: 0xe000149c, 0x1fbb: 0xe0001492, - 0x1fbc: 0xe00014ad, 0x1fbd: 0x40062020, 0x1fbe: 0x40063820, - // Block 0x7f, offset 0x1fc0 - 0x1fc0: 0x00021284, 0x1fc1: 0x00021284, 0x1fc2: 0x00021284, 0x1fc3: 0x00021284, - 0x1fc4: 0x00021284, 0x1fc5: 0x00021284, 0x1fc6: 0x00021284, 0x1fc7: 0x0002129b, - 0x1fc8: 0x00021284, 0x1fc9: 0x00021284, 0x1fca: 0x00021284, 0x1fcb: 0xa0000000, - 0x1fcc: 0xa0000000, 0x1fcd: 0xa0000000, 0x1fce: 0xa0000000, 0x1fcf: 0xa0000000, - 0x1fd0: 0x40022620, 0x1fd1: 0x0002269b, 0x1fd2: 0x40022820, 0x1fd3: 0x40022a20, - 0x1fd4: 0x40022c20, 0x1fd5: 0x40022e20, 0x1fd6: 0x4004c420, 0x1fd7: 0x40021820, - 0x1fd8: 0x4003d420, 0x1fd9: 0x4003d620, 0x1fda: 0x4003d820, 0x1fdb: 0x4003da20, - 0x1fdc: 0x4003e220, 0x1fdd: 0x4003e420, 0x1fde: 0x4003e620, 0x1fdf: 0x4003e820, - 0x1fe0: 0x4004f820, 0x1fe1: 0x4004fa20, 0x1fe2: 0x40050220, 0x1fe3: 0x40050420, - 0x1fe4: 0x0002e484, 0x1fe5: 0xf0001f04, 0x1fe6: 0xf0000404, 0x1fe7: 0x40050620, - 0x1fe8: 0x40020e20, 0x1fe9: 0x40021020, 0x1fea: 0xa0000000, 0x1feb: 0xa0000000, - 0x1fec: 0xa0000000, 0x1fed: 0xa0000000, 0x1fee: 0xa0000000, 0x1fef: 0x0002129b, - 0x1ff0: 0x4004f020, 0x1ff1: 0x4004f420, 0x1ff2: 0x40050e20, 0x1ff3: 0xf0001f04, - 0x1ff4: 0xf0000404, 0x1ff5: 0x40051020, 0x1ff6: 0xf0001f04, 0x1ff7: 0xf0000404, - 0x1ff8: 0x40051620, 0x1ff9: 0x4003dc20, 0x1ffa: 0x4003de20, 0x1ffb: 0x40051820, - 0x1ffc: 0xf0001f04, 0x1ffd: 0x4002e020, 0x1ffe: 0x40021420, 0x1fff: 0x40051a20, - // Block 0x80, offset 0x2000 - 0x2000: 0x40051e20, 0x2001: 0x40052220, 0x2002: 0x40052420, 0x2003: 0x40050820, - 0x2004: 0x40095820, 0x2005: 0x40040c20, 0x2006: 0x40040e20, 0x2007: 0xf0001f04, - 0x2008: 0xf0001f04, 0x2009: 0xf0001f04, 0x200a: 0x4004e820, 0x200b: 0x4004d420, - 0x200c: 0x40050a20, 0x200d: 0x40050c20, 0x200e: 0x4004da20, 0x200f: 0x40026620, - 0x2010: 0x40052020, 0x2011: 0x4004dc20, 0x2012: 0x40095020, 0x2013: 0x40023420, - 0x2014: 0x40051c20, 0x2015: 0x40039c20, 0x2016: 0x40039e20, 0x2017: 0xe00000a6, - 0x2018: 0x4003a020, 0x2019: 0x4003a220, 0x201a: 0x4003a420, 0x201b: 0x4003a620, - 0x201c: 0x4003a820, 0x201d: 0x4003aa20, 0x201e: 0x4003ac20, 0x201f: 0x00021284, - 0x2020: 0xa0000000, 0x2021: 0xa0000000, 0x2022: 0xa0000000, 0x2023: 0xa0000000, - 0x2024: 0xa0000000, - 0x202a: 0xa0000000, 0x202b: 0xa0000000, - 0x202c: 0xa0000000, 0x202d: 0xa0000000, 0x202e: 0xa0000000, 0x202f: 0xa0000000, - 0x2030: 0x0029cc94, 0x2031: 0x002d9a94, - 0x2034: 0x0029d494, 0x2035: 0x0029d694, 0x2036: 0x0029d894, 0x2037: 0x0029da94, - 0x2038: 0x0029dc94, 0x2039: 0x0029de94, 0x203a: 0x00093894, 0x203b: 0x00094e94, - 0x203c: 0x00094294, 0x203d: 0x0003f494, 0x203e: 0x0003f694, 0x203f: 0x002e9e94, - // Block 0x81, offset 0x2040 - 0x2040: 0x0029cc95, 0x2041: 0x0029ce95, 0x2042: 0x0029d095, 0x2043: 0x0029d295, - 0x2044: 0x0029d495, 0x2045: 0x0029d695, 0x2046: 0x0029d895, 0x2047: 0x0029da95, - 0x2048: 0x0029dc95, 0x2049: 0x0029de95, 0x204a: 0x00093895, 0x204b: 0x00094e95, - 0x204c: 0x00094295, 0x204d: 0x0003f495, 0x204e: 0x0003f695, - 0x2050: 0x002bde95, 0x2051: 0x002c9895, 0x2052: 0x002ee295, 0x2053: 0x0030f695, - 0x2054: 0x002cb895, 0x2055: 0x002d6895, 0x2056: 0x002dfe95, 0x2057: 0x002e2295, - 0x2058: 0x002e8295, 0x2059: 0x002e9e95, 0x205a: 0x002f2c95, 0x205b: 0x002fe695, - 0x205c: 0x00302c95, - 0x2060: 0x4027f820, 0x2061: 0x4027fa20, 0x2062: 0x4027fc20, 0x2063: 0x4027fe20, - 0x2064: 0x40280020, 0x2065: 0x40280220, 0x2066: 0x40280420, 0x2067: 0x40280620, - 0x2068: 0x40282c20, 0x2069: 0x40280820, 0x206a: 0x40280a20, 0x206b: 0x40280c20, - 0x206c: 0x40280e20, 0x206d: 0x40281020, 0x206e: 0x40281220, 0x206f: 0x40281420, - 0x2070: 0x40281620, 0x2071: 0x40281820, 0x2072: 0x40281a20, 0x2073: 0x40281c20, - 0x2074: 0x40281e20, 0x2075: 0x40282020, 0x2076: 0x40282220, 0x2077: 0x40282420, - 0x2078: 0x40282620, 0x2079: 0x40282820, 0x207a: 0x40282a20, - // Block 0x82, offset 0x2080 - 0x2090: 0xae612a02, 0x2091: 0xae612b02, 0x2092: 0xa0112c02, 0x2093: 0xa0112c02, - 0x2094: 0xae612d02, 0x2095: 0xae612e02, 0x2096: 0xae612f02, 0x2097: 0xae613002, - 0x2098: 0xa0106102, 0x2099: 0xa0106102, 0x209a: 0xa0106102, 0x209b: 0xae613102, - 0x209c: 0xae613202, 0x209d: 0xa0006202, 0x209e: 0xa0006202, 0x209f: 0xa0006202, - 0x20a0: 0xa0006202, 0x20a1: 0xae613302, 0x20a2: 0xa0006202, 0x20a3: 0xa0006202, - 0x20a4: 0xa0006202, 0x20a5: 0xa0106102, 0x20a6: 0xa0113402, 0x20a7: 0xae613502, - 0x20a8: 0xadc13602, 0x20a9: 0xae613702, 0x20aa: 0xa0106102, 0x20ab: 0xa0106102, - 0x20ac: 0xadc06002, 0x20ad: 0xadc06002, 0x20ae: 0xadc06002, 0x20af: 0xadc06002, - 0x20b0: 0xae605f02, - // Block 0x83, offset 0x20c0 - 0x20c0: 0xe00009bc, 0x20c1: 0xe00009c0, 0x20c2: 0x002c3a8b, 0x20c3: 0xf0000a04, - 0x20c4: 0x40081c20, 0x20c5: 0xe0000a5e, 0x20c6: 0xe0000a62, 0x20c7: 0x002cc28a, - 0x20c8: 0x40081e20, 0x20c9: 0xf0000a04, 0x20ca: 0x002d2285, 0x20cb: 0x002d688b, - 0x20cc: 0x002d688b, 0x20cd: 0x002d688b, 0x20ce: 0x002d6885, 0x20cf: 0xf0000202, - 0x20d0: 0x002d9a8b, 0x20d1: 0x002d9a8b, 0x20d2: 0x002e228b, 0x20d3: 0x002e2285, - 0x20d4: 0x40082020, 0x20d5: 0x002e9e8b, 0x20d6: 0xf000040a, 0x20d7: 0x40082220, - 0x20d8: 0x40082420, 0x20d9: 0x002f2c8b, 0x20da: 0x002f568b, 0x20db: 0x002f7a8b, - 0x20dc: 0x002f7a8b, 0x20dd: 0x002f7a8b, 0x20de: 0x40082620, 0x20df: 0x40082820, - 0x20e0: 0xf0001414, 0x20e1: 0xe0000fbd, 0x20e2: 0xf0001414, 0x20e3: 0x40082a20, - 0x20e4: 0x00312a8b, 0x20e5: 0x40082c20, 0x20e6: 0x0032a288, 0x20e7: 0x40082e20, - 0x20e8: 0x00312a8b, 0x20e9: 0x40083020, 0x20ea: 0x002dfe88, 0x20eb: 0xe000094d, - 0x20ec: 0x002c0a8b, 0x20ed: 0x002c3a8b, 0x20ee: 0x40083220, 0x20ef: 0x002c9885, - 0x20f0: 0x002c988b, 0x20f1: 0x002d088b, 0x20f2: 0x002d1e88, 0x20f3: 0x002e828b, - 0x20f4: 0x002ee285, 0x20f5: 0x00389084, 0x20f6: 0x00389284, 0x20f7: 0x00389484, - 0x20f8: 0x00389684, 0x20f9: 0x002d9a85, 0x20fa: 0x40083420, 0x20fb: 0xe0000b95, - 0x20fc: 0x00327e85, 0x20fd: 0x00325685, 0x20fe: 0x0032568b, 0x20ff: 0x00327e8b, - // Block 0x84, offset 0x2100 - 0x2100: 0x00093685, 0x2101: 0x40083620, 0x2102: 0x40083820, 0x2103: 0x40083a20, - 0x2104: 0x40083c20, 0x2105: 0x002c628b, 0x2106: 0x002c6285, 0x2107: 0x002c9885, - 0x2108: 0x002d9a85, 0x2109: 0x002dcc85, 0x210a: 0x40083e20, 0x210b: 0x400a6e20, - 0x210c: 0x40084020, 0x210d: 0xe00009c4, 0x210e: 0x402d1e20, 0x210f: 0x40084220, - 0x2110: 0xe00002cb, 0x2111: 0xe00002d3, 0x2112: 0xe00002b2, 0x2113: 0xe00002bb, - 0x2114: 0xe00003cd, 0x2115: 0xe00002c3, 0x2116: 0xe00003d1, 0x2117: 0xe00004ab, - 0x2118: 0xe0000579, 0x2119: 0xe00002c7, 0x211a: 0xe0000640, 0x211b: 0xe00002cf, - 0x211c: 0xe00004af, 0x211d: 0xe0000644, 0x211e: 0xe0000798, 0x211f: 0xf0001e1e, - 0x2120: 0x002d9a8a, 0x2121: 0xf0001f0a, 0x2122: 0xf0000a0a, 0x2123: 0xf0001f0a, - 0x2124: 0x0030be8a, 0x2125: 0xf0001f0a, 0x2126: 0xf0000a0a, 0x2127: 0xe00010bb, - 0x2128: 0xf0001f0a, 0x2129: 0x0030f68a, 0x212a: 0xf0001f0a, 0x212b: 0xf0000a0a, - 0x212c: 0x002e228a, 0x212d: 0x002c3a8a, 0x212e: 0x002c628a, 0x212f: 0x002e828a, - 0x2130: 0x002d9a84, 0x2131: 0xf0001f04, 0x2132: 0xf0000404, 0x2133: 0xf0001f04, - 0x2134: 0x0030be84, 0x2135: 0xf0001f04, 0x2136: 0xf0000404, 0x2137: 0xe00010b6, - 0x2138: 0xf0001f04, 0x2139: 0x0030f684, 0x213a: 0xf0001f04, 0x213b: 0xf0000404, - 0x213c: 0x002e2284, 0x213d: 0x002c3a84, 0x213e: 0x002c6284, 0x213f: 0x002e8284, - // Block 0x85, offset 0x2140 - 0x2140: 0x40287c20, 0x2141: 0x40287e20, 0x2142: 0x40288020, 0x2143: 0x002c5e88, - 0x2144: 0x402c5e20, 0x2145: 0xe00006c9, 0x2146: 0x40288220, 0x2147: 0x40288420, - 0x2148: 0x40288620, 0x2149: 0xe00001e2, - 0x2150: 0x40084420, 0x2151: 0x40084820, 0x2152: 0x40084620, 0x2153: 0x40084a20, - 0x2154: 0x40084c20, 0x2155: 0x40084e20, 0x2156: 0x40085020, 0x2157: 0x40085220, - 0x2158: 0x40085420, 0x2159: 0x40085620, 0x215a: 0xe00000c6, 0x215b: 0xe00000c9, - 0x215c: 0x40085820, 0x215d: 0x40085a20, 0x215e: 0x40085c20, 0x215f: 0x40085e20, - 0x2160: 0x40086020, 0x2161: 0x40086220, 0x2162: 0x40086420, 0x2163: 0x40086620, - 0x2164: 0x40086820, 0x2165: 0x40086a20, 0x2166: 0x40086c20, 0x2167: 0x40086e20, - 0x2168: 0x40087020, 0x2169: 0x40087220, 0x216a: 0x40087420, 0x216b: 0x40087620, - 0x216c: 0x40087820, 0x216d: 0x40087a20, 0x216e: 0xe00000cc, 0x216f: 0x40087c20, - 0x2170: 0x40087e20, 0x2171: 0x40088020, 0x2172: 0x40088220, 0x2173: 0x40088420, - 0x2174: 0x40088620, 0x2175: 0x40088820, 0x2176: 0x40088a20, 0x2177: 0x40088c20, - 0x2178: 0x40088e20, 0x2179: 0x40089020, 0x217a: 0x40089220, 0x217b: 0x40089420, - 0x217c: 0x40089620, 0x217d: 0x40089820, 0x217e: 0x40089a20, 0x217f: 0x40089c20, - // Block 0x86, offset 0x2180 - 0x2180: 0x40089e20, 0x2181: 0x4008a020, 0x2182: 0x4008a220, 0x2183: 0x4008a420, - 0x2184: 0x4008a620, 0x2185: 0x4008a820, 0x2186: 0x4008aa20, 0x2187: 0x4008ac20, - 0x2188: 0x4008ae20, 0x2189: 0x4008b020, 0x218a: 0x4008b220, 0x218b: 0x4008b420, - 0x218c: 0x4008b620, 0x218d: 0xe00000cf, 0x218e: 0xe00000d5, 0x218f: 0xe00000d2, - 0x2190: 0x4008b820, 0x2191: 0x4008ba20, 0x2192: 0x4008bc20, 0x2193: 0x4008be20, - 0x2194: 0x4008c020, 0x2195: 0x4008c220, 0x2196: 0x4008c420, 0x2197: 0x4008c620, - 0x2198: 0x4008c820, 0x2199: 0x4008ca20, 0x219a: 0x4008cc20, 0x219b: 0x4008ce20, - 0x219c: 0x4008d020, 0x219d: 0x4008d220, 0x219e: 0x4008d420, 0x219f: 0x4008d620, - 0x21a0: 0x4008d820, 0x21a1: 0x4008da20, 0x21a2: 0x4008dc20, 0x21a3: 0x4008de20, - 0x21a4: 0x4008e020, 0x21a5: 0x4008e220, 0x21a6: 0x4008e420, 0x21a7: 0x4008e620, - 0x21a8: 0x4008e820, 0x21a9: 0x4008ea20, 0x21aa: 0x4008ec20, 0x21ab: 0x4008ee20, - 0x21ac: 0x4008f020, 0x21ad: 0x4008f220, 0x21ae: 0x4008f420, 0x21af: 0x4008f620, - 0x21b0: 0x4008f820, 0x21b1: 0x4008fa20, 0x21b2: 0x4008fc20, 0x21b3: 0x4008fe20, - 0x21b4: 0x40090020, 0x21b5: 0x40090220, 0x21b6: 0x40090420, 0x21b7: 0x40090620, - 0x21b8: 0x40090820, 0x21b9: 0x40090a20, 0x21ba: 0x40090c20, 0x21bb: 0x40090e20, - 0x21bc: 0x40091020, 0x21bd: 0x40091220, 0x21be: 0x40091420, 0x21bf: 0x40091620, - // Block 0x87, offset 0x21c0 - 0x21c0: 0x40091820, 0x21c1: 0x40091a20, 0x21c2: 0x40091c20, 0x21c3: 0x40091e20, - 0x21c4: 0xe00000d8, 0x21c5: 0x40092020, 0x21c6: 0x40092220, 0x21c7: 0x40092420, - 0x21c8: 0x40092620, 0x21c9: 0xe00000db, 0x21ca: 0x40092820, 0x21cb: 0x40092a20, - 0x21cc: 0xe00000de, 0x21cd: 0x40092c20, 0x21ce: 0x40093020, 0x21cf: 0x40093220, - 0x21d0: 0x40093420, 0x21d1: 0x40093620, 0x21d2: 0x40094e20, 0x21d3: 0x40095220, - 0x21d4: 0x40095420, 0x21d5: 0x40095620, 0x21d6: 0x40095a20, 0x21d7: 0x40095c20, - 0x21d8: 0x40095e20, 0x21d9: 0x40096020, 0x21da: 0x40096220, 0x21db: 0x40096420, - 0x21dc: 0x40096820, 0x21dd: 0x40096c20, 0x21de: 0x40096e20, 0x21df: 0x40097020, - 0x21e0: 0x40097220, 0x21e1: 0x40097420, 0x21e2: 0x40097620, 0x21e3: 0x40097820, - 0x21e4: 0xe00000ea, 0x21e5: 0x40097a20, 0x21e6: 0xe00000ed, 0x21e7: 0x40097c20, - 0x21e8: 0x40097e20, 0x21e9: 0x40098020, 0x21ea: 0x40098220, 0x21eb: 0x40098420, - 0x21ec: 0xf0001f04, 0x21ed: 0xf0000404, 0x21ee: 0x40098620, 0x21ef: 0xf0001f04, - 0x21f0: 0xf0000404, 0x21f1: 0x40098820, 0x21f2: 0x40098a20, 0x21f3: 0x40098c20, - 0x21f4: 0x40098e20, 0x21f5: 0x40099020, 0x21f6: 0x40099220, 0x21f7: 0x40099420, - 0x21f8: 0x40099620, 0x21f9: 0x40099820, 0x21fa: 0x40099a20, 0x21fb: 0x40099c20, - 0x21fc: 0x40099e20, 0x21fd: 0x4009a020, 0x21fe: 0x4009a220, 0x21ff: 0x4009a420, - // Block 0x88, offset 0x2200 - 0x2200: 0x4009a620, 0x2201: 0xe00000f5, 0x2202: 0x4009a820, 0x2203: 0x4009aa20, - 0x2204: 0xe00000f8, 0x2205: 0x4009ac20, 0x2206: 0x4009ae20, 0x2207: 0xe00000fb, - 0x2208: 0x4009b020, 0x2209: 0xe00000fe, 0x220a: 0x4009b220, 0x220b: 0x4009b420, - 0x220c: 0x4009b620, 0x220d: 0x4009b820, 0x220e: 0x4009ba20, 0x220f: 0x4009bc20, - 0x2210: 0x4009be20, 0x2211: 0x4009c020, 0x2212: 0x4009c220, 0x2213: 0x4009c420, - 0x2214: 0x4009c620, 0x2215: 0x4009c820, 0x2216: 0x4009ca20, 0x2217: 0x4009cc20, - 0x2218: 0x4009ce20, 0x2219: 0x4009d020, 0x221a: 0x4009d220, 0x221b: 0x4009d420, - 0x221c: 0x4009d620, 0x221d: 0x4009d820, 0x221e: 0x4009da20, 0x221f: 0x4009dc20, - 0x2220: 0xe00000e4, 0x2221: 0x4009de20, 0x2222: 0xe0000104, 0x2223: 0x4009e020, - 0x2224: 0x4009e220, 0x2225: 0x4009e420, 0x2226: 0x4009e620, 0x2227: 0x4009e820, - 0x2228: 0x4009ea20, 0x2229: 0x4009ec20, 0x222a: 0x4009ee20, 0x222b: 0x4009f020, - 0x222c: 0x4009f220, 0x222d: 0xe0000101, 0x222e: 0xe00000e1, 0x222f: 0xe00000e7, - 0x2230: 0xe0000107, 0x2231: 0xe000010a, 0x2232: 0x4009f420, 0x2233: 0x4009f620, - 0x2234: 0xe000010d, 0x2235: 0xe0000110, 0x2236: 0x4009f820, 0x2237: 0x4009fa20, - 0x2238: 0xe0000113, 0x2239: 0xe0000116, 0x223a: 0x4009fc20, 0x223b: 0x4009fe20, - 0x223c: 0x400a0020, 0x223d: 0x400a0220, 0x223e: 0x400a0420, 0x223f: 0x400a0620, - // Block 0x89, offset 0x2240 - 0x2240: 0xe0000119, 0x2241: 0xe000011c, 0x2242: 0x400a0820, 0x2243: 0x400a0a20, - 0x2244: 0xe0000125, 0x2245: 0xe0000128, 0x2246: 0x400a0c20, 0x2247: 0x400a0e20, - 0x2248: 0xe000012b, 0x2249: 0xe000012e, 0x224a: 0x400a1020, 0x224b: 0x400a1220, - 0x224c: 0x400a1420, 0x224d: 0x400a1620, 0x224e: 0x400a1820, 0x224f: 0x400a1a20, - 0x2250: 0x400a1c20, 0x2251: 0x400a1e20, 0x2252: 0x400a2020, 0x2253: 0x400a2220, - 0x2254: 0x400a2420, 0x2255: 0x400a2620, 0x2256: 0x400a2820, 0x2257: 0x400a2a20, - 0x2258: 0x400a2c20, 0x2259: 0x400a2e20, 0x225a: 0x400a3020, 0x225b: 0x400a3220, - 0x225c: 0x400a3420, 0x225d: 0x400a3620, 0x225e: 0x400a3820, 0x225f: 0x400a3a20, - 0x2260: 0x400a3c20, 0x2261: 0x400a3e20, 0x2262: 0x400a4020, 0x2263: 0x400a4220, - 0x2264: 0x400a4420, 0x2265: 0x400a4620, 0x2266: 0x400a4820, 0x2267: 0x400a4a20, - 0x2268: 0x400a4c20, 0x2269: 0x400a4e20, 0x226a: 0x400a5020, 0x226b: 0x400a5220, - 0x226c: 0xe0000137, 0x226d: 0xe000013a, 0x226e: 0xe000013d, 0x226f: 0xe0000140, - 0x2270: 0x400a5420, 0x2271: 0x400a5620, 0x2272: 0x400a5820, 0x2273: 0x400a5a20, - 0x2274: 0x400a5c20, 0x2275: 0x400a5e20, 0x2276: 0x400a6020, 0x2277: 0x400a6220, - 0x2278: 0x400a6420, 0x2279: 0x400a6620, 0x227a: 0x400a6820, 0x227b: 0x400a6a20, - 0x227c: 0x400a6c20, 0x227d: 0x400a7020, 0x227e: 0x400a7220, 0x227f: 0x400a7420, - // Block 0x8a, offset 0x2280 - 0x2280: 0x400a7620, 0x2281: 0x400a7820, 0x2282: 0x400a7a20, 0x2283: 0x400a7c20, - 0x2284: 0x400a7e20, 0x2285: 0x400a8020, 0x2286: 0x400a8220, 0x2287: 0x400a8420, - 0x2288: 0x400a8620, 0x2289: 0x400a8820, 0x228a: 0x400a8a20, 0x228b: 0x400a8c20, - 0x228c: 0x400a8e20, 0x228d: 0x400a9020, 0x228e: 0x400a9220, 0x228f: 0x400a9420, - 0x2290: 0x400a9620, 0x2291: 0x400a9820, 0x2292: 0x400a9a20, 0x2293: 0x400a9c20, - 0x2294: 0x400a9e20, 0x2295: 0x400aa020, 0x2296: 0x400aa220, 0x2297: 0x400aa420, - 0x2298: 0x400aa620, 0x2299: 0x400aa820, 0x229a: 0x400aaa20, 0x229b: 0x400aac20, - 0x229c: 0x400aae20, 0x229d: 0x400ab020, 0x229e: 0x400ab220, 0x229f: 0x400ab420, - 0x22a0: 0xe000011f, 0x22a1: 0xe0000122, 0x22a2: 0xe0000131, 0x22a3: 0xe0000134, - 0x22a4: 0x400ab620, 0x22a5: 0x400ab820, 0x22a6: 0x400aba20, 0x22a7: 0x400abc20, - 0x22a8: 0x400abe20, 0x22a9: 0x400ac020, 0x22aa: 0xe0000143, 0x22ab: 0xe0000146, - 0x22ac: 0xe0000149, 0x22ad: 0xe000014c, 0x22ae: 0x400ac220, 0x22af: 0x400ac420, - 0x22b0: 0x400ac620, 0x22b1: 0x400ac820, 0x22b2: 0x400aca20, 0x22b3: 0x400acc20, - 0x22b4: 0x400ace20, 0x22b5: 0x400ad020, 0x22b6: 0x400ad220, 0x22b7: 0x400ad420, - 0x22b8: 0x400ad620, 0x22b9: 0x400ad820, 0x22ba: 0x400ada20, 0x22bb: 0x400adc20, - 0x22bc: 0x400ade20, 0x22bd: 0x400ae020, 0x22be: 0x400ae220, 0x22bf: 0x400ae420, - // Block 0x8b, offset 0x22c0 - 0x22c0: 0x400ae620, 0x22c1: 0x400ae820, 0x22c2: 0x400aea20, 0x22c3: 0x400aec20, - 0x22c4: 0x400aee20, 0x22c5: 0x400af020, 0x22c6: 0x400af220, 0x22c7: 0x400af420, - 0x22c8: 0x400af620, 0x22c9: 0x400af820, 0x22ca: 0x400afa20, 0x22cb: 0x400afc20, - 0x22cc: 0x400afe20, 0x22cd: 0x400b0020, 0x22ce: 0x400b0220, 0x22cf: 0x400b0420, - 0x22d0: 0x400b0620, 0x22d1: 0x400b0820, 0x22d2: 0x400b0a20, 0x22d3: 0x400b0c20, - 0x22d4: 0x400b0e20, 0x22d5: 0x400b1020, 0x22d6: 0x400b1220, 0x22d7: 0x400b1420, - 0x22d8: 0x400b1620, 0x22d9: 0x400b1820, 0x22da: 0x400b1a20, 0x22db: 0x400b1c20, - 0x22dc: 0x400b1e20, 0x22dd: 0x400b2020, 0x22de: 0x400b2220, 0x22df: 0x400b2420, - 0x22e0: 0x400b2620, 0x22e1: 0x400b2820, 0x22e2: 0x400b2a20, 0x22e3: 0x400b2c20, - 0x22e4: 0x400b2e20, 0x22e5: 0x400b3020, 0x22e6: 0x400b3220, 0x22e7: 0x400b3420, - 0x22e8: 0x400b3620, 0x22e9: 0x40049c20, 0x22ea: 0x40049e20, 0x22eb: 0x400b3820, - 0x22ec: 0x400b3a20, 0x22ed: 0x400b3c20, 0x22ee: 0x400b3e20, 0x22ef: 0x400b4020, - 0x22f0: 0x400b4220, 0x22f1: 0x400b4420, 0x22f2: 0x400b4620, 0x22f3: 0x400b4820, - 0x22f4: 0x400b4a20, 0x22f5: 0x400b4c20, 0x22f6: 0x400b4e20, 0x22f7: 0x400b5020, - 0x22f8: 0x400b5220, 0x22f9: 0x400b5420, 0x22fa: 0x400b5620, 0x22fb: 0x400b5820, - 0x22fc: 0x400b5a20, 0x22fd: 0x400b5c20, 0x22fe: 0x400b5e20, 0x22ff: 0x400b6020, - // Block 0x8c, offset 0x2300 - 0x2300: 0x400b6220, 0x2301: 0x400b6420, 0x2302: 0x400b6620, 0x2303: 0x400b6820, - 0x2304: 0x400b6a20, 0x2305: 0x400b6c20, 0x2306: 0x400b6e20, 0x2307: 0x400b7020, - 0x2308: 0x400b7220, 0x2309: 0x400b7420, 0x230a: 0x400b7620, 0x230b: 0x400b7820, - 0x230c: 0x400b7a20, 0x230d: 0x400b7c20, 0x230e: 0x400b7e20, 0x230f: 0x400b8020, - 0x2310: 0x400b8220, 0x2311: 0x400b8420, 0x2312: 0x400b8620, 0x2313: 0x400b8820, - 0x2314: 0x400b8a20, 0x2315: 0x400b8c20, 0x2316: 0x400b8e20, 0x2317: 0x400b9020, - 0x2318: 0x400b9220, 0x2319: 0x400b9420, 0x231a: 0x400b9620, 0x231b: 0x400b9820, - 0x231c: 0x400b9a20, 0x231d: 0x400b9c20, 0x231e: 0x400b9e20, 0x231f: 0x400ba020, - 0x2320: 0x400ba220, 0x2321: 0x400ba420, 0x2322: 0x400ba620, 0x2323: 0x400ba820, - 0x2324: 0x400baa20, 0x2325: 0x400bac20, 0x2326: 0x400bae20, 0x2327: 0x400bb020, - 0x2328: 0x400bb220, 0x2329: 0x400bb420, 0x232a: 0x400bb620, 0x232b: 0x400bb820, - 0x232c: 0x400bba20, 0x232d: 0x400bbc20, 0x232e: 0x400bbe20, 0x232f: 0x400bc020, - 0x2330: 0x400bc220, 0x2331: 0x400bc420, 0x2332: 0x400bc620, 0x2333: 0x400bc820, - 0x2334: 0x400bca20, 0x2335: 0x400bcc20, 0x2336: 0x400bce20, 0x2337: 0x400bd020, - 0x2338: 0x400bd220, 0x2339: 0x400bd420, 0x233a: 0x400bd620, 0x233b: 0x400bd820, - 0x233c: 0x400bda20, 0x233d: 0x400bdc20, 0x233e: 0x400bde20, 0x233f: 0x400be020, - // Block 0x8d, offset 0x2340 - 0x2340: 0x400be220, 0x2341: 0x400be420, 0x2342: 0x400be620, 0x2343: 0x400be820, - 0x2344: 0x400bea20, 0x2345: 0x400bec20, 0x2346: 0x400bee20, 0x2347: 0x400bf020, - 0x2348: 0x400bf220, 0x2349: 0x400bf420, 0x234a: 0x400bf620, 0x234b: 0x400bf820, - 0x234c: 0x400bfa20, 0x234d: 0x400bfc20, 0x234e: 0x400bfe20, 0x234f: 0x400c0020, - 0x2350: 0x400c0220, 0x2351: 0x400c0420, 0x2352: 0x400c0620, 0x2353: 0x400c0820, - 0x2354: 0x400c0a20, 0x2355: 0x400c0c20, 0x2356: 0x400c0e20, 0x2357: 0x400c1020, - 0x2358: 0x400c1220, 0x2359: 0x400c1420, 0x235a: 0x400c1620, 0x235b: 0x400c1820, - 0x235c: 0x400c1a20, 0x235d: 0x400c1c20, 0x235e: 0x400c1e20, 0x235f: 0x400c2020, - 0x2360: 0x400c2220, 0x2361: 0x400c2420, 0x2362: 0x400c2620, 0x2363: 0x400c2820, - 0x2364: 0x400c2a20, 0x2365: 0x400c2c20, 0x2366: 0x400c2e20, 0x2367: 0x400c3020, - 0x2368: 0x400c3220, 0x2369: 0x400c3420, 0x236a: 0x400c3620, 0x236b: 0x400c3820, - 0x236c: 0x400c3a20, 0x236d: 0x400c3c20, 0x236e: 0x400c3e20, 0x236f: 0x400c4020, - 0x2370: 0x400c4220, 0x2371: 0x400c4420, 0x2372: 0x400c4620, 0x2373: 0x400c4820, - 0x2374: 0x400c4a20, 0x2375: 0x400c4c20, 0x2376: 0x400c4e20, 0x2377: 0x400c5020, - 0x2378: 0x400c5220, 0x2379: 0x400c5420, 0x237a: 0x400c5620, 0x237b: 0x400c5820, - 0x237c: 0x400c5a20, 0x237d: 0x400c5c20, 0x237e: 0x400c5e20, 0x237f: 0x400c6020, - // Block 0x8e, offset 0x2380 - 0x2380: 0x400c6220, 0x2381: 0x400c6420, 0x2382: 0x400c6620, 0x2383: 0x400c6820, - 0x2384: 0x400c6a20, 0x2385: 0x400c6c20, 0x2386: 0x400c6e20, 0x2387: 0x400c7020, - 0x2388: 0x400c7220, 0x2389: 0x400c7420, 0x238a: 0x400c7620, 0x238b: 0x400c7820, - 0x238c: 0x400c7a20, 0x238d: 0x400c7c20, 0x238e: 0x400c7e20, 0x238f: 0x400c8020, - 0x2390: 0x400c8220, 0x2391: 0x400c8420, 0x2392: 0x400c8620, 0x2393: 0x400c8820, - 0x2394: 0x400c8a20, 0x2395: 0x400c8c20, 0x2396: 0x400c8e20, 0x2397: 0x400c9020, - 0x2398: 0x400c9220, 0x2399: 0x400c9420, 0x239a: 0x400c9620, 0x239b: 0x400c9820, - 0x239c: 0x400c9a20, 0x239d: 0x400c9c20, 0x239e: 0x400c9e20, 0x239f: 0x400ca020, - 0x23a0: 0x400ca220, 0x23a1: 0x400ca420, 0x23a2: 0x400ca620, 0x23a3: 0x400ca820, - 0x23a4: 0x400caa20, 0x23a5: 0x400cac20, 0x23a6: 0x400cae20, 0x23a7: 0x400cb020, - 0x23a8: 0x400cb220, 0x23a9: 0x400cb420, 0x23aa: 0x400cb620, 0x23ab: 0x400cb820, - 0x23ac: 0x400cba20, 0x23ad: 0x400cbc20, 0x23ae: 0x400cbe20, 0x23af: 0x400cc020, - 0x23b0: 0x400cc220, 0x23b1: 0x400cc420, 0x23b2: 0x400cc620, 0x23b3: 0x400cc820, - // Block 0x8f, offset 0x23c0 - 0x23c0: 0x400cca20, 0x23c1: 0x400ccc20, 0x23c2: 0x400cce20, 0x23c3: 0x400cd020, - 0x23c4: 0x400cd220, 0x23c5: 0x400cd420, 0x23c6: 0x400cd620, 0x23c7: 0x400cd820, - 0x23c8: 0x400cda20, 0x23c9: 0x400cdc20, 0x23ca: 0x400cde20, 0x23cb: 0x400ce020, - 0x23cc: 0x400ce220, 0x23cd: 0x400ce420, 0x23ce: 0x400ce620, 0x23cf: 0x400ce820, - 0x23d0: 0x400cea20, 0x23d1: 0x400cec20, 0x23d2: 0x400cee20, 0x23d3: 0x400cf020, - 0x23d4: 0x400cf220, 0x23d5: 0x400cf420, 0x23d6: 0x400cf620, 0x23d7: 0x400cf820, - 0x23d8: 0x400cfa20, 0x23d9: 0x400cfc20, 0x23da: 0x400cfe20, 0x23db: 0x400d0020, - 0x23dc: 0x400d0220, 0x23dd: 0x400d0420, 0x23de: 0x400d0620, 0x23df: 0x400d0820, - 0x23e0: 0x400d0a20, 0x23e1: 0x400d0c20, 0x23e2: 0x400d0e20, 0x23e3: 0x400d1020, - 0x23e4: 0x400d1220, 0x23e5: 0x400d1420, 0x23e6: 0x400d1620, - // Block 0x90, offset 0x2400 - 0x2400: 0x400d1820, 0x2401: 0x400d1a20, 0x2402: 0x400d1c20, 0x2403: 0x400d1e20, - 0x2404: 0x400d2020, 0x2405: 0x400d2220, 0x2406: 0x400d2420, 0x2407: 0x400d2620, - 0x2408: 0x400d2820, 0x2409: 0x400d2a20, 0x240a: 0x400d2c20, - 0x2420: 0x0029ce86, 0x2421: 0x0029d086, 0x2422: 0x0029d286, 0x2423: 0x0029d486, - 0x2424: 0x0029d686, 0x2425: 0x0029d886, 0x2426: 0x0029da86, 0x2427: 0x0029dc86, - 0x2428: 0x0029de86, 0x2429: 0xf0000606, 0x242a: 0xf0000606, 0x242b: 0xf0000606, - 0x242c: 0xf0000606, 0x242d: 0xf0000606, 0x242e: 0xf0000606, 0x242f: 0xf0000606, - 0x2430: 0xf0000606, 0x2431: 0xf0000606, 0x2432: 0xf0000606, 0x2433: 0xf0000606, - 0x2434: 0xf0000404, 0x2435: 0xf0000404, 0x2436: 0xf0000404, 0x2437: 0xf0000404, - 0x2438: 0xf0000404, 0x2439: 0xf0000404, 0x243a: 0xf0000404, 0x243b: 0xf0000404, - 0x243c: 0xf0000404, 0x243d: 0xe0000015, 0x243e: 0xe000001a, 0x243f: 0xe000001f, - // Block 0x91, offset 0x2440 - 0x2440: 0xe0000024, 0x2441: 0xe0000029, 0x2442: 0xe000002e, 0x2443: 0xe0000033, - 0x2444: 0xe0000038, 0x2445: 0xe000003d, 0x2446: 0xe0000042, 0x2447: 0xe0000047, - 0x2448: 0xf0001f04, 0x2449: 0xf0001f04, 0x244a: 0xf0001f04, 0x244b: 0xf0001f04, - 0x244c: 0xf0001f04, 0x244d: 0xf0001f04, 0x244e: 0xf0001f04, 0x244f: 0xf0001f04, - 0x2450: 0xf0001f04, 0x2451: 0xf0000404, 0x2452: 0xf0000404, 0x2453: 0xf0000404, - 0x2454: 0xf0000404, 0x2455: 0xf0000404, 0x2456: 0xf0000404, 0x2457: 0xf0000404, - 0x2458: 0xf0000404, 0x2459: 0xf0000404, 0x245a: 0xf0000404, 0x245b: 0xf0000404, - 0x245c: 0xf0000404, 0x245d: 0xf0000404, 0x245e: 0xf0000404, 0x245f: 0xf0000404, - 0x2460: 0xf0000404, 0x2461: 0xf0000404, 0x2462: 0xf0000404, 0x2463: 0xf0000404, - 0x2464: 0xf0000404, 0x2465: 0xf0000404, 0x2466: 0xf0000404, 0x2467: 0xf0000404, - 0x2468: 0xf0000404, 0x2469: 0xf0000404, 0x246a: 0xf0000404, 0x246b: 0xf0000404, - 0x246c: 0xf0000404, 0x246d: 0xf0000404, 0x246e: 0xf0000404, 0x246f: 0xf0000404, - 0x2470: 0xf0000404, 0x2471: 0xf0000404, 0x2472: 0xf0000404, 0x2473: 0xf0000404, - 0x2474: 0xf0000404, 0x2475: 0xf0000404, 0x2476: 0x002bde8c, 0x2477: 0x002c0a8c, - 0x2478: 0x002c3a8c, 0x2479: 0x002c628c, 0x247a: 0x002c988c, 0x247b: 0x002d088c, - 0x247c: 0x002d228c, 0x247d: 0x002d688c, 0x247e: 0x002d9a8c, 0x247f: 0x002dcc8c, - // Block 0x92, offset 0x2480 - 0x2480: 0x002dfe8c, 0x2481: 0x002e228c, 0x2482: 0x002e828c, 0x2483: 0x002e9e8c, - 0x2484: 0x002ee28c, 0x2485: 0x002f2c8c, 0x2486: 0x002f568c, 0x2487: 0x002f7a8c, - 0x2488: 0x002fe68c, 0x2489: 0x00302c8c, 0x248a: 0x00306c8c, 0x248b: 0x0030be8c, - 0x248c: 0x0030e28c, 0x248d: 0x0030f68c, 0x248e: 0x0031008c, 0x248f: 0x00312a8c, - 0x2490: 0x002bde86, 0x2491: 0x002c0a86, 0x2492: 0x002c3a86, 0x2493: 0x002c6286, - 0x2494: 0x002c9886, 0x2495: 0x002d0886, 0x2496: 0x002d2286, 0x2497: 0x002d6886, - 0x2498: 0x002d9a86, 0x2499: 0x002dcc86, 0x249a: 0x002dfe86, 0x249b: 0x002e2286, - 0x249c: 0x002e8286, 0x249d: 0x002e9e86, 0x249e: 0x002ee286, 0x249f: 0x002f2c86, - 0x24a0: 0x002f5686, 0x24a1: 0x002f7a86, 0x24a2: 0x002fe686, 0x24a3: 0x00302c86, - 0x24a4: 0x00306c86, 0x24a5: 0x0030be86, 0x24a6: 0x0030e286, 0x24a7: 0x0030f686, - 0x24a8: 0x00310086, 0x24a9: 0x00312a86, 0x24aa: 0x0029cc86, 0x24ab: 0xe00002e6, - 0x24ac: 0xe00002e9, 0x24ad: 0xe00002ec, 0x24ae: 0xe00002ef, 0x24af: 0xe00002f2, - 0x24b0: 0xe00002f5, 0x24b1: 0xe00002f8, 0x24b2: 0xe00002fb, 0x24b3: 0xe00002fe, - 0x24b4: 0xe00003d5, 0x24b5: 0x0029ce86, 0x24b6: 0x0029d086, 0x24b7: 0x0029d286, - 0x24b8: 0x0029d486, 0x24b9: 0x0029d686, 0x24ba: 0x0029d886, 0x24bb: 0x0029da86, - 0x24bc: 0x0029dc86, 0x24bd: 0x0029de86, 0x24be: 0xe00002d7, 0x24bf: 0x0029cc86, - // Block 0x93, offset 0x24c0 - 0x24c0: 0x400d2e20, 0x24c1: 0x400d3020, 0x24c2: 0x400d3220, 0x24c3: 0x400d3420, - 0x24c4: 0x400d3620, 0x24c5: 0x400d3820, 0x24c6: 0x400d3a20, 0x24c7: 0x400d3c20, - 0x24c8: 0x400d3e20, 0x24c9: 0x400d4020, 0x24ca: 0x400d4220, 0x24cb: 0x400d4420, - 0x24cc: 0x400d4620, 0x24cd: 0x400d4820, 0x24ce: 0x400d4a20, 0x24cf: 0x400d4c20, - 0x24d0: 0x400d4e20, 0x24d1: 0x400d5020, 0x24d2: 0x400d5220, 0x24d3: 0x400d5420, - 0x24d4: 0x400d5620, 0x24d5: 0x400d5820, 0x24d6: 0x400d5a20, 0x24d7: 0x400d5c20, - 0x24d8: 0x400d5e20, 0x24d9: 0x400d6020, 0x24da: 0x400d6220, 0x24db: 0x400d6420, - 0x24dc: 0x400d6620, 0x24dd: 0x400d6820, 0x24de: 0x400d6a20, 0x24df: 0x400d6c20, - 0x24e0: 0x400d6e20, 0x24e1: 0x400d7020, 0x24e2: 0x400d7220, 0x24e3: 0x400d7420, - 0x24e4: 0x400d7620, 0x24e5: 0x400d7820, 0x24e6: 0x400d7a20, 0x24e7: 0x400d7c20, - 0x24e8: 0x400d7e20, 0x24e9: 0x400d8020, 0x24ea: 0x400d8220, 0x24eb: 0x400d8420, - 0x24ec: 0x400d8620, 0x24ed: 0x400d8820, 0x24ee: 0x400d8a20, 0x24ef: 0x400d8c20, - 0x24f0: 0x400d8e20, 0x24f1: 0x400d9020, 0x24f2: 0x400d9220, 0x24f3: 0x400d9420, - 0x24f4: 0x400d9620, 0x24f5: 0x400d9820, 0x24f6: 0x400d9a20, 0x24f7: 0x400d9c20, - 0x24f8: 0x400d9e20, 0x24f9: 0x400da020, 0x24fa: 0x400da220, 0x24fb: 0x400da420, - 0x24fc: 0x400da620, 0x24fd: 0x400da820, 0x24fe: 0x400daa20, 0x24ff: 0x400dac20, - // Block 0x94, offset 0x2500 - 0x2500: 0x400dae20, 0x2501: 0x400db020, 0x2502: 0x400db220, 0x2503: 0x400db420, - 0x2504: 0x400db620, 0x2505: 0x400db820, 0x2506: 0x400dba20, 0x2507: 0x400dbc20, - 0x2508: 0x400dbe20, 0x2509: 0x400dc020, 0x250a: 0x400dc220, 0x250b: 0x400dc420, - 0x250c: 0x400dc620, 0x250d: 0x400dc820, 0x250e: 0x400dca20, 0x250f: 0x400dcc20, - 0x2510: 0x400dce20, 0x2511: 0x400dd020, 0x2512: 0x400dd220, 0x2513: 0x400dd420, - 0x2514: 0x400dd620, 0x2515: 0x400dd820, 0x2516: 0x400dda20, 0x2517: 0x400ddc20, - 0x2518: 0x400dde20, 0x2519: 0x400de020, 0x251a: 0x400de220, 0x251b: 0x400de420, - 0x251c: 0x400de620, 0x251d: 0x400de820, 0x251e: 0x400dea20, 0x251f: 0x400dec20, - 0x2520: 0x400dee20, 0x2521: 0x400df020, 0x2522: 0x400df220, 0x2523: 0x400df420, - 0x2524: 0x400df620, 0x2525: 0x400df820, 0x2526: 0x400dfa20, 0x2527: 0x400dfc20, - 0x2528: 0x400dfe20, 0x2529: 0x400e0020, 0x252a: 0x400e0220, 0x252b: 0x400e0420, - 0x252c: 0x400e0620, 0x252d: 0x400e0820, 0x252e: 0x400e0a20, 0x252f: 0x400e0c20, - 0x2530: 0x400e0e20, 0x2531: 0x400e1020, 0x2532: 0x400e1220, 0x2533: 0x400e1420, - 0x2534: 0x400e1620, 0x2535: 0x400e1820, 0x2536: 0x400e1a20, 0x2537: 0x400e1c20, - 0x2538: 0x400e1e20, 0x2539: 0x400e2020, 0x253a: 0x400e2220, 0x253b: 0x400e2420, - 0x253c: 0x400e2620, 0x253d: 0x400e2820, 0x253e: 0x400e2a20, 0x253f: 0x400e2c20, - // Block 0x95, offset 0x2540 - 0x2540: 0x400e2e20, 0x2541: 0x400e3020, 0x2542: 0x400e3220, 0x2543: 0x400e3420, - 0x2544: 0x400e3620, 0x2545: 0x400e3820, 0x2546: 0x400e3a20, 0x2547: 0x400e3c20, - 0x2548: 0x400e3e20, 0x2549: 0x400e4020, 0x254a: 0x400e4220, 0x254b: 0x400e4420, - 0x254c: 0x400e4620, 0x254d: 0x400e4820, 0x254e: 0x400e4a20, 0x254f: 0x400e4c20, - 0x2550: 0x400e4e20, 0x2551: 0x400e5020, 0x2552: 0x400e5220, 0x2553: 0x400e5420, - 0x2554: 0x400e5620, 0x2555: 0x400e5820, 0x2556: 0x400e5a20, 0x2557: 0x400e5c20, - 0x2558: 0x400e5e20, 0x2559: 0x400e6020, 0x255a: 0x400e6220, 0x255b: 0x400e6420, - 0x255c: 0x400e6620, 0x255d: 0x400e6820, 0x255e: 0x400e6a20, 0x255f: 0x400e6c20, - 0x2560: 0x400e6e20, 0x2561: 0x400e7020, 0x2562: 0x400e7220, 0x2563: 0x400e7420, - 0x2564: 0x400e7620, 0x2565: 0x400e7820, 0x2566: 0x400e7a20, 0x2567: 0x400e7c20, - 0x2568: 0x400e7e20, 0x2569: 0x400e8020, 0x256a: 0x400e8220, 0x256b: 0x400e8420, - 0x256c: 0x400e8620, 0x256d: 0x400e8820, 0x256e: 0x400e8a20, 0x256f: 0x400e8c20, - 0x2570: 0x400e8e20, 0x2571: 0x400e9020, 0x2572: 0x400e9220, 0x2573: 0x400e9420, - 0x2574: 0x400e9620, 0x2575: 0x400e9820, 0x2576: 0x400e9a20, 0x2577: 0x400e9c20, - 0x2578: 0x400e9e20, 0x2579: 0x400ea020, 0x257a: 0x400ea220, 0x257b: 0x400ea420, - 0x257c: 0x400ea620, 0x257d: 0x400ea820, 0x257e: 0x400eaa20, 0x257f: 0x400eac20, - // Block 0x96, offset 0x2580 - 0x2580: 0x400eae20, 0x2581: 0x400eb020, 0x2582: 0x400eb220, 0x2583: 0x400eb420, - 0x2584: 0x400eb620, 0x2585: 0x400eb820, 0x2586: 0x400eba20, 0x2587: 0x400ebc20, - 0x2588: 0x400ebe20, 0x2589: 0x400ec020, 0x258a: 0x400ec220, 0x258b: 0x400ec420, - 0x258c: 0x400ec620, 0x258d: 0x400ec820, 0x258e: 0x400eca20, 0x258f: 0x400ecc20, - 0x2590: 0x400ece20, 0x2591: 0x400ed020, 0x2592: 0x400ed220, 0x2593: 0x400ed420, - 0x2594: 0x400ed620, 0x2595: 0x400ed820, 0x2596: 0x400eda20, 0x2597: 0x400edc20, - 0x2598: 0x400ede20, 0x2599: 0x400ee020, 0x259a: 0x400ee220, 0x259b: 0x400ee420, - 0x259c: 0x400ee620, 0x259d: 0x400ee820, 0x259e: 0x400eea20, 0x259f: 0x400eec20, - 0x25a0: 0x400eee20, 0x25a1: 0x400ef020, 0x25a2: 0x400ef220, 0x25a3: 0x400ef420, - 0x25a4: 0x400ef620, 0x25a5: 0x400ef820, 0x25a6: 0x400efa20, 0x25a7: 0x400efc20, - 0x25a8: 0x400efe20, 0x25a9: 0x400f0020, 0x25aa: 0x400f0220, 0x25ab: 0x400f0420, - 0x25ac: 0x400f0620, 0x25ad: 0x400f0820, 0x25ae: 0x400f0a20, 0x25af: 0x400f0c20, - 0x25b0: 0x400f0e20, 0x25b1: 0x400f1020, 0x25b2: 0x400f1220, 0x25b3: 0x400f1420, - 0x25b4: 0x400f1620, 0x25b5: 0x400f1820, 0x25b6: 0x400f1a20, 0x25b7: 0x400f1c20, - 0x25b8: 0x400f1e20, 0x25b9: 0x400f2020, 0x25ba: 0x400f2220, 0x25bb: 0x400f2420, - 0x25bc: 0x400f2620, 0x25bd: 0x400f2820, 0x25be: 0x400f2a20, 0x25bf: 0x400f2c20, - // Block 0x97, offset 0x25c0 - 0x25c0: 0x400f2e20, 0x25c1: 0x400f3020, 0x25c2: 0x400f3220, 0x25c3: 0x400f3420, - 0x25c4: 0x400f3620, 0x25c5: 0x400f3820, 0x25c6: 0x400f3a20, 0x25c7: 0x400f3c20, - 0x25c8: 0x400f3e20, 0x25c9: 0x400f4020, 0x25ca: 0x400f4220, 0x25cb: 0x400f4420, - 0x25cc: 0x400f4620, 0x25cd: 0x400f4820, 0x25ce: 0x400f4a20, 0x25cf: 0x400f4c20, - 0x25d0: 0x400f4e20, 0x25d1: 0x400f5020, 0x25d2: 0x400f5220, 0x25d3: 0x400f5420, - 0x25d4: 0x400f5620, 0x25d5: 0x400f5820, 0x25d6: 0x400f5a20, 0x25d7: 0x400f5c20, - 0x25d8: 0x400f5e20, 0x25d9: 0x400f6020, 0x25da: 0x400f6220, 0x25db: 0x400f6420, - 0x25dc: 0x400f6620, 0x25dd: 0x400f6820, 0x25de: 0x400f6a20, 0x25df: 0x400f6c20, - 0x25e0: 0x400f6e20, 0x25e1: 0x400f7020, 0x25e2: 0x400f7220, 0x25e3: 0x400f7420, - 0x25e4: 0x400f7620, 0x25e5: 0x400f7820, 0x25e6: 0x400f7a20, 0x25e7: 0x400f7c20, - 0x25e8: 0x400f7e20, 0x25e9: 0x400f8020, 0x25ea: 0x400f8220, 0x25eb: 0x400f8420, - 0x25ec: 0x400f8620, 0x25ed: 0x400f8820, 0x25ee: 0x400f8a20, 0x25ef: 0x400f8c20, - 0x25f0: 0x40195220, 0x25f1: 0x40195420, 0x25f2: 0x40195620, 0x25f3: 0x40195820, - 0x25f4: 0x40195a20, 0x25f5: 0x40195c20, 0x25f6: 0x40195e20, 0x25f7: 0x40196020, - 0x25f8: 0x400f8e20, 0x25f9: 0x400f9020, 0x25fa: 0x400f9220, 0x25fb: 0x400f9420, - 0x25fc: 0x400f9620, 0x25fd: 0x400f9820, 0x25fe: 0x400f9a20, 0x25ff: 0x400f9c20, - // Block 0x98, offset 0x2600 - 0x2600: 0x400f9e20, 0x2601: 0x400fa020, 0x2602: 0x400fa220, 0x2603: 0x400fa420, - 0x2604: 0x400fa620, 0x2605: 0x400fa820, 0x2606: 0x400faa20, 0x2607: 0x400fac20, - 0x2608: 0x400fae20, 0x2609: 0x400fb020, 0x260a: 0x400fb220, 0x260b: 0x400fb420, - 0x260c: 0x400fb620, 0x260d: 0x400fb820, 0x260e: 0x400fba20, 0x260f: 0x400fbc20, - 0x2610: 0x400fbe20, 0x2611: 0x400fc020, 0x2612: 0x400fc220, 0x2613: 0x400fc420, - 0x2614: 0x400fc620, 0x2615: 0x400fc820, 0x2616: 0x400fca20, 0x2617: 0x400fcc20, - 0x2618: 0x400fce20, 0x2619: 0x400fd020, 0x261a: 0x400fd220, 0x261b: 0x400fd420, - 0x261c: 0x400fd620, 0x261d: 0x400fd820, 0x261e: 0x400fda20, 0x261f: 0x400fdc20, - 0x2620: 0x400fde20, 0x2621: 0x400fe020, 0x2622: 0x400fe220, 0x2623: 0x400fe420, - 0x2624: 0x400fe620, 0x2625: 0x400fe820, 0x2626: 0x400fea20, 0x2627: 0x400fec20, - 0x2628: 0x400fee20, 0x2629: 0x400ff020, 0x262a: 0x400ff220, 0x262b: 0x400ff420, - 0x262c: 0x400ff620, 0x262d: 0x401dde20, 0x262e: 0x401de020, 0x262f: 0x401de220, - 0x2630: 0x400ff820, 0x2631: 0x400ffa20, 0x2632: 0x400ffc20, 0x2633: 0x400ffe20, - 0x2634: 0x40100020, 0x2635: 0x40100220, 0x2636: 0x40100420, 0x2637: 0x40100620, - 0x2638: 0x40100820, 0x2639: 0x40100a20, 0x263a: 0x40100c20, 0x263b: 0x40100e20, - 0x263c: 0x40101020, 0x263d: 0x40101220, 0x263e: 0x40101420, 0x263f: 0x40101620, - // Block 0x99, offset 0x2640 - 0x2640: 0x40101820, 0x2641: 0x40101a20, 0x2642: 0x40101c20, 0x2643: 0x40101e20, - 0x2644: 0x40102020, 0x2645: 0x40102220, 0x2646: 0x40102420, 0x2647: 0x40102620, - 0x2648: 0x40102820, 0x2649: 0x40102a20, 0x264a: 0x40194620, 0x264b: 0x40194820, - 0x264c: 0x40194a20, 0x264d: 0x40194c20, 0x264e: 0x40194e20, 0x264f: 0x40195020, - 0x2650: 0x40102c20, 0x2651: 0x40102e20, 0x2652: 0x40103020, 0x2653: 0x40103220, - 0x2654: 0x40103420, 0x2655: 0x40103620, 0x2656: 0x40103820, 0x2657: 0x40103a20, - 0x2658: 0x40103c20, 0x2659: 0x40103e20, 0x265a: 0x40104020, 0x265b: 0x40104220, - 0x265c: 0x40104420, 0x265d: 0x40104620, 0x265e: 0x40104820, 0x265f: 0x40104a20, - 0x2660: 0x40104c20, 0x2661: 0x40104e20, 0x2662: 0x40105020, 0x2663: 0x40105220, - 0x2664: 0x40105420, 0x2665: 0x40105620, 0x2666: 0x40105820, 0x2667: 0x40105a20, - 0x2668: 0x40105c20, 0x2669: 0x40105e20, 0x266a: 0x40106020, 0x266b: 0x40106220, - 0x266c: 0x40106420, 0x266d: 0x40106620, 0x266e: 0x40106820, 0x266f: 0x40106a20, - 0x2670: 0x40106c20, 0x2671: 0x40106e20, 0x2672: 0x40107020, 0x2673: 0x40107220, - 0x2674: 0x40107420, 0x2675: 0x40107620, 0x2676: 0x40107820, 0x2677: 0x40107a20, - 0x2678: 0x40107c20, 0x2679: 0x40107e20, 0x267a: 0x40108020, 0x267b: 0x40108220, - 0x267c: 0x40108420, 0x267d: 0x40108620, 0x267e: 0x40108820, 0x267f: 0x40108a20, - // Block 0x9a, offset 0x2680 - 0x2680: 0x40108c20, 0x2681: 0x40108e20, 0x2682: 0x40109020, 0x2683: 0x40109220, - 0x2684: 0x40109420, 0x2685: 0x40109620, 0x2686: 0x40109820, 0x2687: 0x40109a20, - 0x2688: 0x40109c20, 0x2689: 0x40109e20, 0x268a: 0x4010a020, 0x268b: 0x4010a220, - 0x268c: 0x4010a420, 0x268d: 0x4010a620, 0x268e: 0x4010a820, 0x268f: 0x4010aa20, - 0x2690: 0x4010ac20, 0x2691: 0x4010ae20, 0x2692: 0x4010b020, 0x2693: 0x4010b220, - 0x2694: 0x4010b420, 0x2695: 0x4010b620, 0x2696: 0x4010b820, 0x2697: 0x4010ba20, - 0x2698: 0x4010bc20, 0x2699: 0x4010be20, 0x269a: 0x4010c020, 0x269b: 0x4010c220, - 0x269c: 0x4010c420, 0x269d: 0x4010c620, 0x269e: 0x4010c820, 0x269f: 0x4010ca20, - 0x26a0: 0x4010cc20, 0x26a1: 0x4010ce20, 0x26a2: 0x4010d020, 0x26a3: 0x4010d220, - 0x26a4: 0x4010d420, 0x26a5: 0x4010d620, 0x26a6: 0x4010d820, 0x26a7: 0x4010da20, - 0x26a8: 0x4010dc20, 0x26a9: 0x4010de20, 0x26aa: 0x4010e020, 0x26ab: 0x4010e220, - 0x26ac: 0x4010e420, 0x26ad: 0x4010e620, 0x26ae: 0x4010e820, 0x26af: 0x4010ea20, - 0x26b0: 0x4010ec20, 0x26b1: 0x4010ee20, 0x26b2: 0x4010f020, 0x26b3: 0x4010f220, - 0x26b4: 0x4010f420, 0x26b5: 0x4010f620, 0x26b6: 0x4010f820, 0x26b7: 0x4010fa20, - 0x26b8: 0x4010fc20, 0x26b9: 0x4010fe20, 0x26ba: 0x40110020, 0x26bb: 0x40110220, - 0x26bc: 0x40110420, 0x26bd: 0x40110620, 0x26be: 0x40110820, 0x26bf: 0x40110a20, - // Block 0x9b, offset 0x26c0 - 0x26c1: 0x40114020, 0x26c2: 0x40114220, 0x26c3: 0x40114420, - 0x26c4: 0x40114620, 0x26c5: 0x40114820, 0x26c6: 0x40114a20, 0x26c7: 0x40114c20, - 0x26c8: 0x40114e20, 0x26c9: 0x40115020, 0x26ca: 0x40115220, 0x26cb: 0x40115420, - 0x26cc: 0x40115620, 0x26cd: 0x40115820, 0x26ce: 0x40115a20, 0x26cf: 0x40115c20, - 0x26d0: 0x40115e20, 0x26d1: 0x40116020, 0x26d2: 0x40116220, 0x26d3: 0x40116420, - 0x26d4: 0x40116620, 0x26d5: 0x40116820, 0x26d6: 0x40116a20, 0x26d7: 0x40116c20, - 0x26d8: 0x40116e20, 0x26d9: 0x40117020, 0x26da: 0x40117220, 0x26db: 0x40117420, - 0x26dc: 0x40117620, 0x26dd: 0x40117820, 0x26de: 0x40117a20, 0x26df: 0x40117c20, - 0x26e0: 0x40117e20, 0x26e1: 0x40118020, 0x26e2: 0x40118220, 0x26e3: 0x40118420, - 0x26e4: 0x40118620, 0x26e5: 0x40118820, 0x26e6: 0x40118a20, 0x26e7: 0x40118c20, - 0x26e8: 0x40118e20, 0x26e9: 0x40119020, 0x26ea: 0x40119220, 0x26eb: 0x40119420, - 0x26ec: 0x40119620, 0x26ed: 0x40119820, 0x26ee: 0x40119a20, 0x26ef: 0x40119c20, - 0x26f0: 0x40119e20, 0x26f1: 0x4011a020, 0x26f2: 0x4011a220, 0x26f3: 0x4011a420, - 0x26f4: 0x4011a620, 0x26f5: 0x4011a820, 0x26f6: 0x4011aa20, 0x26f7: 0x4011ac20, - 0x26f8: 0x4011ae20, 0x26f9: 0x4011b020, 0x26fa: 0x4011b220, 0x26fb: 0x4011b420, - 0x26fc: 0x4011b620, 0x26fd: 0x4011b820, 0x26fe: 0x4011ba20, 0x26ff: 0x4011bc20, - // Block 0x9c, offset 0x2700 - 0x2700: 0x4011be20, 0x2701: 0x4011c020, 0x2702: 0x4011c220, 0x2703: 0x4011c420, - 0x2704: 0x4011c620, 0x2705: 0x4011c820, 0x2706: 0x4011ca20, 0x2707: 0x4011cc20, - 0x2708: 0x4011ce20, 0x2709: 0x4011d020, 0x270a: 0x4011d220, 0x270b: 0x4011d420, - 0x270c: 0x4011d620, 0x270d: 0x4011d820, 0x270e: 0x4011da20, 0x270f: 0x4011dc20, - 0x2710: 0x4011de20, 0x2711: 0x4011e020, 0x2712: 0x4011e220, 0x2713: 0x4011e420, - 0x2714: 0x4011e620, 0x2715: 0x4011e820, 0x2716: 0x4011ea20, 0x2717: 0x4011ec20, - 0x2718: 0x4011ee20, 0x2719: 0x4011f020, 0x271a: 0x4011f220, 0x271b: 0x4011f420, - 0x271c: 0x4011f620, 0x271d: 0x4011f820, 0x271e: 0x4011fa20, 0x271f: 0x4011fc20, - 0x2720: 0x4011fe20, 0x2721: 0x40120020, 0x2722: 0x40120220, 0x2723: 0x40120420, - 0x2724: 0x40120620, 0x2725: 0x40120820, 0x2726: 0x40120a20, 0x2727: 0x40120c20, - 0x2728: 0x40045820, 0x2729: 0x40045a20, 0x272a: 0x40045c20, 0x272b: 0x40045e20, - 0x272c: 0x40046020, 0x272d: 0x40046220, 0x272e: 0x40046420, 0x272f: 0x40046620, - 0x2730: 0x40046820, 0x2731: 0x40046a20, 0x2732: 0x40046c20, 0x2733: 0x40046e20, - 0x2734: 0x40047020, 0x2735: 0x40047220, 0x2736: 0x0029ce86, 0x2737: 0x0029d086, - 0x2738: 0x0029d286, 0x2739: 0x0029d486, 0x273a: 0x0029d686, 0x273b: 0x0029d886, - 0x273c: 0x0029da86, 0x273d: 0x0029dc86, 0x273e: 0x0029de86, 0x273f: 0xe00002da, - // Block 0x9d, offset 0x2740 - 0x2740: 0x0029ce86, 0x2741: 0x0029d086, 0x2742: 0x0029d286, 0x2743: 0x0029d486, - 0x2744: 0x0029d686, 0x2745: 0x0029d886, 0x2746: 0x0029da86, 0x2747: 0x0029dc86, - 0x2748: 0x0029de86, 0x2749: 0xe00002dd, 0x274a: 0x0029ce86, 0x274b: 0x0029d086, - 0x274c: 0x0029d286, 0x274d: 0x0029d486, 0x274e: 0x0029d686, 0x274f: 0x0029d886, - 0x2750: 0x0029da86, 0x2751: 0x0029dc86, 0x2752: 0x0029de86, 0x2753: 0xe00002e0, - 0x2754: 0x40120e20, 0x2755: 0x40121020, 0x2756: 0x40121220, 0x2757: 0x40121420, - 0x2758: 0x40121620, 0x2759: 0x40121820, 0x275a: 0x40121a20, 0x275b: 0x40121c20, - 0x275c: 0x40121e20, 0x275d: 0x40122020, 0x275e: 0x40122220, 0x275f: 0x40122420, - 0x2760: 0x40122620, 0x2761: 0x40122820, 0x2762: 0x40122a20, 0x2763: 0x40122c20, - 0x2764: 0x40122e20, 0x2765: 0x40123020, 0x2766: 0x40123220, 0x2767: 0x40123420, - 0x2768: 0x40123620, 0x2769: 0x40123820, 0x276a: 0x40123a20, 0x276b: 0x40123c20, - 0x276c: 0x40123e20, 0x276d: 0x40124020, 0x276e: 0x40124220, 0x276f: 0x40124420, - 0x2770: 0x40124620, 0x2771: 0x40124820, 0x2772: 0x40124a20, 0x2773: 0x40124c20, - 0x2774: 0x40124e20, 0x2775: 0x40125020, 0x2776: 0x40125220, 0x2777: 0x40125420, - 0x2778: 0x40125620, 0x2779: 0x40125820, 0x277a: 0x40125a20, 0x277b: 0x40125c20, - 0x277c: 0x40125e20, 0x277d: 0x40126020, 0x277e: 0x40126220, 0x277f: 0x40126420, - // Block 0x9e, offset 0x2780 - 0x2780: 0x40126620, 0x2781: 0x40126820, 0x2782: 0x40126a20, 0x2783: 0x40126c20, - 0x2784: 0x40126e20, 0x2785: 0x40044020, 0x2786: 0x40044220, 0x2787: 0x40127020, - 0x2788: 0x40127220, 0x2789: 0x40127420, 0x278a: 0x40127620, 0x278b: 0x40127820, - 0x278c: 0x40127a20, 0x278d: 0x40127c20, 0x278e: 0x40127e20, 0x278f: 0x40128020, - 0x2790: 0x40128220, 0x2791: 0x40128420, 0x2792: 0x40128620, 0x2793: 0x40128820, - 0x2794: 0x40128a20, 0x2795: 0x40128c20, 0x2796: 0x40128e20, 0x2797: 0x40129020, - 0x2798: 0x40129220, 0x2799: 0x40129420, 0x279a: 0x40129620, 0x279b: 0x40129820, - 0x279c: 0x40129a20, 0x279d: 0x40129c20, 0x279e: 0x40129e20, 0x279f: 0x4012a020, - 0x27a0: 0x4012a220, 0x27a1: 0x4012a420, 0x27a2: 0x4012a620, 0x27a3: 0x4012a820, - 0x27a4: 0x4012aa20, 0x27a5: 0x4012ac20, 0x27a6: 0x40044420, 0x27a7: 0x40044620, - 0x27a8: 0x40044820, 0x27a9: 0x40044a20, 0x27aa: 0x40044c20, 0x27ab: 0x40044e20, - 0x27ac: 0x40045020, 0x27ad: 0x40045220, 0x27ae: 0x40045420, 0x27af: 0x40045620, - 0x27b0: 0x4012ae20, 0x27b1: 0x4012b020, 0x27b2: 0x4012b220, 0x27b3: 0x4012b420, - 0x27b4: 0x4012b620, 0x27b5: 0x4012b820, 0x27b6: 0x4012ba20, 0x27b7: 0x4012bc20, - 0x27b8: 0x4012be20, 0x27b9: 0x4012c020, 0x27ba: 0x4012c220, 0x27bb: 0x4012c420, - 0x27bc: 0x4012c620, 0x27bd: 0x4012c820, 0x27be: 0x4012ca20, 0x27bf: 0x4012cc20, - // Block 0x9f, offset 0x27c0 - 0x27c0: 0x40174620, 0x27c1: 0x40174820, 0x27c2: 0x40174a20, 0x27c3: 0x40174c20, - 0x27c4: 0x40174e20, 0x27c5: 0x40175020, 0x27c6: 0x40175220, 0x27c7: 0x40175420, - 0x27c8: 0x40175620, 0x27c9: 0x40175820, 0x27ca: 0x40175a20, 0x27cb: 0x40175c20, - 0x27cc: 0x40175e20, 0x27cd: 0x40176020, 0x27ce: 0x40176220, 0x27cf: 0x40176420, - 0x27d0: 0x40176620, 0x27d1: 0x40176820, 0x27d2: 0x40176a20, 0x27d3: 0x40176c20, - 0x27d4: 0x40176e20, 0x27d5: 0x40177020, 0x27d6: 0x40177220, 0x27d7: 0x40177420, - 0x27d8: 0x40177620, 0x27d9: 0x40177820, 0x27da: 0x40177a20, 0x27db: 0x40177c20, - 0x27dc: 0x40177e20, 0x27dd: 0x40178020, 0x27de: 0x40178220, 0x27df: 0x40178420, - 0x27e0: 0x40178620, 0x27e1: 0x40178820, 0x27e2: 0x40178a20, 0x27e3: 0x40178c20, - 0x27e4: 0x40178e20, 0x27e5: 0x40179020, 0x27e6: 0x40179220, 0x27e7: 0x40179420, - 0x27e8: 0x40179620, 0x27e9: 0x40179820, 0x27ea: 0x40179a20, 0x27eb: 0x40179c20, - 0x27ec: 0x40179e20, 0x27ed: 0x4017a020, 0x27ee: 0x4017a220, 0x27ef: 0x4017a420, - 0x27f0: 0x4017a620, 0x27f1: 0x4017a820, 0x27f2: 0x4017aa20, 0x27f3: 0x4017ac20, - 0x27f4: 0x4017ae20, 0x27f5: 0x4017b020, 0x27f6: 0x4017b220, 0x27f7: 0x4017b420, - 0x27f8: 0x4017b620, 0x27f9: 0x4017b820, 0x27fa: 0x4017ba20, 0x27fb: 0x4017bc20, - 0x27fc: 0x4017be20, 0x27fd: 0x4017c020, 0x27fe: 0x4017c220, 0x27ff: 0x4017c420, - // Block 0xa0, offset 0x2800 - 0x2800: 0x4017c620, 0x2801: 0x4017c820, 0x2802: 0x4017ca20, 0x2803: 0x4017cc20, - 0x2804: 0x4017ce20, 0x2805: 0x4017d020, 0x2806: 0x4017d220, 0x2807: 0x4017d420, - 0x2808: 0x4017d620, 0x2809: 0x4017d820, 0x280a: 0x4017da20, 0x280b: 0x4017dc20, - 0x280c: 0x4017de20, 0x280d: 0x4017e020, 0x280e: 0x4017e220, 0x280f: 0x4017e420, - 0x2810: 0x4017e620, 0x2811: 0x4017e820, 0x2812: 0x4017ea20, 0x2813: 0x4017ec20, - 0x2814: 0x4017ee20, 0x2815: 0x4017f020, 0x2816: 0x4017f220, 0x2817: 0x4017f420, - 0x2818: 0x4017f620, 0x2819: 0x4017f820, 0x281a: 0x4017fa20, 0x281b: 0x4017fc20, - 0x281c: 0x4017fe20, 0x281d: 0x40180020, 0x281e: 0x40180220, 0x281f: 0x40180420, - 0x2820: 0x40180620, 0x2821: 0x40180820, 0x2822: 0x40180a20, 0x2823: 0x40180c20, - 0x2824: 0x40180e20, 0x2825: 0x40181020, 0x2826: 0x40181220, 0x2827: 0x40181420, - 0x2828: 0x40181620, 0x2829: 0x40181820, 0x282a: 0x40181a20, 0x282b: 0x40181c20, - 0x282c: 0x40181e20, 0x282d: 0x40182020, 0x282e: 0x40182220, 0x282f: 0x40182420, - 0x2830: 0x40182620, 0x2831: 0x40182820, 0x2832: 0x40182a20, 0x2833: 0x40182c20, - 0x2834: 0x40182e20, 0x2835: 0x40183020, 0x2836: 0x40183220, 0x2837: 0x40183420, - 0x2838: 0x40183620, 0x2839: 0x40183820, 0x283a: 0x40183a20, 0x283b: 0x40183c20, - 0x283c: 0x40183e20, 0x283d: 0x40184020, 0x283e: 0x40184220, 0x283f: 0x40184420, - // Block 0xa1, offset 0x2840 - 0x2840: 0x40184620, 0x2841: 0x40184820, 0x2842: 0x40184a20, 0x2843: 0x40184c20, - 0x2844: 0x40184e20, 0x2845: 0x40185020, 0x2846: 0x40185220, 0x2847: 0x40185420, - 0x2848: 0x40185620, 0x2849: 0x40185820, 0x284a: 0x40185a20, 0x284b: 0x40185c20, - 0x284c: 0x40185e20, 0x284d: 0x40186020, 0x284e: 0x40186220, 0x284f: 0x40186420, - 0x2850: 0x40186620, 0x2851: 0x40186820, 0x2852: 0x40186a20, 0x2853: 0x40186c20, - 0x2854: 0x40186e20, 0x2855: 0x40187020, 0x2856: 0x40187220, 0x2857: 0x40187420, - 0x2858: 0x40187620, 0x2859: 0x40187820, 0x285a: 0x40187a20, 0x285b: 0x40187c20, - 0x285c: 0x40187e20, 0x285d: 0x40188020, 0x285e: 0x40188220, 0x285f: 0x40188420, - 0x2860: 0x40188620, 0x2861: 0x40188820, 0x2862: 0x40188a20, 0x2863: 0x40188c20, - 0x2864: 0x40188e20, 0x2865: 0x40189020, 0x2866: 0x40189220, 0x2867: 0x40189420, - 0x2868: 0x40189620, 0x2869: 0x40189820, 0x286a: 0x40189a20, 0x286b: 0x40189c20, - 0x286c: 0x40189e20, 0x286d: 0x4018a020, 0x286e: 0x4018a220, 0x286f: 0x4018a420, - 0x2870: 0x4018a620, 0x2871: 0x4018a820, 0x2872: 0x4018aa20, 0x2873: 0x4018ac20, - 0x2874: 0x4018ae20, 0x2875: 0x4018b020, 0x2876: 0x4018b220, 0x2877: 0x4018b420, - 0x2878: 0x4018b620, 0x2879: 0x4018b820, 0x287a: 0x4018ba20, 0x287b: 0x4018bc20, - 0x287c: 0x4018be20, 0x287d: 0x4018c020, 0x287e: 0x4018c220, 0x287f: 0x4018c420, - // Block 0xa2, offset 0x2880 - 0x2880: 0x4018c620, 0x2881: 0x4018c820, 0x2882: 0x4018ca20, 0x2883: 0x4018cc20, - 0x2884: 0x4018ce20, 0x2885: 0x4018d020, 0x2886: 0x4018d220, 0x2887: 0x4018d420, - 0x2888: 0x4018d620, 0x2889: 0x4018d820, 0x288a: 0x4018da20, 0x288b: 0x4018dc20, - 0x288c: 0x4018de20, 0x288d: 0x4018e020, 0x288e: 0x4018e220, 0x288f: 0x4018e420, - 0x2890: 0x4018e620, 0x2891: 0x4018e820, 0x2892: 0x4018ea20, 0x2893: 0x4018ec20, - 0x2894: 0x4018ee20, 0x2895: 0x4018f020, 0x2896: 0x4018f220, 0x2897: 0x4018f420, - 0x2898: 0x4018f620, 0x2899: 0x4018f820, 0x289a: 0x4018fa20, 0x289b: 0x4018fc20, - 0x289c: 0x4018fe20, 0x289d: 0x40190020, 0x289e: 0x40190220, 0x289f: 0x40190420, - 0x28a0: 0x40190620, 0x28a1: 0x40190820, 0x28a2: 0x40190a20, 0x28a3: 0x40190c20, - 0x28a4: 0x40190e20, 0x28a5: 0x40191020, 0x28a6: 0x40191220, 0x28a7: 0x40191420, - 0x28a8: 0x40191620, 0x28a9: 0x40191820, 0x28aa: 0x40191a20, 0x28ab: 0x40191c20, - 0x28ac: 0x40191e20, 0x28ad: 0x40192020, 0x28ae: 0x40192220, 0x28af: 0x40192420, - 0x28b0: 0x40192620, 0x28b1: 0x40192820, 0x28b2: 0x40192a20, 0x28b3: 0x40192c20, - 0x28b4: 0x40192e20, 0x28b5: 0x40193020, 0x28b6: 0x40193220, 0x28b7: 0x40193420, - 0x28b8: 0x40193620, 0x28b9: 0x40193820, 0x28ba: 0x40193a20, 0x28bb: 0x40193c20, - 0x28bc: 0x40193e20, 0x28bd: 0x40194020, 0x28be: 0x40194220, 0x28bf: 0x40194420, - // Block 0xa3, offset 0x28c0 - 0x28c0: 0x4012ce20, 0x28c1: 0x4012d020, 0x28c2: 0x4012d220, 0x28c3: 0x4012d420, - 0x28c4: 0x4012d620, 0x28c5: 0x4012d820, 0x28c6: 0x4012da20, 0x28c7: 0x4012dc20, - 0x28c8: 0x4012de20, 0x28c9: 0x4012e020, 0x28ca: 0x4012e220, 0x28cb: 0x4012e420, - 0x28cc: 0x4012e620, 0x28cd: 0x4012e820, 0x28ce: 0x4012ea20, 0x28cf: 0x4012ec20, - 0x28d0: 0x4012ee20, 0x28d1: 0x4012f020, 0x28d2: 0x4012f220, 0x28d3: 0x4012f420, - 0x28d4: 0x4012f620, 0x28d5: 0x4012f820, 0x28d6: 0x4012fa20, 0x28d7: 0x4012fc20, - 0x28d8: 0x4012fe20, 0x28d9: 0x40130020, 0x28da: 0x40130220, 0x28db: 0x40130420, - 0x28dc: 0x40130620, 0x28dd: 0x40130820, 0x28de: 0x40130a20, 0x28df: 0x40130c20, - 0x28e0: 0x40130e20, 0x28e1: 0x40131020, 0x28e2: 0x40131220, 0x28e3: 0x40131420, - 0x28e4: 0x40131620, 0x28e5: 0x40131820, 0x28e6: 0x40131a20, 0x28e7: 0x40131c20, - 0x28e8: 0x40131e20, 0x28e9: 0x40132020, 0x28ea: 0x40132220, 0x28eb: 0x40132420, - 0x28ec: 0x40132620, 0x28ed: 0x40132820, 0x28ee: 0x40132a20, 0x28ef: 0x40132c20, - 0x28f0: 0x40132e20, 0x28f1: 0x40133020, 0x28f2: 0x40133220, 0x28f3: 0x40133420, - 0x28f4: 0x40133620, 0x28f5: 0x40133820, 0x28f6: 0x40133a20, 0x28f7: 0x40133c20, - 0x28f8: 0x40133e20, 0x28f9: 0x40134020, 0x28fa: 0x40134220, 0x28fb: 0x40134420, - 0x28fc: 0x40134620, 0x28fd: 0x40134820, 0x28fe: 0x40134a20, 0x28ff: 0x40134c20, - // Block 0xa4, offset 0x2900 - 0x2900: 0x40134e20, 0x2901: 0x40135020, 0x2902: 0x40135220, 0x2903: 0x40135420, - 0x2904: 0x40135620, 0x2905: 0x40135820, 0x2906: 0x40135a20, 0x2907: 0x40135c20, - 0x2908: 0x40135e20, 0x2909: 0x40136020, 0x290a: 0x40136220, 0x290b: 0x40136420, - 0x290c: 0x40136620, 0x290d: 0x40136820, 0x290e: 0x40136a20, 0x290f: 0x40136c20, - 0x2910: 0x40136e20, 0x2911: 0x40137020, 0x2912: 0x40137220, 0x2913: 0x40137420, - 0x2914: 0x40137620, 0x2915: 0x40137820, 0x2916: 0x40137a20, 0x2917: 0x40137c20, - 0x2918: 0x40137e20, 0x2919: 0x40138020, 0x291a: 0x40138220, 0x291b: 0x40138420, - 0x291c: 0x40138620, 0x291d: 0x40138820, 0x291e: 0x40138a20, 0x291f: 0x40138c20, - 0x2920: 0x40138e20, 0x2921: 0x40139020, 0x2922: 0x40139220, 0x2923: 0x40139420, - 0x2924: 0x40139620, 0x2925: 0x40139820, 0x2926: 0x40139a20, 0x2927: 0x40139c20, - 0x2928: 0x40139e20, 0x2929: 0x4013a020, 0x292a: 0x4013a220, 0x292b: 0x4013a420, - 0x292c: 0x4013a620, 0x292d: 0x4013a820, 0x292e: 0x4013aa20, 0x292f: 0x4013ac20, - 0x2930: 0x4013ae20, 0x2931: 0x4013b020, 0x2932: 0x4013b220, 0x2933: 0x4013b420, - 0x2934: 0x4013b620, 0x2935: 0x4013b820, 0x2936: 0x4013ba20, 0x2937: 0x4013bc20, - 0x2938: 0x4013be20, 0x2939: 0x4013c020, 0x293a: 0x4013c220, 0x293b: 0x4013c420, - 0x293c: 0x4013c620, 0x293d: 0x4013c820, 0x293e: 0x4013ca20, 0x293f: 0x4013cc20, - // Block 0xa5, offset 0x2940 - 0x2940: 0x4013ce20, 0x2941: 0x4013d020, 0x2942: 0x4013d220, 0x2943: 0x40041420, - 0x2944: 0x40041620, 0x2945: 0x40041820, 0x2946: 0x40041a20, 0x2947: 0x40041c20, - 0x2948: 0x40041e20, 0x2949: 0x40042020, 0x294a: 0x40042220, 0x294b: 0x40042420, - 0x294c: 0x40042620, 0x294d: 0x40042820, 0x294e: 0x40042a20, 0x294f: 0x40042c20, - 0x2950: 0x40042e20, 0x2951: 0x40043020, 0x2952: 0x40043220, 0x2953: 0x40043420, - 0x2954: 0x40043620, 0x2955: 0x40043820, 0x2956: 0x40043a20, 0x2957: 0x40043c20, - 0x2958: 0x40043e20, 0x2959: 0x4013d420, 0x295a: 0x4013d620, 0x295b: 0x4013d820, - 0x295c: 0x4013da20, 0x295d: 0x4013dc20, 0x295e: 0x4013de20, 0x295f: 0x4013e020, - 0x2960: 0x4013e220, 0x2961: 0x4013e420, 0x2962: 0x4013e620, 0x2963: 0x4013e820, - 0x2964: 0x4013ea20, 0x2965: 0x4013ec20, 0x2966: 0x4013ee20, 0x2967: 0x4013f020, - 0x2968: 0x4013f220, 0x2969: 0x4013f420, 0x296a: 0x4013f620, 0x296b: 0x4013f820, - 0x296c: 0x4013fa20, 0x296d: 0x4013fc20, 0x296e: 0x4013fe20, 0x296f: 0x40140020, - 0x2970: 0x40140220, 0x2971: 0x40140420, 0x2972: 0x40140620, 0x2973: 0x40140820, - 0x2974: 0x40140a20, 0x2975: 0x40140c20, 0x2976: 0x40140e20, 0x2977: 0x40141020, - 0x2978: 0x40141220, 0x2979: 0x40141420, 0x297a: 0x40141620, 0x297b: 0x40141820, - 0x297c: 0x40141a20, 0x297d: 0x40141c20, 0x297e: 0x40141e20, 0x297f: 0x40142020, - // Block 0xa6, offset 0x2980 - 0x2980: 0x40142220, 0x2981: 0x40142420, 0x2982: 0x40142620, 0x2983: 0x40142820, - 0x2984: 0x40142a20, 0x2985: 0x40142c20, 0x2986: 0x40142e20, 0x2987: 0x40143020, - 0x2988: 0x40143220, 0x2989: 0x40143420, 0x298a: 0x40143620, 0x298b: 0x40143820, - 0x298c: 0x40143a20, 0x298d: 0x40143c20, 0x298e: 0x40143e20, 0x298f: 0x40144020, - 0x2990: 0x40144220, 0x2991: 0x40144420, 0x2992: 0x40144620, 0x2993: 0x40144820, - 0x2994: 0x40144a20, 0x2995: 0x40144c20, 0x2996: 0x40144e20, 0x2997: 0x40145020, - 0x2998: 0x4004c620, 0x2999: 0x4004c820, 0x299a: 0x4004ca20, 0x299b: 0x4004cc20, - 0x299c: 0x40145220, 0x299d: 0x40145420, 0x299e: 0x40145620, 0x299f: 0x40145820, - 0x29a0: 0x40145a20, 0x29a1: 0x40145c20, 0x29a2: 0x40145e20, 0x29a3: 0x40146020, - 0x29a4: 0x40146220, 0x29a5: 0x40146420, 0x29a6: 0x40146620, 0x29a7: 0x40146820, - 0x29a8: 0x40146a20, 0x29a9: 0x40146c20, 0x29aa: 0x40146e20, 0x29ab: 0x40147020, - 0x29ac: 0x40147220, 0x29ad: 0x40147420, 0x29ae: 0x40147620, 0x29af: 0x40147820, - 0x29b0: 0x40147a20, 0x29b1: 0x40147c20, 0x29b2: 0x40147e20, 0x29b3: 0x40148020, - 0x29b4: 0x40148220, 0x29b5: 0x40148420, 0x29b6: 0x40148620, 0x29b7: 0x40148820, - 0x29b8: 0x40148a20, 0x29b9: 0x40148c20, 0x29ba: 0x40148e20, 0x29bb: 0x40149020, - 0x29bc: 0x40041020, 0x29bd: 0x40041220, 0x29be: 0x40149220, 0x29bf: 0x40149420, - // Block 0xa7, offset 0x29c0 - 0x29c0: 0x40149620, 0x29c1: 0x40149820, 0x29c2: 0x40149a20, 0x29c3: 0x40149c20, - 0x29c4: 0x40149e20, 0x29c5: 0x4014a020, 0x29c6: 0x4014a220, 0x29c7: 0x4014a420, - 0x29c8: 0x4014a620, 0x29c9: 0x4014a820, 0x29ca: 0x4014aa20, 0x29cb: 0x4014ac20, - 0x29cc: 0xe00000f0, 0x29cd: 0x4014ae20, 0x29ce: 0x4014b020, 0x29cf: 0x4014b220, - 0x29d0: 0x4014b420, 0x29d1: 0x4014b620, 0x29d2: 0x4014b820, 0x29d3: 0x4014ba20, - 0x29d4: 0x4014bc20, 0x29d5: 0x4014be20, 0x29d6: 0x4014c020, 0x29d7: 0x4014c220, - 0x29d8: 0x4014c420, 0x29d9: 0x4014c620, 0x29da: 0x4014c820, 0x29db: 0x4014ca20, - 0x29dc: 0x4014cc20, 0x29dd: 0x4014ce20, 0x29de: 0x4014d020, 0x29df: 0x4014d220, - 0x29e0: 0x4014d420, 0x29e1: 0x4014d620, 0x29e2: 0x4014d820, 0x29e3: 0x4014da20, - 0x29e4: 0x4014dc20, 0x29e5: 0x4014de20, 0x29e6: 0x4014e020, 0x29e7: 0x4014e220, - 0x29e8: 0x4014e420, 0x29e9: 0x4014e620, 0x29ea: 0x4014e820, 0x29eb: 0x4014ea20, - 0x29ec: 0x4014ec20, 0x29ed: 0x4014ee20, 0x29ee: 0x4014f020, 0x29ef: 0x4014f220, - 0x29f0: 0x4014f420, 0x29f1: 0x4014f620, 0x29f2: 0x4014f820, 0x29f3: 0x4014fa20, - 0x29f4: 0x4014fc20, 0x29f5: 0x4014fe20, 0x29f6: 0x40150020, 0x29f7: 0x40150220, - 0x29f8: 0x40150420, 0x29f9: 0x40150620, 0x29fa: 0x40150820, 0x29fb: 0x40150a20, - 0x29fc: 0x40150c20, 0x29fd: 0x40150e20, 0x29fe: 0x40151020, 0x29ff: 0x40151220, - // Block 0xa8, offset 0x2a00 - 0x2a00: 0x40151420, 0x2a01: 0x40151620, 0x2a02: 0x40151820, 0x2a03: 0x40151a20, - 0x2a04: 0x40151c20, 0x2a05: 0x40151e20, 0x2a06: 0x40152020, 0x2a07: 0x40152220, - 0x2a08: 0x40152420, 0x2a09: 0x40152620, 0x2a0a: 0x40152820, 0x2a0b: 0x40152a20, - 0x2a0c: 0x40152c20, 0x2a0d: 0x40152e20, 0x2a0e: 0x40153020, 0x2a0f: 0x40153220, - 0x2a10: 0x40153420, 0x2a11: 0x40153620, 0x2a12: 0x40153820, 0x2a13: 0x40153a20, - 0x2a14: 0x40153c20, 0x2a15: 0x40153e20, 0x2a16: 0x40154020, 0x2a17: 0x40154220, - 0x2a18: 0x40154420, 0x2a19: 0x40154620, 0x2a1a: 0x40154820, 0x2a1b: 0x40154a20, - 0x2a1c: 0x40154c20, 0x2a1d: 0x40154e20, 0x2a1e: 0x40155020, 0x2a1f: 0x40155220, - 0x2a20: 0x40155420, 0x2a21: 0x40155620, 0x2a22: 0x40155820, 0x2a23: 0x40155a20, - 0x2a24: 0x40155c20, 0x2a25: 0x40155e20, 0x2a26: 0x40156020, 0x2a27: 0x40156220, - 0x2a28: 0x40156420, 0x2a29: 0x40156620, 0x2a2a: 0x40156820, 0x2a2b: 0x40156a20, - 0x2a2c: 0x40156c20, 0x2a2d: 0x40156e20, 0x2a2e: 0x40157020, 0x2a2f: 0x40157220, - 0x2a30: 0x40157420, 0x2a31: 0x40157620, 0x2a32: 0x40157820, 0x2a33: 0x40157a20, - 0x2a34: 0xf0000404, 0x2a35: 0xf0001f04, 0x2a36: 0xf0000404, 0x2a37: 0x40157c20, - 0x2a38: 0x40157e20, 0x2a39: 0x40158020, 0x2a3a: 0x40158220, 0x2a3b: 0x40158420, - 0x2a3c: 0x40158620, 0x2a3d: 0x40158820, 0x2a3e: 0x40158a20, 0x2a3f: 0x40158c20, - // Block 0xa9, offset 0x2a40 - 0x2a40: 0x40158e20, 0x2a41: 0x40159020, 0x2a42: 0x40159220, 0x2a43: 0x40159420, - 0x2a44: 0x40159620, 0x2a45: 0x40159820, 0x2a46: 0x40159a20, 0x2a47: 0x40159c20, - 0x2a48: 0x40159e20, 0x2a49: 0x4015a020, 0x2a4a: 0x4015a220, 0x2a4b: 0x4015a420, - 0x2a4c: 0x4015a620, 0x2a4d: 0x4015a820, 0x2a4e: 0x4015aa20, 0x2a4f: 0x4015ac20, - 0x2a50: 0x4015ae20, 0x2a51: 0x4015b020, 0x2a52: 0x4015b220, 0x2a53: 0x4015b420, - 0x2a54: 0x4015b620, 0x2a55: 0x4015b820, 0x2a56: 0x4015ba20, 0x2a57: 0x4015bc20, - 0x2a58: 0x4015be20, 0x2a59: 0x4015c020, 0x2a5a: 0x4015c220, 0x2a5b: 0x4015c420, - 0x2a5c: 0x4015c620, 0x2a5d: 0x4015c820, 0x2a5e: 0x4015ca20, 0x2a5f: 0x4015cc20, - 0x2a60: 0x4015ce20, 0x2a61: 0x4015d020, 0x2a62: 0x4015d220, 0x2a63: 0x4015d420, - 0x2a64: 0x4015d620, 0x2a65: 0x4015d820, 0x2a66: 0x4015da20, 0x2a67: 0x4015dc20, - 0x2a68: 0x4015de20, 0x2a69: 0x4015e020, 0x2a6a: 0x4015e220, 0x2a6b: 0x4015e420, - 0x2a6c: 0x4015e620, 0x2a6d: 0x4015e820, 0x2a6e: 0x4015ea20, 0x2a6f: 0x4015ec20, - 0x2a70: 0x4015ee20, 0x2a71: 0x4015f020, 0x2a72: 0x4015f220, 0x2a73: 0x4015f420, - 0x2a74: 0x4015f620, 0x2a75: 0x4015f820, 0x2a76: 0x4015fa20, 0x2a77: 0x4015fc20, - 0x2a78: 0x4015fe20, 0x2a79: 0x40160020, 0x2a7a: 0x40160220, 0x2a7b: 0x40160420, - 0x2a7c: 0x40160620, 0x2a7d: 0x40160820, 0x2a7e: 0x40160a20, 0x2a7f: 0x40160c20, - // Block 0xaa, offset 0x2a80 - 0x2a80: 0x40160e20, 0x2a81: 0x40161020, 0x2a82: 0x40161220, 0x2a83: 0x40161420, - 0x2a84: 0x40161620, 0x2a85: 0x40161820, 0x2a86: 0x40161a20, 0x2a87: 0x40161c20, - 0x2a88: 0x40161e20, 0x2a89: 0x40162020, 0x2a8a: 0x40162220, 0x2a8b: 0x40162420, - 0x2a8c: 0x40162620, 0x2a8d: 0x40162820, 0x2a8e: 0x40162a20, 0x2a8f: 0x40162c20, - 0x2a90: 0x40162e20, 0x2a91: 0x40163020, 0x2a92: 0x40163220, 0x2a93: 0x40163420, - 0x2a94: 0x40163620, 0x2a95: 0x40163820, 0x2a96: 0x40163a20, 0x2a97: 0x40163c20, - 0x2a98: 0x40163e20, 0x2a99: 0x40164020, 0x2a9a: 0x40164220, 0x2a9b: 0x40164420, - 0x2a9c: 0xe000014f, 0x2a9d: 0x40164620, 0x2a9e: 0x40164820, 0x2a9f: 0x40164a20, - 0x2aa0: 0x40164c20, 0x2aa1: 0x40164e20, 0x2aa2: 0x40165020, 0x2aa3: 0x40165220, - 0x2aa4: 0x40165420, 0x2aa5: 0x40165620, 0x2aa6: 0x40165820, 0x2aa7: 0x40165a20, - 0x2aa8: 0x40165c20, 0x2aa9: 0x40165e20, 0x2aaa: 0x40166020, 0x2aab: 0x40166220, - 0x2aac: 0x40166420, 0x2aad: 0x40166620, 0x2aae: 0x40166820, 0x2aaf: 0x40166a20, - 0x2ab0: 0x40166c20, 0x2ab1: 0x40166e20, 0x2ab2: 0x40167020, 0x2ab3: 0x40167220, - 0x2ab4: 0x40167420, 0x2ab5: 0x40167620, 0x2ab6: 0x40167820, 0x2ab7: 0x40167a20, - 0x2ab8: 0x40167c20, 0x2ab9: 0x40167e20, 0x2aba: 0x40168020, 0x2abb: 0x40168220, - 0x2abc: 0x40168420, 0x2abd: 0x40168620, 0x2abe: 0x40168820, 0x2abf: 0x40168a20, - // Block 0xab, offset 0x2ac0 - 0x2ac0: 0x40168c20, 0x2ac1: 0x40168e20, 0x2ac2: 0x40169020, 0x2ac3: 0x40169220, - 0x2ac4: 0x40169420, 0x2ac5: 0x40169620, 0x2ac6: 0x40169820, 0x2ac7: 0x40169a20, - 0x2ac8: 0x40169c20, 0x2ac9: 0x40169e20, 0x2aca: 0x4016a020, 0x2acb: 0x4016a220, - 0x2acc: 0x4016a420, 0x2acd: 0x4016a620, 0x2ace: 0x4016a820, 0x2acf: 0x4016aa20, - 0x2ad0: 0x4016ac20, 0x2ad1: 0x4016ae20, 0x2ad2: 0x4016b020, 0x2ad3: 0x4016b220, - 0x2ad4: 0x4016b420, 0x2ad5: 0x4016b620, 0x2ad6: 0x4016b820, 0x2ad7: 0x4016ba20, - 0x2ad8: 0x4016bc20, 0x2ad9: 0x4016be20, 0x2ada: 0x4016c020, 0x2adb: 0x4016c220, - 0x2adc: 0x4016c420, 0x2add: 0x4016c620, 0x2ade: 0x4016c820, 0x2adf: 0x4016ca20, - 0x2ae0: 0x4016cc20, 0x2ae1: 0x4016ce20, 0x2ae2: 0x4016d020, 0x2ae3: 0x4016d220, - 0x2ae4: 0x4016d420, 0x2ae5: 0x4016d620, 0x2ae6: 0x4016d820, 0x2ae7: 0x4016da20, - 0x2ae8: 0x4016dc20, 0x2ae9: 0x4016de20, 0x2aea: 0x4016e020, 0x2aeb: 0x4016e220, - 0x2aec: 0x4016e420, 0x2aed: 0x4016e620, 0x2aee: 0x4016e820, 0x2aef: 0x4016ea20, - 0x2af0: 0x4016ec20, 0x2af1: 0x4016ee20, 0x2af2: 0x4016f020, 0x2af3: 0x4016f220, - 0x2af4: 0x4016f420, 0x2af5: 0x4016f620, 0x2af6: 0x4016f820, 0x2af7: 0x4016fa20, - 0x2af8: 0x4016fc20, 0x2af9: 0x4016fe20, 0x2afa: 0x40170020, 0x2afb: 0x40170220, - 0x2afc: 0x40170420, 0x2afd: 0x40170620, 0x2afe: 0x40170820, 0x2aff: 0x40170a20, - // Block 0xac, offset 0x2b00 - 0x2b00: 0x40170c20, 0x2b01: 0x40170e20, 0x2b02: 0x40171020, 0x2b03: 0x40171220, - 0x2b04: 0x40171420, 0x2b05: 0x40171620, 0x2b06: 0x40171820, 0x2b07: 0x40171a20, - 0x2b08: 0x40171c20, 0x2b09: 0x40171e20, 0x2b0a: 0x40172020, 0x2b0b: 0x40172220, - 0x2b0c: 0x40172420, - 0x2b10: 0x40172620, 0x2b11: 0x40172820, 0x2b12: 0x40172a20, 0x2b13: 0x40172c20, - 0x2b14: 0x40172e20, 0x2b15: 0x40173020, 0x2b16: 0x40173220, 0x2b17: 0x40173420, - 0x2b18: 0x40173620, 0x2b19: 0x40173820, - // Block 0xad, offset 0x2b40 - 0x2b40: 0x00373888, 0x2b41: 0x00373a88, 0x2b42: 0x00373c88, 0x2b43: 0x00373e88, - 0x2b44: 0x00374088, 0x2b45: 0x00374288, 0x2b46: 0x00374488, 0x2b47: 0x00374688, - 0x2b48: 0x00374888, 0x2b49: 0x00374a88, 0x2b4a: 0x00374c88, 0x2b4b: 0x00374e88, - 0x2b4c: 0x00375088, 0x2b4d: 0x00375288, 0x2b4e: 0x00375488, 0x2b4f: 0x00375688, - 0x2b50: 0x00375888, 0x2b51: 0x00375a88, 0x2b52: 0x00375c88, 0x2b53: 0x00375e88, - 0x2b54: 0x00376088, 0x2b55: 0x00376288, 0x2b56: 0x00376488, 0x2b57: 0x00376688, - 0x2b58: 0x00376888, 0x2b59: 0x00376a88, 0x2b5a: 0x00376c88, 0x2b5b: 0x00376e88, - 0x2b5c: 0x00377088, 0x2b5d: 0x00377288, 0x2b5e: 0x00377488, 0x2b5f: 0x00377688, - 0x2b60: 0x00377888, 0x2b61: 0x00377a88, 0x2b62: 0x00377c88, 0x2b63: 0x00377e88, - 0x2b64: 0x00378088, 0x2b65: 0x00378288, 0x2b66: 0x00378488, 0x2b67: 0x00378688, - 0x2b68: 0x00378888, 0x2b69: 0x00378a88, 0x2b6a: 0x00378c88, 0x2b6b: 0x00378e88, - 0x2b6c: 0x00379088, 0x2b6d: 0x00379288, 0x2b6e: 0x00379488, - 0x2b70: 0x40373820, 0x2b71: 0x40373a20, 0x2b72: 0x40373c20, 0x2b73: 0x40373e20, - 0x2b74: 0x40374020, 0x2b75: 0x40374220, 0x2b76: 0x40374420, 0x2b77: 0x40374620, - 0x2b78: 0x40374820, 0x2b79: 0x40374a20, 0x2b7a: 0x40374c20, 0x2b7b: 0x40374e20, - 0x2b7c: 0x40375020, 0x2b7d: 0x40375220, 0x2b7e: 0x40375420, 0x2b7f: 0x40375620, - // Block 0xae, offset 0x2b80 - 0x2b80: 0x40375820, 0x2b81: 0x40375a20, 0x2b82: 0x40375c20, 0x2b83: 0x40375e20, - 0x2b84: 0x40376020, 0x2b85: 0x40376220, 0x2b86: 0x40376420, 0x2b87: 0x40376620, - 0x2b88: 0x40376820, 0x2b89: 0x40376a20, 0x2b8a: 0x40376c20, 0x2b8b: 0x40376e20, - 0x2b8c: 0x40377020, 0x2b8d: 0x40377220, 0x2b8e: 0x40377420, 0x2b8f: 0x40377620, - 0x2b90: 0x40377820, 0x2b91: 0x40377a20, 0x2b92: 0x40377c20, 0x2b93: 0x40377e20, - 0x2b94: 0x40378020, 0x2b95: 0x40378220, 0x2b96: 0x40378420, 0x2b97: 0x40378620, - 0x2b98: 0x40378820, 0x2b99: 0x40378a20, 0x2b9a: 0x40378c20, 0x2b9b: 0x40378e20, - 0x2b9c: 0x40379020, 0x2b9d: 0x40379220, 0x2b9e: 0x40379420, - 0x2ba0: 0x002e4088, 0x2ba1: 0x402e4020, 0x2ba2: 0x002e4288, 0x2ba3: 0x002f3688, - 0x2ba4: 0x002fbe88, 0x2ba5: 0x402be820, 0x2ba6: 0x40303e20, 0x2ba7: 0x002d8888, - 0x2ba8: 0x402d8820, 0x2ba9: 0x002e1288, 0x2baa: 0x402e1220, 0x2bab: 0x00316088, - 0x2bac: 0x40316020, 0x2bad: 0x002bf888, 0x2bae: 0x002e9088, 0x2baf: 0x002bf088, - 0x2bb0: 0x002c0288, 0x2bb1: 0x4030d420, 0x2bb2: 0x0030ec88, 0x2bb3: 0x4030ec20, - 0x2bb4: 0x4030d620, 0x2bb5: 0x002d8a88, 0x2bb6: 0x402d8a20, 0x2bb7: 0x402f5420, - 0x2bb8: 0x402cac20, 0x2bb9: 0x402fb420, 0x2bba: 0x402f0e20, 0x2bbb: 0x402cb620, - 0x2bbc: 0x002dcc95, 0x2bbd: 0x0030be9d, 0x2bbe: 0x002ffc88, 0x2bbf: 0x00315888, - // Block 0xaf, offset 0x2bc0 - 0x2bc0: 0x0032aa88, 0x2bc1: 0x4032aa20, 0x2bc2: 0x0032ac88, 0x2bc3: 0x4032ac20, - 0x2bc4: 0x0032ae88, 0x2bc5: 0x4032ae20, 0x2bc6: 0x0032b088, 0x2bc7: 0x4032b020, - 0x2bc8: 0x0032b288, 0x2bc9: 0x4032b220, 0x2bca: 0x0032b688, 0x2bcb: 0x4032b620, - 0x2bcc: 0x0032b888, 0x2bcd: 0x4032b820, 0x2bce: 0x0032ba88, 0x2bcf: 0x4032ba20, - 0x2bd0: 0x0032bc88, 0x2bd1: 0x4032bc20, 0x2bd2: 0x0032be88, 0x2bd3: 0x4032be20, - 0x2bd4: 0x0032c088, 0x2bd5: 0x4032c020, 0x2bd6: 0x0032c488, 0x2bd7: 0x4032c420, - 0x2bd8: 0x0032c688, 0x2bd9: 0x4032c620, 0x2bda: 0x0032c888, 0x2bdb: 0x4032c820, - 0x2bdc: 0x0032ce88, 0x2bdd: 0x4032ce20, 0x2bde: 0x0032d088, 0x2bdf: 0x4032d020, - 0x2be0: 0x0032d288, 0x2be1: 0x4032d220, 0x2be2: 0x0032d488, 0x2be3: 0x4032d420, - 0x2be4: 0x0032d688, 0x2be5: 0x4032d620, 0x2be6: 0x0032d888, 0x2be7: 0x4032d820, - 0x2be8: 0x0032da88, 0x2be9: 0x4032da20, 0x2bea: 0x0032dc88, 0x2beb: 0x4032dc20, - 0x2bec: 0x0032de88, 0x2bed: 0x4032de20, 0x2bee: 0x0032e088, 0x2bef: 0x4032e020, - 0x2bf0: 0x0032e288, 0x2bf1: 0x4032e220, 0x2bf2: 0x00331888, 0x2bf3: 0x40331820, - 0x2bf4: 0x00331a88, 0x2bf5: 0x40331a20, 0x2bf6: 0x0032b488, 0x2bf7: 0x4032b420, - 0x2bf8: 0x0032c288, 0x2bf9: 0x4032c220, 0x2bfa: 0x0032ca88, 0x2bfb: 0x4032ca20, - 0x2bfc: 0x0032cc88, 0x2bfd: 0x4032cc20, 0x2bfe: 0x0032e488, 0x2bff: 0x4032e420, - // Block 0xb0, offset 0x2c00 - 0x2c00: 0x0032e688, 0x2c01: 0x4032e620, 0x2c02: 0x0032ec88, 0x2c03: 0x4032ec20, - 0x2c04: 0x0032ee88, 0x2c05: 0x4032ee20, 0x2c06: 0x0032f088, 0x2c07: 0x4032f020, - 0x2c08: 0x0032f888, 0x2c09: 0x4032f820, 0x2c0a: 0x0032fc88, 0x2c0b: 0x4032fc20, - 0x2c0c: 0x0032fe88, 0x2c0d: 0x4032fe20, 0x2c0e: 0x00330088, 0x2c0f: 0x40330020, - 0x2c10: 0x00330288, 0x2c11: 0x40330220, 0x2c12: 0x00330488, 0x2c13: 0x40330420, - 0x2c14: 0x00330688, 0x2c15: 0x40330620, 0x2c16: 0x00330c88, 0x2c17: 0x40330c20, - 0x2c18: 0x00331088, 0x2c19: 0x40331020, 0x2c1a: 0x00331288, 0x2c1b: 0x40331220, - 0x2c1c: 0x00331488, 0x2c1d: 0x40331420, 0x2c1e: 0x00331c88, 0x2c1f: 0x40331c20, - 0x2c20: 0x00331e88, 0x2c21: 0x40331e20, 0x2c22: 0x00332088, 0x2c23: 0x40332020, - 0x2c24: 0xe00014b0, 0x2c25: 0x40173a20, 0x2c26: 0x40173c20, 0x2c27: 0x40173e20, - 0x2c28: 0x40174020, 0x2c29: 0x40174220, 0x2c2a: 0x40174420, 0x2c2b: 0x0032ea88, - 0x2c2c: 0x4032ea20, 0x2c2d: 0x00330a88, 0x2c2e: 0x40330a20, 0x2c2f: 0xae605f02, - 0x2c30: 0xae602a02, 0x2c31: 0xae602202, 0x2c32: 0x0032f688, 0x2c33: 0x4032f620, - 0x2c39: 0x4002f820, 0x2c3a: 0x4002d420, 0x2c3b: 0x4002d620, - 0x2c3c: 0x4003b620, 0x2c3d: 0x4028b420, 0x2c3e: 0x4002fa20, 0x2c3f: 0x4003b820, - // Block 0xb1, offset 0x2c40 - 0x2c40: 0x40379820, 0x2c41: 0x40379c20, 0x2c42: 0x4037a020, 0x2c43: 0x4037a420, - 0x2c44: 0x4037a820, 0x2c45: 0x4037ac20, 0x2c46: 0x4037b020, 0x2c47: 0x4037b820, - 0x2c48: 0x4037bc20, 0x2c49: 0x4037c020, 0x2c4a: 0x4037c420, 0x2c4b: 0x4037c820, - 0x2c4c: 0x4037cc20, 0x2c4d: 0x4037d420, 0x2c4e: 0x4037d820, 0x2c4f: 0x4037dc20, - 0x2c50: 0x4037e020, 0x2c51: 0x4037e420, 0x2c52: 0x4037e820, 0x2c53: 0x4037f020, - 0x2c54: 0x4037f420, 0x2c55: 0x4037f820, 0x2c56: 0x4037fc20, 0x2c57: 0x40380020, - 0x2c58: 0x40380420, 0x2c59: 0x40380820, 0x2c5a: 0x40380c20, 0x2c5b: 0x40381020, - 0x2c5c: 0x40381420, 0x2c5d: 0x40381820, 0x2c5e: 0x40381c20, 0x2c5f: 0x40382420, - 0x2c60: 0x40382820, 0x2c61: 0x4037b420, 0x2c62: 0x4037d020, 0x2c63: 0x4037ec20, - 0x2c64: 0x40382020, 0x2c65: 0x40382c20, 0x2c67: 0x40383220, - 0x2c6d: 0x40383c20, - 0x2c70: 0x403bbc20, 0x2c71: 0x403bbe20, 0x2c72: 0x403bc020, 0x2c73: 0x403bc220, - 0x2c74: 0x403bc420, 0x2c75: 0x403bc620, 0x2c76: 0x403bc820, 0x2c77: 0x403bca20, - 0x2c78: 0x403bcc20, 0x2c79: 0x403bce20, 0x2c7a: 0x403bd020, 0x2c7b: 0x403bd220, - 0x2c7c: 0x403bd620, 0x2c7d: 0x403bd820, 0x2c7e: 0x403bda20, 0x2c7f: 0x403bdc20, - // Block 0xb2, offset 0x2c80 - 0x2c80: 0x403bde20, 0x2c81: 0x403be020, 0x2c82: 0x403be220, 0x2c83: 0x403be420, - 0x2c84: 0x403be620, 0x2c85: 0x403be820, 0x2c86: 0x403bea20, 0x2c87: 0x403bec20, - 0x2c88: 0x403bee20, 0x2c89: 0x403bf020, 0x2c8a: 0x403bf220, 0x2c8b: 0x403bf420, - 0x2c8c: 0x403bf620, 0x2c8d: 0x403bf820, 0x2c8e: 0x403bfa20, 0x2c8f: 0x403bfc20, - 0x2c90: 0x403bfe20, 0x2c91: 0x403c0020, 0x2c92: 0x403c0220, 0x2c93: 0x403c0420, - 0x2c94: 0x403c0820, 0x2c95: 0x403c0a20, 0x2c96: 0x403c0c20, 0x2c97: 0x403c0e20, - 0x2c98: 0x403c1020, 0x2c99: 0x403c1220, 0x2c9a: 0x403c1420, 0x2c9b: 0x403c1620, - 0x2c9c: 0x403c1820, 0x2c9d: 0x403c1a20, 0x2c9e: 0x403c1c20, 0x2c9f: 0x403c1e20, - 0x2ca0: 0x403c2020, 0x2ca1: 0x403c2220, 0x2ca2: 0x403c2420, 0x2ca3: 0x403c2620, - 0x2ca4: 0x403c2820, 0x2ca5: 0x403c2a20, 0x2ca6: 0x403bd420, 0x2ca7: 0x403c0620, - 0x2caf: 0x403c2c20, - 0x2cb0: 0x4005e620, - 0x2cbf: 0xa0900000, - // Block 0xb3, offset 0x2cc0 - 0x2cc0: 0x403c4e20, 0x2cc1: 0x403c7820, 0x2cc2: 0x403c9a20, 0x2cc3: 0x403cac20, - 0x2cc4: 0x403cca20, 0x2cc5: 0x403d1620, 0x2cc6: 0x403d3820, 0x2cc7: 0x403d4a20, - 0x2cc8: 0x403d7620, 0x2cc9: 0x403d8820, 0x2cca: 0x403d9a20, 0x2ccb: 0x403dfc20, - 0x2ccc: 0x403e3a20, 0x2ccd: 0x403e5820, 0x2cce: 0x403e6a20, 0x2ccf: 0x403eae20, - 0x2cd0: 0x403ec020, 0x2cd1: 0x403ee020, 0x2cd2: 0x403f4020, 0x2cd3: 0x403e9620, - 0x2cd4: 0x403e9820, 0x2cd5: 0x403e9a20, 0x2cd6: 0x403e9c20, - 0x2ce0: 0x403f4820, 0x2ce1: 0x403f4a20, 0x2ce2: 0x403f4c20, 0x2ce3: 0x403f4e20, - 0x2ce4: 0x403f5020, 0x2ce5: 0x403f5220, 0x2ce6: 0x403f5420, - 0x2ce8: 0x403f5620, 0x2ce9: 0x403f5820, 0x2cea: 0x403f5a20, 0x2ceb: 0x403f5c20, - 0x2cec: 0x403f5e20, 0x2ced: 0x403f6020, 0x2cee: 0x403f6220, - 0x2cf0: 0x403f6420, 0x2cf1: 0x403f6620, 0x2cf2: 0x403f6820, 0x2cf3: 0x403f6a20, - 0x2cf4: 0x403f6c20, 0x2cf5: 0x403f6e20, 0x2cf6: 0x403f7020, - 0x2cf8: 0x403f7220, 0x2cf9: 0x403f7420, 0x2cfa: 0x403f7620, 0x2cfb: 0x403f7820, - 0x2cfc: 0x403f7a20, 0x2cfd: 0x403f7c20, 0x2cfe: 0x403f7e20, - // Block 0xb4, offset 0x2d00 - 0x2d00: 0x403f8020, 0x2d01: 0x403f8220, 0x2d02: 0x403f8420, 0x2d03: 0x403f8620, - 0x2d04: 0x403f8820, 0x2d05: 0x403f8a20, 0x2d06: 0x403f8c20, - 0x2d08: 0x403f8e20, 0x2d09: 0x403f9020, 0x2d0a: 0x403f9220, 0x2d0b: 0x403f9420, - 0x2d0c: 0x403f9620, 0x2d0d: 0x403f9820, 0x2d0e: 0x403f9a20, - 0x2d10: 0x403f9c20, 0x2d11: 0x403f9e20, 0x2d12: 0x403fa020, 0x2d13: 0x403fa220, - 0x2d14: 0x403fa420, 0x2d15: 0x403fa620, 0x2d16: 0x403fa820, - 0x2d18: 0x403faa20, 0x2d19: 0x403fac20, 0x2d1a: 0x403fae20, 0x2d1b: 0x403fb020, - 0x2d1c: 0x403fb220, 0x2d1d: 0x403fb420, 0x2d1e: 0x403fb620, - 0x2d20: 0x84e619a9, 0x2d21: 0x84e619ad, 0x2d22: 0x84e619b1, 0x2d23: 0x84e619c5, - 0x2d24: 0x84e619e5, 0x2d25: 0x84e619f2, 0x2d26: 0x84e61a28, 0x2d27: 0x84e61a42, - 0x2d28: 0x84e61a54, 0x2d29: 0x84e61a5d, 0x2d2a: 0x84e61a77, 0x2d2b: 0x84e61a87, - 0x2d2c: 0x84e61a94, 0x2d2d: 0x84e61a9d, 0x2d2e: 0x84e61aa6, 0x2d2f: 0x84e61ada, - 0x2d30: 0x84e61b01, 0x2d31: 0x84e61b0c, 0x2d32: 0x84e61b2e, 0x2d33: 0x84e61b33, - 0x2d34: 0x84e61b86, 0x2d35: 0xe00014d8, 0x2d36: 0x84e61991, 0x2d37: 0x84e619d9, - 0x2d38: 0x84e61a27, 0x2d39: 0x84e61ad1, 0x2d3a: 0x84e61b4f, 0x2d3b: 0x84e61b5c, - 0x2d3c: 0x84e61b61, 0x2d3d: 0x84e61b6b, 0x2d3e: 0x84e61b70, 0x2d3f: 0x84e61b7a, - // Block 0xb5, offset 0x2d40 - 0x2d40: 0x40052620, 0x2d41: 0x40052820, 0x2d42: 0x40047420, 0x2d43: 0x40047620, - 0x2d44: 0x40047820, 0x2d45: 0x40047a20, 0x2d46: 0x40052a20, 0x2d47: 0x40052c20, - 0x2d48: 0x40052e20, 0x2d49: 0x40047c20, 0x2d4a: 0x40047e20, 0x2d4b: 0x40053020, - 0x2d4c: 0x40048020, 0x2d4d: 0x40048220, 0x2d4e: 0x40053220, 0x2d4f: 0x40053420, - 0x2d50: 0x40053620, 0x2d51: 0x40053820, 0x2d52: 0x40053a20, 0x2d53: 0x40053c20, - 0x2d54: 0x40053e20, 0x2d55: 0x40054020, 0x2d56: 0x40054220, 0x2d57: 0x40023620, - 0x2d58: 0x4002e220, 0x2d59: 0x4003ba20, 0x2d5a: 0x40054420, 0x2d5b: 0x40054620, - 0x2d5c: 0x40048420, 0x2d5d: 0x40048620, 0x2d5e: 0x40054820, 0x2d5f: 0x40054a20, - 0x2d60: 0x40048820, 0x2d61: 0x40048a20, 0x2d62: 0x40048c20, 0x2d63: 0x40048e20, - 0x2d64: 0x40049020, 0x2d65: 0x40049220, 0x2d66: 0x40049420, 0x2d67: 0x40049620, - 0x2d68: 0x40049820, 0x2d69: 0x40049a20, 0x2d6a: 0x4003ae20, 0x2d6b: 0x4003b020, - 0x2d6c: 0x4003b220, 0x2d6d: 0x4003b420, 0x2d6e: 0x4002c820, 0x2d6f: 0x40367020, - 0x2d70: 0x4002fc20, 0x2d71: 0x40030820, 0x2d72: 0x40024420, 0x2d73: 0x40030a20, - 0x2d74: 0x40024220, 0x2d75: 0x40026820, 0x2d76: 0x4004fc20, 0x2d77: 0x4004fe20, - 0x2d78: 0x40050020, 0x2d79: 0x4004d020, 0x2d7a: 0x40023020, 0x2d7b: 0x40023220, - // Block 0xb6, offset 0x2d80 - 0x2d80: 0xe0002401, 0x2d81: 0xe0002416, 0x2d82: 0x029cb684, 0x2d83: 0x029cb484, - 0x2d84: 0xe0002404, 0x2d85: 0x029d7684, 0x2d86: 0xe0002407, 0x2d87: 0xe000240a, - 0x2d88: 0xe000240d, 0x2d89: 0x02a40484, 0x2d8a: 0xe0002410, 0x2d8b: 0xe0002413, - 0x2d8c: 0xe0002419, 0x2d8d: 0xe000241c, 0x2d8e: 0xe000241f, 0x2d8f: 0x02b84684, - 0x2d90: 0x02b84484, 0x2d91: 0xe0002422, 0x2d92: 0x02bbe684, 0x2d93: 0x02bcf484, - 0x2d94: 0x02bea284, 0x2d95: 0xe0002425, 0x2d96: 0x02bf8884, 0x2d97: 0xe0002428, - 0x2d98: 0x02c49884, 0x2d99: 0x02ca6a84, 0x2d9b: 0x02cbc284, - 0x2d9c: 0xe000242b, 0x2d9d: 0xe000242e, 0x2d9e: 0xe0002436, 0x2d9f: 0x02d79a84, - 0x2da0: 0x02d82284, 0x2da1: 0x02d86a84, 0x2da2: 0x02d87484, 0x2da3: 0x02e0d884, - 0x2da4: 0x02e45684, 0x2da5: 0xe0002439, 0x2da6: 0x029c5884, 0x2da7: 0xe000243c, - 0x2da8: 0x02e55a84, 0x2da9: 0xe000243f, 0x2daa: 0xe0002442, 0x2dab: 0xe0002445, - 0x2dac: 0xe0002448, 0x2dad: 0x02f27684, 0x2dae: 0xe000244b, 0x2daf: 0x02f9f284, - 0x2db0: 0x02fd3e84, 0x2db1: 0x02fea684, 0x2db2: 0x02fea484, 0x2db3: 0xe0002451, - 0x2db4: 0xe0002454, 0x2db5: 0xe000244e, 0x2db6: 0xe0002457, 0x2db7: 0xe000245a, - 0x2db8: 0x02ff1684, 0x2db9: 0x03000484, 0x2dba: 0x03010084, 0x2dbb: 0xe000245d, - 0x2dbc: 0xe0002460, 0x2dbd: 0xe0002463, 0x2dbe: 0x0304f284, 0x2dbf: 0xe0002466, - // Block 0xb7, offset 0x2dc0 - 0x2dc0: 0xe0002469, 0x2dc1: 0x030c9c84, 0x2dc2: 0x0310c884, 0x2dc3: 0x03130084, - 0x2dc4: 0x0312fe84, 0x2dc5: 0x03138284, 0x2dc6: 0x0313a484, 0x2dc7: 0xe000246c, - 0x2dc8: 0x03174084, 0x2dc9: 0x031a3a84, 0x2dca: 0xe000246f, 0x2dcb: 0x031ecc84, - 0x2dcc: 0x031f6c84, 0x2dcd: 0xe0002472, 0x2dce: 0xe0002475, 0x2dcf: 0xe0002478, - 0x2dd0: 0x03290a84, 0x2dd1: 0x032aee84, 0x2dd2: 0x032af084, 0x2dd3: 0x032afe84, - 0x2dd4: 0x032bd084, 0x2dd5: 0xe000247b, 0x2dd6: 0x032c3a84, 0x2dd7: 0xe000247e, - 0x2dd8: 0x032ea484, 0x2dd9: 0x032fcc84, 0x2dda: 0x0330ea84, 0x2ddb: 0x03319c84, - 0x2ddc: 0x0331bc84, 0x2ddd: 0x0331be84, 0x2dde: 0xe0002481, 0x2ddf: 0x0331c084, - 0x2de0: 0x0332c684, 0x2de1: 0xe0002484, 0x2de2: 0x0334d884, 0x2de3: 0xe0002487, - 0x2de4: 0xe000248a, 0x2de5: 0x0338f884, 0x2de6: 0x033c3e84, 0x2de7: 0xe000248d, - 0x2de8: 0x033d4c84, 0x2de9: 0x033d8884, 0x2dea: 0x033dfc84, 0x2deb: 0xe0002490, - 0x2dec: 0x033ea084, 0x2ded: 0xe0002493, 0x2dee: 0x033efe84, 0x2def: 0xe0002496, - 0x2df0: 0x033f3284, 0x2df1: 0xe0002499, 0x2df2: 0xe000249c, 0x2df3: 0x033f3e84, - // Block 0xb8, offset 0x2e00 - 0x2e00: 0x029c0084, 0x2e01: 0x029c5084, 0x2e02: 0x029c6c84, 0x2e03: 0x029c7e84, - 0x2e04: 0x029cb284, 0x2e05: 0x029d0a84, 0x2e06: 0x029d1884, 0x2e07: 0x029d4084, - 0x2e08: 0x029d7484, 0x2e09: 0x02a27e84, 0x2e0a: 0x02a2ca84, 0x2e0b: 0x02a2d684, - 0x2e0c: 0x02a30484, 0x2e0d: 0x02a32c84, 0x2e0e: 0x02a35684, 0x2e0f: 0x02a3c084, - 0x2e10: 0x02a3ea84, 0x2e11: 0x02a40084, 0x2e12: 0x02a53684, 0x2e13: 0x02a5f284, - 0x2e14: 0x02a62a84, 0x2e15: 0x02a63484, 0x2e16: 0x02a67084, 0x2e17: 0x02a68284, - 0x2e18: 0x02a6b884, 0x2e19: 0x02a6d284, 0x2e1a: 0x02a70484, 0x2e1b: 0x02a76c84, - 0x2e1c: 0x02a79084, 0x2e1d: 0x02a7c684, 0x2e1e: 0x02adae84, 0x2e1f: 0x02ae3e84, - 0x2e20: 0x02b1d684, 0x2e21: 0x02b20484, 0x2e22: 0x02b21484, 0x2e23: 0x02b22a84, - 0x2e24: 0x02b24e84, 0x2e25: 0x02b2e684, 0x2e26: 0x02b6a084, 0x2e27: 0x02b70084, - 0x2e28: 0x02b7f084, 0x2e29: 0x02b81e84, 0x2e2a: 0x02b84484, 0x2e2b: 0x02b87084, - 0x2e2c: 0x02b8dc84, 0x2e2d: 0x02b8e284, 0x2e2e: 0x02bbb684, 0x2e2f: 0x02bbca84, - 0x2e30: 0x02bbe284, 0x2e31: 0x02bbfc84, 0x2e32: 0x02bce484, 0x2e33: 0x02bcf484, - 0x2e34: 0x02bcfe84, 0x2e35: 0x02bde884, 0x2e36: 0x02bdfc84, 0x2e37: 0x02be1684, - 0x2e38: 0x02be2684, 0x2e39: 0x02bea084, 0x2e3a: 0x02bec284, 0x2e3b: 0x02bee684, - 0x2e3c: 0x02bf8684, 0x2e3d: 0x02c41084, 0x2e3e: 0x02c46c84, 0x2e3f: 0x02c49684, - // Block 0xb9, offset 0x2e40 - 0x2e40: 0x02ca5e84, 0x2e41: 0x02ca6884, 0x2e42: 0x02cb0e84, 0x2e43: 0x02cb2e84, - 0x2e44: 0x02cb4884, 0x2e45: 0x02cb7284, 0x2e46: 0x02cbc084, 0x2e47: 0x02cbca84, - 0x2e48: 0x02cde084, 0x2e49: 0x02ce1084, 0x2e4a: 0x02ce5084, 0x2e4b: 0x02d64084, - 0x2e4c: 0x02d6c484, 0x2e4d: 0x02d6f284, 0x2e4e: 0x02d76684, 0x2e4f: 0x02d79684, - 0x2e50: 0x02d7a884, 0x2e51: 0x02d7b684, 0x2e52: 0x02d81e84, 0x2e53: 0x02d82884, - 0x2e54: 0x02d86884, 0x2e55: 0x02e0d684, 0x2e56: 0x02e45484, 0x2e57: 0x02e46c84, - 0x2e58: 0x02e47684, 0x2e59: 0x02e47e84, 0x2e5a: 0x02e48e84, 0x2e5b: 0x02e4b284, - 0x2e5c: 0x02e4b684, 0x2e5d: 0x02e55884, 0x2e5e: 0x02e70884, 0x2e5f: 0x02e71284, - 0x2e60: 0x02e9b884, 0x2e61: 0x02e9cc84, 0x2e62: 0x02ea3084, 0x2e63: 0x02ea3e84, - 0x2e64: 0x02ea5084, 0x2e65: 0x02ea6084, 0x2e66: 0x02eb1684, 0x2e67: 0x02eb2484, - 0x2e68: 0x02ecec84, 0x2e69: 0x02ecfa84, 0x2e6a: 0x02ed5c84, 0x2e6b: 0x02ed7e84, - 0x2e6c: 0x02eddc84, 0x2e6d: 0x02efb684, 0x2e6e: 0x02efc484, 0x2e6f: 0x02efe684, - 0x2e70: 0x02f27484, 0x2e71: 0x02f37084, 0x2e72: 0x02f37c84, 0x2e73: 0x02f4e884, - 0x2e74: 0x02f59684, 0x2e75: 0x02f5f284, 0x2e76: 0x02f8e684, 0x2e77: 0x02f9f084, - 0x2e78: 0x02fe6c84, 0x2e79: 0x02fea284, 0x2e7a: 0x02ff1484, 0x2e7b: 0x02ff7a84, - 0x2e7c: 0x03000284, 0x2e7d: 0x03001884, 0x2e7e: 0x03002484, 0x2e7f: 0x03006684, - // Block 0xba, offset 0x2e80 - 0x2e80: 0x0300fe84, 0x2e81: 0x03011284, 0x2e82: 0x0303c684, 0x2e83: 0x0303d484, - 0x2e84: 0x0303e684, 0x2e85: 0x0303f884, 0x2e86: 0x03041884, 0x2e87: 0x03043684, - 0x2e88: 0x03043e84, 0x2e89: 0x0304dc84, 0x2e8a: 0x0304e484, 0x2e8b: 0x0304f084, - 0x2e8c: 0x030c9a84, 0x2e8d: 0x030cd684, 0x2e8e: 0x03108084, 0x2e8f: 0x03109884, - 0x2e90: 0x0310c684, 0x2e91: 0x0312fc84, 0x2e92: 0x03131684, 0x2e93: 0x0313a484, - 0x2e94: 0x03140084, 0x2e95: 0x03186e84, 0x2e96: 0x03188c84, 0x2e97: 0x0318aa84, - 0x2e98: 0x0318f084, 0x2e99: 0x03193a84, 0x2e9a: 0x031ac884, 0x2e9b: 0x031ae084, - 0x2e9c: 0x031b6684, 0x2e9d: 0x031d5684, 0x2e9e: 0x031d9484, 0x2e9f: 0x031f3684, - 0x2ea0: 0x031f6084, 0x2ea1: 0x031f6a84, 0x2ea2: 0x03212284, 0x2ea3: 0x03229284, - 0x2ea4: 0x03238c84, 0x2ea5: 0x03239884, 0x2ea6: 0x0323a284, 0x2ea7: 0x032aee84, - 0x2ea8: 0x032b0084, 0x2ea9: 0x032c3884, 0x2eaa: 0x032d6c84, 0x2eab: 0x032d7284, - 0x2eac: 0x032dd084, 0x2ead: 0x032ea284, 0x2eae: 0x032ebc84, 0x2eaf: 0x032ec484, - 0x2eb0: 0x032ed284, 0x2eb1: 0x032f9684, 0x2eb2: 0x032fda84, 0x2eb3: 0x032fe684, - 0x2eb4: 0x03300284, 0x2eb5: 0x03315084, 0x2eb6: 0x0331b684, 0x2eb7: 0x0331be84, - 0x2eb8: 0x03332c84, 0x2eb9: 0x03333284, 0x2eba: 0x03335884, 0x2ebb: 0x03355084, - 0x2ebc: 0x0335b084, 0x2ebd: 0x0335be84, 0x2ebe: 0x03364a84, 0x2ebf: 0x03365e84, - // Block 0xbb, offset 0x2ec0 - 0x2ec0: 0x03366484, 0x2ec1: 0x03367884, 0x2ec2: 0x0336b484, 0x2ec3: 0x0339ca84, - 0x2ec4: 0x033cea84, 0x2ec5: 0x033cfe84, 0x2ec6: 0x033d4a84, 0x2ec7: 0x033d7684, - 0x2ec8: 0x033d8684, 0x2ec9: 0x033d9a84, 0x2eca: 0x033da284, 0x2ecb: 0x033df284, - 0x2ecc: 0x033dfa84, 0x2ecd: 0x033e1c84, 0x2ece: 0x033e2684, 0x2ecf: 0x033e4084, - 0x2ed0: 0x033e7684, 0x2ed1: 0x033e9484, 0x2ed2: 0x033ea484, 0x2ed3: 0x033f1a84, - 0x2ed4: 0x033f3884, 0x2ed5: 0x033f4084, - 0x2ef0: 0x40273a20, 0x2ef1: 0x40273c20, 0x2ef2: 0x40273e20, 0x2ef3: 0x40274020, - 0x2ef4: 0x40274220, 0x2ef5: 0x40274420, 0x2ef6: 0x40274620, 0x2ef7: 0x40274820, - 0x2ef8: 0x40274a20, 0x2ef9: 0x40274c20, 0x2efa: 0x40274e20, 0x2efb: 0x40275020, - // Block 0xbc, offset 0x2f00 - 0x2f00: 0x00021283, 0x2f01: 0x40025c20, 0x2f02: 0x40030420, 0x2f03: 0x40051220, - 0x2f04: 0x40279a20, 0x2f05: 0x4027ca20, 0x2f06: 0xe0002206, 0x2f07: 0xe00001d3, - 0x2f08: 0x40049c20, 0x2f09: 0x40049e20, 0x2f0a: 0x4004a020, 0x2f0b: 0x4004a220, - 0x2f0c: 0x4004a420, 0x2f0d: 0x4004a620, 0x2f0e: 0x4004a820, 0x2f0f: 0x4004aa20, - 0x2f10: 0x4004ac20, 0x2f11: 0x4004ae20, 0x2f12: 0x40279c20, 0x2f13: 0x40279e20, - 0x2f14: 0x4004b020, 0x2f15: 0x4004b220, 0x2f16: 0x4004b420, 0x2f17: 0x4004b620, - 0x2f18: 0x4004b820, 0x2f19: 0x4004ba20, 0x2f1a: 0x4004bc20, 0x2f1b: 0x4004be20, - 0x2f1c: 0x40023820, 0x2f1d: 0x4003ea20, 0x2f1e: 0x4003ec20, 0x2f1f: 0x4003ee20, - 0x2f20: 0x4027a020, 0x2f21: 0xe0000267, 0x2f22: 0xe000037f, 0x2f23: 0xe0000459, - 0x2f24: 0xe000052e, 0x2f25: 0xe00005f8, 0x2f26: 0xe00006c3, 0x2f27: 0xe000076b, - 0x2f28: 0xe0000817, 0x2f29: 0xe00008bc, 0x2f2a: 0xada12202, 0x2f2b: 0xae412302, - 0x2f2c: 0xae812402, 0x2f2d: 0xade12502, 0x2f2e: 0xae012602, 0x2f2f: 0xae012702, - 0x2f30: 0x40023a20, 0x2f31: 0x4027ce20, 0x2f32: 0xe0000152, 0x2f33: 0x4027d020, - 0x2f34: 0xe0000155, 0x2f35: 0x4027d220, 0x2f36: 0x00279c84, 0x2f37: 0x4027a220, - 0x2f38: 0x02a68284, 0x2f39: 0x02a68884, 0x2f3a: 0x02a68a84, 0x2f3b: 0x4027cc20, - 0x2f3c: 0xe000231a, 0x2f3d: 0x40051420, 0x2f3e: 0x4027a420, 0x2f3f: 0x4027a620, - // Block 0xbd, offset 0x2f40 - 0x2f41: 0x0065768d, 0x2f42: 0x0065768e, 0x2f43: 0x0065788d, - 0x2f44: 0x0065788e, 0x2f45: 0x00657a8d, 0x2f46: 0x00657a8e, 0x2f47: 0x00657e8d, - 0x2f48: 0x00657e8e, 0x2f49: 0x0065808d, 0x2f4a: 0x0065808e, 0x2f4b: 0x0065828e, - 0x2f4c: 0xe000216a, 0x2f4d: 0x0065848e, 0x2f4e: 0xe0002188, 0x2f4f: 0x0065868e, - 0x2f50: 0xe00021b8, 0x2f51: 0x0065888e, 0x2f52: 0xe00021d6, 0x2f53: 0x00658a8e, - 0x2f54: 0xe00021e0, 0x2f55: 0x00658c8e, 0x2f56: 0xe00021ef, 0x2f57: 0x00658e8e, - 0x2f58: 0xe0002200, 0x2f59: 0x0065908e, 0x2f5a: 0xe000220f, 0x2f5b: 0x0065928e, - 0x2f5c: 0xe0002215, 0x2f5d: 0x0065948e, 0x2f5e: 0xe0002223, 0x2f5f: 0x0065968e, - 0x2f60: 0xe0002229, 0x2f61: 0x0065988e, 0x2f62: 0xe0002234, 0x2f63: 0x00659a8d, - 0x2f64: 0x00659a8e, 0x2f65: 0xe000223a, 0x2f66: 0x00659c8e, 0x2f67: 0xe0002240, - 0x2f68: 0x00659e8e, 0x2f69: 0xe000224a, 0x2f6a: 0x0065a08e, 0x2f6b: 0x0065a28e, - 0x2f6c: 0x0065a48e, 0x2f6d: 0x0065a68e, 0x2f6e: 0x0065a88e, 0x2f6f: 0x0065aa8e, - 0x2f70: 0xe0002258, 0x2f71: 0xe000225e, 0x2f72: 0x0065ac8e, 0x2f73: 0xe000227a, - 0x2f74: 0xe0002280, 0x2f75: 0x0065ae8e, 0x2f76: 0xe000229a, 0x2f77: 0xe00022a0, - 0x2f78: 0x0065b08e, 0x2f79: 0xe00022bd, 0x2f7a: 0xe00022c3, 0x2f7b: 0x0065b28e, - 0x2f7c: 0xe00022ec, 0x2f7d: 0xe00022f2, 0x2f7e: 0x0065b48e, 0x2f7f: 0x0065b68e, - // Block 0xbe, offset 0x2f80 - 0x2f80: 0x0065b88e, 0x2f81: 0x0065ba8e, 0x2f82: 0x0065bc8e, 0x2f83: 0x0065be8d, - 0x2f84: 0x0065be8e, 0x2f85: 0x0065c08d, 0x2f86: 0x0065c08e, 0x2f87: 0x0065c48d, - 0x2f88: 0x0065c48e, 0x2f89: 0x0065c68e, 0x2f8a: 0x0065c88e, 0x2f8b: 0x0065ca8e, - 0x2f8c: 0x0065cc8e, 0x2f8d: 0x0065ce8e, 0x2f8e: 0x0065d08d, 0x2f8f: 0x0065d08e, - 0x2f90: 0x0065d28e, 0x2f91: 0x0065d48e, 0x2f92: 0x0065d68e, 0x2f93: 0x0065d88e, - 0x2f94: 0xe000214c, 0x2f95: 0x0065828d, 0x2f96: 0x0065888d, - 0x2f99: 0xa0812802, 0x2f9a: 0xa0812902, 0x2f9b: 0x40063c20, - 0x2f9c: 0x40063e20, 0x2f9d: 0x4027d420, 0x2f9e: 0xe0000158, 0x2f9f: 0xf0001616, - 0x2fa0: 0x40023c20, 0x2fa1: 0x0065768f, 0x2fa2: 0x00657691, 0x2fa3: 0x0065788f, - 0x2fa4: 0x00657891, 0x2fa5: 0x00657a8f, 0x2fa6: 0x00657a91, 0x2fa7: 0x00657e8f, - 0x2fa8: 0x00657e91, 0x2fa9: 0x0065808f, 0x2faa: 0x00658091, 0x2fab: 0x00658291, - 0x2fac: 0xe000216d, 0x2fad: 0x00658491, 0x2fae: 0xe000218b, 0x2faf: 0x00658691, - 0x2fb0: 0xe00021bb, 0x2fb1: 0x00658891, 0x2fb2: 0xe00021d9, 0x2fb3: 0x00658a91, - 0x2fb4: 0xe00021e3, 0x2fb5: 0x00658c91, 0x2fb6: 0xe00021f2, 0x2fb7: 0x00658e91, - 0x2fb8: 0xe0002203, 0x2fb9: 0x00659091, 0x2fba: 0xe0002212, 0x2fbb: 0x00659291, - 0x2fbc: 0xe0002218, 0x2fbd: 0x00659491, 0x2fbe: 0xe0002226, 0x2fbf: 0x00659691, - // Block 0xbf, offset 0x2fc0 - 0x2fc0: 0xe000222c, 0x2fc1: 0x00659891, 0x2fc2: 0xe0002237, 0x2fc3: 0x00659a8f, - 0x2fc4: 0x00659a91, 0x2fc5: 0xe000223d, 0x2fc6: 0x00659c91, 0x2fc7: 0xe0002243, - 0x2fc8: 0x00659e91, 0x2fc9: 0xe000224d, 0x2fca: 0x0065a091, 0x2fcb: 0x0065a291, - 0x2fcc: 0x0065a491, 0x2fcd: 0x0065a691, 0x2fce: 0x0065a891, 0x2fcf: 0x0065aa91, - 0x2fd0: 0xe000225b, 0x2fd1: 0xe0002261, 0x2fd2: 0x0065ac91, 0x2fd3: 0xe000227d, - 0x2fd4: 0xe0002283, 0x2fd5: 0x0065ae91, 0x2fd6: 0xe000229d, 0x2fd7: 0xe00022a3, - 0x2fd8: 0x0065b091, 0x2fd9: 0xe00022c0, 0x2fda: 0xe00022c6, 0x2fdb: 0x0065b291, - 0x2fdc: 0xe00022ef, 0x2fdd: 0xe00022f5, 0x2fde: 0x0065b491, 0x2fdf: 0x0065b691, - 0x2fe0: 0x0065b891, 0x2fe1: 0x0065ba91, 0x2fe2: 0x0065bc91, 0x2fe3: 0x0065be8f, - 0x2fe4: 0x0065be91, 0x2fe5: 0x0065c08f, 0x2fe6: 0x0065c091, 0x2fe7: 0x0065c48f, - 0x2fe8: 0x0065c491, 0x2fe9: 0x0065c691, 0x2fea: 0x0065c891, 0x2feb: 0x0065ca91, - 0x2fec: 0x0065cc91, 0x2fed: 0x0065ce91, 0x2fee: 0x0065d08f, 0x2fef: 0x0065d091, - 0x2ff0: 0x0065d291, 0x2ff1: 0x0065d491, 0x2ff2: 0x0065d691, 0x2ff3: 0x0065d891, - 0x2ff4: 0xe000214f, 0x2ff5: 0x0065828f, 0x2ff6: 0x0065888f, 0x2ff7: 0xe000236a, - 0x2ff8: 0xe0002371, 0x2ff9: 0xe0002374, 0x2ffa: 0xe0002377, 0x2ffb: 0x40023e20, - 0x2ffc: 0x4027d620, 0x2ffd: 0x4027d820, 0x2ffe: 0xe000015b, 0x2fff: 0xf0001616, - // Block 0xc0, offset 0x3000 - 0x3005: 0x4065da20, 0x3006: 0x4065dc20, 0x3007: 0x4065de20, - 0x3008: 0x4065e020, 0x3009: 0x4065e420, 0x300a: 0x4065e620, 0x300b: 0x4065e820, - 0x300c: 0x4065ea20, 0x300d: 0x4065ec20, 0x300e: 0x4065ee20, 0x300f: 0x4065f420, - 0x3010: 0x4065f620, 0x3011: 0x4065f820, 0x3012: 0x4065fa20, 0x3013: 0x4065fe20, - 0x3014: 0x40660020, 0x3015: 0x40660220, 0x3016: 0x40660420, 0x3017: 0x40660620, - 0x3018: 0x40660820, 0x3019: 0x40660a20, 0x301a: 0x40661220, 0x301b: 0x40661420, - 0x301c: 0x40661820, 0x301d: 0x40661a20, 0x301e: 0x40661e20, 0x301f: 0x40662020, - 0x3020: 0x40662220, 0x3021: 0x40662420, 0x3022: 0x40662620, 0x3023: 0x40662820, - 0x3024: 0x40662a20, 0x3025: 0x40662e20, 0x3026: 0x40663620, 0x3027: 0x40663820, - 0x3028: 0x40663a20, 0x3029: 0x40663c20, 0x302a: 0x4065e220, 0x302b: 0x4065f020, - 0x302c: 0x4065fc20, 0x302d: 0x40663e20, - 0x3031: 0x0062ac84, 0x3032: 0x0062ae84, 0x3033: 0x00646884, - 0x3034: 0x0062b084, 0x3035: 0x00646c84, 0x3036: 0x00646e84, 0x3037: 0x0062b284, - 0x3038: 0x0062b484, 0x3039: 0x0062b684, 0x303a: 0x00647484, 0x303b: 0x00647684, - 0x303c: 0x00647884, 0x303d: 0x00647a84, 0x303e: 0x00647c84, 0x303f: 0x00647e84, - // Block 0xc1, offset 0x3040 - 0x3040: 0x0062e084, 0x3041: 0x0062b884, 0x3042: 0x0062ba84, 0x3043: 0x0062bc84, - 0x3044: 0x0062ee84, 0x3045: 0x0062be84, 0x3046: 0x0062c084, 0x3047: 0x0062c284, - 0x3048: 0x0062c484, 0x3049: 0x0062c684, 0x304a: 0x0062c884, 0x304b: 0x0062ca84, - 0x304c: 0x0062cc84, 0x304d: 0x0062ce84, 0x304e: 0x0062d084, 0x304f: 0x0063a884, - 0x3050: 0x0063aa84, 0x3051: 0x0063ac84, 0x3052: 0x0063ae84, 0x3053: 0x0063b084, - 0x3054: 0x0063b284, 0x3055: 0x0063b484, 0x3056: 0x0063b684, 0x3057: 0x0063b884, - 0x3058: 0x0063ba84, 0x3059: 0x0063bc84, 0x305a: 0x0063be84, 0x305b: 0x0063c084, - 0x305c: 0x0063c284, 0x305d: 0x0063c484, 0x305e: 0x0063c684, 0x305f: 0x0063c884, - 0x3060: 0x0063ca84, 0x3061: 0x0063cc84, 0x3062: 0x0063ce84, 0x3063: 0x0063d084, - 0x3064: 0x0063a684, 0x3065: 0x0062d484, 0x3066: 0x0062d684, 0x3067: 0x0064a284, - 0x3068: 0x0064a484, 0x3069: 0x0064ac84, 0x306a: 0x0064b084, 0x306b: 0x0064ba84, - 0x306c: 0x0064c284, 0x306d: 0x0064c684, 0x306e: 0x0062e484, 0x306f: 0x0064ce84, - 0x3070: 0x0064d284, 0x3071: 0x0062e684, 0x3072: 0x0062e884, 0x3073: 0x0062ec84, - 0x3074: 0x0062f084, 0x3075: 0x0062f284, 0x3076: 0x0062fa84, 0x3077: 0x0062fe84, - 0x3078: 0x00630284, 0x3079: 0x00630484, 0x307a: 0x00630684, 0x307b: 0x00630884, - 0x307c: 0x00630a84, 0x307d: 0x00631084, 0x307e: 0x00631884, 0x307f: 0x00632c84, - // Block 0xc2, offset 0x3080 - 0x3080: 0x00633a84, 0x3081: 0x00634484, 0x3082: 0x0064f684, 0x3083: 0x0064f884, - 0x3084: 0x00635a84, 0x3085: 0x00635c84, 0x3086: 0x00635e84, 0x3087: 0x0063ee84, - 0x3088: 0x0063f084, 0x3089: 0x0063f684, 0x308a: 0x00640884, 0x308b: 0x00640a84, - 0x308c: 0x00640e84, 0x308d: 0x00642284, 0x308e: 0x00642884, - 0x3090: 0x4027a820, 0x3091: 0x4027aa20, 0x3092: 0x029c0094, 0x3093: 0x029d1894, - 0x3094: 0x029c1294, 0x3095: 0x02adb694, 0x3096: 0x029c1494, 0x3097: 0x029c5a94, - 0x3098: 0x029c1694, 0x3099: 0x02ea6494, 0x309a: 0x029cb294, 0x309b: 0x029c3294, - 0x309c: 0x029c0294, 0x309d: 0x02b25294, 0x309e: 0x02ae6094, 0x309f: 0x029d7494, - 0x30a0: 0xe000237a, 0x30a1: 0xe0002383, 0x30a2: 0xe0002380, 0x30a3: 0xe000237d, - 0x30a4: 0x40661c20, 0x30a5: 0xe000238c, 0x30a6: 0x40661620, 0x30a7: 0xe0002389, - 0x30a8: 0xe000239e, 0x30a9: 0xe0002386, 0x30aa: 0xe0002395, 0x30ab: 0xe000239b, - 0x30ac: 0x40663420, 0x30ad: 0x4065f220, 0x30ae: 0xe000238f, 0x30af: 0xe0002392, - 0x30b0: 0x40663020, 0x30b1: 0x40663220, 0x30b2: 0x40662c20, 0x30b3: 0xe0002398, - 0x30b4: 0x0065dc99, 0x30b5: 0x0065e699, 0x30b6: 0x0065ee99, 0x30b7: 0x0065f499, - 0x30b8: 0x40660c20, 0x30b9: 0x40660e20, 0x30ba: 0x40661020, - // Block 0xc3, offset 0x30c0 - 0x30c0: 0x40275220, 0x30c1: 0x40275420, 0x30c2: 0x40275620, 0x30c3: 0x40275820, - 0x30c4: 0x40275a20, 0x30c5: 0x40275c20, 0x30c6: 0x40275e20, 0x30c7: 0x40276020, - 0x30c8: 0x40276220, 0x30c9: 0x40276420, 0x30ca: 0x40276620, 0x30cb: 0x40276820, - 0x30cc: 0x40276a20, 0x30cd: 0x40276c20, 0x30ce: 0x40276e20, 0x30cf: 0x40277020, - 0x30d0: 0x40277220, 0x30d1: 0x40277420, 0x30d2: 0x40277620, 0x30d3: 0x40277820, - 0x30d4: 0x40277a20, 0x30d5: 0x40277c20, 0x30d6: 0x40277e20, 0x30d7: 0x40278020, - 0x30d8: 0x40278220, 0x30d9: 0x40278420, 0x30da: 0x40278620, 0x30db: 0x40278820, - 0x30dc: 0x40278a20, 0x30dd: 0x40278c20, 0x30de: 0x40278e20, 0x30df: 0x40279020, - 0x30e0: 0x40279220, 0x30e1: 0x40279420, 0x30e2: 0x40279620, 0x30e3: 0x40279820, - 0x30f0: 0x0065868f, 0x30f1: 0x00658e8f, 0x30f2: 0x0065908f, 0x30f3: 0x00659e8f, - 0x30f4: 0x0065a48f, 0x30f5: 0x0065aa8f, 0x30f6: 0x0065ac8f, 0x30f7: 0x0065ae8f, - 0x30f8: 0x0065b08f, 0x30f9: 0x0065b28f, 0x30fa: 0x0065b88f, 0x30fb: 0x0065c68f, - 0x30fc: 0x0065c88f, 0x30fd: 0x0065ca8f, 0x30fe: 0x0065cc8f, 0x30ff: 0x0065ce8f, - // Block 0xc4, offset 0x3100 - 0x3100: 0xf0000404, 0x3101: 0xf0000404, 0x3102: 0xf0000404, 0x3103: 0xf0000404, - 0x3104: 0xf0000404, 0x3105: 0xf0000404, 0x3106: 0xf0000404, 0x3107: 0xf0000404, - 0x3108: 0xf0000404, 0x3109: 0xf0000404, 0x310a: 0xf0000404, 0x310b: 0xf0000404, - 0x310c: 0xf0000404, 0x310d: 0xf0000404, 0x310e: 0xe000004c, 0x310f: 0xe0000051, - 0x3110: 0xe0000056, 0x3111: 0xe000005b, 0x3112: 0xe0000060, 0x3113: 0xe0000065, - 0x3114: 0xe000006a, 0x3115: 0xe000006f, 0x3116: 0xe0000083, 0x3117: 0xe000008d, - 0x3118: 0xe0000092, 0x3119: 0xe0000097, 0x311a: 0xe000009c, 0x311b: 0xe00000a1, - 0x311c: 0xe0000088, 0x311d: 0xe0000074, 0x311e: 0xe000007c, - 0x3120: 0xf0000404, 0x3121: 0xf0000404, 0x3122: 0xf0000404, 0x3123: 0xf0000404, - 0x3124: 0xf0000404, 0x3125: 0xf0000404, 0x3126: 0xf0000404, 0x3127: 0xf0000404, - 0x3128: 0xf0000404, 0x3129: 0xf0000404, 0x312a: 0xf0000404, 0x312b: 0xf0000404, - 0x312c: 0xf0000404, 0x312d: 0xf0000404, 0x312e: 0xf0000404, 0x312f: 0xf0000404, - 0x3130: 0xf0000404, 0x3131: 0xf0000404, 0x3132: 0xf0000404, 0x3133: 0xf0000404, - 0x3134: 0xf0000404, 0x3135: 0xf0000404, 0x3136: 0xf0000404, 0x3137: 0xf0000404, - 0x3138: 0xf0000404, 0x3139: 0xf0000404, 0x313a: 0xf0000404, 0x313b: 0xf0000404, - 0x313c: 0xf0000404, 0x313d: 0xf0000404, 0x313e: 0xf0000404, 0x313f: 0xf0000404, - // Block 0xc5, offset 0x3140 - 0x3140: 0xf0000404, 0x3141: 0xf0000404, 0x3142: 0xf0000404, 0x3143: 0xf0000404, - 0x3144: 0x02aa9e86, 0x3145: 0x02bcf886, 0x3146: 0x02cb0e86, 0x3147: 0x02f71e86, - 0x3148: 0xe00002e3, 0x3149: 0xe00003d8, 0x314a: 0xe00004b3, 0x314b: 0xe000057d, - 0x314c: 0xe0000648, 0x314d: 0xe00006f0, 0x314e: 0xe000079c, 0x314f: 0xe0000841, - 0x3150: 0xe0000ec0, 0x3151: 0xf0000606, 0x3152: 0xf0000606, 0x3153: 0xf0000606, - 0x3154: 0xf0000606, 0x3155: 0xf0000606, 0x3156: 0xf0000606, 0x3157: 0xf0000606, - 0x3158: 0xf0000606, 0x3159: 0xf0000606, 0x315a: 0xf0000606, 0x315b: 0xf0000606, - 0x315c: 0xf0000606, 0x315d: 0xf0000606, 0x315e: 0xf0000606, 0x315f: 0xf0000606, - 0x3160: 0x0062ac86, 0x3161: 0x0062b086, 0x3162: 0x0062b286, 0x3163: 0x0062b686, - 0x3164: 0x0062b886, 0x3165: 0x0062ba86, 0x3166: 0x0062be86, 0x3167: 0x0062c286, - 0x3168: 0x0062c486, 0x3169: 0x0062c886, 0x316a: 0x0062ca86, 0x316b: 0x0062cc86, - 0x316c: 0x0062ce86, 0x316d: 0x0062d086, 0x316e: 0xf0000606, 0x316f: 0xf0000606, - 0x3170: 0xf0000606, 0x3171: 0xf0000606, 0x3172: 0xf0000606, 0x3173: 0xf0000606, - 0x3174: 0xf0000606, 0x3175: 0xf0000606, 0x3176: 0xf0000606, 0x3177: 0xf0000606, - 0x3178: 0xf0000606, 0x3179: 0xf0000606, 0x317a: 0xf0000606, 0x317b: 0xf0000606, - 0x317c: 0xe0002127, 0x317d: 0xe0002122, 0x317e: 0xf0000606, 0x317f: 0x4027ac20, - // Block 0xc6, offset 0x3180 - 0x3180: 0x029c0086, 0x3181: 0x029d1886, 0x3182: 0x029c1286, 0x3183: 0x02adb686, - 0x3184: 0x029d2886, 0x3185: 0x02a2da86, 0x3186: 0x029c0686, 0x3187: 0x02a2d686, - 0x3188: 0x029cba86, 0x3189: 0x02a68286, 0x318a: 0x02ce1086, 0x318b: 0x02e0d686, - 0x318c: 0x02d86886, 0x318d: 0x02ce5086, 0x318e: 0x0323a286, 0x318f: 0x02ae3e86, - 0x3190: 0x02cbca86, 0x3191: 0x02d05486, 0x3192: 0x02ce1286, 0x3193: 0x02f27c86, - 0x3194: 0x02a81a86, 0x3195: 0x02e4f286, 0x3196: 0x03194286, 0x3197: 0x02f2ba86, - 0x3198: 0x02a56886, 0x3199: 0x02f3b086, 0x319a: 0x02ea6e86, 0x319b: 0x02b2e686, - 0x319c: 0x0320d286, 0x319d: 0x02a25486, 0x319e: 0x02a6e086, 0x319f: 0x02d9d086, - 0x31a0: 0x03300a86, 0x31a1: 0x029e2286, 0x31a2: 0x02a33286, 0x31a3: 0x02d6c686, - 0x31a4: 0x029c1486, 0x31a5: 0x029c5a86, 0x31a6: 0x029c1686, 0x31a7: 0x02bbcc86, - 0x31a8: 0x02a7e686, 0x31a9: 0x02a67686, 0x31aa: 0x02b72e86, 0x31ab: 0x02b6cc86, - 0x31ac: 0x02edc686, 0x31ad: 0x029e0286, 0x31ae: 0x03198e86, 0x31af: 0x02a6a886, - 0x31b0: 0x02b23886, 0x31b1: 0xf0000606, 0x31b2: 0xf0000606, 0x31b3: 0xf0000606, - 0x31b4: 0xf0000606, 0x31b5: 0xf0000606, 0x31b6: 0xf0000606, 0x31b7: 0xf0000606, - 0x31b8: 0xf0000606, 0x31b9: 0xf0000606, 0x31ba: 0xf0000606, 0x31bb: 0xf0000606, - 0x31bc: 0xf0000606, 0x31bd: 0xf0000606, 0x31be: 0xf0000606, 0x31bf: 0xf0000606, - // Block 0xc7, offset 0x31c0 - 0x31c0: 0xf0001f04, 0x31c1: 0xf0001f04, 0x31c2: 0xf0001f04, 0x31c3: 0xf0001f04, - 0x31c4: 0xf0001f04, 0x31c5: 0xf0001f04, 0x31c6: 0xf0001f04, 0x31c7: 0xf0001f04, - 0x31c8: 0xf0001f04, 0x31c9: 0xf0000404, 0x31ca: 0xf0000404, 0x31cb: 0xf0000404, - 0x31cc: 0xf0001c1d, 0x31cd: 0xe0000b85, 0x31ce: 0xf0001d1c, 0x31cf: 0xe0000d14, - 0x31d0: 0x00657693, 0x31d1: 0x00657893, 0x31d2: 0x00657a93, 0x31d3: 0x00657e93, - 0x31d4: 0x00658093, 0x31d5: 0x00658293, 0x31d6: 0x00658493, 0x31d7: 0x00658693, - 0x31d8: 0x00658893, 0x31d9: 0x00658a93, 0x31da: 0x00658c93, 0x31db: 0x00658e93, - 0x31dc: 0x00659093, 0x31dd: 0x00659293, 0x31de: 0x00659493, 0x31df: 0x00659693, - 0x31e0: 0x00659893, 0x31e1: 0x00659a93, 0x31e2: 0x00659c93, 0x31e3: 0x00659e93, - 0x31e4: 0x0065a093, 0x31e5: 0x0065a293, 0x31e6: 0x0065a493, 0x31e7: 0x0065a693, - 0x31e8: 0x0065a893, 0x31e9: 0x0065aa93, 0x31ea: 0x0065ac93, 0x31eb: 0x0065ae93, - 0x31ec: 0x0065b093, 0x31ed: 0x0065b293, 0x31ee: 0x0065b493, 0x31ef: 0x0065b693, - 0x31f0: 0x0065b893, 0x31f1: 0x0065ba93, 0x31f2: 0x0065bc93, 0x31f3: 0x0065be93, - 0x31f4: 0x0065c093, 0x31f5: 0x0065c493, 0x31f6: 0x0065c693, 0x31f7: 0x0065c893, - 0x31f8: 0x0065ca93, 0x31f9: 0x0065cc93, 0x31fa: 0x0065ce93, 0x31fb: 0x0065d093, - 0x31fc: 0x0065d293, 0x31fd: 0x0065d493, 0x31fe: 0x0065d693, - // Block 0xc8, offset 0x3200 - 0x3200: 0xe0002131, 0x3201: 0xe0002137, 0x3202: 0xe000213c, 0x3203: 0xe000212d, - 0x3204: 0xe0002142, 0x3205: 0xe0002148, 0x3206: 0xe0002152, 0x3207: 0xe000215b, - 0x3208: 0xe0002156, 0x3209: 0xe0002166, 0x320a: 0xe0002162, 0x320b: 0xe0002170, - 0x320c: 0xe0002174, 0x320d: 0xe0002179, 0x320e: 0xe000217e, 0x320f: 0xe0002183, - 0x3210: 0xe000218e, 0x3211: 0xe0002193, 0x3212: 0xe0002198, 0x3213: 0xe000219d, - 0x3214: 0xf0001c1c, 0x3215: 0xe00021a4, 0x3216: 0xe00021ab, 0x3217: 0xe00021b2, - 0x3218: 0xe00021be, 0x3219: 0xe00021c3, 0x321a: 0xe00021ca, 0x321b: 0xe00021d1, - 0x321c: 0xe00021dc, 0x321d: 0xe00021eb, 0x321e: 0xe00021e6, 0x321f: 0xe00021f5, - 0x3220: 0xe00021fa, 0x3221: 0xe0002209, 0x3222: 0xe000221b, 0x3223: 0xe000221f, - 0x3224: 0xe000222f, 0x3225: 0xe0002246, 0x3226: 0xe0002250, 0x3227: 0xf0001c1c, - 0x3228: 0xf0001c1c, 0x3229: 0xe0002254, 0x322a: 0xe0002276, 0x322b: 0xe0002264, - 0x322c: 0xe000226b, 0x322d: 0xe0002270, 0x322e: 0xe0002286, 0x322f: 0xe000228d, - 0x3230: 0xe0002292, 0x3231: 0xe0002296, 0x3232: 0xe00022a6, 0x3233: 0xe00022ad, - 0x3234: 0xe00022b2, 0x3235: 0xe00022b9, 0x3236: 0xe00022d4, 0x3237: 0xe00022da, - 0x3238: 0xe00022de, 0x3239: 0xe00022e3, 0x323a: 0xe00022e7, 0x323b: 0xe00022c9, - 0x323c: 0xe00022cf, 0x323d: 0xe0002300, 0x323e: 0xe0002306, 0x323f: 0xf0001c1c, - // Block 0xc9, offset 0x3240 - 0x3240: 0xe000230b, 0x3241: 0xe00022f8, 0x3242: 0xe00022fc, 0x3243: 0xe0002311, - 0x3244: 0xe0002316, 0x3245: 0xe000231d, 0x3246: 0xe0002321, 0x3247: 0xe0002325, - 0x3248: 0xe000232b, 0x3249: 0xf0001c1c, 0x324a: 0xe0002330, 0x324b: 0xe000233c, - 0x324c: 0xe0002340, 0x324d: 0xe0002337, 0x324e: 0xe0002346, 0x324f: 0xe000234b, - 0x3250: 0xe000234f, 0x3251: 0xe0002353, 0x3252: 0xf0001c1c, 0x3253: 0xe000235e, - 0x3254: 0xe0002358, 0x3255: 0xf0001c1c, 0x3256: 0xe0002363, 0x3257: 0xe000236d, - 0x3258: 0xf0001f04, 0x3259: 0xf0001f04, 0x325a: 0xf0001f04, 0x325b: 0xf0001f04, - 0x325c: 0xf0001f04, 0x325d: 0xf0001f04, 0x325e: 0xf0001f04, 0x325f: 0xf0001f04, - 0x3260: 0xf0001f04, 0x3261: 0xf0001f04, 0x3262: 0xf0000404, 0x3263: 0xf0000404, - 0x3264: 0xf0000404, 0x3265: 0xf0000404, 0x3266: 0xf0000404, 0x3267: 0xf0000404, - 0x3268: 0xf0000404, 0x3269: 0xf0000404, 0x326a: 0xf0000404, 0x326b: 0xf0000404, - 0x326c: 0xf0000404, 0x326d: 0xf0000404, 0x326e: 0xf0000404, 0x326f: 0xf0000404, - 0x3270: 0xf0000404, 0x3271: 0xe0000c1e, 0x3272: 0xf0001c1c, 0x3273: 0xf0001d1d, - 0x3274: 0xe0000a31, 0x3275: 0xf0001d1c, 0x3276: 0xf0001c1c, 0x3277: 0xf0001c1c, - 0x3278: 0xe0000ac2, 0x3279: 0xe0000ac6, 0x327a: 0xf0001d1d, 0x327b: 0xf0001c1c, - 0x327c: 0xf0001c1c, 0x327d: 0xf0001c1c, 0x327e: 0xf0001c1c, 0x327f: 0xe0002431, - // Block 0xca, offset 0x3280 - 0x3280: 0xf0001d1c, 0x3281: 0xf0001d1c, 0x3282: 0xf0001d1c, 0x3283: 0xf0001d1c, - 0x3284: 0xf0001d1c, 0x3285: 0xf0001d1d, 0x3286: 0xf0001d1d, 0x3287: 0xf0001d1d, - 0x3288: 0xe0000a6b, 0x3289: 0xe0000cb4, 0x328a: 0xf0001d1c, 0x328b: 0xf0001d1c, - 0x328c: 0xf0001d1c, 0x328d: 0xf0001c1c, 0x328e: 0xf0001c1c, 0x328f: 0xf0001c1c, - 0x3290: 0xf0001c1d, 0x3291: 0xe0000cb9, 0x3292: 0xe0000d36, 0x3293: 0xe0000be3, - 0x3294: 0xe0000fc5, 0x3295: 0xf0001c1c, 0x3296: 0xf0001c1c, 0x3297: 0xf0001c1c, - 0x3298: 0xf0001c1c, 0x3299: 0xf0001c1c, 0x329a: 0xf0001c1c, 0x329b: 0xf0001c1c, - 0x329c: 0xf0001c1c, 0x329d: 0xf0001c1c, 0x329e: 0xf0001c1c, 0x329f: 0xe0000d3e, - 0x32a0: 0xe0000a72, 0x32a1: 0xf0001c1c, 0x32a2: 0xe0000cbd, 0x32a3: 0xe0000d42, - 0x32a4: 0xe0000a76, 0x32a5: 0xf0001c1c, 0x32a6: 0xe0000cc1, 0x32a7: 0xe0000d2d, - 0x32a8: 0xe0000d31, 0x32a9: 0xf0001c1d, 0x32aa: 0xe0000cc5, 0x32ab: 0xe0000d4a, - 0x32ac: 0xe0000be7, 0x32ad: 0xe0000f0b, 0x32ae: 0xe0000f0f, 0x32af: 0xe0000f15, - 0x32b0: 0xf0001c1c, 0x32b1: 0xf0001c1c, 0x32b2: 0xf0001c1c, 0x32b3: 0xf0001c1c, - 0x32b4: 0xf0001d1c, 0x32b5: 0xf0001d1c, 0x32b6: 0xf0001d1c, 0x32b7: 0xf0001d1c, - 0x32b8: 0xf0001d1c, 0x32b9: 0xf0001d1d, 0x32ba: 0xf0001d1c, 0x32bb: 0xf0001d1c, - 0x32bc: 0xf0001d1c, 0x32bd: 0xf0001d1c, 0x32be: 0xf0001d1c, 0x32bf: 0xf0001d1d, - // Block 0xcb, offset 0x32c0 - 0x32c0: 0xf0001d1c, 0x32c1: 0xf0001d1d, 0x32c2: 0xe00009b7, 0x32c3: 0xf0001c1d, - 0x32c4: 0xf0001c1c, 0x32c5: 0xf0001c1c, 0x32c6: 0xe0000a66, 0x32c7: 0xe0000a7a, - 0x32c8: 0xf0001d1c, 0x32c9: 0xf0001c1d, 0x32ca: 0xf0001c1c, 0x32cb: 0xf0001d1d, - 0x32cc: 0xf0001c1c, 0x32cd: 0xf0001d1d, 0x32ce: 0xf0001d1d, 0x32cf: 0xf0001c1c, - 0x32d0: 0xf0001c1c, 0x32d1: 0xf0001c1c, 0x32d2: 0xe0000d0d, 0x32d3: 0xf0001c1c, - 0x32d4: 0xf0001c1c, 0x32d5: 0xe0000d3a, 0x32d6: 0xe0000d46, 0x32d7: 0xf0001d1d, - 0x32d8: 0xe0000eb0, 0x32d9: 0xe0000eb8, 0x32da: 0xf0001d1d, 0x32db: 0xf0001c1c, - 0x32dc: 0xf0001c1d, 0x32dd: 0xf0001c1d, 0x32de: 0xe00010b2, 0x32df: 0xe00009c8, - 0x32e0: 0xf0001f04, 0x32e1: 0xf0001f04, 0x32e2: 0xf0001f04, 0x32e3: 0xf0001f04, - 0x32e4: 0xf0001f04, 0x32e5: 0xf0001f04, 0x32e6: 0xf0001f04, 0x32e7: 0xf0001f04, - 0x32e8: 0xf0001f04, 0x32e9: 0xf0000404, 0x32ea: 0xf0000404, 0x32eb: 0xf0000404, - 0x32ec: 0xf0000404, 0x32ed: 0xf0000404, 0x32ee: 0xf0000404, 0x32ef: 0xf0000404, - 0x32f0: 0xf0000404, 0x32f1: 0xf0000404, 0x32f2: 0xf0000404, 0x32f3: 0xf0000404, - 0x32f4: 0xf0000404, 0x32f5: 0xf0000404, 0x32f6: 0xf0000404, 0x32f7: 0xf0000404, - 0x32f8: 0xf0000404, 0x32f9: 0xf0000404, 0x32fa: 0xf0000404, 0x32fb: 0xf0000404, - 0x32fc: 0xf0000404, 0x32fd: 0xf0000404, 0x32fe: 0xf0000404, 0x32ff: 0xe0000bdf, - // Block 0xcc, offset 0x3300 - 0x3300: 0x40196220, 0x3301: 0x40196420, 0x3302: 0x40196620, 0x3303: 0x40196820, - 0x3304: 0x40196a20, 0x3305: 0x40196c20, 0x3306: 0x40196e20, 0x3307: 0x40197020, - 0x3308: 0x40197220, 0x3309: 0x40197420, 0x330a: 0x40197620, 0x330b: 0x40197820, - 0x330c: 0x40197a20, 0x330d: 0x40197c20, 0x330e: 0x40197e20, 0x330f: 0x40198020, - 0x3310: 0x40198220, 0x3311: 0x40198420, 0x3312: 0x40198620, 0x3313: 0x40198820, - 0x3314: 0x40198a20, 0x3315: 0x40198c20, 0x3316: 0x40198e20, 0x3317: 0x40199020, - 0x3318: 0x40199220, 0x3319: 0x40199420, 0x331a: 0x40199620, 0x331b: 0x40199820, - 0x331c: 0x40199a20, 0x331d: 0x40199c20, 0x331e: 0x40199e20, 0x331f: 0x4019a020, - 0x3320: 0x4019a220, 0x3321: 0x4019a420, 0x3322: 0x4019a620, 0x3323: 0x4019a820, - 0x3324: 0x4019aa20, 0x3325: 0x4019ac20, 0x3326: 0x4019ae20, 0x3327: 0x4019b020, - 0x3328: 0x4019b220, 0x3329: 0x4019b420, 0x332a: 0x4019b620, 0x332b: 0x4019b820, - 0x332c: 0x4019ba20, 0x332d: 0x4019bc20, 0x332e: 0x4019be20, 0x332f: 0x4019c020, - 0x3330: 0x4019c220, 0x3331: 0x4019c420, 0x3332: 0x4019c620, 0x3333: 0x4019c820, - 0x3334: 0x4019ca20, 0x3335: 0x4019cc20, 0x3336: 0x4019ce20, 0x3337: 0x4019d020, - 0x3338: 0x4019d220, 0x3339: 0x4019d420, 0x333a: 0x4019d620, 0x333b: 0x4019d820, - 0x333c: 0x4019da20, 0x333d: 0x4019dc20, 0x333e: 0x4019de20, 0x333f: 0x4019e020, - // Block 0xcd, offset 0x3340 - 0x3340: 0x40664020, 0x3341: 0x40664220, 0x3342: 0x40664420, 0x3343: 0x40664620, - 0x3344: 0x40664820, 0x3345: 0x40664a20, 0x3346: 0x40664c20, 0x3347: 0x40664e20, - 0x3348: 0x40665020, 0x3349: 0x40665220, 0x334a: 0x40665420, 0x334b: 0x40665620, - 0x334c: 0x40665820, 0x334d: 0x40665a20, 0x334e: 0x40665c20, 0x334f: 0x40665e20, - 0x3350: 0x40666020, 0x3351: 0x40666220, 0x3352: 0x40666420, 0x3353: 0x40666620, - 0x3354: 0x40666820, 0x3355: 0x40666a20, 0x3356: 0x40666c20, 0x3357: 0x40666e20, - 0x3358: 0x40667020, 0x3359: 0x40667220, 0x335a: 0x40667420, 0x335b: 0x40667620, - 0x335c: 0x40667820, 0x335d: 0x40667a20, 0x335e: 0x40667c20, 0x335f: 0x40667e20, - 0x3360: 0x40668020, 0x3361: 0x40668220, 0x3362: 0x40668420, 0x3363: 0x40668620, - 0x3364: 0x40668820, 0x3365: 0x40668a20, 0x3366: 0x40668c20, 0x3367: 0x40668e20, - 0x3368: 0x40669020, 0x3369: 0x40669220, 0x336a: 0x40669420, 0x336b: 0x40669620, - 0x336c: 0x40669820, 0x336d: 0x40669a20, 0x336e: 0x40669c20, 0x336f: 0x40669e20, - 0x3370: 0x4066a020, 0x3371: 0x4066a220, 0x3372: 0x4066a420, 0x3373: 0x4066a620, - 0x3374: 0x4066a820, 0x3375: 0x4066aa20, 0x3376: 0x4066ac20, 0x3377: 0x4066ae20, - 0x3378: 0x4066b020, 0x3379: 0x4066b220, 0x337a: 0x4066b420, 0x337b: 0x4066b620, - 0x337c: 0x4066b820, 0x337d: 0x4066ba20, 0x337e: 0x4066bc20, 0x337f: 0x4066be20, - // Block 0xce, offset 0x3380 - 0x3380: 0x4066c020, 0x3381: 0x4066c220, 0x3382: 0x4066c420, 0x3383: 0x4066c620, - 0x3384: 0x4066c820, 0x3385: 0x4066ca20, 0x3386: 0x4066cc20, 0x3387: 0x4066ce20, - 0x3388: 0x4066d020, 0x3389: 0x4066d220, 0x338a: 0x4066d420, 0x338b: 0x4066d620, - 0x338c: 0x4066d820, 0x338d: 0x4066da20, 0x338e: 0x4066dc20, 0x338f: 0x4066de20, - 0x3390: 0x4066e020, 0x3391: 0x4066e220, 0x3392: 0x4066e420, 0x3393: 0x4066e620, - 0x3394: 0x4066e820, 0x3395: 0x4066ea20, 0x3396: 0x4066ec20, 0x3397: 0x4066ee20, - 0x3398: 0x4066f020, 0x3399: 0x4066f220, 0x339a: 0x4066f420, 0x339b: 0x4066f620, - 0x339c: 0x4066f820, 0x339d: 0x4066fa20, 0x339e: 0x4066fc20, 0x339f: 0x4066fe20, - 0x33a0: 0x40670020, 0x33a1: 0x40670220, 0x33a2: 0x40670420, 0x33a3: 0x40670620, - 0x33a4: 0x40670820, 0x33a5: 0x40670a20, 0x33a6: 0x40670c20, 0x33a7: 0x40670e20, - 0x33a8: 0x40671020, 0x33a9: 0x40671220, 0x33aa: 0x40671420, 0x33ab: 0x40671620, - 0x33ac: 0x40671820, 0x33ad: 0x40671a20, 0x33ae: 0x40671c20, 0x33af: 0x40671e20, - 0x33b0: 0x40672020, 0x33b1: 0x40672220, 0x33b2: 0x40672420, 0x33b3: 0x40672620, - 0x33b4: 0x40672820, 0x33b5: 0x40672a20, 0x33b6: 0x40672c20, 0x33b7: 0x40672e20, - 0x33b8: 0x40673020, 0x33b9: 0x40673220, 0x33ba: 0x40673420, 0x33bb: 0x40673620, - 0x33bc: 0x40673820, 0x33bd: 0x40673a20, 0x33be: 0x40673c20, 0x33bf: 0x40673e20, - // Block 0xcf, offset 0x33c0 - 0x33c0: 0x40674020, 0x33c1: 0x40674220, 0x33c2: 0x40674420, 0x33c3: 0x40674620, - 0x33c4: 0x40674820, 0x33c5: 0x40674a20, 0x33c6: 0x40674c20, 0x33c7: 0x40674e20, - 0x33c8: 0x40675020, 0x33c9: 0x40675220, 0x33ca: 0x40675420, 0x33cb: 0x40675620, - 0x33cc: 0x40675820, 0x33cd: 0x40675a20, 0x33ce: 0x40675c20, 0x33cf: 0x40675e20, - 0x33d0: 0x40676020, 0x33d1: 0x40676220, 0x33d2: 0x40676420, 0x33d3: 0x40676620, - 0x33d4: 0x40676820, 0x33d5: 0x40676a20, 0x33d6: 0x40676c20, 0x33d7: 0x40676e20, - 0x33d8: 0x40677020, 0x33d9: 0x40677220, 0x33da: 0x40677420, 0x33db: 0x40677620, - 0x33dc: 0x40677820, 0x33dd: 0x40677a20, 0x33de: 0x40677c20, 0x33df: 0x40677e20, - 0x33e0: 0x40678020, 0x33e1: 0x40678220, 0x33e2: 0x40678420, 0x33e3: 0x40678620, - 0x33e4: 0x40678820, 0x33e5: 0x40678a20, 0x33e6: 0x40678c20, 0x33e7: 0x40678e20, - 0x33e8: 0x40679020, 0x33e9: 0x40679220, 0x33ea: 0x40679420, 0x33eb: 0x40679620, - 0x33ec: 0x40679820, 0x33ed: 0x40679a20, 0x33ee: 0x40679c20, 0x33ef: 0x40679e20, - 0x33f0: 0x4067a020, 0x33f1: 0x4067a220, 0x33f2: 0x4067a420, 0x33f3: 0x4067a620, - 0x33f4: 0x4067a820, 0x33f5: 0x4067aa20, 0x33f6: 0x4067ac20, 0x33f7: 0x4067ae20, - 0x33f8: 0x4067b020, 0x33f9: 0x4067b220, 0x33fa: 0x4067b420, 0x33fb: 0x4067b620, - 0x33fc: 0x4067b820, 0x33fd: 0x4067ba20, 0x33fe: 0x4067bc20, 0x33ff: 0x4067be20, - // Block 0xd0, offset 0x3400 - 0x3400: 0x4067c020, 0x3401: 0x4067c220, 0x3402: 0x4067c420, 0x3403: 0x4067c620, - 0x3404: 0x4067c820, 0x3405: 0x4067ca20, 0x3406: 0x4067cc20, 0x3407: 0x4067ce20, - 0x3408: 0x4067d020, 0x3409: 0x4067d220, 0x340a: 0x4067d420, 0x340b: 0x4067d620, - 0x340c: 0x4067d820, 0x340d: 0x4067da20, 0x340e: 0x4067dc20, 0x340f: 0x4067de20, - 0x3410: 0x4067e020, 0x3411: 0x4067e220, 0x3412: 0x4067e420, 0x3413: 0x4067e620, - 0x3414: 0x4067e820, 0x3415: 0x4067ea20, 0x3416: 0x4067ec20, 0x3417: 0x4067ee20, - 0x3418: 0x4067f020, 0x3419: 0x4067f220, 0x341a: 0x4067f420, 0x341b: 0x4067f620, - 0x341c: 0x4067f820, 0x341d: 0x4067fa20, 0x341e: 0x4067fc20, 0x341f: 0x4067fe20, - 0x3420: 0x40680020, 0x3421: 0x40680220, 0x3422: 0x40680420, 0x3423: 0x40680620, - 0x3424: 0x40680820, 0x3425: 0x40680a20, 0x3426: 0x40680c20, 0x3427: 0x40680e20, - 0x3428: 0x40681020, 0x3429: 0x40681220, 0x342a: 0x40681420, 0x342b: 0x40681620, - 0x342c: 0x40681820, 0x342d: 0x40681a20, 0x342e: 0x40681c20, 0x342f: 0x40681e20, - 0x3430: 0x40682020, 0x3431: 0x40682220, 0x3432: 0x40682420, 0x3433: 0x40682620, - 0x3434: 0x40682820, 0x3435: 0x40682a20, 0x3436: 0x40682c20, 0x3437: 0x40682e20, - 0x3438: 0x40683020, 0x3439: 0x40683220, 0x343a: 0x40683420, 0x343b: 0x40683620, - 0x343c: 0x40683820, 0x343d: 0x40683a20, 0x343e: 0x40683c20, 0x343f: 0x40683e20, - // Block 0xd1, offset 0x3440 - 0x3440: 0x40684020, 0x3441: 0x40684220, 0x3442: 0x40684420, 0x3443: 0x40684620, - 0x3444: 0x40684820, 0x3445: 0x40684a20, 0x3446: 0x40684c20, 0x3447: 0x40684e20, - 0x3448: 0x40685020, 0x3449: 0x40685220, 0x344a: 0x40685420, 0x344b: 0x40685620, - 0x344c: 0x40685820, 0x344d: 0x40685a20, 0x344e: 0x40685c20, 0x344f: 0x40685e20, - 0x3450: 0x40686020, 0x3451: 0x40686220, 0x3452: 0x40686420, 0x3453: 0x40686620, - 0x3454: 0x40686820, 0x3455: 0x40686a20, 0x3456: 0x40686c20, 0x3457: 0x40686e20, - 0x3458: 0x40687020, 0x3459: 0x40687220, 0x345a: 0x40687420, 0x345b: 0x40687620, - 0x345c: 0x40687820, 0x345d: 0x40687a20, 0x345e: 0x40687c20, 0x345f: 0x40687e20, - 0x3460: 0x40688020, 0x3461: 0x40688220, 0x3462: 0x40688420, 0x3463: 0x40688620, - 0x3464: 0x40688820, 0x3465: 0x40688a20, 0x3466: 0x40688c20, 0x3467: 0x40688e20, - 0x3468: 0x40689020, 0x3469: 0x40689220, 0x346a: 0x40689420, 0x346b: 0x40689620, - 0x346c: 0x40689820, 0x346d: 0x40689a20, 0x346e: 0x40689c20, 0x346f: 0x40689e20, - 0x3470: 0x4068a020, 0x3471: 0x4068a220, 0x3472: 0x4068a420, 0x3473: 0x4068a620, - 0x3474: 0x4068a820, 0x3475: 0x4068aa20, 0x3476: 0x4068ac20, 0x3477: 0x4068ae20, - 0x3478: 0x4068b020, 0x3479: 0x4068b220, 0x347a: 0x4068b420, 0x347b: 0x4068b620, - 0x347c: 0x4068b820, 0x347d: 0x4068ba20, 0x347e: 0x4068bc20, 0x347f: 0x4068be20, - // Block 0xd2, offset 0x3480 - 0x3480: 0x4068c020, 0x3481: 0x4068c220, 0x3482: 0x4068c420, 0x3483: 0x4068c620, - 0x3484: 0x4068c820, 0x3485: 0x4068ca20, 0x3486: 0x4068cc20, 0x3487: 0x4068ce20, - 0x3488: 0x4068d020, 0x3489: 0x4068d220, 0x348a: 0x4068d420, 0x348b: 0x4068d620, - 0x348c: 0x4068d820, 0x348d: 0x4068da20, 0x348e: 0x4068dc20, 0x348f: 0x4068de20, - 0x3490: 0x4068e020, 0x3491: 0x4068e220, 0x3492: 0x4068e420, 0x3493: 0x4068e620, - 0x3494: 0x4068e820, 0x3495: 0x4068ea20, 0x3496: 0x4068ec20, 0x3497: 0x4068ee20, - 0x3498: 0x4068f020, 0x3499: 0x4068f220, 0x349a: 0x4068f420, 0x349b: 0x4068f620, - 0x349c: 0x4068f820, 0x349d: 0x4068fa20, 0x349e: 0x4068fc20, 0x349f: 0x4068fe20, - 0x34a0: 0x40690020, 0x34a1: 0x40690220, 0x34a2: 0x40690420, 0x34a3: 0x40690620, - 0x34a4: 0x40690820, 0x34a5: 0x40690a20, 0x34a6: 0x40690c20, 0x34a7: 0x40690e20, - 0x34a8: 0x40691020, 0x34a9: 0x40691220, 0x34aa: 0x40691420, 0x34ab: 0x40691620, - 0x34ac: 0x40691820, 0x34ad: 0x40691a20, 0x34ae: 0x40691c20, 0x34af: 0x40691e20, - 0x34b0: 0x40692020, 0x34b1: 0x40692220, 0x34b2: 0x40692420, 0x34b3: 0x40692620, - 0x34b4: 0x40692820, 0x34b5: 0x40692a20, 0x34b6: 0x40692c20, 0x34b7: 0x40692e20, - 0x34b8: 0x40693020, 0x34b9: 0x40693220, 0x34ba: 0x40693420, 0x34bb: 0x40693620, - 0x34bc: 0x40693820, 0x34bd: 0x40693a20, 0x34be: 0x40693c20, 0x34bf: 0x40693e20, - // Block 0xd3, offset 0x34c0 - 0x34c0: 0x40694020, 0x34c1: 0x40694220, 0x34c2: 0x40694420, 0x34c3: 0x40694620, - 0x34c4: 0x40694820, 0x34c5: 0x40694a20, 0x34c6: 0x40694c20, 0x34c7: 0x40694e20, - 0x34c8: 0x40695020, 0x34c9: 0x40695220, 0x34ca: 0x40695420, 0x34cb: 0x40695620, - 0x34cc: 0x40695820, 0x34cd: 0x40695a20, 0x34ce: 0x40695c20, 0x34cf: 0x40695e20, - 0x34d0: 0x40696020, 0x34d1: 0x40696220, 0x34d2: 0x40696420, 0x34d3: 0x40696620, - 0x34d4: 0x40696820, 0x34d5: 0x40696a20, 0x34d6: 0x40696c20, 0x34d7: 0x40696e20, - 0x34d8: 0x40697020, 0x34d9: 0x40697220, 0x34da: 0x40697420, 0x34db: 0x40697620, - 0x34dc: 0x40697820, 0x34dd: 0x40697a20, 0x34de: 0x40697c20, 0x34df: 0x40697e20, - 0x34e0: 0x40698020, 0x34e1: 0x40698220, 0x34e2: 0x40698420, 0x34e3: 0x40698620, - 0x34e4: 0x40698820, 0x34e5: 0x40698a20, 0x34e6: 0x40698c20, 0x34e7: 0x40698e20, - 0x34e8: 0x40699020, 0x34e9: 0x40699220, 0x34ea: 0x40699420, 0x34eb: 0x40699620, - 0x34ec: 0x40699820, 0x34ed: 0x40699a20, 0x34ee: 0x40699c20, 0x34ef: 0x40699e20, - 0x34f0: 0x4069a020, 0x34f1: 0x4069a220, 0x34f2: 0x4069a420, 0x34f3: 0x4069a620, - 0x34f4: 0x4069a820, 0x34f5: 0x4069aa20, 0x34f6: 0x4069ac20, 0x34f7: 0x4069ae20, - 0x34f8: 0x4069b020, 0x34f9: 0x4069b220, 0x34fa: 0x4069b420, 0x34fb: 0x4069b620, - 0x34fc: 0x4069b820, 0x34fd: 0x4069ba20, 0x34fe: 0x4069bc20, 0x34ff: 0x4069be20, - // Block 0xd4, offset 0x3500 - 0x3500: 0x4069c020, 0x3501: 0x4069c220, 0x3502: 0x4069c420, 0x3503: 0x4069c620, - 0x3504: 0x4069c820, 0x3505: 0x4069ca20, 0x3506: 0x4069cc20, 0x3507: 0x4069ce20, - 0x3508: 0x4069d020, 0x3509: 0x4069d220, 0x350a: 0x4069d420, 0x350b: 0x4069d620, - 0x350c: 0x4069d820, 0x350d: 0x4069da20, 0x350e: 0x4069dc20, 0x350f: 0x4069de20, - 0x3510: 0x4069e020, 0x3511: 0x4069e220, 0x3512: 0x4069e420, 0x3513: 0x4069e620, - 0x3514: 0x4069e820, 0x3515: 0x4069ea20, 0x3516: 0x4069ec20, 0x3517: 0x4069ee20, - 0x3518: 0x4069f020, 0x3519: 0x4069f220, 0x351a: 0x4069f420, 0x351b: 0x4069f620, - 0x351c: 0x4069f820, 0x351d: 0x4069fa20, 0x351e: 0x4069fc20, 0x351f: 0x4069fe20, - 0x3520: 0x406a0020, 0x3521: 0x406a0220, 0x3522: 0x406a0420, 0x3523: 0x406a0620, - 0x3524: 0x406a0820, 0x3525: 0x406a0a20, 0x3526: 0x406a0c20, 0x3527: 0x406a0e20, - 0x3528: 0x406a1020, 0x3529: 0x406a1220, 0x352a: 0x406a1420, 0x352b: 0x406a1620, - 0x352c: 0x406a1820, 0x352d: 0x406a1a20, 0x352e: 0x406a1c20, 0x352f: 0x406a1e20, - 0x3530: 0x406a2020, 0x3531: 0x406a2220, 0x3532: 0x406a2420, 0x3533: 0x406a2620, - 0x3534: 0x406a2820, 0x3535: 0x406a2a20, 0x3536: 0x406a2c20, 0x3537: 0x406a2e20, - 0x3538: 0x406a3020, 0x3539: 0x406a3220, 0x353a: 0x406a3420, 0x353b: 0x406a3620, - 0x353c: 0x406a3820, 0x353d: 0x406a3a20, 0x353e: 0x406a3c20, 0x353f: 0x406a3e20, - // Block 0xd5, offset 0x3540 - 0x3540: 0x406a4020, 0x3541: 0x406a4220, 0x3542: 0x406a4420, 0x3543: 0x406a4620, - 0x3544: 0x406a4820, 0x3545: 0x406a4a20, 0x3546: 0x406a4c20, 0x3547: 0x406a4e20, - 0x3548: 0x406a5020, 0x3549: 0x406a5220, 0x354a: 0x406a5420, 0x354b: 0x406a5620, - 0x354c: 0x406a5820, 0x354d: 0x406a5a20, 0x354e: 0x406a5c20, 0x354f: 0x406a5e20, - 0x3550: 0x406a6020, 0x3551: 0x406a6220, 0x3552: 0x406a6420, 0x3553: 0x406a6620, - 0x3554: 0x406a6820, 0x3555: 0x406a6a20, 0x3556: 0x406a6c20, 0x3557: 0x406a6e20, - 0x3558: 0x406a7020, 0x3559: 0x406a7220, 0x355a: 0x406a7420, 0x355b: 0x406a7620, - 0x355c: 0x406a7820, 0x355d: 0x406a7a20, 0x355e: 0x406a7c20, 0x355f: 0x406a7e20, - 0x3560: 0x406a8020, 0x3561: 0x406a8220, 0x3562: 0x406a8420, 0x3563: 0x406a8620, - 0x3564: 0x406a8820, 0x3565: 0x406a8a20, 0x3566: 0x406a8c20, 0x3567: 0x406a8e20, - 0x3568: 0x406a9020, 0x3569: 0x406a9220, 0x356a: 0x406a9420, 0x356b: 0x406a9620, - 0x356c: 0x406a9820, 0x356d: 0x406a9a20, 0x356e: 0x406a9c20, 0x356f: 0x406a9e20, - 0x3570: 0x406aa020, 0x3571: 0x406aa220, 0x3572: 0x406aa420, 0x3573: 0x406aa620, - 0x3574: 0x406aa820, 0x3575: 0x406aaa20, 0x3576: 0x406aac20, 0x3577: 0x406aae20, - 0x3578: 0x406ab020, 0x3579: 0x406ab220, 0x357a: 0x406ab420, 0x357b: 0x406ab620, - 0x357c: 0x406ab820, 0x357d: 0x406aba20, 0x357e: 0x406abc20, 0x357f: 0x406abe20, - // Block 0xd6, offset 0x3580 - 0x3580: 0x406ac020, 0x3581: 0x406ac220, 0x3582: 0x406ac420, 0x3583: 0x406ac620, - 0x3584: 0x406ac820, 0x3585: 0x406aca20, 0x3586: 0x406acc20, 0x3587: 0x406ace20, - 0x3588: 0x406ad020, 0x3589: 0x406ad220, 0x358a: 0x406ad420, 0x358b: 0x406ad620, - 0x358c: 0x406ad820, 0x358d: 0x406ada20, 0x358e: 0x406adc20, 0x358f: 0x406ade20, - 0x3590: 0x406ae020, 0x3591: 0x406ae220, 0x3592: 0x406ae420, 0x3593: 0x406ae620, - 0x3594: 0x406ae820, 0x3595: 0x406aea20, 0x3596: 0x406aec20, 0x3597: 0x406aee20, - 0x3598: 0x406af020, 0x3599: 0x406af220, 0x359a: 0x406af420, 0x359b: 0x406af620, - 0x359c: 0x406af820, 0x359d: 0x406afa20, 0x359e: 0x406afc20, 0x359f: 0x406afe20, - 0x35a0: 0x406b0020, 0x35a1: 0x406b0220, 0x35a2: 0x406b0420, 0x35a3: 0x406b0620, - 0x35a4: 0x406b0820, 0x35a5: 0x406b0a20, 0x35a6: 0x406b0c20, 0x35a7: 0x406b0e20, - 0x35a8: 0x406b1020, 0x35a9: 0x406b1220, 0x35aa: 0x406b1420, 0x35ab: 0x406b1620, - 0x35ac: 0x406b1820, 0x35ad: 0x406b1a20, 0x35ae: 0x406b1c20, 0x35af: 0x406b1e20, - 0x35b0: 0x406b2020, 0x35b1: 0x406b2220, 0x35b2: 0x406b2420, 0x35b3: 0x406b2620, - 0x35b4: 0x406b2820, 0x35b5: 0x406b2a20, 0x35b6: 0x406b2c20, 0x35b7: 0x406b2e20, - 0x35b8: 0x406b3020, 0x35b9: 0x406b3220, 0x35ba: 0x406b3420, 0x35bb: 0x406b3620, - 0x35bc: 0x406b3820, 0x35bd: 0x406b3a20, 0x35be: 0x406b3c20, 0x35bf: 0x406b3e20, - // Block 0xd7, offset 0x35c0 - 0x35c0: 0x406b4020, 0x35c1: 0x406b4220, 0x35c2: 0x406b4420, 0x35c3: 0x406b4620, - 0x35c4: 0x406b4820, 0x35c5: 0x406b4a20, 0x35c6: 0x406b4c20, 0x35c7: 0x406b4e20, - 0x35c8: 0x406b5020, 0x35c9: 0x406b5220, 0x35ca: 0x406b5420, 0x35cb: 0x406b5620, - 0x35cc: 0x406b5820, 0x35cd: 0x406b5a20, 0x35ce: 0x406b5c20, 0x35cf: 0x406b5e20, - 0x35d0: 0x406b6020, 0x35d1: 0x406b6220, 0x35d2: 0x406b6420, 0x35d3: 0x406b6620, - 0x35d4: 0x406b6820, 0x35d5: 0x406b6a20, 0x35d6: 0x406b6c20, 0x35d7: 0x406b6e20, - 0x35d8: 0x406b7020, 0x35d9: 0x406b7220, 0x35da: 0x406b7420, 0x35db: 0x406b7620, - 0x35dc: 0x406b7820, 0x35dd: 0x406b7a20, 0x35de: 0x406b7c20, 0x35df: 0x406b7e20, - 0x35e0: 0x406b8020, 0x35e1: 0x406b8220, 0x35e2: 0x406b8420, 0x35e3: 0x406b8620, - 0x35e4: 0x406b8820, 0x35e5: 0x406b8a20, 0x35e6: 0x406b8c20, 0x35e7: 0x406b8e20, - 0x35e8: 0x406b9020, 0x35e9: 0x406b9220, 0x35ea: 0x406b9420, 0x35eb: 0x406b9620, - 0x35ec: 0x406b9820, 0x35ed: 0x406b9a20, 0x35ee: 0x406b9c20, 0x35ef: 0x406b9e20, - 0x35f0: 0x406ba020, 0x35f1: 0x406ba220, 0x35f2: 0x406ba420, 0x35f3: 0x406ba620, - 0x35f4: 0x406ba820, 0x35f5: 0x406baa20, 0x35f6: 0x406bac20, 0x35f7: 0x406bae20, - 0x35f8: 0x406bb020, 0x35f9: 0x406bb220, 0x35fa: 0x406bb420, 0x35fb: 0x406bb620, - 0x35fc: 0x406bb820, 0x35fd: 0x406bba20, 0x35fe: 0x406bbc20, 0x35ff: 0x406bbe20, - // Block 0xd8, offset 0x3600 - 0x3600: 0x406bc020, 0x3601: 0x406bc220, 0x3602: 0x406bc420, 0x3603: 0x406bc620, - 0x3604: 0x406bc820, 0x3605: 0x406bca20, 0x3606: 0x406bcc20, 0x3607: 0x406bce20, - 0x3608: 0x406bd020, 0x3609: 0x406bd220, 0x360a: 0x406bd420, 0x360b: 0x406bd620, - 0x360c: 0x406bd820, 0x360d: 0x406bda20, 0x360e: 0x406bdc20, 0x360f: 0x406bde20, - 0x3610: 0x406be020, 0x3611: 0x406be220, 0x3612: 0x406be420, 0x3613: 0x406be620, - 0x3614: 0x406be820, 0x3615: 0x406bea20, 0x3616: 0x406bec20, 0x3617: 0x406bee20, - 0x3618: 0x406bf020, 0x3619: 0x406bf220, 0x361a: 0x406bf420, 0x361b: 0x406bf620, - 0x361c: 0x406bf820, 0x361d: 0x406bfa20, 0x361e: 0x406bfc20, 0x361f: 0x406bfe20, - 0x3620: 0x406c0020, 0x3621: 0x406c0220, 0x3622: 0x406c0420, 0x3623: 0x406c0620, - 0x3624: 0x406c0820, 0x3625: 0x406c0a20, 0x3626: 0x406c0c20, 0x3627: 0x406c0e20, - 0x3628: 0x406c1020, 0x3629: 0x406c1220, 0x362a: 0x406c1420, 0x362b: 0x406c1620, - 0x362c: 0x406c1820, 0x362d: 0x406c1a20, 0x362e: 0x406c1c20, 0x362f: 0x406c1e20, - 0x3630: 0x406c2020, 0x3631: 0x406c2220, 0x3632: 0x406c2420, 0x3633: 0x406c2620, - 0x3634: 0x406c2820, 0x3635: 0x406c2a20, 0x3636: 0x406c2c20, 0x3637: 0x406c2e20, - 0x3638: 0x406c3020, 0x3639: 0x406c3220, 0x363a: 0x406c3420, 0x363b: 0x406c3620, - 0x363c: 0x406c3820, 0x363d: 0x406c3a20, 0x363e: 0x406c3c20, 0x363f: 0x406c3e20, - // Block 0xd9, offset 0x3640 - 0x3640: 0x406c4020, 0x3641: 0x406c4220, 0x3642: 0x406c4420, 0x3643: 0x406c4620, - 0x3644: 0x406c4820, 0x3645: 0x406c4a20, 0x3646: 0x406c4c20, 0x3647: 0x406c4e20, - 0x3648: 0x406c5020, 0x3649: 0x406c5220, 0x364a: 0x406c5420, 0x364b: 0x406c5620, - 0x364c: 0x406c5820, 0x364d: 0x406c5a20, 0x364e: 0x406c5c20, 0x364f: 0x406c5e20, - 0x3650: 0x406c6020, 0x3651: 0x406c6220, 0x3652: 0x406c6420, 0x3653: 0x406c6620, - 0x3654: 0x406c6820, 0x3655: 0x406c6a20, 0x3656: 0x406c6c20, 0x3657: 0x406c6e20, - 0x3658: 0x406c7020, 0x3659: 0x406c7220, 0x365a: 0x406c7420, 0x365b: 0x406c7620, - 0x365c: 0x406c7820, 0x365d: 0x406c7a20, 0x365e: 0x406c7c20, 0x365f: 0x406c7e20, - 0x3660: 0x406c8020, 0x3661: 0x406c8220, 0x3662: 0x406c8420, 0x3663: 0x406c8620, - 0x3664: 0x406c8820, 0x3665: 0x406c8a20, 0x3666: 0x406c8c20, 0x3667: 0x406c8e20, - 0x3668: 0x406c9020, 0x3669: 0x406c9220, 0x366a: 0x406c9420, 0x366b: 0x406c9620, - 0x366c: 0x406c9820, 0x366d: 0x406c9a20, 0x366e: 0x406c9c20, 0x366f: 0x406c9e20, - 0x3670: 0x406ca020, 0x3671: 0x406ca220, 0x3672: 0x406ca420, 0x3673: 0x406ca620, - 0x3674: 0x406ca820, 0x3675: 0x406caa20, 0x3676: 0x406cac20, 0x3677: 0x406cae20, - 0x3678: 0x406cb020, 0x3679: 0x406cb220, 0x367a: 0x406cb420, 0x367b: 0x406cb620, - 0x367c: 0x406cb820, 0x367d: 0x406cba20, 0x367e: 0x406cbc20, 0x367f: 0x406cbe20, - // Block 0xda, offset 0x3680 - 0x3680: 0x406cc020, 0x3681: 0x406cc220, 0x3682: 0x406cc420, 0x3683: 0x406cc620, - 0x3684: 0x406cc820, 0x3685: 0x406cca20, 0x3686: 0x406ccc20, 0x3687: 0x406cce20, - 0x3688: 0x406cd020, 0x3689: 0x406cd220, 0x368a: 0x406cd420, 0x368b: 0x406cd620, - 0x368c: 0x406cd820, 0x368d: 0x406cda20, 0x368e: 0x406cdc20, 0x368f: 0x406cde20, - 0x3690: 0x406ce020, 0x3691: 0x406ce220, 0x3692: 0x406ce420, 0x3693: 0x406ce620, - 0x3694: 0x406ce820, 0x3695: 0x406cea20, 0x3696: 0x406cec20, 0x3697: 0x406cee20, - 0x3698: 0x406cf020, 0x3699: 0x406cf220, 0x369a: 0x406cf420, 0x369b: 0x406cf620, - 0x369c: 0x406cf820, 0x369d: 0x406cfa20, 0x369e: 0x406cfc20, 0x369f: 0x406cfe20, - 0x36a0: 0x406d0020, 0x36a1: 0x406d0220, 0x36a2: 0x406d0420, 0x36a3: 0x406d0620, - 0x36a4: 0x406d0820, 0x36a5: 0x406d0a20, 0x36a6: 0x406d0c20, 0x36a7: 0x406d0e20, - 0x36a8: 0x406d1020, 0x36a9: 0x406d1220, 0x36aa: 0x406d1420, 0x36ab: 0x406d1620, - 0x36ac: 0x406d1820, 0x36ad: 0x406d1a20, 0x36ae: 0x406d1c20, 0x36af: 0x406d1e20, - 0x36b0: 0x406d2020, 0x36b1: 0x406d2220, 0x36b2: 0x406d2420, 0x36b3: 0x406d2620, - 0x36b4: 0x406d2820, 0x36b5: 0x406d2a20, 0x36b6: 0x406d2c20, 0x36b7: 0x406d2e20, - 0x36b8: 0x406d3020, 0x36b9: 0x406d3220, 0x36ba: 0x406d3420, 0x36bb: 0x406d3620, - 0x36bc: 0x406d3820, 0x36bd: 0x406d3a20, 0x36be: 0x406d3c20, 0x36bf: 0x406d3e20, - // Block 0xdb, offset 0x36c0 - 0x36c0: 0x406d4020, 0x36c1: 0x406d4220, 0x36c2: 0x406d4420, 0x36c3: 0x406d4620, - 0x36c4: 0x406d4820, 0x36c5: 0x406d4a20, 0x36c6: 0x406d4c20, 0x36c7: 0x406d4e20, - 0x36c8: 0x406d5020, 0x36c9: 0x406d5220, 0x36ca: 0x406d5420, 0x36cb: 0x406d5620, - 0x36cc: 0x406d5820, 0x36cd: 0x406d5a20, 0x36ce: 0x406d5c20, 0x36cf: 0x406d5e20, - 0x36d0: 0x406d6020, 0x36d1: 0x406d6220, 0x36d2: 0x406d6420, 0x36d3: 0x406d6620, - 0x36d4: 0x406d6820, 0x36d5: 0x406d6a20, 0x36d6: 0x406d6c20, 0x36d7: 0x406d6e20, - 0x36d8: 0x406d7020, 0x36d9: 0x406d7220, 0x36da: 0x406d7420, 0x36db: 0x406d7620, - 0x36dc: 0x406d7820, 0x36dd: 0x406d7a20, 0x36de: 0x406d7c20, 0x36df: 0x406d7e20, - 0x36e0: 0x406d8020, 0x36e1: 0x406d8220, 0x36e2: 0x406d8420, 0x36e3: 0x406d8620, - 0x36e4: 0x406d8820, 0x36e5: 0x406d8a20, 0x36e6: 0x406d8c20, 0x36e7: 0x406d8e20, - 0x36e8: 0x406d9020, 0x36e9: 0x406d9220, 0x36ea: 0x406d9420, 0x36eb: 0x406d9620, - 0x36ec: 0x406d9820, 0x36ed: 0x406d9a20, 0x36ee: 0x406d9c20, 0x36ef: 0x406d9e20, - 0x36f0: 0x406da020, 0x36f1: 0x406da220, 0x36f2: 0x406da420, 0x36f3: 0x406da620, - 0x36f4: 0x406da820, 0x36f5: 0x406daa20, 0x36f6: 0x406dac20, 0x36f7: 0x406dae20, - 0x36f8: 0x406db020, 0x36f9: 0x406db220, 0x36fa: 0x406db420, 0x36fb: 0x406db620, - 0x36fc: 0x406db820, 0x36fd: 0x406dba20, 0x36fe: 0x406dbc20, 0x36ff: 0x406dbe20, - // Block 0xdc, offset 0x3700 - 0x3700: 0x406dc020, 0x3701: 0x406dc220, 0x3702: 0x406dc420, 0x3703: 0x406dc620, - 0x3704: 0x406dc820, 0x3705: 0x406dca20, 0x3706: 0x406dcc20, 0x3707: 0x406dce20, - 0x3708: 0x406dd020, 0x3709: 0x406dd220, 0x370a: 0x406dd420, 0x370b: 0x406dd620, - 0x370c: 0x406dd820, 0x370d: 0x406dda20, 0x370e: 0x406ddc20, 0x370f: 0x406dde20, - 0x3710: 0x406de020, 0x3711: 0x406de220, 0x3712: 0x406de420, 0x3713: 0x406de620, - 0x3714: 0x406de820, 0x3715: 0x406dea20, 0x3716: 0x406dec20, 0x3717: 0x406dee20, - 0x3718: 0x406df020, 0x3719: 0x406df220, 0x371a: 0x406df420, 0x371b: 0x406df620, - 0x371c: 0x406df820, 0x371d: 0x406dfa20, 0x371e: 0x406dfc20, 0x371f: 0x406dfe20, - 0x3720: 0x406e0020, 0x3721: 0x406e0220, 0x3722: 0x406e0420, 0x3723: 0x406e0620, - 0x3724: 0x406e0820, 0x3725: 0x406e0a20, 0x3726: 0x406e0c20, 0x3727: 0x406e0e20, - 0x3728: 0x406e1020, 0x3729: 0x406e1220, 0x372a: 0x406e1420, 0x372b: 0x406e1620, - 0x372c: 0x406e1820, 0x372d: 0x406e1a20, 0x372e: 0x406e1c20, 0x372f: 0x406e1e20, - 0x3730: 0x406e2020, 0x3731: 0x406e2220, 0x3732: 0x406e2420, 0x3733: 0x406e2620, - 0x3734: 0x406e2820, 0x3735: 0x406e2a20, 0x3736: 0x406e2c20, 0x3737: 0x406e2e20, - 0x3738: 0x406e3020, 0x3739: 0x406e3220, 0x373a: 0x406e3420, 0x373b: 0x406e3620, - 0x373c: 0x406e3820, 0x373d: 0x406e3a20, 0x373e: 0x406e3c20, 0x373f: 0x406e3e20, - // Block 0xdd, offset 0x3740 - 0x3740: 0x406e4020, 0x3741: 0x406e4220, 0x3742: 0x406e4420, 0x3743: 0x406e4620, - 0x3744: 0x406e4820, 0x3745: 0x406e4a20, 0x3746: 0x406e4c20, 0x3747: 0x406e4e20, - 0x3748: 0x406e5020, 0x3749: 0x406e5220, 0x374a: 0x406e5420, 0x374b: 0x406e5620, - 0x374c: 0x406e5820, 0x374d: 0x406e5a20, 0x374e: 0x406e5c20, 0x374f: 0x406e5e20, - 0x3750: 0x406e6020, 0x3751: 0x406e6220, 0x3752: 0x406e6420, 0x3753: 0x406e6620, - 0x3754: 0x406e6820, 0x3755: 0x406e6a20, 0x3756: 0x406e6c20, 0x3757: 0x406e6e20, - 0x3758: 0x406e7020, 0x3759: 0x406e7220, 0x375a: 0x406e7420, 0x375b: 0x406e7620, - 0x375c: 0x406e7820, 0x375d: 0x406e7a20, 0x375e: 0x406e7c20, 0x375f: 0x406e7e20, - 0x3760: 0x406e8020, 0x3761: 0x406e8220, 0x3762: 0x406e8420, 0x3763: 0x406e8620, - 0x3764: 0x406e8820, 0x3765: 0x406e8a20, 0x3766: 0x406e8c20, 0x3767: 0x406e8e20, - 0x3768: 0x406e9020, 0x3769: 0x406e9220, 0x376a: 0x406e9420, 0x376b: 0x406e9620, - 0x376c: 0x406e9820, 0x376d: 0x406e9a20, 0x376e: 0x406e9c20, 0x376f: 0x406e9e20, - 0x3770: 0x406ea020, 0x3771: 0x406ea220, 0x3772: 0x406ea420, 0x3773: 0x406ea620, - 0x3774: 0x406ea820, 0x3775: 0x406eaa20, 0x3776: 0x406eac20, 0x3777: 0x406eae20, - 0x3778: 0x406eb020, 0x3779: 0x406eb220, 0x377a: 0x406eb420, 0x377b: 0x406eb620, - 0x377c: 0x406eb820, 0x377d: 0x406eba20, 0x377e: 0x406ebc20, 0x377f: 0x406ebe20, - // Block 0xde, offset 0x3780 - 0x3780: 0x406ec020, 0x3781: 0x406ec220, 0x3782: 0x406ec420, 0x3783: 0x406ec620, - 0x3784: 0x406ec820, 0x3785: 0x406eca20, 0x3786: 0x406ecc20, 0x3787: 0x406ece20, - 0x3788: 0x406ed020, 0x3789: 0x406ed220, 0x378a: 0x406ed420, 0x378b: 0x406ed620, - 0x378c: 0x406ed820, 0x378d: 0x406eda20, 0x378e: 0x406edc20, 0x378f: 0x406ede20, - 0x3790: 0x406ee020, 0x3791: 0x406ee220, 0x3792: 0x406ee420, 0x3793: 0x406ee620, - 0x3794: 0x406ee820, 0x3795: 0x406eea20, 0x3796: 0x406eec20, 0x3797: 0x406eee20, - 0x3798: 0x406ef020, 0x3799: 0x406ef220, 0x379a: 0x406ef420, 0x379b: 0x406ef620, - 0x379c: 0x406ef820, 0x379d: 0x406efa20, 0x379e: 0x406efc20, 0x379f: 0x406efe20, - 0x37a0: 0x406f0020, 0x37a1: 0x406f0220, 0x37a2: 0x406f0420, 0x37a3: 0x406f0620, - 0x37a4: 0x406f0820, 0x37a5: 0x406f0a20, 0x37a6: 0x406f0c20, 0x37a7: 0x406f0e20, - 0x37a8: 0x406f1020, 0x37a9: 0x406f1220, 0x37aa: 0x406f1420, 0x37ab: 0x406f1620, - 0x37ac: 0x406f1820, 0x37ad: 0x406f1a20, 0x37ae: 0x406f1c20, 0x37af: 0x406f1e20, - 0x37b0: 0x406f2020, 0x37b1: 0x406f2220, 0x37b2: 0x406f2420, 0x37b3: 0x406f2620, - 0x37b4: 0x406f2820, 0x37b5: 0x406f2a20, 0x37b6: 0x406f2c20, 0x37b7: 0x406f2e20, - 0x37b8: 0x406f3020, 0x37b9: 0x406f3220, 0x37ba: 0x406f3420, 0x37bb: 0x406f3620, - 0x37bc: 0x406f3820, 0x37bd: 0x406f3a20, 0x37be: 0x406f3c20, 0x37bf: 0x406f3e20, - // Block 0xdf, offset 0x37c0 - 0x37c0: 0x406f4020, 0x37c1: 0x406f4220, 0x37c2: 0x406f4420, 0x37c3: 0x406f4620, - 0x37c4: 0x406f4820, 0x37c5: 0x406f4a20, 0x37c6: 0x406f4c20, 0x37c7: 0x406f4e20, - 0x37c8: 0x406f5020, 0x37c9: 0x406f5220, 0x37ca: 0x406f5420, 0x37cb: 0x406f5620, - 0x37cc: 0x406f5820, - 0x37d0: 0x401a9020, 0x37d1: 0x401a9220, 0x37d2: 0x401a9420, 0x37d3: 0x401a9620, - 0x37d4: 0x401a9820, 0x37d5: 0x401a9a20, 0x37d6: 0x401a9c20, 0x37d7: 0x401a9e20, - 0x37d8: 0x401aa020, 0x37d9: 0x401aa220, 0x37da: 0x401aa420, 0x37db: 0x401aa620, - 0x37dc: 0x401aa820, 0x37dd: 0x401aaa20, 0x37de: 0x401aac20, 0x37df: 0x401aae20, - 0x37e0: 0x401ab020, 0x37e1: 0x401ab220, 0x37e2: 0x401ab420, 0x37e3: 0x401ab620, - 0x37e4: 0x401ab820, 0x37e5: 0x401aba20, 0x37e6: 0x401abc20, 0x37e7: 0x401abe20, - 0x37e8: 0x401ac020, 0x37e9: 0x401ac220, 0x37ea: 0x401ac420, 0x37eb: 0x401ac620, - 0x37ec: 0x401ac820, 0x37ed: 0x401aca20, 0x37ee: 0x401acc20, 0x37ef: 0x401ace20, - 0x37f0: 0x401ad020, 0x37f1: 0x401ad220, 0x37f2: 0x401ad420, 0x37f3: 0x401ad620, - 0x37f4: 0x401ad820, 0x37f5: 0x401ada20, 0x37f6: 0x401adc20, 0x37f7: 0x401ade20, - 0x37f8: 0x401ae020, 0x37f9: 0x401ae220, 0x37fa: 0x401ae420, 0x37fb: 0x401ae620, - 0x37fc: 0x401ae820, 0x37fd: 0x401aea20, 0x37fe: 0x401aec20, 0x37ff: 0x401aee20, - // Block 0xe0, offset 0x3800 - 0x3800: 0x401af020, 0x3801: 0x401af220, 0x3802: 0x401af420, 0x3803: 0x401af620, - 0x3804: 0x401af820, 0x3805: 0x401afa20, 0x3806: 0x401afc20, - 0x3810: 0x406f6620, 0x3811: 0x406f6820, 0x3812: 0x406f6a20, 0x3813: 0x406f6c20, - 0x3814: 0x406f6e20, 0x3815: 0x406f7020, 0x3816: 0x406f7220, 0x3817: 0x406f7420, - 0x3818: 0x406f7620, 0x3819: 0x406f7820, 0x381a: 0x406f7a20, 0x381b: 0x406f7c20, - 0x381c: 0x406f7e20, 0x381d: 0x406f8020, 0x381e: 0x406f8220, 0x381f: 0x406f8420, - 0x3820: 0x406f8620, 0x3821: 0x406f8820, 0x3822: 0x406f8a20, 0x3823: 0x406f8c20, - 0x3824: 0x406f8e20, 0x3825: 0x406f9020, 0x3826: 0x406f9220, 0x3827: 0x406f9420, - 0x3828: 0x406f9620, 0x3829: 0x406f9820, 0x382a: 0x406f9e20, 0x382b: 0x406f9a20, - 0x382c: 0x406fa020, 0x382d: 0x406f9c20, 0x382e: 0x406fa220, 0x382f: 0x406fa420, - 0x3830: 0x406fa620, 0x3831: 0x406fa820, 0x3832: 0x406faa20, 0x3833: 0x406fac20, - 0x3834: 0x406fae20, 0x3835: 0x406fb020, 0x3836: 0x406fb220, 0x3837: 0x406fb420, - 0x3838: 0x406f5a20, 0x3839: 0x406f5c20, 0x383a: 0x406f5e20, 0x383b: 0x406f6020, - 0x383c: 0x406f6420, 0x383d: 0x406f6220, 0x383e: 0x40025620, 0x383f: 0x4002fe20, - // Block 0xe1, offset 0x3840 - 0x3840: 0x405b8020, 0x3841: 0x405b8220, 0x3842: 0x405b8420, 0x3843: 0x405b8620, - 0x3844: 0x405b8820, 0x3845: 0x405b8a20, 0x3846: 0x405b8c20, 0x3847: 0x405b8e20, - 0x3848: 0x405b9020, 0x3849: 0x405b9220, 0x384a: 0x405b9420, 0x384b: 0x405b9620, - 0x384c: 0x405b9820, 0x384d: 0x405b9a20, 0x384e: 0x405b9c20, 0x384f: 0x405b9e20, - 0x3850: 0x405ba020, 0x3851: 0x405ba220, 0x3852: 0x405ba420, 0x3853: 0x405ba620, - 0x3854: 0x405ba820, 0x3855: 0x405baa20, 0x3856: 0x405bac20, 0x3857: 0x405bae20, - 0x3858: 0x405bb020, 0x3859: 0x405bb220, 0x385a: 0x405bb420, 0x385b: 0x405bb620, - 0x385c: 0x405bb820, 0x385d: 0x405bba20, 0x385e: 0x405bbc20, 0x385f: 0x405bbe20, - 0x3860: 0x405bc020, 0x3861: 0x405bc220, 0x3862: 0x405bc420, 0x3863: 0x405bc620, - 0x3864: 0x405bc820, 0x3865: 0x405bca20, 0x3866: 0x405bcc20, 0x3867: 0x405bce20, - 0x3868: 0x405bd020, 0x3869: 0x405bd220, 0x386a: 0x405bd420, 0x386b: 0x405bd620, - 0x386c: 0x405bd820, 0x386d: 0x405bda20, 0x386e: 0x405bdc20, 0x386f: 0x405bde20, - 0x3870: 0x405be020, 0x3871: 0x405be220, 0x3872: 0x405be420, 0x3873: 0x405be620, - 0x3874: 0x405be820, 0x3875: 0x405bea20, 0x3876: 0x405bec20, 0x3877: 0x405bee20, - 0x3878: 0x405bf020, 0x3879: 0x405bf220, 0x387a: 0x405bf420, 0x387b: 0x405bf620, - 0x387c: 0x405bf820, 0x387d: 0x405bfa20, 0x387e: 0x405bfc20, 0x387f: 0x405bfe20, - // Block 0xe2, offset 0x3880 - 0x3880: 0x405c0020, 0x3881: 0x405c0220, 0x3882: 0x405c0420, 0x3883: 0x405c0620, - 0x3884: 0x405c0820, 0x3885: 0x405c0a20, 0x3886: 0x405c0c20, 0x3887: 0x405c0e20, - 0x3888: 0x405c1020, 0x3889: 0x405c1220, 0x388a: 0x405c1420, 0x388b: 0x405c1620, - 0x388c: 0x405c1820, 0x388d: 0x405c1a20, 0x388e: 0x405c1c20, 0x388f: 0x405c1e20, - 0x3890: 0x405c2020, 0x3891: 0x405c2220, 0x3892: 0x405c2420, 0x3893: 0x405c2620, - 0x3894: 0x405c2820, 0x3895: 0x405c2a20, 0x3896: 0x405c2c20, 0x3897: 0x405c2e20, - 0x3898: 0x405c3020, 0x3899: 0x405c3220, 0x389a: 0x405c3420, 0x389b: 0x405c3620, - 0x389c: 0x405c3820, 0x389d: 0x405c3a20, 0x389e: 0x405c3c20, 0x389f: 0x405c3e20, - 0x38a0: 0x405c4020, 0x38a1: 0x405c4220, 0x38a2: 0x405c4420, 0x38a3: 0x405c4620, - 0x38a4: 0x405c4820, 0x38a5: 0x405c4a20, 0x38a6: 0x405c4c20, 0x38a7: 0x405c4e20, - 0x38a8: 0x405c5020, 0x38a9: 0x405c5220, 0x38aa: 0x405c5420, 0x38ab: 0x405c5620, - 0x38ac: 0x405c5820, 0x38ad: 0x405c5a20, 0x38ae: 0x405c5c20, 0x38af: 0x405c5e20, - 0x38b0: 0x405c6020, 0x38b1: 0x405c6220, 0x38b2: 0x405c6420, 0x38b3: 0x405c6620, - 0x38b4: 0x405c6820, 0x38b5: 0x405c6a20, 0x38b6: 0x405c6c20, 0x38b7: 0x405c6e20, - 0x38b8: 0x405c7020, 0x38b9: 0x405c7220, 0x38ba: 0x405c7420, 0x38bb: 0x405c7620, - 0x38bc: 0x405c7820, 0x38bd: 0x405c7a20, 0x38be: 0x405c7c20, 0x38bf: 0x405c7e20, - // Block 0xe3, offset 0x38c0 - 0x38c0: 0x405c8020, 0x38c1: 0x405c8220, 0x38c2: 0x405c8420, 0x38c3: 0x405c8620, - 0x38c4: 0x405c8820, 0x38c5: 0x405c8a20, 0x38c6: 0x405c8c20, 0x38c7: 0x405c8e20, - 0x38c8: 0x405c9020, 0x38c9: 0x405c9220, 0x38ca: 0x405c9420, 0x38cb: 0x405c9620, - 0x38cc: 0x405c9820, 0x38cd: 0x405c9a20, 0x38ce: 0x405c9c20, 0x38cf: 0x405c9e20, - 0x38d0: 0x405ca020, 0x38d1: 0x405ca220, 0x38d2: 0x405ca420, 0x38d3: 0x405ca620, - 0x38d4: 0x405ca820, 0x38d5: 0x405caa20, 0x38d6: 0x405cac20, 0x38d7: 0x405cae20, - 0x38d8: 0x405cb020, 0x38d9: 0x405cb220, 0x38da: 0x405cb420, 0x38db: 0x405cb620, - 0x38dc: 0x405cb820, 0x38dd: 0x405cba20, 0x38de: 0x405cbc20, 0x38df: 0x405cbe20, - 0x38e0: 0x405cc020, 0x38e1: 0x405cc220, 0x38e2: 0x405cc420, 0x38e3: 0x405cc620, - 0x38e4: 0x405cc820, 0x38e5: 0x405cca20, 0x38e6: 0x405ccc20, 0x38e7: 0x405cce20, - 0x38e8: 0x405cd020, 0x38e9: 0x405cd220, 0x38ea: 0x405cd420, 0x38eb: 0x405cd620, - 0x38ec: 0x405cd820, 0x38ed: 0x405cda20, 0x38ee: 0x405cdc20, 0x38ef: 0x405cde20, - 0x38f0: 0x405ce020, 0x38f1: 0x405ce220, 0x38f2: 0x405ce420, 0x38f3: 0x405ce620, - 0x38f4: 0x405ce820, 0x38f5: 0x405cea20, 0x38f6: 0x405cec20, 0x38f7: 0x405cee20, - 0x38f8: 0x405cf020, 0x38f9: 0x405cf220, 0x38fa: 0x405cf420, 0x38fb: 0x405cf620, - 0x38fc: 0x405cf820, 0x38fd: 0x405cfa20, 0x38fe: 0x405cfc20, 0x38ff: 0x405cfe20, - // Block 0xe4, offset 0x3900 - 0x3900: 0x405d0020, 0x3901: 0x405d0220, 0x3902: 0x405d0420, 0x3903: 0x405d0620, - 0x3904: 0x405d0820, 0x3905: 0x405d0a20, 0x3906: 0x405d0c20, 0x3907: 0x405d0e20, - 0x3908: 0x405d1020, 0x3909: 0x405d1220, 0x390a: 0x405d1420, 0x390b: 0x405d1620, - 0x390c: 0x405d1820, 0x390d: 0x405d1a20, 0x390e: 0x405d1c20, 0x390f: 0x405d1e20, - 0x3910: 0x405d2020, 0x3911: 0x405d2220, 0x3912: 0x405d2420, 0x3913: 0x405d2620, - 0x3914: 0x405d2820, 0x3915: 0x405d2a20, 0x3916: 0x405d2c20, 0x3917: 0x405d2e20, - 0x3918: 0x405d3020, 0x3919: 0x405d3220, 0x391a: 0x405d3420, 0x391b: 0x405d3620, - 0x391c: 0x405d3820, 0x391d: 0x405d3a20, 0x391e: 0x405d3c20, 0x391f: 0x405d3e20, - 0x3920: 0x405d4020, 0x3921: 0x405d4220, 0x3922: 0x405d4420, 0x3923: 0x405d4620, - 0x3924: 0x405d4820, 0x3925: 0x405d4a20, 0x3926: 0x405d4c20, 0x3927: 0x405d4e20, - 0x3928: 0x405d5020, 0x3929: 0x405d5220, 0x392a: 0x405d5420, 0x392b: 0x405d5620, - 0x392c: 0x405d5820, 0x392d: 0x405d5a20, 0x392e: 0x405d5c20, 0x392f: 0x405d5e20, - 0x3930: 0x405d6020, 0x3931: 0x405d6220, 0x3932: 0x405d6420, 0x3933: 0x405d6620, - 0x3934: 0x405d6820, 0x3935: 0x405d6a20, 0x3936: 0x405d6c20, 0x3937: 0x405d6e20, - 0x3938: 0x405d7020, 0x3939: 0x405d7220, 0x393a: 0x405d7420, 0x393b: 0x405d7620, - 0x393c: 0x405d7820, 0x393d: 0x405d7a20, 0x393e: 0x405d7c20, 0x393f: 0x405d7e20, - // Block 0xe5, offset 0x3940 - 0x3940: 0x405d8020, 0x3941: 0x405d8220, 0x3942: 0x405d8420, 0x3943: 0x405d8620, - 0x3944: 0x405d8820, 0x3945: 0x405d8a20, 0x3946: 0x405d8c20, 0x3947: 0x405d8e20, - 0x3948: 0x405d9020, 0x3949: 0x405d9220, 0x394a: 0x405d9420, 0x394b: 0x405d9620, - 0x394c: 0x405d9820, 0x394d: 0x40025820, 0x394e: 0x40030020, 0x394f: 0x4002d820, - 0x3950: 0x005c3084, 0x3951: 0x005c5484, 0x3952: 0x005c8e84, 0x3953: 0xe00020fb, - 0x3954: 0xe00020fe, 0x3955: 0xe0002101, 0x3956: 0xe0002104, 0x3957: 0xe0002107, - 0x3958: 0xe000210a, 0x3959: 0xe000210d, 0x395a: 0xe0002110, 0x395b: 0xe0002113, - 0x395c: 0xe0002116, 0x395d: 0xe0002119, 0x395e: 0xe000211c, 0x395f: 0xe000211f, - 0x3960: 0xe00001cd, 0x3961: 0xe0000261, 0x3962: 0xe0000379, 0x3963: 0xe0000453, - 0x3964: 0xe0000528, 0x3965: 0xe00005f2, 0x3966: 0xe00006bd, 0x3967: 0xe0000765, - 0x3968: 0xe0000811, 0x3969: 0xe00008b6, 0x396a: 0x005c5c84, 0x396b: 0x005d2284, - // Block 0xe6, offset 0x3980 - 0x3980: 0x0033ec88, 0x3981: 0x4033ec20, 0x3982: 0x0033fa88, 0x3983: 0x4033fa20, - 0x3984: 0x00340488, 0x3985: 0x40340420, 0x3986: 0x00343488, 0x3987: 0x40343420, - 0x3988: 0x00344e88, 0x3989: 0x40344e20, 0x398a: 0x0035a288, 0x398b: 0x4035a220, - 0x398c: 0x0035f088, 0x398d: 0x4035f020, 0x398e: 0x00366e88, 0x398f: 0x40366e20, - 0x3990: 0x00367c88, 0x3991: 0x40367c20, 0x3992: 0x0036a688, 0x3993: 0x4036a620, - 0x3994: 0x0036c088, 0x3995: 0x4036c020, 0x3996: 0x0036c288, 0x3997: 0x4036c220, - 0x3998: 0x0036de88, 0x3999: 0x4036de20, 0x399a: 0x0036e888, 0x399b: 0x4036e820, - 0x399c: 0x0036f288, 0x399d: 0x4036f220, 0x399e: 0x00372488, 0x399f: 0x40372420, - 0x39a0: 0x00360a88, 0x39a1: 0x40360a20, 0x39a2: 0x00339e88, 0x39a3: 0x40339e20, - 0x39a4: 0x0034a288, 0x39a5: 0x4034a220, 0x39a6: 0x0034b888, 0x39a7: 0x4034b820, - 0x39a8: 0x0034ee8a, 0x39a9: 0x0034ee84, 0x39aa: 0x0034ee8a, 0x39ab: 0x0034ee84, - 0x39ac: 0x0034ee8a, 0x39ad: 0x0034ee84, 0x39ae: 0x0034ee84, 0x39af: 0xae608402, - 0x39b0: 0xa0000000, 0x39b1: 0xa0000000, 0x39b2: 0xa0000000, 0x39b3: 0x4004e020, - 0x39b4: 0x84e619e1, 0x39b5: 0x84e61a0a, 0x39b6: 0x84e61a1b, 0x39b7: 0x84e61ab9, - 0x39b8: 0x84e61b3a, 0x39b9: 0x84e61b3f, 0x39ba: 0x84e61b47, 0x39bb: 0x84e61af0, - 0x39bc: 0xae605f02, 0x39bd: 0xae605f02, 0x39be: 0x40054c20, 0x39bf: 0x40367220, - // Block 0xe7, offset 0x39c0 - 0x39c0: 0x00339488, 0x39c1: 0x40339420, 0x39c2: 0x00341288, 0x39c3: 0x40341220, - 0x39c4: 0x0033d288, 0x39c5: 0x4033d220, 0x39c6: 0x00364288, 0x39c7: 0x40364220, - 0x39c8: 0x00340e88, 0x39c9: 0x40340e20, 0x39ca: 0x00356088, 0x39cb: 0x40356020, - 0x39cc: 0x00355488, 0x39cd: 0x40355420, 0x39ce: 0x00360c88, 0x39cf: 0x40360c20, - 0x39d0: 0x00361688, 0x39d1: 0x40361620, 0x39d2: 0x00362088, 0x39d3: 0x40362020, - 0x39d4: 0x0035de88, 0x39d5: 0x4035de20, 0x39d6: 0x00366488, 0x39d7: 0x40366420, - 0x39df: 0x84e61b67, - 0x39e0: 0x405d9a20, 0x39e1: 0x405d9c20, 0x39e2: 0x405d9e20, 0x39e3: 0x405da020, - 0x39e4: 0x405da220, 0x39e5: 0x405da420, 0x39e6: 0x405da620, 0x39e7: 0x405da820, - 0x39e8: 0x405daa20, 0x39e9: 0x405dac20, 0x39ea: 0x405dae20, 0x39eb: 0x405db020, - 0x39ec: 0x405db220, 0x39ed: 0x405db420, 0x39ee: 0x405db620, 0x39ef: 0x405db820, - 0x39f0: 0x405dba20, 0x39f1: 0x405dbc20, 0x39f2: 0x405dbe20, 0x39f3: 0x405dc020, - 0x39f4: 0x405dc220, 0x39f5: 0x405dc420, 0x39f6: 0x405dc620, 0x39f7: 0x405dc820, - 0x39f8: 0x405dca20, 0x39f9: 0x405dcc20, 0x39fa: 0x405dce20, 0x39fb: 0x405dd020, - 0x39fc: 0x405dd220, 0x39fd: 0x405dd420, 0x39fe: 0x405dd620, 0x39ff: 0x405dd820, - // Block 0xe8, offset 0x3a00 - 0x3a00: 0x405dda20, 0x3a01: 0x405ddc20, 0x3a02: 0x405dde20, 0x3a03: 0x405de020, - 0x3a04: 0x405de220, 0x3a05: 0x405de420, 0x3a06: 0x405de620, 0x3a07: 0x405de820, - 0x3a08: 0x405dea20, 0x3a09: 0x405dec20, 0x3a0a: 0x405dee20, 0x3a0b: 0x405df020, - 0x3a0c: 0x405df220, 0x3a0d: 0x405df420, 0x3a0e: 0x405df620, 0x3a0f: 0x405df820, - 0x3a10: 0x405dfa20, 0x3a11: 0x405dfc20, 0x3a12: 0x405dfe20, 0x3a13: 0x405e0020, - 0x3a14: 0x405e0220, 0x3a15: 0x405e0420, 0x3a16: 0x405e0620, 0x3a17: 0x405e0820, - 0x3a18: 0x405e0a20, 0x3a19: 0x405e0c20, 0x3a1a: 0x405e0e20, 0x3a1b: 0x405e1020, - 0x3a1c: 0x405e1220, 0x3a1d: 0x405e1420, 0x3a1e: 0x405e1620, 0x3a1f: 0x405e1820, - 0x3a20: 0x405e1a20, 0x3a21: 0x405e1c20, 0x3a22: 0x405e1e20, 0x3a23: 0x405e2020, - 0x3a24: 0x405e2220, 0x3a25: 0x405e2420, 0x3a26: 0x405e2620, 0x3a27: 0x405e2820, - 0x3a28: 0x405e2a20, 0x3a29: 0x405e2c20, 0x3a2a: 0x405e2e20, 0x3a2b: 0x405e3020, - 0x3a2c: 0x405e3220, 0x3a2d: 0x405e3420, 0x3a2e: 0x405e3620, 0x3a2f: 0x405e3820, - 0x3a30: 0xae60ef02, 0x3a31: 0xae60f002, 0x3a32: 0x40038220, 0x3a33: 0x40030220, - 0x3a34: 0x4002b820, 0x3a35: 0x40025a20, 0x3a36: 0x40026a20, 0x3a37: 0x4002da20, - // Block 0xe9, offset 0x3a40 - 0x3a40: 0x4006ba20, 0x3a41: 0x4006bc20, 0x3a42: 0x4006be20, 0x3a43: 0x4006c020, - 0x3a44: 0x4006c220, 0x3a45: 0x4006c420, 0x3a46: 0x4006c620, 0x3a47: 0x4006c820, - 0x3a48: 0x4006ca20, 0x3a49: 0x4006cc20, 0x3a4a: 0x4006ce20, 0x3a4b: 0x4006d020, - 0x3a4c: 0x4006d220, 0x3a4d: 0x4006d420, 0x3a4e: 0x4006d620, 0x3a4f: 0x4006d820, - 0x3a50: 0x4006da20, 0x3a51: 0x4006dc20, 0x3a52: 0x4006de20, 0x3a53: 0x4006e020, - 0x3a54: 0x4006e220, 0x3a55: 0x4006e420, 0x3a56: 0x4006e620, 0x3a57: 0x4006e820, - 0x3a58: 0x4006ea20, 0x3a59: 0x4006ec20, 0x3a5a: 0x4006ee20, 0x3a5b: 0x4006f020, - 0x3a5c: 0x4006f220, 0x3a5d: 0x4006f420, 0x3a5e: 0x4006f620, 0x3a5f: 0x4006f820, - 0x3a60: 0x4006fa20, 0x3a61: 0x4006fc20, 0x3a62: 0x0031e488, 0x3a63: 0x4031e420, - 0x3a64: 0x0031f888, 0x3a65: 0x4031f820, 0x3a66: 0x002d8c88, 0x3a67: 0x402d8c20, - 0x3a68: 0xe0000fd5, 0x3a69: 0xe0000fd2, 0x3a6a: 0x0031ae88, 0x3a6b: 0x4031ae20, - 0x3a6c: 0x0031b088, 0x3a6d: 0x4031b020, 0x3a6e: 0x0031b288, 0x3a6f: 0x4031b220, - 0x3a70: 0x402d1020, 0x3a71: 0x402fee20, 0x3a72: 0xe00009cf, 0x3a73: 0xe00009cc, - 0x3a74: 0xe00009ff, 0x3a75: 0xe00009fc, 0x3a76: 0xe0000a05, 0x3a77: 0xe0000a02, - 0x3a78: 0xe0000a0e, 0x3a79: 0xe0000a0b, 0x3a7a: 0xe0000a15, 0x3a7b: 0xe0000a11, - 0x3a7c: 0xe0000a1c, 0x3a7d: 0xe0000a19, 0x3a7e: 0x002c6088, 0x3a7f: 0x402c6020, - // Block 0xea, offset 0x3a80 - 0x3a80: 0x002e1488, 0x3a81: 0x402e1420, 0x3a82: 0x002e1688, 0x3a83: 0x402e1620, - 0x3a84: 0x002e1888, 0x3a85: 0x402e1820, 0x3a86: 0x002e3288, 0x3a87: 0x402e3220, - 0x3a88: 0x002e3688, 0x3a89: 0x402e3620, 0x3a8a: 0x002f1888, 0x3a8b: 0x402f1820, - 0x3a8c: 0x002f0888, 0x3a8d: 0x402f0820, 0x3a8e: 0xe0000ea1, 0x3a8f: 0xe0000e9e, - 0x3a90: 0x002f3888, 0x3a91: 0x402f3820, 0x3a92: 0x002f4688, 0x3a93: 0x402f4620, - 0x3a94: 0x002f4888, 0x3a95: 0x402f4820, 0x3a96: 0x002f5e88, 0x3a97: 0x402f5e20, - 0x3a98: 0x002f6088, 0x3a99: 0x402f6020, 0x3a9a: 0x002f8a88, 0x3a9b: 0x402f8a20, - 0x3a9c: 0x002fe488, 0x3a9d: 0x402fe420, 0x3a9e: 0x0030c888, 0x3a9f: 0x4030c820, - 0x3aa0: 0xe00010c6, 0x3aa1: 0xe00010c3, 0x3aa2: 0x00316288, 0x3aa3: 0x40316220, - 0x3aa4: 0x00319088, 0x3aa5: 0x40319020, 0x3aa6: 0x00319288, 0x3aa7: 0x40319220, - 0x3aa8: 0x00319c88, 0x3aa9: 0x40319c20, 0x3aaa: 0x00319e88, 0x3aab: 0x40319e20, - 0x3aac: 0x0031a088, 0x3aad: 0x4031a020, 0x3aae: 0x0031a288, 0x3aaf: 0x4031a220, - 0x3ab0: 0x0031a294, 0x3ab1: 0x402c9420, 0x3ab2: 0x402e6620, 0x3ab3: 0x402e9c20, - 0x3ab4: 0x402ed820, 0x3ab5: 0x402fe020, 0x3ab6: 0x402fe220, 0x3ab7: 0x40306220, - 0x3ab8: 0x4031a420, 0x3ab9: 0xe0000abc, 0x3aba: 0xe0000ab9, 0x3abb: 0xe0000b92, - 0x3abc: 0xe0000b8f, 0x3abd: 0xe0000bdc, 0x3abe: 0x002d5688, 0x3abf: 0x402d5620, - // Block 0xeb, offset 0x3ac0 - 0x3ac0: 0x002e7088, 0x3ac1: 0x402e7020, 0x3ac2: 0xe0000f08, 0x3ac3: 0xe0000f05, - 0x3ac4: 0xe0000f6d, 0x3ac5: 0xe0000f6a, 0x3ac6: 0xe0000fb7, 0x3ac7: 0xe0000fb4, - 0x3ac8: 0x4006fe20, 0x3ac9: 0x40070020, 0x3aca: 0x40070220, 0x3acb: 0x0031e688, - 0x3acc: 0x4031e620, 0x3acd: 0x00308888, 0x3ace: 0x402e5c20, - 0x3ad0: 0x002ec488, 0x3ad1: 0x402ec420, 0x3ad2: 0x002c4c88, 0x3ad3: 0x402c4c20, - 0x3ae0: 0xe0000bd6, 0x3ae1: 0xe0000bd3, 0x3ae2: 0xe0000ca5, 0x3ae3: 0xe0000ca2, - 0x3ae4: 0xe0000d75, 0x3ae5: 0xe0000d72, 0x3ae6: 0xe0000ee2, 0x3ae7: 0xe0000edf, - 0x3ae8: 0xe0000f4d, 0x3ae9: 0xe0000f4a, 0x3aea: 0x002d8088, - // Block 0xec, offset 0x3b00 - 0x3b38: 0xf0001414, 0x3b39: 0xe0000e97, 0x3b3a: 0x4030a820, 0x3b3b: 0x402d2020, - 0x3b3c: 0x402f4a20, 0x3b3d: 0x402e9820, 0x3b3e: 0x402db220, 0x3b3f: 0x402e9a20, - // Block 0xed, offset 0x3b40 - 0x3b40: 0x4045aa20, 0x3b41: 0x4045ac20, 0x3b42: 0x4045ae20, 0x3b43: 0x4045b020, - 0x3b44: 0x4045b220, 0x3b45: 0x4045b420, 0x3b46: 0x820922db, 0x3b47: 0x4045b820, - 0x3b48: 0x4045ba20, 0x3b49: 0x4045bc20, 0x3b4a: 0x4045be20, 0x3b4b: 0xa000f302, - 0x3b4c: 0x4045c020, 0x3b4d: 0x4045c220, 0x3b4e: 0x4045c420, 0x3b4f: 0x4045c620, - 0x3b50: 0x4045c820, 0x3b51: 0x4045ca20, 0x3b52: 0x4045cc20, 0x3b53: 0x4045ce20, - 0x3b54: 0x4045d020, 0x3b55: 0x4045d220, 0x3b56: 0x4045d420, 0x3b57: 0x4045d620, - 0x3b58: 0x4045d820, 0x3b59: 0x4045da20, 0x3b5a: 0x4045dc20, 0x3b5b: 0x4045de20, - 0x3b5c: 0x4045e020, 0x3b5d: 0x4045e220, 0x3b5e: 0x4045e420, 0x3b5f: 0x4045e620, - 0x3b60: 0x4045e820, 0x3b61: 0x4045ea20, 0x3b62: 0x4045ec20, 0x3b63: 0x4045ee20, - 0x3b64: 0x4045f020, 0x3b65: 0x4045f220, 0x3b66: 0x4045f420, 0x3b67: 0x4045f620, - 0x3b68: 0x40075020, 0x3b69: 0x40075220, 0x3b6a: 0x40075420, 0x3b6b: 0x40075620, - 0x3b70: 0x40284820, 0x3b71: 0x40284a20, 0x3b72: 0x40284c20, 0x3b73: 0x40284e20, - 0x3b74: 0x40285020, 0x3b75: 0x40285220, 0x3b76: 0x40075820, 0x3b77: 0x40075a20, - 0x3b78: 0x4027f020, 0x3b79: 0x40075c20, - // Block 0xee, offset 0x3b80 - 0x3b80: 0x404baa20, 0x3b81: 0x404bac20, 0x3b82: 0x404bae20, 0x3b83: 0x404bb020, - 0x3b84: 0x404bb220, 0x3b85: 0x404bb420, 0x3b86: 0x404bb620, 0x3b87: 0x404bb820, - 0x3b88: 0x404bc220, 0x3b89: 0x404bc420, 0x3b8a: 0x404bc620, 0x3b8b: 0x404bc820, - 0x3b8c: 0x404bca20, 0x3b8d: 0x404bcc20, 0x3b8e: 0x404bce20, 0x3b8f: 0x404bd020, - 0x3b90: 0x404bd220, 0x3b91: 0x404bd420, 0x3b92: 0x404bd620, 0x3b93: 0x404bd820, - 0x3b94: 0x404bdc20, 0x3b95: 0x404bde20, 0x3b96: 0x404be020, 0x3b97: 0x404be220, - 0x3b98: 0x404be820, 0x3b99: 0x404bee20, 0x3b9a: 0x404bf020, 0x3b9b: 0x404bf420, - 0x3b9c: 0x404bf620, 0x3b9d: 0x404bfc20, 0x3b9e: 0x404c0620, 0x3b9f: 0x404c0820, - 0x3ba0: 0x404c0a20, 0x3ba1: 0x404c0c20, 0x3ba2: 0x404bfe20, 0x3ba3: 0x404c0020, - 0x3ba4: 0x404c0220, 0x3ba5: 0x404c0420, 0x3ba6: 0x404c0e20, 0x3ba7: 0x404bda20, - 0x3ba8: 0x404be420, 0x3ba9: 0x404bba20, 0x3baa: 0x404bbc20, 0x3bab: 0x404bbe20, - 0x3bac: 0x404bc020, 0x3bad: 0x404be620, 0x3bae: 0x404bf220, 0x3baf: 0x404bf820, - 0x3bb0: 0x404bfa20, 0x3bb1: 0x404bea20, 0x3bb2: 0x404bec20, 0x3bb3: 0x404c1020, - 0x3bb4: 0x4005e820, 0x3bb5: 0x4005ea20, 0x3bb6: 0x40031820, 0x3bb7: 0x40031a20, - // Block 0xef, offset 0x3bc0 - 0x3bc0: 0xa000f302, 0x3bc1: 0xa000f402, 0x3bc2: 0x4045f820, 0x3bc3: 0x4045fa20, - 0x3bc4: 0x4045fc20, 0x3bc5: 0x4045fe20, 0x3bc6: 0x40460020, 0x3bc7: 0x40460220, - 0x3bc8: 0x40460420, 0x3bc9: 0x40460620, 0x3bca: 0x40460820, 0x3bcb: 0x40460a20, - 0x3bcc: 0x40460c20, 0x3bcd: 0x40460e20, 0x3bce: 0x40461020, 0x3bcf: 0x40461220, - 0x3bd0: 0x40461420, 0x3bd1: 0x40461620, 0x3bd2: 0x40461820, 0x3bd3: 0x40461a20, - 0x3bd4: 0x40461c20, 0x3bd5: 0x40461e20, 0x3bd6: 0x40462020, 0x3bd7: 0x40462220, - 0x3bd8: 0x40462420, 0x3bd9: 0x40462620, 0x3bda: 0x40462820, 0x3bdb: 0x40462a20, - 0x3bdc: 0x40462c20, 0x3bdd: 0x40462e20, 0x3bde: 0x40463020, 0x3bdf: 0x40463220, - 0x3be0: 0x40463420, 0x3be1: 0x40463620, 0x3be2: 0x40463820, 0x3be3: 0x40463a20, - 0x3be4: 0x40463c20, 0x3be5: 0x40463e20, 0x3be6: 0x40464020, 0x3be7: 0x40464220, - 0x3be8: 0x40464420, 0x3be9: 0x40464620, 0x3bea: 0x40464820, 0x3beb: 0x40464a20, - 0x3bec: 0x40464c20, 0x3bed: 0x40464e20, 0x3bee: 0x40465020, 0x3bef: 0x40465220, - 0x3bf0: 0x40465420, 0x3bf1: 0x40465620, 0x3bf2: 0x40465820, 0x3bf3: 0x40465a20, - 0x3bf4: 0x40465c20, 0x3bf5: 0x40465e20, 0x3bf6: 0x40466020, 0x3bf7: 0x40466220, - 0x3bf8: 0x40466420, 0x3bf9: 0x40466620, 0x3bfa: 0x40466820, 0x3bfb: 0x40466a20, - 0x3bfc: 0x40466c20, 0x3bfd: 0x40466e20, 0x3bfe: 0x40467020, 0x3bff: 0x40467220, - // Block 0xf0, offset 0x3c00 - 0x3c00: 0x40467420, 0x3c01: 0x40467620, 0x3c02: 0x40467820, 0x3c03: 0x40467a20, - 0x3c04: 0x8209233e, - 0x3c0e: 0x40031020, 0x3c0f: 0x40031220, - 0x3c10: 0xe000018b, 0x3c11: 0xe000021c, 0x3c12: 0xe0000337, 0x3c13: 0xe0000411, - 0x3c14: 0xe00004e6, 0x3c15: 0xe00005b0, 0x3c16: 0xe000067b, 0x3c17: 0xe0000723, - 0x3c18: 0xe00007cf, 0x3c19: 0xe0000874, - 0x3c20: 0xae600000, 0x3c21: 0xae600000, 0x3c22: 0xae600000, 0x3c23: 0xae600000, - 0x3c24: 0xae600000, 0x3c25: 0xae600000, 0x3c26: 0xae600000, 0x3c27: 0xae600000, - 0x3c28: 0xae600000, 0x3c29: 0xae600000, 0x3c2a: 0xae600000, 0x3c2b: 0xae600000, - 0x3c2c: 0xae600000, 0x3c2d: 0xae600000, 0x3c2e: 0xae600000, 0x3c2f: 0xae600000, - 0x3c30: 0xae600000, 0x3c31: 0xae600000, 0x3c32: 0x40404620, 0x3c33: 0x00404684, - 0x3c34: 0x00404684, 0x3c35: 0x00404684, 0x3c36: 0x00404684, 0x3c37: 0x00404684, - 0x3c38: 0x40056e20, 0x3c39: 0x40057020, 0x3c3a: 0x40057220, 0x3c3b: 0x40404820, - // Block 0xf1, offset 0x3c40 - 0x3c40: 0xe00001a9, 0x3c41: 0xe000023d, 0x3c42: 0xe0000355, 0x3c43: 0xe000042f, - 0x3c44: 0xe0000504, 0x3c45: 0xe00005ce, 0x3c46: 0xe0000699, 0x3c47: 0xe0000741, - 0x3c48: 0xe00007ed, 0x3c49: 0xe0000892, 0x3c4a: 0x404dd220, 0x3c4b: 0x404dd420, - 0x3c4c: 0x404dd620, 0x3c4d: 0x404dd820, 0x3c4e: 0x404dda20, 0x3c4f: 0x404ddc20, - 0x3c50: 0x404dde20, 0x3c51: 0x404de020, 0x3c52: 0x404de220, 0x3c53: 0x404de420, - 0x3c54: 0x404de620, 0x3c55: 0x404de820, 0x3c56: 0x404dea20, 0x3c57: 0x404dec20, - 0x3c58: 0x404dee20, 0x3c59: 0x404df020, 0x3c5a: 0x404df220, 0x3c5b: 0x404df420, - 0x3c5c: 0x404df620, 0x3c5d: 0x404df820, 0x3c5e: 0x404dfa20, 0x3c5f: 0x404dfc20, - 0x3c60: 0x404dfe20, 0x3c61: 0x404e0020, 0x3c62: 0x404e0220, 0x3c63: 0x404e0420, - 0x3c64: 0x404e0620, 0x3c65: 0x404e0820, 0x3c66: 0x404e0a20, 0x3c67: 0x404e0c20, - 0x3c68: 0x404e0e20, 0x3c69: 0x404e1020, 0x3c6a: 0x404e1220, 0x3c6b: 0xadc10f02, - 0x3c6c: 0xadc11002, 0x3c6d: 0xadc11102, 0x3c6e: 0x4005f420, 0x3c6f: 0x40032020, - 0x3c70: 0x404d8a20, 0x3c71: 0x404d8c20, 0x3c72: 0x404d8e20, 0x3c73: 0x404d9020, - 0x3c74: 0x404d9220, 0x3c75: 0x404d9420, 0x3c76: 0x404d9620, 0x3c77: 0x404d9820, - 0x3c78: 0x404d9a20, 0x3c79: 0x404d9c20, 0x3c7a: 0x404d9e20, 0x3c7b: 0x404da020, - 0x3c7c: 0x404da220, 0x3c7d: 0x404da420, 0x3c7e: 0x404da620, 0x3c7f: 0x404da820, - // Block 0xf2, offset 0x3c80 - 0x3c80: 0x404daa20, 0x3c81: 0x404dac20, 0x3c82: 0x404dae20, 0x3c83: 0x404db020, - 0x3c84: 0x404db220, 0x3c85: 0x404db420, 0x3c86: 0x404db620, 0x3c87: 0x404db820, - 0x3c88: 0x404dba20, 0x3c89: 0x404dbc20, 0x3c8a: 0x404dbe20, 0x3c8b: 0x404dc020, - 0x3c8c: 0x404dc220, 0x3c8d: 0x404dc420, 0x3c8e: 0x404dc620, 0x3c8f: 0x404dc820, - 0x3c90: 0x404dca20, 0x3c91: 0x404dcc20, 0x3c92: 0x404dce20, 0x3c93: 0x820926e8, - 0x3c9f: 0x40038420, - 0x3ca0: 0x40636a20, 0x3ca1: 0x40636c20, 0x3ca2: 0x40636e20, 0x3ca3: 0x40637020, - 0x3ca4: 0x40637220, 0x3ca5: 0x40637420, 0x3ca6: 0x40637620, 0x3ca7: 0x40637820, - 0x3ca8: 0x40637a20, 0x3ca9: 0x40637c20, 0x3caa: 0x40637e20, 0x3cab: 0x40638020, - 0x3cac: 0x40638220, 0x3cad: 0x40638420, 0x3cae: 0x40638620, 0x3caf: 0x40638820, - 0x3cb0: 0x40638a20, 0x3cb1: 0x40638c20, 0x3cb2: 0x40638e20, 0x3cb3: 0x40639020, - 0x3cb4: 0x40639220, 0x3cb5: 0x40639420, 0x3cb6: 0x40639620, 0x3cb7: 0x40639820, - 0x3cb8: 0x40639a20, 0x3cb9: 0x40639c20, 0x3cba: 0x40639e20, 0x3cbb: 0x4063a020, - 0x3cbc: 0x4063a220, - // Block 0xf3, offset 0x3cc0 - 0x3cc0: 0xa000f202, 0x3cc1: 0xa000f302, 0x3cc2: 0xa000f802, 0x3cc3: 0xa000f402, - 0x3cc4: 0x4052b220, 0x3cc5: 0x4052b420, 0x3cc6: 0x4052b620, 0x3cc7: 0x4052b820, - 0x3cc8: 0x4052ba20, 0x3cc9: 0x4052bc20, 0x3cca: 0x4052be20, 0x3ccb: 0x4052c020, - 0x3ccc: 0x4052c220, 0x3ccd: 0x4052c420, 0x3cce: 0x4052c620, 0x3ccf: 0x4052c820, - 0x3cd0: 0x4052ca20, 0x3cd1: 0x4052cc20, 0x3cd2: 0x4052ce20, 0x3cd3: 0x4052d020, - 0x3cd4: 0x4052d220, 0x3cd5: 0x4052d420, 0x3cd6: 0x4052d620, 0x3cd7: 0x4052d820, - 0x3cd8: 0x4052da20, 0x3cd9: 0x4052dc20, 0x3cda: 0x4052de20, 0x3cdb: 0x4052e020, - 0x3cdc: 0x4052e220, 0x3cdd: 0x4052e420, 0x3cde: 0x4052e620, 0x3cdf: 0x4052e820, - 0x3ce0: 0x4052ea20, 0x3ce1: 0x4052ec20, 0x3ce2: 0x4052ee20, 0x3ce3: 0x4052f020, - 0x3ce4: 0x4052f220, 0x3ce5: 0x4052f420, 0x3ce6: 0x4052f620, 0x3ce7: 0x4052f820, - 0x3ce8: 0x4052fa20, 0x3ce9: 0x4052fc20, 0x3cea: 0x4052fe20, 0x3ceb: 0x40530220, - 0x3cec: 0x00530284, 0x3ced: 0x40530620, 0x3cee: 0x40530820, 0x3cef: 0x40530a20, - 0x3cf0: 0x40530c20, 0x3cf1: 0x40530e20, 0x3cf2: 0x40531020, 0x3cf3: 0xa070f102, - 0x3cf4: 0x40531220, 0x3cf5: 0x40532420, 0x3cf6: 0x40531620, 0x3cf7: 0x40531820, - 0x3cf8: 0x40531a20, 0x3cf9: 0x40531c20, 0x3cfa: 0x40532020, 0x3cfb: 0x40532220, - 0x3cfc: 0x40531420, 0x3cfd: 0x40531e20, 0x3cfe: 0x40530020, 0x3cff: 0x40530420, - // Block 0xf4, offset 0x3d00 - 0x3d00: 0x82092993, 0x3d01: 0x40036e20, 0x3d02: 0x40037020, 0x3d03: 0x40037220, - 0x3d04: 0x40037420, 0x3d05: 0x40037620, 0x3d06: 0x40037820, 0x3d07: 0x4002b020, - 0x3d08: 0x40033620, 0x3d09: 0x40033820, 0x3d0a: 0x40037a20, 0x3d0b: 0x40037c20, - 0x3d0c: 0x40037e20, 0x3d0d: 0x40038020, 0x3d0f: 0x4027c020, - 0x3d10: 0xe00001c1, 0x3d11: 0xe0000255, 0x3d12: 0xe000036d, 0x3d13: 0xe0000447, - 0x3d14: 0xe000051c, 0x3d15: 0xe00005e6, 0x3d16: 0xe00006b1, 0x3d17: 0xe0000759, - 0x3d18: 0xe0000805, 0x3d19: 0xe00008aa, - 0x3d1e: 0x4005f620, 0x3d1f: 0x4005f820, - // Block 0xf5, offset 0x3d40 - 0x3d40: 0x40519c20, 0x3d41: 0x40519e20, 0x3d42: 0x4051a020, 0x3d43: 0x4051a220, - 0x3d44: 0x4051a420, 0x3d45: 0x4051a620, 0x3d46: 0x4051a820, 0x3d47: 0x4051aa20, - 0x3d48: 0x4051ac20, 0x3d49: 0x4051ae20, 0x3d4a: 0x4051b020, 0x3d4b: 0x4051b220, - 0x3d4c: 0x4051b420, 0x3d4d: 0x4051b620, 0x3d4e: 0x4051b820, 0x3d4f: 0x4051ba20, - 0x3d50: 0x4051bc20, 0x3d51: 0x4051be20, 0x3d52: 0x4051c020, 0x3d53: 0x4051c220, - 0x3d54: 0x4051c420, 0x3d55: 0x4051c620, 0x3d56: 0x4051c820, 0x3d57: 0x4051ca20, - 0x3d58: 0x4051cc20, 0x3d59: 0x4051ce20, 0x3d5a: 0x4051d020, 0x3d5b: 0x4051d220, - 0x3d5c: 0x4051d420, 0x3d5d: 0x4051d620, 0x3d5e: 0x4051d820, 0x3d5f: 0x4051da20, - 0x3d60: 0x4051dc20, 0x3d61: 0x4051de20, 0x3d62: 0x4051e020, 0x3d63: 0x4051e220, - 0x3d64: 0x4051e420, 0x3d65: 0x4051e620, 0x3d66: 0x4051e820, 0x3d67: 0x4051ea20, - 0x3d68: 0x4051ec20, 0x3d69: 0x4051f620, 0x3d6a: 0x4051f820, 0x3d6b: 0x4051fa20, - 0x3d6c: 0x4051fc20, 0x3d6d: 0x4051fe20, 0x3d6e: 0x40520020, 0x3d6f: 0x40520220, - 0x3d70: 0x40520420, 0x3d71: 0x40520620, 0x3d72: 0x40520820, 0x3d73: 0x4051ee20, - 0x3d74: 0x4051f020, 0x3d75: 0x4051f220, 0x3d76: 0x4051f420, - // Block 0xf6, offset 0x3d80 - 0x3d80: 0x40520a20, 0x3d81: 0x40520c20, 0x3d82: 0x40520e20, 0x3d83: 0x40521020, - 0x3d84: 0x40521220, 0x3d85: 0x40521420, 0x3d86: 0x40521620, 0x3d87: 0x40521820, - 0x3d88: 0x40521a20, 0x3d89: 0x40521c20, 0x3d8a: 0x40521e20, 0x3d8b: 0x40522020, - 0x3d8c: 0x40522220, 0x3d8d: 0x40522420, - 0x3d90: 0xe00001bb, 0x3d91: 0xe000024f, 0x3d92: 0xe0000367, 0x3d93: 0xe0000441, - 0x3d94: 0xe0000516, 0x3d95: 0xe00005e0, 0x3d96: 0xe00006ab, 0x3d97: 0xe0000753, - 0x3d98: 0xe00007ff, 0x3d99: 0xe00008a4, - 0x3d9c: 0x4005fa20, 0x3d9d: 0x40033a20, 0x3d9e: 0x40033c20, 0x3d9f: 0x40033e20, - 0x3da0: 0x404e2020, 0x3da1: 0x404e2c20, 0x3da2: 0x404e3020, 0x3da3: 0x404e3420, - 0x3da4: 0x404e3e20, 0x3da5: 0x404e4620, 0x3da6: 0x404e4c20, 0x3da7: 0x404e5020, - 0x3da8: 0x404e5420, 0x3da9: 0x404e5820, 0x3daa: 0x404e6820, 0x3dab: 0x404e6e20, - 0x3dac: 0x404ea820, 0x3dad: 0x404eae20, 0x3dae: 0x404eb220, 0x3daf: 0x404e7a20, - 0x3db0: 0x4027c220, 0x3db1: 0x404eb420, 0x3db2: 0x404e3820, 0x3db3: 0x404e8e20, - 0x3db4: 0x404f3a20, 0x3db5: 0x404f3c20, 0x3db6: 0x404f3e20, 0x3db7: 0x4007ac20, - 0x3db8: 0x4007ae20, 0x3db9: 0x4007b020, 0x3dba: 0x404e9020, 0x3dbb: 0x404f3820, - // Block 0xf7, offset 0x3dc0 - 0x3dc0: 0x4049f020, 0x3dc1: 0x4049f220, 0x3dc2: 0x4049f420, 0x3dc3: 0x4049f620, - 0x3dc4: 0x4049f820, 0x3dc5: 0x4049fa20, 0x3dc6: 0x4049fc20, 0x3dc7: 0x4049fe20, - 0x3dc8: 0x404a0020, 0x3dc9: 0x404a0220, 0x3dca: 0x404a0420, 0x3dcb: 0x404a0620, - 0x3dcc: 0x404a0820, 0x3dcd: 0x404a0a20, 0x3dce: 0x404a0c20, 0x3dcf: 0x404a0e20, - 0x3dd0: 0x404a1020, 0x3dd1: 0x404a1220, 0x3dd2: 0x404a1420, 0x3dd3: 0x404a1620, - 0x3dd4: 0x404a1820, 0x3dd5: 0x404a1a20, 0x3dd6: 0x404a1c20, 0x3dd7: 0x404a1e20, - 0x3dd8: 0x404a2020, 0x3dd9: 0x404a2220, 0x3dda: 0x404a2420, 0x3ddb: 0x404a2620, - 0x3ddc: 0x404a2820, 0x3ddd: 0x404a2a20, 0x3dde: 0x404a2c20, 0x3ddf: 0x404a2e20, - 0x3de0: 0x404a3020, 0x3de1: 0x404a3220, 0x3de2: 0x404a3420, 0x3de3: 0x404a3620, - 0x3de4: 0x404a3820, 0x3de5: 0x404a3a20, 0x3de6: 0x404a3c20, 0x3de7: 0x404a3e20, - 0x3de8: 0x404a4020, 0x3de9: 0x404a4220, 0x3dea: 0x404a4420, 0x3deb: 0x404a4620, - 0x3dec: 0x404a4820, 0x3ded: 0x404a4a20, 0x3dee: 0x404a4c20, 0x3def: 0x404a4e20, - 0x3df0: 0x82e62528, 0x3df1: 0x404a5220, 0x3df2: 0x82e6252a, 0x3df3: 0x82e6252b, - 0x3df4: 0x82dc252c, 0x3df5: 0xc20e0671, 0x3df6: 0xc23f0671, 0x3df7: 0x82e6252f, - 0x3df8: 0x82e62530, 0x3df9: 0xc2700671, 0x3dfa: 0x404a6420, 0x3dfb: 0xc2a10671, - 0x3dfc: 0xc2d20671, 0x3dfd: 0x404a6a20, 0x3dfe: 0x82e62536, 0x3dff: 0xae610c02, - // Block 0xf8, offset 0x3e00 - 0x3e00: 0x404a6e20, 0x3e01: 0xae610d02, 0x3e02: 0x404a7020, - 0x3e1b: 0x404a7220, - 0x3e1c: 0x404a7420, 0x3e1d: 0x4027c420, 0x3e1e: 0x40057e20, 0x3e1f: 0x40058020, - 0x3e20: 0x40456420, 0x3e21: 0x40456620, 0x3e22: 0x40456820, 0x3e23: 0x40456a20, - 0x3e24: 0x40456c20, 0x3e25: 0x40456e20, 0x3e26: 0x40457020, 0x3e27: 0x40457220, - 0x3e28: 0x40457420, 0x3e29: 0x40457620, 0x3e2a: 0x40457820, 0x3e2b: 0x40458a20, - 0x3e2c: 0x40458c20, 0x3e2d: 0x40458e20, 0x3e2e: 0x40459020, 0x3e2f: 0x40459220, - 0x3e30: 0x40034020, 0x3e31: 0x4002dc20, 0x3e32: 0x40452c20, 0x3e33: 0x4027c620, - 0x3e34: 0x4027c820, 0x3e35: 0x40459420, 0x3e36: 0x820922d4, - // Block 0xf9, offset 0x3e40 - 0x3e41: 0x403cae20, 0x3e42: 0x403cb020, 0x3e43: 0x403cb220, - 0x3e44: 0x403cb420, 0x3e45: 0x403cb620, 0x3e46: 0x403cb820, - 0x3e49: 0x403e3c20, 0x3e4a: 0x403e3e20, 0x3e4b: 0x403e4020, - 0x3e4c: 0x403e4220, 0x3e4d: 0x403e4420, 0x3e4e: 0x403e4620, - 0x3e51: 0x403dfe20, 0x3e52: 0x403e0020, 0x3e53: 0x403e0220, - 0x3e54: 0x403e0420, 0x3e55: 0x403e0620, 0x3e56: 0x403e0820, - 0x3e60: 0x403ec220, 0x3e61: 0x403ec420, 0x3e62: 0x403ec620, 0x3e63: 0x403ec820, - 0x3e64: 0x403eca20, 0x3e65: 0x403ecc20, 0x3e66: 0x403ece20, - 0x3e68: 0x403ef220, 0x3e69: 0x403ef420, 0x3e6a: 0x403ef620, 0x3e6b: 0x403ef820, - 0x3e6c: 0x403efa20, 0x3e6d: 0x403efc20, 0x3e6e: 0x403efe20, - // Block 0xfa, offset 0x3e80 - 0x3e80: 0x40452e20, 0x3e81: 0x40453020, 0x3e82: 0x40453220, 0x3e83: 0x40453420, - 0x3e84: 0x40453620, 0x3e85: 0x40453820, 0x3e86: 0x40453a20, 0x3e87: 0x40453c20, - 0x3e88: 0x40453e20, 0x3e89: 0x40454020, 0x3e8a: 0x40454220, 0x3e8b: 0x40454420, - 0x3e8c: 0x40454620, 0x3e8d: 0x40454820, 0x3e8e: 0x40454a20, 0x3e8f: 0x40454c20, - 0x3e90: 0x40454e20, 0x3e91: 0x40455020, 0x3e92: 0x40455220, 0x3e93: 0x40455420, - 0x3e94: 0x40455620, 0x3e95: 0x40455820, 0x3e96: 0x40455a20, 0x3e97: 0x40455c20, - 0x3e98: 0x40455e20, 0x3e99: 0x40456020, 0x3e9a: 0x40456220, 0x3e9b: 0x40459620, - 0x3e9c: 0x40459820, 0x3e9d: 0x40459a20, 0x3e9e: 0x40459c20, 0x3e9f: 0x40459e20, - 0x3ea0: 0x4045a020, 0x3ea1: 0x4045a220, 0x3ea2: 0x4045a420, 0x3ea3: 0x40457a20, - 0x3ea4: 0x40457c20, 0x3ea5: 0x40457e20, 0x3ea6: 0x40458020, 0x3ea7: 0x40458220, - 0x3ea8: 0x40458420, 0x3ea9: 0x40458620, 0x3eaa: 0x40458820, 0x3eab: 0x40034220, - 0x3eac: 0xa000fa02, 0x3ead: 0x820922d3, - 0x3eb0: 0xe0000188, 0x3eb1: 0xe0000219, 0x3eb2: 0xe0000334, 0x3eb3: 0xe000040e, - 0x3eb4: 0xe00004e3, 0x3eb5: 0xe00005ad, 0x3eb6: 0xe0000678, 0x3eb7: 0xe0000720, - 0x3eb8: 0xe00007cc, 0x3eb9: 0xe0000871, - // Block 0xfb, offset 0x3ec0 - 0x3ef0: 0x40643620, 0x3ef1: 0x40643820, 0x3ef2: 0x40643a20, 0x3ef3: 0x40643c20, - 0x3ef4: 0x40643e20, 0x3ef5: 0x40644020, 0x3ef6: 0x40644220, 0x3ef7: 0x40644420, - 0x3ef8: 0x40644620, 0x3ef9: 0x40644820, 0x3efa: 0x40644a20, 0x3efb: 0x40644c20, - 0x3efc: 0x40644e20, 0x3efd: 0x40645020, 0x3efe: 0x40645220, 0x3eff: 0x40645420, - // Block 0xfc, offset 0x3f00 - 0x3f00: 0x40645620, 0x3f01: 0x40645820, 0x3f02: 0x40645a20, 0x3f03: 0x40645c20, - 0x3f04: 0x40645e20, 0x3f05: 0x40646020, 0x3f06: 0x40646220, - 0x3f0b: 0x40651420, - 0x3f0c: 0x40651620, 0x3f0d: 0x40651820, 0x3f0e: 0x40651a20, 0x3f0f: 0x40651c20, - 0x3f10: 0x40651e20, 0x3f11: 0x40652020, 0x3f12: 0x40652220, 0x3f13: 0x40652420, - 0x3f14: 0x40652620, 0x3f15: 0x40652820, 0x3f16: 0x40652a20, 0x3f17: 0x40652c20, - 0x3f18: 0x40652e20, 0x3f19: 0x40653020, 0x3f1a: 0x40653220, 0x3f1b: 0x40653420, - 0x3f1c: 0x40653620, 0x3f1d: 0x40653820, 0x3f1e: 0x40653a20, 0x3f1f: 0x40653c20, - 0x3f20: 0x40653e20, 0x3f21: 0x40654020, 0x3f22: 0x40654220, 0x3f23: 0x40654420, - 0x3f24: 0x40654620, 0x3f25: 0x40654820, 0x3f26: 0x40654a20, 0x3f27: 0x40654c20, - 0x3f28: 0x40654e20, 0x3f29: 0x40655020, 0x3f2a: 0x40655220, 0x3f2b: 0x40655420, - 0x3f2c: 0x40655620, 0x3f2d: 0x40655820, 0x3f2e: 0x40655a20, 0x3f2f: 0x40655c20, - 0x3f30: 0x40655e20, 0x3f31: 0x40656020, 0x3f32: 0x40656220, 0x3f33: 0x40656420, - 0x3f34: 0x40656620, 0x3f35: 0x40656820, 0x3f36: 0x40656a20, 0x3f37: 0x40656c20, - 0x3f38: 0x40656e20, 0x3f39: 0x40657020, 0x3f3a: 0x40657220, 0x3f3b: 0x40657420, - // Block 0xfd, offset 0x3f40 - 0x3f40: 0x43189020, 0x3f41: 0x42cde820, 0x3f42: 0x431d9420, 0x3f43: 0x43199020, - 0x3f44: 0x42dda220, 0x3f45: 0x429c6420, 0x3f46: 0x42a7ca20, 0x3f47: 0x433f3820, - 0x3f48: 0x433f3820, 0x3f49: 0x42b2a220, 0x3f4a: 0x4323a220, 0x3f4b: 0x42ab0e20, - 0x3f4c: 0x42b29020, 0x3f4d: 0x42c3ec20, 0x3f4e: 0x42ecd220, 0x3f4f: 0x42ff0a20, - 0x3f50: 0x430c7e20, 0x3f51: 0x430f7420, 0x3f52: 0x4311f020, 0x3f53: 0x43211e20, - 0x3f54: 0x42d40420, 0x3f55: 0x42da3620, 0x3f56: 0x42e1b220, 0x3f57: 0x42e7bc20, - 0x3f58: 0x43087a20, 0x3f59: 0x4322d420, 0x3f5a: 0x4333e220, 0x3f5b: 0x429d0420, - 0x3f5c: 0x42a6ea20, 0x3f5d: 0x42d60820, 0x3f5e: 0x42e43620, 0x3f5f: 0x430c5a20, - 0x3f60: 0x433c3c20, 0x3f61: 0x42baa020, 0x3f62: 0x42dfd620, 0x3f63: 0x430b9a20, - 0x3f64: 0x4312c820, 0x3f65: 0x42c59220, 0x3f66: 0x4303b020, 0x3f67: 0x43103e20, - 0x3f68: 0x42bd9420, 0x3f69: 0x42ce2e20, 0x3f6a: 0x42dad420, 0x3f6b: 0x42e5f820, - 0x3f6c: 0x43219c20, 0x3f6d: 0x429f0c20, 0x3f6e: 0x42a36e20, 0x3f6f: 0x42a5bc20, - 0x3f70: 0x42c98820, 0x3f71: 0x42d5a620, 0x3f72: 0x42e42020, 0x3f73: 0x42edce20, - 0x3f74: 0x43000220, 0x3f75: 0x430c0c20, 0x3f76: 0x430cb820, 0x3f77: 0x431bde20, - 0x3f78: 0x432e6420, 0x3f79: 0x4336de20, 0x3f7a: 0x433bf420, 0x3f7b: 0x42f11820, - 0x3f7c: 0x42f2fe20, 0x3f7d: 0x42fb4020, 0x3f7e: 0x43079220, 0x3f7f: 0x43260820, - // Block 0xfe, offset 0x3f80 - 0x3f80: 0x433cfe20, 0x3f81: 0x4315ac20, 0x3f82: 0x42b1be20, 0x3f83: 0x42be0820, - 0x3f84: 0x42f8c020, 0x3f85: 0x4300fc20, 0x3f86: 0x42e4c420, 0x3f87: 0x42f19420, - 0x3f88: 0x43198420, 0x3f89: 0x432dee20, 0x3f8a: 0x42b1b020, 0x3f8b: 0x42b8c420, - 0x3f8c: 0x42d42620, 0x3f8d: 0x42dbb420, 0x3f8e: 0x42de1e20, 0x3f8f: 0x42fa5e20, - 0x3f90: 0x42fc6e20, 0x3f91: 0x432c9620, 0x3f92: 0x42a5a420, 0x3f93: 0x43011620, - 0x3f94: 0x42a3b820, 0x3f95: 0x42a39820, 0x3f96: 0x42f43820, 0x3f97: 0x42fb7c20, - 0x3f98: 0x4307e220, 0x3f99: 0x432cea20, 0x3f9a: 0x43170020, 0x3f9b: 0x42c59e20, - 0x3f9c: 0x42d40420, 0x3f9d: 0x4315fc20, 0x3f9e: 0x429c7220, 0x3f9f: 0x42b7ce20, - 0x3fa0: 0x42c02420, 0x3fa1: 0x42e70e20, 0x3fa2: 0x42eae020, 0x3fa3: 0x42a62e20, - 0x3fa4: 0x42f1f620, 0x3fa5: 0x429f7e20, 0x3fa6: 0x42bf5220, 0x3fa7: 0x429c1a20, - 0x3fa8: 0x42d99820, 0x3fa9: 0x42caf020, 0x3faa: 0x42fa4420, 0x3fab: 0x42a78620, - 0x3fac: 0x42b0bc20, 0x3fad: 0x42ee0220, 0x3fae: 0x43089220, 0x3faf: 0x43155420, - 0x3fb0: 0x42d77420, 0x3fb1: 0x431f6020, 0x3fb2: 0x42d91020, 0x3fb3: 0x42c5fc20, - 0x3fb4: 0x4305ca20, 0x3fb5: 0x42c74020, 0x3fb6: 0x42eaca20, 0x3fb7: 0x429d5c20, - 0x3fb8: 0x42a2d220, 0x3fb9: 0x42a39220, 0x3fba: 0x42d10220, 0x3fbb: 0x42f9ce20, - 0x3fbc: 0x4304de20, 0x3fbd: 0x4315a420, 0x3fbe: 0x43239e20, 0x3fbf: 0x42a5ea20, - // Block 0xff, offset 0x3fc0 - 0x3fc0: 0x42a88420, 0x3fc1: 0x42b2e620, 0x3fc2: 0x42bdd820, 0x3fc3: 0x42cb8a20, - 0x3fc4: 0x42dffc20, 0x3fc5: 0x42f25420, 0x3fc6: 0x432b5a20, 0x3fc7: 0x4334d420, - 0x3fc8: 0x433d2e20, 0x3fc9: 0x433d9c20, 0x3fca: 0x42a53620, 0x3fcb: 0x42cd8c20, - 0x3fcc: 0x42d6ee20, 0x3fcd: 0x431ec420, 0x3fce: 0x42bce820, 0x3fcf: 0x42c32020, - 0x3fd0: 0x42c40020, 0x3fd1: 0x42c93420, 0x3fd2: 0x42de4620, 0x3fd3: 0x42e29220, - 0x3fd4: 0x42e91220, 0x3fd5: 0x42f39420, 0x3fd6: 0x42fbe820, 0x3fd7: 0x4300de20, - 0x3fd8: 0x431e4c20, 0x3fd9: 0x4309dc20, 0x3fda: 0x43204620, 0x3fdb: 0x43269420, - 0x3fdc: 0x42a42e20, 0x3fdd: 0x42a54620, 0x3fde: 0x42a97a20, 0x3fdf: 0x42e19020, - 0x3fe0: 0x43118420, 0x3fe1: 0x43155420, 0x3fe2: 0x42bd9220, 0x3fe3: 0x42bfea20, - 0x3fe4: 0x42c6f620, 0x3fe5: 0x42d75c20, 0x3fe6: 0x42f87c20, 0x3fe7: 0x42e6ea20, - 0x3fe8: 0x429dc820, 0x3fe9: 0x42adf220, 0x3fea: 0x42b7ce20, 0x3feb: 0x42bb7420, - 0x3fec: 0x42c03820, 0x3fed: 0x42e76420, 0x3fee: 0x42e8d220, 0x3fef: 0x42ff3420, - 0x3ff0: 0x43008c20, 0x3ff1: 0x43246820, 0x3ff2: 0x432dec20, 0x3ff3: 0x432e9020, - 0x3ff4: 0x43303020, 0x3ff5: 0x429f1620, 0x3ff6: 0x42f35c20, 0x3ff7: 0x43236820, - 0x3ff8: 0x432d7020, 0x3ff9: 0x42c1c220, 0x3ffa: 0x429d0c20, 0x3ffb: 0x42a1b420, - 0x3ffc: 0x42b7dc20, 0x3ffd: 0x42b87e20, 0x3ffe: 0x42cb3220, 0x3fff: 0x42d40420, - // Block 0x100, offset 0x4000 - 0x4000: 0x42e39c20, 0x4001: 0x42ec8420, 0x4002: 0x4309f820, 0x4003: 0x4320f820, - 0x4004: 0x433f1a20, 0x4005: 0x42cd1020, 0x4006: 0x432c5c20, 0x4007: 0x42a51220, - 0x4008: 0x42cef620, 0x4009: 0x42cfe620, 0x400a: 0x42da8220, 0x400b: 0x42dd3820, - 0x400c: 0x42e81220, 0x400d: 0x42eab220, 0x400e: 0x42f0d620, 0x400f: 0x42fa2020, - 0x4010: 0x4330bc20, 0x4011: 0x42a2da20, 0x4012: 0x42c45c20, 0x4013: 0x432cf020, - 0x4014: 0x42a05620, 0x4015: 0x42ba3220, 0x4016: 0x42dbd420, 0x4017: 0x431e5420, - 0x4018: 0x42bf1620, 0x4019: 0x42c28820, 0x401a: 0x42d02e20, 0x401b: 0x42e70e20, - 0x401c: 0x432d0c20, 0x401d: 0x42a45220, 0x401e: 0x42a81e20, 0x401f: 0x42b8ca20, - 0x4020: 0x42cc2620, 0x4021: 0x42ce9c20, 0x4022: 0x42d15020, 0x4023: 0x42d9ca20, - 0x4024: 0x42e80c20, 0x4025: 0x42ebc420, 0x4026: 0x42fef220, 0x4027: 0x43119e20, - 0x4028: 0x4311c220, 0x4029: 0x43239820, 0x402a: 0x432dc420, 0x402b: 0x42a67e20, - 0x402c: 0x42dd7420, 0x402d: 0x42a83a20, 0x402e: 0x42e3a020, 0x402f: 0x42e93020, - 0x4030: 0x430bf420, 0x4031: 0x432d4620, 0x4032: 0x4338ae20, 0x4033: 0x433d3e20, - 0x4034: 0x42cf2e20, 0x4035: 0x42db9620, 0x4036: 0x4303d020, 0x4037: 0x42f59620, - 0x4038: 0x42f64020, 0x4039: 0x42f92420, 0x403a: 0x42e58020, 0x403b: 0x42e13220, - 0x403c: 0x4316b020, 0x403d: 0x429d8020, 0x403e: 0x43066c20, 0x403f: 0x42a47420, - // Block 0x101, offset 0x4040 - 0x4040: 0x42a40e20, 0x4041: 0x42bd4c20, 0x4042: 0x42c5a620, 0x4043: 0x42f9ac20, - 0x4044: 0x42b70a20, 0x4045: 0x42da3c20, 0x4046: 0x42cd6820, 0x4047: 0x431e7620, - 0x4048: 0x43109820, 0x4049: 0x432c9a20, 0x404a: 0x43131620, 0x404b: 0x42bda620, - 0x404c: 0x42a28020, 0x404d: 0x42ab8020, 0x404e: 0x43f41c20, 0x404f: 0x43f41e20, - 0x4050: 0x42b0b420, 0x4051: 0x43f42220, 0x4052: 0x42cce820, 0x4053: 0x43f42620, - 0x4054: 0x43f42820, 0x4055: 0x42a3bc20, 0x4056: 0x42e65420, 0x4057: 0x42ed9420, - 0x4058: 0x42f27820, 0x4059: 0x42f2bc20, 0x405a: 0x42f2ca20, 0x405b: 0x42f31e20, - 0x405c: 0x432eac20, 0x405d: 0x42f97c20, 0x405e: 0x42ff7a20, 0x405f: 0x43f43e20, - 0x4060: 0x430c2420, 0x4061: 0x43f44220, 0x4062: 0x4315f020, 0x4063: 0x43f44620, - 0x4064: 0x43f44820, 0x4065: 0x43207020, 0x4066: 0x4321fa20, 0x4067: 0x43f44e20, - 0x4068: 0x43f45020, 0x4069: 0x43f45220, 0x406a: 0x4331de20, 0x406b: 0x4331f820, - 0x406c: 0x43325020, 0x406d: 0x433b6820, 0x406e: 0x4321bc20, 0x406f: 0x432d6e20, - 0x4070: 0x429f5c20, 0x4071: 0x42a1ce20, 0x4072: 0x42a29a20, 0x4073: 0x42a59220, - 0x4074: 0x42a5c820, 0x4075: 0x42a6a220, 0x4076: 0x42ab3a20, 0x4077: 0x42ac0c20, - 0x4078: 0x42acd020, 0x4079: 0x42b08020, 0x407a: 0x42b15020, 0x407b: 0x42b8c820, - 0x407c: 0x42b8dc20, 0x407d: 0x42c12820, 0x407e: 0x42c2d020, 0x407f: 0x42c31c20, - // Block 0x102, offset 0x4080 - 0x4080: 0x42c3e420, 0x4081: 0x42ca9e20, 0x4082: 0x42cbc420, 0x4083: 0x42cd2220, - 0x4084: 0x42d10a20, 0x4085: 0x42daee20, 0x4086: 0x42dc3420, 0x4087: 0x42de4420, - 0x4088: 0x42e2dc20, 0x4089: 0x42e45620, 0x408a: 0x42e84420, 0x408b: 0x42f12220, - 0x408c: 0x42f27c20, 0x408d: 0x42f29220, 0x408e: 0x42f29020, 0x408f: 0x42f2a020, - 0x4090: 0x42f2ac20, 0x4091: 0x42f2ba20, 0x4092: 0x42f31a20, 0x4093: 0x42f31c20, - 0x4094: 0x42f48020, 0x4095: 0x42f50220, 0x4096: 0x42f78020, 0x4097: 0x42fbe820, - 0x4098: 0x42fc1220, 0x4099: 0x42fc8220, 0x409a: 0x42fee420, 0x409b: 0x43000a20, - 0x409c: 0x4303da20, 0x409d: 0x4304f220, 0x409e: 0x4304f220, 0x409f: 0x4308ae20, - 0x40a0: 0x43122020, 0x40a1: 0x43132c20, 0x40a2: 0x43160220, 0x40a3: 0x43167220, - 0x40a4: 0x4319a620, 0x40a5: 0x431a1020, 0x40a6: 0x431f6c20, 0x40a7: 0x43207020, - 0x40a8: 0x432dc620, 0x40a9: 0x432ffe20, 0x40aa: 0x43307620, 0x40ab: 0x42c0ea20, - 0x40ac: 0x4885dc20, 0x40ad: 0x43043020, - 0x40b0: 0x429c4c20, 0x40b1: 0x42a36a20, 0x40b2: 0x42a2d020, 0x40b3: 0x429f0020, - 0x40b4: 0x42a28a20, 0x40b5: 0x42a30020, 0x40b6: 0x42a58e20, 0x40b7: 0x42a5f420, - 0x40b8: 0x42ab3a20, 0x40b9: 0x42aaaa20, 0x40ba: 0x42ab3220, 0x40bb: 0x42abc420, - 0x40bc: 0x42b0b420, 0x40bd: 0x42b16620, 0x40be: 0x42b28820, 0x40bf: 0x42b2a820, - // Block 0x103, offset 0x40c0 - 0x40c0: 0x42b4c420, 0x40c1: 0x42b65020, 0x40c2: 0x42bda420, 0x40c3: 0x42bdb220, - 0x40c4: 0x42bed220, 0x40c5: 0x42bf5a20, 0x40c6: 0x42c1b020, 0x40c7: 0x42c29c20, - 0x40c8: 0x42c21020, 0x40c9: 0x42c31c20, 0x40ca: 0x42c2c020, 0x40cb: 0x42c3e420, - 0x40cc: 0x42c46820, 0x40cd: 0x42c78820, 0x40ce: 0x42c83820, 0x40cf: 0x42c8a420, - 0x40d0: 0x42caac20, 0x40d1: 0x42cce820, 0x40d2: 0x42ce2e20, 0x40d3: 0x42ce3620, - 0x40d4: 0x42ceac20, 0x40d5: 0x42d6f220, 0x40d6: 0x42d77420, 0x40d7: 0x42da8220, - 0x40d8: 0x42ddb620, 0x40d9: 0x42dd9620, 0x40da: 0x42de4420, 0x40db: 0x42e03c20, - 0x40dc: 0x42e2dc20, 0x40dd: 0x42ef4e20, 0x40de: 0x42e46a20, 0x40df: 0x42e55e20, - 0x40e0: 0x42e65420, 0x40e1: 0x42e8e220, 0x40e2: 0x42ea0c20, 0x40e3: 0x42ea7620, - 0x40e4: 0x42ec3a20, 0x40e5: 0x42ec3e20, 0x40e6: 0x42ed9420, 0x40e7: 0x42edb620, - 0x40e8: 0x42ede820, 0x40e9: 0x42ee9420, 0x40ea: 0x42ee8020, 0x40eb: 0x42f19820, - 0x40ec: 0x42f56220, 0x40ed: 0x42f78020, 0x40ee: 0x42f8f620, 0x40ef: 0x42fab620, - 0x40f0: 0x42fbe820, 0x40f1: 0x42fe7c20, 0x40f2: 0x43000a20, 0x40f3: 0x4306a420, - 0x40f4: 0x4307de20, 0x40f5: 0x430ef220, 0x40f6: 0x43128220, 0x40f7: 0x43130c20, - 0x40f8: 0x43132c20, 0x40f9: 0x43157e20, 0x40fa: 0x4315f020, 0x40fb: 0x43159620, - 0x40fc: 0x43160220, 0x40fd: 0x4315fc20, 0x40fe: 0x4315da20, 0x40ff: 0x43167220, - // Block 0x104, offset 0x4100 - 0x4100: 0x43171420, 0x4101: 0x431a1020, 0x4102: 0x431e7020, 0x4103: 0x4320e420, - 0x4104: 0x43233220, 0x4105: 0x4324ec20, 0x4106: 0x432cf820, 0x4107: 0x432dc620, - 0x4108: 0x432eac20, 0x4109: 0x432fb620, 0x410a: 0x432ffe20, 0x410b: 0x43301620, - 0x410c: 0x43307620, 0x410d: 0x43362420, 0x410e: 0x433f3820, 0x410f: 0x48509420, - 0x4110: 0x48508820, 0x4111: 0x4867aa20, 0x4112: 0x44773a20, 0x4113: 0x44803020, - 0x4114: 0x44807220, 0x4115: 0x48a49220, 0x4116: 0x48b9a020, 0x4117: 0x48fda620, - 0x4118: 0x433e8620, 0x4119: 0x433f1c20, - // Block 0x105, offset 0x4140 - 0x4140: 0xf0000404, 0x4141: 0xf0000404, 0x4142: 0xf0000404, 0x4143: 0xe0000b99, - 0x4144: 0xe0000b9d, 0x4145: 0xe0000f83, 0x4146: 0xf0000404, - 0x4153: 0xf0000404, - 0x4154: 0xf0000404, 0x4155: 0xf0000404, 0x4156: 0xf0000404, 0x4157: 0xf0000404, - 0x415d: 0xe000150b, 0x415e: 0xa1a09602, 0x415f: 0xe0001514, - 0x4160: 0x0038ae85, 0x4161: 0x00389085, 0x4162: 0x00389685, 0x4163: 0x00389885, - 0x4164: 0x0038a485, 0x4165: 0x0038a685, 0x4166: 0x0038a885, 0x4167: 0x0038b685, - 0x4168: 0x0038ba85, 0x4169: 0x00093885, 0x416a: 0xe0001542, 0x416b: 0xe000153f, - 0x416c: 0xe000154c, 0x416d: 0xe0001548, 0x416e: 0xe00014e1, 0x416f: 0xe00014e4, - 0x4170: 0xe00014e7, 0x4171: 0xe00014ea, 0x4172: 0xe00014f0, 0x4173: 0xe00014f3, - 0x4174: 0xe00014f6, 0x4175: 0xe00014fc, 0x4176: 0xe0001505, - 0x4178: 0xe0001508, 0x4179: 0xe000150e, 0x417a: 0xe000151b, 0x417b: 0xe0001518, - 0x417c: 0xe0001521, 0x417e: 0xe0001524, - // Block 0x106, offset 0x4180 - 0x4180: 0xe0001527, 0x4181: 0xe000152a, 0x4183: 0xe0001530, - 0x4184: 0xe000152d, 0x4186: 0xe0001536, 0x4187: 0xe0001539, - 0x4188: 0xe000153c, 0x4189: 0xe0001545, 0x418a: 0xe0001550, 0x418b: 0xe00014f9, - 0x418c: 0xe00014ed, 0x418d: 0xe000151e, 0x418e: 0xe0001533, 0x418f: 0xf0000404, - 0x4190: 0x0039249a, 0x4191: 0x00392499, 0x4192: 0x00393e9a, 0x4193: 0x00393e99, - 0x4194: 0x00393e97, 0x4195: 0x00393e98, 0x4196: 0x0039409a, 0x4197: 0x00394099, - 0x4198: 0x00394097, 0x4199: 0x00394098, 0x419a: 0x0039429a, 0x419b: 0x00394299, - 0x419c: 0x00394297, 0x419d: 0x00394298, 0x419e: 0x00395c9a, 0x419f: 0x00395c99, - 0x41a0: 0x00395c97, 0x41a1: 0x00395c98, 0x41a2: 0x0039629a, 0x41a3: 0x00396299, - 0x41a4: 0x00396297, 0x41a5: 0x00396298, 0x41a6: 0x00395a9a, 0x41a7: 0x00395a99, - 0x41a8: 0x00395a97, 0x41a9: 0x00395a98, 0x41aa: 0x003a049a, 0x41ab: 0x003a0499, - 0x41ac: 0x003a0497, 0x41ad: 0x003a0498, 0x41ae: 0x003a0a9a, 0x41af: 0x003a0a99, - 0x41b0: 0x003a0a97, 0x41b1: 0x003a0a98, 0x41b2: 0x0039689a, 0x41b3: 0x00396899, - 0x41b4: 0x00396897, 0x41b5: 0x00396898, 0x41b6: 0x0039669a, 0x41b7: 0x00396699, - 0x41b8: 0x00396697, 0x41b9: 0x00396698, 0x41ba: 0x00396a9a, 0x41bb: 0x00396a99, - 0x41bc: 0x00396a97, 0x41bd: 0x00396a98, 0x41be: 0x00396e9a, 0x41bf: 0x00396e99, - // Block 0x107, offset 0x41c0 - 0x41c0: 0x00396e97, 0x41c1: 0x00396e98, 0x41c2: 0x0039969a, 0x41c3: 0x00399699, - 0x41c4: 0x0039949a, 0x41c5: 0x00399499, 0x41c6: 0x0039989a, 0x41c7: 0x00399899, - 0x41c8: 0x00398c9a, 0x41c9: 0x00398c99, 0x41ca: 0x0039b69a, 0x41cb: 0x0039b699, - 0x41cc: 0x0039a89a, 0x41cd: 0x0039a899, 0x41ce: 0x003a1c9a, 0x41cf: 0x003a1c99, - 0x41d0: 0x003a1c97, 0x41d1: 0x003a1c98, 0x41d2: 0x003a2a9a, 0x41d3: 0x003a2a99, - 0x41d4: 0x003a2a97, 0x41d5: 0x003a2a98, 0x41d6: 0x003a329a, 0x41d7: 0x003a3299, - 0x41d8: 0x003a3297, 0x41d9: 0x003a3298, 0x41da: 0x003a2e9a, 0x41db: 0x003a2e99, - 0x41dc: 0x003a2e97, 0x41dd: 0x003a2e98, 0x41de: 0x003a589a, 0x41df: 0x003a5899, - 0x41e0: 0x003a5a9a, 0x41e1: 0x003a5a99, 0x41e2: 0x003a5a97, 0x41e3: 0x003a5a98, - 0x41e4: 0xf0001a1a, 0x41e5: 0xf0001919, 0x41e6: 0x003a6c9a, 0x41e7: 0x003a6c99, - 0x41e8: 0x003a6c97, 0x41e9: 0x003a6c98, 0x41ea: 0x003a6a9a, 0x41eb: 0x003a6a99, - 0x41ec: 0x003a6a97, 0x41ed: 0x003a6a98, 0x41ee: 0x003aaa9a, 0x41ef: 0x003aaa99, - 0x41f0: 0xf0001a1a, 0x41f1: 0xf0001919, 0x41f2: 0x40071820, 0x41f3: 0x40071a20, - 0x41f4: 0x40071c20, 0x41f5: 0x40071e20, 0x41f6: 0x40072020, 0x41f7: 0x40072220, - 0x41f8: 0x40072420, 0x41f9: 0x40072620, 0x41fa: 0x40072820, 0x41fb: 0x40072a20, - 0x41fc: 0x40072c20, 0x41fd: 0x40072e20, 0x41fe: 0x40073020, 0x41ff: 0x40073220, - // Block 0x108, offset 0x4200 - 0x4200: 0x40073420, 0x4201: 0x40073620, - 0x4213: 0x003a269a, - 0x4214: 0x003a2699, 0x4215: 0x003a2697, 0x4216: 0x003a2698, 0x4217: 0x003a7c9a, - 0x4218: 0x003a7c99, 0x4219: 0x003a7a9a, 0x421a: 0x003a7a99, 0x421b: 0x003a7e9a, - 0x421c: 0x003a7e99, 0x421d: 0xf0001a1a, 0x421e: 0x003a849a, 0x421f: 0x003a8499, - 0x4220: 0x003a789a, 0x4221: 0x003a7899, 0x4222: 0x003a809a, 0x4223: 0x003a8099, - 0x4224: 0x003a989a, 0x4225: 0x003a9899, 0x4226: 0x003a9897, 0x4227: 0x003a9898, - 0x4228: 0x003a8e97, 0x4229: 0x003a8e98, 0x422a: 0xe0001559, 0x422b: 0xe0001556, - 0x422c: 0xe0001589, 0x422d: 0xe0001586, 0x422e: 0xe000158f, 0x422f: 0xe000158c, - 0x4230: 0xe000159b, 0x4231: 0xe0001598, 0x4232: 0xe0001595, 0x4233: 0xe0001592, - 0x4234: 0xe00015a1, 0x4235: 0xe000159e, 0x4236: 0xe00015bf, 0x4237: 0xe00015bc, - 0x4238: 0xe00015b9, 0x4239: 0xe00015ad, 0x423a: 0xe00015a7, 0x423b: 0xe00015a4, - 0x423c: 0x003a929a, 0x423d: 0x003a9299, 0x423e: 0x003a9297, 0x423f: 0x003a9298, - // Block 0x109, offset 0x4240 - 0x4240: 0xe000155f, 0x4241: 0xe0001565, 0x4242: 0xe000157a, 0x4243: 0xe00015b0, - 0x4244: 0xe00015b6, 0x4245: 0xf0001a1a, 0x4246: 0xf0001a1a, 0x4247: 0xf0001a1a, - 0x4248: 0xf0001a1a, 0x4249: 0xf0001a1a, 0x424a: 0xf0001a1a, 0x424b: 0xf0001a1a, - 0x424c: 0xf0001a1a, 0x424d: 0xf0001a1a, 0x424e: 0xf0001a1a, 0x424f: 0xf0001a1a, - 0x4250: 0xf0001a1a, 0x4251: 0xf0001a1a, 0x4252: 0xf0001a1a, 0x4253: 0xf0001a1a, - 0x4254: 0xf0001a1a, 0x4255: 0xf0001a1a, 0x4256: 0xf0001a1a, 0x4257: 0xf0001a1a, - 0x4258: 0xf0001a1a, 0x4259: 0xf0001a1a, 0x425a: 0xf0001a1a, 0x425b: 0xf0001a1a, - 0x425c: 0xf0001a1a, 0x425d: 0xf0001a1a, 0x425e: 0xf0001a1a, 0x425f: 0xf0001a1a, - 0x4260: 0xf0001a1a, 0x4261: 0xf0001a1a, 0x4262: 0xf0001a1a, 0x4263: 0xf0001a1a, - 0x4264: 0xf0001a1a, 0x4265: 0xf0001a1a, 0x4266: 0xf0001a1a, 0x4267: 0xf0001a1a, - 0x4268: 0xf0001a1a, 0x4269: 0xf0001a1a, 0x426a: 0xf0001a1a, 0x426b: 0xf0001a1a, - 0x426c: 0xf0001a1a, 0x426d: 0xf0001a1a, 0x426e: 0xf0001a1a, 0x426f: 0xf0001a1a, - 0x4270: 0xf0001a1a, 0x4271: 0xf0001a1a, 0x4272: 0xf0001a1a, 0x4273: 0xf0001a1a, - 0x4274: 0xf0001a1a, 0x4275: 0xf0001a1a, 0x4276: 0xf0001a1a, 0x4277: 0xf0001a1a, - 0x4278: 0xf0001a1a, 0x4279: 0xf0001a1a, 0x427a: 0xf0001a1a, 0x427b: 0xf0001a1a, - 0x427c: 0xf0001a1a, 0x427d: 0xf0001a1a, 0x427e: 0xf0001a1a, 0x427f: 0xf0001a1a, - // Block 0x10a, offset 0x4280 - 0x4280: 0xf0001a1a, 0x4281: 0xf0001a1a, 0x4282: 0xf0001a1a, 0x4283: 0xf0001a1a, - 0x4284: 0xf0001a1a, 0x4285: 0xf0001a1a, 0x4286: 0xf0001a1a, 0x4287: 0xf0001a1a, - 0x4288: 0xf0001a1a, 0x4289: 0xf0001a1a, 0x428a: 0xf0001a1a, 0x428b: 0xf0001a1a, - 0x428c: 0xf0001a1a, 0x428d: 0xf0001a1a, 0x428e: 0xf0001a1a, 0x428f: 0xf0001a1a, - 0x4290: 0xf0001a1a, 0x4291: 0xf0001a1a, 0x4292: 0xf0001a1a, 0x4293: 0xf0001a1a, - 0x4294: 0xf0001a1a, 0x4295: 0xf0001a1a, 0x4296: 0xf0001a1a, 0x4297: 0xf0001a1a, - 0x4298: 0xf0001a1a, 0x4299: 0xf0001a1a, 0x429a: 0xf0001a1a, 0x429b: 0xf0001a1a, - 0x429c: 0xf0001a1a, 0x429d: 0xf0001a1a, 0x429e: 0xe0000003, 0x429f: 0xe0000006, - 0x42a0: 0xe0000009, 0x42a1: 0xe000000c, 0x42a2: 0xe000000f, 0x42a3: 0xe0000012, - 0x42a4: 0xe000156b, 0x42a5: 0xe000156e, 0x42a6: 0xe0001577, 0x42a7: 0xe000157d, - 0x42a8: 0xe00015aa, 0x42a9: 0xe00015b3, 0x42aa: 0xf0001919, 0x42ab: 0xf0001919, - 0x42ac: 0xf0001919, 0x42ad: 0xf0001919, 0x42ae: 0xf0001919, 0x42af: 0xf0001919, - 0x42b0: 0xf0001919, 0x42b1: 0xf0001919, 0x42b2: 0xf0001919, 0x42b3: 0xf0001919, - 0x42b4: 0xf0001919, 0x42b5: 0xf0001919, 0x42b6: 0xf0001919, 0x42b7: 0xf0001919, - 0x42b8: 0xf0001919, 0x42b9: 0xf0001919, 0x42ba: 0xf0001919, 0x42bb: 0xf0001919, - 0x42bc: 0xf0001919, 0x42bd: 0xf0001919, 0x42be: 0xf0001919, 0x42bf: 0xf0001919, - // Block 0x10b, offset 0x42c0 - 0x42c0: 0xf0001919, 0x42c1: 0xf0001919, 0x42c2: 0xf0001919, 0x42c3: 0xf0001919, - 0x42c4: 0xf0001919, 0x42c5: 0xf0001919, 0x42c6: 0xf0001919, 0x42c7: 0xf0001919, - 0x42c8: 0xf0001919, 0x42c9: 0xf0001919, 0x42ca: 0xf0001919, 0x42cb: 0xf0001919, - 0x42cc: 0xf0001919, 0x42cd: 0xf0001919, 0x42ce: 0xf0001919, 0x42cf: 0xf0001919, - 0x42d0: 0xf0001919, 0x42d1: 0xf0001919, 0x42d2: 0xf0001919, 0x42d3: 0xf0001919, - 0x42d4: 0xf0001919, 0x42d5: 0xf0001919, 0x42d6: 0xf0001919, 0x42d7: 0xe000155c, - 0x42d8: 0xe0001562, 0x42d9: 0xe0001568, 0x42da: 0xe0001571, 0x42db: 0xe0001580, - 0x42dc: 0xf0001717, 0x42dd: 0xf0001717, 0x42de: 0xf0001717, 0x42df: 0xf0001717, - 0x42e0: 0xf0001717, 0x42e1: 0xf0001717, 0x42e2: 0xf0001717, 0x42e3: 0xf0001717, - 0x42e4: 0xf0001717, 0x42e5: 0xf0001717, 0x42e6: 0xf0001717, 0x42e7: 0xf0001717, - 0x42e8: 0xf0001717, 0x42e9: 0xf0001717, 0x42ea: 0xf0001717, 0x42eb: 0xf0001717, - 0x42ec: 0xf0001717, 0x42ed: 0xf0001717, 0x42ee: 0xf0001717, 0x42ef: 0xf0001717, - 0x42f0: 0xf0001717, 0x42f1: 0xf0001717, 0x42f2: 0xf0001717, 0x42f3: 0xf0001717, - 0x42f4: 0xf0001717, 0x42f5: 0xf0001717, 0x42f6: 0xf0001717, 0x42f7: 0xf0001717, - 0x42f8: 0xf0001717, 0x42f9: 0xf0001717, 0x42fa: 0xf0001717, 0x42fb: 0xf0001717, - 0x42fc: 0xf0001717, 0x42fd: 0xf0001717, 0x42fe: 0xf0001717, 0x42ff: 0xf0001717, - // Block 0x10c, offset 0x4300 - 0x4300: 0xf0001717, 0x4301: 0xf0001717, 0x4302: 0xf0001717, 0x4303: 0xf0001717, - 0x4304: 0xf0001717, 0x4305: 0xf0001717, 0x4306: 0xf0001717, 0x4307: 0xf0001717, - 0x4308: 0xf0001717, 0x4309: 0xf0001717, 0x430a: 0xf0001717, 0x430b: 0xf0001717, - 0x430c: 0xf0001717, 0x430d: 0xf0001717, 0x430e: 0xf0001717, 0x430f: 0xf0001717, - 0x4310: 0xf0001717, 0x4311: 0xf0001717, 0x4312: 0xf0001717, 0x4313: 0xf0001717, - 0x4314: 0xf0001717, 0x4315: 0xf0001717, 0x4316: 0xf0001717, 0x4317: 0xf0001717, - 0x4318: 0xf0001717, 0x4319: 0xf0001717, 0x431a: 0xf0001717, 0x431b: 0xf0001717, - 0x431c: 0xf0001717, 0x431d: 0xf0001717, 0x431e: 0xf0001717, 0x431f: 0xe0001574, - 0x4320: 0xe0001583, 0x4321: 0xf0001818, 0x4322: 0xf0001818, 0x4323: 0xf0001818, - 0x4324: 0xf0001818, 0x4325: 0xf0001818, 0x4326: 0xf0001818, 0x4327: 0xf0001818, - 0x4328: 0xf0001818, 0x4329: 0xf0001818, 0x432a: 0xf0001818, 0x432b: 0xf0001818, - 0x432c: 0xf0001818, 0x432d: 0xf0001818, 0x432e: 0xf0001818, 0x432f: 0xf0001818, - 0x4330: 0xf0001818, 0x4331: 0xf0001818, 0x4332: 0xf0001818, 0x4333: 0xf0001818, - 0x4334: 0xf0001818, 0x4335: 0xf0001a1a, 0x4336: 0xf0001a1a, 0x4337: 0xf0001a1a, - 0x4338: 0xf0001a1a, 0x4339: 0xf0001a1a, 0x433a: 0xf0001a1a, 0x433b: 0xf0001a1a, - 0x433c: 0xf0001a1a, 0x433d: 0xf0001a1a, 0x433e: 0xf0001a1a, 0x433f: 0xf0001a1a, - // Block 0x10d, offset 0x4340 - 0x4340: 0xf0001a1a, 0x4341: 0xf0001a1a, 0x4342: 0xf0001a1a, 0x4343: 0xf0001a1a, - 0x4344: 0xf0001a1a, 0x4345: 0xf0001a1a, 0x4346: 0xf0001a1a, 0x4347: 0xf0001a1a, - 0x4348: 0xf0001a1a, 0x4349: 0xf0001a1a, 0x434a: 0xf0001a1a, 0x434b: 0xf0001a1a, - 0x434c: 0xf0001a1a, 0x434d: 0xf0001a1a, 0x434e: 0xf0001a1a, 0x434f: 0xf0001a1a, - 0x4350: 0xf0001a1a, 0x4351: 0xf0001919, 0x4352: 0xf0001919, 0x4353: 0xf0001919, - 0x4354: 0xf0001919, 0x4355: 0xf0001919, 0x4356: 0xf0001919, 0x4357: 0xf0001919, - 0x4358: 0xf0001919, 0x4359: 0xf0001919, 0x435a: 0xf0001919, 0x435b: 0xf0001919, - 0x435c: 0xf0001919, 0x435d: 0xf0001919, 0x435e: 0xf0001919, 0x435f: 0xf0001919, - 0x4360: 0xf0001919, 0x4361: 0xf0001919, 0x4362: 0xf0001919, 0x4363: 0xf0001919, - 0x4364: 0xf0001919, 0x4365: 0xf0001919, 0x4366: 0xf0001919, 0x4367: 0xf0001919, - 0x4368: 0xf0001919, 0x4369: 0xf0001919, 0x436a: 0xf0001919, 0x436b: 0xf0001919, - 0x436c: 0xf0001919, 0x436d: 0xf0001717, 0x436e: 0xf0001717, 0x436f: 0xf0001717, - 0x4370: 0xf0001717, 0x4371: 0xf0001717, 0x4372: 0xf0001717, 0x4373: 0xf0001717, - 0x4374: 0xf0001818, 0x4375: 0xf0001818, 0x4376: 0xf0001818, 0x4377: 0xf0001818, - 0x4378: 0xf0001818, 0x4379: 0xf0001818, 0x437a: 0xf0001818, 0x437b: 0xf0001818, - 0x437c: 0xf0001919, 0x437d: 0xf0001a1a, 0x437e: 0x4004c020, 0x437f: 0x4004c220, - // Block 0x10e, offset 0x4380 - 0x4390: 0xe00015d4, 0x4391: 0xe00015e4, 0x4392: 0xe00015e0, 0x4393: 0xe00015e8, - 0x4394: 0xe00015ec, 0x4395: 0xe00015f8, 0x4396: 0xe00015fc, 0x4397: 0xe0001600, - 0x4398: 0xe0001621, 0x4399: 0xe000161d, 0x439a: 0xe0001635, 0x439b: 0xe0001631, - 0x439c: 0xe0001646, 0x439d: 0xe000163e, 0x439e: 0xe0001642, 0x439f: 0xe000165a, - 0x43a0: 0xe0001656, 0x43a1: 0xe0001652, 0x43a2: 0xe0001662, 0x43a3: 0xe000165e, - 0x43a4: 0xe000168a, 0x43a5: 0xe0001686, 0x43a6: 0xe00016b6, 0x43a7: 0xe000166e, - 0x43a8: 0xe000166a, 0x43a9: 0xe0001666, 0x43aa: 0xe000167a, 0x43ab: 0xe0001676, - 0x43ac: 0xe0001682, 0x43ad: 0xe000167e, 0x43ae: 0xe00016ba, 0x43af: 0xe00016c6, - 0x43b0: 0xe00016c2, 0x43b1: 0xe00016ce, 0x43b2: 0xe00016ca, 0x43b3: 0xe00016d2, - 0x43b4: 0xe00016d6, 0x43b5: 0xe00016de, 0x43b6: 0xe00016eb, 0x43b7: 0xe00016e7, - 0x43b8: 0xe00016ef, 0x43b9: 0xe00016f7, 0x43ba: 0xe00016ff, 0x43bb: 0xe00016fb, - 0x43bc: 0xe0001707, 0x43bd: 0xe0001703, 0x43be: 0xe0001717, 0x43bf: 0xe000171b, - // Block 0x10f, offset 0x43c0 - 0x43c0: 0xe0001759, 0x43c1: 0xe0001761, 0x43c2: 0xe000175d, 0x43c3: 0xe0001741, - 0x43c4: 0xe0001745, 0x43c5: 0xe0001769, 0x43c6: 0xe0001765, 0x43c7: 0xe0001771, - 0x43c8: 0xe000176d, 0x43c9: 0xe000178c, 0x43ca: 0xe0001790, 0x43cb: 0xe0001799, - 0x43cc: 0xe000177c, 0x43cd: 0xe0001784, 0x43ce: 0xe000179d, 0x43cf: 0xe00017a1, - 0x43d2: 0xe0001780, 0x43d3: 0xe00017d9, - 0x43d4: 0xe00017dd, 0x43d5: 0xe00017c5, 0x43d6: 0xe00017c9, 0x43d7: 0xe00017b9, - 0x43d8: 0xe00017b5, 0x43d9: 0xe00017bd, 0x43da: 0xe00017d5, 0x43db: 0xe00017d1, - 0x43dc: 0xe00017f8, 0x43dd: 0xe00017f4, 0x43de: 0xe00015d0, 0x43df: 0xe00015dc, - 0x43e0: 0xe00015d8, 0x43e1: 0xe00015f4, 0x43e2: 0xe00015f0, 0x43e3: 0xe0001608, - 0x43e4: 0xe0001604, 0x43e5: 0xe0001629, 0x43e6: 0xe000160c, 0x43e7: 0xe0001625, - 0x43e8: 0xe000164a, 0x43e9: 0xe000168e, 0x43ea: 0xe0001672, 0x43eb: 0xe00016be, - 0x43ec: 0xe0001751, 0x43ed: 0xe0001775, 0x43ee: 0xe00017f0, 0x43ef: 0xe00017ec, - 0x43f0: 0xe00017fc, 0x43f1: 0xe00017a9, 0x43f2: 0xe000171f, 0x43f3: 0xe00017cd, - 0x43f4: 0xe0001713, 0x43f5: 0xe0001755, 0x43f6: 0xe00016f3, 0x43f7: 0xe000172b, - 0x43f8: 0xe00017ad, 0x43f9: 0xe00017a5, 0x43fa: 0xe0001749, 0x43fb: 0xe0001727, - 0x43fc: 0xe000174d, 0x43fd: 0xe00017b1, 0x43fe: 0xe0001610, 0x43ff: 0xe000162d, - // Block 0x110, offset 0x4400 - 0x4400: 0xe0001788, 0x4401: 0xe000170b, 0x4402: 0xe00015cc, 0x4403: 0xe0001723, - 0x4404: 0xe00016da, 0x4405: 0xe00016b2, 0x4406: 0xe000164e, 0x4407: 0xe00017c1, - 0x4430: 0xe00016ae, 0x4431: 0xe000170f, 0x4432: 0xe00015c7, 0x4433: 0xe00015c2, - 0x4434: 0xe0001794, 0x4435: 0xe0001692, 0x4436: 0xe0001639, 0x4437: 0xe00016e2, - 0x4438: 0xe00017e7, 0x4439: 0xe0001697, 0x443a: 0xe000169b, 0x443b: 0xe0001614, - 0x443c: 0x40282e20, 0x443d: 0x40071620, - // Block 0x111, offset 0x4440 - 0x4440: 0xa0000000, 0x4441: 0xa0000000, 0x4442: 0xa0000000, 0x4443: 0xa0000000, - 0x4444: 0xa0000000, 0x4445: 0xa0000000, 0x4446: 0xa0000000, 0x4447: 0xa0000000, - 0x4448: 0xa0000000, 0x4449: 0xa0000000, 0x444a: 0xa0000000, 0x444b: 0xa0000000, - 0x444c: 0xa0000000, 0x444d: 0xa0000000, 0x444e: 0xa0000000, 0x444f: 0xa0000000, - 0x4450: 0x00024096, 0x4451: 0x00025c96, 0x4452: 0x00030496, 0x4453: 0x00026c96, - 0x4454: 0x00026296, 0x4455: 0x0002ba96, 0x4456: 0x0002c496, 0x4457: 0x0004b496, - 0x4458: 0x0004b696, 0x4459: 0xf0001616, - 0x4460: 0xae608202, 0x4461: 0xae600000, 0x4462: 0xae608102, 0x4463: 0xae600000, - 0x4464: 0xae600000, 0x4465: 0xae600000, 0x4466: 0xae600000, - 0x4470: 0xf0001f16, 0x4471: 0x00022c96, 0x4472: 0x00022a96, 0x4473: 0x00021696, - 0x4474: 0x00021696, 0x4475: 0x0003f496, 0x4476: 0x0003f696, 0x4477: 0x0003fc96, - 0x4478: 0x0003fe96, 0x4479: 0x0004b096, 0x447a: 0x0004b296, 0x447b: 0x0004ac96, - 0x447c: 0x0004ae96, 0x447d: 0x0004a096, 0x447e: 0x0004a296, 0x447f: 0x00049c96, - // Block 0x112, offset 0x4480 - 0x4480: 0x00049e96, 0x4481: 0x0004a496, 0x4482: 0x0004a696, 0x4483: 0x0004a896, - 0x4484: 0x0004aa96, 0x4485: 0x40025e20, 0x4486: 0x40026020, 0x4487: 0x0003f896, - 0x4488: 0x0003fa96, 0x4489: 0x00021484, 0x448a: 0x00021484, 0x448b: 0x00021484, - 0x448c: 0x00021484, 0x448d: 0x00021684, 0x448e: 0x00021684, 0x448f: 0x00021684, - 0x4490: 0x0002408f, 0x4491: 0x00025c8f, 0x4492: 0x0002e48f, - 0x4494: 0x0002628f, 0x4495: 0x00026c8f, 0x4496: 0x0002c48f, 0x4497: 0x0002ba8f, - 0x4498: 0x00022c8f, 0x4499: 0x0003f48f, 0x449a: 0x0003f68f, 0x449b: 0x0003fc8f, - 0x449c: 0x0003fe8f, 0x449d: 0x0004b08f, 0x449e: 0x0004b28f, 0x449f: 0x0004ea8f, - 0x44a0: 0x0004e68f, 0x44a1: 0x0004d88f, 0x44a2: 0x0009388f, 0x44a3: 0x00021a8f, - 0x44a4: 0x0009408f, 0x44a5: 0x0009448f, 0x44a6: 0x0009428f, - 0x44a8: 0x0004e48f, 0x44a9: 0x0027de8f, 0x44aa: 0x0004ec8f, 0x44ab: 0x0004d68f, - 0x44b0: 0xa000a21a, 0x44b1: 0xa000a218, 0x44b2: 0xa000a51a, 0x44b3: 0xa0000000, - 0x44b4: 0xa000a91a, 0x44b6: 0xa000ad1a, 0x44b7: 0xa000ad18, - 0x44b8: 0xa000b21a, 0x44b9: 0xa000b218, 0x44ba: 0xa000b61a, 0x44bb: 0xa000b618, - 0x44bc: 0xa000ba1a, 0x44bd: 0xa000ba18, 0x44be: 0xa000bc1a, 0x44bf: 0xa000bc18, - // Block 0x113, offset 0x44c0 - 0x44c0: 0x00391c9a, 0x44c1: 0x00391e9a, 0x44c2: 0x00391e99, 0x44c3: 0x0039209a, - 0x44c4: 0x00392099, 0x44c5: 0x0039269a, 0x44c6: 0x00392699, 0x44c7: 0x0039289a, - 0x44c8: 0x00392899, 0x44c9: 0x0039309a, 0x44ca: 0x00393099, 0x44cb: 0x00393097, - 0x44cc: 0x00393098, 0x44cd: 0x0039389a, 0x44ce: 0x00393899, 0x44cf: 0x00393c9a, - 0x44d0: 0x00393c99, 0x44d1: 0x00393c97, 0x44d2: 0x00393c98, 0x44d3: 0x0039549a, - 0x44d4: 0x00395499, 0x44d5: 0x0039569a, 0x44d6: 0x00395699, 0x44d7: 0x00395697, - 0x44d8: 0x00395698, 0x44d9: 0x0039589a, 0x44da: 0x00395899, 0x44db: 0x00395897, - 0x44dc: 0x00395898, 0x44dd: 0x0039649a, 0x44de: 0x00396499, 0x44df: 0x00396497, - 0x44e0: 0x00396498, 0x44e1: 0x0039729a, 0x44e2: 0x00397299, 0x44e3: 0x00397297, - 0x44e4: 0x00397298, 0x44e5: 0x0039749a, 0x44e6: 0x00397499, 0x44e7: 0x00397497, - 0x44e8: 0x00397498, 0x44e9: 0x0039889a, 0x44ea: 0x00398899, 0x44eb: 0x00398a9a, - 0x44ec: 0x00398a99, 0x44ed: 0x0039a49a, 0x44ee: 0x0039a499, 0x44ef: 0x0039a69a, - 0x44f0: 0x0039a699, 0x44f1: 0x0039c69a, 0x44f2: 0x0039c699, 0x44f3: 0x0039c697, - 0x44f4: 0x0039c698, 0x44f5: 0x0039c89a, 0x44f6: 0x0039c899, 0x44f7: 0x0039c897, - 0x44f8: 0x0039c898, 0x44f9: 0x0039dc9a, 0x44fa: 0x0039dc99, 0x44fb: 0x0039dc97, - 0x44fc: 0x0039dc98, 0x44fd: 0x0039de9a, 0x44fe: 0x0039de99, 0x44ff: 0x0039de97, - // Block 0x114, offset 0x4500 - 0x4500: 0x0039de98, 0x4501: 0x0039e69a, 0x4502: 0x0039e699, 0x4503: 0x0039e697, - 0x4504: 0x0039e698, 0x4505: 0x0039e89a, 0x4506: 0x0039e899, 0x4507: 0x0039e897, - 0x4508: 0x0039e898, 0x4509: 0x0039ee9a, 0x450a: 0x0039ee99, 0x450b: 0x0039ee97, - 0x450c: 0x0039ee98, 0x450d: 0x0039f09a, 0x450e: 0x0039f099, 0x450f: 0x0039f097, - 0x4510: 0x0039f098, 0x4511: 0x0039fc9a, 0x4512: 0x0039fc99, 0x4513: 0x0039fc97, - 0x4514: 0x0039fc98, 0x4515: 0x003a129a, 0x4516: 0x003a1299, 0x4517: 0x003a1297, - 0x4518: 0x003a1298, 0x4519: 0x003a1a9a, 0x451a: 0x003a1a99, 0x451b: 0x003a1a97, - 0x451c: 0x003a1a98, 0x451d: 0x003a409a, 0x451e: 0x003a4099, 0x451f: 0x003a4097, - 0x4520: 0x003a4098, 0x4521: 0x003a4e9a, 0x4522: 0x003a4e99, 0x4523: 0x003a4e97, - 0x4524: 0x003a4e98, 0x4525: 0x003a569a, 0x4526: 0x003a5699, 0x4527: 0x003a5697, - 0x4528: 0x003a5698, 0x4529: 0x003a689a, 0x452a: 0x003a6899, 0x452b: 0x003a6897, - 0x452c: 0x003a6898, 0x452d: 0x003a749a, 0x452e: 0x003a7499, 0x452f: 0x003a8e9a, - 0x4530: 0x003a8e99, 0x4531: 0x003a909a, 0x4532: 0x003a9099, 0x4533: 0x003a9097, - 0x4534: 0x003a9098, 0x4535: 0xe0001732, 0x4536: 0xe000172f, 0x4537: 0xe0001738, - 0x4538: 0xe0001735, 0x4539: 0xe000173e, 0x453a: 0xe000173b, 0x453b: 0xf0001a1a, - 0x453c: 0xf0001919, 0x453f: 0xa0000000, - // Block 0x115, offset 0x4540 - 0x4541: 0x0002ba83, 0x4542: 0x0003e083, 0x4543: 0x0004ea83, - 0x4544: 0x0027de83, 0x4545: 0x0004ec83, 0x4546: 0x0004e683, 0x4547: 0x0003d283, - 0x4548: 0x0003f483, 0x4549: 0x0003f683, 0x454a: 0x0004d883, 0x454b: 0x00093883, - 0x454c: 0x00024083, 0x454d: 0x00021a83, 0x454e: 0x0002e483, 0x454f: 0x0004e283, - 0x4550: 0x0029cc83, 0x4551: 0x0029ce83, 0x4552: 0x0029d083, 0x4553: 0x0029d283, - 0x4554: 0x0029d483, 0x4555: 0x0029d683, 0x4556: 0x0029d883, 0x4557: 0x0029da83, - 0x4558: 0x0029dc83, 0x4559: 0x0029de83, 0x455a: 0x00026c83, 0x455b: 0x00026283, - 0x455c: 0x00094083, 0x455d: 0x00094283, 0x455e: 0x00094483, 0x455f: 0x0002c483, - 0x4560: 0x0004d683, 0x4561: 0x002bde89, 0x4562: 0x002c0a89, 0x4563: 0x002c3a89, - 0x4564: 0x002c6289, 0x4565: 0x002c9889, 0x4566: 0x002d0889, 0x4567: 0x002d2289, - 0x4568: 0x002d6889, 0x4569: 0x002d9a89, 0x456a: 0x002dcc89, 0x456b: 0x002dfe89, - 0x456c: 0x002e2289, 0x456d: 0x002e8289, 0x456e: 0x002e9e89, 0x456f: 0x002ee289, - 0x4570: 0x002f2c89, 0x4571: 0x002f5689, 0x4572: 0x002f7a89, 0x4573: 0x002fe689, - 0x4574: 0x00302c89, 0x4575: 0x00306c89, 0x4576: 0x0030be89, 0x4577: 0x0030e289, - 0x4578: 0x0030f689, 0x4579: 0x00310089, 0x457a: 0x00312a89, 0x457b: 0x0003f883, - 0x457c: 0x0004e483, 0x457d: 0x0003fa83, 0x457e: 0x00062483, 0x457f: 0x00021683, - // Block 0x116, offset 0x4580 - 0x4580: 0x00061e83, 0x4581: 0x002bde83, 0x4582: 0x002c0a83, 0x4583: 0x002c3a83, - 0x4584: 0x002c6283, 0x4585: 0x002c9883, 0x4586: 0x002d0883, 0x4587: 0x002d2283, - 0x4588: 0x002d6883, 0x4589: 0x002d9a83, 0x458a: 0x002dcc83, 0x458b: 0x002dfe83, - 0x458c: 0x002e2283, 0x458d: 0x002e8283, 0x458e: 0x002e9e83, 0x458f: 0x002ee283, - 0x4590: 0x002f2c83, 0x4591: 0x002f5683, 0x4592: 0x002f7a83, 0x4593: 0x002fe683, - 0x4594: 0x00302c83, 0x4595: 0x00306c83, 0x4596: 0x0030be83, 0x4597: 0x0030e283, - 0x4598: 0x0030f683, 0x4599: 0x00310083, 0x459a: 0x00312a83, 0x459b: 0x0003fc83, - 0x459c: 0x00094883, 0x459d: 0x0003fe83, 0x459e: 0x00094c83, 0x459f: 0x00041883, - 0x45a0: 0x00041a83, 0x45a1: 0x00030492, 0x45a2: 0x0004a492, 0x45a3: 0x0004a692, - 0x45a4: 0x00025c92, 0x45a5: 0x00023e92, 0x45a6: 0x0065d692, 0x45a7: 0x00657690, - 0x45a8: 0x00657890, 0x45a9: 0x00657a90, 0x45aa: 0x00657e90, 0x45ab: 0x00658090, - 0x45ac: 0x0065be90, 0x45ad: 0x0065c090, 0x45ae: 0x0065c490, 0x45af: 0x00659a90, - 0x45b0: 0x0027d692, 0x45b1: 0x00657692, 0x45b2: 0x00657892, 0x45b3: 0x00657a92, - 0x45b4: 0x00657e92, 0x45b5: 0x00658092, 0x45b6: 0x00658292, 0x45b7: 0x00658492, - 0x45b8: 0x00658692, 0x45b9: 0x00658892, 0x45ba: 0x00658a92, 0x45bb: 0x00658c92, - 0x45bc: 0x00658e92, 0x45bd: 0x00659092, 0x45be: 0x00659292, 0x45bf: 0x00659492, - // Block 0x117, offset 0x45c0 - 0x45c0: 0x00659692, 0x45c1: 0x00659892, 0x45c2: 0x00659a92, 0x45c3: 0x00659c92, - 0x45c4: 0x00659e92, 0x45c5: 0x0065a092, 0x45c6: 0x0065a292, 0x45c7: 0x0065a492, - 0x45c8: 0x0065a692, 0x45c9: 0x0065a892, 0x45ca: 0x0065aa92, 0x45cb: 0x0065ac92, - 0x45cc: 0x0065ae92, 0x45cd: 0x0065b092, 0x45ce: 0x0065b292, 0x45cf: 0x0065b492, - 0x45d0: 0x0065b692, 0x45d1: 0x0065b892, 0x45d2: 0x0065ba92, 0x45d3: 0x0065bc92, - 0x45d4: 0x0065be92, 0x45d5: 0x0065c092, 0x45d6: 0x0065c492, 0x45d7: 0x0065c692, - 0x45d8: 0x0065c892, 0x45d9: 0x0065ca92, 0x45da: 0x0065cc92, 0x45db: 0x0065ce92, - 0x45dc: 0x0065d092, 0x45dd: 0x0065d892, 0x45de: 0xa0012812, 0x45df: 0xa0012912, - 0x45e0: 0x0063a692, 0x45e1: 0x0062ac92, 0x45e2: 0x0062ae92, 0x45e3: 0x00646892, - 0x45e4: 0x0062b092, 0x45e5: 0x00646c92, 0x45e6: 0x00646e92, 0x45e7: 0x0062b292, - 0x45e8: 0x0062b492, 0x45e9: 0x0062b692, 0x45ea: 0x00647492, 0x45eb: 0x00647692, - 0x45ec: 0x00647892, 0x45ed: 0x00647a92, 0x45ee: 0x00647c92, 0x45ef: 0x00647e92, - 0x45f0: 0x0062e092, 0x45f1: 0x0062b892, 0x45f2: 0x0062ba92, 0x45f3: 0x0062bc92, - 0x45f4: 0x0062ee92, 0x45f5: 0x0062be92, 0x45f6: 0x0062c092, 0x45f7: 0x0062c292, - 0x45f8: 0x0062c492, 0x45f9: 0x0062c692, 0x45fa: 0x0062c892, 0x45fb: 0x0062ca92, - 0x45fc: 0x0062cc92, 0x45fd: 0x0062ce92, 0x45fe: 0x0062d092, - // Block 0x118, offset 0x4600 - 0x4602: 0x0063a892, 0x4603: 0x0063aa92, - 0x4604: 0x0063ac92, 0x4605: 0x0063ae92, 0x4606: 0x0063b092, 0x4607: 0x0063b292, - 0x460a: 0x0063b492, 0x460b: 0x0063b692, - 0x460c: 0x0063b892, 0x460d: 0x0063ba92, 0x460e: 0x0063bc92, 0x460f: 0x0063be92, - 0x4612: 0x0063c092, 0x4613: 0x0063c292, - 0x4614: 0x0063c492, 0x4615: 0x0063c692, 0x4616: 0x0063c892, 0x4617: 0x0063ca92, - 0x461a: 0x0063cc92, 0x461b: 0x0063ce92, - 0x461c: 0x0063d092, - 0x4620: 0x0027dc83, 0x4621: 0x0027e083, 0x4622: 0x00094683, 0x4623: 0x00062683, - 0x4624: 0x00094a83, 0x4625: 0x0027e283, 0x4626: 0x00280883, - 0x4628: 0x000d3292, 0x4629: 0x00084492, 0x462a: 0x00084892, 0x462b: 0x00084692, - 0x462c: 0x00084a92, 0x462d: 0x000e6e92, 0x462e: 0x000ec492, - 0x4639: 0xa0000000, 0x463a: 0xa0000000, 0x463b: 0xa0000000, - 0x463c: 0x4027ae20, 0x463d: 0x4027b020, 0x463e: 0x00000285, 0x463f: 0x2bfffe85, - // Block 0x119, offset 0x4640 - 0x4640: 0x40731a20, 0x4641: 0x40731c20, 0x4642: 0x40731e20, 0x4643: 0x40732020, - 0x4644: 0x40732220, 0x4645: 0x40732420, 0x4646: 0x40732620, 0x4647: 0x40732820, - 0x4648: 0x40732a20, 0x4649: 0x40732c20, 0x464a: 0x40732e20, 0x464b: 0x40733020, - 0x464d: 0x40733220, 0x464e: 0x40733420, 0x464f: 0x40733620, - 0x4650: 0x40733820, 0x4651: 0x40733a20, 0x4652: 0x40733c20, 0x4653: 0x40733e20, - 0x4654: 0x40734020, 0x4655: 0x40734220, 0x4656: 0x40734420, 0x4657: 0x40734620, - 0x4658: 0x40734820, 0x4659: 0x40734a20, 0x465a: 0x40734c20, 0x465b: 0x40734e20, - 0x465c: 0x40735020, 0x465d: 0x40735220, 0x465e: 0x40735420, 0x465f: 0x40735620, - 0x4660: 0x40735820, 0x4661: 0x40735a20, 0x4662: 0x40735c20, 0x4663: 0x40735e20, - 0x4664: 0x40736020, 0x4665: 0x40736220, 0x4666: 0x40736420, - 0x4668: 0x40736620, 0x4669: 0x40736820, 0x466a: 0x40736a20, 0x466b: 0x40736c20, - 0x466c: 0x40736e20, 0x466d: 0x40737020, 0x466e: 0x40737220, 0x466f: 0x40737420, - 0x4670: 0x40737620, 0x4671: 0x40737820, 0x4672: 0x40737a20, 0x4673: 0x40737c20, - 0x4674: 0x40737e20, 0x4675: 0x40738020, 0x4676: 0x40738220, 0x4677: 0x40738420, - 0x4678: 0x40738620, 0x4679: 0x40738820, 0x467a: 0x40738a20, - 0x467c: 0x40738c20, 0x467d: 0x40738e20, 0x467f: 0x40739020, - // Block 0x11a, offset 0x4680 - 0x4680: 0x40739220, 0x4681: 0x40739420, 0x4682: 0x40739620, 0x4683: 0x40739820, - 0x4684: 0x40739a20, 0x4685: 0x40739c20, 0x4686: 0x40739e20, 0x4687: 0x4073a020, - 0x4688: 0x4073a220, 0x4689: 0x4073a420, 0x468a: 0x4073a620, 0x468b: 0x4073a820, - 0x468c: 0x4073aa20, 0x468d: 0x4073ac20, - 0x4690: 0x4073ae20, 0x4691: 0x4073b020, 0x4692: 0x4073b220, 0x4693: 0x4073b420, - 0x4694: 0x4073b620, 0x4695: 0x4073b820, 0x4696: 0x4073ba20, 0x4697: 0x4073bc20, - 0x4698: 0x4073be20, 0x4699: 0x4073c020, 0x469a: 0x4073c220, 0x469b: 0x4073c420, - 0x469c: 0x4073c620, 0x469d: 0x4073c820, - // Block 0x11b, offset 0x46c0 - 0x46c0: 0x4073ca20, 0x46c1: 0x4073cc20, 0x46c2: 0x4073ce20, 0x46c3: 0x4073d020, - 0x46c4: 0x4073d220, 0x46c5: 0x4073d420, 0x46c6: 0x4073d620, 0x46c7: 0x4073d820, - 0x46c8: 0x4073da20, 0x46c9: 0x4073dc20, 0x46ca: 0x4073de20, 0x46cb: 0x4073e020, - 0x46cc: 0x4073e220, 0x46cd: 0x4073e420, 0x46ce: 0x4073e620, 0x46cf: 0x4073e820, - 0x46d0: 0x4073ea20, 0x46d1: 0x4073ec20, 0x46d2: 0x4073ee20, 0x46d3: 0x4073f020, - 0x46d4: 0x4073f220, 0x46d5: 0x4073f420, 0x46d6: 0x4073f620, 0x46d7: 0x4073f820, - 0x46d8: 0x4073fa20, 0x46d9: 0x4073fc20, 0x46da: 0x4073fe20, 0x46db: 0x40740020, - 0x46dc: 0x40740220, 0x46dd: 0x40740420, 0x46de: 0x40740620, 0x46df: 0x40740820, - 0x46e0: 0x40740a20, 0x46e1: 0x40740c20, 0x46e2: 0x40740e20, 0x46e3: 0x40741020, - 0x46e4: 0x40741220, 0x46e5: 0x40741420, 0x46e6: 0x40741620, 0x46e7: 0x40741820, - 0x46e8: 0x40741a20, 0x46e9: 0x40741c20, 0x46ea: 0x40741e20, 0x46eb: 0x40742020, - 0x46ec: 0x40742220, 0x46ed: 0x40742420, 0x46ee: 0x40742620, 0x46ef: 0x40742820, - 0x46f0: 0x40742a20, 0x46f1: 0x40742c20, 0x46f2: 0x40742e20, 0x46f3: 0x40743020, - 0x46f4: 0x40743220, 0x46f5: 0x40743420, 0x46f6: 0x40743620, 0x46f7: 0x40743820, - 0x46f8: 0x40743a20, 0x46f9: 0x40743c20, 0x46fa: 0x40743e20, 0x46fb: 0x40744020, - 0x46fc: 0x40744220, 0x46fd: 0x40744420, 0x46fe: 0x40744620, 0x46ff: 0x40744820, - // Block 0x11c, offset 0x4700 - 0x4700: 0x40744a20, 0x4701: 0x40744c20, 0x4702: 0x40744e20, 0x4703: 0x40745020, - 0x4704: 0x40745220, 0x4705: 0x40745420, 0x4706: 0x40745620, 0x4707: 0x40745820, - 0x4708: 0x40745a20, 0x4709: 0x40745c20, 0x470a: 0x40745e20, 0x470b: 0x40746020, - 0x470c: 0x40746220, 0x470d: 0x40746420, 0x470e: 0x40746620, 0x470f: 0x40746820, - 0x4710: 0x40746a20, 0x4711: 0x40746c20, 0x4712: 0x40746e20, 0x4713: 0x40747020, - 0x4714: 0x40747220, 0x4715: 0x40747420, 0x4716: 0x40747620, 0x4717: 0x40747820, - 0x4718: 0x40747a20, 0x4719: 0x40747c20, 0x471a: 0x40747e20, 0x471b: 0x40748020, - 0x471c: 0x40748220, 0x471d: 0x40748420, 0x471e: 0x40748620, 0x471f: 0x40748820, - 0x4720: 0x40748a20, 0x4721: 0x40748c20, 0x4722: 0x40748e20, 0x4723: 0x40749020, - 0x4724: 0x40749220, 0x4725: 0x40749420, 0x4726: 0x40749620, 0x4727: 0x40749820, - 0x4728: 0x40749a20, 0x4729: 0x40749c20, 0x472a: 0x40749e20, 0x472b: 0x4074a020, - 0x472c: 0x4074a220, 0x472d: 0x4074a420, 0x472e: 0x4074a620, 0x472f: 0x4074a820, - 0x4730: 0x4074aa20, 0x4731: 0x4074ac20, 0x4732: 0x4074ae20, 0x4733: 0x4074b020, - 0x4734: 0x4074b220, 0x4735: 0x4074b420, 0x4736: 0x4074b620, 0x4737: 0x4074b820, - 0x4738: 0x4074ba20, 0x4739: 0x4074bc20, 0x473a: 0x4074be20, - // Block 0x11d, offset 0x4740 - 0x4740: 0x4003be20, 0x4741: 0x4003c020, 0x4742: 0x4003c220, - 0x4747: 0xe000026a, - 0x4748: 0xe0000382, 0x4749: 0xe000045c, 0x474a: 0xe0000531, 0x474b: 0xe00005fb, - 0x474c: 0xe00006c6, 0x474d: 0xe000076e, 0x474e: 0xe000081a, 0x474f: 0xe00008bf, - 0x4750: 0x4028ba20, 0x4751: 0x4028bc20, 0x4752: 0x4028be20, 0x4753: 0x4028c020, - 0x4754: 0x4028c220, 0x4755: 0x4028c420, 0x4756: 0x4028c620, 0x4757: 0x4028c820, - 0x4758: 0x4028ca20, 0x4759: 0x4028cc20, 0x475a: 0x4028ce20, 0x475b: 0x4028d020, - 0x475c: 0x4028d220, 0x475d: 0x4028d420, 0x475e: 0x4028d620, 0x475f: 0x4028d820, - 0x4760: 0x4028da20, 0x4761: 0x4028dc20, 0x4762: 0x4028de20, 0x4763: 0x4028e020, - 0x4764: 0x4028e220, 0x4765: 0x4028e420, 0x4766: 0x4028e620, 0x4767: 0x4028e820, - 0x4768: 0x4028ea20, 0x4769: 0x4028ec20, 0x476a: 0x4028ee20, 0x476b: 0x4028f020, - 0x476c: 0x4028f220, 0x476d: 0x4028f420, 0x476e: 0x4028f620, 0x476f: 0x4028f820, - 0x4770: 0x4028fa20, 0x4771: 0x4028fc20, 0x4772: 0x4028fe20, 0x4773: 0x40290020, - 0x4777: 0x401afe20, - 0x4778: 0x401b0020, 0x4779: 0x401b0220, 0x477a: 0x401b0420, 0x477b: 0x401b0620, - 0x477c: 0x401b0820, 0x477d: 0x401b0a20, 0x477e: 0x401b0c20, 0x477f: 0x401b0e20, - // Block 0x11e, offset 0x4780 - 0x4780: 0x40290220, 0x4781: 0x40290420, 0x4782: 0xe000026d, 0x4783: 0xe00005fe, - 0x4784: 0x40290620, 0x4785: 0x40290820, 0x4786: 0x40290a20, 0x4787: 0x40290c20, - 0x4788: 0xe0000601, 0x4789: 0x40290e20, 0x478a: 0x40291020, 0x478b: 0x40291220, - 0x478c: 0x40291420, 0x478d: 0x40291620, 0x478e: 0x40291820, 0x478f: 0xe0000604, - 0x4790: 0x40291a20, 0x4791: 0x40291c20, 0x4792: 0x40291e20, 0x4793: 0x40292020, - 0x4794: 0x40292220, 0x4795: 0x40292420, 0x4796: 0x40292620, 0x4797: 0x40292820, - 0x4798: 0xe0000270, 0x4799: 0xe0000273, 0x479a: 0xe0000276, 0x479b: 0xe0000385, - 0x479c: 0xe0000388, 0x479d: 0xe000038b, 0x479e: 0xe000038e, 0x479f: 0xe0000607, - 0x47a0: 0x40292a20, 0x47a1: 0x40292c20, 0x47a2: 0x40292e20, 0x47a3: 0x40293020, - 0x47a4: 0x40293220, 0x47a5: 0x40293420, 0x47a6: 0x40293620, 0x47a7: 0x40293820, - 0x47a8: 0x40293a20, 0x47a9: 0x40293c20, 0x47aa: 0x40293e20, 0x47ab: 0x40294020, - 0x47ac: 0x40294220, 0x47ad: 0x40294420, 0x47ae: 0x40294620, 0x47af: 0x40294820, - 0x47b0: 0x40294a20, 0x47b1: 0x40294c20, 0x47b2: 0x40294e20, 0x47b3: 0xe000060a, - 0x47b4: 0x40295020, 0x47b5: 0x40295220, 0x47b6: 0x40295420, 0x47b7: 0x40295620, - 0x47b8: 0x40295820, 0x47b9: 0x401b1020, 0x47ba: 0x401b1220, 0x47bb: 0x401b1420, - 0x47bc: 0x401b1620, 0x47bd: 0x401b1820, 0x47be: 0x401b1a20, 0x47bf: 0x401b1c20, - // Block 0x11f, offset 0x47c0 - 0x47c0: 0x401b1e20, 0x47c1: 0x401b2020, 0x47c2: 0x401b2220, 0x47c3: 0x401b2420, - 0x47c4: 0x401b2620, 0x47c5: 0x401b2820, 0x47c6: 0x401b2a20, 0x47c7: 0x401b2c20, - 0x47c8: 0x401b2e20, 0x47c9: 0x401b3020, 0x47ca: 0xe00001d6, - 0x47d0: 0x401b3220, 0x47d1: 0x401b3420, 0x47d2: 0x401b3620, 0x47d3: 0x401b3820, - 0x47d4: 0x401b3a20, 0x47d5: 0x401b3c20, 0x47d6: 0x401b3e20, 0x47d7: 0x401b4020, - 0x47d8: 0x401b4220, 0x47d9: 0x401b4420, 0x47da: 0x401b4620, 0x47db: 0x401b4820, - // Block 0x120, offset 0x4800 - 0x4810: 0x401b4a20, 0x4811: 0x401b4c20, 0x4812: 0x401b4e20, 0x4813: 0x401b5020, - 0x4814: 0x401b5220, 0x4815: 0x401b5420, 0x4816: 0x401b5620, 0x4817: 0x401b5820, - 0x4818: 0x401b5a20, 0x4819: 0x401b5c20, 0x481a: 0x401b5e20, 0x481b: 0x401b6020, - 0x481c: 0x401b6220, 0x481d: 0x401b6420, 0x481e: 0x401b6620, 0x481f: 0x401b6820, - 0x4820: 0x401b6a20, 0x4821: 0x401b6c20, 0x4822: 0x401b6e20, 0x4823: 0x401b7020, - 0x4824: 0x401b7220, 0x4825: 0x401b7420, 0x4826: 0x401b7620, 0x4827: 0x401b7820, - 0x4828: 0x401b7a20, 0x4829: 0x401b7c20, 0x482a: 0x401b7e20, 0x482b: 0x401b8020, - 0x482c: 0x401b8220, 0x482d: 0x401b8420, 0x482e: 0x401b8620, 0x482f: 0x401b8820, - 0x4830: 0x401b8a20, 0x4831: 0x401b8c20, 0x4832: 0x401b8e20, 0x4833: 0x401b9020, - 0x4834: 0x401b9220, 0x4835: 0x401b9420, 0x4836: 0x401b9620, 0x4837: 0x401b9820, - 0x4838: 0x401b9a20, 0x4839: 0x401b9c20, 0x483a: 0x401b9e20, 0x483b: 0x401ba020, - 0x483c: 0x401ba220, 0x483d: 0xadc13802, - // Block 0x121, offset 0x4840 - 0x4840: 0x4070b820, 0x4841: 0x4070ba20, 0x4842: 0x4070bc20, 0x4843: 0x4070be20, - 0x4844: 0x4070c020, 0x4845: 0x4070c220, 0x4846: 0x4070c420, 0x4847: 0x4070c620, - 0x4848: 0x4070c820, 0x4849: 0x4070ca20, 0x484a: 0x4070cc20, 0x484b: 0x4070ce20, - 0x484c: 0x4070d020, 0x484d: 0x4070d220, 0x484e: 0x4070d420, 0x484f: 0x4070d620, - 0x4850: 0x4070d820, 0x4851: 0x4070da20, 0x4852: 0x4070dc20, 0x4853: 0x4070de20, - 0x4854: 0x4070e020, 0x4855: 0x4070e220, 0x4856: 0x4070e420, 0x4857: 0x4070e620, - 0x4858: 0x4070e820, 0x4859: 0x4070ea20, 0x485a: 0x4070ec20, 0x485b: 0x4070ee20, - 0x485c: 0x4070f020, - 0x4860: 0x4070f220, 0x4861: 0x4070f420, 0x4862: 0x4070f620, 0x4863: 0x4070f820, - 0x4864: 0x4070fa20, 0x4865: 0x4070fc20, 0x4866: 0x4070fe20, 0x4867: 0x40710020, - 0x4868: 0x40710220, 0x4869: 0x40710420, 0x486a: 0x40710620, 0x486b: 0x40710820, - 0x486c: 0x40710a20, 0x486d: 0x40710c20, 0x486e: 0x40710e20, 0x486f: 0x40711020, - 0x4870: 0x40711220, 0x4871: 0x40711420, 0x4872: 0x40711620, 0x4873: 0x40711820, - 0x4874: 0x40711a20, 0x4875: 0x40711c20, 0x4876: 0x40711e20, 0x4877: 0x40712020, - 0x4878: 0x40712220, 0x4879: 0x40712420, 0x487a: 0x40712620, 0x487b: 0x40712820, - 0x487c: 0x40712a20, 0x487d: 0x40712c20, 0x487e: 0x40712e20, 0x487f: 0x40713020, - // Block 0x122, offset 0x4880 - 0x4880: 0x40713220, 0x4881: 0x40713420, 0x4882: 0x40713620, 0x4883: 0x40713820, - 0x4884: 0x40713a20, 0x4885: 0x40713c20, 0x4886: 0x40713e20, 0x4887: 0x40714020, - 0x4888: 0x40714220, 0x4889: 0x40714420, 0x488a: 0x40714620, 0x488b: 0x40714820, - 0x488c: 0x40714a20, 0x488d: 0x40714c20, 0x488e: 0x40714e20, 0x488f: 0x40715020, - 0x4890: 0x40715220, - // Block 0x123, offset 0x48c0 - 0x48c0: 0x40718820, 0x48c1: 0x40718a20, 0x48c2: 0x40718c20, 0x48c3: 0x40718e20, - 0x48c4: 0x40719020, 0x48c5: 0x40719220, 0x48c6: 0x40719420, 0x48c7: 0x40719620, - 0x48c8: 0x40719820, 0x48c9: 0x40719a20, 0x48ca: 0x40719c20, 0x48cb: 0x40719e20, - 0x48cc: 0x4071a020, 0x48cd: 0x4071a220, 0x48ce: 0x4071a420, 0x48cf: 0x4071a620, - 0x48d0: 0x4071a820, 0x48d1: 0x4071aa20, 0x48d2: 0x4071ac20, 0x48d3: 0x4071ae20, - 0x48d4: 0x4071b020, 0x48d5: 0x4071b220, 0x48d6: 0x4071b420, 0x48d7: 0x4071b620, - 0x48d8: 0x4071b820, 0x48d9: 0x4071ba20, 0x48da: 0x4071bc20, 0x48db: 0x4071be20, - 0x48dc: 0x4071c020, 0x48dd: 0x4071c220, 0x48de: 0x4071c420, - 0x48e0: 0xe0000279, 0x48e1: 0xe000060d, 0x48e2: 0x4028b620, 0x48e3: 0x4028b820, - 0x48f0: 0x4071c620, 0x48f1: 0x4071c820, 0x48f2: 0x4071ca20, 0x48f3: 0x4071cc20, - 0x48f4: 0x4071ce20, 0x48f5: 0x4071d020, 0x48f6: 0x4071d220, 0x48f7: 0x4071d420, - 0x48f8: 0x4071d620, 0x48f9: 0x4071d820, 0x48fa: 0x4071da20, 0x48fb: 0x4071dc20, - 0x48fc: 0x4071de20, 0x48fd: 0x4071e020, 0x48fe: 0x4071e220, 0x48ff: 0x4071e420, - // Block 0x124, offset 0x4900 - 0x4900: 0x4071e620, 0x4901: 0x4071e820, 0x4902: 0x4071ea20, 0x4903: 0x4071ec20, - 0x4904: 0x4071ee20, 0x4905: 0x4071f020, 0x4906: 0x4071f220, 0x4907: 0x4071f420, - 0x4908: 0x4071f620, 0x4909: 0x4071f820, 0x490a: 0x4071fa20, - // Block 0x125, offset 0x4940 - 0x4940: 0x40765020, 0x4941: 0x40765220, 0x4942: 0x40765420, 0x4943: 0x40765620, - 0x4944: 0x40765820, 0x4945: 0x40765a20, 0x4946: 0x40765c20, 0x4947: 0x40765e20, - 0x4948: 0x40766020, 0x4949: 0x40766220, 0x494a: 0x40766420, 0x494b: 0x40766620, - 0x494c: 0x40766820, 0x494d: 0x40766a20, 0x494e: 0x40766c20, 0x494f: 0x40766e20, - 0x4950: 0x40767020, 0x4951: 0x40767220, 0x4952: 0x40767420, 0x4953: 0x40767620, - 0x4954: 0x40767820, 0x4955: 0x40767a20, 0x4956: 0x40767c20, 0x4957: 0x40767e20, - 0x4958: 0x40768020, 0x4959: 0x40768220, 0x495a: 0x40768420, 0x495b: 0x40768620, - 0x495c: 0x40768820, 0x495d: 0x40768a20, 0x495f: 0x4003c420, - 0x4960: 0x40768c20, 0x4961: 0x40768e20, 0x4962: 0x40769020, 0x4963: 0x40769220, - 0x4964: 0x40769420, 0x4965: 0x40769620, 0x4966: 0x40769820, 0x4967: 0x40769a20, - 0x4968: 0x40769c20, 0x4969: 0x40769e20, 0x496a: 0x4076a020, 0x496b: 0x4076a220, - 0x496c: 0x4076a420, 0x496d: 0x4076a620, 0x496e: 0x4076a820, 0x496f: 0x4076aa20, - 0x4970: 0x4076ac20, 0x4971: 0x4076ae20, 0x4972: 0x4076b020, 0x4973: 0x4076b220, - 0x4974: 0x4076b420, 0x4975: 0x4076b620, 0x4976: 0x4076b820, 0x4977: 0x4076ba20, - 0x4978: 0x4076bc20, 0x4979: 0x4076be20, 0x497a: 0x4076c020, 0x497b: 0x4076c220, - 0x497c: 0x4076c420, 0x497d: 0x4076c620, 0x497e: 0x4076c820, 0x497f: 0x4076ca20, - // Block 0x126, offset 0x4980 - 0x4980: 0x4076cc20, 0x4981: 0x4076ce20, 0x4982: 0x4076d020, 0x4983: 0x4076d220, - 0x4988: 0x4076d420, 0x4989: 0x4076d620, 0x498a: 0x4076d820, 0x498b: 0x4076da20, - 0x498c: 0x4076dc20, 0x498d: 0x4076de20, 0x498e: 0x4076e020, 0x498f: 0x4076e220, - 0x4990: 0x4003c620, 0x4991: 0xe000027c, 0x4992: 0xe0000391, 0x4993: 0x40295a20, - 0x4994: 0x40295c20, 0x4995: 0x40295e20, - // Block 0x127, offset 0x49c0 - 0x49c0: 0x0071fc88, 0x49c1: 0x0071fe88, 0x49c2: 0x00720088, 0x49c3: 0x00720288, - 0x49c4: 0x00720488, 0x49c5: 0x00720688, 0x49c6: 0x00720888, 0x49c7: 0x00720a88, - 0x49c8: 0x00720c88, 0x49c9: 0x00720e88, 0x49ca: 0x00721088, 0x49cb: 0x00721288, - 0x49cc: 0x00721488, 0x49cd: 0x00721688, 0x49ce: 0x00721888, 0x49cf: 0x00721a88, - 0x49d0: 0x00721c88, 0x49d1: 0x00721e88, 0x49d2: 0x00722088, 0x49d3: 0x00722288, - 0x49d4: 0x00722488, 0x49d5: 0x00722688, 0x49d6: 0x00722888, 0x49d7: 0x00722a88, - 0x49d8: 0x00722c88, 0x49d9: 0x00722e88, 0x49da: 0x00723088, 0x49db: 0x00723288, - 0x49dc: 0x00723488, 0x49dd: 0x00723688, 0x49de: 0x00723888, 0x49df: 0x00723a88, - 0x49e0: 0x00723c88, 0x49e1: 0x00723e88, 0x49e2: 0x00724088, 0x49e3: 0x00724288, - 0x49e4: 0x00724488, 0x49e5: 0x00724688, 0x49e6: 0x00724888, 0x49e7: 0x00724a88, - 0x49e8: 0x4071fc20, 0x49e9: 0x4071fe20, 0x49ea: 0x40720020, 0x49eb: 0x40720220, - 0x49ec: 0x40720420, 0x49ed: 0x40720620, 0x49ee: 0x40720820, 0x49ef: 0x40720a20, - 0x49f0: 0x40720c20, 0x49f1: 0x40720e20, 0x49f2: 0x40721020, 0x49f3: 0x40721220, - 0x49f4: 0x40721420, 0x49f5: 0x40721620, 0x49f6: 0x40721820, 0x49f7: 0x40721a20, - 0x49f8: 0x40721c20, 0x49f9: 0x40721e20, 0x49fa: 0x40722020, 0x49fb: 0x40722220, - 0x49fc: 0x40722420, 0x49fd: 0x40722620, 0x49fe: 0x40722820, 0x49ff: 0x40722a20, - // Block 0x128, offset 0x4a00 - 0x4a00: 0x40722c20, 0x4a01: 0x40722e20, 0x4a02: 0x40723020, 0x4a03: 0x40723220, - 0x4a04: 0x40723420, 0x4a05: 0x40723620, 0x4a06: 0x40723820, 0x4a07: 0x40723a20, - 0x4a08: 0x40723c20, 0x4a09: 0x40723e20, 0x4a0a: 0x40724020, 0x4a0b: 0x40724220, - 0x4a0c: 0x40724420, 0x4a0d: 0x40724620, 0x4a0e: 0x40724820, 0x4a0f: 0x40724a20, - 0x4a10: 0x40724c20, 0x4a11: 0x40724e20, 0x4a12: 0x40725020, 0x4a13: 0x40725220, - 0x4a14: 0x40725420, 0x4a15: 0x40725620, 0x4a16: 0x40725820, 0x4a17: 0x40725a20, - 0x4a18: 0x40725c20, 0x4a19: 0x40725e20, 0x4a1a: 0x40726020, 0x4a1b: 0x40726220, - 0x4a1c: 0x40726420, 0x4a1d: 0x40726620, 0x4a1e: 0x40726820, 0x4a1f: 0x40726a20, - 0x4a20: 0x40726c20, 0x4a21: 0x40726e20, 0x4a22: 0x40727020, 0x4a23: 0x40727220, - 0x4a24: 0x40727420, 0x4a25: 0x40727620, 0x4a26: 0x40727820, 0x4a27: 0x40727a20, - 0x4a28: 0x40727c20, 0x4a29: 0x40727e20, 0x4a2a: 0x40728020, 0x4a2b: 0x40728220, - 0x4a2c: 0x40728420, 0x4a2d: 0x40728620, 0x4a2e: 0x40728820, 0x4a2f: 0x40728a20, - 0x4a30: 0x40728c20, 0x4a31: 0x40728e20, 0x4a32: 0x40729020, 0x4a33: 0x40729220, - 0x4a34: 0x40729420, 0x4a35: 0x40729620, 0x4a36: 0x40729820, 0x4a37: 0x40729a20, - 0x4a38: 0x40729c20, 0x4a39: 0x40729e20, 0x4a3a: 0x4072a020, 0x4a3b: 0x4072a220, - 0x4a3c: 0x4072a420, 0x4a3d: 0x4072a620, 0x4a3e: 0x4072a820, 0x4a3f: 0x4072aa20, - // Block 0x129, offset 0x4a40 - 0x4a40: 0x4072ac20, 0x4a41: 0x4072ae20, 0x4a42: 0x4072b020, 0x4a43: 0x4072b220, - 0x4a44: 0x4072b420, 0x4a45: 0x4072b620, 0x4a46: 0x4072b820, 0x4a47: 0x4072ba20, - 0x4a48: 0x4072bc20, 0x4a49: 0x4072be20, 0x4a4a: 0x4072c020, 0x4a4b: 0x4072c220, - 0x4a4c: 0x4072c420, 0x4a4d: 0x4072c620, 0x4a4e: 0x4072c820, 0x4a4f: 0x4072ca20, - 0x4a50: 0x4072cc20, 0x4a51: 0x4072ce20, 0x4a52: 0x4072d020, 0x4a53: 0x4072d220, - 0x4a54: 0x4072d420, 0x4a55: 0x4072d620, 0x4a56: 0x4072d820, 0x4a57: 0x4072da20, - 0x4a58: 0x4072dc20, 0x4a59: 0x4072de20, 0x4a5a: 0x4072e020, 0x4a5b: 0x4072e220, - 0x4a5c: 0x4072e420, 0x4a5d: 0x4072e620, - 0x4a60: 0xe0000167, 0x4a61: 0xe00001f5, 0x4a62: 0xe0000310, 0x4a63: 0xe00003ea, - 0x4a64: 0xe00004c5, 0x4a65: 0xe000058f, 0x4a66: 0xe000065a, 0x4a67: 0xe0000702, - 0x4a68: 0xe00007ae, 0x4a69: 0xe0000853, - // Block 0x12a, offset 0x4a80 - 0x4a80: 0x4074c020, 0x4a81: 0x4074c220, 0x4a82: 0x4074c420, 0x4a83: 0x4074c620, - 0x4a84: 0x4074c820, 0x4a85: 0x4074ca20, - 0x4a88: 0x4074cc20, 0x4a8a: 0x4074ce20, 0x4a8b: 0x4074d020, - 0x4a8c: 0x4074d220, 0x4a8d: 0x4074d420, 0x4a8e: 0x4074d620, 0x4a8f: 0x4074d820, - 0x4a90: 0x4074da20, 0x4a91: 0x4074dc20, 0x4a92: 0x4074de20, 0x4a93: 0x4074e020, - 0x4a94: 0x4074e220, 0x4a95: 0x4074e420, 0x4a96: 0x4074e620, 0x4a97: 0x4074e820, - 0x4a98: 0x4074ea20, 0x4a99: 0x4074ec20, 0x4a9a: 0x4074ee20, 0x4a9b: 0x4074f020, - 0x4a9c: 0x4074f220, 0x4a9d: 0x4074f420, 0x4a9e: 0x4074f620, 0x4a9f: 0x4074f820, - 0x4aa0: 0x4074fa20, 0x4aa1: 0x4074fc20, 0x4aa2: 0x4074fe20, 0x4aa3: 0x40750020, - 0x4aa4: 0x40750220, 0x4aa5: 0x40750420, 0x4aa6: 0x40750620, 0x4aa7: 0x40750820, - 0x4aa8: 0x40750a20, 0x4aa9: 0x40750c20, 0x4aaa: 0x40750e20, 0x4aab: 0x40751020, - 0x4aac: 0x40751220, 0x4aad: 0x40751420, 0x4aae: 0x40751620, 0x4aaf: 0x40751820, - 0x4ab0: 0x40751a20, 0x4ab1: 0x40751c20, 0x4ab2: 0x40751e20, 0x4ab3: 0x40752020, - 0x4ab4: 0x40752220, 0x4ab5: 0x40752420, 0x4ab7: 0x40752620, - 0x4ab8: 0x40752820, - 0x4abc: 0x40752a20, 0x4abf: 0x40752c20, - // Block 0x12b, offset 0x4ac0 - 0x4ac0: 0x4075d220, 0x4ac1: 0x4075d420, 0x4ac2: 0x4075d620, 0x4ac3: 0x4075d820, - 0x4ac4: 0x4075da20, 0x4ac5: 0x4075dc20, 0x4ac6: 0x4075de20, 0x4ac7: 0x4075e020, - 0x4ac8: 0x4075e220, 0x4ac9: 0x4075e420, 0x4aca: 0x4075e620, 0x4acb: 0x4075e820, - 0x4acc: 0x4075ea20, 0x4acd: 0x4075ec20, 0x4ace: 0x4075ee20, 0x4acf: 0x4075f020, - 0x4ad0: 0x4075f220, 0x4ad1: 0x4075f420, 0x4ad2: 0x4075f620, 0x4ad3: 0x4075f820, - 0x4ad4: 0x4075fa20, 0x4ad5: 0x4075fc20, 0x4ad7: 0x40038620, - 0x4ad8: 0xe0000297, 0x4ad9: 0xe00003b2, 0x4ada: 0xe000048c, 0x4adb: 0x40296820, - 0x4adc: 0x40296a20, 0x4add: 0x40296c20, 0x4ade: 0x40296e20, 0x4adf: 0x40297020, - // Block 0x12c, offset 0x4b00 - 0x4b00: 0x4038bc20, 0x4b01: 0x4038be20, 0x4b02: 0x4038c020, 0x4b03: 0x4038c220, - 0x4b04: 0x4038c420, 0x4b05: 0x4038c620, 0x4b06: 0x4038c820, 0x4b07: 0x4038ca20, - 0x4b08: 0x4038cc20, 0x4b09: 0x4038ce20, 0x4b0a: 0x4038d020, 0x4b0b: 0x4038d220, - 0x4b0c: 0x4038d420, 0x4b0d: 0x4038d620, 0x4b0e: 0x4038d820, 0x4b0f: 0x4038da20, - 0x4b10: 0x4038dc20, 0x4b11: 0x4038de20, 0x4b12: 0x4038e020, 0x4b13: 0x4038e220, - 0x4b14: 0x4038e420, 0x4b15: 0x4038e620, 0x4b16: 0xe0000294, 0x4b17: 0x40296220, - 0x4b18: 0x40296420, 0x4b19: 0x40296620, 0x4b1a: 0xe00003af, 0x4b1b: 0xe0000489, - 0x4b1f: 0x4003c820, - 0x4b20: 0x40715420, 0x4b21: 0x40715620, 0x4b22: 0x40715820, 0x4b23: 0x40715a20, - 0x4b24: 0x40715c20, 0x4b25: 0x40715e20, 0x4b26: 0x40716020, 0x4b27: 0x40716220, - 0x4b28: 0x40716420, 0x4b29: 0x40716620, 0x4b2a: 0x40716820, 0x4b2b: 0x40716a20, - 0x4b2c: 0x40716c20, 0x4b2d: 0x40716e20, 0x4b2e: 0x40717020, 0x4b2f: 0x40717220, - 0x4b30: 0x40717420, 0x4b31: 0x40717620, 0x4b32: 0x40717820, 0x4b33: 0x40717a20, - 0x4b34: 0x40717c20, 0x4b35: 0x40717e20, 0x4b36: 0x40718020, 0x4b37: 0x40718220, - 0x4b38: 0x40718420, 0x4b39: 0x40718620, - 0x4b3f: 0x4003bc20, - // Block 0x12d, offset 0x4b40 - 0x4b40: 0xe00023a4, 0x4b41: 0xe00023a7, 0x4b42: 0xe00023aa, 0x4b43: 0xe00023ad, - 0x4b44: 0xe00023b0, 0x4b45: 0xe00023b3, 0x4b46: 0xe00023b6, 0x4b47: 0xe00023b9, - 0x4b48: 0xe00023bc, 0x4b49: 0xe00023bf, 0x4b4a: 0xe00023c2, 0x4b4b: 0xe00023c5, - 0x4b4c: 0xe00023c8, 0x4b4d: 0xe00023cb, 0x4b4e: 0xe00023ce, 0x4b4f: 0xe00023d1, - 0x4b50: 0xe00023d4, 0x4b51: 0xe00023d7, 0x4b52: 0xe00023da, 0x4b53: 0xe00023e0, - 0x4b54: 0xe00023e3, 0x4b55: 0xe00023e6, 0x4b56: 0xe00023e9, 0x4b57: 0xe00023ec, - 0x4b58: 0xe00023ef, 0x4b59: 0xe00023f2, 0x4b5a: 0xe00023f5, 0x4b5b: 0xe00023f8, - 0x4b5c: 0xe00023fb, 0x4b5d: 0xe00023fe, 0x4b5e: 0x40865220, 0x4b5f: 0x40865420, - 0x4b60: 0x40862020, 0x4b61: 0x40862220, 0x4b62: 0x40862420, 0x4b63: 0x40862620, - 0x4b64: 0x40862820, 0x4b65: 0x40862a20, 0x4b66: 0x40862c20, 0x4b67: 0x40862e20, - 0x4b68: 0x40863020, 0x4b69: 0x40863220, 0x4b6a: 0x40863420, 0x4b6b: 0x40863620, - 0x4b6c: 0x40863820, 0x4b6d: 0x40863a20, 0x4b6e: 0x40863c20, 0x4b6f: 0x40863e20, - 0x4b70: 0xe00023dd, 0x4b71: 0x40864020, 0x4b72: 0x40864220, 0x4b73: 0x40864420, - 0x4b74: 0x40864620, 0x4b75: 0x40864820, 0x4b76: 0x40864a20, 0x4b77: 0x40864c20, - 0x4b7e: 0x40864e20, 0x4b7f: 0x40865020, - // Block 0x12e, offset 0x4b80 - 0x4b80: 0x4048bc20, 0x4b81: 0x4048be20, 0x4b82: 0x4048c020, 0x4b83: 0x4048c220, - 0x4b85: 0x4048c420, 0x4b86: 0x4048c620, - 0x4b8c: 0x4048c820, 0x4b8d: 0xadc06002, 0x4b8e: 0xa000f302, 0x4b8f: 0xae60f402, - 0x4b90: 0x4048ca20, 0x4b91: 0x4048cc20, 0x4b92: 0x4048ce20, 0x4b93: 0x4048d020, - 0x4b95: 0x4048d220, 0x4b96: 0x4048d420, 0x4b97: 0x4048d620, - 0x4b99: 0x4048d820, 0x4b9a: 0x4048da20, 0x4b9b: 0x4048dc20, - 0x4b9c: 0x4048de20, 0x4b9d: 0x4048e020, 0x4b9e: 0x4048e220, 0x4b9f: 0x4048e420, - 0x4ba0: 0x4048e620, 0x4ba1: 0x4048e820, 0x4ba2: 0x4048ea20, 0x4ba3: 0x4048ec20, - 0x4ba4: 0x4048ee20, 0x4ba5: 0x4048f020, 0x4ba6: 0x4048f220, 0x4ba7: 0x4048f420, - 0x4ba8: 0x4048f620, 0x4ba9: 0x4048f820, 0x4baa: 0x4048fa20, 0x4bab: 0x4048fc20, - 0x4bac: 0x4048fe20, 0x4bad: 0x40490020, 0x4bae: 0x40490220, 0x4baf: 0x40490420, - 0x4bb0: 0x40490620, 0x4bb1: 0x40490820, 0x4bb2: 0x40490a20, 0x4bb3: 0x40490c20, - 0x4bb8: 0xae60fb02, 0x4bb9: 0xa010fc02, 0x4bba: 0xadc0fd02, - 0x4bbf: 0x82092487, - // Block 0x12f, offset 0x4bc0 - 0x4bc0: 0xe00002ac, 0x4bc1: 0xe00003c7, 0x4bc2: 0xe00004a1, 0x4bc3: 0xe0000573, - 0x4bc4: 0x40299820, 0x4bc5: 0x40299a20, 0x4bc6: 0x40299c20, 0x4bc7: 0x40299e20, - 0x4bd0: 0x40060620, 0x4bd1: 0x40060820, 0x4bd2: 0x40060a20, 0x4bd3: 0x40060c20, - 0x4bd4: 0x40060e20, 0x4bd5: 0x40061020, 0x4bd6: 0x40034420, 0x4bd7: 0x40034620, - 0x4bd8: 0x40061220, - 0x4be0: 0x40752e20, 0x4be1: 0x40753020, 0x4be2: 0x40753220, 0x4be3: 0x40753420, - 0x4be4: 0x40753620, 0x4be5: 0x40753820, 0x4be6: 0x40753a20, 0x4be7: 0x40753c20, - 0x4be8: 0x40753e20, 0x4be9: 0x40754020, 0x4bea: 0x40754220, 0x4beb: 0x40754420, - 0x4bec: 0x40754620, 0x4bed: 0x40754820, 0x4bee: 0x40754a20, 0x4bef: 0x40754c20, - 0x4bf0: 0x40754e20, 0x4bf1: 0x40755020, 0x4bf2: 0x40755220, 0x4bf3: 0x40755420, - 0x4bf4: 0x40755620, 0x4bf5: 0x40755820, 0x4bf6: 0x40755a20, 0x4bf7: 0x40755c20, - 0x4bf8: 0x40755e20, 0x4bf9: 0x40756020, 0x4bfa: 0x40756220, 0x4bfb: 0x40756420, - 0x4bfc: 0x40756620, 0x4bfd: 0xe0000291, 0x4bfe: 0x40296020, 0x4bff: 0x40061c20, - // Block 0x130, offset 0x4c00 - 0x4c00: 0x40756820, 0x4c01: 0x40756a20, 0x4c02: 0x40756c20, 0x4c03: 0x40756e20, - 0x4c04: 0x40757020, 0x4c05: 0x40757220, 0x4c06: 0x40757420, 0x4c07: 0x40757620, - 0x4c08: 0x40757820, 0x4c09: 0x40757a20, 0x4c0a: 0x40757c20, 0x4c0b: 0x40757e20, - 0x4c0c: 0x40758020, 0x4c0d: 0x40758220, 0x4c0e: 0x40758420, 0x4c0f: 0x40758620, - 0x4c10: 0x40758820, 0x4c11: 0x40758a20, 0x4c12: 0x40758c20, 0x4c13: 0x40758e20, - 0x4c14: 0x40759020, 0x4c15: 0x40759220, 0x4c16: 0x40759420, 0x4c17: 0x40759620, - 0x4c18: 0x40759820, 0x4c19: 0x40759a20, 0x4c1a: 0x40759c20, 0x4c1b: 0x40759e20, - 0x4c1c: 0x4075a020, 0x4c1d: 0x4075a220, 0x4c1e: 0x4075a420, 0x4c1f: 0x4075a620, - 0x4c20: 0x4075a820, 0x4c21: 0x4075aa20, 0x4c22: 0x4075ac20, 0x4c23: 0x4075ae20, - 0x4c24: 0x4075b020, 0x4c25: 0x4075b220, 0x4c26: 0x4075b420, 0x4c27: 0x4075b620, - 0x4c28: 0x4075b820, 0x4c29: 0x4075ba20, 0x4c2a: 0x4075bc20, 0x4c2b: 0x4075be20, - 0x4c2c: 0x4075c020, 0x4c2d: 0x4075c220, 0x4c2e: 0xe00023a1, 0x4c2f: 0x4075c420, - 0x4c30: 0x4075c620, 0x4c31: 0x4075c820, 0x4c32: 0x4075ca20, 0x4c33: 0x4075cc20, - 0x4c34: 0x4075ce20, 0x4c35: 0x4075d020, - 0x4c39: 0x40061420, 0x4c3a: 0x40038820, 0x4c3b: 0x40038a20, - 0x4c3c: 0x40038c20, 0x4c3d: 0x40038e20, 0x4c3e: 0x40039020, 0x4c3f: 0x40039220, - // Block 0x131, offset 0x4c40 - 0x4c40: 0x4075fe20, 0x4c41: 0x40760020, 0x4c42: 0x40760220, 0x4c43: 0x40760420, - 0x4c44: 0x40760620, 0x4c45: 0x40760820, 0x4c46: 0x40760a20, 0x4c47: 0x40760c20, - 0x4c48: 0x40760e20, 0x4c49: 0x40761020, 0x4c4a: 0x40761220, 0x4c4b: 0x40761420, - 0x4c4c: 0x40761620, 0x4c4d: 0x40761820, 0x4c4e: 0x40761a20, 0x4c4f: 0x40761c20, - 0x4c50: 0x40761e20, 0x4c51: 0x40762020, 0x4c52: 0x40762220, 0x4c53: 0x40762420, - 0x4c54: 0x40762620, 0x4c55: 0x40762820, - 0x4c58: 0xe000029a, 0x4c59: 0xe00003b5, 0x4c5a: 0xe000048f, 0x4c5b: 0xe0000561, - 0x4c5c: 0x40297220, 0x4c5d: 0x40297420, 0x4c5e: 0x40297620, 0x4c5f: 0x40297820, - 0x4c60: 0x40762a20, 0x4c61: 0x40762c20, 0x4c62: 0x40762e20, 0x4c63: 0x40763020, - 0x4c64: 0x40763220, 0x4c65: 0x40763420, 0x4c66: 0x40763620, 0x4c67: 0x40763820, - 0x4c68: 0x40763a20, 0x4c69: 0x40763c20, 0x4c6a: 0x40763e20, 0x4c6b: 0x40764020, - 0x4c6c: 0x40764220, 0x4c6d: 0x40764420, 0x4c6e: 0x40764620, 0x4c6f: 0x40764820, - 0x4c70: 0x40764a20, 0x4c71: 0x40764c20, 0x4c72: 0x40764e20, - 0x4c78: 0xe000029d, 0x4c79: 0xe00003b8, 0x4c7a: 0xe0000492, 0x4c7b: 0xe0000564, - 0x4c7c: 0x40297a20, 0x4c7d: 0x40297c20, 0x4c7e: 0x40297e20, 0x4c7f: 0x40298020, - // Block 0x132, offset 0x4c80 - 0x4c80: 0x405b2620, 0x4c81: 0xe00020a7, 0x4c82: 0x405b2820, 0x4c83: 0x405b2a20, - 0x4c84: 0xe00020aa, 0x4c85: 0x405b2c20, 0x4c86: 0x405b2e20, 0x4c87: 0x405b3020, - 0x4c88: 0xe00020ad, 0x4c89: 0x405b3220, 0x4c8a: 0xe00020b0, 0x4c8b: 0x405b3420, - 0x4c8c: 0xe00020b3, 0x4c8d: 0x405b3620, 0x4c8e: 0xe00020b6, 0x4c8f: 0x405b3820, - 0x4c90: 0xe00020b9, 0x4c91: 0x405b3a20, 0x4c92: 0xe00020bc, 0x4c93: 0x405b3c20, - 0x4c94: 0x405b3e20, 0x4c95: 0xe00020bf, 0x4c96: 0x405b4020, 0x4c97: 0xe00020c2, - 0x4c98: 0x405b4220, 0x4c99: 0xe00020c5, 0x4c9a: 0x405b4420, 0x4c9b: 0xe00020c8, - 0x4c9c: 0x405b4620, 0x4c9d: 0xe00020cb, 0x4c9e: 0x405b4820, 0x4c9f: 0xe00020ce, - 0x4ca0: 0x405b4a20, 0x4ca1: 0x405b4c20, 0x4ca2: 0x405b4e20, 0x4ca3: 0x405b5020, - 0x4ca4: 0x405b5220, 0x4ca5: 0xe00020d1, 0x4ca6: 0x405b5420, 0x4ca7: 0xe00020d4, - 0x4ca8: 0x405b5620, 0x4ca9: 0xe00020d7, 0x4caa: 0x405b5820, 0x4cab: 0xe00020da, - 0x4cac: 0x405b5a20, 0x4cad: 0x405b5c20, 0x4cae: 0xe00020dd, 0x4caf: 0x405b5e20, - 0x4cb0: 0x405b6020, 0x4cb1: 0x405b6220, 0x4cb2: 0x405b6420, 0x4cb3: 0xe00020e0, - 0x4cb4: 0x405b6620, 0x4cb5: 0xe00020e3, 0x4cb6: 0x405b6820, 0x4cb7: 0xe00020e6, - 0x4cb8: 0x405b6a20, 0x4cb9: 0xe00020e9, 0x4cba: 0x405b6c20, 0x4cbb: 0xe00020ec, - 0x4cbc: 0x405b6e20, 0x4cbd: 0x405b7020, 0x4cbe: 0x405b7220, 0x4cbf: 0x405b7420, - // Block 0x133, offset 0x4cc0 - 0x4cc0: 0xe00020ef, 0x4cc1: 0x405b7620, 0x4cc2: 0xe00020f2, 0x4cc3: 0x405b7820, - 0x4cc4: 0xe00020f5, 0x4cc5: 0x405b7a20, 0x4cc6: 0xe00020f8, 0x4cc7: 0x405b7c20, - 0x4cc8: 0x405b7e20, - // Block 0x134, offset 0x4d00 - 0x4d20: 0xe00001ec, 0x4d21: 0xe0000307, 0x4d22: 0xe00003e1, 0x4d23: 0xe00004bc, - 0x4d24: 0xe0000586, 0x4d25: 0xe0000651, 0x4d26: 0xe00006f9, 0x4d27: 0xe00007a5, - 0x4d28: 0xe000084a, 0x4d29: 0x40288820, 0x4d2a: 0x40288a20, 0x4d2b: 0x40288c20, - 0x4d2c: 0x40288e20, 0x4d2d: 0x40289020, 0x4d2e: 0x40289220, 0x4d2f: 0x40289420, - 0x4d30: 0x40289620, 0x4d31: 0x40289820, 0x4d32: 0x40289a20, 0x4d33: 0x40289c20, - 0x4d34: 0x40289e20, 0x4d35: 0x4028a020, 0x4d36: 0x4028a220, 0x4d37: 0x4028a420, - 0x4d38: 0x4028a620, 0x4d39: 0x4028a820, 0x4d3a: 0x4028aa20, 0x4d3b: 0x4028ac20, - 0x4d3c: 0x4028ae20, 0x4d3d: 0x4028b020, 0x4d3e: 0x4028b220, - // Block 0x135, offset 0x4d40 - 0x4d40: 0xa000f202, 0x4d41: 0xa000f302, 0x4d42: 0xa000f402, 0x4d43: 0x40489220, - 0x4d44: 0x40489420, 0x4d45: 0x40483420, 0x4d46: 0x40483620, 0x4d47: 0x40483820, - 0x4d48: 0x40483a20, 0x4d49: 0x40483c20, 0x4d4a: 0x40483e20, 0x4d4b: 0x40484020, - 0x4d4c: 0x40484220, 0x4d4d: 0x40484420, 0x4d4e: 0x40484620, 0x4d4f: 0x40484820, - 0x4d50: 0x40484a20, 0x4d51: 0x40484c20, 0x4d52: 0x40484e20, 0x4d53: 0x40485020, - 0x4d54: 0x40485220, 0x4d55: 0x40485420, 0x4d56: 0x40485620, 0x4d57: 0x40485820, - 0x4d58: 0x40485a20, 0x4d59: 0x40485c20, 0x4d5a: 0x40485e20, 0x4d5b: 0x40486020, - 0x4d5c: 0x40486220, 0x4d5d: 0x40486420, 0x4d5e: 0x40486620, 0x4d5f: 0x40486820, - 0x4d60: 0x40486a20, 0x4d61: 0x40486c20, 0x4d62: 0x40486e20, 0x4d63: 0x40487020, - 0x4d64: 0x40487220, 0x4d65: 0x40487420, 0x4d66: 0x40487620, 0x4d67: 0x40487820, - 0x4d68: 0x40487a20, 0x4d69: 0x40487c20, 0x4d6a: 0x40487e20, 0x4d6b: 0x40488020, - 0x4d6c: 0x40488220, 0x4d6d: 0x40488420, 0x4d6e: 0x40488620, 0x4d6f: 0x40488820, - 0x4d70: 0x40488a20, 0x4d71: 0x40488c20, 0x4d72: 0x40488e20, 0x4d73: 0x40489020, - 0x4d74: 0x40489620, 0x4d75: 0x40489820, 0x4d76: 0x40489a20, 0x4d77: 0x40489c20, - 0x4d78: 0x40489e20, 0x4d79: 0x4048a020, 0x4d7a: 0x4048a220, 0x4d7b: 0x4048a420, - 0x4d7c: 0x4048a620, 0x4d7d: 0x4048a820, 0x4d7e: 0x4048aa20, 0x4d7f: 0x4048ac20, - // Block 0x136, offset 0x4d80 - 0x4d80: 0x4048ae20, 0x4d81: 0x4048b020, 0x4d82: 0x4048b220, 0x4d83: 0x4048b420, - 0x4d84: 0x4048b620, 0x4d85: 0x4048b820, 0x4d86: 0x8209245d, 0x4d87: 0x40034820, - 0x4d88: 0x40034a20, 0x4d89: 0x4005fc20, 0x4d8a: 0x4005fe20, 0x4d8b: 0x40060020, - 0x4d8c: 0x40060220, 0x4d8d: 0x40060420, - 0x4d92: 0xe00002a9, 0x4d93: 0xe00003c4, - 0x4d94: 0xe000049e, 0x4d95: 0xe0000570, 0x4d96: 0xe000063a, 0x4d97: 0xe00006ea, - 0x4d98: 0xe0000792, 0x4d99: 0xe000083b, 0x4d9a: 0xe00008e6, 0x4d9b: 0x40298220, - 0x4d9c: 0x40298420, 0x4d9d: 0x40298620, 0x4d9e: 0x40298820, 0x4d9f: 0x40298a20, - 0x4da0: 0x40298c20, 0x4da1: 0x40298e20, 0x4da2: 0x40299020, 0x4da3: 0x40299220, - 0x4da4: 0x40299420, 0x4da5: 0x40299620, 0x4da6: 0xe00001df, 0x4da7: 0xe00002a6, - 0x4da8: 0xe00003c1, 0x4da9: 0xe000049b, 0x4daa: 0xe000056d, 0x4dab: 0xe0000637, - 0x4dac: 0xe00006e7, 0x4dad: 0xe000078f, 0x4dae: 0xe0000838, 0x4daf: 0xe00008e3, - // Block 0x137, offset 0x4dc0 - 0x4dc0: 0xa000f202, 0x4dc1: 0xa000f302, 0x4dc2: 0xa000f402, 0x4dc3: 0x40467e20, - 0x4dc4: 0x40468020, 0x4dc5: 0x40468220, 0x4dc6: 0x40468420, 0x4dc7: 0x40468620, - 0x4dc8: 0x40468820, 0x4dc9: 0x40468a20, 0x4dca: 0x40468c20, 0x4dcb: 0x40468e20, - 0x4dcc: 0x40469020, 0x4dcd: 0x40469220, 0x4dce: 0x40469420, 0x4dcf: 0x40469620, - 0x4dd0: 0x40469820, 0x4dd1: 0x40469a20, 0x4dd2: 0x40469c20, 0x4dd3: 0x40469e20, - 0x4dd4: 0x4046a020, 0x4dd5: 0x4046a220, 0x4dd6: 0x4046a420, 0x4dd7: 0x4046a620, - 0x4dd8: 0x4046a820, 0x4dd9: 0x4046aa20, 0x4dda: 0xe0001878, 0x4ddb: 0x4046ac20, - 0x4ddc: 0xe000187b, 0x4ddd: 0x4046ae20, 0x4dde: 0x4046b020, 0x4ddf: 0x4046b220, - 0x4de0: 0x4046b420, 0x4de1: 0x4046b620, 0x4de2: 0x4046b820, 0x4de3: 0x4046ba20, - 0x4de4: 0x4046bc20, 0x4de5: 0x4046be20, 0x4de6: 0x4046c020, 0x4de7: 0x4046c220, - 0x4de8: 0x4046c420, 0x4de9: 0x4046c620, 0x4dea: 0x4046c820, 0x4deb: 0xe000187e, - 0x4dec: 0x4046ca20, 0x4ded: 0x4046cc20, 0x4dee: 0x4046ce20, 0x4def: 0x4046d020, - 0x4df0: 0x4046d220, 0x4df1: 0x4046d420, 0x4df2: 0x4046d620, 0x4df3: 0x4046d820, - 0x4df4: 0x4046da20, 0x4df5: 0x4046dc20, 0x4df6: 0x4046de20, 0x4df7: 0x4046e020, - 0x4df8: 0x4046e220, 0x4df9: 0x82092372, 0x4dfa: 0xa070f102, 0x4dfb: 0x40061620, - 0x4dfc: 0x40061820, 0x4dfd: 0xa0000000, 0x4dfe: 0x40039420, 0x4dff: 0x40039620, - // Block 0x138, offset 0x4e00 - 0x4e00: 0x40034c20, 0x4e01: 0x40034e20, - 0x4e10: 0x4072e820, 0x4e11: 0x4072ea20, 0x4e12: 0x4072ec20, 0x4e13: 0x4072ee20, - 0x4e14: 0x4072f020, 0x4e15: 0x4072f220, 0x4e16: 0x4072f420, 0x4e17: 0x4072f620, - 0x4e18: 0x4072f820, 0x4e19: 0x4072fa20, 0x4e1a: 0x4072fc20, 0x4e1b: 0x4072fe20, - 0x4e1c: 0x40730020, 0x4e1d: 0x40730220, 0x4e1e: 0x40730420, 0x4e1f: 0x40730620, - 0x4e20: 0x40730820, 0x4e21: 0x40730a20, 0x4e22: 0x40730c20, 0x4e23: 0x40730e20, - 0x4e24: 0x40731020, 0x4e25: 0x40731220, 0x4e26: 0x40731420, 0x4e27: 0x40731620, - 0x4e28: 0x40731820, - 0x4e30: 0xe00001d0, 0x4e31: 0xe0000264, 0x4e32: 0xe000037c, 0x4e33: 0xe0000456, - 0x4e34: 0xe000052b, 0x4e35: 0xe00005f5, 0x4e36: 0xe00006c0, 0x4e37: 0xe0000768, - 0x4e38: 0xe0000814, 0x4e39: 0xe00008b9, - // Block 0x139, offset 0x4e40 - 0x4e40: 0xae60f202, 0x4e41: 0xae60f302, 0x4e42: 0xae60f402, 0x4e43: 0x404f4020, - 0x4e44: 0x404f4220, 0x4e45: 0x404f4420, 0x4e46: 0x404f4620, 0x4e47: 0x404f4820, - 0x4e48: 0x404f4a20, 0x4e49: 0x404f4c20, 0x4e4a: 0x404f4e20, 0x4e4b: 0x404f5020, - 0x4e4c: 0x404f5220, 0x4e4d: 0x404f5420, 0x4e4e: 0x404f5620, 0x4e4f: 0x404f5820, - 0x4e50: 0x404f5a20, 0x4e51: 0x404f5c20, 0x4e52: 0x404f5e20, 0x4e53: 0x404f6020, - 0x4e54: 0x404f6220, 0x4e55: 0x404f6420, 0x4e56: 0x404f6620, 0x4e57: 0x404f6820, - 0x4e58: 0x404f6a20, 0x4e59: 0x404f6c20, 0x4e5a: 0x404f6e20, 0x4e5b: 0x404f7020, - 0x4e5c: 0x404f7220, 0x4e5d: 0x404f7420, 0x4e5e: 0x404f7620, 0x4e5f: 0x404f7820, - 0x4e60: 0x404f7a20, 0x4e61: 0x404f7c20, 0x4e62: 0x404f7e20, 0x4e63: 0x404f8020, - 0x4e64: 0x404f8220, 0x4e65: 0x404f8420, 0x4e66: 0x404f8620, 0x4e67: 0x404f8820, - 0x4e68: 0x404f8a20, 0x4e69: 0x404f8c20, 0x4e6a: 0x404f8e20, 0x4e6b: 0x404f9020, - 0x4e6c: 0x404f9220, 0x4e6d: 0x404f9420, 0x4e6e: 0x404f9620, 0x4e6f: 0x404f9820, - 0x4e70: 0x404f9a20, 0x4e71: 0xc31507e1, 0x4e72: 0xc31707e1, 0x4e73: 0x820927d0, - 0x4e74: 0x820927d1, 0x4e76: 0xe00001b2, 0x4e77: 0xe0000246, - 0x4e78: 0xe000035e, 0x4e79: 0xe0000438, 0x4e7a: 0xe000050d, 0x4e7b: 0xe00005d7, - 0x4e7c: 0xe00006a2, 0x4e7d: 0xe000074a, 0x4e7e: 0xe00007f6, 0x4e7f: 0xe000089b, - // Block 0x13a, offset 0x4e80 - 0x4e80: 0x40039820, 0x4e81: 0x40035020, 0x4e82: 0x40035220, 0x4e83: 0x4002de20, - // Block 0x13b, offset 0x4ec0 - 0x4ec0: 0xa000f202, 0x4ec1: 0xa000f302, 0x4ec2: 0xa000f402, 0x4ec3: 0x4046e820, - 0x4ec4: 0x4046ea20, 0x4ec5: 0x4046ec20, 0x4ec6: 0x4046ee20, 0x4ec7: 0x4046f020, - 0x4ec8: 0x4046f220, 0x4ec9: 0x4046f420, 0x4eca: 0x4046f620, 0x4ecb: 0x4046f820, - 0x4ecc: 0x4046fa20, 0x4ecd: 0x4046fc20, 0x4ece: 0x4046fe20, 0x4ecf: 0x40470020, - 0x4ed0: 0x40470220, 0x4ed1: 0x40470420, 0x4ed2: 0x40470620, 0x4ed3: 0x40470820, - 0x4ed4: 0x40470a20, 0x4ed5: 0x40470c20, 0x4ed6: 0x40470e20, 0x4ed7: 0x40471020, - 0x4ed8: 0x40471220, 0x4ed9: 0x40471420, 0x4eda: 0x40471620, 0x4edb: 0x40471820, - 0x4edc: 0x40471a20, 0x4edd: 0x40471c20, 0x4ede: 0x40471e20, 0x4edf: 0x40472020, - 0x4ee0: 0x40472220, 0x4ee1: 0x40472420, 0x4ee2: 0x40472620, 0x4ee3: 0x40472820, - 0x4ee4: 0x40472a20, 0x4ee5: 0x40472c20, 0x4ee6: 0x40472e20, 0x4ee7: 0x40473020, - 0x4ee8: 0x40473220, 0x4ee9: 0x40473420, 0x4eea: 0x40473620, 0x4eeb: 0x40473820, - 0x4eec: 0x40473a20, 0x4eed: 0x40473c20, 0x4eee: 0x40473e20, 0x4eef: 0x40474020, - 0x4ef0: 0x40474220, 0x4ef1: 0x40474420, 0x4ef2: 0x40474620, 0x4ef3: 0x40474820, - 0x4ef4: 0x40474a20, 0x4ef5: 0x40474c20, 0x4ef6: 0x40474e20, 0x4ef7: 0x40475020, - 0x4ef8: 0x40475220, 0x4ef9: 0x40475420, 0x4efa: 0x40475620, 0x4efb: 0x40475820, - 0x4efc: 0x40475a20, 0x4efd: 0x40475c20, 0x4efe: 0x40475e20, 0x4eff: 0x40476020, - // Block 0x13c, offset 0x4f00 - 0x4f00: 0x820923b1, 0x4f01: 0x40476420, 0x4f02: 0x40476620, 0x4f03: 0x40476820, - 0x4f04: 0x4046e620, 0x4f05: 0x40035420, 0x4f06: 0x40035620, 0x4f07: 0x40061a20, - 0x4f08: 0x40039a20, - 0x4f10: 0xe00001d9, 0x4f11: 0xe00002a0, 0x4f12: 0xe00003bb, 0x4f13: 0xe0000495, - 0x4f14: 0xe0000567, 0x4f15: 0xe0000631, 0x4f16: 0xe00006e1, 0x4f17: 0xe0000789, - 0x4f18: 0xe0000832, 0x4f19: 0xe00008dd, - // Block 0x13d, offset 0x4f40 - 0x4f40: 0x40476a20, 0x4f41: 0x40476c20, 0x4f42: 0x40476e20, 0x4f43: 0x40477020, - 0x4f44: 0x40477220, 0x4f45: 0x40477420, 0x4f46: 0x40477620, 0x4f47: 0x40477820, - 0x4f48: 0x40477a20, 0x4f49: 0x40477c20, 0x4f4a: 0x40478420, 0x4f4b: 0x40478620, - 0x4f4c: 0x40478820, 0x4f4d: 0x40478a20, 0x4f4e: 0x40478c20, 0x4f4f: 0x40478e20, - 0x4f50: 0x40479020, 0x4f51: 0x40479220, 0x4f52: 0x40479420, 0x4f53: 0x40479620, - 0x4f54: 0x40479820, 0x4f55: 0x40479a20, 0x4f56: 0x40479c20, 0x4f57: 0x40479e20, - 0x4f58: 0x4047a020, 0x4f59: 0x4047a220, 0x4f5a: 0x4047a420, 0x4f5b: 0x4047a620, - 0x4f5c: 0x4047a820, 0x4f5d: 0x4047aa20, 0x4f5e: 0x4047ac20, 0x4f5f: 0x4047ae20, - 0x4f60: 0x4047b020, 0x4f61: 0x4047b220, 0x4f62: 0x4047b420, 0x4f63: 0x4047b620, - 0x4f64: 0x4047b820, 0x4f65: 0x4047ba20, 0x4f66: 0x4047bc20, 0x4f67: 0x40478020, - 0x4f68: 0x40477e20, 0x4f69: 0x40478220, 0x4f6a: 0x4047be20, 0x4f6b: 0xa000f302, - 0x4f6c: 0xa000f402, 0x4f6d: 0x4047c020, 0x4f6e: 0x4047c220, 0x4f6f: 0x4047c420, - 0x4f70: 0x4047c620, 0x4f71: 0x4047c820, 0x4f72: 0x4047ca20, 0x4f73: 0x4047cc20, - 0x4f74: 0x4047ce20, 0x4f75: 0x4047d020, 0x4f76: 0x820923e9, 0x4f77: 0xa070f102, - // Block 0x13e, offset 0x4f80 - 0x4f80: 0xe00001dc, 0x4f81: 0xe00002a3, 0x4f82: 0xe00003be, 0x4f83: 0xe0000498, - 0x4f84: 0xe000056a, 0x4f85: 0xe0000634, 0x4f86: 0xe00006e4, 0x4f87: 0xe000078c, - 0x4f88: 0xe0000835, 0x4f89: 0xe00008e0, - // Block 0x13f, offset 0x4fc0 - 0x4fc0: 0x4076e420, 0x4fc1: 0x4076e620, 0x4fc2: 0x4076e820, 0x4fc3: 0x4076ea20, - 0x4fc4: 0x4076ec20, 0x4fc5: 0x4076ee20, 0x4fc6: 0x4076f020, 0x4fc7: 0x4076f220, - 0x4fc8: 0x4076f420, 0x4fc9: 0x4076f620, 0x4fca: 0x4076f820, 0x4fcb: 0x4076fa20, - 0x4fcc: 0x4076fc20, 0x4fcd: 0x4076fe20, 0x4fce: 0x40770020, 0x4fcf: 0x40770220, - 0x4fd0: 0x40770420, 0x4fd1: 0x40770620, 0x4fd2: 0x40770820, 0x4fd3: 0x40770a20, - 0x4fd4: 0x40770c20, 0x4fd5: 0x40770e20, 0x4fd6: 0x40771020, 0x4fd7: 0x40771220, - 0x4fd8: 0x40771420, 0x4fd9: 0x40771620, 0x4fda: 0x40771820, 0x4fdb: 0x40771a20, - 0x4fdc: 0x40771c20, 0x4fdd: 0x40771e20, 0x4fde: 0x40772020, 0x4fdf: 0x40772220, - 0x4fe0: 0x40772420, 0x4fe1: 0x40772620, 0x4fe2: 0x40772820, 0x4fe3: 0x40772a20, - 0x4fe4: 0x40772c20, 0x4fe5: 0x40772e20, 0x4fe6: 0x40773020, 0x4fe7: 0x40773220, - 0x4fe8: 0x40773420, 0x4fe9: 0x40773620, 0x4fea: 0x40773820, 0x4feb: 0x40773a20, - 0x4fec: 0x40773c20, 0x4fed: 0x40773e20, 0x4fee: 0x40774020, 0x4fef: 0x40774220, - 0x4ff0: 0x40774420, 0x4ff1: 0x40774620, 0x4ff2: 0x40774820, 0x4ff3: 0x40774a20, - 0x4ff4: 0x40774c20, 0x4ff5: 0x40774e20, 0x4ff6: 0x40775020, 0x4ff7: 0x40775220, - 0x4ff8: 0x40775420, 0x4ff9: 0x40775620, 0x4ffa: 0x40775820, 0x4ffb: 0x40775a20, - 0x4ffc: 0x40775c20, 0x4ffd: 0x40775e20, 0x4ffe: 0x40776020, 0x4fff: 0x40776220, - // Block 0x140, offset 0x5000 - 0x5000: 0x40776420, 0x5001: 0x40776620, 0x5002: 0x40776820, 0x5003: 0x40776a20, - 0x5004: 0x40776c20, 0x5005: 0x40776e20, 0x5006: 0x40777020, 0x5007: 0x40777220, - 0x5008: 0x40777420, 0x5009: 0x40777620, 0x500a: 0x40777820, 0x500b: 0x40777a20, - 0x500c: 0x40777c20, 0x500d: 0x40777e20, 0x500e: 0x40778020, 0x500f: 0x40778220, - 0x5010: 0x40778420, 0x5011: 0x40778620, 0x5012: 0x40778820, 0x5013: 0x40778a20, - 0x5014: 0x40778c20, 0x5015: 0x40778e20, 0x5016: 0x40779020, 0x5017: 0x40779220, - 0x5018: 0x40779420, 0x5019: 0x40779620, 0x501a: 0x40779820, 0x501b: 0x40779a20, - 0x501c: 0x40779c20, 0x501d: 0x40779e20, 0x501e: 0x4077a020, 0x501f: 0x4077a220, - 0x5020: 0x4077a420, 0x5021: 0x4077a620, 0x5022: 0x4077a820, 0x5023: 0x4077aa20, - 0x5024: 0x4077ac20, 0x5025: 0x4077ae20, 0x5026: 0x4077b020, 0x5027: 0x4077b220, - 0x5028: 0x4077b420, 0x5029: 0x4077b620, 0x502a: 0x4077b820, 0x502b: 0x4077ba20, - 0x502c: 0x4077bc20, 0x502d: 0x4077be20, 0x502e: 0x4077c020, 0x502f: 0x4077c220, - 0x5030: 0x4077c420, 0x5031: 0x4077c620, 0x5032: 0x4077c820, 0x5033: 0x4077ca20, - 0x5034: 0x4077cc20, 0x5035: 0x4077ce20, 0x5036: 0x4077d020, 0x5037: 0x4077d220, - 0x5038: 0x4077d420, 0x5039: 0x4077d620, 0x503a: 0x4077d820, 0x503b: 0x4077da20, - 0x503c: 0x4077dc20, 0x503d: 0x4077de20, 0x503e: 0x4077e020, 0x503f: 0x4077e220, - // Block 0x141, offset 0x5040 - 0x5040: 0x4077e420, 0x5041: 0x4077e620, 0x5042: 0x4077e820, 0x5043: 0x4077ea20, - 0x5044: 0x4077ec20, 0x5045: 0x4077ee20, 0x5046: 0x4077f020, 0x5047: 0x4077f220, - 0x5048: 0x4077f420, 0x5049: 0x4077f620, 0x504a: 0x4077f820, 0x504b: 0x4077fa20, - 0x504c: 0x4077fc20, 0x504d: 0x4077fe20, 0x504e: 0x40780020, 0x504f: 0x40780220, - 0x5050: 0x40780420, 0x5051: 0x40780620, 0x5052: 0x40780820, 0x5053: 0x40780a20, - 0x5054: 0x40780c20, 0x5055: 0x40780e20, 0x5056: 0x40781020, 0x5057: 0x40781220, - 0x5058: 0x40781420, 0x5059: 0x40781620, 0x505a: 0x40781820, 0x505b: 0x40781a20, - 0x505c: 0x40781c20, 0x505d: 0x40781e20, 0x505e: 0x40782020, 0x505f: 0x40782220, - 0x5060: 0x40782420, 0x5061: 0x40782620, 0x5062: 0x40782820, 0x5063: 0x40782a20, - 0x5064: 0x40782c20, 0x5065: 0x40782e20, 0x5066: 0x40783020, 0x5067: 0x40783220, - 0x5068: 0x40783420, 0x5069: 0x40783620, 0x506a: 0x40783820, 0x506b: 0x40783a20, - 0x506c: 0x40783c20, 0x506d: 0x40783e20, 0x506e: 0x40784020, 0x506f: 0x40784220, - 0x5070: 0x40784420, 0x5071: 0x40784620, 0x5072: 0x40784820, 0x5073: 0x40784a20, - 0x5074: 0x40784c20, 0x5075: 0x40784e20, 0x5076: 0x40785020, 0x5077: 0x40785220, - 0x5078: 0x40785420, 0x5079: 0x40785620, 0x507a: 0x40785820, 0x507b: 0x40785a20, - 0x507c: 0x40785c20, 0x507d: 0x40785e20, 0x507e: 0x40786020, 0x507f: 0x40786220, - // Block 0x142, offset 0x5080 - 0x5080: 0x40786420, 0x5081: 0x40786620, 0x5082: 0x40786820, 0x5083: 0x40786a20, - 0x5084: 0x40786c20, 0x5085: 0x40786e20, 0x5086: 0x40787020, 0x5087: 0x40787220, - 0x5088: 0x40787420, 0x5089: 0x40787620, 0x508a: 0x40787820, 0x508b: 0x40787a20, - 0x508c: 0x40787c20, 0x508d: 0x40787e20, 0x508e: 0x40788020, 0x508f: 0x40788220, - 0x5090: 0x40788420, 0x5091: 0x40788620, 0x5092: 0x40788820, 0x5093: 0x40788a20, - 0x5094: 0x40788c20, 0x5095: 0x40788e20, 0x5096: 0x40789020, 0x5097: 0x40789220, - 0x5098: 0x40789420, 0x5099: 0x40789620, 0x509a: 0x40789820, 0x509b: 0x40789a20, - 0x509c: 0x40789c20, 0x509d: 0x40789e20, 0x509e: 0x4078a020, 0x509f: 0x4078a220, - 0x50a0: 0x4078a420, 0x50a1: 0x4078a620, 0x50a2: 0x4078a820, 0x50a3: 0x4078aa20, - 0x50a4: 0x4078ac20, 0x50a5: 0x4078ae20, 0x50a6: 0x4078b020, 0x50a7: 0x4078b220, - 0x50a8: 0x4078b420, 0x50a9: 0x4078b620, 0x50aa: 0x4078b820, 0x50ab: 0x4078ba20, - 0x50ac: 0x4078bc20, 0x50ad: 0x4078be20, 0x50ae: 0x4078c020, 0x50af: 0x4078c220, - 0x50b0: 0x4078c420, 0x50b1: 0x4078c620, 0x50b2: 0x4078c820, 0x50b3: 0x4078ca20, - 0x50b4: 0x4078cc20, 0x50b5: 0x4078ce20, 0x50b6: 0x4078d020, 0x50b7: 0x4078d220, - 0x50b8: 0x4078d420, 0x50b9: 0x4078d620, 0x50ba: 0x4078d820, 0x50bb: 0x4078da20, - 0x50bc: 0x4078dc20, 0x50bd: 0x4078de20, 0x50be: 0x4078e020, 0x50bf: 0x4078e220, - // Block 0x143, offset 0x50c0 - 0x50c0: 0x4078e420, 0x50c1: 0x4078e620, 0x50c2: 0x4078e820, 0x50c3: 0x4078ea20, - 0x50c4: 0x4078ec20, 0x50c5: 0x4078ee20, 0x50c6: 0x4078f020, 0x50c7: 0x4078f220, - 0x50c8: 0x4078f420, 0x50c9: 0x4078f620, 0x50ca: 0x4078f820, 0x50cb: 0x4078fa20, - 0x50cc: 0x4078fc20, 0x50cd: 0x4078fe20, 0x50ce: 0x40790020, 0x50cf: 0x40790220, - 0x50d0: 0x40790420, 0x50d1: 0x40790620, 0x50d2: 0x40790820, 0x50d3: 0x40790a20, - 0x50d4: 0x40790c20, 0x50d5: 0x40790e20, 0x50d6: 0x40791020, 0x50d7: 0x40791220, - 0x50d8: 0x40791420, 0x50d9: 0x40791620, 0x50da: 0x40791820, 0x50db: 0x40791a20, - 0x50dc: 0x40791c20, 0x50dd: 0x40791e20, 0x50de: 0x40792020, 0x50df: 0x40792220, - 0x50e0: 0x40792420, 0x50e1: 0x40792620, 0x50e2: 0x40792820, 0x50e3: 0x40792a20, - 0x50e4: 0x40792c20, 0x50e5: 0x40792e20, 0x50e6: 0x40793020, 0x50e7: 0x40793220, - 0x50e8: 0x40793420, 0x50e9: 0x40793620, 0x50ea: 0x40793820, 0x50eb: 0x40793a20, - 0x50ec: 0x40793c20, 0x50ed: 0x40793e20, 0x50ee: 0x40794020, 0x50ef: 0x40794220, - 0x50f0: 0x40794420, 0x50f1: 0x40794620, 0x50f2: 0x40794820, 0x50f3: 0x40794a20, - 0x50f4: 0x40794c20, 0x50f5: 0x40794e20, 0x50f6: 0x40795020, 0x50f7: 0x40795220, - 0x50f8: 0x40795420, 0x50f9: 0x40795620, 0x50fa: 0x40795820, 0x50fb: 0x40795a20, - 0x50fc: 0x40795c20, 0x50fd: 0x40795e20, 0x50fe: 0x40796020, 0x50ff: 0x40796220, - // Block 0x144, offset 0x5100 - 0x5100: 0x40796420, 0x5101: 0x40796620, 0x5102: 0x40796820, 0x5103: 0x40796a20, - 0x5104: 0x40796c20, 0x5105: 0x40796e20, 0x5106: 0x40797020, 0x5107: 0x40797220, - 0x5108: 0x40797420, 0x5109: 0x40797620, 0x510a: 0x40797820, 0x510b: 0x40797a20, - 0x510c: 0x40797c20, 0x510d: 0x40797e20, 0x510e: 0x40798020, 0x510f: 0x40798220, - 0x5110: 0x40798420, 0x5111: 0x40798620, 0x5112: 0x40798820, 0x5113: 0x40798a20, - 0x5114: 0x40798c20, 0x5115: 0x40798e20, 0x5116: 0x40799020, 0x5117: 0x40799220, - 0x5118: 0x40799420, 0x5119: 0x40799620, 0x511a: 0x40799820, 0x511b: 0x40799a20, - 0x511c: 0x40799c20, 0x511d: 0x40799e20, 0x511e: 0x4079a020, 0x511f: 0x4079a220, - 0x5120: 0x4079a420, 0x5121: 0x4079a620, 0x5122: 0x4079a820, 0x5123: 0x4079aa20, - 0x5124: 0x4079ac20, 0x5125: 0x4079ae20, 0x5126: 0x4079b020, 0x5127: 0x4079b220, - 0x5128: 0x4079b420, 0x5129: 0x4079b620, 0x512a: 0x4079b820, 0x512b: 0x4079ba20, - 0x512c: 0x4079bc20, 0x512d: 0x4079be20, 0x512e: 0x4079c020, 0x512f: 0x4079c220, - 0x5130: 0x4079c420, 0x5131: 0x4079c620, 0x5132: 0x4079c820, 0x5133: 0x4079ca20, - 0x5134: 0x4079cc20, 0x5135: 0x4079ce20, 0x5136: 0x4079d020, 0x5137: 0x4079d220, - 0x5138: 0x4079d420, 0x5139: 0x4079d620, 0x513a: 0x4079d820, 0x513b: 0x4079da20, - 0x513c: 0x4079dc20, 0x513d: 0x4079de20, 0x513e: 0x4079e020, 0x513f: 0x4079e220, - // Block 0x145, offset 0x5140 - 0x5140: 0x4079e420, 0x5141: 0x4079e620, 0x5142: 0x4079e820, 0x5143: 0x4079ea20, - 0x5144: 0x4079ec20, 0x5145: 0x4079ee20, 0x5146: 0x4079f020, 0x5147: 0x4079f220, - 0x5148: 0x4079f420, 0x5149: 0x4079f620, 0x514a: 0x4079f820, 0x514b: 0x4079fa20, - 0x514c: 0x4079fc20, 0x514d: 0x4079fe20, 0x514e: 0x407a0020, 0x514f: 0x407a0220, - 0x5150: 0x407a0420, 0x5151: 0x407a0620, 0x5152: 0x407a0820, 0x5153: 0x407a0a20, - 0x5154: 0x407a0c20, 0x5155: 0x407a0e20, 0x5156: 0x407a1020, 0x5157: 0x407a1220, - 0x5158: 0x407a1420, 0x5159: 0x407a1620, 0x515a: 0x407a1820, 0x515b: 0x407a1a20, - 0x515c: 0x407a1c20, 0x515d: 0x407a1e20, 0x515e: 0x407a2020, 0x515f: 0x407a2220, - 0x5160: 0x407a2420, 0x5161: 0x407a2620, 0x5162: 0x407a2820, 0x5163: 0x407a2a20, - 0x5164: 0x407a2c20, 0x5165: 0x407a2e20, 0x5166: 0x407a3020, 0x5167: 0x407a3220, - 0x5168: 0x407a3420, 0x5169: 0x407a3620, 0x516a: 0x407a3820, 0x516b: 0x407a3a20, - 0x516c: 0x407a3c20, 0x516d: 0x407a3e20, 0x516e: 0x407a4020, 0x516f: 0x407a4220, - 0x5170: 0x407a4420, 0x5171: 0x407a4620, 0x5172: 0x407a4820, 0x5173: 0x407a4a20, - 0x5174: 0x407a4c20, 0x5175: 0x407a4e20, 0x5176: 0x407a5020, 0x5177: 0x407a5220, - 0x5178: 0x407a5420, 0x5179: 0x407a5620, 0x517a: 0x407a5820, 0x517b: 0x407a5a20, - 0x517c: 0x407a5c20, 0x517d: 0x407a5e20, 0x517e: 0x407a6020, 0x517f: 0x407a6220, - // Block 0x146, offset 0x5180 - 0x5180: 0x407a6420, 0x5181: 0x407a6620, 0x5182: 0x407a6820, 0x5183: 0x407a6a20, - 0x5184: 0x407a6c20, 0x5185: 0x407a6e20, 0x5186: 0x407a7020, 0x5187: 0x407a7220, - 0x5188: 0x407a7420, 0x5189: 0x407a7620, 0x518a: 0x407a7820, 0x518b: 0x407a7a20, - 0x518c: 0x407a7c20, 0x518d: 0x407a7e20, 0x518e: 0x407a8020, 0x518f: 0x407a8220, - 0x5190: 0x407a8420, 0x5191: 0x407a8620, 0x5192: 0x407a8820, 0x5193: 0x407a8a20, - 0x5194: 0x407a8c20, 0x5195: 0x407a8e20, 0x5196: 0x407a9020, 0x5197: 0x407a9220, - 0x5198: 0x407a9420, 0x5199: 0x407a9620, 0x519a: 0x407a9820, 0x519b: 0x407a9a20, - 0x519c: 0x407a9c20, 0x519d: 0x407a9e20, 0x519e: 0x407aa020, 0x519f: 0x407aa220, - 0x51a0: 0x407aa420, 0x51a1: 0x407aa620, 0x51a2: 0x407aa820, 0x51a3: 0x407aaa20, - 0x51a4: 0x407aac20, 0x51a5: 0x407aae20, 0x51a6: 0x407ab020, 0x51a7: 0x407ab220, - 0x51a8: 0x407ab420, 0x51a9: 0x407ab620, 0x51aa: 0x407ab820, 0x51ab: 0x407aba20, - 0x51ac: 0x407abc20, 0x51ad: 0x407abe20, 0x51ae: 0x407ac020, 0x51af: 0x407ac220, - 0x51b0: 0x407ac420, 0x51b1: 0x407ac620, 0x51b2: 0x407ac820, 0x51b3: 0x407aca20, - 0x51b4: 0x407acc20, 0x51b5: 0x407ace20, 0x51b6: 0x407ad020, 0x51b7: 0x407ad220, - 0x51b8: 0x407ad420, 0x51b9: 0x407ad620, 0x51ba: 0x407ad820, 0x51bb: 0x407ada20, - 0x51bc: 0x407adc20, 0x51bd: 0x407ade20, 0x51be: 0x407ae020, 0x51bf: 0x407ae220, - // Block 0x147, offset 0x51c0 - 0x51c0: 0x407ae420, 0x51c1: 0x407ae620, 0x51c2: 0x407ae820, 0x51c3: 0x407aea20, - 0x51c4: 0x407aec20, 0x51c5: 0x407aee20, 0x51c6: 0x407af020, 0x51c7: 0x407af220, - 0x51c8: 0x407af420, 0x51c9: 0x407af620, 0x51ca: 0x407af820, 0x51cb: 0x407afa20, - 0x51cc: 0x407afc20, 0x51cd: 0x407afe20, 0x51ce: 0x407b0020, 0x51cf: 0x407b0220, - 0x51d0: 0x407b0420, 0x51d1: 0x407b0620, 0x51d2: 0x407b0820, 0x51d3: 0x407b0a20, - 0x51d4: 0x407b0c20, 0x51d5: 0x407b0e20, 0x51d6: 0x407b1020, 0x51d7: 0x407b1220, - 0x51d8: 0x407b1420, 0x51d9: 0x407b1620, 0x51da: 0x407b1820, 0x51db: 0x407b1a20, - 0x51dc: 0x407b1c20, 0x51dd: 0x407b1e20, 0x51de: 0x407b2020, 0x51df: 0x407b2220, - 0x51e0: 0x407b2420, 0x51e1: 0x407b2620, 0x51e2: 0x407b2820, 0x51e3: 0x407b2a20, - 0x51e4: 0x407b2c20, 0x51e5: 0x407b2e20, 0x51e6: 0x407b3020, 0x51e7: 0x407b3220, - 0x51e8: 0x407b3420, 0x51e9: 0x407b3620, 0x51ea: 0x407b3820, 0x51eb: 0x407b3a20, - 0x51ec: 0x407b3c20, 0x51ed: 0x407b3e20, 0x51ee: 0x407b4020, 0x51ef: 0x407b4220, - 0x51f0: 0x407b4420, 0x51f1: 0x407b4620, 0x51f2: 0x407b4820, 0x51f3: 0x407b4a20, - 0x51f4: 0x407b4c20, 0x51f5: 0x407b4e20, 0x51f6: 0x407b5020, 0x51f7: 0x407b5220, - 0x51f8: 0x407b5420, 0x51f9: 0x407b5620, 0x51fa: 0x407b5820, 0x51fb: 0x407b5a20, - 0x51fc: 0x407b5c20, 0x51fd: 0x407b5e20, 0x51fe: 0x407b6020, 0x51ff: 0x407b6220, - // Block 0x148, offset 0x5200 - 0x5200: 0x407b6420, 0x5201: 0x407b6620, 0x5202: 0x407b6820, 0x5203: 0x407b6a20, - 0x5204: 0x407b6c20, 0x5205: 0x407b6e20, 0x5206: 0x407b7020, 0x5207: 0x407b7220, - 0x5208: 0x407b7420, 0x5209: 0x407b7620, 0x520a: 0x407b7820, 0x520b: 0x407b7a20, - 0x520c: 0x407b7c20, 0x520d: 0x407b7e20, 0x520e: 0x407b8020, 0x520f: 0x407b8220, - 0x5210: 0x407b8420, 0x5211: 0x407b8620, 0x5212: 0x407b8820, 0x5213: 0x407b8a20, - 0x5214: 0x407b8c20, 0x5215: 0x407b8e20, 0x5216: 0x407b9020, 0x5217: 0x407b9220, - 0x5218: 0x407b9420, 0x5219: 0x407b9620, 0x521a: 0x407b9820, 0x521b: 0x407b9a20, - 0x521c: 0x407b9c20, 0x521d: 0x407b9e20, 0x521e: 0x407ba020, 0x521f: 0x407ba220, - 0x5220: 0x407ba420, 0x5221: 0x407ba620, 0x5222: 0x407ba820, 0x5223: 0x407baa20, - 0x5224: 0x407bac20, 0x5225: 0x407bae20, 0x5226: 0x407bb020, 0x5227: 0x407bb220, - 0x5228: 0x407bb420, 0x5229: 0x407bb620, 0x522a: 0x407bb820, 0x522b: 0x407bba20, - 0x522c: 0x407bbc20, 0x522d: 0x407bbe20, 0x522e: 0x407bc020, 0x522f: 0x407bc220, - 0x5230: 0x407bc420, 0x5231: 0x407bc620, 0x5232: 0x407bc820, 0x5233: 0x407bca20, - 0x5234: 0x407bcc20, 0x5235: 0x407bce20, 0x5236: 0x407bd020, 0x5237: 0x407bd220, - 0x5238: 0x407bd420, 0x5239: 0x407bd620, 0x523a: 0x407bd820, 0x523b: 0x407bda20, - 0x523c: 0x407bdc20, 0x523d: 0x407bde20, 0x523e: 0x407be020, 0x523f: 0x407be220, - // Block 0x149, offset 0x5240 - 0x5240: 0x407be420, 0x5241: 0x407be620, 0x5242: 0x407be820, 0x5243: 0x407bea20, - 0x5244: 0x407bec20, 0x5245: 0x407bee20, 0x5246: 0x407bf020, 0x5247: 0x407bf220, - 0x5248: 0x407bf420, 0x5249: 0x407bf620, 0x524a: 0x407bf820, 0x524b: 0x407bfa20, - 0x524c: 0x407bfc20, 0x524d: 0x407bfe20, 0x524e: 0x407c0020, 0x524f: 0x407c0220, - 0x5250: 0x407c0420, 0x5251: 0x407c0620, 0x5252: 0x407c0820, 0x5253: 0x407c0a20, - 0x5254: 0x407c0c20, 0x5255: 0x407c0e20, 0x5256: 0x407c1020, 0x5257: 0x407c1220, - 0x5258: 0x407c1420, 0x5259: 0x407c1620, 0x525a: 0x407c1820, 0x525b: 0x407c1a20, - 0x525c: 0x407c1c20, 0x525d: 0x407c1e20, 0x525e: 0x407c2020, 0x525f: 0x407c2220, - 0x5260: 0x407c2420, 0x5261: 0x407c2620, 0x5262: 0x407c2820, 0x5263: 0x407c2a20, - 0x5264: 0x407c2c20, 0x5265: 0x407c2e20, 0x5266: 0x407c3020, 0x5267: 0x407c3220, - 0x5268: 0x407c3420, 0x5269: 0x407c3620, 0x526a: 0x407c3820, 0x526b: 0x407c3a20, - 0x526c: 0x407c3c20, 0x526d: 0x407c3e20, 0x526e: 0x407c4020, 0x526f: 0x407c4220, - 0x5270: 0x407c4420, 0x5271: 0x407c4620, 0x5272: 0x407c4820, 0x5273: 0x407c4a20, - 0x5274: 0x407c4c20, 0x5275: 0x407c4e20, 0x5276: 0x407c5020, 0x5277: 0x407c5220, - 0x5278: 0x407c5420, 0x5279: 0x407c5620, 0x527a: 0x407c5820, 0x527b: 0x407c5a20, - 0x527c: 0x407c5c20, 0x527d: 0x407c5e20, 0x527e: 0x407c6020, 0x527f: 0x407c6220, - // Block 0x14a, offset 0x5280 - 0x5280: 0x407c6420, 0x5281: 0x407c6620, 0x5282: 0x407c6820, 0x5283: 0x407c6a20, - 0x5284: 0x407c6c20, 0x5285: 0x407c6e20, 0x5286: 0x407c7020, 0x5287: 0x407c7220, - 0x5288: 0x407c7420, 0x5289: 0x407c7620, 0x528a: 0x407c7820, 0x528b: 0x407c7a20, - 0x528c: 0x407c7c20, 0x528d: 0x407c7e20, 0x528e: 0x407c8020, 0x528f: 0x407c8220, - 0x5290: 0x407c8420, 0x5291: 0x407c8620, 0x5292: 0x407c8820, 0x5293: 0x407c8a20, - 0x5294: 0x407c8c20, 0x5295: 0x407c8e20, 0x5296: 0x407c9020, 0x5297: 0x407c9220, - 0x5298: 0x407c9420, 0x5299: 0x407c9620, 0x529a: 0x407c9820, 0x529b: 0x407c9a20, - 0x529c: 0x407c9c20, 0x529d: 0x407c9e20, 0x529e: 0x407ca020, 0x529f: 0x407ca220, - 0x52a0: 0x407ca420, 0x52a1: 0x407ca620, 0x52a2: 0x407ca820, 0x52a3: 0x407caa20, - 0x52a4: 0x407cac20, 0x52a5: 0x407cae20, 0x52a6: 0x407cb020, 0x52a7: 0x407cb220, - 0x52a8: 0x407cb420, 0x52a9: 0x407cb620, 0x52aa: 0x407cb820, 0x52ab: 0x407cba20, - 0x52ac: 0x407cbc20, 0x52ad: 0x407cbe20, 0x52ae: 0x407cc020, 0x52af: 0x407cc220, - 0x52b0: 0x407cc420, 0x52b1: 0x407cc620, 0x52b2: 0x407cc820, 0x52b3: 0x407cca20, - 0x52b4: 0x407ccc20, 0x52b5: 0x407cce20, 0x52b6: 0x407cd020, 0x52b7: 0x407cd220, - 0x52b8: 0x407cd420, 0x52b9: 0x407cd620, 0x52ba: 0x407cd820, 0x52bb: 0x407cda20, - 0x52bc: 0x407cdc20, 0x52bd: 0x407cde20, 0x52be: 0x407ce020, 0x52bf: 0x407ce220, - // Block 0x14b, offset 0x52c0 - 0x52c0: 0x407ce420, 0x52c1: 0x407ce620, 0x52c2: 0x407ce820, 0x52c3: 0x407cea20, - 0x52c4: 0x407cec20, 0x52c5: 0x407cee20, 0x52c6: 0x407cf020, 0x52c7: 0x407cf220, - 0x52c8: 0x407cf420, 0x52c9: 0x407cf620, 0x52ca: 0x407cf820, 0x52cb: 0x407cfa20, - 0x52cc: 0x407cfc20, 0x52cd: 0x407cfe20, 0x52ce: 0x407d0020, 0x52cf: 0x407d0220, - 0x52d0: 0x407d0420, 0x52d1: 0x407d0620, 0x52d2: 0x407d0820, 0x52d3: 0x407d0a20, - 0x52d4: 0x407d0c20, 0x52d5: 0x407d0e20, 0x52d6: 0x407d1020, 0x52d7: 0x407d1220, - 0x52d8: 0x407d1420, 0x52d9: 0x407d1620, 0x52da: 0x407d1820, 0x52db: 0x407d1a20, - 0x52dc: 0x407d1c20, 0x52dd: 0x407d1e20, 0x52de: 0x407d2020, 0x52df: 0x407d2220, - 0x52e0: 0x407d2420, 0x52e1: 0x407d2620, 0x52e2: 0x407d2820, 0x52e3: 0x407d2a20, - 0x52e4: 0x407d2c20, 0x52e5: 0x407d2e20, 0x52e6: 0x407d3020, 0x52e7: 0x407d3220, - 0x52e8: 0x407d3420, 0x52e9: 0x407d3620, 0x52ea: 0x407d3820, 0x52eb: 0x407d3a20, - 0x52ec: 0x407d3c20, 0x52ed: 0x407d3e20, 0x52ee: 0x407d4020, 0x52ef: 0x407d4220, - 0x52f0: 0x407d4420, 0x52f1: 0x407d4620, 0x52f2: 0x407d4820, 0x52f3: 0x407d4a20, - 0x52f4: 0x407d4c20, 0x52f5: 0x407d4e20, 0x52f6: 0x407d5020, 0x52f7: 0x407d5220, - 0x52f8: 0x407d5420, 0x52f9: 0x407d5620, 0x52fa: 0x407d5820, 0x52fb: 0x407d5a20, - 0x52fc: 0x407d5c20, 0x52fd: 0x407d5e20, 0x52fe: 0x407d6020, 0x52ff: 0x407d6220, - // Block 0x14c, offset 0x5300 - 0x5300: 0x407d6420, 0x5301: 0x407d6620, 0x5302: 0x407d6820, 0x5303: 0x407d6a20, - 0x5304: 0x407d6c20, 0x5305: 0x407d6e20, 0x5306: 0x407d7020, 0x5307: 0x407d7220, - 0x5308: 0x407d7420, 0x5309: 0x407d7620, 0x530a: 0x407d7820, 0x530b: 0x407d7a20, - 0x530c: 0x407d7c20, 0x530d: 0x407d7e20, 0x530e: 0x407d8020, 0x530f: 0x407d8220, - 0x5310: 0x407d8420, 0x5311: 0x407d8620, 0x5312: 0x407d8820, 0x5313: 0x407d8a20, - 0x5314: 0x407d8c20, 0x5315: 0x407d8e20, 0x5316: 0x407d9020, 0x5317: 0x407d9220, - 0x5318: 0x407d9420, 0x5319: 0x407d9620, 0x531a: 0x407d9820, 0x531b: 0x407d9a20, - 0x531c: 0x407d9c20, 0x531d: 0x407d9e20, 0x531e: 0x407da020, 0x531f: 0x407da220, - 0x5320: 0x407da420, 0x5321: 0x407da620, 0x5322: 0x407da820, 0x5323: 0x407daa20, - 0x5324: 0x407dac20, 0x5325: 0x407dae20, 0x5326: 0x407db020, 0x5327: 0x407db220, - 0x5328: 0x407db420, 0x5329: 0x407db620, 0x532a: 0x407db820, 0x532b: 0x407dba20, - 0x532c: 0x407dbc20, 0x532d: 0x407dbe20, 0x532e: 0x407dc020, - // Block 0x14d, offset 0x5340 - 0x5340: 0xe0000394, 0x5341: 0xe000045f, 0x5342: 0xe0000534, 0x5343: 0xe0000610, - 0x5344: 0xe00006cc, 0x5345: 0xe0000771, 0x5346: 0xe000081d, 0x5347: 0xe00008c2, - 0x5348: 0xe0000462, 0x5349: 0xe0000537, 0x534a: 0xe0000613, 0x534b: 0xe00006cf, - 0x534c: 0xe0000774, 0x534d: 0xe0000820, 0x534e: 0xe00008c5, 0x534f: 0xe000053a, - 0x5350: 0xe0000616, 0x5351: 0xe00006d2, 0x5352: 0xe0000777, 0x5353: 0xe0000823, - 0x5354: 0xe00008c8, 0x5355: 0xe000027f, 0x5356: 0xe0000397, 0x5357: 0xe0000465, - 0x5358: 0xe000053d, 0x5359: 0xe0000619, 0x535a: 0xe00006d5, 0x535b: 0xe000077a, - 0x535c: 0xe0000826, 0x535d: 0xe00008cb, 0x535e: 0xe0000282, 0x535f: 0xe000039a, - 0x5360: 0xe0000468, 0x5361: 0xe0000540, 0x5362: 0xe000061c, 0x5363: 0xe000039d, - 0x5364: 0xe000046b, 0x5365: 0xe000046e, 0x5366: 0xe0000543, 0x5367: 0xe000061f, - 0x5368: 0xe00006d8, 0x5369: 0xe000077d, 0x536a: 0xe0000829, 0x536b: 0xe00008ce, - 0x536c: 0xe0000285, 0x536d: 0xe00003a0, 0x536e: 0xe0000471, 0x536f: 0xe0000474, - 0x5370: 0xe0000546, 0x5371: 0xe0000622, 0x5372: 0x4029a020, 0x5373: 0x4029a220, - 0x5374: 0xe0000288, 0x5375: 0xe00003a3, 0x5376: 0xe0000477, 0x5377: 0xe000047a, - 0x5378: 0xe0000549, 0x5379: 0xe0000625, 0x537a: 0xe000047d, 0x537b: 0xe0000480, - 0x537c: 0xe000054c, 0x537d: 0xe000054f, 0x537e: 0xe0000552, 0x537f: 0xe0000555, - // Block 0x14e, offset 0x5380 - 0x5380: 0xe00006db, 0x5381: 0xe0000780, 0x5382: 0xe0000783, 0x5383: 0xe0000786, - 0x5384: 0xe000082c, 0x5385: 0xe000082f, 0x5386: 0xe00008d1, 0x5387: 0xe00008d4, - 0x5388: 0xe00008d7, 0x5389: 0xe00008da, 0x538a: 0xe00003a6, 0x538b: 0xe0000483, - 0x538c: 0xe0000558, 0x538d: 0xe0000628, 0x538e: 0xe00006de, 0x538f: 0xe000028b, - 0x5390: 0xe00003a9, 0x5391: 0xe0000486, 0x5392: 0xe000055b, 0x5393: 0xe000055e, - 0x5394: 0xe000062b, 0x5395: 0xe000062e, 0x5396: 0x4029a420, 0x5397: 0x4029a620, - 0x5398: 0xe000028e, 0x5399: 0xe00003ac, 0x539a: 0x4029a820, 0x539b: 0x4029aa20, - 0x539c: 0x4029ac20, 0x539d: 0x4029ae20, 0x539e: 0x4029b020, 0x539f: 0x4029b220, - 0x53a0: 0x4029b420, 0x53a1: 0x4029b620, 0x53a2: 0x4029b820, - 0x53b0: 0x4003ca20, 0x53b1: 0x4003cc20, 0x53b2: 0x4003ce20, 0x53b3: 0x4003d020, - // Block 0x14f, offset 0x53c0 - 0x53c0: 0x407dc220, 0x53c1: 0x407dc420, 0x53c2: 0x407dc620, 0x53c3: 0x407dc820, - 0x53c4: 0x407dca20, 0x53c5: 0x407dcc20, 0x53c6: 0x407dce20, 0x53c7: 0x407dd020, - 0x53c8: 0x407dd220, 0x53c9: 0x407dd420, 0x53ca: 0x407dd620, 0x53cb: 0x407dd820, - 0x53cc: 0x407dda20, 0x53cd: 0x407ddc20, 0x53ce: 0x407dde20, 0x53cf: 0x407de020, - 0x53d0: 0x407de220, 0x53d1: 0x407de420, 0x53d2: 0x407de620, 0x53d3: 0x407de820, - 0x53d4: 0x407dea20, 0x53d5: 0x407dec20, 0x53d6: 0x407dee20, 0x53d7: 0x407df020, - 0x53d8: 0x407df220, 0x53d9: 0x407df420, 0x53da: 0x407df620, 0x53db: 0x407df820, - 0x53dc: 0x407dfa20, 0x53dd: 0x407dfc20, 0x53de: 0x407dfe20, 0x53df: 0x407e0020, - 0x53e0: 0x407e0220, 0x53e1: 0x407e0420, 0x53e2: 0x407e0620, 0x53e3: 0x407e0820, - 0x53e4: 0x407e0a20, 0x53e5: 0x407e0c20, 0x53e6: 0x407e0e20, 0x53e7: 0x407e1020, - 0x53e8: 0x407e1220, 0x53e9: 0x407e1420, 0x53ea: 0x407e1620, 0x53eb: 0x407e1820, - 0x53ec: 0x407e1a20, 0x53ed: 0x407e1c20, 0x53ee: 0x407e1e20, 0x53ef: 0x407e2020, - 0x53f0: 0x407e2220, 0x53f1: 0x407e2420, 0x53f2: 0x407e2620, 0x53f3: 0x407e2820, - 0x53f4: 0x407e2a20, 0x53f5: 0x407e2c20, 0x53f6: 0x407e2e20, 0x53f7: 0x407e3020, - 0x53f8: 0x407e3220, 0x53f9: 0x407e3420, 0x53fa: 0x407e3620, 0x53fb: 0x407e3820, - 0x53fc: 0x407e3a20, 0x53fd: 0x407e3c20, 0x53fe: 0x407e3e20, 0x53ff: 0x407e4020, - // Block 0x150, offset 0x5400 - 0x5400: 0x407e4220, 0x5401: 0x407e4420, 0x5402: 0x407e4620, 0x5403: 0x407e4820, - 0x5404: 0x407e4a20, 0x5405: 0x407e4c20, 0x5406: 0x407e4e20, 0x5407: 0x407e5020, - 0x5408: 0x407e5220, 0x5409: 0x407e5420, 0x540a: 0x407e5620, 0x540b: 0x407e5820, - 0x540c: 0x407e5a20, 0x540d: 0x407e5c20, 0x540e: 0x407e5e20, 0x540f: 0x407e6020, - 0x5410: 0x407e6220, 0x5411: 0x407e6420, 0x5412: 0x407e6620, 0x5413: 0x407e6820, - 0x5414: 0x407e6a20, 0x5415: 0x407e6c20, 0x5416: 0x407e6e20, 0x5417: 0x407e7020, - 0x5418: 0x407e7220, 0x5419: 0x407e7420, 0x541a: 0x407e7620, 0x541b: 0x407e7820, - 0x541c: 0x407e7a20, 0x541d: 0x407e7c20, 0x541e: 0x407e7e20, 0x541f: 0x407e8020, - 0x5420: 0x407e8220, 0x5421: 0x407e8420, 0x5422: 0x407e8620, 0x5423: 0x407e8820, - 0x5424: 0x407e8a20, 0x5425: 0x407e8c20, 0x5426: 0x407e8e20, 0x5427: 0x407e9020, - 0x5428: 0x407e9220, 0x5429: 0x407e9420, 0x542a: 0x407e9620, 0x542b: 0x407e9820, - 0x542c: 0x407e9a20, 0x542d: 0x407e9c20, 0x542e: 0x407e9e20, 0x542f: 0x407ea020, - 0x5430: 0x407ea220, 0x5431: 0x407ea420, 0x5432: 0x407ea620, 0x5433: 0x407ea820, - 0x5434: 0x407eaa20, 0x5435: 0x407eac20, 0x5436: 0x407eae20, 0x5437: 0x407eb020, - 0x5438: 0x407eb220, 0x5439: 0x407eb420, 0x543a: 0x407eb620, 0x543b: 0x407eb820, - 0x543c: 0x407eba20, 0x543d: 0x407ebc20, 0x543e: 0x407ebe20, 0x543f: 0x407ec020, - // Block 0x151, offset 0x5440 - 0x5440: 0x407ec220, 0x5441: 0x407ec420, 0x5442: 0x407ec620, 0x5443: 0x407ec820, - 0x5444: 0x407eca20, 0x5445: 0x407ecc20, 0x5446: 0x407ece20, 0x5447: 0x407ed020, - 0x5448: 0x407ed220, 0x5449: 0x407ed420, 0x544a: 0x407ed620, 0x544b: 0x407ed820, - 0x544c: 0x407eda20, 0x544d: 0x407edc20, 0x544e: 0x407ede20, 0x544f: 0x407ee020, - 0x5450: 0x407ee220, 0x5451: 0x407ee420, 0x5452: 0x407ee620, 0x5453: 0x407ee820, - 0x5454: 0x407eea20, 0x5455: 0x407eec20, 0x5456: 0x407eee20, 0x5457: 0x407ef020, - 0x5458: 0x407ef220, 0x5459: 0x407ef420, 0x545a: 0x407ef620, 0x545b: 0x407ef820, - 0x545c: 0x407efa20, 0x545d: 0x407efc20, 0x545e: 0x407efe20, 0x545f: 0x407f0020, - 0x5460: 0x407f0220, 0x5461: 0x407f0420, 0x5462: 0x407f0620, 0x5463: 0x407f0820, - 0x5464: 0x407f0a20, 0x5465: 0x407f0c20, 0x5466: 0x407f0e20, 0x5467: 0x407f1020, - 0x5468: 0x407f1220, 0x5469: 0x407f1420, 0x546a: 0x407f1620, 0x546b: 0x407f1820, - 0x546c: 0x407f1a20, 0x546d: 0x407f1c20, 0x546e: 0x407f1e20, 0x546f: 0x407f2020, - 0x5470: 0x407f2220, 0x5471: 0x407f2420, 0x5472: 0x407f2620, 0x5473: 0x407f2820, - 0x5474: 0x407f2a20, 0x5475: 0x407f2c20, 0x5476: 0x407f2e20, 0x5477: 0x407f3020, - 0x5478: 0x407f3220, 0x5479: 0x407f3420, 0x547a: 0x407f3620, 0x547b: 0x407f3820, - 0x547c: 0x407f3a20, 0x547d: 0x407f3c20, 0x547e: 0x407f3e20, 0x547f: 0x407f4020, - // Block 0x152, offset 0x5480 - 0x5480: 0x407f4220, 0x5481: 0x407f4420, 0x5482: 0x407f4620, 0x5483: 0x407f4820, - 0x5484: 0x407f4a20, 0x5485: 0x407f4c20, 0x5486: 0x407f4e20, 0x5487: 0x407f5020, - 0x5488: 0x407f5220, 0x5489: 0x407f5420, 0x548a: 0x407f5620, 0x548b: 0x407f5820, - 0x548c: 0x407f5a20, 0x548d: 0x407f5c20, 0x548e: 0x407f5e20, 0x548f: 0x407f6020, - 0x5490: 0x407f6220, 0x5491: 0x407f6420, 0x5492: 0x407f6620, 0x5493: 0x407f6820, - 0x5494: 0x407f6a20, 0x5495: 0x407f6c20, 0x5496: 0x407f6e20, 0x5497: 0x407f7020, - 0x5498: 0x407f7220, 0x5499: 0x407f7420, 0x549a: 0x407f7620, 0x549b: 0x407f7820, - 0x549c: 0x407f7a20, 0x549d: 0x407f7c20, 0x549e: 0x407f7e20, 0x549f: 0x407f8020, - 0x54a0: 0x407f8220, 0x54a1: 0x407f8420, 0x54a2: 0x407f8620, 0x54a3: 0x407f8820, - 0x54a4: 0x407f8a20, 0x54a5: 0x407f8c20, 0x54a6: 0x407f8e20, 0x54a7: 0x407f9020, - 0x54a8: 0x407f9220, 0x54a9: 0x407f9420, 0x54aa: 0x407f9620, 0x54ab: 0x407f9820, - 0x54ac: 0x407f9a20, 0x54ad: 0x407f9c20, 0x54ae: 0x407f9e20, 0x54af: 0x407fa020, - 0x54b0: 0x407fa220, 0x54b1: 0x407fa420, 0x54b2: 0x407fa620, 0x54b3: 0x407fa820, - 0x54b4: 0x407faa20, 0x54b5: 0x407fac20, 0x54b6: 0x407fae20, 0x54b7: 0x407fb020, - 0x54b8: 0x407fb220, 0x54b9: 0x407fb420, 0x54ba: 0x407fb620, 0x54bb: 0x407fb820, - 0x54bc: 0x407fba20, 0x54bd: 0x407fbc20, 0x54be: 0x407fbe20, 0x54bf: 0x407fc020, - // Block 0x153, offset 0x54c0 - 0x54c0: 0x407fc220, 0x54c1: 0x407fc420, 0x54c2: 0x407fc620, 0x54c3: 0x407fc820, - 0x54c4: 0x407fca20, 0x54c5: 0x407fcc20, 0x54c6: 0x407fce20, 0x54c7: 0x407fd020, - 0x54c8: 0x407fd220, 0x54c9: 0x407fd420, 0x54ca: 0x407fd620, 0x54cb: 0x407fd820, - 0x54cc: 0x407fda20, 0x54cd: 0x407fdc20, 0x54ce: 0x407fde20, 0x54cf: 0x407fe020, - 0x54d0: 0x407fe220, 0x54d1: 0x407fe420, 0x54d2: 0x407fe620, 0x54d3: 0x407fe820, - 0x54d4: 0x407fea20, 0x54d5: 0x407fec20, 0x54d6: 0x407fee20, 0x54d7: 0x407ff020, - 0x54d8: 0x407ff220, 0x54d9: 0x407ff420, 0x54da: 0x407ff620, 0x54db: 0x407ff820, - 0x54dc: 0x407ffa20, 0x54dd: 0x407ffc20, 0x54de: 0x407ffe20, 0x54df: 0x40800020, - 0x54e0: 0x40800220, 0x54e1: 0x40800420, 0x54e2: 0x40800620, 0x54e3: 0x40800820, - 0x54e4: 0x40800a20, 0x54e5: 0x40800c20, 0x54e6: 0x40800e20, 0x54e7: 0x40801020, - 0x54e8: 0x40801220, 0x54e9: 0x40801420, 0x54ea: 0x40801620, 0x54eb: 0x40801820, - 0x54ec: 0x40801a20, 0x54ed: 0x40801c20, 0x54ee: 0x40801e20, 0x54ef: 0x40802020, - 0x54f0: 0x40802220, 0x54f1: 0x40802420, 0x54f2: 0x40802620, 0x54f3: 0x40802820, - 0x54f4: 0x40802a20, 0x54f5: 0x40802c20, 0x54f6: 0x40802e20, 0x54f7: 0x40803020, - 0x54f8: 0x40803220, 0x54f9: 0x40803420, 0x54fa: 0x40803620, 0x54fb: 0x40803820, - 0x54fc: 0x40803a20, 0x54fd: 0x40803c20, 0x54fe: 0x40803e20, 0x54ff: 0x40804020, - // Block 0x154, offset 0x5500 - 0x5500: 0x40804220, 0x5501: 0x40804420, 0x5502: 0x40804620, 0x5503: 0x40804820, - 0x5504: 0x40804a20, 0x5505: 0x40804c20, 0x5506: 0x40804e20, 0x5507: 0x40805020, - 0x5508: 0x40805220, 0x5509: 0x40805420, 0x550a: 0x40805620, 0x550b: 0x40805820, - 0x550c: 0x40805a20, 0x550d: 0x40805c20, 0x550e: 0x40805e20, 0x550f: 0x40806020, - 0x5510: 0x40806220, 0x5511: 0x40806420, 0x5512: 0x40806620, 0x5513: 0x40806820, - 0x5514: 0x40806a20, 0x5515: 0x40806c20, 0x5516: 0x40806e20, 0x5517: 0x40807020, - 0x5518: 0x40807220, 0x5519: 0x40807420, 0x551a: 0x40807620, 0x551b: 0x40807820, - 0x551c: 0x40807a20, 0x551d: 0x40807c20, 0x551e: 0x40807e20, 0x551f: 0x40808020, - 0x5520: 0x40808220, 0x5521: 0x40808420, 0x5522: 0x40808620, 0x5523: 0x40808820, - 0x5524: 0x40808a20, 0x5525: 0x40808c20, 0x5526: 0x40808e20, 0x5527: 0x40809020, - 0x5528: 0x40809220, 0x5529: 0x40809420, 0x552a: 0x40809620, 0x552b: 0x40809820, - 0x552c: 0x40809a20, 0x552d: 0x40809c20, 0x552e: 0x40809e20, 0x552f: 0x4080a020, - 0x5530: 0x4080a220, 0x5531: 0x4080a420, 0x5532: 0x4080a620, 0x5533: 0x4080a820, - 0x5534: 0x4080aa20, 0x5535: 0x4080ac20, 0x5536: 0x4080ae20, 0x5537: 0x4080b020, - 0x5538: 0x4080b220, 0x5539: 0x4080b420, 0x553a: 0x4080b620, 0x553b: 0x4080b820, - 0x553c: 0x4080ba20, 0x553d: 0x4080bc20, 0x553e: 0x4080be20, 0x553f: 0x4080c020, - // Block 0x155, offset 0x5540 - 0x5540: 0x4080c220, 0x5541: 0x4080c420, 0x5542: 0x4080c620, 0x5543: 0x4080c820, - 0x5544: 0x4080ca20, 0x5545: 0x4080cc20, 0x5546: 0x4080ce20, 0x5547: 0x4080d020, - 0x5548: 0x4080d220, 0x5549: 0x4080d420, 0x554a: 0x4080d620, 0x554b: 0x4080d820, - 0x554c: 0x4080da20, 0x554d: 0x4080dc20, 0x554e: 0x4080de20, 0x554f: 0x4080e020, - 0x5550: 0x4080e220, 0x5551: 0x4080e420, 0x5552: 0x4080e620, 0x5553: 0x4080e820, - 0x5554: 0x4080ea20, 0x5555: 0x4080ec20, 0x5556: 0x4080ee20, 0x5557: 0x4080f020, - 0x5558: 0x4080f220, 0x5559: 0x4080f420, 0x555a: 0x4080f620, 0x555b: 0x4080f820, - 0x555c: 0x4080fa20, 0x555d: 0x4080fc20, 0x555e: 0x4080fe20, 0x555f: 0x40810020, - 0x5560: 0x40810220, 0x5561: 0x40810420, 0x5562: 0x40810620, 0x5563: 0x40810820, - 0x5564: 0x40810a20, 0x5565: 0x40810c20, 0x5566: 0x40810e20, 0x5567: 0x40811020, - 0x5568: 0x40811220, 0x5569: 0x40811420, 0x556a: 0x40811620, 0x556b: 0x40811820, - 0x556c: 0x40811a20, 0x556d: 0x40811c20, 0x556e: 0x40811e20, 0x556f: 0x40812020, - 0x5570: 0x40812220, 0x5571: 0x40812420, 0x5572: 0x40812620, 0x5573: 0x40812820, - 0x5574: 0x40812a20, 0x5575: 0x40812c20, 0x5576: 0x40812e20, 0x5577: 0x40813020, - 0x5578: 0x40813220, 0x5579: 0x40813420, 0x557a: 0x40813620, 0x557b: 0x40813820, - 0x557c: 0x40813a20, 0x557d: 0x40813c20, 0x557e: 0x40813e20, 0x557f: 0x40814020, - // Block 0x156, offset 0x5580 - 0x5580: 0x40814220, 0x5581: 0x40814420, 0x5582: 0x40814620, 0x5583: 0x40814820, - 0x5584: 0x40814a20, 0x5585: 0x40814c20, 0x5586: 0x40814e20, 0x5587: 0x40815020, - 0x5588: 0x40815220, 0x5589: 0x40815420, 0x558a: 0x40815620, 0x558b: 0x40815820, - 0x558c: 0x40815a20, 0x558d: 0x40815c20, 0x558e: 0x40815e20, 0x558f: 0x40816020, - 0x5590: 0x40816220, 0x5591: 0x40816420, 0x5592: 0x40816620, 0x5593: 0x40816820, - 0x5594: 0x40816a20, 0x5595: 0x40816c20, 0x5596: 0x40816e20, 0x5597: 0x40817020, - 0x5598: 0x40817220, 0x5599: 0x40817420, 0x559a: 0x40817620, 0x559b: 0x40817820, - 0x559c: 0x40817a20, 0x559d: 0x40817c20, 0x559e: 0x40817e20, 0x559f: 0x40818020, - 0x55a0: 0x40818220, 0x55a1: 0x40818420, 0x55a2: 0x40818620, 0x55a3: 0x40818820, - 0x55a4: 0x40818a20, 0x55a5: 0x40818c20, 0x55a6: 0x40818e20, 0x55a7: 0x40819020, - 0x55a8: 0x40819220, 0x55a9: 0x40819420, 0x55aa: 0x40819620, 0x55ab: 0x40819820, - 0x55ac: 0x40819a20, 0x55ad: 0x40819c20, 0x55ae: 0x40819e20, 0x55af: 0x4081a020, - 0x55b0: 0x4081a220, 0x55b1: 0x4081a420, 0x55b2: 0x4081a620, 0x55b3: 0x4081a820, - 0x55b4: 0x4081aa20, 0x55b5: 0x4081ac20, 0x55b6: 0x4081ae20, 0x55b7: 0x4081b020, - 0x55b8: 0x4081b220, 0x55b9: 0x4081b420, 0x55ba: 0x4081b620, 0x55bb: 0x4081b820, - 0x55bc: 0x4081ba20, 0x55bd: 0x4081bc20, 0x55be: 0x4081be20, 0x55bf: 0x4081c020, - // Block 0x157, offset 0x55c0 - 0x55c0: 0x4081c220, 0x55c1: 0x4081c420, 0x55c2: 0x4081c620, 0x55c3: 0x4081c820, - 0x55c4: 0x4081ca20, 0x55c5: 0x4081cc20, 0x55c6: 0x4081ce20, 0x55c7: 0x4081d020, - 0x55c8: 0x4081d220, 0x55c9: 0x4081d420, 0x55ca: 0x4081d620, 0x55cb: 0x4081d820, - 0x55cc: 0x4081da20, 0x55cd: 0x4081dc20, 0x55ce: 0x4081de20, 0x55cf: 0x4081e020, - 0x55d0: 0x4081e220, 0x55d1: 0x4081e420, 0x55d2: 0x4081e620, 0x55d3: 0x4081e820, - 0x55d4: 0x4081ea20, 0x55d5: 0x4081ec20, 0x55d6: 0x4081ee20, 0x55d7: 0x4081f020, - 0x55d8: 0x4081f220, 0x55d9: 0x4081f420, 0x55da: 0x4081f620, 0x55db: 0x4081f820, - 0x55dc: 0x4081fa20, 0x55dd: 0x4081fc20, 0x55de: 0x4081fe20, 0x55df: 0x40820020, - 0x55e0: 0x40820220, 0x55e1: 0x40820420, 0x55e2: 0x40820620, 0x55e3: 0x40820820, - 0x55e4: 0x40820a20, 0x55e5: 0x40820c20, 0x55e6: 0x40820e20, 0x55e7: 0x40821020, - 0x55e8: 0x40821220, 0x55e9: 0x40821420, 0x55ea: 0x40821620, 0x55eb: 0x40821820, - 0x55ec: 0x40821a20, 0x55ed: 0x40821c20, 0x55ee: 0x40821e20, 0x55ef: 0x40822020, - 0x55f0: 0x40822220, 0x55f1: 0x40822420, 0x55f2: 0x40822620, 0x55f3: 0x40822820, - 0x55f4: 0x40822a20, 0x55f5: 0x40822c20, 0x55f6: 0x40822e20, 0x55f7: 0x40823020, - 0x55f8: 0x40823220, 0x55f9: 0x40823420, 0x55fa: 0x40823620, 0x55fb: 0x40823820, - 0x55fc: 0x40823a20, 0x55fd: 0x40823c20, 0x55fe: 0x40823e20, 0x55ff: 0x40824020, - // Block 0x158, offset 0x5600 - 0x5600: 0x40824220, 0x5601: 0x40824420, 0x5602: 0x40824620, 0x5603: 0x40824820, - 0x5604: 0x40824a20, 0x5605: 0x40824c20, 0x5606: 0x40824e20, 0x5607: 0x40825020, - 0x5608: 0x40825220, 0x5609: 0x40825420, 0x560a: 0x40825620, 0x560b: 0x40825820, - 0x560c: 0x40825a20, 0x560d: 0x40825c20, 0x560e: 0x40825e20, 0x560f: 0x40826020, - 0x5610: 0x40826220, 0x5611: 0x40826420, 0x5612: 0x40826620, 0x5613: 0x40826820, - 0x5614: 0x40826a20, 0x5615: 0x40826c20, 0x5616: 0x40826e20, 0x5617: 0x40827020, - 0x5618: 0x40827220, 0x5619: 0x40827420, 0x561a: 0x40827620, 0x561b: 0x40827820, - 0x561c: 0x40827a20, 0x561d: 0x40827c20, 0x561e: 0x40827e20, 0x561f: 0x40828020, - 0x5620: 0x40828220, 0x5621: 0x40828420, 0x5622: 0x40828620, 0x5623: 0x40828820, - 0x5624: 0x40828a20, 0x5625: 0x40828c20, 0x5626: 0x40828e20, 0x5627: 0x40829020, - 0x5628: 0x40829220, 0x5629: 0x40829420, 0x562a: 0x40829620, 0x562b: 0x40829820, - 0x562c: 0x40829a20, 0x562d: 0x40829c20, 0x562e: 0x40829e20, 0x562f: 0x4082a020, - 0x5630: 0x4082a220, 0x5631: 0x4082a420, 0x5632: 0x4082a620, 0x5633: 0x4082a820, - 0x5634: 0x4082aa20, 0x5635: 0x4082ac20, 0x5636: 0x4082ae20, 0x5637: 0x4082b020, - 0x5638: 0x4082b220, 0x5639: 0x4082b420, 0x563a: 0x4082b620, 0x563b: 0x4082b820, - 0x563c: 0x4082ba20, 0x563d: 0x4082bc20, 0x563e: 0x4082be20, 0x563f: 0x4082c020, - // Block 0x159, offset 0x5640 - 0x5640: 0x4082c220, 0x5641: 0x4082c420, 0x5642: 0x4082c620, 0x5643: 0x4082c820, - 0x5644: 0x4082ca20, 0x5645: 0x4082cc20, 0x5646: 0x4082ce20, 0x5647: 0x4082d020, - 0x5648: 0x4082d220, 0x5649: 0x4082d420, 0x564a: 0x4082d620, 0x564b: 0x4082d820, - 0x564c: 0x4082da20, 0x564d: 0x4082dc20, 0x564e: 0x4082de20, 0x564f: 0x4082e020, - 0x5650: 0x4082e220, 0x5651: 0x4082e420, 0x5652: 0x4082e620, 0x5653: 0x4082e820, - 0x5654: 0x4082ea20, 0x5655: 0x4082ec20, 0x5656: 0x4082ee20, 0x5657: 0x4082f020, - 0x5658: 0x4082f220, 0x5659: 0x4082f420, 0x565a: 0x4082f620, 0x565b: 0x4082f820, - 0x565c: 0x4082fa20, 0x565d: 0x4082fc20, 0x565e: 0x4082fe20, 0x565f: 0x40830020, - 0x5660: 0x40830220, 0x5661: 0x40830420, 0x5662: 0x40830620, 0x5663: 0x40830820, - 0x5664: 0x40830a20, 0x5665: 0x40830c20, 0x5666: 0x40830e20, 0x5667: 0x40831020, - 0x5668: 0x40831220, 0x5669: 0x40831420, 0x566a: 0x40831620, 0x566b: 0x40831820, - 0x566c: 0x40831a20, 0x566d: 0x40831c20, 0x566e: 0x40831e20, 0x566f: 0x40832020, - 0x5670: 0x40832220, 0x5671: 0x40832420, 0x5672: 0x40832620, 0x5673: 0x40832820, - 0x5674: 0x40832a20, 0x5675: 0x40832c20, 0x5676: 0x40832e20, 0x5677: 0x40833020, - 0x5678: 0x40833220, 0x5679: 0x40833420, 0x567a: 0x40833620, 0x567b: 0x40833820, - 0x567c: 0x40833a20, 0x567d: 0x40833c20, 0x567e: 0x40833e20, 0x567f: 0x40834020, - // Block 0x15a, offset 0x5680 - 0x5680: 0x40834220, 0x5681: 0x40834420, 0x5682: 0x40834620, 0x5683: 0x40834820, - 0x5684: 0x40834a20, 0x5685: 0x40834c20, 0x5686: 0x40834e20, 0x5687: 0x40835020, - 0x5688: 0x40835220, 0x5689: 0x40835420, 0x568a: 0x40835620, 0x568b: 0x40835820, - 0x568c: 0x40835a20, 0x568d: 0x40835c20, 0x568e: 0x40835e20, 0x568f: 0x40836020, - 0x5690: 0x40836220, 0x5691: 0x40836420, 0x5692: 0x40836620, 0x5693: 0x40836820, - 0x5694: 0x40836a20, 0x5695: 0x40836c20, 0x5696: 0x40836e20, 0x5697: 0x40837020, - 0x5698: 0x40837220, 0x5699: 0x40837420, 0x569a: 0x40837620, 0x569b: 0x40837820, - 0x569c: 0x40837a20, 0x569d: 0x40837c20, 0x569e: 0x40837e20, 0x569f: 0x40838020, - 0x56a0: 0x40838220, 0x56a1: 0x40838420, 0x56a2: 0x40838620, 0x56a3: 0x40838820, - 0x56a4: 0x40838a20, 0x56a5: 0x40838c20, 0x56a6: 0x40838e20, 0x56a7: 0x40839020, - 0x56a8: 0x40839220, 0x56a9: 0x40839420, 0x56aa: 0x40839620, 0x56ab: 0x40839820, - 0x56ac: 0x40839a20, 0x56ad: 0x40839c20, 0x56ae: 0x40839e20, 0x56af: 0x4083a020, - 0x56b0: 0x4083a220, 0x56b1: 0x4083a420, 0x56b2: 0x4083a620, 0x56b3: 0x4083a820, - 0x56b4: 0x4083aa20, 0x56b5: 0x4083ac20, 0x56b6: 0x4083ae20, 0x56b7: 0x4083b020, - 0x56b8: 0x4083b220, 0x56b9: 0x4083b420, 0x56ba: 0x4083b620, 0x56bb: 0x4083b820, - 0x56bc: 0x4083ba20, 0x56bd: 0x4083bc20, 0x56be: 0x4083be20, 0x56bf: 0x4083c020, - // Block 0x15b, offset 0x56c0 - 0x56c0: 0x4083c220, 0x56c1: 0x4083c420, 0x56c2: 0x4083c620, 0x56c3: 0x4083c820, - 0x56c4: 0x4083ca20, 0x56c5: 0x4083cc20, 0x56c6: 0x4083ce20, 0x56c7: 0x4083d020, - 0x56c8: 0x4083d220, 0x56c9: 0x4083d420, 0x56ca: 0x4083d620, 0x56cb: 0x4083d820, - 0x56cc: 0x4083da20, 0x56cd: 0x4083dc20, 0x56ce: 0x4083de20, 0x56cf: 0x4083e020, - 0x56d0: 0x4083e220, 0x56d1: 0x4083e420, 0x56d2: 0x4083e620, 0x56d3: 0x4083e820, - 0x56d4: 0x4083ea20, 0x56d5: 0x4083ec20, 0x56d6: 0x4083ee20, 0x56d7: 0x4083f020, - 0x56d8: 0x4083f220, 0x56d9: 0x4083f420, 0x56da: 0x4083f620, 0x56db: 0x4083f820, - 0x56dc: 0x4083fa20, 0x56dd: 0x4083fc20, 0x56de: 0x4083fe20, 0x56df: 0x40840020, - 0x56e0: 0x40840220, 0x56e1: 0x40840420, 0x56e2: 0x40840620, 0x56e3: 0x40840820, - 0x56e4: 0x40840a20, 0x56e5: 0x40840c20, 0x56e6: 0x40840e20, 0x56e7: 0x40841020, - 0x56e8: 0x40841220, 0x56e9: 0x40841420, 0x56ea: 0x40841620, 0x56eb: 0x40841820, - 0x56ec: 0x40841a20, 0x56ed: 0x40841c20, 0x56ee: 0x40841e20, 0x56ef: 0x40842020, - 0x56f0: 0x40842220, 0x56f1: 0x40842420, 0x56f2: 0x40842620, 0x56f3: 0x40842820, - 0x56f4: 0x40842a20, 0x56f5: 0x40842c20, 0x56f6: 0x40842e20, 0x56f7: 0x40843020, - 0x56f8: 0x40843220, 0x56f9: 0x40843420, 0x56fa: 0x40843620, 0x56fb: 0x40843820, - 0x56fc: 0x40843a20, 0x56fd: 0x40843c20, 0x56fe: 0x40843e20, 0x56ff: 0x40844020, - // Block 0x15c, offset 0x5700 - 0x5700: 0x40844220, 0x5701: 0x40844420, 0x5702: 0x40844620, 0x5703: 0x40844820, - 0x5704: 0x40844a20, 0x5705: 0x40844c20, 0x5706: 0x40844e20, 0x5707: 0x40845020, - 0x5708: 0x40845220, 0x5709: 0x40845420, 0x570a: 0x40845620, 0x570b: 0x40845820, - 0x570c: 0x40845a20, 0x570d: 0x40845c20, 0x570e: 0x40845e20, 0x570f: 0x40846020, - 0x5710: 0x40846220, 0x5711: 0x40846420, 0x5712: 0x40846620, 0x5713: 0x40846820, - 0x5714: 0x40846a20, 0x5715: 0x40846c20, 0x5716: 0x40846e20, 0x5717: 0x40847020, - 0x5718: 0x40847220, 0x5719: 0x40847420, 0x571a: 0x40847620, 0x571b: 0x40847820, - 0x571c: 0x40847a20, 0x571d: 0x40847c20, 0x571e: 0x40847e20, 0x571f: 0x40848020, - 0x5720: 0x40848220, 0x5721: 0x40848420, 0x5722: 0x40848620, 0x5723: 0x40848820, - 0x5724: 0x40848a20, 0x5725: 0x40848c20, 0x5726: 0x40848e20, 0x5727: 0x40849020, - 0x5728: 0x40849220, 0x5729: 0x40849420, 0x572a: 0x40849620, 0x572b: 0x40849820, - 0x572c: 0x40849a20, 0x572d: 0x40849c20, 0x572e: 0x40849e20, 0x572f: 0x4084a020, - 0x5730: 0x4084a220, 0x5731: 0x4084a420, 0x5732: 0x4084a620, 0x5733: 0x4084a820, - 0x5734: 0x4084aa20, 0x5735: 0x4084ac20, 0x5736: 0x4084ae20, 0x5737: 0x4084b020, - 0x5738: 0x4084b220, 0x5739: 0x4084b420, 0x573a: 0x4084b620, 0x573b: 0x4084b820, - 0x573c: 0x4084ba20, 0x573d: 0x4084bc20, 0x573e: 0x4084be20, 0x573f: 0x4084c020, - // Block 0x15d, offset 0x5740 - 0x5740: 0x4084c220, 0x5741: 0x4084c420, 0x5742: 0x4084c620, 0x5743: 0x4084c820, - 0x5744: 0x4084ca20, 0x5745: 0x4084cc20, 0x5746: 0x4084ce20, 0x5747: 0x4084d020, - 0x5748: 0x4084d220, 0x5749: 0x4084d420, 0x574a: 0x4084d620, 0x574b: 0x4084d820, - 0x574c: 0x4084da20, 0x574d: 0x4084dc20, 0x574e: 0x4084de20, 0x574f: 0x4084e020, - 0x5750: 0x4084e220, 0x5751: 0x4084e420, 0x5752: 0x4084e620, 0x5753: 0x4084e820, - 0x5754: 0x4084ea20, 0x5755: 0x4084ec20, 0x5756: 0x4084ee20, 0x5757: 0x4084f020, - 0x5758: 0x4084f220, 0x5759: 0x4084f420, 0x575a: 0x4084f620, 0x575b: 0x4084f820, - 0x575c: 0x4084fa20, 0x575d: 0x4084fc20, 0x575e: 0x4084fe20, 0x575f: 0x40850020, - 0x5760: 0x40850220, 0x5761: 0x40850420, 0x5762: 0x40850620, 0x5763: 0x40850820, - 0x5764: 0x40850a20, 0x5765: 0x40850c20, 0x5766: 0x40850e20, 0x5767: 0x40851020, - 0x5768: 0x40851220, 0x5769: 0x40851420, 0x576a: 0x40851620, 0x576b: 0x40851820, - 0x576c: 0x40851a20, 0x576d: 0x40851c20, 0x576e: 0x40851e20, 0x576f: 0x40852020, - 0x5770: 0x40852220, 0x5771: 0x40852420, 0x5772: 0x40852620, 0x5773: 0x40852820, - 0x5774: 0x40852a20, 0x5775: 0x40852c20, 0x5776: 0x40852e20, 0x5777: 0x40853020, - 0x5778: 0x40853220, 0x5779: 0x40853420, 0x577a: 0x40853620, 0x577b: 0x40853820, - 0x577c: 0x40853a20, 0x577d: 0x40853c20, 0x577e: 0x40853e20, 0x577f: 0x40854020, - // Block 0x15e, offset 0x5780 - 0x5780: 0x40854220, 0x5781: 0x40854420, 0x5782: 0x40854620, 0x5783: 0x40854820, - 0x5784: 0x40854a20, 0x5785: 0x40854c20, 0x5786: 0x40854e20, 0x5787: 0x40855020, - 0x5788: 0x40855220, 0x5789: 0x40855420, 0x578a: 0x40855620, 0x578b: 0x40855820, - 0x578c: 0x40855a20, 0x578d: 0x40855c20, 0x578e: 0x40855e20, 0x578f: 0x40856020, - 0x5790: 0x40856220, 0x5791: 0x40856420, 0x5792: 0x40856620, 0x5793: 0x40856820, - 0x5794: 0x40856a20, 0x5795: 0x40856c20, 0x5796: 0x40856e20, 0x5797: 0x40857020, - 0x5798: 0x40857220, 0x5799: 0x40857420, 0x579a: 0x40857620, 0x579b: 0x40857820, - 0x579c: 0x40857a20, 0x579d: 0x40857c20, 0x579e: 0x40857e20, 0x579f: 0x40858020, - 0x57a0: 0x40858220, 0x57a1: 0x40858420, 0x57a2: 0x40858620, 0x57a3: 0x40858820, - 0x57a4: 0x40858a20, 0x57a5: 0x40858c20, 0x57a6: 0x40858e20, 0x57a7: 0x40859020, - 0x57a8: 0x40859220, 0x57a9: 0x40859420, 0x57aa: 0x40859620, 0x57ab: 0x40859820, - 0x57ac: 0x40859a20, 0x57ad: 0x40859c20, 0x57ae: 0x40859e20, 0x57af: 0x4085a020, - 0x57b0: 0x4085a220, 0x57b1: 0x4085a420, 0x57b2: 0x4085a620, 0x57b3: 0x4085a820, - 0x57b4: 0x4085aa20, 0x57b5: 0x4085ac20, 0x57b6: 0x4085ae20, 0x57b7: 0x4085b020, - 0x57b8: 0x4085b220, 0x57b9: 0x4085b420, 0x57ba: 0x4085b620, 0x57bb: 0x4085b820, - 0x57bc: 0x4085ba20, 0x57bd: 0x4085bc20, 0x57be: 0x4085be20, 0x57bf: 0x4085c020, - // Block 0x15f, offset 0x57c0 - 0x57c0: 0x4085c220, 0x57c1: 0x4085c420, 0x57c2: 0x4085c620, 0x57c3: 0x4085c820, - 0x57c4: 0x4085ca20, 0x57c5: 0x4085cc20, 0x57c6: 0x4085ce20, 0x57c7: 0x4085d020, - 0x57c8: 0x4085d220, 0x57c9: 0x4085d420, 0x57ca: 0x4085d620, 0x57cb: 0x4085d820, - 0x57cc: 0x4085da20, 0x57cd: 0x4085dc20, 0x57ce: 0x4085de20, 0x57cf: 0x4085e020, - 0x57d0: 0x4085e220, 0x57d1: 0x4085e420, 0x57d2: 0x4085e620, 0x57d3: 0x4085e820, - 0x57d4: 0x4085ea20, 0x57d5: 0x4085ec20, 0x57d6: 0x4085ee20, 0x57d7: 0x4085f020, - 0x57d8: 0x4085f220, 0x57d9: 0x4085f420, 0x57da: 0x4085f620, 0x57db: 0x4085f820, - 0x57dc: 0x4085fa20, 0x57dd: 0x4085fc20, 0x57de: 0x4085fe20, 0x57df: 0x40860020, - 0x57e0: 0x40860220, 0x57e1: 0x40860420, 0x57e2: 0x40860620, 0x57e3: 0x40860820, - 0x57e4: 0x40860a20, 0x57e5: 0x40860c20, 0x57e6: 0x40860e20, 0x57e7: 0x40861020, - 0x57e8: 0x40861220, 0x57e9: 0x40861420, 0x57ea: 0x40861620, 0x57eb: 0x40861820, - 0x57ec: 0x40861a20, 0x57ed: 0x40861c20, 0x57ee: 0x40861e20, - // Block 0x160, offset 0x5800 - 0x5800: 0x405e3a20, 0x5801: 0x405e3c20, 0x5802: 0x405e3e20, 0x5803: 0x405e4020, - 0x5804: 0x405e4220, 0x5805: 0x405e4420, 0x5806: 0x405e4620, 0x5807: 0x405e4820, - 0x5808: 0x405e4a20, 0x5809: 0x405e4c20, 0x580a: 0x405e4e20, 0x580b: 0x405e5020, - 0x580c: 0x405e5220, 0x580d: 0x405e5420, 0x580e: 0x405e5620, 0x580f: 0x405e5820, - 0x5810: 0x405e5a20, 0x5811: 0x405e5c20, 0x5812: 0x405e5e20, 0x5813: 0x405e6020, - 0x5814: 0x405e6220, 0x5815: 0x405e6420, 0x5816: 0x405e6620, 0x5817: 0x405e6820, - 0x5818: 0x405e6a20, 0x5819: 0x405e6c20, 0x581a: 0x405e6e20, 0x581b: 0x405e7020, - 0x581c: 0x405e7220, 0x581d: 0x405e7420, 0x581e: 0x405e7620, 0x581f: 0x405e7820, - 0x5820: 0x405e7a20, 0x5821: 0x405e7c20, 0x5822: 0x405e7e20, 0x5823: 0x405e8020, - 0x5824: 0x405e8220, 0x5825: 0x405e8420, 0x5826: 0x405e8620, 0x5827: 0x405e8820, - 0x5828: 0x405e8a20, 0x5829: 0x405e8c20, 0x582a: 0x405e8e20, 0x582b: 0x405e9020, - 0x582c: 0x405e9220, 0x582d: 0x405e9420, 0x582e: 0x405e9620, 0x582f: 0x405e9820, - 0x5830: 0x405e9a20, 0x5831: 0x405e9c20, 0x5832: 0x405e9e20, 0x5833: 0x405ea020, - 0x5834: 0x405ea220, 0x5835: 0x405ea420, 0x5836: 0x405ea620, 0x5837: 0x405ea820, - 0x5838: 0x405eaa20, 0x5839: 0x405eac20, 0x583a: 0x405eae20, 0x583b: 0x405eb020, - 0x583c: 0x405eb220, 0x583d: 0x405eb420, 0x583e: 0x405eb620, 0x583f: 0x405eb820, - // Block 0x161, offset 0x5840 - 0x5840: 0x405eba20, 0x5841: 0x405ebc20, 0x5842: 0x405ebe20, 0x5843: 0x405ec020, - 0x5844: 0x405ec220, 0x5845: 0x405ec420, 0x5846: 0x405ec620, 0x5847: 0x405ec820, - 0x5848: 0x405eca20, 0x5849: 0x405ecc20, 0x584a: 0x405ece20, 0x584b: 0x405ed020, - 0x584c: 0x405ed220, 0x584d: 0x405ed420, 0x584e: 0x405ed620, 0x584f: 0x405ed820, - 0x5850: 0x405eda20, 0x5851: 0x405edc20, 0x5852: 0x405ede20, 0x5853: 0x405ee020, - 0x5854: 0x405ee220, 0x5855: 0x405ee420, 0x5856: 0x405ee620, 0x5857: 0x405ee820, - 0x5858: 0x405eea20, 0x5859: 0x405eec20, 0x585a: 0x405eee20, 0x585b: 0x405ef020, - 0x585c: 0x405ef220, 0x585d: 0x405ef420, 0x585e: 0x405ef620, 0x585f: 0x405ef820, - 0x5860: 0x405efa20, 0x5861: 0x405efc20, 0x5862: 0x405efe20, 0x5863: 0x405f0020, - 0x5864: 0x405f0220, 0x5865: 0x405f0420, 0x5866: 0x405f0620, 0x5867: 0x405f0820, - 0x5868: 0x405f0a20, 0x5869: 0x405f0c20, 0x586a: 0x405f0e20, 0x586b: 0x405f1020, - 0x586c: 0x405f1220, 0x586d: 0x405f1420, 0x586e: 0x405f1620, 0x586f: 0x405f1820, - 0x5870: 0x405f1a20, 0x5871: 0x405f1c20, 0x5872: 0x405f1e20, 0x5873: 0x405f2020, - 0x5874: 0x405f2220, 0x5875: 0x405f2420, 0x5876: 0x405f2620, 0x5877: 0x405f2820, - 0x5878: 0x405f2a20, 0x5879: 0x405f2c20, 0x587a: 0x405f2e20, 0x587b: 0x405f3020, - 0x587c: 0x405f3220, 0x587d: 0x405f3420, 0x587e: 0x405f3620, 0x587f: 0x405f3820, - // Block 0x162, offset 0x5880 - 0x5880: 0x405f3a20, 0x5881: 0x405f3c20, 0x5882: 0x405f3e20, 0x5883: 0x405f4020, - 0x5884: 0x405f4220, 0x5885: 0x405f4420, 0x5886: 0x405f4620, 0x5887: 0x405f4820, - 0x5888: 0x405f4a20, 0x5889: 0x405f4c20, 0x588a: 0x405f4e20, 0x588b: 0x405f5020, - 0x588c: 0x405f5220, 0x588d: 0x405f5420, 0x588e: 0x405f5620, 0x588f: 0x405f5820, - 0x5890: 0x405f5a20, 0x5891: 0x405f5c20, 0x5892: 0x405f5e20, 0x5893: 0x405f6020, - 0x5894: 0x405f6220, 0x5895: 0x405f6420, 0x5896: 0x405f6620, 0x5897: 0x405f6820, - 0x5898: 0x405f6a20, 0x5899: 0x405f6c20, 0x589a: 0x405f6e20, 0x589b: 0x405f7020, - 0x589c: 0x405f7220, 0x589d: 0x405f7420, 0x589e: 0x405f7620, 0x589f: 0x405f7820, - 0x58a0: 0x405f7a20, 0x58a1: 0x405f7c20, 0x58a2: 0x405f7e20, 0x58a3: 0x405f8020, - 0x58a4: 0x405f8220, 0x58a5: 0x405f8420, 0x58a6: 0x405f8620, 0x58a7: 0x405f8820, - 0x58a8: 0x405f8a20, 0x58a9: 0x405f8c20, 0x58aa: 0x405f8e20, 0x58ab: 0x405f9020, - 0x58ac: 0x405f9220, 0x58ad: 0x405f9420, 0x58ae: 0x405f9620, 0x58af: 0x405f9820, - 0x58b0: 0x405f9a20, 0x58b1: 0x405f9c20, 0x58b2: 0x405f9e20, 0x58b3: 0x405fa020, - 0x58b4: 0x405fa220, 0x58b5: 0x405fa420, 0x58b6: 0x405fa620, 0x58b7: 0x405fa820, - 0x58b8: 0x405faa20, 0x58b9: 0x405fac20, 0x58ba: 0x405fae20, 0x58bb: 0x405fb020, - 0x58bc: 0x405fb220, 0x58bd: 0x405fb420, 0x58be: 0x405fb620, 0x58bf: 0x405fb820, - // Block 0x163, offset 0x58c0 - 0x58c0: 0x405fba20, 0x58c1: 0x405fbc20, 0x58c2: 0x405fbe20, 0x58c3: 0x405fc020, - 0x58c4: 0x405fc220, 0x58c5: 0x405fc420, 0x58c6: 0x405fc620, 0x58c7: 0x405fc820, - 0x58c8: 0x405fca20, 0x58c9: 0x405fcc20, 0x58ca: 0x405fce20, 0x58cb: 0x405fd020, - 0x58cc: 0x405fd220, 0x58cd: 0x405fd420, 0x58ce: 0x405fd620, 0x58cf: 0x405fd820, - 0x58d0: 0x405fda20, 0x58d1: 0x405fdc20, 0x58d2: 0x405fde20, 0x58d3: 0x405fe020, - 0x58d4: 0x405fe220, 0x58d5: 0x405fe420, 0x58d6: 0x405fe620, 0x58d7: 0x405fe820, - 0x58d8: 0x405fea20, 0x58d9: 0x405fec20, 0x58da: 0x405fee20, 0x58db: 0x405ff020, - 0x58dc: 0x405ff220, 0x58dd: 0x405ff420, 0x58de: 0x405ff620, 0x58df: 0x405ff820, - 0x58e0: 0x405ffa20, 0x58e1: 0x405ffc20, 0x58e2: 0x405ffe20, 0x58e3: 0x40600020, - 0x58e4: 0x40600220, 0x58e5: 0x40600420, 0x58e6: 0x40600620, 0x58e7: 0x40600820, - 0x58e8: 0x40600a20, 0x58e9: 0x40600c20, 0x58ea: 0x40600e20, 0x58eb: 0x40601020, - 0x58ec: 0x40601220, 0x58ed: 0x40601420, 0x58ee: 0x40601620, 0x58ef: 0x40601820, - 0x58f0: 0x40601a20, 0x58f1: 0x40601c20, 0x58f2: 0x40601e20, 0x58f3: 0x40602020, - 0x58f4: 0x40602220, 0x58f5: 0x40602420, 0x58f6: 0x40602620, 0x58f7: 0x40602820, - 0x58f8: 0x40602a20, 0x58f9: 0x40602c20, 0x58fa: 0x40602e20, 0x58fb: 0x40603020, - 0x58fc: 0x40603220, 0x58fd: 0x40603420, 0x58fe: 0x40603620, 0x58ff: 0x40603820, - // Block 0x164, offset 0x5900 - 0x5900: 0x40603a20, 0x5901: 0x40603c20, 0x5902: 0x40603e20, 0x5903: 0x40604020, - 0x5904: 0x40604220, 0x5905: 0x40604420, 0x5906: 0x40604620, 0x5907: 0x40604820, - 0x5908: 0x40604a20, 0x5909: 0x40604c20, 0x590a: 0x40604e20, 0x590b: 0x40605020, - 0x590c: 0x40605220, 0x590d: 0x40605420, 0x590e: 0x40605620, 0x590f: 0x40605820, - 0x5910: 0x40605a20, 0x5911: 0x40605c20, 0x5912: 0x40605e20, 0x5913: 0x40606020, - 0x5914: 0x40606220, 0x5915: 0x40606420, 0x5916: 0x40606620, 0x5917: 0x40606820, - 0x5918: 0x40606a20, 0x5919: 0x40606c20, 0x591a: 0x40606e20, 0x591b: 0x40607020, - 0x591c: 0x40607220, 0x591d: 0x40607420, 0x591e: 0x40607620, 0x591f: 0x40607820, - 0x5920: 0x40607a20, 0x5921: 0x40607c20, 0x5922: 0x40607e20, 0x5923: 0x40608020, - 0x5924: 0x40608220, 0x5925: 0x40608420, 0x5926: 0x40608620, 0x5927: 0x40608820, - 0x5928: 0x40608a20, 0x5929: 0x40608c20, 0x592a: 0x40608e20, 0x592b: 0x40609020, - 0x592c: 0x40609220, 0x592d: 0x40609420, 0x592e: 0x40609620, 0x592f: 0x40609820, - 0x5930: 0x40609a20, 0x5931: 0x40609c20, 0x5932: 0x40609e20, 0x5933: 0x4060a020, - 0x5934: 0x4060a220, 0x5935: 0x4060a420, 0x5936: 0x4060a620, 0x5937: 0x4060a820, - 0x5938: 0x4060aa20, 0x5939: 0x4060ac20, 0x593a: 0x4060ae20, 0x593b: 0x4060b020, - 0x593c: 0x4060b220, 0x593d: 0x4060b420, 0x593e: 0x4060b620, 0x593f: 0x4060b820, - // Block 0x165, offset 0x5940 - 0x5940: 0x4060ba20, 0x5941: 0x4060bc20, 0x5942: 0x4060be20, 0x5943: 0x4060c020, - 0x5944: 0x4060c220, 0x5945: 0x4060c420, 0x5946: 0x4060c620, 0x5947: 0x4060c820, - 0x5948: 0x4060ca20, 0x5949: 0x4060cc20, 0x594a: 0x4060ce20, 0x594b: 0x4060d020, - 0x594c: 0x4060d220, 0x594d: 0x4060d420, 0x594e: 0x4060d620, 0x594f: 0x4060d820, - 0x5950: 0x4060da20, 0x5951: 0x4060dc20, 0x5952: 0x4060de20, 0x5953: 0x4060e020, - 0x5954: 0x4060e220, 0x5955: 0x4060e420, 0x5956: 0x4060e620, 0x5957: 0x4060e820, - 0x5958: 0x4060ea20, 0x5959: 0x4060ec20, 0x595a: 0x4060ee20, 0x595b: 0x4060f020, - 0x595c: 0x4060f220, 0x595d: 0x4060f420, 0x595e: 0x4060f620, 0x595f: 0x4060f820, - 0x5960: 0x4060fa20, 0x5961: 0x4060fc20, 0x5962: 0x4060fe20, 0x5963: 0x40610020, - 0x5964: 0x40610220, 0x5965: 0x40610420, 0x5966: 0x40610620, 0x5967: 0x40610820, - 0x5968: 0x40610a20, 0x5969: 0x40610c20, 0x596a: 0x40610e20, 0x596b: 0x40611020, - 0x596c: 0x40611220, 0x596d: 0x40611420, 0x596e: 0x40611620, 0x596f: 0x40611820, - 0x5970: 0x40611a20, 0x5971: 0x40611c20, 0x5972: 0x40611e20, 0x5973: 0x40612020, - 0x5974: 0x40612220, 0x5975: 0x40612420, 0x5976: 0x40612620, 0x5977: 0x40612820, - 0x5978: 0x40612a20, 0x5979: 0x40612c20, 0x597a: 0x40612e20, 0x597b: 0x40613020, - 0x597c: 0x40613220, 0x597d: 0x40613420, 0x597e: 0x40613620, 0x597f: 0x40613820, - // Block 0x166, offset 0x5980 - 0x5980: 0x40613a20, 0x5981: 0x40613c20, 0x5982: 0x40613e20, 0x5983: 0x40614020, - 0x5984: 0x40614220, 0x5985: 0x40614420, 0x5986: 0x40614620, 0x5987: 0x40614820, - 0x5988: 0x40614a20, 0x5989: 0x40614c20, 0x598a: 0x40614e20, 0x598b: 0x40615020, - 0x598c: 0x40615220, 0x598d: 0x40615420, 0x598e: 0x40615620, 0x598f: 0x40615820, - 0x5990: 0x40615a20, 0x5991: 0x40615c20, 0x5992: 0x40615e20, 0x5993: 0x40616020, - 0x5994: 0x40616220, 0x5995: 0x40616420, 0x5996: 0x40616620, 0x5997: 0x40616820, - 0x5998: 0x40616a20, 0x5999: 0x40616c20, 0x599a: 0x40616e20, 0x599b: 0x40617020, - 0x599c: 0x40617220, 0x599d: 0x40617420, 0x599e: 0x40617620, 0x599f: 0x40617820, - 0x59a0: 0x40617a20, 0x59a1: 0x40617c20, 0x59a2: 0x40617e20, 0x59a3: 0x40618020, - 0x59a4: 0x40618220, 0x59a5: 0x40618420, 0x59a6: 0x40618620, 0x59a7: 0x40618820, - 0x59a8: 0x40618a20, 0x59a9: 0x40618c20, 0x59aa: 0x40618e20, 0x59ab: 0x40619020, - 0x59ac: 0x40619220, 0x59ad: 0x40619420, 0x59ae: 0x40619620, 0x59af: 0x40619820, - 0x59b0: 0x40619a20, 0x59b1: 0x40619c20, 0x59b2: 0x40619e20, 0x59b3: 0x4061a020, - 0x59b4: 0x4061a220, 0x59b5: 0x4061a420, 0x59b6: 0x4061a620, 0x59b7: 0x4061a820, - 0x59b8: 0x4061aa20, 0x59b9: 0x4061ac20, 0x59ba: 0x4061ae20, 0x59bb: 0x4061b020, - 0x59bc: 0x4061b220, 0x59bd: 0x4061b420, 0x59be: 0x4061b620, 0x59bf: 0x4061b820, - // Block 0x167, offset 0x59c0 - 0x59c0: 0x4061ba20, 0x59c1: 0x4061bc20, 0x59c2: 0x4061be20, 0x59c3: 0x4061c020, - 0x59c4: 0x4061c220, 0x59c5: 0x4061c420, 0x59c6: 0x4061c620, 0x59c7: 0x4061c820, - 0x59c8: 0x4061ca20, 0x59c9: 0x4061cc20, 0x59ca: 0x4061ce20, 0x59cb: 0x4061d020, - 0x59cc: 0x4061d220, 0x59cd: 0x4061d420, 0x59ce: 0x4061d620, 0x59cf: 0x4061d820, - 0x59d0: 0x4061da20, 0x59d1: 0x4061dc20, 0x59d2: 0x4061de20, 0x59d3: 0x4061e020, - 0x59d4: 0x4061e220, 0x59d5: 0x4061e420, 0x59d6: 0x4061e620, 0x59d7: 0x4061e820, - 0x59d8: 0x4061ea20, 0x59d9: 0x4061ec20, 0x59da: 0x4061ee20, 0x59db: 0x4061f020, - 0x59dc: 0x4061f220, 0x59dd: 0x4061f420, 0x59de: 0x4061f620, 0x59df: 0x4061f820, - 0x59e0: 0x4061fa20, 0x59e1: 0x4061fc20, 0x59e2: 0x4061fe20, 0x59e3: 0x40620020, - 0x59e4: 0x40620220, 0x59e5: 0x40620420, 0x59e6: 0x40620620, 0x59e7: 0x40620820, - 0x59e8: 0x40620a20, 0x59e9: 0x40620c20, 0x59ea: 0x40620e20, 0x59eb: 0x40621020, - 0x59ec: 0x40621220, 0x59ed: 0x40621420, 0x59ee: 0x40621620, 0x59ef: 0x40621820, - 0x59f0: 0x40621a20, 0x59f1: 0x40621c20, 0x59f2: 0x40621e20, 0x59f3: 0x40622020, - 0x59f4: 0x40622220, 0x59f5: 0x40622420, 0x59f6: 0x40622620, 0x59f7: 0x40622820, - 0x59f8: 0x40622a20, 0x59f9: 0x40622c20, 0x59fa: 0x40622e20, 0x59fb: 0x40623020, - 0x59fc: 0x40623220, 0x59fd: 0x40623420, 0x59fe: 0x40623620, 0x59ff: 0x40623820, - // Block 0x168, offset 0x5a00 - 0x5a00: 0x40623a20, 0x5a01: 0x40623c20, 0x5a02: 0x40623e20, 0x5a03: 0x40624020, - 0x5a04: 0x40624220, 0x5a05: 0x40624420, 0x5a06: 0x40624620, 0x5a07: 0x40624820, - 0x5a08: 0x40624a20, 0x5a09: 0x40624c20, 0x5a0a: 0x40624e20, 0x5a0b: 0x40625020, - 0x5a0c: 0x40625220, 0x5a0d: 0x40625420, 0x5a0e: 0x40625620, 0x5a0f: 0x40625820, - 0x5a10: 0x40625a20, 0x5a11: 0x40625c20, 0x5a12: 0x40625e20, 0x5a13: 0x40626020, - 0x5a14: 0x40626220, 0x5a15: 0x40626420, 0x5a16: 0x40626620, 0x5a17: 0x40626820, - 0x5a18: 0x40626a20, 0x5a19: 0x40626c20, 0x5a1a: 0x40626e20, 0x5a1b: 0x40627020, - 0x5a1c: 0x40627220, 0x5a1d: 0x40627420, 0x5a1e: 0x40627620, 0x5a1f: 0x40627820, - 0x5a20: 0x40627a20, 0x5a21: 0x40627c20, 0x5a22: 0x40627e20, 0x5a23: 0x40628020, - 0x5a24: 0x40628220, 0x5a25: 0x40628420, 0x5a26: 0x40628620, 0x5a27: 0x40628820, - 0x5a28: 0x40628a20, 0x5a29: 0x40628c20, 0x5a2a: 0x40628e20, 0x5a2b: 0x40629020, - 0x5a2c: 0x40629220, 0x5a2d: 0x40629420, 0x5a2e: 0x40629620, 0x5a2f: 0x40629820, - 0x5a30: 0x40629a20, 0x5a31: 0x40629c20, 0x5a32: 0x40629e20, 0x5a33: 0x4062a020, - 0x5a34: 0x4062a220, 0x5a35: 0x4062a420, 0x5a36: 0x4062a620, 0x5a37: 0x4062a820, - 0x5a38: 0x4062aa20, - // Block 0x169, offset 0x5a40 - 0x5a40: 0x406fb620, 0x5a41: 0x406fb820, 0x5a42: 0x406fba20, 0x5a43: 0x406fbc20, - 0x5a44: 0x406fbe20, 0x5a45: 0x406fc020, 0x5a46: 0x006fbe84, 0x5a47: 0x406fc220, - 0x5a48: 0x406fc420, 0x5a49: 0x406fc620, 0x5a4a: 0x406fc820, 0x5a4b: 0x406fca20, - 0x5a4c: 0x406fcc20, 0x5a4d: 0x406fce20, 0x5a4e: 0x406fd020, 0x5a4f: 0x406fd220, - 0x5a50: 0x406fd420, 0x5a51: 0x406fd620, 0x5a52: 0x406fd820, 0x5a53: 0x006fd484, - 0x5a54: 0x406fda20, 0x5a55: 0x406fdc20, 0x5a56: 0x406fde20, 0x5a57: 0x406fe020, - 0x5a58: 0x406fe220, 0x5a59: 0x406fe420, 0x5a5a: 0x406fe620, 0x5a5b: 0x406fe820, - 0x5a5c: 0x406fea20, 0x5a5d: 0x406fec20, 0x5a5e: 0x406fee20, 0x5a5f: 0x406ff020, - 0x5a60: 0x406ff220, 0x5a61: 0x406ff420, 0x5a62: 0x406ff620, 0x5a63: 0x406ff820, - 0x5a64: 0x406ffa20, 0x5a65: 0x006ff884, 0x5a66: 0x406ffc20, 0x5a67: 0x406ffe20, - 0x5a68: 0x40700020, 0x5a69: 0x40700220, 0x5a6a: 0x40700420, 0x5a6b: 0x40700620, - 0x5a6c: 0x40700820, 0x5a6d: 0x40700a20, 0x5a6e: 0x40700c20, 0x5a6f: 0x40700e20, - 0x5a70: 0x40701020, 0x5a71: 0x40701220, 0x5a72: 0x40701420, 0x5a73: 0x40701620, - 0x5a74: 0x40701820, 0x5a75: 0x40701a20, 0x5a76: 0x40701c20, 0x5a77: 0x40701e20, - 0x5a78: 0x40702020, 0x5a79: 0x40702220, 0x5a7a: 0x40702420, 0x5a7b: 0x40702620, - 0x5a7c: 0x40702820, 0x5a7d: 0x40702a20, 0x5a7e: 0x40702c20, 0x5a7f: 0x00702a84, - // Block 0x16a, offset 0x5a80 - 0x5a80: 0x40702e20, 0x5a81: 0x40703020, 0x5a82: 0x40703220, 0x5a83: 0x40703420, - 0x5a84: 0x40703620, - 0x5a90: 0x40703820, 0x5a91: 0x40703a20, 0x5a92: 0x40703c20, 0x5a93: 0x40703e20, - 0x5a94: 0x40704020, 0x5a95: 0x40704220, 0x5a96: 0x40704420, 0x5a97: 0x40704620, - 0x5a98: 0x40704820, 0x5a99: 0x40704a20, 0x5a9a: 0x40704c20, 0x5a9b: 0x40704e20, - 0x5a9c: 0x40705020, 0x5a9d: 0x40705220, 0x5a9e: 0x40705420, 0x5a9f: 0x40705620, - 0x5aa0: 0x40705820, 0x5aa1: 0x40705a20, 0x5aa2: 0x40705c20, 0x5aa3: 0x40705e20, - 0x5aa4: 0x40706020, 0x5aa5: 0x40706220, 0x5aa6: 0x40706420, 0x5aa7: 0x40706620, - 0x5aa8: 0x40706820, 0x5aa9: 0x40706a20, 0x5aaa: 0x40706c20, 0x5aab: 0x40706e20, - 0x5aac: 0x40707020, 0x5aad: 0x40707220, 0x5aae: 0x40707420, 0x5aaf: 0x40707620, - 0x5ab0: 0x40707820, 0x5ab1: 0x40707a20, 0x5ab2: 0x40707c20, 0x5ab3: 0x40707e20, - 0x5ab4: 0x40708020, 0x5ab5: 0x40708220, 0x5ab6: 0x40708420, 0x5ab7: 0x40708620, - 0x5ab8: 0x40708820, 0x5ab9: 0x40708a20, 0x5aba: 0x40708c20, 0x5abb: 0x40708e20, - 0x5abc: 0x40709020, 0x5abd: 0x40709220, 0x5abe: 0x40709420, - // Block 0x16b, offset 0x5ac0 - 0x5acf: 0x40709620, - 0x5ad0: 0x40709820, 0x5ad1: 0x40709a20, 0x5ad2: 0x40709c20, 0x5ad3: 0x40709e20, - 0x5ad4: 0x4070a020, 0x5ad5: 0x4070a220, 0x5ad6: 0x4070a420, 0x5ad7: 0x4070a620, - 0x5ad8: 0x4070a820, 0x5ad9: 0x4070aa20, 0x5ada: 0x4070ac20, 0x5adb: 0x4070ae20, - 0x5adc: 0x4070b020, 0x5add: 0x4070b220, 0x5ade: 0x4070b420, 0x5adf: 0x4070b620, - // Block 0x16c, offset 0x5b00 - 0x5b00: 0x00657c91, 0x5b01: 0x0065c28e, - // Block 0x16d, offset 0x5b40 - 0x5b40: 0x401ba420, 0x5b41: 0x401ba620, 0x5b42: 0x401ba820, 0x5b43: 0x401baa20, - 0x5b44: 0x401bac20, 0x5b45: 0x401bae20, 0x5b46: 0x401bb020, 0x5b47: 0x401bb220, - 0x5b48: 0x401bb420, 0x5b49: 0x401bb620, 0x5b4a: 0x401bb820, 0x5b4b: 0x401bba20, - 0x5b4c: 0x401bbc20, 0x5b4d: 0x401bbe20, 0x5b4e: 0x401bc020, 0x5b4f: 0x401bc220, - 0x5b50: 0x401bc420, 0x5b51: 0x401bc620, 0x5b52: 0x401bc820, 0x5b53: 0x401bca20, - 0x5b54: 0x401bcc20, 0x5b55: 0x401bce20, 0x5b56: 0x401bd020, 0x5b57: 0x401bd220, - 0x5b58: 0x401bd420, 0x5b59: 0x401bd620, 0x5b5a: 0x401bd820, 0x5b5b: 0x401bda20, - 0x5b5c: 0x401bdc20, 0x5b5d: 0x401bde20, 0x5b5e: 0x401be020, 0x5b5f: 0x401be220, - 0x5b60: 0x401be420, 0x5b61: 0x401be620, 0x5b62: 0x401be820, 0x5b63: 0x401bea20, - 0x5b64: 0x401bec20, 0x5b65: 0x401bee20, 0x5b66: 0x401bf020, 0x5b67: 0x401bf220, - 0x5b68: 0x401bf420, 0x5b69: 0x401bf620, 0x5b6a: 0x401bf820, 0x5b6b: 0x401bfa20, - 0x5b6c: 0x401bfc20, 0x5b6d: 0x401bfe20, 0x5b6e: 0x401c0020, 0x5b6f: 0x401c0220, - 0x5b70: 0x401c0420, 0x5b71: 0x401c0620, 0x5b72: 0x401c0820, 0x5b73: 0x401c0a20, - 0x5b74: 0x401c0c20, 0x5b75: 0x401c0e20, 0x5b76: 0x401c1020, 0x5b77: 0x401c1220, - 0x5b78: 0x401c1420, 0x5b79: 0x401c1620, 0x5b7a: 0x401c1820, 0x5b7b: 0x401c1a20, - 0x5b7c: 0x401c1c20, 0x5b7d: 0x401c1e20, 0x5b7e: 0x401c2020, 0x5b7f: 0x401c2220, - // Block 0x16e, offset 0x5b80 - 0x5b80: 0x401c2420, 0x5b81: 0x401c2620, 0x5b82: 0x401c2820, 0x5b83: 0x401c2a20, - 0x5b84: 0x401c2c20, 0x5b85: 0x401c2e20, 0x5b86: 0x401c3020, 0x5b87: 0x401c3220, - 0x5b88: 0x401c3420, 0x5b89: 0x401c3620, 0x5b8a: 0x401c3820, 0x5b8b: 0x401c3a20, - 0x5b8c: 0x401c3c20, 0x5b8d: 0x401c3e20, 0x5b8e: 0x401c4020, 0x5b8f: 0x401c4220, - 0x5b90: 0x401c4420, 0x5b91: 0x401c4620, 0x5b92: 0x401c4820, 0x5b93: 0x401c4a20, - 0x5b94: 0x401c4c20, 0x5b95: 0x401c4e20, 0x5b96: 0x401c5020, 0x5b97: 0x401c5220, - 0x5b98: 0x401c5420, 0x5b99: 0x401c5620, 0x5b9a: 0x401c5820, 0x5b9b: 0x401c5a20, - 0x5b9c: 0x401c5c20, 0x5b9d: 0x401c5e20, 0x5b9e: 0x401c6020, 0x5b9f: 0x401c6220, - 0x5ba0: 0x401c6420, 0x5ba1: 0x401c6620, 0x5ba2: 0x401c6820, 0x5ba3: 0x401c6a20, - 0x5ba4: 0x401c6c20, 0x5ba5: 0x401c6e20, 0x5ba6: 0x401c7020, 0x5ba7: 0x401c7220, - 0x5ba8: 0x401c7420, 0x5ba9: 0x401c7620, 0x5baa: 0x401c7820, 0x5bab: 0x401c7a20, - 0x5bac: 0x401c7c20, 0x5bad: 0x401c7e20, 0x5bae: 0x401c8020, 0x5baf: 0x401c8220, - 0x5bb0: 0x401c8420, 0x5bb1: 0x401c8620, 0x5bb2: 0x401c8820, 0x5bb3: 0x401c8a20, - 0x5bb4: 0x401c8c20, 0x5bb5: 0x401c8e20, 0x5bb6: 0x401c9020, 0x5bb7: 0x401c9220, - 0x5bb8: 0x401c9420, 0x5bb9: 0x401c9620, 0x5bba: 0x401c9820, 0x5bbb: 0x401c9a20, - 0x5bbc: 0x401c9c20, 0x5bbd: 0x401c9e20, 0x5bbe: 0x401ca020, 0x5bbf: 0x401ca220, - // Block 0x16f, offset 0x5bc0 - 0x5bc0: 0x401ca420, 0x5bc1: 0x401ca620, 0x5bc2: 0x401ca820, 0x5bc3: 0x401caa20, - 0x5bc4: 0x401cac20, 0x5bc5: 0x401cae20, 0x5bc6: 0x401cb020, 0x5bc7: 0x401cb220, - 0x5bc8: 0x401cb420, 0x5bc9: 0x401cb620, 0x5bca: 0x401cb820, 0x5bcb: 0x401cba20, - 0x5bcc: 0x401cbc20, 0x5bcd: 0x401cbe20, 0x5bce: 0x401cc020, 0x5bcf: 0x401cc220, - 0x5bd0: 0x401cc420, 0x5bd1: 0x401cc620, 0x5bd2: 0x401cc820, 0x5bd3: 0x401cca20, - 0x5bd4: 0x401ccc20, 0x5bd5: 0x401cce20, 0x5bd6: 0x401cd020, 0x5bd7: 0x401cd220, - 0x5bd8: 0x401cd420, 0x5bd9: 0x401cd620, 0x5bda: 0x401cd820, 0x5bdb: 0x401cda20, - 0x5bdc: 0x401cdc20, 0x5bdd: 0x401cde20, 0x5bde: 0x401ce020, 0x5bdf: 0x401ce220, - 0x5be0: 0x401ce420, 0x5be1: 0x401ce620, 0x5be2: 0x401ce820, 0x5be3: 0x401cea20, - 0x5be4: 0x401cec20, 0x5be5: 0x401cee20, 0x5be6: 0x401cf020, 0x5be7: 0x401cf220, - 0x5be8: 0x401cf420, 0x5be9: 0x401cf620, 0x5bea: 0x401cf820, 0x5beb: 0x401cfa20, - 0x5bec: 0x401cfc20, 0x5bed: 0x401cfe20, 0x5bee: 0x401d0020, 0x5bef: 0x401d0220, - 0x5bf0: 0x401d0420, 0x5bf1: 0x401d0620, 0x5bf2: 0x401d0820, 0x5bf3: 0x401d0a20, - 0x5bf4: 0x401d0c20, 0x5bf5: 0x401d0e20, 0x5bf6: 0x401d1020, 0x5bf7: 0x401d1220, - 0x5bf8: 0x401d1420, 0x5bf9: 0x401d1620, 0x5bfa: 0x401d1820, 0x5bfb: 0x401d1a20, - 0x5bfc: 0x401d1c20, 0x5bfd: 0x401d1e20, 0x5bfe: 0x401d2020, 0x5bff: 0x401d2220, - // Block 0x170, offset 0x5c00 - 0x5c00: 0x401d2420, 0x5c01: 0x401d2620, 0x5c02: 0x401d2820, 0x5c03: 0x401d2a20, - 0x5c04: 0x401d2c20, 0x5c05: 0x401d2e20, 0x5c06: 0x401d3020, 0x5c07: 0x401d3220, - 0x5c08: 0x401d3420, 0x5c09: 0x401d3620, 0x5c0a: 0x401d3820, 0x5c0b: 0x401d3a20, - 0x5c0c: 0x401d3c20, 0x5c0d: 0x401d3e20, 0x5c0e: 0x401d4020, 0x5c0f: 0x401d4220, - 0x5c10: 0x401d4420, 0x5c11: 0x401d4620, 0x5c12: 0x401d4820, 0x5c13: 0x401d4a20, - 0x5c14: 0x401d4c20, 0x5c15: 0x401d4e20, 0x5c16: 0x401d5020, 0x5c17: 0x401d5220, - 0x5c18: 0x401d5420, 0x5c19: 0x401d5620, 0x5c1a: 0x401d5820, 0x5c1b: 0x401d5a20, - 0x5c1c: 0x401d5c20, 0x5c1d: 0x401d5e20, 0x5c1e: 0x401d6020, 0x5c1f: 0x401d6220, - 0x5c20: 0x401d6420, 0x5c21: 0x401d6620, 0x5c22: 0x401d6820, 0x5c23: 0x401d6a20, - 0x5c24: 0x401d6c20, 0x5c25: 0x401d6e20, 0x5c26: 0x401d7020, 0x5c27: 0x401d7220, - 0x5c28: 0x401d7420, 0x5c29: 0x401d7620, 0x5c2a: 0x401d7820, 0x5c2b: 0x401d7a20, - 0x5c2c: 0x401d7c20, 0x5c2d: 0x401d7e20, 0x5c2e: 0x401d8020, 0x5c2f: 0x401d8220, - 0x5c30: 0x401d8420, 0x5c31: 0x401d8620, 0x5c32: 0x401d8820, 0x5c33: 0x401d8a20, - 0x5c34: 0x401d8c20, 0x5c35: 0x401d8e20, - // Block 0x171, offset 0x5c40 - 0x5c40: 0x401d9020, 0x5c41: 0x401d9220, 0x5c42: 0x401d9420, 0x5c43: 0x401d9620, - 0x5c44: 0x401d9820, 0x5c45: 0x401d9a20, 0x5c46: 0x401d9c20, 0x5c47: 0x401d9e20, - 0x5c48: 0x401da020, 0x5c49: 0x401da220, 0x5c4a: 0x401da420, 0x5c4b: 0x401da620, - 0x5c4c: 0x401da820, 0x5c4d: 0x401daa20, 0x5c4e: 0x401dac20, 0x5c4f: 0x401dae20, - 0x5c50: 0x401db020, 0x5c51: 0x401db220, 0x5c52: 0x401db420, 0x5c53: 0x401db620, - 0x5c54: 0x401db820, 0x5c55: 0x401dba20, 0x5c56: 0x401dbc20, 0x5c57: 0x401dbe20, - 0x5c58: 0x401dc020, 0x5c59: 0x401dc220, 0x5c5a: 0x401dc420, 0x5c5b: 0x401dc620, - 0x5c5c: 0x401dc820, 0x5c5d: 0x401dca20, 0x5c5e: 0x401dcc20, 0x5c5f: 0x401dce20, - 0x5c60: 0x401dd020, 0x5c61: 0x401dd220, 0x5c62: 0x401dd420, 0x5c63: 0x401dd620, - 0x5c64: 0x401dd820, 0x5c65: 0x401dda20, 0x5c66: 0x401ddc20, - 0x5c69: 0x401e0420, 0x5c6a: 0x401de420, 0x5c6b: 0x401de620, - 0x5c6c: 0x401de820, 0x5c6d: 0x401dea20, 0x5c6e: 0x401dec20, 0x5c6f: 0x401dee20, - 0x5c70: 0x401df020, 0x5c71: 0x401df220, 0x5c72: 0x401df420, 0x5c73: 0x401df620, - 0x5c74: 0x401df820, 0x5c75: 0x401dfa20, 0x5c76: 0x401dfc20, 0x5c77: 0x401dfe20, - 0x5c78: 0x401e0020, 0x5c79: 0x401e0220, 0x5c7a: 0x401e0620, 0x5c7b: 0x401e0820, - 0x5c7c: 0x401e0a20, 0x5c7d: 0x401e0c20, 0x5c7e: 0x401e0e20, 0x5c7f: 0x401e1020, - // Block 0x172, offset 0x5c80 - 0x5c80: 0x401e1220, 0x5c81: 0x401e1420, 0x5c82: 0x401e1620, 0x5c83: 0x401e1820, - 0x5c84: 0x401e1a20, 0x5c85: 0x401e1c20, 0x5c86: 0x401e1e20, 0x5c87: 0x401e2020, - 0x5c88: 0x401e2220, 0x5c89: 0x401e2420, 0x5c8a: 0x401e2620, 0x5c8b: 0x401e2820, - 0x5c8c: 0x401e2a20, 0x5c8d: 0x401e2c20, 0x5c8e: 0x401e2e20, 0x5c8f: 0x401e3020, - 0x5c90: 0x401e3220, 0x5c91: 0x401e3420, 0x5c92: 0x401e3620, 0x5c93: 0x401e3820, - 0x5c94: 0x401e3a20, 0x5c95: 0x401e3c20, 0x5c96: 0x401e3e20, 0x5c97: 0x401e4020, - 0x5c98: 0x401e4220, 0x5c99: 0x401e4420, 0x5c9a: 0x401e4620, 0x5c9b: 0x401e4820, - 0x5c9c: 0x401e4a20, 0x5c9d: 0x401e4c20, 0x5c9e: 0x401e4020, 0x5c9f: 0x401e4220, - 0x5ca0: 0x401e4220, 0x5ca1: 0x401e4220, 0x5ca2: 0x401e4220, 0x5ca3: 0x401e4220, - 0x5ca4: 0x401e4220, 0x5ca5: 0xad800000, 0x5ca6: 0xad800000, 0x5ca7: 0xa0100000, - 0x5ca8: 0xa0100000, 0x5ca9: 0xa0100000, 0x5caa: 0x401e4e20, 0x5cab: 0x401e5020, - 0x5cac: 0x401e5220, 0x5cad: 0xae200000, 0x5cae: 0xad800000, 0x5caf: 0xad800000, - 0x5cb0: 0xad800000, 0x5cb1: 0xad800000, 0x5cb2: 0xad800000, 0x5cb3: 0xa0000000, - 0x5cb4: 0xa0000000, 0x5cb5: 0xa0000000, 0x5cb6: 0xa0000000, 0x5cb7: 0xa0000000, - 0x5cb8: 0xa0000000, 0x5cb9: 0xa0000000, 0x5cba: 0xa0000000, 0x5cbb: 0xadc00000, - 0x5cbc: 0xadc00000, 0x5cbd: 0xadc00000, 0x5cbe: 0xadc00000, 0x5cbf: 0xadc00000, - // Block 0x173, offset 0x5cc0 - 0x5cc0: 0xadc00000, 0x5cc1: 0xadc00000, 0x5cc2: 0xadc00000, 0x5cc3: 0x401e5420, - 0x5cc4: 0x401e5620, 0x5cc5: 0xae600000, 0x5cc6: 0xae600000, 0x5cc7: 0xae600000, - 0x5cc8: 0xae600000, 0x5cc9: 0xae600000, 0x5cca: 0xadc00000, 0x5ccb: 0xadc00000, - 0x5ccc: 0x401e5820, 0x5ccd: 0x401e5a20, 0x5cce: 0x401e5c20, 0x5ccf: 0x401e5e20, - 0x5cd0: 0x401e6020, 0x5cd1: 0x401e6220, 0x5cd2: 0x401e6420, 0x5cd3: 0x401e6620, - 0x5cd4: 0x401e6820, 0x5cd5: 0x401e6a20, 0x5cd6: 0x401e6c20, 0x5cd7: 0x401e6e20, - 0x5cd8: 0x401e7020, 0x5cd9: 0x401e7220, 0x5cda: 0x401e7420, 0x5cdb: 0x401e7620, - 0x5cdc: 0x401e7820, 0x5cdd: 0x401e7a20, 0x5cde: 0x401e7c20, 0x5cdf: 0x401e7e20, - 0x5ce0: 0x401e8020, 0x5ce1: 0x401e8220, 0x5ce2: 0x401e8420, 0x5ce3: 0x401e8620, - 0x5ce4: 0x401e8820, 0x5ce5: 0x401e8a20, 0x5ce6: 0x401e8c20, 0x5ce7: 0x401e8e20, - 0x5ce8: 0x401e9020, 0x5ce9: 0x401e9220, 0x5cea: 0xae600000, 0x5ceb: 0xae600000, - 0x5cec: 0xae600000, 0x5ced: 0xae600000, 0x5cee: 0x401e9420, 0x5cef: 0x401e9620, - 0x5cf0: 0x401e9820, 0x5cf1: 0x401e9a20, 0x5cf2: 0x401e9c20, 0x5cf3: 0x401e9e20, - 0x5cf4: 0x401ea020, 0x5cf5: 0x401ea220, 0x5cf6: 0x401ea420, 0x5cf7: 0x401ea620, - 0x5cf8: 0x401ea820, 0x5cf9: 0x401eaa20, 0x5cfa: 0x401eac20, 0x5cfb: 0x401eaa20, - 0x5cfc: 0x401eac20, 0x5cfd: 0x401eaa20, 0x5cfe: 0x401eac20, 0x5cff: 0x401eaa20, - // Block 0x174, offset 0x5d00 - 0x5d00: 0x401eac20, 0x5d01: 0x401eae20, 0x5d02: 0x401eb020, 0x5d03: 0x401eb220, - 0x5d04: 0x401eb420, 0x5d05: 0x401eb620, 0x5d06: 0x401eb820, 0x5d07: 0x401eba20, - 0x5d08: 0x401ebc20, 0x5d09: 0x401ebe20, 0x5d0a: 0x401ec020, 0x5d0b: 0x401ec220, - 0x5d0c: 0x401ec420, 0x5d0d: 0x401ec620, 0x5d0e: 0x401ec820, 0x5d0f: 0x401eca20, - 0x5d10: 0x401ecc20, 0x5d11: 0x401ece20, 0x5d12: 0x401ed020, 0x5d13: 0x401ed220, - 0x5d14: 0x401ed420, 0x5d15: 0x401ed620, 0x5d16: 0x401ed820, 0x5d17: 0x401eda20, - 0x5d18: 0x401edc20, 0x5d19: 0x401ede20, 0x5d1a: 0x401ee020, 0x5d1b: 0x401ee220, - 0x5d1c: 0x401ee420, 0x5d1d: 0x401ee620, - // Block 0x175, offset 0x5d40 - 0x5d40: 0x401ee820, 0x5d41: 0x401eea20, 0x5d42: 0x401eec20, 0x5d43: 0x401eee20, - 0x5d44: 0x401ef020, 0x5d45: 0x401ef220, 0x5d46: 0x401ef420, 0x5d47: 0x401ef620, - 0x5d48: 0x401ef820, 0x5d49: 0x401efa20, 0x5d4a: 0x401efc20, 0x5d4b: 0x401efe20, - 0x5d4c: 0x401f0020, 0x5d4d: 0x401f0220, 0x5d4e: 0x401f0420, 0x5d4f: 0x401f0620, - 0x5d50: 0x401f0820, 0x5d51: 0x401f0a20, 0x5d52: 0x401f0c20, 0x5d53: 0x401f0e20, - 0x5d54: 0x401f1020, 0x5d55: 0x401f1220, 0x5d56: 0x401f1420, 0x5d57: 0x401f1620, - 0x5d58: 0x401f1820, 0x5d59: 0x401f1a20, 0x5d5a: 0x401f1c20, 0x5d5b: 0x401f1e20, - 0x5d5c: 0x401f2020, 0x5d5d: 0x401f2220, 0x5d5e: 0x401f2420, 0x5d5f: 0x401f2620, - 0x5d60: 0x401f2820, 0x5d61: 0x401f2a20, 0x5d62: 0x401f2c20, 0x5d63: 0x401f2e20, - 0x5d64: 0x401f3020, 0x5d65: 0x401f3220, 0x5d66: 0x401f3420, 0x5d67: 0x401f3620, - 0x5d68: 0x401f3820, 0x5d69: 0x401f3a20, 0x5d6a: 0x401f3c20, 0x5d6b: 0x401f3e20, - 0x5d6c: 0x401f4020, 0x5d6d: 0x401f4220, 0x5d6e: 0x401f4420, 0x5d6f: 0x401f4620, - 0x5d70: 0x401f4820, 0x5d71: 0x401f4a20, 0x5d72: 0x401f4c20, 0x5d73: 0x401f4e20, - 0x5d74: 0x401f5020, 0x5d75: 0x401f5220, 0x5d76: 0x401f5420, 0x5d77: 0x401f5620, - 0x5d78: 0x401f5820, 0x5d79: 0x401f5a20, 0x5d7a: 0x401f5c20, 0x5d7b: 0x401f5e20, - 0x5d7c: 0x401f6020, 0x5d7d: 0x401f6220, 0x5d7e: 0x401f6420, 0x5d7f: 0x401f6620, - // Block 0x176, offset 0x5d80 - 0x5d80: 0x401f6820, 0x5d81: 0x401f6a20, 0x5d82: 0xae600000, 0x5d83: 0xae600000, - 0x5d84: 0xae600000, 0x5d85: 0x401f6c20, - // Block 0x177, offset 0x5dc0 - 0x5dc0: 0x4019e220, 0x5dc1: 0x4019e420, 0x5dc2: 0x4019e620, 0x5dc3: 0x4019e820, - 0x5dc4: 0x4019ea20, 0x5dc5: 0x4019ec20, 0x5dc6: 0x4019ee20, 0x5dc7: 0x4019f020, - 0x5dc8: 0x4019f220, 0x5dc9: 0x4019f420, 0x5dca: 0x4019f620, 0x5dcb: 0x4019f820, - 0x5dcc: 0x4019fa20, 0x5dcd: 0x4019fc20, 0x5dce: 0x4019fe20, 0x5dcf: 0x401a0020, - 0x5dd0: 0x401a0220, 0x5dd1: 0x401a0420, 0x5dd2: 0x401a0620, 0x5dd3: 0x401a0820, - 0x5dd4: 0x401a0a20, 0x5dd5: 0x401a0c20, 0x5dd6: 0x401a0e20, 0x5dd7: 0x401a1020, - 0x5dd8: 0x401a1220, 0x5dd9: 0x401a1420, 0x5dda: 0x401a1620, 0x5ddb: 0x401a1820, - 0x5ddc: 0x401a1a20, 0x5ddd: 0x401a1c20, 0x5dde: 0x401a1e20, 0x5ddf: 0x401a2020, - 0x5de0: 0x401a2220, 0x5de1: 0x401a2420, 0x5de2: 0x401a2620, 0x5de3: 0x401a2820, - 0x5de4: 0x401a2a20, 0x5de5: 0x401a2c20, 0x5de6: 0x401a2e20, 0x5de7: 0x401a3020, - 0x5de8: 0x401a3220, 0x5de9: 0x401a3420, 0x5dea: 0x401a3620, 0x5deb: 0x401a3820, - 0x5dec: 0x401a3a20, 0x5ded: 0x401a3c20, 0x5dee: 0x401a3e20, 0x5def: 0x401a4020, - 0x5df0: 0x401a4220, 0x5df1: 0x401a4420, 0x5df2: 0x401a4620, 0x5df3: 0x401a4820, - 0x5df4: 0x401a4a20, 0x5df5: 0x401a4c20, 0x5df6: 0x401a4e20, 0x5df7: 0x401a5020, - 0x5df8: 0x401a5220, 0x5df9: 0x401a5420, 0x5dfa: 0x401a5620, 0x5dfb: 0x401a5820, - 0x5dfc: 0x401a5a20, 0x5dfd: 0x401a5c20, 0x5dfe: 0x401a5e20, 0x5dff: 0x401a6020, - // Block 0x178, offset 0x5e00 - 0x5e00: 0x401a6220, 0x5e01: 0x401a6420, 0x5e02: 0x401a6620, 0x5e03: 0x401a6820, - 0x5e04: 0x401a6a20, 0x5e05: 0x401a6c20, 0x5e06: 0x401a6e20, 0x5e07: 0x401a7020, - 0x5e08: 0x401a7220, 0x5e09: 0x401a7420, 0x5e0a: 0x401a7620, 0x5e0b: 0x401a7820, - 0x5e0c: 0x401a7a20, 0x5e0d: 0x401a7c20, 0x5e0e: 0x401a7e20, 0x5e0f: 0x401a8020, - 0x5e10: 0x401a8220, 0x5e11: 0x401a8420, 0x5e12: 0x401a8620, 0x5e13: 0x401a8820, - 0x5e14: 0x401a8a20, 0x5e15: 0x401a8c20, 0x5e16: 0x401a8e20, - 0x5e20: 0xe00002af, 0x5e21: 0xe00003ca, 0x5e22: 0xe00004a4, 0x5e23: 0xe0000576, - 0x5e24: 0xe000063d, 0x5e25: 0xe00006ed, 0x5e26: 0xe0000795, 0x5e27: 0xe000083e, - 0x5e28: 0xe00008e9, 0x5e29: 0x4029ba20, 0x5e2a: 0x4029bc20, 0x5e2b: 0x4029be20, - 0x5e2c: 0x4029c020, 0x5e2d: 0x4029c220, 0x5e2e: 0x4029c420, 0x5e2f: 0x4029c620, - 0x5e30: 0x4029c820, 0x5e31: 0x4029ca20, - // Block 0x179, offset 0x5e40 - 0x5e40: 0x002bde8b, 0x5e41: 0x002c0a8b, 0x5e42: 0x002c3a8b, 0x5e43: 0x002c628b, - 0x5e44: 0x002c988b, 0x5e45: 0x002d088b, 0x5e46: 0x002d228b, 0x5e47: 0x002d688b, - 0x5e48: 0x002d9a8b, 0x5e49: 0x002dcc8b, 0x5e4a: 0x002dfe8b, 0x5e4b: 0x002e228b, - 0x5e4c: 0x002e828b, 0x5e4d: 0x002e9e8b, 0x5e4e: 0x002ee28b, 0x5e4f: 0x002f2c8b, - 0x5e50: 0x002f568b, 0x5e51: 0x002f7a8b, 0x5e52: 0x002fe68b, 0x5e53: 0x00302c8b, - 0x5e54: 0x00306c8b, 0x5e55: 0x0030be8b, 0x5e56: 0x0030e28b, 0x5e57: 0x0030f68b, - 0x5e58: 0x0031008b, 0x5e59: 0x00312a8b, 0x5e5a: 0x002bde85, 0x5e5b: 0x002c0a85, - 0x5e5c: 0x002c3a85, 0x5e5d: 0x002c6285, 0x5e5e: 0x002c9885, 0x5e5f: 0x002d0885, - 0x5e60: 0x002d2285, 0x5e61: 0x002d6885, 0x5e62: 0x002d9a85, 0x5e63: 0x002dcc85, - 0x5e64: 0x002dfe85, 0x5e65: 0x002e2285, 0x5e66: 0x002e8285, 0x5e67: 0x002e9e85, - 0x5e68: 0x002ee285, 0x5e69: 0x002f2c85, 0x5e6a: 0x002f5685, 0x5e6b: 0x002f7a85, - 0x5e6c: 0x002fe685, 0x5e6d: 0x00302c85, 0x5e6e: 0x00306c85, 0x5e6f: 0x0030be85, - 0x5e70: 0x0030e285, 0x5e71: 0x0030f685, 0x5e72: 0x00310085, 0x5e73: 0x00312a85, - 0x5e74: 0x002bde8b, 0x5e75: 0x002c0a8b, 0x5e76: 0x002c3a8b, 0x5e77: 0x002c628b, - 0x5e78: 0x002c988b, 0x5e79: 0x002d088b, 0x5e7a: 0x002d228b, 0x5e7b: 0x002d688b, - 0x5e7c: 0x002d9a8b, 0x5e7d: 0x002dcc8b, 0x5e7e: 0x002dfe8b, 0x5e7f: 0x002e228b, - // Block 0x17a, offset 0x5e80 - 0x5e80: 0x002e828b, 0x5e81: 0x002e9e8b, 0x5e82: 0x002ee28b, 0x5e83: 0x002f2c8b, - 0x5e84: 0x002f568b, 0x5e85: 0x002f7a8b, 0x5e86: 0x002fe68b, 0x5e87: 0x00302c8b, - 0x5e88: 0x00306c8b, 0x5e89: 0x0030be8b, 0x5e8a: 0x0030e28b, 0x5e8b: 0x0030f68b, - 0x5e8c: 0x0031008b, 0x5e8d: 0x00312a8b, 0x5e8e: 0x002bde85, 0x5e8f: 0x002c0a85, - 0x5e90: 0x002c3a85, 0x5e91: 0x002c6285, 0x5e92: 0x002c9885, 0x5e93: 0x002d0885, - 0x5e94: 0x002d2285, 0x5e96: 0x002d9a85, 0x5e97: 0x002dcc85, - 0x5e98: 0x002dfe85, 0x5e99: 0x002e2285, 0x5e9a: 0x002e8285, 0x5e9b: 0x002e9e85, - 0x5e9c: 0x002ee285, 0x5e9d: 0x002f2c85, 0x5e9e: 0x002f5685, 0x5e9f: 0x002f7a85, - 0x5ea0: 0x002fe685, 0x5ea1: 0x00302c85, 0x5ea2: 0x00306c85, 0x5ea3: 0x0030be85, - 0x5ea4: 0x0030e285, 0x5ea5: 0x0030f685, 0x5ea6: 0x00310085, 0x5ea7: 0x00312a85, - 0x5ea8: 0x002bde8b, 0x5ea9: 0x002c0a8b, 0x5eaa: 0x002c3a8b, 0x5eab: 0x002c628b, - 0x5eac: 0x002c988b, 0x5ead: 0x002d088b, 0x5eae: 0x002d228b, 0x5eaf: 0x002d688b, - 0x5eb0: 0x002d9a8b, 0x5eb1: 0x002dcc8b, 0x5eb2: 0x002dfe8b, 0x5eb3: 0x002e228b, - 0x5eb4: 0x002e828b, 0x5eb5: 0x002e9e8b, 0x5eb6: 0x002ee28b, 0x5eb7: 0x002f2c8b, - 0x5eb8: 0x002f568b, 0x5eb9: 0x002f7a8b, 0x5eba: 0x002fe68b, 0x5ebb: 0x00302c8b, - 0x5ebc: 0x00306c8b, 0x5ebd: 0x0030be8b, 0x5ebe: 0x0030e28b, 0x5ebf: 0x0030f68b, - // Block 0x17b, offset 0x5ec0 - 0x5ec0: 0x0031008b, 0x5ec1: 0x00312a8b, 0x5ec2: 0x002bde85, 0x5ec3: 0x002c0a85, - 0x5ec4: 0x002c3a85, 0x5ec5: 0x002c6285, 0x5ec6: 0x002c9885, 0x5ec7: 0x002d0885, - 0x5ec8: 0x002d2285, 0x5ec9: 0x002d6885, 0x5eca: 0x002d9a85, 0x5ecb: 0x002dcc85, - 0x5ecc: 0x002dfe85, 0x5ecd: 0x002e2285, 0x5ece: 0x002e8285, 0x5ecf: 0x002e9e85, - 0x5ed0: 0x002ee285, 0x5ed1: 0x002f2c85, 0x5ed2: 0x002f5685, 0x5ed3: 0x002f7a85, - 0x5ed4: 0x002fe685, 0x5ed5: 0x00302c85, 0x5ed6: 0x00306c85, 0x5ed7: 0x0030be85, - 0x5ed8: 0x0030e285, 0x5ed9: 0x0030f685, 0x5eda: 0x00310085, 0x5edb: 0x00312a85, - 0x5edc: 0x002bde8b, 0x5ede: 0x002c3a8b, 0x5edf: 0x002c628b, - 0x5ee2: 0x002d228b, - 0x5ee5: 0x002dcc8b, 0x5ee6: 0x002dfe8b, - 0x5ee9: 0x002e9e8b, 0x5eea: 0x002ee28b, 0x5eeb: 0x002f2c8b, - 0x5eec: 0x002f568b, 0x5eee: 0x002fe68b, 0x5eef: 0x00302c8b, - 0x5ef0: 0x00306c8b, 0x5ef1: 0x0030be8b, 0x5ef2: 0x0030e28b, 0x5ef3: 0x0030f68b, - 0x5ef4: 0x0031008b, 0x5ef5: 0x00312a8b, 0x5ef6: 0x002bde85, 0x5ef7: 0x002c0a85, - 0x5ef8: 0x002c3a85, 0x5ef9: 0x002c6285, 0x5efb: 0x002d0885, - 0x5efd: 0x002d6885, 0x5efe: 0x002d9a85, 0x5eff: 0x002dcc85, - // Block 0x17c, offset 0x5f00 - 0x5f00: 0x002dfe85, 0x5f01: 0x002e2285, 0x5f02: 0x002e8285, 0x5f03: 0x002e9e85, - 0x5f05: 0x002f2c85, 0x5f06: 0x002f5685, 0x5f07: 0x002f7a85, - 0x5f08: 0x002fe685, 0x5f09: 0x00302c85, 0x5f0a: 0x00306c85, 0x5f0b: 0x0030be85, - 0x5f0c: 0x0030e285, 0x5f0d: 0x0030f685, 0x5f0e: 0x00310085, 0x5f0f: 0x00312a85, - 0x5f10: 0x002bde8b, 0x5f11: 0x002c0a8b, 0x5f12: 0x002c3a8b, 0x5f13: 0x002c628b, - 0x5f14: 0x002c988b, 0x5f15: 0x002d088b, 0x5f16: 0x002d228b, 0x5f17: 0x002d688b, - 0x5f18: 0x002d9a8b, 0x5f19: 0x002dcc8b, 0x5f1a: 0x002dfe8b, 0x5f1b: 0x002e228b, - 0x5f1c: 0x002e828b, 0x5f1d: 0x002e9e8b, 0x5f1e: 0x002ee28b, 0x5f1f: 0x002f2c8b, - 0x5f20: 0x002f568b, 0x5f21: 0x002f7a8b, 0x5f22: 0x002fe68b, 0x5f23: 0x00302c8b, - 0x5f24: 0x00306c8b, 0x5f25: 0x0030be8b, 0x5f26: 0x0030e28b, 0x5f27: 0x0030f68b, - 0x5f28: 0x0031008b, 0x5f29: 0x00312a8b, 0x5f2a: 0x002bde85, 0x5f2b: 0x002c0a85, - 0x5f2c: 0x002c3a85, 0x5f2d: 0x002c6285, 0x5f2e: 0x002c9885, 0x5f2f: 0x002d0885, - 0x5f30: 0x002d2285, 0x5f31: 0x002d6885, 0x5f32: 0x002d9a85, 0x5f33: 0x002dcc85, - 0x5f34: 0x002dfe85, 0x5f35: 0x002e2285, 0x5f36: 0x002e8285, 0x5f37: 0x002e9e85, - 0x5f38: 0x002ee285, 0x5f39: 0x002f2c85, 0x5f3a: 0x002f5685, 0x5f3b: 0x002f7a85, - 0x5f3c: 0x002fe685, 0x5f3d: 0x00302c85, 0x5f3e: 0x00306c85, 0x5f3f: 0x0030be85, - // Block 0x17d, offset 0x5f40 - 0x5f40: 0x0030e285, 0x5f41: 0x0030f685, 0x5f42: 0x00310085, 0x5f43: 0x00312a85, - 0x5f44: 0x002bde8b, 0x5f45: 0x002c0a8b, 0x5f47: 0x002c628b, - 0x5f48: 0x002c988b, 0x5f49: 0x002d088b, 0x5f4a: 0x002d228b, - 0x5f4d: 0x002dcc8b, 0x5f4e: 0x002dfe8b, 0x5f4f: 0x002e228b, - 0x5f50: 0x002e828b, 0x5f51: 0x002e9e8b, 0x5f52: 0x002ee28b, 0x5f53: 0x002f2c8b, - 0x5f54: 0x002f568b, 0x5f56: 0x002fe68b, 0x5f57: 0x00302c8b, - 0x5f58: 0x00306c8b, 0x5f59: 0x0030be8b, 0x5f5a: 0x0030e28b, 0x5f5b: 0x0030f68b, - 0x5f5c: 0x0031008b, 0x5f5e: 0x002bde85, 0x5f5f: 0x002c0a85, - 0x5f60: 0x002c3a85, 0x5f61: 0x002c6285, 0x5f62: 0x002c9885, 0x5f63: 0x002d0885, - 0x5f64: 0x002d2285, 0x5f65: 0x002d6885, 0x5f66: 0x002d9a85, 0x5f67: 0x002dcc85, - 0x5f68: 0x002dfe85, 0x5f69: 0x002e2285, 0x5f6a: 0x002e8285, 0x5f6b: 0x002e9e85, - 0x5f6c: 0x002ee285, 0x5f6d: 0x002f2c85, 0x5f6e: 0x002f5685, 0x5f6f: 0x002f7a85, - 0x5f70: 0x002fe685, 0x5f71: 0x00302c85, 0x5f72: 0x00306c85, 0x5f73: 0x0030be85, - 0x5f74: 0x0030e285, 0x5f75: 0x0030f685, 0x5f76: 0x00310085, 0x5f77: 0x00312a85, - 0x5f78: 0x002bde8b, 0x5f79: 0x002c0a8b, 0x5f7b: 0x002c628b, - 0x5f7c: 0x002c988b, 0x5f7d: 0x002d088b, 0x5f7e: 0x002d228b, - // Block 0x17e, offset 0x5f80 - 0x5f80: 0x002d9a8b, 0x5f81: 0x002dcc8b, 0x5f82: 0x002dfe8b, 0x5f83: 0x002e228b, - 0x5f84: 0x002e828b, 0x5f86: 0x002ee28b, - 0x5f8a: 0x002fe68b, 0x5f8b: 0x00302c8b, - 0x5f8c: 0x00306c8b, 0x5f8d: 0x0030be8b, 0x5f8e: 0x0030e28b, 0x5f8f: 0x0030f68b, - 0x5f90: 0x0031008b, 0x5f92: 0x002bde85, 0x5f93: 0x002c0a85, - 0x5f94: 0x002c3a85, 0x5f95: 0x002c6285, 0x5f96: 0x002c9885, 0x5f97: 0x002d0885, - 0x5f98: 0x002d2285, 0x5f99: 0x002d6885, 0x5f9a: 0x002d9a85, 0x5f9b: 0x002dcc85, - 0x5f9c: 0x002dfe85, 0x5f9d: 0x002e2285, 0x5f9e: 0x002e8285, 0x5f9f: 0x002e9e85, - 0x5fa0: 0x002ee285, 0x5fa1: 0x002f2c85, 0x5fa2: 0x002f5685, 0x5fa3: 0x002f7a85, - 0x5fa4: 0x002fe685, 0x5fa5: 0x00302c85, 0x5fa6: 0x00306c85, 0x5fa7: 0x0030be85, - 0x5fa8: 0x0030e285, 0x5fa9: 0x0030f685, 0x5faa: 0x00310085, 0x5fab: 0x00312a85, - 0x5fac: 0x002bde8b, 0x5fad: 0x002c0a8b, 0x5fae: 0x002c3a8b, 0x5faf: 0x002c628b, - 0x5fb0: 0x002c988b, 0x5fb1: 0x002d088b, 0x5fb2: 0x002d228b, 0x5fb3: 0x002d688b, - 0x5fb4: 0x002d9a8b, 0x5fb5: 0x002dcc8b, 0x5fb6: 0x002dfe8b, 0x5fb7: 0x002e228b, - 0x5fb8: 0x002e828b, 0x5fb9: 0x002e9e8b, 0x5fba: 0x002ee28b, 0x5fbb: 0x002f2c8b, - 0x5fbc: 0x002f568b, 0x5fbd: 0x002f7a8b, 0x5fbe: 0x002fe68b, 0x5fbf: 0x00302c8b, - // Block 0x17f, offset 0x5fc0 - 0x5fc0: 0x00306c8b, 0x5fc1: 0x0030be8b, 0x5fc2: 0x0030e28b, 0x5fc3: 0x0030f68b, - 0x5fc4: 0x0031008b, 0x5fc5: 0x00312a8b, 0x5fc6: 0x002bde85, 0x5fc7: 0x002c0a85, - 0x5fc8: 0x002c3a85, 0x5fc9: 0x002c6285, 0x5fca: 0x002c9885, 0x5fcb: 0x002d0885, - 0x5fcc: 0x002d2285, 0x5fcd: 0x002d6885, 0x5fce: 0x002d9a85, 0x5fcf: 0x002dcc85, - 0x5fd0: 0x002dfe85, 0x5fd1: 0x002e2285, 0x5fd2: 0x002e8285, 0x5fd3: 0x002e9e85, - 0x5fd4: 0x002ee285, 0x5fd5: 0x002f2c85, 0x5fd6: 0x002f5685, 0x5fd7: 0x002f7a85, - 0x5fd8: 0x002fe685, 0x5fd9: 0x00302c85, 0x5fda: 0x00306c85, 0x5fdb: 0x0030be85, - 0x5fdc: 0x0030e285, 0x5fdd: 0x0030f685, 0x5fde: 0x00310085, 0x5fdf: 0x00312a85, - 0x5fe0: 0x002bde8b, 0x5fe1: 0x002c0a8b, 0x5fe2: 0x002c3a8b, 0x5fe3: 0x002c628b, - 0x5fe4: 0x002c988b, 0x5fe5: 0x002d088b, 0x5fe6: 0x002d228b, 0x5fe7: 0x002d688b, - 0x5fe8: 0x002d9a8b, 0x5fe9: 0x002dcc8b, 0x5fea: 0x002dfe8b, 0x5feb: 0x002e228b, - 0x5fec: 0x002e828b, 0x5fed: 0x002e9e8b, 0x5fee: 0x002ee28b, 0x5fef: 0x002f2c8b, - 0x5ff0: 0x002f568b, 0x5ff1: 0x002f7a8b, 0x5ff2: 0x002fe68b, 0x5ff3: 0x00302c8b, - 0x5ff4: 0x00306c8b, 0x5ff5: 0x0030be8b, 0x5ff6: 0x0030e28b, 0x5ff7: 0x0030f68b, - 0x5ff8: 0x0031008b, 0x5ff9: 0x00312a8b, 0x5ffa: 0x002bde85, 0x5ffb: 0x002c0a85, - 0x5ffc: 0x002c3a85, 0x5ffd: 0x002c6285, 0x5ffe: 0x002c9885, 0x5fff: 0x002d0885, - // Block 0x180, offset 0x6000 - 0x6000: 0x002d2285, 0x6001: 0x002d6885, 0x6002: 0x002d9a85, 0x6003: 0x002dcc85, - 0x6004: 0x002dfe85, 0x6005: 0x002e2285, 0x6006: 0x002e8285, 0x6007: 0x002e9e85, - 0x6008: 0x002ee285, 0x6009: 0x002f2c85, 0x600a: 0x002f5685, 0x600b: 0x002f7a85, - 0x600c: 0x002fe685, 0x600d: 0x00302c85, 0x600e: 0x00306c85, 0x600f: 0x0030be85, - 0x6010: 0x0030e285, 0x6011: 0x0030f685, 0x6012: 0x00310085, 0x6013: 0x00312a85, - 0x6014: 0x002bde8b, 0x6015: 0x002c0a8b, 0x6016: 0x002c3a8b, 0x6017: 0x002c628b, - 0x6018: 0x002c988b, 0x6019: 0x002d088b, 0x601a: 0x002d228b, 0x601b: 0x002d688b, - 0x601c: 0x002d9a8b, 0x601d: 0x002dcc8b, 0x601e: 0x002dfe8b, 0x601f: 0x002e228b, - 0x6020: 0x002e828b, 0x6021: 0x002e9e8b, 0x6022: 0x002ee28b, 0x6023: 0x002f2c8b, - 0x6024: 0x002f568b, 0x6025: 0x002f7a8b, 0x6026: 0x002fe68b, 0x6027: 0x00302c8b, - 0x6028: 0x00306c8b, 0x6029: 0x0030be8b, 0x602a: 0x0030e28b, 0x602b: 0x0030f68b, - 0x602c: 0x0031008b, 0x602d: 0x00312a8b, 0x602e: 0x002bde85, 0x602f: 0x002c0a85, - 0x6030: 0x002c3a85, 0x6031: 0x002c6285, 0x6032: 0x002c9885, 0x6033: 0x002d0885, - 0x6034: 0x002d2285, 0x6035: 0x002d6885, 0x6036: 0x002d9a85, 0x6037: 0x002dcc85, - 0x6038: 0x002dfe85, 0x6039: 0x002e2285, 0x603a: 0x002e8285, 0x603b: 0x002e9e85, - 0x603c: 0x002ee285, 0x603d: 0x002f2c85, 0x603e: 0x002f5685, 0x603f: 0x002f7a85, - // Block 0x181, offset 0x6040 - 0x6040: 0x002fe685, 0x6041: 0x00302c85, 0x6042: 0x00306c85, 0x6043: 0x0030be85, - 0x6044: 0x0030e285, 0x6045: 0x0030f685, 0x6046: 0x00310085, 0x6047: 0x00312a85, - 0x6048: 0x002bde8b, 0x6049: 0x002c0a8b, 0x604a: 0x002c3a8b, 0x604b: 0x002c628b, - 0x604c: 0x002c988b, 0x604d: 0x002d088b, 0x604e: 0x002d228b, 0x604f: 0x002d688b, - 0x6050: 0x002d9a8b, 0x6051: 0x002dcc8b, 0x6052: 0x002dfe8b, 0x6053: 0x002e228b, - 0x6054: 0x002e828b, 0x6055: 0x002e9e8b, 0x6056: 0x002ee28b, 0x6057: 0x002f2c8b, - 0x6058: 0x002f568b, 0x6059: 0x002f7a8b, 0x605a: 0x002fe68b, 0x605b: 0x00302c8b, - 0x605c: 0x00306c8b, 0x605d: 0x0030be8b, 0x605e: 0x0030e28b, 0x605f: 0x0030f68b, - 0x6060: 0x0031008b, 0x6061: 0x00312a8b, 0x6062: 0x002bde85, 0x6063: 0x002c0a85, - 0x6064: 0x002c3a85, 0x6065: 0x002c6285, 0x6066: 0x002c9885, 0x6067: 0x002d0885, - 0x6068: 0x002d2285, 0x6069: 0x002d6885, 0x606a: 0x002d9a85, 0x606b: 0x002dcc85, - 0x606c: 0x002dfe85, 0x606d: 0x002e2285, 0x606e: 0x002e8285, 0x606f: 0x002e9e85, - 0x6070: 0x002ee285, 0x6071: 0x002f2c85, 0x6072: 0x002f5685, 0x6073: 0x002f7a85, - 0x6074: 0x002fe685, 0x6075: 0x00302c85, 0x6076: 0x00306c85, 0x6077: 0x0030be85, - 0x6078: 0x0030e285, 0x6079: 0x0030f685, 0x607a: 0x00310085, 0x607b: 0x00312a85, - 0x607c: 0x002bde8b, 0x607d: 0x002c0a8b, 0x607e: 0x002c3a8b, 0x607f: 0x002c628b, - // Block 0x182, offset 0x6080 - 0x6080: 0x002c988b, 0x6081: 0x002d088b, 0x6082: 0x002d228b, 0x6083: 0x002d688b, - 0x6084: 0x002d9a8b, 0x6085: 0x002dcc8b, 0x6086: 0x002dfe8b, 0x6087: 0x002e228b, - 0x6088: 0x002e828b, 0x6089: 0x002e9e8b, 0x608a: 0x002ee28b, 0x608b: 0x002f2c8b, - 0x608c: 0x002f568b, 0x608d: 0x002f7a8b, 0x608e: 0x002fe68b, 0x608f: 0x00302c8b, - 0x6090: 0x00306c8b, 0x6091: 0x0030be8b, 0x6092: 0x0030e28b, 0x6093: 0x0030f68b, - 0x6094: 0x0031008b, 0x6095: 0x00312a8b, 0x6096: 0x002bde85, 0x6097: 0x002c0a85, - 0x6098: 0x002c3a85, 0x6099: 0x002c6285, 0x609a: 0x002c9885, 0x609b: 0x002d0885, - 0x609c: 0x002d2285, 0x609d: 0x002d6885, 0x609e: 0x002d9a85, 0x609f: 0x002dcc85, - 0x60a0: 0x002dfe85, 0x60a1: 0x002e2285, 0x60a2: 0x002e8285, 0x60a3: 0x002e9e85, - 0x60a4: 0x002ee285, 0x60a5: 0x002f2c85, 0x60a6: 0x002f5685, 0x60a7: 0x002f7a85, - 0x60a8: 0x002fe685, 0x60a9: 0x00302c85, 0x60aa: 0x00306c85, 0x60ab: 0x0030be85, - 0x60ac: 0x0030e285, 0x60ad: 0x0030f685, 0x60ae: 0x00310085, 0x60af: 0x00312a85, - 0x60b0: 0x002bde8b, 0x60b1: 0x002c0a8b, 0x60b2: 0x002c3a8b, 0x60b3: 0x002c628b, - 0x60b4: 0x002c988b, 0x60b5: 0x002d088b, 0x60b6: 0x002d228b, 0x60b7: 0x002d688b, - 0x60b8: 0x002d9a8b, 0x60b9: 0x002dcc8b, 0x60ba: 0x002dfe8b, 0x60bb: 0x002e228b, - 0x60bc: 0x002e828b, 0x60bd: 0x002e9e8b, 0x60be: 0x002ee28b, 0x60bf: 0x002f2c8b, - // Block 0x183, offset 0x60c0 - 0x60c0: 0x002f568b, 0x60c1: 0x002f7a8b, 0x60c2: 0x002fe68b, 0x60c3: 0x00302c8b, - 0x60c4: 0x00306c8b, 0x60c5: 0x0030be8b, 0x60c6: 0x0030e28b, 0x60c7: 0x0030f68b, - 0x60c8: 0x0031008b, 0x60c9: 0x00312a8b, 0x60ca: 0x002bde85, 0x60cb: 0x002c0a85, - 0x60cc: 0x002c3a85, 0x60cd: 0x002c6285, 0x60ce: 0x002c9885, 0x60cf: 0x002d0885, - 0x60d0: 0x002d2285, 0x60d1: 0x002d6885, 0x60d2: 0x002d9a85, 0x60d3: 0x002dcc85, - 0x60d4: 0x002dfe85, 0x60d5: 0x002e2285, 0x60d6: 0x002e8285, 0x60d7: 0x002e9e85, - 0x60d8: 0x002ee285, 0x60d9: 0x002f2c85, 0x60da: 0x002f5685, 0x60db: 0x002f7a85, - 0x60dc: 0x002fe685, 0x60dd: 0x00302c85, 0x60de: 0x00306c85, 0x60df: 0x0030be85, - 0x60e0: 0x0030e285, 0x60e1: 0x0030f685, 0x60e2: 0x00310085, 0x60e3: 0x00312a85, - 0x60e4: 0x002da285, 0x60e5: 0x002dd485, - 0x60e8: 0x0032528b, 0x60e9: 0x0032548b, 0x60ea: 0x0032568b, 0x60eb: 0x00325a8b, - 0x60ec: 0x00325c8b, 0x60ed: 0x0032648b, 0x60ee: 0x0032688b, 0x60ef: 0x00326a8b, - 0x60f0: 0x00326c8b, 0x60f1: 0x0032708b, 0x60f2: 0x0032728b, 0x60f3: 0x0032768b, - 0x60f4: 0x0032788b, 0x60f5: 0x00327a8b, 0x60f6: 0x00327c8b, 0x60f7: 0x00327e8b, - 0x60f8: 0x0032888b, 0x60f9: 0x00326a8b, 0x60fa: 0x00328e8b, 0x60fb: 0x0032968b, - 0x60fc: 0x0032988b, 0x60fd: 0x00329a8b, 0x60fe: 0x00329c8b, 0x60ff: 0x00329e8b, - // Block 0x184, offset 0x6100 - 0x6100: 0x0032a28b, 0x6101: 0x00092485, 0x6102: 0x00325285, 0x6103: 0x00325485, - 0x6104: 0x00325685, 0x6105: 0x00325a85, 0x6106: 0x00325c85, 0x6107: 0x00326485, - 0x6108: 0x00326885, 0x6109: 0x00326a85, 0x610a: 0x00326c85, 0x610b: 0x00327085, - 0x610c: 0x00327285, 0x610d: 0x00327685, 0x610e: 0x00327885, 0x610f: 0x00327a85, - 0x6110: 0x00327c85, 0x6111: 0x00327e85, 0x6112: 0x00328885, 0x6113: 0x00328e85, - 0x6114: 0x00328e85, 0x6115: 0x00329685, 0x6116: 0x00329885, 0x6117: 0x00329a85, - 0x6118: 0x00329c85, 0x6119: 0x00329e85, 0x611a: 0x0032a285, 0x611b: 0x00091c85, - 0x611c: 0x00325c85, 0x611d: 0x00326a85, 0x611e: 0x00327085, 0x611f: 0x00329a85, - 0x6120: 0x00328885, 0x6121: 0x00327e85, 0x6122: 0x0032528b, 0x6123: 0x0032548b, - 0x6124: 0x0032568b, 0x6125: 0x00325a8b, 0x6126: 0x00325c8b, 0x6127: 0x0032648b, - 0x6128: 0x0032688b, 0x6129: 0x00326a8b, 0x612a: 0x00326c8b, 0x612b: 0x0032708b, - 0x612c: 0x0032728b, 0x612d: 0x0032768b, 0x612e: 0x0032788b, 0x612f: 0x00327a8b, - 0x6130: 0x00327c8b, 0x6131: 0x00327e8b, 0x6132: 0x0032888b, 0x6133: 0x00326a8b, - 0x6134: 0x00328e8b, 0x6135: 0x0032968b, 0x6136: 0x0032988b, 0x6137: 0x00329a8b, - 0x6138: 0x00329c8b, 0x6139: 0x00329e8b, 0x613a: 0x0032a28b, 0x613b: 0x00092485, - 0x613c: 0x00325285, 0x613d: 0x00325485, 0x613e: 0x00325685, 0x613f: 0x00325a85, - // Block 0x185, offset 0x6140 - 0x6140: 0x00325c85, 0x6141: 0x00326485, 0x6142: 0x00326885, 0x6143: 0x00326a85, - 0x6144: 0x00326c85, 0x6145: 0x00327085, 0x6146: 0x00327285, 0x6147: 0x00327685, - 0x6148: 0x00327885, 0x6149: 0x00327a85, 0x614a: 0x00327c85, 0x614b: 0x00327e85, - 0x614c: 0x00328885, 0x614d: 0x00328e85, 0x614e: 0x00328e85, 0x614f: 0x00329685, - 0x6150: 0x00329885, 0x6151: 0x00329a85, 0x6152: 0x00329c85, 0x6153: 0x00329e85, - 0x6154: 0x0032a285, 0x6155: 0x00091c85, 0x6156: 0x00325c85, 0x6157: 0x00326a85, - 0x6158: 0x00327085, 0x6159: 0x00329a85, 0x615a: 0x00328885, 0x615b: 0x00327e85, - 0x615c: 0x0032528b, 0x615d: 0x0032548b, 0x615e: 0x0032568b, 0x615f: 0x00325a8b, - 0x6160: 0x00325c8b, 0x6161: 0x0032648b, 0x6162: 0x0032688b, 0x6163: 0x00326a8b, - 0x6164: 0x00326c8b, 0x6165: 0x0032708b, 0x6166: 0x0032728b, 0x6167: 0x0032768b, - 0x6168: 0x0032788b, 0x6169: 0x00327a8b, 0x616a: 0x00327c8b, 0x616b: 0x00327e8b, - 0x616c: 0x0032888b, 0x616d: 0x00326a8b, 0x616e: 0x00328e8b, 0x616f: 0x0032968b, - 0x6170: 0x0032988b, 0x6171: 0x00329a8b, 0x6172: 0x00329c8b, 0x6173: 0x00329e8b, - 0x6174: 0x0032a28b, 0x6175: 0x00092485, 0x6176: 0x00325285, 0x6177: 0x00325485, - 0x6178: 0x00325685, 0x6179: 0x00325a85, 0x617a: 0x00325c85, 0x617b: 0x00326485, - 0x617c: 0x00326885, 0x617d: 0x00326a85, 0x617e: 0x00326c85, 0x617f: 0x00327085, - // Block 0x186, offset 0x6180 - 0x6180: 0x00327285, 0x6181: 0x00327685, 0x6182: 0x00327885, 0x6183: 0x00327a85, - 0x6184: 0x00327c85, 0x6185: 0x00327e85, 0x6186: 0x00328885, 0x6187: 0x00328e85, - 0x6188: 0x00328e85, 0x6189: 0x00329685, 0x618a: 0x00329885, 0x618b: 0x00329a85, - 0x618c: 0x00329c85, 0x618d: 0x00329e85, 0x618e: 0x0032a285, 0x618f: 0x00091c85, - 0x6190: 0x00325c85, 0x6191: 0x00326a85, 0x6192: 0x00327085, 0x6193: 0x00329a85, - 0x6194: 0x00328885, 0x6195: 0x00327e85, 0x6196: 0x0032528b, 0x6197: 0x0032548b, - 0x6198: 0x0032568b, 0x6199: 0x00325a8b, 0x619a: 0x00325c8b, 0x619b: 0x0032648b, - 0x619c: 0x0032688b, 0x619d: 0x00326a8b, 0x619e: 0x00326c8b, 0x619f: 0x0032708b, - 0x61a0: 0x0032728b, 0x61a1: 0x0032768b, 0x61a2: 0x0032788b, 0x61a3: 0x00327a8b, - 0x61a4: 0x00327c8b, 0x61a5: 0x00327e8b, 0x61a6: 0x0032888b, 0x61a7: 0x00326a8b, - 0x61a8: 0x00328e8b, 0x61a9: 0x0032968b, 0x61aa: 0x0032988b, 0x61ab: 0x00329a8b, - 0x61ac: 0x00329c8b, 0x61ad: 0x00329e8b, 0x61ae: 0x0032a28b, 0x61af: 0x00092485, - 0x61b0: 0x00325285, 0x61b1: 0x00325485, 0x61b2: 0x00325685, 0x61b3: 0x00325a85, - 0x61b4: 0x00325c85, 0x61b5: 0x00326485, 0x61b6: 0x00326885, 0x61b7: 0x00326a85, - 0x61b8: 0x00326c85, 0x61b9: 0x00327085, 0x61ba: 0x00327285, 0x61bb: 0x00327685, - 0x61bc: 0x00327885, 0x61bd: 0x00327a85, 0x61be: 0x00327c85, 0x61bf: 0x00327e85, - // Block 0x187, offset 0x61c0 - 0x61c0: 0x00328885, 0x61c1: 0x00328e85, 0x61c2: 0x00328e85, 0x61c3: 0x00329685, - 0x61c4: 0x00329885, 0x61c5: 0x00329a85, 0x61c6: 0x00329c85, 0x61c7: 0x00329e85, - 0x61c8: 0x0032a285, 0x61c9: 0x00091c85, 0x61ca: 0x00325c85, 0x61cb: 0x00326a85, - 0x61cc: 0x00327085, 0x61cd: 0x00329a85, 0x61ce: 0x00328885, 0x61cf: 0x00327e85, - 0x61d0: 0x0032528b, 0x61d1: 0x0032548b, 0x61d2: 0x0032568b, 0x61d3: 0x00325a8b, - 0x61d4: 0x00325c8b, 0x61d5: 0x0032648b, 0x61d6: 0x0032688b, 0x61d7: 0x00326a8b, - 0x61d8: 0x00326c8b, 0x61d9: 0x0032708b, 0x61da: 0x0032728b, 0x61db: 0x0032768b, - 0x61dc: 0x0032788b, 0x61dd: 0x00327a8b, 0x61de: 0x00327c8b, 0x61df: 0x00327e8b, - 0x61e0: 0x0032888b, 0x61e1: 0x00326a8b, 0x61e2: 0x00328e8b, 0x61e3: 0x0032968b, - 0x61e4: 0x0032988b, 0x61e5: 0x00329a8b, 0x61e6: 0x00329c8b, 0x61e7: 0x00329e8b, - 0x61e8: 0x0032a28b, 0x61e9: 0x00092485, 0x61ea: 0x00325285, 0x61eb: 0x00325485, - 0x61ec: 0x00325685, 0x61ed: 0x00325a85, 0x61ee: 0x00325c85, 0x61ef: 0x00326485, - 0x61f0: 0x00326885, 0x61f1: 0x00326a85, 0x61f2: 0x00326c85, 0x61f3: 0x00327085, - 0x61f4: 0x00327285, 0x61f5: 0x00327685, 0x61f6: 0x00327885, 0x61f7: 0x00327a85, - 0x61f8: 0x00327c85, 0x61f9: 0x00327e85, 0x61fa: 0x00328885, 0x61fb: 0x00328e85, - 0x61fc: 0x00328e85, 0x61fd: 0x00329685, 0x61fe: 0x00329885, 0x61ff: 0x00329a85, - // Block 0x188, offset 0x6200 - 0x6200: 0x00329c85, 0x6201: 0x00329e85, 0x6202: 0x0032a285, 0x6203: 0x00091c85, - 0x6204: 0x00325c85, 0x6205: 0x00326a85, 0x6206: 0x00327085, 0x6207: 0x00329a85, - 0x6208: 0x00328885, 0x6209: 0x00327e85, 0x620a: 0x00325e8b, 0x620b: 0x00325e85, - 0x620e: 0x0029cc85, 0x620f: 0x0029ce85, - 0x6210: 0x0029d085, 0x6211: 0x0029d285, 0x6212: 0x0029d485, 0x6213: 0x0029d685, - 0x6214: 0x0029d885, 0x6215: 0x0029da85, 0x6216: 0x0029dc85, 0x6217: 0x0029de85, - 0x6218: 0x0029cc85, 0x6219: 0x0029ce85, 0x621a: 0x0029d085, 0x621b: 0x0029d285, - 0x621c: 0x0029d485, 0x621d: 0x0029d685, 0x621e: 0x0029d885, 0x621f: 0x0029da85, - 0x6220: 0x0029dc85, 0x6221: 0x0029de85, 0x6222: 0x0029cc85, 0x6223: 0x0029ce85, - 0x6224: 0x0029d085, 0x6225: 0x0029d285, 0x6226: 0x0029d485, 0x6227: 0x0029d685, - 0x6228: 0x0029d885, 0x6229: 0x0029da85, 0x622a: 0x0029dc85, 0x622b: 0x0029de85, - 0x622c: 0x0029cc85, 0x622d: 0x0029ce85, 0x622e: 0x0029d085, 0x622f: 0x0029d285, - 0x6230: 0x0029d485, 0x6231: 0x0029d685, 0x6232: 0x0029d885, 0x6233: 0x0029da85, - 0x6234: 0x0029dc85, 0x6235: 0x0029de85, 0x6236: 0x0029cc85, 0x6237: 0x0029ce85, - 0x6238: 0x0029d085, 0x6239: 0x0029d285, 0x623a: 0x0029d485, 0x623b: 0x0029d685, - 0x623c: 0x0029d885, 0x623d: 0x0029da85, 0x623e: 0x0029dc85, 0x623f: 0x0029de85, - // Block 0x189, offset 0x6240 - 0x6240: 0x00393885, 0x6241: 0x00393c85, 0x6242: 0x00396485, 0x6243: 0x00398885, - 0x6245: 0x003a7485, 0x6246: 0x0039a685, 0x6247: 0x00397285, - 0x6248: 0x0039e685, 0x6249: 0x003a9085, 0x624a: 0x003a1a85, 0x624b: 0x003a4085, - 0x624c: 0x003a4e85, 0x624d: 0x003a5685, 0x624e: 0x0039c685, 0x624f: 0x0039ee85, - 0x6250: 0x0039fc85, 0x6251: 0x0039dc85, 0x6252: 0x003a1285, 0x6253: 0x0039a485, - 0x6254: 0x0039c885, 0x6255: 0x00395685, 0x6256: 0x00395885, 0x6257: 0x00397485, - 0x6258: 0x00398a85, 0x6259: 0x0039de85, 0x625a: 0x0039e885, 0x625b: 0x0039f085, - 0x625c: 0x00393a85, 0x625d: 0x003a5885, 0x625e: 0x0039fe85, 0x625f: 0x003a1085, - 0x6261: 0x00393c85, 0x6262: 0x00396485, - 0x6264: 0x003a6885, 0x6267: 0x00397285, - 0x6269: 0x003a9085, 0x626a: 0x003a1a85, 0x626b: 0x003a4085, - 0x626c: 0x003a4e85, 0x626d: 0x003a5685, 0x626e: 0x0039c685, 0x626f: 0x0039ee85, - 0x6270: 0x0039fc85, 0x6271: 0x0039dc85, 0x6272: 0x003a1285, - 0x6274: 0x0039c885, 0x6275: 0x00395685, 0x6276: 0x00395885, 0x6277: 0x00397485, - 0x6279: 0x0039de85, 0x627b: 0x0039f085, - // Block 0x18a, offset 0x6280 - 0x6282: 0x00396485, - 0x6287: 0x00397285, - 0x6289: 0x003a9085, 0x628b: 0x003a4085, - 0x628d: 0x003a5685, 0x628e: 0x0039c685, 0x628f: 0x0039ee85, - 0x6291: 0x0039dc85, 0x6292: 0x003a1285, - 0x6294: 0x0039c885, 0x6297: 0x00397485, - 0x6299: 0x0039de85, 0x629b: 0x0039f085, - 0x629d: 0x003a5885, 0x629f: 0x003a1085, - 0x62a1: 0x00393c85, 0x62a2: 0x00396485, - 0x62a4: 0x003a6885, 0x62a7: 0x00397285, - 0x62a8: 0x0039e685, 0x62a9: 0x003a9085, 0x62aa: 0x003a1a85, - 0x62ac: 0x003a4e85, 0x62ad: 0x003a5685, 0x62ae: 0x0039c685, 0x62af: 0x0039ee85, - 0x62b0: 0x0039fc85, 0x62b1: 0x0039dc85, 0x62b2: 0x003a1285, - 0x62b4: 0x0039c885, 0x62b5: 0x00395685, 0x62b6: 0x00395885, 0x62b7: 0x00397485, - 0x62b9: 0x0039de85, 0x62ba: 0x0039e885, 0x62bb: 0x0039f085, - 0x62bc: 0x00393a85, 0x62be: 0x0039fe85, - // Block 0x18b, offset 0x62c0 - 0x62c0: 0x00393885, 0x62c1: 0x00393c85, 0x62c2: 0x00396485, 0x62c3: 0x00398885, - 0x62c4: 0x003a6885, 0x62c5: 0x003a7485, 0x62c6: 0x0039a685, 0x62c7: 0x00397285, - 0x62c8: 0x0039e685, 0x62c9: 0x003a9085, 0x62cb: 0x003a4085, - 0x62cc: 0x003a4e85, 0x62cd: 0x003a5685, 0x62ce: 0x0039c685, 0x62cf: 0x0039ee85, - 0x62d0: 0x0039fc85, 0x62d1: 0x0039dc85, 0x62d2: 0x003a1285, 0x62d3: 0x0039a485, - 0x62d4: 0x0039c885, 0x62d5: 0x00395685, 0x62d6: 0x00395885, 0x62d7: 0x00397485, - 0x62d8: 0x00398a85, 0x62d9: 0x0039de85, 0x62da: 0x0039e885, 0x62db: 0x0039f085, - 0x62e1: 0x00393c85, 0x62e2: 0x00396485, 0x62e3: 0x00398885, - 0x62e5: 0x003a7485, 0x62e6: 0x0039a685, 0x62e7: 0x00397285, - 0x62e8: 0x0039e685, 0x62e9: 0x003a9085, 0x62eb: 0x003a4085, - 0x62ec: 0x003a4e85, 0x62ed: 0x003a5685, 0x62ee: 0x0039c685, 0x62ef: 0x0039ee85, - 0x62f0: 0x0039fc85, 0x62f1: 0x0039dc85, 0x62f2: 0x003a1285, 0x62f3: 0x0039a485, - 0x62f4: 0x0039c885, 0x62f5: 0x00395685, 0x62f6: 0x00395885, 0x62f7: 0x00397485, - 0x62f8: 0x00398a85, 0x62f9: 0x0039de85, 0x62fa: 0x0039e885, 0x62fb: 0x0039f085, - // Block 0x18c, offset 0x6300 - 0x6330: 0x40070a20, 0x6331: 0x40070c20, - // Block 0x18d, offset 0x6340 - 0x6340: 0x401f6e20, 0x6341: 0x401f7020, 0x6342: 0x401f7220, 0x6343: 0x401f7420, - 0x6344: 0x401f7620, 0x6345: 0x401f7820, 0x6346: 0x401f7a20, 0x6347: 0x401f7c20, - 0x6348: 0x401f7e20, 0x6349: 0x401f8020, 0x634a: 0x401f8220, 0x634b: 0x401f8420, - 0x634c: 0x401f8620, 0x634d: 0x401f8820, 0x634e: 0x401f8a20, 0x634f: 0x401f8c20, - 0x6350: 0x401f8e20, 0x6351: 0x401f9020, 0x6352: 0x401f9220, 0x6353: 0x401f9420, - 0x6354: 0x401f9620, 0x6355: 0x401f9820, 0x6356: 0x401f9a20, 0x6357: 0x401f9c20, - 0x6358: 0x401f9e20, 0x6359: 0x401fa020, 0x635a: 0x401fa220, 0x635b: 0x401fa420, - 0x635c: 0x401fa620, 0x635d: 0x401fa820, 0x635e: 0x401faa20, 0x635f: 0x401fac20, - 0x6360: 0x401fae20, 0x6361: 0x401fb020, 0x6362: 0x401fb220, 0x6363: 0x401fb420, - 0x6364: 0x401fb620, 0x6365: 0x401fb820, 0x6366: 0x401fba20, 0x6367: 0x401fbc20, - 0x6368: 0x401fbe20, 0x6369: 0x401fc020, 0x636a: 0x401fc220, 0x636b: 0x401fc420, - 0x6370: 0x401fc620, 0x6371: 0x401fc820, 0x6372: 0x401fca20, 0x6373: 0x401fcc20, - 0x6374: 0x401fce20, 0x6375: 0x401fd020, 0x6376: 0x401fd220, 0x6377: 0x401fd420, - 0x6378: 0x401fd620, 0x6379: 0x401fd820, 0x637a: 0x401fda20, 0x637b: 0x401fdc20, - 0x637c: 0x401fde20, 0x637d: 0x401fe020, 0x637e: 0x401fe220, 0x637f: 0x401fe420, - // Block 0x18e, offset 0x6380 - 0x6380: 0x401fe620, 0x6381: 0x401fe820, 0x6382: 0x401fea20, 0x6383: 0x401fec20, - 0x6384: 0x401fee20, 0x6385: 0x401ff020, 0x6386: 0x401ff220, 0x6387: 0x401ff420, - 0x6388: 0x401ff620, 0x6389: 0x401ff820, 0x638a: 0x401ffa20, 0x638b: 0x401ffc20, - 0x638c: 0x401ffe20, 0x638d: 0x40200020, 0x638e: 0x40200220, 0x638f: 0x40200420, - 0x6390: 0x40200620, 0x6391: 0x40200820, 0x6392: 0x40200a20, 0x6393: 0x40200c20, - 0x6394: 0x40200e20, 0x6395: 0x40201020, 0x6396: 0x40201220, 0x6397: 0x40201420, - 0x6398: 0x40201620, 0x6399: 0x40201820, 0x639a: 0x40201a20, 0x639b: 0x40201c20, - 0x639c: 0x40201e20, 0x639d: 0x40202020, 0x639e: 0x40202220, 0x639f: 0x40202420, - 0x63a0: 0x40202620, 0x63a1: 0x40202820, 0x63a2: 0x40202a20, 0x63a3: 0x40202c20, - 0x63a4: 0x40202e20, 0x63a5: 0x40203020, 0x63a6: 0x40203220, 0x63a7: 0x40203420, - 0x63a8: 0x40203620, 0x63a9: 0x40203820, 0x63aa: 0x40203a20, 0x63ab: 0x40203c20, - 0x63ac: 0x40203e20, 0x63ad: 0x40204020, 0x63ae: 0x40204220, 0x63af: 0x40204420, - 0x63b0: 0x40204620, 0x63b1: 0x40204820, 0x63b2: 0x40204a20, 0x63b3: 0x40204c20, - 0x63b4: 0x40204e20, 0x63b5: 0x40205020, 0x63b6: 0x40205220, 0x63b7: 0x40205420, - 0x63b8: 0x40205620, 0x63b9: 0x40205820, 0x63ba: 0x40205a20, 0x63bb: 0x40205c20, - 0x63bc: 0x40205e20, 0x63bd: 0x40206020, 0x63be: 0x40206220, 0x63bf: 0x40206420, - // Block 0x18f, offset 0x63c0 - 0x63c0: 0x40206620, 0x63c1: 0x40206820, 0x63c2: 0x40206a20, 0x63c3: 0x40206c20, - 0x63c4: 0x40206e20, 0x63c5: 0x40207020, 0x63c6: 0x40207220, 0x63c7: 0x40207420, - 0x63c8: 0x40207620, 0x63c9: 0x40207820, 0x63ca: 0x40207a20, 0x63cb: 0x40207c20, - 0x63cc: 0x40207e20, 0x63cd: 0x40208020, 0x63ce: 0x40208220, 0x63cf: 0x40208420, - 0x63d0: 0x40208620, 0x63d1: 0x40208820, 0x63d2: 0x40208a20, 0x63d3: 0x40208c20, - 0x63e0: 0x40208e20, 0x63e1: 0x40209020, 0x63e2: 0x40209220, 0x63e3: 0x40209420, - 0x63e4: 0x40209620, 0x63e5: 0x40209820, 0x63e6: 0x40209a20, 0x63e7: 0x40209c20, - 0x63e8: 0x40209e20, 0x63e9: 0x4020a020, 0x63ea: 0x4020a220, 0x63eb: 0x4020a420, - 0x63ec: 0x4020a620, 0x63ed: 0x4020a820, 0x63ee: 0x4020aa20, - 0x63f1: 0x4020ac20, 0x63f2: 0x4020ae20, 0x63f3: 0x4020b020, - 0x63f4: 0x4020b220, 0x63f5: 0x4020b420, 0x63f6: 0x4020b620, 0x63f7: 0x4020b820, - 0x63f8: 0x4020ba20, 0x63f9: 0x4020bc20, 0x63fa: 0x4020be20, 0x63fb: 0x4020c020, - 0x63fc: 0x4020c220, 0x63fd: 0x4020c420, 0x63fe: 0x4020c620, - // Block 0x190, offset 0x6400 - 0x6401: 0x4020c820, 0x6402: 0x4020ca20, 0x6403: 0x4020cc20, - 0x6404: 0x4020ce20, 0x6405: 0x4020d020, 0x6406: 0x4020d220, 0x6407: 0x4020d420, - 0x6408: 0x4020d620, 0x6409: 0x4020d820, 0x640a: 0x4020da20, 0x640b: 0x4020dc20, - 0x640c: 0x4020de20, 0x640d: 0x4020e020, 0x640e: 0x4020e220, 0x640f: 0x4020e420, - 0x6411: 0x4020e620, 0x6412: 0x4020e820, 0x6413: 0x4020ea20, - 0x6414: 0x4020ec20, 0x6415: 0x4020ee20, 0x6416: 0x4020f020, 0x6417: 0x4020f220, - 0x6418: 0x4020f420, 0x6419: 0x4020f620, 0x641a: 0x4020f820, 0x641b: 0x4020fa20, - 0x641c: 0x4020fc20, 0x641d: 0x4020fe20, 0x641e: 0x40210020, 0x641f: 0x40210220, - // Block 0x191, offset 0x6440 - 0x6440: 0xf0001f04, 0x6441: 0xf0001f04, 0x6442: 0xf0001f04, 0x6443: 0xf0001f04, - 0x6444: 0xf0001f04, 0x6445: 0xf0001f04, 0x6446: 0xf0001f04, 0x6447: 0xf0001f04, - 0x6448: 0xf0001f04, 0x6449: 0xf0001f04, 0x644a: 0xf0001f04, - 0x6450: 0xf0000a04, 0x6451: 0xf0000a04, 0x6452: 0xf0000a04, 0x6453: 0xf0000a04, - 0x6454: 0xf0000a04, 0x6455: 0xf0000a04, 0x6456: 0xf0000a04, 0x6457: 0xf0000a04, - 0x6458: 0xf0000a04, 0x6459: 0xf0000a04, 0x645a: 0xf0000a04, 0x645b: 0xf0000a04, - 0x645c: 0xf0000a04, 0x645d: 0xf0000a04, 0x645e: 0xf0000a04, 0x645f: 0xf0000a04, - 0x6460: 0xf0000a04, 0x6461: 0xf0000a04, 0x6462: 0xf0000a04, 0x6463: 0xf0000a04, - 0x6464: 0xf0000a04, 0x6465: 0xf0000a04, 0x6466: 0xf0000a04, 0x6467: 0xf0000a04, - 0x6468: 0xf0000a04, 0x6469: 0xf0000a04, 0x646a: 0xf0000a04, 0x646b: 0x002c3a8c, - 0x646c: 0x002f7a8c, 0x646d: 0xf0000c0c, 0x646e: 0xf0000c0c, - 0x6470: 0x002bde9d, 0x6471: 0x002c0a9d, 0x6472: 0x002c3a9d, 0x6473: 0x002c629d, - 0x6474: 0x002c989d, 0x6475: 0x002d089d, 0x6476: 0x002d229d, 0x6477: 0x002d689d, - 0x6478: 0x002d9a9d, 0x6479: 0x002dcc9d, 0x647a: 0x002dfe9d, 0x647b: 0x002e229d, - 0x647c: 0x002e829d, 0x647d: 0x002e9e9d, 0x647e: 0x002ee29d, 0x647f: 0x002f2c9d, - // Block 0x192, offset 0x6480 - 0x6480: 0x002f569d, 0x6481: 0x002f7a9d, 0x6482: 0x002fe69d, 0x6483: 0x00302c9d, - 0x6484: 0x00306c9d, 0x6485: 0x0030be9d, 0x6486: 0x0030e29d, 0x6487: 0x0030f69d, - 0x6488: 0x0031009d, 0x6489: 0x00312a9d, 0x648a: 0xf0001d1d, 0x648b: 0xf0001d1d, - 0x648c: 0xf0001d1d, 0x648d: 0xf0001d1d, 0x648e: 0xe0000ebc, 0x648f: 0xf0001d1d, - 0x6490: 0x002bde8c, 0x6491: 0x002c0a8c, 0x6492: 0x002c3a8c, 0x6493: 0x002c628c, - 0x6494: 0x002c988c, 0x6495: 0x002d088c, 0x6496: 0x002d228c, 0x6497: 0x002d688c, - 0x6498: 0x002d9a8c, 0x6499: 0x002dcc8c, 0x649a: 0x002dfe8c, 0x649b: 0x002e228c, - 0x649c: 0x002e828c, 0x649d: 0x002e9e8c, 0x649e: 0x002ee28c, 0x649f: 0x002f2c8c, - 0x64a0: 0x002f568c, 0x64a1: 0x002f7a8c, 0x64a2: 0x002fe68c, 0x64a3: 0x00302c8c, - 0x64a4: 0x00306c8c, 0x64a5: 0x0030be8c, 0x64a6: 0x0030e28c, 0x64a7: 0x0030f68c, - 0x64a8: 0x0031008c, 0x64a9: 0x00312a8c, 0x64aa: 0xf0001414, 0x64ab: 0xf0001414, - 0x64b0: 0x002bde9d, 0x64b1: 0x002c0a9d, 0x64b2: 0x002c3a9d, 0x64b3: 0x002c629d, - 0x64b4: 0x002c989d, 0x64b5: 0x002d089d, 0x64b6: 0x002d229d, 0x64b7: 0x002d689d, - 0x64b8: 0x002d9a9d, 0x64b9: 0x002dcc9d, 0x64ba: 0x002dfe9d, 0x64bb: 0x002e229d, - 0x64bc: 0x002e829d, 0x64bd: 0x002e9e9d, 0x64be: 0x002ee29d, 0x64bf: 0x002f2c9d, - // Block 0x193, offset 0x64c0 - 0x64c0: 0x002f569d, 0x64c1: 0x002f7a9d, 0x64c2: 0x002fe69d, 0x64c3: 0x00302c9d, - 0x64c4: 0x00306c9d, 0x64c5: 0x0030be9d, 0x64c6: 0x0030e29d, 0x64c7: 0x0030f69d, - 0x64c8: 0x0031009d, 0x64c9: 0x00312a9d, 0x64ca: 0x002f2c9d, 0x64cb: 0xe0000c81, - 0x64cc: 0xe0000eb5, 0x64cd: 0xe0000f74, 0x64ce: 0xe00009d2, 0x64cf: 0xe00010f0, - 0x64d0: 0xf0001d1d, 0x64d1: 0xe0000a6f, 0x64d2: 0xe0000a7e, 0x64d3: 0xe0000ba4, - 0x64d4: 0xe0000c84, 0x64d5: 0xe0000d8a, 0x64d6: 0xe0000d8e, 0x64d7: 0xe0000e9b, - 0x64d8: 0xe0000f77, 0x64d9: 0xe00010a2, 0x64da: 0xe00010c0, - // Block 0x194, offset 0x6500 - 0x6526: 0x40110c20, 0x6527: 0x40110e20, - 0x6528: 0x40111020, 0x6529: 0x40111220, 0x652a: 0x40111420, 0x652b: 0x40111620, - 0x652c: 0x40111820, 0x652d: 0x40111a20, 0x652e: 0x40111c20, 0x652f: 0x40111e20, - 0x6530: 0x40112020, 0x6531: 0x40112220, 0x6532: 0x40112420, 0x6533: 0x40112620, - 0x6534: 0x40112820, 0x6535: 0x40112a20, 0x6536: 0x40112c20, 0x6537: 0x40112e20, - 0x6538: 0x40113020, 0x6539: 0x40113220, 0x653a: 0x40113420, 0x653b: 0x40113620, - 0x653c: 0x40113820, 0x653d: 0x40113a20, 0x653e: 0x40113c20, 0x653f: 0x40113e20, - // Block 0x195, offset 0x6540 - 0x6540: 0xf0001c1c, 0x6541: 0xf0001c1c, 0x6542: 0x00658c9c, - 0x6550: 0x02c4969c, 0x6551: 0x02b6ae9c, 0x6552: 0x02a7989c, 0x6553: 0xf0001c1c, - 0x6554: 0x029d189c, 0x6555: 0x02b2349c, 0x6556: 0x0313c69c, 0x6557: 0x02b2529c, - 0x6558: 0x029d489c, 0x6559: 0x02cc409c, 0x655a: 0x02e2429c, 0x655b: 0x02cb329c, - 0x655c: 0x02a49a9c, 0x655d: 0x02bf189c, 0x655e: 0x02a31a9c, 0x655f: 0x02cb609c, - 0x6560: 0x02a43a9c, 0x6561: 0x02fa849c, 0x6562: 0x02ea3e9c, 0x6563: 0x0319529c, - 0x6564: 0x02b1e09c, 0x6565: 0x02a8729c, 0x6566: 0x02de289c, 0x6567: 0x02c52a9c, - 0x6568: 0x02c6aa9c, 0x6569: 0x029c009c, 0x656a: 0x029c129c, 0x656b: 0x0320949c, - 0x656c: 0x02bbcc9c, 0x656d: 0x029c5a9c, 0x656e: 0x02a7e69c, 0x656f: 0x02c60e9c, - 0x6570: 0x031ae09c, 0x6571: 0x02c4a69c, 0x6572: 0x02f3029c, 0x6573: 0x02f4f49c, - 0x6574: 0x02a8109c, 0x6575: 0x02dd009c, 0x6576: 0x02ce129c, 0x6577: 0x02ce109c, - 0x6578: 0x02ea669c, 0x6579: 0x02a4e49c, 0x657a: 0x02ab6c9c, - // Block 0x196, offset 0x6580 - 0x6580: 0xf0000404, 0x6581: 0xf0000404, 0x6582: 0xf0000404, 0x6583: 0xf0000404, - 0x6584: 0xf0000404, 0x6585: 0xf0000404, 0x6586: 0xf0000404, 0x6587: 0xf0000404, - 0x6588: 0xf0000404, - 0x6590: 0x02bf2e86, 0x6591: 0x02a7de86, - // Block 0x197, offset 0x65c0 - 0x65c0: 0x40210420, 0x65c1: 0x40210620, 0x65c2: 0x40210820, 0x65c3: 0x40210a20, - 0x65c4: 0x40210c20, 0x65c5: 0x40210e20, 0x65c6: 0x40211020, 0x65c7: 0x40211220, - 0x65c8: 0x40211420, 0x65c9: 0x40211620, 0x65ca: 0x40211820, 0x65cb: 0x40211a20, - 0x65cc: 0x40211c20, 0x65cd: 0x40211e20, 0x65ce: 0x40212020, 0x65cf: 0x40212220, - 0x65d0: 0x40212420, 0x65d1: 0x40212620, 0x65d2: 0x40212820, 0x65d3: 0x40212a20, - 0x65d4: 0x40212c20, 0x65d5: 0x40212e20, 0x65d6: 0x40213020, 0x65d7: 0x40213220, - 0x65d8: 0x40213420, 0x65d9: 0x40213620, 0x65da: 0x40213820, 0x65db: 0x40213a20, - 0x65dc: 0x40213c20, 0x65dd: 0x40213e20, 0x65de: 0x40214020, 0x65df: 0x40214220, - 0x65e0: 0x40214420, - 0x65f0: 0x40214620, 0x65f1: 0x40214820, 0x65f2: 0x40214a20, 0x65f3: 0x40214c20, - 0x65f4: 0x40214e20, 0x65f5: 0x40215020, 0x65f7: 0x40215220, - 0x65f8: 0x40215420, 0x65f9: 0x40215620, 0x65fa: 0x40215820, 0x65fb: 0x40215a20, - 0x65fc: 0x40215c20, 0x65fd: 0x40215e20, 0x65fe: 0x40216020, 0x65ff: 0x40216220, - // Block 0x198, offset 0x6600 - 0x6600: 0x40216420, 0x6601: 0x40216620, 0x6602: 0x40216820, 0x6603: 0x40216a20, - 0x6604: 0x40216c20, 0x6605: 0x40216e20, 0x6606: 0x40217020, 0x6607: 0x40217220, - 0x6608: 0x40217420, 0x6609: 0x40217620, 0x660a: 0x40217820, 0x660b: 0x40217a20, - 0x660c: 0x40217c20, 0x660d: 0x40217e20, 0x660e: 0x40218020, 0x660f: 0x40218220, - 0x6610: 0x40218420, 0x6611: 0x40218620, 0x6612: 0x40218820, 0x6613: 0x40218a20, - 0x6614: 0x40218c20, 0x6615: 0x40218e20, 0x6616: 0x40219020, 0x6617: 0x40219220, - 0x6618: 0x40219420, 0x6619: 0x40219620, 0x661a: 0x40219820, 0x661b: 0x40219a20, - 0x661c: 0x40219c20, 0x661d: 0x40219e20, 0x661e: 0x4021a020, 0x661f: 0x4021a220, - 0x6620: 0x4021a420, 0x6621: 0x4021a620, 0x6622: 0x4021a820, 0x6623: 0x4021aa20, - 0x6624: 0x4021ac20, 0x6625: 0x4021ae20, 0x6626: 0x4021b020, 0x6627: 0x4021b220, - 0x6628: 0x4021b420, 0x6629: 0x4021b620, 0x662a: 0x4021b820, 0x662b: 0x4021ba20, - 0x662c: 0x4021bc20, 0x662d: 0x4021be20, 0x662e: 0x4021c020, 0x662f: 0x4021c220, - 0x6630: 0x4021c420, 0x6631: 0x4021c620, 0x6632: 0x4021c820, 0x6633: 0x4021ca20, - 0x6634: 0x4021cc20, 0x6635: 0x4021ce20, 0x6636: 0x4021d020, 0x6637: 0x4021d220, - 0x6638: 0x4021d420, 0x6639: 0x4021d620, 0x663a: 0x4021d820, 0x663b: 0x4021da20, - 0x663c: 0x4021dc20, - // Block 0x199, offset 0x6640 - 0x6640: 0x4021de20, 0x6641: 0x4021e020, 0x6642: 0x4021e220, 0x6643: 0x4021e420, - 0x6644: 0x4021e620, 0x6645: 0x4021e820, 0x6646: 0x4021ea20, 0x6647: 0x4021ec20, - 0x6648: 0x4021ee20, 0x6649: 0x4021f020, 0x664a: 0x4021f220, 0x664b: 0x4021f420, - 0x664c: 0x4021f620, 0x664d: 0x4021f820, 0x664e: 0x4021fa20, 0x664f: 0x4021fc20, - 0x6650: 0x4021fe20, 0x6651: 0x40220020, 0x6652: 0x40220220, 0x6653: 0x40220420, - 0x6660: 0x40220620, 0x6661: 0x40220820, 0x6662: 0x40220a20, 0x6663: 0x40220c20, - 0x6664: 0x40220e20, 0x6665: 0x40221020, 0x6666: 0x40221220, 0x6667: 0x40221420, - 0x6668: 0x40221620, 0x6669: 0x40221820, 0x666a: 0x40221a20, 0x666b: 0x40221c20, - 0x666c: 0x40221e20, 0x666d: 0x40222020, 0x666e: 0x40222220, 0x666f: 0x40222420, - 0x6670: 0x40222620, 0x6671: 0x40222820, 0x6672: 0x40222a20, 0x6673: 0x40222c20, - 0x6674: 0x40222e20, 0x6675: 0x40223020, 0x6676: 0x40223220, 0x6677: 0x40223420, - 0x6678: 0x40223620, 0x6679: 0x40223820, 0x667a: 0x40223a20, 0x667b: 0x40223c20, - 0x667c: 0x40223e20, 0x667d: 0x40224020, 0x667e: 0x40224220, 0x667f: 0x40224420, - // Block 0x19a, offset 0x6680 - 0x6680: 0x40224620, 0x6681: 0x40224820, 0x6682: 0x40224a20, 0x6683: 0x40224c20, - 0x6684: 0x40224e20, 0x6686: 0x40225020, 0x6687: 0x40225220, - 0x6688: 0x40225420, 0x6689: 0x40225620, 0x668a: 0x40225820, - 0x66a0: 0x40225a20, 0x66a1: 0x40225c20, 0x66a2: 0x40225e20, 0x66a3: 0x40226020, - 0x66a4: 0x40226220, 0x66a5: 0x40226420, 0x66a6: 0x40226620, 0x66a7: 0x40226820, - 0x66a8: 0x40226a20, 0x66a9: 0x40226c20, 0x66aa: 0x40226e20, 0x66ab: 0x40227020, - 0x66ac: 0x40227220, 0x66ad: 0x40227420, 0x66ae: 0x40227620, 0x66af: 0x40227820, - 0x66b0: 0x40227a20, - // Block 0x19b, offset 0x66c0 - 0x66c0: 0x40227c20, 0x66c1: 0x40227e20, 0x66c2: 0x40228020, 0x66c3: 0x40228220, - 0x66c4: 0x40228420, 0x66c5: 0x40228620, 0x66c6: 0x40228820, 0x66c7: 0x40228a20, - 0x66c8: 0x40228c20, 0x66c9: 0x40228e20, 0x66ca: 0x40229020, 0x66cb: 0x40229220, - 0x66cc: 0x40229420, 0x66cd: 0x40229620, 0x66ce: 0x40229820, 0x66cf: 0x40229a20, - 0x66d0: 0x40229c20, 0x66d1: 0x40229e20, 0x66d2: 0x4022a020, 0x66d3: 0x4022a220, - 0x66d4: 0x4022a420, 0x66d5: 0x4022a620, 0x66d6: 0x4022a820, 0x66d7: 0x4022aa20, - 0x66d8: 0x4022ac20, 0x66d9: 0x4022ae20, 0x66da: 0x4022b020, 0x66db: 0x4022b220, - 0x66dc: 0x4022b420, 0x66dd: 0x4022b620, 0x66de: 0x4022b820, 0x66df: 0x4022ba20, - 0x66e0: 0x4022bc20, 0x66e1: 0x4022be20, 0x66e2: 0x4022c020, 0x66e3: 0x4022c220, - 0x66e4: 0x4022c420, 0x66e5: 0x4022c620, 0x66e6: 0x4022c820, 0x66e7: 0x4022ca20, - 0x66e8: 0x4022cc20, 0x66e9: 0x4022ce20, 0x66ea: 0x4022d020, 0x66eb: 0x4022d220, - 0x66ec: 0x4022d420, 0x66ed: 0x4022d620, 0x66ee: 0x4022d820, 0x66ef: 0x4022da20, - 0x66f0: 0x4022dc20, 0x66f1: 0x4022de20, 0x66f2: 0x4022e020, 0x66f3: 0x4022e220, - 0x66f4: 0x4022e420, 0x66f5: 0x4022e620, 0x66f6: 0x4022e820, 0x66f7: 0x4022ea20, - 0x66f8: 0x4022ec20, 0x66f9: 0x4022ee20, 0x66fa: 0x4022f020, 0x66fb: 0x4022f220, - 0x66fc: 0x4022f420, 0x66fd: 0x4022f620, 0x66fe: 0x4022f820, - // Block 0x19c, offset 0x6700 - 0x6700: 0x4022fa20, 0x6702: 0x4022fc20, 0x6703: 0x4022fe20, - 0x6704: 0x40230020, 0x6705: 0x40230220, 0x6706: 0x40230420, 0x6707: 0x40230620, - 0x6708: 0x40230820, 0x6709: 0x40230a20, 0x670a: 0x40230c20, 0x670b: 0x40230e20, - 0x670c: 0x40231020, 0x670d: 0x40231220, 0x670e: 0x40231420, 0x670f: 0x40231620, - 0x6710: 0x40231820, 0x6711: 0x40231a20, 0x6712: 0x40231c20, 0x6713: 0x40231e20, - 0x6714: 0x40232020, 0x6715: 0x40232220, 0x6716: 0x40232420, 0x6717: 0x40232620, - 0x6718: 0x40232820, 0x6719: 0x40232a20, 0x671a: 0x40232c20, 0x671b: 0x40232e20, - 0x671c: 0x40233020, 0x671d: 0x40233220, 0x671e: 0x40233420, 0x671f: 0x40233620, - 0x6720: 0x40233820, 0x6721: 0x40233a20, 0x6722: 0x40233c20, 0x6723: 0x40233e20, - 0x6724: 0x40234020, 0x6725: 0x40234220, 0x6726: 0x40234420, 0x6727: 0x40234620, - 0x6728: 0x40234820, 0x6729: 0x40234a20, 0x672a: 0x40234c20, 0x672b: 0x40234e20, - 0x672c: 0x40235020, 0x672d: 0x40235220, 0x672e: 0x40235420, 0x672f: 0x40235620, - 0x6730: 0x40235820, 0x6731: 0x40235a20, 0x6732: 0x40235c20, 0x6733: 0x40235e20, - 0x6734: 0x40236020, 0x6735: 0x40236220, 0x6736: 0x40236420, 0x6737: 0x40236620, - 0x6738: 0x40236820, 0x6739: 0x40236a20, 0x673a: 0x40236c20, 0x673b: 0x40236e20, - 0x673c: 0x40237020, 0x673d: 0x40237220, 0x673e: 0x40237420, 0x673f: 0x40237620, - // Block 0x19d, offset 0x6740 - 0x6740: 0x40237820, 0x6741: 0x40237a20, 0x6742: 0x40237c20, 0x6743: 0x40237e20, - 0x6744: 0x40238020, 0x6745: 0x40238220, 0x6746: 0x40238420, 0x6747: 0x40238620, - 0x6748: 0x40238820, 0x6749: 0x40238a20, 0x674a: 0x40238c20, 0x674b: 0x40238e20, - 0x674c: 0x40239020, 0x674d: 0x40239220, 0x674e: 0x40239420, 0x674f: 0x40239620, - 0x6750: 0x40239820, 0x6751: 0x40239a20, 0x6752: 0x40239c20, 0x6753: 0x40239e20, - 0x6754: 0x4023a020, 0x6755: 0x4023a220, 0x6756: 0x4023a420, 0x6757: 0x4023a620, - 0x6758: 0x4023a820, 0x6759: 0x4023aa20, 0x675a: 0x4023ac20, 0x675b: 0x4023ae20, - 0x675c: 0x4023b020, 0x675d: 0x4023b220, 0x675e: 0x4023b420, 0x675f: 0x4023b620, - 0x6760: 0x4023b820, 0x6761: 0x4023ba20, 0x6762: 0x4023bc20, 0x6763: 0x4023be20, - 0x6764: 0x4023c020, 0x6765: 0x4023c220, 0x6766: 0x4023c420, 0x6767: 0x4023c620, - 0x6768: 0x4023c820, 0x6769: 0x4023ca20, 0x676a: 0x4023cc20, 0x676b: 0x4023ce20, - 0x676c: 0x4023d020, 0x676d: 0x4023d220, 0x676e: 0x4023d420, 0x676f: 0x4023d620, - 0x6770: 0x4023d820, 0x6771: 0x4023da20, 0x6772: 0x4023dc20, 0x6773: 0x4023de20, - 0x6774: 0x4023e020, 0x6775: 0x4023e220, 0x6776: 0x4023e420, 0x6777: 0x4023e620, - 0x6778: 0x4023e820, 0x6779: 0x4023ea20, 0x677a: 0x4023ec20, 0x677b: 0x4023ee20, - 0x677c: 0x4023f020, 0x677d: 0x4023f220, 0x677e: 0x4023f420, 0x677f: 0x4023f620, - // Block 0x19e, offset 0x6780 - 0x6780: 0x4023f820, 0x6781: 0x4023fa20, 0x6782: 0x4023fc20, 0x6783: 0x4023fe20, - 0x6784: 0x40240020, 0x6785: 0x40240220, 0x6786: 0x40240420, 0x6787: 0x40240620, - 0x6788: 0x40240820, 0x6789: 0x40240a20, 0x678a: 0x40240c20, 0x678b: 0x40240e20, - 0x678c: 0x40241020, 0x678d: 0x40241220, 0x678e: 0x40241420, 0x678f: 0x40241620, - 0x6790: 0x40241820, 0x6791: 0x40241a20, 0x6792: 0x40241c20, 0x6793: 0x40241e20, - 0x6794: 0x40242020, 0x6795: 0x40242220, 0x6796: 0x40242420, 0x6797: 0x40242620, - 0x6798: 0x40242820, 0x6799: 0x40242a20, 0x679a: 0x40242c20, 0x679b: 0x40242e20, - 0x679c: 0x40243020, 0x679d: 0x40243220, 0x679e: 0x40243420, 0x679f: 0x40243620, - 0x67a0: 0x40243820, 0x67a1: 0x40243a20, 0x67a2: 0x40243c20, 0x67a3: 0x40243e20, - 0x67a4: 0x40244020, 0x67a5: 0x40244220, 0x67a6: 0x40244420, 0x67a7: 0x40244620, - 0x67a8: 0x40244820, 0x67a9: 0x40244a20, 0x67aa: 0x40244c20, 0x67ab: 0x40244e20, - 0x67ac: 0x40245020, 0x67ad: 0x40245220, 0x67ae: 0x40245420, 0x67af: 0x40245620, - 0x67b0: 0x40245820, 0x67b1: 0x40245a20, 0x67b2: 0x40245c20, 0x67b3: 0x40245e20, - 0x67b4: 0x40246020, 0x67b5: 0x40246220, 0x67b6: 0x40246420, 0x67b7: 0x40246620, - 0x67b9: 0x40246820, 0x67ba: 0x40246a20, 0x67bb: 0x40246c20, - 0x67bc: 0x40246e20, - // Block 0x19f, offset 0x67c0 - 0x67c0: 0x40247020, 0x67c1: 0x40247220, 0x67c2: 0x40247420, 0x67c3: 0x40247620, - 0x67c4: 0x40247820, 0x67c5: 0x40247a20, 0x67c6: 0x40247c20, 0x67c7: 0x40247e20, - 0x67c8: 0x40248020, 0x67c9: 0x40248220, 0x67ca: 0x40248420, 0x67cb: 0x40248620, - 0x67cc: 0x40248820, 0x67cd: 0x40248a20, 0x67ce: 0x40248c20, 0x67cf: 0x40248e20, - 0x67d0: 0x40249020, 0x67d1: 0x40249220, 0x67d2: 0x40249420, 0x67d3: 0x40249620, - 0x67d4: 0x40249820, 0x67d5: 0x40249a20, 0x67d6: 0x40249c20, 0x67d7: 0x40249e20, - 0x67d8: 0x4024a020, 0x67d9: 0x4024a220, 0x67da: 0x4024a420, 0x67db: 0x4024a620, - 0x67dc: 0x4024a820, 0x67dd: 0x4024aa20, 0x67de: 0x4024ac20, 0x67df: 0x4024ae20, - 0x67e0: 0x4024b020, 0x67e1: 0x4024b220, 0x67e2: 0x4024b420, 0x67e3: 0x4024b620, - 0x67e4: 0x4024b820, 0x67e5: 0x4024ba20, 0x67e6: 0x4024bc20, 0x67e7: 0x4024be20, - 0x67e8: 0x4024c020, 0x67e9: 0x4024c220, 0x67ea: 0x4024c420, 0x67eb: 0x4024c620, - 0x67ec: 0x4024c820, 0x67ed: 0x4024ca20, 0x67ee: 0x4024cc20, 0x67ef: 0x4024ce20, - 0x67f0: 0x4024d020, 0x67f1: 0x4024d220, 0x67f2: 0x4024d420, 0x67f3: 0x4024d620, - 0x67f4: 0x4024d820, 0x67f5: 0x4024da20, 0x67f6: 0x4024dc20, 0x67f7: 0x4024de20, - 0x67f8: 0x4024e020, 0x67f9: 0x4024e220, 0x67fa: 0x4024e420, 0x67fb: 0x4024e620, - 0x67fc: 0x4024e820, 0x67fd: 0x4024ea20, - // Block 0x1a0, offset 0x6800 - 0x6800: 0x4024ec20, 0x6801: 0x4024ee20, 0x6802: 0x4024f020, 0x6803: 0x4024f220, - 0x6810: 0x4024f420, 0x6811: 0x4024f620, 0x6812: 0x4024f820, 0x6813: 0x4024fa20, - 0x6814: 0x4024fc20, 0x6815: 0x4024fe20, 0x6816: 0x40250020, 0x6817: 0x40250220, - 0x6818: 0x40250420, 0x6819: 0x40250620, 0x681a: 0x40250820, 0x681b: 0x40250a20, - 0x681c: 0x40250c20, 0x681d: 0x40250e20, 0x681e: 0x40251020, 0x681f: 0x40251220, - 0x6820: 0x40251420, 0x6821: 0x40251620, 0x6822: 0x40251820, 0x6823: 0x40251a20, - 0x6824: 0x40251c20, 0x6825: 0x40251e20, 0x6826: 0x40252020, 0x6827: 0x40252220, - // Block 0x1a1, offset 0x6840 - 0x687b: 0x40252420, - 0x687c: 0x40252620, 0x687d: 0x40252820, 0x687e: 0x40252a20, 0x687f: 0x40252c20, - // Block 0x1a2, offset 0x6880 - 0x6880: 0x40252e20, 0x6881: 0x40253020, 0x6882: 0x40253220, 0x6883: 0x40253420, - 0x6884: 0x40253620, 0x6885: 0x40253820, 0x6886: 0x40253a20, 0x6887: 0x40253c20, - 0x6888: 0x40253e20, 0x6889: 0x40254020, 0x688a: 0x40254220, 0x688b: 0x40254420, - 0x688c: 0x40254620, 0x688d: 0x40254820, 0x688e: 0x40254a20, 0x688f: 0x40254c20, - 0x6890: 0x40254e20, 0x6891: 0x40255020, 0x6892: 0x40255220, 0x6893: 0x40255420, - 0x6894: 0x40255620, 0x6895: 0x40255820, 0x6896: 0x40255a20, 0x6897: 0x40255c20, - 0x6898: 0x40255e20, 0x6899: 0x40256020, 0x689a: 0x40256220, 0x689b: 0x40256420, - 0x689c: 0x40256620, 0x689d: 0x40256820, 0x689e: 0x40256a20, 0x689f: 0x40256c20, - 0x68a0: 0x40256e20, 0x68a1: 0x40257020, 0x68a2: 0x40257220, 0x68a3: 0x40257420, - 0x68a4: 0x40257620, 0x68a5: 0x40257820, 0x68a6: 0x40257a20, 0x68a7: 0x40257c20, - 0x68a8: 0x40257e20, 0x68a9: 0x40258020, 0x68aa: 0x40258220, 0x68ab: 0x40258420, - 0x68ac: 0x40258620, 0x68ad: 0x40258820, 0x68ae: 0x40258a20, 0x68af: 0x40258c20, - 0x68b0: 0x40258e20, 0x68b1: 0x40259020, 0x68b2: 0x40259220, 0x68b3: 0x40259420, - 0x68b4: 0x40259620, 0x68b5: 0x40259820, 0x68b6: 0x40259a20, 0x68b7: 0x40259c20, - 0x68b8: 0x40259e20, 0x68b9: 0x4025a020, 0x68ba: 0x4025a220, 0x68bb: 0x4025a420, - 0x68bc: 0x4025a620, 0x68bd: 0x4025a820, 0x68be: 0x4025aa20, 0x68bf: 0x4025ac20, - // Block 0x1a3, offset 0x68c0 - 0x68c0: 0x4025ae20, - 0x68c5: 0x4025b020, 0x68c6: 0x4025b220, 0x68c7: 0x4025b420, - 0x68c8: 0x4025b620, 0x68c9: 0x4025b820, 0x68ca: 0x4025ba20, 0x68cb: 0x4025bc20, - 0x68cc: 0x4025be20, 0x68cd: 0x4025c020, 0x68ce: 0x4025c220, 0x68cf: 0x4025c420, - // Block 0x1a4, offset 0x6900 - 0x6900: 0x4025c620, 0x6901: 0x4025c820, 0x6902: 0x4025ca20, 0x6903: 0x4025cc20, - 0x6904: 0x4025ce20, 0x6905: 0x4025d020, 0x6906: 0x4025d220, 0x6907: 0x4025d420, - 0x6908: 0x4025d620, 0x6909: 0x4025d820, 0x690a: 0x4025da20, 0x690b: 0x4025dc20, - 0x690c: 0x4025de20, 0x690d: 0x4025e020, 0x690e: 0x4025e220, 0x690f: 0x4025e420, - 0x6910: 0x4025e620, 0x6911: 0x4025e820, 0x6912: 0x4025ea20, 0x6913: 0x4025ec20, - 0x6914: 0x4025ee20, 0x6915: 0x4025f020, 0x6916: 0x4025f220, 0x6917: 0x4025f420, - 0x6918: 0x4025f620, 0x6919: 0x4025f820, 0x691a: 0x4025fa20, 0x691b: 0x4025fc20, - 0x691c: 0x4025fe20, 0x691d: 0x40260020, 0x691e: 0x40260220, 0x691f: 0x40260420, - 0x6920: 0x40260620, 0x6921: 0x40260820, 0x6922: 0x40260a20, 0x6923: 0x40260c20, - 0x6924: 0x40260e20, 0x6925: 0x40261020, 0x6926: 0x40261220, 0x6927: 0x40261420, - 0x6928: 0x40261620, 0x6929: 0x40261820, 0x692a: 0x40261a20, 0x692b: 0x40261c20, - 0x692c: 0x40261e20, 0x692d: 0x40262020, 0x692e: 0x40262220, 0x692f: 0x40262420, - 0x6930: 0x40262620, 0x6931: 0x40262820, 0x6932: 0x40262a20, 0x6933: 0x40262c20, - 0x6934: 0x40262e20, 0x6935: 0x40263020, 0x6936: 0x40263220, 0x6937: 0x40263420, - 0x6938: 0x40263620, 0x6939: 0x40263820, 0x693a: 0x40263a20, 0x693b: 0x40263c20, - 0x693c: 0x40263e20, 0x693d: 0x40264020, 0x693e: 0x40264220, 0x693f: 0x40264420, - // Block 0x1a5, offset 0x6940 - 0x6940: 0x40264620, 0x6941: 0x40264820, 0x6942: 0x40264a20, 0x6943: 0x40264c20, - 0x6944: 0x40264e20, 0x6945: 0x40265020, - // Block 0x1a6, offset 0x6980 - 0x6980: 0x40265220, 0x6981: 0x40265420, 0x6982: 0x40265620, 0x6983: 0x40265820, - 0x6984: 0x40265a20, 0x6985: 0x40265c20, 0x6986: 0x40265e20, 0x6987: 0x40266020, - 0x6988: 0x40266220, 0x6989: 0x40266420, 0x698a: 0x40266620, 0x698b: 0x40266820, - 0x698c: 0x40266a20, 0x698d: 0x40266c20, 0x698e: 0x40266e20, 0x698f: 0x40267020, - 0x6990: 0x40267220, 0x6991: 0x40267420, 0x6992: 0x40267620, 0x6993: 0x40267820, - 0x6994: 0x40267a20, 0x6995: 0x40267c20, 0x6996: 0x40267e20, 0x6997: 0x40268020, - 0x6998: 0x40268220, 0x6999: 0x40268420, 0x699a: 0x40268620, 0x699b: 0x40268820, - 0x699c: 0x40268a20, 0x699d: 0x40268c20, 0x699e: 0x40268e20, 0x699f: 0x40269020, - 0x69a0: 0x40269220, 0x69a1: 0x40269420, 0x69a2: 0x40269620, 0x69a3: 0x40269820, - 0x69a4: 0x40269a20, 0x69a5: 0x40269c20, 0x69a6: 0x40269e20, 0x69a7: 0x4026a020, - 0x69a8: 0x4026a220, 0x69a9: 0x4026a420, 0x69aa: 0x4026a620, 0x69ab: 0x4026a820, - 0x69ac: 0x4026aa20, 0x69ad: 0x4026ac20, 0x69ae: 0x4026ae20, 0x69af: 0x4026b020, - 0x69b0: 0x4026b220, 0x69b1: 0x4026b420, 0x69b2: 0x4026b620, 0x69b3: 0x4026b820, - 0x69b4: 0x4026ba20, 0x69b5: 0x4026bc20, 0x69b6: 0x4026be20, 0x69b7: 0x4026c020, - 0x69b8: 0x4026c220, 0x69b9: 0x4026c420, 0x69ba: 0x4026c620, 0x69bb: 0x4026c820, - 0x69bc: 0x4026ca20, 0x69bd: 0x4026cc20, 0x69be: 0x4026ce20, 0x69bf: 0x4026d020, - // Block 0x1a7, offset 0x69c0 - 0x69c0: 0x4026d220, 0x69c1: 0x4026d420, 0x69c2: 0x4026d620, 0x69c3: 0x4026d820, - 0x69c4: 0x4026da20, 0x69c5: 0x4026dc20, 0x69c6: 0x4026de20, 0x69c7: 0x4026e020, - 0x69c8: 0x4026e220, 0x69c9: 0x4026e420, 0x69ca: 0x4026e620, 0x69cb: 0x4026e820, - 0x69cc: 0x4026ea20, 0x69cd: 0x4026ec20, 0x69ce: 0x4026ee20, 0x69cf: 0x4026f020, - 0x69d0: 0x4026f220, 0x69d1: 0x4026f420, 0x69d2: 0x4026f620, 0x69d3: 0x4026f820, - 0x69d4: 0x4026fa20, 0x69d5: 0x4026fc20, 0x69d6: 0x4026fe20, 0x69d7: 0x40270020, - 0x69d8: 0x40270220, 0x69d9: 0x40270420, 0x69da: 0x40270620, 0x69db: 0x40270820, - 0x69dc: 0x40270a20, 0x69dd: 0x40270c20, 0x69de: 0x40270e20, 0x69df: 0x40271020, - 0x69e0: 0x40271220, 0x69e1: 0x40271420, 0x69e2: 0x40271620, 0x69e3: 0x40271820, - 0x69e4: 0x40271a20, 0x69e5: 0x40271c20, 0x69e6: 0x40271e20, 0x69e7: 0x40272020, - 0x69e8: 0x40272220, 0x69e9: 0x40272420, 0x69ea: 0x40272620, 0x69eb: 0x40272820, - 0x69ec: 0x40272a20, 0x69ed: 0x40272c20, 0x69ee: 0x40272e20, 0x69ef: 0x40273020, - 0x69f0: 0x40273220, 0x69f1: 0x40273420, 0x69f2: 0x40273620, 0x69f3: 0x40273820, - // Block 0x1a8, offset 0x6a00 - 0x6a00: 0x429c7a20, 0x6a01: 0x429c7020, 0x6a02: 0x429c8220, 0x6a03: 0x48024420, - 0x6a04: 0x429ec020, 0x6a05: 0x429f5c20, 0x6a06: 0x429f7620, 0x6a07: 0x42a00420, - 0x6a08: 0x42a0f420, 0x6a09: 0x42a13220, 0x6a0a: 0x42a1ce20, 0x6a0b: 0x42a19e20, - 0x6a0c: 0x44693c20, 0x6a0d: 0x480c7420, 0x6a0e: 0x42a29a20, 0x6a0f: 0x42a2a820, - 0x6a10: 0x42a2c820, 0x6a11: 0x42a2ee20, 0x6a12: 0x480a3820, 0x6a13: 0x44697220, - 0x6a14: 0x42a2ce20, 0x6a15: 0x42a31a20, 0x6a16: 0x480a9620, 0x6a17: 0x42a32e20, - 0x6a18: 0x42a34820, 0x6a19: 0x429d9820, 0x6a1a: 0x42a35820, 0x6a1b: 0x42a36a20, - 0x6a1c: 0x4923be20, 0x6a1d: 0x42a3ea20, 0x6a1e: 0x42a40620, 0x6a1f: 0x4469be20, - 0x6a20: 0x42a47620, 0x6a21: 0x42a48c20, 0x6a22: 0x42a4e420, 0x6a23: 0x42a4ee20, - 0x6a24: 0x446a2a20, 0x6a25: 0x42a58e20, 0x6a26: 0x42a59220, 0x6a27: 0x42a5c820, - 0x6a28: 0x42a5f420, 0x6a29: 0x42a60a20, 0x6a2a: 0x42a60c20, 0x6a2b: 0x42a62e20, - 0x6a2c: 0x42a69220, 0x6a2d: 0x42a6a220, 0x6a2e: 0x42a6b420, 0x6a2f: 0x42a6e620, - 0x6a30: 0x42a6fa20, 0x6a31: 0x42a6fe20, 0x6a32: 0x42a6fe20, 0x6a33: 0x42a6fe20, - 0x6a34: 0x48145820, 0x6a35: 0x42e0e020, 0x6a36: 0x42a79420, 0x6a37: 0x42a7be20, - 0x6a38: 0x4816c620, 0x6a39: 0x42a7d620, 0x6a3a: 0x42a7e220, 0x6a3b: 0x42a80c20, - 0x6a3c: 0x42a93c20, 0x6a3d: 0x42a87020, 0x6a3e: 0x42a89020, 0x6a3f: 0x42a8d020, - // Block 0x1a9, offset 0x6a40 - 0x6a40: 0x42a94420, 0x6a41: 0x42a9ec20, 0x6a42: 0x42aa2020, 0x6a43: 0x42aaa620, - 0x6a44: 0x42aac620, 0x6a45: 0x42ab0820, 0x6a46: 0x42ab0820, 0x6a47: 0x42ab3220, - 0x6a48: 0x42ab5620, 0x6a49: 0x42ab6620, 0x6a4a: 0x42ab8420, 0x6a4b: 0x42ae2c20, - 0x6a4c: 0x42ac0c20, 0x6a4d: 0x42ae2e20, 0x6a4e: 0x42aca220, 0x6a4f: 0x42ace820, - 0x6a50: 0x42a40e20, 0x6a51: 0x42b1dc20, 0x6a52: 0x42af9c20, 0x6a53: 0x42afe820, - 0x6a54: 0x42b01a20, 0x6a55: 0x42af1620, 0x6a56: 0x42b06420, 0x6a57: 0x42b06220, - 0x6a58: 0x42b15820, 0x6a59: 0x4829c820, 0x6a5a: 0x42b1e420, 0x6a5b: 0x42b1ee20, - 0x6a5c: 0x42b20c20, 0x6a5d: 0x42b23420, 0x6a5e: 0x42b24420, 0x6a5f: 0x42b2c420, - 0x6a60: 0x482d5020, 0x6a61: 0x482dd420, 0x6a62: 0x42b3d820, 0x6a63: 0x42b43620, - 0x6a64: 0x42b44e20, 0x6a65: 0x42b3b020, 0x6a66: 0x42b4cc20, 0x6a67: 0x446ddc20, - 0x6a68: 0x446df820, 0x6a69: 0x42b61020, 0x6a6a: 0x42b67c20, 0x6a6b: 0x42b67c20, - 0x6a6c: 0x48339020, 0x6a6d: 0x42b78620, 0x6a6e: 0x42b7b020, 0x6a6f: 0x42b7ce20, - 0x6a70: 0x42b7e620, 0x6a71: 0x48363020, 0x6a72: 0x42b7fe20, 0x6a73: 0x42b80c20, - 0x6a74: 0x42bea620, 0x6a75: 0x42b84420, 0x6a76: 0x446f0220, 0x6a77: 0x42b8c020, - 0x6a78: 0x42b8dc20, 0x6a79: 0x42b98020, 0x6a7a: 0x42b91a20, 0x6a7b: 0x483bc820, - 0x6a7c: 0x42ba8620, 0x6a7d: 0x483bcc20, 0x6a7e: 0x42badc20, 0x6a7f: 0x42bad620, - // Block 0x1aa, offset 0x6a80 - 0x6a80: 0x42baf820, 0x6a81: 0x42bbc220, 0x6a82: 0x42bbc420, 0x6a83: 0x44705e20, - 0x6a84: 0x42bbfa20, 0x6a85: 0x42bc5020, 0x6a86: 0x42bc7a20, 0x6a87: 0x42bcd220, - 0x6a88: 0x4470c420, 0x6a89: 0x48430620, 0x6a8a: 0x4470f820, 0x6a8b: 0x42bd6020, - 0x6a8c: 0x42bd6620, 0x6a8d: 0x42bd6c20, 0x6a8e: 0x42bd9420, 0x6a8f: 0x49472420, - 0x6a90: 0x42bdfc20, 0x6a91: 0x48466220, 0x6a92: 0x48466220, 0x6a93: 0x43040220, - 0x6a94: 0x42be4420, 0x6a95: 0x42be4420, 0x6a96: 0x44718e20, 0x6a97: 0x48657020, - 0x6a98: 0x48c3b420, 0x6a99: 0x42bec420, 0x6a9a: 0x42bed620, 0x6a9b: 0x4471c620, - 0x6a9c: 0x42bf3420, 0x6a9d: 0x42bf9a20, 0x6a9e: 0x42bfae20, 0x6a9f: 0x42bff220, - 0x6aa0: 0x42c10220, 0x6aa1: 0x44727420, 0x6aa2: 0x44723820, 0x6aa3: 0x42c12820, - 0x6aa4: 0x484da820, 0x6aa5: 0x42c18e20, 0x6aa6: 0x42c29020, 0x6aa7: 0x42c29820, - 0x6aa8: 0x42c29c20, 0x6aa9: 0x42c29820, 0x6aaa: 0x42c2f420, 0x6aab: 0x42c31c20, - 0x6aac: 0x42c36420, 0x6aad: 0x42c34820, 0x6aae: 0x42c35e20, 0x6aaf: 0x42c3bc20, - 0x6ab0: 0x42c3e420, 0x6ab1: 0x42c3ec20, 0x6ab2: 0x42c42020, 0x6ab3: 0x42c43620, - 0x6ab4: 0x42c4ba20, 0x6ab5: 0x42c56220, 0x6ab6: 0x42c5a820, 0x6ab7: 0x42c6a020, - 0x6ab8: 0x48561820, 0x6ab9: 0x42c67a20, 0x6aba: 0x42c5f820, 0x6abb: 0x42c6d020, - 0x6abc: 0x42c70620, 0x6abd: 0x42c7c820, 0x6abe: 0x4857e220, 0x6abf: 0x42c84420, - // Block 0x1ab, offset 0x6ac0 - 0x6ac0: 0x42c78a20, 0x6ac1: 0x42c75220, 0x6ac2: 0x44745c20, 0x6ac3: 0x42c8d220, - 0x6ac4: 0x42c8fc20, 0x6ac5: 0x42c93a20, 0x6ac6: 0x42c8ee20, 0x6ac7: 0x4474d820, - 0x6ac8: 0x42ca9e20, 0x6ac9: 0x42cad820, 0x6aca: 0x48601420, 0x6acb: 0x42cbc620, - 0x6acc: 0x42cdf020, 0x6acd: 0x42cc9220, 0x6ace: 0x44763220, 0x6acf: 0x42cd2220, - 0x6ad0: 0x44761020, 0x6ad1: 0x4475c820, 0x6ad2: 0x42a32420, 0x6ad3: 0x42a32a20, - 0x6ad4: 0x42ce0020, 0x6ad5: 0x42cd3820, 0x6ad6: 0x43015a20, 0x6ad7: 0x4487b220, - 0x6ad8: 0x42ce2e20, 0x6ad9: 0x42ce3620, 0x6ada: 0x42ce4220, 0x6adb: 0x42cebc20, - 0x6adc: 0x42cea620, 0x6add: 0x48678620, 0x6ade: 0x44769220, 0x6adf: 0x42cff420, - 0x6ae0: 0x42cf0a20, 0x6ae1: 0x42d0a420, 0x6ae2: 0x42d10a20, 0x6ae3: 0x4868da20, - 0x6ae4: 0x42d11c20, 0x6ae5: 0x42d03e20, 0x6ae6: 0x42d22820, 0x6ae7: 0x44773a20, - 0x6ae8: 0x42d28420, 0x6ae9: 0x42d34620, 0x6aea: 0x42d3d420, 0x6aeb: 0x42d55020, - 0x6aec: 0x486d4620, 0x6aed: 0x42d5b620, 0x6aee: 0x44783020, 0x6aef: 0x42d64220, - 0x6af0: 0x48714e20, 0x6af1: 0x42d6a820, 0x6af2: 0x44789c20, 0x6af3: 0x42d6e420, - 0x6af4: 0x42d73e20, 0x6af5: 0x42d77420, 0x6af6: 0x42d77620, 0x6af7: 0x48751a20, - 0x6af8: 0x483a1620, 0x6af9: 0x4875f420, 0x6afa: 0x42d89c20, 0x6afb: 0x48797820, - 0x6afc: 0x42d97e20, 0x6afd: 0x42d99a20, 0x6afe: 0x42d8ce20, 0x6aff: 0x42da2c20, - // Block 0x1ac, offset 0x6b00 - 0x6b00: 0x42da7c20, 0x6b01: 0x42daee20, 0x6b02: 0x42da8220, 0x6b03: 0x42dad220, - 0x6b04: 0x42daf020, 0x6b05: 0x42db0a20, 0x6b06: 0x487a3c20, 0x6b07: 0x42da6820, - 0x6b08: 0x42dc5e20, 0x6b09: 0x42dcdc20, 0x6b0a: 0x447a6620, 0x6b0b: 0x42dd9620, - 0x6b0c: 0x42dd8e20, 0x6b0d: 0x487da220, 0x6b0e: 0x42dbf220, 0x6b0f: 0x42dedc20, - 0x6b10: 0x487ebc20, 0x6b11: 0x487f1c20, 0x6b12: 0x42df8c20, 0x6b13: 0x42e07220, - 0x6b14: 0x42e03c20, 0x6b15: 0x42e03620, 0x6b16: 0x447b2c20, 0x6b17: 0x42e09420, - 0x6b18: 0x42e0fa20, 0x6b19: 0x42e0ee20, 0x6b1a: 0x42e15a20, 0x6b1b: 0x480a4a20, - 0x6b1c: 0x42e28a20, 0x6b1d: 0x4884c620, 0x6b1e: 0x42e33820, 0x6b1f: 0x48875620, - 0x6b20: 0x42e45020, 0x6b21: 0x42e46a20, 0x6b22: 0x42e4a020, 0x6b23: 0x488c1020, - 0x6b24: 0x42e50020, 0x6b25: 0x42e52a20, 0x6b26: 0x488e6a20, 0x6b27: 0x48902820, - 0x6b28: 0x42e6f420, 0x6b29: 0x42e71620, 0x6b2a: 0x447d5820, 0x6b2b: 0x42e74a20, - 0x6b2c: 0x447d7020, 0x6b2d: 0x447d7020, 0x6b2e: 0x42e88e20, 0x6b2f: 0x42e8b820, - 0x6b30: 0x42e8e220, 0x6b31: 0x42e90a20, 0x6b32: 0x42e99420, 0x6b33: 0x447e3620, - 0x6b34: 0x42ea4820, 0x6b35: 0x48986c20, 0x6b36: 0x42ea7c20, 0x6b37: 0x48992420, - 0x6b38: 0x42eae020, 0x6b39: 0x48433e20, 0x6b3a: 0x42ec2020, 0x6b3b: 0x489f4220, - 0x6b3c: 0x489f7020, 0x6b3d: 0x48a08820, 0x6b3e: 0x447ff820, 0x6b3f: 0x44801020, - // Block 0x1ad, offset 0x6b40 - 0x6b40: 0x42ede820, 0x6b41: 0x48a1e620, 0x6b42: 0x48a1e420, 0x6b43: 0x48a23220, - 0x6b44: 0x48a26620, 0x6b45: 0x42ee3c20, 0x6b46: 0x42ee3e20, 0x6b47: 0x42ee3e20, - 0x6b48: 0x42ee9420, 0x6b49: 0x44807220, 0x6b4a: 0x42ef1620, 0x6b4b: 0x44808c20, - 0x6b4c: 0x44812c20, 0x6b4d: 0x48a83a20, 0x6b4e: 0x42f09c20, 0x6b4f: 0x42f11820, - 0x6b50: 0x42f19820, 0x6b51: 0x4481c620, 0x6b52: 0x48ac4c20, 0x6b53: 0x42f2ac20, - 0x6b54: 0x48ad3420, 0x6b55: 0x48ad8a20, 0x6b56: 0x42f31e20, 0x6b57: 0x42f3d620, - 0x6b58: 0x44825e20, 0x6b59: 0x42f48020, 0x6b5a: 0x42f49420, 0x6b5b: 0x42f49e20, - 0x6b5c: 0x48b2f820, 0x6b5d: 0x48b54e20, 0x6b5e: 0x48b54e20, 0x6b5f: 0x42f5dc20, - 0x6b60: 0x44840420, 0x6b61: 0x48b75620, 0x6b62: 0x42f78c20, 0x6b63: 0x42f79220, - 0x6b64: 0x44844e20, 0x6b65: 0x48b90020, 0x6b66: 0x42f9a420, 0x6b67: 0x44854020, - 0x6b68: 0x42f9d020, 0x6b69: 0x42f9c620, 0x6b6a: 0x42fa0020, 0x6b6b: 0x48bf0c20, - 0x6b6c: 0x42fac620, 0x6b6d: 0x44860220, 0x6b6e: 0x42fb8e20, 0x6b6f: 0x42fc0420, - 0x6b70: 0x42fc8a20, 0x6b71: 0x44866820, 0x6b72: 0x48c45020, 0x6b73: 0x48c48e20, - 0x6b74: 0x4486b220, 0x6b75: 0x48c5b220, 0x6b76: 0x42fef420, 0x6b77: 0x48c67c20, - 0x6b78: 0x42ff2a20, 0x6b79: 0x42fff420, 0x6b7a: 0x43000a20, 0x6b7b: 0x48c9b420, - 0x6b7c: 0x48ca4620, 0x6b7d: 0x4300c020, 0x6b7e: 0x48cb5020, 0x6b7f: 0x4300e020, - // Block 0x1ae, offset 0x6b80 - 0x6b80: 0x4866be20, 0x6b81: 0x4487aa20, 0x6b82: 0x43016420, 0x6b83: 0x43020620, - 0x6b84: 0x44881620, 0x6b85: 0x43027c20, 0x6b86: 0x42b56a20, 0x6b87: 0x48cf4e20, - 0x6b88: 0x48cf6a20, 0x6b89: 0x48672620, 0x6b8a: 0x48673820, 0x6b8b: 0x43040220, - 0x6b8c: 0x43040820, 0x6b8d: 0x431f3c20, 0x6b8e: 0x4488d620, 0x6b8f: 0x43052220, - 0x6b90: 0x43051620, 0x6b91: 0x43053a20, 0x6b92: 0x42a56620, 0x6b93: 0x43056220, - 0x6b94: 0x43056620, 0x6b95: 0x43057a20, 0x6b96: 0x4305cc20, 0x6b97: 0x48d67820, - 0x6b98: 0x4305ca20, 0x6b99: 0x43063a20, 0x6b9a: 0x4306c620, 0x6b9b: 0x43075a20, - 0x6b9c: 0x43064620, 0x6b9d: 0x43077a20, 0x6b9e: 0x4307ce20, 0x6b9f: 0x4308ae20, - 0x6ba0: 0x4306a620, 0x6ba1: 0x43079420, 0x6ba2: 0x43079820, 0x6ba3: 0x4307b820, - 0x6ba4: 0x48d86c20, 0x6ba5: 0x48dad620, 0x6ba6: 0x48d9aa20, 0x6ba7: 0x448a5620, - 0x6ba8: 0x4309e220, 0x6ba9: 0x4309e620, 0x6baa: 0x430a2c20, 0x6bab: 0x48e79420, - 0x6bac: 0x430ac820, 0x6bad: 0x48de5820, 0x6bae: 0x448aba20, 0x6baf: 0x448ac220, - 0x6bb0: 0x48df6220, 0x6bb1: 0x48e1a420, 0x6bb2: 0x448ad620, 0x6bb3: 0x430ca020, - 0x6bb4: 0x430cb820, 0x6bb5: 0x430cce20, 0x6bb6: 0x430cd220, 0x6bb7: 0x430d5220, - 0x6bb8: 0x430d1020, 0x6bb9: 0x430e1c20, 0x6bba: 0x430dc420, 0x6bbb: 0x430ef220, - 0x6bbc: 0x430e5020, 0x6bbd: 0x430ed620, 0x6bbe: 0x430f0c20, 0x6bbf: 0x448bae20, - // Block 0x1af, offset 0x6bc0 - 0x6bc0: 0x430fc220, 0x6bc1: 0x43100220, 0x6bc2: 0x448bf220, 0x6bc3: 0x4310c020, - 0x6bc4: 0x4310c620, 0x6bc5: 0x48ecce20, 0x6bc6: 0x4311ae20, 0x6bc7: 0x4311bc20, - 0x6bc8: 0x448c6a20, 0x6bc9: 0x4311f420, 0x6bca: 0x44697620, 0x6bcb: 0x48f15c20, - 0x6bcc: 0x48f2cc20, 0x6bcd: 0x448d7c20, 0x6bce: 0x448d8e20, 0x6bcf: 0x43154020, - 0x6bd0: 0x4315da20, 0x6bd1: 0x43171420, 0x6bd2: 0x4318aa20, 0x6bd3: 0x48f95020, - 0x6bd4: 0x43195620, 0x6bd5: 0x43198220, 0x6bd6: 0x431a3620, 0x6bd7: 0x431aee20, - 0x6bd8: 0x48fe5e20, 0x6bd9: 0x48100820, 0x6bda: 0x431b9620, 0x6bdb: 0x431b7820, - 0x6bdc: 0x431be020, 0x6bdd: 0x4811bc20, 0x6bde: 0x431da820, 0x6bdf: 0x431e7020, - 0x6be0: 0x490ba420, 0x6be1: 0x490bda20, 0x6be2: 0x43212820, 0x6be3: 0x4321e220, - 0x6be4: 0x43222220, 0x6be5: 0x490e5c20, 0x6be6: 0x43223620, 0x6be7: 0x43247020, - 0x6be8: 0x4325ae20, 0x6be9: 0x4325b020, 0x6bea: 0x4324f820, 0x6beb: 0x4327f220, - 0x6bec: 0x43282a20, 0x6bed: 0x4917f420, 0x6bee: 0x432b1620, 0x6bef: 0x44932a20, - 0x6bf0: 0x432b6e20, 0x6bf1: 0x491aee20, 0x6bf2: 0x4493cc20, 0x6bf3: 0x432d8620, - 0x6bf4: 0x42bb6420, 0x6bf5: 0x432e4620, 0x6bf6: 0x49228a20, 0x6bf7: 0x49243420, - 0x6bf8: 0x4494dc20, 0x6bf9: 0x4494ec20, 0x6bfa: 0x432fc020, 0x6bfb: 0x49281420, - 0x6bfc: 0x44956420, 0x6bfd: 0x49292c20, 0x6bfe: 0x43301620, 0x6bff: 0x43301620, - // Block 0x1b0, offset 0x6c00 - 0x6c00: 0x43305220, 0x6c01: 0x492b6c20, 0x6c02: 0x4331c420, 0x6c03: 0x44966620, - 0x6c04: 0x43325220, 0x6c05: 0x43334e20, 0x6c06: 0x43338420, 0x6c07: 0x4333fc20, - 0x6c08: 0x44979c20, 0x6c09: 0x49366020, 0x6c0a: 0x43362420, 0x6c0b: 0x43388020, - 0x6c0c: 0x4339fa20, 0x6c0d: 0x44999c20, 0x6c0e: 0x4499da20, 0x6c0f: 0x433ace20, - 0x6c10: 0x49419c20, 0x6c11: 0x4499f020, 0x6c12: 0x49420a20, 0x6c13: 0x49441c20, - 0x6c14: 0x49452220, 0x6c15: 0x433d7620, 0x6c16: 0x449aac20, 0x6c17: 0x433df220, - 0x6c18: 0x433dfc20, 0x6c19: 0x433e0a20, 0x6c1a: 0x433e1e20, 0x6c1b: 0x433e2c20, - 0x6c1c: 0x433e7620, 0x6c1d: 0x494c0020, - // Block 0x1b1, offset 0x6c40 - 0x6c41: 0xa0000000, - 0x6c60: 0xa0000000, 0x6c61: 0xa0000000, 0x6c62: 0xa0000000, 0x6c63: 0xa0000000, - 0x6c64: 0xa0000000, 0x6c65: 0xa0000000, 0x6c66: 0xa0000000, 0x6c67: 0xa0000000, - 0x6c68: 0xa0000000, 0x6c69: 0xa0000000, 0x6c6a: 0xa0000000, 0x6c6b: 0xa0000000, - 0x6c6c: 0xa0000000, 0x6c6d: 0xa0000000, 0x6c6e: 0xa0000000, 0x6c6f: 0xa0000000, - 0x6c70: 0xa0000000, 0x6c71: 0xa0000000, 0x6c72: 0xa0000000, 0x6c73: 0xa0000000, - 0x6c74: 0xa0000000, 0x6c75: 0xa0000000, 0x6c76: 0xa0000000, 0x6c77: 0xa0000000, - 0x6c78: 0xa0000000, 0x6c79: 0xa0000000, 0x6c7a: 0xa0000000, 0x6c7b: 0xa0000000, - 0x6c7c: 0xa0000000, 0x6c7d: 0xa0000000, 0x6c7e: 0xa0000000, 0x6c7f: 0xa0000000, - // Block 0x1b2, offset 0x6c80 - 0x6c80: 0xa0000000, 0x6c81: 0xa0000000, 0x6c82: 0xa0000000, 0x6c83: 0xa0000000, - 0x6c84: 0xa0000000, 0x6c85: 0xa0000000, 0x6c86: 0xa0000000, 0x6c87: 0xa0000000, - 0x6c88: 0xa0000000, 0x6c89: 0xa0000000, 0x6c8a: 0xa0000000, 0x6c8b: 0xa0000000, - 0x6c8c: 0xa0000000, 0x6c8d: 0xa0000000, 0x6c8e: 0xa0000000, 0x6c8f: 0xa0000000, - 0x6c90: 0xa0000000, 0x6c91: 0xa0000000, 0x6c92: 0xa0000000, 0x6c93: 0xa0000000, - 0x6c94: 0xa0000000, 0x6c95: 0xa0000000, 0x6c96: 0xa0000000, 0x6c97: 0xa0000000, - 0x6c98: 0xa0000000, 0x6c99: 0xa0000000, 0x6c9a: 0xa0000000, 0x6c9b: 0xa0000000, - 0x6c9c: 0xa0000000, 0x6c9d: 0xa0000000, 0x6c9e: 0xa0000000, 0x6c9f: 0xa0000000, - 0x6ca0: 0xa0000000, 0x6ca1: 0xa0000000, 0x6ca2: 0xa0000000, 0x6ca3: 0xa0000000, - 0x6ca4: 0xa0000000, 0x6ca5: 0xa0000000, 0x6ca6: 0xa0000000, 0x6ca7: 0xa0000000, - 0x6ca8: 0xa0000000, 0x6ca9: 0xa0000000, 0x6caa: 0xa0000000, 0x6cab: 0xa0000000, - 0x6cac: 0xa0000000, 0x6cad: 0xa0000000, 0x6cae: 0xa0000000, 0x6caf: 0xa0000000, - 0x6cb0: 0xa0000000, 0x6cb1: 0xa0000000, 0x6cb2: 0xa0000000, 0x6cb3: 0xa0000000, - 0x6cb4: 0xa0000000, 0x6cb5: 0xa0000000, 0x6cb6: 0xa0000000, 0x6cb7: 0xa0000000, - 0x6cb8: 0xa0000000, 0x6cb9: 0xa0000000, 0x6cba: 0xa0000000, 0x6cbb: 0xa0000000, - 0x6cbc: 0xa0000000, 0x6cbd: 0xa0000000, 0x6cbe: 0xa0000000, 0x6cbf: 0xa0000000, - // Block 0x1b3, offset 0x6cc0 - 0x6cc0: 0xa0000000, 0x6cc1: 0xa0000000, 0x6cc2: 0xa0000000, 0x6cc3: 0xa0000000, - 0x6cc4: 0xa0000000, 0x6cc5: 0xa0000000, 0x6cc6: 0xa0000000, 0x6cc7: 0xa0000000, - 0x6cc8: 0xa0000000, 0x6cc9: 0xa0000000, 0x6cca: 0xa0000000, 0x6ccb: 0xa0000000, - 0x6ccc: 0xa0000000, 0x6ccd: 0xa0000000, 0x6cce: 0xa0000000, 0x6ccf: 0xa0000000, - 0x6cd0: 0xa0000000, 0x6cd1: 0xa0000000, 0x6cd2: 0xa0000000, 0x6cd3: 0xa0000000, - 0x6cd4: 0xa0000000, 0x6cd5: 0xa0000000, 0x6cd6: 0xa0000000, 0x6cd7: 0xa0000000, - 0x6cd8: 0xa0000000, 0x6cd9: 0xa0000000, 0x6cda: 0xa0000000, 0x6cdb: 0xa0000000, - 0x6cdc: 0xa0000000, 0x6cdd: 0xa0000000, 0x6cde: 0xa0000000, 0x6cdf: 0xa0000000, - 0x6ce0: 0xa0000000, 0x6ce1: 0xa0000000, 0x6ce2: 0xa0000000, 0x6ce3: 0xa0000000, - 0x6ce4: 0xa0000000, 0x6ce5: 0xa0000000, 0x6ce6: 0xa0000000, 0x6ce7: 0xa0000000, - 0x6ce8: 0xa0000000, 0x6ce9: 0xa0000000, 0x6cea: 0xa0000000, 0x6ceb: 0xa0000000, - 0x6cec: 0xa0000000, 0x6ced: 0xa0000000, 0x6cee: 0xa0000000, 0x6cef: 0xa0000000, - // Block 0x1b4, offset 0x6d00 - 0x6d00: 0xa0000000, 0x6d01: 0xa0000000, 0x6d02: 0xa0000000, 0x6d03: 0xa0000000, - 0x6d04: 0xa0000000, 0x6d05: 0xa0000000, 0x6d06: 0xa0000000, 0x6d07: 0xa0000000, - 0x6d08: 0xa0000000, 0x6d09: 0x40020020, 0x6d0a: 0x40020220, 0x6d0b: 0x40020420, - 0x6d0c: 0x40020620, 0x6d0d: 0x40020820, 0x6d0e: 0xa0000000, 0x6d0f: 0xa0000000, - 0x6d10: 0xa0000000, 0x6d11: 0xa0000000, 0x6d12: 0xa0000000, 0x6d13: 0xa0000000, - 0x6d14: 0xa0000000, 0x6d15: 0xa0000000, 0x6d16: 0xa0000000, 0x6d17: 0xa0000000, - 0x6d18: 0xa0000000, 0x6d19: 0xa0000000, 0x6d1a: 0xa0000000, 0x6d1b: 0xa0000000, - 0x6d1c: 0xa0000000, 0x6d1d: 0xa0000000, 0x6d1e: 0xa0000000, 0x6d1f: 0xa0000000, - 0x6d20: 0x40021220, 0x6d21: 0x4002ba20, 0x6d22: 0x4003e020, 0x6d23: 0x4004ea20, - 0x6d24: 0x4027de20, 0x6d25: 0x4004ec20, 0x6d26: 0x4004e620, 0x6d27: 0x4003d220, - 0x6d28: 0x4003f420, 0x6d29: 0x4003f620, 0x6d2a: 0x4004d820, 0x6d2b: 0x40093820, - 0x6d2c: 0x40024020, 0x6d2d: 0x40021a20, 0x6d2e: 0x4002e420, 0x6d2f: 0x4004e220, - 0x6d30: 0x4029cc20, 0x6d31: 0x4029ce20, 0x6d32: 0x4029d020, 0x6d33: 0x4029d220, - 0x6d34: 0x4029d420, 0x6d35: 0x4029d620, 0x6d36: 0x4029d820, 0x6d37: 0x4029da20, - 0x6d38: 0x4029dc20, 0x6d39: 0x4029de20, 0x6d3a: 0x40026c20, 0x6d3b: 0x40026220, - 0x6d3c: 0x40094020, 0x6d3d: 0x40094220, 0x6d3e: 0x40094420, 0x6d3f: 0x4002c420, - // Block 0x1b5, offset 0x6d40 - 0x6d40: 0x4004d620, 0x6d41: 0x002bde88, 0x6d42: 0x002c0a88, 0x6d43: 0x002c3a88, - 0x6d44: 0x002c6288, 0x6d45: 0x002c1083, 0x6d46: 0x002d0888, 0x6d47: 0x002d2288, - 0x6d48: 0x0030e483, 0x6d49: 0x002c4083, 0x6d4a: 0x002dcc88, 0x6d4b: 0x002c3c83, - 0x6d4c: 0xc0030002, 0x6d4d: 0x002e8288, 0x6d4e: 0x002e9e88, 0x6d4f: 0x002d2483, - 0x6d50: 0x002f2c88, 0x6d51: 0x002c6483, 0x6d52: 0x002c6683, 0x6d53: 0x002c0e83, - 0x6d54: 0x002c0c83, 0x6d55: 0x00306c88, 0x6d56: 0x0030be88, 0x6d57: 0x0030e288, - 0x6d58: 0x002c3e83, 0x6d59: 0x00310088, 0x6d5a: 0x00312a88, 0x6d5b: 0x4003f820, - 0x6d5c: 0x4004e420, 0x6d5d: 0x4003fa20, 0x6d5e: 0x40062420, 0x6d5f: 0x40021620, - 0x6d60: 0x40061e20, 0x6d61: 0x402bde20, 0x6d62: 0x402c0a20, 0x6d63: 0x402c3a20, - 0x6d64: 0x402c6220, 0x6d65: 0x402c1020, 0x6d66: 0x402d0820, 0x6d67: 0x402d2220, - 0x6d68: 0x4030e420, 0x6d69: 0x402c4020, 0x6d6a: 0x402dcc20, 0x6d6b: 0x402c3c20, - 0x6d6c: 0xc0000002, 0x6d6d: 0x402e8220, 0x6d6e: 0x402e9e20, 0x6d6f: 0x402d2420, - 0x6d70: 0x402f2c20, 0x6d71: 0x402c6420, 0x6d72: 0x402c6620, 0x6d73: 0x402c0e20, - 0x6d74: 0x402c0c20, 0x6d75: 0x40306c20, 0x6d76: 0x4030be20, 0x6d77: 0x4030e220, - 0x6d78: 0x402c3e20, 0x6d79: 0x40310020, 0x6d7a: 0x40312a20, 0x6d7b: 0x4003fc20, - 0x6d7c: 0x40094820, 0x6d7d: 0x4003fe20, 0x6d7e: 0x40094c20, 0x6d7f: 0xa0000000, - // Block 0x1b6, offset 0x6d80 - 0x6d80: 0xe00008f5, 0x6d81: 0xe00008ef, 0x6d82: 0xe0000921, 0x6d83: 0xe0000969, - 0x6d84: 0xe000095b, 0x6d85: 0xe000094d, 0x6d86: 0xe00009dd, 0x6d87: 0xe0000a53, - 0x6d88: 0xe000256e, 0x6d89: 0xe0002568, 0x6d8a: 0xe000257a, 0x6d8b: 0xe00025a6, - 0x6d8c: 0xe000263e, 0x6d8d: 0xe0002638, 0x6d8e: 0xe000264a, 0x6d8f: 0xe0002656, - 0x6d90: 0xe0000ab3, 0x6d91: 0xe0000d63, 0x6d92: 0xe00026db, 0x6d93: 0xe00026d5, - 0x6d94: 0xe00026e7, 0x6d95: 0xe0002727, 0x6d96: 0xe0002713, 0x6d97: 0x40093e20, - 0x6d98: 0xe0000e12, 0x6d99: 0xe0000fe1, 0x6d9a: 0xe0000fdb, 0x6d9b: 0xe0000fed, - 0x6d9c: 0xe0000fff, 0x6d9d: 0xe0001102, 0x6d9e: 0x00318888, 0x6d9f: 0xe0000f7b, - 0x6da0: 0xe00008f2, 0x6da1: 0xe00008ec, 0x6da2: 0xe000091e, 0x6da3: 0xe0000966, - 0x6da4: 0xe0000958, 0x6da5: 0xe000094a, 0x6da6: 0xe00009d5, 0x6da7: 0xe0000a4d, - 0x6da8: 0xe000256b, 0x6da9: 0xe0002565, 0x6daa: 0xe0002577, 0x6dab: 0xe00025a3, - 0x6dac: 0xe000263b, 0x6dad: 0xe0002635, 0x6dae: 0xe0002647, 0x6daf: 0xe0002653, - 0x6db0: 0xe0000aad, 0x6db1: 0xe0000d60, 0x6db2: 0xe00026d8, 0x6db3: 0xe00026d2, - 0x6db4: 0xe00026e4, 0x6db5: 0xe0002724, 0x6db6: 0xe0002710, 0x6db7: 0x40093c20, - 0x6db8: 0xe0000e0f, 0x6db9: 0xe0000fde, 0x6dba: 0xe0000fd8, 0x6dbb: 0xe0000fea, - 0x6dbc: 0xe0000ffc, 0x6dbd: 0xe00010ff, 0x6dbe: 0x40318820, 0x6dbf: 0xe0001114, - // Block 0x1b7, offset 0x6dc0 - 0x6dc0: 0xe0000983, 0x6dc1: 0xe0000980, 0x6dc2: 0xe00008fb, 0x6dc3: 0xe00008f8, - 0x6dc4: 0xe000097d, 0x6dc5: 0xe000097a, 0x6dc6: 0xe0000a38, 0x6dc7: 0xe0000a35, - 0x6dc8: 0xe0000a3e, 0x6dc9: 0xe0000a3b, 0x6dca: 0xe0000a4a, 0x6dcb: 0xe0000a47, - 0x6dcc: 0xe0000a44, 0x6dcd: 0xe0000a41, 0x6dce: 0xe0000a86, 0x6dcf: 0xe0000a83, - 0x6dd0: 0xe0000aaa, 0x6dd1: 0xe0000aa7, 0x6dd2: 0xe00025cc, 0x6dd3: 0xe00025c9, - 0x6dd4: 0xe0002574, 0x6dd5: 0xe0002571, 0x6dd6: 0xe00025b2, 0x6dd7: 0xe00025af, - 0x6dd8: 0xe00025c6, 0x6dd9: 0xe00025c3, 0x6dda: 0xe00025a0, 0x6ddb: 0xe000259d, - 0x6ddc: 0xe0000bb8, 0x6ddd: 0xe0000bb5, 0x6dde: 0xe0000bb2, 0x6ddf: 0xe0000baf, - 0x6de0: 0xe0000bc4, 0x6de1: 0xe0000bc1, 0x6de2: 0xe0000bca, 0x6de3: 0xe0000bc7, - 0x6de4: 0xe0002856, 0x6de5: 0xe0002853, 0x6de6: 0xe0000c1b, 0x6de7: 0xe0000c18, - 0x6de8: 0xe0002664, 0x6de9: 0xe0002661, 0x6dea: 0xe0002673, 0x6deb: 0xe0002670, - 0x6dec: 0xe0002644, 0x6ded: 0xe0002641, 0x6dee: 0xe000266d, 0x6def: 0xe000266a, - 0x6df0: 0xe0002667, 0x6df1: 0x402da220, 0x6df2: 0xe00027e2, 0x6df3: 0xe00027df, - 0x6df4: 0xe0000c8a, 0x6df5: 0xe0000c87, 0x6df6: 0xe000261a, 0x6df7: 0xe0002617, - 0x6df8: 0x402f7220, 0x6df9: 0xe0000ccc, 0x6dfa: 0xe0000cc9, 0x6dfb: 0xe0000cd8, - 0x6dfc: 0xe0000cd5, 0x6dfd: 0xe0000cd2, 0x6dfe: 0xe0000ccf, 0x6dff: 0xe0000d04, - // Block 0x1b8, offset 0x6e00 - 0x6e00: 0xe0000cfe, 0x6e01: 0xe0000cf8, 0x6e02: 0xe0000cf5, 0x6e03: 0xe0000d51, - 0x6e04: 0xe0000d4e, 0x6e05: 0xe0000d6f, 0x6e06: 0xe0000d6c, 0x6e07: 0xe0000d5d, - 0x6e08: 0xe0000d5a, 0x6e09: 0xf0000404, 0x6e0a: 0x002eda88, 0x6e0b: 0x402eda20, - 0x6e0c: 0xe0002761, 0x6e0d: 0xe000275e, 0x6e0e: 0xe00026e1, 0x6e0f: 0xe00026de, - 0x6e10: 0xe0002721, 0x6e11: 0xe000271e, 0x6e12: 0xe0000e93, 0x6e13: 0xe0000e8f, - 0x6e14: 0xe0002697, 0x6e15: 0xe0002694, 0x6e16: 0xe00026a9, 0x6e17: 0xe00026a6, - 0x6e18: 0xe000269d, 0x6e19: 0xe000269a, 0x6e1a: 0xe0002526, 0x6e1b: 0xe0002523, - 0x6e1c: 0xe0002534, 0x6e1d: 0xe0002531, 0x6e1e: 0xe000254e, 0x6e1f: 0xe000254b, - 0x6e20: 0xe000253a, 0x6e21: 0xe0002537, 0x6e22: 0xe0002508, 0x6e23: 0xe0002505, - 0x6e24: 0xe00024f9, 0x6e25: 0xe00024f6, 0x6e26: 0x00303688, 0x6e27: 0x40303620, - 0x6e28: 0xe000102b, 0x6e29: 0xe0001028, 0x6e2a: 0xe000103f, 0x6e2b: 0xe000103c, - 0x6e2c: 0xe0000fe7, 0x6e2d: 0xe0000fe4, 0x6e2e: 0xe0000ff9, 0x6e2f: 0xe0000ff6, - 0x6e30: 0xe0001025, 0x6e31: 0xe0001022, 0x6e32: 0xe0001039, 0x6e33: 0xe0001036, - 0x6e34: 0xe00010d8, 0x6e35: 0xe00010d5, 0x6e36: 0xe000110e, 0x6e37: 0xe000110b, - 0x6e38: 0xe0001117, 0x6e39: 0xe000113b, 0x6e3a: 0xe0001138, 0x6e3b: 0xe000114d, - 0x6e3c: 0xe000114a, 0x6e3d: 0xe0001147, 0x6e3e: 0xe0001144, 0x6e3f: 0xe0000f64, - // Block 0x1b9, offset 0x6e40 - 0x6e40: 0x402c1a20, 0x6e41: 0x002c2a88, 0x6e42: 0x002c3288, 0x6e43: 0x402c3220, - 0x6e44: 0x0031c488, 0x6e45: 0x4031c420, 0x6e46: 0x002efa88, 0x6e47: 0x002c4e88, - 0x6e48: 0x402c4e20, 0x6e49: 0x002c7288, 0x6e4a: 0x002c7a88, 0x6e4b: 0x002c8488, - 0x6e4c: 0x402c8420, 0x6e4d: 0xe000115c, 0x6e4e: 0x002cae88, 0x6e4f: 0x002cb888, - 0x6e50: 0x002cc288, 0x6e51: 0x002d1688, 0x6e52: 0x402d1620, 0x6e53: 0x002d4488, - 0x6e54: 0x002d5888, 0x6e55: 0x402d7820, 0x6e56: 0x002dc288, 0x6e57: 0x002db688, - 0x6e58: 0x002e0a88, 0x6e59: 0x402e0a20, 0x6e5a: 0x402e3820, 0x6e5b: 0x402e7220, - 0x6e5c: 0x0030a088, 0x6e5d: 0x002eb488, 0x6e5e: 0x402ebc20, 0x6e5f: 0x002f1088, - 0x6e60: 0xe0002789, 0x6e61: 0xe0002786, 0x6e62: 0x002d6088, 0x6e63: 0x402d6020, - 0x6e64: 0x002f3e88, 0x6e65: 0x402f3e20, 0x6e66: 0x002f8288, 0x6e67: 0x0031b488, - 0x6e68: 0x4031b420, 0x6e69: 0x00300888, 0x6e6a: 0x40301220, 0x6e6b: 0x40304220, - 0x6e6c: 0x00304a88, 0x6e6d: 0x40304a20, 0x6e6e: 0x00305288, 0x6e6f: 0xe000105f, - 0x6e70: 0xe000105c, 0x6e71: 0x0030b488, 0x6e72: 0x0030cc88, 0x6e73: 0x00311888, - 0x6e74: 0x40311820, 0x6e75: 0x00313488, 0x6e76: 0x40313420, 0x6e77: 0x00316488, - 0x6e78: 0x00316e88, 0x6e79: 0x40316e20, 0x6e7a: 0x40317820, 0x6e7b: 0x4031a620, - 0x6e7c: 0x0031bc88, 0x6e7d: 0x4031bc20, 0x6e7e: 0xe0000fc9, 0x6e7f: 0x40319420, - // Block 0x1ba, offset 0x6e80 - 0x6e80: 0x40321220, 0x6e81: 0x40321a20, 0x6e82: 0x40322220, 0x6e83: 0x40322a20, - 0x6e84: 0xe0000ad5, 0x6e85: 0xe0000ad1, 0x6e86: 0xe0000acd, 0x6e87: 0xf0000a0a, - 0x6e88: 0xf000040a, 0x6e89: 0xf0000404, 0x6e8a: 0xf0000a0a, 0x6e8b: 0xf000040a, - 0x6e8c: 0xf0000404, 0x6e8d: 0xe0000947, 0x6e8e: 0xe0000944, 0x6e8f: 0xe0002650, - 0x6e90: 0xe000264d, 0x6e91: 0xe000270d, 0x6e92: 0xe000270a, 0x6e93: 0xe0000ff3, - 0x6e94: 0xe0000ff0, 0x6e95: 0xe000101e, 0x6e96: 0xe000101a, 0x6e97: 0xe0001006, - 0x6e98: 0xe0001002, 0x6e99: 0xe0001016, 0x6e9a: 0xe0001012, 0x6e9b: 0xe000100e, - 0x6e9c: 0xe000100a, 0x6e9d: 0x402cae20, 0x6e9e: 0xe0000962, 0x6e9f: 0xe000095e, - 0x6ea0: 0xe0000976, 0x6ea1: 0xe0000972, 0x6ea2: 0xe00009f4, 0x6ea3: 0xe00009ef, - 0x6ea4: 0x002d3a88, 0x6ea5: 0x402d3a20, 0x6ea6: 0xe0000bbe, 0x6ea7: 0xe0000bbb, - 0x6ea8: 0xe0002614, 0x6ea9: 0xe0002611, 0x6eaa: 0xe0002753, 0x6eab: 0xe0002750, - 0x6eac: 0xe000275a, 0x6ead: 0xe0002756, 0x6eae: 0xe0001162, 0x6eaf: 0xe000115f, - 0x6eb0: 0xe0000c8d, 0x6eb1: 0xf0000a0a, 0x6eb2: 0xf000040a, 0x6eb3: 0xf0000404, - 0x6eb4: 0xe0000bac, 0x6eb5: 0xe0000ba9, 0x6eb6: 0x002d7888, 0x6eb7: 0x00319488, - 0x6eb8: 0xe0000d57, 0x6eb9: 0xe0000d54, 0x6eba: 0xe0000954, 0x6ebb: 0xe0000950, - 0x6ebc: 0xe00009ea, 0x6ebd: 0xe00009e5, 0x6ebe: 0xe0000e19, 0x6ebf: 0xe0000e15, - // Block 0x1bb, offset 0x6ec0 - 0x6ec0: 0xe000098f, 0x6ec1: 0xe000098c, 0x6ec2: 0xe0000995, 0x6ec3: 0xe0000992, - 0x6ec4: 0xe00025e8, 0x6ec5: 0xe00025e5, 0x6ec6: 0xe00025ee, 0x6ec7: 0xe00025eb, - 0x6ec8: 0xe000267f, 0x6ec9: 0xe000267c, 0x6eca: 0xe0002685, 0x6ecb: 0xe0002682, - 0x6ecc: 0xe000277d, 0x6ecd: 0xe000277a, 0x6ece: 0xe0002783, 0x6ecf: 0xe0002780, - 0x6ed0: 0xe00026af, 0x6ed1: 0xe00026ac, 0x6ed2: 0xe00026b5, 0x6ed3: 0xe00026b2, - 0x6ed4: 0xe0001053, 0x6ed5: 0xe0001050, 0x6ed6: 0xe0001059, 0x6ed7: 0xe0001056, - 0x6ed8: 0xe0002562, 0x6ed9: 0xe000255f, 0x6eda: 0xe0002514, 0x6edb: 0xe0002511, - 0x6edc: 0x00312288, 0x6edd: 0x40312220, 0x6ede: 0xe000285c, 0x6edf: 0xe0002859, - 0x6ee0: 0x002ebc88, 0x6ee1: 0x402c8c20, 0x6ee2: 0x002f2288, 0x6ee3: 0x402f2220, - 0x6ee4: 0x00314088, 0x6ee5: 0x40314020, 0x6ee6: 0xe000096f, 0x6ee7: 0xe000096c, - 0x6ee8: 0xe00025b8, 0x6ee9: 0xe00025b5, 0x6eea: 0xe000271a, 0x6eeb: 0xe0002716, - 0x6eec: 0xe000273e, 0x6eed: 0xe000273a, 0x6eee: 0xe0002745, 0x6eef: 0xe0002742, - 0x6ef0: 0xe000274c, 0x6ef1: 0xe0002748, 0x6ef2: 0xe0001129, 0x6ef3: 0xe0001126, - 0x6ef4: 0x402e5e20, 0x6ef5: 0x402ed020, 0x6ef6: 0x40305a20, 0x6ef7: 0x402dd420, - 0x6ef8: 0xe0000abf, 0x6ef9: 0xe0000ec4, 0x6efa: 0x002be888, 0x6efb: 0x002c4488, - 0x6efc: 0x402c4420, 0x6efd: 0x002e3888, 0x6efe: 0x00303e88, 0x6eff: 0x402ffc20, - // Block 0x1bc, offset 0x6f00 - 0x6f00: 0xe00009b1, 0x6f01: 0xe00009ae, 0x6f02: 0xe0000a22, 0x6f03: 0xe0000a1f, - 0x6f04: 0xe0000a28, 0x6f05: 0xe0000a25, 0x6f06: 0xe0000a2e, 0x6f07: 0xe0000a2b, - 0x6f08: 0xe0000a5a, 0x6f09: 0xe0000a56, 0x6f0a: 0xe0000a8c, 0x6f0b: 0xe0000a89, - 0x6f0c: 0xe0000a98, 0x6f0d: 0xe0000a95, 0x6f0e: 0xe0000aa4, 0x6f0f: 0xe0000aa1, - 0x6f10: 0xe0000a92, 0x6f11: 0xe0000a8f, 0x6f12: 0xe0000a9e, 0x6f13: 0xe0000a9b, - 0x6f14: 0xe00025db, 0x6f15: 0xe00025d7, 0x6f16: 0xe00025d3, 0x6f17: 0xe00025cf, - 0x6f18: 0xe0002602, 0x6f19: 0xe00025ff, 0x6f1a: 0xe0002608, 0x6f1b: 0xe0002605, - 0x6f1c: 0xe00025bf, 0x6f1d: 0xe00025bb, 0x6f1e: 0xe0000b8c, 0x6f1f: 0xe0000b89, - 0x6f20: 0xe0000bd0, 0x6f21: 0xe0000bcd, 0x6f22: 0xe0002868, 0x6f23: 0xe0002865, - 0x6f24: 0xe0002874, 0x6f25: 0xe0002871, 0x6f26: 0xe0002862, 0x6f27: 0xe000285f, - 0x6f28: 0xe000286e, 0x6f29: 0xe000286b, 0x6f2a: 0xe000287a, 0x6f2b: 0xe0002877, - 0x6f2c: 0xe0002691, 0x6f2d: 0xe000268e, 0x6f2e: 0xe000265d, 0x6f2f: 0xe0002659, - 0x6f30: 0xe000260e, 0x6f31: 0xe000260b, 0x6f32: 0xe0002620, 0x6f33: 0xe000261d, - 0x6f34: 0xe0002626, 0x6f35: 0xe0002623, 0x6f36: 0xe0000cde, 0x6f37: 0xe0000cdb, - 0x6f38: 0xe0000ce5, 0x6f39: 0xe0000ce1, 0x6f3a: 0xe0000cf2, 0x6f3b: 0xe0000cef, - 0x6f3c: 0xe0000cec, 0x6f3d: 0xe0000ce9, 0x6f3e: 0xe0000d1e, 0x6f3f: 0xe0000d1b, - // Block 0x1bd, offset 0x6f40 - 0x6f40: 0xe0000d24, 0x6f41: 0xe0000d21, 0x6f42: 0xe0000d2a, 0x6f43: 0xe0000d27, - 0x6f44: 0xe0000d69, 0x6f45: 0xe0000d66, 0x6f46: 0xe0000d7b, 0x6f47: 0xe0000d78, - 0x6f48: 0xe0000d87, 0x6f49: 0xe0000d84, 0x6f4a: 0xe0000d81, 0x6f4b: 0xe0000d7e, - 0x6f4c: 0xe000272e, 0x6f4d: 0xe000272a, 0x6f4e: 0xe0002736, 0x6f4f: 0xe0002732, - 0x6f50: 0xe0002770, 0x6f51: 0xe000276c, 0x6f52: 0xe0002768, 0x6f53: 0xe0002764, - 0x6f54: 0xe0000ea7, 0x6f55: 0xe0000ea4, 0x6f56: 0xe0000ead, 0x6f57: 0xe0000eaa, - 0x6f58: 0xe00026a3, 0x6f59: 0xe00026a0, 0x6f5a: 0xe00026bb, 0x6f5b: 0xe00026b8, - 0x6f5c: 0xe00026c2, 0x6f5d: 0xe00026be, 0x6f5e: 0xe00026c9, 0x6f5f: 0xe00026c6, - 0x6f60: 0xe0002548, 0x6f61: 0xe0002545, 0x6f62: 0xe0002554, 0x6f63: 0xe0002551, - 0x6f64: 0xe000252d, 0x6f65: 0xe0002529, 0x6f66: 0xe0002541, 0x6f67: 0xe000253d, - 0x6f68: 0xe000255b, 0x6f69: 0xe0002557, 0x6f6a: 0xe0002502, 0x6f6b: 0xe00024ff, - 0x6f6c: 0xe000250e, 0x6f6d: 0xe000250b, 0x6f6e: 0xe0002520, 0x6f6f: 0xe000251d, - 0x6f70: 0xe000251a, 0x6f71: 0xe0002517, 0x6f72: 0xe0001093, 0x6f73: 0xe0001090, - 0x6f74: 0xe000109f, 0x6f75: 0xe000109c, 0x6f76: 0xe0001099, 0x6f77: 0xe0001096, - 0x6f78: 0xe0001032, 0x6f79: 0xe000102e, 0x6f7a: 0xe0001046, 0x6f7b: 0xe0001042, - 0x6f7c: 0xe00010a9, 0x6f7d: 0xe00010a6, 0x6f7e: 0xe00010af, 0x6f7f: 0xe00010ac, - // Block 0x1be, offset 0x6f80 - 0x6f80: 0xe00010d2, 0x6f81: 0xe00010cf, 0x6f82: 0xe00010cc, 0x6f83: 0xe00010c9, - 0x6f84: 0xe00010e1, 0x6f85: 0xe00010de, 0x6f86: 0xe00010e7, 0x6f87: 0xe00010e4, - 0x6f88: 0xe00010ed, 0x6f89: 0xe00010ea, 0x6f8a: 0xe0002632, 0x6f8b: 0xe000262f, - 0x6f8c: 0xe000262c, 0x6f8d: 0xe0002629, 0x6f8e: 0xe0001123, 0x6f8f: 0xe0001120, - 0x6f90: 0xe0001141, 0x6f91: 0xe000113e, 0x6f92: 0xe0001153, 0x6f93: 0xe0001150, - 0x6f94: 0xe0001159, 0x6f95: 0xe0001156, 0x6f96: 0xe000287d, 0x6f97: 0xe00024fc, - 0x6f98: 0xe00010db, 0x6f99: 0xe0001111, 0x6f9a: 0xf0000404, 0x6f9b: 0xe0000f70, - 0x6f9c: 0x40300420, 0x6f9d: 0x40300620, 0x6f9e: 0xe0000f7f, 0x6f9f: 0x402c9620, - 0x6fa0: 0xe000099b, 0x6fa1: 0xe0000998, 0x6fa2: 0xe0000989, 0x6fa3: 0xe0000986, - 0x6fa4: 0xe0000928, 0x6fa5: 0xe0000924, 0x6fa6: 0xe0000930, 0x6fa7: 0xe000092c, - 0x6fa8: 0xe0000940, 0x6fa9: 0xe000093c, 0x6faa: 0xe0000938, 0x6fab: 0xe0000934, - 0x6fac: 0xe00009aa, 0x6fad: 0xe00009a6, 0x6fae: 0xe0000902, 0x6faf: 0xe00008fe, - 0x6fb0: 0xe000090a, 0x6fb1: 0xe0000906, 0x6fb2: 0xe000091a, 0x6fb3: 0xe0000916, - 0x6fb4: 0xe0000912, 0x6fb5: 0xe000090e, 0x6fb6: 0xe00009a2, 0x6fb7: 0xe000099e, - 0x6fb8: 0xe00025f4, 0x6fb9: 0xe00025f1, 0x6fba: 0xe00025e2, 0x6fbb: 0xe00025df, - 0x6fbc: 0xe00025ac, 0x6fbd: 0xe00025a9, 0x6fbe: 0xe0002581, 0x6fbf: 0xe000257d, - // Block 0x1bf, offset 0x6fc0 - 0x6fc0: 0xe0002589, 0x6fc1: 0xe0002585, 0x6fc2: 0xe0002599, 0x6fc3: 0xe0002595, - 0x6fc4: 0xe0002591, 0x6fc5: 0xe000258d, 0x6fc6: 0xe00025fb, 0x6fc7: 0xe00025f7, - 0x6fc8: 0xe0002679, 0x6fc9: 0xe0002676, 0x6fca: 0xe000268b, 0x6fcb: 0xe0002688, - 0x6fcc: 0xe00027b7, 0x6fcd: 0xe00027b4, 0x6fce: 0xe0002777, 0x6fcf: 0xe0002774, - 0x6fd0: 0xe00026ee, 0x6fd1: 0xe00026ea, 0x6fd2: 0xe00026f6, 0x6fd3: 0xe00026f2, - 0x6fd4: 0xe0002706, 0x6fd5: 0xe0002702, 0x6fd6: 0xe00026fe, 0x6fd7: 0xe00026fa, - 0x6fd8: 0xe00027be, 0x6fd9: 0xe00027ba, 0x6fda: 0xe0002790, 0x6fdb: 0xe000278c, - 0x6fdc: 0xe0002798, 0x6fdd: 0xe0002794, 0x6fde: 0xe00027a8, 0x6fdf: 0xe00027a4, - 0x6fe0: 0xe00027a0, 0x6fe1: 0xe000279c, 0x6fe2: 0xe00027b0, 0x6fe3: 0xe00027ac, - 0x6fe4: 0xe000108d, 0x6fe5: 0xe000108a, 0x6fe6: 0xe000104d, 0x6fe7: 0xe000104a, - 0x6fe8: 0xe0001066, 0x6fe9: 0xe0001062, 0x6fea: 0xe000106e, 0x6feb: 0xe000106a, - 0x6fec: 0xe000107e, 0x6fed: 0xe000107a, 0x6fee: 0xe0001076, 0x6fef: 0xe0001072, - 0x6ff0: 0xe0001086, 0x6ff1: 0xe0001082, 0x6ff2: 0xe0001108, 0x6ff3: 0xe0001105, - 0x6ff4: 0xe0001135, 0x6ff5: 0xe0001132, 0x6ff6: 0xe000112f, 0x6ff7: 0xe000112c, - 0x6ff8: 0xe000111d, 0x6ff9: 0xe000111a, 0x6ffa: 0xe0000d0a, 0x6ffb: 0xe0000d07, - 0x6ffc: 0x0030d888, 0x6ffd: 0x4030d820, 0x6ffe: 0x00312088, 0x6fff: 0x40312020, - // Block 0x1c0, offset 0x7000 - 0x7000: 0xe00009bc, 0x7001: 0xe00009c0, 0x7002: 0x002c3a8b, 0x7003: 0xf0000a04, - 0x7004: 0x40081c20, 0x7005: 0xe0000a5e, 0x7006: 0xe0000a62, 0x7007: 0x002cc28a, - 0x7008: 0x40081e20, 0x7009: 0xf0000a04, 0x700a: 0x002d2285, 0x700b: 0x002d688b, - 0x700c: 0x002d688b, 0x700d: 0x002d688b, 0x700e: 0x002d6885, 0x700f: 0xf0000202, - 0x7010: 0x002d9a8b, 0x7011: 0x002d9a8b, 0x7012: 0x002e228b, 0x7013: 0x002e2285, - 0x7014: 0x40082020, 0x7015: 0x002e9e8b, 0x7016: 0xe000281e, 0x7017: 0x40082220, - 0x7018: 0x40082420, 0x7019: 0x002f2c8b, 0x701a: 0x002f568b, 0x701b: 0x002f7a8b, - 0x701c: 0x002f7a8b, 0x701d: 0x002f7a8b, 0x701e: 0x40082620, 0x701f: 0x40082820, - 0x7020: 0xe0002833, 0x7021: 0xe0000fbd, 0x7022: 0xe0002842, 0x7023: 0x40082a20, - 0x7024: 0x00312a8b, 0x7025: 0x40082c20, 0x7026: 0x0032a288, 0x7027: 0x40082e20, - 0x7028: 0x00312a8b, 0x7029: 0x40083020, 0x702a: 0x002c3c83, 0x702b: 0xe000094d, - 0x702c: 0x002c0a8b, 0x702d: 0x002c3a8b, 0x702e: 0x40083220, 0x702f: 0x002c9885, - 0x7030: 0x002c988b, 0x7031: 0x002d088b, 0x7032: 0x002d1e88, 0x7033: 0x002e828b, - 0x7034: 0x002ee285, 0x7035: 0x00389084, 0x7036: 0x00389284, 0x7037: 0x00389484, - 0x7038: 0x00389684, 0x7039: 0x002d9a85, 0x703a: 0x40083420, 0x703b: 0xe0000b95, - 0x703c: 0x00327e85, 0x703d: 0x00325685, 0x703e: 0x0032568b, 0x703f: 0x00327e8b, - // Block 0x1c1, offset 0x7040 - 0x7040: 0x00093685, 0x7041: 0x40083620, 0x7042: 0x40083820, 0x7043: 0x40083a20, - 0x7044: 0x40083c20, 0x7045: 0x002c628b, 0x7046: 0x002c6285, 0x7047: 0x002c9885, - 0x7048: 0x002d9a85, 0x7049: 0x002dcc85, 0x704a: 0x40083e20, 0x704b: 0x400a6e20, - 0x704c: 0x40084020, 0x704d: 0xe00009c4, 0x704e: 0x402d1e20, 0x704f: 0x40084220, - 0x7050: 0xe00002cb, 0x7051: 0xe00002d3, 0x7052: 0xe00002b2, 0x7053: 0xe00002bb, - 0x7054: 0xe00003cd, 0x7055: 0xe00002c3, 0x7056: 0xe00003d1, 0x7057: 0xe00004ab, - 0x7058: 0xe0000579, 0x7059: 0xe00002c7, 0x705a: 0xe0000640, 0x705b: 0xe00002cf, - 0x705c: 0xe00004af, 0x705d: 0xe0000644, 0x705e: 0xe0000798, 0x705f: 0xf0001e1e, - 0x7060: 0x002d9a8a, 0x7061: 0xe00027d4, 0x7062: 0xe00027db, 0x7063: 0xe00027ee, - 0x7064: 0x0030be8a, 0x7065: 0xe0002848, 0x7066: 0xe000284f, 0x7067: 0xe00010bb, - 0x7068: 0xe00027f4, 0x7069: 0x0030f68a, 0x706a: 0xe0002883, 0x706b: 0xe000288a, - 0x706c: 0x002e228a, 0x706d: 0x002c3a8a, 0x706e: 0x002c628a, 0x706f: 0x002e828a, - 0x7070: 0x002d9a84, 0x7071: 0xe00027d1, 0x7072: 0xe00027d7, 0x7073: 0xe00027eb, - 0x7074: 0x0030be84, 0x7075: 0xe0002845, 0x7076: 0xe000284b, 0x7077: 0xe00010b6, - 0x7078: 0xe00027f1, 0x7079: 0x0030f684, 0x707a: 0xe0002880, 0x707b: 0xe0002886, - 0x707c: 0x002e2284, 0x707d: 0x002c3a84, 0x707e: 0x002c6284, 0x707f: 0x002e8284, - // Block 0x1c2, offset 0x7080 - 0x7080: 0xe0000024, 0x7081: 0xe0000029, 0x7082: 0xe000002e, 0x7083: 0xe0000033, - 0x7084: 0xe0000038, 0x7085: 0xe000003d, 0x7086: 0xe0000042, 0x7087: 0xe0000047, - 0x7088: 0xf0001f04, 0x7089: 0xf0001f04, 0x708a: 0xf0001f04, 0x708b: 0xf0001f04, - 0x708c: 0xf0001f04, 0x708d: 0xf0001f04, 0x708e: 0xf0001f04, 0x708f: 0xf0001f04, - 0x7090: 0xf0001f04, 0x7091: 0xf0000404, 0x7092: 0xf0000404, 0x7093: 0xf0000404, - 0x7094: 0xf0000404, 0x7095: 0xf0000404, 0x7096: 0xf0000404, 0x7097: 0xf0000404, - 0x7098: 0xf0000404, 0x7099: 0xf0000404, 0x709a: 0xf0000404, 0x709b: 0xf0000404, - 0x709c: 0xf0000404, 0x709d: 0xf0000404, 0x709e: 0xf0000404, 0x709f: 0xf0000404, - 0x70a0: 0xe000249f, 0x70a1: 0xf0000404, 0x70a2: 0xf0000404, 0x70a3: 0xe00024a7, - 0x70a4: 0xe00024af, 0x70a5: 0xf0000404, 0x70a6: 0xe00024b7, 0x70a7: 0xf0000404, - 0x70a8: 0xf0000404, 0x70a9: 0xf0000404, 0x70aa: 0xe00024bf, 0x70ab: 0xf0000404, - 0x70ac: 0xe00024c7, 0x70ad: 0xe00024cf, 0x70ae: 0xe00024d7, 0x70af: 0xe00024df, - 0x70b0: 0xf0000404, 0x70b1: 0xf0000404, 0x70b2: 0xf0000404, 0x70b3: 0xe00024e7, - 0x70b4: 0xf0000404, 0x70b5: 0xf0000404, 0x70b6: 0x002bde8c, 0x70b7: 0x002c0a8c, - 0x70b8: 0x002c3a8c, 0x70b9: 0x002c628c, 0x70ba: 0x002c988c, 0x70bb: 0x002d088c, - 0x70bc: 0x002d228c, 0x70bd: 0x002d688c, 0x70be: 0x002d9a8c, 0x70bf: 0x002dcc8c, - // Block 0x1c3, offset 0x70c0 - 0x70c0: 0xf0001f04, 0x70c1: 0xf0001f04, 0x70c2: 0xf0001f04, 0x70c3: 0xf0001f04, - 0x70c4: 0xf0001f04, 0x70c5: 0xf0001f04, 0x70c6: 0xf0001f04, 0x70c7: 0xf0001f04, - 0x70c8: 0xf0001f04, 0x70c9: 0xf0000404, 0x70ca: 0xf0000404, 0x70cb: 0xf0000404, - 0x70cc: 0xe00027c5, 0x70cd: 0xe0000b85, 0x70ce: 0xe00026cc, 0x70cf: 0xe0000d14, - 0x70d0: 0x00657693, 0x70d1: 0x00657893, 0x70d2: 0x00657a93, 0x70d3: 0x00657e93, - 0x70d4: 0x00658093, 0x70d5: 0x00658293, 0x70d6: 0x00658493, 0x70d7: 0x00658693, - 0x70d8: 0x00658893, 0x70d9: 0x00658a93, 0x70da: 0x00658c93, 0x70db: 0x00658e93, - 0x70dc: 0x00659093, 0x70dd: 0x00659293, 0x70de: 0x00659493, 0x70df: 0x00659693, - 0x70e0: 0x00659893, 0x70e1: 0x00659a93, 0x70e2: 0x00659c93, 0x70e3: 0x00659e93, - 0x70e4: 0x0065a093, 0x70e5: 0x0065a293, 0x70e6: 0x0065a493, 0x70e7: 0x0065a693, - 0x70e8: 0x0065a893, 0x70e9: 0x0065aa93, 0x70ea: 0x0065ac93, 0x70eb: 0x0065ae93, - 0x70ec: 0x0065b093, 0x70ed: 0x0065b293, 0x70ee: 0x0065b493, 0x70ef: 0x0065b693, - 0x70f0: 0x0065b893, 0x70f1: 0x0065ba93, 0x70f2: 0x0065bc93, 0x70f3: 0x0065be93, - 0x70f4: 0x0065c093, 0x70f5: 0x0065c493, 0x70f6: 0x0065c693, 0x70f7: 0x0065c893, - 0x70f8: 0x0065ca93, 0x70f9: 0x0065cc93, 0x70fa: 0x0065ce93, 0x70fb: 0x0065d093, - 0x70fc: 0x0065d293, 0x70fd: 0x0065d493, 0x70fe: 0x0065d693, - // Block 0x1c4, offset 0x7100 - 0x7100: 0xe000230b, 0x7101: 0xe00022f8, 0x7102: 0xe00022fc, 0x7103: 0xe0002311, - 0x7104: 0xe0002316, 0x7105: 0xe000231d, 0x7106: 0xe0002321, 0x7107: 0xe0002325, - 0x7108: 0xe000232b, 0x7109: 0xf0001c1c, 0x710a: 0xe0002330, 0x710b: 0xe000233c, - 0x710c: 0xe0002340, 0x710d: 0xe0002337, 0x710e: 0xe0002346, 0x710f: 0xe000234b, - 0x7110: 0xe000234f, 0x7111: 0xe0002353, 0x7112: 0xf0001c1c, 0x7113: 0xe000235e, - 0x7114: 0xe0002358, 0x7115: 0xf0001c1c, 0x7116: 0xe0002363, 0x7117: 0xe000236d, - 0x7118: 0xf0001f04, 0x7119: 0xf0001f04, 0x711a: 0xf0001f04, 0x711b: 0xf0001f04, - 0x711c: 0xf0001f04, 0x711d: 0xf0001f04, 0x711e: 0xf0001f04, 0x711f: 0xf0001f04, - 0x7120: 0xf0001f04, 0x7121: 0xf0001f04, 0x7122: 0xf0000404, 0x7123: 0xf0000404, - 0x7124: 0xf0000404, 0x7125: 0xf0000404, 0x7126: 0xf0000404, 0x7127: 0xf0000404, - 0x7128: 0xf0000404, 0x7129: 0xf0000404, 0x712a: 0xf0000404, 0x712b: 0xf0000404, - 0x712c: 0xf0000404, 0x712d: 0xf0000404, 0x712e: 0xf0000404, 0x712f: 0xf0000404, - 0x7130: 0xf0000404, 0x7131: 0xe0000c1e, 0x7132: 0xf0001c1c, 0x7133: 0xf0001d1d, - 0x7134: 0xe0000a31, 0x7135: 0xe0002824, 0x7136: 0xf0001c1c, 0x7137: 0xf0001c1c, - 0x7138: 0xe0000ac2, 0x7139: 0xe0000ac6, 0x713a: 0xe00027e8, 0x713b: 0xf0001c1c, - 0x713c: 0xf0001c1c, 0x713d: 0xf0001c1c, 0x713e: 0xf0001c1c, 0x713f: 0xe0002431, - // Block 0x1c5, offset 0x7140 - 0x7140: 0xf0001d1c, 0x7141: 0xf0001d1c, 0x7142: 0xf0001d1c, 0x7143: 0xf0001d1c, - 0x7144: 0xe00027f7, 0x7145: 0xe00027fa, 0x7146: 0xf0001d1d, 0x7147: 0xf0001d1d, - 0x7148: 0xe0000a6b, 0x7149: 0xe0000cb4, 0x714a: 0xf0001d1c, 0x714b: 0xf0001d1c, - 0x714c: 0xf0001d1c, 0x714d: 0xf0001c1c, 0x714e: 0xf0001c1c, 0x714f: 0xe00027fd, - 0x7150: 0xe00027ce, 0x7151: 0xe0000cb9, 0x7152: 0xe0000d36, 0x7153: 0xe0000be3, - 0x7154: 0xe0000fc5, 0x7155: 0xf0001c1c, 0x7156: 0xf0001c1c, 0x7157: 0xf0001c1c, - 0x7158: 0xe0002803, 0x7159: 0xf0001c1c, 0x715a: 0xf0001c1c, 0x715b: 0xf0001c1c, - 0x715c: 0xf0001c1c, 0x715d: 0xf0001c1c, 0x715e: 0xe0002806, 0x715f: 0xe0000d3e, - 0x7160: 0xe0000a72, 0x7161: 0xf0001c1c, 0x7162: 0xe0000cbd, 0x7163: 0xe0000d42, - 0x7164: 0xe0000a76, 0x7165: 0xf0001c1c, 0x7166: 0xe0000cc1, 0x7167: 0xe0000d2d, - 0x7168: 0xe0000d31, 0x7169: 0xf0001c1d, 0x716a: 0xe0000cc5, 0x716b: 0xe0000d4a, - 0x716c: 0xe0000be7, 0x716d: 0xe0000f0b, 0x716e: 0xe0000f0f, 0x716f: 0xe0000f15, - 0x7170: 0xe000282d, 0x7171: 0xe0002821, 0x7172: 0xe000288e, 0x7173: 0xe000281b, - 0x7174: 0xf0001d1c, 0x7175: 0xf0001d1c, 0x7176: 0xf0001d1c, 0x7177: 0xf0001d1c, - 0x7178: 0xe000280f, 0x7179: 0xf0001d1d, 0x717a: 0xf0001d1c, 0x717b: 0xf0001d1c, - 0x717c: 0xf0001d1c, 0x717d: 0xf0001d1c, 0x717e: 0xe0002812, 0x717f: 0xf0001d1d, - // Block 0x1c6, offset 0x7180 - 0x7180: 0xe0002815, 0x7181: 0xf0001d1d, 0x7182: 0xe00009b7, 0x7183: 0xe00024f3, - 0x7184: 0xf0001c1c, 0x7185: 0xf0001c1c, 0x7186: 0xe0000a66, 0x7187: 0xe0000a7a, - 0x7188: 0xf0001d1c, 0x7189: 0xf0001c1d, 0x718a: 0xe00027c2, 0x718b: 0xe00027c8, - 0x718c: 0xe00027e5, 0x718d: 0xe0002800, 0x718e: 0xe0002809, 0x718f: 0xe000280c, - 0x7190: 0xf0001c1c, 0x7191: 0xf0001c1c, 0x7192: 0xe0000d0d, 0x7193: 0xe0002818, - 0x7194: 0xf0001c1c, 0x7195: 0xe0000d3a, 0x7196: 0xe0000d46, 0x7197: 0xe0002827, - 0x7198: 0xe0000eb0, 0x7199: 0xe0000eb8, 0x719a: 0xe000282a, 0x719b: 0xe0002836, - 0x719c: 0xe000283f, 0x719d: 0xf0001c1d, 0x719e: 0xe00010b2, 0x719f: 0xe00009c8, - 0x71a0: 0xf0001f04, 0x71a1: 0xf0001f04, 0x71a2: 0xf0001f04, 0x71a3: 0xf0001f04, - 0x71a4: 0xf0001f04, 0x71a5: 0xf0001f04, 0x71a6: 0xf0001f04, 0x71a7: 0xf0001f04, - 0x71a8: 0xf0001f04, 0x71a9: 0xf0000404, 0x71aa: 0xf0000404, 0x71ab: 0xf0000404, - 0x71ac: 0xf0000404, 0x71ad: 0xf0000404, 0x71ae: 0xf0000404, 0x71af: 0xf0000404, - 0x71b0: 0xf0000404, 0x71b1: 0xf0000404, 0x71b2: 0xf0000404, 0x71b3: 0xf0000404, - 0x71b4: 0xf0000404, 0x71b5: 0xf0000404, 0x71b6: 0xf0000404, 0x71b7: 0xf0000404, - 0x71b8: 0xf0000404, 0x71b9: 0xf0000404, 0x71ba: 0xf0000404, 0x71bb: 0xf0000404, - 0x71bc: 0xf0000404, 0x71bd: 0xf0000404, 0x71be: 0xf0000404, 0x71bf: 0xe0000bdf, - // Block 0x1c7, offset 0x71c0 - 0x71c0: 0xf0000404, 0x71c1: 0xe00026cf, 0x71c2: 0xf0000404, 0x71c3: 0xe0000b99, - 0x71c4: 0xe0000b9d, 0x71c5: 0xe0000f83, 0x71c6: 0xe000283c, - 0x71d3: 0xf0000404, - 0x71d4: 0xf0000404, 0x71d5: 0xf0000404, 0x71d6: 0xf0000404, 0x71d7: 0xf0000404, - 0x71dd: 0xe000150b, 0x71de: 0xa1a09602, 0x71df: 0xe0001514, - 0x71e0: 0x0038ae85, 0x71e1: 0x00389085, 0x71e2: 0x00389685, 0x71e3: 0x00389885, - 0x71e4: 0x0038a485, 0x71e5: 0x0038a685, 0x71e6: 0x0038a885, 0x71e7: 0x0038b685, - 0x71e8: 0x0038ba85, 0x71e9: 0x00093885, 0x71ea: 0xe0001542, 0x71eb: 0xe000153f, - 0x71ec: 0xe000154c, 0x71ed: 0xe0001548, 0x71ee: 0xe00014e1, 0x71ef: 0xe00014e4, - 0x71f0: 0xe00014e7, 0x71f1: 0xe00014ea, 0x71f2: 0xe00014f0, 0x71f3: 0xe00014f3, - 0x71f4: 0xe00014f6, 0x71f5: 0xe00014fc, 0x71f6: 0xe0001505, - 0x71f8: 0xe0001508, 0x71f9: 0xe000150e, 0x71fa: 0xe000151b, 0x71fb: 0xe0001518, - 0x71fc: 0xe0001521, 0x71fe: 0xe0001524, - // Block 0x1c8, offset 0x7200 - 0x7200: 0xf0001f04, 0x7201: 0xf0001f04, 0x7202: 0xf0001f04, 0x7203: 0xf0001f04, - 0x7204: 0xf0001f04, 0x7205: 0xf0001f04, 0x7206: 0xf0001f04, 0x7207: 0xf0001f04, - 0x7208: 0xf0001f04, 0x7209: 0xf0001f04, 0x720a: 0xf0001f04, - 0x7210: 0xf0000a04, 0x7211: 0xf0000a04, 0x7212: 0xf0000a04, 0x7213: 0xf0000a04, - 0x7214: 0xe00024a3, 0x7215: 0xf0000a04, 0x7216: 0xf0000a04, 0x7217: 0xe00024ab, - 0x7218: 0xe00024b3, 0x7219: 0xf0000a04, 0x721a: 0xe00024bb, 0x721b: 0xf0000a04, - 0x721c: 0xf0000a04, 0x721d: 0xf0000a04, 0x721e: 0xe00024c3, 0x721f: 0xf0000a04, - 0x7220: 0xe00024cb, 0x7221: 0xe00024d3, 0x7222: 0xe00024db, 0x7223: 0xe00024e3, - 0x7224: 0xf0000a04, 0x7225: 0xf0000a04, 0x7226: 0xf0000a04, 0x7227: 0xe00024eb, - 0x7228: 0xf0000a04, 0x7229: 0xf0000a04, 0x722a: 0xe00024ef, 0x722b: 0x002c3a8c, - 0x722c: 0x002f7a8c, 0x722d: 0xf0000c0c, 0x722e: 0xf0000c0c, - 0x7230: 0x002bde9d, 0x7231: 0x002c0a9d, 0x7232: 0x002c3a9d, 0x7233: 0x002c629d, - 0x7234: 0x002c989d, 0x7235: 0x002d089d, 0x7236: 0x002d229d, 0x7237: 0x002d689d, - 0x7238: 0x002d9a9d, 0x7239: 0x002dcc9d, 0x723a: 0x002dfe9d, 0x723b: 0x002e229d, - 0x723c: 0x002e829d, 0x723d: 0x002e9e9d, 0x723e: 0x002ee29d, 0x723f: 0x002f2c9d, - // Block 0x1c9, offset 0x7240 - 0x7240: 0x002f569d, 0x7241: 0x002f7a9d, 0x7242: 0x002fe69d, 0x7243: 0x00302c9d, - 0x7244: 0x00306c9d, 0x7245: 0x0030be9d, 0x7246: 0x0030e29d, 0x7247: 0x0030f69d, - 0x7248: 0x0031009d, 0x7249: 0x00312a9d, 0x724a: 0xe00027cb, 0x724b: 0xf0001d1d, - 0x724c: 0xe0002830, 0x724d: 0xe0002839, 0x724e: 0xe0000ebc, 0x724f: 0xf0001d1d, - 0x7250: 0x002bde8c, 0x7251: 0x002c0a8c, 0x7252: 0x002c3a8c, 0x7253: 0x002c628c, - 0x7254: 0x002c988c, 0x7255: 0x002d088c, 0x7256: 0x002d228c, 0x7257: 0x002d688c, - 0x7258: 0x002d9a8c, 0x7259: 0x002dcc8c, 0x725a: 0x002dfe8c, 0x725b: 0x002e228c, - 0x725c: 0x002e828c, 0x725d: 0x002e9e8c, 0x725e: 0x002ee28c, 0x725f: 0x002f2c8c, - 0x7260: 0x002f568c, 0x7261: 0x002f7a8c, 0x7262: 0x002fe68c, 0x7263: 0x00302c8c, - 0x7264: 0x00306c8c, 0x7265: 0x0030be8c, 0x7266: 0x0030e28c, 0x7267: 0x0030f68c, - 0x7268: 0x0031008c, 0x7269: 0x00312a8c, 0x726a: 0xf0001414, 0x726b: 0xf0001414, - 0x7270: 0x002bde9d, 0x7271: 0x002c0a9d, 0x7272: 0x002c3a9d, 0x7273: 0x002c629d, - 0x7274: 0x002c989d, 0x7275: 0x002d089d, 0x7276: 0x002d229d, 0x7277: 0x002d689d, - 0x7278: 0x002d9a9d, 0x7279: 0x002dcc9d, 0x727a: 0x002dfe9d, 0x727b: 0x002e229d, - 0x727c: 0x002e829d, 0x727d: 0x002e9e9d, 0x727e: 0x002ee29d, 0x727f: 0x002f2c9d, - // Block 0x1ca, offset 0x7280 - 0x7280: 0xe0000cfe, 0x7281: 0xe0000cf8, 0x7282: 0xe0000cf5, 0x7283: 0xe0000d51, - 0x7284: 0xe0000d4e, 0x7285: 0xe0000d6f, 0x7286: 0xe0000d6c, 0x7287: 0xe0000d5d, - 0x7288: 0xe0000d5a, 0x7289: 0x002e9e89, 0x728a: 0x002eda88, 0x728b: 0x402eda20, - 0x728c: 0xe0000e2e, 0x728d: 0xe0000e2b, 0x728e: 0xe0000da0, 0x728f: 0xe0000d9d, - 0x7290: 0xe0000de0, 0x7291: 0xe0000ddd, 0x7292: 0xe0000e93, 0x7293: 0xe0000e8f, - 0x7294: 0xe0000eca, 0x7295: 0xe0000ec7, 0x7296: 0xe0000edc, 0x7297: 0xe0000ed9, - 0x7298: 0xe0000ed0, 0x7299: 0xe0000ecd, 0x729a: 0xe0000f1f, 0x729b: 0xe0000f1c, - 0x729c: 0xe0000f2d, 0x729d: 0xe0000f2a, 0x729e: 0xe0000f47, 0x729f: 0xe0000f44, - 0x72a0: 0xe0000f33, 0x72a1: 0xe0000f30, 0x72a2: 0xe0000f99, 0x72a3: 0xe0000f96, - 0x72a4: 0xe0000f8a, 0x72a5: 0xe0000f87, 0x72a6: 0x00303688, 0x72a7: 0x40303620, - 0x72a8: 0xe000102b, 0x72a9: 0xe0001028, 0x72aa: 0xe000103f, 0x72ab: 0xe000103c, - 0x72ac: 0xe0000fe7, 0x72ad: 0xe0000fe4, 0x72ae: 0xe0000ff9, 0x72af: 0xe0000ff6, - 0x72b0: 0xe0001025, 0x72b1: 0xe0001022, 0x72b2: 0xe0001039, 0x72b3: 0xe0001036, - 0x72b4: 0xe00010d8, 0x72b5: 0xe00010d5, 0x72b6: 0xe000110e, 0x72b7: 0xe000110b, - 0x72b8: 0xe0001117, 0x72b9: 0xe000113b, 0x72ba: 0xe0001138, 0x72bb: 0xe000114d, - 0x72bc: 0xe000114a, 0x72bd: 0xe0001147, 0x72be: 0xe0001144, 0x72bf: 0xe0000f64, - // Block 0x1cb, offset 0x72c0 - 0x72c0: 0xa0000000, 0x72c1: 0xa0000000, 0x72c2: 0xa0000000, 0x72c3: 0xa0000000, - 0x72c4: 0xa0000000, 0x72c6: 0x40096620, 0x72c7: 0x40096a20, - 0x72c8: 0x40070820, 0x72c9: 0x4004f220, 0x72ca: 0x4004f620, 0x72cb: 0x4027e620, - 0x72cc: 0x40024820, 0x72cd: 0x40024a20, 0x72ce: 0x40070e20, 0x72cf: 0x40071020, - 0x72d0: 0xae600000, 0x72d1: 0xae600000, 0x72d2: 0xae600000, 0x72d3: 0xae600000, - 0x72d4: 0xae600000, 0x72d5: 0xae600000, 0x72d6: 0xae600000, 0x72d7: 0xae600000, - 0x72d8: 0xa1e00000, 0x72d9: 0xa1f00000, 0x72da: 0xa2000000, 0x72db: 0x40026420, - 0x72de: 0x40027020, 0x72df: 0x4002cc20, - 0x72e0: 0x403aa220, 0x72e1: 0x40391c20, 0x72e2: 0x40391e20, 0x72e3: 0x40392020, - 0x72e4: 0x40392620, 0x72e5: 0x40392820, 0x72e6: 0x40393020, 0x72e7: 0xc0520151, - 0x72e8: 0x40393c20, 0x72e9: 0x40395621, 0x72ea: 0x40395620, 0x72eb: 0x40395820, - 0x72ec: 0x40396420, 0x72ed: 0x40397220, 0x72ee: 0x40397420, 0x72ef: 0x40398820, - 0x72f0: 0x40398a20, 0x72f1: 0x4039a420, 0x72f2: 0x4039a620, 0x72f3: 0x4039c620, - 0x72f4: 0x4039c820, 0x72f5: 0x4039dc20, 0x72f6: 0x4039de20, 0x72f7: 0x4039e620, - 0x72f8: 0x4039e820, 0x72f9: 0x4039ee20, 0x72fa: 0x4039f020, 0x72fb: 0x403a3820, - 0x72fc: 0x403a3a20, 0x72fd: 0x403a9c20, 0x72fe: 0x403a9e20, 0x72ff: 0x403aa020, - // Block 0x1cc, offset 0x7300 - 0x7300: 0xa0000000, 0x7301: 0x4039fc20, 0x7302: 0x403a1220, 0x7303: 0x403a1a20, - 0x7304: 0x403a4020, 0x7305: 0x403a4e20, 0x7306: 0x403a5620, 0x7307: 0x403a6820, - 0x7308: 0xc0560171, 0x7309: 0x403a9021, 0x730a: 0xc0580171, 0x730b: 0xa1b0a202, - 0x730c: 0xa1c0a502, 0x730d: 0xa1d0a902, 0x730e: 0xa1e0ad02, 0x730f: 0xa1f0b202, - 0x7310: 0xa200b602, 0x7311: 0xa210ba02, 0x7312: 0xa220bc02, 0x7313: 0xae60bd02, - 0x7314: 0xae60be02, 0x7315: 0xadc0bf02, 0x7316: 0xadc0c102, 0x7317: 0xae60c202, - 0x7318: 0xae60c302, 0x7319: 0xae60c402, 0x731a: 0xae60c502, 0x731b: 0xae60c602, - 0x731c: 0xadc0c702, 0x731d: 0xae60c802, 0x731e: 0xae60c902, 0x731f: 0xadc0c002, - 0x7320: 0xe000015e, 0x7321: 0xe00001e6, 0x7322: 0xe0000301, 0x7323: 0xe00003db, - 0x7324: 0xe00004b6, 0x7325: 0xe0000580, 0x7326: 0xe000064b, 0x7327: 0xe00006f3, - 0x7328: 0xe000079f, 0x7329: 0xe0000844, 0x732a: 0x4004ee20, 0x732b: 0x40024c20, - 0x732c: 0x40024e20, 0x732d: 0x4004de20, 0x732e: 0x40393a20, 0x732f: 0x403a1020, - 0x7330: 0xa230d102, 0x7331: 0x40392420, 0x7332: 0x40392220, 0x7333: 0x40392a20, - 0x7334: 0x00391c84, 0x7335: 0xf0000404, 0x7336: 0xf0000404, 0x7337: 0xf0000404, - 0x7338: 0xf0000404, 0x7339: 0x40395a20, 0x733a: 0x40395c20, 0x733b: 0x40393e20, - 0x733c: 0x40395e20, 0x733d: 0x40396020, 0x733e: 0x40394020, 0x733f: 0x40396220, - // Block 0x1cd, offset 0x7340 - 0x7340: 0x40073420, 0x7341: 0x40073620, - 0x7353: 0x003a269a, - 0x7354: 0x003a2699, 0x7355: 0x003a2697, 0x7356: 0x003a2698, 0x7357: 0x003a7c9a, - 0x7358: 0x003a7c99, 0x7359: 0x003a7a9a, 0x735a: 0x003a7a99, 0x735b: 0x003a7e9a, - 0x735c: 0x003a7e99, 0x735d: 0xf0001a1a, 0x735e: 0x003a849a, 0x735f: 0x003a8499, - 0x7360: 0x003a789a, 0x7361: 0x003a7899, 0x7362: 0x003a809a, 0x7363: 0x003a8099, - 0x7364: 0x003a989a, 0x7365: 0x003a9899, 0x7366: 0x003a9897, 0x7367: 0x003a9898, - 0x7368: 0x003a90a3, 0x7369: 0x003a90a4, 0x736a: 0xe0001559, 0x736b: 0xe0001556, - 0x736c: 0xe0001589, 0x736d: 0xe0001586, 0x736e: 0xe000158f, 0x736f: 0xe000158c, - 0x7370: 0xe000159b, 0x7371: 0xe0001598, 0x7372: 0xe0001595, 0x7373: 0xe0001592, - 0x7374: 0xe00015a1, 0x7375: 0xe000159e, 0x7376: 0xe00015bf, 0x7377: 0xe00015bc, - 0x7378: 0xe00015b9, 0x7379: 0xe00015ad, 0x737a: 0xe00015a7, 0x737b: 0xe00015a4, - 0x737c: 0x003a929a, 0x737d: 0x003a9299, 0x737e: 0x003a9297, 0x737f: 0x003a9298, - // Block 0x1ce, offset 0x7380 - 0x7380: 0xe000155f, 0x7381: 0xe0001565, 0x7382: 0xe000157a, 0x7383: 0xe00015b0, - 0x7384: 0xe00015b6, 0x7385: 0xf0001a1a, 0x7386: 0xf0001a1a, 0x7387: 0xf0001a1a, - 0x7388: 0xf0001a1a, 0x7389: 0xe0002894, 0x738a: 0xf0001a1a, 0x738b: 0xf0001a1a, - 0x738c: 0xf0001a1a, 0x738d: 0xf0001a1a, 0x738e: 0xf0001a1a, 0x738f: 0xe000289a, - 0x7390: 0xf0001a1a, 0x7391: 0xf0001a1a, 0x7392: 0xf0001a1a, 0x7393: 0xe00028a0, - 0x7394: 0xf0001a1a, 0x7395: 0xf0001a1a, 0x7396: 0xf0001a1a, 0x7397: 0xf0001a1a, - 0x7398: 0xf0001a1a, 0x7399: 0xf0001a1a, 0x739a: 0xf0001a1a, 0x739b: 0xf0001a1a, - 0x739c: 0xf0001a1a, 0x739d: 0xf0001a1a, 0x739e: 0xf0001a1a, 0x739f: 0xf0001a1a, - 0x73a0: 0xf0001a1a, 0x73a1: 0xf0001a1a, 0x73a2: 0xf0001a1a, 0x73a3: 0xf0001a1a, - 0x73a4: 0xf0001a1a, 0x73a5: 0xf0001a1a, 0x73a6: 0xf0001a1a, 0x73a7: 0xf0001a1a, - 0x73a8: 0xf0001a1a, 0x73a9: 0xf0001a1a, 0x73aa: 0xf0001a1a, 0x73ab: 0xf0001a1a, - 0x73ac: 0xf0001a1a, 0x73ad: 0xf0001a1a, 0x73ae: 0xf0001a1a, 0x73af: 0xf0001a1a, - 0x73b0: 0xf0001a1a, 0x73b1: 0xe00028e2, 0x73b2: 0xf0001a1a, 0x73b3: 0xf0001a1a, - 0x73b4: 0xf0001a1a, 0x73b5: 0xe00028e8, 0x73b6: 0xf0001a1a, 0x73b7: 0xf0001a1a, - 0x73b8: 0xf0001a1a, 0x73b9: 0xf0001a1a, 0x73ba: 0xf0001a1a, 0x73bb: 0xf0001a1a, - 0x73bc: 0xf0001a1a, 0x73bd: 0xe00028ee, 0x73be: 0xf0001a1a, 0x73bf: 0xf0001a1a, - // Block 0x1cf, offset 0x73c0 - 0x73c0: 0xf0001a1a, 0x73c1: 0xf0001a1a, 0x73c2: 0xf0001a1a, 0x73c3: 0xe00028f4, - 0x73c4: 0xf0001a1a, 0x73c5: 0xf0001a1a, 0x73c6: 0xf0001a1a, 0x73c7: 0xf0001a1a, - 0x73c8: 0xf0001a1a, 0x73c9: 0xe00028f7, 0x73ca: 0xf0001a1a, 0x73cb: 0xf0001a1a, - 0x73cc: 0xf0001a1a, 0x73cd: 0xf0001a1a, 0x73ce: 0xf0001a1a, 0x73cf: 0xe00028fd, - 0x73d0: 0xf0001a1a, 0x73d1: 0xf0001a1a, 0x73d2: 0xf0001a1a, 0x73d3: 0xe0002900, - 0x73d4: 0xf0001a1a, 0x73d5: 0xf0001a1a, 0x73d6: 0xf0001a1a, 0x73d7: 0xf0001a1a, - 0x73d8: 0xf0001a1a, 0x73d9: 0xe0002906, 0x73da: 0xf0001a1a, 0x73db: 0xf0001a1a, - 0x73dc: 0xf0001a1a, 0x73dd: 0x003a90a8, 0x73de: 0xe0000003, 0x73df: 0xe0000006, - 0x73e0: 0xe0000009, 0x73e1: 0xe000000c, 0x73e2: 0xe000000f, 0x73e3: 0xe0000012, - 0x73e4: 0xe000156b, 0x73e5: 0xe000156e, 0x73e6: 0xe0001577, 0x73e7: 0xe000157d, - 0x73e8: 0xe00015aa, 0x73e9: 0xe00015b3, 0x73ea: 0xf0001919, 0x73eb: 0xf0001919, - 0x73ec: 0xf0001919, 0x73ed: 0xf0001919, 0x73ee: 0xe0002891, 0x73ef: 0xf0001919, - 0x73f0: 0xf0001919, 0x73f1: 0xf0001919, 0x73f2: 0xf0001919, 0x73f3: 0xf0001919, - 0x73f4: 0xe0002897, 0x73f5: 0xf0001919, 0x73f6: 0xf0001919, 0x73f7: 0xf0001919, - 0x73f8: 0xf0001919, 0x73f9: 0xf0001919, 0x73fa: 0xe000289d, 0x73fb: 0xf0001919, - 0x73fc: 0xe00028df, 0x73fd: 0xf0001919, 0x73fe: 0xe00028e5, 0x73ff: 0xf0001919, - // Block 0x1d0, offset 0x7400 - 0x7400: 0xf0001919, 0x7401: 0xf0001919, 0x7402: 0xf0001919, 0x7403: 0xe00028eb, - 0x7404: 0xf0001919, 0x7405: 0xf0001919, 0x7406: 0xe00028f1, 0x7407: 0xf0001919, - 0x7408: 0xf0001919, 0x7409: 0xf0001919, 0x740a: 0xf0001919, 0x740b: 0xf0001919, - 0x740c: 0xf0001919, 0x740d: 0xf0001919, 0x740e: 0xe00028fa, 0x740f: 0xf0001919, - 0x7410: 0x003a90a7, 0x7411: 0xf0001919, 0x7412: 0xf0001919, 0x7413: 0xf0001919, - 0x7414: 0xf0001919, 0x7415: 0xe0002903, 0x7416: 0xf0001919, 0x7417: 0xe000155c, - 0x7418: 0xe0001562, 0x7419: 0xe0001568, 0x741a: 0xe0001571, 0x741b: 0xe0001580, - 0x741c: 0xf0001717, 0x741d: 0xf0001717, 0x741e: 0xf0001717, 0x741f: 0xf0001717, - 0x7420: 0xf0001717, 0x7421: 0xf0001717, 0x7422: 0xf0001717, 0x7423: 0xf0001717, - 0x7424: 0xf0001717, 0x7425: 0xf0001717, 0x7426: 0xf0001717, 0x7427: 0xf0001717, - 0x7428: 0xf0001717, 0x7429: 0xf0001717, 0x742a: 0xf0001717, 0x742b: 0xf0001717, - 0x742c: 0xf0001717, 0x742d: 0xf0001717, 0x742e: 0xf0001717, 0x742f: 0xf0001717, - 0x7430: 0xf0001717, 0x7431: 0xf0001717, 0x7432: 0xf0001717, 0x7433: 0xf0001717, - 0x7434: 0xf0001717, 0x7435: 0xf0001717, 0x7436: 0xf0001717, 0x7437: 0xf0001717, - 0x7438: 0xf0001717, 0x7439: 0xf0001717, 0x743a: 0xf0001717, 0x743b: 0xf0001717, - 0x743c: 0xf0001717, 0x743d: 0xf0001717, 0x743e: 0xf0001717, 0x743f: 0xf0001717, - // Block 0x1d1, offset 0x7440 - 0x7440: 0xf0001717, 0x7441: 0xf0001717, 0x7442: 0xf0001717, 0x7443: 0xf0001717, - 0x7444: 0xf0001717, 0x7445: 0xf0001717, 0x7446: 0xf0001717, 0x7447: 0xf0001717, - 0x7448: 0xf0001717, 0x7449: 0xf0001717, 0x744a: 0xf0001717, 0x744b: 0xf0001717, - 0x744c: 0xf0001717, 0x744d: 0xf0001717, 0x744e: 0xf0001717, 0x744f: 0xf0001717, - 0x7450: 0xf0001717, 0x7451: 0xf0001717, 0x7452: 0xf0001717, 0x7453: 0xf0001717, - 0x7454: 0xf0001717, 0x7455: 0xf0001717, 0x7456: 0xf0001717, 0x7457: 0xf0001717, - 0x7458: 0xf0001717, 0x7459: 0xf0001717, 0x745a: 0xf0001717, 0x745b: 0xf0001717, - 0x745c: 0xf0001717, 0x745d: 0xf0001717, 0x745e: 0xf0001717, 0x745f: 0xe0001574, - 0x7460: 0xe0001583, 0x7461: 0xf0001818, 0x7462: 0xf0001818, 0x7463: 0xf0001818, - 0x7464: 0xf0001818, 0x7465: 0xf0001818, 0x7466: 0xf0001818, 0x7467: 0xf0001818, - 0x7468: 0xf0001818, 0x7469: 0xf0001818, 0x746a: 0xf0001818, 0x746b: 0xf0001818, - 0x746c: 0xf0001818, 0x746d: 0xf0001818, 0x746e: 0xf0001818, 0x746f: 0xf0001818, - 0x7470: 0xf0001818, 0x7471: 0xf0001818, 0x7472: 0xf0001818, 0x7473: 0xf0001818, - 0x7474: 0xf0001818, 0x7475: 0xe00028d0, 0x7476: 0xf0001a1a, 0x7477: 0xe00028d6, - 0x7478: 0xf0001a1a, 0x7479: 0xe00028dc, 0x747a: 0xf0001a1a, 0x747b: 0xe00028b8, - 0x747c: 0xf0001a1a, 0x747d: 0xe00028be, 0x747e: 0xf0001a1a, 0x747f: 0xe00028ac, - // Block 0x1d2, offset 0x7480 - 0x7480: 0xf0001a1a, 0x7481: 0xe00028a6, 0x7482: 0xf0001a1a, 0x7483: 0xe00028b2, - 0x7484: 0xf0001a1a, 0x7485: 0xe00028c4, 0x7486: 0xf0001a1a, 0x7487: 0xe00028ca, - 0x7488: 0xf0001a1a, 0x7489: 0xf0001a1a, 0x748a: 0xf0001a1a, 0x748b: 0xf0001a1a, - 0x748c: 0xf0001a1a, 0x748d: 0xf0001a1a, 0x748e: 0xf0001a1a, 0x748f: 0xf0001a1a, - 0x7490: 0xf0001a1a, 0x7491: 0xe00028cd, 0x7492: 0xf0001919, 0x7493: 0xe00028d3, - 0x7494: 0xf0001919, 0x7495: 0xe00028d9, 0x7496: 0xf0001919, 0x7497: 0xe00028b5, - 0x7498: 0xf0001919, 0x7499: 0xe00028bb, 0x749a: 0xf0001919, 0x749b: 0xe00028a9, - 0x749c: 0xf0001919, 0x749d: 0xe00028a3, 0x749e: 0xf0001919, 0x749f: 0xe00028af, - 0x74a0: 0xf0001919, 0x74a1: 0xe00028c1, 0x74a2: 0xf0001919, 0x74a3: 0xe00028c7, - 0x74a4: 0xf0001919, 0x74a5: 0xf0001919, 0x74a6: 0xf0001919, 0x74a7: 0xf0001919, - 0x74a8: 0xf0001919, 0x74a9: 0xf0001919, 0x74aa: 0xf0001919, 0x74ab: 0xf0001919, - 0x74ac: 0xf0001919, 0x74ad: 0xf0001717, 0x74ae: 0xf0001717, 0x74af: 0xf0001717, - 0x74b0: 0xf0001717, 0x74b1: 0xf0001717, 0x74b2: 0xf0001717, 0x74b3: 0xf0001717, - 0x74b4: 0xf0001818, 0x74b5: 0xf0001818, 0x74b6: 0xf0001818, 0x74b7: 0xf0001818, - 0x74b8: 0xf0001818, 0x74b9: 0xf0001818, 0x74ba: 0xf0001818, 0x74bb: 0xf0001818, - 0x74bc: 0xf0001919, 0x74bd: 0xf0001a1a, 0x74be: 0x4004c020, 0x74bf: 0x4004c220, - // Block 0x1d3, offset 0x74c0 - 0x74c0: 0x00391c9a, 0x74c1: 0x00391e9a, 0x74c2: 0x00391e99, 0x74c3: 0x0039209a, - 0x74c4: 0x00392099, 0x74c5: 0x0039269a, 0x74c6: 0x00392699, 0x74c7: 0x0039289a, - 0x74c8: 0x00392899, 0x74c9: 0x0039309a, 0x74ca: 0x00393099, 0x74cb: 0x00393097, - 0x74cc: 0x00393098, 0x74cd: 0x0039389a, 0x74ce: 0x00393899, 0x74cf: 0x00393c9a, - 0x74d0: 0x00393c99, 0x74d1: 0x00393c97, 0x74d2: 0x00393c98, 0x74d3: 0x003956a4, - 0x74d4: 0x003956a3, 0x74d5: 0x0039569a, 0x74d6: 0x00395699, 0x74d7: 0x00395697, - 0x74d8: 0x00395698, 0x74d9: 0x0039589a, 0x74da: 0x00395899, 0x74db: 0x00395897, - 0x74dc: 0x00395898, 0x74dd: 0x0039649a, 0x74de: 0x00396499, 0x74df: 0x00396497, - 0x74e0: 0x00396498, 0x74e1: 0x0039729a, 0x74e2: 0x00397299, 0x74e3: 0x00397297, - 0x74e4: 0x00397298, 0x74e5: 0x0039749a, 0x74e6: 0x00397499, 0x74e7: 0x00397497, - 0x74e8: 0x00397498, 0x74e9: 0x0039889a, 0x74ea: 0x00398899, 0x74eb: 0x00398a9a, - 0x74ec: 0x00398a99, 0x74ed: 0x0039a49a, 0x74ee: 0x0039a499, 0x74ef: 0x0039a69a, - 0x74f0: 0x0039a699, 0x74f1: 0x0039c69a, 0x74f2: 0x0039c699, 0x74f3: 0x0039c697, - 0x74f4: 0x0039c698, 0x74f5: 0x0039c89a, 0x74f6: 0x0039c899, 0x74f7: 0x0039c897, - 0x74f8: 0x0039c898, 0x74f9: 0x0039dc9a, 0x74fa: 0x0039dc99, 0x74fb: 0x0039dc97, - 0x74fc: 0x0039dc98, 0x74fd: 0x0039de9a, 0x74fe: 0x0039de99, 0x74ff: 0x0039de97, - // Block 0x1d4, offset 0x7500 - 0x7500: 0x0039de98, 0x7501: 0x0039e69a, 0x7502: 0x0039e699, 0x7503: 0x0039e697, - 0x7504: 0x0039e698, 0x7505: 0x0039e89a, 0x7506: 0x0039e899, 0x7507: 0x0039e897, - 0x7508: 0x0039e898, 0x7509: 0x0039ee9a, 0x750a: 0x0039ee99, 0x750b: 0x0039ee97, - 0x750c: 0x0039ee98, 0x750d: 0x0039f09a, 0x750e: 0x0039f099, 0x750f: 0x0039f097, - 0x7510: 0x0039f098, 0x7511: 0x0039fc9a, 0x7512: 0x0039fc99, 0x7513: 0x0039fc97, - 0x7514: 0x0039fc98, 0x7515: 0x003a129a, 0x7516: 0x003a1299, 0x7517: 0x003a1297, - 0x7518: 0x003a1298, 0x7519: 0x003a1a9a, 0x751a: 0x003a1a99, 0x751b: 0x003a1a97, - 0x751c: 0x003a1a98, 0x751d: 0x003a409a, 0x751e: 0x003a4099, 0x751f: 0x003a4097, - 0x7520: 0x003a4098, 0x7521: 0x003a4e9a, 0x7522: 0x003a4e99, 0x7523: 0x003a4e97, - 0x7524: 0x003a4e98, 0x7525: 0x003a569a, 0x7526: 0x003a5699, 0x7527: 0x003a5697, - 0x7528: 0x003a5698, 0x7529: 0x003a689a, 0x752a: 0x003a6899, 0x752b: 0x003a6897, - 0x752c: 0x003a6898, 0x752d: 0x003a749a, 0x752e: 0x003a7499, 0x752f: 0x003a90a6, - 0x7530: 0x003a90a5, 0x7531: 0x003a909a, 0x7532: 0x003a9099, 0x7533: 0x003a9097, - 0x7534: 0x003a9098, 0x7535: 0xe0001732, 0x7536: 0xe000172f, 0x7537: 0xe0001738, - 0x7538: 0xe0001735, 0x7539: 0xe000173e, 0x753a: 0xe000173b, 0x753b: 0xf0001a1a, - 0x753c: 0xf0001919, 0x753f: 0xa0000000, - // Block 0x1d5, offset 0x7540 - 0x7541: 0x40409a20, 0x7542: 0x40409820, 0x7543: 0x40409c20, - 0x7545: 0x40407c20, 0x7546: 0x40407e20, 0x7547: 0x40408020, - 0x7548: 0x40408220, 0x7549: 0x40408420, 0x754a: 0x40408620, 0x754b: 0x40408820, - 0x754c: 0x40408c20, 0x754f: 0x40409020, - 0x7550: 0x40409220, 0x7553: 0x40409420, - 0x7554: 0x40409620, 0x7555: 0xc33108b1, 0x7556: 0x40409a20, 0x7557: 0x40409c20, - 0x7558: 0x40409e20, 0x7559: 0x4040a020, 0x755a: 0x4040a220, 0x755b: 0x4040a420, - 0x755c: 0x4040a620, 0x755d: 0x4040a820, 0x755e: 0x4040aa20, 0x755f: 0x4040ac20, - 0x7560: 0x4040ae20, 0x7561: 0x4040b020, 0x7562: 0x4040b220, 0x7563: 0x4040b420, - 0x7564: 0xc32f0851, 0x7565: 0x4040b820, 0x7566: 0x4040ba20, 0x7567: 0x4040bc20, - 0x7568: 0x4040be20, 0x756a: 0x4040c020, 0x756b: 0x4040c220, - 0x756c: 0x4040c420, 0x756d: 0x4040c620, 0x756e: 0x4040c820, 0x756f: 0x4040ca20, - 0x7570: 0x4040cc20, 0x7572: 0x4040d020, - 0x7576: 0x4040d420, 0x7577: 0x4040d620, - 0x7578: 0x4040d820, 0x7579: 0x4040da20, - 0x757c: 0xa070f102, 0x757d: 0x4040dc20, 0x757e: 0x4040de20, 0x757f: 0x4040e020, - // Block 0x1d6, offset 0x7580 - 0x7580: 0x4040e220, 0x7581: 0x4040e420, 0x7582: 0x4040e620, 0x7583: 0x4040e820, - 0x7584: 0x4040ea20, 0x7587: 0xc05a0191, - 0x7588: 0x4040f220, 0x758b: 0x4040f420, - 0x758c: 0x4040f620, 0x758d: 0x8209207c, 0x758e: 0x4040b420, - 0x7597: 0x4040fa20, - 0x759c: 0xe000183f, 0x759d: 0xe0001842, 0x759f: 0xe0001848, - 0x75a0: 0x40408a20, 0x75a1: 0x40408e20, 0x75a2: 0x4040ec20, 0x75a3: 0x4040ee20, - 0x75a6: 0xe000016d, 0x75a7: 0xe00001fb, - 0x75a8: 0xe0000316, 0x75a9: 0xe00003f0, 0x75aa: 0xe00004cb, 0x75ab: 0xe0000595, - 0x75ac: 0xe0000660, 0x75ad: 0xe0000708, 0x75ae: 0xe00007b4, 0x75af: 0xe0000859, - 0x75b0: 0x4040ce20, 0x75b1: 0x4040d220, 0x75b2: 0x4027e820, 0x75b3: 0x4027ea20, - 0x75b4: 0x40283020, 0x75b5: 0x40283220, 0x75b6: 0x40283420, 0x75b7: 0x40283620, - 0x75b8: 0x40283820, 0x75b9: 0x40283a20, 0x75ba: 0x40073a20, 0x75bb: 0x4027ec20, - // Block 0x1d7, offset 0x75c0 - 0x75c0: 0xa0000000, 0x75c1: 0xa0000000, 0x75c2: 0xa0000000, 0x75c3: 0xa0000000, - 0x75c4: 0xa0000000, 0x75c5: 0xa0000000, 0x75c6: 0xa0000000, 0x75c7: 0xa0000000, - 0x75c8: 0xa0000000, 0x75c9: 0x40020020, 0x75ca: 0x40020220, 0x75cb: 0x40020420, - 0x75cc: 0x40020620, 0x75cd: 0x40020820, 0x75ce: 0xa0000000, 0x75cf: 0xa0000000, - 0x75d0: 0xa0000000, 0x75d1: 0xa0000000, 0x75d2: 0xa0000000, 0x75d3: 0xa0000000, - 0x75d4: 0xa0000000, 0x75d5: 0xa0000000, 0x75d6: 0xa0000000, 0x75d7: 0xa0000000, - 0x75d8: 0xa0000000, 0x75d9: 0xa0000000, 0x75da: 0xa0000000, 0x75db: 0xa0000000, - 0x75dc: 0xa0000000, 0x75dd: 0xa0000000, 0x75de: 0xa0000000, 0x75df: 0xa0000000, - 0x75e0: 0x40021220, 0x75e1: 0x4002ba20, 0x75e2: 0x4003e020, 0x75e3: 0x4004ea20, - 0x75e4: 0x4027de20, 0x75e5: 0x4004ec20, 0x75e6: 0x4004e620, 0x75e7: 0x4003d220, - 0x75e8: 0x4003f420, 0x75e9: 0x4003f620, 0x75ea: 0x4004d820, 0x75eb: 0x40093820, - 0x75ec: 0x40024020, 0x75ed: 0x40021a20, 0x75ee: 0x4002e420, 0x75ef: 0x4004e220, - 0x75f0: 0x4029cc20, 0x75f1: 0x4029ce20, 0x75f2: 0x4029d020, 0x75f3: 0x4029d220, - 0x75f4: 0x4029d420, 0x75f5: 0x4029d620, 0x75f6: 0x4029d820, 0x75f7: 0x4029da20, - 0x75f8: 0x4029dc20, 0x75f9: 0x4029de20, 0x75fa: 0x40026c20, 0x75fb: 0x40026220, - 0x75fc: 0x40094020, 0x75fd: 0x40094220, 0x75fe: 0x40094420, 0x75ff: 0x4002c420, - // Block 0x1d8, offset 0x7600 - 0x7600: 0x4004d620, 0x7601: 0x002bde88, 0x7602: 0x002c0a88, 0x7603: 0xc3350911, - 0x7604: 0x002c6288, 0x7605: 0x002c9888, 0x7606: 0x002d0888, 0x7607: 0xc33900d1, - 0x7608: 0x002d6888, 0x7609: 0xc33b0931, 0x760a: 0x002dcc88, 0x760b: 0x002dfe88, - 0x760c: 0xc0030002, 0x760d: 0x002e8288, 0x760e: 0x002e9e88, 0x760f: 0xc33f0071, - 0x7610: 0x002f2c88, 0x7611: 0x002e0083, 0x7612: 0x002f7a88, 0x7613: 0xc3430911, - 0x7614: 0x00302c88, 0x7615: 0xc3470071, 0x7616: 0x0030be88, 0x7617: 0x0030e288, - 0x7618: 0x002d6a83, 0x7619: 0x00310088, 0x761a: 0x00312a88, 0x761b: 0x4003f820, - 0x761c: 0x4004e420, 0x761d: 0x4003fa20, 0x761e: 0x40062420, 0x761f: 0x40021620, - 0x7620: 0x40061e20, 0x7621: 0x402bde20, 0x7622: 0x402c0a20, 0x7623: 0xc3330911, - 0x7624: 0x402c6220, 0x7625: 0x402c9820, 0x7626: 0x402d0820, 0x7627: 0xc33700d1, - 0x7628: 0x402d6820, 0x7629: 0x402d9a20, 0x762a: 0x402dcc20, 0x762b: 0x402dfe20, - 0x762c: 0xc0000002, 0x762d: 0x402e8220, 0x762e: 0x402e9e20, 0x762f: 0xc33d0071, - 0x7630: 0x402f2c20, 0x7631: 0x402e0020, 0x7632: 0x402f7a20, 0x7633: 0xc3410911, - 0x7634: 0x40302c20, 0x7635: 0xc3450071, 0x7636: 0x4030be20, 0x7637: 0x4030e220, - 0x7638: 0x402d6a20, 0x7639: 0x40310020, 0x763a: 0x40312a20, 0x763b: 0x4003fc20, - 0x763c: 0x40094820, 0x763d: 0x4003fe20, 0x763e: 0x40094c20, 0x763f: 0xa0000000, - // Block 0x1d9, offset 0x7640 - 0x7640: 0xe00008f5, 0x7641: 0xe00008ef, 0x7642: 0xe0000921, 0x7643: 0xe0000969, - 0x7644: 0xe000095b, 0x7645: 0xe000094d, 0x7646: 0xe00009dd, 0x7647: 0x002c3c83, - 0x7648: 0xe0000ae8, 0x7649: 0xe0000ae2, 0x764a: 0xe0000af4, 0x764b: 0xe0000b20, - 0x764c: 0xe0002918, 0x764d: 0xe0002915, 0x764e: 0xe000291e, 0x764f: 0xe0002924, - 0x7650: 0xe0000ab3, 0x7651: 0xe0000d63, 0x7652: 0xe0000d9a, 0x7653: 0xe0000d94, - 0x7654: 0xe0000da6, 0x7655: 0xe0000de6, 0x7656: 0x002ee483, 0x7657: 0x40093e20, - 0x7658: 0xe0000e12, 0x7659: 0xe0000fe1, 0x765a: 0xe0000fdb, 0x765b: 0xe0000fed, - 0x765c: 0x00306e83, 0x765d: 0xe0001102, 0x765e: 0x00318888, 0x765f: 0xe0000f7b, - 0x7660: 0xe00008f2, 0x7661: 0xe00008ec, 0x7662: 0xe000091e, 0x7663: 0xe0000966, - 0x7664: 0xe0000958, 0x7665: 0xe000094a, 0x7666: 0xe00009d5, 0x7667: 0x402c3c20, - 0x7668: 0xe0000ae5, 0x7669: 0xe0000adf, 0x766a: 0xe0000af1, 0x766b: 0xe0000b1d, - 0x766c: 0xe0000c28, 0x766d: 0xe0000c22, 0x766e: 0xe0000c34, 0x766f: 0xe0000c40, - 0x7670: 0xe0000aad, 0x7671: 0xe0000d60, 0x7672: 0xe0000d97, 0x7673: 0xe0000d91, - 0x7674: 0xe0000da3, 0x7675: 0xe0000de3, 0x7676: 0x402ee420, 0x7677: 0x40093c20, - 0x7678: 0xe0000e0f, 0x7679: 0xe0000fde, 0x767a: 0xe0000fd8, 0x767b: 0xe0000fea, - 0x767c: 0x40306e20, 0x767d: 0xe00010ff, 0x767e: 0x40318820, 0x767f: 0xe0001114, - // Block 0x1da, offset 0x7680 - 0x7680: 0xe0000983, 0x7681: 0xe0000980, 0x7682: 0xe00008fb, 0x7683: 0xe00008f8, - 0x7684: 0xe000097d, 0x7685: 0xe000097a, 0x7686: 0xe0000a38, 0x7687: 0xe0000a35, - 0x7688: 0xe0000a3e, 0x7689: 0xe0000a3b, 0x768a: 0xe0000a4a, 0x768b: 0xe0000a47, - 0x768c: 0xe0000a44, 0x768d: 0xe0000a41, 0x768e: 0xe0000a86, 0x768f: 0xe0000a83, - 0x7690: 0xe0000aaa, 0x7691: 0xe0000aa7, 0x7692: 0xe0000b46, 0x7693: 0xe0000b43, - 0x7694: 0xe0000aee, 0x7695: 0xe0000aeb, 0x7696: 0xe0000b2c, 0x7697: 0xe0000b29, - 0x7698: 0xe0000b40, 0x7699: 0xe0000b3d, 0x769a: 0xe0000b1a, 0x769b: 0xe0000b17, - 0x769c: 0xe0000bb8, 0x769d: 0xe0000bb5, 0x769e: 0x002d2483, 0x769f: 0x402d2420, - 0x76a0: 0xe0000bc4, 0x76a1: 0xe0000bc1, 0x76a2: 0xe0000bca, 0x76a3: 0xe0000bc7, - 0x76a4: 0xe0000bee, 0x76a5: 0xe0000beb, 0x76a6: 0xe0000c1b, 0x76a7: 0xe0000c18, - 0x76a8: 0xe000292b, 0x76a9: 0xe0000c4e, 0x76aa: 0xe0002931, 0x76ab: 0xe0000c5d, - 0x76ac: 0xe000291b, 0x76ad: 0xe0000c2e, 0x76ae: 0xe000292e, 0x76af: 0xe0000c57, - 0x76b0: 0x002d9a83, 0x76b1: 0x402d9820, 0x76b2: 0xe00027e2, 0x76b3: 0xf0000404, - 0x76b4: 0xe0000c8a, 0x76b5: 0xe0000c87, 0x76b6: 0xe0000c9f, 0x76b7: 0xe0000c9c, - 0x76b8: 0x402f7220, 0x76b9: 0xe0000ccc, 0x76ba: 0xe0000cc9, 0x76bb: 0xe0000cd8, - 0x76bc: 0xe0000cd5, 0x76bd: 0xe0000cd2, 0x76be: 0xe0000ccf, 0x76bf: 0xe0000d04, - // Block 0x1db, offset 0x76c0 - 0x76c0: 0xe0000cfe, 0x76c1: 0xe0000cf8, 0x76c2: 0xe0000cf5, 0x76c3: 0xe0000d51, - 0x76c4: 0xe0000d4e, 0x76c5: 0xe0000d6f, 0x76c6: 0xe0000d6c, 0x76c7: 0xe0000d5d, - 0x76c8: 0xe0000d5a, 0x76c9: 0xf0000404, 0x76ca: 0x002eda88, 0x76cb: 0x402eda20, - 0x76cc: 0xe0000e2e, 0x76cd: 0xe0000e2b, 0x76ce: 0xe0000da0, 0x76cf: 0xe0000d9d, - 0x76d0: 0xe0000de0, 0x76d1: 0xe0000ddd, 0x76d2: 0xe0000e93, 0x76d3: 0xe0000e8f, - 0x76d4: 0xe0000eca, 0x76d5: 0xe0000ec7, 0x76d6: 0xe0000edc, 0x76d7: 0xe0000ed9, - 0x76d8: 0xe0000ed0, 0x76d9: 0xe0000ecd, 0x76da: 0xe0000f1f, 0x76db: 0xe0000f1c, - 0x76dc: 0xe0000f2d, 0x76dd: 0xe0000f2a, 0x76de: 0x002fe883, 0x76df: 0x402fe820, - 0x76e0: 0xe0000f33, 0x76e1: 0xe0000f30, 0x76e2: 0xe0000f99, 0x76e3: 0xe0000f96, - 0x76e4: 0xe0000f8a, 0x76e5: 0xe0000f87, 0x76e6: 0x00303688, 0x76e7: 0x40303620, - 0x76e8: 0xe000102b, 0x76e9: 0xe0001028, 0x76ea: 0xe000103f, 0x76eb: 0xe000103c, - 0x76ec: 0xe0000fe7, 0x76ed: 0xe0000fe4, 0x76ee: 0xe0000ff9, 0x76ef: 0xe0000ff6, - 0x76f0: 0xe0001025, 0x76f1: 0xe0001022, 0x76f2: 0xe0001039, 0x76f3: 0xe0001036, - 0x76f4: 0xe00010d8, 0x76f5: 0xe00010d5, 0x76f6: 0xe000110e, 0x76f7: 0xe000110b, - 0x76f8: 0xe0001117, 0x76f9: 0xe000113b, 0x76fa: 0xe0001138, 0x76fb: 0xe000114d, - 0x76fc: 0xe000114a, 0x76fd: 0xe0001147, 0x76fe: 0xe0001144, 0x76ff: 0xe0000f64, - // Block 0x1dc, offset 0x7700 - 0x7700: 0x402c1a20, 0x7701: 0x002c2a88, 0x7702: 0x002c3288, 0x7703: 0x402c3220, - 0x7704: 0x0031c488, 0x7705: 0x4031c420, 0x7706: 0x002efa88, 0x7707: 0x002c4e88, - 0x7708: 0x402c4e20, 0x7709: 0x002c7288, 0x770a: 0x002c7a88, 0x770b: 0x002c8488, - 0x770c: 0x402c8420, 0x770d: 0xe000115c, 0x770e: 0x002cae88, 0x770f: 0x002c9a83, - 0x7710: 0x002cc288, 0x7711: 0x002d1688, 0x7712: 0x402d1620, 0x7713: 0x002d4488, - 0x7714: 0x002d5888, 0x7715: 0x402d7820, 0x7716: 0x002dc288, 0x7717: 0x002db688, - 0x7718: 0x002e0a88, 0x7719: 0x402e0a20, 0x771a: 0x402e3820, 0x771b: 0x402e7220, - 0x771c: 0x0030a088, 0x771d: 0x002eb488, 0x771e: 0x402ebc20, 0x771f: 0x002f1088, - 0x7720: 0xe0000e56, 0x7721: 0xe0000e53, 0x7722: 0x002d6088, 0x7723: 0x402d6020, - 0x7724: 0x002f3e88, 0x7725: 0x402f3e20, 0x7726: 0x002f8288, 0x7727: 0x0031b488, - 0x7728: 0x4031b420, 0x7729: 0x00300888, 0x772a: 0x40301220, 0x772b: 0x40304220, - 0x772c: 0x00304a88, 0x772d: 0x40304a20, 0x772e: 0x00305288, 0x772f: 0xe000105f, - 0x7730: 0xe000105c, 0x7731: 0x0030b488, 0x7732: 0x0030cc88, 0x7733: 0x00311888, - 0x7734: 0x40311820, 0x7735: 0x00313488, 0x7736: 0x40313420, 0x7737: 0x00316488, - 0x7738: 0x00316e88, 0x7739: 0x40316e20, 0x773a: 0x40317820, 0x773b: 0x4031a620, - 0x773c: 0x0031bc88, 0x773d: 0x4031bc20, 0x773e: 0xe0000fc9, 0x773f: 0x40319420, - // Block 0x1dd, offset 0x7740 - 0x7740: 0x40321220, 0x7741: 0x40321a20, 0x7742: 0x40322220, 0x7743: 0x40322a20, - 0x7744: 0xe0000ad5, 0x7745: 0xe0000ad1, 0x7746: 0xe0000acd, 0x7747: 0xf0000a0a, - 0x7748: 0xf000040a, 0x7749: 0xf0000404, 0x774a: 0xf0000a0a, 0x774b: 0xf000040a, - 0x774c: 0xf0000404, 0x774d: 0xe0000947, 0x774e: 0xe0000944, 0x774f: 0xe0002921, - 0x7750: 0xe0000c3a, 0x7751: 0xe0000dcc, 0x7752: 0xe0000dc9, 0x7753: 0xe0000ff3, - 0x7754: 0xe0000ff0, 0x7755: 0xe0002964, 0x7756: 0xe0002961, 0x7757: 0xe0002952, - 0x7758: 0xe000294f, 0x7759: 0xe000295e, 0x775a: 0xe000295b, 0x775b: 0xe0002958, - 0x775c: 0xe0002955, 0x775d: 0x402cae20, 0x775e: 0xe0000962, 0x775f: 0xe000095e, - 0x7760: 0xe0000976, 0x7761: 0xe0000972, 0x7762: 0xe00009f4, 0x7763: 0xe00009ef, - 0x7764: 0x002d3a88, 0x7765: 0x402d3a20, 0x7766: 0xe0000bbe, 0x7767: 0xe0000bbb, - 0x7768: 0xe0000c99, 0x7769: 0xe0000c96, 0x776a: 0xe0000e20, 0x776b: 0xe0000e1d, - 0x776c: 0xe0000e27, 0x776d: 0xe0000e23, 0x776e: 0xe0001162, 0x776f: 0xe000115f, - 0x7770: 0xe0000c8d, 0x7771: 0xf0000a0a, 0x7772: 0xf000040a, 0x7773: 0xf0000404, - 0x7774: 0xe0000bac, 0x7775: 0xe0000ba9, 0x7776: 0x002d7888, 0x7777: 0x00319488, - 0x7778: 0xe0000d57, 0x7779: 0xe0000d54, 0x777a: 0xe0000954, 0x777b: 0xe0000950, - 0x777c: 0xe00009ea, 0x777d: 0xe00009e5, 0x777e: 0xe0000e19, 0x777f: 0xe0000e15, - // Block 0x1de, offset 0x7780 - 0x7780: 0xe000098f, 0x7781: 0xe000098c, 0x7782: 0xe0000995, 0x7783: 0xe0000992, - 0x7784: 0xe0000b62, 0x7785: 0xe0000b5f, 0x7786: 0xe0000b68, 0x7787: 0xe0000b65, - 0x7788: 0xe0002937, 0x7789: 0xe0000c69, 0x778a: 0xe000293a, 0x778b: 0xe0000c6f, - 0x778c: 0xe0000e4a, 0x778d: 0xe0000e47, 0x778e: 0xe0000e50, 0x778f: 0xe0000e4d, - 0x7790: 0xe0000ee8, 0x7791: 0xe0000ee5, 0x7792: 0xe0000eee, 0x7793: 0xe0000eeb, - 0x7794: 0xe0001053, 0x7795: 0xe0001050, 0x7796: 0xe0001059, 0x7797: 0xe0001056, - 0x7798: 0xe0000f61, 0x7799: 0xe0000f5e, 0x779a: 0xe0000fa5, 0x779b: 0xe0000fa2, - 0x779c: 0x00312288, 0x779d: 0x40312220, 0x779e: 0xe0000bf4, 0x779f: 0xe0000bf1, - 0x77a0: 0x002ebc88, 0x77a1: 0x402c8c20, 0x77a2: 0x002f2288, 0x77a3: 0x402f2220, - 0x77a4: 0x00314088, 0x77a5: 0x40314020, 0x77a6: 0xe000096f, 0x77a7: 0xe000096c, - 0x77a8: 0xe0000b32, 0x77a9: 0xe0000b2f, 0x77aa: 0xe000294c, 0x77ab: 0xe0002949, - 0x77ac: 0xe0000dfd, 0x77ad: 0xe0000df9, 0x77ae: 0xe0000e04, 0x77af: 0xe0000e01, - 0x77b0: 0xe0000e0b, 0x77b1: 0xe0000e07, 0x77b2: 0xe0001129, 0x77b3: 0xe0001126, - 0x77b4: 0x402e5e20, 0x77b5: 0x402ed020, 0x77b6: 0x40305a20, 0x77b7: 0x402dd420, - 0x77b8: 0xe0000abf, 0x77b9: 0xe0000ec4, 0x77ba: 0x002be888, 0x77bb: 0x002c4488, - 0x77bc: 0x402c4420, 0x77bd: 0x002e3888, 0x77be: 0x00303e88, 0x77bf: 0x402ffc20, - // Block 0x1df, offset 0x77c0 - 0x77c0: 0x40315820, 0x77c1: 0x0031d488, 0x77c2: 0x4031d420, 0x77c3: 0x002c1a88, - 0x77c4: 0x00307c88, 0x77c5: 0x0030da88, 0x77c6: 0x002ca288, 0x77c7: 0x402ca220, - 0x77c8: 0x002dde88, 0x77c9: 0x402dde20, 0x77ca: 0x002f6a88, 0x77cb: 0x402f6a20, - 0x77cc: 0x002f8e88, 0x77cd: 0x402f8e20, 0x77ce: 0x00311088, 0x77cf: 0x40311020, - 0x77d0: 0x402bf020, 0x77d1: 0x402bf820, 0x77d2: 0x402c0220, 0x77d3: 0x402c2a20, - 0x77d4: 0x402efa20, 0x77d5: 0x402c5620, 0x77d6: 0x402c7220, 0x77d7: 0x402c7a20, - 0x77d8: 0x402ccc20, 0x77d9: 0x402c9a20, 0x77da: 0x402cd420, 0x77db: 0x402cc220, - 0x77dc: 0x402cdc20, 0x77dd: 0x402ce820, 0x77de: 0x402cf020, 0x77df: 0x402dee20, - 0x77e0: 0x402d4420, 0x77e1: 0x402d2a20, 0x77e2: 0x402d3220, 0x77e3: 0x402d5820, - 0x77e4: 0x402d0020, 0x77e5: 0x40308820, 0x77e6: 0x402d8020, 0x77e7: 0x402d8e20, - 0x77e8: 0x402db620, 0x77e9: 0x402dc220, 0x77ea: 0x402daa20, 0x77eb: 0x402e4220, - 0x77ec: 0x402e4a20, 0x77ed: 0x402e5420, 0x77ee: 0x402e6820, 0x77ef: 0x4030a020, - 0x77f0: 0x4030ac20, 0x77f1: 0x402e9020, 0x77f2: 0x402eb420, 0x77f3: 0x402ec820, - 0x77f4: 0x402ea620, 0x77f5: 0x402f1020, 0x77f6: 0x402eee20, 0x77f7: 0x402f1a20, - 0x77f8: 0x402f4c20, 0x77f9: 0x402f9820, 0x77fa: 0x402fa220, 0x77fb: 0x402fac20, - 0x77fc: 0x402fb620, 0x77fd: 0x402fbe20, 0x77fe: 0x402fc620, 0x77ff: 0x402fd020, - // Block 0x1e0, offset 0x7800 - 0x7800: 0xe00009b1, 0x7801: 0xe00009ae, 0x7802: 0xe0000a22, 0x7803: 0xe0000a1f, - 0x7804: 0xe0000a28, 0x7805: 0xe0000a25, 0x7806: 0xe0000a2e, 0x7807: 0xe0000a2b, - 0x7808: 0xe000260e, 0x7809: 0xe000260b, 0x780a: 0xe0000a8c, 0x780b: 0xe0000a89, - 0x780c: 0xe0000a98, 0x780d: 0xe0000a95, 0x780e: 0xe0000aa4, 0x780f: 0xe0000aa1, - 0x7810: 0xe0000a92, 0x7811: 0xe0000a8f, 0x7812: 0xe0000a9e, 0x7813: 0xe0000a9b, - 0x7814: 0xe0000b55, 0x7815: 0xe0000b51, 0x7816: 0xe0000b4d, 0x7817: 0xe0000b49, - 0x7818: 0xe0000b7c, 0x7819: 0xe0000b79, 0x781a: 0xe0000b82, 0x781b: 0xe0000b7f, - 0x781c: 0xe0000b39, 0x781d: 0xe0000b35, 0x781e: 0xe0000b8c, 0x781f: 0xe0000b89, - 0x7820: 0xe0000bd0, 0x7821: 0xe0000bcd, 0x7822: 0xe0000c00, 0x7823: 0xe0000bfd, - 0x7824: 0xe0000c0c, 0x7825: 0xe0000c09, 0x7826: 0xe0000bfa, 0x7827: 0xe0000bf7, - 0x7828: 0xe0000c06, 0x7829: 0xe0000c03, 0x782a: 0xe0000c12, 0x782b: 0xe0000c0f, - 0x782c: 0xe0002940, 0x782d: 0xe0000c7b, 0x782e: 0xe0002927, 0x782f: 0xe0000c46, - 0x7830: 0xe0000c93, 0x7831: 0xe0000c90, 0x7832: 0xe0000cab, 0x7833: 0xe0000ca8, - 0x7834: 0xe0000cb1, 0x7835: 0xe0000cae, 0x7836: 0xe0000cde, 0x7837: 0xe0000cdb, - 0x7838: 0xe0000ce5, 0x7839: 0xe0000ce1, 0x783a: 0xe0000cf2, 0x783b: 0xe0000cef, - 0x783c: 0xe0000cec, 0x783d: 0xe0000ce9, 0x783e: 0xe0000d1e, 0x783f: 0xe0000d1b, - // Block 0x1e1, offset 0x7840 - 0x7840: 0xe0000d24, 0x7841: 0xe0000d21, 0x7842: 0xe0000d2a, 0x7843: 0xe0000d27, - 0x7844: 0xe0000d69, 0x7845: 0xe0000d66, 0x7846: 0xe0000d7b, 0x7847: 0xe0000d78, - 0x7848: 0xe0000d87, 0x7849: 0xe0000d84, 0x784a: 0xe0000d81, 0x784b: 0xe0000d7e, - 0x784c: 0xe0000ded, 0x784d: 0xe0000de9, 0x784e: 0xe0002946, 0x784f: 0xe0002943, - 0x7850: 0xe0000e3d, 0x7851: 0xe0000e39, 0x7852: 0xe0000e35, 0x7853: 0xe0000e31, - 0x7854: 0xe0000ea7, 0x7855: 0xe0000ea4, 0x7856: 0xe0000ead, 0x7857: 0xe0000eaa, - 0x7858: 0xe0000ed6, 0x7859: 0xe0000ed3, 0x785a: 0xe0000ef4, 0x785b: 0xe0000ef1, - 0x785c: 0xe0000efb, 0x785d: 0xe0000ef7, 0x785e: 0xe0000f02, 0x785f: 0xe0000eff, - 0x7860: 0xe0000f41, 0x7861: 0xe0000f3e, 0x7862: 0xe0000f53, 0x7863: 0xe0000f50, - 0x7864: 0xe0000f26, 0x7865: 0xe0000f22, 0x7866: 0xe0000f3a, 0x7867: 0xe0000f36, - 0x7868: 0xe0000f5a, 0x7869: 0xe0000f56, 0x786a: 0xe0000f93, 0x786b: 0xe0000f90, - 0x786c: 0xe0000f9f, 0x786d: 0xe0000f9c, 0x786e: 0xe0000fb1, 0x786f: 0xe0000fae, - 0x7870: 0xe0000fab, 0x7871: 0xe0000fa8, 0x7872: 0xe0001093, 0x7873: 0xe0001090, - 0x7874: 0xe000109f, 0x7875: 0xe000109c, 0x7876: 0xe0001099, 0x7877: 0xe0001096, - 0x7878: 0xe0001032, 0x7879: 0xe000102e, 0x787a: 0xe0002964, 0x787b: 0xe0002961, - 0x787c: 0xe00010a9, 0x787d: 0xe00010a6, 0x787e: 0xe00010af, 0x787f: 0xe00010ac, - // Block 0x1e2, offset 0x7880 - 0x7880: 0xe00010d2, 0x7881: 0xe00010cf, 0x7882: 0xe00010cc, 0x7883: 0xe00010c9, - 0x7884: 0xe00010e1, 0x7885: 0xe00010de, 0x7886: 0xe00010e7, 0x7887: 0xe00010e4, - 0x7888: 0xe00010ed, 0x7889: 0xe00010ea, 0x788a: 0xe0002912, 0x788b: 0xe000290f, - 0x788c: 0xe000290c, 0x788d: 0xe0002909, 0x788e: 0xe0001123, 0x788f: 0xe0001120, - 0x7890: 0xe0001141, 0x7891: 0xe000113e, 0x7892: 0xe0001153, 0x7893: 0xe0001150, - 0x7894: 0xe0001159, 0x7895: 0xe0001156, 0x7896: 0xe0000c15, 0x7897: 0xe0000f8d, - 0x7898: 0xe00010db, 0x7899: 0xe0001111, 0x789a: 0xf0000404, 0x789b: 0xe0000f70, - 0x789c: 0x40300420, 0x789d: 0x40300620, 0x789e: 0xe0000f7f, 0x789f: 0x402c9620, - 0x78a0: 0xe000099b, 0x78a1: 0xe0000998, 0x78a2: 0xe0000989, 0x78a3: 0xe0000986, - 0x78a4: 0xe0000928, 0x78a5: 0xe0000924, 0x78a6: 0xe0000930, 0x78a7: 0xe000092c, - 0x78a8: 0xe0000940, 0x78a9: 0xe000093c, 0x78aa: 0xe0000938, 0x78ab: 0xe0000934, - 0x78ac: 0xe00009aa, 0x78ad: 0xe00009a6, 0x78ae: 0xe0000902, 0x78af: 0xe00008fe, - 0x78b0: 0xe000090a, 0x78b1: 0xe0000906, 0x78b2: 0xe000091a, 0x78b3: 0xe0000916, - 0x78b4: 0xe0000912, 0x78b5: 0xe000090e, 0x78b6: 0xe00009a2, 0x78b7: 0xe000099e, - 0x78b8: 0xe0000b6e, 0x78b9: 0xe0000b6b, 0x78ba: 0xe0000b5c, 0x78bb: 0xe0000b59, - 0x78bc: 0xe0000b26, 0x78bd: 0xe0000b23, 0x78be: 0xe0000afb, 0x78bf: 0xe0000af7, - // Block 0x1e3, offset 0x78c0 - 0x78c0: 0xe0000b03, 0x78c1: 0xe0000aff, 0x78c2: 0xe0000b13, 0x78c3: 0xe0000b0f, - 0x78c4: 0xe0000b0b, 0x78c5: 0xe0000b07, 0x78c6: 0xe0000b75, 0x78c7: 0xe0000b71, - 0x78c8: 0xe0002934, 0x78c9: 0xe0000c63, 0x78ca: 0xe000293d, 0x78cb: 0xe0000c75, - 0x78cc: 0xe0000e84, 0x78cd: 0xe0000e81, 0x78ce: 0xe0000e44, 0x78cf: 0xe0000e41, - 0x78d0: 0xe0000dad, 0x78d1: 0xe0000da9, 0x78d2: 0xe0000db5, 0x78d3: 0xe0000db1, - 0x78d4: 0xe0000dc5, 0x78d5: 0xe0000dc1, 0x78d6: 0xe0000dbd, 0x78d7: 0xe0000db9, - 0x78d8: 0xe0000e8b, 0x78d9: 0xe0000e87, 0x78da: 0xe0000e5d, 0x78db: 0xe0000e59, - 0x78dc: 0xe0000e65, 0x78dd: 0xe0000e61, 0x78de: 0xe0000e75, 0x78df: 0xe0000e71, - 0x78e0: 0xe0000e6d, 0x78e1: 0xe0000e69, 0x78e2: 0xe0000e7d, 0x78e3: 0xe0000e79, - 0x78e4: 0xe000108d, 0x78e5: 0xe000108a, 0x78e6: 0xe000104d, 0x78e7: 0xe000104a, - 0x78e8: 0xe0001066, 0x78e9: 0xe0001062, 0x78ea: 0xe000106e, 0x78eb: 0xe000106a, - 0x78ec: 0xe000107e, 0x78ed: 0xe000107a, 0x78ee: 0xe0001076, 0x78ef: 0xe0001072, - 0x78f0: 0xe0001086, 0x78f1: 0xe0001082, 0x78f2: 0xe0001108, 0x78f3: 0xe0001105, - 0x78f4: 0xe0001135, 0x78f5: 0xe0001132, 0x78f6: 0xe000112f, 0x78f7: 0xe000112c, - 0x78f8: 0xe000111d, 0x78f9: 0xe000111a, 0x78fa: 0xe0000d0a, 0x78fb: 0xe0000d07, - 0x78fc: 0x0030d888, 0x78fd: 0x4030d820, 0x78fe: 0x00312088, 0x78ff: 0x40312020, - // Block 0x1e4, offset 0x7900 - 0x7900: 0x00093685, 0x7901: 0x40083620, 0x7902: 0x40083820, 0x7903: 0x40083a20, - 0x7904: 0x40083c20, 0x7905: 0x002c628b, 0x7906: 0x002c6285, 0x7907: 0x002c9885, - 0x7908: 0x002d9a85, 0x7909: 0x002dcc85, 0x790a: 0x40083e20, 0x790b: 0x400a6e20, - 0x790c: 0x40084020, 0x790d: 0xe00009c4, 0x790e: 0x402d1e20, 0x790f: 0x40084220, - 0x7910: 0xe00002cb, 0x7911: 0xe00002d3, 0x7912: 0xe00002b2, 0x7913: 0xe00002bb, - 0x7914: 0xe00003cd, 0x7915: 0xe00002c3, 0x7916: 0xe00003d1, 0x7917: 0xe00004ab, - 0x7918: 0xe0000579, 0x7919: 0xe00002c7, 0x791a: 0xe0000640, 0x791b: 0xe00002cf, - 0x791c: 0xe00004af, 0x791d: 0xe0000644, 0x791e: 0xe0000798, 0x791f: 0xf0001e1e, - 0x7920: 0x002d9a8a, 0x7921: 0xe00027d4, 0x7922: 0xe00027db, 0x7923: 0xe00027ee, - 0x7924: 0x0030be8a, 0x7925: 0xe0002848, 0x7926: 0xe000284f, 0x7927: 0xe00010bb, - 0x7928: 0xe00027f4, 0x7929: 0x0030f68a, 0x792a: 0xe0002883, 0x792b: 0xe000288a, - 0x792c: 0x002e228a, 0x792d: 0x002c3a8a, 0x792e: 0x002c628a, 0x792f: 0x002e828a, - 0x7930: 0x002d9a84, 0x7931: 0xf0001f04, 0x7932: 0xf0000404, 0x7933: 0xf0001f04, - 0x7934: 0x0030be84, 0x7935: 0xf0001f04, 0x7936: 0xf0000404, 0x7937: 0xe00010b6, - 0x7938: 0xe00027f1, 0x7939: 0x0030f684, 0x793a: 0xe0002880, 0x793b: 0xe0002886, - 0x793c: 0x002e2284, 0x793d: 0x002c3a84, 0x793e: 0x002c6284, 0x793f: 0x002e8284, - // Block 0x1e5, offset 0x7940 - 0x7940: 0xe0000024, 0x7941: 0xe0000029, 0x7942: 0xe000002e, 0x7943: 0xe0000033, - 0x7944: 0xe0000038, 0x7945: 0xe000003d, 0x7946: 0xe0000042, 0x7947: 0xe0000047, - 0x7948: 0xf0001f04, 0x7949: 0xf0001f04, 0x794a: 0xf0001f04, 0x794b: 0xf0001f04, - 0x794c: 0xf0001f04, 0x794d: 0xf0001f04, 0x794e: 0xf0001f04, 0x794f: 0xf0001f04, - 0x7950: 0xf0001f04, 0x7951: 0xf0000404, 0x7952: 0xf0000404, 0x7953: 0xf0000404, - 0x7954: 0xf0000404, 0x7955: 0xf0000404, 0x7956: 0xf0000404, 0x7957: 0xf0000404, - 0x7958: 0xf0000404, 0x7959: 0xf0000404, 0x795a: 0xf0000404, 0x795b: 0xf0000404, - 0x795c: 0xf0000404, 0x795d: 0xf0000404, 0x795e: 0xf0000404, 0x795f: 0xf0000404, - 0x7960: 0xf0000404, 0x7961: 0xf0000404, 0x7962: 0xf0000404, 0x7963: 0xf0000404, - 0x7964: 0xf0000404, 0x7965: 0xf0000404, 0x7966: 0xf0000404, 0x7967: 0xf0000404, - 0x7968: 0xf0000404, 0x7969: 0xf0000404, 0x796a: 0xf0000404, 0x796b: 0xf0000404, - 0x796c: 0xe00024c7, 0x796d: 0xf0000404, 0x796e: 0xf0000404, 0x796f: 0xf0000404, - 0x7970: 0xf0000404, 0x7971: 0xf0000404, 0x7972: 0xf0000404, 0x7973: 0xe00024e7, - 0x7974: 0xf0000404, 0x7975: 0xf0000404, 0x7976: 0x002bde8c, 0x7977: 0x002c0a8c, - 0x7978: 0x002c3a8c, 0x7979: 0x002c628c, 0x797a: 0x002c988c, 0x797b: 0x002d088c, - 0x797c: 0x002d228c, 0x797d: 0x002d688c, 0x797e: 0x002d9a8c, 0x797f: 0x002dcc8c, - // Block 0x1e6, offset 0x7980 - 0x7980: 0xe000230b, 0x7981: 0xe00022f8, 0x7982: 0xe00022fc, 0x7983: 0xe0002311, - 0x7984: 0xe0002316, 0x7985: 0xe000231d, 0x7986: 0xe0002321, 0x7987: 0xe0002325, - 0x7988: 0xe000232b, 0x7989: 0xf0001c1c, 0x798a: 0xe0002330, 0x798b: 0xe000233c, - 0x798c: 0xe0002340, 0x798d: 0xe0002337, 0x798e: 0xe0002346, 0x798f: 0xe000234b, - 0x7990: 0xe000234f, 0x7991: 0xe0002353, 0x7992: 0xf0001c1c, 0x7993: 0xe000235e, - 0x7994: 0xe0002358, 0x7995: 0xf0001c1c, 0x7996: 0xe0002363, 0x7997: 0xe000236d, - 0x7998: 0xf0001f04, 0x7999: 0xf0001f04, 0x799a: 0xf0001f04, 0x799b: 0xf0001f04, - 0x799c: 0xf0001f04, 0x799d: 0xf0001f04, 0x799e: 0xf0001f04, 0x799f: 0xf0001f04, - 0x79a0: 0xf0001f04, 0x79a1: 0xf0001f04, 0x79a2: 0xf0000404, 0x79a3: 0xf0000404, - 0x79a4: 0xf0000404, 0x79a5: 0xf0000404, 0x79a6: 0xf0000404, 0x79a7: 0xf0000404, - 0x79a8: 0xf0000404, 0x79a9: 0xf0000404, 0x79aa: 0xf0000404, 0x79ab: 0xf0000404, - 0x79ac: 0xf0000404, 0x79ad: 0xf0000404, 0x79ae: 0xf0000404, 0x79af: 0xf0000404, - 0x79b0: 0xf0000404, 0x79b1: 0xe0000c1e, 0x79b2: 0xf0001c1c, 0x79b3: 0xf0001d1d, - 0x79b4: 0xe0000a31, 0x79b5: 0xf0001d1c, 0x79b6: 0xf0001c1c, 0x79b7: 0xf0001c1c, - 0x79b8: 0xe0000ac2, 0x79b9: 0xe0000ac6, 0x79ba: 0xe00027e8, 0x79bb: 0xf0001c1c, - 0x79bc: 0xf0001c1c, 0x79bd: 0xf0001c1c, 0x79be: 0xf0001c1c, 0x79bf: 0xe0002431, - // Block 0x1e7, offset 0x79c0 - 0x79c0: 0xf0001d1c, 0x79c1: 0xf0001d1d, 0x79c2: 0xe00009b7, 0x79c3: 0xe00024f3, - 0x79c4: 0xf0001c1c, 0x79c5: 0xf0001c1c, 0x79c6: 0xe0000a66, 0x79c7: 0xe0000a7a, - 0x79c8: 0xf0001d1c, 0x79c9: 0xf0001c1d, 0x79ca: 0xf0001c1c, 0x79cb: 0xf0001d1d, - 0x79cc: 0xf0001c1c, 0x79cd: 0xf0001d1d, 0x79ce: 0xf0001d1d, 0x79cf: 0xf0001c1c, - 0x79d0: 0xf0001c1c, 0x79d1: 0xf0001c1c, 0x79d2: 0xe0000d0d, 0x79d3: 0xe0002818, - 0x79d4: 0xf0001c1c, 0x79d5: 0xe0000d3a, 0x79d6: 0xe0000d46, 0x79d7: 0xf0001d1d, - 0x79d8: 0xe0000eb0, 0x79d9: 0xe0000eb8, 0x79da: 0xf0001d1d, 0x79db: 0xf0001c1c, - 0x79dc: 0xf0001c1d, 0x79dd: 0xf0001c1d, 0x79de: 0xe00010b2, 0x79df: 0xe00009c8, - 0x79e0: 0xf0001f04, 0x79e1: 0xf0001f04, 0x79e2: 0xf0001f04, 0x79e3: 0xf0001f04, - 0x79e4: 0xf0001f04, 0x79e5: 0xf0001f04, 0x79e6: 0xf0001f04, 0x79e7: 0xf0001f04, - 0x79e8: 0xf0001f04, 0x79e9: 0xf0000404, 0x79ea: 0xf0000404, 0x79eb: 0xf0000404, - 0x79ec: 0xf0000404, 0x79ed: 0xf0000404, 0x79ee: 0xf0000404, 0x79ef: 0xf0000404, - 0x79f0: 0xf0000404, 0x79f1: 0xf0000404, 0x79f2: 0xf0000404, 0x79f3: 0xf0000404, - 0x79f4: 0xf0000404, 0x79f5: 0xf0000404, 0x79f6: 0xf0000404, 0x79f7: 0xf0000404, - 0x79f8: 0xf0000404, 0x79f9: 0xf0000404, 0x79fa: 0xf0000404, 0x79fb: 0xf0000404, - 0x79fc: 0xf0000404, 0x79fd: 0xf0000404, 0x79fe: 0xf0000404, 0x79ff: 0xe0000bdf, - // Block 0x1e8, offset 0x7a00 - 0x7a00: 0xf0001f04, 0x7a01: 0xf0001f04, 0x7a02: 0xf0001f04, 0x7a03: 0xf0001f04, - 0x7a04: 0xf0001f04, 0x7a05: 0xf0001f04, 0x7a06: 0xf0001f04, 0x7a07: 0xf0001f04, - 0x7a08: 0xf0001f04, 0x7a09: 0xf0001f04, 0x7a0a: 0xf0001f04, - 0x7a10: 0xf0000a04, 0x7a11: 0xf0000a04, 0x7a12: 0xf0000a04, 0x7a13: 0xf0000a04, - 0x7a14: 0xf0000a04, 0x7a15: 0xf0000a04, 0x7a16: 0xf0000a04, 0x7a17: 0xf0000a04, - 0x7a18: 0xe00024b3, 0x7a19: 0xf0000a04, 0x7a1a: 0xf0000a04, 0x7a1b: 0xf0000a04, - 0x7a1c: 0xf0000a04, 0x7a1d: 0xf0000a04, 0x7a1e: 0xf0000a04, 0x7a1f: 0xf0000a04, - 0x7a20: 0xe00024cb, 0x7a21: 0xf0000a04, 0x7a22: 0xf0000a04, 0x7a23: 0xf0000a04, - 0x7a24: 0xf0000a04, 0x7a25: 0xf0000a04, 0x7a26: 0xf0000a04, 0x7a27: 0xe00024eb, - 0x7a28: 0xf0000a04, 0x7a29: 0xf0000a04, 0x7a2a: 0xf0000a04, 0x7a2b: 0x002c3a8c, - 0x7a2c: 0x002f7a8c, 0x7a2d: 0xf0000c0c, 0x7a2e: 0xf0000c0c, - 0x7a30: 0x002bde9d, 0x7a31: 0x002c0a9d, 0x7a32: 0x002c3a9d, 0x7a33: 0x002c629d, - 0x7a34: 0x002c989d, 0x7a35: 0x002d089d, 0x7a36: 0x002d229d, 0x7a37: 0x002d689d, - 0x7a38: 0x002d9a9d, 0x7a39: 0x002dcc9d, 0x7a3a: 0x002dfe9d, 0x7a3b: 0x002e229d, - 0x7a3c: 0x002e829d, 0x7a3d: 0x002e9e9d, 0x7a3e: 0x002ee29d, 0x7a3f: 0x002f2c9d, - // Block 0x1e9, offset 0x7a40 - 0x7a40: 0xe00014bd, 0x7a41: 0x0033b483, 0x7a42: 0x00339688, 0x7a43: 0x0033a288, - 0x7a44: 0x0033c288, 0x7a45: 0x0033fc88, 0x7a46: 0xc02a0071, 0x7a47: 0x00343688, - 0x7a48: 0x00344688, 0x7a49: 0x00349a88, 0x7a4a: 0x0034e488, 0x7a4b: 0x00356288, - 0x7a4c: 0x00356a88, 0x7a4d: 0xe00014cf, 0x7a4e: 0x00357a88, 0x7a4f: 0x00365488, - 0x7a50: 0xc0090041, 0x7a51: 0x00335288, 0x7a52: 0x00335a88, 0x7a53: 0xc0130092, - 0x7a54: 0x00338a88, 0x7a55: 0xc34c0041, 0x7a56: 0xc01c0071, 0x7a57: 0xc0200071, - 0x7a58: 0xc0250041, 0x7a59: 0x00343e88, 0x7a5a: 0xc0370092, 0x7a5b: 0x00348488, - 0x7a5c: 0x0034a888, 0x7a5d: 0x0034ba88, 0x7a5e: 0xc02e0071, 0x7a5f: 0x00350e88, - 0x7a60: 0x00352888, 0x7a61: 0x00353a88, 0x7a62: 0x00354c88, 0x7a63: 0xc03e00f1, - 0x7a64: 0x0035ac88, 0x7a65: 0x0035b488, 0x7a66: 0x00360288, 0x7a67: 0xc0440071, - 0x7a68: 0x00365c88, 0x7a69: 0x00366688, 0x7a6a: 0x00367488, 0x7a6b: 0xc0480071, - 0x7a6c: 0x00368e88, 0x7a6d: 0xc04c0071, 0x7a6e: 0x0036b888, 0x7a6f: 0x0036c488, - 0x7a70: 0xc0060041, 0x7a71: 0x40335220, 0x7a72: 0x40335a20, 0x7a73: 0xc0100092, - 0x7a74: 0x40338a20, 0x7a75: 0xc3490041, 0x7a76: 0xc01a0071, 0x7a77: 0xc01e0071, - 0x7a78: 0xc0220041, 0x7a79: 0x40343e20, 0x7a7a: 0xc0340092, 0x7a7b: 0x40348420, - 0x7a7c: 0x4034a820, 0x7a7d: 0x4034ba20, 0x7a7e: 0xc02c0071, 0x7a7f: 0x40350e20, - // Block 0x1ea, offset 0x7a80 - 0x7a80: 0x40352820, 0x7a81: 0x40353a20, 0x7a82: 0x40354c20, 0x7a83: 0xc03a00f1, - 0x7a84: 0x4035ac20, 0x7a85: 0x4035b420, 0x7a86: 0x40360220, 0x7a87: 0xc0420071, - 0x7a88: 0x40365c20, 0x7a89: 0x40366620, 0x7a8a: 0x40367420, 0x7a8b: 0xc0460071, - 0x7a8c: 0x40368e20, 0x7a8d: 0xc04a0071, 0x7a8e: 0x4036b820, 0x7a8f: 0x4036c420, - 0x7a90: 0xe00014ba, 0x7a91: 0x4033b420, 0x7a92: 0x40339620, 0x7a93: 0x4033a220, - 0x7a94: 0x4033c220, 0x7a95: 0x4033fc20, 0x7a96: 0xc0280071, 0x7a97: 0x40343620, - 0x7a98: 0x40344620, 0x7a99: 0x40349a20, 0x7a9a: 0x4034e420, 0x7a9b: 0x40356220, - 0x7a9c: 0x40356a20, 0x7a9d: 0xe00014cc, 0x7a9e: 0x40357a20, 0x7a9f: 0x40365420, - 0x7aa0: 0x0035e088, 0x7aa1: 0x4035e020, 0x7aa2: 0x00369e88, 0x7aa3: 0x40369e20, - 0x7aa4: 0x0036ce88, 0x7aa5: 0x4036ce20, 0x7aa6: 0x0036d688, 0x7aa7: 0x4036d620, - 0x7aa8: 0x0036ea88, 0x7aa9: 0x4036ea20, 0x7aaa: 0x0036e088, 0x7aab: 0x4036e020, - 0x7aac: 0x0036f488, 0x7aad: 0x4036f420, 0x7aae: 0x0036fc88, 0x7aaf: 0x4036fc20, - 0x7ab0: 0x00370488, 0x7ab1: 0x40370420, 0x7ab2: 0x00370c88, 0x7ab3: 0x40370c20, - 0x7ab4: 0xc0500131, 0x7ab5: 0xc04e0131, 0x7ab6: 0x00371c88, 0x7ab7: 0x40371c20, - 0x7ab8: 0x0035a488, 0x7ab9: 0x4035a420, 0x7aba: 0x0035fa88, 0x7abb: 0x4035fa20, - 0x7abc: 0x0035f288, 0x7abd: 0x4035f220, 0x7abe: 0x0035e888, 0x7abf: 0x4035e820, - // Block 0x1eb, offset 0x7ac0 - 0x7ac1: 0x40409c20, 0x7ac2: 0x40409820, 0x7ac3: 0x40409a20, - 0x7ac5: 0x40407c20, 0x7ac6: 0x40407e20, 0x7ac7: 0x40408020, - 0x7ac8: 0x40408220, 0x7ac9: 0x40408420, 0x7aca: 0x40408620, 0x7acb: 0x40408820, - 0x7acc: 0x40408c20, 0x7acf: 0x40409020, - 0x7ad0: 0x40409220, 0x7ad3: 0x40409420, - 0x7ad4: 0x40409620, 0x7ad5: 0x40409820, 0x7ad6: 0x40409a20, 0x7ad7: 0x40409c20, - 0x7ad8: 0x40409e20, 0x7ad9: 0x4040a020, 0x7ada: 0x4040a220, 0x7adb: 0x4040a420, - 0x7adc: 0x4040a620, 0x7add: 0x4040a820, 0x7ade: 0x4040aa20, 0x7adf: 0x4040ac20, - 0x7ae0: 0x4040ae20, 0x7ae1: 0x4040b020, 0x7ae2: 0x4040b220, 0x7ae3: 0x4040b420, - 0x7ae4: 0x4040b620, 0x7ae5: 0x4040b820, 0x7ae6: 0x4040ba20, 0x7ae7: 0x4040bc20, - 0x7ae8: 0x4040be20, 0x7aea: 0x4040c020, 0x7aeb: 0x4040c220, - 0x7aec: 0x4040c420, 0x7aed: 0x4040c620, 0x7aee: 0x4040c820, 0x7aef: 0x4040ca20, - 0x7af0: 0x4040cc20, 0x7af2: 0x4040d020, - 0x7af6: 0x4040d420, 0x7af7: 0x4040d620, - 0x7af8: 0x4040d820, 0x7af9: 0x4040da20, - 0x7afc: 0xa070f102, 0x7afd: 0x4040dc20, 0x7afe: 0x4040de20, 0x7aff: 0x4040e020, - // Block 0x1ec, offset 0x7b00 - 0x7b00: 0xa0000000, 0x7b01: 0xa0000000, 0x7b02: 0xa0000000, 0x7b03: 0xa0000000, - 0x7b04: 0xa0000000, 0x7b05: 0xa0000000, 0x7b06: 0xa0000000, 0x7b07: 0xa0000000, - 0x7b08: 0xa0000000, 0x7b09: 0x40020020, 0x7b0a: 0x40020220, 0x7b0b: 0x40020420, - 0x7b0c: 0x40020620, 0x7b0d: 0x40020820, 0x7b0e: 0xa0000000, 0x7b0f: 0xa0000000, - 0x7b10: 0xa0000000, 0x7b11: 0xa0000000, 0x7b12: 0xa0000000, 0x7b13: 0xa0000000, - 0x7b14: 0xa0000000, 0x7b15: 0xa0000000, 0x7b16: 0xa0000000, 0x7b17: 0xa0000000, - 0x7b18: 0xa0000000, 0x7b19: 0xa0000000, 0x7b1a: 0xa0000000, 0x7b1b: 0xa0000000, - 0x7b1c: 0xa0000000, 0x7b1d: 0xa0000000, 0x7b1e: 0xa0000000, 0x7b1f: 0xa0000000, - 0x7b20: 0x40021220, 0x7b21: 0x4002ba20, 0x7b22: 0x4003e020, 0x7b23: 0x4004ea20, - 0x7b24: 0x4027de20, 0x7b25: 0x4004ec20, 0x7b26: 0x4004e620, 0x7b27: 0x4003d220, - 0x7b28: 0x4003f420, 0x7b29: 0x4003f620, 0x7b2a: 0x4004d820, 0x7b2b: 0x40093820, - 0x7b2c: 0x40024020, 0x7b2d: 0x40021a20, 0x7b2e: 0x4002e420, 0x7b2f: 0x4004e220, - 0x7b30: 0x4029cc20, 0x7b31: 0x4029ce20, 0x7b32: 0x4029d020, 0x7b33: 0x4029d220, - 0x7b34: 0x4029d420, 0x7b35: 0x4029d620, 0x7b36: 0x4029d820, 0x7b37: 0x4029da20, - 0x7b38: 0x4029dc20, 0x7b39: 0x4029de20, 0x7b3a: 0x40026c20, 0x7b3b: 0x40026220, - 0x7b3c: 0x40094020, 0x7b3d: 0x40094220, 0x7b3e: 0x40094420, 0x7b3f: 0x4002c420, - // Block 0x1ed, offset 0x7b40 - 0x7b40: 0x4004d620, 0x7b41: 0x002bde88, 0x7b42: 0x002c0a88, 0x7b43: 0x002c3a88, - 0x7b44: 0x002c6288, 0x7b45: 0x002c9888, 0x7b46: 0x002d0888, 0x7b47: 0x002d2288, - 0x7b48: 0x002d6888, 0x7b49: 0x002d9a88, 0x7b4a: 0x002dcc88, 0x7b4b: 0x002dfe88, - 0x7b4c: 0xc3520002, 0x7b4d: 0x002e8288, 0x7b4e: 0x002e9e88, 0x7b4f: 0x002ee288, - 0x7b50: 0x002f2c88, 0x7b51: 0x002f5688, 0x7b52: 0x002f7a88, 0x7b53: 0x002fe688, - 0x7b54: 0x00302c88, 0x7b55: 0x00306c88, 0x7b56: 0x0030be88, 0x7b57: 0x0030e288, - 0x7b58: 0x0030f688, 0x7b59: 0x00310088, 0x7b5a: 0x00312a88, 0x7b5b: 0x4003f820, - 0x7b5c: 0x4004e420, 0x7b5d: 0x4003fa20, 0x7b5e: 0x40062420, 0x7b5f: 0x40021620, - 0x7b60: 0x40061e20, 0x7b61: 0x402bde20, 0x7b62: 0x402c0a20, 0x7b63: 0x402c3a20, - 0x7b64: 0x402c6220, 0x7b65: 0x402c9820, 0x7b66: 0x402d0820, 0x7b67: 0x402d2220, - 0x7b68: 0x402d6820, 0x7b69: 0x402d9a20, 0x7b6a: 0x402dcc20, 0x7b6b: 0x402dfe20, - 0x7b6c: 0xc34f0002, 0x7b6d: 0x402e8220, 0x7b6e: 0x402e9e20, 0x7b6f: 0x402ee220, - 0x7b70: 0x402f2c20, 0x7b71: 0x402f5620, 0x7b72: 0x402f7a20, 0x7b73: 0x402fe620, - 0x7b74: 0x40302c20, 0x7b75: 0x40306c20, 0x7b76: 0x4030be20, 0x7b77: 0x4030e220, - 0x7b78: 0x4030f620, 0x7b79: 0x40310020, 0x7b7a: 0x40312a20, 0x7b7b: 0x4003fc20, - 0x7b7c: 0x40094820, 0x7b7d: 0x4003fe20, 0x7b7e: 0x40094c20, 0x7b7f: 0xa0000000, - // Block 0x1ee, offset 0x7b80 - 0x7b80: 0xe0000983, 0x7b81: 0xe0000980, 0x7b82: 0xe00008fb, 0x7b83: 0xe00008f8, - 0x7b84: 0xe000097d, 0x7b85: 0xe000097a, 0x7b86: 0xe0000a38, 0x7b87: 0xe0000a35, - 0x7b88: 0xe0000a3e, 0x7b89: 0xe0000a3b, 0x7b8a: 0xe0000a4a, 0x7b8b: 0xe0000a47, - 0x7b8c: 0xe0000a44, 0x7b8d: 0xe0000a41, 0x7b8e: 0xe0000a86, 0x7b8f: 0xe0000a83, - 0x7b90: 0xe0000aaa, 0x7b91: 0xe0000aa7, 0x7b92: 0xe0000b46, 0x7b93: 0xe0000b43, - 0x7b94: 0xe0000aee, 0x7b95: 0xe0000aeb, 0x7b96: 0xe0000b2c, 0x7b97: 0xe0000b29, - 0x7b98: 0xe0000b40, 0x7b99: 0xe0000b3d, 0x7b9a: 0xe0000b1a, 0x7b9b: 0xe0000b17, - 0x7b9c: 0xe0000bb8, 0x7b9d: 0xe0000bb5, 0x7b9e: 0xe0000bb2, 0x7b9f: 0xe0000baf, - 0x7ba0: 0xe0000bc4, 0x7ba1: 0xe0000bc1, 0x7ba2: 0xe0000bca, 0x7ba3: 0xe0000bc7, - 0x7ba4: 0xe0000bee, 0x7ba5: 0xe0000beb, 0x7ba6: 0xe0000c1b, 0x7ba7: 0xe0000c18, - 0x7ba8: 0xe0000c51, 0x7ba9: 0xe0000c4e, 0x7baa: 0xe0000c60, 0x7bab: 0xe0000c5d, - 0x7bac: 0xe0000c31, 0x7bad: 0xe0000c2e, 0x7bae: 0xe0000c5a, 0x7baf: 0xe0000c57, - 0x7bb0: 0xe0000c54, 0x7bb1: 0x402da220, 0x7bb2: 0xf0000a0a, 0x7bb3: 0xf0000404, - 0x7bb4: 0xe0000c8a, 0x7bb5: 0xe0000c87, 0x7bb6: 0xe0000c9f, 0x7bb7: 0xe0000c9c, - 0x7bb8: 0x402f7220, 0x7bb9: 0xe0000ccc, 0x7bba: 0xe0000cc9, 0x7bbb: 0xe0000cd8, - 0x7bbc: 0xe0000cd5, 0x7bbd: 0xe0000cd2, 0x7bbe: 0xe0000ccf, 0x7bbf: 0x002e22a3, - // Block 0x1ef, offset 0x7bc0 - 0x7bc0: 0x402e2221, 0x7bc1: 0xe0000cf8, 0x7bc2: 0xe0000cf5, 0x7bc3: 0xe0000d51, - 0x7bc4: 0xe0000d4e, 0x7bc5: 0xe0000d6f, 0x7bc6: 0xe0000d6c, 0x7bc7: 0xe0000d5d, - 0x7bc8: 0xe0000d5a, 0x7bc9: 0xf0000404, 0x7bca: 0x002eda88, 0x7bcb: 0x402eda20, - 0x7bcc: 0xe0000e2e, 0x7bcd: 0xe0000e2b, 0x7bce: 0xe0000da0, 0x7bcf: 0xe0000d9d, - 0x7bd0: 0xe0000de0, 0x7bd1: 0xe0000ddd, 0x7bd2: 0xe0000e93, 0x7bd3: 0xe0000e8f, - 0x7bd4: 0xe0000eca, 0x7bd5: 0xe0000ec7, 0x7bd6: 0xe0000edc, 0x7bd7: 0xe0000ed9, - 0x7bd8: 0xe0000ed0, 0x7bd9: 0xe0000ecd, 0x7bda: 0xe0000f1f, 0x7bdb: 0xe0000f1c, - 0x7bdc: 0xe0000f2d, 0x7bdd: 0xe0000f2a, 0x7bde: 0xe0000f47, 0x7bdf: 0xe0000f44, - 0x7be0: 0xe0000f33, 0x7be1: 0xe0000f30, 0x7be2: 0xe0000f99, 0x7be3: 0xe0000f96, - 0x7be4: 0xe0000f8a, 0x7be5: 0xe0000f87, 0x7be6: 0x00303688, 0x7be7: 0x40303620, - 0x7be8: 0xe000102b, 0x7be9: 0xe0001028, 0x7bea: 0xe000103f, 0x7beb: 0xe000103c, - 0x7bec: 0xe0000fe7, 0x7bed: 0xe0000fe4, 0x7bee: 0xe0000ff9, 0x7bef: 0xe0000ff6, - 0x7bf0: 0xe0001025, 0x7bf1: 0xe0001022, 0x7bf2: 0xe0001039, 0x7bf3: 0xe0001036, - 0x7bf4: 0xe00010d8, 0x7bf5: 0xe00010d5, 0x7bf6: 0xe000110e, 0x7bf7: 0xe000110b, - 0x7bf8: 0xe0001117, 0x7bf9: 0xe000113b, 0x7bfa: 0xe0001138, 0x7bfb: 0xe000114d, - 0x7bfc: 0xe000114a, 0x7bfd: 0xe0001147, 0x7bfe: 0xe0001144, 0x7bff: 0xe0000f64, - // Block 0x1f0, offset 0x7c00 - 0x7c00: 0xa0000000, 0x7c01: 0xa0000000, 0x7c02: 0xa0000000, 0x7c03: 0xa0000000, - 0x7c04: 0xa0000000, 0x7c05: 0xa0000000, 0x7c06: 0xa0000000, 0x7c07: 0xa0000000, - 0x7c08: 0xa0000000, 0x7c09: 0x40020020, 0x7c0a: 0x40020220, 0x7c0b: 0x40020420, - 0x7c0c: 0x40020620, 0x7c0d: 0x40020820, 0x7c0e: 0xa0000000, 0x7c0f: 0xa0000000, - 0x7c10: 0xa0000000, 0x7c11: 0xa0000000, 0x7c12: 0xa0000000, 0x7c13: 0xa0000000, - 0x7c14: 0xa0000000, 0x7c15: 0xa0000000, 0x7c16: 0xa0000000, 0x7c17: 0xa0000000, - 0x7c18: 0xa0000000, 0x7c19: 0xa0000000, 0x7c1a: 0xa0000000, 0x7c1b: 0xa0000000, - 0x7c1c: 0xa0000000, 0x7c1d: 0xa0000000, 0x7c1e: 0xa0000000, 0x7c1f: 0xa0000000, - 0x7c20: 0x40021220, 0x7c21: 0x4002ba20, 0x7c22: 0x4003e020, 0x7c23: 0x4004ea20, - 0x7c24: 0x4027de20, 0x7c25: 0x4004ec20, 0x7c26: 0x4004e620, 0x7c27: 0x4003d220, - 0x7c28: 0x4003f420, 0x7c29: 0x4003f620, 0x7c2a: 0x4004d820, 0x7c2b: 0x40093820, - 0x7c2c: 0x40024020, 0x7c2d: 0x40021a20, 0x7c2e: 0x4002e420, 0x7c2f: 0x4004e220, - 0x7c30: 0x4029cc20, 0x7c31: 0x4029ce20, 0x7c32: 0x4029d020, 0x7c33: 0x4029d220, - 0x7c34: 0x4029d420, 0x7c35: 0x4029d620, 0x7c36: 0x4029d820, 0x7c37: 0x4029da20, - 0x7c38: 0x4029dc20, 0x7c39: 0x4029de20, 0x7c3a: 0x40026c20, 0x7c3b: 0x40026220, - 0x7c3c: 0x40094020, 0x7c3d: 0x40094220, 0x7c3e: 0x40094420, 0x7c3f: 0x4002c420, - // Block 0x1f1, offset 0x7c40 - 0x7c40: 0x4004d620, 0x7c41: 0x002bde88, 0x7c42: 0x002c0a88, 0x7c43: 0xc3590953, - 0x7c44: 0x002c6288, 0x7c45: 0x002c9888, 0x7c46: 0x002d0888, 0x7c47: 0x002d2288, - 0x7c48: 0x002d6888, 0x7c49: 0x002d9a88, 0x7c4a: 0x002dcc88, 0x7c4b: 0x002dfe88, - 0x7c4c: 0xc0030002, 0x7c4d: 0x002e8288, 0x7c4e: 0x002e9e88, 0x7c4f: 0x002ee288, - 0x7c50: 0x002f2c88, 0x7c51: 0x002f5688, 0x7c52: 0xc35f0991, 0x7c53: 0xc3430991, - 0x7c54: 0x00302c88, 0x7c55: 0x00306c88, 0x7c56: 0x0030be88, 0x7c57: 0x0030e288, - 0x7c58: 0x0030f688, 0x7c59: 0x00310088, 0x7c5a: 0xc3630991, 0x7c5b: 0x4003f820, - 0x7c5c: 0x4004e420, 0x7c5d: 0x4003fa20, 0x7c5e: 0x40062420, 0x7c5f: 0x40021620, - 0x7c60: 0x40061e20, 0x7c61: 0x402bde20, 0x7c62: 0x402c0a20, 0x7c63: 0xc3550953, - 0x7c64: 0x402c6220, 0x7c65: 0x402c9820, 0x7c66: 0x402d0820, 0x7c67: 0x402d2220, - 0x7c68: 0x402d6820, 0x7c69: 0x402d9a20, 0x7c6a: 0x402dcc20, 0x7c6b: 0x402dfe20, - 0x7c6c: 0xc0000002, 0x7c6d: 0x402e8220, 0x7c6e: 0x402e9e20, 0x7c6f: 0x402ee220, - 0x7c70: 0x402f2c20, 0x7c71: 0x402f5620, 0x7c72: 0xc35d0991, 0x7c73: 0xc3410991, - 0x7c74: 0x40302c20, 0x7c75: 0x40306c20, 0x7c76: 0x4030be20, 0x7c77: 0x4030e220, - 0x7c78: 0x4030f620, 0x7c79: 0x40310020, 0x7c7a: 0xc3610991, 0x7c7b: 0x4003fc20, - 0x7c7c: 0x40094820, 0x7c7d: 0x4003fe20, 0x7c7e: 0x40094c20, 0x7c7f: 0xa0000000, - // Block 0x1f2, offset 0x7c80 - 0x7c80: 0xe0000983, 0x7c81: 0xe0000980, 0x7c82: 0xe00008fb, 0x7c83: 0xe00008f8, - 0x7c84: 0xe000097d, 0x7c85: 0xe000097a, 0x7c86: 0xe0000a38, 0x7c87: 0xe0000a35, - 0x7c88: 0xe0000a3e, 0x7c89: 0xe0000a3b, 0x7c8a: 0xe0000a4a, 0x7c8b: 0xe0000a47, - 0x7c8c: 0x002c3c83, 0x7c8d: 0x402c3c20, 0x7c8e: 0xe0000a86, 0x7c8f: 0xe0000a83, - 0x7c90: 0xe0000aaa, 0x7c91: 0xe0000aa7, 0x7c92: 0xe0000b46, 0x7c93: 0xe0000b43, - 0x7c94: 0xe0000aee, 0x7c95: 0xe0000aeb, 0x7c96: 0xe0000b2c, 0x7c97: 0xe0000b29, - 0x7c98: 0xe0000b40, 0x7c99: 0xe0000b3d, 0x7c9a: 0xe0000b1a, 0x7c9b: 0xe0000b17, - 0x7c9c: 0xe0000bb8, 0x7c9d: 0xe0000bb5, 0x7c9e: 0xe0000bb2, 0x7c9f: 0xe0000baf, - 0x7ca0: 0xe0000bc4, 0x7ca1: 0xe0000bc1, 0x7ca2: 0xe0000bca, 0x7ca3: 0xe0000bc7, - 0x7ca4: 0xe0000bee, 0x7ca5: 0xe0000beb, 0x7ca6: 0xe0000c1b, 0x7ca7: 0xe0000c18, - 0x7ca8: 0xe0000c51, 0x7ca9: 0xe0000c4e, 0x7caa: 0xe0000c60, 0x7cab: 0xe0000c5d, - 0x7cac: 0xe0000c31, 0x7cad: 0xe0000c2e, 0x7cae: 0xe0000c5a, 0x7caf: 0xe0000c57, - 0x7cb0: 0xe0000c54, 0x7cb1: 0x402da220, 0x7cb2: 0xf0000a0a, 0x7cb3: 0xf0000404, - 0x7cb4: 0xe0000c8a, 0x7cb5: 0xe0000c87, 0x7cb6: 0xe0000c9f, 0x7cb7: 0xe0000c9c, - 0x7cb8: 0x402f7220, 0x7cb9: 0xe0000ccc, 0x7cba: 0xe0000cc9, 0x7cbb: 0xe0000cd8, - 0x7cbc: 0xe0000cd5, 0x7cbd: 0xe0000cd2, 0x7cbe: 0xe0000ccf, 0x7cbf: 0xe0000d04, - // Block 0x1f3, offset 0x7cc0 - 0x7cc0: 0xe0000cfe, 0x7cc1: 0xe0000cf8, 0x7cc2: 0xe0000cf5, 0x7cc3: 0xe0000d51, - 0x7cc4: 0xe0000d4e, 0x7cc5: 0xe0000d6f, 0x7cc6: 0xe0000d6c, 0x7cc7: 0xe0000d5d, - 0x7cc8: 0xe0000d5a, 0x7cc9: 0xf0000404, 0x7cca: 0x002eda88, 0x7ccb: 0x402eda20, - 0x7ccc: 0xe0000e2e, 0x7ccd: 0xe0000e2b, 0x7cce: 0xe0000da0, 0x7ccf: 0xe0000d9d, - 0x7cd0: 0xe0000de0, 0x7cd1: 0xe0000ddd, 0x7cd2: 0xe0000e93, 0x7cd3: 0xe0000e8f, - 0x7cd4: 0xe0000eca, 0x7cd5: 0xe0000ec7, 0x7cd6: 0xe0000edc, 0x7cd7: 0xe0000ed9, - 0x7cd8: 0x002f7c83, 0x7cd9: 0x402f7c20, 0x7cda: 0xe0000f1f, 0x7cdb: 0xe0000f1c, - 0x7cdc: 0xe0000f2d, 0x7cdd: 0xe0000f2a, 0x7cde: 0xe0000f47, 0x7cdf: 0xe0000f44, - 0x7ce0: 0x002fe883, 0x7ce1: 0x402fe820, 0x7ce2: 0xe0000f99, 0x7ce3: 0xe0000f96, - 0x7ce4: 0xe0000f8a, 0x7ce5: 0xe0000f87, 0x7ce6: 0x00303688, 0x7ce7: 0x40303620, - 0x7ce8: 0xe000102b, 0x7ce9: 0xe0001028, 0x7cea: 0xe000103f, 0x7ceb: 0xe000103c, - 0x7cec: 0xe0000fe7, 0x7ced: 0xe0000fe4, 0x7cee: 0xe0000ff9, 0x7cef: 0xe0000ff6, - 0x7cf0: 0xe0001025, 0x7cf1: 0xe0001022, 0x7cf2: 0xe0001039, 0x7cf3: 0xe0001036, - 0x7cf4: 0xe00010d8, 0x7cf5: 0xe00010d5, 0x7cf6: 0xe000110e, 0x7cf7: 0xe000110b, - 0x7cf8: 0xe0001117, 0x7cf9: 0xe000113b, 0x7cfa: 0xe0001138, 0x7cfb: 0xe000114d, - 0x7cfc: 0xe000114a, 0x7cfd: 0x00312c83, 0x7cfe: 0x40312c20, 0x7cff: 0xe0000f64, - // Block 0x1f4, offset 0x7d00 - 0x7d00: 0xe0000d24, 0x7d01: 0xe0000d21, 0x7d02: 0xe0000d2a, 0x7d03: 0xe0000d27, - 0x7d04: 0xe0000d69, 0x7d05: 0xe0000d66, 0x7d06: 0xe0000d7b, 0x7d07: 0xe0000d78, - 0x7d08: 0xe0000d87, 0x7d09: 0xe0000d84, 0x7d0a: 0xe0000d81, 0x7d0b: 0xe0000d7e, - 0x7d0c: 0xe0000ded, 0x7d0d: 0xe0000de9, 0x7d0e: 0xe0000df5, 0x7d0f: 0xe0000df1, - 0x7d10: 0xe0000e3d, 0x7d11: 0xe0000e39, 0x7d12: 0xe0000e35, 0x7d13: 0xe0000e31, - 0x7d14: 0xe0000ea7, 0x7d15: 0xe0000ea4, 0x7d16: 0xe0000ead, 0x7d17: 0xe0000eaa, - 0x7d18: 0xe0000ed6, 0x7d19: 0xe0000ed3, 0x7d1a: 0xe0000ef4, 0x7d1b: 0xe0000ef1, - 0x7d1c: 0xe0000efb, 0x7d1d: 0xe0000ef7, 0x7d1e: 0xe0000f02, 0x7d1f: 0xe0000eff, - 0x7d20: 0xe0000f41, 0x7d21: 0xe0000f3e, 0x7d22: 0xe0000f53, 0x7d23: 0xe0000f50, - 0x7d24: 0xe0000f26, 0x7d25: 0xe0000f22, 0x7d26: 0xe000296a, 0x7d27: 0xe0002967, - 0x7d28: 0xe0000f5a, 0x7d29: 0xe0000f56, 0x7d2a: 0xe0000f93, 0x7d2b: 0xe0000f90, - 0x7d2c: 0xe0000f9f, 0x7d2d: 0xe0000f9c, 0x7d2e: 0xe0000fb1, 0x7d2f: 0xe0000fae, - 0x7d30: 0xe0000fab, 0x7d31: 0xe0000fa8, 0x7d32: 0xe0001093, 0x7d33: 0xe0001090, - 0x7d34: 0xe000109f, 0x7d35: 0xe000109c, 0x7d36: 0xe0001099, 0x7d37: 0xe0001096, - 0x7d38: 0xe0001032, 0x7d39: 0xe000102e, 0x7d3a: 0xe0001046, 0x7d3b: 0xe0001042, - 0x7d3c: 0xe00010a9, 0x7d3d: 0xe00010a6, 0x7d3e: 0xe00010af, 0x7d3f: 0xe00010ac, - // Block 0x1f5, offset 0x7d40 - 0x7d40: 0xa0000000, 0x7d41: 0xa0000000, 0x7d42: 0xa0000000, 0x7d43: 0xa0000000, - 0x7d44: 0xa0000000, 0x7d45: 0xa0000000, 0x7d46: 0xa0000000, 0x7d47: 0xa0000000, - 0x7d48: 0xa0000000, 0x7d49: 0x40020020, 0x7d4a: 0x40020220, 0x7d4b: 0x40020420, - 0x7d4c: 0x40020620, 0x7d4d: 0x40020820, 0x7d4e: 0xa0000000, 0x7d4f: 0xa0000000, - 0x7d50: 0xa0000000, 0x7d51: 0xa0000000, 0x7d52: 0xa0000000, 0x7d53: 0xa0000000, - 0x7d54: 0xa0000000, 0x7d55: 0xa0000000, 0x7d56: 0xa0000000, 0x7d57: 0xa0000000, - 0x7d58: 0xa0000000, 0x7d59: 0xa0000000, 0x7d5a: 0xa0000000, 0x7d5b: 0xa0000000, - 0x7d5c: 0xa0000000, 0x7d5d: 0xa0000000, 0x7d5e: 0xa0000000, 0x7d5f: 0xa0000000, - 0x7d60: 0x40021220, 0x7d61: 0x4002ba20, 0x7d62: 0x4003e020, 0x7d63: 0x4004ea20, - 0x7d64: 0x4027de20, 0x7d65: 0x4004ec20, 0x7d66: 0x4004e620, 0x7d67: 0x4003d220, - 0x7d68: 0x4003f420, 0x7d69: 0x4003f620, 0x7d6a: 0x4004d820, 0x7d6b: 0x40093820, - 0x7d6c: 0x40024020, 0x7d6d: 0x40021a20, 0x7d6e: 0x4002e420, 0x7d6f: 0x4004e220, - 0x7d70: 0x4029cc20, 0x7d71: 0x4029ce20, 0x7d72: 0x4029d020, 0x7d73: 0x4029d220, - 0x7d74: 0x4029d420, 0x7d75: 0x4029d620, 0x7d76: 0x4029d820, 0x7d77: 0x4029da20, - 0x7d78: 0x4029dc20, 0x7d79: 0x4029de20, 0x7d7a: 0x40026c20, 0x7d7b: 0x40026220, - 0x7d7c: 0x40094020, 0x7d7d: 0x40094220, 0x7d7e: 0x40094420, 0x7d7f: 0x4002c420, - // Block 0x1f6, offset 0x7d80 - 0x7d80: 0x4004d620, 0x7d81: 0x002bde88, 0x7d82: 0x002c0a88, 0x7d83: 0xc36509c2, - 0x7d84: 0xc36a09f2, 0x7d85: 0x002c9888, 0x7d86: 0xc36f0a22, 0x7d87: 0x002d2288, - 0x7d88: 0x002d6888, 0x7d89: 0x002d9a88, 0x7d8a: 0x002dcc88, 0x7d8b: 0x002dfe88, - 0x7d8c: 0xc37b0ac4, 0x7d8d: 0x002e8288, 0x7d8e: 0xc3740a52, 0x7d8f: 0x002ee288, - 0x7d90: 0xc38209c2, 0x7d91: 0x002f5688, 0x7d92: 0xc38509c2, 0x7d93: 0x002fe688, - 0x7d94: 0xc38a09c2, 0x7d95: 0x00306c88, 0x7d96: 0x0030be88, 0x7d97: 0x0030e288, - 0x7d98: 0x0030f688, 0x7d99: 0x00310088, 0x7d9a: 0x00312a88, 0x7d9b: 0x4003f820, - 0x7d9c: 0x4004e420, 0x7d9d: 0x4003fa20, 0x7d9e: 0x40062420, 0x7d9f: 0x40021620, - 0x7da0: 0x40061e20, 0x7da1: 0x402bde20, 0x7da2: 0x402c0a20, 0x7da3: 0xc33309b1, - 0x7da4: 0xc36809e1, 0x7da5: 0x402c9820, 0x7da6: 0xc36d0a11, 0x7da7: 0x402d2220, - 0x7da8: 0x402d6820, 0x7da9: 0x402d9a20, 0x7daa: 0x402dcc20, 0x7dab: 0x402dfe20, - 0x7dac: 0xc3770a73, 0x7dad: 0x402e8220, 0x7dae: 0xc3720a41, 0x7daf: 0x402ee220, - 0x7db0: 0xc38009b1, 0x7db1: 0x402f5620, 0x7db2: 0xc35d09b1, 0x7db3: 0x402fe620, - 0x7db4: 0xc38809b1, 0x7db5: 0x40306c20, 0x7db6: 0x4030be20, 0x7db7: 0x4030e220, - 0x7db8: 0x4030f620, 0x7db9: 0x40310020, 0x7dba: 0x40312a20, 0x7dbb: 0x4003fc20, - 0x7dbc: 0x40094820, 0x7dbd: 0x4003fe20, 0x7dbe: 0x40094c20, 0x7dbf: 0xa0000000, - // Block 0x1f7, offset 0x7dc0 - 0x7dc0: 0xa0000000, 0x7dc1: 0xa0000000, 0x7dc2: 0xa0000000, 0x7dc3: 0xa0000000, - 0x7dc4: 0xa0000000, 0x7dc5: 0xa0000000, 0x7dc6: 0xa0000000, 0x7dc7: 0xa0000000, - 0x7dc8: 0xa0000000, 0x7dc9: 0x40020020, 0x7dca: 0x40020220, 0x7dcb: 0x40020420, - 0x7dcc: 0x40020620, 0x7dcd: 0x40020820, 0x7dce: 0xa0000000, 0x7dcf: 0xa0000000, - 0x7dd0: 0xa0000000, 0x7dd1: 0xa0000000, 0x7dd2: 0xa0000000, 0x7dd3: 0xa0000000, - 0x7dd4: 0xa0000000, 0x7dd5: 0xa0000000, 0x7dd6: 0xa0000000, 0x7dd7: 0xa0000000, - 0x7dd8: 0xa0000000, 0x7dd9: 0xa0000000, 0x7dda: 0xa0000000, 0x7ddb: 0xa0000000, - 0x7ddc: 0xa0000000, 0x7ddd: 0xa0000000, 0x7dde: 0xa0000000, 0x7ddf: 0xa0000000, - 0x7de0: 0x40021220, 0x7de1: 0x4002ba20, 0x7de2: 0x4003e020, 0x7de3: 0x4004ea20, - 0x7de4: 0x4027de20, 0x7de5: 0x4004ec20, 0x7de6: 0x4004e620, 0x7de7: 0x4003d220, - 0x7de8: 0x4003f420, 0x7de9: 0x4003f620, 0x7dea: 0x4004d820, 0x7deb: 0x40093820, - 0x7dec: 0x40024020, 0x7ded: 0x40021a20, 0x7dee: 0x4002e420, 0x7def: 0x4004e220, - 0x7df0: 0x4029cc20, 0x7df1: 0x4029ce20, 0x7df2: 0x4029d020, 0x7df3: 0x4029d220, - 0x7df4: 0x4029d420, 0x7df5: 0x4029d620, 0x7df6: 0x4029d820, 0x7df7: 0x4029da20, - 0x7df8: 0x4029dc20, 0x7df9: 0x4029de20, 0x7dfa: 0x40026c20, 0x7dfb: 0x40026220, - 0x7dfc: 0x40094020, 0x7dfd: 0x40094220, 0x7dfe: 0x40094420, 0x7dff: 0x4002c420, - // Block 0x1f8, offset 0x7e00 - 0x7e00: 0x4004d620, 0x7e01: 0xc3970b93, 0x7e02: 0x002c0a88, 0x7e03: 0x002c3a88, - 0x7e04: 0x002c6288, 0x7e05: 0xc39e0be1, 0x7e06: 0x002d0888, 0x7e07: 0x002d2288, - 0x7e08: 0x002d6888, 0x7e09: 0x002d9a88, 0x7e0a: 0x002dcc88, 0x7e0b: 0x002dfe88, - 0x7e0c: 0xc0030002, 0x7e0d: 0x002e8288, 0x7e0e: 0x002e9e88, 0x7e0f: 0xc3a30b21, - 0x7e10: 0x002f2c88, 0x7e11: 0x002f5688, 0x7e12: 0x002f7a88, 0x7e13: 0x002fe688, - 0x7e14: 0x00302c88, 0x7e15: 0xc3900b21, 0x7e16: 0x0030be88, 0x7e17: 0x0030e288, - 0x7e18: 0x0030f688, 0x7e19: 0x00310088, 0x7e1a: 0x00312a88, 0x7e1b: 0x4003f820, - 0x7e1c: 0x4004e420, 0x7e1d: 0x4003fa20, 0x7e1e: 0x40062420, 0x7e1f: 0x40021620, - 0x7e20: 0x40061e20, 0x7e21: 0xc3930b52, 0x7e22: 0x402c0a20, 0x7e23: 0x402c3a20, - 0x7e24: 0x402c6220, 0x7e25: 0xc39c0be1, 0x7e26: 0x402d0820, 0x7e27: 0x402d2220, - 0x7e28: 0x402d6820, 0x7e29: 0x402d9a20, 0x7e2a: 0x402dcc20, 0x7e2b: 0x402dfe20, - 0x7e2c: 0xc0000002, 0x7e2d: 0x402e8220, 0x7e2e: 0x402e9e20, 0x7e2f: 0xc3a00b21, - 0x7e30: 0x402f2c20, 0x7e31: 0x402f5620, 0x7e32: 0x402f7a20, 0x7e33: 0x402fe620, - 0x7e34: 0x40302c20, 0x7e35: 0xc38d0b21, 0x7e36: 0x4030be20, 0x7e37: 0x4030e220, - 0x7e38: 0x4030f620, 0x7e39: 0x40310020, 0x7e3a: 0x40312a20, 0x7e3b: 0x4003fc20, - 0x7e3c: 0x40094820, 0x7e3d: 0x4003fe20, 0x7e3e: 0x40094c20, 0x7e3f: 0xa0000000, - // Block 0x1f9, offset 0x7e40 - 0x7e40: 0xe00008f5, 0x7e41: 0xe00008ef, 0x7e42: 0xe0000921, 0x7e43: 0xe0000969, - 0x7e44: 0x00320ca3, 0x7e45: 0x00321083, 0x7e46: 0x00320c83, 0x7e47: 0xe0000a53, - 0x7e48: 0xe0000ae8, 0x7e49: 0xe0000ae2, 0x7e4a: 0xe0000af4, 0x7e4b: 0xe0000b20, - 0x7e4c: 0xe0000c2b, 0x7e4d: 0xe0000c25, 0x7e4e: 0xe0000c37, 0x7e4f: 0xe0000c43, - 0x7e50: 0x002c62c3, 0x7e51: 0xe0000d63, 0x7e52: 0xe0000d9a, 0x7e53: 0xe0000d94, - 0x7e54: 0xe0000da6, 0x7e55: 0xe0000de6, 0x7e56: 0x00320ea3, 0x7e57: 0x40093e20, - 0x7e58: 0x00320e83, 0x7e59: 0xe0000fe1, 0x7e5a: 0xe0000fdb, 0x7e5b: 0xe0000fed, - 0x7e5c: 0x003100a3, 0x7e5d: 0xe0001102, 0x7e5e: 0xe0002973, 0x7e5f: 0xe0000f7b, - 0x7e60: 0xe00008f2, 0x7e61: 0xe00008ec, 0x7e62: 0xe000091e, 0x7e63: 0xe0000966, - 0x7e64: 0x40320c21, 0x7e65: 0x40321020, 0x7e66: 0x40320c20, 0x7e67: 0xe0000a4d, - 0x7e68: 0xe0000ae5, 0x7e69: 0xe0000adf, 0x7e6a: 0xe0000af1, 0x7e6b: 0xe0000b1d, - 0x7e6c: 0xe0000c28, 0x7e6d: 0xe0000c22, 0x7e6e: 0xe0000c34, 0x7e6f: 0xe0000c40, - 0x7e70: 0x402c6222, 0x7e71: 0xe0000d60, 0x7e72: 0xe0000d97, 0x7e73: 0xe0000d91, - 0x7e74: 0xe0000da3, 0x7e75: 0xe0000de3, 0x7e76: 0x40320e21, 0x7e77: 0x40093c20, - 0x7e78: 0x40320e20, 0x7e79: 0xe0000fde, 0x7e7a: 0xe0000fd8, 0x7e7b: 0xe0000fea, - 0x7e7c: 0x40310021, 0x7e7d: 0xe00010ff, 0x7e7e: 0xe0002970, 0x7e7f: 0xe0001114, - // Block 0x1fa, offset 0x7e80 - 0x7e80: 0xe0000983, 0x7e81: 0xe0000980, 0x7e82: 0xe00008fb, 0x7e83: 0xe00008f8, - 0x7e84: 0xe000097d, 0x7e85: 0xe000097a, 0x7e86: 0xe0000a38, 0x7e87: 0xe0000a35, - 0x7e88: 0xe0000a3e, 0x7e89: 0xe0000a3b, 0x7e8a: 0xe0000a4a, 0x7e8b: 0xe0000a47, - 0x7e8c: 0xe0000a44, 0x7e8d: 0xe0000a41, 0x7e8e: 0xe0000a86, 0x7e8f: 0xe0000a83, - 0x7e90: 0x002c62a3, 0x7e91: 0x402c6221, 0x7e92: 0xe0000b46, 0x7e93: 0xe0000b43, - 0x7e94: 0xe0000aee, 0x7e95: 0xe0000aeb, 0x7e96: 0xe0000b2c, 0x7e97: 0xe0000b29, - 0x7e98: 0x00320cc3, 0x7e99: 0x40320c22, 0x7e9a: 0xe0000b1a, 0x7e9b: 0xe0000b17, - 0x7e9c: 0xe0000bb8, 0x7e9d: 0xe0000bb5, 0x7e9e: 0xe0000bb2, 0x7e9f: 0xe0000baf, - 0x7ea0: 0xe0000bc4, 0x7ea1: 0xe0000bc1, 0x7ea2: 0xe0000bca, 0x7ea3: 0xe0000bc7, - 0x7ea4: 0xe0000bee, 0x7ea5: 0xe0000beb, 0x7ea6: 0xe0000c1b, 0x7ea7: 0xe0000c18, - 0x7ea8: 0xe0000c51, 0x7ea9: 0xe0000c4e, 0x7eaa: 0xe0000c60, 0x7eab: 0xe0000c5d, - 0x7eac: 0xe0000c31, 0x7ead: 0xe0000c2e, 0x7eae: 0xe0000c5a, 0x7eaf: 0xe0000c57, - 0x7eb0: 0xe0000c54, 0x7eb1: 0x402da220, 0x7eb2: 0xf0000a0a, 0x7eb3: 0xf0000404, - 0x7eb4: 0xe0000c8a, 0x7eb5: 0xe0000c87, 0x7eb6: 0xe0000c9f, 0x7eb7: 0xe0000c9c, - 0x7eb8: 0x402f7220, 0x7eb9: 0xe0000ccc, 0x7eba: 0xe0000cc9, 0x7ebb: 0xe0000cd8, - 0x7ebc: 0xe0000cd5, 0x7ebd: 0xe0000cd2, 0x7ebe: 0xe0000ccf, 0x7ebf: 0xe0000d04, - // Block 0x1fb, offset 0x7ec0 - 0x7ec0: 0xe0000cfe, 0x7ec1: 0xe0000cf8, 0x7ec2: 0xe0000cf5, 0x7ec3: 0xe0000d51, - 0x7ec4: 0xe0000d4e, 0x7ec5: 0xe0000d6f, 0x7ec6: 0xe0000d6c, 0x7ec7: 0xe0000d5d, - 0x7ec8: 0xe0000d5a, 0x7ec9: 0xf0000404, 0x7eca: 0x002eda88, 0x7ecb: 0x402eda20, - 0x7ecc: 0xe0000e2e, 0x7ecd: 0xe0000e2b, 0x7ece: 0xe0000da0, 0x7ecf: 0xe0000d9d, - 0x7ed0: 0x00320ec3, 0x7ed1: 0x40320e22, 0x7ed2: 0x00320ee3, 0x7ed3: 0x40320e23, - 0x7ed4: 0xe0000eca, 0x7ed5: 0xe0000ec7, 0x7ed6: 0xe0000edc, 0x7ed7: 0xe0000ed9, - 0x7ed8: 0xe0000ed0, 0x7ed9: 0xe0000ecd, 0x7eda: 0xe0000f1f, 0x7edb: 0xe0000f1c, - 0x7edc: 0xe0000f2d, 0x7edd: 0xe0000f2a, 0x7ede: 0xe0000f47, 0x7edf: 0xe0000f44, - 0x7ee0: 0xe0000f33, 0x7ee1: 0xe0000f30, 0x7ee2: 0xe0000f99, 0x7ee3: 0xe0000f96, - 0x7ee4: 0xe0000f8a, 0x7ee5: 0xe0000f87, 0x7ee6: 0x00303688, 0x7ee7: 0x40303620, - 0x7ee8: 0xe000102b, 0x7ee9: 0xe0001028, 0x7eea: 0xe000103f, 0x7eeb: 0xe000103c, - 0x7eec: 0xe0000fe7, 0x7eed: 0xe0000fe4, 0x7eee: 0xe0000ff9, 0x7eef: 0xe0000ff6, - 0x7ef0: 0x003100c3, 0x7ef1: 0x40310022, 0x7ef2: 0xe0001039, 0x7ef3: 0xe0001036, - 0x7ef4: 0xe00010d8, 0x7ef5: 0xe00010d5, 0x7ef6: 0xe000110e, 0x7ef7: 0xe000110b, - 0x7ef8: 0xe0001117, 0x7ef9: 0xe000113b, 0x7efa: 0xe0001138, 0x7efb: 0xe000114d, - 0x7efc: 0xe000114a, 0x7efd: 0xe0001147, 0x7efe: 0xe0001144, 0x7eff: 0xe0000f64, - // Block 0x1fc, offset 0x7f00 - 0x7f00: 0x40321220, 0x7f01: 0x40321a20, 0x7f02: 0x40322220, 0x7f03: 0x40322a20, - 0x7f04: 0xe0000ad5, 0x7f05: 0xe0000ad1, 0x7f06: 0xe0000acd, 0x7f07: 0xf0000a0a, - 0x7f08: 0xf000040a, 0x7f09: 0xf0000404, 0x7f0a: 0xf0000a0a, 0x7f0b: 0xf000040a, - 0x7f0c: 0xf0000404, 0x7f0d: 0xe0000947, 0x7f0e: 0xe0000944, 0x7f0f: 0xe0000c3d, - 0x7f10: 0xe0000c3a, 0x7f11: 0xe0000dcc, 0x7f12: 0xe0000dc9, 0x7f13: 0xe0000ff3, - 0x7f14: 0xe0000ff0, 0x7f15: 0xe000298b, 0x7f16: 0xe0002988, 0x7f17: 0xe0002979, - 0x7f18: 0xe0002976, 0x7f19: 0xe0002985, 0x7f1a: 0xe0002982, 0x7f1b: 0xe000297f, - 0x7f1c: 0xe000297c, 0x7f1d: 0x402cae20, 0x7f1e: 0xe000299d, 0x7f1f: 0xe000299a, - 0x7f20: 0xe0000976, 0x7f21: 0xe0000972, 0x7f22: 0xe0002997, 0x7f23: 0xe0002994, - 0x7f24: 0x002d3a88, 0x7f25: 0x402d3a20, 0x7f26: 0xe0000bbe, 0x7f27: 0xe0000bbb, - 0x7f28: 0xe0000c99, 0x7f29: 0xe0000c96, 0x7f2a: 0xe0000e20, 0x7f2b: 0xe0000e1d, - 0x7f2c: 0xe0000e27, 0x7f2d: 0xe0000e23, 0x7f2e: 0xe0001162, 0x7f2f: 0xe000115f, - 0x7f30: 0xe0000c8d, 0x7f31: 0xf0000a0a, 0x7f32: 0xf000040a, 0x7f33: 0xf0000404, - 0x7f34: 0xe0000bac, 0x7f35: 0xe0000ba9, 0x7f36: 0x002d7888, 0x7f37: 0x00319488, - 0x7f38: 0xe0000d57, 0x7f39: 0xe0000d54, 0x7f3a: 0xe00029b5, 0x7f3b: 0xe00029b2, - 0x7f3c: 0xe0002991, 0x7f3d: 0xe000298e, 0x7f3e: 0xe00029a3, 0x7f3f: 0xe00029a0, - // Block 0x1fd, offset 0x7f40 - 0x7f40: 0xe000098f, 0x7f41: 0xe000098c, 0x7f42: 0xe0000995, 0x7f43: 0xe0000992, - 0x7f44: 0xe0000b62, 0x7f45: 0xe0000b5f, 0x7f46: 0xe0000b68, 0x7f47: 0xe0000b65, - 0x7f48: 0xe0000c6c, 0x7f49: 0xe0000c69, 0x7f4a: 0xe0000c72, 0x7f4b: 0xe0000c6f, - 0x7f4c: 0xe0000e4a, 0x7f4d: 0xe0000e47, 0x7f4e: 0xe0000e50, 0x7f4f: 0xe0000e4d, - 0x7f50: 0xe0000ee8, 0x7f51: 0xe0000ee5, 0x7f52: 0xe0000eee, 0x7f53: 0xe0000eeb, - 0x7f54: 0xe0001053, 0x7f55: 0xe0001050, 0x7f56: 0xe0001059, 0x7f57: 0xe0001056, - 0x7f58: 0xe0000f61, 0x7f59: 0xe0000f5e, 0x7f5a: 0xe0000fa5, 0x7f5b: 0xe0000fa2, - 0x7f5c: 0x00312288, 0x7f5d: 0x40312220, 0x7f5e: 0xe0000bf4, 0x7f5f: 0xe0000bf1, - 0x7f60: 0x002ebc88, 0x7f61: 0x402c8c20, 0x7f62: 0x002f2288, 0x7f63: 0x402f2220, - 0x7f64: 0x00314088, 0x7f65: 0x40314020, 0x7f66: 0xe000096f, 0x7f67: 0xe000096c, - 0x7f68: 0xe0000b32, 0x7f69: 0xe0000b2f, 0x7f6a: 0xe00029af, 0x7f6b: 0xe00029ac, - 0x7f6c: 0xe0000dfd, 0x7f6d: 0xe0000df9, 0x7f6e: 0xe0000e04, 0x7f6f: 0xe0000e01, - 0x7f70: 0xe0000e0b, 0x7f71: 0xe0000e07, 0x7f72: 0xe0001129, 0x7f73: 0xe0001126, - 0x7f74: 0x402e5e20, 0x7f75: 0x402ed020, 0x7f76: 0x40305a20, 0x7f77: 0x402dd420, - 0x7f78: 0xe0000abf, 0x7f79: 0xe0000ec4, 0x7f7a: 0x002be888, 0x7f7b: 0x002c4488, - 0x7f7c: 0x402c4420, 0x7f7d: 0x002e3888, 0x7f7e: 0x00303e88, 0x7f7f: 0x402ffc20, - // Block 0x1fe, offset 0x7f80 - 0x7f80: 0x402c2820, 0x7f81: 0x402c7020, 0x7f82: 0x402d1420, 0x7f83: 0x402d4220, - 0x7f84: 0x402e0820, 0x7f85: 0x402e5220, 0x7f86: 0x402e8e20, 0x7f87: 0x402ec620, - 0x7f88: 0x402f3c20, 0x7f89: 0x402faa20, 0x7f8a: 0x402ff220, 0x7f8b: 0x40301020, - 0x7f8c: 0x4030ca20, 0x7f8d: 0x4030fe20, 0x7f8e: 0x40313e20, 0x7f8f: 0x402bea20, - 0x7f90: 0x402c0020, 0x7f91: 0x402c8220, 0x7f92: 0x402caa20, 0x7f93: 0x402cca20, - 0x7f94: 0x402ce420, 0x7f95: 0x402cc020, 0x7f96: 0x402dc020, 0x7f97: 0x402f0620, - 0x7f98: 0x40302220, 0x7f99: 0x40308620, 0x7f9a: 0x40317620, 0x7f9b: 0x002c0294, - 0x7f9c: 0x002c3a94, 0x7f9d: 0x002c5694, 0x7f9e: 0xe000296d, 0x7f9f: 0x002cdc94, - 0x7fa0: 0x002d0894, 0x7fa1: 0x002dee94, 0x7fa2: 0x002d2a94, 0x7fa3: 0x00308894, - 0x7fa4: 0x002db694, 0x7fa5: 0x002dc294, 0x7fa6: 0x002daa94, 0x7fa7: 0x002dbe94, - 0x7fa8: 0x002de694, 0x7fa9: 0x002e5494, 0x7faa: 0x002e5294, 0x7fab: 0x002e2a94, - 0x7fac: 0x002e9094, 0x7fad: 0x0030ac94, 0x7fae: 0x002eb494, 0x7faf: 0x002ec894, - 0x7fb0: 0x002ea694, 0x7fb1: 0x002f1094, 0x7fb2: 0x002f4c94, 0x7fb3: 0x002ff494, - 0x7fb4: 0x00300894, 0x7fb5: 0x00304294, 0x7fb6: 0x00307c94, 0x7fb7: 0x0030b494, - 0x7fb8: 0x00307494, 0x7fb9: 0x0030cc94, 0x7fba: 0x0030da94, 0x7fbb: 0x00312a94, - 0x7fbc: 0x00314894, 0x7fbd: 0x00315094, 0x7fbe: 0x00316494, 0x7fbf: 0x00326a94, - // Block 0x1ff, offset 0x7fc0 - 0x7fc0: 0xe0000d24, 0x7fc1: 0xe0000d21, 0x7fc2: 0xe0000d2a, 0x7fc3: 0xe0000d27, - 0x7fc4: 0xe0000d69, 0x7fc5: 0xe0000d66, 0x7fc6: 0xe0000d7b, 0x7fc7: 0xe0000d78, - 0x7fc8: 0xe0000d87, 0x7fc9: 0xe0000d84, 0x7fca: 0xe0000d81, 0x7fcb: 0xe0000d7e, - 0x7fcc: 0xe0000ded, 0x7fcd: 0xe0000de9, 0x7fce: 0xe00029a9, 0x7fcf: 0xe00029a6, - 0x7fd0: 0xe0000e3d, 0x7fd1: 0xe0000e39, 0x7fd2: 0xe0000e35, 0x7fd3: 0xe0000e31, - 0x7fd4: 0xe0000ea7, 0x7fd5: 0xe0000ea4, 0x7fd6: 0xe0000ead, 0x7fd7: 0xe0000eaa, - 0x7fd8: 0xe0000ed6, 0x7fd9: 0xe0000ed3, 0x7fda: 0xe0000ef4, 0x7fdb: 0xe0000ef1, - 0x7fdc: 0xe0000efb, 0x7fdd: 0xe0000ef7, 0x7fde: 0xe0000f02, 0x7fdf: 0xe0000eff, - 0x7fe0: 0xe0000f41, 0x7fe1: 0xe0000f3e, 0x7fe2: 0xe0000f53, 0x7fe3: 0xe0000f50, - 0x7fe4: 0xe0000f26, 0x7fe5: 0xe0000f22, 0x7fe6: 0xe0000f3a, 0x7fe7: 0xe0000f36, - 0x7fe8: 0xe0000f5a, 0x7fe9: 0xe0000f56, 0x7fea: 0xe0000f93, 0x7feb: 0xe0000f90, - 0x7fec: 0xe0000f9f, 0x7fed: 0xe0000f9c, 0x7fee: 0xe0000fb1, 0x7fef: 0xe0000fae, - 0x7ff0: 0xe0000fab, 0x7ff1: 0xe0000fa8, 0x7ff2: 0xe0001093, 0x7ff3: 0xe0001090, - 0x7ff4: 0xe000109f, 0x7ff5: 0xe000109c, 0x7ff6: 0xe0001099, 0x7ff7: 0xe0001096, - 0x7ff8: 0xe0001032, 0x7ff9: 0xe000102e, 0x7ffa: 0xe000298b, 0x7ffb: 0xe0002988, - 0x7ffc: 0xe00010a9, 0x7ffd: 0xe00010a6, 0x7ffe: 0xe00010af, 0x7fff: 0xe00010ac, - // Block 0x200, offset 0x8000 - 0x8000: 0xe00009bc, 0x8001: 0xe00009c0, 0x8002: 0x002c3a8b, 0x8003: 0xf0000a04, - 0x8004: 0x40081c20, 0x8005: 0xe0000a5e, 0x8006: 0xe0000a62, 0x8007: 0x002cc28a, - 0x8008: 0x40081e20, 0x8009: 0xf0000a04, 0x800a: 0x002d2285, 0x800b: 0x002d688b, - 0x800c: 0x002d688b, 0x800d: 0x002d688b, 0x800e: 0x002d6885, 0x800f: 0xf0000202, - 0x8010: 0x002d9a8b, 0x8011: 0x002d9a8b, 0x8012: 0x002e228b, 0x8013: 0x002e2285, - 0x8014: 0x40082020, 0x8015: 0x002e9e8b, 0x8016: 0xf000040a, 0x8017: 0x40082220, - 0x8018: 0x40082420, 0x8019: 0x002f2c8b, 0x801a: 0x002f568b, 0x801b: 0x002f7a8b, - 0x801c: 0x002f7a8b, 0x801d: 0x002f7a8b, 0x801e: 0x40082620, 0x801f: 0x40082820, - 0x8020: 0xf0001414, 0x8021: 0xe0000fbd, 0x8022: 0xf0001414, 0x8023: 0x40082a20, - 0x8024: 0x00312a8b, 0x8025: 0x40082c20, 0x8026: 0x0032a288, 0x8027: 0x40082e20, - 0x8028: 0x00312a8b, 0x8029: 0x40083020, 0x802a: 0x002dfe88, 0x802b: 0x00321083, - 0x802c: 0x002c0a8b, 0x802d: 0x002c3a8b, 0x802e: 0x40083220, 0x802f: 0x002c9885, - 0x8030: 0x002c988b, 0x8031: 0x002d088b, 0x8032: 0x002d1e88, 0x8033: 0x002e828b, - 0x8034: 0x002ee285, 0x8035: 0x00389084, 0x8036: 0x00389284, 0x8037: 0x00389484, - 0x8038: 0x00389684, 0x8039: 0x002d9a85, 0x803a: 0x40083420, 0x803b: 0xe0000b95, - 0x803c: 0x00327e85, 0x803d: 0x00325685, 0x803e: 0x0032568b, 0x803f: 0x00327e8b, - // Block 0x201, offset 0x8040 - 0x8040: 0xa0000000, 0x8041: 0xa0000000, 0x8042: 0xa0000000, 0x8043: 0xa0000000, - 0x8044: 0xa0000000, 0x8045: 0xa0000000, 0x8046: 0xa0000000, 0x8047: 0xa0000000, - 0x8048: 0xa0000000, 0x8049: 0x40020020, 0x804a: 0x40020220, 0x804b: 0x40020420, - 0x804c: 0x40020620, 0x804d: 0x40020820, 0x804e: 0xa0000000, 0x804f: 0xa0000000, - 0x8050: 0xa0000000, 0x8051: 0xa0000000, 0x8052: 0xa0000000, 0x8053: 0xa0000000, - 0x8054: 0xa0000000, 0x8055: 0xa0000000, 0x8056: 0xa0000000, 0x8057: 0xa0000000, - 0x8058: 0xa0000000, 0x8059: 0xa0000000, 0x805a: 0xa0000000, 0x805b: 0xa0000000, - 0x805c: 0xa0000000, 0x805d: 0xa0000000, 0x805e: 0xa0000000, 0x805f: 0xa0000000, - 0x8060: 0x40021220, 0x8061: 0x4002ba20, 0x8062: 0x4003e020, 0x8063: 0x4004ea20, - 0x8064: 0x4027de20, 0x8065: 0x4004ec20, 0x8066: 0x4004e620, 0x8067: 0x4003d220, - 0x8068: 0x4003f420, 0x8069: 0x4003f620, 0x806a: 0x4004d820, 0x806b: 0x40093820, - 0x806c: 0x40024020, 0x806d: 0x40021a20, 0x806e: 0x4002e420, 0x806f: 0x4004e220, - 0x8070: 0x4029cc20, 0x8071: 0x4029ce20, 0x8072: 0x4029d020, 0x8073: 0x4029d220, - 0x8074: 0x4029d420, 0x8075: 0x4029d620, 0x8076: 0x4029d820, 0x8077: 0x4029da20, - 0x8078: 0x4029dc20, 0x8079: 0x4029de20, 0x807a: 0x40026c20, 0x807b: 0x40026220, - 0x807c: 0x40094020, 0x807d: 0x40094220, 0x807e: 0x40094420, 0x807f: 0x4002c420, - // Block 0x202, offset 0x8080 - 0x8080: 0x4004d620, 0x8081: 0xc3a80071, 0x8082: 0x002c0a88, 0x8083: 0x002c3a88, - 0x8084: 0x002c6288, 0x8085: 0x002c9888, 0x8086: 0x002d0888, 0x8087: 0x002d2288, - 0x8088: 0x002d6888, 0x8089: 0x002d9a88, 0x808a: 0x002dcc88, 0x808b: 0x002dfe88, - 0x808c: 0xc0030002, 0x808d: 0x002e8288, 0x808e: 0x002e9e88, 0x808f: 0xc3ac0071, - 0x8090: 0x002f2c88, 0x8091: 0x002f5688, 0x8092: 0x002f7a88, 0x8093: 0x002fe688, - 0x8094: 0x00302c88, 0x8095: 0xc3b00071, 0x8096: 0x0030be88, 0x8097: 0x0030e288, - 0x8098: 0x0030f688, 0x8099: 0x00310088, 0x809a: 0x00312a88, 0x809b: 0x4003f820, - 0x809c: 0x4004e420, 0x809d: 0x4003fa20, 0x809e: 0x40062420, 0x809f: 0x40021620, - 0x80a0: 0x40061e20, 0x80a1: 0xc3a60071, 0x80a2: 0x402c0a20, 0x80a3: 0x402c3a20, - 0x80a4: 0x402c6220, 0x80a5: 0x402c9820, 0x80a6: 0x402d0820, 0x80a7: 0x402d2220, - 0x80a8: 0x402d6820, 0x80a9: 0x402d9a20, 0x80aa: 0x402dcc20, 0x80ab: 0x402dfe20, - 0x80ac: 0xc0000002, 0x80ad: 0x402e8220, 0x80ae: 0x402e9e20, 0x80af: 0xc3aa0071, - 0x80b0: 0x402f2c20, 0x80b1: 0x402f5620, 0x80b2: 0x402f7a20, 0x80b3: 0x402fe620, - 0x80b4: 0x40302c20, 0x80b5: 0xc3ae0071, 0x80b6: 0x4030be20, 0x80b7: 0x4030e220, - 0x80b8: 0x4030f620, 0x80b9: 0x40310020, 0x80ba: 0x40312a20, 0x80bb: 0x4003fc20, - 0x80bc: 0x40094820, 0x80bd: 0x4003fe20, 0x80be: 0x40094c20, 0x80bf: 0xa0000000, - // Block 0x203, offset 0x80c0 - 0x80c0: 0xe00008f5, 0x80c1: 0xe00008ef, 0x80c2: 0xe0000921, 0x80c3: 0xe0000969, - 0x80c4: 0xe00029bb, 0x80c5: 0xe000094d, 0x80c6: 0xe00009dd, 0x80c7: 0xe0000a53, - 0x80c8: 0xe0000ae8, 0x80c9: 0xe0000ae2, 0x80ca: 0xe0000af4, 0x80cb: 0xe0000b20, - 0x80cc: 0xe0000c2b, 0x80cd: 0xe0000c25, 0x80ce: 0xe0000c37, 0x80cf: 0xe0000c43, - 0x80d0: 0xe0000ab3, 0x80d1: 0xe0000d63, 0x80d2: 0xe0000d9a, 0x80d3: 0xe0000d94, - 0x80d4: 0xe0000da6, 0x80d5: 0xe0000de6, 0x80d6: 0xe00029c9, 0x80d7: 0x40093e20, - 0x80d8: 0xe0000e12, 0x80d9: 0xe0000fe1, 0x80da: 0xe0000fdb, 0x80db: 0xe0000fed, - 0x80dc: 0xe00029df, 0x80dd: 0xe0001102, 0x80de: 0x00318888, 0x80df: 0xe0000f7b, - 0x80e0: 0xe00008f2, 0x80e1: 0xe00008ec, 0x80e2: 0xe000091e, 0x80e3: 0xe0000966, - 0x80e4: 0xe00029b8, 0x80e5: 0xe000094a, 0x80e6: 0xe00009d5, 0x80e7: 0xe0000a4d, - 0x80e8: 0xe0000ae5, 0x80e9: 0xe0000adf, 0x80ea: 0xe0000af1, 0x80eb: 0xe0000b1d, - 0x80ec: 0xe0000c28, 0x80ed: 0xe0000c22, 0x80ee: 0xe0000c34, 0x80ef: 0xe0000c40, - 0x80f0: 0xe0000aad, 0x80f1: 0xe0000d60, 0x80f2: 0xe0000d97, 0x80f3: 0xe0000d91, - 0x80f4: 0xe0000da3, 0x80f5: 0xe0000de3, 0x80f6: 0xe00029c6, 0x80f7: 0x40093c20, - 0x80f8: 0xe0000e0f, 0x80f9: 0xe0000fde, 0x80fa: 0xe0000fd8, 0x80fb: 0xe0000fea, - 0x80fc: 0xe00029dc, 0x80fd: 0xe00010ff, 0x80fe: 0x40318820, 0x80ff: 0xe0001114, - // Block 0x204, offset 0x8100 - 0x8100: 0x40321220, 0x8101: 0x40321a20, 0x8102: 0x40322220, 0x8103: 0x40322a20, - 0x8104: 0xe0000ad5, 0x8105: 0xe0000ad1, 0x8106: 0xe0000acd, 0x8107: 0xf0000a0a, - 0x8108: 0xf000040a, 0x8109: 0xf0000404, 0x810a: 0xf0000a0a, 0x810b: 0xf000040a, - 0x810c: 0xf0000404, 0x810d: 0xe0000947, 0x810e: 0xe0000944, 0x810f: 0xe0000c3d, - 0x8110: 0xe0000c3a, 0x8111: 0xe0000dcc, 0x8112: 0xe0000dc9, 0x8113: 0xe0000ff3, - 0x8114: 0xe0000ff0, 0x8115: 0xe00029fe, 0x8116: 0xe00029fa, 0x8117: 0xe00029e6, - 0x8118: 0xe00029e2, 0x8119: 0xe00029f6, 0x811a: 0xe00029f2, 0x811b: 0xe00029ee, - 0x811c: 0xe00029ea, 0x811d: 0x402cae20, 0x811e: 0xe00029c2, 0x811f: 0xe00029be, - 0x8120: 0xe0000976, 0x8121: 0xe0000972, 0x8122: 0xe00009f4, 0x8123: 0xe00009ef, - 0x8124: 0x002d3a88, 0x8125: 0x402d3a20, 0x8126: 0xe0000bbe, 0x8127: 0xe0000bbb, - 0x8128: 0xe0000c99, 0x8129: 0xe0000c96, 0x812a: 0xe0000e20, 0x812b: 0xe0000e1d, - 0x812c: 0xe0000e27, 0x812d: 0xe0000e23, 0x812e: 0xe0001162, 0x812f: 0xe000115f, - 0x8130: 0xe0000c8d, 0x8131: 0xf0000a0a, 0x8132: 0xf000040a, 0x8133: 0xf0000404, - 0x8134: 0xe0000bac, 0x8135: 0xe0000ba9, 0x8136: 0x002d7888, 0x8137: 0x00319488, - 0x8138: 0xe0000d57, 0x8139: 0xe0000d54, 0x813a: 0xe0000954, 0x813b: 0xe0000950, - 0x813c: 0xe00009ea, 0x813d: 0xe00009e5, 0x813e: 0xe0000e19, 0x813f: 0xe0000e15, - // Block 0x205, offset 0x8140 - 0x8140: 0xe000098f, 0x8141: 0xe000098c, 0x8142: 0xe0000995, 0x8143: 0xe0000992, - 0x8144: 0xe0000b62, 0x8145: 0xe0000b5f, 0x8146: 0xe0000b68, 0x8147: 0xe0000b65, - 0x8148: 0xe0000c6c, 0x8149: 0xe0000c69, 0x814a: 0xe0000c72, 0x814b: 0xe0000c6f, - 0x814c: 0xe0000e4a, 0x814d: 0xe0000e47, 0x814e: 0xe0000e50, 0x814f: 0xe0000e4d, - 0x8150: 0xe0000ee8, 0x8151: 0xe0000ee5, 0x8152: 0xe0000eee, 0x8153: 0xe0000eeb, - 0x8154: 0xe0001053, 0x8155: 0xe0001050, 0x8156: 0xe0001059, 0x8157: 0xe0001056, - 0x8158: 0xe0000f61, 0x8159: 0xe0000f5e, 0x815a: 0xe0000fa5, 0x815b: 0xe0000fa2, - 0x815c: 0x00312288, 0x815d: 0x40312220, 0x815e: 0xe0000bf4, 0x815f: 0xe0000bf1, - 0x8160: 0x002ebc88, 0x8161: 0x402c8c20, 0x8162: 0x002f2288, 0x8163: 0x402f2220, - 0x8164: 0x00314088, 0x8165: 0x40314020, 0x8166: 0xe000096f, 0x8167: 0xe000096c, - 0x8168: 0xe0000b32, 0x8169: 0xe0000b2f, 0x816a: 0xe00029d8, 0x816b: 0xe00029d4, - 0x816c: 0xe0000dfd, 0x816d: 0xe0000df9, 0x816e: 0xe0000e04, 0x816f: 0xe0000e01, - 0x8170: 0xe0000e0b, 0x8171: 0xe0000e07, 0x8172: 0xe0001129, 0x8173: 0xe0001126, - 0x8174: 0x402e5e20, 0x8175: 0x402ed020, 0x8176: 0x40305a20, 0x8177: 0x402dd420, - 0x8178: 0xe0000abf, 0x8179: 0xe0000ec4, 0x817a: 0x002be888, 0x817b: 0x002c4488, - 0x817c: 0x402c4420, 0x817d: 0x002e3888, 0x817e: 0x00303e88, 0x817f: 0x402ffc20, - // Block 0x206, offset 0x8180 - 0x8180: 0xe0000d24, 0x8181: 0xe0000d21, 0x8182: 0xe0000d2a, 0x8183: 0xe0000d27, - 0x8184: 0xe0000d69, 0x8185: 0xe0000d66, 0x8186: 0xe0000d7b, 0x8187: 0xe0000d78, - 0x8188: 0xe0000d87, 0x8189: 0xe0000d84, 0x818a: 0xe0000d81, 0x818b: 0xe0000d7e, - 0x818c: 0xe0000ded, 0x818d: 0xe0000de9, 0x818e: 0xe00029d0, 0x818f: 0xe00029cc, - 0x8190: 0xe0000e3d, 0x8191: 0xe0000e39, 0x8192: 0xe0000e35, 0x8193: 0xe0000e31, - 0x8194: 0xe0000ea7, 0x8195: 0xe0000ea4, 0x8196: 0xe0000ead, 0x8197: 0xe0000eaa, - 0x8198: 0xe0000ed6, 0x8199: 0xe0000ed3, 0x819a: 0xe0000ef4, 0x819b: 0xe0000ef1, - 0x819c: 0xe0000efb, 0x819d: 0xe0000ef7, 0x819e: 0xe0000f02, 0x819f: 0xe0000eff, - 0x81a0: 0xe0000f41, 0x81a1: 0xe0000f3e, 0x81a2: 0xe0000f53, 0x81a3: 0xe0000f50, - 0x81a4: 0xe0000f26, 0x81a5: 0xe0000f22, 0x81a6: 0xe0000f3a, 0x81a7: 0xe0000f36, - 0x81a8: 0xe0000f5a, 0x81a9: 0xe0000f56, 0x81aa: 0xe0000f93, 0x81ab: 0xe0000f90, - 0x81ac: 0xe0000f9f, 0x81ad: 0xe0000f9c, 0x81ae: 0xe0000fb1, 0x81af: 0xe0000fae, - 0x81b0: 0xe0000fab, 0x81b1: 0xe0000fa8, 0x81b2: 0xe0001093, 0x81b3: 0xe0001090, - 0x81b4: 0xe000109f, 0x81b5: 0xe000109c, 0x81b6: 0xe0001099, 0x81b7: 0xe0001096, - 0x81b8: 0xe0001032, 0x81b9: 0xe000102e, 0x81ba: 0xe00029fe, 0x81bb: 0xe00029fa, - 0x81bc: 0xe00010a9, 0x81bd: 0xe00010a6, 0x81be: 0xe00010af, 0x81bf: 0xe00010ac, - // Block 0x207, offset 0x81c0 - 0x81c0: 0x40078220, 0x81c1: 0x40075e20, 0x81c2: 0x40076020, 0x81c3: 0x40076220, - 0x81c4: 0x40058220, 0x81c5: 0x40058420, 0x81c6: 0x40058620, 0x81c7: 0x40058820, - 0x81c8: 0x40058a20, 0x81c9: 0x40058c20, 0x81ca: 0x40058e20, 0x81cb: 0x4027bc20, - 0x81cc: 0x0027bc83, 0x81cd: 0x4027bc21, 0x81ce: 0x4027bc22, 0x81cf: 0x4027bc23, - 0x81d0: 0x4027bc24, 0x81d1: 0x4027bc25, 0x81d2: 0x4005a020, 0x81d3: 0x40076420, - 0x81d4: 0x4027bc26, 0x81d5: 0x40076620, 0x81d6: 0x40076820, 0x81d7: 0x40076a20, - 0x81d8: 0xadc00000, 0x81d9: 0xadc00000, 0x81da: 0x40076c20, 0x81db: 0x40076e20, - 0x81dc: 0x40077020, 0x81dd: 0x40077220, 0x81de: 0x40077420, 0x81df: 0x40077620, - 0x81e0: 0xe00001a0, 0x81e1: 0xe0000234, 0x81e2: 0xe000034c, 0x81e3: 0xe0000426, - 0x81e4: 0xe00004fb, 0x81e5: 0xe00005c5, 0x81e6: 0xe0000690, 0x81e7: 0xe0000738, - 0x81e8: 0xe00007e4, 0x81e9: 0xe0000889, 0x81ea: 0xe0000237, 0x81eb: 0xe000034f, - 0x81ec: 0xe0000429, 0x81ed: 0xe00004fe, 0x81ee: 0xe00005c8, 0x81ef: 0xe0000693, - 0x81f0: 0xe000073b, 0x81f1: 0xe00007e7, 0x81f2: 0xe000088c, 0x81f3: 0xe00001a3, - 0x81f4: 0x4027bc27, 0x81f5: 0xadc00000, 0x81f6: 0x40077a20, 0x81f7: 0xadc00000, - 0x81f8: 0x40077c20, 0x81f9: 0xae611002, 0x81fa: 0x40040020, 0x81fb: 0x40040220, - 0x81fc: 0x40040420, 0x81fd: 0x40040620, 0x81fe: 0xa0000000, 0x81ff: 0xa0000000, - // Block 0x208, offset 0x8200 - 0x8200: 0x404a7620, 0x8201: 0x404a7c20, 0x8202: 0xc4db2161, 0x8203: 0xe0002a23, - 0x8204: 0x404a8420, 0x8205: 0x404a8820, 0x8206: 0x404a8c20, 0x8207: 0x404a9020, - 0x8209: 0x404a9420, 0x820a: 0x004aa883, 0x820b: 0x004aac83, - 0x820c: 0x004ab083, 0x820d: 0xe0002a5b, 0x820e: 0x004ab483, 0x820f: 0x404aa820, - 0x8210: 0x404aac20, 0x8211: 0xc3b50c31, 0x8212: 0xe0002a58, 0x8213: 0x404ab420, - 0x8214: 0x404ab820, 0x8215: 0x404abc20, 0x8216: 0xc3ff1211, 0x8217: 0xe0002a7c, - 0x8218: 0xc46018e1, 0x8219: 0x404ac820, 0x821a: 0x404acc20, 0x821b: 0x404ad020, - 0x821c: 0xe0002a9d, 0x821d: 0x404ad420, 0x821e: 0x404ad820, 0x821f: 0x404adc20, - 0x8220: 0xc49b1d01, 0x8221: 0x404ae420, 0x8222: 0xc4481761, 0x8223: 0xc4551831, - 0x8224: 0x404af220, 0x8225: 0x004af283, 0x8226: 0xc48f1c51, 0x8227: 0x404afe20, - 0x8228: 0x404b0220, 0x8229: 0xe0002a02, 0x822a: 0x004ae883, 0x822b: 0x404a7a20, - 0x822c: 0x404aec20, - 0x8231: 0xc5270751, 0x8232: 0x8282258c, 0x8233: 0x8281258d, - 0x8234: 0x82842590, 0x8235: 0x82812591, 0x8236: 0x404b2420, 0x8237: 0x404b2620, - 0x8238: 0x404b2820, 0x8239: 0x404b2a20, 0x823a: 0x82822596, 0x823b: 0x83822596, - 0x823c: 0x82822598, 0x823d: 0x83822598, 0x823e: 0x004ac483, 0x823f: 0xae611102, - // Block 0x209, offset 0x8240 - 0x8240: 0x8382258c, 0x8241: 0x8281258f, 0x8242: 0x004ac484, 0x8243: 0x004ac485, - 0x8244: 0xae610e02, 0x8245: 0xae611202, 0x8246: 0xae600000, 0x8247: 0xae600000, - 0x8248: 0xc3b20c01, 0x8249: 0xc5122551, 0x824a: 0xae611502, 0x824b: 0xc5102521, - 0x824c: 0x404b0e20, 0x824d: 0x404b0820, 0x824e: 0x404b0c20, 0x824f: 0x404b1020, - 0x8250: 0x82822599, 0x8251: 0x8282259a, 0x8252: 0x8282259b, 0x8253: 0xe0002ac7, - 0x8254: 0x8282259c, 0x8255: 0x8282259d, 0x8256: 0x8282259e, 0x8257: 0x8282259f, - 0x8259: 0x828225a0, 0x825a: 0x838225a1, 0x825b: 0x838225a2, - 0x825c: 0x838225a3, 0x825d: 0xe0002acd, 0x825e: 0x838225a4, 0x825f: 0x828225a1, - 0x8260: 0x828225a2, 0x8261: 0x828225a3, 0x8262: 0xe0002aca, 0x8263: 0x828225a4, - 0x8264: 0x828225a5, 0x8265: 0x828225a6, 0x8266: 0x828225a7, 0x8267: 0xe0002ad0, - 0x8268: 0x828225a8, 0x8269: 0x828225a9, 0x826a: 0x828225aa, 0x826b: 0x828225ab, - 0x826c: 0xe0002ad3, 0x826d: 0x828225ac, 0x826e: 0x828225ad, 0x826f: 0x828225ae, - 0x8270: 0x828225af, 0x8271: 0x828225b0, 0x8272: 0xc5152581, 0x8273: 0xc51e2581, - 0x8274: 0x828225b3, 0x8275: 0x838225b3, 0x8276: 0x828225b4, 0x8277: 0x828225b5, - 0x8278: 0x828225b6, 0x8279: 0xe0002ac4, 0x827a: 0x838225ac, 0x827b: 0x838225b0, - 0x827c: 0x838225b1, 0x827e: 0x40077e20, 0x827f: 0x40078020, - // Block 0x20a, offset 0x8280 - 0x8280: 0xa0000000, 0x8281: 0xa0000000, 0x8282: 0xa0000000, 0x8283: 0xa0000000, - 0x8284: 0xa0000000, 0x8285: 0xa0000000, 0x8286: 0xa0000000, 0x8287: 0xa0000000, - 0x8288: 0xa0000000, 0x8289: 0x40020020, 0x828a: 0x40020220, 0x828b: 0x40020420, - 0x828c: 0x40020620, 0x828d: 0x40020820, 0x828e: 0xa0000000, 0x828f: 0xa0000000, - 0x8290: 0xa0000000, 0x8291: 0xa0000000, 0x8292: 0xa0000000, 0x8293: 0xa0000000, - 0x8294: 0xa0000000, 0x8295: 0xa0000000, 0x8296: 0xa0000000, 0x8297: 0xa0000000, - 0x8298: 0xa0000000, 0x8299: 0xa0000000, 0x829a: 0xa0000000, 0x829b: 0xa0000000, - 0x829c: 0xa0000000, 0x829d: 0xa0000000, 0x829e: 0xa0000000, 0x829f: 0xa0000000, - 0x82a0: 0x40021220, 0x82a1: 0x4002ba20, 0x82a2: 0x4003e020, 0x82a3: 0x4004ea20, - 0x82a4: 0x4027de20, 0x82a5: 0x4004ec20, 0x82a6: 0x4004e620, 0x82a7: 0x4003d220, - 0x82a8: 0x4003f420, 0x82a9: 0x4003f620, 0x82aa: 0x4004d820, 0x82ab: 0x40093820, - 0x82ac: 0x40024020, 0x82ad: 0x40021a20, 0x82ae: 0x4002e420, 0x82af: 0x4004e220, - 0x82b0: 0x4029cc20, 0x82b1: 0x4029ce20, 0x82b2: 0x4029d020, 0x82b3: 0x4029d220, - 0x82b4: 0x4029d420, 0x82b5: 0x4029d620, 0x82b6: 0x4029d820, 0x82b7: 0x4029da20, - 0x82b8: 0x4029dc20, 0x82b9: 0x4029de20, 0x82ba: 0x40026c20, 0x82bb: 0x40026220, - 0x82bc: 0x40094020, 0x82bd: 0x40094220, 0x82be: 0x40094420, 0x82bf: 0x4002c420, - // Block 0x20b, offset 0x82c0 - 0x82c0: 0x4004d620, 0x82c1: 0x002bde88, 0x82c2: 0x002c0a88, 0x82c3: 0x002c3a88, - 0x82c4: 0xc36a2662, 0x82c5: 0x002c9888, 0x82c6: 0x002d0888, 0x82c7: 0xc52b2692, - 0x82c8: 0x002d6888, 0x82c9: 0x002d9a88, 0x82ca: 0x002dcc88, 0x82cb: 0xc53026c2, - 0x82cc: 0xc0030002, 0x82cd: 0x002e8288, 0x82ce: 0xc53526f2, 0x82cf: 0x002ee288, - 0x82d0: 0x002f2c88, 0x82d1: 0x002f5688, 0x82d2: 0x002f7a88, 0x82d3: 0x002fe688, - 0x82d4: 0xc38a2722, 0x82d5: 0x00306c88, 0x82d6: 0x0030be88, 0x82d7: 0x0030e288, - 0x82d8: 0x002d6a83, 0x82d9: 0x00310088, 0x82da: 0x00312a88, 0x82db: 0x4003f820, - 0x82dc: 0x4004e420, 0x82dd: 0x4003fa20, 0x82de: 0x40062420, 0x82df: 0x40021620, - 0x82e0: 0x40061e20, 0x82e1: 0x402bde20, 0x82e2: 0x402c0a20, 0x82e3: 0x402c3a20, - 0x82e4: 0xc3682651, 0x82e5: 0x402c9820, 0x82e6: 0x402d0820, 0x82e7: 0xc3372681, - 0x82e8: 0x402d6820, 0x82e9: 0x402d9a20, 0x82ea: 0x402dcc20, 0x82eb: 0xc52e26b1, - 0x82ec: 0xc0000002, 0x82ed: 0x402e8220, 0x82ee: 0xc53326e1, 0x82ef: 0x402ee220, - 0x82f0: 0x402f2c20, 0x82f1: 0x402f5620, 0x82f2: 0x402f7a20, 0x82f3: 0x402fe620, - 0x82f4: 0xc3882711, 0x82f5: 0x40306c20, 0x82f6: 0x4030be20, 0x82f7: 0x4030e220, - 0x82f8: 0x402d6a20, 0x82f9: 0x40310020, 0x82fa: 0x40312a20, 0x82fb: 0x4003fc20, - 0x82fc: 0x40094820, 0x82fd: 0x4003fe20, 0x82fe: 0x40094c20, 0x82ff: 0xa0000000, - // Block 0x20c, offset 0x8300 - 0x8300: 0xe00008f5, 0x8301: 0xe00008ef, 0x8302: 0xe0002ad9, 0x8303: 0xe0000969, - 0x8304: 0xe000095b, 0x8305: 0xe000094d, 0x8306: 0xe00009dd, 0x8307: 0xe0000a53, - 0x8308: 0xe0000ae8, 0x8309: 0xe0000ae2, 0x830a: 0xe0002b0d, 0x830b: 0xe0000b20, - 0x830c: 0xe0000c2b, 0x830d: 0xe0000c25, 0x830e: 0xe0002b47, 0x830f: 0xe0000c43, - 0x8310: 0xe0000ab3, 0x8311: 0xe0000d63, 0x8312: 0xe0000d9a, 0x8313: 0xe0000d94, - 0x8314: 0xe0002b53, 0x8315: 0xe0000de6, 0x8316: 0xe0000dd2, 0x8317: 0x40093e20, - 0x8318: 0xe0000e12, 0x8319: 0xe0000fe1, 0x831a: 0xe0000fdb, 0x831b: 0xe0002b87, - 0x831c: 0xe0000fff, 0x831d: 0xe0001102, 0x831e: 0x00318888, 0x831f: 0xe0000f7b, - 0x8320: 0xe00008f2, 0x8321: 0xe00008ec, 0x8322: 0xe0002ad6, 0x8323: 0xe0000966, - 0x8324: 0xe0000958, 0x8325: 0xe000094a, 0x8326: 0xe00009d5, 0x8327: 0xe0000a4d, - 0x8328: 0xe0000ae5, 0x8329: 0xe0000adf, 0x832a: 0xe0002b0a, 0x832b: 0xe0000b1d, - 0x832c: 0xe0000c28, 0x832d: 0xe0000c22, 0x832e: 0xe0002b44, 0x832f: 0xe0000c40, - 0x8330: 0xe0000aad, 0x8331: 0xe0000d60, 0x8332: 0xe0000d97, 0x8333: 0xe0000d91, - 0x8334: 0xe0002b50, 0x8335: 0xe0000de3, 0x8336: 0xe0000dcf, 0x8337: 0x40093c20, - 0x8338: 0xe0000e0f, 0x8339: 0xe0000fde, 0x833a: 0xe0000fd8, 0x833b: 0xe0002b84, - 0x833c: 0xe0000ffc, 0x833d: 0xe00010ff, 0x833e: 0x40318820, 0x833f: 0xe0001114, - // Block 0x20d, offset 0x8340 - 0x8340: 0xe0000983, 0x8341: 0xe0000980, 0x8342: 0xe00008fb, 0x8343: 0xe00008f8, - 0x8344: 0xe000097d, 0x8345: 0xe000097a, 0x8346: 0xe0000a38, 0x8347: 0xe0000a35, - 0x8348: 0xe0002b07, 0x8349: 0xe0002b04, 0x834a: 0xe0000a4a, 0x834b: 0xe0000a47, - 0x834c: 0xe0000a44, 0x834d: 0xe0000a41, 0x834e: 0xe0000a86, 0x834f: 0xe0000a83, - 0x8350: 0xe0000aaa, 0x8351: 0xe0000aa7, 0x8352: 0xe0000b46, 0x8353: 0xe0000b43, - 0x8354: 0xe0000aee, 0x8355: 0xe0000aeb, 0x8356: 0xe0000b2c, 0x8357: 0xe0000b29, - 0x8358: 0xe0000b40, 0x8359: 0xe0000b3d, 0x835a: 0xe0000b1a, 0x835b: 0xe0000b17, - 0x835c: 0xe0002b3b, 0x835d: 0xe0002b38, 0x835e: 0xe0000bb2, 0x835f: 0xe0000baf, - 0x8360: 0xe0000bc4, 0x8361: 0xe0000bc1, 0x8362: 0xe0000bca, 0x8363: 0xe0000bc7, - 0x8364: 0xe0002b41, 0x8365: 0xe0002b3e, 0x8366: 0xe0000c1b, 0x8367: 0xe0000c18, - 0x8368: 0xe0000c51, 0x8369: 0xe0000c4e, 0x836a: 0xe0000c60, 0x836b: 0xe0000c5d, - 0x836c: 0xe0000c31, 0x836d: 0xe0000c2e, 0x836e: 0xe0000c5a, 0x836f: 0xe0000c57, - 0x8370: 0xe0000c54, 0x8371: 0x402da220, 0x8372: 0xf0000a0a, 0x8373: 0xf0000404, - 0x8374: 0xe0002b4d, 0x8375: 0xe0002b4a, 0x8376: 0xe0000c9f, 0x8377: 0xe0000c9c, - 0x8378: 0x402f7220, 0x8379: 0xe0000ccc, 0x837a: 0xe0000cc9, 0x837b: 0xe0000cd8, - 0x837c: 0xe0000cd5, 0x837d: 0xe0000cd2, 0x837e: 0xe0000ccf, 0x837f: 0xe0000d04, - // Block 0x20e, offset 0x8380 - 0x8380: 0xe0000cfe, 0x8381: 0xe0000cf8, 0x8382: 0xe0000cf5, 0x8383: 0xe0000d51, - 0x8384: 0xe0000d4e, 0x8385: 0xe0000d6f, 0x8386: 0xe0000d6c, 0x8387: 0xe0000d5d, - 0x8388: 0xe0000d5a, 0x8389: 0xf0000404, 0x838a: 0x002ea283, 0x838b: 0x402ea220, - 0x838c: 0xe0000e2e, 0x838d: 0xe0000e2b, 0x838e: 0xe0000da0, 0x838f: 0xe0000d9d, - 0x8390: 0xe0000de0, 0x8391: 0xe0000ddd, 0x8392: 0xe0000e93, 0x8393: 0xe0000e8f, - 0x8394: 0xe0000eca, 0x8395: 0xe0000ec7, 0x8396: 0xe0000edc, 0x8397: 0xe0000ed9, - 0x8398: 0xe0000ed0, 0x8399: 0xe0000ecd, 0x839a: 0xe0000f1f, 0x839b: 0xe0000f1c, - 0x839c: 0xe0002b81, 0x839d: 0xe0002b7e, 0x839e: 0xe0000f47, 0x839f: 0xe0000f44, - 0x83a0: 0xe0000f33, 0x83a1: 0xe0000f30, 0x83a2: 0xe0000f99, 0x83a3: 0xe0000f96, - 0x83a4: 0xe0000f8a, 0x83a5: 0xe0000f87, 0x83a6: 0x00303688, 0x83a7: 0x40303620, - 0x83a8: 0xe000102b, 0x83a9: 0xe0001028, 0x83aa: 0xe000103f, 0x83ab: 0xe000103c, - 0x83ac: 0xe0000fe7, 0x83ad: 0xe0000fe4, 0x83ae: 0xe0000ff9, 0x83af: 0xe0000ff6, - 0x83b0: 0xe0001025, 0x83b1: 0xe0001022, 0x83b2: 0xe0001039, 0x83b3: 0xe0001036, - 0x83b4: 0xe0002b8d, 0x83b5: 0xe0002b8a, 0x83b6: 0xe0002b93, 0x83b7: 0xe0002b90, - 0x83b8: 0xe0001117, 0x83b9: 0xe000113b, 0x83ba: 0xe0001138, 0x83bb: 0xe000114d, - 0x83bc: 0xe000114a, 0x83bd: 0xe0001147, 0x83be: 0xe0001144, 0x83bf: 0xe0000f64, - // Block 0x20f, offset 0x83c0 - 0x83c0: 0x402c1a20, 0x83c1: 0x002c2a88, 0x83c2: 0x002c3288, 0x83c3: 0x402c3220, - 0x83c4: 0x0031c488, 0x83c5: 0x4031c420, 0x83c6: 0x002ee483, 0x83c7: 0x002c4e88, - 0x83c8: 0x402c4e20, 0x83c9: 0x002c6683, 0x83ca: 0x002c7a88, 0x83cb: 0x002c8488, - 0x83cc: 0x402c8420, 0x83cd: 0xe000115c, 0x83ce: 0x002cae88, 0x83cf: 0x002cb888, - 0x83d0: 0x002c9a83, 0x83d1: 0x002d0a83, 0x83d2: 0x402d0a20, 0x83d3: 0x002d4488, - 0x83d4: 0x002d2683, 0x83d5: 0x402d7820, 0x83d6: 0x002dc288, 0x83d7: 0x002db688, - 0x83d8: 0x002e0a88, 0x83d9: 0x402e0a20, 0x83da: 0x402e3820, 0x83db: 0x402e7220, - 0x83dc: 0x0030a088, 0x83dd: 0x002eb488, 0x83de: 0x402ebc20, 0x83df: 0x002f1088, - 0x83e0: 0xe0000e56, 0x83e1: 0xe0000e53, 0x83e2: 0x002d6088, 0x83e3: 0x402d6020, - 0x83e4: 0x002f3e88, 0x83e5: 0x402f3e20, 0x83e6: 0x002f8288, 0x83e7: 0x0031b488, - 0x83e8: 0x4031b420, 0x83e9: 0x00300888, 0x83ea: 0x40301220, 0x83eb: 0x40304220, - 0x83ec: 0x00304a88, 0x83ed: 0x40304a20, 0x83ee: 0x00305288, 0x83ef: 0xe000105f, - 0x83f0: 0xe000105c, 0x83f1: 0x0030b488, 0x83f2: 0x0030c083, 0x83f3: 0x00311888, - 0x83f4: 0x40311820, 0x83f5: 0x00313488, 0x83f6: 0x40313420, 0x83f7: 0x00316488, - 0x83f8: 0x00316e88, 0x83f9: 0x40316e20, 0x83fa: 0x40317820, 0x83fb: 0x4031a620, - 0x83fc: 0x0031bc88, 0x83fd: 0x4031bc20, 0x83fe: 0xe0000fc9, 0x83ff: 0x40319420, - // Block 0x210, offset 0x8400 - 0x8400: 0x40315820, 0x8401: 0x0031d488, 0x8402: 0x4031d420, 0x8403: 0x002c1a88, - 0x8404: 0x00307c88, 0x8405: 0x0030da88, 0x8406: 0x002ca288, 0x8407: 0x402ca220, - 0x8408: 0x002dde88, 0x8409: 0x402dde20, 0x840a: 0x002f6a88, 0x840b: 0x402f6a20, - 0x840c: 0x002f8e88, 0x840d: 0x402f8e20, 0x840e: 0x00311088, 0x840f: 0x40311020, - 0x8410: 0x402bf020, 0x8411: 0x402bf820, 0x8412: 0x402c0220, 0x8413: 0x402c2a20, - 0x8414: 0x402ee420, 0x8415: 0x402c5620, 0x8416: 0x402c6620, 0x8417: 0x402c7a20, - 0x8418: 0x402ccc20, 0x8419: 0x402cb820, 0x841a: 0x402cd420, 0x841b: 0x402c9a20, - 0x841c: 0x402cdc20, 0x841d: 0x402ce820, 0x841e: 0x402cf020, 0x841f: 0x402dee20, - 0x8420: 0x402d4420, 0x8421: 0x402d2a20, 0x8422: 0x402d3220, 0x8423: 0x402d2620, - 0x8424: 0x402d0020, 0x8425: 0x40308820, 0x8426: 0x402d8020, 0x8427: 0x402d8e20, - 0x8428: 0x402db620, 0x8429: 0x402dc220, 0x842a: 0x402daa20, 0x842b: 0x402e4220, - 0x842c: 0x402e4a20, 0x842d: 0x402e5420, 0x842e: 0x402e6820, 0x842f: 0x4030a020, - 0x8430: 0x4030ac20, 0x8431: 0x402e9020, 0x8432: 0x402eb420, 0x8433: 0x402ec820, - 0x8434: 0x402ea620, 0x8435: 0x402f1020, 0x8436: 0x402eee20, 0x8437: 0x402f1a20, - 0x8438: 0x402f4c20, 0x8439: 0x402f9820, 0x843a: 0x402fa220, 0x843b: 0x402fac20, - 0x843c: 0x402fb620, 0x843d: 0x402fbe20, 0x843e: 0x402fc620, 0x843f: 0x402fd020, - // Block 0x211, offset 0x8440 - 0x8440: 0x402f8220, 0x8441: 0x402fd820, 0x8442: 0x402ff420, 0x8443: 0x40300820, - 0x8444: 0x402df620, 0x8445: 0x40301a20, 0x8446: 0x40302420, 0x8447: 0x40306420, - 0x8448: 0x40305220, 0x8449: 0x40307c20, 0x844a: 0x4030b420, 0x844b: 0x4030c020, - 0x844c: 0x4030da20, 0x844d: 0x4030ee20, 0x844e: 0x402e7a20, 0x844f: 0x40310820, - 0x8450: 0x40314820, 0x8451: 0x40315020, 0x8452: 0x40316420, 0x8453: 0x40318020, - 0x8454: 0x4031cc20, 0x8455: 0x4031e820, 0x8456: 0x40320a20, 0x8457: 0x40323220, - 0x8458: 0x40323a20, 0x8459: 0x402c1220, 0x845a: 0x402cf820, 0x845b: 0x402d4c20, - 0x845c: 0x402d7020, 0x845d: 0x402de620, 0x845e: 0x402e1a20, 0x845f: 0x402e2a20, - 0x8460: 0x402f6220, 0x8461: 0x4031fa20, 0x8462: 0x40320220, 0x8463: 0xe0000aca, - 0x8464: 0xe0000adc, 0x8465: 0xe0000ad9, 0x8466: 0xe0000fcc, 0x8467: 0xe0000fcf, - 0x8468: 0xe0000fba, 0x8469: 0xe0000ba1, 0x846a: 0xe0000d11, 0x846b: 0xe0000d18, - 0x846c: 0x40324220, 0x846d: 0x40324a20, 0x846e: 0x40309020, 0x846f: 0x40309820, - 0x8470: 0x002d6894, 0x8471: 0x002d8094, 0x8472: 0x002dcc94, 0x8473: 0x002f7a94, - 0x8474: 0x002f9894, 0x8475: 0x002fac94, 0x8476: 0x002fd894, 0x8477: 0x0030e294, - 0x8478: 0x00310094, 0x8479: 0x40064020, 0x847a: 0x40064420, 0x847b: 0x402d9620, - 0x847c: 0x4031de20, 0x847d: 0x402d9820, 0x847e: 0x4031e220, 0x847f: 0x4031f020, - // Block 0x212, offset 0x8480 - 0x8480: 0xae603502, 0x8481: 0xae603202, 0x8482: 0xae604202, 0x8483: 0xae604e02, - 0x8484: 0xae605b02, 0x8485: 0xae606302, 0x8486: 0xae603702, 0x8487: 0xae605202, - 0x8488: 0xae604702, 0x8489: 0xae606402, 0x848a: 0xae604302, 0x848b: 0xae604d02, - 0x848c: 0xae604102, 0x848d: 0xae605f02, 0x848e: 0xae605f02, 0x848f: 0xae606502, - 0x8490: 0xae606602, 0x8491: 0xae606702, 0x8492: 0xae605f02, 0x8493: 0xae602202, - 0x8494: 0xae602a02, 0x8495: 0xae805f02, 0x8496: 0xadc06002, 0x8497: 0xadc06002, - 0x8498: 0xadc06002, 0x8499: 0xadc06002, 0x849a: 0xae805f02, 0x849b: 0xad806802, - 0x849c: 0xadc06002, 0x849d: 0xadc06002, 0x849e: 0xadc06002, 0x849f: 0xadc06002, - 0x84a0: 0xadc06002, 0x84a1: 0xaca06e02, 0x84a2: 0xaca06f02, 0x84a3: 0xadc07002, - 0x84a4: 0xadc07502, 0x84a5: 0xadc07602, 0x84a6: 0xadc07702, 0x84a7: 0xaca05602, - 0x84a8: 0xaca05902, 0x84a9: 0xadc06002, 0x84aa: 0xadc06002, 0x84ab: 0xadc06002, - 0x84ac: 0xadc06002, 0x84ad: 0xadc07802, 0x84ae: 0xadc07902, 0x84af: 0xadc06002, - 0x84b0: 0xadc07a02, 0x84b1: 0xadc07b02, 0x84b2: 0xadc02102, 0x84b3: 0xadc06002, - 0x84b4: 0xa0107c02, 0x84b5: 0xa0107d02, 0x84b6: 0xa0106102, 0x84b7: 0xa0106102, - 0x84b8: 0xa0105402, 0x84b9: 0xadc07e02, 0x84ba: 0xadc06002, 0x84bb: 0xadc06002, - 0x84bc: 0xadc06002, 0x84bd: 0xae605f02, 0x84be: 0xae605f02, 0x84bf: 0xae605f02, - // Block 0x213, offset 0x84c0 - 0x84c0: 0xe00010d2, 0x84c1: 0xe00010cf, 0x84c2: 0xe00010cc, 0x84c3: 0xe00010c9, - 0x84c4: 0xe00010e1, 0x84c5: 0xe00010de, 0x84c6: 0xe00010e7, 0x84c7: 0xe00010e4, - 0x84c8: 0xe00010ed, 0x84c9: 0xe00010ea, 0x84ca: 0xe0002912, 0x84cb: 0xe000290f, - 0x84cc: 0xe000290c, 0x84cd: 0xe0002909, 0x84ce: 0xe0001123, 0x84cf: 0xe0001120, - 0x84d0: 0xe0002b99, 0x84d1: 0xe0002b96, 0x84d2: 0xe0001153, 0x84d3: 0xe0001150, - 0x84d4: 0xe0001159, 0x84d5: 0xe0001156, 0x84d6: 0xe0000c15, 0x84d7: 0xe0000f8d, - 0x84d8: 0xe00010db, 0x84d9: 0xe0001111, 0x84da: 0xf0000404, 0x84db: 0xe0000f70, - 0x84dc: 0x40300420, 0x84dd: 0x40300620, 0x84de: 0xe0000f7f, 0x84df: 0x402c9620, - 0x84e0: 0xe000099b, 0x84e1: 0xe0000998, 0x84e2: 0xe0000989, 0x84e3: 0xe0000986, - 0x84e4: 0xe0002ae0, 0x84e5: 0xe0002adc, 0x84e6: 0xe0002ae8, 0x84e7: 0xe0002ae4, - 0x84e8: 0xe0002af8, 0x84e9: 0xe0002af4, 0x84ea: 0xe0002af0, 0x84eb: 0xe0002aec, - 0x84ec: 0xe0002b00, 0x84ed: 0xe0002afc, 0x84ee: 0xe0000902, 0x84ef: 0xe00008fe, - 0x84f0: 0xe000090a, 0x84f1: 0xe0000906, 0x84f2: 0xe000091a, 0x84f3: 0xe0000916, - 0x84f4: 0xe0000912, 0x84f5: 0xe000090e, 0x84f6: 0xe00009a2, 0x84f7: 0xe000099e, - 0x84f8: 0xe0000b6e, 0x84f9: 0xe0000b6b, 0x84fa: 0xe0000b5c, 0x84fb: 0xe0000b59, - 0x84fc: 0xe0000b26, 0x84fd: 0xe0000b23, 0x84fe: 0xe0002b14, 0x84ff: 0xe0002b10, - // Block 0x214, offset 0x8500 - 0x8500: 0xe0002b1c, 0x8501: 0xe0002b18, 0x8502: 0xe0002b2c, 0x8503: 0xe0002b28, - 0x8504: 0xe0002b24, 0x8505: 0xe0002b20, 0x8506: 0xe0002b34, 0x8507: 0xe0002b30, - 0x8508: 0xe0000c66, 0x8509: 0xe0000c63, 0x850a: 0xe0000c78, 0x850b: 0xe0000c75, - 0x850c: 0xe0000e84, 0x850d: 0xe0000e81, 0x850e: 0xe0000e44, 0x850f: 0xe0000e41, - 0x8510: 0xe0002b5a, 0x8511: 0xe0002b56, 0x8512: 0xe0002b62, 0x8513: 0xe0002b5e, - 0x8514: 0xe0002b72, 0x8515: 0xe0002b6e, 0x8516: 0xe0002b6a, 0x8517: 0xe0002b66, - 0x8518: 0xe0002b7a, 0x8519: 0xe0002b76, 0x851a: 0xe0000e5d, 0x851b: 0xe0000e59, - 0x851c: 0xe0000e65, 0x851d: 0xe0000e61, 0x851e: 0xe0000e75, 0x851f: 0xe0000e71, - 0x8520: 0xe0000e6d, 0x8521: 0xe0000e69, 0x8522: 0xe0000e7d, 0x8523: 0xe0000e79, - 0x8524: 0xe000108d, 0x8525: 0xe000108a, 0x8526: 0xe000104d, 0x8527: 0xe000104a, - 0x8528: 0xe0001066, 0x8529: 0xe0001062, 0x852a: 0xe000106e, 0x852b: 0xe000106a, - 0x852c: 0xe000107e, 0x852d: 0xe000107a, 0x852e: 0xe0001076, 0x852f: 0xe0001072, - 0x8530: 0xe0001086, 0x8531: 0xe0001082, 0x8532: 0xe0001108, 0x8533: 0xe0001105, - 0x8534: 0xe0001135, 0x8535: 0xe0001132, 0x8536: 0xe000112f, 0x8537: 0xe000112c, - 0x8538: 0xe000111d, 0x8539: 0xe000111a, 0x853a: 0xe0000d0a, 0x853b: 0xe0000d07, - 0x853c: 0x0030d888, 0x853d: 0x4030d820, 0x853e: 0x00312088, 0x853f: 0x40312020, - // Block 0x215, offset 0x8540 - 0x8540: 0x00093685, 0x8541: 0x40083620, 0x8542: 0x40083820, 0x8543: 0x40083a20, - 0x8544: 0x40083c20, 0x8545: 0x002c628b, 0x8546: 0x002c6285, 0x8547: 0x002c9885, - 0x8548: 0x002d9a85, 0x8549: 0x002dcc85, 0x854a: 0x40083e20, 0x854b: 0x400a6e20, - 0x854c: 0x40084020, 0x854d: 0xe00009c4, 0x854e: 0x402d1e20, 0x854f: 0x40084220, - 0x8550: 0xe00002cb, 0x8551: 0xe00002d3, 0x8552: 0xe00002b2, 0x8553: 0xe00002bb, - 0x8554: 0xe00003cd, 0x8555: 0xe00002c3, 0x8556: 0xe00003d1, 0x8557: 0xe00004ab, - 0x8558: 0xe0000579, 0x8559: 0xe00002c7, 0x855a: 0xe0000640, 0x855b: 0xe00002cf, - 0x855c: 0xe00004af, 0x855d: 0xe0000644, 0x855e: 0xe0000798, 0x855f: 0xf0001e1e, - 0x8560: 0x002d9a8a, 0x8561: 0xf0001f0a, 0x8562: 0xf0000a0a, 0x8563: 0xf0001f0a, - 0x8564: 0x0030be8a, 0x8565: 0xf0001f0a, 0x8566: 0xf0000a0a, 0x8567: 0xe00010bb, - 0x8568: 0xe00027f4, 0x8569: 0x0030f68a, 0x856a: 0xe0002883, 0x856b: 0xe000288a, - 0x856c: 0x002e228a, 0x856d: 0x002c3a8a, 0x856e: 0x002c628a, 0x856f: 0x002e828a, - 0x8570: 0x002d9a84, 0x8571: 0xf0001f04, 0x8572: 0xf0000404, 0x8573: 0xf0001f04, - 0x8574: 0x0030be84, 0x8575: 0xf0001f04, 0x8576: 0xf0000404, 0x8577: 0xe00010b6, - 0x8578: 0xe00027f1, 0x8579: 0x0030f684, 0x857a: 0xe0002880, 0x857b: 0xe0002886, - 0x857c: 0x002e2284, 0x857d: 0x002c3a84, 0x857e: 0x002c6284, 0x857f: 0x002e8284, - // Block 0x216, offset 0x8580 - 0x8580: 0xe0000024, 0x8581: 0xe0000029, 0x8582: 0xe000002e, 0x8583: 0xe0000033, - 0x8584: 0xe0000038, 0x8585: 0xe000003d, 0x8586: 0xe0000042, 0x8587: 0xe0000047, - 0x8588: 0xf0001f04, 0x8589: 0xf0001f04, 0x858a: 0xf0001f04, 0x858b: 0xf0001f04, - 0x858c: 0xf0001f04, 0x858d: 0xf0001f04, 0x858e: 0xf0001f04, 0x858f: 0xf0001f04, - 0x8590: 0xf0001f04, 0x8591: 0xf0000404, 0x8592: 0xf0000404, 0x8593: 0xf0000404, - 0x8594: 0xf0000404, 0x8595: 0xf0000404, 0x8596: 0xf0000404, 0x8597: 0xf0000404, - 0x8598: 0xf0000404, 0x8599: 0xf0000404, 0x859a: 0xf0000404, 0x859b: 0xf0000404, - 0x859c: 0xf0000404, 0x859d: 0xf0000404, 0x859e: 0xf0000404, 0x859f: 0xf0000404, - 0x85a0: 0xf0000404, 0x85a1: 0xf0000404, 0x85a2: 0xf0000404, 0x85a3: 0xf0000404, - 0x85a4: 0xf0000404, 0x85a5: 0xf0000404, 0x85a6: 0xf0000404, 0x85a7: 0xf0000404, - 0x85a8: 0xf0000404, 0x85a9: 0xf0000404, 0x85aa: 0xf0000404, 0x85ab: 0xf0000404, - 0x85ac: 0xf0000404, 0x85ad: 0xf0000404, 0x85ae: 0xf0000404, 0x85af: 0xf0000404, - 0x85b0: 0xf0000404, 0x85b1: 0xf0000404, 0x85b2: 0xf0000404, 0x85b3: 0xe00024e7, - 0x85b4: 0xf0000404, 0x85b5: 0xf0000404, 0x85b6: 0x002bde8c, 0x85b7: 0x002c0a8c, - 0x85b8: 0x002c3a8c, 0x85b9: 0x002c628c, 0x85ba: 0x002c988c, 0x85bb: 0x002d088c, - 0x85bc: 0x002d228c, 0x85bd: 0x002d688c, 0x85be: 0x002d9a8c, 0x85bf: 0x002dcc8c, - // Block 0x217, offset 0x85c0 - 0x85c0: 0xf0001d1c, 0x85c1: 0xf0001d1d, 0x85c2: 0xe00009b7, 0x85c3: 0xf0001c1d, - 0x85c4: 0xf0001c1c, 0x85c5: 0xf0001c1c, 0x85c6: 0xe0000a66, 0x85c7: 0xe0000a7a, - 0x85c8: 0xf0001d1c, 0x85c9: 0xf0001c1d, 0x85ca: 0xf0001c1c, 0x85cb: 0xf0001d1d, - 0x85cc: 0xf0001c1c, 0x85cd: 0xf0001d1d, 0x85ce: 0xf0001d1d, 0x85cf: 0xf0001c1c, - 0x85d0: 0xf0001c1c, 0x85d1: 0xf0001c1c, 0x85d2: 0xe0000d0d, 0x85d3: 0xe0002818, - 0x85d4: 0xf0001c1c, 0x85d5: 0xe0000d3a, 0x85d6: 0xe0000d46, 0x85d7: 0xf0001d1d, - 0x85d8: 0xe0000eb0, 0x85d9: 0xe0000eb8, 0x85da: 0xf0001d1d, 0x85db: 0xf0001c1c, - 0x85dc: 0xf0001c1d, 0x85dd: 0xf0001c1d, 0x85de: 0xe00010b2, 0x85df: 0xe00009c8, - 0x85e0: 0xf0001f04, 0x85e1: 0xf0001f04, 0x85e2: 0xf0001f04, 0x85e3: 0xf0001f04, - 0x85e4: 0xf0001f04, 0x85e5: 0xf0001f04, 0x85e6: 0xf0001f04, 0x85e7: 0xf0001f04, - 0x85e8: 0xf0001f04, 0x85e9: 0xf0000404, 0x85ea: 0xf0000404, 0x85eb: 0xf0000404, - 0x85ec: 0xf0000404, 0x85ed: 0xf0000404, 0x85ee: 0xf0000404, 0x85ef: 0xf0000404, - 0x85f0: 0xf0000404, 0x85f1: 0xf0000404, 0x85f2: 0xf0000404, 0x85f3: 0xf0000404, - 0x85f4: 0xf0000404, 0x85f5: 0xf0000404, 0x85f6: 0xf0000404, 0x85f7: 0xf0000404, - 0x85f8: 0xf0000404, 0x85f9: 0xf0000404, 0x85fa: 0xf0000404, 0x85fb: 0xf0000404, - 0x85fc: 0xf0000404, 0x85fd: 0xf0000404, 0x85fe: 0xf0000404, 0x85ff: 0xe0000bdf, - // Block 0x218, offset 0x8600 - 0x8600: 0xf0001f04, 0x8601: 0xf0001f04, 0x8602: 0xf0001f04, 0x8603: 0xf0001f04, - 0x8604: 0xf0001f04, 0x8605: 0xf0001f04, 0x8606: 0xf0001f04, 0x8607: 0xf0001f04, - 0x8608: 0xf0001f04, 0x8609: 0xf0001f04, 0x860a: 0xf0001f04, - 0x8610: 0xf0000a04, 0x8611: 0xf0000a04, 0x8612: 0xf0000a04, 0x8613: 0xf0000a04, - 0x8614: 0xf0000a04, 0x8615: 0xf0000a04, 0x8616: 0xf0000a04, 0x8617: 0xf0000a04, - 0x8618: 0xf0000a04, 0x8619: 0xf0000a04, 0x861a: 0xf0000a04, 0x861b: 0xf0000a04, - 0x861c: 0xf0000a04, 0x861d: 0xf0000a04, 0x861e: 0xf0000a04, 0x861f: 0xf0000a04, - 0x8620: 0xf0000a04, 0x8621: 0xf0000a04, 0x8622: 0xf0000a04, 0x8623: 0xf0000a04, - 0x8624: 0xf0000a04, 0x8625: 0xf0000a04, 0x8626: 0xf0000a04, 0x8627: 0xe00024eb, - 0x8628: 0xf0000a04, 0x8629: 0xf0000a04, 0x862a: 0xf0000a04, 0x862b: 0x002c3a8c, - 0x862c: 0x002f7a8c, 0x862d: 0xf0000c0c, 0x862e: 0xf0000c0c, - 0x8630: 0x002bde9d, 0x8631: 0x002c0a9d, 0x8632: 0x002c3a9d, 0x8633: 0x002c629d, - 0x8634: 0x002c989d, 0x8635: 0x002d089d, 0x8636: 0x002d229d, 0x8637: 0x002d689d, - 0x8638: 0x002d9a9d, 0x8639: 0x002dcc9d, 0x863a: 0x002dfe9d, 0x863b: 0x002e229d, - 0x863c: 0x002e829d, 0x863d: 0x002e9e9d, 0x863e: 0x002ee29d, 0x863f: 0x002f2c9d, - // Block 0x219, offset 0x8640 - 0x8640: 0xa0000000, 0x8641: 0xa0000000, 0x8642: 0xa0000000, 0x8643: 0xa0000000, - 0x8644: 0xa0000000, 0x8645: 0xa0000000, 0x8646: 0xa0000000, 0x8647: 0xa0000000, - 0x8648: 0xa0000000, 0x8649: 0x40020020, 0x864a: 0x40020220, 0x864b: 0x40020420, - 0x864c: 0x40020620, 0x864d: 0x40020820, 0x864e: 0xa0000000, 0x864f: 0xa0000000, - 0x8650: 0xa0000000, 0x8651: 0xa0000000, 0x8652: 0xa0000000, 0x8653: 0xa0000000, - 0x8654: 0xa0000000, 0x8655: 0xa0000000, 0x8656: 0xa0000000, 0x8657: 0xa0000000, - 0x8658: 0xa0000000, 0x8659: 0xa0000000, 0x865a: 0xa0000000, 0x865b: 0xa0000000, - 0x865c: 0xa0000000, 0x865d: 0xa0000000, 0x865e: 0xa0000000, 0x865f: 0xa0000000, - 0x8660: 0x402be020, 0x8661: 0x402be220, 0x8662: 0x402be420, 0x8663: 0x402be620, - 0x8664: 0x402be820, 0x8665: 0x402bea20, 0x8666: 0x402bec20, 0x8667: 0x402bee20, - 0x8668: 0x402bf020, 0x8669: 0x402bf220, 0x866a: 0x402bf420, 0x866b: 0x402bf620, - 0x866c: 0x402bf820, 0x866d: 0x402bfa20, 0x866e: 0x402bfc20, 0x866f: 0x402bfe20, - 0x8670: 0x402c0020, 0x8671: 0x402c0220, 0x8672: 0x402c0420, 0x8673: 0x402c0620, - 0x8674: 0x402c0820, 0x8675: 0x402c0a20, 0x8676: 0x402c0c20, 0x8677: 0x402c0e20, - 0x8678: 0x402c1020, 0x8679: 0x402c1220, 0x867a: 0x402c1420, 0x867b: 0x402c1620, - 0x867c: 0x402c1820, 0x867d: 0x402c1a20, 0x867e: 0x402c1c20, 0x867f: 0x402c1e20, - // Block 0x21a, offset 0x8680 - 0x8680: 0x402c2020, 0x8681: 0x402c2220, 0x8682: 0x402c2420, 0x8683: 0x402c2620, - 0x8684: 0x402c2820, 0x8685: 0x402c2a20, 0x8686: 0x402c2c20, 0x8687: 0x402c2e20, - 0x8688: 0x402c3020, 0x8689: 0x402c3220, 0x868a: 0x402c3420, 0x868b: 0x402c3620, - 0x868c: 0xc53b0002, 0x868d: 0x402c3a20, 0x868e: 0x402c3c20, 0x868f: 0x402c3e20, - 0x8690: 0x402c4020, 0x8691: 0x402c4220, 0x8692: 0x402c4420, 0x8693: 0x402c4620, - 0x8694: 0x402c4820, 0x8695: 0x402c4a20, 0x8696: 0x402c4c20, 0x8697: 0x402c4e20, - 0x8698: 0x402c5020, 0x8699: 0x402c5220, 0x869a: 0x402c5420, 0x869b: 0x402c5620, - 0x869c: 0x402c5820, 0x869d: 0x402c5a20, 0x869e: 0x402c5c20, 0x869f: 0x402c5e20, - 0x86a0: 0x402c6020, 0x86a1: 0x402c6220, 0x86a2: 0x402c6420, 0x86a3: 0x402c6620, - 0x86a4: 0x402c6820, 0x86a5: 0x402c6a20, 0x86a6: 0x402c6c20, 0x86a7: 0x402c6e20, - 0x86a8: 0x402c7020, 0x86a9: 0x402c7220, 0x86aa: 0x402c7420, 0x86ab: 0x402c7620, - 0x86ac: 0xc5380002, 0x86ad: 0x402c7a20, 0x86ae: 0x402c7c20, 0x86af: 0x402c7e20, - 0x86b0: 0x402c8020, 0x86b1: 0x402c8220, 0x86b2: 0x402c8420, 0x86b3: 0x402c8620, - 0x86b4: 0x402c8820, 0x86b5: 0x402c8a20, 0x86b6: 0x402c8c20, 0x86b7: 0x402c8e20, - 0x86b8: 0x402c9020, 0x86b9: 0x402c9220, 0x86ba: 0x402c9420, 0x86bb: 0x402c9620, - 0x86bc: 0x402c9820, 0x86bd: 0x402c9a20, 0x86be: 0x402c9c20, 0x86bf: 0x402c9e20, - // Block 0x21b, offset 0x86c0 - 0x86c0: 0xe0002f1f, 0x86c1: 0xe0002f1c, 0x86c2: 0xe0002f35, 0x86c3: 0xe0002f59, - 0x86c4: 0xe0002f52, 0x86c5: 0xe0002f4b, 0x86c6: 0xe00009dd, 0x86c7: 0xe0002f95, - 0x86c8: 0xe0002fb1, 0x86c9: 0xe0002fae, 0x86ca: 0xe0002fb7, 0x86cb: 0xe0002fcd, - 0x86cc: 0xe0003031, 0x86cd: 0xe000302e, 0x86ce: 0xe0003037, 0x86cf: 0xe000303d, - 0x86d0: 0xe0000ab3, 0x86d1: 0xe00030a5, 0x86d2: 0xe00030ba, 0x86d3: 0xe00030b7, - 0x86d4: 0xe00030c0, 0x86d5: 0xe00030e0, 0x86d6: 0xe00030d6, 0x86d7: 0x40093e20, - 0x86d8: 0xe0000e12, 0x86d9: 0xe000318a, 0x86da: 0xe0003187, 0x86db: 0xe0003190, - 0x86dc: 0xe0003199, 0x86dd: 0xe000320a, 0x86de: 0x00318888, 0x86df: 0xe0000f7b, - 0x86e0: 0xe000323a, 0x86e1: 0xe0003237, 0x86e2: 0xe0003250, 0x86e3: 0xe0003274, - 0x86e4: 0xe000326d, 0x86e5: 0xe0003266, 0x86e6: 0xe00009d5, 0x86e7: 0xe00032c8, - 0x86e8: 0xe00032e4, 0x86e9: 0xe00032e1, 0x86ea: 0xe00032ea, 0x86eb: 0xe0003300, - 0x86ec: 0xe0003367, 0x86ed: 0xe0003364, 0x86ee: 0xe000336d, 0x86ef: 0xe0003373, - 0x86f0: 0xe0000aad, 0x86f1: 0xe00033cf, 0x86f2: 0xe00033e4, 0x86f3: 0xe00033e1, - 0x86f4: 0xe00033ea, 0x86f5: 0xe000340a, 0x86f6: 0xe0003400, 0x86f7: 0x40093c20, - 0x86f8: 0xe0000e0f, 0x86f9: 0xe00034b7, 0x86fa: 0xe00034b4, 0x86fb: 0xe00034bd, - 0x86fc: 0xe00034c6, 0x86fd: 0xe000353a, 0x86fe: 0x40318820, 0x86ff: 0xe0003546, - // Block 0x21c, offset 0x8700 - 0x8700: 0xe0002f66, 0x8701: 0xe0003281, 0x8702: 0xe0002f22, 0x8703: 0xe000323d, - 0x8704: 0xe0002f63, 0x8705: 0xe000327e, 0x8706: 0xe0002f89, 0x8707: 0xe00032bc, - 0x8708: 0xe0002f8c, 0x8709: 0xe00032bf, 0x870a: 0xe0002f92, 0x870b: 0xe00032c5, - 0x870c: 0xe0002f8f, 0x870d: 0xe00032c2, 0x870e: 0xe0002f9c, 0x870f: 0xe00032cf, - 0x8710: 0xe0000aaa, 0x8711: 0xe0000aa7, 0x8712: 0xe0002fe0, 0x8713: 0xe0003313, - 0x8714: 0xe0002fb4, 0x8715: 0xe00032e7, 0x8716: 0xe0002fd3, 0x8717: 0xe0003306, - 0x8718: 0xe0002fdd, 0x8719: 0xe0003310, 0x871a: 0xe0002fca, 0x871b: 0xe00032fd, - 0x871c: 0xe000300a, 0x871d: 0xe000333d, 0x871e: 0xe0003007, 0x871f: 0xe000333a, - 0x8720: 0xe0003010, 0x8721: 0xe0003343, 0x8722: 0xe0003013, 0x8723: 0xe0003346, - 0x8724: 0xe0003019, 0x8725: 0xe000334c, 0x8726: 0xe0000c1b, 0x8727: 0xe0000c18, - 0x8728: 0xe0003044, 0x8729: 0xe000337a, 0x872a: 0xe000304d, 0x872b: 0xe0003380, - 0x872c: 0xe0003034, 0x872d: 0xe000336a, 0x872e: 0xe000304a, 0x872f: 0xe000337d, - 0x8730: 0xe0003047, 0x8731: 0x402da220, 0x8732: 0xe00027e2, 0x8733: 0xe00027df, - 0x8734: 0xe000305f, 0x8735: 0xe0003392, 0x8736: 0xe0003068, 0x8737: 0xe000339e, - 0x8738: 0x402f7220, 0x8739: 0xe0003071, 0x873a: 0xe00033a7, 0x873b: 0xe0003077, - 0x873c: 0xe00033ad, 0x873d: 0xe0003074, 0x873e: 0xe00033aa, 0x873f: 0xe0000d04, - // Block 0x21d, offset 0x8740 - 0x8740: 0xe0000cfe, 0x8741: 0xe0000cf8, 0x8742: 0xe0000cf5, 0x8743: 0xe000309c, - 0x8744: 0xe00033c6, 0x8745: 0xe00030ab, 0x8746: 0xe00033d5, 0x8747: 0xe00030a2, - 0x8748: 0xe00033cc, 0x8749: 0xe00035eb, 0x874a: 0x002eda88, 0x874b: 0x402eda20, - 0x874c: 0xe00030fd, 0x874d: 0xe0003427, 0x874e: 0xe00030bd, 0x874f: 0xe00033e7, - 0x8750: 0xe00030dd, 0x8751: 0xe0003407, 0x8752: 0xe0000e93, 0x8753: 0xe0000e8f, - 0x8754: 0xe0003135, 0x8755: 0xe000345f, 0x8756: 0xe000313e, 0x8757: 0xe0003468, - 0x8758: 0xe0003138, 0x8759: 0xe0003462, 0x875a: 0xe0003151, 0x875b: 0xe000347b, - 0x875c: 0xe0003158, 0x875d: 0xe0003482, 0x875e: 0xe0003165, 0x875f: 0xe000348f, - 0x8760: 0xe000315b, 0x8761: 0xe0003485, 0x8762: 0xe0003178, 0x8763: 0xe00034a5, - 0x8764: 0xe0003172, 0x8765: 0xe000349c, 0x8766: 0x00303688, 0x8767: 0x40303620, - 0x8768: 0xe00031af, 0x8769: 0xe00034dc, 0x876a: 0xe00031b9, 0x876b: 0xe00034e6, - 0x876c: 0xe000318d, 0x876d: 0xe00034ba, 0x876e: 0xe0003196, 0x876f: 0xe00034c3, - 0x8770: 0xe00031ac, 0x8771: 0xe00034d9, 0x8772: 0xe00031b6, 0x8773: 0xe00034e3, - 0x8774: 0xe00031f8, 0x8775: 0xe0003525, 0x8776: 0xe0003210, 0x8777: 0xe0003540, - 0x8778: 0xe0003213, 0x8779: 0xe0003225, 0x877a: 0xe0003558, 0x877b: 0xe000322e, - 0x877c: 0xe0003561, 0x877d: 0xe000322b, 0x877e: 0xe000355e, 0x877f: 0xe0000f64, - // Block 0x21e, offset 0x8780 - 0x8780: 0x402c1a20, 0x8781: 0x002c2a88, 0x8782: 0x002c3288, 0x8783: 0x402c3220, - 0x8784: 0x0031c488, 0x8785: 0x4031c420, 0x8786: 0x002efa88, 0x8787: 0x002c4e88, - 0x8788: 0x402c4e20, 0x8789: 0x002c7288, 0x878a: 0x002c7a88, 0x878b: 0x002c8488, - 0x878c: 0x402c8420, 0x878d: 0xe000115c, 0x878e: 0x002cae88, 0x878f: 0x002cb888, - 0x8790: 0x002cc288, 0x8791: 0x002d1688, 0x8792: 0x402d1620, 0x8793: 0x002d4488, - 0x8794: 0x002d5888, 0x8795: 0x402d7820, 0x8796: 0x002dc288, 0x8797: 0x002db688, - 0x8798: 0x002e0a88, 0x8799: 0x402e0a20, 0x879a: 0x402e3820, 0x879b: 0x402e7220, - 0x879c: 0x0030a088, 0x879d: 0x002eb488, 0x879e: 0x402ebc20, 0x879f: 0x002f1088, - 0x87a0: 0xe0003111, 0x87a1: 0xe000343b, 0x87a2: 0x002d6088, 0x87a3: 0x402d6020, - 0x87a4: 0x002f3e88, 0x87a5: 0x402f3e20, 0x87a6: 0x002f8288, 0x87a7: 0x0031b488, - 0x87a8: 0x4031b420, 0x87a9: 0x00300888, 0x87aa: 0x40301220, 0x87ab: 0x40304220, - 0x87ac: 0x00304a88, 0x87ad: 0x40304a20, 0x87ae: 0x00305288, 0x87af: 0xe00031c9, - 0x87b0: 0xe00034f6, 0x87b1: 0x0030b488, 0x87b2: 0x0030cc88, 0x87b3: 0x00311888, - 0x87b4: 0x40311820, 0x87b5: 0x00313488, 0x87b6: 0x40313420, 0x87b7: 0x00316488, - 0x87b8: 0x00316e88, 0x87b9: 0x40316e20, 0x87ba: 0x40317820, 0x87bb: 0x4031a620, - 0x87bc: 0x0031bc88, 0x87bd: 0x4031bc20, 0x87be: 0xe0000fc9, 0x87bf: 0x40319420, - // Block 0x21f, offset 0x87c0 - 0x87c0: 0x40321220, 0x87c1: 0x40321a20, 0x87c2: 0x40322220, 0x87c3: 0x40322a20, - 0x87c4: 0xe0000ad5, 0x87c5: 0xe0000ad1, 0x87c6: 0xe0000acd, 0x87c7: 0xe000357f, - 0x87c8: 0xe000357c, 0x87c9: 0xe0003579, 0x87ca: 0xe00035c4, 0x87cb: 0xe00035c1, - 0x87cc: 0xe00035be, 0x87cd: 0xe0002f48, 0x87ce: 0xe0003263, 0x87cf: 0xe000303a, - 0x87d0: 0xe0003370, 0x87d1: 0xe00030d3, 0x87d2: 0xe00033fd, 0x87d3: 0xe0003193, - 0x87d4: 0xe00034c0, 0x87d5: 0xe00031a8, 0x87d6: 0xe00034d5, 0x87d7: 0xe000319c, - 0x87d8: 0xe00034c9, 0x87d9: 0xe00031a4, 0x87da: 0xe00034d1, 0x87db: 0xe00031a0, - 0x87dc: 0xe00034cd, 0x87dd: 0x402cae20, 0x87de: 0xe0002f55, 0x87df: 0xe0003270, - 0x87e0: 0xe0002f5f, 0x87e1: 0xe000327a, 0x87e2: 0xe00009f4, 0x87e3: 0xe00009ef, - 0x87e4: 0x002d3a88, 0x87e5: 0x402d3a20, 0x87e6: 0xe000300d, 0x87e7: 0xe0003340, - 0x87e8: 0xe0003065, 0x87e9: 0xe000339b, 0x87ea: 0xe00030f6, 0x87eb: 0xe0003420, - 0x87ec: 0xe00030f9, 0x87ed: 0xe0003423, 0x87ee: 0xe0001162, 0x87ef: 0xe000115f, - 0x87f0: 0xe0003395, 0x87f1: 0xe00032b0, 0x87f2: 0xe00032ad, 0x87f3: 0xe00032aa, - 0x87f4: 0xe0003004, 0x87f5: 0xe0003337, 0x87f6: 0x002d7888, 0x87f7: 0x00319488, - 0x87f8: 0xe000309f, 0x87f9: 0xe00033c9, 0x87fa: 0xe0002f4e, 0x87fb: 0xe0003269, - 0x87fc: 0xe00009ea, 0x87fd: 0xe00009e5, 0x87fe: 0xe0000e19, 0x87ff: 0xe0000e15, - // Block 0x220, offset 0x8800 - 0x8800: 0xe0002f6c, 0x8801: 0xe0003287, 0x8802: 0xe0002f6f, 0x8803: 0xe000328a, - 0x8804: 0xe0002fee, 0x8805: 0xe0003321, 0x8806: 0xe0002ff1, 0x8807: 0xe0003324, - 0x8808: 0xe0003053, 0x8809: 0xe0003386, 0x880a: 0xe0003056, 0x880b: 0xe0003389, - 0x880c: 0xe000310b, 0x880d: 0xe0003435, 0x880e: 0xe000310e, 0x880f: 0xe0003438, - 0x8810: 0xe0003141, 0x8811: 0xe000346b, 0x8812: 0xe0003144, 0x8813: 0xe000346e, - 0x8814: 0xe00031c3, 0x8815: 0xe00034f0, 0x8816: 0xe00031c6, 0x8817: 0xe00034f3, - 0x8818: 0xe000316f, 0x8819: 0xe0003499, 0x881a: 0xe000317e, 0x881b: 0xe00034ab, - 0x881c: 0x00312288, 0x881d: 0x40312220, 0x881e: 0xe000301c, 0x881f: 0xe000334f, - 0x8820: 0x002ebc88, 0x8821: 0x402c8c20, 0x8822: 0x002f2288, 0x8823: 0x402f2220, - 0x8824: 0x00314088, 0x8825: 0x40314020, 0x8826: 0xe0002f5c, 0x8827: 0xe0003277, - 0x8828: 0xe0002fd6, 0x8829: 0xe0003309, 0x882a: 0xe00030d9, 0x882b: 0xe0003403, - 0x882c: 0xe00030eb, 0x882d: 0xe0003415, 0x882e: 0xe00030ef, 0x882f: 0xe0003419, - 0x8830: 0xe00030f2, 0x8831: 0xe000341c, 0x8832: 0xe000321c, 0x8833: 0xe000354f, - 0x8834: 0x402e5e20, 0x8835: 0x402ed020, 0x8836: 0x40305a20, 0x8837: 0x402dd420, - 0x8838: 0xe0000abf, 0x8839: 0xe0000ec4, 0x883a: 0x002be888, 0x883b: 0x002c4488, - 0x883c: 0x402c4420, 0x883d: 0x002e3888, 0x883e: 0x00303e88, 0x883f: 0x402ffc20, - // Block 0x221, offset 0x8840 - 0x8840: 0xae603502, 0x8841: 0xae603202, 0x8842: 0xae604502, 0x8843: 0xae602202, - 0x8844: 0xe0000000, 0x8845: 0xaf007f02, 0x8846: 0xae605f02, 0x8847: 0xadc06002, - 0x8848: 0xadc06002, 0x8849: 0xadc06002, 0x884a: 0xae605f02, 0x884b: 0xae605f02, - 0x884c: 0xae605f02, 0x884d: 0xadc06002, 0x884e: 0xadc06002, 0x884f: 0xa0000000, - 0x8850: 0xae605f02, 0x8851: 0xae605f02, 0x8852: 0xae605f02, 0x8853: 0xadc06002, - 0x8854: 0xadc06002, 0x8855: 0xadc06002, 0x8856: 0xadc06002, 0x8857: 0xae605f02, - 0x8858: 0xae808002, 0x8859: 0xadc06002, 0x885a: 0xadc06002, 0x885b: 0xae605f02, - 0x885c: 0xae906002, 0x885d: 0xaea05f02, 0x885e: 0xaea05f02, 0x885f: 0xae906002, - 0x8860: 0xaea08102, 0x8861: 0xaea08202, 0x8862: 0xae906002, 0x8863: 0x84e615ef, - 0x8864: 0x84e6164c, 0x8865: 0x84e616cd, 0x8866: 0x84e61771, 0x8867: 0x84e61836, - 0x8868: 0x84e6161d, 0x8869: 0x84e61631, 0x886a: 0x84e616b4, 0x886b: 0x84e61741, - 0x886c: 0x84e617bd, 0x886d: 0x84e61816, 0x886e: 0x84e6185f, 0x886f: 0x84e6187b, - 0x8870: 0x00326688, 0x8871: 0x40326620, 0x8872: 0x0032a688, 0x8873: 0x4032a620, - 0x8874: 0x40064020, 0x8875: 0x40064220, 0x8876: 0x00326088, 0x8877: 0x40326020, - 0x887a: 0x00326c84, 0x887b: 0x40329220, - 0x887c: 0x40329020, 0x887d: 0x40329420, 0x887e: 0x402c1620, - // Block 0x222, offset 0x8880 - 0x8880: 0xe0002f7d, 0x8881: 0xe0003298, 0x8882: 0xe0002f80, 0x8883: 0xe00032b3, - 0x8884: 0xe0002f83, 0x8885: 0xe00032b6, 0x8886: 0xe0002f86, 0x8887: 0xe00032b9, - 0x8888: 0xe0002f98, 0x8889: 0xe00032cb, 0x888a: 0xe0002f9f, 0x888b: 0xe00032d2, - 0x888c: 0xe0002fa5, 0x888d: 0xe00032d8, 0x888e: 0xe0002fab, 0x888f: 0xe00032de, - 0x8890: 0xe0002fa2, 0x8891: 0xe00032d5, 0x8892: 0xe0002fa8, 0x8893: 0xe00032db, - 0x8894: 0xe0002fe7, 0x8895: 0xe000331a, 0x8896: 0xe0002fe3, 0x8897: 0xe0003316, - 0x8898: 0xe0002ffb, 0x8899: 0xe000332e, 0x889a: 0xe0002ffe, 0x889b: 0xe0003331, - 0x889c: 0xe0002fd9, 0x889d: 0xe000330c, 0x889e: 0xe0003001, 0x889f: 0xe0003334, - 0x88a0: 0xe0003016, 0x88a1: 0xe0003349, 0x88a2: 0xe0003022, 0x88a3: 0xe0003355, - 0x88a4: 0xe0003028, 0x88a5: 0xe000335b, 0x88a6: 0xe000301f, 0x88a7: 0xe0003352, - 0x88a8: 0xe0003025, 0x88a9: 0xe0003358, 0x88aa: 0xe000302b, 0x88ab: 0xe000335e, - 0x88ac: 0xe000305c, 0x88ad: 0xe000338f, 0x88ae: 0xe0003040, 0x88af: 0xe0003376, - 0x88b0: 0xe0003062, 0x88b1: 0xe0003398, 0x88b2: 0xe000306b, 0x88b3: 0xe00033a1, - 0x88b4: 0xe000306e, 0x88b5: 0xe00033a4, 0x88b6: 0xe000307a, 0x88b7: 0xe00033b0, - 0x88b8: 0xe000307d, 0x88b9: 0xe00033b3, 0x88ba: 0xe0003084, 0x88bb: 0xe00033ba, - 0x88bc: 0xe0003081, 0x88bd: 0xe00033b7, 0x88be: 0xe0003087, 0x88bf: 0xe00033bd, - // Block 0x223, offset 0x88c0 - 0x88c0: 0xe000308a, 0x88c1: 0xe00033c0, 0x88c2: 0xe000308d, 0x88c3: 0xe00033c3, - 0x88c4: 0xe00030a8, 0x88c5: 0xe00033d2, 0x88c6: 0xe00030ae, 0x88c7: 0xe00033d8, - 0x88c8: 0xe00030b4, 0x88c9: 0xe00033de, 0x88ca: 0xe00030b1, 0x88cb: 0xe00033db, - 0x88cc: 0xe00030e3, 0x88cd: 0xe000340d, 0x88ce: 0xe00030e7, 0x88cf: 0xe0003411, - 0x88d0: 0xe0003104, 0x88d1: 0xe000342e, 0x88d2: 0xe0003100, 0x88d3: 0xe000342a, - 0x88d4: 0xe000312f, 0x88d5: 0xe0003459, 0x88d6: 0xe0003132, 0x88d7: 0xe000345c, - 0x88d8: 0xe000313b, 0x88d9: 0xe0003465, 0x88da: 0xe0003147, 0x88db: 0xe0003471, - 0x88dc: 0xe000314a, 0x88dd: 0xe0003474, 0x88de: 0xe000314e, 0x88df: 0xe0003478, - 0x88e0: 0xe0003162, 0x88e1: 0xe000348c, 0x88e2: 0xe0003168, 0x88e3: 0xe0003492, - 0x88e4: 0xe0003154, 0x88e5: 0xe000347e, 0x88e6: 0xe000315e, 0x88e7: 0xe0003488, - 0x88e8: 0xe000316b, 0x88e9: 0xe0003495, 0x88ea: 0xe0003175, 0x88eb: 0xe00034a2, - 0x88ec: 0xe000317b, 0x88ed: 0xe00034a8, 0x88ee: 0xe0003184, 0x88ef: 0xe00034b1, - 0x88f0: 0xe0003181, 0x88f1: 0xe00034ae, 0x88f2: 0xe00031e3, 0x88f3: 0xe0003510, - 0x88f4: 0xe00031e9, 0x88f5: 0xe0003516, 0x88f6: 0xe00031e6, 0x88f7: 0xe0003513, - 0x88f8: 0xe00031b2, 0x88f9: 0xe00034df, 0x88fa: 0xe00031bc, 0x88fb: 0xe00034e9, - 0x88fc: 0xe00031ec, 0x88fd: 0xe0003519, 0x88fe: 0xe00031ef, 0x88ff: 0xe000351c, - // Block 0x224, offset 0x8900 - 0x8900: 0xe00031f5, 0x8901: 0xe0003522, 0x8902: 0xe00031f2, 0x8903: 0xe000351f, - 0x8904: 0xe00031fb, 0x8905: 0xe000352b, 0x8906: 0xe00031fe, 0x8907: 0xe000352e, - 0x8908: 0xe0003201, 0x8909: 0xe0003531, 0x890a: 0xe0003207, 0x890b: 0xe0003537, - 0x890c: 0xe0003204, 0x890d: 0xe0003534, 0x890e: 0xe0003219, 0x890f: 0xe000354c, - 0x8910: 0xe0003228, 0x8911: 0xe000355b, 0x8912: 0xe0003231, 0x8913: 0xe0003564, - 0x8914: 0xe0003234, 0x8915: 0xe0003567, 0x8916: 0xe0003361, 0x8917: 0xe000349f, - 0x8918: 0xe0003528, 0x8919: 0xe0003543, 0x891a: 0xe0002f10, 0x891b: 0xe0000f70, - 0x891c: 0x40300420, 0x891d: 0x40300620, 0x891e: 0xe0000f7f, 0x891f: 0x402c9620, - 0x8920: 0xe0002f72, 0x8921: 0xe000328d, 0x8922: 0xe0002f69, 0x8923: 0xe0003284, - 0x8924: 0xe0002f38, 0x8925: 0xe0003253, 0x8926: 0xe0002f3c, 0x8927: 0xe0003257, - 0x8928: 0xe0002f44, 0x8929: 0xe000325f, 0x892a: 0xe0002f40, 0x892b: 0xe000325b, - 0x892c: 0xe0002f79, 0x892d: 0xe0003294, 0x892e: 0xe0002f25, 0x892f: 0xe0003240, - 0x8930: 0xe0002f29, 0x8931: 0xe0003244, 0x8932: 0xe0002f31, 0x8933: 0xe000324c, - 0x8934: 0xe0002f2d, 0x8935: 0xe0003248, 0x8936: 0xe0002f75, 0x8937: 0xe0003290, - 0x8938: 0xe0002ff4, 0x8939: 0xe0003327, 0x893a: 0xe0002feb, 0x893b: 0xe000331e, - 0x893c: 0xe0002fd0, 0x893d: 0xe0003303, 0x893e: 0xe0002fba, 0x893f: 0xe00032ed, - // Block 0x225, offset 0x8940 - 0x8940: 0xe0002fbe, 0x8941: 0xe00032f1, 0x8942: 0xe0002fc6, 0x8943: 0xe00032f9, - 0x8944: 0xe0002fc2, 0x8945: 0xe00032f5, 0x8946: 0xe0002ff7, 0x8947: 0xe000332a, - 0x8948: 0xe0003050, 0x8949: 0xe0003383, 0x894a: 0xe0003059, 0x894b: 0xe000338c, - 0x894c: 0xe0003128, 0x894d: 0xe0003452, 0x894e: 0xe0003108, 0x894f: 0xe0003432, - 0x8950: 0xe00030c3, 0x8951: 0xe00033ed, 0x8952: 0xe00030c7, 0x8953: 0xe00033f1, - 0x8954: 0xe00030cf, 0x8955: 0xe00033f9, 0x8956: 0xe00030cb, 0x8957: 0xe00033f5, - 0x8958: 0xe000312b, 0x8959: 0xe0003455, 0x895a: 0xe0003114, 0x895b: 0xe000343e, - 0x895c: 0xe0003118, 0x895d: 0xe0003442, 0x895e: 0xe0003120, 0x895f: 0xe000344a, - 0x8960: 0xe000311c, 0x8961: 0xe0003446, 0x8962: 0xe0003124, 0x8963: 0xe000344e, - 0x8964: 0xe00031e0, 0x8965: 0xe000350d, 0x8966: 0xe00031c0, 0x8967: 0xe00034ed, - 0x8968: 0xe00031cc, 0x8969: 0xe00034f9, 0x896a: 0xe00031d0, 0x896b: 0xe00034fd, - 0x896c: 0xe00031d8, 0x896d: 0xe0003505, 0x896e: 0xe00031d4, 0x896f: 0xe0003501, - 0x8970: 0xe00031dc, 0x8971: 0xe0003509, 0x8972: 0xe000320d, 0x8973: 0xe000353d, - 0x8974: 0xe0003222, 0x8975: 0xe0003555, 0x8976: 0xe000321f, 0x8977: 0xe0003552, - 0x8978: 0xe0003216, 0x8979: 0xe0003549, 0x897a: 0xe0000d0a, 0x897b: 0xe0000d07, - 0x897c: 0x0030d888, 0x897d: 0x4030d820, 0x897e: 0x00312088, 0x897f: 0x40312020, - // Block 0x226, offset 0x8980 - 0x8980: 0x40063a20, 0x8981: 0xe00000b1, 0x8982: 0xe00012ea, 0x8983: 0xe00012f5, - 0x8984: 0xe00012e0, 0x8986: 0xe00012ee, 0x8987: 0xe00012f1, - 0x8988: 0xe000124f, 0x8989: 0xe0001249, 0x898a: 0xe00012e7, 0x898b: 0xe00012dd, - 0x898c: 0xe00012f8, 0x898d: 0xe00000b7, 0x898e: 0xe00000b4, 0x898f: 0xe00000ba, - 0x8990: 0xe0001343, 0x8991: 0xe000135e, 0x8992: 0xe0001356, 0x8993: 0xe0001352, - 0x8996: 0xe0001349, 0x8997: 0xe000135a, - 0x8998: 0xe0001346, 0x8999: 0xe0001361, 0x899a: 0xe0001340, 0x899b: 0xe000133a, - 0x899d: 0xe00000c0, 0x899e: 0xe00000bd, 0x899f: 0xe00000c3, - 0x89a0: 0xe00013e6, 0x89a1: 0xe0001401, 0x89a2: 0xe00013f9, 0x89a3: 0xe00013f5, - 0x89a4: 0xe00013a4, 0x89a5: 0xe00013a7, 0x89a6: 0xe00013ec, 0x89a7: 0xe00013fd, - 0x89a8: 0xe00013e9, 0x89a9: 0xe0001404, 0x89aa: 0xe00013e3, 0x89ab: 0xe00013dd, - 0x89ac: 0xe00013aa, 0x89ad: 0xe00000ae, 0x89ae: 0xe00000ab, 0x89af: 0x402c6020, - 0x89b2: 0xe000149f, 0x89b3: 0xe00014aa, - 0x89b4: 0xe0001495, 0x89b6: 0xe00014a3, 0x89b7: 0xe00014a6, - 0x89b8: 0xe00013a1, 0x89b9: 0xe000139b, 0x89ba: 0xe000149c, 0x89bb: 0xe0001492, - 0x89bc: 0xe00014ad, 0x89bd: 0x40062020, 0x89be: 0x40063820, - // Block 0x227, offset 0x89c0 - 0x89c0: 0x00021284, 0x89c1: 0x00021284, 0x89c2: 0x00021284, 0x89c3: 0x00021284, - 0x89c4: 0x00021284, 0x89c5: 0x00021284, 0x89c6: 0x00021284, 0x89c7: 0x0002129b, - 0x89c8: 0x00021284, 0x89c9: 0x00021284, 0x89ca: 0x00021284, 0x89cb: 0xa0000000, - 0x89cc: 0xa0000000, 0x89cd: 0xa0000000, 0x89ce: 0xa0000000, 0x89cf: 0xa0000000, - 0x89d0: 0x40022620, 0x89d1: 0x0002269b, 0x89d2: 0x40022820, 0x89d3: 0x40022a20, - 0x89d4: 0x40022c20, 0x89d5: 0x40022e20, 0x89d6: 0x4004c420, 0x89d7: 0x40021820, - 0x89d8: 0x4003d420, 0x89d9: 0x4003d620, 0x89da: 0x4003d820, 0x89db: 0x4003da20, - 0x89dc: 0x4003e220, 0x89dd: 0x4003e420, 0x89de: 0x4003e620, 0x89df: 0x4003e820, - 0x89e0: 0x4004f820, 0x89e1: 0x4004fa20, 0x89e2: 0x40050220, 0x89e3: 0x40050420, - 0x89e4: 0x0002e484, 0x89e5: 0xe0002bac, 0x89e6: 0xe0002bb2, 0x89e7: 0x40050620, - 0x89e8: 0x40020e20, 0x89e9: 0x40021020, 0x89ea: 0xa0000000, 0x89eb: 0xa0000000, - 0x89ec: 0xa0000000, 0x89ed: 0xa0000000, 0x89ee: 0xa0000000, 0x89ef: 0x0002129b, - 0x89f0: 0x4004f020, 0x89f1: 0x4004f420, 0x89f2: 0x40050e20, 0x89f3: 0xf0001f04, - 0x89f4: 0xf0000404, 0x89f5: 0x40051020, 0x89f6: 0xf0001f04, 0x89f7: 0xf0000404, - 0x89f8: 0x40051620, 0x89f9: 0x4003dc20, 0x89fa: 0x4003de20, 0x89fb: 0x40051820, - 0x89fc: 0xe0002ba0, 0x89fd: 0x4002e020, 0x89fe: 0x40021420, 0x89ff: 0x40051a20, - // Block 0x228, offset 0x8a00 - 0x8a00: 0x40051e20, 0x8a01: 0x40052220, 0x8a02: 0x40052420, 0x8a03: 0x40050820, - 0x8a04: 0x40095820, 0x8a05: 0x40040c20, 0x8a06: 0x40040e20, 0x8a07: 0xe0002ba9, - 0x8a08: 0xe0002ba6, 0x8a09: 0xe0002ba3, 0x8a0a: 0x4004e820, 0x8a0b: 0x4004d420, - 0x8a0c: 0x40050a20, 0x8a0d: 0x40050c20, 0x8a0e: 0x4004da20, 0x8a0f: 0x40026620, - 0x8a10: 0x40052020, 0x8a11: 0x4004dc20, 0x8a12: 0x40095020, 0x8a13: 0x40023420, - 0x8a14: 0x40051c20, 0x8a15: 0x40039c20, 0x8a16: 0x40039e20, 0x8a17: 0xe00000a6, - 0x8a18: 0x4003a020, 0x8a19: 0x4003a220, 0x8a1a: 0x4003a420, 0x8a1b: 0x4003a620, - 0x8a1c: 0x4003a820, 0x8a1d: 0x4003aa20, 0x8a1e: 0x4003ac20, 0x8a1f: 0x00021284, - 0x8a20: 0xa0000000, 0x8a21: 0xa0000000, 0x8a22: 0xa0000000, 0x8a23: 0xa0000000, - 0x8a24: 0xa0000000, - 0x8a2a: 0xa0000000, 0x8a2b: 0xa0000000, - 0x8a2c: 0xa0000000, 0x8a2d: 0xa0000000, 0x8a2e: 0xa0000000, 0x8a2f: 0xa0000000, - 0x8a30: 0x0029cc94, 0x8a31: 0x002d9a94, - 0x8a34: 0x0029d494, 0x8a35: 0x0029d694, 0x8a36: 0x0029d894, 0x8a37: 0x0029da94, - 0x8a38: 0x0029dc94, 0x8a39: 0x0029de94, 0x8a3a: 0x00093894, 0x8a3b: 0x00094e94, - 0x8a3c: 0x00094294, 0x8a3d: 0x0003f494, 0x8a3e: 0x0003f694, 0x8a3f: 0x002e9e94, - // Block 0x229, offset 0x8a40 - 0x8a40: 0xe00009bc, 0x8a41: 0xe00009c0, 0x8a42: 0x002c3a8b, 0x8a43: 0xe0002d26, - 0x8a44: 0x40081c20, 0x8a45: 0xe0000a5e, 0x8a46: 0xe0000a62, 0x8a47: 0x002cc28a, - 0x8a48: 0x40081e20, 0x8a49: 0xe0002d29, 0x8a4a: 0x002d2285, 0x8a4b: 0x002d688b, - 0x8a4c: 0x002d688b, 0x8a4d: 0x002d688b, 0x8a4e: 0x002d6885, 0x8a4f: 0xf0000202, - 0x8a50: 0x002d9a8b, 0x8a51: 0x002d9a8b, 0x8a52: 0x002e228b, 0x8a53: 0x002e2285, - 0x8a54: 0x40082020, 0x8a55: 0x002e9e8b, 0x8a56: 0xe000281e, 0x8a57: 0x40082220, - 0x8a58: 0x40082420, 0x8a59: 0x002f2c8b, 0x8a5a: 0x002f568b, 0x8a5b: 0x002f7a8b, - 0x8a5c: 0x002f7a8b, 0x8a5d: 0x002f7a8b, 0x8a5e: 0x40082620, 0x8a5f: 0x40082820, - 0x8a60: 0xe0002833, 0x8a61: 0xe0000fbd, 0x8a62: 0xe0002842, 0x8a63: 0x40082a20, - 0x8a64: 0x00312a8b, 0x8a65: 0x40082c20, 0x8a66: 0x0032a288, 0x8a67: 0x40082e20, - 0x8a68: 0x00312a8b, 0x8a69: 0x40083020, 0x8a6a: 0x402c3620, 0x8a6b: 0xe0002f4b, - 0x8a6c: 0x002c0a8b, 0x8a6d: 0x002c3a8b, 0x8a6e: 0x40083220, 0x8a6f: 0x002c9885, - 0x8a70: 0x002c988b, 0x8a71: 0x002d088b, 0x8a72: 0x002d1e88, 0x8a73: 0x002e828b, - 0x8a74: 0x002ee285, 0x8a75: 0x00389084, 0x8a76: 0x00389284, 0x8a77: 0x00389484, - 0x8a78: 0x00389684, 0x8a79: 0x002d9a85, 0x8a7a: 0x40083420, 0x8a7b: 0xe0000b95, - 0x8a7c: 0x00327e85, 0x8a7d: 0x00325685, 0x8a7e: 0x0032568b, 0x8a7f: 0x00327e8b, - // Block 0x22a, offset 0x8a80 - 0x8a80: 0x00093685, 0x8a81: 0x40083620, 0x8a82: 0x40083820, 0x8a83: 0x40083a20, - 0x8a84: 0x40083c20, 0x8a85: 0x002c628b, 0x8a86: 0x002c6285, 0x8a87: 0x002c9885, - 0x8a88: 0x002d9a85, 0x8a89: 0x002dcc85, 0x8a8a: 0x40083e20, 0x8a8b: 0x400a6e20, - 0x8a8c: 0x40084020, 0x8a8d: 0xe00009c4, 0x8a8e: 0x402d1e20, 0x8a8f: 0x40084220, - 0x8a90: 0xe00002cb, 0x8a91: 0xe00002d3, 0x8a92: 0xe00002b2, 0x8a93: 0xe00002bb, - 0x8a94: 0xe00003cd, 0x8a95: 0xe00002c3, 0x8a96: 0xe00003d1, 0x8a97: 0xe00004ab, - 0x8a98: 0xe0000579, 0x8a99: 0xe00002c7, 0x8a9a: 0xe0000640, 0x8a9b: 0xe00002cf, - 0x8a9c: 0xe00004af, 0x8a9d: 0xe0000644, 0x8a9e: 0xe0000798, 0x8a9f: 0xe0002d42, - 0x8aa0: 0x002d9a8a, 0x8aa1: 0xe00027d4, 0x8aa2: 0xe00027db, 0x8aa3: 0xe00027ee, - 0x8aa4: 0x0030be8a, 0x8aa5: 0xe0002848, 0x8aa6: 0xe000284f, 0x8aa7: 0xe00010bb, - 0x8aa8: 0xe00027f4, 0x8aa9: 0x0030f68a, 0x8aaa: 0xe0002883, 0x8aab: 0xe000288a, - 0x8aac: 0x002e228a, 0x8aad: 0x002c3a8a, 0x8aae: 0x002c628a, 0x8aaf: 0x002e828a, - 0x8ab0: 0x002d9a84, 0x8ab1: 0xe00027d1, 0x8ab2: 0xe00027d7, 0x8ab3: 0xe00027eb, - 0x8ab4: 0x0030be84, 0x8ab5: 0xe0002845, 0x8ab6: 0xe000284b, 0x8ab7: 0xe00010b6, - 0x8ab8: 0xe00027f1, 0x8ab9: 0x0030f684, 0x8aba: 0xe0002880, 0x8abb: 0xe0002886, - 0x8abc: 0x002e2284, 0x8abd: 0x002c3a84, 0x8abe: 0x002c6284, 0x8abf: 0x002e8284, - // Block 0x22b, offset 0x8ac0 - 0x8ac0: 0x4009a620, 0x8ac1: 0xe00000f5, 0x8ac2: 0x4009a820, 0x8ac3: 0x4009aa20, - 0x8ac4: 0xe00000f8, 0x8ac5: 0x4009ac20, 0x8ac6: 0x4009ae20, 0x8ac7: 0xe00000fb, - 0x8ac8: 0x4009b020, 0x8ac9: 0xe00000fe, 0x8aca: 0x4009b220, 0x8acb: 0x4009b420, - 0x8acc: 0x4009b620, 0x8acd: 0x4009b820, 0x8ace: 0x4009ba20, 0x8acf: 0x4009bc20, - 0x8ad0: 0x4009be20, 0x8ad1: 0x4009c020, 0x8ad2: 0x4009c220, 0x8ad3: 0x4009c420, - 0x8ad4: 0x4009c620, 0x8ad5: 0x4009c820, 0x8ad6: 0x4009ca20, 0x8ad7: 0x4009cc20, - 0x8ad8: 0x4009ce20, 0x8ad9: 0x4009d020, 0x8ada: 0x4009d220, 0x8adb: 0x4009d420, - 0x8adc: 0x4009d620, 0x8add: 0x4009d820, 0x8ade: 0x4009da20, 0x8adf: 0x4009dc20, - 0x8ae0: 0xe0002f16, 0x8ae1: 0x4009de20, 0x8ae2: 0xe0000104, 0x8ae3: 0x4009e020, - 0x8ae4: 0x4009e220, 0x8ae5: 0x4009e420, 0x8ae6: 0x4009e620, 0x8ae7: 0x4009e820, - 0x8ae8: 0x4009ea20, 0x8ae9: 0x4009ec20, 0x8aea: 0x4009ee20, 0x8aeb: 0x4009f020, - 0x8aec: 0x4009f220, 0x8aed: 0xe0000101, 0x8aee: 0xe0002f13, 0x8aef: 0xe0002f19, - 0x8af0: 0xe0000107, 0x8af1: 0xe000010a, 0x8af2: 0x4009f420, 0x8af3: 0x4009f620, - 0x8af4: 0xe000010d, 0x8af5: 0xe0000110, 0x8af6: 0x4009f820, 0x8af7: 0x4009fa20, - 0x8af8: 0xe0000113, 0x8af9: 0xe0000116, 0x8afa: 0x4009fc20, 0x8afb: 0x4009fe20, - 0x8afc: 0x400a0020, 0x8afd: 0x400a0220, 0x8afe: 0x400a0420, 0x8aff: 0x400a0620, - // Block 0x22c, offset 0x8b00 - 0x8b00: 0x400d1820, 0x8b01: 0x400d1a20, 0x8b02: 0x400d1c20, 0x8b03: 0x400d1e20, - 0x8b04: 0x400d2020, 0x8b05: 0x400d2220, 0x8b06: 0x400d2420, 0x8b07: 0x400d2620, - 0x8b08: 0x400d2820, 0x8b09: 0x400d2a20, 0x8b0a: 0x400d2c20, - 0x8b20: 0x0029ce86, 0x8b21: 0x0029d086, 0x8b22: 0x0029d286, 0x8b23: 0x0029d486, - 0x8b24: 0x0029d686, 0x8b25: 0x0029d886, 0x8b26: 0x0029da86, 0x8b27: 0x0029dc86, - 0x8b28: 0x0029de86, 0x8b29: 0xe0002d45, 0x8b2a: 0xe0002d58, 0x8b2b: 0xe0002d6b, - 0x8b2c: 0xe0002d7e, 0x8b2d: 0xe0002d8d, 0x8b2e: 0xe0002d9c, 0x8b2f: 0xe0002dab, - 0x8b30: 0xe0002dba, 0x8b31: 0xe0002dc9, 0x8b32: 0xe0002dd8, 0x8b33: 0xe0002df6, - 0x8b34: 0xe0002bba, 0x8b35: 0xe0002bbe, 0x8b36: 0xe0002bc2, 0x8b37: 0xe0002bc6, - 0x8b38: 0xe0002bca, 0x8b39: 0xe0002bce, 0x8b3a: 0xe0002bd2, 0x8b3b: 0xe0002bd6, - 0x8b3c: 0xe0002bda, 0x8b3d: 0xe0000015, 0x8b3e: 0xe000001a, 0x8b3f: 0xe000001f, - // Block 0x22d, offset 0x8b40 - 0x8b40: 0xe0000024, 0x8b41: 0xe0000029, 0x8b42: 0xe000002e, 0x8b43: 0xe0000033, - 0x8b44: 0xe0000038, 0x8b45: 0xe000003d, 0x8b46: 0xe0000042, 0x8b47: 0xe0000047, - 0x8b48: 0xe0002d3f, 0x8b49: 0xe0002df3, 0x8b4a: 0xe0002e60, 0x8b4b: 0xe0002e95, - 0x8b4c: 0xe0002ec2, 0x8b4d: 0xe0002ed4, 0x8b4e: 0xe0002ee3, 0x8b4f: 0xe0002ef2, - 0x8b50: 0xe0002f01, 0x8b51: 0xe0002d48, 0x8b52: 0xe0002d5b, 0x8b53: 0xe0002d6e, - 0x8b54: 0xe0002d81, 0x8b55: 0xe0002d90, 0x8b56: 0xe0002d9f, 0x8b57: 0xe0002dae, - 0x8b58: 0xe0002dbd, 0x8b59: 0xe0002dcc, 0x8b5a: 0xe0002ddb, 0x8b5b: 0xe0002df9, - 0x8b5c: 0xe0002bde, 0x8b5d: 0xe0002be6, 0x8b5e: 0xe0002bee, 0x8b5f: 0xe0002bf6, - 0x8b60: 0xe000249f, 0x8b61: 0xe0002bfe, 0x8b62: 0xe0002c06, 0x8b63: 0xe00024a7, - 0x8b64: 0xe00024af, 0x8b65: 0xe0002c0e, 0x8b66: 0xe00024b7, 0x8b67: 0xe0002c16, - 0x8b68: 0xe0002c1e, 0x8b69: 0xe0002c26, 0x8b6a: 0xe00024bf, 0x8b6b: 0xe0002c2e, - 0x8b6c: 0xe00024c7, 0x8b6d: 0xe00024cf, 0x8b6e: 0xe00024d7, 0x8b6f: 0xe00024df, - 0x8b70: 0xe0002c36, 0x8b71: 0xe0002c3e, 0x8b72: 0xe0002c46, 0x8b73: 0xe00024e7, - 0x8b74: 0xe0002c4e, 0x8b75: 0xe0002c56, 0x8b76: 0x002bde8c, 0x8b77: 0x002c0a8c, - 0x8b78: 0x002c3a8c, 0x8b79: 0x002c628c, 0x8b7a: 0x002c988c, 0x8b7b: 0x002d088c, - 0x8b7c: 0x002d228c, 0x8b7d: 0x002d688c, 0x8b7e: 0x002d9a8c, 0x8b7f: 0x002dcc8c, - // Block 0x22e, offset 0x8b80 - 0x8b80: 0x40151420, 0x8b81: 0x40151620, 0x8b82: 0x40151820, 0x8b83: 0x40151a20, - 0x8b84: 0x40151c20, 0x8b85: 0x40151e20, 0x8b86: 0x40152020, 0x8b87: 0x40152220, - 0x8b88: 0x40152420, 0x8b89: 0x40152620, 0x8b8a: 0x40152820, 0x8b8b: 0x40152a20, - 0x8b8c: 0x40152c20, 0x8b8d: 0x40152e20, 0x8b8e: 0x40153020, 0x8b8f: 0x40153220, - 0x8b90: 0x40153420, 0x8b91: 0x40153620, 0x8b92: 0x40153820, 0x8b93: 0x40153a20, - 0x8b94: 0x40153c20, 0x8b95: 0x40153e20, 0x8b96: 0x40154020, 0x8b97: 0x40154220, - 0x8b98: 0x40154420, 0x8b99: 0x40154620, 0x8b9a: 0x40154820, 0x8b9b: 0x40154a20, - 0x8b9c: 0x40154c20, 0x8b9d: 0x40154e20, 0x8b9e: 0x40155020, 0x8b9f: 0x40155220, - 0x8ba0: 0x40155420, 0x8ba1: 0x40155620, 0x8ba2: 0x40155820, 0x8ba3: 0x40155a20, - 0x8ba4: 0x40155c20, 0x8ba5: 0x40155e20, 0x8ba6: 0x40156020, 0x8ba7: 0x40156220, - 0x8ba8: 0x40156420, 0x8ba9: 0x40156620, 0x8baa: 0x40156820, 0x8bab: 0x40156a20, - 0x8bac: 0x40156c20, 0x8bad: 0x40156e20, 0x8bae: 0x40157020, 0x8baf: 0x40157220, - 0x8bb0: 0x40157420, 0x8bb1: 0x40157620, 0x8bb2: 0x40157820, 0x8bb3: 0x40157a20, - 0x8bb4: 0xe0002b9c, 0x8bb5: 0xe0002d2c, 0x8bb6: 0xe0002d2f, 0x8bb7: 0x40157c20, - 0x8bb8: 0x40157e20, 0x8bb9: 0x40158020, 0x8bba: 0x40158220, 0x8bbb: 0x40158420, - 0x8bbc: 0x40158620, 0x8bbd: 0x40158820, 0x8bbe: 0x40158a20, 0x8bbf: 0x40158c20, - // Block 0x22f, offset 0x8bc0 - 0x8bc0: 0xe0002c5e, 0x8bc1: 0xe0002c62, 0x8bc2: 0xe0002c66, 0x8bc3: 0xe0002c6a, - 0x8bc4: 0xe0002c6e, 0x8bc5: 0xe0002c72, 0x8bc6: 0xe0002c76, 0x8bc7: 0xe0002c7a, - 0x8bc8: 0xe0002c7e, 0x8bc9: 0xe0002c82, 0x8bca: 0xe0002c86, 0x8bcb: 0xe0002c8a, - 0x8bcc: 0xe0002c8e, 0x8bcd: 0xe0002c92, 0x8bce: 0xe000004c, 0x8bcf: 0xe0000051, - 0x8bd0: 0xe0000056, 0x8bd1: 0xe000005b, 0x8bd2: 0xe0000060, 0x8bd3: 0xe0000065, - 0x8bd4: 0xe000006a, 0x8bd5: 0xe000006f, 0x8bd6: 0xe0000083, 0x8bd7: 0xe000008d, - 0x8bd8: 0xe0000092, 0x8bd9: 0xe0000097, 0x8bda: 0xe000009c, 0x8bdb: 0xe00000a1, - 0x8bdc: 0xe0000088, 0x8bdd: 0xe0000074, 0x8bde: 0xe000007c, - 0x8be0: 0xe0002c96, 0x8be1: 0xe0002ca6, 0x8be2: 0xe0002c9e, 0x8be3: 0xe0002cd6, - 0x8be4: 0xe0002caa, 0x8be5: 0xe0002cbe, 0x8be6: 0xe0002c9a, 0x8be7: 0xe0002cba, - 0x8be8: 0xe0002ca2, 0x8be9: 0xe0002cc6, 0x8bea: 0xe0002ce6, 0x8beb: 0xe0002cfa, - 0x8bec: 0xe0002cf6, 0x8bed: 0xe0002cee, 0x8bee: 0xe0002d22, 0x8bef: 0xe0002cda, - 0x8bf0: 0xe0002ce2, 0x8bf1: 0xe0002cf2, 0x8bf2: 0xe0002cea, 0x8bf3: 0xe0002d06, - 0x8bf4: 0xe0002cce, 0x8bf5: 0xe0002cfe, 0x8bf6: 0xe0002d1a, 0x8bf7: 0xe0002d0a, - 0x8bf8: 0xe0002cc2, 0x8bf9: 0xe0002cae, 0x8bfa: 0xe0002cd2, 0x8bfb: 0xe0002cde, - 0x8bfc: 0xe0002d02, 0x8bfd: 0xe0002cb2, 0x8bfe: 0xe0002d1e, 0x8bff: 0xe0002cca, - // Block 0x230, offset 0x8c00 - 0x8c00: 0xe0002d0e, 0x8c01: 0xe0002cb6, 0x8c02: 0xe0002d12, 0x8c03: 0xe0002d16, - 0x8c04: 0x02aa9e86, 0x8c05: 0x02bcf886, 0x8c06: 0x02cb0e86, 0x8c07: 0x02f71e86, - 0x8c08: 0xe00002e3, 0x8c09: 0xe00003d8, 0x8c0a: 0xe00004b3, 0x8c0b: 0xe000057d, - 0x8c0c: 0xe0000648, 0x8c0d: 0xe00006f0, 0x8c0e: 0xe000079c, 0x8c0f: 0xe0000841, - 0x8c10: 0xe0000ec0, 0x8c11: 0xe0002e05, 0x8c12: 0xe0002e10, 0x8c13: 0xe0002e1b, - 0x8c14: 0xe0002e26, 0x8c15: 0xe0002e31, 0x8c16: 0xe0002e38, 0x8c17: 0xe0002e3f, - 0x8c18: 0xe0002e46, 0x8c19: 0xe0002e4d, 0x8c1a: 0xe0002e63, 0x8c1b: 0xe0002e6a, - 0x8c1c: 0xe0002e71, 0x8c1d: 0xe0002e74, 0x8c1e: 0xe0002e77, 0x8c1f: 0xe0002e7a, - 0x8c20: 0x0062ac86, 0x8c21: 0x0062b086, 0x8c22: 0x0062b286, 0x8c23: 0x0062b686, - 0x8c24: 0x0062b886, 0x8c25: 0x0062ba86, 0x8c26: 0x0062be86, 0x8c27: 0x0062c286, - 0x8c28: 0x0062c486, 0x8c29: 0x0062c886, 0x8c2a: 0x0062ca86, 0x8c2b: 0x0062cc86, - 0x8c2c: 0x0062ce86, 0x8c2d: 0x0062d086, 0x8c2e: 0xf0000606, 0x8c2f: 0xf0000606, - 0x8c30: 0xf0000606, 0x8c31: 0xf0000606, 0x8c32: 0xf0000606, 0x8c33: 0xf0000606, - 0x8c34: 0xf0000606, 0x8c35: 0xf0000606, 0x8c36: 0xf0000606, 0x8c37: 0xf0000606, - 0x8c38: 0xf0000606, 0x8c39: 0xf0000606, 0x8c3a: 0xf0000606, 0x8c3b: 0xf0000606, - 0x8c3c: 0xe0002127, 0x8c3d: 0xe0002122, 0x8c3e: 0xf0000606, 0x8c3f: 0x4027ac20, - // Block 0x231, offset 0x8c40 - 0x8c40: 0x029c0086, 0x8c41: 0x029d1886, 0x8c42: 0x029c1286, 0x8c43: 0x02adb686, - 0x8c44: 0x029d2886, 0x8c45: 0x02a2da86, 0x8c46: 0x029c0686, 0x8c47: 0x02a2d686, - 0x8c48: 0x029cba86, 0x8c49: 0x02a68286, 0x8c4a: 0x02ce1086, 0x8c4b: 0x02e0d686, - 0x8c4c: 0x02d86886, 0x8c4d: 0x02ce5086, 0x8c4e: 0x0323a286, 0x8c4f: 0x02ae3e86, - 0x8c50: 0x02cbca86, 0x8c51: 0x02d05486, 0x8c52: 0x02ce1286, 0x8c53: 0x02f27c86, - 0x8c54: 0x02a81a86, 0x8c55: 0x02e4f286, 0x8c56: 0x03194286, 0x8c57: 0x02f2ba86, - 0x8c58: 0x02a56886, 0x8c59: 0x02f3b086, 0x8c5a: 0x02ea6e86, 0x8c5b: 0x02b2e686, - 0x8c5c: 0x0320d286, 0x8c5d: 0x02a25486, 0x8c5e: 0x02a6e086, 0x8c5f: 0x02d9d086, - 0x8c60: 0x03300a86, 0x8c61: 0x029e2286, 0x8c62: 0x02a33286, 0x8c63: 0x02d6c686, - 0x8c64: 0x029c1486, 0x8c65: 0x029c5a86, 0x8c66: 0x029c1686, 0x8c67: 0x02bbcc86, - 0x8c68: 0x02a7e686, 0x8c69: 0x02a67686, 0x8c6a: 0x02b72e86, 0x8c6b: 0x02b6cc86, - 0x8c6c: 0x02edc686, 0x8c6d: 0x029e0286, 0x8c6e: 0x03198e86, 0x8c6f: 0x02a6a886, - 0x8c70: 0x02b23886, 0x8c71: 0xe0002e7d, 0x8c72: 0xe0002e80, 0x8c73: 0xe0002e83, - 0x8c74: 0xe0002e86, 0x8c75: 0xe0002e98, 0x8c76: 0xe0002e9b, 0x8c77: 0xe0002e9e, - 0x8c78: 0xe0002ea1, 0x8c79: 0xe0002ea4, 0x8c7a: 0xe0002ea7, 0x8c7b: 0xe0002eaa, - 0x8c7c: 0xe0002ead, 0x8c7d: 0xe0002eb0, 0x8c7e: 0xe0002eb3, 0x8c7f: 0xe0002ec5, - // Block 0x232, offset 0x8c80 - 0x8c80: 0xe0002dea, 0x8c81: 0xe0002e57, 0x8c82: 0xe0002e8c, 0x8c83: 0xe0002eb9, - 0x8c84: 0xe0002ecb, 0x8c85: 0xe0002eda, 0x8c86: 0xe0002ee9, 0x8c87: 0xe0002ef8, - 0x8c88: 0xe0002f07, 0x8c89: 0xe0002d50, 0x8c8a: 0xe0002d63, 0x8c8b: 0xe0002d76, - 0x8c8c: 0xe00027c5, 0x8c8d: 0xe0000b85, 0x8c8e: 0xe00026cc, 0x8c8f: 0xe0000d14, - 0x8c90: 0x00657693, 0x8c91: 0x00657893, 0x8c92: 0x00657a93, 0x8c93: 0x00657e93, - 0x8c94: 0x00658093, 0x8c95: 0x00658293, 0x8c96: 0x00658493, 0x8c97: 0x00658693, - 0x8c98: 0x00658893, 0x8c99: 0x00658a93, 0x8c9a: 0x00658c93, 0x8c9b: 0x00658e93, - 0x8c9c: 0x00659093, 0x8c9d: 0x00659293, 0x8c9e: 0x00659493, 0x8c9f: 0x00659693, - 0x8ca0: 0x00659893, 0x8ca1: 0x00659a93, 0x8ca2: 0x00659c93, 0x8ca3: 0x00659e93, - 0x8ca4: 0x0065a093, 0x8ca5: 0x0065a293, 0x8ca6: 0x0065a493, 0x8ca7: 0x0065a693, - 0x8ca8: 0x0065a893, 0x8ca9: 0x0065aa93, 0x8caa: 0x0065ac93, 0x8cab: 0x0065ae93, - 0x8cac: 0x0065b093, 0x8cad: 0x0065b293, 0x8cae: 0x0065b493, 0x8caf: 0x0065b693, - 0x8cb0: 0x0065b893, 0x8cb1: 0x0065ba93, 0x8cb2: 0x0065bc93, 0x8cb3: 0x0065be93, - 0x8cb4: 0x0065c093, 0x8cb5: 0x0065c493, 0x8cb6: 0x0065c693, 0x8cb7: 0x0065c893, - 0x8cb8: 0x0065ca93, 0x8cb9: 0x0065cc93, 0x8cba: 0x0065ce93, 0x8cbb: 0x0065d093, - 0x8cbc: 0x0065d293, 0x8cbd: 0x0065d493, 0x8cbe: 0x0065d693, - // Block 0x233, offset 0x8cc0 - 0x8cc0: 0xe000230b, 0x8cc1: 0xe00022f8, 0x8cc2: 0xe00022fc, 0x8cc3: 0xe0002311, - 0x8cc4: 0xe0002316, 0x8cc5: 0xe000231d, 0x8cc6: 0xe0002321, 0x8cc7: 0xe0002325, - 0x8cc8: 0xe000232b, 0x8cc9: 0xf0001c1c, 0x8cca: 0xe0002330, 0x8ccb: 0xe000233c, - 0x8ccc: 0xe0002340, 0x8ccd: 0xe0002337, 0x8cce: 0xe0002346, 0x8ccf: 0xe000234b, - 0x8cd0: 0xe000234f, 0x8cd1: 0xe0002353, 0x8cd2: 0xf0001c1c, 0x8cd3: 0xe000235e, - 0x8cd4: 0xe0002358, 0x8cd5: 0xf0001c1c, 0x8cd6: 0xe0002363, 0x8cd7: 0xe000236d, - 0x8cd8: 0xe0002d39, 0x8cd9: 0xe0002ded, 0x8cda: 0xe0002e5a, 0x8cdb: 0xe0002e8f, - 0x8cdc: 0xe0002ebc, 0x8cdd: 0xe0002ece, 0x8cde: 0xe0002edd, 0x8cdf: 0xe0002eec, - 0x8ce0: 0xe0002efb, 0x8ce1: 0xe0002f0a, 0x8ce2: 0xe0002d54, 0x8ce3: 0xe0002d67, - 0x8ce4: 0xe0002d7a, 0x8ce5: 0xe0002d89, 0x8ce6: 0xe0002d98, 0x8ce7: 0xe0002da7, - 0x8ce8: 0xe0002db6, 0x8ce9: 0xe0002dc5, 0x8cea: 0xe0002dd4, 0x8ceb: 0xe0002de3, - 0x8cec: 0xe0002e01, 0x8ced: 0xe0002e0c, 0x8cee: 0xe0002e17, 0x8cef: 0xe0002e22, - 0x8cf0: 0xe0002e2d, 0x8cf1: 0xe0000c1e, 0x8cf2: 0xe000329b, 0x8cf3: 0xe0002f0d, - 0x8cf4: 0xe0000a31, 0x8cf5: 0xe0002824, 0x8cf6: 0xe00035d6, 0x8cf7: 0xe00032a7, - 0x8cf8: 0xe0000ac2, 0x8cf9: 0xe0000ac6, 0x8cfa: 0xe00027e8, 0x8cfb: 0xf0001c1c, - 0x8cfc: 0xf0001c1c, 0x8cfd: 0xf0001c1c, 0x8cfe: 0xf0001c1c, 0x8cff: 0xe0002431, - // Block 0x234, offset 0x8d00 - 0x8d00: 0xe00035d0, 0x8d01: 0xe00035b8, 0x8d02: 0xe00035ee, 0x8d03: 0xe000358e, - 0x8d04: 0xe00027f7, 0x8d05: 0xe00027fa, 0x8d06: 0xe0003594, 0x8d07: 0xe0003573, - 0x8d08: 0xe0000a6b, 0x8d09: 0xe0000cb4, 0x8d0a: 0xe00035d9, 0x8d0b: 0xe00035bb, - 0x8d0c: 0xe00035f1, 0x8d0d: 0xe00035f4, 0x8d0e: 0xe000359d, 0x8d0f: 0xe00027fd, - 0x8d10: 0xe00027ce, 0x8d11: 0xe0000cb9, 0x8d12: 0xe0000d36, 0x8d13: 0xe0000be3, - 0x8d14: 0xe0000fc5, 0x8d15: 0xe00035f7, 0x8d16: 0xe00035a0, 0x8d17: 0xe00032a4, - 0x8d18: 0xe0002803, 0x8d19: 0xe0003570, 0x8d1a: 0xe00035c7, 0x8d1b: 0xe00035fa, - 0x8d1c: 0xe00035a3, 0x8d1d: 0xe0003099, 0x8d1e: 0xe0002806, 0x8d1f: 0xe0000d3e, - 0x8d20: 0xe0000a72, 0x8d21: 0xe0003588, 0x8d22: 0xe0000cbd, 0x8d23: 0xe0000d42, - 0x8d24: 0xe0000a76, 0x8d25: 0xe000358b, 0x8d26: 0xe0000cc1, 0x8d27: 0xe0000d2d, - 0x8d28: 0xe0000d31, 0x8d29: 0xe00035d3, 0x8d2a: 0xe0000cc5, 0x8d2b: 0xe0000d4a, - 0x8d2c: 0xe0000be7, 0x8d2d: 0xe0000f0b, 0x8d2e: 0xe0000f0f, 0x8d2f: 0xe0000f15, - 0x8d30: 0xe000282d, 0x8d31: 0xe0002821, 0x8d32: 0xe000288e, 0x8d33: 0xe000281b, - 0x8d34: 0xe00035dc, 0x8d35: 0xe00035ca, 0x8d36: 0xe00035fd, 0x8d37: 0xe00035a6, - 0x8d38: 0xe000280f, 0x8d39: 0xe00035a9, 0x8d3a: 0xe00035df, 0x8d3b: 0xe00035cd, - 0x8d3c: 0xe0003600, 0x8d3d: 0xe00035af, 0x8d3e: 0xe0002812, 0x8d3f: 0xe00035b2, - // Block 0x235, offset 0x8d40 - 0x8d40: 0xe0002815, 0x8d41: 0xe00035b5, 0x8d42: 0xe00009b7, 0x8d43: 0xe00024f3, - 0x8d44: 0xe0003090, 0x8d45: 0xe0003096, 0x8d46: 0xe0000a66, 0x8d47: 0xe0000a7a, - 0x8d48: 0xe000329e, 0x8d49: 0xe0003576, 0x8d4a: 0xe00027c2, 0x8d4b: 0xe00027c8, - 0x8d4c: 0xe00027e5, 0x8d4d: 0xe0002800, 0x8d4e: 0xe0002809, 0x8d4f: 0xe000280c, - 0x8d50: 0xe0003582, 0x8d51: 0xe0003585, 0x8d52: 0xe0000d0d, 0x8d53: 0xe0002818, - 0x8d54: 0xe0003591, 0x8d55: 0xe0000d3a, 0x8d56: 0xe0000d46, 0x8d57: 0xe0002827, - 0x8d58: 0xe0000eb0, 0x8d59: 0xe0000eb8, 0x8d5a: 0xe000282a, 0x8d5b: 0xe0002836, - 0x8d5c: 0xe000283f, 0x8d5d: 0xe00035e2, 0x8d5e: 0xe00010b2, 0x8d5f: 0xe00009c8, - 0x8d60: 0xe0002de7, 0x8d61: 0xe0002e54, 0x8d62: 0xe0002e89, 0x8d63: 0xe0002eb6, - 0x8d64: 0xe0002ec8, 0x8d65: 0xe0002ed7, 0x8d66: 0xe0002ee6, 0x8d67: 0xe0002ef5, - 0x8d68: 0xe0002f04, 0x8d69: 0xe0002d4c, 0x8d6a: 0xe0002d5f, 0x8d6b: 0xe0002d72, - 0x8d6c: 0xe0002d85, 0x8d6d: 0xe0002d94, 0x8d6e: 0xe0002da3, 0x8d6f: 0xe0002db2, - 0x8d70: 0xe0002dc1, 0x8d71: 0xe0002dd0, 0x8d72: 0xe0002ddf, 0x8d73: 0xe0002dfd, - 0x8d74: 0xe0002e08, 0x8d75: 0xe0002e13, 0x8d76: 0xe0002e1e, 0x8d77: 0xe0002e29, - 0x8d78: 0xe0002e34, 0x8d79: 0xe0002e3b, 0x8d7a: 0xe0002e42, 0x8d7b: 0xe0002e49, - 0x8d7c: 0xe0002e50, 0x8d7d: 0xe0002e66, 0x8d7e: 0xe0002e6d, 0x8d7f: 0xe0000bdf, - // Block 0x236, offset 0x8d80 - 0x8d80: 0xe000356a, 0x8d81: 0xe00026cf, 0x8d82: 0xe000356d, 0x8d83: 0xe0000b99, - 0x8d84: 0xe0000b9d, 0x8d85: 0xe0000f83, 0x8d86: 0xe000283c, - 0x8d93: 0xf0000404, - 0x8d94: 0xf0000404, 0x8d95: 0xf0000404, 0x8d96: 0xf0000404, 0x8d97: 0xf0000404, - 0x8d9d: 0xe000150b, 0x8d9e: 0xa1a09602, 0x8d9f: 0xe0001514, - 0x8da0: 0x0038ae85, 0x8da1: 0x00389085, 0x8da2: 0x00389685, 0x8da3: 0x00389885, - 0x8da4: 0x0038a485, 0x8da5: 0x0038a685, 0x8da6: 0x0038a885, 0x8da7: 0x0038b685, - 0x8da8: 0x0038ba85, 0x8da9: 0x00093885, 0x8daa: 0xe0001542, 0x8dab: 0xe000153f, - 0x8dac: 0xe000154c, 0x8dad: 0xe0001548, 0x8dae: 0xe00014e1, 0x8daf: 0xe00014e4, - 0x8db0: 0xe00014e7, 0x8db1: 0xe00014ea, 0x8db2: 0xe00014f0, 0x8db3: 0xe00014f3, - 0x8db4: 0xe00014f6, 0x8db5: 0xe00014fc, 0x8db6: 0xe0001505, - 0x8db8: 0xe0001508, 0x8db9: 0xe000150e, 0x8dba: 0xe000151b, 0x8dbb: 0xe0001518, - 0x8dbc: 0xe0001521, 0x8dbe: 0xe0001524, - // Block 0x237, offset 0x8dc0 - 0x8dc0: 0xa0000000, 0x8dc1: 0xa0000000, 0x8dc2: 0xa0000000, 0x8dc3: 0xa0000000, - 0x8dc4: 0xa0000000, 0x8dc5: 0xa0000000, 0x8dc6: 0xa0000000, 0x8dc7: 0xa0000000, - 0x8dc8: 0xa0000000, 0x8dc9: 0xa0000000, 0x8dca: 0xa0000000, 0x8dcb: 0xa0000000, - 0x8dcc: 0xa0000000, 0x8dcd: 0xa0000000, 0x8dce: 0xa0000000, 0x8dcf: 0xa0000000, - 0x8dd0: 0x00024096, 0x8dd1: 0x00025c96, 0x8dd2: 0x00030496, 0x8dd3: 0x00026c96, - 0x8dd4: 0x00026296, 0x8dd5: 0x0002ba96, 0x8dd6: 0x0002c496, 0x8dd7: 0x0004b496, - 0x8dd8: 0x0004b696, 0x8dd9: 0xe0002bb6, - 0x8de0: 0xae608202, 0x8de1: 0xae600000, 0x8de2: 0xae608102, 0x8de3: 0xae600000, - 0x8de4: 0xae600000, 0x8de5: 0xae600000, 0x8de6: 0xae600000, - 0x8df0: 0xe0002baf, 0x8df1: 0x00022c96, 0x8df2: 0x00022a96, 0x8df3: 0x00021696, - 0x8df4: 0x00021696, 0x8df5: 0x0003f496, 0x8df6: 0x0003f696, 0x8df7: 0x0003fc96, - 0x8df8: 0x0003fe96, 0x8df9: 0x0004b096, 0x8dfa: 0x0004b296, 0x8dfb: 0x0004ac96, - 0x8dfc: 0x0004ae96, 0x8dfd: 0x0004a096, 0x8dfe: 0x0004a296, 0x8dff: 0x00049c96, - // Block 0x238, offset 0x8e00 - 0x8e00: 0xe0002d36, 0x8e01: 0xe0002d33, 0x8e02: 0xe0002d3c, 0x8e03: 0xe0002df0, - 0x8e04: 0xe0002e5d, 0x8e05: 0xe0002e92, 0x8e06: 0xe0002ebf, 0x8e07: 0xe0002ed1, - 0x8e08: 0xe0002ee0, 0x8e09: 0xe0002eef, 0x8e0a: 0xe0002efe, - 0x8e10: 0xe0002be2, 0x8e11: 0xe0002bea, 0x8e12: 0xe0002bf2, 0x8e13: 0xe0002bfa, - 0x8e14: 0xe00024a3, 0x8e15: 0xe0002c02, 0x8e16: 0xe0002c0a, 0x8e17: 0xe00024ab, - 0x8e18: 0xe00024b3, 0x8e19: 0xe0002c12, 0x8e1a: 0xe00024bb, 0x8e1b: 0xe0002c1a, - 0x8e1c: 0xe0002c22, 0x8e1d: 0xe0002c2a, 0x8e1e: 0xe00024c3, 0x8e1f: 0xe0002c32, - 0x8e20: 0xe00024cb, 0x8e21: 0xe00024d3, 0x8e22: 0xe00024db, 0x8e23: 0xe00024e3, - 0x8e24: 0xe0002c3a, 0x8e25: 0xe0002c42, 0x8e26: 0xe0002c4a, 0x8e27: 0xe00024eb, - 0x8e28: 0xe0002c52, 0x8e29: 0xe0002c5a, 0x8e2a: 0xe00024ef, 0x8e2b: 0x002c3a8c, - 0x8e2c: 0x002f7a8c, 0x8e2d: 0xe0003093, 0x8e2e: 0xe00035e8, - 0x8e30: 0x002bde9d, 0x8e31: 0x002c0a9d, 0x8e32: 0x002c3a9d, 0x8e33: 0x002c629d, - 0x8e34: 0x002c989d, 0x8e35: 0x002d089d, 0x8e36: 0x002d229d, 0x8e37: 0x002d689d, - 0x8e38: 0x002d9a9d, 0x8e39: 0x002dcc9d, 0x8e3a: 0x002dfe9d, 0x8e3b: 0x002e229d, - 0x8e3c: 0x002e829d, 0x8e3d: 0x002e9e9d, 0x8e3e: 0x002ee29d, 0x8e3f: 0x002f2c9d, - // Block 0x239, offset 0x8e40 - 0x8e40: 0x002f569d, 0x8e41: 0x002f7a9d, 0x8e42: 0x002fe69d, 0x8e43: 0x00302c9d, - 0x8e44: 0x00306c9d, 0x8e45: 0x0030be9d, 0x8e46: 0x0030e29d, 0x8e47: 0x0030f69d, - 0x8e48: 0x0031009d, 0x8e49: 0x00312a9d, 0x8e4a: 0xe00027cb, 0x8e4b: 0xe00035ac, - 0x8e4c: 0xe0002830, 0x8e4d: 0xe0002839, 0x8e4e: 0xe0000ebc, 0x8e4f: 0xe00035e5, - 0x8e50: 0x002bde8c, 0x8e51: 0x002c0a8c, 0x8e52: 0x002c3a8c, 0x8e53: 0x002c628c, - 0x8e54: 0x002c988c, 0x8e55: 0x002d088c, 0x8e56: 0x002d228c, 0x8e57: 0x002d688c, - 0x8e58: 0x002d9a8c, 0x8e59: 0x002dcc8c, 0x8e5a: 0x002dfe8c, 0x8e5b: 0x002e228c, - 0x8e5c: 0x002e828c, 0x8e5d: 0x002e9e8c, 0x8e5e: 0x002ee28c, 0x8e5f: 0x002f2c8c, - 0x8e60: 0x002f568c, 0x8e61: 0x002f7a8c, 0x8e62: 0x002fe68c, 0x8e63: 0x00302c8c, - 0x8e64: 0x00306c8c, 0x8e65: 0x0030be8c, 0x8e66: 0x0030e28c, 0x8e67: 0x0030f68c, - 0x8e68: 0x0031008c, 0x8e69: 0x00312a8c, 0x8e6a: 0xe0003597, 0x8e6b: 0xe000359a, - 0x8e70: 0x002bde9d, 0x8e71: 0x002c0a9d, 0x8e72: 0x002c3a9d, 0x8e73: 0x002c629d, - 0x8e74: 0x002c989d, 0x8e75: 0x002d089d, 0x8e76: 0x002d229d, 0x8e77: 0x002d689d, - 0x8e78: 0x002d9a9d, 0x8e79: 0x002dcc9d, 0x8e7a: 0x002dfe9d, 0x8e7b: 0x002e229d, - 0x8e7c: 0x002e829d, 0x8e7d: 0x002e9e9d, 0x8e7e: 0x002ee29d, 0x8e7f: 0x002f2c9d, - // Block 0x23a, offset 0x8e80 - 0x8e80: 0x002f569d, 0x8e81: 0x002f7a9d, 0x8e82: 0x002fe69d, 0x8e83: 0x00302c9d, - 0x8e84: 0x00306c9d, 0x8e85: 0x0030be9d, 0x8e86: 0x0030e29d, 0x8e87: 0x0030f69d, - 0x8e88: 0x0031009d, 0x8e89: 0x00312a9d, 0x8e8a: 0x002f2c9d, 0x8e8b: 0xe0000c81, - 0x8e8c: 0xe0000eb5, 0x8e8d: 0xe0000f74, 0x8e8e: 0xe00009d2, 0x8e8f: 0xe00010f0, - 0x8e90: 0xe00032a1, 0x8e91: 0xe0000a6f, 0x8e92: 0xe0000a7e, 0x8e93: 0xe0000ba4, - 0x8e94: 0xe0000c84, 0x8e95: 0xe0000d8a, 0x8e96: 0xe0000d8e, 0x8e97: 0xe0000e9b, - 0x8e98: 0xe0000f77, 0x8e99: 0xe00010a2, 0x8e9a: 0xe00010c0, - // Block 0x23b, offset 0x8ec0 - 0x8ec0: 0xa0000000, 0x8ec1: 0xa0000000, 0x8ec2: 0xa0000000, 0x8ec3: 0xa0000000, - 0x8ec4: 0xa0000000, 0x8ec5: 0xa0000000, 0x8ec6: 0xa0000000, 0x8ec7: 0xa0000000, - 0x8ec8: 0xa0000000, 0x8ec9: 0x40020020, 0x8eca: 0x40020220, 0x8ecb: 0x40020420, - 0x8ecc: 0x40020620, 0x8ecd: 0x40020820, 0x8ece: 0xa0000000, 0x8ecf: 0xa0000000, - 0x8ed0: 0xa0000000, 0x8ed1: 0xa0000000, 0x8ed2: 0xa0000000, 0x8ed3: 0xa0000000, - 0x8ed4: 0xa0000000, 0x8ed5: 0xa0000000, 0x8ed6: 0xa0000000, 0x8ed7: 0xa0000000, - 0x8ed8: 0xa0000000, 0x8ed9: 0xa0000000, 0x8eda: 0xa0000000, 0x8edb: 0xa0000000, - 0x8edc: 0xa0000000, 0x8edd: 0xa0000000, 0x8ede: 0xa0000000, 0x8edf: 0xa0000000, - 0x8ee0: 0x40021220, 0x8ee1: 0x4002ba20, 0x8ee2: 0x4003e020, 0x8ee3: 0x4004ea20, - 0x8ee4: 0x4027de20, 0x8ee5: 0x4004ec20, 0x8ee6: 0x4004e620, 0x8ee7: 0x4003d220, - 0x8ee8: 0x4003f420, 0x8ee9: 0x4003f620, 0x8eea: 0x4004d820, 0x8eeb: 0x40093820, - 0x8eec: 0x40024020, 0x8eed: 0x40021a20, 0x8eee: 0x4002e420, 0x8eef: 0x4004e220, - 0x8ef0: 0x4029cc20, 0x8ef1: 0x4029ce20, 0x8ef2: 0x4029d020, 0x8ef3: 0x4029d220, - 0x8ef4: 0x4029d420, 0x8ef5: 0x4029d620, 0x8ef6: 0x4029d820, 0x8ef7: 0x4029da20, - 0x8ef8: 0x4029dc20, 0x8ef9: 0x4029de20, 0x8efa: 0x40026c20, 0x8efb: 0x40026220, - 0x8efc: 0x40094020, 0x8efd: 0x40094220, 0x8efe: 0x40094420, 0x8eff: 0x4002c420, - // Block 0x23c, offset 0x8f00 - 0x8f00: 0x4004d620, 0x8f01: 0x002bde88, 0x8f02: 0x002c0a88, 0x8f03: 0xc3352741, - 0x8f04: 0x002c6288, 0x8f05: 0x002c9888, 0x8f06: 0x002d0888, 0x8f07: 0xc3392741, - 0x8f08: 0xc5402741, 0x8f09: 0x002d9a88, 0x8f0a: 0xc5442741, 0x8f0b: 0x002dfe88, - 0x8f0c: 0xc0030002, 0x8f0d: 0x002e8288, 0x8f0e: 0x002e9e88, 0x8f0f: 0x002ee288, - 0x8f10: 0x002f2c88, 0x8f11: 0x002f5688, 0x8f12: 0x002f7a88, 0x8f13: 0xc3432741, - 0x8f14: 0x00302c88, 0x8f15: 0xc34700d1, 0x8f16: 0x0030be88, 0x8f17: 0x0030e288, - 0x8f18: 0x0030f688, 0x8f19: 0x00310088, 0x8f1a: 0x00312a88, 0x8f1b: 0x4003f820, - 0x8f1c: 0x4004e420, 0x8f1d: 0x4003fa20, 0x8f1e: 0x40062420, 0x8f1f: 0x40021620, - 0x8f20: 0x40061e20, 0x8f21: 0x402bde20, 0x8f22: 0x402c0a20, 0x8f23: 0xc3332741, - 0x8f24: 0x402c6220, 0x8f25: 0x402c9820, 0x8f26: 0x402d0820, 0x8f27: 0xc3372741, - 0x8f28: 0xc53e2741, 0x8f29: 0x402d9a20, 0x8f2a: 0xc5422741, 0x8f2b: 0x402dfe20, - 0x8f2c: 0xc0000002, 0x8f2d: 0x402e8220, 0x8f2e: 0x402e9e20, 0x8f2f: 0x402ee220, - 0x8f30: 0x402f2c20, 0x8f31: 0x402f5620, 0x8f32: 0x402f7a20, 0x8f33: 0xc3412741, - 0x8f34: 0x40302c20, 0x8f35: 0xc34500d1, 0x8f36: 0x4030be20, 0x8f37: 0x4030e220, - 0x8f38: 0x4030f620, 0x8f39: 0x40310020, 0x8f3a: 0x40312a20, 0x8f3b: 0x4003fc20, - 0x8f3c: 0x40094820, 0x8f3d: 0x4003fe20, 0x8f3e: 0x40094c20, 0x8f3f: 0xa0000000, - // Block 0x23d, offset 0x8f40 - 0x8f40: 0xe0000983, 0x8f41: 0xe0000980, 0x8f42: 0xe00008fb, 0x8f43: 0xe00008f8, - 0x8f44: 0xe000097d, 0x8f45: 0xe000097a, 0x8f46: 0xe0000a38, 0x8f47: 0xe0000a35, - 0x8f48: 0x002c3c83, 0x8f49: 0x402c3c20, 0x8f4a: 0xe0000a4a, 0x8f4b: 0xe0000a47, - 0x8f4c: 0xe0000a44, 0x8f4d: 0xe0000a41, 0x8f4e: 0xe0000a86, 0x8f4f: 0xe0000a83, - 0x8f50: 0xe0000aaa, 0x8f51: 0xe0000aa7, 0x8f52: 0xe0000b46, 0x8f53: 0xe0000b43, - 0x8f54: 0xe0000aee, 0x8f55: 0xe0000aeb, 0x8f56: 0xe0000b2c, 0x8f57: 0xe0000b29, - 0x8f58: 0xe0000b40, 0x8f59: 0xe0000b3d, 0x8f5a: 0xe0000b1a, 0x8f5b: 0xe0000b17, - 0x8f5c: 0x002d2483, 0x8f5d: 0x402d2420, 0x8f5e: 0xe0000bb2, 0x8f5f: 0xe0000baf, - 0x8f60: 0xe0000bc4, 0x8f61: 0xe0000bc1, 0x8f62: 0xe0000bca, 0x8f63: 0xe0000bc7, - 0x8f64: 0x002d6a83, 0x8f65: 0x402d6a20, 0x8f66: 0xe0000c1b, 0x8f67: 0xe0000c18, - 0x8f68: 0xe0000c51, 0x8f69: 0xe0000c4e, 0x8f6a: 0xe0000c60, 0x8f6b: 0xe0000c5d, - 0x8f6c: 0xe0000c31, 0x8f6d: 0xe0000c2e, 0x8f6e: 0xe0000c5a, 0x8f6f: 0xe0000c57, - 0x8f70: 0xe0000c54, 0x8f71: 0x402da220, 0x8f72: 0xf0000a0a, 0x8f73: 0xf0000404, - 0x8f74: 0x002dce83, 0x8f75: 0x402dce20, 0x8f76: 0xe0000c9f, 0x8f77: 0xe0000c9c, - 0x8f78: 0x402f7220, 0x8f79: 0xe0000ccc, 0x8f7a: 0xe0000cc9, 0x8f7b: 0xe0000cd8, - 0x8f7c: 0xe0000cd5, 0x8f7d: 0xe0000cd2, 0x8f7e: 0xe0000ccf, 0x8f7f: 0xe0000d04, - // Block 0x23e, offset 0x8f80 - 0x8f80: 0xe0000cfe, 0x8f81: 0xe0000cf8, 0x8f82: 0xe0000cf5, 0x8f83: 0xe0000d51, - 0x8f84: 0xe0000d4e, 0x8f85: 0xe0000d6f, 0x8f86: 0xe0000d6c, 0x8f87: 0xe0000d5d, - 0x8f88: 0xe0000d5a, 0x8f89: 0xf0000404, 0x8f8a: 0x002eda88, 0x8f8b: 0x402eda20, - 0x8f8c: 0xe0000e2e, 0x8f8d: 0xe0000e2b, 0x8f8e: 0xe0000da0, 0x8f8f: 0xe0000d9d, - 0x8f90: 0xe0000de0, 0x8f91: 0xe0000ddd, 0x8f92: 0xe0000e93, 0x8f93: 0xe0000e8f, - 0x8f94: 0xe0000eca, 0x8f95: 0xe0000ec7, 0x8f96: 0xe0000edc, 0x8f97: 0xe0000ed9, - 0x8f98: 0xe0000ed0, 0x8f99: 0xe0000ecd, 0x8f9a: 0xe0000f1f, 0x8f9b: 0xe0000f1c, - 0x8f9c: 0x002fe883, 0x8f9d: 0x402fe820, 0x8f9e: 0xe0000f47, 0x8f9f: 0xe0000f44, - 0x8fa0: 0xe0000f33, 0x8fa1: 0xe0000f30, 0x8fa2: 0xe0000f99, 0x8fa3: 0xe0000f96, - 0x8fa4: 0xe0000f8a, 0x8fa5: 0xe0000f87, 0x8fa6: 0x00303688, 0x8fa7: 0x40303620, - 0x8fa8: 0xe000102b, 0x8fa9: 0xe0001028, 0x8faa: 0xe000103f, 0x8fab: 0xe000103c, - 0x8fac: 0x00306e83, 0x8fad: 0x40306e20, 0x8fae: 0xe0000ff9, 0x8faf: 0xe0000ff6, - 0x8fb0: 0xe0001025, 0x8fb1: 0xe0001022, 0x8fb2: 0xe0001039, 0x8fb3: 0xe0001036, - 0x8fb4: 0xe00010d8, 0x8fb5: 0xe00010d5, 0x8fb6: 0xe000110e, 0x8fb7: 0xe000110b, - 0x8fb8: 0xe0001117, 0x8fb9: 0xe000113b, 0x8fba: 0xe0001138, 0x8fbb: 0xe000114d, - 0x8fbc: 0xe000114a, 0x8fbd: 0xe0001147, 0x8fbe: 0xe0001144, 0x8fbf: 0xe0000f64, - // Block 0x23f, offset 0x8fc0 - 0x8fc0: 0xa0000000, 0x8fc1: 0xa0000000, 0x8fc2: 0xa0000000, 0x8fc3: 0xa0000000, - 0x8fc4: 0xa0000000, 0x8fc5: 0xa0000000, 0x8fc6: 0xa0000000, 0x8fc7: 0xa0000000, - 0x8fc8: 0xa0000000, 0x8fc9: 0x40020020, 0x8fca: 0x40020220, 0x8fcb: 0x40020420, - 0x8fcc: 0x40020620, 0x8fcd: 0x40020820, 0x8fce: 0xa0000000, 0x8fcf: 0xa0000000, - 0x8fd0: 0xa0000000, 0x8fd1: 0xa0000000, 0x8fd2: 0xa0000000, 0x8fd3: 0xa0000000, - 0x8fd4: 0xa0000000, 0x8fd5: 0xa0000000, 0x8fd6: 0xa0000000, 0x8fd7: 0xa0000000, - 0x8fd8: 0xa0000000, 0x8fd9: 0xa0000000, 0x8fda: 0xa0000000, 0x8fdb: 0xa0000000, - 0x8fdc: 0xa0000000, 0x8fdd: 0xa0000000, 0x8fde: 0xa0000000, 0x8fdf: 0xa0000000, - 0x8fe0: 0x40021220, 0x8fe1: 0x4002ba20, 0x8fe2: 0x4003e020, 0x8fe3: 0x4004ea20, - 0x8fe4: 0x4027de20, 0x8fe5: 0x4004ec20, 0x8fe6: 0x4004e620, 0x8fe7: 0x4003d220, - 0x8fe8: 0x4003f420, 0x8fe9: 0x4003f620, 0x8fea: 0x4004d820, 0x8feb: 0x40093820, - 0x8fec: 0x40024020, 0x8fed: 0x40021a20, 0x8fee: 0x4002e420, 0x8fef: 0x4004e220, - 0x8ff0: 0x4029cc20, 0x8ff1: 0x4029ce20, 0x8ff2: 0x4029d020, 0x8ff3: 0x4029d220, - 0x8ff4: 0x4029d420, 0x8ff5: 0x4029d620, 0x8ff6: 0x4029d820, 0x8ff7: 0x4029da20, - 0x8ff8: 0x4029dc20, 0x8ff9: 0x4029de20, 0x8ffa: 0x40026c20, 0x8ffb: 0x40026220, - 0x8ffc: 0x40094020, 0x8ffd: 0x40094220, 0x8ffe: 0x40094420, 0x8fff: 0x4002c420, - // Block 0x240, offset 0x9000 - 0x9000: 0x4004d620, 0x9001: 0x002bde88, 0x9002: 0x002c0a88, 0x9003: 0x002c3a88, - 0x9004: 0x002c6288, 0x9005: 0x002c9888, 0x9006: 0x002d0888, 0x9007: 0x002d2288, - 0x9008: 0x002d6888, 0x9009: 0x002d9a88, 0x900a: 0x002dcc88, 0x900b: 0x002dfe88, - 0x900c: 0xc0030002, 0x900d: 0x002e8288, 0x900e: 0xc5462761, 0x900f: 0x002ee288, - 0x9010: 0x002f2c88, 0x9011: 0x002f5688, 0x9012: 0x002f7a88, 0x9013: 0x002fe688, - 0x9014: 0x00302c88, 0x9015: 0x00306c88, 0x9016: 0x0030be88, 0x9017: 0x0030e288, - 0x9018: 0x0030f688, 0x9019: 0x00310088, 0x901a: 0x00312a88, 0x901b: 0x4003f820, - 0x901c: 0x4004e420, 0x901d: 0x4003fa20, 0x901e: 0x40062420, 0x901f: 0x40021620, - 0x9020: 0x40061e20, 0x9021: 0x402bde20, 0x9022: 0x402c0a20, 0x9023: 0x402c3a20, - 0x9024: 0x402c6220, 0x9025: 0x402c9820, 0x9026: 0x402d0820, 0x9027: 0x402d2220, - 0x9028: 0x402d6820, 0x9029: 0x402d9a20, 0x902a: 0x402dcc20, 0x902b: 0x402dfe20, - 0x902c: 0xc0000002, 0x902d: 0x402e8220, 0x902e: 0xc5332761, 0x902f: 0x402ee220, - 0x9030: 0x402f2c20, 0x9031: 0x402f5620, 0x9032: 0x402f7a20, 0x9033: 0x402fe620, - 0x9034: 0x40302c20, 0x9035: 0x40306c20, 0x9036: 0x4030be20, 0x9037: 0x4030e220, - 0x9038: 0x4030f620, 0x9039: 0x40310020, 0x903a: 0x40312a20, 0x903b: 0x4003fc20, - 0x903c: 0x40094820, 0x903d: 0x4003fe20, 0x903e: 0x40094c20, 0x903f: 0xa0000000, - // Block 0x241, offset 0x9040 - 0x9040: 0xe00008f5, 0x9041: 0xe00008ef, 0x9042: 0xe0000921, 0x9043: 0xe0000969, - 0x9044: 0xe000095b, 0x9045: 0xe000094d, 0x9046: 0xe00009dd, 0x9047: 0xe0000a53, - 0x9048: 0xe0000ae8, 0x9049: 0xe0000ae2, 0x904a: 0xe0000af4, 0x904b: 0xe0000b20, - 0x904c: 0xe0000c2b, 0x904d: 0xe0000c25, 0x904e: 0xe0000c37, 0x904f: 0xe0000c43, - 0x9050: 0xe0000ab3, 0x9051: 0x002ea083, 0x9052: 0xe0000d9a, 0x9053: 0xe0000d94, - 0x9054: 0xe0000da6, 0x9055: 0xe0000de6, 0x9056: 0xe0000dd2, 0x9057: 0x40093e20, - 0x9058: 0xe0000e12, 0x9059: 0xe0000fe1, 0x905a: 0xe0000fdb, 0x905b: 0xe0000fed, - 0x905c: 0xe0000fff, 0x905d: 0xe0001102, 0x905e: 0x00318888, 0x905f: 0xe0000f7b, - 0x9060: 0xe00008f2, 0x9061: 0xe00008ec, 0x9062: 0xe000091e, 0x9063: 0xe0000966, - 0x9064: 0xe0000958, 0x9065: 0xe000094a, 0x9066: 0xe00009d5, 0x9067: 0xe0000a4d, - 0x9068: 0xe0000ae5, 0x9069: 0xe0000adf, 0x906a: 0xe0000af1, 0x906b: 0xe0000b1d, - 0x906c: 0xe0000c28, 0x906d: 0xe0000c22, 0x906e: 0xe0000c34, 0x906f: 0xe0000c40, - 0x9070: 0xe0000aad, 0x9071: 0x402ea020, 0x9072: 0xe0000d97, 0x9073: 0xe0000d91, - 0x9074: 0xe0000da3, 0x9075: 0xe0000de3, 0x9076: 0xe0000dcf, 0x9077: 0x40093c20, - 0x9078: 0xe0000e0f, 0x9079: 0xe0000fde, 0x907a: 0xe0000fd8, 0x907b: 0xe0000fea, - 0x907c: 0xe0000ffc, 0x907d: 0xe00010ff, 0x907e: 0x40318820, 0x907f: 0xe0001114, - // Block 0x242, offset 0x9080 - 0x9080: 0xa0000000, 0x9081: 0xa0000000, 0x9082: 0xa0000000, 0x9083: 0xa0000000, - 0x9084: 0xa0000000, 0x9085: 0xa0000000, 0x9086: 0xa0000000, 0x9087: 0xa0000000, - 0x9088: 0xa0000000, 0x9089: 0x40020020, 0x908a: 0x40020220, 0x908b: 0x40020420, - 0x908c: 0x40020620, 0x908d: 0x40020820, 0x908e: 0xa0000000, 0x908f: 0xa0000000, - 0x9090: 0xa0000000, 0x9091: 0xa0000000, 0x9092: 0xa0000000, 0x9093: 0xa0000000, - 0x9094: 0xa0000000, 0x9095: 0xa0000000, 0x9096: 0xa0000000, 0x9097: 0xa0000000, - 0x9098: 0xa0000000, 0x9099: 0xa0000000, 0x909a: 0xa0000000, 0x909b: 0xa0000000, - 0x909c: 0xa0000000, 0x909d: 0xa0000000, 0x909e: 0xa0000000, 0x909f: 0xa0000000, - 0x90a0: 0x40021220, 0x90a1: 0x4002ba20, 0x90a2: 0x4003e020, 0x90a3: 0x4004ea20, - 0x90a4: 0x4027de20, 0x90a5: 0x4004ec20, 0x90a6: 0x4004e620, 0x90a7: 0x4003d220, - 0x90a8: 0x4003f420, 0x90a9: 0x4003f620, 0x90aa: 0x4004d820, 0x90ab: 0x40093820, - 0x90ac: 0x40024020, 0x90ad: 0x40021a20, 0x90ae: 0x4002e420, 0x90af: 0x4004e220, - 0x90b0: 0x4029cc20, 0x90b1: 0x4029ce20, 0x90b2: 0x4029d020, 0x90b3: 0x4029d220, - 0x90b4: 0x4029d420, 0x90b5: 0x4029d620, 0x90b6: 0x4029d820, 0x90b7: 0x4029da20, - 0x90b8: 0x4029dc20, 0x90b9: 0x4029de20, 0x90ba: 0x40026c20, 0x90bb: 0x40026220, - 0x90bc: 0x40094020, 0x90bd: 0x40094220, 0x90be: 0x40094420, 0x90bf: 0x4002c420, - // Block 0x243, offset 0x90c0 - 0x90c0: 0x4004d620, 0x90c1: 0xc5580071, 0x90c2: 0x002c0a88, 0x90c3: 0x002c3a88, - 0x90c4: 0x002c6288, 0x90c5: 0x002c9888, 0x90c6: 0x002d0888, 0x90c7: 0x002d2288, - 0x90c8: 0x002d6888, 0x90c9: 0x002d9a88, 0x90ca: 0x002dcc88, 0x90cb: 0x002dfe88, - 0x90cc: 0xc0030002, 0x90cd: 0x002e8288, 0x90ce: 0x002e9e88, 0x90cf: 0xc5532781, - 0x90d0: 0x002f2c88, 0x90d1: 0x002f5688, 0x90d2: 0x002f7a88, 0x90d3: 0xc54a0991, - 0x90d4: 0x00302c88, 0x90d5: 0xc55c0071, 0x90d6: 0x0030be88, 0x90d7: 0x0030bea3, - 0x90d8: 0x0030f688, 0x90d9: 0x00310088, 0x90da: 0xc54e0991, 0x90db: 0x4003f820, - 0x90dc: 0x4004e420, 0x90dd: 0x4003fa20, 0x90de: 0x40062420, 0x90df: 0x40021620, - 0x90e0: 0x40061e20, 0x90e1: 0xc5560071, 0x90e2: 0x402c0a20, 0x90e3: 0x402c3a20, - 0x90e4: 0x402c6220, 0x90e5: 0x402c9820, 0x90e6: 0x402d0820, 0x90e7: 0x402d2220, - 0x90e8: 0x402d6820, 0x90e9: 0x402d9a20, 0x90ea: 0x402dcc20, 0x90eb: 0x402dfe20, - 0x90ec: 0xc0000002, 0x90ed: 0x402e8220, 0x90ee: 0x402e9e20, 0x90ef: 0xc5502781, - 0x90f0: 0x402f2c20, 0x90f1: 0x402f5620, 0x90f2: 0x402f7a20, 0x90f3: 0xc5480991, - 0x90f4: 0x40302c20, 0x90f5: 0xc55a0071, 0x90f6: 0x4030be20, 0x90f7: 0x4030be21, - 0x90f8: 0x4030f620, 0x90f9: 0x40310020, 0x90fa: 0xc54c0991, 0x90fb: 0x4003fc20, - 0x90fc: 0x40094820, 0x90fd: 0x4003fe20, 0x90fe: 0x40094c20, 0x90ff: 0xa0000000, - // Block 0x244, offset 0x9100 - 0x9100: 0xe00008f5, 0x9101: 0xe00008ef, 0x9102: 0xe0000921, 0x9103: 0xe0000969, - 0x9104: 0x0030f083, 0x9105: 0xe000094d, 0x9106: 0xe00009dd, 0x9107: 0xe0000a53, - 0x9108: 0xe0000ae8, 0x9109: 0xe0000ae2, 0x910a: 0xe0000af4, 0x910b: 0xe0000b20, - 0x910c: 0xe0000c2b, 0x910d: 0xe0000c25, 0x910e: 0xe0000c37, 0x910f: 0xe0000c43, - 0x9110: 0xe0000ab3, 0x9111: 0xe0000d63, 0x9112: 0xe0000d9a, 0x9113: 0xe0000d94, - 0x9114: 0xe0000da6, 0x9115: 0x0030ee83, 0x9116: 0x0030f283, 0x9117: 0x40093e20, - 0x9118: 0xe0000e12, 0x9119: 0xe0000fe1, 0x911a: 0xe0000fdb, 0x911b: 0xe0000fed, - 0x911c: 0x0030f483, 0x911d: 0xe0001102, 0x911e: 0x00318888, 0x911f: 0xe0000f7b, - 0x9120: 0xe00008f2, 0x9121: 0xe00008ec, 0x9122: 0xe000091e, 0x9123: 0xe0000966, - 0x9124: 0x4030f020, 0x9125: 0xe000094a, 0x9126: 0xe00009d5, 0x9127: 0xe0000a4d, - 0x9128: 0xe0000ae5, 0x9129: 0xe0000adf, 0x912a: 0xe0000af1, 0x912b: 0xe0000b1d, - 0x912c: 0xe0000c28, 0x912d: 0xe0000c22, 0x912e: 0xe0000c34, 0x912f: 0xe0000c40, - 0x9130: 0xe0000aad, 0x9131: 0xe0000d60, 0x9132: 0xe0000d97, 0x9133: 0xe0000d91, - 0x9134: 0xe0000da3, 0x9135: 0x4030ee20, 0x9136: 0x4030f220, 0x9137: 0x40093c20, - 0x9138: 0xe0000e0f, 0x9139: 0xe0000fde, 0x913a: 0xe0000fd8, 0x913b: 0xe0000fea, - 0x913c: 0x4030f420, 0x913d: 0xe00010ff, 0x913e: 0x40318820, 0x913f: 0xe0001114, - // Block 0x245, offset 0x9140 - 0x9140: 0xe0000cfe, 0x9141: 0xe0000cf8, 0x9142: 0xe0000cf5, 0x9143: 0xe0000d51, - 0x9144: 0xe0000d4e, 0x9145: 0xe0000d6f, 0x9146: 0xe0000d6c, 0x9147: 0xe0000d5d, - 0x9148: 0xe0000d5a, 0x9149: 0xf0000404, 0x914a: 0x002eda88, 0x914b: 0x402eda20, - 0x914c: 0xe0000e2e, 0x914d: 0xe0000e2b, 0x914e: 0xe0000da0, 0x914f: 0xe0000d9d, - 0x9150: 0xe0000de0, 0x9151: 0xe0000ddd, 0x9152: 0xe0000e93, 0x9153: 0xe0000e8f, - 0x9154: 0xe0000eca, 0x9155: 0xe0000ec7, 0x9156: 0xe0000edc, 0x9157: 0xe0000ed9, - 0x9158: 0xe0000ed0, 0x9159: 0xe0000ecd, 0x915a: 0xe0000f1f, 0x915b: 0xe0000f1c, - 0x915c: 0xe0000f2d, 0x915d: 0xe0000f2a, 0x915e: 0xe0000f47, 0x915f: 0xe0000f44, - 0x9160: 0x00302683, 0x9161: 0x40302620, 0x9162: 0xe0000f99, 0x9163: 0xe0000f96, - 0x9164: 0xe0000f8a, 0x9165: 0xe0000f87, 0x9166: 0x00303688, 0x9167: 0x40303620, - 0x9168: 0xe000102b, 0x9169: 0xe0001028, 0x916a: 0xe000103f, 0x916b: 0xe000103c, - 0x916c: 0xe0000fe7, 0x916d: 0xe0000fe4, 0x916e: 0xe0000ff9, 0x916f: 0xe0000ff6, - 0x9170: 0xe0001025, 0x9171: 0xe0001022, 0x9172: 0xe0001039, 0x9173: 0xe0001036, - 0x9174: 0xe0003636, 0x9175: 0xe0003633, 0x9176: 0xe000110e, 0x9177: 0xe000110b, - 0x9178: 0xe0001117, 0x9179: 0xe000360c, 0x917a: 0xe0003609, 0x917b: 0xe0003618, - 0x917c: 0xe0003615, 0x917d: 0x00302a83, 0x917e: 0x40302a20, 0x917f: 0xe0000f64, - // Block 0x246, offset 0x9180 - 0x9180: 0x40321220, 0x9181: 0x40321a20, 0x9182: 0x40322220, 0x9183: 0x40322a20, - 0x9184: 0xe0000ad5, 0x9185: 0xe0000ad1, 0x9186: 0xe0000acd, 0x9187: 0xf0000a0a, - 0x9188: 0xf000040a, 0x9189: 0xf0000404, 0x918a: 0xf0000a0a, 0x918b: 0xf000040a, - 0x918c: 0xf0000404, 0x918d: 0xe0000947, 0x918e: 0xe0000944, 0x918f: 0xe0000c3d, - 0x9190: 0xe0000c3a, 0x9191: 0xe0000dcc, 0x9192: 0xe0000dc9, 0x9193: 0xe0000ff3, - 0x9194: 0xe0000ff0, 0x9195: 0xe000368d, 0x9196: 0xe000368a, 0x9197: 0xe000367b, - 0x9198: 0xe0003678, 0x9199: 0xe0003687, 0x919a: 0xe0003684, 0x919b: 0xe0003681, - 0x919c: 0xe000367e, 0x919d: 0x402cae20, 0x919e: 0xe000366f, 0x919f: 0xe000366c, - 0x91a0: 0xe0000976, 0x91a1: 0xe0000972, 0x91a2: 0xe00009f4, 0x91a3: 0xe00009ef, - 0x91a4: 0x002d3a88, 0x91a5: 0x402d3a20, 0x91a6: 0xe0000bbe, 0x91a7: 0xe0000bbb, - 0x91a8: 0xe0000c99, 0x91a9: 0xe0000c96, 0x91aa: 0xe0000e20, 0x91ab: 0xe0000e1d, - 0x91ac: 0xe0000e27, 0x91ad: 0xe0000e23, 0x91ae: 0xe0001162, 0x91af: 0xe000115f, - 0x91b0: 0xe0000c8d, 0x91b1: 0xe00032b0, 0x91b2: 0xe00032ad, 0x91b3: 0xe00032aa, - 0x91b4: 0xe0000bac, 0x91b5: 0xe0000ba9, 0x91b6: 0x002d7888, 0x91b7: 0x00319488, - 0x91b8: 0xe0000d57, 0x91b9: 0xe0000d54, 0x91ba: 0xe0000954, 0x91bb: 0xe0000950, - 0x91bc: 0xe00009ea, 0x91bd: 0xe00009e5, 0x91be: 0xe0000e19, 0x91bf: 0xe0000e15, - // Block 0x247, offset 0x91c0 - 0x91c0: 0xe000098f, 0x91c1: 0xe000098c, 0x91c2: 0xe0000995, 0x91c3: 0xe0000992, - 0x91c4: 0xe0000b62, 0x91c5: 0xe0000b5f, 0x91c6: 0xe0000b68, 0x91c7: 0xe0000b65, - 0x91c8: 0xe0000c6c, 0x91c9: 0xe0000c69, 0x91ca: 0xe0000c72, 0x91cb: 0xe0000c6f, - 0x91cc: 0xe0000e4a, 0x91cd: 0xe0000e47, 0x91ce: 0xe0000e50, 0x91cf: 0xe0000e4d, - 0x91d0: 0xe0000ee8, 0x91d1: 0xe0000ee5, 0x91d2: 0xe0000eee, 0x91d3: 0xe0000eeb, - 0x91d4: 0xe0001053, 0x91d5: 0xe0001050, 0x91d6: 0xe0001059, 0x91d7: 0xe0001056, - 0x91d8: 0xe0000f61, 0x91d9: 0xe0000f5e, 0x91da: 0xe0000fa5, 0x91db: 0xe0000fa2, - 0x91dc: 0x00312288, 0x91dd: 0x40312220, 0x91de: 0xe0000bf4, 0x91df: 0xe0000bf1, - 0x91e0: 0x002ebc88, 0x91e1: 0x402c8c20, 0x91e2: 0x002f2288, 0x91e3: 0x402f2220, - 0x91e4: 0x00314088, 0x91e5: 0x40314020, 0x91e6: 0xe000096f, 0x91e7: 0xe000096c, - 0x91e8: 0xe0000b32, 0x91e9: 0xe0000b2f, 0x91ea: 0xe0003675, 0x91eb: 0xe0003672, - 0x91ec: 0xe0003663, 0x91ed: 0xe0003660, 0x91ee: 0xe0000e04, 0x91ef: 0xe0000e01, - 0x91f0: 0xe0000e0b, 0x91f1: 0xe0000e07, 0x91f2: 0xe0001129, 0x91f3: 0xe0001126, - 0x91f4: 0x402e5e20, 0x91f5: 0x402ed020, 0x91f6: 0x40305a20, 0x91f7: 0x402dd420, - 0x91f8: 0xe0000abf, 0x91f9: 0xe0000ec4, 0x91fa: 0x002be888, 0x91fb: 0x002c4488, - 0x91fc: 0x402c4420, 0x91fd: 0x002e3888, 0x91fe: 0x00303e88, 0x91ff: 0x402ffc20, - // Block 0x248, offset 0x9200 - 0x9200: 0xe0000d24, 0x9201: 0xe0000d21, 0x9202: 0xe0000d2a, 0x9203: 0xe0000d27, - 0x9204: 0xe0000d69, 0x9205: 0xe0000d66, 0x9206: 0xe0000d7b, 0x9207: 0xe0000d78, - 0x9208: 0xe0000d87, 0x9209: 0xe0000d84, 0x920a: 0xe0000d81, 0x920b: 0xe0000d7e, - 0x920c: 0xe0003651, 0x920d: 0xe000364e, 0x920e: 0xe000365d, 0x920f: 0xe000365a, - 0x9210: 0xe0000e3d, 0x9211: 0xe0000e39, 0x9212: 0xe0000e35, 0x9213: 0xe0000e31, - 0x9214: 0xe0000ea7, 0x9215: 0xe0000ea4, 0x9216: 0xe0000ead, 0x9217: 0xe0000eaa, - 0x9218: 0xe0000ed6, 0x9219: 0xe0000ed3, 0x921a: 0xe0000ef4, 0x921b: 0xe0000ef1, - 0x921c: 0xe0000efb, 0x921d: 0xe0000ef7, 0x921e: 0xe0000f02, 0x921f: 0xe0000eff, - 0x9220: 0xe0000f41, 0x9221: 0xe0000f3e, 0x9222: 0xe0000f53, 0x9223: 0xe0000f50, - 0x9224: 0xe0000f26, 0x9225: 0xe0000f22, 0x9226: 0xe0003606, 0x9227: 0xe0003603, - 0x9228: 0xe0000f5a, 0x9229: 0xe0000f56, 0x922a: 0xe0000f93, 0x922b: 0xe0000f90, - 0x922c: 0xe0000f9f, 0x922d: 0xe0000f9c, 0x922e: 0xe0000fb1, 0x922f: 0xe0000fae, - 0x9230: 0xe0000fab, 0x9231: 0xe0000fa8, 0x9232: 0xe0001093, 0x9233: 0xe0001090, - 0x9234: 0xe000109f, 0x9235: 0xe000109c, 0x9236: 0xe0001099, 0x9237: 0xe0001096, - 0x9238: 0xe0001032, 0x9239: 0xe000102e, 0x923a: 0xe000368d, 0x923b: 0xe000368a, - 0x923c: 0xe00010a9, 0x923d: 0xe00010a6, 0x923e: 0xe00010af, 0x923f: 0xe00010ac, - // Block 0x249, offset 0x9240 - 0x9240: 0xe0003630, 0x9241: 0xe000362d, 0x9242: 0xe000362a, 0x9243: 0xe0003627, - 0x9244: 0xe000363f, 0x9245: 0xe000363c, 0x9246: 0xe0003645, 0x9247: 0xe0003642, - 0x9248: 0xe000364b, 0x9249: 0xe0003648, 0x924a: 0xe00010fc, 0x924b: 0xe00010f9, - 0x924c: 0xe00010f6, 0x924d: 0xe00010f3, 0x924e: 0xe0001123, 0x924f: 0xe0001120, - 0x9250: 0xe0003612, 0x9251: 0xe000360f, 0x9252: 0xe000361e, 0x9253: 0xe000361b, - 0x9254: 0xe0003624, 0x9255: 0xe0003621, 0x9256: 0xe0000c15, 0x9257: 0xe0000f8d, - 0x9258: 0xe0003639, 0x9259: 0xe0001111, 0x925a: 0xf0000404, 0x925b: 0xe0000f70, - 0x925c: 0x40300420, 0x925d: 0x40300620, 0x925e: 0xe0000f7f, 0x925f: 0x402c9620, - 0x9260: 0xe000099b, 0x9261: 0xe0000998, 0x9262: 0xe0000989, 0x9263: 0xe0000986, - 0x9264: 0xe0000928, 0x9265: 0xe0000924, 0x9266: 0xe0000930, 0x9267: 0xe000092c, - 0x9268: 0xe0000940, 0x9269: 0xe000093c, 0x926a: 0xe0000938, 0x926b: 0xe0000934, - 0x926c: 0xe00009aa, 0x926d: 0xe00009a6, 0x926e: 0xe0000902, 0x926f: 0xe00008fe, - 0x9270: 0xe000090a, 0x9271: 0xe0000906, 0x9272: 0xe000091a, 0x9273: 0xe0000916, - 0x9274: 0xe0000912, 0x9275: 0xe000090e, 0x9276: 0xe00009a2, 0x9277: 0xe000099e, - 0x9278: 0xe0000b6e, 0x9279: 0xe0000b6b, 0x927a: 0xe0000b5c, 0x927b: 0xe0000b59, - 0x927c: 0xe0000b26, 0x927d: 0xe0000b23, 0x927e: 0xe0000afb, 0x927f: 0xe0000af7, - // Block 0x24a, offset 0x9280 - 0x9280: 0xe0000b03, 0x9281: 0xe0000aff, 0x9282: 0xe0000b13, 0x9283: 0xe0000b0f, - 0x9284: 0xe0000b0b, 0x9285: 0xe0000b07, 0x9286: 0xe0000b75, 0x9287: 0xe0000b71, - 0x9288: 0xe0000c66, 0x9289: 0xe0000c63, 0x928a: 0xe0000c78, 0x928b: 0xe0000c75, - 0x928c: 0xe0000e84, 0x928d: 0xe0000e81, 0x928e: 0xe0000e44, 0x928f: 0xe0000e41, - 0x9290: 0xe0000dad, 0x9291: 0xe0000da9, 0x9292: 0xe0000db5, 0x9293: 0xe0000db1, - 0x9294: 0xe0000dc5, 0x9295: 0xe0000dc1, 0x9296: 0xe0003657, 0x9297: 0xe0003654, - 0x9298: 0xe0000e8b, 0x9299: 0xe0000e87, 0x929a: 0xe0000e5d, 0x929b: 0xe0000e59, - 0x929c: 0xe0000e65, 0x929d: 0xe0000e61, 0x929e: 0xe0000e75, 0x929f: 0xe0000e71, - 0x92a0: 0xe0003669, 0x92a1: 0xe0003666, 0x92a2: 0xe0000e7d, 0x92a3: 0xe0000e79, - 0x92a4: 0xe000108d, 0x92a5: 0xe000108a, 0x92a6: 0xe000104d, 0x92a7: 0xe000104a, - 0x92a8: 0xe0001066, 0x92a9: 0xe0001062, 0x92aa: 0xe000106e, 0x92ab: 0xe000106a, - 0x92ac: 0xe000107e, 0x92ad: 0xe000107a, 0x92ae: 0xe0001076, 0x92af: 0xe0001072, - 0x92b0: 0xe0001086, 0x92b1: 0xe0001082, 0x92b2: 0xe0001108, 0x92b3: 0xe0001105, - 0x92b4: 0xe0001135, 0x92b5: 0xe0001132, 0x92b6: 0xe000112f, 0x92b7: 0xe000112c, - 0x92b8: 0xe000111d, 0x92b9: 0xe000111a, 0x92ba: 0xe0000d0a, 0x92bb: 0xe0000d07, - 0x92bc: 0x0030d888, 0x92bd: 0x4030d820, 0x92be: 0x00312088, 0x92bf: 0x40312020, - // Block 0x24b, offset 0x92c0 - 0x92c0: 0xe0000024, 0x92c1: 0xe0000029, 0x92c2: 0xe000002e, 0x92c3: 0xe0000033, - 0x92c4: 0xe0000038, 0x92c5: 0xe000003d, 0x92c6: 0xe0000042, 0x92c7: 0xe0000047, - 0x92c8: 0xf0001f04, 0x92c9: 0xf0001f04, 0x92ca: 0xf0001f04, 0x92cb: 0xf0001f04, - 0x92cc: 0xf0001f04, 0x92cd: 0xf0001f04, 0x92ce: 0xf0001f04, 0x92cf: 0xf0001f04, - 0x92d0: 0xf0001f04, 0x92d1: 0xf0000404, 0x92d2: 0xf0000404, 0x92d3: 0xf0000404, - 0x92d4: 0xf0000404, 0x92d5: 0xf0000404, 0x92d6: 0xf0000404, 0x92d7: 0xf0000404, - 0x92d8: 0xf0000404, 0x92d9: 0xf0000404, 0x92da: 0xf0000404, 0x92db: 0xf0000404, - 0x92dc: 0xf0000404, 0x92dd: 0xf0000404, 0x92de: 0xf0000404, 0x92df: 0xf0000404, - 0x92e0: 0xf0000404, 0x92e1: 0xf0000404, 0x92e2: 0xf0000404, 0x92e3: 0xf0000404, - 0x92e4: 0xf0000404, 0x92e5: 0xf0000404, 0x92e6: 0xf0000404, 0x92e7: 0xf0000404, - 0x92e8: 0xf0000404, 0x92e9: 0xf0000404, 0x92ea: 0xf0000404, 0x92eb: 0xf0000404, - 0x92ec: 0xf0000404, 0x92ed: 0xf0000404, 0x92ee: 0xf0000404, 0x92ef: 0xf0000404, - 0x92f0: 0xf0000404, 0x92f1: 0xf0000404, 0x92f2: 0xe0002c46, 0x92f3: 0xf0000404, - 0x92f4: 0xf0000404, 0x92f5: 0xe0002c56, 0x92f6: 0x002bde8c, 0x92f7: 0x002c0a8c, - 0x92f8: 0x002c3a8c, 0x92f9: 0x002c628c, 0x92fa: 0x002c988c, 0x92fb: 0x002d088c, - 0x92fc: 0x002d228c, 0x92fd: 0x002d688c, 0x92fe: 0x002d9a8c, 0x92ff: 0x002dcc8c, - // Block 0x24c, offset 0x9300 - 0x9300: 0xf0001d1c, 0x9301: 0xf0001d1c, 0x9302: 0xf0001d1c, 0x9303: 0xf0001d1c, - 0x9304: 0xf0001d1c, 0x9305: 0xf0001d1d, 0x9306: 0xf0001d1d, 0x9307: 0xf0001d1d, - 0x9308: 0xe0000a6b, 0x9309: 0xe0000cb4, 0x930a: 0xf0001d1c, 0x930b: 0xf0001d1c, - 0x930c: 0xf0001d1c, 0x930d: 0xf0001c1c, 0x930e: 0xf0001c1c, 0x930f: 0xf0001c1c, - 0x9310: 0xe00027ce, 0x9311: 0xe0000cb9, 0x9312: 0xe0000d36, 0x9313: 0xe0000be3, - 0x9314: 0xe0000fc5, 0x9315: 0xf0001c1c, 0x9316: 0xf0001c1c, 0x9317: 0xf0001c1c, - 0x9318: 0xf0001c1c, 0x9319: 0xf0001c1c, 0x931a: 0xf0001c1c, 0x931b: 0xf0001c1c, - 0x931c: 0xf0001c1c, 0x931d: 0xf0001c1c, 0x931e: 0xf0001c1c, 0x931f: 0xe0000d3e, - 0x9320: 0xe0000a72, 0x9321: 0xf0001c1c, 0x9322: 0xe0000cbd, 0x9323: 0xe0000d42, - 0x9324: 0xe0000a76, 0x9325: 0xf0001c1c, 0x9326: 0xe0000cc1, 0x9327: 0xe0000d2d, - 0x9328: 0xe0000d31, 0x9329: 0xf0001c1d, 0x932a: 0xe0000cc5, 0x932b: 0xe0000d4a, - 0x932c: 0xe0000be7, 0x932d: 0xe0000f0b, 0x932e: 0xe0000f0f, 0x932f: 0xe0000f15, - 0x9330: 0xf0001c1c, 0x9331: 0xf0001c1c, 0x9332: 0xf0001c1c, 0x9333: 0xf0001c1c, - 0x9334: 0xf0001d1c, 0x9335: 0xf0001d1c, 0x9336: 0xf0001d1c, 0x9337: 0xf0001d1c, - 0x9338: 0xf0001d1c, 0x9339: 0xf0001d1d, 0x933a: 0xe00035df, 0x933b: 0xe00035cd, - 0x933c: 0xe0003600, 0x933d: 0xe00035af, 0x933e: 0xe0002812, 0x933f: 0xe00035b2, - // Block 0x24d, offset 0x9340 - 0x9340: 0xf0001d1c, 0x9341: 0xf0001d1d, 0x9342: 0xe00009b7, 0x9343: 0xf0001c1d, - 0x9344: 0xf0001c1c, 0x9345: 0xf0001c1c, 0x9346: 0xe0000a66, 0x9347: 0xe0000a7a, - 0x9348: 0xf0001d1c, 0x9349: 0xf0001c1d, 0x934a: 0xf0001c1c, 0x934b: 0xf0001d1d, - 0x934c: 0xf0001c1c, 0x934d: 0xf0001d1d, 0x934e: 0xf0001d1d, 0x934f: 0xf0001c1c, - 0x9350: 0xf0001c1c, 0x9351: 0xf0001c1c, 0x9352: 0xe0000d0d, 0x9353: 0xf0001c1c, - 0x9354: 0xf0001c1c, 0x9355: 0xe0000d3a, 0x9356: 0xe0000d46, 0x9357: 0xf0001d1d, - 0x9358: 0xe0000eb0, 0x9359: 0xe0000eb8, 0x935a: 0xf0001d1d, 0x935b: 0xf0001c1c, - 0x935c: 0xf0001c1d, 0x935d: 0xe00035e2, 0x935e: 0xe00010b2, 0x935f: 0xe00009c8, - 0x9360: 0xf0001f04, 0x9361: 0xf0001f04, 0x9362: 0xf0001f04, 0x9363: 0xf0001f04, - 0x9364: 0xf0001f04, 0x9365: 0xf0001f04, 0x9366: 0xf0001f04, 0x9367: 0xf0001f04, - 0x9368: 0xf0001f04, 0x9369: 0xf0000404, 0x936a: 0xf0000404, 0x936b: 0xf0000404, - 0x936c: 0xf0000404, 0x936d: 0xf0000404, 0x936e: 0xf0000404, 0x936f: 0xf0000404, - 0x9370: 0xf0000404, 0x9371: 0xf0000404, 0x9372: 0xf0000404, 0x9373: 0xf0000404, - 0x9374: 0xf0000404, 0x9375: 0xf0000404, 0x9376: 0xf0000404, 0x9377: 0xf0000404, - 0x9378: 0xf0000404, 0x9379: 0xf0000404, 0x937a: 0xf0000404, 0x937b: 0xf0000404, - 0x937c: 0xf0000404, 0x937d: 0xf0000404, 0x937e: 0xf0000404, 0x937f: 0xe0000bdf, - // Block 0x24e, offset 0x9380 - 0x9380: 0xf0001f04, 0x9381: 0xf0001f04, 0x9382: 0xf0001f04, 0x9383: 0xf0001f04, - 0x9384: 0xf0001f04, 0x9385: 0xf0001f04, 0x9386: 0xf0001f04, 0x9387: 0xf0001f04, - 0x9388: 0xf0001f04, 0x9389: 0xf0001f04, 0x938a: 0xf0001f04, - 0x9390: 0xf0000a04, 0x9391: 0xf0000a04, 0x9392: 0xf0000a04, 0x9393: 0xf0000a04, - 0x9394: 0xf0000a04, 0x9395: 0xf0000a04, 0x9396: 0xf0000a04, 0x9397: 0xf0000a04, - 0x9398: 0xf0000a04, 0x9399: 0xf0000a04, 0x939a: 0xf0000a04, 0x939b: 0xf0000a04, - 0x939c: 0xf0000a04, 0x939d: 0xf0000a04, 0x939e: 0xf0000a04, 0x939f: 0xf0000a04, - 0x93a0: 0xf0000a04, 0x93a1: 0xf0000a04, 0x93a2: 0xf0000a04, 0x93a3: 0xf0000a04, - 0x93a4: 0xf0000a04, 0x93a5: 0xf0000a04, 0x93a6: 0xe0002c4a, 0x93a7: 0xf0000a04, - 0x93a8: 0xf0000a04, 0x93a9: 0xe0002c5a, 0x93aa: 0xf0000a04, 0x93ab: 0x002c3a8c, - 0x93ac: 0x002f7a8c, 0x93ad: 0xf0000c0c, 0x93ae: 0xe00035e8, - 0x93b0: 0x002bde9d, 0x93b1: 0x002c0a9d, 0x93b2: 0x002c3a9d, 0x93b3: 0x002c629d, - 0x93b4: 0x002c989d, 0x93b5: 0x002d089d, 0x93b6: 0x002d229d, 0x93b7: 0x002d689d, - 0x93b8: 0x002d9a9d, 0x93b9: 0x002dcc9d, 0x93ba: 0x002dfe9d, 0x93bb: 0x002e229d, - 0x93bc: 0x002e829d, 0x93bd: 0x002e9e9d, 0x93be: 0x002ee29d, 0x93bf: 0x002f2c9d, - // Block 0x24f, offset 0x93c0 - 0x93c0: 0x002f569d, 0x93c1: 0x002f7a9d, 0x93c2: 0x002fe69d, 0x93c3: 0x00302c9d, - 0x93c4: 0x00306c9d, 0x93c5: 0x0030be9d, 0x93c6: 0x0030e29d, 0x93c7: 0x0030f69d, - 0x93c8: 0x0031009d, 0x93c9: 0x00312a9d, 0x93ca: 0xf0001d1d, 0x93cb: 0xf0001d1d, - 0x93cc: 0xf0001d1d, 0x93cd: 0xf0001d1d, 0x93ce: 0xe0000ebc, 0x93cf: 0xe00035e5, - 0x93d0: 0x002bde8c, 0x93d1: 0x002c0a8c, 0x93d2: 0x002c3a8c, 0x93d3: 0x002c628c, - 0x93d4: 0x002c988c, 0x93d5: 0x002d088c, 0x93d6: 0x002d228c, 0x93d7: 0x002d688c, - 0x93d8: 0x002d9a8c, 0x93d9: 0x002dcc8c, 0x93da: 0x002dfe8c, 0x93db: 0x002e228c, - 0x93dc: 0x002e828c, 0x93dd: 0x002e9e8c, 0x93de: 0x002ee28c, 0x93df: 0x002f2c8c, - 0x93e0: 0x002f568c, 0x93e1: 0x002f7a8c, 0x93e2: 0x002fe68c, 0x93e3: 0x00302c8c, - 0x93e4: 0x00306c8c, 0x93e5: 0x0030be8c, 0x93e6: 0x0030e28c, 0x93e7: 0x0030f68c, - 0x93e8: 0x0031008c, 0x93e9: 0x00312a8c, 0x93ea: 0xf0001414, 0x93eb: 0xf0001414, - 0x93f0: 0x002bde9d, 0x93f1: 0x002c0a9d, 0x93f2: 0x002c3a9d, 0x93f3: 0x002c629d, - 0x93f4: 0x002c989d, 0x93f5: 0x002d089d, 0x93f6: 0x002d229d, 0x93f7: 0x002d689d, - 0x93f8: 0x002d9a9d, 0x93f9: 0x002dcc9d, 0x93fa: 0x002dfe9d, 0x93fb: 0x002e229d, - 0x93fc: 0x002e829d, 0x93fd: 0x002e9e9d, 0x93fe: 0x002ee29d, 0x93ff: 0x002f2c9d, - // Block 0x250, offset 0x9400 - 0x9400: 0xa0000000, 0x9401: 0xa0000000, 0x9402: 0xa0000000, 0x9403: 0xa0000000, - 0x9404: 0xa0000000, 0x9406: 0x40096620, 0x9407: 0x40096a20, - 0x9408: 0x40070820, 0x9409: 0x4004f220, 0x940a: 0x4004f620, 0x940b: 0x4027e620, - 0x940c: 0x40024820, 0x940d: 0x40024a20, 0x940e: 0x40070e20, 0x940f: 0x40071020, - 0x9410: 0xae600000, 0x9411: 0xae600000, 0x9412: 0xae600000, 0x9413: 0xae600000, - 0x9414: 0xae600000, 0x9415: 0xae600000, 0x9416: 0xae600000, 0x9417: 0xae600000, - 0x9418: 0xa1e00000, 0x9419: 0xa1f00000, 0x941a: 0xa2000000, 0x941b: 0x40026420, - 0x941e: 0x40027020, 0x941f: 0x4002cc20, - 0x9420: 0x403aa220, 0x9421: 0x40393a20, 0x9422: 0x40393620, 0x9423: 0x40393a21, - 0x9424: 0x40393a25, 0x9425: 0x40393a23, 0x9426: 0x00393b44, 0x9427: 0xc55e0151, - 0x9428: 0x40393c20, 0x9429: 0x403a8823, 0x942a: 0x40395620, 0x942b: 0x40395820, - 0x942c: 0x40396420, 0x942d: 0x40397220, 0x942e: 0x40397420, 0x942f: 0x40398820, - 0x9430: 0x40398a20, 0x9431: 0x4039a420, 0x9432: 0x4039a620, 0x9433: 0x4039c620, - 0x9434: 0x4039c820, 0x9435: 0x4039dc20, 0x9436: 0x4039de20, 0x9437: 0x4039e620, - 0x9438: 0x4039e820, 0x9439: 0x4039ee20, 0x943a: 0x4039f020, 0x943b: 0x403a3820, - 0x943c: 0x403a3a20, 0x943d: 0x403a9c20, 0x943e: 0x403a9e20, 0x943f: 0x403aa020, - // Block 0x251, offset 0x9440 - 0x9440: 0xa0000000, 0x9441: 0x4039fc20, 0x9442: 0x403a1220, 0x9443: 0x403a1c23, - 0x9444: 0x403a4020, 0x9445: 0x403a4e20, 0x9446: 0x403a5620, 0x9447: 0x403a8820, - 0x9448: 0xc5620171, 0x9449: 0xc5660171, 0x944a: 0xc5680171, 0x944b: 0xa000b002, - 0x944c: 0xa000b202, 0x944d: 0xa000b102, 0x944e: 0xa1e0ad02, 0x944f: 0xa000af02, - 0x9450: 0xa000ae02, 0x9451: 0xa210ba02, 0x9452: 0xa220bc02, 0x9453: 0xae60bd02, - 0x9454: 0xae60be02, 0x9455: 0xadc0bf02, 0x9456: 0xadc0c102, 0x9457: 0xae60c202, - 0x9458: 0xae60c302, 0x9459: 0xae60c402, 0x945a: 0xae60c502, 0x945b: 0xae60c602, - 0x945c: 0xadc0c702, 0x945d: 0xae60c802, 0x945e: 0xae60c902, 0x945f: 0xadc0c002, - 0x9460: 0xe000015e, 0x9461: 0xe00001e6, 0x9462: 0xe0000301, 0x9463: 0xe00003db, - 0x9464: 0xe00004b6, 0x9465: 0xe0000580, 0x9466: 0xe000064b, 0x9467: 0xe00006f3, - 0x9468: 0xe000079f, 0x9469: 0xe0000844, 0x946a: 0x4004ee20, 0x946b: 0x40024c20, - 0x946c: 0x40024e20, 0x946d: 0x4004de20, 0x946e: 0x40393a20, 0x946f: 0x403a1020, - 0x9470: 0xa230d102, 0x9471: 0x40393821, 0x9472: 0x40393a22, 0x9473: 0x40393a24, - 0x9474: 0x00391c84, 0x9475: 0xf0000404, 0x9476: 0xf0000404, 0x9477: 0xf0000404, - 0x9478: 0xe0003780, 0x9479: 0x40395a20, 0x947a: 0x40395c20, 0x947b: 0x40393e20, - 0x947c: 0x40395e20, 0x947d: 0x40396020, 0x947e: 0x40394020, 0x947f: 0x40396220, - // Block 0x252, offset 0x9480 - 0x9480: 0x40394220, 0x9481: 0x40397620, 0x9482: 0x40397820, 0x9483: 0x40396620, - 0x9484: 0x40396820, 0x9485: 0x40397a20, 0x9486: 0x40396a20, 0x9487: 0x40396e20, - 0x9488: 0x40398c20, 0x9489: 0x40398e20, 0x948a: 0x40399020, 0x948b: 0x40399220, - 0x948c: 0x40399420, 0x948d: 0x40399620, 0x948e: 0x40399820, 0x948f: 0x40399a20, - 0x9490: 0x40399c20, 0x9491: 0x4039a820, 0x9492: 0x4039aa20, 0x9493: 0x4039ac20, - 0x9494: 0x4039ae20, 0x9495: 0x4039b020, 0x9496: 0x4039b220, 0x9497: 0x4039b420, - 0x9498: 0x4039b620, 0x9499: 0x4039b820, 0x949a: 0x4039ca20, 0x949b: 0x4039cc20, - 0x949c: 0x4039ce20, 0x949d: 0x4039e020, 0x949e: 0x4039e220, 0x949f: 0x4039ea20, - 0x94a0: 0x4039f220, 0x94a1: 0x4039fe20, 0x94a2: 0x403a0020, 0x94a3: 0x403a0220, - 0x94a4: 0x403a0420, 0x94a5: 0x403a0820, 0x94a6: 0x403a0a20, 0x94a7: 0x403a1420, - 0x94a8: 0x403a1620, 0x94a9: 0x403a1c20, 0x94aa: 0x403a1c21, 0x94ab: 0x403a1c22, - 0x94ac: 0x403a1c24, 0x94ad: 0x403a1c25, 0x94ae: 0x403a1c26, 0x94af: 0x403a2a20, - 0x94b0: 0x403a2c20, 0x94b1: 0x403a2e20, 0x94b2: 0x403a3020, 0x94b3: 0x403a3220, - 0x94b4: 0x403a3420, 0x94b5: 0x403a4220, 0x94b6: 0x403a4420, 0x94b7: 0x403a4620, - 0x94b8: 0x403a4820, 0x94b9: 0x403a6020, 0x94ba: 0x403a5820, 0x94bb: 0x403a5a20, - 0x94bc: 0x403a5c20, 0x94bd: 0x403a5e20, 0x94be: 0x403a8826, 0x94bf: 0x40396c20, - // Block 0x253, offset 0x94c0 - 0x94c0: 0x403a8825, 0x94c1: 0x403a8822, 0x94c2: 0xe0003777, 0x94c3: 0x403a8824, - 0x94c4: 0x403a7620, 0x94c5: 0x403a7820, 0x94c6: 0x403a7a20, 0x94c7: 0x403a7c20, - 0x94c8: 0x403a7e20, 0x94c9: 0x403a8020, 0x94ca: 0x403a8220, 0x94cb: 0x403a8420, - 0x94cc: 0xc5640171, 0x94cd: 0x403a9226, 0x94ce: 0x403a9227, 0x94cf: 0x403a8620, - 0x94d0: 0x403a9224, 0x94d1: 0x403a9225, 0x94d2: 0x403a9222, 0x94d3: 0xe00037b6, - 0x94d4: 0x4002e820, 0x94d5: 0xc56a0171, 0x94d6: 0xae600000, 0x94d7: 0xae600000, - 0x94d8: 0xae600000, 0x94d9: 0xae600000, 0x94da: 0xae600000, 0x94db: 0xae600000, - 0x94dc: 0xae600000, 0x94dd: 0xa0000000, 0x94de: 0x40071220, 0x94df: 0xae600000, - 0x94e0: 0xae600000, 0x94e1: 0xae600000, 0x94e2: 0xae600000, 0x94e3: 0xadc00000, - 0x94e4: 0xae600000, 0x94e5: 0x003a7484, 0x94e6: 0x003a9084, 0x94e7: 0xae600000, - 0x94e8: 0xae600000, 0x94e9: 0x40071420, 0x94ea: 0xadc00000, 0x94eb: 0xae600000, - 0x94ec: 0xae600000, 0x94ed: 0xadc00000, 0x94ee: 0x40399e20, 0x94ef: 0x4039ba20, - 0x94f0: 0xe0000161, 0x94f1: 0xe00001e9, 0x94f2: 0xe0000304, 0x94f3: 0xe00003de, - 0x94f4: 0xe00004b9, 0x94f5: 0xe0000583, 0x94f6: 0xe000064e, 0x94f7: 0xe00006f6, - 0x94f8: 0xe00007a2, 0x94f9: 0xe0000847, 0x94fa: 0x4039d020, 0x94fb: 0x4039e420, - 0x94fc: 0x4039f420, 0x94fd: 0xe0001553, 0x94fe: 0xe0001779, 0x94ff: 0x403a7020, - // Block 0x254, offset 0x9500 - 0x9500: 0x00396e97, 0x9501: 0x00396e98, 0x9502: 0x0039969a, 0x9503: 0x00399699, - 0x9504: 0x0039949a, 0x9505: 0x00399499, 0x9506: 0x0039989a, 0x9507: 0x00399899, - 0x9508: 0x00398c9a, 0x9509: 0x00398c99, 0x950a: 0x0039b69a, 0x950b: 0x0039b699, - 0x950c: 0x0039a89a, 0x950d: 0x0039a899, 0x950e: 0x003a1c9a, 0x950f: 0x003a1c99, - 0x9510: 0x003a1c97, 0x9511: 0x003a1c98, 0x9512: 0x003a2a9a, 0x9513: 0x003a2a99, - 0x9514: 0x003a2a97, 0x9515: 0x003a2a98, 0x9516: 0x003a329a, 0x9517: 0x003a3299, - 0x9518: 0x003a3297, 0x9519: 0x003a3298, 0x951a: 0x003a2e9a, 0x951b: 0x003a2e99, - 0x951c: 0x003a2e97, 0x951d: 0x003a2e98, 0x951e: 0x003a589a, 0x951f: 0x003a5899, - 0x9520: 0x003a5a9a, 0x9521: 0x003a5a99, 0x9522: 0x003a5a97, 0x9523: 0x003a5a98, - 0x9524: 0xe0003774, 0x9525: 0xe0003771, 0x9526: 0x003a6c9a, 0x9527: 0x003a6c99, - 0x9528: 0x003a6c97, 0x9529: 0x003a6c98, 0x952a: 0x003a6a9a, 0x952b: 0x003a6a99, - 0x952c: 0x003a6a97, 0x952d: 0x003a6a98, 0x952e: 0x003aaa9a, 0x952f: 0x003aaa99, - 0x9530: 0xe00037bc, 0x9531: 0xe00037b9, 0x9532: 0x40071820, 0x9533: 0x40071a20, - 0x9534: 0x40071c20, 0x9535: 0x40071e20, 0x9536: 0x40072020, 0x9537: 0x40072220, - 0x9538: 0x40072420, 0x9539: 0x40072620, 0x953a: 0x40072820, 0x953b: 0x40072a20, - 0x953c: 0x40072c20, 0x953d: 0x40072e20, 0x953e: 0x40073020, 0x953f: 0x40073220, - // Block 0x255, offset 0x9540 - 0x9540: 0xe000155f, 0x9541: 0xe0001565, 0x9542: 0xe000157a, 0x9543: 0xe00015b0, - 0x9544: 0xe00015b6, 0x9545: 0xf0001a1a, 0x9546: 0xf0001a1a, 0x9547: 0xf0001a1a, - 0x9548: 0xf0001a1a, 0x9549: 0xe0002894, 0x954a: 0xe00036a5, 0x954b: 0xf0001a1a, - 0x954c: 0xf0001a1a, 0x954d: 0xf0001a1a, 0x954e: 0xf0001a1a, 0x954f: 0xe000289a, - 0x9550: 0xe00036b1, 0x9551: 0xf0001a1a, 0x9552: 0xf0001a1a, 0x9553: 0xe00028a0, - 0x9554: 0xe00036ba, 0x9555: 0xf0001a1a, 0x9556: 0xf0001a1a, 0x9557: 0xf0001a1a, - 0x9558: 0xf0001a1a, 0x9559: 0xf0001a1a, 0x955a: 0xf0001a1a, 0x955b: 0xf0001a1a, - 0x955c: 0xf0001a1a, 0x955d: 0xf0001a1a, 0x955e: 0xf0001a1a, 0x955f: 0xf0001a1a, - 0x9560: 0xf0001a1a, 0x9561: 0xf0001a1a, 0x9562: 0xf0001a1a, 0x9563: 0xf0001a1a, - 0x9564: 0xf0001a1a, 0x9565: 0xf0001a1a, 0x9566: 0xf0001a1a, 0x9567: 0xf0001a1a, - 0x9568: 0xf0001a1a, 0x9569: 0xf0001a1a, 0x956a: 0xf0001a1a, 0x956b: 0xf0001a1a, - 0x956c: 0xf0001a1a, 0x956d: 0xf0001a1a, 0x956e: 0xf0001a1a, 0x956f: 0xf0001a1a, - 0x9570: 0xf0001a1a, 0x9571: 0xe00028e2, 0x9572: 0xe0003708, 0x9573: 0xf0001a1a, - 0x9574: 0xf0001a1a, 0x9575: 0xe00028e8, 0x9576: 0xe000370e, 0x9577: 0xe0003714, - 0x9578: 0xe000371a, 0x9579: 0xe0003720, 0x957a: 0xe0003726, 0x957b: 0xe0003732, - 0x957c: 0xe000373e, 0x957d: 0xe00028ee, 0x957e: 0xe0003744, 0x957f: 0xf0001a1a, - // Block 0x256, offset 0x9580 - 0x9580: 0xf0001a1a, 0x9581: 0xf0001a1a, 0x9582: 0xf0001a1a, 0x9583: 0xe00028f4, - 0x9584: 0xe000374d, 0x9585: 0xf0001a1a, 0x9586: 0xf0001a1a, 0x9587: 0xf0001a1a, - 0x9588: 0xf0001a1a, 0x9589: 0xe00028f7, 0x958a: 0xe0003750, 0x958b: 0xf0001a1a, - 0x958c: 0xf0001a1a, 0x958d: 0xf0001a1a, 0x958e: 0xf0001a1a, 0x958f: 0xe00028fd, - 0x9590: 0xe000375c, 0x9591: 0xe0003765, 0x9592: 0xe000376b, 0x9593: 0xe0002900, - 0x9594: 0xe000376e, 0x9595: 0xe0003786, 0x9596: 0xe000378c, 0x9597: 0xe0003792, - 0x9598: 0xe00037a4, 0x9599: 0xe0002906, 0x959a: 0xe00037b3, 0x959b: 0xf0001a1a, - 0x959c: 0xf0001a1a, 0x959d: 0xe000377d, 0x959e: 0xe0000003, 0x959f: 0xe0000006, - 0x95a0: 0xe0000009, 0x95a1: 0xe000000c, 0x95a2: 0xe000000f, 0x95a3: 0xe0000012, - 0x95a4: 0xe000156b, 0x95a5: 0xe000156e, 0x95a6: 0xe0001577, 0x95a7: 0xe000157d, - 0x95a8: 0xe00015aa, 0x95a9: 0xe00015b3, 0x95aa: 0xf0001919, 0x95ab: 0xf0001919, - 0x95ac: 0xf0001919, 0x95ad: 0xf0001919, 0x95ae: 0xe0002891, 0x95af: 0xe00036a2, - 0x95b0: 0xf0001919, 0x95b1: 0xf0001919, 0x95b2: 0xf0001919, 0x95b3: 0xf0001919, - 0x95b4: 0xe0002897, 0x95b5: 0xe00036ae, 0x95b6: 0xf0001919, 0x95b7: 0xf0001919, - 0x95b8: 0xf0001919, 0x95b9: 0xf0001919, 0x95ba: 0xe000289d, 0x95bb: 0xe00036b7, - 0x95bc: 0xe00028df, 0x95bd: 0xe0003705, 0x95be: 0xe00028e5, 0x95bf: 0xe000370b, - // Block 0x257, offset 0x95c0 - 0x95c0: 0xe0003711, 0x95c1: 0xe000372f, 0x95c2: 0xe000373b, 0x95c3: 0xe00028eb, - 0x95c4: 0xe0003741, 0x95c5: 0xf0001919, 0x95c6: 0xe00028f1, 0x95c7: 0xe000374a, - 0x95c8: 0xf0001919, 0x95c9: 0xf0001919, 0x95ca: 0xf0001919, 0x95cb: 0xf0001919, - 0x95cc: 0xf0001919, 0x95cd: 0xf0001919, 0x95ce: 0xe00028fa, 0x95cf: 0xe0003759, - 0x95d0: 0xe000377a, 0x95d1: 0xe0003795, 0x95d2: 0xe0003798, 0x95d3: 0xe00037a1, - 0x95d4: 0xe00037a7, 0x95d5: 0xe0002903, 0x95d6: 0xe00037b0, 0x95d7: 0xe000155c, - 0x95d8: 0xe0001562, 0x95d9: 0xe0001568, 0x95da: 0xe0001571, 0x95db: 0xe0001580, - 0x95dc: 0xf0001717, 0x95dd: 0xf0001717, 0x95de: 0xf0001717, 0x95df: 0xf0001717, - 0x95e0: 0xe000369c, 0x95e1: 0xf0001717, 0x95e2: 0xf0001717, 0x95e3: 0xf0001717, - 0x95e4: 0xf0001717, 0x95e5: 0xe00036a8, 0x95e6: 0xf0001717, 0x95e7: 0xf0001717, - 0x95e8: 0xf0001717, 0x95e9: 0xf0001717, 0x95ea: 0xf0001717, 0x95eb: 0xf0001717, - 0x95ec: 0xf0001717, 0x95ed: 0xf0001717, 0x95ee: 0xf0001717, 0x95ef: 0xf0001717, - 0x95f0: 0xf0001717, 0x95f1: 0xf0001717, 0x95f2: 0xf0001717, 0x95f3: 0xf0001717, - 0x95f4: 0xf0001717, 0x95f5: 0xf0001717, 0x95f6: 0xf0001717, 0x95f7: 0xf0001717, - 0x95f8: 0xf0001717, 0x95f9: 0xf0001717, 0x95fa: 0xf0001717, 0x95fb: 0xf0001717, - 0x95fc: 0xf0001717, 0x95fd: 0xf0001717, 0x95fe: 0xf0001717, 0x95ff: 0xf0001717, - // Block 0x258, offset 0x9600 - 0x9600: 0xf0001717, 0x9601: 0xf0001717, 0x9602: 0xf0001717, 0x9603: 0xf0001717, - 0x9604: 0xe0003717, 0x9605: 0xe000371d, 0x9606: 0xe0003723, 0x9607: 0xe0003729, - 0x9608: 0xe0003735, 0x9609: 0xf0001717, 0x960a: 0xf0001717, 0x960b: 0xf0001717, - 0x960c: 0xf0001717, 0x960d: 0xe0003747, 0x960e: 0xf0001717, 0x960f: 0xf0001717, - 0x9610: 0xf0001717, 0x9611: 0xf0001717, 0x9612: 0xf0001717, 0x9613: 0xf0001717, - 0x9614: 0xf0001717, 0x9615: 0xf0001717, 0x9616: 0xe0003753, 0x9617: 0xe0003762, - 0x9618: 0xe0003768, 0x9619: 0xe000375f, 0x961a: 0xe0003783, 0x961b: 0xe0003789, - 0x961c: 0xe000378f, 0x961d: 0xe000379b, 0x961e: 0xe00037aa, 0x961f: 0xe0001574, - 0x9620: 0xe0001583, 0x9621: 0xf0001818, 0x9622: 0xe000369f, 0x9623: 0xf0001818, - 0x9624: 0xe00036ab, 0x9625: 0xf0001818, 0x9626: 0xe00036b4, 0x9627: 0xf0001818, - 0x9628: 0xe00036d2, 0x9629: 0xf0001818, 0x962a: 0xe00036de, 0x962b: 0xe000372c, - 0x962c: 0xe0003738, 0x962d: 0xf0001818, 0x962e: 0xf0001818, 0x962f: 0xe0003756, - 0x9630: 0xe000379e, 0x9631: 0xe00037ad, 0x9632: 0xf0001818, 0x9633: 0xe0003690, - 0x9634: 0xe0003693, 0x9635: 0xe00028d0, 0x9636: 0xe00036f6, 0x9637: 0xe00028d6, - 0x9638: 0xe00036fc, 0x9639: 0xe00028dc, 0x963a: 0xe0003702, 0x963b: 0xe00028b8, - 0x963c: 0xe00036d8, 0x963d: 0xe00028be, 0x963e: 0xe00036e4, 0x963f: 0xe00028ac, - // Block 0x259, offset 0x9640 - 0x9640: 0xe00036c6, 0x9641: 0xe00028a6, 0x9642: 0xe00036c0, 0x9643: 0xe00028b2, - 0x9644: 0xe00036cc, 0x9645: 0xe00028c4, 0x9646: 0xe00036ea, 0x9647: 0xe00028ca, - 0x9648: 0xe00036f0, 0x9649: 0xf0001a1a, 0x964a: 0xf0001a1a, 0x964b: 0xf0001a1a, - 0x964c: 0xf0001a1a, 0x964d: 0xf0001a1a, 0x964e: 0xf0001a1a, 0x964f: 0xf0001a1a, - 0x9650: 0xf0001a1a, 0x9651: 0xe00028cd, 0x9652: 0xe00036f3, 0x9653: 0xe00028d3, - 0x9654: 0xe00036f9, 0x9655: 0xe00028d9, 0x9656: 0xe00036ff, 0x9657: 0xe00028b5, - 0x9658: 0xe00036d5, 0x9659: 0xe00028bb, 0x965a: 0xe00036e1, 0x965b: 0xe00028a9, - 0x965c: 0xe00036c3, 0x965d: 0xe00028a3, 0x965e: 0xe00036bd, 0x965f: 0xe00028af, - 0x9660: 0xe00036c9, 0x9661: 0xe00028c1, 0x9662: 0xe00036e7, 0x9663: 0xe00028c7, - 0x9664: 0xe00036ed, 0x9665: 0xf0001919, 0x9666: 0xf0001919, 0x9667: 0xf0001919, - 0x9668: 0xf0001919, 0x9669: 0xf0001919, 0x966a: 0xf0001919, 0x966b: 0xf0001919, - 0x966c: 0xf0001919, 0x966d: 0xf0001717, 0x966e: 0xf0001717, 0x966f: 0xf0001717, - 0x9670: 0xf0001717, 0x9671: 0xe00036cf, 0x9672: 0xe00036db, 0x9673: 0xf0001717, - 0x9674: 0xf0001818, 0x9675: 0xf0001818, 0x9676: 0xf0001818, 0x9677: 0xf0001818, - 0x9678: 0xf0001818, 0x9679: 0xf0001818, 0x967a: 0xf0001818, 0x967b: 0xf0001818, - 0x967c: 0xe0003696, 0x967d: 0xe0003699, 0x967e: 0x4004c020, 0x967f: 0x4004c220, - // Block 0x25a, offset 0x9680 - 0x9680: 0xa0000000, 0x9681: 0xa0000000, 0x9682: 0xa0000000, 0x9683: 0xa0000000, - 0x9684: 0xa0000000, 0x9685: 0xa0000000, 0x9686: 0xa0000000, 0x9687: 0xa0000000, - 0x9688: 0xa0000000, 0x9689: 0x40020020, 0x968a: 0x40020220, 0x968b: 0x40020420, - 0x968c: 0x40020620, 0x968d: 0x40020820, 0x968e: 0xa0000000, 0x968f: 0xa0000000, - 0x9690: 0xa0000000, 0x9691: 0xa0000000, 0x9692: 0xa0000000, 0x9693: 0xa0000000, - 0x9694: 0xa0000000, 0x9695: 0xa0000000, 0x9696: 0xa0000000, 0x9697: 0xa0000000, - 0x9698: 0xa0000000, 0x9699: 0xa0000000, 0x969a: 0xa0000000, 0x969b: 0xa0000000, - 0x969c: 0xa0000000, 0x969d: 0xa0000000, 0x969e: 0xa0000000, 0x969f: 0xa0000000, - 0x96a0: 0x40021220, 0x96a1: 0x4002ba20, 0x96a2: 0x4003e020, 0x96a3: 0x4004ea20, - 0x96a4: 0x4027de20, 0x96a5: 0x4004ec20, 0x96a6: 0x4004e620, 0x96a7: 0x4003d220, - 0x96a8: 0x4003f420, 0x96a9: 0x4003f620, 0x96aa: 0x4004d820, 0x96ab: 0x40093820, - 0x96ac: 0x40024020, 0x96ad: 0x40021a20, 0x96ae: 0x4002e420, 0x96af: 0x4004e220, - 0x96b0: 0x4029cc20, 0x96b1: 0x4029ce20, 0x96b2: 0x4029d020, 0x96b3: 0x4029d220, - 0x96b4: 0x4029d420, 0x96b5: 0x4029d620, 0x96b6: 0x4029d820, 0x96b7: 0x4029da20, - 0x96b8: 0x4029dc20, 0x96b9: 0x4029de20, 0x96ba: 0x40026c20, 0x96bb: 0x40026220, - 0x96bc: 0x40094020, 0x96bd: 0x40094220, 0x96be: 0x40094420, 0x96bf: 0x4002c420, - // Block 0x25b, offset 0x96c0 - 0x96c0: 0x4004d620, 0x96c1: 0xc57327b1, 0x96c2: 0x002c0a88, 0x96c3: 0x002c3a88, - 0x96c4: 0x002c6288, 0x96c5: 0x002c9888, 0x96c6: 0x002d0888, 0x96c7: 0x002d2288, - 0x96c8: 0x002d6888, 0x96c9: 0x002d9a88, 0x96ca: 0x002dcc88, 0x96cb: 0x002dfe88, - 0x96cc: 0xc0030002, 0x96cd: 0x002e8288, 0x96ce: 0x002e9e88, 0x96cf: 0xc5780071, - 0x96d0: 0x002f2c88, 0x96d1: 0x002f5688, 0x96d2: 0x002f7a88, 0x96d3: 0x002fe688, - 0x96d4: 0x00302c88, 0x96d5: 0xc56e0071, 0x96d6: 0x0030be88, 0x96d7: 0x0030e288, - 0x96d8: 0x0030f688, 0x96d9: 0x00310088, 0x96da: 0x00312a88, 0x96db: 0x4003f820, - 0x96dc: 0x4004e420, 0x96dd: 0x4003fa20, 0x96de: 0x40062420, 0x96df: 0x40021620, - 0x96e0: 0x40061e20, 0x96e1: 0xc57027b1, 0x96e2: 0x402c0a20, 0x96e3: 0x402c3a20, - 0x96e4: 0x402c6220, 0x96e5: 0x402c9820, 0x96e6: 0x402d0820, 0x96e7: 0x402d2220, - 0x96e8: 0x402d6820, 0x96e9: 0x402d9a20, 0x96ea: 0x402dcc20, 0x96eb: 0x402dfe20, - 0x96ec: 0xc0000002, 0x96ed: 0x402e8220, 0x96ee: 0x402e9e20, 0x96ef: 0xc5760071, - 0x96f0: 0x402f2c20, 0x96f1: 0x402f5620, 0x96f2: 0x402f7a20, 0x96f3: 0x402fe620, - 0x96f4: 0x40302c20, 0x96f5: 0xc56c0071, 0x96f6: 0x4030be20, 0x96f7: 0x4030e220, - 0x96f8: 0x4030f620, 0x96f9: 0x40310020, 0x96fa: 0x40312a20, 0x96fb: 0x4003fc20, - 0x96fc: 0x40094820, 0x96fd: 0x4003fe20, 0x96fe: 0x40094c20, 0x96ff: 0xa0000000, - // Block 0x25c, offset 0x9700 - 0x9700: 0xe00008f5, 0x9701: 0xe00008ef, 0x9702: 0xe0000921, 0x9703: 0xe0000969, - 0x9704: 0x00320e83, 0x9705: 0x00320c83, 0x9706: 0x00320ea3, 0x9707: 0xe0000a53, - 0x9708: 0xe0000ae8, 0x9709: 0xe0000ae2, 0x970a: 0xe0000af4, 0x970b: 0xe0000b20, - 0x970c: 0xe0000c2b, 0x970d: 0xe0000c25, 0x970e: 0xe0000c37, 0x970f: 0xe0000c43, - 0x9710: 0xe0000ab3, 0x9711: 0xe0000d63, 0x9712: 0xe0000d9a, 0x9713: 0xe0000d94, - 0x9714: 0xe0000da6, 0x9715: 0xe0000de6, 0x9716: 0x00321083, 0x9717: 0x40093e20, - 0x9718: 0x003210a3, 0x9719: 0xe0000fe1, 0x971a: 0xe0000fdb, 0x971b: 0xe0000fed, - 0x971c: 0x003100a3, 0x971d: 0xe0001102, 0x971e: 0x00318888, 0x971f: 0xe0000f7b, - 0x9720: 0xe00008f2, 0x9721: 0xe00008ec, 0x9722: 0xe000091e, 0x9723: 0xe0000966, - 0x9724: 0x40320e20, 0x9725: 0x40320c20, 0x9726: 0x40320e21, 0x9727: 0xe0000a4d, - 0x9728: 0xe0000ae5, 0x9729: 0xe0000adf, 0x972a: 0xe0000af1, 0x972b: 0xe0000b1d, - 0x972c: 0xe0000c28, 0x972d: 0xe0000c22, 0x972e: 0xe0000c34, 0x972f: 0xe0000c40, - 0x9730: 0xe0000aad, 0x9731: 0xe0000d60, 0x9732: 0xe0000d97, 0x9733: 0xe0000d91, - 0x9734: 0xe0000da3, 0x9735: 0xe0000de3, 0x9736: 0x40321020, 0x9737: 0x40093c20, - 0x9738: 0x40321021, 0x9739: 0xe0000fde, 0x973a: 0xe0000fd8, 0x973b: 0xe0000fea, - 0x973c: 0x40310021, 0x973d: 0xe00010ff, 0x973e: 0x40318820, 0x973f: 0xe0001114, - // Block 0x25d, offset 0x9740 - 0x9740: 0xe0000983, 0x9741: 0xe0000980, 0x9742: 0xe00008fb, 0x9743: 0xe00008f8, - 0x9744: 0xe000097d, 0x9745: 0xe000097a, 0x9746: 0xe0000a38, 0x9747: 0xe0000a35, - 0x9748: 0xe0000a3e, 0x9749: 0xe0000a3b, 0x974a: 0xe0000a4a, 0x974b: 0xe0000a47, - 0x974c: 0xe0000a44, 0x974d: 0xe0000a41, 0x974e: 0xe0000a86, 0x974f: 0xe0000a83, - 0x9750: 0xe00037c2, 0x9751: 0xe00037bf, 0x9752: 0xe0000b46, 0x9753: 0xe0000b43, - 0x9754: 0xe0000aee, 0x9755: 0xe0000aeb, 0x9756: 0xe0000b2c, 0x9757: 0xe0000b29, - 0x9758: 0xe0000b40, 0x9759: 0xe0000b3d, 0x975a: 0xe0000b1a, 0x975b: 0xe0000b17, - 0x975c: 0xe0000bb8, 0x975d: 0xe0000bb5, 0x975e: 0xe0000bb2, 0x975f: 0xe0000baf, - 0x9760: 0xe0000bc4, 0x9761: 0xe0000bc1, 0x9762: 0xe0000bca, 0x9763: 0xe0000bc7, - 0x9764: 0xe0000bee, 0x9765: 0xe0000beb, 0x9766: 0xe0000c1b, 0x9767: 0xe0000c18, - 0x9768: 0xe0000c51, 0x9769: 0xe0000c4e, 0x976a: 0xe0000c60, 0x976b: 0xe0000c5d, - 0x976c: 0xe0000c31, 0x976d: 0xe0000c2e, 0x976e: 0xe0000c5a, 0x976f: 0xe0000c57, - 0x9770: 0xe0000c54, 0x9771: 0x402da220, 0x9772: 0xf0000a0a, 0x9773: 0xf0000404, - 0x9774: 0xe0000c8a, 0x9775: 0xe0000c87, 0x9776: 0xe0000c9f, 0x9777: 0xe0000c9c, - 0x9778: 0x402f7220, 0x9779: 0xe0000ccc, 0x977a: 0xe0000cc9, 0x977b: 0xe0000cd8, - 0x977c: 0xe0000cd5, 0x977d: 0xe0000cd2, 0x977e: 0xe0000ccf, 0x977f: 0xe0000d04, - // Block 0x25e, offset 0x9780 - 0x9780: 0xe0000cfe, 0x9781: 0xe0000cf8, 0x9782: 0xe0000cf5, 0x9783: 0xe0000d51, - 0x9784: 0xe0000d4e, 0x9785: 0xe0000d6f, 0x9786: 0xe0000d6c, 0x9787: 0xe0000d5d, - 0x9788: 0xe0000d5a, 0x9789: 0xf0000404, 0x978a: 0xe00037ce, 0x978b: 0xe00037cb, - 0x978c: 0xe0000e2e, 0x978d: 0xe0000e2b, 0x978e: 0xe0000da0, 0x978f: 0xe0000d9d, - 0x9790: 0xe0000de0, 0x9791: 0xe0000ddd, 0x9792: 0xe0000e93, 0x9793: 0xe0000e8f, - 0x9794: 0xe0000eca, 0x9795: 0xe0000ec7, 0x9796: 0xe0000edc, 0x9797: 0xe0000ed9, - 0x9798: 0xe0000ed0, 0x9799: 0xe0000ecd, 0x979a: 0xe0000f1f, 0x979b: 0xe0000f1c, - 0x979c: 0xe0000f2d, 0x979d: 0xe0000f2a, 0x979e: 0xe0000f47, 0x979f: 0xe0000f44, - 0x97a0: 0xe0000f33, 0x97a1: 0xe0000f30, 0x97a2: 0xe0000f99, 0x97a3: 0xe0000f96, - 0x97a4: 0xe0000f8a, 0x97a5: 0xe0000f87, 0x97a6: 0xe00037d4, 0x97a7: 0xe00037d1, - 0x97a8: 0xe000102b, 0x97a9: 0xe0001028, 0x97aa: 0xe000103f, 0x97ab: 0xe000103c, - 0x97ac: 0xe0000fe7, 0x97ad: 0xe0000fe4, 0x97ae: 0xe0000ff9, 0x97af: 0xe0000ff6, - 0x97b0: 0xe0001025, 0x97b1: 0xe0001022, 0x97b2: 0xe0001039, 0x97b3: 0xe0001036, - 0x97b4: 0xe00010d8, 0x97b5: 0xe00010d5, 0x97b6: 0xe000110e, 0x97b7: 0xe000110b, - 0x97b8: 0xe0001117, 0x97b9: 0xe000113b, 0x97ba: 0xe0001138, 0x97bb: 0xe000114d, - 0x97bc: 0xe000114a, 0x97bd: 0xe0001147, 0x97be: 0xe0001144, 0x97bf: 0xe0000f64, - // Block 0x25f, offset 0x97c0 - 0x97c0: 0x402c1a20, 0x97c1: 0x002c2a88, 0x97c2: 0x002c3288, 0x97c3: 0x402c3220, - 0x97c4: 0x0031c488, 0x97c5: 0x4031c420, 0x97c6: 0x002efa88, 0x97c7: 0x002c4e88, - 0x97c8: 0x402c4e20, 0x97c9: 0x002c7288, 0x97ca: 0x002c7a88, 0x97cb: 0x002c8488, - 0x97cc: 0x402c8420, 0x97cd: 0xe000115c, 0x97ce: 0x002cae88, 0x97cf: 0x002cb888, - 0x97d0: 0x002cc288, 0x97d1: 0x002d1688, 0x97d2: 0x402d1620, 0x97d3: 0x002d4488, - 0x97d4: 0x002d5888, 0x97d5: 0x402d7820, 0x97d6: 0x002dc288, 0x97d7: 0x002db688, - 0x97d8: 0x002e0a88, 0x97d9: 0x402e0a20, 0x97da: 0x402e3820, 0x97db: 0x402e7220, - 0x97dc: 0x0030a088, 0x97dd: 0x002eb488, 0x97de: 0x402ebc20, 0x97df: 0x002f1088, - 0x97e0: 0xe0000e56, 0x97e1: 0xe0000e53, 0x97e2: 0x002d6088, 0x97e3: 0x402d6020, - 0x97e4: 0x002f3e88, 0x97e5: 0x402f3e20, 0x97e6: 0x002f8288, 0x97e7: 0x0031b488, - 0x97e8: 0x4031b420, 0x97e9: 0x00300888, 0x97ea: 0x40301220, 0x97eb: 0x40304220, - 0x97ec: 0x00304a88, 0x97ed: 0x40304a20, 0x97ee: 0x00305288, 0x97ef: 0xe000105f, - 0x97f0: 0xe000105c, 0x97f1: 0x0030b488, 0x97f2: 0x0030cc88, 0x97f3: 0x00311888, - 0x97f4: 0x40311820, 0x97f5: 0x00313488, 0x97f6: 0x40313420, 0x97f7: 0xe00037da, - 0x97f8: 0x00316e88, 0x97f9: 0x40316e20, 0x97fa: 0x40317820, 0x97fb: 0x4031a620, - 0x97fc: 0x0031bc88, 0x97fd: 0x4031bc20, 0x97fe: 0xe0000fc9, 0x97ff: 0x40319420, - // Block 0x260, offset 0x9800 - 0x9800: 0x40321220, 0x9801: 0x40321a20, 0x9802: 0x40322220, 0x9803: 0x40322a20, - 0x9804: 0xe0000ad5, 0x9805: 0xe0000ad1, 0x9806: 0xe0000acd, 0x9807: 0xf0000a0a, - 0x9808: 0xf000040a, 0x9809: 0xf0000404, 0x980a: 0xf0000a0a, 0x980b: 0xf000040a, - 0x980c: 0xf0000404, 0x980d: 0xe0000947, 0x980e: 0xe0000944, 0x980f: 0xe0000c3d, - 0x9810: 0xe0000c3a, 0x9811: 0xe0000dcc, 0x9812: 0xe0000dc9, 0x9813: 0xe0000ff3, - 0x9814: 0xe0000ff0, 0x9815: 0xe000298b, 0x9816: 0xe0002988, 0x9817: 0xe0002979, - 0x9818: 0xe0002976, 0x9819: 0xe0002985, 0x981a: 0xe0002982, 0x981b: 0xe000297f, - 0x981c: 0xe000297c, 0x981d: 0x402cae20, 0x981e: 0xe00037e8, 0x981f: 0xe00037e5, - 0x9820: 0xe0000976, 0x9821: 0xe0000972, 0x9822: 0xe00029af, 0x9823: 0xe00029ac, - 0x9824: 0xe00037c8, 0x9825: 0xe00037c5, 0x9826: 0xe0000bbe, 0x9827: 0xe0000bbb, - 0x9828: 0xe0000c99, 0x9829: 0xe0000c96, 0x982a: 0xe0000e20, 0x982b: 0xe0000e1d, - 0x982c: 0xe0000e27, 0x982d: 0xe0000e23, 0x982e: 0xe00037e1, 0x982f: 0xe00037dd, - 0x9830: 0xe0000c8d, 0x9831: 0xf0000a0a, 0x9832: 0xf000040a, 0x9833: 0xf0000404, - 0x9834: 0xe0000bac, 0x9835: 0xe0000ba9, 0x9836: 0x002d7888, 0x9837: 0x00319488, - 0x9838: 0xe0000d57, 0x9839: 0xe0000d54, 0x983a: 0xe0002991, 0x983b: 0xe000298e, - 0x983c: 0xe00037ee, 0x983d: 0xe00037eb, 0x983e: 0xe0003800, 0x983f: 0xe00037fd, - // Block 0x261, offset 0x9840 - 0x9840: 0xe000098f, 0x9841: 0xe000098c, 0x9842: 0xe0000995, 0x9843: 0xe0000992, - 0x9844: 0xe0000b62, 0x9845: 0xe0000b5f, 0x9846: 0xe0000b68, 0x9847: 0xe0000b65, - 0x9848: 0xe0000c6c, 0x9849: 0xe0000c69, 0x984a: 0xe0000c72, 0x984b: 0xe0000c6f, - 0x984c: 0xe0000e4a, 0x984d: 0xe0000e47, 0x984e: 0xe0000e50, 0x984f: 0xe0000e4d, - 0x9850: 0xe0000ee8, 0x9851: 0xe0000ee5, 0x9852: 0xe0000eee, 0x9853: 0xe0000eeb, - 0x9854: 0xe0001053, 0x9855: 0xe0001050, 0x9856: 0xe0001059, 0x9857: 0xe0001056, - 0x9858: 0xe0000f61, 0x9859: 0xe0000f5e, 0x985a: 0xe0000fa5, 0x985b: 0xe0000fa2, - 0x985c: 0x00312288, 0x985d: 0x40312220, 0x985e: 0xe0000bf4, 0x985f: 0xe0000bf1, - 0x9860: 0x002ebc88, 0x9861: 0x402c8c20, 0x9862: 0x002f2288, 0x9863: 0x402f2220, - 0x9864: 0x00314088, 0x9865: 0x40314020, 0x9866: 0xe000096f, 0x9867: 0xe000096c, - 0x9868: 0xe0000b32, 0x9869: 0xe0000b2f, 0x986a: 0xe00037fa, 0x986b: 0xe00037f7, - 0x986c: 0xe0000dfd, 0x986d: 0xe0000df9, 0x986e: 0xe0000e04, 0x986f: 0xe0000e01, - 0x9870: 0xe0000e0b, 0x9871: 0xe0000e07, 0x9872: 0xe0001129, 0x9873: 0xe0001126, - 0x9874: 0x402e5e20, 0x9875: 0x402ed020, 0x9876: 0x40305a20, 0x9877: 0x402dd420, - 0x9878: 0xe0000abf, 0x9879: 0xe0000ec4, 0x987a: 0x002be888, 0x987b: 0x002c4488, - 0x987c: 0x402c4420, 0x987d: 0x002e3888, 0x987e: 0x00303e88, 0x987f: 0x402ffc20, - // Block 0x262, offset 0x9880 - 0x9880: 0x402f8220, 0x9881: 0x402fd820, 0x9882: 0x402ff420, 0x9883: 0x40300820, - 0x9884: 0x402df620, 0x9885: 0x40301a20, 0x9886: 0x40302420, 0x9887: 0x40306420, - 0x9888: 0x40305220, 0x9889: 0x40307c20, 0x988a: 0x4030b420, 0x988b: 0x4030cc20, - 0x988c: 0x4030da20, 0x988d: 0x4030ee20, 0x988e: 0x402e7a20, 0x988f: 0x40310820, - 0x9890: 0x40314820, 0x9891: 0x40315020, 0x9892: 0xe00037d7, 0x9893: 0x40318020, - 0x9894: 0x4031cc20, 0x9895: 0x4031e820, 0x9896: 0x40320a20, 0x9897: 0x40323220, - 0x9898: 0x40323a20, 0x9899: 0x402c1220, 0x989a: 0x402cf820, 0x989b: 0x402d4c20, - 0x989c: 0x402d7020, 0x989d: 0x402de620, 0x989e: 0x402e1a20, 0x989f: 0x402e2a20, - 0x98a0: 0x402f6220, 0x98a1: 0x4031fa20, 0x98a2: 0x40320220, 0x98a3: 0xe0000aca, - 0x98a4: 0xe0000adc, 0x98a5: 0xe0000ad9, 0x98a6: 0xe0000fcc, 0x98a7: 0xe0000fcf, - 0x98a8: 0xe0000fba, 0x98a9: 0xe0000ba1, 0x98aa: 0xe0000d11, 0x98ab: 0xe0000d18, - 0x98ac: 0x40324220, 0x98ad: 0x40324a20, 0x98ae: 0x40309020, 0x98af: 0x40309820, - 0x98b0: 0x002d6894, 0x98b1: 0x002d8094, 0x98b2: 0x002dcc94, 0x98b3: 0x002f7a94, - 0x98b4: 0x002f9894, 0x98b5: 0x002fac94, 0x98b6: 0x002fd894, 0x98b7: 0x0030e294, - 0x98b8: 0x00310094, 0x98b9: 0x40064020, 0x98ba: 0x40064420, 0x98bb: 0x402d9620, - 0x98bc: 0x4031de20, 0x98bd: 0x402d9820, 0x98be: 0x4031e220, 0x98bf: 0x4031f020, - // Block 0x263, offset 0x98c0 - 0x98c0: 0xe0000d24, 0x98c1: 0xe0000d21, 0x98c2: 0xe0000d2a, 0x98c3: 0xe0000d27, - 0x98c4: 0xe0000d69, 0x98c5: 0xe0000d66, 0x98c6: 0xe0000d7b, 0x98c7: 0xe0000d78, - 0x98c8: 0xe0000d87, 0x98c9: 0xe0000d84, 0x98ca: 0xe0000d81, 0x98cb: 0xe0000d7e, - 0x98cc: 0xe0000ded, 0x98cd: 0xe0000de9, 0x98ce: 0xe00037f4, 0x98cf: 0xe00037f1, - 0x98d0: 0xe0000e3d, 0x98d1: 0xe0000e39, 0x98d2: 0xe0000e35, 0x98d3: 0xe0000e31, - 0x98d4: 0xe0000ea7, 0x98d5: 0xe0000ea4, 0x98d6: 0xe0000ead, 0x98d7: 0xe0000eaa, - 0x98d8: 0xe0000ed6, 0x98d9: 0xe0000ed3, 0x98da: 0xe0000ef4, 0x98db: 0xe0000ef1, - 0x98dc: 0xe0000efb, 0x98dd: 0xe0000ef7, 0x98de: 0xe0000f02, 0x98df: 0xe0000eff, - 0x98e0: 0xe0000f41, 0x98e1: 0xe0000f3e, 0x98e2: 0xe0000f53, 0x98e3: 0xe0000f50, - 0x98e4: 0xe0000f26, 0x98e5: 0xe0000f22, 0x98e6: 0xe0000f3a, 0x98e7: 0xe0000f36, - 0x98e8: 0xe0000f5a, 0x98e9: 0xe0000f56, 0x98ea: 0xe0000f93, 0x98eb: 0xe0000f90, - 0x98ec: 0xe0000f9f, 0x98ed: 0xe0000f9c, 0x98ee: 0xe0000fb1, 0x98ef: 0xe0000fae, - 0x98f0: 0xe0000fab, 0x98f1: 0xe0000fa8, 0x98f2: 0xe0001093, 0x98f3: 0xe0001090, - 0x98f4: 0xe000109f, 0x98f5: 0xe000109c, 0x98f6: 0xe0001099, 0x98f7: 0xe0001096, - 0x98f8: 0xe0001032, 0x98f9: 0xe000102e, 0x98fa: 0xe000298b, 0x98fb: 0xe0002988, - 0x98fc: 0xe00010a9, 0x98fd: 0xe00010a6, 0x98fe: 0xe00010af, 0x98ff: 0xe00010ac, - // Block 0x264, offset 0x9900 - 0x9900: 0xe00009bc, 0x9901: 0xe00009c0, 0x9902: 0x002c3a8b, 0x9903: 0xf0000a04, - 0x9904: 0x40081c20, 0x9905: 0xe0000a5e, 0x9906: 0xe0000a62, 0x9907: 0x002cc28a, - 0x9908: 0x40081e20, 0x9909: 0xf0000a04, 0x990a: 0x002d2285, 0x990b: 0x002d688b, - 0x990c: 0x002d688b, 0x990d: 0x002d688b, 0x990e: 0x002d6885, 0x990f: 0xf0000202, - 0x9910: 0x002d9a8b, 0x9911: 0x002d9a8b, 0x9912: 0x002e228b, 0x9913: 0x002e2285, - 0x9914: 0x40082020, 0x9915: 0x002e9e8b, 0x9916: 0xf000040a, 0x9917: 0x40082220, - 0x9918: 0x40082420, 0x9919: 0x002f2c8b, 0x991a: 0x002f568b, 0x991b: 0x002f7a8b, - 0x991c: 0x002f7a8b, 0x991d: 0x002f7a8b, 0x991e: 0x40082620, 0x991f: 0x40082820, - 0x9920: 0xf0001414, 0x9921: 0xe0000fbd, 0x9922: 0xf0001414, 0x9923: 0x40082a20, - 0x9924: 0x00312a8b, 0x9925: 0x40082c20, 0x9926: 0x0032a288, 0x9927: 0x40082e20, - 0x9928: 0x00312a8b, 0x9929: 0x40083020, 0x992a: 0x002dfe88, 0x992b: 0x00320c83, - 0x992c: 0x002c0a8b, 0x992d: 0x002c3a8b, 0x992e: 0x40083220, 0x992f: 0x002c9885, - 0x9930: 0x002c988b, 0x9931: 0x002d088b, 0x9932: 0x002d1e88, 0x9933: 0x002e828b, - 0x9934: 0x002ee285, 0x9935: 0x00389084, 0x9936: 0x00389284, 0x9937: 0x00389484, - 0x9938: 0x00389684, 0x9939: 0x002d9a85, 0x993a: 0x40083420, 0x993b: 0xe0000b95, - 0x993c: 0x00327e85, 0x993d: 0x00325685, 0x993e: 0x0032568b, 0x993f: 0x00327e8b, - // Block 0x265, offset 0x9940 - 0x9940: 0xa0000000, 0x9941: 0xa0000000, 0x9942: 0xa0000000, 0x9943: 0xa0000000, - 0x9944: 0xa0000000, 0x9945: 0xa0000000, 0x9946: 0xa0000000, 0x9947: 0xa0000000, - 0x9948: 0xa0000000, 0x9949: 0x40020020, 0x994a: 0x40020220, 0x994b: 0x40020420, - 0x994c: 0x40020620, 0x994d: 0x40020820, 0x994e: 0xa0000000, 0x994f: 0xa0000000, - 0x9950: 0xa0000000, 0x9951: 0xa0000000, 0x9952: 0xa0000000, 0x9953: 0xa0000000, - 0x9954: 0xa0000000, 0x9955: 0xa0000000, 0x9956: 0xa0000000, 0x9957: 0xa0000000, - 0x9958: 0xa0000000, 0x9959: 0xa0000000, 0x995a: 0xa0000000, 0x995b: 0xa0000000, - 0x995c: 0xa0000000, 0x995d: 0xa0000000, 0x995e: 0xa0000000, 0x995f: 0xa0000000, - 0x9960: 0x40021220, 0x9961: 0x4002ba20, 0x9962: 0x4003e020, 0x9963: 0x4004ea20, - 0x9964: 0x4027de20, 0x9965: 0x4004ec20, 0x9966: 0x4004e620, 0x9967: 0x4003d220, - 0x9968: 0x4003f420, 0x9969: 0x4003f620, 0x996a: 0x4004d820, 0x996b: 0x40093820, - 0x996c: 0x40024020, 0x996d: 0x40021a20, 0x996e: 0x4002e420, 0x996f: 0x4004e220, - 0x9970: 0x4029cc20, 0x9971: 0x4029ce20, 0x9972: 0x4029d020, 0x9973: 0x4029d220, - 0x9974: 0x4029d420, 0x9975: 0x4029d620, 0x9976: 0x4029d820, 0x9977: 0x4029da20, - 0x9978: 0x4029dc20, 0x9979: 0x4029de20, 0x997a: 0x40026c20, 0x997b: 0x40026220, - 0x997c: 0x40094020, 0x997d: 0x40094220, 0x997e: 0x40094420, 0x997f: 0x4002c420, - // Block 0x266, offset 0x9980 - 0x9980: 0x4004d620, 0x9981: 0xc57327b1, 0x9982: 0x002c0a88, 0x9983: 0x002c3a88, - 0x9984: 0x002c6288, 0x9985: 0x002c9888, 0x9986: 0x002d0888, 0x9987: 0x002d2288, - 0x9988: 0x002d6888, 0x9989: 0x002d9a88, 0x998a: 0x002dcc88, 0x998b: 0x002dfe88, - 0x998c: 0xc0030002, 0x998d: 0x002e8288, 0x998e: 0x002e9e88, 0x998f: 0xc57e27e1, - 0x9990: 0x002f2c88, 0x9991: 0x002f5688, 0x9992: 0x002f7a88, 0x9993: 0x002fe688, - 0x9994: 0x00302c88, 0x9995: 0xc3900b21, 0x9996: 0x0030be88, 0x9997: 0x0030bea3, - 0x9998: 0x0030f688, 0x9999: 0x00310088, 0x999a: 0x00312a88, 0x999b: 0x4003f820, - 0x999c: 0x4004e420, 0x999d: 0x4003fa20, 0x999e: 0x40062420, 0x999f: 0x40021620, - 0x99a0: 0x40061e20, 0x99a1: 0xc57027b1, 0x99a2: 0x402c0a20, 0x99a3: 0x402c3a20, - 0x99a4: 0x402c6220, 0x99a5: 0x402c9820, 0x99a6: 0x402d0820, 0x99a7: 0x402d2220, - 0x99a8: 0x402d6820, 0x99a9: 0x402d9a20, 0x99aa: 0x402dcc20, 0x99ab: 0x402dfe20, - 0x99ac: 0xc0000002, 0x99ad: 0x402e8220, 0x99ae: 0x402e9e20, 0x99af: 0xc57a27e1, - 0x99b0: 0x402f2c20, 0x99b1: 0x402f5620, 0x99b2: 0x402f7a20, 0x99b3: 0x402fe620, - 0x99b4: 0x40302c20, 0x99b5: 0xc38d0b21, 0x99b6: 0x4030be20, 0x99b7: 0x4030be21, - 0x99b8: 0x4030f620, 0x99b9: 0x40310020, 0x99ba: 0x40312a20, 0x99bb: 0x4003fc20, - 0x99bc: 0x40094820, 0x99bd: 0x4003fe20, 0x99be: 0x40094c20, 0x99bf: 0xa0000000, - // Block 0x267, offset 0x99c0 - 0x99c0: 0xe00008f5, 0x99c1: 0xe00008ef, 0x99c2: 0xe0000921, 0x99c3: 0xe0000969, - 0x99c4: 0x00320e83, 0x99c5: 0x00320c83, 0x99c6: 0x00320ea3, 0x99c7: 0xe0000a53, - 0x99c8: 0xe0000ae8, 0x99c9: 0xe0000ae2, 0x99ca: 0xe0000af4, 0x99cb: 0xe0000b20, - 0x99cc: 0xe0000c2b, 0x99cd: 0xe0000c25, 0x99ce: 0xe0000c37, 0x99cf: 0xe0000c43, - 0x99d0: 0x002c62a3, 0x99d1: 0xe0000d63, 0x99d2: 0xe0000d9a, 0x99d3: 0xe0000d94, - 0x99d4: 0xe0000da6, 0x99d5: 0x003210e3, 0x99d6: 0x00321083, 0x99d7: 0x40093e20, - 0x99d8: 0x003210a3, 0x99d9: 0xe0000fe1, 0x99da: 0xe0000fdb, 0x99db: 0xe0000fed, - 0x99dc: 0x003100a3, 0x99dd: 0xe0001102, 0x99de: 0xe0003806, 0x99df: 0xe0000f7b, - 0x99e0: 0xe00008f2, 0x99e1: 0xe00008ec, 0x99e2: 0xe000091e, 0x99e3: 0xe0000966, - 0x99e4: 0x40320e20, 0x99e5: 0x40320c20, 0x99e6: 0x40320e21, 0x99e7: 0xe0000a4d, - 0x99e8: 0xe0000ae5, 0x99e9: 0xe0000adf, 0x99ea: 0xe0000af1, 0x99eb: 0xe0000b1d, - 0x99ec: 0xe0000c28, 0x99ed: 0xe0000c22, 0x99ee: 0xe0000c34, 0x99ef: 0xe0000c40, - 0x99f0: 0x402c6221, 0x99f1: 0xe0000d60, 0x99f2: 0xe0000d97, 0x99f3: 0xe0000d91, - 0x99f4: 0xe0000da3, 0x99f5: 0x40321023, 0x99f6: 0x40321020, 0x99f7: 0x40093c20, - 0x99f8: 0x40321021, 0x99f9: 0xe0000fde, 0x99fa: 0xe0000fd8, 0x99fb: 0xe0000fea, - 0x99fc: 0x40310021, 0x99fd: 0xe00010ff, 0x99fe: 0xe0003803, 0x99ff: 0xe0001114, - // Block 0x268, offset 0x9a00 - 0x9a00: 0xe0000983, 0x9a01: 0xe0000980, 0x9a02: 0xe00008fb, 0x9a03: 0xe00008f8, - 0x9a04: 0xe000097d, 0x9a05: 0xe000097a, 0x9a06: 0xe0000a38, 0x9a07: 0xe0000a35, - 0x9a08: 0xe0000a3e, 0x9a09: 0xe0000a3b, 0x9a0a: 0xe0000a4a, 0x9a0b: 0xe0000a47, - 0x9a0c: 0xe0000a44, 0x9a0d: 0xe0000a41, 0x9a0e: 0xe0000a86, 0x9a0f: 0xe0000a83, - 0x9a10: 0x002c62c3, 0x9a11: 0x402c6222, 0x9a12: 0xe0000b46, 0x9a13: 0xe0000b43, - 0x9a14: 0xe0000aee, 0x9a15: 0xe0000aeb, 0x9a16: 0xe0000b2c, 0x9a17: 0xe0000b29, - 0x9a18: 0xe0000b40, 0x9a19: 0xe0000b3d, 0x9a1a: 0xe0000b1a, 0x9a1b: 0xe0000b17, - 0x9a1c: 0xe0000bb8, 0x9a1d: 0xe0000bb5, 0x9a1e: 0xe0000bb2, 0x9a1f: 0xe0000baf, - 0x9a20: 0xe0000bc4, 0x9a21: 0xe0000bc1, 0x9a22: 0xe0000bca, 0x9a23: 0xe0000bc7, - 0x9a24: 0xe0000bee, 0x9a25: 0xe0000beb, 0x9a26: 0xe0000c1b, 0x9a27: 0xe0000c18, - 0x9a28: 0xe0000c51, 0x9a29: 0xe0000c4e, 0x9a2a: 0xe0000c60, 0x9a2b: 0xe0000c5d, - 0x9a2c: 0xe0000c31, 0x9a2d: 0xe0000c2e, 0x9a2e: 0xe0000c5a, 0x9a2f: 0xe0000c57, - 0x9a30: 0xe0000c54, 0x9a31: 0x402da220, 0x9a32: 0xf0000a0a, 0x9a33: 0xf0000404, - 0x9a34: 0xe0000c8a, 0x9a35: 0xe0000c87, 0x9a36: 0xe0000c9f, 0x9a37: 0xe0000c9c, - 0x9a38: 0x402f7220, 0x9a39: 0xe0000ccc, 0x9a3a: 0xe0000cc9, 0x9a3b: 0xe0000cd8, - 0x9a3c: 0xe0000cd5, 0x9a3d: 0xe0000cd2, 0x9a3e: 0xe0000ccf, 0x9a3f: 0xe0000d04, - // Block 0x269, offset 0x9a40 - 0x9a40: 0xe0000cfe, 0x9a41: 0xe0000cf8, 0x9a42: 0xe0000cf5, 0x9a43: 0xe0000d51, - 0x9a44: 0xe0000d4e, 0x9a45: 0xe0000d6f, 0x9a46: 0xe0000d6c, 0x9a47: 0xe0000d5d, - 0x9a48: 0xe0000d5a, 0x9a49: 0xf0000404, 0x9a4a: 0x002e9ea3, 0x9a4b: 0x402e9e21, - 0x9a4c: 0xe0000e2e, 0x9a4d: 0xe0000e2b, 0x9a4e: 0xe0000da0, 0x9a4f: 0xe0000d9d, - 0x9a50: 0x003210c3, 0x9a51: 0x40321022, 0x9a52: 0x00321103, 0x9a53: 0x40321024, - 0x9a54: 0xe0000eca, 0x9a55: 0xe0000ec7, 0x9a56: 0xe0000edc, 0x9a57: 0xe0000ed9, - 0x9a58: 0xe0000ed0, 0x9a59: 0xe0000ecd, 0x9a5a: 0xe0000f1f, 0x9a5b: 0xe0000f1c, - 0x9a5c: 0xe0000f2d, 0x9a5d: 0xe0000f2a, 0x9a5e: 0xe0000f47, 0x9a5f: 0xe0000f44, - 0x9a60: 0xe0000f33, 0x9a61: 0xe0000f30, 0x9a62: 0xe0000f99, 0x9a63: 0xe0000f96, - 0x9a64: 0xe0000f8a, 0x9a65: 0xe0000f87, 0x9a66: 0x00303688, 0x9a67: 0x40303620, - 0x9a68: 0xe000102b, 0x9a69: 0xe0001028, 0x9a6a: 0xe000103f, 0x9a6b: 0xe000103c, - 0x9a6c: 0xe0000fe7, 0x9a6d: 0xe0000fe4, 0x9a6e: 0xe0000ff9, 0x9a6f: 0xe0000ff6, - 0x9a70: 0x003100c3, 0x9a71: 0x40310022, 0x9a72: 0xe0001039, 0x9a73: 0xe0001036, - 0x9a74: 0xe0003636, 0x9a75: 0xe0003633, 0x9a76: 0xe000110e, 0x9a77: 0xe000110b, - 0x9a78: 0xe0001117, 0x9a79: 0xe000113b, 0x9a7a: 0xe0001138, 0x9a7b: 0xe000114d, - 0x9a7c: 0xe000114a, 0x9a7d: 0xe0001147, 0x9a7e: 0xe0001144, 0x9a7f: 0xe0000f64, - // Block 0x26a, offset 0x9a80 - 0x9a80: 0x40321220, 0x9a81: 0x40321a20, 0x9a82: 0x40322220, 0x9a83: 0x40322a20, - 0x9a84: 0xe0000ad5, 0x9a85: 0xe0000ad1, 0x9a86: 0xe0000acd, 0x9a87: 0xf0000a0a, - 0x9a88: 0xf000040a, 0x9a89: 0xf0000404, 0x9a8a: 0xf0000a0a, 0x9a8b: 0xf000040a, - 0x9a8c: 0xf0000404, 0x9a8d: 0xe0000947, 0x9a8e: 0xe0000944, 0x9a8f: 0xe0000c3d, - 0x9a90: 0xe0000c3a, 0x9a91: 0xe0000dcc, 0x9a92: 0xe0000dc9, 0x9a93: 0xe0000ff3, - 0x9a94: 0xe0000ff0, 0x9a95: 0xe000298b, 0x9a96: 0xe0002988, 0x9a97: 0xe0002979, - 0x9a98: 0xe0002976, 0x9a99: 0xe0002985, 0x9a9a: 0xe0002982, 0x9a9b: 0xe000297f, - 0x9a9c: 0xe000297c, 0x9a9d: 0x402cae20, 0x9a9e: 0xe00037e8, 0x9a9f: 0xe00037e5, - 0x9aa0: 0xe0000976, 0x9aa1: 0xe0000972, 0x9aa2: 0xe00029af, 0x9aa3: 0xe00029ac, - 0x9aa4: 0x002d3a88, 0x9aa5: 0x402d3a20, 0x9aa6: 0xe0000bbe, 0x9aa7: 0xe0000bbb, - 0x9aa8: 0xe0000c99, 0x9aa9: 0xe0000c96, 0x9aaa: 0xe0000e20, 0x9aab: 0xe0000e1d, - 0x9aac: 0xe0000e27, 0x9aad: 0xe0000e23, 0x9aae: 0xe0001162, 0x9aaf: 0xe000115f, - 0x9ab0: 0xe0000c8d, 0x9ab1: 0xf0000a0a, 0x9ab2: 0xf000040a, 0x9ab3: 0xf0000404, - 0x9ab4: 0xe0000bac, 0x9ab5: 0xe0000ba9, 0x9ab6: 0x002d7888, 0x9ab7: 0x00319488, - 0x9ab8: 0xe0000d57, 0x9ab9: 0xe0000d54, 0x9aba: 0xe0002991, 0x9abb: 0xe000298e, - 0x9abc: 0xe00037ee, 0x9abd: 0xe00037eb, 0x9abe: 0xe0003800, 0x9abf: 0xe00037fd, - // Block 0x26b, offset 0x9ac0 - 0x9ac0: 0xe000098f, 0x9ac1: 0xe000098c, 0x9ac2: 0xe0000995, 0x9ac3: 0xe0000992, - 0x9ac4: 0xe0000b62, 0x9ac5: 0xe0000b5f, 0x9ac6: 0xe0000b68, 0x9ac7: 0xe0000b65, - 0x9ac8: 0xe0000c6c, 0x9ac9: 0xe0000c69, 0x9aca: 0xe0000c72, 0x9acb: 0xe0000c6f, - 0x9acc: 0xe0000e4a, 0x9acd: 0xe0000e47, 0x9ace: 0xe0000e50, 0x9acf: 0xe0000e4d, - 0x9ad0: 0xe0000ee8, 0x9ad1: 0xe0000ee5, 0x9ad2: 0xe0000eee, 0x9ad3: 0xe0000eeb, - 0x9ad4: 0xe0001053, 0x9ad5: 0xe0001050, 0x9ad6: 0xe0001059, 0x9ad7: 0xe0001056, - 0x9ad8: 0xe0000f61, 0x9ad9: 0xe0000f5e, 0x9ada: 0xe0000fa5, 0x9adb: 0xe0000fa2, - 0x9adc: 0x00312288, 0x9add: 0x40312220, 0x9ade: 0xe0000bf4, 0x9adf: 0xe0000bf1, - 0x9ae0: 0x002ebc88, 0x9ae1: 0x402c8c20, 0x9ae2: 0x002f2288, 0x9ae3: 0x402f2220, - 0x9ae4: 0x00314088, 0x9ae5: 0x40314020, 0x9ae6: 0xe000096f, 0x9ae7: 0xe000096c, - 0x9ae8: 0xe0000b32, 0x9ae9: 0xe0000b2f, 0x9aea: 0xe00037fa, 0x9aeb: 0xe00037f7, - 0x9aec: 0xe000381e, 0x9aed: 0xe000381b, 0x9aee: 0xe0000e04, 0x9aef: 0xe0000e01, - 0x9af0: 0xe0000e0b, 0x9af1: 0xe0000e07, 0x9af2: 0xe0001129, 0x9af3: 0xe0001126, - 0x9af4: 0x402e5e20, 0x9af5: 0x402ed020, 0x9af6: 0x40305a20, 0x9af7: 0x402dd420, - 0x9af8: 0xe0000abf, 0x9af9: 0xe0000ec4, 0x9afa: 0x002be888, 0x9afb: 0x002c4488, - 0x9afc: 0x402c4420, 0x9afd: 0x002e3888, 0x9afe: 0x00303e88, 0x9aff: 0x402ffc20, - // Block 0x26c, offset 0x9b00 - 0x9b00: 0xe0000d24, 0x9b01: 0xe0000d21, 0x9b02: 0xe0000d2a, 0x9b03: 0xe0000d27, - 0x9b04: 0xe0000d69, 0x9b05: 0xe0000d66, 0x9b06: 0xe0000d7b, 0x9b07: 0xe0000d78, - 0x9b08: 0xe0000d87, 0x9b09: 0xe0000d84, 0x9b0a: 0xe0000d81, 0x9b0b: 0xe0000d7e, - 0x9b0c: 0xe000380c, 0x9b0d: 0xe0003809, 0x9b0e: 0xe0003818, 0x9b0f: 0xe0003815, - 0x9b10: 0xe0000e3d, 0x9b11: 0xe0000e39, 0x9b12: 0xe0000e35, 0x9b13: 0xe0000e31, - 0x9b14: 0xe0000ea7, 0x9b15: 0xe0000ea4, 0x9b16: 0xe0000ead, 0x9b17: 0xe0000eaa, - 0x9b18: 0xe0000ed6, 0x9b19: 0xe0000ed3, 0x9b1a: 0xe0000ef4, 0x9b1b: 0xe0000ef1, - 0x9b1c: 0xe0000efb, 0x9b1d: 0xe0000ef7, 0x9b1e: 0xe0000f02, 0x9b1f: 0xe0000eff, - 0x9b20: 0xe0000f41, 0x9b21: 0xe0000f3e, 0x9b22: 0xe0000f53, 0x9b23: 0xe0000f50, - 0x9b24: 0xe0000f26, 0x9b25: 0xe0000f22, 0x9b26: 0xe0000f3a, 0x9b27: 0xe0000f36, - 0x9b28: 0xe0000f5a, 0x9b29: 0xe0000f56, 0x9b2a: 0xe0000f93, 0x9b2b: 0xe0000f90, - 0x9b2c: 0xe0000f9f, 0x9b2d: 0xe0000f9c, 0x9b2e: 0xe0000fb1, 0x9b2f: 0xe0000fae, - 0x9b30: 0xe0000fab, 0x9b31: 0xe0000fa8, 0x9b32: 0xe0001093, 0x9b33: 0xe0001090, - 0x9b34: 0xe000109f, 0x9b35: 0xe000109c, 0x9b36: 0xe0001099, 0x9b37: 0xe0001096, - 0x9b38: 0xe0001032, 0x9b39: 0xe000102e, 0x9b3a: 0xe000298b, 0x9b3b: 0xe0002988, - 0x9b3c: 0xe00010a9, 0x9b3d: 0xe00010a6, 0x9b3e: 0xe00010af, 0x9b3f: 0xe00010ac, - // Block 0x26d, offset 0x9b40 - 0x9b40: 0xe0003630, 0x9b41: 0xe000362d, 0x9b42: 0xe000362a, 0x9b43: 0xe0003627, - 0x9b44: 0xe000363f, 0x9b45: 0xe000363c, 0x9b46: 0xe0003645, 0x9b47: 0xe0003642, - 0x9b48: 0xe000364b, 0x9b49: 0xe0003648, 0x9b4a: 0xe00010fc, 0x9b4b: 0xe00010f9, - 0x9b4c: 0xe00010f6, 0x9b4d: 0xe00010f3, 0x9b4e: 0xe0001123, 0x9b4f: 0xe0001120, - 0x9b50: 0xe0001141, 0x9b51: 0xe000113e, 0x9b52: 0xe0001153, 0x9b53: 0xe0001150, - 0x9b54: 0xe0001159, 0x9b55: 0xe0001156, 0x9b56: 0xe0000c15, 0x9b57: 0xe0000f8d, - 0x9b58: 0xe0003639, 0x9b59: 0xe0001111, 0x9b5a: 0xf0000404, 0x9b5b: 0xe0000f70, - 0x9b5c: 0x40300420, 0x9b5d: 0x40300620, 0x9b5e: 0xe0000f7f, 0x9b5f: 0x402c9620, - 0x9b60: 0xe000099b, 0x9b61: 0xe0000998, 0x9b62: 0xe0000989, 0x9b63: 0xe0000986, - 0x9b64: 0xe0000928, 0x9b65: 0xe0000924, 0x9b66: 0xe0000930, 0x9b67: 0xe000092c, - 0x9b68: 0xe0000940, 0x9b69: 0xe000093c, 0x9b6a: 0xe0000938, 0x9b6b: 0xe0000934, - 0x9b6c: 0xe00009aa, 0x9b6d: 0xe00009a6, 0x9b6e: 0xe0000902, 0x9b6f: 0xe00008fe, - 0x9b70: 0xe000090a, 0x9b71: 0xe0000906, 0x9b72: 0xe000091a, 0x9b73: 0xe0000916, - 0x9b74: 0xe0000912, 0x9b75: 0xe000090e, 0x9b76: 0xe00009a2, 0x9b77: 0xe000099e, - 0x9b78: 0xe0000b6e, 0x9b79: 0xe0000b6b, 0x9b7a: 0xe0000b5c, 0x9b7b: 0xe0000b59, - 0x9b7c: 0xe0000b26, 0x9b7d: 0xe0000b23, 0x9b7e: 0xe0000afb, 0x9b7f: 0xe0000af7, - // Block 0x26e, offset 0x9b80 - 0x9b80: 0xe0000b03, 0x9b81: 0xe0000aff, 0x9b82: 0xe0000b13, 0x9b83: 0xe0000b0f, - 0x9b84: 0xe0000b0b, 0x9b85: 0xe0000b07, 0x9b86: 0xe0000b75, 0x9b87: 0xe0000b71, - 0x9b88: 0xe0000c66, 0x9b89: 0xe0000c63, 0x9b8a: 0xe0000c78, 0x9b8b: 0xe0000c75, - 0x9b8c: 0xe0000e84, 0x9b8d: 0xe0000e81, 0x9b8e: 0xe0000e44, 0x9b8f: 0xe0000e41, - 0x9b90: 0xe0000dad, 0x9b91: 0xe0000da9, 0x9b92: 0xe0000db5, 0x9b93: 0xe0000db1, - 0x9b94: 0xe0000dc5, 0x9b95: 0xe0000dc1, 0x9b96: 0xe0003812, 0x9b97: 0xe000380f, - 0x9b98: 0xe0000e8b, 0x9b99: 0xe0000e87, 0x9b9a: 0xe0000e5d, 0x9b9b: 0xe0000e59, - 0x9b9c: 0xe0000e65, 0x9b9d: 0xe0000e61, 0x9b9e: 0xe0000e75, 0x9b9f: 0xe0000e71, - 0x9ba0: 0xe0003824, 0x9ba1: 0xe0003821, 0x9ba2: 0xe0000e7d, 0x9ba3: 0xe0000e79, - 0x9ba4: 0xe000108d, 0x9ba5: 0xe000108a, 0x9ba6: 0xe000104d, 0x9ba7: 0xe000104a, - 0x9ba8: 0xe0001066, 0x9ba9: 0xe0001062, 0x9baa: 0xe000106e, 0x9bab: 0xe000106a, - 0x9bac: 0xe000107e, 0x9bad: 0xe000107a, 0x9bae: 0xe0001076, 0x9baf: 0xe0001072, - 0x9bb0: 0xe0001086, 0x9bb1: 0xe0001082, 0x9bb2: 0xe0001108, 0x9bb3: 0xe0001105, - 0x9bb4: 0xe0001135, 0x9bb5: 0xe0001132, 0x9bb6: 0xe000112f, 0x9bb7: 0xe000112c, - 0x9bb8: 0xe000111d, 0x9bb9: 0xe000111a, 0x9bba: 0xe0000d0a, 0x9bbb: 0xe0000d07, - 0x9bbc: 0x0030d888, 0x9bbd: 0x4030d820, 0x9bbe: 0x00312088, 0x9bbf: 0x40312020, - // Block 0x26f, offset 0x9bc0 - 0x9bc0: 0xe0000024, 0x9bc1: 0xe0000029, 0x9bc2: 0xe000002e, 0x9bc3: 0xe0000033, - 0x9bc4: 0xe0000038, 0x9bc5: 0xe000003d, 0x9bc6: 0xe0000042, 0x9bc7: 0xe0000047, - 0x9bc8: 0xf0001f04, 0x9bc9: 0xf0001f04, 0x9bca: 0xf0001f04, 0x9bcb: 0xf0001f04, - 0x9bcc: 0xf0001f04, 0x9bcd: 0xf0001f04, 0x9bce: 0xf0001f04, 0x9bcf: 0xf0001f04, - 0x9bd0: 0xf0001f04, 0x9bd1: 0xf0000404, 0x9bd2: 0xf0000404, 0x9bd3: 0xf0000404, - 0x9bd4: 0xf0000404, 0x9bd5: 0xf0000404, 0x9bd6: 0xf0000404, 0x9bd7: 0xf0000404, - 0x9bd8: 0xf0000404, 0x9bd9: 0xf0000404, 0x9bda: 0xf0000404, 0x9bdb: 0xf0000404, - 0x9bdc: 0xf0000404, 0x9bdd: 0xf0000404, 0x9bde: 0xf0000404, 0x9bdf: 0xf0000404, - 0x9be0: 0xf0000404, 0x9be1: 0xf0000404, 0x9be2: 0xf0000404, 0x9be3: 0xf0000404, - 0x9be4: 0xf0000404, 0x9be5: 0xf0000404, 0x9be6: 0xf0000404, 0x9be7: 0xf0000404, - 0x9be8: 0xf0000404, 0x9be9: 0xf0000404, 0x9bea: 0xf0000404, 0x9beb: 0xf0000404, - 0x9bec: 0xf0000404, 0x9bed: 0xf0000404, 0x9bee: 0xf0000404, 0x9bef: 0xf0000404, - 0x9bf0: 0xf0000404, 0x9bf1: 0xf0000404, 0x9bf2: 0xe0002c46, 0x9bf3: 0xf0000404, - 0x9bf4: 0xf0000404, 0x9bf5: 0xf0000404, 0x9bf6: 0x002bde8c, 0x9bf7: 0x002c0a8c, - 0x9bf8: 0x002c3a8c, 0x9bf9: 0x002c628c, 0x9bfa: 0x002c988c, 0x9bfb: 0x002d088c, - 0x9bfc: 0x002d228c, 0x9bfd: 0x002d688c, 0x9bfe: 0x002d9a8c, 0x9bff: 0x002dcc8c, - // Block 0x270, offset 0x9c00 - 0x9c00: 0xf0001d1c, 0x9c01: 0xf0001d1c, 0x9c02: 0xf0001d1c, 0x9c03: 0xf0001d1c, - 0x9c04: 0xf0001d1c, 0x9c05: 0xf0001d1d, 0x9c06: 0xf0001d1d, 0x9c07: 0xf0001d1d, - 0x9c08: 0xe0000a6b, 0x9c09: 0xe0000cb4, 0x9c0a: 0xf0001d1c, 0x9c0b: 0xf0001d1c, - 0x9c0c: 0xf0001d1c, 0x9c0d: 0xf0001c1c, 0x9c0e: 0xf0001c1c, 0x9c0f: 0xf0001c1c, - 0x9c10: 0xf0001c1d, 0x9c11: 0xe0000cb9, 0x9c12: 0xe0000d36, 0x9c13: 0xe0000be3, - 0x9c14: 0xe0000fc5, 0x9c15: 0xf0001c1c, 0x9c16: 0xf0001c1c, 0x9c17: 0xf0001c1c, - 0x9c18: 0xf0001c1c, 0x9c19: 0xf0001c1c, 0x9c1a: 0xf0001c1c, 0x9c1b: 0xf0001c1c, - 0x9c1c: 0xf0001c1c, 0x9c1d: 0xf0001c1c, 0x9c1e: 0xf0001c1c, 0x9c1f: 0xe0000d3e, - 0x9c20: 0xe0000a72, 0x9c21: 0xf0001c1c, 0x9c22: 0xe0000cbd, 0x9c23: 0xe0000d42, - 0x9c24: 0xe0000a76, 0x9c25: 0xf0001c1c, 0x9c26: 0xe0000cc1, 0x9c27: 0xe0000d2d, - 0x9c28: 0xe0000d31, 0x9c29: 0xf0001c1d, 0x9c2a: 0xe0000cc5, 0x9c2b: 0xe0000d4a, - 0x9c2c: 0xe0000be7, 0x9c2d: 0xe0000f0b, 0x9c2e: 0xe0000f0f, 0x9c2f: 0xe0000f15, - 0x9c30: 0xf0001c1c, 0x9c31: 0xf0001c1c, 0x9c32: 0xf0001c1c, 0x9c33: 0xf0001c1c, - 0x9c34: 0xf0001d1c, 0x9c35: 0xf0001d1c, 0x9c36: 0xf0001d1c, 0x9c37: 0xf0001d1c, - 0x9c38: 0xf0001d1c, 0x9c39: 0xf0001d1d, 0x9c3a: 0xe00035df, 0x9c3b: 0xe00035cd, - 0x9c3c: 0xe0003600, 0x9c3d: 0xe00035af, 0x9c3e: 0xe0002812, 0x9c3f: 0xe00035b2, - // Block 0x271, offset 0x9c40 - 0x9c40: 0xf0001f04, 0x9c41: 0xf0001f04, 0x9c42: 0xf0001f04, 0x9c43: 0xf0001f04, - 0x9c44: 0xf0001f04, 0x9c45: 0xf0001f04, 0x9c46: 0xf0001f04, 0x9c47: 0xf0001f04, - 0x9c48: 0xf0001f04, 0x9c49: 0xf0001f04, 0x9c4a: 0xf0001f04, - 0x9c50: 0xf0000a04, 0x9c51: 0xf0000a04, 0x9c52: 0xf0000a04, 0x9c53: 0xf0000a04, - 0x9c54: 0xf0000a04, 0x9c55: 0xf0000a04, 0x9c56: 0xf0000a04, 0x9c57: 0xf0000a04, - 0x9c58: 0xf0000a04, 0x9c59: 0xf0000a04, 0x9c5a: 0xf0000a04, 0x9c5b: 0xf0000a04, - 0x9c5c: 0xf0000a04, 0x9c5d: 0xf0000a04, 0x9c5e: 0xf0000a04, 0x9c5f: 0xf0000a04, - 0x9c60: 0xf0000a04, 0x9c61: 0xf0000a04, 0x9c62: 0xf0000a04, 0x9c63: 0xf0000a04, - 0x9c64: 0xf0000a04, 0x9c65: 0xf0000a04, 0x9c66: 0xe0002c4a, 0x9c67: 0xf0000a04, - 0x9c68: 0xf0000a04, 0x9c69: 0xf0000a04, 0x9c6a: 0xf0000a04, 0x9c6b: 0x002c3a8c, - 0x9c6c: 0x002f7a8c, 0x9c6d: 0xf0000c0c, 0x9c6e: 0xe00035e8, - 0x9c70: 0x002bde9d, 0x9c71: 0x002c0a9d, 0x9c72: 0x002c3a9d, 0x9c73: 0x002c629d, - 0x9c74: 0x002c989d, 0x9c75: 0x002d089d, 0x9c76: 0x002d229d, 0x9c77: 0x002d689d, - 0x9c78: 0x002d9a9d, 0x9c79: 0x002dcc9d, 0x9c7a: 0x002dfe9d, 0x9c7b: 0x002e229d, - 0x9c7c: 0x002e829d, 0x9c7d: 0x002e9e9d, 0x9c7e: 0x002ee29d, 0x9c7f: 0x002f2c9d, - // Block 0x272, offset 0x9c80 - 0x9c80: 0xa0000000, 0x9c81: 0xa0000000, 0x9c82: 0xa0000000, 0x9c83: 0xa0000000, - 0x9c84: 0xa0000000, 0x9c85: 0xa0000000, 0x9c86: 0xa0000000, 0x9c87: 0xa0000000, - 0x9c88: 0xa0000000, 0x9c89: 0x40020020, 0x9c8a: 0x40020220, 0x9c8b: 0x40020420, - 0x9c8c: 0x40020620, 0x9c8d: 0x40020820, 0x9c8e: 0xa0000000, 0x9c8f: 0xa0000000, - 0x9c90: 0xa0000000, 0x9c91: 0xa0000000, 0x9c92: 0xa0000000, 0x9c93: 0xa0000000, - 0x9c94: 0xa0000000, 0x9c95: 0xa0000000, 0x9c96: 0xa0000000, 0x9c97: 0xa0000000, - 0x9c98: 0xa0000000, 0x9c99: 0xa0000000, 0x9c9a: 0xa0000000, 0x9c9b: 0xa0000000, - 0x9c9c: 0xa0000000, 0x9c9d: 0xa0000000, 0x9c9e: 0xa0000000, 0x9c9f: 0xa0000000, - 0x9ca0: 0x40021220, 0x9ca1: 0x4002ba20, 0x9ca2: 0x4003e020, 0x9ca3: 0x4004ea20, - 0x9ca4: 0x4027de20, 0x9ca5: 0x4004ec20, 0x9ca6: 0x4004e620, 0x9ca7: 0x4003d220, - 0x9ca8: 0x4003f420, 0x9ca9: 0x4003f620, 0x9caa: 0x4004d820, 0x9cab: 0x40093820, - 0x9cac: 0x40024020, 0x9cad: 0x40021a20, 0x9cae: 0x4002e420, 0x9caf: 0x4004e220, - 0x9cb0: 0x4029cc20, 0x9cb1: 0x4029ce20, 0x9cb2: 0x4029d020, 0x9cb3: 0x4029d220, - 0x9cb4: 0x4029d420, 0x9cb5: 0x4029d620, 0x9cb6: 0x4029d820, 0x9cb7: 0x4029da20, - 0x9cb8: 0x4029dc20, 0x9cb9: 0x4029de20, 0x9cba: 0x40026c20, 0x9cbb: 0x40026220, - 0x9cbc: 0x40094020, 0x9cbd: 0x40094220, 0x9cbe: 0x40094420, 0x9cbf: 0x4002c420, - // Block 0x273, offset 0x9cc0 - 0x9cc0: 0x4004d620, 0x9cc1: 0x002bde88, 0x9cc2: 0x002c0a88, 0x9cc3: 0x002c3a88, - 0x9cc4: 0x002c6288, 0x9cc5: 0x002c9888, 0x9cc6: 0x002d0888, 0x9cc7: 0x002d2288, - 0x9cc8: 0x002d6888, 0x9cc9: 0x002d9a88, 0x9cca: 0x002dcc88, 0x9ccb: 0x002dfe88, - 0x9ccc: 0xc0030002, 0x9ccd: 0x002e8288, 0x9cce: 0xc5852853, 0x9ccf: 0x002ee288, - 0x9cd0: 0x002f2c88, 0x9cd1: 0x002f5688, 0x9cd2: 0x002f7a88, 0x9cd3: 0x002fe688, - 0x9cd4: 0x00302c88, 0x9cd5: 0x00306c88, 0x9cd6: 0x0030be88, 0x9cd7: 0x0030e288, - 0x9cd8: 0x0030f688, 0x9cd9: 0x00310088, 0x9cda: 0x00312a88, 0x9cdb: 0x4003f820, - 0x9cdc: 0x4004e420, 0x9cdd: 0x4003fa20, 0x9cde: 0x40062420, 0x9cdf: 0x40021620, - 0x9ce0: 0x40061e20, 0x9ce1: 0x402bde20, 0x9ce2: 0x402c0a20, 0x9ce3: 0x402c3a20, - 0x9ce4: 0x402c6220, 0x9ce5: 0x402c9820, 0x9ce6: 0x402d0820, 0x9ce7: 0x402d2220, - 0x9ce8: 0x402d6820, 0x9ce9: 0x402d9a20, 0x9cea: 0x402dcc20, 0x9ceb: 0x402dfe20, - 0x9cec: 0xc0000002, 0x9ced: 0x402e8220, 0x9cee: 0xc5822822, 0x9cef: 0x402ee220, - 0x9cf0: 0x402f2c20, 0x9cf1: 0x402f5620, 0x9cf2: 0x402f7a20, 0x9cf3: 0x402fe620, - 0x9cf4: 0x40302c20, 0x9cf5: 0x40306c20, 0x9cf6: 0x4030be20, 0x9cf7: 0x4030e220, - 0x9cf8: 0x4030f620, 0x9cf9: 0x40310020, 0x9cfa: 0x40312a20, 0x9cfb: 0x4003fc20, - 0x9cfc: 0x40094820, 0x9cfd: 0x4003fe20, 0x9cfe: 0x40094c20, 0x9cff: 0xa0000000, - // Block 0x274, offset 0x9d00 - 0x9d01: 0x40417021, 0x9d02: 0x40417020, 0x9d03: 0x40417220, - 0x9d05: 0x40417020, 0x9d06: 0x40417220, 0x9d07: 0x40417420, - 0x9d08: 0x40417620, 0x9d09: 0x40417820, 0x9d0a: 0x40417a20, 0x9d0b: 0x40417c20, - 0x9d0c: 0x40418020, 0x9d0d: 0x40418420, 0x9d0f: 0x40418620, - 0x9d10: 0x40418820, 0x9d11: 0x40418a20, 0x9d13: 0x40418c20, - 0x9d14: 0x40418e20, 0x9d15: 0x40419020, 0x9d16: 0x40419220, 0x9d17: 0x40419420, - 0x9d18: 0x40419620, 0x9d19: 0x40419820, 0x9d1a: 0x40419a20, 0x9d1b: 0x40419c20, - 0x9d1c: 0x40419e20, 0x9d1d: 0x4041a020, 0x9d1e: 0x4041a220, 0x9d1f: 0x4041a420, - 0x9d20: 0x4041a620, 0x9d21: 0x4041a820, 0x9d22: 0x4041aa20, 0x9d23: 0x4041ac20, - 0x9d24: 0x4041ae20, 0x9d25: 0x4041b020, 0x9d26: 0x4041b220, 0x9d27: 0x4041b420, - 0x9d28: 0x4041b620, 0x9d2a: 0x4041b820, 0x9d2b: 0x4041ba20, - 0x9d2c: 0x4041bc20, 0x9d2d: 0x4041be20, 0x9d2e: 0x4041c020, 0x9d2f: 0x4041c220, - 0x9d30: 0x4041c420, 0x9d32: 0x4041c620, 0x9d33: 0x4041d220, - 0x9d35: 0x4041c820, 0x9d36: 0x4041ca20, 0x9d37: 0x4041cc20, - 0x9d38: 0x4041ce20, 0x9d39: 0x4041d020, - 0x9d3c: 0xa070f102, 0x9d3d: 0x4041d420, 0x9d3e: 0x4041d620, 0x9d3f: 0x4041d820, - // Block 0x275, offset 0x9d40 - 0x9d40: 0xa0000000, 0x9d41: 0xa0000000, 0x9d42: 0xa0000000, 0x9d43: 0xa0000000, - 0x9d44: 0xa0000000, 0x9d45: 0xa0000000, 0x9d46: 0xa0000000, 0x9d47: 0xa0000000, - 0x9d48: 0xa0000000, 0x9d49: 0x40020020, 0x9d4a: 0x40020220, 0x9d4b: 0x40020420, - 0x9d4c: 0x40020620, 0x9d4d: 0x40020820, 0x9d4e: 0xa0000000, 0x9d4f: 0xa0000000, - 0x9d50: 0xa0000000, 0x9d51: 0xa0000000, 0x9d52: 0xa0000000, 0x9d53: 0xa0000000, - 0x9d54: 0xa0000000, 0x9d55: 0xa0000000, 0x9d56: 0xa0000000, 0x9d57: 0xa0000000, - 0x9d58: 0xa0000000, 0x9d59: 0xa0000000, 0x9d5a: 0xa0000000, 0x9d5b: 0xa0000000, - 0x9d5c: 0xa0000000, 0x9d5d: 0xa0000000, 0x9d5e: 0xa0000000, 0x9d5f: 0xa0000000, - 0x9d60: 0x40021220, 0x9d61: 0x4002ba20, 0x9d62: 0x4003e020, 0x9d63: 0x4004ea20, - 0x9d64: 0x4027de20, 0x9d65: 0x4004ec20, 0x9d66: 0x4004e620, 0x9d67: 0xc58f26f2, - 0x9d68: 0x4003f420, 0x9d69: 0x4003f620, 0x9d6a: 0x4004d820, 0x9d6b: 0x40093820, - 0x9d6c: 0x40024020, 0x9d6d: 0x40021a20, 0x9d6e: 0x4002e420, 0x9d6f: 0x4004e220, - 0x9d70: 0x4029cc20, 0x9d71: 0x4029ce20, 0x9d72: 0x4029d020, 0x9d73: 0x4029d220, - 0x9d74: 0x4029d420, 0x9d75: 0x4029d620, 0x9d76: 0x4029d820, 0x9d77: 0x4029da20, - 0x9d78: 0x4029dc20, 0x9d79: 0x4029de20, 0x9d7a: 0x40026c20, 0x9d7b: 0x40026220, - 0x9d7c: 0x40094020, 0x9d7d: 0x40094220, 0x9d7e: 0x40094420, 0x9d7f: 0x4002c420, - // Block 0x276, offset 0x9d80 - 0x9d80: 0x4004d620, 0x9d81: 0x002bde88, 0x9d82: 0x002c0a88, 0x9d83: 0x002c3a88, - 0x9d84: 0x002c6288, 0x9d85: 0x002c9888, 0x9d86: 0x002d0888, 0x9d87: 0x002d2288, - 0x9d88: 0x002d6888, 0x9d89: 0x002d9a88, 0x9d8a: 0x002dcc88, 0x9d8b: 0x002dfe88, - 0x9d8c: 0xc0030002, 0x9d8d: 0x002e8288, 0x9d8e: 0x002e9e88, 0x9d8f: 0x002ee288, - 0x9d90: 0x002f2c88, 0x9d91: 0x002f5688, 0x9d92: 0x002f7a88, 0x9d93: 0xc58909c2, - 0x9d94: 0xc38a2722, 0x9d95: 0x00306c88, 0x9d96: 0x0030be88, 0x9d97: 0x0030e288, - 0x9d98: 0x0030f688, 0x9d99: 0x00310088, 0x9d9a: 0x00312a88, 0x9d9b: 0x4003f820, - 0x9d9c: 0x4004e420, 0x9d9d: 0x4003fa20, 0x9d9e: 0x40062420, 0x9d9f: 0x40021620, - 0x9da0: 0x40061e20, 0x9da1: 0x402bde20, 0x9da2: 0x402c0a20, 0x9da3: 0x402c3a20, - 0x9da4: 0x402c6220, 0x9da5: 0x402c9820, 0x9da6: 0x402d0820, 0x9da7: 0x402d2220, - 0x9da8: 0x402d6820, 0x9da9: 0x402d9a20, 0x9daa: 0x402dcc20, 0x9dab: 0x402dfe20, - 0x9dac: 0xc0000002, 0x9dad: 0x402e8220, 0x9dae: 0x402e9e20, 0x9daf: 0x402ee220, - 0x9db0: 0x402f2c20, 0x9db1: 0x402f5620, 0x9db2: 0x402f7a20, 0x9db3: 0xc34109b1, - 0x9db4: 0xc3882711, 0x9db5: 0x40306c20, 0x9db6: 0x4030be20, 0x9db7: 0x4030e220, - 0x9db8: 0x4030f620, 0x9db9: 0x40310020, 0x9dba: 0x40312a20, 0x9dbb: 0x4003fc20, - 0x9dbc: 0x40094820, 0x9dbd: 0x4003fe20, 0x9dbe: 0x40094c20, 0x9dbf: 0xa0000000, - // Block 0x277, offset 0x9dc0 - 0x9dc0: 0x402c1a20, 0x9dc1: 0x002c0c83, 0x9dc2: 0x002c3288, 0x9dc3: 0x402c3220, - 0x9dc4: 0x0031c488, 0x9dc5: 0x4031c420, 0x9dc6: 0x002efa88, 0x9dc7: 0x002c4e88, - 0x9dc8: 0x402c4e20, 0x9dc9: 0x002c7288, 0x9dca: 0x002c6483, 0x9dcb: 0x002c8488, - 0x9dcc: 0x402c8420, 0x9dcd: 0xe000115c, 0x9dce: 0x002cae88, 0x9dcf: 0x002cb888, - 0x9dd0: 0x002cc288, 0x9dd1: 0x002d1688, 0x9dd2: 0x402d1620, 0x9dd3: 0x002d4488, - 0x9dd4: 0x002d5888, 0x9dd5: 0x402d7820, 0x9dd6: 0x002dc288, 0x9dd7: 0x002db688, - 0x9dd8: 0x002e0083, 0x9dd9: 0x402e0020, 0x9dda: 0x402e3820, 0x9ddb: 0x402e7220, - 0x9ddc: 0x0030a088, 0x9ddd: 0x002eb488, 0x9dde: 0x402ebc20, 0x9ddf: 0x002f1088, - 0x9de0: 0xe0000e56, 0x9de1: 0xe0000e53, 0x9de2: 0x002d6088, 0x9de3: 0x402d6020, - 0x9de4: 0x002f3e88, 0x9de5: 0x402f3e20, 0x9de6: 0x002f8288, 0x9de7: 0x0031b488, - 0x9de8: 0x4031b420, 0x9de9: 0x00300888, 0x9dea: 0x40301220, 0x9deb: 0x40304220, - 0x9dec: 0x00304a88, 0x9ded: 0x40304a20, 0x9dee: 0x00305288, 0x9def: 0xe000105f, - 0x9df0: 0xe000105c, 0x9df1: 0x0030b488, 0x9df2: 0x0030cc88, 0x9df3: 0x00310285, - 0x9df4: 0x40310220, 0x9df5: 0x00313488, 0x9df6: 0x40313420, 0x9df7: 0x00316488, - 0x9df8: 0x00316e88, 0x9df9: 0x40316e20, 0x9dfa: 0x40317820, 0x9dfb: 0x4031a620, - 0x9dfc: 0x0031bc88, 0x9dfd: 0x4031bc20, 0x9dfe: 0xe0000fc9, 0x9dff: 0x40319420, - // Block 0x278, offset 0x9e00 - 0x9e00: 0x40315820, 0x9e01: 0x0031d488, 0x9e02: 0x4031d420, 0x9e03: 0x002c1a88, - 0x9e04: 0x00307c88, 0x9e05: 0x0030da88, 0x9e06: 0x002ca288, 0x9e07: 0x402ca220, - 0x9e08: 0x002dde88, 0x9e09: 0x402dde20, 0x9e0a: 0x002f6a88, 0x9e0b: 0x402f6a20, - 0x9e0c: 0x002f8e88, 0x9e0d: 0x402f8e20, 0x9e0e: 0x00311088, 0x9e0f: 0x40311020, - 0x9e10: 0x402bf020, 0x9e11: 0x402bf820, 0x9e12: 0x402c0220, 0x9e13: 0x402c0c20, - 0x9e14: 0x402efa20, 0x9e15: 0x402c5620, 0x9e16: 0x402c7220, 0x9e17: 0x402c6420, - 0x9e18: 0x402ccc20, 0x9e19: 0x402cb820, 0x9e1a: 0x402cd420, 0x9e1b: 0x402cc220, - 0x9e1c: 0x402cdc20, 0x9e1d: 0x402ce820, 0x9e1e: 0x402cf020, 0x9e1f: 0x402dee20, - 0x9e20: 0x402d4420, 0x9e21: 0x402d2a20, 0x9e22: 0x402d3220, 0x9e23: 0x402d5820, - 0x9e24: 0x402d0020, 0x9e25: 0x40308820, 0x9e26: 0x402d8020, 0x9e27: 0x402d8e20, - 0x9e28: 0x402db620, 0x9e29: 0x402dc220, 0x9e2a: 0x402daa20, 0x9e2b: 0x402e4220, - 0x9e2c: 0x402e4a20, 0x9e2d: 0x402e5420, 0x9e2e: 0x402e6820, 0x9e2f: 0x4030a020, - 0x9e30: 0x4030ac20, 0x9e31: 0x402e9020, 0x9e32: 0x402eb420, 0x9e33: 0x402ec820, - 0x9e34: 0x402ea620, 0x9e35: 0x402f1020, 0x9e36: 0x402eee20, 0x9e37: 0x402f1a20, - 0x9e38: 0x402f4c20, 0x9e39: 0x402f9820, 0x9e3a: 0x402fa220, 0x9e3b: 0x402fac20, - 0x9e3c: 0x402fb620, 0x9e3d: 0x402fbe20, 0x9e3e: 0x402fc620, 0x9e3f: 0x402fd020, - // Block 0x279, offset 0x9e40 - 0x9e40: 0x402f8220, 0x9e41: 0x402fd820, 0x9e42: 0x402ff420, 0x9e43: 0x40300820, - 0x9e44: 0x402df620, 0x9e45: 0x40301a20, 0x9e46: 0x40302420, 0x9e47: 0x40306420, - 0x9e48: 0x40305220, 0x9e49: 0x40307c20, 0x9e4a: 0x4030b420, 0x9e4b: 0x4030cc20, - 0x9e4c: 0x4030da20, 0x9e4d: 0x4030ee20, 0x9e4e: 0x402e7a20, 0x9e4f: 0x40310820, - 0x9e50: 0x40314820, 0x9e51: 0x40315020, 0x9e52: 0x40316420, 0x9e53: 0x40318020, - 0x9e54: 0x4031cc20, 0x9e55: 0x4031e820, 0x9e56: 0x40320a20, 0x9e57: 0x40323220, - 0x9e58: 0x40323a20, 0x9e59: 0x402c1220, 0x9e5a: 0x402cf820, 0x9e5b: 0x402d4c20, - 0x9e5c: 0x402d7020, 0x9e5d: 0x402de620, 0x9e5e: 0x402e1a20, 0x9e5f: 0x402e2a20, - 0x9e60: 0x402f6220, 0x9e61: 0x4031fa20, 0x9e62: 0x40320220, 0x9e63: 0xe0000aca, - 0x9e64: 0xe0000adc, 0x9e65: 0xe0000ad9, 0x9e66: 0xe0000fcc, 0x9e67: 0xe0000fcf, - 0x9e68: 0xe0000fba, 0x9e69: 0xe0000ba1, 0x9e6a: 0xe0000d11, 0x9e6b: 0xe0000d18, - 0x9e6c: 0x40324220, 0x9e6d: 0x40324a20, 0x9e6e: 0x40309020, 0x9e6f: 0x40309820, - 0x9e70: 0x002d6894, 0x9e71: 0x002d8094, 0x9e72: 0x002dcc94, 0x9e73: 0x002f7a94, - 0x9e74: 0x002f9894, 0x9e75: 0x002fac94, 0x9e76: 0x002fd894, 0x9e77: 0x0030e294, - 0x9e78: 0x00310094, 0x9e79: 0x40064020, 0x9e7a: 0x40064420, 0x9e7b: 0x402d9620, - 0x9e7c: 0xc58c26f2, 0x9e7d: 0x402d9820, 0x9e7e: 0x4031e220, 0x9e7f: 0x4031f020, - // Block 0x27a, offset 0x9e80 - 0x9e80: 0xa0000000, 0x9e81: 0xa0000000, 0x9e82: 0xa0000000, 0x9e83: 0xa0000000, - 0x9e84: 0xa0000000, 0x9e85: 0xa0000000, 0x9e86: 0xa0000000, 0x9e87: 0xa0000000, - 0x9e88: 0xa0000000, 0x9e89: 0x40020020, 0x9e8a: 0x40020220, 0x9e8b: 0x40020420, - 0x9e8c: 0x40020620, 0x9e8d: 0x40020820, 0x9e8e: 0xa0000000, 0x9e8f: 0xa0000000, - 0x9e90: 0xa0000000, 0x9e91: 0xa0000000, 0x9e92: 0xa0000000, 0x9e93: 0xa0000000, - 0x9e94: 0xa0000000, 0x9e95: 0xa0000000, 0x9e96: 0xa0000000, 0x9e97: 0xa0000000, - 0x9e98: 0xa0000000, 0x9e99: 0xa0000000, 0x9e9a: 0xa0000000, 0x9e9b: 0xa0000000, - 0x9e9c: 0xa0000000, 0x9e9d: 0xa0000000, 0x9e9e: 0xa0000000, 0x9e9f: 0xa0000000, - 0x9ea0: 0x40021220, 0x9ea1: 0x4002ba20, 0x9ea2: 0x4003e020, 0x9ea3: 0x4004ea20, - 0x9ea4: 0x4027de20, 0x9ea5: 0x4004ec20, 0x9ea6: 0x4004e620, 0x9ea7: 0x4003d220, - 0x9ea8: 0x4003f420, 0x9ea9: 0x4003f620, 0x9eaa: 0x4004d820, 0x9eab: 0x40093820, - 0x9eac: 0x40024020, 0x9ead: 0x40021a20, 0x9eae: 0x4002e420, 0x9eaf: 0x4004e220, - 0x9eb0: 0x4029cc20, 0x9eb1: 0x4029ce20, 0x9eb2: 0x4029d020, 0x9eb3: 0x4029d220, - 0x9eb4: 0x4029d420, 0x9eb5: 0x4029d620, 0x9eb6: 0x4029d820, 0x9eb7: 0x4029da20, - 0x9eb8: 0x4029dc20, 0x9eb9: 0x4029de20, 0x9eba: 0x40026c20, 0x9ebb: 0x40026220, - 0x9ebc: 0x40094020, 0x9ebd: 0x40094220, 0x9ebe: 0x40094420, 0x9ebf: 0x4002c420, - // Block 0x27b, offset 0x9ec0 - 0x9ec0: 0x4004d620, 0x9ec1: 0x002bde83, 0x9ec2: 0x002c0a88, 0x9ec3: 0x002c3a88, - 0x9ec4: 0x002c6288, 0x9ec5: 0x002be083, 0x9ec6: 0x002d0888, 0x9ec7: 0x002d2288, - 0x9ec8: 0x002be883, 0x9ec9: 0x002be283, 0x9eca: 0x002dcc88, 0x9ecb: 0x002bea83, - 0x9ecc: 0xc5950002, 0x9ecd: 0x002bee83, 0x9ece: 0x002bf083, 0x9ecf: 0x002be483, - 0x9ed0: 0x002bf283, 0x9ed1: 0x002f5688, 0x9ed2: 0x002f7a88, 0x9ed3: 0x002fe688, - 0x9ed4: 0x00302c88, 0x9ed5: 0x002be683, 0x9ed6: 0x0030be88, 0x9ed7: 0x002bf483, - 0x9ed8: 0x0030f688, 0x9ed9: 0x00310088, 0x9eda: 0x00312a88, 0x9edb: 0x4003f820, - 0x9edc: 0x4004e420, 0x9edd: 0x4003fa20, 0x9ede: 0x40062420, 0x9edf: 0x40021620, - 0x9ee0: 0x40061e20, 0x9ee1: 0x402bde20, 0x9ee2: 0x402c0a20, 0x9ee3: 0x402c3a20, - 0x9ee4: 0x402c6220, 0x9ee5: 0x402be020, 0x9ee6: 0x402d0820, 0x9ee7: 0x402d2220, - 0x9ee8: 0x402be820, 0x9ee9: 0x402be220, 0x9eea: 0x402dcc20, 0x9eeb: 0x402bea20, - 0x9eec: 0xc5920002, 0x9eed: 0x402bee20, 0x9eee: 0x402bf020, 0x9eef: 0x402be420, - 0x9ef0: 0x402bf220, 0x9ef1: 0x402f5620, 0x9ef2: 0x402f7a20, 0x9ef3: 0x402fe620, - 0x9ef4: 0x40302c20, 0x9ef5: 0x402be620, 0x9ef6: 0x4030be20, 0x9ef7: 0x402bf420, - 0x9ef8: 0x4030f620, 0x9ef9: 0x40310020, 0x9efa: 0x40312a20, 0x9efb: 0x4003fc20, - 0x9efc: 0x40094820, 0x9efd: 0x4003fe20, 0x9efe: 0x40094c20, 0x9eff: 0xa0000000, - // Block 0x27c, offset 0x9f00 - 0x9f00: 0xe000382a, 0x9f01: 0xe0003827, 0x9f02: 0xe0003840, 0x9f03: 0xe0003864, - 0x9f04: 0xe000385d, 0x9f05: 0xe0003856, 0x9f06: 0xe00009dd, 0x9f07: 0xe0000a53, - 0x9f08: 0xe0003894, 0x9f09: 0xe000388e, 0x9f0a: 0xe00038a0, 0x9f0b: 0xe00038cc, - 0x9f0c: 0xe000393a, 0x9f0d: 0xe0003934, 0x9f0e: 0xe0003946, 0x9f0f: 0xe0003952, - 0x9f10: 0xe0000ab3, 0x9f11: 0xe0003be8, 0x9f12: 0xe0003999, 0x9f13: 0xe0003993, - 0x9f14: 0xe00039a5, 0x9f15: 0xe00039e5, 0x9f16: 0xe00039d1, 0x9f17: 0x40093e20, - 0x9f18: 0xe0000e12, 0x9f19: 0xe0003a89, 0x9f1a: 0xe0003a83, 0x9f1b: 0xe0003a95, - 0x9f1c: 0xe0003aa7, 0x9f1d: 0xe0001102, 0x9f1e: 0x00318888, 0x9f1f: 0xe0000f7b, - 0x9f20: 0xe00008f2, 0x9f21: 0xe00008ec, 0x9f22: 0xe000091e, 0x9f23: 0xe0000966, - 0x9f24: 0xe0000958, 0x9f25: 0xe000094a, 0x9f26: 0xe00009d5, 0x9f27: 0xe0000a4d, - 0x9f28: 0xe0003891, 0x9f29: 0xe000388b, 0x9f2a: 0xe000389d, 0x9f2b: 0xe00038c9, - 0x9f2c: 0xe0003937, 0x9f2d: 0xe0003931, 0x9f2e: 0xe0003943, 0x9f2f: 0xe000394f, - 0x9f30: 0xe0000aad, 0x9f31: 0xe0003be5, 0x9f32: 0xe0003996, 0x9f33: 0xe0003990, - 0x9f34: 0xe00039a2, 0x9f35: 0xe00039e2, 0x9f36: 0xe00039ce, 0x9f37: 0x40093c20, - 0x9f38: 0xe0000e0f, 0x9f39: 0xe0003a86, 0x9f3a: 0xe0003a80, 0x9f3b: 0xe0003a92, - 0x9f3c: 0xe0003aa4, 0x9f3d: 0xe00010ff, 0x9f3e: 0x40318820, 0x9f3f: 0xe0001114, - // Block 0x27d, offset 0x9f40 - 0x9f40: 0xe0003871, 0x9f41: 0xe0000980, 0x9f42: 0xe000382d, 0x9f43: 0xe00008f8, - 0x9f44: 0xe000386e, 0x9f45: 0xe000097a, 0x9f46: 0xe0000a38, 0x9f47: 0xe0000a35, - 0x9f48: 0xe0000a3e, 0x9f49: 0xe0000a3b, 0x9f4a: 0xe0000a4a, 0x9f4b: 0xe0000a47, - 0x9f4c: 0xe0000a44, 0x9f4d: 0xe0000a41, 0x9f4e: 0xe0000a86, 0x9f4f: 0xe0000a83, - 0x9f50: 0xe0000aaa, 0x9f51: 0xe0000aa7, 0x9f52: 0xe00038f2, 0x9f53: 0xe00038ef, - 0x9f54: 0xe000389a, 0x9f55: 0xe0003897, 0x9f56: 0xe00038d8, 0x9f57: 0xe00038d5, - 0x9f58: 0xe00038ec, 0x9f59: 0xe00038e9, 0x9f5a: 0xe00038c6, 0x9f5b: 0xe00038c3, - 0x9f5c: 0xe0000bb8, 0x9f5d: 0xe0000bb5, 0x9f5e: 0xe0000bb2, 0x9f5f: 0xe0000baf, - 0x9f60: 0xe0000bc4, 0x9f61: 0xe0000bc1, 0x9f62: 0xe0000bca, 0x9f63: 0xe0000bc7, - 0x9f64: 0xe0003b4d, 0x9f65: 0xe0003b4a, 0x9f66: 0xe0000c1b, 0x9f67: 0xe0000c18, - 0x9f68: 0xe0003960, 0x9f69: 0xe000395d, 0x9f6a: 0xe000396f, 0x9f6b: 0xe000396c, - 0x9f6c: 0xe0003940, 0x9f6d: 0xe000393d, 0x9f6e: 0xe0003969, 0x9f6f: 0xe0003966, - 0x9f70: 0xe0003963, 0x9f71: 0x402da220, 0x9f72: 0xe00027e2, 0x9f73: 0xe00027df, - 0x9f74: 0xe0000c8a, 0x9f75: 0xe0000c87, 0x9f76: 0xe0003b86, 0x9f77: 0xe0003b83, - 0x9f78: 0x402f7220, 0x9f79: 0xe0003b98, 0x9f7a: 0xe0003b95, 0x9f7b: 0xe0003ba4, - 0x9f7c: 0xe0003ba1, 0x9f7d: 0xe0003b9e, 0x9f7e: 0xe0003b9b, 0x9f7f: 0xe0000d04, - // Block 0x27e, offset 0x9f80 - 0x9f80: 0xe0000cfe, 0x9f81: 0xe0000cf8, 0x9f82: 0xe0000cf5, 0x9f83: 0xe0003bd6, - 0x9f84: 0xe0003bd3, 0x9f85: 0xe0003bf4, 0x9f86: 0xe0003bf1, 0x9f87: 0xe0003be2, - 0x9f88: 0xe0003bdf, 0x9f89: 0xe00035eb, 0x9f8a: 0x002eda88, 0x9f8b: 0x402eda20, - 0x9f8c: 0xe0003a1f, 0x9f8d: 0xe0003a1c, 0x9f8e: 0xe000399f, 0x9f8f: 0xe000399c, - 0x9f90: 0xe00039df, 0x9f91: 0xe00039dc, 0x9f92: 0xe0000e93, 0x9f93: 0xe0000e8f, - 0x9f94: 0xe0000eca, 0x9f95: 0xe0000ec7, 0x9f96: 0xe0000edc, 0x9f97: 0xe0000ed9, - 0x9f98: 0xe0000ed0, 0x9f99: 0xe0000ecd, 0x9f9a: 0xe0000f1f, 0x9f9b: 0xe0000f1c, - 0x9f9c: 0xe0000f2d, 0x9f9d: 0xe0000f2a, 0x9f9e: 0xe0000f47, 0x9f9f: 0xe0000f44, - 0x9fa0: 0xe0000f33, 0x9fa1: 0xe0000f30, 0x9fa2: 0xe0000f99, 0x9fa3: 0xe0000f96, - 0x9fa4: 0xe0000f8a, 0x9fa5: 0xe0000f87, 0x9fa6: 0x00303688, 0x9fa7: 0x40303620, - 0x9fa8: 0xe0003ad3, 0x9fa9: 0xe0003ad0, 0x9faa: 0xe0003ae7, 0x9fab: 0xe0003ae4, - 0x9fac: 0xe0003a8f, 0x9fad: 0xe0003a8c, 0x9fae: 0xe0003aa1, 0x9faf: 0xe0003a9e, - 0x9fb0: 0xe0003acd, 0x9fb1: 0xe0003aca, 0x9fb2: 0xe0003ae1, 0x9fb3: 0xe0003ade, - 0x9fb4: 0xe0003c24, 0x9fb5: 0xe0003c21, 0x9fb6: 0xe000110e, 0x9fb7: 0xe000110b, - 0x9fb8: 0xe0001117, 0x9fb9: 0xe000113b, 0x9fba: 0xe0001138, 0x9fbb: 0xe000114d, - 0x9fbc: 0xe000114a, 0x9fbd: 0xe0001147, 0x9fbe: 0xe0001144, 0x9fbf: 0xe0000f64, - // Block 0x27f, offset 0x9fc0 - 0x9fc0: 0x402c1a20, 0x9fc1: 0x002c2a88, 0x9fc2: 0x002c3288, 0x9fc3: 0x402c3220, - 0x9fc4: 0x0031c488, 0x9fc5: 0x4031c420, 0x9fc6: 0x002efa88, 0x9fc7: 0x002c4e88, - 0x9fc8: 0x402c4e20, 0x9fc9: 0x002c7288, 0x9fca: 0x002c7a88, 0x9fcb: 0x002c8488, - 0x9fcc: 0x402c8420, 0x9fcd: 0xe000115c, 0x9fce: 0x002cae88, 0x9fcf: 0x002cb888, - 0x9fd0: 0x002cc288, 0x9fd1: 0x002d1688, 0x9fd2: 0x402d1620, 0x9fd3: 0x002d4488, - 0x9fd4: 0x002d5888, 0x9fd5: 0x402d7820, 0x9fd6: 0x002dc288, 0x9fd7: 0x002db688, - 0x9fd8: 0x002e0a88, 0x9fd9: 0x402e0a20, 0x9fda: 0x402e3820, 0x9fdb: 0x402e7220, - 0x9fdc: 0x0030a088, 0x9fdd: 0x002eb488, 0x9fde: 0x402ebc20, 0x9fdf: 0x002f1088, - 0x9fe0: 0xe0003a47, 0x9fe1: 0xe0003a44, 0x9fe2: 0x002d6088, 0x9fe3: 0x402d6020, - 0x9fe4: 0x002f3e88, 0x9fe5: 0x402f3e20, 0x9fe6: 0x002f8288, 0x9fe7: 0x0031b488, - 0x9fe8: 0x4031b420, 0x9fe9: 0x00300888, 0x9fea: 0x40301220, 0x9feb: 0x40304220, - 0x9fec: 0x00304a88, 0x9fed: 0x40304a20, 0x9fee: 0x00305288, 0x9fef: 0xe0003b07, - 0x9ff0: 0xe0003b04, 0x9ff1: 0x0030b488, 0x9ff2: 0x0030cc88, 0x9ff3: 0x00311888, - 0x9ff4: 0x40311820, 0x9ff5: 0x00313488, 0x9ff6: 0x40313420, 0x9ff7: 0x00316488, - 0x9ff8: 0x00316e88, 0x9ff9: 0x40316e20, 0x9ffa: 0x40317820, 0x9ffb: 0x4031a620, - 0x9ffc: 0x0031bc88, 0x9ffd: 0x4031bc20, 0x9ffe: 0xe0000fc9, 0x9fff: 0x40319420, - // Block 0x280, offset 0xa000 - 0xa000: 0x40321220, 0xa001: 0x40321a20, 0xa002: 0x40322220, 0xa003: 0x40322a20, - 0xa004: 0xe0000ad5, 0xa005: 0xe0000ad1, 0xa006: 0xe0000acd, 0xa007: 0xe000357f, - 0xa008: 0xe000357c, 0xa009: 0xe0003579, 0xa00a: 0xe00035c4, 0xa00b: 0xe00035c1, - 0xa00c: 0xe00035be, 0xa00d: 0xe0003853, 0xa00e: 0xe0000944, 0xa00f: 0xe000394c, - 0xa010: 0xe0003949, 0xa011: 0xe00039cb, 0xa012: 0xe00039c8, 0xa013: 0xe0003a9b, - 0xa014: 0xe0003a98, 0xa015: 0xe0003ac6, 0xa016: 0xe0003ac2, 0xa017: 0xe0003aae, - 0xa018: 0xe0003aaa, 0xa019: 0xe0003abe, 0xa01a: 0xe0003aba, 0xa01b: 0xe0003ab6, - 0xa01c: 0xe0003ab2, 0xa01d: 0x402cae20, 0xa01e: 0xe0003860, 0xa01f: 0xe000095e, - 0xa020: 0xe000386a, 0xa021: 0xe0000972, 0xa022: 0xe00009f4, 0xa023: 0xe00009ef, - 0xa024: 0x002d3a88, 0xa025: 0x402d3a20, 0xa026: 0xe0000bbe, 0xa027: 0xe0000bbb, - 0xa028: 0xe0003b80, 0xa029: 0xe0003b7d, 0xa02a: 0xe0003a11, 0xa02b: 0xe0003a0e, - 0xa02c: 0xe0003a18, 0xa02d: 0xe0003a14, 0xa02e: 0xe0001162, 0xa02f: 0xe000115f, - 0xa030: 0xe0000c8d, 0xa031: 0xf0000a0a, 0xa032: 0xf000040a, 0xa033: 0xf0000404, - 0xa034: 0xe0000bac, 0xa035: 0xe0000ba9, 0xa036: 0x002d7888, 0xa037: 0x00319488, - 0xa038: 0xe0003bdc, 0xa039: 0xe0003bd9, 0xa03a: 0xe0003859, 0xa03b: 0xe0000950, - 0xa03c: 0xe00009ea, 0xa03d: 0xe00009e5, 0xa03e: 0xe0000e19, 0xa03f: 0xe0000e15, - // Block 0x281, offset 0xa040 - 0xa040: 0xe0003877, 0xa041: 0xe000098c, 0xa042: 0xe000387a, 0xa043: 0xe0000992, - 0xa044: 0xe000390e, 0xa045: 0xe000390b, 0xa046: 0xe0003914, 0xa047: 0xe0003911, - 0xa048: 0xe000397b, 0xa049: 0xe0003978, 0xa04a: 0xe0003981, 0xa04b: 0xe000397e, - 0xa04c: 0xe0003a3b, 0xa04d: 0xe0003a38, 0xa04e: 0xe0003a41, 0xa04f: 0xe0003a3e, - 0xa050: 0xe0000ee8, 0xa051: 0xe0000ee5, 0xa052: 0xe0000eee, 0xa053: 0xe0000eeb, - 0xa054: 0xe0003afb, 0xa055: 0xe0003af8, 0xa056: 0xe0003b01, 0xa057: 0xe0003afe, - 0xa058: 0xe0000f61, 0xa059: 0xe0000f5e, 0xa05a: 0xe0000fa5, 0xa05b: 0xe0000fa2, - 0xa05c: 0x00312288, 0xa05d: 0x40312220, 0xa05e: 0xe0003b53, 0xa05f: 0xe0003b50, - 0xa060: 0x002ebc88, 0xa061: 0x402c8c20, 0xa062: 0x002f2288, 0xa063: 0x402f2220, - 0xa064: 0x00314088, 0xa065: 0x40314020, 0xa066: 0xe0003867, 0xa067: 0xe000096c, - 0xa068: 0xe00038de, 0xa069: 0xe00038db, 0xa06a: 0xe00039d8, 0xa06b: 0xe00039d4, - 0xa06c: 0xe00039fc, 0xa06d: 0xe00039f8, 0xa06e: 0xe0003a03, 0xa06f: 0xe0003a00, - 0xa070: 0xe0003a0a, 0xa071: 0xe0003a06, 0xa072: 0xe0001129, 0xa073: 0xe0001126, - 0xa074: 0x402e5e20, 0xa075: 0x402ed020, 0xa076: 0x40305a20, 0xa077: 0x402dd420, - 0xa078: 0xe0000abf, 0xa079: 0xe0000ec4, 0xa07a: 0x002be888, 0xa07b: 0x002c4488, - 0xa07c: 0x402c4420, 0xa07d: 0x002e3888, 0xa07e: 0x00303e88, 0xa07f: 0x402ffc20, - // Block 0x282, offset 0xa080 - 0xa080: 0x402f8220, 0xa081: 0x402fd820, 0xa082: 0x402ff420, 0xa083: 0x40300820, - 0xa084: 0x402df620, 0xa085: 0x40301a20, 0xa086: 0x40302420, 0xa087: 0x40306420, - 0xa088: 0x40305220, 0xa089: 0x40307c20, 0xa08a: 0x4030b420, 0xa08b: 0x4030cc20, - 0xa08c: 0x4030da20, 0xa08d: 0x4030ee20, 0xa08e: 0x402e7a20, 0xa08f: 0x40310820, - 0xa090: 0x40314820, 0xa091: 0x40315020, 0xa092: 0x40316420, 0xa093: 0x40318020, - 0xa094: 0x4031cc20, 0xa095: 0x4031e820, 0xa096: 0x40320a20, 0xa097: 0x40323220, - 0xa098: 0x40323a20, 0xa099: 0x402c1220, 0xa09a: 0x402cf820, 0xa09b: 0x402d4c20, - 0xa09c: 0x402d7020, 0xa09d: 0x402de620, 0xa09e: 0x402e1a20, 0xa09f: 0x402e2a20, - 0xa0a0: 0x402f6220, 0xa0a1: 0x4031fa20, 0xa0a2: 0x40320220, 0xa0a3: 0xe0000aca, - 0xa0a4: 0xe0000adc, 0xa0a5: 0xe0000ad9, 0xa0a6: 0xe0000fcc, 0xa0a7: 0xe0000fcf, - 0xa0a8: 0xe0000fba, 0xa0a9: 0xe0000ba1, 0xa0aa: 0xe0000d11, 0xa0ab: 0xe0000d18, - 0xa0ac: 0x40324220, 0xa0ad: 0x40324a20, 0xa0ae: 0x40309020, 0xa0af: 0x40309820, - 0xa0b0: 0x002d6894, 0xa0b1: 0x002d8094, 0xa0b2: 0x002dcc94, 0xa0b3: 0x002f7a94, - 0xa0b4: 0x002f9894, 0xa0b5: 0x002fac94, 0xa0b6: 0x002fd894, 0xa0b7: 0x0030e294, - 0xa0b8: 0x00310094, 0xa0b9: 0x40064020, 0xa0ba: 0x40064420, 0xa0bb: 0x402bf620, - 0xa0bc: 0x4031de20, 0xa0bd: 0x402d9820, 0xa0be: 0x4031e220, 0xa0bf: 0x4031f020, - // Block 0x283, offset 0xa0c0 - 0xa0c0: 0xe0003888, 0xa0c1: 0xe00009ae, 0xa0c2: 0xe0000a22, 0xa0c3: 0xe0000a1f, - 0xa0c4: 0xe0000a28, 0xa0c5: 0xe0000a25, 0xa0c6: 0xe0000a2e, 0xa0c7: 0xe0000a2b, - 0xa0c8: 0xe0000a5a, 0xa0c9: 0xe0000a56, 0xa0ca: 0xe0000a8c, 0xa0cb: 0xe0000a89, - 0xa0cc: 0xe0000a98, 0xa0cd: 0xe0000a95, 0xa0ce: 0xe0000aa4, 0xa0cf: 0xe0000aa1, - 0xa0d0: 0xe0000a92, 0xa0d1: 0xe0000a8f, 0xa0d2: 0xe0000a9e, 0xa0d3: 0xe0000a9b, - 0xa0d4: 0xe0003901, 0xa0d5: 0xe00038fd, 0xa0d6: 0xe00038f9, 0xa0d7: 0xe00038f5, - 0xa0d8: 0xe0003928, 0xa0d9: 0xe0003925, 0xa0da: 0xe000392e, 0xa0db: 0xe000392b, - 0xa0dc: 0xe00038e5, 0xa0dd: 0xe00038e1, 0xa0de: 0xe0000b8c, 0xa0df: 0xe0000b89, - 0xa0e0: 0xe0000bd0, 0xa0e1: 0xe0000bcd, 0xa0e2: 0xe0003b5f, 0xa0e3: 0xe0003b5c, - 0xa0e4: 0xe0003b6b, 0xa0e5: 0xe0003b68, 0xa0e6: 0xe0003b59, 0xa0e7: 0xe0003b56, - 0xa0e8: 0xe0003b65, 0xa0e9: 0xe0003b62, 0xa0ea: 0xe0003b71, 0xa0eb: 0xe0003b6e, - 0xa0ec: 0xe000398d, 0xa0ed: 0xe000398a, 0xa0ee: 0xe0003959, 0xa0ef: 0xe0003955, - 0xa0f0: 0xe0003b7a, 0xa0f1: 0xe0003b77, 0xa0f2: 0xe0003b8c, 0xa0f3: 0xe0003b89, - 0xa0f4: 0xe0003b92, 0xa0f5: 0xe0003b8f, 0xa0f6: 0xe0003baa, 0xa0f7: 0xe0003ba7, - 0xa0f8: 0xe0003bb1, 0xa0f9: 0xe0003bad, 0xa0fa: 0xe0003bbe, 0xa0fb: 0xe0003bbb, - 0xa0fc: 0xe0003bb8, 0xa0fd: 0xe0003bb5, 0xa0fe: 0xe0003bc4, 0xa0ff: 0xe0003bc1, - // Block 0x284, offset 0xa100 - 0xa100: 0xe0003bca, 0xa101: 0xe0003bc7, 0xa102: 0xe0003bd0, 0xa103: 0xe0003bcd, - 0xa104: 0xe0003bee, 0xa105: 0xe0003beb, 0xa106: 0xe0003bfa, 0xa107: 0xe0003bf7, - 0xa108: 0xe0003c06, 0xa109: 0xe0003c03, 0xa10a: 0xe0003c00, 0xa10b: 0xe0003bfd, - 0xa10c: 0xe00039ec, 0xa10d: 0xe00039e8, 0xa10e: 0xe00039f4, 0xa10f: 0xe00039f0, - 0xa110: 0xe0003a2e, 0xa111: 0xe0003a2a, 0xa112: 0xe0003a26, 0xa113: 0xe0003a22, - 0xa114: 0xe0003c0c, 0xa115: 0xe0003c09, 0xa116: 0xe0003c12, 0xa117: 0xe0003c0f, - 0xa118: 0xe0000ed6, 0xa119: 0xe0000ed3, 0xa11a: 0xe0000ef4, 0xa11b: 0xe0000ef1, - 0xa11c: 0xe0000efb, 0xa11d: 0xe0000ef7, 0xa11e: 0xe0000f02, 0xa11f: 0xe0000eff, - 0xa120: 0xe0000f41, 0xa121: 0xe0000f3e, 0xa122: 0xe0000f53, 0xa123: 0xe0000f50, - 0xa124: 0xe0000f26, 0xa125: 0xe0000f22, 0xa126: 0xe0000f3a, 0xa127: 0xe0000f36, - 0xa128: 0xe0000f5a, 0xa129: 0xe0000f56, 0xa12a: 0xe0000f93, 0xa12b: 0xe0000f90, - 0xa12c: 0xe0000f9f, 0xa12d: 0xe0000f9c, 0xa12e: 0xe0000fb1, 0xa12f: 0xe0000fae, - 0xa130: 0xe0000fab, 0xa131: 0xe0000fa8, 0xa132: 0xe0003b3b, 0xa133: 0xe0003b38, - 0xa134: 0xe0003b47, 0xa135: 0xe0003b44, 0xa136: 0xe0003b41, 0xa137: 0xe0003b3e, - 0xa138: 0xe0003ada, 0xa139: 0xe0003ad6, 0xa13a: 0xe0003aee, 0xa13b: 0xe0003aea, - 0xa13c: 0xe00010a9, 0xa13d: 0xe00010a6, 0xa13e: 0xe00010af, 0xa13f: 0xe00010ac, - // Block 0x285, offset 0xa140 - 0xa140: 0xe0003c1e, 0xa141: 0xe0003c1b, 0xa142: 0xe0003c18, 0xa143: 0xe0003c15, - 0xa144: 0xe0003c2d, 0xa145: 0xe0003c2a, 0xa146: 0xe0003c33, 0xa147: 0xe0003c30, - 0xa148: 0xe0003c39, 0xa149: 0xe0003c36, 0xa14a: 0xe00010fc, 0xa14b: 0xe00010f9, - 0xa14c: 0xe00010f6, 0xa14d: 0xe00010f3, 0xa14e: 0xe0001123, 0xa14f: 0xe0001120, - 0xa150: 0xe0001141, 0xa151: 0xe000113e, 0xa152: 0xe0001153, 0xa153: 0xe0001150, - 0xa154: 0xe0001159, 0xa155: 0xe0001156, 0xa156: 0xe0003b74, 0xa157: 0xe0000f8d, - 0xa158: 0xe0003c27, 0xa159: 0xe0001111, 0xa15a: 0xf0000404, 0xa15b: 0xe0000f70, - 0xa15c: 0x40300420, 0xa15d: 0x40300620, 0xa15e: 0xe0000f7f, 0xa15f: 0x402c9620, - 0xa160: 0xe000387d, 0xa161: 0xe0000998, 0xa162: 0xe0003874, 0xa163: 0xe0000986, - 0xa164: 0xe0003843, 0xa165: 0xe0000924, 0xa166: 0xe0003847, 0xa167: 0xe000092c, - 0xa168: 0xe000384f, 0xa169: 0xe000093c, 0xa16a: 0xe000384b, 0xa16b: 0xe0000934, - 0xa16c: 0xe0003884, 0xa16d: 0xe00009a6, 0xa16e: 0xe0003830, 0xa16f: 0xe00008fe, - 0xa170: 0xe0003834, 0xa171: 0xe0000906, 0xa172: 0xe000383c, 0xa173: 0xe0000916, - 0xa174: 0xe0003838, 0xa175: 0xe000090e, 0xa176: 0xe0003880, 0xa177: 0xe000099e, - 0xa178: 0xe000391a, 0xa179: 0xe0003917, 0xa17a: 0xe0003908, 0xa17b: 0xe0003905, - 0xa17c: 0xe00038d2, 0xa17d: 0xe00038cf, 0xa17e: 0xe00038a7, 0xa17f: 0xe00038a3, - // Block 0x286, offset 0xa180 - 0xa180: 0xe00038af, 0xa181: 0xe00038ab, 0xa182: 0xe00038bf, 0xa183: 0xe00038bb, - 0xa184: 0xe00038b7, 0xa185: 0xe00038b3, 0xa186: 0xe0003921, 0xa187: 0xe000391d, - 0xa188: 0xe0003975, 0xa189: 0xe0003972, 0xa18a: 0xe0003987, 0xa18b: 0xe0003984, - 0xa18c: 0xe0003a75, 0xa18d: 0xe0003a72, 0xa18e: 0xe0003a35, 0xa18f: 0xe0003a32, - 0xa190: 0xe00039ac, 0xa191: 0xe00039a8, 0xa192: 0xe00039b4, 0xa193: 0xe00039b0, - 0xa194: 0xe00039c4, 0xa195: 0xe00039c0, 0xa196: 0xe00039bc, 0xa197: 0xe00039b8, - 0xa198: 0xe0003a7c, 0xa199: 0xe0003a78, 0xa19a: 0xe0003a4e, 0xa19b: 0xe0003a4a, - 0xa19c: 0xe0003a56, 0xa19d: 0xe0003a52, 0xa19e: 0xe0003a66, 0xa19f: 0xe0003a62, - 0xa1a0: 0xe0003a5e, 0xa1a1: 0xe0003a5a, 0xa1a2: 0xe0003a6e, 0xa1a3: 0xe0003a6a, - 0xa1a4: 0xe0003b35, 0xa1a5: 0xe0003b32, 0xa1a6: 0xe0003af5, 0xa1a7: 0xe0003af2, - 0xa1a8: 0xe0003b0e, 0xa1a9: 0xe0003b0a, 0xa1aa: 0xe0003b16, 0xa1ab: 0xe0003b12, - 0xa1ac: 0xe0003b26, 0xa1ad: 0xe0003b22, 0xa1ae: 0xe0003b1e, 0xa1af: 0xe0003b1a, - 0xa1b0: 0xe0003b2e, 0xa1b1: 0xe0003b2a, 0xa1b2: 0xe0001108, 0xa1b3: 0xe0001105, - 0xa1b4: 0xe0001135, 0xa1b5: 0xe0001132, 0xa1b6: 0xe000112f, 0xa1b7: 0xe000112c, - 0xa1b8: 0xe000111d, 0xa1b9: 0xe000111a, 0xa1ba: 0xe0000d0a, 0xa1bb: 0xe0000d07, - 0xa1bc: 0x0030d888, 0xa1bd: 0x4030d820, 0xa1be: 0x00312088, 0xa1bf: 0x40312020, - // Block 0x287, offset 0xa1c0 - 0xa1c0: 0xe00009bc, 0xa1c1: 0xe00009c0, 0xa1c2: 0x002c3a8b, 0xa1c3: 0xf0000a04, - 0xa1c4: 0x40081c20, 0xa1c5: 0xe0000a5e, 0xa1c6: 0xe0000a62, 0xa1c7: 0x002cc28a, - 0xa1c8: 0x40081e20, 0xa1c9: 0xf0000a04, 0xa1ca: 0x002d2285, 0xa1cb: 0x002d688b, - 0xa1cc: 0x002d688b, 0xa1cd: 0x002d688b, 0xa1ce: 0x002d6885, 0xa1cf: 0xf0000202, - 0xa1d0: 0x002d9a8b, 0xa1d1: 0x002d9a8b, 0xa1d2: 0x002e228b, 0xa1d3: 0x002e2285, - 0xa1d4: 0x40082020, 0xa1d5: 0x002e9e8b, 0xa1d6: 0xe000281e, 0xa1d7: 0x40082220, - 0xa1d8: 0x40082420, 0xa1d9: 0x002f2c8b, 0xa1da: 0x002f568b, 0xa1db: 0x002f7a8b, - 0xa1dc: 0x002f7a8b, 0xa1dd: 0x002f7a8b, 0xa1de: 0x40082620, 0xa1df: 0x40082820, - 0xa1e0: 0xe0002833, 0xa1e1: 0xe0000fbd, 0xa1e2: 0xe0002842, 0xa1e3: 0x40082a20, - 0xa1e4: 0x00312a8b, 0xa1e5: 0x40082c20, 0xa1e6: 0x0032a288, 0xa1e7: 0x40082e20, - 0xa1e8: 0x00312a8b, 0xa1e9: 0x40083020, 0xa1ea: 0x002bea83, 0xa1eb: 0xe0003856, - 0xa1ec: 0x002c0a8b, 0xa1ed: 0x002c3a8b, 0xa1ee: 0x40083220, 0xa1ef: 0x002c9885, - 0xa1f0: 0x002c988b, 0xa1f1: 0x002d088b, 0xa1f2: 0x002d1e88, 0xa1f3: 0x002e828b, - 0xa1f4: 0x002ee285, 0xa1f5: 0x00389084, 0xa1f6: 0x00389284, 0xa1f7: 0x00389484, - 0xa1f8: 0x00389684, 0xa1f9: 0x002d9a85, 0xa1fa: 0x40083420, 0xa1fb: 0xe0000b95, - 0xa1fc: 0x00327e85, 0xa1fd: 0x00325685, 0xa1fe: 0x0032568b, 0xa1ff: 0x00327e8b, - // Block 0x288, offset 0xa200 - 0xa200: 0xe0000024, 0xa201: 0xe0000029, 0xa202: 0xe000002e, 0xa203: 0xe0000033, - 0xa204: 0xe0000038, 0xa205: 0xe000003d, 0xa206: 0xe0000042, 0xa207: 0xe0000047, - 0xa208: 0xf0001f04, 0xa209: 0xf0001f04, 0xa20a: 0xf0001f04, 0xa20b: 0xf0001f04, - 0xa20c: 0xf0001f04, 0xa20d: 0xf0001f04, 0xa20e: 0xf0001f04, 0xa20f: 0xf0001f04, - 0xa210: 0xf0001f04, 0xa211: 0xf0000404, 0xa212: 0xf0000404, 0xa213: 0xf0000404, - 0xa214: 0xf0000404, 0xa215: 0xf0000404, 0xa216: 0xf0000404, 0xa217: 0xf0000404, - 0xa218: 0xf0000404, 0xa219: 0xf0000404, 0xa21a: 0xf0000404, 0xa21b: 0xf0000404, - 0xa21c: 0xf0000404, 0xa21d: 0xf0000404, 0xa21e: 0xf0000404, 0xa21f: 0xf0000404, - 0xa220: 0xe000249f, 0xa221: 0xf0000404, 0xa222: 0xf0000404, 0xa223: 0xe00024a7, - 0xa224: 0xe00024af, 0xa225: 0xf0000404, 0xa226: 0xe00024b7, 0xa227: 0xe0002c16, - 0xa228: 0xe0002c1e, 0xa229: 0xe0002c26, 0xa22a: 0xe00024bf, 0xa22b: 0xe0002c2e, - 0xa22c: 0xf0000404, 0xa22d: 0xf0000404, 0xa22e: 0xf0000404, 0xa22f: 0xf0000404, - 0xa230: 0xe0002c36, 0xa231: 0xf0000404, 0xa232: 0xe0002c46, 0xa233: 0xf0000404, - 0xa234: 0xf0000404, 0xa235: 0xf0000404, 0xa236: 0x002bde8c, 0xa237: 0x002c0a8c, - 0xa238: 0x002c3a8c, 0xa239: 0x002c628c, 0xa23a: 0x002c988c, 0xa23b: 0x002d088c, - 0xa23c: 0x002d228c, 0xa23d: 0x002d688c, 0xa23e: 0x002d9a8c, 0xa23f: 0x002dcc8c, - // Block 0x289, offset 0xa240 - 0xa240: 0xe000230b, 0xa241: 0xe00022f8, 0xa242: 0xe00022fc, 0xa243: 0xe0002311, - 0xa244: 0xe0002316, 0xa245: 0xe000231d, 0xa246: 0xe0002321, 0xa247: 0xe0002325, - 0xa248: 0xe000232b, 0xa249: 0xf0001c1c, 0xa24a: 0xe0002330, 0xa24b: 0xe000233c, - 0xa24c: 0xe0002340, 0xa24d: 0xe0002337, 0xa24e: 0xe0002346, 0xa24f: 0xe000234b, - 0xa250: 0xe000234f, 0xa251: 0xe0002353, 0xa252: 0xf0001c1c, 0xa253: 0xe000235e, - 0xa254: 0xe0002358, 0xa255: 0xf0001c1c, 0xa256: 0xe0002363, 0xa257: 0xe000236d, - 0xa258: 0xf0001f04, 0xa259: 0xf0001f04, 0xa25a: 0xf0001f04, 0xa25b: 0xf0001f04, - 0xa25c: 0xf0001f04, 0xa25d: 0xf0001f04, 0xa25e: 0xf0001f04, 0xa25f: 0xf0001f04, - 0xa260: 0xf0001f04, 0xa261: 0xf0001f04, 0xa262: 0xf0000404, 0xa263: 0xf0000404, - 0xa264: 0xf0000404, 0xa265: 0xf0000404, 0xa266: 0xf0000404, 0xa267: 0xf0000404, - 0xa268: 0xf0000404, 0xa269: 0xf0000404, 0xa26a: 0xf0000404, 0xa26b: 0xf0000404, - 0xa26c: 0xf0000404, 0xa26d: 0xf0000404, 0xa26e: 0xf0000404, 0xa26f: 0xf0000404, - 0xa270: 0xf0000404, 0xa271: 0xe0000c1e, 0xa272: 0xf0001c1c, 0xa273: 0xe0002f0d, - 0xa274: 0xe0000a31, 0xa275: 0xe0002824, 0xa276: 0xe00035d6, 0xa277: 0xe00032a7, - 0xa278: 0xe0000ac2, 0xa279: 0xe0000ac6, 0xa27a: 0xe00027e8, 0xa27b: 0xf0001c1c, - 0xa27c: 0xf0001c1c, 0xa27d: 0xf0001c1c, 0xa27e: 0xf0001c1c, 0xa27f: 0xe0002431, - // Block 0x28a, offset 0xa280 - 0xa280: 0xe00035d0, 0xa281: 0xe00035b8, 0xa282: 0xf0001d1c, 0xa283: 0xe000358e, - 0xa284: 0xe00027f7, 0xa285: 0xe00027fa, 0xa286: 0xe0003594, 0xa287: 0xf0001d1d, - 0xa288: 0xe0000a6b, 0xa289: 0xe0000cb4, 0xa28a: 0xe00035d9, 0xa28b: 0xe00035bb, - 0xa28c: 0xf0001d1c, 0xa28d: 0xf0001c1c, 0xa28e: 0xe000359d, 0xa28f: 0xe00027fd, - 0xa290: 0xe00027ce, 0xa291: 0xe0000cb9, 0xa292: 0xe0000d36, 0xa293: 0xe0000be3, - 0xa294: 0xe0000fc5, 0xa295: 0xe00035f7, 0xa296: 0xe00035a0, 0xa297: 0xe00032a4, - 0xa298: 0xe0002803, 0xa299: 0xe0003570, 0xa29a: 0xe00035c7, 0xa29b: 0xe00035fa, - 0xa29c: 0xe00035a3, 0xa29d: 0xe0003099, 0xa29e: 0xe0002806, 0xa29f: 0xe0000d3e, - 0xa2a0: 0xe0000a72, 0xa2a1: 0xe0003588, 0xa2a2: 0xe0000cbd, 0xa2a3: 0xe0000d42, - 0xa2a4: 0xe0000a76, 0xa2a5: 0xe000358b, 0xa2a6: 0xe0000cc1, 0xa2a7: 0xe0000d2d, - 0xa2a8: 0xe0000d31, 0xa2a9: 0xe00035d3, 0xa2aa: 0xe0000cc5, 0xa2ab: 0xe0000d4a, - 0xa2ac: 0xe0000be7, 0xa2ad: 0xe0000f0b, 0xa2ae: 0xe0000f0f, 0xa2af: 0xe0000f15, - 0xa2b0: 0xe000282d, 0xa2b1: 0xe0002821, 0xa2b2: 0xf0001c1c, 0xa2b3: 0xe000281b, - 0xa2b4: 0xe00035dc, 0xa2b5: 0xe00035ca, 0xa2b6: 0xf0001d1c, 0xa2b7: 0xe00035a6, - 0xa2b8: 0xe000280f, 0xa2b9: 0xe00035a9, 0xa2ba: 0xe00035df, 0xa2bb: 0xe00035cd, - 0xa2bc: 0xe0003600, 0xa2bd: 0xe00035af, 0xa2be: 0xe0002812, 0xa2bf: 0xe00035b2, - // Block 0x28b, offset 0xa2c0 - 0xa2c0: 0xe0002815, 0xa2c1: 0xe00035b5, 0xa2c2: 0xe00009b7, 0xa2c3: 0xf0001c1d, - 0xa2c4: 0xf0001c1c, 0xa2c5: 0xf0001c1c, 0xa2c6: 0xe0000a66, 0xa2c7: 0xe0000a7a, - 0xa2c8: 0xf0001d1c, 0xa2c9: 0xf0001c1d, 0xa2ca: 0xe00027c2, 0xa2cb: 0xe00027c8, - 0xa2cc: 0xe00027e5, 0xa2cd: 0xe0002800, 0xa2ce: 0xe0002809, 0xa2cf: 0xe000280c, - 0xa2d0: 0xe0003582, 0xa2d1: 0xe0003585, 0xa2d2: 0xe0000d0d, 0xa2d3: 0xe0002818, - 0xa2d4: 0xe0003591, 0xa2d5: 0xe0000d3a, 0xa2d6: 0xe0000d46, 0xa2d7: 0xe0002827, - 0xa2d8: 0xe0000eb0, 0xa2d9: 0xe0000eb8, 0xa2da: 0xe000282a, 0xa2db: 0xf0001c1c, - 0xa2dc: 0xf0001c1d, 0xa2dd: 0xe00035e2, 0xa2de: 0xe00010b2, 0xa2df: 0xe00009c8, - 0xa2e0: 0xf0001f04, 0xa2e1: 0xf0001f04, 0xa2e2: 0xf0001f04, 0xa2e3: 0xf0001f04, - 0xa2e4: 0xf0001f04, 0xa2e5: 0xf0001f04, 0xa2e6: 0xf0001f04, 0xa2e7: 0xf0001f04, - 0xa2e8: 0xf0001f04, 0xa2e9: 0xf0000404, 0xa2ea: 0xf0000404, 0xa2eb: 0xf0000404, - 0xa2ec: 0xf0000404, 0xa2ed: 0xf0000404, 0xa2ee: 0xf0000404, 0xa2ef: 0xf0000404, - 0xa2f0: 0xf0000404, 0xa2f1: 0xf0000404, 0xa2f2: 0xf0000404, 0xa2f3: 0xf0000404, - 0xa2f4: 0xf0000404, 0xa2f5: 0xf0000404, 0xa2f6: 0xf0000404, 0xa2f7: 0xf0000404, - 0xa2f8: 0xf0000404, 0xa2f9: 0xf0000404, 0xa2fa: 0xf0000404, 0xa2fb: 0xf0000404, - 0xa2fc: 0xf0000404, 0xa2fd: 0xf0000404, 0xa2fe: 0xf0000404, 0xa2ff: 0xe0000bdf, - // Block 0x28c, offset 0xa300 - 0xa300: 0xf0000404, 0xa301: 0xe00026cf, 0xa302: 0xe000356d, 0xa303: 0xe0000b99, - 0xa304: 0xe0000b9d, 0xa305: 0xe0000f83, 0xa306: 0xf0000404, - 0xa313: 0xf0000404, - 0xa314: 0xf0000404, 0xa315: 0xf0000404, 0xa316: 0xf0000404, 0xa317: 0xf0000404, - 0xa31d: 0xe000150b, 0xa31e: 0xa1a09602, 0xa31f: 0xe0001514, - 0xa320: 0x0038ae85, 0xa321: 0x00389085, 0xa322: 0x00389685, 0xa323: 0x00389885, - 0xa324: 0x0038a485, 0xa325: 0x0038a685, 0xa326: 0x0038a885, 0xa327: 0x0038b685, - 0xa328: 0x0038ba85, 0xa329: 0x00093885, 0xa32a: 0xe0001542, 0xa32b: 0xe000153f, - 0xa32c: 0xe000154c, 0xa32d: 0xe0001548, 0xa32e: 0xe00014e1, 0xa32f: 0xe00014e4, - 0xa330: 0xe00014e7, 0xa331: 0xe00014ea, 0xa332: 0xe00014f0, 0xa333: 0xe00014f3, - 0xa334: 0xe00014f6, 0xa335: 0xe00014fc, 0xa336: 0xe0001505, - 0xa338: 0xe0001508, 0xa339: 0xe000150e, 0xa33a: 0xe000151b, 0xa33b: 0xe0001518, - 0xa33c: 0xe0001521, 0xa33e: 0xe0001524, - // Block 0x28d, offset 0xa340 - 0xa340: 0xf0001f04, 0xa341: 0xf0001f04, 0xa342: 0xf0001f04, 0xa343: 0xf0001f04, - 0xa344: 0xf0001f04, 0xa345: 0xf0001f04, 0xa346: 0xf0001f04, 0xa347: 0xf0001f04, - 0xa348: 0xf0001f04, 0xa349: 0xf0001f04, 0xa34a: 0xf0001f04, - 0xa350: 0xf0000a04, 0xa351: 0xf0000a04, 0xa352: 0xf0000a04, 0xa353: 0xf0000a04, - 0xa354: 0xe00024a3, 0xa355: 0xf0000a04, 0xa356: 0xf0000a04, 0xa357: 0xe00024ab, - 0xa358: 0xe00024b3, 0xa359: 0xf0000a04, 0xa35a: 0xe00024bb, 0xa35b: 0xe0002c1a, - 0xa35c: 0xe0002c22, 0xa35d: 0xe0002c2a, 0xa35e: 0xe00024c3, 0xa35f: 0xe0002c32, - 0xa360: 0xf0000a04, 0xa361: 0xf0000a04, 0xa362: 0xf0000a04, 0xa363: 0xf0000a04, - 0xa364: 0xe0002c3a, 0xa365: 0xf0000a04, 0xa366: 0xe0002c4a, 0xa367: 0xf0000a04, - 0xa368: 0xf0000a04, 0xa369: 0xf0000a04, 0xa36a: 0xf0000a04, 0xa36b: 0x002c3a8c, - 0xa36c: 0x002f7a8c, 0xa36d: 0xf0000c0c, 0xa36e: 0xe00035e8, - 0xa370: 0x002bde9d, 0xa371: 0x002c0a9d, 0xa372: 0x002c3a9d, 0xa373: 0x002c629d, - 0xa374: 0x002c989d, 0xa375: 0x002d089d, 0xa376: 0x002d229d, 0xa377: 0x002d689d, - 0xa378: 0x002d9a9d, 0xa379: 0x002dcc9d, 0xa37a: 0x002dfe9d, 0xa37b: 0x002e229d, - 0xa37c: 0x002e829d, 0xa37d: 0x002e9e9d, 0xa37e: 0x002ee29d, 0xa37f: 0x002f2c9d, - // Block 0x28e, offset 0xa380 - 0xa380: 0x002f569d, 0xa381: 0x002f7a9d, 0xa382: 0x002fe69d, 0xa383: 0x00302c9d, - 0xa384: 0x00306c9d, 0xa385: 0x0030be9d, 0xa386: 0x0030e29d, 0xa387: 0x0030f69d, - 0xa388: 0x0031009d, 0xa389: 0x00312a9d, 0xa38a: 0xe00027cb, 0xa38b: 0xe00035ac, - 0xa38c: 0xf0001d1d, 0xa38d: 0xf0001d1d, 0xa38e: 0xe0000ebc, 0xa38f: 0xe00035e5, - 0xa390: 0x002bde8c, 0xa391: 0x002c0a8c, 0xa392: 0x002c3a8c, 0xa393: 0x002c628c, - 0xa394: 0x002c988c, 0xa395: 0x002d088c, 0xa396: 0x002d228c, 0xa397: 0x002d688c, - 0xa398: 0x002d9a8c, 0xa399: 0x002dcc8c, 0xa39a: 0x002dfe8c, 0xa39b: 0x002e228c, - 0xa39c: 0x002e828c, 0xa39d: 0x002e9e8c, 0xa39e: 0x002ee28c, 0xa39f: 0x002f2c8c, - 0xa3a0: 0x002f568c, 0xa3a1: 0x002f7a8c, 0xa3a2: 0x002fe68c, 0xa3a3: 0x00302c8c, - 0xa3a4: 0x00306c8c, 0xa3a5: 0x0030be8c, 0xa3a6: 0x0030e28c, 0xa3a7: 0x0030f68c, - 0xa3a8: 0x0031008c, 0xa3a9: 0x00312a8c, 0xa3aa: 0xe0003597, 0xa3ab: 0xe000359a, - 0xa3b0: 0x002bde9d, 0xa3b1: 0x002c0a9d, 0xa3b2: 0x002c3a9d, 0xa3b3: 0x002c629d, - 0xa3b4: 0x002c989d, 0xa3b5: 0x002d089d, 0xa3b6: 0x002d229d, 0xa3b7: 0x002d689d, - 0xa3b8: 0x002d9a9d, 0xa3b9: 0x002dcc9d, 0xa3ba: 0x002dfe9d, 0xa3bb: 0x002e229d, - 0xa3bc: 0x002e829d, 0xa3bd: 0x002e9e9d, 0xa3be: 0x002ee29d, 0xa3bf: 0x002f2c9d, - // Block 0x28f, offset 0xa3c0 - 0xa3c0: 0x40055620, 0xa3c1: 0xa1809102, 0xa3c2: 0xa1909002, 0xa3c3: 0x40055820, - 0xa3c4: 0xae600000, 0xa3c5: 0xadc00000, 0xa3c6: 0x40055a20, 0xa3c7: 0xa1208d02, - 0xa3d0: 0x40389020, 0xa3d1: 0x40389220, 0xa3d2: 0x40389420, 0xa3d3: 0x40389620, - 0xa3d4: 0x40389820, 0xa3d5: 0x40389a20, 0xa3d6: 0x40389c20, 0xa3d7: 0x40389e20, - 0xa3d8: 0x4038a020, 0xa3d9: 0x4038a220, 0xa3da: 0x0038a499, 0xa3db: 0x4038a420, - 0xa3dc: 0x4038a620, 0xa3dd: 0x0038a899, 0xa3de: 0x4038a820, 0xa3df: 0x0038aa99, - 0xa3e0: 0x4038aa20, 0xa3e1: 0x4038ac20, 0xa3e2: 0x4038ae20, 0xa3e3: 0x0038b099, - 0xa3e4: 0x4038b020, 0xa3e5: 0x0038b299, 0xa3e6: 0x4038b220, 0xa3e7: 0x4038b420, - 0xa3e8: 0x4038b620, 0xa3e9: 0x4038b820, 0xa3ea: 0x4038ba20, - 0xa3f0: 0xe00014ff, 0xa3f1: 0xe0001502, 0xa3f2: 0xe0001511, 0xa3f3: 0x4003d21f, - 0xa3f4: 0x4003e01f, - // Block 0x290, offset 0xa400 - 0xa400: 0xa000f202, 0xa401: 0x403fba21, 0xa402: 0x403fba20, 0xa403: 0x403fbc20, - 0xa404: 0x403fbc20, 0xa405: 0x403fbe20, 0xa406: 0x403fc020, 0xa407: 0x403fcc20, - 0xa408: 0x403fce20, 0xa409: 0x403fd020, 0xa40a: 0x403fd220, 0xa40b: 0x403fd420, - 0xa40c: 0x403fd820, 0xa40d: 0x403fdc20, 0xa40e: 0x403fde20, 0xa40f: 0x403fe020, - 0xa410: 0x403fe220, 0xa411: 0x403fe420, 0xa412: 0x403fe620, 0xa413: 0x403fe820, - 0xa414: 0x403fea20, 0xa415: 0x403fec20, 0xa416: 0x403fee20, 0xa417: 0x403ff020, - 0xa418: 0x403ff420, 0xa419: 0x403ff620, 0xa41a: 0x403ff820, 0xa41b: 0x403ffa20, - 0xa41c: 0x403ffc20, 0xa41d: 0x40400220, 0xa41e: 0x40400420, 0xa41f: 0x40400620, - 0xa420: 0x40400820, 0xa421: 0x40400a20, 0xa422: 0x40400e20, 0xa423: 0x40401020, - 0xa424: 0x40401220, 0xa425: 0x40401420, 0xa426: 0x40401620, 0xa427: 0x40401820, - 0xa428: 0x40401a20, 0xa429: 0xe0001830, 0xa42a: 0x40401c20, 0xa42b: 0x40401e20, - 0xa42c: 0x40402020, 0xa42d: 0x40402420, 0xa42e: 0x40402620, 0xa42f: 0x40402820, - 0xa430: 0x40402c20, 0xa431: 0xe0001839, 0xa432: 0x40402e20, 0xa433: 0x40403020, - 0xa434: 0xe000183c, 0xa435: 0x40403220, 0xa436: 0x40403420, 0xa437: 0x40403620, - 0xa438: 0x40403820, 0xa439: 0x40403a20, 0xa43a: 0x40404c20, 0xa43b: 0x40404e20, - 0xa43c: 0xa070f102, 0xa43d: 0x40403c20, 0xa43e: 0x40404a20, 0xa43f: 0x40405620, - // Block 0x291, offset 0xa440 - 0xa440: 0xa0000000, 0xa441: 0xa0000000, 0xa442: 0xa0000000, 0xa443: 0xa0000000, - 0xa444: 0xa0000000, 0xa445: 0xa0000000, 0xa446: 0xa0000000, 0xa447: 0xa0000000, - 0xa448: 0xa0000000, 0xa449: 0x40020020, 0xa44a: 0x40020220, 0xa44b: 0x40020420, - 0xa44c: 0x40020620, 0xa44d: 0x40020820, 0xa44e: 0xa0000000, 0xa44f: 0xa0000000, - 0xa450: 0xa0000000, 0xa451: 0xa0000000, 0xa452: 0xa0000000, 0xa453: 0xa0000000, - 0xa454: 0xa0000000, 0xa455: 0xa0000000, 0xa456: 0xa0000000, 0xa457: 0xa0000000, - 0xa458: 0xa0000000, 0xa459: 0xa0000000, 0xa45a: 0xa0000000, 0xa45b: 0xa0000000, - 0xa45c: 0xa0000000, 0xa45d: 0xa0000000, 0xa45e: 0xa0000000, 0xa45f: 0xa0000000, - 0xa460: 0x40021220, 0xa461: 0x4002ba20, 0xa462: 0x4003e020, 0xa463: 0x4004ea20, - 0xa464: 0x4027de20, 0xa465: 0x4004ec20, 0xa466: 0x4004e620, 0xa467: 0x4003d220, - 0xa468: 0x4003f420, 0xa469: 0x4003f620, 0xa46a: 0x4004d820, 0xa46b: 0x40093820, - 0xa46c: 0x40024020, 0xa46d: 0x40021a20, 0xa46e: 0x4002e420, 0xa46f: 0x4004e220, - 0xa470: 0x4029cc20, 0xa471: 0x4029ce20, 0xa472: 0x4029d020, 0xa473: 0x4029d220, - 0xa474: 0x4029d420, 0xa475: 0x4029d620, 0xa476: 0x4029d820, 0xa477: 0x4029da20, - 0xa478: 0x4029dc20, 0xa479: 0x4029de20, 0xa47a: 0x40026c20, 0xa47b: 0x40026220, - 0xa47c: 0x40094020, 0xa47d: 0x40094220, 0xa47e: 0x40094420, 0xa47f: 0x4002c420, - // Block 0x292, offset 0xa480 - 0xa480: 0x4004d620, 0xa481: 0x002bde88, 0xa482: 0x002c0a88, 0xa483: 0xc59b2891, - 0xa484: 0xc5a12913, 0xa485: 0x002c9888, 0xa486: 0x002d0888, 0xa487: 0x002d2288, - 0xa488: 0x002d6888, 0xa489: 0x002d9a88, 0xa48a: 0x002dcc88, 0xa48b: 0x002dfe88, - 0xa48c: 0xc5a629e4, 0xa48d: 0x002e8288, 0xa48e: 0xc5ab2a52, 0xa48f: 0x002ee288, - 0xa490: 0x002f2c88, 0xa491: 0x002f5688, 0xa492: 0x002f7a88, 0xa493: 0xc3430991, - 0xa494: 0x00302c88, 0xa495: 0x00306c88, 0xa496: 0x0030be88, 0xa497: 0x0030e288, - 0xa498: 0x0030f688, 0xa499: 0x00310088, 0xa49a: 0xc3630991, 0xa49b: 0x4003f820, - 0xa49c: 0x4004e420, 0xa49d: 0x4003fa20, 0xa49e: 0x40062420, 0xa49f: 0x40021620, - 0xa4a0: 0x40061e20, 0xa4a1: 0x402bde20, 0xa4a2: 0x402c0a20, 0xa4a3: 0xc5982891, - 0xa4a4: 0xc59e28c2, 0xa4a5: 0x402c9820, 0xa4a6: 0x402d0820, 0xa4a7: 0x402d2220, - 0xa4a8: 0x402d6820, 0xa4a9: 0x402d9a20, 0xa4aa: 0x402dcc20, 0xa4ab: 0x402dfe20, - 0xa4ac: 0xc3772993, 0xa4ad: 0x402e8220, 0xa4ae: 0xc5332a41, 0xa4af: 0x402ee220, - 0xa4b0: 0x402f2c20, 0xa4b1: 0x402f5620, 0xa4b2: 0x402f7a20, 0xa4b3: 0xc3410991, - 0xa4b4: 0x40302c20, 0xa4b5: 0x40306c20, 0xa4b6: 0x4030be20, 0xa4b7: 0x4030e220, - 0xa4b8: 0x4030f620, 0xa4b9: 0x40310020, 0xa4ba: 0xc3610991, 0xa4bb: 0x4003fc20, - 0xa4bc: 0x40094820, 0xa4bd: 0x4003fe20, 0xa4be: 0x40094c20, 0xa4bf: 0xa0000000, - // Block 0x293, offset 0xa4c0 - 0xa4c0: 0xe0000983, 0xa4c1: 0xe0000980, 0xa4c2: 0xe00008fb, 0xa4c3: 0xe00008f8, - 0xa4c4: 0xe000097d, 0xa4c5: 0xe000097a, 0xa4c6: 0x002c3e83, 0xa4c7: 0x402c3e20, - 0xa4c8: 0xe0000a3e, 0xa4c9: 0xe0000a3b, 0xa4ca: 0xe0000a4a, 0xa4cb: 0xe0000a47, - 0xa4cc: 0x002c3c83, 0xa4cd: 0x402c3c20, 0xa4ce: 0xe0000a86, 0xa4cf: 0xe0000a83, - 0xa4d0: 0x002c6683, 0xa4d1: 0x402c6620, 0xa4d2: 0xe0000b46, 0xa4d3: 0xe0000b43, - 0xa4d4: 0xe0000aee, 0xa4d5: 0xe0000aeb, 0xa4d6: 0xe0000b2c, 0xa4d7: 0xe0000b29, - 0xa4d8: 0xe0000b40, 0xa4d9: 0xe0000b3d, 0xa4da: 0xe0000b1a, 0xa4db: 0xe0000b17, - 0xa4dc: 0xe0000bb8, 0xa4dd: 0xe0000bb5, 0xa4de: 0xe0000bb2, 0xa4df: 0xe0000baf, - 0xa4e0: 0xe0000bc4, 0xa4e1: 0xe0000bc1, 0xa4e2: 0xe0000bca, 0xa4e3: 0xe0000bc7, - 0xa4e4: 0xe0000bee, 0xa4e5: 0xe0000beb, 0xa4e6: 0xe0000c1b, 0xa4e7: 0xe0000c18, - 0xa4e8: 0xe0000c51, 0xa4e9: 0xe0000c4e, 0xa4ea: 0xe0000c60, 0xa4eb: 0xe0000c5d, - 0xa4ec: 0xe0000c31, 0xa4ed: 0xe0000c2e, 0xa4ee: 0xe0000c5a, 0xa4ef: 0xe0000c57, - 0xa4f0: 0xe0000c54, 0xa4f1: 0x402da220, 0xa4f2: 0xf0000a0a, 0xa4f3: 0xf0000404, - 0xa4f4: 0xe0000c8a, 0xa4f5: 0xe0000c87, 0xa4f6: 0xe0000c9f, 0xa4f7: 0xe0000c9c, - 0xa4f8: 0x402f7220, 0xa4f9: 0xe0000ccc, 0xa4fa: 0xe0000cc9, 0xa4fb: 0xe0000cd8, - 0xa4fc: 0xe0000cd5, 0xa4fd: 0xe0000cd2, 0xa4fe: 0xe0000ccf, 0xa4ff: 0xe0000d04, - // Block 0x294, offset 0xa500 - 0xa500: 0xe0000cfe, 0xa501: 0xe0000cf8, 0xa502: 0xe0000cf5, 0xa503: 0xe0000d51, - 0xa504: 0xe0000d4e, 0xa505: 0xe0000d6f, 0xa506: 0xe0000d6c, 0xa507: 0xe0000d5d, - 0xa508: 0xe0000d5a, 0xa509: 0xf0000404, 0xa50a: 0x002eda88, 0xa50b: 0x402eda20, - 0xa50c: 0xe0000e2e, 0xa50d: 0xe0000e2b, 0xa50e: 0xe0000da0, 0xa50f: 0xe0000d9d, - 0xa510: 0xe0000de0, 0xa511: 0xe0000ddd, 0xa512: 0xe0000e93, 0xa513: 0xe0000e8f, - 0xa514: 0xe0000eca, 0xa515: 0xe0000ec7, 0xa516: 0xe0000edc, 0xa517: 0xe0000ed9, - 0xa518: 0xe0000ed0, 0xa519: 0xe0000ecd, 0xa51a: 0xe0000f1f, 0xa51b: 0xe0000f1c, - 0xa51c: 0xe0000f2d, 0xa51d: 0xe0000f2a, 0xa51e: 0xe0000f47, 0xa51f: 0xe0000f44, - 0xa520: 0x002fe883, 0xa521: 0x402fe820, 0xa522: 0xe0000f99, 0xa523: 0xe0000f96, - 0xa524: 0xe0000f8a, 0xa525: 0xe0000f87, 0xa526: 0x00303688, 0xa527: 0x40303620, - 0xa528: 0xe000102b, 0xa529: 0xe0001028, 0xa52a: 0xe000103f, 0xa52b: 0xe000103c, - 0xa52c: 0xe0000fe7, 0xa52d: 0xe0000fe4, 0xa52e: 0xe0000ff9, 0xa52f: 0xe0000ff6, - 0xa530: 0xe0001025, 0xa531: 0xe0001022, 0xa532: 0xe0001039, 0xa533: 0xe0001036, - 0xa534: 0xe00010d8, 0xa535: 0xe00010d5, 0xa536: 0xe000110e, 0xa537: 0xe000110b, - 0xa538: 0xe0001117, 0xa539: 0xe000113b, 0xa53a: 0xe0001138, 0xa53b: 0xe000114d, - 0xa53c: 0xe000114a, 0xa53d: 0x00312c83, 0xa53e: 0x40312c20, 0xa53f: 0xe0000f64, - // Block 0x295, offset 0xa540 - 0xa540: 0x40321220, 0xa541: 0x40321a20, 0xa542: 0x40322220, 0xa543: 0x40322a20, - 0xa544: 0x002c6487, 0xa545: 0x002c6485, 0xa546: 0x002c6483, 0xa547: 0x002e2487, - 0xa548: 0x002e2485, 0xa549: 0x002e2483, 0xa54a: 0x002ea087, 0xa54b: 0x002ea085, - 0xa54c: 0x002ea083, 0xa54d: 0xe0000947, 0xa54e: 0xe0000944, 0xa54f: 0xe0000c3d, - 0xa550: 0xe0000c3a, 0xa551: 0xe0000dcc, 0xa552: 0xe0000dc9, 0xa553: 0xe0000ff3, - 0xa554: 0xe0000ff0, 0xa555: 0xe000101e, 0xa556: 0xe000101a, 0xa557: 0xe0001006, - 0xa558: 0xe0001002, 0xa559: 0xe0001016, 0xa55a: 0xe0001012, 0xa55b: 0xe000100e, - 0xa55c: 0xe000100a, 0xa55d: 0x402cae20, 0xa55e: 0xe0000962, 0xa55f: 0xe000095e, - 0xa560: 0xe0000976, 0xa561: 0xe0000972, 0xa562: 0xe00009f4, 0xa563: 0xe00009ef, - 0xa564: 0x002d3a88, 0xa565: 0x402d3a20, 0xa566: 0xe0000bbe, 0xa567: 0xe0000bbb, - 0xa568: 0xe0000c99, 0xa569: 0xe0000c96, 0xa56a: 0xe0000e20, 0xa56b: 0xe0000e1d, - 0xa56c: 0xe0000e27, 0xa56d: 0xe0000e23, 0xa56e: 0xe0001162, 0xa56f: 0xe000115f, - 0xa570: 0xe0000c8d, 0xa571: 0xf0000a0a, 0xa572: 0xf000040a, 0xa573: 0xf0000404, - 0xa574: 0xe0000bac, 0xa575: 0xe0000ba9, 0xa576: 0x002d7888, 0xa577: 0x00319488, - 0xa578: 0xe0000d57, 0xa579: 0xe0000d54, 0xa57a: 0xe0000954, 0xa57b: 0xe0000950, - 0xa57c: 0xe00009ea, 0xa57d: 0xe00009e5, 0xa57e: 0xe0000e19, 0xa57f: 0xe0000e15, - // Block 0x296, offset 0xa580 - 0xa580: 0xe00009b1, 0xa581: 0xe00009ae, 0xa582: 0xe0000a22, 0xa583: 0xe0000a1f, - 0xa584: 0xe0000a28, 0xa585: 0xe0000a25, 0xa586: 0xe0000a2e, 0xa587: 0xe0000a2b, - 0xa588: 0xe0003c3f, 0xa589: 0xe0003c3c, 0xa58a: 0xe0000a8c, 0xa58b: 0xe0000a89, - 0xa58c: 0xe0000a98, 0xa58d: 0xe0000a95, 0xa58e: 0xe0000aa4, 0xa58f: 0xe0000aa1, - 0xa590: 0xe0000a92, 0xa591: 0xe0000a8f, 0xa592: 0xe0000a9e, 0xa593: 0xe0000a9b, - 0xa594: 0xe0000b55, 0xa595: 0xe0000b51, 0xa596: 0xe0000b4d, 0xa597: 0xe0000b49, - 0xa598: 0xe0000b7c, 0xa599: 0xe0000b79, 0xa59a: 0xe0000b82, 0xa59b: 0xe0000b7f, - 0xa59c: 0xe0000b39, 0xa59d: 0xe0000b35, 0xa59e: 0xe0000b8c, 0xa59f: 0xe0000b89, - 0xa5a0: 0xe0000bd0, 0xa5a1: 0xe0000bcd, 0xa5a2: 0xe0000c00, 0xa5a3: 0xe0000bfd, - 0xa5a4: 0xe0000c0c, 0xa5a5: 0xe0000c09, 0xa5a6: 0xe0000bfa, 0xa5a7: 0xe0000bf7, - 0xa5a8: 0xe0000c06, 0xa5a9: 0xe0000c03, 0xa5aa: 0xe0000c12, 0xa5ab: 0xe0000c0f, - 0xa5ac: 0xe0000c7e, 0xa5ad: 0xe0000c7b, 0xa5ae: 0xe0000c4a, 0xa5af: 0xe0000c46, - 0xa5b0: 0xe0000c93, 0xa5b1: 0xe0000c90, 0xa5b2: 0xe0000cab, 0xa5b3: 0xe0000ca8, - 0xa5b4: 0xe0000cb1, 0xa5b5: 0xe0000cae, 0xa5b6: 0xe0000cde, 0xa5b7: 0xe0000cdb, - 0xa5b8: 0xe0000ce5, 0xa5b9: 0xe0000ce1, 0xa5ba: 0xe0000cf2, 0xa5bb: 0xe0000cef, - 0xa5bc: 0xe0000cec, 0xa5bd: 0xe0000ce9, 0xa5be: 0xe0000d1e, 0xa5bf: 0xe0000d1b, - // Block 0x297, offset 0xa5c0 - 0xa5c0: 0xa0000000, 0xa5c1: 0xa0000000, 0xa5c2: 0xa0000000, 0xa5c3: 0xa0000000, - 0xa5c4: 0xa0000000, 0xa5c5: 0xa0000000, 0xa5c6: 0xa0000000, 0xa5c7: 0xa0000000, - 0xa5c8: 0xa0000000, 0xa5c9: 0x40020020, 0xa5ca: 0x40020220, 0xa5cb: 0x40020420, - 0xa5cc: 0x40020620, 0xa5cd: 0x40020820, 0xa5ce: 0xa0000000, 0xa5cf: 0xa0000000, - 0xa5d0: 0xa0000000, 0xa5d1: 0xa0000000, 0xa5d2: 0xa0000000, 0xa5d3: 0xa0000000, - 0xa5d4: 0xa0000000, 0xa5d5: 0xa0000000, 0xa5d6: 0xa0000000, 0xa5d7: 0xa0000000, - 0xa5d8: 0xa0000000, 0xa5d9: 0xa0000000, 0xa5da: 0xa0000000, 0xa5db: 0xa0000000, - 0xa5dc: 0xa0000000, 0xa5dd: 0xa0000000, 0xa5de: 0xa0000000, 0xa5df: 0xa0000000, - 0xa5e0: 0x40021220, 0xa5e1: 0x4002ba20, 0xa5e2: 0x4003e020, 0xa5e3: 0x4004ea20, - 0xa5e4: 0x4027de20, 0xa5e5: 0x4004ec20, 0xa5e6: 0x4004e620, 0xa5e7: 0x4003d220, - 0xa5e8: 0x4003f420, 0xa5e9: 0x4003f620, 0xa5ea: 0x4004d820, 0xa5eb: 0x40093820, - 0xa5ec: 0x40024020, 0xa5ed: 0x40021a20, 0xa5ee: 0x4002e420, 0xa5ef: 0x4004e220, - 0xa5f0: 0x4029cc20, 0xa5f1: 0x4029ce20, 0xa5f2: 0x4029d020, 0xa5f3: 0x4029d220, - 0xa5f4: 0x4029d420, 0xa5f5: 0x4029d620, 0xa5f6: 0x4029d820, 0xa5f7: 0x4029da20, - 0xa5f8: 0x4029dc20, 0xa5f9: 0x4029de20, 0xa5fa: 0x40026c20, 0xa5fb: 0x40026220, - 0xa5fc: 0x40094020, 0xa5fd: 0x40094220, 0xa5fe: 0x40094420, 0xa5ff: 0x4002c420, - // Block 0x298, offset 0xa600 - 0xa600: 0x4004d620, 0xa601: 0x002bde88, 0xa602: 0x002c0a88, 0xa603: 0xc5b12aa4, - 0xa604: 0xc5bb2b54, 0xa605: 0x002c9888, 0xa606: 0x002d0888, 0xa607: 0xc5c72c24, - 0xa608: 0x002d6888, 0xa609: 0x002d9a88, 0xa60a: 0x002dcc88, 0xa60b: 0x002dfe88, - 0xa60c: 0xc5d12cf6, 0xa60d: 0x002e8288, 0xa60e: 0xc5db2dc4, 0xa60f: 0xc5e30b21, - 0xa610: 0x002f2c88, 0xa611: 0x002f5688, 0xa612: 0x002f7a88, 0xa613: 0xc5e92e54, - 0xa614: 0xc5f12ee4, 0xa615: 0xc5f90b21, 0xa616: 0x0030be88, 0xa617: 0x0030e288, - 0xa618: 0x0030f688, 0xa619: 0x00310088, 0xa61a: 0xc5ff2f74, 0xa61b: 0x4003f820, - 0xa61c: 0x4004e420, 0xa61d: 0x4003fa20, 0xa61e: 0x40062420, 0xa61f: 0x40021620, - 0xa620: 0x40061e20, 0xa621: 0x402bde20, 0xa622: 0x402c0a20, 0xa623: 0xc5ae2a72, - 0xa624: 0xc5b62b02, 0xa625: 0x402c9820, 0xa626: 0x402d0820, 0xa627: 0xc5c42bf2, - 0xa628: 0x402d6820, 0xa629: 0x402d9a20, 0xa62a: 0x402dcc20, 0xa62b: 0x402dfe20, - 0xa62c: 0xc5cc2c84, 0xa62d: 0x402e8220, 0xa62e: 0xc5d82d92, 0xa62f: 0xc5e00b21, - 0xa630: 0x402f2c20, 0xa631: 0x402f5620, 0xa632: 0x402f7a20, 0xa633: 0xc5e62e22, - 0xa634: 0xc5ee2eb2, 0xa635: 0xc5f60b21, 0xa636: 0x4030be20, 0xa637: 0x4030e220, - 0xa638: 0x4030f620, 0xa639: 0x40310020, 0xa63a: 0xc5fc2f42, 0xa63b: 0x4003fc20, - 0xa63c: 0x40094820, 0xa63d: 0x4003fe20, 0xa63e: 0x40094c20, 0xa63f: 0xa0000000, - // Block 0x299, offset 0xa640 - 0xa640: 0xe00008f5, 0xa641: 0xe00008ef, 0xa642: 0xe0000921, 0xa643: 0xe0000969, - 0xa644: 0xe000095b, 0xa645: 0xe000094d, 0xa646: 0xe00009dd, 0xa647: 0xe0000a53, - 0xa648: 0xe0000ae8, 0xa649: 0xe0000ae2, 0xa64a: 0xe0000af4, 0xa64b: 0xe0000b20, - 0xa64c: 0xe0000c2b, 0xa64d: 0xe0000c25, 0xa64e: 0xe0000c37, 0xa64f: 0xe0000c43, - 0xa650: 0xe0000ab3, 0xa651: 0xe0000d63, 0xa652: 0xe0000d9a, 0xa653: 0xe0000d94, - 0xa654: 0xe0000da6, 0xa655: 0xe0000de6, 0xa656: 0x002ee483, 0xa657: 0x40093e20, - 0xa658: 0xe0000e12, 0xa659: 0xe0000fe1, 0xa65a: 0xe0000fdb, 0xa65b: 0xe0000fed, - 0xa65c: 0x00306e83, 0xa65d: 0xe0001102, 0xa65e: 0x00318888, 0xa65f: 0xe0000f7b, - 0xa660: 0xe00008f2, 0xa661: 0xe00008ec, 0xa662: 0xe000091e, 0xa663: 0xe0000966, - 0xa664: 0xe0000958, 0xa665: 0xe000094a, 0xa666: 0xe00009d5, 0xa667: 0xe0000a4d, - 0xa668: 0xe0000ae5, 0xa669: 0xe0000adf, 0xa66a: 0xe0000af1, 0xa66b: 0xe0000b1d, - 0xa66c: 0xe0000c28, 0xa66d: 0xe0000c22, 0xa66e: 0xe0000c34, 0xa66f: 0xe0000c40, - 0xa670: 0xe0000aad, 0xa671: 0xe0000d60, 0xa672: 0xe0000d97, 0xa673: 0xe0000d91, - 0xa674: 0xe0000da3, 0xa675: 0xe0000de3, 0xa676: 0x402ee420, 0xa677: 0x40093c20, - 0xa678: 0xe0000e0f, 0xa679: 0xe0000fde, 0xa67a: 0xe0000fd8, 0xa67b: 0xe0000fea, - 0xa67c: 0x40306e20, 0xa67d: 0xe00010ff, 0xa67e: 0x40318820, 0xa67f: 0xe0001114, - // Block 0x29a, offset 0xa680 - 0xa680: 0xe0000cfe, 0xa681: 0xe0000cf8, 0xa682: 0xe0000cf5, 0xa683: 0xe0000d51, - 0xa684: 0xe0000d4e, 0xa685: 0xe0000d6f, 0xa686: 0xe0000d6c, 0xa687: 0xe0000d5d, - 0xa688: 0xe0000d5a, 0xa689: 0xf0000404, 0xa68a: 0x002eda88, 0xa68b: 0x402eda20, - 0xa68c: 0xe0000e2e, 0xa68d: 0xe0000e2b, 0xa68e: 0xe0000da0, 0xa68f: 0xe0000d9d, - 0xa690: 0x002ee4a3, 0xa691: 0x402ee421, 0xa692: 0xe0000e93, 0xa693: 0xe0000e8f, - 0xa694: 0xe0000eca, 0xa695: 0xe0000ec7, 0xa696: 0xe0000edc, 0xa697: 0xe0000ed9, - 0xa698: 0xe0000ed0, 0xa699: 0xe0000ecd, 0xa69a: 0xe0000f1f, 0xa69b: 0xe0000f1c, - 0xa69c: 0xe0000f2d, 0xa69d: 0xe0000f2a, 0xa69e: 0xe0000f47, 0xa69f: 0xe0000f44, - 0xa6a0: 0xe0000f33, 0xa6a1: 0xe0000f30, 0xa6a2: 0xe0000f99, 0xa6a3: 0xe0000f96, - 0xa6a4: 0xe0000f8a, 0xa6a5: 0xe0000f87, 0xa6a6: 0x00303688, 0xa6a7: 0x40303620, - 0xa6a8: 0xe000102b, 0xa6a9: 0xe0001028, 0xa6aa: 0xe000103f, 0xa6ab: 0xe000103c, - 0xa6ac: 0xe0000fe7, 0xa6ad: 0xe0000fe4, 0xa6ae: 0xe0000ff9, 0xa6af: 0xe0000ff6, - 0xa6b0: 0x00306ea3, 0xa6b1: 0x40306e21, 0xa6b2: 0xe0001039, 0xa6b3: 0xe0001036, - 0xa6b4: 0xe00010d8, 0xa6b5: 0xe00010d5, 0xa6b6: 0xe000110e, 0xa6b7: 0xe000110b, - 0xa6b8: 0xe0001117, 0xa6b9: 0xe000113b, 0xa6ba: 0xe0001138, 0xa6bb: 0xe000114d, - 0xa6bc: 0xe000114a, 0xa6bd: 0xe0001147, 0xa6be: 0xe0001144, 0xa6bf: 0xe0000f64, - // Block 0x29b, offset 0xa6c0 - 0xa6c0: 0x40321220, 0xa6c1: 0x40321a20, 0xa6c2: 0x40322220, 0xa6c3: 0x40322a20, - 0xa6c4: 0xe0000ad5, 0xa6c5: 0xe0000ad1, 0xa6c6: 0xe0000acd, 0xa6c7: 0xf0000a0a, - 0xa6c8: 0xf000040a, 0xa6c9: 0xf0000404, 0xa6ca: 0xf0000a0a, 0xa6cb: 0xf000040a, - 0xa6cc: 0xf0000404, 0xa6cd: 0xe0000947, 0xa6ce: 0xe0000944, 0xa6cf: 0xe0000c3d, - 0xa6d0: 0xe0000c3a, 0xa6d1: 0xe0000dcc, 0xa6d2: 0xe0000dc9, 0xa6d3: 0xe0000ff3, - 0xa6d4: 0xe0000ff0, 0xa6d5: 0xe0002964, 0xa6d6: 0xe0002961, 0xa6d7: 0xe0002952, - 0xa6d8: 0xe000294f, 0xa6d9: 0xe000295e, 0xa6da: 0xe000295b, 0xa6db: 0xe0002958, - 0xa6dc: 0xe0002955, 0xa6dd: 0x402cae20, 0xa6de: 0xe0000962, 0xa6df: 0xe000095e, - 0xa6e0: 0xe0000976, 0xa6e1: 0xe0000972, 0xa6e2: 0xe00009f4, 0xa6e3: 0xe00009ef, - 0xa6e4: 0x002d3a88, 0xa6e5: 0x402d3a20, 0xa6e6: 0xe0000bbe, 0xa6e7: 0xe0000bbb, - 0xa6e8: 0xe0000c99, 0xa6e9: 0xe0000c96, 0xa6ea: 0xe0000e20, 0xa6eb: 0xe0000e1d, - 0xa6ec: 0xe0000e27, 0xa6ed: 0xe0000e23, 0xa6ee: 0xe0001162, 0xa6ef: 0xe000115f, - 0xa6f0: 0xe0000c8d, 0xa6f1: 0xf0000a0a, 0xa6f2: 0xf000040a, 0xa6f3: 0xf0000404, - 0xa6f4: 0xe0000bac, 0xa6f5: 0xe0000ba9, 0xa6f6: 0x002d7888, 0xa6f7: 0x00319488, - 0xa6f8: 0xe0000d57, 0xa6f9: 0xe0000d54, 0xa6fa: 0xe0000954, 0xa6fb: 0xe0000950, - 0xa6fc: 0xe00009ea, 0xa6fd: 0xe00009e5, 0xa6fe: 0xe0000e19, 0xa6ff: 0xe0000e15, - // Block 0x29c, offset 0xa700 - 0xa700: 0xe000098f, 0xa701: 0xe000098c, 0xa702: 0xe0000995, 0xa703: 0xe0000992, - 0xa704: 0xe0000b62, 0xa705: 0xe0000b5f, 0xa706: 0xe0000b68, 0xa707: 0xe0000b65, - 0xa708: 0xe0000c6c, 0xa709: 0xe0000c69, 0xa70a: 0xe0000c72, 0xa70b: 0xe0000c6f, - 0xa70c: 0xe0000e4a, 0xa70d: 0xe0000e47, 0xa70e: 0xe0000e50, 0xa70f: 0xe0000e4d, - 0xa710: 0xe0000ee8, 0xa711: 0xe0000ee5, 0xa712: 0xe0000eee, 0xa713: 0xe0000eeb, - 0xa714: 0xe0001053, 0xa715: 0xe0001050, 0xa716: 0xe0001059, 0xa717: 0xe0001056, - 0xa718: 0xe0000f61, 0xa719: 0xe0000f5e, 0xa71a: 0xe0000fa5, 0xa71b: 0xe0000fa2, - 0xa71c: 0x00312288, 0xa71d: 0x40312220, 0xa71e: 0xe0000bf4, 0xa71f: 0xe0000bf1, - 0xa720: 0x002ebc88, 0xa721: 0x402c8c20, 0xa722: 0x002f2288, 0xa723: 0x402f2220, - 0xa724: 0x00314088, 0xa725: 0x40314020, 0xa726: 0xe000096f, 0xa727: 0xe000096c, - 0xa728: 0xe0000b32, 0xa729: 0xe0000b2f, 0xa72a: 0xe000294c, 0xa72b: 0xe0002949, - 0xa72c: 0xe0000dfd, 0xa72d: 0xe0000df9, 0xa72e: 0xe0000e04, 0xa72f: 0xe0000e01, - 0xa730: 0xe0000e0b, 0xa731: 0xe0000e07, 0xa732: 0xe0001129, 0xa733: 0xe0001126, - 0xa734: 0x402e5e20, 0xa735: 0x402ed020, 0xa736: 0x40305a20, 0xa737: 0x402dd420, - 0xa738: 0xe0000abf, 0xa739: 0xe0000ec4, 0xa73a: 0x002be888, 0xa73b: 0x002c4488, - 0xa73c: 0x402c4420, 0xa73d: 0x002e3888, 0xa73e: 0x00303e88, 0xa73f: 0x402ffc20, - // Block 0x29d, offset 0xa740 - 0xa740: 0x00339288, 0xa741: 0x40339220, 0xa742: 0x0033a088, 0xa743: 0x4033a020, - 0xa744: 0x0033ee88, 0xa745: 0x4033ee20, 0xa746: 0x00341088, 0xa747: 0x40341020, - 0xa748: 0x0034a488, 0xa749: 0x4034a420, 0xa74a: 0x0034ec88, 0xa74b: 0x4034ec20, - 0xa74c: 0x00354288, 0xa74d: 0x40354220, 0xa74e: 0x00355688, 0xa74f: 0x40355620, - 0xa750: 0x0033f088, 0xa751: 0x4033f020, 0xa752: 0x00349688, 0xa753: 0x40349620, - 0xa754: 0x0034a688, 0xa755: 0x4034a620, 0xa756: 0x00353888, 0xa757: 0x40353820, - 0xa758: 0x0036cc88, 0xa759: 0x4036cc20, 0xa75a: 0x00348288, 0xa75b: 0x40348220, - 0xa75c: 0x00372e88, 0xa75d: 0x40372e20, 0xa75e: 0x00348088, 0xa75f: 0x40348020, - 0xa760: 0x00349888, 0xa761: 0x40349820, 0xa762: 0x0034da88, 0xa763: 0x4034da20, - 0xa764: 0x00351688, 0xa765: 0x40351620, 0xa766: 0x0035dc88, 0xa767: 0x4035dc20, - 0xa771: 0x00384288, 0xa772: 0x00384488, 0xa773: 0x00384688, - 0xa774: 0x00384888, 0xa775: 0xc6042fd1, 0xa776: 0x00384c88, 0xa777: 0x00384e88, - 0xa778: 0x00385088, 0xa779: 0x00385288, 0xa77a: 0x00385488, 0xa77b: 0x00385688, - 0xa77c: 0x00385888, 0xa77d: 0x00385a88, 0xa77e: 0x00385c88, 0xa77f: 0x00385e88, - // Block 0x29e, offset 0xa780 - 0xa780: 0x40388020, 0xa781: 0x40388220, 0xa782: 0x40388420, 0xa783: 0x40388620, - 0xa784: 0x40388820, 0xa785: 0x40388a20, 0xa786: 0x40388c20, 0xa787: 0x40388a20, - 0xa789: 0x40026e20, 0xa78a: 0x40021c20, - 0xa78f: 0x4027e420, - 0xa791: 0xadc00000, 0xa792: 0xae600000, 0xa793: 0xae600000, - 0xa794: 0xae600000, 0xa795: 0xae600000, 0xa796: 0xadc00000, 0xa797: 0xae600000, - 0xa798: 0xae600000, 0xa799: 0xae600000, 0xa79a: 0xade00000, 0xa79b: 0xadc00000, - 0xa79c: 0xae600000, 0xa79d: 0xae600000, 0xa79e: 0xae600000, 0xa79f: 0xae600000, - 0xa7a0: 0xae600000, 0xa7a1: 0xae600000, 0xa7a2: 0xadc00000, 0xa7a3: 0xadc00000, - 0xa7a4: 0xadc00000, 0xa7a5: 0xadc00000, 0xa7a6: 0xadc00000, 0xa7a7: 0xadc00000, - 0xa7a8: 0xae600000, 0xa7a9: 0xae600000, 0xa7aa: 0xadc00000, 0xa7ab: 0xae600000, - 0xa7ac: 0xae600000, 0xa7ad: 0xade00000, 0xa7ae: 0xae400000, 0xa7af: 0xae600000, - 0xa7b0: 0xa0a08502, 0xa7b1: 0xa0b08602, 0xa7b2: 0xa0c08702, 0xa7b3: 0xa0d08802, - 0xa7b4: 0xa0e08902, 0xa7b5: 0xa0f08a02, 0xa7b6: 0xa1008b02, 0xa7b7: 0xa1108c02, - 0xa7b8: 0xa1208d02, 0xa7b9: 0xa1308e02, 0xa7ba: 0xa1308e02, 0xa7bb: 0xa1408f02, - 0xa7bc: 0xa1509202, 0xa7bd: 0xa1600000, 0xa7be: 0x40055420, 0xa7bf: 0xa1709502, - // Block 0x29f, offset 0xa7c0 - 0xa7c0: 0xa0000000, 0xa7c1: 0xa0000000, 0xa7c2: 0xa0000000, 0xa7c3: 0xa0000000, - 0xa7c4: 0xa0000000, 0xa7c5: 0xa0000000, 0xa7c6: 0xa0000000, 0xa7c7: 0xa0000000, - 0xa7c8: 0xa0000000, 0xa7c9: 0x40020020, 0xa7ca: 0x40020220, 0xa7cb: 0x40020420, - 0xa7cc: 0x40020620, 0xa7cd: 0x40020820, 0xa7ce: 0xa0000000, 0xa7cf: 0xa0000000, - 0xa7d0: 0xa0000000, 0xa7d1: 0xa0000000, 0xa7d2: 0xa0000000, 0xa7d3: 0xa0000000, - 0xa7d4: 0xa0000000, 0xa7d5: 0xa0000000, 0xa7d6: 0xa0000000, 0xa7d7: 0xa0000000, - 0xa7d8: 0xa0000000, 0xa7d9: 0xa0000000, 0xa7da: 0xa0000000, 0xa7db: 0xa0000000, - 0xa7dc: 0xa0000000, 0xa7dd: 0xa0000000, 0xa7de: 0xa0000000, 0xa7df: 0xa0000000, - 0xa7e0: 0x40021220, 0xa7e1: 0x4002ba20, 0xa7e2: 0x4003e020, 0xa7e3: 0x4004ea20, - 0xa7e4: 0x4027de20, 0xa7e5: 0x4004ec20, 0xa7e6: 0x4004e620, 0xa7e7: 0x4003d220, - 0xa7e8: 0x4003f420, 0xa7e9: 0x4003f620, 0xa7ea: 0x4004d820, 0xa7eb: 0x40093820, - 0xa7ec: 0x40024020, 0xa7ed: 0x40021a20, 0xa7ee: 0x4002e420, 0xa7ef: 0x4004e220, - 0xa7f0: 0x4029cc20, 0xa7f1: 0x4029ce20, 0xa7f2: 0x4029d020, 0xa7f3: 0x4029d220, - 0xa7f4: 0x4029d420, 0xa7f5: 0x4029d620, 0xa7f6: 0x4029d820, 0xa7f7: 0x4029da20, - 0xa7f8: 0x4029dc20, 0xa7f9: 0x4029de20, 0xa7fa: 0x40026c20, 0xa7fb: 0x40026220, - 0xa7fc: 0x40094020, 0xa7fd: 0x40094220, 0xa7fe: 0x40094420, 0xa7ff: 0x4002c420, - // Block 0x2a0, offset 0xa800 - 0xa800: 0x4004d620, 0xa801: 0x002bde88, 0xa802: 0x002c0a88, 0xa803: 0xc60809c2, - 0xa804: 0x002c6288, 0xa805: 0x002c9888, 0xa806: 0x002d0888, 0xa807: 0xc60f3026, - 0xa808: 0x002d6888, 0xa809: 0xc6183081, 0xa80a: 0x002dcc88, 0xa80b: 0xc61d30c4, - 0xa80c: 0xc0030002, 0xa80d: 0x002e8288, 0xa80e: 0xc6263145, 0xa80f: 0xc33f3081, - 0xa810: 0x002f2c88, 0xa811: 0x002f5688, 0xa812: 0x002f7a88, 0xa813: 0xc58909c2, - 0xa814: 0x00302c88, 0xa815: 0xc3473081, 0xa816: 0x0030be88, 0xa817: 0x0030e288, - 0xa818: 0x0030f688, 0xa819: 0x00310088, 0xa81a: 0x00312a88, 0xa81b: 0x4003f820, - 0xa81c: 0x4004e420, 0xa81d: 0x4003fa20, 0xa81e: 0x40062420, 0xa81f: 0x40021620, - 0xa820: 0x40061e20, 0xa821: 0x402bde20, 0xa822: 0x402c0a20, 0xa823: 0xc60609b1, - 0xa824: 0x402c6220, 0xa825: 0x402c9820, 0xa826: 0x402d0820, 0xa827: 0xc60b2ff3, - 0xa828: 0x402d6820, 0xa829: 0xc6163081, 0xa82a: 0x402dcc20, 0xa82b: 0xc61a30a2, - 0xa82c: 0xc0000002, 0xa82d: 0x402e8220, 0xa82e: 0xc6223103, 0xa82f: 0xc33d3081, - 0xa830: 0x402f2c20, 0xa831: 0x402f5620, 0xa832: 0x402f7a20, 0xa833: 0xc34109b1, - 0xa834: 0x40302c20, 0xa835: 0xc3453081, 0xa836: 0x4030be20, 0xa837: 0x4030e220, - 0xa838: 0x4030f620, 0xa839: 0x40310020, 0xa83a: 0x40312a20, 0xa83b: 0x4003fc20, - 0xa83c: 0x40094820, 0xa83d: 0x4003fe20, 0xa83e: 0x40094c20, 0xa83f: 0xa0000000, - // Block 0x2a1, offset 0xa840 - 0xa840: 0xe0000d24, 0xa841: 0xe0000d21, 0xa842: 0xe0000d2a, 0xa843: 0xe0000d27, - 0xa844: 0x002ea083, 0xa845: 0x402ea020, 0xa846: 0xe0000d7b, 0xa847: 0xe0000d78, - 0xa848: 0xe0000d87, 0xa849: 0xe0000d84, 0xa84a: 0xe0000d81, 0xa84b: 0xe0000d7e, - 0xa84c: 0xe0000ded, 0xa84d: 0xe0000de9, 0xa84e: 0xe0000df5, 0xa84f: 0xe0000df1, - 0xa850: 0xe0000e3d, 0xa851: 0xe0000e39, 0xa852: 0xe0000e35, 0xa853: 0xe0000e31, - 0xa854: 0xe0000ea7, 0xa855: 0xe0000ea4, 0xa856: 0xe0000ead, 0xa857: 0xe0000eaa, - 0xa858: 0xe0000ed6, 0xa859: 0xe0000ed3, 0xa85a: 0xe0000ef4, 0xa85b: 0xe0000ef1, - 0xa85c: 0xe0000efb, 0xa85d: 0xe0000ef7, 0xa85e: 0xe0000f02, 0xa85f: 0xe0000eff, - 0xa860: 0xe0000f41, 0xa861: 0xe0000f3e, 0xa862: 0xe0000f53, 0xa863: 0xe0000f50, - 0xa864: 0xe0000f26, 0xa865: 0xe0000f22, 0xa866: 0xe0000f3a, 0xa867: 0xe0000f36, - 0xa868: 0xe0000f5a, 0xa869: 0xe0000f56, 0xa86a: 0xe0000f93, 0xa86b: 0xe0000f90, - 0xa86c: 0xe0000f9f, 0xa86d: 0xe0000f9c, 0xa86e: 0xe0000fb1, 0xa86f: 0xe0000fae, - 0xa870: 0xe0000fab, 0xa871: 0xe0000fa8, 0xa872: 0xe0001093, 0xa873: 0xe0001090, - 0xa874: 0xe000109f, 0xa875: 0xe000109c, 0xa876: 0xe0001099, 0xa877: 0xe0001096, - 0xa878: 0xe0001032, 0xa879: 0xe000102e, 0xa87a: 0xe0001046, 0xa87b: 0xe0001042, - 0xa87c: 0xe00010a9, 0xa87d: 0xe00010a6, 0xa87e: 0xe00010af, 0xa87f: 0xe00010ac, - // Block 0x2a2, offset 0xa880 - 0xa880: 0xe0000b03, 0xa881: 0xe0000aff, 0xa882: 0xe0000b13, 0xa883: 0xe0000b0f, - 0xa884: 0xe0000b0b, 0xa885: 0xe0000b07, 0xa886: 0xe0000b75, 0xa887: 0xe0000b71, - 0xa888: 0xe0000c66, 0xa889: 0xe0000c63, 0xa88a: 0x002d9c83, 0xa88b: 0x402d9c20, - 0xa88c: 0x002ee483, 0xa88d: 0x402ee420, 0xa88e: 0xe0000e44, 0xa88f: 0xe0000e41, - 0xa890: 0xe0000dad, 0xa891: 0xe0000da9, 0xa892: 0xe0000db5, 0xa893: 0xe0000db1, - 0xa894: 0xe0000dc5, 0xa895: 0xe0000dc1, 0xa896: 0xe0000dbd, 0xa897: 0xe0000db9, - 0xa898: 0xe0003c96, 0xa899: 0xe0003c93, 0xa89a: 0xe0000e5d, 0xa89b: 0xe0000e59, - 0xa89c: 0xe0000e65, 0xa89d: 0xe0000e61, 0xa89e: 0xe0000e75, 0xa89f: 0xe0000e71, - 0xa8a0: 0xe0000e6d, 0xa8a1: 0xe0000e69, 0xa8a2: 0xe0003c9c, 0xa8a3: 0xe0003c99, - 0xa8a4: 0x00306e83, 0xa8a5: 0x40306e20, 0xa8a6: 0xe000104d, 0xa8a7: 0xe000104a, - 0xa8a8: 0xe0001066, 0xa8a9: 0xe0001062, 0xa8aa: 0xe000106e, 0xa8ab: 0xe000106a, - 0xa8ac: 0xe000107e, 0xa8ad: 0xe000107a, 0xa8ae: 0xe0001076, 0xa8af: 0xe0001072, - 0xa8b0: 0xe0003ca2, 0xa8b1: 0xe0003c9f, 0xa8b2: 0xe0001108, 0xa8b3: 0xe0001105, - 0xa8b4: 0xe0001135, 0xa8b5: 0xe0001132, 0xa8b6: 0xe000112f, 0xa8b7: 0xe000112c, - 0xa8b8: 0xe000111d, 0xa8b9: 0xe000111a, 0xa8ba: 0xe0000d0a, 0xa8bb: 0xe0000d07, - 0xa8bc: 0x0030d888, 0xa8bd: 0x4030d820, 0xa8be: 0x00312088, 0xa8bf: 0x40312020, - // Block 0x2a3, offset 0xa8c0 - 0xa8c0: 0xa0000000, 0xa8c1: 0xa0000000, 0xa8c2: 0xa0000000, 0xa8c3: 0xa0000000, - 0xa8c4: 0xa0000000, 0xa8c5: 0xa0000000, 0xa8c6: 0xa0000000, 0xa8c7: 0xa0000000, - 0xa8c8: 0xa0000000, 0xa8c9: 0x40020020, 0xa8ca: 0x40020220, 0xa8cb: 0x40020420, - 0xa8cc: 0x40020620, 0xa8cd: 0x40020820, 0xa8ce: 0xa0000000, 0xa8cf: 0xa0000000, - 0xa8d0: 0xa0000000, 0xa8d1: 0xa0000000, 0xa8d2: 0xa0000000, 0xa8d3: 0xa0000000, - 0xa8d4: 0xa0000000, 0xa8d5: 0xa0000000, 0xa8d6: 0xa0000000, 0xa8d7: 0xa0000000, - 0xa8d8: 0xa0000000, 0xa8d9: 0xa0000000, 0xa8da: 0xa0000000, 0xa8db: 0xa0000000, - 0xa8dc: 0xa0000000, 0xa8dd: 0xa0000000, 0xa8de: 0xa0000000, 0xa8df: 0xa0000000, - 0xa8e0: 0x40021220, 0xa8e1: 0x4002ba20, 0xa8e2: 0x4003e020, 0xa8e3: 0x4004ea20, - 0xa8e4: 0x4027de20, 0xa8e5: 0x4004ec20, 0xa8e6: 0x4004e620, 0xa8e7: 0x4003d220, - 0xa8e8: 0x4003f420, 0xa8e9: 0x4003f620, 0xa8ea: 0x4004d820, 0xa8eb: 0x40093820, - 0xa8ec: 0x40024020, 0xa8ed: 0x40021a20, 0xa8ee: 0x4002e420, 0xa8ef: 0x4004e220, - 0xa8f0: 0x4029cc20, 0xa8f1: 0x4029ce20, 0xa8f2: 0x4029d020, 0xa8f3: 0x4029d220, - 0xa8f4: 0x4029d420, 0xa8f5: 0x4029d620, 0xa8f6: 0x4029d820, 0xa8f7: 0x4029da20, - 0xa8f8: 0x4029dc20, 0xa8f9: 0x4029de20, 0xa8fa: 0x40026c20, 0xa8fb: 0x40026220, - 0xa8fc: 0x40094020, 0xa8fd: 0x40094220, 0xa8fe: 0x40094420, 0xa8ff: 0x4002c420, - // Block 0x2a4, offset 0xa900 - 0xa900: 0x4004d620, 0xa901: 0xc63031a1, 0xa902: 0x002c0a88, 0xa903: 0x002c3a88, - 0xa904: 0x002c6288, 0xa905: 0xc63631e1, 0xa906: 0x002d0888, 0xa907: 0x002d2288, - 0xa908: 0x002d6888, 0xa909: 0xc63a31e1, 0xa90a: 0x002dcc88, 0xa90b: 0x002dfe88, - 0xa90c: 0xc0030002, 0xa90d: 0x002e8288, 0xa90e: 0x002e9e88, 0xa90f: 0xc63f3201, - 0xa910: 0x002f2c88, 0xa911: 0x002f5688, 0xa912: 0x002f7a88, 0xa913: 0x002fe688, - 0xa914: 0x00302c88, 0xa915: 0xc64431e1, 0xa916: 0x0030be88, 0xa917: 0x0030e288, - 0xa918: 0x0030f688, 0xa919: 0xc64831e1, 0xa91a: 0x00312a88, 0xa91b: 0x4003f820, - 0xa91c: 0x4004e420, 0xa91d: 0x4003fa20, 0xa91e: 0x40062420, 0xa91f: 0x40021620, - 0xa920: 0x40061e20, 0xa921: 0xc62c31a1, 0xa922: 0x402c0a20, 0xa923: 0x402c3a20, - 0xa924: 0x402c6220, 0xa925: 0xc63431e1, 0xa926: 0x402d0820, 0xa927: 0x402d2220, - 0xa928: 0x402d6820, 0xa929: 0xc63831e1, 0xa92a: 0x402dcc20, 0xa92b: 0x402dfe20, - 0xa92c: 0xc0000002, 0xa92d: 0x402e8220, 0xa92e: 0x402e9e20, 0xa92f: 0xc63c3201, - 0xa930: 0x402f2c20, 0xa931: 0x402f5620, 0xa932: 0x402f7a20, 0xa933: 0x402fe620, - 0xa934: 0x40302c20, 0xa935: 0xc64231e1, 0xa936: 0x4030be20, 0xa937: 0x4030e220, - 0xa938: 0x4030f620, 0xa939: 0xc64631e1, 0xa93a: 0x40312a20, 0xa93b: 0x4003fc20, - 0xa93c: 0x40094820, 0xa93d: 0x4003fe20, 0xa93e: 0x40094c20, 0xa93f: 0xa0000000, - // Block 0x2a5, offset 0xa940 - 0xa940: 0xe00008f5, 0xa941: 0x002c0883, 0xa942: 0xe0000921, 0xa943: 0xe0000969, - 0xa944: 0x00320ca3, 0xa945: 0x00321083, 0xa946: 0x00320c83, 0xa947: 0xe0000a53, - 0xa948: 0xe0000ae8, 0xa949: 0x002d0683, 0xa94a: 0xe0000af4, 0xa94b: 0xe0000b20, - 0xa94c: 0xe0000c2b, 0xa94d: 0x002dca83, 0xa94e: 0xe0000c37, 0xa94f: 0xe0000c43, - 0xa950: 0x002c6483, 0xa951: 0xe0000d63, 0xa952: 0xe0000d9a, 0xa953: 0x002f2a83, - 0xa954: 0xe0000da6, 0xa955: 0xe0000de6, 0xa956: 0x00320e83, 0xa957: 0x40093e20, - 0xa958: 0x00320ea3, 0xa959: 0xe0000fe1, 0xa95a: 0x0030bc83, 0xa95b: 0xe0000fed, - 0xa95c: 0xe0000fff, 0xa95d: 0x00312883, 0xa95e: 0x00318888, 0xa95f: 0xe0000f7b, - 0xa960: 0xe00008f2, 0xa961: 0x402c0820, 0xa962: 0xe000091e, 0xa963: 0xe0000966, - 0xa964: 0x40320c21, 0xa965: 0x40321020, 0xa966: 0x40320c20, 0xa967: 0xe0000a4d, - 0xa968: 0xe0000ae5, 0xa969: 0x402d0620, 0xa96a: 0xe0000af1, 0xa96b: 0xe0000b1d, - 0xa96c: 0xe0000c28, 0xa96d: 0x402dca20, 0xa96e: 0xe0000c34, 0xa96f: 0xe0000c40, - 0xa970: 0x402c6420, 0xa971: 0xe0000d60, 0xa972: 0xe0000d97, 0xa973: 0x402f2a20, - 0xa974: 0xe0000da3, 0xa975: 0xe0000de3, 0xa976: 0x40320e20, 0xa977: 0x40093c20, - 0xa978: 0x40320e21, 0xa979: 0xe0000fde, 0xa97a: 0x4030bc20, 0xa97b: 0xe0000fea, - 0xa97c: 0xe0000ffc, 0xa97d: 0x40312820, 0xa97e: 0x40318820, 0xa97f: 0xe0001114, - // Block 0x2a6, offset 0xa980 - 0xa980: 0xe0000983, 0xa981: 0xe0000980, 0xa982: 0xe00008fb, 0xa983: 0xe00008f8, - 0xa984: 0xe000097d, 0xa985: 0xe000097a, 0xa986: 0xe0000a38, 0xa987: 0xe0000a35, - 0xa988: 0xe0000a3e, 0xa989: 0xe0000a3b, 0xa98a: 0xe0000a4a, 0xa98b: 0xe0000a47, - 0xa98c: 0xe0000a44, 0xa98d: 0xe0000a41, 0xa98e: 0xe0000a86, 0xa98f: 0xe0000a83, - 0xa990: 0x002c62a3, 0xa991: 0x402c6221, 0xa992: 0xe0000b46, 0xa993: 0xe0000b43, - 0xa994: 0xe0000aee, 0xa995: 0xe0000aeb, 0xa996: 0xe0000b2c, 0xa997: 0xe0000b29, - 0xa998: 0xe0000b40, 0xa999: 0xe0000b3d, 0xa99a: 0xe0000b1a, 0xa99b: 0xe0000b17, - 0xa99c: 0xe0000bb8, 0xa99d: 0xe0000bb5, 0xa99e: 0xe0000bb2, 0xa99f: 0xe0000baf, - 0xa9a0: 0xe0000bc4, 0xa9a1: 0xe0000bc1, 0xa9a2: 0xe0000bca, 0xa9a3: 0xe0000bc7, - 0xa9a4: 0xe0000bee, 0xa9a5: 0xe0000beb, 0xa9a6: 0xe0000c1b, 0xa9a7: 0xe0000c18, - 0xa9a8: 0xe0000c51, 0xa9a9: 0xe0000c4e, 0xa9aa: 0xe0000c60, 0xa9ab: 0xe0000c5d, - 0xa9ac: 0xe0000c31, 0xa9ad: 0xe0000c2e, 0xa9ae: 0xe0000c5a, 0xa9af: 0xe0000c57, - 0xa9b0: 0xe0000c54, 0xa9b1: 0x402da220, 0xa9b2: 0xf0000a0a, 0xa9b3: 0xf0000404, - 0xa9b4: 0xe0000c8a, 0xa9b5: 0xe0000c87, 0xa9b6: 0xe0000c9f, 0xa9b7: 0xe0000c9c, - 0xa9b8: 0x402f7220, 0xa9b9: 0xe0000ccc, 0xa9ba: 0xe0000cc9, 0xa9bb: 0xe0000cd8, - 0xa9bc: 0xe0000cd5, 0xa9bd: 0xe0000cd2, 0xa9be: 0xe0000ccf, 0xa9bf: 0xe0000d04, - // Block 0x2a7, offset 0xa9c0 - 0xa9c0: 0x40321220, 0xa9c1: 0x40321a20, 0xa9c2: 0x40322220, 0xa9c3: 0x40322a20, - 0xa9c4: 0xe0000ad5, 0xa9c5: 0xe0000ad1, 0xa9c6: 0xe0000acd, 0xa9c7: 0xf0000a0a, - 0xa9c8: 0xf000040a, 0xa9c9: 0xf0000404, 0xa9ca: 0xf0000a0a, 0xa9cb: 0xf000040a, - 0xa9cc: 0xf0000404, 0xa9cd: 0xe0000947, 0xa9ce: 0xe0000944, 0xa9cf: 0xe0000c3d, - 0xa9d0: 0xe0000c3a, 0xa9d1: 0xe0000dcc, 0xa9d2: 0xe0000dc9, 0xa9d3: 0xe0000ff3, - 0xa9d4: 0xe0000ff0, 0xa9d5: 0xe000101e, 0xa9d6: 0xe000101a, 0xa9d7: 0xe0003cde, - 0xa9d8: 0xe0003cdb, 0xa9d9: 0xe0001016, 0xa9da: 0xe0001012, 0xa9db: 0xe000100e, - 0xa9dc: 0xe000100a, 0xa9dd: 0x402cae20, 0xa9de: 0xe000299d, 0xa9df: 0xe000299a, - 0xa9e0: 0xe0000976, 0xa9e1: 0xe0000972, 0xa9e2: 0xe0002997, 0xa9e3: 0xe0002994, - 0xa9e4: 0x002d3a88, 0xa9e5: 0x402d3a20, 0xa9e6: 0xe0000bbe, 0xa9e7: 0xe0000bbb, - 0xa9e8: 0xe0000c99, 0xa9e9: 0xe0000c96, 0xa9ea: 0xe0000e20, 0xa9eb: 0xe0000e1d, - 0xa9ec: 0xe0000e27, 0xa9ed: 0xe0000e23, 0xa9ee: 0xe0001162, 0xa9ef: 0xe000115f, - 0xa9f0: 0xe0000c8d, 0xa9f1: 0xf0000a0a, 0xa9f2: 0xf000040a, 0xa9f3: 0xf0000404, - 0xa9f4: 0xe0000bac, 0xa9f5: 0xe0000ba9, 0xa9f6: 0x002d7888, 0xa9f7: 0x00319488, - 0xa9f8: 0xe0000d57, 0xa9f9: 0xe0000d54, 0xa9fa: 0xe00029b5, 0xa9fb: 0xe00029b2, - 0xa9fc: 0xe0002991, 0xa9fd: 0xe000298e, 0xa9fe: 0xe00037ee, 0xa9ff: 0xe00037eb, - // Block 0x2a8, offset 0xaa00 - 0xaa00: 0xe000098f, 0xaa01: 0xe000098c, 0xaa02: 0xe0000995, 0xaa03: 0xe0000992, - 0xaa04: 0xe0000b62, 0xaa05: 0xe0000b5f, 0xaa06: 0xe0000b68, 0xaa07: 0xe0000b65, - 0xaa08: 0xe0000c6c, 0xaa09: 0xe0000c69, 0xaa0a: 0xe0000c72, 0xaa0b: 0xe0000c6f, - 0xaa0c: 0xe0000e4a, 0xaa0d: 0xe0000e47, 0xaa0e: 0xe0000e50, 0xaa0f: 0xe0000e4d, - 0xaa10: 0xe0000ee8, 0xaa11: 0xe0000ee5, 0xaa12: 0xe0000eee, 0xaa13: 0xe0000eeb, - 0xaa14: 0xe0001053, 0xaa15: 0xe0001050, 0xaa16: 0xe0001059, 0xaa17: 0xe0001056, - 0xaa18: 0xe0000f61, 0xaa19: 0xe0000f5e, 0xaa1a: 0xe0000fa5, 0xaa1b: 0xe0000fa2, - 0xaa1c: 0x00312288, 0xaa1d: 0x40312220, 0xaa1e: 0xe0000bf4, 0xaa1f: 0xe0000bf1, - 0xaa20: 0x002ebc88, 0xaa21: 0x402c8c20, 0xaa22: 0x002f2288, 0xaa23: 0x402f2220, - 0xaa24: 0x00314088, 0xaa25: 0x40314020, 0xaa26: 0xe000096f, 0xaa27: 0xe000096c, - 0xaa28: 0xe0000b32, 0xaa29: 0xe0000b2f, 0xaa2a: 0xe00037e8, 0xaa2b: 0xe00037e5, - 0xaa2c: 0xe0000dfd, 0xaa2d: 0xe0000df9, 0xaa2e: 0xe0000e04, 0xaa2f: 0xe0000e01, - 0xaa30: 0xe0000e0b, 0xaa31: 0xe0000e07, 0xaa32: 0xe0001129, 0xaa33: 0xe0001126, - 0xaa34: 0x402e5e20, 0xaa35: 0x402ed020, 0xaa36: 0x40305a20, 0xaa37: 0x402dd420, - 0xaa38: 0xe0000abf, 0xaa39: 0xe0000ec4, 0xaa3a: 0x002be888, 0xaa3b: 0x002c4488, - 0xaa3c: 0x402c4420, 0xaa3d: 0x002e3888, 0xaa3e: 0x00303e88, 0xaa3f: 0x402ffc20, - // Block 0x2a9, offset 0xaa40 - 0xaa40: 0xe00009b1, 0xaa41: 0xe00009ae, 0xaa42: 0xe0000a22, 0xaa43: 0xe0000a1f, - 0xaa44: 0xe0000a28, 0xaa45: 0xe0000a25, 0xaa46: 0xe0000a2e, 0xaa47: 0xe0000a2b, - 0xaa48: 0xe0000a5a, 0xaa49: 0xe0000a56, 0xaa4a: 0xe0000a8c, 0xaa4b: 0xe0000a89, - 0xaa4c: 0xe0000a98, 0xaa4d: 0xe0000a95, 0xaa4e: 0xe0000aa4, 0xaa4f: 0xe0000aa1, - 0xaa50: 0xe0000a92, 0xaa51: 0xe0000a8f, 0xaa52: 0xe0000a9e, 0xaa53: 0xe0000a9b, - 0xaa54: 0xe0000b55, 0xaa55: 0xe0000b51, 0xaa56: 0xe0003cba, 0xaa57: 0xe0003cb7, - 0xaa58: 0xe0000b7c, 0xaa59: 0xe0000b79, 0xaa5a: 0xe0000b82, 0xaa5b: 0xe0000b7f, - 0xaa5c: 0xe0000b39, 0xaa5d: 0xe0000b35, 0xaa5e: 0xe0000b8c, 0xaa5f: 0xe0000b89, - 0xaa60: 0xe0000bd0, 0xaa61: 0xe0000bcd, 0xaa62: 0xe0000c00, 0xaa63: 0xe0000bfd, - 0xaa64: 0xe0000c0c, 0xaa65: 0xe0000c09, 0xaa66: 0xe0000bfa, 0xaa67: 0xe0000bf7, - 0xaa68: 0xe0000c06, 0xaa69: 0xe0000c03, 0xaa6a: 0xe0000c12, 0xaa6b: 0xe0000c0f, - 0xaa6c: 0xe0000c7e, 0xaa6d: 0xe0000c7b, 0xaa6e: 0xe0003cc0, 0xaa6f: 0xe0003cbd, - 0xaa70: 0xe0000c93, 0xaa71: 0xe0000c90, 0xaa72: 0xe0000cab, 0xaa73: 0xe0000ca8, - 0xaa74: 0xe0000cb1, 0xaa75: 0xe0000cae, 0xaa76: 0xe0000cde, 0xaa77: 0xe0000cdb, - 0xaa78: 0xe0000ce5, 0xaa79: 0xe0000ce1, 0xaa7a: 0xe0000cf2, 0xaa7b: 0xe0000cef, - 0xaa7c: 0xe0000cec, 0xaa7d: 0xe0000ce9, 0xaa7e: 0xe0000d1e, 0xaa7f: 0xe0000d1b, - // Block 0x2aa, offset 0xaa80 - 0xaa80: 0xe0000d24, 0xaa81: 0xe0000d21, 0xaa82: 0xe0000d2a, 0xaa83: 0xe0000d27, - 0xaa84: 0xe0000d69, 0xaa85: 0xe0000d66, 0xaa86: 0xe0000d7b, 0xaa87: 0xe0000d78, - 0xaa88: 0xe0000d87, 0xaa89: 0xe0000d84, 0xaa8a: 0xe0000d81, 0xaa8b: 0xe0000d7e, - 0xaa8c: 0xe0003ccc, 0xaa8d: 0xe0003cc9, 0xaa8e: 0xe0003cf0, 0xaa8f: 0xe0003ced, - 0xaa90: 0xe0000e3d, 0xaa91: 0xe0000e39, 0xaa92: 0xe0003cd2, 0xaa93: 0xe0003ccf, - 0xaa94: 0xe0000ea7, 0xaa95: 0xe0000ea4, 0xaa96: 0xe0000ead, 0xaa97: 0xe0000eaa, - 0xaa98: 0xe0000ed6, 0xaa99: 0xe0000ed3, 0xaa9a: 0xe0000ef4, 0xaa9b: 0xe0000ef1, - 0xaa9c: 0xe0000efb, 0xaa9d: 0xe0000ef7, 0xaa9e: 0xe0000f02, 0xaa9f: 0xe0000eff, - 0xaaa0: 0xe0000f41, 0xaaa1: 0xe0000f3e, 0xaaa2: 0xe0000f53, 0xaaa3: 0xe0000f50, - 0xaaa4: 0xe0000f26, 0xaaa5: 0xe0000f22, 0xaaa6: 0xe0000f3a, 0xaaa7: 0xe0000f36, - 0xaaa8: 0xe0000f5a, 0xaaa9: 0xe0000f56, 0xaaaa: 0xe0000f93, 0xaaab: 0xe0000f90, - 0xaaac: 0xe0000f9f, 0xaaad: 0xe0000f9c, 0xaaae: 0xe0000fb1, 0xaaaf: 0xe0000fae, - 0xaab0: 0xe0000fab, 0xaab1: 0xe0000fa8, 0xaab2: 0xe0001093, 0xaab3: 0xe0001090, - 0xaab4: 0xe000109f, 0xaab5: 0xe000109c, 0xaab6: 0xe0001099, 0xaab7: 0xe0001096, - 0xaab8: 0xe0003ce4, 0xaab9: 0xe0003ce1, 0xaaba: 0xe0001046, 0xaabb: 0xe0001042, - 0xaabc: 0xe00010a9, 0xaabd: 0xe00010a6, 0xaabe: 0xe00010af, 0xaabf: 0xe00010ac, - // Block 0x2ab, offset 0xaac0 - 0xaac0: 0xe00010d2, 0xaac1: 0xe00010cf, 0xaac2: 0xe00010cc, 0xaac3: 0xe00010c9, - 0xaac4: 0xe00010e1, 0xaac5: 0xe00010de, 0xaac6: 0xe00010e7, 0xaac7: 0xe00010e4, - 0xaac8: 0xe00010ed, 0xaac9: 0xe00010ea, 0xaaca: 0xe00010fc, 0xaacb: 0xe00010f9, - 0xaacc: 0xe00010f6, 0xaacd: 0xe00010f3, 0xaace: 0xe0001123, 0xaacf: 0xe0001120, - 0xaad0: 0xe0001141, 0xaad1: 0xe000113e, 0xaad2: 0xe0001153, 0xaad3: 0xe0001150, - 0xaad4: 0xe0001159, 0xaad5: 0xe0001156, 0xaad6: 0xe0000c15, 0xaad7: 0xe0000f8d, - 0xaad8: 0xe00010db, 0xaad9: 0xe0001111, 0xaada: 0xf0000404, 0xaadb: 0xe0000f70, - 0xaadc: 0x40300420, 0xaadd: 0x40300620, 0xaade: 0xe0000f7f, 0xaadf: 0x402c9620, - 0xaae0: 0xe000099b, 0xaae1: 0xe0000998, 0xaae2: 0xe0000989, 0xaae3: 0xe0000986, - 0xaae4: 0xe0003cae, 0xaae5: 0xe0003cab, 0xaae6: 0xe0000930, 0xaae7: 0xe000092c, - 0xaae8: 0xe0000940, 0xaae9: 0xe000093c, 0xaaea: 0xe0000938, 0xaaeb: 0xe0000934, - 0xaaec: 0xe00009aa, 0xaaed: 0xe00009a6, 0xaaee: 0xe0003ca8, 0xaaef: 0xe0003ca5, - 0xaaf0: 0xe000090a, 0xaaf1: 0xe0000906, 0xaaf2: 0xe000091a, 0xaaf3: 0xe0000916, - 0xaaf4: 0xe0000912, 0xaaf5: 0xe000090e, 0xaaf6: 0xe00009a2, 0xaaf7: 0xe000099e, - 0xaaf8: 0xe0000b6e, 0xaaf9: 0xe0000b6b, 0xaafa: 0xe0000b5c, 0xaafb: 0xe0000b59, - 0xaafc: 0xe0000b26, 0xaafd: 0xe0000b23, 0xaafe: 0xe0003cb4, 0xaaff: 0xe0003cb1, - // Block 0x2ac, offset 0xab00 - 0xab00: 0xe0000b03, 0xab01: 0xe0000aff, 0xab02: 0xe0000b13, 0xab03: 0xe0000b0f, - 0xab04: 0xe0000b0b, 0xab05: 0xe0000b07, 0xab06: 0xe0000b75, 0xab07: 0xe0000b71, - 0xab08: 0xe0000c66, 0xab09: 0xe0000c63, 0xab0a: 0xe0000c78, 0xab0b: 0xe0000c75, - 0xab0c: 0xe0000e84, 0xab0d: 0xe0000e81, 0xab0e: 0xe0000e44, 0xab0f: 0xe0000e41, - 0xab10: 0xe0003cc6, 0xab11: 0xe0003cc3, 0xab12: 0xe0000db5, 0xab13: 0xe0000db1, - 0xab14: 0xe0000dc5, 0xab15: 0xe0000dc1, 0xab16: 0xe0000dbd, 0xab17: 0xe0000db9, - 0xab18: 0xe0000e8b, 0xab19: 0xe0000e87, 0xab1a: 0xe0003cd8, 0xab1b: 0xe0003cd5, - 0xab1c: 0xe0000e65, 0xab1d: 0xe0000e61, 0xab1e: 0xe0000e75, 0xab1f: 0xe0000e71, - 0xab20: 0xe0000e6d, 0xab21: 0xe0000e69, 0xab22: 0xe0000e7d, 0xab23: 0xe0000e79, - 0xab24: 0xe000108d, 0xab25: 0xe000108a, 0xab26: 0xe000104d, 0xab27: 0xe000104a, - 0xab28: 0xe0003cea, 0xab29: 0xe0003ce7, 0xab2a: 0xe000106e, 0xab2b: 0xe000106a, - 0xab2c: 0xe000107e, 0xab2d: 0xe000107a, 0xab2e: 0xe0001076, 0xab2f: 0xe0001072, - 0xab30: 0xe0001086, 0xab31: 0xe0001082, 0xab32: 0xe0001108, 0xab33: 0xe0001105, - 0xab34: 0xe0001135, 0xab35: 0xe0001132, 0xab36: 0xe000112f, 0xab37: 0xe000112c, - 0xab38: 0xe000111d, 0xab39: 0xe000111a, 0xab3a: 0xe0000d0a, 0xab3b: 0xe0000d07, - 0xab3c: 0x0030d888, 0xab3d: 0x4030d820, 0xab3e: 0x00312088, 0xab3f: 0x40312020, - // Block 0x2ad, offset 0xab40 - 0xab40: 0x40021220, 0xab41: 0x40025c20, 0xab42: 0x40030420, 0xab43: 0x40051220, - 0xab44: 0x40279a20, 0xab45: 0x4027ca20, 0xab46: 0xe0002206, 0xab47: 0xe00001d3, - 0xab48: 0x40049c20, 0xab49: 0x40049e20, 0xab4a: 0x4004a020, 0xab4b: 0x4004a220, - 0xab4c: 0x4004a420, 0xab4d: 0x4004a620, 0xab4e: 0x4004a820, 0xab4f: 0x4004aa20, - 0xab50: 0x4004ac20, 0xab51: 0x4004ae20, 0xab52: 0x40279c20, 0xab53: 0x40279e20, - 0xab54: 0x4004b020, 0xab55: 0x4004b220, 0xab56: 0x4004b420, 0xab57: 0x4004b620, - 0xab58: 0x4004b820, 0xab59: 0x4004ba20, 0xab5a: 0x4004bc20, 0xab5b: 0x4004be20, - 0xab5c: 0x40023820, 0xab5d: 0x4003ea20, 0xab5e: 0x4003ec20, 0xab5f: 0x4003ee20, - 0xab60: 0x4027a020, 0xab61: 0xe0000267, 0xab62: 0xe000037f, 0xab63: 0xe0000459, - 0xab64: 0xe000052e, 0xab65: 0xe00005f8, 0xab66: 0xe00006c3, 0xab67: 0xe000076b, - 0xab68: 0xe0000817, 0xab69: 0xe00008bc, 0xab6a: 0xada12202, 0xab6b: 0xae412302, - 0xab6c: 0xae812402, 0xab6d: 0xade12502, 0xab6e: 0xae012602, 0xab6f: 0xae012702, - 0xab70: 0x40023a20, 0xab71: 0x4027ce20, 0xab72: 0xe0000152, 0xab73: 0x4027d020, - 0xab74: 0xe0000155, 0xab75: 0x4027d220, 0xab76: 0x00279c84, 0xab77: 0x4027a220, - 0xab78: 0x02a68284, 0xab79: 0x02a68884, 0xab7a: 0x02a68a84, 0xab7b: 0x4027cc20, - 0xab7c: 0xe000231a, 0xab7d: 0x40051420, 0xab7e: 0x4027a420, 0xab7f: 0x4027a620, - // Block 0x2ae, offset 0xab80 - 0xab81: 0xc64a3231, 0xab82: 0xc6503231, 0xab83: 0xc71a3231, - 0xab84: 0xc7203231, 0xab85: 0xc7d83a21, 0xab86: 0xc7e233e1, 0xab87: 0xc8c13231, - 0xab88: 0xc8c73231, 0xab89: 0xc9763231, 0xab8a: 0xc97c3231, 0xab8b: 0xc65c32b1, - 0xab8c: 0xc6693231, 0xab8d: 0xc72633e1, 0xab8e: 0xc73b3671, 0xab8f: 0xc80433e1, - 0xab90: 0xc8193671, 0xab91: 0xc8d332b1, 0xab92: 0xc8e03231, 0xab93: 0xc98233e1, - 0xab94: 0xc9973671, 0xab95: 0xc66f33e1, 0xab96: 0xc6843671, 0xab97: 0xc74833e1, - 0xab98: 0xc75d3671, 0xab99: 0xc82633e1, 0xab9a: 0xc83b3671, 0xab9b: 0xc8e633e1, - 0xab9c: 0xc8fb3671, 0xab9d: 0xc99f33e1, 0xab9e: 0xc9b43671, 0xab9f: 0xc68c33e1, - 0xaba0: 0xc6a13671, 0xaba1: 0xc76533e1, 0xaba2: 0xc77a3671, 0xaba3: 0xc8433a21, - 0xaba4: 0xc84d33e1, 0xaba5: 0xc8623671, 0xaba6: 0xc90333e1, 0xaba7: 0xc9183671, - 0xaba8: 0xc9c133e1, 0xaba9: 0xc9d63671, 0xabaa: 0xc6a93231, 0xabab: 0xc7823231, - 0xabac: 0xc86d3231, 0xabad: 0xc9203231, 0xabae: 0xc9de3231, 0xabaf: 0xc6b436f1, - 0xabb0: 0xc6cf3671, 0xabb1: 0xc6d73671, 0xabb2: 0xc78d36f1, 0xabb3: 0xc7a83671, - 0xabb4: 0xc7b03671, 0xabb5: 0xc87836f1, 0xabb6: 0xc8933671, 0xabb7: 0xc89b3671, - 0xabb8: 0xc92b36f1, 0xabb9: 0xc9463671, 0xabba: 0xc94e3671, 0xabbb: 0xc9e936f1, - 0xabbc: 0xca043671, 0xabbd: 0xca0c3671, 0xabbe: 0xc6df3231, 0xabbf: 0xc7b83231, - // Block 0x2af, offset 0xabc0 - 0xabc0: 0xc8a63231, 0xabc1: 0xc9563231, 0xabc2: 0xca143231, 0xabc3: 0xc6e53231, - 0xabc4: 0xc6eb3231, 0xabc5: 0xc8ac3231, 0xabc6: 0xc8b23231, 0xabc7: 0xca1a3231, - 0xabc8: 0xca203231, 0xabc9: 0xc6f43231, 0xabca: 0xc7c13231, 0xabcb: 0xc8bb3231, - 0xabcc: 0xc95f3231, 0xabcd: 0xca293231, 0xabce: 0xc6fa3a21, 0xabcf: 0xc7043a21, - 0xabd0: 0xc7c73a21, 0xabd1: 0xc9653a21, 0xabd2: 0xca2f3a21, 0xabd3: 0xca453ab1, - 0xabd4: 0xc7f73671, 0xabd5: 0xc6563231, 0xabd6: 0xc8cd3231, - 0xabd9: 0xa0812802, 0xabda: 0xa0812902, 0xabdb: 0x40063c20, - 0xabdc: 0x40063e20, 0xabdd: 0x4027d820, 0xabde: 0xe000015b, 0xabdf: 0xe0004033, - 0xabe0: 0x40023c20, 0xabe1: 0xc64d3281, 0xabe2: 0xc6533281, 0xabe3: 0xc71d3281, - 0xabe4: 0xc7233281, 0xabe5: 0xc7dd3601, 0xabe6: 0xc7ea3501, 0xabe7: 0xc8c43281, - 0xabe8: 0xc8ca3281, 0xabe9: 0xc9793281, 0xabea: 0xc97f3281, 0xabeb: 0xc6613361, - 0xabec: 0xc66c3281, 0xabed: 0xc72e3501, 0xabee: 0xc73f36c1, 0xabef: 0xc80c3501, - 0xabf0: 0xc81d36c1, 0xabf1: 0xc8d83361, 0xabf2: 0xc8e33281, 0xabf3: 0xc98a3501, - 0xabf4: 0xc99b36c1, 0xabf5: 0xc6773501, 0xabf6: 0xc68836c1, 0xabf7: 0xc7503501, - 0xabf8: 0xc76136c1, 0xabf9: 0xc82e3501, 0xabfa: 0xc83f36c1, 0xabfb: 0xc8ee3501, - 0xabfc: 0xc8ff36c1, 0xabfd: 0xc9a73501, 0xabfe: 0xc9b836c1, 0xabff: 0xc6943501, - // Block 0x2b0, offset 0xac00 - 0xac00: 0xc6a536c1, 0xac01: 0xc76d3501, 0xac02: 0xc77e36c1, 0xac03: 0xc8483601, - 0xac04: 0xc8553501, 0xac05: 0xc86636c1, 0xac06: 0xc90b3501, 0xac07: 0xc91c36c1, - 0xac08: 0xc9c93501, 0xac09: 0xc9da36c1, 0xac0a: 0xc6ac3281, 0xac0b: 0xc7853281, - 0xac0c: 0xc8703281, 0xac0d: 0xc9233281, 0xac0e: 0xc9e13281, 0xac0f: 0xc6bf38a1, - 0xac10: 0xc6d336c1, 0xac11: 0xc6db36c1, 0xac12: 0xc79838a1, 0xac13: 0xc7ac36c1, - 0xac14: 0xc7b436c1, 0xac15: 0xc88338a1, 0xac16: 0xc89736c1, 0xac17: 0xc89f36c1, - 0xac18: 0xc93638a1, 0xac19: 0xc94a36c1, 0xac1a: 0xc95236c1, 0xac1b: 0xc9f438a1, - 0xac1c: 0xca0836c1, 0xac1d: 0xca1036c1, 0xac1e: 0xc6e23281, 0xac1f: 0xc7bb3281, - 0xac20: 0xc8a93281, 0xac21: 0xc9593281, 0xac22: 0xca173281, 0xac23: 0xc6e83281, - 0xac24: 0xc6ee3281, 0xac25: 0xc8af3281, 0xac26: 0xc8b53281, 0xac27: 0xca1d3281, - 0xac28: 0xca233281, 0xac29: 0xc6f73281, 0xac2a: 0xc7c43281, 0xac2b: 0xc8be3281, - 0xac2c: 0xc9623281, 0xac2d: 0xca2c3281, 0xac2e: 0xc6ff3601, 0xac2f: 0xc7093501, - 0xac30: 0xc7cc3501, 0xac31: 0xc96a3501, 0xac32: 0xca343501, 0xac33: 0xca453ae1, - 0xac34: 0xc7fb36c1, 0xac35: 0xc6593281, 0xac36: 0xc8d03281, 0xac37: 0xc71636c1, - 0xac38: 0xc7d436c1, 0xac39: 0xc97236c1, 0xac3a: 0xca4136c1, 0xac3b: 0x40023e20, - 0xac3c: 0x4027d620, 0xac3d: 0x4027d820, 0xac3e: 0xe000015b, 0xac3f: 0xe0003eda, - // Block 0x2b1, offset 0xac40 - 0xac45: 0x4065da20, 0xac46: 0x4065dc20, 0xac47: 0x4065de20, - 0xac48: 0x4065e020, 0xac49: 0x4065e420, 0xac4a: 0x4065e620, 0xac4b: 0x4065e820, - 0xac4c: 0x4065ea20, 0xac4d: 0x4065ec20, 0xac4e: 0x4065ee20, 0xac4f: 0x4065f420, - 0xac50: 0x4065f620, 0xac51: 0x4065f820, 0xac52: 0x4065fa20, 0xac53: 0x4065fe20, - 0xac54: 0x40660020, 0xac55: 0x40660220, 0xac56: 0x40660420, 0xac57: 0x40660620, - 0xac58: 0x40660820, 0xac59: 0x40660a20, 0xac5a: 0x40661220, 0xac5b: 0x40661420, - 0xac5c: 0x40661820, 0xac5d: 0x40661a20, 0xac5e: 0x40661e20, 0xac5f: 0x40662020, - 0xac60: 0x40662220, 0xac61: 0x40662420, 0xac62: 0x40662620, 0xac63: 0x40662820, - 0xac64: 0x40662a20, 0xac65: 0x40662e20, 0xac66: 0x40663620, 0xac67: 0x40663820, - 0xac68: 0x40663a20, 0xac69: 0x40663c20, 0xac6a: 0x4065e220, 0xac6b: 0x4065f020, - 0xac6c: 0x4065fc20, 0xac6d: 0x40663e20, - 0xac71: 0x4062ac20, 0xac72: 0x4062ae20, 0xac73: 0x40646820, - 0xac74: 0x4062b020, 0xac75: 0x40646c20, 0xac76: 0x40646e20, 0xac77: 0x4062b220, - 0xac78: 0x4062b420, 0xac79: 0x4062b620, 0xac7a: 0x40647420, 0xac7b: 0x40647620, - 0xac7c: 0x40647820, 0xac7d: 0x40647a20, 0xac7e: 0x40647c20, 0xac7f: 0x40647e20, - // Block 0x2b2, offset 0xac80 - 0xac80: 0x4062e020, 0xac81: 0x4062b820, 0xac82: 0x4062ba20, 0xac83: 0x4062bc20, - 0xac84: 0x4062ee20, 0xac85: 0x4062be20, 0xac86: 0x4062c020, 0xac87: 0x4062c220, - 0xac88: 0x4062c420, 0xac89: 0x4062c620, 0xac8a: 0x4062c820, 0xac8b: 0x4062ca20, - 0xac8c: 0x4062cc20, 0xac8d: 0x4062ce20, 0xac8e: 0x4062d020, 0xac8f: 0x4063a820, - 0xac90: 0x4063aa20, 0xac91: 0x4063ac20, 0xac92: 0x4063ae20, 0xac93: 0x4063b020, - 0xac94: 0x4063b220, 0xac95: 0x4063b420, 0xac96: 0x4063b620, 0xac97: 0x4063b820, - 0xac98: 0x4063ba20, 0xac99: 0x4063bc20, 0xac9a: 0x4063be20, 0xac9b: 0x4063c020, - 0xac9c: 0x4063c220, 0xac9d: 0x4063c420, 0xac9e: 0x4063c620, 0xac9f: 0x4063c820, - 0xaca0: 0x4063ca20, 0xaca1: 0x4063cc20, 0xaca2: 0x4063ce20, 0xaca3: 0x4063d020, - 0xaca4: 0x4063a620, 0xaca5: 0x0062d484, 0xaca6: 0x0062d684, 0xaca7: 0x0064a284, - 0xaca8: 0x0064a484, 0xaca9: 0x0064ac84, 0xacaa: 0x0064b084, 0xacab: 0x0064ba84, - 0xacac: 0x0064c284, 0xacad: 0x0064c684, 0xacae: 0x0062e484, 0xacaf: 0x0064ce84, - 0xacb0: 0x0064d284, 0xacb1: 0x0062e684, 0xacb2: 0x0062e884, 0xacb3: 0x0062ec84, - 0xacb4: 0x0062f084, 0xacb5: 0x0062f284, 0xacb6: 0x0062fa84, 0xacb7: 0x0062fe84, - 0xacb8: 0x00630284, 0xacb9: 0x00630484, 0xacba: 0x00630684, 0xacbb: 0x00630884, - 0xacbc: 0x00630a84, 0xacbd: 0x00631084, 0xacbe: 0x00631884, 0xacbf: 0x00632c84, - // Block 0x2b3, offset 0xacc0 - 0xacc0: 0x40275220, 0xacc1: 0x40275420, 0xacc2: 0x40275620, 0xacc3: 0x40275820, - 0xacc4: 0x40275a20, 0xacc5: 0x40275c20, 0xacc6: 0x40275e20, 0xacc7: 0x40276020, - 0xacc8: 0x40276220, 0xacc9: 0x40276420, 0xacca: 0x40276620, 0xaccb: 0x40276820, - 0xaccc: 0x40276a20, 0xaccd: 0x40276c20, 0xacce: 0x40276e20, 0xaccf: 0x40277020, - 0xacd0: 0x40277220, 0xacd1: 0x40277420, 0xacd2: 0x40277620, 0xacd3: 0x40277820, - 0xacd4: 0x40277a20, 0xacd5: 0x40277c20, 0xacd6: 0x40277e20, 0xacd7: 0x40278020, - 0xacd8: 0x40278220, 0xacd9: 0x40278420, 0xacda: 0x40278620, 0xacdb: 0x40278820, - 0xacdc: 0x40278a20, 0xacdd: 0x40278c20, 0xacde: 0x40278e20, 0xacdf: 0x40279020, - 0xace0: 0x40279220, 0xace1: 0x40279420, 0xace2: 0x40279620, 0xace3: 0x40279820, - 0xacf0: 0xc7ff3601, 0xacf1: 0xc7433601, 0xacf2: 0xc8213601, 0xacf3: 0xc9bc3601, - 0xacf4: 0xc86a3281, 0xacf5: 0xc6af3601, 0xacf6: 0xc7883601, 0xacf7: 0xc8733601, - 0xacf8: 0xc9263601, 0xacf9: 0xc9e43601, 0xacfa: 0xc8a33281, 0xacfb: 0xc6f13281, - 0xacfc: 0xc7be3281, 0xacfd: 0xc8b83281, 0xacfe: 0xc95c3281, 0xacff: 0xca263281, - // Block 0x2b4, offset 0xad00 - 0xad00: 0xf0000404, 0xad01: 0xf0000404, 0xad02: 0xf0000404, 0xad03: 0xf0000404, - 0xad04: 0xf0000404, 0xad05: 0xf0000404, 0xad06: 0xf0000404, 0xad07: 0xf0000404, - 0xad08: 0xf0000404, 0xad09: 0xf0000404, 0xad0a: 0xf0000404, 0xad0b: 0xf0000404, - 0xad0c: 0xf0000404, 0xad0d: 0xf0000404, 0xad0e: 0xe000004c, 0xad0f: 0xe0000051, - 0xad10: 0xe0000056, 0xad11: 0xe000005b, 0xad12: 0xe0000060, 0xad13: 0xe0000065, - 0xad14: 0xe000006a, 0xad15: 0xe000006f, 0xad16: 0xe0000083, 0xad17: 0xe000008d, - 0xad18: 0xe0000092, 0xad19: 0xe0000097, 0xad1a: 0xe000009c, 0xad1b: 0xe00000a1, - 0xad1c: 0xe0000088, 0xad1d: 0xe0000074, 0xad1e: 0xe000007c, - 0xad20: 0xe0002c96, 0xad21: 0xe0002ca6, 0xad22: 0xe0002c9e, 0xad23: 0xe0002cd6, - 0xad24: 0xe0002caa, 0xad25: 0xe0002cbe, 0xad26: 0xe0002c9a, 0xad27: 0xe0002cba, - 0xad28: 0xe0002ca2, 0xad29: 0xe0002cc6, 0xad2a: 0xe0002ce6, 0xad2b: 0xe0002cfa, - 0xad2c: 0xe0002cf6, 0xad2d: 0xe0002cee, 0xad2e: 0xe0002d22, 0xad2f: 0xe0002cda, - 0xad30: 0xe0002ce2, 0xad31: 0xe0002cf2, 0xad32: 0xe0002cea, 0xad33: 0xe0002d06, - 0xad34: 0xe0002cce, 0xad35: 0xe0002cfe, 0xad36: 0xe0002d1a, 0xad37: 0xe0002d0a, - 0xad38: 0xe0002cc2, 0xad39: 0xe0002cae, 0xad3a: 0xe0002cd2, 0xad3b: 0xe0002cde, - 0xad3c: 0xe0002d02, 0xad3d: 0xe0002cb2, 0xad3e: 0xe0002d1e, 0xad3f: 0xe0002cca, - // Block 0x2b5, offset 0xad40 - 0xad40: 0xe0002d0e, 0xad41: 0xe0002cb6, 0xad42: 0xe0002d12, 0xad43: 0xe0002d16, - 0xad44: 0x02aa9e86, 0xad45: 0x02bcf886, 0xad46: 0x02cb0e86, 0xad47: 0x02f71e86, - 0xad48: 0xe00002e3, 0xad49: 0xe00003d8, 0xad4a: 0xe00004b3, 0xad4b: 0xe000057d, - 0xad4c: 0xe0000648, 0xad4d: 0xe00006f0, 0xad4e: 0xe000079c, 0xad4f: 0xe0000841, - 0xad50: 0xe0000ec0, 0xad51: 0xf0000606, 0xad52: 0xf0000606, 0xad53: 0xf0000606, - 0xad54: 0xf0000606, 0xad55: 0xf0000606, 0xad56: 0xf0000606, 0xad57: 0xf0000606, - 0xad58: 0xf0000606, 0xad59: 0xf0000606, 0xad5a: 0xf0000606, 0xad5b: 0xf0000606, - 0xad5c: 0xf0000606, 0xad5d: 0xf0000606, 0xad5e: 0xf0000606, 0xad5f: 0xf0000606, - 0xad60: 0x0062ac86, 0xad61: 0x0062b086, 0xad62: 0x0062b286, 0xad63: 0x0062b686, - 0xad64: 0x0062b886, 0xad65: 0x0062ba86, 0xad66: 0x0062be86, 0xad67: 0x0062c286, - 0xad68: 0x0062c486, 0xad69: 0x0062c886, 0xad6a: 0x0062ca86, 0xad6b: 0x0062cc86, - 0xad6c: 0x0062ce86, 0xad6d: 0x0062d086, 0xad6e: 0xf0000606, 0xad6f: 0xf0000606, - 0xad70: 0xf0000606, 0xad71: 0xf0000606, 0xad72: 0xf0000606, 0xad73: 0xf0000606, - 0xad74: 0xf0000606, 0xad75: 0xf0000606, 0xad76: 0xf0000606, 0xad77: 0xf0000606, - 0xad78: 0xf0000606, 0xad79: 0xf0000606, 0xad7a: 0xf0000606, 0xad7b: 0xf0000606, - 0xad7c: 0xe0002127, 0xad7d: 0xe0002122, 0xad7e: 0xf0000606, 0xad7f: 0x4027ac20, - // Block 0x2b6, offset 0xad80 - 0xad80: 0xe0002dea, 0xad81: 0xe0002e57, 0xad82: 0xe0002e8c, 0xad83: 0xe0002eb9, - 0xad84: 0xe0002ecb, 0xad85: 0xe0002eda, 0xad86: 0xe0002ee9, 0xad87: 0xe0002ef8, - 0xad88: 0xe0002f07, 0xad89: 0xe0002d50, 0xad8a: 0xe0002d63, 0xad8b: 0xe0002d76, - 0xad8c: 0xf0001c1d, 0xad8d: 0xe0000b85, 0xad8e: 0xf0001d1c, 0xad8f: 0xe0000d14, - 0xad90: 0x00657693, 0xad91: 0x00657893, 0xad92: 0x00657a93, 0xad93: 0x00657e93, - 0xad94: 0x00658093, 0xad95: 0x00658293, 0xad96: 0x00658493, 0xad97: 0x00658693, - 0xad98: 0x00658893, 0xad99: 0x00658a93, 0xad9a: 0x00658c93, 0xad9b: 0x00658e93, - 0xad9c: 0x00659093, 0xad9d: 0x00659293, 0xad9e: 0x00659493, 0xad9f: 0x00659693, - 0xada0: 0x00659893, 0xada1: 0x00659a93, 0xada2: 0x00659c93, 0xada3: 0x00659e93, - 0xada4: 0x0065a093, 0xada5: 0x0065a293, 0xada6: 0x0065a493, 0xada7: 0x0065a693, - 0xada8: 0x0065a893, 0xada9: 0x0065aa93, 0xadaa: 0x0065ac93, 0xadab: 0x0065ae93, - 0xadac: 0x0065b093, 0xadad: 0x0065b293, 0xadae: 0x0065b493, 0xadaf: 0x0065b693, - 0xadb0: 0x0065b893, 0xadb1: 0x0065ba93, 0xadb2: 0x0065bc93, 0xadb3: 0x0065be93, - 0xadb4: 0x0065c093, 0xadb5: 0x0065c493, 0xadb6: 0x0065c693, 0xadb7: 0x0065c893, - 0xadb8: 0x0065ca93, 0xadb9: 0x0065cc93, 0xadba: 0x0065ce93, 0xadbb: 0x0065d093, - 0xadbc: 0x0065d293, 0xadbd: 0x0065d493, 0xadbe: 0x0065d693, - // Block 0x2b7, offset 0xadc0 - 0xadc0: 0xe000230b, 0xadc1: 0xe00022f8, 0xadc2: 0xe00022fc, 0xadc3: 0xe0002311, - 0xadc4: 0xe0002316, 0xadc5: 0xe000231d, 0xadc6: 0xe0002321, 0xadc7: 0xe0002325, - 0xadc8: 0xe000232b, 0xadc9: 0xf0001c1c, 0xadca: 0xe0002330, 0xadcb: 0xe000233c, - 0xadcc: 0xe0002340, 0xadcd: 0xe0002337, 0xadce: 0xe0002346, 0xadcf: 0xe000234b, - 0xadd0: 0xe000234f, 0xadd1: 0xe0002353, 0xadd2: 0xf0001c1c, 0xadd3: 0xe000235e, - 0xadd4: 0xe0002358, 0xadd5: 0xf0001c1c, 0xadd6: 0xe0002363, 0xadd7: 0xe000236d, - 0xadd8: 0xe0002d39, 0xadd9: 0xe0002ded, 0xadda: 0xe0002e5a, 0xaddb: 0xe0002e8f, - 0xaddc: 0xe0002ebc, 0xaddd: 0xe0002ece, 0xadde: 0xe0002edd, 0xaddf: 0xe0002eec, - 0xade0: 0xe0002efb, 0xade1: 0xe0002f0a, 0xade2: 0xe0002d54, 0xade3: 0xe0002d67, - 0xade4: 0xe0002d7a, 0xade5: 0xe0002d89, 0xade6: 0xe0002d98, 0xade7: 0xe0002da7, - 0xade8: 0xe0002db6, 0xade9: 0xe0002dc5, 0xadea: 0xe0002dd4, 0xadeb: 0xe0002de3, - 0xadec: 0xe0002e01, 0xaded: 0xe0002e0c, 0xadee: 0xe0002e17, 0xadef: 0xe0002e22, - 0xadf0: 0xe0002e2d, 0xadf1: 0xe0000c1e, 0xadf2: 0xf0001c1c, 0xadf3: 0xf0001d1d, - 0xadf4: 0xe0000a31, 0xadf5: 0xf0001d1c, 0xadf6: 0xf0001c1c, 0xadf7: 0xf0001c1c, - 0xadf8: 0xe0000ac2, 0xadf9: 0xe0000ac6, 0xadfa: 0xf0001d1d, 0xadfb: 0xe0004091, - 0xadfc: 0xe0004097, 0xadfd: 0xe000408e, 0xadfe: 0xe0004094, 0xadff: 0xe0002431, - // Block 0x2b8, offset 0xae00 - 0xae00: 0xf0001d1c, 0xae01: 0xf0001d1d, 0xae02: 0xe00009b7, 0xae03: 0xf0001c1d, - 0xae04: 0xf0001c1c, 0xae05: 0xf0001c1c, 0xae06: 0xe0000a66, 0xae07: 0xe0000a7a, - 0xae08: 0xf0001d1c, 0xae09: 0xf0001c1d, 0xae0a: 0xf0001c1c, 0xae0b: 0xf0001d1d, - 0xae0c: 0xf0001c1c, 0xae0d: 0xf0001d1d, 0xae0e: 0xf0001d1d, 0xae0f: 0xf0001c1c, - 0xae10: 0xf0001c1c, 0xae11: 0xf0001c1c, 0xae12: 0xe0000d0d, 0xae13: 0xf0001c1c, - 0xae14: 0xf0001c1c, 0xae15: 0xe0000d3a, 0xae16: 0xe0000d46, 0xae17: 0xf0001d1d, - 0xae18: 0xe0000eb0, 0xae19: 0xe0000eb8, 0xae1a: 0xf0001d1d, 0xae1b: 0xf0001c1c, - 0xae1c: 0xf0001c1d, 0xae1d: 0xf0001c1d, 0xae1e: 0xe00010b2, 0xae1f: 0xe00009c8, - 0xae20: 0xe0002de7, 0xae21: 0xe0002e54, 0xae22: 0xe0002e89, 0xae23: 0xe0002eb6, - 0xae24: 0xe0002ec8, 0xae25: 0xe0002ed7, 0xae26: 0xe0002ee6, 0xae27: 0xe0002ef5, - 0xae28: 0xe0002f04, 0xae29: 0xe0002d4c, 0xae2a: 0xe0002d5f, 0xae2b: 0xe0002d72, - 0xae2c: 0xe0002d85, 0xae2d: 0xe0002d94, 0xae2e: 0xe0002da3, 0xae2f: 0xe0002db2, - 0xae30: 0xe0002dc1, 0xae31: 0xe0002dd0, 0xae32: 0xe0002ddf, 0xae33: 0xe0002dfd, - 0xae34: 0xe0002e08, 0xae35: 0xe0002e13, 0xae36: 0xe0002e1e, 0xae37: 0xe0002e29, - 0xae38: 0xe0002e34, 0xae39: 0xe0002e3b, 0xae3a: 0xe0002e42, 0xae3b: 0xe0002e49, - 0xae3c: 0xe0002e50, 0xae3d: 0xe0002e66, 0xae3e: 0xe0002e6d, 0xae3f: 0xe0000bdf, - // Block 0x2b9, offset 0xae40 - 0xae40: 0x6c009820, 0xae41: 0x6c0ea820, 0xae43: 0x6c08fe20, - 0xae47: 0x6c148c20, - 0xae48: 0x6c0ad420, 0xae49: 0x6c083420, 0xae4a: 0x6c0ad220, 0xae4b: 0x6c01b020, - 0xae4d: 0x6c12c420, 0xae4e: 0x6c158a20, - 0xae50: 0x6c172e20, 0xae51: 0x6c00da20, - 0xae54: 0x6c02d020, 0xae55: 0x6c173020, 0xae56: 0x6c0bc820, 0xae57: 0x6c18e620, - 0xae58: 0x6c041820, 0xae59: 0x6c134c20, - 0xae5e: 0x6c0ad620, - 0xae61: 0x6c164420, - 0xae66: 0x6c135c20, - 0xae6a: 0x6c173220, - 0xae6d: 0x6c0e8020, - 0xae71: 0x6c173420, 0xae72: 0x6c051c20, - 0xae76: 0x6c173620, - 0xae78: 0x6c036a20, 0xae79: 0x6c0e1420, 0xae7b: 0x6c095e20, - 0xae7c: 0x6c173820, 0xae7f: 0x6c173a20, - // Block 0x2ba, offset 0xae80 - 0xae82: 0x6c173c20, 0xae83: 0x6c110e20, - 0xae85: 0x6c041a20, - 0xae8b: 0x6c111220, - 0xae8d: 0x6c10ae20, 0xae8e: 0x6c062620, 0xae8f: 0x6c13fa20, - 0xae95: 0x6c29d820, 0xae96: 0x6c173e20, 0xae97: 0x6c0ad820, - 0xae98: 0x6c174020, 0xae99: 0x6c01a220, - 0xae9d: 0x6c04f220, 0xae9e: 0x6c068020, 0xae9f: 0x6c152220, - 0xaea2: 0x6c1b9e20, - 0xaeb1: 0x6c15ec20, 0xaeb3: 0x6c10e220, - 0xaebe: 0x6c02fa20, - // Block 0x2bb, offset 0xaec0 - 0xaec0: 0x6c03d620, 0xaec2: 0x6c174220, - 0xaec5: 0x6c174420, 0xaec6: 0x6c163e20, - 0xaec8: 0x6c158620, 0xaec9: 0x6c0d0c20, 0xaeca: 0x6c174820, 0xaecb: 0x6c08c020, - 0xaecc: 0x6c10ce20, 0xaece: 0x6c174e20, - 0xaed1: 0x6c00f820, 0xaed2: 0x6c065e20, - 0xaed4: 0x6c065c20, 0xaed5: 0x6c008c20, - 0xaed8: 0x6c171a20, 0xaed9: 0x6c171820, 0xaedb: 0x6c077e20, - 0xaedc: 0x6c000220, 0xaede: 0x6c175020, 0xaedf: 0x6c175220, - 0xaee0: 0x6c175420, 0xaee1: 0x6c13fc20, 0xaee2: 0x6c175620, - 0xaee4: 0x6c068420, 0xaee5: 0x6c008e20, 0xaee6: 0x6c147820, - 0xaee8: 0x6c046420, 0xaeeb: 0x6c046620, - 0xaeec: 0x6c046820, 0xaeed: 0x6c0f3420, 0xaeee: 0x6c164020, - 0xaef0: 0x6c175820, 0xaef3: 0x6c175a20, - 0xaef6: 0x6c175c20, - 0xaefa: 0x6c0b5e20, - // Block 0x2bc, offset 0xaf00 - 0xaf00: 0x6c09c020, 0xaf01: 0x6c0b6020, 0xaf02: 0x6c176620, - 0xaf04: 0x6c176220, 0xaf06: 0x6c176420, 0xaf07: 0x6c041c20, - 0xaf0a: 0x6c075e20, 0xaf0b: 0x6c021820, - 0xaf0d: 0x6c176020, 0xaf0e: 0x6c175e20, 0xaf0f: 0x6c132a20, - 0xaf14: 0x6c086020, 0xaf15: 0x6c085e20, 0xaf16: 0x6c0d7420, 0xaf17: 0x6c176820, - 0xaf18: 0x6c12c620, 0xaf19: 0x6c0c4e20, - 0xaf1e: 0x6c176a20, 0xaf1f: 0x6c176e20, - 0xaf23: 0x6c0dc220, - 0xaf24: 0x6c168a20, 0xaf25: 0x6c005420, - 0xaf2d: 0x6c176c20, 0xaf2e: 0x6c01b420, - 0xaf30: 0x6c04b020, 0xaf32: 0x6c0e8220, - 0xaf36: 0x6c05c220, 0xaf37: 0x6c177020, - 0xaf3b: 0x6c10ec20, - // Block 0x2bd, offset 0xaf40 - 0xaf41: 0x6c038620, - 0xaf49: 0x6c177220, 0xaf4a: 0x6c005620, - 0xaf4d: 0x6c066020, 0xaf4e: 0x6c038820, 0xaf4f: 0x6c131020, - 0xaf50: 0x6c11c420, 0xaf51: 0x6c041e20, - 0xaf5a: 0x6c021a20, - 0xaf5c: 0x6c17b820, 0xaf5d: 0x6c0fae20, - 0xaf6f: 0x6c117c20, - 0xaf70: 0x6c177620, - 0xaf74: 0x6c11d820, 0xaf76: 0x6c168c20, - 0xaf78: 0x6c0b1e20, 0xaf7a: 0x6c086220, - 0xaf7c: 0x6c08c220, 0xaf7d: 0x6c01b820, - // Block 0x2be, offset 0xaf80 - 0xaf83: 0x6c0f1220, - 0xaf86: 0x6c0df820, 0xaf87: 0x6c177e20, - 0xaf8d: 0x6c005820, 0xaf8e: 0x6c0f3620, 0xaf8f: 0x6c09c220, - 0xaf90: 0x6c078020, 0xaf91: 0x6c155420, 0xaf93: 0x6c0d9420, - 0xaf95: 0x6c01b620, 0xaf97: 0x6c177c20, - 0xaf99: 0x6c158820, 0xaf9a: 0x6c177420, 0xaf9b: 0x6c177820, - 0xaf9c: 0x6c07f420, 0xaf9d: 0x6c177a20, 0xaf9e: 0x6c1ade20, - 0xafa9: 0x6c178a20, - 0xafaf: 0x6c179020, - 0xafb0: 0x6c178c20, 0xafb3: 0x6c01bc20, - 0xafb5: 0x6c134e20, 0xafb6: 0x6c178020, - 0xafbb: 0x6c178820, - 0xafbc: 0x6c068620, 0xafbf: 0x6c086420, - // Block 0x2bf, offset 0xafc0 - 0xafc3: 0x6c02fc20, - 0xafc6: 0x6c179220, - 0xafc8: 0x6c178220, 0xafcb: 0x6c168e20, - 0xafcd: 0x6c08c420, 0xafcf: 0x6c178420, - 0xafd1: 0x6c178e20, - 0xafd6: 0x6c179420, - 0xafd8: 0x6c178620, 0xafdb: 0x6c046a20, - 0xafdd: 0x6c005a20, - 0xafe0: 0x6c046c20, 0xafe1: 0x6c01ba20, - 0xafeb: 0x6c1ae020, - 0xafed: 0x6c148620, 0xafee: 0x6c12f820, 0xafef: 0x6c068820, - 0xaff5: 0x6c0b2220, 0xaff6: 0x6c163620, - 0xafff: 0x6c138820, - // Block 0x2c0, offset 0xb000 - 0xb002: 0x6c055420, 0xb003: 0x6c0d4220, - 0xb004: 0x6c020020, - 0xb00a: 0x6c09f220, - 0xb00e: 0x6c179c20, - 0xb010: 0x6c17a620, 0xb011: 0x6c17a220, - 0xb014: 0x6c179820, 0xb017: 0x6c0d5620, - 0xb018: 0x6c179e20, 0xb01a: 0x6c17a420, 0xb01b: 0x6c17a020, - 0xb01d: 0x6c139220, 0xb01f: 0x6c179a20, - 0xb021: 0x6c0b2020, 0xb023: 0x6c147a20, - 0xb024: 0x6c17a820, 0xb025: 0x6c17aa20, - 0xb02e: 0x6c099420, 0xb02f: 0x6c17c420, - 0xb033: 0x6c114420, - 0xb035: 0x6c128820, 0xb036: 0x6c17ba20, - 0xb038: 0x6c13b820, 0xb03a: 0x6c01a420, - 0xb03e: 0x6c17c220, - // Block 0x2c1, offset 0xb040 - 0xb045: 0x6c17b620, 0xb046: 0x6c17c820, - 0xb049: 0x6c0ce020, 0xb04b: 0x6c062820, - 0xb04d: 0x6c115c20, 0xb04f: 0x6c233820, - 0xb051: 0x6c17c620, 0xb052: 0x6c0fe620, - 0xb054: 0x6c17b020, 0xb056: 0x6c068c20, - 0xb059: 0x6c068a20, 0xb05a: 0x6c17ac20, - 0xb05f: 0x6c094420, - 0xb061: 0x6c17bc20, 0xb063: 0x6c13b620, - 0xb064: 0x6c0e4e20, 0xb065: 0x6c17b420, 0xb066: 0x6c05c620, - 0xb068: 0x6c17ae20, 0xb069: 0x6c17be20, 0xb06a: 0x6c17b220, 0xb06b: 0x6c166a20, - 0xb06c: 0x6c17c020, 0xb06d: 0x6c170620, - 0xb076: 0x6c04f420, - 0xb079: 0x6c05c420, - // Block 0x2c2, offset 0xb080 - 0xb083: 0x6c17ca20, - 0xb087: 0x6c17cc20, - 0xb088: 0x6c17d420, 0xb089: 0x6c005c20, - 0xb08f: 0x6c137820, - 0xb090: 0x6c17d220, - 0xb095: 0x6c17d020, 0xb096: 0x6c17d820, - 0xb09a: 0x6c17d620, - 0xb09c: 0x6c0f3820, - 0xb0a5: 0x6c05c820, - 0xb0ac: 0x6c17da20, - 0xb0b2: 0x6c091a20, - 0xb0b4: 0x6c0d4420, 0xb0b5: 0x6c0f3a20, 0xb0b6: 0x6c051420, - 0xb0b8: 0x6c17dc20, - 0xb0bd: 0x6c03d820, - // Block 0x2c3, offset 0xb0c0 - 0xb0c0: 0x6c17de20, - 0xb0c5: 0x6c17e220, - 0xb0cd: 0x6c13fe20, - 0xb0d1: 0x6c05b020, - 0xb0d8: 0x6c083620, 0xb0d9: 0x6c124e20, 0xb0da: 0x6c17e020, - 0xb0ec: 0x6c07a220, 0xb0ed: 0x6c159220, - 0xb0f2: 0x6c17e620, 0xb0f3: 0x6c17ec20, - 0xb0f4: 0x6c17e420, 0xb0f5: 0x6c07a020, 0xb0f7: 0x6c0a4620, - 0xb0fe: 0x6c055620, - // Block 0x2c4, offset 0xb100 - 0xb102: 0x6c17ee20, - 0xb105: 0x6c04c620, - 0xb109: 0x6c17e820, 0xb10a: 0x6c17ea20, - 0xb10d: 0x6c104620, 0xb10f: 0x6c0d3420, - 0xb111: 0x6c046e20, - 0xb115: 0x6c142e20, 0xb116: 0x6c17f020, - 0xb11a: 0x6c164220, - 0xb11e: 0x6c17f220, - 0xb123: 0x6c17f820, - 0xb125: 0x6c17f420, 0xb127: 0x6c0cd820, - 0xb12d: 0x6c17f620, 0xb12e: 0x6c17fa20, - 0xb135: 0x6c17fe20, - 0xb139: 0x6c17fc20, 0xb13b: 0x6c136820, - // Block 0x2c5, offset 0xb140 - 0xb140: 0x6c03da20, 0xb141: 0x6c180220, 0xb142: 0x6c180420, - 0xb144: 0x6c019620, - 0xb149: 0x6c180020, - 0xb152: 0x6c097820, - 0xb154: 0x6c180a20, 0xb155: 0x6c180820, 0xb156: 0x6c180620, - 0xb158: 0x6c179620, 0xb15a: 0x6c180c20, - 0xb15f: 0x6c0a4820, - 0xb161: 0x6c180e20, - 0xb16a: 0x6c155620, - 0xb172: 0x6c150220, - 0xb177: 0x6c181220, - 0xb17a: 0x6c181020, 0xb17b: 0x6c181620, - 0xb17c: 0x6c181420, 0xb17f: 0x6c181820, - // Block 0x2c6, offset 0xb180 - 0xb180: 0x6c181a20, 0xb181: 0x6c00a820, 0xb183: 0x6c060a20, - 0xb184: 0x6c055a20, 0xb185: 0x6c09c420, 0xb186: 0x6c0eaa20, 0xb187: 0x6c047020, - 0xb188: 0x6c0c5020, 0xb189: 0x6c068e20, 0xb18b: 0x6c073820, - 0xb18c: 0x6c181e20, 0xb18d: 0x6c14e020, 0xb18e: 0x6c0fb820, - 0xb190: 0x6c08c620, 0xb192: 0x6c181c20, - 0xb194: 0x6c182020, - 0xb19a: 0x6c0fe820, - 0xb19c: 0x6c02de20, - 0xb1a2: 0x6c182220, - 0xb1a5: 0x6c10e420, - 0xb1a8: 0x6c0ca420, 0xb1a9: 0x6c182620, 0xb1aa: 0x6c182820, 0xb1ab: 0x6c11b820, - 0xb1ac: 0x6c069020, 0xb1ad: 0x6c16fa20, 0xb1ae: 0x6c182a20, - 0xb1b1: 0x6c047420, - 0xb1b5: 0x6c135020, 0xb1b6: 0x6c0d6420, 0xb1b7: 0x6c050a20, - 0xb1b8: 0x6c0f9620, - 0xb1bc: 0x6c05ca20, - // Block 0x2c7, offset 0xb1c0 - 0xb1c0: 0x6c182c20, 0xb1c2: 0x6c182e20, - 0xb1c5: 0x6c10ac20, 0xb1c6: 0x6c013a20, - 0xb1c9: 0x6c183420, 0xb1ca: 0x6c081220, - 0xb1cc: 0x6c183220, 0xb1cd: 0x6c07a420, 0xb1cf: 0x6c183620, - 0xb1d0: 0x6c27ee20, 0xb1d1: 0x6c183820, 0xb1d2: 0x6c141620, 0xb1d3: 0x6c183a20, - 0xb1d5: 0x6c183c20, 0xb1d6: 0x6c183e20, 0xb1d7: 0x6c0ada20, - 0xb1d9: 0x6c092820, - 0xb1e0: 0x6c02fe20, 0xb1e2: 0x6c184420, - 0xb1e4: 0x6c184020, 0xb1e5: 0x6c14ca20, 0xb1e6: 0x6c184220, - 0xb1e8: 0x6c12d020, 0xb1e9: 0x6c184620, 0xb1ea: 0x6c184820, 0xb1eb: 0x6c184a20, - 0xb1ec: 0x6c0fea20, - 0xb1f0: 0x6c185220, 0xb1f1: 0x6c184e20, 0xb1f2: 0x6c185020, 0xb1f3: 0x6c184c20, - 0xb1f4: 0x6c07de20, 0xb1f5: 0x6c185420, 0xb1f6: 0x6c152420, 0xb1f7: 0x6c169020, - 0xb1fd: 0x6c185620, - // Block 0x2c8, offset 0xb200 - 0xb204: 0x6c0bd020, 0xb205: 0x6c185820, 0xb206: 0x6c0a0020, - 0xb209: 0x6c185a20, 0xb20b: 0x6c0eac20, - 0xb20c: 0x6c164620, 0xb20d: 0x6c0fec20, - 0xb216: 0x6c18ec20, - 0xb21b: 0x6c185c20, - 0xb21c: 0x6c31a420, 0xb21d: 0x6c04b220, - 0xb220: 0x6c185e20, 0xb221: 0x6c145020, - 0xb226: 0x6c0a1c20, 0xb227: 0x6c0df020, - 0xb229: 0x6c186220, 0xb22a: 0x6c10b020, - 0xb22d: 0x6c186420, - 0xb230: 0x6c186620, 0xb231: 0x6c025020, - 0xb235: 0x6c186820, 0xb236: 0x6c047620, - 0xb238: 0x6c108020, 0xb239: 0x6c017020, 0xb23a: 0x6c09ec20, - 0xb23d: 0x6c11a220, 0xb23e: 0x6c186a20, - // Block 0x2c9, offset 0xb240 - 0xb240: 0x6c0fee20, 0xb243: 0x6c0b6220, - 0xb244: 0x6c186c20, 0xb246: 0x6c133020, 0xb247: 0x6c0c3420, - 0xb248: 0x6c02f420, 0xb24a: 0x6c030220, 0xb24b: 0x6c186e20, - 0xb24e: 0x6c187220, - 0xb251: 0x6c055820, - 0xb254: 0x6c187020, 0xb257: 0x6c16ae20, - 0xb25d: 0x6c0a1e20, - 0xb264: 0x6c11da20, 0xb265: 0x6c137020, 0xb267: 0x6c187420, - 0xb269: 0x6c15fc20, 0xb26a: 0x6c187620, - 0xb26e: 0x6c187820, - 0xb270: 0x6c102820, 0xb273: 0x6c187a20, - 0xb276: 0x6c0bd220, 0xb277: 0x6c081420, - 0xb278: 0x6c05cc20, 0xb279: 0x6c187c20, 0xb27a: 0x6c086620, 0xb27b: 0x6c073a20, - // Block 0x2ca, offset 0xb280 - 0xb283: 0x6c0f3c20, - 0xb284: 0x6c188020, 0xb287: 0x6c0d4620, - 0xb28a: 0x6c07f620, 0xb28b: 0x6c188220, - 0xb28c: 0x6c188420, 0xb28d: 0x6c0c9c20, 0xb28f: 0x6c187e20, - 0xb294: 0x6c188820, 0xb296: 0x6c140020, - 0xb29b: 0x6c072420, - 0xb29e: 0x6c188620, - 0xb2a3: 0x6c05ce20, - 0xb2a4: 0x6c07d420, 0xb2a5: 0x6c117e20, - 0xb2a9: 0x6c188e20, 0xb2aa: 0x6c188a20, - 0xb2af: 0x6c131220, - 0xb2b0: 0x6c0adc20, 0xb2b1: 0x6c189c20, 0xb2b2: 0x6c02bc20, 0xb2b3: 0x6c189020, - 0xb2b4: 0x6c188c20, 0xb2b5: 0x6c0cda20, - 0xb2bd: 0x6c189420, 0xb2bf: 0x6c189220, - // Block 0x2cb, offset 0xb2c0 - 0xb2c3: 0x6c027c20, - 0xb2c7: 0x6c05a420, - 0xb2c8: 0x6c189e20, 0xb2c9: 0x6c162220, - 0xb2cd: 0x6c189620, - 0xb2d1: 0x6c18a020, 0xb2d2: 0x6c189a20, - 0xb2d4: 0x6c189820, - 0xb2db: 0x6c166620, - 0xb2df: 0x6c069220, - 0xb2e0: 0x6c01be20, 0xb2e3: 0x6c16b020, - 0xb2e9: 0x6c0a3620, 0xb2ea: 0x6c0fdc20, 0xb2eb: 0x6c072620, - 0xb2ec: 0x6c18a620, 0xb2ed: 0x6c18a820, - 0xb2f1: 0x6c169220, - 0xb2f4: 0x6c16da20, 0xb2f5: 0x6c18ac20, - 0xb2f9: 0x6c069420, - 0xb2fc: 0x6c18aa20, 0xb2fe: 0x6c025220, - // Block 0x2cc, offset 0xb300 - 0xb301: 0x6c18ae20, 0xb303: 0x6c144020, - 0xb305: 0x6c0ee820, 0xb307: 0x6c155820, - 0xb309: 0x6c138a20, - 0xb30d: 0x6c18b020, - 0xb312: 0x6c2f1420, - 0xb315: 0x6c104820, 0xb317: 0x6c18b220, - 0xb318: 0x6c030420, 0xb319: 0x6c14b620, - 0xb31d: 0x6c0a4a20, 0xb31e: 0x6c18b420, 0xb31f: 0x6c13a620, - 0xb320: 0x6c18bc20, 0xb322: 0x6c0bd420, 0xb323: 0x6c18b620, - 0xb324: 0x6c04c820, 0xb326: 0x6c18b820, 0xb327: 0x6c030620, - 0xb332: 0x6c054020, 0xb333: 0x6c18be20, - 0xb335: 0x6c18c020, - 0xb338: 0x6c18c220, 0xb339: 0x6c18c420, 0xb33a: 0x6c094620, - 0xb33e: 0x6c069620, 0xb33f: 0x6c150c20, - // Block 0x2cd, offset 0xb340 - 0xb341: 0x6c152020, 0xb342: 0x6c10d620, - 0xb345: 0x6c13ba20, 0xb346: 0x6c18c620, - 0xb348: 0x6c18c820, - 0xb34d: 0x6c18cc20, 0xb34f: 0x6c18d020, - 0xb350: 0x6c18ce20, - 0xb355: 0x6c18d220, 0xb356: 0x6c01b220, 0xb357: 0x6c142c20, - 0xb359: 0x6c081020, 0xb35a: 0x6c18d420, - 0xb35d: 0x6c0cee20, - 0xb360: 0x6c0a4c20, 0xb361: 0x6c047a20, 0xb363: 0x6c18d620, - 0xb36a: 0x6c121620, - 0xb36f: 0x6c18d820, - 0xb371: 0x6c18da20, 0xb373: 0x6c18dc20, - 0xb378: 0x6c18de20, 0xb379: 0x6c126420, 0xb37a: 0x6c04f820, 0xb37b: 0x6c008a20, - 0xb37f: 0x6c106620, - // Block 0x2ce, offset 0xb380 - 0xb380: 0x6c18e020, 0xb381: 0x6c09c620, 0xb383: 0x6c0c5220, - 0xb385: 0x6c18e420, 0xb386: 0x6c18e220, 0xb387: 0x6c0a4e20, - 0xb388: 0x6c066220, 0xb389: 0x6c18e820, 0xb38a: 0x6c11dc20, - 0xb38d: 0x6c18ea20, - 0xb391: 0x6c121820, 0xb392: 0x6c0d6020, 0xb393: 0x6c0dd420, - 0xb394: 0x6c047820, 0xb397: 0x6c10c420, - 0xb398: 0x6c0e1620, 0xb39a: 0x6c118020, - 0xb39c: 0x6c143020, 0xb39e: 0x6c18ee20, - 0xb3a0: 0x6c0c5420, - 0xb3a6: 0x6c054e20, - 0xb3a9: 0x6c18f020, - 0xb3ae: 0x6c18f220, 0xb3af: 0x6c00d420, - 0xb3b0: 0x6c00aa20, 0xb3b1: 0x6c038a20, 0xb3b3: 0x6c0d4820, - 0xb3b4: 0x6c040e20, 0xb3b5: 0x6c15ee20, 0xb3b7: 0x6c18f820, - 0xb3b8: 0x6c01a620, 0xb3bb: 0x6c18f620, - 0xb3bf: 0x6c047c20, - // Block 0x2cf, offset 0xb3c0 - 0xb3c2: 0x6c18fa20, - 0xb3c4: 0x6c153220, - 0xb3d6: 0x6c18fc20, - 0xb3d8: 0x6c166c20, 0xb3da: 0x6c069820, - 0xb3df: 0x6c060c20, - 0xb3e0: 0x6c18fe20, - 0xb3e5: 0x6c190220, 0xb3e6: 0x6c190020, - 0xb3e8: 0x6c0b8220, 0xb3e9: 0x6c00ee20, - 0xb3ed: 0x6c013820, 0xb3ee: 0x6c190420, - 0xb3f0: 0x6c190620, 0xb3f3: 0x6c060e20, - 0xb3f6: 0x6c190820, - 0xb3fb: 0x6c044820, - // Block 0x2d0, offset 0xb400 - 0xb402: 0x6c083820, 0xb403: 0x6c190a20, - 0xb408: 0x6c147c20, 0xb409: 0x6c078220, 0xb40a: 0x6c042020, 0xb40b: 0x6c155a20, - 0xb40c: 0x6c0cdc20, 0xb40d: 0x6c11de20, 0xb40e: 0x6c098a20, - 0xb414: 0x6c09da20, 0xb416: 0x6c096020, 0xb417: 0x6c097a20, - 0xb419: 0x6c0a3820, 0xb41b: 0x6c11e020, - 0xb41f: 0x6c191020, - 0xb421: 0x6c010220, 0xb422: 0x6c0cde20, 0xb423: 0x6c069a20, - 0xb424: 0x6c062a20, 0xb425: 0x6c04f620, - 0xb428: 0x6c191820, 0xb429: 0x6c0df620, 0xb42a: 0x6c0df420, 0xb42b: 0x6c047e20, - 0xb42c: 0x6c0a5020, 0xb42d: 0x6c191a20, 0xb42e: 0x6c191620, 0xb42f: 0x6c01c020, - 0xb430: 0x6c0dc420, 0xb431: 0x6c090020, 0xb432: 0x6c086a20, 0xb433: 0x6c00c820, - 0xb436: 0x6c02d420, 0xb437: 0x6c072820, - 0xb438: 0x6c086820, 0xb43a: 0x6c191c20, - // Block 0x2d1, offset 0xb440 - 0xb441: 0x6c191e20, 0xb443: 0x6c03fe20, - 0xb444: 0x6c028020, - 0xb448: 0x6c072a20, 0xb449: 0x6c03fc20, 0xb44a: 0x6c0f2e20, 0xb44b: 0x6c00c620, - 0xb44c: 0x6c104a20, 0xb44d: 0x6c14cc20, 0xb44e: 0x6c069e20, 0xb44f: 0x6c15fe20, - 0xb450: 0x6c0fba20, 0xb451: 0x6c069c20, - 0xb45b: 0x6c054220, - 0xb45d: 0x6c193020, 0xb45f: 0x6c04ee20, - 0xb460: 0x6c142820, - 0xb466: 0x6c121a20, - 0xb469: 0x6c192e20, 0xb46b: 0x6c036c20, - 0xb46c: 0x6c192420, 0xb46d: 0x6c192620, 0xb46e: 0x6c192a20, - 0xb476: 0x6c192c20, - 0xb478: 0x6c042220, 0xb479: 0x6c0b8620, 0xb47b: 0x6c133220, - 0xb47c: 0x6c192820, 0xb47d: 0x6c192020, 0xb47e: 0x6c066620, - // Block 0x2d2, offset 0xb480 - 0xb480: 0x6c192220, 0xb482: 0x6c16cc20, - 0xb486: 0x6c13bc20, - 0xb488: 0x6c0f4020, 0xb489: 0x6c066420, 0xb48a: 0x6c073c20, - 0xb48e: 0x6c193220, - 0xb491: 0x6c10a220, - 0xb49f: 0x6c193a20, - 0xb4a8: 0x6c098c20, 0xb4aa: 0x6c097c20, - 0xb4b0: 0x6c194020, 0xb4b1: 0x6c193c20, 0xb4b3: 0x6c149620, - 0xb4b5: 0x6c193620, 0xb4b6: 0x6c194820, 0xb4b7: 0x6c193e20, - 0xb4bb: 0x6c194420, - 0xb4bc: 0x6c062c20, 0xb4bd: 0x6c14ce20, - // Block 0x2d3, offset 0xb4c0 - 0xb4c0: 0x6c194620, - 0xb4c4: 0x6c194a20, 0xb4c6: 0x6c194e20, - 0xb4cb: 0x6c07f820, - 0xb4cc: 0x6c170820, 0xb4ce: 0x6c193820, 0xb4cf: 0x6c193420, - 0xb4d0: 0x6c194c20, 0xb4d2: 0x6c194220, - 0xb4e2: 0x6c195220, - 0xb4e4: 0x6c196420, 0xb4e5: 0x6c195620, - 0xb4e8: 0x6c195e20, 0xb4eb: 0x6c196020, - 0xb4ec: 0x6c195820, 0xb4ef: 0x6c199a20, - 0xb4f2: 0x6c07ea20, 0xb4f3: 0x6c025620, - 0xb4f8: 0x6c195420, - 0xb4fc: 0x6c196820, 0xb4fd: 0x6c00ac20, 0xb4fe: 0x6c196620, - // Block 0x2d4, offset 0xb500 - 0xb500: 0x6c000a20, 0xb501: 0x6c12b020, 0xb502: 0x6c196220, - 0xb504: 0x6c195a20, 0xb507: 0x6c195020, - 0xb508: 0x6c195c20, 0xb509: 0x6c07a820, - 0xb518: 0x6c196a20, - 0xb521: 0x6c00ae20, 0xb522: 0x6c197c20, - 0xb525: 0x6c196c20, 0xb526: 0x6c196e20, - 0xb528: 0x6c0a5220, 0xb529: 0x6c146620, - 0xb52d: 0x6c197820, 0xb52e: 0x6c197620, - 0xb532: 0x6c0f8a20, - 0xb53a: 0x6c197a20, - 0xb53d: 0x6c197420, - // Block 0x2d5, offset 0xb540 - 0xb544: 0x6c00e420, 0xb546: 0x6c078420, 0xb547: 0x6c0b2420, - 0xb54f: 0x6c197020, - 0xb550: 0x6c0ff020, - 0xb554: 0x6c197220, 0xb556: 0x6c000420, - 0xb56e: 0x6c198620, 0xb56f: 0x6c155220, - 0xb571: 0x6c0a5620, 0xb573: 0x6c199220, - 0xb578: 0x6c199020, 0xb579: 0x6c197e20, - 0xb57e: 0x6c0d7e20, - // Block 0x2d6, offset 0xb580 - 0xb580: 0x6c198020, - 0xb584: 0x6c0dd620, 0xb585: 0x6c198a20, 0xb586: 0x6c0a5420, - 0xb58c: 0x6c198420, 0xb58f: 0x6c151820, - 0xb593: 0x6c055c20, - 0xb596: 0x6c198c20, 0xb597: 0x6c198e20, - 0xb59c: 0x6c198820, 0xb59d: 0x6c199420, - 0xb5a3: 0x6c198220, - 0xb5bb: 0x6c19a020, - 0xb5bc: 0x6c19aa20, 0xb5be: 0x6c19a220, - // Block 0x2d7, offset 0xb5c0 - 0xb5c0: 0x6c199820, 0xb5c3: 0x6c19ac20, - 0xb5c4: 0x6c0c9e20, 0xb5c7: 0x6c19b020, - 0xb5c9: 0x6c06a020, 0xb5ca: 0x6c199c20, 0xb5cb: 0x6c0eae20, - 0xb5d8: 0x6c19a420, 0xb5d9: 0x6c199620, 0xb5da: 0x6c030a20, - 0xb5dc: 0x6c038c20, 0xb5dd: 0x6c02be20, 0xb5de: 0x6c19a620, 0xb5df: 0x6c199e20, - 0xb5e7: 0x6c05d020, - 0xb5e8: 0x6c19b220, 0xb5e9: 0x6c19ae20, 0xb5ea: 0x6c0ce220, 0xb5eb: 0x6c040020, - 0xb5ec: 0x6c048020, 0xb5ee: 0x6c19a820, - 0xb5f0: 0x6c051020, - 0xb5f6: 0x6c010420, - // Block 0x2d8, offset 0xb600 - 0xb604: 0x6c19ba20, 0xb605: 0x6c19b620, 0xb607: 0x6c1a2820, - 0xb614: 0x6c19c020, - 0xb61a: 0x6c19b420, - 0xb61c: 0x6c19bc20, 0xb61f: 0x6c19b820, - 0xb623: 0x6c086c20, - 0xb624: 0x6c19be20, - 0xb637: 0x6c19c420, - 0xb639: 0x6c19ce20, - 0xb63d: 0x6c19ca20, 0xb63e: 0x6c19c820, - // Block 0x2d9, offset 0xb640 - 0xb646: 0x6c0e1820, - 0xb649: 0x6c01c220, - 0xb654: 0x6c19c220, 0xb656: 0x6c19c620, 0xb657: 0x6c0a5820, - 0xb658: 0x6c00e220, 0xb65b: 0x6c19cc20, - 0xb669: 0x6c01f420, - 0xb66f: 0x6c19e220, - 0xb671: 0x6c0b0020, 0xb672: 0x6c19da20, - 0xb674: 0x6c19d620, 0xb676: 0x6c19d820, - 0xb678: 0x6c19dc20, - // Block 0x2da, offset 0xb680 - 0xb682: 0x6c00f620, - 0xb68c: 0x6c0cae20, 0xb68e: 0x6c19d020, - 0xb690: 0x6c19d220, - 0xb69b: 0x6c02e820, - 0xb6a4: 0x6c19e020, - 0xb6a8: 0x6c038e20, 0xb6aa: 0x6c19e620, 0xb6ab: 0x6c19de20, - 0xb6ac: 0x6c19e420, - 0xb6b4: 0x6c133420, - 0xb6b8: 0x6c109220, 0xb6ba: 0x6c11d020, - // Block 0x2db, offset 0xb6c0 - 0xb6c0: 0x6c19ea20, - 0xb6c6: 0x6c19e820, 0xb6c7: 0x6c027e20, - 0xb6ca: 0x6c19ec20, - 0xb6cf: 0x6c19f220, - 0xb6d4: 0x6c19f020, - 0xb6e0: 0x6c19ee20, 0xb6e2: 0x6c111620, - 0xb6e5: 0x6c19f420, - 0xb6ee: 0x6c19f620, - 0xb6f4: 0x6c19fa20, 0xb6f6: 0x6c19f820, - 0xb6fc: 0x6c19fe20, - // Block 0x2dc, offset 0xb700 - 0xb700: 0x6c1a0420, 0xb701: 0x6c1a0020, 0xb702: 0x6c19fc20, 0xb703: 0x6c1a0220, - 0xb708: 0x6c1a0620, - 0xb70e: 0x6c1a0820, - 0xb711: 0x6c1a0a20, 0xb713: 0x6c1a0c20, - 0xb717: 0x6c1a0e20, - 0xb718: 0x6c183020, 0xb71a: 0x6c098820, 0xb71b: 0x6c086e20, - 0xb71e: 0x6c021e20, - 0xb720: 0x6c00b020, 0xb723: 0x6c0e3c20, - 0xb72e: 0x6c1a1020, - 0xb730: 0x6c076020, 0xb732: 0x6c005e20, 0xb733: 0x6c0b8020, - 0xb739: 0x6c1a1220, 0xb73a: 0x6c062e20, - 0xb73d: 0x6c073e20, 0xb73f: 0x6c1a1620, - // Block 0x2dd, offset 0xb740 - 0xb740: 0x6c1a1420, 0xb743: 0x6c139820, - 0xb744: 0x6c1a1820, - 0xb748: 0x6c1a1c20, 0xb749: 0x6c1a1a20, 0xb74b: 0x6c1a1e20, - 0xb74d: 0x6c1a2020, 0xb74f: 0x6c05d220, - 0xb752: 0x6c013c20, 0xb753: 0x6c1a2220, - 0xb756: 0x6c1a2620, - 0xb758: 0x6c1a2420, - 0xb75c: 0x6c1a2a20, 0xb75f: 0x6c0fe020, - 0xb766: 0x6c1a2c20, 0xb767: 0x6c002a20, - 0xb768: 0x6c07d620, - 0xb76d: 0x6c055e20, - 0xb770: 0x6c0e5220, - 0xb777: 0x6c1a2e20, - 0xb778: 0x6c1a3020, 0xb77b: 0x6c1a3420, - // Block 0x2de, offset 0xb780 - 0xb780: 0x6c1a3620, 0xb782: 0x6c07e020, - 0xb787: 0x6c04ca20, - 0xb78a: 0x6c140220, - 0xb78e: 0x6c1a3220, 0xb78f: 0x6c1a3820, - 0xb790: 0x6c079a20, 0xb791: 0x6c06a220, - 0xb7a1: 0x6c1a4020, - 0xb7a4: 0x6c076220, 0xb7a6: 0x6c0e1a20, - 0xb7a9: 0x6c1a3a20, 0xb7aa: 0x6c0f2420, - 0xb7bf: 0x6c1a4220, - // Block 0x2df, offset 0xb7c0 - 0xb7c2: 0x6c0b8820, - 0xb7c8: 0x6c1a3e20, 0xb7c9: 0x6c1a4420, 0xb7cb: 0x6c056220, - 0xb7d3: 0x6c1a4620, - 0xb7e0: 0x6c1a4820, 0xb7e2: 0x6c06a420, 0xb7e3: 0x6c027420, - 0xb7e4: 0x6c1a4c20, - 0xb7ea: 0x6c1a4e20, - 0xb7f0: 0x6c1a5020, 0xb7f3: 0x6c1a4a20, - // Block 0x2e0, offset 0xb800 - 0xb800: 0x6c1a3c20, 0xb803: 0x6c1a5220, - 0xb806: 0x6c1a5420, - 0xb80b: 0x6c145c20, - 0xb80e: 0x6c0ade20, - 0xb812: 0x6c1a5820, 0xb813: 0x6c1a5a20, - 0xb814: 0x6c1a5620, 0xb816: 0x6c1a5e20, - 0xb81c: 0x6c111420, 0xb81f: 0x6c009020, - 0xb820: 0x6c12c820, 0xb823: 0x6c1a6020, - 0xb834: 0x6c0b0220, 0xb837: 0x6c090220, - 0xb839: 0x6c115e20, 0xb83a: 0x6c039020, - 0xb83c: 0x6c07ee20, - // Block 0x2e1, offset 0xb840 - 0xb840: 0x6c144620, 0xb842: 0x6c104c20, - 0xb845: 0x6c05d420, 0xb846: 0x6c0d9620, - 0xb84a: 0x6c1a5c20, 0xb84b: 0x6c1a6220, - 0xb855: 0x6c0d8020, - 0xb859: 0x6c1a6420, - 0xb85d: 0x6c1a6620, - 0xb861: 0x6c1a6a20, - 0xb864: 0x6c0f4220, - 0xb86a: 0x6c030c20, - 0xb86f: 0x6c319c20, - 0xb870: 0x6c013e20, 0xb871: 0x6c13be20, - 0xb874: 0x6c0ae020, 0xb875: 0x6c0fbc20, - 0xb87a: 0x6c07e420, - 0xb87d: 0x6c1a7620, - // Block 0x2e2, offset 0xb880 - 0xb880: 0x6c135220, 0xb881: 0x6c168220, - 0xb88a: 0x6c022020, 0xb88b: 0x6c1a6e20, - 0xb891: 0x6c0cb020, 0xb892: 0x6c1a7420, - 0xb894: 0x6c0ff220, 0xb897: 0x6c0fbe20, - 0xb898: 0x6c0ff420, 0xb899: 0x6c11d220, 0xb89a: 0x6c0f0a20, - 0xb89e: 0x6c07aa20, - 0xb8a2: 0x6c1a6c20, - 0xb8a9: 0x6c016820, 0xb8ab: 0x6c0f9820, - 0xb8b0: 0x6c1a7020, 0xb8b2: 0x6c1a6820, - 0xb8b5: 0x6c0b6420, - 0xb8b9: 0x6c1a7820, - 0xb8be: 0x6c09e820, - // Block 0x2e3, offset 0xb8c0 - 0xb8c3: 0x6c048220, - 0xb8c5: 0x6c1a7a20, - 0xb8d3: 0x6c13a820, - 0xb8d7: 0x6c0d3620, - 0xb8dc: 0x6c0efc20, 0xb8df: 0x6c1a7e20, - 0xb8e8: 0x6c143220, 0xb8eb: 0x6c1a8020, - 0xb8ee: 0x6c1a8a20, - 0xb8f3: 0x6c133620, - 0xb8f8: 0x6c1a8820, 0xb8f9: 0x6c1a7c20, 0xb8fa: 0x6c1a8220, 0xb8fb: 0x6c1a8620, - 0xb8fe: 0x6c076420, - // Block 0x2e4, offset 0xb900 - 0xb901: 0x6c136a20, - 0xb905: 0x6c1a8c20, 0xb907: 0x6c0e3e20, - 0xb90a: 0x6c022220, - 0xb90c: 0x6c0ae220, - 0xb911: 0x6c1a9020, 0xb913: 0x6c1a8e20, - 0xb915: 0x6c072c20, 0xb917: 0x6c1a9220, - 0xb918: 0x6c1a9620, 0xb919: 0x6c1a9420, - 0xb91c: 0x6c1a9a20, 0xb91e: 0x6c1a8420, 0xb91f: 0x6c1a9e20, - 0xb924: 0x6c1a9c20, 0xb925: 0x6c1a9820, - 0xb92b: 0x6c087020, - 0xb92c: 0x6c0b6620, 0xb92e: 0x6c0ce420, 0xb92f: 0x6c1aa020, - 0xb930: 0x6c0bf820, 0xb931: 0x6c009a20, 0xb932: 0x6c116c20, - 0xb937: 0x6c0f2620, - 0xb939: 0x6c1aa420, 0xb93a: 0x6c1aa220, 0xb93b: 0x6c1aa620, - 0xb93c: 0x6c1aa820, 0xb93d: 0x6c1aaa20, - // Block 0x2e5, offset 0xb940 - 0xb942: 0x6c1aac20, - 0xb949: 0x6c137a20, 0xb94a: 0x6c1aae20, - 0xb94f: 0x6c01c420, - 0xb950: 0x6c1ab020, - 0xb955: 0x6c158420, 0xb956: 0x6c025420, - 0xb958: 0x6c18f420, 0xb959: 0x6c09dc20, 0xb95a: 0x6c0d7620, 0xb95b: 0x6c1ab220, - 0xb95c: 0x6c152620, - 0xb962: 0x6c14b820, - 0xb965: 0x6c1ab620, 0xb967: 0x6c0dc620, - 0xb969: 0x6c0f9a20, 0xb96a: 0x6c0d7820, 0xb96b: 0x6c12ca20, - 0xb96c: 0x6c1ab820, 0xb96d: 0x6c1aba20, 0xb96e: 0x6c017220, - 0xb971: 0x6c090420, 0xb972: 0x6c1abc20, - 0xb977: 0x6c006020, - 0xb978: 0x6c1abe20, - 0xb97e: 0x6c1ac020, - // Block 0x2e6, offset 0xb980 - 0xb984: 0x6c014020, 0xb987: 0x6c039220, - 0xb988: 0x6c10a820, 0xb989: 0x6c13c020, - 0xb98e: 0x6c1ac820, 0xb98f: 0x6c0ce620, - 0xb990: 0x6c1ac620, 0xb991: 0x6c056420, - 0xb994: 0x6c144a20, 0xb995: 0x6c1ac420, 0xb997: 0x6c0ff620, - 0xb998: 0x6c1acc20, 0xb99a: 0x6c1aca20, - 0xb9a0: 0x6c1ad020, 0xb9a2: 0x6c1ace20, - 0xb9a5: 0x6c017420, 0xb9a7: 0x6c1ad220, - 0xb9a8: 0x6c0a5a20, 0xb9a9: 0x6c1ad620, 0xb9aa: 0x6c0dfe20, - 0xb9ac: 0x6c1ad420, 0xb9ae: 0x6c133e20, - 0xb9b3: 0x6c0a3a20, - 0xb9b4: 0x6c0fe220, - 0xb9b8: 0x6c1ad820, - 0xb9bd: 0x6c06a620, - // Block 0x2e7, offset 0xb9c0 - 0xb9c1: 0x6c1ada20, 0xb9c2: 0x6c10e620, 0xb9c3: 0x6c121c20, - 0xb9c4: 0x6c14f220, - 0xb9ca: 0x6c10ee20, - 0xb9cd: 0x6c1aec20, - 0xb9d3: 0x6c03dc20, - 0xb9d6: 0x6c159620, - 0xb9d9: 0x6c14ae20, 0xb9db: 0x6c1baa20, - 0xb9dd: 0x6c1adc20, - 0xb9e3: 0x6c1ae220, - 0xb9e5: 0x6c0d8220, - 0xb9e8: 0x6c140420, - 0xb9ec: 0x6c0fc020, - 0xb9f2: 0x6c1ae420, - 0xb9f9: 0x6c145e20, 0xb9fb: 0x6c07ac20, - 0xb9fe: 0x6c0a5c20, - // Block 0x2e8, offset 0xba00 - 0xba06: 0x6c1ae620, - 0xba09: 0x6c087420, 0xba0b: 0x6c087220, - 0xba10: 0x6c003220, 0xba11: 0x6c063020, 0xba13: 0x6c0bd620, - 0xba14: 0x6c006220, - 0xba19: 0x6c1aee20, 0xba1a: 0x6c1af020, - 0xba1c: 0x6c1aea20, - 0xba25: 0x6c00ec20, 0xba26: 0x6c030e20, - 0xba28: 0x6c1ae820, 0xba2a: 0x6c14da20, 0xba2b: 0x6c127e20, - 0xba36: 0x6c001020, - 0xba3b: 0x6c00b220, - 0xba3f: 0x6c087620, - // Block 0x2e9, offset 0xba40 - 0xba41: 0x6c006420, 0xba43: 0x6c000620, - 0xba49: 0x6c1afa20, - 0xba51: 0x6c1af620, - 0xba58: 0x6c14c820, 0xba5a: 0x6c1afc20, - 0xba5c: 0x6c1af820, 0xba5f: 0x6c1af420, - 0xba60: 0x6c0b2620, - 0xba65: 0x6c1af220, - 0xba69: 0x6c138c20, - 0xba6f: 0x6c066820, - 0xba75: 0x6c1b0420, 0xba76: 0x6c1b0620, - 0xba7c: 0x6c0a5e20, - // Block 0x2ea, offset 0xba80 - 0xba80: 0x6c1afe20, 0xba81: 0x6c16dc20, - 0xba86: 0x6c113c20, - 0xba89: 0x6c1b0220, - 0xba9a: 0x6c076620, - 0xbaa2: 0x6c1b0820, - 0xbaa6: 0x6c12cc20, - 0xbaaa: 0x6c1b0a20, - 0xbaac: 0x6c1b0020, - 0xbabf: 0x6c14c620, - // Block 0x2eb, offset 0xbac0 - 0xbad2: 0x6c116020, - 0xbada: 0x6c1b0c20, 0xbadb: 0x6c128020, - 0xbafc: 0x6c1b0e20, 0xbafd: 0x6c1b1620, 0xbafe: 0x6c1b1020, - // Block 0x2ec, offset 0xbb00 - 0xbb01: 0x6c01c620, 0xbb02: 0x6c1b1420, - 0xbb09: 0x6c090620, 0xbb0b: 0x6c1b1220, - 0xbb0c: 0x6c05d620, - 0xbb10: 0x6c1b2e20, - 0xbb16: 0x6c1b2020, 0xbb17: 0x6c1b1a20, - 0xbb21: 0x6c0e7c20, 0xbb23: 0x6c1b1820, - 0xbb26: 0x6c1b1c20, - 0xbb29: 0x6c1b1e20, - 0xbb3a: 0x6c1b2220, 0xbb3b: 0x6c1b2420, - // Block 0x2ed, offset 0xbb40 - 0xbb49: 0x6c039420, 0xbb4b: 0x6c1b2820, - 0xbb4c: 0x6c1b2620, - 0xbb56: 0x6c1b2a20, - 0xbb62: 0x6c0ae420, - 0xbb6a: 0x6c1b3020, - 0xbb6c: 0x6c0f2820, - 0xbb70: 0x6c010620, 0xbb72: 0x6c1b2c20, - 0xbb76: 0x6c1b3220, - 0xbb7e: 0x6c1b3420, - // Block 0x2ee, offset 0xbb80 - 0xbb80: 0x6c1b3a20, 0xbb83: 0x6c1b3620, - 0xbb85: 0x6c1b3820, - 0xbb90: 0x6c087820, 0xbb91: 0x6c1b3c20, - 0xbb94: 0x6c06a820, 0xbb95: 0x6c1b3e20, 0xbb97: 0x6c08c820, - 0xbb98: 0x6c0d6820, 0xbb9a: 0x6c1b4020, 0xbb9b: 0x6c1b4220, - 0xbb9c: 0x6c088820, 0xbb9d: 0x6c06aa20, 0xbb9f: 0x6c14f420, - 0xbba3: 0x6c03bc20, - 0xbba4: 0x6c063220, 0xbba5: 0x6c1b4420, 0xbba6: 0x6c02a420, - 0xbba9: 0x6c1b4620, 0xbbab: 0x6c0d6a20, - 0xbbb0: 0x6c1b4820, 0xbbb1: 0x6c1b9820, 0xbbb3: 0x6c1b4a20, - 0xbbb5: 0x6c1b4c20, - 0xbbb8: 0x6c1b4e20, 0xbbba: 0x6c1b5220, - // Block 0x2ef, offset 0xbbc0 - 0xbbc0: 0x6c1b5420, 0xbbc3: 0x6c1b5620, - 0xbbc5: 0x6c0dd820, 0xbbc7: 0x6c00ca20, - 0xbbc8: 0x6c096220, 0xbbc9: 0x6c004420, 0xbbcb: 0x6c0cea20, - 0xbbcc: 0x6c031020, 0xbbcd: 0x6c08fa20, 0xbbcf: 0x6c06ac20, - 0xbbd5: 0x6c0ff820, 0xbbd7: 0x6c098e20, - 0xbbd8: 0x6c031220, 0xbbd9: 0x6c0e8420, 0xbbda: 0x6c0f4420, 0xbbdb: 0x6c003020, - 0xbbdc: 0x6c03de20, 0xbbdd: 0x6c13c220, 0xbbdf: 0x6c091420, - 0xbbe2: 0x6c041020, 0xbbe3: 0x6c0c5620, - 0xbbe4: 0x6c090820, 0xbbe5: 0x6c155c20, 0xbbe6: 0x6c1b5820, - 0xbbee: 0x6c042420, - 0xbbf0: 0x6c07ae20, 0xbbf3: 0x6c025820, - 0xbbf4: 0x6c014220, 0xbbf5: 0x6c0a6020, 0xbbf6: 0x6c01c820, - 0xbbf8: 0x6c1b5a20, 0xbbf9: 0x6c159820, - 0xbbff: 0x6c09de20, - // Block 0x2f0, offset 0xbc00 - 0xbc02: 0x6c095820, 0xbc03: 0x6c1b5c20, - 0xbc04: 0x6c039620, 0xbc05: 0x6c108c20, 0xbc06: 0x6c14a220, 0xbc07: 0x6c1b5e20, - 0xbc09: 0x6c1b6020, - 0xbc0c: 0x6c12ce20, - 0xbc10: 0x6c1b6420, 0xbc12: 0x6c030020, 0xbc13: 0x6c051620, - 0xbc14: 0x6c1b6220, - 0xbc1b: 0x6c031420, - 0xbc1d: 0x6c0b2820, 0xbc1e: 0x6c1b6c20, 0xbc1f: 0x6c081620, - 0xbc21: 0x6c01ca20, 0xbc22: 0x6c1b6a20, - 0xbc24: 0x6c1b6620, 0xbc25: 0x6c1b6e20, 0xbc26: 0x6c1b6820, 0xbc27: 0x6c10fa20, - 0xbc28: 0x6c205420, 0xbc29: 0x6c0b2a20, 0xbc2b: 0x6c1b7020, - 0xbc2e: 0x6c164820, - 0xbc30: 0x6c1b7220, 0xbc33: 0x6c1b7620, - 0xbc35: 0x6c0eb020, 0xbc36: 0x6c1b7420, - 0xbc38: 0x6c0bc620, 0xbc3a: 0x6c08ca20, - 0xbc3e: 0x6c0d9820, 0xbc3f: 0x6c097e20, - // Block 0x2f1, offset 0xbc40 - 0xbc41: 0x6c130620, 0xbc42: 0x6c0c5820, - 0xbc44: 0x6c092a20, 0xbc45: 0x6c1b7820, 0xbc46: 0x6c0a6220, 0xbc47: 0x6c1b7a20, - 0xbc48: 0x6c1b7c20, 0xbc49: 0x6c006620, 0xbc4a: 0x6c0d6c20, 0xbc4b: 0x6c0b6820, - 0xbc4d: 0x6c1b7e20, 0xbc4e: 0x6c104e20, 0xbc4f: 0x6c0a6420, - 0xbc51: 0x6c0a6620, 0xbc53: 0x6c1b8020, - 0xbc56: 0x6c0c5a20, - 0xbc5a: 0x6c0a6820, - 0xbc60: 0x6c1b8220, 0xbc62: 0x6c1b8420, - 0xbc64: 0x6c151020, - 0xbc68: 0x6c1b8620, - 0xbc6d: 0x6c04b420, - 0xbc71: 0x6c099020, - 0xbc78: 0x6c1b8820, 0xbc79: 0x6c1b8a20, 0xbc7a: 0x6c094820, 0xbc7b: 0x6c0b1c20, - 0xbc7c: 0x6c10d020, 0xbc7d: 0x6c0b6c20, 0xbc7e: 0x6c125020, 0xbc7f: 0x6c10e820, - // Block 0x2f2, offset 0xbc80 - 0xbc80: 0x6c04ba20, 0xbc81: 0x6c1b8c20, - 0xbc85: 0x6c044a20, 0xbc86: 0x6c1b8e20, - 0xbc88: 0x6c052420, 0xbc8a: 0x6c108620, 0xbc8b: 0x6c019820, - 0xbc8d: 0x6c087a20, 0xbc8e: 0x6c1b9020, 0xbc8f: 0x6c1b9620, - 0xbc90: 0x6c1b9420, 0xbc91: 0x6c052220, 0xbc93: 0x6c1b9220, - 0xbc95: 0x6c0f9c20, - 0xbc9e: 0x6c0d5820, - 0xbca0: 0x6c0fc220, 0xbca1: 0x6c092020, - 0xbca4: 0x6c0cec20, 0xbca5: 0x6c160020, - 0xbcac: 0x6c1b9a20, 0xbcae: 0x6c1b9c20, 0xbcaf: 0x6c109420, - 0xbcb1: 0x6c083a20, - 0xbcb6: 0x6c1ba020, - 0xbcb9: 0x6c1ba220, - // Block 0x2f3, offset 0xbcc0 - 0xbccc: 0x6c1ba420, - 0xbcd0: 0x6c039820, 0xbcd1: 0x6c1ba620, - 0xbcd4: 0x6c1ba820, - 0xbce1: 0x6c019020, - 0xbce8: 0x6c0cb220, 0xbce9: 0x6c037820, 0xbceb: 0x6c1bac20, - 0xbcec: 0x6c14a020, - 0xbcf1: 0x6c0d9c20, 0xbcf3: 0x6c02a620, - 0xbcf6: 0x6c1bb020, 0xbcf7: 0x6c1bb420, - 0xbcf8: 0x6c036e20, 0xbcfb: 0x6c1bae20, - 0xbcfc: 0x6c1bb220, 0xbcfe: 0x6c1bb820, - // Block 0x2f4, offset 0xbd00 - 0xbd05: 0x6c1bb620, 0xbd07: 0x6c1bba20, - 0xbd19: 0x6c1bbc20, - 0xbd20: 0x6c106220, 0xbd21: 0x6c048420, - 0xbd28: 0x6c020220, 0xbd29: 0x6c1bbe20, 0xbd2a: 0x6c1bc820, - 0xbd2d: 0x6c1bc420, 0xbd2f: 0x6c13c620, - 0xbd30: 0x6c13c420, - 0xbd36: 0x6c0ffa20, - 0xbd3a: 0x6c1bc220, 0xbd3b: 0x6c09f420, - 0xbd3d: 0x6c1bc020, - // Block 0x2f5, offset 0xbd40 - 0xbd47: 0x6c0ba820, - 0xbd4b: 0x6c1bca20, - 0xbd4e: 0x6c07ec20, - 0xbd51: 0x6c1bd620, - 0xbd54: 0x6c1bd820, 0xbd55: 0x6c1bcc20, 0xbd56: 0x6c025a20, 0xbd57: 0x6c1bce20, - 0xbd58: 0x6c1be020, 0xbd59: 0x6c1bde20, 0xbd5a: 0x6c1bdc20, 0xbd5b: 0x6c1bd420, - 0xbd5f: 0x6c1bd220, - 0xbd62: 0x6c1bda20, - 0xbd69: 0x6c13c820, - // Block 0x2f6, offset 0xbd80 - 0xbd8b: 0x6c1be820, - 0xbd8c: 0x6c1be220, 0xbd8e: 0x6c1be620, - 0xbd90: 0x6c15f020, 0xbd92: 0x6c1be420, - 0xbd9c: 0x6c1bd020, - 0xbda9: 0x6c0baa20, - 0xbdac: 0x6c1bea20, 0xbdaf: 0x6c078620, - 0xbdb3: 0x6c1bec20, - 0xbdb6: 0x6c1bee20, - // Block 0x2f7, offset 0xbdc0 - 0xbdc2: 0x6c1bf420, - 0xbdc4: 0x6c1bf220, 0xbdc7: 0x6c1bf020, - 0xbdcb: 0x6c0ffc20, - 0xbdcc: 0x6c1bc620, - 0xbdd0: 0x6c1c0020, - 0xbddd: 0x6c1bf820, - 0xbde2: 0x6c1bf620, - 0xbdec: 0x6c1bfa20, 0xbdee: 0x6c1bfc20, - 0xbdf7: 0x6c1c0220, - 0xbdfa: 0x6c169420, - 0xbdfc: 0x6c1c0420, 0xbdfd: 0x6c1bfe20, - // Block 0x2f8, offset 0xbe00 - 0xbe09: 0x6c1c0620, - 0xbe0c: 0x6c037020, 0xbe0d: 0x6c1c0820, - 0xbe12: 0x6c1c0c20, 0xbe13: 0x6c1c0a20, - 0xbe16: 0x6c1c0e20, - 0xbe1b: 0x6c1c1020, - 0xbe1d: 0x6c0c5c20, 0xbe1e: 0x6c099220, - 0xbe21: 0x6c0a1420, 0xbe23: 0x6c0d0220, - 0xbe25: 0x6c06ae20, 0xbe26: 0x6c078820, 0xbe27: 0x6c06b020, - 0xbe28: 0x6c044c20, 0xbe2b: 0x6c1c1220, - 0xbe2e: 0x6c078a20, - 0xbe31: 0x6c063420, 0xbe32: 0x6c1c1420, 0xbe33: 0x6c149c20, - 0xbe34: 0x6c112a20, 0xbe35: 0x6c1c1620, 0xbe37: 0x6c06b220, - 0xbe3b: 0x6c030820, - 0xbe3d: 0x6c0e0220, 0xbe3e: 0x6c04cc20, - // Block 0x2f9, offset 0xbe40 - 0xbe42: 0x6c087c20, 0xbe43: 0x6c12d220, - 0xbe46: 0x6c11e220, - 0xbe4b: 0x6c1c1820, - 0xbe4c: 0x6c039a20, - 0xbe51: 0x6c1c1e20, - 0xbe56: 0x6c0eb220, - 0xbe59: 0x6c1c1c20, 0xbe5a: 0x6c1c1a20, 0xbe5b: 0x6c1c2020, - 0xbe5d: 0x6c0f4620, - 0xbe65: 0x6c0b8a20, - 0xbe6b: 0x6c087e20, - 0xbe6d: 0x6c0c1420, 0xbe6f: 0x6c0d9e20, - 0xbe70: 0x6c03b020, 0xbe73: 0x6c0eb420, - 0xbe76: 0x6c1c2220, 0xbe77: 0x6c1c2420, - 0xbe78: 0x6c0ae620, - 0xbe7d: 0x6c140620, - // Block 0x2fa, offset 0xbe80 - 0xbe80: 0x6c1c2a20, 0xbe83: 0x6c1c2820, - 0xbe84: 0x6c1c2620, 0xbe85: 0x6c131620, 0xbe87: 0x6c1c3820, - 0xbe8c: 0x6c144820, 0xbe8e: 0x6c1c2c20, - 0xbe94: 0x6c1c3020, 0xbe95: 0x6c146a20, 0xbe97: 0x6c1c2e20, - 0xbe9f: 0x6c1c3220, - 0xbea1: 0x6c11b020, 0xbea2: 0x6c1c3420, 0xbea3: 0x6c135420, - 0xbea4: 0x6c1c3620, - 0xbeb2: 0x6c031620, 0xbeb3: 0x6c135620, - 0xbeb4: 0x6c110220, 0xbeb5: 0x6c1c3a20, 0xbeb6: 0x6c1c3c20, - 0xbeb8: 0x6c06b420, 0xbeb9: 0x6c031820, 0xbeba: 0x6c1c3e20, 0xbebb: 0x6c061020, - 0xbebc: 0x6c159420, 0xbebd: 0x6c155e20, 0xbebe: 0x6c039c20, 0xbebf: 0x6c1c4220, - // Block 0x2fb, offset 0xbec0 - 0xbec1: 0x6c0eb620, 0xbec3: 0x6c06b620, - 0xbec4: 0x6c0a6a20, 0xbec7: 0x6c121e20, - 0xbeca: 0x6c0a6c20, - 0xbecf: 0x6c0a3c20, - 0xbed5: 0x6c0f4820, 0xbed6: 0x6c13ca20, 0xbed7: 0x6c0f9e20, - 0xbeda: 0x6c06b820, - 0xbedc: 0x6c12d420, - 0xbee0: 0x6c1c4420, - 0xbee6: 0x6c0fde20, 0xbee7: 0x6c079c20, - 0xbeeb: 0x6c063620, - 0xbeed: 0x6c0f4a20, - 0xbef5: 0x6c004620, 0xbef6: 0x6c0a2820, 0xbef7: 0x6c06ba20, - 0xbef8: 0x6c159a20, - // Block 0x2fc, offset 0xbf00 - 0xbf01: 0x6c1c4620, 0xbf02: 0x6c1c4820, 0xbf03: 0x6c114620, - 0xbf08: 0x6c1c4a20, 0xbf09: 0x6c16b620, 0xbf0a: 0x6c16de20, - 0xbf0f: 0x6c1c4e20, - 0xbf10: 0x6c1c4c20, 0xbf13: 0x6c028220, - 0xbf16: 0x6c1c5020, - 0xbf1a: 0x6c1c5620, 0xbf1b: 0x6c1c5820, - 0xbf1d: 0x6c1c5420, 0xbf1f: 0x6c129c20, - 0xbf20: 0x6c0a6e20, 0xbf21: 0x6c1c5c20, 0xbf22: 0x6c1c5a20, 0xbf23: 0x6c1c5220, - 0xbf28: 0x6c1c5e20, 0xbf29: 0x6c1c6020, - 0xbf2c: 0x6c1c6220, - 0xbf30: 0x6c1c6820, 0xbf31: 0x6c1c6420, 0xbf33: 0x6c1c6620, - 0xbf34: 0x6c1c6a20, 0xbf36: 0x6c014420, 0xbf37: 0x6c0f4c20, - 0xbf38: 0x6c1c6c20, 0xbf3a: 0x6c05d820, 0xbf3b: 0x6c022420, - 0xbf3c: 0x6c111020, 0xbf3e: 0x6c1c6e20, 0xbf3f: 0x6c10de20, - // Block 0x2fd, offset 0xbf40 - 0xbf41: 0x6c138e20, 0xbf43: 0x6c1c7020, - 0xbf44: 0x6c16e020, - 0xbf49: 0x6c1c7220, 0xbf4a: 0x6c135820, 0xbf4b: 0x6c1c7820, - 0xbf4c: 0x6c172c20, 0xbf4d: 0x6c174c20, 0xbf4f: 0x6c08f020, - 0xbf50: 0x6c10d220, 0xbf51: 0x6c1c7a20, 0xbf53: 0x6c042620, - 0xbf54: 0x6c0eb820, 0xbf55: 0x6c00b420, 0xbf56: 0x6c1c7c20, 0xbf57: 0x6c132420, - 0xbf58: 0x6c06bc20, 0xbf5b: 0x6c0e5420, - 0xbf5f: 0x6c0f4e20, - 0xbf65: 0x6c152e20, 0xbf66: 0x6c061220, 0xbf67: 0x6c063820, - 0xbf69: 0x6c1c7e20, - 0xbf6d: 0x6c1c8020, 0xbf6f: 0x6c1c8c20, - 0xbf71: 0x6c095a20, - 0xbf75: 0x6c0eba20, 0xbf77: 0x6c048620, - 0xbf78: 0x6c1c8220, - 0xbf7c: 0x6c127220, 0xbf7e: 0x6c0e4020, - // Block 0x2fe, offset 0xbf80 - 0xbf81: 0x6c1c8420, - 0xbf88: 0x6c1c8620, 0xbf8a: 0x6c048820, - 0xbf8c: 0x6c1c8820, 0xbf8e: 0x6c1c8a20, - 0xbf91: 0x6c1c8e20, 0xbf93: 0x6c101820, - 0xbf96: 0x6c1c9020, 0xbf97: 0x6c1c9220, - 0xbf99: 0x6c1c9420, - 0xbf9c: 0x6c1c7620, 0xbf9d: 0x6c1c7420, - 0xbfa1: 0x6c1c9620, 0xbfa2: 0x6c056620, - 0xbfa6: 0x6c126a20, - 0xbfa9: 0x6c07b020, 0xbfaa: 0x6c128a20, 0xbfab: 0x6c0ebc20, - 0xbfac: 0x6c12b220, 0xbfad: 0x6c1c9820, - 0xbfb0: 0x6c0a7020, 0xbfb1: 0x6c010820, 0xbfb3: 0x6c1c9a20, - 0xbfb7: 0x6c1c9c20, - 0xbfb9: 0x6c153420, - 0xbfbc: 0x6c122020, 0xbfbf: 0x6c1ca220, - // Block 0x2ff, offset 0xbfc0 - 0xbfc0: 0x6c017620, 0xbfc1: 0x6c0bd820, 0xbfc2: 0x6c1ca020, 0xbfc3: 0x6c1c9e20, - 0xbfc4: 0x6c056820, 0xbfc5: 0x6c0da020, 0xbfc7: 0x6c1caa20, - 0xbfc8: 0x6c1ca620, 0xbfca: 0x6c1ca420, 0xbfcb: 0x6c161620, - 0xbfcc: 0x6c066a20, - 0xbfd0: 0x6c0a3e20, 0xbfd1: 0x6c1ca820, 0xbfd2: 0x6c0fc420, 0xbfd3: 0x6c09c820, - 0xbfd7: 0x6c106820, - 0xbfd8: 0x6c1cb020, 0xbfd9: 0x6c1cae20, - 0xbfde: 0x6c1cac20, - 0xbfe0: 0x6c1cb220, 0xbfe1: 0x6c066c20, - 0xbfe8: 0x6c1cb420, 0xbfe9: 0x6c131420, 0xbfea: 0x6c0a0220, - 0xbfed: 0x6c1cb620, 0xbfee: 0x6c125220, - 0xbff3: 0x6c106a20, - 0xbff4: 0x6c0ebe20, - 0xbff9: 0x6c0f8c20, - 0xbffc: 0x6c1cb820, 0xbffd: 0x6c03c220, - // Block 0x300, offset 0xc000 - 0xc003: 0x6c0b2c20, - 0xc005: 0x6c127420, - 0xc00c: 0x6c039e20, 0xc00d: 0x6c10f020, - 0xc016: 0x6c1cba20, 0xc017: 0x6c088020, - 0xc018: 0x6c140820, 0xc019: 0x6c140a20, - 0xc01c: 0x6c017820, 0xc01d: 0x6c1cc420, - 0xc020: 0x6c0e8620, - 0xc024: 0x6c1cbe20, - 0xc02b: 0x6c022620, - 0xc030: 0x6c1d2420, 0xc031: 0x6c1cc220, - 0xc035: 0x6c110420, - 0xc038: 0x6c1cc020, 0xc03b: 0x6c1cbc20, - 0xc03d: 0x6c075020, 0xc03f: 0x6c1cc820, - // Block 0x301, offset 0xc040 - 0xc04e: 0x6c1cd420, 0xc04f: 0x6c1ce020, - 0xc050: 0x6c1cd020, 0xc052: 0x6c0fe420, - 0xc055: 0x6c1cda20, 0xc056: 0x6c12d620, - 0xc059: 0x6c1cce20, 0xc05b: 0x6c1cd820, - 0xc05c: 0x6c169620, 0xc05d: 0x6c088220, - 0xc060: 0x6c0da220, 0xc061: 0x6c1cca20, - 0xc065: 0x6c042820, 0xc066: 0x6c1cde20, 0xc067: 0x6c0bda20, - 0xc068: 0x6c014620, 0xc069: 0x6c1cd220, 0xc06a: 0x6c022820, 0xc06b: 0x6c1cdc20, - 0xc06f: 0x6c048a20, - 0xc071: 0x6c1cd620, - 0xc07a: 0x6c1ce220, - // Block 0x302, offset 0xc080 - 0xc081: 0x6c1ce620, 0xc082: 0x6c1cfa20, 0xc083: 0x6c1cf620, - 0xc086: 0x6c1cf020, - 0xc08a: 0x6c1cee20, 0xc08b: 0x6c16b820, - 0xc08d: 0x6c1cf220, - 0xc090: 0x6c048c20, 0xc092: 0x6c06be20, - 0xc095: 0x6c0a4020, - 0xc099: 0x6c1d0020, 0xc09a: 0x6c1ce420, - 0xc09f: 0x6c1cec20, - 0xc0a0: 0x6c1ccc20, 0xc0a2: 0x6c022c20, 0xc0a3: 0x6c1cf420, - 0xc0a4: 0x6c1cf820, 0xc0a5: 0x6c0e5620, - 0xc0a8: 0x6c076820, 0xc0a9: 0x6c01a820, 0xc0aa: 0x6c1ce820, 0xc0ab: 0x6c1cfe20, - 0xc0ac: 0x6c1cfc20, 0xc0ad: 0x6c048e20, 0xc0af: 0x6c0d4a20, - 0xc0b0: 0x6c02c020, - 0xc0b5: 0x6c056a20, 0xc0b7: 0x6c1cea20, - // Block 0x303, offset 0xc0c0 - 0xc0c1: 0x6c1d0220, 0xc0c3: 0x6c1d0820, - 0xc0c4: 0x6c1d0c20, - 0xc0c9: 0x6c090a20, 0xc0cb: 0x6c1d1820, - 0xc0cc: 0x6c0f5020, 0xc0cd: 0x6c1d0420, - 0xc0d2: 0x6c1d1420, - 0xc0d4: 0x6c022a20, 0xc0d6: 0x6c1d1020, 0xc0d7: 0x6c1d1220, - 0xc0da: 0x6c1d0a20, 0xc0db: 0x6c1d0e20, - 0xc0df: 0x6c066e20, - 0xc0e0: 0x6c156020, 0xc0e3: 0x6c031a20, - 0xc0e6: 0x6c012e20, 0xc0e7: 0x6c1d1620, - 0xc0e9: 0x6c111820, 0xc0ea: 0x6c001a20, - 0xc0f2: 0x6c122220, 0xc0f3: 0x6c1cc620, - 0xc0f4: 0x6c1d2220, 0xc0f5: 0x6c1d2a20, 0xc0f6: 0x6c151a20, - 0xc0f8: 0x6c1d1c20, - 0xc0fc: 0x6c0ffe20, 0xc0fd: 0x6c1d2620, - // Block 0x304, offset 0xc100 - 0xc105: 0x6c0ae820, 0xc106: 0x6c1d2820, 0xc107: 0x6c109620, - 0xc111: 0x6c171220, 0xc113: 0x6c1d2020, - 0xc118: 0x6c1d2c20, 0xc11a: 0x6c075220, - 0xc11c: 0x6c0c1620, 0xc11f: 0x6c006820, - 0xc120: 0x6c1d1e20, 0xc121: 0x6c1d1a20, 0xc123: 0x6c0cf020, - 0xc127: 0x6c1d0620, - 0xc128: 0x6c083c20, - 0xc130: 0x6c0d8420, 0xc131: 0x6c1d4420, 0xc133: 0x6c0cf220, - 0xc134: 0x6c1d3a20, 0xc136: 0x6c1d3420, 0xc137: 0x6c1d3620, - 0xc139: 0x6c095c20, 0xc13a: 0x6c1d3c20, 0xc13b: 0x6c1d4220, - // Block 0x305, offset 0xc140 - 0xc140: 0x6c1d3820, 0xc141: 0x6c099620, 0xc143: 0x6c1d3e20, - 0xc146: 0x6c1d3220, - 0xc148: 0x6c154820, 0xc149: 0x6c154620, - 0xc14d: 0x6c1d4620, 0xc14e: 0x6c1d4820, 0xc14f: 0x6c006a20, - 0xc155: 0x6c1d3020, - 0xc15a: 0x6c050c20, 0xc15b: 0x6c000c20, - 0xc15f: 0x6c031c20, - 0xc161: 0x6c1d4020, - 0xc167: 0x6c1d5020, - 0xc168: 0x6c1d4e20, - 0xc16c: 0x6c1d5820, - 0xc174: 0x6c1d5a20, - 0xc17c: 0x6c1d5620, 0xc17d: 0x6c1d5c20, 0xc17e: 0x6c1d4c20, 0xc17f: 0x6c1d5420, - // Block 0x306, offset 0xc180 - 0xc182: 0x6c1d5e20, - 0xc184: 0x6c1d6020, 0xc187: 0x6c1d4a20, - 0xc188: 0x6c08cc20, 0xc18a: 0x6c1d5220, 0xc18b: 0x6c0da420, - 0xc18c: 0x6c06c020, 0xc18d: 0x6c1d2e20, 0xc18e: 0x6c0b2e20, - 0xc193: 0x6c1d7a20, - 0xc195: 0x6c13aa20, - 0xc198: 0x6c1d6620, 0xc199: 0x6c1d6820, 0xc19a: 0x6c1d6a20, - 0xc19d: 0x6c1d7820, 0xc19f: 0x6c1d7620, - 0xc1a2: 0x6c148e20, 0xc1a3: 0x6c031e20, - 0xc1a5: 0x6c1d7220, 0xc1a7: 0x6c056e20, - 0xc1a8: 0x6c025c20, 0xc1ab: 0x6c1d6c20, - 0xc1ae: 0x6c163820, 0xc1af: 0x6c1d7020, - 0xc1b0: 0x6c006c20, 0xc1b1: 0x6c1d7420, 0xc1b3: 0x6c1d6220, - 0xc1b4: 0x6c1d6e20, 0xc1b5: 0x6c1d7c20, 0xc1b6: 0x6c056c20, 0xc1b7: 0x6c1d6420, - 0xc1be: 0x6c15c620, - // Block 0x307, offset 0xc1c0 - 0xc1c2: 0x6c156220, - 0xc1c7: 0x6c1d8220, - 0xc1ca: 0x6c1d8a20, - 0xc1ce: 0x6c0d3820, - 0xc1d0: 0x6c16ba20, 0xc1d1: 0x6c1d8c20, - 0xc1d4: 0x6c1d8620, 0xc1d6: 0x6c1d8020, - 0xc1d9: 0x6c1d7e20, 0xc1da: 0x6c1d8820, - 0xc1e4: 0x6c133820, 0xc1e7: 0x6c105020, - 0xc1e9: 0x6c057020, 0xc1eb: 0x6c1d8e20, - 0xc1ec: 0x6c1d8420, 0xc1ee: 0x6c1d9020, - 0xc1f2: 0x6c05da20, - 0xc1f6: 0x6c019a20, - 0xc1fa: 0x6c1da020, - 0xc1fe: 0x6c032020, - // Block 0x308, offset 0xc200 - 0xc203: 0x6c1d9c20, - 0xc206: 0x6c1d9e20, 0xc207: 0x6c076a20, - 0xc208: 0x6c1d9a20, 0xc209: 0x6c1d9620, 0xc20a: 0x6c1d9420, 0xc20b: 0x6c1da220, - 0xc20c: 0x6c1d9220, 0xc20d: 0x6c1da620, - 0xc210: 0x6c022e20, - 0xc223: 0x6c1daa20, - 0xc226: 0x6c1da820, - 0xc232: 0x6c0ec020, - 0xc234: 0x6c1db020, 0xc236: 0x6c1dac20, 0xc237: 0x6c1d9820, - 0xc238: 0x6c05dc20, 0xc23a: 0x6c1dae20, - 0xc23c: 0x6c1db620, 0xc23d: 0x6c1db420, 0xc23e: 0x6c1db820, 0xc23f: 0x6c1db220, - // Block 0x309, offset 0xc240 - 0xc240: 0x6c1dba20, - 0xc248: 0x6c1dbc20, 0xc249: 0x6c1dbe20, 0xc24a: 0x6c13ac20, - 0xc24c: 0x6c1dc220, 0xc24d: 0x6c1dc020, 0xc24e: 0x6c09ca20, - 0xc250: 0x6c0bdc20, 0xc251: 0x6c020420, 0xc252: 0x6c023020, - 0xc254: 0x6c1dc420, 0xc256: 0x6c003e20, - 0xc25a: 0x6c0c1820, 0xc25b: 0x6c1dc620, - 0xc25d: 0x6c2c0020, 0xc25e: 0x6c1dc820, 0xc25f: 0x6c05a620, - 0xc261: 0x6c1dca20, - 0xc266: 0x6c0c5e20, - 0xc26a: 0x6c1dcc20, - 0xc26e: 0x6c1dce20, 0xc26f: 0x6c03e020, - 0xc270: 0x6c1dd020, 0xc272: 0x6c1dd220, 0xc273: 0x6c1dd420, - 0xc274: 0x6c0da620, - 0xc278: 0x6c063a20, 0xc27b: 0x6c151220, - 0xc27f: 0x6c140c20, - // Block 0x30a, offset 0xc280 - 0xc280: 0x6c0a2020, 0xc281: 0x6c1dd620, - 0xc287: 0x6c0c6020, - 0xc288: 0x6c2d6c20, 0xc289: 0x6c122420, 0xc28b: 0x6c096420, - 0xc28d: 0x6c07b220, 0xc28e: 0x6c1dd820, - 0xc293: 0x6c0d8620, - 0xc295: 0x6c132620, - 0xc298: 0x6c0dda20, 0xc29b: 0x6c1dde20, - 0xc29e: 0x6c1dda20, - 0xc2a0: 0x6c1de020, 0xc2a3: 0x6c1ddc20, - 0xc2a8: 0x6c1de220, - 0xc2ae: 0x6c133a20, - 0xc2b1: 0x6c002e20, - 0xc2b6: 0x6c12d820, - 0xc2b9: 0x6c122620, - 0xc2bc: 0x6c1de420, 0xc2be: 0x6c1dea20, 0xc2bf: 0x6c0a7220, - // Block 0x30b, offset 0xc2c0 - 0xc2c0: 0x6c03e220, 0xc2c2: 0x6c1de620, 0xc2c3: 0x6c1df420, - 0xc2c4: 0x6c0a7420, - 0xc2c9: 0x6c1de820, 0xc2ca: 0x6c112c20, - 0xc2d1: 0x6c15c820, 0xc2d2: 0x6c1dec20, 0xc2d3: 0x6c1dee20, - 0xc2d4: 0x6c1df620, 0xc2d5: 0x6c100020, 0xc2d6: 0x6c1df020, 0xc2d7: 0x6c06c220, - 0xc2d8: 0x6c0c3c20, 0xc2db: 0x6c1e1220, - 0xc2dc: 0x6c11c820, 0xc2de: 0x6c0ddc20, - 0xc2eb: 0x6c122820, - 0xc2ec: 0x6c1e9c20, - 0xc2f1: 0x6c13cc20, - 0xc2f5: 0x6c0f5220, - 0xc2f9: 0x6c147e20, 0xc2fb: 0x6c1dfc20, - 0xc2fc: 0x6c017a20, 0xc2fd: 0x6c0e8820, - // Block 0x30c, offset 0xc300 - 0xc302: 0x6c1e0e20, - 0xc305: 0x6c0e1c20, 0xc306: 0x6c1e0220, 0xc307: 0x6c1e1020, - 0xc308: 0x6c1e0620, 0xc309: 0x6c1e1420, 0xc30a: 0x6c1e0c20, - 0xc30c: 0x6c1e0a20, 0xc30d: 0x6c118220, 0xc30f: 0x6c1dfe20, - 0xc310: 0x6c023220, 0xc311: 0x6c1dfa20, 0xc312: 0x6c044e20, 0xc313: 0x6c0dde20, - 0xc314: 0x6c1df220, 0xc317: 0x6c1df820, - 0xc318: 0x6c06c420, 0xc319: 0x6c0c3620, 0xc31b: 0x6c0a7620, - 0xc31c: 0x6c1e0820, 0xc31d: 0x6c114820, - 0xc320: 0x6c045020, 0xc321: 0x6c028420, - 0xc32c: 0x6c02c220, 0xc32d: 0x6c0b0620, 0xc32e: 0x6c1e1820, 0xc32f: 0x6c1e2220, - 0xc331: 0x6c1e1a20, 0xc333: 0x6c05de20, - 0xc335: 0x6c1e2420, 0xc336: 0x6c081820, 0xc337: 0x6c072e20, - 0xc33e: 0x6c099820, 0xc33f: 0x6c1e0020, - // Block 0x30d, offset 0xc340 - 0xc341: 0x6c08ce20, 0xc342: 0x6c1e1e20, - 0xc347: 0x6c088420, - 0xc348: 0x6c1e2020, 0xc349: 0x6c004820, - 0xc34c: 0x6c1e1620, - 0xc351: 0x6c0ec220, - 0xc359: 0x6c045220, - 0xc35f: 0x6c049020, - 0xc367: 0x6c1e1c20, - 0xc368: 0x6c000e20, 0xc36b: 0x6c079e20, - 0xc36f: 0x6c0b3020, - 0xc37a: 0x6c0f5420, - 0xc37d: 0x6c120820, 0xc37e: 0x6c1e2820, 0xc37f: 0x6c0cf820, - // Block 0x30e, offset 0xc380 - 0xc389: 0x6c0d4c20, - 0xc38c: 0x6c082a20, 0xc38d: 0x6c1e2a20, 0xc38f: 0x6c1e2e20, - 0xc390: 0x6c1e2620, - 0xc395: 0x6c139a20, 0xc397: 0x6c0eea20, - 0xc39c: 0x6c0cf420, - 0xc3a7: 0x6c13ce20, - 0xc3a8: 0x6c092c20, 0xc3a9: 0x6c1e4620, 0xc3ab: 0x6c1e4420, - 0xc3ae: 0x6c0bb420, - 0xc3b2: 0x6c05e020, - 0xc3b6: 0x6c1e3820, 0xc3b7: 0x6c0a7a20, - 0xc3ba: 0x6c10b820, 0xc3bb: 0x6c110620, - // Block 0x30f, offset 0xc3c0 - 0xc3c0: 0x6c1e3420, 0xc3c3: 0x6c0cf620, - 0xc3c8: 0x6c098020, 0xc3c9: 0x6c1e3e20, - 0xc3cc: 0x6c0a7820, 0xc3ce: 0x6c1e3220, 0xc3cf: 0x6c1e3c20, - 0xc3d2: 0x6c114a20, - 0xc3d6: 0x6c1e3020, - 0xc3d8: 0x6c052620, 0xc3db: 0x6c02ae20, - 0xc3df: 0x6c1e4020, - 0xc3e0: 0x6c161e20, 0xc3e1: 0x6c07b420, 0xc3e2: 0x6c0e1e20, 0xc3e3: 0x6c1e3a20, - 0xc3e5: 0x6c0c3820, 0xc3e7: 0x6c06c620, - 0xc3e8: 0x6c0b8c20, 0xc3e9: 0x6c014820, 0xc3ea: 0x6c0cb420, 0xc3eb: 0x6c1e3620, - 0xc3ec: 0x6c03f620, - 0xc3f2: 0x6c057220, - 0xc3f4: 0x6c0f0e20, 0xc3f5: 0x6c1e4220, - 0xc3fb: 0x6c0cfa20, - 0xc3fe: 0x6c1e4820, - // Block 0x310, offset 0xc400 - 0xc400: 0x6c1e4c20, 0xc403: 0x6c0d6620, - 0xc404: 0x6c1e5820, 0xc406: 0x6c1e4e20, - 0xc409: 0x6c1e5220, - 0xc40f: 0x6c129e20, - 0xc410: 0x6c0f5620, 0xc412: 0x6c1e5420, - 0xc416: 0x6c156420, - 0xc41a: 0x6c159c20, 0xc41b: 0x6c032220, - 0xc421: 0x6c001c20, 0xc423: 0x6c1e5020, - 0xc429: 0x6c1e4a20, - 0xc42e: 0x6c03a020, - 0xc434: 0x6c014a20, 0xc436: 0x6c1e5620, - 0xc43a: 0x6c159e20, - // Block 0x311, offset 0xc440 - 0xc446: 0x6c1e5e20, - 0xc44d: 0x6c0d6e20, 0xc44f: 0x6c1e6c20, - 0xc453: 0x6c1e6020, - 0xc456: 0x6c1e5a20, 0xc457: 0x6c1e6820, - 0xc45c: 0x6c1e2c20, - 0xc466: 0x6c1e6220, - 0xc468: 0x6c1e6a20, - 0xc46c: 0x6c11e420, 0xc46d: 0x6c100220, - 0xc474: 0x6c1e5c20, 0xc476: 0x6c1e6420, - 0xc47a: 0x6c057420, - 0xc47e: 0x6c07fa20, - // Block 0x312, offset 0xc480 - 0xc482: 0x6c0c3a20, - 0xc48e: 0x6c1e7420, - 0xc498: 0x6c0f7820, - 0xc4a7: 0x6c1e6e20, - 0xc4a9: 0x6c145420, - 0xc4af: 0x6c1e7020, - 0xc4b6: 0x6c1e7220, - 0xc4b8: 0x6c14ec20, 0xc4ba: 0x6c0bc420, - // Block 0x313, offset 0xc4c0 - 0xc4c3: 0x6c05a820, - 0xc4c8: 0x6c1e8020, - 0xc4d2: 0x6c083e20, 0xc4d3: 0x6c1e7a20, - 0xc4d5: 0x6c1e7820, - 0xc4da: 0x6c110820, - 0xc4de: 0x6c105220, - 0xc4e4: 0x6c0f8e20, 0xc4e5: 0x6c1e7c20, - 0xc4e9: 0x6c1e7e20, 0xc4eb: 0x6c12fa20, - 0xc4ed: 0x6c112e20, 0xc4ee: 0x6c081a20, - 0xc4f0: 0x6c0c6220, 0xc4f2: 0x6c143420, - 0xc4f9: 0x6c028620, 0xc4fb: 0x6c1e8c20, - 0xc4fc: 0x6c1e8220, - // Block 0x314, offset 0xc500 - 0xc501: 0x6c15a020, 0xc502: 0x6c1e9020, - 0xc505: 0x6c1e8820, 0xc507: 0x6c1e8a20, - 0xc50d: 0x6c0cfc20, - 0xc512: 0x6c1e8620, - 0xc514: 0x6c1e0420, - 0xc518: 0x6c1e8e20, 0xc51a: 0x6c1e8420, - 0xc520: 0x6c1e9820, 0xc521: 0x6c1e9a20, 0xc522: 0x6c0f7a20, 0xc523: 0x6c1e9e20, - 0xc526: 0x6c081c20, 0xc527: 0x6c1e9420, - 0xc52c: 0x6c03e420, 0xc52f: 0x6c1ea020, - 0xc531: 0x6c1e9220, 0xc532: 0x6c1ea820, - 0xc534: 0x6c1ea620, 0xc536: 0x6c1ea420, - 0xc53a: 0x6c1eaa20, - 0xc53d: 0x6c1eae20, 0xc53e: 0x6c0aea20, - // Block 0x315, offset 0xc540 - 0xc540: 0x6c1eac20, - 0xc545: 0x6c1eb420, - 0xc558: 0x6c1eb020, - 0xc55c: 0x6c1eb220, 0xc55d: 0x6c1e6620, - 0xc563: 0x6c1eb820, - 0xc564: 0x6c1eb620, - 0xc56a: 0x6c1e7620, 0xc56b: 0x6c1eba20, - 0xc56c: 0x6c1ea220, 0xc56f: 0x6c088620, - 0xc574: 0x6c1ebc20, 0xc575: 0x6c1ebe20, 0xc576: 0x6c1ec220, 0xc577: 0x6c1ec020, - 0xc578: 0x6c1ec420, 0xc579: 0x6c023420, 0xc57b: 0x6c06c820, - 0xc57e: 0x6c13d020, 0xc57f: 0x6c0bde20, - // Block 0x316, offset 0xc580 - 0xc585: 0x6c063c20, - 0xc588: 0x6c1ec820, - 0xc58d: 0x6c1ece20, 0xc58f: 0x6c12c020, - 0xc591: 0x6c042a20, - 0xc595: 0x6c1ecc20, 0xc596: 0x6c1eca20, 0xc597: 0x6c114c20, - 0xc598: 0x6c1ed020, 0xc599: 0x6c049220, - 0xc59d: 0x6c1ed420, 0xc59e: 0x6c1ed220, - 0xc5a2: 0x6c032420, 0xc5a3: 0x6c084020, - 0xc5a6: 0x6c109820, - 0xc5ac: 0x6c057620, - 0xc5b0: 0x6c0bac20, 0xc5b2: 0x6c1ed620, - 0xc5b4: 0x6c0be020, 0xc5b5: 0x6c0f7c20, 0xc5b7: 0x6c12da20, - 0xc5b8: 0x6c1ed820, - // Block 0x317, offset 0xc5c0 - 0xc5c2: 0x6c1eda20, 0xc5c3: 0x6c1edc20, - 0xc5c7: 0x6c134820, - 0xc5c8: 0x6c1b5020, 0xc5c9: 0x6c0c0c20, - 0xc5cc: 0x6c12b420, 0xc5ce: 0x6c07c820, - 0xc5d0: 0x6c122a20, 0xc5d1: 0x6c11e620, - 0xc5d7: 0x6c0fc620, - 0xc5d9: 0x6c164a20, 0xc5db: 0x6c1ee020, - 0xc5dc: 0x6c093020, 0xc5df: 0x6c1ee220, - 0xc5e1: 0x6c002c20, - 0xc5e4: 0x6c04d020, 0xc5e5: 0x6c0c1a20, 0xc5e7: 0x6c12dc20, - 0xc5eb: 0x6c1ee420, - 0xc5ec: 0x6c085820, 0xc5ed: 0x6c0e4220, 0xc5ef: 0x6c088a20, - 0xc5f0: 0x6c0b3220, - 0xc5f7: 0x6c1ee620, - 0xc5f9: 0x6c13d220, - 0xc5fc: 0x6c016a20, 0xc5fd: 0x6c088c20, - // Block 0x318, offset 0xc600 - 0xc601: 0x6c1eec20, 0xc603: 0x6c1ee820, - 0xc604: 0x6c1eee20, 0xc605: 0x6c163a20, 0xc606: 0x6c1eea20, - 0xc60b: 0x6c0c7620, - 0xc60c: 0x6c1ef020, 0xc60f: 0x6c0d5c20, - 0xc612: 0x6c1ef220, - 0xc617: 0x6c03a420, - 0xc619: 0x6c1ef620, 0xc61b: 0x6c1ef420, - 0xc620: 0x6c1ef820, 0xc621: 0x6c1efa20, 0xc622: 0x6c03a620, - 0xc625: 0x6c10e020, 0xc626: 0x6c0e2020, 0xc627: 0x6c044420, - 0xc628: 0x6c088e20, 0xc629: 0x6c0cfe20, - 0xc62c: 0x6c0a0420, 0xc62d: 0x6c002020, - 0xc631: 0x6c1efc20, - 0xc63a: 0x6c017c20, 0xc63b: 0x6c1f0420, - // Block 0x319, offset 0xc640 - 0xc642: 0x6c06ca20, 0xc643: 0x6c1f0220, - 0xc646: 0x6c076e20, 0xc647: 0x6c0a7c20, - 0xc64a: 0x6c1f0020, - 0xc64c: 0x6c0a7e20, 0xc64e: 0x6c14d020, 0xc64f: 0x6c076c20, - 0xc653: 0x6c006e20, - 0xc654: 0x6c0c1c20, - 0xc65c: 0x6c1f0e20, 0xc65f: 0x6c0be220, - 0xc660: 0x6c010a20, - 0xc665: 0x6c09f620, 0xc667: 0x6c146020, - 0xc668: 0x6c07fc20, - 0xc66d: 0x6c0a8020, 0xc66f: 0x6c0bce20, - 0xc674: 0x6c1f0c20, 0xc675: 0x6c1f0820, 0xc676: 0x6c1f0a20, - 0xc67c: 0x6c0e8a20, 0xc67f: 0x6c1f4a20, - // Block 0x31a, offset 0xc680 - 0xc681: 0x6c1f1620, 0xc682: 0x6c08d020, 0xc683: 0x6c06cc20, - 0xc684: 0x6c1f1220, - 0xc689: 0x6c1f1420, 0xc68b: 0x6c0b3420, - 0xc68f: 0x6c1f1020, - 0xc692: 0x6c083220, - 0xc69d: 0x6c1f1a20, 0xc69e: 0x6c1f1820, 0xc69f: 0x6c1f2220, - 0xc6a2: 0x6c1f2420, - 0xc6a4: 0x6c1f1c20, 0xc6a6: 0x6c023820, 0xc6a7: 0x6c1f1e20, - 0xc6a8: 0x6c1f2020, 0xc6a9: 0x6c120a20, - 0xc6ae: 0x6c12de20, 0xc6af: 0x6c057820, - 0xc6b0: 0x6c1f2620, - 0xc6b4: 0x6c0be420, 0xc6b6: 0x6c0a8220, - 0xc6ba: 0x6c0e5820, - // Block 0x31b, offset 0xc6c0 - 0xc6c1: 0x6c04b620, 0xc6c3: 0x6c1f2820, - 0xc6c4: 0x6c1f3020, 0xc6c7: 0x6c01ce20, - 0xc6c8: 0x6c1f2a20, 0xc6c9: 0x6c1f2e20, - 0xc6ce: 0x6c1f2c20, - 0xc6d1: 0x6c0a2220, - 0xc6d6: 0x6c0e4420, 0xc6d7: 0x6c004a20, - 0xc6d8: 0x6c1f3220, - 0xc6dd: 0x6c1f3420, - 0xc6e2: 0x6c0ec420, - 0xc6e6: 0x6c16aa20, - 0xc6eb: 0x6c085a20, - 0xc6ee: 0x6c13ae20, - 0xc6f4: 0x6c140e20, - 0xc6f8: 0x6c1f4220, 0xc6f9: 0x6c1f3820, - 0xc6fc: 0x6c1f3e20, 0xc6fe: 0x6c1f3c20, - // Block 0x31c, offset 0xc700 - 0xc701: 0x6c1f3620, - 0xc704: 0x6c1f4020, 0xc707: 0x6c10a420, - 0xc709: 0x6c1f3a20, - 0xc716: 0x6c1f4420, - 0xc719: 0x6c0a2420, 0xc71a: 0x6c1f4620, - 0xc71c: 0x6c15a220, 0xc71d: 0x6c119420, - 0xc720: 0x6c1f4820, - 0xc726: 0x6c1f4c20, - 0xc729: 0x6c1f4e20, - 0xc730: 0x6c1f5020, 0xc732: 0x6c04bc20, 0xc733: 0x6c010c20, - 0xc734: 0x6c06ce20, 0xc735: 0x6c1f5220, 0xc737: 0x6c1f5420, - 0xc738: 0x6c0a2e20, 0xc739: 0x6c0d0020, - 0xc73c: 0x6c191220, 0xc73d: 0x6c0cb820, 0xc73e: 0x6c0cb620, 0xc73f: 0x6c0da820, - // Block 0x31d, offset 0xc740 - 0xc740: 0x6c07a620, 0xc743: 0x6c17ce20, - 0xc748: 0x6c05c020, 0xc749: 0x6c156620, 0xc74b: 0x6c13d420, - 0xc74d: 0x6c131820, 0xc74f: 0x6c1f5620, - 0xc754: 0x6c07fe20, 0xc755: 0x6c0eee20, 0xc756: 0x6c1f5820, 0xc757: 0x6c16e220, - 0xc75b: 0x6c141020, - 0xc75d: 0x6c0ec620, 0xc75e: 0x6c1f5a20, 0xc75f: 0x6c03a820, - 0xc766: 0x6c1f5c20, 0xc767: 0x6c1f5e20, - 0xc768: 0x6c150420, 0xc76a: 0x6c149820, 0xc76b: 0x6c148020, - 0xc76c: 0x6c144c20, 0xc76d: 0x6c081e20, 0xc76e: 0x6c1f6220, - 0xc771: 0x6c096620, - 0xc774: 0x6c143620, 0xc776: 0x6c1f6620, 0xc777: 0x6c1f6c20, - 0xc778: 0x6c1f6a20, 0xc77a: 0x6c03a220, - 0xc77d: 0x6c042c20, 0xc77f: 0x6c1f6420, - // Block 0x31e, offset 0xc780 - 0xc781: 0x6c1f6820, - 0xc786: 0x6c1f6e20, - 0xc789: 0x6c0bb620, - 0xc78e: 0x6c160220, 0xc78f: 0x6c005220, - 0xc790: 0x6c07d820, 0xc791: 0x6c0d7020, 0xc793: 0x6c094a20, - 0xc796: 0x6c0aee20, - 0xc799: 0x6c1f7420, - 0xc79c: 0x6c0fc820, 0xc79e: 0x6c1f7020, 0xc79f: 0x6c0d4e20, - 0xc7a0: 0x6c1f7220, 0xc7a1: 0x6c0aec20, 0xc7a2: 0x6c150a20, 0xc7a3: 0x6c1f7620, - 0xc7a4: 0x6c1f7820, 0xc7a5: 0x6c15dc20, - 0xc7aa: 0x6c1f8220, - 0xc7ad: 0x6c06d020, 0xc7af: 0x6c114e20, - 0xc7b0: 0x6c1f7c20, 0xc7b1: 0x6c100420, 0xc7b2: 0x6c1efe20, 0xc7b3: 0x6c1f0620, - 0xc7b5: 0x6c040a20, 0xc7b7: 0x6c113220, - 0xc7bc: 0x6c1f8020, 0xc7be: 0x6c0a8420, 0xc7bf: 0x6c11e820, - // Block 0x31f, offset 0xc7c0 - 0xc7c5: 0x6c1f8c20, 0xc7c7: 0x6c125420, - 0xc7c9: 0x6c1f7a20, 0xc7cb: 0x6c1f8620, - 0xc7cc: 0x6c1f8420, - 0xc7d0: 0x6c0c1e20, - 0xc7d5: 0x6c146e20, 0xc7d7: 0x6c166e20, - 0xc7da: 0x6c146220, - 0xc7dc: 0x6c01d020, 0xc7dd: 0x6c089020, - 0xc7e0: 0x6c171420, 0xc7e1: 0x6c1f8a20, 0xc7e2: 0x6c0bae20, - 0xc7e6: 0x6c1f8820, - 0xc7e9: 0x6c1f7e20, - 0xc7ef: 0x6c063e20, - 0xc7f3: 0x6c1f9620, - 0xc7f4: 0x6c1f9220, 0xc7f6: 0x6c01d220, 0xc7f7: 0x6c1f8e20, - 0xc7f8: 0x6c1f9a20, 0xc7f9: 0x6c1fa620, - // Block 0x320, offset 0xc800 - 0xc801: 0x6c0d8820, - 0xc804: 0x6c135a20, 0xc806: 0x6c1faa20, - 0xc80a: 0x6c126020, - 0xc80e: 0x6c1fa820, 0xc80f: 0x6c118420, - 0xc810: 0x6c141220, 0xc811: 0x6c032620, 0xc813: 0x6c0c6e20, - 0xc814: 0x6c09cc20, - 0xc818: 0x6c0f1620, 0xc81a: 0x6c156820, - 0xc81d: 0x6c1fa020, 0xc81e: 0x6c1f9e20, - 0xc822: 0x6c1fa220, - 0xc824: 0x6c1f9c20, 0xc827: 0x6c1fac20, - 0xc829: 0x6c1f9820, - 0xc82c: 0x6c1f9420, 0xc82e: 0x6c1fa420, 0xc82f: 0x6c1f9020, - 0xc831: 0x6c0e8c20, 0xc833: 0x6c154020, - 0xc834: 0x6c091c20, 0xc835: 0x6c080020, - 0xc83b: 0x6c078c20, - 0xc83e: 0x6c147220, 0xc83f: 0x6c027620, - // Block 0x321, offset 0xc840 - 0xc842: 0x6c0f0c20, 0xc843: 0x6c107c20, - 0xc844: 0x6c010e20, - 0xc853: 0x6c0c6420, - 0xc856: 0x6c0be820, 0xc857: 0x6c053820, - 0xc85e: 0x6c1fb020, - 0xc861: 0x6c06d220, 0xc862: 0x6c02ec20, - 0xc869: 0x6c1fb420, 0xc86a: 0x6c02dc20, 0xc86b: 0x6c1fc020, - 0xc872: 0x6c1fba20, - 0xc874: 0x6c0c6620, - 0xc878: 0x6c028a20, 0xc879: 0x6c077020, - 0xc87c: 0x6c028820, 0xc87d: 0x6c07b620, - // Block 0x322, offset 0xc880 - 0xc880: 0x6c1fb620, 0xc881: 0x6c05ae20, 0xc882: 0x6c057a20, 0xc883: 0x6c100620, - 0xc886: 0x6c1fb220, - 0xc888: 0x6c004c20, - 0xc88d: 0x6c1fb820, 0xc88e: 0x6c1fbc20, - 0xc890: 0x6c04c220, 0xc891: 0x6c053c20, 0xc893: 0x6c032820, - 0xc894: 0x6c040220, - 0xc899: 0x6c1fc220, - 0xc89c: 0x6c080a20, 0xc89d: 0x6c147620, 0xc89f: 0x6c084220, - 0xc8a3: 0x6c1fc420, - 0xc8a7: 0x6c127c20, - 0xc8b4: 0x6c1fdc20, 0xc8b6: 0x6c019e20, 0xc8b7: 0x6c1fc620, - 0xc8be: 0x6c1fe820, 0xc8bf: 0x6c1fc820, - // Block 0x323, offset 0xc8c0 - 0xc8c1: 0x6c164c20, 0xc8c3: 0x6c1fd620, - 0xc8c5: 0x6c116220, - 0xc8cd: 0x6c1fe620, 0xc8cf: 0x6c1fcc20, - 0xc8d3: 0x6c002820, - 0xc8d4: 0x6c1fd020, 0xc8d7: 0x6c06d420, - 0xc8db: 0x6c1fd420, - 0xc8dd: 0x6c1fd220, 0xc8df: 0x6c1fca20, - 0xc8e0: 0x6c1fe020, 0xc8e2: 0x6c0a8620, - 0xc8e6: 0x6c1ab420, 0xc8e7: 0x6c067020, - 0xc8e8: 0x6c160420, - 0xc8ed: 0x6c1fce20, 0xc8ef: 0x6c0f5820, - 0xc8f0: 0x6c023a20, 0xc8f1: 0x6c077220, 0xc8f3: 0x6c1fbe20, - 0xc8f5: 0x6c1fde20, 0xc8f6: 0x6c02b620, - 0xc8f9: 0x6c1fda20, 0xc8fa: 0x6c1fe220, - 0xc8fc: 0x6c100820, - // Block 0x324, offset 0xc900 - 0xc904: 0x6c03ac20, 0xc906: 0x6c201e20, - 0xc909: 0x6c14e220, 0xc90a: 0x6c1fec20, 0xc90b: 0x6c03aa20, - 0xc90d: 0x6c1ffa20, - 0xc912: 0x6c141420, - 0xc914: 0x6c1ffc20, 0xc915: 0x6c200020, 0xc917: 0x6c200820, - 0xc918: 0x6c1ff020, 0xc91a: 0x6c0e0820, - 0xc91f: 0x6c100a20, - 0xc920: 0x6c201020, 0xc921: 0x6c1ff620, 0xc923: 0x6c200a20, - 0xc927: 0x6c1ffe20, - 0xc92e: 0x6c0b3620, 0xc92f: 0x6c201220, - 0xc932: 0x6c0be620, - 0xc939: 0x6c200e20, 0xc93a: 0x6c032a20, - // Block 0x325, offset 0xc940 - 0xc940: 0x6c172420, 0xc941: 0x6c1fea20, - 0xc944: 0x6c200620, 0xc945: 0x6c007020, - 0xc948: 0x6c1fee20, 0xc94b: 0x6c14c420, - 0xc94c: 0x6c1ff820, 0xc94d: 0x6c0b0820, 0xc94e: 0x6c0efe20, 0xc94f: 0x6c1fe420, - 0xc952: 0x6c200420, - 0xc959: 0x6c0bb820, 0xc95a: 0x6c201820, 0xc95b: 0x6c02d620, - 0xc95c: 0x6c05e220, - 0xc961: 0x6c201c20, 0xc962: 0x6c1ff220, 0xc963: 0x6c201a20, - 0xc965: 0x6c200c20, 0xc966: 0x6c1ff420, - 0xc968: 0x6c201420, 0xc96a: 0x6c201620, - 0xc970: 0x6c203820, - 0xc974: 0x6c108420, 0xc976: 0x6c200220, - 0xc979: 0x6c203020, - 0xc97d: 0x6c203420, 0xc97f: 0x6c0f2020, - // Block 0x326, offset 0xc980 - 0xc98a: 0x6c15a420, - 0xc993: 0x6c130820, - 0xc994: 0x6c202a20, 0xc995: 0x6c0d8c20, - 0xc999: 0x6c203620, 0xc99a: 0x6c0cba20, - 0xc99c: 0x6c202420, 0xc99d: 0x6c203e20, 0xc99e: 0x6c203c20, - 0xc9a0: 0x6c10c620, 0xc9a1: 0x6c203a20, 0xc9a2: 0x6c10bc20, - 0xc9aa: 0x6c204220, 0xc9ab: 0x6c202820, - 0xc9ad: 0x6c04b820, 0xc9ae: 0x6c202e20, 0xc9af: 0x6c0a0620, - 0xc9b3: 0x6c116420, - 0xc9b4: 0x6c203220, 0xc9b5: 0x6c04be20, 0xc9b7: 0x6c202220, - 0xc9b8: 0x6c202620, 0xc9b9: 0x6c202020, - 0xc9bc: 0x6c16e420, 0xc9bd: 0x6c02a820, 0xc9be: 0x6c202c20, - // Block 0x327, offset 0xc9c0 - 0xc9c1: 0x6c204020, 0xc9c2: 0x6c025e20, - 0xc9ca: 0x6c07e620, - 0xc9ce: 0x6c013620, - 0xc9d1: 0x6c206220, - 0xc9d4: 0x6c16e620, 0xc9d5: 0x6c206820, - 0xc9db: 0x6c0b3820, - 0xc9dc: 0x6c206620, - 0xc9e0: 0x6c206420, - 0xc9e7: 0x6c205e20, - 0xc9ee: 0x6c204620, - 0xc9f1: 0x6c208020, 0xc9f2: 0x6c204420, - 0xc9f4: 0x6c206a20, - 0xc9fb: 0x6c205a20, - 0xc9fe: 0x6c205020, 0xc9ff: 0x6c204a20, - // Block 0x328, offset 0xca00 - 0xca01: 0x6c204c20, 0xca03: 0x6c205c20, - 0xca07: 0x6c319e20, - 0xca0a: 0x6c205620, 0xca0b: 0x6c06d620, - 0xca0c: 0x6c0f0020, 0xca0d: 0x6c0d0420, 0xca0e: 0x6c205220, - 0xca10: 0x6c204820, 0xca13: 0x6c204e20, - 0xca18: 0x6c15a620, 0xca19: 0x6c146820, - 0xca1d: 0x6c205820, 0xca1e: 0x6c206c20, - 0xca27: 0x6c207c20, - 0xca28: 0x6c206e20, 0xca2b: 0x6c208820, - 0xca2d: 0x6c208420, - 0xca32: 0x6c207a20, - 0xca39: 0x6c207820, 0xca3b: 0x6c0f1020, - 0xca3d: 0x6c0d0620, 0xca3f: 0x6c207420, - // Block 0x329, offset 0xca40 - 0xca42: 0x6c207020, - 0xca45: 0x6c207e20, - 0xca4a: 0x6c208a20, 0xca4b: 0x6c124a20, - 0xca4c: 0x6c209620, - 0xca52: 0x6c208c20, 0xca53: 0x6c209220, - 0xca54: 0x6c208620, 0xca57: 0x6c0e9c20, - 0xca59: 0x6c128c20, 0xca5b: 0x6c207220, - 0xca5e: 0x6c208220, 0xca5f: 0x6c0a8820, - 0xca61: 0x6c14ee20, 0xca62: 0x6c20aa20, 0xca63: 0x6c209020, - 0xca69: 0x6c05e420, 0xca6a: 0x6c017e20, 0xca6b: 0x6c02b220, - 0xca6e: 0x6c206020, - 0xca75: 0x6c0a8a20, 0xca76: 0x6c209a20, - 0xca78: 0x6c20a820, 0xca79: 0x6c098220, 0xca7a: 0x6c02d820, - 0xca7d: 0x6c0e1020, - // Block 0x32a, offset 0xca80 - 0xca84: 0x6c209420, 0xca87: 0x6c209e20, - 0xca88: 0x6c20a620, 0xca8b: 0x6c049420, - 0xca98: 0x6c040420, 0xca99: 0x6c20a220, - 0xca9f: 0x6c03ae20, - 0xcaa1: 0x6c107e20, 0xcaa2: 0x6c20a020, - 0xcaa6: 0x6c20a420, - 0xcab2: 0x6c209820, - 0xcab8: 0x6c209c20, - 0xcabf: 0x6c02b420, - // Block 0x32b, offset 0xcac0 - 0xcac0: 0x6c0e4620, - 0xcac4: 0x6c20b220, - 0xcacd: 0x6c20ae20, 0xcace: 0x6c067220, - 0xcad0: 0x6c20ac20, - 0xcad7: 0x6c20b820, - 0xcadc: 0x6c1fae20, - 0xcae0: 0x6c20b020, 0xcae2: 0x6c20b420, 0xcae3: 0x6c20b620, - 0xcaea: 0x6c20ce20, - 0xcaec: 0x6c20c620, 0xcaee: 0x6c1fd820, - 0xcaf3: 0x6c20c420, - 0xcaf8: 0x6c20c220, 0xcafb: 0x6c20bc20, - // Block 0x32c, offset 0xcb00 - 0xcb01: 0x6c208e20, 0xcb02: 0x6c20c020, 0xcb03: 0x6c20be20, - 0xcb11: 0x6c20ca20, 0xcb13: 0x6c16d020, - 0xcb1a: 0x6c20d020, 0xcb1b: 0x6c051e20, - 0xcb1e: 0x6c20c820, 0xcb1f: 0x6c20cc20, - 0xcb28: 0x6c11ae20, 0xcb2a: 0x6c20d220, - 0xcb3a: 0x6c20da20, 0xcb3b: 0x6c20d420, - // Block 0x32d, offset 0xcb40 - 0xcb44: 0x6c15f220, 0xcb45: 0x6c20d620, - 0xcb4a: 0x6c207620, - 0xcb52: 0x6c20dc20, - 0xcb56: 0x6c20de20, - 0xcb5d: 0x6c00e620, 0xcb5f: 0x6c20e220, - 0xcb60: 0x6c05b220, 0xcb61: 0x6c08d220, 0xcb63: 0x6c04d220, - 0xcb67: 0x6c018020, - 0xcb72: 0x6c15ca20, - 0xcb77: 0x6c20e620, - 0xcb78: 0x6c20e420, 0xcb79: 0x6c20ea20, 0xcb7a: 0x6c03e620, - 0xcb7d: 0x6c04d420, 0xcb7e: 0x6c032c20, - // Block 0x32e, offset 0xcb80 - 0xcb83: 0x6c20f020, - 0xcb87: 0x6c20ee20, - 0xcb89: 0x6c20f220, - 0xcb8c: 0x6c01d420, 0xcb8e: 0x6c0e2220, - 0xcb90: 0x6c20f420, 0xcb93: 0x6c032e20, - 0xcb94: 0x6c20f820, - 0xcb99: 0x6c20f620, 0xcb9b: 0x6c20fa20, - 0xcb9f: 0x6c20fc20, - 0xcba1: 0x6c20fe20, 0xcba2: 0x6c089220, 0xcba3: 0x6c0bea20, - 0xcba4: 0x6c075a20, 0xcba6: 0x6c12fc20, - 0xcba9: 0x6c139c20, 0xcbaa: 0x6c170c20, - 0xcbaf: 0x6c08be20, - 0xcbb3: 0x6c07b820, - 0xcbb4: 0x6c16ac20, - 0xcbb8: 0x6c210020, 0xcbb9: 0x6c210220, 0xcbbb: 0x6c089420, - 0xcbbf: 0x6c210420, - // Block 0x32f, offset 0xcbc0 - 0xcbc0: 0x6c210620, 0xcbc3: 0x6c210a20, - 0xcbc4: 0x6c210820, 0xcbc6: 0x6c144420, - 0xcbc9: 0x6c0a0820, 0xcbca: 0x6c096820, 0xcbcb: 0x6c085c20, - 0xcbcd: 0x6c210c20, - 0xcbd5: 0x6c211020, 0xcbd6: 0x6c0b0a20, - 0xcbd8: 0x6c210e20, - 0xcbde: 0x6c211220, - 0xcbe4: 0x6c211420, - 0xcbea: 0x6c211620, 0xcbeb: 0x6c211820, - 0xcbef: 0x6c211a20, - 0xcbf1: 0x6c211e20, 0xcbf2: 0x6c211c20, 0xcbf3: 0x6c212020, - 0xcbf4: 0x6c018220, 0xcbf5: 0x6c0e4820, 0xcbf7: 0x6c212220, - 0xcbfa: 0x6c082020, 0xcbfb: 0x6c028c20, - 0xcbfc: 0x6c212420, 0xcbff: 0x6c0fb020, - // Block 0x330, offset 0xcc00 - 0xcc00: 0x6c1a7220, - 0xcc05: 0x6c03b220, 0xcc06: 0x6c212620, - 0xcc0b: 0x6c212820, - 0xcc0d: 0x6c13b020, 0xcc0e: 0x6c146420, - 0xcc12: 0x6c107620, 0xcc13: 0x6c212a20, - 0xcc14: 0x6c122c20, - 0xcc18: 0x6c125620, 0xcc1b: 0x6c14f620, - 0xcc1f: 0x6c212c20, - 0xcc2b: 0x6c213020, - 0xcc2c: 0x6c212e20, 0xcc2f: 0x6c213420, - 0xcc33: 0x6c213220, - // Block 0x331, offset 0xcc40 - 0xcc48: 0x6c213820, - 0xcc4f: 0x6c089620, - 0xcc51: 0x6c14b220, 0xcc53: 0x6c213a20, - 0xcc54: 0x6c213c20, 0xcc57: 0x6c03b420, - 0xcc5b: 0x6c213e20, - 0xcc63: 0x6c214220, - 0xcc64: 0x6c214020, - 0xcc74: 0x6c0b8e20, 0xcc77: 0x6c128e20, - 0xcc78: 0x6c011020, - 0xcc7e: 0x6c11ea20, - // Block 0x332, offset 0xcc80 - 0xcc80: 0x6c0f5a20, 0xcc81: 0x6c09ce20, 0xcc82: 0x6c042e20, - 0xcc8e: 0x6c11ec20, - 0xcc90: 0x6c08ec20, - 0xcc95: 0x6c214620, 0xcc97: 0x6c033020, - 0xcc9a: 0x6c016c20, - 0xcc9d: 0x6c10cc20, 0xcc9e: 0x6c214420, 0xcc9f: 0x6c06d820, - 0xcca0: 0x6c0e5a20, 0xcca2: 0x6c214820, - 0xcca8: 0x6c215820, 0xccaa: 0x6c214a20, - 0xccb0: 0x6c0d7a20, 0xccb2: 0x6c043020, 0xccb3: 0x6c215a20, - 0xccba: 0x6c05b420, - 0xccbd: 0x6c03b620, 0xccbe: 0x6c215620, - // Block 0x333, offset 0xccc0 - 0xccc1: 0x6c215220, 0xccc2: 0x6c214c20, 0xccc3: 0x6c15cc20, - 0xccc8: 0x6c0ef020, - 0xcccc: 0x6c109a20, 0xcccd: 0x6c214e20, - 0xccd0: 0x6c215e20, 0xccd2: 0x6c215c20, 0xccd3: 0x6c052a20, - 0xccd6: 0x6c019220, - 0xccd9: 0x6c078e20, 0xccda: 0x6c215020, 0xccdb: 0x6c215420, - 0xcce1: 0x6c144220, 0xcce2: 0x6c0de020, - 0xcceb: 0x6c148220, - 0xccee: 0x6c216e20, - 0xccf1: 0x6c217020, 0xccf3: 0x6c01d620, - 0xccf8: 0x6c132820, 0xccf9: 0x6c154a20, 0xccfa: 0x6c217420, 0xccfb: 0x6c08d620, - 0xccfc: 0x6c0a8c20, 0xccfd: 0x6c216620, 0xccfe: 0x6c217220, 0xccff: 0x6c014c20, - // Block 0x334, offset 0xcd00 - 0xcd01: 0x6c049620, - 0xcd04: 0x6c216020, 0xcd05: 0x6c216a20, - 0xcd09: 0x6c0c6820, 0xcd0a: 0x6c118620, - 0xcd0c: 0x6c122e20, - 0xcd13: 0x6c216420, - 0xcd15: 0x6c13d620, 0xcd17: 0x6c216820, - 0xcd19: 0x6c217a20, 0xcd1b: 0x6c217620, - 0xcd1d: 0x6c216c20, - 0xcd21: 0x6c13d820, 0xcd22: 0x6c113420, 0xcd23: 0x6c043220, - 0xcd25: 0x6c0f7620, - 0xcd28: 0x6c0e8e20, 0xcd2a: 0x6c217c20, - 0xcd2f: 0x6c217820, - 0xcd30: 0x6c0daa20, 0xcd31: 0x6c216220, 0xcd33: 0x6c011220, - // Block 0x335, offset 0xcd40 - 0xcd4b: 0x6c15a820, - 0xcd4c: 0x6c219220, - 0xcd52: 0x6c219020, - 0xcd57: 0x6c0c6c20, - 0xcd59: 0x6c218a20, 0xcd5b: 0x6c15e420, - 0xcd5e: 0x6c105420, 0xcd5f: 0x6c217e20, - 0xcd65: 0x6c0efa20, - 0xcd69: 0x6c011420, 0xcd6a: 0x6c06da20, 0xcd6b: 0x6c218420, - 0xcd72: 0x6c099a20, 0xcd73: 0x6c218e20, - 0xcd75: 0x6c218c20, 0xcd76: 0x6c218220, - 0xcd78: 0x6c218820, 0xcd7b: 0x6c02c420, - 0xcd7d: 0x6c218620, 0xcd7e: 0x6c113620, - // Block 0x336, offset 0xcd80 - 0xcd81: 0x6c162420, - 0xcd84: 0x6c0af020, 0xcd85: 0x6c0c6a20, - 0xcd99: 0x6c219e20, 0xcd9a: 0x6c219a20, - 0xcd9c: 0x6c12b620, - 0xcda3: 0x6c219420, - 0xcda4: 0x6c219820, 0xcda6: 0x6c00f020, - 0xcda9: 0x6c06dc20, 0xcdaa: 0x6c16e820, - 0xcdac: 0x6c026e20, 0xcdae: 0x6c12e020, - 0xcdb4: 0x6c15ce20, 0xcdb7: 0x6c023c20, - 0xcdb8: 0x6c0b3a20, 0xcdb9: 0x6c219c20, - // Block 0x337, offset 0xcdc0 - 0xcdc5: 0x6c21a620, - 0xcdc8: 0x6c0a8e20, - 0xcdcc: 0x6c156c20, 0xcdce: 0x6c21a020, - 0xcdd3: 0x6c219620, - 0xcdd5: 0x6c21a220, - 0xcdd9: 0x6c168420, 0xcddb: 0x6c101220, - 0xcddc: 0x6c106c20, - 0xcdef: 0x6c026020, - 0xcdf2: 0x6c012620, - 0xcdf5: 0x6c21ae20, - 0xcdf8: 0x6c21b420, - 0xcdfc: 0x6c164e20, - // Block 0x338, offset 0xce00 - 0xce00: 0x6c15d420, - 0xce05: 0x6c21c220, 0xce06: 0x6c21b620, 0xce07: 0x6c21b020, - 0xce0b: 0x6c167020, - 0xce0c: 0x6c21bc20, - 0xce11: 0x6c09e020, 0xce12: 0x6c21c020, - 0xce15: 0x6c21ca20, - 0xce18: 0x6c100e20, 0xce19: 0x6c21c620, - 0xce1e: 0x6c21ba20, - 0xce21: 0x6c0e2420, - 0xce24: 0x6c21c820, 0xce26: 0x6c21b220, - 0xce28: 0x6c21be20, 0xce2a: 0x6c21cc20, 0xce2b: 0x6c00b820, - 0xce2c: 0x6c21b820, 0xce2e: 0x6c21ce20, - 0xce31: 0x6c0b3c20, 0xce33: 0x6c0a0a20, - 0xce35: 0x6c132220, 0xce37: 0x6c077420, - 0xce39: 0x6c21a820, 0xce3a: 0x6c21c420, 0xce3b: 0x6c0fa020, - // Block 0x339, offset 0xce40 - 0xce45: 0x6c0bec20, 0xce47: 0x6c02c620, - 0xce48: 0x6c07ba20, 0xce49: 0x6c0a9020, 0xce4a: 0x6c21ac20, 0xce4b: 0x6c09d020, - 0xce53: 0x6c057c20, - 0xce55: 0x6c21aa20, - 0xce59: 0x6c21d620, 0xce5a: 0x6c0a2620, 0xce5b: 0x6c061420, - 0xce5d: 0x6c21f420, 0xce5f: 0x6c21e820, - 0xce60: 0x6c045420, 0xce61: 0x6c0fca20, 0xce63: 0x6c21de20, - 0xce64: 0x6c21f020, 0xce65: 0x6c001e20, 0xce66: 0x6c00e020, - 0xce69: 0x6c01aa20, 0xce6b: 0x6c21e220, - 0xce6c: 0x6c0d5020, 0xce6d: 0x6c21d020, 0xce6e: 0x6c21d420, 0xce6f: 0x6c06de20, - 0xce78: 0x6c21f620, 0xce7a: 0x6c21ec20, - 0xce7e: 0x6c21dc20, - // Block 0x33a, offset 0xce80 - 0xce83: 0x6c21ea20, - 0xce8a: 0x6c14a620, - 0xce8d: 0x6c21e620, 0xce8e: 0x6c21ee20, - 0xce96: 0x6c064020, - 0xce98: 0x6c0a9220, 0xce9b: 0x6c0e2620, - 0xce9f: 0x6c21da20, - 0xcea7: 0x6c156a20, - 0xceab: 0x6c21e020, - 0xceae: 0x6c21d220, 0xceaf: 0x6c101020, - 0xceb2: 0x6c21d820, - 0xceb6: 0x6c21e420, - 0xcebe: 0x6c172620, 0xcebf: 0x6c090c20, - // Block 0x33b, offset 0xcec0 - 0xcec0: 0x6c149020, 0xcec2: 0x6c21f820, - 0xcecc: 0x6c11bc20, 0xcecf: 0x6c221020, - 0xced0: 0x6c061620, - 0xced6: 0x6c0a0c20, - 0xced8: 0x6c21fc20, - 0xcedc: 0x6c162620, 0xcedd: 0x6c06e020, 0xcedf: 0x6c221620, - 0xcee2: 0x6c009c20, - 0xcee5: 0x6c221220, - 0xceea: 0x6c21fa20, - 0xceef: 0x6c220620, - 0xcef2: 0x6c220a20, - 0xcef6: 0x6c15aa20, 0xcef7: 0x6c220020, - 0xcefa: 0x6c0f8820, - 0xcefd: 0x6c220420, - // Block 0x33c, offset 0xcf00 - 0xcf02: 0x6c221420, - 0xcf04: 0x6c220820, 0xcf05: 0x6c14de20, - 0xcf09: 0x6c21fe20, 0xcf0b: 0x6c08d420, - 0xcf0c: 0x6c222e20, - 0xcf11: 0x6c02c820, 0xcf13: 0x6c220220, - 0xcf14: 0x6c220c20, 0xcf15: 0x6c220e20, - 0xcf1d: 0x6c0dd020, 0xcf1e: 0x6c0dac20, - 0xcf2c: 0x6c221e20, 0xcf2f: 0x6c222a20, - 0xcf32: 0x6c222620, - 0xcf34: 0x6c0f7e20, 0xcf37: 0x6c223420, - 0xcf38: 0x6c222020, - 0xcf3e: 0x6c222220, 0xcf3f: 0x6c21f220, - // Block 0x33d, offset 0xcf40 - 0xcf41: 0x6c045e20, 0xcf42: 0x6c129020, - 0xcf46: 0x6c090e20, - 0xcf49: 0x6c074a20, - 0xcf4f: 0x6c16ea20, - 0xcf51: 0x6c221a20, 0xcf53: 0x6c223220, - 0xcf54: 0x6c014e20, 0xcf55: 0x6c0d0820, - 0xcf60: 0x6c119620, 0xcf62: 0x6c033220, 0xcf63: 0x6c16bc20, - 0xcf6b: 0x6c149220, - 0xcf6c: 0x6c0f1420, - 0xcf71: 0x6c222820, 0xcf72: 0x6c222c20, - 0xcf78: 0x6c0ca020, - 0xcf7e: 0x6c223020, 0xcf7f: 0x6c222420, - // Block 0x33e, offset 0xcf80 - 0xcf81: 0x6c221820, - 0xcf85: 0x6c033620, - 0xcf94: 0x6c05b620, - 0xcf98: 0x6c224c20, 0xcf9b: 0x6c224220, - 0xcf9c: 0x6c0c7020, 0xcf9f: 0x6c02ba20, - 0xcfa4: 0x6c0a0e20, 0xcfa6: 0x6c225420, - 0xcfad: 0x6c224620, 0xcfae: 0x6c0ec820, 0xcfaf: 0x6c224020, - 0xcfb0: 0x6c0f2220, - 0xcfb4: 0x6c228620, - 0xcfb8: 0x6c223a20, 0xcfba: 0x6c223820, - 0xcfbc: 0x6c224a20, - // Block 0x33f, offset 0xcfc0 - 0xcfc0: 0x6c223e20, 0xcfc1: 0x6c223c20, 0xcfc2: 0x6c224820, - 0xcfc4: 0x6c0bc220, 0xcfc6: 0x6c223620, - 0xcfce: 0x6c224e20, - 0xcfd1: 0x6c225020, - 0xcfd7: 0x6c033420, - 0xcfe1: 0x6c225a20, 0xcfe3: 0x6c225820, - 0xcfe4: 0x6c225c20, - 0xcfea: 0x6c226220, - 0xcff1: 0x6c0fb220, 0xcff3: 0x6c225620, - 0xcff9: 0x6c225e20, - // Block 0x340, offset 0xd000 - 0xd000: 0x6c05aa20, 0xd001: 0x6c0dea20, 0xd002: 0x6c225220, 0xd003: 0x6c111a20, - 0xd006: 0x6c226020, - 0xd014: 0x6c226a20, 0xd015: 0x6c226620, - 0xd018: 0x6c226c20, 0xd01b: 0x6c227220, - 0xd01f: 0x6c226420, - 0xd020: 0x6c073020, 0xd021: 0x6c10f420, - 0xd024: 0x6c21a420, - 0xd02b: 0x6c15f420, - 0xd02c: 0x6c226820, 0xd02e: 0x6c227020, 0xd02f: 0x6c0de220, - 0xd031: 0x6c226e20, 0xd033: 0x6c224420, - 0xd036: 0x6c2e8020, - 0xd03a: 0x6c227820, - 0xd03e: 0x6c228020, - // Block 0x341, offset 0xd040 - 0xd041: 0x6c227c20, - 0xd049: 0x6c227420, 0xd04b: 0x6c227620, - 0xd04f: 0x6c227e20, - 0xd051: 0x6c227a20, - 0xd055: 0x6c12b820, - 0xd058: 0x6c228a20, 0xd05a: 0x6c228420, 0xd05b: 0x6c228220, - 0xd05d: 0x6c228820, 0xd05e: 0x6c109020, 0xd05f: 0x6c228c20, - 0xd066: 0x6c0e9e20, 0xd067: 0x6c0dd220, - 0xd06c: 0x6c0bca20, - 0xd070: 0x6c228e20, 0xd072: 0x6c229220, - 0xd07e: 0x6c229020, - // Block 0x342, offset 0xd080 - 0xd08c: 0x6c221c20, - 0xd091: 0x6c229420, - 0xd098: 0x6c10b620, - 0xd0a3: 0x6c229620, - 0xd0ab: 0x6c01d820, - 0xd0af: 0x6c101420, - 0xd0b0: 0x6c023e20, - 0xd0b8: 0x6c043420, - 0xd0bc: 0x6c094c20, 0xd0bd: 0x6c07bc20, - // Block 0x343, offset 0xd0c0 - 0xd0c9: 0x6c16d220, 0xd0ca: 0x6c0b9020, - 0xd0ce: 0x6c015020, - 0xd0d2: 0x6c229a20, - 0xd0d9: 0x6c229820, - 0xd0ec: 0x6c22a020, 0xd0ed: 0x6c0e2820, 0xd0ee: 0x6c22a620, 0xd0ef: 0x6c229c20, - 0xd0f3: 0x6c22a420, - 0xd0f8: 0x6c22a220, 0xd0f9: 0x6c0fac20, 0xd0fa: 0x6c007220, - // Block 0x344, offset 0xd100 - 0xd108: 0x6c16b220, 0xd10b: 0x6c22aa20, - 0xd10f: 0x6c00cc20, - 0xd119: 0x6c22ae20, - 0xd11d: 0x6c22ac20, 0xd11f: 0x6c22a820, - 0xd131: 0x6c229e20, - 0xd139: 0x6c13da20, - 0xd13d: 0x6c22b220, - // Block 0x345, offset 0xd140 - 0xd149: 0x6c22b020, - 0xd154: 0x6c015220, - 0xd159: 0x6c22b620, 0xd15a: 0x6c133c20, - 0xd15c: 0x6c22b420, - 0xd161: 0x6c14ba20, - 0xd166: 0x6c0a9620, - 0xd176: 0x6c0ca220, - 0xd17c: 0x6c0a9420, - // Block 0x346, offset 0xd180 - 0xd189: 0x6c16be20, - 0xd18c: 0x6c22c220, 0xd18e: 0x6c0c7220, - 0xd195: 0x6c22ba20, 0xd196: 0x6c22c420, - 0xd199: 0x6c015420, - 0xd1a2: 0x6c22c020, - 0xd1a4: 0x6c116620, 0xd1a5: 0x6c22b820, 0xd1a6: 0x6c22be20, 0xd1a7: 0x6c0a9820, - 0xd1a9: 0x6c120220, - 0xd1ac: 0x6c22c620, 0xd1ae: 0x6c093220, - 0xd1bd: 0x6c0c7420, - // Block 0x347, offset 0xd1c0 - 0xd1c4: 0x6c22cc20, - 0xd1c8: 0x6c22bc20, 0xd1ca: 0x6c053220, - 0xd1cf: 0x6c22c820, - 0xd1d4: 0x6c15ac20, 0xd1d5: 0x6c22ce20, - 0xd1d9: 0x6c31a620, - 0xd1df: 0x6c09ea20, - 0xd1e8: 0x6c22d020, - 0xd1ec: 0x6c22d220, - 0xd1f1: 0x6c110020, - 0xd1f9: 0x6c22d620, - 0xd1fe: 0x6c22d820, - // Block 0x348, offset 0xd200 - 0xd203: 0x6c110a20, - 0xd208: 0x6c101620, 0xd209: 0x6c22dc20, - 0xd20e: 0x6c22e020, - 0xd210: 0x6c167220, 0xd212: 0x6c22da20, - 0xd214: 0x6c22de20, 0xd215: 0x6c015620, 0xd217: 0x6c22d420, - 0xd21f: 0x6c19d420, - 0xd220: 0x6c22e220, - 0xd225: 0x6c0d0a20, 0xd226: 0x6c084420, 0xd227: 0x6c22e620, - 0xd22c: 0x6c22e420, 0xd22d: 0x6c0b0c20, 0xd22e: 0x6c191420, - 0xd235: 0x6c22e820, - 0xd239: 0x6c22ec20, 0xd23b: 0x6c22ca20, - 0xd23c: 0x6c22ea20, 0xd23f: 0x6c22ee20, - // Block 0x349, offset 0xd240 - 0xd246: 0x6c119820, - 0xd24d: 0x6c22f020, - 0xd250: 0x6c22f220, - 0xd25b: 0x6c22f420, - 0xd268: 0x6c22f620, 0xd26a: 0x6c0f2c20, - 0xd26c: 0x6c22fa20, 0xd26d: 0x6c22f820, - 0xd270: 0x6c22fc20, 0xd272: 0x6c22fe20, - 0xd275: 0x6c094e20, 0xd276: 0x6c12e220, - 0xd27a: 0x6c152820, 0xd27b: 0x6c230020, - 0xd27c: 0x6c230220, 0xd27d: 0x6c0ce820, 0xd27e: 0x6c08d820, 0xd27f: 0x6c230420, - // Block 0x34a, offset 0xd280 - 0xd280: 0x6c230620, - 0xd286: 0x6c230820, 0xd287: 0x6c137c20, - 0xd288: 0x6c11ee20, 0xd28b: 0x6c230a20, - 0xd28c: 0x6c115220, - 0xd292: 0x6c0eca20, - 0xd298: 0x6c230c20, 0xd299: 0x6c020620, 0xd29b: 0x6c044620, - 0xd29d: 0x6c14dc20, 0xd29f: 0x6c14bc20, - 0xd2a1: 0x6c01a020, 0xd2a2: 0x6c16ec20, - 0xd2a7: 0x6c143820, - 0xd2a9: 0x6c132c20, - 0xd2b2: 0x6c0bee20, - 0xd2b4: 0x6c230e20, - 0xd2b9: 0x6c106e20, - 0xd2bd: 0x6c05e620, 0xd2be: 0x6c231020, - // Block 0x34b, offset 0xd2c0 - 0xd2c0: 0x6c07c020, 0xd2c1: 0x6c231420, 0xd2c2: 0x6c231220, - 0xd2c7: 0x6c231620, - 0xd2d2: 0x6c231820, - 0xd2d6: 0x6c231a20, - 0xd2e0: 0x6c03e820, 0xd2e2: 0x6c231c20, - 0xd2e7: 0x6c231e20, - 0xd2ec: 0x6c05e820, 0xd2ef: 0x6c11f020, - 0xd2f2: 0x6c232220, - 0xd2f6: 0x6c0af220, - 0xd2f9: 0x6c232020, - // Block 0x34c, offset 0xd300 - 0xd302: 0x6c049820, 0xd303: 0x6c232420, - 0xd304: 0x6c232820, 0xd306: 0x6c232620, - 0xd30e: 0x6c232a20, - 0xd310: 0x6c064220, 0xd312: 0x6c232c20, - 0xd317: 0x6c04fa20, - 0xd319: 0x6c0cbc20, 0xd31b: 0x6c075620, - 0xd320: 0x6c233020, 0xd321: 0x6c233220, 0xd322: 0x6c232e20, - 0xd329: 0x6c096a20, - 0xd32c: 0x6c107820, 0xd32d: 0x6c049a20, - 0xd337: 0x6c233620, - 0xd338: 0x6c0e0c20, 0xd339: 0x6c233420, - 0xd33c: 0x6c16ee20, 0xd33d: 0x6c116820, - // Block 0x34d, offset 0xd340 - 0xd34a: 0x6c233c20, - 0xd356: 0x6c234020, 0xd357: 0x6c233a20, - 0xd35b: 0x6c14f820, - 0xd35c: 0x6c233e20, 0xd35d: 0x6c234220, 0xd35f: 0x6c165020, - 0xd365: 0x6c234a20, - 0xd369: 0x6c234820, 0xd36a: 0x6c0ea020, 0xd36b: 0x6c10fe20, - 0xd36e: 0x6c05ea20, 0xd36f: 0x6c234620, - 0xd374: 0x6c234420, 0xd376: 0x6c156e20, 0xd377: 0x6c157020, - 0xd37e: 0x6c234c20, 0xd37f: 0x6c015820, - // Block 0x34e, offset 0xd380 - 0xd384: 0x6c074820, 0xd385: 0x6c089820, - 0xd38e: 0x6c234e20, 0xd38f: 0x6c235020, - 0xd397: 0x6c235420, - 0xd3a3: 0x6c09d220, - 0xd3a8: 0x6c235820, 0xd3aa: 0x6c235620, - 0xd3b0: 0x6c235a20, 0xd3b2: 0x6c028e20, - 0xd3b5: 0x6c235e20, - 0xd3b8: 0x6c235c20, 0xd3ba: 0x6c236220, 0xd3bb: 0x6c236020, - // Block 0x34f, offset 0xd3c0 - 0xd3c4: 0x6c061820, 0xd3c7: 0x6c161820, - 0xd3c9: 0x6c04c020, 0xd3cb: 0x6c018420, - 0xd3d6: 0x6c04fc20, - 0xd3e9: 0x6c037220, - 0xd3f2: 0x6c169820, 0xd3f3: 0x6c236620, - 0xd3fb: 0x6c236a20, - // Block 0x350, offset 0xd400 - 0xd400: 0x6c236c20, 0xd402: 0x6c01da20, - 0xd408: 0x6c236420, 0xd40a: 0x6c084620, - 0xd40d: 0x6c0ef220, 0xd40e: 0x6c236820, - 0xd41e: 0x6c237220, - 0xd420: 0x6c096c20, - 0xd425: 0x6c236e20, - 0xd42a: 0x6c056020, - 0xd42d: 0x6c11f220, 0xd42e: 0x6c237020, - 0xd431: 0x6c23a620, - 0xd438: 0x6c237c20, - 0xd43e: 0x6c061a20, - // Block 0x351, offset 0xd440 - 0xd443: 0x6c043620, - 0xd445: 0x6c237620, 0xd446: 0x6c160620, - 0xd449: 0x6c162820, - 0xd462: 0x6c0de420, - 0xd465: 0x6c237a20, - 0xd472: 0x6c237e20, 0xd473: 0x6c167420, - 0xd474: 0x6c04d620, 0xd475: 0x6c125820, 0xd476: 0x6c113820, - 0xd47a: 0x6c238020, - 0xd47f: 0x6c238420, - // Block 0x352, offset 0xd480 - 0xd481: 0x6c238a20, - 0xd495: 0x6c238220, - 0xd499: 0x6c238820, 0xd49a: 0x6c067420, 0xd49b: 0x6c011620, - 0xd49c: 0x6c238c20, 0xd49e: 0x6c0ba420, 0xd49f: 0x6c238620, - 0xd4a0: 0x6c168020, 0xd4a3: 0x6c239220, - 0xd4a4: 0x6c31a220, - 0xd4a9: 0x6c238e20, 0xd4aa: 0x6c239420, - 0xd4af: 0x6c237820, - 0xd4b0: 0x6c239020, 0xd4b3: 0x6c079020, - 0xd4b6: 0x6c239620, - 0xd4be: 0x6c239820, - // Block 0x353, offset 0xd4c0 - 0xd4c3: 0x6c160820, - 0xd4cb: 0x6c239a20, - 0xd4de: 0x6c239c20, - 0xd4e2: 0x6c237420, - 0xd4e7: 0x6c239e20, - 0xd4f0: 0x6c033820, - 0xd4fd: 0x6c08da20, - // Block 0x354, offset 0xd500 - 0xd50a: 0x6c23a020, - 0xd50f: 0x6c23a220, - 0xd514: 0x6c23a420, - 0xd51c: 0x6c00f220, - 0xd520: 0x6c23a820, 0xd522: 0x6c129220, 0xd523: 0x6c23aa20, - 0xd526: 0x6c02f820, 0xd527: 0x6c23ac20, - 0xd529: 0x6c23ae20, - 0xd52e: 0x6c23b020, - 0xd530: 0x6c23b420, 0xd531: 0x6c23b620, 0xd532: 0x6c23b220, - 0xd536: 0x6c12c220, 0xd537: 0x6c23ba20, - 0xd538: 0x6c23b820, - // Block 0x355, offset 0xd540 - 0xd543: 0x6c23be20, - 0xd544: 0x6c23bc20, 0xd545: 0x6c23c020, - 0xd54c: 0x6c23c220, 0xd54d: 0x6c23c620, 0xd54e: 0x6c23c420, - 0xd551: 0x6c074e20, 0xd553: 0x6c23ca20, - 0xd555: 0x6c23c820, - 0xd558: 0x6c033a20, 0xd55a: 0x6c0b6a20, - 0xd55c: 0x6c0fa420, 0xd55e: 0x6c23cc20, 0xd55f: 0x6c0bf020, - 0xd563: 0x6c084820, - 0xd565: 0x6c016e20, 0xd566: 0x6c23ce20, - 0xd568: 0x6c15ae20, 0xd56b: 0x6c139e20, - 0xd56c: 0x6c23d020, - 0xd570: 0x6c0fb420, 0xd571: 0x6c157220, 0xd572: 0x6c06e220, 0xd573: 0x6c0b3e20, - 0xd577: 0x6c0e4a20, - 0xd578: 0x6c18ca20, 0xd57a: 0x6c0ecc20, 0xd57b: 0x6c020820, - 0xd57c: 0x6c23d220, - // Block 0x356, offset 0xd580 - 0xd584: 0x6c23d420, 0xd586: 0x6c23de20, - 0xd589: 0x6c23da20, 0xd58a: 0x6c23d820, 0xd58b: 0x6c1ec620, - 0xd58c: 0x6c024020, 0xd58d: 0x6c23d620, 0xd58f: 0x6c007420, - 0xd591: 0x6c11b420, - 0xd594: 0x6c11f420, - 0xd599: 0x6c162a20, 0xd59a: 0x6c23e020, 0xd59b: 0x6c23dc20, - 0xd59c: 0x6c0e6c20, 0xd59d: 0x6c0bcc20, - 0xd5a0: 0x6c11b620, 0xd5a2: 0x6c127620, - 0xd5a4: 0x6c23e420, 0xd5a5: 0x6c162020, 0xd5a6: 0x6c057e20, 0xd5a7: 0x6c23e620, - 0xd5a9: 0x6c23e220, 0xd5aa: 0x6c120c20, 0xd5ab: 0x6c23e820, - 0xd5ad: 0x6c23ea20, - 0xd5b0: 0x6c007620, 0xd5b3: 0x6c0af420, - 0xd5b4: 0x6c23f420, 0xd5b6: 0x6c23ee20, 0xd5b7: 0x6c10c220, - 0xd5b8: 0x6c23ec20, - 0xd5bf: 0x6c03b820, - // Block 0x357, offset 0xd5c0 - 0xd5c2: 0x6c23fa20, - 0xd5c6: 0x6c23f020, 0xd5c7: 0x6c23f220, - 0xd5c9: 0x6c23f820, 0xd5ca: 0x6c23f620, 0xd5cb: 0x6c126620, - 0xd5ce: 0x6c0cc020, 0xd5cf: 0x6c0cbe20, - 0xd5d1: 0x6c03ea20, - 0xd5d4: 0x6c23fc20, - 0xd5da: 0x6c23fe20, - 0xd5dd: 0x6c240020, - 0xd5e3: 0x6c240420, - 0xd5e5: 0x6c240220, - 0xd5eb: 0x6c012820, - 0xd5f1: 0x6c241420, 0xd5f2: 0x6c123020, 0xd5f3: 0x6c240820, - 0xd5f5: 0x6c240c20, - 0xd5f8: 0x6c241020, 0xd5f9: 0x6c0b4020, - 0xd5fc: 0x6c241220, 0xd5fd: 0x6c240e20, 0xd5fe: 0x6c091020, - // Block 0x358, offset 0xd600 - 0xd602: 0x6c240620, 0xd603: 0x6c240a20, - 0xd605: 0x6c12a020, 0xd607: 0x6c0a9a20, - 0xd60a: 0x6c241820, - 0xd60d: 0x6c241620, - 0xd612: 0x6c241a20, - 0xd614: 0x6c08dc20, 0xd615: 0x6c077620, - 0xd618: 0x6c101a20, 0xd619: 0x6c241c20, 0xd61b: 0x6c0f0620, - 0xd61e: 0x6c242020, - 0xd622: 0x6c160a20, 0xd623: 0x6c241e20, - 0xd629: 0x6c0d0e20, - 0xd630: 0x6c242a20, 0xd632: 0x6c242e20, 0xd633: 0x6c243020, - 0xd634: 0x6c0e5c20, - 0xd63a: 0x6c242c20, - 0xd63c: 0x6c242620, 0xd63e: 0x6c242220, 0xd63f: 0x6c242420, - // Block 0x359, offset 0xd640 - 0xd641: 0x6c242820, - 0xd649: 0x6c243620, 0xd64b: 0x6c243220, - 0xd64d: 0x6c243420, - 0xd65f: 0x6c243820, - 0xd660: 0x6c243c20, 0xd661: 0x6c243e20, 0xd662: 0x6c244020, - 0xd664: 0x6c244220, 0xd667: 0x6c243a20, - 0xd670: 0x6c244620, - 0xd674: 0x6c244420, - 0xd67b: 0x6c244820, - // Block 0x35a, offset 0xd680 - 0xd682: 0x6c165220, - 0xd686: 0x6c244e20, 0xd687: 0x6c244a20, - 0xd688: 0x6c244c20, - 0xd68c: 0x6c037420, - 0xd692: 0x6c154c20, - 0xd696: 0x6c136c20, - 0xd698: 0x6c245220, - 0xd69c: 0x6c245020, - 0xd6a1: 0x6c245420, 0xd6a2: 0x6c245620, - 0xd6a7: 0x6c245e20, - 0xd6a8: 0x6c245820, 0xd6a9: 0x6c245a20, 0xd6aa: 0x6c245c20, - 0xd6ac: 0x6c246020, - 0xd6b0: 0x6c246220, 0xd6b2: 0x6c246420, - 0xd6b6: 0x6c246620, - 0xd6b8: 0x6c246820, 0xd6ba: 0x6c11be20, 0xd6bb: 0x6c0fcc20, - 0xd6bc: 0x6c246a20, 0xd6bd: 0x6c118820, 0xd6be: 0x6c128420, - // Block 0x35b, offset 0xd6c0 - 0xd6c0: 0x6c246c20, 0xd6c3: 0x6c246e20, - 0xd6c4: 0x6c0f8020, 0xd6c6: 0x6c024220, 0xd6c7: 0x6c06e420, - 0xd6c8: 0x6c247020, 0xd6cb: 0x6c247220, - 0xd6ce: 0x6c247420, - 0xd6d0: 0x6c082620, 0xd6d3: 0x6c247820, - 0xd6d6: 0x6c247620, - 0xd6d9: 0x6c247a20, 0xd6da: 0x6c247c20, - 0xd6ee: 0x6c123220, - 0xd6f0: 0x6c247e20, - 0xd6f4: 0x6c248020, 0xd6f7: 0x6c317020, - 0xd6f8: 0x6c248220, 0xd6f9: 0x6c248420, 0xd6fa: 0x6c248620, - 0xd6ff: 0x6c083020, - // Block 0x35c, offset 0xd700 - 0xd702: 0x6c248820, 0xd703: 0x6c115020, - 0xd706: 0x6c145220, - 0xd708: 0x6c011820, 0xd70a: 0x6c012a20, - 0xd70d: 0x6c248a20, - 0xd712: 0x6c248e20, - 0xd716: 0x6c248c20, 0xd717: 0x6c100c20, - 0xd71b: 0x6c0bf220, - 0xd71c: 0x6c20e820, 0xd71e: 0x6c249020, 0xd71f: 0x6c14d220, - 0xd721: 0x6c249220, 0xd723: 0x6c033c20, - 0xd724: 0x6c120e20, 0xd725: 0x6c249420, 0xd727: 0x6c249620, - 0xd72a: 0x6c249820, - 0xd72e: 0x6c150820, - 0xd732: 0x6c14fa20, - 0xd734: 0x6c0eec20, - 0xd738: 0x6c0d1020, 0xd73b: 0x6c249c20, - 0xd73e: 0x6c0a1020, - // Block 0x35d, offset 0xd740 - 0xd741: 0x6c0a9c20, - 0xd744: 0x6c24a220, 0xd747: 0x6c24a020, - 0xd748: 0x6c249e20, 0xd749: 0x6c125a20, 0xd74b: 0x6c033e20, - 0xd74c: 0x6c05f220, - 0xd75b: 0x6c24ae20, - 0xd75e: 0x6c24a820, 0xd75f: 0x6c0b4220, - 0xd760: 0x6c14b420, - 0xd764: 0x6c24a620, 0xd765: 0x6c24aa20, 0xd766: 0x6c24ac20, - 0xd769: 0x6c24a420, - 0xd777: 0x6c24b020, - 0xd778: 0x6c24b220, 0xd77a: 0x6c0ece20, - 0xd77c: 0x6c037620, - // Block 0x35e, offset 0xd780 - 0xd780: 0x6c0e7e20, - 0xd787: 0x6c24b420, - 0xd79a: 0x6c24b620, 0xd79b: 0x6c24bc20, - 0xd7a1: 0x6c0b9220, 0xd7a3: 0x6c107020, - 0xd7a5: 0x6c24be20, 0xd7a6: 0x6c143a20, - 0xd7a8: 0x6c24b820, 0xd7ab: 0x6c24ba20, - 0xd7b9: 0x6c24c420, - 0xd7be: 0x6c24c220, 0xd7bf: 0x6c24c020, - // Block 0x35f, offset 0xd7c0 - 0xd7cb: 0x6c24c820, - 0xd7ce: 0x6c24c620, - 0xd7d1: 0x6c24ca20, - 0xd7de: 0x6c24ce20, - 0xd7e0: 0x6c24cc20, - 0xd7e5: 0x6c137220, - 0xd7ec: 0x6c09f820, 0xd7ed: 0x6c165420, - 0xd7f0: 0x6c24d020, 0xd7f3: 0x6c105620, - 0xd7f6: 0x6c24d220, - 0xd7f9: 0x6c24d420, 0xd7fb: 0x6c24dc20, - 0xd7fc: 0x6c24d820, 0xd7fd: 0x6c24da20, 0xd7ff: 0x6c24d620, - // Block 0x360, offset 0xd800 - 0xd807: 0x6c24de20, - 0xd80d: 0x6c24e020, - 0xd817: 0x6c24e220, - 0xd81a: 0x6c24e420, 0xd81b: 0x6c14be20, - 0xd81c: 0x6c24e620, - 0xd822: 0x6c153020, 0xd823: 0x6c24e820, - 0xd825: 0x6c0e5020, 0xd827: 0x6c117820, - 0xd829: 0x6c04fe20, - 0xd82d: 0x6c0e2a20, 0xd82e: 0x6c24ea20, 0xd82f: 0x6c049c20, - 0xd833: 0x6c0c2020, - 0xd83c: 0x6c24ec20, - // Block 0x361, offset 0xd840 - 0xd842: 0x6c079220, - 0xd84c: 0x6c24ee20, - 0xd852: 0x6c24f020, - 0xd854: 0x6c05ec20, 0xd855: 0x6c07c220, - 0xd860: 0x6c24f420, - 0xd865: 0x6c0fd820, 0xd866: 0x6c07c420, 0xd867: 0x6c040820, - 0xd872: 0x6c13dc20, - 0xd874: 0x6c113a20, - 0xd87a: 0x6c0fda20, - 0xd87f: 0x6c071420, - // Block 0x362, offset 0xd880 - 0xd885: 0x6c24f820, - 0xd89d: 0x6c0a9e20, - 0xd8ab: 0x6c162c20, - 0xd8ac: 0x6c06e620, 0xd8af: 0x6c05ee20, - 0xd8b2: 0x6c11a620, - 0xd8b4: 0x6c24fc20, - 0xd8bc: 0x6c250020, - // Block 0x363, offset 0xd8c0 - 0xd8c1: 0x6c067620, - 0xd8c6: 0x6c24fe20, 0xd8c7: 0x6c0f5c20, - 0xd8cc: 0x6c250420, 0xd8cd: 0x6c026220, 0xd8ce: 0x6c24fa20, - 0xd8d1: 0x6c123420, 0xd8d3: 0x6c00dc20, - 0xd8d5: 0x6c07f020, 0xd8d7: 0x6c172820, - 0xd8da: 0x6c250220, - 0xd8e3: 0x6c250620, - 0xd8e7: 0x6c136e20, - 0xd8e9: 0x6c0c3220, 0xd8ea: 0x6c250a20, - 0xd8ef: 0x6c250c20, - 0xd8f5: 0x6c250820, - 0xd8fa: 0x6c029020, - 0xd8fc: 0x6c251820, 0xd8fe: 0x6c251620, - // Block 0x364, offset 0xd900 - 0xd901: 0x6c08de20, - 0xd905: 0x6c251a20, 0xd906: 0x6c251020, - 0xd90a: 0x6c251c20, 0xd90b: 0x6c251220, - 0xd910: 0x6c121020, 0xd911: 0x6c250e20, - 0xd914: 0x6c251420, - 0xd91a: 0x6c252220, - 0xd927: 0x6c252020, - 0xd928: 0x6c145620, - 0xd92c: 0x6c251e20, 0xd92f: 0x6c009620, - 0xd934: 0x6c252620, - 0xd93d: 0x6c252420, - // Block 0x365, offset 0xd940 - 0xd941: 0x6c0aa020, - 0xd947: 0x6c252820, - 0xd94e: 0x6c0cc220, - 0xd951: 0x6c252c20, 0xd952: 0x6c252a20, - 0xd959: 0x6c252e20, - 0xd966: 0x6c24f220, - 0xd96a: 0x6c24f620, 0xd96b: 0x6c253220, - 0xd96c: 0x6c253020, - 0xd97a: 0x6c08e020, - 0xd97c: 0x6c169a20, 0xd97e: 0x6c093420, - // Block 0x366, offset 0xd980 - 0xd980: 0x6c253420, 0xd981: 0x6c055220, - 0xd987: 0x6c03ec20, - 0xd988: 0x6c03ba20, 0xd989: 0x6c089a20, - 0xd990: 0x6c157420, 0xd993: 0x6c254020, - 0xd995: 0x6c253e20, 0xd996: 0x6c0cc420, 0xd997: 0x6c253820, - 0xd99a: 0x6c253c20, - 0xd99d: 0x6c09e220, 0xd99e: 0x6c0b4420, 0xd99f: 0x6c253a20, - 0xd9a0: 0x6c253620, 0xd9a2: 0x6c10f820, - 0xd9a5: 0x6c0aa220, - 0xd9a8: 0x6c129420, - 0xd9ad: 0x6c07c620, - 0xd9b7: 0x6c101c20, - 0xd9ba: 0x6c254220, - 0xd9bf: 0x6c254420, - // Block 0x367, offset 0xd9c0 - 0xd9c0: 0x6c257020, 0xd9c1: 0x6c04d820, - 0xd9c4: 0x6c16fe20, 0xd9c5: 0x6c0ca620, - 0xd9ca: 0x6c254620, - 0xd9cd: 0x6c01dc20, 0xd9ce: 0x6c0f5e20, 0xd9cf: 0x6c131a20, - 0xd9dd: 0x6c254820, - 0xd9e6: 0x6c046020, 0xd9e7: 0x6c254a20, - 0xd9ea: 0x6c254e20, - 0xd9ee: 0x6c255020, - 0xd9f0: 0x6c10f620, 0xd9f3: 0x6c255220, - 0xd9f9: 0x6c255420, 0xd9fa: 0x6c255620, - 0xd9fd: 0x6c04da20, 0xd9fe: 0x6c01de20, 0xd9ff: 0x6c107220, - // Block 0x368, offset 0xda00 - 0xda00: 0x6c099c20, 0xda01: 0x6c089c20, - 0xda09: 0x6c255820, 0xda0b: 0x6c099e20, - 0xda11: 0x6c01cc20, 0xda12: 0x6c12a220, - 0xda15: 0x6c255a20, - 0xda18: 0x6c123620, - 0xda1f: 0x6c0cc620, - 0xda21: 0x6c256020, 0xda23: 0x6c256220, - 0xda24: 0x6c117620, 0xda26: 0x6c0b4620, 0xda27: 0x6c255c20, - 0xda29: 0x6c0e7620, - 0xda2c: 0x6c255e20, - 0xda30: 0x6c0aa420, - 0xda3b: 0x6c007820, - // Block 0x369, offset 0xda40 - 0xda40: 0x6c03be20, - 0xda48: 0x6c256420, 0xda4b: 0x6c0f6020, - 0xda4d: 0x6c256620, 0xda4e: 0x6c0c0e20, - 0xda54: 0x6c14aa20, 0xda57: 0x6c126220, - 0xda58: 0x6c256820, 0xda59: 0x6c256a20, 0xda5a: 0x6c0e5e20, - 0xda5c: 0x6c165620, 0xda5f: 0x6c256e20, - 0xda60: 0x6c256c20, - 0xda6e: 0x6c096e20, - 0xda71: 0x6c257220, 0xda72: 0x6c00a020, - 0xda77: 0x6c257820, - 0xda7b: 0x6c257420, - 0xda7c: 0x6c01e020, 0xda7d: 0x6c058020, 0xda7e: 0x6c257620, 0xda7f: 0x6c06e820, - // Block 0x36a, offset 0xda80 - 0xda80: 0x6c074020, 0xda82: 0x6c13a420, 0xda83: 0x6c257a20, - 0xda86: 0x6c143c20, - 0xda89: 0x6c257e20, - 0xda8d: 0x6c0c2220, 0xda8e: 0x6c011a20, 0xda8f: 0x6c01ac20, - 0xda90: 0x6c001820, - 0xda97: 0x6c257c20, - 0xdaa1: 0x6c258020, 0xdaa2: 0x6c258220, 0xdaa3: 0x6c0af620, - 0xdaa9: 0x6c258420, 0xdaab: 0x6c029220, - 0xdab0: 0x6c258820, - 0xdab4: 0x6c05b820, 0xdab6: 0x6c043820, - 0xdab9: 0x6c258a20, 0xdaba: 0x6c051220, - 0xdabd: 0x6c258c20, 0xdabf: 0x6c0c7820, - // Block 0x36b, offset 0xdac0 - 0xdac1: 0x6c108220, 0xdac3: 0x6c0c4020, - 0xdac4: 0x6c080220, - 0xdac8: 0x6c258e20, - 0xdad2: 0x6c0e7820, 0xdad3: 0x6c0d1220, - 0xdad5: 0x6c259220, 0xdad6: 0x6c259620, 0xdad7: 0x6c259020, - 0xdad8: 0x6c259420, - 0xdadf: 0x6c052820, - 0xdae9: 0x6c259820, 0xdaea: 0x6c053020, - 0xdaee: 0x6c043a20, 0xdaef: 0x6c15b020, - 0xdaf0: 0x6c259c20, - 0xdaf6: 0x6c259e20, - 0xdafa: 0x6c00d820, - 0xdaff: 0x6c25a420, - // Block 0x36c, offset 0xdb00 - 0xdb03: 0x6c02e020, - 0xdb04: 0x6c25a220, 0xdb05: 0x6c25a020, 0xdb07: 0x6c25a820, - 0xdb08: 0x6c259a20, 0xdb0a: 0x6c25aa20, 0xdb0b: 0x6c161a20, - 0xdb0d: 0x6c25ac20, 0xdb0f: 0x6c25ae20, - 0xdb12: 0x6c1ac220, 0xdb13: 0x6c25b220, - 0xdb15: 0x6c25b020, - 0xdb19: 0x6c25b420, 0xdb1a: 0x6c25b620, - 0xdb1c: 0x6c163220, 0xdb1d: 0x6c25b820, 0xdb1f: 0x6c2f4820, - 0xdb20: 0x6c0aa620, 0xdb21: 0x6c25ba20, 0xdb22: 0x6c25bc20, 0xdb23: 0x6c09fa20, - 0xdb25: 0x6c105820, 0xdb26: 0x6c25be20, - 0xdb2a: 0x6c0e0420, - 0xdb2d: 0x6c25c020, 0xdb2f: 0x6c0e2c20, - 0xdb30: 0x6c25c220, - 0xdb36: 0x6c047220, - 0xdb38: 0x6c182420, 0xdb39: 0x6c0e6e20, 0xdb3a: 0x6c08f620, - 0xdb3f: 0x6c034020, - // Block 0x36d, offset 0xdb40 - 0xdb42: 0x6c25c420, - 0xdb44: 0x6c25de20, 0xdb46: 0x6c25ca20, - 0xdb48: 0x6c043c20, 0xdb4a: 0x6c25c820, 0xdb4b: 0x6c25e220, - 0xdb4f: 0x6c25c620, - 0xdb51: 0x6c0aa820, - 0xdb58: 0x6c25ce20, 0xdb59: 0x6c25d020, 0xdb5b: 0x6c0f8220, - 0xdb5e: 0x6c25d220, - 0xdb60: 0x6c02b020, - 0xdb65: 0x6c0b7820, 0xdb66: 0x6c12e420, - 0xdb68: 0x6c25d620, - 0xdb6c: 0x6c0dc820, - 0xdb73: 0x6c25cc20, - 0xdb75: 0x6c25d420, 0xdb76: 0x6c25d820, - 0xdb79: 0x6c080e20, - // Block 0x36e, offset 0xdb80 - 0xdb85: 0x6c25e620, 0xdb86: 0x6c127820, - 0xdb88: 0x6c11ac20, 0xdb89: 0x6c101e20, 0xdb8b: 0x6c04dc20, - 0xdb8c: 0x6c25e420, 0xdb8d: 0x6c25e020, 0xdb8f: 0x6c11ca20, - 0xdb90: 0x6c25da20, 0xdb91: 0x6c0e7020, 0xdb92: 0x6c102220, - 0xdb94: 0x6c102020, 0xdb96: 0x6c080420, - 0xdb9d: 0x6c260a20, - 0xdba5: 0x6c25ea20, 0xdba7: 0x6c25ee20, - 0xdbac: 0x6c25f420, 0xdbae: 0x6c25f620, - 0xdbb0: 0x6c25f020, 0xdbb1: 0x6c25f220, - 0xdbb4: 0x6c25ec20, 0xdbb5: 0x6c25e820, - 0xdbba: 0x6c25dc20, - // Block 0x36f, offset 0xdbc0 - 0xdbc6: 0x6c137620, 0xdbc7: 0x6c01e220, - 0xdbcb: 0x6c260420, - 0xdbcd: 0x6c25fe20, 0xdbcf: 0x6c260820, - 0xdbd2: 0x6c260620, - 0xdbd4: 0x6c118a20, 0xdbd5: 0x6c149e20, 0xdbd7: 0x6c084a20, - 0xdbd8: 0x6c25fa20, 0xdbd9: 0x6c260c20, 0xdbda: 0x6c260220, - 0xdbdc: 0x6c260020, 0xdbdd: 0x6c25f820, 0xdbdf: 0x6c25fc20, - 0xdbe1: 0x6c034220, - 0xdbea: 0x6c0e2e20, - 0xdbed: 0x6c0c7a20, - 0xdbf1: 0x6c11a420, - 0xdbf4: 0x6c261620, - 0xdbf8: 0x6c11a820, - // Block 0x370, offset 0xdc00 - 0xdc00: 0x6c0c4220, 0xdc01: 0x6c261020, - 0xdc04: 0x6c11fe20, 0xdc06: 0x6c261820, 0xdc07: 0x6c137e20, - 0xdc09: 0x6c0e6a20, 0xdc0b: 0x6c260e20, - 0xdc0c: 0x6c261220, 0xdc0f: 0x6c261420, - 0xdc1d: 0x6c261a20, - 0xdc20: 0x6c091820, - 0xdc24: 0x6c107420, 0xdc25: 0x6c262420, 0xdc26: 0x6c262220, - 0xdc29: 0x6c261c20, - 0xdc2d: 0x6c16f020, - 0xdc33: 0x6c262e20, - 0xdc36: 0x6c263620, 0xdc37: 0x6c263020, - // Block 0x371, offset 0xdc40 - 0xdc40: 0x6c262820, - 0xdc47: 0x6c262a20, - 0xdc4d: 0x6c263420, - 0xdc51: 0x6c261e20, 0xdc52: 0x6c190c20, 0xdc53: 0x6c262c20, - 0xdc54: 0x6c262020, 0xdc57: 0x6c263220, - 0xdc5f: 0x6c263e20, - 0xdc61: 0x6c034420, 0xdc63: 0x6c263820, - 0xdc67: 0x6c263a20, - 0xdc6a: 0x6c263c20, 0xdc6b: 0x6c264220, - 0xdc77: 0x6c264020, - 0xdc78: 0x6c124c20, - 0xdc7d: 0x6c264420, 0xdc7e: 0x6c16c020, 0xdc7f: 0x6c13b220, - // Block 0x372, offset 0xdc80 - 0xdc80: 0x6c264e20, 0xdc83: 0x6c264820, - 0xdc8c: 0x6c264620, 0xdc8d: 0x6c0c2420, 0xdc8f: 0x6c264c20, - 0xdc90: 0x6c265020, - 0xdc94: 0x6c264a20, 0xdc96: 0x6c265820, - 0xdc98: 0x6c265220, - 0xdc9f: 0x6c265420, - 0xdca0: 0x6c262620, - 0xdca4: 0x6c265620, 0xdca5: 0x6c265a20, - 0xdcac: 0x6c265c20, - 0xdcb3: 0x6c136420, - 0xdcb5: 0x6c265e20, - 0xdcbe: 0x6c151420, - // Block 0x373, offset 0xdcc0 - 0xdcc1: 0x6c04c420, 0xdcc2: 0x6c053620, 0xdcc3: 0x6c266020, - 0xdcc9: 0x6c134020, 0xdccb: 0x6c0b9420, - 0xdccd: 0x6c14b020, - 0xdcd0: 0x6c266220, 0xdcd2: 0x6c162e20, - 0xdcd5: 0x6c118c20, 0xdcd7: 0x6c0cc820, - 0xdcd8: 0x6c110c20, 0xdcdb: 0x6c09e620, - 0xdcdf: 0x6c004020, - 0xdce1: 0x6c266c20, 0xdce2: 0x6c266820, - 0xdce4: 0x6c266420, 0xdce5: 0x6c02f220, 0xdce7: 0x6c0aaa20, - 0xdce8: 0x6c266e20, 0xdceb: 0x6c266a20, - 0xdced: 0x6c266620, 0xdcee: 0x6c267620, - 0xdcf1: 0x6c267420, 0xdcf2: 0x6c267220, 0xdcf3: 0x6c267020, - 0xdcf9: 0x6c267820, - 0xdcfd: 0x6c267a20, 0xdcfe: 0x6c0bf420, - // Block 0x374, offset 0xdd00 - 0xdd00: 0x6c267c20, 0xdd02: 0x6c268020, - 0xdd05: 0x6c267e20, - 0xdd0a: 0x6c064420, - 0xdd0e: 0x6c0cac20, - 0xdd12: 0x6c268420, - 0xdd16: 0x6c102420, - 0xdd18: 0x6c268220, - 0xdd1c: 0x6c268620, 0xdd1e: 0x6c134220, 0xdd1f: 0x6c0d1420, - 0xdd20: 0x6c06ea20, 0xdd22: 0x6c268820, - 0xdd27: 0x6c165820, - 0xdd2f: 0x6c268c20, - 0xdd32: 0x6c268e20, - 0xdd34: 0x6c269020, 0xdd36: 0x6c269220, - 0xdd38: 0x6c089e20, 0xdd3a: 0x6c269420, 0xdd3b: 0x6c058220, - 0xdd3e: 0x6c044020, - // Block 0x375, offset 0xdd40 - 0xdd40: 0x6c03c020, 0xdd42: 0x6c269820, - 0xdd44: 0x6c153620, 0xdd45: 0x6c06ec20, 0xdd46: 0x6c269620, - 0xdd4a: 0x6c269e20, 0xdd4b: 0x6c151c20, - 0xdd4d: 0x6c111c20, - 0xdd50: 0x6c128220, - 0xdd54: 0x6c0a1220, 0xdd55: 0x6c269c20, 0xdd57: 0x6c093620, - 0xdd58: 0x6c06ee20, 0xdd59: 0x6c08a020, 0xdd5a: 0x6c043e20, 0xdd5b: 0x6c134420, - 0xdd5c: 0x6c269a20, - 0xdd60: 0x6c0cca20, 0xdd61: 0x6c141820, 0xdd62: 0x6c080620, - 0xdd6b: 0x6c08a220, - 0xdd6c: 0x6c0f2a20, 0xdd6e: 0x6c26a420, 0xdd6f: 0x6c168620, - 0xdd70: 0x6c07ca20, 0xdd72: 0x6c26a620, 0xdd73: 0x6c0b4820, - 0xdd75: 0x6c26aa20, - 0xdd79: 0x6c0aac20, 0xdd7a: 0x6c077820, - 0xdd7f: 0x6c26a820, - // Block 0x376, offset 0xdd80 - 0xdd82: 0x6c09a020, 0xdd83: 0x6c061c20, - 0xdd84: 0x6c0ccc20, 0xdd85: 0x6c26a020, 0xdd86: 0x6c26ac20, - 0xdd8b: 0x6c26a220, - 0xdd8c: 0x6c058420, 0xdd8e: 0x6c26b220, 0xdd8f: 0x6c26ba20, - 0xdd90: 0x6c05ba20, - 0xdd96: 0x6c26b020, - 0xdd9b: 0x6c26c220, - 0xdd9e: 0x6c06f020, - 0xdda1: 0x6c15e620, 0xdda2: 0x6c003820, 0xdda3: 0x6c26bc20, - 0xdda6: 0x6c044220, - 0xdda8: 0x6c26b620, - 0xddae: 0x6c26b820, - 0xddb1: 0x6c102620, 0xddb2: 0x6c26b420, 0xddb3: 0x6c26ae20, - 0xddb5: 0x6c024420, 0xddb6: 0x6c0c4820, - 0xddb9: 0x6c05f020, - 0xddbd: 0x6c26c620, - // Block 0x377, offset 0xddc0 - 0xddc9: 0x6c26c020, - 0xddcf: 0x6c26c420, - 0xddd3: 0x6c26be20, - 0xddd9: 0x6c058620, 0xddda: 0x6c0d5e20, 0xdddb: 0x6c26c820, - 0xdddc: 0x6c0d1820, 0xdddf: 0x6c26e220, - 0xdde2: 0x6c26da20, 0xdde3: 0x6c26ce20, - 0xddeb: 0x6c26d620, - 0xddec: 0x6c098420, 0xdded: 0x6c007a20, 0xddee: 0x6c26cc20, 0xddef: 0x6c26dc20, - 0xddf0: 0x6c26e420, 0xddf1: 0x6c06f220, 0xddf2: 0x6c14fc20, - 0xddf4: 0x6c0f1c20, 0xddf5: 0x6c26d020, - 0xddf8: 0x6c26e020, 0xddfa: 0x6c26ca20, 0xddfb: 0x6c0e3020, - 0xddfd: 0x6c26d420, 0xddfe: 0x6c003a20, 0xddff: 0x6c14e420, - // Block 0x378, offset 0xde00 - 0xde07: 0x6c26d220, - 0xde0a: 0x6c04de20, 0xde0b: 0x6c123820, - 0xde0f: 0x6c0d1620, - 0xde11: 0x6c166820, 0xde12: 0x6c0a2a20, - 0xde15: 0x6c273220, - 0xde18: 0x6c26e620, 0xde1a: 0x6c0c7c20, - 0xde1c: 0x6c26de20, 0xde1d: 0x6c26e820, 0xde1e: 0x6c26ec20, - 0xde20: 0x6c0f6220, 0xde21: 0x6c26f220, - 0xde24: 0x6c26ea20, - 0xde28: 0x6c138020, 0xde29: 0x6c034620, - 0xde2c: 0x6c14e620, 0xde2f: 0x6c007c20, - 0xde32: 0x6c26f020, - 0xde34: 0x6c16c220, - 0xde3b: 0x6c26ee20, - // Block 0x379, offset 0xde40 - 0xde41: 0x6c015a20, - 0xde44: 0x6c10c020, 0xde45: 0x6c26f420, - 0xde49: 0x6c270220, 0xde4a: 0x6c26f620, 0xde4b: 0x6c270420, - 0xde52: 0x6c26fc20, - 0xde5b: 0x6c119a20, - 0xde5e: 0x6c092420, 0xde5f: 0x6c270020, - 0xde61: 0x6c26fa20, 0xde62: 0x6c270620, 0xde63: 0x6c26f820, - 0xde66: 0x6c09d420, - 0xde6b: 0x6c13de20, - 0xde6e: 0x6c09e420, - 0xde71: 0x6c26fe20, 0xde72: 0x6c271620, - 0xde75: 0x6c270e20, 0xde77: 0x6c271420, - 0xde79: 0x6c271020, 0xde7a: 0x6c271820, 0xde7b: 0x6c270c20, - 0xde7d: 0x6c26d820, 0xde7e: 0x6c0c2620, - // Block 0x37a, offset 0xde80 - 0xde81: 0x6c11f620, 0xde83: 0x6c271220, - 0xde86: 0x6c270820, - 0xde8a: 0x6c0c7e20, 0xde8b: 0x6c058820, - 0xde8d: 0x6c09a220, - 0xde94: 0x6c0b0e20, 0xde95: 0x6c0ca820, 0xde96: 0x6c271e20, - 0xde99: 0x6c272220, 0xde9a: 0x6c272420, - 0xde9d: 0x6c271c20, 0xde9e: 0x6c272020, - 0xdea6: 0x6c270a20, 0xdea7: 0x6c271a20, - 0xdea9: 0x6c272a20, 0xdeaa: 0x6c272820, - 0xdead: 0x6c148820, - 0xdeb0: 0x6c053a20, - 0xdeb9: 0x6c272620, 0xdebb: 0x6c272e20, - 0xdebc: 0x6c272c20, 0xdebd: 0x6c273420, 0xdebf: 0x6c273820, - // Block 0x37b, offset 0xdec0 - 0xdec2: 0x6c084c20, 0xdec3: 0x6c273020, - 0xdec8: 0x6c273a20, 0xdec9: 0x6c273c20, - 0xdecc: 0x6c273e20, 0xdece: 0x6c274a20, 0xdecf: 0x6c0fa220, - 0xded0: 0x6c274220, 0xded2: 0x6c274020, 0xded3: 0x6c274420, - 0xded4: 0x6c274620, 0xded6: 0x6c274820, - 0xdedb: 0x6c274c20, - 0xdedc: 0x6c274e20, - // Block 0x37c, offset 0xdf00 - 0xdf36: 0x6c034820, - 0xdf38: 0x6c275020, 0xdf3a: 0x6c275220, - // Block 0x37d, offset 0xdf40 - 0xdf45: 0x6c275420, - 0xdf4c: 0x6c275620, 0xdf4d: 0x6c275820, 0xdf4e: 0x6c275a20, - 0xdf50: 0x6c275c20, 0xdf51: 0x6c275e20, - 0xdf54: 0x6c276220, 0xdf55: 0x6c276020, - 0xdf58: 0x6c276420, - 0xdf5f: 0x6c276620, - 0xdf60: 0x6c276820, - 0xdf67: 0x6c276e20, - 0xdf68: 0x6c276a20, 0xdf69: 0x6c276c20, 0xdf6a: 0x6c07da20, 0xdf6b: 0x6c058a20, - 0xdf6e: 0x6c0e6020, - 0xdf70: 0x6c11c620, 0xdf72: 0x6c0a2c20, - 0xdf75: 0x6c113e20, 0xdf77: 0x6c123a20, - 0xdf78: 0x6c277020, 0xdf79: 0x6c1da420, - // Block 0x37e, offset 0xdf80 - 0xdf82: 0x6c277220, 0xdf83: 0x6c277620, - 0xdf85: 0x6c15d620, 0xdf86: 0x6c277420, 0xdf87: 0x6c277a20, - 0xdf88: 0x6c277820, 0xdf8a: 0x6c15b220, - 0xdf8c: 0x6c277c20, 0xdf8e: 0x6c125c20, - 0xdf94: 0x6c277e20, - 0xdf9a: 0x6c278420, - 0xdf9d: 0x6c278220, 0xdf9e: 0x6c278020, - 0xdfa3: 0x6c278620, - 0xdfa4: 0x6c054820, - 0xdfa8: 0x6c0c8020, 0xdfa9: 0x6c03ee20, - 0xdfae: 0x6c278e20, 0xdfaf: 0x6c278820, - 0xdfb2: 0x6c278a20, - 0xdfb6: 0x6c279020, - 0xdfb8: 0x6c279220, 0xdfb9: 0x6c278c20, - 0xdfbd: 0x6c00ce20, - // Block 0x37f, offset 0xdfc0 - 0xdfc1: 0x6c018620, - 0xdfc5: 0x6c279620, 0xdfc6: 0x6c279820, - 0xdfca: 0x6c279a20, - 0xdfcc: 0x6c15d020, - 0xdfd2: 0x6c09a420, - 0xdfd4: 0x6c279e20, 0xdfd5: 0x6c279c20, - 0xdfe0: 0x6c0b9620, 0xdfe1: 0x6c27a020, - 0xdfe6: 0x6c27a220, - 0xdfe9: 0x6c27a420, 0xdfeb: 0x6c037a20, - 0xdff0: 0x6c034a20, 0xdff3: 0x6c27a620, - 0xdff9: 0x6c27a820, 0xdffb: 0x6c144e20, - 0xdffc: 0x6c15d220, - // Block 0x380, offset 0xe000 - 0xe000: 0x6c15b420, 0xe001: 0x6c16f220, 0xe003: 0x6c06f620, - 0xe004: 0x6c27ae20, 0xe005: 0x6c093820, 0xe006: 0x6c27ac20, - 0xe00b: 0x6c27b020, - 0xe00c: 0x6c08e220, - 0xe010: 0x6c0d9a20, 0xe012: 0x6c27b220, - 0xe015: 0x6c06f420, 0xe017: 0x6c14fe20, - 0xe018: 0x6c27b420, 0xe019: 0x6c27b620, - 0xe01c: 0x6c27b820, - 0xe021: 0x6c27ba20, - 0xe028: 0x6c27bc20, - 0xe033: 0x6c08e420, - 0xe036: 0x6c152a20, - 0xe03b: 0x6c27c020, - 0xe03d: 0x6c0e3220, 0xe03f: 0x6c27be20, - // Block 0x381, offset 0xe040 - 0xe046: 0x6c27c420, - 0xe04a: 0x6c27c220, - 0xe052: 0x6c27c620, - 0xe056: 0x6c0bf620, - 0xe058: 0x6c27c820, 0xe05a: 0x6c27ca20, - 0xe05e: 0x6c134a20, 0xe05f: 0x6c27cc20, - 0xe061: 0x6c0d1a20, 0xe062: 0x6c27ce20, - 0xe068: 0x6c27d020, - 0xe06f: 0x6c16c420, - 0xe070: 0x6c27d620, 0xe072: 0x6c27d420, 0xe073: 0x6c27d220, - 0xe074: 0x6c0ed020, 0xe076: 0x6c27d820, 0xe077: 0x6c0b1020, - 0xe079: 0x6c27da20, - 0xe07d: 0x6c27dc20, 0xe07e: 0x6c16f420, 0xe07f: 0x6c27de20, - // Block 0x382, offset 0xe080 - 0xe084: 0x6c27e020, 0xe085: 0x6c27e420, 0xe086: 0x6c27e220, 0xe087: 0x6c11aa20, - 0xe089: 0x6c10da20, 0xe08b: 0x6c170020, - 0xe08c: 0x6c11b220, - 0xe093: 0x6c27e820, - 0xe096: 0x6c0aae20, - 0xe098: 0x6c127020, 0xe09a: 0x6c27ea20, 0xe09b: 0x6c27e620, - 0xe09d: 0x6c034c20, - 0xe0a1: 0x6c064820, 0xe0a2: 0x6c08a420, - 0xe0a5: 0x6c123c20, - 0xe0a9: 0x6c05f420, 0xe0aa: 0x6c141a20, - 0xe0ac: 0x6c27f020, 0xe0ad: 0x6c27ec20, 0xe0af: 0x6c06f820, - 0xe0b1: 0x6c06fa20, 0xe0b2: 0x6c009220, - 0xe0b4: 0x6c07e820, - 0xe0ba: 0x6c115620, - // Block 0x383, offset 0xe0c0 - 0xe0c3: 0x6c007e20, - 0xe0c4: 0x6c27fa20, 0xe0c6: 0x6c0e3420, - 0xe0cc: 0x6c115420, 0xe0ce: 0x6c0dae20, - 0xe0d6: 0x6c27fe20, - 0xe0d9: 0x6c27f620, 0xe0da: 0x6c27fc20, 0xe0db: 0x6c27f220, - 0xe0dd: 0x6c27f820, 0xe0de: 0x6c13e020, - 0xe0e1: 0x6c064a20, - 0xe0e4: 0x6c00ba20, 0xe0e5: 0x6c27f420, - 0xe0ef: 0x6c280220, - 0xe0f1: 0x6c280420, - 0xe0f4: 0x6c105a20, - 0xe0f8: 0x6c049e20, - 0xe0fc: 0x6c281a20, 0xe0fd: 0x6c111e20, - // Block 0x384, offset 0xe100 - 0xe102: 0x6c08a620, - 0xe105: 0x6c04a020, 0xe106: 0x6c0c1020, 0xe107: 0x6c171020, - 0xe108: 0x6c14ac20, 0xe109: 0x6c280020, 0xe10a: 0x6c0c2820, - 0xe11a: 0x6c041220, 0xe11b: 0x6c280620, - 0xe123: 0x6c280a20, - 0xe129: 0x6c280820, - 0xe12f: 0x6c280c20, - 0xe131: 0x6c0e0020, 0xe133: 0x6c112020, - 0xe139: 0x6c0ed220, - 0xe13e: 0x6c281420, - // Block 0x385, offset 0xe140 - 0xe146: 0x6c281220, - 0xe14b: 0x6c280e20, - 0xe14e: 0x6c0b6e20, - 0xe150: 0x6c12e620, 0xe151: 0x6c281820, 0xe153: 0x6c281620, - 0xe154: 0x6c06fc20, 0xe155: 0x6c172a20, - 0xe15f: 0x6c283820, - 0xe165: 0x6c282020, 0xe166: 0x6c282220, - 0xe16b: 0x6c097020, - 0xe16e: 0x6c281e20, - 0xe170: 0x6c074c20, 0xe171: 0x6c281c20, - 0xe174: 0x6c282420, - 0xe178: 0x6c0ed420, 0xe179: 0x6c131c20, 0xe17a: 0x6c0c8220, - 0xe17f: 0x6c0db020, - // Block 0x386, offset 0xe180 - 0xe180: 0x6c282c20, 0xe182: 0x6c282e20, 0xe183: 0x6c282620, - 0xe188: 0x6c282820, 0xe18a: 0x6c282a20, - 0xe18f: 0x6c06fe20, - 0xe193: 0x6c283a20, - 0xe195: 0x6c283220, - 0xe19a: 0x6c12e820, - 0xe19c: 0x6c146c20, 0xe19d: 0x6c126c20, - 0xe1a0: 0x6c283020, 0xe1a3: 0x6c283620, - 0xe1a4: 0x6c283420, - 0xe1a8: 0x6c141c20, 0xe1a9: 0x6c283c20, - 0xe1b0: 0x6c283e20, 0xe1b3: 0x6c0caa20, - 0xe1b5: 0x6c284020, - 0xe1b8: 0x6c284420, 0xe1ba: 0x6c284c20, - 0xe1bd: 0x6c284620, 0xe1be: 0x6c284220, 0xe1bf: 0x6c112220, - // Block 0x387, offset 0xe1c0 - 0xe1c0: 0x6c284820, 0xe1c2: 0x6c284a20, - 0xe1c6: 0x6c019c20, - 0xe1c8: 0x6c285820, 0xe1c9: 0x6c284e20, - 0xe1cd: 0x6c285020, - 0xe1d1: 0x6c285220, 0xe1d3: 0x6c0d3a20, - 0xe1d8: 0x6c285620, 0xe1d9: 0x6c285420, 0xe1da: 0x6c285a20, - 0xe1df: 0x6c285c20, - 0xe1e0: 0x6c285e20, 0xe1e3: 0x6c0b4a20, - 0xe1e5: 0x6c020a20, 0xe1e7: 0x6c286020, - 0xe1e8: 0x6c167620, 0xe1ea: 0x6c08e620, - 0xe1ed: 0x6c09a620, - 0xe1f3: 0x6c08a820, - 0xe1f4: 0x6c0e6220, - 0xe1fa: 0x6c286220, 0xe1fb: 0x6c286420, - 0xe1fc: 0x6c00de20, 0xe1fe: 0x6c286620, - // Block 0x388, offset 0xe200 - 0xe201: 0x6c286820, 0xe202: 0x6c286a20, - 0xe205: 0x6c286c20, 0xe207: 0x6c286e20, - 0xe208: 0x6c04a220, 0xe209: 0x6c1e9620, 0xe20a: 0x6c287020, - 0xe20c: 0x6c0c4a20, 0xe20d: 0x6c287220, 0xe20e: 0x6c092620, - 0xe210: 0x6c287420, 0xe212: 0x6c174a20, - 0xe216: 0x6c287620, 0xe217: 0x6c139420, - 0xe218: 0x6c036820, 0xe21b: 0x6c0c8420, - 0xe21c: 0x6c09fc20, 0xe21e: 0x6c12fe20, 0xe21f: 0x6c09a820, - 0xe229: 0x6c287820, 0xe22a: 0x6c070020, 0xe22b: 0x6c287a20, - 0xe22c: 0x6c11f820, 0xe22e: 0x6c289620, - 0xe233: 0x6c287e20, - 0xe235: 0x6c0d8a20, 0xe236: 0x6c118e20, 0xe237: 0x6c061e20, - 0xe238: 0x6c287c20, 0xe239: 0x6c0c8620, - // Block 0x389, offset 0xe240 - 0xe240: 0x6c288020, - 0xe247: 0x6c0f6420, - 0xe258: 0x6c288420, 0xe259: 0x6c288220, 0xe25a: 0x6c288820, - 0xe25d: 0x6c288620, 0xe25f: 0x6c288a20, - 0xe262: 0x6c288e20, - 0xe264: 0x6c288c20, 0xe266: 0x6c034e20, - 0xe268: 0x6c289020, 0xe26a: 0x6c289220, 0xe26b: 0x6c289420, - 0xe26e: 0x6c077a20, 0xe26f: 0x6c165a20, - 0xe271: 0x6c289820, 0xe272: 0x6c0b1220, - 0xe276: 0x6c015c20, 0xe277: 0x6c289a20, - 0xe278: 0x6c289c20, - 0xe27e: 0x6c289e20, - // Block 0x38a, offset 0xe280 - 0xe28b: 0x6c00a420, - 0xe28d: 0x6c28a020, - 0xe292: 0x6c28a220, - 0xe299: 0x6c12ea20, - 0xe29d: 0x6c091e20, 0xe29f: 0x6c28a620, - 0xe2a5: 0x6c024620, 0xe2a6: 0x6c002420, - 0xe2ab: 0x6c28a420, - 0xe2ac: 0x6c28aa20, 0xe2ad: 0x6c114020, 0xe2af: 0x6c0b4c20, - 0xe2b1: 0x6c01e420, 0xe2b3: 0x6c13e220, - 0xe2b8: 0x6c059e20, 0xe2b9: 0x6c04e020, 0xe2bb: 0x6c28a820, - 0xe2bd: 0x6c020c20, - // Block 0x38b, offset 0xe2c0 - 0xe2c5: 0x6c02f620, - 0xe2d1: 0x6c015e20, 0xe2d2: 0x6c28b220, 0xe2d3: 0x6c169c20, - 0xe2d4: 0x6c0db220, 0xe2d7: 0x6c12a420, - 0xe2d9: 0x6c28ca20, 0xe2db: 0x6c01e620, - 0xe2dc: 0x6c28c620, 0xe2de: 0x6c28c220, 0xe2df: 0x6c28b020, - 0xe2e1: 0x6c28ac20, 0xe2e3: 0x6c28ae20, - 0xe2e5: 0x6c095620, 0xe2e6: 0x6c050020, 0xe2e7: 0x6c0ea220, - 0xe2eb: 0x6c108a20, - 0xe2f1: 0x6c011e20, 0xe2f3: 0x6c28b620, - 0xe2f4: 0x6c28b420, - 0xe2f9: 0x6c28c020, 0xe2fa: 0x6c28b820, 0xe2fb: 0x6c28be20, - // Block 0x38c, offset 0xe300 - 0xe302: 0x6c14f020, 0xe303: 0x6c28bc20, - 0xe304: 0x6c01e820, 0xe305: 0x6c02ee20, 0xe306: 0x6c28c420, - 0xe309: 0x6c28c820, - 0xe30e: 0x6c058c20, - 0xe316: 0x6c28d020, 0xe317: 0x6c28e220, - 0xe318: 0x6c28e420, - 0xe31c: 0x6c001620, - 0xe323: 0x6c28f220, - 0xe328: 0x6c00a220, 0xe32b: 0x6c28e020, - 0xe32f: 0x6c28de20, - 0xe331: 0x6c28d420, 0xe332: 0x6c28d220, - 0xe334: 0x6c28ce20, 0xe335: 0x6c28cc20, 0xe336: 0x6c0e7a20, - 0xe338: 0x6c0dee20, 0xe339: 0x6c28d820, - // Block 0x38d, offset 0xe340 - 0xe340: 0x6c28d620, - 0xe345: 0x6c28dc20, - 0xe349: 0x6c0d1c20, 0xe34a: 0x6c058e20, - 0xe34f: 0x6c00fe20, - 0xe350: 0x6c28da20, 0xe352: 0x6c070220, - 0xe358: 0x6c0d1e20, - 0xe373: 0x6c28fe20, - 0xe375: 0x6c290020, 0xe377: 0x6c01ea20, - 0xe37b: 0x6c019420, - 0xe37c: 0x6c28fa20, - // Block 0x38e, offset 0xe380 - 0xe385: 0x6c28e620, 0xe387: 0x6c28f620, - 0xe389: 0x6c290420, 0xe38a: 0x6c28f820, - 0xe38e: 0x6c28f420, - 0xe393: 0x6c28ba20, - 0xe396: 0x6c28f020, - 0xe39a: 0x6c28e820, - 0xe39e: 0x6c035020, 0xe39f: 0x6c28ec20, - 0xe3a0: 0x6c290220, 0xe3a2: 0x6c28ee20, - 0xe3a8: 0x6c290620, 0xe3aa: 0x6c28ea20, 0xe3ab: 0x6c119c20, - 0xe3b1: 0x6c15de20, - 0xe3b5: 0x6c28fc20, - 0xe3bd: 0x6c292820, - // Block 0x38f, offset 0xe3c0 - 0xe3c1: 0x6c291820, - 0xe3c5: 0x6c0bba20, - 0xe3ca: 0x6c03f820, - 0xe3cc: 0x6c04e220, 0xe3ce: 0x6c290e20, - 0xe3d3: 0x6c01ee20, - 0xe3d6: 0x6c0ab020, - 0xe3d8: 0x6c291420, - 0xe3dc: 0x6c07cc20, 0xe3df: 0x6c0fce20, - 0xe3e0: 0x6c291e20, - 0xe3e9: 0x6c13b420, 0xe3eb: 0x6c290c20, - 0xe3ef: 0x6c01ec20, - 0xe3f0: 0x6c064c20, 0xe3f1: 0x6c126e20, 0xe3f2: 0x6c292020, - 0xe3f4: 0x6c290820, 0xe3f7: 0x6c291a20, - 0xe3fb: 0x6c292e20, - 0xe3fd: 0x6c291020, - // Block 0x390, offset 0xe400 - 0xe403: 0x6c291220, - 0xe404: 0x6c105c20, 0xe407: 0x6c291c20, - 0xe40b: 0x6c291620, - 0xe40c: 0x6c13e420, 0xe40d: 0x6c292220, 0xe40e: 0x6c008020, - 0xe413: 0x6c290a20, - 0xe420: 0x6c292620, 0xe422: 0x6c292420, - 0xe429: 0x6c117a20, 0xe42a: 0x6c293220, - 0xe42c: 0x6c294820, - 0xe431: 0x6c02f020, - 0xe435: 0x6c294e20, - 0xe438: 0x6c292a20, - 0xe43c: 0x6c293420, 0xe43d: 0x6c15e820, - // Block 0x391, offset 0xe440 - 0xe446: 0x6c294620, - 0xe449: 0x6c15b620, - 0xe44e: 0x6c161c20, - 0xe457: 0x6c0ea420, - 0xe45b: 0x6c02ca20, - 0xe461: 0x6c130020, 0xe462: 0x6c295220, 0xe463: 0x6c102a20, - 0xe466: 0x6c002220, - 0xe469: 0x6c294420, 0xe46b: 0x6c293c20, - 0xe46c: 0x6c0d2020, 0xe46d: 0x6c293020, 0xe46e: 0x6c294020, 0xe46f: 0x6c294a20, - 0xe471: 0x6c10fc20, - 0xe475: 0x6c001420, 0xe477: 0x6c293a20, - 0xe479: 0x6c294c20, 0xe47a: 0x6c130c20, - // Block 0x392, offset 0xe480 - 0xe482: 0x6c294220, - 0xe484: 0x6c293820, - 0xe48b: 0x6c0ab220, - 0xe490: 0x6c09aa20, - 0xe494: 0x6c08e820, - 0xe499: 0x6c150020, - 0xe49c: 0x6c12aa20, 0xe49f: 0x6c295820, - 0xe4a1: 0x6c296a20, - 0xe4ad: 0x6c293e20, - 0xe4b2: 0x6c02e220, - 0xe4b8: 0x6c0af820, 0xe4b9: 0x6c295420, 0xe4bb: 0x6c295e20, - 0xe4bc: 0x6c0d2220, 0xe4bf: 0x6c295620, - // Block 0x393, offset 0xe4c0 - 0xe4c1: 0x6c296420, - 0xe4c4: 0x6c0e7220, 0xe4c6: 0x6c296620, - 0xe4c9: 0x6c15b820, 0xe4ca: 0x6c295020, 0xe4cb: 0x6c026420, - 0xe4cd: 0x6c295c20, - 0xe4d0: 0x6c296220, 0xe4d1: 0x6c14a820, - 0xe4d6: 0x6c296820, - 0xe4d9: 0x6c295a20, 0xe4da: 0x6c296020, - 0xe4ec: 0x6c13e620, 0xe4ee: 0x6c16c620, - 0xe4f4: 0x6c297020, - 0xe4fc: 0x6c297e20, 0xe4ff: 0x6c296e20, - // Block 0x394, offset 0xe500 - 0xe500: 0x6c091620, - 0xe506: 0x6c292c20, - 0xe511: 0x6c137420, 0xe513: 0x6c149420, - 0xe514: 0x6c297c20, 0xe515: 0x6c297a20, 0xe517: 0x6c297220, - 0xe518: 0x6c297420, 0xe51a: 0x6c00e820, - 0xe51f: 0x6c297820, - 0xe521: 0x6c296c20, - 0xe526: 0x6c0f1a20, - 0xe52c: 0x6c297620, 0xe52d: 0x6c00bc20, - 0xe535: 0x6c0d3c20, - 0xe53d: 0x6c135e20, - // Block 0x395, offset 0xe540 - 0xe540: 0x6c298020, 0xe541: 0x6c298820, 0xe543: 0x6c121220, - 0xe548: 0x6c298620, 0xe549: 0x6c0ab420, 0xe54a: 0x6c092220, 0xe54b: 0x6c298c20, - 0xe54e: 0x6c04a420, - 0xe555: 0x6c298e20, 0xe557: 0x6c130e20, - 0xe558: 0x6c298420, 0xe55a: 0x6c293620, - 0xe563: 0x6c298220, - 0xe568: 0x6c172220, 0xe569: 0x6c102c20, 0xe56a: 0x6c130220, - 0xe56d: 0x6c299c20, - 0xe577: 0x6c29a820, - 0xe57e: 0x6c29aa20, - // Block 0x396, offset 0xe580 - 0xe580: 0x6c299020, - 0xe584: 0x6c119020, 0xe587: 0x6c29a420, - 0xe588: 0x6c299420, 0xe58a: 0x6c299820, - 0xe590: 0x6c29ac20, 0xe591: 0x6c299620, - 0xe594: 0x6c299e20, 0xe597: 0x6c016020, - 0xe599: 0x6c10b220, 0xe59b: 0x6c29a020, - 0xe59c: 0x6c29a620, - 0xe5a4: 0x6c299220, 0xe5a6: 0x6c0c8820, - 0xe5a8: 0x6c299a20, 0xe5a9: 0x6c082220, 0xe5aa: 0x6c0b4e20, 0xe5ab: 0x6c054420, - 0xe5ac: 0x6c153820, 0xe5ae: 0x6c154220, 0xe5af: 0x6c0a3020, - 0xe5b9: 0x6c29b420, 0xe5ba: 0x6c29b020, - // Block 0x397, offset 0xe5c0 - 0xe5c1: 0x6c172020, - 0xe5c9: 0x6c29ae20, - 0xe5cd: 0x6c15f620, 0xe5cf: 0x6c29b220, - 0xe5d0: 0x6c29b620, - 0xe5d5: 0x6c29b820, - 0xe5dc: 0x6c29be20, 0xe5dd: 0x6c29ba20, - 0xe5e4: 0x6c102e20, 0xe5e5: 0x6c29bc20, - 0xe5e9: 0x6c11fa20, 0xe5ea: 0x6c29a220, - 0xe5f7: 0x6c0a3220, - 0xe5f9: 0x6c29c020, 0xe5fa: 0x6c29ca20, 0xe5fb: 0x6c0d2420, - 0xe5fe: 0x6c29c820, - // Block 0x398, offset 0xe600 - 0xe602: 0x6c298a20, - 0xe606: 0x6c29cc20, 0xe607: 0x6c0cce20, - 0xe60a: 0x6c29c220, 0xe60b: 0x6c29c620, - 0xe613: 0x6c29c420, - 0xe616: 0x6c20d820, 0xe617: 0x6c20ba20, - 0xe61a: 0x6c29d020, - 0xe622: 0x6c29ce20, - 0xe62d: 0x6c15f820, 0xe62f: 0x6c249a20, - 0xe630: 0x6c29d220, - 0xe63f: 0x6c29d420, - // Block 0x399, offset 0xe640 - 0xe64d: 0x6c29d620, 0xe64e: 0x6c064e20, - 0xe650: 0x6c041420, - 0xe654: 0x6c29da20, 0xe655: 0x6c186020, - 0xe65a: 0x6c045620, - 0xe65c: 0x6c163c20, 0xe65e: 0x6c050e20, 0xe65f: 0x6c29dc20, - 0xe667: 0x6c29de20, - 0xe66b: 0x6c0e9020, - 0xe671: 0x6c29e020, - 0xe679: 0x6c10dc20, 0xe67b: 0x6c003420, - // Block 0x39a, offset 0xe680 - 0xe68a: 0x6c01fe20, 0xe68b: 0x6c29ea20, - 0xe68c: 0x6c29ec20, - 0xe693: 0x6c29e220, - 0xe695: 0x6c084e20, - 0xe6a3: 0x6c29e420, - 0xe6a4: 0x6c112820, - 0xe6a9: 0x6c29e620, 0xe6aa: 0x6c29e820, 0xe6ab: 0x6c29fc20, - 0xe6af: 0x6c29f020, - 0xe6b0: 0x6c29f620, - 0xe6b6: 0x6c29ee20, - // Block 0x39b, offset 0xe6c0 - 0xe6c4: 0x6c29f220, 0xe6c6: 0x6c29f420, 0xe6c7: 0x6c094020, - 0xe6c9: 0x6c29f820, 0xe6cb: 0x6c0e3620, - 0xe6cd: 0x6c059020, 0xe6ce: 0x6c027820, - 0xe6d4: 0x6c29fe20, - 0xe6d9: 0x6c027220, 0xe6db: 0x6c2a0820, - 0xe6de: 0x6c2a0020, 0xe6df: 0x6c2a0620, - 0xe6e4: 0x6c11d420, - 0xe6e9: 0x6c2a0220, - 0xe6ec: 0x6c2a0420, 0xe6ed: 0x6c12ac20, 0xe6ee: 0x6c121420, 0xe6ef: 0x6c2a0a20, - 0xe6f8: 0x6c0df220, 0xe6f9: 0x6c2a1e20, 0xe6fb: 0x6c2a1620, - 0xe6fe: 0x6c020e20, - // Block 0x39c, offset 0xe700 - 0xe700: 0x6c2a1220, 0xe702: 0x6c13e820, 0xe703: 0x6c2a1420, - 0xe706: 0x6c2a0e20, - 0xe708: 0x6c2a1020, 0xe709: 0x6c2a1a20, 0xe70a: 0x6c2a2020, - 0xe70d: 0x6c2a1c20, - 0xe711: 0x6c2a1820, 0xe712: 0x6c2a0c20, - 0xe718: 0x6c0e6420, 0xe71a: 0x6c2a2e20, - 0xe71c: 0x6c14a420, - 0xe725: 0x6c2a2a20, - 0xe729: 0x6c2a2c20, - 0xe734: 0x6c2a2220, 0xe737: 0x6c2a2620, - 0xe73b: 0x6c2a2820, - 0xe73f: 0x6c2a2420, - // Block 0x39d, offset 0xe740 - 0xe749: 0x6c0c4c20, 0xe74b: 0x6c16f620, - 0xe74c: 0x6c2a3620, 0xe74e: 0x6c2a3820, - 0xe753: 0x6c2a4420, - 0xe755: 0x6c0b1820, 0xe757: 0x6c2a3c20, - 0xe759: 0x6c2a4220, - 0xe75f: 0x6c2a3220, - 0xe760: 0x6c2a3020, 0xe763: 0x6c2a4620, - 0xe766: 0x6c01f020, - 0xe768: 0x6c2a3e20, 0xe76a: 0x6c2a4820, - 0xe76e: 0x6c2a4020, - 0xe774: 0x6c2a3a20, 0xe776: 0x6c0ed620, - 0xe778: 0x6c2a3420, - 0xe77f: 0x6c117420, - // Block 0x39e, offset 0xe780 - 0xe782: 0x6c2a5020, - 0xe78d: 0x6c158220, - 0xe79f: 0x6c2a4e20, - 0xe7a2: 0x6c2a4c20, - 0xe7ab: 0x6c2a5e20, - 0xe7af: 0x6c2a5220, - 0xe7b3: 0x6c2a6220, - 0xe7ba: 0x6c15d820, 0xe7bb: 0x6c2a6820, - 0xe7bd: 0x6c2a5620, - // Block 0x39f, offset 0xe7c0 - 0xe7c0: 0x6c2a5820, - 0xe7c4: 0x6c2a6020, 0xe7c6: 0x6c2a6620, 0xe7c7: 0x6c2a6420, - 0xe7cb: 0x6c2a5420, - 0xe7d0: 0x6c2a5a20, 0xe7d2: 0x6c2a7c20, - 0xe7e0: 0x6c2a6e20, - 0xe7ef: 0x6c2a6a20, - 0xe7f2: 0x6c2a6c20, - 0xe7f6: 0x6c2a7620, 0xe7f7: 0x6c2a7820, - 0xe7f9: 0x6c024820, 0xe7fb: 0x6c03f020, - 0xe7fe: 0x6c2a7420, - // Block 0x3a0, offset 0xe800 - 0xe805: 0x6c2a4a20, - 0xe80d: 0x6c2a7220, 0xe80e: 0x6c2a7a20, 0xe80f: 0x6c2a7020, - 0xe811: 0x6c2a7e20, - 0xe815: 0x6c2a8220, 0xe816: 0x6c2a8020, - 0xe821: 0x6c2a8620, 0xe822: 0x6c2a8420, 0xe823: 0x6c29fa20, - 0xe827: 0x6c2a8e20, - 0xe831: 0x6c2a8820, - 0xe836: 0x6c2a8a20, - 0xe839: 0x6c2a8c20, 0xe83b: 0x6c2a9020, - // Block 0x3a1, offset 0xe840 - 0xe840: 0x6c05bc20, 0xe842: 0x6c2a9420, - 0xe844: 0x6c2a9220, 0xe846: 0x6c09ac20, - 0xe84c: 0x6c070420, 0xe84d: 0x6c218020, - 0xe852: 0x6c2a9620, 0xe853: 0x6c09ee20, - 0xe857: 0x6c026620, - 0xe859: 0x6c2a9820, 0xe85b: 0x6c012020, - 0xe85d: 0x6c0ab620, 0xe85e: 0x6c2a9a20, - 0xe861: 0x6c070620, 0xe862: 0x6c2a9c20, 0xe863: 0x6c008220, - 0xe868: 0x6c129620, 0xe86b: 0x6c2a9e20, - 0xe870: 0x6c0b9820, 0xe872: 0x6c2aac20, - 0xe875: 0x6c2aa620, 0xe877: 0x6c0e9220, - 0xe87d: 0x6c2aa820, 0xe87e: 0x6c2aa220, 0xe87f: 0x6c04e420, - // Block 0x3a2, offset 0xe880 - 0xe881: 0x6c2aa020, 0xe882: 0x6c2aae20, - 0xe888: 0x6c055020, 0xe88b: 0x6c0db420, - 0xe88d: 0x6c2aba20, - 0xe892: 0x6c2ab220, - 0xe896: 0x6c0d6220, 0xe897: 0x6c2ab020, - 0xe899: 0x6c2ab620, - 0xe89e: 0x6c2aa420, - 0xe8a2: 0x6c2ab820, - 0xe8a4: 0x6c2abc20, - 0xe8ab: 0x6c123e20, - 0xe8ae: 0x6c2ab420, - 0xe8b0: 0x6c2abe20, 0xe8b1: 0x6c2ac220, - 0xe8b4: 0x6c064620, 0xe8b5: 0x6c2aaa20, 0xe8b7: 0x6c004220, - 0xe8bf: 0x6c2ac020, - // Block 0x3a3, offset 0xe8c0 - 0xe8c1: 0x6c07ce20, 0xe8c2: 0x6c16b420, 0xe8c3: 0x6c2ac420, - 0xe8c4: 0x6c2ac620, 0xe8c5: 0x6c0d2620, - 0xe8cf: 0x6c160c20, - 0xe8d4: 0x6c2ac820, 0xe8d5: 0x6c157620, - 0xe8d8: 0x6c2aca20, 0xe8d9: 0x6c2acc20, - 0xe8dc: 0x6c13a020, 0xe8dd: 0x6c2ace20, 0xe8df: 0x6c079820, - 0xe8e1: 0x6c160e20, - 0xe8e8: 0x6c2ad820, - 0xe8f2: 0x6c2ada20, 0xe8f3: 0x6c0ab820, - 0xe8f4: 0x6c2ad620, - 0xe8f8: 0x6c15da20, 0xe8f9: 0x6c2ad020, - 0xe8fc: 0x6c2ad420, 0xe8fd: 0x6c0bfa20, 0xe8fe: 0x6c0bc020, - // Block 0x3a4, offset 0xe900 - 0xe902: 0x6c2ad220, - 0xe904: 0x6c2adc20, 0xe907: 0x6c131e20, - 0xe90a: 0x6c2ae020, - 0xe90c: 0x6c2ade20, - 0xe910: 0x6c02cc20, 0xe912: 0x6c13ea20, 0xe913: 0x6c2ae220, - 0xe91d: 0x6c2afa20, 0xe91e: 0x6c2ae620, - 0xe925: 0x6c2ae820, - 0xe92a: 0x6c2aea20, 0xe92b: 0x6c2aec20, - 0xe936: 0x6c2af420, - 0xe938: 0x6c2af620, 0xe93b: 0x6c2af220, - // Block 0x3a5, offset 0xe940 - 0xe941: 0x6c2aee20, 0xe943: 0x6c2ae420, - 0xe944: 0x6c2af020, - 0xe94c: 0x6c2af820, 0xe94d: 0x6c2ed820, - 0xe956: 0x6c018820, - 0xe95e: 0x6c2afe20, 0xe95f: 0x6c04e620, - 0xe960: 0x6c2afc20, - 0xe964: 0x6c2b0220, 0xe966: 0x6c2b0020, - 0xe96a: 0x6c2b0620, - 0xe96d: 0x6c2b0420, 0xe96f: 0x6c2b0820, - 0xe972: 0x6c09ae20, - 0xe974: 0x6c2b0a20, 0xe977: 0x6c2b0c20, - 0xe97e: 0x6c2b0e20, 0xe97f: 0x6c0bfc20, - // Block 0x3a6, offset 0xe980 - 0xe981: 0x6c15ba20, 0xe983: 0x6c2b1020, - 0xe986: 0x6c132020, 0xe987: 0x6c113020, - 0xe988: 0x6c2b1220, 0xe98a: 0x6c2b1420, 0xe98b: 0x6c05f620, - 0xe98f: 0x6c03c420, - 0xe993: 0x6c2b1620, - 0xe996: 0x6c08aa20, 0xe997: 0x6c112620, - 0xe998: 0x6c2b1820, 0xe99a: 0x6c029420, - 0xe9a1: 0x6c2b1a20, - 0xe9a6: 0x6c2b1e20, 0xe9a7: 0x6c15fa20, - 0xe9a9: 0x6c2b1c20, 0xe9aa: 0x6c0b5020, - 0xe9ac: 0x6c2b2020, 0xe9af: 0x6c2b2220, - 0xe9b2: 0x6c2b2420, 0xe9b3: 0x6c035220, - 0xe9ba: 0x6c2b2620, - 0xe9bd: 0x6c2b2820, 0xe9bf: 0x6c2b2a20, - // Block 0x3a7, offset 0xe9c0 - 0xe9c0: 0x6c2b2c20, - 0xe9d2: 0x6c029620, - 0xe9da: 0x6c2b2e20, - 0xe9dc: 0x6c2b3020, 0xe9dd: 0x6c2b3220, - 0xe9e3: 0x6c021c20, - 0xe9e6: 0x6c0b1420, 0xe9e7: 0x6c2b3420, - 0xe9f4: 0x6c2b3620, - 0xe9f8: 0x6c2b3820, - // Block 0x3a8, offset 0xea00 - 0xea00: 0x6c062020, 0xea02: 0x6c0f6620, 0xea03: 0x6c2b3a20, - 0xea08: 0x6c059220, 0xea0a: 0x6c0b7020, - 0xea0c: 0x6c2b4020, 0xea0e: 0x6c103020, - 0xea10: 0x6c2b3e20, 0xea13: 0x6c054620, - 0xea16: 0x6c2b3c20, 0xea17: 0x6c0de620, - 0xea18: 0x6c03c620, 0xea1b: 0x6c2b4220, - 0xea1d: 0x6c2b4420, 0xea1f: 0x6c0aba20, - 0xea23: 0x6c05be20, - 0xea25: 0x6c2b4620, - 0xea2a: 0x6c13ec20, - 0xea2d: 0x6c0c3e20, - 0xea31: 0x6c045820, 0xea33: 0x6c153a20, - 0xea34: 0x6c0cd020, 0xea36: 0x6c2b4820, - 0xea3a: 0x6c0b5220, 0xea3b: 0x6c0e9420, - 0xea3c: 0x6c0abc20, - // Block 0x3a9, offset 0xea40 - 0xea41: 0x6c2b4a20, - 0xea46: 0x6c2b5020, - 0xea48: 0x6c2b5220, - 0xea50: 0x6c079420, 0xea51: 0x6c0d7c20, 0xea52: 0x6c2b4e20, - 0xea54: 0x6c0abe20, 0xea55: 0x6c129820, - 0xea5b: 0x6c2b4c20, - 0xea5e: 0x6c08ac20, - 0xea60: 0x6c012220, 0xea62: 0x6c2b5a20, 0xea63: 0x6c059420, - 0xea66: 0x6c08b020, - 0xea69: 0x6c08ae20, 0xea6b: 0x6c171e20, - 0xea6c: 0x6c2b5820, 0xea6d: 0x6c2b5620, 0xea6e: 0x6c0c8a20, - 0xea70: 0x6c040620, 0xea71: 0x6c170a20, 0xea72: 0x6c026820, 0xea73: 0x6c0ac020, - 0xea7c: 0x6c2b5420, - // Block 0x3aa, offset 0xea80 - 0xea82: 0x6c2b5e20, - 0xea84: 0x6c2b6020, 0xea85: 0x6c2b5c20, 0xea87: 0x6c065020, - 0xea89: 0x6c158c20, - 0xea8c: 0x6c08b220, 0xea8d: 0x6c10f220, - 0xea91: 0x6c2b6620, 0xea93: 0x6c0c0020, - 0xea95: 0x6c0e3820, - 0xea98: 0x6c157820, 0xea9a: 0x6c2b6c20, - 0xea9e: 0x6c067820, - 0xeaa0: 0x6c0bfe20, 0xeaa1: 0x6c2b6420, 0xeaa3: 0x6c2b6e20, - 0xeaa4: 0x6c067a20, 0xeaa5: 0x6c2b6820, 0xeaa6: 0x6c2b6a20, - 0xeaa8: 0x6c2b6220, - 0xeaac: 0x6c0c4420, 0xeaad: 0x6c107a20, - 0xeab0: 0x6c0e1220, 0xeab2: 0x6c01f220, - 0xeab9: 0x6c124020, - 0xeabc: 0x6c03f220, 0xeabf: 0x6c0ed820, - // Block 0x3ab, offset 0xeac0 - 0xeac2: 0x6c2b7420, - 0xeac4: 0x6c2b7020, 0xeac7: 0x6c0e4c20, - 0xeacb: 0x6c0c0220, - 0xeacc: 0x6c035420, 0xeacd: 0x6c2b7220, 0xeacf: 0x6c0b7a20, - 0xead2: 0x6c165c20, - 0xead6: 0x6c170420, - 0xeada: 0x6c2b7620, 0xeadb: 0x6c2b8c20, - 0xeadc: 0x6c0eda20, 0xeade: 0x6c2b8a20, - 0xeae0: 0x6c2b8420, 0xeae1: 0x6c2b9420, 0xeae2: 0x6c2b8620, - 0xeae4: 0x6c2b7e20, 0xeae6: 0x6c0f6820, 0xeae7: 0x6c2b7c20, - 0xeaeb: 0x6c2b7820, - 0xeaed: 0x6c154e20, 0xeaee: 0x6c08b420, - 0xeaf1: 0x6c2b8020, 0xeaf3: 0x6c2b7a20, - 0xeaf7: 0x6c2b8820, - 0xeaf8: 0x6c0a3420, 0xeafa: 0x6c062220, - 0xeafe: 0x6c0dec20, - // Block 0x3ac, offset 0xeb00 - 0xeb00: 0x6c141e20, 0xeb01: 0x6c013020, 0xeb02: 0x6c008420, - 0xeb04: 0x6c103220, 0xeb07: 0x6c2b9020, - 0xeb0c: 0x6c2b8e20, 0xeb0e: 0x6c10b420, - 0xeb10: 0x6c2b9820, - 0xeb14: 0x6c2b8220, 0xeb16: 0x6c2b9620, 0xeb17: 0x6c2b9a20, - 0xeb19: 0x6c05f820, 0xeb1a: 0x6c2b9220, 0xeb1b: 0x6c070820, - 0xeb1d: 0x6c093a20, - 0xeb20: 0x6c2b9c20, 0xeb21: 0x6c15bc20, - 0xeb26: 0x6c2ba220, - 0xeb28: 0x6c2ba820, 0xeb2b: 0x6c2ba420, - 0xeb2c: 0x6c128620, - 0xeb33: 0x6c2b9e20, - 0xeb39: 0x6c04e820, - 0xeb3e: 0x6c2ba620, - // Block 0x3ad, offset 0xeb40 - 0xeb41: 0x6c2baa20, - 0xeb49: 0x6c2bb220, - 0xeb4c: 0x6c2bac20, 0xeb4e: 0x6c2bb020, 0xeb4f: 0x6c2bae20, - 0xeb56: 0x6c2bb420, - 0xeb58: 0x6c08f220, 0xeb5a: 0x6c2bb820, 0xeb5b: 0x6c2bb620, - 0xeb5c: 0x6c12ec20, 0xeb5f: 0x6c2bbc20, - 0xeb66: 0x6c059620, - 0xeb6b: 0x6c2bba20, - 0xeb6c: 0x6c2bbe20, 0xeb6f: 0x6c2bc020, - 0xeb70: 0x6c03f420, 0xeb71: 0x6c279420, 0xeb72: 0x6c0afa20, - 0xeb74: 0x6c2bc220, 0xeb77: 0x6c067c20, - 0xeb7d: 0x6c2bc420, - // Block 0x3ae, offset 0xeb80 - 0xeb80: 0x6c2bc620, 0xeb83: 0x6c085020, - 0xeb8a: 0x6c1ede20, - 0xeb8c: 0x6c2bc820, 0xeb8e: 0x6c2bca20, - 0xeb90: 0x6c09b020, 0xeb92: 0x6c2bcc20, 0xeb93: 0x6c2bce20, - 0xeb96: 0x6c2bd020, - 0xeb99: 0x6c2bd220, 0xeb9a: 0x6c2bd420, - // Block 0x3af, offset 0xebc0 - 0xebf7: 0x6c0e0a20, - 0xebfa: 0x6c2bd620, - 0xebff: 0x6c2bda20, - // Block 0x3b0, offset 0xec00 - 0xec01: 0x6c2bd820, - 0xec06: 0x6c103420, - 0xec08: 0x6c2bdc20, 0xec0a: 0x6c13ee20, - 0xec0c: 0x6c2bde20, 0xec0e: 0x6c2be020, - 0xec10: 0x6c2be220, - 0xec15: 0x6c2be420, - 0xec1a: 0x6c109c20, - 0xec21: 0x6c0ac220, 0xec22: 0x6c2be620, - 0xec2a: 0x6c073220, 0xec2b: 0x6c174620, - 0xec2c: 0x6c2be820, - 0xec38: 0x6c2bea20, 0xec39: 0x6c129a20, 0xec3a: 0x6c2bec20, - 0xec3c: 0x6c2bfc20, - // Block 0x3b1, offset 0xec40 - 0xec42: 0x6c2bee20, - 0xec45: 0x6c2bf220, - 0xec49: 0x6c2bf020, 0xec4a: 0x6c2bf420, - 0xec4c: 0x6c142020, 0xec4d: 0x6c2bf620, 0xec4e: 0x6c2bf820, - 0xec54: 0x6c2bfa20, - 0xec58: 0x6c2bfe20, - 0xec5d: 0x6c024e20, 0xec5e: 0x6c0f3e20, - 0xec60: 0x6c12ee20, 0xec61: 0x6c07dc20, 0xec62: 0x6c070a20, - 0xec67: 0x6c12ba20, - 0xec68: 0x6c01f620, 0xec69: 0x6c11fc20, 0xec6a: 0x6c2c0420, 0xec6b: 0x6c035620, - 0xec6c: 0x6c0c2a20, 0xec6d: 0x6c2c0220, 0xec6e: 0x6c2c0c20, 0xec6f: 0x6c0ea620, - 0xec70: 0x6c151620, 0xec72: 0x6c2c0820, 0xec73: 0x6c2c0a20, - 0xec74: 0x6c03c820, 0xec76: 0x6c2c0e20, 0xec77: 0x6c116a20, - 0xec78: 0x6c0db620, 0xec7b: 0x6c124220, - 0xec7c: 0x6c0fa620, 0xec7d: 0x6c2c0620, 0xec7f: 0x6c142220, - // Block 0x3b2, offset 0xec80 - 0xec80: 0x6c021020, 0xec81: 0x6c2c1220, 0xec82: 0x6c16d420, 0xec83: 0x6c0ef420, - 0xec84: 0x6c170e20, 0xec87: 0x6c08b620, - 0xec88: 0x6c2c1020, 0xec8a: 0x6c0d5a20, - 0xec8d: 0x6c2c3220, 0xec8e: 0x6c0c8c20, - 0xec91: 0x6c10d820, 0xec93: 0x6c12bc20, - 0xec9a: 0x6c2c1820, 0xec9b: 0x6c085220, - 0xec9c: 0x6c08b820, 0xec9e: 0x6c0ac420, - 0xeca0: 0x6c116e20, 0xeca2: 0x6c05fa20, 0xeca3: 0x6c2c1620, - 0xeca4: 0x6c2c1420, 0xeca6: 0x6c12f020, - 0xecaa: 0x6c091220, - 0xecad: 0x6c0fd020, - 0xecba: 0x6c2c1c20, 0xecbb: 0x6c2c1e20, - 0xecbc: 0x6c070c20, 0xecbd: 0x6c2c1a20, - // Block 0x3b3, offset 0xecc0 - 0xecc4: 0x6c2c2020, 0xecc5: 0x6c2c2220, 0xecc7: 0x6c2c2620, - 0xecc8: 0x6c0d3e20, 0xecca: 0x6c2c2420, 0xeccb: 0x6c037c20, - 0xeccd: 0x6c2c2a20, 0xeccf: 0x6c2c2820, - 0xecd0: 0x6c2c2c20, 0xecd3: 0x6c2c3020, - 0xecd4: 0x6c2c3420, 0xecd6: 0x6c2c3620, - // Block 0x3b4, offset 0xed00 - 0xed24: 0x6c0c2c20, 0xed26: 0x6c092e20, 0xed27: 0x6c2c3820, - 0xed2b: 0x6c029820, - 0xed2d: 0x6c2c3a20, - 0xed30: 0x6c0d2820, 0xed31: 0x6c2c3c20, 0xed33: 0x6c2c3e20, - 0xed34: 0x6c12f220, 0xed37: 0x6c03ca20, - // Block 0x3b5, offset 0xed40 - 0xed41: 0x6c2c4020, - 0xed45: 0x6c0edc20, - 0xed4a: 0x6c013220, - 0xed59: 0x6c2c4220, - 0xed63: 0x6c097220, - 0xed68: 0x6c0bb020, - 0xed73: 0x6c0d5220, - 0xed7a: 0x6c2c4820, - 0xed7e: 0x6c2c4620, - // Block 0x3b6, offset 0xed80 - 0xed82: 0x6c2c4420, - 0xed8b: 0x6c2c5420, - 0xed8c: 0x6c2c5020, 0xed8f: 0x6c2c4a20, - 0xed96: 0x6c2c4e20, - 0xed9a: 0x6c2c4c20, 0xed9b: 0x6c2c5220, - 0xed9d: 0x6c045a20, 0xed9f: 0x6c2c5a20, - 0xeda1: 0x6c0c2e20, 0xeda3: 0x6c2c5c20, - 0xeda8: 0x6c065220, 0xedaa: 0x6c2c5620, 0xedab: 0x6c2c5820, - 0xedaf: 0x6c16d620, - 0xedb3: 0x6c0ede20, - 0xedb5: 0x6c0c8e20, - 0xedbc: 0x6c2c5e20, 0xedbf: 0x6c2c6420, - // Block 0x3b7, offset 0xedc0 - 0xedc8: 0x6c2c6020, 0xedc9: 0x6c2c6220, 0xedca: 0x6c15be20, - 0xedcf: 0x6c103620, - 0xedd0: 0x6c2c6a20, - 0xeddd: 0x6c2c6620, 0xedde: 0x6c2c6820, 0xeddf: 0x6c2c6c20, - 0xedea: 0x6c2c8820, - 0xedf0: 0x6c2c7220, - 0xedf4: 0x6c2c7420, 0xedf5: 0x6c2c7020, - // Block 0x3b8, offset 0xee00 - 0xee02: 0x6c2c6e20, - 0xee04: 0x6c0f6a20, 0xee07: 0x6c2c7820, - 0xee08: 0x6c2c8020, 0xee09: 0x6c2c7a20, 0xee0a: 0x6c2c7620, - 0xee0c: 0x6c2c7c20, - 0xee10: 0x6c2c7e20, - 0xee15: 0x6c2c8c20, - 0xee19: 0x6c2c8220, - 0xee1f: 0x6c0c3020, - 0xee20: 0x6c2c8620, 0xee23: 0x6c2c8a20, - 0xee24: 0x6c2c8420, - 0xee32: 0x6c2c9020, - 0xee34: 0x6c09b220, 0xee36: 0x6c2c8e20, - 0xee3c: 0x6c2c9220, - // Block 0x3b9, offset 0xee40 - 0xee41: 0x6c2c9420, - 0xee44: 0x6c2c9a20, 0xee45: 0x6c2c9820, 0xee47: 0x6c2c9620, - 0xee4a: 0x6c2c9e20, 0xee4b: 0x6c2c9c20, - 0xee4d: 0x6c153c20, - 0xee51: 0x6c2ca220, 0xee53: 0x6c2ca020, - 0xee54: 0x6c2ca420, - 0xee59: 0x6c2ca620, - 0xee61: 0x6c2caa20, - 0xee6a: 0x6c2ca820, 0xee6b: 0x6c0b5420, - 0xee6c: 0x6c2cac20, 0xee6f: 0x6c050220, - 0xee70: 0x6c2cae20, 0xee71: 0x6c2cb220, - 0xee7e: 0x6c2cb420, - // Block 0x3ba, offset 0xee80 - 0xee85: 0x6c2cb620, 0xee86: 0x6c2cb020, - 0xee88: 0x6c2cb820, 0xee8a: 0x6c093c20, 0xee8b: 0x6c2cba20, - 0xee8c: 0x6c03cc20, 0xee8d: 0x6c054a20, - 0xee92: 0x6c05fc20, - 0xee9b: 0x6c2cbc20, - 0xee9f: 0x6c10c820, - 0xeea2: 0x6c0fa820, 0xeea3: 0x6c2cbe20, - 0xeeab: 0x6c2cc420, - 0xeeb8: 0x6c08f820, 0xeebb: 0x6c2cc220, - 0xeebc: 0x6c2cc020, 0xeebd: 0x6c059820, 0xeebe: 0x6c2cc620, - // Block 0x3bb, offset 0xeec0 - 0xeec3: 0x6c029a20, - 0xeec5: 0x6c2cca20, - 0xeec9: 0x6c07d020, 0xeeca: 0x6c2cc820, - 0xeecc: 0x6c2cda20, - 0xeed2: 0x6c2cce20, 0xeed3: 0x6c2cd220, - 0xeed4: 0x6c13a220, 0xeed5: 0x6c2ccc20, - 0xeed9: 0x6c2cd020, 0xeedb: 0x6c2cd820, - 0xeedc: 0x6c2cd420, 0xeedd: 0x6c03ce20, 0xeedf: 0x6c2cd620, - 0xeee6: 0x6c2cdc20, - 0xeee9: 0x6c115820, 0xeeea: 0x6c167820, - 0xeeef: 0x6c09b420, - 0xeef3: 0x6c2cde20, - 0xeef8: 0x6c155020, 0xeef9: 0x6c2ce220, 0xeefb: 0x6c2ce020, - 0xeefe: 0x6c2ce820, 0xeeff: 0x6c158e20, - // Block 0x3bc, offset 0xef00 - 0xef02: 0x6c2ce620, - 0xef04: 0x6c02ce20, 0xef05: 0x6c2ce420, 0xef06: 0x6c2cee20, - 0xef09: 0x6c2cec20, - 0xef0c: 0x6c2cea20, 0xef0d: 0x6c0f9020, 0xef0e: 0x6c2cf020, - 0xef17: 0x6c2cf220, - 0xef1c: 0x6c2cf420, 0xef1f: 0x6c073420, - 0xef21: 0x6c052e20, 0xef22: 0x6c2cf620, 0xef23: 0x6c2cf820, - 0xef24: 0x6c2cfa20, - // Block 0x3bd, offset 0xef40 - 0xef5b: 0x6c0b5620, - 0xef5c: 0x6c2cfc20, 0xef5e: 0x6c08ea20, 0xef5f: 0x6c2cfe20, - 0xef63: 0x6c2d0020, - 0xef67: 0x6c18a420, - 0xef68: 0x6c18a220, - 0xef6d: 0x6c2d0220, 0xef6e: 0x6c273620, 0xef6f: 0x6c2d0420, - 0xef70: 0x6c0dfc20, 0xef71: 0x6c0b1a20, 0xef72: 0x6c112420, - 0xef77: 0x6c2d0620, - 0xef7a: 0x6c138220, 0xef7b: 0x6c0f1820, - 0xef7c: 0x6c075820, 0xef7f: 0x6c0e0620, - // Block 0x3be, offset 0xef80 - 0xef82: 0x6c00d020, - 0xef84: 0x6c148420, 0xef85: 0x6c0b7220, - 0xef8e: 0x6c05a020, - 0xef91: 0x6c04ea20, - 0xef94: 0x6c138420, - 0xef9a: 0x6c2d0820, - 0xefa2: 0x6c2d0c20, - 0xefa5: 0x6c2d0a20, 0xefa6: 0x6c01f820, - 0xefa9: 0x6c10d420, 0xefaa: 0x6c2d0e20, 0xefab: 0x6c119220, - 0xefad: 0x6c0f9220, 0xefaf: 0x6c2d1020, - 0xefb0: 0x6c09f020, - 0xefb4: 0x6c2d1420, 0xefb7: 0x6c14d420, - 0xefb8: 0x6c2d3220, 0xefb9: 0x6c2d1820, 0xefba: 0x6c2d1a20, - 0xefbd: 0x6c0f0220, - // Block 0x3bf, offset 0xefc0 - 0xefc0: 0x6c0db820, 0xefc1: 0x6c0d2a20, 0xefc3: 0x6c103820, - 0xefc5: 0x6c2d1620, 0xefc6: 0x6c041620, - 0xefcb: 0x6c2d2820, - 0xefcd: 0x6c2d2220, 0xefce: 0x6c2d3c20, 0xefcf: 0x6c103a20, - 0xefd0: 0x6c0e7420, 0xefd1: 0x6c2d1c20, 0xefd3: 0x6c0f6c20, - 0xefd4: 0x6c0fd220, 0xefd5: 0x6c2d1e20, 0xefd6: 0x6c2d2620, 0xefd7: 0x6c0b8420, - 0xefd9: 0x6c117220, 0xefda: 0x6c0f0820, - 0xefdd: 0x6c0c0420, 0xefde: 0x6c2d2420, 0xefdf: 0x6c0d5420, - 0xefe0: 0x6c0d4020, 0xefe1: 0x6c2d2020, 0xefe2: 0x6c001220, 0xefe3: 0x6c16c820, - 0xefe7: 0x6c2d2a20, - 0xefee: 0x6c0dba20, - 0xeff1: 0x6c09b620, 0xeff2: 0x6c0b5820, - 0xeff5: 0x6c2d2e20, 0xeff6: 0x6c2d2c20, - 0xeff8: 0x6c009e20, 0xeff9: 0x6c2d3020, - 0xeffc: 0x6c127a20, 0xeffe: 0x6c2d4020, - // Block 0x3c0, offset 0xf000 - 0xf001: 0x6c109e20, 0xf002: 0x6c0b9a20, - 0xf005: 0x6c0e6620, 0xf007: 0x6c051820, - 0xf009: 0x6c2d3e20, 0xf00a: 0x6c157a20, 0xf00b: 0x6c00fa20, - 0xf00d: 0x6c138620, 0xf00e: 0x6c01fa20, 0xf00f: 0x6c2d3420, - 0xf010: 0x6c2d3620, 0xf011: 0x6c2d3820, 0xf012: 0x6c2d3a20, 0xf013: 0x6c105e20, - 0xf014: 0x6c0dfa20, 0xf015: 0x6c008620, 0xf016: 0x6c2d4220, - 0xf018: 0x6c2d4420, 0xf019: 0x6c31a020, - 0xf01c: 0x6c0d7220, 0xf01e: 0x6c2d4620, - 0xf020: 0x6c016220, 0xf021: 0x6c0cd420, 0xf023: 0x6c05fe20, - 0xf025: 0x6c15c020, - 0xf028: 0x6c2d4820, 0xf029: 0x6c0f8420, - 0xf02d: 0x6c0d2c20, 0xf02e: 0x6c093e20, 0xf02f: 0x6c2d4a20, - 0xf032: 0x6c2d5020, - 0xf035: 0x6c0a1620, 0xf036: 0x6c2d4c20, 0xf037: 0x6c0c9220, - 0xf038: 0x6c0c9020, 0xf03a: 0x6c008820, - 0xf03c: 0x6c165e20, 0xf03d: 0x6c2d5420, 0xf03f: 0x6c124420, - // Block 0x3c1, offset 0xf040 - 0xf040: 0x6c2d5820, 0xf041: 0x6c2d5620, 0xf042: 0x6c2d5220, 0xf043: 0x6c25a620, - 0xf044: 0x6c035820, 0xf047: 0x6c2d1220, - 0xf049: 0x6c2d5c20, 0xf04a: 0x6c2d5a20, - 0xf04f: 0x6c2d5e20, - 0xf051: 0x6c157c20, - 0xf063: 0x6c10aa20, - 0xf066: 0x6c13f020, - 0xf068: 0x6c2d6020, 0xf06a: 0x6c094220, - 0xf06f: 0x6c2d6220, - 0xf071: 0x6c2d6420, - 0xf075: 0x6c2d6620, - 0xf078: 0x6c0f6e20, - // Block 0x3c2, offset 0xf080 - 0xf081: 0x6c009420, - 0xf08a: 0x6c070e20, - 0xf08e: 0x6c16f820, - 0xf09b: 0x6c2d6e20, - 0xf0a1: 0x6c054c20, 0xf0a2: 0x6c2d6820, - 0xf0a4: 0x6c2d6a20, - 0xf0a8: 0x6c130420, - 0xf0ad: 0x6c029c20, - 0xf0b5: 0x6c157e20, 0xf0b7: 0x6c04a620, - 0xf0bd: 0x6c0fd420, - // Block 0x3c3, offset 0xf0c0 - 0xf0c2: 0x6c2d7020, - 0xf0d2: 0x6c2d7220, - 0xf0d9: 0x6c2d7420, - 0xf0ed: 0x6c0f7020, - 0xf0f0: 0x6c2d7820, 0xf0f2: 0x6c2d7620, - // Block 0x3c4, offset 0xf100 - 0xf109: 0x6c108e20, 0xf10a: 0x6c2d7a20, 0xf10b: 0x6c09b820, - 0xf10c: 0x6c095020, 0xf10d: 0x6c115a20, 0xf10e: 0x6c0e9620, - 0xf112: 0x6c097420, - 0xf114: 0x6c0b9c20, 0xf116: 0x6c2d7c20, - 0xf118: 0x6c2d7e20, - 0xf122: 0x6c0b7e20, 0xf123: 0x6c2d8020, - 0xf125: 0x6c2d8220, - 0xf129: 0x6c2d8420, 0xf12a: 0x6c15ea20, - 0xf12c: 0x6c09ba20, - 0xf132: 0x6c2d8820, 0xf133: 0x6c2d8620, - 0xf135: 0x6c071020, 0xf137: 0x6c074220, - 0xf138: 0x6c085420, - // Block 0x3c5, offset 0xf140 - 0xf142: 0x6c2d8e20, - 0xf147: 0x6c0a1820, - 0xf149: 0x6c2d8c20, 0xf14b: 0x6c2d8a20, - 0xf14d: 0x6c0dca20, - 0xf150: 0x6c067e20, 0xf152: 0x6c0c0620, - 0xf157: 0x6c11c020, - 0xf15c: 0x6c09be20, - 0xf162: 0x6c2d9020, - 0xf164: 0x6c0ac620, - 0xf16a: 0x6c2d9620, 0xf16b: 0x6c2d9220, - 0xf16f: 0x6c2d9420, - 0xf174: 0x6c2d9a20, 0xf175: 0x6c2d9820, - 0xf178: 0x6c0afc20, 0xf17a: 0x6c2d9c20, - // Block 0x3c6, offset 0xf180 - 0xf180: 0x6c2d9e20, 0xf181: 0x6c2da020, - 0xf186: 0x6c120020, 0xf187: 0x6c07be20, - 0xf188: 0x6c095220, 0xf189: 0x6c2da220, 0xf18b: 0x6c2da420, - 0xf18c: 0x6c161020, 0xf18d: 0x6c09d620, 0xf18e: 0x6c152c20, 0xf18f: 0x6c166020, - 0xf190: 0x6c2da620, 0xf191: 0x6c04ec20, - 0xf196: 0x6c2da820, - 0xf198: 0x6c0f7220, 0xf19b: 0x6c2dae20, - 0xf19c: 0x6c02e420, 0xf19d: 0x6c0b5a20, 0xf19f: 0x6c2daa20, - 0xf1a1: 0x6c2dac20, 0xf1a3: 0x6c0f3020, - 0xf1a6: 0x6c143e20, 0xf1a7: 0x6c052020, - 0xf1b5: 0x6c2db220, 0xf1b6: 0x6c2db420, - 0xf1bc: 0x6c2db020, 0xf1bf: 0x6c2db820, - // Block 0x3c7, offset 0xf1c0 - 0xf1cd: 0x6c10a620, 0xf1ce: 0x6c027a20, - 0xf1d1: 0x6c2dc020, - 0xf1d4: 0x6c2dba20, 0xf1d5: 0x6c2dbe20, - 0xf1de: 0x6c2db620, - 0xf1e9: 0x6c2e4c20, - 0xf1ec: 0x6c2dbc20, - 0xf1f4: 0x6c169e20, 0xf1f7: 0x6c065420, - 0xf1ff: 0x6c2dd020, - // Block 0x3c8, offset 0xf200 - 0xf204: 0x6c0f9420, 0xf205: 0x6c2dc620, - 0xf208: 0x6c2dcc20, 0xf209: 0x6c2dc820, 0xf20b: 0x6c2dd220, - 0xf210: 0x6c2dd420, - 0xf217: 0x6c2dc420, - 0xf21a: 0x6c2dde20, 0xf21b: 0x6c016420, - 0xf21e: 0x6c2dc220, - 0xf222: 0x6c11ba20, - 0xf224: 0x6c2dca20, 0xf226: 0x6c0ac820, - 0xf231: 0x6c071220, - 0xf23e: 0x6c142420, - // Block 0x3c9, offset 0xf240 - 0xf240: 0x6c04f020, 0xf243: 0x6c09d820, - 0xf245: 0x6c106020, - 0xf251: 0x6c0c9620, 0xf253: 0x6c2dda20, - 0xf255: 0x6c2dce20, 0xf256: 0x6c2dd820, - 0xf258: 0x6c14d620, 0xf25a: 0x6c0ee020, 0xf25b: 0x6c2ddc20, - 0xf25c: 0x6c2dd620, - 0xf26d: 0x6c0c9420, - 0xf277: 0x6c2de420, - 0xf279: 0x6c2de220, - // Block 0x3ca, offset 0xf280 - 0xf28f: 0x6c2de020, - 0xf292: 0x6c13f220, - 0xf2a4: 0x6c0a4220, - 0xf2a9: 0x6c2de620, 0xf2aa: 0x6c139620, - 0xf2ad: 0x6c012420, - 0xf2b2: 0x6c12a820, 0xf2b3: 0x6c0e9820, - 0xf2b8: 0x6c045c20, 0xf2ba: 0x6c2dea20, - 0xf2bc: 0x6c071620, - // Block 0x3cb, offset 0xf2c0 - 0xf2c6: 0x6c082c20, - 0xf2cf: 0x6c2de820, - 0xf2d0: 0x6c0b9e20, - 0xf2d8: 0x6c0ba020, 0xf2d9: 0x6c2df020, 0xf2da: 0x6c2df420, - 0xf2e0: 0x6c0afe20, 0xf2e2: 0x6c2df220, 0xf2e3: 0x6c2df620, - 0xf2e6: 0x6c04ce20, - 0xf2e8: 0x6c12a620, 0xf2eb: 0x6c095420, - 0xf2ec: 0x6c16ca20, 0xf2ee: 0x6c2dee20, 0xf2ef: 0x6c080820, - 0xf2f2: 0x6c170220, - 0xf2f5: 0x6c2dfa20, - 0xf2fa: 0x6c2df820, 0xf2fb: 0x6c2dfc20, - // Block 0x3cc, offset 0xf300 - 0xf304: 0x6c2dec20, - 0xf30b: 0x6c10ba20, - 0xf30d: 0x6c0fd620, - 0xf314: 0x6c0f1e20, 0xf316: 0x6c2e0620, - 0xf31b: 0x6c0e3a20, - 0xf31c: 0x6c2dfe20, - 0xf320: 0x6c2e0020, - 0xf32c: 0x6c053e20, 0xf32e: 0x6c2e0420, - 0xf335: 0x6c060020, - 0xf33c: 0x6c2e0220, 0xf33e: 0x6c0aca20, - // Block 0x3cd, offset 0xf340 - 0xf34c: 0x6c02e620, - 0xf354: 0x6c2e0e20, 0xf356: 0x6c079620, 0xf357: 0x6c0d2e20, - 0xf35a: 0x6c0f0420, - 0xf367: 0x6c026a20, - 0xf36c: 0x6c2e0a20, 0xf36d: 0x6c2e0c20, 0xf36e: 0x6c0ef620, - 0xf370: 0x6c2e0820, - 0xf379: 0x6c2e1020, - // Block 0x3ce, offset 0xf380 - 0xf383: 0x6c2e1c20, - 0xf388: 0x6c2e2220, - 0xf390: 0x6c2e2020, 0xf391: 0x6c0f8620, - 0xf396: 0x6c2e1220, 0xf397: 0x6c2e1420, - 0xf398: 0x6c2e1a20, - 0xf39d: 0x6c2e1e20, - 0xf3a1: 0x6c04a820, - 0xf3a4: 0x6c2e2420, 0xf3a5: 0x6c2e1820, - 0xf3a8: 0x6c2e1620, - // Block 0x3cf, offset 0xf3c0 - 0xf3c3: 0x6c2e2c20, - 0xf3c7: 0x6c2e2e20, - 0xf3d0: 0x6c2e3020, 0xf3d3: 0x6c2e2a20, - 0xf3d4: 0x6c2e2820, - 0xf3d8: 0x6c0acc20, 0xf3d9: 0x6c103c20, 0xf3da: 0x6c2e2620, - 0xf3e1: 0x6c2e3820, - 0xf3eb: 0x6c2e3420, - 0xf3f5: 0x6c2e3620, 0xf3f6: 0x6c2e3220, - 0xf3f8: 0x6c0de820, 0xf3fa: 0x6c2e3a20, - // Block 0x3d0, offset 0xf400 - 0xf401: 0x6c2e3c20, - 0xf404: 0x6c2e4020, - 0xf411: 0x6c035a20, 0xf412: 0x6c2e3e20, 0xf413: 0x6c154420, - 0xf41a: 0x6c2e5620, 0xf41b: 0x6c2e4220, - 0xf41e: 0x6c2e4820, - 0xf420: 0x6c2e4420, 0xf422: 0x6c2e4620, - 0xf42a: 0x6c2e4a20, - 0xf430: 0x6c2e4e20, - 0xf435: 0x6c2e5020, 0xf437: 0x6c2e5220, - 0xf43c: 0x6c2e5820, 0xf43d: 0x6c2e5420, 0xf43e: 0x6c2e5a20, 0xf43f: 0x6c2e5e20, - // Block 0x3d1, offset 0xf440 - 0xf441: 0x6c2e5c20, - // Block 0x3d2, offset 0xf480 - 0xf4b7: 0x6c0ee220, - // Block 0x3d3, offset 0xf4c0 - 0xf4c0: 0x6c151e20, 0xf4c2: 0x6c2e6020, 0xf4c3: 0x6c0c9820, - 0xf4c7: 0x6c2e6220, - 0xf4c9: 0x6c136020, 0xf4ca: 0x6c2e6420, 0xf4cb: 0x6c024a20, - 0xf4cf: 0x6c00f420, - 0xf4d1: 0x6c035e20, 0xf4d3: 0x6c035c20, - 0xf4d4: 0x6c2e6620, 0xf4d6: 0x6c2e6820, - 0xf4d8: 0x6c2e6a20, 0xf4d9: 0x6c2e6c20, - 0xf4e0: 0x6c2e6e20, 0xf4e2: 0x6c036020, 0xf4e3: 0x6c029e20, - 0xf4e4: 0x6c071820, 0xf4e5: 0x6c11cc20, 0xf4e7: 0x6c2e7220, - 0xf4e8: 0x6c2e7020, - 0xf4ed: 0x6c2e7420, - 0xf4f2: 0x6c013420, - 0xf4f9: 0x6c2e7a20, 0xf4fb: 0x6c2e7820, - 0xf4fc: 0x6c2e7620, 0xf4fe: 0x6c2e7c20, - // Block 0x3d4, offset 0xf500 - 0xf503: 0x6c2e8220, - 0xf507: 0x6c004e20, - 0xf50a: 0x6c2e7e20, - 0xf50c: 0x6c2e8620, 0xf50d: 0x6c2e8420, - 0xf514: 0x6c2e8a20, 0xf515: 0x6c2e8820, 0xf516: 0x6c2e8c20, - 0xf518: 0x6c104420, - 0xf51c: 0x6c2e8e20, - 0xf521: 0x6c2e9020, 0xf522: 0x6c2e9420, - 0xf525: 0x6c2e9220, - // Block 0x3d5, offset 0xf540 - 0xf55c: 0x6c12f420, - 0xf561: 0x6c2e9620, - 0xf568: 0x6c2e9820, 0xf56a: 0x6c07e220, - 0xf56e: 0x6c2e9a20, 0xf56f: 0x6c2e9c20, - 0xf572: 0x6c142620, - 0xf57b: 0x6c0cd220, - 0xf57f: 0x6c000820, - // Block 0x3d6, offset 0xf580 - 0xf580: 0x6c0d8e20, 0xf582: 0x6c2e9e20, - 0xf584: 0x6c12f620, - 0xf58b: 0x6c2ea420, - 0xf58c: 0x6c2ea020, 0xf58d: 0x6c071a20, 0xf58f: 0x6c2ea220, - 0xf590: 0x6c062420, - 0xf59b: 0x6c136220, - 0xf59c: 0x6c2ea820, 0xf59d: 0x6c2eac20, 0xf59e: 0x6c2eaa20, 0xf59f: 0x6c2eae20, - 0xf5a2: 0x6c00be20, 0xf5a3: 0x6c0b7420, - 0xf5a4: 0x6c0a4420, 0xf5a5: 0x6c036220, 0xf5a6: 0x6c2eb020, - 0xf5aa: 0x6c117020, - 0xf5ac: 0x6c2eb420, - 0xf5b0: 0x6c00c020, 0xf5b2: 0x6c2eb220, 0xf5b3: 0x6c0ef820, - 0xf5b5: 0x6c166220, 0xf5b6: 0x6c103e20, 0xf5b7: 0x6c2ea620, - 0xf5b8: 0x6c161420, 0xf5ba: 0x6c060220, - 0xf5bd: 0x6c15c220, - // Block 0x3d7, offset 0xf5c0 - 0xf5c5: 0x6c051a20, 0xf5c6: 0x6c163020, - 0xf5c8: 0x6c053420, 0xf5ca: 0x6c0dbc20, 0xf5cb: 0x6c281020, - 0xf5cd: 0x6c2eb620, 0xf5ce: 0x6c024c20, 0xf5cf: 0x6c0ba220, - 0xf5d4: 0x6c02a020, 0xf5d5: 0x6c2eba20, 0xf5d7: 0x6c2ebc20, - 0xf5d8: 0x6c2eb820, 0xf5d9: 0x6c05ac20, 0xf5db: 0x6c07d220, - 0xf5dc: 0x6c0ace20, - 0xf5e0: 0x6c00c220, 0xf5e3: 0x6c167a20, - 0xf5e7: 0x6c2ec020, - 0xf5e8: 0x6c2d4e20, 0xf5ea: 0x6c2ebe20, - 0xf5f0: 0x6c2ec620, 0xf5f1: 0x6c2ec220, 0xf5f2: 0x6c2ec420, - 0xf5f4: 0x6c2ec820, 0xf5f6: 0x6c2eca20, 0xf5f7: 0x6c16a020, - 0xf5f8: 0x6c2ecc20, 0xf5f9: 0x6c2ece20, 0xf5fb: 0x6c0c1220, - 0xf5fc: 0x6c11d620, - // Block 0x3d8, offset 0xf600 - 0xf600: 0x6c0bbe20, 0xf601: 0x6c037e20, - 0xf604: 0x6c158020, 0xf605: 0x6c021220, 0xf606: 0x6c09bc20, 0xf607: 0x6c065620, - 0xf609: 0x6c2ed420, 0xf60b: 0x6c2ed220, - 0xf60c: 0x6c08ba20, 0xf60d: 0x6c2ed620, 0xf60e: 0x6c2ed020, - 0xf611: 0x6c082420, - 0xf615: 0x6c2ede20, 0xf616: 0x6c2a5c20, - 0xf619: 0x6c190e20, 0xf61b: 0x6c0bb220, - 0xf61c: 0x6c2eda20, - 0xf622: 0x6c161220, 0xf623: 0x6c10ca20, - 0xf628: 0x6c00d220, 0xf62a: 0x6c0c4620, 0xf62b: 0x6c08fc20, - 0xf630: 0x6c134620, 0xf632: 0x6c00fc20, - 0xf636: 0x6c16a220, 0xf637: 0x6c15e220, - 0xf639: 0x6c2ee020, 0xf63b: 0x6c0fb620, - // Block 0x3d9, offset 0xf640 - 0xf640: 0x6c098620, - 0xf644: 0x6c2ee220, 0xf646: 0x6c2ee420, 0xf647: 0x6c0b5c20, - 0xf648: 0x6c2ee620, 0xf64a: 0x6c16a420, - 0xf64d: 0x6c2edc20, 0xf64e: 0x6c2eea20, 0xf64f: 0x6c2eee20, - 0xf651: 0x6c2eec20, 0xf653: 0x6c2ee820, - 0xf656: 0x6c2ef020, - 0xf659: 0x6c2ef220, - 0xf65c: 0x6c0d3020, 0xf65e: 0x6c01fc20, - 0xf664: 0x6c2ef420, 0xf667: 0x6c14c020, - 0xf66a: 0x6c2ef620, - 0xf670: 0x6c2ef820, 0xf672: 0x6c16d820, - 0xf678: 0x6c1f6020, 0xf679: 0x6c2efa20, - 0xf67d: 0x6c2efc20, 0xf67e: 0x6c2efe20, - // Block 0x3da, offset 0xf680 - 0xf682: 0x6c2f0620, - 0xf684: 0x6c2f0020, 0xf686: 0x6c2f0220, - 0xf688: 0x6c2f0420, 0xf689: 0x6c2f0820, - 0xf692: 0x6c0c0820, - 0xf696: 0x6c153e20, - 0xf699: 0x6c0c0a20, - 0xf69c: 0x6c2f0a20, 0xf69e: 0x6c124620, - 0xf6a0: 0x6c2f0c20, 0xf6a1: 0x6c314420, 0xf6a2: 0x6c14e820, - 0xf6a4: 0x6c2f0e20, 0xf6a6: 0x6c2f1020, - 0xf6a8: 0x6c2f1220, 0xf6a9: 0x6c02a220, 0xf6ab: 0x6c2f1620, - 0xf6ad: 0x6c0b7620, - 0xf6b1: 0x6c2f1820, - 0xf6b4: 0x6c052c20, - 0xf6b9: 0x6c2f1a20, 0xf6ba: 0x6c2f2220, - 0xf6bc: 0x6c2f1e20, - // Block 0x3db, offset 0xf6c0 - 0xf6c1: 0x6c2f2020, - 0xf6c4: 0x6c02da20, 0xf6c5: 0x6c2f1c20, 0xf6c6: 0x6c2f2420, - 0xf6cb: 0x6c2f2620, - 0xf6cd: 0x6c005020, 0xf6cf: 0x6c2f2820, - 0xf6d0: 0x6c2f2a20, - 0xf6d8: 0x6c0ad020, - 0xf6dc: 0x6c2f2c20, - 0xf6e0: 0x6c03fa20, 0xf6e3: 0x6c2f3220, - 0xf6e6: 0x6c2f3020, - 0xf6e8: 0x6c2f2e20, 0xf6eb: 0x6c2ba020, - 0xf6ed: 0x6c139020, - 0xf6f3: 0x6c2f3420, - 0xf6f4: 0x6c2f3620, - // Block 0x3dc, offset 0xf700 - 0xf703: 0x6c2f3820, - 0xf706: 0x6c2f3a20, - 0xf708: 0x6c2f3c20, 0xf70b: 0x6c2f3e20, - 0xf713: 0x6c036420, - 0xf71c: 0x6c2f4020, - 0xf72d: 0x6c2f4220, 0xf72e: 0x6c10ea20, - 0xf732: 0x6c2f4620, 0xf733: 0x6c01ae20, - 0xf735: 0x6c2f4c20, 0xf736: 0x6c2f4a20, - 0xf73b: 0x6c00c420, - 0xf73f: 0x6c04aa20, - // Block 0x3dd, offset 0xf740 - 0xf741: 0x6c136620, 0xf742: 0x6c0ee420, 0xf743: 0x6c075c20, - 0xf745: 0x6c071c20, 0xf746: 0x6c0a1a20, - 0xf748: 0x6c0b7c20, - 0xf74c: 0x6c2f5020, 0xf74f: 0x6c2f4e20, - 0xf750: 0x6c159020, 0xf751: 0x6c038020, 0xf752: 0x6c120420, 0xf753: 0x6c10a020, - 0xf757: 0x6c0bbc20, - 0xf758: 0x6c166420, 0xf75a: 0x6c059a20, - 0xf761: 0x6c2f5620, - 0xf764: 0x6c2f5420, - 0xf76c: 0x6c142a20, 0xf76d: 0x6c104020, - 0xf774: 0x6c011c20, 0xf777: 0x6c2f5820, - 0xf778: 0x6c2f5220, 0xf77b: 0x6c12be20, - 0xf77c: 0x6c15e020, 0xf77d: 0x6c2f5a20, - // Block 0x3de, offset 0xf780 - 0xf786: 0x6c2f5c20, - 0xf78b: 0x6c2f6020, - 0xf78c: 0x6c0dcc20, 0xf78d: 0x6c02aa20, 0xf78e: 0x6c02ac20, 0xf78f: 0x6c2f5e20, - 0xf794: 0x6c038220, 0xf795: 0x6c060420, - 0xf798: 0x6c038420, 0xf79b: 0x6c0faa20, - 0xf79e: 0x6c168820, - 0xf7a7: 0x6c065820, - 0xf7ab: 0x6c2f6220, - 0xf7af: 0x6c2f6420, - 0xf7b0: 0x6c2f6620, 0xf7b1: 0x6c2f6820, 0xf7b3: 0x6c2f6c20, - 0xf7b4: 0x6c2f6a20, - // Block 0x3df, offset 0xf7c0 - 0xf7e8: 0x6c130a20, 0xf7ea: 0x6c2f6e20, - 0xf7ef: 0x6c2f7020, - 0xf7f1: 0x6c2f7220, - 0xf7f6: 0x6c2f7420, - // Block 0x3e0, offset 0xf800 - 0xf803: 0x6c2f7820, - 0xf804: 0x6c2f7620, 0xf806: 0x6c2f7a20, - 0xf81b: 0x6c124820, - 0xf81c: 0x6c27aa20, 0xf81f: 0x6c0b1620, - 0xf822: 0x6c03d020, - 0xf829: 0x6c2f7c20, 0xf82b: 0x6c2f7e20, - 0xf82d: 0x6c18ba20, 0xf82e: 0x6c20ec20, 0xf82f: 0x6c120620, - 0xf832: 0x6c00b620, - 0xf834: 0x6c003620, - 0xf83c: 0x6c08bc20, 0xf83d: 0x6c13f420, 0xf83e: 0x6c0b0420, - // Block 0x3e1, offset 0xf840 - 0xf843: 0x6c2f8020, - 0xf845: 0x6c150e20, - 0xf849: 0x6c2f8220, 0xf84a: 0x6c15c420, - 0xf84c: 0x6c010020, - 0xf850: 0x6c085620, 0xf852: 0x6c2f8420, 0xf853: 0x6c021420, - 0xf854: 0x6c2f8620, - 0xf858: 0x6c2f8820, - 0xf85d: 0x6c2f8c20, 0xf85e: 0x6c2f8e20, - 0xf860: 0x6c2f9220, 0xf861: 0x6c2f8a20, - 0xf864: 0x6c2f9020, - 0xf868: 0x6c036620, - 0xf86c: 0x6c2f9420, 0xf86e: 0x6c2f9620, - 0xf87d: 0x6c2f9820, 0xf87e: 0x6c2f9a20, - // Block 0x3e2, offset 0xf880 - 0xf882: 0x6c2f9c20, - 0xf885: 0x6c2fa020, - 0xf889: 0x6c2f9e20, 0xf88b: 0x6c2fa420, - 0xf88c: 0x6c2faa20, - 0xf890: 0x6c2fa220, 0xf891: 0x6c2fa620, 0xf892: 0x6c2fa820, - 0xf895: 0x6c2fac20, 0xf897: 0x6c04ac20, - // Block 0x3e3, offset 0xf8c0 - 0xf8d6: 0x6c097620, 0xf8d7: 0x6c2fae20, - 0xf8d8: 0x6c2fb020, 0xf8d9: 0x6c071e20, - 0xf8e5: 0x6c2fb220, - 0xf8e8: 0x6c027020, - 0xf8ec: 0x6c114220, 0xf8ed: 0x6c2fb420, 0xf8ee: 0x6c2fb620, - 0xf8f3: 0x6c0e6820, - 0xf8f4: 0x6c10be20, - 0xf8fc: 0x6c2fb820, - // Block 0x3e4, offset 0xf900 - 0xf901: 0x6c119e20, - 0xf904: 0x6c0d9020, 0xf905: 0x6c012c20, 0xf906: 0x6c050420, - 0xf908: 0x6c050620, - 0xf910: 0x6c0e9a20, 0xf911: 0x6c2fc220, 0xf912: 0x6c050820, - 0xf915: 0x6c021620, - 0xf918: 0x6c2fc020, 0xf91b: 0x6c2fbc20, - 0xf91d: 0x6c2fbe20, 0xf91f: 0x6c2fba20, - 0xf922: 0x6c2fd620, - 0xf92d: 0x6c2fc420, 0xf92e: 0x6c2fc620, - 0xf931: 0x6c2fc820, 0xf932: 0x6c2fca20, - 0xf938: 0x6c2fce20, 0xf93b: 0x6c2fcc20, - 0xf93f: 0x6c09fe20, - // Block 0x3e5, offset 0xf940 - 0xf941: 0x6c2fd020, - 0xf945: 0x6c2fd420, - 0xf94e: 0x6c03d220, 0xf94f: 0x6c2fd220, - 0xf952: 0x6c0d3220, 0xf953: 0x6c060620, - 0xf959: 0x6c2fd820, - 0xf968: 0x6c0d9220, 0xf96b: 0x6c2fda20, - 0xf970: 0x6c104220, - 0xf977: 0x6c2fdc20, - 0xf97e: 0x6c2fe620, - // Block 0x3e6, offset 0xf980 - 0xf980: 0x6c2fe220, 0xf982: 0x6c2fe020, 0xf983: 0x6c2fe420, - 0xf985: 0x6c2fde20, - 0xf98d: 0x6c2fea20, - 0xf995: 0x6c2fe820, 0xf997: 0x6c2fee20, - 0xf99a: 0x6c04ae20, 0xf99b: 0x6c2fec20, - 0xf99f: 0x6c2ff020, - 0xf9a2: 0x6c2ff220, - 0xf9a4: 0x6c2ff620, 0xf9a5: 0x6c2ff420, - 0xf9a9: 0x6c2ff820, 0xf9aa: 0x6c2ffc20, 0xf9ab: 0x6c2ffa20, - // Block 0x3e7, offset 0xf9c0 - 0xf9e8: 0x6c075420, - 0xf9ed: 0x6c2ffe20, - 0xf9f0: 0x6c300020, - 0xf9f8: 0x6c026c20, - 0xf9fc: 0x6c300220, - // Block 0x3e8, offset 0xfa00 - 0xfa00: 0x6c300420, - 0xfa04: 0x6c0ba620, - 0xfa0f: 0x6c300620, - 0xfa11: 0x6c300820, 0xfa13: 0x6c300a20, - 0xfa14: 0x6c300c20, - 0xfa18: 0x6c072020, - 0xfa1e: 0x6c300e20, 0xfa1f: 0x6c301020, - 0xfa22: 0x6c301220, 0xfa23: 0x6c301420, - 0xfa26: 0x6c301620, - 0xfa2a: 0x6c11c220, 0xfa2b: 0x6c301a20, - 0xfa2d: 0x6c126820, 0xfa2e: 0x6c301c20, 0xfa2f: 0x6c301820, - 0xfa31: 0x6c302020, - 0xfa34: 0x6c301e20, 0xfa37: 0x6c302220, - 0xfa3b: 0x6c302420, - // Block 0x3e9, offset 0xfa40 - 0xfa46: 0x6c302620, - 0xfa58: 0x6c302820, 0xfa5a: 0x6c302a20, - 0xfa5f: 0x6c302c20, - 0xfa62: 0x6c302e20, 0xfa63: 0x6c303020, - 0xfa65: 0x6c303220, 0xfa67: 0x6c303420, - 0xfa68: 0x6c303620, 0xfa69: 0x6c303820, 0xfa6a: 0x6c303a20, - 0xfa6e: 0x6c303c20, 0xfa6f: 0x6c303e20, - 0xfa71: 0x6c20e020, 0xfa72: 0x6c304020, - 0xfa7b: 0x6c268a20, - 0xfa7c: 0x6c03d420, - // Block 0x3ea, offset 0xfa80 - 0xfa81: 0x6c023620, 0xfa82: 0x6c077c20, 0xfa83: 0x6c304420, - 0xfa84: 0x6c304220, 0xfa85: 0x6c149a20, - 0xfa8d: 0x6c304820, 0xfa8e: 0x6c304a20, 0xfa8f: 0x6c304620, - 0xfa91: 0x6c304c20, - 0xfa94: 0x6c145820, - 0xfa98: 0x6c304e20, 0xfa9a: 0x6c046220, - 0xfaaf: 0x6c16ce20, - 0xfab4: 0x6c305020, - // Block 0x3eb, offset 0xfac0 - 0xfac3: 0x6c305420, - 0xface: 0x6c003c20, - 0xfad1: 0x6c305620, 0xfad2: 0x6c132e20, 0xfad3: 0x6c305220, - 0xfad6: 0x6c305820, 0xfad7: 0x6c305a20, - 0xfadf: 0x6c305c20, - 0xfae0: 0x6c305e20, - 0xfae8: 0x6c306020, 0xfaea: 0x6c147020, 0xfaeb: 0x6c082e20, - 0xfaed: 0x6c080c20, 0xfaee: 0x6c0c9a20, - 0xfaf4: 0x6c306220, - 0xfaf9: 0x6c306820, - // Block 0x3ec, offset 0xfb00 - 0xfb00: 0x6c306420, - 0xfb06: 0x6c306a20, - 0xfb09: 0x6c068220, 0xfb0a: 0x6c306620, - 0xfb0f: 0x6c306c20, - 0xfb11: 0x6c306e20, 0xfb12: 0x6c307020, - 0xfb14: 0x6c307820, 0xfb16: 0x6c082820, - 0xfb1b: 0x6c0dc020, - 0xfb21: 0x6c307a20, 0xfb22: 0x6c307420, 0xfb23: 0x6c307220, - 0xfb24: 0x6c307620, - 0xfb28: 0x6c05a220, - 0xfb30: 0x6c308220, 0xfb31: 0x6c308020, 0xfb32: 0x6c307e20, - 0xfb35: 0x6c002620, - // Block 0x3ed, offset 0xfb40 - 0xfb44: 0x6c309620, 0xfb46: 0x6c308e20, - 0xfb48: 0x6c309020, 0xfb49: 0x6c308820, 0xfb4a: 0x6c309420, - 0xfb4c: 0x6c308c20, 0xfb4d: 0x6c02b820, - 0xfb50: 0x6c171c20, 0xfb52: 0x6c309220, 0xfb53: 0x6c308a20, - 0xfb54: 0x6c308620, 0xfb55: 0x6c308420, - 0xfb5b: 0x6c309a20, - 0xfb61: 0x6c30a020, - 0xfb64: 0x6c309e20, 0xfb65: 0x6c309c20, - 0xfb6d: 0x6c12ae20, 0xfb6e: 0x6c309820, 0xfb6f: 0x6c00a620, - 0xfb70: 0x6c30a220, 0xfb72: 0x6c30a620, - 0xfb79: 0x6c02d220, 0xfb7a: 0x6c307c20, 0xfb7b: 0x6c00ea20, - 0xfb7e: 0x6c30aa20, - // Block 0x3ee, offset 0xfb80 - 0xfb86: 0x6c30a820, 0xfb87: 0x6c30a420, - 0xfb88: 0x6c0e0e20, - 0xfb92: 0x6c147420, - 0xfb97: 0x6c167c20, - 0xfb9a: 0x6c30ac20, - 0xfba0: 0x6c30ae20, - 0xfba7: 0x6c30b020, - 0xfbb6: 0x6c30b220, - 0xfbb8: 0x6c30b420, - // Block 0x3ef, offset 0xfbc0 - 0xfbe5: 0x6c0ee620, 0xfbe7: 0x6c30b620, - 0xfbe9: 0x6c11ce20, 0xfbeb: 0x6c30c020, - 0xfbec: 0x6c30b820, - 0xfbf0: 0x6c30ba20, 0xfbf3: 0x6c13f620, - 0xfbf4: 0x6c14d820, 0xfbf6: 0x6c108820, - // Block 0x3f0, offset 0xfc00 - 0xfc03: 0x6c30c220, - 0xfc06: 0x6c30c420, 0xfc07: 0x6c106420, - 0xfc08: 0x6c30be20, 0xfc09: 0x6c30bc20, - 0xfc0e: 0x6c018c20, - 0xfc12: 0x6c30d420, - 0xfc15: 0x6c30d220, - 0xfc1b: 0x6c016620, - 0xfc1f: 0x6c30ce20, - 0xfc23: 0x6c30cc20, - 0xfc26: 0x6c30c820, - 0xfc28: 0x6c02ea20, 0xfc2a: 0x6c30c620, 0xfc2b: 0x6c08f420, - 0xfc2c: 0x6c018a20, - 0xfc3b: 0x6c072220, - 0xfc3e: 0x6c30da20, 0xfc3f: 0x6c30d820, - // Block 0x3f1, offset 0xfc40 - 0xfc41: 0x6c30d620, - 0xfc44: 0x6c30d020, 0xfc46: 0x6c30dc20, - 0xfc48: 0x6c30de20, - 0xfc50: 0x6c30e820, 0xfc51: 0x6c30e620, - 0xfc59: 0x6c30ea20, - 0xfc5c: 0x6c00d620, 0xfc5d: 0x6c30e020, 0xfc5e: 0x6c30e220, - 0xfc60: 0x6c074420, 0xfc61: 0x6c14c220, - 0xfc64: 0x6c30e420, - 0xfc6c: 0x6c13f820, 0xfc6f: 0x6c30f420, - 0xfc72: 0x6c30ec20, - 0xfc7a: 0x6c30f620, - // Block 0x3f2, offset 0xfc80 - 0xfc87: 0x6c30f020, - 0xfc89: 0x6c30ee20, - 0xfc8f: 0x6c059c20, - 0xfc9a: 0x6c30f820, - 0xfca4: 0x6c30fa20, - 0xfca9: 0x6c30fc20, 0xfcab: 0x6c30f220, - 0xfcaf: 0x6c30ca20, - 0xfcb2: 0x6c30fe20, - 0xfcb4: 0x6c0f3220, - 0xfcb8: 0x6c310620, 0xfcba: 0x6c310820, 0xfcbb: 0x6c310420, - // Block 0x3f3, offset 0xfcc0 - 0xfcc1: 0x6c310220, 0xfcc2: 0x6c310e20, - 0xfcc4: 0x6c310020, 0xfcc6: 0x6c310a20, - 0xfccf: 0x6c310c20, - 0xfcd3: 0x6c311220, - 0xfcd9: 0x6c311020, - 0xfce6: 0x6c311620, - 0xfced: 0x6c311820, 0xfcef: 0x6c311a20, - 0xfcf2: 0x6c171620, - 0xfcf8: 0x6c311420, 0xfcf9: 0x6c0dce20, 0xfcfa: 0x6c07f220, - 0xfcfd: 0x6c311c20, - // Block 0x3f4, offset 0xfd00 - 0xfd1a: 0x6c311e20, 0xfd1b: 0x6c312020, - 0xfd1e: 0x6c312220, - // Block 0x3f5, offset 0xfd40 - 0xfd75: 0x6c312420, - 0xfd78: 0x6c060820, 0xfd79: 0x6c312620, - 0xfd7d: 0x6c312820, 0xfd7f: 0x6c08ee20, - // Block 0x3f6, offset 0xfd80 - 0xfd81: 0x6c312a20, - 0xfd88: 0x6c312c20, 0xfd8b: 0x6c312e20, - 0xfd8c: 0x6c313020, - 0xfd91: 0x6c313620, 0xfd92: 0x6c313220, 0xfd93: 0x6c16fc20, - 0xfd95: 0x6c313420, 0xfd97: 0x6c16a620, - 0xfd9d: 0x6c313820, 0xfd9f: 0x6c167e20, - 0xfda5: 0x6c313a20, 0xfda6: 0x6c11a020, - 0xfda9: 0x6c313c20, 0xfdaa: 0x6c314020, - 0xfdad: 0x6c314220, - 0xfdb8: 0x6c313e20, 0xfdb9: 0x6c073620, 0xfdba: 0x6c14ea20, 0xfdbb: 0x6c145a20, - 0xfdbc: 0x6c1c4020, 0xfdbe: 0x6c213620, 0xfdbf: 0x6c148a20, - // Block 0x3f7, offset 0xfdc0 - 0xfdc4: 0x6c018e20, - 0xfdcc: 0x6c314620, 0xfdcd: 0x6c040c20, 0xfdce: 0x6c314820, 0xfdcf: 0x6c314a20, - 0xfdd0: 0x6c314c20, 0xfdd2: 0x6c074620, - 0xfdd4: 0x6c314e20, - 0xfdd8: 0x6c235220, 0xfdd9: 0x6c150620, 0xfddb: 0x6c0dbe20, - 0xfddc: 0x6c315020, 0xfddd: 0x6c315420, 0xfdde: 0x6c315220, - 0xfde0: 0x6c315620, - 0xfde5: 0x6c315820, - 0xfde8: 0x6c315a20, - 0xfdef: 0x6c315c20, - 0xfdf4: 0x6c315e20, 0xfdf6: 0x6c316020, 0xfdf7: 0x6c316220, - 0xfdf9: 0x6c316420, 0xfdfb: 0x6c316620, - 0xfdfc: 0x6c316820, 0xfdfd: 0x6c316a20, - // Block 0x3f8, offset 0xfe00 - 0xfe07: 0x6c316c20, - 0xfe08: 0x6c316e20, - 0xfe0e: 0x6c0f7420, - 0xfe13: 0x6c065a20, - 0xfe15: 0x6c317220, - 0xfe20: 0x6c0cd620, 0xfe21: 0x6c317420, - 0xfe2c: 0x6c317620, - 0xfe3b: 0x6c125e20, - 0xfe3e: 0x6c317820, - // Block 0x3f9, offset 0xfe40 - 0xfe4a: 0x6c317a20, 0xfe4b: 0x6c254c20, - 0xfe4e: 0x6c2c2e20, 0xfe4f: 0x6c2f4420, - 0xfe52: 0x6c317c20, - 0xfe54: 0x6c317e20, - 0xfe5f: 0x6c318220, - 0xfe60: 0x6c318420, 0xfe61: 0x6c318620, 0xfe62: 0x6c16a820, 0xfe63: 0x6c318020, - 0xfe66: 0x6c318820, 0xfe67: 0x6c318a20, - 0xfe6a: 0x6c318e20, - 0xfe6c: 0x6c318c20, - 0xfe72: 0x6c319220, - 0xfe76: 0x6c319420, 0xfe77: 0x6c319020, - // Block 0x3fa, offset 0xfe80 - 0xfe8d: 0x6c163420, - 0xfe95: 0x6c319620, - 0xfe9c: 0x6c319820, 0xfe9d: 0x6c258620, - 0xfea0: 0x6c319a20, - // Block 0x3fb, offset 0xfec0 - 0xfec0: 0x6c2bdc20, 0xfec1: 0x6c06ce20, 0xfec2: 0x6c093c20, 0xfec3: 0x6c2c1020, - 0xfec4: 0x6c02c820, 0xfec5: 0x6c051c20, 0xfec6: 0x6c04f620, 0xfec7: 0x6c319820, - 0xfec8: 0x6c319820, 0xfec9: 0x6c056420, 0xfeca: 0x6c04ec20, 0xfecb: 0x6c19b020, - 0xfecc: 0x6c10a820, 0xfecd: 0x6c1dac20, 0xfece: 0x6c245a20, 0xfecf: 0x6c15d620, - 0xfed0: 0x6c29d420, 0xfed1: 0x6c15d820, 0xfed2: 0x6c15da20, 0xfed3: 0x6c2d5e20, - 0xfed4: 0x6c207020, 0xfed5: 0x6c15e420, 0xfed6: 0x6c22ae20, 0xfed7: 0x6c237220, - 0xfed8: 0x6c15e820, 0xfed9: 0x6c15ea20, 0xfeda: 0x6c2fc820, 0xfedb: 0x6c174220, - 0xfedc: 0x6c15ee20, 0xfedd: 0x6c15f220, 0xfede: 0x6c22f420, 0xfedf: 0x6c15f820, - 0xfee0: 0x6c312220, 0xfee1: 0x6c15f020, 0xfee2: 0x6c15f420, 0xfee3: 0x6c15f620, - 0xfee4: 0x6c2b0220, 0xfee5: 0x6c1e1420, 0xfee6: 0x6c285620, 0xfee7: 0x43103e20, - 0xfee8: 0x6c16de20, 0xfee9: 0x6c16e220, 0xfeea: 0x6c16e820, 0xfeeb: 0x6c16ee20, - 0xfeec: 0x6c16f820, 0xfeed: 0x6c179220, 0xfeee: 0x6c169020, 0xfeef: 0x6c18b420, - 0xfef0: 0x42c98820, 0xfef1: 0x6c16d020, 0xfef2: 0x6c22f220, 0xfef3: 0x6c249620, - 0xfef4: 0x6c16f220, 0xfef5: 0x6c29cc20, 0xfef6: 0x6c163c20, 0xfef7: 0x6c16d620, - 0xfef8: 0x6c16d820, 0xfef9: 0x6c16ce20, 0xfefa: 0x6c07f220, 0xfefb: 0x6c250420, - 0xfefc: 0x6c254420, 0xfefd: 0x42fb4020, 0xfefe: 0x43079220, 0xfeff: 0x43260820, - // Block 0x3fc, offset 0xff00 - 0xff00: 0x6c08ee20, 0xff01: 0x6c170420, 0xff02: 0x6c1a9e20, 0xff03: 0x6c16e020, - 0xff04: 0x6c262620, 0xff05: 0x6c16f420, 0xff06: 0x6c16ec20, 0xff07: 0x6c251c20, - 0xff08: 0x6c16d420, 0xff09: 0x6c15e220, 0xff0a: 0x6c1a9620, 0xff0b: 0x42b8c420, - 0xff0c: 0x6c209220, 0xff0d: 0x42dbb420, 0xff0e: 0x6c16ea20, 0xff0f: 0x6c168620, - 0xff10: 0x6c271420, 0xff11: 0x6c2ea420, 0xff12: 0x6c2f1420, 0xff13: 0x6c170020, - 0xff14: 0x6c31a420, 0xff15: 0x6c164620, 0xff16: 0x6c165620, 0xff17: 0x6c003a20, - 0xff18: 0x6c126e20, 0xff19: 0x6c166220, 0xff1a: 0x6c2bc620, 0xff1b: 0x6c1dfe20, - 0xff1c: 0x6c207020, 0xff1d: 0x6c0dec20, 0xff1e: 0x6c0e1420, 0xff1f: 0x6c10fa20, - 0xff20: 0x6c0fe420, 0xff21: 0x6c161820, 0xff22: 0x6c007620, 0xff23: 0x6c142c20, - 0xff24: 0x42f1f620, 0xff25: 0x6c138820, 0xff26: 0x6c131420, 0xff27: 0x6c12c420, - 0xff28: 0x6c122e20, 0xff29: 0x6c1ed820, 0xff2a: 0x6c080620, 0xff2b: 0x6c190a20, - 0xff2c: 0x6c07aa20, 0xff2d: 0x6c0a9c20, 0xff2e: 0x6c15b620, 0xff2f: 0x43155420, - 0xff30: 0x6c082020, 0xff31: 0x6c0dfc20, 0xff32: 0x6c0ef020, 0xff33: 0x6c099820, - 0xff34: 0x6c095620, 0xff35: 0x6c161e20, 0xff36: 0x6c162020, 0xff37: 0x6c164020, - 0xff38: 0x6c182620, 0xff39: 0x6c185a20, 0xff3a: 0x6c164c20, 0xff3b: 0x6c165820, - 0xff3c: 0x6c165a20, 0xff3d: 0x6c165c20, 0xff3e: 0x6c166020, 0xff3f: 0x6c18c020, - // Block 0x3fd, offset 0xff40 - 0xff40: 0x6c16cc20, 0xff41: 0x6c0a3a20, 0xff42: 0x6c1c6220, 0xff43: 0x6c163a20, - 0xff44: 0x6c228020, 0xff45: 0x6c24f620, 0xff46: 0x6c2e7420, 0xff47: 0x6c2ffc20, - 0xff48: 0x6c16a620, 0xff49: 0x6c314820, 0xff4a: 0x6c166620, 0xff4b: 0x42cd8c20, - 0xff4c: 0x42d6ee20, 0xff4d: 0x6c2cf620, 0xff4e: 0x6c110220, 0xff4f: 0x6c16ba20, - 0xff50: 0x6c1dba20, 0xff51: 0x6c110820, 0xff52: 0x6c16bc20, 0xff53: 0x6c16be20, - 0xff54: 0x42e91220, 0xff55: 0x42f39420, 0xff56: 0x6c16c220, 0xff57: 0x6c16c420, - 0xff58: 0x6c2cdc20, 0xff59: 0x6c16c620, 0xff5a: 0x6c16c820, 0xff5b: 0x43269420, - 0xff5c: 0x6c16ae20, 0xff5d: 0x6c16b020, 0xff5e: 0x6c00ac20, 0xff5f: 0x6c16b220, - 0xff60: 0x6c16b420, 0xff61: 0x43155420, 0xff62: 0x6c16b620, 0xff63: 0x6c110420, - 0xff64: 0x6c110620, 0xff65: 0x42d75c20, 0xff66: 0x6c16c020, 0xff67: 0x6c235e20, - 0xff68: 0x6c168a20, 0xff69: 0x6c1a1220, 0xff6a: 0x6c10fa20, 0xff6b: 0x6c169420, - 0xff6c: 0x6c169620, 0xff6d: 0x6c169820, 0xff6e: 0x6c238e20, 0xff6f: 0x6c278420, - 0xff70: 0x6c27c420, 0xff71: 0x6c169e20, 0xff72: 0x6c16a220, 0xff73: 0x6c2f0420, - 0xff74: 0x6c166420, 0xff75: 0x6c168e20, 0xff76: 0x6c255020, 0xff77: 0x6c2d9a20, - 0xff78: 0x6c2ecc20, 0xff79: 0x6c1d1a20, 0xff7a: 0x6c163e20, 0xff7b: 0x6c164220, - 0xff7c: 0x6c164820, 0xff7d: 0x6c10e820, 0xff7e: 0x6c164a20, 0xff7f: 0x6c207020, - // Block 0x3fe, offset 0xff80 - 0xff80: 0x6c22e020, 0xff81: 0x6c165220, 0xff82: 0x6c297e20, 0xff83: 0x6c165e20, - 0xff84: 0x6c163420, 0xff85: 0x6c1f2a20, 0xff86: 0x6c2e9a20, 0xff87: 0x6c162220, - 0xff88: 0x42cef620, 0xff89: 0x6c154020, 0xff8a: 0x6c162420, 0xff8b: 0x6c162620, - 0xff8c: 0x6c162820, 0xff8d: 0x6c162a20, 0xff8e: 0x6c162c20, 0xff8f: 0x6c128220, - 0xff90: 0x6c168820, 0xff91: 0x6c16fa20, 0xff92: 0x6c1dce20, 0xff93: 0x6c161420, - 0xff94: 0x6c166a20, 0xff95: 0x6c1bde20, 0xff96: 0x6c21cc20, 0xff97: 0x6c167820, - 0xff98: 0x6c161620, 0xff99: 0x6c1d6020, 0xff9a: 0x6c053820, 0xff9b: 0x6c161820, - 0xff9c: 0x6c163020, 0xff9d: 0x6c15fc20, 0xff9e: 0x6c15fe20, 0xff9f: 0x6c160020, - 0xffa0: 0x6c006e20, 0xffa1: 0x6c160220, 0xffa2: 0x6c160420, 0xffa3: 0x6c0f7620, - 0xffa4: 0x6c160620, 0xffa5: 0x6c160a20, 0xffa6: 0x6c1da420, 0xffa7: 0x6c160c20, - 0xffa8: 0x6c160e20, 0xffa9: 0x6c161020, 0xffaa: 0x6c161220, 0xffab: 0x6c106620, - 0xffac: 0x6c0f8820, 0xffad: 0x6c193020, 0xffae: 0x6c167220, 0xffaf: 0x42e93020, - 0xffb0: 0x6c29ca20, 0xffb1: 0x6c167a20, 0xffb2: 0x6c167c20, 0xffb3: 0x6c167e20, - 0xffb4: 0x6c166e20, 0xffb5: 0x6c167020, 0xffb6: 0x6c167620, 0xffb7: 0x6c161a20, - 0xffb8: 0x6c02b020, 0xffb9: 0x6c162e20, 0xffba: 0x42e58020, 0xffbb: 0x6c229820, - 0xffbc: 0x6c08f220, 0xffbd: 0x6c09c020, 0xffbe: 0x6c0e7a20, 0xffbf: 0x6c086620, - // Block 0x3ff, offset 0xffc0 - 0xffc0: 0x6c0c3420, 0xffc1: 0x6c0fde20, 0xffc2: 0x6c0dde20, 0xffc3: 0x6c102420, - 0xffc4: 0x6c0dd820, 0xffc5: 0x6c105420, 0xffc6: 0x6c140e20, 0xffc7: 0x6c2ce020, - 0xffc8: 0x6c070420, 0xffc9: 0x6c071a20, 0xffca: 0x6c05f620, 0xffcb: 0x6c028220, - 0xffcc: 0x6c181a20, 0xffcd: 0x42ab8020, 0xffce: 0x43f41c20, 0xffcf: 0x43f41e20, - 0xffd0: 0x6c0f0a20, 0xffd1: 0x43f42220, 0xffd2: 0x6c0be420, 0xffd3: 0x43f42620, - 0xffd4: 0x43f42820, 0xffd5: 0x42a3bc20, 0xffd6: 0x6c0ea020, 0xffd7: 0x6c012a20, - 0xffd8: 0x6c169a20, 0xffd9: 0x6c0b4420, 0xffda: 0x6c0aa220, 0xffdb: 0x6c131a20, - 0xffdc: 0x6c153e20, 0xffdd: 0x6c0bf420, 0xffde: 0x6c00ce20, 0xffdf: 0x43f43e20, - 0xffe0: 0x430c2420, 0xffe1: 0x43f44220, 0xffe2: 0x6c0a3420, 0xffe3: 0x43f44620, - 0xffe4: 0x43f44820, 0xffe5: 0x6c009e20, 0xffe6: 0x6c0fd420, 0xffe7: 0x43f44e20, - 0xffe8: 0x43f45020, 0xffe9: 0x43f45220, 0xffea: 0x6c120620, 0xffeb: 0x6c08bc20, - 0xffec: 0x6c036620, 0xffed: 0x6c0f3220, 0xffee: 0x4321bc20, 0xffef: 0x6c16a020, - 0xfff0: 0x6c12f820, 0xfff1: 0x6c0cd820, 0xfff2: 0x6c14e020, 0xfff3: 0x6c138a20, - 0xfff4: 0x6c04c820, 0xfff5: 0x6c121820, 0xfff6: 0x6c02be20, 0xfff7: 0x6c0e1820, - 0xfff8: 0x6c038e20, 0xfff9: 0x6c135220, 0xfffa: 0x6c143220, 0xfffb: 0x6c0cec20, - 0xfffc: 0x6c1b9c20, 0xfffd: 0x6c022a20, 0xfffe: 0x6c025c20, 0xffff: 0x6c0d3820, - // Block 0x400, offset 0x10000 - 0x10000: 0x6c0ec020, 0x10001: 0x6c12c020, 0x10002: 0x6c03a620, 0x10003: 0x6c0a2220, - 0x10004: 0x6c116220, 0x10005: 0x6c023c20, 0x10006: 0x6c0a2620, 0x10007: 0x6c033220, - 0x10008: 0x6c093220, 0x10009: 0x42e45620, 0x1000a: 0x6c0de420, 0x1000b: 0x6c123420, - 0x1000c: 0x6c093420, 0x1000d: 0x6c089a20, 0x1000e: 0x6c03ba20, 0x1000f: 0x6c157420, - 0x10010: 0x6c0cc420, 0x10011: 0x6c09e220, 0x10012: 0x6c01dc20, 0x10013: 0x6c0f5e20, - 0x10014: 0x6c074020, 0x10015: 0x6c108220, 0x10016: 0x6c0c4220, 0x10017: 0x6c16c220, - 0x10018: 0x6c270220, 0x10019: 0x6c11f620, 0x1001a: 0x6c0a2c20, 0x1001b: 0x6c093820, - 0x1001c: 0x6c09a620, 0x1001d: 0x4304f220, 0x1001e: 0x4304f220, 0x1001f: 0x6c0ea420, - 0x10020: 0x6c02cc20, 0x10021: 0x6c08aa20, 0x10022: 0x6c013020, 0x10023: 0x6c04e820, - 0x10024: 0x6c12bc20, 0x10025: 0x6c0d3e20, 0x10026: 0x431f6c20, 0x10027: 0x6c009e20, - 0x10028: 0x6c10ca20, 0x10029: 0x6c04aa20, 0x1002a: 0x6c12be20, 0x1002b: 0x6c056a20, - 0x1002c: 0x4885dc20, 0x1002d: 0x6c036820, - 0x10030: 0x6c135c20, 0x10031: 0x6c185420, 0x10032: 0x6c0ca420, 0x10033: 0x429f0020, - 0x10034: 0x6c09c420, 0x10035: 0x6c182c20, 0x10036: 0x6c155820, 0x10037: 0x6c094620, - 0x10038: 0x6c02be20, 0x10039: 0x42aaaa20, 0x1003a: 0x6c199620, 0x1003b: 0x42abc420, - 0x1003c: 0x6c0f0a20, 0x1003d: 0x6c133620, 0x1003e: 0x6c014020, 0x1003f: 0x6c144a20, - // Block 0x401, offset 0x10040 - 0x10040: 0x6c1b0820, 0x10041: 0x42b65020, 0x10042: 0x42bda420, 0x10043: 0x42bdb220, - 0x10044: 0x6c07b020, 0x10045: 0x6c1cb620, 0x10046: 0x6c1d2c20, 0x10047: 0x6c0b2e20, - 0x10048: 0x6c154820, 0x10049: 0x6c0d3820, 0x1004a: 0x42c2c020, 0x1004b: 0x6c0ec020, - 0x1004c: 0x6c0da620, 0x1004d: 0x6c1e5820, 0x1004e: 0x6c1e2c20, 0x1004f: 0x42c8a420, - 0x10050: 0x6c1eca20, 0x10051: 0x6c0be420, 0x10052: 0x6c16e220, 0x10053: 0x6c141020, - 0x10054: 0x6c0aee20, 0x10055: 0x6c210220, 0x10056: 0x6c082020, 0x10057: 0x6c162420, - 0x10058: 0x42ddb620, 0x10059: 0x6c08d420, 0x1005a: 0x6c033220, 0x1005b: 0x6c109020, - 0x1005c: 0x6c093220, 0x1005d: 0x42ef4e20, 0x1005e: 0x6c094e20, 0x1005f: 0x6c11f020, - 0x10060: 0x6c0ea020, 0x10061: 0x42e8e220, 0x10062: 0x42ea0c20, 0x10063: 0x6c020820, - 0x10064: 0x42ec3a20, 0x10065: 0x6c243820, 0x10066: 0x6c012a20, 0x10067: 0x6c0bf220, - 0x10068: 0x6c0eec20, 0x10069: 0x42ee9420, 0x1006a: 0x6c0e7e20, 0x1006b: 0x42f19820, - 0x1006c: 0x42f56220, 0x1006d: 0x6c0c4220, 0x1006e: 0x42f8f620, 0x1006f: 0x6c26c220, - 0x10070: 0x6c16c220, 0x10071: 0x42fe7c20, 0x10072: 0x6c093820, 0x10073: 0x6c070220, - 0x10074: 0x6c01ec20, 0x10075: 0x430ef220, 0x10076: 0x6c2aee20, 0x10077: 0x6c132020, - 0x10078: 0x6c08aa20, 0x10079: 0x6c0ed820, 0x1007a: 0x6c0a3420, 0x1007b: 0x6c0c0220, - 0x1007c: 0x6c013020, 0x1007d: 0x6c0dec20, 0x1007e: 0x6c154e20, 0x1007f: 0x6c04e820, - // Block 0x402, offset 0x10080 - 0x10080: 0x6c1ede20, 0x10081: 0x6c0d3e20, 0x10082: 0x6c155020, 0x10083: 0x6c2d5020, - 0x10084: 0x43233220, 0x10085: 0x4324ec20, 0x10086: 0x432cf820, 0x10087: 0x6c10ca20, - 0x10088: 0x6c153e20, 0x10089: 0x432fb620, 0x1008a: 0x6c04aa20, 0x1008b: 0x43301620, - 0x1008c: 0x6c12be20, 0x1008d: 0x43362420, 0x1008e: 0x6c319820, 0x1008f: 0x48509420, - 0x10090: 0x48508820, 0x10091: 0x4867aa20, 0x10092: 0x44773a20, 0x10093: 0x44803020, - 0x10094: 0x44807220, 0x10095: 0x48a49220, 0x10096: 0x48b9a020, 0x10097: 0x48fda620, - 0x10098: 0x433e8620, 0x10099: 0x433f1c20, - // Block 0x403, offset 0x100c0 - 0x100c1: 0x4002ba20, 0x100c2: 0x4003e020, 0x100c3: 0x4004ea20, - 0x100c4: 0x4027de20, 0x100c5: 0x4004ec20, 0x100c6: 0x4004e620, 0x100c7: 0x4003d220, - 0x100c8: 0x4003f420, 0x100c9: 0x4003f620, 0x100ca: 0x4004d820, 0x100cb: 0x40093820, - 0x100cc: 0x40024020, 0x100cd: 0x40021a20, 0x100ce: 0x4002e420, 0x100cf: 0x4004e220, - 0x100d0: 0x4029cc20, 0x100d1: 0x4029ce20, 0x100d2: 0x4029d020, 0x100d3: 0x4029d220, - 0x100d4: 0x4029d420, 0x100d5: 0x4029d620, 0x100d6: 0x4029d820, 0x100d7: 0x4029da20, - 0x100d8: 0x4029dc20, 0x100d9: 0x4029de20, 0x100da: 0x40026c20, 0x100db: 0x40026220, - 0x100dc: 0x40094020, 0x100dd: 0x40094220, 0x100de: 0x40094420, 0x100df: 0x4002c420, - 0x100e0: 0x4004d620, 0x100e1: 0x002bde88, 0x100e2: 0x002c0a88, 0x100e3: 0x002c3a88, - 0x100e4: 0x002c6288, 0x100e5: 0x002c9888, 0x100e6: 0x002d0888, 0x100e7: 0x002d2288, - 0x100e8: 0x002d6888, 0x100e9: 0x002d9a88, 0x100ea: 0x002dcc88, 0x100eb: 0x002dfe88, - 0x100ec: 0x002e2288, 0x100ed: 0x002e8288, 0x100ee: 0x002e9e88, 0x100ef: 0x002ee288, - 0x100f0: 0x002f2c88, 0x100f1: 0x002f5688, 0x100f2: 0x002f7a88, 0x100f3: 0x002fe688, - 0x100f4: 0x00302c88, 0x100f5: 0x00306c88, 0x100f6: 0x0030be88, 0x100f7: 0x0030e288, - 0x100f8: 0x0030f688, 0x100f9: 0x00310088, 0x100fa: 0x00312a88, 0x100fb: 0x4003f820, - 0x100fc: 0x4003d220, 0x100fd: 0x4003fa20, 0x100fe: 0x40062420, 0x100ff: 0x40021620, - // Block 0x404, offset 0x10100 - 0x10100: 0x40061e20, 0x10101: 0x402bde20, 0x10102: 0x402c0a20, 0x10103: 0x402c3a20, - 0x10104: 0x402c6220, 0x10105: 0x402c9820, 0x10106: 0x402d0820, 0x10107: 0x402d2220, - 0x10108: 0x402d6820, 0x10109: 0x402d9a20, 0x1010a: 0x402dcc20, 0x1010b: 0x402dfe20, - 0x1010c: 0x402e2220, 0x1010d: 0x402e8220, 0x1010e: 0x402e9e20, 0x1010f: 0x402ee220, - 0x10110: 0x402f2c20, 0x10111: 0x402f5620, 0x10112: 0x402f7a20, 0x10113: 0x402fe620, - 0x10114: 0x40302c20, 0x10115: 0x40306c20, 0x10116: 0x4030be20, 0x10117: 0x4030e220, - 0x10118: 0x4030f620, 0x10119: 0x40310020, 0x1011a: 0x40312a20, 0x1011b: 0x4003fc20, - 0x1011c: 0x40094820, 0x1011d: 0x4003fe20, 0x1011e: 0x40094c20, 0x1011f: 0x00041883, - 0x10120: 0x00041a83, 0x10121: 0x40030420, 0x10122: 0x4004a420, 0x10123: 0x4004a620, - 0x10124: 0x40025c20, 0x10125: 0x00023e92, 0x10126: 0xca3c3601, 0x10127: 0xc64d3281, - 0x10128: 0xc71d3281, 0x10129: 0xc7dd3601, 0x1012a: 0xc8c43281, 0x1012b: 0xc9793281, - 0x1012c: 0xc6e83281, 0x1012d: 0xc8af3281, 0x1012e: 0xca1d3281, 0x1012f: 0xc8483601, - 0x10130: 0x0027d692, 0x10131: 0xc6533281, 0x10132: 0xc7233281, 0x10133: 0xc7f23601, - 0x10134: 0xc8ca3281, 0x10135: 0xc97f3281, 0x10136: 0xc6663281, 0x10137: 0xc7363601, - 0x10138: 0xc8143601, 0x10139: 0xc8dd3281, 0x1013a: 0xc9923601, 0x1013b: 0xc67f3601, - 0x1013c: 0xc7583601, 0x1013d: 0xc8363601, 0x1013e: 0xc8f63601, 0x1013f: 0xc9af3601, - // Block 0x405, offset 0x10140 - 0x10140: 0xc69c3601, 0x10141: 0xc7753601, 0x10142: 0xc85d3601, 0x10143: 0xc9133601, - 0x10144: 0xc9d13601, 0x10145: 0xc6ac3281, 0x10146: 0xc7853281, 0x10147: 0xc8703281, - 0x10148: 0xc9233281, 0x10149: 0xc9e13281, 0x1014a: 0xc6ca3601, 0x1014b: 0xc7a33601, - 0x1014c: 0xc88e3601, 0x1014d: 0xc9413601, 0x1014e: 0xc9ff3601, 0x1014f: 0xc6e23281, - 0x10150: 0xc7bb3281, 0x10151: 0xc8a93281, 0x10152: 0xc9593281, 0x10153: 0xca173281, - 0x10154: 0xc6ee3281, 0x10155: 0xc8b53281, 0x10156: 0xca233281, 0x10157: 0xc6f73281, - 0x10158: 0xc7c43281, 0x10159: 0xc8be3281, 0x1015a: 0xc9623281, 0x1015b: 0xca2c3281, - 0x1015c: 0xc7113601, 0x1015d: 0xca453ae1, 0x1015e: 0xa0012812, 0x1015f: 0xa0012912, - 0x10160: 0x4063a620, 0x10161: 0x4062ac20, 0x10162: 0x4062ae20, 0x10163: 0x40646820, - 0x10164: 0x4062b020, 0x10165: 0x40646c20, 0x10166: 0x40646e20, 0x10167: 0x4062b220, - 0x10168: 0x4062b420, 0x10169: 0x4062b620, 0x1016a: 0x40647420, 0x1016b: 0x40647620, - 0x1016c: 0x40647820, 0x1016d: 0x40647a20, 0x1016e: 0x40647c20, 0x1016f: 0x40647e20, - 0x10170: 0x4062e020, 0x10171: 0x4062b820, 0x10172: 0x4062ba20, 0x10173: 0x4062bc20, - 0x10174: 0x4062ee20, 0x10175: 0x4062be20, 0x10176: 0x4062c020, 0x10177: 0x4062c220, - 0x10178: 0x4062c420, 0x10179: 0x4062c620, 0x1017a: 0x4062c820, 0x1017b: 0x4062ca20, - 0x1017c: 0x4062cc20, 0x1017d: 0x4062ce20, 0x1017e: 0x4062d020, - // Block 0x406, offset 0x10180 - 0x10182: 0x4063a820, 0x10183: 0x4063aa20, - 0x10184: 0x4063ac20, 0x10185: 0x4063ae20, 0x10186: 0x4063b020, 0x10187: 0x4063b220, - 0x1018a: 0x4063b420, 0x1018b: 0x4063b620, - 0x1018c: 0x4063b820, 0x1018d: 0x4063ba20, 0x1018e: 0x4063bc20, 0x1018f: 0x4063be20, - 0x10192: 0x4063c020, 0x10193: 0x4063c220, - 0x10194: 0x4063c420, 0x10195: 0x4063c620, 0x10196: 0x4063c820, 0x10197: 0x4063ca20, - 0x1019a: 0x4063cc20, 0x1019b: 0x4063ce20, - 0x1019c: 0x4063d020, - 0x101a0: 0x4027dc20, 0x101a1: 0x4027e020, 0x101a2: 0x40094620, 0x101a3: 0x40021220, - 0x101a4: 0x40094a20, 0x101a5: 0x4027e220, 0x101a6: 0x40280820, - 0x101a8: 0x400d3220, 0x101a9: 0x40084420, 0x101aa: 0x40084820, 0x101ab: 0x40084620, - 0x101ac: 0x40084a20, 0x101ad: 0x400e6e20, 0x101ae: 0x400ec420, - 0x101b9: 0xa0000000, 0x101ba: 0xa0000000, 0x101bb: 0xa0000000, - 0x101bc: 0x4027ae20, 0x101bd: 0x4027b020, 0x101be: 0x00000285, 0x101bf: 0x2bfffe85, - // Block 0x407, offset 0x101c0 - 0x101c0: 0xe0003d0b, 0x101c1: 0xe0003cf3, 0x101c2: 0xe0003cf7, 0x101c3: 0xe0003cff, - 0x101c4: 0xe0003d0f, 0x101c5: 0xe0003d03, 0x101c6: 0xe0003d13, 0x101c7: 0xe0003cfb, - 0x101c8: 0xe0003d07, - 0x101d0: 0x02bf2e86, 0x101d1: 0x02a7de86, - // Block 0x408, offset 0x10200 - 0x10200: 0x429c7a20, 0x10201: 0x6c036a20, 0x10202: 0x429c8220, 0x10203: 0x48024420, - 0x10204: 0x429ec020, 0x10205: 0x6c12f820, 0x10206: 0x429f7620, 0x10207: 0x42a00420, - 0x10208: 0x42a0f420, 0x10209: 0x6c124e20, 0x1020a: 0x6c0cd820, 0x1020b: 0x6c0d3420, - 0x1020c: 0x44693c20, 0x1020d: 0x480c7420, 0x1020e: 0x6c14e020, 0x1020f: 0x6c182020, - 0x10210: 0x42a2c820, 0x10211: 0x6c050a20, 0x10212: 0x480a3820, 0x10213: 0x44697220, - 0x10214: 0x42a2ce20, 0x10215: 0x6c07a420, 0x10216: 0x480a9620, 0x10217: 0x6c0ada20, - 0x10218: 0x6c184020, 0x10219: 0x429d9820, 0x1021a: 0x6c0fea20, 0x1021b: 0x6c185420, - 0x1021c: 0x4923be20, 0x1021d: 0x6c186820, 0x1021e: 0x6c0b6220, 0x1021f: 0x4469be20, - 0x10220: 0x6c073a20, 0x10221: 0x42a48c20, 0x10222: 0x6c02bc20, 0x10223: 0x42a4ee20, - 0x10224: 0x446a2a20, 0x10225: 0x6c155820, 0x10226: 0x6c138a20, 0x10227: 0x6c04c820, - 0x10228: 0x6c094620, 0x10229: 0x6c13ba20, 0x1022a: 0x6c18c620, 0x1022b: 0x6c142c20, - 0x1022c: 0x6c18e820, 0x1022d: 0x6c121820, 0x1022e: 0x6c118020, 0x1022f: 0x6c0d4820, - 0x10230: 0x42a6fa20, 0x10231: 0x6c047c20, 0x10232: 0x6c047c20, 0x10233: 0x6c047c20, - 0x10234: 0x48145820, 0x10235: 0x6c023e20, 0x10236: 0x6c042020, 0x10237: 0x6c191020, - 0x10238: 0x4816c620, 0x10239: 0x6c047e20, 0x1023a: 0x6c090020, 0x1023b: 0x42a80c20, - 0x1023c: 0x42a93c20, 0x1023d: 0x6c042220, 0x1023e: 0x6c0f4020, 0x1023f: 0x6c098c20, - // Block 0x409, offset 0x10240 - 0x10240: 0x6c195220, 0x10241: 0x42a9ec20, 0x10242: 0x6c0ff020, 0x10243: 0x6c055c20, - 0x10244: 0x6c198220, 0x10245: 0x6c0c9e20, 0x10246: 0x6c0c9e20, 0x10247: 0x6c199620, - 0x10248: 0x6c040020, 0x10249: 0x42ab6620, 0x1024a: 0x42ab8420, 0x1024b: 0x6c1a2620, - 0x1024c: 0x6c0e1820, 0x1024d: 0x42ae2e20, 0x1024e: 0x42aca220, 0x1024f: 0x6c133420, - 0x10250: 0x6c0c3420, 0x10251: 0x6c0ce420, 0x10252: 0x6c0ade20, 0x10253: 0x6c0b0220, - 0x10254: 0x42b01a20, 0x10255: 0x6c056220, 0x10256: 0x42b06420, 0x10257: 0x6c13be20, - 0x10258: 0x42b15820, 0x10259: 0x4829c820, 0x1025a: 0x6c116c20, 0x1025b: 0x6c0f2620, - 0x1025c: 0x42b20c20, 0x1025d: 0x6c0d7620, 0x1025e: 0x6c14b820, 0x1025f: 0x6c1ace20, - 0x10260: 0x482d5020, 0x10261: 0x482dd420, 0x10262: 0x42b3d820, 0x10263: 0x42b43620, - 0x10264: 0x42b44e20, 0x10265: 0x42b3b020, 0x10266: 0x6c12cc20, 0x10267: 0x446ddc20, - 0x10268: 0x446df820, 0x10269: 0x42b61020, 0x1026a: 0x6c1b3420, 0x1026b: 0x6c1b3420, - 0x1026c: 0x48339020, 0x1026d: 0x6c1b5c20, 0x1026e: 0x42b7b020, 0x1026f: 0x6c10fa20, - 0x10270: 0x6c1b7620, 0x10271: 0x48363020, 0x10272: 0x6c097e20, 0x10273: 0x6c0a6220, - 0x10274: 0x6c101820, 0x10275: 0x6c1b8420, 0x10276: 0x446f0220, 0x10277: 0x6c0fc220, - 0x10278: 0x6c1b9c20, 0x10279: 0x42b98020, 0x1027a: 0x42b91a20, 0x1027b: 0x483bc820, - 0x1027c: 0x42ba8620, 0x1027d: 0x483bcc20, 0x1027e: 0x42badc20, 0x1027f: 0x42bad620, - // Block 0x40a, offset 0x10280 - 0x10280: 0x42baf820, 0x10281: 0x6c0a1420, 0x10282: 0x42bbc420, 0x10283: 0x44705e20, - 0x10284: 0x6c0e0220, 0x10285: 0x42bc5020, 0x10286: 0x6c140620, 0x10287: 0x42bcd220, - 0x10288: 0x4470c420, 0x10289: 0x48430620, 0x1028a: 0x4470f820, 0x1028b: 0x42bd6020, - 0x1028c: 0x42bd6620, 0x1028d: 0x6c0a2820, 0x1028e: 0x6c16de20, 0x1028f: 0x49472420, - 0x10290: 0x6c1c6e20, 0x10291: 0x48466220, 0x10292: 0x48466220, 0x10293: 0x6c286820, - 0x10294: 0x42be4420, 0x10295: 0x42be4420, 0x10296: 0x44718e20, 0x10297: 0x48657020, - 0x10298: 0x48c3b420, 0x10299: 0x6c056620, 0x1029a: 0x6c0ebc20, 0x1029b: 0x4471c620, - 0x1029c: 0x42bf3420, 0x1029d: 0x6c10f020, 0x1029e: 0x6c088020, 0x1029f: 0x42bff220, - 0x102a0: 0x6c1d0220, 0x102a1: 0x44727420, 0x102a2: 0x44723820, 0x102a3: 0x6c022a20, - 0x102a4: 0x484da820, 0x102a5: 0x6c109620, 0x102a6: 0x6c08cc20, 0x102a7: 0x6c06c020, - 0x102a8: 0x6c0b2e20, 0x102a9: 0x6c06c020, 0x102aa: 0x42c2f420, 0x102ab: 0x6c0d3820, - 0x102ac: 0x6c05da20, 0x102ad: 0x6c133820, 0x102ae: 0x42c35e20, 0x102af: 0x42c3bc20, - 0x102b0: 0x6c0ec020, 0x102b1: 0x6c1dac20, 0x102b2: 0x6c0bdc20, 0x102b3: 0x6c1dc620, - 0x102b4: 0x42c4ba20, 0x102b5: 0x6c13cc20, 0x102b6: 0x6c1df220, 0x102b7: 0x6c1e2620, - 0x102b8: 0x48561820, 0x102b9: 0x6c120820, 0x102ba: 0x42c5f820, 0x102bb: 0x6c092c20, - 0x102bc: 0x6c0cf620, 0x102bd: 0x42c7c820, 0x102be: 0x4857e220, 0x102bf: 0x42c84420, - // Block 0x40b, offset 0x102c0 - 0x102c0: 0x42c78a20, 0x102c1: 0x6c014820, 0x102c2: 0x44745c20, 0x102c3: 0x6c145420, - 0x102c4: 0x42c8fc20, 0x102c5: 0x42c93a20, 0x102c6: 0x42c8ee20, 0x102c7: 0x4474d820, - 0x102c8: 0x6c12c020, 0x102c9: 0x6c057620, 0x102ca: 0x48601420, 0x102cb: 0x42cbc620, - 0x102cc: 0x6c0a2e20, 0x102cd: 0x6c1f1420, 0x102ce: 0x44763220, 0x102cf: 0x6c0a2220, - 0x102d0: 0x44761020, 0x102d1: 0x4475c820, 0x102d2: 0x6c141620, 0x102d3: 0x6c183c20, - 0x102d4: 0x6c07a620, 0x102d5: 0x42cd3820, 0x102d6: 0x6c27ec20, 0x102d7: 0x4487b220, - 0x102d8: 0x6c16e220, 0x102d9: 0x6c141020, 0x102da: 0x42ce4220, 0x102db: 0x6c1f7020, - 0x102dc: 0x6c094a20, 0x102dd: 0x48678620, 0x102de: 0x44769220, 0x102df: 0x42cff420, - 0x102e0: 0x6c1f8c20, 0x102e1: 0x42d0a420, 0x102e2: 0x6c116220, 0x102e3: 0x4868da20, - 0x102e4: 0x42d11c20, 0x102e5: 0x42d03e20, 0x102e6: 0x42d22820, 0x102e7: 0x44773a20, - 0x102e8: 0x42d28420, 0x102e9: 0x42d34620, 0x102ea: 0x42d3d420, 0x102eb: 0x42d55020, - 0x102ec: 0x486d4620, 0x102ed: 0x6c051e20, 0x102ee: 0x44783020, 0x102ef: 0x6c08d220, - 0x102f0: 0x48714e20, 0x102f1: 0x6c20f820, 0x102f2: 0x44789c20, 0x102f3: 0x42d6e420, - 0x102f4: 0x42d73e20, 0x102f5: 0x6c082020, 0x102f6: 0x6c028c20, 0x102f7: 0x48751a20, - 0x102f8: 0x483a1620, 0x102f9: 0x4875f420, 0x102fa: 0x6c11ec20, 0x102fb: 0x48797820, - 0x102fc: 0x6c014c20, 0x102fd: 0x42d99a20, 0x102fe: 0x42d8ce20, 0x102ff: 0x42da2c20, - // Block 0x40c, offset 0x10300 - 0x10300: 0x6c113620, 0x10301: 0x6c023c20, 0x10302: 0x6c162420, 0x10303: 0x6c06dc20, - 0x10304: 0x6c0b3a20, 0x10305: 0x6c21a620, 0x10306: 0x487a3c20, 0x10307: 0x42da6820, - 0x10308: 0x6c06de20, 0x10309: 0x6c21d220, 0x1030a: 0x447a6620, 0x1030b: 0x6c08d420, - 0x1030c: 0x42dd8e20, 0x1030d: 0x487da220, 0x1030e: 0x6c21a820, 0x1030f: 0x6c0ec820, - 0x10310: 0x487ebc20, 0x10311: 0x487f1c20, 0x10312: 0x6c226020, 0x10313: 0x42e07220, - 0x10314: 0x6c109020, 0x10315: 0x6c228220, 0x10316: 0x447b2c20, 0x10317: 0x42e09420, - 0x10318: 0x6c07bc20, 0x10319: 0x42e0ee20, 0x1031a: 0x6c0e2820, 0x1031b: 0x480a4a20, - 0x1031c: 0x42e28a20, 0x1031d: 0x4884c620, 0x1031e: 0x42e33820, 0x1031f: 0x48875620, - 0x10320: 0x6c22f620, 0x10321: 0x6c094e20, 0x10322: 0x42e4a020, 0x10323: 0x488c1020, - 0x10324: 0x6c07c020, 0x10325: 0x42e52a20, 0x10326: 0x488e6a20, 0x10327: 0x48902820, - 0x10328: 0x6c236220, 0x10329: 0x6c018420, 0x1032a: 0x447d5820, 0x1032b: 0x42e74a20, - 0x1032c: 0x447d7020, 0x1032d: 0x447d7020, 0x1032e: 0x42e88e20, 0x1032f: 0x6c238c20, - 0x10330: 0x42e8e220, 0x10331: 0x42e90a20, 0x10332: 0x6c23a020, 0x10333: 0x447e3620, - 0x10334: 0x42ea4820, 0x10335: 0x48986c20, 0x10336: 0x42ea7c20, 0x10337: 0x48992420, - 0x10338: 0x6c007620, 0x10339: 0x48433e20, 0x1033a: 0x42ec2020, 0x1033b: 0x489f4220, - 0x1033c: 0x489f7020, 0x1033d: 0x48a08820, 0x1033e: 0x447ff820, 0x1033f: 0x44801020, - // Block 0x40d, offset 0x10340 - 0x10340: 0x6c0eec20, 0x10341: 0x48a1e620, 0x10342: 0x48a1e420, 0x10343: 0x48a23220, - 0x10344: 0x48a26620, 0x10345: 0x6c24a820, 0x10346: 0x6c0b4220, 0x10347: 0x6c0b4220, - 0x10348: 0x42ee9420, 0x10349: 0x44807220, 0x1034a: 0x6c24c820, 0x1034b: 0x44808c20, - 0x1034c: 0x44812c20, 0x1034d: 0x48a83a20, 0x1034e: 0x42f09c20, 0x1034f: 0x6c250420, - 0x10350: 0x42f19820, 0x10351: 0x4481c620, 0x10352: 0x48ac4c20, 0x10353: 0x6c0cc420, - 0x10354: 0x48ad3420, 0x10355: 0x48ad8a20, 0x10356: 0x6c131a20, 0x10357: 0x42f3d620, - 0x10358: 0x44825e20, 0x10359: 0x6c074020, 0x1035a: 0x42f49420, 0x1035b: 0x6c01ac20, - 0x1035c: 0x48b2f820, 0x1035d: 0x48b54e20, 0x1035e: 0x48b54e20, 0x1035f: 0x42f5dc20, - 0x10360: 0x44840420, 0x10361: 0x48b75620, 0x10362: 0x6c261820, 0x10363: 0x6c0e6a20, - 0x10364: 0x44844e20, 0x10365: 0x48b90020, 0x10366: 0x6c268420, 0x10367: 0x44854020, - 0x10368: 0x42f9d020, 0x10369: 0x42f9c620, 0x1036a: 0x6c03c020, 0x1036b: 0x48bf0c20, - 0x1036c: 0x6c26bc20, 0x1036d: 0x44860220, 0x1036e: 0x6c26d220, 0x1036f: 0x42fc0420, - 0x10370: 0x42fc8a20, 0x10371: 0x44866820, 0x10372: 0x48c45020, 0x10373: 0x48c48e20, - 0x10374: 0x4486b220, 0x10375: 0x48c5b220, 0x10376: 0x42fef420, 0x10377: 0x48c67c20, - 0x10378: 0x42ff2a20, 0x10379: 0x42fff420, 0x1037a: 0x6c093820, 0x1037b: 0x48c9b420, - 0x1037c: 0x48ca4620, 0x1037d: 0x4300c020, 0x1037e: 0x48cb5020, 0x1037f: 0x6c27d620, - // Block 0x40e, offset 0x10380 - 0x10380: 0x4866be20, 0x10381: 0x4487aa20, 0x10382: 0x6c009220, 0x10383: 0x43020620, - 0x10384: 0x44881620, 0x10385: 0x6c281420, 0x10386: 0x42b56a20, 0x10387: 0x48cf4e20, - 0x10388: 0x48cf6a20, 0x10389: 0x48672620, 0x1038a: 0x48673820, 0x1038b: 0x6c286820, - 0x1038c: 0x43040820, 0x1038d: 0x6c08ea20, 0x1038e: 0x4488d620, 0x1038f: 0x43052220, - 0x10390: 0x6c00a420, 0x10391: 0x6c091e20, 0x10392: 0x42a56620, 0x10393: 0x6c01e420, - 0x10394: 0x6c13e220, 0x10395: 0x6c020c20, 0x10396: 0x6c050020, 0x10397: 0x48d67820, - 0x10398: 0x6c095620, 0x10399: 0x43063a20, 0x1039a: 0x4306c620, 0x1039b: 0x43075a20, - 0x1039c: 0x6c28f220, 0x1039d: 0x6c292820, 0x1039e: 0x4307ce20, 0x1039f: 0x6c0ea420, - 0x103a0: 0x4306a620, 0x103a1: 0x6c03f820, 0x103a2: 0x6c04e220, 0x103a3: 0x6c07cc20, - 0x103a4: 0x48d86c20, 0x103a5: 0x48dad620, 0x103a6: 0x48d9aa20, 0x103a7: 0x448a5620, - 0x103a8: 0x4309e220, 0x103a9: 0x4309e620, 0x103aa: 0x430a2c20, 0x103ab: 0x48e79420, - 0x103ac: 0x430ac820, 0x103ad: 0x48de5820, 0x103ae: 0x448aba20, 0x103af: 0x448ac220, - 0x103b0: 0x48df6220, 0x103b1: 0x48e1a420, 0x103b2: 0x448ad620, 0x103b3: 0x6c041420, - 0x103b4: 0x6c163c20, 0x103b5: 0x6c29de20, 0x103b6: 0x430cd220, 0x103b7: 0x6c29e620, - 0x103b8: 0x430d1020, 0x103b9: 0x430e1c20, 0x103ba: 0x430dc420, 0x103bb: 0x430ef220, - 0x103bc: 0x430e5020, 0x103bd: 0x430ed620, 0x103be: 0x430f0c20, 0x103bf: 0x448bae20, - // Block 0x40f, offset 0x103c0 - 0x103c0: 0x430fc220, 0x103c1: 0x43100220, 0x103c2: 0x448bf220, 0x103c3: 0x4310c020, - 0x103c4: 0x6c008220, 0x103c5: 0x48ecce20, 0x103c6: 0x4311ae20, 0x103c7: 0x4311bc20, - 0x103c8: 0x448c6a20, 0x103c9: 0x4311f420, 0x103ca: 0x44697620, 0x103cb: 0x48f15c20, - 0x103cc: 0x48f2cc20, 0x103cd: 0x448d7c20, 0x103ce: 0x448d8e20, 0x103cf: 0x6c0bfe20, - 0x103d0: 0x6c154e20, 0x103d1: 0x6c1ede20, 0x103d2: 0x6c2be420, 0x103d3: 0x48f95020, - 0x103d4: 0x6c035620, 0x103d5: 0x6c2c1220, 0x103d6: 0x431a3620, 0x103d7: 0x6c03ca20, - 0x103d8: 0x48fe5e20, 0x103d9: 0x48100820, 0x103da: 0x6c2c5420, 0x103db: 0x431b7820, - 0x103dc: 0x431be020, 0x103dd: 0x4811bc20, 0x103de: 0x431da820, 0x103df: 0x6c155020, - 0x103e0: 0x490ba420, 0x103e1: 0x490bda20, 0x103e2: 0x43212820, 0x103e3: 0x4321e220, - 0x103e4: 0x43222220, 0x103e5: 0x490e5c20, 0x103e6: 0x43223620, 0x103e7: 0x43247020, - 0x103e8: 0x4325ae20, 0x103e9: 0x4325b020, 0x103ea: 0x4324f820, 0x103eb: 0x4327f220, - 0x103ec: 0x43282a20, 0x103ed: 0x4917f420, 0x103ee: 0x6c024a20, 0x103ef: 0x44932a20, - 0x103f0: 0x432b6e20, 0x103f1: 0x491aee20, 0x103f2: 0x4493cc20, 0x103f3: 0x432d8620, - 0x103f4: 0x42bb6420, 0x103f5: 0x432e4620, 0x103f6: 0x49228a20, 0x103f7: 0x49243420, - 0x103f8: 0x4494dc20, 0x103f9: 0x4494ec20, 0x103fa: 0x432fc020, 0x103fb: 0x49281420, - 0x103fc: 0x44956420, 0x103fd: 0x49292c20, 0x103fe: 0x43301620, 0x103ff: 0x43301620, - // Block 0x410, offset 0x10400 - 0x10400: 0x43305220, 0x10401: 0x492b6c20, 0x10402: 0x6c03d020, 0x10403: 0x44966620, - 0x10404: 0x43325220, 0x10405: 0x43334e20, 0x10406: 0x43338420, 0x10407: 0x4333fc20, - 0x10408: 0x44979c20, 0x10409: 0x49366020, 0x1040a: 0x43362420, 0x1040b: 0x43388020, - 0x1040c: 0x4339fa20, 0x1040d: 0x44999c20, 0x1040e: 0x4499da20, 0x1040f: 0x433ace20, - 0x10410: 0x49419c20, 0x10411: 0x4499f020, 0x10412: 0x49420a20, 0x10413: 0x49441c20, - 0x10414: 0x49452220, 0x10415: 0x6c145a20, 0x10416: 0x449aac20, 0x10417: 0x6c316420, - 0x10418: 0x433dfc20, 0x10419: 0x433e0a20, 0x1041a: 0x433e1e20, 0x1041b: 0x433e2c20, - 0x1041c: 0x6c125e20, 0x1041d: 0x494c0020, - // Block 0x411, offset 0x10440 - 0x10440: 0xe00014bd, 0x10441: 0x0033b483, 0x10442: 0x00339688, 0x10443: 0x0033a288, - 0x10444: 0x0033c288, 0x10445: 0x0033fc88, 0x10446: 0xca490071, 0x10447: 0x00343688, - 0x10448: 0x00344688, 0x10449: 0x00349a88, 0x1044a: 0x0034e488, 0x1044b: 0x00356288, - 0x1044c: 0x00356a88, 0x1044d: 0xe00014cf, 0x1044e: 0x00357a88, 0x1044f: 0x00365488, - 0x10450: 0xc0090041, 0x10451: 0x00335288, 0x10452: 0x00335a88, 0x10453: 0xc0130092, - 0x10454: 0x00338a88, 0x10455: 0xc34c0041, 0x10456: 0xc01c0071, 0x10457: 0xc0200071, - 0x10458: 0xc0250041, 0x10459: 0x00343e88, 0x1045a: 0xc0370092, 0x1045b: 0x00348488, - 0x1045c: 0x0034a888, 0x1045d: 0x0034ba88, 0x1045e: 0xc02e0071, 0x1045f: 0x00350e88, - 0x10460: 0x00352888, 0x10461: 0x00353a88, 0x10462: 0x00354c88, 0x10463: 0xc03e00f1, - 0x10464: 0x0035ac88, 0x10465: 0x0035b488, 0x10466: 0x00360288, 0x10467: 0xc0440071, - 0x10468: 0x00365c88, 0x10469: 0x00366688, 0x1046a: 0x00367488, 0x1046b: 0xc0480071, - 0x1046c: 0x00368e88, 0x1046d: 0xc04c0071, 0x1046e: 0x0036b888, 0x1046f: 0x0036c488, - 0x10470: 0xc0060041, 0x10471: 0x40335220, 0x10472: 0x40335a20, 0x10473: 0xc0100092, - 0x10474: 0x40338a20, 0x10475: 0xc3490041, 0x10476: 0xc01a0071, 0x10477: 0xc01e0071, - 0x10478: 0xc0220041, 0x10479: 0x40343e20, 0x1047a: 0xc0340092, 0x1047b: 0x40348420, - 0x1047c: 0x4034a820, 0x1047d: 0x4034ba20, 0x1047e: 0xc02c0071, 0x1047f: 0x40350e20, - // Block 0x412, offset 0x10480 - 0x10480: 0x40352820, 0x10481: 0x40353a20, 0x10482: 0x40354c20, 0x10483: 0xc03a00f1, - 0x10484: 0x4035ac20, 0x10485: 0x4035b420, 0x10486: 0x40360220, 0x10487: 0xc0420071, - 0x10488: 0x40365c20, 0x10489: 0x40366620, 0x1048a: 0x40367420, 0x1048b: 0xc0460071, - 0x1048c: 0x40368e20, 0x1048d: 0xc04a0071, 0x1048e: 0x4036b820, 0x1048f: 0x4036c420, - 0x10490: 0xe00014ba, 0x10491: 0x4033b420, 0x10492: 0x40339620, 0x10493: 0x4033a220, - 0x10494: 0x4033c220, 0x10495: 0x4033fc20, 0x10496: 0xca470071, 0x10497: 0x40343620, - 0x10498: 0x40344620, 0x10499: 0x40349a20, 0x1049a: 0x4034e420, 0x1049b: 0x40356220, - 0x1049c: 0x40356a20, 0x1049d: 0xe00014cc, 0x1049e: 0x40357a20, 0x1049f: 0x40365420, - 0x104a0: 0x0035e088, 0x104a1: 0x4035e020, 0x104a2: 0x00369e88, 0x104a3: 0x40369e20, - 0x104a4: 0x0036ce88, 0x104a5: 0x4036ce20, 0x104a6: 0x0036d688, 0x104a7: 0x4036d620, - 0x104a8: 0x0036ea88, 0x104a9: 0x4036ea20, 0x104aa: 0x0036e088, 0x104ab: 0x4036e020, - 0x104ac: 0x0036f488, 0x104ad: 0x4036f420, 0x104ae: 0x0036fc88, 0x104af: 0x4036fc20, - 0x104b0: 0x00370488, 0x104b1: 0x40370420, 0x104b2: 0x00370c88, 0x104b3: 0x40370c20, - 0x104b4: 0xc0500131, 0x104b5: 0xc04e0131, 0x104b6: 0x00371c88, 0x104b7: 0x40371c20, - 0x104b8: 0x0035a488, 0x104b9: 0x4035a420, 0x104ba: 0x0035fa88, 0x104bb: 0x4035fa20, - 0x104bc: 0x0035f288, 0x104bd: 0x4035f220, 0x104be: 0x0035e888, 0x104bf: 0x4035e820, - // Block 0x413, offset 0x104c0 - 0x104c0: 0x00352088, 0x104c1: 0x40352020, 0x104c2: 0x40070620, 0x104c3: 0xae608302, - 0x104c4: 0xae605f02, 0x104c5: 0xae602a02, 0x104c6: 0xae602202, 0x104c7: 0xae605f02, - 0x104c8: 0xa0000000, 0x104c9: 0xa0000000, 0x104ca: 0x00341c88, 0x104cb: 0x40341c20, - 0x104cc: 0x00369688, 0x104cd: 0x40369620, 0x104ce: 0x00353088, 0x104cf: 0x40353020, - 0x104d0: 0xe00014b7, 0x104d1: 0xe00014b4, 0x104d2: 0x00336a88, 0x104d3: 0x40336a20, - 0x104d4: 0x00337a88, 0x104d5: 0x40337a20, 0x104d6: 0x0033dc88, 0x104d7: 0x4033dc20, - 0x104d8: 0x0033aa88, 0x104d9: 0x4033aa20, 0x104da: 0x00345888, 0x104db: 0x40345820, - 0x104dc: 0x00347888, 0x104dd: 0x40347820, 0x104de: 0x00347088, 0x104df: 0x40347020, - 0x104e0: 0x00346888, 0x104e1: 0x40346820, 0x104e2: 0x0034ca88, 0x104e3: 0x4034ca20, - 0x104e4: 0x0034dc88, 0x104e5: 0x4034dc20, 0x104e6: 0x00351888, 0x104e7: 0x40351820, - 0x104e8: 0x00372688, 0x104e9: 0x40372620, 0x104ea: 0x00354488, 0x104eb: 0x40354420, - 0x104ec: 0x00355888, 0x104ed: 0x40355820, 0x104ee: 0x00359c83, 0x104ef: 0x40359c20, - 0x104f0: 0x00359a88, 0x104f1: 0x40359a20, 0x104f2: 0x0035cc88, 0x104f3: 0x4035cc20, - 0x104f4: 0x00360e88, 0x104f5: 0x40360e20, 0x104f6: 0x00362a88, 0x104f7: 0x40362a20, - 0x104f8: 0x00363a88, 0x104f9: 0x40363a20, 0x104fa: 0x0035d488, 0x104fb: 0x4035d420, - 0x104fc: 0x00364488, 0x104fd: 0x40364420, 0x104fe: 0x00364c88, 0x104ff: 0x40364c20, - // Block 0x414, offset 0x10500 - 0x10500: 0xa0000000, 0x10501: 0xa0000000, 0x10502: 0xa0000000, 0x10503: 0xa0000000, - 0x10504: 0xa0000000, 0x10505: 0xa0000000, 0x10506: 0xa0000000, 0x10507: 0xa0000000, - 0x10508: 0xa0000000, 0x10509: 0x40020020, 0x1050a: 0x40020220, 0x1050b: 0x40020420, - 0x1050c: 0x40020620, 0x1050d: 0x40020820, 0x1050e: 0xa0000000, 0x1050f: 0xa0000000, - 0x10510: 0xa0000000, 0x10511: 0xa0000000, 0x10512: 0xa0000000, 0x10513: 0xa0000000, - 0x10514: 0xa0000000, 0x10515: 0xa0000000, 0x10516: 0xa0000000, 0x10517: 0xa0000000, - 0x10518: 0xa0000000, 0x10519: 0xa0000000, 0x1051a: 0xa0000000, 0x1051b: 0xa0000000, - 0x1051c: 0xa0000000, 0x1051d: 0xa0000000, 0x1051e: 0xa0000000, 0x1051f: 0xa0000000, - 0x10520: 0x40021220, 0x10521: 0x4002ba20, 0x10522: 0x4003e020, 0x10523: 0x4004ea20, - 0x10524: 0x4027de20, 0x10525: 0x4004ec20, 0x10526: 0x4004e620, 0x10527: 0x4003d220, - 0x10528: 0x4003f420, 0x10529: 0x4003f620, 0x1052a: 0x4004d820, 0x1052b: 0x40093820, - 0x1052c: 0x40024020, 0x1052d: 0x40021a20, 0x1052e: 0x4002e420, 0x1052f: 0x4004e220, - 0x10530: 0x4029cc20, 0x10531: 0x4029ce20, 0x10532: 0x4029d020, 0x10533: 0x4029d220, - 0x10534: 0x4029d420, 0x10535: 0x4029d620, 0x10536: 0x4029d820, 0x10537: 0x4029da20, - 0x10538: 0x4029dc20, 0x10539: 0x4029de20, 0x1053a: 0x40026c20, 0x1053b: 0x40026220, - 0x1053c: 0x40094020, 0x1053d: 0x40094220, 0x1053e: 0x40094420, 0x1053f: 0x4002c420, - // Block 0x415, offset 0x10540 - 0x10540: 0x4004d620, 0x10541: 0xca5027b1, 0x10542: 0x002c0a88, 0x10543: 0x002c3a88, - 0x10544: 0x002c6288, 0x10545: 0xc39e0be1, 0x10546: 0x002d0888, 0x10547: 0x002d2288, - 0x10548: 0x002d6888, 0x10549: 0x002d9a88, 0x1054a: 0x002dcc88, 0x1054b: 0xca4b3b11, - 0x1054c: 0xc0030002, 0x1054d: 0x002e8288, 0x1054e: 0x002e9e88, 0x1054f: 0xc3a30b21, - 0x10550: 0x002f2c88, 0x10551: 0x002f5688, 0x10552: 0x002f7a88, 0x10553: 0x002fe688, - 0x10554: 0x00302c88, 0x10555: 0xc3900b21, 0x10556: 0x0030be88, 0x10557: 0x0030e288, - 0x10558: 0x0030f688, 0x10559: 0x00310088, 0x1055a: 0x00312a88, 0x1055b: 0x4003f820, - 0x1055c: 0x4004e420, 0x1055d: 0x4003fa20, 0x1055e: 0x40062420, 0x1055f: 0x40021620, - 0x10560: 0x40061e20, 0x10561: 0xca4d27b1, 0x10562: 0x402c0a20, 0x10563: 0x402c3a20, - 0x10564: 0x402c6220, 0x10565: 0xc39c0be1, 0x10566: 0x402d0820, 0x10567: 0x402d2220, - 0x10568: 0x402d6820, 0x10569: 0x402d9a20, 0x1056a: 0x402dcc20, 0x1056b: 0x402dfe20, - 0x1056c: 0xc0000002, 0x1056d: 0x402e8220, 0x1056e: 0x402e9e20, 0x1056f: 0xc3a00b21, - 0x10570: 0x402f2c20, 0x10571: 0x402f5620, 0x10572: 0x402f7a20, 0x10573: 0x402fe620, - 0x10574: 0x40302c20, 0x10575: 0xc38d0b21, 0x10576: 0x4030be20, 0x10577: 0x4030e220, - 0x10578: 0x4030f620, 0x10579: 0x40310020, 0x1057a: 0x40312a20, 0x1057b: 0x4003fc20, - 0x1057c: 0x40094820, 0x1057d: 0x4003fe20, 0x1057e: 0x40094c20, 0x1057f: 0xa0000000, - // Block 0x416, offset 0x10580 - 0x10580: 0xe0000983, 0x10581: 0xe0000980, 0x10582: 0xe00008fb, 0x10583: 0xe00008f8, - 0x10584: 0xe000097d, 0x10585: 0xe000097a, 0x10586: 0xe0000a38, 0x10587: 0xe0000a35, - 0x10588: 0xe0000a3e, 0x10589: 0xe0000a3b, 0x1058a: 0xe0000a4a, 0x1058b: 0xe0000a47, - 0x1058c: 0xe0000a44, 0x1058d: 0xe0000a41, 0x1058e: 0xe0000a86, 0x1058f: 0xe0000a83, - 0x10590: 0x002c62a3, 0x10591: 0x402c6221, 0x10592: 0xe0000b46, 0x10593: 0xe0000b43, - 0x10594: 0xe0000aee, 0x10595: 0xe0000aeb, 0x10596: 0xe0000b2c, 0x10597: 0xe0000b29, - 0x10598: 0x00320cc3, 0x10599: 0x40320c22, 0x1059a: 0xe0000b1a, 0x1059b: 0xe0000b17, - 0x1059c: 0xe0000bb8, 0x1059d: 0xe0000bb5, 0x1059e: 0xe0000bb2, 0x1059f: 0xe0000baf, - 0x105a0: 0xe0000bc4, 0x105a1: 0xe0000bc1, 0x105a2: 0xe0000bca, 0x105a3: 0xe0000bc7, - 0x105a4: 0xe0000bee, 0x105a5: 0xe0000beb, 0x105a6: 0xe0000c1b, 0x105a7: 0xe0000c18, - 0x105a8: 0xe0000c51, 0x105a9: 0xe0000c4e, 0x105aa: 0xe0000c60, 0x105ab: 0xe0000c5d, - 0x105ac: 0xe0000c31, 0x105ad: 0xe0000c2e, 0x105ae: 0xe0000c5a, 0x105af: 0xe0000c57, - 0x105b0: 0xe0000c54, 0x105b1: 0x402da220, 0x105b2: 0xf0000a0a, 0x105b3: 0xf0000404, - 0x105b4: 0xe0000c8a, 0x105b5: 0xe0000c87, 0x105b6: 0xe0000c9f, 0x105b7: 0xe0000c9c, - 0x105b8: 0x402f5621, 0x105b9: 0xe0000ccc, 0x105ba: 0xe0000cc9, 0x105bb: 0xe0000cd8, - 0x105bc: 0xe0000cd5, 0x105bd: 0xe0000cd2, 0x105be: 0xe0000ccf, 0x105bf: 0xe0000d04, - // Block 0x417, offset 0x105c0 - 0x105c0: 0xca533b21, 0x105c1: 0xca553b21, 0x105c2: 0xca573b21, 0x105c3: 0xca593b21, - 0x105c4: 0xca5b3b21, 0x105c5: 0xca5d3b21, 0x105c6: 0xca5f3b21, 0x105c7: 0xca613b21, - 0x105c8: 0xca633b21, 0x105c9: 0xca653b21, 0x105ca: 0xca673b21, 0x105cb: 0xca693b21, - 0x105cc: 0xca6b3b21, 0x105cd: 0xca6d3b21, 0x105ce: 0xca6f3b21, 0x105cf: 0xca713b21, - 0x105d0: 0xca733b21, 0x105d1: 0xca753b21, 0x105d2: 0xca773b21, 0x105d3: 0xca793b21, - 0x105d4: 0xca7b3b21, 0x105d5: 0xca7d3b21, 0x105d6: 0xca7f3b21, 0x105d7: 0xca813b21, - 0x105d8: 0xca833b21, 0x105d9: 0xca853b21, 0x105da: 0xca873b21, 0x105db: 0xca8b3b21, - 0x105dc: 0xca913b21, 0x105dd: 0xca953b21, 0x105de: 0xca973b21, 0x105df: 0xca993b21, - 0x105e0: 0xca9b3b21, 0x105e1: 0xca9d3b21, 0x105e2: 0xca9f3b21, 0x105e3: 0xca9f3b21, - 0x105e4: 0xe000413a, 0x105e5: 0xe000413d, 0x105e6: 0xe0004140, 0x105e7: 0xe0004143, - 0x105e8: 0xe0004146, 0x105e9: 0xe000414a, 0x105ea: 0xe000414d, 0x105eb: 0xca893b21, - 0x105ec: 0xca8d3b21, 0x105ed: 0xca8f3b21, 0x105ee: 0xca933b21, 0x105ef: 0xe0004151, - 0x105f0: 0xe0004154, 0x105f1: 0xe0004157, 0x105f2: 0xe000415a, 0x105f3: 0xe000415d, - 0x105f4: 0xa0000000, 0x105f5: 0xa0000000, 0x105f6: 0xcaa43b81, 0x105f7: 0xcaa63bb1, - 0x105f8: 0x40501220, 0x105f9: 0x40501420, 0x105fa: 0x40501620, 0x105fb: 0xcaa13b51, - 0x105fc: 0x40501a20, 0x105fd: 0x40501c20, 0x105fe: 0x40501e20, 0x105ff: 0x40502020, - // Block 0x418, offset 0x10600 - 0x10600: 0x40502220, 0x10601: 0xcaa83bb1, 0x10602: 0x40502620, 0x10603: 0x40502820, - 0x10604: 0xcaaa3bb1, 0x10605: 0x40502c20, 0x10606: 0x40503020, 0x10607: 0x40503420, - 0x10608: 0xadc11802, 0x10609: 0xadc11b02, 0x1060a: 0xadc11c02, 0x1060b: 0xadc11a02, - 0x1060c: 0xa0005f02, 0x1060d: 0xadc11d02, 0x1060e: 0xadc11402, 0x1060f: 0xadc11502, - 0x10610: 0xadc11702, 0x10611: 0xadc11602, 0x10612: 0x82092817, 0x10613: 0xa0000000, - 0x10614: 0x40032620, 0x10615: 0x40032820, 0x10616: 0x4002ac20, 0x10617: 0x4027bc20, - 0x10618: 0xe000409a, 0x10619: 0x4005be20, 0x1061a: 0x4005c020, 0x1061b: 0x4027f620, - 0x1061c: 0x404fea20, 0x1061d: 0xadc11902, - 0x10620: 0xe00001b5, 0x10621: 0xe0000249, 0x10622: 0xe0000361, 0x10623: 0xe000043b, - 0x10624: 0xe0000510, 0x10625: 0xe00005da, 0x10626: 0xe00006a5, 0x10627: 0xe000074d, - 0x10628: 0xe00007f9, 0x10629: 0xe000089e, - 0x10630: 0xe00001b8, 0x10631: 0xe000024c, 0x10632: 0xe0000364, 0x10633: 0xe000043e, - 0x10634: 0xe0000513, 0x10635: 0xe00005dd, 0x10636: 0xe00006a8, 0x10637: 0xe0000750, - 0x10638: 0xe00007fc, 0x10639: 0xe00008a1, - // Block 0x419, offset 0x10640 - 0x10642: 0x40439020, 0x10643: 0x40439220, - 0x10645: 0x40437020, 0x10646: 0x40437220, 0x10647: 0x40437420, - 0x10648: 0x40437620, 0x10649: 0x40437820, 0x1064a: 0x40437a20, 0x1064b: 0x40437c20, - 0x1064c: 0x40438020, 0x1064e: 0x40438420, 0x1064f: 0x40438620, - 0x10650: 0x40438820, 0x10652: 0x40438a20, 0x10653: 0x40438c20, - 0x10654: 0x40438e20, 0x10655: 0x40439020, 0x10656: 0x40439220, 0x10657: 0x40439420, - 0x10658: 0x40439620, 0x10659: 0x40439820, 0x1065a: 0x40439a20, 0x1065b: 0x40439c20, - 0x1065c: 0x40439e20, 0x1065d: 0x4043a020, 0x1065e: 0x4043a220, 0x1065f: 0x4043a420, - 0x10660: 0x4043a620, 0x10661: 0x4043a820, 0x10662: 0x4043aa20, 0x10663: 0x4043ac20, - 0x10664: 0x4043ae20, 0x10665: 0x4043b020, 0x10666: 0x4043b220, 0x10667: 0x4043b420, - 0x10668: 0x4043b620, 0x1066a: 0x4043b820, 0x1066b: 0x4043ba20, - 0x1066c: 0x4043bc20, 0x1066d: 0x4043be20, 0x1066e: 0x4043c020, 0x1066f: 0x4043c220, - 0x10670: 0x4043c420, 0x10671: 0x4043c620, 0x10672: 0x4043c820, 0x10673: 0x4043d420, - 0x10675: 0x4043ca20, 0x10676: 0x4043cc20, 0x10677: 0x4043ce20, - 0x10678: 0x4043d020, 0x10679: 0x4043d220, - 0x1067c: 0xa070f102, 0x1067d: 0x4043d820, 0x1067e: 0x4043de20, 0x1067f: 0xc06a0311, - // Block 0x41a, offset 0x10680 - 0x10680: 0x4043e220, 0x10681: 0x4043e420, 0x10682: 0x4043e620, 0x10683: 0x4043e820, - 0x10684: 0x4043ea20, 0x10686: 0xc06c0341, 0x10687: 0x4043f220, - 0x10688: 0x4043f420, 0x1068a: 0xc0710311, 0x1068b: 0x4043f820, - 0x1068c: 0x4043fa20, 0x1068d: 0x820921fe, - 0x10695: 0x4043fe20, 0x10696: 0x40440020, - 0x1069e: 0x4043d620, - 0x106a0: 0x40437e20, 0x106a1: 0x40438220, 0x106a2: 0x4043ec20, 0x106a3: 0x4043ee20, - 0x106a6: 0xe0000182, 0x106a7: 0xe0000213, - 0x106a8: 0xe000032e, 0x106a9: 0xe0000408, 0x106aa: 0xe00004dd, 0x106ab: 0xe00005a7, - 0x106ac: 0xe0000672, 0x106ad: 0xe000071a, 0x106ae: 0xe00007c6, 0x106af: 0xe000086b, - 0x106b1: 0x40439420, 0x106b2: 0x40439620, - // Block 0x41b, offset 0x106c0 - 0x106c0: 0xf0000404, 0x106c1: 0xf0000404, 0x106c2: 0xf0000404, 0x106c3: 0xf0000404, - 0x106c4: 0xf0000404, 0x106c5: 0xf0000404, 0x106c6: 0xf0000404, 0x106c7: 0xf0000404, - 0x106c8: 0xf0000404, 0x106c9: 0xf0000404, 0x106ca: 0xf0000404, 0x106cb: 0xf0000404, - 0x106cc: 0xf0000404, 0x106cd: 0xf0000404, 0x106ce: 0xe000004c, 0x106cf: 0xe0000051, - 0x106d0: 0xe0000056, 0x106d1: 0xe000005b, 0x106d2: 0xe0000060, 0x106d3: 0xe0000065, - 0x106d4: 0xe000006a, 0x106d5: 0xe000006f, 0x106d6: 0xe0000083, 0x106d7: 0xe000008d, - 0x106d8: 0xe0000092, 0x106d9: 0xe0000097, 0x106da: 0xe000009c, 0x106db: 0xe00000a1, - 0x106dc: 0xe0000088, 0x106dd: 0xe0000074, 0x106de: 0xe000007c, - 0x106e0: 0xe0002c96, 0x106e1: 0xe0002ca6, 0x106e2: 0xe0002c9e, 0x106e3: 0xe0002cd6, - 0x106e4: 0xe0002caa, 0x106e5: 0xe0002cbe, 0x106e6: 0xe0002c9a, 0x106e7: 0xe0002cba, - 0x106e8: 0xe0002ca2, 0x106e9: 0xe0002cc6, 0x106ea: 0xe0002ce6, 0x106eb: 0xe0002cfa, - 0x106ec: 0xe0002cf6, 0x106ed: 0xe0002cee, 0x106ee: 0xe0002d22, 0x106ef: 0xe0002cda, - 0x106f0: 0xe0002ce2, 0x106f1: 0xe0002cf2, 0x106f2: 0xe0002cea, 0x106f3: 0xe0002d06, - 0x106f4: 0xe0002cce, 0x106f5: 0xe0002cfe, 0x106f6: 0xe0002d1a, 0x106f7: 0xe0002d0a, - 0x106f8: 0xf0000404, 0x106f9: 0xe0002cae, 0x106fa: 0xe0002cd2, 0x106fb: 0xf0000404, - 0x106fc: 0xe0002d02, 0x106fd: 0xe0002cb2, 0x106fe: 0xe0002d1e, 0x106ff: 0xe0002cca, - // Block 0x41c, offset 0x10700 - 0x10700: 0xe0008556, 0x10701: 0xe0008b49, 0x10703: 0xe0009a4a, - 0x10707: 0xe0005e27, - 0x10708: 0xe000871e, 0x10709: 0xe0006c4c, 0x1070a: 0xe0006ca0, 0x1070b: 0xe0009fed, - 0x1070d: 0xe0006789, - 0x10711: 0xe00098b6, - 0x10714: 0xe0009245, 0x10715: 0xe0006948, 0x10716: 0xe0007018, - 0x10718: 0xe0004c4a, 0x10719: 0xe0006618, - 0x1071e: 0xe00073be, 0x1071f: 0xe0008f07, - 0x10726: 0xe000665c, - 0x1072b: 0xe00075de, - 0x1072d: 0xe0008fe1, - 0x10730: 0xe0006771, 0x10731: 0xe0004a99, 0x10732: 0xe00049e6, - 0x10738: 0xe000a5b0, 0x10739: 0xe000532a, 0x1073b: 0xe0008e8f, - // Block 0x41d, offset 0x10740 - 0x10742: 0xe0007be3, 0x10743: 0xe0005214, - 0x10745: 0xe0004c4d, - 0x1074b: 0xe0009055, - 0x1074d: 0xe0006ad3, 0x1074e: 0xe000a418, 0x1074f: 0xe0009fe1, - 0x10756: 0xe0004b72, - 0x10758: 0xe00073c2, 0x10759: 0xe00083a6, - 0x1075d: 0xe0004c50, 0x1075e: 0xe0004554, 0x1075f: 0xe0007800, - 0x10767: 0xe0005708, - 0x1076b: 0xe00042b4, - 0x1076c: 0xe0004564, 0x1076d: 0xe0005621, - 0x10773: 0xe000820f, - 0x10776: 0xe000672d, 0x10777: 0xe0006c38, - 0x1077c: 0xe0008fdd, 0x1077e: 0xe000450c, - // Block 0x41e, offset 0x10780 - 0x10782: 0xe00057ab, - 0x10786: 0xe0005b9b, - 0x10788: 0xe00079b1, 0x1078b: 0xe0006ad6, - 0x1078c: 0xe0008459, 0x1078e: 0xe0007fc6, 0x1078f: 0xe0008026, - 0x10790: 0xe00080da, 0x10791: 0xe000808a, 0x10792: 0xe000a41b, - 0x10794: 0xe0007c58, 0x10795: 0xe0008b4d, - 0x10798: 0xe0005033, 0x10799: 0xe0005043, 0x1079b: 0xe0006ad9, - 0x1079e: 0xe00075a8, 0x1079f: 0xe0004f43, - 0x107a1: 0xe0005ebb, 0x107a2: 0xe000a13f, - 0x107a4: 0xe0004bc6, 0x107a5: 0xe000a18f, 0x107a6: 0xe00079db, - 0x107a8: 0xe000a381, 0x107ab: 0xe000a20e, - 0x107ac: 0xe0004695, 0x107ad: 0xe0008b51, 0x107ae: 0xe0005891, - 0x107b3: 0xe000630c, - 0x107b4: 0xe0008029, 0x107b6: 0xe000532e, - 0x107b9: 0xe0006226, 0x107ba: 0xe00084e6, - // Block 0x41f, offset 0x107c0 - 0x107c0: 0xe0007595, 0x107c1: 0xe00084ea, - 0x107c4: 0xe000998c, 0x107c6: 0xe0006807, 0x107c7: 0xe0004c53, - 0x107ca: 0xe0004fb7, 0x107cb: 0xe0004440, - 0x107cd: 0xe00085be, - 0x107d4: 0xe00085d2, 0x107d5: 0xe0006adc, 0x107d6: 0xe0009aab, 0x107d7: 0xe0008722, - 0x107d8: 0xe000678c, 0x107d9: 0xe0006e50, - 0x107dd: 0xe0005631, 0x107de: 0xe000852a, 0x107df: 0xe00094fc, - 0x107e1: 0xe000a8d7, 0x107e3: 0xe00054be, - 0x107e4: 0xe0005a04, 0x107e5: 0xe000845c, - 0x107ee: 0xe00041b7, - 0x107f0: 0xe0007727, 0x107f2: 0xe0008fe5, 0x107f3: 0xe00069c6, - 0x107f5: 0xe0007caf, 0x107f6: 0xe0004510, 0x107f7: 0xe0004443, - 0x107fb: 0xe0008582, - 0x107ff: 0xe0006458, - // Block 0x420, offset 0x10800 - 0x10800: 0xe0008e49, 0x10801: 0xe000504b, - 0x10809: 0xe000a143, 0x1080a: 0xe000845f, 0x1080b: 0xe0004fff, - 0x1080d: 0xe0007c5b, 0x1080e: 0xe000504e, 0x1080f: 0xe00066c1, - 0x10810: 0xe0006530, 0x10811: 0xe000a851, - 0x1082f: 0xe00064d4, - 0x10830: 0xe0004877, - 0x10834: 0xe0006324, 0x10836: 0xe0005a08, - 0x10838: 0xe00074bd, 0x1083a: 0xe0006adf, - 0x1083c: 0xe0006ae2, 0x1083d: 0xe0004160, - // Block 0x421, offset 0x10840 - 0x10842: 0xe0008c25, 0x10843: 0xe0008965, - 0x10846: 0xe0005332, 0x10847: 0xe000885f, - 0x10848: 0xe0009e62, 0x10849: 0xe0004cec, 0x1084b: 0xe00070ab, - 0x1084d: 0xe000819a, 0x1084e: 0xe0008862, 0x1084f: 0xe0008e92, - 0x10850: 0xe0008e71, 0x10851: 0xe0007fc9, 0x10853: 0xe00068a8, - 0x10854: 0xe0008af9, 0x10855: 0xe0009ff0, 0x10856: 0xe0009fb1, 0x10857: 0xe0009ad5, - 0x10859: 0xe00079b4, 0x1085a: 0xe000855a, 0x1085b: 0xe00068f4, - 0x1085c: 0xe000866e, 0x1085d: 0xe0004cef, 0x1085e: 0xe0005261, 0x1085f: 0xe0009cb6, - 0x10869: 0xe0009d60, 0x1086a: 0xe000a6f4, - 0x1086f: 0xe000785d, - 0x10870: 0xe00064d8, 0x10873: 0xe0004163, - 0x10876: 0xe000517b, - 0x10878: 0xe0004ae5, 0x10879: 0xe0004e6d, 0x1087a: 0xe0008969, 0x1087b: 0xe0008d73, - 0x1087c: 0xe0004c11, 0x1087d: 0xe000926f, 0x1087e: 0xe000855e, 0x1087f: 0xe0006ae5, - // Block 0x422, offset 0x10880 - 0x10881: 0xe00074c1, 0x10883: 0xe0004228, - 0x10884: 0xe00091ad, 0x10886: 0xe000586f, - 0x10888: 0xe00099a8, 0x10889: 0xe0004a0e, 0x1088a: 0xe0004afd, 0x1088b: 0xe0005a7c, - 0x1088d: 0xe00073ee, 0x1088f: 0xe0008e95, - 0x10891: 0xe0008212, - 0x10894: 0xe000607b, 0x10896: 0xe0005c70, 0x10897: 0xe0005675, - 0x10898: 0xe0009248, 0x1089a: 0xe000733d, 0x1089b: 0xe0004976, - 0x1089c: 0xe0008f0a, 0x1089d: 0xe0008402, - 0x108ae: 0xe0006033, 0x108af: 0xe000a772, - 0x108b2: 0xe0009189, - 0x108b5: 0xe0009a56, 0x108b6: 0xe00058dd, - 0x108bb: 0xe0009b9c, - 0x108bf: 0xe0009db4, - // Block 0x423, offset 0x108c0 - 0x108c1: 0xe000802c, 0x108c2: 0xe0004799, 0x108c3: 0xe0009778, - 0x108c4: 0xe00075ab, 0x108c5: 0xe0004cf2, - 0x108c9: 0xe0007c5e, 0x108ca: 0xe0008f51, - 0x108cc: 0xe00066ac, 0x108ce: 0xe0008ce9, 0x108cf: 0xe00070ae, - 0x108d0: 0xe0005d33, 0x108d1: 0xe0007f42, 0x108d3: 0xe0004699, - 0x108d4: 0xe000a299, 0x108d7: 0xe00070f0, - 0x108d8: 0xe000680a, 0x108da: 0xe0005ce8, 0x108db: 0xe0005fcc, - 0x108dd: 0xe000667c, 0x108df: 0xe0006ae8, - 0x108e0: 0xe000a335, 0x108e1: 0xe00074c5, 0x108e3: 0xe0007cb2, - 0x108ee: 0xe000718f, 0x108ef: 0xe000678f, - 0x108f0: 0xe000a577, 0x108f1: 0xe0004c56, 0x108f3: 0xe000648f, - 0x108f4: 0xe0009548, 0x108f5: 0xe0009eeb, 0x108f6: 0xe00072b5, - 0x108f8: 0xe0006731, 0x108fa: 0xe0007967, - 0x108fe: 0xe00069c9, - // Block 0x424, offset 0x10900 - 0x10900: 0xe00093e7, 0x10902: 0xe000661c, - 0x10905: 0xe0007385, 0x10906: 0xe0005895, - 0x10909: 0xe000938f, 0x1090b: 0xe0004446, - 0x1090d: 0xe000648c, 0x1090f: 0xe00072b9, - 0x10911: 0xe0006195, 0x10912: 0xe000550c, - 0x10914: 0xe0004ddb, 0x10916: 0xe000a1f6, - 0x10918: 0xe000547a, 0x10919: 0xe000a775, 0x1091a: 0xe0008405, - 0x1091c: 0xe00094a0, 0x1091e: 0xe000469d, 0x1091f: 0xe000924b, - 0x10921: 0xe0009393, 0x10922: 0xe0009650, 0x10923: 0xe00063e8, - 0x10924: 0xe00099ab, 0x10925: 0xe00049b6, 0x10926: 0xe0004e07, 0x10927: 0xe0008e05, - 0x10928: 0xe00044b2, 0x10929: 0xe000954c, 0x1092a: 0xe0007be6, 0x1092b: 0xe0005c74, - 0x1092c: 0xe0009afc, 0x1092d: 0xe0007e65, 0x1092e: 0xe000576c, - 0x10930: 0xe0005ce0, - 0x1093b: 0xe0007803, - // Block 0x425, offset 0x10940 - 0x10943: 0xe0007927, - 0x10944: 0xe00051cc, 0x10947: 0xe0004166, - 0x10948: 0xe00045a8, 0x10949: 0xe000819d, 0x1094a: 0xe000802f, - 0x1094e: 0xe0007e83, 0x1094f: 0xe0009db8, - 0x10953: 0xe0007637, - 0x10955: 0xe000a192, 0x10956: 0xe0009272, - 0x10958: 0xe0004288, 0x1095a: 0xe0008e98, - 0x1095c: 0xe0008b55, - 0x10960: 0xe0007ef2, 0x10962: 0xe0009721, - 0x10965: 0xe0004514, - 0x1096a: 0xe0009fe9, - 0x10970: 0xe0006f44, 0x10972: 0xe0007442, - 0x10974: 0xe0009988, 0x10975: 0xe0008b59, 0x10976: 0xe0007fcc, - 0x10978: 0xe0009c9b, - // Block 0x426, offset 0x10980 - 0x10980: 0xe0004b75, - 0x10985: 0xe0006792, - 0x1098b: 0xe00043fc, - 0x1098d: 0xe00063ec, - 0x10991: 0xe0004558, 0x10992: 0xe000a400, - 0x10994: 0xe0004671, 0x10996: 0xe00093eb, - 0x10998: 0xe0006bd8, 0x10999: 0xe000694b, 0x1099a: 0xe000a75a, 0x1099b: 0xe0007f9e, - 0x1099d: 0xe0009bc8, 0x1099e: 0xe0006b87, - 0x109a2: 0xe00041ba, - 0x109ac: 0xe00097fc, 0x109ad: 0xe0007f46, 0x109ae: 0xe0008d76, - 0x109b2: 0xe0007c61, 0x109b3: 0xe000896d, - 0x109b4: 0xe0004cf5, 0x109b5: 0xe0009433, 0x109b7: 0xe0006ca4, - 0x109bd: 0xe00087ae, 0x109be: 0xe00046a1, 0x109bf: 0xe000793f, - // Block 0x427, offset 0x109c0 - 0x109c2: 0xe0005c12, - 0x109c4: 0xe0009f15, 0x109c5: 0xe0004f53, - 0x109c9: 0xe00095e0, 0x109ca: 0xe0006e54, - 0x109cf: 0xe0006ca8, - 0x109d1: 0xe0004bc9, - 0x109d5: 0xe00066c5, 0x109d6: 0xe000a91f, - 0x109da: 0xe0005b9e, 0x109db: 0xe000510b, - 0x109de: 0xe00081a0, - 0x109e2: 0xe0009550, - 0x109e5: 0xe0007e9e, 0x109e6: 0xe0009862, 0x109e7: 0xe00073c6, - 0x109e9: 0xe000a093, - 0x109ec: 0xe0009724, 0x109ed: 0xe0009327, 0x109ee: 0xe0005679, - 0x109f5: 0xe0004400, - 0x109f9: 0xe0004169, 0x109fb: 0xe0006580, - 0x109fe: 0xe0007778, 0x109ff: 0xe0006aeb, - // Block 0x428, offset 0x10a00 - 0x10a00: 0xe0008408, 0x10a01: 0xe0008f55, 0x10a02: 0xe00052a1, 0x10a03: 0xe0009554, - 0x10a04: 0xe000790f, 0x10a06: 0xe00046a5, 0x10a07: 0xe000a2e9, - 0x10a09: 0xe0004570, 0x10a0b: 0xe000540a, - 0x10a10: 0xe0006a7f, 0x10a12: 0xe0008215, 0x10a13: 0xe00054ee, - 0x10a14: 0xe0008f0d, 0x10a15: 0xe0008cb6, 0x10a17: 0xe000843b, - 0x10a18: 0xe000918d, 0x10a1a: 0xe0005f80, 0x10a1b: 0xe000617a, - 0x10a1c: 0xe0005265, 0x10a1f: 0xe0006cac, - 0x10a21: 0xe0005b62, 0x10a22: 0xe0005913, - 0x10a24: 0xe0009eb3, 0x10a25: 0xe0008306, 0x10a27: 0xe00092eb, - 0x10a2a: 0xe0007fcf, 0x10a2b: 0xe000a493, - 0x10a31: 0xe0005b46, 0x10a32: 0xe0008865, 0x10a33: 0xe000934f, - 0x10a35: 0xe00072bd, 0x10a37: 0xe00058e0, - 0x10a39: 0xe00092ef, 0x10a3a: 0xe000519b, 0x10a3b: 0xe000547e, - 0x10a3c: 0xe000796b, - // Block 0x429, offset 0x10a40 - 0x10a40: 0xe0007d52, 0x10a41: 0xe000830a, 0x10a43: 0xe00080e6, - 0x10a44: 0xe000a385, 0x10a45: 0xe0009916, 0x10a46: 0xe0008cec, 0x10a47: 0xe000a87f, - 0x10a48: 0xe0006e58, 0x10a49: 0xe0004b01, 0x10a4b: 0xe0004f27, - 0x10a4c: 0xe0009bf4, 0x10a4d: 0xe0005fa0, 0x10a4e: 0xe0009c4a, - 0x10a52: 0xe00075ae, - 0x10a55: 0xe0007445, 0x10a57: 0xe0007a83, - 0x10a5a: 0xe0005482, - 0x10a5c: 0xe00056b5, - 0x10a62: 0xe0005037, - 0x10a65: 0xe00085b2, 0x10a67: 0xe0005217, - 0x10a68: 0xe0008971, 0x10a69: 0xe0005899, 0x10a6a: 0xe0008218, 0x10a6b: 0xe0009d4c, - 0x10a6c: 0xe000497a, 0x10a6d: 0xe0005c60, 0x10a6e: 0xe000a3e5, - 0x10a71: 0xe000497e, - 0x10a75: 0xe0006620, 0x10a76: 0xe0005051, 0x10a77: 0xe0004c59, - 0x10a78: 0xe0008975, - 0x10a7c: 0xe0004659, - // Block 0x42a, offset 0x10a80 - 0x10a80: 0xe0005054, - 0x10a86: 0xe00079ad, - 0x10a89: 0xe0007afb, 0x10a8a: 0xe000945d, - 0x10a8d: 0xe00087fa, 0x10a8f: 0xe0004749, - 0x10a92: 0xe0006036, 0x10a93: 0xe0004cf8, - 0x10a95: 0xe0005fa4, 0x10a97: 0xe0007f4a, - 0x10a98: 0xe0008299, - 0x10aa0: 0xe0004a59, 0x10aa3: 0xe000997f, - 0x10aa4: 0xe000814e, 0x10aa5: 0xe0005ff0, - 0x10aaa: 0xe0005f90, - 0x10aac: 0xe0005635, - 0x10ab0: 0xe0006ac3, 0x10ab1: 0xe000a496, 0x10ab2: 0xe000992e, - 0x10ab6: 0xe0007806, 0x10ab7: 0xe0005881, - 0x10abd: 0xe00059b4, - // Block 0x42b, offset 0x10ac0 - 0x10ac4: 0xe0009485, 0x10ac5: 0xe000487a, 0x10ac6: 0xe0008f59, - 0x10ac9: 0xe000589d, 0x10aca: 0xe0009684, 0x10acb: 0xe0008cef, - 0x10acc: 0xe0005cc8, 0x10acd: 0xe0005639, - 0x10ad2: 0xe000843e, - 0x10ad4: 0xe00093ef, - 0x10adb: 0xe0005cbc, - 0x10adc: 0xe0005cb8, 0x10add: 0xe00083f2, 0x10ade: 0xe000a922, - 0x10ae0: 0xe0004e70, 0x10ae1: 0xe0006548, - 0x10ae9: 0xe00060c4, - 0x10aed: 0xe0006ac7, - 0x10af0: 0xe000a63c, 0x10af1: 0xe0004449, 0x10af3: 0xe0005734, - 0x10af4: 0xe0006acb, 0x10af6: 0xe000a883, - 0x10af8: 0xe0009590, 0x10af9: 0xe0007ea1, 0x10afa: 0xe0009906, - 0x10afd: 0xe000a0c3, - // Block 0x42c, offset 0x10b00 - 0x10b00: 0xe000550f, 0x10b01: 0xe0008d79, 0x10b03: 0xe00084ee, - 0x10b06: 0xe000685c, 0x10b07: 0xe0008aa9, - 0x10b08: 0xe0007be9, 0x10b0a: 0xe000422c, - 0x10b0e: 0xe0006199, - 0x10b11: 0xe000a389, 0x10b13: 0xe0007e21, - 0x10b16: 0xe0008192, 0x10b17: 0xe00059b8, - 0x10b1d: 0xe00096d0, - 0x10b24: 0xe0009d24, 0x10b25: 0xe0006600, 0x10b26: 0xe00045a0, 0x10b27: 0xe00045a4, - 0x10b29: 0xe0005ceb, 0x10b2a: 0xe0006bdc, - 0x10b2e: 0xe0004ad5, - 0x10b30: 0xe0005512, 0x10b31: 0xe00093f3, 0x10b32: 0xe0004ed0, 0x10b33: 0xe000487d, - 0x10b36: 0xe0008c71, 0x10b37: 0xe0007174, - 0x10b38: 0xe0004e0b, 0x10b39: 0xe000930b, 0x10b3a: 0xe00085d5, 0x10b3b: 0xe00041e4, - // Block 0x42d, offset 0x10b40 - 0x10b43: 0xe0009694, - 0x10b44: 0xe000474d, 0x10b47: 0xe0009a26, - 0x10b49: 0xe0008e80, 0x10b4a: 0xe0006bc0, 0x10b4b: 0xe0004f2b, - 0x10b4c: 0xe00057e7, 0x10b4d: 0xe0008979, - 0x10b54: 0xe00094a4, 0x10b55: 0xe00069cc, 0x10b56: 0xe0006795, 0x10b57: 0xe00086d6, - 0x10b5a: 0xe0006b8a, 0x10b5b: 0xe000439c, - 0x10b5d: 0xe00062c0, 0x10b5e: 0xe000510e, 0x10b5f: 0xe00095b8, - 0x10b61: 0xe0006f64, - 0x10b69: 0xe00085c2, 0x10b6a: 0xe000897d, - 0x10b6f: 0xe0006798, - 0x10b72: 0xe000a0b7, - 0x10b74: 0xe0004479, 0x10b75: 0xe0009397, 0x10b77: 0xe0006c08, - 0x10b7a: 0xe0005d36, - 0x10b7d: 0xe0009eee, 0x10b7f: 0xe00096d3, - // Block 0x42e, offset 0x10b80 - 0x10b82: 0xe0004e73, 0x10b83: 0xe000a70f, - 0x10b87: 0xe0004f2f, - 0x10b88: 0xe0006584, 0x10b89: 0xe0005c27, - 0x10b8d: 0xe0004574, - 0x10b91: 0xe0008c74, 0x10b92: 0xe0004578, 0x10b93: 0xe0008441, - 0x10b97: 0xe00092f3, - 0x10b98: 0xe0005df5, 0x10b9b: 0xe0005934, - 0x10b9f: 0xe0004982, - 0x10ba0: 0xe000416c, 0x10ba3: 0xe00059bc, - 0x10ba4: 0xe0004f57, - 0x10ba9: 0xe0008cf2, 0x10baa: 0xe0005271, 0x10bab: 0xe0004594, - 0x10bac: 0xe0004cfb, 0x10bad: 0xe0009727, - 0x10bbe: 0xe000a1e6, - // Block 0x42f, offset 0x10bc0 - 0x10bc1: 0xe00046a9, 0x10bc3: 0xe00063a8, - 0x10bc5: 0xe0009a2a, 0x10bc7: 0xe0007f4e, - 0x10bc9: 0xe0005fa8, - 0x10bcc: 0xe0004e2f, 0x10bcd: 0xe00046ad, - 0x10bd2: 0xe0005cac, - 0x10bd5: 0xe000563d, 0x10bd6: 0xe0008062, - 0x10bd8: 0xe00042f4, 0x10bd9: 0xe0006138, 0x10bdb: 0xe000a7ba, - 0x10bdd: 0xe00073ca, 0x10bde: 0xe0005a91, 0x10bdf: 0xe0006039, - 0x10be0: 0xe0005c6c, 0x10be1: 0xe0009f18, 0x10be2: 0xe000701b, 0x10be3: 0xe00088e9, - 0x10be4: 0xe0004f5b, 0x10be6: 0xe000972a, - 0x10bf3: 0xe000a7be, - 0x10bf5: 0xe00058e3, - 0x10bf8: 0xe0004e0f, 0x10bfa: 0xe0008672, 0x10bfb: 0xe0004f03, - 0x10bfe: 0xe0004c5c, 0x10bff: 0xe00061e1, - // Block 0x430, offset 0x10c00 - 0x10c01: 0xe00061c5, 0x10c02: 0xe0005223, 0x10c03: 0xe000447c, - 0x10c05: 0xe0009e65, - 0x10c08: 0xe000a887, 0x10c0a: 0xe0004d97, - 0x10c0c: 0xe000a123, 0x10c0d: 0xe0009e68, 0x10c0f: 0xe0009e6b, - 0x10c10: 0xe00066c9, - 0x10c15: 0xe000694e, 0x10c16: 0xe000a54d, 0x10c17: 0xe0006858, - 0x10c19: 0xe00073f1, - 0x10c20: 0xe0008726, 0x10c21: 0xe0004b05, 0x10c23: 0xe0004380, - 0x10c27: 0xe000a365, - 0x10c2a: 0xe0006951, - 0x10c2f: 0xe000a6b8, - 0x10c31: 0xe0004e76, - 0x10c36: 0xe0004cfe, - 0x10c39: 0xe0009f89, - 0x10c3d: 0xe0007943, 0x10c3e: 0xe0009ddc, 0x10c3f: 0xe0005311, - // Block 0x431, offset 0x10c40 - 0x10c40: 0xe0004c5f, 0x10c41: 0xe0007599, 0x10c43: 0xe0009500, - 0x10c44: 0xe00085b6, 0x10c45: 0xe0006c84, 0x10c47: 0xe00073ce, - 0x10c48: 0xe0007c64, 0x10c49: 0xe000a81e, 0x10c4a: 0xe0006328, - 0x10c4d: 0xe0005e2b, - 0x10c51: 0xe0006954, 0x10c52: 0xe0008df9, 0x10c53: 0xe0009b00, - 0x10c54: 0xe000a339, 0x10c57: 0xe00051e4, - 0x10c5a: 0xe00062c4, - 0x10c5c: 0xe00066cd, 0x10c5e: 0xe00065c4, - 0x10c60: 0xe0008ad5, 0x10c61: 0xe000870a, - 0x10c66: 0xe0004b5d, - 0x10c68: 0xe0006f10, - 0x10c6c: 0xe0007743, 0x10c6e: 0xe00099f0, 0x10c6f: 0xe0006108, - 0x10c70: 0xe00084f2, 0x10c71: 0xe00081a3, 0x10c72: 0xe00070b1, 0x10c73: 0xe0008ff9, - 0x10c74: 0xe00041e8, 0x10c75: 0xe00057af, 0x10c77: 0xe0004e13, - 0x10c78: 0xe0006b8d, 0x10c79: 0xe000a87b, 0x10c7a: 0xe0004f8f, 0x10c7b: 0xe0004210, - 0x10c7d: 0xe0008ff5, 0x10c7e: 0xe000763b, 0x10c7f: 0xe00046b1, - // Block 0x432, offset 0x10c80 - 0x10c84: 0xe00077b4, - 0x10c93: 0xe0007757, - 0x10c96: 0xe000645c, - 0x10c98: 0xe0005cee, 0x10c9a: 0xe000a778, - 0x10c9d: 0xe0008d7c, 0x10c9f: 0xe00080ea, - 0x10ca0: 0xe0009990, - 0x10ca5: 0xe0004e47, 0x10ca6: 0xe0009ff3, - 0x10caa: 0xe0004f93, - 0x10cad: 0xe0007ad3, 0x10cae: 0xe0007448, - 0x10cb2: 0xe0005916, - 0x10cb9: 0xe0004d01, 0x10cbb: 0xe00044b5, - // Block 0x433, offset 0x10cc0 - 0x10cc3: 0xe000932b, - 0x10cc5: 0xe0009353, - 0x10cc8: 0xe0007fd2, 0x10cc9: 0xe000924e, 0x10cca: 0xe0005003, 0x10ccb: 0xe0007fd5, - 0x10ccd: 0xe000632c, - 0x10cd4: 0xe0007285, 0x10cd6: 0xe0009955, 0x10cd7: 0xe0007192, - 0x10cdb: 0xe0006330, - 0x10cdf: 0xe0007246, - 0x10ce1: 0xe0007bec, 0x10ce2: 0xe00097bc, 0x10ce3: 0xe0004c62, - 0x10ce4: 0xe0004805, 0x10ce5: 0xe0004c65, 0x10ce6: 0xe0005a48, - 0x10ce8: 0xe0005584, 0x10ce9: 0xe0004808, 0x10cea: 0xe0009058, 0x10ceb: 0xe0004ea3, - 0x10cec: 0xe000703c, 0x10ced: 0xe0009d50, 0x10cee: 0xe0008c29, 0x10cef: 0xe000416f, - 0x10cf0: 0xe0009bf7, 0x10cf1: 0xe00091b1, 0x10cf2: 0xe0006aee, 0x10cf3: 0xe0007fd8, - 0x10cf4: 0xe0004d04, 0x10cf5: 0xe0009cfa, 0x10cf6: 0xe000a369, - 0x10cf8: 0xe0006af1, - // Block 0x434, offset 0x10d00 - 0x10d01: 0xe0008032, 0x10d03: 0xe000a8c7, - 0x10d04: 0xe00041ec, - 0x10d08: 0xe000a107, 0x10d09: 0xe000517f, 0x10d0a: 0xe00088ed, 0x10d0b: 0xe00097b8, - 0x10d0c: 0xe0005641, 0x10d0d: 0xe0005ff4, 0x10d0e: 0xe000a77b, 0x10d0f: 0xe0005cf1, - 0x10d10: 0xe0009c4d, 0x10d11: 0xe000a212, - 0x10d1b: 0xe0004da7, - 0x10d1d: 0xe0005d5d, 0x10d1f: 0xe00083ae, - 0x10d20: 0xe0009e38, - 0x10d26: 0xe000679b, - 0x10d29: 0xe0006860, 0x10d2b: 0xe000a0c7, - 0x10d2c: 0xe0008372, 0x10d2e: 0xe0008a09, - 0x10d33: 0xe0007c6a, - 0x10d36: 0xe00052dd, - 0x10d38: 0xe000a8fb, 0x10d39: 0xe0009958, 0x10d3b: 0xe000619d, - 0x10d3c: 0xe000a77e, 0x10d3d: 0xe000a799, 0x10d3e: 0xe0007c67, - // Block 0x435, offset 0x10d40 - 0x10d40: 0xe000a017, 0x10d42: 0xe00058e6, - 0x10d46: 0xe0005f2d, - 0x10d48: 0xe0008b5d, 0x10d4a: 0xe000480b, - 0x10d4e: 0xe00094d8, - 0x10d51: 0xe0009b58, - 0x10d5d: 0xe00077d0, - 0x10d62: 0xe00052ff, - 0x10d64: 0xe0005a4c, 0x10d66: 0xe000829c, - 0x10d68: 0xe0008ea4, 0x10d6a: 0xe0008ea1, 0x10d6b: 0xe0009654, - 0x10d70: 0xe0008620, 0x10d71: 0xe000480e, 0x10d73: 0xe00061ed, - 0x10d75: 0xe0004172, 0x10d76: 0xe0005283, - 0x10d7b: 0xe00074c9, - 0x10d7c: 0xe000a41e, 0x10d7d: 0xe0005ff8, 0x10d7f: 0xe00044e2, - // Block 0x436, offset 0x10d80 - 0x10d80: 0xe0008868, - 0x10d84: 0xe0005629, 0x10d86: 0xe0009e6e, 0x10d87: 0xe0009fb5, - 0x10d8b: 0xe0006b90, - 0x10d8c: 0xe000a550, 0x10d8d: 0xe000a1c5, 0x10d8e: 0xe0004c68, 0x10d8f: 0xe0007bb3, - 0x10d90: 0xe000679e, - 0x10d96: 0xe00041bd, - 0x10da0: 0xe0009221, 0x10da2: 0xe000763f, - 0x10da4: 0xe0009aae, 0x10da5: 0xe000a95b, - 0x10da8: 0xe00085d8, 0x10dab: 0xe000905b, - 0x10dac: 0xe0004bcc, 0x10daf: 0xe0004214, - 0x10db3: 0xe000a195, - 0x10db8: 0xe000a0cb, 0x10dbb: 0xe000a860, - 0x10dbc: 0xe0004b66, 0x10dbd: 0xe00084f6, 0x10dbf: 0xe00084a1, - // Block 0x437, offset 0x10dc0 - 0x10dc0: 0xe000775a, 0x10dc1: 0xe0009f3c, 0x10dc2: 0xe0007519, 0x10dc3: 0xe000567d, - 0x10dc4: 0xe000a511, 0x10dc6: 0xe00099f3, 0x10dc7: 0xe0007dbe, - 0x10dc8: 0xe000a10b, 0x10dc9: 0xe00087fd, - 0x10de1: 0xe00080ee, - 0x10de5: 0xe0004175, 0x10de6: 0xe00075e1, - 0x10de8: 0xe00096d6, 0x10de9: 0xe0005d39, - 0x10ded: 0xe00048ce, 0x10dee: 0xe000a733, - 0x10df1: 0xe00063d4, 0x10df2: 0xe0009594, - 0x10dfa: 0xe0009e71, - 0x10dfd: 0xe0004751, 0x10dff: 0xe00041c0, - // Block 0x438, offset 0x10e00 - 0x10e04: 0xe0009d63, 0x10e06: 0xe0006af4, 0x10e07: 0xe00090fd, - 0x10e09: 0xe000777b, - 0x10e0e: 0xe0005cf4, 0x10e0f: 0xe000a95e, - 0x10e10: 0xe000544e, - 0x10e14: 0xe0007cb5, - 0x10e1c: 0xe0005e97, - 0x10e2b: 0xe0004feb, - 0x10e2e: 0xe0007249, 0x10e2f: 0xe000821b, - 0x10e31: 0xe000939b, 0x10e33: 0xe0005919, - 0x10e35: 0xe00076cb, - 0x10e3c: 0xe0006c88, 0x10e3e: 0xe0009ab1, - // Block 0x439, offset 0x10e40 - 0x10e40: 0xe000777e, 0x10e42: 0xe00052cf, - 0x10e44: 0xe0009b04, 0x10e46: 0xe0006cb0, - 0x10e4f: 0xe00061a1, - 0x10e53: 0xe000479c, - 0x10e56: 0xe00053c6, 0x10e57: 0xe000540e, - 0x10e5c: 0xe00095bc, 0x10e5e: 0xe00075b1, - 0x10e63: 0xe000a0cf, - 0x10e7b: 0xe000744b, - 0x10e7c: 0xe0008c77, 0x10e7d: 0xe00076eb, 0x10e7e: 0xe0009865, - // Block 0x43a, offset 0x10e80 - 0x10e80: 0xe000448e, 0x10e81: 0xe0007d82, 0x10e83: 0xe00051f8, - 0x10e84: 0xe0006e5c, 0x10e86: 0xe0009598, 0x10e87: 0xe0005754, - 0x10e89: 0xe000a781, 0x10e8a: 0xe000a0d3, 0x10e8b: 0xe0009658, - 0x10e91: 0xe00083c6, 0x10e93: 0xe0007ef5, - 0x10e94: 0xe0007643, - 0x10e98: 0xe0009504, 0x10e99: 0xe000a821, 0x10e9a: 0xe000a5b4, - 0x10e9c: 0xe000a925, 0x10e9d: 0xe00042b8, 0x10e9e: 0xe0008ffd, 0x10e9f: 0xe00081e5, - 0x10ea3: 0xe000a79c, - 0x10ea4: 0xe000a69c, 0x10ea7: 0xe000a802, - 0x10ea8: 0xe00058c5, 0x10ea9: 0xe000821e, 0x10eaa: 0xe0006cb4, 0x10eab: 0xe0005197, - 0x10eac: 0xe0004bcf, 0x10eae: 0xe0005336, - 0x10eb0: 0xe00074b1, - // Block 0x43b, offset 0x10ec0 - 0x10ec5: 0xe000a784, 0x10ec7: 0xe0006d4c, - 0x10ec9: 0xe00070b4, - 0x10ed1: 0xe000a127, - 0x10ed4: 0xe0009101, - 0x10eda: 0xe0007c6d, 0x10edb: 0xe0004675, - 0x10edc: 0xe0005057, 0x10edf: 0xe0009251, - 0x10ee0: 0xe00057a3, 0x10ee2: 0xe0007d56, 0x10ee3: 0xe0006af7, - 0x10ee4: 0xe00099ae, - 0x10ef7: 0xe0007cb8, - 0x10efd: 0xe0007195, 0x10efe: 0xe0008ea7, 0x10eff: 0xe0009bb0, - // Block 0x43c, offset 0x10f00 - 0x10f04: 0xe0004c14, 0x10f06: 0xe0009b5c, - 0x10f08: 0xe0008d7f, 0x10f09: 0xe0004178, - 0x10f0c: 0xe0009f1b, 0x10f0d: 0xe0005c15, 0x10f0e: 0xe00076ab, - 0x10f10: 0xe0004c17, 0x10f12: 0xe000a403, - 0x10f14: 0xe0004c6b, 0x10f16: 0xe000946d, 0x10f17: 0xe0006cb8, - 0x10f29: 0xe000a57a, - 0x10f2c: 0xe0009805, 0x10f2f: 0xe000703f, - 0x10f32: 0xe0008cf5, - 0x10f34: 0xe000995b, 0x10f36: 0xe00073f4, 0x10f37: 0xe000a499, - 0x10f38: 0xe000617d, 0x10f39: 0xe0005bbf, 0x10f3b: 0xe000a961, - 0x10f3f: 0xe0006191, - // Block 0x43d, offset 0x10f40 - 0x10f41: 0xe0007cbb, 0x10f42: 0xe0008f9d, - 0x10f49: 0xe0005412, 0x10f4b: 0xe0009c56, - 0x10f4d: 0xe000972d, 0x10f4e: 0xe0007acf, 0x10f4f: 0xe000a90b, - 0x10f53: 0xe000a236, - 0x10f64: 0xe0004fef, 0x10f65: 0xe00052a5, - 0x10f68: 0xe000505a, 0x10f69: 0xe0007647, 0x10f6a: 0xe0008d82, 0x10f6b: 0xe000a928, - 0x10f6c: 0xe0006dda, 0x10f6d: 0xe0004c1a, 0x10f6f: 0xe0007781, - 0x10f72: 0xe0009aa5, - 0x10f74: 0xe0006864, 0x10f76: 0xe00042dc, - 0x10f78: 0xe0009c5a, 0x10f7a: 0xe000751d, - // Block 0x43e, offset 0x10f80 - 0x10f80: 0xe0005269, - 0x10f84: 0xe000a717, 0x10f86: 0xe000a736, 0x10f87: 0xe000a01a, - 0x10f8f: 0xe00096af, - 0x10f99: 0xe0004c1d, 0x10f9a: 0xe0008376, - 0x10fa5: 0xe0007a0f, - 0x10fac: 0xe0006a47, 0x10fae: 0xe000a216, - 0x10fb3: 0xe00048ea, - 0x10fb4: 0xe000796f, 0x10fb6: 0xe00077f0, - 0x10fbc: 0xe0008676, - // Block 0x43f, offset 0x10fc0 - 0x10fc0: 0xe0008a0d, 0x10fc1: 0xe0006fac, 0x10fc2: 0xe000a75d, 0x10fc3: 0xe000870e, - 0x10fc8: 0xe0007c1f, 0x10fc9: 0xe000576f, 0x10fca: 0xe0005208, - 0x10fcd: 0xe000a92b, - 0x10fd1: 0xe000977c, - 0x10fda: 0xe0007198, 0x10fdb: 0xe0006afa, - 0x10fde: 0xe000a6bb, 0x10fdf: 0xe0007521, - 0x10fe0: 0xe00084fa, - 0x10fe6: 0xe0007a87, - 0x10feb: 0xe000a50d, - 0x10fee: 0xe0007dc1, - 0x10ff0: 0xe00048fe, - 0x10ff7: 0xe0004f1b, - 0x10ff9: 0xe0005a0c, 0x10ffa: 0xe0004811, - 0x10fff: 0xe000829f, - // Block 0x440, offset 0x11000 - 0x11001: 0xe000837a, 0x11002: 0xe000a4ed, 0x11003: 0xe0009e74, - 0x11004: 0xe00078e5, - 0x11008: 0xe0004e17, 0x11009: 0xe0007903, 0x1100a: 0xe0009688, 0x1100b: 0xe0004d7f, - 0x1100d: 0xe00081a6, - 0x11012: 0xe00080f6, 0x11013: 0xe00080f2, - 0x11016: 0xe0005515, - 0x11018: 0xe000533a, - 0x1101c: 0xe0008152, 0x1101f: 0xe0009c50, - 0x11025: 0xe0005b0a, - 0x11028: 0xe0008800, - 0x1102c: 0xe0007cbe, 0x1102d: 0xe0004ea6, 0x1102e: 0xe00069cf, - 0x11030: 0xe000905e, - 0x1103b: 0xe000505d, - 0x1103e: 0xe000501b, - // Block 0x441, offset 0x11040 - 0x11040: 0xe0009061, 0x11042: 0xe0009d28, - 0x11047: 0xe0004f07, - 0x1104a: 0xe00063f0, - 0x1104c: 0xe00068ac, 0x1104d: 0xe00053ca, 0x1104e: 0xe00042f8, 0x1104f: 0xe00064c5, - 0x11050: 0xe0008e74, 0x11051: 0xe0004496, - 0x11061: 0xe0009cca, - 0x11064: 0xe0004902, 0x11066: 0xe0009b60, 0x11067: 0xe00094dc, - 0x11068: 0xe00084a4, 0x11069: 0xe0004344, 0x1106a: 0xe0009e0c, - 0x1106e: 0xe00054c4, 0x1106f: 0xe00064c8, - 0x11070: 0xe00046b5, 0x11071: 0xe0007747, 0x11073: 0xe0007ef8, - 0x11075: 0xe0004c6e, 0x11077: 0xe00041c3, - 0x11078: 0xe0004d07, 0x1107b: 0xe00090b8, - 0x1107c: 0xe0009b08, - // Block 0x442, offset 0x11080 - 0x11082: 0xe000719b, - 0x11088: 0xe00054c1, 0x1108b: 0xe000a38d, - 0x1108c: 0xe0005681, - 0x11093: 0xe000a198, - 0x11095: 0xe000a79f, - 0x1109e: 0xe0009ad8, - 0x110a0: 0xe0008356, 0x110a2: 0xe0004c71, 0x110a3: 0xe00080fa, - 0x110a4: 0xe00091e9, - 0x110b8: 0xe0007e25, - 0x110bd: 0xe000837e, - // Block 0x443, offset 0x110c0 - 0x110c3: 0xe000775d, - 0x110c6: 0xe0004218, 0x110c7: 0xe0007f52, - 0x110c8: 0xe0008f5d, 0x110c9: 0xe000a36d, 0x110cb: 0xe0005f03, - 0x110ce: 0xe0006fc8, 0x110cf: 0xe0007a8b, - 0x110d1: 0xe00095c0, 0x110d2: 0xe00057ef, - 0x110dc: 0xe000781e, 0x110df: 0xe00079df, - 0x110e0: 0xe00067a1, - 0x110e4: 0xe00069d2, - 0x110ed: 0xe0009c1e, - 0x110f0: 0xe0009436, 0x110f3: 0xe0004348, - 0x110f4: 0xe0007475, 0x110f7: 0xe0009209, - 0x110f9: 0xe0006492, 0x110fa: 0xe0005060, 0x110fb: 0xe0008fa1, - 0x110fc: 0xe0005063, 0x110fd: 0xe00070b7, - // Block 0x444, offset 0x11100 - 0x11100: 0xe0004dcb, 0x11102: 0xe0005452, 0x11103: 0xe0004926, - 0x11105: 0xe00045e5, 0x11106: 0xe0009c86, - 0x11108: 0xe00043a0, 0x11109: 0xe00082f6, 0x1110a: 0xe00075ff, 0x1110b: 0xe000693c, - 0x11117: 0xe000562d, - 0x11119: 0xe000852e, - 0x1111d: 0xe0004a11, 0x1111e: 0xe0009628, - 0x11120: 0xe000a7a2, 0x11121: 0xe000667f, 0x11123: 0xe0008035, - 0x11124: 0xe0008c7a, 0x11126: 0xe00047e1, 0x11127: 0xe0007a13, - 0x1112a: 0xe00042fc, - 0x1112f: 0xe0007ea4, - 0x11130: 0xe000792b, 0x11131: 0xe0006682, - 0x11134: 0xe000872a, 0x11135: 0xe0005518, - 0x1113a: 0xe000479f, - // Block 0x445, offset 0x11140 - 0x11140: 0xe0006660, - 0x11149: 0xe00094e0, 0x1114a: 0xe0004b78, 0x1114b: 0xe0007b47, - 0x1114c: 0xe0009bcc, 0x1114d: 0xe00073e6, 0x1114f: 0xe000444c, - 0x11150: 0xe00070ba, 0x11151: 0xe0007042, 0x11152: 0xe000744e, - 0x11154: 0xe0009bbc, 0x11157: 0xe000551b, - 0x11158: 0xe0005456, 0x11159: 0xe0004880, 0x1115a: 0xe00097c0, - 0x1115e: 0xe0006d40, - 0x11161: 0xe0008981, 0x11162: 0xe0007c70, - 0x11164: 0xe000a7c2, - 0x11169: 0xe0007aff, - 0x11175: 0xe0009105, - 0x11179: 0xe000932f, - 0x1117c: 0xe0008985, 0x1117d: 0xe0006d1c, 0x1117e: 0xe0007289, - // Block 0x446, offset 0x11180 - 0x11180: 0xe00090bb, 0x11181: 0xe0005e73, 0x11183: 0xe00046b9, - 0x11185: 0xe0006d80, - 0x11189: 0xe0007f56, 0x1118a: 0xe0008afd, - 0x1118d: 0xe0005111, - 0x11190: 0xe0004f97, 0x11193: 0xe000610b, - 0x1119c: 0xe000981d, 0x1119d: 0xe0007efb, 0x1119e: 0xe000901d, 0x1119f: 0xe000a239, - 0x111a1: 0xe0006ed0, 0x111a3: 0xe0006705, - 0x111a8: 0xe0006189, 0x111a9: 0xe00055ed, 0x111ab: 0xe0008fa5, - 0x111ae: 0xe0009ab4, - 0x111b0: 0xe0005416, 0x111b1: 0xe0005738, 0x111b3: 0xe0006868, - 0x111ba: 0xe0007c73, 0x111bb: 0xe000872e, - 0x111be: 0xe0004230, - // Block 0x447, offset 0x111c0 - 0x111c1: 0xe0006588, 0x111c3: 0xe0004404, - 0x111c5: 0xe0007d5e, 0x111c7: 0xe000533e, - 0x111ce: 0xe000a7c6, - 0x111d1: 0xe000a02f, 0x111d3: 0xe0007717, - 0x111d4: 0xe0005587, 0x111d5: 0xe000a421, - 0x111d8: 0xe0005beb, 0x111d9: 0xe0004b09, 0x111da: 0xe0005ac4, - 0x111dc: 0xe000541a, 0x111dd: 0xe00082a2, 0x111de: 0xe0004b7b, 0x111df: 0xe0005b2a, - 0x111e4: 0xe0007861, - 0x111eb: 0xe0006afd, - 0x111ec: 0xe0008586, 0x111ef: 0xe0008732, - 0x111f9: 0xe0008562, 0x111fa: 0xe000a424, 0x111fb: 0xe0006d83, - 0x111fd: 0xe000719e, - // Block 0x448, offset 0x11200 - 0x11206: 0xe0006775, - 0x11208: 0xe000882d, - 0x1120f: 0xe0009ff6, - 0x11210: 0xe000a3d1, - 0x11214: 0xe0005066, 0x11215: 0xe0006df8, 0x11216: 0xe0007e74, - 0x11219: 0xe000728d, 0x1121a: 0xe0005321, - 0x1121c: 0xe0007809, - 0x11222: 0xe00060d4, - 0x11224: 0xe0008532, 0x11225: 0xe0004a14, 0x11227: 0xe00054c7, - 0x11229: 0xe0009508, 0x1122a: 0xe0009bfa, 0x1122b: 0xe00067a4, - 0x1122c: 0xe0009aa8, 0x1122d: 0xe0007ea7, 0x1122e: 0xe000772b, 0x1122f: 0xe000a17b, - 0x11231: 0xe0007541, - 0x11237: 0xe0008462, - 0x11238: 0xe0004a17, - 0x1123e: 0xe000a33d, - // Block 0x449, offset 0x11240 - 0x11244: 0xe0007973, 0x11247: 0xe0005069, - 0x11248: 0xe000521a, 0x11249: 0xe0006735, - 0x1124e: 0xe0004ea9, 0x1124f: 0xe0008eaa, - 0x11250: 0xe000a5b8, 0x11251: 0xe00047a2, 0x11253: 0xe0009275, - 0x11254: 0xe000686c, 0x11255: 0xe000a279, 0x11257: 0xe0009c9e, - 0x11258: 0xe00087b2, 0x1125a: 0xe000a19b, - 0x11260: 0xe0008989, 0x11262: 0xe0006b00, - 0x11267: 0xe0007c76, - 0x11269: 0xe00059ec, 0x1126a: 0xe0009b94, 0x1126b: 0xe000830e, - 0x1126c: 0xe0008736, 0x1126d: 0xe0006dfc, 0x1126e: 0xe0006870, - 0x11273: 0xe0005232, - 0x11274: 0xe0005274, 0x11276: 0xe0005226, - 0x11278: 0xe0004234, - 0x1127d: 0xe000a427, - // Block 0x44a, offset 0x11280 - 0x11282: 0xe00079b7, 0x11283: 0xe0006957, - 0x11284: 0xe0005ebf, - 0x1128a: 0xe000858a, - 0x11291: 0xe0009cfd, 0x11292: 0xe0009cad, 0x11293: 0xe000506c, - 0x11296: 0xe0007eaa, 0x11297: 0xe0004fbb, - 0x11299: 0xe000610e, - 0x1129d: 0xe00087b6, - 0x112a3: 0xe00069d5, - 0x112a5: 0xe0009ab7, 0x112a7: 0xe0007e29, - 0x112a8: 0xe00063f4, - 0x112ac: 0xe0009ca1, 0x112af: 0xe00098e6, - 0x112b2: 0xe00053b2, - 0x112b9: 0xe0005f06, 0x112bb: 0xe0009488, - 0x112be: 0xe000962c, - // Block 0x44b, offset 0x112c0 - 0x112c3: 0xe0008b61, - 0x112c6: 0xe000603c, - 0x112c8: 0xe0005a50, 0x112c9: 0xe00085db, 0x112cb: 0xe00073f7, - 0x112cd: 0xe0006c0c, - 0x112d0: 0xe000886b, 0x112d1: 0xe0004814, 0x112d2: 0xe0006b93, 0x112d3: 0xe0006fcc, - 0x112d4: 0xe00081a9, - 0x112d9: 0xe000858e, 0x112da: 0xe0007ead, - 0x112dc: 0xe00043a4, 0x112dd: 0xe0008e9b, 0x112de: 0xe000518b, - 0x112e3: 0xe0004c20, - 0x112e4: 0xe0004d0a, 0x112e5: 0xe000607e, 0x112e6: 0xe0004238, - 0x112e8: 0xe0008465, 0x112ea: 0xe00091b5, - 0x112ec: 0xe000a92e, 0x112ee: 0xe000a147, - 0x112f8: 0xe0007a17, 0x112fa: 0xe0007525, 0x112fb: 0xe00084fe, - 0x112ff: 0xe00085de, - // Block 0x44c, offset 0x11300 - 0x11301: 0xe00081ac, 0x11303: 0xe0007e68, - 0x11309: 0xe0006acf, - 0x11311: 0xe0006b03, 0x11313: 0xe0006229, - 0x11318: 0xe000520c, 0x11319: 0xe000a3d5, 0x1131b: 0xe0007c79, - 0x1131c: 0xe000519e, 0x1131f: 0xe0007a1b, - 0x11320: 0xe00074cd, 0x11323: 0xe0008cb9, - 0x11325: 0xe00075b4, 0x11327: 0xe0009c21, - 0x11329: 0xe0005e2f, - 0x1132d: 0xe0007784, - 0x11335: 0xe0009868, 0x11336: 0xe000995e, - 0x1133c: 0xe000939f, 0x1133f: 0xe00075e4, - // Block 0x44d, offset 0x11340 - 0x11340: 0xe00075e7, 0x11341: 0xe0005bee, - 0x11346: 0xe0009ccd, - 0x11349: 0xe0007dd9, - 0x1134c: 0xe00072c1, - 0x11350: 0xe0007dc4, - 0x1135a: 0xe000a4d5, - 0x11362: 0xe000695a, 0x11363: 0xe0008536, - 0x11366: 0xe00067a7, 0x11367: 0xe0008c2d, - 0x1136a: 0xe000581f, - 0x11372: 0xe000a57d, - 0x11377: 0xe0008c31, - 0x1137f: 0xe0006ddd, - // Block 0x44e, offset 0x11380 - 0x11384: 0xe000622c, - 0x1138d: 0xe000680d, - 0x11392: 0xe0005f09, 0x11393: 0xe000a6a0, - 0x11395: 0xe00076ef, - 0x1139a: 0xe00061f0, 0x1139b: 0xe00080fe, - 0x1139f: 0xe0006f48, - 0x113a2: 0xe0006081, - 0x113a4: 0xe00073fa, 0x113a7: 0xe0007e71, - 0x113aa: 0xe0007cc1, - 0x113b3: 0xe00074b5, - 0x113b5: 0xe00085ce, - 0x113ba: 0xe000622f, 0x113bb: 0xe0006388, - 0x113bc: 0xe0007d26, 0x113bd: 0xe0005df8, 0x113be: 0xe0004d0d, 0x113bf: 0xe0004b8d, - // Block 0x44f, offset 0x113c0 - 0x113c1: 0xe000417b, 0x113c2: 0xe00071a1, - 0x113c4: 0xe0008102, - 0x113c8: 0xe00077f4, 0x113c9: 0xe00091b9, 0x113cb: 0xe00052bd, - 0x113cc: 0xe000a331, - 0x113d6: 0xe0009f1e, 0x113d7: 0xe0004d10, - 0x113d9: 0xe0006ed4, 0x113da: 0xe0005e77, 0x113db: 0xe0007c22, - 0x113e0: 0xe0005d3c, 0x113e1: 0xe00088f1, 0x113e2: 0xe0004ed3, 0x113e3: 0xe0007947, - 0x113e5: 0xe0008a11, 0x113e6: 0xe000a14b, - 0x113e9: 0xe00052d5, 0x113eb: 0xe0006084, - 0x113ed: 0xe000a49c, 0x113ee: 0xe000a49f, 0x113ef: 0xe0007cc4, - 0x113f6: 0xe0009730, - 0x113fa: 0xe000a097, 0x113fb: 0xe000a09b, - 0x113fd: 0xe0005bc2, - // Block 0x450, offset 0x11400 - 0x11400: 0xe0004ed6, - 0x11405: 0xe000a553, - 0x11408: 0xe0007efe, 0x11409: 0xe000a931, 0x1140b: 0xe0006e60, - 0x1140c: 0xe0004bd2, - 0x11416: 0xe0009e3b, - 0x11419: 0xe00087ba, 0x1141b: 0xe000a2ed, - 0x11425: 0xe0008d85, - 0x11428: 0xe0008623, 0x1142a: 0xe0006a4b, - 0x1142d: 0xe0005229, - 0x11430: 0xe0007bbb, 0x11432: 0xe00052c0, - 0x11434: 0xe0007bb7, - 0x1143e: 0xe00057cb, 0x1143f: 0xe0007a8f, - // Block 0x451, offset 0x11440 - 0x11440: 0xe0006cbc, 0x11443: 0xe0007865, - 0x11445: 0xe0006f84, - 0x1144c: 0xe0005998, - 0x11450: 0xe00085e1, 0x11451: 0xe000a319, - 0x11454: 0xe0004986, 0x11455: 0xe00085c6, 0x11456: 0xe0008626, 0x11457: 0xe00085e4, - 0x11458: 0xe0008ded, 0x1145a: 0xe00067aa, 0x1145b: 0xe0009d81, - 0x1145c: 0xe00085e7, 0x1145d: 0xe000a739, 0x1145f: 0xe0005f68, - 0x11461: 0xe0009c24, 0x11463: 0xe00047a5, - 0x11464: 0xe0004817, 0x11465: 0xe0005286, - 0x11469: 0xe000a19e, 0x1146b: 0xe000711c, - 0x11470: 0xe0007291, 0x11471: 0xe00086c2, - 0x11475: 0xe00067ad, 0x11476: 0xe0008629, - 0x11478: 0xe000a033, 0x1147a: 0xe0008221, - 0x1147c: 0xe000795b, 0x1147f: 0xe0006c10, - // Block 0x452, offset 0x11480 - 0x11481: 0xe00088b3, 0x11482: 0xe0007fa2, - 0x11485: 0xe0005500, 0x11487: 0xe0007fdb, - 0x11488: 0xe00071a4, 0x11489: 0xe0007663, 0x1148a: 0xe00041c6, 0x1148b: 0xe0007148, - 0x1148c: 0xe0007ddd, 0x1148f: 0xe0004ba6, - 0x11493: 0xe00066d1, - 0x11495: 0xe0009bd4, 0x11496: 0xe000a71b, 0x11497: 0xe0008e09, - 0x11498: 0xe0004a5d, 0x11499: 0xe0008ead, 0x1149a: 0xe0008b65, 0x1149b: 0xe0007de1, - 0x1149c: 0xe000840b, - 0x114a2: 0xe0004492, 0x114a3: 0xe0006e64, - 0x114a4: 0xe0007545, 0x114a5: 0xe0008224, 0x114a6: 0xe000a5bc, - 0x114ac: 0xe0006fd0, 0x114ae: 0xe0004deb, - 0x114b0: 0xe0008803, 0x114b3: 0xe000a1a1, - 0x114b4: 0xe0007a1f, 0x114b5: 0xe0007045, 0x114b6: 0xe000417e, - 0x114b8: 0xe00074d1, 0x114b9: 0xe0007f5a, - 0x114bf: 0xe0007295, - // Block 0x453, offset 0x114c0 - 0x114c0: 0xe0009439, 0x114c2: 0xe00088f5, 0x114c3: 0xe0008106, - 0x114c4: 0xe000506f, 0x114c5: 0xe0008502, 0x114c6: 0xe00062ac, 0x114c7: 0xe0004c74, - 0x114cc: 0xe00067b0, - 0x114d0: 0xe0005f0c, 0x114d2: 0xe000a05b, 0x114d3: 0xe0007fde, - 0x114d4: 0xe0007479, 0x114d6: 0xe0009a7a, 0x114d7: 0xe000525d, - 0x114d8: 0xe00099f6, - 0x114de: 0xe0005e07, 0x114df: 0xe000930f, - 0x114e1: 0xe00049ea, 0x114e2: 0xe0009a5a, - 0x114e4: 0xe0007c7c, 0x114e5: 0xe0007eb0, 0x114e6: 0xe0007549, 0x114e7: 0xe0005259, - 0x114e8: 0xe000943c, 0x114e9: 0xe0007559, 0x114eb: 0xe0006b06, - 0x114ec: 0xe0004a61, 0x114ed: 0xe000a406, 0x114ee: 0xe0005ba1, 0x114ef: 0xe0008f61, - 0x114f0: 0xe000a5f4, - 0x114f5: 0xe00097c4, 0x114f6: 0xe0006685, - 0x114f8: 0xe00097a8, 0x114fa: 0xe0006b09, - // Block 0x454, offset 0x11500 - 0x11501: 0xe0006739, - 0x11504: 0xe0006b0c, 0x11505: 0xe0004f47, 0x11507: 0xe000873a, - 0x11508: 0xe000898d, 0x11509: 0xe00081af, 0x1150a: 0xe0008df1, 0x1150b: 0xe000755d, - 0x1150c: 0xe0008f10, 0x1150d: 0xe00054ca, 0x1150e: 0xe000551e, 0x1150f: 0xe0007048, - 0x11511: 0xe000704b, - 0x11514: 0xe00084a7, 0x11516: 0xe00095e4, - 0x11519: 0xe0006cc0, - 0x1151f: 0xe0006ed8, - 0x11520: 0xe0006edc, - 0x11524: 0xe0007fe1, - 0x11528: 0xe00063f8, 0x1152b: 0xe0007e59, - 0x11531: 0xe0009961, - 0x11538: 0xe00073fd, 0x11539: 0xe0008312, 0x1153a: 0xe00094a8, 0x1153b: 0xe000481a, - 0x1153c: 0xe00052f9, 0x1153e: 0xe00061f3, 0x1153f: 0xe00052ba, - // Block 0x455, offset 0x11540 - 0x11540: 0xe0004d83, 0x11541: 0xe00069d8, - 0x11545: 0xe00044b8, 0x11546: 0xe00047a8, 0x11547: 0xe0008a15, - 0x11548: 0xe0004dcf, 0x1154b: 0xe0007cfa, - 0x1154d: 0xe0007403, 0x1154e: 0xe0007400, - 0x11550: 0xe0004f4b, 0x11551: 0xe0006f14, - 0x11555: 0xe0008991, - 0x1155b: 0xe0006624, - 0x11560: 0xe0005521, 0x11562: 0xe0005bf1, - 0x11564: 0xe00099a4, 0x11565: 0xe0005cf7, - 0x11568: 0xe0004d13, - 0x1156c: 0xe00070f4, 0x1156f: 0xe00056e8, - 0x11571: 0xe0006be0, 0x11573: 0xe0006ee0, - 0x11579: 0xe000a8cb, 0x1157a: 0xe0005114, - // Block 0x456, offset 0x11580 - 0x11588: 0xe000a01d, 0x1158a: 0xe0008ac9, - 0x1158c: 0xe000501f, 0x1158f: 0xe0007e2d, - 0x11590: 0xe0005072, 0x11591: 0xe00086e2, 0x11592: 0xe0004679, - 0x11594: 0xe0009278, - 0x1159d: 0xe00086a2, - 0x115a1: 0xe00043a8, 0x115a3: 0xe0004d16, - 0x115a5: 0xe0009d00, 0x115a6: 0xe0005dd9, 0x115a7: 0xe0009733, - 0x115a8: 0xe00088b6, 0x115a9: 0xe00076cf, 0x115aa: 0xe0006904, 0x115ab: 0xe00071a7, - 0x115ac: 0xe0004384, 0x115ad: 0xe0005a54, - 0x115b1: 0xe00054cd, 0x115b3: 0xe0007603, - 0x115b5: 0xe000a42a, 0x115b7: 0xe0006250, - 0x115b8: 0xe0007667, 0x115ba: 0xe0005a10, - 0x115be: 0xe0008ad9, - // Block 0x457, offset 0x115c0 - 0x115c0: 0xe00071aa, - 0x115d2: 0xe0005685, - 0x115d9: 0xe00099b1, - 0x115e0: 0xe0006cc4, - 0x115e8: 0xe00075b7, 0x115e9: 0xe00075ea, - 0x115ed: 0xe0009736, 0x115ef: 0xe000673d, - 0x115f0: 0xe0006741, 0x115f1: 0xe0005289, - 0x115f4: 0xe000a29d, 0x115f6: 0xe0005524, - 0x115fb: 0xe0008f65, - 0x115fd: 0xe000a341, - // Block 0x458, offset 0x11600 - 0x11606: 0xe00049ba, 0x11607: 0xe0007375, - 0x1160d: 0xe0005872, 0x1160e: 0xe0005075, - 0x11610: 0xe000492a, 0x11611: 0xe0004906, - 0x11614: 0xe00097ff, 0x11615: 0xe0007787, 0x11616: 0xe0007760, 0x11617: 0xe00043ac, - 0x11619: 0xe0005c78, 0x1161b: 0xe0004ddf, - 0x1161f: 0xe00083ca, - 0x11622: 0xe000884f, - 0x11624: 0xe000a760, 0x11626: 0xe000797f, 0x11627: 0xe0007379, - 0x11629: 0xe0006924, - 0x11634: 0xe0007e86, - 0x1163d: 0xe0008830, - // Block 0x459, offset 0x11640 - 0x11641: 0xe000434c, 0x11642: 0xe0005c98, - 0x1164b: 0xe00061f6, - 0x1164c: 0xe0004300, 0x1164e: 0xe0008038, - 0x11650: 0xe00057f7, 0x11653: 0xe00076f3, - 0x11654: 0xe0007e89, - 0x11669: 0xe000737d, - 0x1166c: 0xe0007e77, 0x1166f: 0xe0009254, - 0x11671: 0xe0007fa6, - // Block 0x45a, offset 0x11680 - 0x11681: 0xe0005c18, 0x11682: 0xe00087be, - 0x11684: 0xe0009357, 0x11687: 0xe0004c77, - 0x1168b: 0xe0005527, - 0x11692: 0xe0009049, - 0x11694: 0xe0004ff3, 0x11695: 0xe0009739, - 0x11699: 0xe0005d81, - 0x1169d: 0xe0005710, - 0x116a0: 0xe0004bd5, 0x116a2: 0xe0007eb3, - 0x116a7: 0xe00079ff, - 0x116aa: 0xe0007997, 0x116ab: 0xe000799f, - 0x116ae: 0xe000a26d, - 0x116b0: 0xe000a1c8, - 0x116b7: 0xe0008444, - 0x116b8: 0xe0007b4b, 0x116ba: 0xe0005a14, - 0x116bc: 0xe0006d86, 0x116bd: 0xe0007607, - // Block 0x45b, offset 0x116c0 - 0x116c9: 0xe000935b, 0x116cb: 0xe0004ed9, - 0x116cd: 0xe0007e7a, - 0x116d1: 0xe00092f7, 0x116d2: 0xe0005e33, 0x116d3: 0xe0008a19, - 0x116d6: 0xe00076d3, - 0x116da: 0xe000a255, - 0x116dd: 0xe000950c, 0x116de: 0xe0008eb0, - 0x116e1: 0xe00072d1, 0x116e2: 0xe000704e, - 0x116e5: 0xe000498a, 0x116e6: 0xe0008e77, 0x116e7: 0xe0004bd8, - 0x116e8: 0xe00044bb, 0x116eb: 0xe000613b, - 0x116ee: 0xe0009257, - 0x116f1: 0xe0005078, 0x116f2: 0xe0008468, 0x116f3: 0xe0006b0f, - 0x116f4: 0xe0009cd0, 0x116f5: 0xe00099f9, 0x116f7: 0xe000a14f, - 0x116f9: 0xe0004f9b, - 0x116fd: 0xe0007120, 0x116fe: 0xe0004518, - // Block 0x45c, offset 0x11700 - 0x11702: 0xe0007406, 0x11703: 0xe0009e77, - 0x11706: 0xe000654c, - 0x11709: 0xe00068b0, - 0x1170c: 0xe000a934, - 0x11711: 0xe0009bd8, - 0x11715: 0xe0005eb3, 0x11716: 0xe0009630, - 0x11719: 0xe00091bd, 0x1171a: 0xe000986b, 0x1171b: 0xe00064dc, - 0x1171d: 0xe0008c7d, - 0x11725: 0xe00071ad, - 0x11728: 0xe0007030, 0x1172b: 0xe0006b12, - 0x1172d: 0xe0006e00, - 0x11733: 0xe000873e, - 0x11736: 0xe00054d0, 0x11737: 0xe00082a5, - 0x11738: 0xe0006cc8, - 0x1173d: 0xe000603f, 0x1173f: 0xe000a787, - // Block 0x45d, offset 0x11740 - 0x11740: 0xe0008b69, 0x11743: 0xe00081e8, - 0x11744: 0xe000760b, 0x11745: 0xe0009ed7, 0x11747: 0xe00063fc, - 0x1174c: 0xe000a640, 0x1174e: 0xe0005f98, - 0x11754: 0xe0005e7b, 0x11755: 0xe0005e0b, - 0x11758: 0xe0009471, - 0x1175e: 0xe0006709, 0x1175f: 0xe00099b4, - 0x11761: 0xe00064f8, 0x11762: 0xe000545a, 0x11763: 0xe0009e3e, - 0x11768: 0xe0009608, 0x1176a: 0xe00060e0, 0x1176b: 0xe0006460, - 0x1176c: 0xe0008f13, - 0x11770: 0xe000a259, 0x11771: 0xe00057cf, 0x11772: 0xe000423c, 0x11773: 0xe0009e10, - 0x11774: 0xe0005239, 0x11777: 0xe0006628, - 0x11778: 0xe000a1fa, 0x11779: 0xe0004240, 0x1177a: 0xe0007f01, 0x1177b: 0xe000a5c0, - 0x1177c: 0xe0008227, 0x1177d: 0xe000822a, 0x1177e: 0xe000507b, 0x1177f: 0xe0007983, - // Block 0x45e, offset 0x11780 - 0x11784: 0xe0008742, 0x11787: 0xe000695d, - 0x1178a: 0xe0006ccc, 0x1178b: 0xe0005117, - 0x1178f: 0xe0006d89, - 0x11795: 0xe000886e, 0x11796: 0xe0009eb6, 0x11797: 0xe0008add, - 0x1179a: 0xe00046bd, - 0x1179c: 0xe00067b3, - 0x117a0: 0xe0006cd0, - 0x117a6: 0xe000552a, 0x117a7: 0xe0008e7a, - 0x117ab: 0xe000481d, - 0x117ad: 0xe0008b6d, - 0x117b3: 0xe00069db, - 0x117b5: 0xe00076d7, 0x117b6: 0xe0006d8c, 0x117b7: 0xe00043b0, - 0x117b8: 0xe0007f5e, - 0x117bd: 0xe000803b, 0x117be: 0xe000822d, - // Block 0x45f, offset 0x117c0 - 0x117c1: 0xe000999c, 0x117c2: 0xe0006cd4, - 0x117c8: 0xe0009ff9, 0x117c9: 0xe00059d8, 0x117ca: 0xe0005837, 0x117cb: 0xe000724c, - 0x117d0: 0xe0004c7a, 0x117d1: 0xe0004f9f, 0x117d3: 0xe0004a35, - 0x117d5: 0xe00083ce, 0x117d6: 0xe0005ba4, - 0x117da: 0xe0008eb3, 0x117db: 0xe0008995, - 0x117dd: 0xe0007451, 0x117de: 0xe000a8f7, 0x117df: 0xe0006111, - 0x117e0: 0xe00093a3, 0x117e1: 0xe0006180, 0x117e2: 0xe0009e41, 0x117e3: 0xe0004b0d, - 0x117e5: 0xe0004b90, 0x117e7: 0xe00087c2, - 0x117e8: 0xe000a1cb, 0x117e9: 0xe0005cc0, - 0x117ec: 0xe00058e9, - 0x117f1: 0xe0007d86, 0x117f3: 0xe0009664, - 0x117f6: 0xe0007a23, 0x117f7: 0xe0008b71, - 0x117fa: 0xe000451c, 0x117fb: 0xe000a6be, - 0x117ff: 0xe00085ba, - // Block 0x460, offset 0x11800 - 0x11801: 0xe00065c8, 0x11803: 0xe000511a, - 0x11804: 0xe0005b2e, 0x11807: 0xe0004350, - 0x11808: 0xe000a289, 0x1180a: 0xe0009e44, 0x1180b: 0xe00084da, - 0x1180f: 0xe000747d, - 0x11811: 0xe0007409, 0x11813: 0xe0004def, - 0x11814: 0xe0008cf8, 0x11815: 0xe0008506, 0x11817: 0xe00068f8, - 0x11818: 0xe000a515, 0x1181b: 0xe000846b, - 0x1181f: 0xe0008c80, - 0x11822: 0xe000558a, - 0x11825: 0xe0006232, 0x11826: 0xe000a2a1, 0x11827: 0xe000a42d, - 0x11829: 0xe0005277, - 0x1182d: 0xe0006235, - 0x11831: 0xe0007821, - 0x11834: 0xe0005615, 0x11835: 0xe0008746, - 0x1183a: 0xe00043b4, - 0x1183c: 0xe0009f8d, - // Block 0x461, offset 0x11840 - 0x11840: 0xe0004d19, - 0x11846: 0xe0006610, - 0x11848: 0xe0009b64, 0x1184a: 0xe00043b8, - 0x1184c: 0xe00061f9, 0x1184e: 0xe0005e37, - 0x11854: 0xe0005b0e, 0x11856: 0xe0005342, 0x11857: 0xe000a3e8, - 0x11858: 0xe00096b2, 0x11859: 0xe000a833, 0x1185b: 0xe000846e, - 0x1185d: 0xe00084aa, - 0x11862: 0xe000a391, - 0x11864: 0xe0005689, 0x11866: 0xe000792f, 0x11867: 0xe0008066, - 0x11869: 0xe000943f, 0x1186a: 0xe0009ef1, 0x1186b: 0xe0008cfb, - 0x1186c: 0xe0006a4f, 0x1186d: 0xe0009d90, - 0x11870: 0xe00093a7, 0x11871: 0xe0007b4f, - 0x11877: 0xe0006400, - 0x11879: 0xe00079e3, - 0x1187c: 0xe0009f64, 0x1187f: 0xe00068fc, - // Block 0x462, offset 0x11880 - 0x11880: 0xe0007e45, 0x11881: 0xe0008b75, 0x11882: 0xe0008d88, - 0x11885: 0xe00054d3, 0x11887: 0xe00072d5, - 0x11888: 0xe000a8af, 0x11889: 0xe00078b9, 0x1188a: 0xe000a6c1, 0x1188b: 0xe0005c8c, - 0x1188c: 0xe000a78a, - 0x11890: 0xe0006d8f, 0x11891: 0xe00046c1, 0x11892: 0xe000552d, - 0x11897: 0xe000570c, - 0x11898: 0xe0006495, 0x11899: 0xe0006b15, - 0x1189c: 0xe0006d20, 0x1189e: 0xe0008e0d, - 0x118a0: 0xe0005875, 0x118a1: 0xe00078e8, 0x118a3: 0xe000927b, - 0x118a7: 0xe0009de0, - 0x118a8: 0xe000a644, 0x118a9: 0xe00066d5, 0x118aa: 0xe00072d9, - 0x118ac: 0xe0006464, 0x118ad: 0xe0007f04, 0x118ae: 0xe00061fc, 0x118af: 0xe000a409, - 0x118b5: 0xe0009229, 0x118b7: 0xe0005504, - 0x118b9: 0xe000959c, - 0x118bc: 0xe0007f07, 0x118bd: 0xe000a836, - // Block 0x463, offset 0x118c0 - 0x118c3: 0xe0007561, - 0x118c5: 0xe0009f91, - 0x118c9: 0xe000558d, - 0x118cc: 0xe000507e, 0x118cd: 0xe000850a, - 0x118d0: 0xe0009bb4, 0x118d2: 0xe0009cc2, - 0x118d6: 0xe00097ac, 0x118d7: 0xe0009064, - 0x118d8: 0xe0005ec3, 0x118d9: 0xe0005ec7, - 0x118dd: 0xe000960c, 0x118de: 0xe0006284, 0x118df: 0xe0006288, - 0x118e0: 0xe000991a, 0x118e1: 0xe0009932, - 0x118e4: 0xe0007cc7, - 0x118e8: 0xe0007e31, 0x118eb: 0xe0009aa2, - 0x118ed: 0xe00065dc, 0x118ee: 0xe000511d, - 0x118f1: 0xe0009a7e, - 0x118f5: 0xe0005249, - 0x118f8: 0xe00052eb, 0x118fb: 0xe000a8b3, - 0x118fc: 0xe0004408, 0x118fd: 0xe000a501, 0x118ff: 0xe0006874, - // Block 0x464, offset 0x11900 - 0x1190a: 0xe000973c, - 0x1190d: 0xe00086a6, 0x1190f: 0xe000772f, - 0x11912: 0xe000527a, - 0x11914: 0xe0008c35, 0x11915: 0xe0009d03, 0x11916: 0xe0009e7a, 0x11917: 0xe000965c, - 0x11919: 0xe000a4a2, 0x1191b: 0xe00053b6, - 0x1191c: 0xe0005a18, 0x1191d: 0xe0006b18, - 0x11920: 0xe0009bfd, 0x11921: 0xe0008471, - 0x11925: 0xe0005007, 0x11926: 0xe0009e20, 0x11927: 0xe0006fd4, - 0x11928: 0xe000810a, 0x11929: 0xe0005302, 0x1192a: 0xe0004b7e, - 0x1192f: 0xe0004598, - 0x11933: 0xe000a6a4, - // Block 0x465, offset 0x11940 - 0x11941: 0xe0008592, 0x11942: 0xe00072dd, 0x11943: 0xe000740c, - 0x11946: 0xe000a17f, 0x11947: 0xe0004b31, - 0x11948: 0xe0006087, 0x1194a: 0xe000a371, - 0x1194d: 0xe000a648, - 0x11950: 0xe000498e, 0x11952: 0xe000a153, - 0x11955: 0xe0006d92, - 0x11959: 0xe0007869, 0x1195a: 0xe00079a7, - 0x1195d: 0xe0004ad9, 0x1195f: 0xe000a893, - 0x11960: 0xe0004b93, 0x11962: 0xe000a6c4, 0x11963: 0xe00085ea, - 0x11964: 0xe000a86f, 0x11965: 0xe00099b7, - 0x11968: 0xe000a05f, 0x11969: 0xe000835a, 0x1196a: 0xe00041f0, 0x1196b: 0xe0009c7a, - 0x1196c: 0xe000524d, 0x1196d: 0xe0004992, 0x1196f: 0xe0007481, - 0x11970: 0xe000a8ff, - // Block 0x466, offset 0x11980 - 0x11981: 0xe0007a93, 0x11983: 0xe000492e, - 0x11984: 0xe000973f, 0x11985: 0xe0007abf, - 0x11989: 0xe000754d, 0x1198b: 0xe0005d85, - 0x1198c: 0xe0008c83, 0x1198d: 0xe000a063, 0x1198f: 0xe000a375, - 0x11992: 0xe00083e6, - 0x11994: 0xe000a6c7, 0x11995: 0xe000a964, 0x11996: 0xe0009d66, 0x11997: 0xe00061c9, - 0x1199a: 0xe000714c, 0x1199b: 0xe0008999, - 0x1199f: 0xe0007c7f, - 0x119a0: 0xe0008230, 0x119a2: 0xe00058c9, 0x119a3: 0xe000a5c4, - 0x119a4: 0xe00097c8, 0x119a7: 0xe0005cfa, - 0x119b0: 0xe0008e11, 0x119b1: 0xe00069de, 0x119b2: 0xe0006960, 0x119b3: 0xe0005508, - 0x119b4: 0xe000993a, 0x119b5: 0xe00093f7, 0x119b6: 0xe0006254, - 0x119b8: 0xe00047ab, 0x119bb: 0xe000a20a, - 0x119bc: 0xe0005530, 0x119bd: 0xe000948b, 0x119be: 0xe00049be, - // Block 0x467, offset 0x119c0 - 0x119c4: 0xe0005235, 0x119c5: 0xe0008b79, 0x119c6: 0xe000986e, 0x119c7: 0xe00055f1, - 0x119c9: 0xe0009610, 0x119cb: 0xe0007e35, - 0x119cf: 0xe0005823, - 0x119d1: 0xe000a4c9, 0x119d3: 0xe0004e33, - 0x119d5: 0xe00094e4, - 0x119d8: 0xe0005eeb, 0x119d9: 0xe00095c4, 0x119da: 0xe000a505, 0x119db: 0xe000a4f1, - 0x119dc: 0xe0006e04, 0x119dd: 0xe00093fb, 0x119df: 0xe0008233, - 0x119e0: 0xe000a3eb, 0x119e1: 0xe000760f, 0x119e2: 0xe0007180, - 0x119f0: 0xe0009aba, 0x119f1: 0xe00052b1, 0x119f2: 0xe00080ba, 0x119f3: 0xe0006cd8, - 0x119f4: 0xe0009946, 0x119f6: 0xe000a64c, 0x119f7: 0xe0008fa9, - 0x119f8: 0xe0004755, 0x119f9: 0xe000780c, 0x119fa: 0xe0006fd8, 0x119fb: 0xe0009994, - 0x119fc: 0xe0009de4, - // Block 0x468, offset 0x11a00 - 0x11a00: 0xe0009742, 0x11a01: 0xe00071b0, 0x11a03: 0xe0006ee4, - 0x11a06: 0xe0004520, - 0x11a08: 0xe0008236, 0x11a09: 0xe0008239, - 0x11a0d: 0xe0006258, 0x11a0e: 0xe0009db0, 0x11a0f: 0xe000840e, - 0x11a14: 0xe00083d2, 0x11a15: 0xe0007613, - 0x11a1a: 0xe0007fe4, 0x11a1b: 0xe0007763, - 0x11a1c: 0xe000a379, 0x11a1f: 0xe0004304, - 0x11a27: 0xe0004b81, - 0x11a2c: 0xe00070bd, 0x11a2d: 0xe0005120, - 0x11a30: 0xe000a650, - 0x11a34: 0xe00093ab, 0x11a37: 0xe000444f, - 0x11a3c: 0xe00074d5, 0x11a3e: 0xe0004452, 0x11a3f: 0xe000810e, - // Block 0x469, offset 0x11a40 - 0x11a42: 0xe0007f62, - 0x11a44: 0xe0005c90, 0x11a46: 0xe0005590, 0x11a47: 0xe000835e, - 0x11a48: 0xe00085ed, 0x11a4a: 0xe000465d, 0x11a4b: 0xe0009c00, - 0x11a4c: 0xe000a654, 0x11a4d: 0xe0007d2a, - 0x11a52: 0xe0008e4d, 0x11a53: 0xe0009ef4, - 0x11a55: 0xe0006042, - 0x11a58: 0xe0009333, 0x11a59: 0xe0009337, 0x11a5a: 0xe000935f, - 0x11a5d: 0xe0009cba, 0x11a5f: 0xe0009c62, - 0x11a60: 0xe0007cca, 0x11a62: 0xe0005e3b, 0x11a63: 0xe0004a65, - 0x11a64: 0xe00041f4, 0x11a67: 0xe000a3ee, - 0x11a68: 0xe0004455, 0x11a6b: 0xe0008e15, - 0x11a6e: 0xe00058ec, - 0x11a70: 0xe00081b2, 0x11a71: 0xe000537a, 0x11a73: 0xe000428c, - 0x11a74: 0xe00073b2, 0x11a75: 0xe0007faa, 0x11a76: 0xe00046c5, 0x11a77: 0xe00043bc, - 0x11a7a: 0xe0005c1b, - 0x11a7d: 0xe00094ac, 0x11a7e: 0xe0007f22, - // Block 0x46a, offset 0x11a80 - 0x11a81: 0xe00097cc, 0x11a82: 0xe0007fe7, 0x11a83: 0xe0007fae, - 0x11a8a: 0xe0006963, - 0x11a8d: 0xe0004c23, 0x11a8e: 0xe0009021, - 0x11a90: 0xe0005968, 0x11a91: 0xe0006ab3, 0x11a92: 0xe0004e79, - 0x11a94: 0xe00096d9, 0x11a96: 0xe0008382, - 0x11a98: 0xe000a93a, 0x11a99: 0xe000a937, 0x11a9a: 0xe0009b68, - 0x11aa4: 0xe0006878, 0x11aa7: 0xe0005645, - 0x11aa8: 0xe0004354, 0x11aa9: 0xe00045ab, 0x11aab: 0xe000625c, - 0x11aac: 0xe00046c9, 0x11aae: 0xe000613e, 0x11aaf: 0xe0009363, - 0x11ab2: 0xe000a245, - 0x11ab6: 0xe0007913, - 0x11ab8: 0xe0006f88, 0x11aba: 0xe00053ce, 0x11abb: 0xe0009b80, - 0x11abc: 0xe0004759, 0x11abe: 0xe0004308, - // Block 0x46b, offset 0x11ac0 - 0x11ac3: 0xe0004f5f, - 0x11ac6: 0xe0008d8b, 0x11ac7: 0xe0004244, - 0x11ac8: 0xe000a1a4, 0x11ac9: 0xe00083f6, 0x11aca: 0xe0007c82, 0x11acb: 0xe0006141, - 0x11acc: 0xe0007a03, - 0x11ad5: 0xe0007b03, 0x11ad7: 0xe000a020, - 0x11ade: 0xe00060e4, 0x11adf: 0xe00054f1, - 0x11ae3: 0xe00061cd, - 0x11ae6: 0xe00051a1, - 0x11af2: 0xe000922d, - 0x11af6: 0xe0005757, 0x11af7: 0xe000a6ca, - 0x11af8: 0xe000a2a5, 0x11afa: 0xe000933b, - 0x11afc: 0xe0004c7d, 0x11afd: 0xe000a5f8, 0x11afe: 0xe0006fb0, 0x11aff: 0xe0008411, - // Block 0x46c, offset 0x11b00 - 0x11b00: 0xe000596c, - 0x11b07: 0xe000545e, - 0x11b08: 0xe00049ed, 0x11b0a: 0xe0006144, - 0x11b0c: 0xe0007361, 0x11b0d: 0xe00071b3, 0x11b0e: 0xe0008342, - 0x11b10: 0xe0006fdc, 0x11b11: 0xe00075ba, 0x11b12: 0xe00047ae, - 0x11b14: 0xe00086da, 0x11b15: 0xe00087c6, 0x11b16: 0xe000a4cd, - 0x11b1a: 0xe00094b0, - 0x11b1e: 0xe00076af, 0x11b1f: 0xe0004f33, - 0x11b21: 0xe000430c, 0x11b22: 0xe0009225, - 0x11b27: 0xe00093ff, - 0x11b29: 0xe0008a1d, 0x11b2a: 0xe0008aad, - 0x11b2e: 0xe0005c64, - 0x11b30: 0xe000899d, 0x11b31: 0xe000a93d, 0x11b32: 0xe000a967, 0x11b33: 0xe00092a3, - 0x11b34: 0xe00054d6, 0x11b35: 0xe0004d1c, 0x11b36: 0xe000a430, - 0x11b39: 0xe00077d4, - 0x11b3e: 0xe00058ef, 0x11b3f: 0xe0006404, - // Block 0x46d, offset 0x11b40 - 0x11b40: 0xe0007051, 0x11b41: 0xe0009dbc, 0x11b43: 0xe000475d, - 0x11b47: 0xe0006e68, - 0x11b48: 0xe000a433, 0x11b49: 0xe0006966, 0x11b4a: 0xe0007b07, 0x11b4b: 0xe00071b6, - 0x11b4d: 0xe0008806, 0x11b4e: 0xe000931f, - 0x11b51: 0xe000670d, 0x11b52: 0xe00064cb, 0x11b53: 0xe0009abd, - 0x11b57: 0xe0008833, - 0x11b58: 0xe0009b0c, 0x11b5b: 0xe000440c, - 0x11b63: 0xe0004d1f, - 0x11b68: 0xe000853a, - 0x11b6e: 0xe000687c, - 0x11b71: 0xe000500b, 0x11b73: 0xe000638c, - 0x11b76: 0xe00067b6, - 0x11b79: 0xe0006969, 0x11b7a: 0xe00090be, - 0x11b7c: 0xe00077b8, 0x11b7e: 0xe0008d8e, 0x11b7f: 0xe00073d2, - // Block 0x46e, offset 0x11b80 - 0x11b80: 0xe0005081, 0x11b83: 0xe00065e0, - 0x11b84: 0xe00096dc, 0x11b86: 0xe00061d1, - 0x11b89: 0xe0004635, 0x11b8a: 0xe0009cd3, - 0x11b91: 0xe0007917, 0x11b92: 0xe0006d95, - 0x11b94: 0xe0006810, 0x11b95: 0xe0009ca4, 0x11b96: 0xe00056d3, 0x11b97: 0xe000a157, - 0x11b98: 0xe0008ab1, 0x11b9b: 0xe0009e7d, - 0x11ba8: 0xe0009e24, 0x11bab: 0xe0009f67, - 0x11bac: 0xe0009c27, - 0x11bb1: 0xe0009e80, - 0x11bb5: 0xe0008871, - 0x11bb9: 0xe0005e9b, - 0x11bbc: 0xe000771b, 0x11bbd: 0xe0009820, - // Block 0x46f, offset 0x11bc0 - 0x11bc2: 0xe0006900, - 0x11bc4: 0xe0008f16, 0x11bc5: 0xe000537e, 0x11bc6: 0xe0009b34, 0x11bc7: 0xe0006147, - 0x11bc8: 0xe0005251, 0x11bc9: 0xe0005827, 0x11bca: 0xe0006813, - 0x11bcc: 0xe0006334, 0x11bcd: 0xe00062c8, 0x11bcf: 0xe00051a4, - 0x11bd0: 0xe0004b84, 0x11bd1: 0xe000467d, 0x11bd2: 0xe00044be, 0x11bd3: 0xe00094b4, - 0x11bd4: 0xe00063ac, 0x11bd5: 0xe0009adb, 0x11bd6: 0xe0009ac0, 0x11bd7: 0xe0007eb6, - 0x11bd8: 0xe0004c80, 0x11bd9: 0xe0008dfd, 0x11bdb: 0xe00096df, - 0x11bdc: 0xe0006498, - 0x11bec: 0xe0004add, 0x11bed: 0xe0007485, 0x11bee: 0xe0005183, 0x11bef: 0xe0009029, - 0x11bf1: 0xe0004996, 0x11bf3: 0xe0004e1b, - 0x11bf5: 0xe0008df5, 0x11bf6: 0xe0009323, 0x11bf7: 0xe0004820, - 0x11bfd: 0xe0007c25, 0x11bfe: 0xe00073a2, 0x11bff: 0xe00051a7, - // Block 0x470, offset 0x11c00 - 0x11c01: 0xe0009067, 0x11c02: 0xe0004b69, - 0x11c07: 0xe000906a, - 0x11c09: 0xe000766b, - 0x11c0c: 0xe00045cd, - 0x11c10: 0xe00051ad, 0x11c11: 0xe0005533, 0x11c12: 0xe00059cc, - 0x11c28: 0xe000778a, 0x11c2a: 0xe00051b0, 0x11c2b: 0xe0008e7d, - 0x11c2f: 0xe0009109, - 0x11c39: 0xe00083ea, 0x11c3a: 0xe0008b7d, 0x11c3b: 0xe0007a2b, - 0x11c3d: 0xe0005e3f, 0x11c3e: 0xe000a345, - // Block 0x471, offset 0x11c40 - 0x11c42: 0xe0007ccd, 0x11c43: 0xe0004dbf, - 0x11c44: 0xe0004d22, 0x11c46: 0xe0004932, - 0x11c49: 0xe0009287, - 0x11c4c: 0xe0009d54, 0x11c4d: 0xe000a09f, 0x11c4e: 0xe00070c0, 0x11c4f: 0xe00051dc, - 0x11c50: 0xe0007a27, - 0x11c55: 0xe0009e83, 0x11c57: 0xe00094e8, - 0x11c67: 0xe0006745, - 0x11c68: 0xe0006b1b, 0x11c69: 0xe00059d0, 0x11c6b: 0xe00061d5, - 0x11c6e: 0xe00044c1, - 0x11c71: 0xe000778d, 0x11c72: 0xe0004e1f, - 0x11c76: 0xe0009871, 0x11c77: 0xe0009634, - 0x11c7a: 0xe00051e0, 0x11c7b: 0xe0005255, - 0x11c7f: 0xe0006d98, - // Block 0x472, offset 0x11c80 - 0x11c80: 0xe000a8b7, 0x11c83: 0xe0007054, - 0x11c84: 0xe0005c88, 0x11c87: 0xe00095c8, - 0x11c88: 0xe00071b9, 0x11c89: 0xe0005536, 0x11c8a: 0xe0006816, - 0x11c8c: 0xe000874a, 0x11c8e: 0xe0005123, 0x11c8f: 0xe0005593, - 0x11c92: 0xe000649b, - 0x11c96: 0xe00077bc, - 0x11c98: 0xe0004dd3, 0x11c9b: 0xe0004b60, - 0x11c9c: 0xe0007c28, 0x11c9f: 0xe0008c39, - 0x11ca0: 0xe0005885, 0x11ca1: 0xe0009442, 0x11ca2: 0xe0009ba0, - 0x11ca5: 0xe0008b25, 0x11ca7: 0xe000499a, - 0x11ca8: 0xe0009823, 0x11ca9: 0xe0007977, 0x11caa: 0xe0008cfe, - 0x11cac: 0xe0004d9b, - 0x11cbe: 0xe0007a97, - // Block 0x473, offset 0x11cc0 - 0x11cc0: 0xe0004248, 0x11cc3: 0xe0008a21, - 0x11cc4: 0xe000823c, 0x11cc6: 0xe0004eac, - 0x11cc9: 0xe00082a8, - 0x11ccf: 0xe0006114, - 0x11cd0: 0xe0008c86, - 0x11cd6: 0xe00083da, - 0x11cda: 0xe000786d, 0x11cdb: 0xe000a5c8, - 0x11cdf: 0xe0006de0, - 0x11ce0: 0xe00076b3, 0x11ce1: 0xe0007617, 0x11ce3: 0xe0009949, - 0x11ce9: 0xe000447f, 0x11ceb: 0xe0009874, - 0x11ced: 0xe00045ae, 0x11cee: 0xe000a839, - 0x11cf2: 0xe0006f4c, - 0x11cf4: 0xe0008112, 0x11cf5: 0xe000453c, 0x11cf6: 0xe000780f, 0x11cf7: 0xe0006c74, - // Block 0x474, offset 0x11d00 - 0x11d06: 0xe0004d25, - 0x11d09: 0xe000421c, - 0x11d0d: 0xe0007124, 0x11d0f: 0xe00062cc, - 0x11d12: 0xe0006468, - 0x11d14: 0xe0007057, 0x11d16: 0xe0007eb9, 0x11d17: 0xe0005539, - 0x11d1c: 0xe00071bc, - 0x11d22: 0xe000910d, - 0x11d24: 0xe00077d8, 0x11d25: 0xe0009877, - 0x11d28: 0xe0009bd0, 0x11d2a: 0xe0005486, 0x11d2b: 0xe0006390, - 0x11d2c: 0xe0006338, 0x11d2d: 0xe0009bc0, 0x11d2f: 0xe0005596, - 0x11d30: 0xe0004966, - 0x11d36: 0xe0009403, - 0x11d3a: 0xe000a854, - 0x11d3e: 0xe000928b, - // Block 0x475, offset 0x11d40 - 0x11d58: 0xe00088f9, - 0x11d60: 0xe00097d0, - 0x11d67: 0xe0009808, - 0x11d69: 0xe0005ddd, - 0x11d6d: 0xe00094ec, 0x11d6f: 0xe000906d, - 0x11d73: 0xe0004d28, - 0x11d78: 0xe0006045, 0x11d79: 0xe0006048, 0x11d7a: 0xe0008b29, 0x11d7b: 0xe0006f8c, - 0x11d7d: 0xe0009f21, - // Block 0x476, offset 0x11d80 - 0x11d85: 0xe0004e7c, - 0x11d88: 0xe0005a94, - 0x11d90: 0xe0009c3f, 0x11d91: 0xe0009c3b, 0x11d92: 0xe0006c3c, 0x11d93: 0xe0007ebc, - 0x11d95: 0xe0006de3, - 0x11d99: 0xe0008fad, 0x11d9a: 0xe000523d, - 0x11d9d: 0xe000a84b, 0x11d9e: 0xe0005462, 0x11d9f: 0xe0004c26, - 0x11da4: 0xe00095a0, 0x11da5: 0xe00063b0, - 0x11da9: 0xe0005bc5, 0x11dab: 0xe000614a, - 0x11dad: 0xe0009cd6, 0x11dae: 0xe00097f8, - 0x11db0: 0xe00092af, 0x11db2: 0xe00062d0, - 0x11dbb: 0xe000539e, - 0x11dbc: 0xe0004358, 0x11dbe: 0xe0004a1a, 0x11dbf: 0xe000458c, - // Block 0x477, offset 0x11dc0 - 0x11dc1: 0xe0007d62, - 0x11dc4: 0xe0005a97, 0x11dc5: 0xe0009510, 0x11dc7: 0xe0009c33, - 0x11dc9: 0xe00092a7, 0x11dca: 0xe00045b1, - 0x11dcd: 0xe0008d01, 0x11dce: 0xe00046cd, - 0x11dd0: 0xe000a5fc, 0x11dd2: 0xe0004fbf, - 0x11dd4: 0xe00053d2, 0x11dd5: 0xe000a863, 0x11dd7: 0xe00065ac, - 0x11dd8: 0xe000658c, 0x11dda: 0xe00044c4, - 0x11de0: 0xe0008cbc, 0x11de1: 0xe00054d9, 0x11de2: 0xe0009b10, 0x11de3: 0xe0005599, - 0x11de5: 0xe00057fb, 0x11de6: 0xe0009313, 0x11de7: 0xe00044c7, - 0x11dec: 0xe0008414, 0x11ded: 0xe000a580, 0x11def: 0xe0006a83, - 0x11df1: 0xe0004220, 0x11df2: 0xe00094b8, - 0x11df4: 0xe000a58c, - 0x11dfa: 0xe0009cd9, - 0x11dfe: 0xe0007ebf, - // Block 0x478, offset 0x11e00 - 0x11e00: 0xe000633c, 0x11e02: 0xe0005b7a, - 0x11e04: 0xe0009c47, 0x11e07: 0xe000a25d, - 0x11e0a: 0xe0005950, - 0x11e0f: 0xe0005b4a, - 0x11e14: 0xe00057d3, - 0x11e18: 0xe0007871, 0x11e19: 0xe0009367, - 0x11e1d: 0xe0006fa0, - 0x11e22: 0xe00092fb, 0x11e23: 0xe0005970, - 0x11e24: 0xe0009b84, - 0x11e2a: 0xe0004bdb, 0x11e2b: 0xe000a590, - 0x11e2c: 0xe00057ff, 0x11e2f: 0xe0009070, - 0x11e32: 0xe0005126, - 0x11e36: 0xe00071bf, 0x11e37: 0xe0004823, - 0x11e38: 0xe000823f, 0x11e39: 0xe0004458, 0x11e3b: 0xe000499e, - 0x11e3d: 0xe0006394, 0x11e3e: 0xe0006408, 0x11e3f: 0xe0008b81, - // Block 0x479, offset 0x11e40 - 0x11e45: 0xe0004826, - 0x11e48: 0xe000a73c, 0x11e49: 0xe0006238, - 0x11e4d: 0xe0006d9b, 0x11e4e: 0xe0004bde, 0x11e4f: 0xe0006260, - 0x11e51: 0xe0004c83, - 0x11e54: 0xe0007906, 0x11e55: 0xe0009a32, 0x11e56: 0xe0007c85, 0x11e57: 0xe0009d69, - 0x11e5d: 0xe0009e56, 0x11e5e: 0xe00093af, - 0x11e62: 0xe0004310, 0x11e63: 0xe0006be4, - 0x11e66: 0xe00055f5, - 0x11e6c: 0xe00046d1, 0x11e6d: 0xe0007875, - 0x11e72: 0xe0004829, - 0x11e74: 0xe0008b85, 0x11e75: 0xe00088fd, 0x11e77: 0xe00067b9, - 0x11e78: 0xe00071c2, - 0x11e7e: 0xe0006e6c, - // Block 0x47a, offset 0x11e80 - 0x11e81: 0xe00056d6, 0x11e82: 0xe00059dc, 0x11e83: 0xe0009e47, - 0x11e85: 0xe000a73f, 0x11e87: 0xe00061a5, - 0x11e8c: 0xe0006a53, - 0x11e90: 0xe000696c, 0x11e91: 0xe0006340, - 0x11e97: 0xe00056b8, - 0x11e99: 0xe0005ba7, 0x11e9b: 0xe00048d2, - 0x11e9c: 0xe0006b1e, 0x11e9d: 0xe00041c9, 0x11e9f: 0xe00091fd, - 0x11ea1: 0xe000769b, - 0x11ea4: 0xe0004f63, 0x11ea5: 0xe00094bc, 0x11ea7: 0xe00067bc, - 0x11eab: 0xe000867a, - 0x11eac: 0xe000933f, 0x11eaf: 0xe0006b21, - 0x11eb0: 0xe00074d9, 0x11eb1: 0xe00086aa, 0x11eb2: 0xe00092ab, - 0x11eb7: 0xe0005346, - 0x11eb9: 0xe000640c, - 0x11ebc: 0xe00078eb, 0x11ebd: 0xe000740f, 0x11ebf: 0xe00082ab, - // Block 0x47b, offset 0x11ec0 - 0x11ec1: 0xe0006410, 0x11ec2: 0xe0005129, 0x11ec3: 0xe0008a25, - 0x11ec4: 0xe000608a, 0x11ec5: 0xe00058f2, 0x11ec6: 0xe0009d84, - 0x11eca: 0xe000646c, 0x11ecb: 0xe0006e70, - 0x11ecc: 0xe0008b89, 0x11ecf: 0xe0008dd9, - 0x11ed2: 0xe0005c2a, - 0x11ed7: 0xe0005084, - 0x11ee0: 0xe000614d, 0x11ee3: 0xe0005087, - 0x11ee5: 0xe0008566, 0x11ee6: 0xe000534a, - 0x11ee8: 0xe0009073, 0x11ee9: 0xe0008d04, - 0x11eec: 0xe00072e1, 0x11eed: 0xe000806a, - 0x11ef1: 0xe000a067, 0x11ef2: 0xe00054f4, - 0x11ef4: 0xe0007fea, - 0x11efa: 0xe0007e49, 0x11efb: 0xe0006264, - 0x11efc: 0xe0006268, 0x11efd: 0xe00055f9, 0x11eff: 0xe0007c88, - // Block 0x47c, offset 0x11f00 - 0x11f00: 0xe000832e, 0x11f03: 0xe00099a0, - 0x11f06: 0xe000490a, 0x11f07: 0xe00073d6, - 0x11f09: 0xe0006414, 0x11f0a: 0xe000a436, - 0x11f0c: 0xe00093b3, 0x11f0e: 0xe0005ffc, 0x11f0f: 0xe000a4d9, - 0x11f10: 0xe0006880, 0x11f11: 0xe0004fc3, 0x11f13: 0xe00079e7, - 0x11f14: 0xe0006e08, 0x11f15: 0xe000a89f, - 0x11f1b: 0xe00044e5, - 0x11f1e: 0xe000662c, 0x11f1f: 0xe0006fe0, - 0x11f20: 0xe0007b53, 0x11f21: 0xe000a2f1, - 0x11f24: 0xe0005a58, 0x11f25: 0xe00098fa, 0x11f27: 0xe0005f0f, - 0x11f28: 0xe000867e, 0x11f2b: 0xe0004d2b, - 0x11f2d: 0xe000705a, 0x11f2f: 0xe0007412, - 0x11f30: 0xe0009ffc, 0x11f31: 0xe000806e, - 0x11f34: 0xe0006117, 0x11f35: 0xe0005319, 0x11f36: 0xe00093b7, 0x11f37: 0xe0007d2e, - 0x11f3a: 0xe0006630, 0x11f3b: 0xe0007733, - // Block 0x47d, offset 0x11f40 - 0x11f41: 0xe0008d07, 0x11f42: 0xe0007415, 0x11f43: 0xe000a658, - 0x11f44: 0xe000a65c, - 0x11f48: 0xe0004c29, 0x11f49: 0xe0009111, 0x11f4b: 0xe0009115, - 0x11f4c: 0xe0006d24, 0x11f4e: 0xe000a539, 0x11f4f: 0xe000766f, - 0x11f59: 0xe0008f69, 0x11f5b: 0xe000a2a9, - 0x11f5d: 0xe0008eb6, 0x11f5e: 0xe000a940, 0x11f5f: 0xe0006fe4, - 0x11f61: 0xe0009eb9, 0x11f62: 0xe0008acd, - 0x11f64: 0xe0007c8b, 0x11f65: 0xe000a5d0, 0x11f66: 0xe000a6cd, 0x11f67: 0xe000a439, - 0x11f68: 0xe00074dd, 0x11f69: 0xe0005e43, 0x11f6b: 0xe0009b14, - 0x11f6c: 0xe000724f, 0x11f6e: 0xe0006688, 0x11f6f: 0xe00046d5, - 0x11f70: 0xe0006e34, 0x11f73: 0xe0006e0c, - 0x11f74: 0xe0009668, 0x11f76: 0xe0008b8d, 0x11f77: 0xe0004e97, - 0x11f78: 0xe0008b91, 0x11f7a: 0xe0009076, 0x11f7b: 0xe00076f7, - // Block 0x47e, offset 0x11f80 - 0x11f84: 0xe000a806, 0x11f87: 0xe0004181, - 0x11f88: 0xe000a7de, 0x11f89: 0xe000a83c, 0x11f8b: 0xe000628c, - 0x11f8c: 0xe0004edc, 0x11f8e: 0xe0007b57, - 0x11f90: 0xe00081b5, 0x11f91: 0xe0006d9e, - 0x11f96: 0xe00051c0, 0x11f97: 0xe00076db, - 0x11f98: 0xe0007879, - 0x11f9d: 0xe0006000, 0x11f9e: 0xe0004c2c, - 0x11fa0: 0xe000482c, 0x11fa2: 0xe00093bb, 0x11fa3: 0xe000512c, - 0x11fab: 0xe00086e6, - 0x11fac: 0xe0006f50, 0x11fae: 0xe000604b, - 0x11fb1: 0xe000531d, 0x11fb2: 0xe000874e, 0x11fb3: 0xe000a3f1, - 0x11fb4: 0xe0009edb, 0x11fb5: 0xe000a0a3, - 0x11fb8: 0xe0005bc8, 0x11fb9: 0xe0006f68, 0x11fbb: 0xe00046d9, - 0x11fbe: 0xe00055fd, 0x11fbf: 0xe000a96a, - // Block 0x47f, offset 0x11fc0 - 0x11fc0: 0xe00079aa, 0x11fc1: 0xe000512f, - 0x11fc4: 0xe0007b2b, 0x11fc5: 0xe0007b37, 0x11fc6: 0xe0005938, 0x11fc7: 0xe00053d6, - 0x11fc9: 0xe000a742, - 0x11fd3: 0xe0009ebc, - 0x11fd6: 0xe0007766, - 0x11fd9: 0xe0006da1, 0x11fda: 0xe00060e8, 0x11fdb: 0xe000a7e2, - 0x11fdc: 0xe0007ec2, 0x11fdd: 0xe0009edf, - 0x11fe0: 0xe0004b11, 0x11fe3: 0xe0007a9b, - 0x11fe6: 0xe000a943, - 0x11fe8: 0xe0005b4e, 0x11fe9: 0xe0005210, 0x11fea: 0xe0005772, - 0x11fec: 0xe0007183, 0x11fee: 0xe0007987, 0x11fef: 0xe0009790, - 0x11ff0: 0xe0007e41, 0x11ff2: 0xe00048d6, 0x11ff3: 0xe0007bef, - 0x11ff4: 0xe00046dd, 0x11ff7: 0xe00042bc, - 0x11ff8: 0xe0006da4, 0x11ff9: 0xe0008d0d, 0x11ffa: 0xe0008d0a, - 0x11ffc: 0xe0005e47, 0x11ffe: 0xe0009025, 0x11fff: 0xe0009697, - // Block 0x480, offset 0x12000 - 0x12000: 0xe0009802, 0x12003: 0xe000a6d0, - 0x12005: 0xe0004568, - 0x12008: 0xe0008186, 0x12009: 0xe0008242, 0x1200b: 0xe0006928, - 0x1200c: 0xe0006398, 0x1200d: 0xe00066d9, - 0x12014: 0xe0006bc4, 0x12015: 0xe0009201, 0x12017: 0xe000583b, - 0x1201b: 0xe0005ecb, - 0x1201d: 0xe0008d10, 0x1201e: 0xe000508a, 0x1201f: 0xe000508d, - 0x12023: 0xe000568d, - 0x12026: 0xe00060d8, 0x12027: 0xe0005b32, - 0x12028: 0xe00060a8, 0x1202a: 0xe00061ff, 0x1202b: 0xe0005e9f, - 0x1202c: 0xe0006729, 0x1202d: 0xe0009317, 0x1202e: 0xe000990a, - 0x12031: 0xe0008eb9, 0x12033: 0xe0009d58, - 0x12034: 0xe00062d4, 0x12036: 0xe0009ac3, - 0x1203a: 0xe0004e5b, - 0x1203d: 0xe000a78d, - // Block 0x481, offset 0x12040 - 0x12045: 0xe000803e, 0x12046: 0xe000424c, - 0x12049: 0xe0006c50, - 0x1204e: 0xe0005cfd, 0x1204f: 0xe000a1fe, - 0x12050: 0xe0008809, 0x12051: 0xe00097b0, 0x12053: 0xe0009ef7, - 0x12056: 0xe0008752, - 0x1205c: 0xe00056bb, 0x1205e: 0xe0005090, 0x1205f: 0xe00070f8, - 0x12060: 0xe0004410, - 0x1206a: 0xe0009745, - 0x1206c: 0xe0008156, 0x1206d: 0xe000a15b, 0x1206f: 0xe000649e, - 0x12070: 0xe000455c, 0x12071: 0xe0005649, 0x12072: 0xe0004883, 0x12073: 0xe000611a, - 0x12075: 0xe0008874, 0x12077: 0xe0009cdc, - 0x1207b: 0xe00052e5, - 0x1207c: 0xe00088b9, 0x1207e: 0xe0007150, 0x1207f: 0xe0009d2c, - // Block 0x482, offset 0x12080 - 0x12087: 0xe000696f, - 0x12089: 0xe0007e4d, 0x1208b: 0xe0006418, - 0x1208c: 0xe00068b4, 0x1208f: 0xe00051e8, - 0x12090: 0xe0006e10, 0x12093: 0xe00056be, - 0x12095: 0xe0009a5e, 0x12097: 0xe0005db1, - 0x12098: 0xe0007c2b, 0x12099: 0xe0007dc7, 0x1209a: 0xe0005f12, - 0x1209c: 0xe00049f0, 0x1209d: 0xe0009079, - 0x120af: 0xe000482f, - 0x120b0: 0xe0009e14, 0x120b2: 0xe0007454, 0x120b3: 0xe000907c, - 0x120b6: 0xe0004184, 0x120b7: 0xe0004187, - 0x120b8: 0xe0004c86, - 0x120be: 0xe0007418, - // Block 0x483, offset 0x120c0 - 0x120c1: 0xe0009ade, - 0x120c4: 0xe0006634, 0x120c5: 0xe0005305, - 0x120ca: 0xe0008e51, - 0x120cf: 0xe00064e0, - 0x120d0: 0xe000604e, 0x120d1: 0xe0004314, 0x120d2: 0xe0009a4e, 0x120d3: 0xe0007ad7, - 0x120d4: 0xe0008245, 0x120d7: 0xe0007168, - 0x120d8: 0xe000862c, 0x120d9: 0xe000a12b, 0x120da: 0xe0008248, - 0x120dd: 0xe0009b18, 0x120de: 0xe00086ae, 0x120df: 0xe00051fc, - 0x120e2: 0xe00088bc, - 0x120e9: 0xe0004c89, - 0x120ec: 0xe0004250, 0x120ef: 0xe000418a, - 0x120f0: 0xe000521d, 0x120f1: 0xe0008ebc, 0x120f3: 0xe0005c2d, - 0x120f4: 0xe000741b, 0x120f5: 0xe0009461, 0x120f6: 0xe0006b24, - 0x120f9: 0xe0007457, 0x120fb: 0xe0006b27, - 0x120fe: 0xe0008b95, - // Block 0x484, offset 0x12100 - 0x12103: 0xe000a6f7, - 0x12112: 0xe00072e5, 0x12113: 0xe00089a1, - 0x12116: 0xe0006da7, 0x12117: 0xe0005c94, - 0x1211d: 0xe0004ae9, 0x1211e: 0xe0004290, - 0x12121: 0xe0004be1, 0x12122: 0xe00064e4, - 0x1212a: 0xe0008ebf, - 0x1212e: 0xe00084ad, 0x1212f: 0xe0008072, - 0x12131: 0xe00049c2, 0x12132: 0xe0004886, - 0x12134: 0xe0008a29, - 0x12138: 0xe000a1ea, 0x12139: 0xe0004f67, 0x1213b: 0xe00074b9, - 0x1213c: 0xe00045b5, 0x1213d: 0xe000880c, - // Block 0x485, offset 0x12140 - 0x12140: 0xe0004560, 0x12141: 0xe000a15f, 0x12142: 0xe00047b1, 0x12143: 0xe000553c, - 0x12144: 0xe0004b35, 0x12146: 0xe0004b39, - 0x12148: 0xe0007673, 0x12149: 0xe000768b, - 0x1214e: 0xe00091c1, - 0x12150: 0xe000564d, 0x12151: 0xe0006cdc, 0x12153: 0xe000a5d4, - 0x12154: 0xe0005187, - 0x1216d: 0xe0009119, 0x1216f: 0xe0008c3d, - 0x12174: 0xe0006819, 0x12176: 0xe0009c66, 0x12177: 0xe0004224, - 0x1217e: 0xe0004dc3, 0x1217f: 0xe0004254, - // Block 0x486, offset 0x12180 - 0x12181: 0xe00058a1, 0x12183: 0xe0008c41, - 0x12185: 0xe0005f15, 0x12186: 0xe0006470, - 0x1218f: 0xe00048da, - 0x12193: 0xe000880f, - 0x12194: 0xe00099ba, 0x12197: 0xe00046e1, - 0x1219b: 0xe00051b3, - 0x1219d: 0xe0008d13, 0x1219f: 0xe000a745, - 0x121a0: 0xe000591c, 0x121a1: 0xe0007de5, 0x121a2: 0xe00096e2, 0x121a3: 0xe000757d, - 0x121a7: 0xe0007c8e, - 0x121a8: 0xe0005d00, - 0x121ad: 0xe0006b2a, 0x121af: 0xe0008c89, - 0x121b0: 0xe00047b4, 0x121b1: 0xe000490e, 0x121b3: 0xe000705d, - 0x121b5: 0xe0006550, 0x121b6: 0xe0006202, - // Block 0x487, offset 0x121c0 - 0x121c4: 0xe0005096, 0x121c5: 0xe0006638, - 0x121c9: 0xe0005fac, 0x121ca: 0xe0005132, 0x121cb: 0xe0005093, - 0x121cc: 0xe0009457, 0x121cd: 0xe0004912, - 0x121d0: 0xe00069e1, 0x121d2: 0xe0006749, - 0x121d5: 0xe0008e19, 0x121d6: 0xe0008c45, 0x121d7: 0xe0008d16, - 0x121d8: 0xe0004f37, 0x121da: 0xe000692c, - 0x121df: 0xe0005651, - 0x121e0: 0xe0005466, 0x121e3: 0xe00096b5, - 0x121e7: 0xe00086c6, - 0x121e8: 0xe00047b7, - 0x121ec: 0xe0004e37, 0x121ee: 0xe0006c54, - 0x121f2: 0xe0006daa, - 0x121f9: 0xe000553f, 0x121fa: 0xe0004a69, 0x121fb: 0xe00068b8, - 0x121fc: 0xe00068bc, - // Block 0x488, offset 0x12200 - 0x12200: 0xe0007de9, 0x12201: 0xe0004a45, - 0x12204: 0xe0008b31, 0x12205: 0xe0008417, - 0x1220b: 0xe00058cd, - 0x1220d: 0xe0007489, 0x1220e: 0xe0009826, - 0x12211: 0xe00069e4, 0x12212: 0xe00096e5, - 0x12219: 0xe0009407, - 0x12227: 0xe0006004, - 0x12230: 0xe0007812, - 0x12234: 0xe0005382, 0x12236: 0xe0008e55, - 0x12239: 0xe0009a82, - 0x1223d: 0xe0007a2f, 0x1223f: 0xe00098fe, - // Block 0x489, offset 0x12240 - 0x12242: 0xe0006b96, - 0x1224a: 0xe000787d, - 0x1224f: 0xe0004edf, - 0x12253: 0xe0009f48, - 0x12254: 0xe0006f18, 0x12255: 0xe0009ac6, 0x12257: 0xe0004524, - 0x12259: 0xe0006150, 0x1225a: 0xe00096e8, - 0x1225d: 0xe000599c, 0x1225e: 0xe0005ccc, - 0x12260: 0xe00051ec, 0x12261: 0xe000824b, 0x12262: 0xe000824e, 0x12263: 0xe0006205, - 0x12265: 0xe000815a, - 0x12268: 0xe0008b99, 0x1226a: 0xe0008b35, 0x1226b: 0xe0009009, - 0x1226c: 0xe00042e0, 0x1226d: 0xe000799b, 0x1226e: 0xe0008877, 0x1226f: 0xe00072e9, - 0x12273: 0xe0005f30, - 0x12275: 0xe0004f3b, 0x12277: 0xe000a1a7, - 0x12278: 0xe0009829, 0x12279: 0xe0007b5b, - // Block 0x48a, offset 0x12280 - 0x1228e: 0xe00041cc, - 0x12291: 0xe000681c, - 0x12294: 0xe0005857, 0x12295: 0xe0007f66, - 0x12298: 0xe0004d2e, 0x1229b: 0xe000911d, - 0x1229c: 0xe000641c, 0x1229f: 0xe0008836, - 0x122a4: 0xe000456c, 0x122a5: 0xe000a660, 0x122a6: 0xe0004294, 0x122a7: 0xe0006972, - 0x122ad: 0xe0006b99, 0x122ae: 0xe0007b5f, - 0x122b0: 0xe00090c1, 0x122b1: 0xe000980b, - 0x122b4: 0xe0005c30, 0x122b7: 0xe0004c2f, - 0x122bb: 0xe0009bc4, - 0x122bc: 0xe000a12f, 0x122be: 0xe000496a, - // Block 0x48b, offset 0x122c0 - 0x122c0: 0xe0004889, 0x122c1: 0xe0004832, 0x122c3: 0xe0006344, - 0x122c7: 0xe0008a2d, - 0x122ca: 0xe0006bc8, 0x122cb: 0xe0004c8c, - 0x122cc: 0xe0009c89, 0x122cd: 0xe00093bf, 0x122ce: 0xe000927e, - 0x122d0: 0xe0004b87, 0x122d3: 0xe00049c6, - 0x122e5: 0xe000a40c, 0x122e6: 0xe0007fb2, 0x122e7: 0xe000936b, - 0x122e8: 0xe0004a39, 0x122e9: 0xe0004482, 0x122ea: 0xe000445b, - 0x122ed: 0xe0006d5c, - 0x122f2: 0xe00048ee, - 0x122f9: 0xe000488c, 0x122fb: 0xe0004eaf, - 0x122fd: 0xe0008d19, 0x122ff: 0xe0004f6b, - // Block 0x48c, offset 0x12300 - 0x12300: 0xe0008949, 0x12302: 0xe000761b, - 0x12305: 0xe0008e59, - 0x1230a: 0xe00064fc, 0x1230b: 0xe0009c7e, - 0x12311: 0xe00058a5, 0x12312: 0xe00062b8, 0x12313: 0xe0005bf4, - 0x12314: 0xe00070c3, 0x12317: 0xe000887a, - 0x12319: 0xe0009efa, 0x1231b: 0xe0004ee2, - 0x1231e: 0xe000982c, 0x1231f: 0xe0008756, - 0x12321: 0xe0006051, 0x12323: 0xe0007881, - 0x1232b: 0xe0004611, - 0x12335: 0xe00096eb, - 0x12338: 0xe00062d8, 0x12339: 0xe00071c5, 0x1233a: 0xe000a556, 0x1233b: 0xe0004e7f, - 0x1233d: 0xe0008f6d, - // Block 0x48d, offset 0x12340 - 0x12343: 0xe0006540, - 0x12344: 0xe0004318, 0x12347: 0xe0009982, - 0x12348: 0xe0007ec5, 0x1234a: 0xe0005c51, 0x1234b: 0xe0004be4, - 0x12350: 0xe0009b38, 0x12352: 0xe000808e, 0x12353: 0xe00072ed, - 0x12358: 0xe0004f23, 0x12359: 0xe0005714, 0x1235a: 0xe00072c5, - 0x1235f: 0xe0005099, - 0x12361: 0xe0006ce0, 0x12362: 0xe0009ae1, - 0x12366: 0xe0005691, - 0x1236b: 0xe000a71f, - 0x12375: 0xe0006c14, - 0x1237f: 0xe0004414, - // Block 0x48e, offset 0x12380 - 0x12380: 0xe000534e, - 0x12384: 0xe00045b9, - 0x12389: 0xe0008b9d, - 0x1238d: 0xe000791b, 0x1238e: 0xe0004fc7, - 0x12390: 0xe0009614, - 0x12394: 0xe000548a, 0x12397: 0xe0006590, - 0x1239c: 0xe000a6d3, 0x1239d: 0xe0009015, 0x1239f: 0xe00041cf, - 0x123a0: 0xe0004761, 0x123a2: 0xe000457c, 0x123a3: 0xe000875a, - 0x123ae: 0xe000559c, - 0x123b3: 0xe0006a57, - 0x123b6: 0xe0007b0f, - 0x123bb: 0xe000a0d7, - 0x123bc: 0xe0008386, 0x123bf: 0xe0007b0b, - // Block 0x48f, offset 0x123c0 - 0x123c2: 0xe0005542, 0x123c3: 0xe0004e5e, - 0x123d3: 0xe0005a9a, - 0x123da: 0xe00058f5, 0x123db: 0xe0009001, - 0x123dc: 0xe000488f, 0x123dd: 0xe00055e5, 0x123de: 0xe0007a9f, 0x123df: 0xe0005954, - 0x123ea: 0xe0005958, - 0x123ec: 0xe0009a3a, - 0x123f6: 0xe000a249, - 0x123fb: 0xe00077e0, - 0x123fc: 0xe0009618, - // Block 0x490, offset 0x12400 - 0x12402: 0xe0006310, 0x12403: 0xe000936f, - 0x12404: 0xe00057b3, - 0x1240a: 0xe0004e23, - 0x1240c: 0xe000875e, - 0x12411: 0xe00092ff, 0x12412: 0xe00057b7, - 0x12416: 0xe0005803, - 0x1241e: 0xe0005a5c, - 0x12420: 0xe000a8eb, 0x12421: 0xe000925a, 0x12423: 0xe000a8a3, - 0x1242c: 0xe000a1ce, - 0x12432: 0xe0007f26, - 0x12437: 0xe000a96d, - 0x12438: 0xe0007790, 0x12439: 0xe0008447, 0x1243a: 0xe000509c, 0x1243b: 0xe000a7fa, - 0x1243d: 0xe000a8ef, 0x1243e: 0xe0004a6d, 0x1243f: 0xe000435c, - // Block 0x491, offset 0x12440 - 0x12443: 0xe0006c8c, - 0x12446: 0xe000a8f3, 0x12447: 0xe000a261, - 0x12449: 0xe0004681, - 0x1244c: 0xe000418d, 0x1244e: 0xe0009b6c, - 0x12450: 0xe0004c8f, - 0x12454: 0xe000a242, - 0x12459: 0xe000a90f, 0x1245a: 0xe0006ee8, 0x1245b: 0xe0004360, - 0x1245f: 0xe00079ba, - 0x12460: 0xe00095cc, 0x12461: 0xe000a5cc, 0x12462: 0xe000907f, 0x12463: 0xe0008ba1, - 0x12464: 0xe000925d, 0x12465: 0xe000668b, 0x12466: 0xe0006153, 0x12467: 0xe0005135, - 0x1246a: 0xe0007e6b, - 0x12472: 0xe000701e, - 0x12477: 0xe000593c, - 0x12478: 0xe0004e9a, 0x1247b: 0xe0006b2d, - 0x1247f: 0xe00060cc, - // Block 0x492, offset 0x12480 - 0x12480: 0xe0007f0a, 0x12482: 0xe0008d91, 0x12483: 0xe0007737, - 0x12484: 0xe0009121, 0x12486: 0xe0009c03, - 0x12489: 0xe00072f1, 0x1248a: 0xe00071c8, - 0x1248d: 0xe0009f24, - 0x12491: 0xe0005047, - 0x12496: 0xe000748d, - 0x12498: 0xe00086ca, - 0x1249e: 0xe0008092, - 0x124a2: 0xe00096b8, - 0x124a4: 0xe0006d28, - 0x124ab: 0xe0009b88, - 0x124ad: 0xe0004418, 0x124ae: 0xe00059e0, 0x124af: 0xe0006a5b, - 0x124b2: 0xe0006f6c, 0x124b3: 0xe0007252, - 0x124b5: 0xe0005352, 0x124b7: 0xe0008362, - 0x124ba: 0xe0006c40, - 0x124bc: 0xe00041f8, 0x124bd: 0xe000a763, 0x124bf: 0xe00089a5, - // Block 0x493, offset 0x124c0 - 0x124c1: 0xe000a824, - 0x124c4: 0xe00045d1, 0x124c5: 0xe000841a, 0x124c6: 0xe0004c92, - 0x124cb: 0xe0006156, - 0x124cd: 0xe0006054, 0x124cf: 0xe0005f18, - 0x124d2: 0xe00055bd, 0x124d3: 0xe00082fa, - 0x124d4: 0xe0006975, 0x124d6: 0xe0006978, 0x124d7: 0xe000697b, - 0x124d8: 0xe000697e, 0x124da: 0xe0009373, 0x124db: 0xe0006057, - 0x124eb: 0xe000a43c, - 0x124ec: 0xe0004c95, 0x124ef: 0xe000541e, - 0x124f3: 0xe0009985, - 0x124ff: 0xe0006c34, - // Block 0x494, offset 0x12500 - 0x12505: 0xe000940b, - 0x12508: 0xe00089a9, - 0x1250f: 0xe00075a5, - 0x12510: 0xe00088bf, 0x12511: 0xe000626c, 0x12513: 0xe0005f6c, - 0x1251b: 0xe00068c0, - 0x12523: 0xe000509f, - 0x12524: 0xe000853e, - 0x12533: 0xe0007d32, - 0x12534: 0xe00071cb, 0x12537: 0xe0006ab7, - 0x12538: 0xe0007b63, - 0x1253e: 0xe0006554, 0x1253f: 0xe0004e82, - // Block 0x495, offset 0x12540 - 0x12540: 0xe0008ba5, 0x12541: 0xe000900d, 0x12542: 0xe0004c98, 0x12543: 0xe0009d5c, - 0x1254b: 0xe00086b2, - 0x1254e: 0xe0006558, 0x1254f: 0xe00054f7, - 0x12550: 0xe0006e14, 0x12552: 0xe0005eef, - 0x12554: 0xe000a8db, 0x12555: 0xe0006be8, 0x12557: 0xe000a06b, - 0x12559: 0xe0007cd0, 0x1255a: 0xe0007c91, 0x1255b: 0xe0007529, - 0x1255c: 0xe0006b9c, 0x1255d: 0xe00079bd, 0x1255e: 0xe000a519, 0x1255f: 0xe00043c0, - 0x12560: 0xe0009082, - 0x12568: 0xe000495e, 0x1256a: 0xe0007e51, - 0x1256d: 0xe0007bf2, - 0x12570: 0xe0009c06, 0x12572: 0xe000500f, - 0x12574: 0xe0009d48, 0x12576: 0xe00061a9, - 0x1257a: 0xe0004639, - 0x1257d: 0xe00050a2, 0x1257e: 0xe0006884, - // Block 0x496, offset 0x12580 - 0x12581: 0xe0007565, 0x12582: 0xe00050a5, 0x12583: 0xe0007cfe, - 0x12584: 0xe00080be, 0x12585: 0xe0008116, 0x12586: 0xe000a163, 0x12587: 0xe0007a33, - 0x12588: 0xe0009a62, 0x12589: 0xe0009a86, - 0x1258c: 0xe0005601, 0x1258d: 0xe000a4a5, - 0x12590: 0xe00060ac, 0x12592: 0xe00060d0, 0x12593: 0xe000543a, - 0x12594: 0xe0005fb0, 0x12595: 0xe00061e5, 0x12596: 0xe000991e, - 0x12598: 0xe00069e7, 0x12599: 0xe0006b30, 0x1259a: 0xe0009085, 0x1259b: 0xe0009d6c, - 0x125ab: 0xe0005ea3, - 0x125ac: 0xe0005f33, 0x125ae: 0xe000887d, - 0x125b0: 0xe0009b3c, 0x125b1: 0xe0009ae4, 0x125b3: 0xe0009fff, - 0x125b8: 0xe0006981, 0x125b9: 0xe0008251, 0x125bb: 0xe00099bd, - 0x125bc: 0xe0007060, 0x125bd: 0xe0004835, 0x125be: 0xe00095e8, 0x125bf: 0xe0007a37, - // Block 0x497, offset 0x125c0 - 0x125c1: 0xe000a664, 0x125c2: 0xe000a395, - 0x125c4: 0xe0006f1c, 0x125c5: 0xe0007255, 0x125c6: 0xe000857a, - 0x125c9: 0xe0009514, 0x125ca: 0xe00062dc, - 0x125cc: 0xe0009f95, - 0x125d0: 0xe0005cb4, 0x125d1: 0xe00082ae, 0x125d3: 0xe000a51d, - 0x125d4: 0xe0004364, 0x125d5: 0xe0006578, 0x125d7: 0xe0006b33, - 0x125d9: 0xe0009e28, 0x125da: 0xe000862f, 0x125db: 0xe000655c, - 0x125dc: 0xe00090c4, 0x125dd: 0xe00070c6, - 0x125e0: 0xe0005a60, 0x125e1: 0xe0009e86, 0x125e2: 0xe0009cdf, 0x125e3: 0xe00083de, - 0x125e5: 0xe00052fc, - 0x125e8: 0xe0008ec2, 0x125eb: 0xe000a2ad, - 0x125ee: 0xe0006348, 0x125ef: 0xe0006270, - 0x125f0: 0xe0009c09, 0x125f1: 0xe000774b, 0x125f3: 0xe0007b67, - // Block 0x498, offset 0x12600 - 0x12604: 0xe000a6fa, 0x12607: 0xe0008542, - 0x1260a: 0xe0009558, 0x1260b: 0xe0007885, - 0x1260c: 0xe00059c0, - 0x12611: 0xe000668e, 0x12612: 0xe0007033, - 0x12617: 0xe0007021, - 0x12619: 0xe00071ce, 0x1261b: 0xe0005787, - 0x1261e: 0xe0005655, 0x1261f: 0xe00084b0, - 0x12625: 0xe0009125, 0x12627: 0xe0008254, - 0x12629: 0xe0006f20, 0x1262a: 0xe000a521, 0x1262b: 0xe000a28d, - 0x1262c: 0xe0007114, 0x1262e: 0xe000559f, - 0x12632: 0xe0008ec5, - 0x12635: 0xe00072f5, 0x12636: 0xe000a88b, - 0x12638: 0xe0004b15, 0x12639: 0xe000811a, 0x1263a: 0xe000602c, 0x1263b: 0xe000a624, - 0x1263c: 0xe0007dca, 0x1263d: 0xe000a903, 0x1263e: 0xe0009ce2, - // Block 0x499, offset 0x12640 - 0x12641: 0xe0005c33, - 0x12659: 0xe0008ab5, 0x1265a: 0xe0008f71, - 0x1265c: 0xe0006a5f, - 0x12661: 0xe00063d8, 0x12663: 0xe0007ded, - 0x12664: 0xe0004bb6, 0x12665: 0xe00083ee, 0x12666: 0xe0009e89, 0x12667: 0xe0007bbf, - 0x12669: 0xe000a43f, 0x1266a: 0xe000583f, - 0x1266c: 0xe0005d03, 0x1266e: 0xe00067bf, - 0x12674: 0xe0007f2a, 0x12677: 0xe000a1aa, - 0x12678: 0xe0009a66, 0x12679: 0xe000a349, - 0x1267f: 0xe0009d6f, - // Block 0x49a, offset 0x12680 - 0x12682: 0xe00055a2, - 0x12685: 0xe0007ac3, 0x12687: 0xe00046e5, - 0x12688: 0xe0007063, 0x12689: 0xe0006fa4, - 0x1268c: 0xe0007f6a, 0x1268d: 0xe000a748, 0x1268e: 0xe0007a3b, - 0x12691: 0xe00070fc, 0x12693: 0xe0007a3f, - 0x12694: 0xe00086fa, 0x12695: 0xe000969a, 0x12696: 0xe0005d3f, - 0x126aa: 0xe000681f, 0x126ab: 0xe0004a9d, - 0x126af: 0xe0007769, - 0x126b2: 0xe00077c0, - 0x126b4: 0xe0007e39, 0x126b5: 0xe000a0db, 0x126b7: 0xe0005695, - 0x126b8: 0xe000a7a5, - 0x126bc: 0xe00058d1, 0x126bf: 0xe0009b40, - // Block 0x49b, offset 0x126c0 - 0x126c0: 0xe0008ba9, 0x126c3: 0xe0004e27, - 0x126c4: 0xe00099c0, 0x126c5: 0xe0006e18, 0x126c6: 0xe000a74b, 0x126c7: 0xe00050a8, - 0x126c8: 0xe0004de3, 0x126cb: 0xe0005db5, - 0x126cf: 0xe000a442, - 0x126d1: 0xe0007299, 0x126d2: 0xe0009491, - 0x126d6: 0xe00052c3, - 0x126d8: 0xe0005545, 0x126d9: 0xe0008e1d, 0x126da: 0xe0005bf7, - 0x126dd: 0xe00069ea, 0x126de: 0xe0007154, - 0x126e0: 0xe00069ed, 0x126e1: 0xe00053da, 0x126e2: 0xe0007a07, - 0x126e4: 0xe0007909, 0x126e5: 0xe0005b12, 0x126e6: 0xe0004368, - 0x126e8: 0xe0008bad, 0x126ea: 0xe0005c7c, 0x126eb: 0xe00083b2, - 0x126ec: 0xe0007388, 0x126ee: 0xe000a6d6, - 0x126f1: 0xe0007569, 0x126f3: 0xe00072f9, - 0x126f5: 0xe0007a43, 0x126f6: 0xe000587b, 0x126f7: 0xe000a4dd, - 0x126f8: 0xe000966c, 0x126f9: 0xe000797b, 0x126fa: 0xe0009518, 0x126fb: 0xe00095ec, - 0x126fc: 0xe000612c, - // Block 0x49c, offset 0x12700 - 0x12717: 0xe0006c58, - 0x12719: 0xe000a5d8, 0x1271a: 0xe0008880, 0x1271b: 0xe000431c, - 0x1271d: 0xe0009cb0, 0x1271f: 0xe0008bb1, - 0x12720: 0xe00044ca, 0x12721: 0xe0005548, 0x12723: 0xe0006b36, - 0x12724: 0xe00063b4, 0x12725: 0xe000761f, 0x12726: 0xe0007da6, - 0x12728: 0xe0007e8c, 0x1272b: 0xe0006f24, - 0x1272c: 0xe0009998, 0x1272d: 0xe00081b8, 0x1272f: 0xe000a167, - 0x12732: 0xe0006e74, - 0x12734: 0xe00042c0, 0x12736: 0xe0007b6b, 0x12737: 0xe0007aa3, - 0x12738: 0xe0008257, 0x1273a: 0xe000611d, - 0x1273c: 0xe0006208, 0x1273d: 0xe0008812, 0x1273e: 0xe000a4e1, - // Block 0x49d, offset 0x12740 - 0x12743: 0xe00064a1, - 0x12744: 0xe000620b, 0x12745: 0xe00059a0, - 0x1274a: 0xe0008ec8, - 0x1274d: 0xe0005356, 0x1274e: 0xe0005fd0, - 0x12751: 0xe0006de6, 0x12753: 0xe00068c4, - 0x12754: 0xe0008a31, 0x12756: 0xe000a445, - 0x12758: 0xe0006ce4, 0x1275b: 0xe00053de, - 0x1275c: 0xe0007491, 0x1275e: 0xe0008bb5, 0x1275f: 0xe000a668, - 0x12763: 0xe0006290, - 0x12767: 0xe0007f6e, - 0x1276b: 0xe000982f, - 0x1276e: 0xe000850e, 0x1276f: 0xe0009bdc, - 0x12772: 0xe000811e, 0x12773: 0xe00051f0, - 0x1277a: 0xe0006691, - // Block 0x49e, offset 0x12780 - 0x1278f: 0xe000548e, - 0x12790: 0xe0008122, - 0x12795: 0xe00060ec, 0x12796: 0xe0008f75, - 0x12798: 0xe000a133, - 0x1279c: 0xe0005c36, 0x1279d: 0xe0004c9b, 0x1279f: 0xe0006008, - 0x127a2: 0xe000856a, - 0x127a5: 0xe00067c2, 0x127a7: 0xe0005c9c, - 0x127aa: 0xe00047ba, 0x127ab: 0xe0007d0e, - 0x127af: 0xe0007066, - 0x127b1: 0xe0009129, 0x127b2: 0xe0007258, - 0x127b5: 0xe000838a, 0x127b6: 0xe0007f72, 0x127b7: 0xe000a4f5, - 0x127ba: 0xe0005315, - 0x127bd: 0xe0007f3a, - // Block 0x49f, offset 0x127c0 - 0x127c2: 0xe0006420, 0x127c3: 0xe0007d8a, - 0x127c4: 0xe00093c3, 0x127c5: 0xe0005fe0, - 0x127c8: 0xe000a4a8, 0x127c9: 0xe000a66c, 0x127cb: 0xe00085f0, - 0x127cc: 0xe00094c0, 0x127ce: 0xe000a399, - 0x127d1: 0xe000a628, 0x127d3: 0xe0008815, - 0x127d4: 0xe000554b, 0x127d5: 0xe000573c, - 0x127d9: 0xe000a6fd, - 0x127ec: 0xe000a4ab, 0x127ed: 0xe0009fb9, 0x127ef: 0xe000969d, - 0x127f4: 0xe0008901, 0x127f5: 0xe00062bc, 0x127f7: 0xe0005ac7, - 0x127f8: 0xe000a448, - 0x127fe: 0xe0004916, 0x127ff: 0xe0005e4b, - // Block 0x4a0, offset 0x12800 - 0x12801: 0xe00078ee, 0x12802: 0xe0009efd, - 0x12804: 0xe0007793, 0x12806: 0xe0009a52, - 0x12809: 0xe0005b16, - 0x1280c: 0xe0004fa3, 0x1280f: 0xe0005bfa, - 0x12811: 0xe000445e, 0x12813: 0xe0005d42, - 0x12814: 0xe0007a47, 0x12815: 0xe0008d1c, - 0x12819: 0xe0005386, 0x1281a: 0xe0004d31, - 0x12820: 0xe0005e0f, 0x12822: 0xe000a06f, 0x12823: 0xe0005974, - 0x1282a: 0xe000844a, 0x1282b: 0xe0005e4f, - 0x1282c: 0xe0009088, 0x1282d: 0xe0005ef3, - 0x12830: 0xe0006940, 0x12831: 0xe00071d1, 0x12832: 0xe00093c7, 0x12833: 0xe00087ca, - 0x12838: 0xe0008ae1, - 0x1283c: 0xe000980e, 0x1283e: 0xe00078bd, 0x1283f: 0xe0008762, - // Block 0x4a1, offset 0x12840 - 0x12841: 0xe0007b6f, - 0x1284f: 0xe000833a, - 0x12851: 0xe00063b8, - 0x12854: 0xe000463d, 0x12857: 0xe000920d, - 0x12858: 0xe000634c, 0x12859: 0xe0004ee5, 0x1285a: 0xe000729d, 0x1285b: 0xe00086ea, - 0x1285c: 0xe00086fe, 0x1285d: 0xe000a913, 0x1285e: 0xe0005a9d, 0x1285f: 0xe0006e1c, - 0x12861: 0xe0005619, 0x12862: 0xe000a670, - 0x12864: 0xe0008316, 0x12866: 0xe0005bcb, - 0x1286d: 0xe00053e2, 0x1286e: 0xe0008d1f, 0x1286f: 0xe0007581, - 0x12870: 0xe0004e61, - 0x12874: 0xe00088c2, - 0x12878: 0xe0006c18, 0x1287a: 0xe00086ce, - 0x1287c: 0xe0005659, 0x1287d: 0xe0006694, 0x1287e: 0xe0005d61, - // Block 0x4a2, offset 0x12880 - 0x12881: 0xe0006c78, 0x12882: 0xe0009235, - 0x12884: 0xe0009231, 0x12886: 0xe0007f0d, - 0x12888: 0xe00095a4, 0x12889: 0xe000436c, 0x1288b: 0xe000a727, - 0x1288c: 0xe000745a, 0x1288d: 0xe0008ecb, 0x1288e: 0xe0009d94, - 0x12890: 0xe0008096, 0x12892: 0xe000a53d, - 0x12894: 0xe000a44b, 0x12897: 0xe0004258, - 0x12898: 0xe0006c1c, - 0x1289f: 0xe0005cc4, - 0x128a1: 0xe0008d94, 0x128a3: 0xe000a073, - 0x128a4: 0xe0009c37, 0x128a7: 0xe0005a7f, - 0x128a8: 0xe0006de9, - 0x128ae: 0xe000a6d9, 0x128af: 0xe00092b3, - 0x128b1: 0xe00089ad, 0x128b3: 0xe0007c94, - 0x128b6: 0xe0008a35, - 0x128b9: 0xe00053e6, - 0x128be: 0xe00053a2, - // Block 0x4a3, offset 0x128c0 - 0x128c0: 0xe00045bd, 0x128c1: 0xe0009b1c, 0x128c2: 0xe00059e4, 0x128c3: 0xe0005295, - 0x128c6: 0xe00068c8, 0x128c7: 0xe0006d60, - 0x128c9: 0xe000725b, 0x128ca: 0xe0007bf5, - 0x128d5: 0xe000739e, - 0x128d8: 0xe000526d, 0x128da: 0xe0007b73, 0x128db: 0xe00060f0, - 0x128de: 0xe00069f0, 0x128df: 0xe0008c8c, - 0x128e0: 0xe000a44e, 0x128e1: 0xe000825a, - 0x128e4: 0xe000554e, - 0x128e9: 0xe000a451, 0x128eb: 0xe0005807, - 0x128ec: 0xe0008f79, 0x128ee: 0xe0006711, 0x128ef: 0xe0009b20, - 0x128f1: 0xe0006a63, 0x128f3: 0xe0008702, - 0x128f4: 0xe0007bc3, - 0x128fa: 0xe000955c, - 0x128fe: 0xe00058f8, - // Block 0x4a4, offset 0x12900 - 0x12901: 0xe0007889, - 0x12905: 0xe000a39d, 0x12906: 0xe00055c1, 0x12907: 0xe0007e5d, - 0x12909: 0xe0006b39, 0x1290b: 0xe000756d, - 0x1290f: 0xe0005c39, - 0x12911: 0xe0009ee3, 0x12912: 0xe0006d64, 0x12913: 0xe0009239, - 0x12915: 0xe0006a67, - 0x12918: 0xe0005aa0, 0x1291a: 0xe000a077, 0x1291b: 0xe0007b77, - 0x1291c: 0xe0008346, 0x1291d: 0xe0005940, 0x1291e: 0xe0008bb9, 0x1291f: 0xe0007069, - 0x12923: 0xe000a1ad, - 0x12926: 0xe00088c5, 0x12927: 0xe0005b36, - 0x12928: 0xe0005b65, - 0x1292f: 0xe0007b7b, - 0x12930: 0xe000623b, 0x12932: 0xe00059f0, - 0x12937: 0xe00084c2, - 0x12938: 0xe000961c, - 0x1293c: 0xe00078c1, 0x1293e: 0xe00057bb, - // Block 0x4a5, offset 0x12940 - 0x12944: 0xe0006fb4, - 0x1294c: 0xe0004a71, 0x1294e: 0xe0007b13, - 0x12950: 0xe000a3a1, 0x12951: 0xe0007177, 0x12953: 0xe00057d7, - 0x12958: 0xe0009b70, - 0x1295d: 0xe000a454, 0x1295e: 0xe0009d06, - 0x12963: 0xe0005e53, - 0x12969: 0xe0007b17, 0x1296b: 0xe000a559, - 0x1296f: 0xe0008c49, - 0x12970: 0xe000a6dc, - 0x12978: 0xe0004c9e, - 0x1297c: 0xe0008682, 0x1297d: 0xe0008818, 0x1297e: 0xe0008839, - // Block 0x4a6, offset 0x12980 - 0x12981: 0xe0005138, - 0x12985: 0xe00046e9, 0x12986: 0xe00061d9, - 0x1298a: 0xe0009964, - 0x1298e: 0xe0007adb, - 0x12992: 0xe00096ee, - 0x12995: 0xe000a183, - 0x12998: 0xe000a8a7, 0x12999: 0xe00085f3, 0x1299a: 0xe0004b19, - 0x129a1: 0xe0008bbd, - 0x129a4: 0xe000706c, - 0x129ab: 0xe000a2b1, - 0x129ac: 0xe00044cd, 0x129ad: 0xe0009b74, 0x129ae: 0xe0009ebf, 0x129af: 0xe000a3a5, - 0x129b0: 0xe0009ec2, 0x129b3: 0xe000663c, - 0x129b7: 0xe0008ece, - 0x129b8: 0xe0008686, 0x129b9: 0xe0008ae5, - // Block 0x4a7, offset 0x129c0 - 0x129c8: 0xe00059c4, 0x129ca: 0xe00078c5, 0x129cb: 0xe000a857, - 0x129cf: 0xe0007c97, - 0x129d3: 0xe00047e4, - 0x129d8: 0xe000a525, 0x129d9: 0xe000578b, - 0x129dc: 0xe000a812, 0x129dd: 0xe000902d, 0x129df: 0xe0007a4b, - 0x129f1: 0xe00046ed, - 0x129f9: 0xe0009d98, - 0x129fd: 0xe000674d, - // Block 0x4a8, offset 0x12a00 - 0x12a04: 0xe000a7ca, - 0x12a09: 0xe0007933, - 0x12a0c: 0xe0008f7d, - 0x12a19: 0xe00064a4, 0x12a1a: 0xe0006888, - 0x12a1c: 0xe000a4f9, 0x12a1e: 0xe0005605, - 0x12a20: 0xe000738b, 0x12a21: 0xe0006159, - 0x12a26: 0xe00096f1, - 0x12a2d: 0xe0004769, 0x12a2e: 0xe000a8bb, 0x12a2f: 0xe00086b6, - 0x12a30: 0xe0007adf, 0x12a31: 0xe000a291, - 0x12a36: 0xe0007a4f, - // Block 0x4a9, offset 0x12a40 - 0x12a46: 0xe000a023, 0x12a47: 0xe000a83f, - 0x12a49: 0xe0005978, 0x12a4a: 0xe000a80a, - 0x12a4c: 0xe000a674, 0x12a4e: 0xe00089b1, - 0x12a50: 0xe0007b7f, 0x12a52: 0xe00081eb, - 0x12a56: 0xe00051c4, 0x12a57: 0xe00051d0, - 0x12a59: 0xe0007a53, - 0x12a5c: 0xe0008076, 0x12a5e: 0xe0006c44, - 0x12a62: 0xe0004765, - 0x12a64: 0xe0005f1b, 0x12a65: 0xe000a5dc, 0x12a66: 0xe000a790, 0x12a67: 0xe0008d22, - 0x12a68: 0xe0007e8f, 0x12a69: 0xe0006500, - 0x12a6c: 0xe000788d, 0x12a6e: 0xe00085f6, - 0x12a7d: 0xe0006e78, - // Block 0x4aa, offset 0x12a80 - 0x12a80: 0xe0007b3b, - 0x12a84: 0xe0007495, 0x12a85: 0xe0007d36, 0x12a87: 0xe000a766, - 0x12a89: 0xe000809a, 0x12a8a: 0xe00080de, - 0x12a8f: 0xe000a7ce, - 0x12a92: 0xe000a3a9, - 0x12a94: 0xe0007f76, - 0x12a99: 0xe000a946, 0x12a9b: 0xe0009f27, - 0x12a9f: 0xe00072a1, - 0x12aa0: 0xe00073b6, 0x12aa2: 0xe0006751, - 0x12aa4: 0xe00084de, - 0x12aa8: 0xe00081ee, - 0x12aac: 0xe0007c9a, 0x12aaf: 0xe0006eec, - 0x12ab1: 0xe0007ac7, 0x12ab2: 0xe000476d, - 0x12ab9: 0xe000a949, 0x12aba: 0xe000a94c, - 0x12abe: 0xe00099c3, - // Block 0x4ab, offset 0x12ac0 - 0x12ac1: 0xe0007b2f, 0x12ac3: 0xe0007a57, - 0x12ac8: 0xe0005718, 0x12ac9: 0xe0005609, 0x12acb: 0xe0009748, - 0x12ace: 0xe0005baa, - 0x12ad0: 0xe0005d65, 0x12ad2: 0xe000706f, - 0x12ad4: 0xe0006504, 0x12ad5: 0xe0007a5b, 0x12ad6: 0xe0007585, - 0x12ad9: 0xe0009be4, - 0x12adf: 0xe0007b83, - 0x12ae0: 0xe0008086, - 0x12ae5: 0xe0008d25, 0x12ae6: 0xe00092b7, 0x12ae7: 0xe00071d4, - 0x12aec: 0xe000a827, 0x12aed: 0xe0009780, 0x12aee: 0xe0006fa8, - 0x12af9: 0xe000a970, 0x12afb: 0xe000a7d2, - 0x12afc: 0xe00074e1, 0x12afe: 0xe0005551, 0x12aff: 0xe0007ec8, - // Block 0x4ac, offset 0x12b00 - 0x12b00: 0xe000a27d, - 0x12b06: 0xe0009ee7, 0x12b07: 0xe0006f54, - 0x12b0b: 0xe000a7e6, - 0x12b0c: 0xe0004b3d, 0x12b0d: 0xe0006bcc, - 0x12b10: 0xe0005aa3, - 0x12b14: 0xe000a973, 0x12b17: 0xe0007b3f, - 0x12b1a: 0xe000783d, 0x12b1b: 0xe00057bf, - 0x12b1f: 0xe0004aa1, - 0x12b25: 0xe0009794, - 0x12b28: 0xe0009303, 0x12b2a: 0xe0008d28, - 0x12b2c: 0xe0009ce5, 0x12b2d: 0xe000883f, - 0x12b30: 0xe0008126, 0x12b32: 0xe00081bb, - 0x12b35: 0xe000868a, 0x12b36: 0xe00067c5, - 0x12b38: 0xe0009d09, 0x12b39: 0xe0005327, 0x12b3a: 0xe0007815, 0x12b3b: 0xe000a74e, - 0x12b3d: 0xe0006ce8, 0x12b3e: 0xe0008474, - // Block 0x4ad, offset 0x12b40 - 0x12b40: 0xe0006cec, 0x12b42: 0xe00087ce, - 0x12b46: 0xe0008766, 0x12b47: 0xe0009dc0, - 0x12b48: 0xe0009d30, 0x12b4b: 0xe0008a39, - 0x12b4c: 0xe0009d72, - 0x12b52: 0xe0009638, 0x12b53: 0xe0006474, - 0x12b54: 0xe0006314, 0x12b56: 0xe00082b1, - 0x12b58: 0xe00055c5, 0x12b59: 0xe00075bd, 0x12b5a: 0xe0009c43, 0x12b5b: 0xe0007fed, - 0x12b5d: 0xe0006a6b, 0x12b5f: 0xe000605a, - 0x12b61: 0xe000605d, 0x12b62: 0xe0005b68, - 0x12b67: 0xe00060b0, - 0x12b69: 0xe00061e9, - 0x12b6f: 0xe0004892, - 0x12b72: 0xe0006d68, - 0x12b74: 0xe00088c8, - 0x12b78: 0xe0008632, 0x12b79: 0xe0009cbe, - 0x12b7d: 0xe00045e9, - // Block 0x4ae, offset 0x12b80 - 0x12b80: 0xe0006dad, 0x12b81: 0xe0005d06, - 0x12b87: 0xe00068cc, - 0x12b8d: 0xe0004540, - 0x12b92: 0xe000a4ae, - 0x12b96: 0xe00057a7, - 0x12ba2: 0xe00055c9, - 0x12ba7: 0xe000a94f, - 0x12bac: 0xe00045ed, 0x12baf: 0xe0006560, - 0x12bb3: 0xe00086ba, - 0x12bb4: 0xe000768f, 0x12bb5: 0xe000a980, - // Block 0x4af, offset 0x12bc0 - 0x12bc0: 0xe0006cf0, 0x12bc2: 0xe0004b1d, - 0x12bc4: 0xe0008905, - 0x12bc9: 0xe00069f3, - 0x12bce: 0xe000771f, - 0x12bd0: 0xe000a457, 0x12bd2: 0xe00069f6, - 0x12bd7: 0xe0004ca1, - 0x12bd9: 0xe0008883, - 0x12be1: 0xe0004be7, 0x12be2: 0xe000a043, - 0x12be5: 0xe0007341, - 0x12be8: 0xe0008352, 0x12be9: 0xe00071d7, - 0x12bf4: 0xe0009e59, 0x12bf7: 0xe0004615, - 0x12bf8: 0xe0005d09, 0x12bf9: 0xe000a34d, 0x12bfa: 0xe000838e, 0x12bfb: 0xe0006c20, - 0x12bfc: 0xe0005843, 0x12bfd: 0xe0009d75, - // Block 0x4b0, offset 0x12c00 - 0x12c09: 0xe000513b, 0x12c0a: 0xe0007bf8, - 0x12c13: 0xe0004a1d, - 0x12c16: 0xe00093cb, 0x12c17: 0xe000844d, - 0x12c18: 0xe0008cbf, 0x12c19: 0xe0008853, 0x12c1b: 0xe0005f70, - 0x12c1c: 0xe000741e, 0x12c1d: 0xe0008e01, - 0x12c22: 0xe000a4b1, - 0x12c25: 0xe0007e7d, 0x12c27: 0xe0007dcd, - 0x12c28: 0xe000815e, 0x12c29: 0xe0006fe8, 0x12c2a: 0xe0008886, 0x12c2b: 0xe0006120, - 0x12c31: 0xe000528c, - 0x12c34: 0xe000a7a8, 0x12c36: 0xe000825d, 0x12c37: 0xe0008260, - 0x12c3e: 0xe000a62c, 0x12c3f: 0xe000812a, - // Block 0x4b1, offset 0x12c40 - 0x12c43: 0xe0007796, - 0x12c44: 0xe0007d02, 0x12c45: 0xe0006b3c, - 0x12c50: 0xe000876a, 0x12c52: 0xe0007c9d, - 0x12c57: 0xe0004e4b, - 0x12c58: 0xe0009e5c, - 0x12c5c: 0xe0005d89, - 0x12c60: 0xe0005bce, - 0x12c68: 0xe00055cd, 0x12c69: 0xe0007c2e, 0x12c6a: 0xe000a6df, 0x12c6b: 0xe000a271, - 0x12c6c: 0xe000a1d1, 0x12c6f: 0xe000a7ea, - 0x12c70: 0xe0007b87, 0x12c72: 0xe000a713, - 0x12c75: 0xe00059f8, 0x12c77: 0xe0004b41, - 0x12c78: 0xe00071da, 0x12c7a: 0xe00053a6, 0x12c7b: 0xe000a24d, - 0x12c7c: 0xe000623e, - // Block 0x4b2, offset 0x12c80 - 0x12c81: 0xe000a275, - 0x12c84: 0xe000a2b5, 0x12c86: 0xe00085f9, 0x12c87: 0xe000713c, - 0x12c88: 0xe0005aca, 0x12c89: 0xe0007d06, 0x12c8b: 0xe0007e55, - 0x12c8e: 0xe0008bc1, - 0x12c94: 0xe000951c, 0x12c95: 0xe0004298, 0x12c96: 0xe0004ca4, 0x12c97: 0xe0007ff0, - 0x12c98: 0xe00050ab, - 0x12c9e: 0xe0006822, 0x12c9f: 0xe0006274, - 0x12ca0: 0xe0004485, - 0x12ca6: 0xe000464d, 0x12ca7: 0xe000831a, - 0x12ca9: 0xe0007df1, 0x12cab: 0xe0005f36, - 0x12cad: 0xe0006a6f, - 0x12cb2: 0xe0005a1c, 0x12cb3: 0xe00054dc, - 0x12cb7: 0xe0008b01, - 0x12cb9: 0xe000a2b9, 0x12cbb: 0xe0009d0c, - // Block 0x4b3, offset 0x12cc0 - 0x12cc0: 0xe00062e0, 0x12cc2: 0xe0004190, - 0x12cc6: 0xe00084b3, - 0x12cc8: 0xe00041d2, 0x12cc9: 0xe0006278, 0x12cca: 0xe0006bec, - 0x12ccc: 0xe0009f99, 0x12ccd: 0xe000912d, 0x12ccf: 0xe00041fc, - 0x12cd2: 0xe0009191, - 0x12cd6: 0xe0004b21, - 0x12cd9: 0xe00049a2, - 0x12cdd: 0xe000a793, 0x12cde: 0xe000578f, - 0x12ce0: 0xe0008ed1, 0x12ce2: 0xe0008392, 0x12ce3: 0xe00072fd, - 0x12ce4: 0xe0006697, 0x12ce5: 0xe0008477, 0x12ce6: 0xe000a21a, - 0x12ce9: 0xe000a3ad, 0x12cea: 0xe0004eb2, 0x12ceb: 0xe0009936, - 0x12ced: 0xe0006350, 0x12cee: 0xe0009d87, - 0x12cf5: 0xe0008c4d, 0x12cf7: 0xe000615c, - 0x12cf9: 0xe0006fec, - 0x12cfd: 0xe0008bc5, 0x12cfe: 0xe000a2bd, - // Block 0x4b4, offset 0x12d00 - 0x12d01: 0xe0006e7c, 0x12d03: 0xe0004ca7, - 0x12d04: 0xe000a2f5, 0x12d05: 0xe0005847, 0x12d06: 0xe0005d0c, 0x12d07: 0xe00071dd, - 0x12d09: 0xe0005c3c, - 0x12d13: 0xe0007df5, - 0x12d1b: 0xe0009a6a, - 0x12d20: 0xe00089b5, 0x12d21: 0xe00072a5, 0x12d22: 0xe0009b24, - 0x12d24: 0xe0008857, 0x12d25: 0xe000a45a, 0x12d26: 0xe00050ae, - 0x12d28: 0xe000491a, 0x12d2a: 0xe00050b1, 0x12d2b: 0xe0006755, - 0x12d2c: 0xe0007df9, 0x12d2e: 0xe0008e21, 0x12d2f: 0xe0004a75, - 0x12d30: 0xe0007ae3, 0x12d31: 0xe0008d97, 0x12d32: 0xe00064ce, 0x12d33: 0xe0005db9, - 0x12d34: 0xe0004fcb, 0x12d35: 0xe0006984, 0x12d36: 0xe0009ce8, - 0x12d38: 0xe0009b28, 0x12d3a: 0xe000657c, - 0x12d3f: 0xe000a4e5, - // Block 0x4b5, offset 0x12d40 - 0x12d40: 0xe0007ff3, 0x12d41: 0xe0006060, 0x12d43: 0xe0009902, - 0x12d44: 0xe0006e80, 0x12d45: 0xe0008cc2, 0x12d46: 0xe0007010, - 0x12d4b: 0xe00081be, - 0x12d4e: 0xe000a1d4, - 0x12d55: 0xe000a002, 0x12d57: 0xe000812e, - 0x12d59: 0xe000527d, 0x12d5a: 0xe000a45d, 0x12d5b: 0xe0007b8b, - 0x12d5c: 0xe0008263, 0x12d5d: 0xe000a6a8, 0x12d5e: 0xe0006db0, 0x12d5f: 0xe000738e, - 0x12d60: 0xe0005c3f, 0x12d62: 0xe0007f7a, 0x12d63: 0xe0007186, - 0x12d64: 0xe0007ecb, 0x12d65: 0xe0007d12, - 0x12d68: 0xe0009131, 0x12d69: 0xe000a3b1, 0x12d6a: 0xe0005de0, - 0x12d6d: 0xe0005492, 0x12d6f: 0xe000584b, - 0x12d70: 0xe0004b96, 0x12d71: 0xe0008a3d, 0x12d72: 0xe000940f, 0x12d73: 0xe0009281, - 0x12d7d: 0xe0008e5d, 0x12d7e: 0xe0004f6f, - // Block 0x4b6, offset 0x12d80 - 0x12d80: 0xe0009811, 0x12d82: 0xe00050b4, 0x12d83: 0xe0005d0f, - 0x12d86: 0xe0004d34, 0x12d87: 0xe0006e84, - 0x12d89: 0xe000597c, 0x12d8a: 0xe00061dd, 0x12d8b: 0xe000876e, - 0x12d98: 0xe0005d69, - 0x12d9c: 0xe000a678, 0x12d9d: 0xe0004b99, 0x12d9e: 0xe00062e4, 0x12d9f: 0xe00046f1, - 0x12da1: 0xe0009135, 0x12da3: 0xe00050b7, - 0x12da5: 0xe00046f5, 0x12da7: 0xe0006594, - 0x12da8: 0xe00092bb, 0x12daa: 0xe0008d2b, 0x12dab: 0xe0005496, - 0x12db0: 0xe000a5e0, 0x12db2: 0xe00071e0, - 0x12db5: 0xe00079c0, - 0x12db9: 0xe00072a9, - 0x12dbd: 0xe0006d43, 0x12dbf: 0xe0006e88, - // Block 0x4b7, offset 0x12dc0 - 0x12dc6: 0xe00091c5, - 0x12dca: 0xe00046f9, - 0x12dcf: 0xe0005b3a, - 0x12dd4: 0xe0007b8f, - 0x12dd8: 0xe0004a79, 0x12dda: 0xe00092bf, 0x12ddb: 0xe000a600, - 0x12ddc: 0xe00049f3, - 0x12de0: 0xe000a460, 0x12de2: 0xe0009f00, 0x12de3: 0xe0009d34, - 0x12de6: 0xe0007da9, - 0x12de9: 0xe0009560, - 0x12dee: 0xe0007d66, - 0x12df2: 0xe0009c5e, - 0x12df7: 0xe00085fc, - // Block 0x4b8, offset 0x12e00 - 0x12e01: 0xe0006640, 0x12e03: 0xe000987a, - 0x12e04: 0xe00045f1, - 0x12e0c: 0xe0004d37, 0x12e0d: 0xe0005f84, 0x12e0e: 0xe0008a41, - 0x12e11: 0xe0009031, 0x12e13: 0xe00065b0, - 0x12e15: 0xe0007d6a, - 0x12e18: 0xe0004320, 0x12e1a: 0xe0007571, 0x12e1b: 0xe00095f0, - 0x12e1e: 0xe0006d2c, 0x12e1f: 0xe0006d6c, - 0x12e23: 0xe0006bf0, - 0x12e25: 0xe0006d70, 0x12e26: 0xe0007072, - 0x12e28: 0xe0007f7e, 0x12e2b: 0xe000669a, - 0x12e2c: 0xe0007f82, - 0x12e30: 0xe00089b9, 0x12e31: 0xe0008266, 0x12e32: 0xe0004388, 0x12e33: 0xe00074e5, - 0x12e37: 0xe00051f4, - 0x12e38: 0xe00089bd, 0x12e3a: 0xe0008bc9, - 0x12e3f: 0xe0005f88, - // Block 0x4b9, offset 0x12e40 - 0x12e47: 0xe0004f0b, - 0x12e4a: 0xe0004771, 0x12e4b: 0xe0008a45, - 0x12e4c: 0xe00047bd, 0x12e4e: 0xe0004619, 0x12e4f: 0xe0007e80, - 0x12e51: 0xe00089c1, 0x12e53: 0xe000543e, - 0x12e54: 0xe0006354, - 0x12e59: 0xe0005c42, 0x12e5a: 0xe00068d0, 0x12e5b: 0xe0009139, - 0x12e5c: 0xe00098ba, 0x12e5d: 0xe000615f, - 0x12e60: 0xe0008a49, 0x12e62: 0xe0009f9d, - 0x12e64: 0xe00099fc, 0x12e65: 0xe0005889, 0x12e66: 0xe000a85a, 0x12e67: 0xe000588d, - 0x12e6a: 0xe0006508, 0x12e6b: 0xe000a583, - 0x12e6f: 0xe0008f81, - 0x12e70: 0xe000847a, - 0x12e75: 0xe000a55c, 0x12e76: 0xe000546a, - 0x12e78: 0xe00050ba, 0x12e7a: 0xe00043c4, - 0x12e7f: 0xe00050bd, - // Block 0x4ba, offset 0x12e80 - 0x12e86: 0xe00043c8, 0x12e87: 0xe0008ed4, - 0x12e88: 0xe00065b4, 0x12e8a: 0xe000963c, 0x12e8b: 0xe0009fa1, - 0x12e8e: 0xe0007078, 0x12e8f: 0xe0007075, - 0x12e91: 0xe000841d, - 0x12e94: 0xe0008c51, - 0x12e99: 0xe000a8df, 0x12e9a: 0xe0004d3a, - 0x12e9d: 0xe0006bf4, - 0x12ea3: 0xe0008041, - 0x12ea5: 0xe0004461, - 0x12ea9: 0xe000994c, 0x12eab: 0xe00079eb, - 0x12eb1: 0xe0009e8c, 0x12eb2: 0xe0009f6a, 0x12eb3: 0xe0004324, - 0x12eb4: 0xe00075ed, 0x12eb5: 0xe00085ff, - 0x12eb8: 0xe00053aa, 0x12eb9: 0xe000913d, - 0x12ebc: 0xe000565d, 0x12ebd: 0xe0008889, 0x12ebe: 0xe00091c9, - // Block 0x4bb, offset 0x12ec0 - 0x12ec0: 0xe0004d3d, 0x12ec2: 0xe0004193, 0x12ec3: 0xe000a2f9, - 0x12ec5: 0xe0006644, 0x12ec7: 0xe0009035, - 0x12eca: 0xe0008a4d, - 0x12ecd: 0xe000847d, 0x12ece: 0xe000a1d7, - 0x12ed2: 0xe0007891, 0x12ed3: 0xe00099ff, - 0x12ed4: 0xe00099c6, 0x12ed5: 0xe000a8ab, - 0x12ed8: 0xe00056c1, 0x12ed9: 0xe00046fd, 0x12edb: 0xe0009c6a, - 0x12ede: 0xe00069f9, - 0x12ee2: 0xe0005d12, 0x12ee3: 0xe00090c7, - 0x12ee4: 0xe0008e83, 0x12ee7: 0xe0006b9f, - 0x12ef0: 0xe00053ea, 0x12ef2: 0xe0005de3, 0x12ef3: 0xe0005dc5, - 0x12ef4: 0xe00099c9, - 0x12ef9: 0xe00069fc, 0x12efa: 0xe0006987, - 0x12efc: 0xe0004838, 0x12eff: 0xe00081f1, - // Block 0x4bc, offset 0x12f00 - 0x12f00: 0xe00078f1, 0x12f01: 0xe000994f, - 0x12f07: 0xe0008e61, - 0x12f08: 0xe00047e7, 0x12f09: 0xe00082b4, 0x12f0b: 0xe0009f5c, - 0x12f0d: 0xe0007895, - 0x12f10: 0xe00082b7, - 0x12f15: 0xe000a026, - 0x12f19: 0xe000707b, - 0x12f1f: 0xe0007d16, - 0x12f20: 0xe00094c4, 0x12f21: 0xe00093cf, 0x12f22: 0xe0006358, - 0x12f24: 0xe0005c45, 0x12f26: 0xe00071e3, 0x12f27: 0xe000a047, - 0x12f2f: 0xe0008de9, - 0x12f30: 0xe0005775, 0x12f33: 0xe000987d, - 0x12f34: 0xe00087d2, - 0x12f3b: 0xe0005bfd, - // Block 0x4bd, offset 0x12f40 - 0x12f42: 0xe0005bad, 0x12f43: 0xe0005ca4, - 0x12f46: 0xe0005acd, - 0x12f48: 0xe0009e5f, 0x12f49: 0xe000538a, - 0x12f4c: 0xe00076df, 0x12f4e: 0xe000425c, - 0x12f52: 0xe0008269, - 0x12f55: 0xe0007d8e, 0x12f56: 0xe0006598, - 0x12f58: 0xe000591f, - 0x12f5c: 0xe0008a51, - 0x12f61: 0xe00099cc, 0x12f62: 0xe00078c9, - 0x12f64: 0xe0008ab9, 0x12f65: 0xe000923d, 0x12f67: 0xe000595c, - 0x12f68: 0xe0004a49, 0x12f69: 0xe000575a, - 0x12f6c: 0xe0006e8c, 0x12f6d: 0xe0007bc7, 0x12f6e: 0xe0008396, 0x12f6f: 0xe0004d40, - 0x12f70: 0xe0007d6e, 0x12f71: 0xe0009b8c, 0x12f72: 0xe00089c5, - 0x12f78: 0xe00047c0, 0x12f7b: 0xe000571c, - 0x12f7c: 0xe00063bc, 0x12f7d: 0xe00064e8, 0x12f7e: 0xe00064ec, - // Block 0x4be, offset 0x12f80 - 0x12f80: 0xe0005023, 0x12f81: 0xe0008d9a, 0x12f83: 0xe000608d, - 0x12f84: 0xe0008909, 0x12f86: 0xe0004464, 0x12f87: 0xe000a67c, - 0x12f8b: 0xe0004895, - 0x12f8e: 0xe0004bea, - 0x12f90: 0xe000483b, 0x12f93: 0xe000a463, - 0x12f96: 0xe000a604, - 0x12f9a: 0xe0007799, 0x12f9b: 0xe000a769, - 0x12f9c: 0xe000a4b4, 0x12f9e: 0xe000a4b7, - 0x12fa4: 0xe0009d0f, - 0x12fac: 0xe000a04b, 0x12fae: 0xe0009f6d, - 0x12fb4: 0xe0008fb1, 0x12fb6: 0xe0006ba2, - 0x12fb8: 0xe0004dc7, 0x12fba: 0xe0009832, - 0x12fbf: 0xe000600c, - // Block 0x4bf, offset 0x12fc0 - 0x12fc2: 0xe0007ff6, 0x12fc3: 0xe00064a7, - 0x12fc6: 0xe000688c, - 0x12fc8: 0xe0007b93, 0x12fca: 0xe00084c6, - 0x12fcc: 0xe0007e3d, 0x12fcd: 0xe000a137, 0x12fce: 0xe000774f, - 0x12fd2: 0xe000a10f, - 0x12fd4: 0xe000a700, 0x12fd6: 0xe0004467, - 0x12fd9: 0xe00066af, 0x12fdb: 0xe0006ff0, - 0x12fdc: 0xe0005554, 0x12fde: 0xe00086d2, 0x12fdf: 0xe0005f78, - 0x12fe1: 0xe0009141, 0x12fe3: 0xe0004328, - 0x12fe4: 0xe000635c, 0x12fe5: 0xe0004aa5, 0x12fe7: 0xe0005aa6, - 0x12fea: 0xe0009be8, - 0x12fec: 0xe0004898, 0x12fee: 0xe00060b4, - 0x12ff1: 0xe0008044, 0x12ff2: 0xe0005f74, - 0x12ff4: 0xe00090e5, - 0x12ff8: 0xe0006cf4, 0x12ff9: 0xe0007345, 0x12ffb: 0xe000a40f, - 0x12ffc: 0xe0006360, 0x12ffe: 0xe0007301, - // Block 0x4c0, offset 0x13000 - 0x13001: 0xe0006ff4, - 0x13004: 0xe0005fb4, 0x13007: 0xe000612f, - 0x13008: 0xe0009ba4, 0x13009: 0xe000620e, 0x1300a: 0xe0006090, 0x1300b: 0xe0004260, - 0x1300c: 0xe000a2fd, - 0x1301a: 0xe0006d78, 0x1301b: 0xe0005f39, - 0x1301e: 0xe0009145, - 0x13020: 0xe0005fb8, - 0x13025: 0xe0008635, 0x13026: 0xe0008638, - 0x13028: 0xe0008712, 0x13029: 0xe000a2c1, - 0x13034: 0xe0007349, 0x13037: 0xe0004e2b, - 0x13038: 0xe0006063, 0x1303a: 0xe0008d2e, 0x1303b: 0xe00078cd, - 0x1303c: 0xe0007677, 0x1303e: 0xe0008ff1, - // Block 0x4c1, offset 0x13040 - 0x13040: 0xe000928f, - 0x13046: 0xe000a608, 0x13047: 0xe0008cc5, - 0x1304d: 0xe000a2c5, - 0x13052: 0xe0006f90, - 0x1305a: 0xe000779c, 0x1305b: 0xe0008bcd, - 0x1305f: 0xe000725e, - 0x13060: 0xe0004e3b, 0x13061: 0xe00071e6, 0x13062: 0xe0007261, 0x13063: 0xe00055d1, - 0x13065: 0xe00069ff, 0x13066: 0xe00060b8, - 0x13068: 0xe0007c31, 0x1306b: 0xe0009640, - 0x13077: 0xe0004544, - 0x13079: 0xe0005557, - 0x1307d: 0xe0004ee8, 0x1307e: 0xe000483e, 0x1307f: 0xe0007bfb, - // Block 0x4c2, offset 0x13080 - 0x1308b: 0xe0009149, - 0x1308d: 0xe0007264, 0x1308e: 0xe000a0bf, - 0x13091: 0xe0006010, - 0x13096: 0xe0007c34, - 0x13099: 0xe0005e1f, - 0x1309e: 0xe0005e57, - 0x130a0: 0xe000549a, 0x130a2: 0xe00060f4, - 0x130a5: 0xe0006604, - 0x130aa: 0xe0009241, - 0x130ac: 0xe0007305, 0x130ad: 0xe0005bb0, - 0x130b0: 0xe000432c, 0x130b3: 0xe0005661, - 0x130b9: 0xe000779f, 0x130bb: 0xe00095f4, - 0x130bc: 0xe0004580, 0x130bd: 0xe000489b, 0x130bf: 0xe0004caa, - // Block 0x4c3, offset 0x130c0 - 0x130c7: 0xe00060f8, - 0x130c9: 0xe0006a87, - 0x130cd: 0xe000a5a0, - 0x130d7: 0xe0009784, - 0x130d9: 0xe0004370, 0x130da: 0xe0009798, 0x130db: 0xe0006066, - 0x130dc: 0xe000503b, 0x130de: 0xe000833e, - 0x130e1: 0xe000a5a4, 0x130e2: 0xe0007421, 0x130e3: 0xe0008420, - 0x130e5: 0xe000908b, 0x130e7: 0xe000752d, - 0x130e9: 0xe0004cad, - 0x130ed: 0xe000535a, 0x130ee: 0xe0007e6e, 0x130ef: 0xe0004bed, - 0x130f0: 0xe000904d, 0x130f3: 0xe0006e20, - 0x130fa: 0xe0009b44, 0x130fb: 0xe000496e, - 0x130fc: 0xe000441c, 0x130fd: 0xe0006e38, - // Block 0x4c4, offset 0x13100 - 0x13102: 0xe0006b3f, - 0x1310c: 0xe00096bb, 0x1310f: 0xe00068d4, - 0x13111: 0xe00075f0, 0x13112: 0xe000698a, - 0x13122: 0xe0005778, - 0x13125: 0xe000908e, 0x13126: 0xe0009445, 0x13127: 0xe0009a6e, - 0x1312c: 0xe0005dc9, 0x1312d: 0xe0009e04, - 0x13130: 0xe0009da0, 0x13132: 0xe0009e8f, - 0x13134: 0xe0009ceb, - // Block 0x4c5, offset 0x13140 - 0x13143: 0xe0008f19, - 0x13145: 0xe0004eb5, - 0x1314f: 0xe0007a5f, - 0x1315c: 0xe00044a2, 0x1315d: 0xe00096f4, - 0x13160: 0xe000585b, - 0x13167: 0xe0007fb6, - 0x13168: 0xe0009284, 0x1316b: 0xe0005c48, - 0x1316c: 0xe0004701, 0x1316e: 0xe000a04f, 0x1316f: 0xe0007a63, - 0x1317c: 0xe0006930, - // Block 0x4c6, offset 0x13180 - 0x13181: 0xe00050c0, - 0x13187: 0xe0008bd1, - 0x1318c: 0xe0005aee, 0x1318d: 0xe000776c, 0x1318e: 0xe000717a, 0x1318f: 0xe00086be, - 0x13191: 0xe000698d, 0x13193: 0xe00054fa, - 0x13197: 0xe0007dfd, - 0x1319f: 0xe0006f58, - 0x131a3: 0xe00042c4, - 0x131a4: 0xe0007bcb, 0x131a7: 0xe000659c, - 0x131a8: 0xe0007e92, 0x131a9: 0xe0006e24, - 0x131ad: 0xe0009bec, - 0x131ba: 0xe000a594, 0x131bb: 0xe000a598, - 0x131bc: 0xe0005de6, 0x131be: 0xe0005245, - // Block 0x4c7, offset 0x131c0 - 0x131c1: 0xe0008602, - 0x131c5: 0xe0006424, - 0x131c8: 0xe0007e95, 0x131ca: 0xe0005b6b, 0x131cb: 0xe0009260, - 0x131ce: 0xe00047c3, 0x131cf: 0xe00059f4, - 0x131d0: 0xe0006364, 0x131d1: 0xe00077a2, - 0x131d4: 0xe0009475, 0x131d5: 0xe0004488, - 0x131da: 0xe0008a55, - 0x131e0: 0xe00052c6, - 0x131e7: 0xe000894d, - 0x131e8: 0xe0005de9, 0x131ea: 0xe0009814, - 0x131ec: 0xe0004705, 0x131ef: 0xe00050c3, - 0x131f4: 0xe0005740, 0x131f5: 0xe0004264, 0x131f7: 0xe0005d8d, - 0x131fa: 0xe0004b45, 0x131fb: 0xe0006368, - 0x131fc: 0xe0008716, 0x131fd: 0xe0004c32, - // Block 0x4c8, offset 0x13200 - 0x13201: 0xe00096f7, - 0x1320c: 0xe0005b7d, 0x1320e: 0xe00096fa, 0x1320f: 0xe0005027, - 0x13211: 0xe000549e, 0x13212: 0xe0008450, - 0x13216: 0xe00079c3, - 0x13219: 0xe00077a5, - 0x13227: 0xe0005b80, - 0x1322a: 0xe00058fb, 0x1322b: 0xe0005944, - 0x1322c: 0xe000636c, 0x1322d: 0xe000a5a8, - 0x13231: 0xe0005b52, - 0x1323a: 0xe0007424, - 0x1323e: 0xe0006b42, - // Block 0x4c9, offset 0x13240 - 0x13240: 0xe0006b45, 0x13241: 0xe00050c6, - 0x13245: 0xe0007f10, 0x13246: 0xe0009564, 0x13247: 0xe00050c9, - 0x13248: 0xe00050cc, 0x13249: 0xe0009091, 0x1324a: 0xe0009da4, - 0x13250: 0xe0007ff9, 0x13253: 0xe0006908, - 0x13254: 0xe0006825, 0x13255: 0xe0006a02, 0x13256: 0xe0008d31, 0x13257: 0xe0009094, - 0x1325a: 0xe0008d34, 0x1325b: 0xe00044d0, - 0x1325c: 0xe000a466, 0x1325d: 0xe00098be, 0x1325e: 0xe00074e9, 0x1325f: 0xe0007267, - 0x13260: 0xe0006b48, 0x13262: 0xe0005308, - 0x13265: 0xe0006cf8, 0x13267: 0xe0008d9d, - 0x13268: 0xe0009f03, - 0x1326d: 0xe0008c8f, - 0x1327a: 0xe00050cf, - 0x1327c: 0xe0004aa9, 0x1327f: 0xe0005af2, - // Block 0x4ca, offset 0x13280 - 0x13280: 0xe0009f44, 0x13281: 0xe0004fcf, - 0x1328a: 0xe00047ea, 0x1328b: 0xe0008546, - 0x1328d: 0xe000a55f, 0x1328e: 0xe0008bd5, 0x1328f: 0xe00066dd, - 0x13291: 0xe0007ffc, - 0x13294: 0xe0008cc8, - 0x1329d: 0xe00090f9, - 0x132a6: 0xe00078f4, 0x132a7: 0xe000a952, - 0x132a8: 0xe000513e, 0x132aa: 0xe0006e90, 0x132ab: 0xe0005422, - 0x132ae: 0xe0005a82, - 0x132b0: 0xe000530b, 0x132b1: 0xe000555a, 0x132b3: 0xe0007899, - 0x132b4: 0xe0007841, - 0x132b9: 0xe0007fff, 0x132ba: 0xe0007d92, 0x132bb: 0xe0005d45, - 0x132bd: 0xe0004fd3, 0x132be: 0xe000a562, 0x132bf: 0xe00055d5, - // Block 0x4cb, offset 0x132c0 - 0x132c0: 0xe00071e9, 0x132c1: 0xe0006b4b, - 0x132c6: 0xe000429c, - 0x132c9: 0xe0006648, 0x132ca: 0xe0005241, 0x132cb: 0xe0009835, - 0x132d1: 0xe00049f6, 0x132d2: 0xe00096fd, - 0x132d5: 0xe0006990, - 0x132d8: 0xe0006993, - 0x132df: 0xe0008d37, - 0x132e2: 0xe0005a64, 0x132e3: 0xe0005eb7, - 0x132e4: 0xe0009a9a, 0x132e6: 0xe000914d, 0x132e7: 0xe000773b, - 0x132e9: 0xe00091cd, 0x132ea: 0xe00090ca, 0x132eb: 0xe0009912, - 0x132ec: 0xe00044e8, - 0x132f8: 0xe00042e4, 0x132fb: 0xe0008480, - // Block 0x4cc, offset 0x13300 - 0x13300: 0xe000a955, 0x13301: 0xe000489e, 0x13302: 0xe000585f, - 0x13305: 0xe0007024, - 0x13308: 0xe0004268, 0x1330a: 0xe0008ccb, 0x1330b: 0xe0008bd9, - 0x1330c: 0xe00055a5, 0x1330d: 0xe0009700, - 0x13314: 0xe0008596, 0x13317: 0xe0009d78, - 0x13319: 0xe00090e9, 0x1331a: 0xe00099cf, - 0x1331c: 0xe0005cd0, 0x1331e: 0xe0004a20, 0x1331f: 0xe0009f40, - 0x13320: 0xe0008d3a, - 0x13327: 0xe0006f5c, - 0x1332e: 0xe0008e25, - 0x13331: 0xe0009a9e, - 0x13336: 0xe000807a, 0x13337: 0xe00090ed, - 0x13339: 0xe0009195, 0x1333b: 0xe000555d, - 0x1333c: 0xe0004196, 0x1333d: 0xe00047c6, 0x1333f: 0xe0004841, - // Block 0x4cd, offset 0x13340 - 0x13340: 0xe00048de, - 0x13345: 0xe0004420, 0x13346: 0xe00060bc, - 0x13349: 0xe00099d2, - 0x1334d: 0xe000890d, 0x1334e: 0xe0007b97, - 0x13357: 0xe00071ec, - 0x13360: 0xe00052a9, 0x13361: 0xe0006d50, 0x13362: 0xe0007bfe, - 0x13369: 0xe0007d1a, 0x1336b: 0xe000a59c, - 0x13370: 0xe000789d, - 0x13374: 0xe000a31d, 0x13375: 0xe00076b7, 0x13376: 0xe0004cb0, - 0x13379: 0xe0004df3, 0x1337a: 0xe00049a6, - 0x1337d: 0xe0008bdd, 0x1337e: 0xe0007f13, 0x1337f: 0xe0009520, - // Block 0x4ce, offset 0x13380 - 0x13380: 0xe0005700, 0x13381: 0xe0005625, 0x13382: 0xe0005ad0, 0x13383: 0xe0008ad1, - 0x13384: 0xe0009293, 0x13385: 0xe0007f16, 0x13386: 0xe0009e08, - 0x13388: 0xe0007ece, 0x1338a: 0xe0007dd0, - 0x13392: 0xe00091d1, 0x13393: 0xe00093d3, - 0x13395: 0xe0008d3d, 0x13396: 0xe0004c35, 0x13397: 0xe0009413, - 0x13398: 0xe0004dab, 0x1339b: 0xe0004d43, - 0x1339f: 0xe0004dd7, - 0x133a0: 0xe0004a23, 0x133a3: 0xe0007140, - 0x133a9: 0xe0007dac, 0x133aa: 0xe0007daf, - 0x133ac: 0xe00082ba, 0x133ae: 0xe0004df7, 0x133af: 0xe0007ed1, - 0x133b3: 0xe00082bd, - 0x133b6: 0xe0004d46, - 0x133b9: 0xe0007cd3, 0x133ba: 0xe0004eb8, 0x133bb: 0xe0009417, - 0x133be: 0xe0004aad, 0x133bf: 0xe0005ca8, - // Block 0x4cf, offset 0x133c0 - 0x133c4: 0xe00092c3, 0x133c5: 0xe0004ebb, 0x133c7: 0xe00056c4, - 0x133c8: 0xe0008da0, 0x133ca: 0xe0008abd, 0x133cb: 0xe0005dcd, - 0x133d7: 0xe0006123, - 0x133d9: 0xe0009343, - 0x133dd: 0xe000664c, 0x133df: 0xe0004709, - 0x133e0: 0xe0008772, 0x133e2: 0xe0006ba5, 0x133e3: 0xe0008f85, - 0x133e5: 0xe0005665, 0x133e6: 0xe000716c, - 0x133ea: 0xe00071ef, - 0x133ed: 0xe00042c8, 0x133ef: 0xe000535e, - 0x133f6: 0xe000470d, - 0x133f8: 0xe0004775, 0x133f9: 0xe0008f49, 0x133fa: 0xe00098c2, - 0x133fd: 0xe0008047, 0x133ff: 0xe000426c, - // Block 0x4d0, offset 0x13400 - 0x13406: 0xe0009d12, - 0x13408: 0xe000502b, 0x1340a: 0xe0008da3, - 0x1340c: 0xe00075f3, 0x1340f: 0xe000a509, - 0x13411: 0xe000707e, 0x13412: 0xe0004ff7, - 0x13418: 0xe0008b05, 0x13419: 0xe0006d74, 0x1341b: 0xe0008911, - 0x1341e: 0xe0009c0c, - 0x13420: 0xe0005dd1, - 0x13425: 0xe0006ba8, 0x13426: 0xe00067c8, 0x13427: 0xe0009479, - 0x13428: 0xe00068d8, - 0x1342c: 0xe0008c92, 0x1342d: 0xe0005a20, 0x1342f: 0xe000528f, - 0x13433: 0xe00041d5, - 0x13435: 0xe000656c, - 0x13439: 0xe0007027, - // Block 0x4d1, offset 0x13440 - 0x13445: 0xe0006ef0, 0x13446: 0xe0009fa5, - 0x13448: 0xe0004aed, 0x13449: 0xe0005720, 0x1344b: 0xe0004f73, - 0x1344c: 0xe00089c9, 0x1344d: 0xe0007309, 0x1344f: 0xe0006534, - 0x13450: 0xe0004b25, 0x13451: 0xe00098c6, 0x13452: 0xe0009c6e, 0x13453: 0xe00047ed, - 0x13454: 0xe0005442, 0x13456: 0xe0009465, - 0x1345f: 0xe0006828, - 0x13460: 0xe0004f0f, - 0x13465: 0xe00044eb, 0x13466: 0xe0004ab1, 0x13467: 0xe000461d, - 0x13469: 0xe0009c82, - 0x1346c: 0xe0006ff8, 0x1346e: 0xe0006db3, - 0x13471: 0xe00070c9, 0x13473: 0xe0008c55, - 0x13475: 0xe0007a67, - 0x1347d: 0xe0007ca0, - // Block 0x4d2, offset 0x13480 - 0x13487: 0xe000446a, - 0x1348b: 0xe00089cd, - 0x1348d: 0xe00048a1, 0x1348e: 0xe000a4ba, 0x1348f: 0xe0008843, - 0x13492: 0xe0009883, - 0x13494: 0xe00062e8, 0x13495: 0xe00050d2, 0x13497: 0xe0006bf8, - 0x13499: 0xe0006715, 0x1349a: 0xe0009263, - 0x1349c: 0xe00049ca, 0x1349d: 0xe0004661, - 0x134a0: 0xe0009886, 0x134a1: 0xe0004a7d, - 0x134ad: 0xe00089d1, - 0x134b1: 0xe0006cfc, - 0x134b4: 0xe00086ee, - 0x134b8: 0xe000888c, - 0x134be: 0xe00070cc, - // Block 0x4d3, offset 0x134c0 - 0x134c0: 0xe0008ac1, 0x134c1: 0xe000a680, - 0x134c4: 0xe0006564, 0x134c6: 0xe00089d5, 0x134c7: 0xe0009dc4, - 0x134c9: 0xe00098ca, 0x134ca: 0xe000a541, 0x134cb: 0xe000a37d, - 0x134cc: 0xe000a7ab, - 0x134d2: 0xe0007499, - 0x134d4: 0xe00080c2, - 0x134d9: 0xe00048a4, 0x134db: 0xe0007845, - 0x134dd: 0xe0004d49, - 0x134e0: 0xe0007081, - 0x134e4: 0xe00055d9, 0x134e6: 0xe0006a05, - 0x134e9: 0xe0006b4e, 0x134ea: 0xe00090cd, - 0x134f3: 0xe0009fbd, - 0x134f7: 0xe0006779, - 0x134fe: 0xe0005fe8, - // Block 0x4d4, offset 0x13500 - 0x13500: 0xe000947d, - 0x13507: 0xe0008ddd, - 0x13509: 0xe0009889, 0x1350b: 0xe0004e85, - 0x1350f: 0xe0005b1a, - 0x13512: 0xe00092c7, - 0x1351e: 0xe0005362, 0x1351f: 0xe0008b09, - 0x13520: 0xe00066b2, 0x13521: 0xe0004270, - 0x13527: 0xe000a684, - 0x1352a: 0xe00086f2, 0x1352b: 0xe0007084, - 0x13537: 0xe0009620, - 0x13538: 0xe0009d15, - 0x1353d: 0xe00095f8, 0x1353e: 0xe00059e8, 0x1353f: 0xe00067cb, - // Block 0x4d5, offset 0x13540 - 0x13543: 0xe000580b, - 0x1354c: 0xe0008ed7, 0x1354d: 0xe0008915, - 0x13550: 0xe0005744, 0x13552: 0xe0008f1c, - 0x13554: 0xe000726a, - 0x1355b: 0xe0008a59, - 0x1355c: 0xe0009b48, 0x1355f: 0xe0005b83, - 0x13560: 0xe0005b3e, - 0x13564: 0xe00095fc, 0x13565: 0xe0007849, 0x13567: 0xe00044ee, - 0x13569: 0xe00065e4, - 0x1356c: 0xe0005d15, - 0x13572: 0xe00082c0, 0x13573: 0xe0006211, - 0x1357e: 0xe000854a, - // Block 0x4d6, offset 0x13580 - 0x13581: 0xe0009568, 0x13583: 0xe0006996, - 0x13589: 0xe0006890, - 0x1358d: 0xe0006093, - 0x13592: 0xe0005dd5, - 0x13595: 0xe00062ec, 0x13597: 0xe0008d40, - 0x13598: 0xe0008ae9, - 0x1359f: 0xe0007100, - 0x135a2: 0xe000863b, - 0x135a4: 0xe0008196, 0x135a5: 0xe0008f4d, 0x135a6: 0xe0005d91, 0x135a7: 0xe0008776, - 0x135a8: 0xe00064f4, - 0x135ae: 0xe00058a9, - 0x135b1: 0xe00058ad, 0x135b2: 0xe00092cf, 0x135b3: 0xe000449a, - 0x135b9: 0xe00071f2, - 0x135bc: 0xe0005d95, 0x135bd: 0xe0008e65, 0x135be: 0xe0008be1, - // Block 0x4d7, offset 0x135c0 - 0x135c5: 0xe00082c3, 0x135c6: 0xe0005fd4, - 0x135ca: 0xe000a469, - 0x135d5: 0xe00048a7, 0x135d6: 0xe000546e, 0x135d7: 0xe0004d4c, - 0x135d9: 0xe0008da6, 0x135da: 0xe00087d6, - 0x135dc: 0xe0006241, 0x135dd: 0xe0006c68, 0x135de: 0xe0006894, 0x135df: 0xe0008d43, - 0x135e0: 0xe00043cc, 0x135e2: 0xe0006096, - 0x135e5: 0xe00051b6, 0x135e7: 0xe00058b1, - 0x135ef: 0xe00051b9, - 0x135f2: 0xe0005922, - 0x135f4: 0xe0008951, 0x135f6: 0xe0008da9, - 0x135f8: 0xe0005f9c, 0x135fa: 0xe0004eeb, 0x135fb: 0xe00047c9, - 0x135fe: 0xe0004ebe, - // Block 0x4d8, offset 0x13600 - 0x13600: 0xe00050d5, 0x13602: 0xe0008eda, 0x13603: 0xe000734d, - 0x13604: 0xe0007825, 0x13605: 0xe000a529, 0x13606: 0xe0008002, 0x13607: 0xe000a8cf, - 0x13608: 0xe000a5e4, 0x1360a: 0xe00061ad, 0x1360b: 0xe00061b1, - 0x1360d: 0xe0005200, - 0x13610: 0xe00052e8, 0x13613: 0xe0006dec, - 0x13614: 0xe000730d, 0x13615: 0xe0006a08, 0x13617: 0xe0006b51, - 0x13618: 0xe0004baa, 0x13619: 0xe0009097, 0x1361a: 0xe0005013, 0x1361b: 0xe0006898, - 0x1361c: 0xe00080c6, - 0x13620: 0xe0007087, 0x13621: 0xe0006428, 0x13622: 0xe0006d54, - 0x1362b: 0xe0008605, - 0x1362c: 0xe0008edd, 0x1362e: 0xe000931b, 0x1362f: 0xe0005c00, - 0x13630: 0xe000702a, 0x13631: 0xe000690c, 0x13632: 0xe0006f60, 0x13633: 0xe00074ed, - 0x13635: 0xe000888f, - 0x13639: 0xe000708a, 0x1363a: 0xe0004330, - // Block 0x4d9, offset 0x13640 - 0x13642: 0xe0008e29, 0x13643: 0xe000a2c9, - 0x13644: 0xe0008d46, 0x13645: 0xe0004711, 0x13646: 0xe0006370, - 0x13649: 0xe0007371, - 0x1364d: 0xe00085a2, - 0x13650: 0xe0004641, - 0x13656: 0xe0004b49, - 0x13659: 0xe000a60c, 0x1365b: 0xe0008daf, - 0x1365c: 0xe000a329, 0x1365e: 0xe0004bf0, - 0x13661: 0xe0005793, 0x13662: 0xe000a2cd, 0x13663: 0xe0006664, - 0x13666: 0xe0005017, - 0x13668: 0xe000834a, 0x13669: 0xe0008dac, 0x1366a: 0xe0008512, - 0x1366e: 0xe0006db6, - 0x13670: 0xe00091ed, 0x13671: 0xe0009c72, 0x13672: 0xe0006b54, 0x13673: 0xe00043d0, - 0x13676: 0xe0008ac5, - 0x13679: 0xe00045f5, 0x1367a: 0xe0009a02, - 0x1367f: 0xe0004cb3, - // Block 0x4da, offset 0x13680 - 0x13683: 0xe000974b, - 0x13686: 0xe0004779, - 0x1368e: 0xe0008be5, 0x1368f: 0xe00071f5, - 0x13693: 0xe0004715, - 0x13698: 0xe000677d, - 0x1369c: 0xe0008e2d, - 0x136a0: 0xe0005af6, 0x136a2: 0xe0008ee0, 0x136a3: 0xe0004e3f, - 0x136a5: 0xe0005141, 0x136a6: 0xe0005144, 0x136a7: 0xe0008fb5, - 0x136a9: 0xe0008162, 0x136ab: 0xe0006ef4, - 0x136ac: 0xe00071f8, 0x136ad: 0xe000826c, 0x136ae: 0xe00047f0, - 0x136b0: 0xe0004ab5, 0x136b1: 0xe00043d4, 0x136b2: 0xe0005ecf, - 0x136b4: 0xe00095a8, 0x136b5: 0xe0009448, - 0x136b8: 0xe0005c80, 0x136ba: 0xe00050d8, 0x136bb: 0xe0009b78, - 0x136bd: 0xe000868e, 0x136be: 0xe0005cd4, 0x136bf: 0xe0005fbc, - // Block 0x4db, offset 0x136c0 - 0x136c4: 0xe0004936, 0x136c7: 0xe00099d5, - 0x136ca: 0xe0005177, 0x136cb: 0xe0006999, - 0x136cc: 0xe00082c6, 0x136cd: 0xe0006294, - 0x136d6: 0xe0006db9, 0x136d7: 0xe0006d30, - 0x136d8: 0xe000a0df, 0x136da: 0xe0006e94, - 0x136dc: 0xe0005fd8, 0x136dd: 0xe0009211, 0x136de: 0xe0005366, - 0x136e0: 0xe00096a0, 0x136e1: 0xe000627c, 0x136e3: 0xe0007a6b, - 0x136e6: 0xe000745d, - 0x136e8: 0xe0009dc8, 0x136e9: 0xe0007e01, - 0x136ec: 0xe0005fc0, 0x136ef: 0xe00081c1, - 0x136f4: 0xe0005980, 0x136f6: 0xe0009de8, - 0x136f9: 0xe0008cce, 0x136fb: 0xe00099d8, - // Block 0x4dc, offset 0x13700 - 0x13708: 0xe0007bcf, 0x13709: 0xe0009151, 0x1370a: 0xe00077c4, 0x1370b: 0xe000988c, - 0x13710: 0xe000988f, 0x13711: 0xe0004685, - 0x13715: 0xe0007d1e, 0x13717: 0xe0009817, - 0x13718: 0xe00047f3, 0x1371b: 0xe00062f0, - 0x1371d: 0xe0009155, 0x1371e: 0xe000a46c, 0x1371f: 0xe0007f2e, - 0x13720: 0xe00048f2, 0x13721: 0xe000881b, 0x13722: 0xe0005748, 0x13723: 0xe000a2d1, - 0x1372b: 0xe0006759, - 0x1372e: 0xe00098ce, 0x1372f: 0xe0007a6f, - 0x13731: 0xe0008e31, 0x13732: 0xe0005c54, 0x13733: 0xe0004621, - 0x13735: 0xe0005e7f, 0x13737: 0xe0005c03, - 0x13739: 0xe0009f2a, 0x1373b: 0xe0006244, - 0x1373d: 0xe00097d4, 0x1373e: 0xe0008919, - // Block 0x4dd, offset 0x13740 - 0x13741: 0xe000650c, 0x13743: 0xe0006934, - 0x13744: 0xe0007c37, 0x13745: 0xe00070cf, 0x13746: 0xe0006162, 0x13747: 0xe0007ed4, - 0x13748: 0xe0004424, - 0x13750: 0xe0007036, 0x13752: 0xe0009039, - 0x13754: 0xe00090f1, 0x13755: 0xe0006e98, 0x13756: 0xe0006c24, 0x13757: 0xe0005d99, - 0x13759: 0xe000651c, 0x1375a: 0xe0005bd1, - 0x1375e: 0xe0007ed7, - 0x13761: 0xe00071fb, 0x13762: 0xe0004e88, - 0x13769: 0xe00073da, 0x1376a: 0xe000a6e2, 0x1376b: 0xe00047cc, - 0x1376d: 0xe00045f9, 0x1376f: 0xe000a301, - 0x13770: 0xe0008d49, - 0x13776: 0xe0007923, - 0x13779: 0xe00079ef, - 0x1377c: 0xe00047cf, 0x1377d: 0xe0006a8b, 0x1377e: 0xe0004625, - // Block 0x4de, offset 0x13780 - 0x13781: 0xe000a7ee, 0x13782: 0xe00092cb, - 0x13787: 0xe0005b86, - 0x13788: 0xe000a984, 0x1378a: 0xe0004b4d, - 0x1378c: 0xe0007104, 0x1378d: 0xe0005c57, 0x1378f: 0xe00089d9, - 0x13793: 0xe0007b9b, - 0x13794: 0xe000883c, 0x13796: 0xe0006f70, - 0x13798: 0xe00092d3, 0x1379b: 0xe00055dd, - 0x1379c: 0xe000580f, - // Block 0x4df, offset 0x137c0 - 0x137f6: 0xe00067ce, 0x137f7: 0xe0006bab, - 0x137f8: 0xe000a16b, 0x137fa: 0xe0004645, - 0x137fe: 0xe0006668, 0x137ff: 0xe000a187, - // Block 0x4e0, offset 0x13800 - 0x13803: 0xe00077f8, - 0x13804: 0xe0004781, 0x13805: 0xe000a029, 0x13807: 0xe0008fb9, - 0x1380b: 0xe0007d96, - 0x1380c: 0xe00077e4, 0x1380d: 0xe0005b89, 0x1380e: 0xe0005426, - 0x13810: 0xe0004a81, - 0x13814: 0xe0005ed3, 0x13815: 0xe000a07b, - 0x13818: 0xe000682b, - 0x1381d: 0xe00088cb, 0x1381f: 0xe00048aa, - 0x13820: 0xe0006298, 0x13821: 0xe0004428, 0x13823: 0xe0004b6c, - 0x13826: 0xe000682e, - 0x13828: 0xe000798b, 0x1382a: 0xe0008e8c, 0x1382b: 0xe0004b63, - 0x1382e: 0xe00099db, - 0x13830: 0xe0006538, 0x13832: 0xe0006dbc, - 0x13835: 0xe0005f1e, 0x13837: 0xe0009cee, - 0x13838: 0xe0006544, 0x13839: 0xe0005d18, - 0x1383c: 0xe0009fc1, 0x1383d: 0xe00047f6, 0x1383e: 0xe0009051, - // Block 0x4e1, offset 0x13840 - 0x13842: 0xe0004629, - 0x13845: 0xe000575d, 0x13846: 0xe0006a0b, 0x13847: 0xe0005147, - 0x13848: 0xe00050db, 0x1384a: 0xe00078a1, - 0x1384c: 0xe00043d8, 0x1384e: 0xe0006214, - 0x13854: 0xe0004844, 0x13856: 0xe00048ad, 0x13857: 0xe000442c, - 0x13858: 0xe00087da, 0x1385a: 0xe0005a24, - 0x1385d: 0xe00088ce, 0x1385e: 0xe00071fe, - 0x13864: 0xe0004daf, - 0x13868: 0xe0006e9c, 0x13869: 0xe0008423, 0x1386b: 0xe0004430, - 0x1386f: 0xe00042e8, - 0x13872: 0xe000a958, - 0x13876: 0xe0008a5d, - 0x13878: 0xe0005d1b, 0x13879: 0xe000449e, - 0x1387d: 0xe0008005, - // Block 0x4e2, offset 0x13880 - 0x13881: 0xe0007d72, - 0x13885: 0xe0007427, - 0x1388a: 0xe00084ca, - 0x1388c: 0xe00084ce, 0x1388e: 0xe0005a28, - 0x13892: 0xe00073a6, - 0x13894: 0xe0006d00, 0x13895: 0xe000a907, 0x13896: 0xe000a917, - 0x1389b: 0xe00070d2, - 0x1389f: 0xe000891d, - 0x138a0: 0xe0009967, 0x138a1: 0xe000699c, 0x138a3: 0xe0006c90, - 0x138a4: 0xe0007460, 0x138a6: 0xe0008a61, - 0x138a9: 0xe0009dcc, 0x138ab: 0xe0007e05, - 0x138ac: 0xe000a84e, 0x138ae: 0xe000a1ee, - 0x138b0: 0xe000a07f, 0x138b3: 0xe0007c3a, - 0x138b9: 0xe0004bf3, 0x138ba: 0xe00048b0, 0x138bb: 0xe0006520, - 0x138bc: 0xe00084d2, 0x138be: 0xe000a305, - // Block 0x4e3, offset 0x138c0 - 0x138c0: 0xe0007eda, 0x138c1: 0xe0005aa9, 0x138c3: 0xe0004847, - 0x138c4: 0xe0006099, 0x138c5: 0xe0008608, 0x138c6: 0xe00050de, - 0x138c9: 0xe0004cb6, - 0x138cc: 0xe0008483, - 0x138d0: 0xe0005220, 0x138d1: 0xe000538e, 0x138d2: 0xe0005b8c, - 0x138d4: 0xe000863e, 0x138d5: 0xe0004719, 0x138d6: 0xe000974e, 0x138d7: 0xe0006069, - 0x138d8: 0xe000809e, 0x138d9: 0xe0009d18, - 0x138de: 0xe00041d8, - 0x138e1: 0xe0006def, - 0x138e6: 0xe000804a, - 0x138e8: 0xe00052d2, - 0x138ec: 0xe0005c1e, 0x138ed: 0xe00050e1, - 0x138f0: 0xe000804d, 0x138f3: 0xe0008486, - 0x138f6: 0xe0007818, - 0x138fd: 0xe0009ba8, 0x138ff: 0xe000471d, - // Block 0x4e4, offset 0x13900 - 0x13903: 0xe00053ee, - 0x13906: 0xe0005a2c, - 0x1390a: 0xe0005bb3, - 0x13912: 0xe0004af1, - 0x13915: 0xe000a4bd, 0x13916: 0xe0006ffc, - 0x13918: 0xe0006abb, 0x1391a: 0xe000996a, - 0x1391e: 0xe00061b5, - 0x1392f: 0xe0005984, - 0x13930: 0xe00097d8, 0x13931: 0xe0007cd6, 0x13932: 0xe0007000, 0x13933: 0xe0007f86, - 0x13935: 0xe0007e98, 0x13936: 0xe0006fb8, 0x13937: 0xe00090f5, - 0x1393d: 0xe0009670, 0x1393e: 0xe0005b42, 0x1393f: 0xe0008336, - // Block 0x4e5, offset 0x13940 - 0x13944: 0xe0008489, 0x13945: 0xe00072ad, 0x13946: 0xe0006b57, 0x13947: 0xe0008d4c, - 0x13949: 0xe00082fe, 0x1394b: 0xe0005cb0, - 0x1394c: 0xe00050e4, - 0x13953: 0xe000a6ac, - 0x13956: 0xe0009703, - 0x13958: 0xe0008f1f, 0x1395a: 0xe00056d9, 0x1395b: 0xe000a16f, - 0x1395d: 0xe0004274, - 0x13961: 0xe000484a, 0x13962: 0xe000909a, - 0x13965: 0xe000699f, 0x13966: 0xe00068dc, - 0x13969: 0xe00045fd, 0x1396a: 0xe000642c, 0x1396b: 0xe0007351, - 0x1396d: 0xe00052e1, 0x1396f: 0xe000503f, - 0x13971: 0xe0004bae, 0x13972: 0xe0008302, - 0x13974: 0xe000a751, 0x13975: 0xe000514a, - 0x1397a: 0xe0009e4a, - // Block 0x4e6, offset 0x13980 - 0x13983: 0xe00081c4, - 0x13984: 0xe0008e9e, 0x13986: 0xe0005392, - 0x1398a: 0xe0004d4f, - 0x1398c: 0xe00064aa, 0x1398e: 0xe0009c0f, - 0x13995: 0xe0006831, 0x13996: 0xe000639c, - 0x13999: 0xe0008db2, 0x1399a: 0xe00064ad, 0x1399b: 0xe000438c, - 0x1399e: 0xe0009e92, - 0x139a0: 0xe00044f1, 0x139a1: 0xe000a46f, - 0x139a4: 0xe000831e, 0x139a5: 0xe0006dbf, - 0x139af: 0xe00048b3, - 0x139b1: 0xe0004b29, - 0x139b4: 0xe0005669, 0x139b7: 0xe000a897, - 0x139b8: 0xe000a88f, - 0x139bd: 0xe00052f5, 0x139be: 0xe0008641, - // Block 0x4e7, offset 0x139c0 - 0x139c2: 0xe000909d, - 0x139c5: 0xe000a351, 0x139c6: 0xe000996d, 0x139c7: 0xe000a355, - 0x139c8: 0xe0005f48, 0x139c9: 0xe0005f5c, 0x139ca: 0xe00094c8, - 0x139d6: 0xe00063dc, - 0x139d8: 0xe0007e09, 0x139da: 0xe0004200, 0x139db: 0xe0004721, - 0x139e3: 0xe0007311, - 0x139e4: 0xe0007531, 0x139e7: 0xe000981a, - 0x139e9: 0xe0007201, 0x139eb: 0xe0009b98, - 0x139ef: 0xe0009e95, - 0x139f0: 0xe00056dc, - 0x139f9: 0xe00093d7, 0x139fa: 0xe000726d, - 0x139fe: 0xe00069a2, - // Block 0x4e8, offset 0x13a00 - 0x13a01: 0xe00065ec, - 0x13a06: 0xe0008a65, - 0x13a0a: 0xe0006e3c, 0x13a0b: 0xe00077c8, - 0x13a0e: 0xe00074f1, - 0x13a10: 0xe00067d1, 0x13a11: 0xe00067d4, 0x13a12: 0xe00044f4, 0x13a13: 0xe0006a0e, - 0x13a14: 0xe00043dc, 0x13a15: 0xe0007e0d, - 0x13a20: 0xe0008f22, - 0x13a24: 0xe00076fb, 0x13a25: 0xe0007004, 0x13a26: 0xe00052b4, - 0x13a2b: 0xe0008e35, - 0x13a2d: 0xe000764b, - 0x13a30: 0xe0007edd, 0x13a31: 0xe0004528, - 0x13a34: 0xe00082c9, 0x13a36: 0xe0005396, 0x13a37: 0xe0009f85, - 0x13a38: 0xe000877a, 0x13a39: 0xe00066e1, 0x13a3a: 0xe0006ea0, - 0x13a3f: 0xe0009c8c, - // Block 0x4e9, offset 0x13a40 - 0x13a40: 0xe0006430, 0x13a42: 0xe0005925, 0x13a43: 0xe0007d5a, - 0x13a44: 0xe0007270, 0x13a46: 0xe00070d5, - 0x13a48: 0xe00045c1, 0x13a4a: 0xe00062f4, 0x13a4b: 0xe0005bd4, - 0x13a4f: 0xe000484d, - 0x13a5a: 0xe00067d7, - 0x13a5c: 0xe0005e13, 0x13a5d: 0xe0007392, 0x13a5e: 0xe0008a69, - 0x13a60: 0xe0004bf6, 0x13a63: 0xe00091d5, - 0x13a68: 0xe0009d9c, 0x13a69: 0xe000530e, - 0x13a70: 0xe0006524, 0x13a73: 0xe0006ea4, - 0x13a74: 0xe0006183, 0x13a75: 0xe000993d, - 0x13a78: 0xe0007273, 0x13a79: 0xe00068e0, 0x13a7a: 0xe00083fa, - 0x13a7d: 0xe00053f2, 0x13a7e: 0xe000a6e5, 0x13a7f: 0xe0005299, - // Block 0x4ea, offset 0x13a80 - 0x13a80: 0xe00056ec, 0x13a82: 0xe00069a5, - 0x13a86: 0xe000791f, - 0x13a8a: 0xe0008db5, - 0x13a8d: 0xe0008c95, 0x13a8f: 0xe0006a8f, - 0x13a91: 0xe0005292, - 0x13a98: 0xe000582b, 0x13a99: 0xe0007aa7, 0x13a9a: 0xe0005928, - 0x13a9d: 0xe000577b, 0x13a9f: 0xe000877e, - 0x13aa0: 0xe00059a4, 0x13aa3: 0xe00074f5, - 0x13aa5: 0xe0007db2, 0x13aa7: 0xe0008782, - 0x13aa8: 0xe0005dbd, 0x13aaa: 0xe000860b, - 0x13aac: 0xe0007963, 0x13aad: 0xe0009970, - 0x13ab3: 0xe00090a0, - 0x13ab4: 0xe00099de, 0x13ab6: 0xe000956c, - 0x13aba: 0xe00054df, 0x13abb: 0xe0009159, - 0x13abc: 0xe0004cb9, 0x13abe: 0xe000826f, - // Block 0x4eb, offset 0x13ac0 - 0x13ac1: 0xe00079d8, 0x13ac2: 0xe0007fba, 0x13ac3: 0xe0006e40, - 0x13ac5: 0xe0004cbc, 0x13ac7: 0xe00079c6, - 0x13ac8: 0xe000a91b, 0x13aca: 0xe0004cbf, - 0x13acc: 0xe0006f28, 0x13acd: 0xe0006b5a, - 0x13ad0: 0xe00090d0, 0x13ad2: 0xe0006dc2, - 0x13ad6: 0xe0009ec5, - 0x13adb: 0xe0009524, - 0x13adc: 0xe0007315, 0x13ade: 0xe0006165, 0x13adf: 0xe0008ee3, - 0x13ae1: 0xe00043e0, - 0x13aea: 0xe000a173, 0x13aeb: 0xe0006434, - 0x13aec: 0xe0006374, - 0x13af3: 0xe00098ea, - 0x13af5: 0xe0009ac9, 0x13af6: 0xe00062f8, 0x13af7: 0xe000a2d5, - 0x13af8: 0xe00041db, 0x13af9: 0xe0006ea8, - 0x13afd: 0xe0006478, - // Block 0x4ec, offset 0x13b00 - 0x13b00: 0xe00067da, - 0x13b05: 0xe00079c9, 0x13b07: 0xe0008be9, - 0x13b11: 0xe0009dec, - 0x13b18: 0xe00070d8, 0x13b19: 0xe00093db, 0x13b1a: 0xe0008db8, - 0x13b1f: 0xe0005699, - 0x13b24: 0xe0008426, 0x13b26: 0xe000a0e3, - 0x13b28: 0xe00060fc, 0x13b2a: 0xe0005ad3, 0x13b2b: 0xe0005ad6, - 0x13b2e: 0xe0004278, 0x13b2f: 0xe00058b5, - 0x13b31: 0xe000427c, 0x13b32: 0xe0006d58, - 0x13b34: 0xe0006910, 0x13b36: 0xe0007ae7, - 0x13b38: 0xe0009706, - 0x13b3e: 0xe000776f, - // Block 0x4ed, offset 0x13b40 - 0x13b4a: 0xe0009570, 0x13b4b: 0xe0008008, - 0x13b4d: 0xe0008692, 0x13b4e: 0xe0004dfb, - 0x13b52: 0xe0005ed7, - 0x13b54: 0xe000a82a, - 0x13b58: 0xe0006a11, 0x13b59: 0xe00067dd, 0x13b5a: 0xe00056f0, - 0x13b5d: 0xe00090a3, 0x13b5f: 0xe0006c5c, - 0x13b61: 0xe0004590, 0x13b62: 0xe000854e, 0x13b63: 0xe0006834, - 0x13b65: 0xe000446d, 0x13b66: 0xe000a472, 0x13b67: 0xe0006df2, - 0x13b68: 0xe000502f, 0x13b69: 0xe0004fd7, 0x13b6a: 0xe000514d, 0x13b6b: 0xe0008166, - 0x13b6c: 0xe000689c, 0x13b6d: 0xe0009cf1, 0x13b6e: 0xe0007c01, 0x13b6f: 0xe0007575, - 0x13b70: 0xe0005150, 0x13b71: 0xe000a565, 0x13b73: 0xe0006438, - 0x13b77: 0xe00090a6, - 0x13b78: 0xe00080a2, 0x13b79: 0xe0004f77, 0x13b7b: 0xe0009838, - 0x13b7c: 0xe000606c, 0x13b7d: 0xe00075c0, 0x13b7e: 0xe0006a14, 0x13b7f: 0xe00085ca, - // Block 0x4ee, offset 0x13b80 - 0x13b85: 0xe0007c3d, - 0x13b91: 0xe0008132, 0x13b92: 0xe0007aeb, 0x13b93: 0xe0005a68, - 0x13b94: 0xe0009c12, 0x13b95: 0xe0009709, 0x13b97: 0xe0006126, - 0x13b9b: 0xe0004199, - 0x13b9c: 0xe00060c8, 0x13b9e: 0xe0009e98, 0x13b9f: 0xe0004cc2, - 0x13ba0: 0xe000629c, 0x13ba1: 0xe000848c, 0x13ba3: 0xe00044f7, - 0x13ba5: 0xe0007829, 0x13ba6: 0xe0004850, 0x13ba7: 0xe0008892, - 0x13bab: 0xe0008b0d, - 0x13bb1: 0xe0007b9f, 0x13bb3: 0xe000569d, - 0x13bb4: 0xe00088d1, - 0x13bb9: 0xe0009e2c, 0x13bba: 0xe0005f3c, 0x13bbb: 0xe0006837, - 0x13bbd: 0xe0004853, 0x13bbe: 0xe0009fa9, 0x13bbf: 0xe0006247, - // Block 0x4ef, offset 0x13bc0 - 0x13bc0: 0xe0006914, 0x13bc1: 0xe0008fd9, 0x13bc2: 0xe0006168, 0x13bc3: 0xe0006568, - 0x13bc4: 0xe000419c, 0x13bc5: 0xe000606f, - 0x13bc8: 0xe0008644, 0x13bc9: 0xe0005ea7, - 0x13bd7: 0xe0006014, - 0x13bdb: 0xe00042a0, - 0x13bdc: 0xe0009574, 0x13bdd: 0xe000945a, - 0x13be3: 0xe0007cd9, - 0x13be8: 0xe000860e, 0x13bea: 0xe0004b51, 0x13beb: 0xe0005edb, - 0x13bef: 0xe00066e5, - 0x13bf1: 0xe0007204, 0x13bf2: 0xe0008647, 0x13bf3: 0xe0004434, - 0x13bf4: 0xe000a6e8, 0x13bf5: 0xe0008516, 0x13bf6: 0xe0005324, - 0x13bf8: 0xe0007f8a, 0x13bf9: 0xe00079cc, - 0x13bfc: 0xe00056a1, - // Block 0x4f0, offset 0x13c00 - 0x13c00: 0xe0007319, 0x13c03: 0xe0008a6d, - 0x13c07: 0xe000a202, - 0x13c09: 0xe000970c, 0x13c0a: 0xe000a3b5, - 0x13c0f: 0xe000859a, - 0x13c10: 0xe0009578, 0x13c11: 0xe000848f, 0x13c12: 0xe000a688, - 0x13c33: 0xe00056c7, - 0x13c37: 0xe000a005, - 0x13c3b: 0xe0008921, - // Block 0x4f1, offset 0x13c40 - 0x13c45: 0xe0005d48, - 0x13c49: 0xe0005d1e, 0x13c4a: 0xe0008786, - 0x13c4e: 0xe0006b5d, - 0x13c52: 0xe00044fa, 0x13c53: 0xe0005f3f, - 0x13c56: 0xe0004725, - 0x13c58: 0xe00074f9, 0x13c5a: 0xe0007aab, 0x13c5b: 0xe0008c59, - 0x13c5d: 0xe0008e86, 0x13c5e: 0xe0007e11, 0x13c5f: 0xe000a0f3, - 0x13c60: 0xe00082cc, 0x13c62: 0xe000a359, - 0x13c68: 0xe0005863, 0x13c69: 0xe00067e0, 0x13c6a: 0xe00075c3, 0x13c6b: 0xe0005e17, - 0x13c7d: 0xe0005edf, 0x13c7e: 0xe0005ef7, 0x13c7f: 0xe000864a, - // Block 0x4f2, offset 0x13c80 - 0x13c81: 0xe0009674, 0x13c82: 0xe0008955, - 0x13c85: 0xe0004a85, - 0x13c89: 0xe0005afa, 0x13c8a: 0xe0004d87, - 0x13c8c: 0xe0004f13, - 0x13c91: 0xe0009a05, 0x13c93: 0xe00049f9, - 0x13c94: 0xe0006719, 0x13c96: 0xe00093df, - 0x13c98: 0xe0007381, - 0x13c9c: 0xe000944b, 0x13c9f: 0xe00055a8, - 0x13ca0: 0xe0009d1b, 0x13ca1: 0xe000a0f7, - 0x13ca9: 0xe000669d, 0x13cab: 0xe0004f7b, - 0x13caf: 0xe000a568, - 0x13cb0: 0xe0004856, 0x13cb1: 0xe0005cd8, 0x13cb2: 0xe00069a8, - 0x13cb4: 0xe00076e3, 0x13cb6: 0xe0006781, - 0x13cb9: 0xe0008895, - 0x13cbd: 0xe00072b1, - // Block 0x4f3, offset 0x13cc0 - 0x13cc3: 0xe0009940, - 0x13cc4: 0xe0005560, 0x13cc6: 0xe0006a17, 0x13cc7: 0xe00087de, - 0x13cca: 0xe0005878, 0x13ccb: 0xe0009494, - 0x13ccc: 0xe0005f7c, 0x13ccd: 0xe0009e18, 0x13cce: 0xe00081c7, - 0x13ce9: 0xe000983b, - 0x13cec: 0xe0005e5b, - 0x13cf1: 0xe000a80e, - 0x13cf5: 0xe0007dd3, - 0x13cf8: 0xe0008272, 0x13cf9: 0xe0009df0, - 0x13cfc: 0xe000764f, 0x13cfd: 0xe0005797, - // Block 0x4f4, offset 0x13d00 - 0x13d06: 0xe00066b5, - 0x13d09: 0xe0007b33, 0x13d0a: 0xe00076ff, - 0x13d11: 0xe0009f60, - 0x13d17: 0xe0008898, - 0x13d1a: 0xe0007589, 0x13d1b: 0xe00042cc, - 0x13d21: 0xe0009e9b, 0x13d23: 0xe000566d, - 0x13d26: 0xe00081ca, - 0x13d29: 0xe0009d1e, 0x13d2a: 0xe00047f9, 0x13d2b: 0xe000a475, - 0x13d2c: 0xe000878a, 0x13d2d: 0xe00041de, 0x13d2f: 0xe000782d, - 0x13d31: 0xe00097e4, 0x13d33: 0xe00081f4, - 0x13d35: 0xe0004ec1, 0x13d37: 0xe000a7f2, - 0x13d3a: 0xe0009011, - // Block 0x4f5, offset 0x13d40 - 0x13d42: 0xe00096be, - 0x13d50: 0xe0007207, - 0x13d54: 0xe000742a, - 0x13d59: 0xe00060dc, - 0x13d5c: 0xe0006bfc, 0x13d5f: 0xe0004d52, - 0x13d61: 0xe000643c, - 0x13d68: 0xe000957c, - 0x13d6d: 0xe0009892, 0x13d6f: 0xe0004b9c, - 0x13d72: 0xe0009e9e, - 0x13d74: 0xe0006bd0, - 0x13d78: 0xe000903d, 0x13d79: 0xe0004689, 0x13d7a: 0xe00091f1, 0x13d7b: 0xe0007831, - 0x13d7c: 0xe00093e3, 0x13d7f: 0xe000a478, - // Block 0x4f6, offset 0x13d80 - 0x13d80: 0xe0007128, 0x13d81: 0xe0009199, 0x13d82: 0xe0006018, - 0x13d84: 0xe00098d2, 0x13d86: 0xe0006e28, - 0x13d89: 0xe0007f8e, 0x13d8a: 0xe0007d9a, 0x13d8b: 0xe0004470, - 0x13d8d: 0xe000742d, - 0x13d90: 0xe0007f3e, 0x13d91: 0xe0006b60, 0x13d93: 0xe00064d1, - 0x13d96: 0xe0006a1a, - 0x13d9a: 0xe000720a, - 0x13dac: 0xe000675d, 0x13dad: 0xe0007703, 0x13dae: 0xe0005988, 0x13daf: 0xe00097e8, - 0x13db1: 0xe0009e30, - 0x13db4: 0xe000731d, - 0x13dbc: 0xe0005bb6, 0x13dbd: 0xe0009fc5, - // Block 0x4f7, offset 0x13dc0 - 0x13dc0: 0xe000683a, - 0x13dc6: 0xe0005ce4, - 0x13dd1: 0xe0005fe4, 0x13dd3: 0xe0005e5f, - 0x13dd4: 0xe00066e9, 0x13dd5: 0xe00096c1, 0x13dd7: 0xe0008611, - 0x13dd8: 0xe0006c60, 0x13dda: 0xe00080d2, - 0x13dde: 0xe0005c06, 0x13ddf: 0xe0008f25, - 0x13de1: 0xe000944e, 0x13de3: 0xe000878e, - 0x13de5: 0xe00097dc, 0x13de6: 0xe0008dbb, - 0x13dea: 0xe0008b11, - 0x13dec: 0xe000708d, 0x13ded: 0xe00083b6, 0x13def: 0xe000915d, - 0x13dfd: 0xe0009e4d, 0x13dff: 0xe00081cd, - // Block 0x4f8, offset 0x13e00 - 0x13e01: 0xe00053f6, 0x13e03: 0xe0006510, - 0x13e06: 0xe0009580, - 0x13e09: 0xe000970f, 0x13e0a: 0xe0007c40, 0x13e0b: 0xe0007c43, - 0x13e0e: 0xe0004bf9, - 0x13e13: 0xe00080a6, - 0x13e15: 0xe00082cf, 0x13e16: 0xe00044fd, - 0x13e18: 0xe0007f19, 0x13e19: 0xe000a3f4, - 0x13e1e: 0xe00096c4, - 0x13e21: 0xe00068e4, 0x13e23: 0xe0007321, - 0x13e24: 0xe00082d2, - 0x13e28: 0xe0004e4f, 0x13e29: 0xe0009be0, 0x13e2a: 0xe000616b, 0x13e2b: 0xe00056a5, - 0x13e2d: 0xe0007090, - 0x13e3a: 0xe0009019, - 0x13e3e: 0xe0005b8f, - // Block 0x4f9, offset 0x13e40 - 0x13e40: 0xe0007d3a, - 0x13e44: 0xe00062fc, 0x13e46: 0xe00077a8, 0x13e47: 0xe0006217, - 0x13e49: 0xe0007c46, 0x13e4a: 0xe00047fc, - 0x13e4c: 0xe000a232, 0x13e4f: 0xe0008429, - 0x13e51: 0xe00043e4, - 0x13e54: 0xe0008792, 0x13e57: 0xe000816a, - 0x13e59: 0xe0009a08, 0x13e5b: 0xe0006f2c, - 0x13e5d: 0xe000542a, - 0x13e64: 0xe000a1da, 0x13e65: 0xe000979c, 0x13e66: 0xe0009528, - 0x13e68: 0xe000a7fe, 0x13e69: 0xe0006c48, 0x13e6a: 0xe00074fd, - 0x13e6f: 0xe0006dc5, - 0x13e70: 0xe000a7d6, - 0x13e7a: 0xe0008c98, - // Block 0x4fa, offset 0x13e80 - 0x13e81: 0xe0004859, - 0x13e89: 0xe0008614, - 0x13e8d: 0xe0005813, 0x13e8e: 0xe0007501, 0x13e8f: 0xe0008796, - 0x13e90: 0xe0006132, - 0x13e95: 0xe000800b, - 0x13e9c: 0xe00058fe, 0x13e9d: 0xe0007c04, - 0x13ea4: 0xe0005724, 0x13ea5: 0xe0007835, - 0x13ea9: 0xe0006514, 0x13eaa: 0xe000720d, - 0x13eb7: 0xe000889b, - 0x13eb9: 0xe00077ab, 0x13eba: 0xe0005d6d, 0x13ebb: 0xe0008d4f, - 0x13ebd: 0xe0009a3e, 0x13ebf: 0xe0004a3d, - // Block 0x4fb, offset 0x13ec0 - 0x13ec0: 0xe0009b4c, 0x13ec2: 0xe0007c07, - 0x13ec4: 0xe0005153, 0x13ec6: 0xe0005aac, 0x13ec7: 0xe0007093, - 0x13eca: 0xe0007d22, 0x13ecb: 0xe0006a93, - 0x13ed6: 0xe000795f, 0x13ed7: 0xe00065a0, - 0x13ed8: 0xe00078d1, 0x13eda: 0xe0006eac, - 0x13ee2: 0xe0005b56, - 0x13ee7: 0xe0004500, - 0x13ee9: 0xe0006528, - 0x13eed: 0xe00057c3, 0x13eef: 0xe0009bf0, - 0x13efc: 0xe000624a, 0x13eff: 0xe0005760, - // Block 0x4fc, offset 0x13f00 - 0x13f01: 0xe0005156, - 0x13f0e: 0xe000a47b, - 0x13f10: 0xe000a037, 0x13f13: 0xe000a76c, - 0x13f14: 0xe000452c, 0x13f15: 0xe000948e, - 0x13f1b: 0xe000a23c, - 0x13f1c: 0xe0005aaf, 0x13f1e: 0xe000800e, 0x13f1f: 0xe000a47e, - 0x13f27: 0xe000a85d, - 0x13f2b: 0xe000a82d, - 0x13f2c: 0xe0004eee, 0x13f2f: 0xe0004ef1, - 0x13f31: 0xe000739a, - 0x13f38: 0xe000864d, 0x13f39: 0xe000a52d, 0x13f3a: 0xe000a830, 0x13f3b: 0xe0005f8c, - // Block 0x4fd, offset 0x13f40 - 0x13f4a: 0xe00061b9, 0x13f4b: 0xe0007c49, - 0x13f4c: 0xe0006440, 0x13f4d: 0xe0006a1d, - 0x13f53: 0xe000851a, - 0x13f55: 0xe0009584, - 0x13f63: 0xe00049aa, - 0x13f64: 0xe0008d52, - 0x13f68: 0xe000683d, 0x13f69: 0xe00099e1, 0x13f6a: 0xe00056df, - 0x13f6f: 0xe0004d55, - 0x13f70: 0xe00082d5, 0x13f71: 0xe0009481, - 0x13f74: 0xe00082d8, - // Block 0x4fe, offset 0x13f80 - 0x13f80: 0xe0008f28, - 0x13f85: 0xe0008b15, 0x13f86: 0xe00088d4, 0x13f87: 0xe0006b63, - 0x13f89: 0xe0005a6c, 0x13f8b: 0xe000536a, - 0x13f94: 0xe000a6eb, - 0x13f99: 0xe0007db5, 0x13f9b: 0xe0008ee6, - 0x13f9e: 0xe000a638, 0x13f9f: 0xe0004bfc, - 0x13fa3: 0xe000518f, - 0x13fa4: 0xe000a113, - 0x13fa9: 0xe00049ce, - 0x13fac: 0xe00049d2, 0x13fad: 0xe00091d9, - 0x13fb8: 0xe00070db, 0x13fb9: 0xe0007fbe, 0x13fbb: 0xe0007039, - 0x13fbe: 0xe00075c6, - // Block 0x4ff, offset 0x13fc0 - 0x13fc0: 0xe0009788, 0x13fc2: 0xe0006761, 0x13fc3: 0xe0007505, - 0x13fc6: 0xe000a309, - 0x13fc8: 0xe0007ca3, 0x13fc9: 0xe0006840, 0x13fca: 0xe0005d4b, 0x13fcb: 0xe0005867, - 0x13fd1: 0xe000539a, - 0x13fd8: 0xe00090a9, 0x13fda: 0xe00069ab, - 0x13fdc: 0xe00062b0, 0x13fdd: 0xe0005159, - 0x13fe1: 0xe0006bae, - 0x13fe5: 0xe0006e44, - 0x13fe8: 0xe0008b39, 0x13fe9: 0xe0008dbe, - 0x13ff4: 0xe00094f0, 0x13ff5: 0xe0007aaf, 0x13ff7: 0xe0004e43, - 0x13ffa: 0xe0007c4c, 0x13ffb: 0xe000968c, - 0x13fff: 0xe000816e, - // Block 0x500, offset 0x14000 - 0x14000: 0xe00056a9, - 0x1400c: 0xe0004a26, 0x1400e: 0xe00042d4, - 0x14015: 0xe000749d, 0x14017: 0xe000a68c, - 0x14019: 0xe0009df4, - 0x1401f: 0xe00081d0, - 0x14020: 0xe000671d, - 0x14024: 0xe00082db, 0x14025: 0xe000609c, 0x14026: 0xe000a008, - 0x14028: 0xe0007396, - 0x1402e: 0xe0006721, - 0x14034: 0xe000a481, 0x14036: 0xe0008b2d, - 0x14038: 0xe0007db8, - // Block 0x501, offset 0x14040 - 0x14042: 0xe000584f, 0x14043: 0xe000647c, - 0x1404c: 0xe00063a0, 0x1404d: 0xe000834e, - 0x14058: 0xe0008453, - 0x1405e: 0xe0005dfb, 0x1405f: 0xe000601c, - 0x14062: 0xe000a3b9, 0x14063: 0xe000574c, - 0x1406d: 0xe0005d4e, - 0x14073: 0xe0005472, - 0x14074: 0xe000919d, - 0x1407a: 0xe0005763, 0x1407b: 0xe0005c21, - 0x1407d: 0xe0008e69, - // Block 0x502, offset 0x14080 - 0x14080: 0xe0007144, - 0x14084: 0xe0009a96, 0x14087: 0xe0005dfe, - 0x1408a: 0xe000609f, 0x1408b: 0xe0007551, - 0x14092: 0xe0005efb, - 0x1409a: 0xe0009da8, 0x1409b: 0xe0009dac, - 0x140a0: 0xe0006378, 0x140a3: 0xe000515c, - 0x140ac: 0xe0006eb0, 0x140af: 0xe0007ee0, - 0x140b2: 0xe0009922, - 0x140b7: 0xe00054a2, - 0x140b9: 0xe000a1b0, 0x140bb: 0xe000842c, - 0x140be: 0xe0006f74, - // Block 0x503, offset 0x140c0 - 0x140c5: 0xe00073de, - 0x140cd: 0xe00042ec, - 0x140d1: 0xe0007bd3, - 0x140d5: 0xe0007ab3, - 0x140df: 0xe000582f, - 0x140e1: 0xe000592b, 0x140e2: 0xe0008f89, 0x140e3: 0xe0005901, - 0x140f1: 0xe000485c, 0x140f2: 0xe000462d, - 0x140f6: 0xe00086f6, - 0x140f9: 0xe00056e2, 0x140fb: 0xe0005e63, - // Block 0x504, offset 0x14100 - 0x14100: 0xe000a321, - 0x14104: 0xe00052f1, 0x14106: 0xe0008fe9, - 0x1410a: 0xe0005fec, - 0x1410c: 0xe000a206, 0x1410d: 0xe0007a73, 0x1410e: 0xe00042a4, - 0x14112: 0xe000a2d9, 0x14113: 0xe0007365, - 0x14117: 0xe000419f, - 0x14119: 0xe00075c9, 0x1411b: 0xe00081d3, - 0x1411d: 0xe0009926, 0x1411e: 0xe00081f7, - 0x14121: 0xe000a3bd, 0x14122: 0xe0004cc5, 0x14123: 0xe000842f, - 0x14128: 0xe0009f06, 0x1412b: 0xe0006c64, - 0x1412e: 0xe000493a, - 0x14130: 0xe0007189, 0x14132: 0xe0005204, - 0x14137: 0xe000992a, - 0x1413d: 0xe00085a6, 0x1413e: 0xe0004fdb, 0x1413f: 0xe0004fdf, - // Block 0x505, offset 0x14140 - 0x14141: 0xe0008136, 0x14142: 0xe0006030, - 0x14148: 0xe00041a2, 0x1414b: 0xe00054e2, - 0x1414d: 0xe0009ea1, - 0x14152: 0xe000536e, - 0x14156: 0xe0007210, 0x14157: 0xe0009161, - 0x1415b: 0xe00088d7, - 0x1415d: 0xe0006843, 0x1415e: 0xe000491e, - 0x14162: 0xe000652c, - 0x1416a: 0xe0004503, 0x1416b: 0xe0009f70, - 0x14174: 0xe000485f, - // Block 0x506, offset 0x14180 - 0x14180: 0xe0008552, 0x14181: 0xe000881e, 0x14182: 0xe00059c8, - 0x14185: 0xe00087e2, - 0x1418a: 0xe00052c9, - 0x1418d: 0xe000493e, 0x1418f: 0xe0005d21, - 0x14192: 0xe0006846, - 0x14194: 0xe0007c0a, 0x14195: 0xe0008275, - 0x14198: 0xe0004d58, 0x14199: 0xe0004db3, - 0x1419c: 0xe00066a0, 0x1419d: 0xe000879a, 0x1419f: 0xe0006b66, - 0x141a1: 0xe0005d24, - 0x141a8: 0xe00069ae, - 0x141af: 0xe0008f2b, - 0x141b1: 0xe0009f2d, 0x141b3: 0xe0006d04, - 0x141b4: 0xe00064b0, 0x141b5: 0xe00064b3, - 0x141b8: 0xe0005766, 0x141b9: 0xe0004a29, - 0x141bd: 0xe0008c9b, 0x141be: 0xe0004506, - // Block 0x507, offset 0x141c0 - 0x141c4: 0xe0009497, 0x141c7: 0xe00066ed, - 0x141ca: 0xe0009df8, - 0x141cc: 0xe0004942, - 0x141d0: 0xe00042d0, 0x141d2: 0xe0009ea4, 0x141d3: 0xe00066a3, - 0x141d5: 0xe00082de, - 0x141d8: 0xe00081d6, 0x141d9: 0xe00064b6, 0x141da: 0xe00088da, - 0x141e5: 0xe0007f32, 0x141e7: 0xe0004785, - 0x141ea: 0xe0009c8f, 0x141eb: 0xe0009a0b, - 0x141f0: 0xe0004548, - 0x141f6: 0xe00073aa, - 0x141f8: 0xe0005c09, 0x141fa: 0xe0009660, 0x141fb: 0xe0006f30, - // Block 0x508, offset 0x14200 - 0x14201: 0xe00043e8, - 0x14204: 0xe00078a5, - 0x1420d: 0xe000871a, - 0x14216: 0xe0007cdc, - 0x14218: 0xe0004b9f, - 0x1421c: 0xe0009624, 0x1421e: 0xe00065b8, 0x1421f: 0xe0004fe3, - 0x14220: 0xe00054a6, - 0x14224: 0xe0005817, - 0x1422a: 0xe0005eab, - 0x1422d: 0xe000a988, 0x1422f: 0xe0009a42, - 0x14232: 0xe00073ae, - 0x14234: 0xe00057db, - 0x1423f: 0xe0006dc8, - // Block 0x509, offset 0x14240 - 0x14241: 0xe0007ee3, 0x14243: 0xe00053fa, - 0x14246: 0xe00066f1, 0x14247: 0xe0009d7b, - 0x14248: 0xe000a1f2, 0x14249: 0xe000515f, 0x1424b: 0xe0004601, - 0x1424f: 0xe0004ec4, - 0x14253: 0xe0005f94, - 0x14256: 0xe0007430, 0x14257: 0xe0006bb1, - 0x14258: 0xe0008b19, - 0x14261: 0xe00045c5, - 0x14268: 0xe0007653, 0x14269: 0xe0005563, 0x1426a: 0xe0009a36, - 0x1426c: 0xe0005162, 0x1426f: 0xe0004d5b, - 0x14272: 0xe0004f7f, - 0x14277: 0xe000949a, - 0x1427a: 0xe0004204, - 0x1427d: 0xe000581b, 0x1427f: 0xe0008959, - // Block 0x50a, offset 0x14280 - 0x14280: 0xe0004a89, - 0x14292: 0xe0004208, - 0x14294: 0xe0004fa7, 0x14296: 0xe0004651, - 0x1429a: 0xe00048b6, - 0x1429c: 0xe0008650, 0x1429d: 0xe00088dd, - 0x142a3: 0xe000a1b3, - 0x142a5: 0xe0004bba, - 0x142b1: 0xe0009fc9, 0x142b3: 0xe00048f6, - 0x142b4: 0xe0006d08, - 0x142b8: 0xe000978c, - // Block 0x50b, offset 0x142c0 - 0x142c0: 0xe0007937, 0x142c2: 0xe0008bed, 0x142c3: 0xe00067e3, - 0x142c7: 0xe0004bbe, - 0x142c8: 0xe00047d2, 0x142c9: 0xe0006570, 0x142ca: 0xe0007509, - 0x142cc: 0xe000a531, 0x142ce: 0xe0009c53, - 0x142d0: 0xe00076bb, 0x142d1: 0xe00084b6, 0x142d3: 0xe000a7da, - 0x142d4: 0xe000839a, 0x142d5: 0xe0006c28, 0x142d6: 0xe000a8d3, 0x142d7: 0xe0009b2c, - 0x142d8: 0xe00050e7, 0x142db: 0xe0007dbb, - 0x142dd: 0xe00075cc, 0x142df: 0xe0007158, - 0x142e2: 0xe000a8bf, 0x142e3: 0xe0004649, - 0x142e5: 0xe00052d9, - 0x142ea: 0xe0006444, - 0x142ed: 0xe0006f34, - 0x142f1: 0xe000a23f, - 0x142f4: 0xe0007096, 0x142f6: 0xe00041a5, - 0x142fa: 0xe0009165, 0x142fb: 0xe0008ee9, - 0x142fc: 0xe0008c5d, 0x142fe: 0xe0008653, - // Block 0x50c, offset 0x14300 - 0x14301: 0xe00048b9, - 0x14306: 0xe00088e0, - 0x1430b: 0xe0008f2e, - 0x14310: 0xe0006b69, 0x14311: 0xe00084b9, - 0x14314: 0xe0008d55, 0x14315: 0xe0009e1c, 0x14316: 0xe0009f79, 0x14317: 0xe000a3d9, - 0x14318: 0xe0004de7, 0x1431b: 0xe000889e, - 0x1431e: 0xe0006b6c, - 0x14320: 0xe0007ba3, 0x14321: 0xe000a7ae, 0x14322: 0xe0007325, 0x14323: 0xe0007c0d, - 0x14326: 0xe0007433, - 0x14329: 0xe0007436, 0x1432b: 0xe0009ae7, - 0x1432c: 0xe0004d5e, 0x1432d: 0xe0004e64, 0x1432e: 0xe00089dd, - 0x14330: 0xe000a97c, 0x14331: 0xe000a56b, 0x14332: 0xe000a1b6, 0x14333: 0xe0006d0c, - 0x14335: 0xe0006eb4, - 0x14339: 0xe0009600, - 0x1433c: 0xe000a703, 0x1433f: 0xe0004b6f, - // Block 0x50d, offset 0x14340 - 0x14342: 0xe0008dc1, - 0x14344: 0xe0005b92, 0x14345: 0xe0008eec, 0x14346: 0xe0004b55, 0x14347: 0xe00049fc, - 0x1434c: 0xe00090ac, 0x1434d: 0xe000851e, - 0x14351: 0xe0004b59, 0x14353: 0xe0006dcb, - 0x14355: 0xe0009b7c, - 0x14358: 0xe0008278, 0x1435a: 0xe0009751, - 0x1435e: 0xe00078f7, - 0x14360: 0xe0007008, 0x14361: 0xe00047d5, 0x14362: 0xe000a30d, 0x14363: 0xe000616e, - 0x14364: 0xe0007ca6, 0x14365: 0xe0004862, 0x14366: 0xe000715c, 0x14367: 0xe0009ec8, - 0x14368: 0xe000a6ee, 0x1436a: 0xe0006f38, - 0x14370: 0xe0007213, 0x14372: 0xe00049ff, - 0x14379: 0xe00069b1, - 0x1437c: 0xe0008432, 0x1437e: 0xe0008366, 0x1437f: 0xe0008d58, - // Block 0x50e, offset 0x14380 - 0x14382: 0xe0009604, - 0x14384: 0xe0007329, 0x14387: 0xe00053fe, - 0x14389: 0xe00081fa, 0x1438b: 0xe0009678, - 0x1438d: 0xe0008847, 0x1438f: 0xe000983e, - 0x14392: 0xe00058b9, - 0x14396: 0xe0005b26, - 0x1439b: 0xe000827b, - 0x1439c: 0xe0009644, 0x1439e: 0xe0009dfc, 0x1439f: 0xe0007463, - 0x143a0: 0xe000a816, 0x143a1: 0xe0007439, - 0x143a4: 0xe0007657, 0x143a6: 0xe00096a3, 0x143a7: 0xe000a1b9, - 0x143aa: 0xe0008bf1, 0x143ab: 0xe0004280, - 0x143ad: 0xe000827e, 0x143ae: 0xe0008617, - 0x143b0: 0xe0007466, 0x143b1: 0xe000a842, 0x143b3: 0xe0007707, - 0x143b4: 0xe000a0fb, 0x143b6: 0xe0007579, 0x143b7: 0xe0009f4c, - 0x143b8: 0xe0008c9e, 0x143ba: 0xe000793b, - 0x143bc: 0xe000a81a, 0x143be: 0xe00051bc, - // Block 0x50f, offset 0x143c0 - 0x143c0: 0xe0006072, 0x143c1: 0xe000769f, 0x143c2: 0xe00081d9, - 0x143c4: 0xe0005728, 0x143c7: 0xe000454c, - 0x143cc: 0xe00041e1, 0x143ce: 0xe000621a, - 0x143d0: 0xe00062b4, 0x143d1: 0xe000a412, - 0x143d4: 0xe000a03b, 0x143d6: 0xe0007108, 0x143d7: 0xe0006448, - 0x143d9: 0xe0004665, 0x143da: 0xe00084d6, 0x143db: 0xe00043ec, - 0x143dc: 0xe0008172, 0x143dd: 0xe0006b6f, - 0x143e0: 0xe0007ee6, 0x143e3: 0xe0008050, - 0x143e6: 0xe0004789, - 0x143e8: 0xe0006075, 0x143eb: 0xe0008925, - 0x143ec: 0xe0005c4b, - 0x143f3: 0xe0004cc8, - 0x143f7: 0xe0007cdf, - 0x143f9: 0xe0004f83, - 0x143fe: 0xe0005e83, - // Block 0x510, offset 0x14400 - 0x14401: 0xe000a56e, 0x14403: 0xe000a7b1, - 0x14409: 0xe0009041, - 0x1440c: 0xe0007dd6, 0x1440e: 0xe000a873, 0x1440f: 0xe00050ea, - 0x14414: 0xe0006ef8, 0x14416: 0xe0009377, - 0x14418: 0xe00074a1, 0x14419: 0xe0009754, 0x1441a: 0xe0005402, - 0x1441c: 0xe00066a6, 0x1441f: 0xe0008dc4, - 0x14426: 0xe0004729, - 0x1442b: 0xe0006f94, - 0x1442c: 0xe00069b4, 0x1442f: 0xe00079f3, - 0x14430: 0xe0008435, 0x14431: 0xe0006efc, - 0x14434: 0xe0004605, 0x14437: 0xe000a484, - 0x1443d: 0xe0007c10, 0x1443f: 0xe000a415, - // Block 0x511, offset 0x14440 - 0x14440: 0xe00055e1, - 0x14449: 0xe00082e1, 0x1444a: 0xe00065cc, - 0x1444c: 0xe0007ab7, 0x1444e: 0xe0007276, - 0x14450: 0xe0007216, 0x14452: 0xe0009347, 0x14453: 0xe00078a9, - 0x14456: 0xe000934b, - 0x1445a: 0xe00092d7, - 0x1445c: 0xe00054aa, 0x1445e: 0xe000794b, - // Block 0x512, offset 0x14480 - 0x144b7: 0xe00048e2, - 0x144bf: 0xe00047d8, - // Block 0x513, offset 0x144c0 - 0x144c1: 0xe000a630, - 0x144c6: 0xe00056ca, 0x144c7: 0xe0004438, - 0x144c8: 0xe00050ed, 0x144c9: 0xe0007469, 0x144ca: 0xe0009f50, - 0x144cc: 0xe0007e15, 0x144ce: 0xe0007279, - 0x144d5: 0xe000743c, 0x144d6: 0xe00098ee, - 0x144da: 0xe000560d, - 0x144e1: 0xe0006d10, 0x144e2: 0xe000a610, - 0x144e8: 0xe000a976, 0x144ea: 0xe000a487, 0x144eb: 0xe0007c13, - 0x144ec: 0xe00088e3, - 0x144f3: 0xe0006a97, - 0x144f8: 0xe0009a0e, 0x144f9: 0xe0009f09, 0x144fa: 0xe000743f, - // Block 0x514, offset 0x14500 - 0x14502: 0xe0009712, 0x14503: 0xe0005f60, - 0x1450a: 0xe0005f4c, - 0x1450c: 0xe0006078, 0x1450d: 0xe0005d51, - 0x14513: 0xe0006135, - 0x14514: 0xe0006a20, - 0x14518: 0xe0005f64, - 0x1451d: 0xe0009d7e, 0x1451e: 0xe0008bf5, - 0x14520: 0xe00067e6, 0x14521: 0xe0008821, 0x14522: 0xe00049ae, - 0x14527: 0xe0006a73, - 0x14528: 0xe000a571, 0x14529: 0xe0009d38, 0x1452a: 0xe0009bac, 0x1452b: 0xe0004a8d, - 0x1452c: 0xe0009469, 0x1452f: 0xe00088a1, - 0x14530: 0xe000702d, 0x14532: 0xe0008656, 0x14533: 0xe0008495, - 0x14534: 0xe0004e9d, 0x14536: 0xe0009e00, 0x14537: 0xe0005f21, - 0x14538: 0xe00054e5, 0x1453a: 0xe000a6b0, 0x1453b: 0xe00069b7, - 0x1453c: 0xe0009648, 0x1453d: 0xe0008492, 0x1453f: 0xe0006171, - // Block 0x515, offset 0x14540 - 0x14540: 0xe000a00b, 0x14541: 0xe00068a0, 0x14542: 0xe0005b6e, 0x14543: 0xe000859e, - 0x14544: 0xe000a6f1, 0x14546: 0xe00065f0, 0x14547: 0xe000861a, - 0x14548: 0xe00041a8, 0x1454a: 0xe0008929, - 0x14551: 0xe0009169, 0x14553: 0xe0006a77, - 0x14559: 0xe0008f31, 0x1455a: 0xe0005b71, - 0x1455c: 0xe0006b72, 0x1455e: 0xe0006d14, - 0x14560: 0xe00064b9, 0x14561: 0xe00044a6, 0x14562: 0xe000a2dd, 0x14563: 0xe0005f24, - 0x14564: 0xe000952c, 0x14566: 0xe00067e9, - 0x1456a: 0xe00091dd, - 0x1456c: 0xe00087e6, 0x1456d: 0xe0005566, - 0x14574: 0xe0005b74, - 0x1457b: 0xe00067ec, - 0x1457c: 0xe0004ccb, 0x1457d: 0xe0006d46, - // Block 0x516, offset 0x14580 - 0x14584: 0xe00090af, 0x14585: 0xe0009943, 0x14587: 0xe0008322, - 0x14588: 0xe0009045, 0x1458a: 0xe00092db, 0x1458b: 0xe0007693, - 0x1458d: 0xe0006f78, 0x1458f: 0xe0007bd7, - 0x14590: 0xe0007535, 0x14593: 0xe000879e, - 0x14594: 0xe0006a23, 0x14596: 0xe000710c, - 0x1459b: 0xe00049d6, - // Block 0x517, offset 0x145c0 - 0x145e4: 0xe000892d, 0x145e6: 0xe0006b75, 0x145e7: 0xe00051d4, - 0x145eb: 0xe000a281, - 0x145ed: 0xe0008659, - 0x145f0: 0xe0008eef, 0x145f3: 0xe0004ec7, - 0x145f4: 0xe00067ef, 0x145f6: 0xe00042a8, 0x145f7: 0xe00050f0, - // Block 0x518, offset 0x14600 - 0x14601: 0xe00091a1, - 0x14605: 0xe0009715, - 0x1460a: 0xe000818a, - 0x1460e: 0xe0008f34, - 0x14610: 0xe000a32d, - 0x14619: 0xe0008d5b, - 0x14620: 0xe0009757, 0x14623: 0xe0009973, - 0x14628: 0xe0009841, 0x1462b: 0xe0004c38, - 0x14632: 0xe0009307, 0x14633: 0xe0008de1, - 0x1463a: 0xe00067f2, - 0x1463e: 0xe00090b2, - // Block 0x519, offset 0x14640 - 0x14642: 0xe0005165, - 0x14646: 0xe0009c15, - 0x1464b: 0xe00063c0, - 0x1464c: 0xe00091e1, 0x1464e: 0xe0009aea, 0x1464f: 0xe00041ab, - 0x14655: 0xe0008b3d, 0x14656: 0xe00094f4, 0x14657: 0xe0006849, - 0x1465b: 0xe0009cf4, - 0x1465d: 0xe00044d3, 0x1465f: 0xe0004fab, - 0x14661: 0xe0008931, 0x14663: 0xe0006eb8, - 0x14668: 0xe0004a02, 0x1466a: 0xe0004e8b, 0x1466b: 0xe00049da, - 0x1466c: 0xe0004ef4, 0x1466f: 0xe0005ab2, - 0x14671: 0xe0009a11, 0x14673: 0xe0005569, - 0x1467c: 0xe0004d9f, - // Block 0x51a, offset 0x14680 - 0x14686: 0xe0008fbd, - 0x14688: 0xe00070de, 0x14689: 0xe00058d5, 0x1468a: 0xe0007f92, - 0x1468f: 0xe0005446, - 0x14690: 0xe0009530, - 0x14694: 0xe0009b50, - 0x1469d: 0xe0004a2c, 0x1469e: 0xe00044d6, 0x1469f: 0xe00090d3, - 0x146aa: 0xe0008e39, - 0x146b0: 0xe0008281, - 0x146b4: 0xe0007fc2, 0x146b5: 0xe0008e3d, 0x146b6: 0xe0008cd1, - 0x146bd: 0xe0008053, - // Block 0x51b, offset 0x146c0 - 0x146c0: 0xe0008b41, 0x146c2: 0xe0008284, - 0x146c4: 0xe0008ca1, 0x146c7: 0xe0004530, - 0x146c8: 0xe000556c, 0x146c9: 0xe0009266, 0x146ca: 0xe000a3f7, - 0x146cc: 0xe000941b, 0x146cf: 0xe0008cd4, - 0x146d5: 0xe0009fcd, - 0x146d9: 0xe00098d6, - 0x146dc: 0xe00098f2, 0x146df: 0xe0008935, - 0x146e0: 0xe00094cc, 0x146e3: 0xe0005e87, - 0x146e4: 0xe0008e6d, - 0x146f2: 0xe0008fc1, - 0x146f4: 0xe00098da, 0x146f6: 0xe0004e53, - 0x146fb: 0xe0004c3b, - // Block 0x51c, offset 0x14700 - 0x14701: 0xe0008d5e, - 0x14705: 0xe00097a0, 0x14707: 0xe00088a4, - 0x14709: 0xe000561d, 0x1470a: 0xe0008ef2, 0x1470b: 0xe0008cd7, - 0x1470d: 0xe0007839, - 0x14710: 0xe00059fc, 0x14711: 0xe00094f8, 0x14713: 0xe00090d6, - 0x14714: 0xe0008a71, - 0x14719: 0xe0005d9d, - 0x14721: 0xe0006fbc, - 0x14729: 0xe0004a4d, 0x1472a: 0xe0005d71, 0x1472b: 0xe000750d, - 0x1472c: 0xe0004dff, - 0x14731: 0xe0009aed, 0x14733: 0xe0004e03, - // Block 0x51d, offset 0x14740 - 0x14740: 0xe0004cce, - 0x14746: 0xe00096c7, - 0x1474a: 0xe0009269, 0x1474b: 0xe00076a3, - 0x1474c: 0xe0004e67, 0x1474d: 0xe0004db7, - 0x14752: 0xe000a251, - 0x1475f: 0xe0007a77, - 0x14768: 0xe0005a70, 0x1476b: 0xe000916d, - 0x14778: 0xe00098de, 0x14779: 0xe00090d9, 0x1477a: 0xe000975a, 0x1477b: 0xe00041ae, - 0x1477c: 0xe000857e, 0x1477e: 0xe00074a5, - // Block 0x51e, offset 0x14780 - 0x14783: 0xe0004bff, - 0x14785: 0xe0005ab5, 0x14787: 0xe0008a75, - 0x14788: 0xe0008f37, 0x14789: 0xe0008824, - 0x14792: 0xe000964c, 0x14793: 0xe0005e67, - 0x14794: 0xe00066a9, 0x14795: 0xe000472d, - 0x1479b: 0xe00058bd, - 0x1479c: 0xe00099e4, 0x1479d: 0xe000a845, 0x1479e: 0xe0005ee3, 0x1479f: 0xe00095ac, - 0x147a6: 0xe000598c, 0x147a7: 0xe0006650, - 0x147a8: 0xe0004ab9, 0x147a9: 0xe00064bc, 0x147aa: 0xe0005c84, - 0x147af: 0xe0009215, - 0x147b0: 0xe00078d5, 0x147b3: 0xe0008ef5, - 0x147b8: 0xe0007219, 0x147b9: 0xe00066f5, 0x147bb: 0xe00066f9, - 0x147be: 0xe00089e1, 0x147bf: 0xe00079cf, - // Block 0x51f, offset 0x147c0 - 0x147c0: 0xe0007d3e, 0x147c2: 0xe00048fa, - 0x147c4: 0xe000a0bb, 0x147c5: 0xe000813a, 0x147c6: 0xe0005b1e, - 0x147c9: 0xe00089e5, - 0x147cd: 0xe00095b0, 0x147ce: 0xe0004c02, - 0x147d2: 0xe00068e8, - 0x147d4: 0xe0005da1, 0x147d7: 0xe0004374, - 0x147d8: 0xe000a614, - 0x147dd: 0xe00079d2, 0x147de: 0xe000a0ff, 0x147df: 0xe0004bb2, - 0x147e1: 0xe0006a26, 0x147e2: 0xe0005948, 0x147e3: 0xe0005960, - 0x147e4: 0xe0005ad9, - // Block 0x520, offset 0x14800 - 0x1481b: 0xe0007511, - 0x1481c: 0xe0004865, 0x1481f: 0xe0009f7c, - 0x14822: 0xe00057f3, 0x14823: 0xe00057eb, - 0x14826: 0xe0009d3c, - 0x14828: 0xe00065d0, - 0x1482d: 0xe0006b78, 0x1482e: 0xe00065e8, 0x1482f: 0xe00065d4, - 0x14830: 0xe0009171, 0x14831: 0xe0007f36, 0x14832: 0xe000529d, - 0x1483b: 0xe000759d, - 0x1483f: 0xe0009588, - // Block 0x521, offset 0x14840 - 0x14840: 0xe00042ac, 0x14842: 0xe0008011, 0x14843: 0xe0007ce2, - 0x14844: 0xe000a8e3, 0x14845: 0xe0007515, - 0x1484d: 0xe0005704, 0x1484e: 0xe0007ba7, - 0x14851: 0xe0004f87, 0x14853: 0xe00075f6, - 0x14854: 0xe000637c, 0x14855: 0xe0007ce5, - 0x14862: 0xe000975d, - 0x14864: 0xe00084bc, 0x14865: 0xe000a3dd, 0x14866: 0xe00041b1, - 0x14868: 0xe0009c2a, 0x1486a: 0xe0008939, 0x1486b: 0xe0006300, - 0x1486c: 0xe0007e61, 0x1486d: 0xe00091e5, - 0x14870: 0xe0007369, 0x14872: 0xe000459c, - 0x14874: 0xe000a706, 0x14877: 0xe000621d, - 0x14878: 0xe000666c, 0x14879: 0xe000893d, 0x1487a: 0xe000522c, - 0x1487d: 0xe0009844, - // Block 0x522, offset 0x14880 - 0x14880: 0xe0009c92, 0x14881: 0xe0007160, 0x14882: 0xe0004ae1, 0x14883: 0xe000556f, - 0x14885: 0xe000a796, 0x14886: 0xe00079f7, - 0x14888: 0xe000a3c1, 0x1488b: 0xe0009ea7, - 0x1488c: 0xe00082e4, 0x1488d: 0xe0007099, 0x1488f: 0xe0009ca7, - 0x14890: 0xe00098e2, 0x14891: 0xe0004cd1, - 0x14894: 0xe0005572, 0x14895: 0xe0004731, 0x14896: 0xe000895d, 0x14897: 0xe00056cd, - 0x14899: 0xe00088a7, 0x1489a: 0xe0009c76, - 0x1489d: 0xe0006dce, 0x1489e: 0xe0005a30, 0x1489f: 0xe0007110, - 0x148a0: 0xe0008d61, 0x148a1: 0xe0008f8d, 0x148a2: 0xe0006765, 0x148a3: 0xe0005990, - 0x148ae: 0xe00096a6, - 0x148b1: 0xe0008ef8, 0x148b2: 0xe0009175, - 0x148b4: 0xe0009b54, 0x148b5: 0xe0004eca, 0x148b6: 0xe00081fd, - 0x148b8: 0xe000856e, - 0x148bc: 0xe0009fe5, 0x148be: 0xe000828a, - // Block 0x523, offset 0x148c0 - 0x148c1: 0xe00056f4, 0x148c2: 0xe000721c, - 0x148c7: 0xe0008014, - 0x148c9: 0xe0008c61, 0x148ca: 0xe0008287, 0x148cb: 0xe00080aa, - 0x148cd: 0xe0009dd0, 0x148ce: 0xe0004a05, 0x148cf: 0xe00076bf, - 0x148d0: 0xe000a00e, 0x148d1: 0xe000a690, 0x148d2: 0xe0008f3a, 0x148d3: 0xe0005575, - 0x148d4: 0xe00053ae, 0x148d5: 0xe00081dc, - 0x148d8: 0xe0004d61, 0x148d9: 0xe0007ee9, 0x148db: 0xe0005c5a, - 0x148dc: 0xe000712c, 0x148dd: 0xe000544a, 0x148de: 0xe00096a9, - 0x148e0: 0xe000813e, 0x148e1: 0xe000709c, 0x148e3: 0xe0004609, - 0x148e8: 0xe0007ce8, 0x148e9: 0xe0008941, - 0x148ec: 0xe0007118, 0x148ed: 0xe0008d64, 0x148ee: 0xe000926c, 0x148ef: 0xe00056f8, - 0x148f2: 0xe00090b5, - 0x148f5: 0xe0008f91, 0x148f6: 0xe0007f1c, 0x148f7: 0xe0009534, - 0x148f8: 0xe0006ebc, 0x148fa: 0xe000828d, - 0x148fc: 0xe0005bb9, 0x148fd: 0xe00044d9, 0x148ff: 0xe0009f73, - // Block 0x524, offset 0x14900 - 0x14900: 0xe0007eec, 0x14901: 0xe0005f27, 0x14902: 0xe000a1bc, 0x14903: 0xe000721f, - 0x14904: 0xe000a5e8, 0x14905: 0xe0008a79, 0x14907: 0xe0008498, - 0x14908: 0xe0005e1b, 0x1490a: 0xe00065d8, - 0x1490c: 0xe000592e, 0x1490f: 0xe0005769, - 0x14910: 0xe0005d54, 0x14911: 0xe00083e2, - 0x14915: 0xe0007d76, - 0x14919: 0xe0005ee7, - 0x14920: 0xe0006a9b, 0x14922: 0xe000a3c5, 0x14923: 0xe00051aa, - 0x14926: 0xe000644c, - 0x14928: 0xe00097b4, 0x1492a: 0xe0006b7b, - 0x1492f: 0xe0004334, - 0x14930: 0xe0009c18, 0x14931: 0xe0004cd4, 0x14933: 0xe0006a29, - 0x14935: 0xe000709f, - 0x14938: 0xe00088aa, - 0x1493d: 0xe0004ef7, - // Block 0x525, offset 0x14940 - 0x14941: 0xe000807e, 0x14943: 0xe000a13b, - 0x14944: 0xe0004f4f, 0x14945: 0xe00091f5, - 0x1494a: 0xe0004c05, - 0x1495c: 0xe00048bc, 0x1495d: 0xe000a053, 0x1495e: 0xe0005853, - 0x14961: 0xe0004dbb, 0x14962: 0xe0007bdb, - 0x14968: 0xe00067f5, 0x1496a: 0xe000949d, 0x1496b: 0xe0006a2c, - 0x1496d: 0xe0004a41, 0x1496f: 0xe000542e, - 0x14974: 0xe0009a8a, 0x14975: 0xe0008017, - 0x1497d: 0xe0005578, - // Block 0x526, offset 0x14980 - 0x14982: 0xe0007623, - 0x14992: 0xe0009847, - 0x14995: 0xe000a21e, - 0x14999: 0xe00069ba, - 0x1499e: 0xe000839e, - 0x149a2: 0xe000794f, 0x149a3: 0xe00087ea, - 0x149a7: 0xe000572c, - 0x149ad: 0xe0008bf9, - 0x149b0: 0xe0005da5, 0x149b1: 0xe0009d21, 0x149b2: 0xe0005372, - 0x149b4: 0xe00079a3, - 0x149bd: 0xe0008a7d, - // Block 0x527, offset 0x149c0 - 0x149c8: 0xe0005964, 0x149c9: 0xe0008290, 0x149ca: 0xe0008bfd, 0x149cb: 0xe000984a, - 0x149cc: 0xe0008696, 0x149cd: 0xe00064bf, 0x149ce: 0xe0008efb, - 0x149d2: 0xe0008efe, - 0x149d6: 0xe0009bb8, 0x149d7: 0xe000a7b4, - 0x149e2: 0xe0009718, 0x149e3: 0xe0004378, - 0x149e4: 0xe00048bf, 0x149e5: 0xe00070e1, - 0x149e9: 0xe0006020, 0x149ea: 0xe000579b, - 0x149ec: 0xe0007222, - 0x149f2: 0xe0008c65, - 0x149f4: 0xe00055ab, 0x149f5: 0xe000a754, 0x149f6: 0xe0005f42, 0x149f7: 0xe000a4d1, - 0x149f8: 0xe0006c00, 0x149f9: 0xe0005b95, - // Block 0x528, offset 0x14a00 - 0x14a03: 0xe000798f, - 0x14a07: 0xe000732d, - 0x14a09: 0xe0009976, 0x14a0b: 0xe000971b, - 0x14a0d: 0xe0008ca4, - 0x14a10: 0xe000a4c0, 0x14a12: 0xe000700c, - 0x14a1c: 0xe000984d, 0x14a1e: 0xe0007d42, - 0x14a22: 0xe000a1dd, - 0x14a2a: 0xe0005bd7, 0x14a2b: 0xe0008438, - 0x14a2c: 0xe00087a2, 0x14a2e: 0xe000971e, 0x14a2f: 0xe000a3fa, - 0x14a31: 0xe00063c4, 0x14a32: 0xe00052ad, - 0x14a34: 0xe0005a85, 0x14a35: 0xe00044ae, - // Block 0x529, offset 0x14a40 - 0x14a40: 0xe00078ad, 0x14a41: 0xe000a8c3, 0x14a43: 0xe000746c, - 0x14a45: 0xe0007b1b, 0x14a47: 0xe0009451, - 0x14a49: 0xe0008293, 0x14a4b: 0xe0006e2c, - 0x14a4c: 0xe0005d27, 0x14a4d: 0xe0008fed, 0x14a4e: 0xe000781b, 0x14a4f: 0xe00058c1, - 0x14a50: 0xe0005d2a, 0x14a51: 0xe0005193, - 0x14a57: 0xe000718c, - 0x14a58: 0xe0008c01, - 0x14a5c: 0xe00067f8, 0x14a5d: 0xe0009a72, - 0x14a63: 0xe0008d67, - 0x14a64: 0xe0006c6c, 0x14a66: 0xe0004d64, 0x14a67: 0xe0009538, - 0x14a6a: 0xe000801a, - 0x14a6d: 0xe00049de, - 0x14a75: 0xe0009454, - 0x14a7f: 0xe0004faf, - // Block 0x52a, offset 0x14a80 - 0x14a87: 0xe000684c, - 0x14a8d: 0xe00056fc, - 0x14a90: 0xe0004584, 0x14a91: 0xe0009d40, 0x14a92: 0xe0006c7c, - 0x14a94: 0xe0009760, 0x14a97: 0xe0008326, - 0x14a9c: 0xe000a72b, 0x14a9e: 0xe0004f17, 0x14a9f: 0xe0008dc7, - 0x14ab4: 0xe0005a34, 0x14ab5: 0xe0006670, 0x14ab7: 0xe00048c2, - 0x14ab8: 0xe00063e0, 0x14aba: 0xe0007d0a, - 0x14abf: 0xe00089e9, - // Block 0x52b, offset 0x14ac0 - 0x14ac0: 0xe0004390, 0x14ac1: 0xe00091a5, - 0x14ac5: 0xe00044dc, - 0x14ac9: 0xe000a2e1, 0x14acb: 0xe0009ecb, - 0x14ace: 0xe0006d7c, 0x14acf: 0xe0006df5, - 0x14ad0: 0xe0006e48, 0x14ad2: 0xe0008f3d, - 0x14ad7: 0xe0004669, - 0x14adb: 0xe0007a7b, - 0x14ade: 0xe000818e, - 0x14ae2: 0xe00063c8, - 0x14ae4: 0xe0004cd7, 0x14ae5: 0xe000736d, 0x14ae6: 0xe0008c05, - 0x14af7: 0xe000a545, - 0x14af8: 0xe0004c3e, - 0x14afc: 0xe0006678, 0x14afe: 0xe00060a2, - // Block 0x52c, offset 0x14b00 - 0x14b00: 0xe000836a, 0x14b03: 0xe00097e0, - 0x14b05: 0xe0005671, - 0x14b0b: 0xe00085aa, - 0x14b11: 0xe0006ec0, 0x14b13: 0xe00089ed, - 0x14b15: 0xe00095d0, 0x14b16: 0xe0007225, - 0x14b18: 0xe0006024, 0x14b19: 0xe0004a2f, 0x14b1a: 0xe0008dca, 0x14b1b: 0xe0006f98, - 0x14b1c: 0xe000a0e7, - 0x14b33: 0xe0007c16, - 0x14b36: 0xe0004cda, 0x14b37: 0xe00070a2, - 0x14b39: 0xe0007228, - // Block 0x52d, offset 0x14b40 - 0x14b46: 0xe0008332, - 0x14b4c: 0xe0008c09, 0x14b4f: 0xe000a35d, - 0x14b51: 0xe0008a81, 0x14b52: 0xe0006769, - 0x14b57: 0xe000a311, - 0x14b5f: 0xe0009a8e, - 0x14b64: 0xe0006dd1, 0x14b65: 0xe0008c69, - 0x14b6a: 0xe0009eaa, - 0x14b72: 0xe0006674, - 0x14b78: 0xe00044df, 0x14b79: 0xe000941f, 0x14b7a: 0xe0008176, - 0x14b7c: 0xe00043f0, 0x14b7d: 0xe0008dcd, - // Block 0x52e, offset 0x14b80 - 0x14b84: 0xe0005afe, 0x14b86: 0xe0009423, - 0x14b8f: 0xe00075f9, - 0x14b90: 0xe0009850, - 0x14b95: 0xe0004946, - 0x14b98: 0xe0009853, 0x14b99: 0xe0009a14, 0x14b9a: 0xe000884b, - 0x14b9e: 0xe0007331, 0x14b9f: 0xe0005406, - 0x14ba0: 0xe0008c0d, 0x14ba1: 0xe00050f3, 0x14ba2: 0xe00089f1, 0x14ba3: 0xe00095d4, - 0x14ba4: 0xe00050f6, 0x14ba6: 0xe0004fe7, 0x14ba7: 0xe0004abd, - 0x14ba8: 0xe0006129, 0x14baa: 0xe0008a85, 0x14bab: 0xe0006e30, - 0x14bac: 0xe00056ad, 0x14bae: 0xe0004868, 0x14baf: 0xe0009297, - // Block 0x52f, offset 0x14bc0 - 0x14bc8: 0xe0007bab, 0x14bc9: 0xe000746f, 0x14bca: 0xe0005994, 0x14bcb: 0xe0004a08, - 0x14bcd: 0xe000557b, - 0x14bd4: 0xe0007627, 0x14bd7: 0xe0008cda, - 0x14bdb: 0xe0005376, - 0x14bdc: 0xe000a02c, 0x14bdd: 0xe0008056, - 0x14be4: 0xe0006c94, - 0x14beb: 0xe0009763, - 0x14bec: 0xe0009766, 0x14bee: 0xe0008296, - 0x14bf0: 0xe000a618, - 0x14bf5: 0xe0004534, - 0x14bfc: 0xe0009a76, 0x14bfe: 0xe0008e41, - // Block 0x530, offset 0x14c00 - 0x14c0a: 0xe0006480, - 0x14c0c: 0xe000466d, - 0x14c14: 0xe0007f96, 0x14c16: 0xe000717d, 0x14c17: 0xe000885b, - 0x14c1a: 0xe0009856, 0x14c1b: 0xe0006318, - 0x14c1f: 0xe0006d34, - 0x14c21: 0xe000865c, 0x14c23: 0xe000a3c9, - 0x14c24: 0xe000a6b4, 0x14c27: 0xe0004473, - 0x14c2c: 0xe000a48a, 0x14c2d: 0xe0009179, - 0x14c30: 0xe0008572, - // Block 0x531, offset 0x14c40 - 0x14c43: 0xe0008de5, - 0x14c47: 0xe0006f00, - 0x14c48: 0xe00059a8, 0x14c4a: 0xe0007ceb, 0x14c4b: 0xe0005e8b, - 0x14c4c: 0xe0005e23, - 0x14c51: 0xe0008945, - 0x14c56: 0xe0007cee, 0x14c57: 0xe00044aa, - 0x14c58: 0xe00087ee, - 0x14c5c: 0xe00054ae, 0x14c5d: 0xe0005e8f, 0x14c5e: 0xe0007f9a, 0x14c5f: 0xe0006c2c, - 0x14c61: 0xe0004735, 0x14c62: 0xe0009f30, - 0x14c64: 0xe0005c0c, 0x14c66: 0xe00097ec, - 0x14c68: 0xe000937b, - 0x14c76: 0xe0009219, - 0x14c7b: 0xe0005da9, - // Block 0x532, offset 0x14c80 - 0x14c83: 0xe00052cc, - 0x14c84: 0xe000a723, - 0x14c8f: 0xe0008fc5, - 0x14c90: 0xe0005bda, 0x14c93: 0xe00054fd, - 0x14c94: 0xe000758d, - 0x14c98: 0xe0008e45, 0x14c99: 0xe0005750, - 0x14ca5: 0xe0006ec4, - 0x14caa: 0xe0005adc, 0x14cab: 0xe00089f5, - 0x14cb5: 0xe00095b4, 0x14cb6: 0xe000a61c, - 0x14cb8: 0xe0009b30, 0x14cba: 0xe00054b2, - // Block 0x533, offset 0x14cc0 - 0x14cc2: 0xe000a7f6, - 0x14cc4: 0xe0008f01, - 0x14cca: 0xe000a5ac, - 0x14ccc: 0xe0006a9f, - 0x14cd1: 0xe0004338, 0x14cd2: 0xe000433c, - 0x14cd5: 0xe00091f9, - 0x14cdb: 0xe0004b2d, - 0x14cde: 0xe0005833, - 0x14ce0: 0xe0006bd4, 0x14ce2: 0xe0005931, 0x14ce3: 0xe0009f33, - 0x14cea: 0xe0005adf, - 0x14cf0: 0xe000784d, 0x14cf1: 0xe000937f, 0x14cf2: 0xe00078d9, - 0x14cf5: 0xe0004ac1, 0x14cf7: 0xe0006fc0, - 0x14cfc: 0xe000577e, 0x14cfd: 0xe00092df, 0x14cfe: 0xe00057df, 0x14cff: 0xe000929b, - // Block 0x534, offset 0x14d00 - 0x14d37: 0xe00087a6, - // Block 0x535, offset 0x14d40 - 0x14d40: 0xe00061bd, 0x14d43: 0xe0006f7c, - 0x14d48: 0xe000a0a7, 0x14d49: 0xe0009e50, 0x14d4a: 0xe0006c30, 0x14d4b: 0xe0004476, - 0x14d4e: 0xe0004bc2, 0x14d4f: 0xe000832a, - 0x14d51: 0xe000a083, 0x14d52: 0xe000a087, 0x14d53: 0xe0004284, - 0x14d54: 0xe0006280, - 0x14d58: 0xe0004394, - 0x14d5f: 0xe0006a2f, - 0x14d63: 0xe000420c, - 0x14d64: 0xe000a117, 0x14d65: 0xe000653c, - 0x14d68: 0xe0004ecd, 0x14d69: 0xe00062a0, 0x14d6b: 0xe000494a, - 0x14d6c: 0xe000586b, 0x14d6d: 0xe0005904, - 0x14d71: 0xe0007acb, - 0x14d76: 0xe0009427, - 0x14d79: 0xe0007993, 0x14d7b: 0xe0007aef, - 0x14d7c: 0xe00076a7, 0x14d7d: 0xe000a4fd, 0x14d7e: 0xe0007a0b, - // Block 0x536, offset 0x14d80 - 0x14d83: 0xe00045d5, - 0x14d87: 0xe00076e7, - 0x14d88: 0xe0008200, 0x14d8a: 0xe000a634, 0x14d8b: 0xe0004655, - 0x14d8c: 0xe00057e3, 0x14d8d: 0xe00055ae, - 0x14d93: 0xe000448b, - 0x14d94: 0xe000a11b, 0x14d95: 0xe0004e57, 0x14d96: 0xe0009cc6, - 0x14d9a: 0xe0004efa, - 0x14d9c: 0xe0004a91, 0x14d9e: 0xe000a103, - 0x14da0: 0xe0004e8e, 0x14da1: 0xe000953c, 0x14da2: 0xe00065a4, - 0x14da5: 0xe00053ba, - // Block 0x537, offset 0x14dc0 - 0x14ddc: 0xe00067fb, - 0x14de1: 0xe0009540, - 0x14de4: 0xe0009a17, - 0x14de8: 0xe00077dc, 0x14dea: 0xe0009d44, - 0x14dee: 0xe0007e19, 0x14def: 0xe00090dc, - 0x14df2: 0xe0006450, - 0x14dfb: 0xe0008d6a, - 0x14dff: 0xe00075cf, - // Block 0x538, offset 0x14e00 - 0x14e00: 0xe0009acc, 0x14e02: 0xe0009f76, - 0x14e04: 0xe00067fe, - 0x14e0b: 0xe0005c0f, - 0x14e0c: 0xe0005f50, 0x14e0d: 0xe00043f4, - 0x14e10: 0xe000a08b, - 0x14e18: 0xe000a3e1, 0x14e1b: 0xe0009e53, - 0x14e1c: 0xe000a11f, 0x14e1d: 0xe0006f80, 0x14e1e: 0xe00073e2, 0x14e1f: 0xe00094d0, - 0x14e21: 0xe00056e5, 0x14e22: 0xe0008142, 0x14e23: 0xe000917d, - 0x14e24: 0xe0008ca7, - 0x14e2a: 0xe00064c2, - 0x14e2c: 0xe0009895, - 0x14e30: 0xe00083ba, 0x14e32: 0xe000727c, 0x14e33: 0xe0009181, - 0x14e34: 0xe0006a32, 0x14e35: 0xe0005cdc, 0x14e36: 0xe000557e, 0x14e37: 0xe000a0eb, - 0x14e38: 0xe0005c68, - 0x14e3c: 0xe00088e6, 0x14e3d: 0xe00078b1, - // Block 0x539, offset 0x14e40 - 0x14e44: 0xe0008cdd, 0x14e45: 0xe000801d, 0x14e46: 0xe0005ca0, - 0x14e4a: 0xe00054e8, 0x14e4b: 0xe000722b, - 0x14e4d: 0xe000a694, 0x14e4e: 0xe00047db, - 0x14e51: 0xe0005168, - 0x14e54: 0xe00045c9, 0x14e55: 0xe00080ae, 0x14e57: 0xe0007e9b, - 0x14e58: 0xe0007772, 0x14e59: 0xe0004f3f, 0x14e5b: 0xe0008caa, - 0x14e5c: 0xe00087aa, - 0x14e63: 0xe0005d75, - 0x14e64: 0xe0009c98, 0x14e67: 0xe000722e, - 0x14e68: 0xe0007231, 0x14e69: 0xe0007cf1, 0x14e6a: 0xe000a265, - 0x14e70: 0xe00073ba, 0x14e71: 0xe000836e, 0x14e73: 0xe000a866, - 0x14e74: 0xe0005b5a, 0x14e76: 0xe00084bf, 0x14e77: 0xe0005a88, - 0x14e78: 0xe0005a8b, 0x14e79: 0xe0009898, 0x14e7b: 0xe00094d4, - 0x14e7c: 0xe0008fc9, - // Block 0x53a, offset 0x14e80 - 0x14e80: 0xe000869a, 0x14e81: 0xe000767b, - 0x14e84: 0xe00080e2, 0x14e85: 0xe00075d2, 0x14e86: 0xe000921d, 0x14e87: 0xe000486b, - 0x14e89: 0xe00099e7, 0x14e8b: 0xe0008f95, - 0x14e8c: 0xe000861d, 0x14e8d: 0xe0007d7a, 0x14e8e: 0xe00088ad, - 0x14e95: 0xe0008d6d, 0x14e96: 0xe0007234, - 0x14e99: 0xe00075a1, 0x14e9a: 0xe0004ac5, 0x14e9b: 0xe0009859, - 0x14e9c: 0xe0008706, 0x14e9d: 0xe0007d9e, 0x14e9e: 0xe00047ff, - 0x14ea2: 0xe0005d2d, 0x14ea3: 0xe00051c8, - 0x14ea8: 0xe0008020, 0x14ea9: 0xe0008023, 0x14eaa: 0xe0006f3c, - 0x14eaf: 0xe00061c1, - 0x14eb0: 0xe00068a4, 0x14eb2: 0xe00080b2, - 0x14eb6: 0xe0005a38, 0x14eb7: 0xe0005b77, - 0x14eb9: 0xe0006304, 0x14eba: 0xe0006100, 0x14ebb: 0xe00089f9, - // Block 0x53b, offset 0x14ec0 - 0x14ec0: 0xe0007237, - 0x14ec4: 0xe00070e4, 0x14ec5: 0xe0006c98, 0x14ec6: 0xe0008c11, 0x14ec7: 0xe0009185, - 0x14ec8: 0xe0009d8a, 0x14ec9: 0xe0005f45, - 0x14ecc: 0xe0008f40, 0x14ecd: 0xe0004a51, 0x14ece: 0xe0006c9c, 0x14ecf: 0xe0006a35, - 0x14ed1: 0xe0008aed, 0x14ed3: 0xe0007c19, - 0x14ed4: 0xe0008f43, 0x14ed6: 0xe0005dc1, - 0x14ed9: 0xe0007baf, - 0x14edc: 0xe0006d18, 0x14ede: 0xe000a011, - 0x14ee3: 0xe00080ca, - 0x14ee6: 0xe0006aa3, 0x14ee7: 0xe0006174, - 0x14eea: 0xe00083d6, - 0x14ef0: 0xe0006c04, 0x14ef2: 0xe0005ab8, - 0x14ef8: 0xe0009d8d, 0x14ef9: 0xe00065a8, - 0x14efd: 0xe0008cad, - // Block 0x53c, offset 0x14f00 - 0x14f02: 0xe000594c, - 0x14f04: 0xe0007775, 0x14f06: 0xe00096ca, - 0x14f08: 0xe0005a3c, 0x14f09: 0xe00077ae, - 0x14f0c: 0xe00066b8, - 0x14f11: 0xe000967c, - 0x14f16: 0xe0008c15, - 0x14f1a: 0xe0008c6d, 0x14f1b: 0xe0008a89, - 0x14f1c: 0xe0008c19, 0x14f1d: 0xe000958c, 0x14f1e: 0xe00069bd, - 0x14f20: 0xe00048c5, 0x14f21: 0xe0006220, 0x14f22: 0xe0005fc4, - 0x14f26: 0xe0008a8d, - 0x14f28: 0xe0007b43, 0x14f29: 0xe000a285, - 0x14f2d: 0xe0008522, - 0x14f33: 0xe0004fb3, - 0x14f34: 0xe000a574, 0x14f35: 0xe00052ee, 0x14f37: 0xe0008526, - 0x14f3a: 0xe0005eaf, - 0x14f3c: 0xe00053be, - // Block 0x53d, offset 0x14f40 - 0x14f40: 0xe00055b1, 0x14f41: 0xe0009f7f, - 0x14f44: 0xe0009ece, 0x14f45: 0xe0007753, - 0x14f4b: 0xe000a3fd, - 0x14f4d: 0xe000767f, 0x14f4f: 0xe00049b2, - 0x14f58: 0xe0009769, - 0x14f60: 0xe0004d8b, 0x14f63: 0xe00082e7, - 0x14f66: 0xe000989b, - 0x14f68: 0xe00042d8, 0x14f6b: 0xe0004d8f, - 0x14f6c: 0xe0004550, 0x14f6d: 0xe0009dd4, - 0x14f71: 0xe00055b4, - 0x14f74: 0xe0006a38, - 0x14f78: 0xe0009fd1, 0x14f79: 0xe0004a55, - // Block 0x53e, offset 0x14f80 - 0x14f81: 0xe000443c, 0x14f83: 0xe00053c2, - 0x14f86: 0xe0009544, - 0x14f8b: 0xe00081df, - 0x14f8d: 0xe0006918, - 0x14f90: 0xe0004398, 0x14f93: 0xe000a08f, - 0x14f99: 0xe0008203, - 0x14f9c: 0xe0005581, 0x14f9d: 0xe0004d67, 0x14f9e: 0xe0007d46, - 0x14fa0: 0xe0009fd5, 0x14fa1: 0xe0008206, - 0x14fad: 0xe0004d6a, 0x14fae: 0xe0004d6d, - 0x14fb1: 0xe0006f9c, 0x14fb2: 0xe0008ce0, 0x14fb3: 0xe00083be, - 0x14fb5: 0xe00080ce, 0x14fb6: 0xe00070a5, - 0x14fba: 0xe0007bdf, 0x14fbb: 0xe00080b6, - 0x14fbf: 0xe000a222, - // Block 0x53f, offset 0x14fc0 - 0x14fc0: 0xe000a48d, 0x14fc1: 0xe000a325, 0x14fc2: 0xe0008c1d, 0x14fc3: 0xe0004739, - 0x14fc5: 0xe000a177, 0x14fc6: 0xe0007335, - 0x14fc8: 0xe000723a, 0x14fca: 0xe0008082, - 0x14fcc: 0xe0007164, 0x14fcd: 0xe0004efd, 0x14fce: 0xe000516b, 0x14fcf: 0xe000a18b, - 0x14fd0: 0xe0007c1c, 0x14fd1: 0xe0007e1d, 0x14fd2: 0xe0006380, 0x14fd3: 0xe0005611, - 0x14fd6: 0xe00063a4, 0x14fd7: 0xe0009cf7, - 0x14fd8: 0xe0005a40, - 0x14fde: 0xe00076c3, - 0x14fe1: 0xe000a98c, 0x14fe3: 0xe0007539, - 0x14fe6: 0xe000a1e0, - 0x14feb: 0xe000684f, - 0x14fed: 0xe00056d0, 0x14fee: 0xe000a709, - 0x14ff0: 0xe000a361, - 0x14ff7: 0xe000770b, - 0x14ff8: 0xe000473d, 0x14ff9: 0xe0009c95, 0x14ffb: 0xe0006a7b, - 0x14fff: 0xe000865f, - // Block 0x540, offset 0x15000 - 0x15002: 0xe0005b98, - 0x15006: 0xe0004a0b, 0x15007: 0xe0009952, - 0x15008: 0xe000477d, 0x1500b: 0xe0007472, - 0x1500c: 0xe0008cb0, 0x1500d: 0xe00077cc, 0x1500e: 0xe000762b, - 0x15012: 0xe0007da2, 0x15013: 0xe0008a91, - 0x15014: 0xe0007683, - 0x15018: 0xe0008146, 0x15019: 0xe0006d38, 0x1501a: 0xe00089fd, - 0x1501e: 0xe0005c4e, - 0x15025: 0xe000a490, 0x15026: 0xe000976c, 0x15027: 0xe000486e, - 0x1502b: 0xe0008a01, - 0x1502f: 0xe000a2e5, - 0x15030: 0xe0006aa7, 0x15031: 0xe0005ae2, 0x15033: 0xe0006fc4, - 0x15034: 0xe0004ac9, - // Block 0x541, offset 0x15040 - 0x15068: 0xe0009f54, - 0x1506d: 0xe0008b1d, 0x1506f: 0xe0006c80, - 0x15071: 0xe0009c1b, 0x15072: 0xe00059d4, - 0x15076: 0xe0004d70, - 0x1507a: 0xe00078dd, - 0x1507c: 0xe000727f, 0x1507f: 0xe0006574, - // Block 0x542, offset 0x15080 - 0x15082: 0xe0005bdd, - 0x15084: 0xe0009f0f, 0x15087: 0xe0009f0c, - 0x15089: 0xe0005be0, 0x1508b: 0xe0007555, - 0x1509b: 0xe00069c0, - 0x1509c: 0xe0006518, 0x1509f: 0xe00074a9, - 0x150a1: 0xe0007130, 0x150a2: 0xe00050f9, - 0x150a6: 0xe0008a95, 0x150a7: 0xe0007134, - 0x150aa: 0xe00085ae, 0x150ab: 0xe000790c, - 0x150ad: 0xe0009a2e, 0x150ae: 0xe00083c2, 0x150af: 0xe0006384, - 0x150b1: 0xe0007138, - 0x150b4: 0xe000849b, - 0x150bb: 0xe00095d8, - 0x150bc: 0xe0006b7e, 0x150bd: 0xe0009ead, 0x150be: 0xe00074ad, - // Block 0x543, offset 0x150c0 - 0x150c3: 0xe0004c08, - 0x150c9: 0xe000a226, 0x150ca: 0xe00078b5, - 0x150cc: 0xe000849e, - 0x150d0: 0xe00092e3, 0x150d2: 0xe00052b7, 0x150d3: 0xe00075d5, - 0x150d4: 0xe0009ed1, 0x150d5: 0xe0008fcd, - 0x150d8: 0xe00079d5, 0x150da: 0xe000a76f, - 0x150de: 0xe0008a05, - 0x150e0: 0xe0006654, - 0x150e6: 0xe00087f2, 0x150e7: 0xe0008209, - 0x150e8: 0xe0004a95, 0x150ea: 0xe00051d8, - 0x150ec: 0xe000a4c3, 0x150ee: 0xe00095dc, - 0x150f0: 0xe0008a99, 0x150f1: 0xe000a7b7, 0x150f3: 0xe00054b6, - 0x150f9: 0xe00054ba, - 0x150fc: 0xe000a979, 0x150fd: 0xe0004e91, - // Block 0x544, offset 0x15100 - 0x15102: 0xe0007d4a, - 0x15105: 0xe0005e6b, - 0x15108: 0xe0007282, 0x15109: 0xe0004f8b, 0x1510b: 0xe0004e6a, - 0x1510c: 0xe00092e7, 0x1510d: 0xe0006ec8, - 0x15110: 0xe0008456, 0x15111: 0xe00050fc, 0x15112: 0xe0007eef, - 0x15114: 0xe0007d7e, 0x15115: 0xe00055b7, 0x15117: 0xe000a22a, - 0x1511c: 0xe0007b1f, 0x1511e: 0xe0009383, - // Block 0x545, offset 0x15140 - 0x15156: 0xe000723d, 0x15157: 0xe0004f00, - 0x15158: 0xe0004ba2, 0x15159: 0xe000a22e, - 0x1515d: 0xe0009fad, - 0x15163: 0xe000770f, - 0x15165: 0xe00066fd, - 0x15168: 0xe000a3cd, - 0x1516c: 0xe0005dec, 0x1516d: 0xe00078fa, 0x1516e: 0xe0009f58, - 0x15170: 0xe0008961, 0x15171: 0xe0009acf, 0x15173: 0xe00099ea, - 0x15174: 0xe0007339, - 0x15179: 0xe0008576, - // Block 0x546, offset 0x15180 - 0x15181: 0xe0006308, - 0x15184: 0xe0009c2d, - 0x15188: 0xe0004d73, 0x15189: 0xe000478d, - 0x1518f: 0xe0004509, - 0x15190: 0xe0008f04, 0x15191: 0xe0005280, 0x15192: 0xe0004cdd, - 0x15195: 0xe00041b4, - 0x15198: 0xe0009c30, 0x15199: 0xe0006801, 0x1519b: 0xe0006bb4, - 0x1519c: 0xe0009fd9, 0x1519d: 0xe0009ad2, 0x1519e: 0xe0009af0, 0x1519f: 0xe0006b81, - 0x151a2: 0xe00065f4, - 0x151a8: 0xe0007355, 0x151aa: 0xe000753d, - 0x151ad: 0xe000a1bf, 0x151ae: 0xe000631c, - 0x151b1: 0xe000579f, - 0x151b8: 0xe0009a92, 0x151bb: 0xe000a0ab, - 0x151bd: 0xe000a315, 0x151bf: 0xe0008f99, - // Block 0x547, offset 0x151c0 - 0x151c1: 0xe0006abf, 0x151c2: 0xe0007014, 0x151c3: 0xe00077b1, - 0x151c4: 0xe0005b22, 0x151c5: 0xe000989e, - 0x151c8: 0xe0006658, 0x151cb: 0xe000587e, - 0x151cd: 0xe0004a32, 0x151ce: 0xe00050ff, 0x151cf: 0xe0005102, - 0x151d1: 0xe0006a3b, - 0x151d6: 0xe0006186, - 0x151d8: 0xe00097f0, 0x151d9: 0xe0009dd8, 0x151db: 0xe0006a3e, - 0x151eb: 0xe0004538, - 0x151ed: 0xe0009005, - 0x151f0: 0xe0005730, - 0x151f5: 0xe000817a, 0x151f6: 0xe000985c, 0x151f7: 0xe00070a8, - 0x151f8: 0xe0006f04, - 0x151fe: 0xe0005781, - // Block 0x548, offset 0x15200 - 0x15200: 0xe0005f54, 0x15201: 0xe0007cf4, 0x15202: 0xe0009387, 0x15203: 0xe0009f12, - 0x15204: 0xe00097f4, 0x15205: 0xe0004ce0, - 0x1520a: 0xe000a586, - 0x1520c: 0xe00072c9, 0x1520d: 0xe000a757, 0x1520e: 0xe0005dad, 0x1520f: 0xe00086de, - 0x15212: 0xe0009b90, - 0x15215: 0xe0004c0b, 0x15217: 0xe000a269, - 0x15218: 0xe0005784, 0x1521a: 0xe0004741, 0x1521b: 0xe00079fb, - 0x1521f: 0xe0009979, - 0x15222: 0xe0005907, - 0x15224: 0xe00078e1, 0x15225: 0xe0005105, - 0x15229: 0xe000a5ec, 0x1522a: 0xe000590a, - // Block 0x549, offset 0x15240 - 0x15268: 0xe0004962, 0x1526a: 0xe000820c, - 0x15270: 0xe0009cb3, - 0x15278: 0xe000a1c2, 0x15279: 0xe0004c41, - 0x1527c: 0xe00045d9, 0x1527f: 0xe00065f8, - // Block 0x54a, offset 0x15280 - 0x15280: 0xe0006a41, - 0x15286: 0xe0006320, - 0x1528f: 0xe0005c24, - 0x15291: 0xe00097a4, 0x15293: 0xe0007240, - 0x15294: 0xe00096ac, 0x15296: 0xe0004acd, 0x15297: 0xe0005ae5, - 0x15298: 0xe0004871, - 0x1529f: 0xe0009f36, - 0x152a1: 0xe000494e, 0x152a3: 0xe0006484, - 0x152a5: 0xe0007af3, 0x152a6: 0xe00060a5, - 0x152ab: 0xe000976f, - 0x152ad: 0xe0008662, 0x152ae: 0xe00063cc, - 0x152b0: 0xe00096cd, 0x152b2: 0xe0009f82, - 0x152b4: 0xe000691c, - 0x152b9: 0xe000a869, 0x152ba: 0xe0004af5, 0x152bb: 0xe0004802, - 0x152bd: 0xe0008e89, - // Block 0x54b, offset 0x152c0 - 0x152c2: 0xe0006aab, - 0x152c5: 0xe0006944, 0x152c6: 0xe0007170, - 0x152ca: 0xe0007359, 0x152cb: 0xe0008a9d, - 0x152cd: 0xe000a4c6, - 0x152d0: 0xe000516e, 0x152d2: 0xe00091a9, - 0x152d6: 0xe0006c70, - 0x152d8: 0xe0005e93, 0x152d9: 0xe00073ea, 0x152da: 0xe0007243, - 0x152df: 0xe000a620, - 0x152e2: 0xe0006aaf, 0x152e3: 0xe0005a00, - 0x152e7: 0xe0005bbc, - 0x152e8: 0xe000a549, 0x152e9: 0xe000a295, 0x152ea: 0xe0009caa, - 0x152ee: 0xe0004d76, 0x152ef: 0xe000942b, - 0x152f1: 0xe00080d6, 0x152f2: 0xe00045dd, - 0x152fa: 0xe0006d3c, - 0x152fc: 0xe0004ea0, - // Block 0x54c, offset 0x15300 - 0x15301: 0xe0004b8a, 0x15302: 0xe000a4e9, 0x15303: 0xe00063d0, - 0x15304: 0xe00064f0, 0x15305: 0xe0005f2a, - 0x15308: 0xe00070e7, 0x1530b: 0xe00098a1, - 0x1530d: 0xe0005eff, 0x1530e: 0xe00058d9, 0x1530f: 0xe00081e2, - 0x15311: 0xe0005d57, - 0x15314: 0xe0005def, - 0x15318: 0xe0007b23, 0x1531a: 0xe00078fd, - 0x15326: 0xe0006bb7, - 0x1532f: 0xe0005abb, - 0x15334: 0xe0006488, - // Block 0x54d, offset 0x15340 - 0x15340: 0xe0009af3, 0x15343: 0xe0009e34, - 0x1534e: 0xe0008af1, - 0x15351: 0xe0009eb0, 0x15352: 0xe0006852, 0x15353: 0xe0008665, - 0x15357: 0xe00056b1, - 0x1535f: 0xe0007687, - 0x15367: 0xe0008ce3, - 0x15368: 0xe00090df, 0x1536a: 0xe00082ea, 0x1536b: 0xe0004c0e, - 0x1536d: 0xe000a1e3, 0x1536e: 0xe0006ecc, - 0x15379: 0xe00070ea, - // Block 0x54e, offset 0x15380 - 0x15381: 0xe0004791, - 0x15386: 0xe0009ed4, - 0x15389: 0xe0005d30, 0x1538a: 0xe0006bba, - 0x15394: 0xe0009a1a, 0x15396: 0xe0009680, - 0x1539b: 0xe0008dd0, - 0x153a2: 0xe0007c4f, - 0x153a4: 0xe0004922, - 0x153a8: 0xe0004745, - 0x153b7: 0xe0008ce6, - // Block 0x54f, offset 0x153c0 - 0x153c8: 0xe0008b45, 0x153ca: 0xe00059ac, - 0x153cc: 0xe00098a4, 0x153cd: 0xe000985f, - 0x153d0: 0xe000762f, 0x153d2: 0xe0006701, 0x153d3: 0xe0006d49, - 0x153d5: 0xe000a014, - 0x153e4: 0xe0006bbd, 0x153e5: 0xe000a5f0, - 0x153ed: 0xe0005171, 0x153ee: 0xe0007d4e, 0x153ef: 0xe0007851, - 0x153f1: 0xe00059b0, 0x153f2: 0xe0007ca9, - 0x153f5: 0xe00062a4, - 0x153f9: 0xe0004631, 0x153fa: 0xe00070ed, 0x153fb: 0xe0005e6f, - 0x153fe: 0xe0009f39, - // Block 0x550, offset 0x15400 - 0x15407: 0xe00043f8, - 0x15409: 0xe0006608, - 0x1540f: 0xe0007591, - 0x15412: 0xe0008fd1, 0x15413: 0xe0006f08, - 0x15417: 0xe0005d79, - 0x15420: 0xe000a70c, 0x15423: 0xe0008aa1, - 0x15427: 0xe0005a8e, - 0x15438: 0xe0005ae8, 0x1543b: 0xe0006f0c, - // Block 0x551, offset 0x15440 - 0x15465: 0xe0008d70, 0x15466: 0xe00083aa, 0x15467: 0xe0006804, - 0x15469: 0xe0004ce3, - 0x15473: 0xe000676d, - 0x15474: 0xe0006028, 0x15476: 0xe0007a7f, - // Block 0x552, offset 0x15480 - 0x15483: 0xe00045e1, - 0x15486: 0xe0009205, 0x15487: 0xe00066bb, - 0x15488: 0xe0007697, 0x15489: 0xe00075d8, - 0x1548c: 0xe0006785, - 0x15492: 0xe0005a74, - 0x15495: 0xe0009af6, - 0x15498: 0xe00065fc, 0x15499: 0xe0009a1d, 0x1549b: 0xe000814a, - 0x1549f: 0xe0009a20, - 0x154a3: 0xe00048c8, - 0x154a6: 0xe000773f, - 0x154a8: 0xe0007723, - 0x154b0: 0xe0004af9, - 0x154b6: 0xe00076c7, - 0x154bb: 0xe000a535, - // Block 0x553, offset 0x154c0 - 0x154c1: 0xe0004c44, 0x154c2: 0xe000a86c, - 0x154c4: 0xe0009a23, - 0x154d1: 0xe000460d, 0x154d3: 0xe00063e4, - 0x154d4: 0xe0008fd5, - 0x154dd: 0xe00075db, 0x154de: 0xe00075fc, - 0x154e0: 0xe00048e6, 0x154e1: 0xe0006177, - 0x154e9: 0xe0006725, - 0x154ec: 0xe0006938, 0x154ef: 0xe0009fdd, - 0x154f0: 0xe0008dd3, 0x154f2: 0xe000869e, - 0x154f7: 0xe000817e, - 0x154fb: 0xe00098a7, - 0x154fe: 0xe0004952, - // Block 0x554, offset 0x15500 - 0x15504: 0xe0009690, - 0x15509: 0xe000735d, - 0x15516: 0xe00098aa, - 0x1551a: 0xe000765b, - 0x15521: 0xe00042f0, - 0x15524: 0xe0004956, - 0x15529: 0xe00060c0, - 0x1552c: 0xe000942f, 0x1552f: 0xe00077e8, - 0x15534: 0xe000a03f, 0x15535: 0xe00098ad, - 0x15538: 0xe0007855, 0x15539: 0xe0005c5d, 0x1553b: 0xe0004972, - 0x1553f: 0xe0008668, - // Block 0x555, offset 0x15540 - 0x15541: 0xe00084e2, 0x15542: 0xe0007f1f, - 0x15544: 0xe00047de, 0x15547: 0xe0004d79, - 0x15553: 0xe000866b, - 0x15556: 0xe0007c52, 0x15557: 0xe0004ce6, - 0x15559: 0xe00090e2, - 0x15566: 0xe0009772, - 0x15569: 0xe0006614, 0x1556a: 0xe00077fc, 0x1556b: 0xe00072cd, - 0x15570: 0xe0007abb, 0x15571: 0xe00048cb, 0x15572: 0xe000997c, 0x15573: 0xe000a0af, - 0x15578: 0xe000a877, 0x15579: 0xe00083fe, 0x1557a: 0xe0005abe, - 0x1557d: 0xe000a057, 0x1557f: 0xe00065bc, - // Block 0x556, offset 0x15580 - 0x15587: 0xe0008aa5, - 0x1558f: 0xe0006104, - 0x15595: 0xe0005aeb, - 0x1559a: 0xe00077ec, 0x1559b: 0xe0004ad1, - 0x1559c: 0xe0004d7c, 0x1559e: 0xe00057c7, - // Block 0x557, offset 0x155c0 - 0x155f5: 0xe0005ac1, 0x155f7: 0xe0005a78, - 0x155f9: 0xe000a0ef, 0x155fb: 0xe000437c, - 0x155fd: 0xe0007af7, 0x155ff: 0xe0005b02, - // Block 0x558, offset 0x15600 - 0x15600: 0xe0008059, 0x15602: 0xe0004e94, - 0x15604: 0xe00098b0, - 0x1560b: 0xe000624d, - 0x1560c: 0xe000805c, 0x1560f: 0xe0004f1f, - 0x15611: 0xe0007c55, 0x15612: 0xe0005108, 0x15613: 0xe0005b06, - 0x15617: 0xe000590d, - 0x1561d: 0xe0006b84, 0x1561e: 0xe00087f6, 0x1561f: 0xe0005d7d, - 0x15624: 0xe00098b3, 0x15625: 0xe0005f58, - 0x15629: 0xe0006855, 0x1562a: 0xe0005fdc, - 0x1562f: 0xe0004da3, - 0x15634: 0xe0004d93, 0x15635: 0xe0005fc8, - 0x1563b: 0xe0005df2, - 0x1563d: 0xe0005e01, 0x1563e: 0xe000a848, 0x1563f: 0xe0005e04, - // Block 0x559, offset 0x15640 - 0x15643: 0xe000a698, - 0x15645: 0xe0004ffb, - 0x1564c: 0xe000a72f, 0x1564d: 0xe0006dd4, 0x1564e: 0xe0005910, 0x1564f: 0xe0008b21, - 0x15650: 0xe0005d5a, 0x15651: 0xe000a89b, - 0x15654: 0xe0004588, 0x15656: 0xe0005174, - 0x15658: 0xe000618d, 0x1565a: 0xe000468d, 0x1565b: 0xe00054eb, - 0x1565c: 0xe000990e, 0x1565d: 0xe00082ed, 0x1565e: 0xe0008af5, - 0x15660: 0xe000a990, - 0x15665: 0xe0004795, - 0x15668: 0xe0005476, - 0x1566e: 0xe0005432, 0x1566f: 0xe0007713, - 0x15672: 0xe000938b, - 0x15674: 0xe0006223, 0x15675: 0xe0005436, 0x15676: 0xe0007b27, 0x15677: 0xe00055e9, - 0x1567a: 0xe00068ec, 0x1567b: 0xe0006920, - 0x1567c: 0xe00066be, 0x1567d: 0xe00062a8, 0x1567f: 0xe0008182, - // Block 0x55a, offset 0x15680 - 0x15680: 0xe00098f6, 0x15682: 0xe0008dd6, - 0x15684: 0xe0008f46, 0x15687: 0xe0007cac, - 0x15688: 0xe000660c, 0x15689: 0xe0009af9, 0x1568a: 0xe00065c0, - 0x1568e: 0xe0008c21, - 0x15690: 0xe000522f, 0x15693: 0xe0004874, - 0x15697: 0xe00055ba, - 0x15699: 0xe0006a44, - 0x156a0: 0xe0006dd7, 0x156a2: 0xe00068f0, - 0x156ab: 0xe0006e4c, - 0x156ac: 0xe00082f0, 0x156af: 0xe0007cf7, - 0x156b4: 0xe0007953, - 0x156b8: 0xe0004691, 0x156b9: 0xe0007957, 0x156bb: 0xe00069c3, - 0x156be: 0xe000a0b3, - // Block 0x55b, offset 0x156c0 - 0x156ca: 0xe0008cb3, 0x156cb: 0xe0008827, - 0x156ce: 0xe000882a, - 0x156d2: 0xe00099ed, - 0x156d4: 0xe0009a46, 0x156d5: 0xe000a8e7, 0x156d7: 0xe00083a2, - 0x156df: 0xe00088b0, - 0x156e0: 0xe0009775, 0x156e1: 0xe0005a44, - 0x156e6: 0xe00042b0, 0x156e7: 0xe0006f40, - 0x156e9: 0xe0004c47, 0x156ea: 0xe000929f, 0x156eb: 0xe000495a, - 0x156ec: 0xe0007900, - 0x156f2: 0xe000805f, - 0x156f6: 0xe000765f, 0x156f7: 0xe0007633, - // Block 0x55c, offset 0x15700 - 0x1570d: 0xe0005be3, 0x1570e: 0xe0005b5e, - 0x15710: 0xe0006454, 0x15712: 0xe0005be7, - 0x15714: 0xe00049e2, 0x15715: 0xe0004340, - 0x1571c: 0xe0004ce9, 0x1571d: 0xe0009880, - 0x15720: 0xe0007859, 0x15722: 0xe000a589, - 0x15725: 0xe00082f3, - // Block 0x55d, offset 0x15740 - 0x15740: 0xe00050ed, 0x15741: 0xe00046dd, 0x15742: 0xe0009269, 0x15743: 0xe00041a8, - 0x15744: 0xe000a628, 0x15745: 0xe00049e6, 0x15746: 0xe0004c65, 0x15747: 0xe0004ce9, - 0x15748: 0xe0004ce9, 0x15749: 0xe00047a2, 0x1574a: 0xe0005193, 0x1574b: 0xe0005754, - 0x1574c: 0xe000521a, 0x1574d: 0xe0005757, 0x1574e: 0xe000575a, 0x1574f: 0xe000575d, - 0x15750: 0xe0005760, 0x15751: 0xe0005763, 0x15752: 0xe0005766, 0x15753: 0xe0005769, - 0x15754: 0xe000761b, 0x15755: 0xe0005787, 0x15756: 0xe000578b, 0x15757: 0xe000578f, - 0x15758: 0xe0005797, 0x15759: 0xe000579b, 0x1575a: 0xe000579f, 0x1575b: 0xe00057ab, - 0x1575c: 0xe00057af, 0x1575d: 0xe00057b3, 0x1575e: 0xe00057bf, 0x1575f: 0xe00057c3, - 0x15760: 0xe00057c7, 0x15761: 0xe00057f7, 0x15762: 0xe0005807, 0x15763: 0xe0005813, - 0x15764: 0xe0005817, 0x15765: 0xe0005827, 0x15766: 0xe000582b, 0x15767: 0xe000582f, - 0x15768: 0xe0005837, 0x15769: 0xe000583b, 0x1576a: 0xe000583f, 0x1576b: 0xe0005843, - 0x1576c: 0x43219c20, 0x1576d: 0xe000586f, 0x1576e: 0xe0005881, 0x1576f: 0xe0005a91, - 0x15770: 0xe0005a97, 0x15771: 0xe0005a9a, 0x15772: 0xe0005aa3, 0x15773: 0xe0005aa6, - 0x15774: 0xe0005aa9, 0x15775: 0xe0005aac, 0x15776: 0xe0005aaf, 0x15777: 0xe0005ab2, - 0x15778: 0xe0005ab8, 0x15779: 0xe0005abb, 0x1577a: 0xe0005abe, 0x1577b: 0xe0005aee, - 0x1577c: 0xe0005af2, 0x1577d: 0xe0005af6, 0x1577e: 0xe0005afa, 0x1577f: 0xe0005afe, - // Block 0x55e, offset 0x15780 - 0x15780: 0xe0005b02, 0x15781: 0xe0005b26, 0x15782: 0xe0005b2a, 0x15783: 0xe0005b2e, - 0x15784: 0xe0005b3e, 0x15785: 0xe0005b42, 0x15786: 0xe0005b68, 0x15787: 0xe0005b6b, - 0x15788: 0xe0005b6e, 0x15789: 0xe0005b77, 0x1578a: 0xe0005beb, 0x1578b: 0xe0005bf1, - 0x1578c: 0xe0005bf4, 0x1578d: 0xe0005bf7, 0x1578e: 0xe0005bfa, 0x1578f: 0xe0005c00, - 0x15790: 0xe0005c03, 0x15791: 0xe0005c0f, 0x15792: 0xe0005cac, 0x15793: 0xe0005cb0, - 0x15794: 0xe0005cb8, 0x15795: 0xe0005cc8, 0x15796: 0xe0005cd0, 0x15797: 0xe0005cd4, - 0x15798: 0xe0005cd8, 0x15799: 0xe0005cdc, 0x1579a: 0xe00055e1, 0x1579b: 0xe00051a4, - 0x1579c: 0xe000761b, 0x1579d: 0xe00051bc, 0x1579e: 0xe000532a, 0x1579f: 0xe0005259, - 0x157a0: 0xe000527a, 0x157a1: 0xe000713c, 0x157a2: 0xe000847a, 0x157a3: 0xe0006858, - 0x157a4: 0xe0006368, 0x157a5: 0xe0009db4, 0x157a6: 0xe00066d5, 0x157a7: 0xe0006789, - 0x157a8: 0xe0009f95, 0x157a9: 0xe00071c2, 0x157aa: 0xe0006d54, 0x157ab: 0xe000932b, - 0x157ac: 0xe0006d40, 0x157ad: 0xe0006ff4, 0x157ae: 0xe0007b33, 0x157af: 0xe0006f38, - 0x157b0: 0xe0006c40, 0x157b1: 0xe0009171, 0x157b2: 0xe0009a62, 0x157b3: 0xe00073a2, - 0x157b4: 0xe0007829, 0x157b5: 0xe0005885, 0x157b6: 0xe0005889, 0x157b7: 0xe0005891, - 0x157b8: 0xe0005899, 0x157b9: 0xe000589d, 0x157ba: 0xe00058a1, 0x157bb: 0xe00058b1, - 0x157bc: 0xe00058b5, 0x157bd: 0xe00058b9, 0x157be: 0xe00058c1, 0x157bf: 0xe00058e3, - // Block 0x55f, offset 0x157c0 - 0x157c0: 0xe00058e6, 0x157c1: 0xe0005232, 0x157c2: 0xe00058e9, 0x157c3: 0xe00058f2, - 0x157c4: 0xe00058f8, 0x157c5: 0xe00058fb, 0x157c6: 0xe0005904, 0x157c7: 0xe000590a, - 0x157c8: 0xe000590d, 0x157c9: 0xe0005910, 0x157ca: 0xe0005934, 0x157cb: 0xe0005938, - 0x157cc: 0xe000593c, 0x157cd: 0xe0005948, 0x157ce: 0xe0005239, 0x157cf: 0xe0005968, - 0x157d0: 0xe000596c, 0x157d1: 0xe000523d, 0x157d2: 0xe0005974, 0x157d3: 0xe0005978, - 0x157d4: 0xe000597c, 0x157d5: 0xe0005241, 0x157d6: 0xe0005980, 0x157d7: 0xe0005984, - 0x157d8: 0xe000598c, 0x157d9: 0xe0005988, 0x157da: 0xe0005990, 0x157db: 0xe0005994, - 0x157dc: 0xe00059b8, 0x157dd: 0xe00059bc, 0x157de: 0xe00084f6, 0x157df: 0xe00059c4, - 0x157e0: 0xe00059c8, 0x157e1: 0xe0006f38, 0x157e2: 0xe00059d8, 0x157e3: 0xe0005249, - 0x157e4: 0xe0005255, 0x157e5: 0xe00059e0, 0x157e6: 0xe00059e8, 0x157e7: 0xe00059f8, - 0x157e8: 0xe0005a04, 0x157e9: 0xe0005a0c, 0x157ea: 0xe0005259, 0x157eb: 0xe0005a14, - 0x157ec: 0xe0005a18, 0x157ed: 0xe0005a1c, 0x157ee: 0xe000a3b1, 0x157ef: 0xe0005a24, - 0x157f0: 0xe0005a2c, 0x157f1: 0xe0005a34, 0x157f2: 0xe0005a38, 0x157f3: 0xe0005a3c, - 0x157f4: 0xe0005a40, 0x157f5: 0xe0005a7c, 0x157f6: 0xe0005a82, 0x157f7: 0xe0005a85, - 0x157f8: 0xe0005a8b, 0x157f9: 0xe000760f, 0x157fa: 0xe0005b9b, 0x157fb: 0xe0005b9e, - 0x157fc: 0xe0005ba1, 0x157fd: 0xe00052ba, 0x157fe: 0xe0005ba7, 0x157ff: 0xe000761b, - // Block 0x560, offset 0x15800 - 0x15800: 0xe0005baa, 0x15801: 0xe0005bad, 0x15802: 0xe0005bb6, 0x15803: 0xe0005bb9, - 0x15804: 0xe0005be3, 0x15805: 0xe000a7de, 0x15806: 0xe0007e19, 0x15807: 0xe0005c27, - 0x15808: 0xe00052e5, 0x15809: 0xe0005c2d, 0x1580a: 0xe0005c33, 0x1580b: 0xe0005c36, - 0x1580c: 0xe0005c3c, 0x1580d: 0xe0005c42, 0x1580e: 0xe0005c48, 0x1580f: 0xe00052e8, - 0x15810: 0xe0005c4e, 0x15811: 0xe0005c60, 0x15812: 0xe0005c64, 0x15813: 0xe0005c68, - 0x15814: 0xe0005c74, 0x15815: 0xe0005c78, 0x15816: 0xe0005c7c, 0x15817: 0xe0005c84, - 0x15818: 0xe0005c8c, 0x15819: 0xe0005c90, 0x1581a: 0xe0005c94, 0x1581b: 0xe000713c, - 0x1581c: 0xe0005ca0, 0x1581d: 0xe0005ceb, 0x1581e: 0xe0005cf1, 0x1581f: 0xe0005cf7, - 0x15820: 0xe00079e7, 0x15821: 0xe0005cfd, 0x15822: 0xe0005d00, 0x15823: 0xe00052fc, - 0x15824: 0xe0005d0c, 0x15825: 0xe0005d12, 0x15826: 0xe0005d18, 0x15827: 0xe0005d21, - 0x15828: 0xe0005d24, 0x15829: 0xe0005d27, 0x1582a: 0xe0005d2d, 0x1582b: 0xe0005311, - 0x1582c: 0xe0005315, 0x1582d: 0xe0005d5d, 0x1582e: 0xe0005d65, 0x1582f: 0xe0005d69, - 0x15830: 0xe0005d6d, 0x15831: 0xe0005d75, 0x15832: 0xe0005d79, 0x15833: 0xe0005d7d, - 0x15834: 0xe0005db1, 0x15835: 0xe0005db5, 0x15836: 0xe0005dbd, 0x15837: 0xe0005dcd, - 0x15838: 0xe0005dd1, 0x15839: 0xe0005dd5, 0x1583a: 0xe0006cf0, 0x1583b: 0xe00085f3, - 0x1583c: 0xe00074a1, 0x1583d: 0xe0007595, 0x1583e: 0xe0005324, 0x1583f: 0xe00085d5, - // Block 0x561, offset 0x15840 - 0x15840: 0xe0008aa9, 0x15841: 0xe000552a, 0x15842: 0xe00094b4, 0x15843: 0xe000546e, - 0x15844: 0xe0005500, 0x15845: 0xe0005655, 0x15846: 0xe0009edb, 0x15847: 0xe00066f9, - 0x15848: 0xe000a206, 0x15849: 0xe00043f4, 0x1584a: 0xe0004601, 0x1584b: 0xe0004a35, - 0x1584c: 0xe0007d52, 0x1584d: 0x42ab8020, 0x1584e: 0x43f41c20, 0x1584f: 0x43f41e20, - 0x15850: 0xe00097c0, 0x15851: 0x43f42220, 0x15852: 0xe0009668, 0x15853: 0x43f42620, - 0x15854: 0x43f42820, 0x15855: 0xe000a922, 0x15856: 0xe0008886, 0x15857: 0xe00084c6, - 0x15858: 0x42f27820, 0x15859: 0xe00074e9, 0x1585a: 0xe0006cf8, 0x1585b: 0xe00066dd, - 0x1585c: 0xe0008c15, 0x1585d: 0xe0008be1, 0x1585e: 0xe0008005, 0x1585f: 0x43f43e20, - 0x15860: 0x430c2420, 0x15861: 0x43f44220, 0x15862: 0xe0008c9e, 0x15863: 0x43f44620, - 0x15864: 0x43f44820, 0x15865: 0xe000856e, 0x15866: 0xe0005578, 0x15867: 0x43f44e20, - 0x15868: 0x43f45020, 0x15869: 0x43f45220, 0x1586a: 0xe0006384, 0x1586b: 0xe0006b7e, - 0x1586c: 0xe0004a95, 0x1586d: 0xe000a03f, 0x1586e: 0xe0005853, 0x1586f: 0xe0005a88, - 0x15870: 0xe0006033, 0x15871: 0xe00073c6, 0x15872: 0xe0005fa0, 0x15873: 0xe0005fa8, - 0x15874: 0xe0004f5b, 0x15875: 0xe0006954, 0x15876: 0xe00042b8, 0x15877: 0xe0009b5c, - 0x15878: 0xe000505a, 0x15879: 0xe0006660, 0x1587a: 0xe0006189, 0x1587b: 0xe00099a4, - 0x1587c: 0x42b8dc20, 0x1587d: 0xe000a6c7, 0x1587e: 0xe0004455, 0x1587f: 0xe0009021, - // Block 0x562, offset 0x15880 - 0x15880: 0xe000922d, 0x15881: 0xe0006260, 0x15882: 0x42cbc420, 0x15883: 0xe0006d9e, - 0x15884: 0xe0005f15, 0x15885: 0xe000a1aa, 0x15886: 0xe0008880, 0x15887: 0xe000a06f, - 0x15888: 0xe00085f6, 0x15889: 0x42e45620, 0x1588a: 0xe0009b24, 0x1588b: 0xe000698d, - 0x1588c: 0xe0006b42, 0x1588d: 0xe0009091, 0x1588e: 0xe00050cc, 0x1588f: 0xe0007ff9, - 0x15890: 0xe0008d31, 0x15891: 0xe00098be, 0x15892: 0xe000a55f, 0x15893: 0xe0008bd5, - 0x15894: 0xe00048de, 0x15895: 0xe0005625, 0x15896: 0xe0008ac1, 0x15897: 0xe0005980, - 0x15898: 0xe0009151, 0x15899: 0xe000650c, 0x1589a: 0xe0006dbc, 0x1589b: 0xe0008608, - 0x1589c: 0xe0009970, 0x1589d: 0x4304f220, 0x1589e: 0x4304f220, 0x1589f: 0xe0008898, - 0x158a0: 0xe00042d0, 0x158a1: 0xe0007430, 0x158a2: 0xe000769f, 0x158a3: 0xe0004f83, - 0x158a4: 0xe0006a77, 0x158a5: 0xe0009045, 0x158a6: 0x431f6c20, 0x158a7: 0xe000856e, - 0x158a8: 0xe00051c8, 0x158a9: 0xe000a222, 0x158aa: 0xe0006a7b, 0x158ab: 0x42c0ea20, - 0x158ac: 0x4885dc20, 0x158ad: 0x43043020, - 0x158b0: 0xe000665c, 0x158b1: 0x42a36a20, 0x158b2: 0xe0008971, 0x158b3: 0x429f0020, - 0x158b4: 0xe0009916, 0x158b5: 0xe0005054, 0x158b6: 0xe0007f4e, 0x158b7: 0xe0008672, - 0x158b8: 0xe00042b8, 0x158b9: 0x42aaaa20, 0x158ba: 0xe000a821, 0x158bb: 0xe0007d56, - 0x158bc: 0xe00097c0, 0x158bd: 0xe0006868, 0x158be: 0xe0007973, 0x158bf: 0xe000686c, - // Block 0x563, offset 0x158c0 - 0x158c0: 0xe000695a, 0x158c1: 0xe0008623, 0x158c2: 0x42bda420, 0x158c3: 0x42bdb220, - 0x158c4: 0xe000943f, 0x158c5: 0xe0007f04, 0x158c6: 0xe0005eeb, 0x158c7: 0x42c29c20, - 0x158c8: 0xe0008236, 0x158c9: 0xe0009021, 0x158ca: 0xe0007cca, 0x158cb: 0xe000922d, - 0x158cc: 0xe00054d6, 0x158cd: 0xe000823c, 0x158ce: 0xe00071bc, 0x158cf: 0x42c8a420, - 0x158d0: 0xe0007c85, 0x158d1: 0xe0009668, 0x158d2: 0xe000583b, 0x158d3: 0xe0005ecb, - 0x158d4: 0xe0008752, 0x158d5: 0x42d6f220, 0x158d6: 0xe0006c40, 0x158d7: 0xe0005c33, - 0x158d8: 0x42ddb620, 0x158d9: 0xe00085f0, 0x158da: 0xe000a06f, 0x158db: 0xe0008bb9, - 0x158dc: 0xe00085f6, 0x158dd: 0x42ef4e20, 0x158de: 0xe000868a, 0x158df: 0xe0006560, - 0x158e0: 0xe0008886, 0x158e1: 0xe0008a3d, 0x158e2: 0x42ea0c20, 0x158e3: 0x42ea7620, - 0x158e4: 0x42ec3a20, 0x158e5: 0xe0007d16, 0x158e6: 0xe00084c6, 0x158e7: 0xe0006ff0, - 0x158e8: 0xe00090e5, 0x158e9: 0x42ee9420, 0x158ea: 0xe000928f, 0x158eb: 0x42f19820, - 0x158ec: 0x42f56220, 0x158ed: 0xe0008ac1, 0x158ee: 0x42f8f620, 0x158ef: 0xe0008daf, - 0x158f0: 0xe0005980, 0x158f1: 0xe0006668, 0x158f2: 0xe0008608, 0x158f3: 0xe000a688, - 0x158f4: 0xe000a568, 0x158f5: 0x430ef220, 0x158f6: 0xe00043e8, 0x158f7: 0xe00066f1, - 0x158f8: 0xe0007430, 0x158f9: 0xe0008d58, 0x158fa: 0xe0008c9e, 0x158fb: 0xe0009678, - 0x158fc: 0xe000769f, 0x158fd: 0xe00051bc, 0x158fe: 0xe000827e, 0x158ff: 0xe0004f83, - // Block 0x564, offset 0x15900 - 0x15900: 0xe00065cc, 0x15901: 0xe0009045, 0x15902: 0xe0007219, 0x15903: 0xe00090b5, - 0x15904: 0x43233220, 0x15905: 0x4324ec20, 0x15906: 0xe00088e6, 0x15907: 0xe00051c8, - 0x15908: 0xe0008c15, 0x15909: 0x432fb620, 0x1590a: 0xe000a222, 0x1590b: 0x43301620, - 0x1590c: 0xe0006a7b, 0x1590d: 0xe00091a9, 0x1590e: 0xe0004ce9, 0x1590f: 0x48509420, - 0x15910: 0x48508820, 0x15911: 0x4867aa20, 0x15912: 0x44773a20, 0x15913: 0x44803020, - 0x15914: 0x44807220, 0x15915: 0x48a49220, 0x15916: 0x48b9a020, 0x15917: 0x48fda620, - 0x15918: 0x433e8620, 0x15919: 0xe0005b5e, - // Block 0x565, offset 0x15940 - 0x15940: 0xe0003d0b, 0x15941: 0xe0003cf3, 0x15942: 0xe0003cf7, 0x15943: 0xe0003cff, - 0x15944: 0xe0003d0f, 0x15945: 0xe0003d03, 0x15946: 0xf0000404, 0x15947: 0xe0003cfb, - 0x15948: 0xe0003d07, - 0x15950: 0x02bf2e86, 0x15951: 0x02a7de86, - // Block 0x566, offset 0x15980 - 0x15980: 0x429c7a20, 0x15981: 0xe000a5b0, 0x15982: 0x429c8220, 0x15983: 0x48024420, - 0x15984: 0x429ec020, 0x15985: 0xe0006033, 0x15986: 0xe0009b9c, 0x15987: 0xe000661c, - 0x15988: 0x42a0f420, 0x15989: 0xe000694b, 0x1598a: 0xe00073c6, 0x1598b: 0xe0006ca8, - 0x1598c: 0x44693c20, 0x1598d: 0x480c7420, 0x1598e: 0xe0005fa0, 0x1598f: 0x42a2a820, - 0x15990: 0x42a2c820, 0x15991: 0xe0004c59, 0x15992: 0x480a3820, 0x15993: 0x44697220, - 0x15994: 0xe0005217, 0x15995: 0xe00087fa, 0x15996: 0x480a9620, 0x15997: 0xe0007f4a, - 0x15998: 0xe000814e, 0x15999: 0x429d9820, 0x1599a: 0xe0005635, 0x1599b: 0x42a36a20, - 0x1599c: 0x4923be20, 0x1599d: 0x42a3ea20, 0x1599e: 0xe00084ee, 0x1599f: 0x4469be20, - 0x159a0: 0xe00041e4, 0x159a1: 0x42a48c20, 0x159a2: 0xe000a0b7, 0x159a3: 0xe0006c08, - 0x159a4: 0x446a2a20, 0x159a5: 0xe0007f4e, 0x159a6: 0xe0005fa8, 0x159a7: 0xe0004f5b, - 0x159a8: 0xe0008672, 0x159a9: 0xe0009e65, 0x159aa: 0x42a60c20, 0x159ab: 0xe0006858, - 0x159ac: 0xe000a81e, 0x159ad: 0xe0006954, 0x159ae: 0xe00062c4, 0x159af: 0xe0008ff9, - 0x159b0: 0xe0008ff5, 0x159b1: 0xe00046b1, 0x159b2: 0xe00046b1, 0x159b3: 0xe00046b1, - 0x159b4: 0x48145820, 0x159b5: 0xe000a6dc, 0x159b6: 0xe0005003, 0x159b7: 0xe0007246, - 0x159b8: 0x4816c620, 0x159b9: 0xe0004ea3, 0x159ba: 0xe00091b1, 0x159bb: 0x42a80c20, - 0x159bc: 0x42a93c20, 0x159bd: 0xe000a8fb, 0x159be: 0xe0008b5d, 0x159bf: 0xe0008ea4, - // Block 0x567, offset 0x159c0 - 0x159c0: 0xe000763f, 0x159c1: 0x42a9ec20, 0x159c2: 0xe000544e, 0x159c3: 0xe000479c, - 0x159c4: 0xe000a0cf, 0x159c5: 0xe0006e5c, 0x159c6: 0xe0006e5c, 0x159c7: 0xe000a821, - 0x159c8: 0xe0005197, 0x159c9: 0x42ab6620, 0x159ca: 0x42ab8420, 0x159cb: 0xe0005515, - 0x159cc: 0xe0009b5c, 0x159cd: 0x42ae2e20, 0x159ce: 0x42aca220, 0x159cf: 0xe0006864, - 0x159d0: 0xe0008aa9, 0x159d1: 0x42b1dc20, 0x159d2: 0xe0006fc8, 0x159d3: 0xe0007475, - 0x159d4: 0x42b01a20, 0x159d5: 0xe000a38d, 0x159d6: 0x42b06420, 0x159d7: 0xe0006682, - 0x159d8: 0x42b15820, 0x159d9: 0x4829c820, 0x159da: 0x42b1e420, 0x159db: 0x42b1ee20, - 0x159dc: 0xe0006775, 0x159dd: 0xe0005321, 0x159de: 0xe00060d4, 0x159df: 0xe0006b00, - 0x159e0: 0x482d5020, 0x159e1: 0x482dd420, 0x159e2: 0xe000a92e, 0x159e3: 0xe0007c79, - 0x159e4: 0xe0009c21, 0x159e5: 0x42b3b020, 0x159e6: 0xe00067a7, 0x159e7: 0x446ddc20, - 0x159e8: 0x446df820, 0x159e9: 0xe0007efe, 0x159ea: 0xe00057cb, 0x159eb: 0xe00057cb, - 0x159ec: 0x48339020, 0x159ed: 0xe0008106, 0x159ee: 0xe00099f6, 0x159ef: 0xe0005259, - 0x159f0: 0x42b7e620, 0x159f1: 0x48363020, 0x159f2: 0x42b7fe20, 0x159f3: 0x42b80c20, - 0x159f4: 0x42bea620, 0x159f5: 0x42b84420, 0x159f6: 0x446f0220, 0x159f7: 0xe0005521, - 0x159f8: 0x42b8dc20, 0x159f9: 0xe00071aa, 0x159fa: 0x42b91a20, 0x159fb: 0x483bc820, - 0x159fc: 0x42ba8620, 0x159fd: 0x483bcc20, 0x159fe: 0x42badc20, 0x159ff: 0x42bad620, - // Block 0x568, offset 0x15a00 - 0x15a00: 0x42baf820, 0x15a01: 0xe00072d1, 0x15a02: 0xe000704e, 0x15a03: 0x44705e20, - 0x15a04: 0xe0007120, 0x15a05: 0xe0007030, 0x15a06: 0xe000603f, 0x15a07: 0x42bcd220, - 0x15a08: 0x4470c420, 0x15a09: 0x48430620, 0x15a0a: 0x4470f820, 0x15a0b: 0x42bd6020, - 0x15a0c: 0xe00069db, 0x15a0d: 0xe0006d8c, 0x15a0e: 0xe0005837, 0x15a0f: 0x49472420, - 0x15a10: 0x42bdfc20, 0x15a11: 0x48466220, 0x15a12: 0x48466220, 0x15a13: 0xe00079d8, - 0x15a14: 0xe000558a, 0x15a15: 0xe000558a, 0x15a16: 0x44718e20, 0x15a17: 0x48657020, - 0x15a18: 0x48c3b420, 0x15a19: 0xe000a391, 0x15a1a: 0xe0008cfb, 0x15a1b: 0x4471c620, - 0x15a1c: 0x42bf3420, 0x15a1d: 0xe000850a, 0x15a1e: 0xe0009064, 0x15a1f: 0x42bff220, - 0x15a20: 0xe0007a93, 0x15a21: 0x44727420, 0x15a22: 0x44723820, 0x15a23: 0xe000a6c7, - 0x15a24: 0x484da820, 0x15a25: 0xe00055f1, 0x15a26: 0xe00085ed, 0x15a27: 0xe000a654, - 0x15a28: 0x42c29c20, 0x15a29: 0xe000a654, 0x15a2a: 0xe0005c1b, 0x15a2b: 0xe0009021, - 0x15a2c: 0xe000a245, 0x15a2d: 0xe0006878, 0x15a2e: 0xe0009363, 0x15a2f: 0xe00060e4, - 0x15a30: 0xe000922d, 0x15a31: 0xe0005757, 0x15a32: 0xe0006fdc, 0x15a33: 0x42c43620, - 0x15a34: 0x42c4ba20, 0x15a35: 0xe0009e80, 0x15a36: 0xe00063ac, 0x15a37: 0xe0007a27, - 0x15a38: 0x48561820, 0x15a39: 0xe0005e3f, 0x15a3a: 0x42c5f820, 0x15a3b: 0xe0006b1b, - 0x15a3c: 0xe0007054, 0x15a3d: 0x42c7c820, 0x15a3e: 0x4857e220, 0x15a3f: 0xe000910d, - // Block 0x569, offset 0x15a40 - 0x15a40: 0x42c78a20, 0x15a41: 0xe0007977, 0x15a42: 0x44745c20, 0x15a43: 0xe0005ddd, - 0x15a44: 0x42c8fc20, 0x15a45: 0xe000a84b, 0x15a46: 0x42c8ee20, 0x15a47: 0x4474d820, - 0x15a48: 0xe0006260, 0x15a49: 0xe00046d1, 0x15a4a: 0x48601420, 0x15a4b: 0xe0005087, - 0x15a4c: 0xe0006da4, 0x15a4d: 0xe0009111, 0x15a4e: 0x44763220, 0x15a4f: 0xe0006d9e, - 0x15a50: 0x44761020, 0x15a51: 0x4475c820, 0x15a52: 0xe0006036, 0x15a53: 0xe0005fa4, - 0x15a54: 0xe0009802, 0x15a55: 0x42cd3820, 0x15a56: 0xe00052e1, 0x15a57: 0x4487b220, - 0x15a58: 0xe000583b, 0x15a59: 0xe0005ecb, 0x15a5a: 0x42ce4220, 0x15a5b: 0xe0005090, - 0x15a5c: 0xe0009ef7, 0x15a5d: 0x48678620, 0x15a5e: 0x44769220, 0x15a5f: 0x42cff420, - 0x15a60: 0x42cf0a20, 0x15a61: 0x42d0a420, 0x15a62: 0xe0005f15, 0x15a63: 0x4868da20, - 0x15a64: 0x42d11c20, 0x15a65: 0x42d03e20, 0x15a66: 0x42d22820, 0x15a67: 0x44773a20, - 0x15a68: 0xe0006b96, 0x15a69: 0x42d34620, 0x15a6a: 0xe000445b, 0x15a6b: 0x42d55020, - 0x15a6c: 0x486d4620, 0x15a6d: 0xe0009001, 0x15a6e: 0x44783020, 0x15a6f: 0xe000925a, - 0x15a70: 0x48714e20, 0x15a71: 0xe000a242, 0x15a72: 0x44789c20, 0x15a73: 0xe000701e, - 0x15a74: 0x42d73e20, 0x15a75: 0xe0006c40, 0x15a76: 0x42d77620, 0x15a77: 0x48751a20, - 0x15a78: 0x483a1620, 0x15a79: 0x4875f420, 0x15a7a: 0xe0006558, 0x15a7b: 0x48797820, - 0x15a7c: 0xe0007a37, 0x15a7d: 0x42d99a20, 0x15a7e: 0x42d8ce20, 0x15a7f: 0x42da2c20, - // Block 0x56a, offset 0x15a80 - 0x15a80: 0xe0009ce2, 0x15a81: 0xe000a1aa, 0x15a82: 0xe0005c33, 0x15a83: 0xe000a43f, - 0x15a84: 0xe0009a66, 0x15a85: 0xe0007ac3, 0x15a86: 0x487a3c20, 0x15a87: 0x42da6820, - 0x15a88: 0xe000a167, 0x15a89: 0xe000850e, 0x15a8a: 0x447a6620, 0x15a8b: 0xe00085f0, - 0x15a8c: 0x42dd8e20, 0x15a8d: 0x487da220, 0x15a8e: 0xe000797b, 0x15a8f: 0xe0008d1f, - 0x15a90: 0x487ebc20, 0x15a91: 0x487f1c20, 0x15a92: 0xe00068c8, 0x15a93: 0x42e07220, - 0x15a94: 0xe0008bb9, 0x15a95: 0xe0007b77, 0x15a96: 0x447b2c20, 0x15a97: 0x42e09420, - 0x15a98: 0xe0008818, 0x15a99: 0x42e0ee20, 0x15a9a: 0xe0009b74, 0x15a9b: 0x480a4a20, - 0x15a9c: 0x42e28a20, 0x15a9d: 0x4884c620, 0x15a9e: 0x42e33820, 0x15a9f: 0x48875620, - 0x15aa0: 0xe0009303, 0x15aa1: 0xe000868a, 0x15aa2: 0x42e4a020, 0x15aa3: 0x488c1020, - 0x15aa4: 0xe0006dad, 0x15aa5: 0x42e52a20, 0x15aa6: 0x488e6a20, 0x15aa7: 0x48902820, - 0x15aa8: 0xe00053a6, 0x15aa9: 0xe0007e55, 0x15aaa: 0x447d5820, 0x15aab: 0x42e74a20, - 0x15aac: 0x447d7020, 0x15aad: 0x447d7020, 0x15aae: 0x42e88e20, 0x15aaf: 0xe0008263, - 0x15ab0: 0xe0008a3d, 0x15ab1: 0x42e90a20, 0x15ab2: 0xe00046f9, 0x15ab3: 0x447e3620, - 0x15ab4: 0x42ea4820, 0x15ab5: 0x48986c20, 0x15ab6: 0x42ea7c20, 0x15ab7: 0x48992420, - 0x15ab8: 0xe000847a, 0x15ab9: 0x48433e20, 0x15aba: 0xe00082b7, 0x15abb: 0x489f4220, - 0x15abc: 0x489f7020, 0x15abd: 0x48a08820, 0x15abe: 0x447ff820, 0x15abf: 0x44801020, - // Block 0x56b, offset 0x15ac0 - 0x15ac0: 0xe00090e5, 0x15ac1: 0x48a1e620, 0x15ac2: 0x48a1e420, 0x15ac3: 0x48a23220, - 0x15ac4: 0x48a26620, 0x15ac5: 0xe0009145, 0x15ac6: 0x42ee3e20, 0x15ac7: 0x42ee3e20, - 0x15ac8: 0x42ee9420, 0x15ac9: 0x44807220, 0x15aca: 0xe0009149, 0x15acb: 0x44808c20, - 0x15acc: 0x44812c20, 0x15acd: 0x48a83a20, 0x15ace: 0x42f09c20, 0x15acf: 0xe0005aee, - 0x15ad0: 0x42f19820, 0x15ad1: 0x4481c620, 0x15ad2: 0x48ac4c20, 0x15ad3: 0xe0008d31, - 0x15ad4: 0x48ad3420, 0x15ad5: 0x48ad8a20, 0x15ad6: 0xe00066dd, 0x15ad7: 0xe0009912, - 0x15ad8: 0x44825e20, 0x15ad9: 0xe00048de, 0x15ada: 0x42f49420, 0x15adb: 0x42f49e20, - 0x15adc: 0x48b2f820, 0x15add: 0x48b54e20, 0x15ade: 0x48b54e20, 0x15adf: 0x42f5dc20, - 0x15ae0: 0x44840420, 0x15ae1: 0x48b75620, 0x15ae2: 0xe00089d5, 0x15ae3: 0xe00098ca, - 0x15ae4: 0x44844e20, 0x15ae5: 0x48b90020, 0x15ae6: 0x42f9a420, 0x15ae7: 0x44854020, - 0x15ae8: 0x42f9d020, 0x15ae9: 0x42f9c620, 0x15aea: 0xe00050d5, 0x15aeb: 0x48bf0c20, - 0x15aec: 0xe0006664, 0x15aed: 0x44860220, 0x15aee: 0xe00099d5, 0x15aef: 0x42fc0420, - 0x15af0: 0xe00070cf, 0x15af1: 0x44866820, 0x15af2: 0x48c45020, 0x15af3: 0x48c48e20, - 0x15af4: 0x4486b220, 0x15af5: 0x48c5b220, 0x15af6: 0x42fef420, 0x15af7: 0x48c67c20, - 0x15af8: 0x42ff2a20, 0x15af9: 0xe00048b0, 0x15afa: 0xe0008608, 0x15afb: 0x48c9b420, - 0x15afc: 0x48ca4620, 0x15afd: 0x4300c020, 0x15afe: 0x48cb5020, 0x15aff: 0xe00097d8, - // Block 0x56c, offset 0x15b00 - 0x15b00: 0x4866be20, 0x15b01: 0x4487aa20, 0x15b02: 0xe0008302, 0x15b03: 0x43020620, - 0x15b04: 0x44881620, 0x15b05: 0xe00069a2, 0x15b06: 0xe00085ce, 0x15b07: 0x48cf4e20, - 0x15b08: 0x48cf6a20, 0x15b09: 0x48672620, 0x15b0a: 0x48673820, 0x15b0b: 0xe00079d8, - 0x15b0c: 0x43040820, 0x15b0d: 0x431f3c20, 0x15b0e: 0x4488d620, 0x15b0f: 0x43052220, - 0x15b10: 0xe0008008, 0x15b11: 0xe00090a3, 0x15b12: 0x42a56620, 0x15b13: 0xe000a565, - 0x15b14: 0xe0006438, 0x15b15: 0xe00075c0, 0x15b16: 0xe0004850, 0x15b17: 0x48d67820, - 0x15b18: 0xe0007829, 0x15b19: 0xe000945a, 0x15b1a: 0x4306c620, 0x15b1b: 0x43075a20, - 0x15b1c: 0xe0007cd9, 0x15b1d: 0xe0005edf, 0x15b1e: 0x4307ce20, 0x15b1f: 0xe0008898, - 0x15b20: 0x4306a620, 0x15b21: 0xe0004d87, 0x15b22: 0xe0004f13, 0x15b23: 0xe000944b, - 0x15b24: 0x48d86c20, 0x15b25: 0x48dad620, 0x15b26: 0x48d9aa20, 0x15b27: 0x448a5620, - 0x15b28: 0xe0009e30, 0x15b29: 0x4309e620, 0x15b2a: 0x430a2c20, 0x15b2b: 0x48e79420, - 0x15b2c: 0xe00082d2, 0x15b2d: 0x48de5820, 0x15b2e: 0x448aba20, 0x15b2f: 0x448ac220, - 0x15b30: 0x48df6220, 0x15b31: 0x48e1a420, 0x15b32: 0x448ad620, 0x15b33: 0xe000a037, - 0x15b34: 0xe0005aaf, 0x15b35: 0xe000a85d, 0x15b36: 0x430cd220, 0x15b37: 0xe00099e1, - 0x15b38: 0x430d1020, 0x15b39: 0x430e1c20, 0x15b3a: 0x430dc420, 0x15b3b: 0x430ef220, - 0x15b3c: 0xe0008b39, 0x15b3d: 0x430ed620, 0x15b3e: 0x430f0c20, 0x15b3f: 0x448bae20, - // Block 0x56d, offset 0x15b40 - 0x15b40: 0x430fc220, 0x15b41: 0x43100220, 0x15b42: 0x448bf220, 0x15b43: 0x4310c020, - 0x15b44: 0xe000842f, 0x15b45: 0x48ecce20, 0x15b46: 0x4311ae20, 0x15b47: 0x4311bc20, - 0x15b48: 0x448c6a20, 0x15b49: 0x4311f420, 0x15b4a: 0x44697620, 0x15b4b: 0x48f15c20, - 0x15b4c: 0x48f2cc20, 0x15b4d: 0x448d7c20, 0x15b4e: 0x448d8e20, 0x15b4f: 0xe0007008, - 0x15b50: 0xe000827e, 0x15b51: 0xe00065cc, 0x15b52: 0xe000743c, 0x15b53: 0x48f95020, - 0x15b54: 0xe0004a8d, 0x15b55: 0xe00068a0, 0x15b56: 0xe00049d6, 0x15b57: 0xe00050f0, - 0x15b58: 0x48fe5e20, 0x15b59: 0x48100820, 0x15b5a: 0xe00063c0, 0x15b5b: 0x431b7820, - 0x15b5c: 0x431be020, 0x15b5d: 0x4811bc20, 0x15b5e: 0x431da820, 0x15b5f: 0xe0007219, - 0x15b60: 0x490ba420, 0x15b61: 0x490bda20, 0x15b62: 0x43212820, 0x15b63: 0x4321e220, - 0x15b64: 0x43222220, 0x15b65: 0x490e5c20, 0x15b66: 0x43223620, 0x15b67: 0xe00063e0, - 0x15b68: 0xe000a311, 0x15b69: 0x4325b020, 0x15b6a: 0xe0006678, 0x15b6b: 0x4327f220, - 0x15b6c: 0x43282a20, 0x15b6d: 0x4917f420, 0x15b6e: 0xe0004476, 0x15b6f: 0x44932a20, - 0x15b70: 0x432b6e20, 0x15b71: 0x491aee20, 0x15b72: 0x4493cc20, 0x15b73: 0x432d8620, - 0x15b74: 0x42bb6420, 0x15b75: 0xe00080ca, 0x15b76: 0x49228a20, 0x15b77: 0x49243420, - 0x15b78: 0x4494dc20, 0x15b79: 0x4494ec20, 0x15b7a: 0xe0009fd5, 0x15b7b: 0x49281420, - 0x15b7c: 0x44956420, 0x15b7d: 0x49292c20, 0x15b7e: 0x43301620, 0x15b7f: 0x43301620, - // Block 0x56e, offset 0x15b80 - 0x15b80: 0x43305220, 0x15b81: 0x492b6c20, 0x15b82: 0xe00050f9, 0x15b83: 0x44966620, - 0x15b84: 0x43325220, 0x15b85: 0x43334e20, 0x15b86: 0x43338420, 0x15b87: 0x4333fc20, - 0x15b88: 0x44979c20, 0x15b89: 0x49366020, 0x15b8a: 0xe00091a9, 0x15b8b: 0x43388020, - 0x15b8c: 0x4339fa20, 0x15b8d: 0x44999c20, 0x15b8e: 0x4499da20, 0x15b8f: 0x433ace20, - 0x15b90: 0x49419c20, 0x15b91: 0x4499f020, 0x15b92: 0x49420a20, 0x15b93: 0x49441c20, - 0x15b94: 0x49452220, 0x15b95: 0xe0005df2, 0x15b96: 0x449aac20, 0x15b97: 0x433df220, - 0x15b98: 0x433dfc20, 0x15b99: 0x433e0a20, 0x15b9a: 0x433e1e20, 0x15b9b: 0x433e2c20, - 0x15b9c: 0xe00069c3, 0x15b9d: 0x494c0020, - // Block 0x56f, offset 0x15bc0 - 0x15bc0: 0xa000f202, 0x15bc1: 0x403fba21, 0x15bc2: 0x403fba20, 0x15bc3: 0x403fbc20, - 0x15bc4: 0x403fbc20, 0x15bc5: 0x403fbe20, 0x15bc6: 0x403fc020, 0x15bc7: 0x403fcc20, - 0x15bc8: 0x403fce20, 0x15bc9: 0x403fd020, 0x15bca: 0x403fd220, 0x15bcb: 0x403fd420, - 0x15bcc: 0x403fd820, 0x15bcd: 0x403fdc20, 0x15bce: 0x403fde20, 0x15bcf: 0x403fe020, - 0x15bd0: 0x403fe220, 0x15bd1: 0x403fe420, 0x15bd2: 0x403fe620, 0x15bd3: 0x403fe820, - 0x15bd4: 0x403fea20, 0x15bd5: 0xcaac3be1, 0x15bd6: 0x403fee20, 0x15bd7: 0x403ff020, - 0x15bd8: 0x403ff420, 0x15bd9: 0x403ff620, 0x15bda: 0x403ff820, 0x15bdb: 0x403ffa20, - 0x15bdc: 0x403ffc20, 0x15bdd: 0x40400220, 0x15bde: 0x40400420, 0x15bdf: 0x40400620, - 0x15be0: 0x40400820, 0x15be1: 0x40400a20, 0x15be2: 0x40400e20, 0x15be3: 0x40401020, - 0x15be4: 0x40401220, 0x15be5: 0x40401420, 0x15be6: 0x40401620, 0x15be7: 0x40401820, - 0x15be8: 0x40401a20, 0x15be9: 0xe0001830, 0x15bea: 0x40401c20, 0x15beb: 0x40401e20, - 0x15bec: 0x40402020, 0x15bed: 0x40402420, 0x15bee: 0x40402620, 0x15bef: 0x40402820, - 0x15bf0: 0x40402c20, 0x15bf1: 0xe0001839, 0x15bf2: 0x40402e20, 0x15bf3: 0x40403c20, - 0x15bf4: 0xe000a994, 0x15bf5: 0x40403220, 0x15bf6: 0x40403420, 0x15bf7: 0x40403620, - 0x15bf8: 0x40403820, 0x15bf9: 0x40403a20, 0x15bfa: 0x40404c20, 0x15bfb: 0x40404e20, - 0x15bfc: 0xa070f102, 0x15bfd: 0x40403c20, 0x15bfe: 0x40404a20, 0x15bff: 0x40405620, - // Block 0x570, offset 0x15c00 - 0x15c00: 0xa0000000, 0x15c01: 0xa0000000, 0x15c02: 0xa0000000, 0x15c03: 0xa0000000, - 0x15c04: 0xa0000000, 0x15c05: 0xa0000000, 0x15c06: 0xa0000000, 0x15c07: 0xa0000000, - 0x15c08: 0xa0000000, 0x15c09: 0x40020020, 0x15c0a: 0x40020220, 0x15c0b: 0x40020420, - 0x15c0c: 0x40020620, 0x15c0d: 0x40020820, 0x15c0e: 0xa0000000, 0x15c0f: 0xa0000000, - 0x15c10: 0xa0000000, 0x15c11: 0xa0000000, 0x15c12: 0xa0000000, 0x15c13: 0xa0000000, - 0x15c14: 0xa0000000, 0x15c15: 0xa0000000, 0x15c16: 0xa0000000, 0x15c17: 0xa0000000, - 0x15c18: 0xa0000000, 0x15c19: 0xa0000000, 0x15c1a: 0xa0000000, 0x15c1b: 0xa0000000, - 0x15c1c: 0xa0000000, 0x15c1d: 0xa0000000, 0x15c1e: 0xa0000000, 0x15c1f: 0xa0000000, - 0x15c20: 0x40021220, 0x15c21: 0x4002ba20, 0x15c22: 0x4003e020, 0x15c23: 0x4004ea20, - 0x15c24: 0x4027de20, 0x15c25: 0x4004ec20, 0x15c26: 0x4004e620, 0x15c27: 0x4003d220, - 0x15c28: 0x4003f420, 0x15c29: 0x4003f620, 0x15c2a: 0x4004d820, 0x15c2b: 0x40093820, - 0x15c2c: 0x40024020, 0x15c2d: 0x40021a20, 0x15c2e: 0x4002e420, 0x15c2f: 0x4004e220, - 0x15c30: 0x4029cc20, 0x15c31: 0x4029ce20, 0x15c32: 0x4029d020, 0x15c33: 0x4029d220, - 0x15c34: 0x4029d420, 0x15c35: 0x4029d620, 0x15c36: 0x4029d820, 0x15c37: 0x4029da20, - 0x15c38: 0x4029dc20, 0x15c39: 0x4029de20, 0x15c3a: 0x40026c20, 0x15c3b: 0x40026220, - 0x15c3c: 0x40094020, 0x15c3d: 0x40094220, 0x15c3e: 0x40094420, 0x15c3f: 0x4002c420, - // Block 0x571, offset 0x15c40 - 0x15c40: 0x4004d620, 0x15c41: 0x002bde88, 0x15c42: 0x002c0a88, 0x15c43: 0x002c3a88, - 0x15c44: 0x002c6288, 0x15c45: 0x002c9888, 0x15c46: 0x002d0888, 0x15c47: 0xcab12692, - 0x15c48: 0x002d6888, 0x15c49: 0x002d9a88, 0x15c4a: 0x002dcc88, 0x15c4b: 0xcab726c2, - 0x15c4c: 0xc0030002, 0x15c4d: 0xcac33c48, 0x15c4e: 0xcadf3daa, 0x15c4f: 0x002ee288, - 0x15c50: 0x002f2c88, 0x15c51: 0x002f5688, 0x15c52: 0x002f7a88, 0x15c53: 0xcaf409c2, - 0x15c54: 0xcafa2722, 0x15c55: 0x00306c88, 0x15c56: 0x0030be88, 0x15c57: 0x0030e288, - 0x15c58: 0x0030f688, 0x15c59: 0x00310088, 0x15c5a: 0x00312a88, 0x15c5b: 0x4003f820, - 0x15c5c: 0x4004e420, 0x15c5d: 0x4003fa20, 0x15c5e: 0x40062420, 0x15c5f: 0x40021620, - 0x15c60: 0x40061e20, 0x15c61: 0x402bde20, 0x15c62: 0x402c0a20, 0x15c63: 0x402c3a20, - 0x15c64: 0x402c6220, 0x15c65: 0x402c9820, 0x15c66: 0x402d0820, 0x15c67: 0xcaae2692, - 0x15c68: 0x402d6820, 0x15c69: 0x402d9a20, 0x15c6a: 0x402dcc20, 0x15c6b: 0xcab426c2, - 0x15c6c: 0xc0000002, 0x15c6d: 0xcaba3c48, 0x15c6e: 0xcacc3cca, 0x15c6f: 0x402ee220, - 0x15c70: 0x402f2c20, 0x15c71: 0x402f5620, 0x15c72: 0x402f7a20, 0x15c73: 0xcaf109c2, - 0x15c74: 0xcaf72722, 0x15c75: 0x40306c20, 0x15c76: 0x4030be20, 0x15c77: 0x4030e220, - 0x15c78: 0x4030f620, 0x15c79: 0x40310020, 0x15c7a: 0x40312a20, 0x15c7b: 0x4003fc20, - 0x15c7c: 0x40094820, 0x15c7d: 0x4003fe20, 0x15c7e: 0x40094c20, 0x15c7f: 0xa0000000, - // Block 0x572, offset 0x15c80 - 0x15c80: 0x402c1a20, 0x15c81: 0x002c2a88, 0x15c82: 0x002c3288, 0x15c83: 0x402c3220, - 0x15c84: 0x0031c488, 0x15c85: 0x4031c420, 0x15c86: 0x002ee2a3, 0x15c87: 0x002c4e88, - 0x15c88: 0x402c4e20, 0x15c89: 0x002c7288, 0x15c8a: 0x002c7a88, 0x15c8b: 0x002c8488, - 0x15c8c: 0x402c8420, 0x15c8d: 0xe000115c, 0x15c8e: 0x002cae88, 0x15c8f: 0x002cb888, - 0x15c90: 0x002c9a83, 0x15c91: 0x002d1688, 0x15c92: 0x402d1620, 0x15c93: 0x002d4488, - 0x15c94: 0x002d5888, 0x15c95: 0x402d7820, 0x15c96: 0x002dc288, 0x15c97: 0x002db688, - 0x15c98: 0x002e0a88, 0x15c99: 0x402e0a20, 0x15c9a: 0x402e3820, 0x15c9b: 0x402e7220, - 0x15c9c: 0x0030a088, 0x15c9d: 0x002eb488, 0x15c9e: 0x402ebc20, 0x15c9f: 0x002f1088, - 0x15ca0: 0xe0000e56, 0x15ca1: 0xe0000e53, 0x15ca2: 0x002d6088, 0x15ca3: 0x402d6020, - 0x15ca4: 0x002f3e88, 0x15ca5: 0x402f3e20, 0x15ca6: 0x002f8288, 0x15ca7: 0x0031b488, - 0x15ca8: 0x4031b420, 0x15ca9: 0x00300888, 0x15caa: 0x40301220, 0x15cab: 0x40304220, - 0x15cac: 0x00304a88, 0x15cad: 0x40304a20, 0x15cae: 0x00305288, 0x15caf: 0xe000105f, - 0x15cb0: 0xe000105c, 0x15cb1: 0x0030b488, 0x15cb2: 0x0030cc88, 0x15cb3: 0x00311888, - 0x15cb4: 0x40311820, 0x15cb5: 0x00313488, 0x15cb6: 0x40313420, 0x15cb7: 0x00316488, - 0x15cb8: 0x00316e88, 0x15cb9: 0x40316e20, 0x15cba: 0x40317820, 0x15cbb: 0x4031a620, - 0x15cbc: 0x0031bc88, 0x15cbd: 0x4031bc20, 0x15cbe: 0xe0000fc9, 0x15cbf: 0x40319420, - // Block 0x573, offset 0x15cc0 - 0x15cc0: 0x40315820, 0x15cc1: 0x0031d488, 0x15cc2: 0x4031d420, 0x15cc3: 0x002c1a88, - 0x15cc4: 0x00307c88, 0x15cc5: 0x0030da88, 0x15cc6: 0x002ca288, 0x15cc7: 0x402ca220, - 0x15cc8: 0x002dde88, 0x15cc9: 0x402dde20, 0x15cca: 0x002f6a88, 0x15ccb: 0x402f6a20, - 0x15ccc: 0x002f8e88, 0x15ccd: 0x402f8e20, 0x15cce: 0x00311088, 0x15ccf: 0x40311020, - 0x15cd0: 0x402bf020, 0x15cd1: 0x402bf820, 0x15cd2: 0x402c0220, 0x15cd3: 0x402c2a20, - 0x15cd4: 0x402ee221, 0x15cd5: 0x402c5620, 0x15cd6: 0x402c7220, 0x15cd7: 0x402c7a20, - 0x15cd8: 0x402ccc20, 0x15cd9: 0x402cb820, 0x15cda: 0x402cd420, 0x15cdb: 0x402c9a20, - 0x15cdc: 0x402cdc20, 0x15cdd: 0x402ce820, 0x15cde: 0x402cf020, 0x15cdf: 0x402dee20, - 0x15ce0: 0x402d4420, 0x15ce1: 0x402d2a20, 0x15ce2: 0x402d3220, 0x15ce3: 0x402d5820, - 0x15ce4: 0x402d0020, 0x15ce5: 0x40308820, 0x15ce6: 0x402d8020, 0x15ce7: 0x402d8e20, - 0x15ce8: 0x402db620, 0x15ce9: 0x402dc220, 0x15cea: 0x402daa20, 0x15ceb: 0x402e4220, - 0x15cec: 0x402e4a20, 0x15ced: 0x402e5420, 0x15cee: 0x402e6820, 0x15cef: 0x4030a020, - 0x15cf0: 0x4030ac20, 0x15cf1: 0x402e9020, 0x15cf2: 0x402eb420, 0x15cf3: 0x402ec820, - 0x15cf4: 0x402ea620, 0x15cf5: 0x402f1020, 0x15cf6: 0x402eee20, 0x15cf7: 0x402f1a20, - 0x15cf8: 0x402f4c20, 0x15cf9: 0x402f9820, 0x15cfa: 0x402fa220, 0x15cfb: 0x402fac20, - 0x15cfc: 0x402fb620, 0x15cfd: 0x402fbe20, 0x15cfe: 0x402fc620, 0x15cff: 0x402fd020, - // Block 0x574, offset 0x15d00 - 0x15d00: 0xa0000000, 0x15d01: 0xa0000000, 0x15d02: 0xa0000000, 0x15d03: 0xa0000000, - 0x15d04: 0xa0000000, 0x15d05: 0xa0000000, 0x15d06: 0xa0000000, 0x15d07: 0xa0000000, - 0x15d08: 0xa0000000, 0x15d09: 0x40020020, 0x15d0a: 0x40020220, 0x15d0b: 0x40020420, - 0x15d0c: 0x40020620, 0x15d0d: 0x40020820, 0x15d0e: 0xa0000000, 0x15d0f: 0xa0000000, - 0x15d10: 0xa0000000, 0x15d11: 0xa0000000, 0x15d12: 0xa0000000, 0x15d13: 0xa0000000, - 0x15d14: 0xa0000000, 0x15d15: 0xa0000000, 0x15d16: 0xa0000000, 0x15d17: 0xa0000000, - 0x15d18: 0xa0000000, 0x15d19: 0xa0000000, 0x15d1a: 0xa0000000, 0x15d1b: 0xa0000000, - 0x15d1c: 0xa0000000, 0x15d1d: 0xa0000000, 0x15d1e: 0xa0000000, 0x15d1f: 0xa0000000, - 0x15d20: 0x40021220, 0x15d21: 0x4002ba20, 0x15d22: 0x4003e020, 0x15d23: 0x4004ea20, - 0x15d24: 0x4027de20, 0x15d25: 0x4004ec20, 0x15d26: 0x4004e620, 0x15d27: 0x4003d220, - 0x15d28: 0x4003f420, 0x15d29: 0x4003f620, 0x15d2a: 0x4004d820, 0x15d2b: 0x40093820, - 0x15d2c: 0x40024020, 0x15d2d: 0x40021a20, 0x15d2e: 0x4002e420, 0x15d2f: 0x4004e220, - 0x15d30: 0x4029cc20, 0x15d31: 0x4029ce20, 0x15d32: 0x4029d020, 0x15d33: 0x4029d220, - 0x15d34: 0x4029d420, 0x15d35: 0x4029d620, 0x15d36: 0x4029d820, 0x15d37: 0x4029da20, - 0x15d38: 0x4029dc20, 0x15d39: 0x4029de20, 0x15d3a: 0x40026c20, 0x15d3b: 0x40026220, - 0x15d3c: 0x40094020, 0x15d3d: 0x40094220, 0x15d3e: 0x40094420, 0x15d3f: 0x4002c420, - // Block 0x575, offset 0x15d40 - 0x15d40: 0x4004d620, 0x15d41: 0xcb030be1, 0x15d42: 0x002c0a88, 0x15d43: 0xc3350991, - 0x15d44: 0x002c6288, 0x15d45: 0xcb083ea1, 0x15d46: 0x002d0888, 0x15d47: 0x002d2288, - 0x15d48: 0x002d6888, 0x15d49: 0xcb0d0be1, 0x15d4a: 0x002dcc88, 0x15d4b: 0x002dfe88, - 0x15d4c: 0xc0030002, 0x15d4d: 0x002e8288, 0x15d4e: 0x002e9e88, 0x15d4f: 0x002ee288, - 0x15d50: 0x002f2c88, 0x15d51: 0x002f5688, 0x15d52: 0x002f7a88, 0x15d53: 0xc3430991, - 0x15d54: 0x00302c88, 0x15d55: 0xcb123ed1, 0x15d56: 0x0030be88, 0x15d57: 0x0030e288, - 0x15d58: 0x0030f688, 0x15d59: 0x002d9ac3, 0x15d5a: 0xc3630991, 0x15d5b: 0x4003f820, - 0x15d5c: 0x4004e420, 0x15d5d: 0x4003fa20, 0x15d5e: 0x40062420, 0x15d5f: 0x40021620, - 0x15d60: 0x40061e20, 0x15d61: 0xcb010be1, 0x15d62: 0x402c0a20, 0x15d63: 0xc3330991, - 0x15d64: 0x402c6220, 0x15d65: 0xcb053ea1, 0x15d66: 0x402d0820, 0x15d67: 0x402d2220, - 0x15d68: 0x402d6820, 0x15d69: 0xcb0b0be1, 0x15d6a: 0x402dcc20, 0x15d6b: 0x402dfe20, - 0x15d6c: 0xc0000002, 0x15d6d: 0x402e8220, 0x15d6e: 0x402e9e20, 0x15d6f: 0x402ee220, - 0x15d70: 0x402f2c20, 0x15d71: 0x402f5620, 0x15d72: 0x402f7a20, 0x15d73: 0xc3410991, - 0x15d74: 0x40302c20, 0x15d75: 0xcb0f3ed1, 0x15d76: 0x4030be20, 0x15d77: 0x4030e220, - 0x15d78: 0x4030f620, 0x15d79: 0x402d9a22, 0x15d7a: 0xc3610991, 0x15d7b: 0x4003fc20, - 0x15d7c: 0x40094820, 0x15d7d: 0x4003fe20, 0x15d7e: 0x40094c20, 0x15d7f: 0xa0000000, - // Block 0x576, offset 0x15d80 - 0x15d80: 0xe00008f5, 0x15d81: 0xe00008ef, 0x15d82: 0xe0000921, 0x15d83: 0xe0000969, - 0x15d84: 0xe000095b, 0x15d85: 0xe000094d, 0x15d86: 0xe00009dd, 0x15d87: 0xe0000a53, - 0x15d88: 0xe0000ae8, 0x15d89: 0xe0000ae2, 0x15d8a: 0xe0000af4, 0x15d8b: 0xe0000b20, - 0x15d8c: 0xe0000c2b, 0x15d8d: 0xe0000c25, 0x15d8e: 0xe0000c37, 0x15d8f: 0xe0000c43, - 0x15d90: 0xe0000ab3, 0x15d91: 0xe0000d63, 0x15d92: 0xe0000d9a, 0x15d93: 0xe0000d94, - 0x15d94: 0xe0000da6, 0x15d95: 0xe0000de6, 0x15d96: 0xe0000dd2, 0x15d97: 0x40093e20, - 0x15d98: 0xe0000e12, 0x15d99: 0xe0000fe1, 0x15d9a: 0xe0000fdb, 0x15d9b: 0xe0000fed, - 0x15d9c: 0xe0000fff, 0x15d9d: 0xe000a99a, 0x15d9e: 0x00318888, 0x15d9f: 0xe0000f7b, - 0x15da0: 0xe00008f2, 0x15da1: 0xe00008ec, 0x15da2: 0xe000091e, 0x15da3: 0xe0000966, - 0x15da4: 0xe0000958, 0x15da5: 0xe000094a, 0x15da6: 0xe00009d5, 0x15da7: 0xe0000a4d, - 0x15da8: 0xe0000ae5, 0x15da9: 0xe0000adf, 0x15daa: 0xe0000af1, 0x15dab: 0xe0000b1d, - 0x15dac: 0xe0000c28, 0x15dad: 0xe0000c22, 0x15dae: 0xe0000c34, 0x15daf: 0xe0000c40, - 0x15db0: 0xe0000aad, 0x15db1: 0xe0000d60, 0x15db2: 0xe0000d97, 0x15db3: 0xe0000d91, - 0x15db4: 0xe0000da3, 0x15db5: 0xe0000de3, 0x15db6: 0xe0000dcf, 0x15db7: 0x40093c20, - 0x15db8: 0xe0000e0f, 0x15db9: 0xe0000fde, 0x15dba: 0xe0000fd8, 0x15dbb: 0xe0000fea, - 0x15dbc: 0xe0000ffc, 0x15dbd: 0xe000a997, 0x15dbe: 0x40318820, 0x15dbf: 0xe000a9ac, - // Block 0x577, offset 0x15dc0 - 0x15dc0: 0xe0000983, 0x15dc1: 0xe0000980, 0x15dc2: 0xe00008fb, 0x15dc3: 0xe00008f8, - 0x15dc4: 0x002bdea3, 0x15dc5: 0x402bde21, 0x15dc6: 0xe0000a38, 0x15dc7: 0xe0000a35, - 0x15dc8: 0xe0000a3e, 0x15dc9: 0xe0000a3b, 0x15dca: 0xe0000a4a, 0x15dcb: 0xe0000a47, - 0x15dcc: 0x002c3c83, 0x15dcd: 0x402c3c20, 0x15dce: 0xe0000a86, 0x15dcf: 0xe0000a83, - 0x15dd0: 0xe0000aaa, 0x15dd1: 0xe0000aa7, 0x15dd2: 0xe0000b46, 0x15dd3: 0xe0000b43, - 0x15dd4: 0xe0000aee, 0x15dd5: 0xe0000aeb, 0x15dd6: 0x002c98c3, 0x15dd7: 0x402c9822, - 0x15dd8: 0x002c98a3, 0x15dd9: 0x402c9821, 0x15dda: 0xe0000b1a, 0x15ddb: 0xe0000b17, - 0x15ddc: 0xe0000bb8, 0x15ddd: 0xe0000bb5, 0x15dde: 0xe0000bb2, 0x15ddf: 0xe0000baf, - 0x15de0: 0xe0000bc4, 0x15de1: 0xe0000bc1, 0x15de2: 0xe0000bca, 0x15de3: 0xe0000bc7, - 0x15de4: 0xe0000bee, 0x15de5: 0xe0000beb, 0x15de6: 0xe0000c1b, 0x15de7: 0xe0000c18, - 0x15de8: 0xe0000c51, 0x15de9: 0xe0000c4e, 0x15dea: 0xe0000c60, 0x15deb: 0xe0000c5d, - 0x15dec: 0xe0000c31, 0x15ded: 0xe0000c2e, 0x15dee: 0x002d9aa3, 0x15def: 0x402d9a21, - 0x15df0: 0xe0000c54, 0x15df1: 0x402da220, 0x15df2: 0xf0000a0a, 0x15df3: 0xf0000404, - 0x15df4: 0xe0000c8a, 0x15df5: 0xe0000c87, 0x15df6: 0xe0000c9f, 0x15df7: 0xe0000c9c, - 0x15df8: 0x402f7220, 0x15df9: 0xe0000ccc, 0x15dfa: 0xe0000cc9, 0x15dfb: 0xe0000cd8, - 0x15dfc: 0xe0000cd5, 0x15dfd: 0xe0000cd2, 0x15dfe: 0xe0000ccf, 0x15dff: 0xe0000d04, - // Block 0x578, offset 0x15e00 - 0x15e00: 0xe0000cfe, 0x15e01: 0xe0000cf8, 0x15e02: 0xe0000cf5, 0x15e03: 0xe0000d51, - 0x15e04: 0xe0000d4e, 0x15e05: 0xe0000d6f, 0x15e06: 0xe0000d6c, 0x15e07: 0xe0000d5d, - 0x15e08: 0xe0000d5a, 0x15e09: 0xf0000404, 0x15e0a: 0x002eda88, 0x15e0b: 0x402eda20, - 0x15e0c: 0xe0000e2e, 0x15e0d: 0xe0000e2b, 0x15e0e: 0xe0000da0, 0x15e0f: 0xe0000d9d, - 0x15e10: 0xe0000de0, 0x15e11: 0xe0000ddd, 0x15e12: 0xe0000e93, 0x15e13: 0xe0000e8f, - 0x15e14: 0xe0000eca, 0x15e15: 0xe0000ec7, 0x15e16: 0xe0000edc, 0x15e17: 0xe0000ed9, - 0x15e18: 0xe0000ed0, 0x15e19: 0xe0000ecd, 0x15e1a: 0xe0000f1f, 0x15e1b: 0xe0000f1c, - 0x15e1c: 0xe0000f2d, 0x15e1d: 0xe0000f2a, 0x15e1e: 0xe0000f47, 0x15e1f: 0xe0000f44, - 0x15e20: 0x002fe883, 0x15e21: 0x402fe820, 0x15e22: 0xe0000f99, 0x15e23: 0xe0000f96, - 0x15e24: 0xe0000f8a, 0x15e25: 0xe0000f87, 0x15e26: 0x00303688, 0x15e27: 0x40303620, - 0x15e28: 0xe000102b, 0x15e29: 0xe0001028, 0x15e2a: 0x00306cc3, 0x15e2b: 0x40306c22, - 0x15e2c: 0xe0000fe7, 0x15e2d: 0xe0000fe4, 0x15e2e: 0xe0000ff9, 0x15e2f: 0xe0000ff6, - 0x15e30: 0xe0001025, 0x15e31: 0xe0001022, 0x15e32: 0x00306ca3, 0x15e33: 0x40306c21, - 0x15e34: 0xe00010d8, 0x15e35: 0xe00010d5, 0x15e36: 0xe000a9a6, 0x15e37: 0xe000a9a3, - 0x15e38: 0xe000a9af, 0x15e39: 0xe000113b, 0x15e3a: 0xe0001138, 0x15e3b: 0xe000114d, - 0x15e3c: 0xe000114a, 0x15e3d: 0x00312c83, 0x15e3e: 0x40312c20, 0x15e3f: 0xe0000f64, - // Block 0x579, offset 0x15e40 - 0x15e40: 0x40321220, 0x15e41: 0x40321a20, 0x15e42: 0x40322220, 0x15e43: 0x40322a20, - 0x15e44: 0xe0000ad5, 0x15e45: 0xe0000ad1, 0x15e46: 0xe0000acd, 0x15e47: 0xf0000a0a, - 0x15e48: 0xf000040a, 0x15e49: 0xf0000404, 0x15e4a: 0xf0000a0a, 0x15e4b: 0xf000040a, - 0x15e4c: 0xf0000404, 0x15e4d: 0xe0000947, 0x15e4e: 0xe0000944, 0x15e4f: 0xe0000c3d, - 0x15e50: 0xe0000c3a, 0x15e51: 0xe0000dcc, 0x15e52: 0xe0000dc9, 0x15e53: 0xe0000ff3, - 0x15e54: 0xe0000ff0, 0x15e55: 0xe000a9d3, 0x15e56: 0xe000a9d0, 0x15e57: 0xe0001006, - 0x15e58: 0xe0001002, 0x15e59: 0xe0001016, 0x15e5a: 0xe0001012, 0x15e5b: 0xe000100e, - 0x15e5c: 0xe000100a, 0x15e5d: 0x402cae20, 0x15e5e: 0xe0000962, 0x15e5f: 0xe000095e, - 0x15e60: 0xe0000976, 0x15e61: 0xe0000972, 0x15e62: 0xe00009f4, 0x15e63: 0xe00009ef, - 0x15e64: 0x002d3a88, 0x15e65: 0x402d3a20, 0x15e66: 0xe0000bbe, 0x15e67: 0xe0000bbb, - 0x15e68: 0xe0000c99, 0x15e69: 0xe0000c96, 0x15e6a: 0xe0000e20, 0x15e6b: 0xe0000e1d, - 0x15e6c: 0xe0000e27, 0x15e6d: 0xe0000e23, 0x15e6e: 0xe0001162, 0x15e6f: 0xe000115f, - 0x15e70: 0xe0000c8d, 0x15e71: 0xf0000a0a, 0x15e72: 0xf000040a, 0x15e73: 0xf0000404, - 0x15e74: 0xe0000bac, 0x15e75: 0xe0000ba9, 0x15e76: 0x002d7888, 0x15e77: 0x00319488, - 0x15e78: 0xe0000d57, 0x15e79: 0xe0000d54, 0x15e7a: 0xe0000954, 0x15e7b: 0xe0000950, - 0x15e7c: 0xe00009ea, 0x15e7d: 0xe00009e5, 0x15e7e: 0xe0000e19, 0x15e7f: 0xe0000e15, - // Block 0x57a, offset 0x15e80 - 0x15e80: 0xe000098f, 0x15e81: 0xe000098c, 0x15e82: 0xe0000995, 0x15e83: 0xe0000992, - 0x15e84: 0xe0000b62, 0x15e85: 0xe0000b5f, 0x15e86: 0xe0000b68, 0x15e87: 0xe0000b65, - 0x15e88: 0xe0000c6c, 0x15e89: 0xe0000c69, 0x15e8a: 0xe0000c72, 0x15e8b: 0xe0000c6f, - 0x15e8c: 0xe0000e4a, 0x15e8d: 0xe0000e47, 0x15e8e: 0xe0000e50, 0x15e8f: 0xe0000e4d, - 0x15e90: 0xe0000ee8, 0x15e91: 0xe0000ee5, 0x15e92: 0xe0000eee, 0x15e93: 0xe0000eeb, - 0x15e94: 0xe0001053, 0x15e95: 0xe0001050, 0x15e96: 0xe0001059, 0x15e97: 0xe0001056, - 0x15e98: 0xe0000f61, 0x15e99: 0xe0000f5e, 0x15e9a: 0xe0000fa5, 0x15e9b: 0xe0000fa2, - 0x15e9c: 0x00312288, 0x15e9d: 0x40312220, 0x15e9e: 0xe0000bf4, 0x15e9f: 0xe0000bf1, - 0x15ea0: 0x002ebc88, 0x15ea1: 0x402c8c20, 0x15ea2: 0x002f2288, 0x15ea3: 0x402f2220, - 0x15ea4: 0x00314088, 0x15ea5: 0x40314020, 0x15ea6: 0xe000096f, 0x15ea7: 0xe000096c, - 0x15ea8: 0xe0000b32, 0x15ea9: 0xe0000b2f, 0x15eaa: 0xe0000dd9, 0x15eab: 0xe0000dd5, - 0x15eac: 0xe0000dfd, 0x15ead: 0xe0000df9, 0x15eae: 0xe0000e04, 0x15eaf: 0xe0000e01, - 0x15eb0: 0xe0000e0b, 0x15eb1: 0xe0000e07, 0x15eb2: 0xe000a9c1, 0x15eb3: 0xe000a9be, - 0x15eb4: 0x402e5e20, 0x15eb5: 0x402ed020, 0x15eb6: 0x40305a20, 0x15eb7: 0x402dd420, - 0x15eb8: 0xe0000abf, 0x15eb9: 0xe0000ec4, 0x15eba: 0x002be888, 0x15ebb: 0x002c4488, - 0x15ebc: 0x402c4420, 0x15ebd: 0x002e3888, 0x15ebe: 0x00303e88, 0x15ebf: 0x402ffc20, - // Block 0x57b, offset 0x15ec0 - 0x15ec0: 0xae603502, 0x15ec1: 0xae603202, 0x15ec2: 0xae603c02, 0x15ec3: 0xae604e02, - 0x15ec4: 0xae605b02, 0x15ec5: 0xae606302, 0x15ec6: 0xae603702, 0x15ec7: 0xcafd3e71, - 0x15ec8: 0xae604702, 0x15ec9: 0xae606402, 0x15eca: 0xae604302, 0x15ecb: 0xae604d02, - 0x15ecc: 0xae604102, 0x15ecd: 0xae605f02, 0x15ece: 0xae605f02, 0x15ecf: 0xae606502, - 0x15ed0: 0xae606602, 0x15ed1: 0xae606702, 0x15ed2: 0xae605f02, 0x15ed3: 0xae602202, - 0x15ed4: 0xae602a02, 0x15ed5: 0xae805f02, 0x15ed6: 0xadc06002, 0x15ed7: 0xadc06002, - 0x15ed8: 0xadc06002, 0x15ed9: 0xadc06002, 0x15eda: 0xae805f02, 0x15edb: 0xad806802, - 0x15edc: 0xadc06002, 0x15edd: 0xadc06002, 0x15ede: 0xadc06002, 0x15edf: 0xadc06002, - 0x15ee0: 0xadc06002, 0x15ee1: 0xaca06e02, 0x15ee2: 0xaca06f02, 0x15ee3: 0xadc07002, - 0x15ee4: 0xadc07502, 0x15ee5: 0xadc07602, 0x15ee6: 0xadc07702, 0x15ee7: 0xaca05602, - 0x15ee8: 0xaca05902, 0x15ee9: 0xadc06002, 0x15eea: 0xadc06002, 0x15eeb: 0xadc06002, - 0x15eec: 0xadc06002, 0x15eed: 0xadc07802, 0x15eee: 0xadc07902, 0x15eef: 0xadc06002, - 0x15ef0: 0xadc07a02, 0x15ef1: 0xadc07b02, 0x15ef2: 0xadc02102, 0x15ef3: 0xadc06002, - 0x15ef4: 0xa0107c02, 0x15ef5: 0xa0107d02, 0x15ef6: 0xa0106102, 0x15ef7: 0xa0106102, - 0x15ef8: 0xa0105402, 0x15ef9: 0xadc07e02, 0x15efa: 0xadc06002, 0x15efb: 0xadc06002, - 0x15efc: 0xadc06002, 0x15efd: 0xae605f02, 0x15efe: 0xae605f02, 0x15eff: 0xae605f02, - // Block 0x57c, offset 0x15f00 - 0x15f00: 0xe0000d24, 0x15f01: 0xe0000d21, 0x15f02: 0xe0000d2a, 0x15f03: 0xe0000d27, - 0x15f04: 0xe0000d69, 0x15f05: 0xe0000d66, 0x15f06: 0xe0000d7b, 0x15f07: 0xe0000d78, - 0x15f08: 0xe0000d87, 0x15f09: 0xe0000d84, 0x15f0a: 0xe0000d81, 0x15f0b: 0xe0000d7e, - 0x15f0c: 0xe0000ded, 0x15f0d: 0xe0000de9, 0x15f0e: 0xe0000df5, 0x15f0f: 0xe0000df1, - 0x15f10: 0xe0000e3d, 0x15f11: 0xe0000e39, 0x15f12: 0xe0000e35, 0x15f13: 0xe0000e31, - 0x15f14: 0xe0000ea7, 0x15f15: 0xe0000ea4, 0x15f16: 0xe0000ead, 0x15f17: 0xe0000eaa, - 0x15f18: 0xe0000ed6, 0x15f19: 0xe0000ed3, 0x15f1a: 0xe0000ef4, 0x15f1b: 0xe0000ef1, - 0x15f1c: 0xe0000efb, 0x15f1d: 0xe0000ef7, 0x15f1e: 0xe0000f02, 0x15f1f: 0xe0000eff, - 0x15f20: 0xe0000f41, 0x15f21: 0xe0000f3e, 0x15f22: 0xe0000f53, 0x15f23: 0xe0000f50, - 0x15f24: 0xe0000f26, 0x15f25: 0xe0000f22, 0x15f26: 0xe000296a, 0x15f27: 0xe0002967, - 0x15f28: 0xe0000f5a, 0x15f29: 0xe0000f56, 0x15f2a: 0xe0000f93, 0x15f2b: 0xe0000f90, - 0x15f2c: 0xe0000f9f, 0x15f2d: 0xe0000f9c, 0x15f2e: 0xe0000fb1, 0x15f2f: 0xe0000fae, - 0x15f30: 0xe0000fab, 0x15f31: 0xe0000fa8, 0x15f32: 0xe0001093, 0x15f33: 0xe0001090, - 0x15f34: 0xe000109f, 0x15f35: 0xe000109c, 0x15f36: 0xe0001099, 0x15f37: 0xe0001096, - 0x15f38: 0xe0001032, 0x15f39: 0xe000102e, 0x15f3a: 0xe000a9d3, 0x15f3b: 0xe000a9d0, - 0x15f3c: 0xe00010a9, 0x15f3d: 0xe00010a6, 0x15f3e: 0xe00010af, 0x15f3f: 0xe00010ac, - // Block 0x57d, offset 0x15f40 - 0x15f40: 0xe00010d2, 0x15f41: 0xe00010cf, 0x15f42: 0xe00010cc, 0x15f43: 0xe00010c9, - 0x15f44: 0xe00010e1, 0x15f45: 0xe00010de, 0x15f46: 0xe00010e7, 0x15f47: 0xe00010e4, - 0x15f48: 0xe00010ed, 0x15f49: 0xe00010ea, 0x15f4a: 0xe00010fc, 0x15f4b: 0xe00010f9, - 0x15f4c: 0xe00010f6, 0x15f4d: 0xe00010f3, 0x15f4e: 0xe000a9bb, 0x15f4f: 0xe000a9b8, - 0x15f50: 0xe0001141, 0x15f51: 0xe000113e, 0x15f52: 0xe0001153, 0x15f53: 0xe0001150, - 0x15f54: 0xe0001159, 0x15f55: 0xe0001156, 0x15f56: 0xe0000c15, 0x15f57: 0xe0000f8d, - 0x15f58: 0xe00010db, 0x15f59: 0xe000a9a9, 0x15f5a: 0xf0000404, 0x15f5b: 0xe0000f70, - 0x15f5c: 0x40300420, 0x15f5d: 0x40300620, 0x15f5e: 0xe0000f7f, 0x15f5f: 0x402c9620, - 0x15f60: 0xe000099b, 0x15f61: 0xe0000998, 0x15f62: 0xe0000989, 0x15f63: 0xe0000986, - 0x15f64: 0xe0000928, 0x15f65: 0xe0000924, 0x15f66: 0xe0000930, 0x15f67: 0xe000092c, - 0x15f68: 0xe0000940, 0x15f69: 0xe000093c, 0x15f6a: 0xe0000938, 0x15f6b: 0xe0000934, - 0x15f6c: 0xe00009aa, 0x15f6d: 0xe00009a6, 0x15f6e: 0xe0000902, 0x15f6f: 0xe00008fe, - 0x15f70: 0xe000090a, 0x15f71: 0xe0000906, 0x15f72: 0xe000091a, 0x15f73: 0xe0000916, - 0x15f74: 0xe0000912, 0x15f75: 0xe000090e, 0x15f76: 0xe00009a2, 0x15f77: 0xe000099e, - 0x15f78: 0xe0000b6e, 0x15f79: 0xe0000b6b, 0x15f7a: 0xe0000b5c, 0x15f7b: 0xe0000b59, - 0x15f7c: 0xe0000b26, 0x15f7d: 0xe0000b23, 0x15f7e: 0xe0000afb, 0x15f7f: 0xe0000af7, - // Block 0x57e, offset 0x15f80 - 0x15f80: 0xe0000b03, 0x15f81: 0xe0000aff, 0x15f82: 0xe0000b13, 0x15f83: 0xe0000b0f, - 0x15f84: 0xe0000b0b, 0x15f85: 0xe0000b07, 0x15f86: 0xe0000b75, 0x15f87: 0xe0000b71, - 0x15f88: 0xe0000c66, 0x15f89: 0xe0000c63, 0x15f8a: 0xe0000c78, 0x15f8b: 0xe0000c75, - 0x15f8c: 0xe0000e84, 0x15f8d: 0xe0000e81, 0x15f8e: 0xe0000e44, 0x15f8f: 0xe0000e41, - 0x15f90: 0xe0000dad, 0x15f91: 0xe0000da9, 0x15f92: 0xe0000db5, 0x15f93: 0xe0000db1, - 0x15f94: 0xe0000dc5, 0x15f95: 0xe0000dc1, 0x15f96: 0xe0000dbd, 0x15f97: 0xe0000db9, - 0x15f98: 0xe0000e8b, 0x15f99: 0xe0000e87, 0x15f9a: 0xe0000e5d, 0x15f9b: 0xe0000e59, - 0x15f9c: 0xe0000e65, 0x15f9d: 0xe0000e61, 0x15f9e: 0xe0000e75, 0x15f9f: 0xe0000e71, - 0x15fa0: 0xe0000e6d, 0x15fa1: 0xe0000e69, 0x15fa2: 0xe0000e7d, 0x15fa3: 0xe0000e79, - 0x15fa4: 0xe000108d, 0x15fa5: 0xe000108a, 0x15fa6: 0xe000104d, 0x15fa7: 0xe000104a, - 0x15fa8: 0xe0001066, 0x15fa9: 0xe0001062, 0x15faa: 0xe000106e, 0x15fab: 0xe000106a, - 0x15fac: 0xe000107e, 0x15fad: 0xe000107a, 0x15fae: 0xe0001076, 0x15faf: 0xe0001072, - 0x15fb0: 0xe0001086, 0x15fb1: 0xe0001082, 0x15fb2: 0xe000a9a0, 0x15fb3: 0xe000a99d, - 0x15fb4: 0xe000a9cd, 0x15fb5: 0xe000a9ca, 0x15fb6: 0xe000a9c7, 0x15fb7: 0xe000a9c4, - 0x15fb8: 0xe000a9b5, 0x15fb9: 0xe000a9b2, 0x15fba: 0xe0000d0a, 0x15fbb: 0xe0000d07, - 0x15fbc: 0x0030d888, 0x15fbd: 0x4030d820, 0x15fbe: 0x00312088, 0x15fbf: 0x40312020, - // Block 0x57f, offset 0x15fc0 - 0x15fc0: 0xe0000024, 0x15fc1: 0xe0000029, 0x15fc2: 0xe000002e, 0x15fc3: 0xe0000033, - 0x15fc4: 0xe0000038, 0x15fc5: 0xe000003d, 0x15fc6: 0xe0000042, 0x15fc7: 0xe0000047, - 0x15fc8: 0xf0001f04, 0x15fc9: 0xf0001f04, 0x15fca: 0xf0001f04, 0x15fcb: 0xf0001f04, - 0x15fcc: 0xf0001f04, 0x15fcd: 0xf0001f04, 0x15fce: 0xf0001f04, 0x15fcf: 0xf0001f04, - 0x15fd0: 0xf0001f04, 0x15fd1: 0xf0000404, 0x15fd2: 0xf0000404, 0x15fd3: 0xf0000404, - 0x15fd4: 0xf0000404, 0x15fd5: 0xf0000404, 0x15fd6: 0xf0000404, 0x15fd7: 0xf0000404, - 0x15fd8: 0xf0000404, 0x15fd9: 0xf0000404, 0x15fda: 0xf0000404, 0x15fdb: 0xf0000404, - 0x15fdc: 0xf0000404, 0x15fdd: 0xf0000404, 0x15fde: 0xf0000404, 0x15fdf: 0xf0000404, - 0x15fe0: 0xf0000404, 0x15fe1: 0xf0000404, 0x15fe2: 0xf0000404, 0x15fe3: 0xf0000404, - 0x15fe4: 0xf0000404, 0x15fe5: 0xf0000404, 0x15fe6: 0xf0000404, 0x15fe7: 0xf0000404, - 0x15fe8: 0xf0000404, 0x15fe9: 0xf0000404, 0x15fea: 0xf0000404, 0x15feb: 0xf0000404, - 0x15fec: 0xf0000404, 0x15fed: 0xf0000404, 0x15fee: 0xf0000404, 0x15fef: 0xf0000404, - 0x15ff0: 0xf0000404, 0x15ff1: 0xf0000404, 0x15ff2: 0xf0000404, 0x15ff3: 0xf0000404, - 0x15ff4: 0xe0002c4e, 0x15ff5: 0xf0000404, 0x15ff6: 0x002bde8c, 0x15ff7: 0x002c0a8c, - 0x15ff8: 0x002c3a8c, 0x15ff9: 0x002c628c, 0x15ffa: 0x002c988c, 0x15ffb: 0x002d088c, - 0x15ffc: 0x002d228c, 0x15ffd: 0x002d688c, 0x15ffe: 0x002d9a8c, 0x15fff: 0x002dcc8c, - // Block 0x580, offset 0x16000 - 0x16000: 0xf0001d1c, 0x16001: 0xf0001d1d, 0x16002: 0xe00009b7, 0x16003: 0xf0001c1d, - 0x16004: 0xf0001c1c, 0x16005: 0xf0001c1c, 0x16006: 0xe0000a66, 0x16007: 0xe0000a7a, - 0x16008: 0xf0001d1c, 0x16009: 0xe0003576, 0x1600a: 0xf0001c1c, 0x1600b: 0xf0001d1d, - 0x1600c: 0xf0001c1c, 0x1600d: 0xf0001d1d, 0x1600e: 0xf0001d1d, 0x1600f: 0xf0001c1c, - 0x16010: 0xf0001c1c, 0x16011: 0xf0001c1c, 0x16012: 0xe0000d0d, 0x16013: 0xf0001c1c, - 0x16014: 0xf0001c1c, 0x16015: 0xe0000d3a, 0x16016: 0xe0000d46, 0x16017: 0xf0001d1d, - 0x16018: 0xe0000eb0, 0x16019: 0xe0000eb8, 0x1601a: 0xf0001d1d, 0x1601b: 0xf0001c1c, - 0x1601c: 0xf0001c1d, 0x1601d: 0xf0001c1d, 0x1601e: 0xe00010b2, 0x1601f: 0xe00009c8, - 0x16020: 0xf0001f04, 0x16021: 0xf0001f04, 0x16022: 0xf0001f04, 0x16023: 0xf0001f04, - 0x16024: 0xf0001f04, 0x16025: 0xf0001f04, 0x16026: 0xf0001f04, 0x16027: 0xf0001f04, - 0x16028: 0xf0001f04, 0x16029: 0xf0000404, 0x1602a: 0xf0000404, 0x1602b: 0xf0000404, - 0x1602c: 0xf0000404, 0x1602d: 0xf0000404, 0x1602e: 0xf0000404, 0x1602f: 0xf0000404, - 0x16030: 0xf0000404, 0x16031: 0xf0000404, 0x16032: 0xf0000404, 0x16033: 0xf0000404, - 0x16034: 0xf0000404, 0x16035: 0xf0000404, 0x16036: 0xf0000404, 0x16037: 0xf0000404, - 0x16038: 0xf0000404, 0x16039: 0xf0000404, 0x1603a: 0xf0000404, 0x1603b: 0xf0000404, - 0x1603c: 0xf0000404, 0x1603d: 0xf0000404, 0x1603e: 0xf0000404, 0x1603f: 0xe0000bdf, - // Block 0x581, offset 0x16040 - 0x16040: 0xf0001f04, 0x16041: 0xf0001f04, 0x16042: 0xf0001f04, 0x16043: 0xf0001f04, - 0x16044: 0xf0001f04, 0x16045: 0xf0001f04, 0x16046: 0xf0001f04, 0x16047: 0xf0001f04, - 0x16048: 0xf0001f04, 0x16049: 0xf0001f04, 0x1604a: 0xf0001f04, - 0x16050: 0xf0000a04, 0x16051: 0xf0000a04, 0x16052: 0xf0000a04, 0x16053: 0xf0000a04, - 0x16054: 0xf0000a04, 0x16055: 0xf0000a04, 0x16056: 0xf0000a04, 0x16057: 0xf0000a04, - 0x16058: 0xf0000a04, 0x16059: 0xf0000a04, 0x1605a: 0xf0000a04, 0x1605b: 0xf0000a04, - 0x1605c: 0xf0000a04, 0x1605d: 0xf0000a04, 0x1605e: 0xf0000a04, 0x1605f: 0xf0000a04, - 0x16060: 0xf0000a04, 0x16061: 0xf0000a04, 0x16062: 0xf0000a04, 0x16063: 0xf0000a04, - 0x16064: 0xf0000a04, 0x16065: 0xf0000a04, 0x16066: 0xf0000a04, 0x16067: 0xf0000a04, - 0x16068: 0xe0002c52, 0x16069: 0xf0000a04, 0x1606a: 0xf0000a04, 0x1606b: 0x002c3a8c, - 0x1606c: 0x002f7a8c, 0x1606d: 0xf0000c0c, 0x1606e: 0xf0000c0c, - 0x16070: 0x002bde9d, 0x16071: 0x002c0a9d, 0x16072: 0x002c3a9d, 0x16073: 0x002c629d, - 0x16074: 0x002c989d, 0x16075: 0x002d089d, 0x16076: 0x002d229d, 0x16077: 0x002d689d, - 0x16078: 0x002d9a9d, 0x16079: 0x002dcc9d, 0x1607a: 0x002dfe9d, 0x1607b: 0x002e229d, - 0x1607c: 0x002e829d, 0x1607d: 0x002e9e9d, 0x1607e: 0x002ee29d, 0x1607f: 0x002f2c9d, - // Block 0x582, offset 0x16080 - 0x16080: 0xa0000000, 0x16081: 0xa0000000, 0x16082: 0xa0000000, 0x16083: 0xa0000000, - 0x16084: 0xa0000000, 0x16085: 0xa0000000, 0x16086: 0xa0000000, 0x16087: 0xa0000000, - 0x16088: 0xa0000000, 0x16089: 0x40020020, 0x1608a: 0x40020220, 0x1608b: 0x40020420, - 0x1608c: 0x40020620, 0x1608d: 0x40020820, 0x1608e: 0xa0000000, 0x1608f: 0xa0000000, - 0x16090: 0xa0000000, 0x16091: 0xa0000000, 0x16092: 0xa0000000, 0x16093: 0xa0000000, - 0x16094: 0xa0000000, 0x16095: 0xa0000000, 0x16096: 0xa0000000, 0x16097: 0xa0000000, - 0x16098: 0xa0000000, 0x16099: 0xa0000000, 0x1609a: 0xa0000000, 0x1609b: 0xa0000000, - 0x1609c: 0xa0000000, 0x1609d: 0xa0000000, 0x1609e: 0xa0000000, 0x1609f: 0xa0000000, - 0x160a0: 0x40021220, 0x160a1: 0x4002ba20, 0x160a2: 0x4003e020, 0x160a3: 0x4004ea20, - 0x160a4: 0x4027de20, 0x160a5: 0x4004ec20, 0x160a6: 0x4004e620, 0x160a7: 0x4003d220, - 0x160a8: 0x4003f420, 0x160a9: 0x4003f620, 0x160aa: 0x4004d820, 0x160ab: 0x40093820, - 0x160ac: 0x40024020, 0x160ad: 0x40021a20, 0x160ae: 0x4002e420, 0x160af: 0x4004e220, - 0x160b0: 0x4029cc20, 0x160b1: 0x4029ce20, 0x160b2: 0x4029d020, 0x160b3: 0x4029d220, - 0x160b4: 0x4029d420, 0x160b5: 0x4029d620, 0x160b6: 0x4029d820, 0x160b7: 0x4029da20, - 0x160b8: 0x4029dc20, 0x160b9: 0x4029de20, 0x160ba: 0x40026c20, 0x160bb: 0x40026220, - 0x160bc: 0x40094020, 0x160bd: 0x40094220, 0x160be: 0x40094420, 0x160bf: 0x4002c420, - // Block 0x583, offset 0x160c0 - 0x160c0: 0x4004d620, 0x160c1: 0x002bde88, 0x160c2: 0x002c0a88, 0x160c3: 0xcb170991, - 0x160c4: 0x002c6288, 0x160c5: 0x002c9888, 0x160c6: 0x002d0888, 0x160c7: 0xcb1b0911, - 0x160c8: 0x002d6888, 0x160c9: 0x002d9a88, 0x160ca: 0x002dcc88, 0x160cb: 0xcb1f0911, - 0x160cc: 0xcb253f03, 0x160cd: 0x002e8288, 0x160ce: 0xcb2b0911, 0x160cf: 0x002ee288, - 0x160d0: 0x002f2c88, 0x160d1: 0x002f5688, 0x160d2: 0xcb2f0911, 0x160d3: 0xcb330991, - 0x160d4: 0x00302c88, 0x160d5: 0x00306c88, 0x160d6: 0x0030be88, 0x160d7: 0x0030e288, - 0x160d8: 0x0030f688, 0x160d9: 0x00310088, 0x160da: 0xcb370991, 0x160db: 0x4003f820, - 0x160dc: 0x4004e420, 0x160dd: 0x4003fa20, 0x160de: 0x40062420, 0x160df: 0x40021620, - 0x160e0: 0x40061e20, 0x160e1: 0x402bde20, 0x160e2: 0x402c0a20, 0x160e3: 0xcb150991, - 0x160e4: 0x402c6220, 0x160e5: 0x402c9820, 0x160e6: 0x402d0820, 0x160e7: 0xcb190911, - 0x160e8: 0x402d6820, 0x160e9: 0x402d9a20, 0x160ea: 0x402dcc20, 0x160eb: 0xcb1d0911, - 0x160ec: 0xcb213f03, 0x160ed: 0x402e8220, 0x160ee: 0xcb290911, 0x160ef: 0x402ee220, - 0x160f0: 0x402f2c20, 0x160f1: 0x402f5620, 0x160f2: 0xcb2d0911, 0x160f3: 0xcb310991, - 0x160f4: 0x40302c20, 0x160f5: 0x40306c20, 0x160f6: 0x4030be20, 0x160f7: 0x4030e220, - 0x160f8: 0x4030f620, 0x160f9: 0x40310020, 0x160fa: 0xcb350991, 0x160fb: 0x4003fc20, - 0x160fc: 0x40094820, 0x160fd: 0x4003fe20, 0x160fe: 0x40094c20, 0x160ff: 0xa0000000, - // Block 0x584, offset 0x16100 - 0x16100: 0xe0000983, 0x16101: 0xe0000980, 0x16102: 0xe00008fb, 0x16103: 0xe00008f8, - 0x16104: 0xe000097d, 0x16105: 0xe000097a, 0x16106: 0xe0000a38, 0x16107: 0xe0000a35, - 0x16108: 0xe0000a3e, 0x16109: 0xe0000a3b, 0x1610a: 0xe0000a4a, 0x1610b: 0xe0000a47, - 0x1610c: 0x002c6083, 0x1610d: 0x402c6020, 0x1610e: 0xe0000a86, 0x1610f: 0xe0000a83, - 0x16110: 0xe0000aaa, 0x16111: 0xe0000aa7, 0x16112: 0xe0000b46, 0x16113: 0xe0000b43, - 0x16114: 0xe0000aee, 0x16115: 0xe0000aeb, 0x16116: 0xe0000b2c, 0x16117: 0xe0000b29, - 0x16118: 0xe0000b40, 0x16119: 0xe0000b3d, 0x1611a: 0xe0000b1a, 0x1611b: 0xe0000b17, - 0x1611c: 0xe0000bb8, 0x1611d: 0xe0000bb5, 0x1611e: 0xe0000bb2, 0x1611f: 0xe0000baf, - 0x16120: 0xe0000bc4, 0x16121: 0xe0000bc1, 0x16122: 0x002d6683, 0x16123: 0x402d6620, - 0x16124: 0xe0000bee, 0x16125: 0xe0000beb, 0x16126: 0xe0000c1b, 0x16127: 0xe0000c18, - 0x16128: 0xe0000c51, 0x16129: 0xe0000c4e, 0x1612a: 0xe0000c60, 0x1612b: 0xe0000c5d, - 0x1612c: 0xe0000c31, 0x1612d: 0xe0000c2e, 0x1612e: 0xe0000c5a, 0x1612f: 0xe0000c57, - 0x16130: 0xe0000c54, 0x16131: 0x402da220, 0x16132: 0xf0000a0a, 0x16133: 0xf0000404, - 0x16134: 0xe0000c8a, 0x16135: 0xe0000c87, 0x16136: 0x002e2083, 0x16137: 0x402e2020, - 0x16138: 0x402f7220, 0x16139: 0xe0000ccc, 0x1613a: 0xe0000cc9, 0x1613b: 0x002e8083, - 0x1613c: 0x402e8020, 0x1613d: 0xe0000cd2, 0x1613e: 0xe0000ccf, 0x1613f: 0xe0000d04, - // Block 0x585, offset 0x16140 - 0x16140: 0xe0000cfe, 0x16141: 0xe0000cf8, 0x16142: 0xe0000cf5, 0x16143: 0xe0000d51, - 0x16144: 0xe0000d4e, 0x16145: 0x002ee083, 0x16146: 0x402ee020, 0x16147: 0xe0000d5d, - 0x16148: 0xe0000d5a, 0x16149: 0xf0000404, 0x1614a: 0x002eda88, 0x1614b: 0x402eda20, - 0x1614c: 0xe0000e2e, 0x1614d: 0xe0000e2b, 0x1614e: 0xe0000da0, 0x1614f: 0xe0000d9d, - 0x16150: 0xe0000de0, 0x16151: 0xe0000ddd, 0x16152: 0xe0000e93, 0x16153: 0xe0000e8f, - 0x16154: 0xe0000eca, 0x16155: 0xe0000ec7, 0x16156: 0x002fe483, 0x16157: 0x402fe420, - 0x16158: 0xe0000ed0, 0x16159: 0xe0000ecd, 0x1615a: 0xe0000f1f, 0x1615b: 0xe0000f1c, - 0x1615c: 0xe0000f2d, 0x1615d: 0xe0000f2a, 0x1615e: 0xe0000f47, 0x1615f: 0xe0000f44, - 0x16160: 0x00302a83, 0x16161: 0x40302a20, 0x16162: 0xe0000f99, 0x16163: 0xe0000f96, - 0x16164: 0xe0000f8a, 0x16165: 0xe0000f87, 0x16166: 0x00303688, 0x16167: 0x40303620, - 0x16168: 0xe000102b, 0x16169: 0xe0001028, 0x1616a: 0xe000103f, 0x1616b: 0xe000103c, - 0x1616c: 0xe0000fe7, 0x1616d: 0xe0000fe4, 0x1616e: 0xe0000ff9, 0x1616f: 0xe0000ff6, - 0x16170: 0xe0001025, 0x16171: 0xe0001022, 0x16172: 0xe0001039, 0x16173: 0xe0001036, - 0x16174: 0xe00010d8, 0x16175: 0xe00010d5, 0x16176: 0xe000110e, 0x16177: 0xe000110b, - 0x16178: 0xe0001117, 0x16179: 0xe000113b, 0x1617a: 0xe0001138, 0x1617b: 0xe000114d, - 0x1617c: 0xe000114a, 0x1617d: 0x00316283, 0x1617e: 0x40316220, 0x1617f: 0xe0000f64, - // Block 0x586, offset 0x16180 - 0x16180: 0xe0000d24, 0x16181: 0xe0000d21, 0x16182: 0xe0000d2a, 0x16183: 0xe0000d27, - 0x16184: 0xe0000d69, 0x16185: 0xe0000d66, 0x16186: 0xe0000d7b, 0x16187: 0xe0000d78, - 0x16188: 0xe0000d87, 0x16189: 0xe0000d84, 0x1618a: 0xe0000d81, 0x1618b: 0xe0000d7e, - 0x1618c: 0xe0000ded, 0x1618d: 0xe0000de9, 0x1618e: 0xe0000df5, 0x1618f: 0xe0000df1, - 0x16190: 0xe0000e3d, 0x16191: 0xe0000e39, 0x16192: 0xe0000e35, 0x16193: 0xe0000e31, - 0x16194: 0xe0000ea7, 0x16195: 0xe0000ea4, 0x16196: 0xe0000ead, 0x16197: 0xe0000eaa, - 0x16198: 0xe0000ed6, 0x16199: 0xe0000ed3, 0x1619a: 0xe0000ef4, 0x1619b: 0xe0000ef1, - 0x1619c: 0xe0000efb, 0x1619d: 0xe0000ef7, 0x1619e: 0xe0000f02, 0x1619f: 0xe0000eff, - 0x161a0: 0xe0000f41, 0x161a1: 0xe0000f3e, 0x161a2: 0xe0000f53, 0x161a3: 0xe0000f50, - 0x161a4: 0xe0000f26, 0x161a5: 0xe0000f22, 0x161a6: 0xe000a9d9, 0x161a7: 0xe000a9d6, - 0x161a8: 0xe0000f5a, 0x161a9: 0xe0000f56, 0x161aa: 0xe0000f93, 0x161ab: 0xe0000f90, - 0x161ac: 0xe0000f9f, 0x161ad: 0xe0000f9c, 0x161ae: 0xe0000fb1, 0x161af: 0xe0000fae, - 0x161b0: 0xe0000fab, 0x161b1: 0xe0000fa8, 0x161b2: 0xe0001093, 0x161b3: 0xe0001090, - 0x161b4: 0xe000109f, 0x161b5: 0xe000109c, 0x161b6: 0xe0001099, 0x161b7: 0xe0001096, - 0x161b8: 0xe0001032, 0x161b9: 0xe000102e, 0x161ba: 0xe0001046, 0x161bb: 0xe0001042, - 0x161bc: 0xe00010a9, 0x161bd: 0xe00010a6, 0x161be: 0xe00010af, 0x161bf: 0xe00010ac, - // Block 0x587, offset 0x161c0 - 0x161c2: 0xe000a9f1, 0x161c3: 0xa000f402, - 0x161c5: 0x40440220, 0x161c6: 0x40440420, 0x161c7: 0x40440620, - 0x161c8: 0x40440820, 0x161c9: 0x40440a20, 0x161ca: 0x40440c20, 0x161cb: 0x40440e20, - 0x161cc: 0x40441220, 0x161ce: 0x40441620, 0x161cf: 0x40441820, - 0x161d0: 0x40441a20, 0x161d2: 0x40441c20, 0x161d3: 0x40441e20, - 0x161d4: 0x40442020, 0x161d5: 0xcb393f61, 0x161d6: 0x40442420, 0x161d7: 0x40442620, - 0x161d8: 0x40442820, 0x161d9: 0x40442a20, 0x161da: 0x40442c20, 0x161db: 0x40442e20, - 0x161dc: 0x40443020, 0x161dd: 0x40443220, 0x161de: 0x40443420, 0x161df: 0x40443620, - 0x161e0: 0x40443820, 0x161e1: 0x40443a20, 0x161e2: 0x40443c20, 0x161e3: 0xcb3b3fc1, - 0x161e4: 0x40444020, 0x161e5: 0x40444220, 0x161e6: 0x40444420, 0x161e7: 0x40444620, - 0x161e8: 0xcb3f3f61, 0x161e9: 0x40444a20, 0x161ea: 0x40444c20, 0x161eb: 0x40444e20, - 0x161ec: 0x40445020, 0x161ed: 0x40445220, 0x161ee: 0x40445420, 0x161ef: 0x40445620, - 0x161f0: 0xcb413f61, 0x161f1: 0x40446a20, 0x161f2: 0xcb433f61, 0x161f3: 0xcb453f61, - 0x161f4: 0x40446820, 0x161f5: 0x40445c20, 0x161f6: 0x40445e20, 0x161f7: 0x40446020, - 0x161f8: 0x40446220, 0x161f9: 0x40446420, 0x161fa: 0x40446c20, - 0x161fd: 0xa000f502, 0x161fe: 0x40447020, 0x161ff: 0x40447220, - // Block 0x588, offset 0x16200 - 0x16200: 0x40447420, 0x16201: 0x40447620, 0x16202: 0x40447820, 0x16203: 0x40447a20, - 0x16204: 0x40447c20, 0x16206: 0xcb4703b1, 0x16207: 0xc0760401, - 0x16208: 0x40448620, 0x1620a: 0x40448820, 0x1620b: 0x40448a20, - 0x1620c: 0x00448c83, 0x1620d: 0x82092248, 0x1620e: 0xe000186c, - 0x16217: 0x40448c20, - 0x16220: 0x40441020, 0x16221: 0x40441420, 0x16222: 0x40447e20, 0x16223: 0x40448020, - 0x16226: 0xe0000185, 0x16227: 0xe0000216, - 0x16228: 0xe0000331, 0x16229: 0xe000040b, 0x1622a: 0xe00004e0, 0x1622b: 0xe00005aa, - 0x1622c: 0xe0000675, 0x1622d: 0xe000071d, 0x1622e: 0xe00007c9, 0x1622f: 0xe000086e, - 0x16230: 0x40285a20, 0x16231: 0x40285c20, 0x16232: 0x40285e20, 0x16233: 0x40286020, - 0x16234: 0x40286220, 0x16235: 0x40286420, - 0x16239: 0x40074e20, 0x1623a: 0xe000a9e5, 0x1623b: 0xcb3d4031, - 0x1623c: 0xe000a9f7, 0x1623d: 0xe000a9fd, 0x1623e: 0xe000aa03, 0x1623f: 0xe000a9df, - // Block 0x589, offset 0x16240 - 0x16240: 0xa000f202, 0x16241: 0x403fba21, 0x16242: 0x403fba20, 0x16243: 0x403fbc20, - 0x16244: 0x403fbc20, 0x16245: 0x403fbe20, 0x16246: 0x403fc020, 0x16247: 0x403fcc20, - 0x16248: 0x403fce20, 0x16249: 0x403fd020, 0x1624a: 0x403fd220, 0x1624b: 0x403fd420, - 0x1624c: 0x403fd820, 0x1624d: 0x403fdc20, 0x1624e: 0x403fde20, 0x1624f: 0x403fe020, - 0x16250: 0x403fe220, 0x16251: 0x403fe420, 0x16252: 0x403fe620, 0x16253: 0x403fe820, - 0x16254: 0x403fea20, 0x16255: 0xcaac3be1, 0x16256: 0x403fee20, 0x16257: 0x403ff020, - 0x16258: 0x403ff420, 0x16259: 0x403ff620, 0x1625a: 0x403ff820, 0x1625b: 0x403ffa20, - 0x1625c: 0xcb4a4061, 0x1625d: 0x40400220, 0x1625e: 0x40400420, 0x1625f: 0x40400620, - 0x16260: 0x40400820, 0x16261: 0x40400a20, 0x16262: 0x40400e20, 0x16263: 0x40401020, - 0x16264: 0x40401220, 0x16265: 0x40401420, 0x16266: 0x40401620, 0x16267: 0x40401820, - 0x16268: 0x40401a20, 0x16269: 0xe0001830, 0x1626a: 0x40401c20, 0x1626b: 0x40401e20, - 0x1626c: 0x40402020, 0x1626d: 0x40402420, 0x1626e: 0x40402620, 0x1626f: 0x40402820, - 0x16270: 0x40402c20, 0x16271: 0xe0001839, 0x16272: 0x40402e20, 0x16273: 0x40403c20, - 0x16274: 0xe000a994, 0x16275: 0x40403220, 0x16276: 0x40403420, 0x16277: 0x40403620, - 0x16278: 0x40403820, 0x16279: 0x40403a20, 0x1627a: 0x40404c20, 0x1627b: 0x40404e20, - 0x1627c: 0xa070f102, 0x1627d: 0x40403c20, 0x1627e: 0x40404a20, 0x1627f: 0x40405620, - // Block 0x58a, offset 0x16280 - 0x16280: 0xa0000000, 0x16281: 0xa0000000, 0x16282: 0xa0000000, 0x16283: 0xa0000000, - 0x16284: 0xa0000000, 0x16285: 0xa0000000, 0x16286: 0xa0000000, 0x16287: 0xa0000000, - 0x16288: 0xa0000000, 0x16289: 0x40020020, 0x1628a: 0x40020220, 0x1628b: 0x40020420, - 0x1628c: 0x40020620, 0x1628d: 0x40020820, 0x1628e: 0xa0000000, 0x1628f: 0xa0000000, - 0x16290: 0xa0000000, 0x16291: 0xa0000000, 0x16292: 0xa0000000, 0x16293: 0xa0000000, - 0x16294: 0xa0000000, 0x16295: 0xa0000000, 0x16296: 0xa0000000, 0x16297: 0xa0000000, - 0x16298: 0xa0000000, 0x16299: 0xa0000000, 0x1629a: 0xa0000000, 0x1629b: 0xa0000000, - 0x1629c: 0xa0000000, 0x1629d: 0xa0000000, 0x1629e: 0xa0000000, 0x1629f: 0xa0000000, - 0x162a0: 0x40021220, 0x162a1: 0x4002ba20, 0x162a2: 0x4003e020, 0x162a3: 0x4004ea20, - 0x162a4: 0x4027de20, 0x162a5: 0x4004ec20, 0x162a6: 0x4004e620, 0x162a7: 0x4003d220, - 0x162a8: 0x4003f420, 0x162a9: 0x4003f620, 0x162aa: 0x4004d820, 0x162ab: 0x40093820, - 0x162ac: 0x40024020, 0x162ad: 0x40021a20, 0x162ae: 0x4002e420, 0x162af: 0x4004e220, - 0x162b0: 0x4029cc20, 0x162b1: 0x4029ce20, 0x162b2: 0x4029d020, 0x162b3: 0x4029d220, - 0x162b4: 0x4029d420, 0x162b5: 0x4029d620, 0x162b6: 0x4029d820, 0x162b7: 0x4029da20, - 0x162b8: 0x4029dc20, 0x162b9: 0x4029de20, 0x162ba: 0x40026c20, 0x162bb: 0x40026220, - 0x162bc: 0x40094020, 0x162bd: 0x40094220, 0x162be: 0x40094420, 0x162bf: 0x4002c420, - // Block 0x58b, offset 0x162c0 - 0x162c0: 0x4004d620, 0x162c1: 0x002bde88, 0x162c2: 0x002c0a88, 0x162c3: 0xcb4c0931, - 0x162c4: 0x002c6288, 0x162c5: 0x002c9888, 0x162c6: 0x002d0888, 0x162c7: 0xcb5040c2, - 0x162c8: 0x002d6888, 0x162c9: 0x002d9a88, 0x162ca: 0x002dcc88, 0x162cb: 0x002dfe88, - 0x162cc: 0xc0030002, 0x162cd: 0x002e8288, 0x162ce: 0x002e9e88, 0x162cf: 0x002ee288, - 0x162d0: 0x002f2c88, 0x162d1: 0x002f5688, 0x162d2: 0x002f7a88, 0x162d3: 0x002fe688, - 0x162d4: 0x00302c88, 0x162d5: 0x00306c88, 0x162d6: 0x0030be88, 0x162d7: 0x0030e288, - 0x162d8: 0x0030f688, 0x162d9: 0x00310088, 0x162da: 0xcb580931, 0x162db: 0x4003f820, - 0x162dc: 0x4004e420, 0x162dd: 0x4003fa20, 0x162de: 0x40062420, 0x162df: 0x40021620, - 0x162e0: 0x40061e20, 0x162e1: 0x402bde20, 0x162e2: 0x402c0a20, 0x162e3: 0xcb4e0931, - 0x162e4: 0x402c6220, 0x162e5: 0x402c9820, 0x162e6: 0x402d0820, 0x162e7: 0xcb5440c2, - 0x162e8: 0x402d6820, 0x162e9: 0x402d9a20, 0x162ea: 0x402dcc20, 0x162eb: 0x402dfe20, - 0x162ec: 0xc0000002, 0x162ed: 0x402e8220, 0x162ee: 0x402e9e20, 0x162ef: 0x402ee220, - 0x162f0: 0x402f2c20, 0x162f1: 0x402f5620, 0x162f2: 0x402f7a20, 0x162f3: 0x402fe620, - 0x162f4: 0x40302c20, 0x162f5: 0x40306c20, 0x162f6: 0x4030be20, 0x162f7: 0x4030e220, - 0x162f8: 0x4030f620, 0x162f9: 0x40310020, 0x162fa: 0xcb5a0931, 0x162fb: 0x4003fc20, - 0x162fc: 0x40094820, 0x162fd: 0x4003fe20, 0x162fe: 0x40094c20, 0x162ff: 0xa0000000, - // Block 0x58c, offset 0x16300 - 0x16300: 0xe0000983, 0x16301: 0xe0000980, 0x16302: 0xe00008fb, 0x16303: 0xe00008f8, - 0x16304: 0xe000097d, 0x16305: 0xe000097a, 0x16306: 0xe0000a38, 0x16307: 0xe0000a35, - 0x16308: 0xe0000a3e, 0x16309: 0xe0000a3b, 0x1630a: 0x402c3820, 0x1630b: 0x002c3883, - 0x1630c: 0xe0000a44, 0x1630d: 0xe0000a41, 0x1630e: 0xe0000a86, 0x1630f: 0xe0000a83, - 0x16310: 0xe0000aaa, 0x16311: 0xe0000aa7, 0x16312: 0xe0000b46, 0x16313: 0xe0000b43, - 0x16314: 0xe0000aee, 0x16315: 0xe0000aeb, 0x16316: 0xe0000b2c, 0x16317: 0xe0000b29, - 0x16318: 0xe0000b40, 0x16319: 0xe0000b3d, 0x1631a: 0xe0000b1a, 0x1631b: 0xe0000b17, - 0x1631c: 0xe0000bb8, 0x1631d: 0xe0000bb5, 0x1631e: 0xe0000bb2, 0x1631f: 0xe0000baf, - 0x16320: 0x402d2020, 0x16321: 0x002d2083, 0x16322: 0xe0000bca, 0x16323: 0xe0000bc7, - 0x16324: 0xe0000bee, 0x16325: 0xe0000beb, 0x16326: 0x402d9820, 0x16327: 0x002d9883, - 0x16328: 0xe0000c51, 0x16329: 0xe0000c4e, 0x1632a: 0xe0000c60, 0x1632b: 0xe0000c5d, - 0x1632c: 0xe0000c31, 0x1632d: 0xe0000c2e, 0x1632e: 0xe0000c5a, 0x1632f: 0xe0000c57, - 0x16330: 0xe0000c54, 0x16331: 0x402da220, 0x16332: 0xf0000a0a, 0x16333: 0xf0000404, - 0x16334: 0xe0000c8a, 0x16335: 0xe0000c87, 0x16336: 0xe0000c9f, 0x16337: 0xe0000c9c, - 0x16338: 0x402f7220, 0x16339: 0xe0000ccc, 0x1633a: 0xe0000cc9, 0x1633b: 0xe0000cd8, - 0x1633c: 0xe0000cd5, 0x1633d: 0xe0000cd2, 0x1633e: 0xe0000ccf, 0x1633f: 0xe0000d04, - // Block 0x58d, offset 0x16340 - 0x16340: 0xe0000cfe, 0x16341: 0xe0000cf8, 0x16342: 0xe0000cf5, 0x16343: 0xe0000d51, - 0x16344: 0xe0000d4e, 0x16345: 0xe0000d6f, 0x16346: 0xe0000d6c, 0x16347: 0xe0000d5d, - 0x16348: 0xe0000d5a, 0x16349: 0xf0000404, 0x1634a: 0x002eda88, 0x1634b: 0x402eda20, - 0x1634c: 0xe0000e2e, 0x1634d: 0xe0000e2b, 0x1634e: 0xe0000da0, 0x1634f: 0xe0000d9d, - 0x16350: 0xe0000de0, 0x16351: 0xe0000ddd, 0x16352: 0xe0000e93, 0x16353: 0xe0000e8f, - 0x16354: 0xe0000eca, 0x16355: 0xe0000ec7, 0x16356: 0xe0000edc, 0x16357: 0xe0000ed9, - 0x16358: 0xe0000ed0, 0x16359: 0xe0000ecd, 0x1635a: 0xe0000f1f, 0x1635b: 0xe0000f1c, - 0x1635c: 0xe0000f2d, 0x1635d: 0xe0000f2a, 0x1635e: 0xe0000f47, 0x1635f: 0xe0000f44, - 0x16360: 0xe0000f33, 0x16361: 0xe0000f30, 0x16362: 0xe0000f99, 0x16363: 0xe0000f96, - 0x16364: 0xe0000f8a, 0x16365: 0xe0000f87, 0x16366: 0x00303688, 0x16367: 0x40303620, - 0x16368: 0xe000102b, 0x16369: 0xe0001028, 0x1636a: 0xe000103f, 0x1636b: 0xe000103c, - 0x1636c: 0xe0000fe7, 0x1636d: 0xe0000fe4, 0x1636e: 0xe0000ff9, 0x1636f: 0xe0000ff6, - 0x16370: 0xe0001025, 0x16371: 0xe0001022, 0x16372: 0xe0001039, 0x16373: 0xe0001036, - 0x16374: 0xe00010d8, 0x16375: 0xe00010d5, 0x16376: 0xe000110e, 0x16377: 0xe000110b, - 0x16378: 0xe0001117, 0x16379: 0xe000113b, 0x1637a: 0xe0001138, 0x1637b: 0x40312820, - 0x1637c: 0x00312883, 0x1637d: 0xe0001147, 0x1637e: 0xe0001144, 0x1637f: 0xe0000f64, - // Block 0x58e, offset 0x16380 - 0x16380: 0xe00009bc, 0x16381: 0xe00009c0, 0x16382: 0x002c3a8b, 0x16383: 0xf0000a04, - 0x16384: 0x40081c20, 0x16385: 0xe0000a5e, 0x16386: 0xe0000a62, 0x16387: 0x002cc28a, - 0x16388: 0x40081e20, 0x16389: 0xf0000a04, 0x1638a: 0x002d2285, 0x1638b: 0x002d688b, - 0x1638c: 0x002d688b, 0x1638d: 0x002d688b, 0x1638e: 0x002d6885, 0x1638f: 0xe000aa06, - 0x16390: 0x002d9a8b, 0x16391: 0x002d9a8b, 0x16392: 0x002e228b, 0x16393: 0x002e2285, - 0x16394: 0x40082020, 0x16395: 0x002e9e8b, 0x16396: 0xf000040a, 0x16397: 0x40082220, - 0x16398: 0x40082420, 0x16399: 0x002f2c8b, 0x1639a: 0x002f568b, 0x1639b: 0x002f7a8b, - 0x1639c: 0x002f7a8b, 0x1639d: 0x002f7a8b, 0x1639e: 0x40082620, 0x1639f: 0x40082820, - 0x163a0: 0xf0001414, 0x163a1: 0xe0000fbd, 0x163a2: 0xf0001414, 0x163a3: 0x40082a20, - 0x163a4: 0x00312a8b, 0x163a5: 0x40082c20, 0x163a6: 0x0032a288, 0x163a7: 0x40082e20, - 0x163a8: 0x00312a8b, 0x163a9: 0x40083020, 0x163aa: 0x002dfe88, 0x163ab: 0xe000094d, - 0x163ac: 0x002c0a8b, 0x163ad: 0x002c3a8b, 0x163ae: 0x40083220, 0x163af: 0x002c9885, - 0x163b0: 0x002c988b, 0x163b1: 0x002d088b, 0x163b2: 0x002d1e88, 0x163b3: 0x002e828b, - 0x163b4: 0x002ee285, 0x163b5: 0x00389084, 0x163b6: 0x00389284, 0x163b7: 0x00389484, - 0x163b8: 0x00389684, 0x163b9: 0x002d9a85, 0x163ba: 0x40083420, 0x163bb: 0xe0000b95, - 0x163bc: 0x00327e85, 0x163bd: 0x00325685, 0x163be: 0x0032568b, 0x163bf: 0x00327e8b, - // Block 0x58f, offset 0x163c0 - 0x163f8: 0xe000aa09, 0x163f9: 0xe0000e97, 0x163fa: 0x4030a820, 0x163fb: 0x402d2020, - 0x163fc: 0x402f4a20, 0x163fd: 0x402e9820, 0x163fe: 0x402db220, 0x163ff: 0x402e9a20, - // Block 0x590, offset 0x16400 - 0x16400: 0xcd3882c1, 0x16401: 0xce0382c1, 0x16402: 0xce0682c1, 0x16403: 0xce0b82c1, - 0x16404: 0xce0e9581, 0x16405: 0xce1182c1, 0x16406: 0xce1482c1, 0x16407: 0xce1782c1, - 0x16408: 0xce1a95e1, 0x16409: 0xce1c82c1, 0x1640a: 0xce1f82c1, 0x1640b: 0xce2282c1, - 0x1640c: 0xce2582c1, 0x1640d: 0xce2882c1, 0x1640e: 0xce2b82c1, 0x1640f: 0xce2e82c1, - 0x16410: 0xce3182c1, 0x16411: 0xcb5c4101, 0x16412: 0xce3482c1, 0x16413: 0xce3782c1, - 0x16414: 0xcb604201, 0x16415: 0xce3a82c1, 0x16416: 0xce3d82c1, 0x16417: 0xce4082c1, - 0x16418: 0xce4382c1, 0x16419: 0xce4682c1, 0x1641a: 0xce4982c1, 0x1641b: 0xce4c82c1, - 0x1641c: 0xcb6442d1, 0x1641d: 0xce4f95e1, 0x1641e: 0xcb6b44d1, 0x1641f: 0xce5182c1, - 0x16420: 0xce5495e1, 0x16421: 0xce5695e1, 0x16422: 0x404ec420, 0x16423: 0xe000aa45, - 0x16424: 0xe000aa4b, 0x16425: 0xcb6f4571, 0x16426: 0xe000aa55, 0x16427: 0xe000aa58, - 0x16428: 0xe000aa5b, 0x16429: 0xcb7245e1, 0x1642a: 0xe000ad32, 0x1642b: 0xcd7c82f1, - 0x1642c: 0xcd3b82f1, 0x1642d: 0xccb17051, 0x1642e: 0x404eea20, 0x1642f: 0xcdbd8bc1, - 0x16430: 0x404ef420, 0x16431: 0xcbeb5561, 0x16432: 0x404f0620, 0x16433: 0x404eec20, - 0x16434: 0x404f0a20, 0x16435: 0x404f0220, 0x16436: 0x404f0c20, 0x16437: 0xce099551, - 0x16438: 0x404f3020, 0x16439: 0x8209278a, 0x1643a: 0x8209278b, 0x1643b: 0xce589611, - 0x1643c: 0xce5c9611, 0x1643d: 0xce609681, 0x1643e: 0x40510e20, 0x1643f: 0xe000aa41, - // Block 0x591, offset 0x16440 - 0x16440: 0xe00001ac, 0x16441: 0xe0000240, 0x16442: 0xe0000358, 0x16443: 0xe0000432, - 0x16444: 0xe0000507, 0x16445: 0xe00005d1, 0x16446: 0xe000069c, 0x16447: 0xe0000744, - 0x16448: 0xe00007f0, 0x16449: 0xe0000895, 0x1644a: 0x40032220, 0x1644b: 0x40032420, - 0x1644c: 0xe000aa19, 0x1644d: 0xe000aa20, 0x1644e: 0xcb694441, 0x1644f: 0xe000aa48, - 0x16450: 0x404ea020, 0x16451: 0x404ea220, 0x16452: 0x404ece20, 0x16453: 0x404ed020, - 0x16454: 0x404ed220, 0x16455: 0x404ed420, 0x16456: 0x404ef620, 0x16457: 0x404ef820, - 0x16458: 0x404efa20, 0x16459: 0x404efc20, 0x1645a: 0x404e2620, 0x1645b: 0x404e3c20, - 0x1645c: 0x404eb820, 0x1645d: 0x404eba20, 0x1645e: 0x40510020, 0x1645f: 0x40510220, - 0x16460: 0x40510820, 0x16461: 0x404e4020, 0x16462: 0x404f0c20, 0x16463: 0x404f1820, - 0x16464: 0x404f1a20, 0x16465: 0x404ea420, 0x16466: 0x404ec020, 0x16467: 0x404f0e20, - 0x16468: 0x404f1020, 0x16469: 0x404f1c20, 0x1646a: 0x404f1e20, 0x1646b: 0x404f2020, - 0x1646c: 0x404f2220, 0x1646d: 0x404f2420, 0x1646e: 0x404e5c20, 0x1646f: 0x404ebc20, - 0x16470: 0x404ebe20, 0x16471: 0x404ee820, 0x16472: 0x404ee220, 0x16473: 0x404ef020, - 0x16474: 0x404ef220, 0x16475: 0x404e1620, 0x16476: 0x404e1a20, 0x16477: 0x404e1e20, - 0x16478: 0x404e2a20, 0x16479: 0x404e3620, 0x1647a: 0x404e4420, 0x1647b: 0x404e6420, - 0x1647c: 0x404e6c20, 0x1647d: 0x404e7620, 0x1647e: 0x404e7820, 0x1647f: 0x404e8020, - // Block 0x592, offset 0x16480 - 0x16480: 0x404e9e20, 0x16481: 0x404eac20, 0x16482: 0x40510c20, 0x16483: 0x404ee020, - 0x16484: 0x404f0020, 0x16485: 0x404f0420, 0x16486: 0x404f1220, 0x16487: 0x404f2620, - 0x16488: 0x404f2a20, 0x16489: 0x404f2e20, 0x1648a: 0x404f3020, 0x1648b: 0x404f2820, - 0x1648c: 0x404f2c20, 0x1648d: 0xadc11302, 0x1648e: 0x404e7c20, 0x1648f: 0x404f3220, - 0x16490: 0xe00001af, 0x16491: 0xe0000243, 0x16492: 0xe000035b, 0x16493: 0xe0000435, - 0x16494: 0xe000050a, 0x16495: 0xe00005d4, 0x16496: 0xe000069f, 0x16497: 0xe0000747, - 0x16498: 0xe00007f3, 0x16499: 0xe0000898, 0x1649a: 0x404f3420, 0x1649b: 0x404f3620, - 0x1649c: 0x404ee420, 0x1649d: 0x404f0820, 0x1649e: 0x4007a820, 0x1649f: 0x4007aa20, - 0x164a0: 0x00379888, 0x164a1: 0x00379c88, 0x164a2: 0x0037a088, 0x164a3: 0x0037a488, - 0x164a4: 0x0037a888, 0x164a5: 0x0037ac88, 0x164a6: 0x0037b088, 0x164a7: 0x0037b888, - 0x164a8: 0x0037bc88, 0x164a9: 0x0037c088, 0x164aa: 0x0037c488, 0x164ab: 0x0037c888, - 0x164ac: 0x0037cc88, 0x164ad: 0x0037d488, 0x164ae: 0x0037d888, 0x164af: 0x0037dc88, - 0x164b0: 0x0037e088, 0x164b1: 0x0037e488, 0x164b2: 0x0037e888, 0x164b3: 0x0037f088, - 0x164b4: 0x0037f488, 0x164b5: 0x0037f888, 0x164b6: 0x0037fc88, 0x164b7: 0x00380088, - 0x164b8: 0x00380488, 0x164b9: 0x00380888, 0x164ba: 0x00380c88, 0x164bb: 0x00381088, - 0x164bc: 0x00381488, 0x164bd: 0x00381888, 0x164be: 0x00381c88, 0x164bf: 0x00382488, - // Block 0x593, offset 0x164c0 - 0x164c0: 0xa0000000, 0x164c1: 0xa0000000, 0x164c2: 0xa0000000, 0x164c3: 0xa0000000, - 0x164c4: 0xa0000000, 0x164c5: 0xa0000000, 0x164c6: 0xa0000000, 0x164c7: 0xa0000000, - 0x164c8: 0xa0000000, 0x164c9: 0x40020020, 0x164ca: 0x40020220, 0x164cb: 0x40020420, - 0x164cc: 0x40020620, 0x164cd: 0x40020820, 0x164ce: 0xa0000000, 0x164cf: 0xa0000000, - 0x164d0: 0xa0000000, 0x164d1: 0xa0000000, 0x164d2: 0xa0000000, 0x164d3: 0xa0000000, - 0x164d4: 0xa0000000, 0x164d5: 0xa0000000, 0x164d6: 0xa0000000, 0x164d7: 0xa0000000, - 0x164d8: 0xa0000000, 0x164d9: 0xa0000000, 0x164da: 0xa0000000, 0x164db: 0xa0000000, - 0x164dc: 0xa0000000, 0x164dd: 0xa0000000, 0x164de: 0xa0000000, 0x164df: 0xa0000000, - 0x164e0: 0x40021220, 0x164e1: 0x4002ba20, 0x164e2: 0x4003e020, 0x164e3: 0x4004ea20, - 0x164e4: 0x4027de20, 0x164e5: 0x4004ec20, 0x164e6: 0x4004e620, 0x164e7: 0x4003d220, - 0x164e8: 0x4003f420, 0x164e9: 0x4003f620, 0x164ea: 0x4004d820, 0x164eb: 0x40093820, - 0x164ec: 0x40024020, 0x164ed: 0x40021a20, 0x164ee: 0x4002e420, 0x164ef: 0x4004e220, - 0x164f0: 0x4029cc20, 0x164f1: 0x4029ce20, 0x164f2: 0x4029d020, 0x164f3: 0x4029d220, - 0x164f4: 0x4029d420, 0x164f5: 0x4029d620, 0x164f6: 0x4029d820, 0x164f7: 0x4029da20, - 0x164f8: 0x4029dc20, 0x164f9: 0x4029de20, 0x164fa: 0x40026c20, 0x164fb: 0x40026220, - 0x164fc: 0x40094020, 0x164fd: 0x40094220, 0x164fe: 0x40094420, 0x164ff: 0x4002c420, - // Block 0x594, offset 0x16500 - 0x16500: 0x4004d620, 0x16501: 0xce660b93, 0x16502: 0x002c0a88, 0x16503: 0x002c3a88, - 0x16504: 0x002c6288, 0x16505: 0xc39e0be1, 0x16506: 0x002d0888, 0x16507: 0x002d2288, - 0x16508: 0x002d6888, 0x16509: 0x002d9a88, 0x1650a: 0x002dcc88, 0x1650b: 0x002dfe88, - 0x1650c: 0xc0030002, 0x1650d: 0x002e8288, 0x1650e: 0x002e9e88, 0x1650f: 0xc3a30b21, - 0x16510: 0x002f2c88, 0x16511: 0x002f5688, 0x16512: 0x002f7a88, 0x16513: 0x002fe688, - 0x16514: 0x00302c88, 0x16515: 0xc3900b21, 0x16516: 0x0030be88, 0x16517: 0x0030e288, - 0x16518: 0x0030f688, 0x16519: 0x00310088, 0x1651a: 0x00312a88, 0x1651b: 0x4003f820, - 0x1651c: 0x4004e420, 0x1651d: 0x4003fa20, 0x1651e: 0x40062420, 0x1651f: 0x40021620, - 0x16520: 0x40061e20, 0x16521: 0xce620b52, 0x16522: 0x402c0a20, 0x16523: 0x402c3a20, - 0x16524: 0x402c6220, 0x16525: 0xc39c0be1, 0x16526: 0x402d0820, 0x16527: 0x402d2220, - 0x16528: 0x402d6820, 0x16529: 0x402d9a20, 0x1652a: 0x402dcc20, 0x1652b: 0x402dfe20, - 0x1652c: 0xc0000002, 0x1652d: 0x402e8220, 0x1652e: 0x402e9e20, 0x1652f: 0xc3a00b21, - 0x16530: 0x402f2c20, 0x16531: 0x402f5620, 0x16532: 0x402f7a20, 0x16533: 0x402fe620, - 0x16534: 0x40302c20, 0x16535: 0xc38d0b21, 0x16536: 0x4030be20, 0x16537: 0x4030e220, - 0x16538: 0x4030f620, 0x16539: 0x40310020, 0x1653a: 0x40312a20, 0x1653b: 0x4003fc20, - 0x1653c: 0x40094820, 0x1653d: 0x4003fe20, 0x1653e: 0x40094c20, 0x1653f: 0xa0000000, - // Block 0x595, offset 0x16540 - 0x16540: 0xa0000000, 0x16541: 0xa0000000, 0x16542: 0xa0000000, 0x16543: 0xa0000000, - 0x16544: 0xa0000000, 0x16545: 0xa0000000, 0x16546: 0xa0000000, 0x16547: 0xa0000000, - 0x16548: 0xa0000000, 0x16549: 0x40020020, 0x1654a: 0x40020220, 0x1654b: 0x40020420, - 0x1654c: 0x40020620, 0x1654d: 0x40020820, 0x1654e: 0xa0000000, 0x1654f: 0xa0000000, - 0x16550: 0xa0000000, 0x16551: 0xa0000000, 0x16552: 0xa0000000, 0x16553: 0xa0000000, - 0x16554: 0xa0000000, 0x16555: 0xa0000000, 0x16556: 0xa0000000, 0x16557: 0xa0000000, - 0x16558: 0xa0000000, 0x16559: 0xa0000000, 0x1655a: 0xa0000000, 0x1655b: 0xa0000000, - 0x1655c: 0xa0000000, 0x1655d: 0xa0000000, 0x1655e: 0xa0000000, 0x1655f: 0xa0000000, - 0x16560: 0x40021220, 0x16561: 0x4002ba20, 0x16562: 0x4003e020, 0x16563: 0x4004ea20, - 0x16564: 0x4027de20, 0x16565: 0x4004ec20, 0x16566: 0x4004e620, 0x16567: 0x4003d220, - 0x16568: 0x4003f420, 0x16569: 0x4003f620, 0x1656a: 0x4004d820, 0x1656b: 0x40093820, - 0x1656c: 0x40024020, 0x1656d: 0x40021a20, 0x1656e: 0x4002e420, 0x1656f: 0x4004e220, - 0x16570: 0x4029cc20, 0x16571: 0x4029ce20, 0x16572: 0x4029d020, 0x16573: 0x4029d220, - 0x16574: 0x4029d420, 0x16575: 0x4029d620, 0x16576: 0x4029d820, 0x16577: 0x4029da20, - 0x16578: 0x4029dc20, 0x16579: 0x4029de20, 0x1657a: 0x40026c20, 0x1657b: 0x40026220, - 0x1657c: 0x40094020, 0x1657d: 0x40094220, 0x1657e: 0x40094420, 0x1657f: 0x4002c420, - // Block 0x596, offset 0x16580 - 0x16580: 0x4004d620, 0x16581: 0x002bde88, 0x16582: 0x002c0a88, 0x16583: 0x002c3a88, - 0x16584: 0x002c6288, 0x16585: 0xce6d2741, 0x16586: 0x002d0888, 0x16587: 0x002d2288, - 0x16588: 0x002d6888, 0x16589: 0x002d9a88, 0x1658a: 0x002dcc88, 0x1658b: 0x002dfe88, - 0x1658c: 0xc0030002, 0x1658d: 0x002e8288, 0x1658e: 0x002e9e88, 0x1658f: 0xc33f2741, - 0x16590: 0x002f2c88, 0x16591: 0x002f5688, 0x16592: 0x002f7a88, 0x16593: 0xc3430991, - 0x16594: 0x00302c88, 0x16595: 0x00306c88, 0x16596: 0x0030be88, 0x16597: 0x0030e288, - 0x16598: 0x0030f688, 0x16599: 0x00310088, 0x1659a: 0x00312a88, 0x1659b: 0x4003f820, - 0x1659c: 0x4004e420, 0x1659d: 0x4003fa20, 0x1659e: 0x40062420, 0x1659f: 0x40021620, - 0x165a0: 0x40061e20, 0x165a1: 0x402bde20, 0x165a2: 0x402c0a20, 0x165a3: 0x402c3a20, - 0x165a4: 0x402c6220, 0x165a5: 0xce6b2741, 0x165a6: 0x402d0820, 0x165a7: 0x402d2220, - 0x165a8: 0x402d6820, 0x165a9: 0x402d9a20, 0x165aa: 0x402dcc20, 0x165ab: 0x402dfe20, - 0x165ac: 0xc0000002, 0x165ad: 0x402e8220, 0x165ae: 0x402e9e20, 0x165af: 0xc33d2741, - 0x165b0: 0x402f2c20, 0x165b1: 0x402f5620, 0x165b2: 0x402f7a20, 0x165b3: 0xc3410991, - 0x165b4: 0x40302c20, 0x165b5: 0x40306c20, 0x165b6: 0x4030be20, 0x165b7: 0x4030e220, - 0x165b8: 0x4030f620, 0x165b9: 0x40310020, 0x165ba: 0x40312a20, 0x165bb: 0x4003fc20, - 0x165bc: 0x40094820, 0x165bd: 0x4003fe20, 0x165be: 0x40094c20, 0x165bf: 0xa0000000, - // Block 0x597, offset 0x165c0 - 0x165c0: 0xe00008f5, 0x165c1: 0xe00008ef, 0x165c2: 0xe0000921, 0x165c3: 0xe0000969, - 0x165c4: 0xe000095b, 0x165c5: 0xe000094d, 0x165c6: 0xe00009dd, 0x165c7: 0xe0000a53, - 0x165c8: 0xe0000ae8, 0x165c9: 0xe0000ae2, 0x165ca: 0x002c9a83, 0x165cb: 0xe0000b20, - 0x165cc: 0xe0000c2b, 0x165cd: 0xe0000c25, 0x165ce: 0xe0000c37, 0x165cf: 0xe0000c43, - 0x165d0: 0xe0000ab3, 0x165d1: 0xe0000d63, 0x165d2: 0xe0000d9a, 0x165d3: 0xe0000d94, - 0x165d4: 0x002ee483, 0x165d5: 0xe0000de6, 0x165d6: 0xe0000dd2, 0x165d7: 0x40093e20, - 0x165d8: 0xe0000e12, 0x165d9: 0xe0000fe1, 0x165da: 0xe0000fdb, 0x165db: 0xe0000fed, - 0x165dc: 0xe0000fff, 0x165dd: 0xe0001102, 0x165de: 0x00318888, 0x165df: 0xe0000f7b, - 0x165e0: 0xe00008f2, 0x165e1: 0xe00008ec, 0x165e2: 0xe000091e, 0x165e3: 0xe0000966, - 0x165e4: 0xe0000958, 0x165e5: 0xe000094a, 0x165e6: 0xe00009d5, 0x165e7: 0xe0000a4d, - 0x165e8: 0xe0000ae5, 0x165e9: 0xe0000adf, 0x165ea: 0x402c9a20, 0x165eb: 0xe0000b1d, - 0x165ec: 0xe0000c28, 0x165ed: 0xe0000c22, 0x165ee: 0xe0000c34, 0x165ef: 0xe0000c40, - 0x165f0: 0xe0000aad, 0x165f1: 0xe0000d60, 0x165f2: 0xe0000d97, 0x165f3: 0xe0000d91, - 0x165f4: 0x402ee420, 0x165f5: 0xe0000de3, 0x165f6: 0xe0000dcf, 0x165f7: 0x40093c20, - 0x165f8: 0xe0000e0f, 0x165f9: 0xe0000fde, 0x165fa: 0xe0000fd8, 0x165fb: 0xe0000fea, - 0x165fc: 0xe0000ffc, 0x165fd: 0xe00010ff, 0x165fe: 0x40318820, 0x165ff: 0xe0001114, - // Block 0x598, offset 0x16600 - 0x16600: 0xe0000cfe, 0x16601: 0xe0000cf8, 0x16602: 0xe0000cf5, 0x16603: 0xe0000d51, - 0x16604: 0xe0000d4e, 0x16605: 0xe0000d6f, 0x16606: 0xe0000d6c, 0x16607: 0xe0000d5d, - 0x16608: 0xe0000d5a, 0x16609: 0xf0000404, 0x1660a: 0x002eda88, 0x1660b: 0x402eda20, - 0x1660c: 0xe0000e2e, 0x1660d: 0xe0000e2b, 0x1660e: 0xe0000da0, 0x1660f: 0xe0000d9d, - 0x16610: 0xe0000de0, 0x16611: 0xe0000ddd, 0x16612: 0xe0000e93, 0x16613: 0xe0000e8f, - 0x16614: 0xe0000eca, 0x16615: 0xe0000ec7, 0x16616: 0xe0000edc, 0x16617: 0xe0000ed9, - 0x16618: 0xe0000ed0, 0x16619: 0xe0000ecd, 0x1661a: 0xe0000f1f, 0x1661b: 0xe0000f1c, - 0x1661c: 0xe0000f2d, 0x1661d: 0xe0000f2a, 0x1661e: 0xe0000f47, 0x1661f: 0xe0000f44, - 0x16620: 0x002fe883, 0x16621: 0x402fe820, 0x16622: 0xe0000f99, 0x16623: 0xe0000f96, - 0x16624: 0xe0000f8a, 0x16625: 0xe0000f87, 0x16626: 0x00303688, 0x16627: 0x40303620, - 0x16628: 0xe000102b, 0x16629: 0xe0001028, 0x1662a: 0xe000103f, 0x1662b: 0xe000103c, - 0x1662c: 0xe0000fe7, 0x1662d: 0xe0000fe4, 0x1662e: 0xe0000ff9, 0x1662f: 0xe0000ff6, - 0x16630: 0xe0001025, 0x16631: 0xe0001022, 0x16632: 0xe0001039, 0x16633: 0xe0001036, - 0x16634: 0xe00010d8, 0x16635: 0xe00010d5, 0x16636: 0xe000110e, 0x16637: 0xe000110b, - 0x16638: 0xe0001117, 0x16639: 0xe000113b, 0x1663a: 0xe0001138, 0x1663b: 0xe000114d, - 0x1663c: 0xe000114a, 0x1663d: 0xe0001147, 0x1663e: 0xe0001144, 0x1663f: 0xe0000f64, - // Block 0x599, offset 0x16640 - 0x16640: 0xe00010d2, 0x16641: 0xe00010cf, 0x16642: 0xe00010cc, 0x16643: 0xe00010c9, - 0x16644: 0xe00010e1, 0x16645: 0xe00010de, 0x16646: 0xe00010e7, 0x16647: 0xe00010e4, - 0x16648: 0xe00010ed, 0x16649: 0xe00010ea, 0x1664a: 0xe00010fc, 0x1664b: 0xe00010f9, - 0x1664c: 0xe00010f6, 0x1664d: 0xe00010f3, 0x1664e: 0xe0001123, 0x1664f: 0xe0001120, - 0x16650: 0xe0001141, 0x16651: 0xe000113e, 0x16652: 0xe0001153, 0x16653: 0xe0001150, - 0x16654: 0xe0001159, 0x16655: 0xe0001156, 0x16656: 0xe0000c15, 0x16657: 0xe0000f8d, - 0x16658: 0xe00010db, 0x16659: 0xe0001111, 0x1665a: 0xf0000404, 0x1665b: 0xe0000f70, - 0x1665c: 0x40300420, 0x1665d: 0x40300620, 0x1665e: 0xe0000f7f, 0x1665f: 0x402c9620, - 0x16660: 0xe000099b, 0x16661: 0xe0000998, 0x16662: 0xe0000989, 0x16663: 0xe0000986, - 0x16664: 0xe0000928, 0x16665: 0xe0000924, 0x16666: 0xe0000930, 0x16667: 0xe000092c, - 0x16668: 0xe0000940, 0x16669: 0xe000093c, 0x1666a: 0xe0000938, 0x1666b: 0xe0000934, - 0x1666c: 0xe00009aa, 0x1666d: 0xe00009a6, 0x1666e: 0xe0000902, 0x1666f: 0xe00008fe, - 0x16670: 0xe000090a, 0x16671: 0xe0000906, 0x16672: 0xe000091a, 0x16673: 0xe0000916, - 0x16674: 0xe0000912, 0x16675: 0xe000090e, 0x16676: 0xe00009a2, 0x16677: 0xe000099e, - 0x16678: 0xe0000b6e, 0x16679: 0xe0000b6b, 0x1667a: 0xe0000b5c, 0x1667b: 0xe0000b59, - 0x1667c: 0xe0000b26, 0x1667d: 0xe0000b23, 0x1667e: 0xe000ad41, 0x1667f: 0xe000ad3e, - // Block 0x59a, offset 0x16680 - 0x16680: 0xe000ad47, 0x16681: 0xe000ad44, 0x16682: 0xe000ad53, 0x16683: 0xe000ad50, - 0x16684: 0xe000ad4d, 0x16685: 0xe000ad4a, 0x16686: 0xe000ad59, 0x16687: 0xe000ad56, - 0x16688: 0xe0000c66, 0x16689: 0xe0000c63, 0x1668a: 0xe0000c78, 0x1668b: 0xe0000c75, - 0x1668c: 0xe0000e84, 0x1668d: 0xe0000e81, 0x1668e: 0xe0000e44, 0x1668f: 0xe0000e41, - 0x16690: 0xe000ad5f, 0x16691: 0xe000ad5c, 0x16692: 0xe000ad65, 0x16693: 0xe000ad62, - 0x16694: 0xe000ad6b, 0x16695: 0xe000ad68, 0x16696: 0xe0002946, 0x16697: 0xe0002943, - 0x16698: 0xe000ad71, 0x16699: 0xe000ad6e, 0x1669a: 0xe0000e5d, 0x1669b: 0xe0000e59, - 0x1669c: 0xe0000e65, 0x1669d: 0xe0000e61, 0x1669e: 0xe0000e75, 0x1669f: 0xe0000e71, - 0x166a0: 0xe0000e6d, 0x166a1: 0xe0000e69, 0x166a2: 0xe0000e7d, 0x166a3: 0xe0000e79, - 0x166a4: 0xe000108d, 0x166a5: 0xe000108a, 0x166a6: 0xe000104d, 0x166a7: 0xe000104a, - 0x166a8: 0xe0001066, 0x166a9: 0xe0001062, 0x166aa: 0xe000106e, 0x166ab: 0xe000106a, - 0x166ac: 0xe000107e, 0x166ad: 0xe000107a, 0x166ae: 0xe0001076, 0x166af: 0xe0001072, - 0x166b0: 0xe0001086, 0x166b1: 0xe0001082, 0x166b2: 0xe0001108, 0x166b3: 0xe0001105, - 0x166b4: 0xe0001135, 0x166b5: 0xe0001132, 0x166b6: 0xe000112f, 0x166b7: 0xe000112c, - 0x166b8: 0xe000111d, 0x166b9: 0xe000111a, 0x166ba: 0xe0000d0a, 0x166bb: 0xe0000d07, - 0x166bc: 0x0030d888, 0x166bd: 0x4030d820, 0x166be: 0x00312088, 0x166bf: 0x40312020, - // Block 0x59b, offset 0x166c0 - 0x166c0: 0xa0000000, 0x166c1: 0xa0000000, 0x166c2: 0xa0000000, 0x166c3: 0xa0000000, - 0x166c4: 0xa0000000, 0x166c5: 0xa0000000, 0x166c6: 0xa0000000, 0x166c7: 0xa0000000, - 0x166c8: 0xa0000000, 0x166c9: 0x40020020, 0x166ca: 0x40020220, 0x166cb: 0x40020420, - 0x166cc: 0x40020620, 0x166cd: 0x40020820, 0x166ce: 0xa0000000, 0x166cf: 0xa0000000, - 0x166d0: 0xa0000000, 0x166d1: 0xa0000000, 0x166d2: 0xa0000000, 0x166d3: 0xa0000000, - 0x166d4: 0xa0000000, 0x166d5: 0xa0000000, 0x166d6: 0xa0000000, 0x166d7: 0xa0000000, - 0x166d8: 0xa0000000, 0x166d9: 0xa0000000, 0x166da: 0xa0000000, 0x166db: 0xa0000000, - 0x166dc: 0xa0000000, 0x166dd: 0xa0000000, 0x166de: 0xa0000000, 0x166df: 0xa0000000, - 0x166e0: 0x40021220, 0x166e1: 0x4002ba20, 0x166e2: 0x4003e020, 0x166e3: 0x4004ea20, - 0x166e4: 0x4027de20, 0x166e5: 0x4004ec20, 0x166e6: 0x4004e620, 0x166e7: 0x4003d220, - 0x166e8: 0x4003f420, 0x166e9: 0x4003f620, 0x166ea: 0x4004d820, 0x166eb: 0x40093820, - 0x166ec: 0x40024020, 0x166ed: 0x40021a20, 0x166ee: 0x4002e420, 0x166ef: 0x4004e220, - 0x166f0: 0x4029cc20, 0x166f1: 0x4029ce20, 0x166f2: 0x4029d020, 0x166f3: 0x4029d220, - 0x166f4: 0x4029d420, 0x166f5: 0x4029d620, 0x166f6: 0x4029d820, 0x166f7: 0x4029da20, - 0x166f8: 0x4029dc20, 0x166f9: 0x4029de20, 0x166fa: 0x40026c20, 0x166fb: 0x40026220, - 0x166fc: 0x40094020, 0x166fd: 0x40094220, 0x166fe: 0x40094420, 0x166ff: 0x4002c420, - // Block 0x59c, offset 0x16700 - 0x16700: 0x4004d620, 0x16701: 0x002bde88, 0x16702: 0x002c0a88, 0x16703: 0xce7109c2, - 0x16704: 0xce7609c2, 0x16705: 0x002c9888, 0x16706: 0x002d0888, 0x16707: 0x002d2288, - 0x16708: 0x002d6888, 0x16709: 0x002d9a88, 0x1670a: 0x002dcc88, 0x1670b: 0xce7b09c2, - 0x1670c: 0xc0030002, 0x1670d: 0x002e8288, 0x1670e: 0xce8026f2, 0x1670f: 0x002ee288, - 0x16710: 0xce8509c2, 0x16711: 0x002f5688, 0x16712: 0x002f7a88, 0x16713: 0xce8a09b1, - 0x16714: 0x00302c88, 0x16715: 0x00306c88, 0x16716: 0x0030be88, 0x16717: 0x0030e288, - 0x16718: 0x0030f688, 0x16719: 0x00310088, 0x1671a: 0x00312a88, 0x1671b: 0x4003f820, - 0x1671c: 0x4004e420, 0x1671d: 0x4003fa20, 0x1671e: 0x40062420, 0x1671f: 0x40021620, - 0x16720: 0x40061e20, 0x16721: 0x402bde20, 0x16722: 0x402c0a20, 0x16723: 0xce6f09b1, - 0x16724: 0xce7409b1, 0x16725: 0x402c9820, 0x16726: 0x402d0820, 0x16727: 0x402d2220, - 0x16728: 0x402d6820, 0x16729: 0x402d9a20, 0x1672a: 0x402dcc20, 0x1672b: 0xce7909b1, - 0x1672c: 0xc0000002, 0x1672d: 0x402e8220, 0x1672e: 0xce7e26e1, 0x1672f: 0x402ee220, - 0x16730: 0xce8309b1, 0x16731: 0x402f5620, 0x16732: 0x402f7a20, 0x16733: 0xce8809b1, - 0x16734: 0x40302c20, 0x16735: 0x40306c20, 0x16736: 0x4030be20, 0x16737: 0x4030e220, - 0x16738: 0x4030f620, 0x16739: 0x40310020, 0x1673a: 0x40312a20, 0x1673b: 0x4003fc20, - 0x1673c: 0x40094820, 0x1673d: 0x4003fe20, 0x1673e: 0x40094c20, 0x1673f: 0xa0000000, - // Block 0x59d, offset 0x16740 - 0x16741: 0x40421220, 0x16742: 0x40421420, 0x16743: 0x40421620, - 0x16745: 0x4041f620, 0x16746: 0x4041f820, 0x16747: 0x4041fa20, - 0x16748: 0x4041fc20, 0x16749: 0x4041fe20, 0x1674a: 0x40420020, 0x1674b: 0x40420220, - 0x1674c: 0x40420620, 0x1674f: 0x40420a20, - 0x16750: 0x40420c20, 0x16753: 0x40420e20, - 0x16754: 0x40421020, 0x16755: 0xce8c96b1, 0x16756: 0x40421420, 0x16757: 0x40421620, - 0x16758: 0x40421820, 0x16759: 0x40421a20, 0x1675a: 0x40421c20, 0x1675b: 0x40421e20, - 0x1675c: 0x40422020, 0x1675d: 0x40422220, 0x1675e: 0x40422420, 0x1675f: 0x40422620, - 0x16760: 0x40422820, 0x16761: 0x40422a20, 0x16762: 0x40422c20, 0x16763: 0x40422e20, - 0x16764: 0x40423020, 0x16765: 0x40423220, 0x16766: 0x40423420, 0x16767: 0x40423620, - 0x16768: 0x40423820, 0x1676a: 0x40423a20, 0x1676b: 0x40423c20, - 0x1676c: 0x40423e20, 0x1676d: 0x40424020, 0x1676e: 0x40424220, 0x1676f: 0x40424420, - 0x16770: 0x40424820, 0x16772: 0x40424a20, 0x16773: 0x40424c20, - 0x16775: 0x40424e20, 0x16776: 0x40425220, 0x16777: 0x40425420, - 0x16778: 0x40425620, 0x16779: 0x40425820, - 0x1677c: 0xa070f102, 0x1677d: 0x40425a20, 0x1677e: 0x40425c20, 0x1677f: 0x40425e20, - // Block 0x59e, offset 0x16780 - 0x16780: 0x40426020, 0x16781: 0x40426220, 0x16782: 0x40426420, 0x16783: 0x40426620, - 0x16784: 0x40426820, 0x16787: 0xc05d01e1, - 0x16788: 0x40427020, 0x1678b: 0x40427220, - 0x1678c: 0x40427420, 0x1678d: 0x8209213b, - 0x16796: 0x40427820, 0x16797: 0x40427a20, - 0x1679c: 0xe000185d, 0x1679d: 0xe0001860, 0x1679f: 0x40424421, - 0x167a0: 0x40420420, 0x167a1: 0x40420820, 0x167a2: 0x40426a20, 0x167a3: 0x40426c20, - 0x167a6: 0xe0000176, 0x167a7: 0xe0000204, - 0x167a8: 0xe000031f, 0x167a9: 0xe00003f9, 0x167aa: 0xe00004d4, 0x167ab: 0xe000059e, - 0x167ac: 0xe0000669, 0x167ad: 0xe0000711, 0x167ae: 0xe00007bd, 0x167af: 0xe0000862, - 0x167b0: 0x40073c20, 0x167b1: 0x40425020, 0x167b2: 0x40283c20, 0x167b3: 0x40283e20, - 0x167b4: 0x40284020, 0x167b5: 0x40284220, 0x167b6: 0x40284420, 0x167b7: 0x40284620, - // Block 0x59f, offset 0x167c0 - 0x167c1: 0xa000f902, 0x167c2: 0xa000f802, 0x167c3: 0xa000f402, - 0x167c5: 0x40410620, 0x167c6: 0x40410820, 0x167c7: 0x40411020, - 0x167c8: 0x40411220, 0x167c9: 0x40410020, 0x167ca: 0x40410220, - 0x167cf: 0x40411420, - 0x167d0: 0x40410a20, 0x167d3: 0x40410420, - 0x167d4: 0x40410c20, 0x167d5: 0x40411c20, 0x167d6: 0x40411e20, 0x167d7: 0x40412020, - 0x167d8: 0x40412220, 0x167d9: 0x40412420, 0x167da: 0x40412620, 0x167db: 0x40412820, - 0x167dc: 0x40412a20, 0x167dd: 0x40412c20, 0x167de: 0x40412e20, 0x167df: 0x40413020, - 0x167e0: 0x40413220, 0x167e1: 0x40413420, 0x167e2: 0x40413620, 0x167e3: 0x40413820, - 0x167e4: 0x40413a20, 0x167e5: 0x40413c20, 0x167e6: 0x40413e20, 0x167e7: 0x40414020, - 0x167e8: 0x40414220, 0x167ea: 0x40414420, 0x167eb: 0x40414620, - 0x167ec: 0x40414820, 0x167ed: 0x40414a20, 0x167ee: 0x40414c20, 0x167ef: 0x40414e20, - 0x167f0: 0x40415220, 0x167f2: 0x40415420, 0x167f3: 0xe000ad83, - 0x167f5: 0x40415620, 0x167f6: 0xe000ad74, - 0x167f8: 0x40411620, 0x167f9: 0x40411820, - 0x167fc: 0xa000fa02, 0x167fe: 0x40415a20, 0x167ff: 0x40415c20, - // Block 0x5a0, offset 0x16800 - 0x16800: 0x40415e20, 0x16801: 0x40416020, 0x16802: 0x40416220, - 0x16807: 0x40416420, - 0x16808: 0x40416620, 0x1680b: 0x40416820, - 0x1680c: 0x40416a20, 0x1680d: 0x40415a20, - 0x16811: 0x40411a20, - 0x16819: 0xe000ad77, 0x1681a: 0xe000ad7a, 0x1681b: 0xe000ad7d, - 0x1681c: 0x40415820, 0x1681e: 0xe000ad80, - 0x16826: 0xe0000170, 0x16827: 0xe00001fe, - 0x16828: 0xe0000319, 0x16829: 0xe00003f3, 0x1682a: 0xe00004ce, 0x1682b: 0xe0000598, - 0x1682c: 0xe0000663, 0x1682d: 0xe000070b, 0x1682e: 0xe00007b7, 0x1682f: 0xe000085c, - 0x16830: 0xa000f702, 0x16831: 0xa000f602, 0x16832: 0x40410e20, 0x16833: 0x4040fe20, - 0x16834: 0x4040fc20, 0x16835: 0x40415020, - // Block 0x5a1, offset 0x16840 - 0x16840: 0xa0000000, 0x16841: 0xa0000000, 0x16842: 0xa0000000, 0x16843: 0xa0000000, - 0x16844: 0xa0000000, 0x16845: 0xa0000000, 0x16846: 0xa0000000, 0x16847: 0xa0000000, - 0x16848: 0xa0000000, 0x16849: 0x40020020, 0x1684a: 0x40020220, 0x1684b: 0x40020420, - 0x1684c: 0x40020620, 0x1684d: 0x40020820, 0x1684e: 0xa0000000, 0x1684f: 0xa0000000, - 0x16850: 0xa0000000, 0x16851: 0xa0000000, 0x16852: 0xa0000000, 0x16853: 0xa0000000, - 0x16854: 0xa0000000, 0x16855: 0xa0000000, 0x16856: 0xa0000000, 0x16857: 0xa0000000, - 0x16858: 0xa0000000, 0x16859: 0xa0000000, 0x1685a: 0xa0000000, 0x1685b: 0xa0000000, - 0x1685c: 0xa0000000, 0x1685d: 0xa0000000, 0x1685e: 0xa0000000, 0x1685f: 0xa0000000, - 0x16860: 0x40021220, 0x16861: 0x4002ba20, 0x16862: 0x4003e020, 0x16863: 0x4004ea20, - 0x16864: 0x4027de20, 0x16865: 0x4004ec20, 0x16866: 0x4004e620, 0x16867: 0x4003d220, - 0x16868: 0x4003f420, 0x16869: 0x4003f620, 0x1686a: 0x4004d820, 0x1686b: 0x40093820, - 0x1686c: 0x40024020, 0x1686d: 0x40021a20, 0x1686e: 0x4002e420, 0x1686f: 0x4004e220, - 0x16870: 0x4029cc20, 0x16871: 0x4029ce20, 0x16872: 0x4029d020, 0x16873: 0x4029d220, - 0x16874: 0x4029d420, 0x16875: 0x4029d620, 0x16876: 0x4029d820, 0x16877: 0x4029da20, - 0x16878: 0x4029dc20, 0x16879: 0x4029de20, 0x1687a: 0x40026c20, 0x1687b: 0x40026220, - 0x1687c: 0x40094020, 0x1687d: 0x40094220, 0x1687e: 0x40094420, 0x1687f: 0x4002c420, - // Block 0x5a2, offset 0x16880 - 0x16880: 0x4004d620, 0x16881: 0xce900be1, 0x16882: 0x002c0a88, 0x16883: 0xc33531e1, - 0x16884: 0x002c6288, 0x16885: 0xce6d0be1, 0x16886: 0x002d0888, 0x16887: 0x002d2288, - 0x16888: 0x002d6888, 0x16889: 0x002d9a88, 0x1688a: 0x002dcc88, 0x1688b: 0x002dfe88, - 0x1688c: 0xc0030002, 0x1688d: 0x002e8288, 0x1688e: 0xc54631e1, 0x1688f: 0xc33f31e1, - 0x16890: 0x002f2c88, 0x16891: 0x002f5688, 0x16892: 0x002f7a88, 0x16893: 0xc34331e1, - 0x16894: 0x00302c88, 0x16895: 0x00306c88, 0x16896: 0x0030be88, 0x16897: 0x0030e288, - 0x16898: 0x0030f688, 0x16899: 0x00310088, 0x1689a: 0xce959711, 0x1689b: 0x4003f820, - 0x1689c: 0x4004e420, 0x1689d: 0x4003fa20, 0x1689e: 0x40062420, 0x1689f: 0x40021620, - 0x168a0: 0x40061e20, 0x168a1: 0xce8e0be1, 0x168a2: 0x402c0a20, 0x168a3: 0xc33331e1, - 0x168a4: 0x402c6220, 0x168a5: 0xce6b0be1, 0x168a6: 0x402d0820, 0x168a7: 0x402d2220, - 0x168a8: 0x402d6820, 0x168a9: 0x402d9a20, 0x168aa: 0x402dcc20, 0x168ab: 0x402dfe20, - 0x168ac: 0xc0000002, 0x168ad: 0x402e8220, 0x168ae: 0xc53331e1, 0x168af: 0xc33d31e1, - 0x168b0: 0x402f2c20, 0x168b1: 0x402f5620, 0x168b2: 0x402f7a20, 0x168b3: 0xc34131e1, - 0x168b4: 0x40302c20, 0x168b5: 0x40306c20, 0x168b6: 0x4030be20, 0x168b7: 0x4030e220, - 0x168b8: 0x4030f620, 0x168b9: 0x40310020, 0x168ba: 0xce929711, 0x168bb: 0x4003fc20, - 0x168bc: 0x40094820, 0x168bd: 0x4003fe20, 0x168be: 0x40094c20, 0x168bf: 0xa0000000, - // Block 0x5a3, offset 0x168c0 - 0x168c0: 0xe00008f5, 0x168c1: 0xe00008ef, 0x168c2: 0xe0000921, 0x168c3: 0xe0000969, - 0x168c4: 0xe000095b, 0x168c5: 0xe000094d, 0x168c6: 0xe00009dd, 0x168c7: 0xe0000a53, - 0x168c8: 0xe0000ae8, 0x168c9: 0xe0000ae2, 0x168ca: 0xe0000af4, 0x168cb: 0xe0000b20, - 0x168cc: 0xe0000c2b, 0x168cd: 0xe0000c25, 0x168ce: 0xe0000c37, 0x168cf: 0xe0000c43, - 0x168d0: 0xe0000ab3, 0x168d1: 0xe0000d63, 0x168d2: 0xe0000d9a, 0x168d3: 0x002ee483, - 0x168d4: 0xe0000da6, 0x168d5: 0xe0000de6, 0x168d6: 0xe0000dd2, 0x168d7: 0x40093e20, - 0x168d8: 0xe0000e12, 0x168d9: 0xe0000fe1, 0x168da: 0xe0000fdb, 0x168db: 0xe0000fed, - 0x168dc: 0xe0000fff, 0x168dd: 0xe0001102, 0x168de: 0x00318888, 0x168df: 0xe0000f7b, - 0x168e0: 0xe00008f2, 0x168e1: 0xe00008ec, 0x168e2: 0xe000091e, 0x168e3: 0xe0000966, - 0x168e4: 0xe0000958, 0x168e5: 0xe000094a, 0x168e6: 0xe00009d5, 0x168e7: 0xe0000a4d, - 0x168e8: 0xe0000ae5, 0x168e9: 0xe0000adf, 0x168ea: 0xe0000af1, 0x168eb: 0xe0000b1d, - 0x168ec: 0xe0000c28, 0x168ed: 0xe0000c22, 0x168ee: 0xe0000c34, 0x168ef: 0xe0000c40, - 0x168f0: 0xe0000aad, 0x168f1: 0xe0000d60, 0x168f2: 0xe0000d97, 0x168f3: 0x402ee420, - 0x168f4: 0xe0000da3, 0x168f5: 0xe0000de3, 0x168f6: 0xe0000dcf, 0x168f7: 0x40093c20, - 0x168f8: 0xe0000e0f, 0x168f9: 0xe0000fde, 0x168fa: 0xe0000fd8, 0x168fb: 0xe0000fea, - 0x168fc: 0xe0000ffc, 0x168fd: 0xe00010ff, 0x168fe: 0x40318820, 0x168ff: 0xe0001114, - // Block 0x5a4, offset 0x16900 - 0x16900: 0xe0000983, 0x16901: 0xe0000980, 0x16902: 0xe00008fb, 0x16903: 0xe00008f8, - 0x16904: 0x002be083, 0x16905: 0x402be020, 0x16906: 0x002c3c83, 0x16907: 0x402c3c20, - 0x16908: 0xe0000a3e, 0x16909: 0xe0000a3b, 0x1690a: 0xe0000a4a, 0x1690b: 0xe0000a47, - 0x1690c: 0xe0000a44, 0x1690d: 0xe0000a41, 0x1690e: 0xe0000a86, 0x1690f: 0xe0000a83, - 0x16910: 0xe0000aaa, 0x16911: 0xe0000aa7, 0x16912: 0xe0000b46, 0x16913: 0xe0000b43, - 0x16914: 0xe0000aee, 0x16915: 0xe0000aeb, 0x16916: 0xe0000b2c, 0x16917: 0xe0000b29, - 0x16918: 0x002c9a83, 0x16919: 0x402c9a20, 0x1691a: 0xe0000b1a, 0x1691b: 0xe0000b17, - 0x1691c: 0xe0000bb8, 0x1691d: 0xe0000bb5, 0x1691e: 0xe0000bb2, 0x1691f: 0xe0000baf, - 0x16920: 0xe0000bc4, 0x16921: 0xe0000bc1, 0x16922: 0xe0000bca, 0x16923: 0xe0000bc7, - 0x16924: 0xe0000bee, 0x16925: 0xe0000beb, 0x16926: 0xe0000c1b, 0x16927: 0xe0000c18, - 0x16928: 0xe0000c51, 0x16929: 0xe0000c4e, 0x1692a: 0xe0000c60, 0x1692b: 0xe0000c5d, - 0x1692c: 0xe0000c31, 0x1692d: 0xe0000c2e, 0x1692e: 0xe0000c5a, 0x1692f: 0xe0000c57, - 0x16930: 0xe0000c54, 0x16931: 0x402da220, 0x16932: 0xf0000a0a, 0x16933: 0xf0000404, - 0x16934: 0xe0000c8a, 0x16935: 0xe0000c87, 0x16936: 0xe0000c9f, 0x16937: 0xe0000c9c, - 0x16938: 0x402f7220, 0x16939: 0xe0000ccc, 0x1693a: 0xe0000cc9, 0x1693b: 0xe0000cd8, - 0x1693c: 0xe0000cd5, 0x1693d: 0xe0000cd2, 0x1693e: 0xe0000ccf, 0x1693f: 0xe0000d04, - // Block 0x5a5, offset 0x16940 - 0x16940: 0xe0000cfe, 0x16941: 0x002e2483, 0x16942: 0x402e2420, 0x16943: 0x002ea083, - 0x16944: 0x402ea020, 0x16945: 0xe0000d6f, 0x16946: 0xe0000d6c, 0x16947: 0xe0000d5d, - 0x16948: 0xe0000d5a, 0x16949: 0xf0000404, 0x1694a: 0x002eda88, 0x1694b: 0x402eda20, - 0x1694c: 0xe0000e2e, 0x1694d: 0xe0000e2b, 0x1694e: 0xe0000da0, 0x1694f: 0xe0000d9d, - 0x16950: 0xe0000de0, 0x16951: 0xe0000ddd, 0x16952: 0xe0000e93, 0x16953: 0xe0000e8f, - 0x16954: 0xe0000eca, 0x16955: 0xe0000ec7, 0x16956: 0xe0000edc, 0x16957: 0xe0000ed9, - 0x16958: 0xe0000ed0, 0x16959: 0xe0000ecd, 0x1695a: 0x002fe883, 0x1695b: 0x402fe820, - 0x1695c: 0xe0000f2d, 0x1695d: 0xe0000f2a, 0x1695e: 0xe0000f47, 0x1695f: 0xe0000f44, - 0x16960: 0xe0000f33, 0x16961: 0xe0000f30, 0x16962: 0xe0000f99, 0x16963: 0xe0000f96, - 0x16964: 0xe0000f8a, 0x16965: 0xe0000f87, 0x16966: 0x00303688, 0x16967: 0x40303620, - 0x16968: 0xe000102b, 0x16969: 0xe0001028, 0x1696a: 0xe000103f, 0x1696b: 0xe000103c, - 0x1696c: 0xe0000fe7, 0x1696d: 0xe0000fe4, 0x1696e: 0xe0000ff9, 0x1696f: 0xe0000ff6, - 0x16970: 0xe0001025, 0x16971: 0xe0001022, 0x16972: 0xe0001039, 0x16973: 0xe0001036, - 0x16974: 0xe00010d8, 0x16975: 0xe00010d5, 0x16976: 0xe000110e, 0x16977: 0xe000110b, - 0x16978: 0xe0001117, 0x16979: 0x00312c83, 0x1697a: 0x40312c20, 0x1697b: 0x00312e83, - 0x1697c: 0x40312e20, 0x1697d: 0xe0001147, 0x1697e: 0xe0001144, 0x1697f: 0xe0000f64, - // Block 0x5a6, offset 0x16980 - 0x16980: 0xe00009b1, 0x16981: 0xe00009ae, 0x16982: 0xe0000a22, 0x16983: 0xe0000a1f, - 0x16984: 0xe0000a28, 0x16985: 0xe0000a25, 0x16986: 0xe0000a2e, 0x16987: 0xe0000a2b, - 0x16988: 0xe000261a, 0x16989: 0xe0002617, 0x1698a: 0xe0000a8c, 0x1698b: 0xe0000a89, - 0x1698c: 0xe0000a98, 0x1698d: 0xe0000a95, 0x1698e: 0xe0000aa4, 0x1698f: 0xe0000aa1, - 0x16990: 0xe0000a92, 0x16991: 0xe0000a8f, 0x16992: 0xe0000a9e, 0x16993: 0xe0000a9b, - 0x16994: 0xe0000b55, 0x16995: 0xe0000b51, 0x16996: 0xe0000b4d, 0x16997: 0xe0000b49, - 0x16998: 0xe0000b7c, 0x16999: 0xe0000b79, 0x1699a: 0xe0000b82, 0x1699b: 0xe0000b7f, - 0x1699c: 0xe0000b39, 0x1699d: 0xe0000b35, 0x1699e: 0xe0000b8c, 0x1699f: 0xe0000b89, - 0x169a0: 0xe0000bd0, 0x169a1: 0xe0000bcd, 0x169a2: 0xe0000c00, 0x169a3: 0xe0000bfd, - 0x169a4: 0xe0000c0c, 0x169a5: 0xe0000c09, 0x169a6: 0xe0000bfa, 0x169a7: 0xe0000bf7, - 0x169a8: 0xe0000c06, 0x169a9: 0xe0000c03, 0x169aa: 0xe0000c12, 0x169ab: 0xe0000c0f, - 0x169ac: 0xe0000c7e, 0x169ad: 0xe0000c7b, 0x169ae: 0xe0000c4a, 0x169af: 0xe0000c46, - 0x169b0: 0xe0000c93, 0x169b1: 0xe0000c90, 0x169b2: 0xe0000cab, 0x169b3: 0xe0000ca8, - 0x169b4: 0xe0000cb1, 0x169b5: 0xe0000cae, 0x169b6: 0xe0000cde, 0x169b7: 0xe0000cdb, - 0x169b8: 0xe0000ce5, 0x169b9: 0xe0000ce1, 0x169ba: 0xe0000cf2, 0x169bb: 0xe0000cef, - 0x169bc: 0xe0000cec, 0x169bd: 0xe0000ce9, 0x169be: 0xe0000d1e, 0x169bf: 0xe0000d1b, - // Block 0x5a7, offset 0x169c0 - 0x169c0: 0xe0000d24, 0x169c1: 0xe0000d21, 0x169c2: 0xe0000d2a, 0x169c3: 0xe0000d27, - 0x169c4: 0xe0000d69, 0x169c5: 0xe0000d66, 0x169c6: 0xe0000d7b, 0x169c7: 0xe0000d78, - 0x169c8: 0xe0000d87, 0x169c9: 0xe0000d84, 0x169ca: 0xe0000d81, 0x169cb: 0xe0000d7e, - 0x169cc: 0xe0002946, 0x169cd: 0xe0002943, 0x169ce: 0xe0000df5, 0x169cf: 0xe0000df1, - 0x169d0: 0xe0000e3d, 0x169d1: 0xe0000e39, 0x169d2: 0xe000294c, 0x169d3: 0xe0002949, - 0x169d4: 0xe0000ea7, 0x169d5: 0xe0000ea4, 0x169d6: 0xe0000ead, 0x169d7: 0xe0000eaa, - 0x169d8: 0xe0000ed6, 0x169d9: 0xe0000ed3, 0x169da: 0xe0000ef4, 0x169db: 0xe0000ef1, - 0x169dc: 0xe0000efb, 0x169dd: 0xe0000ef7, 0x169de: 0xe0000f02, 0x169df: 0xe0000eff, - 0x169e0: 0xe0000f41, 0x169e1: 0xe0000f3e, 0x169e2: 0xe0000f53, 0x169e3: 0xe0000f50, - 0x169e4: 0xe000296a, 0x169e5: 0xe0002967, 0x169e6: 0xe0000f3a, 0x169e7: 0xe0000f36, - 0x169e8: 0xe0000f5a, 0x169e9: 0xe0000f56, 0x169ea: 0xe0000f93, 0x169eb: 0xe0000f90, - 0x169ec: 0xe0000f9f, 0x169ed: 0xe0000f9c, 0x169ee: 0xe0000fb1, 0x169ef: 0xe0000fae, - 0x169f0: 0xe0000fab, 0x169f1: 0xe0000fa8, 0x169f2: 0xe0001093, 0x169f3: 0xe0001090, - 0x169f4: 0xe000109f, 0x169f5: 0xe000109c, 0x169f6: 0xe0001099, 0x169f7: 0xe0001096, - 0x169f8: 0xe0001032, 0x169f9: 0xe000102e, 0x169fa: 0xe0001046, 0x169fb: 0xe0001042, - 0x169fc: 0xe00010a9, 0x169fd: 0xe00010a6, 0x169fe: 0xe00010af, 0x169ff: 0xe00010ac, - // Block 0x5a8, offset 0x16a00 - 0x16a00: 0xe0000b03, 0x16a01: 0xe0000aff, 0x16a02: 0xe0000b13, 0x16a03: 0xe0000b0f, - 0x16a04: 0xe0000b0b, 0x16a05: 0xe0000b07, 0x16a06: 0xe0000b75, 0x16a07: 0xe0000b71, - 0x16a08: 0xe0000c66, 0x16a09: 0xe0000c63, 0x16a0a: 0xe0000c78, 0x16a0b: 0xe0000c75, - 0x16a0c: 0xe0000e84, 0x16a0d: 0xe0000e81, 0x16a0e: 0xe0000e44, 0x16a0f: 0xe0000e41, - 0x16a10: 0xe0003c96, 0x16a11: 0xe0003c93, 0x16a12: 0xe0000db5, 0x16a13: 0xe0000db1, - 0x16a14: 0xe0000dc5, 0x16a15: 0xe0000dc1, 0x16a16: 0xe0000dbd, 0x16a17: 0xe0000db9, - 0x16a18: 0xe0000e8b, 0x16a19: 0xe0000e87, 0x16a1a: 0xe0003c9c, 0x16a1b: 0xe0003c99, - 0x16a1c: 0xe0000e65, 0x16a1d: 0xe0000e61, 0x16a1e: 0xe0000e75, 0x16a1f: 0xe0000e71, - 0x16a20: 0xe0000e6d, 0x16a21: 0xe0000e69, 0x16a22: 0xe0000e7d, 0x16a23: 0xe0000e79, - 0x16a24: 0xe000108d, 0x16a25: 0xe000108a, 0x16a26: 0xe000104d, 0x16a27: 0xe000104a, - 0x16a28: 0xe0001066, 0x16a29: 0xe0001062, 0x16a2a: 0xe000106e, 0x16a2b: 0xe000106a, - 0x16a2c: 0xe000107e, 0x16a2d: 0xe000107a, 0x16a2e: 0xe0001076, 0x16a2f: 0xe0001072, - 0x16a30: 0xe0001086, 0x16a31: 0xe0001082, 0x16a32: 0xe0001108, 0x16a33: 0xe0001105, - 0x16a34: 0xe0001135, 0x16a35: 0xe0001132, 0x16a36: 0xe000112f, 0x16a37: 0xe000112c, - 0x16a38: 0xe000111d, 0x16a39: 0xe000111a, 0x16a3a: 0xe0000d0a, 0x16a3b: 0xe0000d07, - 0x16a3c: 0x0030d888, 0x16a3d: 0x4030d820, 0x16a3e: 0x00312088, 0x16a3f: 0x40312020, - // Block 0x5a9, offset 0x16a40 - 0x16a40: 0xa0000000, 0x16a41: 0xa0000000, 0x16a42: 0xa0000000, 0x16a43: 0xa0000000, - 0x16a44: 0xa0000000, 0x16a46: 0x40096620, 0x16a47: 0x40096a20, - 0x16a48: 0x40070820, 0x16a49: 0x4004f220, 0x16a4a: 0x4004f620, 0x16a4b: 0x4027e620, - 0x16a4c: 0x40024820, 0x16a4d: 0x40024a20, 0x16a4e: 0x40070e20, 0x16a4f: 0x40071020, - 0x16a50: 0xae600000, 0x16a51: 0xae600000, 0x16a52: 0xae600000, 0x16a53: 0xae600000, - 0x16a54: 0xae600000, 0x16a55: 0xae600000, 0x16a56: 0xae600000, 0x16a57: 0xae600000, - 0x16a58: 0xa1e00000, 0x16a59: 0xa1f00000, 0x16a5a: 0xa2000000, 0x16a5b: 0x40026420, - 0x16a5e: 0x40027020, 0x16a5f: 0x4002cc20, - 0x16a60: 0x403aa220, 0x16a61: 0x40393a20, 0x16a62: 0x40393620, 0x16a63: 0x40393821, - 0x16a64: 0x403a7421, 0x16a65: 0x40393824, 0x16a66: 0x003a9344, 0x16a67: 0xce980151, - 0x16a68: 0x40393c20, 0x16a69: 0x403a6824, 0x16a6a: 0x40395620, 0x16a6b: 0x40395820, - 0x16a6c: 0x40396420, 0x16a6d: 0xce9c0171, 0x16a6e: 0x40397420, 0x16a6f: 0x40398820, - 0x16a70: 0x40398a20, 0x16a71: 0x4039a420, 0x16a72: 0x4039a620, 0x16a73: 0x4039c620, - 0x16a74: 0x4039c820, 0x16a75: 0x4039dc20, 0x16a76: 0x4039de20, 0x16a77: 0x4039e620, - 0x16a78: 0x4039e820, 0x16a79: 0x4039ee20, 0x16a7a: 0x4039f020, 0x16a7b: 0x403a3820, - 0x16a7c: 0x403a3a20, 0x16a7d: 0x403a9c20, 0x16a7e: 0x403a9e20, 0x16a7f: 0x403aa020, - // Block 0x5aa, offset 0x16a80 - 0x16a80: 0xa0000000, 0x16a81: 0x4039fc20, 0x16a82: 0x403a1220, 0x16a83: 0x403a1c22, - 0x16a84: 0x403a4020, 0x16a85: 0x403a4e20, 0x16a86: 0x403a5620, 0x16a87: 0xcea00171, - 0x16a88: 0xcea20171, 0x16a89: 0xcea60171, 0x16a8a: 0xcea80171, 0x16a8b: 0xa000b002, - 0x16a8c: 0xa000b202, 0x16a8d: 0xa000b102, 0x16a8e: 0xa1e0ad02, 0x16a8f: 0xa000af02, - 0x16a90: 0xa000ae02, 0x16a91: 0xa210ba02, 0x16a92: 0xa220bc02, 0x16a93: 0xae60bd02, - 0x16a94: 0xae60be02, 0x16a95: 0xadc0bf02, 0x16a96: 0xadc0c102, 0x16a97: 0xae60c202, - 0x16a98: 0xae60c302, 0x16a99: 0xae60c402, 0x16a9a: 0xae60c502, 0x16a9b: 0xae60c602, - 0x16a9c: 0xadc0c702, 0x16a9d: 0xae60c802, 0x16a9e: 0xae60c902, 0x16a9f: 0xadc0c002, - 0x16aa0: 0xe000015e, 0x16aa1: 0xe00001e6, 0x16aa2: 0xe0000301, 0x16aa3: 0xe00003db, - 0x16aa4: 0xe00004b6, 0x16aa5: 0xe0000580, 0x16aa6: 0xe000064b, 0x16aa7: 0xe00006f3, - 0x16aa8: 0xe000079f, 0x16aa9: 0xe0000844, 0x16aaa: 0x4004ee20, 0x16aab: 0x40024c20, - 0x16aac: 0x40024e20, 0x16aad: 0x4004de20, 0x16aae: 0x40393a20, 0x16aaf: 0x403a1020, - 0x16ab0: 0xa230d102, 0x16ab1: 0x40393823, 0x16ab2: 0x40393822, 0x16ab3: 0x40393825, - 0x16ab4: 0x00391c84, 0x16ab5: 0xf0000404, 0x16ab6: 0xf0000404, 0x16ab7: 0xe000ad89, - 0x16ab8: 0xe0003780, 0x16ab9: 0x40395821, 0x16aba: 0x40395c20, 0x16abb: 0x40393e20, - 0x16abc: 0x40395820, 0x16abd: 0x40396020, 0x16abe: 0x40394020, 0x16abf: 0x40396220, - // Block 0x5ab, offset 0x16ac0 - 0x16ac0: 0x40394220, 0x16ac1: 0x40396620, 0x16ac2: 0x40397820, 0x16ac3: 0x40396620, - 0x16ac4: 0x40396820, 0x16ac5: 0x40396c20, 0x16ac6: 0x40396a20, 0x16ac7: 0x40396e20, - 0x16ac8: 0x40398a21, 0x16ac9: 0x40398a20, 0x16aca: 0x40399020, 0x16acb: 0x40399220, - 0x16acc: 0x40399420, 0x16acd: 0x40399620, 0x16ace: 0x40399820, 0x16acf: 0x40399a20, - 0x16ad0: 0x40399c20, 0x16ad1: 0x4039a621, 0x16ad2: 0x4039aa20, 0x16ad3: 0x4039a620, - 0x16ad4: 0x4039ae20, 0x16ad5: 0x4039b020, 0x16ad6: 0x4039b820, 0x16ad7: 0x4039b420, - 0x16ad8: 0x4039b620, 0x16ad9: 0x4039b820, 0x16ada: 0x4039ca20, 0x16adb: 0x4039cc20, - 0x16adc: 0x4039ce20, 0x16add: 0x4039e020, 0x16ade: 0x4039e220, 0x16adf: 0x4039ea20, - 0x16ae0: 0x4039f220, 0x16ae1: 0x4039fe20, 0x16ae2: 0x403a0020, 0x16ae3: 0x403a0220, - 0x16ae4: 0x403a0420, 0x16ae5: 0x403a0820, 0x16ae6: 0x403a0a20, 0x16ae7: 0x403a1420, - 0x16ae8: 0x403a1620, 0x16ae9: 0x403a1c20, 0x16aea: 0x403a1c21, 0x16aeb: 0x403a2020, - 0x16aec: 0x403a2220, 0x16aed: 0x403a2620, 0x16aee: 0x403a2820, 0x16aef: 0x403a2021, - 0x16af0: 0x403a2c20, 0x16af1: 0x403a2e20, 0x16af2: 0x403a3020, 0x16af3: 0x403a3220, - 0x16af4: 0x403a3420, 0x16af5: 0x403a4220, 0x16af6: 0x403a4420, 0x16af7: 0x403a4620, - 0x16af8: 0x403a4820, 0x16af9: 0x403a6020, 0x16afa: 0x403a5820, 0x16afb: 0x403a5c21, - 0x16afc: 0x403a5c20, 0x16afd: 0x403a5e20, 0x16afe: 0x403a6823, 0x16aff: 0x40396c20, - // Block 0x5ac, offset 0x16b00 - 0x16b00: 0x003a6883, 0x16b01: 0x403a6822, 0x16b02: 0xe000ad86, 0x16b03: 0x403a6825, - 0x16b04: 0x403a7620, 0x16b05: 0x403a7820, 0x16b06: 0x403a7a20, 0x16b07: 0x403a7422, - 0x16b08: 0x403a7e20, 0x16b09: 0x403a7423, 0x16b0a: 0x403a8220, 0x16b0b: 0x403a8420, - 0x16b0c: 0xcea40171, 0x16b0d: 0x403a9225, 0x16b0e: 0x403a9620, 0x16b0f: 0x403a8620, - 0x16b10: 0x403a9224, 0x16b11: 0x403a9a20, 0x16b12: 0x403a9222, 0x16b13: 0xe00037b6, - 0x16b14: 0x4002e820, 0x16b15: 0xce9e0171, 0x16b16: 0xae600000, 0x16b17: 0xae600000, - 0x16b18: 0xae600000, 0x16b19: 0xae600000, 0x16b1a: 0xae600000, 0x16b1b: 0xae600000, - 0x16b1c: 0xae600000, 0x16b1d: 0xa0000000, 0x16b1e: 0x40071220, 0x16b1f: 0xae600000, - 0x16b20: 0xae600000, 0x16b21: 0xae600000, 0x16b22: 0xae600000, 0x16b23: 0xadc00000, - 0x16b24: 0xae600000, 0x16b25: 0x003a7484, 0x16b26: 0x003a9084, 0x16b27: 0xae600000, - 0x16b28: 0xae600000, 0x16b29: 0x40071420, 0x16b2a: 0xadc00000, 0x16b2b: 0xae600000, - 0x16b2c: 0xae600000, 0x16b2d: 0xadc00000, 0x16b2e: 0x40399e20, 0x16b2f: 0x4039ba20, - 0x16b30: 0xe0000161, 0x16b31: 0xe00001e9, 0x16b32: 0xe0000304, 0x16b33: 0xe00003de, - 0x16b34: 0xe00004b9, 0x16b35: 0xe0000583, 0x16b36: 0xe000064e, 0x16b37: 0xe00006f6, - 0x16b38: 0xe00007a2, 0x16b39: 0xe0000847, 0x16b3a: 0x4039d020, 0x16b3b: 0x4039e420, - 0x16b3c: 0x4039f420, 0x16b3d: 0xe0001553, 0x16b3e: 0xe0001779, 0x16b3f: 0x403a7020, - // Block 0x5ad, offset 0x16b40 - 0x16b40: 0x00021284, 0x16b41: 0x00021284, 0x16b42: 0x00021284, 0x16b43: 0x00021284, - 0x16b44: 0x00021284, 0x16b45: 0x00021284, 0x16b46: 0x00021284, 0x16b47: 0x0002129b, - 0x16b48: 0x00021284, 0x16b49: 0x00021284, 0x16b4a: 0x00021284, 0x16b4b: 0xa0000000, - 0x16b4c: 0x40021221, 0x16b4d: 0x40021222, 0x16b4e: 0xa0000000, 0x16b4f: 0xa0000000, - 0x16b50: 0x40022620, 0x16b51: 0x0002269b, 0x16b52: 0x40022820, 0x16b53: 0x40022a20, - 0x16b54: 0x40022c20, 0x16b55: 0x40022e20, 0x16b56: 0x4004c420, 0x16b57: 0x40021820, - 0x16b58: 0x4003d420, 0x16b59: 0x4003d620, 0x16b5a: 0x4003d820, 0x16b5b: 0x4003da20, - 0x16b5c: 0x4003e220, 0x16b5d: 0x4003e420, 0x16b5e: 0x4003e620, 0x16b5f: 0x4003e820, - 0x16b60: 0x4004f820, 0x16b61: 0x4004fa20, 0x16b62: 0x40050220, 0x16b63: 0x40050420, - 0x16b64: 0x0002e484, 0x16b65: 0xf0001f04, 0x16b66: 0xf0000404, 0x16b67: 0x40050620, - 0x16b68: 0x40020e20, 0x16b69: 0x40021020, 0x16b6a: 0xa0000000, 0x16b6b: 0xa0000000, - 0x16b6c: 0xa0000000, 0x16b6d: 0xa0000000, 0x16b6e: 0xa0000000, 0x16b6f: 0x0002129b, - 0x16b70: 0x4004f020, 0x16b71: 0x4004f420, 0x16b72: 0x40050e20, 0x16b73: 0xf0001f04, - 0x16b74: 0xf0000404, 0x16b75: 0x40051020, 0x16b76: 0xf0001f04, 0x16b77: 0xf0000404, - 0x16b78: 0x40051620, 0x16b79: 0x4003dc20, 0x16b7a: 0x4003de20, 0x16b7b: 0x40051820, - 0x16b7c: 0xf0001f04, 0x16b7d: 0x4002e020, 0x16b7e: 0x40021420, 0x16b7f: 0x40051a20, - // Block 0x5ae, offset 0x16b80 - 0x16b80: 0x40073420, 0x16b81: 0x40073620, - 0x16b93: 0x003a269a, - 0x16b94: 0x003a2699, 0x16b95: 0x003a2697, 0x16b96: 0x003a2698, 0x16b97: 0x003a7c9a, - 0x16b98: 0x003a7c99, 0x16b99: 0x003a7a9a, 0x16b9a: 0x003a7a99, 0x16b9b: 0x003a7e9a, - 0x16b9c: 0x003a7e99, 0x16b9d: 0xe000ad8c, 0x16b9e: 0x003a849a, 0x16b9f: 0x003a8499, - 0x16ba0: 0x003a789a, 0x16ba1: 0x003a7899, 0x16ba2: 0x003a809a, 0x16ba3: 0x003a8099, - 0x16ba4: 0x003a989a, 0x16ba5: 0x003a9899, 0x16ba6: 0x003a9897, 0x16ba7: 0x003a9898, - 0x16ba8: 0x003a8e97, 0x16ba9: 0x003a8e98, 0x16baa: 0xe0001559, 0x16bab: 0xe0001556, - 0x16bac: 0xe0001589, 0x16bad: 0xe0001586, 0x16bae: 0xe000158f, 0x16baf: 0xe000158c, - 0x16bb0: 0xe000159b, 0x16bb1: 0xe0001598, 0x16bb2: 0xe0001595, 0x16bb3: 0xe0001592, - 0x16bb4: 0xe00015a1, 0x16bb5: 0xe000159e, 0x16bb6: 0xe00015bf, 0x16bb7: 0xe00015bc, - 0x16bb8: 0xe00015b9, 0x16bb9: 0xe00015ad, 0x16bba: 0xe00015a7, 0x16bbb: 0xe00015a4, - 0x16bbc: 0x003a929a, 0x16bbd: 0x003a9299, 0x16bbe: 0x003a9297, 0x16bbf: 0x003a9298, - // Block 0x5af, offset 0x16bc0 - 0x16bc0: 0xf0001a1a, 0x16bc1: 0xf0001a1a, 0x16bc2: 0xf0001a1a, 0x16bc3: 0xe00028f4, - 0x16bc4: 0xe000374d, 0x16bc5: 0xf0001a1a, 0x16bc6: 0xf0001a1a, 0x16bc7: 0xf0001a1a, - 0x16bc8: 0xf0001a1a, 0x16bc9: 0xe00028f7, 0x16bca: 0xe0003750, 0x16bcb: 0xf0001a1a, - 0x16bcc: 0xf0001a1a, 0x16bcd: 0xf0001a1a, 0x16bce: 0xf0001a1a, 0x16bcf: 0xe00028fd, - 0x16bd0: 0xe000375c, 0x16bd1: 0xf0001a1a, 0x16bd2: 0xf0001a1a, 0x16bd3: 0xe0002900, - 0x16bd4: 0xe000376e, 0x16bd5: 0xe0003786, 0x16bd6: 0xe000378c, 0x16bd7: 0xe0003792, - 0x16bd8: 0xe00037a4, 0x16bd9: 0xe0002906, 0x16bda: 0xe00037b3, 0x16bdb: 0xf0001a1a, - 0x16bdc: 0xf0001a1a, 0x16bdd: 0xe000377d, 0x16bde: 0xe0000003, 0x16bdf: 0xe0000006, - 0x16be0: 0xe0000009, 0x16be1: 0xe000000c, 0x16be2: 0xe000000f, 0x16be3: 0xe0000012, - 0x16be4: 0xe000156b, 0x16be5: 0xe000156e, 0x16be6: 0xe0001577, 0x16be7: 0xe000157d, - 0x16be8: 0xe00015aa, 0x16be9: 0xe00015b3, 0x16bea: 0xf0001919, 0x16beb: 0xf0001919, - 0x16bec: 0xf0001919, 0x16bed: 0xf0001919, 0x16bee: 0xe0002891, 0x16bef: 0xe00036a2, - 0x16bf0: 0xf0001919, 0x16bf1: 0xf0001919, 0x16bf2: 0xf0001919, 0x16bf3: 0xf0001919, - 0x16bf4: 0xe0002897, 0x16bf5: 0xe00036ae, 0x16bf6: 0xf0001919, 0x16bf7: 0xf0001919, - 0x16bf8: 0xf0001919, 0x16bf9: 0xf0001919, 0x16bfa: 0xe000289d, 0x16bfb: 0xe00036b7, - 0x16bfc: 0xe00028df, 0x16bfd: 0xe0003705, 0x16bfe: 0xe00028e5, 0x16bff: 0xe000370b, - // Block 0x5b0, offset 0x16c00 - 0x16c00: 0xe0003711, 0x16c01: 0xe000372f, 0x16c02: 0xe000373b, 0x16c03: 0xe00028eb, - 0x16c04: 0xe0003741, 0x16c05: 0xf0001919, 0x16c06: 0xe00028f1, 0x16c07: 0xe000374a, - 0x16c08: 0xf0001919, 0x16c09: 0xf0001919, 0x16c0a: 0xf0001919, 0x16c0b: 0xf0001919, - 0x16c0c: 0xf0001919, 0x16c0d: 0xf0001919, 0x16c0e: 0xe00028fa, 0x16c0f: 0xe0003759, - 0x16c10: 0xe000377a, 0x16c11: 0xe0003795, 0x16c12: 0xe0003798, 0x16c13: 0xe00037a1, - 0x16c14: 0xe00037a7, 0x16c15: 0xe0002903, 0x16c16: 0xe00037b0, 0x16c17: 0xe000155c, - 0x16c18: 0xe0001562, 0x16c19: 0xe0001568, 0x16c1a: 0xe0001571, 0x16c1b: 0xe0001580, - 0x16c1c: 0xf0001717, 0x16c1d: 0xf0001717, 0x16c1e: 0xf0001717, 0x16c1f: 0xf0001717, - 0x16c20: 0xf0001717, 0x16c21: 0xf0001717, 0x16c22: 0xf0001717, 0x16c23: 0xf0001717, - 0x16c24: 0xf0001717, 0x16c25: 0xf0001717, 0x16c26: 0xf0001717, 0x16c27: 0xf0001717, - 0x16c28: 0xf0001717, 0x16c29: 0xf0001717, 0x16c2a: 0xf0001717, 0x16c2b: 0xf0001717, - 0x16c2c: 0xf0001717, 0x16c2d: 0xf0001717, 0x16c2e: 0xf0001717, 0x16c2f: 0xf0001717, - 0x16c30: 0xf0001717, 0x16c31: 0xf0001717, 0x16c32: 0xf0001717, 0x16c33: 0xf0001717, - 0x16c34: 0xf0001717, 0x16c35: 0xf0001717, 0x16c36: 0xf0001717, 0x16c37: 0xf0001717, - 0x16c38: 0xf0001717, 0x16c39: 0xf0001717, 0x16c3a: 0xf0001717, 0x16c3b: 0xf0001717, - 0x16c3c: 0xf0001717, 0x16c3d: 0xf0001717, 0x16c3e: 0xf0001717, 0x16c3f: 0xf0001717, - // Block 0x5b1, offset 0x16c40 - 0x16c40: 0xf0001717, 0x16c41: 0xf0001717, 0x16c42: 0xf0001717, 0x16c43: 0xf0001717, - 0x16c44: 0xe0003717, 0x16c45: 0xe000371d, 0x16c46: 0xe0003723, 0x16c47: 0xe0003729, - 0x16c48: 0xe0003735, 0x16c49: 0xf0001717, 0x16c4a: 0xf0001717, 0x16c4b: 0xf0001717, - 0x16c4c: 0xf0001717, 0x16c4d: 0xf0001717, 0x16c4e: 0xf0001717, 0x16c4f: 0xf0001717, - 0x16c50: 0xf0001717, 0x16c51: 0xf0001717, 0x16c52: 0xf0001717, 0x16c53: 0xf0001717, - 0x16c54: 0xf0001717, 0x16c55: 0xf0001717, 0x16c56: 0xf0001717, 0x16c57: 0xf0001717, - 0x16c58: 0xf0001717, 0x16c59: 0xf0001717, 0x16c5a: 0xe0003783, 0x16c5b: 0xe0003789, - 0x16c5c: 0xe000378f, 0x16c5d: 0xe000379b, 0x16c5e: 0xe00037aa, 0x16c5f: 0xe0001574, - 0x16c60: 0xe0001583, 0x16c61: 0xf0001818, 0x16c62: 0xf0001818, 0x16c63: 0xf0001818, - 0x16c64: 0xf0001818, 0x16c65: 0xf0001818, 0x16c66: 0xf0001818, 0x16c67: 0xf0001818, - 0x16c68: 0xf0001818, 0x16c69: 0xf0001818, 0x16c6a: 0xf0001818, 0x16c6b: 0xe000372c, - 0x16c6c: 0xe0003738, 0x16c6d: 0xf0001818, 0x16c6e: 0xf0001818, 0x16c6f: 0xf0001818, - 0x16c70: 0xe000379e, 0x16c71: 0xe00037ad, 0x16c72: 0xf0001818, 0x16c73: 0xe0003690, - 0x16c74: 0xe0003693, 0x16c75: 0xe00028d0, 0x16c76: 0xe00036f6, 0x16c77: 0xe00028d6, - 0x16c78: 0xe00036fc, 0x16c79: 0xe00028dc, 0x16c7a: 0xe0003702, 0x16c7b: 0xe00028b8, - 0x16c7c: 0xe00036d8, 0x16c7d: 0xe00028be, 0x16c7e: 0xe00036e4, 0x16c7f: 0xe00028ac, - // Block 0x5b2, offset 0x16c80 - 0x16c80: 0xe00036c6, 0x16c81: 0xe00028a6, 0x16c82: 0xe00036c0, 0x16c83: 0xe00028b2, - 0x16c84: 0xe00036cc, 0x16c85: 0xe00028c4, 0x16c86: 0xe00036ea, 0x16c87: 0xe00028ca, - 0x16c88: 0xe00036f0, 0x16c89: 0xf0001a1a, 0x16c8a: 0xf0001a1a, 0x16c8b: 0xf0001a1a, - 0x16c8c: 0xf0001a1a, 0x16c8d: 0xf0001a1a, 0x16c8e: 0xf0001a1a, 0x16c8f: 0xf0001a1a, - 0x16c90: 0xf0001a1a, 0x16c91: 0xe00028cd, 0x16c92: 0xe00036f3, 0x16c93: 0xe00028d3, - 0x16c94: 0xe00036f9, 0x16c95: 0xe00028d9, 0x16c96: 0xe00036ff, 0x16c97: 0xe00028b5, - 0x16c98: 0xe00036d5, 0x16c99: 0xe00028bb, 0x16c9a: 0xe00036e1, 0x16c9b: 0xe00028a9, - 0x16c9c: 0xe00036c3, 0x16c9d: 0xe00028a3, 0x16c9e: 0xe00036bd, 0x16c9f: 0xe00028af, - 0x16ca0: 0xe00036c9, 0x16ca1: 0xe00028c1, 0x16ca2: 0xe00036e7, 0x16ca3: 0xe00028c7, - 0x16ca4: 0xe00036ed, 0x16ca5: 0xf0001919, 0x16ca6: 0xf0001919, 0x16ca7: 0xf0001919, - 0x16ca8: 0xf0001919, 0x16ca9: 0xf0001919, 0x16caa: 0xf0001919, 0x16cab: 0xf0001919, - 0x16cac: 0xf0001919, 0x16cad: 0xf0001717, 0x16cae: 0xf0001717, 0x16caf: 0xf0001717, - 0x16cb0: 0xf0001717, 0x16cb1: 0xf0001717, 0x16cb2: 0xf0001717, 0x16cb3: 0xf0001717, - 0x16cb4: 0xf0001818, 0x16cb5: 0xf0001818, 0x16cb6: 0xf0001818, 0x16cb7: 0xf0001818, - 0x16cb8: 0xf0001818, 0x16cb9: 0xf0001818, 0x16cba: 0xf0001818, 0x16cbb: 0xf0001818, - 0x16cbc: 0xe0003696, 0x16cbd: 0xe0003699, 0x16cbe: 0x4004c020, 0x16cbf: 0x4004c220, - // Block 0x5b3, offset 0x16cc0 - 0x16cc0: 0xa0000000, 0x16cc1: 0xa0000000, 0x16cc2: 0xa0000000, 0x16cc3: 0xa0000000, - 0x16cc4: 0xa0000000, 0x16cc5: 0xa0000000, 0x16cc6: 0xa0000000, 0x16cc7: 0xa0000000, - 0x16cc8: 0xa0000000, 0x16cc9: 0x40020020, 0x16cca: 0x40020220, 0x16ccb: 0x40020420, - 0x16ccc: 0x40020620, 0x16ccd: 0x40020820, 0x16cce: 0xa0000000, 0x16ccf: 0xa0000000, - 0x16cd0: 0xa0000000, 0x16cd1: 0xa0000000, 0x16cd2: 0xa0000000, 0x16cd3: 0xa0000000, - 0x16cd4: 0xa0000000, 0x16cd5: 0xa0000000, 0x16cd6: 0xa0000000, 0x16cd7: 0xa0000000, - 0x16cd8: 0xa0000000, 0x16cd9: 0xa0000000, 0x16cda: 0xa0000000, 0x16cdb: 0xa0000000, - 0x16cdc: 0xa0000000, 0x16cdd: 0xa0000000, 0x16cde: 0xa0000000, 0x16cdf: 0xa0000000, - 0x16ce0: 0x40021220, 0x16ce1: 0x4002ba20, 0x16ce2: 0x4003e020, 0x16ce3: 0x4004ea20, - 0x16ce4: 0x4027de20, 0x16ce5: 0x4004ec20, 0x16ce6: 0x4004e620, 0x16ce7: 0x4003d220, - 0x16ce8: 0x4003f420, 0x16ce9: 0x4003f620, 0x16cea: 0x4004d820, 0x16ceb: 0x40093820, - 0x16cec: 0x40024020, 0x16ced: 0x40021a20, 0x16cee: 0x4002e420, 0x16cef: 0x4004e220, - 0x16cf0: 0x4029cc20, 0x16cf1: 0x4029ce20, 0x16cf2: 0x4029d020, 0x16cf3: 0x4029d220, - 0x16cf4: 0x4029d420, 0x16cf5: 0x4029d620, 0x16cf6: 0x4029d820, 0x16cf7: 0x4029da20, - 0x16cf8: 0x4029dc20, 0x16cf9: 0x4029de20, 0x16cfa: 0x40026c20, 0x16cfb: 0x40026220, - 0x16cfc: 0x40094020, 0x16cfd: 0x40094220, 0x16cfe: 0x40094420, 0x16cff: 0x4002c420, - // Block 0x5b4, offset 0x16d00 - 0x16d00: 0x4004d620, 0x16d01: 0xcead9741, 0x16d02: 0x002c0a88, 0x16d03: 0x002c3a88, - 0x16d04: 0x002c6288, 0x16d05: 0x002c9888, 0x16d06: 0x002d0888, 0x16d07: 0x002d2288, - 0x16d08: 0x002d6888, 0x16d09: 0xc6182741, 0x16d0a: 0x002dcc88, 0x16d0b: 0x002dfe88, - 0x16d0c: 0xc0030002, 0x16d0d: 0x002e8288, 0x16d0e: 0x002e9e88, 0x16d0f: 0x002ee288, - 0x16d10: 0x002f2c88, 0x16d11: 0x002f5688, 0x16d12: 0x002f7a88, 0x16d13: 0xceb39771, - 0x16d14: 0xceb99771, 0x16d15: 0x00306c88, 0x16d16: 0x0030be88, 0x16d17: 0x0030e288, - 0x16d18: 0x0030f688, 0x16d19: 0x00310088, 0x16d1a: 0x00312a88, 0x16d1b: 0x4003f820, - 0x16d1c: 0x4004e420, 0x16d1d: 0x4003fa20, 0x16d1e: 0x40062420, 0x16d1f: 0x40021620, - 0x16d20: 0x40061e20, 0x16d21: 0xceaa9741, 0x16d22: 0x402c0a20, 0x16d23: 0x402c3a20, - 0x16d24: 0x402c6220, 0x16d25: 0x402c9820, 0x16d26: 0x402d0820, 0x16d27: 0x402d2220, - 0x16d28: 0x402d6820, 0x16d29: 0xc6162741, 0x16d2a: 0x402dcc20, 0x16d2b: 0x402dfe20, - 0x16d2c: 0xc0000002, 0x16d2d: 0x402e8220, 0x16d2e: 0x402e9e20, 0x16d2f: 0x402ee220, - 0x16d30: 0x402f2c20, 0x16d31: 0x402f5620, 0x16d32: 0x402f7a20, 0x16d33: 0xceb09771, - 0x16d34: 0xceb69771, 0x16d35: 0x40306c20, 0x16d36: 0x4030be20, 0x16d37: 0x4030e220, - 0x16d38: 0x4030f620, 0x16d39: 0x40310020, 0x16d3a: 0x40312a20, 0x16d3b: 0x4003fc20, - 0x16d3c: 0x40094820, 0x16d3d: 0x4003fe20, 0x16d3e: 0x40094c20, 0x16d3f: 0xa0000000, - // Block 0x5b5, offset 0x16d40 - 0x16d40: 0xe00008f5, 0x16d41: 0xe00008ef, 0x16d42: 0x002be283, 0x16d43: 0xe0000969, - 0x16d44: 0xe000095b, 0x16d45: 0xe000094d, 0x16d46: 0xe00009dd, 0x16d47: 0xe0000a53, - 0x16d48: 0xe0000ae8, 0x16d49: 0xe0000ae2, 0x16d4a: 0xe0000af4, 0x16d4b: 0xe0000b20, - 0x16d4c: 0xe0000c2b, 0x16d4d: 0xe0000c25, 0x16d4e: 0x002d9c83, 0x16d4f: 0xe0000c43, - 0x16d50: 0xe0000ab3, 0x16d51: 0xe0000d63, 0x16d52: 0xe0000d9a, 0x16d53: 0xe0000d94, - 0x16d54: 0xe0000da6, 0x16d55: 0xe0000de6, 0x16d56: 0xe0000dd2, 0x16d57: 0x40093e20, - 0x16d58: 0xe0000e12, 0x16d59: 0xe0000fe1, 0x16d5a: 0xe0000fdb, 0x16d5b: 0xe0000fed, - 0x16d5c: 0xe0000fff, 0x16d5d: 0xe0001102, 0x16d5e: 0x00318888, 0x16d5f: 0xe0000f7b, - 0x16d60: 0xe00008f2, 0x16d61: 0xe00008ec, 0x16d62: 0x402be220, 0x16d63: 0xe0000966, - 0x16d64: 0xe0000958, 0x16d65: 0xe000094a, 0x16d66: 0xe00009d5, 0x16d67: 0xe0000a4d, - 0x16d68: 0xe0000ae5, 0x16d69: 0xe0000adf, 0x16d6a: 0xe0000af1, 0x16d6b: 0xe0000b1d, - 0x16d6c: 0xe0000c28, 0x16d6d: 0xe0000c22, 0x16d6e: 0x402d9c20, 0x16d6f: 0xe0000c40, - 0x16d70: 0xe0000aad, 0x16d71: 0xe0000d60, 0x16d72: 0xe0000d97, 0x16d73: 0xe0000d91, - 0x16d74: 0xe0000da3, 0x16d75: 0xe0000de3, 0x16d76: 0xe0000dcf, 0x16d77: 0x40093c20, - 0x16d78: 0xe0000e0f, 0x16d79: 0xe0000fde, 0x16d7a: 0xe0000fd8, 0x16d7b: 0xe0000fea, - 0x16d7c: 0xe0000ffc, 0x16d7d: 0xe00010ff, 0x16d7e: 0x40318820, 0x16d7f: 0xe0001114, - // Block 0x5b6, offset 0x16d80 - 0x16d80: 0xe0000983, 0x16d81: 0xe0000980, 0x16d82: 0x002be083, 0x16d83: 0x402be020, - 0x16d84: 0xe000097d, 0x16d85: 0xe000097a, 0x16d86: 0xe0000a38, 0x16d87: 0xe0000a35, - 0x16d88: 0xe0000a3e, 0x16d89: 0xe0000a3b, 0x16d8a: 0xe0000a4a, 0x16d8b: 0xe0000a47, - 0x16d8c: 0xe0000a44, 0x16d8d: 0xe0000a41, 0x16d8e: 0xe0000a86, 0x16d8f: 0xe0000a83, - 0x16d90: 0xe0000aaa, 0x16d91: 0xe0000aa7, 0x16d92: 0xe0000b46, 0x16d93: 0xe0000b43, - 0x16d94: 0xe0000aee, 0x16d95: 0xe0000aeb, 0x16d96: 0xe0000b2c, 0x16d97: 0xe0000b29, - 0x16d98: 0xe0000b40, 0x16d99: 0xe0000b3d, 0x16d9a: 0xe0000b1a, 0x16d9b: 0xe0000b17, - 0x16d9c: 0xe0000bb8, 0x16d9d: 0xe0000bb5, 0x16d9e: 0xe0000bb2, 0x16d9f: 0xe0000baf, - 0x16da0: 0xe0000bc4, 0x16da1: 0xe0000bc1, 0x16da2: 0xe0000bca, 0x16da3: 0xe0000bc7, - 0x16da4: 0xe0000bee, 0x16da5: 0xe0000beb, 0x16da6: 0xe0000c1b, 0x16da7: 0xe0000c18, - 0x16da8: 0xe0000c51, 0x16da9: 0xe0000c4e, 0x16daa: 0xe0000c60, 0x16dab: 0xe0000c5d, - 0x16dac: 0xe0000c31, 0x16dad: 0xe0000c2e, 0x16dae: 0xe0000c5a, 0x16daf: 0xe0000c57, - 0x16db0: 0xe0000c54, 0x16db1: 0x402da220, 0x16db2: 0xf0000a0a, 0x16db3: 0xf0000404, - 0x16db4: 0xe0000c8a, 0x16db5: 0xe0000c87, 0x16db6: 0xe0000c9f, 0x16db7: 0xe0000c9c, - 0x16db8: 0x402f7220, 0x16db9: 0xe0000ccc, 0x16dba: 0xe0000cc9, 0x16dbb: 0xe0000cd8, - 0x16dbc: 0xe0000cd5, 0x16dbd: 0xe0000cd2, 0x16dbe: 0xe0000ccf, 0x16dbf: 0xe0000d04, - // Block 0x5b7, offset 0x16dc0 - 0x16dc0: 0xe0000cfe, 0x16dc1: 0xe0000cf8, 0x16dc2: 0xe0000cf5, 0x16dc3: 0xe0000d51, - 0x16dc4: 0xe0000d4e, 0x16dc5: 0xe0000d6f, 0x16dc6: 0xe0000d6c, 0x16dc7: 0xe0000d5d, - 0x16dc8: 0xe0000d5a, 0x16dc9: 0xf0000404, 0x16dca: 0x002eda88, 0x16dcb: 0x402eda20, - 0x16dcc: 0xe0000e2e, 0x16dcd: 0xe0000e2b, 0x16dce: 0xe0000da0, 0x16dcf: 0xe0000d9d, - 0x16dd0: 0xe0000de0, 0x16dd1: 0xe0000ddd, 0x16dd2: 0xe0000e93, 0x16dd3: 0xe0000e8f, - 0x16dd4: 0xe0000eca, 0x16dd5: 0xe0000ec7, 0x16dd6: 0xe0000edc, 0x16dd7: 0xe0000ed9, - 0x16dd8: 0xe0000ed0, 0x16dd9: 0xe0000ecd, 0x16dda: 0xe0000f1f, 0x16ddb: 0xe0000f1c, - 0x16ddc: 0xe0000f2d, 0x16ddd: 0xe0000f2a, 0x16dde: 0x002fe883, 0x16ddf: 0x402fe820, - 0x16de0: 0xe0000f33, 0x16de1: 0xe0000f30, 0x16de2: 0x00302e83, 0x16de3: 0x40302e20, - 0x16de4: 0xe0000f8a, 0x16de5: 0xe0000f87, 0x16de6: 0x00303688, 0x16de7: 0x40303620, - 0x16de8: 0xe000102b, 0x16de9: 0xe0001028, 0x16dea: 0xe000103f, 0x16deb: 0xe000103c, - 0x16dec: 0xe0000fe7, 0x16ded: 0xe0000fe4, 0x16dee: 0xe0000ff9, 0x16def: 0xe0000ff6, - 0x16df0: 0xe0001025, 0x16df1: 0xe0001022, 0x16df2: 0xe0001039, 0x16df3: 0xe0001036, - 0x16df4: 0xe00010d8, 0x16df5: 0xe00010d5, 0x16df6: 0xe000110e, 0x16df7: 0xe000110b, - 0x16df8: 0xe0001117, 0x16df9: 0xe000113b, 0x16dfa: 0xe0001138, 0x16dfb: 0xe000114d, - 0x16dfc: 0xe000114a, 0x16dfd: 0xe0001147, 0x16dfe: 0xe0001144, 0x16dff: 0xe0000f64, - // Block 0x5b8, offset 0x16e00 - 0x16e00: 0xe000098f, 0x16e01: 0xe000098c, 0x16e02: 0xe0000995, 0x16e03: 0xe0000992, - 0x16e04: 0xe0000b62, 0x16e05: 0xe0000b5f, 0x16e06: 0xe0000b68, 0x16e07: 0xe0000b65, - 0x16e08: 0xe0000c6c, 0x16e09: 0xe0000c69, 0x16e0a: 0xe0000c72, 0x16e0b: 0xe0000c6f, - 0x16e0c: 0xe0000e4a, 0x16e0d: 0xe0000e47, 0x16e0e: 0xe0000e50, 0x16e0f: 0xe0000e4d, - 0x16e10: 0xe0000ee8, 0x16e11: 0xe0000ee5, 0x16e12: 0xe0000eee, 0x16e13: 0xe0000eeb, - 0x16e14: 0xe0001053, 0x16e15: 0xe0001050, 0x16e16: 0xe0001059, 0x16e17: 0xe0001056, - 0x16e18: 0x002fe883, 0x16e19: 0x402fe820, 0x16e1a: 0x00302e83, 0x16e1b: 0x40302e20, - 0x16e1c: 0x00312288, 0x16e1d: 0x40312220, 0x16e1e: 0xe0000bf4, 0x16e1f: 0xe0000bf1, - 0x16e20: 0x002ebc88, 0x16e21: 0x402c8c20, 0x16e22: 0x002f2288, 0x16e23: 0x402f2220, - 0x16e24: 0x00314088, 0x16e25: 0x40314020, 0x16e26: 0xe000096f, 0x16e27: 0xe000096c, - 0x16e28: 0xe0000b32, 0x16e29: 0xe0000b2f, 0x16e2a: 0xe0000dd9, 0x16e2b: 0xe0000dd5, - 0x16e2c: 0xe0000dfd, 0x16e2d: 0xe0000df9, 0x16e2e: 0xe0000e04, 0x16e2f: 0xe0000e01, - 0x16e30: 0xe0000e0b, 0x16e31: 0xe0000e07, 0x16e32: 0xe0001129, 0x16e33: 0xe0001126, - 0x16e34: 0x402e5e20, 0x16e35: 0x402ed020, 0x16e36: 0x40305a20, 0x16e37: 0x402dd420, - 0x16e38: 0xe0000abf, 0x16e39: 0xe0000ec4, 0x16e3a: 0x002be888, 0x16e3b: 0x002c4488, - 0x16e3c: 0x402c4420, 0x16e3d: 0x002e3888, 0x16e3e: 0x00303e88, 0x16e3f: 0x402ffc20, - // Block 0x5b9, offset 0x16e40 - 0x16e40: 0xe00010d2, 0x16e41: 0xe00010cf, 0x16e42: 0xe00010cc, 0x16e43: 0xe00010c9, - 0x16e44: 0xe00010e1, 0x16e45: 0xe00010de, 0x16e46: 0xe00010e7, 0x16e47: 0xe00010e4, - 0x16e48: 0xe00010ed, 0x16e49: 0xe00010ea, 0x16e4a: 0xe00010fc, 0x16e4b: 0xe00010f9, - 0x16e4c: 0xe00010f6, 0x16e4d: 0xe00010f3, 0x16e4e: 0xe0001123, 0x16e4f: 0xe0001120, - 0x16e50: 0xe0001141, 0x16e51: 0xe000113e, 0x16e52: 0xe0001153, 0x16e53: 0xe0001150, - 0x16e54: 0xe0001159, 0x16e55: 0xe0001156, 0x16e56: 0xe0000c15, 0x16e57: 0xe0000f8d, - 0x16e58: 0xe00010db, 0x16e59: 0xe0001111, 0x16e5a: 0xf0000404, 0x16e5b: 0xe0000f70, - 0x16e5c: 0x40300420, 0x16e5d: 0x40300620, 0x16e5e: 0xe0000f7f, 0x16e5f: 0x402c9620, - 0x16e60: 0xe000099b, 0x16e61: 0xe0000998, 0x16e62: 0xe0000989, 0x16e63: 0xe0000986, - 0x16e64: 0xe0003934, 0x16e65: 0xe0003931, 0x16e66: 0xe000393a, 0x16e67: 0xe0003937, - 0x16e68: 0xe0003975, 0x16e69: 0xe0003972, 0x16e6a: 0xe0003960, 0x16e6b: 0xe000395d, - 0x16e6c: 0xe0003987, 0x16e6d: 0xe0003984, 0x16e6e: 0xe000388e, 0x16e6f: 0xe000388b, - 0x16e70: 0xe0003894, 0x16e71: 0xe0003891, 0x16e72: 0xe0003908, 0x16e73: 0xe0003905, - 0x16e74: 0xe00038d2, 0x16e75: 0xe00038cf, 0x16e76: 0xe000391a, 0x16e77: 0xe0003917, - 0x16e78: 0xe0000b6e, 0x16e79: 0xe0000b6b, 0x16e7a: 0xe0000b5c, 0x16e7b: 0xe0000b59, - 0x16e7c: 0xe0000b26, 0x16e7d: 0xe0000b23, 0x16e7e: 0xe0000afb, 0x16e7f: 0xe0000af7, - // Block 0x5ba, offset 0x16e80 - 0x16e80: 0xa0000000, 0x16e81: 0xa0000000, 0x16e82: 0xa0000000, 0x16e83: 0xa0000000, - 0x16e84: 0xa0000000, 0x16e85: 0xa0000000, 0x16e86: 0xa0000000, 0x16e87: 0xa0000000, - 0x16e88: 0xa0000000, 0x16e89: 0x40020020, 0x16e8a: 0x40020220, 0x16e8b: 0x40020420, - 0x16e8c: 0x40020620, 0x16e8d: 0x40020820, 0x16e8e: 0xa0000000, 0x16e8f: 0xa0000000, - 0x16e90: 0xa0000000, 0x16e91: 0xa0000000, 0x16e92: 0xa0000000, 0x16e93: 0xa0000000, - 0x16e94: 0xa0000000, 0x16e95: 0xa0000000, 0x16e96: 0xa0000000, 0x16e97: 0xa0000000, - 0x16e98: 0xa0000000, 0x16e99: 0xa0000000, 0x16e9a: 0xa0000000, 0x16e9b: 0xa0000000, - 0x16e9c: 0xa0000000, 0x16e9d: 0xa0000000, 0x16e9e: 0xa0000000, 0x16e9f: 0xa0000000, - 0x16ea0: 0x40021220, 0x16ea1: 0x4002ba20, 0x16ea2: 0x4003e020, 0x16ea3: 0x4004ea20, - 0x16ea4: 0x4027de20, 0x16ea5: 0x4004ec20, 0x16ea6: 0x4004e620, 0x16ea7: 0x4003d220, - 0x16ea8: 0x4003f420, 0x16ea9: 0x4003f620, 0x16eaa: 0x4004d820, 0x16eab: 0x40093820, - 0x16eac: 0x40024020, 0x16ead: 0x40021a20, 0x16eae: 0x4002e420, 0x16eaf: 0x4004e220, - 0x16eb0: 0x4029cc20, 0x16eb1: 0x4029ce20, 0x16eb2: 0x4029d020, 0x16eb3: 0x4029d220, - 0x16eb4: 0x4029d420, 0x16eb5: 0x4029d620, 0x16eb6: 0x4029d820, 0x16eb7: 0x4029da20, - 0x16eb8: 0x4029dc20, 0x16eb9: 0x4029de20, 0x16eba: 0x40026c20, 0x16ebb: 0x40026220, - 0x16ebc: 0x40094020, 0x16ebd: 0x40094220, 0x16ebe: 0x40094420, 0x16ebf: 0x4002c420, - // Block 0x5bb, offset 0x16ec0 - 0x16ec0: 0x4004d620, 0x16ec1: 0xcec29791, 0x16ec2: 0x002c0a88, 0x16ec3: 0xceca0991, - 0x16ec4: 0x002c6288, 0x16ec5: 0x002c9888, 0x16ec6: 0x002d0888, 0x16ec7: 0xced20991, - 0x16ec8: 0x002d6888, 0x16ec9: 0x002d9a88, 0x16eca: 0x002dcc88, 0x16ecb: 0xcb1f0991, - 0x16ecc: 0xc0030002, 0x16ecd: 0x002e8288, 0x16ece: 0xced797e1, 0x16ecf: 0xcee49811, - 0x16ed0: 0x002f2c88, 0x16ed1: 0x002f5688, 0x16ed2: 0x002f7a88, 0x16ed3: 0xcb330991, - 0x16ed4: 0x00302c88, 0x16ed5: 0xc3900b21, 0x16ed6: 0x0030be88, 0x16ed7: 0x0030e288, - 0x16ed8: 0x0030f688, 0x16ed9: 0x00310088, 0x16eda: 0xcedc0991, 0x16edb: 0x4003f820, - 0x16edc: 0x4004e420, 0x16edd: 0x4003fa20, 0x16ede: 0x40062420, 0x16edf: 0x40021620, - 0x16ee0: 0x40061e20, 0x16ee1: 0xcebc9791, 0x16ee2: 0x402c0a20, 0x16ee3: 0xcec80991, - 0x16ee4: 0x402c6220, 0x16ee5: 0x402c9820, 0x16ee6: 0x402d0820, 0x16ee7: 0xced00991, - 0x16ee8: 0x402d6820, 0x16ee9: 0x402d9a20, 0x16eea: 0x402dcc20, 0x16eeb: 0xcb1d0991, - 0x16eec: 0xc0000002, 0x16eed: 0x402e8220, 0x16eee: 0xced497e1, 0x16eef: 0xcede9811, - 0x16ef0: 0x402f2c20, 0x16ef1: 0x402f5620, 0x16ef2: 0x402f7a20, 0x16ef3: 0xcb310991, - 0x16ef4: 0x40302c20, 0x16ef5: 0xc38d0b21, 0x16ef6: 0x4030be20, 0x16ef7: 0x4030e220, - 0x16ef8: 0x4030f620, 0x16ef9: 0x40310020, 0x16efa: 0xceda0991, 0x16efb: 0x4003fc20, - 0x16efc: 0x40094820, 0x16efd: 0x4003fe20, 0x16efe: 0x40094c20, 0x16eff: 0xa0000000, - // Block 0x5bc, offset 0x16f00 - 0x16f00: 0xe00008f5, 0x16f01: 0x002c0883, 0x16f02: 0xe0000921, 0x16f03: 0x00320ea3, - 0x16f04: 0x00320e83, 0x16f05: 0x00320c83, 0x16f06: 0x00320a83, 0x16f07: 0xe0000a53, - 0x16f08: 0xe0000ae8, 0x16f09: 0xe0000ae2, 0x16f0a: 0xe0000af4, 0x16f0b: 0xe0000b20, - 0x16f0c: 0xe0000c2b, 0x16f0d: 0xe0000c25, 0x16f0e: 0xe0000c37, 0x16f0f: 0xe0000c43, - 0x16f10: 0x002c96a3, 0x16f11: 0x002ee0c3, 0x16f12: 0xe0000d9a, 0x16f13: 0xe0000d94, - 0x16f14: 0x003210e3, 0x16f15: 0x003210c3, 0x16f16: 0x00321083, 0x16f17: 0x40093e20, - 0x16f18: 0x00320883, 0x16f19: 0xe0000fe1, 0x16f1a: 0xe0000fdb, 0x16f1b: 0xe0000fed, - 0x16f1c: 0x003100a3, 0x16f1d: 0xe0001102, 0x16f1e: 0x00306aa3, 0x16f1f: 0xe0000f7b, - 0x16f20: 0xe00008f2, 0x16f21: 0x402c0820, 0x16f22: 0xe000091e, 0x16f23: 0x40320e21, - 0x16f24: 0x40320e20, 0x16f25: 0x40320c20, 0x16f26: 0x40320a20, 0x16f27: 0xe0000a4d, - 0x16f28: 0xe0000ae5, 0x16f29: 0xe0000adf, 0x16f2a: 0xe0000af1, 0x16f2b: 0xe0000b1d, - 0x16f2c: 0xe0000c28, 0x16f2d: 0xe0000c22, 0x16f2e: 0xe0000c34, 0x16f2f: 0xe0000c40, - 0x16f30: 0x402c9621, 0x16f31: 0x402ee022, 0x16f32: 0xe0000d97, 0x16f33: 0xe0000d91, - 0x16f34: 0x40321023, 0x16f35: 0x40321022, 0x16f36: 0x40321020, 0x16f37: 0x40093c20, - 0x16f38: 0x40320820, 0x16f39: 0xe0000fde, 0x16f3a: 0xe0000fd8, 0x16f3b: 0xe0000fea, - 0x16f3c: 0x40310021, 0x16f3d: 0xe00010ff, 0x16f3e: 0x40306a21, 0x16f3f: 0xe0001114, - // Block 0x5bd, offset 0x16f40 - 0x16f40: 0xe0000983, 0x16f41: 0xe0000980, 0x16f42: 0xe00008fb, 0x16f43: 0xe00008f8, - 0x16f44: 0xe000097d, 0x16f45: 0xe000097a, 0x16f46: 0xe0000a38, 0x16f47: 0xe0000a35, - 0x16f48: 0xe0000a3e, 0x16f49: 0xe0000a3b, 0x16f4a: 0xe0000a4a, 0x16f4b: 0xe0000a47, - 0x16f4c: 0x002c5c83, 0x16f4d: 0x402c5c20, 0x16f4e: 0xe0000a86, 0x16f4f: 0xe0000a83, - 0x16f50: 0x002c9683, 0x16f51: 0x402c9620, 0x16f52: 0xe0000b46, 0x16f53: 0xe0000b43, - 0x16f54: 0xe0000aee, 0x16f55: 0xe0000aeb, 0x16f56: 0xe0000b2c, 0x16f57: 0xe0000b29, - 0x16f58: 0xe0000b40, 0x16f59: 0xe0000b3d, 0x16f5a: 0xe0000b1a, 0x16f5b: 0xe0000b17, - 0x16f5c: 0xe0000bb8, 0x16f5d: 0xe0000bb5, 0x16f5e: 0xe0000bb2, 0x16f5f: 0xe0000baf, - 0x16f60: 0xe0000bc4, 0x16f61: 0xe0000bc1, 0x16f62: 0xe0000bca, 0x16f63: 0xe0000bc7, - 0x16f64: 0xe0000bee, 0x16f65: 0xe0000beb, 0x16f66: 0xe0000c1b, 0x16f67: 0xe0000c18, - 0x16f68: 0xe0000c51, 0x16f69: 0xe0000c4e, 0x16f6a: 0xe0000c60, 0x16f6b: 0xe0000c5d, - 0x16f6c: 0xe0000c31, 0x16f6d: 0xe0000c2e, 0x16f6e: 0xe0000c5a, 0x16f6f: 0xe0000c57, - 0x16f70: 0xe0000c54, 0x16f71: 0x402da220, 0x16f72: 0xf0000a0a, 0x16f73: 0xf0000404, - 0x16f74: 0xe0000c8a, 0x16f75: 0xe0000c87, 0x16f76: 0xe0000c9f, 0x16f77: 0xe0000c9c, - 0x16f78: 0x402f7220, 0x16f79: 0xe0000ccc, 0x16f7a: 0xe0000cc9, 0x16f7b: 0xe0000cd8, - 0x16f7c: 0xe0000cd5, 0x16f7d: 0xe0000cd2, 0x16f7e: 0xe0000ccf, 0x16f7f: 0xe0000d04, - // Block 0x5be, offset 0x16f80 - 0x16f80: 0xe0000cfe, 0x16f81: 0xe0000cf8, 0x16f82: 0xe0000cf5, 0x16f83: 0x002ee0a3, - 0x16f84: 0x402ee021, 0x16f85: 0xe0000d6f, 0x16f86: 0xe0000d6c, 0x16f87: 0xe0000d5d, - 0x16f88: 0xe0000d5a, 0x16f89: 0xf0000404, 0x16f8a: 0x002ee083, 0x16f8b: 0x402ee020, - 0x16f8c: 0xe0000e2e, 0x16f8d: 0xe0000e2b, 0x16f8e: 0xe0000da0, 0x16f8f: 0xe0000d9d, - 0x16f90: 0x003210a3, 0x16f91: 0x40321021, 0x16f92: 0x003208a3, 0x16f93: 0x40320821, - 0x16f94: 0xe0000eca, 0x16f95: 0xe0000ec7, 0x16f96: 0xe0000edc, 0x16f97: 0xe0000ed9, - 0x16f98: 0xe0000ed0, 0x16f99: 0xe0000ecd, 0x16f9a: 0xe0000f1f, 0x16f9b: 0xe0000f1c, - 0x16f9c: 0xe0000f2d, 0x16f9d: 0xe0000f2a, 0x16f9e: 0xe0000f47, 0x16f9f: 0xe0000f44, - 0x16fa0: 0x00302a83, 0x16fa1: 0x40302a20, 0x16fa2: 0xe0000f99, 0x16fa3: 0xe0000f96, - 0x16fa4: 0xe0000f8a, 0x16fa5: 0xe0000f87, 0x16fa6: 0x00306a83, 0x16fa7: 0x40306a20, - 0x16fa8: 0xe000102b, 0x16fa9: 0xe0001028, 0x16faa: 0xe000103f, 0x16fab: 0xe000103c, - 0x16fac: 0xe0000fe7, 0x16fad: 0xe0000fe4, 0x16fae: 0xe0000ff9, 0x16faf: 0xe0000ff6, - 0x16fb0: 0x003100c3, 0x16fb1: 0x40310022, 0x16fb2: 0xe0001039, 0x16fb3: 0xe0001036, - 0x16fb4: 0xe00010d8, 0x16fb5: 0xe00010d5, 0x16fb6: 0xe000110e, 0x16fb7: 0xe000110b, - 0x16fb8: 0xe0001117, 0x16fb9: 0xe000113b, 0x16fba: 0xe0001138, 0x16fbb: 0xe000114d, - 0x16fbc: 0xe000114a, 0x16fbd: 0x00320683, 0x16fbe: 0x40320620, 0x16fbf: 0xe0000f64, - // Block 0x5bf, offset 0x16fc0 - 0x16fc0: 0x402c1a20, 0x16fc1: 0x002c2a88, 0x16fc2: 0x002c3288, 0x16fc3: 0x402c3220, - 0x16fc4: 0x0031c488, 0x16fc5: 0x4031c420, 0x16fc6: 0x002efa88, 0x16fc7: 0x002c4e88, - 0x16fc8: 0x402c4e20, 0x16fc9: 0x002c7288, 0x16fca: 0x002c7a88, 0x16fcb: 0x002c8488, - 0x16fcc: 0x402c8420, 0x16fcd: 0xe000115c, 0x16fce: 0x002cae88, 0x16fcf: 0x002cb888, - 0x16fd0: 0x002cc288, 0x16fd1: 0x002d1688, 0x16fd2: 0x402d1620, 0x16fd3: 0x002d4488, - 0x16fd4: 0x002d5888, 0x16fd5: 0x402d7820, 0x16fd6: 0x002dc288, 0x16fd7: 0x002db688, - 0x16fd8: 0x002e0a88, 0x16fd9: 0x402e0a20, 0x16fda: 0x402e3820, 0x16fdb: 0x402e7220, - 0x16fdc: 0x0030a088, 0x16fdd: 0x002eb488, 0x16fde: 0x402ebc20, 0x16fdf: 0x002f1088, - 0x16fe0: 0xe0000e56, 0x16fe1: 0xe0000e53, 0x16fe2: 0x002d6088, 0x16fe3: 0x402d6020, - 0x16fe4: 0x002f3e88, 0x16fe5: 0x402f3e20, 0x16fe6: 0x002f8288, 0x16fe7: 0x0031b488, - 0x16fe8: 0x4031b420, 0x16fe9: 0x00300888, 0x16fea: 0x40301220, 0x16feb: 0x40304220, - 0x16fec: 0x00304a88, 0x16fed: 0x40304a20, 0x16fee: 0x00305288, 0x16fef: 0xe000105f, - 0x16ff0: 0xe000105c, 0x16ff1: 0x0030b488, 0x16ff2: 0x0030cc88, 0x16ff3: 0x00311888, - 0x16ff4: 0x40311820, 0x16ff5: 0x00313488, 0x16ff6: 0x40313420, 0x16ff7: 0xcece0991, - 0x16ff8: 0x00316e88, 0x16ff9: 0x40316e20, 0x16ffa: 0x40317820, 0x16ffb: 0x4031a620, - 0x16ffc: 0x0031bc88, 0x16ffd: 0x4031bc20, 0x16ffe: 0xe0000fc9, 0x16fff: 0x40319420, - // Block 0x5c0, offset 0x17000 - 0x17000: 0x40321220, 0x17001: 0x40321a20, 0x17002: 0x40322220, 0x17003: 0x40322a20, - 0x17004: 0xe0000ad5, 0x17005: 0xe0000ad1, 0x17006: 0xe0000acd, 0x17007: 0xf0000a0a, - 0x17008: 0xf000040a, 0x17009: 0xf0000404, 0x1700a: 0xf0000a0a, 0x1700b: 0xf000040a, - 0x1700c: 0xf0000404, 0x1700d: 0xe0000947, 0x1700e: 0xe0000944, 0x1700f: 0xe0000c3d, - 0x17010: 0xe0000c3a, 0x17011: 0xe0000dcc, 0x17012: 0xe0000dc9, 0x17013: 0xe0000ff3, - 0x17014: 0xe0000ff0, 0x17015: 0xe000298b, 0x17016: 0xe0002988, 0x17017: 0xe0002979, - 0x17018: 0xe0002976, 0x17019: 0xe0002985, 0x1701a: 0xe0002982, 0x1701b: 0xe000297f, - 0x1701c: 0xe000297c, 0x1701d: 0x402cae20, 0x1701e: 0xe00037e8, 0x1701f: 0xe00037e5, - 0x17020: 0xe000299d, 0x17021: 0xe000299a, 0x17022: 0xe000ad9e, 0x17023: 0xe000ad9b, - 0x17024: 0x002d6683, 0x17025: 0x402d6620, 0x17026: 0x002d6483, 0x17027: 0x402d6420, - 0x17028: 0x002e2083, 0x17029: 0x402e2020, 0x1702a: 0x00321103, 0x1702b: 0x40321024, - 0x1702c: 0xe000ade0, 0x1702d: 0xe000addd, 0x1702e: 0x002c6083, 0x1702f: 0x402c6020, - 0x17030: 0xe0000c8d, 0x17031: 0xf0000a0a, 0x17032: 0xf000040a, 0x17033: 0xf0000404, - 0x17034: 0xe0000bac, 0x17035: 0xe0000ba9, 0x17036: 0x002d7888, 0x17037: 0x00319488, - 0x17038: 0xe0000d57, 0x17039: 0xe0000d54, 0x1703a: 0xe0002991, 0x1703b: 0xe000298e, - 0x1703c: 0xe000ad98, 0x1703d: 0xe000ad95, 0x1703e: 0xe000ad92, 0x1703f: 0xe000ad8f, - // Block 0x5c1, offset 0x17040 - 0x17040: 0xe000098f, 0x17041: 0xe000098c, 0x17042: 0xe0000995, 0x17043: 0xe0000992, - 0x17044: 0xe0000b62, 0x17045: 0xe0000b5f, 0x17046: 0xe0000b68, 0x17047: 0xe0000b65, - 0x17048: 0xe0000c6c, 0x17049: 0xe0000c69, 0x1704a: 0xe0000c72, 0x1704b: 0xe0000c6f, - 0x1704c: 0xe0000e4a, 0x1704d: 0xe0000e47, 0x1704e: 0xe0000e50, 0x1704f: 0xe0000e4d, - 0x17050: 0xe0000ee8, 0x17051: 0xe0000ee5, 0x17052: 0xe0000eee, 0x17053: 0xe0000eeb, - 0x17054: 0xe0001053, 0x17055: 0xe0001050, 0x17056: 0xe0001059, 0x17057: 0xe0001056, - 0x17058: 0xe0000f61, 0x17059: 0xe0000f5e, 0x1705a: 0xe0000fa5, 0x1705b: 0xe0000fa2, - 0x1705c: 0x00312288, 0x1705d: 0x40312220, 0x1705e: 0xe0000bf4, 0x1705f: 0xe0000bf1, - 0x17060: 0x002ebc88, 0x17061: 0x402c8c20, 0x17062: 0x002f2288, 0x17063: 0x402f2220, - 0x17064: 0x00314088, 0x17065: 0x40314020, 0x17066: 0x00320ca3, 0x17067: 0x40320c21, - 0x17068: 0xe0000b32, 0x17069: 0xe0000b2f, 0x1706a: 0xe00037fa, 0x1706b: 0xe00037f7, - 0x1706c: 0xe000adbc, 0x1706d: 0xe000adb9, 0x1706e: 0xe0000e04, 0x1706f: 0xe0000e01, - 0x17070: 0xe0000e0b, 0x17071: 0xe0000e07, 0x17072: 0xe0001129, 0x17073: 0xe0001126, - 0x17074: 0x402e5e20, 0x17075: 0x402ed020, 0x17076: 0x40305a20, 0x17077: 0x402dd420, - 0x17078: 0xe0000abf, 0x17079: 0xe0000ec4, 0x1707a: 0x002be888, 0x1707b: 0x002c4488, - 0x1707c: 0x402c4420, 0x1707d: 0x002e3888, 0x1707e: 0x00303e88, 0x1707f: 0x402ffc20, - // Block 0x5c2, offset 0x17080 - 0x17080: 0x402f8220, 0x17081: 0x402fd820, 0x17082: 0x402ff420, 0x17083: 0x40300820, - 0x17084: 0x402df620, 0x17085: 0x40301a20, 0x17086: 0x40302420, 0x17087: 0x40306420, - 0x17088: 0x40305220, 0x17089: 0x40307c20, 0x1708a: 0x4030b420, 0x1708b: 0x4030cc20, - 0x1708c: 0x4030da20, 0x1708d: 0x4030ee20, 0x1708e: 0x402e7a20, 0x1708f: 0x40310820, - 0x17090: 0x40314820, 0x17091: 0x40315020, 0x17092: 0xcecc0991, 0x17093: 0x40318020, - 0x17094: 0x4031cc20, 0x17095: 0x4031e820, 0x17096: 0x40320a20, 0x17097: 0x40323220, - 0x17098: 0x40323a20, 0x17099: 0x402c1220, 0x1709a: 0x402cf820, 0x1709b: 0x402d4c20, - 0x1709c: 0x402d7020, 0x1709d: 0x402de620, 0x1709e: 0x402e1a20, 0x1709f: 0x402e2a20, - 0x170a0: 0x402f6220, 0x170a1: 0x4031fa20, 0x170a2: 0x40320220, 0x170a3: 0xe0000aca, - 0x170a4: 0xe0000adc, 0x170a5: 0xe0000ad9, 0x170a6: 0xe0000fcc, 0x170a7: 0xe0000fcf, - 0x170a8: 0xe0000fba, 0x170a9: 0xe0000ba1, 0x170aa: 0xe0000d11, 0x170ab: 0xe0000d18, - 0x170ac: 0x40324220, 0x170ad: 0x40324a20, 0x170ae: 0x40309020, 0x170af: 0x40309820, - 0x170b0: 0x002d6894, 0x170b1: 0x002d8094, 0x170b2: 0x002dcc94, 0x170b3: 0x002f7a94, - 0x170b4: 0x002f9894, 0x170b5: 0x002fac94, 0x170b6: 0x002fd894, 0x170b7: 0x0030e294, - 0x170b8: 0x00310094, 0x170b9: 0x40064020, 0x170ba: 0x40064420, 0x170bb: 0x402d9620, - 0x170bc: 0x4031de20, 0x170bd: 0x402d9820, 0x170be: 0x4031e220, 0x170bf: 0x4031f020, - // Block 0x5c3, offset 0x170c0 - 0x170c0: 0xe0000d24, 0x170c1: 0xe0000d21, 0x170c2: 0xe0000d2a, 0x170c3: 0xe0000d27, - 0x170c4: 0xe0000d69, 0x170c5: 0xe0000d66, 0x170c6: 0xe0000d7b, 0x170c7: 0xe0000d78, - 0x170c8: 0xe0000d87, 0x170c9: 0xe0000d84, 0x170ca: 0xe0000d81, 0x170cb: 0xe0000d7e, - 0x170cc: 0xe000adb0, 0x170cd: 0xe000adad, 0x170ce: 0xe000adb6, 0x170cf: 0xe000adb3, - 0x170d0: 0xe0000e3d, 0x170d1: 0xe0000e39, 0x170d2: 0xe0000e35, 0x170d3: 0xe0000e31, - 0x170d4: 0xe0000ea7, 0x170d5: 0xe0000ea4, 0x170d6: 0xe0000ead, 0x170d7: 0xe0000eaa, - 0x170d8: 0xe0000ed6, 0x170d9: 0xe0000ed3, 0x170da: 0xe0000ef4, 0x170db: 0xe0000ef1, - 0x170dc: 0xe0000efb, 0x170dd: 0xe0000ef7, 0x170de: 0xe0000f02, 0x170df: 0xe0000eff, - 0x170e0: 0xe0000f41, 0x170e1: 0xe0000f3e, 0x170e2: 0xe0000f53, 0x170e3: 0xe0000f50, - 0x170e4: 0xe0000f26, 0x170e5: 0xe0000f22, 0x170e6: 0xe000a9d9, 0x170e7: 0xe000a9d6, - 0x170e8: 0xe0000f5a, 0x170e9: 0xe0000f56, 0x170ea: 0xe0000f93, 0x170eb: 0xe0000f90, - 0x170ec: 0xe0000f9f, 0x170ed: 0xe0000f9c, 0x170ee: 0xe0000fb1, 0x170ef: 0xe0000fae, - 0x170f0: 0xe0000fab, 0x170f1: 0xe0000fa8, 0x170f2: 0xe0001093, 0x170f3: 0xe0001090, - 0x170f4: 0xe000109f, 0x170f5: 0xe000109c, 0x170f6: 0xe0001099, 0x170f7: 0xe0001096, - 0x170f8: 0xe0001032, 0x170f9: 0xe000102e, 0x170fa: 0xe000298b, 0x170fb: 0xe0002988, - 0x170fc: 0xe00010a9, 0x170fd: 0xe00010a6, 0x170fe: 0xe00010af, 0x170ff: 0xe00010ac, - // Block 0x5c4, offset 0x17100 - 0x17100: 0xe00010d2, 0x17101: 0xe00010cf, 0x17102: 0xe00010cc, 0x17103: 0xe00010c9, - 0x17104: 0xe00010e1, 0x17105: 0xe00010de, 0x17106: 0xe00010e7, 0x17107: 0xe00010e4, - 0x17108: 0xe00010ed, 0x17109: 0xe00010ea, 0x1710a: 0xe00010fc, 0x1710b: 0xe00010f9, - 0x1710c: 0xe00010f6, 0x1710d: 0xe00010f3, 0x1710e: 0xe0001123, 0x1710f: 0xe0001120, - 0x17110: 0xe0001141, 0x17111: 0xe000113e, 0x17112: 0xe0001153, 0x17113: 0xe0001150, - 0x17114: 0xe0001159, 0x17115: 0xe0001156, 0x17116: 0xe0000c15, 0x17117: 0xe0000f8d, - 0x17118: 0xe00010db, 0x17119: 0xe0001111, 0x1711a: 0xf0000404, 0x1711b: 0xe0000f70, - 0x1711c: 0x40300420, 0x1711d: 0x40300620, 0x1711e: 0xe0000f7f, 0x1711f: 0x402c9620, - 0x17120: 0xe000099b, 0x17121: 0xe0000998, 0x17122: 0xe0000989, 0x17123: 0xe0000986, - 0x17124: 0xe0003cae, 0x17125: 0xe0003cab, 0x17126: 0xe0000930, 0x17127: 0xe000092c, - 0x17128: 0xe0000940, 0x17129: 0xe000093c, 0x1712a: 0xe000adaa, 0x1712b: 0xe000ada7, - 0x1712c: 0xe00009aa, 0x1712d: 0xe00009a6, 0x1712e: 0xe0003ca8, 0x1712f: 0xe0003ca5, - 0x17130: 0xe000090a, 0x17131: 0xe0000906, 0x17132: 0xe000091a, 0x17133: 0xe0000916, - 0x17134: 0xe000ada4, 0x17135: 0xe000ada1, 0x17136: 0xe00009a2, 0x17137: 0xe000099e, - 0x17138: 0xe0000b6e, 0x17139: 0xe0000b6b, 0x1713a: 0xe0000b5c, 0x1713b: 0xe0000b59, - 0x1713c: 0xe0000b26, 0x1713d: 0xe0000b23, 0x1713e: 0xe0000afb, 0x1713f: 0xe0000af7, - // Block 0x5c5, offset 0x17140 - 0x17140: 0xe0000b03, 0x17141: 0xe0000aff, 0x17142: 0xe0000b13, 0x17143: 0xe0000b0f, - 0x17144: 0xe0000b0b, 0x17145: 0xe0000b07, 0x17146: 0xe0000b75, 0x17147: 0xe0000b71, - 0x17148: 0xe0000c66, 0x17149: 0xe0000c63, 0x1714a: 0xe0000c78, 0x1714b: 0xe0000c75, - 0x1714c: 0xe0000e84, 0x1714d: 0xe0000e81, 0x1714e: 0xe0000e44, 0x1714f: 0xe0000e41, - 0x17150: 0xe000380c, 0x17151: 0xe0003809, 0x17152: 0xe000adc8, 0x17153: 0xe000adc5, - 0x17154: 0xe000add4, 0x17155: 0xe000add1, 0x17156: 0xe000adce, 0x17157: 0xe000adcb, - 0x17158: 0xe000adda, 0x17159: 0xe000add7, 0x1715a: 0xe0000e5d, 0x1715b: 0xe0000e59, - 0x1715c: 0xe0000e65, 0x1715d: 0xe0000e61, 0x1715e: 0xe0000e75, 0x1715f: 0xe0000e71, - 0x17160: 0xe000adc2, 0x17161: 0xe000adbf, 0x17162: 0xe0000e7d, 0x17163: 0xe0000e79, - 0x17164: 0xe000108d, 0x17165: 0xe000108a, 0x17166: 0xe000104d, 0x17167: 0xe000104a, - 0x17168: 0xe0001066, 0x17169: 0xe0001062, 0x1716a: 0xe000106e, 0x1716b: 0xe000106a, - 0x1716c: 0xe000107e, 0x1716d: 0xe000107a, 0x1716e: 0xe0001076, 0x1716f: 0xe0001072, - 0x17170: 0xe0001086, 0x17171: 0xe0001082, 0x17172: 0xe0001108, 0x17173: 0xe0001105, - 0x17174: 0xe0001135, 0x17175: 0xe0001132, 0x17176: 0xe000112f, 0x17177: 0xe000112c, - 0x17178: 0xe000111d, 0x17179: 0xe000111a, 0x1717a: 0xe0000d0a, 0x1717b: 0xe0000d07, - 0x1717c: 0x0030d888, 0x1717d: 0x4030d820, 0x1717e: 0x00312088, 0x1717f: 0x40312020, - // Block 0x5c6, offset 0x17180 - 0x17182: 0x4044b620, 0x17183: 0x4044b820, - 0x17185: 0x40449220, 0x17186: 0x40449420, 0x17187: 0x40449620, - 0x17188: 0x40449820, 0x17189: 0x40449a20, 0x1718a: 0x40449c20, 0x1718b: 0x40449e20, - 0x1718c: 0x4044a020, 0x1718d: 0x4044a220, 0x1718e: 0x4044a420, 0x1718f: 0x4044a620, - 0x17190: 0x4044a820, 0x17191: 0x4044aa20, 0x17192: 0x4044ac20, 0x17193: 0x4044ae20, - 0x17194: 0x4044b020, 0x17195: 0x4044b220, 0x17196: 0x4044b420, - 0x1719a: 0x4044b620, 0x1719b: 0x4044b820, - 0x1719c: 0x4044ba20, 0x1719d: 0x4044bc20, 0x1719e: 0x4044be20, 0x1719f: 0x4044c020, - 0x171a0: 0x4044c220, 0x171a1: 0x4044c420, 0x171a2: 0x4044c620, 0x171a3: 0x4044c820, - 0x171a4: 0x4044ce20, 0x171a5: 0x4044cc20, 0x171a6: 0x4044ce20, 0x171a7: 0x4044d020, - 0x171a8: 0x4044d220, 0x171a9: 0x4044d420, 0x171aa: 0x4044d620, 0x171ab: 0x4044d820, - 0x171ac: 0x4044da20, 0x171ad: 0x4044dc20, 0x171ae: 0x4044de20, 0x171af: 0x4044e020, - 0x171b0: 0x4044e220, 0x171b1: 0x4044e420, 0x171b3: 0x4044e620, - 0x171b4: 0x4044e820, 0x171b5: 0x4044ea20, 0x171b6: 0x4044ec20, 0x171b7: 0x4044ee20, - 0x171b8: 0x4044f020, 0x171b9: 0x4044f220, 0x171ba: 0x4044f420, 0x171bb: 0x4044f620, - 0x171bd: 0x4044f820, - // Block 0x5c7, offset 0x171c0 - 0x171c0: 0xa0000000, 0x171c1: 0xa0000000, 0x171c2: 0xa0000000, 0x171c3: 0xa0000000, - 0x171c4: 0xa0000000, 0x171c5: 0xa0000000, 0x171c6: 0xa0000000, 0x171c7: 0xa0000000, - 0x171c8: 0xa0000000, 0x171c9: 0x40020020, 0x171ca: 0x40020220, 0x171cb: 0x40020420, - 0x171cc: 0x40020620, 0x171cd: 0x40020820, 0x171ce: 0xa0000000, 0x171cf: 0xa0000000, - 0x171d0: 0xa0000000, 0x171d1: 0xa0000000, 0x171d2: 0xa0000000, 0x171d3: 0xa0000000, - 0x171d4: 0xa0000000, 0x171d5: 0xa0000000, 0x171d6: 0xa0000000, 0x171d7: 0xa0000000, - 0x171d8: 0xa0000000, 0x171d9: 0xa0000000, 0x171da: 0xa0000000, 0x171db: 0xa0000000, - 0x171dc: 0xa0000000, 0x171dd: 0xa0000000, 0x171de: 0xa0000000, 0x171df: 0xa0000000, - 0x171e0: 0x40021220, 0x171e1: 0x4002ba20, 0x171e2: 0x4003e020, 0x171e3: 0x4004ea20, - 0x171e4: 0x4027de20, 0x171e5: 0x4004ec20, 0x171e6: 0x4004e620, 0x171e7: 0x4003d220, - 0x171e8: 0x4003f420, 0x171e9: 0x4003f620, 0x171ea: 0x4004d820, 0x171eb: 0x40093820, - 0x171ec: 0x40024020, 0x171ed: 0x40021a20, 0x171ee: 0x4002e420, 0x171ef: 0x4004e220, - 0x171f0: 0x4029cc20, 0x171f1: 0x4029ce20, 0x171f2: 0x4029d020, 0x171f3: 0x4029d220, - 0x171f4: 0x4029d420, 0x171f5: 0x4029d620, 0x171f6: 0x4029d820, 0x171f7: 0x4029da20, - 0x171f8: 0x4029dc20, 0x171f9: 0x4029de20, 0x171fa: 0x40026c20, 0x171fb: 0x40026220, - 0x171fc: 0x40094020, 0x171fd: 0x40094220, 0x171fe: 0x40094420, 0x171ff: 0x4002c420, - // Block 0x5c8, offset 0x17200 - 0x17200: 0x4004d620, 0x17201: 0xce900071, 0x17202: 0x002c0a88, 0x17203: 0xc3590953, - 0x17204: 0x002c6288, 0x17205: 0x002c9888, 0x17206: 0x002d0888, 0x17207: 0x002d2288, - 0x17208: 0x002d6888, 0x17209: 0x002d9a88, 0x1720a: 0x002dcc88, 0x1720b: 0x002dfe88, - 0x1720c: 0xc0030002, 0x1720d: 0x002e8288, 0x1720e: 0x002e9e88, 0x1720f: 0xc33f2741, - 0x17210: 0x002f2c88, 0x17211: 0x002f5688, 0x17212: 0xc35f0991, 0x17213: 0xc3430991, - 0x17214: 0x00302c88, 0x17215: 0x00306c88, 0x17216: 0x0030be88, 0x17217: 0x0030e288, - 0x17218: 0x0030f688, 0x17219: 0x00310088, 0x1721a: 0xc3630991, 0x1721b: 0x4003f820, - 0x1721c: 0x4004e420, 0x1721d: 0x4003fa20, 0x1721e: 0x40062420, 0x1721f: 0x40021620, - 0x17220: 0x40061e20, 0x17221: 0xce8e0071, 0x17222: 0x402c0a20, 0x17223: 0xc3550953, - 0x17224: 0x402c6220, 0x17225: 0x402c9820, 0x17226: 0x402d0820, 0x17227: 0x402d2220, - 0x17228: 0x402d6820, 0x17229: 0x402d9a20, 0x1722a: 0x402dcc20, 0x1722b: 0x402dfe20, - 0x1722c: 0xc0000002, 0x1722d: 0x402e8220, 0x1722e: 0x402e9e20, 0x1722f: 0xc33d2741, - 0x17230: 0x402f2c20, 0x17231: 0x402f5620, 0x17232: 0xc35d0991, 0x17233: 0xc3410991, - 0x17234: 0x40302c20, 0x17235: 0x40306c20, 0x17236: 0x4030be20, 0x17237: 0x4030e220, - 0x17238: 0x4030f620, 0x17239: 0x40310020, 0x1723a: 0xc3610991, 0x1723b: 0x4003fc20, - 0x1723c: 0x40094820, 0x1723d: 0x4003fe20, 0x1723e: 0x40094c20, 0x1723f: 0xa0000000, - // Block 0x5c9, offset 0x17240 - 0x17240: 0xe00008f5, 0x17241: 0xe00008ef, 0x17242: 0xe0000921, 0x17243: 0xe0000969, - 0x17244: 0x002be083, 0x17245: 0xe000094d, 0x17246: 0xe00009dd, 0x17247: 0xe0000a53, - 0x17248: 0xe0000ae8, 0x17249: 0xe0000ae2, 0x1724a: 0xe0000af4, 0x1724b: 0xe0000b20, - 0x1724c: 0xe0000c2b, 0x1724d: 0xe0000c25, 0x1724e: 0xe0000c37, 0x1724f: 0xe0000c43, - 0x17250: 0xe0000ab3, 0x17251: 0xe0000d63, 0x17252: 0xe0000d9a, 0x17253: 0xe0000d94, - 0x17254: 0x002ee483, 0x17255: 0xe0000de6, 0x17256: 0xe0000dd2, 0x17257: 0x40093e20, - 0x17258: 0xe0000e12, 0x17259: 0xe0000fe1, 0x1725a: 0xe0000fdb, 0x1725b: 0xe0000fed, - 0x1725c: 0xe0000fff, 0x1725d: 0xe0001102, 0x1725e: 0x00318888, 0x1725f: 0xe0000f7b, - 0x17260: 0xe00008f2, 0x17261: 0xe00008ec, 0x17262: 0xe000091e, 0x17263: 0xe0000966, - 0x17264: 0x402be020, 0x17265: 0xe000094a, 0x17266: 0xe00009d5, 0x17267: 0xe0000a4d, - 0x17268: 0xe0000ae5, 0x17269: 0xe0000adf, 0x1726a: 0xe0000af1, 0x1726b: 0xe0000b1d, - 0x1726c: 0xe0000c28, 0x1726d: 0xe0000c22, 0x1726e: 0xe0000c34, 0x1726f: 0xe0000c40, - 0x17270: 0xe0000aad, 0x17271: 0xe0000d60, 0x17272: 0xe0000d97, 0x17273: 0xe0000d91, - 0x17274: 0x402ee420, 0x17275: 0xe0000de3, 0x17276: 0xe0000dcf, 0x17277: 0x40093c20, - 0x17278: 0xe0000e0f, 0x17279: 0xe0000fde, 0x1727a: 0xe0000fd8, 0x1727b: 0xe0000fea, - 0x1727c: 0xe0000ffc, 0x1727d: 0xe00010ff, 0x1727e: 0x40318820, 0x1727f: 0xe0001114, - // Block 0x5ca, offset 0x17280 - 0x17280: 0x40321220, 0x17281: 0x40321a20, 0x17282: 0x40322220, 0x17283: 0x40322a20, - 0x17284: 0xe0000ad5, 0x17285: 0xe0000ad1, 0x17286: 0xe0000acd, 0x17287: 0xf0000a0a, - 0x17288: 0xf000040a, 0x17289: 0xf0000404, 0x1728a: 0xf0000a0a, 0x1728b: 0xf000040a, - 0x1728c: 0xf0000404, 0x1728d: 0xe0000947, 0x1728e: 0xe0000944, 0x1728f: 0xe0000c3d, - 0x17290: 0xe0000c3a, 0x17291: 0xe0000dcc, 0x17292: 0xe0000dc9, 0x17293: 0xe0000ff3, - 0x17294: 0xe0000ff0, 0x17295: 0xe000101e, 0x17296: 0xe000101a, 0x17297: 0xe0001006, - 0x17298: 0xe0001002, 0x17299: 0xe0001016, 0x1729a: 0xe0001012, 0x1729b: 0xe000100e, - 0x1729c: 0xe000100a, 0x1729d: 0x402cae20, 0x1729e: 0xe00038f2, 0x1729f: 0xe00038ef, - 0x172a0: 0xe0000976, 0x172a1: 0xe0000972, 0x172a2: 0xe00009f4, 0x172a3: 0xe00009ef, - 0x172a4: 0x002d3a88, 0x172a5: 0x402d3a20, 0x172a6: 0xe0000bbe, 0x172a7: 0xe0000bbb, - 0x172a8: 0xe0000c99, 0x172a9: 0xe0000c96, 0x172aa: 0xe0000e20, 0x172ab: 0xe0000e1d, - 0x172ac: 0xe0000e27, 0x172ad: 0xe0000e23, 0x172ae: 0xe0001162, 0x172af: 0xe000115f, - 0x172b0: 0xe0000c8d, 0x172b1: 0xf0000a0a, 0x172b2: 0xf000040a, 0x172b3: 0xf0000404, - 0x172b4: 0xe0000bac, 0x172b5: 0xe0000ba9, 0x172b6: 0x002d7888, 0x172b7: 0x00319488, - 0x172b8: 0xe0000d57, 0x172b9: 0xe0000d54, 0x172ba: 0xe0000954, 0x172bb: 0xe0000950, - 0x172bc: 0xe00009ea, 0x172bd: 0xe00009e5, 0x172be: 0xe0000e19, 0x172bf: 0xe0000e15, - // Block 0x5cb, offset 0x172c0 - 0x172c0: 0xe0000b03, 0x172c1: 0xe0000aff, 0x172c2: 0xe0000b13, 0x172c3: 0xe0000b0f, - 0x172c4: 0xe0000b0b, 0x172c5: 0xe0000b07, 0x172c6: 0xe0000b75, 0x172c7: 0xe0000b71, - 0x172c8: 0xe0000c66, 0x172c9: 0xe0000c63, 0x172ca: 0xe0000c78, 0x172cb: 0xe0000c75, - 0x172cc: 0xe0000e84, 0x172cd: 0xe0000e81, 0x172ce: 0xe0000e44, 0x172cf: 0xe0000e41, - 0x172d0: 0xe000ad5f, 0x172d1: 0xe000ad5c, 0x172d2: 0xe000ad65, 0x172d3: 0xe000ad62, - 0x172d4: 0xe000ad6b, 0x172d5: 0xe000ad68, 0x172d6: 0xe0002946, 0x172d7: 0xe0002943, - 0x172d8: 0xe000ad71, 0x172d9: 0xe000ad6e, 0x172da: 0xe0000e5d, 0x172db: 0xe0000e59, - 0x172dc: 0xe0000e65, 0x172dd: 0xe0000e61, 0x172de: 0xe0000e75, 0x172df: 0xe0000e71, - 0x172e0: 0xe0000e6d, 0x172e1: 0xe0000e69, 0x172e2: 0xe0000e7d, 0x172e3: 0xe0000e79, - 0x172e4: 0xe000108d, 0x172e5: 0xe000108a, 0x172e6: 0xe000104d, 0x172e7: 0xe000104a, - 0x172e8: 0xe0001066, 0x172e9: 0xe0001062, 0x172ea: 0xe000106e, 0x172eb: 0xe000106a, - 0x172ec: 0xe000107e, 0x172ed: 0xe000107a, 0x172ee: 0xe0001076, 0x172ef: 0xe0001072, - 0x172f0: 0xe0001086, 0x172f1: 0xe0001082, 0x172f2: 0xe0001108, 0x172f3: 0xe0001105, - 0x172f4: 0xe0001135, 0x172f5: 0xe0001132, 0x172f6: 0xe000112f, 0x172f7: 0xe000112c, - 0x172f8: 0xe000111d, 0x172f9: 0xe000111a, 0x172fa: 0xe0000d0a, 0x172fb: 0xe0000d07, - 0x172fc: 0x0030d888, 0x172fd: 0x4030d820, 0x172fe: 0x00312088, 0x172ff: 0x40312020, - // Block 0x5cc, offset 0x17300 - 0x17300: 0xa0000000, 0x17301: 0xa0000000, 0x17302: 0xa0000000, 0x17303: 0xa0000000, - 0x17304: 0xa0000000, 0x17305: 0xa0000000, 0x17306: 0xa0000000, 0x17307: 0xa0000000, - 0x17308: 0xa0000000, 0x17309: 0x40020020, 0x1730a: 0x40020220, 0x1730b: 0x40020420, - 0x1730c: 0x40020620, 0x1730d: 0x40020820, 0x1730e: 0xa0000000, 0x1730f: 0xa0000000, - 0x17310: 0xa0000000, 0x17311: 0xa0000000, 0x17312: 0xa0000000, 0x17313: 0xa0000000, - 0x17314: 0xa0000000, 0x17315: 0xa0000000, 0x17316: 0xa0000000, 0x17317: 0xa0000000, - 0x17318: 0xa0000000, 0x17319: 0xa0000000, 0x1731a: 0xa0000000, 0x1731b: 0xa0000000, - 0x1731c: 0xa0000000, 0x1731d: 0xa0000000, 0x1731e: 0xa0000000, 0x1731f: 0xa0000000, - 0x17320: 0x40021220, 0x17321: 0x4002ba20, 0x17322: 0x4003e020, 0x17323: 0x4004ea20, - 0x17324: 0x4027de20, 0x17325: 0x4004ec20, 0x17326: 0x4004e620, 0x17327: 0x4003d220, - 0x17328: 0x4003f420, 0x17329: 0x4003f620, 0x1732a: 0x4004d820, 0x1732b: 0x40093820, - 0x1732c: 0x40024020, 0x1732d: 0x40021a20, 0x1732e: 0x4002e420, 0x1732f: 0x4004e220, - 0x17330: 0x4029cc20, 0x17331: 0x4029ce20, 0x17332: 0x4029d020, 0x17333: 0x4029d220, - 0x17334: 0x4029d420, 0x17335: 0x4029d620, 0x17336: 0x4029d820, 0x17337: 0x4029da20, - 0x17338: 0x4029dc20, 0x17339: 0x4029de20, 0x1733a: 0x40026c20, 0x1733b: 0x40026220, - 0x1733c: 0x40094020, 0x1733d: 0x40094220, 0x1733e: 0x40094420, 0x1733f: 0x4002c420, - // Block 0x5cd, offset 0x17340 - 0x17340: 0x4004d620, 0x17341: 0x002bde88, 0x17342: 0x002c0a88, 0x17343: 0xc59b2891, - 0x17344: 0x002c6288, 0x17345: 0x002c9888, 0x17346: 0x002d0888, 0x17347: 0x002d2288, - 0x17348: 0x002d6888, 0x17349: 0x002d9a88, 0x1734a: 0x002dcc88, 0x1734b: 0x002dfe88, - 0x1734c: 0xc0030002, 0x1734d: 0x002e8288, 0x1734e: 0x002e9e88, 0x1734f: 0x002ee288, - 0x17350: 0x002f2c88, 0x17351: 0x002f5688, 0x17352: 0x002f7a88, 0x17353: 0xc3430991, - 0x17354: 0x00302c88, 0x17355: 0x00306c88, 0x17356: 0x0030be88, 0x17357: 0x0030e288, - 0x17358: 0x0030f688, 0x17359: 0x00310088, 0x1735a: 0xc3630991, 0x1735b: 0x4003f820, - 0x1735c: 0x4004e420, 0x1735d: 0x4003fa20, 0x1735e: 0x40062420, 0x1735f: 0x40021620, - 0x17360: 0x40061e20, 0x17361: 0x402bde20, 0x17362: 0x402c0a20, 0x17363: 0xc5982891, - 0x17364: 0x402c6220, 0x17365: 0x402c9820, 0x17366: 0x402d0820, 0x17367: 0x402d2220, - 0x17368: 0x402d6820, 0x17369: 0x402d9a20, 0x1736a: 0x402dcc20, 0x1736b: 0x402dfe20, - 0x1736c: 0xc0000002, 0x1736d: 0x402e8220, 0x1736e: 0x402e9e20, 0x1736f: 0x402ee220, - 0x17370: 0x402f2c20, 0x17371: 0x402f5620, 0x17372: 0x402f7a20, 0x17373: 0xc3410991, - 0x17374: 0x40302c20, 0x17375: 0x40306c20, 0x17376: 0x4030be20, 0x17377: 0x4030e220, - 0x17378: 0x4030f620, 0x17379: 0x40310020, 0x1737a: 0xc3610991, 0x1737b: 0x4003fc20, - 0x1737c: 0x40094820, 0x1737d: 0x4003fe20, 0x1737e: 0x40094c20, 0x1737f: 0xa0000000, - // Block 0x5ce, offset 0x17380 - 0x17380: 0xe0000983, 0x17381: 0xe0000980, 0x17382: 0xe00008fb, 0x17383: 0xe00008f8, - 0x17384: 0xe000097d, 0x17385: 0xe000097a, 0x17386: 0x002c3e83, 0x17387: 0x402c3e20, - 0x17388: 0xe0000a3e, 0x17389: 0xe0000a3b, 0x1738a: 0xe0000a4a, 0x1738b: 0xe0000a47, - 0x1738c: 0x002c3c83, 0x1738d: 0x402c3c20, 0x1738e: 0xe0000a86, 0x1738f: 0xe0000a83, - 0x17390: 0x002c6483, 0x17391: 0x402c6420, 0x17392: 0xe0000b46, 0x17393: 0xe0000b43, - 0x17394: 0xe0000aee, 0x17395: 0xe0000aeb, 0x17396: 0xe0000b2c, 0x17397: 0xe0000b29, - 0x17398: 0xe0000b40, 0x17399: 0xe0000b3d, 0x1739a: 0xe0000b1a, 0x1739b: 0xe0000b17, - 0x1739c: 0xe0000bb8, 0x1739d: 0xe0000bb5, 0x1739e: 0xe0000bb2, 0x1739f: 0xe0000baf, - 0x173a0: 0xe0000bc4, 0x173a1: 0xe0000bc1, 0x173a2: 0xe0000bca, 0x173a3: 0xe0000bc7, - 0x173a4: 0xe0000bee, 0x173a5: 0xe0000beb, 0x173a6: 0xe0000c1b, 0x173a7: 0xe0000c18, - 0x173a8: 0xe0000c51, 0x173a9: 0xe0000c4e, 0x173aa: 0xe0000c60, 0x173ab: 0xe0000c5d, - 0x173ac: 0xe0000c31, 0x173ad: 0xe0000c2e, 0x173ae: 0xe0000c5a, 0x173af: 0xe0000c57, - 0x173b0: 0xe0000c54, 0x173b1: 0x402da220, 0x173b2: 0xf0000a0a, 0x173b3: 0xf0000404, - 0x173b4: 0xe0000c8a, 0x173b5: 0xe0000c87, 0x173b6: 0xe0000c9f, 0x173b7: 0xe0000c9c, - 0x173b8: 0x402f7220, 0x173b9: 0xe0000ccc, 0x173ba: 0xe0000cc9, 0x173bb: 0xe0000cd8, - 0x173bc: 0xe0000cd5, 0x173bd: 0xe0000cd2, 0x173be: 0xe0000ccf, 0x173bf: 0xe0000d04, - // Block 0x5cf, offset 0x173c0 - 0x173c0: 0xa0000000, 0x173c1: 0xa0000000, 0x173c2: 0xa0000000, 0x173c3: 0xa0000000, - 0x173c4: 0xa0000000, 0x173c5: 0xa0000000, 0x173c6: 0xa0000000, 0x173c7: 0xa0000000, - 0x173c8: 0xa0000000, 0x173c9: 0x40020020, 0x173ca: 0x40020220, 0x173cb: 0x40020420, - 0x173cc: 0x40020620, 0x173cd: 0x40020820, 0x173ce: 0xa0000000, 0x173cf: 0xa0000000, - 0x173d0: 0xa0000000, 0x173d1: 0xa0000000, 0x173d2: 0xa0000000, 0x173d3: 0xa0000000, - 0x173d4: 0xa0000000, 0x173d5: 0xa0000000, 0x173d6: 0xa0000000, 0x173d7: 0xa0000000, - 0x173d8: 0xa0000000, 0x173d9: 0xa0000000, 0x173da: 0xa0000000, 0x173db: 0xa0000000, - 0x173dc: 0xa0000000, 0x173dd: 0xa0000000, 0x173de: 0xa0000000, 0x173df: 0xa0000000, - 0x173e0: 0x40021220, 0x173e1: 0x4002ba20, 0x173e2: 0x4003e020, 0x173e3: 0x4004ea20, - 0x173e4: 0x4027de20, 0x173e5: 0x4004ec20, 0x173e6: 0x4004e620, 0x173e7: 0x4003d220, - 0x173e8: 0x4003f420, 0x173e9: 0x4003f620, 0x173ea: 0x4004d820, 0x173eb: 0x40093820, - 0x173ec: 0x40024020, 0x173ed: 0x40021a20, 0x173ee: 0x4002e420, 0x173ef: 0x4004e220, - 0x173f0: 0x4029cc20, 0x173f1: 0x4029ce20, 0x173f2: 0x4029d020, 0x173f3: 0x4029d220, - 0x173f4: 0x4029d420, 0x173f5: 0x4029d620, 0x173f6: 0x4029d820, 0x173f7: 0x4029da20, - 0x173f8: 0x4029dc20, 0x173f9: 0x4029de20, 0x173fa: 0x40026c20, 0x173fb: 0x40026220, - 0x173fc: 0x40094020, 0x173fd: 0x40094220, 0x173fe: 0x40094420, 0x173ff: 0x4002c420, - // Block 0x5d0, offset 0x17400 - 0x17400: 0x4004d620, 0x17401: 0x002bde88, 0x17402: 0x002c0a88, 0x17403: 0xcb170911, - 0x17404: 0xceec09c2, 0x17405: 0xc6360071, 0x17406: 0x002d0888, 0x17407: 0xceef2a52, - 0x17408: 0x002d6888, 0x17409: 0x002d9a88, 0x1740a: 0x002dcc88, 0x1740b: 0x002dfe88, - 0x1740c: 0xcef60ac4, 0x1740d: 0x002e8288, 0x1740e: 0xcefb2a52, 0x1740f: 0x002ee288, - 0x17410: 0x002f2c88, 0x17411: 0x002f5688, 0x17412: 0xcefe9872, 0x17413: 0xcf0109c2, - 0x17414: 0xcf0609c2, 0x17415: 0x00306c88, 0x17416: 0x0030be88, 0x17417: 0x0030e288, - 0x17418: 0xcf0b09c2, 0x17419: 0x00310088, 0x1741a: 0xcf0e09c2, 0x1741b: 0x4003f820, - 0x1741c: 0x4004e420, 0x1741d: 0x4003fa20, 0x1741e: 0x40062420, 0x1741f: 0x40021620, - 0x17420: 0x40061e20, 0x17421: 0x402bde20, 0x17422: 0x402c0a20, 0x17423: 0xcb150911, - 0x17424: 0xceea09b1, 0x17425: 0xc6340071, 0x17426: 0x402d0820, 0x17427: 0xcb192a41, - 0x17428: 0x402d6820, 0x17429: 0x402d9a20, 0x1742a: 0x402dcc20, 0x1742b: 0x402dfe20, - 0x1742c: 0xcef20a73, 0x1742d: 0x402e8220, 0x1742e: 0xcb292a41, 0x1742f: 0x402ee220, - 0x17430: 0x402f2c20, 0x17431: 0x402f5620, 0x17432: 0xcb2d9861, 0x17433: 0xcb3109b1, - 0x17434: 0xcf0409b1, 0x17435: 0x40306c20, 0x17436: 0x4030be20, 0x17437: 0x4030e220, - 0x17438: 0xcf0909b1, 0x17439: 0x40310020, 0x1743a: 0xcb3509b1, 0x1743b: 0x4003fc20, - 0x1743c: 0x40094820, 0x1743d: 0x4003fe20, 0x1743e: 0x40094c20, 0x1743f: 0xa0000000, - // Block 0x5d1, offset 0x17440 - 0x17440: 0xe00008f5, 0x17441: 0xe00008ef, 0x17442: 0xe0000921, 0x17443: 0xe0000969, - 0x17444: 0xe000095b, 0x17445: 0xe000094d, 0x17446: 0xe00009dd, 0x17447: 0x002c6083, - 0x17448: 0xe0000ae8, 0x17449: 0xe0000ae2, 0x1744a: 0xe0000af4, 0x1744b: 0x002d0683, - 0x1744c: 0xe0000c2b, 0x1744d: 0xe0000c25, 0x1744e: 0xe0000c37, 0x1744f: 0xe0000c43, - 0x17450: 0xe0000ab3, 0x17451: 0xe0000d63, 0x17452: 0xe0000d9a, 0x17453: 0xe0000d94, - 0x17454: 0xe0000da6, 0x17455: 0xe0000de6, 0x17456: 0xe0000dd2, 0x17457: 0x40093e20, - 0x17458: 0xe0000e12, 0x17459: 0xe0000fe1, 0x1745a: 0xe0000fdb, 0x1745b: 0xe0000fed, - 0x1745c: 0xe0000fff, 0x1745d: 0xe0001102, 0x1745e: 0x00318888, 0x1745f: 0xe0000f7b, - 0x17460: 0xe00008f2, 0x17461: 0xe00008ec, 0x17462: 0xe000091e, 0x17463: 0xe0000966, - 0x17464: 0xe0000958, 0x17465: 0xe000094a, 0x17466: 0xe00009d5, 0x17467: 0x402c6020, - 0x17468: 0xe0000ae5, 0x17469: 0xe0000adf, 0x1746a: 0xe0000af1, 0x1746b: 0x402d0620, - 0x1746c: 0xe0000c28, 0x1746d: 0xe0000c22, 0x1746e: 0xe0000c34, 0x1746f: 0xe0000c40, - 0x17470: 0xe0000aad, 0x17471: 0xe0000d60, 0x17472: 0xe0000d97, 0x17473: 0xe0000d91, - 0x17474: 0xe0000da3, 0x17475: 0xe0000de3, 0x17476: 0xe0000dcf, 0x17477: 0x40093c20, - 0x17478: 0xe0000e0f, 0x17479: 0xe0000fde, 0x1747a: 0xe0000fd8, 0x1747b: 0xe0000fea, - 0x1747c: 0xe0000ffc, 0x1747d: 0xe00010ff, 0x1747e: 0x40318820, 0x1747f: 0xe0001114, - // Block 0x5d2, offset 0x17480 - 0x17480: 0xe00009b1, 0x17481: 0xe00009ae, 0x17482: 0xe0000a22, 0x17483: 0xe0000a1f, - 0x17484: 0xe0000a28, 0x17485: 0xe0000a25, 0x17486: 0xe0000a2e, 0x17487: 0xe0000a2b, - 0x17488: 0xe000ade6, 0x17489: 0xe000ade3, 0x1748a: 0xe0000a8c, 0x1748b: 0xe0000a89, - 0x1748c: 0xe0000a98, 0x1748d: 0xe0000a95, 0x1748e: 0xe0000aa4, 0x1748f: 0xe0000aa1, - 0x17490: 0xe0000a92, 0x17491: 0xe0000a8f, 0x17492: 0xe0000a9e, 0x17493: 0xe0000a9b, - 0x17494: 0xe0000b55, 0x17495: 0xe0000b51, 0x17496: 0xe0000b4d, 0x17497: 0xe0000b49, - 0x17498: 0xe0000b7c, 0x17499: 0xe0000b79, 0x1749a: 0xe0000b82, 0x1749b: 0xe0000b7f, - 0x1749c: 0xe0000b39, 0x1749d: 0xe0000b35, 0x1749e: 0xe0000b8c, 0x1749f: 0xe0000b89, - 0x174a0: 0xe0000bd0, 0x174a1: 0xe0000bcd, 0x174a2: 0xe0000c00, 0x174a3: 0xe0000bfd, - 0x174a4: 0xe0000c0c, 0x174a5: 0xe0000c09, 0x174a6: 0xe0000bfa, 0x174a7: 0xe0000bf7, - 0x174a8: 0xe0000c06, 0x174a9: 0xe0000c03, 0x174aa: 0xe0000c12, 0x174ab: 0xe0000c0f, - 0x174ac: 0xe0000c7e, 0x174ad: 0xe0000c7b, 0x174ae: 0xe0000c4a, 0x174af: 0xe0000c46, - 0x174b0: 0xe0000c93, 0x174b1: 0xe0000c90, 0x174b2: 0xe0000cab, 0x174b3: 0xe0000ca8, - 0x174b4: 0xe0000cb1, 0x174b5: 0xe0000cae, 0x174b6: 0xe0000cde, 0x174b7: 0xe0000cdb, - 0x174b8: 0xe0000ce5, 0x174b9: 0xe0000ce1, 0x174ba: 0xe0000cf2, 0x174bb: 0xe0000cef, - 0x174bc: 0xe0000cec, 0x174bd: 0xe0000ce9, 0x174be: 0xe0000d1e, 0x174bf: 0xe0000d1b, - // Block 0x5d3, offset 0x174c0 - 0x174c0: 0xa0000000, 0x174c1: 0xa0000000, 0x174c2: 0xa0000000, 0x174c3: 0xa0000000, - 0x174c4: 0xa0000000, 0x174c5: 0xa0000000, 0x174c6: 0xa0000000, 0x174c7: 0xa0000000, - 0x174c8: 0xa0000000, 0x174c9: 0x40020020, 0x174ca: 0x40020220, 0x174cb: 0x40020420, - 0x174cc: 0x40020620, 0x174cd: 0x40020820, 0x174ce: 0xa0000000, 0x174cf: 0xa0000000, - 0x174d0: 0xa0000000, 0x174d1: 0xa0000000, 0x174d2: 0xa0000000, 0x174d3: 0xa0000000, - 0x174d4: 0xa0000000, 0x174d5: 0xa0000000, 0x174d6: 0xa0000000, 0x174d7: 0xa0000000, - 0x174d8: 0xa0000000, 0x174d9: 0xa0000000, 0x174da: 0xa0000000, 0x174db: 0xa0000000, - 0x174dc: 0xa0000000, 0x174dd: 0xa0000000, 0x174de: 0xa0000000, 0x174df: 0xa0000000, - 0x174e0: 0x40021220, 0x174e1: 0x4002ba20, 0x174e2: 0x4003e020, 0x174e3: 0x4004ea20, - 0x174e4: 0x4027de20, 0x174e5: 0x4004ec20, 0x174e6: 0x4004e620, 0x174e7: 0x4003d220, - 0x174e8: 0x4003f420, 0x174e9: 0x4003f620, 0x174ea: 0x4004d820, 0x174eb: 0x40093820, - 0x174ec: 0x40024020, 0x174ed: 0x40021a20, 0x174ee: 0x4002e420, 0x174ef: 0x4004e220, - 0x174f0: 0x4029cc20, 0x174f1: 0x4029ce20, 0x174f2: 0x4029d020, 0x174f3: 0x4029d220, - 0x174f4: 0x4029d420, 0x174f5: 0x4029d620, 0x174f6: 0x4029d820, 0x174f7: 0x4029da20, - 0x174f8: 0x4029dc20, 0x174f9: 0x4029de20, 0x174fa: 0x40026c20, 0x174fb: 0x40026220, - 0x174fc: 0x40094020, 0x174fd: 0x40094220, 0x174fe: 0x40094420, 0x174ff: 0x4002c420, - // Block 0x5d4, offset 0x17500 - 0x17500: 0x4004d620, 0x17501: 0xc57327b1, 0x17502: 0x002c0a88, 0x17503: 0x002c3a88, - 0x17504: 0x002c6288, 0x17505: 0xcf130be1, 0x17506: 0x002d0888, 0x17507: 0x002d2288, - 0x17508: 0x002d6888, 0x17509: 0x002d9a88, 0x1750a: 0x002dcc88, 0x1750b: 0x002dfe88, - 0x1750c: 0xc0030002, 0x1750d: 0x002e8288, 0x1750e: 0x002e9e88, 0x1750f: 0xcf199891, - 0x17510: 0x002f2c88, 0x17511: 0x002f5688, 0x17512: 0x002f7a88, 0x17513: 0x002fe688, - 0x17514: 0x00302c88, 0x17515: 0xc3900b21, 0x17516: 0x0030be88, 0x17517: 0x0030e288, - 0x17518: 0x0030f688, 0x17519: 0x00310088, 0x1751a: 0x00312a88, 0x1751b: 0x4003f820, - 0x1751c: 0x4004e420, 0x1751d: 0x4003fa20, 0x1751e: 0x40062420, 0x1751f: 0x40021620, - 0x17520: 0x40061e20, 0x17521: 0xc57027b1, 0x17522: 0x402c0a20, 0x17523: 0x402c3a20, - 0x17524: 0x402c6220, 0x17525: 0xcf110be1, 0x17526: 0x402d0820, 0x17527: 0x402d2220, - 0x17528: 0x402d6820, 0x17529: 0x402d9a20, 0x1752a: 0x402dcc20, 0x1752b: 0x402dfe20, - 0x1752c: 0xc0000002, 0x1752d: 0x402e8220, 0x1752e: 0x402e9e20, 0x1752f: 0xcf159891, - 0x17530: 0x402f2c20, 0x17531: 0x402f5620, 0x17532: 0x402f7a20, 0x17533: 0x402fe620, - 0x17534: 0x40302c20, 0x17535: 0xc38d0b21, 0x17536: 0x4030be20, 0x17537: 0x4030e220, - 0x17538: 0x4030f620, 0x17539: 0x40310020, 0x1753a: 0x40312a20, 0x1753b: 0x4003fc20, - 0x1753c: 0x40094820, 0x1753d: 0x4003fe20, 0x1753e: 0x40094c20, 0x1753f: 0xa0000000, - // Block 0x5d5, offset 0x17540 - 0x17540: 0xe00008f5, 0x17541: 0xe00008ef, 0x17542: 0xe0000921, 0x17543: 0xe0000969, - 0x17544: 0x00320e83, 0x17545: 0x00320c83, 0x17546: 0x00320ea3, 0x17547: 0xe0000a53, - 0x17548: 0xe0000ae8, 0x17549: 0xe0000ae2, 0x1754a: 0xe0000af4, 0x1754b: 0xe0000b20, - 0x1754c: 0xe0000c2b, 0x1754d: 0xe0000c25, 0x1754e: 0xe0000c37, 0x1754f: 0xe0000c43, - 0x17550: 0x002c62c3, 0x17551: 0xe0000d63, 0x17552: 0xe0000d9a, 0x17553: 0xe0000d94, - 0x17554: 0x00321103, 0x17555: 0xe0000de6, 0x17556: 0x00321083, 0x17557: 0x40093e20, - 0x17558: 0x003210a3, 0x17559: 0xe0000fe1, 0x1755a: 0xe0000fdb, 0x1755b: 0xe0000fed, - 0x1755c: 0x003100a3, 0x1755d: 0xe0001102, 0x1755e: 0xe0002973, 0x1755f: 0xe0000f7b, - 0x17560: 0xe00008f2, 0x17561: 0xe00008ec, 0x17562: 0xe000091e, 0x17563: 0xe0000966, - 0x17564: 0x40320e20, 0x17565: 0x40320c20, 0x17566: 0x40320e21, 0x17567: 0xe0000a4d, - 0x17568: 0xe0000ae5, 0x17569: 0xe0000adf, 0x1756a: 0xe0000af1, 0x1756b: 0xe0000b1d, - 0x1756c: 0xe0000c28, 0x1756d: 0xe0000c22, 0x1756e: 0xe0000c34, 0x1756f: 0xe0000c40, - 0x17570: 0x402c6222, 0x17571: 0xe0000d60, 0x17572: 0xe0000d97, 0x17573: 0xe0000d91, - 0x17574: 0x40321024, 0x17575: 0xe0000de3, 0x17576: 0x40321020, 0x17577: 0x40093c20, - 0x17578: 0x40321021, 0x17579: 0xe0000fde, 0x1757a: 0xe0000fd8, 0x1757b: 0xe0000fea, - 0x1757c: 0x40310021, 0x1757d: 0xe00010ff, 0x1757e: 0xe0002970, 0x1757f: 0xe0001114, - // Block 0x5d6, offset 0x17580 - 0x17580: 0xe0000983, 0x17581: 0xe0000980, 0x17582: 0xe00008fb, 0x17583: 0xe00008f8, - 0x17584: 0xe000097d, 0x17585: 0xe000097a, 0x17586: 0xe0000a38, 0x17587: 0xe0000a35, - 0x17588: 0xe0000a3e, 0x17589: 0xe0000a3b, 0x1758a: 0xe0000a4a, 0x1758b: 0xe0000a47, - 0x1758c: 0xe0000a44, 0x1758d: 0xe0000a41, 0x1758e: 0xe0000a86, 0x1758f: 0xe0000a83, - 0x17590: 0x002c62a3, 0x17591: 0x402c6221, 0x17592: 0xe0000b46, 0x17593: 0xe0000b43, - 0x17594: 0xe0000aee, 0x17595: 0xe0000aeb, 0x17596: 0xe0000b2c, 0x17597: 0xe0000b29, - 0x17598: 0x00320ec3, 0x17599: 0x40320e22, 0x1759a: 0xe0000b1a, 0x1759b: 0xe0000b17, - 0x1759c: 0xe0000bb8, 0x1759d: 0xe0000bb5, 0x1759e: 0xe0000bb2, 0x1759f: 0xe0000baf, - 0x175a0: 0xe0000bc4, 0x175a1: 0xe0000bc1, 0x175a2: 0xe0000bca, 0x175a3: 0xe0000bc7, - 0x175a4: 0xe0000bee, 0x175a5: 0xe0000beb, 0x175a6: 0xe0000c1b, 0x175a7: 0xe0000c18, - 0x175a8: 0xe0000c51, 0x175a9: 0xe0000c4e, 0x175aa: 0xe0000c60, 0x175ab: 0xe0000c5d, - 0x175ac: 0xe0000c31, 0x175ad: 0xe0000c2e, 0x175ae: 0xe0000c5a, 0x175af: 0xe0000c57, - 0x175b0: 0xe0000c54, 0x175b1: 0x402da220, 0x175b2: 0xf0000a0a, 0x175b3: 0xf0000404, - 0x175b4: 0xe0000c8a, 0x175b5: 0xe0000c87, 0x175b6: 0xe0000c9f, 0x175b7: 0xe0000c9c, - 0x175b8: 0x402f7220, 0x175b9: 0xe0000ccc, 0x175ba: 0xe0000cc9, 0x175bb: 0xe0000cd8, - 0x175bc: 0xe0000cd5, 0x175bd: 0xe0000cd2, 0x175be: 0xe0000ccf, 0x175bf: 0xe0000d04, - // Block 0x5d7, offset 0x175c0 - 0x175c0: 0xe0000cfe, 0x175c1: 0xe0000cf8, 0x175c2: 0xe0000cf5, 0x175c3: 0xe0000d51, - 0x175c4: 0xe0000d4e, 0x175c5: 0xe0000d6f, 0x175c6: 0xe0000d6c, 0x175c7: 0xe0000d5d, - 0x175c8: 0xe0000d5a, 0x175c9: 0xf0000404, 0x175ca: 0x002eda88, 0x175cb: 0x402eda20, - 0x175cc: 0xe0000e2e, 0x175cd: 0xe0000e2b, 0x175ce: 0xe0000da0, 0x175cf: 0xe0000d9d, - 0x175d0: 0x003210c3, 0x175d1: 0x40321022, 0x175d2: 0x003210e3, 0x175d3: 0x40321023, - 0x175d4: 0xe0000eca, 0x175d5: 0xe0000ec7, 0x175d6: 0xe0000edc, 0x175d7: 0xe0000ed9, - 0x175d8: 0xe0000ed0, 0x175d9: 0xe0000ecd, 0x175da: 0xe0000f1f, 0x175db: 0xe0000f1c, - 0x175dc: 0xe0000f2d, 0x175dd: 0xe0000f2a, 0x175de: 0xe0000f47, 0x175df: 0xe0000f44, - 0x175e0: 0xe0000f33, 0x175e1: 0xe0000f30, 0x175e2: 0xe0000f99, 0x175e3: 0xe0000f96, - 0x175e4: 0xe0000f8a, 0x175e5: 0xe0000f87, 0x175e6: 0x00303688, 0x175e7: 0x40303620, - 0x175e8: 0xe000102b, 0x175e9: 0xe0001028, 0x175ea: 0xe000103f, 0x175eb: 0xe000103c, - 0x175ec: 0xe0000fe7, 0x175ed: 0xe0000fe4, 0x175ee: 0xe0000ff9, 0x175ef: 0xe0000ff6, - 0x175f0: 0x003100c3, 0x175f1: 0x40310022, 0x175f2: 0xe0001039, 0x175f3: 0xe0001036, - 0x175f4: 0xe00010d8, 0x175f5: 0xe00010d5, 0x175f6: 0xe000110e, 0x175f7: 0xe000110b, - 0x175f8: 0xe0001117, 0x175f9: 0xe000113b, 0x175fa: 0xe0001138, 0x175fb: 0xe000114d, - 0x175fc: 0xe000114a, 0x175fd: 0xe0001147, 0x175fe: 0xe0001144, 0x175ff: 0xe0000f64, - // Block 0x5d8, offset 0x17600 - 0x17600: 0xe0000b03, 0x17601: 0xe0000aff, 0x17602: 0xe0000b13, 0x17603: 0xe0000b0f, - 0x17604: 0xe0000b0b, 0x17605: 0xe0000b07, 0x17606: 0xe0000b75, 0x17607: 0xe0000b71, - 0x17608: 0xe0000c66, 0x17609: 0xe0000c63, 0x1760a: 0xe0000c78, 0x1760b: 0xe0000c75, - 0x1760c: 0xe0000e84, 0x1760d: 0xe0000e81, 0x1760e: 0xe0000e44, 0x1760f: 0xe0000e41, - 0x17610: 0xe000adec, 0x17611: 0xe000ade9, 0x17612: 0xe000adf2, 0x17613: 0xe000adef, - 0x17614: 0xe000adfe, 0x17615: 0xe000adfb, 0x17616: 0xe000adf8, 0x17617: 0xe000adf5, - 0x17618: 0xe000ae04, 0x17619: 0xe000ae01, 0x1761a: 0xe0000e5d, 0x1761b: 0xe0000e59, - 0x1761c: 0xe0000e65, 0x1761d: 0xe0000e61, 0x1761e: 0xe0000e75, 0x1761f: 0xe0000e71, - 0x17620: 0xe0000e6d, 0x17621: 0xe0000e69, 0x17622: 0xe0000e7d, 0x17623: 0xe0000e79, - 0x17624: 0xe000108d, 0x17625: 0xe000108a, 0x17626: 0xe000104d, 0x17627: 0xe000104a, - 0x17628: 0xe0001066, 0x17629: 0xe0001062, 0x1762a: 0xe000106e, 0x1762b: 0xe000106a, - 0x1762c: 0xe000107e, 0x1762d: 0xe000107a, 0x1762e: 0xe0001076, 0x1762f: 0xe0001072, - 0x17630: 0xe0001086, 0x17631: 0xe0001082, 0x17632: 0xe0001108, 0x17633: 0xe0001105, - 0x17634: 0xe0001135, 0x17635: 0xe0001132, 0x17636: 0xe000112f, 0x17637: 0xe000112c, - 0x17638: 0xe000111d, 0x17639: 0xe000111a, 0x1763a: 0xe0000d0a, 0x1763b: 0xe0000d07, - 0x1763c: 0x0030d888, 0x1763d: 0x4030d820, 0x1763e: 0x00312088, 0x1763f: 0x40312020, - // Block 0x5d9, offset 0x17640 - 0x17640: 0xa0000000, 0x17641: 0xa0000000, 0x17642: 0xa0000000, 0x17643: 0xa0000000, - 0x17644: 0xa0000000, 0x17645: 0xa0000000, 0x17646: 0xa0000000, 0x17647: 0xa0000000, - 0x17648: 0xa0000000, 0x17649: 0x40020020, 0x1764a: 0x40020220, 0x1764b: 0x40020420, - 0x1764c: 0x40020620, 0x1764d: 0x40020820, 0x1764e: 0xa0000000, 0x1764f: 0xa0000000, - 0x17650: 0xa0000000, 0x17651: 0xa0000000, 0x17652: 0xa0000000, 0x17653: 0xa0000000, - 0x17654: 0xa0000000, 0x17655: 0xa0000000, 0x17656: 0xa0000000, 0x17657: 0xa0000000, - 0x17658: 0xa0000000, 0x17659: 0xa0000000, 0x1765a: 0xa0000000, 0x1765b: 0xa0000000, - 0x1765c: 0xa0000000, 0x1765d: 0xa0000000, 0x1765e: 0xa0000000, 0x1765f: 0xa0000000, - 0x17660: 0x40021220, 0x17661: 0x4002ba20, 0x17662: 0x4003e020, 0x17663: 0x4004ea20, - 0x17664: 0x4027de20, 0x17665: 0x4004ec20, 0x17666: 0x4004e620, 0x17667: 0x4003d220, - 0x17668: 0x4003f420, 0x17669: 0x4003f620, 0x1766a: 0x4004d820, 0x1766b: 0x40093820, - 0x1766c: 0x40024020, 0x1766d: 0x40021a20, 0x1766e: 0x4002e420, 0x1766f: 0x4004e220, - 0x17670: 0x4029cc20, 0x17671: 0x4029ce20, 0x17672: 0x4029d020, 0x17673: 0x4029d220, - 0x17674: 0x4029d420, 0x17675: 0x4029d620, 0x17676: 0x4029d820, 0x17677: 0x4029da20, - 0x17678: 0x4029dc20, 0x17679: 0x4029de20, 0x1767a: 0x40026c20, 0x1767b: 0x40026220, - 0x1767c: 0x40094020, 0x1767d: 0x40094220, 0x1767e: 0x40094420, 0x1767f: 0x4002c420, - // Block 0x5da, offset 0x17680 - 0x17680: 0x4004d620, 0x17681: 0xc57327b1, 0x17682: 0x002c0a88, 0x17683: 0x002c3a88, - 0x17684: 0x002c6288, 0x17685: 0xcf130be1, 0x17686: 0x002d0888, 0x17687: 0x002d2288, - 0x17688: 0x002d6888, 0x17689: 0x002d9a88, 0x1768a: 0x002dcc88, 0x1768b: 0x002dfe88, - 0x1768c: 0xc0030002, 0x1768d: 0x002e8288, 0x1768e: 0x002e9e88, 0x1768f: 0xcf199891, - 0x17690: 0x002f2c88, 0x17691: 0x002f5688, 0x17692: 0x002f7a88, 0x17693: 0x002fe688, - 0x17694: 0x00302c88, 0x17695: 0xc3900b21, 0x17696: 0x0030be83, 0x17697: 0x0030bea3, - 0x17698: 0x0030f688, 0x17699: 0x00310088, 0x1769a: 0x00312a88, 0x1769b: 0x4003f820, - 0x1769c: 0x4004e420, 0x1769d: 0x4003fa20, 0x1769e: 0x40062420, 0x1769f: 0x40021620, - 0x176a0: 0x40061e20, 0x176a1: 0xc57027b1, 0x176a2: 0x402c0a20, 0x176a3: 0x402c3a20, - 0x176a4: 0x402c6220, 0x176a5: 0xcf110be1, 0x176a6: 0x402d0820, 0x176a7: 0x402d2220, - 0x176a8: 0x402d6820, 0x176a9: 0x402d9a20, 0x176aa: 0x402dcc20, 0x176ab: 0x402dfe20, - 0x176ac: 0xc0000002, 0x176ad: 0x402e8220, 0x176ae: 0x402e9e20, 0x176af: 0xcf159891, - 0x176b0: 0x402f2c20, 0x176b1: 0x402f5620, 0x176b2: 0x402f7a20, 0x176b3: 0x402fe620, - 0x176b4: 0x40302c20, 0x176b5: 0xc38d0b21, 0x176b6: 0x4030be20, 0x176b7: 0x4030be21, - 0x176b8: 0x4030f620, 0x176b9: 0x40310020, 0x176ba: 0x40312a20, 0x176bb: 0x4003fc20, - 0x176bc: 0x40094820, 0x176bd: 0x4003fe20, 0x176be: 0x40094c20, 0x176bf: 0xa0000000, - // Block 0x5db, offset 0x176c0 - 0x176c0: 0xe0000cfe, 0x176c1: 0xe0000cf8, 0x176c2: 0xe0000cf5, 0x176c3: 0xe0000d51, - 0x176c4: 0xe0000d4e, 0x176c5: 0xe0000d6f, 0x176c6: 0xe0000d6c, 0x176c7: 0xe0000d5d, - 0x176c8: 0xe0000d5a, 0x176c9: 0xf0000404, 0x176ca: 0x002eda88, 0x176cb: 0x402eda20, - 0x176cc: 0xe0000e2e, 0x176cd: 0xe0000e2b, 0x176ce: 0xe0000da0, 0x176cf: 0xe0000d9d, - 0x176d0: 0x003210c3, 0x176d1: 0x40321022, 0x176d2: 0x003210e3, 0x176d3: 0x40321023, - 0x176d4: 0xe0000eca, 0x176d5: 0xe0000ec7, 0x176d6: 0xe0000edc, 0x176d7: 0xe0000ed9, - 0x176d8: 0xe0000ed0, 0x176d9: 0xe0000ecd, 0x176da: 0xe0000f1f, 0x176db: 0xe0000f1c, - 0x176dc: 0xe0000f2d, 0x176dd: 0xe0000f2a, 0x176de: 0xe0000f47, 0x176df: 0xe0000f44, - 0x176e0: 0xe0000f33, 0x176e1: 0xe0000f30, 0x176e2: 0xe0000f99, 0x176e3: 0xe0000f96, - 0x176e4: 0xe0000f8a, 0x176e5: 0xe0000f87, 0x176e6: 0x00303688, 0x176e7: 0x40303620, - 0x176e8: 0xe000102b, 0x176e9: 0xe0001028, 0x176ea: 0xe000103f, 0x176eb: 0xe000103c, - 0x176ec: 0xe0000fe7, 0x176ed: 0xe0000fe4, 0x176ee: 0xe0000ff9, 0x176ef: 0xe0000ff6, - 0x176f0: 0x003100c3, 0x176f1: 0x40310022, 0x176f2: 0xe0001039, 0x176f3: 0xe0001036, - 0x176f4: 0xe0003636, 0x176f5: 0xe0003633, 0x176f6: 0xe000110e, 0x176f7: 0xe000110b, - 0x176f8: 0xe0001117, 0x176f9: 0xe000113b, 0x176fa: 0xe0001138, 0x176fb: 0xe000114d, - 0x176fc: 0xe000114a, 0x176fd: 0xe0001147, 0x176fe: 0xe0001144, 0x176ff: 0xe0000f64, - // Block 0x5dc, offset 0x17700 - 0x17700: 0xe0000d24, 0x17701: 0xe0000d21, 0x17702: 0xe0000d2a, 0x17703: 0xe0000d27, - 0x17704: 0xe0000d69, 0x17705: 0xe0000d66, 0x17706: 0xe0000d7b, 0x17707: 0xe0000d78, - 0x17708: 0xe0000d87, 0x17709: 0xe0000d84, 0x1770a: 0xe0000d81, 0x1770b: 0xe0000d7e, - 0x1770c: 0xe0000ded, 0x1770d: 0xe0000de9, 0x1770e: 0xe00037f4, 0x1770f: 0xe00037f1, - 0x17710: 0xe0000e3d, 0x17711: 0xe0000e39, 0x17712: 0xe0000e35, 0x17713: 0xe0000e31, - 0x17714: 0xe0000ea7, 0x17715: 0xe0000ea4, 0x17716: 0xe0000ead, 0x17717: 0xe0000eaa, - 0x17718: 0xe0000ed6, 0x17719: 0xe0000ed3, 0x1771a: 0xe0000ef4, 0x1771b: 0xe0000ef1, - 0x1771c: 0xe0000efb, 0x1771d: 0xe0000ef7, 0x1771e: 0xe0000f02, 0x1771f: 0xe0000eff, - 0x17720: 0xe0000f41, 0x17721: 0xe0000f3e, 0x17722: 0xe0000f53, 0x17723: 0xe0000f50, - 0x17724: 0xe0000f26, 0x17725: 0xe0000f22, 0x17726: 0xe0000f3a, 0x17727: 0xe0000f36, - 0x17728: 0xe0000f5a, 0x17729: 0xe0000f56, 0x1772a: 0xe0000f93, 0x1772b: 0xe0000f90, - 0x1772c: 0xe0000f9f, 0x1772d: 0xe0000f9c, 0x1772e: 0xe0000fb1, 0x1772f: 0xe0000fae, - 0x17730: 0xe0000fab, 0x17731: 0xe0000fa8, 0x17732: 0xe0001093, 0x17733: 0xe0001090, - 0x17734: 0xe000109f, 0x17735: 0xe000109c, 0x17736: 0xe0001099, 0x17737: 0xe0001096, - 0x17738: 0xe0001032, 0x17739: 0xe000102e, 0x1773a: 0xe000298b, 0x1773b: 0xe0002988, - 0x1773c: 0xe000ae07, 0x1773d: 0xe00010a6, 0x1773e: 0xe000ae0a, 0x1773f: 0xe00010ac, - // Block 0x5dd, offset 0x17740 - 0x17742: 0x40429620, 0x17743: 0x40429820, - 0x17745: 0x40427e20, 0x17746: 0x40428020, 0x17747: 0x40428220, - 0x17748: 0x40428420, 0x17749: 0x40428620, 0x1774a: 0x40428820, - 0x1774e: 0x40428a20, 0x1774f: 0x40428c20, - 0x17750: 0x40428e20, 0x17752: 0xc0610231, 0x17753: 0x40429220, - 0x17754: 0x40429420, 0x17755: 0xcf1d98d1, - 0x17759: 0xcf219961, 0x1775a: 0xcf239961, - 0x1775c: 0xcf439961, 0x1775e: 0xcf259961, 0x1775f: 0xcf279961, - 0x17763: 0xcf299961, - 0x17764: 0xcf2b9961, - 0x17768: 0xcf2d9961, 0x17769: 0xcf419961, 0x1776a: 0xcf2f9961, - 0x1776e: 0xcf319961, 0x1776f: 0xcf339961, - 0x17770: 0xcf359961, 0x17771: 0xcf3f9961, 0x17772: 0xcf379961, 0x17773: 0xcf3d9961, - 0x17774: 0xcf3b9961, 0x17775: 0xcf399961, 0x17776: 0xcf459961, 0x17777: 0xcf479961, - 0x17778: 0xcf499961, 0x17779: 0xcf4b9961, - 0x1777e: 0x4042c620, 0x1777f: 0x4042c820, - // Block 0x5de, offset 0x17780 - 0x17781: 0x40430020, 0x17782: 0x40430220, 0x17783: 0x40430420, - 0x17785: 0x4042e020, 0x17786: 0x4042e220, 0x17787: 0x4042e420, - 0x17788: 0x4042e620, 0x17789: 0x4042e820, 0x1778a: 0x4042ea20, 0x1778b: 0x4042ec20, - 0x1778c: 0x4042f020, 0x1778e: 0x4042f420, 0x1778f: 0x4042f620, - 0x17790: 0x4042f820, 0x17792: 0x4042fa20, 0x17793: 0x4042fc20, - 0x17794: 0x4042fe20, 0x17795: 0x40430020, 0x17796: 0x40430220, 0x17797: 0x40430420, - 0x17798: 0x40430620, 0x17799: 0x40430820, 0x1779a: 0x40430a20, 0x1779b: 0x40430e20, - 0x1779c: 0x40431020, 0x1779d: 0x40431420, 0x1779e: 0x40431620, 0x1779f: 0x40431820, - 0x177a0: 0x40431a20, 0x177a1: 0x40431c20, 0x177a2: 0x40431e20, 0x177a3: 0x40432020, - 0x177a4: 0x40432220, 0x177a5: 0x40432420, 0x177a6: 0x40432620, 0x177a7: 0x40432820, - 0x177a8: 0x40432a20, 0x177aa: 0x40432c20, 0x177ab: 0x40432e20, - 0x177ac: 0x40433020, 0x177ad: 0x40433220, 0x177ae: 0x40433420, 0x177af: 0x40433620, - 0x177b0: 0x40433820, 0x177b1: 0x40433a20, 0x177b2: 0x40433c20, 0x177b3: 0x40434820, - 0x177b5: 0x40433e20, 0x177b6: 0x40434020, 0x177b7: 0x40434220, - 0x177b8: 0x40434420, 0x177b9: 0x40434620, - 0x177bd: 0x40434a20, 0x177be: 0x40434c20, 0x177bf: 0x40434e20, - // Block 0x5df, offset 0x177c0 - 0x177c1: 0x40491020, 0x177c2: 0x40491220, 0x177c3: 0x40491420, - 0x177c4: 0x40491620, 0x177c5: 0x40491820, 0x177c6: 0x40491a20, 0x177c7: 0x40491c20, - 0x177c8: 0x40491e20, 0x177c9: 0x40492020, 0x177ca: 0x40492220, 0x177cb: 0x40492420, - 0x177cc: 0x40492620, 0x177cd: 0x40492820, 0x177ce: 0x40492a20, 0x177cf: 0x40492c20, - 0x177d0: 0x40492e20, 0x177d1: 0x40493020, 0x177d2: 0x40493220, 0x177d3: 0x40493420, - 0x177d4: 0x40493620, 0x177d5: 0x40493820, 0x177d6: 0x40493a20, 0x177d7: 0x40493c20, - 0x177d8: 0x40493e20, 0x177d9: 0x40494020, 0x177da: 0x40494220, 0x177db: 0x40494420, - 0x177dc: 0x40494620, 0x177dd: 0x40494820, 0x177de: 0x40494a20, 0x177df: 0x40494c20, - 0x177e0: 0x40494e20, 0x177e1: 0x40495020, 0x177e2: 0x40495220, 0x177e3: 0x40495420, - 0x177e4: 0x40495620, 0x177e5: 0x40495820, 0x177e6: 0x40495a20, 0x177e7: 0x40495c20, - 0x177e8: 0x40495e20, 0x177e9: 0x40496020, 0x177ea: 0x40496220, 0x177eb: 0x40496420, - 0x177ec: 0x40496620, 0x177ed: 0x40496820, 0x177ee: 0x40496a20, 0x177ef: 0x40057820, - 0x177f0: 0x40496e20, 0x177f1: 0x40497020, 0x177f2: 0x40497220, 0x177f3: 0xe000ae10, - 0x177f4: 0x40497620, 0x177f5: 0x40497820, 0x177f6: 0x40497a20, 0x177f7: 0x40497c20, - 0x177f8: 0x826724bf, 0x177f9: 0x826724c0, 0x177fa: 0x40498e20, - 0x177ff: 0x4027f420, - // Block 0x5e0, offset 0x17800 - 0x17800: 0xc07f04e1, 0x17801: 0xc0ae04e1, 0x17802: 0xc0dd04e1, 0x17803: 0xc10c04e1, - 0x17804: 0xc13b04e1, 0x17805: 0x00497283, 0x17806: 0x40057e20, 0x17807: 0xa000ff02, - 0x17808: 0xa6b10002, 0x17809: 0xa6b10102, 0x1780a: 0xa6b10202, 0x1780b: 0xa6b10302, - 0x1780c: 0xa000ff02, 0x1780d: 0xcf4d9991, 0x1780e: 0xa000fe02, 0x1780f: 0x40057820, - 0x17810: 0xe000019a, 0x17811: 0xe000022e, 0x17812: 0xe0000346, 0x17813: 0xe0000420, - 0x17814: 0xe00004f5, 0x17815: 0xe00005bf, 0x17816: 0xe000068a, 0x17817: 0xe0000732, - 0x17818: 0xe00007de, 0x17819: 0xe0000883, 0x1781a: 0x40057a20, 0x1781b: 0x40057c20, - // Block 0x5e1, offset 0x17840 - 0x17840: 0xa0000000, 0x17841: 0xa0000000, 0x17842: 0xa0000000, 0x17843: 0xa0000000, - 0x17844: 0xa0000000, 0x17845: 0xa0000000, 0x17846: 0xa0000000, 0x17847: 0xa0000000, - 0x17848: 0xa0000000, 0x17849: 0x40020020, 0x1784a: 0x40020220, 0x1784b: 0x40020420, - 0x1784c: 0x40020620, 0x1784d: 0x40020820, 0x1784e: 0xa0000000, 0x1784f: 0xa0000000, - 0x17850: 0xa0000000, 0x17851: 0xa0000000, 0x17852: 0xa0000000, 0x17853: 0xa0000000, - 0x17854: 0xa0000000, 0x17855: 0xa0000000, 0x17856: 0xa0000000, 0x17857: 0xa0000000, - 0x17858: 0xa0000000, 0x17859: 0xa0000000, 0x1785a: 0xa0000000, 0x1785b: 0xa0000000, - 0x1785c: 0xa0000000, 0x1785d: 0xa0000000, 0x1785e: 0xa0000000, 0x1785f: 0xa0000000, - 0x17860: 0x40021220, 0x17861: 0x4002ba20, 0x17862: 0x4003e020, 0x17863: 0x4004ea20, - 0x17864: 0x4027de20, 0x17865: 0x4004ec20, 0x17866: 0x4004e620, 0x17867: 0x4003d220, - 0x17868: 0x4003f420, 0x17869: 0x4003f620, 0x1786a: 0x4004d820, 0x1786b: 0x40093820, - 0x1786c: 0x40024020, 0x1786d: 0x40021a20, 0x1786e: 0x4002e420, 0x1786f: 0x4004e220, - 0x17870: 0x4029cc20, 0x17871: 0x4029ce20, 0x17872: 0x4029d020, 0x17873: 0x4029d220, - 0x17874: 0x4029d420, 0x17875: 0x4029d620, 0x17876: 0x4029d820, 0x17877: 0x4029da20, - 0x17878: 0x4029dc20, 0x17879: 0x4029de20, 0x1787a: 0x40026c20, 0x1787b: 0x40026220, - 0x1787c: 0x40094020, 0x1787d: 0x40094220, 0x1787e: 0x40094420, 0x1787f: 0x4002c420, - // Block 0x5e2, offset 0x17880 - 0x17880: 0x4004d620, 0x17881: 0xcf5399e1, 0x17882: 0x002c0a88, 0x17883: 0x002c3a88, - 0x17884: 0x002c6288, 0x17885: 0xcf5999e1, 0x17886: 0x002d0888, 0x17887: 0x002d2288, - 0x17888: 0x002d6888, 0x17889: 0xcf5f99e1, 0x1788a: 0x002dcc88, 0x1788b: 0x002dfe88, - 0x1788c: 0xc0030002, 0x1788d: 0x002e8288, 0x1788e: 0xc5350a52, 0x1788f: 0xcf6599e1, - 0x17890: 0x002f2c88, 0x17891: 0x002f5688, 0x17892: 0x002f7a88, 0x17893: 0x002fe688, - 0x17894: 0x00302c88, 0x17895: 0xcf6b99e1, 0x17896: 0x0030be88, 0x17897: 0x0030e288, - 0x17898: 0x0030f688, 0x17899: 0x00310088, 0x1789a: 0x00312a88, 0x1789b: 0x4003f820, - 0x1789c: 0x4004e420, 0x1789d: 0x4003fa20, 0x1789e: 0x40062420, 0x1789f: 0x40021620, - 0x178a0: 0x40061e20, 0x178a1: 0xcf5099e1, 0x178a2: 0x402c0a20, 0x178a3: 0x402c3a20, - 0x178a4: 0x402c6220, 0x178a5: 0xcf5699e1, 0x178a6: 0x402d0820, 0x178a7: 0x402d2220, - 0x178a8: 0x402d6820, 0x178a9: 0xcf5c99e1, 0x178aa: 0x402dcc20, 0x178ab: 0x402dfe20, - 0x178ac: 0xc0000002, 0x178ad: 0x402e8220, 0x178ae: 0xc5330a41, 0x178af: 0xcf6299e1, - 0x178b0: 0x402f2c20, 0x178b1: 0x402f5620, 0x178b2: 0x402f7a20, 0x178b3: 0x402fe620, - 0x178b4: 0x40302c20, 0x178b5: 0xcf6899e1, 0x178b6: 0x4030be20, 0x178b7: 0x4030e220, - 0x178b8: 0x4030f620, 0x178b9: 0x40310020, 0x178ba: 0x40312a20, 0x178bb: 0x4003fc20, - 0x178bc: 0x40094820, 0x178bd: 0x4003fe20, 0x178be: 0x40094c20, 0x178bf: 0xa0000000, - // Block 0x5e3, offset 0x178c0 - 0x178c0: 0xe00008f5, 0x178c1: 0x002bdea3, 0x178c2: 0xe0000921, 0x178c3: 0xe0000969, - 0x178c4: 0xe000095b, 0x178c5: 0xe000094d, 0x178c6: 0xe00009dd, 0x178c7: 0xe0000a53, - 0x178c8: 0xe0000ae8, 0x178c9: 0x002c98a3, 0x178ca: 0xe0000af4, 0x178cb: 0xe0000b20, - 0x178cc: 0xe0000c2b, 0x178cd: 0x002d9aa3, 0x178ce: 0xe0000c37, 0x178cf: 0xe0000c43, - 0x178d0: 0xe0000ab3, 0x178d1: 0xe0000d63, 0x178d2: 0xe0000d9a, 0x178d3: 0x002ee2a3, - 0x178d4: 0xe0000da6, 0x178d5: 0xe0000de6, 0x178d6: 0xe0000dd2, 0x178d7: 0x40093e20, - 0x178d8: 0xe0000e12, 0x178d9: 0xe0000fe1, 0x178da: 0x00306ca3, 0x178db: 0xe0000fed, - 0x178dc: 0xe0000fff, 0x178dd: 0xe0001102, 0x178de: 0x00318888, 0x178df: 0xe0000f7b, - 0x178e0: 0xe00008f2, 0x178e1: 0x402bde21, 0x178e2: 0xe000091e, 0x178e3: 0xe0000966, - 0x178e4: 0xe0000958, 0x178e5: 0xe000094a, 0x178e6: 0xe00009d5, 0x178e7: 0xe0000a4d, - 0x178e8: 0xe0000ae5, 0x178e9: 0x402c9821, 0x178ea: 0xe0000af1, 0x178eb: 0xe0000b1d, - 0x178ec: 0xe0000c28, 0x178ed: 0x402d9a21, 0x178ee: 0xe0000c34, 0x178ef: 0xe0000c40, - 0x178f0: 0xe0000aad, 0x178f1: 0xe0000d60, 0x178f2: 0xe0000d97, 0x178f3: 0x402ee221, - 0x178f4: 0xe0000da3, 0x178f5: 0xe0000de3, 0x178f6: 0xe0000dcf, 0x178f7: 0x40093c20, - 0x178f8: 0xe0000e0f, 0x178f9: 0xe0000fde, 0x178fa: 0x40306c21, 0x178fb: 0xe0000fea, - 0x178fc: 0xe0000ffc, 0x178fd: 0xe00010ff, 0x178fe: 0x40318820, 0x178ff: 0xe0001114, - // Block 0x5e4, offset 0x17900 - 0x17900: 0x002bdec3, 0x17901: 0x402bde22, 0x17902: 0xe00008fb, 0x17903: 0xe00008f8, - 0x17904: 0xe000097d, 0x17905: 0xe000097a, 0x17906: 0xe0000a38, 0x17907: 0xe0000a35, - 0x17908: 0xe0000a3e, 0x17909: 0xe0000a3b, 0x1790a: 0xe0000a4a, 0x1790b: 0xe0000a47, - 0x1790c: 0xe0000a44, 0x1790d: 0xe0000a41, 0x1790e: 0xe0000a86, 0x1790f: 0xe0000a83, - 0x17910: 0xe0000aaa, 0x17911: 0xe0000aa7, 0x17912: 0x002c98c3, 0x17913: 0x402c9822, - 0x17914: 0xe0000aee, 0x17915: 0xe0000aeb, 0x17916: 0xe0000b2c, 0x17917: 0xe0000b29, - 0x17918: 0xe0000b40, 0x17919: 0xe0000b3d, 0x1791a: 0xe0000b1a, 0x1791b: 0xe0000b17, - 0x1791c: 0xe0000bb8, 0x1791d: 0xe0000bb5, 0x1791e: 0xe0000bb2, 0x1791f: 0xe0000baf, - 0x17920: 0xe0000bc4, 0x17921: 0xe0000bc1, 0x17922: 0xe0000bca, 0x17923: 0xe0000bc7, - 0x17924: 0xe0000bee, 0x17925: 0xe0000beb, 0x17926: 0xe0000c1b, 0x17927: 0xe0000c18, - 0x17928: 0xe0000c51, 0x17929: 0xe0000c4e, 0x1792a: 0x002d9ac3, 0x1792b: 0x402d9a22, - 0x1792c: 0xe0000c31, 0x1792d: 0xe0000c2e, 0x1792e: 0xe0000c5a, 0x1792f: 0xe0000c57, - 0x17930: 0xe0000c54, 0x17931: 0x402da220, 0x17932: 0xf0000a0a, 0x17933: 0xf0000404, - 0x17934: 0xe0000c8a, 0x17935: 0xe0000c87, 0x17936: 0xe0000c9f, 0x17937: 0xe0000c9c, - 0x17938: 0x402f7220, 0x17939: 0xe0000ccc, 0x1793a: 0xe0000cc9, 0x1793b: 0xe0000cd8, - 0x1793c: 0xe0000cd5, 0x1793d: 0xe0000cd2, 0x1793e: 0xe0000ccf, 0x1793f: 0xe0000d04, - // Block 0x5e5, offset 0x17940 - 0x17940: 0xe0000cfe, 0x17941: 0xe0000cf8, 0x17942: 0xe0000cf5, 0x17943: 0xe0000d51, - 0x17944: 0xe0000d4e, 0x17945: 0xe0000d6f, 0x17946: 0xe0000d6c, 0x17947: 0xe0000d5d, - 0x17948: 0xe0000d5a, 0x17949: 0xf0000404, 0x1794a: 0x002ea086, 0x1794b: 0x002ea085, - 0x1794c: 0x002ee2c3, 0x1794d: 0x402ee222, 0x1794e: 0xe0000da0, 0x1794f: 0xe0000d9d, - 0x17950: 0xe0000de0, 0x17951: 0xe0000ddd, 0x17952: 0xe0000e93, 0x17953: 0xe0000e8f, - 0x17954: 0xe0000eca, 0x17955: 0xe0000ec7, 0x17956: 0xe0000edc, 0x17957: 0xe0000ed9, - 0x17958: 0xe0000ed0, 0x17959: 0xe0000ecd, 0x1795a: 0xe0000f1f, 0x1795b: 0xe0000f1c, - 0x1795c: 0xe0000f2d, 0x1795d: 0xe0000f2a, 0x1795e: 0xe0000f47, 0x1795f: 0xe0000f44, - 0x17960: 0xe0000f33, 0x17961: 0xe0000f30, 0x17962: 0xe0000f99, 0x17963: 0xe0000f96, - 0x17964: 0xe0000f8a, 0x17965: 0xe0000f87, 0x17966: 0x00303688, 0x17967: 0x40303620, - 0x17968: 0xe000102b, 0x17969: 0xe0001028, 0x1796a: 0x00306cc3, 0x1796b: 0x40306c22, - 0x1796c: 0xe0000fe7, 0x1796d: 0xe0000fe4, 0x1796e: 0xe0000ff9, 0x1796f: 0xe0000ff6, - 0x17970: 0xe0001025, 0x17971: 0xe0001022, 0x17972: 0xe0001039, 0x17973: 0xe0001036, - 0x17974: 0xe00010d8, 0x17975: 0xe00010d5, 0x17976: 0xe000110e, 0x17977: 0xe000110b, - 0x17978: 0xe0001117, 0x17979: 0xe000113b, 0x1797a: 0xe0001138, 0x1797b: 0xe000114d, - 0x1797c: 0xe000114a, 0x1797d: 0xe0001147, 0x1797e: 0xe0001144, 0x1797f: 0xe0000f64, - // Block 0x5e6, offset 0x17980 - 0x17980: 0x40321220, 0x17981: 0x40321a20, 0x17982: 0x40322220, 0x17983: 0x40322a20, - 0x17984: 0xe0000ad5, 0x17985: 0xe0000ad1, 0x17986: 0xe0000acd, 0x17987: 0xf0000a0a, - 0x17988: 0xf000040a, 0x17989: 0xf0000404, 0x1798a: 0xf0000a0a, 0x1798b: 0xf000040a, - 0x1798c: 0xf0000404, 0x1798d: 0xe0000947, 0x1798e: 0xe0000944, 0x1798f: 0xe0000c3d, - 0x17990: 0xe0000c3a, 0x17991: 0xe0000dcc, 0x17992: 0xe0000dc9, 0x17993: 0xe0000ff3, - 0x17994: 0xe0000ff0, 0x17995: 0xe000a9d3, 0x17996: 0xe000a9d0, 0x17997: 0xe000ae82, - 0x17998: 0xe000ae7f, 0x17999: 0xe0001016, 0x1799a: 0xe0001012, 0x1799b: 0xe000100e, - 0x1799c: 0xe000100a, 0x1799d: 0x402cae20, 0x1799e: 0xe000ae28, 0x1799f: 0xe000ae25, - 0x179a0: 0xe000ae2e, 0x179a1: 0xe000ae2b, 0x179a2: 0xe00009f4, 0x179a3: 0xe00009ef, - 0x179a4: 0x002d3a88, 0x179a5: 0x402d3a20, 0x179a6: 0xe0000bbe, 0x179a7: 0xe0000bbb, - 0x179a8: 0xe0000c99, 0x179a9: 0xe0000c96, 0x179aa: 0xe0000e20, 0x179ab: 0xe0000e1d, - 0x179ac: 0xe000ae7c, 0x179ad: 0xe000ae79, 0x179ae: 0xe0001162, 0x179af: 0xe000115f, - 0x179b0: 0xe0000c8d, 0x179b1: 0xf0000a0a, 0x179b2: 0xf000040a, 0x179b3: 0xf0000404, - 0x179b4: 0xe0000bac, 0x179b5: 0xe0000ba9, 0x179b6: 0x002d7888, 0x179b7: 0x00319488, - 0x179b8: 0xe0000d57, 0x179b9: 0xe0000d54, 0x179ba: 0xe000ae22, 0x179bb: 0xe000ae1f, - 0x179bc: 0xe00009ea, 0x179bd: 0xe00009e5, 0x179be: 0xe0000e19, 0x179bf: 0xe0000e15, - // Block 0x5e7, offset 0x179c0 - 0x179c0: 0xe000098f, 0x179c1: 0xe000098c, 0x179c2: 0xe0000995, 0x179c3: 0xe0000992, - 0x179c4: 0xe0000b62, 0x179c5: 0xe0000b5f, 0x179c6: 0xe0000b68, 0x179c7: 0xe0000b65, - 0x179c8: 0xe0000c6c, 0x179c9: 0xe0000c69, 0x179ca: 0xe0000c72, 0x179cb: 0xe0000c6f, - 0x179cc: 0xe0000e4a, 0x179cd: 0xe0000e47, 0x179ce: 0xe0000e50, 0x179cf: 0xe0000e4d, - 0x179d0: 0xe0000ee8, 0x179d1: 0xe0000ee5, 0x179d2: 0xe0000eee, 0x179d3: 0xe0000eeb, - 0x179d4: 0xe0001053, 0x179d5: 0xe0001050, 0x179d6: 0xe0001059, 0x179d7: 0xe0001056, - 0x179d8: 0xe0000f61, 0x179d9: 0xe0000f5e, 0x179da: 0xe0000fa5, 0x179db: 0xe0000fa2, - 0x179dc: 0x00312288, 0x179dd: 0x40312220, 0x179de: 0xe0000bf4, 0x179df: 0xe0000bf1, - 0x179e0: 0x002ebc88, 0x179e1: 0x402c8c20, 0x179e2: 0x002f2288, 0x179e3: 0x402f2220, - 0x179e4: 0x00314088, 0x179e5: 0x40314020, 0x179e6: 0xe000096f, 0x179e7: 0xe000096c, - 0x179e8: 0xe0000b32, 0x179e9: 0xe0000b2f, 0x179ea: 0xe000ae6a, 0x179eb: 0xe000ae67, - 0x179ec: 0xe000ae70, 0x179ed: 0xe000ae6d, 0x179ee: 0xe0000e04, 0x179ef: 0xe0000e01, - 0x179f0: 0xe000ae76, 0x179f1: 0xe000ae73, 0x179f2: 0xe0001129, 0x179f3: 0xe0001126, - 0x179f4: 0x402e5e20, 0x179f5: 0x402ed020, 0x179f6: 0x40305a20, 0x179f7: 0x402dd420, - 0x179f8: 0xe0000abf, 0x179f9: 0xe0000ec4, 0x179fa: 0x002be888, 0x179fb: 0x002c4488, - 0x179fc: 0x402c4420, 0x179fd: 0x002e3888, 0x179fe: 0x00303e88, 0x179ff: 0x402ffc20, - // Block 0x5e8, offset 0x17a00 - 0x17a00: 0x402f8220, 0x17a01: 0x402fd820, 0x17a02: 0x402ff420, 0x17a03: 0x40300820, - 0x17a04: 0x402df620, 0x17a05: 0x40301a20, 0x17a06: 0x40302420, 0x17a07: 0x40306420, - 0x17a08: 0x40305220, 0x17a09: 0x40307c20, 0x17a0a: 0x4030b420, 0x17a0b: 0x4030cc20, - 0x17a0c: 0x4030da20, 0x17a0d: 0x4030ee20, 0x17a0e: 0x402e7a20, 0x17a0f: 0x40310820, - 0x17a10: 0x40314820, 0x17a11: 0x40315020, 0x17a12: 0x40316420, 0x17a13: 0x40318020, - 0x17a14: 0x4031cc20, 0x17a15: 0x4031e820, 0x17a16: 0x40320a20, 0x17a17: 0x40323220, - 0x17a18: 0x40323a20, 0x17a19: 0x402c1220, 0x17a1a: 0x402cf820, 0x17a1b: 0x402d4c20, - 0x17a1c: 0x402d7020, 0x17a1d: 0x402de620, 0x17a1e: 0x402e1a20, 0x17a1f: 0x402e2a20, - 0x17a20: 0x402f6220, 0x17a21: 0x4031fa20, 0x17a22: 0x40320220, 0x17a23: 0xe0000aca, - 0x17a24: 0xe0000adc, 0x17a25: 0xe0000ad9, 0x17a26: 0xe0000fcc, 0x17a27: 0xe0000fcf, - 0x17a28: 0xe0000fba, 0x17a29: 0xe0000ba1, 0x17a2a: 0xe0000d11, 0x17a2b: 0xe0000d18, - 0x17a2c: 0x40324220, 0x17a2d: 0x40324a20, 0x17a2e: 0x40309020, 0x17a2f: 0x40309820, - 0x17a30: 0x002d6894, 0x17a31: 0x002d8094, 0x17a32: 0x002dcc94, 0x17a33: 0x002f7a94, - 0x17a34: 0x002f9894, 0x17a35: 0x002fac94, 0x17a36: 0x002fd894, 0x17a37: 0x0030e294, - 0x17a38: 0x00310094, 0x17a39: 0x40064020, 0x17a3a: 0x40064420, 0x17a3b: 0x40312c20, - 0x17a3c: 0x4031de20, 0x17a3d: 0x00312c83, 0x17a3e: 0x4031e220, 0x17a3f: 0x4031f020, - // Block 0x5e9, offset 0x17a40 - 0x17a40: 0xe00009b1, 0x17a41: 0xe00009ae, 0x17a42: 0xe0000a22, 0x17a43: 0xe0000a1f, - 0x17a44: 0xe0000a28, 0x17a45: 0xe0000a25, 0x17a46: 0xe0000a2e, 0x17a47: 0xe0000a2b, - 0x17a48: 0xe0000a5a, 0x17a49: 0xe0000a56, 0x17a4a: 0xe0000a8c, 0x17a4b: 0xe0000a89, - 0x17a4c: 0xe0000a98, 0x17a4d: 0xe0000a95, 0x17a4e: 0xe0000aa4, 0x17a4f: 0xe0000aa1, - 0x17a50: 0xe0000a92, 0x17a51: 0xe0000a8f, 0x17a52: 0xe0000a9e, 0x17a53: 0xe0000a9b, - 0x17a54: 0xe000ae40, 0x17a55: 0xe000ae3d, 0x17a56: 0xe000ae3a, 0x17a57: 0xe000ae37, - 0x17a58: 0xe0000b7c, 0x17a59: 0xe0000b79, 0x17a5a: 0xe0000b82, 0x17a5b: 0xe0000b7f, - 0x17a5c: 0xe0000b39, 0x17a5d: 0xe0000b35, 0x17a5e: 0xe0000b8c, 0x17a5f: 0xe0000b89, - 0x17a60: 0xe0000bd0, 0x17a61: 0xe0000bcd, 0x17a62: 0xe0000c00, 0x17a63: 0xe0000bfd, - 0x17a64: 0xe0000c0c, 0x17a65: 0xe0000c09, 0x17a66: 0xe0000bfa, 0x17a67: 0xe0000bf7, - 0x17a68: 0xe0000c06, 0x17a69: 0xe0000c03, 0x17a6a: 0xe0000c12, 0x17a6b: 0xe0000c0f, - 0x17a6c: 0xe0000c7e, 0x17a6d: 0xe0000c7b, 0x17a6e: 0xe000ae46, 0x17a6f: 0xe000ae43, - 0x17a70: 0xe0000c93, 0x17a71: 0xe0000c90, 0x17a72: 0xe0000cab, 0x17a73: 0xe0000ca8, - 0x17a74: 0xe0000cb1, 0x17a75: 0xe0000cae, 0x17a76: 0xe0000cde, 0x17a77: 0xe0000cdb, - 0x17a78: 0xe0000ce5, 0x17a79: 0xe0000ce1, 0x17a7a: 0xe0000cf2, 0x17a7b: 0xe0000cef, - 0x17a7c: 0xe0000cec, 0x17a7d: 0xe0000ce9, 0x17a7e: 0xe0000d1e, 0x17a7f: 0xe0000d1b, - // Block 0x5ea, offset 0x17a80 - 0x17a80: 0xe0000d24, 0x17a81: 0xe0000d21, 0x17a82: 0xe0000d2a, 0x17a83: 0xe0000d27, - 0x17a84: 0xe0000d69, 0x17a85: 0xe0000d66, 0x17a86: 0xe0000d7b, 0x17a87: 0xe0000d78, - 0x17a88: 0xe0000d87, 0x17a89: 0xe0000d84, 0x17a8a: 0xe0000d81, 0x17a8b: 0xe0000d7e, - 0x17a8c: 0xe000ae52, 0x17a8d: 0xe000ae4f, 0x17a8e: 0xe0000df5, 0x17a8f: 0xe0000df1, - 0x17a90: 0xe000ae64, 0x17a91: 0xe000ae61, 0x17a92: 0xe000ae5e, 0x17a93: 0xe000ae5b, - 0x17a94: 0xe0000ea7, 0x17a95: 0xe0000ea4, 0x17a96: 0xe0000ead, 0x17a97: 0xe0000eaa, - 0x17a98: 0xe0000ed6, 0x17a99: 0xe0000ed3, 0x17a9a: 0xe0000ef4, 0x17a9b: 0xe0000ef1, - 0x17a9c: 0xe0000efb, 0x17a9d: 0xe0000ef7, 0x17a9e: 0xe0000f02, 0x17a9f: 0xe0000eff, - 0x17aa0: 0xe0000f41, 0x17aa1: 0xe0000f3e, 0x17aa2: 0xe0000f53, 0x17aa3: 0xe0000f50, - 0x17aa4: 0xe0000f26, 0x17aa5: 0xe0000f22, 0x17aa6: 0xe0000f3a, 0x17aa7: 0xe0000f36, - 0x17aa8: 0xe0000f5a, 0x17aa9: 0xe0000f56, 0x17aaa: 0xe0000f93, 0x17aab: 0xe0000f90, - 0x17aac: 0xe0000f9f, 0x17aad: 0xe0000f9c, 0x17aae: 0xe0000fb1, 0x17aaf: 0xe0000fae, - 0x17ab0: 0xe0000fab, 0x17ab1: 0xe0000fa8, 0x17ab2: 0xe0001093, 0x17ab3: 0xe0001090, - 0x17ab4: 0xe000109f, 0x17ab5: 0xe000109c, 0x17ab6: 0xe0001099, 0x17ab7: 0xe0001096, - 0x17ab8: 0xe000ae88, 0x17ab9: 0xe000ae85, 0x17aba: 0xe000a9d3, 0x17abb: 0xe000a9d0, - 0x17abc: 0xe00010a9, 0x17abd: 0xe00010a6, 0x17abe: 0xe00010af, 0x17abf: 0xe00010ac, - // Block 0x5eb, offset 0x17ac0 - 0x17ac0: 0xe00010d2, 0x17ac1: 0xe00010cf, 0x17ac2: 0xe00010cc, 0x17ac3: 0xe00010c9, - 0x17ac4: 0xe00010e1, 0x17ac5: 0xe00010de, 0x17ac6: 0xe00010e7, 0x17ac7: 0xe00010e4, - 0x17ac8: 0xe00010ed, 0x17ac9: 0xe00010ea, 0x17aca: 0xe00010fc, 0x17acb: 0xe00010f9, - 0x17acc: 0xe00010f6, 0x17acd: 0xe00010f3, 0x17ace: 0xe0001123, 0x17acf: 0xe0001120, - 0x17ad0: 0xe0001141, 0x17ad1: 0xe000113e, 0x17ad2: 0xe0001153, 0x17ad3: 0xe0001150, - 0x17ad4: 0xe0001159, 0x17ad5: 0xe0001156, 0x17ad6: 0xe0000c15, 0x17ad7: 0xe0000f8d, - 0x17ad8: 0xe00010db, 0x17ad9: 0xe0001111, 0x17ada: 0xf0000404, 0x17adb: 0xe0000f70, - 0x17adc: 0x40300420, 0x17add: 0x40300620, 0x17ade: 0xe0000f7f, 0x17adf: 0x402c9620, - 0x17ae0: 0xe000099b, 0x17ae1: 0xe0000998, 0x17ae2: 0xe0000989, 0x17ae3: 0xe0000986, - 0x17ae4: 0xe000ae1c, 0x17ae5: 0xe000ae19, 0x17ae6: 0xe0000930, 0x17ae7: 0xe000092c, - 0x17ae8: 0xe0000940, 0x17ae9: 0xe000093c, 0x17aea: 0xe0000938, 0x17aeb: 0xe0000934, - 0x17aec: 0xe00009aa, 0x17aed: 0xe00009a6, 0x17aee: 0xe000ae16, 0x17aef: 0xe000ae13, - 0x17af0: 0xe000090a, 0x17af1: 0xe0000906, 0x17af2: 0xe000091a, 0x17af3: 0xe0000916, - 0x17af4: 0xe0000912, 0x17af5: 0xe000090e, 0x17af6: 0xe00009a2, 0x17af7: 0xe000099e, - 0x17af8: 0xe0000b6e, 0x17af9: 0xe0000b6b, 0x17afa: 0xe0000b5c, 0x17afb: 0xe0000b59, - 0x17afc: 0xe0000b26, 0x17afd: 0xe0000b23, 0x17afe: 0xe000ae34, 0x17aff: 0xe000ae31, - // Block 0x5ec, offset 0x17b00 - 0x17b00: 0xe0000b03, 0x17b01: 0xe0000aff, 0x17b02: 0xe0000b13, 0x17b03: 0xe0000b0f, - 0x17b04: 0xe0000b0b, 0x17b05: 0xe0000b07, 0x17b06: 0xe0000b75, 0x17b07: 0xe0000b71, - 0x17b08: 0xe0000c66, 0x17b09: 0xe0000c63, 0x17b0a: 0xe0000c78, 0x17b0b: 0xe0000c75, - 0x17b0c: 0xe0000e84, 0x17b0d: 0xe0000e81, 0x17b0e: 0xe0000e44, 0x17b0f: 0xe0000e41, - 0x17b10: 0xe000ae4c, 0x17b11: 0xe000ae49, 0x17b12: 0xe0000db5, 0x17b13: 0xe0000db1, - 0x17b14: 0xe0000dc5, 0x17b15: 0xe0000dc1, 0x17b16: 0xe0000dbd, 0x17b17: 0xe0000db9, - 0x17b18: 0xe0000e8b, 0x17b19: 0xe0000e87, 0x17b1a: 0xe000ae58, 0x17b1b: 0xe000ae55, - 0x17b1c: 0xe0000e65, 0x17b1d: 0xe0000e61, 0x17b1e: 0xe0000e75, 0x17b1f: 0xe0000e71, - 0x17b20: 0xe0000e6d, 0x17b21: 0xe0000e69, 0x17b22: 0xe0000e7d, 0x17b23: 0xe0000e79, - 0x17b24: 0xe000108d, 0x17b25: 0xe000108a, 0x17b26: 0xe000104d, 0x17b27: 0xe000104a, - 0x17b28: 0xe000ae8e, 0x17b29: 0xe000ae8b, 0x17b2a: 0xe000106e, 0x17b2b: 0xe000106a, - 0x17b2c: 0xe000107e, 0x17b2d: 0xe000107a, 0x17b2e: 0xe0001076, 0x17b2f: 0xe0001072, - 0x17b30: 0xe0001086, 0x17b31: 0xe0001082, 0x17b32: 0xe0001108, 0x17b33: 0xe0001105, - 0x17b34: 0xe0001135, 0x17b35: 0xe0001132, 0x17b36: 0xe000112f, 0x17b37: 0xe000112c, - 0x17b38: 0xe000111d, 0x17b39: 0xe000111a, 0x17b3a: 0xe0000d0a, 0x17b3b: 0xe0000d07, - 0x17b3c: 0x0030d888, 0x17b3d: 0x4030d820, 0x17b3e: 0x00312088, 0x17b3f: 0x40312020, - // Block 0x5ed, offset 0x17b40 - 0x17b40: 0xa0000000, 0x17b41: 0xa0000000, 0x17b42: 0xa0000000, 0x17b43: 0xa0000000, - 0x17b44: 0xa0000000, 0x17b45: 0xa0000000, 0x17b46: 0xa0000000, 0x17b47: 0xa0000000, - 0x17b48: 0xa0000000, 0x17b49: 0x40020020, 0x17b4a: 0x40020220, 0x17b4b: 0x40020420, - 0x17b4c: 0x40020620, 0x17b4d: 0x40020820, 0x17b4e: 0xa0000000, 0x17b4f: 0xa0000000, - 0x17b50: 0xa0000000, 0x17b51: 0xa0000000, 0x17b52: 0xa0000000, 0x17b53: 0xa0000000, - 0x17b54: 0xa0000000, 0x17b55: 0xa0000000, 0x17b56: 0xa0000000, 0x17b57: 0xa0000000, - 0x17b58: 0xa0000000, 0x17b59: 0xa0000000, 0x17b5a: 0xa0000000, 0x17b5b: 0xa0000000, - 0x17b5c: 0xa0000000, 0x17b5d: 0xa0000000, 0x17b5e: 0xa0000000, 0x17b5f: 0xa0000000, - 0x17b60: 0x40021220, 0x17b61: 0x4002ba20, 0x17b62: 0x4003e020, 0x17b63: 0x4004ea20, - 0x17b64: 0x4027de20, 0x17b65: 0x4004ec20, 0x17b66: 0x4004e620, 0x17b67: 0x4003d220, - 0x17b68: 0x4003f420, 0x17b69: 0x4003f620, 0x17b6a: 0x4004d820, 0x17b6b: 0x40093820, - 0x17b6c: 0x40024020, 0x17b6d: 0x40021a20, 0x17b6e: 0x4002e420, 0x17b6f: 0x4004e220, - 0x17b70: 0x4029cc20, 0x17b71: 0x4029ce20, 0x17b72: 0x4029d020, 0x17b73: 0x4029d220, - 0x17b74: 0x4029d420, 0x17b75: 0x4029d620, 0x17b76: 0x4029d820, 0x17b77: 0x4029da20, - 0x17b78: 0x4029dc20, 0x17b79: 0x4029de20, 0x17b7a: 0x40026c20, 0x17b7b: 0x40026220, - 0x17b7c: 0x40094020, 0x17b7d: 0x40094220, 0x17b7e: 0x40094420, 0x17b7f: 0x4002c420, - // Block 0x5ee, offset 0x17b80 - 0x17b80: 0x4004d620, 0x17b81: 0x002bde88, 0x17b82: 0x002c0a88, 0x17b83: 0xc3350911, - 0x17b84: 0x002c6288, 0x17b85: 0x002c9888, 0x17b86: 0x002d0888, 0x17b87: 0xc33900d1, - 0x17b88: 0x002d6888, 0x17b89: 0xc33b0931, 0x17b8a: 0x002dcc88, 0x17b8b: 0x002dfe88, - 0x17b8c: 0xc0030002, 0x17b8d: 0x002e8288, 0x17b8e: 0x002e9e88, 0x17b8f: 0xc33f0071, - 0x17b90: 0x002f2c88, 0x17b91: 0x002f5688, 0x17b92: 0x002f7a88, 0x17b93: 0xc3430911, - 0x17b94: 0x00302c88, 0x17b95: 0xc3470071, 0x17b96: 0x0030be88, 0x17b97: 0x0030e288, - 0x17b98: 0x0030f688, 0x17b99: 0x00310088, 0x17b9a: 0x00312a88, 0x17b9b: 0x4003f820, - 0x17b9c: 0x4004e420, 0x17b9d: 0x4003fa20, 0x17b9e: 0x40062420, 0x17b9f: 0x40021620, - 0x17ba0: 0x40061e20, 0x17ba1: 0x402bde20, 0x17ba2: 0x402c0a20, 0x17ba3: 0xc3330911, - 0x17ba4: 0x402c6220, 0x17ba5: 0x402c9820, 0x17ba6: 0x402d0820, 0x17ba7: 0xc33700d1, - 0x17ba8: 0x402d6820, 0x17ba9: 0x402d9a20, 0x17baa: 0x402dcc20, 0x17bab: 0x402dfe20, - 0x17bac: 0xc0000002, 0x17bad: 0x402e8220, 0x17bae: 0x402e9e20, 0x17baf: 0xc33d0071, - 0x17bb0: 0x402f2c20, 0x17bb1: 0x402f5620, 0x17bb2: 0x402f7a20, 0x17bb3: 0xc3410911, - 0x17bb4: 0x40302c20, 0x17bb5: 0xc3450071, 0x17bb6: 0x4030be20, 0x17bb7: 0x4030e220, - 0x17bb8: 0x4030f620, 0x17bb9: 0x40310020, 0x17bba: 0x40312a20, 0x17bbb: 0x4003fc20, - 0x17bbc: 0x40094820, 0x17bbd: 0x4003fe20, 0x17bbe: 0x40094c20, 0x17bbf: 0xa0000000, - // Block 0x5ef, offset 0x17bc0 - 0x17bc0: 0x00093685, 0x17bc1: 0x40083620, 0x17bc2: 0x40083820, 0x17bc3: 0x40083a20, - 0x17bc4: 0x40083c20, 0x17bc5: 0x002c628b, 0x17bc6: 0x002c6285, 0x17bc7: 0x002c9885, - 0x17bc8: 0x002d9a85, 0x17bc9: 0x002dcc85, 0x17bca: 0x40083e20, 0x17bcb: 0x400a6e20, - 0x17bcc: 0x40084020, 0x17bcd: 0xe00009c4, 0x17bce: 0x402d1e20, 0x17bcf: 0x40084220, - 0x17bd0: 0xe00002cb, 0x17bd1: 0xe00002d3, 0x17bd2: 0xe00002b2, 0x17bd3: 0xe00002bb, - 0x17bd4: 0xe00003cd, 0x17bd5: 0xe00002c3, 0x17bd6: 0xe00003d1, 0x17bd7: 0xe00004ab, - 0x17bd8: 0xe0000579, 0x17bd9: 0xe00002c7, 0x17bda: 0xe0000640, 0x17bdb: 0xe00002cf, - 0x17bdc: 0xe00004af, 0x17bdd: 0xe0000644, 0x17bde: 0xe0000798, 0x17bdf: 0xf0001e1e, - 0x17be0: 0x002d9a8a, 0x17be1: 0xe00027d4, 0x17be2: 0xe00027db, 0x17be3: 0xe00027ee, - 0x17be4: 0x0030be8a, 0x17be5: 0xe0002848, 0x17be6: 0xe000284f, 0x17be7: 0xe00010bb, - 0x17be8: 0xe00027f4, 0x17be9: 0x0030f68a, 0x17bea: 0xe0002883, 0x17beb: 0xe000288a, - 0x17bec: 0x002e228a, 0x17bed: 0x002c3a8a, 0x17bee: 0x002c628a, 0x17bef: 0x002e828a, - 0x17bf0: 0x002d9a84, 0x17bf1: 0xf0001f04, 0x17bf2: 0xf0000404, 0x17bf3: 0xf0001f04, - 0x17bf4: 0x0030be84, 0x17bf5: 0xf0001f04, 0x17bf6: 0xf0000404, 0x17bf7: 0xe00010b6, - 0x17bf8: 0xf0001f04, 0x17bf9: 0x0030f684, 0x17bfa: 0xf0001f04, 0x17bfb: 0xf0000404, - 0x17bfc: 0x002e2284, 0x17bfd: 0x002c3a84, 0x17bfe: 0x002c6284, 0x17bff: 0x002e8284, - // Block 0x5f0, offset 0x17c00 - 0x17c00: 0xf0001f04, 0x17c01: 0xf0001f04, 0x17c02: 0xf0001f04, 0x17c03: 0xf0001f04, - 0x17c04: 0xf0001f04, 0x17c05: 0xf0001f04, 0x17c06: 0xf0001f04, 0x17c07: 0xf0001f04, - 0x17c08: 0xf0001f04, 0x17c09: 0xf0001f04, 0x17c0a: 0xf0001f04, - 0x17c10: 0xf0000a04, 0x17c11: 0xf0000a04, 0x17c12: 0xf0000a04, 0x17c13: 0xf0000a04, - 0x17c14: 0xf0000a04, 0x17c15: 0xf0000a04, 0x17c16: 0xf0000a04, 0x17c17: 0xf0000a04, - 0x17c18: 0xe00024b3, 0x17c19: 0xf0000a04, 0x17c1a: 0xf0000a04, 0x17c1b: 0xf0000a04, - 0x17c1c: 0xf0000a04, 0x17c1d: 0xf0000a04, 0x17c1e: 0xf0000a04, 0x17c1f: 0xf0000a04, - 0x17c20: 0xf0000a04, 0x17c21: 0xf0000a04, 0x17c22: 0xf0000a04, 0x17c23: 0xf0000a04, - 0x17c24: 0xf0000a04, 0x17c25: 0xf0000a04, 0x17c26: 0xf0000a04, 0x17c27: 0xf0000a04, - 0x17c28: 0xf0000a04, 0x17c29: 0xf0000a04, 0x17c2a: 0xf0000a04, 0x17c2b: 0x002c3a8c, - 0x17c2c: 0x002f7a8c, 0x17c2d: 0xf0000c0c, 0x17c2e: 0xf0000c0c, - 0x17c30: 0x002bde9d, 0x17c31: 0x002c0a9d, 0x17c32: 0x002c3a9d, 0x17c33: 0x002c629d, - 0x17c34: 0x002c989d, 0x17c35: 0x002d089d, 0x17c36: 0x002d229d, 0x17c37: 0x002d689d, - 0x17c38: 0x002d9a9d, 0x17c39: 0x002dcc9d, 0x17c3a: 0x002dfe9d, 0x17c3b: 0x002e229d, - 0x17c3c: 0x002e829d, 0x17c3d: 0x002e9e9d, 0x17c3e: 0x002ee29d, 0x17c3f: 0x002f2c9d, - // Block 0x5f1, offset 0x17c40 - 0x17c40: 0x00352088, 0x17c41: 0x40352020, 0x17c42: 0x40070620, 0x17c43: 0xae608302, - 0x17c44: 0xae605f02, 0x17c45: 0xae602a02, 0x17c46: 0xae602202, 0x17c47: 0xae605f02, - 0x17c48: 0xa0000000, 0x17c49: 0xa0000000, 0x17c4a: 0x00341c88, 0x17c4b: 0x40341c20, - 0x17c4c: 0x00369688, 0x17c4d: 0x40369620, 0x17c4e: 0x00353088, 0x17c4f: 0x40353020, - 0x17c50: 0x00336483, 0x17c51: 0x40336420, 0x17c52: 0x00336a88, 0x17c53: 0x40336a20, - 0x17c54: 0x00337a88, 0x17c55: 0x40337a20, 0x17c56: 0x0033dc88, 0x17c57: 0x4033dc20, - 0x17c58: 0x0033aa88, 0x17c59: 0x4033aa20, 0x17c5a: 0x00345888, 0x17c5b: 0x40345820, - 0x17c5c: 0x00347888, 0x17c5d: 0x40347820, 0x17c5e: 0x00347088, 0x17c5f: 0x40347020, - 0x17c60: 0x00346888, 0x17c61: 0x40346820, 0x17c62: 0x0034ca88, 0x17c63: 0x4034ca20, - 0x17c64: 0x0034dc88, 0x17c65: 0x4034dc20, 0x17c66: 0x00351888, 0x17c67: 0x40351820, - 0x17c68: 0x00372688, 0x17c69: 0x40372620, 0x17c6a: 0x00354488, 0x17c6b: 0x40354420, - 0x17c6c: 0x00355888, 0x17c6d: 0x40355820, 0x17c6e: 0x00359288, 0x17c6f: 0x40359220, - 0x17c70: 0x00359a88, 0x17c71: 0x40359a20, 0x17c72: 0x0035cc88, 0x17c73: 0x4035cc20, - 0x17c74: 0x00360e88, 0x17c75: 0x40360e20, 0x17c76: 0x00362a88, 0x17c77: 0x40362a20, - 0x17c78: 0x00363a88, 0x17c79: 0x40363a20, 0x17c7a: 0x0035d488, 0x17c7b: 0x4035d420, - 0x17c7c: 0x00364488, 0x17c7d: 0x40364420, 0x17c7e: 0x00364c88, 0x17c7f: 0x40364c20, - // Block 0x5f2, offset 0x17c80 - 0x17c80: 0xa0000000, 0x17c81: 0xa0000000, 0x17c82: 0xa0000000, 0x17c83: 0xa0000000, - 0x17c84: 0xa0000000, 0x17c86: 0x40096620, 0x17c87: 0x40096a20, - 0x17c88: 0x40070820, 0x17c89: 0x4004f220, 0x17c8a: 0x4004f620, 0x17c8b: 0x4027e620, - 0x17c8c: 0x40024820, 0x17c8d: 0x40024a20, 0x17c8e: 0x40070e20, 0x17c8f: 0x40071020, - 0x17c90: 0xa0000001, 0x17c91: 0xa0000002, 0x17c92: 0xa0000004, 0x17c93: 0xa0000003, - 0x17c94: 0xa0000005, 0x17c95: 0xae600000, 0x17c96: 0xae600000, 0x17c97: 0xae600000, - 0x17c98: 0xa1e00000, 0x17c99: 0xa1f00000, 0x17c9a: 0xa2000000, 0x17c9b: 0x40026420, - 0x17c9e: 0x40027020, 0x17c9f: 0x4002cc20, - 0x17ca0: 0x403aa220, 0x17ca1: 0x4039a620, 0x17ca2: 0x40393a20, 0x17ca3: 0x40393821, - 0x17ca4: 0x40399c21, 0x17ca5: 0x40392820, 0x17ca6: 0x4039a821, 0x17ca7: 0xcf6e0151, - 0x17ca8: 0xcf729a11, 0x17ca9: 0x40395420, 0x17caa: 0xcf769a11, 0x17cab: 0x40394c20, - 0x17cac: 0xcf7a9a11, 0x17cad: 0x40395620, 0x17cae: 0x40395820, 0x17caf: 0xcf7e9a11, - 0x17cb0: 0x40396220, 0x17cb1: 0xcf829a11, 0x17cb2: 0x40396c20, 0x17cb3: 0x40397020, - 0x17cb4: 0x40397220, 0x17cb5: 0x40397420, 0x17cb6: 0x40397620, 0x17cb7: 0x40397820, - 0x17cb8: 0x40397a20, 0x17cb9: 0x40397c20, 0x17cba: 0x40397e20, 0x17cbb: 0x403a3820, - 0x17cbc: 0x403a3a20, 0x17cbd: 0x403a9c20, 0x17cbe: 0x403a9e20, 0x17cbf: 0x403aa020, - // Block 0x5f3, offset 0x17cc0 - 0x17cc0: 0xa0000000, 0x17cc1: 0x40398020, 0x17cc2: 0x40398220, 0x17cc3: 0x403a1a20, - 0x17cc4: 0xcf8a9a11, 0x17cc5: 0xcf8c9a11, 0x17cc6: 0xcf8e9a11, 0x17cc7: 0x403a6820, - 0x17cc8: 0xcf929a32, 0x17cc9: 0x403a8e20, 0x17cca: 0xcf970171, 0x17ccb: 0xa000c302, - 0x17ccc: 0xa000c502, 0x17ccd: 0xa000c402, 0x17cce: 0xa000bd02, 0x17ccf: 0xa000bf02, - 0x17cd0: 0xa000be02, 0x17cd1: 0xa000c702, 0x17cd2: 0xa220bc02, 0x17cd3: 0xa000c902, - 0x17cd4: 0xa000c602, 0x17cd5: 0xadc0bf02, 0x17cd6: 0xa000c102, 0x17cd7: 0xa000c202, - 0x17cd8: 0xa000c802, 0x17cd9: 0xae60c402, 0x17cda: 0xae60c502, 0x17cdb: 0xae60c602, - 0x17cdc: 0xadc0c702, 0x17cdd: 0xae60c802, 0x17cde: 0xae60c902, 0x17cdf: 0xadc0c002, - 0x17ce0: 0xe000015e, 0x17ce1: 0xe00001e6, 0x17ce2: 0xe0000301, 0x17ce3: 0xe00003db, - 0x17ce4: 0xe00004b6, 0x17ce5: 0xe0000580, 0x17ce6: 0xe000064b, 0x17ce7: 0xe00006f3, - 0x17ce8: 0xe000079f, 0x17ce9: 0xe0000844, 0x17cea: 0x4004ee20, 0x17ceb: 0x40024c20, - 0x17cec: 0x40024e20, 0x17ced: 0x4004de20, 0x17cee: 0x40393a20, 0x17cef: 0x403a1020, - 0x17cf0: 0xa000c002, 0x17cf1: 0x40392420, 0x17cf2: 0x40392220, 0x17cf3: 0x40392a20, - 0x17cf4: 0x00391c84, 0x17cf5: 0xf0000404, 0x17cf6: 0xe000b07a, 0x17cf7: 0xf0000404, - 0x17cf8: 0xf0000404, 0x17cf9: 0xcf789a11, 0x17cfa: 0x40395c20, 0x17cfb: 0x40393e20, - 0x17cfc: 0x40395e20, 0x17cfd: 0x40396020, 0x17cfe: 0xcf749a11, 0x17cff: 0x40396220, - // Block 0x5f4, offset 0x17d00 - 0x17d00: 0x40394220, 0x17d01: 0x40397620, 0x17d02: 0x40397820, 0x17d03: 0x40396620, - 0x17d04: 0x40396820, 0x17d05: 0x40397a20, 0x17d06: 0xcf7c9a11, 0x17d07: 0x40396e20, - 0x17d08: 0xcf809a11, 0x17d09: 0x40398e20, 0x17d0a: 0x40399020, 0x17d0b: 0x40399220, - 0x17d0c: 0x40399420, 0x17d0d: 0x40399620, 0x17d0e: 0x40399820, 0x17d0f: 0x40399a20, - 0x17d10: 0x40399c20, 0x17d11: 0xcf849a11, 0x17d12: 0x4039aa20, 0x17d13: 0x4039ac20, - 0x17d14: 0x4039ae20, 0x17d15: 0x4039b020, 0x17d16: 0x4039b220, 0x17d17: 0x4039b420, - 0x17d18: 0x40396e20, 0x17d19: 0x4039b820, 0x17d1a: 0x4039ca20, 0x17d1b: 0x4039cc20, - 0x17d1c: 0x4039ce20, 0x17d1d: 0x4039e020, 0x17d1e: 0x4039e220, 0x17d1f: 0x4039ea20, - 0x17d20: 0x4039f220, 0x17d21: 0x4039fe20, 0x17d22: 0x403a0020, 0x17d23: 0x403a0220, - 0x17d24: 0x403a0420, 0x17d25: 0x403a0820, 0x17d26: 0x403a0a20, 0x17d27: 0x403a1420, - 0x17d28: 0x403a1620, 0x17d29: 0xcf869a11, 0x17d2a: 0x403a1e20, 0x17d2b: 0x403a2020, - 0x17d2c: 0x403a2220, 0x17d2d: 0x403a2620, 0x17d2e: 0x403a2820, 0x17d2f: 0xcf889a11, - 0x17d30: 0x403a2c20, 0x17d31: 0x403a2e20, 0x17d32: 0x403a3020, 0x17d33: 0x403a3220, - 0x17d34: 0x403a3420, 0x17d35: 0x403a4220, 0x17d36: 0x403a4420, 0x17d37: 0x403a4620, - 0x17d38: 0x403a4820, 0x17d39: 0x403a6020, 0x17d3a: 0xcf909a11, 0x17d3b: 0x403a5a20, - 0x17d3c: 0x403a5c20, 0x17d3d: 0x403a5e20, 0x17d3e: 0x4039a220, 0x17d3f: 0x40396c20, - // Block 0x5f5, offset 0x17d40 - 0x17d40: 0xe000b077, 0x17d41: 0xcf950171, 0x17d42: 0x4039a021, 0x17d43: 0x4039a420, - 0x17d44: 0x403a7620, 0x17d45: 0x403a7820, 0x17d46: 0x403a7a20, 0x17d47: 0x403a7c20, - 0x17d48: 0x403a7e20, 0x17d49: 0x403a8020, 0x17d4a: 0x403a8220, 0x17d4b: 0x403a8420, - 0x17d4c: 0xcf999a11, 0x17d4d: 0x403a9420, 0x17d4e: 0x403a9620, 0x17d4f: 0x403a8620, - 0x17d50: 0x403a9820, 0x17d51: 0x403a9a20, 0x17d52: 0xcf9b0171, 0x17d53: 0x4039ac21, - 0x17d54: 0x4002e820, 0x17d55: 0x403a7220, 0x17d56: 0xae600000, 0x17d57: 0xae600000, - 0x17d58: 0xae600000, 0x17d59: 0xae600000, 0x17d5a: 0xae600000, 0x17d5b: 0xae600000, - 0x17d5c: 0xae600000, 0x17d5d: 0xa0000000, 0x17d5e: 0x40071220, 0x17d5f: 0xae600000, - 0x17d60: 0xae600000, 0x17d61: 0xae600000, 0x17d62: 0xae600000, 0x17d63: 0xadc00000, - 0x17d64: 0xae600000, 0x17d65: 0x003a7484, 0x17d66: 0x003a9084, 0x17d67: 0xae600000, - 0x17d68: 0xae600000, 0x17d69: 0x40071420, 0x17d6a: 0xadc00000, 0x17d6b: 0xae600000, - 0x17d6c: 0xae600000, 0x17d6d: 0xadc00000, 0x17d6e: 0x40399e20, 0x17d6f: 0x4039ba20, - 0x17d70: 0xe0000161, 0x17d71: 0xe00001e9, 0x17d72: 0xe0000304, 0x17d73: 0xe00003de, - 0x17d74: 0xe00004b9, 0x17d75: 0xe0000583, 0x17d76: 0xe000064e, 0x17d77: 0xe00006f6, - 0x17d78: 0xe00007a2, 0x17d79: 0xe0000847, 0x17d7a: 0x4039d020, 0x17d7b: 0x4039e420, - 0x17d7c: 0x4039f420, 0x17d7d: 0xe0001553, 0x17d7e: 0xe0001779, 0x17d7f: 0x403a7020, - // Block 0x5f6, offset 0x17d80 - 0x17d80: 0xe000155f, 0x17d81: 0xe0001565, 0x17d82: 0xe000157a, 0x17d83: 0xe00015b0, - 0x17d84: 0xe00015b6, 0x17d85: 0xe000ae97, 0x17d86: 0xe000ae9d, 0x17d87: 0xe000aea3, - 0x17d88: 0xe000aeb5, 0x17d89: 0xf0001a1a, 0x17d8a: 0xf0001a1a, 0x17d8b: 0xe000aebe, - 0x17d8c: 0xe000aec4, 0x17d8d: 0xe000aeca, 0x17d8e: 0xe000aedc, 0x17d8f: 0xe000289a, - 0x17d90: 0xe00036b1, 0x17d91: 0xe000aee2, 0x17d92: 0xe000aef4, 0x17d93: 0xe00028a0, - 0x17d94: 0xe00036ba, 0x17d95: 0xe000aefd, 0x17d96: 0xe000af03, 0x17d97: 0xe000af09, - 0x17d98: 0xe000af0f, 0x17d99: 0xe000af15, 0x17d9a: 0xe000af18, 0x17d9b: 0xe000af1e, - 0x17d9c: 0xe000af2d, 0x17d9d: 0xe000af36, 0x17d9e: 0xe000af3f, 0x17d9f: 0xe000af4e, - 0x17da0: 0xe000af8a, 0x17da1: 0xe000af99, 0x17da2: 0xe000af9f, 0x17da3: 0xe000afa5, - 0x17da4: 0xe000afab, 0x17da5: 0xe000afb7, 0x17da6: 0xe000afbd, 0x17da7: 0xe000afc6, - 0x17da8: 0xe000afcf, 0x17da9: 0xe000afd5, 0x17daa: 0xe000afdb, 0x17dab: 0xe000afe1, - 0x17dac: 0xe000afe7, 0x17dad: 0xe000afed, 0x17dae: 0xe000aff3, 0x17daf: 0xe000aff9, - 0x17db0: 0xe000afff, 0x17db1: 0xe00028e2, 0x17db2: 0xe0003708, 0x17db3: 0xe000b005, - 0x17db4: 0xe000b00b, 0x17db5: 0xe00028e8, 0x17db6: 0xe000370e, 0x17db7: 0xf0001a1a, - 0x17db8: 0xe000371a, 0x17db9: 0xe0003720, 0x17dba: 0xe0003726, 0x17dbb: 0xe0003732, - 0x17dbc: 0xe000373e, 0x17dbd: 0xf0001a1a, 0x17dbe: 0xf0001a1a, 0x17dbf: 0xe000b017, - // Block 0x5f7, offset 0x17dc0 - 0x17dc0: 0xe000b01d, 0x17dc1: 0xe000b023, 0x17dc2: 0xe000b02f, 0x17dc3: 0xe00028f4, - 0x17dc4: 0xe000374d, 0x17dc5: 0xe000b038, 0x17dc6: 0xe000b03e, 0x17dc7: 0xe000b044, - 0x17dc8: 0xe000b04d, 0x17dc9: 0xe00028f7, 0x17dca: 0xe0003750, 0x17dcb: 0xe000b053, - 0x17dcc: 0xe000b059, 0x17dcd: 0xe000b05f, 0x17dce: 0xe000b071, 0x17dcf: 0xe00028fd, - 0x17dd0: 0xe000375c, 0x17dd1: 0xe0003765, 0x17dd2: 0xe000376b, 0x17dd3: 0xf0001a1a, - 0x17dd4: 0xf0001a1a, 0x17dd5: 0xe0003786, 0x17dd6: 0xe000378c, 0x17dd7: 0xe0003792, - 0x17dd8: 0xe00037a4, 0x17dd9: 0xf0001a1a, 0x17dda: 0xf0001a1a, 0x17ddb: 0xe000af21, - 0x17ddc: 0xe000af24, 0x17ddd: 0xe000377d, 0x17dde: 0xe0000003, 0x17ddf: 0xe0000006, - 0x17de0: 0xe0000009, 0x17de1: 0xe000000c, 0x17de2: 0xe000000f, 0x17de3: 0xe0000012, - 0x17de4: 0xe000156b, 0x17de5: 0xe000156e, 0x17de6: 0xe0001577, 0x17de7: 0xe000157d, - 0x17de8: 0xe00015aa, 0x17de9: 0xe00015b3, 0x17dea: 0xe000aea6, 0x17deb: 0xe000aea9, - 0x17dec: 0xe000aeb2, 0x17ded: 0xe000aeb8, 0x17dee: 0xf0001919, 0x17def: 0xf0001919, - 0x17df0: 0xe000aecd, 0x17df1: 0xe000aed0, 0x17df2: 0xe000aed9, 0x17df3: 0xe000aedf, - 0x17df4: 0xe0002897, 0x17df5: 0xe00036ae, 0x17df6: 0xe000aee5, 0x17df7: 0xe000aee8, - 0x17df8: 0xe000aef1, 0x17df9: 0xe000aef7, 0x17dfa: 0xe000289d, 0x17dfb: 0xe00036b7, - 0x17dfc: 0xe00028df, 0x17dfd: 0xe0003705, 0x17dfe: 0xe00028e5, 0x17dff: 0xe000370b, - // Block 0x5f8, offset 0x17e00 - 0x17e00: 0xf0001919, 0x17e01: 0xe000372f, 0x17e02: 0xe000373b, 0x17e03: 0xf0001919, - 0x17e04: 0xf0001919, 0x17e05: 0xe000b02c, 0x17e06: 0xe00028f1, 0x17e07: 0xe000374a, - 0x17e08: 0xe000b032, 0x17e09: 0xe000b04a, 0x17e0a: 0xe000b062, 0x17e0b: 0xe000b065, - 0x17e0c: 0xe000b06e, 0x17e0d: 0xe000b074, 0x17e0e: 0xe00028fa, 0x17e0f: 0xe0003759, - 0x17e10: 0xe000377a, 0x17e11: 0xe0003795, 0x17e12: 0xe0003798, 0x17e13: 0xe00037a1, - 0x17e14: 0xe00037a7, 0x17e15: 0xf0001919, 0x17e16: 0xf0001919, 0x17e17: 0xe000155c, - 0x17e18: 0xe0001562, 0x17e19: 0xe0001568, 0x17e1a: 0xe0001571, 0x17e1b: 0xe0001580, - 0x17e1c: 0xe000ae94, 0x17e1d: 0xe000ae9a, 0x17e1e: 0xe000aea0, 0x17e1f: 0xe000aeac, - 0x17e20: 0xf0001717, 0x17e21: 0xe000aebb, 0x17e22: 0xe000aec1, 0x17e23: 0xe000aec7, - 0x17e24: 0xe000aed3, 0x17e25: 0xe00036a8, 0x17e26: 0xe000aeeb, 0x17e27: 0xe000aefa, - 0x17e28: 0xe000af00, 0x17e29: 0xe000af06, 0x17e2a: 0xe000af0c, 0x17e2b: 0xe000af12, - 0x17e2c: 0xe000af1b, 0x17e2d: 0xe000af27, 0x17e2e: 0xe000af30, 0x17e2f: 0xe000af39, - 0x17e30: 0xe000af48, 0x17e31: 0xe000af87, 0x17e32: 0xe000af8d, 0x17e33: 0xe000af96, - 0x17e34: 0xe000af9c, 0x17e35: 0xe000afa2, 0x17e36: 0xe000afa8, 0x17e37: 0xe000afb4, - 0x17e38: 0xe000afba, 0x17e39: 0xe000afc9, 0x17e3a: 0xe000afd2, 0x17e3b: 0xe000afd8, - 0x17e3c: 0xe000afde, 0x17e3d: 0xe000afe4, 0x17e3e: 0xe000afea, 0x17e3f: 0xe000aff0, - // Block 0x5f9, offset 0x17e40 - 0x17e40: 0xe000aff6, 0x17e41: 0xe000affc, 0x17e42: 0xe000b002, 0x17e43: 0xe000b008, - 0x17e44: 0xe0003717, 0x17e45: 0xe000371d, 0x17e46: 0xe0003723, 0x17e47: 0xe0003729, - 0x17e48: 0xe0003735, 0x17e49: 0xe000b014, 0x17e4a: 0xe000b01a, 0x17e4b: 0xe000b020, - 0x17e4c: 0xe000b026, 0x17e4d: 0xe0003747, 0x17e4e: 0xe000b035, 0x17e4f: 0xe000b03b, - 0x17e50: 0xe000b041, 0x17e51: 0xe000b047, 0x17e52: 0xe000b050, 0x17e53: 0xe000b056, - 0x17e54: 0xe000b05c, 0x17e55: 0xe000b068, 0x17e56: 0xe0003753, 0x17e57: 0xe0003762, - 0x17e58: 0xe0003768, 0x17e59: 0xe000375f, 0x17e5a: 0xe0003783, 0x17e5b: 0xe0003789, - 0x17e5c: 0xe000378f, 0x17e5d: 0xe000379b, 0x17e5e: 0xf0001717, 0x17e5f: 0xe0001574, - 0x17e60: 0xe0001583, 0x17e61: 0xe000aeaf, 0x17e62: 0xf0001818, 0x17e63: 0xe000aed6, - 0x17e64: 0xe00036ab, 0x17e65: 0xe000aeee, 0x17e66: 0xe00036b4, 0x17e67: 0xe000af4b, - 0x17e68: 0xe00036d2, 0x17e69: 0xe000af7e, 0x17e6a: 0xe00036de, 0x17e6b: 0xe000372c, - 0x17e6c: 0xe0003738, 0x17e6d: 0xe000b029, 0x17e6e: 0xe000b06b, 0x17e6f: 0xe0003756, - 0x17e70: 0xe000379e, 0x17e71: 0xf0001818, 0x17e72: 0xe000ae91, 0x17e73: 0xe0003690, - 0x17e74: 0xe0003693, 0x17e75: 0xe00028d0, 0x17e76: 0xe00036f6, 0x17e77: 0xe00028d6, - 0x17e78: 0xe00036fc, 0x17e79: 0xe00028dc, 0x17e7a: 0xe0003702, 0x17e7b: 0xe00028b8, - 0x17e7c: 0xe00036d8, 0x17e7d: 0xe00028be, 0x17e7e: 0xe00036e4, 0x17e7f: 0xe00028ac, - // Block 0x5fa, offset 0x17e80 - 0x17e80: 0xe00036c6, 0x17e81: 0xe00028a6, 0x17e82: 0xe00036c0, 0x17e83: 0xe00028b2, - 0x17e84: 0xe00036cc, 0x17e85: 0xe00028c4, 0x17e86: 0xe00036ea, 0x17e87: 0xe00028ca, - 0x17e88: 0xe00036f0, 0x17e89: 0xe000af5a, 0x17e8a: 0xe000af66, 0x17e8b: 0xe000af72, - 0x17e8c: 0xe000af84, 0x17e8d: 0xe000af78, 0x17e8e: 0xe000af45, 0x17e8f: 0xe000af93, - 0x17e90: 0xe000afb1, 0x17e91: 0xe00028cd, 0x17e92: 0xe00036f3, 0x17e93: 0xe00028d3, - 0x17e94: 0xe00036f9, 0x17e95: 0xe00028d9, 0x17e96: 0xe00036ff, 0x17e97: 0xe00028b5, - 0x17e98: 0xe00036d5, 0x17e99: 0xe00028bb, 0x17e9a: 0xe00036e1, 0x17e9b: 0xe00028a9, - 0x17e9c: 0xe00036c3, 0x17e9d: 0xe00028a3, 0x17e9e: 0xe00036bd, 0x17e9f: 0xe00028af, - 0x17ea0: 0xe00036c9, 0x17ea1: 0xe00028c1, 0x17ea2: 0xe00036e7, 0x17ea3: 0xe00028c7, - 0x17ea4: 0xe00036ed, 0x17ea5: 0xe000af57, 0x17ea6: 0xe000af63, 0x17ea7: 0xe000af6f, - 0x17ea8: 0xe000af81, 0x17ea9: 0xe000af75, 0x17eaa: 0xe000af42, 0x17eab: 0xe000af90, - 0x17eac: 0xe000afae, 0x17ead: 0xe000af51, 0x17eae: 0xe000af5d, 0x17eaf: 0xe000af69, - 0x17eb0: 0xe000af7b, 0x17eb1: 0xe00036cf, 0x17eb2: 0xe00036db, 0x17eb3: 0xe000afc0, - 0x17eb4: 0xe000af2a, 0x17eb5: 0xe000af33, 0x17eb6: 0xe000af3c, 0x17eb7: 0xe000af54, - 0x17eb8: 0xe000af60, 0x17eb9: 0xe000af6c, 0x17eba: 0xe000afc3, 0x17ebb: 0xe000afcc, - 0x17ebc: 0xe0003696, 0x17ebd: 0xe0003699, 0x17ebe: 0x4004c020, 0x17ebf: 0x4004c220, - // Block 0x5fb, offset 0x17ec0 - 0x17ec0: 0x0039de98, 0x17ec1: 0x0039e69a, 0x17ec2: 0x0039e699, 0x17ec3: 0x0039e697, - 0x17ec4: 0x0039e698, 0x17ec5: 0x0039e89a, 0x17ec6: 0x0039e899, 0x17ec7: 0x0039e897, - 0x17ec8: 0x0039e898, 0x17ec9: 0x0039ee9a, 0x17eca: 0x0039ee99, 0x17ecb: 0x0039ee97, - 0x17ecc: 0x0039ee98, 0x17ecd: 0x0039f09a, 0x17ece: 0x0039f099, 0x17ecf: 0x0039f097, - 0x17ed0: 0x0039f098, 0x17ed1: 0x0039fc9a, 0x17ed2: 0x0039fc99, 0x17ed3: 0x0039fc97, - 0x17ed4: 0x0039fc98, 0x17ed5: 0x003a129a, 0x17ed6: 0x003a1299, 0x17ed7: 0x003a1297, - 0x17ed8: 0x003a1298, 0x17ed9: 0x003a1a9a, 0x17eda: 0x003a1a99, 0x17edb: 0x003a1a97, - 0x17edc: 0x003a1a98, 0x17edd: 0x003a409a, 0x17ede: 0x003a4099, 0x17edf: 0x003a4097, - 0x17ee0: 0x003a4098, 0x17ee1: 0x003a4e9a, 0x17ee2: 0x003a4e99, 0x17ee3: 0x003a4e97, - 0x17ee4: 0x003a4e98, 0x17ee5: 0x003a569a, 0x17ee6: 0x003a5699, 0x17ee7: 0x003a5697, - 0x17ee8: 0x003a5698, 0x17ee9: 0x003a689a, 0x17eea: 0x003a6899, 0x17eeb: 0x003a6897, - 0x17eec: 0x003a6898, 0x17eed: 0x003a749a, 0x17eee: 0x003a7499, 0x17eef: 0x003a8e9a, - 0x17ef0: 0x003a8e99, 0x17ef1: 0x003a909a, 0x17ef2: 0x003a9099, 0x17ef3: 0x003a9097, - 0x17ef4: 0x003a9098, 0x17ef5: 0xe0001732, 0x17ef6: 0xe000172f, 0x17ef7: 0xe0001738, - 0x17ef8: 0xe0001735, 0x17ef9: 0xe000173e, 0x17efa: 0xe000173b, 0x17efb: 0xe000b011, - 0x17efc: 0xe000b00e, 0x17eff: 0xa0000000, - // Block 0x5fc, offset 0x17f00 - 0x17f00: 0xa0000000, 0x17f01: 0xa0000000, 0x17f02: 0xa0000000, 0x17f03: 0xa0000000, - 0x17f04: 0xa0000000, 0x17f05: 0xa0000000, 0x17f06: 0xa0000000, 0x17f07: 0xa0000000, - 0x17f08: 0xa0000000, 0x17f09: 0x40020020, 0x17f0a: 0x40020220, 0x17f0b: 0x40020420, - 0x17f0c: 0x40020620, 0x17f0d: 0x40020820, 0x17f0e: 0xa0000000, 0x17f0f: 0xa0000000, - 0x17f10: 0xa0000000, 0x17f11: 0xa0000000, 0x17f12: 0xa0000000, 0x17f13: 0xa0000000, - 0x17f14: 0xa0000000, 0x17f15: 0xa0000000, 0x17f16: 0xa0000000, 0x17f17: 0xa0000000, - 0x17f18: 0xa0000000, 0x17f19: 0xa0000000, 0x17f1a: 0xa0000000, 0x17f1b: 0xa0000000, - 0x17f1c: 0xa0000000, 0x17f1d: 0xa0000000, 0x17f1e: 0xa0000000, 0x17f1f: 0xa0000000, - 0x17f20: 0x40021220, 0x17f21: 0x4002ba20, 0x17f22: 0x4003e020, 0x17f23: 0x4004ea20, - 0x17f24: 0x4027de20, 0x17f25: 0x4004ec20, 0x17f26: 0x4004e620, 0x17f27: 0x4003d220, - 0x17f28: 0x4003f420, 0x17f29: 0x4003f620, 0x17f2a: 0x4004d820, 0x17f2b: 0x40093820, - 0x17f2c: 0x40024020, 0x17f2d: 0x40021a20, 0x17f2e: 0x4002e420, 0x17f2f: 0x4004e220, - 0x17f30: 0x4029cc20, 0x17f31: 0x4029ce20, 0x17f32: 0x4029d020, 0x17f33: 0x4029d220, - 0x17f34: 0x4029d420, 0x17f35: 0x4029d620, 0x17f36: 0x4029d820, 0x17f37: 0x4029da20, - 0x17f38: 0x4029dc20, 0x17f39: 0x4029de20, 0x17f3a: 0x40026c20, 0x17f3b: 0x40026220, - 0x17f3c: 0x40094020, 0x17f3d: 0x40094220, 0x17f3e: 0x40094420, 0x17f3f: 0x4002c420, - // Block 0x5fd, offset 0x17f40 - 0x17f40: 0x4004d620, 0x17f41: 0xcead9741, 0x17f42: 0x002c0a88, 0x17f43: 0x002c3a88, - 0x17f44: 0x002c6288, 0x17f45: 0xce6d2741, 0x17f46: 0x002d0888, 0x17f47: 0x002d2288, - 0x17f48: 0x002d6888, 0x17f49: 0x002d9a88, 0x17f4a: 0x002dcc88, 0x17f4b: 0x002dfe88, - 0x17f4c: 0xc0030002, 0x17f4d: 0x002e8288, 0x17f4e: 0x002e9e88, 0x17f4f: 0xcfa09a71, - 0x17f50: 0x002f2c88, 0x17f51: 0x002f5688, 0x17f52: 0x002f7a88, 0x17f53: 0x002fe688, - 0x17f54: 0x00302c88, 0x17f55: 0xc3479aa1, 0x17f56: 0x0030be88, 0x17f57: 0x0030e288, - 0x17f58: 0x0030f688, 0x17f59: 0x00310088, 0x17f5a: 0x00312a88, 0x17f5b: 0x4003f820, - 0x17f5c: 0x4004e420, 0x17f5d: 0x4003fa20, 0x17f5e: 0x40062420, 0x17f5f: 0x40021620, - 0x17f60: 0x40061e20, 0x17f61: 0xceaa9741, 0x17f62: 0x402c0a20, 0x17f63: 0x402c3a20, - 0x17f64: 0x402c6220, 0x17f65: 0xce6b2741, 0x17f66: 0x402d0820, 0x17f67: 0x402d2220, - 0x17f68: 0x402d6820, 0x17f69: 0x402d9a20, 0x17f6a: 0x402dcc20, 0x17f6b: 0x402dfe20, - 0x17f6c: 0xc0000002, 0x17f6d: 0x402e8220, 0x17f6e: 0x402e9e20, 0x17f6f: 0xcf9d9a71, - 0x17f70: 0x402f2c20, 0x17f71: 0x402f5620, 0x17f72: 0x402f7a20, 0x17f73: 0x402fe620, - 0x17f74: 0x40302c20, 0x17f75: 0xc3459aa1, 0x17f76: 0x4030be20, 0x17f77: 0x4030e220, - 0x17f78: 0x4030f620, 0x17f79: 0x40310020, 0x17f7a: 0x40312a20, 0x17f7b: 0x4003fc20, - 0x17f7c: 0x40094820, 0x17f7d: 0x4003fe20, 0x17f7e: 0x40094c20, 0x17f7f: 0xa0000000, - // Block 0x5fe, offset 0x17f80 - 0x17f80: 0xe00008f5, 0x17f81: 0xe000b098, 0x17f82: 0x002be283, 0x17f83: 0xe000b092, - 0x17f84: 0xe000095b, 0x17f85: 0xe000094d, 0x17f86: 0xe00009dd, 0x17f87: 0xe0000a53, - 0x17f88: 0xe0000ae8, 0x17f89: 0xe000b10c, 0x17f8a: 0x002c9a83, 0x17f8b: 0xe0000b20, - 0x17f8c: 0xe0000c2b, 0x17f8d: 0xe000b150, 0x17f8e: 0xe0000c37, 0x17f8f: 0xe0000c43, - 0x17f90: 0xe0000ab3, 0x17f91: 0xe000b190, 0x17f92: 0xe0000d9a, 0x17f93: 0xe000b1c6, - 0x17f94: 0x002ee483, 0x17f95: 0xe000b1a8, 0x17f96: 0xe0000dd2, 0x17f97: 0x40093e20, - 0x17f98: 0xe0000e12, 0x17f99: 0xe0000fe1, 0x17f9a: 0xe000b268, 0x17f9b: 0xe0000fed, - 0x17f9c: 0xe0000fff, 0x17f9d: 0xe000b2b8, 0x17f9e: 0x00318888, 0x17f9f: 0xe0000f7b, - 0x17fa0: 0xe00008f2, 0x17fa1: 0xe000b095, 0x17fa2: 0x402be220, 0x17fa3: 0xe000b08f, - 0x17fa4: 0xe0000958, 0x17fa5: 0xe000094a, 0x17fa6: 0xe00009d5, 0x17fa7: 0xe0000a4d, - 0x17fa8: 0xe0000ae5, 0x17fa9: 0xe000b109, 0x17faa: 0x402c9a20, 0x17fab: 0xe0000b1d, - 0x17fac: 0xe0000c28, 0x17fad: 0xe000b14d, 0x17fae: 0xe0000c34, 0x17faf: 0xe0000c40, - 0x17fb0: 0xe0000aad, 0x17fb1: 0xe000b18d, 0x17fb2: 0xe0000d97, 0x17fb3: 0xe000b1c3, - 0x17fb4: 0x402ee420, 0x17fb5: 0xe000b1a5, 0x17fb6: 0xe0000dcf, 0x17fb7: 0x40093c20, - 0x17fb8: 0xe0000e0f, 0x17fb9: 0xe0000fde, 0x17fba: 0xe000b265, 0x17fbb: 0xe0000fea, - 0x17fbc: 0xe0000ffc, 0x17fbd: 0xe000b2b5, 0x17fbe: 0x40318820, 0x17fbf: 0xe0001114, - // Block 0x5ff, offset 0x17fc0 - 0x17fc0: 0xe0000983, 0x17fc1: 0xe0000980, 0x17fc2: 0x002be083, 0x17fc3: 0x402be020, - 0x17fc4: 0xe000097d, 0x17fc5: 0xe000097a, 0x17fc6: 0xe000b0ec, 0x17fc7: 0xe000b0e9, - 0x17fc8: 0xe0000a3e, 0x17fc9: 0xe0000a3b, 0x17fca: 0xe0000a4a, 0x17fcb: 0xe0000a47, - 0x17fcc: 0xe0000a44, 0x17fcd: 0xe0000a41, 0x17fce: 0xe0000a86, 0x17fcf: 0xe0000a83, - 0x17fd0: 0x002c6483, 0x17fd1: 0x402c6420, 0x17fd2: 0xe0000b46, 0x17fd3: 0xe0000b43, - 0x17fd4: 0xe0000aee, 0x17fd5: 0xe0000aeb, 0x17fd6: 0xe0000b2c, 0x17fd7: 0xe0000b29, - 0x17fd8: 0xe0000b40, 0x17fd9: 0xe0000b3d, 0x17fda: 0xe0000b1a, 0x17fdb: 0xe0000b17, - 0x17fdc: 0xe0000bb8, 0x17fdd: 0xe0000bb5, 0x17fde: 0xe0000bb2, 0x17fdf: 0xe0000baf, - 0x17fe0: 0xe0000bc4, 0x17fe1: 0xe0000bc1, 0x17fe2: 0xe0000bca, 0x17fe3: 0xe0000bc7, - 0x17fe4: 0xe0000bee, 0x17fe5: 0xe0000beb, 0x17fe6: 0xe0000c1b, 0x17fe7: 0xe0000c18, - 0x17fe8: 0xe000b14a, 0x17fe9: 0xe000b147, 0x17fea: 0xe0000c60, 0x17feb: 0xe0000c5d, - 0x17fec: 0xe0000c31, 0x17fed: 0xe0000c2e, 0x17fee: 0xe0000c5a, 0x17fef: 0xe0000c57, - 0x17ff0: 0xe0000c54, 0x17ff1: 0x402da220, 0x17ff2: 0xf0000a0a, 0x17ff3: 0xf0000404, - 0x17ff4: 0xe0000c8a, 0x17ff5: 0xe0000c87, 0x17ff6: 0xe0000c9f, 0x17ff7: 0xe0000c9c, - 0x17ff8: 0x402f7220, 0x17ff9: 0xe000b170, 0x17ffa: 0xe000b16d, 0x17ffb: 0xe0000cd8, - 0x17ffc: 0xe0000cd5, 0x17ffd: 0xe0000cd2, 0x17ffe: 0xe0000ccf, 0x17fff: 0xe0000d04, - // Block 0x600, offset 0x18000 - 0x18000: 0xe0000cfe, 0x18001: 0xe0000cf8, 0x18002: 0xe0000cf5, 0x18003: 0xe000b196, - 0x18004: 0xe000b193, 0x18005: 0xe0000d6f, 0x18006: 0xe0000d6c, 0x18007: 0xe0000d5d, - 0x18008: 0xe0000d5a, 0x18009: 0xf0000404, 0x1800a: 0x002eda88, 0x1800b: 0x402eda20, - 0x1800c: 0xe0000e2e, 0x1800d: 0xe0000e2b, 0x1800e: 0xe0000da0, 0x1800f: 0xe0000d9d, - 0x18010: 0xe0000de0, 0x18011: 0xe0000ddd, 0x18012: 0xe0000e93, 0x18013: 0xe0000e8f, - 0x18014: 0xe000b21e, 0x18015: 0xe000b21b, 0x18016: 0xe0000edc, 0x18017: 0xe0000ed9, - 0x18018: 0xe0000ed0, 0x18019: 0xe0000ecd, 0x1801a: 0xe000b232, 0x1801b: 0xe000b22f, - 0x1801c: 0xe0000f2d, 0x1801d: 0xe0000f2a, 0x1801e: 0xe0000f47, 0x1801f: 0xe0000f44, - 0x18020: 0xe0000f33, 0x18021: 0xe0000f30, 0x18022: 0xe0000f99, 0x18023: 0xe0000f96, - 0x18024: 0xe0000f8a, 0x18025: 0xe0000f87, 0x18026: 0x00303688, 0x18027: 0x40303620, - 0x18028: 0xe000b25a, 0x18029: 0xe000b257, 0x1802a: 0xe000103f, 0x1802b: 0xe000103c, - 0x1802c: 0xe0000fe7, 0x1802d: 0xe0000fe4, 0x1802e: 0xe0000ff9, 0x1802f: 0xe0000ff6, - 0x18030: 0xe0001025, 0x18031: 0xe0001022, 0x18032: 0xe0001039, 0x18033: 0xe0001036, - 0x18034: 0xe00010d8, 0x18035: 0xe00010d5, 0x18036: 0xe000110e, 0x18037: 0xe000110b, - 0x18038: 0xe0001117, 0x18039: 0xe000b2c4, 0x1803a: 0xe000b2c1, 0x1803b: 0xe000114d, - 0x1803c: 0xe000114a, 0x1803d: 0xe0001147, 0x1803e: 0xe0001144, 0x1803f: 0xe0000f64, - // Block 0x601, offset 0x18040 - 0x18040: 0x402c1a20, 0x18041: 0x002c2a88, 0x18042: 0x002c3288, 0x18043: 0x402c3220, - 0x18044: 0x0031c488, 0x18045: 0x4031c420, 0x18046: 0x002efa88, 0x18047: 0x002c4e88, - 0x18048: 0x402c4e20, 0x18049: 0x002c7288, 0x1804a: 0x002c7a88, 0x1804b: 0x002c8488, - 0x1804c: 0x402c8420, 0x1804d: 0xe000115c, 0x1804e: 0x002cae88, 0x1804f: 0x002cb888, - 0x18050: 0x002cc288, 0x18051: 0x002d1688, 0x18052: 0x402d1620, 0x18053: 0x002d4488, - 0x18054: 0x002d5888, 0x18055: 0x402d7820, 0x18056: 0x002dc288, 0x18057: 0x002db688, - 0x18058: 0x002e0a88, 0x18059: 0x402e0a20, 0x1805a: 0x402e3820, 0x1805b: 0x402e7220, - 0x1805c: 0x0030a088, 0x1805d: 0x002eb488, 0x1805e: 0x402ebc20, 0x1805f: 0x002f1088, - 0x18060: 0x002ee683, 0x18061: 0x402ee620, 0x18062: 0x002d6088, 0x18063: 0x402d6020, - 0x18064: 0x002f3e88, 0x18065: 0x402f3e20, 0x18066: 0x002f8288, 0x18067: 0x0031b488, - 0x18068: 0x4031b420, 0x18069: 0x00300888, 0x1806a: 0x40301220, 0x1806b: 0x40304220, - 0x1806c: 0x00304a88, 0x1806d: 0x40304a20, 0x1806e: 0x00305288, 0x1806f: 0x00306e83, - 0x18070: 0x40306e20, 0x18071: 0x0030b488, 0x18072: 0x0030cc88, 0x18073: 0x00311888, - 0x18074: 0x40311820, 0x18075: 0x00313488, 0x18076: 0x40313420, 0x18077: 0x00316488, - 0x18078: 0x00316e88, 0x18079: 0x40316e20, 0x1807a: 0x40317820, 0x1807b: 0x4031a620, - 0x1807c: 0x0031bc88, 0x1807d: 0x4031bc20, 0x1807e: 0xe0000fc9, 0x1807f: 0x40319420, - // Block 0x602, offset 0x18080 - 0x18080: 0x40321220, 0x18081: 0x40321a20, 0x18082: 0x40322220, 0x18083: 0x40322a20, - 0x18084: 0xe0000ad5, 0x18085: 0xe0000ad1, 0x18086: 0xe0000acd, 0x18087: 0xf0000a0a, - 0x18088: 0xf000040a, 0x18089: 0xf0000404, 0x1808a: 0xf0000a0a, 0x1808b: 0xf000040a, - 0x1808c: 0xf0000404, 0x1808d: 0xe0000947, 0x1808e: 0xe0000944, 0x1808f: 0xe0000c3d, - 0x18090: 0xe0000c3a, 0x18091: 0xe0000dcc, 0x18092: 0xe0000dc9, 0x18093: 0xe0000ff3, - 0x18094: 0xe0000ff0, 0x18095: 0xe000101e, 0x18096: 0xe000101a, 0x18097: 0xe000b275, - 0x18098: 0xe000b271, 0x18099: 0xe0001016, 0x1809a: 0xe0001012, 0x1809b: 0xe000100e, - 0x1809c: 0xe000100a, 0x1809d: 0x402cae20, 0x1809e: 0xe0000962, 0x1809f: 0xe000095e, - 0x180a0: 0xe0000976, 0x180a1: 0xe0000972, 0x180a2: 0xe00009f4, 0x180a3: 0xe00009ef, - 0x180a4: 0x002d3a88, 0x180a5: 0x402d3a20, 0x180a6: 0xe0000bbe, 0x180a7: 0xe0000bbb, - 0x180a8: 0xe0000c99, 0x180a9: 0xe0000c96, 0x180aa: 0xe0000e20, 0x180ab: 0xe0000e1d, - 0x180ac: 0xe0000e27, 0x180ad: 0xe0000e23, 0x180ae: 0xe0001162, 0x180af: 0xe000115f, - 0x180b0: 0xe0000c8d, 0x180b1: 0xf0000a0a, 0x180b2: 0xf000040a, 0x180b3: 0xf0000404, - 0x180b4: 0xe000b138, 0x180b5: 0xe000b135, 0x180b6: 0x002d7888, 0x180b7: 0x00319488, - 0x180b8: 0xe0000d57, 0x180b9: 0xe0000d54, 0x180ba: 0xe000b0a5, 0x180bb: 0xe000b0a1, - 0x180bc: 0xe000b0ae, 0x180bd: 0xe000b0a9, 0x180be: 0xe000b1d3, 0x180bf: 0xe000b1cf, - // Block 0x603, offset 0x180c0 - 0x180c0: 0xe000098f, 0x180c1: 0xe000098c, 0x180c2: 0xe0000995, 0x180c3: 0xe0000992, - 0x180c4: 0xe0000b62, 0x180c5: 0xe0000b5f, 0x180c6: 0xe0000b68, 0x180c7: 0xe0000b65, - 0x180c8: 0xe0000c6c, 0x180c9: 0xe0000c69, 0x180ca: 0xe0000c72, 0x180cb: 0xe0000c6f, - 0x180cc: 0xe0000e4a, 0x180cd: 0xe0000e47, 0x180ce: 0xe0000e50, 0x180cf: 0xe0000e4d, - 0x180d0: 0xe0000ee8, 0x180d1: 0xe0000ee5, 0x180d2: 0xe0000eee, 0x180d3: 0xe0000eeb, - 0x180d4: 0xe0001053, 0x180d5: 0xe0001050, 0x180d6: 0xe0001059, 0x180d7: 0xe0001056, - 0x180d8: 0xe0000f61, 0x180d9: 0xe0000f5e, 0x180da: 0xe0000fa5, 0x180db: 0xe0000fa2, - 0x180dc: 0x00312288, 0x180dd: 0x40312220, 0x180de: 0xe0000bf4, 0x180df: 0xe0000bf1, - 0x180e0: 0x002ebc88, 0x180e1: 0x402c8c20, 0x180e2: 0x002f2288, 0x180e3: 0x402f2220, - 0x180e4: 0x00314088, 0x180e5: 0x40314020, 0x180e6: 0xe000096f, 0x180e7: 0xe000096c, - 0x180e8: 0xe0000b32, 0x180e9: 0xe0000b2f, 0x180ea: 0xe0000dd9, 0x180eb: 0xe0000dd5, - 0x180ec: 0xe000b1bf, 0x180ed: 0xe000b1bb, 0x180ee: 0xe0000e04, 0x180ef: 0xe0000e01, - 0x180f0: 0xe0000e0b, 0x180f1: 0xe0000e07, 0x180f2: 0xe0001129, 0x180f3: 0xe0001126, - 0x180f4: 0x402e5e20, 0x180f5: 0x402ed020, 0x180f6: 0x40305a20, 0x180f7: 0x402dd420, - 0x180f8: 0xe0000abf, 0x180f9: 0xe0000ec4, 0x180fa: 0x002be888, 0x180fb: 0x002c4488, - 0x180fc: 0x402c4420, 0x180fd: 0x002e3888, 0x180fe: 0x00303e88, 0x180ff: 0x402ffc20, - // Block 0x604, offset 0x18100 - 0x18100: 0xae603502, 0x18101: 0xae603802, 0x18102: 0xae603c02, 0x18103: 0xae603702, - 0x18104: 0xae605b02, 0x18105: 0xae606302, 0x18106: 0xae603702, 0x18107: 0xae605202, - 0x18108: 0xae604702, 0x18109: 0xae603602, 0x1810a: 0xae604302, 0x1810b: 0xae604d02, - 0x1810c: 0xae604102, 0x1810d: 0xae605f02, 0x1810e: 0xae605f02, 0x1810f: 0xae606502, - 0x18110: 0xae606602, 0x18111: 0xae606702, 0x18112: 0xae605f02, 0x18113: 0xae602202, - 0x18114: 0xae602a02, 0x18115: 0xae805f02, 0x18116: 0xadc06002, 0x18117: 0xadc06002, - 0x18118: 0xadc06002, 0x18119: 0xadc06002, 0x1811a: 0xae805f02, 0x1811b: 0xad806802, - 0x1811c: 0xadc06002, 0x1811d: 0xadc06002, 0x1811e: 0xadc06002, 0x1811f: 0xadc06002, - 0x18120: 0xadc06002, 0x18121: 0xaca06e02, 0x18122: 0xaca06f02, 0x18123: 0xae603902, - 0x18124: 0xadc07502, 0x18125: 0xadc07602, 0x18126: 0xadc07702, 0x18127: 0xaca05602, - 0x18128: 0xaca05902, 0x18129: 0xadc06002, 0x1812a: 0xadc06002, 0x1812b: 0xadc06002, - 0x1812c: 0xadc06002, 0x1812d: 0xadc07802, 0x1812e: 0xadc07902, 0x1812f: 0xadc06002, - 0x18130: 0xadc07a02, 0x18131: 0xadc07b02, 0x18132: 0xadc02102, 0x18133: 0xadc06002, - 0x18134: 0xa0107c02, 0x18135: 0xa0107d02, 0x18136: 0xa0106102, 0x18137: 0xa0106102, - 0x18138: 0xa0105402, 0x18139: 0xadc07e02, 0x1813a: 0xadc06002, 0x1813b: 0xadc06002, - 0x1813c: 0xadc06002, 0x1813d: 0xae605f02, 0x1813e: 0xae605f02, 0x1813f: 0xae605f02, - // Block 0x605, offset 0x18140 - 0x18140: 0xae603502, 0x18141: 0xae603802, 0x18142: 0xae604502, 0x18143: 0xae602202, - 0x18144: 0xe000b07d, 0x18145: 0xaf007f02, 0x18146: 0xae605f02, 0x18147: 0xadc06002, - 0x18148: 0xadc06002, 0x18149: 0xadc06002, 0x1814a: 0xae605f02, 0x1814b: 0xae605f02, - 0x1814c: 0xae605f02, 0x1814d: 0xadc06002, 0x1814e: 0xadc06002, 0x1814f: 0xa0000000, - 0x18150: 0xae605f02, 0x18151: 0xae605f02, 0x18152: 0xae605f02, 0x18153: 0xadc06002, - 0x18154: 0xadc06002, 0x18155: 0xadc06002, 0x18156: 0xadc06002, 0x18157: 0xae605f02, - 0x18158: 0xae808002, 0x18159: 0xadc06002, 0x1815a: 0xadc06002, 0x1815b: 0xae605f02, - 0x1815c: 0xae906002, 0x1815d: 0xaea05f02, 0x1815e: 0xaea05f02, 0x1815f: 0xae906002, - 0x18160: 0xaea08102, 0x18161: 0xaea08202, 0x18162: 0xae906002, 0x18163: 0x84e615ef, - 0x18164: 0x84e6164c, 0x18165: 0x84e616cd, 0x18166: 0x84e61771, 0x18167: 0x84e61836, - 0x18168: 0x84e6161d, 0x18169: 0x84e61631, 0x1816a: 0x84e616b4, 0x1816b: 0x84e61741, - 0x1816c: 0x84e617bd, 0x1816d: 0x84e61816, 0x1816e: 0x84e6185f, 0x1816f: 0x84e6187b, - 0x18170: 0x00326688, 0x18171: 0x40326620, 0x18172: 0x0032a688, 0x18173: 0x4032a620, - 0x18174: 0x40064020, 0x18175: 0x40064220, 0x18176: 0x00326088, 0x18177: 0x40326020, - 0x1817a: 0x00326c84, 0x1817b: 0x40329220, - 0x1817c: 0x40329020, 0x1817d: 0x40329420, 0x1817e: 0x40026220, - // Block 0x606, offset 0x18180 - 0x18184: 0x40062020, 0x18185: 0xe000b080, 0x18186: 0xe000b2f4, 0x18187: 0x40030620, - 0x18188: 0xe000b30e, 0x18189: 0xe000b338, 0x1818a: 0xe000b352, - 0x1818c: 0xe000b36c, 0x1818e: 0xe000b37e, 0x1818f: 0xe000b3ac, - 0x18190: 0xe000b355, 0x18191: 0x00325288, 0x18192: 0x00325488, 0x18193: 0x00325688, - 0x18194: 0x00325a88, 0x18195: 0x00325c88, 0x18196: 0x00326488, 0x18197: 0x00326888, - 0x18198: 0x00326a88, 0x18199: 0x00326c88, 0x1819a: 0x00327088, 0x1819b: 0x00327288, - 0x1819c: 0x00327688, 0x1819d: 0x00327888, 0x1819e: 0x00327a88, 0x1819f: 0x00327c88, - 0x181a0: 0x00327e88, 0x181a1: 0x00328888, 0x181a3: 0x00328e88, - 0x181a4: 0x00329688, 0x181a5: 0x00329888, 0x181a6: 0x00329a88, 0x181a7: 0x00329c88, - 0x181a8: 0x00329e88, 0x181a9: 0x0032a288, 0x181aa: 0xe000134f, 0x181ab: 0xe00013f2, - 0x181ac: 0xe000b2f1, 0x181ad: 0xe000b30b, 0x181ae: 0xe000b335, 0x181af: 0xe000b34f, - 0x181b0: 0xe000b381, 0x181b1: 0x40325220, 0x181b2: 0x40325420, 0x181b3: 0x40325620, - 0x181b4: 0x40325a20, 0x181b5: 0x40325c20, 0x181b6: 0x40326420, 0x181b7: 0x40326820, - 0x181b8: 0x40326a20, 0x181b9: 0x40326c20, 0x181ba: 0x40327020, 0x181bb: 0x40327220, - 0x181bc: 0x40327620, 0x181bd: 0x40327820, 0x181be: 0x40327a20, 0x181bf: 0x40327c20, - // Block 0x607, offset 0x181c0 - 0x181c0: 0x40327e20, 0x181c1: 0x40328820, 0x181c2: 0x00328e99, 0x181c3: 0x40328e20, - 0x181c4: 0x40329620, 0x181c5: 0x40329820, 0x181c6: 0x40329a20, 0x181c7: 0x40329c20, - 0x181c8: 0x40329e20, 0x181c9: 0x4032a220, 0x181ca: 0xe000134c, 0x181cb: 0xe00013ef, - 0x181cc: 0xe000b369, 0x181cd: 0xe000b37b, 0x181ce: 0xe000b3a9, 0x181cf: 0xe0001368, - 0x181d0: 0x00325484, 0x181d1: 0x00326a84, 0x181d2: 0x0032988a, 0x181d3: 0xf000020a, - 0x181d4: 0xf000020a, 0x181d5: 0x00329a84, 0x181d6: 0x00327e84, 0x181d7: 0xe0001364, - 0x181d8: 0x00328688, 0x181d9: 0x40328620, 0x181da: 0x00326288, 0x181db: 0x40326220, - 0x181dc: 0x00325e88, 0x181dd: 0x40325e20, 0x181de: 0x00328488, 0x181df: 0x40328420, - 0x181e0: 0x0032a488, 0x181e1: 0x4032a420, 0x181e2: 0x0032e888, 0x181e3: 0x4032e820, - 0x181e4: 0x0032f288, 0x181e5: 0x4032f220, 0x181e6: 0x0032f488, 0x181e7: 0x4032f420, - 0x181e8: 0x0032fa88, 0x181e9: 0x4032fa20, 0x181ea: 0x00330888, 0x181eb: 0x40330820, - 0x181ec: 0x00330e88, 0x181ed: 0x40330e20, 0x181ee: 0x00331688, 0x181ef: 0x40331620, - 0x181f0: 0x00327084, 0x181f1: 0x00328884, 0x181f2: 0x00328e84, 0x181f3: 0x40326e20, - 0x181f4: 0x00326a8a, 0x181f5: 0x00325c84, 0x181f6: 0x40092e20, 0x181f7: 0x0032a888, - 0x181f8: 0x4032a820, 0x181f9: 0x00328e8a, 0x181fa: 0x00328288, 0x181fb: 0x40328220, - 0x181fc: 0x40328c20, 0x181fd: 0x00329288, 0x181fe: 0x00329088, 0x181ff: 0x00329488, - // Block 0x608, offset 0x18200 - 0x18200: 0xe00009b1, 0x18201: 0xe00009ae, 0x18202: 0xe0000a22, 0x18203: 0xe0000a1f, - 0x18204: 0xe000b0e6, 0x18205: 0xe000b0e3, 0x18206: 0xe0000a2e, 0x18207: 0xe0000a2b, - 0x18208: 0xe000b0f3, 0x18209: 0xe000b0ef, 0x1820a: 0xe0000a8c, 0x1820b: 0xe0000a89, - 0x1820c: 0xe000b0fa, 0x1820d: 0xe000b0f7, 0x1820e: 0xe0000aa4, 0x1820f: 0xe0000aa1, - 0x18210: 0xe0000a92, 0x18211: 0xe0000a8f, 0x18212: 0xe0000a9e, 0x18213: 0xe0000a9b, - 0x18214: 0xe0000b55, 0x18215: 0xe0000b51, 0x18216: 0xe000b119, 0x18217: 0xe000b115, - 0x18218: 0xe0000b7c, 0x18219: 0xe0000b79, 0x1821a: 0xe0000b82, 0x1821b: 0xe0000b7f, - 0x1821c: 0xe0000b39, 0x1821d: 0xe0000b35, 0x1821e: 0xe0000b8c, 0x1821f: 0xe0000b89, - 0x18220: 0xe0000bd0, 0x18221: 0xe0000bcd, 0x18222: 0xe0000c00, 0x18223: 0xe0000bfd, - 0x18224: 0xe000b13e, 0x18225: 0xe000b13b, 0x18226: 0xe0000bfa, 0x18227: 0xe0000bf7, - 0x18228: 0xe0000c06, 0x18229: 0xe0000c03, 0x1822a: 0xe0000c12, 0x1822b: 0xe0000c0f, - 0x1822c: 0xe0000c7e, 0x1822d: 0xe0000c7b, 0x1822e: 0xe000b15d, 0x1822f: 0xe000b159, - 0x18230: 0xe000b164, 0x18231: 0xe000b161, 0x18232: 0xe000b16a, 0x18233: 0xe000b167, - 0x18234: 0xe0000cb1, 0x18235: 0xe0000cae, 0x18236: 0xe000b176, 0x18237: 0xe000b173, - 0x18238: 0xe000b17d, 0x18239: 0xe000b179, 0x1823a: 0xe0000cf2, 0x1823b: 0xe0000cef, - 0x1823c: 0xe0000cec, 0x1823d: 0xe0000ce9, 0x1823e: 0xe000b184, 0x1823f: 0xe000b181, - // Block 0x609, offset 0x18240 - 0x18240: 0xe0000d24, 0x18241: 0xe0000d21, 0x18242: 0xe000b18a, 0x18243: 0xe000b187, - 0x18244: 0xe0000d69, 0x18245: 0xe0000d66, 0x18246: 0xe000b19c, 0x18247: 0xe000b199, - 0x18248: 0xe0000d87, 0x18249: 0xe0000d84, 0x1824a: 0xe0000d81, 0x1824b: 0xe0000d7e, - 0x1824c: 0xe000b1af, 0x1824d: 0xe000b1ab, 0x1824e: 0xe000b1b7, 0x1824f: 0xe000b1b3, - 0x18250: 0xe0000e3d, 0x18251: 0xe0000e39, 0x18252: 0xe000b1db, 0x18253: 0xe000b1d7, - 0x18254: 0xe000b218, 0x18255: 0xe000b215, 0x18256: 0xe0000ead, 0x18257: 0xe0000eaa, - 0x18258: 0xe0000ed6, 0x18259: 0xe0000ed3, 0x1825a: 0xe000b224, 0x1825b: 0xe000b221, - 0x1825c: 0xe000b22b, 0x1825d: 0xe000b227, 0x1825e: 0xe0000f02, 0x1825f: 0xe0000eff, - 0x18260: 0xe0000f41, 0x18261: 0xe0000f3e, 0x18262: 0xe000b240, 0x18263: 0xe000b23d, - 0x18264: 0xe000b239, 0x18265: 0xe000b235, 0x18266: 0xe0000f3a, 0x18267: 0xe0000f36, - 0x18268: 0xe000b247, 0x18269: 0xe000b243, 0x1826a: 0xe0000f93, 0x1826b: 0xe0000f90, - 0x1826c: 0xe000b24e, 0x1826d: 0xe000b24b, 0x1826e: 0xe0000fb1, 0x1826f: 0xe0000fae, - 0x18270: 0xe0000fab, 0x18271: 0xe0000fa8, 0x18272: 0xe0001093, 0x18273: 0xe0001090, - 0x18274: 0xe000109f, 0x18275: 0xe000109c, 0x18276: 0xe0001099, 0x18277: 0xe0001096, - 0x18278: 0xe000b261, 0x18279: 0xe000b25d, 0x1827a: 0xe0001046, 0x1827b: 0xe0001042, - 0x1827c: 0xe000b294, 0x1827d: 0xe000b291, 0x1827e: 0xe000b29a, 0x1827f: 0xe000b297, - // Block 0x60a, offset 0x18280 - 0x18280: 0xe00010d2, 0x18281: 0xe00010cf, 0x18282: 0xe000b2a0, 0x18283: 0xe000b29d, - 0x18284: 0xe00010e1, 0x18285: 0xe00010de, 0x18286: 0xe00010e7, 0x18287: 0xe00010e4, - 0x18288: 0xe000b2a6, 0x18289: 0xe000b2a3, 0x1828a: 0xe00010fc, 0x1828b: 0xe00010f9, - 0x1828c: 0xe00010f6, 0x1828d: 0xe00010f3, 0x1828e: 0xe0001123, 0x1828f: 0xe0001120, - 0x18290: 0xe0001141, 0x18291: 0xe000113e, 0x18292: 0xe000b2ca, 0x18293: 0xe000b2c7, - 0x18294: 0xe0001159, 0x18295: 0xe0001156, 0x18296: 0xe0000c15, 0x18297: 0xe0000f8d, - 0x18298: 0xe00010db, 0x18299: 0xe0001111, 0x1829a: 0xf0000404, 0x1829b: 0xe0000f70, - 0x1829c: 0x40300420, 0x1829d: 0x40300620, 0x1829e: 0xe0000f7f, 0x1829f: 0x402c9620, - 0x182a0: 0xe000b09e, 0x182a1: 0xe000b09b, 0x182a2: 0xe000b08c, 0x182a3: 0xe000b089, - 0x182a4: 0xe000b0da, 0x182a5: 0xe000b0d7, 0x182a6: 0xe000393a, 0x182a7: 0xe0003937, - 0x182a8: 0xe000b0ce, 0x182a9: 0xe000b0cb, 0x182aa: 0xe000b0d4, 0x182ab: 0xe000b0d1, - 0x182ac: 0xe000b0e0, 0x182ad: 0xe000b0dd, 0x182ae: 0xe000b0c2, 0x182af: 0xe000b0bf, - 0x182b0: 0xe0003894, 0x182b1: 0xe0003891, 0x182b2: 0xe000b0b6, 0x182b3: 0xe000b0b3, - 0x182b4: 0xe000b0bc, 0x182b5: 0xe000b0b9, 0x182b6: 0xe000b0c8, 0x182b7: 0xe000b0c5, - 0x182b8: 0xe000b112, 0x182b9: 0xe000b10f, 0x182ba: 0xe000b100, 0x182bb: 0xe000b0fd, - 0x182bc: 0xe000b106, 0x182bd: 0xe000b103, 0x182be: 0xe000b12c, 0x182bf: 0xe000b129, - // Block 0x60b, offset 0x182c0 - 0x182c0: 0xe000ad47, 0x182c1: 0xe000ad44, 0x182c2: 0xe000b120, 0x182c3: 0xe000b11d, - 0x182c4: 0xe000b126, 0x182c5: 0xe000b123, 0x182c6: 0xe000b132, 0x182c7: 0xe000b12f, - 0x182c8: 0xe000b144, 0x182c9: 0xe000b141, 0x182ca: 0xe000b156, 0x182cb: 0xe000b153, - 0x182cc: 0xe000b1cc, 0x182cd: 0xe000b1c9, 0x182ce: 0xe000b1a2, 0x182cf: 0xe000b19f, - 0x182d0: 0xe000b1ee, 0x182d1: 0xe000b1eb, 0x182d2: 0xe000ad65, 0x182d3: 0xe000ad62, - 0x182d4: 0xe000b1e2, 0x182d5: 0xe000b1df, 0x182d6: 0xe000b1e8, 0x182d7: 0xe000b1e5, - 0x182d8: 0xe000b1f4, 0x182d9: 0xe000b1f1, 0x182da: 0xe000b20c, 0x182db: 0xe000b209, - 0x182dc: 0xe000b1fa, 0x182dd: 0xe000b1f7, 0x182de: 0xe000b200, 0x182df: 0xe000b1fd, - 0x182e0: 0xe000b206, 0x182e1: 0xe000b203, 0x182e2: 0xe000b212, 0x182e3: 0xe000b20f, - 0x182e4: 0xe000b26e, 0x182e5: 0xe000b26b, 0x182e6: 0xe000b254, 0x182e7: 0xe000b251, - 0x182e8: 0xe000b288, 0x182e9: 0xe000b285, 0x182ea: 0xe0002958, 0x182eb: 0xe0002955, - 0x182ec: 0xe000b27c, 0x182ed: 0xe000b279, 0x182ee: 0xe000b282, 0x182ef: 0xe000b27f, - 0x182f0: 0xe000b28e, 0x182f1: 0xe000b28b, 0x182f2: 0xe0001108, 0x182f3: 0xe0001105, - 0x182f4: 0xe000b2be, 0x182f5: 0xe000b2bb, 0x182f6: 0xe000b2ac, 0x182f7: 0xe000b2a9, - 0x182f8: 0xe000b2b2, 0x182f9: 0xe000b2af, 0x182fa: 0xe0000d0a, 0x182fb: 0xe0000d07, - 0x182fc: 0x0030d888, 0x182fd: 0x4030d820, 0x182fe: 0x00312088, 0x182ff: 0x40312020, - // Block 0x60c, offset 0x18300 - 0x18300: 0xe0001165, 0x18301: 0xe00011a9, 0x18302: 0xe000117d, 0x18303: 0xe00011c1, - 0x18304: 0xe000b2cd, 0x18305: 0xe000b2df, 0x18306: 0xe000118f, 0x18307: 0xe00011d3, - 0x18308: 0xe0001168, 0x18309: 0xe00011ac, 0x1830a: 0xe0001181, 0x1830b: 0xe00011c5, - 0x1830c: 0xe000b2d1, 0x1830d: 0xe000b2e3, 0x1830e: 0xe0001193, 0x1830f: 0xe00011d7, - 0x18310: 0xe000121a, 0x18311: 0xe0001230, 0x18312: 0xe0001228, 0x18313: 0xe000123e, - 0x18314: 0xe000b2fb, 0x18315: 0xe000b303, - 0x18318: 0xe000121d, 0x18319: 0xe0001233, 0x1831a: 0xe000122c, 0x1831b: 0xe0001242, - 0x1831c: 0xe000b2ff, 0x1831d: 0xe000b307, - 0x18320: 0xe0001252, 0x18321: 0xe0001296, 0x18322: 0xe000126a, 0x18323: 0xe00012ae, - 0x18324: 0xe000b311, 0x18325: 0xe000b323, 0x18326: 0xe000127c, 0x18327: 0xe00012c0, - 0x18328: 0xe0001255, 0x18329: 0xe0001299, 0x1832a: 0xe000126e, 0x1832b: 0xe00012b2, - 0x1832c: 0xe000b315, 0x1832d: 0xe000b327, 0x1832e: 0xe0001280, 0x1832f: 0xe00012c4, - 0x18330: 0xe00012fb, 0x18331: 0xe0001319, 0x18332: 0xe0001309, 0x18333: 0xe0001327, - 0x18334: 0xe000b33f, 0x18335: 0xe000b347, 0x18336: 0xe0001311, 0x18337: 0xe000132f, - 0x18338: 0xe00012fe, 0x18339: 0xe000131c, 0x1833a: 0xe000130d, 0x1833b: 0xe000132b, - 0x1833c: 0xe000b343, 0x1833d: 0xe000b34b, 0x1833e: 0xe0001315, 0x1833f: 0xe0001333, - // Block 0x60d, offset 0x18340 - 0x18340: 0xe000136c, 0x18341: 0xe0001382, 0x18342: 0xe000137a, 0x18343: 0xe0001390, - 0x18344: 0xe000b359, 0x18345: 0xe000b361, - 0x18348: 0xe000136f, 0x18349: 0xe0001385, 0x1834a: 0xe000137e, 0x1834b: 0xe0001394, - 0x1834c: 0xe000b35d, 0x1834d: 0xe000b365, - 0x18350: 0xe00013ad, 0x18351: 0xe00013bc, 0x18352: 0xe00013b4, 0x18353: 0xe00013ca, - 0x18354: 0xe000b36f, 0x18355: 0xe000b373, 0x18356: 0xe00013b8, 0x18357: 0xe00013d2, - 0x18359: 0xe00013bf, 0x1835b: 0xe00013ce, - 0x1835d: 0xe000b377, 0x1835f: 0xe00013d6, - 0x18360: 0xe0001407, 0x18361: 0xe000144b, 0x18362: 0xe000141f, 0x18363: 0xe0001463, - 0x18364: 0xe000b385, 0x18365: 0xe000b397, 0x18366: 0xe0001431, 0x18367: 0xe0001475, - 0x18368: 0xe000140a, 0x18369: 0xe000144e, 0x1836a: 0xe0001423, 0x1836b: 0xe0001467, - 0x1836c: 0xe000b389, 0x1836d: 0xe000b39b, 0x1836e: 0xe0001435, 0x1836f: 0xe0001479, - 0x18370: 0xe00011f7, 0x18371: 0xe000b2f1, 0x18372: 0xe000124c, 0x18373: 0xe000b30b, - 0x18374: 0xe00012e4, 0x18375: 0xe000b335, 0x18376: 0xe000133d, 0x18377: 0xe000b34f, - 0x18378: 0xe000139e, 0x18379: 0xe000b369, 0x1837a: 0xe00013e0, 0x1837b: 0xe000b37b, - 0x1837c: 0xe0001499, 0x1837d: 0xe000b3a9, - // Block 0x60e, offset 0x18380 - 0x18380: 0xe00011a1, 0x18381: 0xe00011e5, 0x18382: 0xe0001185, 0x18383: 0xe00011c9, - 0x18384: 0xe000b2d5, 0x18385: 0xe000b2e7, 0x18386: 0xe0001197, 0x18387: 0xe00011db, - 0x18388: 0xe00011a5, 0x18389: 0xe00011e9, 0x1838a: 0xe000118a, 0x1838b: 0xe00011ce, - 0x1838c: 0xe000b2da, 0x1838d: 0xe000b2ec, 0x1838e: 0xe000119c, 0x1838f: 0xe00011e0, - 0x18390: 0xe000128e, 0x18391: 0xe00012d2, 0x18392: 0xe0001272, 0x18393: 0xe00012b6, - 0x18394: 0xe000b319, 0x18395: 0xe000b32b, 0x18396: 0xe0001284, 0x18397: 0xe00012c8, - 0x18398: 0xe0001292, 0x18399: 0xe00012d6, 0x1839a: 0xe0001277, 0x1839b: 0xe00012bb, - 0x1839c: 0xe000b31e, 0x1839d: 0xe000b330, 0x1839e: 0xe0001289, 0x1839f: 0xe00012cd, - 0x183a0: 0xe0001443, 0x183a1: 0xe0001487, 0x183a2: 0xe0001427, 0x183a3: 0xe000146b, - 0x183a4: 0xe000b38d, 0x183a5: 0xe000b39f, 0x183a6: 0xe0001439, 0x183a7: 0xe000147d, - 0x183a8: 0xe0001447, 0x183a9: 0xe000148b, 0x183aa: 0xe000142c, 0x183ab: 0xe0001470, - 0x183ac: 0xe000b392, 0x183ad: 0xe000b3a4, 0x183ae: 0xe000143e, 0x183af: 0xe0001482, - 0x183b0: 0xe0001201, 0x183b1: 0xe000120e, 0x183b2: 0xe00011fd, 0x183b3: 0xe0001214, - 0x183b4: 0xe000b2f7, 0x183b6: 0xe0001207, 0x183b7: 0xe000120a, - 0x183b8: 0xe0001204, 0x183b9: 0xe0001211, 0x183ba: 0xe00011fa, 0x183bb: 0xe000b2f4, - 0x183bc: 0xe0001217, 0x183bd: 0x40063620, 0x183be: 0x40326c20, 0x183bf: 0x40063620, - // Block 0x60f, offset 0x183c0 - 0x183c0: 0x40063a20, 0x183c1: 0xe00000b1, 0x183c2: 0xe00012ea, 0x183c3: 0xe00012f5, - 0x183c4: 0xe000b33b, 0x183c6: 0xe00012ee, 0x183c7: 0xe00012f1, - 0x183c8: 0xe000124f, 0x183c9: 0xe000b30e, 0x183ca: 0xe00012e7, 0x183cb: 0xe000b338, - 0x183cc: 0xe00012f8, 0x183cd: 0xe00000b7, 0x183ce: 0xe000b083, 0x183cf: 0xe00000ba, - 0x183d0: 0xe0001343, 0x183d1: 0xe000135e, 0x183d2: 0xe0001356, 0x183d3: 0xe000b355, - 0x183d6: 0xe0001349, 0x183d7: 0xe000135a, - 0x183d8: 0xe0001346, 0x183d9: 0xe0001361, 0x183da: 0xe0001340, 0x183db: 0xe000b352, - 0x183dd: 0xe00000c0, 0x183de: 0xe000b086, 0x183df: 0xe00000c3, - 0x183e0: 0xe00013e6, 0x183e1: 0xe0001401, 0x183e2: 0xe00013f9, 0x183e3: 0xe000b381, - 0x183e4: 0xe00013a4, 0x183e5: 0xe00013a7, 0x183e6: 0xe00013ec, 0x183e7: 0xe00013fd, - 0x183e8: 0xe00013e9, 0x183e9: 0xe0001404, 0x183ea: 0xe00013e3, 0x183eb: 0xe000b37e, - 0x183ec: 0xe00013aa, 0x183ed: 0xe00000ae, 0x183ee: 0xe000b080, 0x183ef: 0x40061e20, - 0x183f2: 0xe000149f, 0x183f3: 0xe00014aa, - 0x183f4: 0xe000b3af, 0x183f6: 0xe00014a3, 0x183f7: 0xe00014a6, - 0x183f8: 0xe00013a1, 0x183f9: 0xe000b36c, 0x183fa: 0xe000149c, 0x183fb: 0xe000b3ac, - 0x183fc: 0xe00014ad, 0x183fd: 0x40062020, 0x183fe: 0x40063820, - // Block 0x610, offset 0x18400 - 0x18400: 0xa0000000, 0x18401: 0xa0000000, 0x18402: 0xa0000000, 0x18403: 0xa0000000, - 0x18404: 0xa0000000, 0x18405: 0xa0000000, 0x18406: 0xa0000000, 0x18407: 0xa0000000, - 0x18408: 0xa0000000, 0x18409: 0x40020020, 0x1840a: 0x40020220, 0x1840b: 0x40020420, - 0x1840c: 0x40020620, 0x1840d: 0x40020820, 0x1840e: 0xa0000000, 0x1840f: 0xa0000000, - 0x18410: 0xa0000000, 0x18411: 0xa0000000, 0x18412: 0xa0000000, 0x18413: 0xa0000000, - 0x18414: 0xa0000000, 0x18415: 0xa0000000, 0x18416: 0xa0000000, 0x18417: 0xa0000000, - 0x18418: 0xa0000000, 0x18419: 0xa0000000, 0x1841a: 0xa0000000, 0x1841b: 0xa0000000, - 0x1841c: 0xa0000000, 0x1841d: 0xa0000000, 0x1841e: 0xa0000000, 0x1841f: 0xa0000000, - 0x18420: 0x40021220, 0x18421: 0x4002ba20, 0x18422: 0x4003e020, 0x18423: 0x4004ea20, - 0x18424: 0x4027de20, 0x18425: 0x4004ec20, 0x18426: 0x4004e620, 0x18427: 0x4003d220, - 0x18428: 0x4003f420, 0x18429: 0x4003f620, 0x1842a: 0x4004d820, 0x1842b: 0x40093820, - 0x1842c: 0x40024020, 0x1842d: 0x40021a20, 0x1842e: 0x4002e420, 0x1842f: 0x4004e220, - 0x18430: 0x4029cc20, 0x18431: 0x4029ce20, 0x18432: 0x4029d020, 0x18433: 0x4029d220, - 0x18434: 0x4029d420, 0x18435: 0x4029d620, 0x18436: 0x4029d820, 0x18437: 0x4029da20, - 0x18438: 0x4029dc20, 0x18439: 0x4029de20, 0x1843a: 0x40026c20, 0x1843b: 0x40026220, - 0x1843c: 0x40094020, 0x1843d: 0x40094220, 0x1843e: 0x40094420, 0x1843f: 0x4002c420, - // Block 0x611, offset 0x18440 - 0x18440: 0x4004d620, 0x18441: 0x002bde88, 0x18442: 0x002c0a88, 0x18443: 0x002c3a88, - 0x18444: 0x002c6288, 0x18445: 0x002c9888, 0x18446: 0x002d0888, 0x18447: 0x002d2288, - 0x18448: 0x002d6888, 0x18449: 0x002d9a88, 0x1844a: 0x002dcc88, 0x1844b: 0x002dfe88, - 0x1844c: 0xc0030002, 0x1844d: 0x002e8288, 0x1844e: 0x002e9e88, 0x1844f: 0x002ee288, - 0x18450: 0x002f2c88, 0x18451: 0x002f5688, 0x18452: 0x002f7a88, 0x18453: 0x002fe688, - 0x18454: 0x00302c88, 0x18455: 0x00306c88, 0x18456: 0x0030be88, 0x18457: 0x0030e288, - 0x18458: 0x0030f688, 0x18459: 0x00310088, 0x1845a: 0x00312a88, 0x1845b: 0x4003f820, - 0x1845c: 0x4004e420, 0x1845d: 0x4003fa20, 0x1845e: 0x40062420, 0x1845f: 0x40021620, - 0x18460: 0x40061e20, 0x18461: 0xcfa39ac2, 0x18462: 0x402c0a20, 0x18463: 0xcfa809b1, - 0x18464: 0x402c6220, 0x18465: 0xcfaa9b41, 0x18466: 0x402d0820, 0x18467: 0x402d2220, - 0x18468: 0x402d6820, 0x18469: 0xcfac9b51, 0x1846a: 0x402dcc20, 0x1846b: 0x402dfe20, - 0x1846c: 0xc0000002, 0x1846d: 0x402e8220, 0x1846e: 0x402e9e20, 0x1846f: 0xcfae9b62, - 0x18470: 0x402f2c20, 0x18471: 0x402f5620, 0x18472: 0x402f7a20, 0x18473: 0xcfb39be1, - 0x18474: 0x40302c20, 0x18475: 0xcfb59c02, 0x18476: 0x4030be20, 0x18477: 0x4030e220, - 0x18478: 0x4030f620, 0x18479: 0x40310020, 0x1847a: 0x40312a20, 0x1847b: 0x4003fc20, - 0x1847c: 0x40094820, 0x1847d: 0x4003fe20, 0x1847e: 0x40094c20, 0x1847f: 0xa0000000, - // Block 0x612, offset 0x18480 - 0x18480: 0xe00008f5, 0x18481: 0xe00008ef, 0x18482: 0xe0000921, 0x18483: 0xe0000969, - 0x18484: 0xe000095b, 0x18485: 0xe000094d, 0x18486: 0xe00009dd, 0x18487: 0xe0000a53, - 0x18488: 0xe0000ae8, 0x18489: 0xe0000ae2, 0x1848a: 0xe0000af4, 0x1848b: 0xe0000b20, - 0x1848c: 0xe0000c2b, 0x1848d: 0xe0000c25, 0x1848e: 0xe0000c37, 0x1848f: 0xe0000c43, - 0x18490: 0xe0000ab3, 0x18491: 0xe0000d63, 0x18492: 0xe0000d9a, 0x18493: 0xe0000d94, - 0x18494: 0xe0000da6, 0x18495: 0xe0000de6, 0x18496: 0xe0000dd2, 0x18497: 0x40093e20, - 0x18498: 0xe0000e12, 0x18499: 0xe0000fe1, 0x1849a: 0xe0000fdb, 0x1849b: 0xe0000fed, - 0x1849c: 0xe0000fff, 0x1849d: 0xe0001102, 0x1849e: 0x00318888, 0x1849f: 0xe0000f7b, - 0x184a0: 0xe00008f2, 0x184a1: 0xe00008ec, 0x184a2: 0xe000091e, 0x184a3: 0xe0000966, - 0x184a4: 0xcfa69b21, 0x184a5: 0xe000094a, 0x184a6: 0xe00009d5, 0x184a7: 0xe0000a4d, - 0x184a8: 0xe0000ae5, 0x184a9: 0xe0000adf, 0x184aa: 0xe0000af1, 0x184ab: 0xe0000b1d, - 0x184ac: 0xe0000c28, 0x184ad: 0xe0000c22, 0x184ae: 0xe0000c34, 0x184af: 0xe0000c40, - 0x184b0: 0xe0000aad, 0x184b1: 0xe0000d60, 0x184b2: 0xe0000d97, 0x184b3: 0xe0000d91, - 0x184b4: 0xe0000da3, 0x184b5: 0xe0000de3, 0x184b6: 0xcfb19bc1, 0x184b7: 0x40093c20, - 0x184b8: 0xe0000e0f, 0x184b9: 0xe0000fde, 0x184ba: 0xe0000fd8, 0x184bb: 0xe0000fea, - 0x184bc: 0xcfb89c61, 0x184bd: 0xe00010ff, 0x184be: 0x40318820, 0x184bf: 0xe0001114, - // Block 0x613, offset 0x184c0 - 0x184c0: 0xa0000000, 0x184c1: 0xa0000000, 0x184c2: 0xa0000000, 0x184c3: 0xa0000000, - 0x184c4: 0xa0000000, 0x184c5: 0xa0000000, 0x184c6: 0xa0000000, 0x184c7: 0xa0000000, - 0x184c8: 0xa0000000, 0x184c9: 0x40020020, 0x184ca: 0x40020220, 0x184cb: 0x40020420, - 0x184cc: 0x40020620, 0x184cd: 0x40020820, 0x184ce: 0xa0000000, 0x184cf: 0xa0000000, - 0x184d0: 0xa0000000, 0x184d1: 0xa0000000, 0x184d2: 0xa0000000, 0x184d3: 0xa0000000, - 0x184d4: 0xa0000000, 0x184d5: 0xa0000000, 0x184d6: 0xa0000000, 0x184d7: 0xa0000000, - 0x184d8: 0xa0000000, 0x184d9: 0xa0000000, 0x184da: 0xa0000000, 0x184db: 0xa0000000, - 0x184dc: 0xa0000000, 0x184dd: 0xa0000000, 0x184de: 0xa0000000, 0x184df: 0xa0000000, - 0x184e0: 0x40021220, 0x184e1: 0x4002ba20, 0x184e2: 0x4003e020, 0x184e3: 0x4004ea20, - 0x184e4: 0x4027de20, 0x184e5: 0x4004ec20, 0x184e6: 0x4004e620, 0x184e7: 0x4003d220, - 0x184e8: 0x4003f420, 0x184e9: 0x4003f620, 0x184ea: 0x4004d820, 0x184eb: 0x40093820, - 0x184ec: 0x40024020, 0x184ed: 0x40021a20, 0x184ee: 0x4002e420, 0x184ef: 0x4004e220, - 0x184f0: 0x4029cc20, 0x184f1: 0x4029ce20, 0x184f2: 0x4029d020, 0x184f3: 0x4029d220, - 0x184f4: 0x4029d420, 0x184f5: 0x4029d620, 0x184f6: 0x4029d820, 0x184f7: 0x4029da20, - 0x184f8: 0x4029dc20, 0x184f9: 0x4029de20, 0x184fa: 0x40026c20, 0x184fb: 0x40026220, - 0x184fc: 0x40094020, 0x184fd: 0x40094220, 0x184fe: 0x40094420, 0x184ff: 0x4002c420, - // Block 0x614, offset 0x18500 - 0x18500: 0x4004d620, 0x18501: 0x002bde88, 0x18502: 0x002c0a88, 0x18503: 0x002c3a88, - 0x18504: 0x002c6288, 0x18505: 0xce6d3081, 0x18506: 0x002d0888, 0x18507: 0xc52b2692, - 0x18508: 0x002d6888, 0x18509: 0x002d9a88, 0x1850a: 0x002dcc88, 0x1850b: 0x002dfe88, - 0x1850c: 0xc0030002, 0x1850d: 0x002e8288, 0x1850e: 0x002e9e88, 0x1850f: 0xc33f3081, - 0x18510: 0x002f2c88, 0x18511: 0x002f5688, 0x18512: 0x002f7a88, 0x18513: 0xc3433081, - 0x18514: 0x00302c88, 0x18515: 0x00306c88, 0x18516: 0x0030be88, 0x18517: 0x0030e288, - 0x18518: 0x0030f688, 0x18519: 0x00310088, 0x1851a: 0x00312a88, 0x1851b: 0x4003f820, - 0x1851c: 0x4004e420, 0x1851d: 0x4003fa20, 0x1851e: 0x40062420, 0x1851f: 0x40021620, - 0x18520: 0x40061e20, 0x18521: 0x402bde20, 0x18522: 0x402c0a20, 0x18523: 0x402c3a20, - 0x18524: 0x402c6220, 0x18525: 0xce6b3081, 0x18526: 0x402d0820, 0x18527: 0xc3372681, - 0x18528: 0x402d6820, 0x18529: 0x402d9a20, 0x1852a: 0x402dcc20, 0x1852b: 0x402dfe20, - 0x1852c: 0xc0000002, 0x1852d: 0x402e8220, 0x1852e: 0x402e9e20, 0x1852f: 0xc33d3081, - 0x18530: 0x402f2c20, 0x18531: 0x402f5620, 0x18532: 0x402f7a20, 0x18533: 0xc3413081, - 0x18534: 0x40302c20, 0x18535: 0x40306c20, 0x18536: 0x4030be20, 0x18537: 0x4030e220, - 0x18538: 0x4030f620, 0x18539: 0x40310020, 0x1853a: 0x40312a20, 0x1853b: 0x4003fc20, - 0x1853c: 0x40094820, 0x1853d: 0x4003fe20, 0x1853e: 0x40094c20, 0x1853f: 0xa0000000, - // Block 0x615, offset 0x18540 - 0x18540: 0xe0000d24, 0x18541: 0xe0000d21, 0x18542: 0xe0000d2a, 0x18543: 0xe0000d27, - 0x18544: 0xe0000d69, 0x18545: 0xe0000d66, 0x18546: 0xe0000d7b, 0x18547: 0xe0000d78, - 0x18548: 0xe0000d87, 0x18549: 0xe0000d84, 0x1854a: 0xe0000d81, 0x1854b: 0xe0000d7e, - 0x1854c: 0xe0000ded, 0x1854d: 0xe0000de9, 0x1854e: 0xe0000df5, 0x1854f: 0xe0000df1, - 0x18550: 0xe0000e3d, 0x18551: 0xe0000e39, 0x18552: 0xe0000e35, 0x18553: 0xe0000e31, - 0x18554: 0xe0000ea7, 0x18555: 0xe0000ea4, 0x18556: 0xe0000ead, 0x18557: 0xe0000eaa, - 0x18558: 0xe0000ed6, 0x18559: 0xe0000ed3, 0x1855a: 0xe0000ef4, 0x1855b: 0xe0000ef1, - 0x1855c: 0xe0000efb, 0x1855d: 0xe0000ef7, 0x1855e: 0xe0000f02, 0x1855f: 0xe0000eff, - 0x18560: 0xe0000f41, 0x18561: 0xe0000f3e, 0x18562: 0x002fe883, 0x18563: 0x402fe820, - 0x18564: 0xe0000f26, 0x18565: 0xe0000f22, 0x18566: 0xe0000f3a, 0x18567: 0xe0000f36, - 0x18568: 0xe000296a, 0x18569: 0xe0002967, 0x1856a: 0xe0000f93, 0x1856b: 0xe0000f90, - 0x1856c: 0xe0000f9f, 0x1856d: 0xe0000f9c, 0x1856e: 0xe0000fb1, 0x1856f: 0xe0000fae, - 0x18570: 0xe0000fab, 0x18571: 0xe0000fa8, 0x18572: 0xe0001093, 0x18573: 0xe0001090, - 0x18574: 0xe000109f, 0x18575: 0xe000109c, 0x18576: 0xe0001099, 0x18577: 0xe0001096, - 0x18578: 0xe0001032, 0x18579: 0xe000102e, 0x1857a: 0xe0001046, 0x1857b: 0xe0001042, - 0x1857c: 0xe00010a9, 0x1857d: 0xe00010a6, 0x1857e: 0xe00010af, 0x1857f: 0xe00010ac, - // Block 0x616, offset 0x18580 - 0x18580: 0xe00010d2, 0x18581: 0xe00010cf, 0x18582: 0xe00010cc, 0x18583: 0xe00010c9, - 0x18584: 0xe00010e1, 0x18585: 0xe00010de, 0x18586: 0xe00010e7, 0x18587: 0xe00010e4, - 0x18588: 0xe00010ed, 0x18589: 0xe00010ea, 0x1858a: 0xe00010fc, 0x1858b: 0xe00010f9, - 0x1858c: 0xe00010f6, 0x1858d: 0xe00010f3, 0x1858e: 0xe0001123, 0x1858f: 0xe0001120, - 0x18590: 0xe0001141, 0x18591: 0xe000113e, 0x18592: 0xe0001153, 0x18593: 0xe0001150, - 0x18594: 0xe0001159, 0x18595: 0xe0001156, 0x18596: 0xe0000c15, 0x18597: 0xe0000f8d, - 0x18598: 0xe00010db, 0x18599: 0xe0001111, 0x1859a: 0xf0000404, 0x1859b: 0xe0000f70, - 0x1859c: 0x40300420, 0x1859d: 0x40300620, 0x1859e: 0xe0000f7f, 0x1859f: 0x402c9620, - 0x185a0: 0xe000099b, 0x185a1: 0xe0000998, 0x185a2: 0xe0000989, 0x185a3: 0xe0000986, - 0x185a4: 0xe0000928, 0x185a5: 0xe0000924, 0x185a6: 0xe0000930, 0x185a7: 0xe000092c, - 0x185a8: 0xe0000940, 0x185a9: 0xe000093c, 0x185aa: 0xe0000938, 0x185ab: 0xe0000934, - 0x185ac: 0xe00009aa, 0x185ad: 0xe00009a6, 0x185ae: 0xe0000902, 0x185af: 0xe00008fe, - 0x185b0: 0xe000090a, 0x185b1: 0xe0000906, 0x185b2: 0xe000091a, 0x185b3: 0xe0000916, - 0x185b4: 0xe0000912, 0x185b5: 0xe000090e, 0x185b6: 0xe00009a2, 0x185b7: 0xe000099e, - 0x185b8: 0x002c9a83, 0x185b9: 0x402c9a20, 0x185ba: 0xe0000b5c, 0x185bb: 0xe0000b59, - 0x185bc: 0xe0000b26, 0x185bd: 0xe0000b23, 0x185be: 0xe0000afb, 0x185bf: 0xe0000af7, - // Block 0x617, offset 0x185c0 - 0x185c0: 0xe0000b03, 0x185c1: 0xe0000aff, 0x185c2: 0xe0000b13, 0x185c3: 0xe0000b0f, - 0x185c4: 0xe0000b0b, 0x185c5: 0xe0000b07, 0x185c6: 0xe000b3c5, 0x185c7: 0xe000b3c2, - 0x185c8: 0xe0000c66, 0x185c9: 0xe0000c63, 0x185ca: 0xe0000c78, 0x185cb: 0xe0000c75, - 0x185cc: 0x002ee483, 0x185cd: 0x402ee420, 0x185ce: 0xe0000e44, 0x185cf: 0xe0000e41, - 0x185d0: 0xe0000dad, 0x185d1: 0xe0000da9, 0x185d2: 0xe0000db5, 0x185d3: 0xe0000db1, - 0x185d4: 0xe0000dc5, 0x185d5: 0xe0000dc1, 0x185d6: 0xe0000dbd, 0x185d7: 0xe0000db9, - 0x185d8: 0xe0003c96, 0x185d9: 0xe0003c93, 0x185da: 0xe0000e5d, 0x185db: 0xe0000e59, - 0x185dc: 0xe0000e65, 0x185dd: 0xe0000e61, 0x185de: 0xe0000e75, 0x185df: 0xe0000e71, - 0x185e0: 0xe0000e6d, 0x185e1: 0xe0000e69, 0x185e2: 0xe0003c9c, 0x185e3: 0xe0003c99, - 0x185e4: 0xe000108d, 0x185e5: 0xe000108a, 0x185e6: 0xe000104d, 0x185e7: 0xe000104a, - 0x185e8: 0xe0001066, 0x185e9: 0xe0001062, 0x185ea: 0xe000106e, 0x185eb: 0xe000106a, - 0x185ec: 0xe000107e, 0x185ed: 0xe000107a, 0x185ee: 0xe0001076, 0x185ef: 0xe0001072, - 0x185f0: 0xe0001086, 0x185f1: 0xe0001082, 0x185f2: 0xe0001108, 0x185f3: 0xe0001105, - 0x185f4: 0xe0001135, 0x185f5: 0xe0001132, 0x185f6: 0xe000112f, 0x185f7: 0xe000112c, - 0x185f8: 0xe000111d, 0x185f9: 0xe000111a, 0x185fa: 0xe0000d0a, 0x185fb: 0xe0000d07, - 0x185fc: 0x0030d888, 0x185fd: 0x4030d820, 0x185fe: 0x00312088, 0x185ff: 0x40312020, - // Block 0x618, offset 0x18600 - 0x18600: 0xa0000000, 0x18601: 0xa0000000, 0x18602: 0xa0000000, 0x18603: 0xa0000000, - 0x18604: 0xa0000000, 0x18605: 0xa0000000, 0x18606: 0xa0000000, 0x18607: 0xa0000000, - 0x18608: 0xa0000000, 0x18609: 0x40020020, 0x1860a: 0x40020220, 0x1860b: 0x40020420, - 0x1860c: 0x40020620, 0x1860d: 0x40020820, 0x1860e: 0xa0000000, 0x1860f: 0xa0000000, - 0x18610: 0xa0000000, 0x18611: 0xa0000000, 0x18612: 0xa0000000, 0x18613: 0xa0000000, - 0x18614: 0xa0000000, 0x18615: 0xa0000000, 0x18616: 0xa0000000, 0x18617: 0xa0000000, - 0x18618: 0xa0000000, 0x18619: 0xa0000000, 0x1861a: 0xa0000000, 0x1861b: 0xa0000000, - 0x1861c: 0xa0000000, 0x1861d: 0xa0000000, 0x1861e: 0xa0000000, 0x1861f: 0xa0000000, - 0x18620: 0x40021220, 0x18621: 0x4002ba20, 0x18622: 0x4003e020, 0x18623: 0x4004ea20, - 0x18624: 0x4027de20, 0x18625: 0x4004ec20, 0x18626: 0x4004e620, 0x18627: 0x4003d220, - 0x18628: 0x4003f420, 0x18629: 0x4003f620, 0x1862a: 0x4004d820, 0x1862b: 0x40093820, - 0x1862c: 0x40024020, 0x1862d: 0x40021a20, 0x1862e: 0x4002e420, 0x1862f: 0x4004e220, - 0x18630: 0x4029cc20, 0x18631: 0x4029ce20, 0x18632: 0x4029d020, 0x18633: 0x4029d220, - 0x18634: 0x4029d420, 0x18635: 0x4029d620, 0x18636: 0x4029d820, 0x18637: 0x4029da20, - 0x18638: 0x4029dc20, 0x18639: 0x4029de20, 0x1863a: 0x40026c20, 0x1863b: 0x40026220, - 0x1863c: 0x40094020, 0x1863d: 0x40094220, 0x1863e: 0x40094420, 0x1863f: 0x4002c420, - // Block 0x619, offset 0x18640 - 0x18640: 0x4004d620, 0x18641: 0xcfbf9c81, 0x18642: 0x002c0a88, 0x18643: 0x002c3a88, - 0x18644: 0x002c6288, 0x18645: 0xcfcd9cc1, 0x18646: 0x002d0888, 0x18647: 0x002d2288, - 0x18648: 0x002d6888, 0x18649: 0xcfe19c81, 0x1864a: 0x002dcc88, 0x1864b: 0x002dfe88, - 0x1864c: 0xc0030002, 0x1864d: 0xcfeb9c81, 0x1864e: 0xcff59c81, 0x1864f: 0xcfff9c81, - 0x18650: 0x002f2c88, 0x18651: 0x002f5688, 0x18652: 0x002f7a88, 0x18653: 0x002fe688, - 0x18654: 0x00302c88, 0x18655: 0xd00e9d81, 0x18656: 0x0030be88, 0x18657: 0x0030e288, - 0x18658: 0x0030f688, 0x18659: 0x00310088, 0x1865a: 0x00312a88, 0x1865b: 0x4003f820, - 0x1865c: 0x4004e420, 0x1865d: 0x4003fa20, 0x1865e: 0x40062420, 0x1865f: 0x40021620, - 0x18660: 0x40061e20, 0x18661: 0xcfba9c81, 0x18662: 0x402c0a20, 0x18663: 0x402c3a20, - 0x18664: 0x402c6220, 0x18665: 0xcfc49cc1, 0x18666: 0x402d0820, 0x18667: 0x402d2220, - 0x18668: 0x402d6820, 0x18669: 0xcfdc9c81, 0x1866a: 0x402dcc20, 0x1866b: 0x402dfe20, - 0x1866c: 0xc0000002, 0x1866d: 0xcfe69c81, 0x1866e: 0xcff09c81, 0x1866f: 0xcffa9c81, - 0x18670: 0x402f2c20, 0x18671: 0x402f5620, 0x18672: 0x402f7a20, 0x18673: 0x402fe620, - 0x18674: 0x40302c20, 0x18675: 0xd0049d81, 0x18676: 0x4030be20, 0x18677: 0x4030e220, - 0x18678: 0x4030f620, 0x18679: 0x40310020, 0x1867a: 0x40312a20, 0x1867b: 0x4003fc20, - 0x1867c: 0x40094820, 0x1867d: 0x4003fe20, 0x1867e: 0x40094c20, 0x1867f: 0xa0000000, - // Block 0x61a, offset 0x18680 - 0x18680: 0x002bde63, 0x18681: 0x002bde23, 0x18682: 0xe0000921, 0x18683: 0xe0000969, - 0x18684: 0xe000095b, 0x18685: 0xe000094d, 0x18686: 0xe00009dd, 0x18687: 0xe0000a53, - 0x18688: 0x002c9863, 0x18689: 0x002c9823, 0x1868a: 0xcfd99d51, 0x1868b: 0xe0000b20, - 0x1868c: 0x002d9a63, 0x1868d: 0x002d9a23, 0x1868e: 0xe0000c37, 0x1868f: 0xe0000c43, - 0x18690: 0xe0000ab3, 0x18691: 0xe0000d63, 0x18692: 0x002ee263, 0x18693: 0x002ee223, - 0x18694: 0xe0000da6, 0x18695: 0xe0000de6, 0x18696: 0xe0000dd2, 0x18697: 0x40093e20, - 0x18698: 0xe0000e12, 0x18699: 0x00306c63, 0x1869a: 0x00306c23, 0x1869b: 0xe0000fed, - 0x1869c: 0x00306d23, 0x1869d: 0xe0001102, 0x1869e: 0x00318888, 0x1869f: 0xe0000f7b, - 0x186a0: 0x402bde1f, 0x186a1: 0x402bde1d, 0x186a2: 0xe000091e, 0x186a3: 0xe0000966, - 0x186a4: 0xe0000958, 0x186a5: 0xe000094a, 0x186a6: 0xe00009d5, 0x186a7: 0xe0000a4d, - 0x186a8: 0x402c981f, 0x186a9: 0x402c981d, 0x186aa: 0xcfd69d51, 0x186ab: 0xe0000b1d, - 0x186ac: 0x402d9a1f, 0x186ad: 0x402d9a1d, 0x186ae: 0xe0000c34, 0x186af: 0xe0000c40, - 0x186b0: 0xe0000aad, 0x186b1: 0xe0000d60, 0x186b2: 0x402ee21f, 0x186b3: 0x402ee21d, - 0x186b4: 0xe0000da3, 0x186b5: 0xe0000de3, 0x186b6: 0xe0000dcf, 0x186b7: 0x40093c20, - 0x186b8: 0xe0000e0f, 0x186b9: 0x40306c1f, 0x186ba: 0x40306c1d, 0x186bb: 0xe0000fea, - 0x186bc: 0x40306c25, 0x186bd: 0xe00010ff, 0x186be: 0x40318820, 0x186bf: 0xe0001114, - // Block 0x61b, offset 0x186c0 - 0x186c0: 0x002bde03, 0x186c1: 0x402bde1c, 0x186c2: 0xe00008fb, 0x186c3: 0xe00008f8, - 0x186c4: 0xe000097d, 0x186c5: 0xe000097a, 0x186c6: 0xe0000a38, 0x186c7: 0xe0000a35, - 0x186c8: 0xe0000a3e, 0x186c9: 0xe0000a3b, 0x186ca: 0xe0000a4a, 0x186cb: 0xe0000a47, - 0x186cc: 0xe0000a44, 0x186cd: 0xe0000a41, 0x186ce: 0xe0000a86, 0x186cf: 0xe0000a83, - 0x186d0: 0xe0000aaa, 0x186d1: 0xe0000aa7, 0x186d2: 0x002c9803, 0x186d3: 0x402c981c, - 0x186d4: 0xe0000aee, 0x186d5: 0xe0000aeb, 0x186d6: 0xe0000b2c, 0x186d7: 0xe0000b29, - 0x186d8: 0xe0000b40, 0x186d9: 0xe0000b3d, 0x186da: 0x002c9843, 0x186db: 0x402c981e, - 0x186dc: 0xe0000bb8, 0x186dd: 0xe0000bb5, 0x186de: 0xe0000bb2, 0x186df: 0xe0000baf, - 0x186e0: 0xe0000bc4, 0x186e1: 0xe0000bc1, 0x186e2: 0xe0000bca, 0x186e3: 0xe0000bc7, - 0x186e4: 0xe0000bee, 0x186e5: 0xe0000beb, 0x186e6: 0xe0000c1b, 0x186e7: 0xe0000c18, - 0x186e8: 0xe0000c51, 0x186e9: 0xe0000c4e, 0x186ea: 0x002d9a03, 0x186eb: 0x402d9a1c, - 0x186ec: 0xe0000c31, 0x186ed: 0xe0000c2e, 0x186ee: 0xe0000c5a, 0x186ef: 0xe0000c57, - 0x186f0: 0xe0000c54, 0x186f1: 0x402da220, 0x186f2: 0xf0000a0a, 0x186f3: 0xf0000404, - 0x186f4: 0xe0000c8a, 0x186f5: 0xe0000c87, 0x186f6: 0xe0000c9f, 0x186f7: 0xe0000c9c, - 0x186f8: 0x402f7220, 0x186f9: 0xe0000ccc, 0x186fa: 0xe0000cc9, 0x186fb: 0xe0000cd8, - 0x186fc: 0xe0000cd5, 0x186fd: 0xe0000cd2, 0x186fe: 0xe0000ccf, 0x186ff: 0xe0000d04, - // Block 0x61c, offset 0x18700 - 0x18700: 0xe0000cfe, 0x18701: 0xe0000cf8, 0x18702: 0xe0000cf5, 0x18703: 0x002e9e23, - 0x18704: 0x402e9e1d, 0x18705: 0xe0000d6f, 0x18706: 0xe0000d6c, 0x18707: 0x002e9e43, - 0x18708: 0x402e9e1e, 0x18709: 0xf0000404, 0x1870a: 0x002eda88, 0x1870b: 0x402eda20, - 0x1870c: 0x002ee203, 0x1870d: 0x402ee21c, 0x1870e: 0xe0000da0, 0x1870f: 0xe0000d9d, - 0x18710: 0xe0000de0, 0x18711: 0xe0000ddd, 0x18712: 0xe0000e93, 0x18713: 0xe0000e8f, - 0x18714: 0xe0000eca, 0x18715: 0xe0000ec7, 0x18716: 0xe0000edc, 0x18717: 0xe0000ed9, - 0x18718: 0xe0000ed0, 0x18719: 0xe0000ecd, 0x1871a: 0xe0000f1f, 0x1871b: 0xe0000f1c, - 0x1871c: 0xe0000f2d, 0x1871d: 0xe0000f2a, 0x1871e: 0xe0000f47, 0x1871f: 0xe0000f44, - 0x18720: 0xe0000f33, 0x18721: 0xe0000f30, 0x18722: 0xe0000f99, 0x18723: 0xe0000f96, - 0x18724: 0xe0000f8a, 0x18725: 0xe0000f87, 0x18726: 0x00303688, 0x18727: 0x40303620, - 0x18728: 0xe000102b, 0x18729: 0xe0001028, 0x1872a: 0x00306c03, 0x1872b: 0x40306c1c, - 0x1872c: 0xe0000fe7, 0x1872d: 0xe0000fe4, 0x1872e: 0xe0000ff9, 0x1872f: 0xe0000ff6, - 0x18730: 0xe0001025, 0x18731: 0xe0001022, 0x18732: 0xe0001039, 0x18733: 0xe0001036, - 0x18734: 0xe00010d8, 0x18735: 0xe00010d5, 0x18736: 0xe000110e, 0x18737: 0xe000110b, - 0x18738: 0xe0001117, 0x18739: 0xe000113b, 0x1873a: 0xe0001138, 0x1873b: 0xe000114d, - 0x1873c: 0xe000114a, 0x1873d: 0xe0001147, 0x1873e: 0xe0001144, 0x1873f: 0xe0000f64, - // Block 0x61d, offset 0x18740 - 0x18740: 0x40321220, 0x18741: 0x40321a20, 0x18742: 0x40322220, 0x18743: 0x40322a20, - 0x18744: 0xe0000ad5, 0x18745: 0xe0000ad1, 0x18746: 0xe0000acd, 0x18747: 0xf0000a0a, - 0x18748: 0xf000040a, 0x18749: 0xf0000404, 0x1874a: 0xf0000a0a, 0x1874b: 0xf000040a, - 0x1874c: 0xf0000404, 0x1874d: 0x002bde43, 0x1874e: 0x402bde1e, 0x1874f: 0x002d9a43, - 0x18750: 0x402d9a1e, 0x18751: 0x002ee243, 0x18752: 0x402ee21e, 0x18753: 0x00306c43, - 0x18754: 0x40306c1e, 0x18755: 0x00306ca3, 0x18756: 0x40306c21, 0x18757: 0x00306cc3, - 0x18758: 0x40306c22, 0x18759: 0x00306ce3, 0x1875a: 0x40306c23, 0x1875b: 0x00306d03, - 0x1875c: 0x40306c24, 0x1875d: 0x402cae20, 0x1875e: 0xe000b51f, 0x1875f: 0xe000b51c, - 0x18760: 0xe000b525, 0x18761: 0xe000b522, 0x18762: 0xe00009f4, 0x18763: 0xe00009ef, - 0x18764: 0x002d3a88, 0x18765: 0x402d3a20, 0x18766: 0xe0000bbe, 0x18767: 0xe0000bbb, - 0x18768: 0xe0000c99, 0x18769: 0xe0000c96, 0x1876a: 0xe0000e20, 0x1876b: 0xe0000e1d, - 0x1876c: 0xe000b579, 0x1876d: 0xe000b576, 0x1876e: 0xe0001162, 0x1876f: 0xe000115f, - 0x18770: 0xe0000c8d, 0x18771: 0xf0000a0a, 0x18772: 0xf000040a, 0x18773: 0xf0000404, - 0x18774: 0xe0000bac, 0x18775: 0xe0000ba9, 0x18776: 0x002d7888, 0x18777: 0x00319488, - 0x18778: 0x002e9e63, 0x18779: 0x402e9e1f, 0x1877a: 0xe000b537, 0x1877b: 0xe000b534, - 0x1877c: 0xe00009ea, 0x1877d: 0xe00009e5, 0x1877e: 0xe0000e19, 0x1877f: 0xe0000e15, - // Block 0x61e, offset 0x18780 - 0x18780: 0xe000098f, 0x18781: 0xe000098c, 0x18782: 0xe0000995, 0x18783: 0xe0000992, - 0x18784: 0xe0000b62, 0x18785: 0xe0000b5f, 0x18786: 0xe0000b68, 0x18787: 0xe0000b65, - 0x18788: 0xe0000c6c, 0x18789: 0xe0000c69, 0x1878a: 0xe0000c72, 0x1878b: 0xe0000c6f, - 0x1878c: 0xe0000e4a, 0x1878d: 0xe0000e47, 0x1878e: 0xe0000e50, 0x1878f: 0xe0000e4d, - 0x18790: 0xe0000ee8, 0x18791: 0xe0000ee5, 0x18792: 0xe0000eee, 0x18793: 0xe0000eeb, - 0x18794: 0xe0001053, 0x18795: 0xe0001050, 0x18796: 0xe0001059, 0x18797: 0xe0001056, - 0x18798: 0xe0000f61, 0x18799: 0xe0000f5e, 0x1879a: 0xe0000fa5, 0x1879b: 0xe0000fa2, - 0x1879c: 0x00312288, 0x1879d: 0x40312220, 0x1879e: 0xe0000bf4, 0x1879f: 0xe0000bf1, - 0x187a0: 0x002ebc88, 0x187a1: 0x402c8c20, 0x187a2: 0x002f2288, 0x187a3: 0x402f2220, - 0x187a4: 0x00314088, 0x187a5: 0x40314020, 0x187a6: 0xe000096f, 0x187a7: 0xe000096c, - 0x187a8: 0xe0000b32, 0x187a9: 0xe0000b2f, 0x187aa: 0xe000b567, 0x187ab: 0xe000b564, - 0x187ac: 0xe000b56d, 0x187ad: 0xe000b56a, 0x187ae: 0xe0000e04, 0x187af: 0xe0000e01, - 0x187b0: 0xe000b573, 0x187b1: 0xe000b570, 0x187b2: 0xe0001129, 0x187b3: 0xe0001126, - 0x187b4: 0x402e5e20, 0x187b5: 0x402ed020, 0x187b6: 0x40305a20, 0x187b7: 0x402dd420, - 0x187b8: 0xe0000abf, 0x187b9: 0xe0000ec4, 0x187ba: 0x002be888, 0x187bb: 0x002c4488, - 0x187bc: 0x402c4420, 0x187bd: 0x002e3888, 0x187be: 0x00303e88, 0x187bf: 0x402ffc20, - // Block 0x61f, offset 0x187c0 - 0x187c0: 0xe00009b1, 0x187c1: 0xe00009ae, 0x187c2: 0xe0000a22, 0x187c3: 0xe0000a1f, - 0x187c4: 0xe0000a28, 0x187c5: 0xe0000a25, 0x187c6: 0xe0000a2e, 0x187c7: 0xe0000a2b, - 0x187c8: 0xe0000a5a, 0x187c9: 0xe0000a56, 0x187ca: 0xe0000a8c, 0x187cb: 0xe0000a89, - 0x187cc: 0xe0000a98, 0x187cd: 0xe0000a95, 0x187ce: 0xe0000aa4, 0x187cf: 0xe0000aa1, - 0x187d0: 0xe0000a92, 0x187d1: 0xe0000a8f, 0x187d2: 0xe0000a9e, 0x187d3: 0xe0000a9b, - 0x187d4: 0xe000b54f, 0x187d5: 0xe000b54c, 0x187d6: 0xe000b549, 0x187d7: 0xe000b546, - 0x187d8: 0xe0000b7c, 0x187d9: 0xe0000b79, 0x187da: 0xe0000b82, 0x187db: 0xe0000b7f, - 0x187dc: 0xe0000b39, 0x187dd: 0xe0000b35, 0x187de: 0xe0000b8c, 0x187df: 0xe0000b89, - 0x187e0: 0xe0000bd0, 0x187e1: 0xe0000bcd, 0x187e2: 0xe0000c00, 0x187e3: 0xe0000bfd, - 0x187e4: 0xe0000c0c, 0x187e5: 0xe0000c09, 0x187e6: 0xe0000bfa, 0x187e7: 0xe0000bf7, - 0x187e8: 0xe0000c06, 0x187e9: 0xe0000c03, 0x187ea: 0xe0000c12, 0x187eb: 0xe0000c0f, - 0x187ec: 0xe0000c7e, 0x187ed: 0xe0000c7b, 0x187ee: 0xe000b555, 0x187ef: 0xe000b552, - 0x187f0: 0xe0000c93, 0x187f1: 0xe0000c90, 0x187f2: 0xe0000cab, 0x187f3: 0xe0000ca8, - 0x187f4: 0xe0000cb1, 0x187f5: 0xe0000cae, 0x187f6: 0xe0000cde, 0x187f7: 0xe0000cdb, - 0x187f8: 0xe0000ce5, 0x187f9: 0xe0000ce1, 0x187fa: 0xe0000cf2, 0x187fb: 0xe0000cef, - 0x187fc: 0xe0000cec, 0x187fd: 0xe0000ce9, 0x187fe: 0x002e8223, 0x187ff: 0x402e821d, - // Block 0x620, offset 0x18800 - 0x18800: 0xe0000d24, 0x18801: 0xe0000d21, 0x18802: 0xe0000d2a, 0x18803: 0xe0000d27, - 0x18804: 0xe0000d69, 0x18805: 0xe0000d66, 0x18806: 0xe0000d7b, 0x18807: 0xe0000d78, - 0x18808: 0xe0000d87, 0x18809: 0xe0000d84, 0x1880a: 0xe0000d81, 0x1880b: 0xe0000d7e, - 0x1880c: 0xe000b585, 0x1880d: 0xe000b582, 0x1880e: 0xe0000df5, 0x1880f: 0xe0000df1, - 0x18810: 0xe000b561, 0x18811: 0xe000b55e, 0x18812: 0xe000b55b, 0x18813: 0xe000b558, - 0x18814: 0xe0000ea7, 0x18815: 0xe0000ea4, 0x18816: 0xe0000ead, 0x18817: 0xe0000eaa, - 0x18818: 0xe0000ed6, 0x18819: 0xe0000ed3, 0x1881a: 0xe0000ef4, 0x1881b: 0xe0000ef1, - 0x1881c: 0xe0000efb, 0x1881d: 0xe0000ef7, 0x1881e: 0xe0000f02, 0x1881f: 0xe0000eff, - 0x18820: 0xe0000f41, 0x18821: 0xe0000f3e, 0x18822: 0xe0000f53, 0x18823: 0xe0000f50, - 0x18824: 0xe0000f26, 0x18825: 0xe0000f22, 0x18826: 0xe0000f3a, 0x18827: 0xe0000f36, - 0x18828: 0xe0000f5a, 0x18829: 0xe0000f56, 0x1882a: 0xe0000f93, 0x1882b: 0xe0000f90, - 0x1882c: 0xe0000f9f, 0x1882d: 0xe0000f9c, 0x1882e: 0xe0000fb1, 0x1882f: 0xe0000fae, - 0x18830: 0xe0000fab, 0x18831: 0xe0000fa8, 0x18832: 0xe0001093, 0x18833: 0xe0001090, - 0x18834: 0xe000109f, 0x18835: 0xe000109c, 0x18836: 0xe0001099, 0x18837: 0xe0001096, - 0x18838: 0xe000b5a3, 0x18839: 0xe000b5a0, 0x1883a: 0xe000b59d, 0x1883b: 0xe000b59a, - 0x1883c: 0xe00010a9, 0x1883d: 0xe00010a6, 0x1883e: 0xe00010af, 0x1883f: 0xe00010ac, - // Block 0x621, offset 0x18840 - 0x18840: 0xe00010d2, 0x18841: 0xe00010cf, 0x18842: 0xe00010cc, 0x18843: 0xe00010c9, - 0x18844: 0xe00010e1, 0x18845: 0xe00010de, 0x18846: 0xe00010e7, 0x18847: 0xe00010e4, - 0x18848: 0xe00010ed, 0x18849: 0xe00010ea, 0x1884a: 0xe00010fc, 0x1884b: 0xe00010f9, - 0x1884c: 0xe00010f6, 0x1884d: 0xe00010f3, 0x1884e: 0xe0001123, 0x1884f: 0xe0001120, - 0x18850: 0xe0001141, 0x18851: 0xe000113e, 0x18852: 0xe0001153, 0x18853: 0xe0001150, - 0x18854: 0xe0001159, 0x18855: 0xe0001156, 0x18856: 0xe0000c15, 0x18857: 0xe0000f8d, - 0x18858: 0xe00010db, 0x18859: 0xe0001111, 0x1885a: 0xf0000404, 0x1885b: 0xe0000f70, - 0x1885c: 0x40300420, 0x1885d: 0x40300620, 0x1885e: 0xe0000f7f, 0x1885f: 0x402c9620, - 0x18860: 0xe000099b, 0x18861: 0xe0000998, 0x18862: 0xe0000989, 0x18863: 0xe0000986, - 0x18864: 0xe000b531, 0x18865: 0xe000b52e, 0x18866: 0xe000b543, 0x18867: 0xe000b540, - 0x18868: 0xe0000940, 0x18869: 0xe000093c, 0x1886a: 0xe0000938, 0x1886b: 0xe0000934, - 0x1886c: 0xe00009aa, 0x1886d: 0xe00009a6, 0x1886e: 0xe000b52b, 0x1886f: 0xe000b528, - 0x18870: 0xe000b53d, 0x18871: 0xe000b53a, 0x18872: 0xe000091a, 0x18873: 0xe0000916, - 0x18874: 0xe0000912, 0x18875: 0xe000090e, 0x18876: 0xe00009a2, 0x18877: 0xe000099e, - 0x18878: 0xe0000b6e, 0x18879: 0xe0000b6b, 0x1887a: 0xe0000b5c, 0x1887b: 0xe0000b59, - 0x1887c: 0xe0000b26, 0x1887d: 0xe0000b23, 0x1887e: 0x002c98c3, 0x1887f: 0x402c9822, - // Block 0x622, offset 0x18880 - 0x18880: 0x002c9903, 0x18881: 0x402c9824, 0x18882: 0xe0000b13, 0x18883: 0xe0000b0f, - 0x18884: 0xe0000b0b, 0x18885: 0xe0000b07, 0x18886: 0xe0000b75, 0x18887: 0xe0000b71, - 0x18888: 0xe0000c66, 0x18889: 0xe0000c63, 0x1888a: 0xe0000c78, 0x1888b: 0xe0000c75, - 0x1888c: 0xe0000e84, 0x1888d: 0xe0000e81, 0x1888e: 0xe0000e44, 0x1888f: 0xe0000e41, - 0x18890: 0xe000b57f, 0x18891: 0xe000b57c, 0x18892: 0xe000b591, 0x18893: 0xe000b58e, - 0x18894: 0xe0000dc5, 0x18895: 0xe0000dc1, 0x18896: 0xe0000dbd, 0x18897: 0xe0000db9, - 0x18898: 0xe0000e8b, 0x18899: 0xe0000e87, 0x1889a: 0xe000b58b, 0x1889b: 0xe000b588, - 0x1889c: 0xe000b597, 0x1889d: 0xe000b594, 0x1889e: 0xe0000e75, 0x1889f: 0xe0000e71, - 0x188a0: 0xe0000e6d, 0x188a1: 0xe0000e69, 0x188a2: 0xe0000e7d, 0x188a3: 0xe0000e79, - 0x188a4: 0xe000108d, 0x188a5: 0xe000108a, 0x188a6: 0xe000104d, 0x188a7: 0xe000104a, - 0x188a8: 0xe000b5a9, 0x188a9: 0xe000b5a6, 0x188aa: 0xe000b5af, 0x188ab: 0xe000b5ac, - 0x188ac: 0xe000107e, 0x188ad: 0xe000107a, 0x188ae: 0xe0001076, 0x188af: 0xe0001072, - 0x188b0: 0xe0001086, 0x188b1: 0xe0001082, 0x188b2: 0xe0001108, 0x188b3: 0xe0001105, - 0x188b4: 0xe0001135, 0x188b5: 0xe0001132, 0x188b6: 0xe000112f, 0x188b7: 0xe000112c, - 0x188b8: 0xe000111d, 0x188b9: 0xe000111a, 0x188ba: 0xe0000d0a, 0x188bb: 0xe0000d07, - 0x188bc: 0x0030d888, 0x188bd: 0x4030d820, 0x188be: 0x00312088, 0x188bf: 0x40312020, - // Block 0x623, offset 0x188c0 - 0x188c0: 0x6d200220, 0x188c1: 0x6c16fe20, 0x188c2: 0x6d0bdc20, 0x188c3: 0x6d1b3420, - 0x188c4: 0x6d0bd620, 0x188c5: 0x6cc58020, 0x188c6: 0x6c6ece20, 0x188c7: 0xe000240a, - 0x188c8: 0x6c29ae20, 0x188c9: 0x6c29ca20, 0x188ca: 0x6c100220, 0x188cb: 0x6c6b9220, - 0x188cc: 0x6cff9e20, 0x188cd: 0x6cffa020, 0x188ce: 0x6cf39620, 0x188cf: 0x6cedd020, - 0x188d0: 0x6cedd220, 0x188d1: 0x6cf39820, 0x188d2: 0x6cd8fa20, 0x188d3: 0x6d10c420, - 0x188d4: 0x6c630820, 0x188d5: 0x6c616620, 0x188d6: 0x6d036620, 0x188d7: 0x6d036820, - 0x188d8: 0x6cd49220, 0x188d9: 0x6cdbee20, 0x188db: 0x6cc64c20, - 0x188dc: 0x6cc63420, 0x188dd: 0x6d266620, 0x188de: 0x6c271e20, 0x188df: 0x2ca22083, - 0x188e0: 0x6c9f8820, 0x188e1: 0x6cd74220, 0x188e2: 0x6cd74420, 0x188e3: 0x6c0c6c20, - 0x188e4: 0x6d2ff820, 0x188e5: 0x6d2ff220, 0x188e6: 0x6cbb3620, 0x188e7: 0x6ca96420, - 0x188e8: 0x6cc38820, 0x188e9: 0xe000243f, 0x188ea: 0xe0002442, 0x188eb: 0x6ca2c020, - 0x188ec: 0x6cd2f220, 0x188ed: 0x6cd40820, 0x188ee: 0x6cd30220, 0x188ef: 0x6cd86820, - 0x188f0: 0x6cd86a20, 0x188f1: 0x6c429620, 0x188f2: 0x6cee4220, 0x188f3: 0xe0002451, - 0x188f4: 0x6cee4020, 0x188f5: 0xe000244e, 0x188f6: 0x6cc5ba20, 0x188f7: 0x6cc60a20, - 0x188f8: 0x02ff1684, 0x188f9: 0x03000484, 0x188fa: 0x6d24ba20, 0x188fb: 0x6d24bc20, - 0x188fc: 0x6cc78020, 0x188fd: 0x6c719e20, 0x188fe: 0x6c12be20, 0x188ff: 0x6c12c220, - // Block 0x624, offset 0x18900 - 0x18900: 0x6c12c420, 0x18901: 0x6c562e20, 0x18902: 0x6d199a20, 0x18903: 0x6cf76620, - 0x18904: 0x6cf94e20, 0x18905: 0x6c673620, 0x18906: 0x0313a484, 0x18907: 0xe000246c, - 0x18908: 0x6d0d2e20, 0x18909: 0x6c077420, 0x1890a: 0xe000246f, 0x1890b: 0x6c17e220, - 0x1890c: 0x6c21a220, 0x1890d: 0x6c21a620, 0x1890e: 0x6c21f020, 0x1890f: 0x6c3f9a20, - 0x18910: 0x6c6c7c20, 0x18911: 0x6c16dc20, 0x18912: 0x6c16de20, 0x18913: 0x6d2f1620, - 0x18914: 0x6c9ae820, 0x18915: 0xe000247b, 0x18916: 0x6c3f9c20, 0x18917: 0x6d222020, - 0x18918: 0x6cbe6a20, 0x18919: 0x6cef7e20, 0x1891a: 0x6d13ae20, 0x1891b: 0x6c3c9820, - 0x1891c: 0x6c3a3020, 0x1891d: 0x6cd29c20, 0x1891e: 0xe0002481, 0x1891f: 0x6cd29e20, - 0x18920: 0x6cd2a020, 0x18921: 0xe0002484, 0x18922: 0x6c96ae20, 0x18923: 0x6c476c20, - 0x18924: 0x6c4b2420, 0x18925: 0x6d220e20, 0x18926: 0x6ca7ce20, 0x18927: 0x6c920a20, - 0x18928: 0x6c975620, 0x18929: 0x6c5a4020, 0x1892a: 0x6c9e4820, 0x1892b: 0x6cb6bc20, - 0x1892c: 0x6cb6be20, 0x1892d: 0x6c1bd020, 0x1892e: 0x6c1bd220, 0x1892f: 0x6c902820, - 0x18930: 0x6c902a20, 0x18931: 0x6c4ab620, 0x18932: 0x6c4ab420, 0x18933: 0x2c4a3883, - // Block 0x625, offset 0x18940 - 0x18940: 0x2d13b686, 0x18941: 0x2c4bb683, 0x18942: 0x2d3a5283, 0x18943: 0x2cb1dc83, - 0x18944: 0x2d15aa84, 0x18945: 0x2c73be83, 0x18946: 0x2c37b486, 0x18947: 0x2ce7e283, - 0x18948: 0x2cc55a84, 0x18949: 0x2c372e83, 0x1894a: 0x2cc80e83, 0x1894b: 0x2c030a84, - 0x1894c: 0x2c6ed083, 0x1894d: 0x2c9d1683, 0x1894e: 0x2c0d9e83, 0x1894f: 0x2c610c83, - 0x18950: 0x2cb9ec83, 0x18951: 0x2c29b083, 0x18952: 0x2c855c83, 0x18953: 0x2c059c83, - 0x18954: 0x2c08aa83, 0x18955: 0x2c397e83, 0x18956: 0x2cf83483, 0x18957: 0x2cd22485, - 0x18958: 0x2c100483, 0x18959: 0x2c6a4e83, 0x1895a: 0x2c16e083, 0x1895b: 0x2cd7b483, - 0x1895c: 0x2d200483, 0x1895d: 0x2c79c883, 0x1895e: 0x2ceed683, 0x1895f: 0x2ce91084, - 0x18960: 0x2cd2e283, 0x18961: 0x2d34ca83, 0x18962: 0x2cdba683, 0x18963: 0x2cf55a83, - 0x18964: 0x2c26e483, 0x18965: 0x2caa6e84, 0x18966: 0x2d3f6883, 0x18967: 0x2c9db683, - 0x18968: 0x2c25b083, 0x18969: 0x2cffa283, 0x1896a: 0x2d1edc83, 0x1896b: 0x2cd18a83, - 0x1896c: 0x2c17fa83, 0x1896d: 0x2cccb083, 0x1896e: 0x2c1fd683, 0x1896f: 0x2c454a83, - 0x18970: 0x2c610e83, 0x18971: 0x2c6c1a83, 0x18972: 0x2c420a83, 0x18973: 0x2d107e83, - 0x18974: 0x2c4a0283, 0x18975: 0x2d1ac083, 0x18976: 0x2c45cc83, 0x18977: 0x2d163c83, - 0x18978: 0x2c454c83, 0x18979: 0x2c616883, 0x1897a: 0x2cccb283, 0x1897b: 0x2c1bd483, - 0x1897c: 0x2d02a283, 0x1897d: 0x2c436083, 0x1897e: 0x2c563883, 0x1897f: 0x2cd43684, - // Block 0x626, offset 0x18980 - 0x18980: 0x2d337e83, 0x18981: 0x2cb3fc83, 0x18982: 0x2cf17a84, 0x18983: 0x2c30f883, - 0x18984: 0x2c6c1e83, 0x18985: 0x2c398083, 0x18986: 0x2cf39a83, 0x18987: 0x2cc63684, - 0x18988: 0x2d264283, 0x18989: 0x2d266885, 0x1898a: 0x2ca25c84, 0x1898b: 0x2cba3883, - 0x1898c: 0x2d34cc83, 0x1898d: 0x2c271283, 0x1898e: 0x2cd49883, 0x1898f: 0x2cf39c83, - 0x18990: 0x2c08ac83, 0x18991: 0x2c98c083, 0x18992: 0x2cd2e483, 0x18993: 0x2cb72683, - 0x18994: 0x2cd70284, 0x18995: 0x2c5d8484, 0x18996: 0x2d2f8083, 0x18997: 0x2c3fa083, - 0x18998: 0x2d10c683, 0x18999: 0x2cac5083, 0x1899a: 0x2cb14483, 0x1899b: 0x2d0b0883, - 0x1899c: 0x2ca96683, 0x1899d: 0x2cc34c83, 0x1899e: 0x2d07fa83, 0x1899f: 0x2d22b883, - 0x189a0: 0x2c483e83, 0x189a1: 0x2cec0c83, 0x189a2: 0x2c415c83, 0x189a3: 0x2cd0d284, - 0x189a4: 0x2d1e6c83, 0x189a5: 0x2ce47e83, 0x189a6: 0x2cb04483, 0x189a7: 0x2ca54083, - 0x189a8: 0x2c0e4683, 0x189a9: 0x2c040883, 0x189aa: 0x2cafa883, 0x189ab: 0x2c9f8a83, - 0x189ac: 0x2ca26483, 0x189ad: 0x2c98c283, 0x189ae: 0x2cd2a883, 0x189af: 0x2cd22c83, - 0x189b0: 0x2cd2f483, 0x189b1: 0x2cc74083, 0x189b2: 0x2c50b283, 0x189b3: 0x2d08f283, - 0x189b4: 0x2c856c83, 0x189b5: 0x2d39f083, 0x189b6: 0x2c9cd683, 0x189b7: 0x2c9d1a83, - 0x189b8: 0x2c3d1a83, 0x189b9: 0x2cedf483, 0x189ba: 0x2d0f7683, 0x189bb: 0x2d221c83, - 0x189bc: 0x2c819a83, 0x189bd: 0x2c373083, 0x189be: 0x2c82b283, 0x189bf: 0x2c378483, - // Block 0x627, offset 0x189c0 - 0x189c0: 0x2d22c683, 0x189c1: 0x2cc78283, 0x189c2: 0x2c189483, 0x189c3: 0x2d3f2a83, - 0x189c4: 0x2d357083, 0x189c5: 0x2c6fd083, 0x189c6: 0x2ccf0683, 0x189c7: 0x2c201683, - 0x189c8: 0x2d385283, 0x189c9: 0x2c449e83, 0x189ca: 0x2ccb1483, 0x189cb: 0x2c12aa83, - 0x189cc: 0x2c549483, 0x189cd: 0x2c1d0883, 0x189ce: 0x2d093883, 0x189cf: 0x2d03ba83, - 0x189d0: 0x2d13be83, 0x189d1: 0x2d0b7083, 0x189d2: 0x2c665283, 0x189d3: 0x2c68c683, - 0x189d4: 0x2d0c5c83, 0x189d5: 0x2c475c83, 0x189d6: 0x2c30fa83, 0x189d7: 0x2cd2b083, - 0x189d8: 0x2d357c83, 0x189d9: 0x2c06dc83, 0x189da: 0x2c1be883, 0x189db: 0x2d407e84, - 0x189dc: 0x2d40a683, 0x189dd: 0x2ccfa483, 0x189de: 0x2c17ce83, 0x189df: 0x2d02ae83, - 0x189e0: 0x2c18a083, 0x189e1: 0x2c21a883, 0x189e2: 0x2d169e83, 0x189e3: 0x2d1fa483, - 0x189e4: 0x2c0b7883, 0x189e5: 0x2c84fc83, 0x189e6: 0x2c6c2e84, 0x189e7: 0x2d2f0083, - 0x189e8: 0x2c9ac683, 0x189e9: 0x2c3fba83, 0x189ea: 0x2c859883, 0x189eb: 0x2d3c5683, - 0x189ec: 0x2d222283, 0x189ed: 0x2cbe3083, 0x189ee: 0x2c39f283, 0x189ef: 0x2c9e5683, - 0x189f0: 0x2c43d083, 0x189f1: 0x2ceeee83, 0x189f2: 0x2c6fb483, 0x189f3: 0x2d19ba83, - 0x189f4: 0x2d12dc83, 0x189f5: 0x2c3c2c83, 0x189f6: 0x2c39f483, 0x189f7: 0x2cd25883, - 0x189f8: 0x2cd44283, 0x189f9: 0x2cfd6683, 0x189fa: 0x2c969883, 0x189fb: 0x2c476e83, - 0x189fc: 0x2c42bc83, 0x189fd: 0x2c0bf483, 0x189fe: 0x2c310e83, 0x189ff: 0x2c170e83, - // Block 0x628, offset 0x18a00 - 0x18a00: 0x2c43e083, 0x18a01: 0x2c4ae283, 0x18a02: 0x2d211283, 0x18a03: 0x2ca79a83, - 0x18a04: 0x2c91bc83, 0x18a05: 0x2c924c83, 0x18a06: 0x2c973283, 0x18a07: 0x2c966883, - 0x18a08: 0x2c59ce83, 0x18a09: 0x2cd56083, 0x18a0a: 0x2c521c83, 0x18a0b: 0x2d353483, - 0x18a0c: 0x2c9e3283, 0x18a0d: 0x2c2f7483, 0x18a0e: 0x2c47a683, 0x18a0f: 0x2cd56683, - 0x18a10: 0x2c08a283, 0x18a11: 0x2cb63483, 0x18a12: 0x2c1bc283, 0x18a13: 0x2c8fb083, - 0x18a14: 0x2c4a9683, 0x18a15: 0x2d26f683, - 0x18a30: 0x40273a20, 0x18a31: 0x40273c20, 0x18a32: 0x40273e20, 0x18a33: 0x40274020, - 0x18a34: 0x40274220, 0x18a35: 0x40274420, 0x18a36: 0x40274620, 0x18a37: 0x40274820, - 0x18a38: 0x40274a20, 0x18a39: 0x40274c20, 0x18a3a: 0x40274e20, 0x18a3b: 0x40275020, - // Block 0x629, offset 0x18a40 - 0x18a40: 0x00021283, 0x18a41: 0x40025c20, 0x18a42: 0x40030420, 0x18a43: 0x40051220, - 0x18a44: 0x40279a20, 0x18a45: 0x4027ca20, 0x18a46: 0xe0002206, 0x18a47: 0x6c8c9620, - 0x18a48: 0x40049c20, 0x18a49: 0x40049e20, 0x18a4a: 0x4004a020, 0x18a4b: 0x4004a220, - 0x18a4c: 0x4004a420, 0x18a4d: 0x4004a620, 0x18a4e: 0x4004a820, 0x18a4f: 0x4004aa20, - 0x18a50: 0x4004ac20, 0x18a51: 0x4004ae20, 0x18a52: 0x40279c20, 0x18a53: 0x40279e20, - 0x18a54: 0x4004b020, 0x18a55: 0x4004b220, 0x18a56: 0x4004b420, 0x18a57: 0x4004b620, - 0x18a58: 0x4004b820, 0x18a59: 0x4004ba20, 0x18a5a: 0x4004bc20, 0x18a5b: 0x4004be20, - 0x18a5c: 0x40023820, 0x18a5d: 0x4003ea20, 0x18a5e: 0x4003ec20, 0x18a5f: 0x4003ee20, - 0x18a60: 0x4027a020, 0x18a61: 0xe0000267, 0x18a62: 0xe000037f, 0x18a63: 0xe0000459, - 0x18a64: 0xe000052e, 0x18a65: 0xe00005f8, 0x18a66: 0xe00006c3, 0x18a67: 0xe000076b, - 0x18a68: 0xe0000817, 0x18a69: 0xe00008bc, 0x18a6a: 0xada12202, 0x18a6b: 0xae412302, - 0x18a6c: 0xae812402, 0x18a6d: 0xade12502, 0x18a6e: 0xae012602, 0x18a6f: 0xae012702, - 0x18a70: 0x40023a20, 0x18a71: 0x4027ce20, 0x18a72: 0xe0000152, 0x18a73: 0x4027d020, - 0x18a74: 0xe0000155, 0x18a75: 0x4027d220, 0x18a76: 0x00279c84, 0x18a77: 0x4027a220, - 0x18a78: 0x2cd22484, 0x18a79: 0x2ca75483, 0x18a7a: 0x2cc96283, 0x18a7b: 0x4027cc20, - 0x18a7c: 0xe000231a, 0x18a7d: 0x40051420, 0x18a7e: 0x4027a420, 0x18a7f: 0x4027a620, - // Block 0x62a, offset 0x18a80 - 0x18a80: 0x00633a84, 0x18a81: 0x00634484, 0x18a82: 0x0064f684, 0x18a83: 0x0064f884, - 0x18a84: 0x00635a84, 0x18a85: 0x00635c84, 0x18a86: 0x00635e84, 0x18a87: 0x0063ee84, - 0x18a88: 0x0063f084, 0x18a89: 0x0063f684, 0x18a8a: 0x00640884, 0x18a8b: 0x00640a84, - 0x18a8c: 0x00640e84, 0x18a8d: 0x00642284, 0x18a8e: 0x00642884, - 0x18a90: 0x4027a820, 0x18a91: 0x4027aa20, 0x18a92: 0x2d13b685, 0x18a93: 0x2c37b485, - 0x18a94: 0x2cc9f285, 0x18a95: 0x2cd87484, 0x18a96: 0x2cce4884, 0x18a97: 0x2d378285, - 0x18a98: 0x2cfa2684, 0x18a99: 0x2c63fc83, 0x18a9a: 0x2d15aa83, 0x18a9b: 0x2c0dba83, - 0x18a9c: 0x2c2f4083, 0x18a9d: 0x2ce45484, 0x18a9e: 0x2c2a8a83, 0x18a9f: 0x2cc55a83, - 0x18aa0: 0xe000237a, 0x18aa1: 0xe0002383, 0x18aa2: 0xe0002380, 0x18aa3: 0xe000237d, - 0x18aa4: 0x40661c20, 0x18aa5: 0xe000238c, 0x18aa6: 0x40661620, 0x18aa7: 0xe0002389, - 0x18aa8: 0xe000239e, 0x18aa9: 0xe0002386, 0x18aaa: 0xe0002395, 0x18aab: 0xe000239b, - 0x18aac: 0x40663420, 0x18aad: 0x4065f220, 0x18aae: 0xe000238f, 0x18aaf: 0xe0002392, - 0x18ab0: 0x40663020, 0x18ab1: 0x40663220, 0x18ab2: 0x40662c20, 0x18ab3: 0xe0002398, - 0x18ab4: 0x0065dc99, 0x18ab5: 0x0065e699, 0x18ab6: 0x0065ee99, 0x18ab7: 0x0065f499, - 0x18ab8: 0x40660c20, 0x18ab9: 0x40660e20, 0x18aba: 0x40661020, - // Block 0x62b, offset 0x18ac0 - 0x18ac0: 0xf0000404, 0x18ac1: 0xf0000404, 0x18ac2: 0xf0000404, 0x18ac3: 0xf0000404, - 0x18ac4: 0xf0000404, 0x18ac5: 0xf0000404, 0x18ac6: 0xf0000404, 0x18ac7: 0xf0000404, - 0x18ac8: 0xf0000404, 0x18ac9: 0xf0000404, 0x18aca: 0xf0000404, 0x18acb: 0xf0000404, - 0x18acc: 0xf0000404, 0x18acd: 0xf0000404, 0x18ace: 0xe000004c, 0x18acf: 0xe0000051, - 0x18ad0: 0xe0000056, 0x18ad1: 0xe000005b, 0x18ad2: 0xe0000060, 0x18ad3: 0xe0000065, - 0x18ad4: 0xe000006a, 0x18ad5: 0xe000006f, 0x18ad6: 0xe0000083, 0x18ad7: 0xe000008d, - 0x18ad8: 0xe0000092, 0x18ad9: 0xe0000097, 0x18ada: 0xe000009c, 0x18adb: 0xe00000a1, - 0x18adc: 0xe0000088, 0x18add: 0xe0000074, 0x18ade: 0xe000007c, - 0x18ae0: 0xe000b438, 0x18ae1: 0xe000b3d4, 0x18ae2: 0xe000b40c, 0x18ae3: 0xe000b41c, - 0x18ae4: 0xe000b428, 0x18ae5: 0xe000b3f4, 0x18ae6: 0xe000b400, 0x18ae7: 0xe000b3c8, - 0x18ae8: 0xe000b3ec, 0x18ae9: 0xe000b414, 0x18aea: 0xe000b440, 0x18aeb: 0xe000b3dc, - 0x18aec: 0xe000b418, 0x18aed: 0xe000b3fc, 0x18aee: 0xe000b3e8, 0x18aef: 0xe000b424, - 0x18af0: 0xe000b408, 0x18af1: 0xe000b448, 0x18af2: 0xe000b43c, 0x18af3: 0xe000b410, - 0x18af4: 0xe000b3f8, 0x18af5: 0xe000b420, 0x18af6: 0xe000b3cc, 0x18af7: 0xe000b44c, - 0x18af8: 0xe000b3f0, 0x18af9: 0xe000b3d0, 0x18afa: 0xe000b3d8, 0x18afb: 0xe000b434, - 0x18afc: 0xe000b3e4, 0x18afd: 0xe000b404, 0x18afe: 0xe000b450, 0x18aff: 0xe000b42c, - // Block 0x62c, offset 0x18b00 - 0x18b00: 0xe000b3e0, 0x18b01: 0xe000b430, 0x18b02: 0xe000b454, 0x18b03: 0xe000b444, - 0x18b04: 0x2cf20683, 0x18b05: 0x2d200c83, 0x18b06: 0x2cf17a83, 0x18b07: 0x2d32e283, - 0x18b08: 0xe00002e3, 0x18b09: 0xe00003d8, 0x18b0a: 0xe00004b3, 0x18b0b: 0xe000057d, - 0x18b0c: 0xe0000648, 0x18b0d: 0xe00006f0, 0x18b0e: 0xe000079c, 0x18b0f: 0xe0000841, - 0x18b10: 0xe0000ec0, 0x18b11: 0xf0000606, 0x18b12: 0xf0000606, 0x18b13: 0xf0000606, - 0x18b14: 0xf0000606, 0x18b15: 0xf0000606, 0x18b16: 0xf0000606, 0x18b17: 0xf0000606, - 0x18b18: 0xf0000606, 0x18b19: 0xf0000606, 0x18b1a: 0xf0000606, 0x18b1b: 0xf0000606, - 0x18b1c: 0xf0000606, 0x18b1d: 0xf0000606, 0x18b1e: 0xf0000606, 0x18b1f: 0xf0000606, - 0x18b20: 0x0062ac86, 0x18b21: 0x0062b086, 0x18b22: 0x0062b286, 0x18b23: 0x0062b686, - 0x18b24: 0x0062b886, 0x18b25: 0x0062ba86, 0x18b26: 0x0062be86, 0x18b27: 0x0062c286, - 0x18b28: 0x0062c486, 0x18b29: 0x0062c886, 0x18b2a: 0x0062ca86, 0x18b2b: 0x0062cc86, - 0x18b2c: 0x0062ce86, 0x18b2d: 0x0062d086, 0x18b2e: 0xf0000606, 0x18b2f: 0xf0000606, - 0x18b30: 0xf0000606, 0x18b31: 0xf0000606, 0x18b32: 0xf0000606, 0x18b33: 0xf0000606, - 0x18b34: 0xf0000606, 0x18b35: 0xf0000606, 0x18b36: 0xf0000606, 0x18b37: 0xf0000606, - 0x18b38: 0xf0000606, 0x18b39: 0xf0000606, 0x18b3a: 0xf0000606, 0x18b3b: 0xf0000606, - 0x18b3c: 0xe0002127, 0x18b3d: 0xe0002122, 0x18b3e: 0xf0000606, 0x18b3f: 0x4027ac20, - // Block 0x62d, offset 0x18b40 - 0x18b40: 0x2d13b684, 0x18b41: 0x2c37b484, 0x18b42: 0x2cc9f284, 0x18b43: 0x2cd87483, - 0x18b44: 0x2cf41483, 0x18b45: 0x2c8f2483, 0x18b46: 0x2cb4c683, 0x18b47: 0x2c030a83, - 0x18b48: 0x2c6f9a83, 0x18b49: 0x2cd22483, 0x18b4a: 0x2d266884, 0x18b4b: 0x2c5d8483, - 0x18b4c: 0x2cd70283, 0x18b4d: 0x2ca25c83, 0x18b4e: 0x2c6c2e83, 0x18b4f: 0x2ce91083, - 0x18b50: 0x2cc63683, 0x18b51: 0x2d399283, 0x18b52: 0x2d1f9884, 0x18b53: 0x2ccf3683, - 0x18b54: 0x2c9fe683, 0x18b55: 0x2ce27083, 0x18b56: 0x2c110e83, 0x18b57: 0x2d3ac683, - 0x18b58: 0x2c814083, 0x18b59: 0x2c9d3483, 0x18b5a: 0x2ca3e283, 0x18b5b: 0x2caa6e83, - 0x18b5c: 0x2cd3bc83, 0x18b5d: 0x2d1eb483, 0x18b5e: 0x2d1b3683, 0x18b5f: 0x2d3ab083, - 0x18b60: 0x2cfe3a83, 0x18b61: 0x2d04b283, 0x18b62: 0x2d013e83, 0x18b63: 0x2d333683, - 0x18b64: 0x2cce4883, 0x18b65: 0x2d378284, 0x18b66: 0x2cfa2683, 0x18b67: 0x2d426084, - 0x18b68: 0x2d200884, 0x18b69: 0x2d13c083, 0x18b6a: 0x2d3f7083, 0x18b6b: 0x2d08f883, - 0x18b6c: 0x2c64ca83, 0x18b6d: 0x2cb6c883, 0x18b6e: 0x2d3e6083, 0x18b6f: 0x2d007083, - 0x18b70: 0x2d12ca83, 0x18b71: 0xf0000606, 0x18b72: 0xf0000606, 0x18b73: 0xf0000606, - 0x18b74: 0xf0000606, 0x18b75: 0xf0000606, 0x18b76: 0xf0000606, 0x18b77: 0xf0000606, - 0x18b78: 0xf0000606, 0x18b79: 0xf0000606, 0x18b7a: 0xf0000606, 0x18b7b: 0xf0000606, - 0x18b7c: 0xf0000606, 0x18b7d: 0xf0000606, 0x18b7e: 0xf0000606, 0x18b7f: 0xf0000606, - // Block 0x62e, offset 0x18b80 - 0x18b80: 0xf0000203, 0x18b81: 0xf0000203, 0x18b82: 0xf0000203, 0x18b83: 0xf0000203, - 0x18b84: 0xf0000203, 0x18b85: 0xf0000203, 0x18b86: 0xf0000203, 0x18b87: 0xf0000203, - 0x18b88: 0xf0000203, 0x18b89: 0xe000b484, 0x18b8a: 0xe000b490, 0x18b8b: 0xe000b49c, - 0x18b8c: 0xf0001c1d, 0x18b8d: 0xe0000b85, 0x18b8e: 0xf0001d1c, 0x18b8f: 0xe0000d14, - 0x18b90: 0x00657693, 0x18b91: 0x00657893, 0x18b92: 0x00657a93, 0x18b93: 0x00657e93, - 0x18b94: 0x00658093, 0x18b95: 0x00658293, 0x18b96: 0x00658493, 0x18b97: 0x00658693, - 0x18b98: 0x00658893, 0x18b99: 0x00658a93, 0x18b9a: 0x00658c93, 0x18b9b: 0x00658e93, - 0x18b9c: 0x00659093, 0x18b9d: 0x00659293, 0x18b9e: 0x00659493, 0x18b9f: 0x00659693, - 0x18ba0: 0x00659893, 0x18ba1: 0x00659a93, 0x18ba2: 0x00659c93, 0x18ba3: 0x00659e93, - 0x18ba4: 0x0065a093, 0x18ba5: 0x0065a293, 0x18ba6: 0x0065a493, 0x18ba7: 0x0065a693, - 0x18ba8: 0x0065a893, 0x18ba9: 0x0065aa93, 0x18baa: 0x0065ac93, 0x18bab: 0x0065ae93, - 0x18bac: 0x0065b093, 0x18bad: 0x0065b293, 0x18bae: 0x0065b493, 0x18baf: 0x0065b693, - 0x18bb0: 0x0065b893, 0x18bb1: 0x0065ba93, 0x18bb2: 0x0065bc93, 0x18bb3: 0x0065be93, - 0x18bb4: 0x0065c093, 0x18bb5: 0x0065c493, 0x18bb6: 0x0065c693, 0x18bb7: 0x0065c893, - 0x18bb8: 0x0065ca93, 0x18bb9: 0x0065cc93, 0x18bba: 0x0065ce93, 0x18bbb: 0x0065d093, - 0x18bbc: 0x0065d293, 0x18bbd: 0x0065d493, 0x18bbe: 0x0065d693, - // Block 0x62f, offset 0x18bc0 - 0x18bc0: 0xe000230b, 0x18bc1: 0xe00022f8, 0x18bc2: 0xe00022fc, 0x18bc3: 0xe0002311, - 0x18bc4: 0xe0002316, 0x18bc5: 0xe000231d, 0x18bc6: 0xe0002321, 0x18bc7: 0xe0002325, - 0x18bc8: 0xe000232b, 0x18bc9: 0xf0001c1c, 0x18bca: 0xe0002330, 0x18bcb: 0xe000233c, - 0x18bcc: 0xe0002340, 0x18bcd: 0xe0002337, 0x18bce: 0xe0002346, 0x18bcf: 0xe000234b, - 0x18bd0: 0xe000234f, 0x18bd1: 0xe0002353, 0x18bd2: 0xf0001c1c, 0x18bd3: 0xe000235e, - 0x18bd4: 0xe0002358, 0x18bd5: 0xf0001c1c, 0x18bd6: 0xe0002363, 0x18bd7: 0xe000236d, - 0x18bd8: 0xf0000203, 0x18bd9: 0xf0000203, 0x18bda: 0xf0000203, 0x18bdb: 0xf0000203, - 0x18bdc: 0xf0000203, 0x18bdd: 0xf0000203, 0x18bde: 0xf0000203, 0x18bdf: 0xf0000203, - 0x18be0: 0xf0000203, 0x18be1: 0xf0000203, 0x18be2: 0xe000b47c, 0x18be3: 0xe000b488, - 0x18be4: 0xe000b494, 0x18be5: 0xe000b4a0, 0x18be6: 0xe000b4a8, 0x18be7: 0xe000b4b0, - 0x18be8: 0xe000b4b8, 0x18be9: 0xe000b4c0, 0x18bea: 0xe000b4c8, 0x18beb: 0xe000b4d0, - 0x18bec: 0xe000b4d8, 0x18bed: 0xe000b4e0, 0x18bee: 0xe000b4e8, 0x18bef: 0xe000b4f0, - 0x18bf0: 0xe000b4f8, 0x18bf1: 0xe0000c1e, 0x18bf2: 0xf0001c1c, 0x18bf3: 0xf0001d1d, - 0x18bf4: 0xe0000a31, 0x18bf5: 0xf0001d1c, 0x18bf6: 0xf0001c1c, 0x18bf7: 0xf0001c1c, - 0x18bf8: 0xe0000ac2, 0x18bf9: 0xe0000ac6, 0x18bfa: 0xf0001d1d, 0x18bfb: 0xf0000203, - 0x18bfc: 0xf0000203, 0x18bfd: 0xf0000203, 0x18bfe: 0xf0000203, 0x18bff: 0xe000b5b2, - // Block 0x630, offset 0x18c00 - 0x18c00: 0xf0001d1c, 0x18c01: 0xf0001d1d, 0x18c02: 0xe00009b7, 0x18c03: 0xf0001c1d, - 0x18c04: 0xf0001c1c, 0x18c05: 0xf0001c1c, 0x18c06: 0xe0000a66, 0x18c07: 0xe0000a7a, - 0x18c08: 0xf0001d1c, 0x18c09: 0xf0001c1d, 0x18c0a: 0xf0001c1c, 0x18c0b: 0xf0001d1d, - 0x18c0c: 0xf0001c1c, 0x18c0d: 0xf0001d1d, 0x18c0e: 0xf0001d1d, 0x18c0f: 0xf0001c1c, - 0x18c10: 0xf0001c1c, 0x18c11: 0xf0001c1c, 0x18c12: 0xe0000d0d, 0x18c13: 0xf0001c1c, - 0x18c14: 0xf0001c1c, 0x18c15: 0xe0000d3a, 0x18c16: 0xe0000d46, 0x18c17: 0xf0001d1d, - 0x18c18: 0xe0000eb0, 0x18c19: 0xe0000eb8, 0x18c1a: 0xf0001d1d, 0x18c1b: 0xf0001c1c, - 0x18c1c: 0xf0001c1d, 0x18c1d: 0xf0001c1d, 0x18c1e: 0xe00010b2, 0x18c1f: 0xe00009c8, - 0x18c20: 0xf0000203, 0x18c21: 0xf0000203, 0x18c22: 0xf0000203, 0x18c23: 0xf0000203, - 0x18c24: 0xf0000203, 0x18c25: 0xf0000203, 0x18c26: 0xf0000203, 0x18c27: 0xf0000203, - 0x18c28: 0xf0000203, 0x18c29: 0xe000b480, 0x18c2a: 0xe000b48c, 0x18c2b: 0xe000b498, - 0x18c2c: 0xe000b4a4, 0x18c2d: 0xe000b4ac, 0x18c2e: 0xe000b4b4, 0x18c2f: 0xe000b4bc, - 0x18c30: 0xe000b4c4, 0x18c31: 0xe000b4cc, 0x18c32: 0xe000b4d4, 0x18c33: 0xe000b4dc, - 0x18c34: 0xe000b4e4, 0x18c35: 0xe000b4ec, 0x18c36: 0xe000b4f4, 0x18c37: 0xe000b4fc, - 0x18c38: 0xe000b500, 0x18c39: 0xe000b504, 0x18c3a: 0xe000b508, 0x18c3b: 0xe000b50c, - 0x18c3c: 0xe000b510, 0x18c3d: 0xe000b514, 0x18c3e: 0xe000b518, 0x18c3f: 0xe0000bdf, - // Block 0x631, offset 0x18c40 - 0x18c40: 0x6cbf9220, 0x18c41: 0x6ce52c20, - 0x18c44: 0x6c7ae020, 0x18c45: 0x6cf41220, 0x18c46: 0x6d1ac620, - 0x18c4c: 0x6d144820, - 0x18c56: 0x6d006c20, - 0x18c5c: 0x6c1d9020, - 0x18c61: 0x6caae820, - 0x18c64: 0x6c27da20, - 0x18c68: 0x6d067820, 0x18c69: 0x6d03c420, 0x18c6b: 0x6d044c20, - 0x18c6c: 0x6c8e4020, 0x18c6d: 0x6c8c1820, 0x18c6e: 0x6cfd7e20, 0x18c6f: 0x6d1dbe20, - 0x18c70: 0x6d030e20, 0x18c71: 0x6d31ac20, 0x18c72: 0x6c272020, 0x18c73: 0x6cf49420, - 0x18c74: 0x6cac3820, 0x18c77: 0x6c968e20, - 0x18c78: 0x6cba3c20, 0x18c79: 0x6d165420, 0x18c7a: 0x6d1a2020, 0x18c7b: 0x6ca58220, - 0x18c7c: 0x6c1a7e20, 0x18c7d: 0x6c3c1020, - // Block 0x632, offset 0x18c80 - 0x18c81: 0x6d3cec20, 0x18c82: 0x6c39ba20, 0x18c83: 0x6c029620, - 0x18c84: 0x6cf41c20, 0x18c85: 0x6d427220, 0x18c87: 0x6d38f620, - 0x18c88: 0x6c304e20, 0x18c89: 0x6cda7e20, 0x18c8a: 0x6d16a020, 0x18c8b: 0x6cbefc20, - 0x18c8c: 0x6c7b8220, 0x18c8d: 0x6c831e20, 0x18c8e: 0x6ca4da20, 0x18c8f: 0x6d3aa820, - 0x18c90: 0x6cd4a220, - 0x18c94: 0x6d062820, 0x18c97: 0x6ccfb620, - 0x18c98: 0x6c6bc820, 0x18c99: 0x6c2e6620, 0x18c9a: 0x6caab620, 0x18c9b: 0x6cda8420, - 0x18c9c: 0x6d16d820, 0x18c9d: 0x6c905020, 0x18c9e: 0x6d1d3220, 0x18c9f: 0x6c081020, - 0x18ca3: 0x6c7f9220, - 0x18ca4: 0x6c9e7220, 0x18ca5: 0x6d171820, 0x18ca6: 0x6c85be20, 0x18ca7: 0x6c61c020, - 0x18ca8: 0x6d223420, 0x18ca9: 0x6c953c20, 0x18caa: 0x6c147420, - 0x18cae: 0x6c5ce420, 0x18caf: 0x6d063820, - 0x18cb0: 0x6c5bb220, 0x18cb1: 0x6cc53820, 0x18cb3: 0x6d392620, - 0x18cb5: 0x6c4ebe20, 0x18cb6: 0x6cf88220, 0x18cb7: 0x6cdf7420, - 0x18cb8: 0x6d10f020, 0x18cb9: 0x6c5bba20, 0x18cba: 0x6c75b820, 0x18cbb: 0x6c96c020, - 0x18cbc: 0x6c94ac20, 0x18cbd: 0x6ce0fa20, 0x18cbe: 0x6d110220, 0x18cbf: 0x6d2fba20, - // Block 0x633, offset 0x18cc0 - 0x18cc0: 0x6d2cf420, 0x18cc1: 0x6d226420, 0x18cc2: 0x6d3d7620, 0x18cc3: 0x6c37d620, - 0x18cc4: 0x6cc4cc20, 0x18cc5: 0x6cb70820, 0x18cc6: 0x6c1c3e20, 0x18cc7: 0x6cf45620, - 0x18cc8: 0x6c4eda20, 0x18cc9: 0x6ce17820, 0x18cca: 0x6ccb3220, - 0x18ccc: 0x6cbf4820, 0x18ccd: 0x6c824020, 0x18cce: 0x6cc97c20, - 0x18cd1: 0x6c7cda20, 0x18cd2: 0x6cb44620, 0x18cd3: 0x6cde8a20, - 0x18cd4: 0x6cd53020, 0x18cd5: 0x6d0f6820, 0x18cd6: 0x6cab8a20, 0x18cd7: 0x6cdf3620, - 0x18cd9: 0x6c9dd220, 0x18cda: 0x6d1b7820, 0x18cdb: 0x6c2e3a20, - 0x18cdc: 0x6d228820, 0x18cdd: 0x6c9eec20, 0x18cde: 0x6c75ee20, 0x18cdf: 0x6ca7b820, - 0x18ce0: 0x6d023a20, 0x18ce1: 0x6d1f8820, - 0x18ce4: 0x6c185420, 0x18ce5: 0x6c3c7620, 0x18ce6: 0x6c82f820, 0x18ce7: 0x6c874020, - 0x18ce9: 0x6c95d420, 0x18ceb: 0x6c617420, - 0x18cf0: 0x6cc2b020, 0x18cf2: 0x6c110220, 0x18cf3: 0x6c898420, - 0x18cf4: 0x6c475620, 0x18cf5: 0x6c994020, 0x18cf7: 0x6c489020, - 0x18cf8: 0x6cdc2820, 0x18cfb: 0x6c996a20, - 0x18cfc: 0x6c976220, 0x18cfd: 0x6cc29820, 0x18cfe: 0x6cd39420, 0x18cff: 0x6c84b620, - // Block 0x634, offset 0x18d00 - 0x18d01: 0x6cedee20, 0x18d02: 0x6c79d820, 0x18d03: 0x6c325420, - 0x18d04: 0x6d325a20, 0x18d05: 0x6ce62020, - 0x18d08: 0x6c0e0620, 0x18d09: 0x6c5d9e20, 0x18d0a: 0x6c305420, 0x18d0b: 0x6c460e20, - 0x18d0c: 0x6c195220, 0x18d0e: 0x6cbd2020, 0x18d0f: 0x6c6f0020, - 0x18d10: 0x6c922620, 0x18d11: 0x6d042020, 0x18d13: 0x6ca3f820, - 0x18d14: 0x6d01a220, 0x18d16: 0x6c09be20, 0x18d17: 0x6c6b0420, - 0x18d18: 0x6cda9c20, 0x18d1a: 0x6c455220, - 0x18d1c: 0x6d200620, 0x18d1d: 0x6d03b620, 0x18d1e: 0x6cb83c20, 0x18d1f: 0x6cafae20, - 0x18d20: 0x6c2d3620, 0x18d21: 0x6c3f3c20, 0x18d22: 0x6c95de20, 0x18d23: 0x6cb84220, - 0x18d24: 0x6cb84420, 0x18d25: 0x6ce0ba20, 0x18d26: 0x6c03fa20, 0x18d27: 0x6c418420, - 0x18d28: 0x6c222420, 0x18d29: 0x6d077e20, 0x18d2a: 0x6c80f620, - 0x18d2d: 0x6ccf0c20, 0x18d2f: 0x6c83a820, - 0x18d30: 0x6c578820, 0x18d31: 0x6ce7ea20, 0x18d32: 0x6cb0f020, 0x18d33: 0x6c2b2420, - 0x18d34: 0x6cc85e20, 0x18d35: 0x6c360820, 0x18d36: 0x6cbcb020, 0x18d37: 0x6d178c20, - 0x18d38: 0x6d3d0020, 0x18d39: 0x6cc8cc20, 0x18d3a: 0x6c649420, - 0x18d3c: 0x6c1c2e20, 0x18d3d: 0x6c1d1820, 0x18d3e: 0x6cf66220, - // Block 0x635, offset 0x18d40 - 0x18d40: 0x6c94b420, 0x18d41: 0x6c2aa020, 0x18d42: 0x6c8bbe20, 0x18d43: 0x6c747020, - 0x18d44: 0x6cdae020, 0x18d45: 0x6cfffa20, 0x18d46: 0x6d299020, - 0x18d49: 0x6d3a7620, 0x18d4a: 0x6d2e0e20, 0x18d4b: 0x6c64f020, - 0x18d4c: 0x6d408c20, 0x18d4d: 0x6c1fa020, 0x18d4e: 0x6d022a20, 0x18d4f: 0x6c869820, - 0x18d51: 0x6c1c8e20, 0x18d52: 0x6cf7b820, 0x18d53: 0x6c656020, - 0x18d55: 0x6c5fc020, 0x18d57: 0x6c3a7c20, - 0x18d58: 0x6c1f0620, 0x18d59: 0x6c07d420, 0x18d5a: 0x6c6a7820, - 0x18d5c: 0x6c036c20, 0x18d5d: 0x6c898a20, 0x18d5e: 0x6c7b1e20, - 0x18d60: 0x6cf95e20, 0x18d61: 0x6c0ca420, 0x18d62: 0x6c747420, 0x18d63: 0x6c825c20, - 0x18d64: 0x6d035020, 0x18d65: 0x6c045820, 0x18d66: 0x6d103220, 0x18d67: 0x6c940a20, - 0x18d68: 0x6c070a20, 0x18d69: 0x6c362420, 0x18d6a: 0x6c91c220, - 0x18d6d: 0x6c181220, 0x18d6e: 0x6caad020, 0x18d6f: 0x6d07fe20, - 0x18d70: 0x6c525220, 0x18d71: 0x6d224420, 0x18d73: 0x6c4b0620, - 0x18d74: 0x6d17dc20, 0x18d75: 0x6d085020, 0x18d76: 0x6c462c20, 0x18d77: 0x6c910020, - 0x18d78: 0x6ce2f020, 0x18d79: 0x6c820420, 0x18d7a: 0x6cd2f820, - 0x18d7c: 0x6cdcee20, 0x18d7d: 0x6d11ec20, 0x18d7e: 0x6cfa6820, 0x18d7f: 0x6d408420, - // Block 0x636, offset 0x18d80 - 0x18d81: 0x6cc3a220, 0x18d82: 0x6d1a2220, 0x18d83: 0x6cf56420, - 0x18d84: 0x6d34d420, 0x18d85: 0x6c639620, 0x18d86: 0x6c564e20, 0x18d87: 0x6c7e3620, - 0x18d88: 0x6d15c620, 0x18d89: 0x6c788020, 0x18d8a: 0x6c3d4620, 0x18d8b: 0x6cbd6020, - 0x18d8c: 0x6c009220, 0x18d8e: 0x6c78ac20, 0x18d8f: 0x6c1e8820, - 0x18d90: 0x6d014620, 0x18d91: 0x6c1e9a20, 0x18d92: 0x6ceeac20, - 0x18d95: 0x6c58ea20, 0x18d96: 0x6cda8a20, 0x18d97: 0x6d203a20, - 0x18d99: 0x6c75e020, 0x18d9a: 0x6d2f7e20, 0x18d9b: 0x6d066620, - 0x18d9c: 0x6cd2ac20, 0x18d9e: 0x6cd64220, 0x18d9f: 0x6c7cea20, - 0x18da0: 0x6cd6a220, 0x18da1: 0x6c515420, 0x18da2: 0x6c414e20, 0x18da3: 0x6d0d3020, - 0x18da4: 0x6cbfec20, 0x18da5: 0x6ccf9820, 0x18da6: 0x6c577a20, 0x18da7: 0x6cf56820, - 0x18da8: 0x6c391820, 0x18da9: 0x6cad2420, 0x18daa: 0x6c281e20, 0x18dab: 0x6c39bc20, - 0x18dac: 0x6c455c20, 0x18dad: 0x6c022620, 0x18dae: 0x6c3f3020, 0x18daf: 0x6ca54420, - 0x18db0: 0x6d093a20, 0x18db1: 0x6d1ee420, 0x18db2: 0x6c572620, - 0x18db4: 0x6c189620, 0x18db5: 0x6c4c5420, 0x18db6: 0x6ca2c820, 0x18db7: 0x6c577e20, - 0x18db8: 0x6c858820, 0x18db9: 0x6c37fa20, 0x18dba: 0x6cfe8020, 0x18dbb: 0x6cb3ea20, - 0x18dbd: 0x6cd88820, - // Block 0x637, offset 0x18dc0 - 0x18dc0: 0x6c821c20, 0x18dc1: 0x6c8c4820, 0x18dc2: 0x6d16dc20, 0x18dc3: 0x6c544c20, - 0x18dc5: 0x6d068c20, 0x18dc6: 0x6cc17620, 0x18dc7: 0x6c373a20, - 0x18dca: 0x6d09e220, - 0x18dcf: 0x6ca80020, - 0x18dd0: 0x6cef9a20, 0x18dd1: 0x6d017820, 0x18dd2: 0x6ce31420, 0x18dd3: 0x6c532620, - 0x18dd4: 0x6cea7820, 0x18dd5: 0x6ca80220, 0x18dd6: 0x6ca80420, 0x18dd7: 0x6d1a4020, - 0x18dd8: 0x6d313420, - 0x18dde: 0x6cec5020, 0x18ddf: 0x6cd45a20, - 0x18de0: 0x6caaea20, 0x18de1: 0x6d12e420, 0x18de2: 0x6cb5b620, 0x18de3: 0x6ce82620, - 0x18de4: 0x6c4df820, 0x18de5: 0x6c75ac20, 0x18de6: 0x6c302c20, 0x18de7: 0x6c5cba20, - 0x18de8: 0x6c923220, 0x18de9: 0x6c707a20, 0x18dea: 0x6c5db820, 0x18deb: 0x6c8cdc20, - 0x18ded: 0x6ce4e420, 0x18dee: 0x6c94e820, - 0x18df5: 0x6c43e220, 0x18df6: 0x6d0c0620, 0x18df7: 0x6cd26420, - 0x18df8: 0x6d090c20, 0x18df9: 0x6cae3020, 0x18dfa: 0x6c217820, 0x18dfb: 0x6ca96c20, - 0x18dfc: 0x6c348a20, 0x18dfd: 0x6d2aca20, 0x18dfe: 0x6c362820, 0x18dff: 0x6d00a820, - // Block 0x638, offset 0x18e00 - 0x18e00: 0x6d1ea020, 0x18e01: 0x6c362a20, 0x18e02: 0x6cd13420, 0x18e03: 0x6cf1dc20, - 0x18e04: 0x6c7a3e20, 0x18e05: 0x6c555020, 0x18e06: 0x6c43e620, 0x18e07: 0x6cf9c020, - 0x18e08: 0x6c97dc20, 0x18e09: 0x6c94a820, 0x18e0a: 0x6c602a20, 0x18e0b: 0x6c53f620, - 0x18e0c: 0x6d361620, 0x18e0f: 0x6cec5420, - 0x18e11: 0x6c046820, 0x18e12: 0x6c00a020, 0x18e13: 0x6d3c6220, - 0x18e14: 0x6cb8ec20, 0x18e15: 0x6c46ac20, 0x18e16: 0x6c289220, 0x18e17: 0x6c06a820, - 0x18e18: 0x6c0f0e20, 0x18e19: 0x6c1e6020, 0x18e1a: 0x6c862820, 0x18e1b: 0x6cfff620, - 0x18e1c: 0x6d054020, - 0x18e22: 0x6c537020, 0x18e23: 0x6ce40620, - 0x18e24: 0x6c244220, 0x18e25: 0x6c7e0a20, 0x18e26: 0x6c816020, 0x18e27: 0x6d367820, - 0x18e28: 0x6d004e20, 0x18e29: 0x6cf66620, 0x18e2b: 0x6cbcce20, - 0x18e2c: 0x6d2be820, 0x18e2d: 0x6cf66820, - 0x18e30: 0x6c23a220, 0x18e31: 0x6c607a20, 0x18e32: 0x6c5dec20, 0x18e33: 0x6cde1220, - 0x18e34: 0x6d0cbe20, 0x18e35: 0x6d072420, 0x18e36: 0x6cb31c20, 0x18e37: 0x6cc9dc20, - 0x18e3b: 0x6c4c3a20, - 0x18e3c: 0x6d133620, 0x18e3d: 0x6cfdfe20, 0x18e3e: 0x6d08e620, 0x18e3f: 0x6c516c20, - // Block 0x639, offset 0x18e40 - 0x18e40: 0x6d42aa20, 0x18e41: 0x6d188020, 0x18e42: 0x6c226620, - 0x18e44: 0x6c837020, 0x18e45: 0x6cfba620, 0x18e46: 0x6cdf5620, 0x18e47: 0x6cc6bc20, - 0x18e48: 0x6d18be20, 0x18e49: 0x6d372220, 0x18e4a: 0x6cf6fe20, 0x18e4b: 0x6cfbb420, - 0x18e4c: 0x6c72aa20, 0x18e4d: 0x6c60d620, 0x18e4e: 0x6c4e6820, - 0x18e50: 0x6cad9e20, 0x18e51: 0x6c86e620, 0x18e53: 0x6c7fe020, - 0x18e54: 0x6cc9e020, 0x18e55: 0x6c4e7020, 0x18e56: 0x6d0cfe20, 0x18e57: 0x6cc16020, - 0x18e59: 0x6d0d1620, 0x18e5a: 0x6c4e7420, 0x18e5b: 0x6c76ba20, - 0x18e5c: 0x6c1bce20, 0x18e5d: 0x6ca7e820, 0x18e5e: 0x6c5d9620, - 0x18e60: 0x6c092820, 0x18e61: 0x6cf98a20, 0x18e62: 0x6cf24820, 0x18e63: 0x6d080420, - 0x18e64: 0x6cec9420, 0x18e65: 0x6d1f8a20, 0x18e66: 0x6cbd4c20, 0x18e67: 0x6d066c20, - 0x18e68: 0x6ca7f020, 0x18e69: 0x6c091620, 0x18e6a: 0x6c501020, 0x18e6b: 0x6c6e0820, - 0x18e6c: 0x6c02bc20, 0x18e6d: 0x6c02be20, - 0x18e70: 0x6d311e20, 0x18e71: 0x6cdf8a20, 0x18e72: 0x6c70f220, - 0x18e74: 0x6d427a20, 0x18e75: 0x6c106220, 0x18e76: 0x6c6a8a20, 0x18e77: 0x6c009020, - 0x18e78: 0x6d29fc20, 0x18e79: 0x6c222620, 0x18e7a: 0x6c37fc20, - 0x18e7f: 0x6ca80620, - // Block 0x63a, offset 0x18e80 - 0x18e80: 0x6c8f2a20, 0x18e81: 0x6c99e220, 0x18e82: 0x6c334420, 0x18e83: 0x6c052020, - 0x18e84: 0x6c095a20, 0x18e85: 0x6c05ee20, 0x18e87: 0x6c1f2c20, - 0x18e88: 0x6cfa3620, 0x18e89: 0x6ce4e820, 0x18e8a: 0x6c16a220, - 0x18e8d: 0x6c342420, 0x18e8e: 0x6cee7e20, 0x18e8f: 0x6c3fea20, - 0x18e90: 0x6c348c20, 0x18e91: 0x6d225420, 0x18e92: 0x6d12ac20, 0x18e93: 0x6c7c7620, - 0x18e94: 0x6cefb620, 0x18e95: 0x6c7b2220, 0x18e97: 0x6cee8020, - 0x18e98: 0x6d10a420, 0x18e99: 0x6c903420, 0x18e9a: 0x6d037a20, 0x18e9b: 0x6d3b7c20, - 0x18e9c: 0x6c1b3020, 0x18e9d: 0x6d00b420, 0x18e9e: 0x6ca83a20, 0x18e9f: 0x6c810020, - 0x18ea0: 0x6d13fe20, 0x18ea1: 0x6d3f9e20, 0x18ea2: 0x6c976a20, 0x18ea3: 0x6d2f3820, - 0x18ea4: 0x6cfa4220, 0x18ea5: 0x6c4bfe20, 0x18ea6: 0x6d00c820, - 0x18ea8: 0x6c625c20, 0x18ea9: 0x6c8a0220, 0x18eaa: 0x6d184820, 0x18eab: 0x6c607c20, - 0x18eac: 0x6d1a8e20, 0x18eae: 0x6c266020, 0x18eaf: 0x6d184a20, - 0x18eb0: 0x6d020a20, 0x18eb1: 0x6c506220, 0x18eb2: 0x6d1e5c20, 0x18eb3: 0x6c76ea20, - 0x18eb4: 0x6c163220, 0x18eb5: 0x6cdf3e20, 0x18eb6: 0x6ce13020, 0x18eb7: 0x6d34a220, - 0x18eb8: 0x6c066e20, 0x18eb9: 0x6c9b5220, 0x18eba: 0x6c7ca220, 0x18ebb: 0x6c153620, - 0x18ebc: 0x6c82e020, 0x18ebe: 0x6cf91220, - // Block 0x63b, offset 0x18ec0 - 0x18ec0: 0x6cf72820, 0x18ec1: 0x6cbc7220, 0x18ec2: 0x6ca47e20, 0x18ec3: 0x6d274e20, - 0x18ec5: 0x6c8f7220, 0x18ec6: 0x6c3fbe20, 0x18ec7: 0x6d3f7220, - 0x18ec9: 0x6c475e20, 0x18eca: 0x6c762820, 0x18ecb: 0x6c2dd420, - 0x18ecc: 0x6c57aa20, 0x18ecd: 0x6c7ce020, 0x18ecf: 0x6c42fc20, - 0x18ed0: 0x6ce26020, 0x18ed2: 0x6ccd2a20, 0x18ed3: 0x6c7f3a20, - 0x18ed4: 0x6ca7f420, 0x18ed5: 0x6c3de220, 0x18ed6: 0x6c42fe20, 0x18ed7: 0x6cbc8420, - 0x18ed8: 0x6c04e420, 0x18ed9: 0x6c632620, 0x18eda: 0x6c796a20, 0x18edb: 0x6cf85620, - 0x18edc: 0x6d230820, 0x18edd: 0x6d3c5a20, 0x18ede: 0x6cd05820, 0x18edf: 0x6c21ba20, - 0x18ee0: 0x6cfed420, 0x18ee1: 0x6c615220, 0x18ee2: 0x6caa3820, 0x18ee3: 0x6cff6a20, - 0x18ee4: 0x6d165a20, 0x18ee5: 0x6d20a820, 0x18ee6: 0x6d145420, 0x18ee7: 0x6d0d3620, - 0x18ee8: 0x6cd04020, 0x18ee9: 0x6cc4aa20, 0x18eea: 0x6c501220, 0x18eeb: 0x6cc96620, - 0x18eec: 0x6c755820, 0x18eed: 0x6d1ee820, 0x18eef: 0x6d02fc20, - 0x18ef0: 0x6cadae20, 0x18ef1: 0x6cbfa020, 0x18ef2: 0x6c14b820, - 0x18ef4: 0x6c106420, 0x18ef5: 0x6c2fdc20, 0x18ef6: 0x6cd88a20, 0x18ef7: 0x6c378620, - 0x18ef9: 0x6c992820, 0x18efa: 0x6d281820, 0x18efb: 0x6c5e8a20, - 0x18efd: 0x6cbc1e20, 0x18efe: 0x6d045820, 0x18eff: 0x6cad4a20, - // Block 0x63c, offset 0x18f00 - 0x18f00: 0x6c1e7420, 0x18f01: 0x6cae5220, 0x18f02: 0x6caad620, 0x18f03: 0x6c6a8c20, - 0x18f04: 0x6d13d420, 0x18f05: 0x6c37c220, 0x18f06: 0x6c34d420, - 0x18f0a: 0x6c347c20, - 0x18f0d: 0x6cbca420, 0x18f0e: 0x6c938220, 0x18f0f: 0x6cc02620, - 0x18f10: 0x6cda1020, 0x18f11: 0x6c11f020, 0x18f12: 0x6c310020, 0x18f13: 0x6cf5b820, - 0x18f14: 0x6c3c2e20, 0x18f15: 0x6d172220, 0x18f16: 0x6cdd0e20, 0x18f17: 0x6cbc7a20, - 0x18f18: 0x6cb37620, 0x18f19: 0x6d02c020, 0x18f1a: 0x6ce7b020, 0x18f1b: 0x6d032820, - 0x18f1c: 0x6d1f1220, 0x18f1d: 0x6c06fe20, 0x18f1e: 0x6c905820, - 0x18f23: 0x6d279820, - 0x18f24: 0x6c83ac20, 0x18f25: 0x6cde4420, 0x18f26: 0x6c802620, 0x18f27: 0x6c97b820, - 0x18f28: 0x6cbb3a20, 0x18f29: 0x6d38d220, 0x18f2a: 0x6d0e5c20, 0x18f2b: 0x6cf5de20, - 0x18f2c: 0x6c923620, 0x18f2d: 0x6cf5e020, 0x18f2e: 0x6ccae220, 0x18f2f: 0x6c395220, - 0x18f31: 0x6cefb820, 0x18f32: 0x6c383a20, 0x18f33: 0x6d179020, - 0x18f34: 0x6ca4f420, 0x18f35: 0x6c196c20, 0x18f36: 0x6ce09820, 0x18f37: 0x6c5ec620, - 0x18f38: 0x6cd5d020, 0x18f39: 0x6cb10e20, 0x18f3a: 0x6c012e20, 0x18f3b: 0x6c7ac420, - 0x18f3c: 0x6c139820, 0x18f3e: 0x6cfb5a20, 0x18f3f: 0x6d361c20, - // Block 0x63d, offset 0x18f40 - 0x18f42: 0x6c3c4820, 0x18f43: 0x6c88f420, - 0x18f44: 0x6d0a0a20, 0x18f45: 0x6d06ee20, 0x18f46: 0x6c9d5020, 0x18f47: 0x6c5bd620, - 0x18f48: 0x6ca29220, 0x18f49: 0x6d1d8c20, 0x18f4a: 0x6d2df420, 0x18f4b: 0x6d17de20, - 0x18f4c: 0x6caa1e20, 0x18f4d: 0x6ce10020, 0x18f4e: 0x6cf63e20, 0x18f4f: 0x6d27ac20, - 0x18f50: 0x6cd5e220, 0x18f51: 0x6c3e9420, 0x18f52: 0x6d17e020, 0x18f53: 0x6c26b020, - 0x18f55: 0x6c881e20, 0x18f56: 0x6c127a20, 0x18f57: 0x6c116e20, - 0x18f58: 0x6c725e20, 0x18f59: 0x6c927a20, 0x18f5a: 0x6cdae220, 0x18f5b: 0x6ca59a20, - 0x18f5c: 0x6c02dc20, 0x18f5d: 0x6c018c20, 0x18f5e: 0x6cba6420, - 0x18f60: 0x6c24d420, 0x18f61: 0x6c232420, 0x18f63: 0x6cc48220, - 0x18f64: 0x6ca73220, 0x18f65: 0x6c96fe20, 0x18f66: 0x6d030220, 0x18f67: 0x6d26e020, - 0x18f68: 0x6ca38220, 0x18f69: 0x6c02ee20, 0x18f6a: 0x6cd01620, 0x18f6b: 0x6c96dc20, - 0x18f6e: 0x6c807a20, 0x18f6f: 0x6cf6e620, - 0x18f70: 0x6d26f820, 0x18f71: 0x6d372620, 0x18f72: 0x6cf26420, 0x18f73: 0x6c57f620, - 0x18f74: 0x6c9c1820, 0x18f75: 0x6ca7bc20, 0x18f76: 0x6ced6620, 0x18f77: 0x6c9c9c20, - 0x18f78: 0x6ca89e20, 0x18f79: 0x6cc1f820, 0x18f7a: 0x6d29b820, 0x18f7b: 0x6c893e20, - 0x18f7c: 0x6d34c620, 0x18f7d: 0x6d3eda20, 0x18f7e: 0x6c4d1a20, 0x18f7f: 0x6d066e20, - // Block 0x63e, offset 0x18f80 - 0x18f80: 0x6c501820, 0x18f81: 0x6d078020, 0x18f82: 0x6d35b020, 0x18f83: 0x6c9e1220, - 0x18f84: 0x6c214820, 0x18f85: 0x6c46b020, 0x18f87: 0x6c216020, - 0x18f88: 0x6c946a20, 0x18f89: 0x6d3a9820, 0x18f8a: 0x6cd43820, 0x18f8b: 0x6c8a5e20, - 0x18f8c: 0x6c6fcc20, 0x18f8d: 0x6d014020, 0x18f8e: 0x6c2f9220, 0x18f8f: 0x6c6bae20, - 0x18f90: 0x6cc65220, 0x18f91: 0x6c982e20, 0x18f93: 0x6c788a20, - 0x18f94: 0x6d119620, 0x18f95: 0x6ca8fc20, 0x18f96: 0x6d148e20, 0x18f97: 0x6c80a620, - 0x18f98: 0x6d1df020, 0x18f99: 0x6d1a4420, 0x18f9a: 0x6d0c7e20, 0x18f9b: 0x6cda9e20, - 0x18f9d: 0x6c8baa20, 0x18f9e: 0x6d0aec20, 0x18f9f: 0x6c98d820, - 0x18fa0: 0x6c9ff420, 0x18fa1: 0x6d41aa20, 0x18fa2: 0x6d225620, 0x18fa3: 0x6d179220, - 0x18fa4: 0x6c46b220, 0x18fa5: 0x6c9cfa20, 0x18fa6: 0x6c75c820, 0x18fa7: 0x6cf1e420, - 0x18fa9: 0x6c773a20, 0x18faa: 0x6c2d7020, 0x18fab: 0x6c8f9820, - 0x18fad: 0x6d040620, 0x18fae: 0x6c255420, 0x18faf: 0x6cbbec20, - 0x18fb0: 0x6c9dde20, 0x18fb1: 0x6c9c1c20, 0x18fb2: 0x6cbdf420, - 0x18fb4: 0x6cecc220, 0x18fb5: 0x6c2a5e20, 0x18fb6: 0x6c009420, - 0x18fb8: 0x6c0b8c20, 0x18fb9: 0x6ca9fe20, 0x18fba: 0x6c882020, 0x18fbb: 0x6c6caa20, - 0x18fbc: 0x6d207020, 0x18fbd: 0x6c20bc20, 0x18fbe: 0x6d426420, 0x18fbf: 0x6c0fe020, - // Block 0x63f, offset 0x18fc0 - 0x18fc0: 0x6c5a9020, 0x18fc1: 0x6d11f020, 0x18fc2: 0x6ce9e020, 0x18fc3: 0x6c61e220, - 0x18fc4: 0x6c012420, 0x18fc5: 0x6c95fa20, 0x18fc6: 0x6c613220, 0x18fc7: 0x6cefba20, - 0x18fc8: 0x6c0e7420, 0x18fc9: 0x6d289020, 0x18fca: 0x6d06f020, 0x18fcb: 0x6ca71220, - 0x18fcc: 0x6d281420, 0x18fce: 0x6c039820, 0x18fcf: 0x6d301a20, - 0x18fd0: 0x6c705420, 0x18fd1: 0x6cef9020, 0x18fd2: 0x6d016e20, 0x18fd3: 0x6cb75420, - 0x18fd4: 0x6d149020, 0x18fd5: 0x6d017020, 0x18fd6: 0x6c222a20, 0x18fd7: 0x6cc02820, - 0x18fd8: 0x6c316a20, 0x18fd9: 0x6ca7d420, 0x18fda: 0x6cb78a20, 0x18fdb: 0x6c613c20, - 0x18fdc: 0x6ce99420, 0x18fde: 0x6cd94c20, 0x18fdf: 0x6c2d7420, - 0x18fe0: 0x6c816820, 0x18fe1: 0x6d2e2c20, - 0x18fe4: 0x6d1a1c20, 0x18fe5: 0x6c132620, 0x18fe6: 0x6c611220, 0x18fe7: 0x6c5b8620, - 0x18fe8: 0x6d3ede20, 0x18fe9: 0x6c7f8820, 0x18fea: 0x6ca49020, 0x18feb: 0x6c71f020, - 0x18fec: 0x6cbdfc20, 0x18fed: 0x6c272620, 0x18fef: 0x6c6a6020, - 0x18ff0: 0x6d062620, 0x18ff1: 0x6c22fa20, 0x18ff2: 0x6d1e6e20, 0x18ff3: 0x6c30d820, - 0x18ff4: 0x6c1afe20, 0x18ff6: 0x6c9f9020, 0x18ff7: 0x6c59a820, - 0x18ff8: 0x6cdc2020, 0x18ff9: 0x6c785620, 0x18ffa: 0x6d40aa20, 0x18ffb: 0x6c501a20, - 0x18ffc: 0x6c19ba20, 0x18ffd: 0x6d094220, 0x18ffe: 0x6ca5bc20, 0x18fff: 0x6c1bec20, - // Block 0x640, offset 0x19000 - 0x19000: 0x6c87f020, 0x19001: 0x6c01a020, 0x19002: 0x6ca22a20, 0x19003: 0x6cd7ca20, - 0x19004: 0x6cfdb220, 0x19005: 0x6d0f9020, 0x19006: 0x6c572c20, 0x19007: 0x6c261620, - 0x19008: 0x6cc02a20, 0x19009: 0x6c814c20, 0x1900a: 0x6c3e2e20, 0x1900b: 0x6c334620, - 0x1900c: 0x6c984c20, 0x1900d: 0x6c80a820, 0x1900e: 0x6ceb7220, 0x1900f: 0x6c4df220, - 0x19010: 0x6c988820, 0x19011: 0x6c0ed220, 0x19012: 0x6cc43220, 0x19013: 0x6cb59e20, - 0x19014: 0x6c4df420, 0x19016: 0x6c905c20, - 0x19018: 0x6ce57e20, 0x19019: 0x6d2aba20, 0x1901a: 0x6cb5ba20, 0x1901b: 0x6d298a20, - 0x1901c: 0x6c9c4620, 0x1901d: 0x6cadd220, 0x1901e: 0x6d2e5620, 0x1901f: 0x6cfe2c20, - 0x19020: 0x6c429c20, 0x19022: 0x6cb5bc20, - 0x19024: 0x6c923820, 0x19026: 0x6d283020, 0x19027: 0x6c362e20, - 0x19028: 0x6c329a20, 0x19029: 0x6c9f5020, 0x1902a: 0x6cee8420, 0x1902b: 0x6cc2ec20, - 0x1902c: 0x6cda1c20, 0x1902d: 0x6c9f5220, 0x1902e: 0x6ce85e20, - 0x19030: 0x6ca03620, 0x19031: 0x6d11b420, 0x19032: 0x6c746220, 0x19033: 0x6c862c20, - 0x19034: 0x6c7b2620, 0x19035: 0x6c42a420, 0x19036: 0x6d257e20, 0x19037: 0x6c26fa20, - 0x19039: 0x6c816220, 0x1903a: 0x6c909c20, 0x1903b: 0x6cba6620, - 0x1903c: 0x6c025c20, 0x1903d: 0x6c0c7620, 0x1903e: 0x6d1d9a20, 0x1903f: 0x6c989820, - // Block 0x641, offset 0x19040 - 0x19040: 0x6c29e020, 0x19042: 0x6c025e20, - 0x19044: 0x6cf78e20, 0x19045: 0x6c3ed420, 0x19046: 0x6c27f820, 0x19047: 0x6c701420, - 0x19048: 0x6cc90220, 0x19049: 0x6ce77a20, 0x1904a: 0x6cc13220, 0x1904b: 0x6c368220, - 0x1904c: 0x6cb51a20, 0x1904d: 0x6c607e20, 0x1904e: 0x6c608020, 0x1904f: 0x6c574c20, - 0x19050: 0x6c69b820, 0x19051: 0x6d41cc20, 0x19052: 0x6c0c7a20, 0x19053: 0x6c9b4620, - 0x19054: 0x6c045620, 0x19055: 0x6cf01420, 0x19056: 0x6d160e20, 0x19057: 0x6c02f020, - 0x19058: 0x6d229e20, 0x19059: 0x6c4ff020, 0x1905a: 0x6c336620, 0x1905b: 0x6cf31a20, - 0x1905c: 0x6ca6d620, 0x1905d: 0x6c249e20, 0x1905f: 0x6c846e20, - 0x19060: 0x6c916c20, 0x19061: 0x6ca7be20, 0x19062: 0x6c57f820, 0x19063: 0x6c86f020, - 0x19065: 0x6c941c20, 0x19066: 0x6c3c7e20, 0x19067: 0x6c9d0c20, - 0x19068: 0x6d249e20, 0x1906a: 0x6c71e620, - 0x1906d: 0x6d2dec20, 0x1906e: 0x6cae8220, 0x1906f: 0x6d15b220, - 0x19071: 0x6c61e420, 0x19072: 0x6c08ae20, - 0x19074: 0x6cc5b420, 0x19075: 0x6c597220, 0x19076: 0x6c388020, 0x19077: 0x6c43c220, - 0x19078: 0x6c7a8020, 0x19079: 0x6c6bb420, 0x1907a: 0x6ccbc220, - 0x1907c: 0x6cd7c220, 0x1907d: 0x6ce71620, 0x1907e: 0x6d24c820, 0x1907f: 0x6d3e0420, - // Block 0x642, offset 0x19080 - 0x19080: 0x6c092c20, 0x19081: 0x6c7ad820, 0x19082: 0x6c859e20, 0x19083: 0x6c598220, - 0x19084: 0x6d09e620, 0x19085: 0x6caad820, 0x19087: 0x6d303820, - 0x19088: 0x6cf20220, 0x19089: 0x6cfb4420, 0x1908a: 0x6cb85a20, 0x1908b: 0x6d127a20, - 0x1908c: 0x6c996c20, 0x1908f: 0x6cd5d420, - 0x19091: 0x6cbb7a20, 0x19092: 0x6d3cd220, 0x19093: 0x6c7d6020, - 0x19094: 0x6cf4ea20, 0x19095: 0x6d1bb820, 0x19096: 0x6c207220, 0x19097: 0x6ce33e20, - 0x19098: 0x6c880e20, 0x19099: 0x6c087820, 0x1909a: 0x6c464e20, 0x1909b: 0x6c986820, - 0x1909c: 0x6d01d020, 0x1909d: 0x6c3cec20, 0x1909e: 0x6c909e20, 0x1909f: 0x6d2a1820, - 0x190a0: 0x6d335e20, 0x190a1: 0x6c1ea220, 0x190a2: 0x6c980020, 0x190a3: 0x6c8faa20, - 0x190a5: 0x6d1b8620, 0x190a6: 0x6cb1f020, 0x190a7: 0x6d337020, - 0x190a8: 0x6c653020, 0x190a9: 0x6c945420, 0x190aa: 0x6ca7e420, 0x190ab: 0x6d179a20, - 0x190ad: 0x6c623420, 0x190ae: 0x6c60a420, 0x190af: 0x6d2d1a20, - 0x190b0: 0x6d221a20, 0x190b1: 0x6c6fa620, 0x190b2: 0x6c585620, 0x190b3: 0x6d34e220, - 0x190b4: 0x6c7e3c20, 0x190b5: 0x6c8ca820, 0x190b6: 0x6d34f020, 0x190b7: 0x6c079420, - 0x190b8: 0x6d2cae20, 0x190b9: 0x6c705820, 0x190ba: 0x6c286620, 0x190bb: 0x6c8a9020, - 0x190bc: 0x6d16e820, 0x190bd: 0x6d2fa020, 0x190be: 0x6cfc8e20, 0x190bf: 0x6c1bf820, - // Block 0x643, offset 0x190c0 - 0x190c0: 0x6c22ba20, 0x190c1: 0x6c1b8420, 0x190c2: 0x6d0d5420, 0x190c3: 0x6c80aa20, - 0x190c4: 0x6c310220, 0x190c5: 0x6c905e20, 0x190c6: 0x6c14ec20, - 0x190c8: 0x6ce9a020, 0x190c9: 0x6c13da20, 0x190ca: 0x6c006620, 0x190cb: 0x6c1b9c20, - 0x190cd: 0x6d1cec20, 0x190ce: 0x6d305a20, 0x190cf: 0x6ce7ee20, - 0x190d1: 0x6ce9a620, 0x190d2: 0x6c13f420, 0x190d3: 0x6d11be20, - 0x190d4: 0x6d3ffe20, 0x190d6: 0x6cac4020, 0x190d7: 0x6cbc5620, - 0x190d8: 0x6c883220, 0x190d9: 0x6cbd9c20, 0x190da: 0x6c91d820, 0x190db: 0x6d0eb820, - 0x190dc: 0x6c778e20, 0x190dd: 0x6cda5e20, 0x190de: 0x6d192820, 0x190df: 0x6c14b420, - 0x190e0: 0x6c6ef620, 0x190e1: 0x6c67b020, 0x190e3: 0x6c6ea820, - 0x190e5: 0x6c305c20, 0x190e7: 0x6c733620, - 0x190e8: 0x6c4e8420, 0x190e9: 0x6c2c1020, - 0x190ec: 0x6c52f620, 0x190ee: 0x6c1b0820, 0x190ef: 0x6c2dae20, - 0x190f0: 0x6c093020, 0x190f2: 0x6d0a6e20, 0x190f3: 0x6c913e20, - 0x190f5: 0x6d007e20, 0x190f6: 0x6c094420, - 0x190f8: 0x6c095c20, 0x190fa: 0x6cfb4620, 0x190fb: 0x6cc8c820, - 0x190fc: 0x6c0d1420, 0x190fd: 0x6c379620, 0x190fe: 0x6c736220, - // Block 0x644, offset 0x19100 - 0x19100: 0x6d324820, 0x19101: 0x6c072e20, 0x19102: 0x6c365620, 0x19103: 0x6d227a20, - 0x19104: 0x6cc1b220, 0x19105: 0x6d299420, 0x19106: 0x6c9ca820, 0x19107: 0x6d16b220, - 0x19108: 0x6cd8e620, - 0x1910c: 0x6ccd6e20, 0x1910d: 0x6cdf1620, 0x1910e: 0x6ca28220, 0x1910f: 0x6c6e8220, - 0x19110: 0x6c0b9620, 0x19111: 0x6cc68e20, 0x19112: 0x6c136e20, 0x19113: 0x6c120220, - 0x19114: 0x6c2f4820, - 0x19119: 0x6c2b5620, 0x1911a: 0x6ce7ac20, 0x1911b: 0x6cde3220, - 0x1911c: 0x6d03ce20, 0x1911d: 0x6cd90a20, 0x1911e: 0x6c343e20, 0x1911f: 0x6cf85e20, - 0x19120: 0x6ce1b220, 0x19122: 0x6ce31620, 0x19123: 0x6ccd7820, - 0x19124: 0x6c667620, 0x19125: 0x6d35da20, 0x19126: 0x6cee7220, 0x19127: 0x6d1b4620, - 0x1912a: 0x6c58d620, 0x1912b: 0x6d37f220, - 0x1912c: 0x6cb78c20, 0x1912d: 0x6d3f8820, 0x1912f: 0x6d01c220, - 0x19130: 0x6d01d220, 0x19131: 0x6d2ade20, 0x19132: 0x6cef1e20, - 0x19135: 0x6cde9820, 0x19136: 0x6d2d9820, 0x19137: 0x6ca95820, - 0x1913b: 0x6d166620, - 0x1913c: 0x6cc58420, 0x1913d: 0x6cd59620, 0x1913e: 0x6c142a20, 0x1913f: 0x6d3d1e20, - // Block 0x645, offset 0x19140 - 0x19141: 0x6c9e0620, 0x19142: 0x6c5fdc20, 0x19143: 0x6c39a420, - 0x19144: 0x6cadfe20, 0x19145: 0x6c008e20, 0x19146: 0x6c392020, 0x19147: 0x6c029a20, - 0x19148: 0x6cbe0220, 0x19149: 0x6cb82220, 0x1914a: 0x6cffd020, 0x1914b: 0x6c3b1020, - 0x1914c: 0x6c417420, 0x1914d: 0x6cbb6620, 0x1914e: 0x6c437a20, 0x1914f: 0x6ce71c20, - 0x19150: 0x6c14ba20, 0x19151: 0x6d201620, 0x19152: 0x6c42b420, 0x19153: 0x6c07a820, - 0x19154: 0x6c3fb420, 0x19155: 0x6c1f0c20, 0x19156: 0x6d3aac20, - 0x19158: 0x6d390020, 0x1915a: 0x6c4f6220, 0x1915b: 0x6ca8e420, - 0x1915c: 0x6c73f820, 0x1915d: 0x6c1cb020, 0x1915e: 0x6c143820, 0x1915f: 0x6c799c20, - 0x19160: 0x6c8ae820, 0x19161: 0x6c85a020, 0x19162: 0x6d22e020, - 0x19164: 0x6d20d620, 0x19165: 0x6c4d5820, 0x19166: 0x6c85a220, 0x19167: 0x6c53ee20, - 0x19168: 0x6c45d820, 0x19169: 0x6c789820, 0x1916a: 0x6d260c20, 0x1916b: 0x6c2a6220, - 0x1916c: 0x6c5b9a20, 0x1916e: 0x6c4a2220, 0x1916f: 0x6c6f0620, - 0x19170: 0x6d429a20, 0x19171: 0x6c3fce20, 0x19172: 0x6cbcb220, 0x19173: 0x6c06c820, - 0x19174: 0x6c180a20, 0x19175: 0x6c223e20, 0x19176: 0x6c985020, 0x19177: 0x6c4d9820, - 0x19178: 0x6cf86a20, 0x19179: 0x6cc02e20, 0x1917a: 0x6c5a4620, - 0x1917d: 0x6c1d9620, 0x1917e: 0x6cca4c20, 0x1917f: 0x6d0bf420, - // Block 0x646, offset 0x19180 - 0x19180: 0x6d345620, 0x19181: 0x6c2a6c20, 0x19182: 0x6ce27420, 0x19183: 0x6c9aec20, - 0x19184: 0x6c8ce220, 0x19185: 0x6cd45e20, 0x19186: 0x6ce9fa20, 0x19187: 0x6c119220, - 0x19188: 0x6c2ea020, 0x19189: 0x6c181420, 0x1918a: 0x6cae9c20, 0x1918b: 0x6d13f020, - 0x1918c: 0x6c711220, 0x1918d: 0x6c61e820, 0x1918e: 0x6c7f0620, 0x1918f: 0x6ce4ea20, - 0x19190: 0x6d261a20, 0x19192: 0x6c112820, 0x19193: 0x6cb4e420, - 0x19194: 0x6d230e20, 0x19195: 0x6c880220, 0x19196: 0x6c231420, - 0x1919a: 0x6d212020, 0x1919b: 0x6c603220, - 0x1919c: 0x6cf09420, 0x1919d: 0x6c9cf020, 0x1919e: 0x6cdc3e20, 0x1919f: 0x6d00aa20, - 0x191a0: 0x6d059620, 0x191a1: 0x6c1c1c20, 0x191a2: 0x6cc06020, 0x191a3: 0x6c5bde20, - 0x191a5: 0x6d212220, 0x191a6: 0x6cbcc620, 0x191a7: 0x6cd74e20, - 0x191a8: 0x6cd72620, 0x191a9: 0x6c349020, 0x191aa: 0x6c908820, - 0x191ac: 0x6cad0620, 0x191ad: 0x6cdf7820, 0x191ae: 0x6d393020, 0x191af: 0x6d1af420, - 0x191b0: 0x6ccab420, 0x191b1: 0x6c3a5a20, 0x191b2: 0x6c187620, 0x191b3: 0x6d258020, - 0x191b4: 0x6d151620, 0x191b5: 0x6c5d2a20, 0x191b6: 0x6ccb3420, 0x191b7: 0x6d131020, - 0x191b8: 0x6c9fbc20, 0x191b9: 0x6c3bbe20, 0x191ba: 0x6c513620, - 0x191bc: 0x6d1b6420, 0x191bd: 0x6c130220, 0x191be: 0x6ca6b620, 0x191bf: 0x6c02e820, - // Block 0x647, offset 0x191c0 - 0x191c0: 0x6c3cb420, 0x191c1: 0x6c883420, 0x191c2: 0x6c16be20, 0x191c3: 0x6c15c820, - 0x191c4: 0x6c967020, 0x191c5: 0x6c2e5a20, 0x191c6: 0x6c54e620, 0x191c7: 0x6c928020, - 0x191c9: 0x6d184c20, 0x191ca: 0x6c574e20, 0x191cb: 0x6d2bf220, - 0x191cc: 0x6c550020, 0x191cd: 0x6c368420, 0x191ce: 0x6c5dee20, 0x191cf: 0x6cdcf820, - 0x191d0: 0x6ca6bc20, 0x191d1: 0x6cfcf620, 0x191d2: 0x6c842620, 0x191d3: 0x6cfcf820, - 0x191d4: 0x6d0eba20, 0x191d5: 0x6c8fa420, 0x191d6: 0x6c9af620, 0x191d7: 0x6c6c5c20, - 0x191d8: 0x6c5f5020, 0x191da: 0x6c0b5a20, 0x191db: 0x6d22a420, - 0x191dc: 0x6c5e0620, 0x191dd: 0x6c9ea420, 0x191de: 0x6c1df220, 0x191df: 0x6c970620, - 0x191e1: 0x6c822c20, 0x191e2: 0x6c6b5620, 0x191e3: 0x6cf10a20, - 0x191e4: 0x6d192a20, 0x191e5: 0x6d07e020, 0x191e6: 0x6cf91420, 0x191e7: 0x6c11e220, - 0x191e8: 0x6c7fe420, 0x191e9: 0x6d1b2220, 0x191ea: 0x6d027220, 0x191eb: 0x6d28a620, - 0x191ec: 0x6c95d220, 0x191ed: 0x6c8dd220, 0x191ee: 0x6cb97020, 0x191ef: 0x6c5d9a20, - 0x191f0: 0x6c646a20, 0x191f1: 0x6cf2a820, - 0x191f4: 0x6c43d420, 0x191f5: 0x6d399020, 0x191f6: 0x6c2e8220, 0x191f7: 0x6d1e2c20, - 0x191f8: 0x6c614220, 0x191f9: 0x6d0fc020, 0x191fa: 0x6cc82220, 0x191fb: 0x6cf79a20, - 0x191fc: 0x6cd6f020, 0x191fd: 0x6d240820, 0x191fe: 0x6d146020, 0x191ff: 0x6cb9f220, - // Block 0x648, offset 0x19200 - 0x19200: 0x6c5fde20, 0x19201: 0x6cc26420, 0x19202: 0x6ce48a20, 0x19203: 0x6cd42820, - 0x19204: 0x6cb9ee20, 0x19205: 0x6ca26020, 0x19206: 0x6c6c2620, 0x19207: 0x6c992420, - 0x19208: 0x6d1ac820, 0x19209: 0x6c412a20, 0x1920a: 0x6cb2ee20, 0x1920b: 0x6d084020, - 0x1920c: 0x6c994220, 0x1920d: 0x6c39c020, 0x1920e: 0x6d0b1020, 0x1920f: 0x6c425420, - 0x19210: 0x6cd95020, 0x19211: 0x6c5a8a20, 0x19212: 0x6d22d620, 0x19213: 0x6c484820, - 0x19214: 0x6c48e820, 0x19215: 0x6c8ef820, 0x19216: 0x6c35de20, 0x19217: 0x6d3eec20, - 0x19218: 0x6d3f3220, 0x19219: 0x6c093820, 0x1921a: 0x6cec1620, - 0x1921c: 0x6c8acc20, 0x1921f: 0x6c7af620, - 0x19221: 0x6c4d5a20, 0x19222: 0x6d19b020, 0x19223: 0x6d398820, - 0x19224: 0x6c1d4820, 0x19225: 0x6cfbea20, 0x19226: 0x6d087420, - 0x19228: 0x6cc01420, 0x19229: 0x6cae0c20, 0x1922a: 0x6c4ad620, 0x1922b: 0x6c373e20, - 0x1922c: 0x6c45dc20, 0x1922d: 0x6cbf0820, 0x1922e: 0x6c54ac20, 0x1922f: 0x6c81a620, - 0x19230: 0x6c85a420, 0x19231: 0x6c192220, 0x19232: 0x6cca1620, 0x19233: 0x6d3df420, - 0x19234: 0x6cf2ae20, 0x19235: 0x6cb3d420, 0x19236: 0x6c793020, 0x19237: 0x6cea8820, - 0x19238: 0x6cae5c20, 0x19239: 0x6ce27620, 0x1923a: 0x6cde4a20, 0x1923b: 0x6d3d4c20, - 0x1923c: 0x6c0c8e20, 0x1923d: 0x6c480e20, 0x1923e: 0x6c54be20, - // Block 0x649, offset 0x19240 - 0x19240: 0x6c0de020, 0x19241: 0x6d35de20, 0x19242: 0x6c302e20, 0x19243: 0x6c332220, - 0x19244: 0x6d387220, 0x19245: 0x6ca58a20, 0x19246: 0x6c8c1c20, 0x19247: 0x6cb32a20, - 0x19248: 0x6c613420, 0x19249: 0x6c9f5420, 0x1924a: 0x6cefc220, 0x1924b: 0x6c17ea20, - 0x1924c: 0x6c46b620, 0x1924d: 0x6c053220, 0x1924e: 0x6cc7aa20, 0x1924f: 0x6cdfa820, - 0x19250: 0x6c103a20, 0x19251: 0x6d3f8c20, 0x19252: 0x6c7c3c20, 0x19253: 0x6c815820, - 0x19254: 0x6c4ec220, 0x19255: 0x6d1c7020, 0x19256: 0x6d362620, 0x19257: 0x6c6ac620, - 0x19258: 0x6d040220, 0x19259: 0x6d00b820, 0x1925a: 0x6d0a1620, 0x1925b: 0x6ccd4620, - 0x1925c: 0x6cb9a620, 0x1925d: 0x6d004620, 0x1925e: 0x6cdacc20, 0x1925f: 0x6c4d1820, - 0x19260: 0x6c9d5820, 0x19261: 0x6c5cee20, 0x19262: 0x6caf7220, - 0x19264: 0x6c5be020, 0x19265: 0x6ca34c20, 0x19266: 0x6cd96220, 0x19267: 0x6c07bc20, - 0x19268: 0x6c1d7220, 0x19269: 0x6c6ae220, 0x1926a: 0x6c5a6e20, 0x1926b: 0x6c802c20, - 0x1926d: 0x6c56b420, 0x1926e: 0x6c30b620, 0x1926f: 0x6c5de420, - 0x19270: 0x6c4bd420, 0x19271: 0x6d111c20, 0x19272: 0x6c130420, 0x19273: 0x6c4b1220, - 0x19274: 0x6c66a620, 0x19275: 0x6c65c020, 0x19276: 0x6c29e620, 0x19277: 0x6c6d2420, - 0x19278: 0x6c96cc20, 0x19279: 0x6c5bf820, 0x1927a: 0x6c9e3420, 0x1927b: 0x6c11a820, - 0x1927c: 0x6c94ba20, 0x1927d: 0x6cb0aa20, 0x1927e: 0x6d105a20, 0x1927f: 0x6c726420, - // Block 0x64a, offset 0x19280 - 0x19280: 0x6c726620, 0x19281: 0x6cc3dc20, 0x19283: 0x6cb91220, - 0x19284: 0x6ccc8e20, 0x19286: 0x6c701820, 0x19287: 0x6c5df020, - 0x19288: 0x6d27fa20, 0x19289: 0x6c26b820, 0x1928a: 0x6d07ba20, 0x1928b: 0x6cff0420, - 0x1928c: 0x6c3ac620, 0x1928d: 0x6c131020, 0x1928e: 0x6d132420, - 0x19290: 0x6c2a9820, 0x19292: 0x6cbda020, 0x19293: 0x6c5b6a20, - 0x19294: 0x6cea6c20, 0x19296: 0x6cbb2420, 0x19297: 0x6cf7a020, - 0x19298: 0x6ca64a20, 0x19299: 0x6cc9ce20, 0x1929a: 0x6c9b5620, 0x1929b: 0x6ce95e20, - 0x1929c: 0x6c804220, 0x1929d: 0x6c4ff220, 0x1929e: 0x6c22e620, 0x1929f: 0x6d2d4e20, - 0x192a0: 0x6c023220, 0x192a1: 0x6c95c420, 0x192a2: 0x6c9efa20, - 0x192a4: 0x6c3daa20, 0x192a6: 0x6d010c20, 0x192a7: 0x6c0f8c20, - 0x192a8: 0x6c5c6820, 0x192a9: 0x6cbeb820, 0x192aa: 0x6d010e20, - 0x192ad: 0x6c0fa220, 0x192ae: 0x6cb9dc20, 0x192af: 0x6cb34020, - 0x192b0: 0x6c696820, 0x192b1: 0x6c750a20, 0x192b2: 0x6c7dc620, 0x192b3: 0x6cd97a20, - 0x192b4: 0x6c718e20, 0x192b5: 0x6c36f020, 0x192b6: 0x6ca8c020, 0x192b7: 0x6cb95a20, - 0x192b8: 0x6c2f1a20, 0x192b9: 0x6c2f1c20, 0x192bb: 0x6cb4da20, - 0x192bc: 0x6d33c220, 0x192bd: 0x6cb5c620, 0x192be: 0x6d3c8620, 0x192bf: 0x6c7a1c20, - // Block 0x64b, offset 0x192c0 - 0x192c0: 0x6d20b420, 0x192c1: 0x6cbd5820, 0x192c2: 0x6c7a2620, 0x192c3: 0x6c50d420, - 0x192c4: 0x6c3e0a20, 0x192c6: 0x6c2be220, 0x192c7: 0x6cfca620, - 0x192c8: 0x6c4b3c20, 0x192c9: 0x6c50ee20, 0x192ca: 0x6cc44620, 0x192cb: 0x6c4eaa20, - 0x192cc: 0x6ce7b420, 0x192cd: 0x6c0ee620, 0x192ce: 0x6ccd3e20, 0x192cf: 0x6c08de20, - 0x192d0: 0x6c924e20, 0x192d1: 0x6d12f020, 0x192d2: 0x6ca5e220, 0x192d3: 0x6c1fba20, - 0x192d4: 0x6cca5020, 0x192d5: 0x6c2e2820, 0x192d6: 0x6c925020, 0x192d7: 0x6ce81220, - 0x192d8: 0x6c88bc20, 0x192d9: 0x6c786620, 0x192da: 0x6cca5220, 0x192db: 0x6d31e420, - 0x192dc: 0x6c1fc020, 0x192dd: 0x6c890220, 0x192de: 0x6c998c20, - 0x192e0: 0x6cb90620, 0x192e1: 0x6c769220, 0x192e2: 0x6cceb620, 0x192e3: 0x6cfeea20, - 0x192e4: 0x6c0a2020, 0x192e5: 0x6d2bf420, 0x192e6: 0x6d1b7220, 0x192e7: 0x6cf6bc20, - 0x192e8: 0x6ccdaa20, 0x192e9: 0x6cdb1220, 0x192ea: 0x6cc98e20, 0x192eb: 0x6cc8e820, - 0x192ec: 0x6c219c20, 0x192ed: 0x6c917c20, 0x192ee: 0x6c8d9820, 0x192ef: 0x6c13c620, - 0x192f1: 0x6c593020, - 0x192f4: 0x6c63a220, 0x192f5: 0x6c04ee20, 0x192f6: 0x6c553220, 0x192f7: 0x6c30ec20, - 0x192f9: 0x6c90f020, 0x192fa: 0x6c70d220, 0x192fb: 0x6c73a620, - 0x192fc: 0x6c785c20, 0x192fd: 0x6cdd5220, 0x192fe: 0x6c95f020, 0x192ff: 0x6d303c20, - // Block 0x64c, offset 0x19300 - 0x19300: 0x6c2f7220, 0x19301: 0x6c32d220, 0x19302: 0x6d3b1c20, 0x19303: 0x6d0d3a20, - 0x19304: 0x6cacf420, 0x19305: 0x6c13d820, - 0x1930a: 0x6d15e620, - 0x1930d: 0x6d1f3420, 0x1930e: 0x6c5ae620, 0x1930f: 0x6d11c820, - 0x19310: 0x6d118020, 0x19311: 0x6d34d620, 0x19312: 0x6c45d220, 0x19313: 0x6cb6d420, - 0x19314: 0x6c44ac20, 0x19317: 0x6c545c20, - 0x19318: 0x6c9d2420, 0x19319: 0x6c3df020, 0x1931a: 0x6c54a020, 0x1931b: 0x6c4a1a20, - 0x1931c: 0x6ce05620, 0x1931d: 0x6c2b1a20, 0x1931f: 0x6d0c7220, - 0x19322: 0x6cc26620, - 0x19324: 0x6c16e420, 0x19325: 0x6ca02e20, 0x19326: 0x6ce1bc20, 0x19327: 0x6c063c20, - 0x19328: 0x6c011e20, 0x1932b: 0x6cfbf620, - 0x1932f: 0x6c996e20, - 0x19330: 0x6c811c20, 0x19331: 0x6ca42220, 0x19332: 0x6c070c20, 0x19333: 0x6c18be20, - 0x19335: 0x6c3a0420, 0x19336: 0x6d38e620, 0x19337: 0x6c5ece20, - 0x19338: 0x6c6a1420, 0x19339: 0x6cd5d620, 0x1933b: 0x6c7dd220, - 0x1933c: 0x6c2ea620, 0x1933d: 0x6c925220, - // Block 0x64d, offset 0x19340 - 0x19342: 0x6d215020, 0x19343: 0x6cdf2620, - 0x19344: 0x6c162e20, 0x19345: 0x6c97de20, 0x19346: 0x6c9fb820, 0x19347: 0x6c593220, - 0x19348: 0x6cf15420, 0x19349: 0x6caa9220, 0x1934a: 0x6c593420, 0x1934b: 0x6c540a20, - 0x1934c: 0x6c6e8e20, 0x1934d: 0x6c0f2620, 0x1934e: 0x6cfc2020, 0x1934f: 0x6c864820, - 0x19350: 0x6c6d2620, 0x19352: 0x6c989c20, 0x19353: 0x6cb1ba20, - 0x19354: 0x6c4fde20, 0x19355: 0x6d0fd620, 0x19357: 0x6cfd0a20, - 0x19358: 0x6cdb1420, 0x19359: 0x6cf01620, 0x1935a: 0x6c183c20, 0x1935b: 0x6cf6be20, - 0x1935c: 0x6c6d4c20, 0x1935d: 0x6c135a20, 0x1935e: 0x6c51e420, 0x1935f: 0x6c3b4020, - 0x19360: 0x6ccca620, 0x19361: 0x6c8d6a20, 0x19363: 0x6c337220, - 0x19364: 0x6cb54220, 0x19365: 0x6cb4b820, 0x19366: 0x6d26fa20, 0x19367: 0x6c0f8e20, - 0x19369: 0x6c5c7820, 0x1936a: 0x6c2f0220, 0x1936b: 0x6d0ef620, - 0x1936c: 0x6c72d020, 0x1936d: 0x6c69e020, 0x1936e: 0x6ca44c20, 0x1936f: 0x6c8b8620, - 0x19370: 0x6d20aa20, 0x19371: 0x6ce41c20, 0x19372: 0x6ce47620, 0x19373: 0x6cf42a20, - 0x19374: 0x6c53a220, 0x19375: 0x6cff7220, 0x19376: 0x6c503620, - 0x19378: 0x6ce55c20, 0x19379: 0x6d32ca20, 0x1937b: 0x6c59a020, - 0x1937c: 0x6c403420, 0x1937f: 0x6cea2c20, - // Block 0x64e, offset 0x19380 - 0x19381: 0x6cc61a20, 0x19382: 0x6c68ba20, - 0x19384: 0x6d031c20, 0x19387: 0x6d260020, - 0x19388: 0x6c73ee20, 0x19389: 0x6c572820, 0x1938b: 0x6c056020, - 0x1938c: 0x6ca1c420, 0x1938e: 0x6c425e20, 0x1938f: 0x6cef9220, - 0x19391: 0x6c9a8020, 0x19392: 0x6cd89c20, 0x19393: 0x6c0b8820, - 0x19394: 0x6c914220, 0x19395: 0x6cc0e620, - 0x19398: 0x6c43da20, 0x19399: 0x6d303e20, 0x1939a: 0x6c938c20, 0x1939b: 0x6cac2020, - 0x1939c: 0x6cc66220, 0x1939d: 0x6cc03020, 0x1939e: 0x6c8aea20, 0x1939f: 0x6c45e020, - 0x193a0: 0x6cfbf820, 0x193a1: 0x6cf86e20, 0x193a2: 0x6d02c620, - 0x193a4: 0x6ca79620, - 0x193a8: 0x6d00a220, 0x193a9: 0x6c8afe20, 0x193aa: 0x6c3d6420, 0x193ab: 0x6c25d620, - 0x193ac: 0x6d3d4e20, 0x193ad: 0x6c034820, 0x193ae: 0x6d429c20, 0x193af: 0x6d305020, - 0x193b0: 0x6d416e20, 0x193b1: 0x6c510620, 0x193b2: 0x6c601a20, - 0x193b4: 0x6c648620, - 0x193b8: 0x6ce8b020, 0x193b9: 0x6cfb5c20, 0x193ba: 0x6d0d8620, 0x193bb: 0x6ce0f420, - 0x193bc: 0x6cde5620, 0x193bd: 0x6c2bf620, 0x193be: 0x6c744c20, 0x193bf: 0x6c01fc20, - // Block 0x64f, offset 0x193c0 - 0x193c0: 0x6c4e1020, 0x193c1: 0x6cff8820, 0x193c2: 0x6c712020, 0x193c3: 0x6cee8c20, - 0x193c4: 0x6c054c20, 0x193c5: 0x6d3c5e20, 0x193c6: 0x6ca82e20, 0x193c7: 0x6ce53820, - 0x193c8: 0x6ca3c020, 0x193cb: 0x6d1fd420, - 0x193cc: 0x6c9dc620, 0x193cf: 0x6ca3c820, - 0x193d0: 0x6cd13c20, 0x193d1: 0x6c13a220, 0x193d2: 0x6d0c1020, 0x193d3: 0x6c44b620, - 0x193d4: 0x6c1d5420, 0x193d5: 0x6cc86420, 0x193d6: 0x6c63ca20, 0x193d7: 0x6cbd8220, - 0x193d8: 0x6c98e620, 0x193d9: 0x6c365c20, 0x193da: 0x6c863220, 0x193db: 0x6c1b3420, - 0x193dc: 0x6d29da20, 0x193dd: 0x6c513820, 0x193de: 0x6c6ae420, 0x193df: 0x6ca72c20, - 0x193e1: 0x6c499020, 0x193e2: 0x6c540c20, 0x193e3: 0x6c414220, - 0x193e5: 0x6c07be20, 0x193e6: 0x6cdd8020, 0x193e7: 0x6cf37220, - 0x193e8: 0x6c623820, 0x193e9: 0x6cf66a20, 0x193ea: 0x6cbf4a20, 0x193eb: 0x6c515820, - 0x193ec: 0x6cf23020, 0x193ed: 0x6cfb7220, 0x193ee: 0x6c6b0820, 0x193ef: 0x6c5cf820, - 0x193f0: 0x6cb00420, 0x193f1: 0x6cd00620, 0x193f2: 0x6c1d7620, 0x193f3: 0x6d324e20, - 0x193f5: 0x6d2d8a20, 0x193f6: 0x6cd78a20, 0x193f7: 0x6c5f0420, - 0x193f8: 0x6cd99420, 0x193f9: 0x6d354220, 0x193fa: 0x6c07a220, - 0x193fe: 0x6c810e20, 0x193ff: 0x6c0a2220, - // Block 0x650, offset 0x19400 - 0x19400: 0x6d08ae20, 0x19401: 0x6cade820, 0x19402: 0x6c278a20, - 0x19404: 0x6d340e20, 0x19405: 0x6cb00e20, 0x19406: 0x6c15d420, 0x19407: 0x6c0a2420, - 0x19408: 0x6cdafa20, 0x19409: 0x6c5df220, 0x1940a: 0x6c523420, 0x1940b: 0x6c6f2a20, - 0x1940c: 0x6c200620, 0x1940d: 0x6c67b420, 0x1940e: 0x6ca5a020, 0x1940f: 0x6c47be20, - 0x19410: 0x6c39de20, 0x19413: 0x6cde9a20, - 0x19414: 0x6c256020, 0x19415: 0x6cf6c220, 0x19416: 0x6c2a8420, 0x19417: 0x6cfb9020, - 0x19418: 0x6c7b7220, 0x19419: 0x6d308a20, 0x1941a: 0x6cddfc20, 0x1941b: 0x6c55ae20, - 0x1941c: 0x6c256220, 0x1941d: 0x6c92c820, 0x1941e: 0x6c738c20, 0x1941f: 0x6c92ca20, - 0x19420: 0x6cba7220, 0x19421: 0x6cad9620, 0x19422: 0x6d326c20, - 0x19424: 0x6c867a20, 0x19425: 0x6c128e20, 0x19426: 0x6cb64a20, - 0x19429: 0x6ce41e20, 0x1942a: 0x6c8d6c20, 0x1942b: 0x6cc1d420, - 0x1942c: 0x6c88cc20, 0x1942d: 0x6c91e020, 0x1942e: 0x6cd54020, 0x1942f: 0x6c462620, - 0x19430: 0x6d309a20, 0x19431: 0x6cad3c20, 0x19432: 0x6c6d5a20, 0x19433: 0x6cbe9020, - 0x19436: 0x6d3fc420, 0x19437: 0x6cb46620, - 0x19438: 0x6c6cbc20, 0x19439: 0x6c0c8620, 0x1943a: 0x6c66ee20, 0x1943b: 0x6c4bf220, - 0x1943e: 0x6d2a3020, 0x1943f: 0x6c8b5a20, - // Block 0x651, offset 0x19440 - 0x19440: 0x6c848a20, 0x19441: 0x6c95c620, 0x19442: 0x6cd08620, 0x19443: 0x6c9de220, - 0x19444: 0x6c66fc20, 0x19445: 0x6c2bb020, 0x19446: 0x6c076a20, - 0x19448: 0x6c88d420, 0x1944a: 0x6cfbc620, 0x1944b: 0x6cb22220, - 0x1944c: 0x6cc41620, 0x1944d: 0x6c8fda20, 0x1944e: 0x6d41e020, - 0x19450: 0x6c74fe20, 0x19451: 0x6ccd2020, 0x19452: 0x6d092620, - 0x19454: 0x6d027820, 0x19456: 0x6c804e20, 0x19457: 0x6cb6aa20, - 0x19458: 0x6d159820, 0x19459: 0x6caad420, 0x1945a: 0x6c84ca20, 0x1945b: 0x6d271e20, - 0x1945d: 0x6d15be20, 0x1945e: 0x6c1a9220, 0x1945f: 0x6c619620, - 0x19460: 0x6c4f4a20, 0x19461: 0x6d015e20, 0x19462: 0x6c792a20, 0x19463: 0x6d3e1020, - 0x19464: 0x6c509220, 0x19465: 0x6cf86220, 0x19466: 0x6cc26820, 0x19467: 0x6c4d1020, - 0x19468: 0x6cf95220, 0x19469: 0x6c4d1220, 0x1946a: 0x6c4a4820, 0x1946b: 0x6c14c220, - 0x1946c: 0x6d09fa20, 0x1946d: 0x6d058220, 0x1946e: 0x6cd09c20, 0x1946f: 0x6c79e820, - 0x19470: 0x6cf96020, 0x19471: 0x6ccc4a20, 0x19472: 0x6d208a20, 0x19473: 0x6d0bae20, - 0x19474: 0x6cb3f220, 0x19475: 0x6d40bc20, 0x19476: 0x6d1fc820, 0x19477: 0x6d3f3e20, - 0x19478: 0x6c88be20, 0x19479: 0x6cfaaa20, 0x1947a: 0x6cfa3e20, 0x1947b: 0x6d15f620, - 0x1947c: 0x6ccc5820, 0x1947d: 0x6d0e8420, 0x1947e: 0x6c69a220, 0x1947f: 0x6cf66e20, - // Block 0x652, offset 0x19480 - 0x19480: 0x6c1bb620, 0x19481: 0x6cd3b220, 0x19482: 0x6c774620, 0x19483: 0x6d1afc20, - 0x19484: 0x6c522420, 0x19485: 0x6d189620, 0x19486: 0x6cf6e820, 0x19487: 0x6ccb6a20, - 0x19488: 0x6c6d5c20, 0x19489: 0x6d135e20, 0x1948a: 0x6d1ec420, 0x1948b: 0x6cc41820, - 0x1948c: 0x6d129a20, 0x1948d: 0x6c945e20, 0x1948e: 0x6c7d9c20, 0x1948f: 0x6d333820, - 0x19494: 0x6d003a20, 0x19496: 0x6c253a20, 0x19497: 0x6d04e420, - 0x19498: 0x6c01d820, 0x19499: 0x6d051e20, 0x1949a: 0x6c118820, 0x1949b: 0x6c201820, - 0x1949c: 0x6d2c1e20, 0x1949e: 0x6d16f420, 0x1949f: 0x6caf4420, - 0x194a0: 0x6c7a3020, 0x194a1: 0x6cd0fa20, 0x194a2: 0x6c80bc20, 0x194a3: 0x6ce9e420, - 0x194a4: 0x6cf61020, 0x194a5: 0x6c8d0620, 0x194a6: 0x6cb4f820, 0x194a7: 0x6cf2f020, - 0x194a8: 0x6c88fa20, 0x194a9: 0x6c319e20, 0x194aa: 0x6c9af420, 0x194ab: 0x6c807220, - 0x194ac: 0x6cefdc20, 0x194ad: 0x6c32ca20, 0x194ae: 0x6c7b2a20, 0x194af: 0x6c004c20, - 0x194b0: 0x6d291a20, 0x194b1: 0x6c5bfa20, 0x194b2: 0x6d182620, 0x194b3: 0x6ca14c20, - 0x194b4: 0x6d3f5e20, 0x194b5: 0x6c3be820, 0x194b6: 0x6caec420, - 0x194b8: 0x6c0a6c20, 0x194b9: 0x6c871e20, 0x194ba: 0x6c918220, 0x194bb: 0x6c964620, - 0x194bc: 0x6c4d0a20, 0x194bd: 0x6d31bc20, 0x194be: 0x6c40ee20, 0x194bf: 0x6cc3ac20, - // Block 0x653, offset 0x194c0 - 0x194c0: 0x6d315220, 0x194c1: 0x6c797a20, 0x194c2: 0x6c1a0420, 0x194c3: 0x6c6ffe20, - 0x194c4: 0x6c746420, 0x194c5: 0x6c623a20, 0x194c6: 0x6c8d5620, - 0x194c8: 0x6cceaa20, 0x194c9: 0x6cc40020, 0x194ca: 0x6cc8ea20, 0x194cb: 0x6c21ac20, - 0x194cc: 0x6ca5b220, 0x194cd: 0x6d339820, 0x194ce: 0x6c907a20, 0x194cf: 0x6cad3620, - 0x194d2: 0x6c063820, 0x194d3: 0x6cc66420, - 0x194d4: 0x6cfa9a20, 0x194d5: 0x6c832c20, 0x194d6: 0x6cfeb420, 0x194d7: 0x6c3d6620, - 0x194d8: 0x6cc18620, 0x194da: 0x6ccbe820, 0x194db: 0x6d352c20, - 0x194dc: 0x6cdfe020, 0x194dd: 0x6cc70e20, 0x194de: 0x6cda4a20, 0x194df: 0x6d1cf620, - 0x194e0: 0x6c98e820, 0x194e1: 0x6ca3ca20, 0x194e2: 0x6c0baa20, - 0x194e4: 0x6cd65820, 0x194e5: 0x6ce11020, 0x194e6: 0x6c4ee220, 0x194e7: 0x6ccaf620, - 0x194e8: 0x6cc69420, 0x194ea: 0x6c2aa820, 0x194eb: 0x6cb44e20, - 0x194ec: 0x6c687820, 0x194ed: 0x6ce07620, 0x194ef: 0x6cc48e20, - 0x194f0: 0x6ca92c20, 0x194f1: 0x6c8b5c20, 0x194f2: 0x6c2f2020, 0x194f3: 0x6c2e8620, - 0x194f4: 0x6d381620, 0x194f6: 0x6c93f420, 0x194f7: 0x6c28b020, - 0x194f8: 0x6cf56020, 0x194f9: 0x6c4aba20, 0x194fa: 0x6c5fbe20, 0x194fb: 0x6ca67620, - 0x194fc: 0x6d164a20, 0x194fd: 0x6ca75820, 0x194fe: 0x6d221e20, 0x194ff: 0x6cedf220, - // Block 0x654, offset 0x19500 - 0x19500: 0x6c4ce620, 0x19501: 0x6d2b3c20, 0x19502: 0x6d0c5820, 0x19503: 0x6c251a20, - 0x19504: 0x6cfb2620, 0x19505: 0x6c68be20, 0x19506: 0x6ce80620, 0x19507: 0x6c3fac20, - 0x19508: 0x6cae0020, 0x1950a: 0x6d1e9220, 0x1950b: 0x6cbfa220, - 0x1950c: 0x6d0ad620, 0x1950d: 0x6c107220, 0x1950e: 0x6c0b7c20, 0x1950f: 0x6cd31c20, - 0x19510: 0x6d2c2220, 0x19511: 0x6d16c020, 0x19512: 0x6c0b7e20, - 0x19514: 0x6c333820, 0x19515: 0x6c7f8e20, 0x19516: 0x6d13d820, 0x19517: 0x6c149220, - 0x19518: 0x6c1cb220, 0x19519: 0x6d087820, 0x1951a: 0x6d069220, 0x1951b: 0x6d20d820, - 0x1951c: 0x6d04c020, - 0x19520: 0x6cde3620, 0x19521: 0x6c4c1620, - 0x19525: 0x6c906420, 0x19526: 0x6d018220, 0x19527: 0x6c180c20, - 0x19528: 0x6c657e20, 0x19529: 0x6cdf9820, 0x1952a: 0x6cb08c20, 0x1952b: 0x6d296820, - 0x1952c: 0x6d080620, 0x1952d: 0x6cfb3c20, 0x1952e: 0x6ca7d220, - 0x19534: 0x6c9d3820, 0x19535: 0x6c61f020, 0x19536: 0x6caa1c20, 0x19537: 0x6c54c020, - 0x19538: 0x6c571020, 0x19539: 0x6cee1020, 0x1953a: 0x6d1f2a20, 0x1953b: 0x6d2ac020, - 0x1953c: 0x6c09a020, 0x1953d: 0x6c9cee20, 0x1953e: 0x6cbab020, 0x1953f: 0x6d019220, - // Block 0x655, offset 0x19540 - 0x19540: 0x6c394420, 0x19541: 0x6d176020, 0x19542: 0x6cdfa020, 0x19543: 0x6c832e20, - 0x19544: 0x6d1e2e20, 0x19546: 0x6c6d0220, 0x19547: 0x6ccf4a20, - 0x19548: 0x6d1b4820, 0x19549: 0x6c613820, 0x1954b: 0x6cdaa620, - 0x1954f: 0x6cee1c20, - 0x19550: 0x6c9e5820, 0x19551: 0x6cdab420, 0x19552: 0x6d17a620, 0x19553: 0x6ccc8820, - 0x19554: 0x6cf61420, 0x19555: 0x6c603e20, 0x19556: 0x6c960020, 0x19557: 0x6d1ea620, - 0x19558: 0x6c998220, 0x19559: 0x6d2c7c20, 0x1955a: 0x6cdc4020, 0x1955b: 0x6d362a20, - 0x1955c: 0x6c0b9c20, 0x1955d: 0x6c83d820, - 0x19565: 0x6cbc4820, 0x19566: 0x6c498e20, 0x19567: 0x6cf64a20, - 0x19568: 0x6d324a20, 0x19569: 0x6d1d9020, 0x1956a: 0x6ca84020, 0x1956b: 0x6c75ca20, - 0x1956c: 0x6d01c620, 0x1956d: 0x6d11b620, 0x1956e: 0x6d01c820, 0x1956f: 0x6d33f020, - 0x19570: 0x6ca5a820, 0x19572: 0x6cd7f420, 0x19573: 0x6c903620, - 0x19574: 0x6c18d220, 0x19575: 0x6c9d5c20, 0x19576: 0x6cc3cc20, 0x19577: 0x6c27e420, - 0x19578: 0x6ccd4820, - 0x1957c: 0x6cdae820, 0x1957d: 0x6d01da20, 0x1957e: 0x6c0f2820, 0x1957f: 0x6c2f7a20, - // Block 0x656, offset 0x19580 - 0x19580: 0x6d40ca20, 0x19582: 0x6cd5f220, 0x19583: 0x6ccf2220, - 0x19584: 0x6c4ee420, 0x19585: 0x6cdfb220, 0x19586: 0x6c431420, - 0x1958a: 0x6ca36420, 0x1958b: 0x6c9d7a20, - 0x1958c: 0x6d0a3020, 0x1958d: 0x6c9afa20, 0x1958e: 0x6c66b420, 0x1958f: 0x6c24fe20, - 0x19590: 0x6c749220, 0x19591: 0x6c51de20, 0x19592: 0x6c3ac820, 0x19593: 0x6cd28220, - 0x19594: 0x6c17f220, 0x19595: 0x6cd0c220, 0x19596: 0x6caa8a20, 0x19597: 0x6cb2c420, - 0x19598: 0x6c980220, - 0x1959d: 0x6d189a20, 0x1959e: 0x6c1dda20, - 0x195a0: 0x6c7a6220, 0x195a1: 0x6c05d420, 0x195a2: 0x6c825a20, 0x195a3: 0x6c787020, - 0x195a4: 0x6ccc7820, 0x195a5: 0x6c0a4e20, 0x195a6: 0x6cdbfc20, 0x195a7: 0x6c443420, - 0x195a8: 0x6cb0c020, 0x195a9: 0x6d189c20, 0x195aa: 0x6cfb9220, 0x195ab: 0x6ca6c820, - 0x195ac: 0x6d1c9820, 0x195ad: 0x6d3a8020, 0x195ae: 0x6c216220, 0x195af: 0x6c3cbc20, - 0x195b0: 0x6d074620, 0x195b1: 0x6cb19c20, 0x195b2: 0x6cf48020, 0x195b3: 0x6c8a2420, - 0x195b4: 0x6c124c20, 0x195b5: 0x6d409020, 0x195b6: 0x6d422a20, 0x195b7: 0x6c0bc620, - 0x195b8: 0x6d122a20, 0x195b9: 0x6c58a420, 0x195ba: 0x6cac3220, 0x195bb: 0x6d04fa20, - 0x195bd: 0x6c82ea20, 0x195be: 0x6cbee420, 0x195bf: 0x6d001220, - // Block 0x657, offset 0x195c0 - 0x195c0: 0x6c689620, 0x195c1: 0x6c4c9420, - 0x195c4: 0x6d0cf020, 0x195c5: 0x6d092420, 0x195c6: 0x6d39e220, 0x195c7: 0x6c527e20, - 0x195c8: 0x6d1cb820, 0x195c9: 0x6cf71620, - 0x195cc: 0x6c889220, 0x195cd: 0x6cfc4820, 0x195ce: 0x6c58bc20, 0x195cf: 0x6d1a1620, - 0x195d1: 0x6c892a20, 0x195d2: 0x6ccd6020, 0x195d3: 0x6c125220, - 0x195d4: 0x6c077020, 0x195d5: 0x6c662220, 0x195d6: 0x6cd63020, 0x195d7: 0x6c397a20, - 0x195d8: 0x6c2d9820, 0x195da: 0x6c03d820, 0x195db: 0x6d21fe20, - 0x195de: 0x6ca47420, 0x195df: 0x6c831420, - 0x195e0: 0x6d198220, 0x195e1: 0x6c272820, 0x195e3: 0x6c14ea20, - 0x195e4: 0x6c178e20, 0x195e5: 0x6c416a20, 0x195e6: 0x6c6cdc20, 0x195e7: 0x6ca59220, - 0x195eb: 0x6c8a6a20, - 0x195ec: 0x6ca0e620, 0x195ed: 0x6d1fb220, 0x195ef: 0x6c8f2820, - 0x195f0: 0x6c4de620, 0x195f2: 0x6d1e7420, 0x195f3: 0x6c6cf020, - 0x195f4: 0x6c1b8c20, 0x195f5: 0x6cc5dc20, 0x195f6: 0x6ca9b620, - 0x195f9: 0x6c53ba20, 0x195fa: 0x6ce53620, - 0x195fc: 0x6c002420, 0x195fd: 0x6c485620, 0x195fe: 0x6c0bf820, 0x195ff: 0x6c0eea20, - // Block 0x658, offset 0x19600 - 0x19600: 0x6cbf1420, 0x19602: 0x6cd5d820, 0x19603: 0x6c20ee20, - 0x19604: 0x6c5b5420, 0x19605: 0x6c179a20, 0x19606: 0x6c3ff220, 0x19607: 0x6c5ab620, - 0x19608: 0x6c363a20, 0x19609: 0x6cf09a20, 0x1960a: 0x6c3b7820, 0x1960b: 0x6cdfe220, - 0x1960d: 0x6c94fa20, 0x1960e: 0x6c51cc20, 0x1960f: 0x6d1e4a20, - 0x19610: 0x6c5b5a20, 0x19612: 0x6d215820, 0x19613: 0x6d3ff820, - 0x19614: 0x6d0e8a20, 0x19615: 0x6cc07420, 0x19616: 0x6d2fbc20, 0x19617: 0x6c6f1a20, - 0x19618: 0x6cdf2820, - 0x1961f: 0x6cea0820, - 0x19620: 0x6c8bc220, 0x19621: 0x6c6f2620, 0x19622: 0x6d2c8220, 0x19623: 0x6d038620, - 0x19624: 0x6c56ba20, 0x19626: 0x6d071020, - 0x1962a: 0x6c254c20, 0x1962b: 0x6cbeb020, - 0x1962c: 0x6ca14e20, 0x1962e: 0x6d2a2220, 0x1962f: 0x6c084c20, - 0x19630: 0x6c1ace20, 0x19633: 0x6d0ebc20, - 0x19634: 0x6c443620, 0x19635: 0x6ca16220, 0x19636: 0x6c075c20, 0x19637: 0x6c732820, - 0x19638: 0x6c2ee620, 0x19639: 0x6d2fe020, 0x1963b: 0x6cf3ea20, - 0x1963c: 0x6d0ebe20, 0x1963e: 0x6c74c620, 0x1963f: 0x6cfade20, - // Block 0x659, offset 0x19640 - 0x19640: 0x6cdf4a20, 0x19641: 0x6c4e6620, 0x19643: 0x6c2d2c20, - 0x19644: 0x6c62ac20, 0x19645: 0x6c6b6020, 0x19647: 0x6d414c20, - 0x19649: 0x6d025820, 0x1964a: 0x6c7f7620, 0x1964b: 0x6c38e220, - 0x1964c: 0x6c5e4020, 0x1964d: 0x6cf92820, 0x1964e: 0x6ca8b620, 0x1964f: 0x6c9cb820, - 0x19650: 0x6cc49c20, 0x19651: 0x6c24c220, 0x19652: 0x6d1a3220, 0x19653: 0x6c9d2820, - 0x19655: 0x6c747e20, 0x19656: 0x6cc0ea20, 0x19657: 0x6ce73820, - 0x19658: 0x6ced7a20, 0x19659: 0x6d2ffc20, 0x1965a: 0x6c84fe20, 0x1965b: 0x6cce9c20, - 0x1965c: 0x6c79a620, 0x1965d: 0x6cfa7e20, 0x1965e: 0x6d301e20, 0x1965f: 0x6d33c420, - 0x19660: 0x6ce5be20, 0x19661: 0x6cd4bc20, 0x19662: 0x6c073e20, 0x19663: 0x6d136220, - 0x19664: 0x6cb14c20, 0x19665: 0x6c164420, 0x19666: 0x6c563e20, 0x19667: 0x6c791620, - 0x19668: 0x6c6f4a20, 0x19669: 0x6c011620, 0x1966a: 0x6c213020, 0x1966b: 0x6cb97620, - 0x1966c: 0x6c06ea20, 0x1966d: 0x6c032620, 0x1966e: 0x6c3b6020, 0x1966f: 0x6c77d620, - 0x19670: 0x6ceafc20, 0x19671: 0x6ceafe20, 0x19672: 0x6d423020, 0x19673: 0x6c8cbc20, - 0x19675: 0x6c4aea20, 0x19676: 0x6d0be620, 0x19677: 0x6cd35420, - 0x19678: 0x6c545220, 0x19679: 0x6c8b0020, 0x1967a: 0x6ccbee20, 0x1967b: 0x6cd8b220, - 0x1967d: 0x6c071020, 0x1967e: 0x6cc5e820, 0x1967f: 0x6c319820, - // Block 0x65a, offset 0x19680 - 0x19680: 0x6c0eec20, 0x19681: 0x6c895620, 0x19682: 0x6cba0c20, 0x19683: 0x6c3aac20, - 0x19684: 0x6c624220, 0x19685: 0x6d3ffa20, 0x19686: 0x6c5ac820, 0x19687: 0x6c514020, - 0x19688: 0x6c83e420, 0x19689: 0x6d259620, 0x1968a: 0x6d26ce20, 0x1968b: 0x6d04e620, - 0x1968c: 0x6c15d620, 0x1968d: 0x6c2b8c20, 0x1968e: 0x6c825020, 0x1968f: 0x6c6cae20, - 0x19690: 0x6c1d1c20, 0x19691: 0x6cd8ec20, 0x19692: 0x6cb49a20, 0x19693: 0x6d11d420, - 0x19694: 0x6c678620, 0x19695: 0x6c583620, 0x19696: 0x6c595620, 0x19697: 0x6ce1f620, - 0x19698: 0x6cc82c20, 0x19699: 0x6cf26620, 0x1969a: 0x6d1ccc20, 0x1969b: 0x6cc53420, - 0x1969c: 0x6d1a3420, 0x1969d: 0x6cd30e20, 0x1969e: 0x6d1a2620, 0x1969f: 0x6c73e220, - 0x196a0: 0x6cea4020, 0x196a1: 0x6d080020, 0x196a2: 0x6c632e20, 0x196a3: 0x6d379e20, - 0x196a4: 0x6cbc9820, 0x196a5: 0x6d3ab220, 0x196a6: 0x6c2db020, - 0x196a8: 0x6d201820, 0x196ab: 0x6d14a420, - 0x196ac: 0x6cd2c220, 0x196ad: 0x6d16fa20, 0x196ae: 0x6ca0e820, - 0x196b1: 0x6cc3ae20, 0x196b2: 0x6cfea420, 0x196b3: 0x6cf3ba20, - 0x196b4: 0x6c44c020, 0x196b5: 0x6d1ce620, 0x196b6: 0x6ce66820, 0x196b7: 0x6cd2c620, - 0x196b8: 0x6ca5cc20, 0x196b9: 0x6c44c620, 0x196ba: 0x6cde5020, 0x196bb: 0x6cf28a20, - 0x196bc: 0x6c711820, 0x196bd: 0x6c15a820, 0x196be: 0x6cb19620, 0x196bf: 0x6d3d5420, - // Block 0x65b, offset 0x196c0 - 0x196c0: 0x6c54c420, 0x196c1: 0x6ca4fa20, 0x196c2: 0x6d0c9820, 0x196c3: 0x6c468620, - 0x196c4: 0x6d225c20, 0x196c5: 0x6c540420, 0x196c7: 0x6cd7f620, - 0x196c8: 0x6c1aba20, 0x196c9: 0x6c56a420, 0x196ca: 0x6d105220, 0x196cb: 0x6cf22e20, - 0x196cc: 0x6cfcd020, 0x196cd: 0x6cb21020, 0x196ce: 0x6cc69c20, 0x196cf: 0x6c90a820, - 0x196d0: 0x6c81b420, 0x196d1: 0x6cccfe20, 0x196d2: 0x6cfef020, 0x196d3: 0x6d2ae220, - 0x196d4: 0x6c4d7820, 0x196d5: 0x6c38b420, 0x196d6: 0x6c4e6220, 0x196d7: 0x6c14d420, - 0x196d8: 0x6d2e7620, 0x196da: 0x6cde1620, 0x196db: 0x6d3b2a20, - 0x196dc: 0x6ca9c820, 0x196dd: 0x6c4f1820, 0x196de: 0x6d21b620, 0x196df: 0x6d3db420, - 0x196e0: 0x6d205c20, 0x196e1: 0x6c86fc20, 0x196e2: 0x6c5e2a20, 0x196e3: 0x6cf73e20, - 0x196e4: 0x6cfb0020, 0x196e5: 0x6c155820, 0x196e6: 0x6c889420, - 0x196e8: 0x6cd7be20, 0x196e9: 0x6c6fce20, 0x196ea: 0x6cb42820, 0x196eb: 0x6cbffc20, - 0x196ec: 0x6c45d620, 0x196ed: 0x6d3ee820, 0x196ee: 0x6d20bc20, - 0x196f1: 0x6cc62820, 0x196f2: 0x6ca98420, 0x196f3: 0x6c99d820, - 0x196f4: 0x6c032820, 0x196f5: 0x6c6f9820, 0x196f7: 0x6d069620, - 0x196f8: 0x6cb29020, 0x196f9: 0x6c0b8a20, 0x196fa: 0x6c995420, - 0x196ff: 0x6d14ce20, - // Block 0x65c, offset 0x19700 - 0x19700: 0x6d20f620, 0x19702: 0x6cb29220, 0x19703: 0x6cc0f220, - 0x19704: 0x6c05f420, 0x19705: 0x6c5bae20, - 0x19709: 0x6c109420, 0x1970a: 0x6c985820, 0x1970b: 0x6c7e7020, - 0x1970c: 0x6ce8a820, 0x1970d: 0x6cf3c220, 0x1970e: 0x6c85ec20, 0x1970f: 0x6c8cea20, - 0x19711: 0x6c620220, 0x19712: 0x6c75bc20, 0x19713: 0x6d405620, - 0x19714: 0x6c349220, 0x19715: 0x6c745020, 0x19716: 0x6c277020, 0x19717: 0x6c073220, - 0x1971d: 0x6c7e8020, 0x1971e: 0x6c0d3e20, 0x1971f: 0x6cdbf820, - 0x19720: 0x6ce8c220, 0x19721: 0x6d08e220, - 0x19727: 0x6c350c20, - 0x1972a: 0x6cdc5420, 0x1972b: 0x6c0a2e20, - 0x1972c: 0x6ce87420, 0x1972d: 0x6ccb4a20, 0x1972e: 0x6c120020, 0x1972f: 0x6ce8e420, - 0x19730: 0x6c9e3620, 0x19731: 0x6c6c5220, 0x19732: 0x6c93b020, - 0x19735: 0x6d2e8020, 0x19736: 0x6c08f620, 0x19737: 0x6c60ac20, - 0x19738: 0x6d2b7420, 0x19739: 0x6d07d620, 0x1973a: 0x6c86a020, - 0x1973d: 0x6cdc8220, 0x1973e: 0x6d1dc220, 0x1973f: 0x6cd57620, - // Block 0x65d, offset 0x19740 - 0x19742: 0x6c358620, - 0x19747: 0x6cbf8620, - 0x19748: 0x6c958020, 0x19749: 0x6d322220, 0x1974a: 0x6cea4620, 0x1974b: 0x6c46fe20, - 0x1974c: 0x6d223c20, 0x1974d: 0x6c82be20, 0x1974e: 0x6c0eee20, 0x1974f: 0x6ca56e20, - 0x19750: 0x6cb12020, 0x19751: 0x6c890e20, 0x19752: 0x6ce17a20, 0x19753: 0x6c883820, - 0x19754: 0x6cf16220, 0x19755: 0x6c291020, 0x19756: 0x6c87be20, 0x19757: 0x6ce65e20, - 0x19758: 0x6cec1820, 0x19759: 0x6d390220, 0x1975a: 0x6c426620, 0x1975b: 0x6d03d220, - 0x1975c: 0x6c021420, 0x1975d: 0x6c393820, 0x1975e: 0x6caf0e20, 0x1975f: 0x6c0eda20, - 0x19760: 0x6ceb0620, 0x19761: 0x6cd4d020, 0x19762: 0x6d14e420, 0x19763: 0x6c0ef020, - 0x19764: 0x6cbcb820, 0x19765: 0x6ce80e20, 0x19766: 0x6c45e820, 0x19767: 0x6ce74820, - 0x19768: 0x6c4e1220, 0x19769: 0x6c1a0820, 0x1976a: 0x6c6ace20, 0x1976b: 0x6c593a20, - 0x1976c: 0x6d042c20, 0x1976d: 0x6c2d6220, 0x1976e: 0x6c146a20, 0x1976f: 0x6c308020, - 0x19770: 0x6caffc20, 0x19771: 0x6cc86a20, 0x19772: 0x6c8b2220, 0x19773: 0x6cd14020, - 0x19774: 0x6cab8420, 0x19775: 0x6c2c8020, 0x19776: 0x6d217020, 0x19777: 0x6c200220, - 0x19778: 0x6cc6a220, 0x19779: 0x6c774820, 0x1977a: 0x6ce12420, 0x1977b: 0x6c23b620, - 0x1977c: 0x6cb18220, 0x1977d: 0x6c209820, 0x1977e: 0x6c92ce20, 0x1977f: 0x6ce79020, - // Block 0x65e, offset 0x19780 - 0x19780: 0x6d336620, 0x19781: 0x6c86a420, 0x19782: 0x6cc9a020, 0x19783: 0x6cac4420, - 0x19784: 0x6cd82e20, 0x19786: 0x6c291220, 0x19787: 0x6c55de20, - 0x19788: 0x6d190c20, 0x19789: 0x6cfd3220, 0x1978a: 0x6d028020, 0x1978b: 0x6c958820, - 0x1978c: 0x6c8f5e20, 0x1978e: 0x6cdfea20, 0x1978f: 0x6c422e20, - 0x19791: 0x6ce01c20, - 0x19795: 0x6d1ef020, 0x19796: 0x6ca3e020, - 0x19798: 0x6c429a20, 0x19799: 0x6c759820, 0x1979a: 0x6c1bfe20, 0x1979b: 0x6c464020, - 0x1979c: 0x6cecfa20, 0x1979d: 0x6c85ee20, 0x1979e: 0x6c8e5420, 0x1979f: 0x6c8b0a20, - 0x197a0: 0x6cf9c420, 0x197a1: 0x6c06ac20, 0x197a2: 0x6c018a20, 0x197a3: 0x6d237220, - 0x197a4: 0x6c713220, 0x197a5: 0x6cc75820, 0x197a6: 0x6d0a3420, 0x197a7: 0x6d3e7a20, - 0x197a8: 0x6c25ee20, 0x197a9: 0x6c120620, 0x197aa: 0x6d2baa20, 0x197ab: 0x6d1dc420, - 0x197ac: 0x6c407420, 0x197ad: 0x6cc88a20, 0x197af: 0x6cf7cc20, - 0x197b0: 0x6cd5e620, 0x197b1: 0x6c68c020, 0x197b2: 0x6c68c220, 0x197b3: 0x6d057020, - 0x197b4: 0x6d2f2620, 0x197b7: 0x6cd71220, - 0x197b8: 0x6c18a820, 0x197b9: 0x6c390820, 0x197ba: 0x6c5ff820, 0x197bb: 0x6d33a820, - 0x197bd: 0x6c480420, 0x197be: 0x6cf4d620, - // Block 0x65f, offset 0x197c0 - 0x197c0: 0x6cbcae20, 0x197c1: 0x6cd5bc20, 0x197c2: 0x6c4d1420, 0x197c3: 0x6ceb0820, - 0x197c4: 0x6c319020, 0x197c5: 0x6d3f0220, 0x197c6: 0x6cc46e20, 0x197c7: 0x6ca27820, - 0x197c8: 0x6c3fd020, 0x197c9: 0x6c8cca20, 0x197ca: 0x6c601e20, 0x197cb: 0x6d04ce20, - 0x197cc: 0x6d084c20, 0x197cd: 0x6ca37820, 0x197ce: 0x6d0aee20, 0x197cf: 0x6c6be020, - 0x197d0: 0x6c85f020, 0x197d1: 0x6c269c20, 0x197d2: 0x6cc7a020, 0x197d3: 0x6d24ee20, - 0x197d4: 0x6c939c20, 0x197d5: 0x6cd06220, 0x197d6: 0x6c851820, 0x197d7: 0x6c89bc20, - 0x197d8: 0x6c450e20, 0x197d9: 0x6d033820, 0x197da: 0x6d004420, 0x197db: 0x6cbdd820, - 0x197dc: 0x6cbcc220, 0x197dd: 0x6c182020, 0x197de: 0x6d1f3c20, 0x197df: 0x6c109a20, - 0x197e0: 0x6c7bc220, 0x197e1: 0x6cc3be20, 0x197e2: 0x6c00aa20, 0x197e3: 0x6cbd3420, - 0x197e4: 0x6cbac020, 0x197e5: 0x6c1f5220, 0x197e6: 0x6cae1e20, 0x197e7: 0x6c7e0620, - 0x197e8: 0x6d13fa20, 0x197e9: 0x6c48ce20, 0x197ea: 0x6cd14220, 0x197eb: 0x6cb0fa20, - 0x197ed: 0x6d393820, 0x197ee: 0x6c59de20, 0x197ef: 0x6c5ad620, - 0x197f0: 0x6c557e20, 0x197f1: 0x6c074220, - 0x197f4: 0x6d2bec20, 0x197f5: 0x6c624620, 0x197f6: 0x6c47c220, 0x197f7: 0x6cf6a420, - 0x197f8: 0x6c431620, 0x197f9: 0x6c148620, 0x197fa: 0x6c96d620, 0x197fb: 0x6d3b2020, - 0x197fc: 0x6ce9ea20, 0x197fd: 0x6d3ca020, 0x197fe: 0x6cface20, 0x197ff: 0x6c80de20, - // Block 0x660, offset 0x19800 - 0x19803: 0x6d36e820, - 0x19804: 0x6c00cc20, 0x19805: 0x6cfc2e20, 0x19806: 0x6c4c3c20, 0x19807: 0x6cf7a220, - 0x19809: 0x6ce9f020, 0x1980a: 0x6c11de20, 0x1980b: 0x6ccb0420, - 0x1980c: 0x6cfaea20, 0x1980d: 0x6c6c0e20, 0x1980e: 0x6c3bfa20, 0x1980f: 0x6cc45a20, - 0x19811: 0x6d123a20, 0x19812: 0x6c29fa20, 0x19813: 0x6c63f420, - 0x19814: 0x6c82fc20, 0x19815: 0x6d0d0220, 0x19816: 0x6c918e20, 0x19817: 0x6ce9d620, - 0x19818: 0x6d1cd220, 0x19819: 0x6cb0de20, 0x1981a: 0x6c964a20, 0x1981b: 0x6c87a420, - 0x1981c: 0x6c0d1220, 0x1981e: 0x6c995620, 0x1981f: 0x6c040e20, - 0x19820: 0x6c5a6a20, 0x19822: 0x6d121220, 0x19823: 0x6c50a420, - 0x19824: 0x6c218420, 0x19825: 0x6c516420, 0x19826: 0x6ca95620, 0x19827: 0x6c1e0220, - 0x19828: 0x6c874620, 0x19829: 0x6ce19420, 0x1982a: 0x6c585a20, 0x1982b: 0x6c095420, - 0x1982c: 0x6c033420, 0x1982d: 0x6c181020, 0x1982e: 0x6d104620, 0x1982f: 0x6c269e20, - 0x19830: 0x6c024420, 0x19831: 0x6d091020, 0x19833: 0x6d3e5220, - 0x19834: 0x6c265a20, 0x19835: 0x6cc4ce20, 0x19836: 0x6c053820, 0x19837: 0x6c25f020, - 0x19838: 0x6ced4e20, 0x19839: 0x6cdebe20, 0x1983a: 0x6c05dc20, 0x1983b: 0x6c417a20, - 0x1983c: 0x6d0c7620, 0x1983d: 0x6cf5a620, 0x1983e: 0x6d3ad420, 0x1983f: 0x6d0b4e20, - // Block 0x661, offset 0x19840 - 0x19840: 0x6c393a20, 0x19841: 0x6d203c20, 0x19842: 0x6c012820, 0x19843: 0x6ce9a420, - 0x19844: 0x6c9b2020, 0x19845: 0x6ccf5c20, 0x19846: 0x6c6d2e20, 0x19847: 0x6c47ce20, - 0x19848: 0x6c627820, 0x19849: 0x6cbc0020, 0x1984a: 0x6c695820, 0x1984b: 0x6d0d0420, - 0x1984c: 0x6cf92e20, 0x1984d: 0x6c772020, 0x1984e: 0x6c9e0220, 0x1984f: 0x6d086a20, - 0x19850: 0x6cccc420, 0x19851: 0x6cf2d820, 0x19852: 0x6cb8b420, 0x19853: 0x6c58f620, - 0x19854: 0x6cc5d020, 0x19855: 0x6d322420, 0x19856: 0x6ce45c20, 0x19857: 0x6c740020, - 0x19858: 0x6d008620, 0x19859: 0x6cb75820, 0x1985a: 0x6c01f820, 0x1985b: 0x6c9a8220, - 0x1985c: 0x6c476820, 0x1985e: 0x6ce1b820, 0x1985f: 0x6c389220, - 0x19860: 0x6c722c20, 0x19861: 0x6c162820, 0x19862: 0x6cd74c20, 0x19863: 0x6c096820, - 0x19864: 0x6c996220, 0x19865: 0x6cd77820, 0x19866: 0x6c477220, 0x19867: 0x6c53a420, - 0x19868: 0x6c579620, 0x19869: 0x6c95fe20, 0x1986a: 0x6c4f7420, 0x1986b: 0x6c63b820, - 0x1986c: 0x6cc2e220, 0x1986d: 0x6c40f420, 0x1986e: 0x6c599020, 0x1986f: 0x6c103c20, - 0x19870: 0x6c478e20, 0x19871: 0x6c3c4e20, 0x19872: 0x6ca28820, 0x19873: 0x6c009c20, - 0x19874: 0x6d1cee20, 0x19875: 0x6cd75020, 0x19876: 0x6c89be20, 0x19877: 0x6c6ad020, - 0x19878: 0x6c1c2220, 0x19879: 0x6c6ad220, 0x1987a: 0x6c1d7020, 0x1987b: 0x6cb2e820, - 0x1987c: 0x6c186a20, 0x1987d: 0x6d0c9a20, 0x1987e: 0x6c321c20, 0x1987f: 0x6c2c5a20, - // Block 0x662, offset 0x19880 - 0x19881: 0x6c89c220, 0x19882: 0x6cfcd220, 0x19883: 0x6c0c0420, - 0x19884: 0x6d042e20, 0x19885: 0x6c9bda20, 0x19886: 0x6d130220, 0x19887: 0x6c9d5e20, - 0x19888: 0x6cb7a020, 0x19889: 0x6cb7a220, 0x1988a: 0x6cf30620, 0x1988b: 0x6d01dc20, - 0x1988c: 0x6d239820, 0x1988d: 0x6cb87020, 0x1988e: 0x6c1a2820, 0x1988f: 0x6d11c220, - 0x19890: 0x6d1bd420, 0x19891: 0x6d0fd420, 0x19892: 0x6c606820, 0x19893: 0x6d3fa220, - 0x19894: 0x6d07b220, 0x19895: 0x6c9f6e20, 0x19896: 0x6c907620, 0x19897: 0x6c766e20, - 0x19898: 0x6d11ca20, 0x19899: 0x6d0dcc20, 0x1989a: 0x6cdcfa20, 0x1989b: 0x6c4b6c20, - 0x1989c: 0x6c5a7a20, 0x1989d: 0x6d1c8e20, 0x1989e: 0x6cd14420, 0x1989f: 0x6c140220, - 0x198a0: 0x6c883c20, 0x198a2: 0x6d082420, 0x198a3: 0x6c200e20, - 0x198a4: 0x6c184220, 0x198a5: 0x6ca6ca20, 0x198a6: 0x6cc27820, 0x198a7: 0x6c9e7e20, - 0x198a8: 0x6c5dfe20, 0x198a9: 0x6d21a420, 0x198aa: 0x6d2e1620, 0x198ab: 0x6c55c820, - 0x198ac: 0x6c136020, 0x198ad: 0x6c0c2c20, 0x198ae: 0x6cb9d020, 0x198af: 0x6cf6ee20, - 0x198b0: 0x6c67c220, 0x198b1: 0x6c79c620, 0x198b2: 0x6c970220, 0x198b3: 0x6c98a220, - 0x198b4: 0x6d2e2220, 0x198b5: 0x6c0b5c20, 0x198b6: 0x6c5f6c20, 0x198b7: 0x6c74d820, - 0x198b8: 0x6ca45820, 0x198b9: 0x6c0a9020, 0x198ba: 0x6cd3f420, 0x198bb: 0x6cd7ac20, - 0x198bc: 0x6ca18820, 0x198bd: 0x6c8b6420, 0x198be: 0x6c9f0820, 0x198bf: 0x6ca19420, - // Block 0x663, offset 0x198c0 - 0x198c0: 0x6cf74820, 0x198c1: 0x6c156820, 0x198c2: 0x6cc21620, 0x198c3: 0x6c69e620, - 0x198c4: 0x6c5e5a20, 0x198c5: 0x6cfb1a20, 0x198c6: 0x6d068820, 0x198c7: 0x6ca98820, - 0x198c8: 0x6ce74020, 0x198c9: 0x6c542220, 0x198ca: 0x6d240e20, - 0x198cc: 0x6c1ce220, 0x198cd: 0x6c0fbc20, 0x198ce: 0x6d415820, 0x198cf: 0x6c2dba20, - 0x198d0: 0x6d3cfa20, 0x198d1: 0x6c5ea620, 0x198d2: 0x6cb86220, - 0x198d4: 0x6d043020, 0x198d5: 0x6c5c0020, 0x198d6: 0x6cd23420, 0x198d7: 0x6c7a1e20, - 0x198d9: 0x6c32f220, 0x198da: 0x6d10da20, 0x198db: 0x6d20da20, - 0x198dc: 0x6c056420, 0x198dd: 0x6c6a9220, 0x198de: 0x6d30e820, 0x198df: 0x6c634620, - 0x198e0: 0x6cd2c820, 0x198e1: 0x6c2bea20, 0x198e2: 0x6c302a20, 0x198e3: 0x6c223a20, - 0x198e4: 0x6c3fd220, 0x198e5: 0x6c9f4020, 0x198e6: 0x6d314020, 0x198e7: 0x6d31d020, - 0x198e9: 0x6d0e6420, 0x198ea: 0x6cbc2020, 0x198eb: 0x6c4f4e20, - 0x198ec: 0x6c45ea20, 0x198ed: 0x6cbb6e20, 0x198ee: 0x6c94a220, 0x198ef: 0x6c48f620, - 0x198f0: 0x6c7e7620, 0x198f1: 0x6cc8ce20, 0x198f2: 0x6c383420, 0x198f3: 0x6c260a20, - 0x198f4: 0x6d0c9c20, 0x198f5: 0x6c458a20, 0x198f6: 0x6c6ad420, 0x198f7: 0x6c48d020, - 0x198f8: 0x6c4c7020, 0x198f9: 0x6cdd7c20, 0x198fa: 0x6cf2ba20, 0x198fb: 0x6d335220, - 0x198fc: 0x6ca84220, 0x198fd: 0x6c2e2c20, 0x198fe: 0x6c7f3c20, 0x198ff: 0x6cde6420, - // Block 0x664, offset 0x19900 - 0x19900: 0x6c254620, 0x19901: 0x6d0af420, 0x19902: 0x6c4bd020, - 0x19905: 0x6c2b3420, 0x19907: 0x6c9dc820, - 0x19908: 0x6c6a2a20, 0x19909: 0x6c9f7020, 0x1990a: 0x6c71ca20, 0x1990b: 0x6d217420, - 0x1990c: 0x6d318020, 0x1990d: 0x6d2fc820, 0x1990e: 0x6d2cd220, 0x1990f: 0x6d038820, - 0x19911: 0x6c049420, 0x19912: 0x6c516620, 0x19913: 0x6c46d220, - 0x19914: 0x6c538220, 0x19915: 0x6c816e20, 0x19916: 0x6cf51620, 0x19917: 0x6c0e8c20, - 0x19918: 0x6c795420, 0x19919: 0x6c92d420, 0x1991a: 0x6c246420, 0x1991b: 0x6c885020, - 0x1991c: 0x6d141820, 0x1991d: 0x6cbc6020, 0x1991e: 0x6cd53820, - 0x19920: 0x6d08b220, 0x19921: 0x6c6c6220, 0x19922: 0x6cbd4220, 0x19923: 0x6c5b7020, - 0x19924: 0x6cdb3620, 0x19925: 0x6c207c20, 0x19926: 0x6c33b420, 0x19927: 0x6c8fb220, - 0x19929: 0x6ca4c820, 0x1992a: 0x6ce02220, 0x1992b: 0x6c285220, - 0x1992c: 0x6cf03e20, 0x1992d: 0x6c41f220, 0x1992e: 0x6c26c620, 0x1992f: 0x6c86d420, - 0x19930: 0x6c10de20, 0x19931: 0x6cfd3e20, 0x19932: 0x6cac8c20, 0x19933: 0x6c7eb620, - 0x19934: 0x6d39ec20, 0x19935: 0x6ca7c420, 0x19936: 0x6c580220, 0x19937: 0x6d1cce20, - 0x19938: 0x6cfd4620, 0x19939: 0x6c809020, 0x1993a: 0x6ca0a020, 0x1993b: 0x6c03e220, - 0x1993d: 0x6c4adc20, 0x1993e: 0x6c08c620, 0x1993f: 0x6c3d5020, - // Block 0x665, offset 0x19940 - 0x19940: 0x6c5da820, 0x19941: 0x6d173c20, 0x19942: 0x6c8f2c20, - 0x19944: 0x6d19cc20, 0x19945: 0x6c735c20, 0x19946: 0x6c5d7420, 0x19947: 0x6c1a0a20, - 0x19948: 0x6c311c20, 0x19949: 0x6c356a20, 0x1994b: 0x6d0da620, - 0x1994c: 0x6d3c9420, 0x1994d: 0x6d2cce20, 0x1994e: 0x6cb70420, 0x1994f: 0x6d216220, - 0x19950: 0x6cc37620, 0x19951: 0x6c5d7a20, 0x19952: 0x6ca84420, 0x19953: 0x6c59e220, - 0x19954: 0x6c71cc20, 0x19955: 0x6ccf6820, - 0x19958: 0x6caebe20, 0x19959: 0x6ca01820, 0x1995a: 0x6c129220, 0x1995b: 0x6c90ba20, - 0x1995c: 0x6c843e20, 0x1995d: 0x6c205e20, 0x1995f: 0x6c24f020, - 0x19960: 0x6ccdc820, 0x19961: 0x6c280a20, 0x19962: 0x6cb68220, - 0x19964: 0x6c7f7a20, 0x19965: 0x6c8de620, 0x19966: 0x6c8a6220, 0x19967: 0x6cc62220, - 0x19968: 0x6d20c820, 0x19969: 0x6d16ca20, 0x1996a: 0x6c2df820, 0x1996b: 0x6cb6dc20, - 0x1996c: 0x6d147820, 0x1996d: 0x6ca6f420, 0x1996e: 0x6c3d5220, 0x1996f: 0x6c657420, - 0x19970: 0x6d0b1c20, 0x19971: 0x6c398c20, 0x19972: 0x6cc8c420, 0x19973: 0x6cfa8c20, - 0x19976: 0x6c096a20, 0x19977: 0x6cd25e20, - 0x19978: 0x6cb38020, 0x19979: 0x6ca6fc20, 0x1997a: 0x6d35f620, 0x1997b: 0x6ce22020, - 0x1997c: 0x6ce4f020, 0x1997d: 0x6ce4f220, 0x1997e: 0x6cc81620, 0x1997f: 0x6d176a20, - // Block 0x666, offset 0x19980 - 0x19980: 0x6c8b0420, 0x19981: 0x6c01bc20, 0x19982: 0x6c511020, 0x19983: 0x6cbf1620, - 0x19984: 0x6c85f420, 0x19985: 0x6c4a5c20, 0x19986: 0x6d3f4a20, 0x19987: 0x6cdaaa20, - 0x19988: 0x6d261020, 0x19989: 0x6d0ba220, 0x1998a: 0x6c13dc20, 0x1998b: 0x6ced2420, - 0x1998c: 0x6c72f420, 0x1998d: 0x6ce6cc20, 0x1998e: 0x6d1fd020, 0x1998f: 0x6c5bc620, - 0x19990: 0x6c659c20, 0x19991: 0x6cc89e20, 0x19992: 0x6c986420, 0x19993: 0x6c71b820, - 0x19994: 0x6d3e5620, 0x19995: 0x6c70a820, 0x19996: 0x6c013a20, 0x19997: 0x6cdc5020, - 0x19998: 0x6c7f1620, 0x19999: 0x6c5d3020, 0x1999a: 0x6cc35e20, 0x1999b: 0x6c167220, - 0x1999c: 0x6c34fa20, 0x1999d: 0x6c798020, 0x1999e: 0x6ca55020, 0x1999f: 0x6c11d220, - 0x199a0: 0x6ce35620, 0x199a1: 0x6d064c20, 0x199a2: 0x6c701020, 0x199a3: 0x6c59e420, - 0x199a4: 0x6cb7b820, 0x199a5: 0x6c6b0e20, 0x199a6: 0x6c98f220, 0x199a7: 0x6d0c2020, - 0x199a9: 0x6d354820, 0x199aa: 0x6ce9b020, - 0x199ac: 0x6c00c220, 0x199ad: 0x6cad0a20, 0x199ae: 0x6c125a20, 0x199af: 0x6ce12820, - 0x199b0: 0x6c372220, 0x199b1: 0x6c5d3c20, 0x199b2: 0x6cb63e20, 0x199b3: 0x6c1ea620, - 0x199b4: 0x6cdd9020, 0x199b5: 0x6d3d8820, 0x199b6: 0x6caa2620, 0x199b7: 0x6ce8f220, - 0x199b8: 0x6cd01a20, 0x199b9: 0x6c90f820, 0x199ba: 0x6c0c2020, 0x199bb: 0x6c844020, - 0x199bc: 0x6c977c20, 0x199bd: 0x6d02f020, 0x199be: 0x6c133c20, 0x199bf: 0x6c5a0a20, - // Block 0x667, offset 0x199c0 - 0x199c0: 0x6c9a6c20, 0x199c1: 0x6c42e620, 0x199c2: 0x6c887620, 0x199c3: 0x6c2a3e20, - 0x199c4: 0x6d2e2420, 0x199c5: 0x6d3eaa20, - 0x199c8: 0x6d375620, 0x199c9: 0x6c03d020, 0x199ca: 0x6c258a20, 0x199cb: 0x6cbfe420, - 0x199cd: 0x6c8fea20, 0x199ce: 0x6cfb0a20, 0x199cf: 0x6c3afa20, - 0x199d0: 0x6c4cac20, 0x199d1: 0x6c19b820, 0x199d2: 0x6c6fda20, 0x199d3: 0x6c35f620, - 0x199d4: 0x6c1cb420, 0x199d5: 0x6d269220, 0x199d6: 0x6c531620, 0x199d7: 0x6d119e20, - 0x199d8: 0x6d0ae220, 0x199d9: 0x6d10e620, 0x199da: 0x6ce74420, 0x199db: 0x6d2cc020, - 0x199dc: 0x6d204020, 0x199dd: 0x6d095620, 0x199de: 0x6d11aa20, 0x199df: 0x6c78a820, - 0x199e0: 0x6c591620, 0x199e1: 0x6c80cc20, 0x199e2: 0x6d26ba20, 0x199e3: 0x6c18ca20, - 0x199e6: 0x6cd0b220, - 0x199e8: 0x6ca90e20, 0x199e9: 0x6ca00a20, 0x199ea: 0x6c52ba20, 0x199eb: 0x6c205820, - 0x199ec: 0x6d27fe20, 0x199ed: 0x6d07be20, 0x199ee: 0x6c6d4420, 0x199ef: 0x6d3d9c20, - 0x199f0: 0x6d209c20, 0x199f1: 0x6cdfbc20, 0x199f2: 0x6c775420, 0x199f3: 0x6cbf6420, - 0x199f5: 0x6c1a4c20, 0x199f6: 0x6c6f8820, 0x199f7: 0x6d097620, - 0x199f8: 0x6d32fa20, 0x199f9: 0x6c1ce420, 0x199fa: 0x6cac4a20, 0x199fb: 0x6cbc6620, - 0x199fd: 0x6cc1e620, 0x199fe: 0x6c7fd620, 0x199ff: 0x6d190e20, - // Block 0x668, offset 0x19a00 - 0x19a00: 0x6cc6de20, 0x19a01: 0x6cd84e20, 0x19a02: 0x6cb89c20, 0x19a03: 0x6cd89220, - 0x19a05: 0x6c380420, 0x19a07: 0x6c9b1020, - 0x19a08: 0x6c578e20, 0x19a0b: 0x6c4d6620, - 0x19a0c: 0x6cbc4420, 0x19a0d: 0x6c1f4620, 0x19a0e: 0x6cc3d420, 0x19a0f: 0x6c334e20, - 0x19a10: 0x6c863820, 0x19a11: 0x6c03b820, 0x19a12: 0x6c6c0420, 0x19a13: 0x6d05ee20, - 0x19a14: 0x6c963620, 0x19a16: 0x6d27de20, 0x19a17: 0x6d37ae20, - 0x19a18: 0x6c568220, 0x19a19: 0x6d1ad220, 0x19a1b: 0x6d351020, - 0x19a1c: 0x6cb9fa20, 0x19a1e: 0x6c419420, 0x19a1f: 0x6c667c20, - 0x19a20: 0x6d3ae220, 0x19a21: 0x6d3ae420, 0x19a22: 0x6c7a7820, 0x19a23: 0x6ca81a20, - 0x19a24: 0x6cc8ca20, 0x19a25: 0x6d2ac220, 0x19a26: 0x6c020820, 0x19a27: 0x6d363820, - 0x19a28: 0x6c461a20, 0x19a29: 0x6d17b220, 0x19a2a: 0x6c1ab020, 0x19a2b: 0x6c5ed620, - 0x19a2c: 0x6d39a620, 0x19a2d: 0x6c81b220, 0x19a2e: 0x6cc5ee20, 0x19a2f: 0x6cc67620, - 0x19a30: 0x6d32c620, 0x19a31: 0x6ca34220, 0x19a32: 0x6c12ec20, - 0x19a35: 0x6d151e20, 0x19a36: 0x6c746820, 0x19a37: 0x6c0cee20, - 0x19a38: 0x6c1a1e20, 0x19a39: 0x6c75ce20, 0x19a3a: 0x6c312620, 0x19a3b: 0x6cefe420, - 0x19a3c: 0x6d17fa20, 0x19a3d: 0x6d306020, 0x19a3e: 0x6d0cae20, - // Block 0x669, offset 0x19a40 - 0x19a40: 0x6cca0220, 0x19a41: 0x6c950220, 0x19a42: 0x6cb2be20, 0x19a43: 0x6d2f9020, - 0x19a44: 0x6c4e2020, 0x19a45: 0x6d239a20, 0x19a46: 0x6c278220, 0x19a47: 0x6d2fca20, - 0x19a48: 0x6c3a3e20, 0x19a49: 0x6ccc6620, 0x19a4a: 0x6c8d3820, 0x19a4b: 0x6cde7a20, - 0x19a4c: 0x6cc12220, 0x19a4d: 0x6c986e20, 0x19a4e: 0x6d132c20, 0x19a4f: 0x6c05d220, - 0x19a50: 0x6c4b6e20, 0x19a51: 0x6c489e20, 0x19a52: 0x6ca43620, 0x19a53: 0x6c442420, - 0x19a55: 0x6cd28420, 0x19a56: 0x6c782820, 0x19a57: 0x6cdd9220, - 0x19a58: 0x6c225c20, 0x19a59: 0x6d394620, 0x19a5a: 0x6cdf3820, 0x19a5b: 0x6c7b3420, - 0x19a5c: 0x6cbe2420, 0x19a5d: 0x6d05d820, 0x19a5e: 0x6c322820, 0x19a5f: 0x6c131220, - 0x19a60: 0x6c58da20, 0x19a61: 0x6c234420, 0x19a62: 0x6cc9de20, 0x19a63: 0x6d336020, - 0x19a64: 0x6cb9be20, 0x19a65: 0x6c6c5420, 0x19a66: 0x6d3fb420, 0x19a67: 0x6cf00020, - 0x19a6a: 0x6cf8de20, 0x19a6b: 0x6ca36c20, - 0x19a6c: 0x6cb45420, 0x19a6d: 0x6cd9e020, 0x19a6e: 0x6c729420, 0x19a6f: 0x6d319620, - 0x19a70: 0x6cce8620, 0x19a71: 0x6ce1e820, 0x19a72: 0x6c049c20, 0x19a73: 0x6cdea020, - 0x19a74: 0x6cba7c20, 0x19a75: 0x6cf23a20, 0x19a76: 0x6cc6ae20, 0x19a77: 0x6c962820, - 0x19a78: 0x6c55ca20, 0x19a79: 0x6cda2e20, 0x19a7a: 0x6d37cc20, 0x19a7b: 0x6cb46020, - 0x19a7c: 0x6c9ef620, 0x19a7d: 0x6c6c6420, 0x19a7e: 0x6cce8a20, 0x19a7f: 0x6c9d8e20, - // Block 0x66a, offset 0x19a80 - 0x19a80: 0x6cd61c20, 0x19a81: 0x6c8d7020, 0x19a82: 0x6c82de20, 0x19a83: 0x6c67c420, - 0x19a84: 0x6c838a20, 0x19a85: 0x6d370e20, 0x19a86: 0x6c2e0020, - 0x19a88: 0x6cca2e20, 0x19a89: 0x6c473e20, 0x19a8a: 0x6c397220, 0x19a8b: 0x6c9ab220, - 0x19a8c: 0x6cdc9e20, 0x19a8d: 0x6c65f620, 0x19a8e: 0x6ce15020, 0x19a8f: 0x6d025e20, - 0x19a90: 0x6c7a6a20, 0x19a91: 0x6cf3fe20, 0x19a92: 0x6c38d220, 0x19a93: 0x6c963820, - 0x19a94: 0x6c117820, 0x19a95: 0x6c136620, 0x19a96: 0x6c8d7a20, 0x19a97: 0x6d142620, - 0x19a98: 0x6c23be20, 0x19a99: 0x6d27ce20, 0x19a9a: 0x6c9b7420, 0x19a9b: 0x6d245020, - 0x19a9c: 0x6d374220, 0x19a9d: 0x6d162020, 0x19a9e: 0x6c285620, 0x19a9f: 0x6c5e2c20, - 0x19aa0: 0x6cef5a20, 0x19aa1: 0x6ce03220, 0x19aa2: 0x6ccb7e20, 0x19aa3: 0x6d024420, - 0x19aa4: 0x6cda3620, 0x19aa5: 0x6cd97620, 0x19aa6: 0x6cb94c20, 0x19aa7: 0x6c8eda20, - 0x19aa8: 0x6d194620, 0x19aaa: 0x6c835a20, 0x19aab: 0x6c84aa20, - 0x19aac: 0x6c3af420, 0x19aad: 0x6c8b6a20, 0x19aae: 0x6c8c8820, 0x19aaf: 0x6cfd4820, - 0x19ab0: 0x6d002c20, 0x19ab1: 0x6cab6420, 0x19ab2: 0x6c9cbc20, 0x19ab3: 0x6cfb1220, - 0x19ab4: 0x6cc4f820, 0x19ab5: 0x6d3c0220, 0x19ab6: 0x6cd6be20, 0x19ab7: 0x6d0d1e20, - 0x19ab8: 0x6c0be020, 0x19ab9: 0x6c8df020, 0x19aba: 0x6c531a20, 0x19abb: 0x6cb5a620, - 0x19abc: 0x6c8a9620, 0x19abd: 0x6c04ca20, 0x19abe: 0x6c097e20, 0x19abf: 0x6c554820, - // Block 0x66b, offset 0x19ac0 - 0x19ac0: 0x6c554a20, 0x19ac2: 0x6c12f220, 0x19ac3: 0x6cae1c20, - 0x19ac4: 0x6cbf2c20, 0x19ac5: 0x6c9ffe20, 0x19ac6: 0x6c700220, 0x19ac7: 0x6c10a220, - 0x19ac8: 0x6c9a1420, 0x19ac9: 0x6cca1e20, 0x19aca: 0x6cf0a820, - 0x19acd: 0x6c841e20, 0x19ace: 0x6cc36220, - 0x19ad0: 0x6c5cfa20, 0x19ad1: 0x6cfdf220, 0x19ad3: 0x6cd3c620, - 0x19ad4: 0x6d1c9020, 0x19ad6: 0x6ca43820, 0x19ad7: 0x6c59f220, - 0x19ad8: 0x6c701a20, 0x19ad9: 0x6d0c2620, 0x19adb: 0x6cc99020, - 0x19adc: 0x6ce96220, 0x19add: 0x6d022e20, 0x19ade: 0x6d309c20, 0x19adf: 0x6c9ada20, - 0x19ae0: 0x6cf8f420, 0x19ae1: 0x6c978a20, 0x19ae3: 0x6c5a1820, - 0x19ae4: 0x6ce02420, 0x19ae5: 0x6d001420, 0x19ae6: 0x6d137220, 0x19ae7: 0x6c0a9420, - 0x19ae8: 0x6c955a20, 0x19ae9: 0x6c38d420, 0x19aea: 0x6c870620, 0x19aeb: 0x6c251220, - 0x19aec: 0x6c1fa620, 0x19aed: 0x6c2a4620, 0x19aee: 0x6c2bb620, 0x19aef: 0x6c7c1c20, - 0x19af0: 0x6c1ecc20, 0x19af1: 0x6cfb1420, 0x19af2: 0x6c165220, 0x19af3: 0x6c9cce20, - 0x19af4: 0x6cba8e20, 0x19af5: 0x6cc00820, 0x19af6: 0x6d322620, - 0x19afa: 0x6c568620, 0x19afb: 0x6c418c20, - 0x19afc: 0x6c1b9220, 0x19afd: 0x6c48f220, 0x19afe: 0x6ca27a20, 0x19aff: 0x6c0ede20, - // Block 0x66c, offset 0x19b00 - 0x19b00: 0x6c579020, 0x19b01: 0x6c44fc20, 0x19b02: 0x6d10e820, 0x19b03: 0x6c996420, - 0x19b04: 0x6cee0820, - 0x19b08: 0x6cc7a420, 0x19b09: 0x6d090820, 0x19b0a: 0x6d32b820, 0x19b0b: 0x6c9f4a20, - 0x19b0c: 0x6c67a420, 0x19b0e: 0x6d2e5a20, 0x19b0f: 0x6d423820, - 0x19b10: 0x6d26a620, 0x19b11: 0x6c8b0620, 0x19b13: 0x6d392420, - 0x19b14: 0x6c098020, 0x19b15: 0x6cc5f020, 0x19b16: 0x6d234e20, - 0x19b18: 0x6c21c020, 0x19b19: 0x6c379820, 0x19b1a: 0x6d17b420, 0x19b1b: 0x6c9cf620, - 0x19b1c: 0x6cbeca20, 0x19b1e: 0x6cee1e20, 0x19b1f: 0x6c621e20, - 0x19b20: 0x6c104020, 0x19b22: 0x6c0cae20, 0x19b23: 0x6c38a820, - 0x19b24: 0x6d26c820, 0x19b25: 0x6c83ee20, 0x19b26: 0x6c38aa20, 0x19b27: 0x6cc1a820, - 0x19b28: 0x6c3f7620, 0x19b29: 0x6c376220, 0x19b2a: 0x6c354420, 0x19b2b: 0x6d32e420, - 0x19b2c: 0x6ce47020, 0x19b2d: 0x6d239c20, 0x19b2e: 0x6c6d3020, 0x19b2f: 0x6cb70c20, - 0x19b30: 0x6c714220, 0x19b31: 0x6c7f1e20, 0x19b32: 0x6c17f020, 0x19b33: 0x6c06d020, - 0x19b34: 0x6ca9a820, 0x19b35: 0x6d186020, 0x19b36: 0x6d065420, 0x19b37: 0x6ca1e020, - 0x19b38: 0x6d0a3620, 0x19b39: 0x6c3eda20, 0x19b3b: 0x6ca8ec20, - 0x19b3c: 0x6ce64820, 0x19b3d: 0x6c082c20, 0x19b3e: 0x6d2c8a20, 0x19b3f: 0x6ceeae20, - // Block 0x66d, offset 0x19b40 - 0x19b40: 0x6c782a20, 0x19b41: 0x6d10b020, 0x19b42: 0x6caba420, 0x19b43: 0x6cff0820, - 0x19b44: 0x6c451a20, 0x19b45: 0x6ce13820, 0x19b46: 0x6c4b7620, 0x19b47: 0x6c5c3a20, - 0x19b48: 0x6cddfe20, 0x19b4a: 0x6d114620, 0x19b4b: 0x6c266820, - 0x19b4c: 0x6cb7ea20, 0x19b4d: 0x6c6cba20, 0x19b4e: 0x6c94c220, 0x19b4f: 0x6c9d9020, - 0x19b50: 0x6c9d9220, 0x19b51: 0x6c64fe20, 0x19b52: 0x6c92ec20, 0x19b53: 0x6c38c820, - 0x19b54: 0x6cab5620, 0x19b55: 0x6c9c7e20, 0x19b56: 0x6c6b6420, 0x19b57: 0x6c3f9220, - 0x19b58: 0x6c0d1a20, 0x19b59: 0x6c5a7c20, 0x19b5a: 0x6cda5c20, 0x19b5b: 0x6d115e20, - 0x19b5c: 0x6ca89620, 0x19b5d: 0x6c6c6c20, 0x19b5e: 0x6c88d620, 0x19b5f: 0x6c0faa20, - 0x19b60: 0x6c652420, 0x19b61: 0x6ce3ca20, 0x19b62: 0x6c8d8220, 0x19b63: 0x6d415220, - 0x19b64: 0x6cd20e20, 0x19b65: 0x6d1b2620, 0x19b66: 0x6c2a4820, 0x19b67: 0x6c1e0620, - 0x19b68: 0x6c10e220, 0x19b69: 0x6c9f1220, 0x19b6a: 0x6d0e1620, 0x19b6b: 0x6c805620, - 0x19b6c: 0x6c1d3420, 0x19b6d: 0x6c68b020, 0x19b6e: 0x6cd6bc20, 0x19b6f: 0x6cc2ac20, - 0x19b70: 0x6ca8c820, 0x19b71: 0x6c964c20, 0x19b73: 0x6cd21e20, - 0x19b74: 0x6c965020, 0x19b75: 0x6d3a4c20, 0x19b77: 0x6c1d6e20, - 0x19b78: 0x6c734e20, 0x19b79: 0x6c6f0c20, 0x19b7a: 0x6c379a20, 0x19b7b: 0x6d17b820, - 0x19b7c: 0x6cc8d620, 0x19b7d: 0x6c113c20, 0x19b7e: 0x6cc57a20, 0x19b7f: 0x6c3edc20, - // Block 0x66e, offset 0x19b80 - 0x19b80: 0x6c7fb820, 0x19b81: 0x6cdcaa20, 0x19b82: 0x6d20e220, 0x19b83: 0x6d1f1c20, - 0x19b84: 0x6c2d1820, 0x19b85: 0x6c8cf420, 0x19b86: 0x6d3aec20, 0x19b87: 0x6cde5220, - 0x19b88: 0x6cb29e20, 0x19b89: 0x6d2d2a20, 0x19b8a: 0x6c684c20, 0x19b8b: 0x6c20de20, - 0x19b8c: 0x6c10ac20, 0x19b8d: 0x6c7a0620, 0x19b8e: 0x6c25b620, - 0x19b90: 0x6c4e5220, 0x19b91: 0x6c4e5420, 0x19b92: 0x6ca20020, 0x19b93: 0x6c567420, - 0x19b94: 0x6c457220, 0x19b95: 0x6c2b2020, 0x19b96: 0x6c3e3c20, 0x19b97: 0x6d088020, - 0x19b98: 0x6c9c4c20, 0x19b99: 0x6c9a0420, 0x19b9a: 0x6c811e20, 0x19b9b: 0x6c481e20, - 0x19b9c: 0x6d2fc020, 0x19b9d: 0x6cde6620, 0x19b9e: 0x6d23a220, 0x19b9f: 0x6d402820, - 0x19ba0: 0x6c844820, 0x19ba1: 0x6c92d820, 0x19ba2: 0x6cf3f620, 0x19ba3: 0x6c826c20, - 0x19ba4: 0x6c615e20, 0x19ba5: 0x6c875220, 0x19ba6: 0x6c84d820, - 0x19ba8: 0x6cb30420, 0x19ba9: 0x6d101020, 0x19baa: 0x6cec2e20, 0x19bab: 0x6ceb1a20, - 0x19bac: 0x6cae6e20, 0x19bae: 0x6d2fb420, 0x19baf: 0x6c4b0220, - 0x19bb1: 0x6d061e20, 0x19bb2: 0x6ca38020, 0x19bb3: 0x6cc3e420, - 0x19bb4: 0x6ceff620, 0x19bb5: 0x6d32e620, 0x19bb6: 0x6c300e20, 0x19bb7: 0x6cf00820, - 0x19bb8: 0x6c0f6020, 0x19bba: 0x6c595820, 0x19bbb: 0x6d08c020, - 0x19bbc: 0x6d295620, 0x19bbd: 0x6c877220, 0x19bbe: 0x6d0d6020, 0x19bbf: 0x6c59ae20, - // Block 0x66f, offset 0x19bc0 - 0x19bc0: 0x6d095820, 0x19bc1: 0x6c554c20, 0x19bc2: 0x6c05f820, 0x19bc3: 0x6cc4c220, - 0x19bc4: 0x6cfeba20, 0x19bc5: 0x6cb38620, 0x19bc6: 0x6c8a9820, 0x19bc7: 0x6d388a20, - 0x19bc8: 0x6d17ba20, 0x19bc9: 0x6d06e220, 0x19bca: 0x6c960820, 0x19bcb: 0x6c77be20, - 0x19bcc: 0x6c1f5620, 0x19bce: 0x6ca35620, 0x19bcf: 0x6c4e2220, - 0x19bd0: 0x6c17a220, 0x19bd1: 0x6c929220, 0x19bd2: 0x6d2e0620, 0x19bd3: 0x6cde7c20, - 0x19bd4: 0x6c3da220, 0x19bd5: 0x6c52c820, 0x19bd6: 0x6d2ba020, 0x19bd7: 0x6cbc0620, - 0x19bd8: 0x6cdb5020, 0x19bd9: 0x6cb1fa20, 0x19bda: 0x6c49ba20, - 0x19bdc: 0x6c5cd020, 0x19bdd: 0x6c1e8020, 0x19bdf: 0x6c374420, - 0x19be0: 0x6c374620, 0x19be1: 0x6cc85a20, 0x19be2: 0x6cb6e220, 0x19be3: 0x6cd8ba20, - 0x19be4: 0x6c713620, 0x19be6: 0x6d0dbe20, 0x19be7: 0x6c058220, - 0x19be8: 0x6d131e20, 0x19be9: 0x6d3e6c20, 0x19bea: 0x6ca55220, 0x19beb: 0x6c20b220, - 0x19bec: 0x6c03c220, 0x19bed: 0x6c126c20, 0x19bee: 0x6ce42c20, 0x19bef: 0x6c4f1c20, - 0x19bf0: 0x6d425220, 0x19bf1: 0x6c03d420, 0x19bf2: 0x6d301420, 0x19bf3: 0x6cec2820, - 0x19bf4: 0x6c44c420, 0x19bf5: 0x6c098220, 0x19bf6: 0x6c37ca20, 0x19bf7: 0x6d3af820, - 0x19bf8: 0x6cf50220, 0x19bf9: 0x6cf19a20, 0x19bfa: 0x6d369820, 0x19bfb: 0x6d393c20, - 0x19bfc: 0x6c929420, 0x19bfd: 0x6cf1a020, 0x19bfe: 0x6c4bdc20, 0x19bff: 0x6cc08e20, - // Block 0x670, offset 0x19c00 - 0x19c00: 0x6c7e9420, 0x19c01: 0x6d292020, 0x19c02: 0x6cda2820, 0x19c03: 0x6c9dd420, - 0x19c04: 0x6c2c0620, 0x19c05: 0x6cb7ec20, 0x19c06: 0x6c129a20, 0x19c07: 0x6cb1bc20, - 0x19c08: 0x6c887820, 0x19c09: 0x6cd21020, 0x19c0a: 0x6c8ff620, 0x19c0b: 0x6cdad620, - 0x19c0c: 0x6cb73220, 0x19c0d: 0x6d25fa20, 0x19c0e: 0x6c3c9e20, 0x19c0f: 0x6d056820, - 0x19c10: 0x6c73f620, 0x19c11: 0x6c2c3020, 0x19c12: 0x6cb14820, 0x19c13: 0x6c494a20, - 0x19c14: 0x6ca98620, 0x19c15: 0x6cc5d220, 0x19c16: 0x6d321c20, 0x19c17: 0x6c412e20, - 0x19c18: 0x6cb08a20, 0x19c19: 0x6ce05420, 0x19c1a: 0x6c179220, 0x19c1b: 0x6c217220, - 0x19c1c: 0x6c508e20, 0x19c1d: 0x6d3b7220, 0x19c1e: 0x6ca0ec20, 0x19c1f: 0x6c0ce020, - 0x19c20: 0x6cb75e20, 0x19c21: 0x6cd34620, 0x19c22: 0x6c08ca20, 0x19c23: 0x6c740620, - 0x19c24: 0x6cd8a420, 0x19c26: 0x6c485220, 0x19c27: 0x6ca32a20, - 0x19c28: 0x6c5b4e20, 0x19c29: 0x6cf5ca20, 0x19c2a: 0x6c37c820, 0x19c2b: 0x6d04ca20, - 0x19c2c: 0x6ca1ca20, 0x19c2e: 0x6cf77220, 0x19c2f: 0x6d360220, - 0x19c30: 0x6cc8fc20, 0x19c31: 0x6c711a20, 0x19c32: 0x6c2e9420, 0x19c33: 0x6d30f420, - 0x19c34: 0x6cced820, 0x19c35: 0x6c9bd220, 0x19c36: 0x6c098420, 0x19c37: 0x6c4eb420, - 0x19c38: 0x6d210420, 0x19c39: 0x6cfcb820, 0x19c3a: 0x6cacd420, 0x19c3b: 0x6ca5a620, - 0x19c3c: 0x6c119820, 0x19c3d: 0x6c109c20, 0x19c3f: 0x6cb70020, - // Block 0x671, offset 0x19c40 - 0x19c40: 0x6c620820, 0x19c41: 0x6d3d6420, 0x19c42: 0x6c925e20, 0x19c43: 0x6c75c220, - 0x19c44: 0x6cfccc20, 0x19c45: 0x6cf62620, 0x19c46: 0x6c113220, 0x19c47: 0x6cf1e220, - 0x19c48: 0x6d346a20, 0x19c49: 0x6d3f5820, 0x19c4a: 0x6c7d6820, 0x19c4b: 0x6c231a20, - 0x19c4c: 0x6ce4f820, 0x19c4d: 0x6c1f5820, 0x19c4e: 0x6c2b3620, 0x19c4f: 0x6c218220, - 0x19c50: 0x6cbfb620, 0x19c51: 0x6d306220, 0x19c52: 0x6d2be220, 0x19c53: 0x6cc75420, - 0x19c54: 0x6c0d7c20, 0x19c55: 0x6c605c20, 0x19c56: 0x6cf65420, 0x19c57: 0x6d39b220, - 0x19c58: 0x6c746a20, 0x19c59: 0x6c440a20, 0x19c5a: 0x6c5eee20, 0x19c5b: 0x6c265620, - 0x19c5c: 0x6c187c20, 0x19c5d: 0x6cddce20, 0x19c5e: 0x6cc92820, 0x19c5f: 0x6cfdf420, - 0x19c60: 0x6c5a5c20, 0x19c61: 0x6cb65020, 0x19c62: 0x6d3b1820, 0x19c63: 0x6cdcf620, - 0x19c64: 0x6c146c20, 0x19c65: 0x6cf25a20, 0x19c66: 0x6c781a20, 0x19c67: 0x6c77c420, - 0x19c68: 0x6c47b820, 0x19c69: 0x6c410220, 0x19c6a: 0x6c396620, 0x19c6b: 0x6c234c20, - 0x19c6c: 0x6c128c20, 0x19c6d: 0x6d36bc20, 0x19c6e: 0x6c15d820, 0x19c6f: 0x6c825420, - 0x19c70: 0x6d04ee20, 0x19c71: 0x6d2d4820, 0x19c72: 0x6d308220, 0x19c73: 0x6d218a20, - 0x19c74: 0x6c4b7020, 0x19c75: 0x6c45ae20, 0x19c76: 0x6d295020, 0x19c77: 0x6c27fe20, - 0x19c78: 0x6c5e0020, 0x19c79: 0x6cd9e220, 0x19c7a: 0x6ce0ac20, 0x19c7b: 0x6c473020, - 0x19c7c: 0x6cf8e620, 0x19c7d: 0x6c978020, 0x19c7e: 0x6c346620, 0x19c7f: 0x6c02f420, - // Block 0x672, offset 0x19c80 - 0x19c80: 0x6cb0c420, 0x19c81: 0x6cf52a20, 0x19c82: 0x6c007c20, 0x19c83: 0x6c9b7620, - 0x19c84: 0x6cb0d220, 0x19c85: 0x6c9b7820, 0x19c86: 0x6d103a20, 0x19c87: 0x6d374420, - 0x19c88: 0x6c0fac20, 0x19c89: 0x6d1cc820, 0x19c8a: 0x6cef6020, 0x19c8b: 0x6cc50e20, - 0x19c8c: 0x6c7ffa20, 0x19c8d: 0x6d0c4620, 0x19c8e: 0x6c161220, 0x19c8f: 0x6cc33620, - 0x19c90: 0x6d31d820, 0x19c91: 0x6cb46a20, 0x19c93: 0x6cdf2a20, - 0x19c94: 0x6c3a9e20, 0x19c95: 0x6cd55620, 0x19c97: 0x6c298820, - 0x19c98: 0x6c25f220, 0x19c99: 0x6cdf9c20, 0x19c9a: 0x6ce49820, 0x19c9b: 0x6c1ba020, - 0x19c9c: 0x6cde9020, 0x19c9d: 0x6c642a20, 0x19c9e: 0x6cd75e20, 0x19c9f: 0x6c5a3220, - 0x19ca0: 0x6c8a6820, 0x19ca3: 0x6c185e20, - 0x19ca4: 0x6c6cf820, 0x19ca5: 0x6c360020, 0x19ca6: 0x6c464620, 0x19ca7: 0x6c3e6420, - 0x19ca8: 0x6c34f020, 0x19caa: 0x6c363e20, 0x19cab: 0x6c07f020, - 0x19cac: 0x6ce1ca20, 0x19cad: 0x6c2c6020, 0x19caf: 0x6c2c7020, - 0x19cb0: 0x6c10a620, 0x19cb1: 0x6ced3820, 0x19cb2: 0x6d2fd020, 0x19cb3: 0x6c950620, - 0x19cb4: 0x6cb62620, 0x19cb5: 0x6ca2a420, 0x19cb6: 0x6cba6c20, - 0x19cb8: 0x6d3fae20, 0x19cb9: 0x6cd9d620, 0x19cbb: 0x6d1f6220, - 0x19cbc: 0x6d38ac20, 0x19cbd: 0x6cdea620, 0x19cbf: 0x6cdb3c20, - // Block 0x673, offset 0x19cc0 - 0x19cc0: 0x6c10c220, 0x19cc1: 0x6cf7aa20, 0x19cc2: 0x6c67c620, 0x19cc3: 0x6c12ba20, - 0x19cc4: 0x6c406620, 0x19cc5: 0x6ce2b820, 0x19cc6: 0x6c185220, 0x19cc7: 0x6c407820, - 0x19cc8: 0x6c3ae020, 0x19cc9: 0x6cf48c20, 0x19cca: 0x6cf5ac20, 0x19ccb: 0x6d101620, - 0x19ccc: 0x6ca04820, 0x19ccd: 0x6cad2020, 0x19cce: 0x6c98a620, 0x19ccf: 0x6ccbba20, - 0x19cd0: 0x6c9bb420, 0x19cd1: 0x6c12a820, 0x19cd2: 0x6ce57220, 0x19cd3: 0x6c764820, - 0x19cd4: 0x6c043620, 0x19cd5: 0x6cffa620, 0x19cd6: 0x6d032620, 0x19cd7: 0x6cb76220, - 0x19cda: 0x6cceb020, 0x19cdb: 0x6c590a20, - 0x19cdc: 0x6ca96a20, 0x19cdd: 0x6cff7820, 0x19cde: 0x6c18b220, 0x19cdf: 0x6c27ce20, - 0x19ce0: 0x6c3c3820, 0x19ce1: 0x6d1ad420, 0x19ce2: 0x6c01fa20, 0x19ce3: 0x6cc4be20, - 0x19ce4: 0x6cc64420, 0x19ce5: 0x6c976020, 0x19ce6: 0x6c394c20, 0x19ce7: 0x6cc10220, - 0x19ce8: 0x6cd2ce20, 0x19ce9: 0x6c511820, 0x19cea: 0x6c0b9220, 0x19ceb: 0x6c276220, - 0x19cec: 0x6ca11420, 0x19ced: 0x6c2aca20, - 0x19cf0: 0x6c7ba020, 0x19cf2: 0x6c144220, 0x19cf3: 0x6c349620, - 0x19cf4: 0x6d1fd220, 0x19cf5: 0x6c504020, 0x19cf7: 0x6c486020, - 0x19cf8: 0x6d095c20, 0x19cf9: 0x6c833620, 0x19cfa: 0x6c6c9220, 0x19cfb: 0x6cb70220, - 0x19cfc: 0x6cc11020, 0x19cfd: 0x6cee2220, 0x19cfe: 0x6d13f620, 0x19cff: 0x6c89e620, - // Block 0x674, offset 0x19d00 - 0x19d02: 0x6d0cb020, 0x19d03: 0x6d180220, - 0x19d04: 0x6d1a7620, 0x19d05: 0x6cb60020, 0x19d06: 0x6d306420, 0x19d07: 0x6cf8a620, - 0x19d08: 0x6d180420, 0x19d09: 0x6d128620, 0x19d0a: 0x6cf3d820, 0x19d0b: 0x6d33fa20, - 0x19d0c: 0x6d366a20, 0x19d0d: 0x6c4e5a20, 0x19d0e: 0x6c21c820, 0x19d0f: 0x6c3d8420, - 0x19d10: 0x6c215220, 0x19d11: 0x6cb2b620, 0x19d12: 0x6c7afa20, 0x19d13: 0x6c1dc220, - 0x19d15: 0x6ceb8a20, 0x19d16: 0x6cbf4220, 0x19d17: 0x6c233020, - 0x19d18: 0x6c42d220, 0x19d19: 0x6c7acc20, 0x19d1a: 0x6cc12620, 0x19d1b: 0x6cc12820, - 0x19d1c: 0x6d340020, 0x19d1d: 0x6c9c0a20, 0x19d1e: 0x6c865220, 0x19d1f: 0x6d389c20, - 0x19d20: 0x6cde8420, 0x19d21: 0x6d340220, 0x19d22: 0x6c482420, 0x19d23: 0x6c899c20, - 0x19d24: 0x6c54ee20, 0x19d25: 0x6c7e8820, 0x19d26: 0x6c2d2620, 0x19d27: 0x6c22d820, - 0x19d28: 0x6d1bde20, 0x19d2b: 0x6cb62a20, - 0x19d2d: 0x6c144620, 0x19d2e: 0x6c99b020, 0x19d2f: 0x6c31b020, - 0x19d30: 0x6d19fe20, 0x19d31: 0x6c148820, 0x19d32: 0x6cc8dc20, 0x19d33: 0x6c524020, - 0x19d34: 0x6cc87820, 0x19d35: 0x6c3d9420, 0x19d36: 0x6c7f4e20, 0x19d37: 0x6d043420, - 0x19d38: 0x6c64e020, 0x19d39: 0x6d186220, 0x19d3a: 0x6c9a6820, - 0x19d3c: 0x6c987620, 0x19d3d: 0x6c627e20, 0x19d3e: 0x6cdd3a20, 0x19d3f: 0x6c4f0c20, - // Block 0x675, offset 0x19d40 - 0x19d41: 0x6c868420, 0x19d42: 0x6d3f2220, 0x19d43: 0x6d412820, - 0x19d44: 0x6d114820, 0x19d45: 0x6c43a820, 0x19d46: 0x6c844c20, 0x19d47: 0x6cb71c20, - 0x19d48: 0x6c462420, 0x19d49: 0x6c868620, 0x19d4a: 0x6c0db220, 0x19d4b: 0x6cdd3c20, - 0x19d4e: 0x6cdb3e20, 0x19d4f: 0x6c1e4c20, - 0x19d50: 0x6c650220, 0x19d51: 0x6d010020, 0x19d52: 0x6c076420, 0x19d53: 0x6d066020, - 0x19d54: 0x6c6eb620, 0x19d55: 0x6cb46220, 0x19d56: 0x6c8d7220, 0x19d57: 0x6cfdd620, - 0x19d58: 0x6d42ac20, 0x19d59: 0x6c2e4420, 0x19d5a: 0x6c216a20, 0x19d5b: 0x6cbeb620, - 0x19d5c: 0x6ca41020, 0x19d5d: 0x6d2cfe20, 0x19d5e: 0x6c940820, 0x19d5f: 0x6d157420, - 0x19d60: 0x6cceba20, 0x19d61: 0x6d21ba20, 0x19d62: 0x6c575c20, 0x19d63: 0x6c845e20, - 0x19d64: 0x6cabce20, 0x19d67: 0x6c846020, - 0x19d6a: 0x6cd6e620, - 0x19d6c: 0x6d18d620, 0x19d6d: 0x6ca95c20, 0x19d6e: 0x6cd83820, 0x19d6f: 0x6c7ab020, - 0x19d70: 0x6c407a20, 0x19d71: 0x6d142820, 0x19d72: 0x6c2ab820, 0x19d73: 0x6cc49620, - 0x19d74: 0x6c131e20, 0x19d76: 0x6ce39820, 0x19d77: 0x6cbdb420, - 0x19d78: 0x6c0c8820, 0x19d79: 0x6cdca420, 0x19d7a: 0x6cef4c20, 0x19d7b: 0x6c33bc20, - 0x19d7c: 0x6ccb7a20, 0x19d7d: 0x6c00f620, 0x19d7e: 0x6cb7f420, 0x19d7f: 0x6d420e20, - // Block 0x676, offset 0x19d80 - 0x19d80: 0x6c7b7620, 0x19d81: 0x6c3a7420, 0x19d83: 0x6d1b9620, - 0x19d85: 0x6ccaea20, 0x19d86: 0x6c314820, 0x19d87: 0x6c5c8220, - 0x19d88: 0x6d026220, 0x19d89: 0x6d2b1c20, 0x19d8a: 0x6ce03420, 0x19d8b: 0x6ce15a20, - 0x19d8c: 0x6d374620, 0x19d8d: 0x6d191620, 0x19d8e: 0x6c3f1c20, 0x19d8f: 0x6c359420, - 0x19d91: 0x6c75fc20, 0x19d92: 0x6c638e20, 0x19d93: 0x6c141220, - 0x19d94: 0x6cfbca20, 0x19d95: 0x6c981420, 0x19d97: 0x6c0aba20, - 0x19d98: 0x6c8d9220, 0x19d99: 0x6c6b7620, 0x19d9a: 0x6c7d3620, 0x19d9b: 0x6c63f620, - 0x19d9d: 0x6c19a420, 0x19d9e: 0x6c813420, 0x19d9f: 0x6d03b420, - 0x19da0: 0x6c3af620, 0x19da1: 0x6c936e20, 0x19da2: 0x6d2c9e20, 0x19da3: 0x6c51a420, - 0x19da4: 0x6c5f9420, 0x19da5: 0x6ca66220, 0x19da6: 0x6d1cd620, 0x19da7: 0x6d002e20, - 0x19da8: 0x6ce2d820, 0x19da9: 0x6c81c820, 0x19daa: 0x6d2b2820, 0x19dab: 0x6c7cba20, - 0x19dad: 0x6cb9e620, 0x19dae: 0x6c719020, 0x19daf: 0x6cb18c20, - 0x19db0: 0x6c38f220, 0x19db1: 0x6ce80020, 0x19db2: 0x6c8c4020, 0x19db3: 0x6c9cc020, - 0x19db4: 0x6d3de820, 0x19db5: 0x6d013020, 0x19db6: 0x6c56ee20, 0x19db7: 0x6c9cc220, - 0x19db8: 0x6c6a4820, 0x19db9: 0x6d28e220, 0x19dba: 0x6c23d620, 0x19dbb: 0x6c87b220, - 0x19dbc: 0x6cc4a020, 0x19dbd: 0x6d3a4a20, 0x19dbe: 0x6d1ab820, 0x19dbf: 0x6c4f4020, - // Block 0x677, offset 0x19dc0 - 0x19dc1: 0x6d198620, 0x19dc2: 0x6c948020, 0x19dc3: 0x6d274420, - 0x19dc4: 0x6cc4a420, 0x19dc5: 0x6c8df620, 0x19dc6: 0x6ca78620, 0x19dc7: 0x6d24b620, - 0x19dc8: 0x6caaa020, 0x19dca: 0x6d174020, 0x19dcb: 0x6caaa420, - 0x19dcc: 0x6d174220, 0x19dcd: 0x6cb98020, 0x19dce: 0x6cf9b620, 0x19dcf: 0x6c1edc20, - 0x19dd0: 0x6d1a6820, 0x19dd1: 0x6c9d4820, 0x19dd2: 0x6cf65820, 0x19dd3: 0x6ca35a20, - 0x19dd4: 0x6c76de20, 0x19dd5: 0x6d412020, 0x19dd6: 0x6cf9da20, 0x19dd7: 0x6d0cc620, - 0x19dd8: 0x6ce8f420, 0x19dd9: 0x6ce30020, 0x19dda: 0x6cf38820, 0x19ddb: 0x6cdda820, - 0x19ddc: 0x6d1aaa20, 0x19ddd: 0x6c1d0a20, 0x19dde: 0x6d38de20, 0x19ddf: 0x6c988620, - 0x19de0: 0x6d254820, 0x19de1: 0x6caa8020, 0x19de2: 0x6c9e7020, 0x19de3: 0x6d2a4820, - 0x19de4: 0x6ced1420, 0x19de5: 0x6c83ca20, 0x19de6: 0x6cc10420, 0x19de7: 0x6ca33a20, - 0x19de8: 0x6cd26220, 0x19de9: 0x6c098c20, 0x19dea: 0x6d3e2a20, 0x19deb: 0x6c056c20, - 0x19ded: 0x6c736c20, 0x19dee: 0x6cfde620, 0x19def: 0x6c7c7c20, - 0x19df0: 0x6cac2c20, 0x19df1: 0x6c7ba220, 0x19df2: 0x6d0a1220, 0x19df3: 0x6d2cc620, - 0x19df4: 0x6d10fc20, 0x19df5: 0x6c7d6a20, 0x19df6: 0x6c5acc20, 0x19df7: 0x6cf65a20, - 0x19df8: 0x6c357420, 0x19df9: 0x6d0fcc20, 0x19dfa: 0x6ce59020, 0x19dfb: 0x6d1f4e20, - 0x19dfc: 0x6c746c20, 0x19dfd: 0x6c83f620, 0x19dff: 0x6c842020, - // Block 0x678, offset 0x19e00 - 0x19e00: 0x6c198020, 0x19e01: 0x6c624e20, 0x19e02: 0x6c562a20, 0x19e03: 0x6d2e7020, - 0x19e04: 0x6c3f7a20, 0x19e05: 0x6c16ba20, 0x19e06: 0x6c495c20, 0x19e07: 0x6c714420, - 0x19e08: 0x6c9b3220, 0x19e09: 0x6c167820, 0x19e0a: 0x6ce0a620, 0x19e0b: 0x6ca1e220, - 0x19e0c: 0x6d039e20, 0x19e0d: 0x6c852620, 0x19e0e: 0x6d0c2a20, 0x19e0f: 0x6cd9da20, - 0x19e10: 0x6cd1ee20, 0x19e11: 0x6d186420, 0x19e12: 0x6c0e2a20, 0x19e13: 0x6c234e20, - 0x19e14: 0x6c542c20, 0x19e15: 0x6ced3a20, 0x19e16: 0x6c2c9620, 0x19e17: 0x6c5f4420, - 0x19e18: 0x6c443820, 0x19e19: 0x6c4e3420, 0x19e1a: 0x6c0f6220, 0x19e1b: 0x6d04f420, - 0x19e1c: 0x6c8ea220, 0x19e1d: 0x6c11ae20, 0x19e1e: 0x6c11b020, 0x19e1f: 0x6d18d820, - 0x19e20: 0x6d082c20, 0x19e21: 0x6d0ce020, 0x19e22: 0x6d2a5c20, 0x19e23: 0x6c4f1e20, - 0x19e24: 0x6d1e0020, 0x19e25: 0x6d3fc820, 0x19e27: 0x6c775820, - 0x19e28: 0x6d21bc20, 0x19e29: 0x6cb53820, 0x19e2a: 0x6d310620, 0x19e2b: 0x6c967e20, - 0x19e2e: 0x6cd6e820, 0x19e2f: 0x6c6d6a20, - 0x19e30: 0x6c49b020, 0x19e31: 0x6cb46c20, 0x19e32: 0x6c8c7220, - 0x19e34: 0x6ce69c20, 0x19e35: 0x6c679420, 0x19e36: 0x6c7eac20, 0x19e37: 0x6d191820, - 0x19e38: 0x6d1dce20, 0x19e39: 0x6c22ec20, 0x19e3a: 0x6d0dfe20, 0x19e3b: 0x6c6b7020, - 0x19e3c: 0x6d09c820, 0x19e3d: 0x6cf11020, 0x19e3e: 0x6cfc4c20, 0x19e3f: 0x6ca93620, - // Block 0x679, offset 0x19e40 - 0x19e40: 0x6c408c20, 0x19e41: 0x6c445c20, 0x19e43: 0x6ca19c20, - 0x19e44: 0x6d3b4620, 0x19e45: 0x6ca38a20, 0x19e46: 0x6cfc5620, 0x19e47: 0x6cf1c420, - 0x19e48: 0x6c877820, 0x19e49: 0x6c11c220, 0x19e4a: 0x6c9f1c20, 0x19e4b: 0x6c655220, - 0x19e4c: 0x6ca6e220, 0x19e4d: 0x6c14b020, 0x19e4e: 0x6cecb020, 0x19e4f: 0x6d069c20, - 0x19e50: 0x6caa8220, 0x19e51: 0x6c973020, 0x19e52: 0x6d417020, 0x19e53: 0x6c770c20, - 0x19e54: 0x6c761620, 0x19e55: 0x6c4f7020, - 0x19e58: 0x6d23f420, 0x19e59: 0x6cf11220, 0x19e5a: 0x6d39fa20, - 0x19e5d: 0x6d170a20, 0x19e5f: 0x6c2dbc20, - 0x19e60: 0x6c3e4420, 0x19e61: 0x6c08d620, 0x19e62: 0x6d3a6820, 0x19e63: 0x6d3f0c20, - 0x19e64: 0x6cd5cc20, 0x19e65: 0x6cf9ba20, 0x19e66: 0x6ca5e020, - 0x19e68: 0x6c68fe20, 0x19e69: 0x6d0a1420, 0x19e6a: 0x6c1cc620, 0x19e6b: 0x6caa2220, - 0x19e6c: 0x6cc67e20, 0x19e6d: 0x6d364220, 0x19e6e: 0x6cca6e20, - 0x19e70: 0x6cccf020, 0x19e71: 0x6d237e20, 0x19e73: 0x6c6c4e20, - 0x19e75: 0x6c929c20, 0x19e76: 0x6c4db020, 0x19e77: 0x6c0cb220, - 0x19e78: 0x6d183a20, 0x19e79: 0x6d41c020, 0x19e7a: 0x6d2e7220, 0x19e7b: 0x6d23ac20, - 0x19e7c: 0x6ced3c20, 0x19e7d: 0x6ca5fe20, 0x19e7e: 0x6c495e20, 0x19e7f: 0x6c748420, - // Block 0x67a, offset 0x19e80 - 0x19e80: 0x6c082820, 0x19e81: 0x6c11a220, 0x19e83: 0x6c351220, - 0x19e84: 0x6cb7c620, 0x19e85: 0x6d10b420, 0x19e86: 0x6c7d1820, 0x19e87: 0x6cc84820, - 0x19e88: 0x6c542e20, 0x19e89: 0x6d0a3820, 0x19e8a: 0x6d020020, - 0x19e8c: 0x6c7d1a20, 0x19e8e: 0x6d00f020, 0x19e8f: 0x6c0f6420, - 0x19e90: 0x6c78d820, 0x19e91: 0x6c24ec20, 0x19e92: 0x6d074020, 0x19e93: 0x6c042820, - 0x19e94: 0x6cab5820, 0x19e95: 0x6d400c20, 0x19e97: 0x6ce42e20, - 0x19e98: 0x6c1ef220, 0x19e99: 0x6c1b5820, 0x19e9a: 0x6ca7b420, 0x19e9b: 0x6c49ac20, - 0x19e9c: 0x6c3cbe20, 0x19e9d: 0x6d023020, 0x19e9e: 0x6c2aba20, 0x19e9f: 0x6cef4e20, - 0x19ea0: 0x6c74e220, 0x19ea1: 0x6c7d2e20, 0x19ea2: 0x6d2bb420, 0x19ea3: 0x6cc9ac20, - 0x19ea4: 0x6c34bc20, 0x19ea5: 0x6c8d8420, 0x19ea6: 0x6c9b9a20, - 0x19ea8: 0x6c4cde20, 0x19ea9: 0x6c9b9c20, 0x19eaa: 0x6c8fec20, - 0x19eac: 0x6d1d5e20, 0x19eae: 0x6c49c620, 0x19eaf: 0x6c248820, - 0x19eb0: 0x6c84e620, 0x19eb1: 0x6c320c20, 0x19eb3: 0x6c0bf220, - 0x19eb5: 0x6cf62c20, 0x19eb7: 0x6c2a6620, - 0x19eb8: 0x6c2a6820, 0x19eb9: 0x6cfcba20, 0x19eba: 0x6c880020, - 0x19ebc: 0x6ccedc20, 0x19ebd: 0x6d00b020, 0x19ebe: 0x6cd1c420, 0x19ebf: 0x6cf09e20, - // Block 0x67b, offset 0x19ec0 - 0x19ec2: 0x6c51d820, 0x19ec3: 0x6d1f5a20, - 0x19ec4: 0x6c92b220, 0x19ec5: 0x6c7f5020, 0x19ec6: 0x6d1d0e20, 0x19ec7: 0x6cd14c20, - 0x19ec8: 0x6c739220, 0x19ec9: 0x6cb7e420, 0x19eca: 0x6c65ea20, 0x19ecb: 0x6d285c20, - 0x19ecd: 0x6cb7f620, 0x19ecf: 0x6c8c7c20, - 0x19ed0: 0x6c60ea20, 0x19ed1: 0x6c970a20, 0x19ed2: 0x6c208220, 0x19ed3: 0x6ca74620, - 0x19ed4: 0x6c0d6e20, 0x19ed5: 0x6c87c020, 0x19ed6: 0x6c8dfa20, 0x19ed7: 0x6c427a20, - 0x19ed8: 0x6c1a2020, 0x19ed9: 0x6d07b020, 0x19eda: 0x6cfc1a20, 0x19edb: 0x6c558620, - 0x19edc: 0x6c088620, 0x19edd: 0x6d40d020, 0x19ede: 0x6c271a20, 0x19edf: 0x6c271c20, - 0x19ee0: 0x6c5d3e20, 0x19ee1: 0x6cc9d020, 0x19ee2: 0x6c184420, 0x19ee3: 0x6ce37c20, - 0x19ee5: 0x6cab1a20, 0x19ee6: 0x6d371420, 0x19ee7: 0x6c8ebe20, - 0x19ee8: 0x6c3aea20, 0x19ee9: 0x6c695e20, 0x19eea: 0x6c493620, 0x19eeb: 0x6cf7ba20, - 0x19eec: 0x6c8bf820, 0x19eed: 0x6d07f820, 0x19eee: 0x6cc62a20, 0x19eef: 0x6ce25a20, - 0x19ef0: 0x6cb05820, 0x19ef1: 0x6d032a20, 0x19ef2: 0x6ccd7c20, 0x19ef3: 0x6d360e20, - 0x19ef4: 0x6cec3220, 0x19ef5: 0x6ce81020, 0x19ef6: 0x6ce46620, 0x19ef7: 0x6d13e820, - 0x19ef8: 0x6d019c20, 0x19ef9: 0x6cb05c20, 0x19efa: 0x6d10ec20, 0x19efb: 0x6d10ee20, - 0x19efc: 0x6caa8620, 0x19efd: 0x6c503a20, 0x19efe: 0x6ca8e820, 0x19eff: 0x6d1b4a20, - // Block 0x67c, offset 0x19f00 - 0x19f00: 0x6c390a20, 0x19f01: 0x6ca3fa20, 0x19f02: 0x6d109c20, 0x19f03: 0x6ced7e20, - 0x19f04: 0x6d25e820, 0x19f05: 0x6cf9c820, 0x19f06: 0x6d392c20, 0x19f07: 0x6d25ea20, - 0x19f08: 0x6cd38a20, 0x19f09: 0x6c9e5a20, 0x19f0a: 0x6cf62e20, 0x19f0b: 0x6c621220, - 0x19f0c: 0x6ce22a20, 0x19f0d: 0x6c3ab020, 0x19f0e: 0x6d096020, 0x19f0f: 0x6ca5e820, - 0x19f10: 0x6c224620, 0x19f11: 0x6c9d4a20, 0x19f12: 0x6c0ba220, - 0x19f14: 0x6ca2e620, 0x19f15: 0x6d238020, 0x19f16: 0x6c366220, 0x19f17: 0x6d353a20, - 0x19f18: 0x6cc57420, 0x19f19: 0x6d070020, 0x19f1a: 0x6c94b020, 0x19f1b: 0x6c5be820, - 0x19f1c: 0x6d0a9620, 0x19f1d: 0x6ca4b820, 0x19f1e: 0x6c4eee20, 0x19f1f: 0x6c63d620, - 0x19f20: 0x6c312e20, 0x19f21: 0x6c57b420, 0x19f22: 0x6ce86c20, 0x19f23: 0x6cb26220, - 0x19f24: 0x6c244c20, 0x19f25: 0x6cf68220, 0x19f26: 0x6cd99820, 0x19f27: 0x6c9c6c20, - 0x19f28: 0x6d034420, 0x19f29: 0x6cf51a20, 0x19f2a: 0x6cbf5420, 0x19f2b: 0x6d2edc20, - 0x19f2c: 0x6ce23620, 0x19f2d: 0x6d043620, 0x19f2e: 0x6c701e20, 0x19f2f: 0x6c728220, - 0x19f30: 0x6c5d4020, 0x19f31: 0x6ce36e20, 0x19f32: 0x6c977420, 0x19f33: 0x6d0ea420, - 0x19f34: 0x6c5f2020, 0x19f35: 0x6cd47a20, 0x19f36: 0x6c82d620, 0x19f37: 0x6ced4420, - 0x19f38: 0x6c183820, 0x19f39: 0x6c120a20, 0x19f3a: 0x6c6c0620, 0x19f3b: 0x6d205820, - 0x19f3c: 0x6c5b6620, 0x19f3d: 0x6d2c9420, 0x19f3e: 0x6cdb4820, 0x19f3f: 0x6c444220, - // Block 0x67d, offset 0x19f40 - 0x19f40: 0x6ca51a20, 0x19f41: 0x6cf8f820, 0x19f43: 0x6c331a20, - 0x19f44: 0x6c1b6420, 0x19f45: 0x6cef5020, 0x19f46: 0x6d30ae20, 0x19f47: 0x6c4bf420, - 0x19f48: 0x6c175620, 0x19f49: 0x6c1ae020, 0x19f4a: 0x6d2a2820, 0x19f4b: 0x6c5c8420, - 0x19f4c: 0x6c944820, 0x19f4d: 0x6c8a4620, 0x19f4e: 0x6c818a20, 0x19f4f: 0x6cead820, - 0x19f50: 0x6c5b0420, 0x19f51: 0x6cf54620, 0x19f52: 0x6c02fa20, 0x19f53: 0x6ccf8620, - 0x19f54: 0x6cdc0220, 0x19f55: 0x6c974c20, 0x19f56: 0x6ce0b620, 0x19f57: 0x6d035a20, - 0x19f58: 0x6c6e4020, 0x19f59: 0x6c017620, 0x19f5a: 0x6cdee220, 0x19f5b: 0x6c156420, - 0x19f5c: 0x6cf11a20, 0x19f5d: 0x6ce98420, 0x19f5e: 0x6c62dc20, 0x19f5f: 0x6c18fa20, - 0x19f60: 0x6c185820, 0x19f61: 0x6d247c20, 0x19f62: 0x6cfc6020, 0x19f63: 0x6d02d020, - 0x19f67: 0x6ca51c20, - 0x19f69: 0x6d0f1020, 0x19f6a: 0x6cc01e20, 0x19f6b: 0x6c675820, - 0x19f6c: 0x6cd95c20, 0x19f6d: 0x6c75c420, 0x19f6e: 0x6c89fc20, 0x19f6f: 0x6c714e20, - 0x19f71: 0x6c97d220, 0x19f72: 0x6c8b7220, - 0x19f74: 0x6c1f3820, 0x19f75: 0x6c1bae20, 0x19f76: 0x6cfdcc20, 0x19f77: 0x6cbd3a20, - 0x19f78: 0x6c9a6220, 0x19f79: 0x6cd5fa20, 0x19f7a: 0x6c149020, 0x19f7b: 0x6c1bc420, - 0x19f7c: 0x6c474620, 0x19f7d: 0x6d21a820, 0x19f7e: 0x6d1a0420, - // Block 0x67e, offset 0x19f80 - 0x19f80: 0x6c8eac20, 0x19f81: 0x6c818020, 0x19f82: 0x6cd61e20, 0x19f83: 0x6d30be20, - 0x19f84: 0x6cd6c420, 0x19f85: 0x6c5aac20, - 0x19f88: 0x6c364620, 0x19f8a: 0x6ccc7020, 0x19f8b: 0x6d402e20, - 0x19f8c: 0x6c74a620, 0x19f8d: 0x6c75ec20, 0x19f8e: 0x6ce93820, 0x19f8f: 0x6c90ca20, - 0x19f90: 0x6cef5c20, 0x19f91: 0x6c1cf420, 0x19f92: 0x6d3b4820, 0x19f93: 0x6c8b7420, - 0x19f95: 0x6d30cc20, 0x19f96: 0x6d2f8c20, - 0x19f98: 0x6d178020, 0x19f99: 0x6c1e5c20, 0x19f9a: 0x6ca5ea20, 0x19f9b: 0x6c0e7820, - 0x19f9c: 0x6cdb8620, 0x19f9d: 0x6d160620, 0x19f9e: 0x6c506020, 0x19f9f: 0x6d0bc820, - 0x19fa0: 0x6c58ac20, 0x19fa1: 0x6c980a20, 0x19fa2: 0x6c980c20, 0x19fa3: 0x6cc1f220, - 0x19fa4: 0x6c81c420, 0x19fa5: 0x6c4ffe20, 0x19fa6: 0x6d37d620, 0x19fa7: 0x6c9f4e20, - 0x19fa8: 0x6cfb5620, 0x19fa9: 0x6d324420, 0x19faa: 0x6cd55e20, 0x19fab: 0x6d423e20, - 0x19fac: 0x6d3afc20, 0x19fad: 0x6c46aa20, 0x19fae: 0x6d089820, 0x19faf: 0x6d17c620, - 0x19fb0: 0x6d366e20, 0x19fb1: 0x6d00c620, 0x19fb2: 0x6c6d1e20, 0x19fb3: 0x6c11a420, - 0x19fb5: 0x6c10ae20, 0x19fb6: 0x6c896a20, 0x19fb7: 0x6d341020, - 0x19fb8: 0x6c626c20, 0x19fb9: 0x6ced4620, 0x19fba: 0x6c49a420, 0x19fbb: 0x6c70bc20, - 0x19fbc: 0x6c6ea220, 0x19fbd: 0x6c00c420, 0x19fbe: 0x6c404220, 0x19fbf: 0x6c4b7220, - // Block 0x67f, offset 0x19fc0 - 0x19fc0: 0x6c548020, 0x19fc1: 0x6d0ec620, 0x19fc2: 0x6cc87e20, 0x19fc3: 0x6d36ee20, - 0x19fc4: 0x6c0c9420, 0x19fc5: 0x6d157620, 0x19fc6: 0x6cdd9e20, 0x19fc7: 0x6c2efa20, - 0x19fc8: 0x6c4b9620, 0x19fc9: 0x6cd18020, 0x19fca: 0x6d0ab820, 0x19fcb: 0x6c194620, - 0x19fcc: 0x6ccf2020, 0x19fcd: 0x6cbe8a20, - 0x19fd0: 0x6c218a20, 0x19fd1: 0x6c533820, 0x19fd2: 0x6c308220, 0x19fd3: 0x6c198220, - 0x19fd4: 0x6ceff820, 0x19fd5: 0x6cc7ea20, 0x19fd6: 0x6cd55420, 0x19fd7: 0x6c10f220, - 0x19fd8: 0x6c600e20, 0x19fd9: 0x6d28b620, 0x19fda: 0x6cb5d420, 0x19fdb: 0x6d0c0220, - 0x19fdc: 0x6c3fe820, 0x19fdd: 0x6d235820, 0x19fde: 0x6c3e9020, 0x19fdf: 0x6cb39220, - 0x19fe0: 0x6d33e620, 0x19fe1: 0x6ce06220, 0x19fe2: 0x6d424020, 0x19fe3: 0x6c17ec20, - 0x19fe4: 0x6cc19a20, 0x19fe5: 0x6d204e20, 0x19fe6: 0x6c514a20, 0x19fe7: 0x6c547420, - 0x19fe8: 0x6c4b0e20, 0x19fe9: 0x6c366620, 0x19fea: 0x6c67ea20, 0x19feb: 0x6d27f620, - 0x19fec: 0x6ce83020, 0x19fed: 0x6c259820, 0x19fee: 0x6ce87020, 0x19fef: 0x6c402a20, - 0x19ff0: 0x6d424c20, 0x19ff1: 0x6c558820, 0x19ff3: 0x6c0f4a20, - 0x19ff4: 0x6d2f6e20, 0x19ff5: 0x6c754a20, 0x19ff6: 0x6ce0d020, 0x19ff7: 0x6c74aa20, - 0x19ff8: 0x6c404620, 0x19ff9: 0x6c5a0220, 0x19ffa: 0x6c211820, 0x19ffb: 0x6d1e5e20, - 0x19ffc: 0x6c20f020, 0x19ffd: 0x6cdda020, 0x19ffe: 0x6c1b5c20, 0x19fff: 0x6cb92a20, - // Block 0x680, offset 0x1a000 - 0x1a000: 0x6c10fc20, 0x1a001: 0x6cff9c20, 0x1a002: 0x6c979220, 0x1a003: 0x6c117c20, - 0x1a004: 0x6cb7f820, 0x1a005: 0x6c66f620, 0x1a006: 0x6c0a9a20, 0x1a007: 0x6c5f8420, - 0x1a008: 0x6d34b820, 0x1a009: 0x6d3a3620, 0x1a00a: 0x6cc1f420, 0x1a00b: 0x6d2e3420, - 0x1a00c: 0x6c60fa20, 0x1a00d: 0x6c0b2420, 0x1a00f: 0x6c878020, - 0x1a010: 0x6c879420, 0x1a011: 0x6d272a20, 0x1a012: 0x6cc34020, 0x1a013: 0x6c195a20, - 0x1a014: 0x6c3fcc20, 0x1a015: 0x6c144020, 0x1a016: 0x6ce19c20, 0x1a017: 0x6cd37420, - 0x1a018: 0x6c4f9620, 0x1a019: 0x6cbcbe20, 0x1a01a: 0x6cb5d620, 0x1a01b: 0x6c0efc20, - 0x1a01c: 0x6ca33e20, 0x1a01d: 0x6ce82a20, 0x1a01e: 0x6c1e7a20, 0x1a01f: 0x6c243c20, - 0x1a020: 0x6d26c020, 0x1a021: 0x6d33e820, 0x1a022: 0x6c18cc20, 0x1a023: 0x6c1f4a20, - 0x1a024: 0x6c09b420, 0x1a025: 0x6c9b1c20, 0x1a026: 0x6c038020, 0x1a027: 0x6ce4a220, - 0x1a028: 0x6c9f5a20, 0x1a029: 0x6c8aba20, 0x1a02a: 0x6c3ccc20, 0x1a02b: 0x6c197420, - 0x1a02c: 0x6cc0b820, 0x1a02d: 0x6ce58820, 0x1a02e: 0x6c3eac20, 0x1a02f: 0x6c7e0820, - 0x1a030: 0x6c65b820, - 0x1a034: 0x6d325620, 0x1a035: 0x6cc08a20, 0x1a036: 0x6d42a820, 0x1a037: 0x6c1c4c20, - 0x1a038: 0x6c7c9420, 0x1a039: 0x6c8b2420, 0x1a03a: 0x6c074a20, 0x1a03b: 0x6c326e20, - 0x1a03c: 0x6cf46c20, 0x1a03e: 0x6d3d9220, 0x1a03f: 0x6c92ba20, - // Block 0x681, offset 0x1a040 - 0x1a040: 0x6ce0d220, 0x1a042: 0x6c1eaa20, 0x1a043: 0x6c89a020, - 0x1a044: 0x6ce51820, 0x1a045: 0x6c7dbe20, 0x1a046: 0x6c16c420, 0x1a047: 0x6c74ac20, - 0x1a048: 0x6ce8ec20, 0x1a049: 0x6c594e20, 0x1a04a: 0x6c3aca20, 0x1a04b: 0x6c0a3c20, - 0x1a04d: 0x6cf97c20, 0x1a04e: 0x6cf31820, 0x1a04f: 0x6c628a20, - 0x1a050: 0x6cc27a20, 0x1a051: 0x6c7cdc20, 0x1a052: 0x6c55c220, 0x1a053: 0x6cbfca20, - 0x1a054: 0x6cdc7c20, 0x1a055: 0x6c10fa20, 0x1a057: 0x6cc0bc20, - 0x1a058: 0x6cb0c820, 0x1a059: 0x6cad1020, 0x1a05a: 0x6cec4020, 0x1a05b: 0x6d115620, - 0x1a05c: 0x6cc6c220, 0x1a05d: 0x6d09b620, 0x1a05e: 0x6c246c20, 0x1a05f: 0x6c2efc20, - 0x1a060: 0x6c1c8a20, 0x1a061: 0x6c25f620, 0x1a062: 0x6c9c1220, 0x1a063: 0x6d086420, - 0x1a064: 0x6c34be20, 0x1a065: 0x6c0d0420, 0x1a066: 0x6d310a20, 0x1a067: 0x6c1ec620, - 0x1a068: 0x6c164220, 0x1a069: 0x6c4b9e20, 0x1a06a: 0x6c32e620, 0x1a06b: 0x6d409420, - 0x1a06c: 0x6c2afe20, 0x1a06d: 0x6c7f3820, 0x1a06e: 0x6ce2da20, 0x1a06f: 0x6d272c20, - 0x1a070: 0x6cc34220, 0x1a071: 0x6d3a5020, 0x1a072: 0x6c8d1020, 0x1a073: 0x6c186c20, - 0x1a074: 0x6d31e020, 0x1a075: 0x6c400220, 0x1a076: 0x6ccf4e20, 0x1a077: 0x6ce5c620, - 0x1a078: 0x6c7ac820, 0x1a079: 0x6c004420, 0x1a07b: 0x6cbf5620, - 0x1a07c: 0x6cd61220, 0x1a07d: 0x6c4d3420, 0x1a07e: 0x6ccd5e20, 0x1a07f: 0x6cec7620, - // Block 0x682, offset 0x1a080 - 0x1a080: 0x6d2e3620, 0x1a081: 0x6c904a20, 0x1a082: 0x6c6f6220, 0x1a083: 0x6c85b820, - 0x1a085: 0x6c210220, 0x1a086: 0x6cc66c20, 0x1a087: 0x6d26ac20, - 0x1a088: 0x6c743a20, 0x1a089: 0x6c776c20, 0x1a08a: 0x6c390c20, 0x1a08b: 0x6cb5da20, - 0x1a08c: 0x6c534220, 0x1a08d: 0x6c3e7220, 0x1a08e: 0x6c915220, 0x1a08f: 0x6c535820, - 0x1a090: 0x6ceb2a20, 0x1a091: 0x6c9f5c20, 0x1a092: 0x6ce4a420, 0x1a093: 0x6c737c20, - 0x1a094: 0x6cb70620, 0x1a095: 0x6d332620, 0x1a096: 0x6cbece20, 0x1a097: 0x6c45f220, - 0x1a098: 0x6ce4b620, 0x1a099: 0x6c80dc20, 0x1a09a: 0x6c99a620, 0x1a09b: 0x6d1b6a20, - 0x1a09c: 0x6c92c020, 0x1a09d: 0x6d250e20, 0x1a09e: 0x6c715420, 0x1a09f: 0x6cb0b820, - 0x1a0a1: 0x6d00f420, 0x1a0a2: 0x6c0bbe20, 0x1a0a3: 0x6c5cd820, - 0x1a0a4: 0x6d39cc20, 0x1a0a5: 0x6cc6c820, 0x1a0a6: 0x6cca8e20, 0x1a0a7: 0x6cf38420, - 0x1a0a8: 0x6c144e20, 0x1a0a9: 0x6c795820, 0x1a0aa: 0x6ccdc420, 0x1a0ab: 0x6caede20, - 0x1a0ac: 0x6c980e20, 0x1a0ad: 0x6d050620, 0x1a0af: 0x6c237020, - 0x1a0b0: 0x6c796020, 0x1a0b1: 0x6d3bb220, 0x1a0b2: 0x6c154620, 0x1a0b3: 0x6cd84220, - 0x1a0b4: 0x6c1cf620, 0x1a0b5: 0x6cdcae20, 0x1a0b6: 0x6c076e20, 0x1a0b7: 0x6c769e20, - 0x1a0b9: 0x6d376020, 0x1a0ba: 0x6cf12620, 0x1a0bb: 0x6c9f8420, - 0x1a0bc: 0x6c8db220, 0x1a0bd: 0x6d414220, 0x1a0be: 0x6ca8d420, 0x1a0bf: 0x6c8dfc20, - // Block 0x683, offset 0x1a0c0 - 0x1a0c0: 0x6cb77420, 0x1a0c1: 0x6d26b020, 0x1a0c3: 0x6d186820, - 0x1a0c4: 0x6cf82220, 0x1a0c5: 0x6c18d820, 0x1a0c7: 0x6cc71e20, - 0x1a0c8: 0x6c18f820, 0x1a0c9: 0x6ca9da20, 0x1a0ca: 0x6d1ef220, 0x1a0cb: 0x6c618c20, - 0x1a0cc: 0x6c0ebe20, 0x1a0cd: 0x6c39ca20, - 0x1a0d0: 0x6c242220, 0x1a0d1: 0x6c2be820, 0x1a0d2: 0x6c684020, 0x1a0d3: 0x6d20fc20, - 0x1a0d4: 0x6c50fe20, 0x1a0d5: 0x6d06b220, 0x1a0d6: 0x6d22f820, 0x1a0d7: 0x6cc0f620, - 0x1a0d9: 0x6c044420, 0x1a0da: 0x6c44cc20, 0x1a0db: 0x6c6f0e20, - 0x1a0dd: 0x6d0bb820, 0x1a0de: 0x6cd5de20, 0x1a0df: 0x6d1f3e20, - 0x1a0e0: 0x6cd98e20, 0x1a0e1: 0x6d130820, 0x1a0e2: 0x6c125820, 0x1a0e3: 0x6d112a20, - 0x1a0e4: 0x6cd5fc20, 0x1a0e5: 0x6d0cba20, 0x1a0e6: 0x6cd67220, 0x1a0e7: 0x6c8aa220, - 0x1a0e8: 0x6c235020, 0x1a0e9: 0x6d23d420, 0x1a0ea: 0x6c0f6620, 0x1a0eb: 0x6cdbfe20, - 0x1a0ed: 0x6d0eca20, 0x1a0ee: 0x6c834820, 0x1a0ef: 0x6c8bf420, - 0x1a0f0: 0x6ce30220, 0x1a0f1: 0x6c31de20, 0x1a0f2: 0x6d272e20, 0x1a0f3: 0x6c611620, - 0x1a0f5: 0x6d278620, - 0x1a0f8: 0x6c706220, 0x1a0f9: 0x6c71a820, 0x1a0fa: 0x6c1e5820, 0x1a0fb: 0x6c18ac20, - 0x1a0fc: 0x6c457820, 0x1a0fd: 0x6cfe4220, 0x1a0fe: 0x6cfbee20, 0x1a0ff: 0x6c011c20, - // Block 0x684, offset 0x1a100 - 0x1a100: 0x6c4ae020, 0x1a101: 0x6d223220, 0x1a102: 0x6c82bc20, - 0x1a104: 0x6ce89c20, 0x1a105: 0x6c18b820, 0x1a106: 0x6d03e020, 0x1a107: 0x6cc03e20, - 0x1a108: 0x6c4f9a20, 0x1a10a: 0x6c292c20, 0x1a10b: 0x6c112e20, - 0x1a10c: 0x6c2bf420, 0x1a10d: 0x6d0d7020, 0x1a10e: 0x6d3e3020, - 0x1a110: 0x6d1bc020, 0x1a111: 0x6c14fa20, 0x1a113: 0x6c840020, - 0x1a114: 0x6cdd7e20, 0x1a115: 0x6c969c20, 0x1a116: 0x6c96a620, - 0x1a118: 0x6ce11e20, 0x1a119: 0x6cade620, 0x1a11a: 0x6c90ae20, 0x1a11b: 0x6cb51820, - 0x1a11c: 0x6c25ec20, 0x1a11d: 0x6ce8ee20, 0x1a11e: 0x6c369a20, 0x1a11f: 0x6c11aa20, - 0x1a120: 0x6c6b2c20, 0x1a121: 0x6d156420, 0x1a122: 0x6c60d020, 0x1a123: 0x6c294220, - 0x1a124: 0x6c752220, 0x1a125: 0x6c08cc20, 0x1a126: 0x6c832620, 0x1a127: 0x6d174a20, - 0x1a128: 0x6c214020, 0x1a129: 0x6c214620, 0x1a12a: 0x6cb38820, 0x1a12b: 0x6c83cc20, - 0x1a12c: 0x6d291420, 0x1a12d: 0x6cdf7020, 0x1a12e: 0x6cb39420, 0x1a12f: 0x6c242620, - 0x1a130: 0x6c725020, 0x1a131: 0x6d070620, 0x1a132: 0x6c395820, - 0x1a134: 0x6d070820, 0x1a135: 0x6c37d420, 0x1a136: 0x6c5d7e20, 0x1a137: 0x6d39b820, - 0x1a138: 0x6cc4c820, 0x1a139: 0x6c381c20, 0x1a13a: 0x6c72fc20, 0x1a13b: 0x6c4db620, - 0x1a13c: 0x6c896e20, 0x1a13d: 0x6d341220, 0x1a13e: 0x6c9d8220, 0x1a13f: 0x6d209a20, - // Block 0x685, offset 0x1a140 - 0x1a141: 0x6c133a20, 0x1a142: 0x6c9a2c20, 0x1a143: 0x6d1a0620, - 0x1a144: 0x6c9e4220, 0x1a145: 0x6ce8f620, 0x1a146: 0x6c7c9e20, - 0x1a149: 0x6c9d9a20, 0x1a14a: 0x6cc6ca20, 0x1a14b: 0x6d241c20, - 0x1a14c: 0x6cbae620, 0x1a14d: 0x6c9c8c20, 0x1a14e: 0x6c718020, 0x1a14f: 0x6cb07e20, - 0x1a150: 0x6c6cc620, 0x1a151: 0x6cee5e20, 0x1a152: 0x6c62c020, 0x1a153: 0x6c9baa20, - 0x1a154: 0x6c672020, 0x1a155: 0x6d098020, 0x1a156: 0x6c068220, 0x1a157: 0x6c420220, - 0x1a158: 0x6c161e20, 0x1a159: 0x6c87cc20, 0x1a15a: 0x6c851620, 0x1a15b: 0x6cc04020, - 0x1a15c: 0x6c33ee20, 0x1a15d: 0x6d1d3e20, 0x1a15e: 0x6d27ea20, 0x1a15f: 0x6c18ce20, - 0x1a160: 0x6d353220, 0x1a161: 0x6cc4ca20, 0x1a163: 0x6c94b220, - 0x1a164: 0x6c763a20, 0x1a165: 0x6c4b1420, 0x1a166: 0x6d26d620, 0x1a167: 0x6c5c0820, - 0x1a168: 0x6cb0b220, 0x1a169: 0x6c13f820, 0x1a16a: 0x6c34a820, 0x1a16b: 0x6c152220, - 0x1a16c: 0x6ccc1020, 0x1a16d: 0x6cd3c820, 0x1a16e: 0x6ccf7620, 0x1a16f: 0x6d03fa20, - 0x1a170: 0x6d1c9420, 0x1a171: 0x6cd3ca20, 0x1a172: 0x6c1c6420, 0x1a173: 0x6d134820, - 0x1a174: 0x6c4e3620, 0x1a175: 0x6c3ad420, 0x1a176: 0x6d134a20, 0x1a177: 0x6d0de220, - 0x1a178: 0x6d416220, 0x1a179: 0x6cd9ee20, 0x1a17a: 0x6c6c6620, 0x1a17b: 0x6c351a20, - 0x1a17c: 0x6cfd2220, 0x1a17d: 0x6c492e20, 0x1a17e: 0x6ce1f820, 0x1a17f: 0x6cbcfa20, - // Block 0x686, offset 0x1a180 - 0x1a180: 0x6c15f420, 0x1a181: 0x6c4e4420, 0x1a182: 0x6c9c1420, 0x1a183: 0x6d26fc20, - 0x1a184: 0x6c247020, 0x1a185: 0x6cba8420, 0x1a186: 0x6c6cc420, 0x1a187: 0x6ccdd020, - 0x1a188: 0x6ca25820, 0x1a189: 0x6d251e20, 0x1a18b: 0x6cae8a20, - 0x1a18c: 0x6d336e20, 0x1a18d: 0x6d374a20, 0x1a18e: 0x6c216c20, 0x1a18f: 0x6d22aa20, - 0x1a190: 0x6ca1f820, 0x1a191: 0x6cedae20, 0x1a192: 0x6c681020, 0x1a193: 0x6cb54c20, - 0x1a194: 0x6cdb5e20, 0x1a195: 0x6cb1e220, 0x1a196: 0x6ce4d020, 0x1a197: 0x6c7b7820, - 0x1a198: 0x6c247a20, 0x1a199: 0x6cdcb820, 0x1a19b: 0x6c6a4220, - 0x1a19c: 0x6c671420, 0x1a19d: 0x6c028820, 0x1a19e: 0x6c696e20, 0x1a19f: 0x6d138e20, - 0x1a1a1: 0x6d139020, 0x1a1a2: 0x6c8ff020, 0x1a1a3: 0x6d2a3620, - 0x1a1a4: 0x6c05de20, 0x1a1a5: 0x6c889a20, 0x1a1a7: 0x6c58c620, - 0x1a1a8: 0x6c942620, 0x1a1a9: 0x6cef7820, 0x1a1aa: 0x6cfc5820, 0x1a1ab: 0x6ce60a20, - 0x1a1ac: 0x6c0fc820, 0x1a1ad: 0x6d337620, 0x1a1ae: 0x6d3a3e20, 0x1a1af: 0x6c06c420, - 0x1a1b0: 0x6c9bba20, 0x1a1b1: 0x6d015220, 0x1a1b2: 0x6cab6820, 0x1a1b3: 0x6d1ed820, - 0x1a1b5: 0x6cffc820, 0x1a1b6: 0x6c87aa20, 0x1a1b7: 0x6d2c6e20, - 0x1a1b8: 0x6c9cd020, 0x1a1ba: 0x6d128420, - 0x1a1bd: 0x6cb31620, 0x1a1be: 0x6d014220, - // Block 0x687, offset 0x1a1c0 - 0x1a1c2: 0x6ccdd220, 0x1a1c3: 0x6d3d1420, - 0x1a1c5: 0x6ccddc20, 0x1a1c6: 0x6c754020, 0x1a1c7: 0x6c61fc20, - 0x1a1c8: 0x6c6a2620, 0x1a1ca: 0x6ca7a420, 0x1a1cb: 0x6c028420, - 0x1a1cc: 0x6c1f3a20, 0x1a1cd: 0x6cf4e420, 0x1a1ce: 0x6c495420, 0x1a1cf: 0x6d01b820, - 0x1a1d0: 0x6ce6d020, 0x1a1d1: 0x6d096220, 0x1a1d2: 0x6c297220, 0x1a1d3: 0x6d2d8620, - 0x1a1d4: 0x6ce06620, 0x1a1d5: 0x6cae7c20, 0x1a1d6: 0x6d00d420, 0x1a1d7: 0x6d072020, - 0x1a1d8: 0x6cfcf220, 0x1a1d9: 0x6cd8d820, 0x1a1da: 0x6c7aee20, 0x1a1db: 0x6d335a20, - 0x1a1dc: 0x6cf3e620, 0x1a1dd: 0x6c5d5c20, 0x1a1de: 0x6cc90620, 0x1a1df: 0x6cf1ee20, - 0x1a1e0: 0x6c317a20, 0x1a1e1: 0x6c58a020, 0x1a1e2: 0x6c7e1420, 0x1a1e3: 0x6c405a20, - 0x1a1e4: 0x6c1fd020, 0x1a1e5: 0x6cfba420, 0x1a1e6: 0x6cbdae20, 0x1a1e7: 0x6cbc8820, - 0x1a1e8: 0x6c7fba20, 0x1a1ea: 0x6d0bca20, 0x1a1eb: 0x6d1c0220, - 0x1a1ec: 0x6cc40820, 0x1a1ed: 0x6c4f5620, 0x1a1ee: 0x6c218c20, 0x1a1ef: 0x6d371e20, - 0x1a1f1: 0x6cf05620, 0x1a1f2: 0x6d0d0620, 0x1a1f3: 0x6cfe6a20, - 0x1a1f4: 0x6d194c20, 0x1a1f5: 0x6ca66a20, 0x1a1f6: 0x6d335c20, 0x1a1f7: 0x6c1fca20, - 0x1a1f9: 0x6cd23020, 0x1a1fa: 0x6c2f4a20, 0x1a1fb: 0x6d3ee020, - 0x1a1fc: 0x6c73e820, 0x1a1fd: 0x6d067620, 0x1a1fe: 0x6d255a20, - // Block 0x688, offset 0x1a200 - 0x1a201: 0x6d063020, 0x1a202: 0x6c2a0220, 0x1a203: 0x6ce48620, - 0x1a204: 0x6c448020, 0x1a205: 0x6d14b420, 0x1a206: 0x6c532420, 0x1a207: 0x6d13dc20, - 0x1a209: 0x6c851220, 0x1a20a: 0x6c7a3820, 0x1a20b: 0x6cfc0820, - 0x1a20c: 0x6cdbbe20, 0x1a20d: 0x6cf87620, 0x1a20e: 0x6d088620, - 0x1a211: 0x6c2b2a20, 0x1a212: 0x6c7f0420, 0x1a213: 0x6d387e20, - 0x1a214: 0x6ca76420, 0x1a215: 0x6c19f820, 0x1a216: 0x6c668620, 0x1a217: 0x6c09ba20, - 0x1a218: 0x6d3bc820, 0x1a219: 0x6c8d1620, 0x1a21a: 0x6c504e20, 0x1a21b: 0x6c058020, - 0x1a21c: 0x6ce10a20, 0x1a21d: 0x6c1ac220, 0x1a21e: 0x6c96c820, 0x1a21f: 0x6cfce420, - 0x1a220: 0x6cd69420, 0x1a221: 0x6d1da020, 0x1a222: 0x6cc12c20, - 0x1a224: 0x6cb44c20, 0x1a225: 0x6c5c2020, 0x1a226: 0x6cef3620, 0x1a227: 0x6d161620, - 0x1a228: 0x6d134c20, 0x1a22a: 0x6c184820, 0x1a22b: 0x6c4ff820, - 0x1a22c: 0x6c0d5a20, 0x1a22e: 0x6cfd3620, 0x1a22f: 0x6c155e20, - 0x1a230: 0x6c5d4e20, 0x1a232: 0x6c4ebc20, 0x1a233: 0x6c224220, - 0x1a234: 0x6d33ec20, 0x1a235: 0x6cb5f220, 0x1a236: 0x6c7c7e20, 0x1a237: 0x6cc75620, - 0x1a239: 0x6d1bca20, 0x1a23a: 0x6d047e20, - 0x1a23c: 0x6c55a020, 0x1a23d: 0x6c250620, 0x1a23f: 0x6cc3fc20, - // Block 0x689, offset 0x1a240 - 0x1a240: 0x6c2b9220, 0x1a241: 0x6cf53020, 0x1a242: 0x6cbfd020, - 0x1a244: 0x6d0eee20, 0x1a245: 0x6c8a5020, 0x1a246: 0x6c08a620, - 0x1a248: 0x6c0d7220, 0x1a24a: 0x6d252c20, 0x1a24b: 0x6caaa620, - 0x1a24c: 0x6c05c620, 0x1a24d: 0x6d1cf220, 0x1a24e: 0x6c536c20, 0x1a24f: 0x6c225820, - 0x1a250: 0x6cb87220, 0x1a251: 0x6ce35a20, 0x1a252: 0x6d23b220, 0x1a253: 0x6c824c20, - 0x1a254: 0x6c05d020, 0x1a256: 0x6c625620, 0x1a257: 0x6c3ee820, - 0x1a258: 0x6cfd0420, 0x1a259: 0x6c133820, 0x1a25a: 0x6c550620, 0x1a25b: 0x6ccb6620, - 0x1a25c: 0x6c080a20, 0x1a25d: 0x6cbe5620, 0x1a25e: 0x6d22a020, 0x1a25f: 0x6cebf620, - 0x1a260: 0x6c007a20, 0x1a261: 0x6c4e3c20, 0x1a262: 0x6c28d020, 0x1a263: 0x6c444620, - 0x1a264: 0x6c2b9c20, 0x1a265: 0x6c5e2020, 0x1a266: 0x6cace420, - 0x1a268: 0x6d3c6a20, 0x1a269: 0x6c8d7c20, 0x1a26a: 0x6c970820, 0x1a26b: 0x6c974820, - 0x1a26c: 0x6c888c20, 0x1a26d: 0x6cff4220, 0x1a26e: 0x6d093220, 0x1a26f: 0x6d327820, - 0x1a270: 0x6cb3b820, 0x1a271: 0x6c408e20, 0x1a272: 0x6caa0e20, 0x1a273: 0x6cf93220, - 0x1a274: 0x6c338e20, 0x1a275: 0x6c28f020, 0x1a276: 0x6d280c20, 0x1a277: 0x6cfd5220, - 0x1a278: 0x6d1b3020, 0x1a279: 0x6cd52220, 0x1a27a: 0x6c339420, 0x1a27b: 0x6c086820, - 0x1a27c: 0x6c56e620, 0x1a27d: 0x6c3a5420, 0x1a27e: 0x6c3aa820, 0x1a27f: 0x6d28be20, - // Block 0x68a, offset 0x1a280 - 0x1a280: 0x6c075620, 0x1a281: 0x6c3a2820, 0x1a282: 0x6cfab820, 0x1a283: 0x6cd3ae20, - 0x1a284: 0x6c9e3020, 0x1a285: 0x6d2e0820, 0x1a286: 0x6d2e0a20, 0x1a287: 0x6d2d8c20, - 0x1a288: 0x6c5c4820, 0x1a289: 0x6c3f8820, 0x1a28a: 0x6ced5a20, 0x1a28b: 0x6ca0b420, - 0x1a28c: 0x6cbc1020, 0x1a28d: 0x6c8a8a20, 0x1a28f: 0x6c9f1e20, - 0x1a290: 0x6c54d820, 0x1a291: 0x6c535e20, 0x1a292: 0x6d213c20, 0x1a293: 0x6cb60820, - 0x1a294: 0x6c350420, 0x1a295: 0x6c020020, 0x1a297: 0x6c03ba20, - 0x1a298: 0x6c2c7820, 0x1a299: 0x6d08aa20, 0x1a29a: 0x6c2c8a20, 0x1a29b: 0x6c0a0e20, - 0x1a29c: 0x6d393e20, 0x1a29d: 0x6cad6020, 0x1a29e: 0x6ce5f620, 0x1a29f: 0x6d155020, - 0x1a2a1: 0x6c63ea20, 0x1a2a2: 0x6d36f220, 0x1a2a3: 0x6ce8f820, - 0x1a2a4: 0x6d00f820, 0x1a2a5: 0x6c28ba20, 0x1a2a6: 0x6ce5a620, 0x1a2a7: 0x6d022620, - 0x1a2a8: 0x6c172620, 0x1a2a9: 0x6d25f220, 0x1a2aa: 0x6c496a20, 0x1a2ab: 0x6c89a420, - 0x1a2ac: 0x6c083220, 0x1a2ae: 0x6c930020, 0x1a2af: 0x6c60e420, - 0x1a2b0: 0x6d08c220, 0x1a2b1: 0x6cd62420, 0x1a2b2: 0x6c318220, 0x1a2b3: 0x6cd9f420, - 0x1a2b4: 0x6c55e220, 0x1a2b5: 0x6d286420, 0x1a2b6: 0x6c160820, 0x1a2b7: 0x6c054620, - 0x1a2b8: 0x6cc6da20, 0x1a2b9: 0x6c359c20, 0x1a2ba: 0x6cf24020, 0x1a2bb: 0x6c03ca20, - 0x1a2bc: 0x6c3cc220, 0x1a2bd: 0x6d209e20, 0x1a2be: 0x6d310c20, 0x1a2bf: 0x6c3bae20, - // Block 0x68b, offset 0x1a2c0 - 0x1a2c0: 0x6c496c20, 0x1a2c1: 0x6c104c20, 0x1a2c2: 0x6c446220, 0x1a2c3: 0x6c33c420, - 0x1a2c4: 0x6c5a3420, 0x1a2c5: 0x6c31f820, 0x1a2c6: 0x6ce3ce20, 0x1a2c7: 0x6c0fcc20, - 0x1a2c8: 0x6cba8a20, 0x1a2c9: 0x6c8b8220, 0x1a2ca: 0x6c901620, 0x1a2cb: 0x6cf13420, - 0x1a2cc: 0x6d2eac20, 0x1a2cd: 0x6c801820, 0x1a2ce: 0x6cdbea20, 0x1a2cf: 0x6ca36020, - 0x1a2d0: 0x6c0a1020, 0x1a2d1: 0x6ceb3e20, 0x1a2d2: 0x6d3b1a20, 0x1a2d3: 0x6c2e5c20, - 0x1a2d4: 0x6c104620, 0x1a2d5: 0x6c716820, 0x1a2d6: 0x6cb3b020, 0x1a2d7: 0x6cfa0c20, - 0x1a2d8: 0x6cf04420, 0x1a2d9: 0x6cb3b420, 0x1a2da: 0x6c267420, 0x1a2db: 0x6c387220, - 0x1a2dc: 0x6c14e420, 0x1a2dd: 0x6c56f020, 0x1a2de: 0x6d28c020, - 0x1a2e4: 0x6c38f020, 0x1a2e5: 0x6d028a20, 0x1a2e6: 0x6c536020, 0x1a2e7: 0x6c1b2e20, - 0x1a2e8: 0x6c05c820, 0x1a2e9: 0x6d1a7a20, 0x1a2eb: 0x6c6dd220, - 0x1a2ec: 0x6c0f6820, 0x1a2ed: 0x6cc88820, 0x1a2ee: 0x6c1e3a20, 0x1a2ef: 0x6d1c1220, - 0x1a2f0: 0x6d143a20, 0x1a2f1: 0x6c411820, 0x1a2f2: 0x6c7d6c20, 0x1a2f3: 0x6d27f020, - 0x1a2f4: 0x6d31ec20, 0x1a2f5: 0x6d0b5a20, 0x1a2f6: 0x6c70b820, 0x1a2f7: 0x6c547a20, - 0x1a2f8: 0x6c9f7620, 0x1a2f9: 0x6c040220, 0x1a2fa: 0x6c441c20, 0x1a2fb: 0x6c0bb220, - 0x1a2fc: 0x6d3d0820, 0x1a2fd: 0x6c505420, 0x1a2fe: 0x6d31ee20, 0x1a2ff: 0x6cd14a20, - // Block 0x68c, offset 0x1a300 - 0x1a300: 0x6c44a020, 0x1a301: 0x6c0a3e20, 0x1a302: 0x6c34b220, 0x1a303: 0x6c216820, - 0x1a304: 0x6c1fb220, 0x1a305: 0x6cca5a20, 0x1a306: 0x6c1a4620, 0x1a307: 0x6cc48a20, - 0x1a308: 0x6c191220, 0x1a309: 0x6c99b820, 0x1a30a: 0x6cadf220, 0x1a30b: 0x6ceec220, - 0x1a30c: 0x6cb07420, 0x1a30d: 0x6c3f8c20, 0x1a30e: 0x6d3d0e20, 0x1a30f: 0x6cb53c20, - 0x1a310: 0x6c8bec20, 0x1a311: 0x6d142020, 0x1a312: 0x6c9adc20, 0x1a313: 0x6cf3f820, - 0x1a314: 0x6cb7fa20, 0x1a315: 0x6c2f0020, 0x1a316: 0x6c191a20, 0x1a317: 0x6cfa0e20, - 0x1a318: 0x6c518e20, 0x1a319: 0x6cca9220, 0x1a31a: 0x6c487e20, 0x1a31b: 0x6c543e20, - 0x1a31c: 0x6c023420, 0x1a31d: 0x6c3f9420, 0x1a31e: 0x6cbbc620, 0x1a31f: 0x6c5d4c20, - 0x1a320: 0x6cafa220, 0x1a321: 0x6d0cf820, 0x1a322: 0x6cd84420, 0x1a323: 0x6cf7b420, - 0x1a324: 0x6ca02420, 0x1a325: 0x6c7ce420, 0x1a326: 0x6c445620, - 0x1a328: 0x6c02fc20, 0x1a329: 0x6cca4220, 0x1a32a: 0x6cd6ee20, 0x1a32b: 0x6c90d820, - 0x1a32c: 0x6d320620, 0x1a32d: 0x6c5c9a20, 0x1a32e: 0x6c156620, - 0x1a330: 0x6c8c8420, 0x1a331: 0x6ca2ee20, 0x1a332: 0x6c4f3c20, 0x1a333: 0x6c31fc20, - 0x1a334: 0x6c6d7820, 0x1a335: 0x6c9df420, 0x1a336: 0x6c38fa20, 0x1a337: 0x6c370020, - 0x1a338: 0x6c174220, 0x1a339: 0x6c536220, 0x1a33a: 0x6c536e20, 0x1a33b: 0x6d238820, - 0x1a33c: 0x6d096a20, 0x1a33d: 0x6cad3a20, 0x1a33e: 0x6c088220, 0x1a33f: 0x6c175220, - // Block 0x68d, offset 0x1a340 - 0x1a340: 0x6d1fe220, 0x1a341: 0x6d153a20, 0x1a342: 0x6d096e20, 0x1a343: 0x6cc97e20, - 0x1a344: 0x6d073420, 0x1a345: 0x6c866820, 0x1a346: 0x6c868a20, 0x1a347: 0x6d263220, - 0x1a348: 0x6c336220, 0x1a349: 0x6c5e0420, 0x1a34a: 0x6ccc7e20, 0x1a34b: 0x6c838c20, - 0x1a34c: 0x6cb3ce20, 0x1a34d: 0x6c550e20, 0x1a34e: 0x6c4c8e20, 0x1a34f: 0x6c10c420, - 0x1a350: 0x6cc8a620, 0x1a351: 0x6cf0fa20, 0x1a352: 0x6cd9f620, 0x1a353: 0x6c01dc20, - 0x1a354: 0x6d21cc20, 0x1a355: 0x6cfd8e20, 0x1a356: 0x6c527c20, 0x1a357: 0x6d0fea20, - 0x1a358: 0x6cff4420, 0x1a359: 0x6d116820, 0x1a35b: 0x6c0ac020, - 0x1a35d: 0x6c528420, 0x1a35e: 0x6ce25620, 0x1a35f: 0x6c8eee20, - 0x1a361: 0x6d3b3420, 0x1a363: 0x6cf89a20, - 0x1a364: 0x6d298e20, 0x1a365: 0x6d17d420, 0x1a366: 0x6c312a20, 0x1a367: 0x6d259020, - 0x1a368: 0x6c700820, 0x1a36a: 0x6c0f2020, 0x1a36b: 0x6ce35c20, - 0x1a36c: 0x6d1d0220, 0x1a36e: 0x6d154020, 0x1a36f: 0x6ca70420, - 0x1a370: 0x6ccee220, 0x1a371: 0x6c07c020, 0x1a372: 0x6c465620, 0x1a373: 0x6c04d420, - 0x1a374: 0x6ca14820, 0x1a375: 0x6c410420, 0x1a376: 0x6c372620, 0x1a377: 0x6ccf2e20, - 0x1a379: 0x6d36d620, 0x1a37a: 0x6d106c20, 0x1a37b: 0x6c66ca20, - 0x1a37c: 0x6d263420, 0x1a37d: 0x6cd73020, 0x1a37e: 0x6ce38420, 0x1a37f: 0x6cf02020, - // Block 0x68e, offset 0x1a380 - 0x1a380: 0x6d0aaa20, 0x1a381: 0x6d36f620, 0x1a382: 0x6d18bc20, 0x1a383: 0x6cc59c20, - 0x1a384: 0x6cd3ee20, 0x1a385: 0x6c55d420, 0x1a386: 0x6ca55620, 0x1a387: 0x6d126a20, - 0x1a388: 0x6c66f820, 0x1a389: 0x6cdc1220, 0x1a38a: 0x6d1d1e20, 0x1a38b: 0x6c061a20, - 0x1a38c: 0x6c55e420, 0x1a38d: 0x6c55e620, 0x1a38e: 0x6d137a20, - 0x1a390: 0x6d107420, 0x1a391: 0x6c888e20, 0x1a392: 0x6cf72620, 0x1a393: 0x6c372820, - 0x1a394: 0x6c331c20, 0x1a395: 0x6d297e20, 0x1a396: 0x6d3b4420, 0x1a397: 0x6d1d2820, - 0x1a398: 0x6d1d2c20, 0x1a399: 0x6c6cca20, 0x1a39a: 0x6c208820, 0x1a39b: 0x6c28ec20, - 0x1a39d: 0x6c7b4a20, 0x1a39e: 0x6d196020, 0x1a39f: 0x6d139a20, - 0x1a3a0: 0x6c662e20, 0x1a3a1: 0x6c372a20, 0x1a3a2: 0x6ca93e20, 0x1a3a3: 0x6c228820, - 0x1a3a4: 0x6cba3420, 0x1a3a5: 0x6d098220, 0x1a3a6: 0x6c0ea420, 0x1a3a7: 0x6c9d1420, - 0x1a3a8: 0x6cd73a20, 0x1a3a9: 0x6ca0a620, 0x1a3aa: 0x6c897c20, 0x1a3ab: 0x6cb71820, - 0x1a3ac: 0x6cb71a20, 0x1a3ad: 0x6cd44c20, 0x1a3ae: 0x6c3f2020, 0x1a3af: 0x6c0f3a20, - 0x1a3b0: 0x6c085820, 0x1a3b1: 0x6c0d0020, 0x1a3b2: 0x6d161c20, 0x1a3b3: 0x6cf13a20, - 0x1a3b4: 0x6c587e20, 0x1a3b5: 0x6c38ac20, 0x1a3b6: 0x6cb60e20, 0x1a3b7: 0x6c98f620, - 0x1a3b8: 0x6c060820, 0x1a3b9: 0x6c020420, 0x1a3ba: 0x6c020a20, 0x1a3bb: 0x6c403020, - 0x1a3bc: 0x6cb63020, 0x1a3bd: 0x6cc45020, 0x1a3be: 0x6ceb4020, 0x1a3bf: 0x6d187420, - // Block 0x68f, offset 0x1a3c0 - 0x1a3c0: 0x6c0f5420, 0x1a3c1: 0x6cb12820, 0x1a3c2: 0x6c039220, - 0x1a3c4: 0x6d082220, 0x1a3c7: 0x6d23fe20, - 0x1a3c8: 0x6c1b5620, 0x1a3c9: 0x6c915e20, 0x1a3ca: 0x6d156820, 0x1a3cb: 0x6c868c20, - 0x1a3cd: 0x6ca7b020, 0x1a3ce: 0x6cf90220, 0x1a3cf: 0x6cf3fa20, - 0x1a3d1: 0x6c834a20, 0x1a3d2: 0x6cb41a20, 0x1a3d3: 0x6d3d1220, - 0x1a3d4: 0x6d417e20, 0x1a3d5: 0x6d3dc620, 0x1a3d6: 0x6c168220, 0x1a3d7: 0x6c01de20, - 0x1a3d8: 0x6c377220, 0x1a3d9: 0x6d244620, 0x1a3da: 0x6c839c20, 0x1a3db: 0x6c408220, - 0x1a3dc: 0x6d2c6420, 0x1a3dd: 0x6c5d0a20, 0x1a3de: 0x6c218e20, 0x1a3df: 0x6cd9fe20, - 0x1a3e0: 0x6c089a20, 0x1a3e1: 0x6c0ab420, 0x1a3e2: 0x6d2c6620, - 0x1a3e4: 0x6c519e20, 0x1a3e5: 0x6c873a20, 0x1a3e7: 0x6c4f3220, - 0x1a3e8: 0x6d292220, 0x1a3e9: 0x6c474a20, 0x1a3ea: 0x6c1a5e20, 0x1a3eb: 0x6c90dc20, - 0x1a3ec: 0x6ca19e20, 0x1a3ed: 0x6c9daa20, 0x1a3ee: 0x6c975020, 0x1a3ef: 0x6c030420, - 0x1a3f0: 0x6d30c020, 0x1a3f1: 0x6d3a3a20, 0x1a3f2: 0x6c5a3820, 0x1a3f3: 0x6c38f620, - 0x1a3f4: 0x6c2b0220, 0x1a3f5: 0x6ce7a420, 0x1a3f7: 0x6c320220, - 0x1a3f8: 0x6cf33620, 0x1a3f9: 0x6cf13020, 0x1a3fa: 0x6c62f620, 0x1a3fb: 0x6c1ca020, - 0x1a3fc: 0x6c8c1220, 0x1a3fd: 0x6c0c6420, 0x1a3fe: 0x6c901e20, 0x1a3ff: 0x6c664a20, - // Block 0x690, offset 0x1a400 - 0x1a400: 0x6ca8da20, 0x1a401: 0x6c959e20, 0x1a402: 0x6cd03420, - 0x1a404: 0x6c487a20, 0x1a405: 0x6ca8a820, 0x1a406: 0x6d178a20, 0x1a407: 0x6c7a4820, - 0x1a408: 0x6cece220, 0x1a409: 0x6cebee20, 0x1a40a: 0x6cb87620, 0x1a40b: 0x6c0f5620, - 0x1a40c: 0x6c779220, 0x1a40d: 0x6c8d5020, 0x1a40e: 0x6c423020, 0x1a40f: 0x6c487820, - 0x1a410: 0x6c4d2c20, 0x1a411: 0x6c7bb020, 0x1a412: 0x6c527420, 0x1a413: 0x6c7c4620, - 0x1a414: 0x6d2b0a20, 0x1a415: 0x6ce64e20, 0x1a416: 0x6c80ee20, 0x1a417: 0x6c0a8020, - 0x1a418: 0x6c595a20, 0x1a419: 0x6cb3aa20, 0x1a41a: 0x6d11de20, 0x1a41b: 0x6cedaa20, - 0x1a41c: 0x6ce43c20, 0x1a41d: 0x6cdc1620, 0x1a41e: 0x6c7ad020, 0x1a41f: 0x6c337e20, - 0x1a420: 0x6c02b620, 0x1a421: 0x6c671620, 0x1a422: 0x6ca09c20, 0x1a423: 0x6c7d4220, - 0x1a424: 0x6c7b4c20, 0x1a425: 0x6c01e620, 0x1a426: 0x6c96ea20, 0x1a427: 0x6cbeaa20, - 0x1a428: 0x6cbb8820, 0x1a42a: 0x6c77b820, 0x1a42b: 0x6c508220, - 0x1a42c: 0x6c34c820, 0x1a42d: 0x6cfaa820, 0x1a42e: 0x6ca37c20, 0x1a42f: 0x6cdd3420, - 0x1a430: 0x6c6bf820, 0x1a431: 0x6caf8220, 0x1a432: 0x6cabcc20, 0x1a433: 0x6cd93020, - 0x1a434: 0x6c16bc20, 0x1a435: 0x6ca86c20, 0x1a436: 0x6c977620, 0x1a437: 0x6cd93e20, - 0x1a438: 0x6c22e420, 0x1a439: 0x6cfae420, 0x1a43a: 0x6c7e2420, - 0x1a43c: 0x6c2b9e20, 0x1a43d: 0x6cb3e420, 0x1a43e: 0x6ce5ac20, 0x1a43f: 0x6d40f420, - // Block 0x691, offset 0x1a440 - 0x1a440: 0x6cf2c820, 0x1a441: 0x6c3ae420, 0x1a442: 0x6c115020, 0x1a443: 0x6caee220, - 0x1a444: 0x6cc9d620, 0x1a446: 0x6cc76e20, 0x1a447: 0x6cb68620, - 0x1a448: 0x6c25fc20, 0x1a449: 0x6cac8e20, 0x1a44a: 0x6c0fc020, 0x1a44b: 0x6c979c20, - 0x1a44c: 0x6d401420, 0x1a44d: 0x6c22f220, 0x1a44e: 0x6c7d4420, 0x1a44f: 0x6c62f820, - 0x1a450: 0x6c801420, 0x1a452: 0x6c9bc220, 0x1a453: 0x6c9df820, - 0x1a454: 0x6cac9620, 0x1a455: 0x6c91aa20, 0x1a456: 0x6d416020, - 0x1a458: 0x6c8ee220, 0x1a459: 0x6d160020, 0x1a45a: 0x6cf1a820, 0x1a45b: 0x6c866c20, - 0x1a45c: 0x6c868e20, 0x1a45d: 0x6d2bb820, 0x1a45e: 0x6d3a9220, 0x1a45f: 0x6c5cfc20, - 0x1a460: 0x6cd03c20, 0x1a461: 0x6c1c6620, 0x1a462: 0x6d043c20, 0x1a463: 0x6cee3a20, - 0x1a464: 0x6c302020, 0x1a465: 0x6c5e2220, 0x1a466: 0x6cb07a20, 0x1a467: 0x6c551420, - 0x1a468: 0x6c9ab420, 0x1a469: 0x6c17f420, 0x1a46a: 0x6c9ab820, 0x1a46b: 0x6c175820, - 0x1a46c: 0x6c719620, 0x1a46d: 0x6caa3420, 0x1a46f: 0x6d197620, - 0x1a470: 0x6cc7f020, 0x1a471: 0x6c8e0420, 0x1a472: 0x6d0bba20, - 0x1a474: 0x6cb7bc20, 0x1a475: 0x6d3e7620, 0x1a477: 0x6c058c20, - 0x1a478: 0x6c45aa20, 0x1a479: 0x6d2af620, 0x1a47a: 0x6c6bfe20, 0x1a47b: 0x6d219a20, - 0x1a47c: 0x6cbd9820, 0x1a47d: 0x6c075820, 0x1a47e: 0x6c035820, 0x1a47f: 0x6ceb5020, - // Block 0x692, offset 0x1a480 - 0x1a480: 0x6d0f6c20, 0x1a481: 0x6cbbfc20, 0x1a482: 0x6d1ff220, 0x1a483: 0x6d36fa20, - 0x1a484: 0x6c6c0a20, 0x1a485: 0x6ca16a20, 0x1a486: 0x6cd12420, 0x1a487: 0x6ccdb820, - 0x1a488: 0x6cb65620, 0x1a489: 0x6ccdba20, 0x1a48a: 0x6c9d0420, 0x1a48b: 0x6c460220, - 0x1a48c: 0x6d157c20, 0x1a48d: 0x6c453e20, 0x1a48e: 0x6c454020, 0x1a48f: 0x6ce82020, - 0x1a490: 0x6c3dac20, 0x1a491: 0x6d092220, 0x1a492: 0x6d137e20, 0x1a493: 0x6ce69a20, - 0x1a494: 0x6ce5ae20, 0x1a495: 0x6ca1f620, 0x1a496: 0x6c8ec620, 0x1a497: 0x6c117e20, - 0x1a498: 0x6c848020, 0x1a499: 0x6cd51820, 0x1a49a: 0x6c932420, 0x1a49b: 0x6c5e3a20, - 0x1a49c: 0x6c263c20, 0x1a49d: 0x6cac1220, 0x1a49e: 0x6c8ed420, 0x1a49f: 0x6c72b820, - 0x1a4a0: 0x6d2e9220, 0x1a4a1: 0x6c718220, 0x1a4a2: 0x6d330a20, 0x1a4a3: 0x6d40f820, - 0x1a4a4: 0x6cfd3820, 0x1a4a5: 0x6d375020, - 0x1a4a8: 0x6c7eb020, 0x1a4ab: 0x6c7ebe20, - 0x1a4ac: 0x6d060a20, 0x1a4ad: 0x6c454220, 0x1a4ae: 0x6c35a220, 0x1a4af: 0x6ca21e20, - 0x1a4b0: 0x6d384a20, 0x1a4b1: 0x6ce3aa20, 0x1a4b2: 0x6d25ce20, 0x1a4b3: 0x6d2dc020, - 0x1a4b4: 0x6c454420, 0x1a4b5: 0x6cf24420, 0x1a4b6: 0x6c80f420, 0x1a4b7: 0x6d21f620, - 0x1a4b8: 0x6cda0820, 0x1a4b9: 0x6d2ca020, 0x1a4ba: 0x6c4d3620, 0x1a4bb: 0x6c576e20, - 0x1a4bc: 0x6d2e3e20, 0x1a4be: 0x6c90de20, 0x1a4bf: 0x6c165020, - // Block 0x693, offset 0x1a4c0 - 0x1a4c0: 0x6d376c20, 0x1a4c1: 0x6cf12820, 0x1a4c2: 0x6d083c20, 0x1a4c3: 0x6d2a6420, - 0x1a4c4: 0x6c9f8620, 0x1a4c5: 0x6c4aac20, 0x1a4c6: 0x6cda7020, - 0x1a4c9: 0x6cd85420, 0x1a4ca: 0x6c352820, 0x1a4cb: 0x6c134220, - 0x1a4cc: 0x6c7b7a20, 0x1a4cd: 0x6ce2dc20, 0x1a4ce: 0x6ca57c20, 0x1a4cf: 0x6c819620, - 0x1a4d0: 0x6c920820, 0x1a4d1: 0x6d159e20, 0x1a4d2: 0x6d029220, 0x1a4d3: 0x6d0e2a20, - 0x1a4d4: 0x6cbe9820, 0x1a4d5: 0x6cb42420, 0x1a4d6: 0x6c1e1220, 0x1a4d7: 0x6cfbe020, - 0x1a4d8: 0x6c497020, 0x1a4d9: 0x6c6b8a20, 0x1a4da: 0x6c7f8220, 0x1a4db: 0x6c9bca20, - 0x1a4dc: 0x6d13ac20, 0x1a4de: 0x6c869420, 0x1a4df: 0x6d1b8420, - 0x1a4e0: 0x6c212620, 0x1a4e1: 0x6cbfde20, 0x1a4e2: 0x6ce2d220, 0x1a4e3: 0x6d21f820, - 0x1a4e6: 0x6c278420, 0x1a4e7: 0x6c327420, - 0x1a4e8: 0x6c537e20, 0x1a4ea: 0x6cf8c220, - 0x1a4ec: 0x6cb64820, 0x1a4ee: 0x6d25a620, 0x1a4ef: 0x6c609e20, - 0x1a4f0: 0x6d285020, 0x1a4f1: 0x6c39dc20, 0x1a4f2: 0x6c45ac20, 0x1a4f3: 0x6c4f8820, - 0x1a4f4: 0x6d326620, 0x1a4f5: 0x6cc3f620, - 0x1a4f8: 0x6c6c0220, 0x1a4f9: 0x6cb02020, 0x1a4fa: 0x6c423220, 0x1a4fb: 0x6d082820, - 0x1a4fc: 0x6cd11420, 0x1a4fd: 0x6cd28c20, 0x1a4fe: 0x6cbc2a20, 0x1a4ff: 0x6c227020, - // Block 0x694, offset 0x1a500 - 0x1a500: 0x6c2eee20, 0x1a501: 0x6c0f7220, 0x1a502: 0x6c2de620, 0x1a503: 0x6ced5020, - 0x1a504: 0x6c227220, 0x1a505: 0x6d355420, 0x1a506: 0x6c041220, 0x1a507: 0x6cf47e20, - 0x1a508: 0x6c061820, 0x1a509: 0x6c28be20, 0x1a50a: 0x6c039420, 0x1a50b: 0x6ce79620, - 0x1a50d: 0x6c45bc20, 0x1a50e: 0x6c702e20, 0x1a50f: 0x6c4b8620, - 0x1a510: 0x6c22e820, 0x1a511: 0x6d1ff420, 0x1a512: 0x6d25ba20, 0x1a513: 0x6c81be20, - 0x1a514: 0x6c716e20, 0x1a515: 0x6c3f1820, 0x1a516: 0x6ca88e20, 0x1a517: 0x6c358c20, - 0x1a518: 0x6c358e20, 0x1a519: 0x6d040e20, 0x1a51a: 0x6c771620, 0x1a51b: 0x6d0ee220, - 0x1a51c: 0x6ce90220, 0x1a51d: 0x6cb3f820, 0x1a51e: 0x6c083820, 0x1a51f: 0x6ca02620, - 0x1a520: 0x6cd73620, 0x1a521: 0x6d0ef220, 0x1a522: 0x6cb68c20, 0x1a523: 0x6d25ca20, - 0x1a524: 0x6c0cca20, 0x1a526: 0x6d07f220, 0x1a527: 0x6c544220, - 0x1a528: 0x6c5a3020, 0x1a529: 0x6d10c220, 0x1a52a: 0x6c73a220, 0x1a52b: 0x6c7cb220, - 0x1a52c: 0x6c36de20, 0x1a52d: 0x6c60f620, 0x1a52e: 0x6ca19220, 0x1a52f: 0x6c1d2e20, - 0x1a530: 0x6c062220, 0x1a531: 0x6cf54e20, 0x1a532: 0x6d327a20, 0x1a533: 0x6d076620, - 0x1a534: 0x6cdee820, 0x1a535: 0x6c1c9620, 0x1a536: 0x6cf74a20, 0x1a537: 0x6c23d220, - 0x1a538: 0x6c968620, 0x1a539: 0x6c7a1020, 0x1a53a: 0x6d0f0820, 0x1a53b: 0x6c11c420, - 0x1a53d: 0x6c520e20, 0x1a53e: 0x6c2ac620, 0x1a53f: 0x6cc49e20, - // Block 0x695, offset 0x1a540 - 0x1a540: 0x6ce7a820, 0x1a541: 0x6d248c20, 0x1a542: 0x6cfe7020, 0x1a543: 0x6ca4d820, - 0x1a544: 0x6cd76420, 0x1a545: 0x6c3bb220, 0x1a546: 0x6cb47820, 0x1a547: 0x6c8dba20, - 0x1a548: 0x6c02ba20, 0x1a549: 0x6c58d020, 0x1a54a: 0x6d15a020, 0x1a54b: 0x6c58d220, - 0x1a54c: 0x6c9bc620, 0x1a54d: 0x6d1c4e20, 0x1a54e: 0x6c831820, 0x1a54f: 0x6d0f2e20, - 0x1a550: 0x6c062820, 0x1a551: 0x6c2f2c20, 0x1a552: 0x6c8e0620, 0x1a553: 0x6cd1f820, - 0x1a554: 0x6c689020, 0x1a555: 0x6c8b4420, 0x1a556: 0x6c6dee20, 0x1a557: 0x6c718c20, - 0x1a558: 0x6ce30a20, 0x1a559: 0x6cb0e620, 0x1a55a: 0x6c42a620, 0x1a55b: 0x6cff3420, - 0x1a55c: 0x6cec5e20, 0x1a55d: 0x6c1fd420, 0x1a55e: 0x6c2bc420, 0x1a55f: 0x6c588e20, - 0x1a560: 0x6d11d220, 0x1a561: 0x6c866e20, 0x1a562: 0x6c9c7020, 0x1a563: 0x6c550a20, - 0x1a564: 0x6cd11620, 0x1a565: 0x6c638a20, 0x1a566: 0x6d1aa620, 0x1a567: 0x6ceec620, - 0x1a569: 0x6cb18e20, 0x1a56a: 0x6c934420, 0x1a56b: 0x6c8dbc20, - 0x1a56c: 0x6d184420, 0x1a56d: 0x6c111620, 0x1a56e: 0x6ccd9820, 0x1a56f: 0x6c54fe20, - 0x1a570: 0x6cd53620, 0x1a571: 0x6cead420, 0x1a572: 0x6ca16e20, 0x1a573: 0x6c575820, - 0x1a574: 0x6ce61a20, 0x1a575: 0x6c0dfe20, 0x1a576: 0x6caee620, 0x1a577: 0x6c5d0820, - 0x1a578: 0x6c3dae20, 0x1a579: 0x6c4cdc20, 0x1a57a: 0x6c10d020, 0x1a57b: 0x6c849820, - 0x1a57c: 0x6c163e20, 0x1a57d: 0x6cb03420, 0x1a57e: 0x6c260020, 0x1a57f: 0x6c9bb220, - // Block 0x696, offset 0x1a580 - 0x1a580: 0x6cddc020, 0x1a581: 0x6cbb6020, 0x1a582: 0x6d34c420, 0x1a583: 0x6c7c2420, - 0x1a584: 0x6c08a820, 0x1a585: 0x6c029220, 0x1a586: 0x6c9bc820, 0x1a587: 0x6cfd0620, - 0x1a588: 0x6c7ab420, 0x1a589: 0x6ce7fc20, 0x1a58a: 0x6ce93c20, 0x1a58b: 0x6cf04a20, - 0x1a58c: 0x6cfaf820, 0x1a58e: 0x6ce94220, 0x1a58f: 0x6c81cc20, - 0x1a590: 0x6c162220, 0x1a591: 0x6ca6c420, 0x1a592: 0x6ca6d020, 0x1a593: 0x6c845220, - 0x1a594: 0x6c304620, 0x1a595: 0x6c72c620, 0x1a596: 0x6cba8620, 0x1a597: 0x6c0fc620, - 0x1a598: 0x6cccac20, 0x1a599: 0x6d2c0e20, 0x1a59a: 0x6ce25e20, 0x1a59b: 0x6cba8c20, - 0x1a59c: 0x6ca9ee20, 0x1a59d: 0x6d181620, 0x1a59e: 0x6c6e9e20, 0x1a59f: 0x6c41e820, - 0x1a5a0: 0x6c2ba020, 0x1a5a1: 0x6c65de20, 0x1a5a2: 0x6c9ab020, 0x1a5a3: 0x6c26c420, - 0x1a5a4: 0x6c660620, 0x1a5a5: 0x6d244a20, 0x1a5a6: 0x6d024c20, 0x1a5a7: 0x6d294820, - 0x1a5a8: 0x6c988020, 0x1a5a9: 0x6c849a20, 0x1a5aa: 0x6c4c0a20, 0x1a5ab: 0x6d09ca20, - 0x1a5ac: 0x6cdedc20, 0x1a5ad: 0x6d310e20, 0x1a5ae: 0x6d107620, 0x1a5af: 0x6ce98620, - 0x1a5b0: 0x6cce2e20, 0x1a5b1: 0x6cf93e20, 0x1a5b2: 0x6cbbcc20, 0x1a5b3: 0x6cf13620, - 0x1a5b4: 0x6d1d6220, 0x1a5b5: 0x6c1fa820, 0x1a5b6: 0x6cc1ec20, 0x1a5b7: 0x6cebfa20, - 0x1a5b9: 0x6d343220, 0x1a5ba: 0x6ce6e420, 0x1a5bb: 0x6c47f820, - 0x1a5bc: 0x6cce3020, 0x1a5bd: 0x6c10ec20, 0x1a5be: 0x6c3f1a20, 0x1a5bf: 0x6ce61e20, - // Block 0x697, offset 0x1a5c0 - 0x1a5c0: 0x6cded220, 0x1a5c1: 0x6cdeea20, 0x1a5c2: 0x6d3da620, 0x1a5c3: 0x6c4e4020, - 0x1a5c4: 0x6cb2da20, 0x1a5c5: 0x6c519a20, 0x1a5c6: 0x6d3c7420, 0x1a5c7: 0x6d396e20, - 0x1a5c8: 0x6c0fd220, 0x1a5c9: 0x6c8eec20, 0x1a5ca: 0x6caa8c20, 0x1a5cb: 0x6cf71220, - 0x1a5cc: 0x6cada220, 0x1a5cd: 0x6c2cb420, 0x1a5ce: 0x6c50ac20, 0x1a5cf: 0x6ce44620, - 0x1a5d0: 0x6cec8020, 0x1a5d1: 0x6ce44a20, 0x1a5d2: 0x6cb66a20, 0x1a5d3: 0x6c62a820, - 0x1a5d4: 0x6c1b6620, 0x1a5d5: 0x6c03cc20, 0x1a5d6: 0x6c6d7020, 0x1a5d7: 0x6c78e820, - 0x1a5d8: 0x6c873e20, 0x1a5d9: 0x6c72c820, 0x1a5da: 0x6cc25620, 0x1a5db: 0x6c7ec820, - 0x1a5dc: 0x6c47f020, 0x1a5dd: 0x6cb88620, 0x1a5de: 0x6cb6b420, 0x1a5df: 0x6cfd5020, - 0x1a5e0: 0x6c664220, 0x1a5e1: 0x6cd29a20, 0x1a5e2: 0x6c655420, 0x1a5e3: 0x6c005e20, - 0x1a5e4: 0x6c577220, 0x1a5e5: 0x6d2c1420, 0x1a5e6: 0x6d2b2e20, 0x1a5e7: 0x6d11e820, - 0x1a5e8: 0x6d2dd820, 0x1a5e9: 0x6c630420, 0x1a5ea: 0x6c145c20, 0x1a5eb: 0x6d0f3420, - 0x1a5ec: 0x6c654c20, 0x1a5ee: 0x6d0e1020, - 0x1a5f0: 0x6c68a820, 0x1a5f1: 0x6ce7a220, 0x1a5f2: 0x6ca41820, 0x1a5f3: 0x6d271a20, - 0x1a5f5: 0x6c1b6e20, - // Block 0x698, offset 0x1a600 - 0x1a600: 0x6d13b620, 0x1a601: 0x6c2f4020, 0x1a602: 0x6c779820, 0x1a603: 0x6cb4c620, - 0x1a604: 0x6cce4620, 0x1a605: 0x6cfa2420, 0x1a606: 0x6c4e4c20, 0x1a607: 0x6ced6820, - 0x1a608: 0x6d2f1820, 0x1a609: 0x6cc9f220, 0x1a60a: 0x6cce4820, 0x1a60b: 0x6cfa2620, - 0x1a60c: 0x6c5e6220, 0x1a60d: 0x6c105620, 0x1a60e: 0x6d221020, 0x1a60f: 0x6c9dfa20, - 0x1a610: 0x6c411e20, 0x1a611: 0x6c1e1820, 0x1a612: 0x6c1e1a20, 0x1a613: 0x6d3b6c20, - 0x1a614: 0x6cbc8e20, 0x1a615: 0x6caf2220, 0x1a616: 0x6cd2ea20, 0x1a617: 0x6cd2e820, - 0x1a618: 0x6cbf9420, 0x1a619: 0x6c0dba20, 0x1a61a: 0x6d12b820, 0x1a61b: 0x6c237e20, - 0x1a61c: 0x6c2fd620, 0x1a61d: 0x6cd7b820, 0x1a61e: 0x6c19b020, 0x1a61f: 0x6c2fca20, - 0x1a620: 0x6cbf9620, 0x1a621: 0x6c898020, 0x1a622: 0x6c2fcc20, 0x1a623: 0x6d1f9a20, - 0x1a624: 0x6c898220, 0x1a625: 0x6d0c5420, 0x1a626: 0x6c0e0820, 0x1a627: 0x6cca9c20, - 0x1a628: 0x6c4bb620, 0x1a629: 0x6c6f3620, 0x1a62a: 0x6c447a20, 0x1a62b: 0x6d0ac420, - 0x1a62c: 0x6cbb0220, 0x1a62d: 0x6d378220, 0x1a62e: 0x6c611020, 0x1a62f: 0x6c6ba220, - 0x1a630: 0x6c3c0c20, 0x1a631: 0x6c497420, 0x1a632: 0x6c202c20, 0x1a633: 0x6c159620, - 0x1a634: 0x6c8ba220, 0x1a635: 0x6d3d3620, 0x1a636: 0x6d3a5220, 0x1a637: 0x6c4d0420, - 0x1a638: 0x6cecb420, 0x1a639: 0x6c27b220, 0x1a63a: 0x6cf06a20, 0x1a63b: 0x6d3a5420, - 0x1a63c: 0x6c6e0020, 0x1a63d: 0x6c857420, 0x1a63e: 0x6c71aa20, 0x1a63f: 0x6cb1dc20, - // Block 0x699, offset 0x1a640 - 0x1a640: 0x6c3dc220, 0x1a641: 0x6d144620, 0x1a642: 0x6d163420, 0x1a643: 0x6ca38c20, - 0x1a644: 0x6cf55020, 0x1a645: 0x6c6f9c20, 0x1a646: 0x6c6f9e20, 0x1a647: 0x6cea9020, - 0x1a648: 0x6c99c220, 0x1a649: 0x6d163820, 0x1a64a: 0x6d13b820, 0x1a64b: 0x6d337c20, - 0x1a64c: 0x6cf33c20, 0x1a64d: 0x6d2ca620, 0x1a64e: 0x6c56f820, 0x1a64f: 0x6c37f420, - 0x1a650: 0x6c820820, 0x1a651: 0x6d1a1e20, 0x1a652: 0x6cb24620, 0x1a653: 0x6caccc20, - 0x1a654: 0x6cbbce20, 0x1a655: 0x6c560e20, 0x1a656: 0x6c48c220, 0x1a657: 0x6c19c420, - 0x1a658: 0x6c19d420, 0x1a659: 0x6d15aa20, 0x1a65a: 0x6d1abc20, 0x1a65b: 0x6d0bd820, - 0x1a65c: 0x6c9ebc20, 0x1a65d: 0x6c6f9a20, 0x1a65e: 0x6cb6c020, 0x1a65f: 0x6d129c20, - 0x1a660: 0x6cf76820, 0x1a661: 0x6cfd5e20, 0x1a662: 0x6c412020, 0x1a663: 0x6c6fa020, - 0x1a664: 0x6cfa2820, 0x1a665: 0x6c563020, 0x1a666: 0x6cd49620, 0x1a667: 0x6c315a20, - 0x1a668: 0x6cd2aa20, 0x1a669: 0x6c5e7020, 0x1a66a: 0x6ca45420, 0x1a66b: 0x6c631a20, - 0x1a66c: 0x6c71ec20, 0x1a66d: 0x6cd23220, 0x1a66e: 0x6c992220, 0x1a66f: 0x6c549020, - 0x1a670: 0x6c971020, 0x1a671: 0x6c949020, 0x1a672: 0x6d3dfe20, 0x1a673: 0x6cc7f820, - 0x1a674: 0x6d08f620, 0x1a675: 0x6d0d4220, 0x1a676: 0x6c3f3a20, 0x1a677: 0x6ccbcc20, - 0x1a678: 0x6ca2f020, 0x1a679: 0x6c418220, 0x1a67a: 0x6cdd5020, 0x1a67b: 0x6d20d020, - 0x1a67c: 0x6c258c20, 0x1a67d: 0x6d30d420, 0x1a67e: 0x6c419020, 0x1a67f: 0x6d35d220, - // Block 0x69a, offset 0x1a680 - 0x1a680: 0x6c4a5020, 0x1a681: 0x6c419820, 0x1a682: 0x6c949a20, 0x1a683: 0x6c8c2220, - 0x1a684: 0x6d17d820, 0x1a685: 0x6c73be20, 0x1a686: 0x6c823620, 0x1a687: 0x6c96ec20, - 0x1a688: 0x6d221220, 0x1a689: 0x6d328020, 0x1a68a: 0x6cd30620, 0x1a68b: 0x6cd31020, - 0x1a68c: 0x6c37b420, 0x1a68d: 0x6c1f0020, 0x1a68e: 0x6d20a220, 0x1a68f: 0x6c7c3020, - 0x1a690: 0x6d20a020, 0x1a691: 0x6d277420, 0x1a692: 0x6c563220, 0x1a693: 0x6cb56020, - 0x1a694: 0x6cf41420, 0x1a695: 0x6c6dfe20, 0x1a696: 0x6cd87220, 0x1a697: 0x6cdc1c20, - 0x1a698: 0x6c44a620, 0x1a699: 0x6c44a820, 0x1a69a: 0x6d0b6c20, 0x1a69b: 0x6d003620, - 0x1a69c: 0x6d0b7420, 0x1a69d: 0x6cb57820, 0x1a69e: 0x6d0b7c20, 0x1a69f: 0x6c5fd820, - 0x1a6a0: 0x6ce7e220, 0x1a6a1: 0x6cedd420, 0x1a6a2: 0x6c777420, 0x1a6a3: 0x6cde2a20, - 0x1a6a4: 0x6c682220, 0x1a6a5: 0x6c4d4e20, 0x1a6a6: 0x6d165220, 0x1a6a7: 0x6c158c20, - 0x1a6a8: 0x6c524420, 0x1a6a9: 0x6ca22220, 0x1a6aa: 0x6d13b220, 0x1a6ab: 0x6cfdd820, - 0x1a6ac: 0x6c6d8e20, 0x1a6ad: 0x6ce66220, 0x1a6ae: 0x6c89aa20, 0x1a6af: 0x6cfdda20, - 0x1a6b0: 0x6c6d9620, 0x1a6b1: 0x6d12d420, 0x1a6b2: 0x6cbd1c20, 0x1a6b3: 0x6c0ece20, - 0x1a6b4: 0x6d204420, 0x1a6b5: 0x6d01a020, 0x1a6b6: 0x6c283820, 0x1a6b7: 0x6c880820, - 0x1a6b8: 0x6c34b420, 0x1a6b9: 0x6c9ae020, 0x1a6ba: 0x6cc55a20, 0x1a6bb: 0x6cc55c20, - 0x1a6bc: 0x6c5fb620, 0x1a6bd: 0x6c630a20, 0x1a6be: 0x6cedd620, 0x1a6bf: 0x6d163a20, - // Block 0x69b, offset 0x1a6c0 - 0x1a6c0: 0x6cd03620, 0x1a6c1: 0x6cc55e20, 0x1a6c2: 0x6c820220, 0x1a6c3: 0x6c2f4220, - 0x1a6c4: 0x6d2b3220, 0x1a6c5: 0x6c6c7e20, 0x1a6c6: 0x6cb3fa20, 0x1a6c7: 0x6c1d8c20, - 0x1a6c8: 0x6c030c20, 0x1a6c9: 0x6d2ef620, 0x1a6ca: 0x6c6c1c20, 0x1a6cb: 0x6c6ba420, - 0x1a6cc: 0x6c0da020, 0x1a6cd: 0x6cc61220, 0x1a6ce: 0x6c237c20, 0x1a6cf: 0x6c3d0820, - 0x1a6d0: 0x6cca1220, 0x1a6d1: 0x6c94d420, 0x1a6d2: 0x6c0da220, 0x1a6d3: 0x6c121c20, - 0x1a6d4: 0x6d3ed620, 0x1a6d5: 0x6cd2ee20, 0x1a6d6: 0x6cddda20, 0x1a6d7: 0x6d2f1a20, - 0x1a6d8: 0x6c3fa420, 0x1a6d9: 0x6cfd5620, 0x1a6da: 0x6cfa6a20, 0x1a6db: 0x6cea9220, - 0x1a6dc: 0x6c52e820, 0x1a6dd: 0x6ce70a20, 0x1a6de: 0x6cc5a620, 0x1a6df: 0x6cb88e20, - 0x1a6e0: 0x6c41c220, 0x1a6e1: 0x6c436220, 0x1a6e2: 0x6c0ea620, 0x1a6e3: 0x6c272220, - 0x1a6e4: 0x6c8e1820, 0x1a6e5: 0x6d15ae20, 0x1a6e6: 0x6c17b020, 0x1a6e7: 0x6c169020, - 0x1a6e8: 0x6cc93e20, 0x1a6e9: 0x6cce5a20, 0x1a6ea: 0x6d144a20, 0x1a6eb: 0x6ca25e20, - 0x1a6ec: 0x6c9b0220, 0x1a6ed: 0x6cc5a820, 0x1a6ee: 0x6c63fe20, 0x1a6ef: 0x6c17b220, - 0x1a6f0: 0x6d0ffc20, 0x1a6f1: 0x6cb96820, 0x1a6f2: 0x6d380e20, 0x1a6f3: 0x6cb04620, - 0x1a6f4: 0x6cf2cc20, 0x1a6f5: 0x6cf41820, 0x1a6f6: 0x6c665020, 0x1a6f7: 0x6c643620, - 0x1a6f8: 0x6d117e20, 0x1a6f9: 0x6c3c1220, 0x1a6fa: 0x6c121e20, 0x1a6fb: 0x6cc5ac20, - 0x1a6fc: 0x6ceddc20, 0x1a6fd: 0x6c3bc420, 0x1a6fe: 0x6c2b0c20, 0x1a6ff: 0x6c39b620, - // Block 0x69c, offset 0x1a700 - 0x1a700: 0x6d378420, 0x1a701: 0x6cb6c820, 0x1a702: 0x6cadf820, 0x1a703: 0x6d20a620, - 0x1a704: 0x6c2e0620, 0x1a705: 0x6c33d220, 0x1a706: 0x6cf49c20, 0x1a707: 0x6d165620, - 0x1a708: 0x6d030a20, 0x1a709: 0x6c777620, 0x1a70a: 0x6d13bc20, 0x1a70b: 0x6c5fbc20, - 0x1a70c: 0x6c008620, 0x1a70d: 0x6cf55420, 0x1a70e: 0x6c617220, 0x1a70f: 0x6c3dca20, - 0x1a710: 0x6c37f620, 0x1a711: 0x6d04b220, 0x1a712: 0x6c6ccc20, 0x1a713: 0x6caf2420, - 0x1a714: 0x6c281820, 0x1a715: 0x6c3d3420, 0x1a716: 0x6ce16c20, 0x1a717: 0x6d381020, - 0x1a718: 0x6d1e8820, 0x1a719: 0x6c5d8620, 0x1a71a: 0x6c5b8a20, 0x1a71b: 0x6d221420, - 0x1a71c: 0x6c251620, 0x1a71d: 0x6c1fee20, 0x1a71e: 0x6cca1420, 0x1a71f: 0x6cef8220, - 0x1a720: 0x6c1ff020, 0x1a721: 0x6c17cc20, 0x1a722: 0x6d0b0a20, 0x1a723: 0x6cfc7020, - 0x1a724: 0x6ccdfe20, 0x1a725: 0x6c165e20, 0x1a726: 0x6c94d620, 0x1a727: 0x6c122020, - 0x1a728: 0x6d0a6420, 0x1a729: 0x6d031220, 0x1a72a: 0x6cef8420, 0x1a72b: 0x6d3a9a20, - 0x1a72c: 0x6d2b5820, 0x1a72d: 0x6cfb2220, 0x1a72e: 0x6caa4820, 0x1a72f: 0x6c0eaa20, - 0x1a730: 0x6c46e620, 0x1a731: 0x6ca62020, 0x1a732: 0x6ca67a20, 0x1a733: 0x6d015420, - 0x1a734: 0x6c04de20, 0x1a735: 0x6d066a20, 0x1a736: 0x6c8e2c20, 0x1a737: 0x6d38f820, - 0x1a738: 0x6ccfa020, 0x1a739: 0x6cc0ca20, 0x1a73a: 0x6c22ac20, 0x1a73b: 0x6c07ce20, - 0x1a73c: 0x6cd2f620, 0x1a73d: 0x6c631e20, 0x1a73e: 0x6caf2620, 0x1a73f: 0x6d167220, - // Block 0x69d, offset 0x1a740 - 0x1a740: 0x6cd87c20, 0x1a741: 0x6d15b620, 0x1a742: 0x6d328220, 0x1a743: 0x6c2d3420, - 0x1a744: 0x6c4d9020, 0x1a745: 0x6c972220, 0x1a746: 0x6c286220, 0x1a747: 0x6d3a9c20, - 0x1a748: 0x6c105a20, 0x1a749: 0x6cc0cc20, 0x1a74a: 0x6c08b420, 0x1a74b: 0x6d2f5020, - 0x1a74c: 0x6c228c20, 0x1a74d: 0x6cf06e20, 0x1a74e: 0x6c2b0e20, 0x1a74f: 0x6d3a9e20, - 0x1a750: 0x6d426220, 0x1a751: 0x6d200e20, 0x1a752: 0x6d0ffe20, 0x1a753: 0x6ce3ba20, - 0x1a754: 0x6d2e4820, 0x1a755: 0x6c50b820, 0x1a756: 0x6c091020, 0x1a757: 0x6ceae420, - 0x1a758: 0x6ccf0820, 0x1a759: 0x6d20ac20, 0x1a75a: 0x6d167420, 0x1a75b: 0x6c3dd020, - 0x1a75c: 0x6d427420, 0x1a75d: 0x6c463420, 0x1a75e: 0x6ca95020, 0x1a75f: 0x6ce70e20, - 0x1a760: 0x6ca62220, 0x1a761: 0x6cfa7620, 0x1a762: 0x6cc17220, 0x1a763: 0x6d1d7c20, - 0x1a764: 0x6cec0e20, 0x1a765: 0x6cb8a220, 0x1a766: 0x6cd40a20, 0x1a767: 0x6c761a20, - 0x1a768: 0x6c068820, 0x1a769: 0x6cae0420, 0x1a76a: 0x6c5b1a20, 0x1a76b: 0x6c51b620, - 0x1a76c: 0x6c819c20, 0x1a76d: 0x6cfdac20, 0x1a76e: 0x6c43c420, 0x1a76f: 0x6d0f8420, - 0x1a770: 0x6c041820, 0x1a771: 0x6c382c20, 0x1a772: 0x6ca02a20, 0x1a773: 0x6c632420, - 0x1a774: 0x6c37bc20, 0x1a775: 0x6c0e0a20, 0x1a776: 0x6c5fda20, 0x1a777: 0x6c523820, - 0x1a778: 0x6c5d6c20, 0x1a779: 0x6c4ac420, 0x1a77a: 0x6cc2b620, 0x1a77b: 0x6ce54820, - 0x1a77c: 0x6c68c820, 0x1a77d: 0x6c22b020, 0x1a77e: 0x6d16a220, 0x1a77f: 0x6cd2b220, - // Block 0x69e, offset 0x1a780 - 0x1a780: 0x6d03c620, 0x1a781: 0x6ccfa620, 0x1a782: 0x6ceaa620, 0x1a783: 0x6c76c020, - 0x1a784: 0x6d343a20, 0x1a785: 0x6c40dc20, 0x1a786: 0x6c7ee220, 0x1a787: 0x6d146c20, - 0x1a788: 0x6c1b7a20, 0x1a789: 0x6c7ad220, 0x1a78a: 0x6c49d420, 0x1a78b: 0x6c858620, - 0x1a78c: 0x6d19a820, 0x1a78d: 0x6cd31220, 0x1a78e: 0x6c9cda20, 0x1a78f: 0x6d398220, - 0x1a790: 0x6d067a20, 0x1a791: 0x6d201420, 0x1a792: 0x6c011820, 0x1a793: 0x6c921620, - 0x1a794: 0x6ca1c020, 0x1a795: 0x6c373420, 0x1a796: 0x6c94de20, 0x1a797: 0x6c305220, - 0x1a798: 0x6c143020, 0x1a799: 0x6c1a9420, 0x1a79a: 0x6d0a6a20, 0x1a79b: 0x6c456220, - 0x1a79c: 0x6d385620, 0x1a79d: 0x6d13ca20, 0x1a79e: 0x6cc78c20, 0x1a79f: 0x6c25a220, - 0x1a7a0: 0x6cf98820, 0x1a7a1: 0x6cd88620, 0x1a7a2: 0x6d292c20, 0x1a7a3: 0x6c937820, - 0x1a7a4: 0x6cdefc20, 0x1a7a5: 0x6c68ca20, 0x1a7a6: 0x6d312220, 0x1a7a7: 0x6c12ca20, - 0x1a7a8: 0x6cbbd020, 0x1a7a9: 0x6c7b1220, 0x1a7aa: 0x6c147020, 0x1a7ab: 0x6ca95220, - 0x1a7ac: 0x6ca9b020, 0x1a7ad: 0x6c6c8420, 0x1a7ae: 0x6cf43220, 0x1a7af: 0x6c53ec20, - 0x1a7b0: 0x6c6efe20, 0x1a7b1: 0x6c1a6420, 0x1a7b2: 0x6d321e20, 0x1a7b3: 0x6d428220, - 0x1a7b4: 0x6c1e2620, 0x1a7b5: 0x6cbd1e20, 0x1a7b6: 0x6c937a20, 0x1a7b7: 0x6c70f820, - 0x1a7b8: 0x6cd5a420, 0x1a7b9: 0x6ce6b420, 0x1a7ba: 0x6cd09220, 0x1a7bb: 0x6ce9f420, - 0x1a7bc: 0x6c0ec020, 0x1a7bd: 0x6ca3e820, 0x1a7be: 0x6cfe8820, 0x1a7bf: 0x6c0b8220, - // Block 0x69f, offset 0x1a7c0 - 0x1a7c0: 0x6ce9de20, 0x1a7c1: 0x6d222420, 0x1a7c2: 0x6cf85220, 0x1a7c3: 0x6c242e20, - 0x1a7c4: 0x6c354e20, 0x1a7c5: 0x6cc01020, 0x1a7c6: 0x6d061620, 0x1a7c7: 0x6c4a1820, - 0x1a7c8: 0x6c7a8420, 0x1a7c9: 0x6cf43420, 0x1a7ca: 0x6c759620, 0x1a7cb: 0x6d16da20, - 0x1a7cc: 0x6c3f4620, 0x1a7cd: 0x6c894820, 0x1a7ce: 0x6d410e20, 0x1a7cf: 0x6cbc3020, - 0x1a7d0: 0x6c859a20, 0x1a7d1: 0x6d1e1620, 0x1a7d2: 0x6c5d1c20, 0x1a7d3: 0x6c6e5220, - 0x1a7d4: 0x6cba4220, 0x1a7d5: 0x6cca4820, 0x1a7d6: 0x6cadf420, 0x1a7d7: 0x6cda7220, - 0x1a7d8: 0x6c3e0620, 0x1a7d9: 0x6cf59820, 0x1a7da: 0x6c850020, 0x1a7db: 0x6c3f4820, - 0x1a7dc: 0x6cb24a20, 0x1a7dd: 0x6c05ea20, 0x1a7de: 0x6d20d220, 0x1a7df: 0x6cb59020, - 0x1a7e0: 0x6cf99020, 0x1a7e1: 0x6d032220, 0x1a7e2: 0x6d04b620, 0x1a7e3: 0x6d222620, - 0x1a7e4: 0x6c2c2420, 0x1a7e5: 0x6c17d020, 0x1a7e6: 0x6c1d9220, 0x1a7e7: 0x6d377c20, - 0x1a7e8: 0x6d0d4e20, 0x1a7e9: 0x6c87e820, 0x1a7ea: 0x6c859c20, 0x1a7eb: 0x6c7ee420, - 0x1a7ec: 0x6cd8fc20, 0x1a7ed: 0x6c656a20, 0x1a7ee: 0x6d04b820, 0x1a7ef: 0x6c3f5220, - 0x1a7f0: 0x6c5daa20, 0x1a7f1: 0x6c721e20, 0x1a7f2: 0x6cffd820, 0x1a7f3: 0x6cabf620, - 0x1a7f4: 0x6c666420, 0x1a7f5: 0x6c0c8c20, 0x1a7f6: 0x6c1f2020, 0x1a7f7: 0x6c3a9420, - 0x1a7f8: 0x6c3cde20, 0x1a7f9: 0x6d0b8a20, 0x1a7fa: 0x6c017a20, 0x1a7fb: 0x6c06f820, - 0x1a7fc: 0x6d22ea20, 0x1a7fd: 0x6d02bc20, 0x1a7fe: 0x6c08ce20, 0x1a7ff: 0x6c561620, - // Block 0x6a0, offset 0x1a800 - 0x1a800: 0x6c166220, 0x1a801: 0x6d33be20, 0x1a802: 0x6c0e1020, 0x1a803: 0x6c6fe420, - 0x1a804: 0x6d10de20, 0x1a805: 0x6c252020, 0x1a806: 0x6c87ea20, 0x1a807: 0x6cecf420, - 0x1a808: 0x6c7ee620, 0x1a809: 0x6c122820, 0x1a80a: 0x6d401c20, 0x1a80b: 0x6c448220, - 0x1a80c: 0x6c490a20, 0x1a80d: 0x6c06fa20, 0x1a80e: 0x6ce4dc20, 0x1a80f: 0x6cd4b420, - 0x1a810: 0x6cd4b620, 0x1a811: 0x6c9b0420, 0x1a812: 0x6c2a0620, 0x1a813: 0x6cdfd420, - 0x1a814: 0x6c740e20, 0x1a815: 0x6c20c220, 0x1a816: 0x6d041e20, 0x1a817: 0x6cae9420, - 0x1a818: 0x6ce17020, 0x1a819: 0x6c548e20, 0x1a81a: 0x6d15da20, 0x1a81b: 0x6cb4d620, - 0x1a81c: 0x6ce3de20, 0x1a81d: 0x6c421420, 0x1a81e: 0x6c6e5e20, 0x1a81f: 0x6c6bd620, - 0x1a820: 0x6cdbb220, 0x1a821: 0x6c170a20, 0x1a822: 0x6c6a9e20, 0x1a823: 0x6c39ce20, - 0x1a824: 0x6d344420, 0x1a825: 0x6c796c20, 0x1a826: 0x6c734220, 0x1a827: 0x6d3f7420, - 0x1a828: 0x6c722020, 0x1a829: 0x6cba4620, 0x1a82a: 0x6ca5c820, 0x1a82b: 0x6c94e420, - 0x1a82c: 0x6d3cf420, 0x1a82d: 0x6cf27e20, 0x1a82e: 0x6c95a820, 0x1a82f: 0x6cd91020, - 0x1a830: 0x6c839220, 0x1a831: 0x6c5d1e20, 0x1a832: 0x6c2fea20, 0x1a833: 0x6d3f3620, - 0x1a834: 0x6c07aa20, 0x1a835: 0x6cf43820, 0x1a836: 0x6c722220, 0x1a837: 0x6ca39e20, - 0x1a838: 0x6c112020, 0x1a839: 0x6c657820, 0x1a83a: 0x6d2d3820, 0x1a83b: 0x6d125a20, - 0x1a83c: 0x6d344620, 0x1a83d: 0x6ccc4020, 0x1a83e: 0x6cbe3820, 0x1a83f: 0x6cbd1220, - // Block 0x6a1, offset 0x1a840 - 0x1a840: 0x6d1ba420, 0x1a841: 0x6c196620, 0x1a842: 0x6c648020, 0x1a843: 0x6d0d6220, - 0x1a844: 0x6cc85c20, 0x1a845: 0x6d382420, 0x1a846: 0x6c217620, 0x1a847: 0x6c641220, - 0x1a848: 0x6c61da20, 0x1a849: 0x6cefa820, 0x1a84a: 0x6d224220, 0x1a84b: 0x6c0e1820, - 0x1a84c: 0x6cc91620, 0x1a84d: 0x6ce31a20, 0x1a84e: 0x6cee7020, 0x1a84f: 0x6cb0ee20, - 0x1a850: 0x6d0e5a20, 0x1a851: 0x6c3c3a20, 0x1a852: 0x6ce17220, 0x1a853: 0x6cf2e020, - 0x1a854: 0x6c360620, 0x1a855: 0x6d009a20, 0x1a856: 0x6c17e820, 0x1a857: 0x6cd13020, - 0x1a858: 0x6c76ca20, 0x1a859: 0x6c2c3820, 0x1a85a: 0x6d429620, 0x1a85b: 0x6c138e20, - 0x1a85c: 0x6ce66c20, 0x1a85d: 0x6c070620, 0x1a85e: 0x6d018820, 0x1a85f: 0x6c59b020, - 0x1a860: 0x6d11a820, 0x1a861: 0x6d2e5420, 0x1a862: 0x6c1e2a20, 0x1a863: 0x6d0bec20, - 0x1a864: 0x6d1f2820, 0x1a865: 0x6c666820, 0x1a866: 0x6d063a20, 0x1a867: 0x6d2bd220, - 0x1a868: 0x6c220220, 0x1a869: 0x6c3fdc20, 0x1a86a: 0x6c087020, 0x1a86b: 0x6d35d420, - 0x1a86c: 0x6d3fea20, 0x1a86d: 0x6c9e1620, 0x1a86e: 0x6c601020, 0x1a86f: 0x6d15e420, - 0x1a870: 0x6d018a20, 0x1a871: 0x6d0a0420, 0x1a872: 0x6c10f420, 0x1a873: 0x6c329420, - 0x1a874: 0x6c12da20, 0x1a875: 0x6d314c20, 0x1a876: 0x6cab7c20, 0x1a877: 0x6ce7d420, - 0x1a878: 0x6ce7d620, 0x1a879: 0x6c070820, 0x1a87a: 0x6d28b220, 0x1a87b: 0x6c908420, - 0x1a87c: 0x6c6aac20, 0x1a87d: 0x6cefaa20, 0x1a87e: 0x6c3bd620, 0x1a87f: 0x6c16a020, - // Block 0x6a2, offset 0x1a880 - 0x1a880: 0x6c4a5220, 0x1a881: 0x6cda1420, 0x1a882: 0x6d361420, 0x1a883: 0x6cdab020, - 0x1a884: 0x6cf96620, 0x1a885: 0x6c40b020, 0x1a886: 0x6d261420, 0x1a887: 0x6cc70420, - 0x1a888: 0x6c860420, 0x1a889: 0x6caa6420, 0x1a88a: 0x6d282c20, 0x1a88b: 0x6c67a620, - 0x1a88c: 0x6c96bc20, 0x1a88d: 0x6c056e20, 0x1a88e: 0x6c2cc820, 0x1a88f: 0x6ce0ee20, - 0x1a890: 0x6c503c20, 0x1a891: 0x6c6ac220, 0x1a892: 0x6cf60820, 0x1a893: 0x6ccd8820, - 0x1a894: 0x6cba5020, 0x1a895: 0x6c744020, 0x1a896: 0x6c122c20, 0x1a897: 0x6c1f3c20, - 0x1a898: 0x6cca1820, 0x1a899: 0x6c071c20, 0x1a89a: 0x6cffe820, 0x1a89b: 0x6d1e3420, - 0x1a89c: 0x6d10f220, 0x1a89d: 0x6ce09620, 0x1a89e: 0x6cdd1420, 0x1a89f: 0x6d101c20, - 0x1a8a0: 0x6c37ea20, 0x1a8a1: 0x6c0e1c20, 0x1a8a2: 0x6c635a20, 0x1a8a3: 0x6c271820, - 0x1a8a4: 0x6d293620, 0x1a8a5: 0x6ce17620, 0x1a8a6: 0x6c483820, 0x1a8a7: 0x6c0d3420, - 0x1a8a8: 0x6c1ede20, 0x1a8a9: 0x6caabc20, 0x1a8aa: 0x6c116c20, 0x1a8ab: 0x6c82c820, - 0x1a8ac: 0x6c24ca20, 0x1a8ad: 0x6d1d8820, 0x1a8ae: 0x6d2a1420, 0x1a8af: 0x6d3ff620, - 0x1a8b0: 0x6c07f420, 0x1a8b1: 0x6cd95e20, 0x1a8b2: 0x6c02ce20, 0x1a8b3: 0x6c1ffe20, - 0x1a8b4: 0x6d226620, 0x1a8b5: 0x6d2d4220, 0x1a8b6: 0x6d40c220, 0x1a8b7: 0x6cce0620, - 0x1a8b8: 0x6c208e20, 0x1a8b9: 0x6c6e8c20, 0x1a8ba: 0x6c1c2c20, 0x1a8bb: 0x6ccc3220, - 0x1a8bc: 0x6c4ecc20, 0x1a8bd: 0x6d2eb820, 0x1a8be: 0x6cbe4c20, 0x1a8bf: 0x6d0e8020, - // Block 0x6a3, offset 0x1a8c0 - 0x1a8c0: 0x6c2c6620, 0x1a8c1: 0x6d01bc20, 0x1a8c2: 0x6c909220, 0x1a8c3: 0x6c072020, - 0x1a8c4: 0x6cb1b020, 0x1a8c5: 0x6c6c9420, 0x1a8c6: 0x6c88f020, 0x1a8c7: 0x6c926020, - 0x1a8c8: 0x6c976620, 0x1a8c9: 0x6cb8ea20, 0x1a8ca: 0x6cfaba20, 0x1a8cb: 0x6ce09c20, - 0x1a8cc: 0x6d1c7a20, 0x1a8cd: 0x6c307e20, 0x1a8ce: 0x6d3bd220, 0x1a8cf: 0x6cfe3c20, - 0x1a8d0: 0x6ccd9220, 0x1a8d1: 0x6cbbe220, 0x1a8d2: 0x6c6f2220, 0x1a8d3: 0x6ce9e820, - 0x1a8d4: 0x6d420620, 0x1a8d5: 0x6cb44220, 0x1a8d6: 0x6cf66020, 0x1a8d7: 0x6c815e20, - 0x1a8d8: 0x6c16f020, 0x1a8d9: 0x6c49ec20, 0x1a8da: 0x6c89ec20, 0x1a8db: 0x6cb50420, - 0x1a8dc: 0x6c197820, 0x1a8dd: 0x6c150820, 0x1a8de: 0x6cefee20, 0x1a8df: 0x6c5efe20, - 0x1a8e0: 0x6c0e8220, 0x1a8e1: 0x6c5bf020, 0x1a8e2: 0x6c202420, 0x1a8e3: 0x6ce5fc20, - 0x1a8e4: 0x6c289a20, 0x1a8e5: 0x6c691220, 0x1a8e6: 0x6c700a20, 0x1a8e7: 0x6ccbb820, - 0x1a8e8: 0x6c3be020, 0x1a8e9: 0x6cfce620, 0x1a8ea: 0x6c713c20, 0x1a8eb: 0x6c366c20, - 0x1a8ec: 0x6c685820, 0x1a8ed: 0x6c66a420, 0x1a8ee: 0x6ce76420, 0x1a8ef: 0x6c8c5620, - 0x1a8f0: 0x6c0f2420, 0x1a8f1: 0x6c482220, 0x1a8f2: 0x6cfd5820, 0x1a8f3: 0x6cdade20, - 0x1a8f4: 0x6cfce820, 0x1a8f5: 0x6c676e20, 0x1a8f6: 0x6c9fc020, 0x1a8f7: 0x6d130e20, - 0x1a8f8: 0x6c6d3220, 0x1a8f9: 0x6c644e20, 0x1a8fa: 0x6cbc5220, 0x1a8fb: 0x6cb0b420, - 0x1a8fc: 0x6c3c6020, 0x1a8fd: 0x6d394220, 0x1a8fe: 0x6c00c020, 0x1a8ff: 0x6cc9e820, - // Block 0x6a4, offset 0x1a900 - 0x1a900: 0x6d154220, 0x1a901: 0x6c75d220, 0x1a902: 0x6ca9be20, 0x1a903: 0x6c151620, - 0x1a904: 0x6d184620, 0x1a905: 0x6c297c20, 0x1a906: 0x6c6e2420, 0x1a907: 0x6d07b620, - 0x1a908: 0x6c7b3020, 0x1a909: 0x6c65c820, 0x1a90a: 0x6c1f6820, 0x1a90b: 0x6c27f420, - 0x1a90c: 0x6c692020, 0x1a90d: 0x6ccc3420, 0x1a90e: 0x6d294020, 0x1a90f: 0x6c121820, - 0x1a910: 0x6c0d5020, 0x1a911: 0x6c017220, 0x1a912: 0x6cc7c420, 0x1a913: 0x6cdf3c20, - 0x1a914: 0x6c1dd820, 0x1a915: 0x6c148a20, 0x1a916: 0x6c7fb220, 0x1a917: 0x6ca64620, - 0x1a918: 0x6c6cb420, 0x1a919: 0x6cba7020, 0x1a91a: 0x6c9b3420, 0x1a91b: 0x6cf47620, - 0x1a91c: 0x6ca91820, 0x1a91d: 0x6cbf5a20, 0x1a91e: 0x6ca64820, 0x1a91f: 0x6c16c820, - 0x1a920: 0x6c8b2e20, 0x1a921: 0x6c82dc20, 0x1a922: 0x6c93b820, 0x1a923: 0x6c7bd020, - 0x1a924: 0x6c066c20, 0x1a925: 0x6d240420, 0x1a926: 0x6c0c2a20, 0x1a927: 0x6d297820, - 0x1a928: 0x6d349e20, 0x1a929: 0x6cd8f220, 0x1a92a: 0x6d1eb420, 0x1a92b: 0x6c4fe820, - 0x1a92c: 0x6c193220, 0x1a92d: 0x6c193620, 0x1a92e: 0x6c86bc20, 0x1a92f: 0x6ce2be20, - 0x1a930: 0x6cf02420, 0x1a931: 0x6c903a20, 0x1a932: 0x6c1eee20, 0x1a933: 0x6c154020, - 0x1a934: 0x6cc4e020, 0x1a935: 0x6cd51220, 0x1a936: 0x6c5c8820, 0x1a937: 0x6c874220, - 0x1a938: 0x6c956820, 0x1a939: 0x6d298020, 0x1a93a: 0x6caace20, 0x1a93b: 0x6ce18820, - 0x1a93c: 0x6d0e1220, 0x1a93d: 0x6c829420, 0x1a93e: 0x6ca47c20, 0x1a93f: 0x6c372e20, - // Block 0x6a5, offset 0x1a940 - 0x1a940: 0x6cf49020, 0x1a941: 0x6d27d220, 0x1a942: 0x6d294a20, 0x1a943: 0x6d252e20, - 0x1a944: 0x6d044a20, 0x1a945: 0x6c1ca820, 0x1a946: 0x6d2f9620, 0x1a947: 0x6d044e20, - 0x1a948: 0x6cfa6e20, 0x1a949: 0x6c49d020, 0x1a94a: 0x6c332e20, 0x1a94b: 0x6c787820, - 0x1a94c: 0x6c333020, 0x1a94d: 0x6c9dfe20, 0x1a94e: 0x6ce91c20, 0x1a94f: 0x6c169420, - 0x1a950: 0x6c373220, 0x1a951: 0x6c333220, 0x1a952: 0x6c373620, 0x1a953: 0x6c6c2c20, - 0x1a954: 0x6ce92020, 0x1a955: 0x6cd87e20, 0x1a956: 0x6d0d4420, 0x1a957: 0x6d0d5020, - 0x1a958: 0x6cd2bc20, 0x1a95a: 0x6c292a20, 0x1a95b: 0x6cb8c220, - 0x1a95c: 0x6c30a820, 0x1a95d: 0x6c3b2820, 0x1a95e: 0x6c98d620, 0x1a95f: 0x6ccfe220, - 0x1a960: 0x6c30aa20, 0x1a962: 0x6c6dc620, 0x1a963: 0x6c852e20, - 0x1a964: 0x6c5a2a20, 0x1a965: 0x6cc80e20, 0x1a966: 0x6cedd820, 0x1a967: 0x6ca57e20, - 0x1a968: 0x6cc2b220, 0x1a969: 0x6c898820, 0x1a96a: 0x6d20d420, 0x1a96b: 0x6c030a20, - 0x1a96c: 0x6c454e20, 0x1a96d: 0x6c8f2420, 0x1a96e: 0x6cf55c20, 0x1a96f: 0x6c4f4220, - 0x1a970: 0x6c7f8620, 0x1a971: 0x6c460a20, 0x1a972: 0x6ce45620, 0x1a973: 0x6c490020, - 0x1a974: 0x6d041020, 0x1a975: 0x6c0daa20, 0x1a976: 0x6cb57a20, 0x1a977: 0x6c720620, - 0x1a978: 0x6c2d0620, 0x1a979: 0x6d3e0820, 0x1a97a: 0x6c3b2020, 0x1a97b: 0x6d100620, - 0x1a97c: 0x6c647a20, 0x1a97d: 0x6cd45820, 0x1a97e: 0x6c621420, 0x1a97f: 0x6d17da20, - // Block 0x6a6, offset 0x1a980 - 0x1a980: 0x6c627020, 0x1a981: 0x6c15ec20, 0x1a982: 0x6c6ed020, 0x1a983: 0x6c993e20, - 0x1a984: 0x6cc4a620, 0x1a985: 0x6ca58020, 0x1a986: 0x6d253020, 0x1a987: 0x6c991c20, - 0x1a988: 0x6c424c20, 0x1a989: 0x6cc4a820, 0x1a98a: 0x6c12c620, 0x1a98b: 0x6c6ed220, - 0x1a98c: 0x6c12c820, 0x1a98d: 0x6d292620, 0x1a98e: 0x6c488820, 0x1a98f: 0x6c6ef020, - 0x1a990: 0x6c994820, 0x1a991: 0x6d390820, 0x1a992: 0x6c994e20, 0x1a993: 0x6c46a020, - 0x1a994: 0x6d063220, 0x1a995: 0x6c9e1820, 0x1a996: 0x6c9d1620, 0x1a997: 0x6cc6ec20, - 0x1a998: 0x6d1a1a20, 0x1a999: 0x6d013e20, 0x1a99a: 0x6c76bc20, 0x1a99b: 0x6c755020, - 0x1a99c: 0x6ca9ae20, 0x1a99d: 0x6d145a20, 0x1a99e: 0x6c9c3420, 0x1a99f: 0x6cd32820, - 0x1a9a0: 0x6c490620, 0x1a9a1: 0x6c9b0e20, 0x1a9a2: 0x6d37ec20, 0x1a9a3: 0x6c722620, - 0x1a9a4: 0x6d24d020, 0x1a9a5: 0x6c9ff220, 0x1a9a6: 0x6c79de20, 0x1a9a7: 0x6c8ba420, - 0x1a9a8: 0x6c3fe020, 0x1a9a9: 0x6d014420, 0x1a9aa: 0x6c9d7620, 0x1a9ab: 0x6c0d9e20, - 0x1a9ac: 0x6c2fd820, 0x1a9ad: 0x6cdf0c20, 0x1a9ae: 0x6c425020, 0x1a9af: 0x6c3c9a20, - 0x1a9b0: 0x6c0da620, 0x1a9b1: 0x6c564620, 0x1a9b2: 0x6c1caa20, 0x1a9b3: 0x6c73cc20, - 0x1a9b4: 0x6c564820, 0x1a9b5: 0x6c7bdc20, 0x1a9b6: 0x6d12a220, 0x1a9b7: 0x6c839020, - 0x1a9b8: 0x6cac9a20, 0x1a9b9: 0x6c3dd220, 0x1a9ba: 0x6c9f8c20, 0x1a9bb: 0x6c305020, - 0x1a9bc: 0x6cfbe620, 0x1a9bd: 0x6c8ac620, 0x1a9be: 0x6cb84020, 0x1a9bf: 0x6c646820, - // Block 0x6a7, offset 0x1a9c0 - 0x1a9c0: 0x6c6e4a20, 0x1a9c1: 0x6cd5a620, 0x1a9c2: 0x6c9a4c20, 0x1a9c3: 0x6ce88a20, - 0x1a9c4: 0x6cb4d820, 0x1a9c5: 0x6c480220, 0x1a9c6: 0x6d3cda20, 0x1a9c7: 0x6cd91220, - 0x1a9c8: 0x6c6e6020, 0x1a9c9: 0x6c894a20, 0x1a9ca: 0x6cbec420, 0x1a9cb: 0x6c2db820, - 0x1a9cc: 0x6c8cc420, 0x1a9cd: 0x6c306c20, 0x1a9ce: 0x6c421620, 0x1a9cf: 0x6c658220, - 0x1a9d0: 0x6d19c620, 0x1a9d1: 0x6c23ea20, 0x1a9d2: 0x6d14f220, 0x1a9d3: 0x6c860620, - 0x1a9d4: 0x6c20a820, 0x1a9d5: 0x6ca03420, 0x1a9d6: 0x6d3ce820, 0x1a9d7: 0x6c24cc20, - 0x1a9d8: 0x6cd7fe20, 0x1a9d9: 0x6c345c20, 0x1a9da: 0x6c6d3420, 0x1a9db: 0x6c8c2620, - 0x1a9dc: 0x6c8c2820, 0x1a9dd: 0x6ca91a20, 0x1a9de: 0x6cf6b620, 0x1a9df: 0x6c31be20, - 0x1a9e0: 0x6c610c20, 0x1a9e1: 0x6c387820, 0x1a9e2: 0x6c387a20, 0x1a9e3: 0x6c387c20, - 0x1a9e4: 0x6c3cd620, 0x1a9e5: 0x6c704a20, 0x1a9e6: 0x6c1ed220, 0x1a9e7: 0x6d337a20, - 0x1a9e8: 0x6c3c1420, 0x1a9e9: 0x6ca2c220, 0x1a9ea: 0x6d377a20, 0x1a9eb: 0x6c3dcc20, - 0x1a9ec: 0x6c3c1620, 0x1a9ed: 0x6cb27220, 0x1a9ee: 0x6c3c2020, 0x1a9ef: 0x6c764420, - 0x1a9f0: 0x6c59b220, 0x1a9f1: 0x6c765220, 0x1a9f2: 0x6c419a20, 0x1a9f3: 0x6c2ad820, - 0x1a9f4: 0x6cb2bc20, 0x1a9f5: 0x6cb9ec20, 0x1a9f6: 0x6d044820, 0x1a9f7: 0x6c7b0a20, - 0x1a9f8: 0x6ce83620, 0x1a9f9: 0x6c022420, 0x1a9fa: 0x6c1e5020, 0x1a9fb: 0x6c5e6820, - 0x1a9fc: 0x6c295020, 0x1a9fd: 0x6c4dd220, 0x1a9fe: 0x6c4dda20, 0x1a9ff: 0x6d2a3420, - // Block 0x6a8, offset 0x1aa00 - 0x1aa00: 0x6c29b020, 0x1aa01: 0x6c2da220, 0x1aa02: 0x6c29b220, 0x1aa03: 0x6cc5a020, - 0x1aa04: 0x6cc5a220, 0x1aa05: 0x6c204a20, 0x1aa06: 0x6c3b0820, 0x1aa07: 0x6cbc9020, - 0x1aa08: 0x6d163e20, 0x1aa09: 0x6c5e6a20, 0x1aa0a: 0x6c76a020, 0x1aa0b: 0x6cba3a20, - 0x1aa0c: 0x6c25ac20, 0x1aa0d: 0x6c1e7220, 0x1aa0e: 0x6cf1c620, 0x1aa0f: 0x6c5e7220, - 0x1aa10: 0x6c281c20, 0x1aa11: 0x6d03b820, 0x1aa12: 0x6c577820, 0x1aa13: 0x6cecb620, - 0x1aa14: 0x6c73ce20, 0x1aa15: 0x6c839e20, 0x1aa16: 0x6d267020, 0x1aa17: 0x6c8abc20, - 0x1aa18: 0x6c8e3e20, 0x1aa19: 0x6d2aa220, 0x1aa1a: 0x6c425220, 0x1aa1b: 0x6c209e20, - 0x1aa1c: 0x6c3dd420, 0x1aa1d: 0x6c1e5420, 0x1aa1e: 0x6cc26020, 0x1aa1f: 0x6c704c20, - 0x1aa20: 0x6cccb820, 0x1aa21: 0x6c9f8e20, 0x1aa22: 0x6c8c9a20, 0x1aa23: 0x6d378a20, - 0x1aa24: 0x6cac9c20, 0x1aa25: 0x6c0cd820, 0x1aa26: 0x6c6a6420, 0x1aa27: 0x6c6a6620, - 0x1aa28: 0x6cad4420, 0x1aa29: 0x6c857620, 0x1aa2a: 0x6cccba20, 0x1aa2b: 0x6c0cda20, - 0x1aa2c: 0x6c158e20, 0x1aa2d: 0x6c6e0620, 0x1aa2e: 0x6c484420, 0x1aa2f: 0x6c44b820, - 0x1aa30: 0x6c2a0020, 0x1aa31: 0x6c20a220, 0x1aa32: 0x6c7c3220, 0x1aa33: 0x6c7a2020, - 0x1aa34: 0x6c34ca20, 0x1aa35: 0x6c37be20, 0x1aa36: 0x6d358020, 0x1aa37: 0x6cd64020, - 0x1aa38: 0x6cc36e20, 0x1aa39: 0x6ccbce20, 0x1aa3a: 0x6c22b220, 0x1aa3b: 0x6c787a20, - 0x1aa3c: 0x6c6a7620, 0x1aa3d: 0x6c4b2a20, 0x1aa3e: 0x6c22b420, 0x1aa3f: 0x6c4b2c20, - // Block 0x6a9, offset 0x1aa40 - 0x1aa40: 0x6c764620, 0x1aa41: 0x6c34cc20, 0x1aa42: 0x6c619020, 0x1aa43: 0x6ce3d820, - 0x1aa44: 0x6c6e1420, 0x1aa45: 0x6c907c20, 0x1aa46: 0x6c95a620, 0x1aa47: 0x6d2ab220, - 0x1aa48: 0x6d24cc20, 0x1aa49: 0x6c260c20, 0x1aa4a: 0x6d08da20, 0x1aa4b: 0x6c788220, - 0x1aa4c: 0x6c7e5a20, 0x1aa4d: 0x6cb97820, 0x1aa4e: 0x6ccbd020, 0x1aa4f: 0x6c20a420, - 0x1aa50: 0x6c489420, 0x1aa51: 0x6c665820, 0x1aa52: 0x6c261020, 0x1aa53: 0x6c83aa20, - 0x1aa54: 0x6ce2e820, 0x1aa55: 0x6c3a9620, 0x1aa56: 0x6cb3c620, 0x1aa57: 0x6c15a020, - 0x1aa58: 0x6cb59c20, 0x1aa59: 0x6c20a620, 0x1aa5a: 0x6d3f3820, 0x1aa5b: 0x6c426c20, - 0x1aa5c: 0x6cec8420, 0x1aa5d: 0x6c0e5a20, 0x1aa5e: 0x6c5e9e20, 0x1aa5f: 0x6c342220, - 0x1aa60: 0x6cbe7220, 0x1aa61: 0x6ccd7420, 0x1aa62: 0x6c316620, 0x1aa63: 0x6c666a20, - 0x1aa64: 0x6c61c220, 0x1aa65: 0x6c0e5c20, 0x1aa66: 0x6d0be220, 0x1aa67: 0x6c722820, - 0x1aa68: 0x6c5d5420, 0x1aa69: 0x6cd16220, 0x1aa6a: 0x6c658420, 0x1aa6b: 0x6c344420, - 0x1aa6c: 0x6c329620, 0x1aa6d: 0x6cf36220, 0x1aa6e: 0x6c489820, 0x1aa6f: 0x6c3fe220, - 0x1aa70: 0x6cd15a20, 0x1aa71: 0x6c667420, 0x1aa72: 0x6c438c20, 0x1aa73: 0x6c269420, - 0x1aa74: 0x6c765420, 0x1aa75: 0x6c20aa20, 0x1aa76: 0x6c1fe220, 0x1aa77: 0x6c15bc20, - 0x1aa78: 0x6ce94e20, 0x1aa79: 0x6c926220, 0x1aa7a: 0x6c83de20, 0x1aa7b: 0x6caf0a20, - 0x1aa7c: 0x6ccce820, 0x1aa7d: 0x6cb15620, 0x1aa7e: 0x6c79bc20, 0x1aa7f: 0x6c690220, - // Block 0x6aa, offset 0x1aa80 - 0x1aa80: 0x6c486620, 0x1aa81: 0x6cbb8a20, 0x1aa82: 0x6c747220, 0x1aa83: 0x6c57a820, - 0x1aa84: 0x6d2be620, 0x1aa85: 0x6d3df620, 0x1aa86: 0x6c882a20, 0x1aa87: 0x6c727420, - 0x1aa88: 0x6caf8420, 0x1aa89: 0x6c8e8020, 0x1aa8a: 0x6c4b5e20, 0x1aa8b: 0x6c692220, - 0x1aa8c: 0x6c4b6020, 0x1aa8d: 0x6c66b020, 0x1aa8e: 0x6c66b220, 0x1aa8f: 0x6ce0c820, - 0x1aa90: 0x6c5d5a20, 0x1aa91: 0x6c627220, 0x1aa92: 0x6c66cc20, 0x1aa93: 0x6d187e20, - 0x1aa94: 0x6c66ce20, 0x1aa95: 0x6d370020, 0x1aa96: 0x6c154220, 0x1aa97: 0x6c662020, - 0x1aa98: 0x6ca09820, 0x1aa99: 0x6c84c820, 0x1aa9a: 0x6d3a8c20, 0x1aa9b: 0x6c855c20, - 0x1aa9c: 0x6d0b6220, 0x1aa9d: 0x6cc36c20, 0x1aa9e: 0x6c04da20, 0x1aa9f: 0x6c455420, - 0x1aaa0: 0x6c631620, 0x1aaa1: 0x6cf55220, 0x1aaa2: 0x6c971e20, 0x1aaa3: 0x6c8abe20, - 0x1aaa4: 0x6c6cce20, 0x1aaa5: 0x6c792020, 0x1aaa6: 0x6d006420, 0x1aaa7: 0x6d34d220, - 0x1aaa8: 0x6c304c20, 0x1aaa9: 0x6d3aa020, 0x1aaaa: 0x6caa4a20, 0x1aaab: 0x6c6a6820, - 0x1aaac: 0x6cc17420, 0x1aaad: 0x6ccec020, 0x1aaae: 0x6d167620, 0x1aaaf: 0x6d398020, - 0x1aab0: 0x6ca0c020, 0x1aab1: 0x6c857a20, 0x1aab2: 0x6c6cd020, 0x1aab3: 0x6c813e20, - 0x1aab4: 0x6c814020, 0x1aab5: 0x6c733e20, 0x1aab6: 0x6c79ce20, 0x1aab7: 0x6d0f8620, - 0x1aab8: 0x6cebc620, 0x1aab9: 0x6cffd420, 0x1aaba: 0x6ca1c220, 0x1aabb: 0x6c7b8420, - 0x1aabc: 0x6c6a7a20, 0x1aabd: 0x6c8aca20, 0x1aabe: 0x6c50ba20, 0x1aabf: 0x6cd31420, - // Block 0x6ab, offset 0x1aac0 - 0x1aac0: 0x6c788420, 0x1aac1: 0x6c6ce020, 0x1aac2: 0x6c433620, 0x1aac3: 0x6c0ec220, - 0x1aac4: 0x6c9f9820, 0x1aac5: 0x6c1bf420, 0x1aac6: 0x6c80a020, 0x1aac7: 0x6d1e1820, - 0x1aac8: 0x6d1e1a20, 0x1aac9: 0x6c9e0c20, 0x1aaca: 0x6c788620, 0x1aacb: 0x6d099220, - 0x1aacc: 0x6c734420, 0x1aacd: 0x6cbe7420, 0x1aace: 0x6c922820, 0x1aacf: 0x6c107c20, - 0x1aad0: 0x6c9bcc20, 0x1aad1: 0x6c1c0420, 0x1aad2: 0x6c823c20, 0x1aad3: 0x6c768620, - 0x1aad4: 0x6c9e1a20, 0x1aad5: 0x6c307220, 0x1aad6: 0x6d06b420, 0x1aad7: 0x6d06ba20, - 0x1aad8: 0x6c76a620, 0x1aad9: 0x6cf55620, 0x1aada: 0x6d175020, 0x1aadb: 0x6d099820, - 0x1aadc: 0x6cf24a20, 0x1aadd: 0x6cd16420, 0x1aade: 0x6c815620, 0x1aadf: 0x6ca28420, - 0x1aae0: 0x6c926420, 0x1aae1: 0x6cb1b220, 0x1aae2: 0x6cd39620, 0x1aae3: 0x6c5ee220, - 0x1aae4: 0x6cbd7c20, 0x1aae5: 0x6c67ee20, 0x1aae6: 0x6c174c20, 0x1aae7: 0x6cc37420, - 0x1aae8: 0x6cfe3e20, 0x1aae9: 0x6d181c20, 0x1aaea: 0x6c747620, 0x1aaeb: 0x6c385220, - 0x1aaec: 0x6c72fa20, 0x1aaed: 0x6ce76620, 0x1aaee: 0x6c727620, 0x1aaef: 0x6c27f620, - 0x1aaf0: 0x6d00d620, 0x1aaf1: 0x6c973820, 0x1aaf2: 0x6d09a420, 0x1aaf3: 0x6d09a820, - 0x1aaf4: 0x6c940220, 0x1aaf5: 0x6c867020, 0x1aaf6: 0x6c184e20, 0x1aaf7: 0x6cc4e220, - 0x1aaf8: 0x6cc37c20, 0x1aaf9: 0x6c059c20, 0x1aafa: 0x6cce9420, 0x1aafb: 0x6d277620, - 0x1aafc: 0x6c6f4220, 0x1aafd: 0x6c062c20, 0x1aafe: 0x6c463220, 0x1aaff: 0x6cf49220, - // Block 0x6ac, offset 0x1ab00 - 0x1ab00: 0x6d277820, 0x1ab01: 0x6cf17820, 0x1ab02: 0x6c0ade20, 0x1ab03: 0x6c412220, - 0x1ab04: 0x6c412420, 0x1ab05: 0x6c059e20, 0x1ab06: 0x6c22f420, 0x1ab07: 0x6d198a20, - 0x1ab08: 0x6d045020, 0x1ab09: 0x6cae5020, 0x1ab0a: 0x6c705020, 0x1ab0b: 0x6ce20420, - 0x1ab0c: 0x6c43c620, 0x1ab0d: 0x6cb42c20, 0x1ab0e: 0x6c35f820, 0x1ab0f: 0x6cad5a20, - 0x1ab10: 0x6c3e4820, 0x1ab11: 0x6c458820, 0x1ab12: 0x6c269620, 0x1ab13: 0x6c6fee20, - 0x1ab14: 0x6cbef220, 0x1ab15: 0x6c08aa20, 0x1ab16: 0x6c577620, 0x1ab17: 0x6c06c620, - 0x1ab18: 0x6ca4ea20, 0x1ab19: 0x6cd41420, 0x1ab1a: 0x6c397e20, 0x1ab1b: 0x6c6fc620, - 0x1ab1c: 0x6d144c20, 0x1ab1d: 0x6d288020, 0x1ab1e: 0x6c67d020, 0x1ab1f: 0x6c777820, - 0x1ab20: 0x6c681820, 0x1ab21: 0x6c7b8020, 0x1ab22: 0x6c549220, 0x1ab23: 0x6cf98420, - 0x1ab24: 0x6cc0ce20, 0x1ab25: 0x6c0b6820, 0x1ab26: 0x6c4ac620, 0x1ab27: 0x6cbc9c20, - 0x1ab28: 0x6d29d020, 0x1ab29: 0x6c7b8a20, 0x1ab2a: 0x6c3a4c20, 0x1ab2b: 0x6c54b420, - 0x1ab2c: 0x6d224620, 0x1ab2d: 0x6c4aee20, 0x1ab2e: 0x6c7cf020, 0x1ab2f: 0x6c5bd220, - 0x1ab30: 0x6c27ea20, 0x1ab31: 0x6c4b5c20, 0x1ab32: 0x6c881a20, 0x1ab33: 0x6c882c20, - 0x1ab34: 0x6cdb9420, 0x1ab35: 0x6c31c220, 0x1ab36: 0x6c703420, 0x1ab37: 0x6c74fa20, - 0x1ab38: 0x6cf83420, 0x1ab39: 0x6cb04020, 0x1ab3a: 0x6cc0c420, 0x1ab3b: 0x6d13c020, - 0x1ab3c: 0x6c77d420, 0x1ab3d: 0x6d0d5220, 0x1ab3e: 0x6c0b3220, 0x1ab3f: 0x6ca68c20, - // Block 0x6ad, offset 0x1ab40 - 0x1ab40: 0x6cc0f820, 0x1ab41: 0x6cd22420, 0x1ab42: 0x6d0a6020, 0x1ab43: 0x6cb88c20, - 0x1ab44: 0x6ca75420, 0x1ab45: 0x6cc96220, 0x1ab46: 0x6d40a220, 0x1ab47: 0x6cd0d020, - 0x1ab48: 0x6cf41620, 0x1ab49: 0x6c5b8420, 0x1ab4a: 0x6c04dc20, 0x1ab4b: 0x6cd2fa20, - 0x1ab4c: 0x6cf83620, 0x1ab4d: 0x6ced6a20, 0x1ab4e: 0x6c572420, 0x1ab4f: 0x6d006620, - 0x1ab50: 0x6ced6c20, 0x1ab51: 0x6c068e20, 0x1ab52: 0x6d40a820, 0x1ab53: 0x6d3cee20, - 0x1ab54: 0x6d007020, 0x1ab55: 0x6c27ba20, 0x1ab56: 0x6c972820, 0x1ab57: 0x6ca3ea20, - 0x1ab58: 0x6c27c020, 0x1ab59: 0x6c601220, 0x1ab5a: 0x6c0efe20, 0x1ab5b: 0x6cd67c20, - 0x1ab5c: 0x6c100420, 0x1ab5d: 0x6c7bd420, 0x1ab5e: 0x6c0b6420, 0x1ab5f: 0x6c102a20, - 0x1ab60: 0x6d2e4620, 0x1ab61: 0x6c761820, 0x1ab62: 0x6c913020, 0x1ab63: 0x6d1f9c20, - 0x1ab64: 0x6c91b420, 0x1ab65: 0x6cf58420, 0x1ab66: 0x6c48a620, 0x1ab67: 0x6cf2d420, - 0x1ab68: 0x6d017620, 0x1ab69: 0x6c6a4e20, 0x1ab6a: 0x6c6a5020, 0x1ab6b: 0x6cf06820, - 0x1ab6c: 0x6c01f020, 0x1ab6d: 0x6cbef420, 0x1ab6e: 0x6d338020, 0x1ab6f: 0x6c991e20, - 0x1ab70: 0x6d1b3620, 0x1ab71: 0x6cee6620, 0x1ab72: 0x6ccec420, 0x1ab73: 0x6c5fd220, - 0x1ab74: 0x6cc3a020, 0x1ab75: 0x6c948c20, 0x1ab76: 0x6c1b7c20, 0x1ab77: 0x6c731020, - 0x1ab78: 0x6d016a20, 0x1ab79: 0x6d067e20, 0x1ab7a: 0x6c6c8620, 0x1ab7b: 0x6cc3a620, - 0x1ab7c: 0x6cf4be20, 0x1ab7d: 0x6c5fec20, 0x1ab7e: 0x6c360a20, 0x1ab7f: 0x6cbe3a20, - // Block 0x6ae, offset 0x1ab80 - 0x1ab80: 0x6cf63820, 0x1ab81: 0x6cca6620, 0x1ab82: 0x6c16e020, 0x1ab83: 0x6cef8020, - 0x1ab84: 0x6c35c020, 0x1ab85: 0x6ce62220, 0x1ab86: 0x6c856020, 0x1ab87: 0x6d300c20, - 0x1ab88: 0x6c4e4e20, 0x1ab89: 0x6c856420, 0x1ab8a: 0x6d0b4620, 0x1ab8b: 0x6d0ac820, - 0x1ab8c: 0x6d0e3620, 0x1ab8d: 0x6ccf3020, 0x1ab8e: 0x6c2bca20, 0x1ab8f: 0x6d2c7020, - 0x1ab90: 0x6cacf020, 0x1ab91: 0x6d0b0c20, 0x1ab92: 0x6c50bc20, 0x1ab93: 0x6d0b1620, - 0x1ab94: 0x6d358220, 0x1ab95: 0x6c12cc20, 0x1ab96: 0x6cacf620, 0x1ab97: 0x6ce31020, - 0x1ab98: 0x6c83a420, 0x1ab99: 0x6ccf3820, 0x1ab9a: 0x6c546020, 0x1ab9b: 0x6ce63420, - 0x1ab9c: 0x6d416820, 0x1ab9d: 0x6c261220, 0x1ab9e: 0x6c3a9820, 0x1ab9f: 0x6d254c20, - 0x1aba0: 0x6c12dc20, 0x1aba1: 0x6d255e20, 0x1aba2: 0x6cfd6a20, 0x1aba3: 0x6d0d6420, - 0x1aba4: 0x6c860c20, 0x1aba5: 0x6c744220, 0x1aba6: 0x6ccc5020, 0x1aba7: 0x6c2cca20, - 0x1aba8: 0x6c1e7c20, 0x1aba9: 0x6c6ff020, 0x1abaa: 0x6c6c9620, 0x1abab: 0x6c024620, - 0x1abac: 0x6c4b1020, 0x1abad: 0x6d0e9020, 0x1abae: 0x6cd80020, 0x1abaf: 0x6c862620, - 0x1abb0: 0x6c16f220, 0x1abb1: 0x6c7faa20, 0x1abb2: 0x6c864620, 0x1abb3: 0x6d0cd020, - 0x1abb4: 0x6d0df620, 0x1abb5: 0x6d25dc20, 0x1abb6: 0x6cd7b420, 0x1abb7: 0x6c455020, - 0x1abb8: 0x6c8b9c20, 0x1abb9: 0x6cc73e20, 0x1abba: 0x6cc25a20, 0x1abbb: 0x6cc25c20, - 0x1abbc: 0x6c377c20, 0x1abbd: 0x6c82b020, 0x1abbe: 0x6c315e20, 0x1abbf: 0x6cfc7420, - // Block 0x6af, offset 0x1abc0 - 0x1abc0: 0x6d3b6e20, 0x1abc1: 0x6cc9fa20, 0x1abc2: 0x6c115a20, 0x1abc3: 0x6c115e20, - 0x1abc4: 0x6c116020, 0x1abc5: 0x6c116620, 0x1abc6: 0x6c00b420, 0x1abc7: 0x6c278620, - 0x1abc8: 0x6d200420, 0x1abc9: 0x6c137220, 0x1abca: 0x6c5fb820, 0x1abcb: 0x6d206820, - 0x1abcc: 0x6cd6a020, 0x1abcd: 0x6c390020, 0x1abce: 0x6cd42620, 0x1abcf: 0x6c48e420, - 0x1abd0: 0x6c035c20, 0x1abd1: 0x6c37e220, 0x1abd2: 0x6cc91020, 0x1abd3: 0x6cd30820, - 0x1abd4: 0x6cd4a620, 0x1abd5: 0x6d3d2a20, 0x1abd6: 0x6cc23c20, 0x1abd7: 0x6cd45220, - 0x1abd8: 0x6c0b7a20, 0x1abd9: 0x6d068a20, 0x1abda: 0x6c640420, 0x1abdb: 0x6cacaa20, - 0x1abdc: 0x6cda0c20, 0x1abdd: 0x6c433820, 0x1abde: 0x6cf08020, 0x1abdf: 0x6cda0e20, - 0x1abe0: 0x6c2ebc20, 0x1abe1: 0x6cc8e220, 0x1abe2: 0x6c23bc20, 0x1abe3: 0x6c79c820, - 0x1abe4: 0x6c475020, 0x1abe5: 0x6c71ea20, 0x1abe6: 0x6c8e1a20, 0x1abe7: 0x6c488a20, - 0x1abe8: 0x6c29b420, 0x1abe9: 0x6c79d420, 0x1abea: 0x6d34ce20, 0x1abeb: 0x6c697a20, - 0x1abec: 0x6d2f9420, 0x1abed: 0x6c03e820, 0x1abee: 0x6c2f4420, 0x1abef: 0x6c785220, - 0x1abf0: 0x6cdf0e20, 0x1abf1: 0x6c1bd620, 0x1abf2: 0x6cd2a420, 0x1abf3: 0x6d200820, - 0x1abf4: 0x6cbfee20, 0x1abf5: 0x6cb34620, 0x1abf6: 0x6d12ba20, 0x1abf7: 0x6c500e20, - 0x1abf8: 0x6cd7bc20, 0x1abf9: 0x6ce08a20, 0x1abfa: 0x6c1b7220, 0x1abfb: 0x6c820a20, - 0x1abfc: 0x6c2daa20, 0x1abfd: 0x6c5e6c20, 0x1abfe: 0x6c8a5c20, 0x1abff: 0x6c529020, - // Block 0x6b0, offset 0x1ac00 - 0x1ac00: 0x6c9ebe20, 0x1ac01: 0x6d056020, 0x1ac02: 0x6c982420, 0x1ac03: 0x6c1a9020, - 0x1ac04: 0x6c447c20, 0x1ac05: 0x6d077820, 0x1ac06: 0x6d108620, 0x1ac07: 0x6d3ed820, - 0x1ac08: 0x6c50b620, 0x1ac09: 0x6c5fc220, 0x1ac0a: 0x6c2e0820, 0x1ac0b: 0x6c25b220, - 0x1ac0c: 0x6ce70c20, 0x1ac0d: 0x6c9fe620, 0x1ac0e: 0x6c545a20, 0x1ac0f: 0x6c856e20, - 0x1ac10: 0x6ce91620, 0x1ac11: 0x6cfe1620, 0x1ac12: 0x6d2bc220, 0x1ac13: 0x6cfa2a20, - 0x1ac14: 0x6d12a020, 0x1ac15: 0x6c937420, 0x1ac16: 0x6d0aca20, 0x1ac17: 0x6c96ee20, - 0x1ac18: 0x6cab7420, 0x1ac19: 0x6c5d5220, 0x1ac1a: 0x6d13c220, 0x1ac1b: 0x6c755420, - 0x1ac1c: 0x6c1e1c20, 0x1ac1d: 0x6c8c4420, 0x1ac1e: 0x6cea1620, 0x1ac1f: 0x6d1a2420, - 0x1ac20: 0x6c3a7e20, 0x1ac21: 0x6c08b820, 0x1ac22: 0x6cbdfe20, 0x1ac23: 0x6cbe0020, - 0x1ac24: 0x6c6ba820, 0x1ac25: 0x6c105c20, 0x1ac26: 0x6c3d1c20, 0x1ac27: 0x6c03ea20, - 0x1ac28: 0x6c339620, 0x1ac29: 0x6c3b0c20, 0x1ac2a: 0x6c354820, 0x1ac2b: 0x6c4dce20, - 0x1ac2c: 0x6ce62c20, 0x1ac2d: 0x6c792420, 0x1ac2e: 0x6cd74620, 0x1ac2f: 0x6cb6d020, - 0x1ac30: 0x6c52f020, 0x1ac31: 0x6d338620, 0x1ac32: 0x6d1aca20, 0x1ac33: 0x6cf3a020, - 0x1ac34: 0x6cf3a220, 0x1ac35: 0x6c178c20, 0x1ac36: 0x6ca55820, 0x1ac37: 0x6d093c20, - 0x1ac38: 0x6cf56a20, 0x1ac39: 0x6c20b420, 0x1ac3a: 0x6c309e20, 0x1ac3b: 0x6cf1c820, - 0x1ac3c: 0x6c544820, 0x1ac3d: 0x6c529220, 0x1ac3e: 0x6cf3a420, 0x1ac3f: 0x6c433220, - // Block 0x6b1, offset 0x1ac40 - 0x1ac40: 0x6d0bda20, 0x1ac41: 0x6c759420, 0x1ac42: 0x6c937620, 0x1ac43: 0x6c35d020, - 0x1ac44: 0x6c43c020, 0x1ac45: 0x6c99ce20, 0x1ac46: 0x6c270420, 0x1ac47: 0x6cb6d220, - 0x1ac48: 0x6c19b620, 0x1ac49: 0x6cf3a620, 0x1ac4a: 0x6c433420, 0x1ac4b: 0x6c3d3820, - 0x1ac4c: 0x6c698020, 0x1ac4d: 0x6c529420, 0x1ac4e: 0x6c1b7820, 0x1ac4f: 0x6cd0da20, - 0x1ac50: 0x6ca55a20, 0x1ac51: 0x6cea1820, 0x1ac52: 0x6c3f3220, 0x1ac53: 0x6d167820, - 0x1ac54: 0x6c270620, 0x1ac55: 0x6cab7620, 0x1ac56: 0x6c857c20, 0x1ac57: 0x6c077620, - 0x1ac58: 0x6d253820, 0x1ac59: 0x6c4c0e20, 0x1ac5a: 0x6cf21a20, 0x1ac5b: 0x6cba9c20, - 0x1ac5c: 0x6cf35020, 0x1ac5d: 0x6c35da20, 0x1ac5e: 0x6cd19820, 0x1ac5f: 0x6c731220, - 0x1ac60: 0x6cae4620, 0x1ac61: 0x6cf1ce20, 0x1ac62: 0x6ca55c20, 0x1ac63: 0x6c965a20, - 0x1ac64: 0x6c8e1c20, 0x1ac65: 0x6cc46020, 0x1ac66: 0x6d1e9420, 0x1ac67: 0x6c2bd420, - 0x1ac68: 0x6d385a20, 0x1ac69: 0x6cd31620, 0x1ac6a: 0x6d38fa20, 0x1ac6b: 0x6ce60e20, - 0x1ac6c: 0x6cf84420, 0x1ac6d: 0x6d16a820, 0x1ac6e: 0x6cb74220, 0x1ac6f: 0x6cb27420, - 0x1ac70: 0x6d3ef420, 0x1ac71: 0x6c46ea20, 0x1ac72: 0x6c21f420, 0x1ac73: 0x6cf07220, - 0x1ac74: 0x6d062a20, 0x1ac75: 0x6c000420, 0x1ac76: 0x6ca49220, 0x1ac77: 0x6c40be20, - 0x1ac78: 0x6cadac20, 0x1ac79: 0x6d16aa20, 0x1ac7a: 0x6cfe8220, 0x1ac7b: 0x6ccfa820, - 0x1ac7c: 0x6c549820, 0x1ac7d: 0x6ca04020, 0x1ac7e: 0x6c267a20, 0x1ac7f: 0x6cc26220, - // Block 0x6b2, offset 0x1ac80 - 0x1ac80: 0x6c71a220, 0x1ac81: 0x6c4dd420, 0x1ac82: 0x6d288820, 0x1ac83: 0x6ceaa820, - 0x1ac84: 0x6c341a20, 0x1ac85: 0x6cb3ec20, 0x1ac86: 0x6cad4620, 0x1ac87: 0x6c0cdc20, - 0x1ac88: 0x6c3de020, 0x1ac89: 0x6d0f4420, 0x1ac8a: 0x6c50be20, 0x1ac8b: 0x6d28e820, - 0x1ac8c: 0x6c50c020, 0x1ac8d: 0x6c4d0c20, 0x1ac8e: 0x6c6fd420, 0x1ac8f: 0x6d1e1220, - 0x1ac90: 0x6c40aa20, 0x1ac91: 0x6c264020, 0x1ac92: 0x6d38fc20, 0x1ac93: 0x6cec1220, - 0x1ac94: 0x6c760c20, 0x1ac95: 0x6c483220, 0x1ac96: 0x6c760e20, 0x1ac97: 0x6d42b820, - 0x1ac98: 0x6c106020, 0x1ac99: 0x6c8f6a20, 0x1ac9a: 0x6c2fda20, 0x1ac9b: 0x6ca8f420, - 0x1ac9c: 0x6cdefe20, 0x1ac9d: 0x6cd7c820, 0x1ac9e: 0x6cfc7820, 0x1ac9f: 0x6c5da420, - 0x1aca0: 0x6cb75020, 0x1aca1: 0x6c37c020, 0x1aca2: 0x6c35e420, 0x1aca3: 0x6c49da20, - 0x1aca4: 0x6d2cb220, 0x1aca5: 0x6cf85420, 0x1aca6: 0x6d148a20, 0x1aca7: 0x6c8b9220, - 0x1aca8: 0x6d3e0a20, 0x1aca9: 0x6c9ec020, 0x1acaa: 0x6c9c2e20, 0x1acab: 0x6d34fa20, - 0x1acac: 0x6d119420, 0x1acad: 0x6c5e9220, 0x1acae: 0x6d390a20, 0x1acaf: 0x6c437820, - 0x1acb0: 0x6cd5a820, 0x1acb1: 0x6d295e20, 0x1acb2: 0x6cffd620, 0x1acb3: 0x6c4d0e20, - 0x1acb4: 0x6c5a8e20, 0x1acb5: 0x6c7ad420, 0x1acb6: 0x6c580c20, 0x1acb7: 0x6ce20820, - 0x1acb8: 0x6cfb3020, 0x1acb9: 0x6c35e620, 0x1acba: 0x6d084220, 0x1acbb: 0x6d04ba20, - 0x1acbc: 0x6c4c1020, 0x1acbd: 0x6d0e4220, 0x1acbe: 0x6c81a020, 0x1acbf: 0x6d13ce20, - // Block 0x6b3, offset 0x1acc0 - 0x1acc0: 0x6c001620, 0x1acc1: 0x6cb23820, 0x1acc2: 0x6cd04a20, 0x1acc3: 0x6ce72020, - 0x1acc4: 0x6c529a20, 0x1acc5: 0x6d045c20, 0x1acc6: 0x6c341c20, 0x1acc7: 0x6cec4c20, - 0x1acc8: 0x6c4cf820, 0x1acc9: 0x6d28f820, 0x1acca: 0x6d201e20, 0x1accb: 0x6c2f3020, - 0x1accc: 0x6cac1c20, 0x1accd: 0x6cfddc20, 0x1acce: 0x6c001420, 0x1accf: 0x6c449c20, - 0x1acd0: 0x6c7b8c20, 0x1acd1: 0x6d0b4a20, 0x1acd2: 0x6c264220, 0x1acd3: 0x6cfe8a20, - 0x1acd4: 0x6c094220, 0x1acd5: 0x6c5b9620, 0x1acd6: 0x6ca77420, 0x1acd7: 0x6c570a20, - 0x1acd8: 0x6d044220, 0x1acd9: 0x6c7b1820, 0x1acda: 0x6c347620, 0x1acdb: 0x6c3b1c20, - 0x1acdc: 0x6c619c20, 0x1acdd: 0x6ca9b220, 0x1acde: 0x6ca1ba20, 0x1acdf: 0x6d1d7620, - 0x1ace0: 0x6c502420, 0x1ace1: 0x6d254e20, 0x1ace2: 0x6c905620, 0x1ace3: 0x6cb3ee20, - 0x1ace4: 0x6c984820, 0x1ace5: 0x6c438020, 0x1ace6: 0x6cab2820, 0x1ace7: 0x6c1a9a20, - 0x1ace8: 0x6ccece20, 0x1ace9: 0x6c87dc20, 0x1acea: 0x6ca2f420, 0x1aceb: 0x6d40ae20, - 0x1acec: 0x6c50ea20, 0x1aced: 0x6c7a3420, 0x1acee: 0x6cfe9220, 0x1acef: 0x6cfc9a20, - 0x1acf0: 0x6c814820, 0x1acf1: 0x6c0e5e20, 0x1acf2: 0x6d302c20, 0x1acf3: 0x6d2bd020, - 0x1acf4: 0x6c89ac20, 0x1acf5: 0x6c033620, 0x1acf6: 0x6c9ec220, 0x1acf7: 0x6c8ae220, - 0x1acf8: 0x6cdbb420, 0x1acf9: 0x6c3e2a20, 0x1acfa: 0x6c103420, 0x1acfb: 0x6c4e9020, - 0x1acfc: 0x6c524620, 0x1acfd: 0x6c44f220, 0x1acfe: 0x6cd76820, 0x1acff: 0x6c447420, - // Block 0x6b4, offset 0x1ad00 - 0x1ad00: 0x6d203620, 0x1ad01: 0x6d0e4c20, 0x1ad02: 0x6c46fc20, 0x1ad03: 0x6c477020, - 0x1ad04: 0x6c077820, 0x1ad05: 0x6c4dec20, 0x1ad06: 0x6cdd0c20, 0x1ad07: 0x6c213820, - 0x1ad08: 0x6d171c20, 0x1ad09: 0x6c001820, 0x1ad0a: 0x6c63ae20, 0x1ad0b: 0x6ce84620, - 0x1ad0c: 0x6cfb3220, 0x1ad0d: 0x6cecf620, 0x1ad0e: 0x6c85c420, 0x1ad0f: 0x6cf5b220, - 0x1ad10: 0x6ce0e820, 0x1ad11: 0x6d428a20, 0x1ad12: 0x6cc02420, 0x1ad13: 0x6c17d420, - 0x1ad14: 0x6cf3ac20, 0x1ad15: 0x6d2a6e20, 0x1ad16: 0x6d0b4c20, 0x1ad17: 0x6c30a420, - 0x1ad18: 0x6cb6e420, 0x1ad19: 0x6c2b6020, 0x1ad1a: 0x6cbe0c20, 0x1ad1b: 0x6c96ba20, - 0x1ad1c: 0x6ca0ee20, 0x1ad1d: 0x6c461220, 0x1ad1e: 0x6c30e620, 0x1ad1f: 0x6cc26c20, - 0x1ad20: 0x6c814a20, 0x1ad21: 0x6c898c20, 0x1ad22: 0x6cdd5420, 0x1ad23: 0x6d2a7020, - 0x1ad24: 0x6c58fe20, 0x1ad25: 0x6c813620, 0x1ad26: 0x6ccbd620, 0x1ad27: 0x6c5ea020, - 0x1ad28: 0x6d426820, 0x1ad29: 0x6cf28420, 0x1ad2a: 0x6c3cca20, 0x1ad2b: 0x6c6cfc20, - 0x1ad2c: 0x6c56fc20, 0x1ad2d: 0x6cb77620, 0x1ad2e: 0x6cd45c20, 0x1ad2f: 0x6ceefa20, - 0x1ad30: 0x6cd64420, 0x1ad31: 0x6c171020, 0x1ad32: 0x6c374e20, 0x1ad33: 0x6c85e620, - 0x1ad34: 0x6cbb5620, 0x1ad35: 0x6c017e20, 0x1ad36: 0x6d2ab620, 0x1ad37: 0x6d1d7820, - 0x1ad38: 0x6ca75e20, 0x1ad39: 0x6d208420, 0x1ad3a: 0x6ce4e620, 0x1ad3b: 0x6c7f4420, - 0x1ad3c: 0x6ccc4220, 0x1ad3d: 0x6cf5d820, 0x1ad3e: 0x6ceba020, 0x1ad3f: 0x6c54b820, - // Block 0x6b5, offset 0x1ad40 - 0x1ad40: 0x6c003c20, 0x1ad41: 0x6d2f6420, 0x1ad42: 0x6caa1420, 0x1ad43: 0x6c790220, - 0x1ad44: 0x6d3d4420, 0x1ad45: 0x6d3d4620, 0x1ad46: 0x6cce0220, 0x1ad47: 0x6c2c3a20, - 0x1ad48: 0x6c524a20, 0x1ad49: 0x6c8ba820, 0x1ad4a: 0x6c001020, 0x1ad4b: 0x6c112220, - 0x1ad4c: 0x6cfd6c20, 0x1ad4d: 0x6cea1e20, 0x1ad4e: 0x6cf43e20, 0x1ad4f: 0x6cf20620, - 0x1ad50: 0x6c253020, 0x1ad51: 0x6ccc4420, 0x1ad52: 0x6c477a20, 0x1ad53: 0x6cb6ec20, - 0x1ad54: 0x6cb6ee20, 0x1ad55: 0x6ce21620, 0x1ad56: 0x6c287420, 0x1ad57: 0x6c287620, - 0x1ad58: 0x6d12e620, 0x1ad59: 0x6d3f1020, 0x1ad5a: 0x6c08d820, 0x1ad5b: 0x6c253220, - 0x1ad5c: 0x6c1fc220, 0x1ad5d: 0x6c510220, 0x1ad5e: 0x6d0b5020, 0x1ad5f: 0x6cb6f420, - 0x1ad60: 0x6d304820, 0x1ad61: 0x6c39f620, 0x1ad62: 0x6c898e20, 0x1ad63: 0x6cfb5820, - 0x1ad64: 0x6cafd820, 0x1ad65: 0x6ccc4620, 0x1ad66: 0x6c7ed420, 0x1ad67: 0x6d2ab820, - 0x1ad68: 0x6d1baa20, 0x1ad69: 0x6c48ae20, 0x1ad6a: 0x6cabc220, 0x1ad6b: 0x6d30d620, - 0x1ad6c: 0x6ccb2020, 0x1ad6d: 0x6d3bc220, 0x1ad6e: 0x6ca81020, 0x1ad6f: 0x6c4cf620, - 0x1ad70: 0x6c953020, 0x1ad71: 0x6d0bf020, 0x1ad72: 0x6c2c3c20, 0x1ad73: 0x6cc2d220, - 0x1ad74: 0x6c15a420, 0x1ad75: 0x6c100620, 0x1ad76: 0x6c2fa020, 0x1ad77: 0x6c809e20, - 0x1ad78: 0x6cffe420, 0x1ad79: 0x6c710c20, 0x1ad7a: 0x6ce0f220, 0x1ad7b: 0x6c1c1a20, - 0x1ad7c: 0x6ce31e20, 0x1ad7d: 0x6c016c20, 0x1ad7e: 0x6c6f7020, 0x1ad7f: 0x6c288620, - // Block 0x6b6, offset 0x1ad80 - 0x1ad80: 0x6c761020, 0x1ad81: 0x6d1df420, 0x1ad82: 0x6cf08a20, 0x1ad83: 0x6ca3fc20, - 0x1ad84: 0x6ccd8a20, 0x1ad85: 0x6d232a20, 0x1ad86: 0x6d305820, 0x1ad87: 0x6c7e6220, - 0x1ad88: 0x6c6a0820, 0x1ad89: 0x6c53f820, 0x1ad8a: 0x6c4e5820, 0x1ad8b: 0x6c2e9820, - 0x1ad8c: 0x6d388220, 0x1ad8d: 0x6c147e20, 0x1ad8e: 0x6cec5220, 0x1ad8f: 0x6caaec20, - 0x1ad90: 0x6d230020, 0x1ad91: 0x6d19d820, 0x1ad92: 0x6d28b820, 0x1ad93: 0x6d10a220, - 0x1ad94: 0x6cab2420, 0x1ad95: 0x6c9e2020, 0x1ad96: 0x6c555220, 0x1ad97: 0x6d27e820, - 0x1ad98: 0x6c201e20, 0x1ad99: 0x6c5bbc20, 0x1ad9a: 0x6c591a20, 0x1ad9b: 0x6c591c20, - 0x1ad9c: 0x6cf7e620, 0x1ad9d: 0x6c509c20, 0x1ad9e: 0x6c5ec220, 0x1ad9f: 0x6c7cf420, - 0x1ada0: 0x6d37ee20, 0x1ada1: 0x6cef0620, 0x1ada2: 0x6ccc5220, 0x1ada3: 0x6d06cc20, - 0x1ada4: 0x6c59ba20, 0x1ada5: 0x6c344a20, 0x1ada6: 0x6ca82620, 0x1ada7: 0x6d079020, - 0x1ada8: 0x6c89b420, 0x1ada9: 0x6d232c20, 0x1adaa: 0x6cca9e20, 0x1adab: 0x6c1aae20, - 0x1adac: 0x6cbbe020, 0x1adad: 0x6d0e6a20, 0x1adae: 0x6c27dc20, 0x1adaf: 0x6cae4a20, - 0x1adb0: 0x6c116820, 0x1adb1: 0x6c83d020, 0x1adb2: 0x6d1d7a20, 0x1adb3: 0x6d2bd620, - 0x1adb4: 0x6cee7c20, 0x1adb5: 0x6c9e6c20, 0x1adb6: 0x6d1c6220, 0x1adb7: 0x6cae3220, - 0x1adb8: 0x6c103820, 0x1adb9: 0x6c7c7420, 0x1adba: 0x6cf88420, 0x1adbb: 0x6d232e20, - 0x1adbc: 0x6c6ac420, 0x1adbd: 0x6c912820, 0x1adbe: 0x6c7a9620, 0x1adbf: 0x6d2a8220, - // Block 0x6b7, offset 0x1adc0 - 0x1adc0: 0x6c56a220, 0x1adc1: 0x6ce33c20, 0x1adc2: 0x6d110420, 0x1adc3: 0x6c51ca20, - 0x1adc4: 0x6c000e20, 0x1adc5: 0x6d054220, 0x1adc6: 0x6cbabe20, 0x1adc7: 0x6ccb2e20, - 0x1adc8: 0x6d1d8a20, 0x1adc9: 0x6cdabe20, 0x1adca: 0x6c53a620, 0x1adcb: 0x6d00b220, - 0x1adcc: 0x6c00a220, 0x1adcd: 0x6cdd2420, 0x1adce: 0x6c96f020, 0x1adcf: 0x6c139620, - 0x1add0: 0x6c4d6c20, 0x1add1: 0x6c780420, 0x1add2: 0x6c264c20, 0x1add3: 0x6cca7e20, - 0x1add4: 0x6c187220, 0x1add5: 0x6cc81820, 0x1add6: 0x6cd9aa20, 0x1add7: 0x6cebdc20, - 0x1add8: 0x6c5ee420, 0x1add9: 0x6cad1c20, 0x1adda: 0x6cf36e20, 0x1addb: 0x6cba1020, - 0x1addc: 0x6cd39820, 0x1addd: 0x6c440020, 0x1adde: 0x6d3e3220, 0x1addf: 0x6c6a0a20, - 0x1ade0: 0x6c960c20, 0x1ade1: 0x6cf22820, 0x1ade2: 0x6cec3420, 0x1ade3: 0x6cd8c820, - 0x1ade4: 0x6c1ab420, 0x1ade5: 0x6c4fca20, 0x1ade6: 0x6cddd820, - 0x1ade8: 0x6c4d1620, 0x1ade9: 0x6cdd7020, 0x1adea: 0x6cbd7e20, 0x1adeb: 0x6ca83820, - 0x1adec: 0x6c50a020, 0x1aded: 0x6d347020, 0x1adee: 0x6cc9e220, 0x1adef: 0x6ca2c620, - 0x1adf0: 0x6c448a20, 0x1adf1: 0x6ca2e420, 0x1adf2: 0x6c2cb820, 0x1adf3: 0x6c002c20, - 0x1adf4: 0x6cbb6220, 0x1adf5: 0x6ce6f620, 0x1adf6: 0x6c09c220, 0x1adf7: 0x6c024a20, - 0x1adf8: 0x6c024c20, 0x1adf9: 0x6c880c20, 0x1adfa: 0x6d417420, 0x1adfb: 0x6d300020, - 0x1adfc: 0x6ca12420, 0x1adfd: 0x6cda4620, 0x1adfe: 0x6cda2020, 0x1adff: 0x6ce06820, - // Block 0x6b8, offset 0x1ae00 - 0x1ae00: 0x6c2b7820, 0x1ae01: 0x6cb50820, 0x1ae02: 0x6c69aa20, 0x1ae03: 0x6c1cd020, - 0x1ae04: 0x6c685a20, 0x1ae05: 0x6c765620, 0x1ae06: 0x6ce0a020, 0x1ae07: 0x6cccf820, - 0x1ae08: 0x6c127820, 0x1ae09: 0x6c637620, 0x1ae0a: 0x6c004620, 0x1ae0b: 0x6cfee620, - 0x1ae0c: 0x6cb1b420, 0x1ae0d: 0x6c912a20, 0x1ae0e: 0x6c40c020, 0x1ae0f: 0x6c47aa20, - 0x1ae10: 0x6cfee820, 0x1ae11: 0x6c54e220, 0x1ae12: 0x6c5bf220, 0x1ae13: 0x6c4c2c20, - 0x1ae14: 0x6cab8220, 0x1ae15: 0x6cfabc20, 0x1ae16: 0x6d2ad820, 0x1ae17: 0x6c16b420, - 0x1ae18: 0x6d05b820, 0x1ae19: 0x6cb32e20, 0x1ae1a: 0x6c2a5c20, 0x1ae1b: 0x6c96f420, - 0x1ae1c: 0x6c96ca20, 0x1ae1d: 0x6c557820, 0x1ae1e: 0x6c836c20, 0x1ae1f: 0x6c317220, - 0x1ae20: 0x6c40c220, 0x1ae21: 0x6ce0c420, 0x1ae22: 0x6d12ae20, 0x1ae23: 0x6c07fe20, - 0x1ae24: 0x6d1bcc20, 0x1ae25: 0x6cc9f020, 0x1ae26: 0x6c69ac20, 0x1ae27: 0x6c9d6420, - 0x1ae28: 0x6cfffc20, 0x1ae29: 0x6c571220, 0x1ae2a: 0x6c971620, 0x1ae2b: 0x6cc48020, - 0x1ae2c: 0x6c1fc420, 0x1ae2d: 0x6cae7e20, 0x1ae2e: 0x6c816420, 0x1ae2f: 0x6d000420, - 0x1ae30: 0x6c5f1020, 0x1ae31: 0x6d3a7c20, 0x1ae32: 0x6c177020, 0x1ae33: 0x6c7d0820, - 0x1ae34: 0x6d419820, 0x1ae35: 0x6cfefe20, 0x1ae36: 0x6cd80c20, 0x1ae37: 0x6c4fdc20, - 0x1ae38: 0x6c3f7e20, 0x1ae39: 0x6c8a0020, 0x1ae3a: 0x6cbbe820, 0x1ae3b: 0x6cf68e20, - 0x1ae3c: 0x6c1f6a20, 0x1ae3d: 0x6c15d020, 0x1ae3e: 0x6c28a420, 0x1ae3f: 0x6c521e20, - // Block 0x6b9, offset 0x1ae40 - 0x1ae40: 0x6d0aa020, 0x1ae41: 0x6c35b620, 0x1ae42: 0x6d420a20, 0x1ae43: 0x6c385420, - 0x1ae44: 0x6c1acc20, 0x1ae45: 0x6c5ae220, 0x1ae46: 0x6d297220, 0x1ae47: 0x6c207420, - 0x1ae48: 0x6c245220, 0x1ae49: 0x6c289c20, 0x1ae4a: 0x6d23ba20, 0x1ae4b: 0x6cea2420, - 0x1ae4c: 0x6c134a20, 0x1ae4d: 0x6c69b620, 0x1ae4e: 0x6d126220, 0x1ae4f: 0x6cf69020, - 0x1ae50: 0x6cb7be20, 0x1ae51: 0x6c4fd020, 0x1ae52: 0x6c882e20, 0x1ae53: 0x6d05ca20, - 0x1ae54: 0x6c2aa420, 0x1ae55: 0x6c5ae820, 0x1ae56: 0x6d1a8c20, 0x1ae57: 0x6cb40c20, - 0x1ae58: 0x6c73b220, 0x1ae59: 0x6cbd9220, 0x1ae5a: 0x6d0a2e20, 0x1ae5b: 0x6ca85a20, - 0x1ae5c: 0x6c912c20, 0x1ae5d: 0x6cd80e20, 0x1ae5e: 0x6d0dd420, 0x1ae5f: 0x6d1d4820, - 0x1ae60: 0x6c265e20, 0x1ae61: 0x6d2d9420, 0x1ae62: 0x6cab2620, 0x1ae63: 0x6d394e20, - 0x1ae64: 0x6c6d4820, 0x1ae65: 0x6ca9c420, 0x1ae66: 0x6c5c2620, 0x1ae67: 0x6d01f420, - 0x1ae68: 0x6cb7ce20, 0x1ae69: 0x6c36a620, 0x1ae6a: 0x6d2a8e20, 0x1ae6b: 0x6d140e20, - 0x1ae6c: 0x6cd3d620, 0x1ae6d: 0x6c69c220, 0x1ae6e: 0x6d263020, 0x1ae6f: 0x6c003420, - 0x1ae70: 0x6d1dac20, 0x1ae71: 0x6c74b420, 0x1ae72: 0x6c7b3820, 0x1ae73: 0x6d228a20, - 0x1ae74: 0x6cae3420, 0x1ae75: 0x6c2a2820, 0x1ae76: 0x6c40c820, 0x1ae77: 0x6c528e20, - 0x1ae78: 0x6c33aa20, 0x1ae79: 0x6c290220, 0x1ae7a: 0x6d036420, 0x1ae7b: 0x6cc9cc20, - 0x1ae7c: 0x6caf8e20, 0x1ae7d: 0x6cb07220, 0x1ae7e: 0x6d1a0e20, 0x1ae7f: 0x6d41a020, - // Block 0x6ba, offset 0x1ae80 - 0x1ae80: 0x6ca92020, 0x1ae81: 0x6c2b9620, 0x1ae82: 0x6c807820, 0x1ae83: 0x6cddfa20, - 0x1ae84: 0x6c5d5e20, 0x1ae85: 0x6cc7cc20, 0x1ae86: 0x6c4fac20, 0x1ae87: 0x6cfa4820, - 0x1ae88: 0x6d135220, 0x1ae89: 0x6c343820, 0x1ae8a: 0x6cb0be20, 0x1ae8b: 0x6c1de020, - 0x1ae8c: 0x6c629020, 0x1ae8d: 0x6c6d5620, 0x1ae8e: 0x6c4fec20, 0x1ae8f: 0x6ce42820, - 0x1ae90: 0x6c16ca20, 0x1ae91: 0x6d0ac220, 0x1ae92: 0x6c99c620, 0x1ae93: 0x6c10d820, - 0x1ae94: 0x6ce43820, 0x1ae95: 0x6c91e420, 0x1ae96: 0x6c5c6420, 0x1ae97: 0x6c0f8820, - 0x1ae98: 0x6d1eba20, 0x1ae99: 0x6ca88620, 0x1ae9a: 0x6d1a9e20, 0x1ae9b: 0x6c56d620, - 0x1ae9c: 0x6c99ca20, 0x1ae9d: 0x6c52d220, 0x1ae9e: 0x6d30a820, 0x1ae9f: 0x6c846c20, - 0x1aea0: 0x6c8eb220, 0x1aea1: 0x6c4d8e20, 0x1aea2: 0x6ca45620, 0x1aea3: 0x6cff2e20, - 0x1aea4: 0x6ca08220, 0x1aea5: 0x6d0ee620, 0x1aea6: 0x6c86e820, 0x1aea7: 0x6c916820, - 0x1aea8: 0x6c8fba20, 0x1aea9: 0x6ca08c20, 0x1aeaa: 0x6c28dc20, 0x1aeab: 0x6c193a20, - 0x1aeac: 0x6cb21e20, 0x1aead: 0x6cb07c20, 0x1aeae: 0x6cfe5c20, 0x1aeaf: 0x6c5e2420, - 0x1aeb0: 0x6ca08e20, 0x1aeb1: 0x6cf91e20, 0x1aeb2: 0x6c34c220, 0x1aeb3: 0x6c7ab220, - 0x1aeb4: 0x6d0ce820, 0x1aeb5: 0x6c154e20, 0x1aeb6: 0x6d1c1820, 0x1aeb7: 0x6cc50420, - 0x1aeb8: 0x6c2d3020, 0x1aeb9: 0x6c7ede20, 0x1aeba: 0x6cded620, 0x1aebb: 0x6cff4c20, - 0x1aebc: 0x6c74fc20, 0x1aebd: 0x6c21e420, 0x1aebe: 0x6c583c20, 0x1aebf: 0x6c5e3c20, - // Block 0x6bb, offset 0x1aec0 - 0x1aec0: 0x6d3bfe20, 0x1aec1: 0x6ca8aa20, 0x1aec2: 0x6cff4e20, 0x1aec3: 0x6c10ee20, - 0x1aec4: 0x6c84a420, 0x1aec5: 0x6c161620, 0x1aec6: 0x6c14a820, 0x1aec7: 0x6c876020, - 0x1aec8: 0x6d194020, 0x1aec9: 0x6c953620, 0x1aeca: 0x6ca45e20, 0x1aecb: 0x6d28dc20, - 0x1aecc: 0x6cda6e20, 0x1aecd: 0x6cf82420, 0x1aece: 0x6d2b7e20, 0x1aecf: 0x6c654e20, - 0x1aed0: 0x6d28de20, 0x1aed1: 0x6d3a8e20, 0x1aed2: 0x6c800620, 0x1aed3: 0x6ca8c220, - 0x1aed4: 0x6ca45220, 0x1aed5: 0x6c806220, 0x1aed6: 0x6c8f6420, 0x1aed7: 0x6ceed620, - 0x1aed8: 0x6c5b1220, 0x1aed9: 0x6d199c20, 0x1aeda: 0x6cbff020, 0x1aedb: 0x6cd87420, - 0x1aedc: 0x6ca8e220, 0x1aedd: 0x6c656220, 0x1aede: 0x6c5b1420, 0x1aedf: 0x6d031420, - 0x1aee0: 0x6d199e20, 0x1aee1: 0x6ca3dc20, 0x1aee2: 0x6ce94420, 0x1aee3: 0x6ce94620, - 0x1aee4: 0x6c33d620, 0x1aee5: 0x6c777c20, 0x1aee6: 0x6d24c620, 0x1aee7: 0x6c6ef420, - 0x1aee8: 0x6cb0ec20, 0x1aee9: 0x6d277c20, 0x1aeea: 0x6c22f620, 0x1aeeb: 0x6c551c20, - 0x1aeec: 0x6c5b1820, 0x1aeed: 0x6d253a20, 0x1aeee: 0x6c354a20, 0x1aeef: 0x6c4c5620, - 0x1aef0: 0x6c7dca20, 0x1aef1: 0x6c22f820, 0x1aef2: 0x6ce6ee20, 0x1aef3: 0x6ce88420, - 0x1aef4: 0x6ceedc20, 0x1aef5: 0x6c94d820, 0x1aef6: 0x6c4c5a20, 0x1aef7: 0x6cc43020, - 0x1aef8: 0x6cc64020, 0x1aef9: 0x6c8c9e20, 0x1aefa: 0x6c47fe20, 0x1aefb: 0x6c4c5c20, - 0x1aefc: 0x6cdf0020, 0x1aefd: 0x6c4c5e20, 0x1aefe: 0x6ce88820, 0x1aeff: 0x6d202020, - // Block 0x6bc, offset 0x1af00 - 0x1af00: 0x6c4c6220, 0x1af01: 0x6d1a4220, 0x1af02: 0x6c5d2020, 0x1af03: 0x6cb48620, - 0x1af04: 0x6d223820, 0x1af05: 0x6c4dee20, 0x1af06: 0x6d255020, 0x1af07: 0x6c94ea20, - 0x1af08: 0x6cc29620, 0x1af09: 0x6d224820, 0x1af0a: 0x6cbe3e20, 0x1af0b: 0x6c4c6620, - 0x1af0c: 0x6c1ffa20, 0x1af0d: 0x6cef0820, 0x1af0e: 0x6d256020, 0x1af0f: 0x6cc29a20, - 0x1af10: 0x6c7a4020, 0x1af11: 0x6c400a20, 0x1af12: 0x6d257420, 0x1af13: 0x6d257620, - 0x1af14: 0x6d0bbc20, 0x1af15: 0x6ce8b620, 0x1af16: 0x6ce8d420, 0x1af17: 0x6ce8d620, - 0x1af18: 0x6ce95020, 0x1af19: 0x6c94b820, 0x1af1a: 0x6c5c0c20, 0x1af1b: 0x6d188220, - 0x1af1c: 0x6c589220, 0x1af1d: 0x6c944a20, 0x1af1e: 0x6c946e20, 0x1af1f: 0x6ce91020, - 0x1af20: 0x6d0b6620, 0x1af21: 0x6ce91220, 0x1af22: 0x6ce6aa20, 0x1af23: 0x6cd15220, - 0x1af24: 0x6cb48020, 0x1af25: 0x6c920c20, 0x1af26: 0x6c7b5020, 0x1af27: 0x6d0ac620, - 0x1af28: 0x6d292820, 0x1af29: 0x6ceeda20, 0x1af2a: 0x6c436620, 0x1af2b: 0x6d22be20, - 0x1af2c: 0x6cf34020, 0x1af2d: 0x6c4a3420, 0x1af2e: 0x6cb04820, 0x1af2f: 0x6d145020, - 0x1af30: 0x6c2a8a20, 0x1af31: 0x6cb89220, 0x1af32: 0x6cb89420, 0x1af33: 0x6d320e20, - 0x1af34: 0x6d3d1a20, 0x1af35: 0x6c295220, 0x1af36: 0x6cb83e20, 0x1af37: 0x6cfa6220, - 0x1af38: 0x6ccdf620, 0x1af39: 0x6c7bd820, 0x1af3a: 0x6c16e220, 0x1af3b: 0x6cb56e20, - 0x1af3c: 0x6ca7f220, 0x1af3d: 0x6ca0c220, 0x1af3e: 0x6c5e7620, 0x1af3f: 0x6c639820, - // Block 0x6bd, offset 0x1af40 - 0x1af40: 0x6d34dc20, 0x1af41: 0x6d34de20, 0x1af42: 0x6c04b420, 0x1af43: 0x6d098e20, - 0x1af44: 0x6d167a20, 0x1af45: 0x6cbdc620, 0x1af46: 0x6c99d020, 0x1af47: 0x6c755620, - 0x1af48: 0x6cc6f220, 0x1af49: 0x6cea3c20, 0x1af4a: 0x6c39e820, 0x1af4b: 0x6c07a420, - 0x1af4c: 0x6c07a620, 0x1af4d: 0x6cdf8820, 0x1af4e: 0x6c76be20, 0x1af4f: 0x6c580a20, - 0x1af50: 0x6d427620, 0x1af51: 0x6c792620, 0x1af52: 0x6c091820, 0x1af53: 0x6c6e0a20, - 0x1af54: 0x6c2c1220, 0x1af55: 0x6c6d8620, 0x1af56: 0x6c617c20, 0x1af57: 0x6c7b0c20, - 0x1af58: 0x6c2bcc20, 0x1af59: 0x6c6d8820, 0x1af5a: 0x6c646220, 0x1af5b: 0x6cdfca20, - 0x1af5c: 0x6c857e20, 0x1af5d: 0x6c03a620, 0x1af5e: 0x6cf4a420, 0x1af5f: 0x6c3b5020, - 0x1af60: 0x6d3c7a20, 0x1af61: 0x6cb2f620, 0x1af62: 0x6c04e220, 0x1af63: 0x6ce0bc20, - 0x1af64: 0x6c7d4a20, 0x1af65: 0x6cc0da20, 0x1af66: 0x6ce05220, 0x1af67: 0x6d339420, - 0x1af68: 0x6ceaea20, 0x1af69: 0x6c417020, 0x1af6a: 0x6cb27620, 0x1af6b: 0x6c2d3a20, - 0x1af6c: 0x6c48a820, 0x1af6d: 0x6ca5ba20, 0x1af6e: 0x6cdf1420, 0x1af6f: 0x6caf3020, - 0x1af70: 0x6c6ed620, 0x1af71: 0x6d100020, 0x1af72: 0x6c3d0a20, 0x1af73: 0x6c02c420, - 0x1af74: 0x6c921820, 0x1af75: 0x6cbf9c20, 0x1af76: 0x6ca22620, 0x1af77: 0x6c785420, - 0x1af78: 0x6c469220, 0x1af79: 0x6d094020, 0x1af7a: 0x6c036220, 0x1af7b: 0x6c1b0420, - 0x1af7c: 0x6c180020, 0x1af7d: 0x6c8ca020, 0x1af7e: 0x6d3aaa20, 0x1af7f: 0x6c3fb020, - // Block 0x6be, offset 0x1af80 - 0x1af80: 0x6c549a20, 0x1af81: 0x6d358420, 0x1af82: 0x6c20be20, 0x1af83: 0x6c7e3a20, - 0x1af84: 0x6c902e20, 0x1af85: 0x6c903020, 0x1af86: 0x6c913820, 0x1af87: 0x6c02c620, - 0x1af88: 0x6c272e20, 0x1af89: 0x6cad4820, 0x1af8a: 0x6c9fe220, 0x1af8b: 0x6d03ca20, - 0x1af8c: 0x6c305620, 0x1af8d: 0x6c619e20, 0x1af8e: 0x6c51ba20, 0x1af8f: 0x6c93ce20, - 0x1af90: 0x6c222820, 0x1af91: 0x6c1b8220, 0x1af92: 0x6c82ba20, 0x1af93: 0x6c40e420, - 0x1af94: 0x6d19aa20, 0x1af95: 0x6c546220, 0x1af96: 0x6c32f420, 0x1af97: 0x6d2f9c20, - 0x1af98: 0x6c3e0820, 0x1af99: 0x6c49dc20, 0x1af9a: 0x6d10d420, 0x1af9b: 0x6c347820, - 0x1af9c: 0x6c347a20, 0x1af9d: 0x6c4ad020, 0x1af9e: 0x6c13ca20, 0x1af9f: 0x6d0f8e20, - 0x1afa0: 0x6d1a3820, 0x1afa1: 0x6c37fe20, 0x1afa2: 0x6c469a20, 0x1afa3: 0x6d254420, - 0x1afa4: 0x6c2e6a20, 0x1afa5: 0x6d007620, 0x1afa6: 0x6c78fa20, 0x1afa7: 0x6cce3220, - 0x1afa8: 0x6cd43e20, 0x1afa9: 0x6c35ec20, 0x1afaa: 0x6c0e4020, 0x1afab: 0x6c2d4020, - 0x1afac: 0x6c530c20, 0x1afad: 0x6d0ad820, 0x1afae: 0x6c7ad620, 0x1afaf: 0x6c26f820, - 0x1afb0: 0x6c762020, 0x1afb1: 0x6c295a20, 0x1afb2: 0x6c764a20, 0x1afb3: 0x6c4f9e20, - 0x1afb4: 0x6ca4dc20, 0x1afb5: 0x6c017820, 0x1afb6: 0x6d036c20, 0x1afb7: 0x6cfc9c20, - 0x1afb8: 0x6d260820, 0x1afb9: 0x6c051a20, 0x1afba: 0x6c3d5a20, 0x1afbb: 0x6c03ae20, - 0x1afbc: 0x6d172020, 0x1afbd: 0x6d1b4220, 0x1afbe: 0x6c4e9220, 0x1afbf: 0x6d06a020, - // Block 0x6bf, offset 0x1afc0 - 0x1afc0: 0x6c20c420, 0x1afc1: 0x6cbd6220, 0x1afc2: 0x6c44f420, 0x1afc3: 0x6c001c20, - 0x1afc4: 0x6c081620, 0x1afc5: 0x6c39aa20, 0x1afc6: 0x6cc3a820, 0x1afc7: 0x6d1e2020, - 0x1afc8: 0x6c75a020, 0x1afc9: 0x6c633e20, 0x1afca: 0x6c2c2a20, 0x1afcb: 0x6c96fa20, - 0x1afcc: 0x6c811420, 0x1afcd: 0x6c731820, 0x1afce: 0x6c19c620, 0x1afcf: 0x6ccccc20, - 0x1afd0: 0x6c6c3c20, 0x1afd1: 0x6d303020, 0x1afd2: 0x6c8ae420, 0x1afd3: 0x6c8ae620, - 0x1afd4: 0x6c107e20, 0x1afd5: 0x6c19d820, 0x1afd6: 0x6c57d820, 0x1afd7: 0x6c108020, - 0x1afd8: 0x6cd25a20, 0x1afd9: 0x6d099420, 0x1afda: 0x6c4c1820, 0x1afdb: 0x6c6eda20, - 0x1afdc: 0x6d12a820, 0x1afdd: 0x6ca76020, 0x1afde: 0x6c2bee20, 0x1afdf: 0x6d230420, - 0x1afe0: 0x6c109220, 0x1afe1: 0x6d0ae820, 0x1afe2: 0x6cc2d420, 0x1afe3: 0x6cdc3420, - 0x1afe4: 0x6cafdc20, 0x1afe5: 0x6cbe4020, 0x1afe6: 0x6cecfe20, 0x1afe7: 0x6c723820, - 0x1afe8: 0x6c951420, 0x1afe9: 0x6d329220, 0x1afea: 0x6c796e20, 0x1afeb: 0x6c1d3820, - 0x1afec: 0x6c2fee20, 0x1afed: 0x6c275a20, 0x1afee: 0x6ce09220, 0x1afef: 0x6c018020, - 0x1aff0: 0x6c114220, 0x1aff1: 0x6c1f2e20, 0x1aff2: 0x6c081820, 0x1aff3: 0x6c76ce20, - 0x1aff4: 0x6d344c20, 0x1aff5: 0x6c348420, 0x1aff6: 0x6d175220, 0x1aff7: 0x6d344e20, - 0x1aff8: 0x6d175420, 0x1aff9: 0x6cadd020, 0x1affa: 0x6c5eb420, 0x1affb: 0x6d3cdc20, - 0x1affc: 0x6cb5b820, 0x1affd: 0x6ccaee20, 0x1affe: 0x6c723a20, 0x1afff: 0x6ca5d420, - // Block 0x6c0, offset 0x1b000 - 0x1b000: 0x6c7a3a20, 0x1b001: 0x6c78a020, 0x1b002: 0x6ce0ec20, 0x1b003: 0x6c7d5020, - 0x1b004: 0x6ca69620, 0x1b005: 0x6c648220, 0x1b006: 0x6c32fa20, 0x1b007: 0x6c6c8e20, - 0x1b008: 0x6c427620, 0x1b009: 0x6d230620, 0x1b00a: 0x6c360c20, 0x1b00b: 0x6cae9820, - 0x1b00c: 0x6c480820, 0x1b00d: 0x6ce92220, 0x1b00e: 0x6c839420, 0x1b00f: 0x6c39ea20, - 0x1b010: 0x6d0b2420, 0x1b011: 0x6cba4c20, 0x1b012: 0x6c7ddc20, 0x1b013: 0x6c01b620, - 0x1b014: 0x6cd0ca20, 0x1b015: 0x6c34e620, 0x1b016: 0x6ca4f220, 0x1b017: 0x6ce85c20, - 0x1b018: 0x6c19fa20, 0x1b019: 0x6d19da20, 0x1b01a: 0x6c5cea20, 0x1b01b: 0x6c099420, - 0x1b01c: 0x6c88f220, 0x1b01d: 0x6c4c1c20, 0x1b01e: 0x6c2e9a20, 0x1b01f: 0x6d3bc420, - 0x1b020: 0x6c547020, 0x1b021: 0x6c05fa20, 0x1b022: 0x6c05fc20, 0x1b023: 0x6d211420, - 0x1b024: 0x6c2b2e20, 0x1b025: 0x6c98e220, 0x1b026: 0x6c6a0c20, 0x1b027: 0x6cc83c20, - 0x1b028: 0x6d12ec20, 0x1b029: 0x6c452e20, 0x1b02a: 0x6c76aa20, 0x1b02b: 0x6d3f8020, - 0x1b02c: 0x6d211620, 0x1b02d: 0x6c59bc20, 0x1b02e: 0x6c362c20, 0x1b02f: 0x6d10f620, - 0x1b030: 0x6d0e6c20, 0x1b031: 0x6c064c20, 0x1b032: 0x6c223620, 0x1b033: 0x6c99f620, - 0x1b034: 0x6c16ec20, 0x1b035: 0x6c321420, 0x1b036: 0x6ceb1c20, 0x1b037: 0x6d1b5020, - 0x1b038: 0x6c3ca620, 0x1b039: 0x6d382820, 0x1b03a: 0x6c6be820, 0x1b03b: 0x6c6c4420, - 0x1b03c: 0x6c528820, 0x1b03d: 0x6c428620, 0x1b03e: 0x6c210620, 0x1b03f: 0x6c658e20, - // Block 0x6c1, offset 0x1b040 - 0x1b040: 0x6cb2ec20, 0x1b041: 0x6c836a20, 0x1b042: 0x6cfe3220, 0x1b043: 0x6c599220, - 0x1b044: 0x6c837620, 0x1b045: 0x6c32c020, 0x1b046: 0x6cec8e20, 0x1b047: 0x6d079220, - 0x1b048: 0x6c61fe20, 0x1b049: 0x6c604a20, 0x1b04a: 0x6c7b2420, 0x1b04b: 0x6d1c7c20, - 0x1b04c: 0x6cddee20, 0x1b04d: 0x6c1a1620, 0x1b04e: 0x6d1e4220, 0x1b04f: 0x6c765c20, - 0x1b050: 0x6cdac020, 0x1b051: 0x6cdac220, 0x1b052: 0x6cd26e20, 0x1b053: 0x6c9d4e20, - 0x1b054: 0x6cde0820, 0x1b055: 0x6cf24e20, 0x1b056: 0x6c1a1820, 0x1b057: 0x6ce8b820, - 0x1b058: 0x6ce0fe20, 0x1b059: 0x6cc3c820, 0x1b05a: 0x6d37f420, 0x1b05b: 0x6c862a20, - 0x1b05c: 0x6d37f620, 0x1b05d: 0x6c057620, 0x1b05e: 0x6cc9c620, 0x1b05f: 0x6d2a0620, - 0x1b060: 0x6c330020, 0x1b061: 0x6ce4a820, 0x1b062: 0x6cf4f820, 0x1b063: 0x6d335020, - 0x1b064: 0x6d099c20, 0x1b065: 0x6c440420, 0x1b066: 0x6d324020, 0x1b067: 0x6c00a420, - 0x1b068: 0x6c459020, 0x1b069: 0x6d0ca620, 0x1b06a: 0x6c76da20, 0x1b06b: 0x6ce4aa20, - 0x1b06c: 0x6d257820, 0x1b06d: 0x6cf14e20, 0x1b06e: 0x6d01be20, 0x1b06f: 0x6c8f3220, - 0x1b070: 0x6c4d8c20, 0x1b071: 0x6c810220, 0x1b072: 0x6c16b620, 0x1b073: 0x6caea820, - 0x1b074: 0x6c084820, 0x1b075: 0x6c18da20, 0x1b076: 0x6c927820, 0x1b077: 0x6c91c620, - 0x1b078: 0x6cab3c20, 0x1b079: 0x6cba6220, 0x1b07a: 0x6c9a1620, 0x1b07b: 0x6ca12620, - 0x1b07c: 0x6d3b8220, 0x1b07d: 0x6cd6d420, 0x1b07e: 0x6cd52e20, 0x1b07f: 0x6c90e820, - // Block 0x6c2, offset 0x1b080 - 0x1b080: 0x6c1b4620, 0x1b081: 0x6c97e220, 0x1b082: 0x6c0c0620, 0x1b083: 0x6c6e9420, - 0x1b084: 0x6c130020, 0x1b085: 0x6cd5ee20, 0x1b086: 0x6d367a20, 0x1b087: 0x6d2ec020, - 0x1b088: 0x6c770a20, 0x1b089: 0x6d1d9620, 0x1b08a: 0x6c2d6e20, 0x1b08b: 0x6c190820, - 0x1b08c: 0x6d347c20, 0x1b08d: 0x6cf8ac20, 0x1b08e: 0x6c4c2420, 0x1b08f: 0x6cbb4620, - 0x1b090: 0x6c6d2220, 0x1b091: 0x6c2c7a20, 0x1b092: 0x6cce0a20, 0x1b093: 0x6ca29020, - 0x1b094: 0x6c24d220, 0x1b095: 0x6d0e9220, 0x1b096: 0x6cde1020, 0x1b097: 0x6d2b8220, - 0x1b098: 0x6cb9ac20, 0x1b099: 0x6cbb1020, 0x1b09a: 0x6c895e20, 0x1b09b: 0x6cf14220, - 0x1b09c: 0x6d3c9a20, 0x1b09d: 0x6cbb9820, 0x1b09e: 0x6d2b8620, 0x1b09f: 0x6d05ba20, - 0x1b0a0: 0x6ccd9a20, 0x1b0a1: 0x6ccd9c20, 0x1b0a2: 0x6c038e20, 0x1b0a3: 0x6cb44820, - 0x1b0a4: 0x6c7b3220, 0x1b0a5: 0x6c303220, 0x1b0a6: 0x6c38b020, 0x1b0a7: 0x6cc3e820, - 0x1b0a8: 0x6ca16020, 0x1b0a9: 0x6c33a020, 0x1b0aa: 0x6c33a220, 0x1b0ab: 0x6d41ea20, - 0x1b0ac: 0x6c2c7c20, 0x1b0ad: 0x6cd17220, 0x1b0ae: 0x6c350820, 0x1b0af: 0x6c350e20, - 0x1b0b0: 0x6cdffc20, 0x1b0b1: 0x6c2ae020, 0x1b0b2: 0x6ca21820, 0x1b0b3: 0x6c3b8420, - 0x1b0b4: 0x6c59d820, 0x1b0b5: 0x6cdffe20, 0x1b0b6: 0x6c26fe20, 0x1b0b7: 0x6d12fa20, - 0x1b0b8: 0x6d3b5220, 0x1b0b9: 0x6c673a20, 0x1b0ba: 0x6c02e420, 0x1b0bb: 0x6cbb1e20, - 0x1b0bc: 0x6c5f2c20, 0x1b0bd: 0x6cbba220, 0x1b0be: 0x6c790a20, 0x1b0bf: 0x6d188420, - // Block 0x6c3, offset 0x1b0c0 - 0x1b0c0: 0x6cb01a20, 0x1b0c1: 0x6c0a4420, 0x1b0c2: 0x6c2d7c20, 0x1b0c3: 0x6c677820, - 0x1b0c4: 0x6d12b420, 0x1b0c5: 0x6d1dae20, 0x1b0c6: 0x6d091620, 0x1b0c7: 0x6ce00c20, - 0x1b0c8: 0x6c803820, 0x1b0c9: 0x6c728820, 0x1b0ca: 0x6c581420, 0x1b0cb: 0x6c298e20, - 0x1b0cc: 0x6cc50220, 0x1b0cd: 0x6cba8020, 0x1b0ce: 0x6d09ae20, 0x1b0cf: 0x6cfd1820, - 0x1b0d0: 0x6cf81620, 0x1b0d1: 0x6c51ee20, 0x1b0d2: 0x6c00c620, 0x1b0d3: 0x6d0b0020, - 0x1b0d4: 0x6c29ee20, 0x1b0d5: 0x6c4fee20, 0x1b0d6: 0x6cc84a20, 0x1b0d7: 0x6c6d8220, - 0x1b0d8: 0x6c82e220, 0x1b0d9: 0x6c7c0620, 0x1b0da: 0x6c916a20, 0x1b0db: 0x6d0cea20, - 0x1b0dc: 0x6ce03020, 0x1b0dd: 0x6cf03820, 0x1b0de: 0x6c581820, 0x1b0df: 0x6c903e20, - 0x1b0e0: 0x6c904020, 0x1b0e1: 0x6cc8ec20, 0x1b0e2: 0x6c86ea20, 0x1b0e3: 0x6c8bfe20, - 0x1b0e4: 0x6cc50620, 0x1b0e5: 0x6c165c20, 0x1b0e6: 0x6d09c420, 0x1b0e7: 0x6d0d0c20, - 0x1b0e8: 0x6c829620, 0x1b0e9: 0x6c03da20, 0x1b0ea: 0x6ceca620, 0x1b0eb: 0x6cd2e220, - 0x1b0ec: 0x6cc56020, 0x1b0ed: 0x6cca6220, 0x1b0ee: 0x6d3c2c20, 0x1b0ef: 0x6d3c2e20, - 0x1b0f0: 0x6cd0dc20, 0x1b0f1: 0x6d13c620, 0x1b0f2: 0x6c972420, 0x1b0f3: 0x6c784a20, - 0x1b0f4: 0x6d3aba20, 0x1b0f5: 0x6d3c3620, 0x1b0f6: 0x6c553020, 0x1b0f7: 0x6c554020, - 0x1b0f8: 0x6c7da620, 0x1b0f9: 0x6d13ee20, 0x1b0fa: 0x6c555420, 0x1b0fb: 0x6d06d020, - 0x1b0fc: 0x6c7db220, 0x1b0fd: 0x6cd46e20, 0x1b0fe: 0x6c989420, 0x1b0ff: 0x6d41ec20, - // Block 0x6c4, offset 0x1b100 - 0x1b100: 0x6cd47020, 0x1b101: 0x6d141220, 0x1b102: 0x6d34ca20, 0x1b103: 0x6c474e20, - 0x1b104: 0x6c1f0220, 0x1b105: 0x6c67d220, 0x1b106: 0x6c3c9c20, 0x1b107: 0x6c06e020, - 0x1b108: 0x6d2d5820, 0x1b109: 0x6c0b8420, 0x1b10a: 0x6cdba620, 0x1b10b: 0x6cc42e20, - 0x1b10c: 0x6c8ca220, 0x1b10d: 0x6c3fc020, 0x1b10e: 0x6c261420, 0x1b10f: 0x6cfa3220, - 0x1b110: 0x6d049a20, 0x1b111: 0x6d02a020, 0x1b112: 0x6ca4cc20, 0x1b113: 0x6cfa5a20, - 0x1b114: 0x6c7cb420, 0x1b115: 0x6cf55a20, 0x1b116: 0x6cec6820, 0x1b117: 0x6d25f820, - 0x1b118: 0x6c992020, 0x1b119: 0x6cda7c20, 0x1b11a: 0x6c341620, 0x1b11b: 0x6c341820, - 0x1b11c: 0x6d12ca20, 0x1b11d: 0x6cbe6c20, 0x1b11e: 0x6cec6e20, 0x1b11f: 0x6c46a220, - 0x1b120: 0x6c46a420, 0x1b121: 0x6cb78820, 0x1b122: 0x6c9c0420, 0x1b123: 0x6c9c0820, - 0x1b124: 0x6d1a8020, 0x1b125: 0x6c5d9420, 0x1b126: 0x6c190c20, 0x1b127: 0x6c26e420, - 0x1b128: 0x6d2b3020, 0x1b129: 0x6ce45420, 0x1b12a: 0x6cdf5a20, 0x1b12b: 0x6c40a620, - 0x1b12c: 0x6c48e220, 0x1b12d: 0x6d108020, 0x1b12e: 0x6d0f4020, 0x1b12f: 0x6c4f4620, - 0x1b130: 0x6c42fa20, 0x1b131: 0x6cd18e20, 0x1b132: 0x6ce1aa20, 0x1b133: 0x6cdf5c20, - 0x1b134: 0x6ce7e420, 0x1b135: 0x6d0d3420, 0x1b136: 0x6c08b020, 0x1b137: 0x6d145220, - 0x1b138: 0x6c7ab820, 0x1b139: 0x6c631c20, 0x1b13a: 0x6c343a20, 0x1b13b: 0x6c577c20, - 0x1b13c: 0x6c7bce20, 0x1b13d: 0x6d27d620, 0x1b13e: 0x6c632020, 0x1b13f: 0x6c031820, - // Block 0x6c5, offset 0x1b140 - 0x1b140: 0x6c370e20, 0x1b141: 0x6c87ec20, 0x1b142: 0x6c58ee20, 0x1b143: 0x6c2b1220, - 0x1b144: 0x6d0d4620, 0x1b145: 0x6cad7e20, 0x1b146: 0x6c733c20, 0x1b147: 0x6cb57c20, - 0x1b148: 0x6ca3ac20, 0x1b149: 0x6c3cd820, 0x1b14a: 0x6d007820, 0x1b14b: 0x6c3bcc20, - 0x1b14c: 0x6c2d0820, 0x1b14d: 0x6d107820, 0x1b14e: 0x6c7c5e20, 0x1b14f: 0x6d408620, - 0x1b150: 0x6c58f820, 0x1b151: 0x6cb75220, 0x1b152: 0x6c762620, 0x1b153: 0x6d2bc820, - 0x1b154: 0x6c077c20, 0x1b155: 0x6d16e020, 0x1b156: 0x6c679e20, 0x1b157: 0x6ce26220, - 0x1b158: 0x6d29fe20, 0x1b159: 0x6c079820, 0x1b15a: 0x6cf5b420, 0x1b15b: 0x6c5a5020, - 0x1b15c: 0x6c3a5020, 0x1b15d: 0x6c2dc020, 0x1b15e: 0x6d0a8620, 0x1b15f: 0x6c07e020, - 0x1b160: 0x6c2d5620, 0x1b161: 0x6c02d020, 0x1b162: 0x6cceea20, 0x1b163: 0x6cf24c20, - 0x1b164: 0x6c4d0220, 0x1b165: 0x6c02d220, 0x1b166: 0x6cf4fa20, 0x1b167: 0x6c02d420, - 0x1b168: 0x6c67ac20, 0x1b169: 0x6c881c20, 0x1b16a: 0x6c345a20, 0x1b16b: 0x6d275e20, - 0x1b16c: 0x6c67ae20, 0x1b16d: 0x6cd3c420, 0x1b16e: 0x6c3be620, 0x1b16f: 0x6c5df620, - 0x1b170: 0x6c0a8620, 0x1b171: 0x6c944c20, 0x1b172: 0x6c34c620, 0x1b173: 0x6caa6e20, - 0x1b174: 0x6caa3a20, 0x1b175: 0x6c2f6820, 0x1b176: 0x6ca38e20, 0x1b177: 0x6cb89620, - 0x1b178: 0x6c645c20, 0x1b179: 0x6cddde20, 0x1b17a: 0x6c6fa220, 0x1b17b: 0x6caa8e20, - 0x1b17c: 0x6c142820, 0x1b17d: 0x6c500620, 0x1b17e: 0x6cfa7020, 0x1b17f: 0x6c391a20, - // Block 0x6c6, offset 0x1b180 - 0x1b180: 0x6c611a20, 0x1b181: 0x6cd76e20, 0x1b182: 0x6cc78a20, 0x1b183: 0x6c39f020, - 0x1b184: 0x6cee4420, 0x1b185: 0x6c52ec20, 0x1b186: 0x6d3c0620, 0x1b187: 0x6c3fa620, - 0x1b188: 0x6c965c20, 0x1b189: 0x6c27b420, 0x1b18a: 0x6cc5be20, 0x1b18b: 0x6c3d3a20, - 0x1b18c: 0x6c6e4820, 0x1b18d: 0x6d0c5620, 0x1b18e: 0x6c4d5420, 0x1b18f: 0x6cf1fc20, - 0x1b190: 0x6d378e20, 0x1b191: 0x6cabb020, 0x1b192: 0x6c323220, 0x1b193: 0x6c617e20, - 0x1b194: 0x6c792820, 0x1b195: 0x6d381220, 0x1b196: 0x6d108a20, 0x1b197: 0x6c6cd420, - 0x1b198: 0x6d277e20, 0x1b199: 0x6c9eaa20, 0x1b19a: 0x6c3d1e20, 0x1b19b: 0x6c1ca420, - 0x1b19c: 0x6d267a20, 0x1b19d: 0x6d3c0a20, 0x1b19e: 0x6ca96220, 0x1b19f: 0x6d0e3a20, - 0x1b1a0: 0x6ca30620, 0x1b1a1: 0x6d02a820, 0x1b1a2: 0x6c3b5220, 0x1b1a3: 0x6c08ba20, - 0x1b1a4: 0x6d20ae20, 0x1b1a5: 0x6ceb6e20, 0x1b1a6: 0x6c3c1820, 0x1b1a7: 0x6ced7220, - 0x1b1a8: 0x6c39a220, 0x1b1a9: 0x6cf41e20, 0x1b1aa: 0x6d22cc20, 0x1b1ab: 0x6c4a3620, - 0x1b1ac: 0x6c323a20, 0x1b1ad: 0x6c036420, 0x1b1ae: 0x6ca5b420, 0x1b1af: 0x6d38cc20, - 0x1b1b0: 0x6d3d2c20, 0x1b1b1: 0x6d2f5620, 0x1b1b2: 0x6c267c20, 0x1b1b3: 0x6ca39820, - 0x1b1b4: 0x6d25fe20, 0x1b1b5: 0x6ce80820, 0x1b1b6: 0x6cfb2a20, 0x1b1b7: 0x6d343c20, - 0x1b1b8: 0x6c353020, 0x1b1b9: 0x6c9a7420, 0x1b1ba: 0x6ca0c620, 0x1b1bb: 0x6cb4d020, - 0x1b1bc: 0x6c092a20, 0x1b1bd: 0x6ccfaa20, 0x1b1be: 0x6cbc9420, 0x1b1bf: 0x6c353220, - // Block 0x6c7, offset 0x1b1c0 - 0x1b1c0: 0x6c50c420, 0x1b1c1: 0x6d062c20, 0x1b1c2: 0x6c37f820, 0x1b1c3: 0x6d328420, - 0x1b1c4: 0x6c9f2820, 0x1b1c5: 0x6c04e620, 0x1b1c6: 0x6ca22820, 0x1b1c7: 0x6c3d3e20, - 0x1b1c8: 0x6c8ca420, 0x1b1c9: 0x6d3ee220, 0x1b1ca: 0x6d3ee420, 0x1b1cb: 0x6cd2b420, - 0x1b1cc: 0x6cc4ac20, 0x1b1cd: 0x6cccc020, 0x1b1ce: 0x6d0f4620, 0x1b1cf: 0x6c975c20, - 0x1b1d0: 0x6c6c1620, 0x1b1d1: 0x6c46ee20, 0x1b1d2: 0x6cd88020, 0x1b1d3: 0x6d041420, - 0x1b1d4: 0x6cef8e20, 0x1b1d5: 0x6d3e0c20, 0x1b1d6: 0x6c71f620, 0x1b1d7: 0x6cccc220, - 0x1b1d8: 0x6cb1e820, 0x1b1d9: 0x6cc5d420, 0x1b1da: 0x6d10d620, 0x1b1db: 0x6c305820, - 0x1b1dc: 0x6c674c20, 0x1b1dd: 0x6cd4b020, 0x1b1de: 0x6c5ff020, 0x1b1df: 0x6c40e620, - 0x1b1e0: 0x6cfe1c20, 0x1b1e1: 0x6c572a20, 0x1b1e2: 0x6c72da20, 0x1b1e3: 0x6c682c20, - 0x1b1e4: 0x6c469c20, 0x1b1e5: 0x6c81a220, 0x1b1e6: 0x6c647420, 0x1b1e7: 0x6c647620, - 0x1b1e8: 0x6d148c20, 0x1b1e9: 0x6ca75c20, 0x1b1ea: 0x6d344220, 0x1b1eb: 0x6c5e9820, - 0x1b1ec: 0x6c5ea220, 0x1b1ed: 0x6cfc8a20, 0x1b1ee: 0x6c525620, 0x1b1ef: 0x6c49de20, - 0x1b1f0: 0x6c756020, 0x1b1f1: 0x6c7ac020, 0x1b1f2: 0x6d0e4420, 0x1b1f3: 0x6ca02c20, - 0x1b1f4: 0x6c8ad020, 0x1b1f5: 0x6cae0a20, 0x1b1f6: 0x6c35ee20, 0x1b1f7: 0x6d202220, - 0x1b1f8: 0x6d0c6e20, 0x1b1f9: 0x6c143420, 0x1b1fa: 0x6ccfb820, 0x1b1fb: 0x6d19ae20, - 0x1b1fc: 0x6cd24e20, 0x1b1fd: 0x6c4ad220, 0x1b1fe: 0x6cc2be20, 0x1b1ff: 0x6d3e0e20, - // Block 0x6c8, offset 0x1b200 - 0x1b200: 0x6cd90820, 0x1b201: 0x6cee6820, 0x1b202: 0x6c530e20, 0x1b203: 0x6cec0420, - 0x1b204: 0x6c907e20, 0x1b205: 0x6d0b8420, 0x1b206: 0x6cc52020, 0x1b207: 0x6c682e20, - 0x1b208: 0x6c942e20, 0x1b209: 0x6cb24e20, 0x1b20a: 0x6cfc9e20, 0x1b20b: 0x6cced020, - 0x1b20c: 0x6c850820, 0x1b20d: 0x6c19c820, 0x1b20e: 0x6d017a20, 0x1b20f: 0x6c984a20, - 0x1b210: 0x6c3d5c20, 0x1b211: 0x6cdd1020, 0x1b212: 0x6c99e420, 0x1b213: 0x6cef9c20, - 0x1b214: 0x6c789420, 0x1b215: 0x6c21ae20, 0x1b216: 0x6c21b020, 0x1b217: 0x6ce6b820, - 0x1b218: 0x6ca78820, 0x1b219: 0x6d03da20, 0x1b21a: 0x6ca3ee20, 0x1b21b: 0x6d20ec20, - 0x1b21c: 0x6ca31a20, 0x1b21d: 0x6cb3c820, 0x1b21e: 0x6ca56820, 0x1b21f: 0x6c72e220, - 0x1b220: 0x6ccfc620, 0x1b221: 0x6d35ae20, 0x1b222: 0x6c4df020, 0x1b223: 0x6c2c2c20, - 0x1b224: 0x6d3c1020, 0x1b225: 0x6c355220, 0x1b226: 0x6cb20820, 0x1b227: 0x6ce9f820, - 0x1b228: 0x6cfca020, 0x1b229: 0x6c9e1020, 0x1b22a: 0x6cf3ae20, 0x1b22b: 0x6d0c7020, - 0x1b22c: 0x6cf44220, 0x1b22d: 0x6c001e20, 0x1b22e: 0x6d0c7c20, 0x1b22f: 0x6d20ee20, - 0x1b230: 0x6cd89a20, 0x1b231: 0x6d20f020, 0x1b232: 0x6cebd020, 0x1b233: 0x6c87de20, - 0x1b234: 0x6cfb3a20, 0x1b235: 0x6c707c20, 0x1b236: 0x6cc24220, 0x1b237: 0x6d3c8020, - 0x1b238: 0x6cb4e220, 0x1b239: 0x6cfb4020, 0x1b23a: 0x6d3d4820, 0x1b23b: 0x6c2ff020, - 0x1b23c: 0x6c166420, 0x1b23d: 0x6c923420, 0x1b23e: 0x6c006420, 0x1b23f: 0x6c353620, - // Block 0x6c9, offset 0x1b240 - 0x1b240: 0x6c353820, 0x1b241: 0x6c908620, 0x1b242: 0x6c9dbe20, 0x1b243: 0x6c239020, - 0x1b244: 0x6cb3f020, 0x1b245: 0x6c710e20, 0x1b246: 0x6cb32820, 0x1b247: 0x6c10f620, - 0x1b248: 0x6c8cde20, 0x1b249: 0x6ced0020, 0x1b24a: 0x6c0c7220, 0x1b24b: 0x6cfeb020, - 0x1b24c: 0x6cd52620, 0x1b24d: 0x6cb6f020, 0x1b24e: 0x6c5ab020, 0x1b24f: 0x6c394020, - 0x1b250: 0x6cf2b220, 0x1b251: 0x6cc89820, 0x1b252: 0x6cdfda20, 0x1b253: 0x6c39f820, - 0x1b254: 0x6c3b0420, 0x1b255: 0x6c6aae20, 0x1b256: 0x6ce46020, 0x1b257: 0x6ca5d620, - 0x1b258: 0x6cc2d820, 0x1b259: 0x6c6e5820, 0x1b25a: 0x6c5cbc20, 0x1b25b: 0x6c6da420, - 0x1b25c: 0x6cb8d220, 0x1b25d: 0x6c2d4c20, 0x1b25e: 0x6d042620, 0x1b25f: 0x6c568a20, - 0x1b260: 0x6cec8820, 0x1b261: 0x6c7ef220, 0x1b262: 0x6c097420, 0x1b263: 0x6d19dc20, - 0x1b264: 0x6c1d6820, 0x1b265: 0x6ca52e20, 0x1b266: 0x6c3fe420, 0x1b267: 0x6c6e6e20, - 0x1b268: 0x6c94ec20, 0x1b269: 0x6c01b820, 0x1b26a: 0x6c7f9420, 0x1b26b: 0x6c7d5220, - 0x1b26c: 0x6d1a5220, 0x1b26d: 0x6d0b9220, 0x1b26e: 0x6c707e20, 0x1b26f: 0x6c85e820, - 0x1b270: 0x6c2d1220, 0x1b271: 0x6cfb4220, 0x1b272: 0x6c57da20, 0x1b273: 0x6c579220, - 0x1b274: 0x6d1bac20, 0x1b275: 0x6c14ee20, 0x1b276: 0x6cd05a20, 0x1b277: 0x6ce66e20, - 0x1b278: 0x6c296420, 0x1b279: 0x6d11ac20, 0x1b27a: 0x6cf4e620, 0x1b27b: 0x6ca44820, - 0x1b27c: 0x6c21b220, 0x1b27d: 0x6c641420, 0x1b27e: 0x6ce7d820, 0x1b27f: 0x6d06d220, - // Block 0x6ca, offset 0x1b280 - 0x1b280: 0x6d233020, 0x1b281: 0x6cef0a20, 0x1b282: 0x6c2c5420, 0x1b283: 0x6cc74820, - 0x1b284: 0x6c9a5620, 0x1b285: 0x6c27de20, 0x1b286: 0x6cc86220, 0x1b287: 0x6cbd2c20, - 0x1b288: 0x6c5ab220, 0x1b289: 0x6cf2ea20, 0x1b28a: 0x6cb99420, 0x1b28b: 0x6c210820, - 0x1b28c: 0x6c9e7420, 0x1b28d: 0x6c3fec20, 0x1b28e: 0x6c6b9620, 0x1b28f: 0x6c329820, - 0x1b290: 0x6d151420, 0x1b291: 0x6d382a20, 0x1b292: 0x6c99f820, 0x1b293: 0x6c59be20, - 0x1b294: 0x6c9dc220, 0x1b295: 0x6c013020, 0x1b296: 0x6d1bae20, 0x1b297: 0x6d079420, - 0x1b298: 0x6c6a0e20, 0x1b299: 0x6cee8220, 0x1b29a: 0x6c9a8e20, 0x1b29b: 0x6d261620, - 0x1b29c: 0x6d32c220, 0x1b29d: 0x6cbfae20, 0x1b29e: 0x6cd37a20, 0x1b29f: 0x6d01a820, - 0x1b2a0: 0x6ceb7c20, 0x1b2a1: 0x6c88f620, 0x1b2a2: 0x6c997820, 0x1b2a3: 0x6cc4c420, - 0x1b2a4: 0x6cd7e620, 0x1b2a5: 0x6cb0f220, 0x1b2a6: 0x6cf08e20, 0x1b2a7: 0x6cebd820, - 0x1b2a8: 0x6c6ff420, 0x1b2a9: 0x6c555620, 0x1b2aa: 0x6c02a620, 0x1b2ab: 0x6cbd1420, - 0x1b2ac: 0x6c05fe20, 0x1b2ad: 0x6d059220, 0x1b2ae: 0x6ce7da20, 0x1b2af: 0x6c4a6420, - 0x1b2b0: 0x6c1e8a20, 0x1b2b1: 0x6d110620, 0x1b2b2: 0x6cb09e20, 0x1b2b3: 0x6cf78420, - 0x1b2b4: 0x6d257a20, 0x1b2b5: 0x6d1d4020, 0x1b2b6: 0x6cc67020, 0x1b2b7: 0x6cc81a20, - 0x1b2b8: 0x6c1ab620, 0x1b2b9: 0x6c8e6620, 0x1b2ba: 0x6c9a5e20, 0x1b2bb: 0x6cac5c20, - 0x1b2bc: 0x6c02a820, 0x1b2bd: 0x6c966020, 0x1b2be: 0x6c46ae20, 0x1b2bf: 0x6c7cf620, - // Block 0x6cb, offset 0x1b2c0 - 0x1b2c0: 0x6cbd8020, 0x1b2c1: 0x6c644820, 0x1b2c2: 0x6ccae420, 0x1b2c3: 0x6d315e20, - 0x1b2c4: 0x6d257c20, 0x1b2c5: 0x6c6a1020, 0x1b2c6: 0x6cc68020, 0x1b2c7: 0x6ca00420, - 0x1b2c8: 0x6d1bc220, 0x1b2c9: 0x6c604c20, 0x1b2ca: 0x6cdac820, 0x1b2cb: 0x6ca79c20, - 0x1b2cc: 0x6cfb6c20, 0x1b2cd: 0x6ce1ce20, 0x1b2ce: 0x6cad0020, 0x1b2cf: 0x6c80b220, - 0x1b2d0: 0x6ca4fc20, 0x1b2d1: 0x6c05ca20, 0x1b2d2: 0x6c00a620, 0x1b2d3: 0x6cb0a020, - 0x1b2d4: 0x6cb20e20, 0x1b2d5: 0x6d182020, 0x1b2d6: 0x6cb17e20, 0x1b2d7: 0x6d238a20, - 0x1b2d8: 0x6c824220, 0x1b2d9: 0x6d081820, 0x1b2da: 0x6c975820, 0x1b2db: 0x6d140020, - 0x1b2dc: 0x6d2ec220, 0x1b2dd: 0x6c773820, 0x1b2de: 0x6d1d9820, 0x1b2df: 0x6ca6a820, - 0x1b2e0: 0x6c840e20, 0x1b2e1: 0x6c2b7a20, 0x1b2e2: 0x6c4a7820, 0x1b2e3: 0x6d0c1a20, - 0x1b2e4: 0x6c6c9c20, 0x1b2e5: 0x6d3b8420, 0x1b2e6: 0x6c16b820, 0x1b2e7: 0x6d2ada20, - 0x1b2e8: 0x6c4dac20, 0x1b2e9: 0x6ca59c20, 0x1b2ea: 0x6c81d820, 0x1b2eb: 0x6ca05c20, - 0x1b2ec: 0x6d300220, 0x1b2ed: 0x6c56ae20, 0x1b2ee: 0x6c56b020, 0x1b2ef: 0x6c02d620, - 0x1b2f0: 0x6ca59e20, 0x1b2f1: 0x6cbb1220, 0x1b2f2: 0x6c96f620, 0x1b2f3: 0x6cb1e420, - 0x1b2f4: 0x6c472a20, 0x1b2f5: 0x6cf46020, 0x1b2f6: 0x6cbbea20, 0x1b2f7: 0x6ceb8820, - 0x1b2f8: 0x6d2e1020, 0x1b2f9: 0x6c98f020, 0x1b2fa: 0x6cfb7820, 0x1b2fb: 0x6cfb7a20, - 0x1b2fc: 0x6ca14a20, 0x1b2fd: 0x6c8a0420, 0x1b2fe: 0x6c883020, 0x1b2ff: 0x6c57b820, - // Block 0x6cc, offset 0x1b300 - 0x1b300: 0x6c4a8420, 0x1b301: 0x6c2aa620, 0x1b302: 0x6d348c20, 0x1b303: 0x6d05ce20, - 0x1b304: 0x6d140a20, 0x1b305: 0x6c579c20, 0x1b306: 0x6cf69220, 0x1b307: 0x6c7d0a20, - 0x1b308: 0x6cc52820, 0x1b309: 0x6cf69420, 0x1b30a: 0x6d0ea020, 0x1b30b: 0x6c151820, - 0x1b30c: 0x6c686420, 0x1b30d: 0x6c9a6620, 0x1b30e: 0x6c396820, 0x1b30f: 0x6c385620, - 0x1b310: 0x6cfad420, 0x1b311: 0x6d188620, 0x1b312: 0x6c5c2a20, 0x1b313: 0x6c69c420, - 0x1b314: 0x6c405220, 0x1b315: 0x6cd3d820, 0x1b316: 0x6c0a4620, 0x1b317: 0x6ccda420, - 0x1b318: 0x6cdc5a20, 0x1b319: 0x6cbb2020, 0x1b31a: 0x6c88c820, 0x1b31b: 0x6c589420, - 0x1b31c: 0x6d02ec20, 0x1b31d: 0x6ca7aa20, 0x1b31e: 0x6c303420, 0x1b31f: 0x6d188820, - 0x1b320: 0x6c117020, 0x1b321: 0x6c00c820, 0x1b322: 0x6ca77820, 0x1b323: 0x6ca92220, - 0x1b324: 0x6c966420, 0x1b325: 0x6ce5ce20, 0x1b326: 0x6c1de220, 0x1b327: 0x6c6d5820, - 0x1b328: 0x6c226820, 0x1b329: 0x6d219e20, 0x1b32a: 0x6cb21620, 0x1b32b: 0x6cc6be20, - 0x1b32c: 0x6cc7ce20, 0x1b32d: 0x6ca3a820, 0x1b32e: 0x6d0c3220, 0x1b32f: 0x6cdf4620, - 0x1b330: 0x6d1bfc20, 0x1b331: 0x6c11b620, 0x1b332: 0x6ca7b220, 0x1b333: 0x6d26ea20, - 0x1b334: 0x6d1c9620, 0x1b335: 0x6c9dd620, 0x1b336: 0x6c0ae620, 0x1b337: 0x6c966620, - 0x1b338: 0x6cd08020, 0x1b339: 0x6d043e20, 0x1b33a: 0x6ca6d420, 0x1b33b: 0x6c31c820, - 0x1b33c: 0x6c8f2020, 0x1b33d: 0x6d251c20, 0x1b33e: 0x6c804820, 0x1b33f: 0x6d0ee820, - // Block 0x6cd, offset 0x1b340 - 0x1b340: 0x6cd6a820, 0x1b341: 0x6c8d8c20, 0x1b342: 0x6c696620, 0x1b343: 0x6ca77a20, - 0x1b344: 0x6c804c20, 0x1b345: 0x6cb94420, 0x1b346: 0x6d1c1a20, 0x1b347: 0x6cd6ae20, - 0x1b348: 0x6c5c9020, 0x1b349: 0x6cc32620, 0x1b34a: 0x6c9d0a20, 0x1b34b: 0x6c84b820, - 0x1b34c: 0x6c944e20, 0x1b34d: 0x6d0d0e20, 0x1b34e: 0x6d3a4020, 0x1b34f: 0x6c805820, - 0x1b350: 0x6d3f6820, 0x1b351: 0x6c6a5220, 0x1b352: 0x6c73c420, 0x1b353: 0x6c73c620, - 0x1b354: 0x6c799220, 0x1b355: 0x6d281220, 0x1b356: 0x6c965e20, 0x1b357: 0x6d3f2820, - 0x1b358: 0x6c25a020, 0x1b359: 0x6cdcca20, 0x1b35a: 0x6c3dd620, 0x1b35b: 0x6c06d620, - 0x1b35c: 0x6d3e0020, 0x1b35d: 0x6cffcc20, 0x1b35e: 0x6d031a20, 0x1b35f: 0x6c9bfe20, - 0x1b360: 0x6cd88c20, 0x1b361: 0x6cdf0220, 0x1b362: 0x6c05a420, 0x1b363: 0x6c619220, - 0x1b364: 0x6c46f020, 0x1b365: 0x6caa3c20, 0x1b366: 0x6d08f820, 0x1b367: 0x6d206a20, - 0x1b368: 0x6d3ba220, 0x1b369: 0x6c4d1e20, 0x1b36a: 0x6c943020, 0x1b36b: 0x6cdcd020, - 0x1b36c: 0x6ca48e20, 0x1b36d: 0x6c9ec420, 0x1b36e: 0x6c239220, 0x1b36f: 0x6cb8d420, - 0x1b370: 0x6cd52820, 0x1b371: 0x6c11f620, 0x1b372: 0x6d0aea20, 0x1b373: 0x6d3e3420, - 0x1b374: 0x6ca63e20, 0x1b375: 0x6c3d8820, 0x1b376: 0x6d3e4e20, 0x1b377: 0x6c841020, - 0x1b378: 0x6d091820, 0x1b379: 0x6c0ff620, 0x1b37a: 0x6cc7d020, 0x1b37b: 0x6ca38820, - 0x1b37c: 0x6ca89020, 0x1b37d: 0x6ca89220, 0x1b37e: 0x6d1c1c20, 0x1b37f: 0x6c945020, - // Block 0x6ce, offset 0x1b380 - 0x1b380: 0x6c9db620, 0x1b381: 0x6ca8f220, 0x1b382: 0x6cc6ee20, 0x1b383: 0x6cdddc20, - 0x1b384: 0x6c4ab820, 0x1b385: 0x6d2d1820, 0x1b386: 0x6cbef820, 0x1b387: 0x6d221620, - 0x1b388: 0x6cd43a20, 0x1b389: 0x6c011220, 0x1b38a: 0x6ce83820, 0x1b38b: 0x6cd97e20, - 0x1b38c: 0x6cecc020, 0x1b38d: 0x6cc78420, 0x1b38e: 0x6d118220, 0x1b38f: 0x6c52f220, - 0x1b390: 0x6d145e20, 0x1b391: 0x6c6e0c20, 0x1b392: 0x6d3cc820, 0x1b393: 0x6c9d2220, - 0x1b394: 0x6d3a5820, 0x1b395: 0x6c295620, 0x1b396: 0x6c530020, 0x1b397: 0x6d3f7020, - 0x1b398: 0x6c490420, 0x1b399: 0x6d38fe20, 0x1b39a: 0x6c2f9620, 0x1b39b: 0x6cecee20, - 0x1b39c: 0x6d198e20, 0x1b39d: 0x6c05e220, 0x1b39e: 0x6cd24220, 0x1b39f: 0x6cd24420, - 0x1b3a0: 0x6c1d3620, 0x1b3a1: 0x6cd04620, 0x1b3a2: 0x6c788c20, 0x1b3a3: 0x6d078220, - 0x1b3a4: 0x6cd32c20, 0x1b3a5: 0x6d202420, 0x1b3a6: 0x6c58fa20, 0x1b3a7: 0x6d14b820, - 0x1b3a8: 0x6ce5b820, 0x1b3a9: 0x6cd2be20, 0x1b3aa: 0x6cfc8c20, 0x1b3ab: 0x6c456e20, - 0x1b3ac: 0x6c19ca20, 0x1b3ad: 0x6cc44220, 0x1b3ae: 0x6c457a20, 0x1b3af: 0x6cfe9420, - 0x1b3b0: 0x6d291220, 0x1b3b1: 0x6d2cba20, 0x1b3b2: 0x6c05f020, 0x1b3b3: 0x6c4d5e20, - 0x1b3b4: 0x6d0e4e20, 0x1b3b5: 0x6cfe9620, 0x1b3b6: 0x6c634020, 0x1b3b7: 0x6cd05020, - 0x1b3b8: 0x6c18ae20, 0x1b3b9: 0x6cc66020, 0x1b3ba: 0x6c5a4c20, 0x1b3bb: 0x6c9d3020, - 0x1b3bc: 0x6c79e020, 0x1b3bd: 0x6c7b5220, 0x1b3be: 0x6c0d2e20, 0x1b3bf: 0x6cdaa020, - // Block 0x6cf, offset 0x1b3c0 - 0x1b3c0: 0x6c112420, 0x1b3c1: 0x6d296620, 0x1b3c2: 0x6c61de20, 0x1b3c3: 0x6d24da20, - 0x1b3c4: 0x6c61e020, 0x1b3c5: 0x6d1a5420, 0x1b3c6: 0x6c9d3620, 0x1b3c7: 0x6c79e620, - 0x1b3c8: 0x6cbe4220, 0x1b3c9: 0x6cc3b420, 0x1b3ca: 0x6d315620, 0x1b3cb: 0x6c668820, - 0x1b3cc: 0x6c3fee20, 0x1b3cd: 0x6ca90420, 0x1b3ce: 0x6c0e1e20, 0x1b3cf: 0x6c587420, - 0x1b3d0: 0x6c9a9020, 0x1b3d1: 0x6cbdd620, 0x1b3d2: 0x6c4e0c20, 0x1b3d3: 0x6d233220, - 0x1b3d4: 0x6cd26620, 0x1b3d5: 0x6ca90620, 0x1b3d6: 0x6c6d1020, 0x1b3d7: 0x6ca90a20, - 0x1b3d8: 0x6d365020, 0x1b3d9: 0x6d226820, 0x1b3da: 0x6c060220, 0x1b3db: 0x6c7b5620, - 0x1b3dc: 0x6ca90c20, 0x1b3dd: 0x6cbddc20, 0x1b3de: 0x6ca12820, 0x1b3df: 0x6c13f220, - 0x1b3e0: 0x6c726020, 0x1b3e1: 0x6c489c20, 0x1b3e2: 0x6cbde220, 0x1b3e3: 0x6c54e420, - 0x1b3e4: 0x6cf50a20, 0x1b3e5: 0x6c89f020, 0x1b3e6: 0x6cd27a20, 0x1b3e7: 0x6ca91020, - 0x1b3e8: 0x6d2d4620, 0x1b3e9: 0x6cd06820, 0x1b3ea: 0x6ceffc20, 0x1b3eb: 0x6d014820, - 0x1b3ec: 0x6c7b5820, 0x1b3ed: 0x6c5c0e20, 0x1b3ee: 0x6c8a0620, 0x1b3ef: 0x6c75e220, - 0x1b3f0: 0x6c589620, 0x1b3f1: 0x6d18c020, 0x1b3f2: 0x6d156a20, 0x1b3f3: 0x6c061c20, - 0x1b3f4: 0x6cbd4a20, 0x1b3f5: 0x6c1d4620, 0x1b3f6: 0x6c062020, 0x1b3f7: 0x6c3c7c20, - 0x1b3f8: 0x6c25b020, 0x1b3f9: 0x6c332c20, 0x1b3fa: 0x6cd87820, 0x1b3fb: 0x6d09d420, - 0x1b3fc: 0x6c29ce20, 0x1b3fd: 0x6c93ca20, 0x1b3fe: 0x6c333620, 0x1b3ff: 0x6cd45020, - // Block 0x6d0, offset 0x1b400 - 0x1b400: 0x6cb34a20, 0x1b401: 0x6c3c2420, 0x1b402: 0x6d3b7420, 0x1b403: 0x6c3d5e20, - 0x1b404: 0x6ccf3a20, 0x1b405: 0x6c789620, 0x1b406: 0x6c674e20, 0x1b407: 0x6c675c20, - 0x1b408: 0x6d3b7a20, 0x1b409: 0x6cf08420, 0x1b40a: 0x6d41e820, 0x1b40b: 0x6d0a0c20, - 0x1b40c: 0x6cd5d220, 0x1b40d: 0x6c335420, 0x1b40e: 0x6c29e820, 0x1b40f: 0x6cffa220, - 0x1b410: 0x6c6a5420, 0x1b411: 0x6cceac20, 0x1b412: 0x6c377e20, 0x1b413: 0x6c378020, - 0x1b414: 0x6c378220, 0x1b415: 0x6c40d020, 0x1b416: 0x6c645e20, 0x1b417: 0x6cd49a20, - 0x1b418: 0x6c189220, 0x1b419: 0x6cce4a20, 0x1b41a: 0x6cce4c20, 0x1b41b: 0x6ca1b420, - 0x1b41c: 0x6c40c620, 0x1b41d: 0x6c169e20, 0x1b41e: 0x6c8a9a20, 0x1b41f: 0x6cfc1020, - 0x1b420: 0x6cfc1220, 0x1b421: 0x6c7dde20, 0x1b422: 0x6d1edc20, 0x1b423: 0x6cedbc20, - 0x1b424: 0x6d1ede20, 0x1b425: 0x6c8a8c20, 0x1b426: 0x6c8a8e20, 0x1b427: 0x6d10ca20, - 0x1b428: 0x6c983020, 0x1b429: 0x6cedc620, 0x1b42a: 0x6cedc020, 0x1b42b: 0x6cedc220, - 0x1b42c: 0x6c40d420, 0x1b42d: 0x6d10cc20, 0x1b42e: 0x6c34d620, 0x1b42f: 0x6c7cec20, - 0x1b430: 0x6d37f020, 0x1b431: 0x6c6ff620, 0x1b432: 0x6c419c20, 0x1b433: 0x6c478820, - 0x1b434: 0x6c419e20, 0x1b435: 0x6ce9b420, 0x1b436: 0x6c41b620, 0x1b437: 0x6c41b820, - 0x1b438: 0x6cd18a20, 0x1b439: 0x6d1ac220, 0x1b43a: 0x6c1b7020, 0x1b43b: 0x6c779020, - 0x1b43c: 0x6ca5b620, 0x1b43d: 0x6c6c8020, 0x1b43e: 0x6cef8620, 0x1b43f: 0x6ca7d020, - // Block 0x6d1, offset 0x1b440 - 0x1b440: 0x6c70f020, 0x1b441: 0x6cb08620, 0x1b442: 0x6c134e20, 0x1b443: 0x6cf83c20, - 0x1b444: 0x6c086c20, 0x1b445: 0x6c705620, 0x1b446: 0x6c6bbe20, 0x1b447: 0x6ce48020, - 0x1b448: 0x6cc0dc20, 0x1b449: 0x6ce44c20, 0x1b44a: 0x6c6bc020, 0x1b44b: 0x6cf35620, - 0x1b44c: 0x6c2dfa20, 0x1b44d: 0x6cd1a220, 0x1b44e: 0x6cd2c020, 0x1b44f: 0x6cb28020, - 0x1b450: 0x6c5ea420, 0x1b451: 0x6d017c20, 0x1b452: 0x6d31c620, 0x1b453: 0x6d017e20, - 0x1b454: 0x6ca5ca20, 0x1b455: 0x6d2de020, 0x1b456: 0x6cf5ba20, 0x1b457: 0x6cef9e20, - 0x1b458: 0x6c97b420, 0x1b459: 0x6c353a20, 0x1b45a: 0x6c910620, 0x1b45b: 0x6cb29820, - 0x1b45c: 0x6ce44e20, 0x1b45d: 0x6c3aa420, 0x1b45e: 0x6cd55820, 0x1b45f: 0x6d01aa20, - 0x1b460: 0x6ce8a020, 0x1b461: 0x6c939a20, 0x1b462: 0x6c93a620, 0x1b463: 0x6cf7f820, - 0x1b464: 0x6c135420, 0x1b465: 0x6c93ae20, 0x1b466: 0x6c727820, 0x1b467: 0x6d01f620, - 0x1b468: 0x6c72a420, 0x1b469: 0x6c73ba20, 0x1b46a: 0x6c8a3020, 0x1b46b: 0x6c74e620, - 0x1b46c: 0x6cd58820, 0x1b46d: 0x6cf93a20, 0x1b46e: 0x6c17fa20, 0x1b46f: 0x6cea3620, - 0x1b470: 0x6ca67420, 0x1b471: 0x6cccb020, 0x1b472: 0x6cec4820, 0x1b473: 0x6cfa6c20, - 0x1b474: 0x6c856820, 0x1b475: 0x6c35c620, 0x1b476: 0x6c2a5420, 0x1b477: 0x6c5ca820, - 0x1b478: 0x6c8f6820, 0x1b479: 0x6d165c20, 0x1b47a: 0x6cb6ca20, 0x1b47b: 0x6cc5b020, - 0x1b47c: 0x6cf49e20, 0x1b47d: 0x6c4e8020, 0x1b47e: 0x6ccf9c20, 0x1b47f: 0x6d221820, - // Block 0x6d2, offset 0x1b480 - 0x1b480: 0x6c1e5220, 0x1b481: 0x6cdc1e20, 0x1b482: 0x6cb6cc20, 0x1b483: 0x6cc5b220, - 0x1b484: 0x6d267c20, 0x1b485: 0x6c04b820, 0x1b486: 0x6d118420, 0x1b487: 0x6c01f220, - 0x1b488: 0x6d0b0e20, 0x1b489: 0x6cf4a620, 0x1b48a: 0x6c6a6e20, 0x1b48b: 0x6c35cc20, - 0x1b48c: 0x6c5fc620, 0x1b48d: 0x6cb8a420, 0x1b48e: 0x6c3b5420, 0x1b48f: 0x6cecc420, - 0x1b490: 0x6cb57020, 0x1b491: 0x6c132820, 0x1b492: 0x6cb96a20, 0x1b493: 0x6cb57220, - 0x1b494: 0x6c142e20, 0x1b495: 0x6c6bb020, 0x1b496: 0x6cc0d020, 0x1b497: 0x6c429820, - 0x1b498: 0x6cfc7a20, 0x1b499: 0x6c02c020, 0x1b49a: 0x6c7f8a20, 0x1b49b: 0x6c29d020, - 0x1b49c: 0x6c031a20, 0x1b49d: 0x6d427c20, 0x1b49e: 0x6d427e20, 0x1b49f: 0x6d100220, - 0x1b4a0: 0x6c71f820, 0x1b4a1: 0x6c425c20, 0x1b4a2: 0x6c785820, 0x1b4a3: 0x6c466e20, - 0x1b4a4: 0x6d08fa20, 0x1b4a5: 0x6cb2fa20, 0x1b4a6: 0x6c858a20, 0x1b4a7: 0x6ce56e20, - 0x1b4a8: 0x6cc0e020, 0x1b4a9: 0x6d0c6220, 0x1b4aa: 0x6c3de420, 0x1b4ab: 0x6d052e20, - 0x1b4ac: 0x6c640020, 0x1b4ad: 0x6c8e0a20, 0x1b4ae: 0x6ceaec20, 0x1b4af: 0x6cafb220, - 0x1b4b0: 0x6c02c820, 0x1b4b1: 0x6c273020, 0x1b4b2: 0x6c7be020, 0x1b4b3: 0x6d268620, - 0x1b4b4: 0x6cc0e220, 0x1b4b5: 0x6c566220, 0x1b4b6: 0x6cb36620, 0x1b4b7: 0x6c9f2a20, - 0x1b4b8: 0x6c01a220, 0x1b4b9: 0x6ce57020, 0x1b4ba: 0x6c8ca620, 0x1b4bb: 0x6c1b0620, - 0x1b4bc: 0x6cb2ea20, 0x1b4bd: 0x6c2fde20, 0x1b4be: 0x6c4e8c20, 0x1b4bf: 0x6c7c3420, - // Block 0x6d3, offset 0x1b4c0 - 0x1b4c0: 0x6d053020, 0x1b4c1: 0x6c992a20, 0x1b4c2: 0x6ce71420, 0x1b4c3: 0x6d08fc20, - 0x1b4c4: 0x6d16ae20, 0x1b4c5: 0x6c0be220, 0x1b4c6: 0x6c50d220, 0x1b4c7: 0x6c032c20, - 0x1b4c8: 0x6c95e620, 0x1b4c9: 0x6c35f020, 0x1b4ca: 0x6c3fc220, 0x1b4cb: 0x6d09e420, - 0x1b4cc: 0x6c2e6c20, 0x1b4cd: 0x6c921e20, 0x1b4ce: 0x6c371e20, 0x1b4cf: 0x6c373c20, - 0x1b4d0: 0x6c40e820, 0x1b4d1: 0x6cc28c20, 0x1b4d2: 0x6c305a20, 0x1b4d3: 0x6d149420, - 0x1b4d4: 0x6ca22e20, 0x1b4d5: 0x6cd25020, 0x1b4d6: 0x6c011a20, 0x1b4d7: 0x6ceee820, - 0x1b4d8: 0x6c586220, 0x1b4d9: 0x6d359620, 0x1b4da: 0x6c9d2c20, 0x1b4db: 0x6c850220, - 0x1b4dc: 0x6c61a420, 0x1b4dd: 0x6ce72220, 0x1b4de: 0x6ceeea20, 0x1b4df: 0x6d202620, - 0x1b4e0: 0x6c483420, 0x1b4e1: 0x6cf99420, 0x1b4e2: 0x6c850420, 0x1b4e3: 0x6d10d820, - 0x1b4e4: 0x6c698620, 0x1b4e5: 0x6d329420, 0x1b4e6: 0x6c943220, 0x1b4e7: 0x6c683020, - 0x1b4e8: 0x6c355420, 0x1b4e9: 0x6c355620, 0x1b4ea: 0x6d22ee20, 0x1b4eb: 0x6d007a20, - 0x1b4ec: 0x6c100e20, 0x1b4ed: 0x6cbc3620, 0x1b4ee: 0x6cc43420, 0x1b4ef: 0x6c3c3220, - 0x1b4f0: 0x6c3c3420, 0x1b4f1: 0x6ca4a220, 0x1b4f2: 0x6c850a20, 0x1b4f3: 0x6d1f1420, - 0x1b4f4: 0x6cfca220, 0x1b4f5: 0x6c532820, 0x1b4f6: 0x6c29d220, 0x1b4f7: 0x6ccfc820, - 0x1b4f8: 0x6c19cc20, 0x1b4f9: 0x6ce88e20, 0x1b4fa: 0x6c44f620, 0x1b4fb: 0x6c75a220, - 0x1b4fc: 0x6c502620, 0x1b4fd: 0x6cf9a020, 0x1b4fe: 0x6d1a4620, 0x1b4ff: 0x6d223a20, - // Block 0x6d4, offset 0x1b500 - 0x1b500: 0x6c811620, 0x1b501: 0x6c770820, 0x1b502: 0x6c814e20, 0x1b503: 0x6c7ee820, - 0x1b504: 0x6cfbf220, 0x1b505: 0x6cc3aa20, 0x1b506: 0x6c797020, 0x1b507: 0x6c1d1020, - 0x1b508: 0x6c1d1220, 0x1b509: 0x6cde4620, 0x1b50a: 0x6c8bac20, 0x1b50b: 0x6c578a20, - 0x1b50c: 0x6c708420, 0x1b50d: 0x6c7ef420, 0x1b50e: 0x6cb5be20, 0x1b50f: 0x6c9f4420, - 0x1b510: 0x6c7d5420, 0x1b511: 0x6c7d5620, 0x1b512: 0x6d40b420, 0x1b513: 0x6c480a20, - 0x1b514: 0x6c24c820, 0x1b515: 0x6d0b2620, 0x1b516: 0x6d0b2820, 0x1b517: 0x6c429e20, - 0x1b518: 0x6c94ee20, 0x1b519: 0x6c94f020, 0x1b51a: 0x6c837420, 0x1b51b: 0x6c742020, - 0x1b51c: 0x6c342820, 0x1b51d: 0x6d32ac20, 0x1b51e: 0x6c4c1e20, 0x1b51f: 0x6d1a5620, - 0x1b520: 0x6c2ff220, 0x1b521: 0x6c4dfa20, 0x1b522: 0x6d32ae20, 0x1b523: 0x6cefac20, - 0x1b524: 0x6cff7e20, 0x1b525: 0x6cafde20, 0x1b526: 0x6d0bf220, 0x1b527: 0x6cd91420, - 0x1b528: 0x6c6ab220, 0x1b529: 0x6c07e220, 0x1b52a: 0x6d40b620, 0x1b52b: 0x6c7a3c20, - 0x1b52c: 0x6c2ff420, 0x1b52d: 0x6d2de420, 0x1b52e: 0x6c480c20, 0x1b52f: 0x6d1a5820, - 0x1b530: 0x6d3f6a20, 0x1b531: 0x6d2b4e20, 0x1b532: 0x6c59c020, 0x1b533: 0x6d211820, - 0x1b534: 0x6cec6220, 0x1b535: 0x6d0fb220, 0x1b536: 0x6c3c4a20, 0x1b537: 0x6cc05c20, - 0x1b538: 0x6d0fb420, 0x1b539: 0x6ce32020, 0x1b53a: 0x6d15ec20, 0x1b53b: 0x6d361e20, - 0x1b53c: 0x6cd37c20, 0x1b53d: 0x6d291620, 0x1b53e: 0x6d11ae20, 0x1b53f: 0x6c363020, - // Block 0x6d5, offset 0x1b540 - 0x1b540: 0x6d3af220, 0x1b541: 0x6c76ac20, 0x1b542: 0x6c93dc20, 0x1b543: 0x6d0d7a20, - 0x1b544: 0x6c9a5820, 0x1b545: 0x6c4e0e20, 0x1b546: 0x6c5ec820, 0x1b547: 0x6c5eca20, - 0x1b548: 0x6c591e20, 0x1b549: 0x6ce67020, 0x1b54a: 0x6cd16a20, 0x1b54b: 0x6c99fa20, - 0x1b54c: 0x6cba5220, 0x1b54d: 0x6cf4e820, 0x1b54e: 0x6d211a20, 0x1b54f: 0x6d3f8420, - 0x1b550: 0x6c7f9a20, 0x1b551: 0x6c786420, 0x1b552: 0x6d0c9220, 0x1b553: 0x6d0c9420, - 0x1b554: 0x6cefbc20, 0x1b555: 0x6d3f8620, 0x1b556: 0x6c13e020, 0x1b557: 0x6cdc3c20, - 0x1b558: 0x6cc67220, 0x1b559: 0x6c78ee20, 0x1b55a: 0x6cbd2e20, 0x1b55b: 0x6d211c20, - 0x1b55c: 0x6ce45220, 0x1b55d: 0x6c90e220, 0x1b55e: 0x6ce8ba20, 0x1b55f: 0x6c330420, - 0x1b560: 0x6cf64220, 0x1b561: 0x6cf25220, 0x1b562: 0x6c123020, 0x1b563: 0x6c296c20, - 0x1b564: 0x6cc68220, 0x1b565: 0x6c6ae020, 0x1b566: 0x6c765e20, 0x1b567: 0x6c8e6820, - 0x1b568: 0x6cf4fc20, 0x1b569: 0x6cd92420, 0x1b56a: 0x6cbb7c20, 0x1b56b: 0x6d3e3620, - 0x1b56c: 0x6cef0c20, 0x1b56d: 0x6c07f620, 0x1b56e: 0x6c2ccc20, 0x1b56f: 0x6c25da20, - 0x1b570: 0x6cba1220, 0x1b571: 0x6d1e4420, 0x1b572: 0x6ca83e20, 0x1b573: 0x6c25dc20, - 0x1b574: 0x6c614820, 0x1b575: 0x6cd41620, 0x1b576: 0x6cc93c20, 0x1b577: 0x6cd96820, - 0x1b578: 0x6d3fa020, 0x1b579: 0x6c67f420, 0x1b57a: 0x6c89f220, 0x1b57b: 0x6c773c20, - 0x1b57c: 0x6c15c620, 0x1b57d: 0x6c2ec820, 0x1b57e: 0x6c132420, 0x1b57f: 0x6c2f7820, - // Block 0x6d6, offset 0x1b580 - 0x1b580: 0x6ce86820, 0x1b581: 0x6c90ec20, 0x1b582: 0x6d2f3a20, 0x1b583: 0x6d2dfe20, - 0x1b584: 0x6d2e0020, 0x1b585: 0x6c024e20, 0x1b586: 0x6c127c20, 0x1b587: 0x6cc11e20, - 0x1b588: 0x6cbac820, 0x1b589: 0x6c24d620, 0x1b58a: 0x6d418e20, 0x1b58b: 0x6c29e220, - 0x1b58c: 0x6c29e420, 0x1b58d: 0x6cf79020, 0x1b58e: 0x6d238c20, 0x1b58f: 0x6cae2620, - 0x1b590: 0x6c8f9a20, 0x1b591: 0x6cfe4420, 0x1b592: 0x6c135620, 0x1b593: 0x6c0e8620, - 0x1b594: 0x6cbd3c20, 0x1b595: 0x6c686620, 0x1b596: 0x6d0dc620, 0x1b597: 0x6c816a20, - 0x1b598: 0x6d2e7420, 0x1b599: 0x6c8bcc20, 0x1b59a: 0x6c8a0820, 0x1b59b: 0x6c8a0a20, - 0x1b59c: 0x6c6c5020, 0x1b59d: 0x6c2ae220, 0x1b59e: 0x6c350a20, 0x1b59f: 0x6d41ee20, - 0x1b5a0: 0x6c69ba20, 0x1b5a1: 0x6c4b6220, 0x1b5a2: 0x6d113420, 0x1b5a3: 0x6c686820, - 0x1b5a4: 0x6d113620, 0x1b5a5: 0x6c748e20, 0x1b5a6: 0x6d2d9620, 0x1b5a7: 0x6d188a20, - 0x1b5a8: 0x6d091a20, 0x1b5a9: 0x6ca4be20, 0x1b5aa: 0x6d133820, 0x1b5ab: 0x6d133a20, - 0x1b5ac: 0x6d155a20, 0x1b5ad: 0x6ca87020, 0x1b5ae: 0x6cfc2a20, 0x1b5af: 0x6c608220, - 0x1b5b0: 0x6d020c20, 0x1b5b1: 0x6c786e20, 0x1b5b2: 0x6cf69820, 0x1b5b3: 0x6c2c9a20, - 0x1b5b4: 0x6c02e620, 0x1b5b5: 0x6d419c20, 0x1b5b6: 0x6cf14820, 0x1b5b7: 0x6d156c20, - 0x1b5b8: 0x6cc6c020, 0x1b5b9: 0x6c29f020, 0x1b5ba: 0x6c8e1420, 0x1b5bb: 0x6d28cc20, - 0x1b5bc: 0x6d228c20, 0x1b5bd: 0x6d26f220, 0x1b5be: 0x6d1b0c20, 0x1b5bf: 0x6cc83820, - // Block 0x6d7, offset 0x1b5c0 - 0x1b5c0: 0x6c6b5420, 0x1b5c1: 0x6c869c20, 0x1b5c2: 0x6c4a9820, 0x1b5c3: 0x6c8fbe20, - 0x1b5c4: 0x6c8fc020, 0x1b5c5: 0x6c2ce420, 0x1b5c6: 0x6cc6d620, 0x1b5c7: 0x6cf72a20, - 0x1b5c8: 0x6c718620, 0x1b5c9: 0x6c155020, 0x1b5ca: 0x6d1d2220, 0x1b5cb: 0x6c7c5420, - 0x1b5cc: 0x6d0cee20, 0x1b5cd: 0x6ceec820, 0x1b5ce: 0x6ca4d420, 0x1b5cf: 0x6cc32820, - 0x1b5d0: 0x6c17ac20, 0x1b5d1: 0x6c24a420, 0x1b5d2: 0x6c945220, 0x1b5d3: 0x6c2cf420, - 0x1b5d4: 0x6c2cf620, 0x1b5d5: 0x6ca8e020, 0x1b5d6: 0x6d0d1220, 0x1b5d7: 0x6d0d1020, - 0x1b5d8: 0x6d0e2020, 0x1b5d9: 0x6c7cbc20, 0x1b5da: 0x6d0e2220, 0x1b5db: 0x6c1fd620, - 0x1b5dc: 0x6c7b0820, 0x1b5dd: 0x6c1fd820, 0x1b5de: 0x6d385020, 0x1b5df: 0x6c597020, - 0x1b5e0: 0x6c6d8a20, 0x1b5e1: 0x6d09d820, 0x1b5e2: 0x6c175e20, 0x1b5e3: 0x6c176020, - 0x1b5e4: 0x6c8b2620, 0x1b5e5: 0x6c454a20, 0x1b5e6: 0x6d426020, 0x1b5e7: 0x6cbc1a20, - 0x1b5e8: 0x6c71e820, 0x1b5e9: 0x6c45ce20, 0x1b5ea: 0x6c71f220, 0x1b5eb: 0x6cf35220, - 0x1b5ec: 0x6cb4be20, 0x1b5ed: 0x6cb4c020, 0x1b5ee: 0x6c143620, 0x1b5ef: 0x6cc05e20, - 0x1b5f0: 0x6cc08220, 0x1b5f1: 0x6c610e20, 0x1b5f2: 0x6d15ac20, 0x1b5f3: 0x6cd87020, - 0x1b5f4: 0x6c03e620, 0x1b5f5: 0x6d338a20, 0x1b5f6: 0x6d2f5820, 0x1b5f7: 0x6cfe1e20, - 0x1b5f8: 0x6d14bc20, 0x1b5f9: 0x6c6c8820, 0x1b5fa: 0x6d0a6c20, 0x1b5fb: 0x6c734020, - 0x1b5fc: 0x6c033820, 0x1b5fd: 0x6d0a8c20, 0x1b5fe: 0x6c6c1a20, 0x1b5ff: 0x6c3dc620, - // Block 0x6d8, offset 0x1b600 - 0x1b600: 0x6d287e20, 0x1b601: 0x6c090220, 0x1b602: 0x6cd2f020, 0x1b603: 0x6c105820, - 0x1b604: 0x6c2f4620, 0x1b605: 0x6cd66220, 0x1b606: 0x6c384a20, 0x1b607: 0x6ca7ec20, - 0x1b608: 0x6cd19020, 0x1b609: 0x6c3b0e20, 0x1b60a: 0x6cabe420, 0x1b60b: 0x6d34e020, - 0x1b60c: 0x6cf57a20, 0x1b60d: 0x6c565420, 0x1b60e: 0x6c286420, 0x1b60f: 0x6ceede20, - 0x1b610: 0x6d2f2020, 0x1b611: 0x6ce16e20, 0x1b612: 0x6c273220, 0x1b613: 0x6ca0c820, - 0x1b614: 0x6cae0620, 0x1b615: 0x6cabe620, 0x1b616: 0x6ce5e820, 0x1b617: 0x6c0e4c20, - 0x1b618: 0x6c87f220, 0x1b619: 0x6d358620, 0x1b61a: 0x6d397620, 0x1b61b: 0x6c0eb420, - 0x1b61c: 0x6d358820, 0x1b61d: 0x6c2c2620, 0x1b61e: 0x6ca0de20, 0x1b61f: 0x6d16e220, - 0x1b620: 0x6d16e420, 0x1b621: 0x6cb28220, 0x1b622: 0x6cb84820, 0x1b623: 0x6c731420, - 0x1b624: 0x6cc79220, 0x1b625: 0x6cd66420, 0x1b626: 0x6c274020, 0x1b627: 0x6d334020, - 0x1b628: 0x6cd71420, 0x1b629: 0x6cbc3820, 0x1b62a: 0x6d313620, 0x1b62b: 0x6cd1b020, - 0x1b62c: 0x6cc44420, 0x1b62d: 0x6cf77020, 0x1b62e: 0x6c051c20, 0x1b62f: 0x6c275020, - 0x1b630: 0x6c4a4420, 0x1b631: 0x6c1d9420, 0x1b632: 0x6cb29a20, 0x1b633: 0x6d2f2c20, - 0x1b634: 0x6cca4a20, 0x1b635: 0x6cec8a20, 0x1b636: 0x6c275c20, 0x1b637: 0x6ceefc20, - 0x1b638: 0x6c16a420, 0x1b639: 0x6ccc4820, 0x1b63a: 0x6cb5c220, 0x1b63b: 0x6d2abe20, - 0x1b63c: 0x6c4c6820, 0x1b63d: 0x6c997a20, 0x1b63e: 0x6c321620, 0x1b63f: 0x6c540020, - // Block 0x6d9, offset 0x1b640 - 0x1b640: 0x6d334c20, 0x1b641: 0x6d059420, 0x1b642: 0x6c9d4420, 0x1b643: 0x6cef0e20, - 0x1b644: 0x6cf2ec20, 0x1b645: 0x6c3e7620, 0x1b646: 0x6d179620, 0x1b647: 0x6c052e20, - 0x1b648: 0x6cb2a420, 0x1b649: 0x6c2f3a20, 0x1b64a: 0x6c459220, 0x1b64b: 0x6cac5e20, - 0x1b64c: 0x6c5a5420, 0x1b64d: 0x6ce1d220, 0x1b64e: 0x6c9d5420, 0x1b64f: 0x6c644a20, - 0x1b650: 0x6ce2a020, 0x1b651: 0x6c5ad020, 0x1b652: 0x6d37c020, 0x1b653: 0x6cccfa20, - 0x1b654: 0x6c97e620, 0x1b655: 0x6ca29420, 0x1b656: 0x6c0c0820, 0x1b657: 0x6c4c7220, - 0x1b658: 0x6d2adc20, 0x1b659: 0x6ca29620, 0x1b65a: 0x6c053420, 0x1b65b: 0x6d2f3c20, - 0x1b65c: 0x6c6e2820, 0x1b65d: 0x6c15d220, 0x1b65e: 0x6c3ed620, 0x1b65f: 0x6d36a620, - 0x1b660: 0x6c54f420, 0x1b661: 0x6c385820, 0x1b662: 0x6c207620, 0x1b663: 0x6c09f220, - 0x1b664: 0x6c0ae220, 0x1b665: 0x6d2f4820, 0x1b666: 0x6c9d8420, 0x1b667: 0x6cbba420, - 0x1b668: 0x6c14d820, 0x1b669: 0x6c3b8620, 0x1b66a: 0x6c9b4820, 0x1b66b: 0x6c053e20, - 0x1b66c: 0x6c1de420, 0x1b66d: 0x6c9eee20, 0x1b66e: 0x6c1eb820, 0x1b66f: 0x6c6b3220, - 0x1b670: 0x6cfc3e20, 0x1b671: 0x6c7fe220, 0x1b672: 0x6c420a20, 0x1b673: 0x6cb26e20, - 0x1b674: 0x6ca6f220, 0x1b675: 0x6c646020, 0x1b676: 0x6c0e0420, 0x1b677: 0x6c0e0c20, - 0x1b678: 0x6d041620, 0x1b679: 0x6c422620, 0x1b67a: 0x6d107e20, 0x1b67b: 0x6c58ec20, - 0x1b67c: 0x6d200c20, 0x1b67d: 0x6d1e9a20, 0x1b67e: 0x6c613e20, 0x1b67f: 0x6c4a0220, - // Block 0x6da, offset 0x1b680 - 0x1b680: 0x6cb04220, 0x1b681: 0x6ce62420, 0x1b682: 0x6d2b3420, 0x1b683: 0x6c4a0420, - 0x1b684: 0x6d3c0820, 0x1b685: 0x6ca1b020, 0x1b686: 0x6cbec220, 0x1b687: 0x6c091c20, - 0x1b688: 0x6cbd5220, 0x1b689: 0x6c33d820, 0x1b68a: 0x6c206c20, 0x1b68b: 0x6c4ac220, - 0x1b68c: 0x6d0b4820, 0x1b68d: 0x6c043020, 0x1b68e: 0x6c6bb620, 0x1b68f: 0x6d067020, - 0x1b690: 0x6c913420, 0x1b691: 0x6cf42020, 0x1b692: 0x6d3c5420, 0x1b693: 0x6c7a8220, - 0x1b694: 0x6d1b9e20, 0x1b695: 0x6c2bd620, 0x1b696: 0x6cad4c20, 0x1b697: 0x6c2d3c20, - 0x1b698: 0x6d0ad020, 0x1b699: 0x6c9eac20, 0x1b69a: 0x6c44ba20, 0x1b69b: 0x6c22b820, - 0x1b69c: 0x6c3f3e20, 0x1b69d: 0x6ce71820, 0x1b69e: 0x6cacf220, 0x1b69f: 0x6c3a8220, - 0x1b6a0: 0x6cfdb420, 0x1b6a1: 0x6d15ce20, 0x1b6a2: 0x6d359820, 0x1b6a3: 0x6ce54e20, - 0x1b6a4: 0x6d359a20, 0x1b6a5: 0x6d04be20, 0x1b6a6: 0x6c324420, 0x1b6a7: 0x6d428e20, - 0x1b6a8: 0x6cfe9c20, 0x1b6a9: 0x6ce89020, 0x1b6aa: 0x6c4ae620, 0x1b6ab: 0x6c7a8820, - 0x1b6ac: 0x6c984e20, 0x1b6ad: 0x6ce66420, 0x1b6ae: 0x6d1fb620, 0x1b6af: 0x6c101020, - 0x1b6b0: 0x6c0e0e20, 0x1b6b1: 0x6c1a6e20, 0x1b6b2: 0x6c7ef620, 0x1b6b3: 0x6c097620, - 0x1b6b4: 0x6c601620, 0x1b6b5: 0x6c012620, 0x1b6b6: 0x6cd5c220, 0x1b6b7: 0x6c772c20, - 0x1b6b8: 0x6d1d8420, 0x1b6b9: 0x6ceb7820, 0x1b6ba: 0x6cd91620, 0x1b6bb: 0x6cd5c420, - 0x1b6bc: 0x6cbea620, 0x1b6bd: 0x6d233620, 0x1b6be: 0x6d224a20, 0x1b6bf: 0x6c9eb420, - // Block 0x6db, offset 0x1b6c0 - 0x1b6c0: 0x6cd9ac20, 0x1b6c1: 0x6c12e620, 0x1b6c2: 0x6cfd7220, 0x1b6c3: 0x6c3aaa20, - 0x1b6c4: 0x6c6ff820, 0x1b6c5: 0x6c365420, 0x1b6c6: 0x6c4a6620, 0x1b6c7: 0x6c8f3420, - 0x1b6c8: 0x6ccc5620, 0x1b6c9: 0x6c881020, 0x1b6ca: 0x6c80b420, 0x1b6cb: 0x6cd9ae20, - 0x1b6cc: 0x6d365220, 0x1b6cd: 0x6cb3f620, 0x1b6ce: 0x6cbeac20, 0x1b6cf: 0x6c700e20, - 0x1b6d0: 0x6c6ffa20, 0x1b6d1: 0x6c6c9e20, 0x1b6d2: 0x6c025020, 0x1b6d3: 0x6c7e0420, - 0x1b6d4: 0x6c90a020, 0x1b6d5: 0x6d1b5e20, 0x1b6d6: 0x6c8a9e20, 0x1b6d7: 0x6c277e20, - 0x1b6d8: 0x6c927c20, 0x1b6d9: 0x6d182220, 0x1b6da: 0x6c1ea420, 0x1b6db: 0x6c151a20, - 0x1b6dc: 0x6ce8d820, 0x1b6dd: 0x6cd81220, 0x1b6de: 0x6d02e420, 0x1b6df: 0x6c9eb820, - 0x1b6e0: 0x6c16f420, 0x1b6e1: 0x6cf46220, 0x1b6e2: 0x6c3ac420, 0x1b6e3: 0x6c4a0820, - 0x1b6e4: 0x6c7aa620, 0x1b6e5: 0x6c7b3c20, 0x1b6e6: 0x6c0a4820, 0x1b6e7: 0x6cbb2220, - 0x1b6e8: 0x6d021020, 0x1b6e9: 0x6c8c2c20, 0x1b6ea: 0x6c8c2e20, 0x1b6eb: 0x6c8a3220, - 0x1b6ec: 0x6c916e20, 0x1b6ed: 0x6c631220, 0x1b6ee: 0x6d1d2420, 0x1b6ef: 0x6cfafa20, - 0x1b6f0: 0x6ce65420, 0x1b6f1: 0x6d1dd820, 0x1b6f2: 0x6c84bc20, 0x1b6f3: 0x6ce65820, - 0x1b6f4: 0x6d1ac020, 0x1b6f5: 0x6d09d220, 0x1b6f6: 0x6d0c5220, 0x1b6f7: 0x6ce65c20, - 0x1b6f8: 0x6c2b5220, 0x1b6f9: 0x6cac1420, 0x1b6fa: 0x6c665420, 0x1b6fb: 0x6c5b1c20, - 0x1b6fc: 0x6ca39a20, 0x1b6fd: 0x6c5b2220, 0x1b6fe: 0x6c45cc20, 0x1b6ff: 0x6ca75620, - // Block 0x6dc, offset 0x1b700 - 0x1b700: 0x6c762420, 0x1b701: 0x6c0b6620, 0x1b702: 0x6d166220, 0x1b703: 0x6cb73620, - 0x1b704: 0x6ca9f020, 0x1b705: 0x6c3bc620, 0x1b706: 0x6c71a420, 0x1b707: 0x6d0d5620, - 0x1b708: 0x6d16ea20, 0x1b709: 0x6d2a0020, 0x1b70a: 0x6c09f420, 0x1b70b: 0x6d163c20, - 0x1b70c: 0x6d13ba20, 0x1b70d: 0x6c37b820, 0x1b70e: 0x6cc9f820, 0x1b70f: 0x6cd2fc20, - 0x1b710: 0x6c37ba20, 0x1b711: 0x6cd38020, 0x1b712: 0x6cd39a20, 0x1b713: 0x6c454c20, - 0x1b714: 0x6c2e0420, 0x1b715: 0x6d1ac420, 0x1b716: 0x6c563620, 0x1b717: 0x6c3dc820, - 0x1b718: 0x6c52ea20, 0x1b719: 0x6cf34420, 0x1b71a: 0x6ce99c20, 0x1b71b: 0x6c1af420, - 0x1b71c: 0x6c67d420, 0x1b71d: 0x6c03a820, 0x1b71e: 0x6cd04420, 0x1b71f: 0x6c2c1420, - 0x1b720: 0x6d2eb020, 0x1b721: 0x6c73dc20, 0x1b722: 0x6ce1b020, 0x1b723: 0x6c3f4020, - 0x1b724: 0x6c2bd820, 0x1b725: 0x6c9c3820, 0x1b726: 0x6cfb2c20, 0x1b727: 0x6c552220, - 0x1b728: 0x6c173820, 0x1b729: 0x6caa4e20, 0x1b72a: 0x6c6e4c20, 0x1b72b: 0x6d31be20, - 0x1b72c: 0x6d14be20, 0x1b72d: 0x6c9ce020, 0x1b72e: 0x6cc28e20, 0x1b72f: 0x6cec8220, - 0x1b730: 0x6cce5e20, 0x1b731: 0x6cc91820, 0x1b732: 0x6d078620, 0x1b733: 0x6c6e6420, - 0x1b734: 0x6c2dc220, 0x1b735: 0x6d2eb420, 0x1b736: 0x6c67de20, 0x1b737: 0x6cbb0820, - 0x1b738: 0x6cae9a20, 0x1b739: 0x6c287820, 0x1b73a: 0x6cbb0e20, 0x1b73b: 0x6c099620, - 0x1b73c: 0x6c099820, 0x1b73d: 0x6ccf4820, 0x1b73e: 0x6c288820, 0x1b73f: 0x6c65aa20, - // Block 0x6dd, offset 0x1b740 - 0x1b740: 0x6c46b420, 0x1b741: 0x6c448e20, 0x1b742: 0x6c37f020, 0x1b743: 0x6c09c420, - 0x1b744: 0x6c79c020, 0x1b745: 0x6c673820, 0x1b746: 0x6c0d1820, 0x1b747: 0x6cff1420, - 0x1b748: 0x6c28a620, 0x1b749: 0x6c4c2e20, 0x1b74a: 0x6c67f820, 0x1b74b: 0x6c538620, - 0x1b74c: 0x6c9c7820, 0x1b74d: 0x6c4c4420, 0x1b74e: 0x6ceca420, 0x1b74f: 0x6c751620, - 0x1b750: 0x6c616820, 0x1b751: 0x6c616a20, 0x1b752: 0x6c4a3220, 0x1b753: 0x6c28f820, - 0x1b754: 0x6c921a20, 0x1b755: 0x6c921c20, 0x1b756: 0x6ce98820, 0x1b757: 0x6c5bb420, - 0x1b758: 0x6d362220, 0x1b759: 0x6c5bda20, 0x1b75a: 0x6c5bdc20, 0x1b75b: 0x6d155c20, - 0x1b75c: 0x6d155e20, 0x1b75d: 0x6d158020, 0x1b75e: 0x6d158220, 0x1b75f: 0x6d265e20, - 0x1b760: 0x6d266220, 0x1b761: 0x6cccb220, 0x1b762: 0x6d03c020, 0x1b763: 0x6cf17c20, - 0x1b764: 0x6ce71020, 0x1b765: 0x6d0e4620, 0x1b766: 0x6d0e4820, 0x1b767: 0x6d22f020, - 0x1b768: 0x6c1a9c20, 0x1b769: 0x6c112620, 0x1b76a: 0x6c0bfa20, 0x1b76b: 0x6c2dc420, - 0x1b76c: 0x6c0d3020, 0x1b76d: 0x6cae9e20, 0x1b76e: 0x6d1e4620, 0x1b76f: 0x6cb19820, - 0x1b770: 0x6d2ec420, 0x1b771: 0x6d1d0420, 0x1b772: 0x6c1af020, 0x1b773: 0x6c1bd420, - 0x1b774: 0x6d3d1c20, 0x1b775: 0x6ceb6c20, 0x1b776: 0x6c5fc820, 0x1b777: 0x6c39be20, - 0x1b778: 0x6d379220, 0x1b779: 0x6d168420, 0x1b77a: 0x6cedde20, 0x1b77b: 0x6c17fe20, - 0x1b77c: 0x6c08c020, 0x1b77d: 0x6c2b1620, 0x1b77e: 0x6c8caa20, 0x1b77f: 0x6c3dea20, - // Block 0x6de, offset 0x1b780 - 0x1b780: 0x6cedfa20, 0x1b781: 0x6d328820, 0x1b782: 0x6c241e20, 0x1b783: 0x6cedfc20, - 0x1b784: 0x6c6e4e20, 0x1b785: 0x6c274220, 0x1b786: 0x6cf59e20, 0x1b787: 0x6d0a7020, - 0x1b788: 0x6c523a20, 0x1b789: 0x6d0f9420, 0x1b78a: 0x6c57e820, 0x1b78b: 0x6c93d020, - 0x1b78c: 0x6c546420, 0x1b78d: 0x6cee0220, 0x1b78e: 0x6c1a6620, 0x1b78f: 0x6d35b220, - 0x1b790: 0x6d061820, 0x1b791: 0x6c6e6620, 0x1b792: 0x6ce89220, 0x1b793: 0x6c238e20, - 0x1b794: 0x6d377e20, 0x1b795: 0x6c7eea20, 0x1b796: 0x6c239620, 0x1b797: 0x6c2a9020, - 0x1b798: 0x6cabf820, 0x1b799: 0x6cf7dc20, 0x1b79a: 0x6c300020, 0x1b79b: 0x6c61e620, - 0x1b79c: 0x6c16a620, 0x1b79d: 0x6d35dc20, 0x1b79e: 0x6c239820, 0x1b79f: 0x6d387020, - 0x1b7a0: 0x6c7ef820, 0x1b7a1: 0x6d233820, 0x1b7a2: 0x6d018e20, 0x1b7a3: 0x6c6bdc20, - 0x1b7a4: 0x6c667820, 0x1b7a5: 0x6cd38220, 0x1b7a6: 0x6c641620, 0x1b7a7: 0x6c0b9820, - 0x1b7a8: 0x6c59c220, 0x1b7a9: 0x6c3ff020, 0x1b7aa: 0x6d0a0e20, 0x1b7ab: 0x6cefbe20, - 0x1b7ac: 0x6cad0420, 0x1b7ad: 0x6d110c20, 0x1b7ae: 0x6cee9820, 0x1b7af: 0x6cf64820, - 0x1b7b0: 0x6d32d020, 0x1b7b1: 0x6cb1b620, 0x1b7b2: 0x6ce36220, 0x1b7b3: 0x6c2a7c20, - 0x1b7b4: 0x6d32de20, 0x1b7b5: 0x6d32f020, 0x1b7b6: 0x6c0cf420, 0x1b7b7: 0x6c2a7e20, - 0x1b7b8: 0x6c1cd420, 0x1b7b9: 0x6c183020, 0x1b7ba: 0x6c692620, 0x1b7bb: 0x6c5c2c20, - 0x1b7bc: 0x6c693c20, 0x1b7bd: 0x6c5af220, 0x1b7be: 0x6c9a2e20, 0x1b7bf: 0x6c906c20, - // Block 0x6df, offset 0x1b7c0 - 0x1b7c0: 0x6cfd9220, 0x1b7c1: 0x6c067a20, 0x1b7c2: 0x6cc1fe20, 0x1b7c3: 0x6d02a220, - 0x1b7c4: 0x6d036220, 0x1b7c5: 0x6c090420, 0x1b7c6: 0x6d164020, 0x1b7c7: 0x6c820c20, - 0x1b7c8: 0x6cc56420, 0x1b7c9: 0x6c29b620, 0x1b7ca: 0x6c2f8e20, 0x1b7cb: 0x6c410820, - 0x1b7cc: 0x6c618020, 0x1b7cd: 0x6cc58620, 0x1b7ce: 0x6cc56a20, 0x1b7cf: 0x6c162620, - 0x1b7d0: 0x6ce05020, 0x1b7d1: 0x6ce26820, 0x1b7d2: 0x6ce26a20, 0x1b7d3: 0x6c416020, - 0x1b7d4: 0x6cb72a20, 0x1b7d5: 0x6cd2fe20, 0x1b7d6: 0x6c25ae20, 0x1b7d7: 0x6d357420, - 0x1b7d8: 0x6cee4620, 0x1b7d9: 0x6c982820, 0x1b7da: 0x6cf56e20, 0x1b7db: 0x6c388220, - 0x1b7dc: 0x6d1ba020, 0x1b7dd: 0x6ce4d820, 0x1b7de: 0x6c9f2c20, 0x1b7df: 0x6cf1ca20, - 0x1b7e0: 0x6d379620, 0x1b7e1: 0x6c1cac20, 0x1b7e2: 0x6cf4b620, 0x1b7e3: 0x6c5fca20, - 0x1b7e4: 0x6cf42220, 0x1b7e5: 0x6cf84620, 0x1b7e6: 0x6c639a20, 0x1b7e7: 0x6d1e8e20, - 0x1b7e8: 0x6ced7420, 0x1b7e9: 0x6c230220, 0x1b7ea: 0x6cd90220, 0x1b7eb: 0x6c7b0e20, - 0x1b7ec: 0x6d22d020, 0x1b7ed: 0x6c0b6c20, 0x1b7ee: 0x6d357620, 0x1b7ef: 0x6cb57420, - 0x1b7f0: 0x6c251820, 0x1b7f1: 0x6c189a20, 0x1b7f2: 0x6cdf5e20, 0x1b7f3: 0x6cea3e20, - 0x1b7f4: 0x6cb96e20, 0x1b7f5: 0x6ca75a20, 0x1b7f6: 0x6c5cde20, 0x1b7f7: 0x6d045420, - 0x1b7f8: 0x6ca97620, 0x1b7f9: 0x6c7bb620, 0x1b7fa: 0x6cfa7820, 0x1b7fb: 0x6d02aa20, - 0x1b7fc: 0x6c772420, 0x1b7fd: 0x6c549e20, 0x1b7fe: 0x6c767c20, 0x1b7ff: 0x6c3bce20, - // Block 0x6e0, offset 0x1b800 - 0x1b800: 0x6c57e620, 0x1b801: 0x6cdf6220, 0x1b802: 0x6cd95220, 0x1b803: 0x6cf42420, - 0x1b804: 0x6cab9a20, 0x1b805: 0x6c170220, 0x1b806: 0x6c20a020, 0x1b807: 0x6c71fa20, - 0x1b808: 0x6d16b420, 0x1b809: 0x6c05e620, 0x1b80a: 0x6c173a20, 0x1b80b: 0x6c9f2e20, - 0x1b80c: 0x6cadb020, 0x1b80d: 0x6d428020, 0x1b80e: 0x6d2b7620, 0x1b80f: 0x6d104020, - 0x1b810: 0x6c720a20, 0x1b811: 0x6c04e820, 0x1b812: 0x6caa5e20, 0x1b813: 0x6ca49420, - 0x1b814: 0x6d328a20, 0x1b815: 0x6cabe820, 0x1b816: 0x6c106a20, 0x1b817: 0x6ce5ea20, - 0x1b818: 0x6c567020, 0x1b819: 0x6c566420, 0x1b81a: 0x6c720c20, 0x1b81b: 0x6c267e20, - 0x1b81c: 0x6c87f420, 0x1b81d: 0x6cd7d420, 0x1b81e: 0x6c1d8e20, 0x1b81f: 0x6c2c2020, - 0x1b820: 0x6c274420, 0x1b821: 0x6d147020, 0x1b822: 0x6ce84020, 0x1b823: 0x6d1f0620, - 0x1b824: 0x6c3d4820, 0x1b825: 0x6c5ff420, 0x1b826: 0x6cae5420, 0x1b827: 0x6d041820, - 0x1b828: 0x6d260420, 0x1b829: 0x6ca5be20, 0x1b82a: 0x6c48e620, 0x1b82b: 0x6c3dec20, - 0x1b82c: 0x6cf84820, 0x1b82d: 0x6c093220, 0x1b82e: 0x6d1e9620, 0x1b82f: 0x6cbc9620, - 0x1b830: 0x6d086e20, 0x1b831: 0x6c230820, 0x1b832: 0x6c0dc220, 0x1b833: 0x6c5a4220, - 0x1b834: 0x6d068020, 0x1b835: 0x6c1f0e20, 0x1b836: 0x6c093420, 0x1b837: 0x6cd5ac20, - 0x1b838: 0x6cf5a020, 0x1b839: 0x6cdf9620, 0x1b83a: 0x6d1e8220, 0x1b83b: 0x6d3fe820, - 0x1b83c: 0x6c334220, 0x1b83d: 0x6ca1b220, 0x1b83e: 0x6d34f220, 0x1b83f: 0x6d16b620, - // Block 0x6e1, offset 0x1b840 - 0x1b840: 0x6cd33220, 0x1b841: 0x6ca59420, 0x1b842: 0x6d09e820, 0x1b843: 0x6cd33420, - 0x1b844: 0x6cf86020, 0x1b845: 0x6c81a420, 0x1b846: 0x6c525820, 0x1b847: 0x6c7b8e20, - 0x1b848: 0x6ca1c620, 0x1b849: 0x6d34fe20, 0x1b84a: 0x6d008020, 0x1b84b: 0x6c88e820, - 0x1b84c: 0x6ce55220, 0x1b84d: 0x6c5a4820, 0x1b84e: 0x6c2e7020, 0x1b84f: 0x6c502820, - 0x1b850: 0x6c799e20, 0x1b851: 0x6c4ad420, 0x1b852: 0x6c525a20, 0x1b853: 0x6cf5a220, - 0x1b854: 0x6c68ce20, 0x1b855: 0x6cd5b820, 0x1b856: 0x6cd8fe20, 0x1b857: 0x6c54aa20, - 0x1b858: 0x6cbfa420, 0x1b859: 0x6d104220, 0x1b85a: 0x6c5ba820, 0x1b85b: 0x6c5b2420, - 0x1b85c: 0x6c1bfa20, 0x1b85d: 0x6c63b020, 0x1b85e: 0x6d149a20, 0x1b85f: 0x6d045e20, - 0x1b860: 0x6c48ec20, 0x1b861: 0x6c8c4c20, 0x1b862: 0x6c5a9220, 0x1b863: 0x6d3f3a20, - 0x1b864: 0x6d068e20, 0x1b865: 0x6c1b8a20, 0x1b866: 0x6cce4e20, 0x1b867: 0x6caa7c20, - 0x1b868: 0x6c524220, 0x1b869: 0x6c371020, 0x1b86a: 0x6c788e20, 0x1b86b: 0x6c305e20, - 0x1b86c: 0x6ce48820, 0x1b86d: 0x6c457c20, 0x1b86e: 0x6cc29020, 0x1b86f: 0x6cf94220, - 0x1b870: 0x6cb84a20, 0x1b871: 0x6d268c20, 0x1b872: 0x6cae5820, 0x1b873: 0x6c790020, - 0x1b874: 0x6c2a6420, 0x1b875: 0x6c5baa20, 0x1b876: 0x6c35fa20, 0x1b877: 0x6d003220, - 0x1b878: 0x6ce7c620, 0x1b879: 0x6d0be020, 0x1b87a: 0x6c764c20, 0x1b87b: 0x6c12ce20, - 0x1b87c: 0x6ca4e020, 0x1b87d: 0x6d282020, 0x1b87e: 0x6c984020, 0x1b87f: 0x6d1e2a20, - // Block 0x6e2, offset 0x1b880 - 0x1b880: 0x6d1e2220, 0x1b881: 0x6d24d420, 0x1b882: 0x6caf5220, 0x1b883: 0x6c7da020, - 0x1b884: 0x6cbb6a20, 0x1b885: 0x6d269420, 0x1b886: 0x6d230c20, 0x1b887: 0x6ce89420, - 0x1b888: 0x6c6bd820, 0x1b889: 0x6cf5e220, 0x1b88a: 0x6d304a20, 0x1b88b: 0x6c8c4e20, - 0x1b88c: 0x6ce3e020, 0x1b88d: 0x6c4e9620, 0x1b88e: 0x6c502a20, 0x1b88f: 0x6cbca820, - 0x1b890: 0x6ce3ea20, 0x1b891: 0x6c108220, 0x1b892: 0x6d172620, 0x1b893: 0x6cba4a20, - 0x1b894: 0x6c5b4c20, 0x1b895: 0x6cf5bc20, 0x1b896: 0x6c070020, 0x1b897: 0x6c975e20, - 0x1b898: 0x6d13e420, 0x1b899: 0x6c524820, 0x1b89a: 0x6cd95620, 0x1b89b: 0x6cc29420, - 0x1b89c: 0x6c1a6820, 0x1b89d: 0x6c7c3820, 0x1b89e: 0x6cf4d020, 0x1b89f: 0x6cf4d220, - 0x1b8a0: 0x6d1e9e20, 0x1b8a1: 0x6c83b620, 0x1b8a2: 0x6c89ae20, 0x1b8a3: 0x6c590e20, - 0x1b8a4: 0x6c230c20, 0x1b8a5: 0x6d175a20, 0x1b8a6: 0x6d269620, 0x1b8a7: 0x6c85c820, - 0x1b8a8: 0x6ca8e620, 0x1b8a9: 0x6ca4e620, 0x1b8aa: 0x6c360e20, 0x1b8ab: 0x6cc3b620, - 0x1b8ac: 0x6d080e20, 0x1b8ad: 0x6cb8c420, 0x1b8ae: 0x6cf4d420, 0x1b8af: 0x6c9fa420, - 0x1b8b0: 0x6c239a20, 0x1b8b1: 0x6c3a5220, 0x1b8b2: 0x6c069c20, 0x1b8b3: 0x6c344c20, - 0x1b8b4: 0x6c253420, 0x1b8b5: 0x6c171220, 0x1b8b6: 0x6c9af220, 0x1b8b7: 0x6cca4e20, - 0x1b8b8: 0x6c61ea20, 0x1b8b9: 0x6c498820, 0x1b8ba: 0x6c497e20, 0x1b8bb: 0x6d042820, - 0x1b8bc: 0x6c2a0e20, 0x1b8bd: 0x6cb4e620, 0x1b8be: 0x6c797420, 0x1b8bf: 0x6ce4ec20, - // Block 0x6e3, offset 0x1b8c0 - 0x1b8c0: 0x6c94f220, 0x1b8c1: 0x6cf60a20, 0x1b8c2: 0x6c76d220, 0x1b8c3: 0x6c4bc020, - 0x1b8c4: 0x6ca6a020, 0x1b8c5: 0x6cbe7620, 0x1b8c6: 0x6c1da020, 0x1b8c7: 0x6c339820, - 0x1b8c8: 0x6c4cb620, 0x1b8c9: 0x6d2d7420, 0x1b8ca: 0x6c6da820, 0x1b8cb: 0x6ced0420, - 0x1b8cc: 0x6d24ea20, 0x1b8cd: 0x6c6c4220, 0x1b8ce: 0x6c620020, 0x1b8cf: 0x6c7f9620, - 0x1b8d0: 0x6d231020, 0x1b8d1: 0x6c5dca20, 0x1b8d2: 0x6c512620, 0x1b8d3: 0x6cc2da20, - 0x1b8d4: 0x6cdfdc20, 0x1b8d5: 0x6ce3ec20, 0x1b8d6: 0x6ce3f420, 0x1b8d7: 0x6ca81620, - 0x1b8d8: 0x6cee0e20, 0x1b8d9: 0x6c21b420, 0x1b8da: 0x6c54bc20, 0x1b8db: 0x6c5cc020, - 0x1b8dc: 0x6cf5e420, 0x1b8dd: 0x6c16ea20, 0x1b8de: 0x6d02ca20, 0x1b8df: 0x6ceefe20, - 0x1b8e0: 0x6c5bc020, 0x1b8e1: 0x6c363420, 0x1b8e2: 0x6cdd6620, 0x1b8e3: 0x6d3fee20, - 0x1b8e4: 0x6c648420, 0x1b8e5: 0x6d1e3620, 0x1b8e6: 0x6c2d4e20, 0x1b8e7: 0x6c723c20, - 0x1b8e8: 0x6c11ce20, 0x1b8e9: 0x6c19fc20, 0x1b8ea: 0x6c2a6e20, 0x1b8eb: 0x6c072220, - 0x1b8ec: 0x6cbcb420, 0x1b8ed: 0x6c119420, 0x1b8ee: 0x6c287a20, 0x1b8ef: 0x6c498020, - 0x1b8f0: 0x6c34f420, 0x1b8f1: 0x6ca4f820, 0x1b8f2: 0x6d283220, 0x1b8f3: 0x6cfdea20, - 0x1b8f4: 0x6d3c8420, 0x1b8f5: 0x6c2ea220, 0x1b8f6: 0x6c59c420, 0x1b8f7: 0x6c217e20, - 0x1b8f8: 0x6cbf2220, 0x1b8f9: 0x6cc54c20, 0x1b8fa: 0x6d037220, 0x1b8fb: 0x6c12e820, - 0x1b8fc: 0x6c0b3e20, 0x1b8fd: 0x6c9fac20, 0x1b8fe: 0x6d3f8a20, 0x1b8ff: 0x6ce32220, - // Block 0x6e4, offset 0x1b900 - 0x1b900: 0x6cbc2620, 0x1b901: 0x6c1db820, 0x1b902: 0x6c073020, 0x1b903: 0x6d079820, - 0x1b904: 0x6cee8620, 0x1b905: 0x6c43ea20, 0x1b906: 0x6cb8ee20, 0x1b907: 0x6cefc020, - 0x1b908: 0x6d236a20, 0x1b909: 0x6d212420, 0x1b90a: 0x6c099a20, 0x1b90b: 0x6d079a20, - 0x1b90c: 0x6c592020, 0x1b90d: 0x6c9fb620, 0x1b90e: 0x6c099c20, 0x1b90f: 0x6d17e220, - 0x1b910: 0x6c9e2420, 0x1b911: 0x6d1e3820, 0x1b912: 0x6c768820, 0x1b913: 0x6c296620, - 0x1b914: 0x6d19e020, 0x1b915: 0x6c363620, 0x1b916: 0x6c18c620, 0x1b917: 0x6c998a20, - 0x1b918: 0x6cb86820, 0x1b919: 0x6c78b820, 0x1b91a: 0x6d214820, 0x1b91b: 0x6c00a820, - 0x1b91c: 0x6cbcc020, 0x1b91d: 0x6d0d7e20, 0x1b91e: 0x6caaf620, 0x1b91f: 0x6c41dc20, - 0x1b920: 0x6d283420, 0x1b921: 0x6d3ff020, 0x1b922: 0x6cc9c220, 0x1b923: 0x6c839620, - 0x1b924: 0x6c3bd820, 0x1b925: 0x6d1d6620, 0x1b926: 0x6c7cf820, 0x1b927: 0x6c7cfa20, - 0x1b928: 0x6cc3d820, 0x1b929: 0x6c459420, 0x1b92a: 0x6d27ae20, 0x1b92b: 0x6cdaca20, - 0x1b92c: 0x6cdae420, 0x1b92d: 0x6cb5f820, 0x1b92e: 0x6d110e20, 0x1b92f: 0x6cd96020, - 0x1b930: 0x6c5a6c20, 0x1b931: 0x6c604e20, 0x1b932: 0x6c478c20, 0x1b933: 0x6c726220, - 0x1b934: 0x6c20ae20, 0x1b935: 0x6ca6aa20, 0x1b936: 0x6d00b620, 0x1b937: 0x6c766020, - 0x1b938: 0x6d332a20, 0x1b939: 0x6d1e4820, 0x1b93a: 0x6c12ae20, 0x1b93b: 0x6d0a9a20, - 0x1b93c: 0x6cd0aa20, 0x1b93d: 0x6c0f1020, 0x1b93e: 0x6c768e20, 0x1b93f: 0x6d262820, - // Block 0x6e5, offset 0x1b940 - 0x1b940: 0x6cf89e20, 0x1b941: 0x6c5d3420, 0x1b942: 0x6d1e5020, 0x1b943: 0x6d102420, - 0x1b944: 0x6c862e20, 0x1b945: 0x6ccaaa20, 0x1b946: 0x6ce1d420, 0x1b947: 0x6d19f220, - 0x1b948: 0x6c224e20, 0x1b949: 0x6d06f220, 0x1b94a: 0x6cba5820, 0x1b94b: 0x6cdf7c20, - 0x1b94c: 0x6c599420, 0x1b94d: 0x6d283a20, 0x1b94e: 0x6cd0ac20, 0x1b94f: 0x6ca03820, - 0x1b950: 0x6c463020, 0x1b951: 0x6ccf5020, 0x1b952: 0x6c23a420, 0x1b953: 0x6cb15820, - 0x1b954: 0x6ca29820, 0x1b955: 0x6ca2a020, 0x1b956: 0x6c4c7620, 0x1b957: 0x6c1c5620, - 0x1b958: 0x6c11d420, 0x1b959: 0x6c11a620, 0x1b95a: 0x6c119c20, 0x1b95b: 0x6c24da20, - 0x1b95c: 0x6c9fc220, 0x1b95d: 0x6ce27e20, 0x1b95e: 0x6d2ec820, 0x1b95f: 0x6ce7ce20, - 0x1b960: 0x6c02d820, 0x1b961: 0x6cd6d620, 0x1b962: 0x6c97e820, 0x1b963: 0x6c499620, - 0x1b964: 0x6cc3ea20, 0x1b965: 0x6d2a8420, 0x1b966: 0x6c701620, 0x1b967: 0x6c5c1020, - 0x1b968: 0x6c765820, 0x1b969: 0x6c881220, 0x1b96a: 0x6cab9e20, 0x1b96b: 0x6cd96c20, - 0x1b96c: 0x6cbd8e20, 0x1b96d: 0x6d1b7020, 0x1b96e: 0x6c93f220, 0x1b96f: 0x6cce0c20, - 0x1b970: 0x6cf0b820, 0x1b971: 0x6ce95220, 0x1b972: 0x6c976c20, 0x1b973: 0x6cb8fe20, - 0x1b974: 0x6ccf6220, 0x1b975: 0x6d1d9c20, 0x1b976: 0x6cbed620, 0x1b977: 0x6c773e20, - 0x1b978: 0x6c2c8e20, 0x1b979: 0x6d348e20, 0x1b97a: 0x6c90a220, 0x1b97b: 0x6c738220, - 0x1b97c: 0x6cb51c20, 0x1b97d: 0x6cb50c20, 0x1b97e: 0x6d23c020, 0x1b97f: 0x6cb2c220, - // Block 0x6e6, offset 0x1b980 - 0x1b980: 0x6c89f620, 0x1b981: 0x6c23da20, 0x1b982: 0x6d1eae20, 0x1b983: 0x6c1cd620, - 0x1b984: 0x6d36aa20, 0x1b985: 0x6ce7d020, 0x1b986: 0x6c197a20, 0x1b987: 0x6cb7c020, - 0x1b988: 0x6cc12020, 0x1b989: 0x6caebc20, 0x1b98a: 0x6c075a20, 0x1b98b: 0x6c0cb820, - 0x1b98c: 0x6cbf5c20, 0x1b98d: 0x6c686a20, 0x1b98e: 0x6d2b8a20, 0x1b98f: 0x6c1c4220, - 0x1b990: 0x6c883620, 0x1b991: 0x6cb2cc20, 0x1b992: 0x6c7d0c20, 0x1b993: 0x6c5c1220, - 0x1b994: 0x6cbbf020, 0x1b995: 0x6c1a3620, 0x1b996: 0x6d1b7a20, 0x1b997: 0x6d1b7c20, - 0x1b998: 0x6cf80620, 0x1b999: 0x6cf6ba20, 0x1b99a: 0x6c28a820, 0x1b99b: 0x6ce00220, - 0x1b99c: 0x6c34a220, 0x1b99d: 0x6c335e20, 0x1b99e: 0x6c335a20, 0x1b99f: 0x6cdaf820, - 0x1b9a0: 0x6c74b620, 0x1b9a1: 0x6c130e20, 0x1b9a2: 0x6cff0220, 0x1b9a3: 0x6c385a20, - 0x1b9a4: 0x6c3be420, 0x1b9a5: 0x6c817220, 0x1b9a6: 0x6c81da20, 0x1b9a7: 0x6c1cd820, - 0x1b9a8: 0x6c4db820, 0x1b9a9: 0x6cb7d220, 0x1b9aa: 0x6cfb7c20, 0x1b9ab: 0x6c9fc420, - 0x1b9ac: 0x6c6e2a20, 0x1b9ad: 0x6c8a7420, 0x1b9ae: 0x6cf46420, 0x1b9af: 0x6c11da20, - 0x1b9b0: 0x6c749020, 0x1b9b1: 0x6c245420, 0x1b9b2: 0x6cfd0820, 0x1b9b3: 0x6ce06e20, - 0x1b9b4: 0x6cd12220, 0x1b9b5: 0x6caf9820, 0x1b9b6: 0x6d188e20, 0x1b9b7: 0x6c1f7420, - 0x1b9b8: 0x6cfad620, 0x1b9b9: 0x6ca4c020, 0x1b9ba: 0x6c28ac20, 0x1b9bb: 0x6ce07420, - 0x1b9bc: 0x6c6e2c20, 0x1b9bd: 0x6cd93220, 0x1b9be: 0x6c4f0220, 0x1b9bf: 0x6c693e20, - // Block 0x6e7, offset 0x1b9c0 - 0x1b9c0: 0x6cf0cc20, 0x1b9c1: 0x6d07cc20, 0x1b9c2: 0x6c303620, 0x1b9c3: 0x6cbdb020, - 0x1b9c4: 0x6cbd9e20, 0x1b9c5: 0x6c728a20, 0x1b9c6: 0x6c12b220, 0x1b9c7: 0x6c791020, - 0x1b9c8: 0x6d021420, 0x1b9c9: 0x6d1bfe20, 0x1b9ca: 0x6c02ea20, 0x1b9cb: 0x6c99ba20, - 0x1b9cc: 0x6d189020, 0x1b9cd: 0x6c8c3020, 0x1b9ce: 0x6ccb5420, 0x1b9cf: 0x6c75e420, - 0x1b9d0: 0x6c57f220, 0x1b9d1: 0x6c9afe20, 0x1b9d2: 0x6c803c20, 0x1b9d3: 0x6c00ca20, - 0x1b9d4: 0x6c8c3220, 0x1b9d5: 0x6d0c3c20, 0x1b9d6: 0x6c7e2620, 0x1b9d7: 0x6cfa4a20, - 0x1b9d8: 0x6c1c8420, 0x1b9d9: 0x6d228e20, 0x1b9da: 0x6d1b8820, 0x1b9db: 0x6c270e20, - 0x1b9dc: 0x6c9be420, 0x1b9dd: 0x6c00d820, 0x1b9de: 0x6c9b4a20, 0x1b9df: 0x6c337020, - 0x1b9e0: 0x6cb65c20, 0x1b9e1: 0x6ca0ac20, 0x1b9e2: 0x6c7fbe20, 0x1b9e3: 0x6c9b0020, - 0x1b9e4: 0x6c1de620, 0x1b9e5: 0x6d370220, 0x1b9e6: 0x6cab1620, 0x1b9e7: 0x6cab1820, - 0x1b9e8: 0x6d0c3420, 0x1b9e9: 0x6d103420, 0x1b9ea: 0x6c0f8a20, 0x1b9eb: 0x6d372820, - 0x1b9ec: 0x6c7c0c20, 0x1b9ed: 0x6c7bd220, 0x1b9ee: 0x6d1ff820, 0x1b9ef: 0x6c3db220, - 0x1b9f0: 0x6c8eb420, 0x1b9f1: 0x6c9ef020, 0x1b9f2: 0x6c1a5420, 0x1b9f3: 0x6c5cb020, - 0x1b9f4: 0x6c163820, 0x1b9f5: 0x6c9bea20, 0x1b9f6: 0x6c804a20, 0x1b9f7: 0x6c57fa20, - 0x1b9f8: 0x6d083620, 0x1b9f9: 0x6cc51a20, 0x1b9fa: 0x6c164020, 0x1b9fb: 0x6c62b820, - 0x1b9fc: 0x6c72ca20, 0x1b9fd: 0x6c583e20, 0x1b9fe: 0x6ccf8820, 0x1b9ff: 0x6d195a20, - // Block 0x6e8, offset 0x1ba00 - 0x1ba00: 0x6c893820, 0x1ba01: 0x6ca44020, 0x1ba02: 0x6c9cb020, 0x1ba03: 0x6ce18c20, - 0x1ba04: 0x6c751a20, 0x1ba05: 0x6c42b020, 0x1ba06: 0x6c42b220, 0x1ba07: 0x6d3c5220, - 0x1ba08: 0x6c436020, 0x1ba09: 0x6d266e20, 0x1ba0a: 0x6cf49820, 0x1ba0b: 0x6c645a20, - 0x1ba0c: 0x6d056420, 0x1ba0d: 0x6cd59420, 0x1ba0e: 0x6cc65020, 0x1ba0f: 0x6cf83820, - 0x1ba10: 0x6c19b220, 0x1ba11: 0x6cf2a620, 0x1ba12: 0x6c6bb820, 0x1ba13: 0x6c436e20, - 0x1ba14: 0x6c646c20, 0x1ba15: 0x6cbaa020, 0x1ba16: 0x6c5da020, 0x1ba17: 0x6cbaa220, - 0x1ba18: 0x6d2e4a20, 0x1ba19: 0x6c306e20, 0x1ba1a: 0x6cb81220, 0x1ba1b: 0x6c63b620, - 0x1ba1c: 0x6c2e9220, 0x1ba1d: 0x6d2b5e20, 0x1ba1e: 0x6c63be20, 0x1ba1f: 0x6c614420, - 0x1ba20: 0x6d33de20, 0x1ba21: 0x6c76b020, 0x1ba22: 0x6c603420, 0x1ba23: 0x6c7c8620, - 0x1ba24: 0x6c414020, 0x1ba25: 0x6c2ace20, 0x1ba26: 0x6d2e6820, 0x1ba27: 0x6cbaca20, - 0x1ba28: 0x6c439e20, 0x1ba29: 0x6c65bc20, 0x1ba2a: 0x6c6b0620, 0x1ba2b: 0x6d238e20, - 0x1ba2c: 0x6c65be20, 0x1ba2d: 0x6d0dc820, 0x1ba2e: 0x6c92a020, 0x1ba2f: 0x6c54f620, - 0x1ba30: 0x6d2e7e20, 0x1ba31: 0x6cf8da20, 0x1ba32: 0x6cf8ec20, 0x1ba33: 0x6c219a20, - 0x1ba34: 0x6c279420, 0x1ba35: 0x6cc20420, 0x1ba36: 0x6c563820, 0x1ba37: 0x6c563a20, - 0x1ba38: 0x6c563c20, 0x1ba39: 0x6c35c820, 0x1ba3a: 0x6cd30c20, 0x1ba3b: 0x6ce3d220, - 0x1ba3c: 0x6c992620, 0x1ba3d: 0x6c566620, 0x1ba3e: 0x6c858c20, 0x1ba3f: 0x6c39a620, - // Block 0x6e9, offset 0x1ba40 - 0x1ba40: 0x6cdd4e20, 0x1ba41: 0x6c0b2e20, 0x1ba42: 0x6c2d4220, 0x1ba43: 0x6c6ed820, - 0x1ba44: 0x6cce3420, 0x1ba45: 0x6d14c020, 0x1ba46: 0x6d15dc20, 0x1ba47: 0x6ccd7a20, - 0x1ba48: 0x6c568c20, 0x1ba49: 0x6c3a0220, 0x1ba4a: 0x6d0d8020, 0x1ba4b: 0x6cd43620, - 0x1ba4c: 0x6cd48e20, 0x1ba4d: 0x6c10fe20, 0x1ba4e: 0x6d2bc020, 0x1ba4f: 0x6cbff220, - 0x1ba50: 0x6c820e20, 0x1ba51: 0x6cb3fe20, 0x1ba52: 0x6c031020, 0x1ba53: 0x6c26e020, - 0x1ba54: 0x6cc61020, 0x1ba55: 0x6c390220, 0x1ba56: 0x6cc83020, 0x1ba57: 0x6d292a20, - 0x1ba58: 0x6cea9620, 0x1ba59: 0x6d2f1e20, 0x1ba5a: 0x6c2df620, 0x1ba5b: 0x6c776620, - 0x1ba5c: 0x6d207220, 0x1ba5d: 0x6c7a1820, 0x1ba5e: 0x6c41c420, 0x1ba5f: 0x6ccf9e20, - 0x1ba60: 0x6c137820, 0x1ba61: 0x6cea9820, 0x1ba62: 0x6c475420, 0x1ba63: 0x6c79d620, - 0x1ba64: 0x6cf4a220, 0x1ba65: 0x6c2a9420, 0x1ba66: 0x6cb89820, 0x1ba67: 0x6d343620, - 0x1ba68: 0x6cc5b620, 0x1ba69: 0x6c7de620, 0x1ba6a: 0x6c9ac020, 0x1ba6b: 0x6ccade20, - 0x1ba6c: 0x6d0f7420, 0x1ba6d: 0x6ca97820, 0x1ba6e: 0x6c051220, 0x1ba6f: 0x6c17e620, - 0x1ba70: 0x6cc53620, 0x1ba71: 0x6cf57020, 0x1ba72: 0x6cb97220, 0x1ba73: 0x6c047020, - 0x1ba74: 0x6c639c20, 0x1ba75: 0x6d20b220, 0x1ba76: 0x6c3dda20, 0x1ba77: 0x6c02c220, - 0x1ba78: 0x6cf57e20, 0x1ba79: 0x6caf2a20, 0x1ba7a: 0x6d34e620, 0x1ba7b: 0x6d357820, - 0x1ba7c: 0x6c35d220, 0x1ba7d: 0x6c2a9620, 0x1ba7e: 0x6d2f8420, 0x1ba7f: 0x6c19bc20, - // Block 0x6ea, offset 0x1ba80 - 0x1ba80: 0x6c618420, 0x1ba81: 0x6d0d3c20, 0x1ba82: 0x6c7bb820, 0x1ba83: 0x6c0b6e20, - 0x1ba84: 0x6c173220, 0x1ba85: 0x6c704e20, 0x1ba86: 0x6cf1cc20, 0x1ba87: 0x6c551e20, - 0x1ba88: 0x6d267e20, 0x1ba89: 0x6c73de20, 0x1ba8a: 0x6c039a20, 0x1ba8b: 0x6cbe0420, - 0x1ba8c: 0x6c282020, 0x1ba8d: 0x6d331820, 0x1ba8e: 0x6d27d820, 0x1ba8f: 0x6cecc820, - 0x1ba90: 0x6ca54820, 0x1ba91: 0x6d168820, 0x1ba92: 0x6cd49e20, 0x1ba93: 0x6d3b5420, - 0x1ba94: 0x6cb3d020, 0x1ba95: 0x6ce7e620, 0x1ba96: 0x6c30da20, 0x1ba97: 0x6c777e20, - 0x1ba98: 0x6d301220, 0x1ba99: 0x6cb3d220, 0x1ba9a: 0x6c3f3620, 0x1ba9b: 0x6cad3220, - 0x1ba9c: 0x6c036020, 0x1ba9d: 0x6c029c20, 0x1ba9e: 0x6d2aa420, 0x1ba9f: 0x6ce94820, - 0x1baa0: 0x6c79b220, 0x1baa1: 0x6c94d020, 0x1baa2: 0x6cbb3820, 0x1baa3: 0x6d287a20, - 0x1baa4: 0x6c565620, 0x1baa5: 0x6c063020, 0x1baa6: 0x6c0dc420, 0x1baa7: 0x6d34f420, - 0x1baa8: 0x6cae5620, 0x1baa9: 0x6cdf8c20, 0x1baaa: 0x6c106c20, 0x1baab: 0x6caf3620, - 0x1baac: 0x6cdf1820, 0x1baad: 0x6d118c20, 0x1baae: 0x6d31b820, 0x1baaf: 0x6d2bc620, - 0x1bab0: 0x6d0f4820, 0x1bab1: 0x6c063220, 0x1bab2: 0x6c508c20, 0x1bab3: 0x6ca62820, - 0x1bab4: 0x6d12ce20, 0x1bab5: 0x6c2bda20, 0x1bab6: 0x6c1bee20, 0x1bab7: 0x6caf3820, - 0x1bab8: 0x6c632220, 0x1bab9: 0x6ca0a820, 0x1baba: 0x6c9a7620, 0x1babb: 0x6c185a20, - 0x1babc: 0x6d0ad220, 0x1babd: 0x6c1d6420, 0x1babe: 0x6cc0e420, 0x1babf: 0x6c9f9420, - // Block 0x6eb, offset 0x1bac0 - 0x1bac0: 0x6c1f1020, 0x1bac1: 0x6c632a20, 0x1bac2: 0x6c3dee20, 0x1bac3: 0x6d2c7220, - 0x1bac4: 0x6d3a5c20, 0x1bac5: 0x6c27bc20, 0x1bac6: 0x6c146020, 0x1bac7: 0x6ca2c420, - 0x1bac8: 0x6ca6ec20, 0x1bac9: 0x6c7e3e20, 0x1baca: 0x6c3f4220, 0x1bacb: 0x6cad3420, - 0x1bacc: 0x6c04ea20, 0x1bacd: 0x6cabee20, 0x1bace: 0x6c8b9a20, 0x1bacf: 0x6ca2d020, - 0x1bad0: 0x6c48d820, 0x1bad1: 0x6cb97420, 0x1bad2: 0x6c71fc20, 0x1bad3: 0x6cde2e20, - 0x1bad4: 0x6c036820, 0x1bad5: 0x6ceaac20, 0x1bad6: 0x6ceaae20, 0x1bad7: 0x6c02a020, - 0x1bad8: 0x6c705a20, 0x1bad9: 0x6d3cf020, 0x1bada: 0x6caca020, 0x1badb: 0x6d2f5a20, - 0x1badc: 0x6c043c20, 0x1badd: 0x6c043220, 0x1bade: 0x6c2bdc20, 0x1badf: 0x6ca62420, - 0x1bae0: 0x6c720e20, 0x1bae1: 0x6c7de820, 0x1bae2: 0x6c903220, 0x1bae3: 0x6c656420, - 0x1bae4: 0x6cb83420, 0x1bae5: 0x6d1d7e20, 0x1bae6: 0x6c7f8c20, 0x1bae7: 0x6ca8f620, - 0x1bae8: 0x6c0e5020, 0x1bae9: 0x6d2aa820, 0x1baea: 0x6cb8bc20, 0x1baeb: 0x6c522e20, - 0x1baec: 0x6c7dea20, 0x1baed: 0x6cd33620, 0x1baee: 0x6c6a8e20, 0x1baef: 0x6d331e20, - 0x1baf0: 0x6ca8ee20, 0x1baf1: 0x6c45da20, 0x1baf2: 0x6c45de20, 0x1baf3: 0x6cc2ca20, - 0x1baf4: 0x6cd68020, 0x1baf5: 0x6c25a620, 0x1baf6: 0x6d288a20, 0x1baf7: 0x6c77a020, - 0x1baf8: 0x6d149c20, 0x1baf9: 0x6d008220, 0x1bafa: 0x6c12d020, 0x1bafb: 0x6c5a9420, - 0x1bafc: 0x6cb1ea20, 0x1bafd: 0x6d3b6620, 0x1bafe: 0x6cd41020, 0x1baff: 0x6ca2d620, - // Block 0x6ec, offset 0x1bb00 - 0x1bb00: 0x6c03fc20, 0x1bb01: 0x6c1b0c20, 0x1bb02: 0x6c48ac20, 0x1bb03: 0x6d359c20, - 0x1bb04: 0x6c7dec20, 0x1bb05: 0x6c348020, 0x1bb06: 0x6c348220, 0x1bb07: 0x6d350020, - 0x1bb08: 0x6cbcaa20, 0x1bb09: 0x6c01a420, 0x1bb0a: 0x6ca9f220, 0x1bb0b: 0x6d322020, - 0x1bb0c: 0x6c43ca20, 0x1bb0d: 0x6c698820, 0x1bb0e: 0x6c7ae620, 0x1bb0f: 0x6c306020, - 0x1bb10: 0x6ca2d820, 0x1bb11: 0x6ce55420, 0x1bb12: 0x6c8ad220, 0x1bb13: 0x6d2bca20, - 0x1bb14: 0x6c937c20, 0x1bb15: 0x6c2e7220, 0x1bb16: 0x6cebca20, 0x1bb17: 0x6c73fa20, - 0x1bb18: 0x6c8b9420, 0x1bb19: 0x6c71b020, 0x1bb1a: 0x6d35b820, 0x1bb1b: 0x6c943420, - 0x1bb1c: 0x6d0b8620, 0x1bb1d: 0x6cf27c20, 0x1bb1e: 0x6cde3420, 0x1bb1f: 0x6d008420, - 0x1bb20: 0x6ca49c20, 0x1bb21: 0x6c292820, 0x1bb22: 0x6c68d020, 0x1bb23: 0x6d329820, - 0x1bb24: 0x6c612a20, 0x1bb25: 0x6c5a9620, 0x1bb26: 0x6cfb3420, 0x1bb27: 0x6d24be20, - 0x1bb28: 0x6c002020, 0x1bb29: 0x6ceab420, 0x1bb2a: 0x6caab820, 0x1bb2b: 0x6c261c20, - 0x1bb2c: 0x6c0ed420, 0x1bb2d: 0x6c44fa20, 0x1bb2e: 0x6ce3be20, 0x1bb2f: 0x6d322c20, - 0x1bb30: 0x6c19dc20, 0x1bb31: 0x6cc94220, 0x1bb32: 0x6cc94420, 0x1bb33: 0x6c793220, - 0x1bb34: 0x6c9a5020, 0x1bb35: 0x6c906220, 0x1bb36: 0x6c706820, 0x1bb37: 0x6cae9020, - 0x1bb38: 0x6c657a20, 0x1bb39: 0x6d172820, 0x1bb3a: 0x6ce6ba20, 0x1bb3b: 0x6cccce20, - 0x1bb3c: 0x6cc83a20, 0x1bb3d: 0x6cecf820, 0x1bb3e: 0x6d008a20, 0x1bb3f: 0x6c138820, - // Block 0x6ed, offset 0x1bb40 - 0x1bb40: 0x6c3ca020, 0x1bb41: 0x6c68da20, 0x1bb42: 0x6cf43c20, 0x1bb43: 0x6c75a420, - 0x1bb44: 0x6c6fe820, 0x1bb45: 0x6ce7b220, 0x1bb46: 0x6c7da220, 0x1bb47: 0x6c5dac20, - 0x1bb48: 0x6ce89620, 0x1bb49: 0x6d3cf620, 0x1bb4a: 0x6cb3d620, 0x1bb4b: 0x6c938820, - 0x1bb4c: 0x6c033a20, 0x1bb4d: 0x6c4e9820, 0x1bb4e: 0x6cce6020, 0x1bb4f: 0x6ca7da20, - 0x1bb50: 0x6c72e420, 0x1bb51: 0x6d2b4620, 0x1bb52: 0x6cd5ba20, 0x1bb53: 0x6d127620, - 0x1bb54: 0x6c741220, 0x1bb55: 0x6c103620, 0x1bb56: 0x6cecd020, 0x1bb57: 0x6c108420, - 0x1bb58: 0x6d421620, 0x1bb59: 0x6d172a20, 0x1bb5a: 0x6d2ce820, 0x1bb5b: 0x6c937e20, - 0x1bb5c: 0x6cd9a420, 0x1bb5d: 0x6ceab620, 0x1bb5e: 0x6c813a20, 0x1bb5f: 0x6cdce620, - 0x1bb60: 0x6c052220, 0x1bb61: 0x6c657c20, 0x1bb62: 0x6c590220, 0x1bb63: 0x6c29d420, - 0x1bb64: 0x6cf13c20, 0x1bb65: 0x6ced7820, 0x1bb66: 0x6cbd6e20, 0x1bb67: 0x6caf0220, - 0x1bb68: 0x6ccf2c20, 0x1bb69: 0x6c8af820, 0x1bb6a: 0x6c9f4620, 0x1bb6b: 0x6c9aca20, - 0x1bb6c: 0x6c3f5a20, 0x1bb6d: 0x6c041e20, 0x1bb6e: 0x6c723e20, 0x1bb6f: 0x6c29cc20, - 0x1bb70: 0x6cf2b420, 0x1bb71: 0x6c003e20, 0x1bb72: 0x6c731c20, 0x1bb73: 0x6d26a420, - 0x1bb74: 0x6d3fec20, 0x1bb75: 0x6c186420, 0x1bb76: 0x6c20c820, 0x1bb77: 0x6c6ab620, - 0x1bb78: 0x6ce85420, 0x1bb79: 0x6c07ae20, 0x1bb7a: 0x6ca33220, 0x1bb7b: 0x6ca72020, - 0x1bb7c: 0x6cc90e20, 0x1bb7d: 0x6d423620, 0x1bb7e: 0x6cf2e220, 0x1bb7f: 0x6cf5e820, - // Block 0x6ee, offset 0x1bb80 - 0x1bb80: 0x6cfa9820, 0x1bb81: 0x6c19e620, 0x1bb82: 0x6c2cc420, 0x1bb83: 0x6ccae020, - 0x1bb84: 0x6c94d220, 0x1bb85: 0x6cbec620, 0x1bb86: 0x6c427820, 0x1bb87: 0x6c342a20, - 0x1bb88: 0x6cd46020, 0x1bb89: 0x6c2e1820, 0x1bb8a: 0x6cb3d820, 0x1bb8b: 0x6c2bf020, - 0x1bb8c: 0x6d2f0420, 0x1bb8d: 0x6c5d2420, 0x1bb8e: 0x6c613620, 0x1bb8f: 0x6ce1c220, - 0x1bb90: 0x6cb82820, 0x1bb91: 0x6cb5c420, 0x1bb92: 0x6cabfa20, 0x1bb93: 0x6cd4c820, - 0x1bb94: 0x6cb8e220, 0x1bb95: 0x6c8ce420, 0x1bb96: 0x6d125c20, 0x1bb97: 0x6d0b9c20, - 0x1bb98: 0x6c742420, 0x1bb99: 0x6d32b020, 0x1bb9a: 0x6c899020, 0x1bb9b: 0x6c48b020, - 0x1bb9c: 0x6d175c20, 0x1bb9d: 0x6c5dc220, 0x1bb9e: 0x6ccd8220, 0x1bb9f: 0x6d332020, - 0x1bba0: 0x6c361020, 0x1bba1: 0x6c112a20, 0x1bba2: 0x6ce09420, 0x1bba3: 0x6c181e20, - 0x1bba4: 0x6c0db020, 0x1bba5: 0x6c69fa20, 0x1bba6: 0x6ce3ee20, 0x1bba7: 0x6c79a420, - 0x1bba8: 0x6ce99020, 0x1bba9: 0x6d0d6620, 0x1bbaa: 0x6c262220, 0x1bbab: 0x6d387420, - 0x1bbac: 0x6c708a20, 0x1bbad: 0x6ce53420, 0x1bbae: 0x6cb98820, 0x1bbaf: 0x6c791820, - 0x1bbb0: 0x6c040020, 0x1bbb1: 0x6cabd420, 0x1bbb2: 0x6c69fc20, 0x1bbb3: 0x6c91ba20, - 0x1bbb4: 0x6c48cc20, 0x1bbb5: 0x6ca04e20, 0x1bbb6: 0x6c454620, 0x1bbb7: 0x6d35e020, - 0x1bbb8: 0x6c283420, 0x1bbb9: 0x6c9c2a20, 0x1bbba: 0x6c11f220, 0x1bbbb: 0x6ccaa620, - 0x1bbbc: 0x6c498220, 0x1bbbd: 0x6caf1020, 0x1bbbe: 0x6d261c20, 0x1bbbf: 0x6caaee20, - // Block 0x6ef, offset 0x1bbc0 - 0x1bbc0: 0x6c659020, 0x1bbc1: 0x6d32c420, 0x1bbc2: 0x6c6f7220, 0x1bbc3: 0x6c659220, - 0x1bbc4: 0x6d212620, 0x1bbc5: 0x6d0ca820, 0x1bbc6: 0x6c7c7820, 0x1bbc7: 0x6ca42620, - 0x1bbc8: 0x6c52a420, 0x1bbc9: 0x6cc74a20, 0x1bbca: 0x6cb09620, 0x1bbcb: 0x6cee8820, - 0x1bbcc: 0x6cc9c420, 0x1bbcd: 0x6d408820, 0x1bbce: 0x6d079c20, 0x1bbcf: 0x6c9e7620, - 0x1bbd0: 0x6ce32420, 0x1bbd1: 0x6ca7dc20, 0x1bbd2: 0x6c139c20, 0x1bbd3: 0x6cd38620, - 0x1bbd4: 0x6d3ff220, 0x1bbd5: 0x6d324220, 0x1bbd6: 0x6d13f220, 0x1bbd7: 0x6d0a1020, - 0x1bbd8: 0x6d1df620, 0x1bbd9: 0x6c0af220, 0x1bbda: 0x6d0fb620, 0x1bbdb: 0x6c592220, - 0x1bbdc: 0x6d0d8220, 0x1bbdd: 0x6d296a20, 0x1bbde: 0x6c018620, 0x1bbdf: 0x6d059a20, - 0x1bbe0: 0x6d0bac20, 0x1bbe1: 0x6cf2ee20, 0x1bbe2: 0x6c784c20, 0x1bbe3: 0x6c1fb420, - 0x1bbe4: 0x6c600020, 0x1bbe5: 0x6ce3fa20, 0x1bbe6: 0x6c7e5e20, 0x1bbe7: 0x6c7e7a20, - 0x1bbe8: 0x6c18c820, 0x1bbe9: 0x6c762e20, 0x1bbea: 0x6c6f7420, 0x1bbeb: 0x6c6f7c20, - 0x1bbec: 0x6ce8ae20, 0x1bbed: 0x6c6a1220, 0x1bbee: 0x6c5ab420, 0x1bbef: 0x6c44b420, - 0x1bbf0: 0x6c1d5020, 0x1bbf1: 0x6cfed620, 0x1bbf2: 0x6c2ea420, 0x1bbf3: 0x6d004020, - 0x1bbf4: 0x6d256220, 0x1bbf5: 0x6cb98a20, 0x1bbf6: 0x6d127c20, 0x1bbf7: 0x6c139e20, - 0x1bbf8: 0x6d2bda20, 0x1bbf9: 0x6c069e20, 0x1bbfa: 0x6d10f820, 0x1bbfb: 0x6cee8a20, - 0x1bbfc: 0x6c086a20, 0x1bbfd: 0x6c802820, 0x1bbfe: 0x6cf20c20, 0x1bbff: 0x6cbe1420, - // Block 0x6f0, offset 0x1bc00 - 0x1bc00: 0x6c14ca20, 0x1bc01: 0x6c439220, 0x1bc02: 0x6c90e420, 0x1bc03: 0x6d3ff420, - 0x1bc04: 0x6c44ce20, 0x1bc05: 0x6c68f220, 0x1bc06: 0x6c46b820, 0x1bc07: 0x6cbe1a20, - 0x1bc08: 0x6cc68420, 0x1bc09: 0x6cc3ca20, 0x1bc0a: 0x6c1d7420, 0x1bc0b: 0x6c1fb620, - 0x1bc0c: 0x6d2df620, 0x1bc0d: 0x6cdcf020, 0x1bc0e: 0x6cdcd420, 0x1bc0f: 0x6c0f1220, - 0x1bc10: 0x6c1f4e20, 0x1bc11: 0x6cc67420, 0x1bc12: 0x6c057a20, 0x1bc13: 0x6c25ba20, - 0x1bc14: 0x6ccaac20, 0x1bc15: 0x6c780620, 0x1bc16: 0x6d111020, 0x1bc17: 0x6c29dc20, - 0x1bc18: 0x6d33ee20, 0x1bc19: 0x6caa6620, 0x1bc1a: 0x6c7e4820, 0x1bc1b: 0x6c64b020, - 0x1bc1c: 0x6cd9b020, 0x1bc1d: 0x6cc0ae20, 0x1bc1e: 0x6c430820, 0x1bc1f: 0x6cfc1420, - 0x1bc20: 0x6cd78620, 0x1bc21: 0x6cca8020, 0x1bc22: 0x6c6d1420, 0x1bc23: 0x6c9edc20, - 0x1bc24: 0x6c365820, 0x1bc25: 0x6c20ce20, 0x1bc26: 0x6caafc20, 0x1bc27: 0x6cccea20, - 0x1bc28: 0x6cde5c20, 0x1bc29: 0x6d2c7e20, 0x1bc2a: 0x6ce10220, 0x1bc2b: 0x6cac6420, - 0x1bc2c: 0x6c048620, 0x1bc2d: 0x6c265020, 0x1bc2e: 0x6c863020, 0x1bc2f: 0x6ce1d620, - 0x1bc30: 0x6c555c20, 0x1bc31: 0x6d365620, 0x1bc32: 0x6cebe220, 0x1bc33: 0x6c574220, - 0x1bc34: 0x6cb90220, 0x1bc35: 0x6cf20e20, 0x1bc36: 0x6cbb3e20, 0x1bc37: 0x6ce4ac20, - 0x1bc38: 0x6d316220, 0x1bc39: 0x6c365a20, 0x1bc3a: 0x6d00ba20, 0x1bc3b: 0x6cab0220, - 0x1bc3c: 0x6cc2fc20, 0x1bc3d: 0x6c13e220, 0x1bc3e: 0x6d2ccc20, 0x1bc3f: 0x6c441020, - // Block 0x6f1, offset 0x1bc40 - 0x1bc40: 0x6cf44e20, 0x1bc41: 0x6c372420, 0x1bc42: 0x6ccf5220, 0x1bc43: 0x6c776820, - 0x1bc44: 0x6ccf5420, 0x1bc45: 0x6cd4e820, 0x1bc46: 0x6c042620, 0x1bc47: 0x6d111220, - 0x1bc48: 0x6c0d8020, 0x1bc49: 0x6cd9be20, 0x1bc4a: 0x6cdfae20, 0x1bc4b: 0x6cc97820, - 0x1bc4c: 0x6c15ca20, 0x1bc4d: 0x6cdd2a20, 0x1bc4e: 0x6c6f8020, 0x1bc4f: 0x6c1cd220, - 0x1bc50: 0x6c205620, 0x1bc51: 0x6c48d220, 0x1bc52: 0x6c0de620, 0x1bc53: 0x6c3cac20, - 0x1bc54: 0x6cd65620, 0x1bc55: 0x6c2c7e20, 0x1bc56: 0x6cb7ae20, 0x1bc57: 0x6cd9cc20, - 0x1bc58: 0x6d2cf820, 0x1bc59: 0x6c88c220, 0x1bc5a: 0x6c197c20, 0x1bc5b: 0x6c1ab820, - 0x1bc5c: 0x6c499820, 0x1bc5d: 0x6c928220, 0x1bc5e: 0x6c961420, 0x1bc5f: 0x6c90ee20, - 0x1bc60: 0x6d400020, 0x1bc61: 0x6c413420, 0x1bc62: 0x6c56b620, 0x1bc63: 0x6d2bea20, - 0x1bc64: 0x6c209420, 0x1bc65: 0x6ce19e20, 0x1bc66: 0x6c57ac20, 0x1bc67: 0x6c24dc20, - 0x1bc68: 0x6ca38420, 0x1bc69: 0x6ca07220, 0x1bc6a: 0x6c676820, 0x1bc6b: 0x6c4a7a20, - 0x1bc6c: 0x6d1cfc20, 0x1bc6d: 0x6d348020, 0x1bc6e: 0x6c026020, 0x1bc6f: 0x6d36ae20, - 0x1bc70: 0x6ca85c20, 0x1bc71: 0x6c97ea20, 0x1bc72: 0x6c163020, 0x1bc73: 0x6c79c220, - 0x1bc74: 0x6c1e6220, 0x1bc75: 0x6ccf6420, 0x1bc76: 0x6ce95420, 0x1bc77: 0x6c691420, - 0x1bc78: 0x6ca05620, 0x1bc79: 0x6ca06820, 0x1bc7a: 0x6d306c20, 0x1bc7b: 0x6c11fc20, - 0x1bc7c: 0x6c794820, 0x1bc7d: 0x6c0c0a20, 0x1bc7e: 0x6c67f620, 0x1bc7f: 0x6d19f420, - // Block 0x6f2, offset 0x1bc80 - 0x1bc80: 0x6c46ce20, 0x1bc81: 0x6cb90420, 0x1bc82: 0x6c8aa020, 0x1bc83: 0x6c608420, - 0x1bc84: 0x6d1bce20, 0x1bc85: 0x6c73b420, 0x1bc86: 0x6cb1d020, 0x1bc87: 0x6cb1ca20, - 0x1bc88: 0x6c813c20, 0x1bc89: 0x6c33ac20, 0x1bc8a: 0x6cfcfa20, 0x1bc8b: 0x6cc84420, - 0x1bc8c: 0x6c4b6620, 0x1bc8d: 0x6d297420, 0x1bc8e: 0x6d185020, 0x1bc8f: 0x6cfb7e20, - 0x1bc90: 0x6c198820, 0x1bc91: 0x6c198a20, 0x1bc92: 0x6cc94620, 0x1bc93: 0x6ca4ba20, - 0x1bc94: 0x6c53ca20, 0x1bc95: 0x6cd81620, 0x1bc96: 0x6c4ee020, 0x1bc97: 0x6c4a2620, - 0x1bc98: 0x6c266420, 0x1bc99: 0x6d420c20, 0x1bc9a: 0x6ca73420, 0x1bc9b: 0x6c8c2a20, - 0x1bc9c: 0x6d332c20, 0x1bc9d: 0x6c5ae420, 0x1bc9e: 0x6d3c4820, 0x1bc9f: 0x6c692820, - 0x1bca0: 0x6c615020, 0x1bca1: 0x6c126620, 0x1bca2: 0x6c283c20, 0x1bca3: 0x6c283e20, - 0x1bca4: 0x6c183220, 0x1bca5: 0x6c0e8820, 0x1bca6: 0x6c17ee20, 0x1bca7: 0x6c73b620, - 0x1bca8: 0x6c3f8020, 0x1bca9: 0x6c89d220, 0x1bcaa: 0x6c07c220, 0x1bcab: 0x6c3f8220, - 0x1bcac: 0x6cbc5820, 0x1bcad: 0x6c0e8a20, 0x1bcae: 0x6c25c620, 0x1bcaf: 0x6d3d7a20, - 0x1bcb0: 0x6d3bda20, 0x1bcb1: 0x6ceff020, 0x1bcb2: 0x6cb40e20, 0x1bcb3: 0x6cbe2220, - 0x1bcb4: 0x6c33a620, 0x1bcb5: 0x6ca73620, 0x1bcb6: 0x6c574420, 0x1bcb7: 0x6d00d820, - 0x1bcb8: 0x6c912e20, 0x1bcb9: 0x6c692a20, 0x1bcba: 0x6c249020, 0x1bcbb: 0x6cde8c20, - 0x1bcbc: 0x6c4f0420, 0x1bcbd: 0x6cbc5c20, 0x1bcbe: 0x6cf29a20, 0x1bcbf: 0x6c65d620, - // Block 0x6f3, offset 0x1bcc0 - 0x1bcc0: 0x6c41ea20, 0x1bcc1: 0x6d1db220, 0x1bcc2: 0x6c825620, 0x1bcc3: 0x6ca46e20, - 0x1bcc4: 0x6c91da20, 0x1bcc5: 0x6ccda820, 0x1bcc6: 0x6d3d7c20, 0x1bcc7: 0x6d2afa20, - 0x1bcc8: 0x6cb41420, 0x1bcc9: 0x6c21d620, 0x1bcca: 0x6c5f5220, 0x1bccb: 0x6c293420, - 0x1bccc: 0x6ccb5620, 0x1bccd: 0x6c126820, 0x1bcce: 0x6cbe8c20, 0x1bccf: 0x6cbe8420, - 0x1bcd0: 0x6c595220, 0x1bcd1: 0x6c6a3020, 0x1bcd2: 0x6cbd9420, 0x1bcd3: 0x6c7b0220, - 0x1bcd4: 0x6c27fa20, 0x1bcd5: 0x6d00dc20, 0x1bcd6: 0x6c761420, 0x1bcd7: 0x6cb06e20, - 0x1bcd8: 0x6c040620, 0x1bcd9: 0x6c02f220, 0x1bcda: 0x6c728c20, 0x1bcdb: 0x6d132620, - 0x1bcdc: 0x6c370620, 0x1bcdd: 0x6c9c2c20, 0x1bcde: 0x6cda2620, 0x1bcdf: 0x6c9c7a20, - 0x1bce0: 0x6c615420, 0x1bce1: 0x6cdf4820, 0x1bce2: 0x6d3da820, 0x1bce3: 0x6c29f220, - 0x1bce4: 0x6d040a20, 0x1bce5: 0x6c804420, 0x1bce6: 0x6c10da20, 0x1bce7: 0x6c71d820, - 0x1bce8: 0x6d129220, 0x1bce9: 0x6cc80620, 0x1bcea: 0x6d136820, 0x1bceb: 0x6d135a20, - 0x1bcec: 0x6ca65220, 0x1bced: 0x6cf31420, 0x1bcee: 0x6c60bc20, 0x1bcef: 0x6c0d8820, - 0x1bcf0: 0x6ca92420, 0x1bcf1: 0x6c43b420, 0x1bcf2: 0x6d370420, 0x1bcf3: 0x6d36de20, - 0x1bcf4: 0x6c7e1a20, 0x1bcf5: 0x6ca08620, 0x1bcf6: 0x6c66ec20, 0x1bcf7: 0x6d011020, - 0x1bcf8: 0x6c8b4c20, 0x1bcf9: 0x6cdfc020, 0x1bcfa: 0x6c042a20, 0x1bcfb: 0x6cda3020, - 0x1bcfc: 0x6c91e820, 0x1bcfd: 0x6c94ca20, 0x1bcfe: 0x6cc54220, 0x1bcff: 0x6ce2fe20, - // Block 0x6f4, offset 0x1bd00 - 0x1bd00: 0x6cac4c20, 0x1bd01: 0x6d103620, 0x1bd02: 0x6c834c20, 0x1bd03: 0x6c10dc20, - 0x1bd04: 0x6cd51420, 0x1bd05: 0x6d297a20, 0x1bd06: 0x6ca74220, 0x1bd07: 0x6cfc4020, - 0x1bd08: 0x6c75fa20, 0x1bd09: 0x6c5d6620, 0x1bd0a: 0x6c86f420, 0x1bd0b: 0x6c7ea420, - 0x1bd0c: 0x6c58e420, 0x1bd0d: 0x6d1cb620, 0x1bd0e: 0x6c917020, 0x1bd0f: 0x6c904420, - 0x1bd10: 0x6cb93a20, 0x1bd11: 0x6cb93c20, 0x1bd12: 0x6d297c20, 0x1bd13: 0x6cb94620, - 0x1bd14: 0x6c7fe620, 0x1bd15: 0x6cfafc20, 0x1bd16: 0x6d1c1e20, 0x1bd17: 0x6c9a3a20, - 0x1bd18: 0x6cc50820, 0x1bd19: 0x6c14e020, 0x1bd1a: 0x6d1d6c20, 0x1bd1b: 0x6c249820, - 0x1bd1c: 0x6d012420, 0x1bd1d: 0x6ccf8a20, 0x1bd1e: 0x6c957420, 0x1bd1f: 0x6c760820, - 0x1bd20: 0x6c9cb220, 0x1bd21: 0x6c84a620, 0x1bd22: 0x6d298220, 0x1bd23: 0x6c945820, - 0x1bd24: 0x6cdfc420, 0x1bd25: 0x6d416420, 0x1bd26: 0x6c876620, 0x1bd27: 0x6c2cf820, - 0x1bd28: 0x6cec0020, 0x1bd29: 0x6c293c20, 0x1bd2a: 0x6c697420, 0x1bd2b: 0x6c751c20, - 0x1bd2c: 0x6c805c20, 0x1bd2d: 0x6c879e20, 0x1bd2e: 0x6ca47620, 0x1bd2f: 0x6d337e20, - 0x1bd30: 0x6c4b2820, 0x1bd31: 0x6c4ad820, 0x1bd32: 0x6cb4f020, 0x1bd33: 0x6d0a3a20, - 0x1bd34: 0x6cb3fc20, 0x1bd35: 0x6cdba820, 0x1bd36: 0x6cd42a20, 0x1bd37: 0x6c779a20, - 0x1bd38: 0x6d1e9020, 0x1bd39: 0x6c410c20, 0x1bd3a: 0x6d15bc20, 0x1bd3b: 0x6c455e20, - 0x1bd3c: 0x6c416620, 0x1bd3d: 0x6c047220, 0x1bd3e: 0x6c39e220, 0x1bd3f: 0x6d334220, - // Block 0x6f5, offset 0x1bd40 - 0x1bd40: 0x6cb36c20, 0x1bd41: 0x6c2cc020, 0x1bd42: 0x6c79da20, 0x1bd43: 0x6c9f9a20, - 0x1bd44: 0x6cf4c420, 0x1bd45: 0x6c480020, 0x1bd46: 0x6c50f020, 0x1bd47: 0x6c12d620, - 0x1bd48: 0x6cffdc20, 0x1bd49: 0x6c9ce620, 0x1bd4a: 0x6c1f2420, 0x1bd4b: 0x6c43d620, - 0x1bd4c: 0x6c2b6220, 0x1bd4d: 0x6d06b620, 0x1bd4e: 0x6c699a20, 0x1bd4f: 0x6c9fa820, - 0x1bd50: 0x6c18bc20, 0x1bd51: 0x6c6ff220, 0x1bd52: 0x6ccfda20, 0x1bd53: 0x6c344620, - 0x1bd54: 0x6d224e20, 0x1bd55: 0x6c1c0e20, 0x1bd56: 0x6c024020, 0x1bd57: 0x6c044020, - 0x1bd58: 0x6d06b820, 0x1bd59: 0x6c699c20, 0x1bd5a: 0x6c344820, 0x1bd5b: 0x6c88b420, - 0x1bd5c: 0x6ca82c20, 0x1bd5d: 0x6c097820, 0x1bd5e: 0x6c172c20, 0x1bd5f: 0x6c2d1a20, - 0x1bd60: 0x6c342e20, 0x1bd61: 0x6d179c20, 0x1bd62: 0x6c41d420, 0x1bd63: 0x6cca5420, - 0x1bd64: 0x6c786820, 0x1bd65: 0x6d0e7020, 0x1bd66: 0x6c339a20, 0x1bd67: 0x6c5ecc20, - 0x1bd68: 0x6ce81420, 0x1bd69: 0x6cffea20, 0x1bd6a: 0x6c345020, 0x1bd6b: 0x6c690620, - 0x1bd6c: 0x6c6e8420, 0x1bd6d: 0x6d0fc220, 0x1bd6e: 0x6cf9ce20, 0x1bd6f: 0x6c9f5e20, - 0x1bd70: 0x6cd5e420, 0x1bd71: 0x6c004820, 0x1bd72: 0x6cbb8c20, 0x1bd73: 0x6c004a20, - 0x1bd74: 0x6d333220, 0x1bd75: 0x6c2b8820, 0x1bd76: 0x6d324c20, 0x1bd77: 0x6c3d8e20, - 0x1bd78: 0x6cd60020, 0x1bd79: 0x6c8a1020, 0x1bd7a: 0x6cc13620, 0x1bd7b: 0x6d049e20, - 0x1bd7c: 0x6d161020, 0x1bd7d: 0x6c694020, 0x1bd7e: 0x6ccdfc20, 0x1bd7f: 0x6c694220, - // Block 0x6f6, offset 0x1bd80 - 0x1bd80: 0x6d3daa20, 0x1bd81: 0x6d18c220, 0x1bd82: 0x6c88ca20, 0x1bd83: 0x6c0a6820, - 0x1bd84: 0x6c848820, 0x1bd85: 0x6d002220, 0x1bd86: 0x6d002420, 0x1bd87: 0x6cf17a20, - 0x1bd88: 0x6d08f420, 0x1bd89: 0x6cb58220, 0x1bd8a: 0x6cb5a220, 0x1bd8b: 0x6d2cea20, - 0x1bd8c: 0x6c0d3620, 0x1bd8d: 0x6c742620, 0x1bd8e: 0x6d2cf020, 0x1bd8f: 0x6c80b820, - 0x1bd90: 0x6c3a5620, 0x1bd91: 0x6c048020, 0x1bd92: 0x6c048820, 0x1bd93: 0x6c7fb420, - 0x1bd94: 0x6d22a620, 0x1bd95: 0x6c7ff620, 0x1bd96: 0x6cf06420, 0x1bd97: 0x6c30f820, - 0x1bd98: 0x6cd0de20, 0x1bd99: 0x6c8a9420, 0x1bd9a: 0x6c640a20, 0x1bd9b: 0x6c554420, - 0x1bd9c: 0x6d00a020, 0x1bd9d: 0x6c641820, 0x1bd9e: 0x6d225820, 0x1bd9f: 0x6d316420, - 0x1bda0: 0x6c69ae20, 0x1bda1: 0x6cf30220, 0x1bda2: 0x6ce5ca20, 0x1bda3: 0x6c313a20, - 0x1bda4: 0x6c6c1e20, 0x1bda5: 0x6c1bdc20, 0x1bda6: 0x6d1a2e20, 0x1bda7: 0x6c3f4420, - 0x1bda8: 0x6cbaa420, 0x1bda9: 0x6d2ddc20, 0x1bdaa: 0x6cc17820, 0x1bdab: 0x6d3d3220, - 0x1bdac: 0x6d2de620, 0x1bdad: 0x6c32ba20, 0x1bdae: 0x6c262820, 0x1bdaf: 0x6cd7e820, - 0x1bdb0: 0x6d02dc20, 0x1bdb1: 0x6d3d5c20, 0x1bdb2: 0x6d3d7e20, 0x1bdb3: 0x6cbd9620, - 0x1bdb4: 0x6c8bda20, 0x1bdb5: 0x6d3dac20, 0x1bdb6: 0x6c1f7c20, 0x1bdb7: 0x6c32e020, - 0x1bdb8: 0x6d3a9020, 0x1bdb9: 0x6c398020, 0x1bdba: 0x6c159820, 0x1bdbb: 0x6c4f5e20, - 0x1bdbc: 0x6d20c220, 0x1bdbd: 0x6cd1aa20, 0x1bdbe: 0x6cae0e20, 0x1bdbf: 0x6d1f0820, - // Block 0x6f7, offset 0x1bdc0 - 0x1bdc0: 0x6c9a7c20, 0x1bdc1: 0x6cacfa20, 0x1bdc2: 0x6cb5a420, 0x1bdc3: 0x6d2d6820, - 0x1bdc4: 0x6c98d020, 0x1bdc5: 0x6c938a20, 0x1bdc6: 0x6cae1220, 0x1bdc7: 0x6caf6020, - 0x1bdc8: 0x6c8e4e20, 0x1bdc9: 0x6c3d6220, 0x1bdca: 0x6c39d020, 0x1bdcb: 0x6d081020, - 0x1bdcc: 0x6c6daa20, 0x1bdcd: 0x6c6dac20, 0x1bdce: 0x6ca63620, 0x1bdcf: 0x6d40b820, - 0x1bdd0: 0x6d2fb020, 0x1bdd1: 0x6d15ee20, 0x1bdd2: 0x6c8e6a20, 0x1bdd3: 0x6cce7420, - 0x1bdd4: 0x6c668a20, 0x1bdd5: 0x6d214c20, 0x1bdd6: 0x6d15fe20, 0x1bdd7: 0x6cb61a20, - 0x1bdd8: 0x6d36e020, 0x1bdd9: 0x6c385e20, 0x1bdda: 0x6cb16620, 0x1bddb: 0x6c386020, - 0x1bddc: 0x6d2db220, 0x1bddd: 0x6c7b4420, 0x1bdde: 0x6cdc9a20, 0x1bddf: 0x6d21d420, - 0x1bde0: 0x6cf39a20, 0x1bde1: 0x6c616c20, 0x1bde2: 0x6c61a820, 0x1bde3: 0x6c61ec20, - 0x1bde4: 0x6c5dce20, 0x1bde5: 0x6cc63620, 0x1bde6: 0x6c285e20, 0x1bde7: 0x6c6fca20, - 0x1bde8: 0x6d34d820, 0x1bde9: 0x6d2a3a20, 0x1bdea: 0x6d006820, 0x1bdeb: 0x6ce54620, - 0x1bdec: 0x6d09d620, 0x1bded: 0x6d066820, 0x1bdee: 0x6c40bc20, 0x1bdef: 0x6c7e5820, - 0x1bdf0: 0x6c420c20, 0x1bdf1: 0x6c4e8a20, 0x1bdf2: 0x6cdf1020, 0x1bdf3: 0x6c2c1620, - 0x1bdf4: 0x6d056620, 0x1bdf5: 0x6c159420, 0x1bdf6: 0x6cd23a20, 0x1bdf7: 0x6c7bde20, - 0x1bdf8: 0x6d0f7c20, 0x1bdf9: 0x6cd24620, 0x1bdfa: 0x6cee4c20, 0x1bdfb: 0x6c9f3020, - 0x1bdfc: 0x6c9f3220, 0x1bdfd: 0x6cea8620, 0x1bdfe: 0x6c20fc20, 0x1bdff: 0x6cf42820, - // Block 0x6f8, offset 0x1be00 - 0x1be00: 0x6d278820, 0x1be01: 0x6c06e620, 0x1be02: 0x6c01f420, 0x1be03: 0x6d2b3e20, - 0x1be04: 0x6c04ba20, 0x1be05: 0x6c6a7420, 0x1be06: 0x6c7d4c20, 0x1be07: 0x6cd0e020, - 0x1be08: 0x6c566820, 0x1be09: 0x6c39c420, 0x1be0a: 0x6c501c20, 0x1be0b: 0x6c4b2e20, - 0x1be0c: 0x6c166020, 0x1be0d: 0x6d077c20, 0x1be0e: 0x6c9fe820, 0x1be0f: 0x6c5cb220, - 0x1be10: 0x6c3b1620, 0x1be11: 0x6cbdc820, 0x1be12: 0x6c54a220, 0x1be13: 0x6d16ba20, - 0x1be14: 0x6cf58620, 0x1be15: 0x6d02b220, 0x1be16: 0x6d0c6420, 0x1be17: 0x6d2b4020, - 0x1be18: 0x6c39c620, 0x1be19: 0x6cdfd220, 0x1be1a: 0x6cd09420, 0x1be1b: 0x6c721020, - 0x1be1c: 0x6d0f9620, 0x1be1d: 0x6d296020, 0x1be1e: 0x6c0dcc20, 0x1be1f: 0x6d036a20, - 0x1be20: 0x6d1d3420, 0x1be21: 0x6d087620, 0x1be22: 0x6cb36e20, 0x1be23: 0x6d31c020, - 0x1be24: 0x6c8cb420, 0x1be25: 0x6c210020, 0x1be26: 0x6c502020, 0x1be27: 0x6c9a7e20, - 0x1be28: 0x6d422e20, 0x1be29: 0x6ca0e020, 0x1be2a: 0x6c0b8620, 0x1be2b: 0x6d069020, - 0x1be2c: 0x6c5cb420, 0x1be2d: 0x6d2f5c20, 0x1be2e: 0x6d401820, 0x1be2f: 0x6cd33820, - 0x1be30: 0x6cd33a20, 0x1be31: 0x6d22e220, 0x1be32: 0x6c3a8e20, 0x1be33: 0x6c2e7420, - 0x1be34: 0x6c993220, 0x1be35: 0x6ca68620, 0x1be36: 0x6c16e620, 0x1be37: 0x6cf14a20, - 0x1be38: 0x6c2fe420, 0x1be39: 0x6c006220, 0x1be3a: 0x6c0dce20, 0x1be3b: 0x6c01f620, - 0x1be3c: 0x6d390e20, 0x1be3d: 0x6c8f7420, 0x1be3e: 0x6cfbec20, 0x1be3f: 0x6c7be820, - // Block 0x6f9, offset 0x1be40 - 0x1be40: 0x6ce5ba20, 0x1be41: 0x6c175c20, 0x1be42: 0x6cd25c20, 0x1be43: 0x6c5a8220, - 0x1be44: 0x6c5a4e20, 0x1be45: 0x6d084820, 0x1be46: 0x6c7c6220, 0x1be47: 0x6d058020, - 0x1be48: 0x6c68dc20, 0x1be49: 0x6c6cea20, 0x1be4a: 0x6d35ba20, 0x1be4b: 0x6c6cec20, - 0x1be4c: 0x6cce3620, 0x1be4d: 0x6ce72e20, 0x1be4e: 0x6c53a020, 0x1be4f: 0x6d0e5020, - 0x1be50: 0x6c40ec20, 0x1be51: 0x6cfde020, 0x1be52: 0x6ccc9c20, 0x1be53: 0x6cffa820, - 0x1be54: 0x6d12de20, 0x1be55: 0x6d274c20, 0x1be56: 0x6c5aa220, 0x1be57: 0x6c4dfe20, - 0x1be58: 0x6c4eac20, 0x1be59: 0x6c75ae20, 0x1be5a: 0x6ced0820, 0x1be5b: 0x6cfcb020, - 0x1be5c: 0x6c7d5820, 0x1be5d: 0x6d392020, 0x1be5e: 0x6cf5ea20, 0x1be5f: 0x6c19de20, - 0x1be60: 0x6cd15820, 0x1be61: 0x6c101420, 0x1be62: 0x6d304c20, 0x1be63: 0x6d304e20, - 0x1be64: 0x6cf4dc20, 0x1be65: 0x6c4eae20, 0x1be66: 0x6c5bb620, 0x1be67: 0x6c503420, - 0x1be68: 0x6c194e20, 0x1be69: 0x6ced1820, 0x1be6a: 0x6ce4f420, 0x1be6b: 0x6d3d5e20, - 0x1be6c: 0x6d41b220, 0x1be6d: 0x6d38e820, 0x1be6e: 0x6cb48c20, 0x1be6f: 0x6c6e2020, - 0x1be70: 0x6cf60c20, 0x1be71: 0x6ccd4020, 0x1be72: 0x6ca63820, 0x1be73: 0x6cf60e20, - 0x1be74: 0x6cbe7a20, 0x1be75: 0x6cb6fc20, 0x1be76: 0x6c6db420, 0x1be77: 0x6c4afc20, - 0x1be78: 0x6d332220, 0x1be79: 0x6d179e20, 0x1be7a: 0x6d362820, 0x1be7b: 0x6c01c220, - 0x1be7c: 0x6ced1a20, 0x1be7d: 0x6c8bb220, 0x1be7e: 0x6c89b820, 0x1be7f: 0x6c166e20, - // Block 0x6fa, offset 0x1be80 - 0x1be80: 0x6cee1820, 0x1be81: 0x6cffac20, 0x1be82: 0x6d298c20, 0x1be83: 0x6c3b0620, - 0x1be84: 0x6d07a620, 0x1be85: 0x6c453420, 0x1be86: 0x6d151820, 0x1be87: 0x6cf9d020, - 0x1be88: 0x6d275420, 0x1be89: 0x6c5ac220, 0x1be8a: 0x6d064220, 0x1be8b: 0x6c9fba20, - 0x1be8c: 0x6c7c8820, 0x1be8d: 0x6d126020, 0x1be8e: 0x6d1d3a20, 0x1be8f: 0x6cd55c20, - 0x1be90: 0x6cefd820, 0x1be91: 0x6cd55a20, 0x1be92: 0x6cbe8220, 0x1be93: 0x6c998e20, - 0x1be94: 0x6ca40020, 0x1be95: 0x6c65ac20, 0x1be96: 0x6caa9420, 0x1be97: 0x6c01c620, - 0x1be98: 0x6d0fc420, 0x1be99: 0x6c210a20, 0x1be9a: 0x6d111e20, 0x1be9b: 0x6cdd7820, - 0x1be9c: 0x6c6d2820, 0x1be9d: 0x6ca00e20, 0x1be9e: 0x6c691620, 0x1be9f: 0x6c766620, - 0x1bea0: 0x6c430e20, 0x1bea1: 0x6cf25620, 0x1bea2: 0x6c171c20, 0x1bea3: 0x6cb7b020, - 0x1bea4: 0x6c505220, 0x1bea5: 0x6d0e9420, 0x1bea6: 0x6c864a20, 0x1bea7: 0x6c00ba20, - 0x1bea8: 0x6c623620, 0x1bea9: 0x6c626020, 0x1beaa: 0x6c9af820, 0x1beab: 0x6d299620, - 0x1beac: 0x6d01f820, 0x1bead: 0x6c505820, 0x1beae: 0x6ca2a220, 0x1beaf: 0x6ca14020, - 0x1beb0: 0x6c233820, 0x1beb1: 0x6ca6b820, 0x1beb2: 0x6d2ed420, 0x1beb3: 0x6c5c1420, - 0x1beb4: 0x6c066220, 0x1beb5: 0x6c4ef820, 0x1beb6: 0x6d081e20, 0x1beb7: 0x6c200420, - 0x1beb8: 0x6c8a1820, 0x1beb9: 0x6cfacc20, 0x1beba: 0x6c28ae20, 0x1bebb: 0x6c6e2e20, - 0x1bebc: 0x6cb1d220, 0x1bebd: 0x6c8bdc20, 0x1bebe: 0x6cea2820, 0x1bebf: 0x6cf80e20, - // Block 0x6fb, offset 0x1bec0 - 0x1bec0: 0x6d189220, 0x1bec1: 0x6c627620, 0x1bec2: 0x6c5a7620, 0x1bec3: 0x6c278820, - 0x1bec4: 0x6d131220, 0x1bec5: 0x6d131420, 0x1bec6: 0x6c867820, 0x1bec7: 0x6ce00e20, - 0x1bec8: 0x6ce78220, 0x1bec9: 0x6cffba20, 0x1beca: 0x6c3ace20, 0x1becb: 0x6cd07420, - 0x1becc: 0x6d2fde20, 0x1becd: 0x6c506620, 0x1bece: 0x6d18c420, 0x1becf: 0x6cfdfc20, - 0x1bed0: 0x6d03a220, 0x1bed1: 0x6cd02620, 0x1bed2: 0x6c694a20, 0x1bed3: 0x6c067020, - 0x1bed4: 0x6c6eaa20, 0x1bed5: 0x6d0ed020, 0x1bed6: 0x6c00de20, 0x1bed7: 0x6d135c20, - 0x1bed8: 0x6cc7dc20, 0x1bed9: 0x6cd57420, 0x1beda: 0x6c9b5820, 0x1bedb: 0x6d09b820, - 0x1bedc: 0x6d122e20, 0x1bedd: 0x6cb4bc20, 0x1bede: 0x6c86ca20, 0x1bedf: 0x6c18f620, - 0x1bee0: 0x6c7c0e20, 0x1bee1: 0x6c2f0420, 0x1bee2: 0x6c8a7e20, 0x1bee3: 0x6d0ef820, - 0x1bee4: 0x6c5e3e20, 0x1bee5: 0x6c917e20, 0x1bee6: 0x6cf73220, 0x1bee7: 0x6cc6dc20, - 0x1bee8: 0x6c8fd620, 0x1bee9: 0x6ca47220, 0x1beea: 0x6c95d620, 0x1beeb: 0x6c945a20, - 0x1beec: 0x6cccae20, 0x1beed: 0x6ce18e20, 0x1beee: 0x6d0e2420, 0x1beef: 0x6d3a4420, - 0x1bef0: 0x6d264220, 0x1bef1: 0x6d264420, 0x1bef2: 0x6cc0c620, 0x1bef3: 0x6d12bc20, - 0x1bef4: 0x6c452620, 0x1bef5: 0x6d12c420, 0x1bef6: 0x6c54a420, 0x1bef7: 0x6c50d620, - 0x1bef8: 0x6cd4b820, 0x1bef9: 0x6c127420, 0x1befa: 0x6c127020, 0x1befb: 0x6cd18620, - 0x1befc: 0x6c97da20, 0x1befd: 0x6c134820, 0x1befe: 0x6c135020, 0x1beff: 0x6ce3fc20, - // Block 0x6fc, offset 0x1bf00 - 0x1bf00: 0x6d41b020, 0x1bf01: 0x6c11d020, 0x1bf02: 0x6d06d620, 0x1bf03: 0x6c5be220, - 0x1bf04: 0x6d1af620, 0x1bf05: 0x6cbcd220, 0x1bf06: 0x6c3b4220, 0x1bf07: 0x6cb03820, - 0x1bf08: 0x6d266820, 0x1bf09: 0x6d1f9820, 0x1bf0a: 0x6cc85020, 0x1bf0b: 0x6cae8e20, - 0x1bf0c: 0x6c3b5a20, 0x1bf0d: 0x6c3df220, 0x1bf0e: 0x6c8cb620, 0x1bf0f: 0x6c3a4820, - 0x1bf10: 0x6cc17a20, 0x1bf11: 0x6ce3da20, 0x1bf12: 0x6caa7e20, 0x1bf13: 0x6ce5bc20, - 0x1bf14: 0x6cd77620, 0x1bf15: 0x6d322e20, 0x1bf16: 0x6c80fa20, 0x1bf17: 0x6c80f820, - 0x1bf18: 0x6d416c20, 0x1bf19: 0x6c9ff620, 0x1bf1a: 0x6c598c20, 0x1bf1b: 0x6cee5220, - 0x1bf1c: 0x6cea2020, 0x1bf1d: 0x6c176220, 0x1bf1e: 0x6c5ed220, 0x1bf1f: 0x6cb4f220, - 0x1bf20: 0x6d1bba20, 0x1bf21: 0x6d3f9820, 0x1bf22: 0x6cee5820, 0x1bf23: 0x6ce78420, - 0x1bf24: 0x6c811220, 0x1bf25: 0x6c81fa20, 0x1bf26: 0x6c9b5a20, 0x1bf27: 0x6c8fd820, - 0x1bf28: 0x6ca25c20, 0x1bf29: 0x6c2ac820, 0x1bf2a: 0x6cf06c20, 0x1bf2b: 0x6ca0bc20, - 0x1bf2c: 0x6c079220, 0x1bf2d: 0x6d2c1620, 0x1bf2e: 0x6cd59020, 0x1bf2f: 0x6cd59220, - 0x1bf30: 0x6ca26220, 0x1bf31: 0x6d397e20, 0x1bf32: 0x6cc56620, 0x1bf33: 0x6c031420, - 0x1bf34: 0x6cb48220, 0x1bf35: 0x6c352a20, 0x1bf36: 0x6c347020, 0x1bf37: 0x6c29ba20, - 0x1bf38: 0x6c857220, 0x1bf39: 0x6c4abe20, 0x1bf3a: 0x6c5e7820, 0x1bf3b: 0x6c6f4820, - 0x1bf3c: 0x6c08b220, 0x1bf3d: 0x6d051c20, 0x1bf3e: 0x6c19b420, 0x1bf3f: 0x6c22a820, - // Block 0x6fd, offset 0x1bf40 - 0x1bf40: 0x6ccbc020, 0x1bf41: 0x6cc83420, 0x1bf42: 0x6d28ac20, 0x1bf43: 0x6cc2b420, - 0x1bf44: 0x6cb8a620, 0x1bf45: 0x6d20b620, 0x1bf46: 0x6c416820, 0x1bf47: 0x6cf35420, - 0x1bf48: 0x6c137c20, 0x1bf49: 0x6cccbc20, 0x1bf4a: 0x6d09dc20, 0x1bf4b: 0x6c388420, - 0x1bf4c: 0x6cf4aa20, 0x1bf4d: 0x6d3ee620, 0x1bf4e: 0x6c87d820, 0x1bf4f: 0x6d041220, - 0x1bf50: 0x6c110820, 0x1bf51: 0x6c259220, 0x1bf52: 0x6cc5c220, 0x1bf53: 0x6c0bea20, - 0x1bf54: 0x6ceaa220, 0x1bf55: 0x6c2c1820, 0x1bf56: 0x6d2f2220, 0x1bf57: 0x6c983220, - 0x1bf58: 0x6c1be220, 0x1bf59: 0x6d168a20, 0x1bf5a: 0x6c412c20, 0x1bf5b: 0x6c456020, - 0x1bf5c: 0x6c323420, 0x1bf5d: 0x6c83a220, 0x1bf5e: 0x6cb6d620, 0x1bf5f: 0x6cd59820, - 0x1bf60: 0x6c425620, 0x1bf61: 0x6ce56a20, 0x1bf62: 0x6c681a20, 0x1bf63: 0x6ccdf820, - 0x1bf64: 0x6cedb620, 0x1bf65: 0x6c7ee020, 0x1bf66: 0x6c704420, 0x1bf67: 0x6c983420, - 0x1bf68: 0x6d0f7e20, 0x1bf69: 0x6c96b220, 0x1bf6a: 0x6c9e8820, 0x1bf6b: 0x6cd88e20, - 0x1bf6c: 0x6d254020, 0x1bf6d: 0x6c4f6020, 0x1bf6e: 0x6c3a8620, 0x1bf6f: 0x6c069020, - 0x1bf70: 0x6c6a7e20, 0x1bf71: 0x6c2fe020, 0x1bf72: 0x6c430020, 0x1bf73: 0x6d118e20, - 0x1bf74: 0x6cfa7c20, 0x1bf75: 0x6c1ed620, 0x1bf76: 0x6c20fe20, 0x1bf77: 0x6cabd020, - 0x1bf78: 0x6cd4a820, 0x1bf79: 0x6c578220, 0x1bf7a: 0x6d02b420, 0x1bf7b: 0x6c1e2020, - 0x1bf7c: 0x6d3aae20, 0x1bf7d: 0x6c1e2220, 0x1bf7e: 0x6cd90420, 0x1bf7f: 0x6c04bc20, - // Block 0x6fe, offset 0x1bf80 - 0x1bf80: 0x6cd90620, 0x1bf81: 0x6c5fd420, 0x1bf82: 0x6cf2d620, 0x1bf83: 0x6c6cda20, - 0x1bf84: 0x6c469420, 0x1bf85: 0x6c5e8e20, 0x1bf86: 0x6c98c620, 0x1bf87: 0x6cafb820, - 0x1bf88: 0x6c093a20, 0x1bf89: 0x6cee6220, 0x1bf8a: 0x6c021220, 0x1bf8b: 0x6c398820, - 0x1bf8c: 0x6c3b5c20, 0x1bf8d: 0x6d16bc20, 0x1bf8e: 0x6c3df420, 0x1bf8f: 0x6ca3e420, - 0x1bf90: 0x6cf58820, 0x1bf91: 0x6c566a20, 0x1bf92: 0x6d0ad420, 0x1bf93: 0x6c30dc20, - 0x1bf94: 0x6d02fe20, 0x1bf95: 0x6d31ba20, 0x1bf96: 0x6d109020, 0x1bf97: 0x6c8ba020, - 0x1bf98: 0x6cc8c220, 0x1bf99: 0x6c35ac20, 0x1bf9a: 0x6c99d620, 0x1bf9b: 0x6d2f9a20, - 0x1bf9c: 0x6c4cae20, 0x1bf9d: 0x6d339620, 0x1bf9e: 0x6c230420, 0x1bf9f: 0x6d281c20, - 0x1bfa0: 0x6d41e420, 0x1bfa1: 0x6c30de20, 0x1bfa2: 0x6cd4aa20, 0x1bfa3: 0x6d2a3c20, - 0x1bfa4: 0x6c352c20, 0x1bfa5: 0x6c858e20, 0x1bfa6: 0x6c934620, 0x1bfa7: 0x6c656620, - 0x1bfa8: 0x6c19be20, 0x1bfa9: 0x6cd9a020, 0x1bfaa: 0x6cbaa620, 0x1bfab: 0x6c3c2220, - 0x1bfac: 0x6ca3e620, 0x1bfad: 0x6cfe8620, 0x1bfae: 0x6cfa8a20, 0x1bfaf: 0x6c7a2e20, - 0x1bfb0: 0x6cb28420, 0x1bfb1: 0x6cdf1c20, 0x1bfb2: 0x6cf7d420, 0x1bfb3: 0x6d350220, - 0x1bfb4: 0x6c48da20, 0x1bfb5: 0x6cfe8c20, 0x1bfb6: 0x6c643a20, 0x1bfb7: 0x6c633420, - 0x1bfb8: 0x6c467620, 0x1bfb9: 0x6c05aa20, 0x1bfba: 0x6ca0e220, 0x1bfbb: 0x6d16f220, - 0x1bfbc: 0x6d12d820, 0x1bfbd: 0x6d12e020, 0x1bfbe: 0x6cd33c20, 0x1bfbf: 0x6ca7fa20, - // Block 0x6ff, offset 0x1bfc0 - 0x1bfc0: 0x6c08c220, 0x1bfc1: 0x6c34d820, 0x1bfc2: 0x6d149e20, 0x1bfc3: 0x6c8cb820, - 0x1bfc4: 0x6c0dd020, 0x1bfc5: 0x6ca63020, 0x1bfc6: 0x6c7e4020, 0x1bfc7: 0x6c50d820, - 0x1bfc8: 0x6c04f020, 0x1bfc9: 0x6c388620, 0x1bfca: 0x6d37a420, 0x1bfcb: 0x6c274620, - 0x1bfcc: 0x6c222c20, 0x1bfcd: 0x6d100a20, 0x1bfce: 0x6c3d4a20, 0x1bfcf: 0x6c041a20, - 0x1bfd0: 0x6ca1fe20, 0x1bfd1: 0x6c418620, 0x1bfd2: 0x6cb4d420, 0x1bfd3: 0x6cc4ba20, - 0x1bfd4: 0x6cc74220, 0x1bfd5: 0x6c995220, 0x1bfd6: 0x6cce9a20, 0x1bfd7: 0x6cd90e20, - 0x1bfd8: 0x6d30e620, 0x1bfd9: 0x6cf99620, 0x1bfda: 0x6d202a20, 0x1bfdb: 0x6ccfba20, - 0x1bfdc: 0x6c4b3020, 0x1bfdd: 0x6ceb9a20, 0x1bfde: 0x6d2cb420, 0x1bfdf: 0x6ca3ec20, - 0x1bfe0: 0x6ca8fe20, 0x1bfe1: 0x6d1e2420, 0x1bfe2: 0x6c2be420, 0x1bfe3: 0x6d359e20, - 0x1bfe4: 0x6d2bcc20, 0x1bfe5: 0x6c13cc20, 0x1bfe6: 0x6c287020, 0x1bfe7: 0x6c46f820, - 0x1bfe8: 0x6c107620, 0x1bfe9: 0x6c6fdc20, 0x1bfea: 0x6c022820, 0x1bfeb: 0x6c3e0c20, - 0x1bfec: 0x6c657020, 0x1bfed: 0x6c032e20, 0x1bfee: 0x6c34da20, 0x1bfef: 0x6c77de20, - 0x1bff0: 0x6ca3b020, 0x1bff1: 0x6d3abe20, 0x1bff2: 0x6c094820, 0x1bff3: 0x6c8efa20, - 0x1bff4: 0x6c147620, 0x1bff5: 0x6cccd020, 0x1bff6: 0x6cd89e20, 0x1bff7: 0x6c1f1820, - 0x1bff8: 0x6cadb620, 0x1bff9: 0x6cd31a20, 0x1bffa: 0x6c48dc20, 0x1bffb: 0x6d2bce20, - 0x1bffc: 0x6d119820, 0x1bffd: 0x6c195620, 0x1bffe: 0x6c6fde20, 0x1bfff: 0x6cd33e20, - // Block 0x700, offset 0x1c000 - 0x1c000: 0x6d33a620, 0x1c001: 0x6c8efc20, 0x1c002: 0x6c99de20, 0x1c003: 0x6c87da20, - 0x1c004: 0x6cc65620, 0x1c005: 0x6d2cb620, 0x1c006: 0x6d2aa020, 0x1c007: 0x6c0bec20, - 0x1c008: 0x6d2e4c20, 0x1c009: 0x6d35a020, 0x1c00a: 0x6c8f7620, 0x1c00b: 0x6c306220, - 0x1c00c: 0x6c914420, 0x1c00d: 0x6cd0ea20, 0x1c00e: 0x6c85a620, 0x1c00f: 0x6c7f9020, - 0x1c010: 0x6d1e1c20, 0x1c011: 0x6cd5ae20, 0x1c012: 0x6d09f620, 0x1c013: 0x6cd68420, - 0x1c014: 0x6cb76820, 0x1c015: 0x6d313820, 0x1c016: 0x6cb4dc20, 0x1c017: 0x6c85ca20, - 0x1c018: 0x6d14c220, 0x1c019: 0x6cfdba20, 0x1c01a: 0x6d323020, 0x1c01b: 0x6c85cc20, - 0x1c01c: 0x6ccb1a20, 0x1c01d: 0x6c484e20, 0x1c01e: 0x6c76a420, 0x1c01f: 0x6c078420, - 0x1c020: 0x6cc58e20, 0x1c021: 0x6cffde20, 0x1c022: 0x6c041c20, 0x1c023: 0x6cc59020, - 0x1c024: 0x6c0e1220, 0x1c025: 0x6d3e1620, 0x1c026: 0x6c1d9820, 0x1c027: 0x6d172c20, - 0x1c028: 0x6c22be20, 0x1c029: 0x6d063420, 0x1c02a: 0x6d399220, 0x1c02b: 0x6c666c20, - 0x1c02c: 0x6d41a820, 0x1c02d: 0x6c374a20, 0x1c02e: 0x6c378e20, 0x1c02f: 0x6d1fb820, - 0x1c030: 0x6c380c20, 0x1c031: 0x6c45e220, 0x1c032: 0x6c77a620, 0x1c033: 0x6c81ac20, - 0x1c034: 0x6d2d6a20, 0x1c035: 0x6c8aec20, 0x1c036: 0x6d19be20, 0x1c037: 0x6d104420, - 0x1c038: 0x6c50f220, 0x1c039: 0x6c449820, 0x1c03a: 0x6d172e20, 0x1c03b: 0x6cd34e20, - 0x1c03c: 0x6c43dc20, 0x1c03d: 0x6d28fc20, 0x1c03e: 0x6c943620, 0x1c03f: 0x6c3e3420, - // Block 0x701, offset 0x1c040 - 0x1c040: 0x6c6aa620, 0x1c041: 0x6c525c20, 0x1c042: 0x6c4b3e20, 0x1c043: 0x6ce21020, - 0x1c044: 0x6c49e420, 0x1c045: 0x6ceef420, 0x1c046: 0x6c7b9820, 0x1c047: 0x6cc79620, - 0x1c048: 0x6c01ac20, 0x1c049: 0x6c012020, 0x1c04a: 0x6c734a20, 0x1c04b: 0x6d14c420, - 0x1c04c: 0x6d3cf820, 0x1c04d: 0x6c7a3620, 0x1c04e: 0x6d35bc20, 0x1c04f: 0x6cbf0420, - 0x1c050: 0x6ce73020, 0x1c051: 0x6cca6c20, 0x1c052: 0x6cca6a20, 0x1c053: 0x6c586a20, - 0x1c054: 0x6c710420, 0x1c055: 0x6c6fea20, 0x1c056: 0x6d094c20, 0x1c057: 0x6c34e020, - 0x1c058: 0x6d3c7c20, 0x1c059: 0x6d20f220, 0x1c05a: 0x6d296420, - 0x1c05c: 0x6d1ba620, 0x1c05d: 0x6c6c1820, 0x1c05e: 0x6c8f6220, 0x1c05f: 0x6d2e5020, - 0x1c060: 0x6d0ade20, 0x1c061: 0x6cc52620, 0x1c062: 0x6d313a20, 0x1c063: 0x6c295e20, - 0x1c064: 0x6cb4de20, 0x1c065: 0x6cbbd820, 0x1c066: 0x6c578c20, 0x1c067: 0x6c4b4020, - 0x1c068: 0x6c67a220, 0x1c069: 0x6d3c1220, 0x1c06a: 0x6d09f820, 0x1c06b: 0x6cdd1620, - 0x1c06c: 0x6ccbe620, 0x1c06d: 0x6d314e20, 0x1c06e: 0x6c069a20, 0x1c06f: 0x6ce64020, - 0x1c070: 0x6c7df220, 0x1c071: 0x6c6e7020, 0x1c072: 0x6cb3c220, 0x1c073: 0x6c07b020, - 0x1c074: 0x6c3e4e20, 0x1c075: 0x6cc89a20, 0x1c076: 0x6ce7b620, 0x1c077: 0x6c742820, - 0x1c078: 0x6cf5ec20, 0x1c079: 0x6c80ba20, 0x1c07a: 0x6c8f0420, 0x1c07b: 0x6c3c3c20, - 0x1c07c: 0x6cb4e820, 0x1c07d: 0x6cf1d420, 0x1c07e: 0x6c756c20, 0x1c07f: 0x6c41d620, - // Block 0x702, offset 0x1c080 - 0x1c080: 0x6cdaa220, 0x1c081: 0x6c894c20, 0x1c082: 0x6cc04620, 0x1c083: 0x6ce6be20, - 0x1c084: 0x6d1fc020, 0x1c085: 0x6c99ec20, 0x1c086: 0x6c052420, 0x1c087: 0x6c906620, - 0x1c088: 0x6cae6820, 0x1c089: 0x6d3c1620, 0x1c08a: 0x6c2c4020, 0x1c08b: 0x6d078c20, - 0x1c08c: 0x6ce8a220, 0x1c08d: 0x6d2a7e20, 0x1c08e: 0x6c022a20, 0x1c08f: 0x6c481020, - 0x1c090: 0x6c097a20, 0x1c091: 0x6c2b6820, 0x1c092: 0x6c4e0020, 0x1c093: 0x6d3f0820, - 0x1c094: 0x6d33d420, 0x1c095: 0x6cc5e620, 0x1c096: 0x6c070e20, 0x1c097: 0x6c450820, - 0x1c098: 0x6c658620, 0x1c099: 0x6c591020, 0x1c09a: 0x6ced0a20, 0x1c09b: 0x6caaba20, - 0x1c09c: 0x6c634a20, 0x1c09d: 0x6ce57c20, 0x1c09e: 0x6c61ee20, 0x1c09f: 0x6cfeb220, - 0x1c0a0: 0x6c938e20, 0x1c0a1: 0x6c5ce620, 0x1c0a2: 0x6cce6820, 0x1c0a3: 0x6c133020, - 0x1c0a4: 0x6c3b6c20, 0x1c0a5: 0x6cd91a20, 0x1c0a6: 0x6c9c0220, 0x1c0a7: 0x6cf3c020, - 0x1c0a8: 0x6c83bc20, 0x1c0a9: 0x6c83be20, 0x1c0aa: 0x6c311020, 0x1c0ab: 0x6cbdd020, - 0x1c0ac: 0x6d1cea20, 0x1c0ad: 0x6cdd1820, 0x1c0ae: 0x6c708c20, 0x1c0af: 0x6ce2ea20, - 0x1c0b0: 0x6d019020, 0x1c0b1: 0x6c7da820, 0x1c0b2: 0x6d3d5020, 0x1c0b3: 0x6cd4ca20, - 0x1c0b4: 0x6c14c020, 0x1c0b5: 0x6c394220, 0x1c0b6: 0x6cefae20, 0x1c0b7: 0x6c6e7220, - 0x1c0b8: 0x6c83c020, 0x1c0b9: 0x6c0d3220, 0x1c0ba: 0x6cfa6420, 0x1c0bb: 0x6c3d1020, - 0x1c0bc: 0x6ce21c20, 0x1c0bd: 0x6d35e220, 0x1c0be: 0x6c7efa20, 0x1c0bf: 0x6c87fc20, - // Block 0x703, offset 0x1c0c0 - 0x1c0c0: 0x6c658820, 0x1c0c1: 0x6d3cfc20, 0x1c0c2: 0x6c8ce620, 0x1c0c3: 0x6c83d420, - 0x1c0c4: 0x6cb79220, 0x1c0c5: 0x6c0e2220, 0x1c0c6: 0x6c94f820, 0x1c0c7: 0x6c231620, - 0x1c0c8: 0x6cba5420, 0x1c0c9: 0x6c9dc420, 0x1c0ca: 0x6cb5e620, 0x1c0cb: 0x6cb5e820, - 0x1c0cc: 0x6c114620, 0x1c0cd: 0x6c4bf820, 0x1c0ce: 0x6c14f420, 0x1c0cf: 0x6c2a7020, - 0x1c0d0: 0x6c3a5820, 0x1c0d1: 0x6cabfe20, 0x1c0d2: 0x6c057020, 0x1c0d3: 0x6c057220, - 0x1c0d4: 0x6c5cca20, 0x1c0d5: 0x6d3f8e20, 0x1c0d6: 0x6c1a0020, 0x1c0d7: 0x6d2a4c20, - 0x1c0d8: 0x6c603820, 0x1c0d9: 0x6c861020, 0x1c0da: 0x6caea020, 0x1c0db: 0x6d233e20, - 0x1c0dc: 0x6d234020, 0x1c0dd: 0x6c481420, 0x1c0de: 0x6c75ba20, 0x1c0df: 0x6c307620, - 0x1c0e0: 0x6ce0f620, 0x1c0e1: 0x6c428020, 0x1c0e2: 0x6cee1a20, 0x1c0e3: 0x6c2c5620, - 0x1c0e4: 0x6c262a20, 0x1c0e5: 0x6c389c20, 0x1c0e6: 0x6c195c20, 0x1c0e7: 0x6d2e6220, - 0x1c0e8: 0x6cb6fe20, 0x1c0e9: 0x6d24f620, 0x1c0ea: 0x6d0d8820, 0x1c0eb: 0x6d234220, - 0x1c0ec: 0x6cc29e20, 0x1c0ed: 0x6d17a020, 0x1c0ee: 0x6ccbaa20, 0x1c0ef: 0x6cc59820, - 0x1c0f0: 0x6c20d220, 0x1c0f1: 0x6c837820, 0x1c0f2: 0x6cb4f420, 0x1c0f3: 0x6d3d0220, - 0x1c0f4: 0x6c3e7a20, 0x1c0f5: 0x6c77f820, 0x1c0f6: 0x6c7f0820, 0x1c0f7: 0x6d405220, - 0x1c0f8: 0x6d405420, 0x1c0f9: 0x6d2fb220, 0x1c0fa: 0x6c491620, 0x1c0fb: 0x6c3b2a20, - 0x1c0fc: 0x6c3b7420, 0x1c0fd: 0x6ccfe620, 0x1c0fe: 0x6cbe7c20, 0x1c0ff: 0x6ca5e420, - // Block 0x704, offset 0x1c100 - 0x1c100: 0x6ced1c20, 0x1c101: 0x6c4cc020, 0x1c102: 0x6c925420, 0x1c103: 0x6c4fc620, - 0x1c104: 0x6c6a1620, 0x1c105: 0x6d15f020, 0x1c106: 0x6c1dae20, 0x1c107: 0x6c71b620, - 0x1c108: 0x6c712220, 0x1c109: 0x6c1a0220, 0x1c10a: 0x6d423a20, 0x1c10b: 0x6c895420, - 0x1c10c: 0x6cbab820, 0x1c10d: 0x6d346020, 0x1c10e: 0x6c20d420, 0x1c10f: 0x6d0af020, - 0x1c110: 0x6c709220, 0x1c111: 0x6c06a020, 0x1c112: 0x6c684620, 0x1c113: 0x6d3d6020, - 0x1c114: 0x6d3e3a20, 0x1c115: 0x6c0d3820, 0x1c116: 0x6caea220, 0x1c117: 0x6c2fa620, - 0x1c118: 0x6c1eda20, 0x1c119: 0x6c172e20, 0x1c11a: 0x6c9b0620, 0x1c11b: 0x6c57dc20, - 0x1c11c: 0x6c659420, 0x1c11d: 0x6c4a6820, 0x1c11e: 0x6cf88820, 0x1c11f: 0x6c319c20, - 0x1c120: 0x6cba5620, 0x1c121: 0x6c2a5820, 0x1c122: 0x6c4bb420, 0x1c123: 0x6c2da020, - 0x1c124: 0x6c954620, 0x1c125: 0x6d33e020, 0x1c126: 0x6cc38220, 0x1c127: 0x6ca04420, - 0x1c128: 0x6c40b220, 0x1c129: 0x6c454820, 0x1c12a: 0x6caf1220, 0x1c12b: 0x6d2dee20, - 0x1c12c: 0x6d199420, 0x1c12d: 0x6ceb7e20, 0x1c12e: 0x6ccbac20, 0x1c12f: 0x6c349a20, - 0x1c130: 0x6d125e20, 0x1c131: 0x6c400c20, 0x1c132: 0x6cefda20, 0x1c133: 0x6cee9a20, - 0x1c134: 0x6c32c820, 0x1c135: 0x6c641a20, 0x1c136: 0x6d3f9a20, 0x1c137: 0x6c64b220, - 0x1c138: 0x6d151a20, 0x1c139: 0x6cd0ae20, 0x1c13a: 0x6cf78620, 0x1c13b: 0x6d0e8220, - 0x1c13c: 0x6d0da220, 0x1c13d: 0x6c200020, 0x1c13e: 0x6c64b420, 0x1c13f: 0x6c210c20, - // Block 0x705, offset 0x1c140 - 0x1c140: 0x6d226a20, 0x1c141: 0x6c513a20, 0x1c142: 0x6d2be020, 0x1c143: 0x6cf2fa20, - 0x1c144: 0x6cb11420, 0x1c145: 0x6c087a20, 0x1c146: 0x6d10ac20, 0x1c147: 0x6c5dd020, - 0x1c148: 0x6d05b220, 0x1c149: 0x6cc92020, 0x1c14a: 0x6d0fc620, 0x1c14b: 0x6c7e7c20, - 0x1c14c: 0x6d0caa20, 0x1c14d: 0x6c079e20, 0x1c14e: 0x6c5ac420, 0x1c14f: 0x6c7c8a20, - 0x1c150: 0x6c6bea20, 0x1c151: 0x6c7c8c20, 0x1c152: 0x6cd7f220, 0x1c153: 0x6c3c5420, - 0x1c154: 0x6d004820, 0x1c155: 0x6ceb8220, 0x1c156: 0x6d35e420, 0x1c157: 0x6c668c20, - 0x1c158: 0x6ca29a20, 0x1c159: 0x6c999020, 0x1c15a: 0x6c1f9420, 0x1c15b: 0x6c569e20, - 0x1c15c: 0x6c556c20, 0x1c15d: 0x6c890420, 0x1c15e: 0x6c837a20, 0x1c15f: 0x6ce67e20, - 0x1c160: 0x6ca40220, 0x1c161: 0x6d215220, 0x1c162: 0x6d1f4620, 0x1c163: 0x6c9a0820, - 0x1c164: 0x6cd96620, 0x1c165: 0x6d089a20, 0x1c166: 0x6d089c20, 0x1c167: 0x6d101e20, - 0x1c168: 0x6d316620, 0x1c169: 0x6cb11620, 0x1c16a: 0x6d12fe20, 0x1c16b: 0x6c605220, - 0x1c16c: 0x6c6ae620, 0x1c16d: 0x6d130020, 0x1c16e: 0x6c1ee020, 0x1c16f: 0x6c33fa20, - 0x1c170: 0x6d212820, 0x1c171: 0x6d408a20, 0x1c172: 0x6cee9c20, 0x1c173: 0x6c9a0a20, - 0x1c174: 0x6ce40220, 0x1c175: 0x6c603a20, 0x1c176: 0x6c6ae820, 0x1c177: 0x6c766220, - 0x1c178: 0x6cbfb420, 0x1c179: 0x6d1c7e20, 0x1c17a: 0x6cc77a20, 0x1c17b: 0x6c59d020, - 0x1c17c: 0x6c909620, 0x1c17d: 0x6c822220, 0x1c17e: 0x6cc38420, 0x1c17f: 0x6cfe7620, - // Block 0x706, offset 0x1c180 - 0x1c180: 0x6cb23c20, 0x1c181: 0x6cd41820, 0x1c182: 0x6c414420, 0x1c183: 0x6cdfe820, - 0x1c184: 0x6c802e20, 0x1c185: 0x6cf15620, 0x1c186: 0x6d215420, 0x1c187: 0x6c192c20, - 0x1c188: 0x6c935620, 0x1c189: 0x6c71be20, 0x1c18a: 0x6cd0cc20, 0x1c18b: 0x6c1f9620, - 0x1c18c: 0x6cb0ea20, 0x1c18d: 0x6d01d420, 0x1c18e: 0x6c642420, 0x1c18f: 0x6d182420, - 0x1c190: 0x6d2e0220, 0x1c191: 0x6c3ec020, 0x1c192: 0x6cab0620, 0x1c193: 0x6c9d6620, - 0x1c194: 0x6c80c220, 0x1c195: 0x6cc69020, 0x1c196: 0x6c47ae20, 0x1c197: 0x6c66a820, - 0x1c198: 0x6c71c020, 0x1c199: 0x6cddf220, 0x1c19a: 0x6d11c020, 0x1c19b: 0x6d317a20, - 0x1c19c: 0x6c055220, 0x1c19d: 0x6ccc0820, 0x1c19e: 0x6d259220, 0x1c19f: 0x6d3f2020, - 0x1c1a0: 0x6ca01020, 0x1c1a1: 0x6cdae620, 0x1c1a2: 0x6c644c20, 0x1c1a3: 0x6d112020, - 0x1c1a4: 0x6c6b0a20, 0x1c1a5: 0x6c5a7420, 0x1c1a6: 0x6c422a20, 0x1c1a7: 0x6c3a6220, - 0x1c1a8: 0x6d2cd020, 0x1c1a9: 0x6cb9ae20, 0x1c1aa: 0x6c96ce20, 0x1c1ab: 0x6cdcf420, - 0x1c1ac: 0x6d259420, 0x1c1ad: 0x6d01d620, 0x1c1ae: 0x6cc69220, 0x1c1af: 0x6cd27c20, - 0x1c1b0: 0x6d33fe20, 0x1c1b1: 0x6c24de20, 0x1c1b2: 0x6d27ba20, 0x1c1b3: 0x6ce68020, - 0x1c1b4: 0x6c8e7a20, 0x1c1b5: 0x6cc68620, 0x1c1b6: 0x6ce10e20, 0x1c1b7: 0x6cc3de20, - 0x1c1b8: 0x6d2cfa20, 0x1c1b9: 0x6cd80220, 0x1c1ba: 0x6cd17420, 0x1c1bb: 0x6cde7020, - 0x1c1bc: 0x6c781420, 0x1c1bd: 0x6cf66c20, 0x1c1be: 0x6c479c20, 0x1c1bf: 0x6cb51020, - // Block 0x707, offset 0x1c1c0 - 0x1c1c0: 0x6c431020, 0x1c1c1: 0x6c431220, 0x1c1c2: 0x6cdcdc20, 0x1c1c3: 0x6cac6620, - 0x1c1c4: 0x6ce1da20, 0x1c1c5: 0x6c441220, 0x1c1c6: 0x6d0a1a20, 0x1c1c7: 0x6c2cd420, - 0x1c1c8: 0x6caa2420, 0x1c1c9: 0x6c606420, 0x1c1ca: 0x6cd78c20, 0x1c1cb: 0x6c46c220, - 0x1c1cc: 0x6c20d820, 0x1c1cd: 0x6cbacc20, 0x1c1ce: 0x6c13ec20, 0x1c1cf: 0x6cba1620, - 0x1c1d0: 0x6c57ec20, 0x1c1d1: 0x6c9a1820, 0x1c1d2: 0x6d070a20, 0x1c1d3: 0x6c42ac20, - 0x1c1d4: 0x6c42cc20, 0x1c1d5: 0x6d3d8020, 0x1c1d6: 0x6ceb3620, 0x1c1d7: 0x6cbc7420, - 0x1c1d8: 0x6d105c20, 0x1c1d9: 0x6c2cd620, 0x1c1da: 0x6c642620, 0x1c1db: 0x6c76e220, - 0x1c1dc: 0x6d41be20, 0x1c1dd: 0x6c2a5a20, 0x1c1de: 0x6c907220, 0x1c1df: 0x6c0d4420, - 0x1c1e0: 0x6d39ba20, 0x1c1e1: 0x6ccaa420, 0x1c1e2: 0x6cf79c20, 0x1c1e3: 0x6c5f1420, - 0x1c1e4: 0x6c882220, 0x1c1e5: 0x6c5c1620, 0x1c1e6: 0x6d1da420, 0x1c1e7: 0x6cba7420, - 0x1c1e8: 0x6c4cc220, 0x1c1e9: 0x6c414620, 0x1c1ea: 0x6c415020, 0x1c1eb: 0x6ce95820, - 0x1c1ec: 0x6c57bc20, 0x1c1ed: 0x6cb52020, 0x1c1ee: 0x6ccbae20, 0x1c1ef: 0x6c24e220, - 0x1c1f0: 0x6caeb220, 0x1c1f1: 0x6d1fe420, 0x1c1f2: 0x6c559020, 0x1c1f3: 0x6c67b620, - 0x1c1f4: 0x6c56be20, 0x1c1f5: 0x6c594a20, 0x1c1f6: 0x6c4b6820, 0x1c1f7: 0x6ca85e20, - 0x1c1f8: 0x6d185220, 0x1c1f9: 0x6c42d820, 0x1c1fa: 0x6c774420, 0x1c1fb: 0x6c4a8620, - 0x1c1fc: 0x6c4a8820, 0x1c1fd: 0x6c128a20, 0x1c1fe: 0x6c97fa20, 0x1c1ff: 0x6c6cac20, - // Block 0x708, offset 0x1c200 - 0x1c200: 0x6c2b4020, 0x1c201: 0x6d3c2220, 0x1c202: 0x6c822620, 0x1c203: 0x6c810a20, - 0x1c204: 0x6c18dc20, 0x1c205: 0x6c233a20, 0x1c206: 0x6c841820, 0x1c207: 0x6d04e220, - 0x1c208: 0x6cbe8620, 0x1c209: 0x6cd6da20, 0x1c20a: 0x6c38b220, 0x1c20b: 0x6ce7c220, - 0x1c20c: 0x6c499e20, 0x1c20d: 0x6d2ae820, 0x1c20e: 0x6cdafc20, 0x1c20f: 0x6c82d020, - 0x1c210: 0x6c91d220, 0x1c211: 0x6c896620, 0x1c212: 0x6c9d7820, 0x1c213: 0x6c90b020, - 0x1c214: 0x6c177420, 0x1c215: 0x6cdafe20, 0x1c216: 0x6c782220, 0x1c217: 0x6c1e6620, - 0x1c218: 0x6ce12020, 0x1c219: 0x6c0c1620, 0x1c21a: 0x6c92a220, 0x1c21b: 0x6c6f8420, - 0x1c21c: 0x6d30fc20, 0x1c21d: 0x6d2bf620, 0x1c21e: 0x6cd50020, 0x1c21f: 0x6d2ed620, - 0x1c220: 0x6c977020, 0x1c221: 0x6ca06a20, 0x1c222: 0x6ca7a820, 0x1c223: 0x6d106a20, - 0x1c224: 0x6ce59820, 0x1c225: 0x6caeb420, 0x1c226: 0x6d3b1e20, 0x1c227: 0x6ccc0e20, - 0x1c228: 0x6cf6c020, 0x1c229: 0x6cc31020, 0x1c22a: 0x6c526c20, 0x1c22b: 0x6c64ce20, - 0x1c22c: 0x6c233c20, 0x1c22d: 0x6c630e20, 0x1c22e: 0x6d0f3a20, 0x1c22f: 0x6cbb1820, - 0x1c230: 0x6d098820, 0x1c231: 0x6d1be420, 0x1c232: 0x6c37de20, 0x1c233: 0x6d0a3c20, - 0x1c234: 0x6d349820, 0x1c235: 0x6cbbf620, 0x1c236: 0x6d417c20, 0x1c237: 0x6c23b420, - 0x1c238: 0x6cb49620, 0x1c239: 0x6cd60a20, 0x1c23a: 0x6c57ae20, 0x1c23b: 0x6c7d1e20, - 0x1c23c: 0x6d319020, 0x1c23d: 0x6d41f220, 0x1c23e: 0x6d26ec20, 0x1c23f: 0x6ccdac20, - // Block 0x709, offset 0x1c240 - 0x1c240: 0x6cf6c420, 0x1c241: 0x6c211420, 0x1c242: 0x6c2d8020, 0x1c243: 0x6c382620, - 0x1c244: 0x6c41e620, 0x1c245: 0x6ca07620, 0x1c246: 0x6cf47a20, 0x1c247: 0x6cbbaa20, - 0x1c248: 0x6cc52c20, 0x1c249: 0x6c8c6020, 0x1c24a: 0x6c8e9620, 0x1c24b: 0x6cbbf820, - 0x1c24c: 0x6cfd0c20, 0x1c24d: 0x6cc90820, 0x1c24e: 0x6c38ba20, 0x1c24f: 0x6d2e1420, - 0x1c250: 0x6ceb4820, 0x1c251: 0x6c81bc20, 0x1c252: 0x6d27c620, 0x1c253: 0x6cd75a20, - 0x1c254: 0x6c33ae20, 0x1c255: 0x6c199220, 0x1c256: 0x6ce13220, 0x1c257: 0x6c9b3820, - 0x1c258: 0x6c715a20, 0x1c259: 0x6c1a4220, 0x1c25a: 0x6cdb3020, 0x1c25b: 0x6c74ba20, - 0x1c25c: 0x6c74bc20, 0x1c25d: 0x6c2d8220, 0x1c25e: 0x6c5c3020, 0x1c25f: 0x6c5f3020, - 0x1c260: 0x6caae020, 0x1c261: 0x6cfe4e20, 0x1c262: 0x6ceb8e20, 0x1c263: 0x6ca94620, - 0x1c264: 0x6cc8b020, 0x1c265: 0x6d39c420, 0x1c266: 0x6ce78620, 0x1c267: 0x6d2b8e20, - 0x1c268: 0x6c3b9420, 0x1c269: 0x6cbf6020, 0x1c26a: 0x6cc4d220, 0x1c26b: 0x6c526e20, - 0x1c26c: 0x6cb9c820, 0x1c26d: 0x6c472e20, 0x1c26e: 0x6c8f1a20, 0x1c26f: 0x6c81e020, - 0x1c270: 0x6c42dc20, 0x1c271: 0x6c1eae20, 0x1c272: 0x6cf94620, 0x1c273: 0x6cd18820, - 0x1c274: 0x6d3f6c20, 0x1c275: 0x6cca6820, 0x1c276: 0x6c60a620, 0x1c277: 0x6c30c620, - 0x1c278: 0x6c6eca20, 0x1c279: 0x6c91dc20, 0x1c27a: 0x6c673c20, 0x1c27b: 0x6c1f9820, - 0x1c27c: 0x6d25aa20, 0x1c27d: 0x6cde9c20, 0x1c27e: 0x6cd50c20, 0x1c27f: 0x6c678220, - // Block 0x70a, offset 0x1c280 - 0x1c280: 0x6ce01820, 0x1c281: 0x6c8c3820, 0x1c282: 0x6ca9cc20, 0x1c283: 0x6d1b0620, - 0x1c284: 0x6cf7a820, 0x1c285: 0x6cdc8020, 0x1c286: 0x6ccd1020, 0x1c287: 0x6d41d020, - 0x1c288: 0x6d082a20, 0x1c289: 0x6c199a20, 0x1c28a: 0x6c423420, 0x1c28b: 0x6c716220, - 0x1c28c: 0x6d41d820, 0x1c28d: 0x6d18c620, 0x1c28e: 0x6cbda220, 0x1c28f: 0x6cb49c20, - 0x1c290: 0x6d0cd620, 0x1c291: 0x6c826020, 0x1c292: 0x6c3c6a20, 0x1c293: 0x6c5b6c20, - 0x1c294: 0x6c299220, 0x1c295: 0x6c629620, 0x1c296: 0x6cdc7020, 0x1c297: 0x6c0ff820, - 0x1c298: 0x6cb2d420, 0x1c299: 0x6c1a4420, 0x1c29a: 0x6c1ef020, 0x1c29b: 0x6d3b5a20, - 0x1c29c: 0x6c4b7c20, 0x1c29d: 0x6c60aa20, 0x1c29e: 0x6c6ba020, 0x1c29f: 0x6c643020, - 0x1c2a0: 0x6cbe8e20, 0x1c2a1: 0x6d2d2020, 0x1c2a2: 0x6c65e020, 0x1c2a3: 0x6cbb2820, - 0x1c2a4: 0x6c2a3420, 0x1c2a5: 0x6d161a20, 0x1c2a6: 0x6c0c8220, 0x1c2a7: 0x6cd93a20, - 0x1c2a8: 0x6ccefe20, 0x1c2a9: 0x6c8c3a20, 0x1c2aa: 0x6c87e420, 0x1c2ab: 0x6c140e20, - 0x1c2ac: 0x6c9b5c20, 0x1c2ad: 0x6d1aa020, 0x1c2ae: 0x6ce24820, 0x1c2af: 0x6cdf4e20, - 0x1c2b0: 0x6c9de020, 0x1c2b1: 0x6cb67020, 0x1c2b2: 0x6ce96820, 0x1c2b3: 0x6c0d5c20, - 0x1c2b4: 0x6c5e0820, 0x1c2b5: 0x6c62aa20, 0x1c2b6: 0x6cb93420, 0x1c2b7: 0x6ca65820, - 0x1c2b8: 0x6ca92a20, 0x1c2b9: 0x6d142220, 0x1c2ba: 0x6c432a20, 0x1c2bb: 0x6c76f620, - 0x1c2bc: 0x6d1b9220, 0x1c2bd: 0x6caa2c20, 0x1c2be: 0x6cbeba20, 0x1c2bf: 0x6d0de620, - // Block 0x70b, offset 0x1c2c0 - 0x1c2c0: 0x6cb67220, 0x1c2c1: 0x6c9d9e20, 0x1c2c2: 0x6d2fe820, 0x1c2c3: 0x6c4b8820, - 0x1c2c4: 0x6c212220, 0x1c2c5: 0x6c5f6a20, 0x1c2c6: 0x6c7ca420, 0x1c2c7: 0x6cb33c20, - 0x1c2c8: 0x6c2af020, 0x1c2c9: 0x6c1eba20, 0x1c2ca: 0x6c449020, 0x1c2cb: 0x6c9de420, - 0x1c2cc: 0x6d1ec220, 0x1c2cd: 0x6d373e20, 0x1c2ce: 0x6c5a6620, 0x1c2cf: 0x6cb93e20, - 0x1c2d0: 0x6c82f420, 0x1c2d1: 0x6c827020, 0x1c2d2: 0x6cc9a820, 0x1c2d3: 0x6c91f220, - 0x1c2d4: 0x6c86cc20, 0x1c2d5: 0x6c24a220, 0x1c2d6: 0x6c941220, 0x1c2d7: 0x6c9efc20, - 0x1c2d8: 0x6c5c7a20, 0x1c2d9: 0x6cab5c20, 0x1c2da: 0x6c916220, 0x1c2db: 0x6d370620, - 0x1c2dc: 0x6c42ea20, 0x1c2dd: 0x6c31d020, 0x1c2de: 0x6d25c620, 0x1c2df: 0x6c86f620, - 0x1c2e0: 0x6c3ae820, 0x1c2e1: 0x6d3dba20, 0x1c2e2: 0x6cda3420, 0x1c2e3: 0x6c886020, - 0x1c2e4: 0x6c681c20, 0x1c2e5: 0x6c1ec420, 0x1c2e6: 0x6cbeec20, 0x1c2e7: 0x6d39e020, - 0x1c2e8: 0x6c918020, 0x1c2e9: 0x6d0cfc20, 0x1c2ea: 0x6c871a20, 0x1c2eb: 0x6d39de20, - 0x1c2ec: 0x6c193e20, 0x1c2ed: 0x6c6b5a20, 0x1c2ee: 0x6c36d820, 0x1c2ef: 0x6cda6820, - 0x1c2f0: 0x6c580020, 0x1c2f1: 0x6ca8a220, 0x1c2f2: 0x6d244e20, 0x1c2f3: 0x6c8fdc20, - 0x1c2f4: 0x6c7f7420, 0x1c2f5: 0x6c69f020, 0x1c2f6: 0x6cfc4620, 0x1c2f7: 0x6c4aa820, - 0x1c2f8: 0x6c71de20, 0x1c2f9: 0x6cff4820, 0x1c2fa: 0x6c8d9a20, 0x1c2fb: 0x6d1c2a20, - 0x1c2fc: 0x6c653c20, 0x1c2fd: 0x6d1b2420, 0x1c2fe: 0x6d1f9620, 0x1c2ff: 0x6d1cc420, - // Block 0x70c, offset 0x1c300 - 0x1c300: 0x6cfd9a20, 0x1c301: 0x6ca9e020, 0x1c302: 0x6c0fb620, 0x1c303: 0x6c156020, - 0x1c304: 0x6c7ff820, 0x1c305: 0x6c71e220, 0x1c306: 0x6cd6b220, 0x1c307: 0x6ccf9020, - 0x1c308: 0x6cef7420, 0x1c309: 0x6c23cc20, 0x1c30a: 0x6cc33020, 0x1c30b: 0x6cc20620, - 0x1c30c: 0x6c126220, 0x1c30d: 0x6c704820, 0x1c30e: 0x6d247a20, 0x1c30f: 0x6c957e20, - 0x1c310: 0x6c878a20, 0x1c311: 0x6c24a820, 0x1c312: 0x6c945c20, 0x1c313: 0x6c294420, - 0x1c314: 0x6c752820, 0x1c315: 0x6d0f3e20, 0x1c316: 0x6c806420, 0x1c317: 0x6c800e20, - 0x1c318: 0x6d3a4620, 0x1c319: 0x6c82a220, 0x1c31a: 0x6c855420, 0x1c31b: 0x6c03e020, - 0x1c31c: 0x6ca46620, 0x1c31d: 0x6d249220, 0x1c31e: 0x6c8dd820, 0x1c31f: 0x6c4a3020, - 0x1c320: 0x6cba3820, 0x1c321: 0x6c22aa20, 0x1c322: 0x6c596a20, 0x1c323: 0x6d02b620, - 0x1c324: 0x6d20b820, 0x1c325: 0x6d16be20, 0x1c326: 0x6cb8b220, 0x1c327: 0x6cab3020, - 0x1c328: 0x6d057820, 0x1c329: 0x6c173c20, 0x1c32a: 0x6c1f1a20, 0x1c32b: 0x6cb78020, - 0x1c32c: 0x6c768220, 0x1c32d: 0x6d173020, 0x1c32e: 0x6c741420, 0x1c32f: 0x6cf87020, - 0x1c330: 0x6d06a420, 0x1c331: 0x6c509820, 0x1c332: 0x6d231420, 0x1c333: 0x6c7cf220, - 0x1c334: 0x6c80ac20, 0x1c335: 0x6c7b6220, 0x1c336: 0x6cd77c20, 0x1c337: 0x6cf5ee20, - 0x1c338: 0x6c002220, 0x1c339: 0x6d13f420, 0x1c33a: 0x6cb4f620, 0x1c33b: 0x6c1f9e20, - 0x1c33c: 0x6c1ba620, 0x1c33d: 0x6cbd3020, 0x1c33e: 0x6c7b6620, 0x1c33f: 0x6c76d420, - // Block 0x70d, offset 0x1c340 - 0x1c340: 0x6c7b6820, 0x1c341: 0x6c76dc20, 0x1c342: 0x6c202220, 0x1c343: 0x6ccc5a20, - 0x1c344: 0x6c485a20, 0x1c345: 0x6d19ea20, 0x1c346: 0x6d02de20, 0x1c347: 0x6d004a20, - 0x1c348: 0x6d215620, 0x1c349: 0x6cba6820, 0x1c34a: 0x6cfeec20, 0x1c34b: 0x6d131620, - 0x1c34c: 0x6c43a020, 0x1c34d: 0x6cf37420, 0x1c34e: 0x6ce0a820, 0x1c34f: 0x6c6d3e20, - 0x1c350: 0x6cab4820, 0x1c351: 0x6c54f820, 0x1c352: 0x6ce40e20, 0x1c353: 0x6c582c20, - 0x1c354: 0x6d05d420, 0x1c355: 0x6cae3820, 0x1c356: 0x6cf81020, 0x1c357: 0x6d000820, - 0x1c358: 0x6c1fa220, 0x1c359: 0x6ccf7820, 0x1c35a: 0x6ccdae20, 0x1c35b: 0x6c4dbe20, - 0x1c35c: 0x6c1f7e20, 0x1c35d: 0x6d18c820, 0x1c35e: 0x6c36c420, 0x1c35f: 0x6d21b420, - 0x1c360: 0x6c21e220, 0x1c361: 0x6c596e20, 0x1c362: 0x6d34cc20, 0x1c363: 0x6d333620, - 0x1c364: 0x6c228a20, 0x1c365: 0x6c105e20, 0x1c366: 0x6cf42c20, 0x1c367: 0x6cb58420, - 0x1c368: 0x6c106e20, 0x1c369: 0x6c107020, 0x1c36a: 0x6cec4e20, 0x1c36b: 0x6c721220, - 0x1c36c: 0x6cb97e20, 0x1c36d: 0x6c1b1620, 0x1c36e: 0x6ccb2a20, 0x1c36f: 0x6c1ba820, - 0x1c370: 0x6ccb3620, 0x1c371: 0x6d37fa20, 0x1c372: 0x6cdc4620, 0x1c373: 0x6cdc4820, - 0x1c374: 0x6c864c20, 0x1c375: 0x6c263420, 0x1c376: 0x6d218220, 0x1c377: 0x6c867c20, - 0x1c378: 0x6c4a9a20, 0x1c379: 0x6c271220, 0x1c37a: 0x6c35ca20, 0x1c37b: 0x6cd86c20, - 0x1c37c: 0x6c646420, 0x1c37d: 0x6d301c20, 0x1c37e: 0x6ca0cc20, 0x1c37f: 0x6ca0ce20, - // Block 0x70e, offset 0x1c380 - 0x1c380: 0x6d109220, 0x1c381: 0x6ca0d020, 0x1c382: 0x6c242020, 0x1c383: 0x6d0f5020, - 0x1c384: 0x6ce4da20, 0x1c385: 0x6cd0ee20, 0x1c386: 0x6c274820, 0x1c387: 0x6cce0020, - 0x1c388: 0x6d06a620, 0x1c389: 0x6d0a7c20, 0x1c38a: 0x6cd4ba20, 0x1c38b: 0x6c118c20, - 0x1c38c: 0x6c742a20, 0x1c38d: 0x6cb19420, 0x1c38e: 0x6cb85c20, 0x1c38f: 0x6cc04820, - 0x1c390: 0x6cdaa420, 0x1c391: 0x6cbe7820, 0x1c392: 0x6d27e620, 0x1c393: 0x6c88ee20, - 0x1c394: 0x6d17a220, 0x1c395: 0x6c3d2a20, 0x1c396: 0x6d346220, 0x1c397: 0x6d12f220, - 0x1c398: 0x6c119620, 0x1c399: 0x6c5cce20, 0x1c39a: 0x6c27e020, 0x1c39b: 0x6c603c20, - 0x1c39c: 0x6c2ebe20, 0x1c39d: 0x6d317c20, 0x1c39e: 0x6d27f220, 0x1c39f: 0x6cf15820, - 0x1c3a0: 0x6c1e4820, 0x1c3a1: 0x6c0d8220, 0x1c3a2: 0x6ce41220, 0x1c3a3: 0x6c6d4020, - 0x1c3a4: 0x6cce1620, 0x1c3a5: 0x6d1a9220, 0x1c3a6: 0x6c2dda20, 0x1c3a7: 0x6c702220, - 0x1c3a8: 0x6c5c3220, 0x1c3a9: 0x6c24b020, 0x1c3aa: 0x6d189820, 0x1c3ab: 0x6c27fc20, - 0x1c3ac: 0x6c327e20, 0x1c3ad: 0x6c678420, 0x1c3ae: 0x6c892020, 0x1c3af: 0x6c0d8c20, - 0x1c3b0: 0x6c31d220, 0x1c3b1: 0x6c674020, 0x1c3b2: 0x6c653e20, 0x1c3b3: 0x6cd49820, - 0x1c3b4: 0x6cab3220, 0x1c3b5: 0x6c32b620, 0x1c3b6: 0x6d3ac020, 0x1c3b7: 0x6d19c020, - 0x1c3b8: 0x6cbec820, 0x1c3b9: 0x6d175e20, 0x1c3ba: 0x6ccbda20, 0x1c3bb: 0x6cbc4020, - 0x1c3bc: 0x6c784e20, 0x1c3bd: 0x6cff8a20, 0x1c3be: 0x6d0a8e20, 0x1c3bf: 0x6c2d5e20, - // Block 0x70f, offset 0x1c3c0 - 0x1c3c0: 0x6c5b5620, 0x1c3c1: 0x6c5b5820, 0x1c3c2: 0x6c47a020, 0x1c3c3: 0x6cbb9020, - 0x1c3c4: 0x6c5f0620, 0x1c3c5: 0x6d185420, 0x1c3c6: 0x6cab4a20, 0x1c3c7: 0x6c5b6220, - 0x1c3c8: 0x6c32da20, 0x1c3c9: 0x6d142420, 0x1c3ca: 0x6cff5c20, 0x1c3cb: 0x6cf39c20, - 0x1c3cc: 0x6c497220, 0x1c3cd: 0x6ca22020, 0x1c3ce: 0x6c9a4820, 0x1c3cf: 0x6c9a4a20, - 0x1c3d0: 0x6c006020, 0x1c3d1: 0x6c6b9420, 0x1c3d2: 0x6c318820, 0x1c3d3: 0x6d239020, - 0x1c3d4: 0x6c08ac20, 0x1c3d5: 0x6c090a20, 0x1c3d6: 0x6c094e20, 0x1c3d7: 0x6cafc220, - 0x1c3d8: 0x6cafc420, 0x1c3d9: 0x6c095e20, 0x1c3da: 0x6c152c20, 0x1c3db: 0x6c98c020, - 0x1c3dc: 0x6c4fbc20, 0x1c3dd: 0x6c111a20, 0x1c3de: 0x6cafba20, 0x1c3df: 0x6c8b9020, - 0x1c3e0: 0x6c633820, 0x1c3e1: 0x6d2d6420, 0x1c3e2: 0x6cc9c020, 0x1c3e3: 0x6ca27620, - 0x1c3e4: 0x6ceb9e20, 0x1c3e5: 0x6d09fc20, 0x1c3e6: 0x6c379020, 0x1c3e7: 0x6cc66620, - 0x1c3e8: 0x6cfbfa20, 0x1c3e9: 0x6c710620, 0x1c3ea: 0x6ca21020, 0x1c3eb: 0x6c4fc420, - 0x1c3ec: 0x6cc04a20, 0x1c3ed: 0x6c311220, 0x1c3ee: 0x6ccbea20, 0x1c3ef: 0x6ce06020, - 0x1c3f0: 0x6cadd620, 0x1c3f1: 0x6c712420, 0x1c3f2: 0x6c343020, 0x1c3f3: 0x6c253c20, - 0x1c3f4: 0x6c087220, 0x1c3f5: 0x6cca0020, 0x1c3f6: 0x6cca6420, 0x1c3f7: 0x6c999420, - 0x1c3f8: 0x6cc9c820, 0x1c3f9: 0x6cd4ea20, 0x1c3fa: 0x6d208e20, 0x1c3fb: 0x6cebac20, - 0x1c3fc: 0x6c513c20, 0x1c3fd: 0x6c668e20, 0x1c3fe: 0x6cde7420, 0x1c3ff: 0x6cca0620, - // Block 0x710, offset 0x1c400 - 0x1c400: 0x6c935e20, 0x1c401: 0x6ca21620, 0x1c402: 0x6c98fa20, 0x1c403: 0x6ce78820, - 0x1c404: 0x6cc72220, 0x1c405: 0x6c16f820, 0x1c406: 0x6cb49820, 0x1c407: 0x6c934e20, - 0x1c408: 0x6d2da820, 0x1c409: 0x6ccafc20, 0x1c40a: 0x6d2daa20, 0x1c40b: 0x6c9b5e20, - 0x1c40c: 0x6c91f420, 0x1c40d: 0x6cc20820, 0x1c40e: 0x6c2f2220, 0x1c40f: 0x6cd2e420, - 0x1c410: 0x6c2b0a20, 0x1c411: 0x6c9f2620, 0x1c412: 0x6c73d220, 0x1c413: 0x6c983620, - 0x1c414: 0x6cb72620, 0x1c415: 0x6cb1c420, 0x1c416: 0x6ca39220, 0x1c417: 0x6cb72e20, - 0x1c418: 0x6c29bc20, 0x1c419: 0x6cfa7a20, 0x1c41a: 0x6c1fde20, 0x1c41b: 0x6c3b1a20, - 0x1c41c: 0x6d0f8820, 0x1c41d: 0x6ca58620, 0x1c41e: 0x6c0d9a20, 0x1c41f: 0x6c3e1020, - 0x1c420: 0x6ccfbc20, 0x1c421: 0x6c2fe620, 0x1c422: 0x6cbe3420, 0x1c423: 0x6cb76a20, - 0x1c424: 0x6d19c220, 0x1c425: 0x6cf5c020, 0x1c426: 0x6c4d6020, 0x1c427: 0x6d100e20, - 0x1c428: 0x6c012220, 0x1c429: 0x6d0b8e20, 0x1c42a: 0x6c78a620, 0x1c42b: 0x6cbe4420, - 0x1c42c: 0x6d0bb020, 0x1c42d: 0x6c300220, 0x1c42e: 0x6c288a20, 0x1c42f: 0x6c93e020, - 0x1c430: 0x6cbe7e20, 0x1c431: 0x6d102620, 0x1c432: 0x6d275620, 0x1c433: 0x6d275c20, - 0x1c434: 0x6cd70220, 0x1c435: 0x6cd73c20, 0x1c436: 0x6d331620, 0x1c437: 0x6c0da420, - 0x1c438: 0x6d1e0c20, 0x1c439: 0x6c294e20, 0x1c43a: 0x6cd73e20, 0x1c43b: 0x6c821020, - 0x1c43c: 0x6ca67820, 0x1c43d: 0x6cea7620, 0x1c43e: 0x6c391420, 0x1c43f: 0x6c4abc20, - // Block 0x711, offset 0x1c440 - 0x1c440: 0x6ce62620, 0x1c441: 0x6d338220, 0x1c442: 0x6cc00020, 0x1c443: 0x6c0d1e20, - 0x1c444: 0x6d2b3620, 0x1c445: 0x6c9dfc20, 0x1c446: 0x6c248c20, 0x1c447: 0x6c5b8820, - 0x1c448: 0x6c2dac20, 0x1c449: 0x6c4e7c20, 0x1c44a: 0x6c142c20, 0x1c44b: 0x6d3d2020, - 0x1c44c: 0x6c202a20, 0x1c44d: 0x6cecba20, 0x1c44e: 0x6c391c20, 0x1c44f: 0x6c26e820, - 0x1c450: 0x6cf57220, 0x1c451: 0x6cea9c20, 0x1c452: 0x6c982a20, 0x1c453: 0x6cbffa20, - 0x1c454: 0x6cb73020, 0x1c455: 0x6ccd6a20, 0x1c456: 0x6cb24220, 0x1c457: 0x6c4e8620, - 0x1c458: 0x6cb89a20, 0x1c459: 0x6cf34620, 0x1c45a: 0x6cf34820, 0x1c45b: 0x6d0a6620, - 0x1c45c: 0x6cd87a20, 0x1c45d: 0x6cc7f420, 0x1c45e: 0x6c45d420, 0x1c45f: 0x6c674220, - 0x1c460: 0x6c1af620, 0x1c461: 0x6cf34a20, 0x1c462: 0x6ce92c20, 0x1c463: 0x6c704220, - 0x1c464: 0x6ce0b820, 0x1c465: 0x6d338c20, 0x1c466: 0x6d34e820, 0x1c467: 0x6cb8a820, - 0x1c468: 0x6c9d1c20, 0x1c469: 0x6c475820, 0x1c46a: 0x6cedc420, 0x1c46b: 0x6c6e0e20, - 0x1c46c: 0x6c6e1020, 0x1c46d: 0x6cc8be20, 0x1c46e: 0x6c755a20, 0x1c46f: 0x6c52f820, - 0x1c470: 0x6cdf6020, 0x1c471: 0x6cc34e20, 0x1c472: 0x6c5fcc20, 0x1c473: 0x6c0b7020, - 0x1c474: 0x6c0b7220, 0x1c475: 0x6c420e20, 0x1c476: 0x6cf1fe20, 0x1c477: 0x6d378820, - 0x1c478: 0x6c398420, 0x1c479: 0x6d045620, 0x1c47a: 0x6c73e020, 0x1c47b: 0x6c561020, - 0x1c47c: 0x6ca96820, 0x1c47d: 0x6cb73820, 0x1c47e: 0x6c3b5620, 0x1c47f: 0x6d067220, - // Block 0x712, offset 0x1c480 - 0x1c480: 0x6d068420, 0x1c481: 0x6cbe0620, 0x1c482: 0x6d146220, 0x1c483: 0x6cf2ce20, - 0x1c484: 0x6d278020, 0x1c485: 0x6d253e20, 0x1c486: 0x6c4f9020, 0x1c487: 0x6d0d3e20, - 0x1c488: 0x6c189c20, 0x1c489: 0x6c189e20, 0x1c48a: 0x6c286820, 0x1c48b: 0x6d1eec20, - 0x1c48c: 0x6c33da20, 0x1c48d: 0x6c565820, 0x1c48e: 0x6c5d9c20, 0x1c48f: 0x6cb4cc20, - 0x1c490: 0x6ca26820, 0x1c491: 0x6caa7620, 0x1c492: 0x6c99d220, 0x1c493: 0x6c268220, - 0x1c494: 0x6c9e0020, 0x1c495: 0x6c9d1e20, 0x1c496: 0x6c1cae20, 0x1c497: 0x6cacce20, - 0x1c498: 0x6c08bc20, 0x1c499: 0x6ccbc420, 0x1c49a: 0x6d34ea20, 0x1c49b: 0x6cae0220, - 0x1c49c: 0x6cac9e20, 0x1c49d: 0x6d3c7620, 0x1c49e: 0x6d288420, 0x1c49f: 0x6c463820, - 0x1c4a0: 0x6c8e4220, 0x1c4a1: 0x6c99d420, 0x1c4a2: 0x6d2aa620, 0x1c4a3: 0x6c3c1c20, - 0x1c4a4: 0x6cab2e20, 0x1c4a5: 0x6c858020, 0x1c4a6: 0x6c94da20, 0x1c4a7: 0x6c122220, - 0x1c4a8: 0x6c3c1e20, 0x1c4a9: 0x6ceee020, 0x1c4aa: 0x6c565a20, 0x1c4ab: 0x6ca0d220, - 0x1c4ac: 0x6c9a7820, 0x1c4ad: 0x6cd59e20, 0x1c4ae: 0x6c71a620, 0x1c4af: 0x6d296220, - 0x1c4b0: 0x6ceab020, 0x1c4b1: 0x6ceaee20, 0x1c4b2: 0x6ceaf020, 0x1c4b3: 0x6c50c820, - 0x1c4b4: 0x6c859020, 0x1c4b5: 0x6c9cdc20, 0x1c4b6: 0x6d147220, 0x1c4b7: 0x6c37e420, - 0x1c4b8: 0x6c3a8820, 0x1c4b9: 0x6d1efe20, 0x1c4ba: 0x6ce48420, 0x1c4bb: 0x6d358a20, - 0x1c4bc: 0x6d2f8820, 0x1c4bd: 0x6c46f220, 0x1c4be: 0x6d2d6020, 0x1c4bf: 0x6d0c6820, - // Block 0x713, offset 0x1c4c0 - 0x1c4c0: 0x6cd7ce20, 0x1c4c1: 0x6c7be420, 0x1c4c2: 0x6c6ef820, 0x1c4c3: 0x6c705c20, - 0x1c4c4: 0x6d016020, 0x1c4c5: 0x6cc00620, 0x1c4c6: 0x6d16c220, 0x1c4c7: 0x6c632c20, - 0x1c4c8: 0x6d379a20, 0x1c4c9: 0x6cc2c220, 0x1c4ca: 0x6cb2fc20, 0x1c4cb: 0x6c5b9020, - 0x1c4cc: 0x6c9d2620, 0x1c4cd: 0x6c077e20, 0x1c4ce: 0x6d2aaa20, 0x1c4cf: 0x6d39f420, - 0x1c4d0: 0x6c821820, 0x1c4d1: 0x6d1e9820, 0x1c4d2: 0x6c46f420, 0x1c4d3: 0x6c530420, - 0x1c4d4: 0x6c417620, 0x1c4d5: 0x6c382e20, 0x1c4d6: 0x6c992e20, 0x1c4d7: 0x6cd89020, - 0x1c4d8: 0x6c54a620, 0x1c4d9: 0x6cb27a20, 0x1c4da: 0x6c229220, 0x1c4db: 0x6c392220, - 0x1c4dc: 0x6d339a20, 0x1c4dd: 0x6cda8020, 0x1c4de: 0x6ca95420, 0x1c4df: 0x6c195420, - 0x1c4e0: 0x6c8cac20, 0x1c4e1: 0x6cad8220, 0x1c4e2: 0x6c0e5220, 0x1c4e3: 0x6cb74620, - 0x1c4e4: 0x6cd88220, 0x1c4e5: 0x6ca5c020, 0x1c4e6: 0x6c70f620, 0x1c4e7: 0x6cc96a20, - 0x1c4e8: 0x6d3ab020, 0x1c4e9: 0x6cd0e220, 0x1c4ea: 0x6c832020, 0x1c4eb: 0x6d087020, - 0x1c4ec: 0x6c73f020, 0x1c4ed: 0x6c3df620, 0x1c4ee: 0x6caca220, 0x1c4ef: 0x6c9f9620, - 0x1c4f0: 0x6cdf6820, 0x1c4f1: 0x6d0f4a20, 0x1c4f2: 0x6c612020, 0x1c4f3: 0x6d1e1420, - 0x1c4f4: 0x6c497c20, 0x1c4f5: 0x6c083a20, 0x1c4f6: 0x6d090020, 0x1c4f7: 0x6c8f6c20, - 0x1c4f8: 0x6c913a20, 0x1c4f9: 0x6c28f420, 0x1c4fa: 0x6c95e020, 0x1c4fb: 0x6d016220, - 0x1c4fc: 0x6cb3c020, 0x1c4fd: 0x6d2aac20, 0x1c4fe: 0x6c6d9020, 0x1c4ff: 0x6d1a3c20, - // Block 0x714, offset 0x1c500 - 0x1c500: 0x6cac5420, 0x1c501: 0x6c6a9020, 0x1c502: 0x6d16f620, 0x1c503: 0x6c5a9820, - 0x1c504: 0x6c5b2620, 0x1c505: 0x6d293020, 0x1c506: 0x6c19ce20, 0x1c507: 0x6d19b420, - 0x1c508: 0x6ceeec20, 0x1c509: 0x6c546620, 0x1c50a: 0x6c665a20, 0x1c50b: 0x6d0f9820, - 0x1c50c: 0x6c8ad420, 0x1c50d: 0x6cd8a820, 0x1c50e: 0x6c61aa20, 0x1c50f: 0x6c374020, - 0x1c510: 0x6d03d020, 0x1c511: 0x6c3e1220, 0x1c512: 0x6cc94c20, 0x1c513: 0x6ccb1820, - 0x1c514: 0x6d350420, 0x1c515: 0x6d1b3e20, 0x1c516: 0x6cf3b620, 0x1c517: 0x6cf7d620, - 0x1c518: 0x6c77a420, 0x1c519: 0x6d398a20, 0x1c51a: 0x6c67da20, 0x1c51b: 0x6c95e820, - 0x1c51c: 0x6c95f420, 0x1c51d: 0x6c01a620, 0x1c51e: 0x6c306420, 0x1c51f: 0x6ce3dc20, - 0x1c520: 0x6ca1c820, 0x1c521: 0x6c832220, 0x1c522: 0x6d13da20, 0x1c523: 0x6c9ce420, - 0x1c524: 0x6cc2c420, 0x1c525: 0x6c6c3020, 0x1c526: 0x6cb37020, 0x1c527: 0x6cef9820, - 0x1c528: 0x6cff7020, 0x1c529: 0x6d017220, 0x1c52a: 0x6c531420, 0x1c52b: 0x6d069420, - 0x1c52c: 0x6cda8620, 0x1c52d: 0x6c7b9220, 0x1c52e: 0x6ce20a20, 0x1c52f: 0x6cbcac20, - 0x1c530: 0x6c71fe20, 0x1c531: 0x6c378a20, 0x1c532: 0x6d386020, 0x1c533: 0x6cc81220, - 0x1c534: 0x6cb28620, 0x1c535: 0x6d09ec20, 0x1c536: 0x6d046020, 0x1c537: 0x6d35a220, - 0x1c538: 0x6c49e020, 0x1c539: 0x6c586420, 0x1c53a: 0x6c9fec20, 0x1c53b: 0x6c5d7020, - 0x1c53c: 0x6cebcc20, 0x1c53d: 0x6cb84c20, 0x1c53e: 0x6cac1e20, 0x1c53f: 0x6cf35820, - // Block 0x715, offset 0x1c540 - 0x1c540: 0x6cc0e820, 0x1c541: 0x6c8e4a20, 0x1c542: 0x6d16f820, 0x1c543: 0x6c633a20, - 0x1c544: 0x6c6e5a20, 0x1c545: 0x6cb9f420, 0x1c546: 0x6c675420, 0x1c547: 0x6c683220, - 0x1c548: 0x6d312a20, 0x1c549: 0x6cd1ac20, 0x1c54a: 0x6d3d3420, 0x1c54b: 0x6c12d420, - 0x1c54c: 0x6c380020, 0x1c54d: 0x6c5b9c20, 0x1c54e: 0x6c61ac20, 0x1c54f: 0x6c8e4620, - 0x1c550: 0x6c159c20, 0x1c551: 0x6c5ce020, 0x1c552: 0x6c561420, 0x1c553: 0x6ca9b420, - 0x1c554: 0x6d09ee20, 0x1c555: 0x6c6ce220, 0x1c556: 0x6c8aee20, 0x1c557: 0x6cc03220, - 0x1c558: 0x6cefa220, 0x1c559: 0x6d30ea20, 0x1c55a: 0x6c75a620, 0x1c55b: 0x6c4df620, - 0x1c55c: 0x6c052620, 0x1c55d: 0x6c985220, 0x1c55e: 0x6d3d3a20, 0x1c55f: 0x6d1f1820, - 0x1c560: 0x6cf5c220, 0x1c561: 0x6c0ed620, 0x1c562: 0x6c310420, 0x1c563: 0x6c590420, - 0x1c564: 0x6c532a20, 0x1c565: 0x6d173220, 0x1c566: 0x6cb48820, 0x1c567: 0x6d1ce420, - 0x1c568: 0x6c802420, 0x1c569: 0x6c502e20, 0x1c56a: 0x6c811820, 0x1c56b: 0x6c4e5620, - 0x1c56c: 0x6c850c20, 0x1c56d: 0x6c44be20, 0x1c56e: 0x6c3e3620, 0x1c56f: 0x6cf3b820, - 0x1c570: 0x6c88ea20, 0x1c571: 0x6c213a20, 0x1c572: 0x6c3ca220, 0x1c573: 0x6d173420, - 0x1c574: 0x6d22f220, 0x1c575: 0x6ce73420, 0x1c576: 0x6c815420, 0x1c577: 0x6c4d3a20, - 0x1c578: 0x6c6cee20, 0x1c579: 0x6c634220, 0x1c57a: 0x6c1cb820, 0x1c57b: 0x6c6f0820, - 0x1c57c: 0x6c9a5220, 0x1c57d: 0x6cdbb820, 0x1c57e: 0x6c195e20, 0x1c57f: 0x6cae1420, - // Block 0x716, offset 0x1c580 - 0x1c580: 0x6cfcaa20, 0x1c581: 0x6cd09820, 0x1c582: 0x6ce92e20, 0x1c583: 0x6c7dd020, - 0x1c584: 0x6cb25020, 0x1c585: 0x6ca80820, 0x1c586: 0x6c4e9c20, 0x1c587: 0x6c6da020, - 0x1c588: 0x6cfea220, 0x1c589: 0x6ccf3c20, 0x1c58a: 0x6ca71e20, 0x1c58b: 0x6ce84e20, - 0x1c58c: 0x6d1e2620, 0x1c58d: 0x6cffe020, 0x1c58e: 0x6cfb3620, 0x1c58f: 0x6ce6bc20, - 0x1c590: 0x6c355820, 0x1c591: 0x6cda8e20, 0x1c592: 0x6cea1c20, 0x1c593: 0x6c72e620, - 0x1c594: 0x6c132c20, 0x1c595: 0x6ce3e220, 0x1c596: 0x6c85d020, 0x1c597: 0x6cd71620, - 0x1c598: 0x6cd8aa20, 0x1c599: 0x6c832820, 0x1c59a: 0x6cd71820, 0x1c59b: 0x6ce1be20, - 0x1c59c: 0x6c318e20, 0x1c59d: 0x6c81ce20, 0x1c59e: 0x6c7eec20, 0x1c59f: 0x6c87f620, - 0x1c5a0: 0x6ceef620, 0x1c5a1: 0x6cf28020, 0x1c5a2: 0x6d279a20, 0x1c5a3: 0x6c590620, - 0x1c5a4: 0x6c2b6420, 0x1c5a5: 0x6c528a20, 0x1c5a6: 0x6cc8fa20, 0x1c5a7: 0x6c666e20, - 0x1c5a8: 0x6d2f0220, 0x1c5a9: 0x6ccb1c20, 0x1c5aa: 0x6c3e5220, 0x1c5ab: 0x6c498420, - 0x1c5ac: 0x6d042a20, 0x1c5ad: 0x6cd46420, 0x1c5ae: 0x6cd69020, 0x1c5af: 0x6d0b2a20, - 0x1c5b0: 0x6c21b620, 0x1c5b1: 0x6d2f2e20, 0x1c5b2: 0x6d12e820, 0x1c5b3: 0x6c797620, - 0x1c5b4: 0x6cf2e420, 0x1c5b5: 0x6c4e0220, 0x1c5b6: 0x6ceac020, 0x1c5b7: 0x6c2ffa20, - 0x1c5b8: 0x6c510820, 0x1c5b9: 0x6cf28620, 0x1c5ba: 0x6c708e20, 0x1c5bb: 0x6ccf4020, - 0x1c5bc: 0x6c894e20, 0x1c5bd: 0x6c5cc220, 0x1c5be: 0x6cde4e20, 0x1c5bf: 0x6d3cfe20, - // Block 0x717, offset 0x1c5c0 - 0x1c5c0: 0x6c2d5220, 0x1c5c1: 0x6cbcb620, 0x1c5c2: 0x6c2a6a20, 0x1c5c3: 0x6c735620, - 0x1c5c4: 0x6d3e2420, 0x1c5c5: 0x6cf5f020, 0x1c5c6: 0x6cff8220, 0x1c5c7: 0x6cb5ca20, - 0x1c5c8: 0x6c477e20, 0x1c5c9: 0x6c4cb820, 0x1c5ca: 0x6d0bf620, 0x1c5cb: 0x6c8bb020, - 0x1c5cc: 0x6ce17420, 0x1c5cd: 0x6d387620, 0x1c5ce: 0x6caf0420, 0x1c5cf: 0x6c503820, - 0x1c5d0: 0x6c166620, 0x1c5d1: 0x6cd4cc20, 0x1c5d2: 0x6cb4ea20, 0x1c5d3: 0x6c399020, - 0x1c5d4: 0x6d345820, 0x1c5d5: 0x6c923c20, 0x1c5d6: 0x6ca53020, 0x1c5d7: 0x6c711420, - 0x1c5d8: 0x6ce21e20, 0x1c5d9: 0x6c239c20, 0x1c5da: 0x6c833020, 0x1c5db: 0x6d30f020, - 0x1c5dc: 0x6cb29c20, 0x1c5dd: 0x6c3a3420, 0x1c5de: 0x6cd91c20, 0x1c5df: 0x6ce4ee20, - 0x1c5e0: 0x6cb09020, 0x1c5e1: 0x6c288020, 0x1c5e2: 0x6d231620, 0x1c5e3: 0x6ca5d820, - 0x1c5e4: 0x6d208620, 0x1c5e5: 0x6c923e20, 0x1c5e6: 0x6c421a20, 0x1c5e7: 0x6c9d3a20, - 0x1c5e8: 0x6c6e7420, 0x1c5e9: 0x6c8ce820, 0x1c5ea: 0x6c94f420, 0x1c5eb: 0x6d1a5c20, - 0x1c5ec: 0x6c253620, 0x1c5ed: 0x6cc18820, 0x1c5ee: 0x6c57ea20, 0x1c5ef: 0x6d231820, - 0x1c5f0: 0x6ca72220, 0x1c5f1: 0x6ccfde20, 0x1c5f2: 0x6c0bf620, 0x1c5f3: 0x6c214220, - 0x1c5f4: 0x6c54c220, 0x1c5f5: 0x6d24ec20, 0x1c5f6: 0x6c7efc20, 0x1c5f7: 0x6c5d2620, - 0x1c5f8: 0x6cbe4620, 0x1c5f9: 0x6d0bf820, 0x1c5fa: 0x6cba0220, 0x1c5fb: 0x6ce46220, - 0x1c5fc: 0x6c9e9020, 0x1c5fd: 0x6d350c20, 0x1c5fe: 0x6d1ae420, 0x1c5ff: 0x6c9d3c20, - // Block 0x718, offset 0x1c600 - 0x1c600: 0x6c07b220, 0x1c601: 0x6d24de20, 0x1c602: 0x6cf20820, 0x1c603: 0x6cc91c20, - 0x1c604: 0x6c39fa20, 0x1c605: 0x6cbe4820, 0x1c606: 0x6d24e020, 0x1c607: 0x6c786220, - 0x1c608: 0x6c61f220, 0x1c609: 0x6ccf4220, 0x1c60a: 0x6d24e220, 0x1c60b: 0x6ccba420, - 0x1c60c: 0x6c924020, 0x1c60d: 0x6d3f4420, 0x1c60e: 0x6c319620, 0x1c60f: 0x6cb81420, - 0x1c610: 0x6c667a20, 0x1c611: 0x6c9e1c20, 0x1c612: 0x6cb09220, 0x1c613: 0x6cf94420, - 0x1c614: 0x6d210220, 0x1c615: 0x6d24e420, 0x1c616: 0x6cd05c20, 0x1c617: 0x6cd09e20, - 0x1c618: 0x6cc74c20, 0x1c619: 0x6c592420, 0x1c61a: 0x6d3a6420, 0x1c61b: 0x6c659620, - 0x1c61c: 0x6caa9020, 0x1c61d: 0x6d212a20, 0x1c61e: 0x6cc06220, 0x1c61f: 0x6ce67220, - 0x1c620: 0x6cc18a20, 0x1c621: 0x6c325c20, 0x1c622: 0x6c389e20, 0x1c623: 0x6d2bdc20, - 0x1c624: 0x6c0f0420, 0x1c625: 0x6cf2f220, 0x1c626: 0x6cf28820, 0x1c627: 0x6c2c5820, - 0x1c628: 0x6cee8e20, 0x1c629: 0x6cf15020, 0x1c62a: 0x6cc7ac20, 0x1c62b: 0x6d01ae20, - 0x1c62c: 0x6c12ea20, 0x1c62d: 0x6cf09820, 0x1c62e: 0x6c510a20, 0x1c62f: 0x6c42a220, - 0x1c630: 0x6d0d8a20, 0x1c631: 0x6c534a20, 0x1c632: 0x6d089420, 0x1c633: 0x6c9cf220, - 0x1c634: 0x6c786a20, 0x1c635: 0x6c98da20, 0x1c636: 0x6d1bb020, 0x1c637: 0x6d0d8c20, - 0x1c638: 0x6d1f3820, 0x1c639: 0x6c52a620, 0x1c63a: 0x6c9e9220, 0x1c63b: 0x6cd13a20, - 0x1c63c: 0x6c9a5a20, 0x1c63d: 0x6d290420, 0x1c63e: 0x6c5cec20, 0x1c63f: 0x6ca3c420, - // Block 0x719, offset 0x1c640 - 0x1c640: 0x6c4afe20, 0x1c641: 0x6c1c2020, 0x1c642: 0x6c363820, 0x1c643: 0x6cac2620, - 0x1c644: 0x6c99fc20, 0x1c645: 0x6c88fc20, 0x1c646: 0x6cb79620, 0x1c647: 0x6cb79820, - 0x1c648: 0x6c99fe20, 0x1c649: 0x6ce4a020, 0x1c64a: 0x6c23ec20, 0x1c64b: 0x6cef1020, - 0x1c64c: 0x6c116a20, 0x1c64d: 0x6ce93220, 0x1c64e: 0x6c9e2620, 0x1c64f: 0x6c5bc420, - 0x1c650: 0x6ca11a20, 0x1c651: 0x6d059c20, 0x1c652: 0x6c604020, 0x1c653: 0x6cae4020, - 0x1c654: 0x6c649e20, 0x1c655: 0x6c658a20, 0x1c656: 0x6c555e20, 0x1c657: 0x6c3ce020, - 0x1c658: 0x6cfd7420, 0x1c659: 0x6d17a820, 0x1c65a: 0x6d1b5420, 0x1c65b: 0x6d2e6420, - 0x1c65c: 0x6cd26a20, 0x1c65d: 0x6c6a1820, 0x1c65e: 0x6c197020, 0x1c65f: 0x6c59c620, - 0x1c660: 0x6ce09a20, 0x1c661: 0x6d212c20, 0x1c662: 0x6c09a220, 0x1c663: 0x6c9fb020, - 0x1c664: 0x6cd1be20, 0x1c665: 0x6ce86020, 0x1c666: 0x6cd10220, 0x1c667: 0x6d1e3a20, - 0x1c668: 0x6c712620, 0x1c669: 0x6c307820, 0x1c66a: 0x6ce98a20, 0x1c66b: 0x6c68f620, - 0x1c66c: 0x6c690820, 0x1c66d: 0x6cc06420, 0x1c66e: 0x6d0c0820, 0x1c66f: 0x6ce0c020, - 0x1c670: 0x6c8f9420, 0x1c671: 0x6c5dd220, 0x1c672: 0x6d256420, 0x1c673: 0x6ca42820, - 0x1c674: 0x6c04f620, 0x1c675: 0x6d1fcc20, 0x1c676: 0x6cc2f020, 0x1c677: 0x6d3c1820, - 0x1c678: 0x6c89ba20, 0x1c679: 0x6c14f620, 0x1c67a: 0x6d0c9620, 0x1c67b: 0x6c214c20, - 0x1c67c: 0x6ca83020, 0x1c67d: 0x6d3e3e20, 0x1c67e: 0x6cec9020, 0x1c67f: 0x6cd1c020, - // Block 0x71a, offset 0x1c680 - 0x1c680: 0x6c97ba20, 0x1c681: 0x6d1c7220, 0x1c682: 0x6c7ed620, 0x1c683: 0x6c7cfc20, - 0x1c684: 0x6c3d0020, 0x1c685: 0x6c669020, 0x1c686: 0x6d06da20, 0x1c687: 0x6c908a20, - 0x1c688: 0x6cef1220, 0x1c689: 0x6c413620, 0x1c68a: 0x6cfa6620, 0x1c68b: 0x6d1c7420, - 0x1c68c: 0x6cb31020, 0x1c68d: 0x6c6d1820, 0x1c68e: 0x6d0e8620, 0x1c68f: 0x6ce10420, - 0x1c690: 0x6d258220, 0x1c691: 0x6cdd7a20, 0x1c692: 0x6d258420, 0x1c693: 0x6c881420, - 0x1c694: 0x6d11b820, 0x1c695: 0x6c9c0620, 0x1c696: 0x6d3cde20, 0x1c697: 0x6c1a1c20, - 0x1c698: 0x6c78ba20, 0x1c699: 0x6cdf7a20, 0x1c69a: 0x6cde0a20, 0x1c69b: 0x6cebe420, - 0x1c69c: 0x6c8e3620, 0x1c69d: 0x6c465220, 0x1c69e: 0x6ccaae20, 0x1c69f: 0x6ca00620, - 0x1c6a0: 0x6d2cc420, 0x1c6a1: 0x6cd27220, 0x1c6a2: 0x6d17e820, 0x1c6a3: 0x6c952220, - 0x1c6a4: 0x6c969a20, 0x1c6a5: 0x6cb48e20, 0x1c6a6: 0x6cee9e20, 0x1c6a7: 0x6c863420, - 0x1c6a8: 0x6c111220, 0x1c6a9: 0x6cf50020, 0x1c6aa: 0x6cf64c20, 0x1c6ab: 0x6cf15a20, - 0x1c6ac: 0x6cbaba20, 0x1c6ad: 0x6d2ace20, 0x1c6ae: 0x6cd1ce20, 0x1c6af: 0x6cdace20, - 0x1c6b0: 0x6c004220, 0x1c6b1: 0x6cbd8420, 0x1c6b2: 0x6cd9b220, 0x1c6b3: 0x6d27b220, - 0x1c6b4: 0x6d054420, 0x1c6b5: 0x6d19ec20, 0x1c6b6: 0x6cc68a20, 0x1c6b7: 0x6c5d2e20, - 0x1c6b8: 0x6cdad020, 0x1c6b9: 0x6cddcc20, 0x1c6ba: 0x6ca6ac20, 0x1c6bb: 0x6cddf420, - 0x1c6bc: 0x6cd1d020, 0x1c6bd: 0x6cc81c20, 0x1c6be: 0x6c002a20, 0x1c6bf: 0x6cacba20, - // Block 0x71b, offset 0x1c6c0 - 0x1c6c0: 0x6c1f5020, 0x1c6c1: 0x6c1e7e20, 0x1c6c2: 0x6cacdc20, 0x1c6c3: 0x6cf22c20, - 0x1c6c4: 0x6c123220, 0x1c6c5: 0x6c9ede20, 0x1c6c6: 0x6c440620, 0x1c6c7: 0x6c2cce20, - 0x1c6c8: 0x6c504420, 0x1c6c9: 0x6c5a7020, 0x1c6ca: 0x6cf8a020, 0x1c6cb: 0x6d3e4020, - 0x1c6cc: 0x6c2b7220, 0x1c6cd: 0x6d365a20, 0x1c6ce: 0x6d03f220, 0x1c6cf: 0x6c3f6c20, - 0x1c6d0: 0x6c6aea20, 0x1c6d1: 0x6c573e20, 0x1c6d2: 0x6c439a20, 0x1c6d3: 0x6d3f1a20, - 0x1c6d4: 0x6ce1d820, 0x1c6d5: 0x6ce2aa20, 0x1c6d6: 0x6cdbc820, 0x1c6d7: 0x6c09c820, - 0x1c6d8: 0x6c69a420, 0x1c6d9: 0x6c5be620, 0x1c6da: 0x6c4bce20, 0x1c6db: 0x6d1a7020, - 0x1c6dc: 0x6c42ca20, 0x1c6dd: 0x6c8f9620, 0x1c6de: 0x6d362c20, 0x1c6df: 0x6d0e8820, - 0x1c6e0: 0x6ccf5820, 0x1c6e1: 0x6c97be20, 0x1c6e2: 0x6d1c8020, 0x1c6e3: 0x6c215020, - 0x1c6e4: 0x6c93e620, 0x1c6e5: 0x6c807420, 0x1c6e6: 0x6c943e20, 0x1c6e7: 0x6d003420, - 0x1c6e8: 0x6c0d3c20, 0x1c6e9: 0x6cdfb020, 0x1c6ea: 0x6d236e20, 0x1c6eb: 0x6d052420, - 0x1c6ec: 0x6c56b820, 0x1c6ed: 0x6c09ca20, 0x1c6ee: 0x6c0c0c20, 0x1c6ef: 0x6d368e20, - 0x1c6f0: 0x6c67f220, 0x1c6f1: 0x6c79f620, 0x1c6f2: 0x6cd0be20, 0x1c6f3: 0x6cce0e20, - 0x1c6f4: 0x6c2b3a20, 0x1c6f5: 0x6c9d6820, 0x1c6f6: 0x6c025220, 0x1c6f7: 0x6c91cc20, - 0x1c6f8: 0x6c562820, 0x1c6f9: 0x6c54e820, 0x1c6fa: 0x6d1eac20, 0x1c6fb: 0x6c15cc20, - 0x1c6fc: 0x6c396420, 0x1c6fd: 0x6d1d9e20, 0x1c6fe: 0x6c4bd620, 0x1c6ff: 0x6c97c420, - // Block 0x71c, offset 0x1c700 - 0x1c700: 0x6cbeae20, 0x1c701: 0x6d216e20, 0x1c702: 0x6cb1b820, 0x1c703: 0x6c623e20, - 0x1c704: 0x6d0b3420, 0x1c705: 0x6c176e20, 0x1c706: 0x6cb51220, 0x1c707: 0x6cf7fe20, - 0x1c708: 0x6c624020, 0x1c709: 0x6c928620, 0x1c70a: 0x6c90a620, 0x1c70b: 0x6c8f9c20, - 0x1c70c: 0x6c6ca020, 0x1c70d: 0x6c4c7a20, 0x1c70e: 0x6c23a620, 0x1c70f: 0x6c910e20, - 0x1c710: 0x6d349020, 0x1c711: 0x6c414c20, 0x1c712: 0x6cbb1a20, 0x1c713: 0x6c83e220, - 0x1c714: 0x6d0db420, 0x1c715: 0x6c127e20, 0x1c716: 0x6c69b020, 0x1c717: 0x6c232a20, - 0x1c718: 0x6c215620, 0x1c719: 0x6ce95620, 0x1c71a: 0x6cab4020, 0x1c71b: 0x6ce2a820, - 0x1c71c: 0x6d12b020, 0x1c71d: 0x6cf79220, 0x1c71e: 0x6c9d6a20, 0x1c71f: 0x6ce11220, - 0x1c720: 0x6ca12c20, 0x1c721: 0x6cce1020, 0x1c722: 0x6c4ee620, 0x1c723: 0x6c881620, - 0x1c724: 0x6c803220, 0x1c725: 0x6cebe820, 0x1c726: 0x6c1b4820, 0x1c727: 0x6c41aa20, - 0x1c728: 0x6c3cae20, 0x1c729: 0x6d081a20, 0x1c72a: 0x6d140420, 0x1c72b: 0x6c97ec20, - 0x1c72c: 0x6d3f5c20, 0x1c72d: 0x6c989620, 0x1c72e: 0x6c774020, 0x1c72f: 0x6c961620, - 0x1c730: 0x6cae7a20, 0x1c731: 0x6cd5f420, 0x1c732: 0x6d2f0620, 0x1c733: 0x6d2eca20, - 0x1c734: 0x6d3c4620, 0x1c735: 0x6d070c20, 0x1c736: 0x6c594020, 0x1c737: 0x6c5d9020, - 0x1c738: 0x6c66aa20, 0x1c739: 0x6d0c1c20, 0x1c73a: 0x6cd6d820, 0x1c73b: 0x6c89f820, - 0x1c73c: 0x6c24fa20, 0x1c73d: 0x6ce36420, 0x1c73e: 0x6d106020, 0x1c73f: 0x6c677220, - // Block 0x71d, offset 0x1c740 - 0x1c740: 0x6c23a820, 0x1c741: 0x6d1d0620, 0x1c742: 0x6c537220, 0x1c743: 0x6d0a1c20, - 0x1c744: 0x6cd5f620, 0x1c745: 0x6c499a20, 0x1c746: 0x6d1c8620, 0x1c747: 0x6cfeee20, - 0x1c748: 0x6d404220, 0x1c749: 0x6c7de020, 0x1c74a: 0x6d070e20, 0x1c74b: 0x6c890c20, - 0x1c74c: 0x6d369020, 0x1c74d: 0x6cef2020, 0x1c74e: 0x6cb0ac20, 0x1c74f: 0x6d23c420, - 0x1c750: 0x6c69be20, 0x1c751: 0x6cb3c420, 0x1c752: 0x6c297820, 0x1c753: 0x6c5c1820, - 0x1c754: 0x6c6b1c20, 0x1c755: 0x6cf46820, 0x1c756: 0x6cabdc20, 0x1c757: 0x6c608620, - 0x1c758: 0x6cac4220, 0x1c759: 0x6cef2c20, 0x1c75a: 0x6cdb1820, 0x1c75b: 0x6cb9b820, - 0x1c75c: 0x6cb9ba20, 0x1c75d: 0x6cf69c20, 0x1c75e: 0x6c92cc20, 0x1c75f: 0x6cf8c620, - 0x1c760: 0x6d0aa220, 0x1c761: 0x6c340620, 0x1c762: 0x6c59da20, 0x1c763: 0x6c9fc620, - 0x1c764: 0x6cc90420, 0x1c765: 0x6cdb0020, 0x1c766: 0x6c81b820, 0x1c767: 0x6d318a20, - 0x1c768: 0x6c23aa20, 0x1c769: 0x6d182820, 0x1c76a: 0x6d30fe20, 0x1c76b: 0x6cec9820, - 0x1c76c: 0x6ccd9e20, 0x1c76d: 0x6ce00420, 0x1c76e: 0x6c177620, 0x1c76f: 0x6d0a3220, - 0x1c770: 0x6c7d0e20, 0x1c771: 0x6d126420, 0x1c772: 0x6ccee420, 0x1c773: 0x6ce8da20, - 0x1c774: 0x6d39bc20, 0x1c775: 0x6cc95820, 0x1c776: 0x6c522220, 0x1c777: 0x6c0a2a20, - 0x1c778: 0x6ccd0820, 0x1c779: 0x6c151c20, 0x1c77a: 0x6c151e20, 0x1c77b: 0x6cd56820, - 0x1c77c: 0x6ce77c20, 0x1c77d: 0x6cb41020, 0x1c77e: 0x6c8bce20, 0x1c77f: 0x6cef2e20, - // Block 0x71e, offset 0x1c780 - 0x1c780: 0x6ccb6c20, 0x1c781: 0x6ccb4620, 0x1c782: 0x6c1a3820, 0x1c783: 0x6c6f3020, - 0x1c784: 0x6c1a3a20, 0x1c785: 0x6c57be20, 0x1c786: 0x6c686c20, 0x1c787: 0x6c81dc20, - 0x1c788: 0x6c183420, 0x1c789: 0x6c41e020, 0x1c78a: 0x6c259c20, 0x1c78b: 0x6c53cc20, - 0x1c78c: 0x6cd81820, 0x1c78d: 0x6cd60220, 0x1c78e: 0x6cae8420, 0x1c78f: 0x6c4e2a20, - 0x1c790: 0x6d27c020, 0x1c791: 0x6c8f3c20, 0x1c792: 0x6c53ce20, 0x1c793: 0x6c3ed820, - 0x1c794: 0x6c505a20, 0x1c795: 0x6c513e20, 0x1c796: 0x6cfb8020, 0x1c797: 0x6c66b620, - 0x1c798: 0x6ccd0a20, 0x1c799: 0x6cf8c820, 0x1c79a: 0x6d24c220, 0x1c79b: 0x6c934c20, - 0x1c79c: 0x6c7fac20, 0x1c79d: 0x6ca96020, 0x1c79e: 0x6d21a220, 0x1c79f: 0x6c8c3420, - 0x1c7a0: 0x6c9e4020, 0x1c7a1: 0x6d2a5020, 0x1c7a2: 0x6c290420, 0x1c7a3: 0x6c595420, - 0x1c7a4: 0x6d2afc20, 0x1c7a5: 0x6d021620, 0x1c7a6: 0x6d23ea20, 0x1c7a7: 0x6c853020, - 0x1c7a8: 0x6cd3da20, 0x1c7a9: 0x6d091c20, 0x1c7aa: 0x6c8d5820, 0x1c7ab: 0x6ced9420, - 0x1c7ac: 0x6d3e8a20, 0x1c7ad: 0x6d1db420, 0x1c7ae: 0x6c5c3420, 0x1c7af: 0x6c120420, - 0x1c7b0: 0x6c891620, 0x1c7b1: 0x6c2d8420, 0x1c7b2: 0x6d134020, 0x1c7b3: 0x6c02ec20, - 0x1c7b4: 0x6c589820, 0x1c7b5: 0x6d319220, 0x1c7b6: 0x6c152420, 0x1c7b7: 0x6c980420, - 0x1c7b8: 0x6c284420, 0x1c7b9: 0x6c28b220, 0x1c7ba: 0x6d189e20, 0x1c7bb: 0x6cdc5c20, - 0x1c7bc: 0x6cb0ba20, 0x1c7bd: 0x6c728e20, 0x1c7be: 0x6cde8e20, 0x1c7bf: 0x6cbda420, - // Block 0x71f, offset 0x1c7c0 - 0x1c7c0: 0x6c5f3420, 0x1c7c1: 0x6d3d9a20, 0x1c7c2: 0x6c884c20, 0x1c7c3: 0x6ca9c620, - 0x1c7c4: 0x6c4c3020, 0x1c7c5: 0x6c6d4e20, 0x1c7c6: 0x6c3b8c20, 0x1c7c7: 0x6ccb5a20, - 0x1c7c8: 0x6c608820, 0x1c7c9: 0x6cdbda20, 0x1c7ca: 0x6c5c3620, 0x1c7cb: 0x6c1eea20, - 0x1c7cc: 0x6cdeac20, 0x1c7cd: 0x6cd93620, 0x1c7ce: 0x6c2f7e20, 0x1c7cf: 0x6ccba620, - 0x1c7d0: 0x6d3a7e20, 0x1c7d1: 0x6c7f5620, 0x1c7d2: 0x6c0d5220, 0x1c7d3: 0x6c884e20, - 0x1c7d4: 0x6c9d0220, 0x1c7d5: 0x6cd20220, 0x1c7d6: 0x6cd60c20, 0x1c7d7: 0x6c9d8620, - 0x1c7d8: 0x6ca95a20, 0x1c7d9: 0x6d1ca220, 0x1c7da: 0x6d1ca420, 0x1c7db: 0x6c9b4c20, - 0x1c7dc: 0x6c6d5e20, 0x1c7dd: 0x6cb65e20, 0x1c7de: 0x6c0a7020, 0x1c7df: 0x6c629820, - 0x1c7e0: 0x6c4ff420, 0x1c7e1: 0x6cc7d220, 0x1c7e2: 0x6c256a20, 0x1c7e3: 0x6cf31c20, - 0x1c7e4: 0x6ce1f020, 0x1c7e5: 0x6d1b0e20, 0x1c7e6: 0x6d1b1020, 0x1c7e7: 0x6c336820, - 0x1c7e8: 0x6c226c20, 0x1c7e9: 0x6c5df820, 0x1c7ea: 0x6c6eb220, 0x1c7eb: 0x6c807c20, - 0x1c7ec: 0x6c75f020, 0x1c7ed: 0x6c007820, 0x1c7ee: 0x6cb45820, 0x1c7ef: 0x6d3db020, - 0x1c7f0: 0x6cef4020, 0x1c7f1: 0x6c0d5420, 0x1c7f2: 0x6c47d620, 0x1c7f3: 0x6cb9d620, - 0x1c7f4: 0x6d1ca620, 0x1c7f5: 0x6c0d9c20, 0x1c7f6: 0x6c7e1c20, 0x1c7f7: 0x6c3ade20, - 0x1c7f8: 0x6c125e20, 0x1c7f9: 0x6c99c820, 0x1c7fa: 0x6c66f020, 0x1c7fb: 0x6cf02620, - 0x1c7fc: 0x6c963420, 0x1c7fd: 0x6d29a420, 0x1c7fe: 0x6c940e20, 0x1c7ff: 0x6c869e20, - // Block 0x720, offset 0x1c800 - 0x1c800: 0x6d1ebe20, 0x1c801: 0x6d106e20, 0x1c802: 0x6c91ea20, 0x1c803: 0x6cd8f420, - 0x1c804: 0x6d36e220, 0x1c805: 0x6d1cb220, 0x1c806: 0x6c31cc20, 0x1c807: 0x6cee3c20, - 0x1c808: 0x6c5afc20, 0x1c809: 0x6d024020, 0x1c80a: 0x6cac8020, 0x1c80b: 0x6cd08420, - 0x1c80c: 0x6c0c3820, 0x1c80d: 0x6c153820, 0x1c80e: 0x6ca17220, 0x1c80f: 0x6c8eba20, - 0x1c810: 0x6c651620, 0x1c811: 0x6cb4ba20, 0x1c812: 0x6ccb7420, 0x1c813: 0x6c1a4e20, - 0x1c814: 0x6c47e220, 0x1c815: 0x6c0d6820, 0x1c816: 0x6c5e2820, 0x1c817: 0x6cfd3020, - 0x1c818: 0x6c917220, 0x1c819: 0x6cbe2620, 0x1c81a: 0x6c4f2c20, 0x1c81b: 0x6d1cba20, - 0x1c81c: 0x6cc6d820, 0x1c81d: 0x6c86f820, 0x1c81e: 0x6c6eb420, 0x1c81f: 0x6cff3a20, - 0x1c820: 0x6d1cbc20, 0x1c821: 0x6cdc0e20, 0x1c822: 0x6cf03c20, 0x1c823: 0x6d025620, - 0x1c824: 0x6c57fc20, 0x1c825: 0x6d097820, 0x1c826: 0x6d39d420, 0x1c827: 0x6c8fc620, - 0x1c828: 0x6c7f6a20, 0x1c829: 0x6c337820, 0x1c82a: 0x6c38de20, 0x1c82b: 0x6c55ee20, - 0x1c82c: 0x6c7f6c20, 0x1c82d: 0x6cd63420, 0x1c82e: 0x6c8e3220, 0x1c82f: 0x6d1cbe20, - 0x1c830: 0x6c9ca020, 0x1c831: 0x6c62c820, 0x1c832: 0x6c892c20, 0x1c833: 0x6c66fe20, - 0x1c834: 0x6d1cc620, 0x1c835: 0x6c3c0220, 0x1c836: 0x6c8c0020, 0x1c837: 0x6d192c20, - 0x1c838: 0x6c653220, 0x1c839: 0x6d270a20, 0x1c83a: 0x6c155620, 0x1c83b: 0x6c27a620, - 0x1c83c: 0x6cc4e620, 0x1c83d: 0x6c661820, 0x1c83e: 0x6c7fe820, 0x1c83f: 0x6c38e020, - // Block 0x721, offset 0x1c840 - 0x1c840: 0x6cd6f420, 0x1c841: 0x6d252620, 0x1c842: 0x6d3dd420, 0x1c843: 0x6c3c8020, - 0x1c844: 0x6ccf8c20, 0x1c845: 0x6c830220, 0x1c846: 0x6c7fea20, 0x1c847: 0x6c23c620, - 0x1c848: 0x6cc20020, 0x1c849: 0x6d1dda20, 0x1c84a: 0x6cb9e020, 0x1c84b: 0x6c383620, - 0x1c84c: 0x6c49b420, 0x1c84d: 0x6cc41a20, 0x1c84e: 0x6d0f2220, 0x1c84f: 0x6c507c20, - 0x1c850: 0x6d1d7020, 0x1c851: 0x6cc95c20, 0x1c852: 0x6d29ba20, 0x1c853: 0x6c946020, - 0x1c854: 0x6d0f0420, 0x1c855: 0x6c84a820, 0x1c856: 0x6c9d0e20, 0x1c857: 0x6ccde820, - 0x1c858: 0x6cdfc620, 0x1c859: 0x6c293e20, 0x1c85a: 0x6c697620, 0x1c85b: 0x6c161820, - 0x1c85c: 0x6d1d7220, 0x1c85d: 0x6c508420, 0x1c85e: 0x6c03dc20, 0x1c85f: 0x6d3a4220, - 0x1c860: 0x6c805e20, 0x1c861: 0x6c800820, 0x1c862: 0x6ca47820, 0x1c863: 0x6cecac20, - 0x1c864: 0x6c947020, 0x1c865: 0x6d0a5e20, 0x1c866: 0x6cfc6a20, 0x1c867: 0x6d0f2820, - 0x1c868: 0x6c424820, 0x1c869: 0x6d0f3220, 0x1c86a: 0x6d24ac20, 0x1c86b: 0x6c5d8420, - 0x1c86c: 0x6c0be820, 0x1c86d: 0x6c9eca20, 0x1c86e: 0x6c49d220, 0x1c86f: 0x6c2a9a20, - 0x1c870: 0x6c5a8620, 0x1c871: 0x6cfe7a20, 0x1c872: 0x6cfe7c20, 0x1c873: 0x6c5caa20, - 0x1c874: 0x6c529620, 0x1c875: 0x6c8c9c20, 0x1c876: 0x6d2a6620, 0x1c877: 0x6d3bbe20, - 0x1c878: 0x6c6faa20, 0x1c879: 0x6d2ca820, 0x1c87a: 0x6d015820, 0x1c87b: 0x6c1be420, - 0x1c87c: 0x6d3d2420, 0x1c87d: 0x6d28f220, 0x1c87e: 0x6d28f420, 0x1c87f: 0x6c11ec20, - // Block 0x722, offset 0x1c880 - 0x1c880: 0x6d0f8020, 0x1c881: 0x6cb74820, 0x1c882: 0x6d379c20, 0x1c883: 0x6c3b5e20, - 0x1c884: 0x6ca98220, 0x1c885: 0x6c6efa20, 0x1c886: 0x6cf18220, 0x1c887: 0x6cb36820, - 0x1c888: 0x6d16c420, 0x1c889: 0x6c913c20, 0x1c88a: 0x6c20b620, 0x1c88b: 0x6caf4020, - 0x1c88c: 0x6c767e20, 0x1c88d: 0x6caca420, 0x1c88e: 0x6d0c6a20, 0x1c88f: 0x6c768020, - 0x1c890: 0x6cad2620, 0x1c891: 0x6ca26e20, 0x1c892: 0x6c179020, 0x1c893: 0x6c8a9220, - 0x1c894: 0x6c4b3420, 0x1c895: 0x6c778220, 0x1c896: 0x6c33dc20, 0x1c897: 0x6c49d620, - 0x1c898: 0x6d02b820, 0x1c899: 0x6d358c20, 0x1c89a: 0x6c4a2e20, 0x1c89b: 0x6c49d820, - 0x1c89c: 0x6cef9420, 0x1c89d: 0x6cbb5420, 0x1c89e: 0x6c0be420, 0x1c89f: 0x6c268420, - 0x1c8a0: 0x6cf99820, 0x1c8a1: 0x6d329a20, 0x1c8a2: 0x6d39fc20, 0x1c8a3: 0x6c785e20, - 0x1c8a4: 0x6d2fa220, 0x1c8a5: 0x6c3e1420, 0x1c8a6: 0x6c036e20, 0x1c8a7: 0x6d017420, - 0x1c8a8: 0x6c34dc20, 0x1c8a9: 0x6c8e1e20, 0x1c8aa: 0x6d3cf220, 0x1c8ab: 0x6d087a20, - 0x1c8ac: 0x6c721420, 0x1c8ad: 0x6ce08e20, 0x1c8ae: 0x6cad8420, 0x1c8af: 0x6c6f0220, - 0x1c8b0: 0x6cad5020, 0x1c8b1: 0x6cdf1e20, 0x1c8b2: 0x6cdf2020, 0x1c8b3: 0x6c0dd220, - 0x1c8b4: 0x6d100c20, 0x1c8b5: 0x6ce6f020, 0x1c8b6: 0x6c4d9420, 0x1c8b7: 0x6d3ac220, - 0x1c8b8: 0x6d2cb820, 0x1c8b9: 0x6c2d0a20, 0x1c8ba: 0x6cf07a20, 0x1c8bb: 0x6cd25220, - 0x1c8bc: 0x6c88e620, 0x1c8bd: 0x6c1bfc20, 0x1c8be: 0x6c5a4a20, 0x1c8bf: 0x6d397820, - // Block 0x723, offset 0x1c8c0 - 0x1c8c0: 0x6c54ae20, 0x1c8c1: 0x6cd77020, 0x1c8c2: 0x6c806e20, 0x1c8c3: 0x6ce63620, - 0x1c8c4: 0x6c68de20, 0x1c8c5: 0x6d06a820, 0x1c8c6: 0x6c525e20, 0x1c8c7: 0x6cc35420, - 0x1c8c8: 0x6c8af020, 0x1c8c9: 0x6c590820, 0x1c8ca: 0x6d0fa020, 0x1c8cb: 0x6d04c420, - 0x1c8cc: 0x6d04c620, 0x1c8cd: 0x6cfbfe20, 0x1c8ce: 0x6d1a3020, 0x1c8cf: 0x6cf36020, - 0x1c8d0: 0x6d386620, 0x1c8d1: 0x6d10e220, 0x1c8d2: 0x6cd35020, 0x1c8d3: 0x6cee6e20, - 0x1c8d4: 0x6ce73620, 0x1c8d5: 0x6c9ece20, 0x1c8d6: 0x6d28fe20, 0x1c8d7: 0x6c768420, - 0x1c8d8: 0x6c529e20, 0x1c8d9: 0x6c81d020, 0x1c8da: 0x6cf9a820, 0x1c8db: 0x6d3a0420, - 0x1c8dc: 0x6d084a20, 0x1c8dd: 0x6d32a020, 0x1c8de: 0x6cb37820, 0x1c8df: 0x6d0be420, - 0x1c8e0: 0x6c5b2e20, 0x1c8e1: 0x6c49e620, 0x1c8e2: 0x6c180e20, 0x1c8e3: 0x6c5aa420, - 0x1c8e4: 0x6c77a820, 0x1c8e5: 0x6c194c20, 0x1c8e6: 0x6c389020, 0x1c8e7: 0x6cce6220, - 0x1c8e8: 0x6d12e220, 0x1c8e9: 0x6c5bac20, 0x1c8eb: 0x6ce19a20, - 0x1c8ec: 0x6c6cf220, 0x1c8ed: 0x6cc55020, 0x1c8ee: 0x6c8b9620, 0x1c8ef: 0x6cf5f220, - 0x1c8f0: 0x6c3e5420, 0x1c8f1: 0x6c6f0a20, 0x1c8f2: 0x6d019420, 0x1c8f3: 0x6cb48a20, - 0x1c8f4: 0x6ce64220, 0x1c8f5: 0x6d3d3c20, 0x1c8f6: 0x6ce6c020, 0x1c8f7: 0x6cecd420, - 0x1c8f8: 0x6c4d4020, 0x1c8f9: 0x6cae6a20, 0x1c8fa: 0x6c80fc20, 0x1c8fb: 0x6d0e5220, - 0x1c8fc: 0x6d06bc20, 0x1c8fd: 0x6c3c3e20, 0x1c8fe: 0x6c1c1020, 0x1c8ff: 0x6cc66820, - // Block 0x724, offset 0x1c900 - 0x1c900: 0x6c554620, 0x1c901: 0x6cf5f420, 0x1c902: 0x6cd4ce20, 0x1c903: 0x6c51c420, - 0x1c904: 0x6d099620, 0x1c905: 0x6c7a9220, 0x1c906: 0x6c72e820, 0x1c907: 0x6cfeb620, - 0x1c908: 0x6cf5f620, 0x1c909: 0x6d0bfa20, 0x1c90a: 0x6c4eb220, 0x1c90b: 0x6d3c3c20, - 0x1c90c: 0x6c75b020, 0x1c90d: 0x6c2c4220, 0x1c90e: 0x6d019620, 0x1c90f: 0x6c601c20, - 0x1c910: 0x6cf4e020, 0x1c911: 0x6d0bfc20, 0x1c912: 0x6c942c20, 0x1c913: 0x6c4e0620, - 0x1c914: 0x6d0e6220, 0x1c915: 0x6c591220, 0x1c916: 0x6c9aee20, 0x1c917: 0x6c711620, - 0x1c918: 0x6c2a1020, 0x1c919: 0x6c072420, 0x1c91a: 0x6c3b7a20, 0x1c91b: 0x6c8c5220, - 0x1c91c: 0x6c7d6220, 0x1c91d: 0x6c5d2820, 0x1c91e: 0x6cea2220, 0x1c91f: 0x6cf61620, - 0x1c920: 0x6c253e20, 0x1c921: 0x6cf3c820, 0x1c922: 0x6c52a820, 0x1c923: 0x6c179c20, - 0x1c924: 0x6c3f6220, 0x1c925: 0x6cf2f420, 0x1c926: 0x6c684820, 0x1c927: 0x6c231820, - 0x1c928: 0x6c3ce220, 0x1c929: 0x6cb2a620, 0x1c92a: 0x6cbf2620, 0x1c92b: 0x6cc91e20, - 0x1c92c: 0x6cf61820, 0x1c92d: 0x6cbf2820, 0x1c92e: 0x6d033420, 0x1c92f: 0x6c174420, - 0x1c930: 0x6d0e7420, 0x1c931: 0x6d0e7620, 0x1c932: 0x6d17aa20, 0x1c933: 0x6c744e20, - 0x1c934: 0x6d234620, 0x1c935: 0x6c42a820, 0x1c936: 0x6cc47820, 0x1c937: 0x6caff020, - 0x1c938: 0x6d049420, 0x1c939: 0x6cee6420, 0x1c93a: 0x6cd10420, 0x1c93b: 0x6c171420, - 0x1c93c: 0x6cce6e20, 0x1c93d: 0x6d048420, 0x1c93e: 0x6ca72420, 0x1c93f: 0x6c44d020, - // Block 0x725, offset 0x1c940 - 0x1c940: 0x6cf13e20, 0x1c941: 0x6c18d420, 0x1c942: 0x6c51ce20, 0x1c943: 0x6c7cd220, - 0x1c944: 0x6d37fe20, 0x1c945: 0x6c32cc20, 0x1c946: 0x6cf96a20, 0x1c947: 0x6c5ac620, - 0x1c948: 0x6c3ce420, 0x1c949: 0x6c890620, 0x1c94a: 0x6d07a820, 0x1c94b: 0x6d037e20, - 0x1c94c: 0x6c59d220, 0x1c94d: 0x6c690a20, 0x1c94e: 0x6c64b620, 0x1c94f: 0x6c09cc20, - 0x1c950: 0x6d1bbc20, 0x1c951: 0x6d3a7020, 0x1c952: 0x6cefde20, 0x1c953: 0x6ce93620, - 0x1c954: 0x6ccd4a20, 0x1c955: 0x6cf67020, 0x1c956: 0x6caa9620, 0x1c957: 0x6caa9820, - 0x1c958: 0x6c150220, 0x1c959: 0x6d0c1220, 0x1c95a: 0x6c6f1020, 0x1c95b: 0x6c6f2420, - 0x1c95c: 0x6d237020, 0x1c95d: 0x6c9a9c20, 0x1c95e: 0x6ccbfc20, 0x1c95f: 0x6cf0a620, - 0x1c960: 0x6d2c3820, 0x1c961: 0x6d033620, 0x1c962: 0x6cbf3e20, 0x1c963: 0x6cc75020, - 0x1c964: 0x6c9a0c20, 0x1c965: 0x6c593620, 0x1c966: 0x6d06f420, 0x1c967: 0x6d2fbe20, - 0x1c968: 0x6ceea020, 0x1c969: 0x6c38a620, 0x1c96a: 0x6cc07620, 0x1c96b: 0x6cdc4a20, - 0x1c96c: 0x6d0fc820, 0x1c96d: 0x6c8b1620, 0x1c96e: 0x6d3a6e20, 0x1c96f: 0x6c6a2220, - 0x1c970: 0x6c434e20, 0x1c971: 0x6c485c20, 0x1c972: 0x6c05b420, 0x1c973: 0x6c557020, - 0x1c974: 0x6d275820, 0x1c975: 0x6cf96c20, 0x1c976: 0x6cd41a20, 0x1c977: 0x6c89ce20, - 0x1c978: 0x6c0afa20, 0x1c979: 0x6c46c420, 0x1c97a: 0x6cea0020, 0x1c97b: 0x6ce11420, - 0x1c97c: 0x6c17a020, 0x1c97d: 0x6cccfc20, 0x1c97e: 0x6c371a20, 0x1c97f: 0x6c0f2a20, - // Block 0x726, offset 0x1c980 - 0x1c980: 0x6c5a5a20, 0x1c981: 0x6d00ce20, 0x1c982: 0x6cf8ae20, 0x1c983: 0x6cf50e20, - 0x1c984: 0x6cf67220, 0x1c985: 0x6d284220, 0x1c986: 0x6c515a20, 0x1c987: 0x6c51d220, - 0x1c988: 0x6cf67420, 0x1c989: 0x6d27bc20, 0x1c98a: 0x6d048020, 0x1c98b: 0x6ca37e20, - 0x1c98c: 0x6ccd5020, 0x1c98d: 0x6cbf8e20, 0x1c98e: 0x6d121620, 0x1c98f: 0x6d099e20, - 0x1c990: 0x6c9d6c20, 0x1c991: 0x6c882420, 0x1c992: 0x6d1c8820, 0x1c993: 0x6cf45a20, - 0x1c994: 0x6cc69a20, 0x1c995: 0x6c459e20, 0x1c996: 0x6d0f3820, 0x1c997: 0x6cbb5820, - 0x1c998: 0x6c8e3820, 0x1c999: 0x6cf67620, 0x1c99a: 0x6c09f820, 0x1c99b: 0x6c0c1820, - 0x1c99c: 0x6c233e20, 0x1c99d: 0x6c92a620, 0x1c99e: 0x6c64d620, 0x1c99f: 0x6cd53420, - 0x1c9a0: 0x6d185620, 0x1c9a1: 0x6c90b220, 0x1c9a2: 0x6caeb620, 0x1c9a3: 0x6cdbd420, - 0x1c9a4: 0x6d185820, 0x1c9a5: 0x6ce28e20, 0x1c9a6: 0x6c749420, 0x1c9a7: 0x6d3fb220, - 0x1c9a8: 0x6d284620, 0x1c9a9: 0x6c56c020, 0x1c9aa: 0x6d154820, 0x1c9ab: 0x6d36b420, - 0x1c9ac: 0x6c026220, 0x1c9ad: 0x6cf0bc20, 0x1c9ae: 0x6c8f1420, 0x1c9af: 0x6c4efa20, - 0x1c9b0: 0x6cab4c20, 0x1c9b1: 0x6cc55420, 0x1c9b2: 0x6c6f2c20, 0x1c9b3: 0x6c97fc20, - 0x1c9b4: 0x6c7de220, 0x1c9b5: 0x6cce1820, 0x1c9b6: 0x6c24b220, 0x1c9b7: 0x6d2b9020, - 0x1c9b8: 0x6c64f620, 0x1c9b9: 0x6cf6c620, 0x1c9ba: 0x6cf6c820, 0x1c9bb: 0x6cf6ca20, - 0x1c9bc: 0x6d185a20, 0x1c9bd: 0x6d000c20, 0x1c9be: 0x6c1c6e20, 0x1c9bf: 0x6c59ea20, - // Block 0x727, offset 0x1c9c0 - 0x1c9c0: 0x6c15e420, 0x1c9c1: 0x6d131820, 0x1c9c2: 0x6ce01020, 0x1c9c3: 0x6cc48820, - 0x1c9c4: 0x6d0ec020, 0x1c9c5: 0x6cfb9420, 0x1c9c6: 0x6cbbae20, 0x1c9c7: 0x6c75e820, - 0x1c9c8: 0x6c2aaa20, 0x1c9c9: 0x6c340a20, 0x1c9ca: 0x6cd01820, 0x1c9cb: 0x6c687a20, - 0x1c9cc: 0x6c3b9620, 0x1c9cd: 0x6cd82a20, 0x1c9ce: 0x6c8a1a20, 0x1c9cf: 0x6d23ee20, - 0x1c9d0: 0x6c8bde20, 0x1c9d1: 0x6ce78a20, 0x1c9d2: 0x6cce8420, 0x1c9d3: 0x6c3b4620, - 0x1c9d4: 0x6c38bc20, 0x1c9d5: 0x6d0ec220, 0x1c9d6: 0x6d0a3e20, 0x1c9d7: 0x6c807620, - 0x1c9d8: 0x6c9a6a20, 0x1c9d9: 0x6ce1a220, 0x1c9da: 0x6d18a220, 0x1c9db: 0x6c6e3020, - 0x1c9dc: 0x6c9afc20, 0x1c9dd: 0x6c6ecc20, 0x1c9de: 0x6c694420, 0x1c9df: 0x6d1c9a20, - 0x1c9e0: 0x6d23f020, 0x1c9e1: 0x6d18ca20, 0x1c9e2: 0x6d091e20, 0x1c9e3: 0x6c7fc020, - 0x1c9e4: 0x6cdf8020, 0x1c9e5: 0x6d2a9220, 0x1c9e6: 0x6c120c20, 0x1c9e7: 0x6cdc7420, - 0x1c9e8: 0x6cf6ea20, 0x1c9e9: 0x6cc40220, 0x1c9ea: 0x6c235420, 0x1c9eb: 0x6c886220, - 0x1c9ec: 0x6c5b6e20, 0x1c9ed: 0x6d3a2c20, 0x1c9ee: 0x6d022c20, 0x1c9ef: 0x6c8d6e20, - 0x1c9f0: 0x6ceec020, 0x1c9f1: 0x6d18cc20, 0x1c9f2: 0x6d00fc20, 0x1c9f3: 0x6d2fe220, - 0x1c9f4: 0x6c5c5220, 0x1c9f5: 0x6c270020, 0x1c9f6: 0x6ca9ce20, 0x1c9f7: 0x6c7fc220, - 0x1c9f8: 0x6cc7de20, 0x1c9f9: 0x6cfc3a20, 0x1c9fa: 0x6c77b620, 0x1c9fb: 0x6d09ba20, - 0x1c9fc: 0x6c6d6620, 0x1c9fd: 0x6c1df820, 0x1c9fe: 0x6c2a3a20, 0x1c9ff: 0x6d123020, - // Block 0x728, offset 0x1ca00 - 0x1ca00: 0x6c51fc20, 0x1ca01: 0x6c807e20, 0x1ca02: 0x6c0c4220, 0x1ca03: 0x6cc6ce20, - 0x1ca04: 0x6c86d020, 0x1ca05: 0x6ca18220, 0x1ca06: 0x6c067820, 0x1ca07: 0x6cc93220, - 0x1ca08: 0x6c941420, 0x1ca09: 0x6c7ea620, 0x1ca0a: 0x6c023620, 0x1ca0b: 0x6d0ab020, - 0x1ca0c: 0x6c7c1020, 0x1ca0d: 0x6cd7aa20, 0x1ca0e: 0x6c8ab420, 0x1ca0f: 0x6c872020, - 0x1ca10: 0x6c918420, 0x1ca11: 0x6c74ea20, 0x1ca12: 0x6c8a8620, 0x1ca13: 0x6d0efa20, - 0x1ca14: 0x6cf73a20, 0x1ca15: 0x6d025a20, 0x1ca16: 0x6c8fde20, 0x1ca17: 0x6d136e20, - 0x1ca18: 0x6c121a20, 0x1ca19: 0x6cc50c20, 0x1ca1a: 0x6d271420, 0x1ca1b: 0x6c808820, - 0x1ca1c: 0x6c23ce20, 0x1ca1d: 0x6c750c20, 0x1ca1e: 0x6c1d3220, 0x1ca1f: 0x6c49b620, - 0x1ca20: 0x6c72d620, 0x1ca21: 0x6c185620, 0x1ca22: 0x6c9cba20, 0x1ca23: 0x6ce19220, - 0x1ca24: 0x6c809220, 0x1ca25: 0x6d3a4820, 0x1ca26: 0x6c809a20, 0x1ca27: 0x6c8dda20, - 0x1ca28: 0x6c24c420, 0x1ca29: 0x6d24b220, 0x1ca2a: 0x6d2f8020, 0x1ca2b: 0x6d2ff420, - 0x1ca2c: 0x6cabd220, 0x1ca2d: 0x6d328c20, 0x1ca2e: 0x6cad5220, 0x1ca2f: 0x6c195820, - 0x1ca30: 0x6d254620, 0x1ca31: 0x6c009620, 0x1ca32: 0x6cf09c20, 0x1ca33: 0x6c4f4420, - 0x1ca34: 0x6c749620, 0x1ca35: 0x6c74c820, 0x1ca36: 0x6c3fa020, 0x1ca37: 0x6d13b020, - 0x1ca38: 0x6c03aa20, 0x1ca39: 0x6c2e5620, 0x1ca3a: 0x6d13b420, 0x1ca3b: 0x6d10c620, - 0x1ca3c: 0x6d411020, 0x1ca3d: 0x6cd6d020, 0x1ca3e: 0x6c379e20, 0x1ca3f: 0x6cac5020, - // Block 0x729, offset 0x1ca40 - 0x1ca40: 0x6c206e20, 0x1ca41: 0x6c77e220, 0x1ca42: 0x6d29d420, 0x1ca43: 0x6c2ec020, - 0x1ca44: 0x6cbace20, 0x1ca45: 0x6d1dfc20, 0x1ca46: 0x6cbb2a20, 0x1ca47: 0x6cb14420, - 0x1ca48: 0x6c04be20, 0x1ca49: 0x6cacac20, 0x1ca4a: 0x6c175a20, 0x1ca4b: 0x6c64a020, - 0x1ca4c: 0x6cac0020, 0x1ca4d: 0x6c31a020, 0x1ca4e: 0x6c205420, 0x1ca4f: 0x6d215a20, - 0x1ca50: 0x6d2c3a20, 0x1ca51: 0x6c0afc20, 0x1ca52: 0x6c2ec220, 0x1ca53: 0x6c055420, - 0x1ca54: 0x6c0f2c20, 0x1ca55: 0x6c205a20, 0x1ca56: 0x6d1fea20, 0x1ca57: 0x6d206e20, - 0x1ca58: 0x6c31d620, 0x1ca59: 0x6d0b0820, 0x1ca5a: 0x6c197220, 0x1ca5b: 0x6ca96620, - 0x1ca5c: 0x6ca9ac20, 0x1ca5d: 0x6cb24020, 0x1ca5e: 0x6c6f4c20, 0x1ca5f: 0x6ca1be20, - 0x1ca60: 0x6cdde020, 0x1ca61: 0x6ca22420, 0x1ca62: 0x6c814220, 0x1ca63: 0x6cc5c420, - 0x1ca64: 0x6c981a20, 0x1ca65: 0x6c398a20, 0x1ca66: 0x6c98ca20, 0x1ca67: 0x6ca27020, - 0x1ca68: 0x6c426020, 0x1ca69: 0x6cf4b820, 0x1ca6a: 0x6d0e4020, 0x1ca6b: 0x6c437420, - 0x1ca6c: 0x6c06ec20, 0x1ca6d: 0x6cd8a020, 0x1ca6e: 0x6c665e20, 0x1ca6f: 0x6c476620, - 0x1ca70: 0x6d202c20, 0x1ca71: 0x6c437e20, 0x1ca72: 0x6cd0f220, 0x1ca73: 0x6ca23020, - 0x1ca74: 0x6c2be620, 0x1ca75: 0x6cb8be20, 0x1ca76: 0x6cc37020, 0x1ca77: 0x6cc2cc20, - 0x1ca78: 0x6d3f4020, 0x1ca79: 0x6ce27020, 0x1ca7a: 0x6cf5c420, 0x1ca7b: 0x6c985620, - 0x1ca7c: 0x6c793820, 0x1ca7d: 0x6cb8d820, 0x1ca7e: 0x6cf44620, 0x1ca7f: 0x6c481220, - // Block 0x72a, offset 0x1ca80 - 0x1ca80: 0x6cf61a20, 0x1ca81: 0x6c83c220, 0x1ca82: 0x6c83da20, 0x1ca83: 0x6cb3f420, - 0x1ca84: 0x6c5ed420, 0x1ca85: 0x6c428220, 0x1ca86: 0x6d346420, 0x1ca87: 0x6c078820, - 0x1ca88: 0x6cc2f220, 0x1ca89: 0x6c214e20, 0x1ca8a: 0x6c31a220, 0x1ca8b: 0x6c724a20, - 0x1ca8c: 0x6c636e20, 0x1ca8d: 0x6c64a220, 0x1ca8e: 0x6c3c5620, 0x1ca8f: 0x6cb0f820, - 0x1ca90: 0x6c780820, 0x1ca91: 0x6c713020, 0x1ca92: 0x6c77c220, 0x1ca93: 0x6c1e9c20, - 0x1ca94: 0x6cf8b220, 0x1ca95: 0x6c074020, 0x1ca96: 0x6c961820, 0x1ca97: 0x6c6bf220, - 0x1ca98: 0x6c967220, 0x1ca99: 0x6cca0820, 0x1ca9a: 0x6cf0be20, 0x1ca9b: 0x6c98fc20, - 0x1ca9c: 0x6c33b020, 0x1ca9d: 0x6ce78c20, 0x1ca9e: 0x6cbc7620, 0x1ca9f: 0x6c67fc20, - 0x1caa0: 0x6cf94820, 0x1caa1: 0x6c86d220, 0x1caa2: 0x6c31d820, 0x1caa3: 0x6c8b5e20, - 0x1caa4: 0x6cac1020, 0x1caa5: 0x6cb16e20, 0x1caa6: 0x6c0fa620, 0x1caa7: 0x6cf73c20, - 0x1caa8: 0x6c1d8620, 0x1caa9: 0x6cef6820, 0x1caaa: 0x6c7cc220, 0x1caab: 0x6c1d8a20, - 0x1caac: 0x6cc34c20, 0x1caad: 0x6cc38020, 0x1caae: 0x6c035e20, 0x1caaf: 0x6c391620, - 0x1cab0: 0x6cbff420, 0x1cab1: 0x6c611c20, 0x1cab2: 0x6c110420, 0x1cab3: 0x6d3d2220, - 0x1cab4: 0x6c019c20, 0x1cab5: 0x6c436820, 0x1cab6: 0x6d3c3020, 0x1cab7: 0x6c4a0620, - 0x1cab8: 0x6c96b020, 0x1cab9: 0x6d1eee20, 0x1caba: 0x6c778020, 0x1cabb: 0x6c0eae20, - 0x1cabc: 0x6c544a20, 0x1cabd: 0x6d0b7620, 0x1cabe: 0x6d1a2820, 0x1cabf: 0x6c582620, - // Block 0x72b, offset 0x1cac0 - 0x1cac0: 0x6d3c3420, 0x1cac1: 0x6d27da20, 0x1cac2: 0x6c7bba20, 0x1cac3: 0x6ca97a20, - 0x1cac4: 0x6c2b5420, 0x1cac5: 0x6cbe2e20, 0x1cac6: 0x6d381420, 0x1cac7: 0x6ca26a20, - 0x1cac8: 0x6c06d820, 0x1cac9: 0x6caf4220, 0x1caca: 0x6c70fc20, 0x1cacb: 0x6d147420, - 0x1cacc: 0x6cd0e420, 0x1cacd: 0x6cad4e20, 0x1cace: 0x6cf98e20, 0x1cacf: 0x6ceaf220, - 0x1cad0: 0x6c552620, 0x1cad1: 0x6c8cae20, 0x1cad2: 0x6c3a8a20, 0x1cad3: 0x6cafbe20, - 0x1cad4: 0x6ca62a20, 0x1cad5: 0x6d119020, 0x1cad6: 0x6d201a20, 0x1cad7: 0x6c467020, - 0x1cad8: 0x6d094620, 0x1cad9: 0x6c705e20, 0x1cada: 0x6c286a20, 0x1cadb: 0x6c0eb820, - 0x1cadc: 0x6c7a7420, 0x1cadd: 0x6cfbe820, 0x1cade: 0x6ca8f820, 0x1cadf: 0x6c586620, - 0x1cae0: 0x6c523c20, 0x1cae1: 0x6c68d420, 0x1cae2: 0x6c50dc20, 0x1cae3: 0x6d2fa420, - 0x1cae4: 0x6c5ff620, 0x1cae5: 0x6d0a7220, 0x1cae6: 0x6cccd220, 0x1cae7: 0x6cde3820, - 0x1cae8: 0x6cc65820, 0x1cae9: 0x6cd45620, 0x1caea: 0x6ce72820, 0x1caeb: 0x6c81a820, - 0x1caec: 0x6c318a20, 0x1caed: 0x6cf99c20, 0x1caee: 0x6cd1ae20, 0x1caef: 0x6c7b1a20, - 0x1caf0: 0x6d329c20, 0x1caf1: 0x6d22e420, 0x1caf2: 0x6cdccc20, 0x1caf3: 0x6d20f420, - 0x1caf4: 0x6c096220, 0x1caf5: 0x6c985420, 0x1caf6: 0x6cf5c620, 0x1caf7: 0x6c734c20, - 0x1caf8: 0x6c87e020, 0x1caf9: 0x6cf9aa20, 0x1cafa: 0x6d1a4820, 0x1cafb: 0x6cdb7e20, - 0x1cafc: 0x6c80ae20, 0x1cafd: 0x6c070220, 0x1cafe: 0x6d35c020, 0x1caff: 0x6d0c7420, - // Block 0x72c, offset 0x1cb00 - 0x1cb00: 0x6ccbdc20, 0x1cb01: 0x6c85d220, 0x1cb02: 0x6c4e9e20, 0x1cb03: 0x6cfc0020, - 0x1cb04: 0x6c6dae20, 0x1cb05: 0x6cabfc20, 0x1cb06: 0x6c3a0620, 0x1cb07: 0x6cfeb820, - 0x1cb08: 0x6c044220, 0x1cb09: 0x6cb5cc20, 0x1cb0a: 0x6ca5da20, 0x1cb0b: 0x6c0bfc20, - 0x1cb0c: 0x6d1b5620, 0x1cb0d: 0x6c7efe20, 0x1cb0e: 0x6c8b0220, 0x1cb0f: 0x6c648820, - 0x1cb10: 0x6cbaac20, 0x1cb11: 0x6c7d5a20, 0x1cb12: 0x6d0c0a20, 0x1cb13: 0x6c4cba20, - 0x1cb14: 0x6d402020, 0x1cb15: 0x6c9c4820, 0x1cb16: 0x6c166820, 0x1cb17: 0x6d13e620, - 0x1cb18: 0x6d35e820, 0x1cb19: 0x6d32b420, 0x1cb1a: 0x6d0b2c20, 0x1cb1b: 0x6c9bce20, - 0x1cb1c: 0x6c10f820, 0x1cb1d: 0x6c243620, 0x1cb1e: 0x6cceec20, 0x1cb1f: 0x6c8b9820, - 0x1cb20: 0x6c2d1620, 0x1cb21: 0x6c953e20, 0x1cb22: 0x6c556020, 0x1cb23: 0x6d3f9020, - 0x1cb24: 0x6c4b4620, 0x1cb25: 0x6cefc820, 0x1cb26: 0x6c3c4c20, 0x1cb27: 0x6cf28c20, - 0x1cb28: 0x6d256620, 0x1cb29: 0x6d037420, 0x1cb2a: 0x6d399820, 0x1cb2b: 0x6c98ba20, - 0x1cb2c: 0x6cf14020, 0x1cb2d: 0x6c1fe420, 0x1cb2e: 0x6cfcce20, 0x1cb2f: 0x6ce93420, - 0x1cb30: 0x6d0bb220, 0x1cb31: 0x6ca4ac20, 0x1cb32: 0x6d004220, 0x1cb33: 0x6c636020, - 0x1cb34: 0x6c540620, 0x1cb35: 0x6c0af420, 0x1cb36: 0x6d1f3a20, 0x1cb37: 0x6d1f4820, - 0x1cb38: 0x6c9a0020, 0x1cb39: 0x6c13e420, 0x1cb3a: 0x6d111420, 0x1cb3b: 0x6cdcd620, - 0x1cb3c: 0x6c0f1420, 0x1cb3d: 0x6ca00820, 0x1cb3e: 0x6c574020, 0x1cb3f: 0x6d258620, - // Block 0x72d, offset 0x1cb40 - 0x1cb40: 0x6cd9b420, 0x1cb41: 0x6c96c420, 0x1cb42: 0x6d258820, 0x1cb43: 0x6c270c20, - 0x1cb44: 0x6d239220, 0x1cb45: 0x6cd1d220, 0x1cb46: 0x6c4fcc20, 0x1cb47: 0x6cbb6420, - 0x1cb48: 0x6d17ea20, 0x1cb49: 0x6d316a20, 0x1cb4a: 0x6c123420, 0x1cb4b: 0x6c4fe220, - 0x1cb4c: 0x6c97ee20, 0x1cb4d: 0x6c6e9620, 0x1cb4e: 0x6c67b820, 0x1cb4f: 0x6ca12e20, - 0x1cb50: 0x6d2ecc20, 0x1cb51: 0x6c150a20, 0x1cb52: 0x6c026420, 0x1cb53: 0x6c025420, - 0x1cb54: 0x6c4fd420, 0x1cb55: 0x6c24e020, 0x1cb56: 0x6c07c420, 0x1cb57: 0x6c749820, - 0x1cb58: 0x6c0a2c20, 0x1cb59: 0x6c09fe20, 0x1cb5a: 0x6c59dc20, 0x1cb5b: 0x6cb44a20, - 0x1cb5c: 0x6c8bd020, 0x1cb5d: 0x6d072620, 0x1cb5e: 0x6ce77e20, 0x1cb5f: 0x6d121e20, - 0x1cb60: 0x6c8a1220, 0x1cb61: 0x6cd79020, 0x1cb62: 0x6cff0620, 0x1cb63: 0x6cd49020, - 0x1cb64: 0x6c33a820, 0x1cb65: 0x6c69c620, 0x1cb66: 0x6c442020, 0x1cb67: 0x6c739020, - 0x1cb68: 0x6c31b420, 0x1cb69: 0x6c5c3820, 0x1cb6a: 0x6c7b3e20, 0x1cb6b: 0x6cfc2c20, - 0x1cb6c: 0x6d021820, 0x1cb6d: 0x6cde1820, 0x1cb6e: 0x6cfc3220, 0x1cb6f: 0x6d09b020, - 0x1cb70: 0x6ca92620, 0x1cb71: 0x6cb21820, 0x1cb72: 0x6c5dfc20, 0x1cb73: 0x6caa2a20, - 0x1cb74: 0x6c9be620, 0x1cb75: 0x6c8b5420, 0x1cb76: 0x6ca51e20, 0x1cb77: 0x6c4a0c20, - 0x1cb78: 0x6cd48420, 0x1cb79: 0x6c917420, 0x1cb7a: 0x6cde2020, 0x1cb7b: 0x6cfd3c20, - 0x1cb7c: 0x6c9ca220, 0x1cb7d: 0x6cc4e820, 0x1cb7e: 0x6c584020, 0x1cb7f: 0x6ca52820, - // Block 0x72e, offset 0x1cb80 - 0x1cb80: 0x6c957820, 0x1cb81: 0x6cfc5420, 0x1cb82: 0x6cb6ac20, 0x1cb83: 0x6c751e20, - 0x1cb84: 0x6d07fa20, 0x1cb85: 0x6c9eae20, 0x1cb86: 0x6d3e1a20, 0x1cb87: 0x6c93d620, - 0x1cb88: 0x6c914c20, 0x1cb89: 0x6d22b820, 0x1cb8a: 0x6cda7a20, 0x1cb8b: 0x6cedda20, - 0x1cb8c: 0x6cbff620, 0x1cb8d: 0x6c40d220, 0x1cb8e: 0x6c2f4c20, 0x1cb8f: 0x6c821620, - 0x1cb90: 0x6c031620, 0x1cb91: 0x6c5e7c20, 0x1cb92: 0x6c52fa20, 0x1cb93: 0x6c2c1a20, - 0x1cb94: 0x6c202e20, 0x1cb95: 0x6c416c20, 0x1cb96: 0x6c6fac20, 0x1cb97: 0x6d20be20, - 0x1cb98: 0x6cb6d820, 0x1cb99: 0x6d20c020, 0x1cb9a: 0x6c170620, 0x1cb9b: 0x6c969020, - 0x1cb9c: 0x6c456420, 0x1cb9d: 0x6cf43020, 0x1cb9e: 0x6c3d4220, 0x1cb9f: 0x6cf18420, - 0x1cba0: 0x6c6bc620, 0x1cba1: 0x6d0b1a20, 0x1cba2: 0x6c0d2620, 0x1cba3: 0x6c0b8020, - 0x1cba4: 0x6c056220, 0x1cba5: 0x6d268820, 0x1cba6: 0x6c73f220, 0x1cba7: 0x6c9ac220, - 0x1cba8: 0x6c73f420, 0x1cba9: 0x6cecca20, 0x1cbaa: 0x6c646e20, 0x1cbab: 0x6c99da20, - 0x1cbac: 0x6c282420, 0x1cbad: 0x6cb20420, 0x1cbae: 0x6cef9620, 0x1cbaf: 0x6c585820, - 0x1cbb0: 0x6cfc8020, 0x1cbb1: 0x6cbaa820, 0x1cbb2: 0x6c8cbe20, 0x1cbb3: 0x6c274a20, - 0x1cbb4: 0x6d16fc20, 0x1cbb5: 0x6c016820, 0x1cbb6: 0x6cb28820, 0x1cbb7: 0x6c2d4620, - 0x1cbb8: 0x6c3e1620, 0x1cbb9: 0x6d080220, 0x1cbba: 0x6cf7da20, 0x1cbbb: 0x6c0e5820, - 0x1cbbc: 0x6c229420, 0x1cbbd: 0x6c467820, 0x1cbbe: 0x6c640620, 0x1cbbf: 0x6cce9e20, - // Block 0x72f, offset 0x1cbc0 - 0x1cbc0: 0x6cb37220, 0x1cbc1: 0x6c222220, 0x1cbc2: 0x6c77e420, 0x1cbc3: 0x6cc4bc20, - 0x1cbc4: 0x6cd0f420, 0x1cbc5: 0x6ccfbe20, 0x1cbc6: 0x6d14a820, 0x1cbc7: 0x6d411220, - 0x1cbc8: 0x6c633c20, 0x1cbc9: 0x6c9f3a20, 0x1cbca: 0x6cccd420, 0x1cbcb: 0x6c8efe20, - 0x1cbcc: 0x6c095020, 0x1cbcd: 0x6d312c20, 0x1cbce: 0x6d312e20, 0x1cbcf: 0x6c73fc20, - 0x1cbd0: 0x6c383820, 0x1cbd1: 0x6c8f7820, 0x1cbd2: 0x6c6c3e20, 0x1cbd3: 0x6c698e20, - 0x1cbd4: 0x6c667020, 0x1cbd5: 0x6c85d420, 0x1cbd6: 0x6c4a1e20, 0x1cbd7: 0x6cfa9220, - 0x1cbd8: 0x6d386820, 0x1cbd9: 0x6c45e420, 0x1cbda: 0x6d0be820, 0x1cbdb: 0x6d053420, - 0x1cbdc: 0x6d0fa420, 0x1cbdd: 0x6d063620, 0x1cbde: 0x6c95f620, 0x1cbdf: 0x6cda9020, - 0x1cbe0: 0x6d399420, 0x1cbe1: 0x6cbd6420, 0x1cbe2: 0x6d1a4a20, 0x1cbe3: 0x6d09fe20, - 0x1cbe4: 0x6c05f620, 0x1cbe5: 0x6c379220, 0x1cbe6: 0x6cfe2a20, 0x1cbe7: 0x6d10e420, - 0x1cbe8: 0x6cf9ac20, 0x1cbe9: 0x6c4f6620, 0x1cbea: 0x6c4a4a20, 0x1cbeb: 0x6c1cba20, - 0x1cbec: 0x6d06ac20, 0x1cbed: 0x6c047820, 0x1cbee: 0x6cae1620, 0x1cbef: 0x6c81f020, - 0x1cbf0: 0x6c28fa20, 0x1cbf1: 0x6d1d6420, 0x1cbf2: 0x6c5aa620, 0x1cbf3: 0x6cf19220, - 0x1cbf4: 0x6c355c20, 0x1cbf5: 0x6c19e820, 0x1cbf6: 0x6c2c4420, 0x1cbf7: 0x6cf44c20, - 0x1cbf8: 0x6cf3c420, 0x1cbf9: 0x6c19e020, 0x1cbfa: 0x6c75b220, 0x1cbfb: 0x6c99ee20, - 0x1cbfc: 0x6c071220, 0x1cbfd: 0x6ce6c220, 0x1cbfe: 0x6cfcb420, 0x1cbff: 0x6c1f3220, - // Block 0x730, offset 0x1cc00 - 0x1cc00: 0x6c4e0820, 0x1cc01: 0x6d081220, 0x1cc02: 0x6d0c8820, 0x1cc03: 0x6cc05020, - 0x1cc04: 0x6d088a20, 0x1cc05: 0x6c80be20, 0x1cc06: 0x6c851420, 0x1cc07: 0x6d053c20, - 0x1cc08: 0x6c3e5620, 0x1cc09: 0x6c8e5020, 0x1cc0a: 0x6d0b1e20, 0x1cc0b: 0x6cf5f820, - 0x1cc0c: 0x6c8cec20, 0x1cc0d: 0x6c83c420, 0x1cc0e: 0x6c6d0420, 0x1cc0f: 0x6c88b620, - 0x1cc10: 0x6cdd6020, 0x1cc11: 0x6cddd620, 0x1cc12: 0x6c3cfe20, 0x1cc13: 0x6cecd620, - 0x1cc14: 0x6c2d5a20, 0x1cc15: 0x6cb20c20, 0x1cc16: 0x6d2df020, 0x1cc17: 0x6ccb2c20, - 0x1cc18: 0x6c9f5620, 0x1cc19: 0x6d234820, 0x1cc1a: 0x6c709420, 0x1cc1b: 0x6c186820, - 0x1cc1c: 0x6c7f0a20, 0x1cc1d: 0x6cf19620, 0x1cc1e: 0x6cd16c20, 0x1cc1f: 0x6cef1420, - 0x1cc20: 0x6ce4f620, 0x1cc21: 0x6c1f4020, 0x1cc22: 0x6d423c20, 0x1cc23: 0x6c081e20, - 0x1cc24: 0x6c196020, 0x1cc25: 0x6c562220, 0x1cc26: 0x6cb5ea20, 0x1cc27: 0x6c365e20, - 0x1cc28: 0x6c7d6420, 0x1cc29: 0x6c167020, 0x1cc2a: 0x6cb5ec20, 0x1cc2b: 0x6c082020, - 0x1cc2c: 0x6ced2020, 0x1cc2d: 0x6c925620, 0x1cc2e: 0x6c239e20, 0x1cc2f: 0x6c495220, - 0x1cc30: 0x6d0d9020, 0x1cc31: 0x6c2dca20, 0x1cc32: 0x6c072620, 0x1cc33: 0x6c8bb620, - 0x1cc34: 0x6cbd7220, 0x1cc35: 0x6caff220, 0x1cc36: 0x6cabd620, 0x1cc37: 0x6cc3b820, - 0x1cc38: 0x6d3d6220, 0x1cc39: 0x6cbd7420, 0x1cc3a: 0x6c383c20, 0x1cc3b: 0x6c6d8020, - 0x1cc3c: 0x6cbf2a20, 0x1cc3d: 0x6c321a20, 0x1cc3e: 0x6c6bec20, 0x1cc3f: 0x6c5cf220, - // Block 0x731, offset 0x1cc40 - 0x1cc40: 0x6d226c20, 0x1cc41: 0x6c999820, 0x1cc42: 0x6c9a1020, 0x1cc43: 0x6c210e20, - 0x1cc44: 0x6d07aa20, 0x1cc45: 0x6ce34a20, 0x1cc46: 0x6d038020, 0x1cc47: 0x6c277a20, - 0x1cc48: 0x6cc75220, 0x1cc49: 0x6c9f6020, 0x1cc4a: 0x6c64b820, 0x1cc4b: 0x6cefe020, - 0x1cc4c: 0x6cc86620, 0x1cc4d: 0x6c593820, 0x1cc4e: 0x6d00be20, 0x1cc4f: 0x6c1fe820, - 0x1cc50: 0x6c65ae20, 0x1cc51: 0x6d3bce20, 0x1cc52: 0x6c171620, 0x1cc53: 0x6c890a20, - 0x1cc54: 0x6cc2fe20, 0x1cc55: 0x6cf9d420, 0x1cc56: 0x6c32ce20, 0x1cc57: 0x6d262220, - 0x1cc58: 0x6d0b2e20, 0x1cc59: 0x6ca50220, 0x1cc5a: 0x6c557220, 0x1cc5b: 0x6d1bbe20, - 0x1cc5c: 0x6d215e20, 0x1cc5d: 0x6c59d620, 0x1cc5e: 0x6cc8d420, 0x1cc5f: 0x6ccb3020, - 0x1cc60: 0x6c8e7c20, 0x1cc61: 0x6cd1de20, 0x1cc62: 0x6cc69e20, 0x1cc63: 0x6cdd8220, - 0x1cc64: 0x6d112620, 0x1cc65: 0x6cf15c20, 0x1cc66: 0x6cf45c20, 0x1cc67: 0x6d317e20, - 0x1cc68: 0x6c6d2a20, 0x1cc69: 0x6d1c8a20, 0x1cc6a: 0x6c969e20, 0x1cc6b: 0x6ce1dc20, - 0x1cc6c: 0x6c8e8220, 0x1cc6d: 0x6ce11820, 0x1cc6e: 0x6c864e20, 0x1cc6f: 0x6c80c420, - 0x1cc70: 0x6c4a7020, 0x1cc71: 0x6d325020, 0x1cc72: 0x6cbad020, 0x1cc73: 0x6c25be20, - 0x1cc74: 0x6c748020, 0x1cc75: 0x6d2f8e20, 0x1cc76: 0x6d112820, 0x1cc77: 0x6c00bc20, - 0x1cc78: 0x6c0d4620, 0x1cc79: 0x6cd4f620, 0x1cc7a: 0x6c16c020, 0x1cc7b: 0x6c7d8020, - 0x1cc7c: 0x6d3b8820, 0x1cc7d: 0x6c234020, 0x1cc7e: 0x6c6cb020, 0x1cc7f: 0x6d141620, - // Block 0x732, offset 0x1cc80 - 0x1cc80: 0x6c250020, 0x1cc81: 0x6c234220, 0x1cc82: 0x6cb63820, 0x1cc83: 0x6c841a20, - 0x1cc84: 0x6d1d0820, 0x1cc85: 0x6cdd8a20, 0x1cc86: 0x6cc08c20, 0x1cc87: 0x6d082020, - 0x1cc88: 0x6c026620, 0x1cc89: 0x6c88c420, 0x1cc8a: 0x6c9ad420, 0x1cc8b: 0x6d2eda20, - 0x1cc8c: 0x6d1a9620, 0x1cc8d: 0x6c57e220, 0x1cc8e: 0x6d1be620, 0x1cc8f: 0x6cf0ce20, - 0x1cc90: 0x6c92e620, 0x1cc91: 0x6cf3ec20, 0x1cc92: 0x6c2aac20, 0x1cc93: 0x6d054820, - 0x1cc94: 0x6d2b9420, 0x1cc95: 0x6d0a4220, 0x1cc96: 0x6cc1b420, 0x1cc97: 0x6c299420, - 0x1cc98: 0x6c8be020, 0x1cc99: 0x6c8a1c20, 0x1cc9a: 0x6cbf6220, 0x1cc9b: 0x6cdb3420, - 0x1cc9c: 0x6c59ec20, 0x1cc9d: 0x6c4a8c20, 0x1cc9e: 0x6cb45220, 0x1cc9f: 0x6c6e3220, - 0x1cca0: 0x6c38be20, 0x1cca1: 0x6c6d4220, 0x1cca2: 0x6c8e9820, 0x1cca3: 0x6c5f3620, - 0x1cca4: 0x6c5cae20, 0x1cca5: 0x6c6e3420, 0x1cca6: 0x6c00e220, 0x1cca7: 0x6c0a8e20, - 0x1cca8: 0x6c120e20, 0x1cca9: 0x6cc1d820, 0x1ccaa: 0x6d2a5820, 0x1ccab: 0x6c290c20, - 0x1ccac: 0x6c694c20, 0x1ccad: 0x6c4c0420, 0x1ccae: 0x6ce07e20, 0x1ccaf: 0x6c5c5420, - 0x1ccb0: 0x6c58a620, 0x1ccb1: 0x6ccb7020, 0x1ccb2: 0x6cdc7620, 0x1ccb3: 0x6ce4c620, - 0x1ccb4: 0x6c1f9a20, 0x1ccb5: 0x6d21b820, 0x1ccb6: 0x6c6d6820, 0x1ccb7: 0x6c917620, - 0x1ccb8: 0x6c0d6020, 0x1ccb9: 0x6cd54220, 0x1ccba: 0x6cf21820, 0x1ccbb: 0x6d41a220, - 0x1ccbc: 0x6c7fd020, 0x1ccbd: 0x6cf82020, 0x1ccbe: 0x6d3ea820, 0x1ccbf: 0x6d083020, - // Block 0x733, offset 0x1ccc0 - 0x1ccc0: 0x6cc88420, 0x1ccc1: 0x6cf31e20, 0x1ccc2: 0x6c415820, 0x1ccc3: 0x6c827220, - 0x1ccc4: 0x6c31da20, 0x1ccc5: 0x6c86fe20, 0x1ccc6: 0x6d374020, 0x1ccc7: 0x6cc76a20, - 0x1ccc8: 0x6c848e20, 0x1ccc9: 0x6d29ac20, 0x1ccca: 0x6cbf7620, 0x1cccb: 0x6ce43a20, - 0x1cccc: 0x6c4aa420, 0x1cccd: 0x6cdc0020, 0x1ccce: 0x6c7eb220, 0x1cccf: 0x6c8fe020, - 0x1ccd0: 0x6c918620, 0x1ccd1: 0x6c872620, 0x1ccd2: 0x6d29b220, 0x1ccd3: 0x6c808a20, - 0x1ccd4: 0x6d1c2e20, 0x1ccd5: 0x6c9cb420, 0x1ccd6: 0x6cfd9c20, 0x1ccd7: 0x6cbf8820, - 0x1ccd8: 0x6c49b820, 0x1ccd9: 0x6c2a5020, 0x1ccda: 0x6d29c020, 0x1ccdb: 0x6c58ce20, - 0x1ccdc: 0x6c483e20, 0x1ccdd: 0x6c0eba20, 0x1ccde: 0x6c2e8820, 0x1ccdf: 0x6c0ed820, - 0x1cce0: 0x6c568e20, 0x1cce1: 0x6d347620, 0x1cce2: 0x6cb18020, 0x1cce3: 0x6c050c20, - 0x1cce4: 0x6cc4f020, 0x1cce5: 0x6c87a220, 0x1cce6: 0x6cec0c20, - 0x1cce8: 0x6cfdaa20, 0x1cce9: 0x6cb8aa20, 0x1ccea: 0x6c04c020, 0x1cceb: 0x6cae3a20, - 0x1ccec: 0x6c39c820, 0x1cced: 0x6c282620, 0x1ccee: 0x6cf26c20, 0x1ccef: 0x6cab3420, - 0x1ccf2: 0x6cec4a20, 0x1ccf3: 0x6c552a20, - 0x1ccf4: 0x6c8cc020, 0x1ccf5: 0x6d14aa20, 0x1ccf6: 0x6cb29420, 0x1ccf7: 0x6c223820, - 0x1ccf8: 0x6c042020, 0x1ccf9: 0x6c72ea20, 0x1ccfa: 0x6c16a820, 0x1ccfb: 0x6c1aa820, - 0x1ccfd: 0x6c296820, 0x1ccfe: 0x6c9bd620, 0x1ccff: 0x6c109820, - // Block 0x734, offset 0x1cd00 - 0x1cd00: 0x6d3c8820, 0x1cd01: 0x6cb2aa20, 0x1cd02: 0x6c0afe20, 0x1cd03: 0x6d393220, - 0x1cd04: 0x6d316c20, 0x1cd06: 0x6c225020, 0x1cd07: 0x6d1bd220, - 0x1cd08: 0x6cb7b220, 0x1cd09: 0x6cfb7420, 0x1cd0a: 0x6c90f220, 0x1cd0b: 0x6c2c9220, - 0x1cd0c: 0x6cab5020, 0x1cd0d: 0x6c9b2e20, 0x1cd0e: 0x6d3b8a20, 0x1cd0f: 0x6c084e20, - 0x1cd10: 0x6c8c6420, 0x1cd11: 0x6d2bb020, 0x1cd12: 0x6cf47c20, 0x1cd13: 0x6cb0c220, - 0x1cd14: 0x6c280220, 0x1cd15: 0x6cf27420, 0x1cd16: 0x6d1c0820, 0x1cd17: 0x6d0e0420, - 0x1cd18: 0x6c415c20, 0x1cd19: 0x6c273420, 0x1cd1a: 0x6cd03820, 0x1cd1b: 0x6ce49a20, - 0x1cd1c: 0x6ce49c20, 0x1cd1d: 0x6c4e1c20, 0x1cd1e: 0x6c16b020, 0x1cd1f: 0x6cd0d220, - 0x1cd20: 0x6cbe6e20, 0x1cd21: 0x6ccfcc20, 0x1cd22: 0x6c15aa20, 0x1cd23: 0x6c15ac20, - 0x1cd24: 0x6cc89c20, 0x1cd25: 0x6cd10620, 0x1cd26: 0x6cda4c20, 0x1cd27: 0x6cd00820, - 0x1cd28: 0x6d1e6c20, 0x1cd29: 0x6cd66020, 0x1cd2a: 0x6c920e20, 0x1cd2b: 0x6c40a820, - 0x1cd2c: 0x6d1e1020, 0x1cd2d: 0x6c080e20, 0x1cd2e: 0x6c3cdc20, 0x1cd2f: 0x6ca90820, - 0x1cd30: 0x6ce47e20, 0x1cd31: 0x6d1ee020, 0x1cd32: 0x6c63fc20, 0x1cd33: 0x6ccf9a20, - 0x1cd34: 0x6d2c1820, 0x1cd35: 0x6c2d3220, 0x1cd36: 0x6c3dce20, 0x1cd37: 0x6ca3e220, - 0x1cd38: 0x6c2cbc20, 0x1cd39: 0x6cb24820, 0x1cd3a: 0x6ce62e20, 0x1cd3b: 0x6c578420, - 0x1cd3c: 0x6ce6b220, 0x1cd3d: 0x6d321a20, 0x1cd3e: 0x6d28f620, 0x1cd3f: 0x6c9b0820, - // Block 0x735, offset 0x1cd40 - 0x1cd40: 0x6c093c20, 0x1cd41: 0x6cb58620, 0x1cd42: 0x6c8f2620, 0x1cd43: 0x6d09de20, - 0x1cd44: 0x6c8e4420, 0x1cd45: 0x6c170820, 0x1cd46: 0x6ca23220, 0x1cd47: 0x6d278a20, - 0x1cd48: 0x6c393620, 0x1cd49: 0x6c3e1820, 0x1cd4a: 0x6c44bc20, 0x1cd4b: 0x6ce48e20, - 0x1cd4c: 0x6c6bca20, 0x1cd4d: 0x6c6bcc20, 0x1cd4e: 0x6cc35220, 0x1cd4f: 0x6cf07c20, - 0x1cd50: 0x6c3e1a20, 0x1cd51: 0x6ce49020, 0x1cd52: 0x6ca23420, 0x1cd53: 0x6c341e20, - 0x1cd54: 0x6cacb020, 0x1cd55: 0x6c675620, 0x1cd56: 0x6cebd220, 0x1cd57: 0x6c269020, - 0x1cd58: 0x6ca3f020, 0x1cd59: 0x6c8e4c20, 0x1cd5a: 0x6c079a20, 0x1cd5b: 0x6d31c820, - 0x1cd5c: 0x6c1f2820, 0x1cd5d: 0x6ca23820, 0x1cd5e: 0x6ca23a20, 0x1cd5f: 0x6c12d820, - 0x1cd60: 0x6ce49620, 0x1cd61: 0x6c40f220, 0x1cd62: 0x6c096420, 0x1cd63: 0x6c269a20, - 0x1cd64: 0x6d35ea20, 0x1cd65: 0x6c361220, 0x1cd66: 0x6cb5ce20, 0x1cd67: 0x6c94a020, - 0x1cd68: 0x6cac3e20, 0x1cd69: 0x6d199020, 0x1cd6a: 0x6c384e20, 0x1cd6b: 0x6c579820, - 0x1cd6c: 0x6ccef220, 0x1cd6d: 0x6d212e20, 0x1cd6e: 0x6ca24220, 0x1cd6f: 0x6c75be20, - 0x1cd70: 0x6d176620, 0x1cd71: 0x6c8e5820, 0x1cd72: 0x6ccef420, 0x1cd73: 0x6c2eac20, - 0x1cd74: 0x6c1db020, 0x1cd75: 0x6c579e20, 0x1cd76: 0x6c290020, 0x1cd77: 0x6d3c9020, - 0x1cd78: 0x6c5eea20, 0x1cd79: 0x6ced2a20, 0x1cd7a: 0x6c676620, 0x1cd7b: 0x6c1a2620, - 0x1cd7c: 0x6c171e20, 0x1cd7d: 0x6cea8020, 0x1cd7e: 0x6c825220, 0x1cd7f: 0x6c5f1620, - // Block 0x736, offset 0x1cd80 - 0x1cd80: 0x6c13b020, 0x1cd81: 0x6c8e9a20, 0x1cd82: 0x6c2f3c20, 0x1cd83: 0x6ce98220, - 0x1cd84: 0x6c8c6c20, 0x1cd85: 0x6c678c20, 0x1cd86: 0x6c679020, 0x1cd87: 0x6c1e0020, - 0x1cd88: 0x6cb0d620, 0x1cd89: 0x6c2f0620, 0x1cd8a: 0x6c2f1020, 0x1cd8b: 0x6cb04420, - 0x1cd8c: 0x6c6a8220, 0x1cd8d: 0x6c287220, 0x1cd8e: 0x6cd4da20, 0x1cd8f: 0x6cd4dc20, - 0x1cd90: 0x6d369220, 0x1cd91: 0x6d153420, 0x1cd92: 0x6ca54020, 0x1cd93: 0x6ca39420, - 0x1cd94: 0x6c2f4e20, 0x1cd95: 0x6c08be20, 0x1cd96: 0x6c69f620, 0x1cd97: 0x6c89da20, - 0x1cd98: 0x6c426220, 0x1cd99: 0x6c437620, 0x1cd9a: 0x6c6fd620, 0x1cd9b: 0x6d38da20, - 0x1cd9c: 0x6cfa3020, 0x1cd9d: 0x6ccd7220, 0x1cd9e: 0x6d057220, 0x1cd9f: 0x6caa9e20, - 0x1cda0: 0x6c859220, 0x1cda1: 0x6d0f8a20, 0x1cda2: 0x6c192020, 0x1cda3: 0x6d1f0c20, - 0x1cda4: 0x6c033220, 0x1cda5: 0x6c6bce20, 0x1cda6: 0x6c73fe20, 0x1cda7: 0x6cb59620, - 0x1cda8: 0x6cf95620, 0x1cda9: 0x6c251e20, 0x1cdaa: 0x6c095220, 0x1cdab: 0x6d16fe20, - 0x1cdac: 0x6c85aa20, 0x1cdad: 0x6d401a20, 0x1cdae: 0x6c204e20, 0x1cdaf: 0x6c3c2620, - 0x1cdb0: 0x6d3ad220, 0x1cdb1: 0x6cad8620, 0x1cdb2: 0x6cafd020, 0x1cdb3: 0x6c418a20, - 0x1cdb4: 0x6c77ee20, 0x1cdb5: 0x6c21fa20, 0x1cdb6: 0x6d08de20, 0x1cdb7: 0x6d33c620, - 0x1cdb8: 0x6c283020, 0x1cdb9: 0x6d31ca20, 0x1cdba: 0x6c380220, 0x1cdbb: 0x6d350e20, - 0x1cdbc: 0x6ce29c20, 0x1cdbd: 0x6c706a20, 0x1cdbe: 0x6c600220, 0x1cdbf: 0x6c3a9a20, - // Block 0x737, offset 0x1cdc0 - 0x1cdc0: 0x6c706c20, 0x1cdc1: 0x6cccda20, 0x1cdc2: 0x6c634420, 0x1cdc3: 0x6d080820, - 0x1cdc4: 0x6d2cbc20, 0x1cdc5: 0x6c0e1420, 0x1cdc6: 0x6ca80a20, 0x1cdc7: 0x6d334620, - 0x1cdc8: 0x6d1d8020, 0x1cdc9: 0x6c6e6820, 0x1cdca: 0x6cc2e020, 0x1cdcb: 0x6ce29e20, - 0x1cdcc: 0x6ce6f420, 0x1cdcd: 0x6d14e620, 0x1cdce: 0x6c6a0020, 0x1cdcf: 0x6cefb020, - 0x1cdd0: 0x6c5b3620, 0x1cdd1: 0x6cdfa220, 0x1cdd2: 0x6d101220, 0x1cdd3: 0x6c1c1220, - 0x1cdd4: 0x6d35ec20, 0x1cdd5: 0x6c523220, 0x1cdd6: 0x6d0b5220, 0x1cdd7: 0x6c9a9220, - 0x1cdd8: 0x6c311a20, 0x1cdd9: 0x6c6e8620, 0x1cdda: 0x6cfec020, 0x1cddb: 0x6ce7c820, - 0x1cddc: 0x6ce86220, 0x1cddd: 0x6c986020, 0x1cdde: 0x6cb05e20, 0x1cddf: 0x6cfec220, - 0x1cde0: 0x6cdb8020, 0x1cde1: 0x6c3d7020, 0x1cde2: 0x6c861220, 0x1cde3: 0x6d363420, - 0x1cde4: 0x6c25de20, 0x1cde5: 0x6c345220, 0x1cde6: 0x6cf4ee20, 0x1cde7: 0x6ccbf420, - 0x1cde8: 0x6c815a20, 0x1cde9: 0x6cd46a20, 0x1cdea: 0x6c592620, 0x1cdeb: 0x6cfb5e20, - 0x1cdec: 0x6d17ee20, 0x1cded: 0x6c07f820, 0x1cdee: 0x6d2f3420, 0x1cdef: 0x6c495620, - 0x1cdf0: 0x6cdfec20, 0x1cdf1: 0x6c3ab820, 0x1cdf2: 0x6c966a20, 0x1cdf3: 0x6c8bba20, - 0x1cdf4: 0x6c1abc20, 0x1cdf5: 0x6c621a20, 0x1cdf6: 0x6ce50220, 0x1cdf7: 0x6c013820, - 0x1cdf8: 0x6c1c3220, 0x1cdf9: 0x6c09d020, 0x1cdfa: 0x6c09d220, 0x1cdfb: 0x6c9f6220, - 0x1cdfc: 0x6c481a20, 0x1cdfd: 0x6c330820, 0x1cdfe: 0x6c354220, 0x1cdff: 0x6cefe220, - // Block 0x738, offset 0x1ce00 - 0x1ce00: 0x6d209220, 0x1ce01: 0x6c254420, 0x1ce02: 0x6d0b5620, 0x1ce03: 0x6d3a1620, - 0x1ce04: 0x6c244020, 0x1ce05: 0x6c27e620, 0x1ce06: 0x6cd0b020, 0x1ce07: 0x6d380220, - 0x1ce08: 0x6c1c4620, 0x1ce09: 0x6d239420, 0x1ce0a: 0x6c541c20, 0x1ce0b: 0x6c3c5c20, - 0x1ce0c: 0x6c7e8420, 0x1ce0d: 0x6d0fd220, 0x1ce0e: 0x6c18de20, 0x1ce0f: 0x6ce8c420, - 0x1ce10: 0x6d226e20, 0x1ce11: 0x6c4c2820, 0x1ce12: 0x6cf19e20, 0x1ce13: 0x6c594420, - 0x1ce14: 0x6c7aa220, 0x1ce15: 0x6c642820, 0x1ce16: 0x6d19f620, 0x1ce17: 0x6d182c20, - 0x1ce18: 0x6c911020, 0x1ce19: 0x6ccaf820, 0x1ce1a: 0x6c749a20, 0x1ce1b: 0x6c1c5a20, - 0x1ce1c: 0x6cf6a620, 0x1ce1d: 0x6c492220, 0x1ce1e: 0x6d185c20, 0x1ce1f: 0x6cf16020, - 0x1ce20: 0x6c608c20, 0x1ce21: 0x6c205c20, 0x1ce22: 0x6c049220, 0x1ce23: 0x6c5bfe20, - 0x1ce24: 0x6c8e8420, 0x1ce25: 0x6c149c20, 0x1ce26: 0x6cd47220, 0x1ce27: 0x6caaaa20, - 0x1ce28: 0x6c2cd820, 0x1ce29: 0x6c26fc20, 0x1ce2a: 0x6c0d0e20, 0x1ce2b: 0x6cdfb820, - 0x1ce2c: 0x6d2f4020, 0x1ce2d: 0x6c0c1c20, 0x1ce2e: 0x6cd0c620, 0x1ce2f: 0x6c246220, - 0x1ce30: 0x6c95c020, 0x1ce31: 0x6d18a420, 0x1ce32: 0x6d403220, 0x1ce33: 0x6c1d7c20, - 0x1ce34: 0x6d2f4220, 0x1ce35: 0x6d2d4a20, 0x1ce36: 0x6cda4220, 0x1ce37: 0x6ccb5e20, - 0x1ce38: 0x6cc39c20, 0x1ce39: 0x6c2e3c20, 0x1ce3a: 0x6c911a20, 0x1ce3b: 0x6c911c20, - 0x1ce3c: 0x6ca15220, 0x1ce3d: 0x6cbda620, 0x1ce3e: 0x6d1b0820, 0x1ce3f: 0x6d1d0a20, - // Block 0x739, offset 0x1ce40 - 0x1ce40: 0x6c59fa20, 0x1ce41: 0x6c3f0820, 0x1ce42: 0x6c8a2620, 0x1ce43: 0x6c8fac20, - 0x1ce44: 0x6cbbfe20, 0x1ce45: 0x6c8ea820, 0x1ce46: 0x6c817a20, 0x1ce47: 0x6cfba820, - 0x1ce48: 0x6c3ad620, 0x1ce49: 0x6c280420, 0x1ce4a: 0x6d1b7420, 0x1ce4b: 0x6c51f020, - 0x1ce4c: 0x6c005420, 0x1ce4d: 0x6c04a620, 0x1ce4e: 0x6cfbaa20, 0x1ce4f: 0x6c492a20, - 0x1ce50: 0x6c4b8c20, 0x1ce51: 0x6ca9f620, 0x1ce52: 0x6d242e20, 0x1ce53: 0x6cef4a20, - 0x1ce54: 0x6d18e820, 0x1ce55: 0x6d1dc620, 0x1ce56: 0x6cb07820, 0x1ce57: 0x6c82ee20, - 0x1ce58: 0x6c86a820, 0x1ce59: 0x6cd57820, 0x1ce5a: 0x6c28d820, 0x1ce5b: 0x6c8c3c20, - 0x1ce5c: 0x6c2d8c20, 0x1ce5d: 0x6c8c3e20, 0x1ce5e: 0x6c7f6420, 0x1ce5f: 0x6c0d1020, - 0x1ce60: 0x6c62ba20, 0x1ce61: 0x6c1ae820, 0x1ce62: 0x6d103820, 0x1ce63: 0x6d086220, - 0x1ce64: 0x6c6a3820, 0x1ce65: 0x6d330e20, 0x1ce66: 0x6c99cc20, 0x1ce67: 0x6c874420, - 0x1ce68: 0x6c5e4820, 0x1ce69: 0x6c7f7820, 0x1ce6a: 0x6c631420, 0x1ce6b: 0x6c2cf220, - 0x1ce6c: 0x6d086620, 0x1ce6d: 0x6d1d2e20, 0x1ce6e: 0x6d1b2820, 0x1ce6f: 0x6cc21420, - 0x1ce70: 0x6d1dea20, 0x1ce71: 0x6cdfc820, 0x1ce72: 0x6c2cfe20, 0x1ce73: 0x6c95da20, - 0x1ce74: 0x6c947c20, 0x1ce75: 0x6c948420, 0x1ce76: 0x6c0e4620, 0x1ce77: 0x6c0e5420, - 0x1ce78: 0x6c4ada20, 0x1ce79: 0x6c037020, 0x1ce7a: 0x6c37e620, 0x1ce7b: 0x6c2a9c20, - 0x1ce7c: 0x6c37ec20, 0x1ce7d: 0x6c040820, 0x1ce7e: 0x6c041620, 0x1ce7f: 0x6cbc8020, - // Block 0x73a, offset 0x1ce80 - 0x1ce80: 0x6c5fd620, 0x1ce81: 0x6d2a6820, 0x1ce82: 0x6d2a6a20, 0x1ce83: 0x6c994420, - 0x1ce84: 0x6c2a8c20, 0x1ce85: 0x6cabb820, 0x1ce86: 0x6c69f820, 0x1ce87: 0x6c59ac20, - 0x1ce88: 0x6c4a3e20, 0x1ce89: 0x6c229620, 0x1ce8a: 0x6c8ccc20, 0x1ce8b: 0x6c42b620, - 0x1ce8c: 0x6ca0f020, 0x1ce8d: 0x6c5ffa20, 0x1ce8e: 0x6c68e420, 0x1ce8f: 0x6caf0620, - 0x1ce90: 0x6c42be20, 0x1ce91: 0x6c004020, 0x1ce92: 0x6c356620, 0x1ce93: 0x6c503e20, - 0x1ce94: 0x6c4ec420, 0x1ce95: 0x6c09a420, 0x1ce96: 0x6ced2220, 0x1ce97: 0x6c1dbc20, - 0x1ce98: 0x6cba5c20, 0x1ce99: 0x6cf65220, 0x1ce9a: 0x6c005020, 0x1ce9b: 0x6cffb820, - 0x1ce9c: 0x6c505c20, 0x1ce9d: 0x6c5a7820, 0x1ce9e: 0x6c505e20, 0x1ce9f: 0x6d2b0220, - 0x1cea0: 0x6c251020, 0x1cea1: 0x6c506c20, 0x1cea2: 0x6cffc220, 0x1cea3: 0x6d132820, - 0x1cea4: 0x6cb33820, 0x1cea5: 0x6c507220, 0x1cea6: 0x6c695220, 0x1cea7: 0x6c00f220, - 0x1cea8: 0x6d03ae20, 0x1cea9: 0x6c5a8020, 0x1ceaa: 0x6c872820, 0x1ceab: 0x6cb1a620, - 0x1ceac: 0x6c51a220, 0x1cead: 0x6c69e220, 0x1ceae: 0x6cafa820, 0x1ceaf: 0x6c41ca20, - 0x1ceb0: 0x6cad8820, 0x1ceb1: 0x6d391c20, 0x1ceb2: 0x6c756e20, 0x1ceb3: 0x6cc06620, - 0x1ceb4: 0x6c259420, 0x1ceb5: 0x6cc3ce20, 0x1ceb6: 0x6d2bee20, 0x1ceb7: 0x6c47b420, - 0x1ceb8: 0x6c757620, 0x1ceb9: 0x6c757820, 0x1ceba: 0x6d394420, 0x1cebb: 0x6d2bfe20, - 0x1cebc: 0x6c47d820, 0x1cebd: 0x6d2f7c20, 0x1cebe: 0x6c31e020, 0x1cebf: 0x6c9f8a20, - // Block 0x73b, offset 0x1cec0 - 0x1cec0: 0x6cb6da20, 0x1cec1: 0x6d1c5620, 0x1cec2: 0x6d20c620, 0x1cec3: 0x6c069220, - 0x1cec4: 0x6d2f5e20, 0x1cec5: 0x6d37a820, 0x1cec6: 0x6cae3c20, 0x1cec7: 0x6c50de20, - 0x1cec8: 0x6d1c5c20, 0x1cec9: 0x6c50f420, 0x1ceca: 0x6d173820, 0x1cecb: 0x6c0e6020, - 0x1cecc: 0x6cecfc20, 0x1cecd: 0x6c50f620, 0x1cece: 0x6c021620, 0x1cecf: 0x6d2de220, - 0x1ced0: 0x6d0c8020, 0x1ced1: 0x6c647e20, 0x1ced2: 0x6c510e20, 0x1ced3: 0x6d208820, - 0x1ced4: 0x6c7c3a20, 0x1ced5: 0x6c394620, 0x1ced6: 0x6c413220, 0x1ced7: 0x6c2a1220, - 0x1ced8: 0x6cac5620, 0x1ced9: 0x6c3f6620, 0x1ceda: 0x6cc06820, 0x1cedb: 0x6cd15e20, - 0x1cedc: 0x6c2a1620, 0x1cedd: 0x6c926a20, 0x1cede: 0x6d2df820, 0x1cedf: 0x6c9b2220, - 0x1cee0: 0x6c841c20, 0x1cee1: 0x6c6ca220, 0x1cee2: 0x6d071220, 0x1cee3: 0x6c64ca20, - 0x1cee4: 0x6cac6a20, 0x1cee5: 0x6c49a620, 0x1cee6: 0x6c014e20, 0x1cee7: 0x6c915c20, - 0x1cee8: 0x6d065e20, 0x1cee9: 0x6d38b420, 0x1ceea: 0x6c299620, 0x1ceeb: 0x6c015620, - 0x1ceec: 0x6c47e420, 0x1ceed: 0x6c872a20, 0x1ceee: 0x6ca26420, 0x1ceef: 0x6c2f5020, - 0x1cef0: 0x6c421020, 0x1cef1: 0x6d057420, 0x1cef2: 0x6c983a20, 0x1cef3: 0x6cee4e20, - 0x1cef4: 0x6d344020, 0x1cef5: 0x6cb74a20, 0x1cef6: 0x6d25e020, 0x1cef7: 0x6ce49220, - 0x1cef8: 0x6cfd6420, 0x1cef9: 0x6c33ca20, 0x1cefa: 0x6d02ba20, 0x1cefb: 0x6cf86620, - 0x1cefc: 0x6cacae20, 0x1cefd: 0x6c3c2820, 0x1cefe: 0x6c33de20, 0x1ceff: 0x6c9f3c20, - // Block 0x73c, offset 0x1cf00 - 0x1cf00: 0x6c9fee20, 0x1cf01: 0x6cd12c20, 0x1cf02: 0x6cd34420, 0x1cf03: 0x6d278c20, - 0x1cf04: 0x6c9e0e20, 0x1cf05: 0x6cac3a20, 0x1cf06: 0x6c39cc20, 0x1cf07: 0x6c9e8a20, - 0x1cf08: 0x6c27c220, 0x1cf09: 0x6c99e020, 0x1cf0a: 0x6c995820, 0x1cf0b: 0x6c770420, - 0x1cf0c: 0x6cfc9020, 0x1cf0d: 0x6c79ba20, 0x1cf0e: 0x6cd35620, 0x1cf0f: 0x6d0f5420, - 0x1cf10: 0x6d32a220, 0x1cf11: 0x6d119c20, 0x1cf12: 0x6ccfce20, 0x1cf13: 0x6c5dae20, - 0x1cf14: 0x6c26ec20, 0x1cf15: 0x6d31cc20, 0x1cf16: 0x6c7bee20, 0x1cf17: 0x6c706e20, - 0x1cf18: 0x6cd09a20, 0x1cf19: 0x6d14d020, 0x1cf1a: 0x6cd12e20, 0x1cf1b: 0x6c9a8a20, - 0x1cf1c: 0x6ca0f420, 0x1cf1d: 0x6d3ad620, 0x1cf1e: 0x6d313c20, 0x1cf1f: 0x6d313e20, - 0x1cf20: 0x6c9dbc20, 0x1cf21: 0x6cd35820, 0x1cf22: 0x6d24d620, 0x1cf23: 0x6c2e8a20, - 0x1cf24: 0x6ca69020, 0x1cf25: 0x6d3f4620, 0x1cf26: 0x6d3f4820, 0x1cf27: 0x6c179620, - 0x1cf28: 0x6d2c7620, 0x1cf29: 0x6d087e20, 0x1cf2a: 0x6c0dda20, 0x1cf2b: 0x6c9cea20, - 0x1cf2c: 0x6c8f7e20, 0x1cf2d: 0x6cdbc220, 0x1cf2e: 0x6ce73e20, 0x1cf2f: 0x6c9c3020, - 0x1cf30: 0x6c2f3620, 0x1cf31: 0x6c2c4620, 0x1cf32: 0x6ca54c20, 0x1cf33: 0x6c9ff820, - 0x1cf34: 0x6d088c20, 0x1cf35: 0x6c1aaa20, 0x1cf36: 0x6c7bf420, 0x1cf37: 0x6c735a20, - 0x1cf38: 0x6ca1ce20, 0x1cf39: 0x6d323a20, 0x1cf3a: 0x6ce5d220, 0x1cf3b: 0x6d0fac20, - 0x1cf3c: 0x6d0d6c20, 0x1cf3d: 0x6ca10620, 0x1cf3e: 0x6d382620, 0x1cf3f: 0x6ca0f620, - // Block 0x73d, offset 0x1cf40 - 0x1cf40: 0x6d311220, 0x1cf41: 0x6d32b620, 0x1cf42: 0x6c9a0220, 0x1cf43: 0x6cdd1e20, - 0x1cf44: 0x6cceda20, 0x1cf45: 0x6c4ec820, 0x1cf46: 0x6c592820, 0x1cf47: 0x6c2c5c20, - 0x1cf48: 0x6c1a7620, 0x1cf49: 0x6c25e020, 0x1cf4a: 0x6c736420, 0x1cf4b: 0x6c356820, - 0x1cf4c: 0x6c97bc20, 0x1cf4d: 0x6cfcc420, 0x1cf4e: 0x6cf61e20, 0x1cf4f: 0x6c7dd420, - 0x1cf50: 0x6c7f4820, 0x1cf51: 0x6c659820, 0x1cf52: 0x6ccd4e20, 0x1cf53: 0x6ce50420, - 0x1cf54: 0x6c4bfc20, 0x1cf55: 0x6ced2c20, 0x1cf56: 0x6c839820, 0x1cf57: 0x6cd39c20, - 0x1cf58: 0x6cbf4020, 0x1cf59: 0x6c8b1820, 0x1cf5a: 0x6d0b3020, 0x1cf5b: 0x6c6ec820, - 0x1cf5c: 0x6d32d420, 0x1cf5d: 0x6c83ea20, 0x1cf5e: 0x6c7f4a20, 0x1cf5f: 0x6cdc4c20, - 0x1cf60: 0x6c737420, 0x1cf61: 0x6cd72820, 0x1cf62: 0x6cdbca20, 0x1cf63: 0x6c317420, - 0x1cf64: 0x6c09d420, 0x1cf65: 0x6cb0a620, 0x1cf66: 0x6ca29c20, 0x1cf67: 0x6c5cd420, - 0x1cf68: 0x6ca6ae20, 0x1cf69: 0x6c926c20, 0x1cf6a: 0x6d17f220, 0x1cf6b: 0x6c6aec20, - 0x1cf6c: 0x6c113620, 0x1cf6d: 0x6d38ea20, 0x1cf6e: 0x6d217220, 0x1cf6f: 0x6c5cd620, - 0x1cf70: 0x6c96c620, 0x1cf71: 0x6cfa4420, 0x1cf72: 0x6d040420, 0x1cf73: 0x6c5ada20, - 0x1cf74: 0x6c4c0220, 0x1cf75: 0x6d290a20, 0x1cf76: 0x6c218620, 0x1cf77: 0x6c64ba20, - 0x1cf78: 0x6c9a9e20, 0x1cf79: 0x6c322620, 0x1cf7a: 0x6c541e20, 0x1cf7b: 0x6d07b420, - 0x1cf7c: 0x6ce53c20, 0x1cf7d: 0x6c7c9220, 0x1cf7e: 0x6c42ce20, 0x1cf7f: 0x6cc8da20, - // Block 0x73e, offset 0x1cf80 - 0x1cf80: 0x6c99a020, 0x1cf81: 0x6d071420, 0x1cf82: 0x6c381e20, 0x1cf83: 0x6cf30820, - 0x1cf84: 0x6c9e7820, 0x1cf85: 0x6c1e2e20, 0x1cf86: 0x6c7d0620, 0x1cf87: 0x6c9c3220, - 0x1cf88: 0x6cf25e20, 0x1cf89: 0x6c7a0020, 0x1cf8a: 0x6c298420, 0x1cf8b: 0x6c188220, - 0x1cf8c: 0x6c782420, 0x1cf8d: 0x6cda2420, 0x1cf8e: 0x6cf97620, 0x1cf8f: 0x6cbf5020, - 0x1cf90: 0x6ca15420, 0x1cf91: 0x6ca01620, 0x1cf92: 0x6c977220, 0x1cf93: 0x6cd72c20, - 0x1cf94: 0x6d2b0420, 0x1cf95: 0x6d2f4420, 0x1cf96: 0x6d18a620, 0x1cf97: 0x6c2dde20, - 0x1cf98: 0x6c79c420, 0x1cf99: 0x6ca15620, 0x1cf9a: 0x6cd75c20, 0x1cf9b: 0x6c235620, - 0x1cf9c: 0x6c907820, 0x1cf9d: 0x6c1ad020, 0x1cf9e: 0x6c977820, 0x1cf9f: 0x6cb19a20, - 0x1cfa0: 0x6c199420, 0x1cfa1: 0x6c4b1a20, 0x1cfa2: 0x6c9b3a20, 0x1cfa3: 0x6c596c20, - 0x1cfa4: 0x6cc8f220, 0x1cfa5: 0x6cb1d420, 0x1cfa6: 0x6cf6f020, 0x1cfa7: 0x6cbc0220, - 0x1cfa8: 0x6cb45a20, 0x1cfa9: 0x6d3a8420, 0x1cfaa: 0x6c2aea20, 0x1cfab: 0x6cd07e20, - 0x1cfac: 0x6cd76020, 0x1cfad: 0x6c8a7c20, 0x1cfae: 0x6c185020, 0x1cfaf: 0x6cfbac20, - 0x1cfb0: 0x6c771220, 0x1cfb1: 0x6d132a20, 0x1cfb2: 0x6d074820, 0x1cfb3: 0x6ce79220, - 0x1cfb4: 0x6ca1ea20, 0x1cfb5: 0x6c8be620, 0x1cfb6: 0x6c4b7e20, 0x1cfb7: 0x6c66e020, - 0x1cfb8: 0x6d136420, 0x1cfb9: 0x6c00f420, 0x1cfba: 0x6c5c6a20, 0x1cfbb: 0x6d2dac20, - 0x1cfbc: 0x6c65f220, 0x1cfbd: 0x6c47e620, 0x1cfbe: 0x6d2fea20, 0x1cfbf: 0x6cc1e420, - // Block 0x73f, offset 0x1cfc0 - 0x1cfc0: 0x6c9a3420, 0x1cfc1: 0x6c1e3620, 0x1cfc2: 0x6ccb0620, 0x1cfc3: 0x6ca94c20, - 0x1cfc4: 0x6d09c020, 0x1cfc5: 0x6d123e20, 0x1cfc6: 0x6c5e1820, 0x1cfc7: 0x6c9b7020, - 0x1cfc8: 0x6c9de620, 0x1cfc9: 0x6cb22020, 0x1cfca: 0x6c9de820, 0x1cfcb: 0x6c870220, - 0x1cfcc: 0x6c7c1420, 0x1cfcd: 0x6c750020, 0x1cfce: 0x6d07e220, 0x1cfcf: 0x6c9dee20, - 0x1cfd0: 0x6c5e4a20, 0x1cfd1: 0x6c919220, 0x1cfd2: 0x6c9b8e20, 0x1cfd3: 0x6c8fe420, - 0x1cfd4: 0x6c49bc20, 0x1cfd5: 0x6c97d620, 0x1cfd6: 0x6cf82e20, 0x1cfd7: 0x6c1f9020, - 0x1cfd8: 0x6ce19620, 0x1cfd9: 0x6c771c20, 0x1cfda: 0x6d3a9620, 0x1cfdb: 0x6c98c220, - 0x1cfdc: 0x6c6c3220, 0x1cfdd: 0x6c8ba620, 0x1cfde: 0x6d234a20, 0x1cfdf: 0x6cd78420, - 0x1cfe0: 0x6d2ad220, 0x1cfe1: 0x6c752c20, 0x1cfe2: 0x6cd2a820, 0x1cfe3: 0x6d15c020, - 0x1cfe4: 0x6cd04820, 0x1cfe5: 0x6d339c20, 0x1cfe6: 0x6c53f020, 0x1cfe7: 0x6cd04e20, - 0x1cfe8: 0x6d1ce020, 0x1cfe9: 0x6c72d420, 0x1cfea: 0x6d387820, 0x1cfeb: 0x6c68e820, - 0x1cfec: 0x6c25e220, 0x1cfed: 0x6c32ae20, 0x1cfee: 0x6c006820, 0x1cfef: 0x6c695020, - 0x1cff0: 0x6d2b9820, 0x1cff1: 0x6d265c20, 0x1cff2: 0x6c03ce20, 0x1cff3: 0x6cd22c20, - 0x1cff4: 0x6c2f9420, 0x1cff5: 0x6cb73a20, 0x1cff6: 0x6c5e8620, 0x1cff7: 0x6d3eee20, - 0x1cff8: 0x6c417c20, 0x1cff9: 0x6cf4ba20, 0x1cffa: 0x6d302020, 0x1cffb: 0x6c7a2a20, - 0x1cffc: 0x6c426420, 0x1cffd: 0x6cf84c20, 0x1cffe: 0x6c388820, 0x1cfff: 0x6c7be620, - // Block 0x740, offset 0x1d000 - 0x1d000: 0x6c295820, 0x1d001: 0x6c969220, 0x1d002: 0x6ccbd220, 0x1d003: 0x6c27c420, - 0x1d004: 0x6c740220, 0x1d005: 0x6c85ac20, 0x1d006: 0x6c3d4e20, 0x1d007: 0x6c9f3e20, - 0x1d008: 0x6c35b020, 0x1d009: 0x6c5da620, 0x1d00a: 0x6c772820, 0x1d00b: 0x6d350620, - 0x1d00c: 0x6cb75c20, 0x1d00d: 0x6c76c420, 0x1d00e: 0x6c6bd020, 0x1d00f: 0x6c0d2a20, - 0x1d010: 0x6c35e020, 0x1d011: 0x6d0b8820, 0x1d012: 0x6caf4e20, 0x1d013: 0x6d302420, - 0x1d014: 0x6d0c7820, 0x1d015: 0x6cdc2a20, 0x1d016: 0x6d3b7820, 0x1d017: 0x6c17d220, - 0x1d018: 0x6c33e020, 0x1d019: 0x6cac3c20, 0x1d01a: 0x6d0e4a20, 0x1d01b: 0x6c6d7e20, - 0x1d01c: 0x6c3c2a20, 0x1d01d: 0x6c381020, 0x1d01e: 0x6ca0f820, 0x1d01f: 0x6d2c7820, - 0x1d020: 0x6c707020, 0x1d021: 0x6d22f620, 0x1d022: 0x6c77f020, 0x1d023: 0x6ceb0a20, - 0x1d024: 0x6ceb0c20, 0x1d025: 0x6c2bec20, 0x1d026: 0x6d2d3c20, 0x1d027: 0x6d314220, - 0x1d028: 0x6c35fc20, 0x1d029: 0x6c3e3820, 0x1d02a: 0x6ca23e20, 0x1d02b: 0x6d3ad820, - 0x1d02c: 0x6c7e5c20, 0x1d02d: 0x6c0aee20, 0x1d02e: 0x6caa5620, 0x1d02f: 0x6cb25220, - 0x1d030: 0x6cae6020, 0x1d031: 0x6c8cce20, 0x1d032: 0x6cad8a20, 0x1d033: 0x6c821e20, - 0x1d034: 0x6cb37c20, 0x1d035: 0x6c0e6220, 0x1d036: 0x6cb37e20, 0x1d037: 0x6ccfd020, - 0x1d038: 0x6d28b020, 0x1d039: 0x6c009820, 0x1d03a: 0x6c85d620, 0x1d03b: 0x6c8f8020, - 0x1d03c: 0x6ce73a20, 0x1d03d: 0x6d1e8420, 0x1d03e: 0x6c85d820, 0x1d03f: 0x6c7c2a20, - // Block 0x741, offset 0x1d040 - 0x1d040: 0x6c1ed820, 0x1d041: 0x6c793620, 0x1d042: 0x6cc2e420, 0x1d043: 0x6d399c20, - 0x1d044: 0x6c7b9c20, 0x1d045: 0x6c4a5a20, 0x1d046: 0x6c361420, 0x1d047: 0x6ca4a620, - 0x1d048: 0x6cb86420, 0x1d049: 0x6c924420, 0x1d04a: 0x6cefb220, 0x1d04b: 0x6c009a20, - 0x1d04c: 0x6c448420, 0x1d04d: 0x6cfcb620, 0x1d04e: 0x6d03e220, 0x1d04f: 0x6d0c8a20, - 0x1d050: 0x6c307420, 0x1d051: 0x6cae6c20, 0x1d052: 0x6cf5fc20, 0x1d053: 0x6c81f220, - 0x1d054: 0x6c533c20, 0x1d055: 0x6cd78020, 0x1d056: 0x6cf9b020, 0x1d057: 0x6cbb7020, - 0x1d058: 0x6cbeea20, 0x1d059: 0x6cef0220, 0x1d05a: 0x6cbbdc20, 0x1d05b: 0x6d176820, - 0x1d05c: 0x6c793e20, 0x1d05d: 0x6cfec620, 0x1d05e: 0x6cc3c220, 0x1d05f: 0x6c162a20, - 0x1d060: 0x6c80c820, 0x1d061: 0x6c52ac20, 0x1d062: 0x6d213020, 0x1d063: 0x6cfec820, - 0x1d064: 0x6cf9c620, 0x1d065: 0x6c988e20, 0x1d066: 0x6c960220, 0x1d067: 0x6d1e3c20, - 0x1d068: 0x6c17dc20, 0x1d069: 0x6c182220, 0x1d06a: 0x6cf2f620, 0x1d06b: 0x6c8e5c20, - 0x1d06c: 0x6d1d3c20, 0x1d06d: 0x6c985a20, 0x1d06e: 0x6cc3c420, 0x1d06f: 0x6d0e7820, - 0x1d070: 0x6ccbf620, 0x1d071: 0x6c7dac20, 0x1d072: 0x6d234c20, 0x1d073: 0x6c1c2420, - 0x1d074: 0x6c57de20, 0x1d075: 0x6c91be20, 0x1d076: 0x6c190420, 0x1d077: 0x6c659a20, - 0x1d078: 0x6caaa820, 0x1d079: 0x6cd92620, 0x1d07a: 0x6d3d6e20, 0x1d07b: 0x6c794620, - 0x1d07c: 0x6caeaa20, 0x1d07d: 0x6d0c1420, 0x1d07e: 0x6d3c9220, 0x1d07f: 0x6c797e20, - // Block 0x742, offset 0x1d080 - 0x1d080: 0x6c19ec20, 0x1d081: 0x6cb5fc20, 0x1d082: 0x6d402220, 0x1d083: 0x6cbecc20, - 0x1d084: 0x6c8bbc20, 0x1d085: 0x6c757420, 0x1d086: 0x6c0e7e20, 0x1d087: 0x6c2fac20, - 0x1d088: 0x6c9f6420, 0x1d089: 0x6c2dce20, 0x1d08a: 0x6c64bc20, 0x1d08b: 0x6c51d020, - 0x1d08c: 0x6c926e20, 0x1d08d: 0x6c00ac20, 0x1d08e: 0x6cdc4e20, 0x1d08f: 0x6cc3d220, - 0x1d090: 0x6c837c20, 0x1d091: 0x6c06b020, 0x1d092: 0x6d1a7420, 0x1d093: 0x6c334c20, - 0x1d094: 0x6cf45220, 0x1d095: 0x6cb5fe20, 0x1d096: 0x6c951820, 0x1d097: 0x6ced2e20, - 0x1d098: 0x6c2d2020, 0x1d099: 0x6ca4b220, 0x1d09a: 0x6c073420, 0x1d09b: 0x6cb7a420, - 0x1d09c: 0x6c190620, 0x1d09d: 0x6cc87020, 0x1d09e: 0x6d0cb620, 0x1d09f: 0x6c2ed220, - 0x1d0a0: 0x6c2fb020, 0x1d0a1: 0x6c31a820, 0x1d0a2: 0x6ceb2e20, 0x1d0a3: 0x6c6b0c20, - 0x1d0a4: 0x6d1bc620, 0x1d0a5: 0x6c0b4420, 0x1d0a6: 0x6c78c620, 0x1d0a7: 0x6c0a0220, - 0x1d0a8: 0x6cf0b020, 0x1d0a9: 0x6cd79220, 0x1d0aa: 0x6d318220, 0x1d0ab: 0x6c32d420, - 0x1d0ac: 0x6cf9de20, 0x1d0ad: 0x6c297a20, 0x1d0ae: 0x6ce35420, 0x1d0af: 0x6ca50c20, - 0x1d0b0: 0x6caf1420, 0x1d0b1: 0x6c65c420, 0x1d0b2: 0x6c2c8220, 0x1d0b3: 0x6ce0a220, - 0x1d0b4: 0x6c13f620, 0x1d0b5: 0x6ce54220, 0x1d0b6: 0x6cb7b420, 0x1d0b7: 0x6c341420, - 0x1d0b8: 0x6c3c5e20, 0x1d0b9: 0x6d08a420, 0x1d0ba: 0x6cc3f020, 0x1d0bb: 0x6cc3f220, - 0x1d0bc: 0x6c96a020, 0x1d0bd: 0x6c45a620, 0x1d0be: 0x6ca73820, 0x1d0bf: 0x6cdb0820, - // Block 0x743, offset 0x1d0c0 - 0x1d0c0: 0x6c357820, 0x1d0c1: 0x6c225420, 0x1d0c2: 0x6c8e8820, 0x1d0c3: 0x6cd81a20, - 0x1d0c4: 0x6ce12620, 0x1d0c5: 0x6c058820, 0x1d0c6: 0x6c574620, 0x1d0c7: 0x6caf8620, - 0x1d0c8: 0x6ceff420, 0x1d0c9: 0x6cca8820, 0x1d0ca: 0x6c82d220, 0x1d0cb: 0x6c25c420, - 0x1d0cc: 0x6ce4ba20, 0x1d0cd: 0x6cf9e620, 0x1d0ce: 0x6cf6aa20, 0x1d0cf: 0x6c883e20, - 0x1d0d0: 0x6cac7020, 0x1d0d1: 0x6cef3020, 0x1d0d2: 0x6d27fc20, 0x1d0d3: 0x6c330e20, - 0x1d0d4: 0x6d307e20, 0x1d0d5: 0x6c782620, 0x1d0d6: 0x6c7e6020, 0x1d0d7: 0x6d3b8c20, - 0x1d0d8: 0x6cbed820, 0x1d0d9: 0x6c4be420, 0x1d0da: 0x6d3b9220, 0x1d0db: 0x6c152620, - 0x1d0dc: 0x6cb7da20, 0x1d0dd: 0x6c026c20, 0x1d0de: 0x6cae8620, 0x1d0df: 0x6c8f4020, - 0x1d0e0: 0x6c91de20, 0x1d0e1: 0x6c771420, 0x1d0e2: 0x6c209a20, 0x1d0e3: 0x6c190e20, - 0x1d0e4: 0x6d1afe20, 0x1d0e5: 0x6c82d820, 0x1d0e6: 0x6c0c1e20, 0x1d0e7: 0x6cb7dc20, - 0x1d0e8: 0x6ca07c20, 0x1d0e9: 0x6cb7de20, 0x1d0ea: 0x6c24e820, 0x1d0eb: 0x6d3fc220, - 0x1d0ec: 0x6cbeda20, 0x1d0ed: 0x6c21da20, 0x1d0ee: 0x6c952a20, 0x1d0ef: 0x6c5f5420, - 0x1d0f0: 0x6ccdbe20, 0x1d0f1: 0x6c817c20, 0x1d0f2: 0x6cc1c020, 0x1d0f3: 0x6d2b9a20, - 0x1d0f4: 0x6c2aec20, 0x1d0f5: 0x6c66e220, 0x1d0f6: 0x6cf8f220, 0x1d0f7: 0x6c8be820, - 0x1d0f8: 0x6c2fbe20, 0x1d0f9: 0x6ce01e20, 0x1d0fa: 0x6c59fc20, 0x1d0fb: 0x6cac7620, - 0x1d0fc: 0x6d28ce20, 0x1d0fd: 0x6cbbb820, 0x1d0fe: 0x6c2b4820, 0x1d0ff: 0x6c86aa20, - // Block 0x744, offset 0x1d100 - 0x1d100: 0x6c673e20, 0x1d101: 0x6c688220, 0x1d102: 0x6cf94a20, 0x1d103: 0x6d2f0e20, - 0x1d104: 0x6cbc0420, 0x1d105: 0x6c33b620, 0x1d106: 0x6c65f420, 0x1d107: 0x6d241220, - 0x1d108: 0x6d3cb420, 0x1d109: 0x6c518420, 0x1d10a: 0x6c78e020, 0x1d10b: 0x6d2b1420, - 0x1d10c: 0x6c826a20, 0x1d10d: 0x6c787220, 0x1d10e: 0x6c1ef620, 0x1d10f: 0x6d137020, - 0x1d110: 0x6cc40c20, 0x1d111: 0x6c299a20, 0x1d112: 0x6d161e20, 0x1d113: 0x6c678e20, - 0x1d114: 0x6caf9e20, 0x1d115: 0x6cafa020, 0x1d116: 0x6d243020, 0x1d117: 0x6cb1f420, - 0x1d118: 0x6c36d020, 0x1d119: 0x6c00fe20, 0x1d11a: 0x6c783e20, 0x1d11b: 0x6c652220, - 0x1d11c: 0x6d243220, 0x1d11d: 0x6cc88e20, 0x1d11e: 0x6c9b7220, 0x1d11f: 0x6cada020, - 0x1d120: 0x6c227820, 0x1d121: 0x6c0f9020, 0x1d122: 0x6d107c20, 0x1d123: 0x6c96e420, - 0x1d124: 0x6c10e620, 0x1d125: 0x6cfbc820, 0x1d126: 0x6c7c1620, 0x1d127: 0x6c828020, - 0x1d128: 0x6c82fe20, 0x1d129: 0x6d375420, 0x1d12a: 0x6c870420, 0x1d12b: 0x6c872e20, - 0x1d12c: 0x6c38e420, 0x1d12d: 0x6cc41c20, 0x1d12e: 0x6cada620, 0x1d12f: 0x6d1c3020, - 0x1d130: 0x6c874a20, 0x1d131: 0x6c8fe620, 0x1d132: 0x6c8fe820, 0x1d133: 0x6ca19620, - 0x1d134: 0x6c0fc220, 0x1d135: 0x6cd6b420, 0x1d136: 0x6c49be20, 0x1d137: 0x6c800020, - 0x1d138: 0x6d298620, 0x1d139: 0x6d0d1820, 0x1d13a: 0x6cd2f420, 0x1d13b: 0x6cd2e620, - 0x1d13c: 0x6c84f420, 0x1d13d: 0x6cc61c20, 0x1d13e: 0x6ccf3620, 0x1d13f: 0x6d268020, - // Block 0x745, offset 0x1d140 - 0x1d140: 0x6cd88420, 0x1d141: 0x6cb56820, 0x1d142: 0x6cdde220, 0x1d143: 0x6c96b420, - 0x1d144: 0x6d016420, 0x1d145: 0x6d109420, 0x1d146: 0x6cfa8020, 0x1d147: 0x6cb58820, - 0x1d148: 0x6cb58a20, 0x1d149: 0x6d34f820, 0x1d14a: 0x6c07d820, 0x1d14b: 0x6c333a20, - 0x1d14c: 0x6d381820, 0x1d14d: 0x6cc5d620, 0x1d14e: 0x6d13cc20, 0x1d14f: 0x6cd25420, - 0x1d150: 0x6d203020, 0x1d151: 0x6d35a820, 0x1d152: 0x6ce57a20, 0x1d153: 0x6c3e1e20, - 0x1d154: 0x6c3fc420, 0x1d155: 0x6c9d2e20, 0x1d156: 0x6d411420, 0x1d157: 0x6d33ac20, - 0x1d158: 0x6cdb9620, 0x1d159: 0x6c9a8420, 0x1d15a: 0x6d428620, 0x1d15b: 0x6cc0ec20, - 0x1d15c: 0x6c567220, 0x1d15d: 0x6d3ac620, 0x1d15e: 0x6cd03a20, 0x1d15f: 0x6cdc3020, - 0x1d160: 0x6c223020, 0x1d161: 0x6c147a20, 0x1d162: 0x6c9c3e20, 0x1d163: 0x6c939020, - 0x1d164: 0x6d223e20, 0x1d165: 0x6cfdbc20, 0x1d166: 0x6cf3c620, 0x1d167: 0x6ce55620, - 0x1d168: 0x6cb1ae20, 0x1d169: 0x6d3ada20, 0x1d16a: 0x6c4aec20, 0x1d16b: 0x6cf9ae20, - 0x1d16c: 0x6d33c820, 0x1d16d: 0x6c61f420, 0x1d16e: 0x6c434620, 0x1d16f: 0x6d314420, - 0x1d170: 0x6c434820, 0x1d171: 0x6cd71e20, 0x1d172: 0x6c6d0620, 0x1d173: 0x6cd0a020, - 0x1d174: 0x6c40f620, 0x1d175: 0x6c7daa20, 0x1d176: 0x6c2c4820, 0x1d177: 0x6c29d820, - 0x1d178: 0x6c5dc620, 0x1d179: 0x6ce22820, 0x1d17a: 0x6cb5ee20, 0x1d17b: 0x6c481620, - 0x1d17c: 0x6c498a20, 0x1d17d: 0x6d41b420, 0x1d17e: 0x6c8d0820, 0x1d17f: 0x6c925a20, - // Block 0x746, offset 0x1d180 - 0x1d180: 0x6c0de820, 0x1d181: 0x6c6d1a20, 0x1d182: 0x6c29da20, 0x1d183: 0x6d346620, - 0x1d184: 0x6c925820, 0x1d185: 0x6c14f820, 0x1d186: 0x6c06a620, 0x1d187: 0x6d30d820, - 0x1d188: 0x6c5aca20, 0x1d189: 0x6d1fd620, 0x1d18a: 0x6cf8a220, 0x1d18b: 0x6d19ee20, - 0x1d18c: 0x6d3e5420, 0x1d18d: 0x6c5dd420, 0x1d18e: 0x6d316e20, 0x1d18f: 0x6c3e9c20, - 0x1d190: 0x6d262420, 0x1d191: 0x6cf3d020, 0x1d192: 0x6cfc1820, 0x1d193: 0x6d0fca20, - 0x1d194: 0x6d33f420, 0x1d195: 0x6d13fc20, 0x1d196: 0x6c9a1220, 0x1d197: 0x6cd7f820, - 0x1d198: 0x6c2c6c20, 0x1d199: 0x6c077a20, 0x1d19a: 0x6d3d8220, 0x1d19b: 0x6d318420, - 0x1d19c: 0x6d1e5620, 0x1d19d: 0x6c606c20, 0x1d19e: 0x6c435220, 0x1d19f: 0x6ce11a20, - 0x1d1a0: 0x6cd80420, 0x1d1a1: 0x6c96d020, 0x1d1a2: 0x6cde7820, 0x1d1a3: 0x6c40b620, - 0x1d1a4: 0x6d07bc20, 0x1d1a5: 0x6cb63c20, 0x1d1a6: 0x6d241420, 0x1d1a7: 0x6cf81220, - 0x1d1a8: 0x6c5f3a20, 0x1d1a9: 0x6cd8e020, 0x1d1aa: 0x6c152820, 0x1d1ab: 0x6c28b420, - 0x1d1ac: 0x6c4b8020, 0x1d1ad: 0x6cdc7820, 0x1d1ae: 0x6c853820, 0x1d1af: 0x6ca9d020, - 0x1d1b0: 0x6c9c8a20, 0x1d1b1: 0x6c29f820, 0x1d1b2: 0x6c86d620, 0x1d1b3: 0x6cc4ee20, - 0x1d1b4: 0x6d271620, 0x1d1b5: 0x6ce3b420, 0x1d1b6: 0x6d29c220, 0x1d1b7: 0x6c836420, - 0x1d1b8: 0x6cc74020, 0x1d1b9: 0x6d222e20, 0x1d1ba: 0x6d20dc20, 0x1d1bb: 0x6c83ae20, - 0x1d1bc: 0x6d019820, 0x1d1bd: 0x6cbd7620, 0x1d1be: 0x6c50b220, 0x1d1bf: 0x6ce83c20, - // Block 0x747, offset 0x1d1c0 - 0x1d1c0: 0x6d052c20, 0x1d1c1: 0x6cd7c620, 0x1d1c2: 0x6cc56c20, 0x1d1c3: 0x6ce83e20, - 0x1d1c4: 0x6d3ef020, 0x1d1c5: 0x6c13c820, 0x1d1c6: 0x6c41cc20, 0x1d1c7: 0x6d16cc20, - 0x1d1c8: 0x6cfa8220, 0x1d1c9: 0x6c0dc620, 0x1d1ca: 0x6ca6f620, 0x1d1cb: 0x6cbfa620, - 0x1d1cc: 0x6cbfa820, 0x1d1cd: 0x6d37e820, 0x1d1ce: 0x6c3bd420, 0x1d1cf: 0x6c502220, - 0x1d1d0: 0x6d279020, 0x1d1d1: 0x6c77e620, 0x1d1d2: 0x6c9e8c20, 0x1d1d3: 0x6d33ae20, - 0x1d1d4: 0x6c6d9820, 0x1d1d5: 0x6c08c820, 0x1d1d6: 0x6d33b020, 0x1d1d7: 0x6d22e620, - 0x1d1d8: 0x6c9d3420, 0x1d1d9: 0x6c7a8a20, 0x1d1da: 0x6c04f420, 0x1d1db: 0x6caf5620, - 0x1d1dc: 0x6ca5ce20, 0x1d1dd: 0x6c85da20, 0x1d1de: 0x6d1f1a20, 0x1d1df: 0x6d409a20, - 0x1d1e0: 0x6caf5820, 0x1d1e1: 0x6c0edc20, 0x1d1e2: 0x6c8cd020, 0x1d1e3: 0x6ca0fc20, - 0x1d1e4: 0x6c1a8020, 0x1d1e5: 0x6ca6fe20, 0x1d1e6: 0x6cbd6620, 0x1d1e7: 0x6d0f5620, - 0x1d1e8: 0x6d423220, 0x1d1e9: 0x6d35c420, 0x1d1ea: 0x6d33ca20, 0x1d1eb: 0x6cd52420, - 0x1d1ec: 0x6c721a20, 0x1d1ed: 0x6d3ef620, 0x1d1ee: 0x6c5d7220, 0x1d1ef: 0x6c5ea820, - 0x1d1f0: 0x6c196220, 0x1d1f1: 0x6ce74220, 0x1d1f2: 0x6d35f820, 0x1d1f3: 0x6c5d7620, - 0x1d1f4: 0x6c511220, 0x1d1f5: 0x6d19ce20, 0x1d1f6: 0x6d3e2620, 0x1d1f7: 0x6d35fa20, - 0x1d1f8: 0x6c6a0220, 0x1d1f9: 0x6cc59420, 0x1d1fa: 0x6c325020, 0x1d1fb: 0x6d14e820, - 0x1d1fc: 0x6d399e20, 0x1d1fd: 0x6c5bb820, 0x1d1fe: 0x6ca9ba20, 0x1d1ff: 0x6c3ff420, - // Block 0x748, offset 0x1d200 - 0x1d200: 0x6cf62020, 0x1d201: 0x6c77aa20, 0x1d202: 0x6c80ca20, 0x1d203: 0x6c3d7420, - 0x1d204: 0x6d0a9020, 0x1d205: 0x6cd72020, 0x1d206: 0x6c939420, 0x1d207: 0x6c7dae20, - 0x1d208: 0x6c41da20, 0x1d209: 0x6c6db820, 0x1d20a: 0x6ce32e20, 0x1d20b: 0x6c1a0c20, - 0x1d20c: 0x6ce8b420, 0x1d20d: 0x6cce7020, 0x1d20e: 0x6cd72220, 0x1d20f: 0x6d0bc020, - 0x1d210: 0x6c951a20, 0x1d211: 0x6c927020, 0x1d212: 0x6c481c20, 0x1d213: 0x6d424420, - 0x1d214: 0x6cc59a20, 0x1d215: 0x6d3ce620, 0x1d216: 0x6c057c20, 0x1d217: 0x6c044a20, - 0x1d218: 0x6c5eec20, 0x1d219: 0x6d33f620, 0x1d21a: 0x6d366020, 0x1d21b: 0x6c7db420, - 0x1d21c: 0x6c837e20, 0x1d21d: 0x6caeac20, 0x1d21e: 0x6c780a20, 0x1d21f: 0x6c0dea20, - 0x1d220: 0x6c1dbe20, 0x1d221: 0x6d41b620, 0x1d222: 0x6d237420, 0x1d223: 0x6cda5220, - 0x1d224: 0x6c94ae20, 0x1d225: 0x6cfd8020, 0x1d226: 0x6d140620, 0x1d227: 0x6cf8b620, - 0x1d228: 0x6c0b4620, 0x1d229: 0x6c624820, 0x1d22a: 0x6c3ec420, 0x1d22b: 0x6cb0b020, - 0x1d22c: 0x6cab0820, 0x1d22d: 0x6c6a2c20, 0x1d22e: 0x6d380420, 0x1d22f: 0x6d3fa820, - 0x1d230: 0x6d064e20, 0x1d231: 0x6c197e20, 0x1d232: 0x6c2a2220, 0x1d233: 0x6cf1e820, - 0x1d234: 0x6cfb8220, 0x1d235: 0x6d3e6820, 0x1d236: 0x6d23c820, 0x1d237: 0x6c626420, - 0x1d238: 0x6d072e20, 0x1d239: 0x6d31f420, 0x1d23a: 0x6d36b820, 0x1d23b: 0x6c2a2a20, - 0x1d23c: 0x6c645420, 0x1d23d: 0x6c5f1820, 0x1d23e: 0x6c431820, 0x1d23f: 0x6c431a20, - // Block 0x749, offset 0x1d240 - 0x1d240: 0x6c47c420, 0x1d241: 0x6cc6a020, 0x1d242: 0x6cdc6020, 0x1d243: 0x6cc73c20, - 0x1d244: 0x6c627a20, 0x1d245: 0x6c775220, 0x1d246: 0x6ca2ac20, 0x1d247: 0x6c11dc20, - 0x1d248: 0x6c9a2620, 0x1d249: 0x6d370c20, 0x1d24a: 0x6c624a20, 0x1d24b: 0x6c92d620, - 0x1d24c: 0x6cda5a20, 0x1d24d: 0x6c5f3c20, 0x1d24e: 0x6d1d0c20, 0x1d24f: 0x6cf1f020, - 0x1d250: 0x6cbfc420, 0x1d251: 0x6ccb6020, 0x1d252: 0x6c51e620, 0x1d253: 0x6d18aa20, - 0x1d254: 0x6c59fe20, 0x1d255: 0x6cbce620, 0x1d256: 0x6c615620, 0x1d257: 0x6cdc8820, - 0x1d258: 0x6cff2020, 0x1d259: 0x6cb45e20, 0x1d25a: 0x6c688420, 0x1d25b: 0x6d3d0c20, - 0x1d25c: 0x6d380c20, 0x1d25d: 0x6d41e620, 0x1d25e: 0x6c93ba20, 0x1d25f: 0x6cdc8c20, - 0x1d260: 0x6ca9d420, 0x1d261: 0x6ccb7820, 0x1d262: 0x6c5c6c20, 0x1d263: 0x6cc4de20, - 0x1d264: 0x6cab1e20, 0x1d265: 0x6d243420, 0x1d266: 0x6cb1f820, 0x1d267: 0x6c62bc20, - 0x1d268: 0x6ce9ce20, 0x1d269: 0x6cf1f420, 0x1d26a: 0x6c199e20, 0x1d26b: 0x6c5e1a20, - 0x1d26c: 0x6c7c1820, 0x1d26d: 0x6c93c020, 0x1d26e: 0x6c0c4c20, 0x1d26f: 0x6ccba820, - 0x1d270: 0x6cc4f420, 0x1d271: 0x6d3d1620, 0x1d272: 0x6c84d420, 0x1d273: 0x6c24aa20, - 0x1d274: 0x6d08f220, 0x1d275: 0x6cebc420, 0x1d276: 0x6c6f5620, 0x1d277: 0x6cbefa20, - 0x1d278: 0x6cf59020, 0x1d279: 0x6cbefe20, 0x1d27a: 0x6c796820, 0x1d27b: 0x6d207a20, - 0x1d27c: 0x6ccfc020, 0x1d27d: 0x6c6e1a20, 0x1d27e: 0x6d11f220, 0x1d27f: 0x6c1fe020, - // Block 0x74a, offset 0x1d280 - 0x1d280: 0x6d3cce20, 0x1d281: 0x6ce84420, 0x1d282: 0x6c814620, 0x1d283: 0x6cbca020, - 0x1d284: 0x6d2d2820, 0x1d285: 0x6d11a020, 0x1d286: 0x6c0b3020, 0x1d287: 0x6c05c420, - 0x1d288: 0x6d11a220, 0x1d289: 0x6c0ddc20, 0x1d28a: 0x6cebd420, 0x1d28b: 0x6d3a0820, - 0x1d28c: 0x6c699020, 0x1d28d: 0x6cbc3a20, 0x1d28e: 0x6c2e1020, 0x1d28f: 0x6cf36620, - 0x1d290: 0x6c4a5e20, 0x1d291: 0x6d10ea20, 0x1d292: 0x6d35fc20, 0x1d293: 0x6c205020, - 0x1d294: 0x6d120220, 0x1d295: 0x6ce5c220, 0x1d296: 0x6c69a020, 0x1d297: 0x6c205220, - 0x1d298: 0x6c6f1220, 0x1d299: 0x6cfeca20, 0x1d29a: 0x6c19f020, 0x1d29b: 0x6c79ec20, - 0x1d29c: 0x6c24ac20, 0x1d29d: 0x6cf29420, 0x1d29e: 0x6c289420, 0x1d29f: 0x6c7a4a20, - 0x1d2a0: 0x6c780c20, 0x1d2a1: 0x6d3d7020, 0x1d2a2: 0x6d05b420, 0x1d2a3: 0x6cda5420, - 0x1d2a4: 0x6c491c20, 0x1d2a5: 0x6c7c3e20, 0x1d2a6: 0x6c312420, 0x1d2a7: 0x6d3dfa20, - 0x1d2a8: 0x6d09a020, 0x1d2a9: 0x6cf29620, 0x1d2aa: 0x6cebea20, 0x1d2ab: 0x6d0bc620, - 0x1d2ac: 0x6d217820, 0x1d2ad: 0x6c726a20, 0x1d2ae: 0x6cbf5220, 0x1d2af: 0x6d113a20, - 0x1d2b0: 0x6d113c20, 0x1d2b1: 0x6ce5cc20, 0x1d2b2: 0x6c177820, 0x1d2b3: 0x6d228020, - 0x1d2b4: 0x6ce4bc20, 0x1d2b5: 0x6c2e3e20, 0x1d2b6: 0x6c729220, 0x1d2b7: 0x6c8aa820, - 0x1d2b8: 0x6cf6ce20, 0x1d2b9: 0x6cf52220, 0x1d2ba: 0x6c7c4420, 0x1d2bb: 0x6c206220, - 0x1d2bc: 0x6d2f7220, 0x1d2bd: 0x6c7b7c20, 0x1d2be: 0x6c7b7420, 0x1d2bf: 0x6c907420, - // Block 0x74b, offset 0x1d2c0 - 0x1d2c0: 0x6c199c20, 0x1d2c1: 0x6c256c20, 0x1d2c2: 0x6cb18420, 0x1d2c3: 0x6d2a9420, - 0x1d2c4: 0x6c24ba20, 0x1d2c5: 0x6cbc6820, 0x1d2c6: 0x6cbf7820, 0x1d2c7: 0x6c314c20, - 0x1d2c8: 0x6d2a9e20, 0x1d2c9: 0x6c904620, 0x1d2ca: 0x6cbd0a20, 0x1d2cb: 0x6c856c20, - 0x1d2cc: 0x6c1f0a20, 0x1d2cd: 0x6cd40c20, 0x1d2ce: 0x6c3fb820, 0x1d2cf: 0x6cba9220, - 0x1d2d0: 0x6c1f1c20, 0x1d2d1: 0x6c531820, 0x1d2d2: 0x6cb59820, 0x1d2d3: 0x6c508620, - 0x1d2d4: 0x6cd18420, 0x1d2d5: 0x6c3c0820, 0x1d2d6: 0x6cd5b220, 0x1d2d7: 0x6c9eb020, - 0x1d2d8: 0x6cc24020, 0x1d2d9: 0x6d2e5220, 0x1d2da: 0x6d3adc20, 0x1d2db: 0x6c8cd420, - 0x1d2dc: 0x6c8f8220, 0x1d2dd: 0x6c0e1620, 0x1d2de: 0x6c6e6a20, 0x1d2df: 0x6c6e7e20, - 0x1d2e0: 0x6d2eb620, 0x1d2e1: 0x6c046620, 0x1d2e2: 0x6cd8c220, 0x1d2e3: 0x6c75c020, - 0x1d2e4: 0x6c534e20, 0x1d2e5: 0x6ce74a20, 0x1d2e6: 0x6cd95a20, 0x1d2e7: 0x6c6e8820, - 0x1d2e8: 0x6c2e2e20, 0x1d2e9: 0x6d17f820, 0x1d2ea: 0x6cd5e820, 0x1d2eb: 0x6c6e7820, - 0x1d2ec: 0x6cc24c20, 0x1d2ed: 0x6c6b1020, 0x1d2ee: 0x6cb26020, 0x1d2ef: 0x6c329e20, - 0x1d2f0: 0x6ccea620, 0x1d2f1: 0x6d3bac20, 0x1d2f2: 0x6c136220, 0x1d2f3: 0x6c2ab020, - 0x1d2f4: 0x6c259e20, 0x1d2f5: 0x6cec5a20, 0x1d2f6: 0x6c6ec020, 0x1d2f7: 0x6c76fa20, - 0x1d2f8: 0x6c6ec420, 0x1d2f9: 0x6d39f020, 0x1d2fa: 0x6d39f620, 0x1d2fb: 0x6c821a20, - 0x1d2fc: 0x6cae9220, 0x1d2fd: 0x6d20e020, 0x1d2fe: 0x6c1b0e20, 0x1d2ff: 0x6c418820, - // Block 0x74c, offset 0x1d300 - 0x1d300: 0x6c984220, 0x1d301: 0x6d39fe20, 0x1d302: 0x6cedb820, 0x1d303: 0x6c321220, - 0x1d304: 0x6c5eac20, 0x1d305: 0x6cff7420, 0x1d306: 0x6c03f020, 0x1d307: 0x6cdb9820, - 0x1d308: 0x6c5ffc20, 0x1d309: 0x6cbdce20, 0x1d30a: 0x6d2faa20, 0x1d30b: 0x6cdce820, - 0x1d30c: 0x6d0b2020, 0x1d30d: 0x6d3c7e20, 0x1d30e: 0x6d255220, 0x1d30f: 0x6c568420, - 0x1d310: 0x6c4f6820, 0x1d311: 0x6cffe220, 0x1d312: 0x6c132e20, 0x1d313: 0x6c096c20, - 0x1d314: 0x6c08d020, 0x1d315: 0x6c658020, 0x1d316: 0x6d15de20, 0x1d317: 0x6c2ffc20, - 0x1d318: 0x6ccce220, 0x1d319: 0x6cd0fe20, 0x1d31a: 0x6c264820, 0x1d31b: 0x6c2b6c20, - 0x1d31c: 0x6d3a0e20, 0x1d31d: 0x6ca33420, 0x1d31e: 0x6c1aac20, 0x1d31f: 0x6c470620, - 0x1d320: 0x6c85f620, 0x1d321: 0x6cbcba20, 0x1d322: 0x6c9faa20, 0x1d323: 0x6c05ae20, - 0x1d324: 0x6ce58220, 0x1d325: 0x6cd8b620, 0x1d326: 0x6c3e5820, 0x1d327: 0x6c12de20, - 0x1d328: 0x6c07b420, 0x1d329: 0x6cae1a20, 0x1d32a: 0x6c26a020, 0x1d32b: 0x6d3f0620, - 0x1d32c: 0x6c2c4a20, 0x1d32d: 0x6c8cee20, 0x1d32e: 0x6d2ac420, 0x1d32f: 0x6caa4220, - 0x1d330: 0x6c3e5a20, 0x1d331: 0x6c467e20, 0x1d332: 0x6c389620, 0x1d333: 0x6c634e20, - 0x1d334: 0x6c41d820, 0x1d335: 0x6c394820, 0x1d336: 0x6cd2cc20, 0x1d337: 0x6c993820, - 0x1d338: 0x6cb35620, 0x1d339: 0x6ce45020, 0x1d33a: 0x6c648a20, 0x1d33b: 0x6cbf1820, - 0x1d33c: 0x6c8f8a20, 0x1d33d: 0x6c9fe420, 0x1d33e: 0x6c0af020, 0x1d33f: 0x6c960420, - // Block 0x74d, offset 0x1d340 - 0x1d340: 0x6c4b4c20, 0x1d341: 0x6cc10c20, 0x1d342: 0x6c1b2620, 0x1d343: 0x6d19e220, - 0x1d344: 0x6d120820, 0x1d345: 0x6cfc0e20, 0x1d346: 0x6c08e220, 0x1d347: 0x6cbf1a20, - 0x1d348: 0x6c7dfa20, 0x1d349: 0x6c2acc20, 0x1d34a: 0x6cff8c20, 0x1d34b: 0x6c6c4620, - 0x1d34c: 0x6cc2f420, 0x1d34d: 0x6cdcec20, 0x1d34e: 0x6cc7ae20, 0x1d34f: 0x6c381420, - 0x1d350: 0x6c7b9e20, 0x1d351: 0x6d3af620, 0x1d352: 0x6ce7b820, 0x1d353: 0x6c5ed820, - 0x1d354: 0x6c26a820, 0x1d355: 0x6c4f7a20, 0x1d356: 0x6c12ee20, 0x1d357: 0x6d383020, - 0x1d358: 0x6c79ee20, 0x1d359: 0x6c7f0e20, 0x1d35a: 0x6c09a820, 0x1d35b: 0x6ccc8a20, - 0x1d35c: 0x6c28fe20, 0x1d35d: 0x6d32c820, 0x1d35e: 0x6c12fa20, 0x1d35f: 0x6c3d7e20, - 0x1d360: 0x6d27b420, 0x1d361: 0x6ce8c620, 0x1d362: 0x6cabd820, 0x1d363: 0x6c83ec20, - 0x1d364: 0x6c80d020, 0x1d365: 0x6c71ba20, 0x1d366: 0x6c495820, 0x1d367: 0x6c65b020, - 0x1d368: 0x6c4e1e20, 0x1d369: 0x6ce75620, 0x1d36a: 0x6cf9d620, 0x1d36b: 0x6d366220, - 0x1d36c: 0x6c1a0e20, 0x1d36d: 0x6cdb9a20, 0x1d36e: 0x6cd39e20, 0x1d36f: 0x6d3b0c20, - 0x1d370: 0x6d424620, 0x1d371: 0x6cffb020, 0x1d372: 0x6cce7620, 0x1d373: 0x6ce67620, - 0x1d374: 0x6c12fc20, 0x1d375: 0x6d0c9e20, 0x1d376: 0x6c435020, 0x1d377: 0x6c7b2c20, - 0x1d378: 0x6c41a020, 0x1d379: 0x6c1dc020, 0x1d37a: 0x6c7c2e20, 0x1d37b: 0x6c42aa20, - 0x1d37c: 0x6d27b620, 0x1d37d: 0x6cab2a20, 0x1d37e: 0x6cb8f420, 0x1d37f: 0x6cffb220, - // Block 0x74e, offset 0x1d380 - 0x1d380: 0x6c65b220, 0x1d381: 0x6cb3de20, 0x1d382: 0x6c7f1c20, 0x1d383: 0x6d405c20, - 0x1d384: 0x6c08ec20, 0x1d385: 0x6c0a0420, 0x1d386: 0x6c0a0620, 0x1d387: 0x6c448c20, - 0x1d388: 0x6cdf3020, 0x1d389: 0x6c48e020, 0x1d38a: 0x6d209420, 0x1d38b: 0x6c64cc20, - 0x1d38c: 0x6c2a2420, 0x1d38d: 0x6c472420, 0x1d38e: 0x6c1b4420, 0x1d38f: 0x6d32e220, - 0x1d390: 0x6cbed220, 0x1d391: 0x6ccc6820, 0x1d392: 0x6d38ec20, 0x1d393: 0x6c928e20, - 0x1d394: 0x6c0f3020, 0x1d395: 0x6c5f0a20, 0x1d396: 0x6c8bc420, 0x1d397: 0x6cdb9e20, - 0x1d398: 0x6c75d420, 0x1d399: 0x6c3ec820, 0x1d39a: 0x6d2c4220, 0x1d39b: 0x6c472620, - 0x1d39c: 0x6c798620, 0x1d39d: 0x6cb9b220, 0x1d39e: 0x6cb90a20, 0x1d39f: 0x6c75d620, - 0x1d3a0: 0x6c20dc20, 0x1d3a1: 0x6c495a20, 0x1d3a2: 0x6d250420, 0x1d3a3: 0x6c130820, - 0x1d3a4: 0x6d40cc20, 0x1d3a5: 0x6c0fe620, 0x1d3a6: 0x6d2ae420, 0x1d3a7: 0x6cbcd620, - 0x1d3a8: 0x6cebb020, 0x1d3a9: 0x6c954e20, 0x1d3aa: 0x6c27ec20, 0x1d3ab: 0x6cfef420, - 0x1d3ac: 0x6cc92620, 0x1d3ad: 0x6c66ba20, 0x1d3ae: 0x6d07c020, 0x1d3af: 0x6c0b0020, - 0x1d3b0: 0x6cdcfc20, 0x1d3b1: 0x6cfd8620, 0x1d3b2: 0x6cfc2420, 0x1d3b3: 0x6cb2c620, - 0x1d3b4: 0x6d318c20, 0x1d3b5: 0x6d039420, 0x1d3b6: 0x6c559420, 0x1d3b7: 0x6d154a20, - 0x1d3b8: 0x6d3b1420, 0x1d3b9: 0x6d265820, 0x1d3ba: 0x6c211020, 0x1d3bb: 0x6c93f620, - 0x1d3bc: 0x6cf37e20, 0x1d3bd: 0x6c303820, 0x1d3be: 0x6cd79a20, 0x1d3bf: 0x6c609020, - // Block 0x74f, offset 0x1d3c0 - 0x1d3c0: 0x6c6af220, 0x1d3c1: 0x6c59ee20, 0x1d3c2: 0x6d039620, 0x1d3c3: 0x6c9aa820, - 0x1d3c4: 0x6c396a20, 0x1d3c5: 0x6c200a20, 0x1d3c6: 0x6d3bde20, 0x1d3c7: 0x6cb0fc20, - 0x1d3c8: 0x6c3c6220, 0x1d3c9: 0x6d3a2820, 0x1d3ca: 0x6c59f020, 0x1d3cb: 0x6cbce020, - 0x1d3cc: 0x6c542420, 0x1d3cd: 0x6cbfbe20, 0x1d3ce: 0x6c9e9a20, 0x1d3cf: 0x6cba7620, - 0x1d3d0: 0x6c483c20, 0x1d3d1: 0x6c7d1020, 0x1d3d2: 0x6cd41c20, 0x1d3d3: 0x6c90f420, - 0x1d3d4: 0x6d27c820, 0x1d3d5: 0x6c517020, 0x1d3d6: 0x6ce13420, 0x1d3d7: 0x6d26ee20, - 0x1d3d8: 0x6c1d7e20, 0x1d3d9: 0x6c42de20, 0x1d3da: 0x6c3a7020, 0x1d3db: 0x6cc92e20, - 0x1d3dc: 0x6d32f420, 0x1d3dd: 0x6c465e20, 0x1d3de: 0x6ca87220, 0x1d3df: 0x6cba7e20, - 0x1d3e0: 0x6cffbc20, 0x1d3e1: 0x6c24b420, 0x1d3e2: 0x6c903820, 0x1d3e3: 0x6caec620, - 0x1d3e4: 0x6c322e20, 0x1d3e5: 0x6c867e20, 0x1d3e6: 0x6c0a5420, 0x1d3e7: 0x6d3d9e20, - 0x1d3e8: 0x6c1ea820, 0x1d3e9: 0x6ccc9020, 0x1d3ea: 0x6c1b5220, 0x1d3eb: 0x6d3b2c20, - 0x1d3ec: 0x6cbada20, 0x1d3ed: 0x6c8fae20, 0x1d3ee: 0x6c7fb620, 0x1d3ef: 0x6c64fa20, - 0x1d3f0: 0x6c10ba20, 0x1d3f1: 0x6c844220, 0x1d3f2: 0x6c5c5820, 0x1d3f3: 0x6c0a5620, - 0x1d3f4: 0x6c2b9020, 0x1d3f5: 0x6c236420, 0x1d3f6: 0x6d0c3620, 0x1d3f7: 0x6caf2020, - 0x1d3f8: 0x6c11e020, 0x1d3f9: 0x6d3be620, 0x1d3fa: 0x6cb02220, 0x1d3fb: 0x6cb19e20, - 0x1d3fc: 0x6c30c820, 0x1d3fd: 0x6d243620, 0x1d3fe: 0x6c9ef820, 0x1d3ff: 0x6ce96020, - // Block 0x750, offset 0x1d400 - 0x1d400: 0x6d2b1020, 0x1d401: 0x6ccc9220, 0x1d402: 0x6c4b8420, 0x1d403: 0x6d156e20, - 0x1d404: 0x6c56cc20, 0x1d405: 0x6c15e620, 0x1d406: 0x6c7a0820, 0x1d407: 0x6c246820, - 0x1d408: 0x6cb2d620, 0x1d409: 0x6d2a9020, 0x1d40a: 0x6c5f5620, 0x1d40b: 0x6c4b1c20, - 0x1d40c: 0x6cdb3820, 0x1d40d: 0x6c90fc20, 0x1d40e: 0x6c131a20, 0x1d40f: 0x6c92e820, - 0x1d410: 0x6ca73e20, 0x1d411: 0x6cdd3820, 0x1d412: 0x6c24b620, 0x1d413: 0x6c2e5420, - 0x1d414: 0x6cdd4020, 0x1d415: 0x6c822a20, 0x1d416: 0x6c32dc20, 0x1d417: 0x6c89d020, - 0x1d418: 0x6cff2220, 0x1d419: 0x6c0f9420, 0x1d41a: 0x6c9da020, 0x1d41b: 0x6ccc9420, - 0x1d41c: 0x6c299c20, 0x1d41d: 0x6c8a3620, 0x1d41e: 0x6c280c20, 0x1d41f: 0x6c2d8e20, - 0x1d420: 0x6c3f9020, 0x1d421: 0x6c65f820, 0x1d422: 0x6c9fd020, 0x1d423: 0x6c7d2820, - 0x1d424: 0x6c27a020, 0x1d425: 0x6c689820, 0x1d426: 0x6c2ab620, 0x1d427: 0x6c5a0c20, - 0x1d428: 0x6cdd0020, 0x1d429: 0x6c818220, 0x1d42a: 0x6d295220, 0x1d42b: 0x6cff3c20, - 0x1d42c: 0x6c931e20, 0x1d42d: 0x6cd3f620, 0x1d42e: 0x6d295420, 0x1d42f: 0x6cb81c20, - 0x1d430: 0x6cac0a20, 0x1d431: 0x6cb81e20, 0x1d432: 0x6cac0c20, 0x1d433: 0x6c41f620, - 0x1d434: 0x6c72b220, 0x1d435: 0x6c328a20, 0x1d436: 0x6c930620, 0x1d437: 0x6d0cf220, - 0x1d438: 0x6c0fea20, 0x1d439: 0x6c291820, 0x1d43a: 0x6cc9ec20, 0x1d43b: 0x6d3b5e20, - 0x1d43c: 0x6c8fca20, 0x1d43d: 0x6cb94020, 0x1d43e: 0x6c888420, 0x1d43f: 0x6c10cc20, - // Block 0x751, offset 0x1d440 - 0x1d440: 0x6d396220, 0x1d441: 0x6c7f6e20, 0x1d442: 0x6cd42020, 0x1d443: 0x6c7fec20, - 0x1d444: 0x6c7d3420, 0x1d445: 0x6d21d620, 0x1d446: 0x6d270420, 0x1d447: 0x6c500020, - 0x1d448: 0x6d31a220, 0x1d449: 0x6cdf5020, 0x1d44a: 0x6ce43e20, 0x1d44b: 0x6ca8a420, - 0x1d44c: 0x6c1e0420, 0x1d44d: 0x6c60ec20, 0x1d44e: 0x6d199820, 0x1d44f: 0x6cb82020, - 0x1d450: 0x6ce2ca20, 0x1d451: 0x6d3c0020, 0x1d452: 0x6d396820, 0x1d453: 0x6c387020, - 0x1d454: 0x6cda3c20, 0x1d455: 0x6d396620, 0x1d456: 0x6cba9820, 0x1d457: 0x6d3de020, - 0x1d458: 0x6ce2d420, 0x1d459: 0x6c933a20, 0x1d45a: 0x6c919420, 0x1d45b: 0x6c662a20, - 0x1d45c: 0x6cebbe20, 0x1d45d: 0x6d1cd420, 0x1d45e: 0x6d248620, 0x1d45f: 0x6c7f7e20, - 0x1d460: 0x6c8ff420, 0x1d461: 0x6cbd1620, 0x1d462: 0x6c88a220, 0x1d463: 0x6c800a20, - 0x1d464: 0x6cb95c20, 0x1d465: 0x6d272020, 0x1d466: 0x6d37e420, 0x1d467: 0x6cc20e20, - 0x1d468: 0x6c88a420, 0x1d469: 0x6c0b2820, 0x1d46a: 0x6c32ea20, 0x1d46b: 0x6d415a20, - 0x1d46c: 0x6c84d620, 0x1d46d: 0x6cd86220, 0x1d46e: 0x6c958e20, 0x1d46f: 0x6d1cde20, - 0x1d470: 0x6d273820, 0x1d471: 0x6d3df220, 0x1d472: 0x6d24ae20, 0x1d473: 0x6c9cd620, - 0x1d474: 0x6c2b5820, 0x1d475: 0x6c388a20, 0x1d476: 0x6ccfb020, 0x1d477: 0x6d302820, - 0x1d478: 0x6ccfc220, 0x1d479: 0x6caa7220, 0x1d47a: 0x6c50e220, 0x1d47b: 0x6c832420, - 0x1d47c: 0x6cfa8e20, 0x1d47d: 0x6d3efa20, 0x1d47e: 0x6ca5c620, 0x1d47f: 0x6c25b420, - // Block 0x752, offset 0x1d480 - 0x1d480: 0x6d2f4620, 0x1d481: 0x6cb8c020, 0x1d482: 0x6d2d5a20, 0x1d483: 0x6c08d220, - 0x1d484: 0x6c04c620, 0x1d485: 0x6cf4d820, 0x1d486: 0x6ccbde20, 0x1d487: 0x6c772a20, - 0x1d488: 0x6cc77620, 0x1d489: 0x6c3bba20, 0x1d48a: 0x6c096e20, 0x1d48b: 0x6c252620, - 0x1d48c: 0x6d1b9a20, 0x1d48d: 0x6d304020, 0x1d48e: 0x6c1b9020, 0x1d48f: 0x6cdf8620, - 0x1d490: 0x6c56fa20, 0x1d491: 0x6c033c20, 0x1d492: 0x6c85f820, 0x1d493: 0x6c419620, - 0x1d494: 0x6c722e20, 0x1d495: 0x6cb38420, 0x1d496: 0x6ca10c20, 0x1d497: 0x6c241020, - 0x1d498: 0x6d2d6e20, 0x1d499: 0x6d392220, 0x1d49a: 0x6c83c620, 0x1d49b: 0x6cdaac20, - 0x1d49c: 0x6ce5d620, 0x1d49d: 0x6c85fa20, 0x1d49e: 0x6cf62220, 0x1d49f: 0x6cdab620, - 0x1d4a0: 0x6c535020, 0x1d4a1: 0x6ce74c20, 0x1d4a2: 0x6d3e4420, 0x1d4a3: 0x6c12e020, - 0x1d4a4: 0x6d26bc20, 0x1d4a5: 0x6d388620, 0x1d4a6: 0x6c8bb820, 0x1d4a7: 0x6d3c1a20, - 0x1d4a8: 0x6c042220, 0x1d4a9: 0x6c81f620, 0x1d4aa: 0x6c3bda20, 0x1d4ab: 0x6c375820, - 0x1d4ac: 0x6cc10e20, 0x1d4ad: 0x6c521620, 0x1d4ae: 0x6c895a20, 0x1d4af: 0x6cfcd820, - 0x1d4b0: 0x6c3ea020, 0x1d4b1: 0x6c895c20, 0x1d4b2: 0x6c11fa20, 0x1d4b3: 0x6c6dc220, - 0x1d4b4: 0x6c851c20, 0x1d4b5: 0x6d26c620, 0x1d4b6: 0x6c929020, 0x1d4b7: 0x6c714020, - 0x1d4b8: 0x6cb61e20, 0x1d4b9: 0x6c254e20, 0x1d4ba: 0x6c045220, 0x1d4bb: 0x6d2ece20, - 0x1d4bc: 0x6c8bc620, 0x1d4bd: 0x6d402620, 0x1d4be: 0x6c6dcc20, 0x1d4bf: 0x6c4cc420, - // Block 0x753, offset 0x1d4c0 - 0x1d4c0: 0x6c57e020, 0x1d4c1: 0x6cca2220, 0x1d4c2: 0x6cca2620, 0x1d4c3: 0x6ce12a20, - 0x1d4c4: 0x6c0b4c20, 0x1d4c5: 0x6cc75c20, 0x1d4c6: 0x6c9e5c20, 0x1d4c7: 0x6c542620, - 0x1d4c8: 0x6d065220, 0x1d4c9: 0x6d402a20, 0x1d4ca: 0x6c56fe20, 0x1d4cb: 0x6c66be20, - 0x1d4cc: 0x6d294e20, 0x1d4cd: 0x6c225e20, 0x1d4ce: 0x6c843020, 0x1d4cf: 0x6d021a20, - 0x1d4d0: 0x6c3da020, 0x1d4d1: 0x6cab1220, 0x1d4d2: 0x6c076020, 0x1d4d3: 0x6c47d020, - 0x1d4d4: 0x6d052820, 0x1d4d5: 0x6c42e020, 0x1d4d6: 0x6ce13620, 0x1d4d7: 0x6cc0b220, - 0x1d4d8: 0x6c645620, 0x1d4d9: 0x6c126a20, 0x1d4da: 0x6d3c2420, 0x1d4db: 0x6ce14020, - 0x1d4dc: 0x6c9c7c20, 0x1d4dd: 0x6cca2c20, 0x1d4de: 0x6c3bf420, 0x1d4df: 0x6d2a2620, - 0x1d4e0: 0x6c775620, 0x1d4e1: 0x6c67fe20, 0x1d4e2: 0x6ca07e20, 0x1d4e3: 0x6cca3020, - 0x1d4e4: 0x6cca3220, 0x1d4e5: 0x6cab1c20, 0x1d4e6: 0x6cf70820, 0x1d4e7: 0x6c897420, - 0x1d4e8: 0x6c680820, 0x1d4e9: 0x6c7b4620, 0x1d4ea: 0x6c0ffa20, 0x1d4eb: 0x6c58b620, - 0x1d4ec: 0x6cd63620, 0x1d4ed: 0x6d403e20, 0x1d4ee: 0x6cfd4020, 0x1d4ef: 0x6cab2020, - 0x1d4f0: 0x6ce97020, 0x1d4f1: 0x6ca8b820, 0x1d4f2: 0x6c873020, 0x1d4f3: 0x6d42b220, - 0x1d4f4: 0x6c2bb820, 0x1d4f5: 0x6ca8ba20, 0x1d4f6: 0x6ce5e420, 0x1d4f7: 0x6c809820, - 0x1d4f8: 0x6c9d1a20, 0x1d4f9: 0x6cd7c020, 0x1d4fa: 0x6c6f5820, 0x1d4fb: 0x6cf83e20, - 0x1d4fc: 0x6c456620, 0x1d4fd: 0x6d331c20, 0x1d4fe: 0x6c6f5e20, 0x1d4ff: 0x6d201c20, - // Block 0x754, offset 0x1d500 - 0x1d500: 0x6c61b020, 0x1d501: 0x6c143a20, 0x1d502: 0x6d391020, 0x1d503: 0x6d09f020, - 0x1d504: 0x6d264a20, 0x1d505: 0x6c531c20, 0x1d506: 0x6d207e20, 0x1d507: 0x6c50e420, - 0x1d508: 0x6cecce20, 0x1d509: 0x6cc5d820, 0x1d50a: 0x6cf1d220, 0x1d50b: 0x6cf18c20, - 0x1d50c: 0x6cc03620, 0x1d50d: 0x6ca32820, 0x1d50e: 0x6d3e1c20, 0x1d50f: 0x6ce80c20, - 0x1d510: 0x6ca99020, 0x1d511: 0x6c3d1420, 0x1d512: 0x6c61d020, 0x1d513: 0x6cd4c020, - 0x1d514: 0x6c213c20, 0x1d515: 0x6caf5a20, 0x1d516: 0x6d323220, 0x1d517: 0x6ccbe020, - 0x1d518: 0x6c532e20, 0x1d519: 0x6d351220, 0x1d51a: 0x6c5ffe20, 0x1d51b: 0x6c3b2220, - 0x1d51c: 0x6d279e20, 0x1d51d: 0x6cc5de20, 0x1d51e: 0x6c283220, 0x1d51f: 0x6c6c4020, - 0x1d520: 0x6cda9420, 0x1d521: 0x6c39d220, 0x1d522: 0x6cdd5a20, 0x1d523: 0x6c252820, - 0x1d524: 0x6c6fb820, 0x1d525: 0x6d288c20, 0x1d526: 0x6c03f220, 0x1d527: 0x6c6c8c20, - 0x1d528: 0x6c3d6a20, 0x1d529: 0x6d35fe20, 0x1d52a: 0x6c229820, 0x1d52b: 0x6d3f1620, - 0x1d52c: 0x6c1da620, 0x1d52d: 0x6c533e20, 0x1d52e: 0x6d288e20, 0x1d52f: 0x6c833420, - 0x1d530: 0x6cf87a20, 0x1d531: 0x6c3e5c20, 0x1d532: 0x6d019a20, 0x1d533: 0x6ccfe020, - 0x1d534: 0x6c0e6c20, 0x1d535: 0x6d3ae820, 0x1d536: 0x6cc0fc20, 0x1d537: 0x6c8cf020, - 0x1d538: 0x6d3aea20, 0x1d539: 0x6cced620, 0x1d53a: 0x6c421e20, 0x1d53b: 0x6d101420, - 0x1d53c: 0x6c3e5e20, 0x1d53d: 0x6ceb1820, 0x1d53e: 0x6d31d420, 0x1d53f: 0x6c275e20, - // Block 0x755, offset 0x1d540 - 0x1d540: 0x6c1f3420, 0x1d541: 0x6cd1b420, 0x1d542: 0x6d37b620, 0x1d543: 0x6cfb4e20, - 0x1d544: 0x6d411a20, 0x1d545: 0x6c6ede20, 0x1d546: 0x6c04f820, 0x1d547: 0x6cc18c20, - 0x1d548: 0x6ca10e20, 0x1d549: 0x6cd5c620, 0x1d54a: 0x6d41ac20, 0x1d54b: 0x6c7c2c20, - 0x1d54c: 0x6c6db020, 0x1d54d: 0x6cc5f220, 0x1d54e: 0x6c4f7c20, 0x1d54f: 0x6d01b220, - 0x1d550: 0x6c6ad620, 0x1d551: 0x6d39a820, 0x1d552: 0x6c1db420, 0x1d553: 0x6c48b620, - 0x1d554: 0x6c042420, 0x1d555: 0x6c745420, 0x1d556: 0x6c7bf620, 0x1d557: 0x6c556220, - 0x1d558: 0x6c22c620, 0x1d559: 0x6c587820, 0x1d55a: 0x6c44d220, 0x1d55b: 0x6ce1c820, - 0x1d55c: 0x6c6ad820, 0x1d55d: 0x6c7a9a20, 0x1d55e: 0x6c68fc20, 0x1d55f: 0x6cc2f620, - 0x1d560: 0x6c411620, 0x1d561: 0x6c960620, 0x1d562: 0x6d089620, 0x1d563: 0x6c07ee20, - 0x1d564: 0x6cfcc620, 0x1d565: 0x6c3e8620, 0x1d566: 0x6c449420, 0x1d567: 0x6c307a20, - 0x1d568: 0x6cc67a20, 0x1d569: 0x6ce5d820, 0x1d56a: 0x6d19e420, 0x1d56b: 0x6c82c220, - 0x1d56c: 0x6d01b420, 0x1d56d: 0x6c736820, 0x1d56e: 0x6d06e020, 0x1d56f: 0x6c40f820, - 0x1d570: 0x6c2eae20, 0x1d571: 0x6ce7ba20, 0x1d572: 0x6cd7ea20, 0x1d573: 0x6c67e820, - 0x1d574: 0x6cfdc420, 0x1d575: 0x6c5bc820, 0x1d576: 0x6c745620, 0x1d577: 0x6d346820, - 0x1d578: 0x6c65b420, 0x1d579: 0x6c737620, 0x1d57a: 0x6c1ac020, 0x1d57b: 0x6c9e2c20, - 0x1d57c: 0x6d31e820, 0x1d57d: 0x6c939e20, 0x1d57e: 0x6c1a1020, 0x1d57f: 0x6cc07a20, - // Block 0x756, offset 0x1d580 - 0x1d580: 0x6cd4ec20, 0x1d581: 0x6c055020, 0x1d582: 0x6ce7bc20, 0x1d583: 0x6cfedc20, - 0x1d584: 0x6c588020, 0x1d585: 0x6cbd3620, 0x1d586: 0x6c451220, 0x1d587: 0x6d052620, - 0x1d588: 0x6ce34c20, 0x1d589: 0x6ce82e20, 0x1d58a: 0x6d00c020, 0x1d58b: 0x6c536420, - 0x1d58c: 0x6cf8a420, 0x1d58d: 0x6c3ea220, 0x1d58e: 0x6ce64620, 0x1d58f: 0x6cdbcc20, - 0x1d590: 0x6c335220, 0x1d591: 0x6c7db620, 0x1d592: 0x6c3d8020, 0x1d593: 0x6c6dc420, - 0x1d594: 0x6c56a620, 0x1d595: 0x6d33f820, 0x1d596: 0x6d0ca020, 0x1d597: 0x6c6f1c20, - 0x1d598: 0x6c3cb020, 0x1d599: 0x6c622020, 0x1d59a: 0x6d077420, 0x1d59b: 0x6cc60c20, - 0x1d59c: 0x6d3faa20, 0x1d59d: 0x6c187820, 0x1d59e: 0x6c34a420, 0x1d59f: 0x6c865020, - 0x1d5a0: 0x6c93ec20, 0x1d5a1: 0x6c896020, 0x1d5a2: 0x6c1dcc20, 0x1d5a3: 0x6cc36420, - 0x1d5a4: 0x6ccede20, 0x1d5a5: 0x6cb62020, 0x1d5a6: 0x6cb62220, 0x1d5a7: 0x6d3ce020, - 0x1d5a8: 0x6cb62420, 0x1d5a9: 0x6ced3420, 0x1d5aa: 0x6cba6a20, 0x1d5ab: 0x6cfcec20, - 0x1d5ac: 0x6cd47420, 0x1d5ad: 0x6cef2220, 0x1d5ae: 0x6cb70e20, 0x1d5af: 0x6ce23020, - 0x1d5b0: 0x6ced3620, 0x1d5b1: 0x6c428c20, 0x1d5b2: 0x6cee3020, 0x1d5b3: 0x6c080420, - 0x1d5b4: 0x6d3cc620, 0x1d5b5: 0x6c113a20, 0x1d5b6: 0x6c4cc620, 0x1d5b7: 0x6c255020, - 0x1d5b8: 0x6c950420, 0x1d5b9: 0x6c8f1020, 0x1d5ba: 0x6cb71020, 0x1d5bb: 0x6d2e6e20, - 0x1d5bc: 0x6c0a0820, 0x1d5bd: 0x6c21cc20, 0x1d5be: 0x6c8d3c20, 0x1d5bf: 0x6c9dca20, - // Block 0x757, offset 0x1d5c0 - 0x1d5c0: 0x6cb51420, 0x1d5c1: 0x6cbcd820, 0x1d5c2: 0x6ce4b420, 0x1d5c3: 0x6d3fac20, - 0x1d5c4: 0x6c4bd820, 0x1d5c5: 0x6d405e20, 0x1d5c6: 0x6cf67c20, 0x1d5c7: 0x6d3e6a20, - 0x1d5c8: 0x6d043220, 0x1d5c9: 0x6c899a20, 0x1d5ca: 0x6c6ca420, 0x1d5cb: 0x6c3a1220, - 0x1d5cc: 0x6cc8a020, 0x1d5cd: 0x6c9f7220, 0x1d5ce: 0x6d239e20, 0x1d5cf: 0x6d400420, - 0x1d5d0: 0x6c38ae20, 0x1d5d1: 0x6c93ee20, 0x1d5d2: 0x6d071620, 0x1d5d3: 0x6d1bd820, - 0x1d5d4: 0x6cce5620, 0x1d5d5: 0x6cb81820, 0x1d5d6: 0x6d073020, 0x1d5d7: 0x6cfd8820, - 0x1d5d8: 0x6c64dc20, 0x1d5d9: 0x6c78ce20, 0x1d5da: 0x6cfcfe20, 0x1d5db: 0x6cc87620, - 0x1d5dc: 0x6c9dcc20, 0x1d5dd: 0x6c5f1c20, 0x1d5de: 0x6c32d820, 0x1d5df: 0x6c1d1e20, - 0x1d5e0: 0x6c2c9420, 0x1d5e1: 0x6c9f7820, 0x1d5e2: 0x6c9e7c20, 0x1d5e3: 0x6d259c20, - 0x1d5e4: 0x6d01fe20, 0x1d5e5: 0x6c060e20, 0x1d5e6: 0x6cd82020, 0x1d5e7: 0x6cbfc020, - 0x1d5e8: 0x6c0b0220, 0x1d5e9: 0x6c58dc20, 0x1d5ea: 0x6c44d820, 0x1d5eb: 0x6c234620, - 0x1d5ec: 0x6c9e3820, 0x1d5ed: 0x6cf0c420, 0x1d5ee: 0x6c403620, 0x1d5ef: 0x6cf00620, - 0x1d5f0: 0x6ce7f420, 0x1d5f1: 0x6c465a20, 0x1d5f2: 0x6c9e9c20, 0x1d5f3: 0x6d00de20, - 0x1d5f4: 0x6c891220, 0x1d5f5: 0x6d3fb620, 0x1d5f6: 0x6c0bb620, 0x1d5f7: 0x6d284a20, - 0x1d5f8: 0x6d19fc20, 0x1d5f9: 0x6ce36820, 0x1d5fa: 0x6c486c20, 0x1d5fb: 0x6d36ea20, - 0x1d5fc: 0x6d284c20, 0x1d5fd: 0x6c198c20, 0x1d5fe: 0x6c152020, 0x1d5ff: 0x6c278c20, - // Block 0x758, offset 0x1d600 - 0x1d600: 0x6cf9ea20, 0x1d601: 0x6d259e20, 0x1d602: 0x6d400620, 0x1d603: 0x6d05da20, - 0x1d604: 0x6d1d6a20, 0x1d605: 0x6cf14420, 0x1d606: 0x6c44da20, 0x1d607: 0x6d07c220, - 0x1d608: 0x6d1c9c20, 0x1d609: 0x6c6d5220, 0x1d60a: 0x6d18ae20, 0x1d60b: 0x6d3ca220, - 0x1d60c: 0x6ca6c020, 0x1d60d: 0x6c053c20, 0x1d60e: 0x6c47c820, 0x1d60f: 0x6cac7220, - 0x1d610: 0x6d395420, 0x1d611: 0x6c64fc20, 0x1d612: 0x6c220a20, 0x1d613: 0x6cc31620, - 0x1d614: 0x6cd6e020, 0x1d615: 0x6d276620, 0x1d616: 0x6cf9f220, 0x1d617: 0x6c24ea20, - 0x1d618: 0x6cf6d220, 0x1d619: 0x6cc6a620, 0x1d61a: 0x6ce1ea20, 0x1d61b: 0x6c405420, - 0x1d61c: 0x6d27ca20, 0x1d61d: 0x6c188820, 0x1d61e: 0x6c432020, 0x1d61f: 0x6cc82820, - 0x1d620: 0x6c55b820, 0x1d621: 0x6d294620, 0x1d622: 0x6ce2b420, 0x1d623: 0x6cfd1020, - 0x1d624: 0x6cdb1e20, 0x1d625: 0x6d31fc20, 0x1d626: 0x6d403420, 0x1d627: 0x6ce1ec20, - 0x1d628: 0x6c5a8420, 0x1d629: 0x6c114a20, 0x1d62a: 0x6c0a5820, 0x1d62b: 0x6c3cf620, - 0x1d62c: 0x6c246a20, 0x1d62d: 0x6c844620, 0x1d62e: 0x6cdd4220, 0x1d62f: 0x6d0ddc20, - 0x1d630: 0x6cf81820, 0x1d631: 0x6d403820, 0x1d632: 0x6c826420, 0x1d633: 0x6c739820, - 0x1d634: 0x6cba8220, 0x1d635: 0x6c980820, 0x1d636: 0x6d34a420, 0x1d637: 0x6c93bc20, - 0x1d638: 0x6ca2b220, 0x1d639: 0x6cb1a020, 0x1d63a: 0x6c885220, 0x1d63b: 0x6c9c8020, - 0x1d63c: 0x6d08bc20, 0x1d63d: 0x6d400a20, 0x1d63e: 0x6c5f5820, 0x1d63f: 0x6ccd1220, - // Block 0x759, offset 0x1d640 - 0x1d640: 0x6cdc8e20, 0x1d641: 0x6c38ca20, 0x1d642: 0x6c940620, 0x1d643: 0x6c083020, - 0x1d644: 0x6d141e20, 0x1d645: 0x6ccac220, 0x1d646: 0x6ca1ec20, 0x1d647: 0x6d114c20, - 0x1d648: 0x6cbb4a20, 0x1d649: 0x6c5d0220, 0x1d64a: 0x6cfd5a20, 0x1d64b: 0x6c629a20, - 0x1d64c: 0x6ccc8620, 0x1d64d: 0x6d055220, 0x1d64e: 0x6cc49420, 0x1d64f: 0x6d08be20, - 0x1d650: 0x6cdca020, 0x1d651: 0x6cbbc020, 0x1d652: 0x6d2b9e20, 0x1d653: 0x6d427020, - 0x1d654: 0x6d341e20, 0x1d655: 0x6ccdca20, 0x1d656: 0x6cca3420, 0x1d657: 0x6c8bf020, - 0x1d658: 0x6d243820, 0x1d659: 0x6c386220, 0x1d65a: 0x6c8a3820, 0x1d65b: 0x6c21e020, - 0x1d65c: 0x6d41f820, 0x1d65d: 0x6c66f220, 0x1d65e: 0x6cc54a20, 0x1d65f: 0x6c15f020, - 0x1d660: 0x6cc8b620, 0x1d661: 0x6d055620, 0x1d662: 0x6c5c6e20, 0x1d663: 0x6c57ca20, - 0x1d664: 0x6d414a20, 0x1d665: 0x6cf70a20, 0x1d666: 0x6cbb4e20, 0x1d667: 0x6d287c20, - 0x1d668: 0x6c270220, 0x1d669: 0x6cd12620, 0x1d66a: 0x6c5c7e20, 0x1d66b: 0x6cf91620, - 0x1d66c: 0x6ccb8020, 0x1d66d: 0x6c660020, 0x1d66e: 0x6c679220, 0x1d66f: 0x6c58b820, - 0x1d670: 0x6d2a5e20, 0x1d671: 0x6c236e20, 0x1d672: 0x6d026020, 0x1d673: 0x6c695a20, - 0x1d674: 0x6c0aa820, 0x1d675: 0x6c28de20, 0x1d676: 0x6d191020, 0x1d677: 0x6ca9ec20, - 0x1d678: 0x6cdca220, 0x1d679: 0x6d191220, 0x1d67a: 0x6ccc9a20, 0x1d67b: 0x6d060420, - 0x1d67c: 0x6c62cc20, 0x1d67d: 0x6c0d6c20, 0x1d67e: 0x6cba3020, 0x1d67f: 0x6c7fee20, - // Block 0x75a, offset 0x1d680 - 0x1d680: 0x6cb47020, 0x1d681: 0x6d09c620, 0x1d682: 0x6d415420, 0x1d683: 0x6cb69620, - 0x1d684: 0x6caee820, 0x1d685: 0x6d124620, 0x1d686: 0x6ca19a20, 0x1d687: 0x6c835c20, - 0x1d688: 0x6d012820, 0x1d689: 0x6d415620, 0x1d68a: 0x6c7c1a20, 0x1d68b: 0x6d1ed220, - 0x1d68c: 0x6d076220, 0x1d68d: 0x6c828420, 0x1d68e: 0x6cfb0420, 0x1d68f: 0x6c156220, - 0x1d690: 0x6c69f220, 0x1d691: 0x6c919620, 0x1d692: 0x6c156a20, 0x1d693: 0x6d1c4020, - 0x1d694: 0x6c111820, 0x1d695: 0x6cc51620, 0x1d696: 0x6cfb1620, 0x1d697: 0x6d418620, - 0x1d698: 0x6d415c20, 0x1d699: 0x6c965220, 0x1d69a: 0x6c84e020, 0x1d69b: 0x6c2a5220, - 0x1d69c: 0x6c806a20, 0x1d69d: 0x6c82ac20, 0x1d69e: 0x6c894020, 0x1d69f: 0x6cd7b620, - 0x1d6a0: 0x6c6f4620, 0x1d6a1: 0x6d207420, 0x1d6a2: 0x6c52ee20, 0x1d6a3: 0x6d38f420, - 0x1d6a4: 0x6cfa7420, 0x1d6a5: 0x6c436a20, 0x1d6a6: 0x6d264820, 0x1d6a7: 0x6c5fce20, - 0x1d6a8: 0x6cecbc20, 0x1d6a9: 0x6c7bda20, 0x1d6aa: 0x6c617a20, 0x1d6ab: 0x6cc5b820, - 0x1d6ac: 0x6cef8820, 0x1d6ad: 0x6d278220, 0x1d6ae: 0x6c52fc20, 0x1d6af: 0x6c213420, - 0x1d6b0: 0x6caf2c20, 0x1d6b1: 0x6ccbca20, 0x1d6b2: 0x6c425820, 0x1d6b3: 0x6ca30820, - 0x1d6b4: 0x6cc5c620, 0x1d6b5: 0x6d401620, 0x1d6b6: 0x6c94dc20, 0x1d6b7: 0x6c3b1220, - 0x1d6b8: 0x6d34ec20, 0x1d6b9: 0x6cf17e20, 0x1d6ba: 0x6c39c220, 0x1d6bb: 0x6d3aa420, - 0x1d6bc: 0x6d321420, 0x1d6bd: 0x6ca97c20, 0x1d6be: 0x6cd4a020, 0x1d6bf: 0x6cfc8220, - // Block 0x75b, offset 0x1d6c0 - 0x1d6c0: 0x6c421220, 0x1d6c1: 0x6d016620, 0x1d6c2: 0x6c3dfa20, 0x1d6c3: 0x6c88e420, - 0x1d6c4: 0x6d410c20, 0x1d6c5: 0x6ccfb220, 0x1d6c6: 0x6cf84e20, 0x1d6c7: 0x6d33a020, - 0x1d6c8: 0x6d37a020, 0x1d6c9: 0x6d390420, 0x1d6ca: 0x6c04ec20, 0x1d6cb: 0x6c3dfc20, - 0x1d6cc: 0x6c1f1420, 0x1d6cd: 0x6ccec820, 0x1d6ce: 0x6d16ce20, 0x1d6cf: 0x6c6d9220, - 0x1d6d0: 0x6c273820, 0x1d6d1: 0x6c054a20, 0x1d6d2: 0x6cc65a20, 0x1d6d3: 0x6c6a9820, - 0x1d6d4: 0x6c7a8620, 0x1d6d5: 0x6cc54620, 0x1d6d6: 0x6c2e7620, 0x1d6d7: 0x6c4f6420, - 0x1d6d8: 0x6c5b9e20, 0x1d6d9: 0x6c449220, 0x1d6da: 0x6d087c20, 0x1d6db: 0x6c67dc20, - 0x1d6dc: 0x6c95ea20, 0x1d6dd: 0x6c740420, 0x1d6de: 0x6c68d620, 0x1d6df: 0x6ce7ae20, - 0x1d6e0: 0x6c450020, 0x1d6e1: 0x6cfea820, 0x1d6e2: 0x6c735020, 0x1d6e3: 0x6d053620, - 0x1d6e4: 0x6cf87220, 0x1d6e5: 0x6cdbf020, 0x1d6e6: 0x6ce1c020, 0x1d6e7: 0x6c61d220, - 0x1d6e8: 0x6ce31820, 0x1d6e9: 0x6c5eb820, 0x1d6ea: 0x6d06be20, 0x1d6eb: 0x6c8cf220, - 0x1d6ec: 0x6d1bb220, 0x1d6ed: 0x6d06c020, 0x1d6ee: 0x6cb6f620, 0x1d6ef: 0x6c39fc20, - 0x1d6f0: 0x6c21b820, 0x1d6f1: 0x6cce5220, 0x1d6f2: 0x6c4bc220, 0x1d6f3: 0x6cd11e20, - 0x1d6f4: 0x6cef0420, 0x1d6f5: 0x6c9dc020, 0x1d6f6: 0x6cd46820, 0x1d6f7: 0x6c081a20, - 0x1d6f8: 0x6c1da820, 0x1d6f9: 0x6ce22220, 0x1d6fa: 0x6c8f0620, 0x1d6fb: 0x6cc35a20, - 0x1d6fc: 0x6d3f7820, 0x1d6fd: 0x6d2e5c20, 0x1d6fe: 0x6ced0c20, 0x1d6ff: 0x6c93d820, - // Block 0x75c, offset 0x1d700 - 0x1d700: 0x6d3cc420, 0x1d701: 0x6d3e2820, 0x1d702: 0x6c78b420, 0x1d703: 0x6cfd7820, - 0x1d704: 0x6c64a420, 0x1d705: 0x6c9e2820, 0x1d706: 0x6c802a20, 0x1d707: 0x6ce33020, - 0x1d708: 0x6c9e9420, 0x1d709: 0x6c5eda20, 0x1d70a: 0x6d275020, 0x1d70b: 0x6c5bca20, - 0x1d70c: 0x6cd7ec20, 0x1d70d: 0x6c348620, 0x1d70e: 0x6c32c420, 0x1d70f: 0x6c0ba020, - 0x1d710: 0x6cfcc820, 0x1d711: 0x6c464a20, 0x1d712: 0x6d3c8a20, 0x1d713: 0x6c58d820, - 0x1d714: 0x6c2c5e20, 0x1d715: 0x6c93a020, 0x1d716: 0x6c0af620, 0x1d717: 0x6c9f5820, - 0x1d718: 0x6d256820, 0x1d719: 0x6c6d1c20, 0x1d71a: 0x6c401020, 0x1d71b: 0x6cc81e20, - 0x1d71c: 0x6d31ea20, 0x1d71d: 0x6c3ce620, 0x1d71e: 0x6c24ce20, 0x1d71f: 0x6c430c20, - 0x1d720: 0x6c150420, 0x1d721: 0x6c83f020, 0x1d722: 0x6d17fc20, 0x1d723: 0x6c64be20, - 0x1d724: 0x6c0d4020, 0x1d725: 0x6cb15a20, 0x1d726: 0x6c97f020, 0x1d727: 0x6c824820, - 0x1d728: 0x6d1bda20, 0x1d729: 0x6cdd2e20, 0x1d72a: 0x6ca1d820, 0x1d72b: 0x6ccaba20, - 0x1d72c: 0x6d00e020, 0x1d72d: 0x6c8a1420, 0x1d72e: 0x6ccda220, 0x1d72f: 0x6d2b8c20, - 0x1d730: 0x6c677a20, 0x1d731: 0x6cba2420, 0x1d732: 0x6cbbb220, 0x1d733: 0x6c589a20, - 0x1d734: 0x6c694620, 0x1d735: 0x6d415020, 0x1d736: 0x6c3d1a20, 0x1d737: 0x6d016820, - 0x1d738: 0x6c426820, 0x1d739: 0x6c3d2420, 0x1d73a: 0x6cc38a20, 0x1d73b: 0x6c3d2620, - 0x1d73c: 0x6cb81020, 0x1d73d: 0x6c0e6e20, 0x1d73e: 0x6cb2ac20, 0x1d73f: 0x6cfe3420, - // Block 0x75d, offset 0x1d740 - 0x1d740: 0x6d2ff620, 0x1d741: 0x6c428e20, 0x1d742: 0x6d1bdc20, 0x1d743: 0x6d1bea20, - 0x1d744: 0x6cbee020, 0x1d745: 0x6cfa4c20, 0x1d746: 0x6c49aa20, 0x1d747: 0x6d41fa20, - 0x1d748: 0x6ce02a20, 0x1d749: 0x6c126020, 0x1d74a: 0x6cb7fe20, 0x1d74b: 0x6cf27620, - 0x1d74c: 0x6d1c2220, 0x1d74d: 0x6c828620, 0x1d74e: 0x6ce04820, 0x1d74f: 0x6c919820, - 0x1d750: 0x6c49c420, 0x1d751: 0x6cedf420, 0x1d752: 0x6cedf020, 0x1d753: 0x6c424e20, - 0x1d754: 0x6cedfe20, 0x1d755: 0x6c4e5020, 0x1d756: 0x6c953820, 0x1d757: 0x6c952c20, - 0x1d758: 0x6c3e2220, 0x1d759: 0x6c9c3a20, 0x1d75a: 0x6c380620, 0x1d75b: 0x6c470020, - 0x1d75c: 0x6d3a6020, 0x1d75d: 0x6c707220, 0x1d75e: 0x6c98d420, 0x1d75f: 0x6c477420, - 0x1d760: 0x6c9f4220, 0x1d761: 0x6c427220, 0x1d762: 0x6c03f420, 0x1d763: 0x6c48b220, - 0x1d764: 0x6ce33220, 0x1d765: 0x6c736a20, 0x1d766: 0x6c3e8820, 0x1d767: 0x6cd0b420, - 0x1d768: 0x6d0da820, 0x1d769: 0x6d2fc220, 0x1d76a: 0x6d41b820, 0x1d76b: 0x6c48b820, - 0x1d76c: 0x6d3d7220, 0x1d76d: 0x6d237620, 0x1d76e: 0x6d366620, 0x1d76f: 0x6c018e20, - 0x1d770: 0x6c382020, 0x1d771: 0x6c803420, 0x1d772: 0x6cd56220, 0x1d773: 0x6cd80620, - 0x1d774: 0x6cb00820, 0x1d775: 0x6c96da20, 0x1d776: 0x6c8f1620, 0x1d777: 0x6c03f820, - 0x1d778: 0x6c382420, 0x1d779: 0x6c844a20, 0x1d77a: 0x6c177e20, 0x1d77b: 0x6cf0d020, - 0x1d77c: 0x6c0a3420, 0x1d77d: 0x6c629c20, 0x1d77e: 0x6d2b9c20, 0x1d77f: 0x6c1ce620, - // Block 0x75e, offset 0x1d780 - 0x1d780: 0x6c8f2220, 0x1d781: 0x6c5f5a20, 0x1d782: 0x6c739e20, 0x1d783: 0x6c9da220, - 0x1d784: 0x6d2fec20, 0x1d785: 0x6c956220, 0x1d786: 0x6cb03220, 0x1d787: 0x6c5f9e20, - 0x1d788: 0x6c5fb020, 0x1d789: 0x6c946820, 0x1d78a: 0x6d0f7620, 0x1d78b: 0x6c9cde20, - 0x1d78c: 0x6cba9e20, 0x1d78d: 0x6c268820, 0x1d78e: 0x6c9a4e20, 0x1d78f: 0x6d0f9a20, - 0x1d790: 0x6d1fbc20, 0x1d791: 0x6d1fb420, 0x1d792: 0x6c3b6620, 0x1d793: 0x6c033e20, - 0x1d794: 0x6c42b820, 0x1d795: 0x6d104a20, 0x1d796: 0x6c477620, 0x1d797: 0x6cbaaa20, - 0x1d798: 0x6d29d620, 0x1d799: 0x6c42ba20, 0x1d79a: 0x6c8cf620, 0x1d79b: 0x6d176e20, - 0x1d79c: 0x6d3aee20, 0x1d79d: 0x6c2b2820, 0x1d79e: 0x6d04c820, 0x1d79f: 0x6cbb3c20, - 0x1d7a0: 0x6d14fa20, 0x1d7a1: 0x6cfcca20, 0x1d7a2: 0x6cc67c20, 0x1d7a3: 0x6cc44a20, - 0x1d7a4: 0x6cc44c20, 0x1d7a5: 0x6cbb4420, 0x1d7a6: 0x6c588220, 0x1d7a7: 0x6cdd2620, - 0x1d7a8: 0x6cfcdc20, 0x1d7a9: 0x6d17fe20, 0x1d7aa: 0x6d107a20, 0x1d7ab: 0x6cbad220, - 0x1d7ac: 0x6cb9c220, 0x1d7ad: 0x6d218820, 0x1d7ae: 0x6c44dc20, 0x1d7af: 0x6c6b2220, - 0x1d7b0: 0x6ce0cc20, 0x1d7b1: 0x6d25ac20, 0x1d7b2: 0x6cf6d420, 0x1d7b3: 0x6c38d820, - 0x1d7b4: 0x6ccd1a20, 0x1d7b5: 0x6c3ba220, 0x1d7b6: 0x6ccd1e20, 0x1d7b7: 0x6c88d820, - 0x1d7b8: 0x6c827420, 0x1d7b9: 0x6c44e420, 0x1d7ba: 0x6caa0820, 0x1d7bb: 0x6cbb5e20, - 0x1d7bc: 0x6c164620, 0x1d7bd: 0x6d221c20, 0x1d7be: 0x6c461020, 0x1d7bf: 0x6d170420, - // Block 0x75f, offset 0x1d7c0 - 0x1d7c0: 0x6c1cbe20, 0x1d7c1: 0x6cf22220, 0x1d7c2: 0x6c3b2420, 0x1d7c3: 0x6c533020, - 0x1d7c4: 0x6c1c0820, 0x1d7c5: 0x6c1c0a20, 0x1d7c6: 0x6c252a20, 0x1d7c7: 0x6c3e6020, - 0x1d7c8: 0x6cf9b220, 0x1d7c9: 0x6c079c20, 0x1d7ca: 0x6d177020, 0x1d7cb: 0x6c7e4220, - 0x1d7cc: 0x6d177220, 0x1d7cd: 0x6caf6220, 0x1d7ce: 0x6c8cf820, 0x1d7cf: 0x6c8f2e20, - 0x1d7d0: 0x6d360020, 0x1d7d1: 0x6cc18e20, 0x1d7d2: 0x6cf77a20, 0x1d7d3: 0x6d00ae20, - 0x1d7d4: 0x6cfdc620, 0x1d7d5: 0x6cf62420, 0x1d7d6: 0x6cf88e20, 0x1d7d7: 0x6c785020, - 0x1d7d8: 0x6cbc4620, 0x1d7d9: 0x6c5bcc20, 0x1d7da: 0x6c5aba20, 0x1d7db: 0x6cfecc20, - 0x1d7dc: 0x6ccc5e20, 0x1d7dd: 0x6c536620, 0x1d7de: 0x6c676c20, 0x1d7df: 0x6c2b7e20, - 0x1d7e0: 0x6c255220, 0x1d7e1: 0x6c3a6420, 0x1d7e2: 0x6c2a2620, 0x1d7e3: 0x6ccc6a20, - 0x1d7e4: 0x6c1c4a20, 0x1d7e5: 0x6d3b1620, 0x1d7e6: 0x6c65d220, 0x1d7e7: 0x6d07c420, - 0x1d7e8: 0x6c1c6220, 0x1d7e9: 0x6cb0fe20, 0x1d7ea: 0x6d3fb820, 0x1d7eb: 0x6cece620, - 0x1d7ec: 0x6c5aea20, 0x1d7ed: 0x6c542820, 0x1d7ee: 0x6c517420, 0x1d7ef: 0x6c51e820, - 0x1d7f0: 0x6c4f0a20, 0x1d7f1: 0x6c027220, 0x1d7f2: 0x6cb16820, 0x1d7f3: 0x6d18d020, - 0x1d7f4: 0x6c885420, 0x1d7f5: 0x6c543420, 0x1d7f6: 0x6c030820, 0x1d7f7: 0x6c8bf220, - 0x1d7f8: 0x6cae4820, 0x1d7f9: 0x6cbc6a20, 0x1d7fa: 0x6c027e20, 0x1d7fb: 0x6c386420, - 0x1d7fc: 0x6d18d220, 0x1d7fd: 0x6c5c8020, 0x1d7fe: 0x6d07e420, 0x1d7ff: 0x6c2a4a20, - // Block 0x760, offset 0x1d800 - 0x1d800: 0x6d124420, 0x1d801: 0x6c819a20, 0x1d802: 0x6c819820, 0x1d803: 0x6c779c20, - 0x1d804: 0x6c996620, 0x1d805: 0x6d30d220, 0x1d806: 0x6cb5a820, 0x1d807: 0x6c467a20, - 0x1d808: 0x6c468020, 0x1d809: 0x6c467c20, 0x1d80a: 0x6c2f3420, 0x1d80b: 0x6c2eb020, - 0x1d80c: 0x6c373020, 0x1d80d: 0x6cd64620, 0x1d80e: 0x6cc85620, 0x1d80f: 0x6ca3b220, - 0x1d810: 0x6ca3b420, 0x1d811: 0x6c329220, 0x1d812: 0x6c82b220, 0x1d813: 0x6ce63220, - 0x1d814: 0x6d3efc20, 0x1d815: 0x6c44c220, 0x1d816: 0x6c17b620, 0x1d817: 0x6c503220, - 0x1d818: 0x6d27a020, 0x1d819: 0x6c03b020, 0x1d81a: 0x6caf6420, 0x1d81b: 0x6d14ec20, - 0x1d81c: 0x6cd8bc20, 0x1d81d: 0x6cc26e20, 0x1d81e: 0x6c635220, 0x1d81f: 0x6c723220, - 0x1d820: 0x6c5d5620, 0x1d821: 0x6c1e8e20, 0x1d822: 0x6c81d420, 0x1d823: 0x6c951c20, - 0x1d824: 0x6c607020, 0x1d825: 0x6ce0c620, 0x1d826: 0x6cab8e20, 0x1d827: 0x6c90b420, - 0x1d828: 0x6caa2820, 0x1d829: 0x6c67be20, 0x1d82a: 0x6cad1e20, 0x1d82b: 0x6d2c5620, - 0x1d82c: 0x6c90be20, 0x1d82d: 0x6c5f7020, 0x1d82e: 0x6c81e420, 0x1d82f: 0x6c5e2e20, - 0x1d830: 0x6d1ed420, 0x1d831: 0x6ca1a020, 0x1d832: 0x6c580420, 0x1d833: 0x6c378420, - 0x1d834: 0x6d169620, 0x1d835: 0x6c2f5420, 0x1d836: 0x6d127420, 0x1d837: 0x6c264420, - 0x1d838: 0x6cd95820, 0x1d839: 0x6cbd6820, 0x1d83a: 0x6d27a220, 0x1d83b: 0x6c1b9420, - 0x1d83c: 0x6c27ca20, 0x1d83d: 0x6c27cc20, 0x1d83e: 0x6c533420, 0x1d83f: 0x6c450220, - // Block 0x761, offset 0x1d840 - 0x1d840: 0x6d344820, 0x1d841: 0x6cacb220, 0x1d842: 0x6ca80c20, 0x1d843: 0x6c27d420, - 0x1d844: 0x6d31d620, 0x1d845: 0x6c181a20, 0x1d846: 0x6c8cfa20, 0x1d847: 0x6d32ba20, - 0x1d848: 0x6d1fc220, 0x1d849: 0x6cec3020, 0x1d84a: 0x6c89e420, 0x1d84b: 0x6c8f8c20, - 0x1d84c: 0x6d345c20, 0x1d84d: 0x6ca90220, 0x1d84e: 0x6ce55e20, 0x1d84f: 0x6c375c20, - 0x1d850: 0x6d0bb420, 0x1d851: 0x6ce5f020, 0x1d852: 0x6c485e20, 0x1d853: 0x6d077220, - 0x1d854: 0x6c880420, 0x1d855: 0x6c504620, 0x1d856: 0x6cd16e20, 0x1d857: 0x6c8b1a20, - 0x1d858: 0x6cb24420, 0x1d859: 0x6c6dce20, 0x1d85a: 0x6c726c20, 0x1d85b: 0x6c08ee20, - 0x1d85c: 0x6c2bfe20, 0x1d85d: 0x6c4c7c20, 0x1d85e: 0x6cf1a220, 0x1d85f: 0x6d071a20, - 0x1d860: 0x6cb25820, 0x1d861: 0x6c232e20, 0x1d862: 0x6c2fc820, 0x1d863: 0x6ca5f820, - 0x1d864: 0x6ce68c20, 0x1d865: 0x6c71d020, 0x1d866: 0x6c234820, 0x1d867: 0x6c7c4220, - 0x1d868: 0x6c894420, 0x1d869: 0x6c7d1220, 0x1d86a: 0x6c234a20, 0x1d86b: 0x6c884020, - 0x1d86c: 0x6cf26020, 0x1d86d: 0x6c7d1420, 0x1d86e: 0x6c885820, 0x1d86f: 0x6c886820, - 0x1d870: 0x6c236620, 0x1d871: 0x6c027420, 0x1d872: 0x6cd11820, 0x1d873: 0x6cd96e20, - 0x1d874: 0x6ce64c20, 0x1d875: 0x6c7d2a20, 0x1d876: 0x6ca88820, 0x1d877: 0x6d34aa20, - 0x1d878: 0x6c281020, 0x1d879: 0x6ca93420, 0x1d87a: 0x6cbc8a20, 0x1d87b: 0x6ca65e20, - 0x1d87c: 0x6ce65220, 0x1d87d: 0x6ce65620, 0x1d87e: 0x6c8ff820, 0x1d87f: 0x6d22c620, - // Block 0x762, offset 0x1d880 - 0x1d880: 0x6d22b620, 0x1d881: 0x6d2fac20, 0x1d882: 0x6cd8ac20, 0x1d883: 0x6cda8220, - 0x1d884: 0x6d180020, 0x1d885: 0x6cdad820, 0x1d886: 0x6cd8ca20, 0x1d887: 0x6d2fcc20, - 0x1d888: 0x6d2fce20, 0x1d889: 0x6cc78220, 0x1d88a: 0x6d164c20, 0x1d88b: 0x6c81fe20, - 0x1d88c: 0x6c5e8020, 0x1d88d: 0x6cbffe20, 0x1d88e: 0x6c78f220, 0x1d88f: 0x6c12b620, - 0x1d890: 0x6c437020, 0x1d891: 0x6c0eb020, 0x1d892: 0x6c58f020, 0x1d893: 0x6c597a20, - 0x1d894: 0x6d15c220, 0x1d895: 0x6cc5c820, 0x1d896: 0x6cffd220, 0x1d897: 0x6cc7f620, - 0x1d898: 0x6d38d820, 0x1d899: 0x6d25fc20, 0x1d89a: 0x6c323820, 0x1d89b: 0x6c425a20, - 0x1d89c: 0x6cc65420, 0x1d89d: 0x6c416e20, 0x1d89e: 0x6c138020, 0x1d89f: 0x6cf2d220, - 0x1d8a0: 0x6c169820, 0x1d8a1: 0x6c476020, 0x1d8a2: 0x6d33a220, 0x1d8a3: 0x6c4dd620, - 0x1d8a4: 0x6c3d4420, 0x1d8a5: 0x6c3a3220, 0x1d8a6: 0x6c3b6420, 0x1d8a7: 0x6cadb220, - 0x1d8a8: 0x6cad2820, 0x1d8a9: 0x6c647020, 0x1d8aa: 0x6c39a820, 0x1d8ab: 0x6d3ccc20, - 0x1d8ac: 0x6d1f0220, 0x1d8ad: 0x6ca31420, 0x1d8ae: 0x6c01e820, 0x1d8af: 0x6c78f620, - 0x1d8b0: 0x6cc46420, 0x1d8b1: 0x6c456820, 0x1d8b2: 0x6d22da20, 0x1d8b3: 0x6cf1d020, - 0x1d8b4: 0x6d10d020, 0x1d8b5: 0x6cb58c20, 0x1d8b6: 0x6cafc020, 0x1d8b7: 0x6cb9f620, - 0x1d8b8: 0x6cf59220, 0x1d8b9: 0x6cf59420, 0x1d8ba: 0x6c3a8c20, 0x1d8bb: 0x6c78f820, - 0x1d8bc: 0x6c6e1220, 0x1d8bd: 0x6cdf6420, 0x1d8be: 0x6cd09020, 0x1d8bf: 0x6d37e620, - // Block 0x763, offset 0x1d8c0 - 0x1d8c0: 0x6d2f2820, 0x1d8c1: 0x6d007220, 0x1d8c2: 0x6cd09620, 0x1d8c3: 0x6cf07e20, - 0x1d8c4: 0x6d391220, 0x1d8c5: 0x6c2e7820, 0x1d8c6: 0x6c282c20, 0x1d8c7: 0x6c3a9020, - 0x1d8c8: 0x6c037220, 0x1d8c9: 0x6c0ec820, 0x1d8ca: 0x6cc17c20, 0x1d8cb: 0x6ce49420, - 0x1d8cc: 0x6c06f220, 0x1d8cd: 0x6c484a20, 0x1d8ce: 0x6cdf0420, 0x1d8cf: 0x6d3ef220, - 0x1d8d0: 0x6c7a3220, 0x1d8d1: 0x6d33b420, 0x1d8d2: 0x6ca68820, 0x1d8d3: 0x6cb28a20, - 0x1d8d4: 0x6d3f5420, 0x1d8d5: 0x6c3f4c20, 0x1d8d6: 0x6cad2a20, 0x1d8d7: 0x6d313020, - 0x1d8d8: 0x6cfb3820, 0x1d8d9: 0x6d428820, 0x1d8da: 0x6cadb820, 0x1d8db: 0x6c640820, - 0x1d8dc: 0x6cd15620, 0x1d8dd: 0x6d33b620, 0x1d8de: 0x6c05ac20, 0x1d8df: 0x6ca23620, - 0x1d8e0: 0x6cc0ee20, 0x1d8e1: 0x6c552e20, 0x1d8e2: 0x6c77ea20, 0x1d8e3: 0x6c1b8620, - 0x1d8e4: 0x6d1b4020, 0x1d8e5: 0x6d057a20, 0x1d8e6: 0x6d0f5220, 0x1d8e7: 0x6c8f7a20, - 0x1d8e8: 0x6c306620, 0x1d8e9: 0x6c761c20, 0x1d8ea: 0x6c914620, 0x1d8eb: 0x6c6e5c20, - 0x1d8ec: 0x6caa5820, 0x1d8ed: 0x6d0bea20, 0x1d8ee: 0x6cacd020, 0x1d8ef: 0x6c7ae820, - 0x1d8f0: 0x6d14d620, 0x1d8f1: 0x6c49e820, 0x1d8f2: 0x6c4d3e20, 0x1d8f3: 0x6c438220, - 0x1d8f4: 0x6c307020, 0x1d8f5: 0x6c1aa220, 0x1d8f6: 0x6c683e20, 0x1d8f7: 0x6d046420, - 0x1d8f8: 0x6d046620, 0x1d8f9: 0x6c374c20, 0x1d8fa: 0x6c01b020, 0x1d8fb: 0x6c526020, - 0x1d8fc: 0x6cb10a20, 0x1d8fd: 0x6ca5a420, 0x1d8fe: 0x6d3f5620, 0x1d8ff: 0x6c4a4c20, - // Block 0x764, offset 0x1d900 - 0x1d900: 0x6c19e220, 0x1d901: 0x6ce5c020, 0x1d902: 0x6d33ce20, 0x1d903: 0x6c252c20, - 0x1d904: 0x6c99e620, 0x1d905: 0x6d009220, 0x1d906: 0x6c252e20, 0x1d907: 0x6d009420, - 0x1d908: 0x6c972e20, 0x1d909: 0x6c972a20, 0x1d90a: 0x6c600420, 0x1d90b: 0x6d029e20, - 0x1d90c: 0x6ca8f020, 0x1d90d: 0x6c7b2020, 0x1d90e: 0x6cc97220, 0x1d90f: 0x6d2a0420, - 0x1d910: 0x6cb5aa20, 0x1d911: 0x6ca4e820, 0x1d912: 0x6c9cec20, 0x1d913: 0x6ca9b820, - 0x1d914: 0x6c943a20, 0x1d915: 0x6ced7c20, 0x1d916: 0x6c0ef420, 0x1d917: 0x6cf1d820, - 0x1d918: 0x6ced0e20, 0x1d919: 0x6d04d020, 0x1d91a: 0x6c68ea20, 0x1d91b: 0x6c6e7a20, - 0x1d91c: 0x6d1fc420, 0x1d91d: 0x6c524e20, 0x1d91e: 0x6c260820, 0x1d91f: 0x6c8b0820, - 0x1d920: 0x6cccdc20, 0x1d921: 0x6ce6c420, 0x1d922: 0x6c99f020, 0x1d923: 0x6c214420, - 0x1d924: 0x6cd0a220, 0x1d925: 0x6cba0420, 0x1d926: 0x6c2a9220, 0x1d927: 0x6c72ee20, - 0x1d928: 0x6c243820, 0x1d929: 0x6d04cc20, 0x1d92a: 0x6d032e20, 0x1d92b: 0x6ceac220, - 0x1d92c: 0x6cad3820, 0x1d92d: 0x6c19f220, 0x1d92e: 0x6ca56c20, 0x1d92f: 0x6cb43620, - 0x1d930: 0x6c311420, 0x1d931: 0x6ceac420, 0x1d932: 0x6ca7d620, 0x1d933: 0x6ca53e20, - 0x1d934: 0x6cb05a20, 0x1d935: 0x6c478220, 0x1d936: 0x6c954020, 0x1d937: 0x6c85fc20, - 0x1d938: 0x6c88b820, 0x1d939: 0x6d2f3020, 0x1d93a: 0x6c254020, 0x1d93b: 0x6c6a1c20, - 0x1d93c: 0x6c899420, 0x1d93d: 0x6cd6fc20, 0x1d93e: 0x6caff420, 0x1d93f: 0x6c0bfe20, - // Block 0x765, offset 0x1d940 - 0x1d940: 0x6c94fc20, 0x1d941: 0x6cb11020, 0x1d942: 0x6c82c420, 0x1d943: 0x6c7cfe20, - 0x1d944: 0x6c20d620, 0x1d945: 0x6c288c20, 0x1d946: 0x6ce4fa20, 0x1d947: 0x6ca57020, - 0x1d948: 0x6c6dbc20, 0x1d949: 0x6ca37a20, 0x1d94a: 0x6c7e7820, 0x1d94b: 0x6d12f420, - 0x1d94c: 0x6d0c0e20, 0x1d94d: 0x6cc5f420, 0x1d94e: 0x6cd0a420, 0x1d94f: 0x6c21c220, - 0x1d950: 0x6c3f7820, 0x1d951: 0x6c3f6a20, 0x1d952: 0x6c709620, 0x1d953: 0x6c3a3620, - 0x1d954: 0x6cbabc20, 0x1d955: 0x6ced8820, 0x1d956: 0x6c307c20, 0x1d957: 0x6caff620, - 0x1d958: 0x6c4c6e20, 0x1d959: 0x6d3f9220, 0x1d95a: 0x6c2fa820, 0x1d95b: 0x6cf2fe20, - 0x1d95c: 0x6c9a6020, 0x1d95d: 0x6ca5f420, 0x1d95e: 0x6d3bd020, 0x1d95f: 0x6c1c3420, - 0x1d960: 0x6c23f020, 0x1d961: 0x6c954820, 0x1d962: 0x6cab8020, 0x1d963: 0x6c2c6e20, - 0x1d964: 0x6c013c20, 0x1d965: 0x6d038220, 0x1d966: 0x6ca50420, 0x1d967: 0x6cd5ea20, - 0x1d968: 0x6cd69220, 0x1d969: 0x6ca42e20, 0x1d96a: 0x6d283c20, 0x1d96b: 0x6d380020, - 0x1d96c: 0x6cc78620, 0x1d96d: 0x6c366020, 0x1d96e: 0x6cc9ca20, 0x1d96f: 0x6ce8c820, - 0x1d970: 0x6d10ae20, 0x1d971: 0x6c669220, 0x1d972: 0x6cefe620, 0x1d973: 0x6c690e20, - 0x1d974: 0x6d213220, 0x1d975: 0x6c637220, 0x1d976: 0x6c32d020, 0x1d977: 0x6c09d820, - 0x1d978: 0x6c16b220, 0x1d979: 0x6c401220, 0x1d97a: 0x6cfcde20, 0x1d97b: 0x6ca6b020, - 0x1d97c: 0x6c9e2e20, 0x1d97d: 0x6cec3820, 0x1d97e: 0x6ce2a220, 0x1d97f: 0x6ce9e620, - // Block 0x766, offset 0x1d980 - 0x1d980: 0x6c055620, 0x1d981: 0x6cba1820, 0x1d982: 0x6c93a820, 0x1d983: 0x6cec3a20, - 0x1d984: 0x6cda3e20, 0x1d985: 0x6ce11c20, 0x1d986: 0x6cdaee20, 0x1d987: 0x6d3c9820, - 0x1d988: 0x6c441420, 0x1d989: 0x6d183220, 0x1d98a: 0x6c100a20, 0x1d98b: 0x6c89fa20, - 0x1d98c: 0x6c607220, 0x1d98d: 0x6cb00a20, 0x1d98e: 0x6d00d020, 0x1d98f: 0x6c42d020, - 0x1d990: 0x6c93b420, 0x1d991: 0x6c0d8420, 0x1d992: 0x6cab6c20, 0x1d993: 0x6c16c220, - 0x1d994: 0x6c92ae20, 0x1d995: 0x6c4c8220, 0x1d996: 0x6cace020, 0x1d997: 0x6c1fbc20, - 0x1d998: 0x6c0c1a20, 0x1d999: 0x6c67c020, 0x1d99a: 0x6c3d9220, 0x1d99b: 0x6ce12c20, - 0x1d99c: 0x6ca06e20, 0x1d99d: 0x6cf6ac20, 0x1d99e: 0x6d3b8e20, 0x1d99f: 0x6c93f820, - 0x1d9a0: 0x6c686e20, 0x1d9a1: 0x6d1d4420, 0x1d9a2: 0x6c936220, 0x1d9a3: 0x6d36be20, - 0x1d9a4: 0x6d098620, 0x1d9a5: 0x6c211e20, 0x1d9a6: 0x6c8c6620, 0x1d9a7: 0x6ce78e20, - 0x1d9a8: 0x6caec820, 0x1d9a9: 0x6ca6cc20, 0x1d9aa: 0x6c1fcc20, 0x1d9ab: 0x6c8a1e20, - 0x1d9ac: 0x6c256620, 0x1d9ad: 0x6c4a8e20, 0x1d9ae: 0x6cff1620, 0x1d9af: 0x6ce29020, - 0x1d9b0: 0x6c38c220, 0x1d9b1: 0x6d349a20, 0x1d9b2: 0x6c688020, 0x1d9b3: 0x6ccdb420, - 0x1d9b4: 0x6c550420, 0x1d9b5: 0x6c255c20, 0x1d9b6: 0x6cc90a20, 0x1d9b7: 0x6cfd8a20, - 0x1d9b8: 0x6cdc1020, 0x1d9b9: 0x6c3bf020, 0x1d9ba: 0x6d1c0020, 0x1d9bb: 0x6ccd1620, - 0x1d9bc: 0x6d3b5c20, 0x1d9bd: 0x6c284c20, 0x1d9be: 0x6c7b4020, 0x1d9bf: 0x6ca9d220, - // Block 0x767, offset 0x1d9c0 - 0x1d9c0: 0x6cea7020, 0x1d9c1: 0x6c886a20, 0x1d9c2: 0x6c0a7620, 0x1d9c3: 0x6d1dc020, - 0x1d9c4: 0x6c74cc20, 0x1d9c5: 0x6c1f8020, 0x1d9c6: 0x6d18d420, 0x1d9c7: 0x6c732c20, - 0x1d9c8: 0x6c7e9820, 0x1d9c9: 0x6c88ce20, 0x1d9ca: 0x6ccac420, 0x1d9cb: 0x6cea7420, - 0x1d9cc: 0x6c47da20, 0x1d9cd: 0x6cb67820, 0x1d9ce: 0x6c257c20, 0x1d9cf: 0x6c0d8e20, - 0x1d9d0: 0x6d09bc20, 0x1d9d1: 0x6ca53a20, 0x1d9d2: 0x6cf32020, 0x1d9d3: 0x6d2a0e20, - 0x1d9d4: 0x6cfd3420, 0x1d9d5: 0x6c0c4420, 0x1d9d6: 0x6d044020, 0x1d9d7: 0x6c7b5c20, - 0x1d9d8: 0x6c7eaa20, 0x1d9d9: 0x6d0c4220, 0x1d9da: 0x6c918820, 0x1d9db: 0x6c5e4220, - 0x1d9dc: 0x6d28a020, 0x1d9dd: 0x6c95cc20, 0x1d9de: 0x6cc21020, 0x1d9df: 0x6d2a1020, - 0x1d9e0: 0x6c946c20, 0x1d9e1: 0x6ca61e20, 0x1d9e2: 0x6d28aa20, 0x1d9e3: 0x6c189420, - 0x1d9e4: 0x6cb8b620, 0x1d9e5: 0x6cf2da20, 0x1d9e6: 0x6c4a2420, 0x1d9e7: 0x6d29e220, - 0x1d9e8: 0x6c8bea20, 0x1d9e9: 0x6c4a0e20, 0x1d9ea: 0x6d3f2a20, 0x1d9eb: 0x6c68c420, - 0x1d9ec: 0x6ca80e20, 0x1d9ed: 0x6c1e4020, 0x1d9ee: 0x6c620c20, 0x1d9ef: 0x6c42c820, - 0x1d9f0: 0x6c1e4420, 0x1d9f1: 0x6c9dce20, 0x1d9f2: 0x6ca87420, 0x1d9f3: 0x6d357020, - 0x1d9f4: 0x6d35c620, 0x1d9f5: 0x6c43f220, 0x1d9f6: 0x6c669420, 0x1d9f7: 0x6c2eb220, - 0x1d9f8: 0x6d33e420, 0x1d9f9: 0x6d04d820, 0x1d9fa: 0x6cdf3220, 0x1d9fb: 0x6d319820, - 0x1d9fc: 0x6c6fd020, 0x1d9fd: 0x6cfc8420, 0x1d9fe: 0x6d20ca20, 0x1d9ff: 0x6c138620, - // Block 0x768, offset 0x1da00 - 0x1da00: 0x6d11a420, 0x1da01: 0x6d20e820, 0x1da02: 0x6c1cc220, 0x1da03: 0x6cf89020, - 0x1da04: 0x6cf89220, 0x1da05: 0x6c700620, 0x1da06: 0x6d217a20, 0x1da07: 0x6d227220, - 0x1da08: 0x6d043820, 0x1da09: 0x6c71d420, 0x1da0a: 0x6c702a20, 0x1da0b: 0x6d035820, - 0x1da0c: 0x6ccf0620, 0x1da0d: 0x6ccf2820, 0x1da0e: 0x6ccf9620, 0x1da0f: 0x6c6fb220, - 0x1da10: 0x6cd36020, 0x1da11: 0x6cdfa420, 0x1da12: 0x6cd4e220, 0x1da13: 0x6cd3b620, - 0x1da14: 0x6ce50820, 0x1da15: 0x6ce0a420, 0x1da16: 0x6cb4b020, 0x1da17: 0x6cb4b220, - 0x1da18: 0x6c496420, 0x1da19: 0x6c57cc20, 0x1da1a: 0x6ce54020, 0x1da1b: 0x6c201620, - 0x1da1c: 0x6cd75220, 0x1da1d: 0x6cf9d820, 0x1da1e: 0x6cf45e20, 0x1da1f: 0x6d385220, - 0x1da20: 0x6c29be20, 0x1da21: 0x6c1ff420, 0x1da22: 0x6cccd620, 0x1da23: 0x6d15d420, - 0x1da24: 0x6c397c20, 0x1da25: 0x6cabc020, 0x1da26: 0x6cdf6a20, 0x1da27: 0x6c389420, - 0x1da28: 0x6c04c820, 0x1da29: 0x6c1ff620, 0x1da2a: 0x6c4f6c20, 0x1da2b: 0x6c39d420, - 0x1da2c: 0x6c047a20, 0x1da2d: 0x6c08d420, 0x1da2e: 0x6c934820, 0x1da2f: 0x6d37b020, - 0x1da30: 0x6c667220, 0x1da31: 0x6c122a20, 0x1da32: 0x6c8cfc20, 0x1da33: 0x6d3a1020, - 0x1da34: 0x6d2ac620, 0x1da35: 0x6c34f220, 0x1da36: 0x6c0ef620, 0x1da37: 0x6cfb5020, - 0x1da38: 0x6c447620, 0x1da39: 0x6c1ff820, 0x1da3a: 0x6cf9b420, 0x1da3b: 0x6c914e20, - 0x1da3c: 0x6cbf2e20, 0x1da3d: 0x6cacfc20, 0x1da3e: 0x6cf62a20, 0x1da3f: 0x6c7af420, - // Block 0x769, offset 0x1da40 - 0x1da40: 0x6c3ea420, 0x1da41: 0x6d2a8620, 0x1da42: 0x6c3cb220, 0x1da43: 0x6c83f220, - 0x1da44: 0x6cce7820, 0x1da45: 0x6d216420, 0x1da46: 0x6c80d220, 0x1da47: 0x6ce6ce20, - 0x1da48: 0x6d237820, 0x1da49: 0x6cefe820, 0x1da4a: 0x6c0f3220, 0x1da4b: 0x6c9be020, - 0x1da4c: 0x6ca76c20, 0x1da4d: 0x6c70b420, 0x1da4e: 0x6c59f420, 0x1da4f: 0x6cd44a20, - 0x1da50: 0x6c78d020, 0x1da51: 0x6c0bb820, 0x1da52: 0x6ca2a620, 0x1da53: 0x6c2ede20, - 0x1da54: 0x6c315c20, 0x1da55: 0x6c059020, 0x1da56: 0x6c13ae20, 0x1da57: 0x6d18b220, - 0x1da58: 0x6cd9d820, 0x1da59: 0x6c123a20, 0x1da5a: 0x6c129c20, 0x1da5b: 0x6c90c020, - 0x1da5c: 0x6c279820, 0x1da5d: 0x6d098a20, 0x1da5e: 0x6d123420, 0x1da5f: 0x6c1cee20, - 0x1da60: 0x6c2b0820, 0x1da61: 0x6c291c20, 0x1da62: 0x6cbb2c20, 0x1da63: 0x6c91f620, - 0x1da64: 0x6d162220, 0x1da65: 0x6c60e020, 0x1da66: 0x6c670e20, 0x1da67: 0x6c5e3020, - 0x1da68: 0x6c9b8620, 0x1da69: 0x6cb69820, 0x1da6a: 0x6c91fe20, 0x1da6b: 0x6c919a20, - 0x1da6c: 0x6c157220, 0x1da6d: 0x6cd6c020, 0x1da6e: 0x6c449e20, 0x1da6f: 0x6c894620, - 0x1da70: 0x6c647220, 0x1da71: 0x6c650020, 0x1da72: 0x6ccb1420, 0x1da73: 0x6d0e5420, - 0x1da74: 0x6c3e6820, 0x1da75: 0x6cb25a20, 0x1da76: 0x6d0eea20, 0x1da77: 0x6d0f1c20, - 0x1da78: 0x6c12aa20, 0x1da79: 0x6c12c020, 0x1da7a: 0x6d164220, 0x1da7b: 0x6c821220, - 0x1da7c: 0x6ce62820, 0x1da7d: 0x6c681e20, 0x1da7e: 0x6c008420, 0x1da7f: 0x6ca39020, - // Block 0x76a, offset 0x1da80 - 0x1da80: 0x6ce56820, 0x1da81: 0x6c682020, 0x1da82: 0x6c6a5a20, 0x1da83: 0x6cae8c20, - 0x1da84: 0x6cecbe20, 0x1da85: 0x6d167020, 0x1da86: 0x6c145e20, 0x1da87: 0x6c9db820, - 0x1da88: 0x6c9cd820, 0x1da89: 0x6c416220, 0x1da8a: 0x6cb89e20, 0x1da8b: 0x6d22c820, - 0x1da8c: 0x6d22ca20, 0x1da8d: 0x6cce9620, 0x1da8e: 0x6cbeee20, 0x1da8f: 0x6c323020, - 0x1da90: 0x6c564c20, 0x1da91: 0x6cb6ce20, 0x1da92: 0x6c982c20, 0x1da93: 0x6d3f2e20, - 0x1da94: 0x6c5ba020, 0x1da95: 0x6cdbaa20, 0x1da96: 0x6d357220, 0x1da97: 0x6cfd6020, - 0x1da98: 0x6cafb020, 0x1da99: 0x6c3ddc20, 0x1da9a: 0x6cea4220, 0x1da9b: 0x6cef8a20, - 0x1da9c: 0x6cf3a820, 0x1da9d: 0x6d338420, 0x1da9e: 0x6cb73e20, 0x1da9f: 0x6cccbe20, - 0x1daa0: 0x6cf18020, 0x1daa1: 0x6cba3e20, 0x1daa2: 0x6cc56e20, 0x1daa3: 0x6c3dde20, - 0x1daa4: 0x6c79b620, 0x1daa5: 0x6c6bba20, 0x1daa6: 0x6c913620, 0x1daa7: 0x6d067420, - 0x1daa8: 0x6c5e8220, 0x1daa9: 0x6cbd5420, 0x1daaa: 0x6cb57620, 0x1daab: 0x6d0c5a20, - 0x1daac: 0x6c3b1420, 0x1daad: 0x6c032020, 0x1daae: 0x6cc8c020, 0x1daaf: 0x6d02ac20, - 0x1dab0: 0x6c618a20, 0x1dab1: 0x6c570620, 0x1dab2: 0x6c570820, 0x1dab3: 0x6c398620, - 0x1dab4: 0x6cf4ae20, 0x1dab5: 0x6c73e420, 0x1dab6: 0x6c466c20, 0x1dab7: 0x6d34ee20, - 0x1dab8: 0x6d278420, 0x1dab9: 0x6cbd5620, 0x1daba: 0x6c029e20, 0x1dabb: 0x6c1e7820, - 0x1dabc: 0x6c994620, 0x1dabd: 0x6d0b1420, 0x1dabe: 0x6c3a8020, 0x1dabf: 0x6cc63220, - // Block 0x76b, offset 0x1dac0 - 0x1dac0: 0x6c4f5a20, 0x1dac1: 0x6c22fc20, 0x1dac2: 0x6d1a2a20, 0x1dac3: 0x6d1fa220, - 0x1dac4: 0x6c0b7420, 0x1dac5: 0x6d169a20, 0x1dac6: 0x6cbd1020, 0x1dac7: 0x6cef8c20, - 0x1dac8: 0x6c858420, 0x1dac9: 0x6cb05420, 0x1daca: 0x6c35d420, 0x1dacb: 0x6cfc7c20, - 0x1dacc: 0x6c169a20, 0x1dacd: 0x6c122420, 0x1dace: 0x6d3aa620, 0x1dacf: 0x6cda4820, - 0x1dad0: 0x6ce30e20, 0x1dad1: 0x6d260220, 0x1dad2: 0x6cc4ae20, 0x1dad3: 0x6c8cb020, - 0x1dad4: 0x6cdf1a20, 0x1dad5: 0x6cce9820, 0x1dad6: 0x6c2b5c20, 0x1dad7: 0x6c9e6e20, - 0x1dad8: 0x6cbe9c20, 0x1dad9: 0x6c859620, 0x1dada: 0x6d1e7220, 0x1dadb: 0x6c77d820, - 0x1dadc: 0x6ca27220, 0x1dadd: 0x6c06ee20, 0x1dade: 0x6c05a820, 0x1dadf: 0x6c467220, - 0x1dae0: 0x6c9f3420, 0x1dae1: 0x6d15c420, 0x1dae2: 0x6d15ca20, 0x1dae3: 0x6c720020, - 0x1dae4: 0x6cb1de20, 0x1dae5: 0x6cc91420, 0x1dae6: 0x6c7a7620, 0x1dae7: 0x6ca8fa20, - 0x1dae8: 0x6ca62c20, 0x1dae9: 0x6c0ebc20, 0x1daea: 0x6c0dc820, 0x1daeb: 0x6cccc620, - 0x1daec: 0x6d051a20, 0x1daed: 0x6d119220, 0x1daee: 0x6cfa8420, 0x1daef: 0x6c079620, - 0x1daf0: 0x6c530620, 0x1daf1: 0x6d1ba220, 0x1daf2: 0x6d2c7420, 0x1daf3: 0x6c2fe220, - 0x1daf4: 0x6c706020, 0x1daf5: 0x6c2e6220, 0x1daf6: 0x6ca7de20, 0x1daf7: 0x6c417e20, - 0x1daf8: 0x6c54a820, 0x1daf9: 0x6cb27c20, 0x1dafa: 0x6c99dc20, 0x1dafb: 0x6c3e0220, - 0x1dafc: 0x6cd0e820, 0x1dafd: 0x6c46f620, 0x1dafe: 0x6c093e20, 0x1daff: 0x6cf07620, - // Block 0x76c, offset 0x1db00 - 0x1db00: 0x6c3e0420, 0x1db01: 0x6d3d2e20, 0x1db02: 0x6c994c20, 0x1db03: 0x6c393220, - 0x1db04: 0x6c633020, 0x1db05: 0x6c98cc20, 0x1db06: 0x6c98ce20, 0x1db07: 0x6c036a20, - 0x1db08: 0x6c223220, 0x1db09: 0x6ca0d620, 0x1db0a: 0x6d3e0620, 0x1db0b: 0x6c2be020, - 0x1db0c: 0x6c1b0a20, 0x1db0d: 0x6c61b220, 0x1db0e: 0x6c6d9420, 0x1db0f: 0x6c8f6e20, - 0x1db10: 0x6c23e220, 0x1db11: 0x6ca78e20, 0x1db12: 0x6d256c20, 0x1db13: 0x6d08fe20, - 0x1db14: 0x6d1c5a20, 0x1db15: 0x6cbf0020, 0x1db16: 0x6c43cc20, 0x1db17: 0x6c9ff020, - 0x1db18: 0x6c85ae20, 0x1db19: 0x6cc65c20, 0x1db1a: 0x6d1b3c20, 0x1db1b: 0x6c44b020, - 0x1db1c: 0x6cba4420, 0x1db1d: 0x6c148e20, 0x1db1e: 0x6c18aa20, 0x1db1f: 0x6d22e820, - 0x1db20: 0x6c4fa220, 0x1db21: 0x6d3f3420, 0x1db22: 0x6c8adc20, 0x1db23: 0x6cf3bc20, - 0x1db24: 0x6c61b420, 0x1db25: 0x6c4a4020, 0x1db26: 0x6c22bc20, 0x1db27: 0x6c657620, - 0x1db28: 0x6c223420, 0x1db29: 0x6c469e20, 0x1db2a: 0x6c49e220, 0x1db2b: 0x6c984420, - 0x1db2c: 0x6c13ce20, 0x1db2d: 0x6c683620, 0x1db2e: 0x6c683820, 0x1db2f: 0x6c3e2420, - 0x1db30: 0x6d20ea20, 0x1db31: 0x6d398e20, 0x1db32: 0x6d3e1420, 0x1db33: 0x6c675220, - 0x1db34: 0x6c5b2820, 0x1db35: 0x6d19b620, 0x1db36: 0x6c13d020, 0x1db37: 0x6c380820, - 0x1db38: 0x6cc64e20, 0x1db39: 0x6cc79420, 0x1db3a: 0x6c1cb620, 0x1db3b: 0x6c989220, - 0x1db3c: 0x6ce72c20, 0x1db3d: 0x6d381c20, 0x1db3e: 0x6cb8ac20, 0x1db3f: 0x6d3a0220, - // Block 0x76d, offset 0x1db40 - 0x1db40: 0x6d09f220, 0x1db41: 0x6c586820, 0x1db42: 0x6c3d5420, 0x1db43: 0x6cc2c620, - 0x1db44: 0x6c40ea20, 0x1db45: 0x6c264620, 0x1db46: 0x6c6d9a20, 0x1db47: 0x6d041c20, - 0x1db48: 0x6c201c20, 0x1db49: 0x6c12ac20, 0x1db4a: 0x6c6d9c20, 0x1db4b: 0x6c374820, - 0x1db4c: 0x6c01a820, 0x1db4d: 0x6cbbd420, 0x1db4e: 0x6c1b1220, 0x1db4f: 0x6cc58c20, - 0x1db50: 0x6c666020, 0x1db51: 0x6ce31220, 0x1db52: 0x6c598420, 0x1db53: 0x6cb28e20, - 0x1db54: 0x6c85b020, 0x1db55: 0x6c6c3620, 0x1db56: 0x6c81aa20, 0x1db57: 0x6cd5b620, - 0x1db58: 0x6d3c0e20, 0x1db59: 0x6c268c20, 0x1db5a: 0x6c63a820, 0x1db5b: 0x6cc52220, - 0x1db5c: 0x6c095620, 0x1db5d: 0x6d2ab420, 0x1db5e: 0x6cbbd620, 0x1db5f: 0x6c5ba220, - 0x1db60: 0x6c61b620, 0x1db61: 0x6c295c20, 0x1db62: 0x6d24c020, 0x1db63: 0x6cc65e20, - 0x1db64: 0x6c5cb620, 0x1db65: 0x6d03d420, 0x1db66: 0x6c95ec20, 0x1db67: 0x6d1c5e20, - 0x1db68: 0x6d09f420, 0x1db69: 0x6c6ce420, 0x1db6a: 0x6cdcce20, 0x1db6b: 0x6d19b820, - 0x1db6c: 0x6c971220, 0x1db6d: 0x6c532020, 0x1db6e: 0x6d391420, 0x1db6f: 0x6d11f620, - 0x1db70: 0x6c324c20, 0x1db71: 0x6cefa420, 0x1db72: 0x6c83b020, 0x1db73: 0x6c310820, - 0x1db74: 0x6c3d6020, 0x1db75: 0x6cc59220, 0x1db76: 0x6d1a4c20, 0x1db77: 0x6c50fc20, - 0x1db78: 0x6c08a020, 0x1db79: 0x6c108820, 0x1db7a: 0x6d27e220, 0x1db7b: 0x6c2b6620, - 0x1db7c: 0x6ce89820, 0x1db7d: 0x6cdbba20, 0x1db7e: 0x6cdbbc20, 0x1db7f: 0x6c19d020, - // Block 0x76e, offset 0x1db80 - 0x1db80: 0x6c18b420, 0x1db81: 0x6cf3be20, 0x1db82: 0x6c0ce420, 0x1db83: 0x6cf5d020, - 0x1db84: 0x6c450420, 0x1db85: 0x6c85de20, 0x1db86: 0x6cb43420, 0x1db87: 0x6d3ae020, - 0x1db88: 0x6ca10020, 0x1db89: 0x6c85e020, 0x1db8a: 0x6d3c1420, 0x1db8b: 0x6d423420, - 0x1db8c: 0x6ceab820, 0x1db8d: 0x6cc03820, 0x1db8e: 0x6ccbe420, 0x1db8f: 0x6cdd1220, - 0x1db90: 0x6c18b620, 0x1db91: 0x6cae9620, 0x1db92: 0x6c71ae20, 0x1db93: 0x6c99e820, - 0x1db94: 0x6c9b1220, 0x1db95: 0x6d042420, 0x1db96: 0x6c6da220, 0x1db97: 0x6c17d820, - 0x1db98: 0x6ccfd420, 0x1db99: 0x6c756820, 0x1db9a: 0x6d0c7a20, 0x1db9b: 0x6ce66620, - 0x1db9c: 0x6d1f2020, 0x1db9d: 0x6c261e20, 0x1db9e: 0x6c494c20, 0x1db9f: 0x6c4ea020, - 0x1dba0: 0x6d1fbe20, 0x1dba1: 0x6c262020, 0x1dba2: 0x6c63b420, 0x1dba3: 0x6cede220, - 0x1dba4: 0x6cda9620, 0x1dba5: 0x6ca99220, 0x1dba6: 0x6cce6420, 0x1dba7: 0x6cfcac20, - 0x1dba8: 0x6c811a20, 0x1dba9: 0x6c3e4020, 0x1dbaa: 0x6c355a20, 0x1dbab: 0x6ca10220, - 0x1dbac: 0x6cf20420, 0x1dbad: 0x6c6aa820, 0x1dbae: 0x6ca3f420, 0x1dbaf: 0x6ca27c20, - 0x1dbb0: 0x6c76c820, 0x1dbb1: 0x6c7eee20, 0x1dbb2: 0x6c87f820, 0x1dbb3: 0x6cd26020, - 0x1dbb4: 0x6cf28220, 0x1dbb5: 0x6ce93020, 0x1dbb6: 0x6cfa9620, 0x1dbb7: 0x6c5db220, - 0x1dbb8: 0x6d1f2220, 0x1dbb9: 0x6d1c6020, 0x1dbba: 0x6d1ba820, 0x1dbbb: 0x6c461e20, - 0x1dbbc: 0x6c213e20, 0x1dbbd: 0x6c988a20, 0x1dbbe: 0x6c988c20, 0x1dbbf: 0x6c22c220, - // Block 0x76f, offset 0x1dbc0 - 0x1dbc0: 0x6ced1020, 0x1dbc1: 0x6c6db220, 0x1dbc2: 0x6c2c4e20, 0x1dbc3: 0x6cc18020, - 0x1dbc4: 0x6c2ffe20, 0x1dbc5: 0x6c648c20, 0x1dbc6: 0x6d405020, 0x1dbc7: 0x6c483a20, - 0x1dbc8: 0x6c7e4420, 0x1dbc9: 0x6c924820, 0x1dbca: 0x6c711c20, 0x1dbcb: 0x6cf08620, - 0x1dbcc: 0x6c757020, 0x1dbcd: 0x6ca82220, 0x1dbce: 0x6c7d5c20, 0x1dbcf: 0x6c511a20, - 0x1dbd0: 0x6cb43a20, 0x1dbd1: 0x6d290020, 0x1dbd2: 0x6c430420, 0x1dbd3: 0x6c4cbc20, - 0x1dbd4: 0x6c3e6c20, 0x1dbd5: 0x6c94f620, 0x1dbd6: 0x6c166a20, 0x1dbd7: 0x6c1daa20, - 0x1dbd8: 0x6cd91e20, 0x1dbd9: 0x6c20ca20, 0x1dbda: 0x6d2e5e20, 0x1dbdb: 0x6c9acc20, - 0x1dbdc: 0x6c114420, 0x1dbdd: 0x6c037820, 0x1dbde: 0x6c83c820, 0x1dbdf: 0x6ce8aa20, - 0x1dbe0: 0x6c0e7020, 0x1dbe1: 0x6c4eb620, 0x1dbe2: 0x6c064620, 0x1dbe3: 0x6cbe1220, - 0x1dbe4: 0x6c731e20, 0x1dbe5: 0x6cf60020, 0x1dbe6: 0x6cbd6a20, 0x1dbe7: 0x6c2bf220, - 0x1dbe8: 0x6c6a0420, 0x1dbe9: 0x6cb43820, 0x1dbea: 0x6c296220, 0x1dbeb: 0x6c6c9020, - 0x1dbec: 0x6cbbde20, 0x1dbed: 0x6cdf2220, 0x1dbee: 0x6c44c820, 0x1dbef: 0x6c573420, - 0x1dbf0: 0x6c470c20, 0x1dbf1: 0x6c8cfe20, 0x1dbf2: 0x6c39fe20, 0x1dbf3: 0x6cbd7020, - 0x1dbf4: 0x6c012a20, 0x1dbf5: 0x6cee1620, 0x1dbf6: 0x6c081c20, 0x1dbf7: 0x6d38e220, - 0x1dbf8: 0x6d0c0020, 0x1dbf9: 0x6c709020, 0x1dbfa: 0x6c648e20, 0x1dbfb: 0x6c8c1e20, - 0x1dbfc: 0x6ce05c20, 0x1dbfd: 0x6cd4d420, 0x1dbfe: 0x6ce49e20, 0x1dbff: 0x6c2a1420, - // Block 0x770, offset 0x1dc00 - 0x1dc00: 0x6c561c20, 0x1dc01: 0x6cb5d020, 0x1dc02: 0x6c511c20, 0x1dc03: 0x6c253820, - 0x1dc04: 0x6ce22420, 0x1dc05: 0x6c210420, 0x1dc06: 0x6c098a20, 0x1dc07: 0x6c16aa20, - 0x1dc08: 0x6c586e20, 0x1dc09: 0x6c3aa620, 0x1dc0a: 0x6c7f0020, 0x1dc0b: 0x6cb4ee20, - 0x1dc0c: 0x6c9b1420, 0x1dc0d: 0x6cb2a020, 0x1dc0e: 0x6cee7420, 0x1dc0f: 0x6c288220, - 0x1dc10: 0x6ccc4e20, 0x1dc11: 0x6c587020, 0x1dc12: 0x6d0d6e20, 0x1dc13: 0x6d14ee20, - 0x1dc14: 0x6ce58420, 0x1dc15: 0x6cb5d220, 0x1dc16: 0x6ced1220, 0x1dc17: 0x6c12e220, - 0x1dc18: 0x6ca3bc20, 0x1dc19: 0x6d327c20, 0x1dc1a: 0x6ceba420, 0x1dc1b: 0x6c6f6c20, - 0x1dc1c: 0x6ce5ee20, 0x1dc1d: 0x6c954220, 0x1dc1e: 0x6c0ae020, 0x1dc1f: 0x6d199220, - 0x1dc20: 0x6c9b1620, 0x1dc21: 0x6c100820, 0x1dc22: 0x6cada820, 0x1dc23: 0x6c2fc620, - 0x1dc24: 0x6d1c6420, 0x1dc25: 0x6d1c6620, 0x1dc26: 0x6d1c6820, 0x1dc27: 0x6cfebc20, - 0x1dc28: 0x6cc97420, 0x1dc29: 0x6cbfb020, 0x1dc2a: 0x6c77fc20, 0x1dc2b: 0x6cfe3620, - 0x1dc2c: 0x6ced8620, 0x1dc2d: 0x6d226020, 0x1dc2e: 0x6d213620, 0x1dc2f: 0x6c3ffa20, - 0x1dc30: 0x6c88fe20, 0x1dc31: 0x6d07a220, 0x1dc32: 0x6d07a420, 0x1dc33: 0x6ca42a20, - 0x1dc34: 0x6c12f620, 0x1dc35: 0x6cf28e20, 0x1dc36: 0x6c217a20, 0x1dc37: 0x6cfece20, - 0x1dc38: 0x6d210620, 0x1dc39: 0x6c0b4020, 0x1dc3a: 0x6c998420, 0x1dc3b: 0x6c013420, - 0x1dc3c: 0x6c364020, 0x1dc3d: 0x6c960a20, 0x1dc3e: 0x6d1c7820, 0x1dc3f: 0x6c7dfc20, - // Block 0x771, offset 0x1dc40 - 0x1dc40: 0x6c7dfe20, 0x1dc41: 0x6c676420, 0x1dc42: 0x6c9e2a20, 0x1dc43: 0x6d42a020, - 0x1dc44: 0x6d42a220, 0x1dc45: 0x6d409c20, 0x1dc46: 0x6c060020, 0x1dc47: 0x6cc74e20, - 0x1dc48: 0x6cf7ec20, 0x1dc49: 0x6d12f620, 0x1dc4a: 0x6c013620, 0x1dc4b: 0x6cc19420, - 0x1dc4c: 0x6c64a820, 0x1dc4d: 0x6c3e8e20, 0x1dc4e: 0x6c93e420, 0x1dc4f: 0x6c6dbe20, - 0x1dc50: 0x6cae4220, 0x1dc51: 0x6c3c5020, 0x1dc52: 0x6c535220, 0x1dc53: 0x6c535420, - 0x1dc54: 0x6c540820, 0x1dc55: 0x6d0e7a20, 0x1dc56: 0x6ce86420, 0x1dc57: 0x6d311420, - 0x1dc58: 0x6d3e4620, 0x1dc59: 0x6cfd7a20, 0x1dc5a: 0x6cc5f620, 0x1dc5b: 0x6c43f420, - 0x1dc5c: 0x6cb82c20, 0x1dc5d: 0x6cbe8020, 0x1dc5e: 0x6c9cf820, 0x1dc5f: 0x6c59c820, - 0x1dc60: 0x6ccff220, 0x1dc61: 0x6cb43c20, 0x1dc62: 0x6c413820, 0x1dc63: 0x6c303020, - 0x1dc64: 0x6d392a20, 0x1dc65: 0x6c669620, 0x1dc66: 0x6cefcc20, 0x1dc67: 0x6c0f0820, - 0x1dc68: 0x6cee9220, 0x1dc69: 0x6cabc620, 0x1dc6a: 0x6c620e20, 0x1dc6b: 0x6c556620, - 0x1dc6c: 0x6d2a0820, 0x1dc6d: 0x6c636220, 0x1dc6e: 0x6c32c620, 0x1dc6f: 0x6d120a20, - 0x1dc70: 0x6cdbc420, 0x1dc71: 0x6c231c20, 0x1dc72: 0x6cc2fa20, 0x1dc73: 0x6cee9420, - 0x1dc74: 0x6d315820, 0x1dc75: 0x6c7c7a20, 0x1dc76: 0x6ce67820, 0x1dc77: 0x6c5cd220, - 0x1dc78: 0x6cf7ee20, 0x1dc79: 0x6cd1c220, 0x1dc7a: 0x6cb79a20, 0x1dc7b: 0x6c7f9e20, - 0x1dc7c: 0x6d3f9420, 0x1dc7d: 0x6d10a820, 0x1dc7e: 0x6d24f020, 0x1dc7f: 0x6c9a0620, - // Block 0x772, offset 0x1dc80 - 0x1dc80: 0x6d275220, 0x1dc81: 0x6cd5c820, 0x1dc82: 0x6c2c6220, 0x1dc83: 0x6d3bc620, - 0x1dc84: 0x6c491820, 0x1dc85: 0x6cc4dc20, 0x1dc86: 0x6d08e020, 0x1dc87: 0x6c15b820, - 0x1dc88: 0x6c765a20, 0x1dc89: 0x6c7d0020, 0x1dc8a: 0x6c571620, 0x1dc8b: 0x6c67a820, - 0x1dc8c: 0x6c908e20, 0x1dc8d: 0x6cefce20, 0x1dc8e: 0x6cac2a20, 0x1dc8f: 0x6d206c20, - 0x1dc90: 0x6cd9b620, 0x1dc91: 0x6d1b6220, 0x1dc92: 0x6cd1d420, 0x1dc93: 0x6c215420, - 0x1dc94: 0x6cd27620, 0x1dc95: 0x6d275a20, 0x1dc96: 0x6d317220, 0x1dc97: 0x6c812220, - 0x1dc98: 0x6cc7b420, 0x1dc99: 0x6c9b2a20, 0x1dc9a: 0x6c863a20, 0x1dc9b: 0x6cc38e20, - 0x1dc9c: 0x6cdb9c20, 0x1dc9d: 0x6d258a20, 0x1dc9e: 0x6c863c20, 0x1dc9f: 0x6c71c420, - 0x1dca0: 0x6cf65620, 0x1dca1: 0x6c057e20, 0x1dca2: 0x6c1e8220, 0x1dca3: 0x6d062020, - 0x1dca4: 0x6ce8cc20, 0x1dca5: 0x6c8e7020, 0x1dca6: 0x6c5de020, 0x1dca7: 0x6c2d2220, - 0x1dca8: 0x6cba5e20, 0x1dca9: 0x6d409e20, 0x1dcaa: 0x6cb39820, 0x1dcab: 0x6c25e420, - 0x1dcac: 0x6d24fa20, 0x1dcad: 0x6c1e9020, 0x1dcae: 0x6d237a20, 0x1dcaf: 0x6c7afe20, - 0x1dcb0: 0x6cac6220, 0x1dcb1: 0x6cb43e20, 0x1dcb2: 0x6cb44020, 0x1dcb3: 0x6ca35820, - 0x1dcb4: 0x6cd78820, 0x1dcb5: 0x6cf78820, 0x1dcb6: 0x6c3b7c20, 0x1dcb7: 0x6d27b820, - 0x1dcb8: 0x6d32d220, 0x1dcb9: 0x6c64c020, 0x1dcba: 0x6c605e20, 0x1dcbb: 0x6cc92220, - 0x1dcbc: 0x6c123620, 0x1dcbd: 0x6c371820, 0x1dcbe: 0x6c9c5820, 0x1dcbf: 0x6c4fa820, - // Block 0x773, offset 0x1dcc0 - 0x1dcc0: 0x6cdcd820, 0x1dcc1: 0x6d317420, 0x1dcc2: 0x6ca00c20, 0x1dcc3: 0x6cd9b820, - 0x1dcc4: 0x6d06fe20, 0x1dcc5: 0x6c8e7220, 0x1dcc6: 0x6cf78a20, 0x1dcc7: 0x6c479220, - 0x1dcc8: 0x6c80c020, 0x1dcc9: 0x6cc68c20, 0x1dcca: 0x6cf25420, 0x1dccb: 0x6c414820, - 0x1dccc: 0x6c263020, 0x1dccd: 0x6cd1d620, 0x1dcce: 0x6ce10820, 0x1dccf: 0x6c95b620, - 0x1dcd0: 0x6cc82020, 0x1dcd1: 0x6cdd2820, 0x1dcd2: 0x6d07ae20, 0x1dcd3: 0x6c073620, - 0x1dcd4: 0x6d11ba20, 0x1dcd5: 0x6c4b5620, 0x1dcd6: 0x6c09da20, 0x1dcd7: 0x6d3ffc20, - 0x1dcd8: 0x6c4bd220, 0x1dcd9: 0x6d42ba20, 0x1dcda: 0x6ce58620, 0x1dcdb: 0x6c12fe20, - 0x1dcdc: 0x6cae2e20, 0x1dcdd: 0x6c7fa420, 0x1dcde: 0x6c28b620, 0x1dcdf: 0x6c622420, - 0x1dce0: 0x6c83f420, 0x1dce1: 0x6ccffa20, 0x1dce2: 0x6c810620, 0x1dce3: 0x6d237c20, - 0x1dce4: 0x6c8e2e20, 0x1dce5: 0x6d1c8420, 0x1dce6: 0x6ca13020, 0x1dce7: 0x6c2e3020, - 0x1dce8: 0x6ce58e20, 0x1dce9: 0x6c993c20, 0x1dcea: 0x6ce6fa20, 0x1dceb: 0x6c1f5a20, - 0x1dcec: 0x6caeae20, 0x1dced: 0x6c014020, 0x1dcee: 0x6c881820, 0x1dcef: 0x6c233220, - 0x1dcf0: 0x6cf80220, 0x1dcf1: 0x6cb2ae20, 0x1dcf2: 0x6cbfb820, 0x1dcf3: 0x6c6ca620, - 0x1dcf4: 0x6c215820, 0x1dcf5: 0x6c6b1420, 0x1dcf6: 0x6cef2420, 0x1dcf7: 0x6ce99620, - 0x1dcf8: 0x6c128220, 0x1dcf9: 0x6d23ca20, 0x1dcfa: 0x6d183620, 0x1dcfb: 0x6d3ed220, - 0x1dcfc: 0x6c8a7220, 0x1dcfd: 0x6c09dc20, 0x1dcfe: 0x6c91ce20, 0x1dcff: 0x6d077620, - // Block 0x774, offset 0x1dd00 - 0x1dd00: 0x6c10a820, 0x1dd01: 0x6d2ed020, 0x1dd02: 0x6c824a20, 0x1dd03: 0x6cbb1c20, - 0x1dd04: 0x6c97f220, 0x1dd05: 0x6d0cb820, 0x1dd06: 0x6c8d3e20, 0x1dd07: 0x6c621020, - 0x1dd08: 0x6c0c0e20, 0x1dd09: 0x6c4bde20, 0x1dd0a: 0x6c4e5c20, 0x1dd0b: 0x6c2b8220, - 0x1dd0c: 0x6cdaf020, 0x1dd0d: 0x6c929620, 0x1dd0e: 0x6ccf6c20, 0x1dd0f: 0x6cce1420, - 0x1dd10: 0x6c2b8420, 0x1dd11: 0x6c9ee420, 0x1dd12: 0x6d09a220, 0x1dd13: 0x6c97f420, - 0x1dd14: 0x6c0f3420, 0x1dd15: 0x6c2c8420, 0x1dd16: 0x6c25ea20, 0x1dd17: 0x6d311620, - 0x1dd18: 0x6cd00a20, 0x1dd19: 0x6d08a620, 0x1dd1a: 0x6cf0b220, 0x1dd1b: 0x6c558220, - 0x1dd1c: 0x6c025620, 0x1dd1d: 0x6c9cfc20, 0x1dd1e: 0x6c90aa20, 0x1dd1f: 0x6c244a20, - 0x1dd20: 0x6d37c220, 0x1dd21: 0x6c114820, 0x1dd22: 0x6cb33220, 0x1dd23: 0x6c67b220, - 0x1dd24: 0x6c9d6e20, 0x1dd25: 0x6c233420, 0x1dd26: 0x6ca7a220, 0x1dd27: 0x6c5c0220, - 0x1dd28: 0x6c738620, 0x1dd29: 0x6d1a8420, 0x1dd2a: 0x6c66ac20, 0x1dd2b: 0x6ca6f020, - 0x1dd2c: 0x6cd50220, 0x1dd2d: 0x6d19f020, 0x1dd2e: 0x6c4c7e20, 0x1dd2f: 0x6c18d620, - 0x1dd30: 0x6c56bc20, 0x1dd31: 0x6ccc0020, 0x1dd32: 0x6c79fc20, 0x1dd33: 0x6cba6e20, - 0x1dd34: 0x6c966e20, 0x1dd35: 0x6d29e420, 0x1dd36: 0x6d2b5a20, 0x1dd37: 0x6cbb1620, - 0x1dd38: 0x6c30ba20, 0x1dd39: 0x6c88c620, 0x1dd3a: 0x6c8c5a20, 0x1dd3b: 0x6c79fe20, - 0x1dd3c: 0x6c007020, 0x1dd3d: 0x6c0a0a20, 0x1dd3e: 0x6c843220, 0x1dd3f: 0x6cf00a20, - // Block 0x775, offset 0x1dd40 - 0x1dd40: 0x6c609620, 0x1dd41: 0x6cb9c420, 0x1dd42: 0x6cd17620, 0x1dd43: 0x6c385c20, - 0x1dd44: 0x6c9b3c20, 0x1dd45: 0x6cab9020, 0x1dd46: 0x6c15dc20, 0x1dd47: 0x6c2d2820, - 0x1dd48: 0x6d0aa420, 0x1dd49: 0x6c687020, 0x1dd4a: 0x6cc8ac20, 0x1dd4b: 0x6cc8ae20, - 0x1dd4c: 0x6c82d420, 0x1dd4d: 0x6d218e20, 0x1dd4e: 0x6cbbf220, 0x1dd4f: 0x6c1ea020, - 0x1dd50: 0x6c575220, 0x1dd51: 0x6c64e220, 0x1dd52: 0x6c971a20, 0x1dd53: 0x6d27c220, - 0x1dd54: 0x6c05b820, 0x1dd55: 0x6d1f6820, 0x1dd56: 0x6cc1aa20, 0x1dd57: 0x6c92da20, - 0x1dd58: 0x6cc52a20, 0x1dd59: 0x6c5c1e20, 0x1dd5a: 0x6c369020, 0x1dd5b: 0x6ce36a20, - 0x1dd5c: 0x6c3a6a20, 0x1dd5d: 0x6c749e20, 0x1dd5e: 0x6d41c820, 0x1dd5f: 0x6c384020, - 0x1dd60: 0x6cc7c020, 0x1dd61: 0x6c3b8e20, 0x1dd62: 0x6c7d1620, 0x1dd63: 0x6cd75820, - 0x1dd64: 0x6cc8a220, 0x1dd65: 0x6d0b5e20, 0x1dd66: 0x6d05dc20, 0x1dd67: 0x6c403c20, - 0x1dd68: 0x6c74a020, 0x1dd69: 0x6c298a20, 0x1dd6a: 0x6cf3e420, 0x1dd6b: 0x6c303a20, - 0x1dd6c: 0x6cd82420, 0x1dd6d: 0x6cff1820, 0x1dd6e: 0x6cf8d020, 0x1dd6f: 0x6c8fa020, - 0x1dd70: 0x6cf16420, 0x1dd71: 0x6ccee820, 0x1dd72: 0x6cb64220, 0x1dd73: 0x6c64e420, - 0x1dd74: 0x6d284e20, 0x1dd75: 0x6cdcde20, 0x1dd76: 0x6c8d5a20, 0x1dd77: 0x6d23f220, - 0x1dd78: 0x6cf9ec20, 0x1dd79: 0x6cf27220, 0x1dd7a: 0x6c609820, 0x1dd7b: 0x6c538820, - 0x1dd7c: 0x6cd8ee20, 0x1dd7d: 0x6ca9ca20, 0x1dd7e: 0x6c82da20, 0x1dd7f: 0x6d07ce20, - // Block 0x776, offset 0x1dd80 - 0x1dd80: 0x6d285620, 0x1dd81: 0x6d23cc20, 0x1dd82: 0x6cf7a420, 0x1dd83: 0x6c506e20, - 0x1dd84: 0x6c05d620, 0x1dd85: 0x6c4fae20, 0x1dd86: 0x6c00d220, 0x1dd87: 0x6ceeba20, - 0x1dd88: 0x6c5c3c20, 0x1dd89: 0x6c5c3e20, 0x1dd8a: 0x6c628220, 0x1dd8b: 0x6c226e20, - 0x1dd8c: 0x6cfd8420, 0x1dd8d: 0x6ced9a20, 0x1dd8e: 0x6c9ee820, 0x1dd8f: 0x6d18b420, - 0x1dd90: 0x6c838820, 0x1dd91: 0x6c677e20, 0x1dd92: 0x6c120820, 0x1dd93: 0x6cd01e20, - 0x1dd94: 0x6cbb2620, 0x1dd95: 0x6c885a20, 0x1dd96: 0x6c781c20, 0x1dd97: 0x6d25ae20, - 0x1dd98: 0x6c26c020, 0x1dd99: 0x6ce42220, 0x1dd9a: 0x6ce0d420, 0x1dd9b: 0x6d08e820, - 0x1dd9c: 0x6c0a5c20, 0x1dd9d: 0x6d2d9a20, 0x1dd9e: 0x6cdce020, 0x1dd9f: 0x6cfad820, - 0x1dda0: 0x6c38c420, 0x1dda1: 0x6c2f8220, 0x1dda2: 0x6d021c20, 0x1dda3: 0x6c47d220, - 0x1dda4: 0x6d021e20, 0x1dda5: 0x6cd56e20, 0x1dda6: 0x6c66d420, 0x1dda7: 0x6c4fb020, - 0x1dda8: 0x6c52ca20, 0x1dda9: 0x6cc99820, 0x1ddaa: 0x6d02f220, 0x1ddab: 0x6d09aa20, - 0x1ddac: 0x6d122420, 0x1ddad: 0x6c046a20, 0x1ddae: 0x6cda2c20, 0x1ddaf: 0x6cd57020, - 0x1ddb0: 0x6d09b420, 0x1ddb1: 0x6c336a20, 0x1ddb2: 0x6cb21a20, 0x1ddb3: 0x6cf01820, - 0x1ddb4: 0x6ca92820, 0x1ddb5: 0x6c1df020, 0x1ddb6: 0x6c970420, 0x1ddb7: 0x6cc7d420, - 0x1ddb8: 0x6cb18620, 0x1ddb9: 0x6cdf4c20, 0x1ddba: 0x6c62a020, 0x1ddbb: 0x6d2a5a20, - 0x1ddbc: 0x6c18f020, 0x1ddbd: 0x6d319a20, 0x1ddbe: 0x6c37a820, 0x1ddbf: 0x6ca65420, - // Block 0x777, offset 0x1ddc0 - 0x1ddc0: 0x6d1ca820, 0x1ddc1: 0x6c432620, 0x1ddc2: 0x6c23b820, 0x1ddc3: 0x6cff2420, - 0x1ddc4: 0x6cb66020, 0x1ddc5: 0x6c382820, 0x1ddc6: 0x6c65e420, 0x1ddc7: 0x6d073e20, - 0x1ddc8: 0x6c7ca620, 0x1ddc9: 0x6c60c620, 0x1ddca: 0x6c0b5820, 0x1ddcb: 0x6c2e4620, - 0x1ddcc: 0x6c9d9420, 0x1ddcd: 0x6c7fc420, 0x1ddce: 0x6c6d6420, 0x1ddcf: 0x6c124e20, - 0x1ddd0: 0x6c9ea020, 0x1ddd1: 0x6cbf6e20, 0x1ddd2: 0x6cbcec20, 0x1ddd3: 0x6cfc3420, - 0x1ddd4: 0x6c8a5420, 0x1ddd5: 0x6cab9820, 0x1ddd6: 0x6cfbb620, 0x1ddd7: 0x6cdb4020, - 0x1ddd8: 0x6c936a20, 0x1ddd9: 0x6d18f020, 0x1ddda: 0x6d075220, 0x1dddb: 0x6d014c20, - 0x1dddc: 0x6c847220, 0x1dddd: 0x6d18f220, 0x1ddde: 0x6c7e6620, 0x1dddf: 0x6c82f020, - 0x1dde0: 0x6c69ca20, 0x1dde1: 0x6c2b9a20, 0x1dde2: 0x6d355a20, 0x1dde3: 0x6c06bc20, - 0x1dde4: 0x6ce2c220, 0x1dde5: 0x6d123620, 0x1dde6: 0x6ca17c20, 0x1dde7: 0x6c595e20, - 0x1dde8: 0x6c0c3e20, 0x1dde9: 0x6c386820, 0x1ddea: 0x6cda3220, 0x1ddeb: 0x6ce02e20, - 0x1ddec: 0x6ce99a20, 0x1dded: 0x6cbf8020, 0x1ddee: 0x6cbc0820, 0x1ddef: 0x6cf0f620, - 0x1ddf0: 0x6c8ebc20, 0x1ddf1: 0x6c5c5c20, 0x1ddf2: 0x6cabac20, 0x1ddf3: 0x6c432c20, - 0x1ddf4: 0x6d286220, 0x1ddf5: 0x6c068a20, 0x1ddf6: 0x6c870a20, 0x1ddf7: 0x6cd57e20, - 0x1ddf8: 0x6c1ebe20, 0x1ddf9: 0x6c007e20, 0x1ddfa: 0x6c8c7a20, 0x1ddfb: 0x6d2a6020, - 0x1ddfc: 0x6d07e620, 0x1ddfd: 0x6cbe2820, 0x1ddfe: 0x6c7f7220, 0x1ddff: 0x6c5e3220, - // Block 0x778, offset 0x1de00 - 0x1de00: 0x6cebb620, 0x1de01: 0x6cf54420, 0x1de02: 0x6cc8b820, 0x1de03: 0x6cc8ba20, - 0x1de04: 0x6cb68420, 0x1de05: 0x6c528020, 0x1de06: 0x6c917820, 0x1de07: 0x6cda6420, - 0x1de08: 0x6ce9d020, 0x1de09: 0x6c9b8a20, 0x1de0a: 0x6d287020, 0x1de0b: 0x6cb2dc20, - 0x1de0c: 0x6d22b020, 0x1de0d: 0x6d09c220, 0x1de0e: 0x6c62be20, 0x1de0f: 0x6c6eec20, - 0x1de10: 0x6d07e820, 0x1de11: 0x6ca09020, 0x1de12: 0x6cc0c220, 0x1de13: 0x6cda6620, - 0x1de14: 0x6c6eee20, 0x1de15: 0x6c3d0420, 0x1de16: 0x6ca8a620, 0x1de17: 0x6c0ffe20, - 0x1de18: 0x6cc4ea20, 0x1de19: 0x6d193020, 0x1de1a: 0x6cfc4a20, 0x1de1b: 0x6d21e420, - 0x1de1c: 0x6c718820, 0x1de1d: 0x6c892e20, 0x1de1e: 0x6c88dc20, 0x1de1f: 0x6d1b1e20, - 0x1de20: 0x6cbb2e20, 0x1de21: 0x6d1c2420, 0x1de22: 0x6c8fcc20, 0x1de23: 0x6ce82220, - 0x1de24: 0x6cf05420, 0x1de25: 0x6d270c20, 0x1de26: 0x6c8d9420, 0x1de27: 0x6cc1f020, - 0x1de28: 0x6d117020, 0x1de29: 0x6c38e620, 0x1de2a: 0x6c9a3c20, 0x1de2b: 0x6c4f3020, - 0x1de2c: 0x6c7c5620, 0x1de2d: 0x6c7ff020, 0x1de2e: 0x6c62d220, 0x1de2f: 0x6c29a220, - 0x1de30: 0x6c981820, 0x1de31: 0x6c836220, 0x1de32: 0x6c828820, 0x1de33: 0x6c5b0a20, - 0x1de34: 0x6c3c8220, 0x1de35: 0x6d342820, 0x1de36: 0x6cf10e20, 0x1de37: 0x6c7cb620, - 0x1de38: 0x6d2ea220, 0x1de39: 0x6c580620, 0x1de3a: 0x6c84ac20, 0x1de3b: 0x6c62e220, - 0x1de3c: 0x6c9cb620, 0x1de3d: 0x6c830a20, 0x1de3e: 0x6c582220, 0x1de3f: 0x6c957a20, - // Block 0x779, offset 0x1de40 - 0x1de40: 0x6c5fa020, 0x1de41: 0x6c7cbe20, 0x1de42: 0x6c934020, 0x1de43: 0x6c655020, - 0x1de44: 0x6cc9ba20, 0x1de45: 0x6ce2e620, 0x1de46: 0x6c829e20, 0x1de47: 0x6cc36820, - 0x1de48: 0x6cff6020, 0x1de49: 0x6d197420, 0x1de4a: 0x6c947220, 0x1de4b: 0x6c9ae620, - 0x1de4c: 0x6c0cd420, 0x1de4d: 0x6c549420, 0x1de4e: 0x6c561220, 0x1de4f: 0x6c91b820, - 0x1de50: 0x6caaa220, 0x1de51: 0x6c93d420, 0x1de52: 0x6cd7da20, 0x1de53: 0x6cfeaa20, - 0x1de54: 0x6cb98220, 0x1de55: 0x6c1f3620, 0x1de56: 0x6c54c620, 0x1de57: 0x6d058a20, - 0x1de58: 0x6c25d820, 0x1de59: 0x6c3e6e20, 0x1de5a: 0x6d058c20, 0x1de5b: 0x6d05a820, - 0x1de5c: 0x6c91c420, 0x1de5d: 0x6c562420, 0x1de5e: 0x6d216620, 0x1de5f: 0x6c504a20, - 0x1de60: 0x6c686020, 0x1de61: 0x6c725820, 0x1de62: 0x6c4c8620, 0x1de63: 0x6c066820, - 0x1de64: 0x6d0cd220, 0x1de65: 0x6d2e8220, 0x1de66: 0x6d2e8420, 0x1de67: 0x6c7c4820, - 0x1de68: 0x6c0d5620, 0x1de69: 0x6cf90620, 0x1de6a: 0x6cd63220, 0x1de6b: 0x6c1d0820, - 0x1de6c: 0x6cc00220, 0x1de6d: 0x6c2db220, 0x1de6e: 0x6c612620, 0x1de6f: 0x6cc00c20, - 0x1de70: 0x6c2f5820, 0x1de71: 0x6cd19a20, 0x1de72: 0x6cf95020, 0x1de73: 0x6c740820, - 0x1de74: 0x6d302a20, 0x1de75: 0x6ccf0a20, 0x1de76: 0x6d208020, 0x1de77: 0x6c4dea20, - 0x1de78: 0x6d3efe20, 0x1de79: 0x6c532220, 0x1de7a: 0x6c5a9a20, 0x1de7b: 0x6c9b0c20, - 0x1de7c: 0x6c447e20, 0x1de7d: 0x6cdbb020, 0x1de7e: 0x6cf95a20, 0x1de7f: 0x6c149420, - // Block 0x77a, offset 0x1de80 - 0x1de80: 0x6cd25620, 0x1de81: 0x6d15d620, 0x1de82: 0x6c969620, 0x1de83: 0x6cfe2020, - 0x1de84: 0x6c399420, 0x1de85: 0x6c360220, 0x1de86: 0x6c034020, 0x1de87: 0x6c1b9620, - 0x1de88: 0x6cb8ca20, 0x1de89: 0x6cf18e20, 0x1de8a: 0x6cf19020, 0x1de8b: 0x6cc8c620, - 0x1de8c: 0x6c056620, 0x1de8d: 0x6cafd220, 0x1de8e: 0x6d269a20, 0x1de8f: 0x6d269c20, - 0x1de90: 0x6c756a20, 0x1de91: 0x6cb5ae20, 0x1de92: 0x6ce73c20, 0x1de93: 0x6d1ad620, - 0x1de94: 0x6cb5b020, 0x1de95: 0x6c119020, 0x1de96: 0x6d255420, 0x1de97: 0x6c741a20, - 0x1de98: 0x6c5b3020, 0x1de99: 0x6cbd6c20, 0x1de9a: 0x6cb5b220, 0x1de9b: 0x6d382220, - 0x1de9c: 0x6d0b2220, 0x1de9d: 0x6c4fc220, 0x1de9e: 0x6ca27e20, 0x1de9f: 0x6cede420, - 0x1dea0: 0x6c3b6820, 0x1dea1: 0x6c3b6a20, 0x1dea2: 0x6c4f6e20, 0x1dea3: 0x6c462e20, - 0x1dea4: 0x6d2a4620, 0x1dea5: 0x6c3fd420, 0x1dea6: 0x6cc47020, 0x1dea7: 0x6c6bda20, - 0x1dea8: 0x6c3e4220, 0x1dea9: 0x6c1aa420, 0x1deaa: 0x6c30ea20, 0x1deab: 0x6c064820, - 0x1deac: 0x6cfc0620, 0x1dead: 0x6ca5de20, 0x1deae: 0x6ce27820, 0x1deaf: 0x6cbfac20, - 0x1deb0: 0x6d1f2c20, 0x1deb1: 0x6d2cc220, 0x1deb2: 0x6cb2a220, 0x1deb3: 0x6c1b1e20, - 0x1deb4: 0x6d204220, 0x1deb5: 0x6c511e20, 0x1deb6: 0x6c4da020, 0x1deb7: 0x6c723420, - 0x1deb8: 0x6c85fe20, 0x1deb9: 0x6c3fe620, 0x1deba: 0x6cc47620, 0x1debb: 0x6d2c2a20, - 0x1debc: 0x6c468220, 0x1debd: 0x6cafe220, 0x1debe: 0x6cafe420, 0x1debf: 0x6cfb5220, - // Block 0x77b, offset 0x1dec0 - 0x1dec0: 0x6d3af020, 0x1dec1: 0x6c2dc820, 0x1dec2: 0x6c0ce820, 0x1dec3: 0x6c0de220, - 0x1dec4: 0x6c470e20, 0x1dec5: 0x6d2d7020, 0x1dec6: 0x6cc10620, 0x1dec7: 0x6ccf1220, - 0x1dec8: 0x6ce5fa20, 0x1dec9: 0x6c8d0020, 0x1deca: 0x6c478420, 0x1decb: 0x6c288420, - 0x1decc: 0x6c478620, 0x1decd: 0x6d1c6a20, 0x1dece: 0x6c860020, 0x1decf: 0x6c196a20, - 0x1ded0: 0x6cc11220, 0x1ded1: 0x6ca1d620, 0x1ded2: 0x6c43f620, 0x1ded3: 0x6c22ca20, - 0x1ded4: 0x6c5b3820, 0x1ded5: 0x6c5b3a20, 0x1ded6: 0x6c986a20, 0x1ded7: 0x6c3ffc20, - 0x1ded8: 0x6d0fbc20, 0x1ded9: 0x6cebde20, 0x1deda: 0x6c8b0e20, 0x1dedb: 0x6d39ac20, - 0x1dedc: 0x6d13f820, 0x1dedd: 0x6cfb6220, 0x1dede: 0x6c7e0020, 0x1dedf: 0x6c684e20, - 0x1dee0: 0x6c861a20, 0x1dee1: 0x6d17be20, 0x1dee2: 0x6cb2b020, 0x1dee3: 0x6cb4fc20, - 0x1dee4: 0x6c4cfe20, 0x1dee5: 0x6ccf1a20, 0x1dee6: 0x6d14fc20, 0x1dee7: 0x6cee2420, - 0x1dee8: 0x6ca11c20, 0x1dee9: 0x6cbf3220, 0x1deea: 0x6cbcc420, 0x1deeb: 0x6c4b0420, - 0x1deec: 0x6cbf3420, 0x1deed: 0x6d364020, 0x1deee: 0x6c976420, 0x1deef: 0x6c81f820, - 0x1def0: 0x6d305c20, 0x1def1: 0x6c63c220, 0x1def2: 0x6ca4ae20, 0x1def3: 0x6cd7ee20, - 0x1def4: 0x6cb5f020, 0x1def5: 0x6d038420, 0x1def6: 0x6c6bee20, 0x1def7: 0x6cc07c20, - 0x1def8: 0x6cce7a20, 0x1def9: 0x6d1e4c20, 0x1defa: 0x6c63ce20, 0x1defb: 0x6cea0220, - 0x1defc: 0x6c17de20, 0x1defd: 0x6c044e20, 0x1defe: 0x6c357620, 0x1deff: 0x6c4ed420, - // Block 0x77c, offset 0x1df00 - 0x1df00: 0x6cd56420, 0x1df01: 0x6d081620, 0x1df02: 0x6c3c5820, 0x1df03: 0x6cd0b820, - 0x1df04: 0x6cd0ba20, 0x1df05: 0x6c3f7020, 0x1df06: 0x6cfce020, 0x1df07: 0x6d2ffe20, - 0x1df08: 0x6cf3da20, 0x1df09: 0x6c3ea820, 0x1df0a: 0x6c83f820, 0x1df0b: 0x6c80d420, - 0x1df0c: 0x6c09de20, 0x1df0d: 0x6c1e9220, 0x1df0e: 0x6d24fc20, 0x1df0f: 0x6d1fd820, - 0x1df10: 0x6c6af820, 0x1df11: 0x6c288e20, 0x1df12: 0x6d0ca220, 0x1df13: 0x6ce67a20, - 0x1df14: 0x6c2d6820, 0x1df15: 0x6cea0420, 0x1df16: 0x6c5b3c20, 0x1df17: 0x6cf29820, - 0x1df18: 0x6d340420, 0x1df19: 0x6cd92c20, 0x1df1a: 0x6c3a1420, 0x1df1b: 0x6c70b620, - 0x1df1c: 0x6c9d7020, 0x1df1d: 0x6cb62c20, 0x1df1e: 0x6cb62e20, 0x1df1f: 0x6d23a820, - 0x1df20: 0x6c75da20, 0x1df21: 0x6c7e8a20, 0x1df22: 0x6c9be220, 0x1df23: 0x6cbac420, - 0x1df24: 0x6cd80820, 0x1df25: 0x6cf68020, 0x1df26: 0x6c950820, 0x1df27: 0x6c865420, - 0x1df28: 0x6c2ed620, 0x1df29: 0x6ce59a20, 0x1df2a: 0x6ce23220, 0x1df2b: 0x6c7d7a20, - 0x1df2c: 0x6c4e2620, 0x1df2d: 0x6c4eec20, 0x1df2e: 0x6d23aa20, 0x1df2f: 0x6c058420, - 0x1df30: 0x6c3a4020, 0x1df31: 0x6cb00c20, 0x1df32: 0x6ceea820, 0x1df33: 0x6c339e20, - 0x1df34: 0x6d183820, 0x1df35: 0x6d250c20, 0x1df36: 0x6cddd020, 0x1df37: 0x6cc30c20, - 0x1df38: 0x6cba1a20, 0x1df39: 0x6cc8d820, 0x1df3a: 0x6ca5fc20, 0x1df3b: 0x6cbe5220, - 0x1df3c: 0x6cf0b420, 0x1df3d: 0x6c899e20, 0x1df3e: 0x6c4cc820, 0x1df3f: 0x6cec9620, - // Block 0x77d, offset 0x1df40 - 0x1df40: 0x6c301020, 0x1df41: 0x6c367220, 0x1df42: 0x6c04d020, 0x1df43: 0x6c2c8620, - 0x1df44: 0x6cee3420, 0x1df45: 0x6c11a020, 0x1df46: 0x6d102820, 0x1df47: 0x6d1d6820, - 0x1df48: 0x6c4c3220, 0x1df49: 0x6c150e20, 0x1df4a: 0x6c2fb420, 0x1df4b: 0x6c7e8c20, - 0x1df4c: 0x6c782c20, 0x1df4d: 0x6c6afa20, 0x1df4e: 0x6d005020, 0x1df4f: 0x6ce68e20, - 0x1df50: 0x6c99b220, 0x1df51: 0x6d05de20, 0x1df52: 0x6c9dd020, 0x1df53: 0x6d219020, - 0x1df54: 0x6c6a3220, 0x1df55: 0x6cd28020, 0x1df56: 0x6d07c820, 0x1df57: 0x6c59f620, - 0x1df58: 0x6d0dce20, 0x1df59: 0x6c0b0420, 0x1df5a: 0x6cc75e20, 0x1df5b: 0x6ceeb220, - 0x1df5c: 0x6c403e20, 0x1df5d: 0x6d25a020, 0x1df5e: 0x6c9aaa20, 0x1df5f: 0x6cf14620, - 0x1df60: 0x6c3ee220, 0x1df61: 0x6cc7c220, 0x1df62: 0x6d00e220, 0x1df63: 0x6d1f6a20, - 0x1df64: 0x6cc09020, 0x1df65: 0x6c990020, 0x1df66: 0x6cf97820, 0x1df67: 0x6d1be020, - 0x1df68: 0x6cd1f020, 0x1df69: 0x6c1d2020, 0x1df6a: 0x6ce0ce20, 0x1df6b: 0x6d39be20, - 0x1df6c: 0x6d3fba20, 0x1df6d: 0x6ce36c20, 0x1df6e: 0x6c404020, 0x1df6f: 0x6d25a220, - 0x1df70: 0x6c7c9820, 0x1df71: 0x6c9b3e20, 0x1df72: 0x6c7e9620, 0x1df73: 0x6c31b220, - 0x1df74: 0x6c559620, 0x1df75: 0x6cbfc220, 0x1df76: 0x6c2ee020, 0x1df77: 0x6c866420, - 0x1df78: 0x6cf29c20, 0x1df79: 0x6d276220, 0x1df7a: 0x6cc24e20, 0x1df7b: 0x6ca43a20, - 0x1df7c: 0x6c90b620, 0x1df7d: 0x6c211220, 0x1df7e: 0x6cc6a820, 0x1df7f: 0x6d1c9220, - // Block 0x77e, offset 0x1df80 - 0x1df80: 0x6c677620, 0x1df81: 0x6c051420, 0x1df82: 0x6c80d820, 0x1df83: 0x6cad0e20, - 0x1df84: 0x6cd82c20, 0x1df85: 0x6cf6da20, 0x1df86: 0x6c22de20, 0x1df87: 0x6cf6dc20, - 0x1df88: 0x6d25b020, 0x1df89: 0x6cf23c20, 0x1df8a: 0x6c885c20, 0x1df8b: 0x6cd9dc20, - 0x1df8c: 0x6c04a020, 0x1df8d: 0x6cc6b220, 0x1df8e: 0x6cc6b420, 0x1df8f: 0x6c60b220, - 0x1df90: 0x6cf38220, 0x1df91: 0x6d055020, 0x1df92: 0x6c4f0e20, 0x1df93: 0x6cbdac20, - 0x1df94: 0x6d156020, 0x1df95: 0x6c089020, 0x1df96: 0x6c575420, 0x1df97: 0x6ce13c20, - 0x1df98: 0x6d161420, 0x1df99: 0x6c327c20, 0x1df9a: 0x6ca3d620, 0x1df9b: 0x6c517820, - 0x1df9c: 0x6c55c020, 0x1df9d: 0x6c4a8a20, 0x1df9e: 0x6c96a420, 0x1df9f: 0x6ca01a20, - 0x1dfa0: 0x6d18b620, 0x1dfa1: 0x6cf1b020, 0x1dfa2: 0x6d1ca020, 0x1dfa3: 0x6ce28420, - 0x1dfa4: 0x6d37ca20, 0x1dfa5: 0x6c123c20, 0x1dfa6: 0x6ccb1020, 0x1dfa7: 0x6cb81a20, - 0x1dfa8: 0x6c97c820, 0x1dfa9: 0x6ce5e620, 0x1dfaa: 0x6cce2020, 0x1dfab: 0x6cd3e620, - 0x1dfac: 0x6c129e20, 0x1dfad: 0x6c1ad620, 0x1dfae: 0x6c2ca620, 0x1dfaf: 0x6c027620, - 0x1dfb0: 0x6c92fa20, 0x1dfb1: 0x6cf0e820, 0x1dfb2: 0x6d371220, 0x1dfb3: 0x6ce14220, - 0x1dfb4: 0x6c18ea20, 0x1dfb5: 0x6cb16a20, 0x1dfb6: 0x6cc1c420, 0x1dfb7: 0x6cb02420, - 0x1dfb8: 0x6d21be20, 0x1dfb9: 0x6c66e420, 0x1dfba: 0x6c955820, 0x1dfbb: 0x6c90c220, - 0x1dfbc: 0x6cbdea20, 0x1dfbd: 0x6d37ce20, 0x1dfbe: 0x6d1b1420, 0x1dfbf: 0x6c678820, - // Block 0x77f, offset 0x1dfc0 - 0x1dfc0: 0x6cd67620, 0x1dfc1: 0x6cf1b820, 0x1dfc2: 0x6cff2620, 0x1dfc3: 0x6ceda020, - 0x1dfc4: 0x6d30a220, 0x1dfc5: 0x6d310820, 0x1dfc6: 0x6c96f820, 0x1dfc7: 0x6c967a20, - 0x1dfc8: 0x6c4c4820, 0x1dfc9: 0x6c8eaa20, 0x1dfca: 0x6c990a20, 0x1dfcb: 0x6cf6f220, - 0x1dfcc: 0x6c236a20, 0x1dfcd: 0x6c846220, 0x1dfce: 0x6c97d020, 0x1dfcf: 0x6cff2820, - 0x1dfd0: 0x6c173020, 0x1dfd1: 0x6d2ee220, 0x1dfd2: 0x6c98a020, 0x1dfd3: 0x6cfe5e20, - 0x1dfd4: 0x6ca17e20, 0x1dfd5: 0x6d418220, 0x1dfd6: 0x6cd83c20, 0x1dfd7: 0x6cbfd420, - 0x1dfd8: 0x6ce28820, 0x1dfd9: 0x6d34ac20, 0x1dfda: 0x6caed820, 0x1dfdb: 0x6caeda20, - 0x1dfdc: 0x6c695620, 0x1dfdd: 0x6cc1dc20, 0x1dfde: 0x6c0cc220, 0x1dfdf: 0x6c8a3c20, - 0x1dfe0: 0x6cac8220, 0x1dfe1: 0x6c4b2220, 0x1dfe2: 0x6cf81c20, 0x1dfe3: 0x6c615a20, - 0x1dfe4: 0x6d3b9620, 0x1dfe5: 0x6c5a0e20, 0x1dfe6: 0x6c3a4220, 0x1dfe7: 0x6c818420, - 0x1dfe8: 0x6c74de20, 0x1dfe9: 0x6c74e020, 0x1dfea: 0x6c5c7220, 0x1dfeb: 0x6d1aa220, - 0x1dfec: 0x6c153a20, 0x1dfed: 0x6c689c20, 0x1dfee: 0x6ccdcc20, 0x1dfef: 0x6ca4ca20, - 0x1dff0: 0x6cff3e20, 0x1dff1: 0x6cf40020, 0x1dff2: 0x6c1d2620, 0x1dff3: 0x6d0a5020, - 0x1dff4: 0x6cd83e20, 0x1dff5: 0x6c1f9c20, 0x1dff6: 0x6c19a020, 0x1dff7: 0x6c291e20, - 0x1dff8: 0x6c854420, 0x1dff9: 0x6d026620, 0x1dffa: 0x6ccdd420, 0x1dffb: 0x6d162420, - 0x1dffc: 0x6c6e3a20, 0x1dffd: 0x6c26c820, 0x1dffe: 0x6c154420, 0x1dfff: 0x6cb80020, - // Block 0x780, offset 0x1e000 - 0x1e000: 0x6c221820, 0x1e001: 0x6cfe0220, 0x1e002: 0x6ccf7e20, 0x1e003: 0x6c95c820, - 0x1e004: 0x6cbdb620, 0x1e005: 0x6d1d6e20, 0x1e006: 0x6c14a220, 0x1e007: 0x6c86da20, - 0x1e008: 0x6d2b6a20, 0x1e009: 0x6d07ea20, 0x1e00a: 0x6c888820, 0x1e00b: 0x6d3a3220, - 0x1e00c: 0x6d2b1e20, 0x1e00d: 0x6d005a20, 0x1e00e: 0x6c98a420, 0x1e00f: 0x6d026820, - 0x1e010: 0x6cb69a20, 0x1e011: 0x6cc6e220, 0x1e012: 0x6c661a20, 0x1e013: 0x6c9bf220, - 0x1e014: 0x6c500220, 0x1e015: 0x6cc7e420, 0x1e016: 0x6c5e3420, 0x1e017: 0x6d3dda20, - 0x1e018: 0x6c6b7820, 0x1e019: 0x6cb22420, 0x1e01a: 0x6c50aa20, 0x1e01b: 0x6c9f0e20, - 0x1e01c: 0x6c38ee20, 0x1e01d: 0x6c828a20, 0x1e01e: 0x6c6b7220, 0x1e01f: 0x6c7ec420, - 0x1e020: 0x6c9fda20, 0x1e021: 0x6c84ae20, 0x1e022: 0x6c219020, 0x1e023: 0x6c873220, - 0x1e024: 0x6cbfe620, 0x1e025: 0x6ca8bc20, 0x1e026: 0x6c919c20, 0x1e027: 0x6c328c20, - 0x1e028: 0x6cff5620, 0x1e029: 0x6d39ee20, 0x1e02a: 0x6c8ffc20, 0x1e02b: 0x6c875620, - 0x1e02c: 0x6c8ffe20, 0x1e02d: 0x6c3c8620, 0x1e02e: 0x6d127220, 0x1e02f: 0x6c086620, - 0x1e030: 0x6ca46020, 0x1e031: 0x6c47f220, 0x1e032: 0x6c730e20, 0x1e033: 0x6d1c4220, - 0x1e034: 0x6cd63820, 0x1e035: 0x6cf75820, 0x1e036: 0x6c11c820, 0x1e037: 0x6cc22420, - 0x1e038: 0x6cc33c20, 0x1e039: 0x6c329020, 0x1e03a: 0x6c11ca20, 0x1e03b: 0x6c97ae20, - 0x1e03c: 0x6cc22e20, 0x1e03d: 0x6c6b8e20, 0x1e03e: 0x6d3a4e20, 0x1e03f: 0x6d3d1820, - // Block 0x781, offset 0x1e040 - 0x1e040: 0x6d093820, 0x1e041: 0x6c598620, 0x1e042: 0x6ca9a420, 0x1e043: 0x6cadba20, - 0x1e044: 0x6caa8420, 0x1e045: 0x6d033020, 0x1e046: 0x6d383220, 0x1e047: 0x6c973420, - 0x1e048: 0x6c37ce20, 0x1e049: 0x6c761220, 0x1e04a: 0x6c9f1020, 0x1e04b: 0x6cf93c20, - 0x1e04c: 0x6d03ba20, 0x1e04d: 0x6d0d5c20, 0x1e04e: 0x6c770620, 0x1e04f: 0x6d260e20, - 0x1e050: 0x6cc28820, 0x1e051: 0x6c8d0220, 0x1e052: 0x6d089020, 0x1e053: 0x6cd5ca20, - 0x1e054: 0x6cfb5420, 0x1e055: 0x6ce7cc20, 0x1e056: 0x6cfe3820, 0x1e057: 0x6c6a1e20, - 0x1e058: 0x6cfb7020, 0x1e059: 0x6d0b3220, 0x1e05a: 0x6c559a20, 0x1e05b: 0x6cf0ca20, - 0x1e05c: 0x6c2a2c20, 0x1e05d: 0x6c1cdc20, 0x1e05e: 0x6cf0d420, 0x1e05f: 0x6c2a3620, - 0x1e060: 0x6d3cd820, 0x1e061: 0x6c527020, 0x1e062: 0x6cc22620, 0x1e063: 0x6d13be20, - 0x1e064: 0x6d198c20, 0x1e065: 0x6c103220, 0x1e066: 0x6c41ce20, 0x1e067: 0x6d20cc20, - 0x1e068: 0x6c0c7020, 0x1e069: 0x6c141820, 0x1e06a: 0x6d147a20, 0x1e06b: 0x6cccc820, - 0x1e06c: 0x6c191e20, 0x1e06d: 0x6c3d5620, 0x1e06e: 0x6c4bbc20, 0x1e06f: 0x6c3b1e20, - 0x1e070: 0x6cd65220, 0x1e071: 0x6c6a8820, 0x1e072: 0x6ca32020, 0x1e073: 0x6d37aa20, - 0x1e074: 0x6c282e20, 0x1e075: 0x6d170c20, 0x1e076: 0x6d381e20, 0x1e077: 0x6d37b220, - 0x1e078: 0x6c6bd220, 0x1e079: 0x6d350820, 0x1e07a: 0x6d009820, 0x1e07b: 0x6cc46820, - 0x1e07c: 0x6d33ba20, 0x1e07d: 0x6cc5da20, 0x1e07e: 0x6cbd2620, 0x1e07f: 0x6c6c3820, - // Block 0x782, offset 0x1e080 - 0x1e080: 0x6c756220, 0x1e081: 0x6d255820, 0x1e082: 0x6c9a8620, 0x1e083: 0x6c149620, - 0x1e084: 0x6c02a220, 0x1e085: 0x6ca79820, 0x1e086: 0x6c5a9e20, 0x1e087: 0x6cc46a20, - 0x1e088: 0x6c635620, 0x1e089: 0x6ceb1020, 0x1e08a: 0x6c8e0e20, 0x1e08b: 0x6c276620, - 0x1e08c: 0x6c064a20, 0x1e08d: 0x6cad5620, 0x1e08e: 0x6d120020, 0x1e08f: 0x6d429420, - 0x1e090: 0x6c097020, 0x1e091: 0x6cced220, 0x1e092: 0x6ce05820, 0x1e093: 0x6c723620, - 0x1e094: 0x6c51c220, 0x1e095: 0x6d090220, 0x1e096: 0x6d053820, 0x1e097: 0x6d31d220, - 0x1e098: 0x6d14da20, 0x1e099: 0x6cabea20, 0x1e09a: 0x6c0e6420, 0x1e09b: 0x6c2b2220, - 0x1e09c: 0x6cec2a20, 0x1e09d: 0x6c3fd620, 0x1e09e: 0x6c4bc420, 0x1e09f: 0x6d35ca20, - 0x1e0a0: 0x6d360a20, 0x1e0a1: 0x6cc47220, 0x1e0a2: 0x6cacb420, 0x1e0a3: 0x6d174620, - 0x1e0a4: 0x6c997420, 0x1e0a5: 0x6ceaba20, 0x1e0a6: 0x6ca32e20, 0x1e0a7: 0x6c464420, - 0x1e0a8: 0x6d088220, 0x1e0a9: 0x6d304220, 0x1e0aa: 0x6cc0f420, 0x1e0ab: 0x6c070420, - 0x1e0ac: 0x6c4bc620, 0x1e0ad: 0x6cf77c20, 0x1e0ae: 0x6ca6ea20, 0x1e0af: 0x6c0ee020, - 0x1e0b0: 0x6c0e7220, 0x1e0b1: 0x6c40ac20, 0x1e0b2: 0x6c1bac20, 0x1e0b3: 0x6c1ba220, - 0x1e0b4: 0x6c7a9420, 0x1e0b5: 0x6cc5ea20, 0x1e0b6: 0x6c67e220, 0x1e0b7: 0x6c63ba20, - 0x1e0b8: 0x6c667e20, 0x1e0b9: 0x6c0efa20, 0x1e0ba: 0x6c6aba20, 0x1e0bb: 0x6c375420, - 0x1e0bc: 0x6c438620, 0x1e0bd: 0x6cc7a620, 0x1e0be: 0x6d39a020, 0x1e0bf: 0x6c4a6020, - // Block 0x783, offset 0x1e0c0 - 0x1e0c0: 0x6d19d020, 0x1e0c1: 0x6c111020, 0x1e0c2: 0x6c8b1020, 0x1e0c3: 0x6c762220, - 0x1e0c4: 0x6d044420, 0x1e0c5: 0x6d3c1c20, 0x1e0c6: 0x6c28fc20, 0x1e0c7: 0x6d05aa20, - 0x1e0c8: 0x6c7d5e20, 0x1e0c9: 0x6c791a20, 0x1e0ca: 0x6ca79e20, 0x1e0cb: 0x6cd5dc20, - 0x1e0cc: 0x6c63c420, 0x1e0cd: 0x6c7db020, 0x1e0ce: 0x6c1a1220, 0x1e0cf: 0x6c852220, - 0x1e0d0: 0x6c72f620, 0x1e0d1: 0x6ccff420, 0x1e0d2: 0x6cb3da20, 0x1e0d3: 0x6c43fa20, - 0x1e0d4: 0x6d180820, 0x1e0d5: 0x6d235620, 0x1e0d6: 0x6d31da20, 0x1e0d7: 0x6c8e6020, - 0x1e0d8: 0x6cc07e20, 0x1e0d9: 0x6cc44820, 0x1e0da: 0x6c622620, 0x1e0db: 0x6d180a20, - 0x1e0dc: 0x6c103e20, 0x1e0dd: 0x6d3c1e20, 0x1e0de: 0x6cd72420, 0x1e0df: 0x6ccc0420, - 0x1e0e0: 0x6cc44e20, 0x1e0e1: 0x6c87e220, 0x1e0e2: 0x6c880620, 0x1e0e3: 0x6c88c020, - 0x1e0e4: 0x6c7a9e20, 0x1e0e5: 0x6c659e20, 0x1e0e6: 0x6c3d1820, 0x1e0e7: 0x6c14d020, - 0x1e0e8: 0x6c09e020, 0x1e0e9: 0x6c7d7020, 0x1e0ea: 0x6ce22e20, 0x1e0eb: 0x6d262a20, - 0x1e0ec: 0x6c8d2220, 0x1e0ed: 0x6c1bb420, 0x1e0ee: 0x6c167420, 0x1e0ef: 0x6c1dc420, - 0x1e0f0: 0x6c343220, 0x1e0f1: 0x6c0c7420, 0x1e0f2: 0x6c899620, 0x1e0f3: 0x6cce5c20, - 0x1e0f4: 0x6cade020, 0x1e0f5: 0x6cade220, 0x1e0f6: 0x6c3a0e20, 0x1e0f7: 0x6d24fe20, - 0x1e0f8: 0x6c95b820, 0x1e0f9: 0x6c4cca20, 0x1e0fa: 0x6d0daa20, 0x1e0fb: 0x6c31aa20, - 0x1e0fc: 0x6ce40420, 0x1e0fd: 0x6d369a20, 0x1e0fe: 0x6c70ae20, 0x1e0ff: 0x6d15fa20, - // Block 0x784, offset 0x1e100 - 0x1e100: 0x6c622820, 0x1e101: 0x6d346c20, 0x1e102: 0x6c48ba20, 0x1e103: 0x6c791c20, - 0x1e104: 0x6cb81620, 0x1e105: 0x6ce40a20, 0x1e106: 0x6ce35820, 0x1e107: 0x6c402420, - 0x1e108: 0x6c1d1a20, 0x1e109: 0x6d01f020, 0x1e10a: 0x6c0b4820, 0x1e10b: 0x6c2ed820, - 0x1e10c: 0x6c7d7c20, 0x1e10d: 0x6c32a020, 0x1e10e: 0x6d054a20, 0x1e10f: 0x6d054c20, - 0x1e110: 0x6c51d620, 0x1e111: 0x6d262c20, 0x1e112: 0x6c05ba20, 0x1e113: 0x6c060620, - 0x1e114: 0x6c402620, 0x1e115: 0x6d217c20, 0x1e116: 0x6ce98c20, 0x1e117: 0x6d0dc420, - 0x1e118: 0x6c5adc20, 0x1e119: 0x6c074420, 0x1e11a: 0x6c1ee220, 0x1e11b: 0x6c93aa20, - 0x1e11c: 0x6cadaa20, 0x1e11d: 0x6c27ee20, 0x1e11e: 0x6d27f420, 0x1e11f: 0x6cddf820, - 0x1e120: 0x6c465c20, 0x1e121: 0x6c265c20, 0x1e122: 0x6c57ee20, 0x1e123: 0x6cc6aa20, - 0x1e124: 0x6d262e20, 0x1e125: 0x6cc82620, 0x1e126: 0x6ca3d420, 0x1e127: 0x6c6f3220, - 0x1e128: 0x6cdd8620, 0x1e129: 0x6c04a220, 0x1e12a: 0x6cea0a20, 0x1e12b: 0x6c1bbe20, - 0x1e12c: 0x6cca8a20, 0x1e12d: 0x6ca7ae20, 0x1e12e: 0x6d1bec20, 0x1e12f: 0x6c6bfa20, - 0x1e130: 0x6cb91e20, 0x1e131: 0x6c57f420, 0x1e132: 0x6c7aa820, 0x1e133: 0x6c884220, - 0x1e134: 0x6c7fae20, 0x1e135: 0x6c843420, 0x1e136: 0x6d30de20, 0x1e137: 0x6cd1fc20, - 0x1e138: 0x6c93b620, 0x1e139: 0x6d18b820, 0x1e13a: 0x6c2e5e20, 0x1e13b: 0x6d023220, - 0x1e13c: 0x6cfae020, 0x1e13d: 0x6cf0ea20, 0x1e13e: 0x6c0c7e20, 0x1e13f: 0x6c129620, - // Block 0x785, offset 0x1e140 - 0x1e140: 0x6c5f4620, 0x1e141: 0x6cbb4c20, 0x1e142: 0x6ccbb020, 0x1e143: 0x6c05bc20, - 0x1e144: 0x6cfd8c20, 0x1e145: 0x6c0ae420, 0x1e146: 0x6c3f0c20, 0x1e147: 0x6c65e620, - 0x1e148: 0x6d3bea20, 0x1e149: 0x6c65e820, 0x1e14a: 0x6c257020, 0x1e14b: 0x6c60c820, - 0x1e14c: 0x6c280620, 0x1e14d: 0x6d28d020, 0x1e14e: 0x6c38cc20, 0x1e14f: 0x6c0f7e20, - 0x1e150: 0x6cfe5a20, 0x1e151: 0x6d030420, 0x1e152: 0x6c0cf820, 0x1e153: 0x6cc52e20, - 0x1e154: 0x6c97ca20, 0x1e155: 0x6c7fc620, 0x1e156: 0x6c02b220, 0x1e157: 0x6d2b1620, - 0x1e158: 0x6c4b8e20, 0x1e159: 0x6c12bc20, 0x1e15a: 0x6cdc9220, 0x1e15b: 0x6ca9d620, - 0x1e15c: 0x6c14dc20, 0x1e15d: 0x6c88d220, 0x1e15e: 0x6c0aac20, 0x1e15f: 0x6c6c6a20, - 0x1e160: 0x6c291620, 0x1e161: 0x6cd58220, 0x1e162: 0x6ce08020, 0x1e163: 0x6c0aae20, - 0x1e164: 0x6c7fd820, 0x1e165: 0x6cb46e20, 0x1e166: 0x6cc7e020, 0x1e167: 0x6d355e20, - 0x1e168: 0x6c32ec20, 0x1e169: 0x6cd58620, 0x1e16a: 0x6cec4220, 0x1e16b: 0x6cd40020, - 0x1e16c: 0x6c042c20, 0x1e16d: 0x6d012020, 0x1e16e: 0x6c0fbe20, 0x1e16f: 0x6c194220, - 0x1e170: 0x6c7f7c20, 0x1e171: 0x6c8fee20, 0x1e172: 0x6cf7c420, 0x1e173: 0x6cfb0c20, - 0x1e174: 0x6c800220, 0x1e175: 0x6d30e220, 0x1e176: 0x6c27aa20, 0x1e177: 0x6c72d820, - 0x1e178: 0x6d29c620, 0x1e179: 0x6cd21c20, 0x1e17a: 0x6c663820, 0x1e17b: 0x6cacc620, - 0x1e17c: 0x6d196820, 0x1e17d: 0x6c809c20, 0x1e17e: 0x6d0b7020, 0x1e17f: 0x6cf94020, - // Block 0x786, offset 0x1e180 - 0x1e180: 0x6cf57420, 0x1e181: 0x6d11f820, 0x1e182: 0x6c3cc820, 0x1e183: 0x6cdfe620, - 0x1e184: 0x6c40b420, 0x1e185: 0x6c3d0620, 0x1e186: 0x6c407e20, 0x1e187: 0x6c03c820, - 0x1e188: 0x6c519620, 0x1e189: 0x6c5fa420, 0x1e18a: 0x6c5fb420, 0x1e18b: 0x6c665220, - 0x1e18c: 0x6c490820, 0x1e18d: 0x6c0b9020, 0x1e18e: 0x6d0e5620, 0x1e18f: 0x6c4a6220, - 0x1e190: 0x6c743020, 0x1e191: 0x6cb13a20, 0x1e192: 0x6c997620, 0x1e193: 0x6c9d4020, - 0x1e194: 0x6c9d4220, 0x1e195: 0x6c9ed620, 0x1e196: 0x6cd36c20, 0x1e197: 0x6cd8c420, - 0x1e198: 0x6c14cc20, 0x1e199: 0x6c954a20, 0x1e19a: 0x6c745a20, 0x1e19b: 0x6c9d6020, - 0x1e19c: 0x6ce5da20, 0x1e19d: 0x6c882620, 0x1e19e: 0x6d121820, 0x1e19f: 0x6d369c20, - 0x1e1a0: 0x6c757a20, 0x1e1a1: 0x6cf79620, 0x1e1a2: 0x6ccd5a20, 0x1e1a3: 0x6ceeb620, - 0x1e1a4: 0x6cf8d220, 0x1e1a5: 0x6ce51220, 0x1e1a6: 0x6d21a620, 0x1e1a7: 0x6c803e20, - 0x1e1a8: 0x6c36aa20, 0x1e1a9: 0x6c322a20, 0x1e1aa: 0x6cbd3e20, 0x1e1ab: 0x6cad2220, - 0x1e1ac: 0x6c62a220, 0x1e1ad: 0x6ca01e20, 0x1e1ae: 0x6d1caa20, 0x1e1af: 0x6c46dc20, - 0x1e1b0: 0x6cc15020, 0x1e1b1: 0x6d2e8c20, 0x1e1b2: 0x6c6d6c20, 0x1e1b3: 0x6c492c20, - 0x1e1b4: 0x6c2abc20, 0x1e1b5: 0x6c670420, 0x1e1b6: 0x6c956420, 0x1e1b7: 0x6cc28220, - 0x1e1b8: 0x6c652620, 0x1e1b9: 0x6cef6220, 0x1e1ba: 0x6c750220, 0x1e1bb: 0x6cc15c20, - 0x1e1bc: 0x6c956a20, 0x1e1bd: 0x6c805420, 0x1e1be: 0x6cd08a20, 0x1e1bf: 0x6c2bba20, - // Block 0x787, offset 0x1e1c0 - 0x1e1c0: 0x6c494420, 0x1e1c1: 0x6c664e20, 0x1e1c2: 0x6c490220, 0x1e1c3: 0x6d0e3e20, - 0x1e1c4: 0x6c4a3a20, 0x1e1c5: 0x6c9d2a20, 0x1e1c6: 0x6cd32020, 0x1e1c7: 0x6c14be20, - 0x1e1c8: 0x6c802020, 0x1e1c9: 0x6c740a20, 0x1e1ca: 0x6c61d620, 0x1e1cb: 0x6cf77e20, - 0x1e1cc: 0x6c2b6e20, 0x1e1cd: 0x6ce4fc20, 0x1e1ce: 0x6d216820, 0x1e1cf: 0x6c46cc20, - 0x1e1d0: 0x6c6d4620, 0x1e1d1: 0x6cc27220, 0x1e1d2: 0x6c68c620, 0x1e1d3: 0x6cc01820, - 0x1e1d4: 0x6c6c3a20, 0x1e1d5: 0x6c241220, 0x1e1d6: 0x6c743220, 0x1e1d7: 0x6d360c20, - 0x1e1d8: 0x6c17bc20, 0x1e1d9: 0x6c600a20, 0x1e1da: 0x6c471220, 0x1e1db: 0x6c289020, - 0x1e1dc: 0x6d3e5820, 0x1e1dd: 0x6c2bf820, 0x1e1de: 0x6cce0420, 0x1e1df: 0x6c57a020, - 0x1e1e0: 0x6cc30220, 0x1e1e1: 0x6c440c20, 0x1e1e2: 0x6cd3a020, 0x1e1e3: 0x6c6b9820, - 0x1e1e4: 0x6c4b0a20, 0x1e1e5: 0x6c459820, 0x1e1e6: 0x6c1f5c20, 0x1e1e7: 0x6c6b9a20, - 0x1e1e8: 0x6c5d3a20, 0x1e1e9: 0x6cc08420, 0x1e1ea: 0x6d039020, 0x1e1eb: 0x6cdaf220, - 0x1e1ec: 0x6ca60220, 0x1e1ed: 0x6c5f1e20, 0x1e1ee: 0x6c92b420, 0x1e1ef: 0x6d36c020, - 0x1e1f0: 0x6d2bfa20, 0x1e1f1: 0x6c0a5e20, 0x1e1f2: 0x6d03a620, 0x1e1f3: 0x6c55cc20, - 0x1e1f4: 0x6cce2220, 0x1e1f5: 0x6c45be20, 0x1e1f6: 0x6d374820, 0x1e1f7: 0x6d092820, - 0x1e1f8: 0x6c1f8a20, 0x1e1f9: 0x6cf71a20, 0x1e1fa: 0x6d159420, 0x1e1fb: 0x6c877e20, - 0x1e1fc: 0x6c750e20, 0x1e1fd: 0x6cf75020, 0x1e1fe: 0x6d0f0c20, 0x1e1ff: 0x6cf75e20, - // Block 0x788, offset 0x1e200 - 0x1e200: 0x6d0c5c20, 0x1e201: 0x6d0f3620, 0x1e202: 0x6c2f9a20, 0x1e203: 0x6c3fc620, - 0x1e204: 0x6cc01a20, 0x1e205: 0x6cc01c20, 0x1e206: 0x6c698a20, 0x1e207: 0x6c529c20, - 0x1e208: 0x6c61b820, 0x1e209: 0x6c384c20, 0x1e20a: 0x6d0a7e20, 0x1e20b: 0x6c2e1420, - 0x1e20c: 0x6c53b820, 0x1e20d: 0x6c149820, 0x1e20e: 0x6ce25c20, 0x1e20f: 0x6d058620, - 0x1e210: 0x6c6aaa20, 0x1e211: 0x6d14dc20, 0x1e212: 0x6cc5e020, 0x1e213: 0x6d0ac020, - 0x1e214: 0x6d1a4e20, 0x1e215: 0x6ccd7e20, 0x1e216: 0x6cb77020, 0x1e217: 0x6ceabc20, - 0x1e218: 0x6c61d820, 0x1e219: 0x6d0a8020, 0x1e21a: 0x6d1a5020, 0x1e21b: 0x6c356020, - 0x1e21c: 0x6c3b2c20, 0x1e21d: 0x6d0ba420, 0x1e21e: 0x6d109e20, 0x1e21f: 0x6cd98c20, - 0x1e220: 0x6cd06020, 0x1e221: 0x6d1a5e20, 0x1e222: 0x6d02ce20, 0x1e223: 0x6c743420, - 0x1e224: 0x6cff8620, 0x1e225: 0x6ca54e20, 0x1e226: 0x6c18c020, 0x1e227: 0x6d1f2e20, - 0x1e228: 0x6d352220, 0x1e229: 0x6d046820, 0x1e22a: 0x6c39d620, 0x1e22b: 0x6d033220, - 0x1e22c: 0x6c174020, 0x1e22d: 0x6ccf4420, 0x1e22e: 0x6cfaa220, 0x1e22f: 0x6cc94e20, - 0x1e230: 0x6d3ce220, 0x1e231: 0x6d063c20, 0x1e232: 0x6d177820, 0x1e233: 0x6d177a20, - 0x1e234: 0x6cdb7a20, 0x1e235: 0x6c1ab220, 0x1e236: 0x6c509e20, 0x1e237: 0x6ccff620, - 0x1e238: 0x6c512c20, 0x1e239: 0x6d06e620, 0x1e23a: 0x6d31de20, 0x1e23b: 0x6d3afa20, - 0x1e23c: 0x6d334e20, 0x1e23d: 0x6c46a820, 0x1e23e: 0x6d3e5c20, 0x1e23f: 0x6d3f1c20, - // Block 0x789, offset 0x1e240 - 0x1e240: 0x6d2d7820, 0x1e241: 0x6c479420, 0x1e242: 0x6c3ffe20, 0x1e243: 0x6c65a020, - 0x1e244: 0x6c2eb420, 0x1e245: 0x6c8d0a20, 0x1e246: 0x6c2bfa20, 0x1e247: 0x6d104e20, - 0x1e248: 0x6c861c20, 0x1e249: 0x6ca4b020, 0x1e24a: 0x6cacb820, 0x1e24b: 0x6d392e20, - 0x1e24c: 0x6c422220, 0x1e24d: 0x6d17c420, 0x1e24e: 0x6c724420, 0x1e24f: 0x6d120c20, - 0x1e250: 0x6d2cc820, 0x1e251: 0x6d150020, 0x1e252: 0x6d150220, 0x1e253: 0x6cc24a20, - 0x1e254: 0x6d2fb620, 0x1e255: 0x6cb2b220, 0x1e256: 0x6c09ac20, 0x1e257: 0x6d049620, - 0x1e258: 0x6cc11620, 0x1e259: 0x6c037c20, 0x1e25a: 0x6c26aa20, 0x1e25b: 0x6d411e20, - 0x1e25c: 0x6ce1cc20, 0x1e25d: 0x6d3a7220, 0x1e25e: 0x6c224820, 0x1e25f: 0x6d305e20, - 0x1e260: 0x6d1e3e20, 0x1e261: 0x6d064620, 0x1e262: 0x6d0a2020, 0x1e263: 0x6d180c20, - 0x1e264: 0x6c5a5620, 0x1e265: 0x6c514420, 0x1e266: 0x6cd3a220, 0x1e267: 0x6c13f020, - 0x1e268: 0x6cfff820, 0x1e269: 0x6cd1d820, 0x1e26a: 0x6c523e20, 0x1e26b: 0x6c144420, - 0x1e26c: 0x6c46ba20, 0x1e26d: 0x6c4b0c20, 0x1e26e: 0x6cc30420, 0x1e26f: 0x6c5bea20, - 0x1e270: 0x6c6afc20, 0x1e271: 0x6c57a220, 0x1e272: 0x6c40fc20, 0x1e273: 0x6cfdca20, - 0x1e274: 0x6ceea420, 0x1e275: 0x6ccffc20, 0x1e276: 0x6d393420, 0x1e277: 0x6ce75c20, - 0x1e278: 0x6c9c6220, 0x1e279: 0x6d2d8420, 0x1e27a: 0x6ca04620, 0x1e27b: 0x6c366420, - 0x1e27c: 0x6c5ace20, 0x1e27d: 0x6d0cb220, 0x1e27e: 0x6d046e20, 0x1e27f: 0x6c48bc20, - // Block 0x78a, offset 0x1e280 - 0x1e280: 0x6c37d220, 0x1e281: 0x6c0e2420, 0x1e282: 0x6ce5c420, 0x1e283: 0x6d152020, - 0x1e284: 0x6c82ca20, 0x1e285: 0x6d39b420, 0x1e286: 0x6c7ba420, 0x1e287: 0x6c7ac620, - 0x1e288: 0x6cf3dc20, 0x1e289: 0x6d238220, 0x1e28a: 0x6ce2a420, 0x1e28b: 0x6c625220, - 0x1e28c: 0x6d36a020, 0x1e28d: 0x6cc60220, 0x1e28e: 0x6c244e20, 0x1e28f: 0x6c810c20, - 0x1e290: 0x6c357a20, 0x1e291: 0x6c7bc620, 0x1e292: 0x6c370c20, 0x1e293: 0x6cd3b820, - 0x1e294: 0x6ce6d820, 0x1e295: 0x6c289620, 0x1e296: 0x6c074620, 0x1e297: 0x6c151020, - 0x1e298: 0x6d205620, 0x1e299: 0x6c794a20, 0x1e29a: 0x6cbc4e20, 0x1e29b: 0x6cbd3820, - 0x1e29c: 0x6cd65020, 0x1e29d: 0x6c014220, 0x1e29e: 0x6d227c20, 0x1e29f: 0x6cfffe20, - 0x1e2a0: 0x6c1a2220, 0x1e2a1: 0x6c6bf420, 0x1e2a2: 0x6cfcee20, 0x1e2a3: 0x6cf37a20, - 0x1e2a4: 0x6cf51020, 0x1e2a5: 0x6c435620, 0x1e2a6: 0x6cd99a20, 0x1e2a7: 0x6c101a20, - 0x1e2a8: 0x6c5c0420, 0x1e2a9: 0x6c6e9820, 0x1e2aa: 0x6cd76a20, 0x1e2ab: 0x6d325220, - 0x1e2ac: 0x6cd76c20, 0x1e2ad: 0x6c31ae20, 0x1e2ae: 0x6c57e420, 0x1e2af: 0x6c172420, - 0x1e2b0: 0x6cd6fe20, 0x1e2b1: 0x6c6b2820, 0x1e2b2: 0x6c78d420, 0x1e2b3: 0x6cc13a20, - 0x1e2b4: 0x6c23ac20, 0x1e2b5: 0x6cff9820, 0x1e2b6: 0x6cdc6420, 0x1e2b7: 0x6cee3620, - 0x1e2b8: 0x6cfb8620, 0x1e2b9: 0x6c3a6c20, 0x1e2ba: 0x6c1ad220, 0x1e2bb: 0x6cde9220, - 0x1e2bc: 0x6d186620, 0x1e2bd: 0x6ca6c220, 0x1e2be: 0x6d1a9a20, 0x1e2bf: 0x6c2e3820, - // Block 0x78b, offset 0x1e2c0 - 0x1e2c0: 0x6cb06820, 0x1e2c1: 0x6d3d8c20, 0x1e2c2: 0x6c15de20, 0x1e2c3: 0x6c188420, - 0x1e2c4: 0x6d3cd620, 0x1e2c5: 0x6c626a20, 0x1e2c6: 0x6cb52820, 0x1e2c7: 0x6ce00820, - 0x1e2c8: 0x6d3ca420, 0x1e2c9: 0x6cf00c20, 0x1e2ca: 0x6c714c20, 0x1e2cb: 0x6cbeb220, - 0x1e2cc: 0x6c303c20, 0x1e2cd: 0x6d335420, 0x1e2ce: 0x6d2af220, 0x1e2cf: 0x6d406020, - 0x1e2d0: 0x6cb91620, 0x1e2d1: 0x6d3d8e20, 0x1e2d2: 0x6c89c820, 0x1e2d3: 0x6c66c020, - 0x1e2d4: 0x6c1f6e20, 0x1e2d5: 0x6c4fe420, 0x1e2d6: 0x6c952620, 0x1e2d7: 0x6cd06e20, - 0x1e2d8: 0x6c0c7820, 0x1e2d9: 0x6c581220, 0x1e2da: 0x6cb12620, 0x1e2db: 0x6d219420, - 0x1e2dc: 0x6c2eea20, 0x1e2dd: 0x6d05e820, 0x1e2de: 0x6cb14220, 0x1e2df: 0x6cd3de20, - 0x1e2e0: 0x6d07d220, 0x1e2e1: 0x6cd3e020, 0x1e2e2: 0x6c5d4220, 0x1e2e3: 0x6c57c020, - 0x1e2e4: 0x6c36ac20, 0x1e2e5: 0x6d384020, 0x1e2e6: 0x6c2c9c20, 0x1e2e7: 0x6d00f220, - 0x1e2e8: 0x6c3ef620, 0x1e2e9: 0x6cb49420, 0x1e2ea: 0x6ce69020, 0x1e2eb: 0x6c66d620, - 0x1e2ec: 0x6cb71e20, 0x1e2ed: 0x6d23f620, 0x1e2ee: 0x6d3e9020, 0x1e2ef: 0x6d3b9420, - 0x1e2f0: 0x6cf81420, 0x1e2f1: 0x6c5c4220, 0x1e2f2: 0x6d1a0220, 0x1e2f3: 0x6c015020, - 0x1e2f4: 0x6cfb9e20, 0x1e2f5: 0x6ca40e20, 0x1e2f6: 0x6c18ec20, 0x1e2f7: 0x6c3cce20, - 0x1e2f8: 0x6d39c620, 0x1e2f9: 0x6d0fd820, 0x1e2fa: 0x6d0ec420, 0x1e2fb: 0x6c5a0020, - 0x1e2fc: 0x6d07d420, 0x1e2fd: 0x6c443a20, 0x1e2fe: 0x6cab0e20, 0x1e2ff: 0x6cb53220, - // Block 0x78c, offset 0x1e300 - 0x1e300: 0x6ca1e820, 0x1e301: 0x6d134620, 0x1e302: 0x6cf0d620, 0x1e303: 0x6d044620, - 0x1e304: 0x6ce2ba20, 0x1e305: 0x6d38b620, 0x1e306: 0x6ccdc020, 0x1e307: 0x6c65ec20, - 0x1e308: 0x6cb33a20, 0x1e309: 0x6c7d2220, 0x1e30a: 0x6c5a6420, 0x1e30b: 0x6c5e0c20, - 0x1e30c: 0x6c43b620, 0x1e30d: 0x6d1cac20, 0x1e30e: 0x6c9c7420, 0x1e30f: 0x6cffc020, - 0x1e310: 0x6c9d9820, 0x1e311: 0x6cf81a20, 0x1e312: 0x6cbae220, 0x1e313: 0x6c188c20, - 0x1e314: 0x6d097220, 0x1e315: 0x6ce38820, 0x1e316: 0x6cdb4a20, 0x1e317: 0x6c059420, - 0x1e318: 0x6c1b5a20, 0x1e319: 0x6cb92820, 0x1e31a: 0x6cd3ea20, 0x1e31b: 0x6c67c820, - 0x1e31c: 0x6d25b620, 0x1e31d: 0x6d023620, 0x1e31e: 0x6c51f620, 0x1e31f: 0x6ce1f220, - 0x1e320: 0x6d115020, 0x1e321: 0x6d115220, 0x1e322: 0x6d378020, 0x1e323: 0x6d21c820, - 0x1e324: 0x6c0c4020, 0x1e325: 0x6c23e020, 0x1e326: 0x6cbee620, 0x1e327: 0x6c846420, - 0x1e328: 0x6ca08020, 0x1e329: 0x6ca17620, 0x1e32a: 0x6cce2420, 0x1e32b: 0x6d30b020, - 0x1e32c: 0x6ca05420, 0x1e32d: 0x6c660420, 0x1e32e: 0x6d2b1820, 0x1e32f: 0x6c6a3a20, - 0x1e330: 0x6c886e20, 0x1e331: 0x6c90c620, 0x1e332: 0x6c121020, 0x1e333: 0x6cab5e20, - 0x1e334: 0x6c4c0620, 0x1e335: 0x6cf7ae20, 0x1e336: 0x6d3dc020, 0x1e337: 0x6c027a20, - 0x1e338: 0x6c027c20, 0x1e339: 0x6c6cc220, 0x1e33a: 0x6d30b220, 0x1e33b: 0x6d158620, - 0x1e33c: 0x6c551220, 0x1e33d: 0x6c680e20, 0x1e33e: 0x6c978e20, 0x1e33f: 0x6c178a20, - // Block 0x78d, offset 0x1e340 - 0x1e340: 0x6c4f2620, 0x1e341: 0x6c576020, 0x1e342: 0x6c160020, 0x1e343: 0x6d060020, - 0x1e344: 0x6d2ba420, 0x1e345: 0x6ccb9220, 0x1e346: 0x6cf71c20, 0x1e347: 0x6d2c0420, - 0x1e348: 0x6c337a20, 0x1e349: 0x6d336c20, 0x1e34a: 0x6ca4ce20, 0x1e34b: 0x6c7fda20, - 0x1e34c: 0x6c359820, 0x1e34d: 0x6d1c2620, 0x1e34e: 0x6c74ee20, 0x1e34f: 0x6c5f8220, - 0x1e350: 0x6d421220, 0x1e351: 0x6c696020, 0x1e352: 0x6c0ffc20, 0x1e353: 0x6c5c8620, - 0x1e354: 0x6d3bf420, 0x1e355: 0x6cf40820, 0x1e356: 0x6d2b7a20, 0x1e357: 0x6d2c6220, - 0x1e358: 0x6cd42220, 0x1e359: 0x6cbc6c20, 0x1e35a: 0x6ce03620, 0x1e35b: 0x6d2b7c20, - 0x1e35c: 0x6cb4a020, 0x1e35d: 0x6cd12820, 0x1e35e: 0x6d07ee20, 0x1e35f: 0x6d2a9820, - 0x1e360: 0x6ce04020, 0x1e361: 0x6c293620, 0x1e362: 0x6cdcac20, 0x1e363: 0x6cfc4e20, - 0x1e364: 0x6c5f8c20, 0x1e365: 0x6c69d820, 0x1e366: 0x6c6e3c20, 0x1e367: 0x6d2e9820, - 0x1e368: 0x6ca45c20, 0x1e369: 0x6d143220, 0x1e36a: 0x6c010420, 0x1e36b: 0x6d2dbc20, - 0x1e36c: 0x6cb0d820, 0x1e36d: 0x6c5b7e20, 0x1e36e: 0x6c57d420, 0x1e36f: 0x6d193220, - 0x1e370: 0x6d193420, 0x1e371: 0x6ccdd620, 0x1e372: 0x6cc51c20, 0x1e373: 0x6caa3220, - 0x1e374: 0x6cba3220, 0x1e375: 0x6d3cbe20, 0x1e376: 0x6cdee420, 0x1e377: 0x6c56e020, - 0x1e378: 0x6d38c420, 0x1e379: 0x6c500420, 0x1e37a: 0x6c010620, 0x1e37b: 0x6d1c3420, - 0x1e37c: 0x6c671a20, 0x1e37d: 0x6d246620, 0x1e37e: 0x6c662c20, 0x1e37f: 0x6c5c9c20, - // Block 0x78e, offset 0x1e380 - 0x1e380: 0x6c31f020, 0x1e381: 0x6d30bc20, 0x1e382: 0x6d08d020, 0x1e383: 0x6d29bc20, - 0x1e384: 0x6c830c20, 0x1e385: 0x6cd08c20, 0x1e386: 0x6cf12220, 0x1e387: 0x6c161a20, - 0x1e388: 0x6c879020, 0x1e389: 0x6d159a20, 0x1e38a: 0x6c0bdc20, 0x1e38b: 0x6d30c820, - 0x1e38c: 0x6d0f0e20, 0x1e38d: 0x6c36f220, 0x1e38e: 0x6c1e0e20, 0x1e38f: 0x6cf12a20, - 0x1e390: 0x6c1e1020, 0x1e391: 0x6d125620, 0x1e392: 0x6c157c20, 0x1e393: 0x6cc51e20, - 0x1e394: 0x6d1b2c20, 0x1e395: 0x6c801020, 0x1e396: 0x6c194820, 0x1e397: 0x6d013820, - 0x1e398: 0x6ca8cc20, 0x1e399: 0x6c584c20, 0x1e39a: 0x6d29ca20, 0x1e39b: 0x6d197c20, - 0x1e39c: 0x6c294a20, 0x1e39d: 0x6d2dda20, 0x1e39e: 0x6d0f2a20, 0x1e39f: 0x6c321020, - 0x1e3a0: 0x6d0c5020, 0x1e3a1: 0x6c616e20, 0x1e3a2: 0x6c2f8c20, 0x1e3a3: 0x6c3fa220, - 0x1e3a4: 0x6cc5a420, 0x1e3a5: 0x6c5e6620, 0x1e3a6: 0x6c6a5c20, 0x1e3a7: 0x6c53b420, - 0x1e3a8: 0x6ce25820, 0x1e3a9: 0x6cc51820, 0x1e3aa: 0x6ccd6620, 0x1e3ab: 0x6cb72820, - 0x1e3ac: 0x6cea9420, 0x1e3ad: 0x6d0abe20, 0x1e3ae: 0x6d164e20, 0x1e3af: 0x6d0a6220, - 0x1e3b0: 0x6c617020, 0x1e3b1: 0x6cc5aa20, 0x1e3b2: 0x6c679c20, 0x1e3b3: 0x6c5b8c20, - 0x1e3b4: 0x6cab2c20, 0x1e3b5: 0x6c71f420, 0x1e3b6: 0x6d0b7220, 0x1e3b7: 0x6ca54220, - 0x1e3b8: 0x6d062420, 0x1e3b9: 0x6c354620, 0x1e3ba: 0x6c952020, 0x1e3bb: 0x6d045220, - 0x1e3bc: 0x6cd97c20, 0x1e3bd: 0x6c3cc420, 0x1e3be: 0x6ccf3220, 0x1e3bf: 0x6c39b820, - // Block 0x78f, offset 0x1e3c0 - 0x1e3c0: 0x6c73d620, 0x1e3c1: 0x6d333a20, 0x1e3c2: 0x6c475a20, 0x1e3c3: 0x6c508a20, - 0x1e3c4: 0x6cb27020, 0x1e3c5: 0x6d410820, 0x1e3c6: 0x6cd40e20, 0x1e3c7: 0x6d048620, - 0x1e3c8: 0x6d2caa20, 0x1e3c9: 0x6cdb7820, 0x1e3ca: 0x6d31b420, 0x1e3cb: 0x6c2bce20, - 0x1e3cc: 0x6d385420, 0x1e3cd: 0x6c221e20, 0x1e3ce: 0x6cc0d420, 0x1e3cf: 0x6d2f9820, - 0x1e3d0: 0x6c092020, 0x1e3d1: 0x6d169c20, 0x1e3d2: 0x6d146620, 0x1e3d3: 0x6c7b8620, - 0x1e3d4: 0x6c82b620, 0x1e3d5: 0x6cd32220, 0x1e3d6: 0x6c48aa20, 0x1e3d7: 0x6cd19c20, - 0x1e3d8: 0x6c5fe420, 0x1e3d9: 0x6c5a8c20, 0x1e3da: 0x6c19c020, 0x1e3db: 0x6d398420, - 0x1e3dc: 0x6ccfb420, 0x1e3dd: 0x6c578620, 0x1e3de: 0x6c286c20, 0x1e3df: 0x6c469620, - 0x1e3e0: 0x6cc2ba20, 0x1e3e1: 0x6c4aca20, 0x1e3e2: 0x6d09e020, 0x1e3e3: 0x6d16d220, - 0x1e3e4: 0x6d328e20, 0x1e3e5: 0x6c40de20, 0x1e3e6: 0x6cfdb020, 0x1e3e7: 0x6c143220, - 0x1e3e8: 0x6c5d1a20, 0x1e3e9: 0x6d062e20, 0x1e3ea: 0x6d386220, 0x1e3eb: 0x6c6bd420, - 0x1e3ec: 0x6cf35c20, 0x1e3ed: 0x6d223020, 0x1e3ee: 0x6cbc3220, 0x1e3ef: 0x6cf4ce20, - 0x1e3f0: 0x6c433c20, 0x1e3f1: 0x6d203220, 0x1e3f2: 0x6c5ba420, 0x1e3f3: 0x6c7bbc20, - 0x1e3f4: 0x6cd76620, 0x1e3f5: 0x6cd98220, 0x1e3f6: 0x6c370a20, 0x1e3f7: 0x6cbea220, - 0x1e3f8: 0x6d399620, 0x1e3f9: 0x6d404a20, 0x1e3fa: 0x6caae620, 0x1e3fb: 0x6c319420, - 0x1e3fc: 0x6d3d3e20, 0x1e3fd: 0x6c3a4e20, 0x1e3fe: 0x6c789c20, 0x1e3ff: 0x6cefa620, - // Block 0x790, offset 0x1e400 - 0x1e400: 0x6d20f820, 0x1e401: 0x6cd6fa20, 0x1e402: 0x6cd05420, 0x1e403: 0x6c2e1620, - 0x1e404: 0x6c15a220, 0x1e405: 0x6c89b020, 0x1e406: 0x6d3cd020, 0x1e407: 0x6cdc3220, - 0x1e408: 0x6cdfd620, 0x1e409: 0x6cd05620, 0x1e40a: 0x6d174820, 0x1e40b: 0x6ca1d020, - 0x1e40c: 0x6c18c220, 0x1e40d: 0x6c2e9620, 0x1e40e: 0x6c5a5220, 0x1e40f: 0x6c668220, - 0x1e410: 0x6d00a620, 0x1e411: 0x6d095a20, 0x1e412: 0x6d12ea20, 0x1e413: 0x6cf08820, - 0x1e414: 0x6c361a20, 0x1e415: 0x6d232420, 0x1e416: 0x6d078e20, 0x1e417: 0x6c14f020, - 0x1e418: 0x6d3e2c20, 0x1e419: 0x6c012c20, 0x1e41a: 0x6d0e6620, 0x1e41b: 0x6c2c5020, - 0x1e41c: 0x6c9c4e20, 0x1e41d: 0x6cb13c20, 0x1e41e: 0x6d059020, 0x1e41f: 0x6ca05820, - 0x1e420: 0x6c292e20, 0x1e421: 0x6cdab820, 0x1e422: 0x6d01b620, 0x1e423: 0x6d10fe20, - 0x1e424: 0x6c057420, 0x1e425: 0x6cd38c20, 0x1e426: 0x6cb8e420, 0x1e427: 0x6c9d4c20, - 0x1e428: 0x6c6c9820, 0x1e429: 0x6c976820, 0x1e42a: 0x6d306620, 0x1e42b: 0x6c65b620, - 0x1e42c: 0x6ca05220, 0x1e42d: 0x6cdff420, 0x1e42e: 0x6d2b7820, 0x1e42f: 0x6cbbe420, - 0x1e430: 0x6c7fa820, 0x1e431: 0x6cb49020, 0x1e432: 0x6c748620, 0x1e433: 0x6d0ea820, - 0x1e434: 0x6cba1e20, 0x1e435: 0x6d2d9020, 0x1e436: 0x6c193c20, 0x1e437: 0x6c475c20, - 0x1e438: 0x6cb8cc20, 0x1e439: 0x6c534020, 0x1e43a: 0x6cf96420, 0x1e43b: 0x6c602420, - 0x1e43c: 0x6c536820, 0x1e43d: 0x6c4db220, 0x1e43e: 0x6c52c020, 0x1e43f: 0x6cf6f420, - // Block 0x791, offset 0x1e440 - 0x1e440: 0x6cf6f620, 0x1e441: 0x6c5d6220, 0x1e442: 0x6c8a3e20, 0x1e443: 0x6c4e6a20, - 0x1e444: 0x6c31f220, 0x1e445: 0x6c900420, 0x1e446: 0x6c30fa20, 0x1e447: 0x6c675a20, - 0x1e448: 0x6cb6e820, 0x1e449: 0x6cd37220, 0x1e44a: 0x6c852420, 0x1e44b: 0x6c2a9e20, - 0x1e44c: 0x6cec9a20, 0x1e44d: 0x6c088a20, 0x1e44e: 0x6cd60820, 0x1e44f: 0x6cfd1c20, - 0x1e450: 0x6c3c7020, 0x1e451: 0x6d375a20, 0x1e452: 0x6d377620, 0x1e453: 0x6d0f2c20, - 0x1e454: 0x6d0f3020, 0x1e455: 0x6cd2b020, 0x1e456: 0x6c1f1620, 0x1e457: 0x6c5aae20, - 0x1e458: 0x6cea4e20, 0x1e459: 0x6d177c20, 0x1e45a: 0x6cea5020, 0x1e45b: 0x6d177e20, - 0x1e45c: 0x6c649020, 0x1e45d: 0x6c034a20, 0x1e45e: 0x6c547220, 0x1e45f: 0x6c364820, - 0x1e460: 0x6c1e8420, 0x1e461: 0x6cfe3020, 0x1e462: 0x6c593e20, 0x1e463: 0x6c64c220, - 0x1e464: 0x6c790420, 0x1e465: 0x6c40fe20, 0x1e466: 0x6c725a20, 0x1e467: 0x6c3d8a20, - 0x1e468: 0x6cf68420, 0x1e469: 0x6c0d4820, 0x1e46a: 0x6c4fd620, 0x1e46b: 0x6d23ce20, - 0x1e46c: 0x6d39c820, 0x1e46d: 0x6c638420, 0x1e46e: 0x6c3b9a20, 0x1e46f: 0x6cf6f820, - 0x1e470: 0x6c0f8020, 0x1e471: 0x6cf16620, 0x1e472: 0x6c58aa20, 0x1e473: 0x6c0d5820, - 0x1e474: 0x6c2ba620, 0x1e475: 0x6d3fce20, 0x1e476: 0x6c3ba620, 0x1e477: 0x6d191c20, - 0x1e478: 0x6d357c20, 0x1e479: 0x6c064020, 0x1e47a: 0x6c147820, 0x1e47b: 0x6c01b420, - 0x1e47c: 0x6cafe620, 0x1e47d: 0x6ca33c20, 0x1e47e: 0x6caf6620, 0x1e47f: 0x6c468a20, - // Block 0x792, offset 0x1e480 - 0x1e480: 0x6ca34620, 0x1e481: 0x6d204820, 0x1e482: 0x6c2dcc20, 0x1e483: 0x6ca11e20, - 0x1e484: 0x6cd8ce20, 0x1e485: 0x6d04dc20, 0x1e486: 0x6c588420, 0x1e487: 0x6c7d7220, - 0x1e488: 0x6c514820, 0x1e489: 0x6c4fce20, 0x1e48a: 0x6ca13220, 0x1e48b: 0x6c4ef020, - 0x1e48c: 0x6c99a420, 0x1e48d: 0x6c842220, 0x1e48e: 0x6ca60420, 0x1e48f: 0x6c08f420, - 0x1e490: 0x6d229620, 0x1e491: 0x6c638620, 0x1e492: 0x6ce93a20, 0x1e493: 0x6c98be20, - 0x1e494: 0x6cb02620, 0x1e495: 0x6cf6fa20, 0x1e496: 0x6c36b820, 0x1e497: 0x6c72ae20, - 0x1e498: 0x6ca17820, 0x1e499: 0x6c1e6a20, 0x1e49a: 0x6ce03820, 0x1e49b: 0x6c584e20, - 0x1e49c: 0x6c753620, 0x1e49d: 0x6c06dc20, 0x1e49e: 0x6d313220, 0x1e49f: 0x6d254a20, - 0x1e4a0: 0x6c3fc820, 0x1e4a1: 0x6c110e20, 0x1e4a2: 0x6c461420, 0x1e4a3: 0x6ce27220, - 0x1e4a4: 0x6d14de20, 0x1e4a5: 0x6c4f7820, 0x1e4a6: 0x6ced8020, 0x1e4a7: 0x6cb20a20, - 0x1e4a8: 0x6c5dc820, 0x1e4a9: 0x6c395020, 0x1e4aa: 0x6cdfa620, 0x1e4ab: 0x6c498620, - 0x1e4ac: 0x6d2ac820, 0x1e4ad: 0x6d345e20, 0x1e4ae: 0x6c37cc20, 0x1e4af: 0x6d3afe20, - 0x1e4b0: 0x6cd38e20, 0x1e4b1: 0x6c09ae20, 0x1e4b2: 0x6d3e5e20, 0x1e4b3: 0x6c37d020, - 0x1e4b4: 0x6c4b4e20, 0x1e4b5: 0x6cb14020, 0x1e4b6: 0x6c0b3a20, 0x1e4b7: 0x6c971420, - 0x1e4b8: 0x6c277220, 0x1e4b9: 0x6cd16820, 0x1e4ba: 0x6c7bf820, 0x1e4bb: 0x6c3ab220, - 0x1e4bc: 0x6ce5f420, 0x1e4bd: 0x6d150620, 0x1e4be: 0x6c1b2a20, 0x1e4bf: 0x6c998620, - // Block 0x793, offset 0x1e4c0 - 0x1e4c0: 0x6c51c820, 0x1e4c1: 0x6c09b020, 0x1e4c2: 0x6c927420, 0x1e4c3: 0x6c8c5420, - 0x1e4c4: 0x6c5bec20, 0x1e4c5: 0x6c410020, 0x1e4c6: 0x6cb11a20, 0x1e4c7: 0x6d3e6020, - 0x1e4c8: 0x6c642020, 0x1e4c9: 0x6d070420, 0x1e4ca: 0x6d2b6020, 0x1e4cb: 0x6c691020, - 0x1e4cc: 0x6c414a20, 0x1e4cd: 0x6d29dc20, 0x1e4ce: 0x6c669e20, 0x1e4cf: 0x6d1be220, - 0x1e4d0: 0x6d0a9c20, 0x1e4d1: 0x6d325420, 0x1e4d2: 0x6ccef820, 0x1e4d3: 0x6c0d4a20, - 0x1e4d4: 0x6c0d4c20, 0x1e4d5: 0x6cc08620, 0x1e4d6: 0x6ccefa20, 0x1e4d7: 0x6c203c20, - 0x1e4d8: 0x6d29e620, 0x1e4d9: 0x6d38a220, 0x1e4da: 0x6c7f5220, 0x1e4db: 0x6d299820, - 0x1e4dc: 0x6c22e020, 0x1e4dd: 0x6c188620, 0x1e4de: 0x6cce3a20, 0x1e4df: 0x6ce51620, - 0x1e4e0: 0x6cadee20, 0x1e4e1: 0x6c44de20, 0x1e4e2: 0x6cfb8820, 0x1e4e3: 0x6c974020, - 0x1e4e4: 0x6c66c220, 0x1e4e5: 0x6cdc6820, 0x1e4e6: 0x6c404420, 0x1e4e7: 0x6ce0aa20, - 0x1e4e8: 0x6c23ae20, 0x1e4e9: 0x6c23b020, 0x1e4ea: 0x6d36c620, 0x1e4eb: 0x6c5f2220, - 0x1e4ec: 0x6d2f3e20, 0x1e4ed: 0x6c322c20, 0x1e4ee: 0x6c6d5420, 0x1e4ef: 0x6d047420, - 0x1e4f0: 0x6c218820, 0x1e4f1: 0x6d280420, 0x1e4f2: 0x6c061420, 0x1e4f3: 0x6d290c20, - 0x1e4f4: 0x6c7f5820, 0x1e4f5: 0x6c3cf820, 0x1e4f6: 0x6c125c20, 0x1e4f7: 0x6c5f6020, - 0x1e4f8: 0x6cd17e20, 0x1e4f9: 0x6d18da20, 0x1e4fa: 0x6d3bec20, 0x1e4fb: 0x6c406820, - 0x1e4fc: 0x6c46de20, 0x1e4fd: 0x6cc9ea20, 0x1e4fe: 0x6d2b1a20, 0x1e4ff: 0x6c8a4020, - // Block 0x794, offset 0x1e500 - 0x1e500: 0x6d18f820, 0x1e501: 0x6c045e20, 0x1e502: 0x6c191620, 0x1e503: 0x6ceda620, - 0x1e504: 0x6d373220, 0x1e505: 0x6d3cb620, 0x1e506: 0x6c0c4620, 0x1e507: 0x6d276e20, - 0x1e508: 0x6d2bb620, 0x1e509: 0x6c28e020, 0x1e50a: 0x6d29ae20, 0x1e50b: 0x6d0eec20, - 0x1e50c: 0x6cb4c420, 0x1e50d: 0x6ccdd820, 0x1e50e: 0x6cedac20, 0x1e50f: 0x6d1cca20, - 0x1e510: 0x6c6d7220, 0x1e511: 0x6c423c20, 0x1e512: 0x6cfbd420, 0x1e513: 0x6d29f020, - 0x1e514: 0x6c0ac620, 0x1e515: 0x6c31f420, 0x1e516: 0x6cd54820, 0x1e517: 0x6d0f0620, - 0x1e518: 0x6cce4220, 0x1e519: 0x6d08d420, 0x1e51a: 0x6c907020, 0x1e51b: 0x6c424420, - 0x1e51c: 0x6d29f420, 0x1e51d: 0x6c06d220, 0x1e51e: 0x6d311c20, 0x1e51f: 0x6c3fa820, - 0x1e520: 0x6d253420, 0x1e521: 0x6c460c20, 0x1e522: 0x6c110c20, 0x1e523: 0x6d2aae20, - 0x1e524: 0x6cfb2e20, 0x1e525: 0x6c043820, 0x1e526: 0x6d2f2a20, 0x1e527: 0x6c5da220, - 0x1e528: 0x6d358e20, 0x1e529: 0x6c393420, 0x1e52a: 0x6cdf9220, 0x1e52b: 0x6cb20620, - 0x1e52c: 0x6c0b2a20, 0x1e52d: 0x6c469820, 0x1e52e: 0x6d3ab420, 0x1e52f: 0x6c497a20, - 0x1e530: 0x6c37c420, 0x1e531: 0x6c666220, 0x1e532: 0x6c078220, 0x1e533: 0x6cd34820, - 0x1e534: 0x6ce5ec20, 0x1e535: 0x6c4b3a20, 0x1e536: 0x6c7bec20, 0x1e537: 0x6c274e20, - 0x1e538: 0x6c995a20, 0x1e539: 0x6c3a9220, 0x1e53a: 0x6c51be20, 0x1e53b: 0x6d14b020, - 0x1e53c: 0x6d2b5c20, 0x1e53d: 0x6d35ce20, 0x1e53e: 0x6c640e20, 0x1e53f: 0x6c5bb020, - // Block 0x795, offset 0x1e540 - 0x1e540: 0x6d3e1e20, 0x1e541: 0x6c8c5020, 0x1e542: 0x6c922c20, 0x1e543: 0x6d29d820, - 0x1e544: 0x6d3e2020, 0x1e545: 0x6c40f020, 0x1e546: 0x6c6cfa20, 0x1e547: 0x6cc05220, - 0x1e548: 0x6d323c20, 0x1e549: 0x6c7f4620, 0x1e54a: 0x6ccef020, 0x1e54b: 0x6c400020, - 0x1e54c: 0x6c322020, 0x1e54d: 0x6c5edc20, 0x1e54e: 0x6cd52c20, 0x1e54f: 0x6cce3820, - 0x1e550: 0x6c22ce20, 0x1e551: 0x6c09b220, 0x1e552: 0x6d388c20, 0x1e553: 0x6c44d420, - 0x1e554: 0x6cadda20, 0x1e555: 0x6c283620, 0x1e556: 0x6c7f4c20, 0x1e557: 0x6c3ce820, - 0x1e558: 0x6d3c9e20, 0x1e559: 0x6c402820, 0x1e55a: 0x6d3bd620, 0x1e55b: 0x6cc9e620, - 0x1e55c: 0x6d2af420, 0x1e55d: 0x6d0ec820, 0x1e55e: 0x6d299a20, 0x1e55f: 0x6d276820, - 0x1e560: 0x6d2bb220, 0x1e561: 0x6ccdc220, 0x1e562: 0x6d1cae20, 0x1e563: 0x6c423e20, - 0x1e564: 0x6c1be820, 0x1e565: 0x6cf60220, 0x1e566: 0x6ccf4620, 0x1e567: 0x6ca42420, - 0x1e568: 0x6ce75e20, 0x1e569: 0x6cf8a820, 0x1e56a: 0x6c197620, 0x1e56b: 0x6c51dc20, - 0x1e56c: 0x6c199620, 0x1e56d: 0x6d30dc20, 0x1e56e: 0x6cf9f620, 0x1e56f: 0x6ce14620, - 0x1e570: 0x6d407e20, 0x1e571: 0x6d407c20, 0x1e572: 0x6c85b620, 0x1e573: 0x6c6f6020, - 0x1e574: 0x6c3fca20, 0x1e575: 0x6d2fa620, 0x1e576: 0x6c41d220, 0x1e577: 0x6cb6ea20, - 0x1e578: 0x6ccd8020, 0x1e579: 0x6cbf1c20, 0x1e57a: 0x6d1adc20, 0x1e57b: 0x6cfc0c20, - 0x1e57c: 0x6c21fe20, 0x1e57d: 0x6c743620, 0x1e57e: 0x6cbdd420, 0x1e57f: 0x6c1b2020, - // Block 0x796, offset 0x1e580 - 0x1e580: 0x6c220020, 0x1e581: 0x6c192820, 0x1e582: 0x6c192a20, 0x1e583: 0x6c2eb620, - 0x1e584: 0x6c70a020, 0x1e585: 0x6c174820, 0x1e586: 0x6c2b3020, 0x1e587: 0x6cf89620, - 0x1e588: 0x6d2d7a20, 0x1e589: 0x6c745c20, 0x1e58a: 0x6d26be20, 0x1e58b: 0x6cc11820, - 0x1e58c: 0x6c606220, 0x1e58d: 0x6c1b3e20, 0x1e58e: 0x6c1e9420, 0x1e58f: 0x6c486420, - 0x1e590: 0x6d096820, 0x1e591: 0x6d3e6220, 0x1e592: 0x6ce59420, 0x1e593: 0x6c349c20, - 0x1e594: 0x6c8b1c20, 0x1e595: 0x6c41e220, 0x1e596: 0x6cdd3220, 0x1e597: 0x6c245020, - 0x1e598: 0x6cf79820, 0x1e599: 0x6d2fd220, 0x1e59a: 0x6cdaf420, 0x1e59b: 0x6d1b0020, - 0x1e59c: 0x6c715020, 0x1e59d: 0x6c66c420, 0x1e59e: 0x6cc3f420, 0x1e59f: 0x6ce1a020, - 0x1e5a0: 0x6c21d020, 0x1e5a1: 0x6c250420, 0x1e5a2: 0x6c92b820, 0x1e5a3: 0x6cc27420, - 0x1e5a4: 0x6c298c20, 0x1e5a5: 0x6cbfc820, 0x1e5a6: 0x6d3e9220, 0x1e5a7: 0x6ce37e20, - 0x1e5a8: 0x6cc14a20, 0x1e5a9: 0x6c1c8820, 0x1e5aa: 0x6c5a1e20, 0x1e5ab: 0x6cbc0a20, - 0x1e5ac: 0x6cbbc220, 0x1e5ad: 0x6c69ce20, 0x1e5ae: 0x6d2a9a20, 0x1e5af: 0x6ce44220, - 0x1e5b0: 0x6c37b020, 0x1e5b1: 0x6d298420, 0x1e5b2: 0x6d298820, 0x1e5b3: 0x6d40a620, - 0x1e5b4: 0x6cabbc20, 0x1e5b5: 0x6c064220, 0x1e5b6: 0x6c7a8c20, 0x1e5b7: 0x6c77f220, - 0x1e5b8: 0x6c33cc20, 0x1e5b9: 0x6c743820, 0x1e5ba: 0x6c3d6c20, 0x1e5bb: 0x6c190020, - 0x1e5bc: 0x6c658c20, 0x1e5bd: 0x6c39e420, 0x1e5be: 0x6d352420, 0x1e5bf: 0x6cdde620, - // Block 0x797, offset 0x1e5c0 - 0x1e5c0: 0x6d26a820, 0x1e5c1: 0x6c03b620, 0x1e5c2: 0x6cb5d820, 0x1e5c3: 0x6d26aa20, - 0x1e5c4: 0x6cbab420, 0x1e5c5: 0x6ceba820, 0x1e5c6: 0x6cdf2420, 0x1e5c7: 0x6d17c820, - 0x1e5c8: 0x6ca72620, 0x1e5c9: 0x6c8d0e20, 0x1e5ca: 0x6c9a9420, 0x1e5cb: 0x6c038220, - 0x1e5cc: 0x6c2e5820, 0x1e5cd: 0x6c7a4420, 0x1e5ce: 0x6ceb2420, 0x1e5cf: 0x6c636620, - 0x1e5d0: 0x6c220620, 0x1e5d1: 0x6cad7820, 0x1e5d2: 0x6cb83820, 0x1e5d3: 0x6d3b0020, - 0x1e5d4: 0x6c70a220, 0x1e5d5: 0x6c2d1c20, 0x1e5d6: 0x6d346e20, 0x1e5d7: 0x6c3d7620, - 0x1e5d8: 0x6cac5a20, 0x1e5d9: 0x6c724e20, 0x1e5da: 0x6ccce620, 0x1e5db: 0x6c0fe420, - 0x1e5dc: 0x6ca5ec20, 0x1e5dd: 0x6c724620, 0x1e5de: 0x6c861e20, 0x1e5df: 0x6c449a20, - 0x1e5e0: 0x6d152420, 0x1e5e1: 0x6c5ef420, 0x1e5e2: 0x6c34fe20, 0x1e5e3: 0x6cfc1c20, - 0x1e5e4: 0x6c685420, 0x1e5e5: 0x6c350020, 0x1e5e6: 0x6d39b620, 0x1e5e7: 0x6cc30620, - 0x1e5e8: 0x6c7aec20, 0x1e5e9: 0x6d3b6820, 0x1e5ea: 0x6c4b5a20, 0x1e5eb: 0x6cbf4420, - 0x1e5ec: 0x6c7cd620, 0x1e5ed: 0x6cfdce20, 0x1e5ee: 0x6c1c3620, 0x1e5ef: 0x6c927620, - 0x1e5f0: 0x6cb11c20, 0x1e5f1: 0x6d367020, 0x1e5f2: 0x6c63d020, 0x1e5f3: 0x6ce5dc20, - 0x1e5f4: 0x6c113820, 0x1e5f5: 0x6c669820, 0x1e5f6: 0x6cde6a20, 0x1e5f7: 0x6cbb8020, - 0x1e5f8: 0x6c09e220, 0x1e5f9: 0x6cfab220, 0x1e5fa: 0x6c350220, 0x1e5fb: 0x6c5ef620, - 0x1e5fc: 0x6c714620, 0x1e5fd: 0x6c625420, 0x1e5fe: 0x6cd4fa20, 0x1e5ff: 0x6ce8e020, - // Block 0x798, offset 0x1e600 - 0x1e600: 0x6c1f6420, 0x1e601: 0x6c6e9a20, 0x1e602: 0x6ca85620, 0x1e603: 0x6cfef820, - 0x1e604: 0x6c10b020, 0x1e605: 0x6d091420, 0x1e606: 0x6c259a20, 0x1e607: 0x6ca25020, - 0x1e608: 0x6cd4fc20, 0x1e609: 0x6c896220, 0x1e60a: 0x6d1e5420, 0x1e60b: 0x6c691820, - 0x1e60c: 0x6c1dce20, 0x1e60d: 0x6cbb9220, 0x1e60e: 0x6ca1da20, 0x1e60f: 0x6cde9420, - 0x1e610: 0x6c66c620, 0x1e611: 0x6cb64620, 0x1e612: 0x6cf29e20, 0x1e613: 0x6cf00e20, - 0x1e614: 0x6c219820, 0x1e615: 0x6c6b2a20, 0x1e616: 0x6c609a20, 0x1e617: 0x6ca86420, - 0x1e618: 0x6c70be20, 0x1e619: 0x6c70c020, 0x1e61a: 0x6c950c20, 0x1e61b: 0x6c92bc20, - 0x1e61c: 0x6c839a20, 0x1e61d: 0x6c57f020, 0x1e61e: 0x6c728420, 0x1e61f: 0x6c1b4e20, - 0x1e620: 0x6ced4820, 0x1e621: 0x6cc31420, 0x1e622: 0x6ce2fa20, 0x1e623: 0x6c0f4c20, - 0x1e624: 0x6d40d220, 0x1e625: 0x6cbce220, 0x1e626: 0x6d160820, 0x1e627: 0x6c245e20, - 0x1e628: 0x6d3fbc20, 0x1e629: 0x6c113e20, 0x1e62a: 0x6d3fbe20, 0x1e62b: 0x6caf1620, - 0x1e62c: 0x6d36c820, 0x1e62d: 0x6d32d820, 0x1e62e: 0x6c2d2a20, 0x1e62f: 0x6d349420, - 0x1e630: 0x6d21aa20, 0x1e631: 0x6c346220, 0x1e632: 0x6c340c20, 0x1e633: 0x6c202820, - 0x1e634: 0x6d1e6020, 0x1e635: 0x6d380820, 0x1e636: 0x6c2c9e20, 0x1e637: 0x6d2c9220, - 0x1e638: 0x6c191020, 0x1e639: 0x6c1fce20, 0x1e63a: 0x6c66c820, 0x1e63b: 0x6c486e20, - 0x1e63c: 0x6ce13e20, 0x1e63d: 0x6c71d620, 0x1e63e: 0x6c3efa20, 0x1e63f: 0x6d40d820, - // Block 0x799, offset 0x1e640 - 0x1e640: 0x6c2eec20, 0x1e641: 0x6cb12e20, 0x1e642: 0x6cc76020, 0x1e643: 0x6cab1020, - 0x1e644: 0x6ce38020, 0x1e645: 0x6c142020, 0x1e646: 0x6ce9ec20, 0x1e647: 0x6c65ee20, - 0x1e648: 0x6c29f420, 0x1e649: 0x6c25ca20, 0x1e64a: 0x6cb53a20, 0x1e64b: 0x6cdeb020, - 0x1e64c: 0x6cbae420, 0x1e64d: 0x6ca74020, 0x1e64e: 0x6c2ce020, 0x1e64f: 0x6ce38a20, - 0x1e650: 0x6c60ce20, 0x1e651: 0x6ca87e20, 0x1e652: 0x6cac7820, 0x1e653: 0x6c8e3a20, - 0x1e654: 0x6d29aa20, 0x1e655: 0x6c0a7a20, 0x1e656: 0x6c1cf220, 0x1e657: 0x6c931020, - 0x1e658: 0x6c8a4220, 0x1e659: 0x6c246e20, 0x1e65a: 0x6ce0da20, 0x1e65b: 0x6c27a420, - 0x1e65c: 0x6cdb5420, 0x1e65d: 0x6cf81e20, 0x1e65e: 0x6c7ce220, 0x1e65f: 0x6c5f7820, - 0x1e660: 0x6d34ae20, 0x1e661: 0x6cbaee20, 0x1e662: 0x6c2ba820, 0x1e663: 0x6cac8420, - 0x1e664: 0x6d3fd020, 0x1e665: 0x6c887020, 0x1e666: 0x6c085c20, 0x1e667: 0x6d2a2a20, - 0x1e668: 0x6ca74820, 0x1e669: 0x6c0d0220, 0x1e66a: 0x6ce9d220, 0x1e66b: 0x6c717e20, - 0x1e66c: 0x6c2ac020, 0x1e66d: 0x6c137020, 0x1e66e: 0x6cfaf420, 0x1e66f: 0x6c38dc20, - 0x1e670: 0x6c1ec820, 0x1e671: 0x6d37d820, 0x1e672: 0x6c33be20, 0x1e673: 0x6c0e9a20, - 0x1e674: 0x6c247420, 0x1e675: 0x6c247620, 0x1e676: 0x6c74f220, 0x1e677: 0x6c74f420, - 0x1e678: 0x6c8c7e20, 0x1e679: 0x6cde0620, 0x1e67a: 0x6cbbc420, 0x1e67b: 0x6c73bc20, - 0x1e67c: 0x6cb4a220, 0x1e67d: 0x6c89d420, 0x1e67e: 0x6c33c020, 0x1e67f: 0x6c249620, - // Block 0x79a, offset 0x1e680 - 0x1e680: 0x6c7c1220, 0x1e681: 0x6d2a9c20, 0x1e682: 0x6c26d220, 0x1e683: 0x6c0abc20, - 0x1e684: 0x6c0abe20, 0x1e685: 0x6d3a3820, 0x1e686: 0x6c72be20, 0x1e687: 0x6c1ec020, - 0x1e688: 0x6cbc7020, 0x1e689: 0x6c33d020, 0x1e68a: 0x6c1e0820, 0x1e68b: 0x6c5f9620, - 0x1e68c: 0x6cf48e20, 0x1e68d: 0x6d271820, 0x1e68e: 0x6ca74c20, 0x1e68f: 0x6c8c8220, - 0x1e690: 0x6c8b7620, 0x1e691: 0x6d34c020, 0x1e692: 0x6c878220, 0x1e693: 0x6d376a20, - 0x1e694: 0x6c156e20, 0x1e695: 0x6c1ece20, 0x1e696: 0x6c32e820, 0x1e697: 0x6cf12420, - 0x1e698: 0x6c900620, 0x1e699: 0x6c8c8c20, 0x1e69a: 0x6cfb0e20, 0x1e69b: 0x6cf12e20, - 0x1e69c: 0x6d414020, 0x1e69d: 0x6c801220, 0x1e69e: 0x6d028e20, 0x1e69f: 0x6cc4fa20, - 0x1e6a0: 0x6cc95e20, 0x1e6a1: 0x6ca8ce20, 0x1e6a2: 0x6cdef620, 0x1e6a3: 0x6cc22c20, - 0x1e6a4: 0x6c6c1220, 0x1e6a5: 0x6c249a20, 0x1e6a6: 0x6c260620, 0x1e6a7: 0x6cf83020, - 0x1e6a8: 0x6c7cc620, 0x1e6a9: 0x6c753a20, 0x1e6aa: 0x6c8c9020, 0x1e6ab: 0x6ccfa420, - 0x1e6ac: 0x6c457e20, 0x1e6ad: 0x6c27d820, 0x1e6ae: 0x6c3c0a20, 0x1e6af: 0x6cc10820, - 0x1e6b0: 0x6ce3c220, 0x1e6b1: 0x6c349e20, 0x1e6b2: 0x6c34a020, 0x1e6b3: 0x6c459a20, - 0x1e6b4: 0x6c80da20, 0x1e6b5: 0x6cc60e20, 0x1e6b6: 0x6c95be20, 0x1e6b7: 0x6c007620, - 0x1e6b8: 0x6c5f2420, 0x1e6b9: 0x6c715220, 0x1e6ba: 0x6ce18020, 0x1e6bb: 0x6c79ae20, - 0x1e6bc: 0x6c81de20, 0x1e6bd: 0x6d0dd820, 0x1e6be: 0x6c9abc20, 0x1e6bf: 0x6c775c20, - // Block 0x79b, offset 0x1e6c0 - 0x1e6c0: 0x6cc15420, 0x1e6c1: 0x6c90ce20, 0x1e6c2: 0x6c81ea20, 0x1e6c3: 0x6c34c020, - 0x1e6c4: 0x6d34b420, 0x1e6c5: 0x6d0f3c20, 0x1e6c6: 0x6ce3cc20, 0x1e6c7: 0x6c2a4e20, - 0x1e6c8: 0x6d1d7420, 0x1e6c9: 0x6d249a20, 0x1e6ca: 0x6c17ce20, 0x1e6cb: 0x6d0b8220, - 0x1e6cc: 0x6c4ade20, 0x1e6cd: 0x6c756420, 0x1e6ce: 0x6cf08220, 0x1e6cf: 0x6d269e20, - 0x1e6d0: 0x6d032c20, 0x1e6d1: 0x6c275420, 0x1e6d2: 0x6d078a20, 0x1e6d3: 0x6c393e20, - 0x1e6d4: 0x6cc5e420, 0x1e6d5: 0x6cccde20, 0x1e6d6: 0x6c7bc020, 0x1e6d7: 0x6cd4d620, - 0x1e6d8: 0x6cea5220, 0x1e6d9: 0x6c18c420, 0x1e6da: 0x6c276820, 0x1e6db: 0x6c361c20, - 0x1e6dc: 0x6ca34020, 0x1e6dd: 0x6cb5dc20, 0x1e6de: 0x6c98de20, 0x1e6df: 0x6cc86020, - 0x1e6e0: 0x6cc5ec20, 0x1e6e1: 0x6cb98c20, 0x1e6e2: 0x6d3ba620, 0x1e6e3: 0x6c52a020, - 0x1e6e4: 0x6c54d220, 0x1e6e5: 0x6cc19c20, 0x1e6e6: 0x6c7bfa20, 0x1e6e7: 0x6c2bfc20, - 0x1e6e8: 0x6c8d1220, 0x1e6e9: 0x6c277420, 0x1e6ea: 0x6c022c20, 0x1e6eb: 0x6d31e220, - 0x1e6ec: 0x6c395620, 0x1e6ed: 0x6c7baa20, 0x1e6ee: 0x6d102220, 0x1e6ef: 0x6cae7420, - 0x1e6f0: 0x6c072820, 0x1e6f1: 0x6c471420, 0x1e6f2: 0x6c471620, 0x1e6f3: 0x6cad5e20, - 0x1e6f4: 0x6d3b0420, 0x1e6f5: 0x6cc71020, 0x1e6f6: 0x6c364a20, 0x1e6f7: 0x6c038420, - 0x1e6f8: 0x6d38d420, 0x1e6f9: 0x6d353020, 0x1e6fa: 0x6d110020, 0x1e6fb: 0x6c780020, - 0x1e6fc: 0x6d17ca20, 0x1e6fd: 0x6d364420, 0x1e6fe: 0x6cd3a820, 0x1e6ff: 0x6cb2b820, - // Block 0x79c, offset 0x1e700 - 0x1e700: 0x6c375e20, 0x1e701: 0x6c45f420, 0x1e702: 0x6c713a20, 0x1e703: 0x6c69a820, - 0x1e704: 0x6c49ee20, 0x1e705: 0x6c514c20, 0x1e706: 0x6c766420, 0x1e707: 0x6cc30820, - 0x1e708: 0x6d389420, 0x1e709: 0x6d293c20, 0x1e70a: 0x6d367220, 0x1e70b: 0x6ccef620, - 0x1e70c: 0x6c89c420, 0x1e70d: 0x6d23ae20, 0x1e70e: 0x6cce7c20, 0x1e70f: 0x6d1f5c20, - 0x1e710: 0x6ced9020, 0x1e711: 0x6d1af820, 0x1e712: 0x6d307420, 0x1e713: 0x6ced3e20, - 0x1e714: 0x6c3f7c20, 0x1e715: 0x6cbe5420, 0x1e716: 0x6d38a620, 0x1e717: 0x6ca60620, - 0x1e718: 0x6c838420, 0x1e719: 0x6d308420, 0x1e71a: 0x6d2e7a20, 0x1e71b: 0x6c89ca20, - 0x1e71c: 0x6d3e8220, 0x1e71d: 0x6c5aee20, 0x1e71e: 0x6cee3820, 0x1e71f: 0x6c21d220, - 0x1e720: 0x6c4ccc20, 0x1e721: 0x6c76e820, 0x1e722: 0x6d160a20, 0x1e723: 0x6caec220, - 0x1e724: 0x6cba7a20, 0x1e725: 0x6c4be620, 0x1e726: 0x6ca73a20, 0x1e727: 0x6cb2c820, - 0x1e728: 0x6c496020, 0x1e729: 0x6c075220, 0x1e72a: 0x6c950e20, 0x1e72b: 0x6cac0420, - 0x1e72c: 0x6c896c20, 0x1e72d: 0x6cc88020, 0x1e72e: 0x6cc76220, 0x1e72f: 0x6c631020, - 0x1e730: 0x6d0fda20, 0x1e731: 0x6cfba020, 0x1e732: 0x6c201020, 0x1e733: 0x6c23fe20, - 0x1e734: 0x6c211c20, 0x1e735: 0x6c443c20, 0x1e736: 0x6d1f7220, 0x1e737: 0x6c52cc20, - 0x1e738: 0x6cd50820, 0x1e739: 0x6c405820, 0x1e73a: 0x6d3e9420, 0x1e73b: 0x6c3efc20, - 0x1e73c: 0x6cf16820, 0x1e73d: 0x6c07cc20, 0x1e73e: 0x6d2e2020, 0x1e73f: 0x6d21c020, - // Block 0x79d, offset 0x1e740 - 0x1e740: 0x6cf16a20, 0x1e741: 0x6ce1f420, 0x1e742: 0x6c47dc20, 0x1e743: 0x6d319e20, - 0x1e744: 0x6cfa0220, 0x1e745: 0x6d25b820, 0x1e746: 0x6c931220, 0x1e747: 0x6c689e20, - 0x1e748: 0x6c178620, 0x1e749: 0x6d3bb420, 0x1e74a: 0x6cf0f820, 0x1e74b: 0x6c5d0420, - 0x1e74c: 0x6d098c20, 0x1e74d: 0x6d30b820, 0x1e74e: 0x6c69d020, 0x1e74f: 0x6d2e9020, - 0x1e750: 0x6c102620, 0x1e751: 0x6c81c620, 0x1e752: 0x6c3ba820, 0x1e753: 0x6c386a20, - 0x1e754: 0x6c8bfc20, 0x1e755: 0x6c445220, 0x1e756: 0x6ccb8e20, 0x1e757: 0x6c76fc20, - 0x1e758: 0x6c58be20, 0x1e759: 0x6d162820, 0x1e75a: 0x6c60f020, 0x1e75b: 0x6d3cc020, - 0x1e75c: 0x6c377820, 0x1e75d: 0x6d246820, 0x1e75e: 0x6c671c20, 0x1e75f: 0x6c52e020, - 0x1e760: 0x6c829220, 0x1e761: 0x6cae2c20, 0x1e762: 0x6c878420, 0x1e763: 0x6c879a20, - 0x1e764: 0x6c91a020, 0x1e765: 0x6c8c9220, 0x1e766: 0x6c17ca20, 0x1e767: 0x6d0b6a20, - 0x1e768: 0x6c4ac020, 0x1e769: 0x6d077a20, 0x1e76a: 0x6c272a20, 0x1e76b: 0x6cc5ca20, - 0x1e76c: 0x6d3ba020, 0x1e76d: 0x6c35e220, 0x1e76e: 0x6c94e020, 0x1e76f: 0x6cc85420, - 0x1e770: 0x6c529820, 0x1e771: 0x6c46fa20, 0x1e772: 0x6c77ec20, 0x1e773: 0x6c914820, - 0x1e774: 0x6d38d020, 0x1e775: 0x6d350a20, 0x1e776: 0x6d171020, 0x1e777: 0x6c54b220, - 0x1e778: 0x6d31c420, 0x1e779: 0x6c85ba20, 0x1e77a: 0x6d10dc20, 0x1e77b: 0x6cbe3620, - 0x1e77c: 0x6cd36220, 0x1e77d: 0x6d293420, 0x1e77e: 0x6d35d020, 0x1e77f: 0x6c699620, - // Block 0x79e, offset 0x1e780 - 0x1e780: 0x6d386c20, 0x1e781: 0x6cc2d020, 0x1e782: 0x6c922e20, 0x1e783: 0x6c699820, - 0x1e784: 0x6d305420, 0x1e785: 0x6c3f6020, 0x1e786: 0x6c89b220, 0x1e787: 0x6ca72a20, - 0x1e788: 0x6c072a20, 0x1e789: 0x6c5abc20, 0x1e78a: 0x6c4bcc20, 0x1e78b: 0x6cee2620, - 0x1e78c: 0x6c895820, 0x1e78d: 0x6c21c420, 0x1e78e: 0x6d3e4820, 0x1e78f: 0x6c23f420, - 0x1e790: 0x6c3eae20, 0x1e791: 0x6c630c20, 0x1e792: 0x6cf15e20, 0x1e793: 0x6cd4f020, - 0x1e794: 0x6cae2020, 0x1e795: 0x6d259a20, 0x1e796: 0x6cf9e220, 0x1e797: 0x6ca72e20, - 0x1e798: 0x6c92c420, 0x1e799: 0x6d309420, 0x1e79a: 0x6c8be220, 0x1e79b: 0x6d02ae20, - 0x1e79c: 0x6c471820, 0x1e79d: 0x6c224a20, 0x1e79e: 0x6c225220, 0x1e79f: 0x6cb0a820, - 0x1e7a0: 0x6d41ba20, 0x1e7a1: 0x6c0bb020, 0x1e7a2: 0x6c7e8e20, 0x1e7a3: 0x6c7e9020, - 0x1e7a4: 0x6c226020, 0x1e7a5: 0x6d08ea20, 0x1e7a6: 0x6c050620, 0x1e7a7: 0x6c0bc020, - 0x1e7a8: 0x6c0bc220, 0x1e7a9: 0x6c0bc420, 0x1e7aa: 0x6d08ec20, 0x1e7ab: 0x6c0bcc20, - 0x1e7ac: 0x6c04a820, 0x1e7ad: 0x6c227e20, 0x1e7ae: 0x6c0bd620, 0x1e7af: 0x6c0bda20, - 0x1e7b0: 0x6c18a020, 0x1e7b1: 0x6cc7fc20, 0x1e7b2: 0x6ca9bc20, 0x1e7b3: 0x6ca9c220, - 0x1e7b4: 0x6c160420, 0x1e7b5: 0x6c21a820, 0x1e7b6: 0x6c21a420, 0x1e7b7: 0x6d198820, - 0x1e7b8: 0x6cc61820, 0x1e7b9: 0x6c0ae820, 0x1e7ba: 0x6c0aea20, 0x1e7bb: 0x6cd22e20, - 0x1e7bc: 0x6cc83220, 0x1e7bd: 0x6c89d620, 0x1e7be: 0x6c267620, 0x1e7bf: 0x6c14b620, - // Block 0x79f, offset 0x1e7c0 - 0x1e7c0: 0x6c416420, 0x1e7c1: 0x6cb8a020, 0x1e7c2: 0x6d207620, 0x1e7c3: 0x6d207820, - 0x1e7c4: 0x6cb73420, 0x1e7c5: 0x6d0a6820, 0x1e7c6: 0x6d145820, 0x1e7c7: 0x6c4ce420, - 0x1e7c8: 0x6c972020, 0x1e7c9: 0x6cb4ca20, 0x1e7ca: 0x6d288620, 0x1e7cb: 0x6cee4a20, - 0x1e7cc: 0x6ce91e20, 0x1e7cd: 0x6d3cca20, 0x1e7ce: 0x6d1c5820, 0x1e7cf: 0x6ce3d620, - 0x1e7d0: 0x6d281620, 0x1e7d1: 0x6c6cd620, 0x1e7d2: 0x6c4f5c20, 0x1e7d3: 0x6d0b7a20, - 0x1e7d4: 0x6c390620, 0x1e7d5: 0x6cf4b020, 0x1e7d6: 0x6c267820, 0x1e7d7: 0x6c354c20, - 0x1e7d8: 0x6c4d1c20, 0x1e7d9: 0x6d30e420, 0x1e7da: 0x6d384c20, 0x1e7db: 0x6c6cd820, - 0x1e7dc: 0x6d25de20, 0x1e7dd: 0x6ceee420, 0x1e7de: 0x6c87ee20, 0x1e7df: 0x6c1b0220, - 0x1e7e0: 0x6c180420, 0x1e7e1: 0x6ca68020, 0x1e7e2: 0x6ce57420, 0x1e7e3: 0x6d359020, - 0x1e7e4: 0x6d147c20, 0x1e7e5: 0x6c6efc20, 0x1e7e6: 0x6c633220, 0x1e7e7: 0x6c18a620, - 0x1e7e8: 0x6c273a20, 0x1e7e9: 0x6c378820, 0x1e7ea: 0x6c2b5e20, 0x1e7eb: 0x6cb36a20, - 0x1e7ec: 0x6d3ab620, 0x1e7ed: 0x6c2e6420, 0x1e7ee: 0x6d2ab020, 0x1e7ef: 0x6ce20620, - 0x1e7f0: 0x6cd5a220, 0x1e7f1: 0x6ceaf620, 0x1e7f2: 0x6cc28620, 0x1e7f3: 0x6c6e5020, - 0x1e7f4: 0x6c5b2a20, 0x1e7f5: 0x6c306820, 0x1e7f6: 0x6d203420, 0x1e7f7: 0x6c9c4020, - 0x1e7f8: 0x6c083c20, 0x1e7f9: 0x6c5e9c20, 0x1e7fa: 0x6ca39c20, 0x1e7fb: 0x6d14b220, - 0x1e7fc: 0x6c6a9a20, 0x1e7fd: 0x6d3c5820, 0x1e7fe: 0x6c8ade20, 0x1e7ff: 0x6d0a7420, - // Block 0x7a0, offset 0x1e800 - 0x1e800: 0x6ce9f620, 0x1e801: 0x6cd98420, 0x1e802: 0x6cd34a20, 0x1e803: 0x6ce20e20, - 0x1e804: 0x6cacf820, 0x1e805: 0x6c546820, 0x1e806: 0x6ca68a20, 0x1e807: 0x6c33e420, - 0x1e808: 0x6c6f0420, 0x1e809: 0x6d084620, 0x1e80a: 0x6d0a7620, 0x1e80b: 0x6c101220, - 0x1e80c: 0x6d1e9c20, 0x1e80d: 0x6cfeac20, 0x1e80e: 0x6cc03a20, 0x1e80f: 0x6ce82420, - 0x1e810: 0x6d3a0a20, 0x1e811: 0x6cc03c20, 0x1e812: 0x6c2c3420, 0x1e813: 0x6c2c3620, - 0x1e814: 0x6ce89a20, 0x1e815: 0x6c6e6c20, 0x1e816: 0x6ce3e620, 0x1e817: 0x6c310a20, - 0x1e818: 0x6d15e020, 0x1e819: 0x6d30ee20, 0x1e81a: 0x6ce6f220, 0x1e81b: 0x6c4a2020, - 0x1e81c: 0x6cf4da20, 0x1e81d: 0x6cd36420, 0x1e81e: 0x6c1a6a20, 0x1e81f: 0x6cda9820, - 0x1e820: 0x6d2a7a20, 0x1e821: 0x6cc43620, 0x1e822: 0x6c3ca420, 0x1e823: 0x6c87fa20, - 0x1e824: 0x6cddc820, 0x1e825: 0x6c5b3220, 0x1e826: 0x6c850e20, 0x1e827: 0x6c483620, - 0x1e828: 0x6c7f0220, 0x1e829: 0x6c07b820, 0x1e82a: 0x6c262420, 0x1e82b: 0x6c743e20, - 0x1e82c: 0x6c083e20, 0x1e82d: 0x6c591820, 0x1e82e: 0x6c271620, 0x1e82f: 0x6c924a20, - 0x1e830: 0x6d1f3220, 0x1e831: 0x6d387c20, 0x1e832: 0x6c6d0820, 0x1e833: 0x6d232620, - 0x1e834: 0x6c219620, 0x1e835: 0x6c7c6820, 0x1e836: 0x6cee7620, 0x1e837: 0x6ce3f020, - 0x1e838: 0x6d178420, 0x1e839: 0x6c26a220, 0x1e83a: 0x6d25e620, 0x1e83b: 0x6c954420, - 0x1e83c: 0x6c087420, 0x1e83d: 0x6caaf220, 0x1e83e: 0x6d213a20, 0x1e83f: 0x6c296a20, - // Block 0x7a1, offset 0x1e840 - 0x1e840: 0x6cdbf620, 0x1e841: 0x6c33f420, 0x1e842: 0x6cdc4220, 0x1e843: 0x6d0d9820, - 0x1e844: 0x6c1ffc20, 0x1e845: 0x6c1b2c20, 0x1e846: 0x6ce33420, 0x1e847: 0x6d235c20, - 0x1e848: 0x6cd26c20, 0x1e849: 0x6d315a20, 0x1e84a: 0x6d1f4020, 0x1e84b: 0x6d283820, - 0x1e84c: 0x6c364c20, 0x1e84d: 0x6c0ba420, 0x1e84e: 0x6c4cec20, 0x1e84f: 0x6c364e20, - 0x1e850: 0x6cf9ca20, 0x1e851: 0x6c59ca20, 0x1e852: 0x6cc07020, 0x1e853: 0x6c2a1820, - 0x1e854: 0x6c26ac20, 0x1e855: 0x6cef1620, 0x1e856: 0x6ca45020, 0x1e857: 0x6d150820, - 0x1e858: 0x6c46be20, 0x1e859: 0x6d111620, 0x1e85a: 0x6c1e4620, 0x1e85b: 0x6c8e7420, - 0x1e85c: 0x6d0a9820, 0x1e85d: 0x6cde6c20, 0x1e85e: 0x6c2c7420, 0x1e85f: 0x6c1b4020, - 0x1e860: 0x6d25ec20, 0x1e861: 0x6cdada20, 0x1e862: 0x6cde6e20, 0x1e863: 0x6cba1420, - 0x1e864: 0x6c96f220, 0x1e865: 0x6d111820, 0x1e866: 0x6c499c20, 0x1e867: 0x6d2ed220, - 0x1e868: 0x6c025820, 0x1e869: 0x6cd3bc20, 0x1e86a: 0x6c10ea20, 0x1e86b: 0x6c1c4e20, - 0x1e86c: 0x6cdaf620, 0x1e86d: 0x6d2a1c20, 0x1e86e: 0x6d300420, 0x1e86f: 0x6c340220, - 0x1e870: 0x6c2c8820, 0x1e871: 0x6c90ac20, 0x1e872: 0x6c1b5020, 0x1e873: 0x6c25c220, - 0x1e874: 0x6c8bd620, 0x1e875: 0x6d41f020, 0x1e876: 0x6cc54820, 0x1e877: 0x6cb91820, - 0x1e878: 0x6d085820, 0x1e879: 0x6d23d620, 0x1e87a: 0x6d154e20, 0x1e87b: 0x6cf51c20, - 0x1e87c: 0x6c8a1620, 0x1e87d: 0x6c729820, 0x1e87e: 0x6cd3e220, 0x1e87f: 0x6c0a6020, - // Block 0x7a2, offset 0x1e880 - 0x1e880: 0x6d10bc20, 0x1e881: 0x6c974220, 0x1e882: 0x6d022220, 0x1e883: 0x6cdc9420, - 0x1e884: 0x6c4d2a20, 0x1e885: 0x6d2d9e20, 0x1e886: 0x6ce2b020, 0x1e887: 0x6c37aa20, - 0x1e888: 0x6c9ea220, 0x1e889: 0x6c0b0c20, 0x1e88a: 0x6c0b1420, 0x1e88b: 0x6c7e5220, - 0x1e88c: 0x6c847a20, 0x1e88d: 0x6d25c820, 0x1e88e: 0x6d117620, 0x1e88f: 0x6c957c20, - 0x1e890: 0x6c854c20, 0x1e891: 0x6d169e20, 0x1e892: 0x6ce65a20, 0x1e893: 0x6c2ad420, - 0x1e894: 0x6cb6c420, 0x1e895: 0x6d1d8220, 0x1e896: 0x6cccb420, 0x1e897: 0x6c4dc820, - 0x1e898: 0x6d20a420, 0x1e899: 0x6c982220, 0x1e89a: 0x6cc78820, 0x1e89b: 0x6cbef620, - 0x1e89c: 0x6cedb420, 0x1e89d: 0x6c7bd620, 0x1e89e: 0x6c3d3620, 0x1e89f: 0x6c777a20, - 0x1e8a0: 0x6c0d2020, 0x1e8a1: 0x6c398220, 0x1e8a2: 0x6d03bc20, 0x1e8a3: 0x6ca30220, - 0x1e8a4: 0x6d02a620, 0x1e8a5: 0x6cd04220, 0x1e8a6: 0x6c051620, 0x1e8a7: 0x6d253620, - 0x1e8a8: 0x6c259020, 0x1e8a9: 0x6c5d8a20, 0x1e8aa: 0x6d006a20, 0x1e8ab: 0x6c052c20, - 0x1e8ac: 0x6cf34e20, 0x1e8ad: 0x6c720220, 0x1e8ae: 0x6d1ef620, 0x1e8af: 0x6c4dd020, - 0x1e8b0: 0x6cdf1220, 0x1e8b1: 0x6cbf9820, 0x1e8b2: 0x6c092220, 0x1e8b3: 0x6caf2e20, - 0x1e8b4: 0x6c0dbe20, 0x1e8b5: 0x6ccec620, 0x1e8b6: 0x6c06de20, 0x1e8b7: 0x6cec1020, - 0x1e8b8: 0x6c2bd020, 0x1e8b9: 0x6d404620, 0x1e8ba: 0x6d12c820, 0x1e8bb: 0x6c8b9e20, - 0x1e8bc: 0x6c7b8820, 0x1e8bd: 0x6c4a3c20, 0x1e8be: 0x6d398620, 0x1e8bf: 0x6cd19e20, - // Block 0x7a3, offset 0x1e8c0 - 0x1e8c0: 0x6c7a2c20, 0x1e8c1: 0x6d22dc20, 0x1e8c2: 0x6c40e020, 0x1e8c3: 0x6c50ce20, - 0x1e8c4: 0x6cbc9a20, 0x1e8c5: 0x6d359420, 0x1e8c6: 0x6c5fe620, 0x1e8c7: 0x6c585c20, - 0x1e8c8: 0x6c545e20, 0x1e8c9: 0x6d03c820, 0x1e8ca: 0x6c682a20, 0x1e8cb: 0x6cf76a20, - 0x1e8cc: 0x6c4a7620, 0x1e8cd: 0x6caab420, 0x1e8ce: 0x6c80a220, 0x1e8cf: 0x6c63a620, - 0x1e8d0: 0x6c7b1420, 0x1e8d1: 0x6d333e20, 0x1e8d2: 0x6c813820, 0x1e8d3: 0x6d281e20, - 0x1e8d4: 0x6d0c6c20, 0x1e8d5: 0x6c19c220, 0x1e8d6: 0x6c30fc20, 0x1e8d7: 0x6cf5ae20, - 0x1e8d8: 0x6c935220, 0x1e8d9: 0x6c3f4e20, 0x1e8da: 0x6cf3aa20, 0x1e8db: 0x6c3e2620, - 0x1e8dc: 0x6c433e20, 0x1e8dd: 0x6c500a20, 0x1e8de: 0x6c80a420, 0x1e8df: 0x6c63aa20, - 0x1e8e0: 0x6c44f020, 0x1e8e1: 0x6c759a20, 0x1e8e2: 0x6d1ce220, 0x1e8e3: 0x6c0eca20, - 0x1e8e4: 0x6cf86820, 0x1e8e5: 0x6c06f420, 0x1e8e6: 0x6c85bc20, 0x1e8e7: 0x6d279220, - 0x1e8e8: 0x6c108c20, 0x1e8e9: 0x6cff7a20, 0x1e8ea: 0x6cb4e020, 0x1e8eb: 0x6cafd420, - 0x1e8ec: 0x6cbe3c20, 0x1e8ed: 0x6c4c1a20, 0x1e8ee: 0x6d386e20, 0x1e8ef: 0x6cdfd820, - 0x1e8f0: 0x6d404c20, 0x1e8f1: 0x6cb27e20, 0x1e8f2: 0x6c7ef020, 0x1e8f3: 0x6ca5d020, - 0x1e8f4: 0x6c186220, 0x1e8f5: 0x6d1f2420, 0x1e8f6: 0x6c10b420, 0x1e8f7: 0x6cfd6820, - 0x1e8f8: 0x6c27d020, 0x1e8f9: 0x6c711e20, 0x1e8fa: 0x6d1dba20, 0x1e8fb: 0x6cbb7420, - 0x1e8fc: 0x6d13ea20, 0x1e8fd: 0x6c30a620, 0x1e8fe: 0x6d0d7220, 0x1e8ff: 0x6c99f220, - // Block 0x7a4, offset 0x1e900 - 0x1e900: 0x6cc91a20, 0x1e901: 0x6c071820, 0x1e902: 0x6c361e20, 0x1e903: 0x6cd4d820, - 0x1e904: 0x6c735e20, 0x1e905: 0x6d225220, 0x1e906: 0x6d282820, 0x1e907: 0x6c53f420, - 0x1e908: 0x6c7c6a20, 0x1e909: 0x6cfd6e20, 0x1e90a: 0x6cfd7020, 0x1e90b: 0x6cd9a820, - 0x1e90c: 0x6ce0f820, 0x1e90d: 0x6ca00220, 0x1e90e: 0x6cf63220, 0x1e90f: 0x6cc7fe20, - 0x1e910: 0x6c1f4c20, 0x1e911: 0x6d3e4a20, 0x1e912: 0x6d405820, 0x1e913: 0x6d12f820, - 0x1e914: 0x6cf36c20, 0x1e915: 0x6cfd7c20, 0x1e916: 0x6d27a820, 0x1e917: 0x6c504220, - 0x1e918: 0x6d1d9220, 0x1e919: 0x6c08e620, 0x1e91a: 0x6c998820, 0x1e91b: 0x6c176420, - 0x1e91c: 0x6c3d8620, 0x1e91d: 0x6c8a6e20, 0x1e91e: 0x6d1a7820, 0x1e91f: 0x6d3b8020, - 0x1e920: 0x6c56a820, 0x1e921: 0x6cbb8220, 0x1e922: 0x6d0c1820, 0x1e923: 0x6d2ebc20, - 0x1e924: 0x6c97e020, 0x1e925: 0x6cbb8420, 0x1e926: 0x6d065020, 0x1e927: 0x6c2adc20, - 0x1e928: 0x6c0a9c20, 0x1e929: 0x6d0a2820, 0x1e92a: 0x6c0a0c20, 0x1e92b: 0x6d2b8420, - 0x1e92c: 0x6cef2620, 0x1e92d: 0x6d335820, 0x1e92e: 0x6c99a820, 0x1e92f: 0x6ccd9620, - 0x1e930: 0x6c8bc820, 0x1e931: 0x6cb33420, 0x1e932: 0x6c27f020, 0x1e933: 0x6c9b4020, - 0x1e934: 0x6d133220, 0x1e935: 0x6c12b820, 0x1e936: 0x6c7b3620, 0x1e937: 0x6c3c6420, - 0x1e938: 0x6c9b4220, 0x1e939: 0x6d406420, 0x1e93a: 0x6c7c0220, 0x1e93b: 0x6c88d020, - 0x1e93c: 0x6d29a220, 0x1e93d: 0x6c153020, 0x1e93e: 0x6d1eb820, 0x1e93f: 0x6c5f6420, - // Block 0x7a5, offset 0x1e940 - 0x1e940: 0x6d0ed820, 0x1e941: 0x6c154820, 0x1e942: 0x6c25f820, 0x1e943: 0x6c8d8820, - 0x1e944: 0x6c583a20, 0x1e945: 0x6cf74020, 0x1e946: 0x6c3c7820, 0x1e947: 0x6d29b620, - 0x1e948: 0x6c875820, 0x1e949: 0x6d1fa420, 0x1e94a: 0x6c2f5a20, 0x1e94b: 0x6cc02020, - 0x1e94c: 0x6d3d4020, 0x1e94d: 0x6cae1820, 0x1e94e: 0x6d391e20, 0x1e94f: 0x6d15e220, - 0x1e950: 0x6c418e20, 0x1e951: 0x6d20fe20, 0x1e952: 0x6c6fba20, 0x1e953: 0x6d0d7420, - 0x1e954: 0x6d41ae20, 0x1e955: 0x6c98e020, 0x1e956: 0x6d323e20, 0x1e957: 0x6d06c820, - 0x1e958: 0x6c311820, 0x1e959: 0x6d315420, 0x1e95a: 0x6c3b3020, 0x1e95b: 0x6d263e20, - 0x1e95c: 0x6c40ae20, 0x1e95d: 0x6d282a20, 0x1e95e: 0x6cdf7220, 0x1e95f: 0x6ce46a20, - 0x1e960: 0x6cb83a20, 0x1e961: 0x6ceb2c20, 0x1e962: 0x6c243e20, 0x1e963: 0x6c4da820, - 0x1e964: 0x6c471a20, 0x1e965: 0x6cda5020, 0x1e966: 0x6c37ee20, 0x1e967: 0x6c1dc620, - 0x1e968: 0x6d293e20, 0x1e969: 0x6ca03a20, 0x1e96a: 0x6c81d620, 0x1e96b: 0x6c21ca20, - 0x1e96c: 0x6c1e4e20, 0x1e96d: 0x6d205020, 0x1e96e: 0x6ce76020, 0x1e96f: 0x6d353c20, - 0x1e970: 0x6cfab420, 0x1e971: 0x6c67ec20, 0x1e972: 0x6c1a3020, 0x1e973: 0x6d1b6c20, - 0x1e974: 0x6ce8e220, 0x1e975: 0x6c69b220, 0x1e976: 0x6c9a1a20, 0x1e977: 0x6c7aa420, - 0x1e978: 0x6cdb8820, 0x1e979: 0x6c833c20, 0x1e97a: 0x6cb44420, 0x1e97b: 0x6d41c220, - 0x1e97c: 0x6c4d4420, 0x1e97d: 0x6d0e9c20, 0x1e97e: 0x6ccc8c20, 0x1e97f: 0x6ca77e20, - // Block 0x7a6, offset 0x1e980 - 0x1e980: 0x6cef3420, 0x1e981: 0x6c92c620, 0x1e982: 0x6c803620, 0x1e983: 0x6d0c2c20, - 0x1e984: 0x6ce23820, 0x1e985: 0x6cadc220, 0x1e986: 0x6d2e1220, 0x1e987: 0x6c215e20, - 0x1e988: 0x6ce00a20, 0x1e989: 0x6d41ca20, 0x1e98a: 0x6d3ca620, 0x1e98b: 0x6c246020, - 0x1e98c: 0x6c7d8220, 0x1e98d: 0x6ce38220, 0x1e98e: 0x6cfba220, 0x1e98f: 0x6c317620, - 0x1e990: 0x6c55c420, 0x1e991: 0x6d065c20, 0x1e992: 0x6d040820, 0x1e993: 0x6ce07c20, - 0x1e994: 0x6cc09a20, 0x1e995: 0x6c216420, 0x1e996: 0x6d285a20, 0x1e997: 0x6cb3a620, - 0x1e998: 0x6c783620, 0x1e999: 0x6cd9e620, 0x1e99a: 0x6c9c7620, 0x1e99b: 0x6cc31820, - 0x1e99c: 0x6c1e3220, 0x1e99d: 0x6c25cc20, 0x1e99e: 0x6d285e20, 0x1e99f: 0x6d1e7e20, - 0x1e9a0: 0x6c022220, 0x1e9a1: 0x6d2ce420, 0x1e9a2: 0x6c4d4a20, 0x1e9a3: 0x6ce14a20, - 0x1e9a4: 0x6c680020, 0x1e9a5: 0x6cb1a220, 0x1e9a6: 0x6c191820, 0x1e9a7: 0x6d244020, - 0x1e9a8: 0x6c846620, 0x1e9a9: 0x6d2a2c20, 0x1e9aa: 0x6c818620, 0x1e9ab: 0x6d142c20, - 0x1e9ac: 0x6c680a20, 0x1e9ad: 0x6c102820, 0x1e9ae: 0x6c69d420, 0x1e9af: 0x6cf71e20, - 0x1e9b0: 0x6ce03c20, 0x1e9b1: 0x6c37f220, 0x1e9b2: 0x6ca9dc20, 0x1e9b3: 0x6d193620, - 0x1e9b4: 0x6c854620, 0x1e9b5: 0x6c72c020, 0x1e9b6: 0x6d0efc20, 0x1e9b7: 0x6d193820, - 0x1e9b8: 0x6ca78020, 0x1e9b9: 0x6cc7ec20, 0x1e9ba: 0x6d09cc20, 0x1e9bb: 0x6c1e0a20, - 0x1e9bc: 0x6d0f1220, 0x1e9bd: 0x6c8db420, 0x1e9be: 0x6c9cc820, 0x1e9bf: 0x6c9cca20, - // Block 0x7a7, offset 0x1e9c0 - 0x1e9c0: 0x6ca78420, 0x1e9c1: 0x6d036020, 0x1e9c2: 0x6c69ea20, 0x1e9c3: 0x6ccc9620, - 0x1e9c4: 0x6c9cd420, 0x1e9c5: 0x6d0f2420, 0x1e9c6: 0x6c0b7820, 0x1e9c7: 0x6c111e20, - 0x1e9c8: 0x6cd37620, 0x1e9c9: 0x6d204a20, 0x1e9ca: 0x6cd39220, 0x1e9cb: 0x6cd40220, - 0x1e9cc: 0x6c84fc20, 0x1e9cd: 0x6d382020, 0x1e9ce: 0x6d12aa20, 0x1e9cf: 0x6c89c020, - 0x1e9d0: 0x6c847c20, 0x1e9d1: 0x6c6c2e20, 0x1e9d2: 0x6c6d7c20, 0x1e9d3: 0x6cc02220, - 0x1e9d4: 0x6d15d820, 0x1e9d5: 0x6c8a6c20, 0x1e9d6: 0x6c29c020, 0x1e9d7: 0x6d2f6220, - 0x1e9d8: 0x6c2f5c20, 0x1e9d9: 0x6cb38220, 0x1e9da: 0x6cc04220, 0x1e9db: 0x6c034220, - 0x1e9dc: 0x6c3f5620, 0x1e9dd: 0x6d314820, 0x1e9de: 0x6d344a20, 0x1e9df: 0x6c034420, - 0x1e9e0: 0x6c949820, 0x1e9e1: 0x6c3f5820, 0x1e9e2: 0x6ca3a020, 0x1e9e3: 0x6c2e2020, - 0x1e9e4: 0x6ccd8620, 0x1e9e5: 0x6cbc2220, 0x1e9e6: 0x6c79ea20, 0x1e9e7: 0x6c203420, - 0x1e9e8: 0x6d3f0e20, 0x1e9e9: 0x6c390e20, 0x1e9ea: 0x6c573620, 0x1e9eb: 0x6c573820, - 0x1e9ec: 0x6c4eb820, 0x1e9ed: 0x6c427c20, 0x1e9ee: 0x6cb5de20, 0x1e9ef: 0x6c985c20, - 0x1e9f0: 0x6cc64620, 0x1e9f1: 0x6c2c5220, 0x1e9f2: 0x6cd8be20, 0x1e9f3: 0x6cf87e20, - 0x1e9f4: 0x6d178620, 0x1e9f5: 0x6c146620, 0x1e9f6: 0x6cd1b620, 0x1e9f7: 0x6ce91a20, - 0x1e9f8: 0x6cf60620, 0x1e9f9: 0x6caa7420, 0x1e9fa: 0x6cb8dc20, 0x1e9fb: 0x6cc0c020, - 0x1e9fc: 0x6c668420, 0x1e9fd: 0x6cb09a20, 0x1e9fe: 0x6d128220, 0x1e9ff: 0x6c6c4820, - // Block 0x7a8, offset 0x1ea00 - 0x1ea00: 0x6c03a020, 0x1ea01: 0x6c399620, 0x1ea02: 0x6c18d020, 0x1ea03: 0x6d03ee20, - 0x1ea04: 0x6c30ee20, 0x1ea05: 0x6d26c220, 0x1ea06: 0x6cb8e620, 0x1ea07: 0x6c3d7820, - 0x1ea08: 0x6caf6820, 0x1ea09: 0x6ca34820, 0x1ea0a: 0x6d02d820, 0x1ea0b: 0x6c356e20, - 0x1ea0c: 0x6c746020, 0x1ea0d: 0x6c33f820, 0x1ea0e: 0x6c464c20, 0x1ea0f: 0x6d1ae620, - 0x1ea10: 0x6cb99a20, 0x1ea11: 0x6c04ce20, 0x1ea12: 0x6cc97620, 0x1ea13: 0x6cc57220, - 0x1ea14: 0x6c174a20, 0x1ea15: 0x6ca99620, 0x1ea16: 0x6c3b3220, 0x1ea17: 0x6d27ec20, - 0x1ea18: 0x6c614620, 0x1ea19: 0x6cbd7820, 0x1ea1a: 0x6caf6a20, 0x1ea1b: 0x6c4c2020, - 0x1ea1c: 0x6c535a20, 0x1ea1d: 0x6d1a6c20, 0x1ea1e: 0x6c757220, 0x1ea1f: 0x6cd1ca20, - 0x1ea20: 0x6d17ce20, 0x1ea21: 0x6d37ba20, 0x1ea22: 0x6cf7f020, 0x1ea23: 0x6c413a20, - 0x1ea24: 0x6cc64820, 0x1ea25: 0x6c5d8e20, 0x1ea26: 0x6cdf7620, 0x1ea27: 0x6c778820, - 0x1ea28: 0x6d264020, 0x1ea29: 0x6c934a20, 0x1ea2a: 0x6c365020, 0x1ea2b: 0x6cf21c20, - 0x1ea2c: 0x6c345420, 0x1ea2d: 0x6d3e7220, 0x1ea2e: 0x6ca64020, 0x1ea2f: 0x6ce8d020, - 0x1ea30: 0x6cd3aa20, 0x1ea31: 0x6c9f6820, 0x1ea32: 0x6c472220, 0x1ea33: 0x6c780e20, - 0x1ea34: 0x6c8d2420, 0x1ea35: 0x6c0dec20, 0x1ea36: 0x6cd8d020, 0x1ea37: 0x6c47a420, - 0x1ea38: 0x6c0f1c20, 0x1ea39: 0x6caf7820, 0x1ea3a: 0x6d238420, 0x1ea3b: 0x6cd8d220, - 0x1ea3c: 0x6d424820, 0x1ea3d: 0x6c101820, 0x1ea3e: 0x6d1f5020, 0x1ea3f: 0x6ce4b020, - // Block 0x7a9, offset 0x1ea40 - 0x1ea40: 0x6c642220, 0x1ea41: 0x6d317620, 0x1ea42: 0x6cd2d420, 0x1ea43: 0x6cd3ac20, - 0x1ea44: 0x6d347a20, 0x1ea45: 0x6c725220, 0x1ea46: 0x6c14d220, 0x1ea47: 0x6cd1da20, - 0x1ea48: 0x6cd1dc20, 0x1ea49: 0x6d089e20, 0x1ea4a: 0x6d2f6820, 0x1ea4b: 0x6c065420, - 0x1ea4c: 0x6c514e20, 0x1ea4d: 0x6c09e620, 0x1ea4e: 0x6cd10e20, 0x1ea4f: 0x6c1e9620, - 0x1ea50: 0x6cd27820, 0x1ea51: 0x6c0f1e20, 0x1ea52: 0x6d3b0e20, 0x1ea53: 0x6c1c3820, - 0x1ea54: 0x6d289220, 0x1ea55: 0x6cb31420, 0x1ea56: 0x6ce76220, 0x1ea57: 0x6cb9aa20, - 0x1ea58: 0x6c3eb020, 0x1ea59: 0x6d2d3020, 0x1ea5a: 0x6c8f0c20, 0x1ea5b: 0x6cb8f820, - 0x1ea5c: 0x6c3eb220, 0x1ea5d: 0x6c864020, 0x1ea5e: 0x6d26ca20, 0x1ea5f: 0x6caf7a20, - 0x1ea60: 0x6d0f5e20, 0x1ea61: 0x6c04fe20, 0x1ea62: 0x6c0e8020, 0x1ea63: 0x6c6b0020, - 0x1ea64: 0x6c465420, 0x1ea65: 0x6cd5ec20, 0x1ea66: 0x6d32da20, 0x1ea67: 0x6ca24c20, - 0x1ea68: 0x6cf7f220, 0x1ea69: 0x6cf7f420, 0x1ea6a: 0x6c2c7620, 0x1ea6b: 0x6c637420, - 0x1ea6c: 0x6ca29e20, 0x1ea6d: 0x6ce06420, 0x1ea6e: 0x6c588820, 0x1ea6f: 0x6d15f220, - 0x1ea70: 0x6cd7fa20, 0x1ea71: 0x6c7bfe20, 0x1ea72: 0x6c761e20, 0x1ea73: 0x6c06ce20, - 0x1ea74: 0x6c66a020, 0x1ea75: 0x6ce77020, 0x1ea76: 0x6d03f420, 0x1ea77: 0x6c537820, - 0x1ea78: 0x6c691c20, 0x1ea79: 0x6c1bbc20, 0x1ea7a: 0x6c37d820, 0x1ea7b: 0x6c961a20, - 0x1ea7c: 0x6c0dee20, 0x1ea7d: 0x6cd3be20, 0x1ea7e: 0x6ca1dc20, 0x1ea7f: 0x6c637820, - // Block 0x7aa, offset 0x1ea80 - 0x1ea80: 0x6d1a8620, 0x1ea81: 0x6c757c20, 0x1ea82: 0x6d389e20, 0x1ea83: 0x6c1d5620, - 0x1ea84: 0x6cfdf620, 0x1ea85: 0x6ce77220, 0x1ea86: 0x6ca14220, 0x1ea87: 0x6c833e20, - 0x1ea88: 0x6c5f0e20, 0x1ea89: 0x6d23b020, 0x1ea8a: 0x6d071e20, 0x1ea8b: 0x6cc57820, - 0x1ea8c: 0x6d421a20, 0x1ea8d: 0x6d36a220, 0x1ea8e: 0x6cbf4c20, 0x1ea8f: 0x6ccd8e20, - 0x1ea90: 0x6c1c5020, 0x1ea91: 0x6cfc2220, 0x1ea92: 0x6d03f620, 0x1ea93: 0x6cc30e20, - 0x1ea94: 0x6caf8020, 0x1ea95: 0x6ce5fe20, 0x1ea96: 0x6d39c020, 0x1ea97: 0x6cfe4820, - 0x1ea98: 0x6ca01220, 0x1ea99: 0x6c7ada20, 0x1ea9a: 0x6d112c20, 0x1ea9b: 0x6cfac220, - 0x1ea9c: 0x6cfb7620, 0x1ea9d: 0x6d04ea20, 0x1ea9e: 0x6c757e20, 0x1ea9f: 0x6c13aa20, - 0x1eaa0: 0x6c81b620, 0x1eaa1: 0x6c607820, 0x1eaa2: 0x6cb06620, 0x1eaa3: 0x6cc7ba20, - 0x1eaa4: 0x6c9cfe20, 0x1eaa5: 0x6d140820, 0x1eaa6: 0x6d19fa20, 0x1eaa7: 0x6c49f220, - 0x1eaa8: 0x6c019020, 0x1eaa9: 0x6c2fd420, 0x1eaaa: 0x6d1fe020, 0x1eaab: 0x6ccb3820, - 0x1eaac: 0x6c77c620, 0x1eaad: 0x6cb9b620, 0x1eaae: 0x6c944220, 0x1eaaf: 0x6cd90020, - 0x1eab0: 0x6c003020, 0x1eab1: 0x6c2e3220, 0x1eab2: 0x6c4efe20, 0x1eab3: 0x6cc8de20, - 0x1eab4: 0x6cd3cc20, 0x1eab5: 0x6c795020, 0x1eab6: 0x6cc09220, 0x1eab7: 0x6cff0c20, - 0x1eab8: 0x6d308620, 0x1eab9: 0x6d054e20, 0x1eaba: 0x6d2a0c20, 0x1eabb: 0x6ce37020, - 0x1eabc: 0x6c263820, 0x1eabd: 0x6c487020, 0x1eabe: 0x6c53d220, 0x1eabf: 0x6d37c820, - // Block 0x7ab, offset 0x1eac0 - 0x1eac0: 0x6ce7de20, 0x1eac1: 0x6c93ac20, 0x1eac2: 0x6c9a2220, 0x1eac3: 0x6c80e220, - 0x1eac4: 0x6ced4a20, 0x1eac5: 0x6d02e620, 0x1eac6: 0x6d27c420, 0x1eac7: 0x6c075420, - 0x1eac8: 0x6cf51e20, 0x1eac9: 0x6cdb0c20, 0x1eaca: 0x6d23dc20, 0x1eacb: 0x6c151420, - 0x1eacc: 0x6c2fb620, 0x1eacd: 0x6c0f4e20, 0x1eace: 0x6c4f0020, 0x1eacf: 0x6c63de20, - 0x1ead0: 0x6c538420, 0x1ead1: 0x6c249220, 0x1ead2: 0x6c3c6620, 0x1ead3: 0x6c14d620, - 0x1ead4: 0x6ced4c20, 0x1ead5: 0x6d36d020, 0x1ead6: 0x6cd82620, 0x1ead7: 0x6d07ca20, - 0x1ead8: 0x6c575620, 0x1ead9: 0x6d228220, 0x1eada: 0x6ce59e20, 0x1eadb: 0x6c45fa20, - 0x1eadc: 0x6d3d9420, 0x1eadd: 0x6c94bc20, 0x1eade: 0x6d03fc20, 0x1eadf: 0x6cbde620, - 0x1eae0: 0x6cd0c420, 0x1eae1: 0x6c4e2e20, 0x1eae2: 0x6c94be20, 0x1eae3: 0x6d128a20, - 0x1eae4: 0x6c1eac20, 0x1eae5: 0x6d2bae20, 0x1eae6: 0x6c70c420, 0x1eae7: 0x6cfd0220, - 0x1eae8: 0x6ce60020, 0x1eae9: 0x6c987020, 0x1eaea: 0x6cb4b420, 0x1eaeb: 0x6c843620, - 0x1eaec: 0x6cacc020, 0x1eaed: 0x6cc8e020, 0x1eaee: 0x6c1a3220, 0x1eaef: 0x6c435820, - 0x1eaf0: 0x6c852820, 0x1eaf1: 0x6ce28220, 0x1eaf2: 0x6c0e4420, 0x1eaf3: 0x6d3b2420, - 0x1eaf4: 0x6d327e20, 0x1eaf5: 0x6ce87a20, 0x1eaf6: 0x6c8f1820, 0x1eaf7: 0x6d41d420, - 0x1eaf8: 0x6c729a20, 0x1eaf9: 0x6c16fa20, 0x1eafa: 0x6d25f020, 0x1eafb: 0x6c66d820, - 0x1eafc: 0x6c429220, 0x1eafd: 0x6c2e4020, 0x1eafe: 0x6ce24020, 0x1eaff: 0x6c16c620, - // Block 0x7ac, offset 0x1eb00 - 0x1eb00: 0x6c951020, 0x1eb01: 0x6c4cd020, 0x1eb02: 0x6c8d5c20, 0x1eb03: 0x6c06ba20, - 0x1eb04: 0x6c92de20, 0x1eb05: 0x6c845020, 0x1eb06: 0x6cbade20, 0x1eb07: 0x6cb3e220, - 0x1eb08: 0x6c732e20, 0x1eb09: 0x6c9f7a20, 0x1eb0a: 0x6d41d620, 0x1eb0b: 0x6caeca20, - 0x1eb0c: 0x6c01d020, 0x1eb0d: 0x6caf9020, 0x1eb0e: 0x6cfd1420, 0x1eb0f: 0x6d0afa20, - 0x1eb10: 0x6d3c6820, 0x1eb11: 0x6c834620, 0x1eb12: 0x6c783220, 0x1eb13: 0x6c798a20, - 0x1eb14: 0x6cdea820, 0x1eb15: 0x6c7d8420, 0x1eb16: 0x6c31bc20, 0x1eb17: 0x6ca59020, - 0x1eb18: 0x6c20e220, 0x1eb19: 0x6d3e9820, 0x1eb1a: 0x6d32ec20, 0x1eb1b: 0x6c078c20, - 0x1eb1c: 0x6ca87620, 0x1eb1d: 0x6d403620, 0x1eb1e: 0x6c216620, 0x1eb1f: 0x6ce01420, - 0x1eb20: 0x6c2fba20, 0x1eb21: 0x6cb65420, 0x1eb22: 0x6cb9cc20, 0x1eb23: 0x6d3cac20, - 0x1eb24: 0x6c5f4820, 0x1eb25: 0x6d23fa20, 0x1eb26: 0x6c6cb620, 0x1eb27: 0x6c496620, - 0x1eb28: 0x6c990820, 0x1eb29: 0x6c167c20, 0x1eb2a: 0x6ce51c20, 0x1eb2b: 0x6cf6de20, - 0x1eb2c: 0x6c891e20, 0x1eb2d: 0x6ce24220, 0x1eb2e: 0x6c482820, 0x1eb2f: 0x6c263a20, - 0x1eb30: 0x6cd61420, 0x1eb31: 0x6d319c20, 0x1eb32: 0x6c92e020, 0x1eb33: 0x6c9be820, - 0x1eb34: 0x6c92e220, 0x1eb35: 0x6c571820, 0x1eb36: 0x6c0c8020, 0x1eb37: 0x6c40cc20, - 0x1eb38: 0x6c7f2c20, 0x1eb39: 0x6c790e20, 0x1eb3a: 0x6c39ec20, 0x1eb3b: 0x6cf55820, - 0x1eb3c: 0x6ca3d820, 0x1eb3d: 0x6ced9c20, 0x1eb3e: 0x6d299c20, 0x1eb3f: 0x6c570020, - // Block 0x7ad, offset 0x1eb40 - 0x1eb40: 0x6c2a8620, 0x1eb41: 0x6cfada20, 0x1eb42: 0x6cb10220, 0x1eb43: 0x6c5d6020, - 0x1eb44: 0x6c89cc20, 0x1eb45: 0x6c384820, 0x1eb46: 0x6c9ad820, 0x1eb47: 0x6c767220, - 0x1eb48: 0x6d1bf220, 0x1eb49: 0x6c2b4a20, 0x1eb4a: 0x6c892220, 0x1eb4b: 0x6c4c4020, - 0x1eb4c: 0x6cfc3620, 0x1eb4d: 0x6c328220, 0x1eb4e: 0x6ce8fc20, 0x1eb4f: 0x6cef4420, - 0x1eb50: 0x6d3fca20, 0x1eb51: 0x6c406a20, 0x1eb52: 0x6cc76620, 0x1eb53: 0x6c60d220, - 0x1eb54: 0x6c36ba20, 0x1eb55: 0x6c758620, 0x1eb56: 0x6c191420, 0x1eb57: 0x6ce38c20, - 0x1eb58: 0x6d2c5820, 0x1eb59: 0x6c56d420, 0x1eb5a: 0x6d0fe020, 0x1eb5b: 0x6c32de20, - 0x1eb5c: 0x6cfa0420, 0x1eb5d: 0x6d21c220, 0x1eb5e: 0x6c795a20, 0x1eb5f: 0x6d03aa20, - 0x1eb60: 0x6c5a1020, 0x1eb61: 0x6cf03220, 0x1eb62: 0x6c406c20, 0x1eb63: 0x6d2f7620, - 0x1eb64: 0x6c13b620, 0x1eb65: 0x6cbcee20, 0x1eb66: 0x6cd20620, 0x1eb67: 0x6c52d620, - 0x1eb68: 0x6c7ca820, 0x1eb69: 0x6ce51e20, 0x1eb6a: 0x6ca1ee20, 0x1eb6b: 0x6cbbbc20, - 0x1eb6c: 0x6cbbbe20, 0x1eb6d: 0x6c543820, 0x1eb6e: 0x6ce7e020, 0x1eb6f: 0x6c236c20, - 0x1eb70: 0x6c58ae20, 0x1eb71: 0x6d136620, 0x1eb72: 0x6c9f7e20, 0x1eb73: 0x6c66e620, - 0x1eb74: 0x6c32a420, 0x1eb75: 0x6c66da20, 0x1eb76: 0x6cd94220, 0x1eb77: 0x6c7caa20, - 0x1eb78: 0x6c55d220, 0x1eb79: 0x6d07d820, 0x1eb7a: 0x6c34b620, 0x1eb7b: 0x6c6b4a20, - 0x1eb7c: 0x6d31a020, 0x1eb7d: 0x6c0b0e20, 0x1eb7e: 0x6d37d020, 0x1eb7f: 0x6d3ea220, - // Block 0x7ae, offset 0x1eb80 - 0x1eb80: 0x6d04fe20, 0x1eb81: 0x6d129020, 0x1eb82: 0x6c9a6e20, 0x1eb83: 0x6cac3420, - 0x1eb84: 0x6c003620, 0x1eb85: 0x6c6c0c20, 0x1eb86: 0x6cba9420, 0x1eb87: 0x6c9a3220, - 0x1eb88: 0x6cdda220, 0x1eb89: 0x6c26ca20, 0x1eb8a: 0x6c059620, 0x1eb8b: 0x6cfa0a20, - 0x1eb8c: 0x6c887a20, 0x1eb8d: 0x6cddaa20, 0x1eb8e: 0x6c769a20, 0x1eb8f: 0x6c8ec020, - 0x1eb90: 0x6d116420, 0x1eb91: 0x6d137420, 0x1eb92: 0x6caa2e20, 0x1eb93: 0x6cf23e20, - 0x1eb94: 0x6cc6d420, 0x1eb95: 0x6ce15420, 0x1eb96: 0x6cddac20, 0x1eb97: 0x6cbaf220, - 0x1eb98: 0x6c86e020, 0x1eb99: 0x6cd7a620, 0x1eb9a: 0x6c20e420, 0x1eb9b: 0x6c0f9620, - 0x1eb9c: 0x6cac8620, 0x1eb9d: 0x6c266e20, 0x1eb9e: 0x6c089620, 0x1eb9f: 0x6cca9020, - 0x1eba0: 0x6c429420, 0x1eba1: 0x6d3ea620, 0x1eba2: 0x6cf38c20, 0x1eba3: 0x6d1cb420, - 0x1eba4: 0x6c5a7e20, 0x1eba5: 0x6ce5aa20, 0x1eba6: 0x6c8ec220, 0x1eba7: 0x6c767420, - 0x1eba8: 0x6cdd0220, 0x1eba9: 0x6ccc2220, 0x1ebaa: 0x6cd9f020, 0x1ebab: 0x6ceda820, - 0x1ebac: 0x6c507620, 0x1ebad: 0x6d327020, 0x1ebae: 0x6d327220, 0x1ebaf: 0x6c80e820, - 0x1ebb0: 0x6d18fc20, 0x1ebb1: 0x6d25c420, 0x1ebb2: 0x6ce18620, 0x1ebb3: 0x6ca88a20, - 0x1ebb4: 0x6cf7b020, 0x1ebb5: 0x6c638c20, 0x1ebb6: 0x6c43ba20, 0x1ebb7: 0x6c96a820, - 0x1ebb8: 0x6c730620, 0x1ebb9: 0x6cd9a220, 0x1ebba: 0x6d413420, 0x1ebbb: 0x6cddae20, - 0x1ebbc: 0x6cfa5620, 0x1ebbd: 0x6c3d0220, 0x1ebbe: 0x6cf21e20, 0x1ebbf: 0x6ca2ec20, - // Block 0x7af, offset 0x1ebc0 - 0x1ebc0: 0x6c91fa20, 0x1ebc1: 0x6cddb020, 0x1ebc2: 0x6cab6020, 0x1ebc3: 0x6d40f620, - 0x1ebc4: 0x6ce96e20, 0x1ebc5: 0x6d050820, 0x1ebc6: 0x6c49b220, 0x1ebc7: 0x6d08cc20, - 0x1ebc8: 0x6c892620, 0x1ebc9: 0x6cd48620, 0x1ebca: 0x6c02f820, 0x1ebcb: 0x6c97d420, - 0x1ebcc: 0x6ca18020, 0x1ebcd: 0x6c956620, 0x1ebce: 0x6c0a9e20, 0x1ebcf: 0x6cf0fe20, - 0x1ebd0: 0x6c8ed020, 0x1ebd1: 0x6c2bb220, 0x1ebd2: 0x6cca3620, 0x1ebd3: 0x6d401220, - 0x1ebd4: 0x6d158a20, 0x1ebd5: 0x6c932020, 0x1ebd6: 0x6c028220, 0x1ebd7: 0x6c796220, - 0x1ebd8: 0x6cbafa20, 0x1ebd9: 0x6c24f820, 0x1ebda: 0x6cb54e20, 0x1ebdb: 0x6c16d220, - 0x1ebdc: 0x6ce0dc20, 0x1ebdd: 0x6c981020, 0x1ebde: 0x6d1dd020, 0x1ebdf: 0x6c160620, - 0x1ebe0: 0x6c3c7220, 0x1ebe1: 0x6c6ebe20, 0x1ebe2: 0x6c0c4820, 0x1ebe3: 0x6cd62a20, - 0x1ebe4: 0x6c912420, 0x1ebe5: 0x6d055820, 0x1ebe6: 0x6c237420, 0x1ebe7: 0x6c8fce20, - 0x1ebe8: 0x6d29b020, 0x1ebe9: 0x6c670820, 0x1ebea: 0x6c12a220, 0x1ebeb: 0x6c849220, - 0x1ebec: 0x6cfa5c20, 0x1ebed: 0x6cf72020, 0x1ebee: 0x6c776020, 0x1ebef: 0x6cd6f820, - 0x1ebf0: 0x6c086220, 0x1ebf1: 0x6d2f4a20, 0x1ebf2: 0x6cba9620, 0x1ebf3: 0x6c19a620, - 0x1ebf4: 0x6c933420, 0x1ebf5: 0x6c576820, 0x1ebf6: 0x6c60f220, 0x1ebf7: 0x6cb47220, - 0x1ebf8: 0x6c5c8c20, 0x1ebf9: 0x6cbb5020, 0x1ebfa: 0x6cb32420, 0x1ebfb: 0x6c8c0220, - 0x1ebfc: 0x6ccb9020, 0x1ebfd: 0x6d055a20, 0x1ebfe: 0x6cca3c20, 0x1ebff: 0x6c19a820, - // Block 0x7b0, offset 0x1ec00 - 0x1ec00: 0x6c7d3a20, 0x1ec01: 0x6cd84820, 0x1ec02: 0x6c8f5420, 0x1ec03: 0x6ca4d220, - 0x1ec04: 0x6c5a2220, 0x1ec05: 0x6cb1e020, 0x1ec06: 0x6cdcb020, 0x1ec07: 0x6c38ea20, - 0x1ec08: 0x6cbc0e20, 0x1ec09: 0x6cc2aa20, 0x1ec0a: 0x6d0fee20, 0x1ec0b: 0x6ce0de20, - 0x1ec0c: 0x6cfe6620, 0x1ec0d: 0x6c750420, 0x1ec0e: 0x6c68a420, 0x1ec0f: 0x6d41fc20, - 0x1ec10: 0x6c8a4e20, 0x1ec11: 0x6cbd0420, 0x1ec12: 0x6c819020, 0x1ec13: 0x6c338020, - 0x1ec14: 0x6d030620, 0x1ec15: 0x6d295820, 0x1ec16: 0x6c5f8e20, 0x1ec17: 0x6c661e20, - 0x1ec18: 0x6d37da20, 0x1ec19: 0x6c2af620, 0x1ec1a: 0x6d0b0620, 0x1ec1b: 0x6d1d5c20, - 0x1ec1c: 0x6c331e20, 0x1ec1d: 0x6c750620, 0x1ec1e: 0x6caa3020, 0x1ec1f: 0x6d295a20, - 0x1ec20: 0x6cb4a420, 0x1ec21: 0x6ce60620, 0x1ec22: 0x6c38ec20, 0x1ec23: 0x6d2f4c20, - 0x1ec24: 0x6c2f8a20, 0x1ec25: 0x6ccdda20, 0x1ec26: 0x6c764220, 0x1ec27: 0x6c653820, - 0x1ec28: 0x6c3af020, 0x1ec29: 0x6cdcba20, 0x1ec2a: 0x6c920020, 0x1ec2b: 0x6c730c20, - 0x1ec2c: 0x6c5c9420, 0x1ec2d: 0x6d246a20, 0x1ec2e: 0x6c889c20, 0x1ec2f: 0x6d3dcc20, - 0x1ec30: 0x6cbbc820, 0x1ec31: 0x6c672220, 0x1ec32: 0x6d3dde20, 0x1ec33: 0x6c828c20, - 0x1ec34: 0x6c0ac820, 0x1ec35: 0x6ce60820, 0x1ec36: 0x6c58c220, 0x1ec37: 0x6d138c20, - 0x1ec38: 0x6c346c20, 0x1ec39: 0x6c4cd620, 0x1ec3a: 0x6c29ac20, 0x1ec3b: 0x6c72ce20, - 0x1ec3c: 0x6c3bac20, 0x1ec3d: 0x6c26d620, 0x1ec3e: 0x6c077220, 0x1ec3f: 0x6d194a20, - // Block 0x7b1, offset 0x1ec40 - 0x1ec40: 0x6c010820, 0x1ec41: 0x6d3fe220, 0x1ec42: 0x6d0aba20, 0x1ec43: 0x6c2e4e20, - 0x1ec44: 0x6d3b4e20, 0x1ec45: 0x6c528620, 0x1ec46: 0x6d3cc220, 0x1ec47: 0x6c5fa220, - 0x1ec48: 0x6ca8be20, 0x1ec49: 0x6c51a620, 0x1ec4a: 0x6c5e4c20, 0x1ec4b: 0x6cbe6020, - 0x1ec4c: 0x6c0d7020, 0x1ec4d: 0x6d1c3e20, 0x1ec4e: 0x6c7d4020, 0x1ec4f: 0x6ca93c20, - 0x1ec50: 0x6d060e20, 0x1ec51: 0x6c672620, 0x1ec52: 0x6c672820, 0x1ec53: 0x6cba9a20, - 0x1ec54: 0x6c142620, 0x1ec55: 0x6d377220, 0x1ec56: 0x6c9f1620, 0x1ec57: 0x6c84ce20, - 0x1ec58: 0x6c829820, 0x1ec59: 0x6c5fa620, 0x1ec5a: 0x6d416620, 0x1ec5b: 0x6c7c2220, - 0x1ec5c: 0x6cce4420, 0x1ec5d: 0x6caefc20, 0x1ec5e: 0x6c7ece20, 0x1ec5f: 0x6c320020, - 0x1ec60: 0x6cd7b020, 0x1ec61: 0x6c21ec20, 0x1ec62: 0x6c942820, 0x1ec63: 0x6c0c6220, - 0x1ec64: 0x6c068420, 0x1ec65: 0x6c920420, 0x1ec66: 0x6cfd5c20, 0x1ec67: 0x6c7b7e20, - 0x1ec68: 0x6c901020, 0x1ec69: 0x6c36fa20, 0x1ec6a: 0x6c91a220, 0x1ec6b: 0x6d02f820, - 0x1ec6c: 0x6c672c20, 0x1ec6d: 0x6c809420, 0x1ec6e: 0x6c0fd620, 0x1ec6f: 0x6c655620, - 0x1ec70: 0x6d125820, 0x1ec71: 0x6c157e20, 0x1ec72: 0x6cfda620, 0x1ec73: 0x6c673020, - 0x1ec74: 0x6cf76220, 0x1ec75: 0x6c49c820, 0x1ec76: 0x6c125620, 0x1ec77: 0x6ca8d220, - 0x1ec78: 0x6c831620, 0x1ec79: 0x6c249c20, 0x1ec7a: 0x6cc23020, 0x1ec7b: 0x6cacc820, - 0x1ec7c: 0x6c959420, 0x1ec7d: 0x6d414420, 0x1ec7e: 0x6c947a20, 0x1ec7f: 0x6d2a3820, - // Block 0x7b2, offset 0x1ec80 - 0x1ec80: 0x6ca8d820, 0x1ec81: 0x6c753e20, 0x1ec82: 0x6ce19820, 0x1ec83: 0x6cd58e20, - 0x1ec84: 0x6c801c20, 0x1ec85: 0x6c6c2220, 0x1ec86: 0x6c40c420, 0x1ec87: 0x6d15b420, - 0x1ec88: 0x6d312020, 0x1ec89: 0x6c2f5220, 0x1ec8a: 0x6d2f5220, 0x1ec8b: 0x6cb2f020, - 0x1ec8c: 0x6c8a6620, 0x1ec8d: 0x6ce91820, 0x1ec8e: 0x6cb8ba20, 0x1ec8f: 0x6c203220, - 0x1ec90: 0x6cccca20, 0x1ec91: 0x6c5fe820, 0x1ec92: 0x6c388e20, 0x1ec93: 0x6c2e0a20, - 0x1ec94: 0x6c9ac420, 0x1ec95: 0x6caa7020, 0x1ec96: 0x6d0f8c20, 0x1ec97: 0x6c146420, - 0x1ec98: 0x6d03d620, 0x1ec99: 0x6c413020, 0x1ec9a: 0x6c107a20, 0x1ec9b: 0x6cdf6620, - 0x1ec9c: 0x6c721c20, 0x1ec9d: 0x6c33e620, 0x1ec9e: 0x6c173e20, 0x1ec9f: 0x6d37ac20, - 0x1eca0: 0x6ca32220, 0x1eca1: 0x6c06f620, 0x1eca2: 0x6c426a20, 0x1eca3: 0x6c04c420, - 0x1eca4: 0x6cb97a20, 0x1eca5: 0x6d11fa20, 0x1eca6: 0x6cbd2220, 0x1eca7: 0x6c756620, - 0x1eca8: 0x6cf35e20, 0x1eca9: 0x6c463c20, 0x1ecaa: 0x6c778420, 0x1ecab: 0x6c398e20, - 0x1ecac: 0x6c5d8c20, 0x1ecad: 0x6ce80a20, 0x1ecae: 0x6ca98e20, 0x1ecaf: 0x6c039c20, - 0x1ecb0: 0x6d22fa20, 0x1ecb1: 0x6cb98420, 0x1ecb2: 0x6d32aa20, 0x1ecb3: 0x6cb98620, - 0x1ecb4: 0x6c477820, 0x1ecb5: 0x6c0e6820, 0x1ecb6: 0x6c353c20, 0x1ecb7: 0x6cb35220, - 0x1ecb8: 0x6c108e20, 0x1ecb9: 0x6c0ee220, 0x1ecba: 0x6d26a020, 0x1ecbb: 0x6d413820, - 0x1ecbc: 0x6ca28020, 0x1ecbd: 0x6ce05a20, 0x1ecbe: 0x6c641020, 0x1ecbf: 0x6c2d4a20, - // Block 0x7b3, offset 0x1ecc0 - 0x1ecc0: 0x6d1f2620, 0x1ecc1: 0x6ce5f820, 0x1ecc2: 0x6c0ee420, 0x1ecc3: 0x6c8cd620, - 0x1ecc4: 0x6cd77a20, 0x1ecc5: 0x6cb8d020, 0x1ecc6: 0x6c993620, 0x1ecc7: 0x6c064420, - 0x1ecc8: 0x6cd36620, 0x1ecc9: 0x6d088420, 0x1ecca: 0x6cdde820, 0x1eccb: 0x6c097220, - 0x1eccc: 0x6ca5d220, 0x1eccd: 0x6caf5e20, 0x1ecce: 0x6c344220, 0x1eccf: 0x6d03e420, - 0x1ecd0: 0x6c77bc20, 0x1ecd1: 0x6c81b020, 0x1ecd2: 0x6c379420, 0x1ecd3: 0x6c985e20, - 0x1ecd4: 0x6d0ba820, 0x1ecd5: 0x6d1fc620, 0x1ecd6: 0x6c19f620, 0x1ecd7: 0x6c63bc20, - 0x1ecd8: 0x6d127e20, 0x1ecd9: 0x6ca4a820, 0x1ecda: 0x6d361020, 0x1ecdb: 0x6c29aa20, - 0x1ecdc: 0x6ce74620, 0x1ecdd: 0x6c939820, 0x1ecde: 0x6c2e2220, 0x1ecdf: 0x6d19d220, - 0x1ece0: 0x6c765020, 0x1ece1: 0x6d2c2e20, 0x1ece2: 0x6d39a220, 0x1ece3: 0x6cf7e420, - 0x1ece4: 0x6c2fa220, 0x1ece5: 0x6c2fd220, 0x1ece6: 0x6cfaa420, 0x1ece7: 0x6c573a20, - 0x1ece8: 0x6cc2e820, 0x1ece9: 0x6ccbf020, 0x1ecea: 0x6c4cfa20, 0x1eceb: 0x6c2e2420, - 0x1ecec: 0x6c448620, 0x1eced: 0x6c9ffc20, 0x1ecee: 0x6d32be20, 0x1ecef: 0x6ccb2620, - 0x1ecf0: 0x6c68ec20, 0x1ecf1: 0x6d13ec20, 0x1ecf2: 0x6c15b220, 0x1ecf3: 0x6c1d4e20, - 0x1ecf4: 0x6ce0be20, 0x1ecf5: 0x6c018220, 0x1ecf6: 0x6d1a6220, 0x1ecf7: 0x6cc7a820, - 0x1ecf8: 0x6d3b0620, 0x1ecf9: 0x6c815c20, 0x1ecfa: 0x6cb4ac20, 0x1ecfb: 0x6cf3cc20, - 0x1ecfc: 0x6c7f1020, 0x1ecfd: 0x6ce27c20, 0x1ecfe: 0x6c890020, 0x1ecff: 0x6c794420, - // Block 0x7b4, offset 0x1ed00 - 0x1ed00: 0x6cfed020, 0x1ed01: 0x6cdd6820, 0x1ed02: 0x6c851a20, 0x1ed03: 0x6d2bac20, - 0x1ed04: 0x6c1e8620, 0x1ed05: 0x6c4c2220, 0x1ed06: 0x6c434a20, 0x1ed07: 0x6c357020, - 0x1ed08: 0x6d053e20, 0x1ed09: 0x6c262e20, 0x1ed0a: 0x6c94aa20, 0x1ed0b: 0x6c3c5220, - 0x1ed0c: 0x6d02da20, 0x1ed0d: 0x6c8f0a20, 0x1ed0e: 0x6c763220, 0x1ed0f: 0x6c65a220, - 0x1ed10: 0x6cc8d020, 0x1ed11: 0x6ce2f220, 0x1ed12: 0x6c80ce20, 0x1ed13: 0x6cbdda20, - 0x1ed14: 0x6c70a420, 0x1ed15: 0x6c000820, 0x1ed16: 0x6cbac620, 0x1ed17: 0x6d30da20, - 0x1ed18: 0x6cab0020, 0x1ed19: 0x6c263220, 0x1ed1a: 0x6c98ee20, 0x1ed1b: 0x6c078a20, - 0x1ed1c: 0x6cb60620, 0x1ed1d: 0x6c2a7820, 0x1ed1e: 0x6c78be20, 0x1ed1f: 0x6c7d7420, - 0x1ed20: 0x6c167620, 0x1ed21: 0x6cf65e20, 0x1ed22: 0x6c482020, 0x1ed23: 0x6c954c20, - 0x1ed24: 0x6c20da20, 0x1ed25: 0x6d3c6420, 0x1ed26: 0x6c6c9a20, 0x1ed27: 0x6d367420, - 0x1ed28: 0x6cfab620, 0x1ed29: 0x6c732220, 0x1ed2a: 0x6c5d5820, 0x1ed2b: 0x6caddc20, - 0x1ed2c: 0x6cdfee20, 0x1ed2d: 0x6c2fae20, 0x1ed2e: 0x6c66a220, 0x1ed2f: 0x6c725c20, - 0x1ed30: 0x6c9bdc20, 0x1ed31: 0x6d3e6620, 0x1ed32: 0x6cbcdc20, 0x1ed33: 0x6d1bc820, - 0x1ed34: 0x6c766a20, 0x1ed35: 0x6cbad420, 0x1ed36: 0x6cd80a20, 0x1ed37: 0x6c367820, - 0x1ed38: 0x6c13ac20, 0x1ed39: 0x6cbb9420, 0x1ed3a: 0x6d37c420, 0x1ed3b: 0x6c32d620, - 0x1ed3c: 0x6cd9d220, 0x1ed3d: 0x6c59e820, 0x1ed3e: 0x6c588c20, 0x1ed3f: 0x6c003220, - // Block 0x7b5, offset 0x1ed40 - 0x1ed40: 0x6c327020, 0x1ed41: 0x6c9a6420, 0x1ed42: 0x6c911420, 0x1ed43: 0x6d3e7420, - 0x1ed44: 0x6c3ac020, 0x1ed45: 0x6c9a1c20, 0x1ed46: 0x6ca15820, 0x1ed47: 0x6d325c20, - 0x1ed48: 0x6c0f5020, 0x1ed49: 0x6c442a20, 0x1ed4a: 0x6ca86620, 0x1ed4b: 0x6ce18220, - 0x1ed4c: 0x6c730220, 0x1ed4d: 0x6ca86820, 0x1ed4e: 0x6ca2e820, 0x1ed4f: 0x6c8e8e20, - 0x1ed50: 0x6c431e20, 0x1ed51: 0x6c058a20, 0x1ed52: 0x6d186c20, 0x1ed53: 0x6c638020, - 0x1ed54: 0x6c0d4e20, 0x1ed55: 0x6cc6ac20, 0x1ed56: 0x6c0c2420, 0x1ed57: 0x6ce0d620, - 0x1ed58: 0x6c980620, 0x1ed59: 0x6c955420, 0x1ed5a: 0x6c085420, 0x1ed5b: 0x6d1dbc20, - 0x1ed5c: 0x6c6eae20, 0x1ed5d: 0x6c2b4620, 0x1ed5e: 0x6d40dc20, 0x1ed5f: 0x6d08b420, - 0x1ed60: 0x6c8ea620, 0x1ed61: 0x6c153220, 0x1ed62: 0x6c74d020, 0x1ed63: 0x6c8aac20, - 0x1ed64: 0x6cb46420, 0x1ed65: 0x6c91e220, 0x1ed66: 0x6c336e20, 0x1ed67: 0x6c7fc820, - 0x1ed68: 0x6cb49e20, 0x1ed69: 0x6c249420, 0x1ed6a: 0x6cbae820, 0x1ed6b: 0x6c2aee20, - 0x1ed6c: 0x6c5e1e20, 0x1ed6d: 0x6c826e20, 0x1ed6e: 0x6c58b220, 0x1ed6f: 0x6d3dc420, - 0x1ed70: 0x6c887c20, 0x1ed71: 0x6d18fe20, 0x1ed72: 0x6c142420, 0x1ed73: 0x6c0c4e20, - 0x1ed74: 0x6c7eba20, 0x1ed75: 0x6c157020, 0x1ed76: 0x6cfda020, 0x1ed77: 0x6d2f0020, - 0x1ed78: 0x6c169c20, 0x1ed79: 0x6c6fbc20, 0x1ed7a: 0x6c02a420, 0x1ed7b: 0x6c2eb820, - 0x1ed7c: 0x6cc13c20, 0x1ed7d: 0x6c8a8420, 0x1ed7e: 0x6c9caa20, 0x1ed7f: 0x6d2efa20, - // Block 0x7b6, offset 0x1ed80 - 0x1ed80: 0x6c9ac620, 0x1ed81: 0x6c96b620, 0x1ed82: 0x6cd68220, 0x1ed83: 0x6ccd3c20, - 0x1ed84: 0x6c5db420, 0x1ed85: 0x6c9ac820, 0x1ed86: 0x6d0c8e20, 0x1ed87: 0x6c098e20, - 0x1ed88: 0x6c4eba20, 0x1ed89: 0x6c099020, 0x1ed8a: 0x6ccdfa20, 0x1ed8b: 0x6c763420, - 0x1ed8c: 0x6c778a20, 0x1ed8d: 0x6c07f220, 0x1ed8e: 0x6c535c20, 0x1ed8f: 0x6cc8fe20, - 0x1ed90: 0x6cca5820, 0x1ed91: 0x6cfb6420, 0x1ed92: 0x6cfb6620, 0x1ed93: 0x6c64ac20, - 0x1ed94: 0x6c9fb420, 0x1ed95: 0x6cf96820, 0x1ed96: 0x6cd74020, 0x1ed97: 0x6c312020, - 0x1ed98: 0x6d2c3c20, 0x1ed99: 0x6ca53420, 0x1ed9a: 0x6d2d8820, 0x1ed9b: 0x6cae7820, - 0x1ed9c: 0x6cfa2220, 0x1ed9d: 0x6c8d2820, 0x1ed9e: 0x6c0bae20, 0x1ed9f: 0x6c09e820, - 0x1eda0: 0x6cc90020, 0x1eda1: 0x6c00be20, 0x1eda2: 0x6c492020, 0x1eda3: 0x6c441620, - 0x1eda4: 0x6c441820, 0x1eda5: 0x6c382220, 0x1eda6: 0x6c1f6620, 0x1eda7: 0x6c53c820, - 0x1eda8: 0x6c4a7e20, 0x1eda9: 0x6c9fbe20, 0x1edaa: 0x6ccb1220, 0x1edab: 0x6c7dc020, - 0x1edac: 0x6c812c20, 0x1edad: 0x6c935a20, 0x1edae: 0x6ce68820, 0x1edaf: 0x6ccc7620, - 0x1edb0: 0x6c714820, 0x1edb1: 0x6d26e420, 0x1edb2: 0x6d26e620, 0x1edb3: 0x6c15e020, - 0x1edb4: 0x6cc27620, 0x1edb5: 0x6c8c6a20, 0x1edb6: 0x6c167e20, 0x1edb7: 0x6ccca420, - 0x1edb8: 0x6c7dc220, 0x1edb9: 0x6d0c3020, 0x1edba: 0x6cf1b220, 0x1edbb: 0x6d0cd420, - 0x1edbc: 0x6c36b020, 0x1edbd: 0x6c5cda20, 0x1edbe: 0x6d23fc20, 0x1edbf: 0x6cf1b420, - // Block 0x7b7, offset 0x1edc0 - 0x1edc0: 0x6cfe6020, 0x1edc1: 0x6c05be20, 0x1edc2: 0x6c53d620, 0x1edc3: 0x6cc28020, - 0x1edc4: 0x6d11dc20, 0x1edc5: 0x6cf1ba20, 0x1edc6: 0x6c04d820, 0x1edc7: 0x6c01d220, - 0x1edc8: 0x6cef4620, 0x1edc9: 0x6d1a1020, 0x1edca: 0x6c7e2020, 0x1edcb: 0x6cc40a20, - 0x1edcc: 0x6c7fca20, 0x1edcd: 0x6c317c20, 0x1edce: 0x6cc38620, 0x1edcf: 0x6c3c6e20, - 0x1edd0: 0x6ce4cc20, 0x1edd1: 0x6ca88c20, 0x1edd2: 0x6cdec420, 0x1edd3: 0x6c767620, - 0x1edd4: 0x6c518a20, 0x1edd5: 0x6cc40e20, 0x1edd6: 0x6c209c20, 0x1edd7: 0x6c493020, - 0x1edd8: 0x6c314620, 0x1edd9: 0x6cb72420, 0x1edda: 0x6c7c4e20, 0x1eddb: 0x6ce15c20, - 0x1eddc: 0x6c493420, 0x1eddd: 0x6cb18a20, 0x1edde: 0x6c771820, 0x1eddf: 0x6cf92420, - 0x1ede0: 0x6c5c8e20, 0x1ede1: 0x6c160e20, 0x1ede2: 0x6cb0dc20, 0x1ede3: 0x6c29a420, - 0x1ede4: 0x6c58c420, 0x1ede5: 0x6cdeda20, 0x1ede6: 0x6cf1c220, 0x1ede7: 0x6cde0220, - 0x1ede8: 0x6c9abe20, 0x1ede9: 0x6cd67e20, 0x1edea: 0x6ccd2820, 0x1edeb: 0x6d0e3820, - 0x1edec: 0x6c4e8820, 0x1eded: 0x6c090e20, 0x1edee: 0x6cf1f820, 0x1edef: 0x6c208c20, - 0x1edf0: 0x6cc8f820, 0x1edf1: 0x6ceee620, 0x1edf2: 0x6cfb2820, 0x1edf3: 0x6c52fe20, - 0x1edf4: 0x6c646620, 0x1edf5: 0x6c9f9220, 0x1edf6: 0x6c772620, 0x1edf7: 0x6c9aea20, - 0x1edf8: 0x6d2c2420, 0x1edf9: 0x6ca52a20, 0x1edfa: 0x6c4a4220, 0x1edfb: 0x6cf18820, - 0x1edfc: 0x6cde3e20, 0x1edfd: 0x6c9fa020, 0x1edfe: 0x6c935420, 0x1edff: 0x6c764e20, - // Block 0x7b8, offset 0x1ee00 - 0x1ee00: 0x6c380a20, 0x1ee01: 0x6c43ce20, 0x1ee02: 0x6c50e620, 0x1ee03: 0x6c7da420, - 0x1ee04: 0x6c6f6820, 0x1ee05: 0x6d26a220, 0x1ee06: 0x6c80b020, 0x1ee07: 0x6c316c20, - 0x1ee08: 0x6d232820, 0x1ee09: 0x6d0c0420, 0x1ee0a: 0x6c166c20, 0x1ee0b: 0x6cf88020, - 0x1ee0c: 0x6cf19420, 0x1ee0d: 0x6c5cc620, 0x1ee0e: 0x6d0c9020, 0x1ee0f: 0x6c362020, - 0x1ee10: 0x6c15b420, 0x1ee11: 0x6c7fa020, 0x1ee12: 0x6cc27020, 0x1ee13: 0x6c5bce20, - 0x1ee14: 0x6c7e0220, 0x1ee15: 0x6cc3c620, 0x1ee16: 0x6c515020, 0x1ee17: 0x6ce4b220, - 0x1ee18: 0x6c26b220, 0x1ee19: 0x6cc39020, 0x1ee1a: 0x6c4e5e20, 0x1ee1b: 0x6c58a220, - 0x1ee1c: 0x6c3fba20, 0x1ee1d: 0x6c3f9e20, 0x1ee1e: 0x6c820620, 0x1ee1f: 0x6c332a20, - 0x1ee20: 0x6d031020, 0x1ee21: 0x6cb89020, 0x1ee22: 0x6cf49a20, 0x1ee23: 0x6c412620, - 0x1ee24: 0x6d356a20, 0x1ee25: 0x6d19a020, 0x1ee26: 0x6d0f7820, 0x1ee27: 0x6c30d620, - 0x1ee28: 0x6c35ce20, 0x1ee29: 0x6cd0d620, 0x1ee2a: 0x6c04b220, 0x1ee2b: 0x6cadc620, - 0x1ee2c: 0x6c792220, 0x1ee2d: 0x6d27d420, 0x1ee2e: 0x6cc84c20, 0x1ee2f: 0x6d34da20, - 0x1ee30: 0x6cafac20, 0x1ee31: 0x6c6e0420, 0x1ee32: 0x6c39a020, 0x1ee33: 0x6d0f7a20, - 0x1ee34: 0x6d19a220, 0x1ee35: 0x6d321020, 0x1ee36: 0x6c69f420, 0x1ee37: 0x6c195020, - 0x1ee38: 0x6c35d620, 0x1ee39: 0x6cc0d620, 0x1ee3a: 0x6c2bd220, 0x1ee3b: 0x6d410a20, - 0x1ee3c: 0x6d427820, 0x1ee3d: 0x6c2d3820, 0x1ee3e: 0x6c8e0820, 0x1ee3f: 0x6c000220, - // Block 0x7b9, offset 0x1ee40 - 0x1ee40: 0x6ceae620, 0x1ee41: 0x6ceae820, 0x1ee42: 0x6c068c20, 0x1ee43: 0x6c0dc020, - 0x1ee44: 0x6c3fae20, 0x1ee45: 0x6c618e20, 0x1ee46: 0x6c921420, 0x1ee47: 0x6c902c20, - 0x1ee48: 0x6c18a220, 0x1ee49: 0x6d03c220, 0x1ee4a: 0x6c34ce20, 0x1ee4b: 0x6c910220, - 0x1ee4c: 0x6ca0da20, 0x1ee4d: 0x6c67d620, 0x1ee4e: 0x6cd4ae20, 0x1ee4f: 0x6c34d020, - 0x1ee50: 0x6cfc8620, 0x1ee51: 0x6c373820, 0x1ee52: 0x6c4acc20, 0x1ee53: 0x6d207c20, - 0x1ee54: 0x6c40e220, 0x1ee55: 0x6ccd2e20, 0x1ee56: 0x6c759e20, 0x1ee57: 0x6cbc3420, - 0x1ee58: 0x6d03d820, 0x1ee59: 0x6c213620, 0x1ee5a: 0x6c3fd820, 0x1ee5b: 0x6c095820, - 0x1ee5c: 0x6cf99e20, 0x1ee5d: 0x6ccd3820, 0x1ee5e: 0x6cd0f620, 0x1ee5f: 0x6d35aa20, - 0x1ee60: 0x6cb40420, 0x1ee61: 0x6c30e420, 0x1ee62: 0x6d260620, 0x1ee63: 0x6d322820, - 0x1ee64: 0x6c1e7620, 0x1ee65: 0x6cfc9820, 0x1ee66: 0x6c2a5620, 0x1ee67: 0x6ca7fe20, - 0x1ee68: 0x6d27e020, 0x1ee69: 0x6cfbf020, 0x1ee6a: 0x6cadce20, 0x1ee6b: 0x6c3aa020, - 0x1ee6c: 0x6d404e20, 0x1ee6d: 0x6d174c20, 0x1ee6e: 0x6c334820, 0x1ee6f: 0x6c94e620, - 0x1ee70: 0x6d19c420, 0x1ee71: 0x6c707820, 0x1ee72: 0x6c20c620, 0x1ee73: 0x6c18ba20, - 0x1ee74: 0x6cafd620, 0x1ee75: 0x6c8cd820, 0x1ee76: 0x6ce21420, 0x1ee77: 0x6cfcae20, - 0x1ee78: 0x6c923020, 0x1ee79: 0x6cd0fc20, 0x1ee7a: 0x6cfc0a20, 0x1ee7b: 0x6d19d420, - 0x1ee7c: 0x6d3a6220, 0x1ee7d: 0x6d0fb020, 0x1ee7e: 0x6cc62c20, 0x1ee7f: 0x6cf9bc20, - // Block 0x7ba, offset 0x1ee80 - 0x1ee80: 0x6c1d1420, 0x1ee81: 0x6d0e6820, 0x1ee82: 0x6d19d620, 0x1ee83: 0x6cd5ce20, - 0x1ee84: 0x6c2b2c20, 0x1ee85: 0x6d210c20, 0x1ee86: 0x6c8f9220, 0x1ee87: 0x6cee7820, - 0x1ee88: 0x6cee7a20, 0x1ee89: 0x6ca82420, 0x1ee8a: 0x6c334a20, 0x1ee8b: 0x6cdbf220, - 0x1ee8c: 0x6c018420, 0x1ee8d: 0x6c59b620, 0x1ee8e: 0x6c6a0620, 0x1ee8f: 0x6cdbf420, - 0x1ee90: 0x6d1ae220, 0x1ee91: 0x6c413c20, 0x1ee92: 0x6d0d9a20, 0x1ee93: 0x6c5abe20, - 0x1ee94: 0x6c43fc20, 0x1ee95: 0x6d27ee20, 0x1ee96: 0x6cf4f220, 0x1ee97: 0x6c7c6c20, - 0x1ee98: 0x6c009e20, 0x1ee99: 0x6cf89820, 0x1ee9a: 0x6ce10c20, 0x1ee9b: 0x6c623020, - 0x1ee9c: 0x6d2f3620, 0x1ee9d: 0x6c29de20, 0x1ee9e: 0x6c024820, 0x1ee9f: 0x6cf8aa20, - 0x1eea0: 0x6d1aee20, 0x1eea1: 0x6cc9be20, 0x1eea2: 0x6cc53a20, 0x1eea3: 0x6c8bca20, - 0x1eea4: 0x6ce9b220, 0x1eea5: 0x6c2ade20, 0x1eea6: 0x6c693820, 0x1eea7: 0x6cdc5820, - 0x1eea8: 0x6cdbfa20, 0x1eea9: 0x6c02e220, 0x1eeaa: 0x6cfc2620, 0x1eeab: 0x6c3b8220, - 0x1eeac: 0x6ca64c20, 0x1eead: 0x6c376820, 0x1eeae: 0x6c5f4a20, 0x1eeaf: 0x6c29ec20, - 0x1eeb0: 0x6cf7a620, 0x1eeb1: 0x6d1b0a20, 0x1eeb2: 0x6c358220, 0x1eeb3: 0x6c5af420, - 0x1eeb4: 0x6c903c20, 0x1eeb5: 0x6cf72220, 0x1eeb6: 0x6c859820, 0x1eeb7: 0x6c868820, - 0x1eeb8: 0x6c86b420, 0x1eeb9: 0x6d3c5620, 0x1eeba: 0x6c553a20, 0x1eebb: 0x6d33d220, - 0x1eebc: 0x6cdcea20, 0x1eebd: 0x6c735220, 0x1eebe: 0x6ca3f620, 0x1eebf: 0x6d178820, - // Block 0x7bb, offset 0x1eec0 - 0x1eec0: 0x6cc3ba20, 0x1eec1: 0x6d0e7e20, 0x1eec2: 0x6cbd7a20, 0x1eec3: 0x6cb8e820, - 0x1eec4: 0x6d047c20, 0x1eec5: 0x6d0b5420, 0x1eec6: 0x6c604620, 0x1eec7: 0x6c481820, - 0x1eec8: 0x6c587a20, 0x1eec9: 0x6d367620, 0x1eeca: 0x6c46c020, 0x1eecb: 0x6c736e20, - 0x1eecc: 0x6c225620, 0x1eecd: 0x6d1d9420, 0x1eece: 0x6c70b020, 0x1eecf: 0x6c1e9820, - 0x1eed0: 0x6c54f020, 0x1eed1: 0x6d28c420, 0x1eed2: 0x6c961c20, 0x1eed3: 0x6d219620, - 0x1eed4: 0x6c1dde20, 0x1eed5: 0x6c2de020, 0x1eed6: 0x6cdbe020, 0x1eed7: 0x6c4f2820, - 0x1eed8: 0x6cf32220, 0x1eed9: 0x6cd6a620, 0x1eeda: 0x6c49ae20, 0x1eedb: 0x6c1ec220, - 0x1eedc: 0x6d28d220, 0x1eedd: 0x6d1dcc20, 0x1eede: 0x6c5f7c20, 0x1eedf: 0x6cf70c20, - 0x1eee0: 0x6c1dfe20, 0x1eee1: 0x6c8f5220, 0x1eee2: 0x6c847e20, 0x1eee3: 0x6ca41420, - 0x1eee4: 0x6d092c20, 0x1eee5: 0x6d28e420, 0x1eee6: 0x6c610820, 0x1eee7: 0x6c610a20, - 0x1eee8: 0x6d222220, 0x1eee9: 0x6d211020, 0x1eeea: 0x6d093020, 0x1eeeb: 0x6ca2f820, - 0x1eeec: 0x6c3d2e20, 0x1eeed: 0x6ccb2820, 0x1eeee: 0x6ca28e20, 0x1eeef: 0x6cf19820, - 0x1eef0: 0x6c3b3620, 0x1eef1: 0x6cacda20, 0x1eef2: 0x6d27aa20, 0x1eef3: 0x6c862220, - 0x1eef4: 0x6c1c3a20, 0x1eef5: 0x6d0f6020, 0x1eef6: 0x6c8d2a20, 0x1eef7: 0x6c823e20, - 0x1eef8: 0x6c016e20, 0x1eef9: 0x6c05ce20, 0x1eefa: 0x6cf50420, 0x1eefb: 0x6c2d6a20, - 0x1eefc: 0x6c297420, 0x1eefd: 0x6c56ac20, 0x1eefe: 0x6cf50620, 0x1eeff: 0x6c2e3420, - // Block 0x7bc, offset 0x1ef00 - 0x1ef00: 0x6d05c220, 0x1ef01: 0x6c625820, 0x1ef02: 0x6ca2a820, 0x1ef03: 0x6c18e820, - 0x1ef04: 0x6cff1020, 0x1ef05: 0x6d2cde20, 0x1ef06: 0x6ce68a20, 0x1ef07: 0x6d325e20, - 0x1ef08: 0x6cae2820, 0x1ef09: 0x6c9a2420, 0x1ef0a: 0x6c8d4c20, 0x1ef0b: 0x6cb53420, - 0x1ef0c: 0x6d38b020, 0x1ef0d: 0x6c5e0220, 0x1ef0e: 0x6ccc7c20, 0x1ef0f: 0x6c3a1a20, - 0x1ef10: 0x6c538a20, 0x1ef11: 0x6d2da020, 0x1ef12: 0x6d1a0820, 0x1ef13: 0x6ca60820, - 0x1ef14: 0x6d3b2e20, 0x1ef15: 0x6cea6e20, 0x1ef16: 0x6c8be420, 0x1ef17: 0x6c8e3020, - 0x1ef18: 0x6c308e20, 0x1ef19: 0x6d1bf620, 0x1ef1a: 0x6cf53220, 0x1ef1b: 0x6c8d7420, - 0x1ef1c: 0x6cd6a420, 0x1ef1d: 0x6c8d7620, 0x1ef1e: 0x6cfa0620, 0x1ef1f: 0x6c539020, - 0x1ef20: 0x6d1a1220, 0x1ef21: 0x6c974420, 0x1ef22: 0x6c974620, 0x1ef23: 0x6d280620, - 0x1ef24: 0x6c8f4c20, 0x1ef25: 0x6c9c1620, 0x1ef26: 0x6c0d6a20, 0x1ef27: 0x6cf54020, - 0x1ef28: 0x6cf10020, 0x1ef29: 0x6c7e2a20, 0x1ef2a: 0x6d1aac20, 0x1ef2b: 0x6cf7b220, - 0x1ef2c: 0x6d191e20, 0x1ef2d: 0x6c008020, 0x1ef2e: 0x6c28e420, 0x1ef2f: 0x6ce2e420, - 0x1ef30: 0x6cca4020, 0x1ef31: 0x6d246c20, 0x1ef32: 0x6c933620, 0x1ef33: 0x6c8fd020, - 0x1ef34: 0x6c27a820, 0x1ef35: 0x6c60f420, 0x1ef36: 0x6cacec20, 0x1ef37: 0x6d0ff420, - 0x1ef38: 0x6c03d620, 0x1ef39: 0x6cafa420, 0x1ef3a: 0x6cef7020, 0x1ef3b: 0x6c3c8420, - 0x1ef3c: 0x6cf93420, 0x1ef3d: 0x6c62e420, 0x1ef3e: 0x6c970e20, 0x1ef3f: 0x6c9bac20, - // Block 0x7bd, offset 0x1ef40 - 0x1ef40: 0x6c9bae20, 0x1ef41: 0x6c829a20, 0x1ef42: 0x6c87ae20, 0x1ef43: 0x6c5e5820, - 0x1ef44: 0x6c008220, 0x1ef45: 0x6c3b0220, 0x1ef46: 0x6c27ae20, 0x1ef47: 0x6c901220, - 0x1ef48: 0x6c8db620, 0x1ef49: 0x6c010e20, 0x1ef4a: 0x6c3c8e20, 0x1ef4b: 0x6c87c820, - 0x1ef4c: 0x6c062620, 0x1ef4d: 0x6c521820, 0x1ef4e: 0x6c521020, 0x1ef4f: 0x6c521420, - 0x1ef50: 0x6c0e3e20, 0x1ef51: 0x6cbe3020, 0x1ef52: 0x6cbe3220, 0x1ef53: 0x6c6e8a20, - 0x1ef54: 0x6ce46c20, 0x1ef55: 0x6d317820, 0x1ef56: 0x6c6e9220, 0x1ef57: 0x6c198420, - 0x1ef58: 0x6cbed420, 0x1ef59: 0x6c6e9c20, 0x1ef5a: 0x6c6ea620, 0x1ef5b: 0x6c2d8620, - 0x1ef5c: 0x6c6eb020, 0x1ef5d: 0x6ce47a20, 0x1ef5e: 0x6c39f220, 0x1ef5f: 0x6c3a0a20, - 0x1ef60: 0x6c77c820, 0x1ef61: 0x6c9c9220, 0x1ef62: 0x6c9e5620, 0x1ef63: 0x6c9e5020, - 0x1ef64: 0x6c065a20, 0x1ef65: 0x6d133420, 0x1ef66: 0x6ce52020, 0x1ef67: 0x6c5c9820, - 0x1ef68: 0x6d139c20, 0x1ef69: 0x6c43d020, 0x1ef6a: 0x6c2f5e20, 0x1ef6b: 0x6c13ea20, - 0x1ef6c: 0x6cb9a020, 0x1ef6d: 0x6cc5f820, 0x1ef6e: 0x6c2b7020, 0x1ef6f: 0x6c326020, - 0x1ef70: 0x6cf4f420, 0x1ef71: 0x6cc5fa20, 0x1ef72: 0x6cbd8820, 0x1ef73: 0x6c6d2020, - 0x1ef74: 0x6d08e420, 0x1ef75: 0x6ca99e20, 0x1ef76: 0x6c03a220, 0x1ef77: 0x6d1af020, - 0x1ef78: 0x6cc95020, 0x1ef79: 0x6ca35e20, 0x1ef7a: 0x6ca14420, 0x1ef7b: 0x6d412220, - 0x1ef7c: 0x6c26b620, 0x1ef7d: 0x6c050020, 0x1ef7e: 0x6d183e20, 0x1ef7f: 0x6d121a20, - // Block 0x7be, offset 0x1ef80 - 0x1ef80: 0x6ce23420, 0x1ef81: 0x6c074c20, 0x1ef82: 0x6c63d820, 0x1ef83: 0x6c537a20, - 0x1ef84: 0x6cad6220, 0x1ef85: 0x6d0f6420, 0x1ef86: 0x6c0e4220, 0x1ef87: 0x6d1a0020, - 0x1ef88: 0x6c442c20, 0x1ef89: 0x6ce23c20, 0x1ef8a: 0x6c6b2e20, 0x1ef8b: 0x6d00e420, - 0x1ef8c: 0x6c014820, 0x1ef8d: 0x6c014a20, 0x1ef8e: 0x6c523620, 0x1ef8f: 0x6c45fc20, - 0x1ef90: 0x6cb88a20, 0x1ef91: 0x6c26c220, 0x1ef92: 0x6cbbf420, 0x1ef93: 0x6ce64a20, - 0x1ef94: 0x6c978620, 0x1ef95: 0x6d1d4e20, 0x1ef96: 0x6cdbde20, 0x1ef97: 0x6ce5a020, - 0x1ef98: 0x6cbc6220, 0x1ef99: 0x6d08b820, 0x1ef9a: 0x6c79ac20, 0x1ef9b: 0x6c083420, - 0x1ef9c: 0x6cdeb420, 0x1ef9d: 0x6cce5820, 0x1ef9e: 0x6c0dfa20, 0x1ef9f: 0x6c7e2220, - 0x1efa0: 0x6c70d420, 0x1efa1: 0x6c7eda20, 0x1efa2: 0x6d024a20, 0x1efa3: 0x6cc76820, - 0x1efa4: 0x6c054420, 0x1efa5: 0x6c372c20, 0x1efa6: 0x6cbfd620, 0x1efa7: 0x6cbfd820, - 0x1efa8: 0x6c518c20, 0x1efa9: 0x6d001620, 0x1efaa: 0x6ca2ba20, 0x1efab: 0x6c70da20, - 0x1efac: 0x6c650a20, 0x1efad: 0x6c0b1620, 0x1efae: 0x6c2b4c20, 0x1efaf: 0x6c651c20, - 0x1efb0: 0x6cf16e20, 0x1efb1: 0x6ce1fa20, 0x1efb2: 0x6c466620, 0x1efb3: 0x6cdec620, - 0x1efb4: 0x6c076c20, 0x1efb5: 0x6d011c20, 0x1efb6: 0x6cac8820, 0x1efb7: 0x6c445420, - 0x1efb8: 0x6c0ab020, 0x1efb9: 0x6c7e2e20, 0x1efba: 0x6ce0e020, 0x1efbb: 0x6c90d420, - 0x1efbc: 0x6c4ba420, 0x1efbd: 0x6cbc1220, 0x1efbe: 0x6d08ee20, 0x1efbf: 0x6c5f9820, - // Block 0x7bf, offset 0x1efc0 - 0x1efc0: 0x6c654820, 0x1efc1: 0x6c679820, 0x1efc2: 0x6c164c20, 0x1efc3: 0x6c26d820, - 0x1efc4: 0x6c56e820, 0x1efc5: 0x6cfc6420, 0x1efc6: 0x6cb96020, 0x1efc7: 0x6c320420, - 0x1efc8: 0x6cec4420, 0x1efc9: 0x6c655a20, 0x1efca: 0x6c801e20, 0x1efcb: 0x6ceeee20, - 0x1efcc: 0x6cc5fc20, 0x1efcd: 0x6c3ecc20, 0x1efce: 0x6c9aa220, 0x1efcf: 0x6cc37820, - 0x1efd0: 0x6c442e20, 0x1efd1: 0x6cf01020, 0x1efd2: 0x6cbc6420, 0x1efd3: 0x6c4e3e20, - 0x1efd4: 0x6c172820, 0x1efd5: 0x6c7e3420, 0x1efd6: 0x6cc77c20, 0x1efd7: 0x6d286620, - 0x1efd8: 0x6ccf8020, 0x1efd9: 0x6cf04620, 0x1efda: 0x6c444e20, 0x1efdb: 0x6c046220, - 0x1efdc: 0x6ce1fc20, 0x1efdd: 0x6c466820, 0x1efde: 0x6d286c20, 0x1efdf: 0x6c435e20, - 0x1efe0: 0x6c0ab220, 0x1efe1: 0x6cf05220, 0x1efe2: 0x6cdcc220, 0x1efe3: 0x6c31fa20, - 0x1efe4: 0x6cec4620, 0x1efe5: 0x6c320620, 0x1efe6: 0x6ceed820, 0x1efe7: 0x6cc5cc20, - 0x1efe8: 0x6c3e2820, 0x1efe9: 0x6c4e1a20, 0x1efea: 0x6cefea20, 0x1efeb: 0x6d283e20, - 0x1efec: 0x6ce1e020, 0x1efed: 0x6c6fb420, 0x1efee: 0x6c6fc420, 0x1efef: 0x6cfad220, - 0x1eff0: 0x6d022820, 0x1eff1: 0x6cfae220, 0x1eff2: 0x6c5f8820, 0x1eff3: 0x6d19ba20, - 0x1eff4: 0x6d28c220, 0x1eff5: 0x6d284020, 0x1eff6: 0x6ccea820, 0x1eff7: 0x6c822420, - 0x1eff8: 0x6caecc20, 0x1eff9: 0x6c5a2020, 0x1effa: 0x6d1c0420, 0x1effb: 0x6d287220, - 0x1effc: 0x6caef020, 0x1effd: 0x6c016020, 0x1effe: 0x6d1a1820, 0x1efff: 0x6cfe0a20, - // Block 0x7c0, offset 0x1f000 - 0x1f000: 0x6c56ea20, 0x1f001: 0x6d12dc20, 0x1f002: 0x6c2f6e20, 0x1f003: 0x6cbea820, - 0x1f004: 0x6c7c7020, 0x1f005: 0x6cfe3a20, 0x1f006: 0x6cd75420, 0x1f007: 0x6c4daa20, - 0x1f008: 0x6d05ae20, 0x1f009: 0x6d152a20, 0x1f00a: 0x6d05b620, 0x1f00b: 0x6c35b420, - 0x1f00c: 0x6cd99020, 0x1f00d: 0x6c7cd820, 0x1f00e: 0x6cb60c20, 0x1f00f: 0x6c4f8220, - 0x1f010: 0x6d238620, 0x1f011: 0x6cece020, 0x1f012: 0x6c048c20, 0x1f013: 0x6c33fe20, - 0x1f014: 0x6c2b8620, 0x1f015: 0x6c27f220, 0x1f016: 0x6cacbe20, 0x1f017: 0x6cb31820, - 0x1f018: 0x6c8e1220, 0x1f019: 0x6c182e20, 0x1f01a: 0x6c6e2620, 0x1f01b: 0x6c834020, - 0x1f01c: 0x6c516a20, 0x1f01d: 0x6cbb9e20, 0x1f01e: 0x6c36a020, 0x1f01f: 0x6c357c20, - 0x1f020: 0x6cf01220, 0x1f021: 0x6d00e620, 0x1f022: 0x6c7e1020, 0x1f023: 0x6cd07020, - 0x1f024: 0x6d156620, 0x1f025: 0x6cd07a20, 0x1f026: 0x6c4d2420, 0x1f027: 0x6c332820, - 0x1f028: 0x6d228420, 0x1f029: 0x6cb26620, 0x1f02a: 0x6c834220, 0x1f02b: 0x6c3f8420, - 0x1f02c: 0x6c63e020, 0x1f02d: 0x6ce7f820, 0x1f02e: 0x6c5c4a20, 0x1f02f: 0x6c7ca020, - 0x1f030: 0x6c63ec20, 0x1f031: 0x6c953220, 0x1f032: 0x6ce6e220, 0x1f033: 0x6c199820, - 0x1f034: 0x6d1d1020, 0x1f035: 0x6d276a20, 0x1f036: 0x6c55c620, 0x1f037: 0x6c4f1020, - 0x1f038: 0x6c6e3620, 0x1f039: 0x6ce9be20, 0x1f03a: 0x6ce9c020, 0x1f03b: 0x6cb21420, - 0x1f03c: 0x6c7f5a20, 0x1f03d: 0x6ce9c220, 0x1f03e: 0x6d3eb420, 0x1f03f: 0x6d3eb220, - // Block 0x7c1, offset 0x1f040 - 0x1f040: 0x6c20e620, 0x1f041: 0x6c2fc020, 0x1f042: 0x6c7f5c20, 0x1f043: 0x6ce02020, - 0x1f044: 0x6c4f2220, 0x1f045: 0x6cb93220, 0x1f046: 0x6c783820, 0x1f047: 0x6c257220, - 0x1f048: 0x6d085e20, 0x1f049: 0x6cbd4420, 0x1f04a: 0x6d157820, 0x1f04b: 0x6cc9d420, - 0x1f04c: 0x6ce39e20, 0x1f04d: 0x6c358a20, 0x1f04e: 0x6c36ca20, 0x1f04f: 0x6d0ce220, - 0x1f050: 0x6cf21420, 0x1f051: 0x6c76f820, 0x1f052: 0x6d1e0220, 0x1f053: 0x6d3b9820, - 0x1f054: 0x6d0ce420, 0x1f055: 0x6cfc3c20, 0x1f056: 0x6d035220, 0x1f057: 0x6d162620, - 0x1f058: 0x6d263820, 0x1f059: 0x6cca9620, 0x1f05a: 0x6c2ce620, 0x1f05b: 0x6c2ce820, - 0x1f05c: 0x6c67ca20, 0x1f05d: 0x6c7c4a20, 0x1f05e: 0x6c835420, 0x1f05f: 0x6c819220, - 0x1f060: 0x6cb1a820, 0x1f061: 0x6cec7820, 0x1f062: 0x6c979a20, 0x1f063: 0x6c247c20, - 0x1f064: 0x6d117820, 0x1f065: 0x6c507e20, 0x1f066: 0x6cbc1420, 0x1f067: 0x6c482e20, - 0x1f068: 0x6d0ab620, 0x1f069: 0x6d0e1a20, 0x1f06a: 0x6c5c9e20, 0x1f06b: 0x6c164e20, - 0x1f06c: 0x6cc7ee20, 0x1f06d: 0x6c9bb620, 0x1f06e: 0x6c0d7420, 0x1f06f: 0x6cfc6620, - 0x1f070: 0x6cb23220, 0x1f071: 0x6c91a620, 0x1f072: 0x6c806620, 0x1f073: 0x6ca8d620, - 0x1f074: 0x6cc34620, 0x1f075: 0x6d12be20, 0x1f076: 0x6c2f6a20, 0x1f077: 0x6cbe9e20, - 0x1f078: 0x6c4d9620, 0x1f079: 0x6cfe2420, 0x1f07a: 0x6cd74a20, 0x1f07b: 0x6d057e20, - 0x1f07c: 0x6d058820, 0x1f07d: 0x6cecd220, 0x1f07e: 0x6c480620, 0x1f07f: 0x6c33ec20, - // Block 0x7c2, offset 0x1f080 - 0x1f080: 0x6cb5b420, 0x1f081: 0x6c047c20, 0x1f082: 0x6cd98820, 0x1f083: 0x6c4f7220, - 0x1f084: 0x6d22fc20, 0x1f085: 0x6c915420, 0x1f086: 0x6c8e1020, 0x1f087: 0x6cb30c20, - 0x1f088: 0x6c6e1e20, 0x1f089: 0x6c6ada20, 0x1f08a: 0x6c63c820, 0x1f08b: 0x6ce6d420, - 0x1f08c: 0x6c513220, 0x1f08d: 0x6d1cf420, 0x1f08e: 0x6c6f1420, 0x1f08f: 0x6c780220, - 0x1f090: 0x6d152c20, 0x1f091: 0x6cb21220, 0x1f092: 0x6c5bee20, 0x1f093: 0x6ce9a820, - 0x1f094: 0x6c4ed620, 0x1f095: 0x6d1cf820, 0x1f096: 0x6d1cfa20, 0x1f097: 0x6c781e20, - 0x1f098: 0x6ce37420, 0x1f099: 0x6d1dfe20, 0x1f09a: 0x6c36a220, 0x1f09b: 0x6d3b9020, - 0x1f09c: 0x6d0ccc20, 0x1f09d: 0x6c357e20, 0x1f09e: 0x6ca87820, 0x1f09f: 0x6c975a20, - 0x1f0a0: 0x6c2cdc20, 0x1f0a1: 0x6cca8c20, 0x1f0a2: 0x6c507820, 0x1f0a3: 0x6c835020, - 0x1f0a4: 0x6c163c20, 0x1f0a5: 0x6cc7e620, 0x1f0a6: 0x6cb22620, 0x1f0a7: 0x6cc33e20, - 0x1f0a8: 0x6c3c2c20, 0x1f0a9: 0x6c0c0020, 0x1f0aa: 0x6c48be20, 0x1f0ab: 0x6c3eb820, - 0x1f0ac: 0x6cf96e20, 0x1f0ad: 0x6d2e0c20, 0x1f0ae: 0x6c0c1020, 0x1f0af: 0x6cc98020, - 0x1f0b0: 0x6c038820, 0x1f0b1: 0x6cdf3420, 0x1f0b2: 0x6c8b2a20, 0x1f0b3: 0x6c487420, - 0x1f0b4: 0x6d08ba20, 0x1f0b5: 0x6cce8820, 0x1f0b6: 0x6c72a820, 0x1f0b7: 0x6c0c3420, - 0x1f0b8: 0x6cd84020, 0x1f0b9: 0x6cf04820, 0x1f0ba: 0x6d0fec20, 0x1f0bb: 0x6d116a20, - 0x1f0bc: 0x6cd9f820, 0x1f0bd: 0x6c767820, 0x1f0be: 0x6cd9fa20, 0x1f0bf: 0x6c386c20, - // Block 0x7c3, offset 0x1f0c0 - 0x1f0c0: 0x6c8ed220, 0x1f0c1: 0x6cf7bc20, 0x1f0c2: 0x6c8f5620, 0x1f0c3: 0x6cb17020, - 0x1f0c4: 0x6cb17220, 0x1f0c5: 0x6c8ede20, 0x1f0c6: 0x6c0c5620, 0x1f0c7: 0x6c0c5820, - 0x1f0c8: 0x6c0c5a20, 0x1f0c9: 0x6c8a5620, 0x1f0ca: 0x6c0c9e20, 0x1f0cb: 0x6ccb9c20, - 0x1f0cc: 0x6c3c9020, 0x1f0cd: 0x6d051820, 0x1f0ce: 0x6c3c0e20, 0x1f0cf: 0x6d0f8220, - 0x1f0d0: 0x6d2dde20, 0x1f0d1: 0x6c0bee20, 0x1f0d2: 0x6cc97020, 0x1f0d3: 0x6c725420, - 0x1f0d4: 0x6cd7fc20, 0x1f0d5: 0x6cd9c620, 0x1f0d6: 0x6d112e20, 0x1f0d7: 0x6c8e7e20, - 0x1f0d8: 0x6cb16020, 0x1f0d9: 0x6c0c2620, 0x1f0da: 0x6c0c2820, 0x1f0db: 0x6c39f420, - 0x1f0dc: 0x6c387420, 0x1f0dd: 0x6c3a2e20, 0x1f0de: 0x6c39ee20, 0x1f0df: 0x6cd25820, - 0x1f0e0: 0x6cd24c20, 0x1f0e1: 0x6c116220, 0x1f0e2: 0x6c5eb020, 0x1f0e3: 0x6c2f9e20, - 0x1f0e4: 0x6cd8ae20, 0x1f0e5: 0x6ceac620, 0x1f0e6: 0x6d2d7220, 0x1f0e7: 0x6cdcd220, - 0x1f0e8: 0x6cfde820, 0x1f0e9: 0x6cea5a20, 0x1f0ea: 0x6cc5fe20, 0x1f0eb: 0x6d235e20, - 0x1f0ec: 0x6c737e20, 0x1f0ed: 0x6c1c2a20, 0x1f0ee: 0x6d1af220, 0x1f0ef: 0x6c395c20, - 0x1f0f0: 0x6c395e20, 0x1f0f1: 0x6cdcda20, 0x1f0f2: 0x6d1ae820, 0x1f0f3: 0x6ce81620, - 0x1f0f4: 0x6d152e20, 0x1f0f5: 0x6d42a620, 0x1f0f6: 0x6c09ec20, 0x1f0f7: 0x6c6b9c20, - 0x1f0f8: 0x6ce1e220, 0x1f0f9: 0x6c8f0e20, 0x1f0fa: 0x6c226220, 0x1f0fb: 0x6ce61420, - 0x1f0fc: 0x6cd8d420, 0x1f0fd: 0x6c060420, 0x1f0fe: 0x6cd3b020, 0x1f0ff: 0x6c350620, - // Block 0x7c4, offset 0x1f100 - 0x1f100: 0x6c4d7220, 0x1f101: 0x6cc60420, 0x1f102: 0x6ce51020, 0x1f103: 0x6c691e20, - 0x1f104: 0x6c63da20, 0x1f105: 0x6c0df020, 0x1f106: 0x6d113020, 0x1f107: 0x6ce77420, - 0x1f108: 0x6c226420, 0x1f109: 0x6cfdf820, 0x1f10a: 0x6d102a20, 0x1f10b: 0x6c738a20, - 0x1f10c: 0x6c37a220, 0x1f10d: 0x6d0eb220, 0x1f10e: 0x6c823a20, 0x1f10f: 0x6cf68c20, - 0x1f110: 0x6c117220, 0x1f111: 0x6c0e8e20, 0x1f112: 0x6ca57220, 0x1f113: 0x6c36a420, - 0x1f114: 0x6c10b620, 0x1f115: 0x6c75e620, 0x1f116: 0x6c313620, 0x1f117: 0x6cdb0e20, - 0x1f118: 0x6d219820, 0x1f119: 0x6cd3d020, 0x1f11a: 0x6d114a20, 0x1f11b: 0x6c5d0020, - 0x1f11c: 0x6c4cd220, 0x1f11d: 0x6cd3d220, 0x1f11e: 0x6c66dc20, 0x1f11f: 0x6d3cae20, - 0x1f120: 0x6c0df420, 0x1f121: 0x6cfd1620, 0x1f122: 0x6c10c020, 0x1f123: 0x6d135020, - 0x1f124: 0x6ce01620, 0x1f125: 0x6c3a1e20, 0x1f126: 0x6d2ede20, 0x1f127: 0x6cf0de20, - 0x1f128: 0x6c496820, 0x1f129: 0x6c36b220, 0x1f12a: 0x6caa9a20, 0x1f12b: 0x6d286020, - 0x1f12c: 0x6c55d620, 0x1f12d: 0x6c5a1420, 0x1f12e: 0x6ce61c20, 0x1f12f: 0x6c5c6220, - 0x1f130: 0x6c650c20, 0x1f131: 0x6c543c20, 0x1f132: 0x6c00e820, 0x1f133: 0x6ce14c20, - 0x1f134: 0x6c3b4820, 0x1f135: 0x6cf0ee20, 0x1f136: 0x6c47de20, 0x1f137: 0x6c13b820, - 0x1f138: 0x6cd99e20, 0x1f139: 0x6ce15820, 0x1f13a: 0x6c0f9820, 0x1f13b: 0x6c42e820, - 0x1f13c: 0x6cf90c20, 0x1f13d: 0x6c7d2620, 0x1f13e: 0x6c8f4e20, 0x1f13f: 0x6cd9f220, - // Block 0x7c5, offset 0x1f140 - 0x1f140: 0x6ce24a20, 0x1f141: 0x6d137c20, 0x1f142: 0x6d27cc20, 0x1f143: 0x6ca08a20, - 0x1f144: 0x6ce16020, 0x1f145: 0x6c979420, 0x1f146: 0x6c0aa020, 0x1f147: 0x6d245620, - 0x1f148: 0x6d050a20, 0x1f149: 0x6c6cc820, 0x1f14a: 0x6cca4420, 0x1f14b: 0x6c7d3c20, - 0x1f14c: 0x6d3bfc20, 0x1f14d: 0x6ccdde20, 0x1f14e: 0x6c1c9020, 0x1f14f: 0x6c28e620, - 0x1f150: 0x6d193c20, 0x1f151: 0x6c5f9020, 0x1f152: 0x6cc53220, 0x1f153: 0x6c19ac20, - 0x1f154: 0x6d1de420, 0x1f155: 0x6ce20220, 0x1f156: 0x6cf11c20, 0x1f157: 0x6cfe0e20, - 0x1f158: 0x6d2dc620, 0x1f159: 0x6c3b4a20, 0x1f15a: 0x6c4d8a20, 0x1f15b: 0x6c9bb020, - 0x1f15c: 0x6d0f1420, 0x1f15d: 0x6ca0a220, 0x1f15e: 0x6c158020, 0x1f15f: 0x6cfe1020, - 0x1f160: 0x6c959820, 0x1f161: 0x6d29cc20, 0x1f162: 0x6ca46c20, 0x1f163: 0x6cd22620, - 0x1f164: 0x6c2f9020, 0x1f165: 0x6c5e6e20, 0x1f166: 0x6cea9e20, 0x1f167: 0x6ce0e420, - 0x1f168: 0x6cea4420, 0x1f169: 0x6cf84020, 0x1f16a: 0x6cc5ce20, 0x1f16b: 0x6d22d220, - 0x1f16c: 0x6c1bea20, 0x1f16d: 0x6c392420, 0x1f16e: 0x6d1acc20, 0x1f16f: 0x6c665620, - 0x1f170: 0x6cd32620, 0x1f171: 0x6c05e820, 0x1f172: 0x6cd89420, 0x1f173: 0x6c34d220, - 0x1f174: 0x6d147e20, 0x1f175: 0x6c378c20, 0x1f176: 0x6cc52420, 0x1f177: 0x6cfdde20, - 0x1f178: 0x6c50e820, 0x1f179: 0x6c823820, 0x1f17a: 0x6c68d820, 0x1f17b: 0x6cf5b020, - 0x1f17c: 0x6c0dd420, 0x1f17d: 0x6c0e6a20, 0x1f17e: 0x6c310c20, 0x1f17f: 0x6c360420, - // Block 0x7c6, offset 0x1f180 - 0x1f180: 0x6d210020, 0x1f181: 0x6ca56a20, 0x1f182: 0x6c75a820, 0x1f183: 0x6c4cbe20, - 0x1f184: 0x6c5ce820, 0x1f185: 0x6cfcbe20, 0x1f186: 0x6c495020, 0x1f187: 0x6c13a020, - 0x1f188: 0x6c7d0220, 0x1f189: 0x6c479820, 0x1f18a: 0x6cd9ba20, 0x1f18b: 0x6c14fc20, - 0x1f18c: 0x6d130a20, 0x1f18d: 0x6ca06020, 0x1f18e: 0x6c0f2220, 0x1f18f: 0x6c8e7620, - 0x1f190: 0x6d04de20, 0x1f191: 0x6c6ca820, 0x1f192: 0x6c976e20, 0x1f193: 0x6cca2820, - 0x1f194: 0x6d3be020, 0x1f195: 0x6ca46420, 0x1f196: 0x6cd44220, 0x1f197: 0x6c7c7220, - 0x1f198: 0x6c4c9020, 0x1f199: 0x6cfd6620, 0x1f19a: 0x6c3b8020, 0x1f19b: 0x6c0f3c20, - 0x1f19c: 0x6ca64420, 0x1f19d: 0x6c0a1420, 0x1f19e: 0x6c0f6e20, 0x1f19f: 0x6ce8fa20, - 0x1f1a0: 0x6c4dbc20, 0x1f1a1: 0x6c3a2020, 0x1f1a2: 0x6c650e20, 0x1f1a3: 0x6c015420, - 0x1f1a4: 0x6c00fa20, 0x1f1a5: 0x6c408020, 0x1f1a6: 0x6cfaf620, 0x1f1a7: 0x6d276c20, - 0x1f1a8: 0x6d02f420, 0x1f1a9: 0x6c3bb020, 0x1f1aa: 0x6cb1fe20, 0x1f1ab: 0x6d02fa20, - 0x1f1ac: 0x6c969820, 0x1f1ad: 0x6d236020, 0x1f1ae: 0x6c3caa20, 0x1f1af: 0x6c4ed820, - 0x1f1b0: 0x6c2b7420, 0x1f1b1: 0x6ceb3220, 0x1f1b2: 0x6d306820, 0x1f1b3: 0x6c1b4220, - 0x1f1b4: 0x6d0a2420, 0x1f1b5: 0x6d3b1020, 0x1f1b6: 0x6d340c20, 0x1f1b7: 0x6cae2420, - 0x1f1b8: 0x6d034620, 0x1f1b9: 0x6cc64a20, 0x1f1ba: 0x6cc97a20, 0x1f1bb: 0x6d27f820, - 0x1f1bc: 0x6cf1a420, 0x1f1bd: 0x6d348a20, 0x1f1be: 0x6c28a020, 0x1f1bf: 0x6c935c20, - // Block 0x7c7, offset 0x1f1c0 - 0x1f1c0: 0x6d1f5e20, 0x1f1c1: 0x6c0f3e20, 0x1f1c2: 0x6c060a20, 0x1f1c3: 0x6c748a20, - 0x1f1c4: 0x6ceb4220, 0x1f1c5: 0x6d184020, 0x1f1c6: 0x6cc13020, 0x1f1c7: 0x6cb4c220, - 0x1f1c8: 0x6cc13e20, 0x1f1c9: 0x6c6ee620, 0x1f1ca: 0x6cb35c20, 0x1f1cb: 0x6d2f7020, - 0x1f1cc: 0x6d251220, 0x1f1cd: 0x6cadf020, 0x1f1ce: 0x6d394c20, 0x1f1cf: 0x6c727220, - 0x1f1d0: 0x6d3b2620, 0x1f1d1: 0x6caa4420, 0x1f1d2: 0x6c70c820, 0x1f1d3: 0x6caf8820, - 0x1f1d4: 0x6d29fa20, 0x1f1d5: 0x6c645020, 0x1f1d6: 0x6c8d4e20, 0x1f1d7: 0x6d31f620, - 0x1f1d8: 0x6cdf3a20, 0x1f1d9: 0x6c404820, 0x1f1da: 0x6d103020, 0x1f1db: 0x6cd2d820, - 0x1f1dc: 0x6c0a4020, 0x1f1dd: 0x6cebc220, 0x1f1de: 0x6ceb4620, 0x1f1df: 0x6cd8e420, - 0x1f1e0: 0x6c8e9020, 0x1f1e1: 0x6c96de20, 0x1f1e2: 0x6cb13220, 0x1f1e3: 0x6ce24620, - 0x1f1e4: 0x6d36f820, 0x1f1e5: 0x6cc6b820, 0x1f1e6: 0x6ce2b620, 0x1f1e7: 0x6c308a20, - 0x1f1e8: 0x6d09ac20, 0x1f1e9: 0x6cc2a420, 0x1f1ea: 0x6cd02220, 0x1f1eb: 0x6c6ee820, - 0x1f1ec: 0x6c37a620, 0x1f1ed: 0x6c4d7a20, 0x1f1ee: 0x6c0f7020, 0x1f1ef: 0x6d39ce20, - 0x1f1f0: 0x6d1a0c20, 0x1f1f1: 0x6c962a20, 0x1f1f2: 0x6d397a20, 0x1f1f3: 0x6c28bc20, - 0x1f1f4: 0x6d023820, 0x1f1f5: 0x6c8eb020, 0x1f1f6: 0x6c716a20, 0x1f1f7: 0x6cd97020, - 0x1f1f8: 0x6cbd4620, 0x1f1f9: 0x6c987a20, 0x1f1fa: 0x6c80ec20, 0x1f1fb: 0x6c4f2420, - 0x1f1fc: 0x6ce90020, 0x1f1fd: 0x6d07da20, 0x1f1fe: 0x6cea1420, 0x1f1ff: 0x6c75f220, - // Block 0x7c8, offset 0x1f200 - 0x1f200: 0x6c35be20, 0x1f201: 0x6c1a7a20, 0x1f202: 0x6d03ac20, 0x1f203: 0x6c005820, - 0x1f204: 0x6c931420, 0x1f205: 0x6d3c6c20, 0x1f206: 0x6d38be20, 0x1f207: 0x6ccf8220, - 0x1f208: 0x6cb13620, 0x1f209: 0x6c7d8c20, 0x1f20a: 0x6ce24c20, 0x1f20b: 0x6c7f2e20, - 0x1f20c: 0x6d3fd220, 0x1f20d: 0x6c78e220, 0x1f20e: 0x6cb67c20, 0x1f20f: 0x6cb67e20, - 0x1f210: 0x6d0ede20, 0x1f211: 0x6c3a2220, 0x1f212: 0x6ccacc20, 0x1f213: 0x6d0df020, - 0x1f214: 0x6c445820, 0x1f215: 0x6d11e220, 0x1f216: 0x6cf54820, 0x1f217: 0x6cb14e20, - 0x1f218: 0x6c237620, 0x1f219: 0x6cb15020, 0x1f21a: 0x6cb9da20, 0x1f21b: 0x6c3a2420, - 0x1f21c: 0x6c5a2420, 0x1f21d: 0x6cb9d420, 0x1f21e: 0x6c5d6820, 0x1f21f: 0x6d21de20, - 0x1f220: 0x6ce3a820, 0x1f221: 0x6cc32420, 0x1f222: 0x6cfa1620, 0x1f223: 0x6d3fd620, - 0x1f224: 0x6c7cae20, 0x1f225: 0x6cc76c20, 0x1f226: 0x6cd84620, 0x1f227: 0x6c488020, - 0x1f228: 0x6ceb5c20, 0x1f229: 0x6c4aa220, 0x1f22a: 0x6cda0020, 0x1f22b: 0x6cb94a20, - 0x1f22c: 0x6c1a5a20, 0x1f22d: 0x6d374e20, 0x1f22e: 0x6c8ed620, 0x1f22f: 0x6caef820, - 0x1f230: 0x6ce2c820, 0x1f231: 0x6cf7be20, 0x1f232: 0x6c12b420, 0x1f233: 0x6c31ea20, - 0x1f234: 0x6d0efe20, 0x1f235: 0x6d25cc20, 0x1f236: 0x6d407220, 0x1f237: 0x6ccad020, - 0x1f238: 0x6ccde020, 0x1f239: 0x6c84b020, 0x1f23a: 0x6d376220, 0x1f23b: 0x6cd6b020, - 0x1f23c: 0x6c933820, 0x1f23d: 0x6cf7c020, 0x1f23e: 0x6c956c20, 0x1f23f: 0x6d2eec20, - // Block 0x7c9, offset 0x1f240 - 0x1f240: 0x6ca19020, 0x1f241: 0x6c030020, 0x1f242: 0x6c118420, 0x1f243: 0x6c0c5c20, - 0x1f244: 0x6c237a20, 0x1f245: 0x6cc16220, 0x1f246: 0x6c0ac220, 0x1f247: 0x6d376420, - 0x1f248: 0x6d248020, 0x1f249: 0x6d060c20, 0x1f24a: 0x6c576c20, 0x1f24b: 0x6c0e9e20, - 0x1f24c: 0x6cdb7020, 0x1f24d: 0x6cff5820, 0x1f24e: 0x6c8c0a20, 0x1f24f: 0x6d2ea420, - 0x1f250: 0x6c33c620, 0x1f251: 0x6c8eea20, 0x1f252: 0x6ceb6220, 0x1f253: 0x6c136a20, - 0x1f254: 0x6c2d9e20, 0x1f255: 0x6c68b220, 0x1f256: 0x6ce60c20, 0x1f257: 0x6d0f1620, - 0x1f258: 0x6c958620, 0x1f259: 0x6d2dca20, 0x1f25a: 0x6c6df820, 0x1f25b: 0x6d196a20, - 0x1f25c: 0x6d139e20, 0x1f25d: 0x6ceadc20, 0x1f25e: 0x6cb20020, 0x1f25f: 0x6d397220, - 0x1f260: 0x6d0f2620, 0x1f261: 0x6c902020, 0x1f262: 0x6c937220, 0x1f263: 0x6ce2e020, - 0x1f264: 0x6cfda820, 0x1f265: 0x6c630220, 0x1f266: 0x6cd6ca20, 0x1f267: 0x6c719c20, - 0x1f268: 0x6cf7d020, 0x1f269: 0x6c585020, 0x1f26a: 0x6c84ee20, 0x1f26b: 0x6c0c6820, - 0x1f26c: 0x6c968c20, 0x1f26d: 0x6d22ba20, 0x1f26e: 0x6ceae220, 0x1f26f: 0x6d09da20, - 0x1f270: 0x6c1afa20, 0x1f271: 0x6cc0d820, 0x1f272: 0x6cc63e20, 0x1f273: 0x6c0eb220, - 0x1f274: 0x6c935020, 0x1f275: 0x6d29f820, 0x1f276: 0x6cd2ba20, 0x1f277: 0x6cd89620, - 0x1f278: 0x6c3fbc20, 0x1f279: 0x6c706420, 0x1f27a: 0x6d404820, 0x1f27b: 0x6d3ab820, - 0x1f27c: 0x6cebc020, 0x1f27d: 0x6caa4020, 0x1f27e: 0x6c643820, 0x1f27f: 0x6d16d420, - // Block 0x7ca, offset 0x1f280 - 0x1f280: 0x6c273c20, 0x1f281: 0x6cfe9020, 0x1f282: 0x6c96b820, 0x1f283: 0x6d19bc20, - 0x1f284: 0x6c683a20, 0x1f285: 0x6c572e20, 0x1f286: 0x6c95ee20, 0x1f287: 0x6c4d5c20, - 0x1f288: 0x6cb10820, 0x1f289: 0x6c0bf020, 0x1f28a: 0x6c83b420, 0x1f28b: 0x6c1a6c20, - 0x1f28c: 0x6d0e5820, 0x1f28d: 0x6d036e20, 0x1f28e: 0x6cbd2820, 0x1f28f: 0x6c75aa20, - 0x1f290: 0x6cb5e220, 0x1f291: 0x6cb5e420, 0x1f292: 0x6c78aa20, 0x1f293: 0x6d3c5c20, - 0x1f294: 0x6d3f7e20, 0x1f295: 0x6cdaae20, 0x1f296: 0x6c116420, 0x1f297: 0x6cb14a20, - 0x1f298: 0x6d364820, 0x1f299: 0x6c7c8220, 0x1f29a: 0x6ccab020, 0x1f29b: 0x6cf4f620, - 0x1f29c: 0x6c02da20, 0x1f29d: 0x6c8e7820, 0x1f29e: 0x6cb8fa20, 0x1f29f: 0x6ccd9020, - 0x1f2a0: 0x6c0c1220, 0x1f2a1: 0x6c955020, 0x1f2a2: 0x6c233620, 0x1f2a3: 0x6c15e220, - 0x1f2a4: 0x6d395c20, 0x1f2a5: 0x6c62c420, 0x1f2a6: 0x6cd6ac20, 0x1f2a7: 0x6cfd9420, - 0x1f2a8: 0x6c476e20, 0x1f2a9: 0x6cefb420, 0x1f2aa: 0x6cefd220, 0x1f2ab: 0x6cefd420, - 0x1f2ac: 0x6d214020, 0x1f2ad: 0x6c422420, 0x1f2ae: 0x6d17d620, 0x1f2af: 0x6c01ec20, - 0x1f2b0: 0x6ce7f220, 0x1f2b1: 0x6c6bf020, 0x1f2b2: 0x6c065e20, 0x1f2b3: 0x6c074e20, - 0x1f2b4: 0x6c220c20, 0x1f2b5: 0x6ce3c620, 0x1f2b6: 0x6c2c0020, 0x1f2b7: 0x6c7a5620, - 0x1f2b8: 0x6c4d2820, 0x1f2b9: 0x6cbba020, 0x1f2ba: 0x6c543020, 0x1f2bb: 0x6c7af020, - 0x1f2bc: 0x6c443220, 0x1f2bd: 0x6ce9ee20, 0x1f2be: 0x6c452020, 0x1f2bf: 0x6cb12a20, - // Block 0x7cb, offset 0x1f2c0 - 0x1f2c0: 0x6c0a8220, 0x1f2c1: 0x6c783c20, 0x1f2c2: 0x6cb87a20, 0x1f2c3: 0x6d21ce20, - 0x1f2c4: 0x6cdc1420, 0x1f2c5: 0x6c90d020, 0x1f2c6: 0x6c0fb220, 0x1f2c7: 0x6cff4620, - 0x1f2c8: 0x6c055a20, 0x1f2c9: 0x6c0fb420, 0x1f2ca: 0x6c221420, 0x1f2cb: 0x6c7b5e20, - 0x1f2cc: 0x6c0d9220, 0x1f2cd: 0x6ca09420, 0x1f2ce: 0x6c8a5220, 0x1f2cf: 0x6c90da20, - 0x1f2d0: 0x6cff5220, 0x1f2d1: 0x6c31fe20, 0x1f2d2: 0x6d29f220, 0x1f2d3: 0x6cdc1a20, - 0x1f2d4: 0x6ce3d020, 0x1f2d5: 0x6c0d9620, 0x1f2d6: 0x6c7b6020, 0x1f2d7: 0x6c91a820, - 0x1f2d8: 0x6c42bc20, 0x1f2d9: 0x6c42c420, 0x1f2da: 0x6cbc5020, 0x1f2db: 0x6c779420, - 0x1f2dc: 0x6cbc2c20, 0x1f2dd: 0x6c819420, 0x1f2de: 0x6ccb0c20, 0x1f2df: 0x6c0bf420, - 0x1f2e0: 0x6c7d6e20, 0x1f2e1: 0x6c7d7620, 0x1f2e2: 0x6c2b7620, 0x1f2e3: 0x6c39da20, - 0x1f2e4: 0x6d04ec20, 0x1f2e5: 0x6cc47e20, 0x1f2e6: 0x6c98f820, 0x1f2e7: 0x6c28a220, - 0x1f2e8: 0x6c7d7e20, 0x1f2e9: 0x6c0d8620, 0x1f2ea: 0x6c383e20, 0x1f2eb: 0x6ce5a220, - 0x1f2ec: 0x6caf8a20, 0x1f2ed: 0x6d3e9c20, 0x1f2ee: 0x6c384220, 0x1f2ef: 0x6cc48620, - 0x1f2f0: 0x6ce41a20, 0x1f2f1: 0x6c066420, 0x1f2f2: 0x6c0a4220, 0x1f2f3: 0x6c990420, - 0x1f2f4: 0x6c3eea20, 0x1f2f5: 0x6c376a20, 0x1f2f6: 0x6cc6ba20, 0x1f2f7: 0x6cc14420, - 0x1f2f8: 0x6c45b620, 0x1f2f9: 0x6d04f820, 0x1f2fa: 0x6c7e1620, 0x1f2fb: 0x6c628e20, - 0x1f2fc: 0x6caed220, 0x1f2fd: 0x6d3b6020, 0x1f2fe: 0x6cce8e20, 0x1f2ff: 0x6cdd4420, - // Block 0x7cc, offset 0x1f300 - 0x1f300: 0x6ce43620, 0x1f301: 0x6c86ba20, 0x1f302: 0x6c0d8a20, 0x1f303: 0x6d3fd420, - 0x1f304: 0x6c2baa20, 0x1f305: 0x6caee420, 0x1f306: 0x6cd94820, 0x1f307: 0x6d32f820, - 0x1f308: 0x6cc32220, 0x1f309: 0x6d3fd820, 0x1f30a: 0x6cd76220, 0x1f30b: 0x6c660e20, - 0x1f30c: 0x6ceb9620, 0x1f30d: 0x6c55f420, 0x1f30e: 0x6c7eae20, 0x1f30f: 0x6c6f8e20, - 0x1f310: 0x6cb6a020, 0x1f311: 0x6c889820, 0x1f312: 0x6d320420, 0x1f313: 0x6c0d9420, - 0x1f314: 0x6caefa20, 0x1f315: 0x6c96e620, 0x1f316: 0x6cca0e20, 0x1f317: 0x6c979e20, - 0x1f318: 0x6c97a020, 0x1f319: 0x6ccbbc20, 0x1f31a: 0x6d061020, 0x1f31b: 0x6c8b7a20, - 0x1f31c: 0x6cb95420, 0x1f31d: 0x6cb95220, 0x1f31e: 0x6ca46220, 0x1f31f: 0x6c58cc20, - 0x1f320: 0x6c7e3220, 0x1f321: 0x6ca94220, 0x1f322: 0x6c0d9820, 0x1f323: 0x6c8b8a20, - 0x1f324: 0x6cc4fe20, 0x1f325: 0x6c310e20, 0x1f326: 0x6c313420, 0x1f327: 0x6ca53620, - 0x1f328: 0x6c53dc20, 0x1f329: 0x6cf90e20, 0x1f32a: 0x6c314e20, 0x1f32b: 0x6c4e7220, - 0x1f32c: 0x6c315420, 0x1f32d: 0x6c315220, 0x1f32e: 0x6c6f9620, 0x1f32f: 0x6c170e20, - 0x1f330: 0x6d249c20, 0x1f331: 0x6d24a420, 0x1f332: 0x6c43e020, 0x1f333: 0x6d0ecc20, - 0x1f334: 0x6c3f8e20, 0x1f335: 0x6cbdb820, 0x1f336: 0x6c4a9e20, 0x1f337: 0x6d3fdc20, - 0x1f338: 0x6c8f5820, 0x1f339: 0x6c4aa620, 0x1f33a: 0x6cce2a20, 0x1f33b: 0x6d248220, - 0x1f33c: 0x6c4ae220, 0x1f33d: 0x6c9a9620, 0x1f33e: 0x6c623220, 0x1f33f: 0x6cb61220, - // Block 0x7cd, offset 0x1f340 - 0x1f340: 0x6c40da20, 0x1f341: 0x6c7c9020, 0x1f342: 0x6c5cf620, 0x1f343: 0x6c038c20, - 0x1f344: 0x6cb39c20, 0x1f345: 0x6c9aa620, 0x1f346: 0x6d05c820, 0x1f347: 0x6d0dd220, - 0x1f348: 0x6cff1a20, 0x1f349: 0x6c89a220, 0x1f34a: 0x6d242620, 0x1f34b: 0x6ce9ca20, - 0x1f34c: 0x6cb53e20, 0x1f34d: 0x6cee3e20, 0x1f34e: 0x6c89a820, 0x1f34f: 0x6cf0f020, - 0x1f350: 0x6c41bc20, 0x1f351: 0x6c1aea20, 0x1f352: 0x6cb17420, 0x1f353: 0x6c0ab620, - 0x1f354: 0x6ca09620, 0x1f355: 0x6c616220, 0x1f356: 0x6d060820, 0x1f357: 0x6c1e3e20, - 0x1f358: 0x6d0e2620, 0x1f359: 0x6d2dcc20, 0x1f35a: 0x6d211220, 0x1f35b: 0x6c29c420, - 0x1f35c: 0x6cc57620, 0x1f35d: 0x6c6b0220, 0x1f35e: 0x6c03f620, 0x1f35f: 0x6c537c20, - 0x1f360: 0x6ceacc20, 0x1f361: 0x6c2e3620, 0x1f362: 0x6c614e20, 0x1f363: 0x6d073620, - 0x1f364: 0x6c358020, 0x1f365: 0x6c367c20, 0x1f366: 0x6ccc1220, 0x1f367: 0x6c4f8620, - 0x1f368: 0x6cea6620, 0x1f369: 0x6ca15e20, 0x1f36a: 0x6c6c0020, 0x1f36b: 0x6cd07220, - 0x1f36c: 0x6c04d620, 0x1f36d: 0x6d25a420, 0x1f36e: 0x6cb01420, 0x1f36f: 0x6c91d420, - 0x1f370: 0x6cf1aa20, 0x1f371: 0x6c55a620, 0x1f372: 0x6c915a20, 0x1f373: 0x6d289a20, - 0x1f374: 0x6c39ae20, 0x1f375: 0x6c3b9020, 0x1f376: 0x6ca36820, 0x1f377: 0x6d1f6c20, - 0x1f378: 0x6cb15220, 0x1f379: 0x6ca1b620, 0x1f37a: 0x6c517e20, 0x1f37b: 0x6cf9fa20, - 0x1f37c: 0x6cc14620, 0x1f37d: 0x6c4e3820, 0x1f37e: 0x6caf9420, 0x1f37f: 0x6c8d6220, - // Block 0x7ce, offset 0x1f380 - 0x1f380: 0x6ceb5220, 0x1f381: 0x6c0e9820, 0x1f382: 0x6cc0a020, 0x1f383: 0x6cb2d220, - 0x1f384: 0x6c3f0620, 0x1f385: 0x6c0a6420, 0x1f386: 0x6c22a420, 0x1f387: 0x6cf0e020, - 0x1f388: 0x6c70ce20, 0x1f389: 0x6c2de220, 0x1f38a: 0x6c03c620, 0x1f38b: 0x6d1f7a20, - 0x1f38c: 0x6c4bf020, 0x1f38d: 0x6caf9620, 0x1f38e: 0x6ca70620, 0x1f38f: 0x6d03a020, - 0x1f390: 0x6cdf4020, 0x1f391: 0x6c066a20, 0x1f392: 0x6c406020, 0x1f393: 0x6d2c9820, - 0x1f394: 0x6c728620, 0x1f395: 0x6c473620, 0x1f396: 0x6cd41e20, 0x1f397: 0x6c309a20, - 0x1f398: 0x6c27b020, 0x1f399: 0x6cdeba20, 0x1f39a: 0x6c6b4c20, 0x1f39b: 0x6cd50e20, - 0x1f39c: 0x6c548220, 0x1f39d: 0x6cfe0420, 0x1f39e: 0x6c376e20, 0x1f39f: 0x6c01d620, - 0x1f3a0: 0x6cef4820, 0x1f3a1: 0x6d2fe620, 0x1f3a2: 0x6d39d020, 0x1f3a3: 0x6d1b8220, - 0x1f3a4: 0x6c8b4020, 0x1f3a5: 0x6c962e20, 0x1f3a6: 0x6ce79420, 0x1f3a7: 0x6ce3c820, - 0x1f3a8: 0x6d18e220, 0x1f3a9: 0x6c0e3020, 0x1f3aa: 0x6cf03420, 0x1f3ab: 0x6c688a20, - 0x1f3ac: 0x6c7a6820, 0x1f3ad: 0x6c4a9220, 0x1f3ae: 0x6cfae620, 0x1f3af: 0x6c444820, - 0x1f3b0: 0x6c5b4420, 0x1f3b1: 0x6c81fc20, 0x1f3b2: 0x6c40b820, 0x1f3b3: 0x6c77ca20, - 0x1f3b4: 0x6d055e20, 0x1f3b5: 0x6c346820, 0x1f3b6: 0x6c758820, 0x1f3b7: 0x6ce3a020, - 0x1f3b8: 0x6c9e4620, 0x1f3b9: 0x6cce9220, 0x1f3ba: 0x6d2c9a20, 0x1f3bb: 0x6cdd4620, - 0x1f3bc: 0x6cbd4820, 0x1f3bd: 0x6d21d020, 0x1f3be: 0x6ca57820, 0x1f3bf: 0x6d30b420, - // Block 0x7cf, offset 0x1f3c0 - 0x1f3c0: 0x6c4bf620, 0x1f3c1: 0x6c452420, 0x1f3c2: 0x6cdb7c20, 0x1f3c3: 0x6cf40220, - 0x1f3c4: 0x6cc0a620, 0x1f3c5: 0x6ccd1820, 0x1f3c6: 0x6cb42020, 0x1f3c7: 0x6c596220, - 0x1f3c8: 0x6ce5a820, 0x1f3c9: 0x6c854020, 0x1f3ca: 0x6ccc2420, 0x1f3cb: 0x6ccc2620, - 0x1f3cc: 0x6c77d020, 0x1f3cd: 0x6c9b7e20, 0x1f3ce: 0x6c1a8e20, 0x1f3cf: 0x6c87e620, - 0x1f3d0: 0x6d409820, 0x1f3d1: 0x6cf94c20, 0x1f3d2: 0x6d1e6420, 0x1f3d3: 0x6ca61020, - 0x1f3d4: 0x6d3eba20, 0x1f3d5: 0x6cb68820, 0x1f3d6: 0x6d330c20, 0x1f3d7: 0x6cfe0620, - 0x1f3d8: 0x6ca57a20, 0x1f3d9: 0x6c216e20, 0x1f3da: 0x6c62c620, 0x1f3db: 0x6c2dec20, - 0x1f3dc: 0x6cbd0020, 0x1f3dd: 0x6c482c20, 0x1f3de: 0x6d38f220, 0x1f3df: 0x6c302420, - 0x1f3e0: 0x6c7f3020, 0x1f3e1: 0x6c3aec20, 0x1f3e2: 0x6ca61420, 0x1f3e3: 0x6d192220, - 0x1f3e4: 0x6c7d8e20, 0x1f3e5: 0x6c932620, 0x1f3e6: 0x6c703820, 0x1f3e7: 0x6c168620, - 0x1f3e8: 0x6c6de620, 0x1f3e9: 0x6c951220, 0x1f3ea: 0x6c8d8a20, 0x1f3eb: 0x6d406e20, - 0x1f3ec: 0x6c849420, 0x1f3ed: 0x6c9bf420, 0x1f3ee: 0x6d3fde20, 0x1f3ef: 0x6d375220, - 0x1f3f0: 0x6ca70c20, 0x1f3f1: 0x6c570420, 0x1f3f2: 0x6d24c420, 0x1f3f3: 0x6c2cb620, - 0x1f3f4: 0x6cd20c20, 0x1f3f5: 0x6cd02c20, 0x1f3f6: 0x6c5d1620, 0x1f3f7: 0x6ce3ac20, - 0x1f3f8: 0x6c544020, 0x1f3f9: 0x6d03b220, 0x1f3fa: 0x6d39e420, 0x1f3fb: 0x6c7ebc20, - 0x1f3fc: 0x6d3fe020, 0x1f3fd: 0x6d2b6820, 0x1f3fe: 0x6c0b1820, 0x1f3ff: 0x6c0b1a20, - // Block 0x7d0, offset 0x1f400 - 0x1f400: 0x6c596420, 0x1f401: 0x6cc32a20, 0x1f402: 0x6d2b7020, 0x1f403: 0x6ceeca20, - 0x1f404: 0x6ceecc20, 0x1f405: 0x6d21e620, 0x1f406: 0x6c212420, 0x1f407: 0x6cc77020, - 0x1f408: 0x6c2f0a20, 0x1f409: 0x6c5a2e20, 0x1f40a: 0x6c893220, 0x1f40b: 0x6d0e0620, - 0x1f40c: 0x6cbfda20, 0x1f40d: 0x6cbfdc20, 0x1f40e: 0x6c661020, 0x1f40f: 0x6c089c20, - 0x1f410: 0x6c36dc20, 0x1f411: 0x6d0ff220, 0x1f412: 0x6c409020, 0x1f413: 0x6cc9d820, - 0x1f414: 0x6c41fa20, 0x1f415: 0x6cf98220, 0x1f416: 0x6ceb9820, 0x1f417: 0x6c55fa20, - 0x1f418: 0x6cd42420, 0x1f419: 0x6cc93420, 0x1f41a: 0x6d08d620, 0x1f41b: 0x6cf17220, - 0x1f41c: 0x6cba8820, 0x1f41d: 0x6c508020, 0x1f41e: 0x6cf39020, 0x1f41f: 0x6c39b420, - 0x1f420: 0x6ccad620, 0x1f421: 0x6c8ee420, 0x1f422: 0x6c96aa20, 0x1f423: 0x6cd29620, - 0x1f424: 0x6cd21420, 0x1f425: 0x6c493a20, 0x1f426: 0x6d3ec220, 0x1f427: 0x6ce2d020, - 0x1f428: 0x6cde2620, 0x1f429: 0x6d117a20, 0x1f42a: 0x6c35a820, 0x1f42b: 0x6d1e0820, - 0x1f42c: 0x6cb9e420, 0x1f42d: 0x6cb6a420, 0x1f42e: 0x6cf17420, 0x1f42f: 0x6cc93820, - 0x1f430: 0x6cd0ce20, 0x1f431: 0x6c889e20, 0x1f432: 0x6c028e20, 0x1f433: 0x6c823420, - 0x1f434: 0x6c5b0c20, 0x1f435: 0x6c9fdc20, 0x1f436: 0x6c62e620, 0x1f437: 0x6ce5b620, - 0x1f438: 0x6cc16820, 0x1f439: 0x6c654a20, 0x1f43a: 0x6cd03020, 0x1f43b: 0x6c97a820, - 0x1f43c: 0x6cf7c620, 0x1f43d: 0x6cc0aa20, 0x1f43e: 0x6c0c9c20, 0x1f43f: 0x6c62e820, - // Block 0x7d1, offset 0x1f440 - 0x1f440: 0x6c62d820, 0x1f441: 0x6d3a3c20, 0x1f442: 0x6c679a20, 0x1f443: 0x6d051420, - 0x1f444: 0x6d3b9c20, 0x1f445: 0x6d1de620, 0x1f446: 0x6d2eee20, 0x1f447: 0x6c776420, - 0x1f448: 0x6d093620, 0x1f449: 0x6c0cce20, 0x1f44a: 0x6d248a20, 0x1f44b: 0x6cc16a20, - 0x1f44c: 0x6cfe6e20, 0x1f44d: 0x6c0ea220, 0x1f44e: 0x6c697820, 0x1f44f: 0x6d0a5a20, - 0x1f450: 0x6cdb7220, 0x1f451: 0x6c5a3a20, 0x1f452: 0x6d420020, 0x1f453: 0x6ccdee20, - 0x1f454: 0x6ccdf020, 0x1f455: 0x6c387620, 0x1f456: 0x6c4bae20, 0x1f457: 0x6c8c0c20, - 0x1f458: 0x6d0a5c20, 0x1f459: 0x6c9e8620, 0x1f45a: 0x6cf82c20, 0x1f45b: 0x6d2bbe20, - 0x1f45c: 0x6cfe7820, 0x1f45d: 0x6c3c0620, 0x1f45e: 0x6c494620, 0x1f45f: 0x6c548a20, - 0x1f460: 0x6c7b4e20, 0x1f461: 0x6d2b7220, 0x1f462: 0x6ccada20, 0x1f463: 0x6d2dd020, - 0x1f464: 0x6c420420, 0x1f465: 0x6c4bb220, 0x1f466: 0x6d1d6020, 0x1f467: 0x6c855220, - 0x1f468: 0x6c16da20, 0x1f469: 0x6c836e20, 0x1f46a: 0x6cd63a20, 0x1f46b: 0x6c011020, - 0x1f46c: 0x6cc7f220, 0x1f46d: 0x6c62fe20, 0x1f46e: 0x6d076e20, 0x1f46f: 0x6c56f220, - 0x1f470: 0x6cd63c20, 0x1f471: 0x6c87bc20, 0x1f472: 0x6c8b8e20, 0x1f473: 0x6c87c620, - 0x1f474: 0x6c9f2020, 0x1f475: 0x6d31a620, 0x1f476: 0x6cfe1220, 0x1f477: 0x6c370220, - 0x1f478: 0x6c91ac20, 0x1f479: 0x6c49ca20, 0x1f47a: 0x6c84f020, 0x1f47b: 0x6cfb1c20, - 0x1f47c: 0x6d20ce20, 0x1f47d: 0x6c29c220, 0x1f47e: 0x6c613a20, 0x1f47f: 0x6d1f4220, - // Block 0x7d2, offset 0x1f480 - 0x1f480: 0x6cea5c20, 0x1f481: 0x6c91c020, 0x1f482: 0x6c39ac20, 0x1f483: 0x6c035420, - 0x1f484: 0x6c515220, 0x1f485: 0x6c03be20, 0x1f486: 0x6cb2ba20, 0x1f487: 0x6ca70020, - 0x1f488: 0x6c915620, 0x1f489: 0x6d1f5220, 0x1f48a: 0x6d2c8020, 0x1f48b: 0x6c401420, - 0x1f48c: 0x6c03c020, 0x1f48d: 0x6c065620, 0x1f48e: 0x6c547620, 0x1f48f: 0x6cb00220, - 0x1f490: 0x6cdf2c20, 0x1f491: 0x6c4a8220, 0x1f492: 0x6c6b1620, 0x1f493: 0x6c77b420, - 0x1f494: 0x6ceffa20, 0x1f495: 0x6c376420, 0x1f496: 0x6ce77620, 0x1f497: 0x6d2b6220, - 0x1f498: 0x6c547c20, 0x1f499: 0x6c7b2e20, 0x1f49a: 0x6c625a20, 0x1f49b: 0x6c686220, - 0x1f49c: 0x6cfac620, 0x1f49d: 0x6d2c8820, 0x1f49e: 0x6cfdfa20, 0x1f49f: 0x6d0a2c20, - 0x1f4a0: 0x6c451e20, 0x1f4a1: 0x6c843820, 0x1f4a2: 0x6c884620, 0x1f4a3: 0x6c64ea20, - 0x1f4a4: 0x6c852c20, 0x1f4a5: 0x6cd28820, 0x1f4a6: 0x6ce5a420, 0x1f4a7: 0x6c4be820, - 0x1f4a8: 0x6ccc1620, 0x1f4a9: 0x6c595020, 0x1f4aa: 0x6c758020, 0x1f4ab: 0x6c626e20, - 0x1f4ac: 0x6d1e5a20, 0x1f4ad: 0x6cbe5820, 0x1f4ae: 0x6c8d6420, 0x1f4af: 0x6cb65820, - 0x1f4b0: 0x6d406820, 0x1f4b1: 0x6c3a1c20, 0x1f4b2: 0x6c7d8620, 0x1f4b3: 0x6c168020, - 0x1f4b4: 0x6c482a20, 0x1f4b5: 0x6ca60a20, 0x1f4b6: 0x6ca70820, 0x1f4b7: 0x6c2de420, - 0x1f4b8: 0x6c6dd420, 0x1f4b9: 0x6cd02420, 0x1f4ba: 0x6cd20020, 0x1f4bb: 0x6d3e9e20, - 0x1f4bc: 0x6c3bf820, 0x1f4bd: 0x6c2ef620, 0x1f4be: 0x6c089420, 0x1f4bf: 0x6c16ce20, - // Block 0x7d3, offset 0x1f4c0 - 0x1f4c0: 0x6ce39020, 0x1f4c1: 0x6cf16c20, 0x1f4c2: 0x6ceec420, 0x1f4c3: 0x6cc9d220, - 0x1f4c4: 0x6c36c020, 0x1f4c5: 0x6cbfd220, 0x1f4c6: 0x6c407020, 0x1f4c7: 0x6c5a1620, - 0x1f4c8: 0x6cc31e20, 0x1f4c9: 0x6c678a20, 0x1f4ca: 0x6c0b1220, 0x1f4cb: 0x6ccac820, - 0x1f4cc: 0x6c028020, 0x1f4cd: 0x6cb68020, 0x1f4ce: 0x6cde1e20, 0x1f4cf: 0x6c493220, - 0x1f4d0: 0x6d116620, 0x1f4d1: 0x6cad1220, 0x1f4d2: 0x6c651e20, 0x1f4d3: 0x6c823020, - 0x1f4d4: 0x6c0c9a20, 0x1f4d5: 0x6d093420, 0x1f4d6: 0x6c0cc820, 0x1f4d7: 0x6c979820, - 0x1f4d8: 0x6c9fd820, 0x1f4d9: 0x6d1dd220, 0x1f4da: 0x6cf10420, 0x1f4db: 0x6cf7b620, - 0x1f4dc: 0x6c4ba020, 0x1f4dd: 0x6ccde220, 0x1f4de: 0x6c8c0620, 0x1f4df: 0x6d41fe20, - 0x1f4e0: 0x6c56e420, 0x1f4e1: 0x6c41fe20, 0x1f4e2: 0x6c854a20, 0x1f4e3: 0x6d2dc820, - 0x1f4e4: 0x6c496e20, 0x1f4e5: 0x6ca79a20, 0x1f4e6: 0x6d15f420, 0x1f4e7: 0x6c3ebc20, - 0x1f4e8: 0x6c864220, 0x1f4e9: 0x6c6f7e20, 0x1f4ea: 0x6c102220, 0x1f4eb: 0x6d0e8e20, - 0x1f4ec: 0x6c3f5020, 0x1f4ed: 0x6c2dd020, 0x1f4ee: 0x6c5efc20, 0x1f4ef: 0x6c3cea20, - 0x1f4f0: 0x6cc83620, 0x1f4f1: 0x6c41ac20, 0x1f4f2: 0x6cd1e820, 0x1f4f3: 0x6c3cee20, - 0x1f4f4: 0x6ca01420, 0x1f4f5: 0x6c060c20, 0x1f4f6: 0x6d250820, 0x1f4f7: 0x6d341420, - 0x1f4f8: 0x6c56c420, 0x1f4f9: 0x6cbd9a20, 0x1f4fa: 0x6c3d9820, 0x1f4fb: 0x6c049620, - 0x1f4fc: 0x6cf1ac20, 0x1f4fd: 0x6c64ec20, 0x1f4fe: 0x6cd1f620, 0x1f4ff: 0x6d23e420, - // Block 0x7d4, offset 0x1f500 - 0x1f500: 0x6c3d3220, 0x1f501: 0x6d10b620, 0x1f502: 0x6c74b020, 0x1f503: 0x6c74b220, - 0x1f504: 0x6cb06c20, 0x1f505: 0x6c583020, 0x1f506: 0x6d326820, 0x1f507: 0x6c061220, - 0x1f508: 0x6d0eb420, 0x1f509: 0x6d0af620, 0x1f50a: 0x6d336420, 0x1f50b: 0x6c399c20, - 0x1f50c: 0x6c3cf020, 0x1f50d: 0x6cf1ae20, 0x1f50e: 0x6cab5220, 0x1f50f: 0x6c279220, - 0x1f510: 0x6c43ac20, 0x1f511: 0x6cc7ca20, 0x1f512: 0x6c8d6620, 0x1f513: 0x6c9eea20, - 0x1f514: 0x6c3eec20, 0x1f515: 0x6ceb5420, 0x1f516: 0x6c9f7c20, 0x1f517: 0x6c869620, - 0x1f518: 0x6c0b5020, 0x1f519: 0x6d36fc20, 0x1f51a: 0x6c43ae20, 0x1f51b: 0x6d251420, - 0x1f51c: 0x6c227620, 0x1f51d: 0x6cc1cc20, 0x1f51e: 0x6cff1c20, 0x1f51f: 0x6c1adc20, - 0x1f520: 0x6c28c020, 0x1f521: 0x6c70d020, 0x1f522: 0x6d11d620, 0x1f523: 0x6c473820, - 0x1f524: 0x6c301820, 0x1f525: 0x6d240020, 0x1f526: 0x6d0f6e20, 0x1f527: 0x6cc73a20, - 0x1f528: 0x6d0afe20, 0x1f529: 0x6ce60420, 0x1f52a: 0x6d240220, 0x1f52b: 0x6ce54420, - 0x1f52c: 0x6d1bf820, 0x1f52d: 0x6c331620, 0x1f52e: 0x6cf38620, 0x1f52f: 0x6c377020, - 0x1f530: 0x6c487c20, 0x1f531: 0x6c00d420, 0x1f532: 0x6d341a20, 0x1f533: 0x6d0ed620, - 0x1f534: 0x6c527a20, 0x1f535: 0x6cff2c20, 0x1f536: 0x6c63f020, 0x1f537: 0x6c8b4220, - 0x1f538: 0x6d39d220, 0x1f539: 0x6d0fe220, 0x1f53a: 0x6ce39220, 0x1f53b: 0x6c539220, - 0x1f53c: 0x6c963020, 0x1f53d: 0x6cc7da20, 0x1f53e: 0x6ca1f220, 0x1f53f: 0x6c43b820, - // Block 0x7d5, offset 0x1f540 - 0x1f540: 0x6cc57e20, 0x1f541: 0x6c688c20, 0x1f542: 0x6d050220, 0x1f543: 0x6d38ba20, - 0x1f544: 0x6d341c20, 0x1f545: 0x6c963220, 0x1f546: 0x6c528c20, 0x1f547: 0x6ca77620, - 0x1f548: 0x6c370820, 0x1f549: 0x6c944620, 0x1f54a: 0x6c63f220, 0x1f54b: 0x6c62b420, - 0x1f54c: 0x6ce90420, 0x1f54d: 0x6c583820, 0x1f54e: 0x6ceb9220, 0x1f54f: 0x6c104a20, - 0x1f550: 0x6cf40420, 0x1f551: 0x6c730820, 0x1f552: 0x6d244820, 0x1f553: 0x6c0f9c20, - 0x1f554: 0x6c75f620, 0x1f555: 0x6d0aae20, 0x1f556: 0x6c089220, 0x1f557: 0x6cf71020, - 0x1f558: 0x6c75f820, 0x1f559: 0x6c717620, 0x1f55a: 0x6ce87e20, 0x1f55b: 0x6c6de420, - 0x1f55c: 0x6ce3a220, 0x1f55d: 0x6c359020, 0x1f55e: 0x6c359220, 0x1f55f: 0x6c7bcc20, - 0x1f560: 0x6c55e820, 0x1f561: 0x6cf48a20, 0x1f562: 0x6cd02a20, 0x1f563: 0x6c7f6620, - 0x1f564: 0x6c69ee20, 0x1f565: 0x6cacca20, 0x1f566: 0x6c932820, 0x1f567: 0x6cb02c20, - 0x1f568: 0x6cd51a20, 0x1f569: 0x6c3f2220, 0x1f56a: 0x6c015e20, 0x1f56b: 0x6d3dd020, - 0x1f56c: 0x6caef420, 0x1f56d: 0x6cbdba20, 0x1f56e: 0x6cb94220, 0x1f56f: 0x6c06be20, - 0x1f570: 0x6c2dee20, 0x1f571: 0x6c932a20, 0x1f572: 0x6cc42c20, 0x1f573: 0x6c652a20, - 0x1f574: 0x6c718420, 0x1f575: 0x6ce92a20, 0x1f576: 0x6d0b0420, 0x1f577: 0x6d252020, - 0x1f578: 0x6cb68e20, 0x1f579: 0x6c849620, 0x1f57a: 0x6d138620, 0x1f57b: 0x6d3c7020, - 0x1f57c: 0x6c798e20, 0x1f57d: 0x6c352020, 0x1f57e: 0x6c7d9020, 0x1f57f: 0x6cd11c20, - // Block 0x7d6, offset 0x1f580 - 0x1f580: 0x6cb69020, 0x1f581: 0x6c6de820, 0x1f582: 0x6d192420, 0x1f583: 0x6d192620, - 0x1f584: 0x6c6dea20, 0x1f585: 0x6d3ebc20, 0x1f586: 0x6c7f3220, 0x1f587: 0x6c302620, - 0x1f588: 0x6cb55020, 0x1f589: 0x6c219420, 0x1f58a: 0x6c44e620, 0x1f58b: 0x6c70e020, - 0x1f58c: 0x6c74f620, 0x1f58d: 0x6d199620, 0x1f58e: 0x6d422420, 0x1f58f: 0x6c5f8a20, - 0x1f590: 0x6cd62c20, 0x1f591: 0x6d1c1420, 0x1f592: 0x6c1c9220, 0x1f593: 0x6c9e8220, - 0x1f594: 0x6cc77220, 0x1f595: 0x6c016220, 0x1f596: 0x6cbfe020, 0x1f597: 0x6ce3ae20, - 0x1f598: 0x6c55fc20, 0x1f599: 0x6ce3b020, 0x1f59a: 0x6c36e020, 0x1f59b: 0x6c6a4420, - 0x1f59c: 0x6c991220, 0x1f59d: 0x6c3f2620, 0x1f59e: 0x6c212820, 0x1f59f: 0x6ce90820, - 0x1f5a0: 0x6d0e0820, 0x1f5a1: 0x6c51a020, 0x1f5a2: 0x6d25d020, 0x1f5a3: 0x6cb10620, - 0x1f5a4: 0x6c7d9620, 0x1f5a5: 0x6c9a3e20, 0x1f5a6: 0x6c55fe20, 0x1f5a7: 0x6d1c1620, - 0x1f5a8: 0x6c204820, 0x1f5a9: 0x6cf54c20, 0x1f5aa: 0x6c718a20, 0x1f5ab: 0x6c309c20, - 0x1f5ac: 0x6c124420, 0x1f5ad: 0x6c39e020, 0x1f5ae: 0x6c520a20, 0x1f5af: 0x6d1c3620, - 0x1f5b0: 0x6d25d220, 0x1f5b1: 0x6cfb0620, 0x1f5b2: 0x6cf24620, 0x1f5b3: 0x6cd21620, - 0x1f5b4: 0x6c520c20, 0x1f5b5: 0x6c1eca20, 0x1f5b6: 0x6ce16820, 0x1f5b7: 0x6cfa1a20, - 0x1f5b8: 0x6cc93a20, 0x1f5b9: 0x6c8ee620, 0x1f5ba: 0x6c60fe20, 0x1f5bb: 0x6c474c20, - 0x1f5bc: 0x6c654620, 0x1f5bd: 0x6cdd0420, 0x1f5be: 0x6c4f3a20, 0x1f5bf: 0x6c228020, - // Block 0x7d7, offset 0x1f5c0 - 0x1f5c0: 0x6c228220, 0x1f5c1: 0x6d195420, 0x1f5c2: 0x6d124820, 0x1f5c3: 0x6d0f0220, - 0x1f5c4: 0x6c5f9a20, 0x1f5c5: 0x6c875c20, 0x1f5c6: 0x6ce4d220, 0x1f5c7: 0x6c7a0e20, - 0x1f5c8: 0x6ce30620, 0x1f5c9: 0x6ce30820, 0x1f5ca: 0x6d195620, 0x1f5cb: 0x6ce90c20, - 0x1f5cc: 0x6c96ac20, 0x1f5cd: 0x6c68ae20, 0x1f5ce: 0x6c42f420, 0x1f5cf: 0x6ce4d420, - 0x1f5d0: 0x6c18fe20, 0x1f5d1: 0x6c610020, 0x1f5d2: 0x6ce97620, 0x1f5d3: 0x6d311020, - 0x1f5d4: 0x6c029020, 0x1f5d5: 0x6d11e620, 0x1f5d6: 0x6d143c20, 0x1f5d7: 0x6cab6620, - 0x1f5d8: 0x6c1c9820, 0x1f5d9: 0x6d376e20, 0x1f5da: 0x6c8f5c20, 0x1f5db: 0x6d1de820, - 0x1f5dc: 0x6c937020, 0x1f5dd: 0x6c0aca20, 0x1f5de: 0x6cd6b820, 0x1f5df: 0x6d3de420, - 0x1f5e0: 0x6d21fa20, 0x1f5e1: 0x6cf41020, 0x1f5e2: 0x6c752620, 0x1f5e3: 0x6d1ab620, - 0x1f5e4: 0x6ce3b820, 0x1f5e5: 0x6cd85620, 0x1f5e6: 0x6c68b420, 0x1f5e7: 0x6d196c20, - 0x1f5e8: 0x6c577020, 0x1f5e9: 0x6c0ad020, 0x1f5ea: 0x6d1c4620, 0x1f5eb: 0x6cdb7420, - 0x1f5ec: 0x6c5a3c20, 0x1f5ed: 0x6c38f820, 0x1f5ee: 0x6c68b620, 0x1f5ef: 0x6c8a5a20, - 0x1f5f0: 0x6d0f1820, 0x1f5f1: 0x6c42f820, 0x1f5f2: 0x6c704020, 0x1f5f3: 0x6cfbda20, - 0x1f5f4: 0x6cfbdc20, 0x1f5f5: 0x6ce90e20, 0x1f5f6: 0x6c971c20, 0x1f5f7: 0x6d420220, - 0x1f5f8: 0x6d248e20, 0x1f5f9: 0x6d1c4a20, 0x1f5fa: 0x6c934220, 0x1f5fb: 0x6ce97820, - 0x1f5fc: 0x6cfbde20, 0x1f5fd: 0x6d092e20, 0x1f5fe: 0x6d197820, 0x1f5ff: 0x6cb0e020, - // Block 0x7d8, offset 0x1f600 - 0x1f600: 0x6c1efc20, 0x1f601: 0x6c958c20, 0x1f602: 0x6cf75c20, 0x1f603: 0x6d15a220, - 0x1f604: 0x6c5fb220, 0x1f605: 0x6d2b2c20, 0x1f606: 0x6d220820, 0x1f607: 0x6d2dd220, - 0x1f608: 0x6d13a420, 0x1f609: 0x6d0ffa20, 0x1f60a: 0x6cb0e220, 0x1f60b: 0x6ca94420, - 0x1f60c: 0x6c56f420, 0x1f60d: 0x6c9cd220, 0x1f60e: 0x6d1c5020, 0x1f60f: 0x6c9bc420, - 0x1f610: 0x6c2bc220, 0x1f611: 0x6d273620, 0x1f612: 0x6d249020, 0x1f613: 0x6c831a20, - 0x1f614: 0x6c068620, 0x1f615: 0x6c91ae20, 0x1f616: 0x6c521220, 0x1f617: 0x6c902220, - 0x1f618: 0x6cd6cc20, 0x1f619: 0x6d274020, 0x1f61a: 0x6d1c5220, 0x1f61b: 0x6c49cc20, - 0x1f61c: 0x6cc23820, 0x1f61d: 0x6c84f220, 0x1f61e: 0x6c948820, 0x1f61f: 0x6ca78a20, - 0x1f620: 0x6c6f5a20, 0x1f621: 0x6c5e8820, 0x1f622: 0x6d24ca20, 0x1f623: 0x6c9fea20, - 0x1f624: 0x6cd1a020, 0x1f625: 0x6cab3620, 0x1f626: 0x6d0ada20, 0x1f627: 0x6c122620, - 0x1f628: 0x6c05ec20, 0x1f629: 0x6d322a20, 0x1f62a: 0x6c470420, 0x1f62b: 0x6c2fec20, - 0x1f62c: 0x6c914a20, 0x1f62d: 0x6d0ae420, 0x1f62e: 0x6cfeae20, 0x1f62f: 0x6d0f5820, - 0x1f630: 0x6c8cda20, 0x1f631: 0x6c1aa620, 0x1f632: 0x6cc18220, 0x1f633: 0x6d24d820, - 0x1f634: 0x6d090420, 0x1f635: 0x6ceb1220, 0x1f636: 0x6cd7de20, 0x1f637: 0x6d361220, - 0x1f638: 0x6c375620, 0x1f639: 0x6c485820, 0x1f63a: 0x6d04d220, 0x1f63b: 0x6c526620, - 0x1f63c: 0x6d388020, 0x1f63d: 0x6c438a20, 0x1f63e: 0x6c943820, 0x1f63f: 0x6c534820, - // Block 0x7d9, offset 0x1f640 - 0x1f640: 0x6cf3ce20, 0x1f641: 0x6c0f0c20, 0x1f642: 0x6c83dc20, 0x1f643: 0x6c72f820, - 0x1f644: 0x6c479a20, 0x1f645: 0x6c357220, 0x1f646: 0x6d236220, 0x1f647: 0x6cfb6820, - 0x1f648: 0x6ce33a20, 0x1f649: 0x6cf45420, 0x1f64a: 0x6cc42a20, 0x1f64b: 0x6c9e7a20, - 0x1f64c: 0x6c013e20, 0x1f64d: 0x6c7d7820, 0x1f64e: 0x6c06b420, 0x1f64f: 0x6caeb020, - 0x1f650: 0x6cb8fc20, 0x1f651: 0x6c219220, 0x1f652: 0x6c44d620, 0x1f653: 0x6d250220, - 0x1f654: 0x6cdadc20, 0x1f655: 0x6c558e20, 0x1f656: 0x6c516020, 0x1f657: 0x6c367e20, - 0x1f658: 0x6c47bc20, 0x1f659: 0x6cbfba20, 0x1f65a: 0x6c225a20, 0x1f65b: 0x6c9a1e20, - 0x1f65c: 0x6cf51220, 0x1f65d: 0x6d187820, 0x1f65e: 0x6d122020, 0x1f65f: 0x6cf23820, - 0x1f660: 0x6c8e9420, 0x1f661: 0x6c60a020, 0x1f662: 0x6d187a20, 0x1f663: 0x6c64ee20, - 0x1f664: 0x6c51e220, 0x1f665: 0x6d141c20, 0x1f666: 0x6d1bfa20, 0x1f667: 0x6d310420, - 0x1f668: 0x6c8f4420, 0x1f669: 0x6c8a2e20, 0x1f66a: 0x6c689220, 0x1f66b: 0x6c703020, - 0x1f66c: 0x6d242a20, 0x1f66d: 0x6c931820, 0x1f66e: 0x6c58b420, 0x1f66f: 0x6d2db020, - 0x1f670: 0x6d1c0c20, 0x1f671: 0x6c56da20, 0x1f672: 0x6c9b8020, 0x1f673: 0x6c49c020, - 0x1f674: 0x6cd6ba20, 0x1f675: 0x6c91bc20, 0x1f676: 0x6c6c5820, 0x1f677: 0x6c8d6820, - 0x1f678: 0x6c661220, 0x1f679: 0x6cfbd020, 0x1f67a: 0x6c25fe20, 0x1f67b: 0x6c662620, - 0x1f67c: 0x6c664020, 0x1f67d: 0x6d0d1a20, 0x1f67e: 0x6c25f420, 0x1f67f: 0x6c924c20, - // Block 0x7da, offset 0x1f680 - 0x1f680: 0x6d1eaa20, 0x1f681: 0x6c241620, 0x1f682: 0x6c614c20, 0x1f683: 0x6cad6820, - 0x1f684: 0x6c241820, 0x1f685: 0x6cad6c20, 0x1f686: 0x6d3b3220, 0x1f687: 0x6c758220, - 0x1f688: 0x6d3a8220, 0x1f689: 0x6c651020, 0x1f68a: 0x6c9c8420, 0x1f68b: 0x6c9c8620, - 0x1f68c: 0x6d22a820, 0x1f68d: 0x6c8ec820, 0x1f68e: 0x6c18f420, 0x1f68f: 0x6c758a20, - 0x1f690: 0x6c8bf620, 0x1f691: 0x6ca61a20, 0x1f692: 0x6cb69420, 0x1f693: 0x6c932c20, - 0x1f694: 0x6c703a20, 0x1f695: 0x6c758c20, 0x1f696: 0x6c6df020, 0x1f697: 0x6c871420, - 0x1f698: 0x6cfd9820, 0x1f699: 0x6cfbd220, 0x1f69a: 0x6c639020, 0x1f69b: 0x6c9ca620, - 0x1f69c: 0x6c875e20, 0x1f69d: 0x6ccf8e20, 0x1f69e: 0x6d2ef220, 0x1f69f: 0x6c8c1020, - 0x1f6a0: 0x6c6dfa20, 0x1f6a1: 0x6cb6b620, 0x1f6a2: 0x6c8de220, 0x1f6a3: 0x6d0d2820, - 0x1f6a4: 0x6c241a20, 0x1f6a5: 0x6c973220, 0x1f6a6: 0x6c972620, 0x1f6a7: 0x6c516220, - 0x1f6a8: 0x6c17a620, 0x1f6a9: 0x6c3d9c20, 0x1f6aa: 0x6c9e5e20, 0x1f6ab: 0x6c9e3e20, - 0x1f6ac: 0x6c3da820, 0x1f6ad: 0x6cad9c20, 0x1f6ae: 0x6cc27e20, 0x1f6af: 0x6cc14c20, - 0x1f6b0: 0x6ca1f420, 0x1f6b1: 0x6c3db020, 0x1f6b2: 0x6cfd2c20, 0x1f6b3: 0x6c7f3420, - 0x1f6b4: 0x6cc15820, 0x1f6b5: 0x6c9e6a20, 0x1f6b6: 0x6c1ca620, 0x1f6b7: 0x6c3c9420, - 0x1f6b8: 0x6c3d6e20, 0x1f6b9: 0x6cc14020, 0x1f6ba: 0x6c9e6420, 0x1f6bb: 0x6c966820, - 0x1f6bc: 0x6c99c420, 0x1f6bd: 0x6ca07020, 0x1f6be: 0x6c5af020, 0x1f6bf: 0x6ca1b820, - // Block 0x7db, offset 0x1f6c0 - 0x1f6c0: 0x6d407020, 0x1f6c1: 0x6caaae20, 0x1f6c2: 0x6c3bb420, 0x1f6c3: 0x6c59ce20, - 0x1f6c4: 0x6c59b820, 0x1f6c5: 0x6c6c5a20, 0x1f6c6: 0x6c49f620, 0x1f6c7: 0x6ce47420, - 0x1f6c8: 0x6ce81c20, 0x1f6c9: 0x6c538c20, 0x1f6ca: 0x6c57c820, 0x1f6cb: 0x6c7c0820, - 0x1f6cc: 0x6c539a20, 0x1f6cd: 0x6cd56020, 0x1f6ce: 0x6c843a20, 0x1f6cf: 0x6ca70a20, - 0x1f6d0: 0x6c1af220, 0x1f6d1: 0x6c521c20, 0x1f6d2: 0x6c521a20, 0x1f6d3: 0x6d187c20, - 0x1f6d4: 0x6cb9ce20, 0x1f6d5: 0x6c284820, 0x1f6d6: 0x6cf8ea20, 0x1f6d7: 0x6cea2e20, - 0x1f6d8: 0x6ca17020, 0x1f6d9: 0x6ca15020, 0x1f6da: 0x6cb9d220, 0x1f6db: 0x6c279e20, - 0x1f6dc: 0x6c1f8420, 0x1f6dd: 0x6d1ff620, 0x1f6de: 0x6c2d2e20, 0x1f6df: 0x6d143020, - 0x1f6e0: 0x6cfa1220, 0x1f6e1: 0x6d0df220, 0x1f6e2: 0x6cc15a20, 0x1f6e3: 0x6c9a7220, - 0x1f6e4: 0x6d0e0a20, 0x1f6e5: 0x6cbe9420, 0x1f6e6: 0x6d271220, 0x1f6e7: 0x6c84a220, - 0x1f6e8: 0x6c293820, 0x1f6e9: 0x6c31ec20, 0x1f6ea: 0x6c11e820, 0x1f6eb: 0x6d0c4820, - 0x1f6ec: 0x6d0d0820, 0x1f6ed: 0x6d0e1420, 0x1f6ee: 0x6c285820, 0x1f6ef: 0x6c01e420, - 0x1f6f0: 0x6d320a20, 0x1f6f1: 0x6c27ac20, 0x1f6f2: 0x6c11ea20, 0x1f6f3: 0x6d144020, - 0x1f6f4: 0x6c9a4620, 0x1f6f5: 0x6d2e4220, 0x1f6f6: 0x6d0e3420, 0x1f6f7: 0x6c320e20, - 0x1f6f8: 0x6c91b020, 0x1f6f9: 0x6d353420, 0x1f6fa: 0x6c3bc220, 0x1f6fb: 0x6c3f1020, - 0x1f6fc: 0x6c3f9820, 0x1f6fd: 0x6c9e3220, 0x1f6fe: 0x6c9e0a20, 0x1f6ff: 0x6d25bc20, - // Block 0x7dc, offset 0x1f700 - 0x1f700: 0x6c247220, 0x1f701: 0x6cc28420, 0x1f702: 0x6c178820, 0x1f703: 0x6cebfc20, - 0x1f704: 0x6d39e620, 0x1f705: 0x6d342a20, 0x1f706: 0x6c9bbe20, 0x1f707: 0x6c029420, - 0x1f708: 0x6c0cd020, 0x1f709: 0x6ceb6a20, 0x1f70a: 0x6c0ada20, 0x1f70b: 0x6d257220, - 0x1f70c: 0x6c176620, 0x1f70d: 0x6ceb5e20, 0x1f70e: 0x6c2f7420, 0x1f70f: 0x6c9d7420, - 0x1f710: 0x6ca3d020, 0x1f711: 0x6c2f7c20, 0x1f712: 0x6d3e8420, 0x1f713: 0x6c47a620, - 0x1f714: 0x6c47a820, 0x1f715: 0x6c302220, 0x1f716: 0x6c3ba420, 0x1f717: 0x6ce25020, - 0x1f718: 0x6d252820, 0x1f719: 0x6cb03a20, 0x1f71a: 0x6c168e20, 0x1f71b: 0x6c42f620, - 0x1f71c: 0x6cb80820, 0x1f71d: 0x6d252a20, 0x1f71e: 0x6ce0e220, 0x1f71f: 0x6ce29820, - 0x1f720: 0x6cd56620, 0x1f721: 0x6cd55220, 0x1f722: 0x6c3b9e20, 0x1f723: 0x6c3adc20, - 0x1f724: 0x6cf1be20, 0x1f725: 0x6c039620, 0x1f726: 0x6c2dea20, 0x1f727: 0x6ceb5a20, - 0x1f728: 0x6d37d420, 0x1f729: 0x6cc1ee20, 0x1f72a: 0x6cd11a20, 0x1f72b: 0x6cd28e20, - 0x1f72c: 0x6d205e20, 0x1f72d: 0x6cd29420, 0x1f72e: 0x6ce69e20, 0x1f72f: 0x6cf40c20, - 0x1f730: 0x6ca77220, 0x1f731: 0x6c6df620, 0x1f732: 0x6c5d1020, 0x1f733: 0x6c719820, - 0x1f734: 0x6d0e1e20, 0x1f735: 0x6ce88020, 0x1f736: 0x6cd85c20, 0x1f737: 0x6cf75420, - 0x1f738: 0x6cfd4e20, 0x1f739: 0x6d0e2820, 0x1f73a: 0x6c82ae20, 0x1f73b: 0x6c08a220, - 0x1f73c: 0x6d11da20, 0x1f73d: 0x6cc0a220, 0x1f73e: 0x6c4dc020, 0x1f73f: 0x6cf53a20, - // Block 0x7dd, offset 0x1f740 - 0x1f740: 0x6cf54220, 0x1f741: 0x6c53e620, 0x1f742: 0x6d028620, 0x1f743: 0x6c36f820, - 0x1f744: 0x6d2c1020, 0x1f745: 0x6d055c20, 0x1f746: 0x6cf27820, 0x1f747: 0x6d2c1220, - 0x1f748: 0x6ca9f820, 0x1f749: 0x6ca48c20, 0x1f74a: 0x6cb63420, 0x1f74b: 0x6d2d0020, - 0x1f74c: 0x6c62b620, 0x1f74d: 0x6d3ebe20, 0x1f74e: 0x6c5f9c20, 0x1f74f: 0x6c5fac20, - 0x1f750: 0x6cb56c20, 0x1f751: 0x6c5f2820, 0x1f752: 0x6c1bc220, 0x1f753: 0x6c193020, - 0x1f754: 0x6c193420, 0x1f755: 0x6c519220, 0x1f756: 0x6d0b3a20, 0x1f757: 0x6d1aae20, - 0x1f758: 0x6d026c20, 0x1f759: 0x6c05c020, 0x1f75a: 0x6d2b2620, 0x1f75b: 0x6d027620, - 0x1f75c: 0x6c148c20, 0x1f75d: 0x6c1aec20, 0x1f75e: 0x6d0e0c20, 0x1f75f: 0x6c71e020, - 0x1f760: 0x6ce5b220, 0x1f761: 0x6c8d9620, 0x1f762: 0x6c8d7820, 0x1f763: 0x6c1e6e20, - 0x1f764: 0x6cc33220, 0x1f765: 0x6d027e20, 0x1f766: 0x6c791420, 0x1f767: 0x6ca8ae20, - 0x1f768: 0x6c703e20, 0x1f769: 0x6d11e420, 0x1f76a: 0x6c21e820, 0x1f76b: 0x6c7dc820, - 0x1f76c: 0x6d22b220, 0x1f76d: 0x6c1efa20, 0x1f76e: 0x6d163020, 0x1f76f: 0x6ca61c20, - 0x1f770: 0x6d2b2a20, 0x1f771: 0x6d407820, 0x1f772: 0x6cc25820, 0x1f773: 0x6d281020, - 0x1f774: 0x6d0e3020, 0x1f775: 0x6cab6e20, 0x1f776: 0x6c36fe20, 0x1f777: 0x6cf33820, - 0x1f778: 0x6d198020, 0x1f779: 0x6c221a20, 0x1f77a: 0x6d407a20, 0x1f77b: 0x6c2d0020, - 0x1f77c: 0x6c1efe20, 0x1f77d: 0x6c6d7a20, 0x1f77e: 0x6d0bd420, 0x1f77f: 0x6c1b8020, - // Block 0x7de, offset 0x1f780 - 0x1f780: 0x6c192420, 0x1f781: 0x6c512220, 0x1f782: 0x6d1a6e20, 0x1f783: 0x6c71c620, - 0x1f784: 0x6c8d3220, 0x1f785: 0x6c05b620, 0x1f786: 0x6ce59620, 0x1f787: 0x6d3e7820, - 0x1f788: 0x6c790620, 0x1f789: 0x6d228620, 0x1f78a: 0x6c21d420, 0x1f78b: 0x6cc25220, - 0x1f78c: 0x6cf32620, 0x1f78d: 0x6c8fb020, 0x1f78e: 0x6cad1420, 0x1f78f: 0x6c45c020, - 0x1f790: 0x6cad1620, 0x1f791: 0x6d0e0e20, 0x1f792: 0x6c8ff220, 0x1f793: 0x6c904820, - 0x1f794: 0x6c45c820, 0x1f795: 0x6c76b820, 0x1f796: 0x6c26dc20, 0x1f797: 0x6c8e0020, - 0x1f798: 0x6c26de20, 0x1f799: 0x6c8f6620, 0x1f79a: 0x6c458620, 0x1f79b: 0x6c76a820, - 0x1f79c: 0x6c4a9620, 0x1f79d: 0x6cbfea20, 0x1f79e: 0x6c0cd620, 0x1f79f: 0x6c4a3820, - 0x1f7a0: 0x6d26f620, 0x1f7a1: 0x6c20f820, 0x1f7a2: 0x6c51aa20, 0x1f7a3: 0x6c753020, - 0x1f7a4: 0x6d013c20, 0x1f7a5: 0x6d249820, - // Block 0x7df, offset 0x1f7c0 - 0x1f7c3: 0x6ccd4220, - // Block 0x7e0, offset 0x1f800 - 0x1f800: 0x6cb6e820, 0x1f801: 0x6c452620, 0x1f802: 0x6c17ce20, 0x1f803: 0x6c642020, - 0x1f804: 0x6c573e20, 0x1f805: 0x6c202c20, 0x1f806: 0x6c71ea20, 0x1f807: 0x6c4a9620, - 0x1f808: 0x6c4a9620, 0x1f809: 0x6cb75220, 0x1f80a: 0x6c6c2e20, 0x1f80b: 0x6c7e6220, - 0x1f80c: 0x6ca3ac20, 0x1f80d: 0x6c804a20, 0x1f80e: 0x6c7f7820, 0x1f80f: 0x6c956220, - 0x1f810: 0x6c957a20, 0x1f811: 0x6c955820, 0x1f812: 0x6c95b820, 0x1f813: 0x6c957c20, - 0x1f814: 0x6c822620, 0x1f815: 0x6c95e820, 0x1f816: 0x6c81d020, 0x1f817: 0x6c95f620, - 0x1f818: 0x6c960a20, 0x1f819: 0x6c81d620, 0x1f81a: 0x6c962a20, 0x1f81b: 0x6c949a20, - 0x1f81c: 0x6c948c20, 0x1f81d: 0x6c7ff820, 0x1f81e: 0x6c808820, 0x1f81f: 0x6c7ff020, - 0x1f820: 0x6c948820, 0x1f821: 0x6c7f9a20, 0x1f822: 0x6c807c20, 0x1f823: 0x6c7fc420, - 0x1f824: 0x6c7fd820, 0x1f825: 0x6c7e3e20, 0x1f826: 0x6c7eaa20, 0x1f827: 0x6c7ec420, - 0x1f828: 0x6c80b420, 0x1f829: 0x6c80f820, 0x1f82a: 0x6c811820, 0x1f82b: 0x6c80ae20, - 0x1f82c: 0x6c80a220, 0x1f82d: 0x6c7ee220, 0x1f82e: 0x6c839020, 0x1f82f: 0x6c815620, - 0x1f830: 0x6c91da20, 0x1f831: 0x6c91f220, 0x1f832: 0x6c918420, 0x1f833: 0x6c915c20, - 0x1f834: 0x6c819a20, 0x1f835: 0x6c917820, 0x1f836: 0x6c91c420, 0x1f837: 0x6c927620, - 0x1f838: 0x6c933620, 0x1f839: 0x6c91d420, 0x1f83a: 0x6c934220, 0x1f83b: 0x6c926e20, - 0x1f83c: 0x6c925a20, 0x1f83d: 0x6c93ec20, 0x1f83e: 0x6c924820, 0x1f83f: 0x6c92de20, - // Block 0x7e1, offset 0x1f840 - 0x1f840: 0x6c924c20, 0x1f841: 0x6c952620, 0x1f842: 0x6c903e20, 0x1f843: 0x6ca9f020, - 0x1f844: 0x6c8ff420, 0x1f845: 0x6c8ff820, 0x1f846: 0x6c814220, 0x1f847: 0x6c82d220, - 0x1f848: 0x6c927420, 0x1f849: 0x6c823e20, 0x1f84a: 0x6c82e220, 0x1f84b: 0x6c93a620, - 0x1f84c: 0x6c90b020, 0x1f84d: 0x6c833020, 0x1f84e: 0x6c910e20, 0x1f84f: 0x6c833420, - 0x1f850: 0x6c93bc20, 0x1f851: 0x6c910220, 0x1f852: 0x6c823c20, 0x1f853: 0x6c81fe20, - 0x1f854: 0x6c8c2820, 0x1f855: 0x6c8cc420, 0x1f856: 0x6c837e20, 0x1f857: 0x6c8d3c20, - 0x1f858: 0x6c8cfe20, 0x1f859: 0x6c8cd820, 0x1f85a: 0x6c31f020, 0x1f85b: 0x6ca2d020, - 0x1f85c: 0x6c822620, 0x1f85d: 0x6cab0e20, 0x1f85e: 0x6c27b220, 0x1f85f: 0x6ca91020, - 0x1f860: 0x6caa5e20, 0x1f861: 0x6c93d620, 0x1f862: 0x6d176620, 0x1f863: 0x6c06c620, - 0x1f864: 0x6cac7620, 0x1f865: 0x6c0b8220, 0x1f866: 0x6c3ff020, 0x1f867: 0x6c105620, - 0x1f868: 0x6c9d2620, 0x1f869: 0x6cd60020, 0x1f86a: 0x6cdd5a20, 0x1f86b: 0x6c115e20, - 0x1f86c: 0x6cc9c620, 0x1f86d: 0x6cd12c20, 0x1f86e: 0x6d12f620, 0x1f86f: 0x6cd76a20, - 0x1f870: 0x6ccbda20, 0x1f871: 0x6c18a020, 0x1f872: 0x6c189c20, 0x1f873: 0x6cd41020, - 0x1f874: 0x6cc91420, 0x1f875: 0x6c361020, 0x1f876: 0x6c361220, 0x1f877: 0x6c89aa20, - 0x1f878: 0x6c898820, 0x1f879: 0x6c894a20, 0x1f87a: 0x6c894c20, 0x1f87b: 0x6c897420, - 0x1f87c: 0x6c894620, 0x1f87d: 0x6c89c820, 0x1f87e: 0x6c89c020, 0x1f87f: 0x6c867020, - // Block 0x7e2, offset 0x1f880 - 0x1f880: 0x6c937620, 0x1f881: 0x6caa6e20, 0x1f882: 0x6c916e20, 0x1f883: 0x6c938a20, - 0x1f884: 0x6c940e20, 0x1f885: 0x6c870420, 0x1f886: 0x6c935a20, 0x1f887: 0x6c84ee20, - 0x1f888: 0x6c871420, 0x1f889: 0x6c843a20, 0x1f88a: 0x6c855c20, 0x1f88b: 0x6c867820, - 0x1f88c: 0x6c867c20, 0x1f88d: 0x6c878420, 0x1f88e: 0x6ca6f220, 0x1f88f: 0x6c883620, - 0x1f890: 0x6c893820, 0x1f891: 0x6ca73420, 0x1f892: 0x6c881620, 0x1f893: 0x6c890620, - 0x1f894: 0x6c88c420, 0x1f895: 0x6ca6f620, 0x1f896: 0x6c891220, 0x1f897: 0x6c886820, - 0x1f898: 0x6ca73a20, 0x1f899: 0x6c881820, 0x1f89a: 0x6c87fa20, 0x1f89b: 0x6c892220, - 0x1f89c: 0x6c8abc20, 0x1f89d: 0x6c8abe20, 0x1f89e: 0x6d0e4220, 0x1f89f: 0x6c8af020, - 0x1f8a0: 0x6c8b1020, 0x1f8a1: 0x6cd76a20, 0x1f8a2: 0x6c881020, 0x1f8a3: 0x6ca75a20, - 0x1f8a4: 0x6ca72020, 0x1f8a5: 0x6c892020, 0x1f8a6: 0x6c888420, 0x1f8a7: 0x6c8b5420, - 0x1f8a8: 0x6c8e1820, 0x1f8a9: 0x6c8c9e20, 0x1f8aa: 0x6ca91020, 0x1f8ab: 0x6c8e1420, - 0x1f8ac: 0x6c87f420, 0x1f8ad: 0x6c8cbe20, 0x1f8ae: 0x6d1c8a20, 0x1f8af: 0x6c8cf620, - 0x1f8b0: 0x6c8cfa20, 0x1f8b1: 0x6c8d2420, 0x1f8b2: 0x6c8d2a20, 0x1f8b3: 0x6c8db620, - 0x1f8b4: 0x6c8e1220, 0x1f8b5: 0x6c858620, 0x1f8b6: 0x6c853820, 0x1f8b7: 0x6c854620, - 0x1f8b8: 0x6c86b420, 0x1f8b9: 0x6c363420, 0x1f8ba: 0x6c823620, 0x1f8bb: 0x6c89ec20, - 0x1f8bc: 0x6c8a0620, 0x1f8bd: 0x6ca7d020, 0x1f8be: 0x6c8a9420, 0x1f8bf: 0x6c822620, - // Block 0x7e3, offset 0x1f8c0 - 0x1f8c0: 0x6c8a1a20, 0x1f8c1: 0x6c8a2620, 0x1f8c2: 0x6c8a7220, 0x1f8c3: 0x6c8a1620, - 0x1f8c4: 0x6c8fb020, 0x1f8c5: 0x6d275420, 0x1f8c6: 0x6cc84c20, 0x1f8c7: 0x6c8e8020, - 0x1f8c8: 0x6c1e2020, 0x1f8c9: 0x6c8efa20, 0x1f8ca: 0x6c8e4a20, 0x1f8cb: 0x6c8e3620, - 0x1f8cc: 0x6c8e5020, 0x1f8cd: 0x6c8e4c20, 0x1f8ce: 0x6c8e5c20, 0x1f8cf: 0x6ca99020, - 0x1f8d0: 0x6c835420, 0x1f8d1: 0x6c8f2420, 0x1f8d2: 0x6c92a020, 0x1f8d3: 0x6c923020, - 0x1f8d4: 0x6c94e420, 0x1f8d5: 0x6c94f020, 0x1f8d6: 0x6c94f420, 0x1f8d7: 0x6c950e20, - 0x1f8d8: 0x6c93d020, 0x1f8d9: 0x6c862e20, 0x1f8da: 0x6c85ca20, 0x1f8db: 0x6c93d620, - 0x1f8dc: 0x6c8f9220, 0x1f8dd: 0x6c857620, 0x1f8de: 0x6c856e20, 0x1f8df: 0x6c93ae20, - 0x1f8e0: 0x6d16ba20, 0x1f8e1: 0x6c87d820, 0x1f8e2: 0x6c83bc20, 0x1f8e3: 0x6ca5c020, - 0x1f8e4: 0x6c851420, 0x1f8e5: 0x6c861220, 0x1f8e6: 0x6c844a20, 0x1f8e7: 0x6c852220, - 0x1f8e8: 0x6c87e220, 0x1f8e9: 0x6c84fc20, 0x1f8ea: 0x6c847e20, 0x1f8eb: 0x6ca68c20, - 0x1f8ec: 0x6ca6ac20, 0x1f8ed: 0x6c8c4420, 0x1f8ee: 0x6c8bde20, 0x1f8ef: 0x6c8be020, - 0x1f8f0: 0x6c8c7a20, 0x1f8f1: 0x6c8bca20, 0x1f8f2: 0x6c8c0c20, 0x1f8f3: 0x6c8c1020, - 0x1f8f4: 0x6c8ba020, 0x1f8f5: 0x6c8bb020, 0x1f8f6: 0x6c8bea20, 0x1f8f7: 0x6c856c20, - 0x1f8f8: 0x6c85f620, 0x1f8f9: 0x6c85f820, 0x1f8fa: 0x6d3c3420, 0x1f8fb: 0x6d358c20, - 0x1f8fc: 0x6cd42220, 0x1f8fd: 0x6cd03620, 0x1f8fe: 0x6c13d020, 0x1f8ff: 0x6c22b220, - // Block 0x7e4, offset 0x1f900 - 0x1f900: 0x6cbc9020, 0x1f901: 0x6c324420, 0x1f902: 0x6cde2e20, 0x1f903: 0x6ce13620, - 0x1f904: 0x6d2d1820, 0x1f905: 0x6c306420, 0x1f906: 0x6c066220, 0x1f907: 0x6c3efc20, - 0x1f908: 0x6d03ba20, 0x1f909: 0x6c67d620, 0x1f90a: 0x6c665220, 0x1f90b: 0x6c7e0420, - 0x1f90c: 0x6cf49020, 0x1f90d: 0x6c56a220, 0x1f90e: 0x43f41c20, 0x1f90f: 0x43f41e20, - 0x1f910: 0x6d37f420, 0x1f911: 0x43f42220, 0x1f912: 0x6cbe7a20, 0x1f913: 0x43f42620, - 0x1f914: 0x43f42820, 0x1f915: 0x6cf6b620, 0x1f916: 0x6d399820, 0x1f917: 0x6d173820, - 0x1f918: 0x6c84f420, 0x1f919: 0x6cd03a20, 0x1f91a: 0x6cfdbc20, 0x1f91b: 0x6c3e9c20, - 0x1f91c: 0x6c6e9220, 0x1f91d: 0x6c6dcc20, 0x1f91e: 0x6d221c20, 0x1f91f: 0x43f43e20, - 0x1f920: 0x6cc0c220, 0x1f921: 0x43f44220, 0x1f922: 0x6d39c620, 0x1f923: 0x43f44620, - 0x1f924: 0x43f44820, 0x1f925: 0x6d178420, 0x1f926: 0x6c30a620, 0x1f927: 0x43f44e20, - 0x1f928: 0x43f45020, 0x1f929: 0x43f45220, 0x1f92a: 0x6c395c20, 0x1f92b: 0x6cd8d420, - 0x1f92c: 0x6c496820, 0x1f92d: 0x6c520c20, 0x1f92e: 0x6c80a420, 0x1f92f: 0x6c868820, - 0x1f930: 0x6cf43220, 0x1f931: 0x6ccbb820, 0x1f932: 0x6c9dfe20, 0x1f933: 0x6c9e0c20, - 0x1f934: 0x6cbd7c20, 0x1f935: 0x6c068e20, 0x1f936: 0x6c509c20, 0x1f937: 0x6ce0a020, - 0x1f938: 0x6cb7ce20, 0x1f939: 0x6cb2ec20, 0x1f93a: 0x6ca16020, 0x1f93b: 0x6c135420, - 0x1f93c: 0x6c17fa20, 0x1f93d: 0x6c5b4c20, 0x1f93e: 0x6c765820, 0x1f93f: 0x6d2b8a20, - // Block 0x7e5, offset 0x1f940 - 0x1f940: 0x6c1a5420, 0x1f941: 0x6c9fa820, 0x1f942: 0x6c61a820, 0x1f943: 0x6cd55a20, - 0x1f944: 0x6c99ec20, 0x1f945: 0x6c4d3a20, 0x1f946: 0x6d3a6420, 0x1f947: 0x6c4ee620, - 0x1f948: 0x6d3a6e20, 0x1f949: 0x6d2ff420, 0x1f94a: 0x6d423c20, 0x1f94b: 0x6c06b020, - 0x1f94c: 0x6ccf3620, 0x1f94d: 0x6d34f820, 0x1f94e: 0x6cb58a20, 0x1f94f: 0x6d203020, - 0x1f950: 0x6d411420, 0x1f951: 0x6d3ac620, 0x1f952: 0x6c5dd420, 0x1f953: 0x6d316e20, - 0x1f954: 0x6c47c420, 0x1f955: 0x6ce84420, 0x1f956: 0x6c6af220, 0x1f957: 0x6c891220, - 0x1f958: 0x6c6d5220, 0x1f959: 0x6c38ca20, 0x1f95a: 0x6cd56220, 0x1f95b: 0x6d30d220, - 0x1f95c: 0x6c1e4020, 0x1f95d: 0x6c12c020, 0x1f95e: 0x6c12c020, 0x1f95f: 0x6d311420, - 0x1f960: 0x6c51d620, 0x1f961: 0x6cd36c20, 0x1f962: 0x6d134620, 0x1f963: 0x6c6cc220, - 0x1f964: 0x6c0d4a20, 0x1f965: 0x6d2bb620, 0x1f966: 0x6c21a420, 0x1f967: 0x6d178420, - 0x1f968: 0x6ca41420, 0x1f969: 0x6cfe0a20, 0x1f96a: 0x6cb21420, 0x1f96b: 0x6c5baa20, - 0x1f96c: 0x4885dc20, 0x1f96d: 0x6c496420, - 0x1f970: 0x6c0e0820, 0x1f971: 0x6c7bdc20, 0x1f972: 0x6cc2b220, 0x1f973: 0x6d03c620, - 0x1f974: 0x6c1ca820, 0x1f975: 0x6c627020, 0x1f976: 0x6d1e1820, 0x1f977: 0x6cce9420, - 0x1f978: 0x6c509c20, 0x1f979: 0x6ce21620, 0x1f97a: 0x6c5bbc20, 0x1f97b: 0x6cec3420, - 0x1f97c: 0x6d37f420, 0x1f97d: 0x6c3b8420, 0x1f97e: 0x6d0d4620, 0x1f97f: 0x6c077c20, - // Block 0x7e6, offset 0x1f980 - 0x1f980: 0x6c097420, 0x1f981: 0x6c226820, 0x1f982: 0x6c025020, 0x1f983: 0x6d182220, - 0x1f984: 0x6c112620, 0x1f985: 0x6d110c20, 0x1f986: 0x6cee0e20, 0x1f987: 0x6cd0ac20, - 0x1f988: 0x6d236a20, 0x1f989: 0x6d2b8a20, 0x1f98a: 0x6c02d820, 0x1f98b: 0x6c1a5420, - 0x1f98c: 0x6c279420, 0x1f98d: 0x6d212620, 0x1f98e: 0x6cd9b020, 0x1f98f: 0x6c0de620, - 0x1f990: 0x6c024020, 0x1f991: 0x6cbe7a20, 0x1f992: 0x6c80f820, 0x1f993: 0x6cee5220, - 0x1f994: 0x6d2f2220, 0x1f995: 0x6c271220, 0x1f996: 0x6ccbda20, 0x1f997: 0x6c8e4a20, - 0x1f998: 0x6d1a7020, 0x1f999: 0x6d3e4020, 0x1f99a: 0x6c4ee620, 0x1f99b: 0x6c6eb420, - 0x1f99c: 0x6d3a6e20, 0x1f99d: 0x6cbc0220, 0x1f99e: 0x6c74c820, 0x1f99f: 0x6c391620, - 0x1f9a0: 0x6d399820, 0x1f9a1: 0x6d325020, 0x1f9a2: 0x6c225020, 0x1f9a3: 0x6c578420, - 0x1f9a4: 0x6c492220, 0x1f9a5: 0x6cf16020, 0x1f9a6: 0x6d173820, 0x1f9a7: 0x6cd15e20, - 0x1f9a8: 0x6d344020, 0x1f9a9: 0x6c736420, 0x1f9aa: 0x6d311220, 0x1f9ab: 0x6ce4ba20, - 0x1f9ac: 0x6ce5cc20, 0x1f9ad: 0x6c6af220, 0x1f9ae: 0x6c832420, 0x1f9af: 0x6ce1c820, - 0x1f9b0: 0x6c891220, 0x1f9b1: 0x6cb2ac20, 0x1f9b2: 0x6d30d220, 0x1f9b3: 0x6c598420, - 0x1f9b4: 0x6c573420, 0x1f9b5: 0x6d276220, 0x1f9b6: 0x6cbb4c20, 0x1f9b7: 0x6c407e20, - 0x1f9b8: 0x6cd36c20, 0x1f9b9: 0x6c2e3820, 0x1f9ba: 0x6d39c620, 0x1f9bb: 0x6cbeb220, - 0x1f9bc: 0x6d134620, 0x1f9bd: 0x6cab0e20, 0x1f9be: 0x6d23f620, 0x1f9bf: 0x6c6cc220, - // Block 0x7e7, offset 0x1f9c0 - 0x1f9c0: 0x6c0bdc20, 0x1f9c1: 0x6d2bb620, 0x1f9c2: 0x6cd50820, 0x1f9c3: 0x6c1b5020, - 0x1f9c4: 0x6cd9e620, 0x1f9c5: 0x6d03f420, 0x1f9c6: 0x6d3a6220, 0x1f9c7: 0x6ca41420, - 0x1f9c8: 0x6c6e9220, 0x1f9c9: 0x6c046220, 0x1f9ca: 0x6cfe0a20, 0x1f9cb: 0x6c35b420, - 0x1f9cc: 0x6cb21420, 0x1f9cd: 0x6d320420, 0x1f9ce: 0x6c4a9620, 0x1f9cf: 0x48509420, - 0x1f9d0: 0x48508820, 0x1f9d1: 0x4867aa20, 0x1f9d2: 0x6c513820, 0x1f9d3: 0x6d008620, - 0x1f9d4: 0x6c6ad220, 0x1f9d5: 0x48a49220, 0x1f9d6: 0x6cba2c20, 0x1f9d7: 0x6c084620, - 0x1f9d8: 0x6c36f820, 0x1f9d9: 0x6cad1420, - // Block 0x7e8, offset 0x1fa00 - 0x1fa00: 0xf0001c1c, 0x1fa01: 0xf0001c1c, 0x1fa02: 0x00658c9c, - 0x1fa10: 0x2cd43683, 0x1fa11: 0x2d3f2883, 0x1fa12: 0x2cd6a083, 0x1fa13: 0xf0001c1c, - 0x1fa14: 0x2c37b483, 0x1fa15: 0x2c341683, 0x1fa16: 0x2c6b9883, 0x1fa17: 0x2ce45483, - 0x1fa18: 0x2c682283, 0x1fa19: 0x2d1d3483, 0x1fa1a: 0x2cf3c883, 0x1fa1b: 0x2c8a9483, - 0x1fa1c: 0x2cb97883, 0x1fa1d: 0x2c546483, 0x1fa1e: 0x2d292683, 0x1fa1f: 0x2d02dc83, - 0x1fa20: 0x2c1e5483, 0x1fa21: 0x2d37b683, 0x1fa22: 0x2cd0d283, 0x1fa23: 0x2c395083, - 0x1fa24: 0x2cd0dc83, 0x1fa25: 0x2c20b483, 0x1fa26: 0x2d0db483, 0x1fa27: 0x2ce7e683, - 0x1fa28: 0x2c103683, 0x1fa29: 0x2d13b683, 0x1fa2a: 0x2cc9f283, 0x1fa2b: 0x2d1f4083, - 0x1fa2c: 0x2d426083, 0x1fa2d: 0x2d378283, 0x1fa2e: 0x2d200883, 0x1fa2f: 0x2d350083, - 0x1fa30: 0x2d407e83, 0x1fa31: 0x2c26e083, 0x1fa32: 0x2c6d1a83, 0x1fa33: 0x2c796883, - 0x1fa34: 0x2c50b683, 0x1fa35: 0x2c97ba83, 0x1fa36: 0x2d1f9883, 0x1fa37: 0x2d266883, - 0x1fa38: 0x2ccf9a83, 0x1fa39: 0x2c438c83, 0x1fa3a: 0x2d1c6283, - // Block 0x7e9, offset 0x1fa40 - 0x1fa40: 0xe000b460, 0x1fa41: 0xe000b474, 0x1fa42: 0xe000b470, 0x1fa43: 0xe000b458, - 0x1fa44: 0xe000b46c, 0x1fa45: 0xe000b464, 0x1fa46: 0xe000b468, 0x1fa47: 0xe000b478, - 0x1fa48: 0xe000b45c, - 0x1fa50: 0x2c2a9083, 0x1fa51: 0x2c785283, - // Block 0x7ea, offset 0x1fa80 - 0x1fa80: 0x6c508820, 0x1fa81: 0x6cb4c820, 0x1fa83: 0x6cbc8c20, - 0x1fa85: 0x6c4d4c20, - 0x1fa89: 0x6cbf9020, 0x1fa8a: 0x6c126420, - 0x1fa8d: 0x6cd2ec20, - 0x1fa93: 0x6cd7ba20, - 0x1fa94: 0x6c73ca20, - 0x1fa9b: 0x6d22c020, - 0x1fa9d: 0x6c796620, - 0x1faa2: 0x6d3dfc20, - 0x1faa6: 0x6d03be20, - 0x1fab1: 0x6ca1fc20, - 0x1fab7: 0x6c5e9420, - 0x1fab8: 0x6d12d220, 0x1fab9: 0x6c755e20, - 0x1fabc: 0x6cb97c20, 0x1fabd: 0x6c922420, - // Block 0x7eb, offset 0x1fac0 - 0x1fac9: 0x6c1e5e20, - 0x1fad7: 0x6cd3d420, - 0x1fae0: 0x6cbd0220, - 0x1fae5: 0x6c40ce20, - 0x1faed: 0x6cb58e20, - 0x1faf7: 0x6c15c420, - // Block 0x7ec, offset 0x1fb00 - 0x1fb04: 0x6c582a20, 0x1fb06: 0x6d163620, 0x1fb07: 0x6d425e20, - 0x1fb08: 0x6c6a4a20, - 0x1fb11: 0x6d404420, - 0x1fb14: 0x6d3ed420, - 0x1fb1f: 0x6c6c2020, - 0x1fb22: 0x6cac1620, - 0x1fb24: 0x6c32ee20, 0x1fb25: 0x6c238220, 0x1fb27: 0x6cd08e20, - 0x1fb38: 0x6c59aa20, - // Block 0x7ed, offset 0x1fb40 - 0x1fb4a: 0x6d1abe20, - 0x1fb4c: 0x6c4bb820, - 0x1fb56: 0x6c6f3a20, - 0x1fb6b: 0x6ccfa220, - 0x1fb7a: 0x6c6fe220, - // Block 0x7ee, offset 0x1fb80 - 0x1fb85: 0x6d130c20, - 0x1fb89: 0x6c308c20, - 0x1fb8c: 0x6c73c020, 0x1fb8d: 0x6c6a4c20, 0x1fb8f: 0x6c2df020, - 0x1fb91: 0x6c73c220, 0x1fb92: 0x6c20ba20, - 0x1fb96: 0x6c8c9820, - 0x1fb9a: 0x6ce63e20, - 0x1fba3: 0x6c44aa20, - 0x1fbae: 0x6d0b7e20, - 0x1fbb1: 0x6d148020, - 0x1fbbf: 0x6cef1c20, - // Block 0x7ef, offset 0x1fbc0 - 0x1fbc2: 0x6c6a5820, - 0x1fbcc: 0x6d146a20, - 0x1fbd7: 0x6c2f3220, - 0x1fbda: 0x6cb59a20, - 0x1fbec: 0x6c05b020, - 0x1fbf1: 0x6d01a620, - 0x1fbf9: 0x6d2f3220, - // Block 0x7f0, offset 0x1fc00 - 0x1fc0c: 0x6d1daa20, - 0x1fc10: 0x6d073820, - 0x1fc19: 0x6c2f3820, 0x1fc1b: 0x6c280820, - 0x1fc1f: 0x6cf06220, - 0x1fc23: 0x6c488620, - 0x1fc29: 0x6c391220, - 0x1fc2e: 0x6ca0ba20, - 0x1fc31: 0x6cf56220, 0x1fc32: 0x6d0d3220, - 0x1fc35: 0x6ca5b820, 0x1fc36: 0x6c286020, - // Block 0x7f1, offset 0x1fc40 - 0x1fc4b: 0x6c281a20, - 0x1fc4f: 0x6ce1ac20, - 0x1fc52: 0x6c455620, - 0x1fc57: 0x6c7abc20, - 0x1fc58: 0x6c1f0420, - 0x1fc6f: 0x6cc25e20, - 0x1fc71: 0x6ca0be20, 0x1fc73: 0x6cd19220, - 0x1fc75: 0x6c41c620, 0x1fc77: 0x6cd0d820, - // Block 0x7f2, offset 0x1fc80 - 0x1fc81: 0x6ceaa020, - 0x1fc85: 0x6cd42c20, - 0x1fc8a: 0x6ca7e620, - 0x1fca4: 0x6d281a20, 0x1fca5: 0x6c489220, - 0x1fcac: 0x6cfe7e20, 0x1fcad: 0x6c814420, - 0x1fcb0: 0x6c286e20, 0x1fcb1: 0x6cdd0620, - 0x1fcb5: 0x6c988420, 0x1fcb6: 0x6d148220, - 0x1fcb8: 0x6ce26e20, 0x1fcba: 0x6c094020, - // Block 0x7f3, offset 0x1fcc0 - 0x1fcc2: 0x6cde3020, - 0x1fcd7: 0x6c95e420, - 0x1fce2: 0x6cf7d220, 0x1fce3: 0x6c5cb820, - 0x1fce4: 0x6c268e20, 0x1fce7: 0x6c722420, - 0x1fce9: 0x6c318c20, - 0x1fcec: 0x6c017c20, - // Block 0x7f4, offset 0x1fd00 - 0x1fd09: 0x6c9a8820, - 0x1fd0c: 0x6cc46c20, 0x1fd0e: 0x6c003820, 0x1fd0f: 0x6d22ec20, - 0x1fd12: 0x6c666620, - 0x1fd14: 0x6cb76620, - 0x1fd1f: 0x6c9fa220, - 0x1fd23: 0x6d391620, - 0x1fd24: 0x6d35ac20, 0x1fd25: 0x6d37ea20, 0x1fd26: 0x6ca4e220, 0x1fd27: 0x6c0e1a20, - 0x1fd29: 0x6d3bc020, 0x1fd2a: 0x6cd5be20, 0x1fd2b: 0x6d0a8420, - 0x1fd2c: 0x6c741e20, 0x1fd2d: 0x6cb9fe20, - 0x1fd30: 0x6c489a20, 0x1fd32: 0x6ce85220, - 0x1fd36: 0x6d1d3820, 0x1fd37: 0x6d35d620, - 0x1fd3e: 0x6c7c6620, - // Block 0x7f5, offset 0x1fd40 - 0x1fd46: 0x6c192620, - 0x1fd56: 0x6c88ec20, 0x1fd57: 0x6d0ae620, - 0x1fd5c: 0x6c4ce820, 0x1fd5d: 0x6c9e8e20, 0x1fd5e: 0x6ccf0e20, 0x1fd5f: 0x6d223620, - 0x1fd61: 0x6cd8b020, 0x1fd62: 0x6cda1220, - 0x1fd64: 0x6d35d820, 0x1fd67: 0x6cbc7c20, - 0x1fd69: 0x6c3fde20, - 0x1fd6c: 0x6c710a20, 0x1fd6d: 0x6c071e20, 0x1fd6f: 0x6c099220, - 0x1fd72: 0x6cdd6220, - 0x1fd75: 0x6cba0820, 0x1fd76: 0x6ca03220, 0x1fd77: 0x6c15b620, - 0x1fd7a: 0x6ccaa820, 0x1fd7b: 0x6c5ec020, - // Block 0x7f6, offset 0x1fd80 - 0x1fd95: 0x6c461620, 0x1fd96: 0x6cbf1e20, - 0x1fd9a: 0x6cc73820, - 0x1fd9e: 0x6cda1a20, 0x1fd9f: 0x6cda1e20, - 0x1fda0: 0x6d10f420, - 0x1fdaa: 0x6c1d6a20, - 0x1fdad: 0x6cd66620, 0x1fdae: 0x6d2ffa20, 0x1fdaf: 0x6c862420, - 0x1fdb0: 0x6c413e20, 0x1fdb1: 0x6cdbc620, 0x1fdb2: 0x6d2d7c20, - 0x1fdb4: 0x6d3c4220, - 0x1fdbd: 0x6c400820, - // Block 0x7f7, offset 0x1fdc0 - 0x1fdc3: 0x6c5ee020, - 0x1fdc4: 0x6c30b220, - 0x1fdd7: 0x6c5bd020, - 0x1fdda: 0x6c65a420, 0x1fddb: 0x6d0d9c20, - 0x1fddc: 0x6d364a20, - 0x1fde8: 0x6c9a5c20, 0x1fde9: 0x6d120e20, 0x1fdea: 0x6c2b3220, 0x1fdeb: 0x6d150e20, - 0x1fdef: 0x6c0cf220, - 0x1fdf2: 0x6cc1a220, 0x1fdf3: 0x6d181a20, - 0x1fdf5: 0x6d105420, - 0x1fdf9: 0x6d2c3e20, - 0x1fdfd: 0x6ccc6020, - // Block 0x7f8, offset 0x1fe00 - 0x1fe19: 0x6c7f1820, - 0x1fe2e: 0x6c746e20, - 0x1fe30: 0x6cb50620, 0x1fe33: 0x6d216a20, - 0x1fe36: 0x6d291820, 0x1fe37: 0x6cc98220, - 0x1fe38: 0x6ccb3a20, 0x1fe3b: 0x6c340420, - 0x1fe3f: 0x6c6b9e20, - // Block 0x7f9, offset 0x1fe40 - 0x1fe40: 0x6c782020, 0x1fe43: 0x6d265420, - 0x1fe47: 0x6c65ca20, - 0x1fe48: 0x6d113220, - 0x1fe53: 0x6cfaca20, - 0x1fe55: 0x6d000220, 0x1fe56: 0x6cbb9620, - 0x1fe5a: 0x6d23b820, 0x1fe5b: 0x6cc1ae20, - 0x1fe61: 0x6cfac820, 0x1fe62: 0x6c962020, - 0x1fe64: 0x6c4a0a20, 0x1fe67: 0x6c198620, - 0x1fe68: 0x6c209620, 0x1fe69: 0x6d155620, 0x1fe6b: 0x6d333020, - 0x1fe6d: 0x6d403020, 0x1fe6e: 0x6c335c20, - 0x1fe70: 0x6d2d3420, - 0x1fe7f: 0x6c3a6e20, - // Block 0x7fa, offset 0x1fe80 - 0x1fe80: 0x6d155820, 0x1fe81: 0x6c9b4420, - 0x1fe88: 0x6c0b0a20, 0x1fe89: 0x6c6b4020, 0x1fe8a: 0x6cd61820, 0x1fe8b: 0x6c8a2220, - 0x1fe8c: 0x6c08fa20, 0x1fe8d: 0x6cda7620, - 0x1fe91: 0x6c2ca220, - 0x1fea1: 0x6c076220, 0x1fea2: 0x6cf21220, - 0x1fea7: 0x6c9b6a20, - 0x1fea9: 0x6c15ea20, - 0x1feb5: 0x6c29f620, - 0x1feba: 0x6cb21c20, 0x1febb: 0x6c660820, - 0x1febc: 0x6c8c7420, 0x1febd: 0x6c4b9220, 0x1febe: 0x6cb54620, 0x1febf: 0x6c52dc20, - // Block 0x7fb, offset 0x1fec0 - 0x1fec3: 0x6c60e820, - 0x1fec4: 0x6d024e20, 0x1fec5: 0x6d330820, 0x1fec6: 0x6c15fa20, - 0x1fed0: 0x6d116c20, 0x1fed1: 0x6c160a20, - 0x1fed8: 0x6c2cee20, 0x1fed9: 0x6c1d6020, 0x1feda: 0x6ca56220, 0x1fedb: 0x6ca56420, - 0x1fede: 0x6d2d5420, 0x1fedf: 0x6c0b1e20, - 0x1fee1: 0x6c161020, - 0x1feea: 0x6cff5a20, - 0x1feef: 0x6c248620, - 0x1fef0: 0x6d02f620, 0x1fef1: 0x6c6e4420, 0x1fef2: 0x6cb96620, - 0x1fef4: 0x6cbe6820, - 0x1fef9: 0x6c475220, - // Block 0x7fc, offset 0x1ff00 - 0x1ff04: 0x6cf4b420, - 0x1ff1c: 0x6d25e420, 0x1ff1d: 0x6c0dde20, - 0x1ff22: 0x6cecde20, - 0x1ff30: 0x6ca7a620, - 0x1ff35: 0x6c891020, - 0x1ff38: 0x6cc53e20, - 0x1ff3e: 0x6c396e20, 0x1ff3f: 0x6c2b9420, - // Block 0x7fd, offset 0x1ff40 - 0x1ff4a: 0x6c5af820, 0x1ff4b: 0x6d190620, - 0x1ff4c: 0x6cfbbc20, - 0x1ff56: 0x6c800420, 0x1ff57: 0x6c40a020, - 0x1ff59: 0x6d04ae20, - 0x1ff5c: 0x6c897e20, 0x1ff5d: 0x6ce1a620, 0x1ff5e: 0x6c5fba20, - 0x1ff62: 0x6c6ba620, 0x1ff63: 0x6d2c1a20, - 0x1ff64: 0x6cd19420, - 0x1ff6a: 0x6cb59220, 0x1ff6b: 0x6c0b2c20, - 0x1ff6d: 0x6c802220, 0x1ff6e: 0x6c8c1a20, - 0x1ff76: 0x6d364c20, 0x1ff77: 0x6c09bc20, - 0x1ff78: 0x6cd17020, - 0x1ff7d: 0x6cd17a20, 0x1ff7f: 0x6cbdbc20, - // Block 0x7fe, offset 0x1ff80 - 0x1ff82: 0x6c0be620, 0x1ff83: 0x6cf55e20, - 0x1ff89: 0x6c733a20, 0x1ff8b: 0x6c5e8420, - 0x1ff8d: 0x6cf57620, 0x1ff8e: 0x6cbdc420, - 0x1ff91: 0x6c4d5620, - 0x1ff95: 0x6c94e220, - 0x1ffa0: 0x6d26b420, - 0x1ffa8: 0x6c880a20, - 0x1ffaf: 0x6c048e20, - 0x1ffb2: 0x6c526820, - 0x1ffb6: 0x6cb54020, - 0x1ffba: 0x6cb93820, 0x1ffbb: 0x6d337820, - 0x1ffbc: 0x6c991a20, - // Block 0x7ff, offset 0x1ffc0 - 0x1ffc1: 0x6c238020, - 0x1ffc4: 0x6ca30020, - 0x1ffca: 0x6ce6a820, - 0x1ffcc: 0x6d3f6e20, - 0x1ffd5: 0x6c6ed420, 0x1ffd6: 0x6d2f8620, - 0x1ffdf: 0x6ca71c20, - 0x1ffe0: 0x6c19e420, 0x1ffe3: 0x6cb86620, - 0x1ffe6: 0x6d236420, 0x1ffe7: 0x6c690020, - 0x1ffed: 0x6d2fda20, - 0x1fff3: 0x6c2b5020, - 0x1fff4: 0x6c6f3c20, - 0x1fff8: 0x6cdc0a20, 0x1fffb: 0x6d108220, - 0x1ffff: 0x6cedbe20, - // Block 0x800, offset 0x20000 - 0x20002: 0x6c89d820, - 0x20004: 0x6ce71220, 0x20006: 0x6c9bfc20, - 0x2000b: 0x6d1faa20, - 0x20013: 0x6cd7e020, - 0x2001b: 0x6c910820, - 0x2001f: 0x6d19f820, - 0x20025: 0x6c1d4420, - 0x2002b: 0x6c420020, - 0x2002c: 0x6c6f3820, - 0x20036: 0x6cbdf820, 0x20037: 0x6c6ef220, - 0x20039: 0x6d006e20, - // Block 0x801, offset 0x20040 - 0x20042: 0x6c51b820, - 0x20046: 0x6ce1ae20, - 0x20048: 0x6cc01220, 0x20049: 0x6d007420, 0x2004a: 0x6c6e5420, 0x2004b: 0x6ca71620, - 0x2004c: 0x6c6e5620, 0x2004f: 0x6c5fea20, - 0x20058: 0x6ce4de20, 0x2005a: 0x6c252220, 0x2005b: 0x6c2e7c20, - 0x2005d: 0x6cbea020, - 0x20065: 0x6cb2e620, 0x20066: 0x6cb29620, - 0x20068: 0x6c2e9020, 0x20069: 0x6c910420, - 0x20073: 0x6c88ba20, - 0x20074: 0x6c4e0a20, 0x20075: 0x6cacd620, 0x20076: 0x6ce0f020, - 0x2007a: 0x6d151020, 0x2007b: 0x6d081420, - 0x2007c: 0x6cddca20, 0x2007d: 0x6c8e6420, 0x2007e: 0x6cd6d220, 0x2007f: 0x6cd0a820, - // Block 0x802, offset 0x20080 - 0x20081: 0x6c10a020, 0x20082: 0x6cd9bc20, - 0x20085: 0x6cbd8c20, 0x20086: 0x6cd06620, - 0x2008a: 0x6ca9f420, 0x2008b: 0x6ce6de20, - 0x2008c: 0x6c677020, - 0x20095: 0x6cf6b820, 0x20096: 0x6d36fe20, - 0x2009d: 0x6c7f5e20, 0x2009e: 0x6c86be20, 0x2009f: 0x6c86c020, - 0x200a2: 0x6c519420, 0x200a3: 0x6c69cc20, - 0x200a5: 0x6d0d0a20, 0x200a7: 0x6cd49420, - 0x200aa: 0x6cd2a220, - 0x200b1: 0x6d31ae20, 0x200b3: 0x6d1e8620, - 0x200ba: 0x6cddc620, 0x200bb: 0x6cf39e20, - // Block 0x803, offset 0x200c0 - 0x200c1: 0x6c169620, 0x200c2: 0x6c238820, - 0x200c6: 0x6c720820, - 0x200ce: 0x6cd4a420, - 0x200d4: 0x6c6fe620, 0x200d5: 0x6ceef020, - 0x200de: 0x6c5db620, - 0x200e4: 0x6c6a2020, - 0x200ec: 0x6d2a4e20, - 0x200f6: 0x6cab7220, - 0x200fc: 0x6c488c20, - // Block 0x804, offset 0x20100 - 0x20103: 0x6c4fba20, - 0x20104: 0x6c84f620, 0x20105: 0x6d356c20, 0x20106: 0x6cfc7220, - 0x20109: 0x6c100c20, 0x2010a: 0x6c170020, - 0x20113: 0x6d274a20, - 0x20114: 0x6c510020, - 0x2011c: 0x6ce1e420, - 0x20120: 0x6c0c4a20, - 0x20125: 0x6c2da420, 0x20127: 0x6c37b620, - 0x20128: 0x6c6f3e20, - 0x2012d: 0x6c2c0a20, 0x2012e: 0x6d164420, 0x2012f: 0x6c7d4620, - 0x20131: 0x6d300a20, 0x20133: 0x6c7de420, - 0x20134: 0x6d384e20, 0x20135: 0x6c71ee20, - 0x20139: 0x6ccd6820, 0x2013a: 0x6ccc3820, 0x2013b: 0x6c2da820, - 0x2013c: 0x6c046c20, 0x2013d: 0x6c5e7420, - // Block 0x805, offset 0x20140 - 0x20140: 0x6d378620, 0x20143: 0x6d144e20, - 0x20145: 0x6c79b020, 0x20146: 0x6cf33e20, - 0x2014a: 0x6c436420, 0x2014b: 0x6c031220, - 0x2014e: 0x6c463620, - 0x20151: 0x6cfb2420, 0x20152: 0x6c484020, 0x20153: 0x6c8ef620, - 0x20154: 0x6c1b7620, 0x20155: 0x6c48c020, 0x20156: 0x6c1fdc20, - 0x20158: 0x6c83a020, 0x20159: 0x6c242a20, 0x2015a: 0x6cd63e20, - 0x20161: 0x6c08b620, - 0x20165: 0x6c0dbc20, 0x20166: 0x6c857820, - 0x20169: 0x6c6fae20, 0x2016a: 0x6ce54a20, 0x2016b: 0x6c347220, - 0x2016d: 0x6d0bde20, 0x2016e: 0x6cc28a20, - 0x20171: 0x6c8ac820, 0x20173: 0x6c787c20, - 0x20175: 0x6c449620, 0x20176: 0x6d312420, - 0x20178: 0x6c3b5820, - // Block 0x806, offset 0x20180 - 0x20181: 0x6d146e20, 0x20183: 0x6c6fd220, - 0x20184: 0x6d067c20, 0x20185: 0x6c68cc20, - 0x20188: 0x6c93cc20, 0x20189: 0x6c6fb020, 0x2018b: 0x6c1e1e20, - 0x2018e: 0x6cfc7e20, - 0x20190: 0x6c7b1620, 0x20191: 0x6c333e20, - 0x20196: 0x6c952e20, 0x20197: 0x6cf59a20, - 0x20198: 0x6cbe0820, 0x20199: 0x6c107420, - 0x201a4: 0x6cb84620, - 0x201b1: 0x6caf5020, 0x201b2: 0x6d0adc20, 0x201b3: 0x6c07da20, - 0x201b4: 0x6c4cb220, 0x201b5: 0x6c484c20, - 0x201b9: 0x6c710020, - 0x201bc: 0x6cb82420, 0x201be: 0x6c741020, - // Block 0x807, offset 0x201c0 - 0x201c4: 0x6c85c020, - 0x201d0: 0x6c570c20, 0x201d1: 0x6c683c20, - 0x201d8: 0x6cb84e20, 0x201da: 0x6d2c2620, 0x201db: 0x6cb82620, - 0x201dd: 0x6d304620, 0x201de: 0x6c139020, 0x201df: 0x6d1ce820, - 0x201e2: 0x6d0bee20, - 0x201e4: 0x6c1cc020, - 0x201e8: 0x6c1b9a20, 0x201ea: 0x6cec8620, - 0x201ec: 0x6cd9a620, - 0x201f2: 0x6c76cc20, 0x201f3: 0x6d255c20, - 0x201fd: 0x6c1d9c20, 0x201ff: 0x6cdd6420, - // Block 0x808, offset 0x20200 - 0x20200: 0x6ce85820, 0x20203: 0x6d305620, - 0x20204: 0x6ce2ee20, 0x20206: 0x6cf36820, - 0x20208: 0x6c264a20, 0x20209: 0x6c860820, 0x2020a: 0x6c139420, - 0x20215: 0x6cc66e20, 0x20216: 0x6c461820, 0x20217: 0x6cc3bc20, - 0x20219: 0x6c83ce20, - 0x2021e: 0x6ce1c620, - 0x20224: 0x6c860a20, 0x20227: 0x6c9c5c20, - 0x20229: 0x6c1c3020, - 0x2022c: 0x6c4bfa20, 0x2022d: 0x6c909420, 0x2022e: 0x6c209020, 0x2022f: 0x6cdd6e20, - 0x20230: 0x6c690420, 0x20231: 0x6c6d0c20, - 0x20235: 0x6c381620, 0x20236: 0x6d2cf620, - 0x2023e: 0x6c6d0e20, 0x2023f: 0x6c254220, - // Block 0x809, offset 0x20240 - 0x20242: 0x6c136c20, 0x20243: 0x6d420820, - 0x20245: 0x6d2fc420, - 0x20248: 0x6cb1c620, 0x20249: 0x6d2dfc20, 0x2024a: 0x6cf66420, 0x2024b: 0x6d121420, - 0x2024c: 0x6c3f7420, 0x2024d: 0x6c1cce20, - 0x20253: 0x6c254a20, - 0x20257: 0x6c486820, - 0x20263: 0x6c5f0020, - 0x20266: 0x6ccb3c20, 0x20267: 0x6d2d8e20, - 0x20268: 0x6c8e2420, 0x20269: 0x6ccb3e20, 0x2026a: 0x6d132220, - 0x20270: 0x6c70ba20, - 0x20276: 0x6ce87220, - 0x2027a: 0x6cc7c620, 0x2027b: 0x6d2af820, - 0x2027c: 0x6c589020, - // Block 0x80a, offset 0x20280 - 0x20281: 0x6cfc2820, 0x20283: 0x6cb91a20, - 0x20284: 0x6d2fdc20, - 0x2028b: 0x6c11b220, - 0x2028e: 0x6c7e1820, 0x2028f: 0x6c869a20, - 0x20290: 0x6cc76420, - 0x20294: 0x6c31c020, 0x20297: 0x6c8b3020, - 0x2029c: 0x6d1c0620, 0x2029d: 0x6c86c220, - 0x202a0: 0x6c31c620, 0x202a2: 0x6c8d8020, - 0x202aa: 0x6ceca220, - 0x202af: 0x6c2f1820, - 0x202b3: 0x6c6f4020, - 0x202b5: 0x6c855e20, 0x202b6: 0x6c7a1620, 0x202b7: 0x6c791e20, - 0x202b9: 0x6d31b220, - // Block 0x80b, offset 0x202c0 - 0x202c0: 0x6c51b420, 0x202c2: 0x6c091220, - 0x202c4: 0x6caf2820, - 0x202ca: 0x6c4f4820, - 0x202d1: 0x6d3d2820, 0x202d2: 0x6c332020, - 0x202d4: 0x6d16a420, - 0x202dc: 0x6c787e20, 0x202dd: 0x6d16a620, 0x202de: 0x6ca0dc20, - 0x202e1: 0x6c118a20, 0x202e3: 0x6c44ee20, - 0x202e4: 0x6c788820, 0x202e5: 0x6cd32a20, - 0x202ed: 0x6c8cc620, 0x202ee: 0x6c07dc20, - 0x202f1: 0x6c32b820, - 0x202f6: 0x6c72e020, 0x202f7: 0x6ca4e420, - 0x202f8: 0x6d3f0020, 0x202fb: 0x6d401e20, - // Block 0x80c, offset 0x20300 - 0x20303: 0x6ce0ea20, - 0x20306: 0x6cf9be20, 0x20307: 0x6c4ec020, - 0x2030c: 0x6c94a620, 0x2030d: 0x6cb99020, - 0x20313: 0x6ca12220, - 0x20314: 0x6cab3a20, 0x20315: 0x6c4fc820, - 0x20319: 0x6d2c3420, 0x2031a: 0x6c737020, 0x2031b: 0x6c23a020, - 0x20320: 0x6c864420, 0x20321: 0x6d2c4020, 0x20322: 0x6d1fdc20, 0x20323: 0x6c2d6c20, - 0x20324: 0x6c747820, 0x20325: 0x6c073a20, - 0x20329: 0x6d11bc20, 0x2032a: 0x6cb1c820, - 0x20331: 0x6c6d3620, 0x20332: 0x6c766c20, 0x20333: 0x6ccb4020, - 0x20334: 0x6d102c20, 0x20335: 0x6c6d3820, - 0x20339: 0x6c78dc20, - // Block 0x80d, offset 0x20340 - 0x20344: 0x6c14de20, 0x20347: 0x6ca74a20, - 0x20349: 0x6cedb020, 0x2034a: 0x6c942a20, - 0x20350: 0x6d277a20, 0x20351: 0x6d108420, 0x20352: 0x6c05a020, - 0x20355: 0x6c755220, 0x20356: 0x6d07fc20, - 0x20358: 0x6d385820, - 0x20360: 0x6c7ce820, 0x20361: 0x6c3cda20, - 0x2036a: 0x6cc17e20, 0x2036b: 0x6ccecc20, - 0x2036c: 0x6cdce420, - 0x20370: 0x6c316820, 0x20372: 0x6c7af820, 0x20373: 0x6cad8c20, - 0x2037a: 0x6c065020, - 0x2037e: 0x6c401620, 0x2037f: 0x6c700c20, - // Block 0x80e, offset 0x20380 - 0x20380: 0x6cc47c20, - 0x20384: 0x6c70ca20, - 0x2038a: 0x6cbf6a20, - 0x2038d: 0x6d38c220, 0x2038e: 0x6c577420, 0x2038f: 0x6c05e020, - 0x20395: 0x6d145c20, 0x20397: 0x6d148420, - 0x20398: 0x6d148620, - 0x2039d: 0x6c995020, - 0x203a6: 0x6cc86c20, - 0x203ab: 0x6c227c20, - 0x203ae: 0x6c4dca20, - 0x203b0: 0x6c238420, - 0x203b4: 0x6cf83a20, - 0x203b9: 0x6cc2b820, 0x203ba: 0x6ce56c20, - 0x203bc: 0x6c2e0c20, 0x203be: 0x6c4ddc20, - // Block 0x80f, offset 0x203c0 - 0x203c7: 0x6d12a620, - 0x203cd: 0x6c353420, 0x203ce: 0x6ceef820, - 0x203d0: 0x6c122e20, 0x203d1: 0x6c2e2620, - 0x203d5: 0x6c362620, 0x203d6: 0x6c2c6820, - 0x203d8: 0x6cdb9220, 0x203d9: 0x6cc30a20, - 0x203dc: 0x6c368020, 0x203dd: 0x6cab4420, 0x203de: 0x6d081c20, - 0x203e2: 0x6cf47820, - 0x203e6: 0x6d190820, - 0x203e8: 0x6ca1fa20, - 0x203f0: 0x6c549620, - 0x203f4: 0x6c4dde20, - 0x203ff: 0x6cd22820, - // Block 0x810, offset 0x20400 - 0x20403: 0x6cc96420, - 0x20408: 0x6c090820, 0x2040a: 0x6c4dcc20, 0x2040b: 0x6c6e4620, - 0x2040e: 0x6cbdfa20, 0x2040f: 0x6c25d420, - 0x20410: 0x6c22a620, 0x20412: 0x6c046e20, - 0x20417: 0x6c32f020, - 0x2041c: 0x6cf84220, - 0x20427: 0x6d33c020, - 0x20428: 0x6c949220, 0x2042a: 0x6c54b620, 0x2042b: 0x6c601420, - 0x2042c: 0x6c48c820, - 0x20432: 0x6cacd820, - // Block 0x811, offset 0x20440 - 0x20440: 0x6d39c220, - 0x20445: 0x6c08fc20, 0x20447: 0x6d21ae20, - 0x20452: 0x6cb6c220, - 0x20455: 0x6c50b420, 0x20456: 0x6c1ed420, - 0x20459: 0x6ccec220, 0x2045a: 0x6c1be020, 0x2045b: 0x6c0eac20, - 0x2045f: 0x6cc62420, - 0x20460: 0x6d1ef820, - 0x20464: 0x6ca39620, - 0x20469: 0x6c5b9420, 0x2046a: 0x6ce57620, 0x2046b: 0x6c04c220, - 0x20470: 0x6d057620, - 0x20474: 0x6d1f1020, 0x20475: 0x6c1c0620, - 0x2047f: 0x6c526220, - // Block 0x812, offset 0x20480 - 0x20483: 0x6cec7020, - 0x20486: 0x6d01ce20, - 0x2048a: 0x6c748c20, - 0x2048c: 0x6cdbec20, 0x2048d: 0x6cbe2c20, 0x2048e: 0x6d3bbc20, - 0x20495: 0x6c617620, - 0x20498: 0x6c091420, 0x2049a: 0x6cf59c20, - 0x204a0: 0x6c602820, 0x204a2: 0x6c75c620, - 0x204a5: 0x6c89ee20, 0x204a6: 0x6d1eb620, - 0x204ad: 0x6c70ea20, - 0x204b2: 0x6d266a20, - 0x204b5: 0x6c055e20, - 0x204b8: 0x6cafaa20, 0x204bb: 0x6d2b3820, - 0x204be: 0x6d165820, 0x204bf: 0x6c2bc820, - // Block 0x813, offset 0x204c0 - 0x204c2: 0x6cbc9220, - 0x204c4: 0x6cdd4c20, 0x204c6: 0x6c22ae20, - 0x204c8: 0x6d3aa220, 0x204c9: 0x6d267420, - 0x204cf: 0x6c682820, - 0x204d4: 0x6cd23e20, 0x204d7: 0x6d148820, - 0x204d8: 0x6cf99220, - 0x204e0: 0x6d254220, - 0x204e5: 0x6c4c6020, 0x204e7: 0x6c789020, - 0x204ea: 0x6c252420, 0x204eb: 0x6d171a20, - 0x204f5: 0x6c85c220, 0x204f7: 0x6c2d0c20, - 0x204fa: 0x6cf5d620, - 0x204ff: 0x6c09c020, - // Block 0x814, offset 0x20500 - 0x20502: 0x6c0b3420, 0x20503: 0x6c99ea20, - 0x20504: 0x6c85e420, 0x20507: 0x6cda1820, - 0x20510: 0x6c8e5620, 0x20511: 0x6c4b5420, 0x20512: 0x6c78b620, - 0x20517: 0x6d151220, - 0x20519: 0x6cf7f620, 0x2051a: 0x6d1a7c20, - 0x2051f: 0x6c78c020, - 0x20523: 0x6ccf6020, - 0x20527: 0x6cf2bc20, - 0x2052e: 0x6cb0b620, - 0x20536: 0x6d26dc20, 0x20537: 0x6c538020, - 0x2053a: 0x6c867220, 0x2053b: 0x6c405020, - // Block 0x815, offset 0x20540 - 0x20543: 0x6c74d620, - 0x20544: 0x6cfae820, - 0x20549: 0x6c2cf020, - 0x2054c: 0x6c878820, - 0x20553: 0x6ce83420, - 0x20558: 0x6c645820, 0x2055b: 0x6c041420, - 0x2055c: 0x6c2c0c20, 0x2055d: 0x6d2efc20, - 0x20563: 0x6d22bc20, - 0x20568: 0x6c333420, - 0x2056d: 0x6c115c20, 0x2056e: 0x6ce88620, - 0x20576: 0x6cdf9420, 0x20577: 0x6c5fee20, - 0x20578: 0x6cb59420, 0x20579: 0x6ccd7620, 0x2057a: 0x6ca6fa20, - // Block 0x816, offset 0x20580 - 0x20586: 0x6c498c20, - 0x20588: 0x6c08e420, 0x2058b: 0x6d037820, - 0x20593: 0x6d31fa20, - 0x20599: 0x6cc94a20, 0x2059b: 0x6ca0b820, - 0x2059d: 0x6c3dc420, - 0x205a2: 0x6ce1a820, 0x205a3: 0x6c055c20, - 0x205aa: 0x6c0c8a20, - 0x205ac: 0x6cf56620, 0x205ae: 0x6c6a5e20, - 0x205b6: 0x6c6cd220, - 0x205be: 0x6cb8b020, - // Block 0x817, offset 0x205c0 - 0x205c8: 0x6cd89820, 0x205c9: 0x6c6e1620, 0x205cb: 0x6c1b8820, - 0x205d7: 0x6c6e1c20, - 0x205e5: 0x6cdc3a20, - 0x205ef: 0x6d2bde20, - 0x205f0: 0x6c83e020, - 0x205f4: 0x6d3d0620, - 0x205f9: 0x6c0ba820, - 0x205ff: 0x6cea6220, - // Block 0x818, offset 0x20600 - 0x20603: 0x6c0a1820, - 0x20606: 0x6c3ac220, - 0x2060a: 0x6c2a8220, - 0x2060c: 0x6d3a2620, - 0x20611: 0x6c70dc20, - 0x20619: 0x6d15b020, - 0x2061c: 0x6d0b6420, 0x2061f: 0x6c1bd820, - 0x20620: 0x6c488e20, 0x20621: 0x6d34d020, - 0x20628: 0x6cc61620, 0x2062b: 0x6d1e8a20, - 0x2062d: 0x6c0ea820, 0x2062f: 0x6c611820, - 0x20630: 0x6cb23620, 0x20633: 0x6d1b9c20, - 0x20634: 0x6d0f4220, 0x20635: 0x6c98b420, - 0x2063d: 0x6c904e20, 0x2063e: 0x6ca2ca20, 0x2063f: 0x6cc9bc20, - // Block 0x819, offset 0x20640 - 0x20640: 0x6c1fda20, 0x20642: 0x6c221c20, 0x20643: 0x6cf41a20, - 0x20644: 0x6cc5ae20, - 0x20648: 0x6c272420, 0x20649: 0x6c5fc420, 0x2064b: 0x6d15b820, - 0x2064d: 0x6cc45e20, - 0x20650: 0x6c5d9820, 0x20651: 0x6c484220, 0x20653: 0x6d301020, - 0x20654: 0x6cb08220, 0x20657: 0x6d288220, - 0x20658: 0x6c04e020, 0x20659: 0x6c6a6a20, - 0x2065c: 0x6c53e220, 0x2065f: 0x6cfc7620, - 0x20660: 0x6c5a8820, - 0x20669: 0x6d2bc420, 0x2066a: 0x6c270820, 0x2066b: 0x6c436c20, - 0x2066d: 0x6cb08420, 0x2066f: 0x6cb14620, - 0x20670: 0x6cd23620, 0x20671: 0x6c898620, 0x20672: 0x6d267620, 0x20673: 0x6c565020, - 0x20674: 0x6c0b6a20, 0x20677: 0x6cc61e20, - 0x20679: 0x6cc62020, - // Block 0x81a, offset 0x20680 - 0x20684: 0x6d13c420, 0x20685: 0x6d338820, 0x20687: 0x6c6c2820, - 0x20688: 0x6cf22020, 0x20689: 0x6c173420, 0x2068b: 0x6cbf9a20, - 0x2068d: 0x6d3a5620, 0x2068f: 0x6d2c1c20, - 0x20690: 0x6cb34820, 0x20691: 0x6c019e20, 0x20693: 0x6c50c220, - 0x20695: 0x6c1e5620, 0x20696: 0x6d0c6020, - 0x2069a: 0x6cd31820, 0x2069b: 0x6c566020, - 0x2069c: 0x6c35dc20, - 0x206b4: 0x6cd24020, - 0x206b9: 0x6ceaaa20, 0x206ba: 0x6c272c20, 0x206bb: 0x6cec6a20, - 0x206bc: 0x6cb2f420, 0x206bd: 0x6cc6f420, 0x206be: 0x6c705220, - // Block 0x81b, offset 0x206c0 - 0x206c0: 0x6c0e4a20, - 0x206d0: 0x6d222820, 0x206d1: 0x6c30a220, 0x206d3: 0x6c4ace20, - 0x206d4: 0x6cd45420, 0x206d7: 0x6cdd0820, - 0x206d8: 0x6ca68220, 0x206d9: 0x6d385c20, 0x206da: 0x6c905220, 0x206db: 0x6c0dca20, - 0x206dc: 0x6d421420, 0x206dd: 0x6d12d620, 0x206de: 0x6cc4b420, - 0x206e0: 0x6c8cb220, 0x206e1: 0x6cc96c20, - 0x206e4: 0x6c82b820, 0x206e5: 0x6c35e820, 0x206e7: 0x6d381a20, - 0x206e8: 0x6c612820, 0x206eb: 0x6c35ea20, - 0x206ef: 0x6d428420, - 0x206f2: 0x6ca31820, 0x206f3: 0x6d27dc20, - // Block 0x81c, offset 0x20700 - 0x2070a: 0x6d016c20, 0x2070b: 0x6d418a20, - 0x2070c: 0x6cd5aa20, 0x2070d: 0x6c2fce20, 0x2070e: 0x6c384620, 0x2070f: 0x6cc58a20, - 0x20711: 0x6c051820, 0x20712: 0x6c4de020, 0x20713: 0x6c530a20, - 0x20714: 0x6d13d020, 0x20716: 0x6d13d220, - 0x20719: 0x6c77da20, 0x2071a: 0x6d16de20, 0x2071b: 0x6c5b1e20, - 0x2071c: 0x6d329020, - 0x2072e: 0x6c6e6220, - 0x20731: 0x6c43d220, - 0x20734: 0x6ca9fa20, 0x20735: 0x6cbca220, 0x20737: 0x6c2e7e20, - 0x20739: 0x6c61c420, 0x2073a: 0x6d171e20, 0x2073b: 0x6d14b620, - 0x2073d: 0x6c3e2c20, 0x2073e: 0x6cd77220, 0x2073f: 0x6cd77420, - // Block 0x81d, offset 0x20740 - 0x20740: 0x6d1e1e20, 0x20741: 0x6c78fe20, 0x20742: 0x6c573020, 0x20743: 0x6c53b620, - 0x20747: 0x6c50ec20, - 0x2074a: 0x6c509620, 0x2074b: 0x6cb9f820, - 0x2074c: 0x6cb85020, 0x2074e: 0x6cd8a620, - 0x20750: 0x6c051e20, - 0x2076c: 0x6c6d9e20, 0x2076d: 0x6c789220, - 0x20773: 0x6c001a20, - 0x20774: 0x6c908020, 0x20776: 0x6ce84820, - 0x20779: 0x6c207020, - 0x2077c: 0x6cd98620, 0x2077d: 0x6c19d620, 0x2077f: 0x6cee6a20, - // Block 0x81e, offset 0x20780 - 0x20782: 0x6caa5220, - 0x20784: 0x6c6fb620, 0x20787: 0x6c0d2c20, - 0x207a1: 0x6cffda20, 0x207a2: 0x6cd0f820, 0x207a3: 0x6c545020, - 0x207a6: 0x6d3ad020, - 0x207a8: 0x6c490e20, 0x207a9: 0x6c5eb220, 0x207ab: 0x6c61dc20, - 0x207ad: 0x6cf5da20, 0x207af: 0x6ccf3e20, - 0x207b0: 0x6cab7e20, 0x207b1: 0x6c553c20, 0x207b2: 0x6cde4220, 0x207b3: 0x6cff7c20, - 0x207b5: 0x6d2a7c20, - 0x207b8: 0x6c0fee20, 0x207b9: 0x6cb77820, 0x207ba: 0x6cebd620, 0x207bb: 0x6ceabe20, - 0x207bc: 0x6c2a0c20, 0x207be: 0x6ca33020, - // Block 0x81f, offset 0x207c0 - 0x207e0: 0x6d2cee20, 0x207e3: 0x6d0b9020, - 0x207e6: 0x6cf44020, 0x207e7: 0x6d31aa20, - 0x207e8: 0x6c2a8e20, 0x207e9: 0x6c509a20, 0x207eb: 0x6c01ea20, - 0x207ec: 0x6cafda20, 0x207ed: 0x6ccb2220, 0x207ee: 0x6c3bbc20, 0x207ef: 0x6c485420, - 0x207f3: 0x6cb35420, - 0x207f7: 0x6d088820, - 0x207f8: 0x6c4d9c20, 0x207f9: 0x6c427420, 0x207fa: 0x6c034620, 0x207fb: 0x6d3f7620, - 0x207fc: 0x6c9c0020, 0x207fe: 0x6c5dba20, - // Block 0x820, offset 0x20800 - 0x20827: 0x6c2cc220, - 0x20828: 0x6cf5dc20, 0x2082b: 0x6c26ee20, - 0x2082c: 0x6ca47a20, - 0x20830: 0x6c2dbe20, 0x20831: 0x6c95f820, 0x20832: 0x6c789e20, - 0x20837: 0x6d178e20, - 0x20838: 0x6c744420, 0x20839: 0x6c512420, 0x2083b: 0x6c602c20, - 0x2083e: 0x6c51c620, 0x2083f: 0x6ca82820, - // Block 0x821, offset 0x20840 - 0x20840: 0x6cc8f620, 0x20841: 0x6cb99220, 0x20842: 0x6c276c20, 0x20843: 0x6cce6c20, - 0x20844: 0x6c78ae20, 0x20845: 0x6d3a1220, 0x20847: 0x6cd1b820, - 0x20848: 0x6c93da20, 0x20849: 0x6c635c20, 0x2084a: 0x6cb10c20, 0x2084b: 0x6c546e20, - 0x2084c: 0x6c5ec420, 0x2084d: 0x6cde5420, 0x2084e: 0x6c1dac20, 0x2084f: 0x6cf29020, - 0x20850: 0x6c6e8020, 0x20851: 0x6cb30e20, 0x20852: 0x6d2cf220, 0x20853: 0x6d02d420, - 0x20856: 0x6c0b9420, - 0x20859: 0x6d06ce20, - 0x2085e: 0x6c471020, 0x2085f: 0x6c6be620, - 0x20862: 0x6cfb6a20, - 0x20878: 0x6c356420, 0x2087a: 0x6c0f0020, 0x2087b: 0x6cb15420, - 0x2087f: 0x6d28ea20, - // Block 0x822, offset 0x20880 - 0x20881: 0x6cac2420, 0x20882: 0x6ce85a20, - 0x20884: 0x6d1bb420, - 0x208ae: 0x6cfde220, - 0x208b1: 0x6caaf420, 0x208b2: 0x6c438e20, 0x208b3: 0x6c0f0220, - 0x208b4: 0x6d01a420, - 0x208b8: 0x6d315c20, 0x208b9: 0x6d214620, 0x208ba: 0x6ca6a420, - // Block 0x823, offset 0x208c0 - 0x208c0: 0x6d0a9220, 0x208c1: 0x6cec3620, 0x208c3: 0x6c021820, - 0x208c4: 0x6c4ece20, 0x208c5: 0x6c52b220, 0x208c6: 0x6c27e220, - 0x208c8: 0x6caac220, 0x208ca: 0x6c12b020, 0x208cb: 0x6c604820, - 0x208cc: 0x6ca5ae20, 0x208cd: 0x6d1e4020, 0x208ce: 0x6cfed220, - 0x208d0: 0x6c1faa20, 0x208d1: 0x6d121020, 0x208d3: 0x6c440220, - 0x208d4: 0x6ce0fc20, 0x208d5: 0x6c065220, 0x208d6: 0x6c15be20, - 0x208d8: 0x6d06ec20, 0x208db: 0x6c4d2020, - 0x208dd: 0x6c1db620, 0x208df: 0x6c65a620, - 0x208e0: 0x6d422620, - 0x208e4: 0x6cf0a420, 0x208e5: 0x6c265220, 0x208e6: 0x6caf6c20, - // Block 0x824, offset 0x20900 - 0x20910: 0x6c592c20, 0x20912: 0x6cf63a20, - 0x20914: 0x6cae4c20, 0x20915: 0x6c8e3420, 0x20916: 0x6ca24a20, 0x20917: 0x6c9ec620, - 0x20918: 0x6c812020, 0x20919: 0x6ce9fe20, 0x2091a: 0x6c048420, - 0x2091d: 0x6c439820, 0x2091f: 0x6c7aa020, - 0x20922: 0x6c636a20, 0x20923: 0x6c0e7c20, - // Block 0x825, offset 0x20940 - 0x2094d: 0x6c592e20, 0x2094f: 0x6d40c420, - 0x20950: 0x6c960e20, - 0x20957: 0x6c840a20, - 0x20959: 0x6c515620, 0x2095a: 0x6ca06220, - 0x2095c: 0x6cd72a20, 0x2095d: 0x6cd00420, 0x2095e: 0x6c777020, 0x2095f: 0x6c1c4020, - 0x20960: 0x6c8d3420, 0x20961: 0x6c95ba20, - 0x20964: 0x6d0dae20, 0x20965: 0x6d2fc620, 0x20966: 0x6c1fae20, 0x20967: 0x6c47ac20, - 0x20968: 0x6cbde020, 0x2096a: 0x6cdff220, 0x2096b: 0x6c3be220, - 0x2096c: 0x6ce8d220, - 0x20971: 0x6c8d3620, - 0x20974: 0x6c810820, - // Block 0x826, offset 0x20980 - 0x20996: 0x6c7fa620, 0x20997: 0x6d299220, - 0x20998: 0x6cf50820, - 0x2099d: 0x6c840c20, 0x2099e: 0x6c000a20, 0x2099f: 0x6c94b620, - 0x209a0: 0x6d353e20, 0x209a1: 0x6c1dc820, 0x209a2: 0x6c67f020, - 0x209a4: 0x6c64c620, - 0x209a9: 0x6c950020, 0x209aa: 0x6d153020, - 0x209ac: 0x6cce0820, - 0x209bb: 0x6c5f0220, - // Block 0x827, offset 0x209c0 - 0x209dc: 0x6d181e20, 0x209dd: 0x6ca8ea20, - 0x209e1: 0x6c5c0a20, 0x209e3: 0x6d2bf020, - 0x209e6: 0x6c4e6020, - 0x209e8: 0x6d1afa20, 0x209e9: 0x6c0a1a20, 0x209ea: 0x6c014620, 0x209eb: 0x6cf97220, - 0x209ec: 0x6ca60020, - 0x209f0: 0x6c2b3e20, 0x209f1: 0x6c65cc20, 0x209f2: 0x6cac6820, - 0x209f5: 0x6d23bc20, 0x209f6: 0x6c1fc620, 0x209f7: 0x6d289820, - 0x209f9: 0x6c13fc20, 0x209fb: 0x6d307620, - 0x209fc: 0x6ccb4220, 0x209fe: 0x6cae3620, 0x209ff: 0x6c472820, - // Block 0x828, offset 0x20a00 - 0x20a00: 0x6d307820, - 0x20a06: 0x6c842420, 0x20a07: 0x6c30be20, - 0x20a09: 0x6c1dd020, 0x20a0b: 0x6d419620, - 0x20a0c: 0x6cb39e20, 0x20a0f: 0x6ccefc20, - 0x20a10: 0x6c8fa220, - 0x20a22: 0x6cd5fe20, - 0x20a24: 0x6c6d3a20, 0x20a25: 0x6c8d4820, - 0x20a28: 0x6c774220, 0x20a29: 0x6c7e9220, 0x20a2b: 0x6d05cc20, - 0x20a2c: 0x6c6d3c20, 0x20a2e: 0x6c1fea20, - 0x20a32: 0x6d26de20, - // Block 0x829, offset 0x20a40 - 0x20a46: 0x6c971820, 0x20a47: 0x6d020820, - 0x20a48: 0x6c6f8620, 0x20a49: 0x6c627420, 0x20a4b: 0x6d26e820, - 0x20a4f: 0x6c64f220, - 0x20a51: 0x6c4e3020, 0x20a53: 0x6cc98a20, - 0x20a54: 0x6c5c2820, 0x20a55: 0x6cbc5a20, 0x20a57: 0x6ccb5220, - 0x20a58: 0x6d419a20, 0x20a5b: 0x6c91d620, - 0x20a5c: 0x6c57c420, 0x20a5d: 0x6c1e6820, 0x20a5e: 0x6ccd5c20, 0x20a5f: 0x6cf31220, - 0x20a60: 0x6c60a220, 0x20a61: 0x6d3d9620, 0x20a62: 0x6cfb8c20, 0x20a63: 0x6d141020, - 0x20a64: 0x6c4c8820, 0x20a65: 0x6c7d1c20, - // Block 0x82a, offset 0x20a80 - 0x20a91: 0x6d38a820, - 0x20a94: 0x6c929e20, 0x20a96: 0x6c0e9020, 0x20a97: 0x6cd28a20, - 0x20a98: 0x6d1d4a20, 0x20a99: 0x6c7a5c20, - 0x20ab9: 0x6d36d820, 0x20aba: 0x6d00e820, - 0x20abd: 0x6d135420, 0x20abe: 0x6c36b420, 0x20abf: 0x6c940420, - // Block 0x82b, offset 0x20ac0 - 0x20ac0: 0x6c4f1420, 0x20ac1: 0x6d135620, - 0x20ac6: 0x6c962c20, 0x20ac7: 0x6c21dc20, - 0x20ac8: 0x6c397020, 0x20ac9: 0x6d34a020, 0x20aca: 0x6d1d5020, 0x20acb: 0x6cf1f220, - 0x20acc: 0x6cebf220, 0x20acd: 0x6c00d620, 0x20ace: 0x6d21b020, - 0x20ad1: 0x6c571a20, 0x20ad3: 0x6c8b3220, - 0x20ad4: 0x6c6dd620, 0x20ad5: 0x6d28ca20, - 0x20ae7: 0x6d29e820, - 0x20ae8: 0x6c336420, 0x20aea: 0x6c629220, - 0x20aee: 0x6cf2a220, - 0x20af0: 0x6c60ba20, 0x20af1: 0x6cf6e420, 0x20af3: 0x6d2e8620, - 0x20af4: 0x6ce95c20, - // Block 0x82c, offset 0x20b00 - 0x20b0a: 0x6d21b220, - 0x20b0f: 0x6c8b4620, - 0x20b12: 0x6d372420, 0x20b13: 0x6cd20a20, - 0x20b15: 0x6c81c220, 0x20b16: 0x6c7f6020, 0x20b17: 0x6cf03620, - 0x20b18: 0x6cad7220, 0x20b19: 0x6c1b6220, 0x20b1a: 0x6d1d1420, 0x20b1b: 0x6c314020, - 0x20b1d: 0x6c314220, 0x20b1f: 0x6c067620, - 0x20b20: 0x6cbcf020, 0x20b21: 0x6cd62020, 0x20b23: 0x6d34a820, - 0x20b29: 0x6c8b4820, 0x20b2b: 0x6caed620, - 0x20b2d: 0x6d300620, - 0x20b3f: 0x6cab5a20, - // Block 0x82d, offset 0x20b40 - 0x20b42: 0x6d023c20, 0x20b43: 0x6c60d820, - 0x20b44: 0x6c7f6220, 0x20b45: 0x6d1cb020, 0x20b46: 0x6c134c20, - 0x20b56: 0x6c820020, - 0x20b5d: 0x6c952820, - 0x20b61: 0x6c8fbc20, 0x20b62: 0x6cf91020, - 0x20b66: 0x6c8c7620, - 0x20b69: 0x6c4aa020, - 0x20b73: 0x6d03b020, - 0x20b77: 0x6c848620, - 0x20b78: 0x6c221620, - // Block 0x82e, offset 0x20b80 - 0x20b87: 0x6cbebc20, - 0x20b91: 0x6c652e20, 0x20b92: 0x6c2a4420, 0x20b93: 0x6c661420, - 0x20b94: 0x6cbee820, 0x20b95: 0x6d026e20, 0x20b96: 0x6d1d5a20, - 0x20b9f: 0x6c4d0020, - 0x20ba1: 0x6d311820, 0x20ba2: 0x6ccf0420, 0x20ba3: 0x6c9c9a20, - 0x20ba4: 0x6c58ba20, - 0x20bb1: 0x6c248220, 0x20bb2: 0x6cc7e820, 0x20bb3: 0x6cc95a20, - 0x20bb4: 0x6c5e4620, 0x20bb5: 0x6d143420, 0x20bb7: 0x6c2b4e20, - 0x20bb9: 0x6c949e20, 0x20bbb: 0x6d193e20, - // Block 0x82f, offset 0x20bc0 - 0x20bc2: 0x6c100020, 0x20bc3: 0x6cad1820, - 0x20bc4: 0x6ce04220, 0x20bc5: 0x6c35a420, 0x20bc6: 0x6d29ee20, 0x20bc7: 0x6c23c420, - 0x20bd3: 0x6d2d0a20, - 0x20bd5: 0x6cf82620, 0x20bd6: 0x6c98b020, - 0x20bd8: 0x6c7eca20, 0x20bd9: 0x6d287820, - 0x20be1: 0x6c36e620, - 0x20be5: 0x6c2f0e20, - 0x20bed: 0x6c493c20, - 0x20bf1: 0x6c596620, - 0x20bf5: 0x6cd40620, 0x20bf6: 0x6c663220, - 0x20bf9: 0x6d2dce20, 0x20bfa: 0x6c610620, 0x20bfb: 0x6c596820, - // Block 0x830, offset 0x20c00 - 0x20c05: 0x6cedb220, 0x20c06: 0x6c95d820, - 0x20c0f: 0x6c315620, - 0x20c15: 0x6c893c20, - 0x20c23: 0x6ca7ea20, - 0x20c24: 0x6ca41c20, 0x20c25: 0x6c6fc820, 0x20c26: 0x6d266c20, - 0x20c29: 0x6d108820, 0x20c2a: 0x6c204c20, - 0x20c2e: 0x6c11cc20, 0x20c2f: 0x6c84f820, - 0x20c30: 0x6c33d420, 0x20c31: 0x6ca41e20, 0x20c32: 0x6ca42020, - 0x20c38: 0x6cc63820, - 0x20c3d: 0x6d267820, - // Block 0x831, offset 0x20c40 - 0x20c40: 0x6d1ee620, 0x20c42: 0x6d19a420, - 0x20c44: 0x6c4c5820, - 0x20c48: 0x6c295420, - 0x20c51: 0x6d312620, 0x20c52: 0x6c9c3c20, 0x20c53: 0x6c2e6820, - 0x20c56: 0x6d312820, - 0x20c5a: 0x6c7abe20, - 0x20c5c: 0x6c4de220, 0x20c5d: 0x6cd98020, 0x20c5e: 0x6c50d020, 0x20c5f: 0x6c5e9620, - 0x20c60: 0x6d302e20, - 0x20c64: 0x6c0dd620, 0x20c66: 0x6ceef220, 0x20c67: 0x6ce7d220, - 0x20c69: 0x6ce88c20, - 0x20c6c: 0x6c426e20, 0x20c6d: 0x6c908220, 0x20c6e: 0x6cc2c820, 0x20c6f: 0x6c5d2220, - 0x20c70: 0x6d3ba420, 0x20c71: 0x6cc3b220, 0x20c73: 0x6c533a20, - 0x20c75: 0x6c296020, 0x20c76: 0x6c510420, 0x20c77: 0x6cdf6e20, - 0x20c78: 0x6c48ca20, 0x20c7a: 0x6d230220, - 0x20c7c: 0x6d0baa20, 0x20c7f: 0x6cec8c20, - // Block 0x832, offset 0x20c80 - 0x20c80: 0x6cc43820, - 0x20c85: 0x6c744620, 0x20c86: 0x6cab3820, - 0x20c89: 0x6cc29c20, 0x20c8a: 0x6d347220, - 0x20c8d: 0x6c8d1820, 0x20c8e: 0x6cf37020, 0x20c8f: 0x6d033c20, - 0x20c90: 0x6c26ae20, 0x20c92: 0x6d24f220, 0x20c93: 0x6d261e20, - 0x20c97: 0x6ca13820, - 0x20c99: 0x6d1f5420, - 0x20c9e: 0x6cf45820, - 0x20ca0: 0x6d2ebe20, 0x20ca3: 0x6d07b820, - 0x20ca6: 0x6cc53c20, 0x20ca7: 0x6c4be220, - 0x20ca8: 0x6d23be20, - 0x20cae: 0x6cf9fc20, 0x20caf: 0x6c0b5220, - 0x20cb0: 0x6d1f7e20, 0x20cb2: 0x6d1a1420, - 0x20cb4: 0x6d083220, 0x20cb5: 0x6d1f8c20, 0x20cb6: 0x6c827a20, - 0x20cbc: 0x6ce6a620, 0x20cbf: 0x6d311a20, - // Block 0x833, offset 0x20cc0 - 0x20cc4: 0x6d292420, 0x20cc5: 0x6c40ba20, 0x20cc6: 0x6c7e5620, - 0x20cc9: 0x6cc39e20, - 0x20cce: 0x6c70ec20, - 0x20cd0: 0x6c20fa20, 0x20cd1: 0x6c263e20, 0x20cd2: 0x6cea3a20, 0x20cd3: 0x6c001220, - 0x20cd7: 0x6d3edc20, - 0x20cda: 0x6c59a620, 0x20cdb: 0x6d167c20, - 0x20ce9: 0x6c062e20, 0x20cea: 0x6c1afc20, - 0x20ced: 0x6cc63a20, - 0x20cf4: 0x6c913220, 0x20cf7: 0x6c6a6c20, - 0x20cf8: 0x6cd30a20, 0x20cfa: 0x6d413620, - // Block 0x834, offset 0x20d00 - 0x20d01: 0x6d167e20, - 0x20d04: 0x6c3bc820, 0x20d05: 0x6c3bca20, - 0x20d09: 0x6ca0c420, - 0x20d0d: 0x6cd59a20, - 0x20d1b: 0x6c023e20, - 0x20d1d: 0x6cb05620, 0x20d1e: 0x6cb27820, 0x20d1f: 0x6cb2f820, - 0x20d20: 0x6c639e20, 0x20d21: 0x6d38ca20, 0x20d23: 0x6cbf9e20, - 0x20d27: 0x6d1fa620, - 0x20d28: 0x6cdfd020, 0x20d2b: 0x6cc6f620, - 0x20d2d: 0x6c9d2020, - 0x20d36: 0x6d16ac20, - 0x20d38: 0x6cc6fc20, 0x20d3b: 0x6c8ace20, - 0x20d3c: 0x6cbf0220, - // Block 0x835, offset 0x20d40 - 0x20d59: 0x6c5b2020, 0x20d5a: 0x6c61a020, - 0x20d5f: 0x6c433a20, - 0x20d67: 0x6d1f0420, - 0x20d68: 0x6c138220, 0x20d69: 0x6c2a6020, 0x20d6a: 0x6d19ac20, - 0x20d6c: 0x6d22de20, 0x20d6d: 0x6c06fc20, 0x20d6f: 0x6c0ed020, - // Block 0x836, offset 0x20d80 - 0x20d94: 0x6cbb6820, - 0x20d9a: 0x6c141c20, - 0x20d9c: 0x6d02be20, 0x20d9e: 0x6c1b1420, - 0x20da3: 0x6d2a7220, - 0x20da4: 0x6c7c6020, 0x20da6: 0x6c3aa220, - 0x20da9: 0x6cddea20, 0x20daa: 0x6c48f420, - 0x20dad: 0x6c342620, - 0x20db2: 0x6c4a5420, - 0x20db4: 0x6d345020, - // Block 0x837, offset 0x20dc0 - 0x20dcc: 0x6c15a620, 0x20dcd: 0x6ca4ec20, - 0x20dd0: 0x6c553e20, 0x20dd2: 0x6ce21820, - 0x20de1: 0x6d175620, - 0x20de4: 0x6ca82a20, 0x20de5: 0x6d2d3e20, 0x20de6: 0x6c587220, - 0x20de8: 0x6c325620, 0x20dea: 0x6cb78620, 0x20deb: 0x6c12e420, - 0x20dee: 0x6c20cc20, - 0x20df2: 0x6c264e20, - 0x20df6: 0x6d361820, 0x20df7: 0x6c453020, - 0x20dfb: 0x6cf26e20, - // Block 0x838, offset 0x20e00 - 0x20e09: 0x6c325820, - 0x20e0d: 0x6c1b2420, - 0x20e11: 0x6c01be20, 0x20e12: 0x6c7df820, - 0x20e14: 0x6cf2e820, - 0x20e18: 0x6d1bb620, 0x20e1a: 0x6cb13e20, - 0x20e2b: 0x6d2c3020, - 0x20e2c: 0x6d3b6420, 0x20e2e: 0x6cdac420, - 0x20e33: 0x6ca6a620, - 0x20e3a: 0x6d3a1420, 0x20e3b: 0x6c14fe20, - 0x20e3e: 0x6c084020, 0x20e3f: 0x6ca5f220, - // Block 0x839, offset 0x20e40 - 0x20e40: 0x6d347420, 0x20e41: 0x6c5bd420, - 0x20e58: 0x6cfa3a20, 0x20e5a: 0x6d364e20, 0x20e5b: 0x6cf63c20, - 0x20e5e: 0x6c67aa20, - 0x20e69: 0x6c330220, 0x20e6a: 0x6c3d7c20, - 0x20e6d: 0x6c685c20, 0x20e6e: 0x6c176820, 0x20e6f: 0x6c045020, - 0x20e75: 0x6c8b1e20, - 0x20e7c: 0x6c025a20, - // Block 0x83a, offset 0x20e80 - 0x20e8b: 0x6d2a1620, - 0x20e8c: 0x6c1f6020, 0x20e8f: 0x6ceb8620, - 0x20e92: 0x6c4fd220, 0x20e93: 0x6c773620, - 0x20e94: 0x6d1a7e20, 0x20e96: 0x6cfcea20, - 0x20e9d: 0x6c401820, 0x20e9e: 0x6c0cb620, - 0x20ea0: 0x6c7c4020, - 0x20ea4: 0x6cbcde20, 0x20ea5: 0x6cc98420, - 0x20ebf: 0x6c266220, - // Block 0x83b, offset 0x20ec0 - 0x20ec0: 0x6d12b220, - 0x20ec4: 0x6d2f0820, 0x20ec6: 0x6c896420, - 0x20ec8: 0x6c332620, - 0x20ecd: 0x6c816620, 0x20ece: 0x6d09a620, - 0x20ed8: 0x6d36a420, 0x20eda: 0x6c7a5a20, - 0x20ede: 0x6cdc6a20, 0x20edf: 0x6cf2a020, - 0x20ee3: 0x6c7a5e20, - 0x20eef: 0x6c65d420, - 0x20ef6: 0x6c67ba20, - 0x20efb: 0x6d3caa20, - 0x20efd: 0x6cd6dc20, 0x20efe: 0x6d219c20, - // Block 0x83c, offset 0x20f00 - 0x20f01: 0x6cc98c20, 0x20f03: 0x6d23e620, - 0x20f04: 0x6c803a20, - 0x20f0a: 0x6d240620, - 0x20f0c: 0x6cba2820, 0x20f0d: 0x6c72a220, 0x20f0f: 0x6c8b3420, - 0x20f12: 0x6cd53e20, 0x20f13: 0x6cfd1a20, - 0x20f16: 0x6c415420, - 0x20f22: 0x6cdf4420, - 0x20f27: 0x6ce52220, - 0x20f2f: 0x6c9c1020, - 0x20f31: 0x6c2ba220, 0x20f33: 0x6c9ddc20, - 0x20f3e: 0x6c5afa20, - // Block 0x83d, offset 0x20f40 - 0x20f49: 0x6c351c20, - 0x20f4d: 0x6c8b4a20, - 0x20f52: 0x6c7f6820, 0x20f53: 0x6d1aa820, - 0x20f54: 0x6c804620, 0x20f56: 0x6c68a020, - 0x20f58: 0x6c5e2620, - 0x20f63: 0x6c4c4c20, - 0x20f66: 0x6d2e9420, - 0x20f6d: 0x6c9d0820, - 0x20f70: 0x6c7c5020, - 0x20f77: 0x6c352620, - 0x20f7f: 0x6d1ab020, - // Block 0x83e, offset 0x20f80 - 0x20f87: 0x6c836020, - 0x20f95: 0x6c462a20, - 0x20f9b: 0x6ce6ac20, - 0x20f9c: 0x6d10c820, 0x20f9e: 0x6cedf620, - 0x20fa3: 0x6c6aa020, - 0x20fa8: 0x6d04c220, 0x20faa: 0x6cd5c020, - 0x20fb1: 0x6cf08c20, - 0x20fb4: 0x6d236620, - // Block 0x83f, offset 0x20fc0 - 0x20fc1: 0x6d2da620, - 0x20fc9: 0x6c01ee20, - 0x20fcf: 0x6cca9a20, - 0x20fd0: 0x6c1e0c20, 0x20fd2: 0x6c7ae220, - 0x20fd6: 0x6c71a020, 0x20fd7: 0x6c4d5220, - 0x20fe2: 0x6c9e0420, - 0x20fe7: 0x6c4f9420, - 0x20fea: 0x6c1d9e20, - 0x20fee: 0x6c8d1a20, - 0x20ff0: 0x6d3f9620, - // Block 0x840, offset 0x21000 - 0x21009: 0x6c7d4820, - 0x2100c: 0x6d378c20, 0x2100e: 0x6d2f5420, - 0x21010: 0x6c2f2e20, 0x21011: 0x6c467420, 0x21012: 0x6d279620, 0x21013: 0x6c27c620, - 0x21014: 0x6caada20, - 0x2101b: 0x6c0dd820, - 0x2101d: 0x6cc47420, 0x2101e: 0x6c14c420, - 0x21022: 0x6cc70620, 0x21023: 0x6d19c820, - 0x21024: 0x6c14c620, 0x21027: 0x6d361a20, - 0x2102a: 0x6c48f820, 0x2102b: 0x6caabe20, - 0x2102c: 0x6ccfe420, 0x2102f: 0x6cdac620, - 0x21032: 0x6cf2b820, 0x21033: 0x6c1bb220, - 0x2103a: 0x6c9ee220, 0x2103b: 0x6d347e20, - 0x2103e: 0x6cb50a20, - // Block 0x841, offset 0x21040 - 0x21041: 0x6c465820, - 0x21046: 0x6c90fa20, - 0x21048: 0x6d3ea020, - 0x2104d: 0x6c293a20, 0x2104f: 0x6cfc6820, - 0x21051: 0x6cc77e20, - 0x21057: 0x6caefe20, - 0x2105e: 0x6cf56c20, - 0x21062: 0x6c7aba20, - 0x21064: 0x6c4b2620, 0x21065: 0x6c212e20, 0x21066: 0x6c6baa20, - 0x21072: 0x6c6bac20, 0x21073: 0x6cf57820, - 0x21075: 0x6c7a1a20, 0x21077: 0x6c46ec20, - 0x21078: 0x6d2cac20, 0x21079: 0x6c392620, - 0x2107c: 0x6d015a20, - // Block 0x842, offset 0x21080 - 0x2108d: 0x6c585e20, 0x2108f: 0x6ca79020, - 0x21090: 0x6cf85820, - 0x2109b: 0x6c240820, - 0x2109d: 0x6c4bba20, - 0x210a1: 0x6cf5b620, - 0x210a7: 0x6cb83620, - 0x210aa: 0x6c981c20, - 0x210ad: 0x6d303220, - 0x210b0: 0x6c734620, - 0x210b4: 0x6c0ca020, - // Block 0x843, offset 0x210c0 - 0x210c0: 0x6c0ca220, - 0x210c5: 0x6cc2d620, - 0x210cb: 0x6cf88620, - 0x210ce: 0x6c68f020, - 0x210d0: 0x6cc2ea20, 0x210d1: 0x6d352620, 0x210d2: 0x6ce46820, 0x210d3: 0x6c762a20, - 0x210d8: 0x6cca1a20, 0x210db: 0x6d3e4c20, - 0x210e3: 0x6c6adc20, - 0x210ea: 0x6c0cec20, - 0x210ec: 0x6c312c20, 0x210ed: 0x6d417620, - 0x210f6: 0x6d0db020, - // Block 0x844, offset 0x21100 - 0x21101: 0x6c0a1c20, - 0x21105: 0x6c7b0020, 0x21107: 0x6d0eb620, - 0x21108: 0x6cef3820, 0x2110a: 0x6c583420, - 0x2110c: 0x6c506420, - 0x21111: 0x6c45b820, - 0x21114: 0x6c9b5420, 0x21117: 0x6c82e420, - 0x21119: 0x6c2cae20, 0x2111b: 0x6c0e0220, - 0x2111c: 0x6c584420, 0x2111f: 0x6cebfe20, - 0x21120: 0x6c751420, - 0x21128: 0x6c1bda20, - 0x2112d: 0x6c030e20, 0x2112e: 0x6c6fa420, - 0x21137: 0x6c2c0e20, - 0x21139: 0x6d2f1c20, 0x2113b: 0x6c26e620, - 0x2113c: 0x6cd23820, 0x2113d: 0x6c501420, - // Block 0x845, offset 0x21140 - 0x2114c: 0x6d12c020, - 0x21157: 0x6c091a20, - 0x21158: 0x6cb05020, 0x21159: 0x6d118820, - 0x2115c: 0x6c2b1420, 0x2115d: 0x6c11ee20, 0x2115e: 0x6cb20220, 0x2115f: 0x6d268420, - 0x21160: 0x6cbc7820, 0x21161: 0x6caf3220, - 0x21175: 0x6ceb7020, 0x21176: 0x6d015c20, - 0x2117d: 0x6d12cc20, - // Block 0x846, offset 0x21180 - 0x21180: 0x6c392820, 0x21181: 0x6c484620, 0x21182: 0x6c566e20, 0x21183: 0x6cc7fa20, - 0x21189: 0x6cc4b620, 0x2118a: 0x6c3d2020, 0x2118b: 0x6c598020, - 0x2119a: 0x6cc79020, - 0x211a2: 0x6c993020, - 0x211a5: 0x6c32f620, 0x211a6: 0x6c5b9820, 0x211a7: 0x6cf85a20, - 0x211a8: 0x6d04bc20, 0x211ab: 0x6cc4b820, - 0x211ac: 0x6d13d620, 0x211af: 0x6d303420, - 0x211b1: 0x6c61c620, 0x211b2: 0x6c434020, 0x211b3: 0x6d203820, - 0x211b5: 0x6cb40620, - // Block 0x847, offset 0x211c0 - 0x211c8: 0x6c1f2220, 0x211c9: 0x6c240a20, 0x211ca: 0x6d303620, 0x211cb: 0x6ca79220, - 0x211cd: 0x6cbca620, - 0x211d0: 0x6c13d220, 0x211d2: 0x6ca79420, 0x211d3: 0x6cdbb620, - 0x211d9: 0x6c13d420, 0x211da: 0x6c19da20, 0x211db: 0x6d10e020, - 0x211dc: 0x6c324820, 0x211dd: 0x6cedc820, 0x211df: 0x6ca76220, - 0x211e0: 0x6c9c4420, - 0x211e6: 0x6caa1620, 0x211e7: 0x6cf87820, - 0x211e9: 0x6d109820, 0x211eb: 0x6c14c820, - // Block 0x848, offset 0x21200 - 0x21218: 0x6d018c20, 0x21219: 0x6c9ed420, 0x2121a: 0x6c796420, - 0x2121c: 0x6c243a20, 0x2121e: 0x6cd13620, 0x2121f: 0x6cacb620, - 0x21220: 0x6c569c20, 0x21222: 0x6c78b020, 0x21223: 0x6cfcc220, - 0x21225: 0x6c53fa20, 0x21226: 0x6cbf2020, 0x21227: 0x6d3f8220, - 0x2122a: 0x6c3e7420, 0x2122b: 0x6ca3be20, - 0x2122d: 0x6ca69e20, 0x2122f: 0x6c7a7a20, - 0x2123e: 0x6ca59820, - // Block 0x849, offset 0x21240 - 0x2124d: 0x6c439020, - 0x21251: 0x6c53fc20, 0x21253: 0x6c002620, - 0x21255: 0x6cd1ba20, - 0x2125e: 0x6d04d420, 0x2125f: 0x6c230e20, - 0x21260: 0x6c684420, 0x21262: 0x6d2c3220, 0x21263: 0x6cfebe20, - 0x21264: 0x6c88f820, 0x21265: 0x6cc24820, - 0x21268: 0x6ccd4420, 0x21269: 0x6d01c020, 0x2126b: 0x6c461c20, - 0x2126c: 0x6c9ed820, 0x2126d: 0x6c148020, 0x2126f: 0x6c371620, - 0x21273: 0x6c312220, - // Block 0x84a, offset 0x21280 - 0x21286: 0x6c79f020, - 0x2128a: 0x6ce58a20, 0x2128b: 0x6cd1cc20, - 0x2128f: 0x6cca7020, - 0x21292: 0x6c491a20, - 0x21296: 0x6c505620, 0x21297: 0x6d367c20, - 0x21298: 0x6d106620, 0x21299: 0x6ce70020, 0x2129a: 0x6c09ee20, - 0x2129c: 0x6ca06420, 0x2129e: 0x6c3ebe20, - 0x212a5: 0x6cbb1420, - 0x212b9: 0x6d367e20, - 0x212bc: 0x6cd9ca20, 0x212bf: 0x6ca7a020, - // Block 0x84b, offset 0x212c0 - 0x212c0: 0x6c738020, 0x212c2: 0x6d105620, - 0x212c4: 0x6c599e20, - 0x212c8: 0x6c080020, 0x212c9: 0x6ca06620, 0x212ca: 0x6c176a20, - 0x212ce: 0x6c93a420, 0x212cf: 0x6cce8220, - 0x212d0: 0x6c104220, 0x212d1: 0x6d2b8820, 0x212d2: 0x6cd81020, - 0x212d4: 0x6d41c420, 0x212d5: 0x6d265620, 0x212d6: 0x6d294c20, 0x212d7: 0x6c948e20, - 0x212e5: 0x6cc1b020, - 0x212fa: 0x6c9e9820, - // Block 0x84c, offset 0x21300 - 0x21300: 0x6d3bd820, - 0x21308: 0x6c297e20, 0x2130a: 0x6d250a20, - 0x21312: 0x6c71d220, - 0x21315: 0x6c5b6020, 0x21316: 0x6cb7d020, - 0x21318: 0x6d285220, 0x2131a: 0x6c97fe20, - 0x2131c: 0x6ca0aa20, - 0x21331: 0x6cb16220, 0x21333: 0x6c6d4a20, - 0x21339: 0x6d10b820, - // Block 0x84d, offset 0x21340 - 0x21340: 0x6c1c6820, 0x21341: 0x6ca6c620, 0x21342: 0x6cd9de20, - 0x21348: 0x6cd61a20, 0x2134b: 0x6cb16420, - 0x21354: 0x6c4f1620, - 0x21360: 0x6d10be20, 0x21362: 0x6ca56020, - 0x2136a: 0x6cd3f020, - 0x2136c: 0x6d251820, 0x2136e: 0x6c114c20, 0x2136f: 0x6c6b5220, - 0x21379: 0x6d023e20, - 0x2137d: 0x6d0cec20, 0x2137e: 0x6cff3620, - // Block 0x84e, offset 0x21380 - 0x2138b: 0x6d025020, - 0x2138c: 0x6c86ec20, 0x2138e: 0x6c397620, - 0x21397: 0x6d3b3c20, - 0x21399: 0x6ca37220, 0x2139b: 0x6d3bb620, - 0x2139e: 0x6c7c4c20, - 0x213a2: 0x6c957020, - 0x213ab: 0x6cb83220, - 0x213b6: 0x6ceca820, - 0x213bd: 0x6cd54c20, 0x213bf: 0x6c1a7c20, - // Block 0x84f, offset 0x213c0 - 0x213c1: 0x6d164620, - 0x213c6: 0x6c500820, - 0x213c8: 0x6c698220, 0x213cb: 0x6c5b8e20, - 0x213cd: 0x6cffce20, 0x213ce: 0x6c222020, - 0x213de: 0x6c61a220, - 0x213e6: 0x6ca62e20, - 0x213e8: 0x6ca63420, 0x213e9: 0x6ce3bc20, - 0x213f6: 0x6c724820, - 0x213f8: 0x6ca04220, - 0x213fd: 0x6c83d220, 0x213ff: 0x6d382c20, - // Block 0x850, offset 0x21400 - 0x21401: 0x6d06d420, 0x21403: 0x6cbf3820, - 0x21404: 0x6c3e9620, 0x21406: 0x6c0d7e20, - 0x2140a: 0x6c621620, - 0x2140d: 0x6cb5f420, 0x2140e: 0x6cf89c20, - 0x21414: 0x6c2ada20, 0x21415: 0x6c376020, - 0x2141b: 0x6cd53220, - 0x2141c: 0x6ce77820, 0x2141d: 0x6cff9620, 0x2141f: 0x6cb01c20, - 0x21428: 0x6c284020, 0x2142a: 0x6c60da20, - 0x21433: 0x6d002020, - 0x21437: 0x6c23ca20, - 0x2143b: 0x6c0d1c20, - 0x2143c: 0x6cc6f020, - // Block 0x851, offset 0x21440 - 0x2144d: 0x6c9e4a20, - 0x21452: 0x6c9e4c20, - 0x21454: 0x6cd49c20, 0x21455: 0x6cff6c20, 0x21456: 0x6c05e420, 0x21457: 0x6cec2220, - 0x21459: 0x6cad8020, - 0x21463: 0x6c410e20, - 0x21465: 0x6c549c20, 0x21466: 0x6c525420, - 0x21468: 0x6d39f220, 0x21469: 0x6c48c420, - 0x2146d: 0x6c4b3820, - 0x21479: 0x6c273e20, - 0x2147c: 0x6c0d2820, 0x2147d: 0x6c5a4420, - // Block 0x852, offset 0x21480 - 0x21480: 0x6c13d620, - 0x21484: 0x6cfa3420, 0x21485: 0x6c710220, 0x21487: 0x6d119a20, - 0x21496: 0x6c3bb620, 0x21497: 0x6d2a7420, - 0x2149b: 0x6c3c3020, - 0x214a2: 0x6c708020, 0x214a3: 0x6d230a20, - 0x214a9: 0x6c5cbe20, - 0x214b2: 0x6c6ab020, 0x214b3: 0x6d049020, - 0x214b5: 0x6ca3ba20, - 0x214bb: 0x6caa1820, - 0x214bd: 0x6cd13820, 0x214bf: 0x6d233420, - // Block 0x853, offset 0x214c0 - 0x214c2: 0x6c587620, 0x214c3: 0x6c450c20, - 0x214c4: 0x6ced1620, 0x214c6: 0x6ceb1e20, 0x214c7: 0x6cbb7820, - 0x214d8: 0x6d1b5220, 0x214da: 0x6c635e20, - 0x214e1: 0x6cdd7220, 0x214e3: 0x6c6ade20, - 0x214e4: 0x6cf64020, 0x214e5: 0x6cf25020, - 0x214e9: 0x6c986620, - 0x214f6: 0x6d0fbe20, - 0x214f8: 0x6d110820, - 0x214fd: 0x6c986c20, 0x214fe: 0x6cab3e20, - // Block 0x854, offset 0x21500 - 0x21501: 0x6c017020, - 0x21505: 0x6c910c20, - 0x21511: 0x6c366e20, 0x21512: 0x6d3f1e20, - 0x21517: 0x6c367020, - 0x21519: 0x6c01c820, - 0x2151e: 0x6c5de220, - 0x21520: 0x6c135220, - 0x21530: 0x6d049c20, 0x21531: 0x6c625e20, 0x21533: 0x6d424e20, - 0x21535: 0x6cb63620, - 0x2153a: 0x6d32ee20, - // Block 0x855, offset 0x21540 - 0x21540: 0x6c5f2e20, 0x21541: 0x6cb52e20, 0x21542: 0x6c732420, 0x21543: 0x6ca91c20, - 0x2155f: 0x6ccb7220, - 0x21565: 0x6c51fa20, 0x21566: 0x6cc72c20, 0x21567: 0x6cbdec20, - 0x2156c: 0x6c70de20, 0x2156f: 0x6c86ee20, - 0x21575: 0x6cd29020, - 0x21578: 0x6ca6da20, 0x21579: 0x6cfbc420, 0x2157a: 0x6c3dbc20, - 0x2157d: 0x6cc80820, - // Block 0x856, offset 0x21580 - 0x21581: 0x6d04ac20, 0x21582: 0x6c4ba220, - 0x21584: 0x6c62e020, 0x21586: 0x6c9bf820, 0x21587: 0x6c3dc020, - 0x21589: 0x6cc9ee20, 0x2158a: 0x6d247820, 0x2158b: 0x6c69de20, - 0x2158c: 0x6c9c2220, 0x2158d: 0x6c900e20, 0x2158e: 0x6cbb0020, - 0x21590: 0x6c9cc620, 0x21593: 0x6d15a420, - 0x21596: 0x6c4dc620, 0x21597: 0x6ca6e620, - 0x21598: 0x6c81ee20, 0x21599: 0x6ccbbe20, - 0x2159c: 0x6c8c4220, 0x2159e: 0x6d22c220, - 0x215a5: 0x6caab020, - 0x215ab: 0x6cf4c020, - 0x215af: 0x6c0b3620, - 0x215b2: 0x6c0b3820, 0x215b3: 0x6d079620, - 0x215b5: 0x6c649620, - 0x215b8: 0x6c0b3c20, - // Block 0x857, offset 0x215c0 - 0x215c2: 0x6c2a7a20, - 0x215c7: 0x6d3b8620, - 0x215cb: 0x6cc72020, - 0x215d0: 0x6cd69820, - 0x215d8: 0x6c631820, 0x215db: 0x6c5b4a20, - 0x215de: 0x6d2d5c20, - 0x215e2: 0x6c042e20, 0x215e3: 0x6c8ac420, - 0x215e5: 0x6d003820, - 0x215ed: 0x6c656c20, 0x215ee: 0x6cd44020, - 0x215f3: 0x6c77ba20, - 0x215f7: 0x6c490c20, - 0x215f8: 0x6c949420, - 0x215fe: 0x6caa1a20, 0x215ff: 0x6c16e820, - // Block 0x858, offset 0x21600 - 0x2160e: 0x6c895220, - 0x21619: 0x6ca3c620, 0x2161a: 0x6cc80020, - 0x2161e: 0x6d368020, - 0x21626: 0x6c128620, - 0x21630: 0x6c867420, - 0x2163b: 0x6c7fcc20, - 0x2163f: 0x6c14e220, - // Block 0x859, offset 0x21640 - 0x21641: 0x6cedba20, - 0x21644: 0x6c856620, 0x21647: 0x6cf49620, - 0x21648: 0x6cad4220, 0x21649: 0x6d200a20, 0x2164b: 0x6c415e20, - 0x2164f: 0x6c011420, - 0x21650: 0x6d04b420, 0x21651: 0x6cd70420, 0x21652: 0x6cc8aa20, - 0x21658: 0x6c04b620, 0x21659: 0x6d1eea20, - 0x21662: 0x6c5d6e20, - 0x21665: 0x6c5a9c20, - 0x21668: 0x6d428c20, 0x21669: 0x6cfe9820, 0x2166b: 0x6c9dba20, - 0x21670: 0x6c40d620, 0x21671: 0x6d25e220, 0x21673: 0x6c0ff020, - 0x21674: 0x6c17ba20, 0x21675: 0x6ce9e220, 0x21677: 0x6c0ff220, - 0x2167d: 0x6c40d820, 0x2167f: 0x6ce55820, - // Block 0x85a, offset 0x21680 - 0x21680: 0x6ca2dc20, - 0x21685: 0x6c556a20, 0x21686: 0x6ca83c20, - 0x2168b: 0x6c5b3e20, - 0x2168c: 0x6c90ea20, 0x2168e: 0x6ce35020, - 0x21690: 0x6cbc5420, 0x21691: 0x6cbbee20, 0x21692: 0x6d380620, - 0x21696: 0x6c2b4220, - 0x2169a: 0x6c8bd820, - 0x2169d: 0x6cc32c20, 0x2169e: 0x6d3b9a20, - 0x216a0: 0x6c828e20, 0x216a2: 0x6d013620, - 0x216a5: 0x6cc56220, - 0x216a8: 0x6c28f620, 0x216aa: 0x6c316020, 0x216ab: 0x6ca71420, - 0x216af: 0x6cd2ae20, - 0x216b2: 0x6cfb2020, - 0x216b9: 0x6d343820, - 0x216bd: 0x6c008820, 0x216be: 0x6c21f220, 0x216bf: 0x6cb42a20, - // Block 0x85b, offset 0x216c0 - 0x216c1: 0x6cd2b620, - 0x216c5: 0x6cc0de20, 0x216c6: 0x6cd55020, 0x216c7: 0x6c2cbe20, - 0x216c9: 0x6cffa420, 0x216ca: 0x6cd70a20, - 0x216cc: 0x6c586020, - 0x216d0: 0x6d149220, 0x216d1: 0x6c72dc20, - 0x216d4: 0x6d34fc20, - 0x216dc: 0x6d2f9e20, - 0x216e3: 0x6d06a220, - 0x216ef: 0x6c905a20, - 0x216f1: 0x6d3aca20, 0x216f3: 0x6cdd5620, - 0x216f7: 0x6c2e8020, - 0x216fa: 0x6cc18420, - 0x216fc: 0x6c78a220, 0x216fd: 0x6c54ba20, 0x216fe: 0x6c708220, - // Block 0x85c, offset 0x21700 - 0x21700: 0x6cbea420, - 0x2170d: 0x6c0dae20, - 0x21715: 0x6ce3f220, 0x21717: 0x6c744820, - 0x2171a: 0x6cc05a20, - 0x21723: 0x6c67e420, - 0x2172a: 0x6d282e20, - 0x2172d: 0x6c9a9a20, 0x2172e: 0x6caf6e20, - 0x21730: 0x6cc1a020, - 0x2173c: 0x6c9d5220, 0x2173f: 0x6ce3fe20, - // Block 0x85d, offset 0x21740 - 0x21742: 0x6c768c20, - 0x21744: 0x6c08e820, 0x21746: 0x6cc11c20, - 0x2174f: 0x6ce56620, - 0x21751: 0x6c1f6c20, - 0x21758: 0x6c714a20, 0x2175a: 0x6cf69620, - 0x2175e: 0x6c8c5e20, - 0x2176d: 0x6c1bca20, 0x2176e: 0x6c5f7e20, - 0x21774: 0x6c917a20, - 0x21778: 0x6c876220, - 0x2177e: 0x6c73c820, - // Block 0x85e, offset 0x21780 - 0x21785: 0x6d397c20, 0x21786: 0x6c921020, - 0x2178e: 0x6ca7f620, - 0x21794: 0x6cc2c020, - 0x217ad: 0x6d0b6820, 0x217af: 0x6c35c220, - 0x217b1: 0x6c564020, - // Block 0x85f, offset 0x217c0 - 0x217c0: 0x6c982620, - 0x217c9: 0x6cf4a020, - 0x217cc: 0x6c137620, - 0x217d1: 0x6cbd1820, 0x217d2: 0x6c6a6220, 0x217d3: 0x6c52f420, - 0x217d5: 0x6c27b620, 0x217d6: 0x6c371c20, 0x217d7: 0x6d2b3a20, - 0x217d8: 0x6c565220, 0x217d9: 0x6c020e20, 0x217da: 0x6c6bb220, 0x217db: 0x6c3faa20, - 0x217dc: 0x6d1e7020, 0x217de: 0x6c3c1a20, - 0x217ec: 0x6ca26620, - 0x217f6: 0x6ccb1620, 0x217f7: 0x6c238a20, - 0x217fb: 0x6c772220, - // Block 0x860, offset 0x21800 - 0x21802: 0x6d11ea20, 0x21803: 0x6c008c20, - 0x21804: 0x6c05a620, 0x21806: 0x6cb34c20, - 0x21808: 0x6cd2b820, 0x21809: 0x6c392a20, 0x2180b: 0x6c70f420, - 0x2180c: 0x6cafb420, 0x2180e: 0x6cf07420, 0x2180f: 0x6c7a2220, - 0x21810: 0x6cbc8620, 0x21811: 0x6c417220, - 0x21822: 0x6c7be220, 0x21823: 0x6cdc2420, - 0x21824: 0x6c07d620, 0x21825: 0x6c632820, 0x21826: 0x6d0b8020, - 0x2182a: 0x6c76fe20, 0x2182b: 0x6ca7f820, - 0x2182d: 0x6d03cc20, 0x2182f: 0x6cf85c20, - 0x21831: 0x6c8c4a20, 0x21832: 0x6c347e20, - 0x21834: 0x6c159a20, - // Block 0x861, offset 0x21840 - 0x21848: 0x6cd32e20, 0x2184b: 0x6c334020, - 0x2184d: 0x6c675020, 0x2184e: 0x6d222a20, 0x2184f: 0x6c922020, - 0x21850: 0x6c372020, 0x21853: 0x6c476420, - 0x21855: 0x6cefa020, 0x21856: 0x6c17d620, 0x21857: 0x6c590020, - 0x21858: 0x6c0ce220, 0x2185b: 0x6c4e9420, - 0x2185c: 0x6ce99e20, 0x2185d: 0x6ca32420, 0x2185e: 0x6cb6e620, - 0x21860: 0x6ce7e820, 0x21861: 0x6d24d220, 0x21862: 0x6cede020, - 0x21864: 0x6cf3b020, 0x21865: 0x6c434220, - 0x21868: 0x6c792e20, 0x2186a: 0x6d14ba20, - 0x21878: 0x6cfe9a20, 0x2187a: 0x6c4ae420, 0x2187b: 0x6d0b8c20, - 0x2187c: 0x6cdc2e20, 0x2187d: 0x6cd95420, 0x2187f: 0x6d3d3820, - // Block 0x862, offset 0x21880 - 0x21882: 0x6ce84a20, 0x21883: 0x6cfbf420, - 0x21888: 0x6d2b4420, 0x21889: 0x6c85c620, - 0x2188c: 0x6d3acc20, 0x2188e: 0x6c6aa220, - 0x21891: 0x6ce3e820, - 0x21894: 0x6d009c20, 0x21895: 0x6cbf1220, 0x21897: 0x6d0b9420, - 0x21898: 0x6c708620, 0x2189b: 0x6d1a5a20, - 0x2189c: 0x6d345220, 0x2189e: 0x6c76d020, 0x2189f: 0x6d3e2220, - 0x218a1: 0x6c77f420, 0x218a3: 0x6ca81220, - 0x218a4: 0x6cbb0620, 0x218a5: 0x6ced0220, 0x218a6: 0x6d2abc20, - 0x218a8: 0x6c708820, 0x218aa: 0x6d3f4220, - // Block 0x863, offset 0x218c0 - 0x218c4: 0x6d0b9620, 0x218c7: 0x6c8bae20, - 0x218c9: 0x6cb5c020, - 0x218ce: 0x6c5b3420, - 0x218d3: 0x6cb77a20, - 0x218d5: 0x6d0fa820, 0x218d6: 0x6cdc3620, - 0x218d8: 0x6cb6f220, 0x218d9: 0x6c4a5620, - 0x218e2: 0x6cbe1020, 0x218e3: 0x6c353e20, - 0x218e5: 0x6d429820, - 0x218e8: 0x6d2b4820, 0x218e9: 0x6cb77c20, 0x218ea: 0x6c602e20, - 0x218ec: 0x6ceb2020, 0x218ed: 0x6c2e9c20, 0x218ef: 0x6c5bbe20, - 0x218f0: 0x6c98e420, 0x218f2: 0x6d063e20, - 0x218f5: 0x6c53fe20, 0x218f6: 0x6d0d7c20, 0x218f7: 0x6cfdc220, - 0x218f8: 0x6c231020, 0x218f9: 0x6c555820, - 0x218fc: 0x6c01c020, 0x218fe: 0x6c0de420, - // Block 0x864, offset 0x21900 - 0x21907: 0x6c348e20, - 0x21910: 0x6d3a6a20, 0x21911: 0x6c2e9e20, 0x21912: 0x6d1ea220, 0x21913: 0x6cb6fa20, - 0x21914: 0x6cd26820, 0x21915: 0x6d099a20, 0x21916: 0x6d1ea420, 0x21917: 0x6c76ae20, - 0x21918: 0x6cbc2420, 0x2191b: 0x6cbab620, - 0x2191c: 0x6cae3e20, 0x2191f: 0x6cc2ee20, - 0x21921: 0x6d1c6e20, - 0x21927: 0x6ccbf220, - 0x2192b: 0x6ce1d020, - 0x2192d: 0x6c53c020, 0x2192e: 0x6cb06220, 0x2192f: 0x6d110a20, - 0x21934: 0x6ce8bc20, 0x21935: 0x6c148220, 0x21937: 0x6cfa3c20, - 0x21938: 0x6cb5f620, 0x2193a: 0x6cbf3a20, - 0x2193d: 0x6c6d1220, - // Block 0x865, offset 0x21940 - 0x21948: 0x6d316020, - 0x2194c: 0x6d39ae20, 0x2194e: 0x6cf64420, - 0x21950: 0x6cf22a20, 0x21951: 0x6d37f820, - 0x21955: 0x6cdc4420, - 0x21958: 0x6c781020, 0x21959: 0x6c7e0c20, 0x2195a: 0x6c777220, - 0x2195d: 0x6c176c20, 0x2195e: 0x6c09f020, 0x2195f: 0x6ca13a20, - 0x21960: 0x6d3b1220, 0x21961: 0x6c4edc20, 0x21962: 0x6d227820, 0x21963: 0x6d153220, - 0x21964: 0x6c966c20, 0x21967: 0x6cb7aa20, - 0x21968: 0x6c4c0020, 0x21969: 0x6c97e420, 0x2196a: 0x6c89f420, 0x2196b: 0x6c8bc020, - 0x2196c: 0x6d40c620, 0x2196d: 0x6c82cc20, 0x2196e: 0x6c56b220, 0x2196f: 0x6c209220, - 0x21970: 0x6cb7ac20, 0x21971: 0x6c824420, - // Block 0x866, offset 0x21980 - 0x21981: 0x6c1ac420, 0x21983: 0x6cb33020, - 0x21984: 0x6c2eca20, - 0x2198a: 0x6c82ce20, - 0x2198e: 0x6d160420, - 0x21993: 0x6c2d7620, - 0x21996: 0x6c33a420, 0x21997: 0x6c42d620, - 0x21998: 0x6c54f220, 0x2199a: 0x6cff0020, 0x2199b: 0x6c40ca20, - 0x2199c: 0x6cae8020, - 0x219ac: 0x6cd06a20, - 0x219b1: 0x6cef2a20, - 0x219bb: 0x6c335820, - 0x219bc: 0x6c177220, 0x219bd: 0x6d1b0420, 0x219be: 0x6c7b3a20, 0x219bf: 0x6c7a6020, - // Block 0x867, offset 0x219c0 - 0x219c1: 0x6d41ce20, 0x219c2: 0x6c47ca20, - 0x219c5: 0x6d285420, 0x219c6: 0x6d36da20, - 0x219c9: 0x6c629420, 0x219ca: 0x6c199020, - 0x219d6: 0x6d020e20, - 0x219db: 0x6d419e20, - 0x219dc: 0x6c017420, 0x219dd: 0x6c4fb220, - 0x219e0: 0x6cb36020, 0x219e2: 0x6c2b9820, 0x219e3: 0x6d135820, - 0x219e7: 0x6ca4c420, - 0x219f1: 0x6c6b4220, 0x219f2: 0x6c059220, 0x219f3: 0x6c804020, - 0x219f4: 0x6c124820, 0x219f6: 0x6c0a6620, - 0x219fb: 0x6d2e1a20, - 0x219fc: 0x6cb7e620, - // Block 0x868, offset 0x21a00 - 0x21a02: 0x6ca4c620, - 0x21a05: 0x6c940c20, 0x21a07: 0x6c7c0a20, - 0x21a09: 0x6ca08420, 0x21a0b: 0x6c82e620, - 0x21a0c: 0x6cad7420, - 0x21a12: 0x6c86c420, 0x21a13: 0x6c136420, - 0x21a15: 0x6c299820, 0x21a16: 0x6c82e820, - 0x21a19: 0x6c36cc20, 0x21a1b: 0x6c086020, - 0x21a1c: 0x6c74e820, - 0x21a25: 0x6d083420, 0x21a26: 0x6ca89420, - 0x21a28: 0x6c4d7c20, - 0x21a2e: 0x6cfc4220, - 0x21a30: 0x6c661620, 0x21a31: 0x6c9c9e20, 0x21a32: 0x6ca8a020, - 0x21a3b: 0x6c124a20, - 0x21a3c: 0x6cd97820, 0x21a3d: 0x6d2ba820, 0x21a3e: 0x6d194220, - // Block 0x869, offset 0x21a40 - 0x21a42: 0x6c1d3020, - 0x21a44: 0x6c125020, - 0x21a49: 0x6c830620, 0x21a4a: 0x6caad220, 0x21a4b: 0x6c876420, - 0x21a4e: 0x6c84ba20, 0x21a4f: 0x6c957220, - 0x21a53: 0x6ce18a20, - 0x21a56: 0x6ca8c420, 0x21a57: 0x6ca8c620, - 0x21a59: 0x6c5fae20, 0x21a5b: 0x6c831220, - 0x21a5d: 0x6ca48020, - 0x21a60: 0x6c8c1420, 0x21a61: 0x6c8dce20, - 0x21a64: 0x6cfbe220, 0x21a65: 0x6d24a820, 0x21a67: 0x6d28ec20, - 0x21a68: 0x6cc34a20, 0x21a69: 0x6c8ac020, - 0x21a6f: 0x6d22ce20, - 0x21a70: 0x6c597620, - 0x21a7a: 0x6ca4de20, - 0x21a7c: 0x6d0a7820, 0x21a7e: 0x6c711020, 0x21a7f: 0x6c5dbc20, - // Block 0x86a, offset 0x21a80 - 0x21a81: 0x6d179420, - 0x21a8a: 0x6cf71420, 0x21a8b: 0x6ccb8a20, - 0x21a8c: 0x6c697020, 0x21a8d: 0x6d1de020, - 0x21a95: 0x6cd18c20, 0x21a96: 0x6c6d8420, 0x21a97: 0x6ced6e20, - 0x21a98: 0x6d129e20, 0x21a99: 0x6c6f4420, - 0x21a9c: 0x6c45d020, - 0x21aa1: 0x6c5aa020, - 0x21aaa: 0x6c37a420, - 0x21ab5: 0x6c4e7a20, - 0x21abc: 0x6c3e3020, - // Block 0x86b, offset 0x21ac0 - 0x21ac0: 0x6c3e4a20, 0x21ac1: 0x6d3d4a20, 0x21ac2: 0x6c5eb620, - 0x21acf: 0x6c053a20, - 0x21ad2: 0x6cb56620, 0x21ad3: 0x6cd2a620, - 0x21ad5: 0x6c2df420, 0x21ad6: 0x6cadfa20, 0x21ad7: 0x6cfbe420, - 0x21ad8: 0x6cc9f620, - 0x21add: 0x6c169220, 0x21ade: 0x6d264620, - 0x21ae0: 0x6c455820, 0x21ae2: 0x6cf34220, - 0x21ae4: 0x6c3b0a20, 0x21ae7: 0x6c159020, - 0x21ae9: 0x6ca58420, 0x21aea: 0x6c73d820, - 0x21aec: 0x6d2f8220, 0x21aee: 0x6cb96c20, - 0x21af1: 0x6c029820, - 0x21af6: 0x6cedf820, 0x21af7: 0x6d379020, - 0x21af9: 0x6c597820, 0x21afb: 0x6c106620, - 0x21afc: 0x6d3a5a20, 0x21afd: 0x6c092e20, 0x21afe: 0x6c173620, 0x21aff: 0x6d328620, - // Block 0x86c, offset 0x21b00 - 0x21b00: 0x6c3de620, 0x21b01: 0x6c79b820, 0x21b03: 0x6d422c20, - 0x21b04: 0x6d086c20, 0x21b06: 0x6c3fb220, - 0x21b0a: 0x6d118a20, - 0x21b0d: 0x6c0e4e20, 0x21b0f: 0x6c06e220, - 0x21b10: 0x6d007c20, 0x21b11: 0x6cd33020, 0x21b12: 0x6d149620, - 0x21b14: 0x6c531020, 0x21b15: 0x6c251c20, 0x21b17: 0x6d16e620, - 0x21b18: 0x6d3b7620, - 0x21b1d: 0x6c1bf620, - 0x21b24: 0x6cb2fe20, - 0x21b28: 0x6d1a3a20, - 0x21b31: 0x6d260a20, - 0x21b36: 0x6c6edc20, - 0x21b39: 0x6c995c20, 0x21b3a: 0x6cba4820, - 0x21b3c: 0x6d172420, - // Block 0x86d, offset 0x21b40 - 0x21b40: 0x6cf3b220, - 0x21b4d: 0x6c069820, 0x21b4e: 0x6c5dbe20, 0x21b4f: 0x6c239420, - 0x21b50: 0x6c797220, - 0x21b55: 0x6cde4820, 0x21b57: 0x6c4ea620, - 0x21b58: 0x6cba4e20, - 0x21b5c: 0x6d345420, - 0x21b62: 0x6ccb2420, - 0x21b65: 0x6cb8d620, 0x21b66: 0x6c4cb420, - 0x21b69: 0x6c4bbe20, - 0x21b6c: 0x6c649820, 0x21b6d: 0x6d37b820, 0x21b6e: 0x6c9e2220, 0x21b6f: 0x6c4afa20, - 0x21b70: 0x6cd37e20, 0x21b71: 0x6ca1d220, 0x21b72: 0x6c363220, 0x21b73: 0x6c039e20, - 0x21b74: 0x6c7e7220, - 0x21b78: 0x6d392820, 0x21b7a: 0x6c603020, - // Block 0x86e, offset 0x21b80 - 0x21b80: 0x6d2a4a20, - 0x21b84: 0x6d2bd820, 0x21b85: 0x6d179820, 0x21b87: 0x6c468420, - 0x21b8a: 0x6c4a6e20, 0x21b8b: 0x6d1bc420, - 0x21b8c: 0x6ccc9820, 0x21b8d: 0x6c513420, 0x21b8e: 0x6c057820, 0x21b8f: 0x6ca12a20, - 0x21b90: 0x6c9b1e20, 0x21b93: 0x6cf4fe20, - 0x21b94: 0x6c277620, 0x21b97: 0x6c6f1620, - 0x21b9c: 0x6c4ed020, 0x21b9f: 0x6ce70220, - 0x21ba0: 0x6c79be20, 0x21ba1: 0x6c841220, 0x21ba2: 0x6d368220, 0x21ba3: 0x6c5bf420, - 0x21ba4: 0x6d296e20, 0x21ba6: 0x6c2dfc20, 0x21ba7: 0x6c244420, - 0x21bb1: 0x6d368420, 0x21bb3: 0x6c7adc20, - 0x21bb5: 0x6cfe4a20, 0x21bb6: 0x6c57ba20, 0x21bb7: 0x6c8a0c20, - 0x21bb8: 0x6c255620, 0x21bb9: 0x6cbb9a20, 0x21bba: 0x6c692420, - 0x21bbc: 0x6d05d020, 0x21bbd: 0x6c37da20, 0x21bbf: 0x6cead020, - // Block 0x86f, offset 0x21bc0 - 0x21bc0: 0x6ce00020, 0x21bc1: 0x6d36a820, - 0x21bc8: 0x6ca51020, 0x21bc9: 0x6c99ac20, 0x21bca: 0x6c2c8c20, 0x21bcb: 0x6c135820, - 0x21bce: 0x6c693a20, 0x21bcf: 0x6c884820, - 0x21bd1: 0x6ccc1820, 0x21bd2: 0x6c28aa20, - 0x21bd5: 0x6cdc6c20, 0x21bd6: 0x6c884a20, 0x21bd7: 0x6c4cf020, - 0x21bda: 0x6c0c7c20, - 0x21bdc: 0x6c22e220, 0x21bdd: 0x6c2d7e20, 0x21bde: 0x6c93fc20, 0x21bdf: 0x6ca64e20, - 0x21be0: 0x6d0dda20, 0x21be1: 0x6c7fbc20, - 0x21be4: 0x6c415620, 0x21be5: 0x6c1eb420, - 0x21be9: 0x6c0a8820, 0x21bea: 0x6d40ea20, 0x21beb: 0x6c5c6620, - 0x21bed: 0x6c7f4220, 0x21bee: 0x6cfbba20, 0x21bef: 0x6c3bfc20, - 0x21bf0: 0x6c520220, - 0x21bf9: 0x6d124020, 0x21bfa: 0x6d2e3220, - 0x21bfc: 0x6ca56620, 0x21bfe: 0x6c95d020, - // Block 0x870, offset 0x21c00 - 0x21c00: 0x6d25d620, 0x21c02: 0x6ca5ac20, - 0x21c09: 0x6cc58220, - 0x21c1c: 0x6c43e820, 0x21c1e: 0x6c65a820, 0x21c1f: 0x6cb2b420, - 0x21c23: 0x6c0d1620, - 0x21c26: 0x6c66d020, - 0x21c29: 0x6c0e2e20, - 0x21c2f: 0x6c9d1820, - 0x21c30: 0x6c563420, - 0x21c34: 0x6c2df220, 0x21c36: 0x6d1e8c20, 0x21c37: 0x6d108c20, - 0x21c38: 0x6c07d020, 0x21c3a: 0x6c189820, 0x21c3b: 0x6c5e8c20, - 0x21c3d: 0x6d108e20, - // Block 0x871, offset 0x21c40 - 0x21c47: 0x6c491020, - 0x21c48: 0x6d0e5e20, - 0x21c55: 0x6c1bc820, 0x21c57: 0x6ccc3a20, - 0x21c58: 0x6d0d3820, 0x21c59: 0x6d165e20, 0x21c5a: 0x6d166020, 0x21c5b: 0x6c17fc20, - 0x21c5e: 0x6c4e8220, 0x21c5f: 0x6c597420, - 0x21c64: 0x6cd71020, 0x21c65: 0x6cdc2220, 0x21c66: 0x6cc56820, 0x21c67: 0x6cdfcc20, - 0x21c68: 0x6d34e420, 0x21c6a: 0x6c391e20, 0x21c6b: 0x6c3cc620, - 0x21c70: 0x6cdfce20, 0x21c72: 0x6c9c3620, 0x21c73: 0x6cafb620, - 0x21c74: 0x6c106820, 0x21c75: 0x6ca30e20, 0x21c76: 0x6ce48220, 0x21c77: 0x6c036620, - 0x21c78: 0x6d16b020, - // Block 0x872, offset 0x21c80 - 0x21c82: 0x6d0d4820, - 0x21c84: 0x6ce54c20, 0x21c86: 0x6d10ce20, 0x21c87: 0x6cd04c20, - 0x21c88: 0x6c77dc20, 0x21c89: 0x6ce72420, 0x21c8b: 0x6d084420, - 0x21c93: 0x6d202820, - 0x21c95: 0x6c043a20, - 0x21c99: 0x6cf9a220, 0x21c9a: 0x6c938420, 0x21c9b: 0x6c7dce20, - 0x21c9c: 0x6d29d220, 0x21c9d: 0x6cc02c20, - 0x21ca0: 0x6c243020, 0x21ca1: 0x6d416a20, 0x21ca2: 0x6c90e020, - 0x21ca4: 0x6cf9a420, - 0x21caf: 0x6ccfca20, - 0x21cb2: 0x6cb43020, - 0x21cb4: 0x6c6da620, 0x21cb5: 0x6cbaae20, 0x21cb6: 0x6d175820, - 0x21cb8: 0x6ca81420, 0x21cb9: 0x6c32fc20, 0x21cbb: 0x6c6ab420, - 0x21cbc: 0x6cdc3820, 0x21cbd: 0x6d2e5820, 0x21cbe: 0x6c23e420, - // Block 0x873, offset 0x21cc0 - 0x21cc1: 0x6c07e420, 0x21cc2: 0x6c491220, 0x21cc3: 0x6ccf2a20, - 0x21cc5: 0x6c6cfe20, 0x21cc6: 0x6c2c3e20, - 0x21cd1: 0x6c27d220, 0x21cd3: 0x6ca3a220, - 0x21cd5: 0x6ca9fc20, 0x21cd7: 0x6c601820, - 0x21cd8: 0x6d0c8220, 0x21cda: 0x6caa2020, - 0x21cdc: 0x6c325a20, 0x21cdd: 0x6cf09020, 0x21cde: 0x6cb0f420, - 0x21ce2: 0x6c555a20, - 0x21ce4: 0x6c644020, 0x21ce5: 0x6d12ee20, 0x21ce6: 0x6c759220, 0x21ce7: 0x6c7f9c20, - 0x21ce8: 0x6c7e7420, 0x21ce9: 0x6d19de20, - 0x21ced: 0x6ce9a220, - 0x21cf5: 0x6ca4f620, - 0x21cfa: 0x6d411c20, - 0x21cff: 0x6c96c220, - // Block 0x874, offset 0x21d00 - 0x21d00: 0x6cd7f020, 0x21d01: 0x6d365420, - 0x21d04: 0x6c5ac020, 0x21d05: 0x6d3c8e20, 0x21d07: 0x6c5bd820, - 0x21d0d: 0x6c1e8c20, 0x21d0f: 0x6c182420, - 0x21d12: 0x6d04da20, 0x21d13: 0x6c7fa220, - 0x21d15: 0x6c232620, 0x21d16: 0x6cd0bc20, 0x21d17: 0x6ca13c20, - 0x21d18: 0x6d140220, 0x21d19: 0x6d111a20, 0x21d1a: 0x6cf7fa20, 0x21d1b: 0x6d419020, - 0x21d1c: 0x6c0e2820, - 0x21d27: 0x6d216c20, - 0x21d29: 0x6c927e20, - 0x21d2e: 0x6ce9b620, 0x21d2f: 0x6ceffe20, - 0x21d31: 0x6c3b8820, 0x21d32: 0x6cd06c20, - 0x21d3b: 0x6c8a0e20, - // Block 0x875, offset 0x21d40 - 0x21d42: 0x6cd56a20, 0x21d43: 0x6c284220, - 0x21d44: 0x6c732620, 0x21d45: 0x6d21a020, 0x21d46: 0x6d034a20, 0x21d47: 0x6d114220, - 0x21d48: 0x6cda5820, - 0x21d52: 0x6c5d8020, - 0x21d54: 0x6cb92220, - 0x21d5a: 0x6c967c20, - 0x21d5d: 0x6c767020, - 0x21d61: 0x6c91e620, 0x21d63: 0x6d1ebc20, - 0x21d6e: 0x6cfd2e20, - 0x21d79: 0x6cf40620, 0x21d7b: 0x6d1b2020, - 0x21d7c: 0x6cf72c20, 0x21d7f: 0x6d2d0820, - // Block 0x876, offset 0x21d80 - 0x21d80: 0x6d027020, - 0x21d84: 0x6cc1fa20, - 0x21d88: 0x6c84be20, - 0x21d8d: 0x6cb95820, - 0x21d94: 0x6c8dd020, 0x21d95: 0x6c947820, - 0x21d9a: 0x6c14b220, - 0x21da6: 0x6d334420, - 0x21da8: 0x6d0c8420, - 0x21db2: 0x6d1b3820, 0x21db3: 0x6c7c5c20, - 0x21db7: 0x6cc0d220, - 0x21db9: 0x6c3dd820, 0x21dbb: 0x6d22d420, - // Block 0x877, offset 0x21dc0 - 0x21dc1: 0x6cb57e20, - 0x21dc6: 0x6cb75620, 0x21dc7: 0x6c61a620, - 0x21dc8: 0x6d24ce20, - 0x21dce: 0x6c434420, 0x21dcf: 0x6c734820, - 0x21dd1: 0x6cb5a020, 0x21dd3: 0x6c411020, - 0x21dd5: 0x6cc37220, - 0x21dda: 0x6cf09220, - 0x21de7: 0x6d368620, - 0x21deb: 0x6c65ba20, - 0x21ded: 0x6cd8d620, - 0x21df0: 0x6d188c20, 0x21df1: 0x6cb91c20, - 0x21dfc: 0x6c856220, 0x21dff: 0x6d29ce20, - // Block 0x878, offset 0x21e00 - 0x21e00: 0x6d168020, 0x21e02: 0x6c110620, 0x21e03: 0x6d168220, - 0x21e04: 0x6c437220, 0x21e06: 0x6c2e6e20, - 0x21e08: 0x6d33a420, 0x21e09: 0x6d16ec20, 0x21e0b: 0x6d28fa20, - 0x21e0c: 0x6c275220, 0x21e0e: 0x6cdab220, - 0x21e14: 0x6c6b4420, 0x21e15: 0x6c193820, 0x21e16: 0x6cc1fc20, - 0x21e18: 0x6c4e7820, 0x21e19: 0x6cfb1e20, - 0x21e20: 0x6cc2ae20, 0x21e21: 0x6c6a5620, - 0x21e25: 0x6c733820, - 0x21e2a: 0x6c285c20, - 0x21e2d: 0x6c6c2420, - 0x21e34: 0x6c0da820, 0x21e35: 0x6c551a20, - 0x21e39: 0x6c73da20, 0x21e3b: 0x6d20b020, - // Block 0x879, offset 0x21e40 - 0x21e43: 0x6c84fa20, - 0x21e44: 0x6cbb0420, 0x21e45: 0x6cd70620, 0x21e46: 0x6c7a2420, - 0x21e48: 0x6d31b620, - 0x21e4d: 0x6c3de820, 0x21e4e: 0x6ccfac20, - 0x21e52: 0x6c20c020, - 0x21e55: 0x6ce72620, 0x21e57: 0x6d16ee20, - 0x21e59: 0x6d0f9220, - 0x21e5c: 0x6ceafa20, 0x21e5d: 0x6d385e20, 0x21e5e: 0x6c5ff220, - 0x21e64: 0x6d0a7a20, 0x21e66: 0x6cd05220, 0x21e67: 0x6d078820, - 0x21e6d: 0x6c8e4820, 0x21e6e: 0x6d24dc20, 0x21e6f: 0x6c554220, - 0x21e70: 0x6d334820, 0x21e73: 0x6cae6620, - 0x21e77: 0x6c742220, - // Block 0x87a, offset 0x21e80 - 0x21e82: 0x6d362020, 0x21e83: 0x6cb0f620, - 0x21e84: 0x6d261820, 0x21e86: 0x6c649a20, - 0x21e8a: 0x6cad0220, - 0x21e8e: 0x6d3bca20, - 0x21e90: 0x6cfb6e20, 0x21e92: 0x6c080220, - 0x21e94: 0x6c232820, 0x21e96: 0x6ca13e20, - 0x21e9a: 0x6c4c7420, - 0x21e9e: 0x6c1a3420, 0x21e9f: 0x6cbb9c20, - 0x21ea6: 0x6c0a4a20, - 0x21ea9: 0x6cbb4820, 0x21eab: 0x6d38aa20, - 0x21eb2: 0x6c38d020, 0x21eb3: 0x6c0cc420, - 0x21ebe: 0x6c0fa020, 0x21ebf: 0x6cc73220, - // Block 0x87b, offset 0x21ec0 - 0x21ec5: 0x6c2f8820, 0x21ec6: 0x6cc32e20, 0x21ec7: 0x6c703c20, - 0x21ec8: 0x6d117420, - 0x21ed3: 0x6cf98620, - 0x21ed6: 0x6d2a3e20, - 0x21edd: 0x6c27c820, 0x21edf: 0x6cf44420, - 0x21ee0: 0x6ceb1420, 0x21ee2: 0x6c54c820, - 0x21ee7: 0x6cf64620, - 0x21eec: 0x6c7f1a20, 0x21eee: 0x6c3a1620, - 0x21ef9: 0x6c55ec20, - // Block 0x87c, offset 0x21f00 - 0x21f06: 0x6cfa7220, - 0x21f09: 0x6ccd2c20, - 0x21f0d: 0x6c3a8420, - 0x21f10: 0x6c261820, 0x21f12: 0x6c3e3220, - 0x21f14: 0x6c1f3020, - 0x21f1d: 0x6c2fd020, 0x21f1e: 0x6c807020, - 0x21f29: 0x6cf7fc20, - 0x21f2f: 0x6c0c1420, - 0x21f30: 0x6d23e820, 0x21f31: 0x6cdc6e20, 0x21f32: 0x6cf80c20, - 0x21f37: 0x6cb3e620, - 0x21f3e: 0x6c697c20, - // Block 0x87d, offset 0x21f40 - 0x21f40: 0x6d166420, 0x21f43: 0x6cecb820, - 0x21f44: 0x6c611e20, 0x21f46: 0x6cecc620, 0x21f47: 0x6ce9f220, - 0x21f4b: 0x6c021020, - 0x21f4d: 0x6ce45820, 0x21f4e: 0x6c1b0020, - 0x21f52: 0x6cc46220, - 0x21f54: 0x6cc96820, 0x21f55: 0x6d1a2c20, 0x21f56: 0x6caf3420, 0x21f57: 0x6c228e20, - 0x21f58: 0x6ce71a20, 0x21f59: 0x6d1ace20, - 0x21f5c: 0x6c43c820, 0x21f5d: 0x6ce55020, 0x21f5e: 0x6d329620, 0x21f5f: 0x6d390c20, - 0x21f61: 0x6d149820, 0x21f62: 0x6c7ae420, 0x21f63: 0x6cd90c20, - 0x21f67: 0x6c2c2820, - 0x21f6c: 0x6d008820, 0x21f6e: 0x6cfe9e20, 0x21f6f: 0x6c4a1c20, - 0x21f70: 0x6ceb7420, 0x21f71: 0x6c3c3620, 0x21f72: 0x6cf3b420, - 0x21f75: 0x6d053220, - 0x21f7f: 0x6d1f1620, - // Block 0x87e, offset 0x21f80 - 0x21f81: 0x6c8ce020, 0x21f82: 0x6d0e6020, - 0x21f85: 0x6c2ff620, 0x21f86: 0x6cb77e20, 0x21f87: 0x6ce21a20, - 0x21f88: 0x6c4dfc20, 0x21f8a: 0x6c1b1c20, 0x21f8b: 0x6cd91820, - 0x21f91: 0x6cc35820, - 0x21f94: 0x6c4ea820, - 0x21f9f: 0x6cc77820, - 0x21fa0: 0x6cb78e20, 0x21fa1: 0x6c762c20, 0x21fa2: 0x6d211e20, 0x21fa3: 0x6c139a20, - 0x21fa4: 0x6c1a8220, 0x21fa5: 0x6d233a20, 0x21fa7: 0x6c0e2020, - 0x21fa9: 0x6c231220, 0x21faa: 0x6d39a420, - 0x21fac: 0x6d235420, - 0x21fb1: 0x6c744a20, 0x21fb2: 0x6c8f3620, 0x21fb3: 0x6ccab220, - 0x21fb4: 0x6d236820, - // Block 0x87f, offset 0x21fc0 - 0x21fc5: 0x6cd66820, - 0x21fcb: 0x6d262020, - 0x21fce: 0x6d2eba20, - 0x21fd1: 0x6cd66a20, 0x21fd3: 0x6c1ee420, - 0x21fd4: 0x6d2ec620, 0x21fd5: 0x6cca2020, 0x21fd6: 0x6cfabe20, - 0x21fd8: 0x6c24d820, 0x21fd9: 0x6c9bde20, 0x21fda: 0x6c2b7c20, - 0x21fde: 0x6d368820, 0x21fdf: 0x6c02de20, - 0x21fe6: 0x6d04e020, - 0x21fe8: 0x6cb11e20, 0x21fea: 0x6c69bc20, 0x21feb: 0x6c7b6c20, - 0x21fec: 0x6cc98620, 0x21fed: 0x6cfcf420, 0x21fee: 0x6d2cda20, 0x21fef: 0x6c2d7820, - 0x21ff7: 0x6d154420, - 0x21ffa: 0x6c5c2e20, 0x21ffb: 0x6ccda620, - // Block 0x880, offset 0x22000 - 0x22004: 0x6c1d2220, 0x22005: 0x6d156220, 0x22006: 0x6d021220, 0x22007: 0x6d36dc20, - 0x22008: 0x6ce5e020, 0x2200a: 0x6cb26c20, 0x2200b: 0x6cfbb020, - 0x2200e: 0x6cfadc20, 0x2200f: 0x6cdb4c20, - 0x22011: 0x6c24a020, - 0x22017: 0x6cd97220, - 0x2201b: 0x6c522820, - 0x2201d: 0x6cfd3a20, 0x2201f: 0x6d1f8e20, - 0x22021: 0x6d246420, - 0x22024: 0x6cdf5220, 0x22026: 0x6c751820, 0x22027: 0x6ca48220, - 0x22029: 0x6c2cba20, 0x2202b: 0x6d164820, - 0x2202c: 0x6c090620, - 0x22033: 0x6d056220, - 0x22034: 0x6d166820, 0x22035: 0x6cc81020, 0x22037: 0x6c455a20, - 0x2203a: 0x6d166a20, - 0x2203f: 0x6d356e20, - // Block 0x881, offset 0x22040 - 0x22040: 0x6d02a420, 0x22042: 0x6c617820, - 0x22044: 0x6cfa2c20, - 0x22048: 0x6d2f4e20, 0x22049: 0x6ca54620, 0x2204a: 0x6d015620, - 0x2204e: 0x6d168620, - 0x2206b: 0x6c3f3420, - 0x2206d: 0x6ccf3420, 0x2206f: 0x6d253c20, - 0x22070: 0x6c390420, 0x22072: 0x6c3d3c20, 0x22073: 0x6cf4a820, - 0x22074: 0x6cf57c20, 0x22075: 0x6c539c20, - 0x22079: 0x6c618220, 0x2207a: 0x6c170420, - 0x2207f: 0x6ca0ca20, - // Block 0x882, offset 0x22080 - 0x22080: 0x6cae0820, 0x22083: 0x6ca20e20, - 0x22084: 0x6cc00420, 0x22085: 0x6c994a20, 0x22087: 0x6c268020, - 0x22089: 0x6cf98c20, 0x2208a: 0x6ccfae20, 0x2208b: 0x6ce26c20, - 0x2208c: 0x6c530220, 0x2208d: 0x6c093620, - 0x2209d: 0x6ca62620, 0x2209f: 0x6cbbd220, - 0x220a7: 0x6cc84e20, - 0x220b8: 0x6c67d820, 0x220b9: 0x6c138420, 0x220ba: 0x6c9ce220, - 0x220bd: 0x6d16f020, 0x220bf: 0x6cdd0a20, - // Block 0x883, offset 0x220c0 - 0x220c1: 0x6cf4c220, 0x220c2: 0x6d078420, - 0x220c5: 0x6cf76c20, 0x220c7: 0x6d15d020, - 0x220d0: 0x6ca49a20, 0x220d3: 0x6cf07820, - 0x220ee: 0x6c770220, - 0x220f1: 0x6c906020, 0x220f2: 0x6c938620, 0x220f3: 0x6d3c2a20, - 0x220fa: 0x6d35b420, - 0x220fc: 0x6d042220, 0x220fe: 0x6c44f820, 0x220ff: 0x6c6ce620, - // Block 0x884, offset 0x22100 - 0x22100: 0x6cfca420, 0x22101: 0x6c61c820, 0x22102: 0x6c261a20, - 0x22104: 0x6c815020, 0x22105: 0x6c3bb820, 0x22106: 0x6c722a20, - 0x2210b: 0x6c9eb220, - 0x2210c: 0x6cf9a620, - 0x22111: 0x6cda8c20, - 0x22128: 0x6d35b620, 0x2212a: 0x6c567e20, 0x2212b: 0x6c79e220, - 0x2212d: 0x6cdd5820, 0x2212e: 0x6ca68e20, - 0x2213a: 0x6ce28c20, 0x2213b: 0x6d3ace20, - // Block 0x885, offset 0x22140 - 0x22141: 0x6c269820, 0x22143: 0x6cc04420, - 0x22144: 0x6d0b9820, 0x22146: 0x6cfb4820, - 0x22149: 0x6ca58820, - 0x2214d: 0x6d351420, 0x2214e: 0x6c0ce620, - 0x22152: 0x6c1d3a20, 0x22153: 0x6c7f9820, - 0x22154: 0x6c2ff820, 0x22155: 0x6cc43a20, 0x22156: 0x6cfe2e20, - 0x22158: 0x6cff8020, 0x22159: 0x6ced0620, 0x2215a: 0x6cc81420, 0x2215b: 0x6cee5020, - 0x2215c: 0x6ca69820, 0x2215e: 0x6c03fe20, 0x2215f: 0x6d0b9a20, - 0x22165: 0x6cd7e220, 0x22166: 0x6d1ad820, - 0x22168: 0x6d231220, - 0x2216e: 0x6c83b820, 0x2216f: 0x6c5dc020, - // Block 0x886, offset 0x22180 - 0x22197: 0x6c056820, - 0x221a3: 0x6cf5e620, - 0x221a5: 0x6c6f6a20, - 0x221a8: 0x6d01ac20, 0x221a9: 0x6cb8e020, 0x221aa: 0x6caaf820, 0x221ab: 0x6d040020, - 0x221ac: 0x6c344e20, 0x221ad: 0x6c614020, 0x221ae: 0x6cf44a20, 0x221af: 0x6ca21220, - 0x221b0: 0x6d0e6e20, 0x221b1: 0x6cb79020, 0x221b2: 0x6ca2de20, 0x221b3: 0x6c1c1e20, - 0x221b4: 0x6c540220, 0x221b6: 0x6ccaf220, - 0x221b8: 0x6ca4aa20, 0x221bb: 0x6c1a7020, - 0x221bc: 0x6c1a7220, 0x221bd: 0x6c7cd020, 0x221bf: 0x6c644220, - // Block 0x887, offset 0x221c0 - 0x221c0: 0x6ce8ac20, 0x221c2: 0x6c319a20, - 0x221c5: 0x6cf9c220, 0x221c6: 0x6d382e20, 0x221c7: 0x6c5dcc20, - 0x221c8: 0x6c1d1620, 0x221c9: 0x6c26a420, - 0x221cc: 0x6c997c20, 0x221cd: 0x6d120620, - 0x221d3: 0x6c72f220, - 0x221ec: 0x6cd38420, 0x221ef: 0x6d1a6420, - 0x221f3: 0x6c478a20, - 0x221f4: 0x6cf4ec20, - 0x221f8: 0x6c4cee20, 0x221f9: 0x6ce3f620, 0x221fb: 0x6c52a220, - // Block 0x888, offset 0x22200 - 0x22207: 0x6cc54e20, - 0x22209: 0x6d14f420, 0x2220b: 0x6cea7c20, - 0x2220f: 0x6cbf3c20, - 0x22210: 0x6c4d6e20, 0x22212: 0x6cb79e20, - 0x22215: 0x6c5dd820, 0x22216: 0x6ce40020, 0x22217: 0x6caf7020, - 0x2221a: 0x6c451020, - 0x2221c: 0x6d01c420, 0x2221e: 0x6c9d5620, 0x2221f: 0x6c434c20, - 0x22220: 0x6cddf020, 0x22221: 0x6cfdec20, 0x22223: 0x6cd4e620, - 0x22226: 0x6c3e9820, - 0x2222c: 0x6d3b7e20, 0x2222d: 0x6c8f3820, - // Block 0x889, offset 0x22240 - 0x22245: 0x6d1f4420, - 0x2224a: 0x6c1a7820, 0x2224b: 0x6c330620, - 0x22262: 0x6c841420, 0x22263: 0x6d105820, - 0x22264: 0x6c841620, 0x22267: 0x6c91c820, - 0x22268: 0x6ca24e20, 0x22269: 0x6cdc5220, 0x2226a: 0x6c00b620, - 0x2226d: 0x6c79f420, 0x2226f: 0x6d306a20, - 0x22270: 0x6c00b820, 0x22271: 0x6ce2a620, 0x22273: 0x6c93ea20, - 0x22274: 0x6ce9ac20, 0x22275: 0x6c088020, - 0x2227e: 0x6c5bf620, 0x2227f: 0x6c588a20, - // Block 0x88a, offset 0x22280 - 0x2229b: 0x6c7e0e20, - 0x2229d: 0x6d02e020, - 0x222a1: 0x6ccaf420, - 0x222ab: 0x6cd5f020, - 0x222ac: 0x6cc3da20, 0x222ad: 0x6c035620, 0x222ae: 0x6cea0620, - 0x222b2: 0x6c403220, 0x222b3: 0x6c0cba20, - 0x222b5: 0x6ce17e20, 0x222b7: 0x6cfe4c20, - 0x222b9: 0x6cd81420, 0x222ba: 0x6c0f4020, - 0x222bc: 0x6c970020, 0x222bd: 0x6c298020, 0x222bf: 0x6c4b6420, - // Block 0x88b, offset 0x222c0 - 0x222c0: 0x6c522020, 0x222c1: 0x6cf69a20, 0x222c2: 0x6c298220, 0x222c3: 0x6d184e20, - 0x222c5: 0x6c088420, 0x222c7: 0x6c472c20, - 0x222c8: 0x6c255820, 0x222c9: 0x6ccb4420, - 0x222cd: 0x6c441e20, 0x222ce: 0x6d23c220, 0x222cf: 0x6ca2fa20, - 0x222d1: 0x6c865620, 0x222d2: 0x6d36ac20, - 0x222f0: 0x6d2fd420, - 0x222f4: 0x6c5f1220, 0x222f5: 0x6cc87220, - 0x222f9: 0x6c1d5820, - // Block 0x88c, offset 0x22300 - 0x22302: 0x6c6b1820, - 0x2230c: 0x6c172020, 0x2230d: 0x6d307a20, - 0x22312: 0x6cdb1020, 0x22313: 0x6d1db020, - 0x22316: 0x6cb7d420, 0x22317: 0x6d3d9820, - 0x2231a: 0x6c769620, - 0x2231c: 0x6d133c20, 0x2231e: 0x6cb7d620, - 0x22339: 0x6d04a420, - // Block 0x88d, offset 0x22340 - 0x22349: 0x6d141420, 0x2234a: 0x6c1e3020, - 0x2234e: 0x6ce98020, 0x2234f: 0x6c00da20, - 0x22350: 0x6cb1f220, 0x22353: 0x6c8b3620, - 0x22354: 0x6c9dd820, 0x22355: 0x6c00dc20, 0x22357: 0x6ca0ae20, - 0x22358: 0x6cf0e220, 0x22359: 0x6d1d5220, 0x2235a: 0x6ca65020, - 0x2235e: 0x6c0f7420, - 0x22360: 0x6c8f4620, - 0x22373: 0x6cc8e620, - 0x2237b: 0x6c936620, - 0x2237c: 0x6c140c20, 0x2237f: 0x6c1f8620, - // Block 0x88e, offset 0x22380 - 0x22381: 0x6ccb0220, 0x22382: 0x6c847020, - 0x22384: 0x6cd94620, 0x22386: 0x6c86c620, - 0x2238b: 0x6cf90420, - 0x2238d: 0x6d0c3e20, 0x2238e: 0x6c25ce20, - 0x22390: 0x6c8eb620, - 0x22398: 0x6c9b6c20, 0x2239a: 0x6d2e8a20, - 0x223a4: 0x6d3c4c20, 0x223a7: 0x6c9ea620, - 0x223a9: 0x6c86f220, 0x223ab: 0x6c71da20, - 0x223af: 0x6d025220, - 0x223b0: 0x6d025420, 0x223b1: 0x6c904220, 0x223b2: 0x6c8fc220, - // Block 0x88f, offset 0x223c0 - 0x223c2: 0x6ce2c620, 0x223c3: 0x6d3b3820, - 0x223cb: 0x6c155220, - 0x223cc: 0x6cfc4420, 0x223cf: 0x6d1cc220, - 0x223d0: 0x6cae2a20, - 0x223d8: 0x6d012220, 0x223da: 0x6c69dc20, - 0x223de: 0x6c1cf820, - 0x223f3: 0x6c50ae20, - 0x223fd: 0x6cea8420, - // Block 0x890, offset 0x22400 - 0x22405: 0x6c53b220, - 0x22408: 0x6c97b020, 0x2240a: 0x6c6c7a20, - 0x2240c: 0x6cc17020, 0x2240d: 0x6c30d420, 0x2240e: 0x6cbff820, 0x2240f: 0x6d28ee20, - 0x22411: 0x6cd0d420, 0x22412: 0x6d28f020, - 0x22415: 0x6d15ba20, - 0x2241a: 0x6c578020, - 0x2241f: 0x6c76a220, - 0x22430: 0x6d268e20, 0x22431: 0x6ca68420, 0x22432: 0x6cd7d620, - 0x22434: 0x6cf2aa20, - 0x22438: 0x6c118e20, 0x2243a: 0x6c647c20, - 0x2243c: 0x6c9ecc20, 0x2243d: 0x6ccea020, 0x2243f: 0x6cc70820, - // Block 0x891, offset 0x22440 - 0x22440: 0x6c419220, - 0x22445: 0x6cbb0a20, 0x22447: 0x6cd52a20, - 0x22448: 0x6d3d5820, - 0x2244f: 0x6cd1bc20, - 0x22451: 0x6ce3f820, - 0x22456: 0x6d2c3620, 0x22457: 0x6d2d7e20, - 0x2245d: 0x6c3bdc20, 0x2245e: 0x6c9eda20, - 0x22460: 0x6d2b5220, - 0x22464: 0x6d368a20, 0x22465: 0x6cb90020, 0x22466: 0x6c4ede20, 0x22467: 0x6c440e20, - 0x2246e: 0x6c119e20, - 0x22470: 0x6c4c7820, 0x22471: 0x6c685e20, 0x22473: 0x6d1da220, - 0x22474: 0x6c026820, - 0x2247b: 0x6d2c4620, - 0x2247d: 0x6cf8c420, - // Block 0x892, offset 0x22480 - 0x22481: 0x6d05d220, 0x22482: 0x6cf46620, - 0x2248f: 0x6c74b820, - 0x22490: 0x6c5f2a20, 0x22492: 0x6c1c6a20, - 0x22494: 0x6ced5420, 0x22496: 0x6c9ef220, 0x22497: 0x6d2b6420, - 0x2249c: 0x6c6b6e20, 0x2249d: 0x6cd29220, 0x2249f: 0x6cf72e20, - 0x224a1: 0x6c36e220, - 0x224a5: 0x6c564220, 0x224a6: 0x6c564a20, - 0x224a8: 0x6c857020, 0x224ab: 0x6c1f0820, - 0x224ae: 0x6d13c820, 0x224af: 0x6c992c20, - 0x224b0: 0x6d056c20, 0x224b1: 0x6d379820, 0x224b3: 0x6d16b820, - 0x224ba: 0x6c89de20, - 0x224bf: 0x6c647820, - // Block 0x893, offset 0x224c0 - 0x224c0: 0x6c656e20, 0x224c1: 0x6c70fa20, - 0x224c4: 0x6d3abc20, - 0x224c8: 0x6cf43a20, - 0x224cf: 0x6c78a420, - 0x224d0: 0x6c786020, 0x224d1: 0x6c860e20, 0x224d2: 0x6c08dc20, 0x224d3: 0x6c43ec20, - 0x224d5: 0x6d059820, 0x224d6: 0x6ccbfa20, 0x224d7: 0x6c8d1c20, - 0x224d8: 0x6c781220, - 0x224de: 0x6c0f4220, 0x224df: 0x6c0b0820, - 0x224e0: 0x6cd68820, 0x224e1: 0x6cb66e20, 0x224e2: 0x6ccde420, - 0x224e6: 0x6c5e6420, - 0x224e8: 0x6cbc1c20, - 0x224ee: 0x6d166c20, 0x224ef: 0x6c73d020, - 0x224f0: 0x6d2efe20, 0x224f2: 0x6d031620, - 0x224f7: 0x6cea9a20, - 0x224f8: 0x6c4d5020, 0x224f9: 0x6cfa2e20, 0x224fb: 0x6ceae020, - 0x224fc: 0x6d145620, - // Block 0x894, offset 0x22500 - 0x22503: 0x6c242c20, - 0x22507: 0x6c674620, - 0x22508: 0x6ca3de20, 0x2250b: 0x6caf0020, - 0x2250d: 0x6c6a7020, 0x2250e: 0x6d08d820, 0x2250f: 0x6c552020, - 0x22525: 0x6d1f9e20, 0x22526: 0x6caa4c20, 0x22527: 0x6d12c220, - 0x2252a: 0x6d1b3a20, - 0x2252c: 0x6c799420, - 0x22536: 0x6cfe8420, 0x22537: 0x6cfd6220, - 0x2253c: 0x6ca49620, 0x2253e: 0x6d2f2420, - // Block 0x895, offset 0x22540 - 0x22550: 0x6c6a7c20, 0x22553: 0x6caa5020, - 0x22554: 0x6ccd7020, - 0x22562: 0x6c63a020, - 0x22567: 0x6d38dc20, - 0x22568: 0x6cc6fe20, 0x2256b: 0x6c922220, - 0x2256c: 0x6cc96e20, 0x2256d: 0x6caa6020, 0x2256f: 0x6c0ec420, - 0x22570: 0x6d302220, 0x22572: 0x6cbdca20, - 0x22574: 0x6c21f620, 0x22575: 0x6d40ac20, 0x22577: 0x6cf2ac20, - 0x22578: 0x6cf43620, 0x2257b: 0x6ca7e020, - 0x2257f: 0x6cfa8820, - // Block 0x896, offset 0x22580 - 0x22580: 0x6c531220, - 0x225ab: 0x6ce6e820, - 0x225ac: 0x6c6c8a20, - 0x225b1: 0x6c6aa420, 0x225b2: 0x6c51c020, 0x225b3: 0x6ce84c20, - 0x225b4: 0x6d303a20, 0x225b5: 0x6cb1ec20, 0x225b6: 0x6c6ce820, 0x225b7: 0x6ca44420, - 0x225bc: 0x6c33e820, 0x225be: 0x6cf5be20, 0x225bf: 0x6d018020, - // Block 0x897, offset 0x225c0 - 0x225c1: 0x6cf86c20, 0x225c2: 0x6c815220, 0x225c3: 0x6c32ac20, - 0x225c4: 0x6c61ca20, 0x225c5: 0x6c138a20, 0x225c6: 0x6c1d6620, - 0x225c8: 0x6c427020, - 0x225ce: 0x6cfdb820, 0x225cf: 0x6c29d620, - 0x225e5: 0x6c0b8e20, 0x225e6: 0x6cfea020, 0x225e7: 0x6d02c220, - // Block 0x898, offset 0x22600 - 0x22601: 0x6d224c20, 0x22602: 0x6cfb4a20, 0x22603: 0x6c83ba20, - 0x22604: 0x6cba0020, 0x22607: 0x6c9a5420, - 0x22609: 0x6cbb6c20, 0x2260a: 0x6d0b9e20, - 0x2260c: 0x6cb82a20, 0x2260d: 0x6cbf8a20, 0x2260f: 0x6c056a20, - 0x22610: 0x6d32b220, - 0x2261a: 0x6d2b4a20, 0x2261b: 0x6cd68e20, - 0x2261e: 0x6ccaf020, - // Block 0x899, offset 0x22640 - 0x22645: 0x6c923a20, - 0x22649: 0x6d009e20, 0x2264b: 0x6c3f5c20, - 0x2264c: 0x6d2d3a20, - 0x22669: 0x6d2b5020, 0x2266b: 0x6c32c220, - 0x2266d: 0x6c2ad620, 0x2266e: 0x6d233c20, - 0x22670: 0x6c93de20, 0x22672: 0x6ced8220, 0x22673: 0x6d090e20, - 0x22674: 0x6c68f420, 0x22675: 0x6d266420, 0x22676: 0x6d362420, 0x22677: 0x6cefc420, - 0x22679: 0x6c43ee20, 0x2267a: 0x6c71b420, - 0x2267c: 0x6d0d8420, 0x2267d: 0x6c262620, 0x2267e: 0x6c997e20, - // Block 0x89a, offset 0x22680 - 0x22686: 0x6c3e7820, 0x22687: 0x6c002820, - 0x2268a: 0x6d079e20, - 0x2268c: 0x6c427e20, 0x2268d: 0x6c013220, - 0x22692: 0x6c603620, - 0x22698: 0x6cafea20, 0x22699: 0x6d352820, - 0x2269c: 0x6caac020, - 0x226bf: 0x6cacbc20, - // Block 0x89b, offset 0x226c0 - 0x226c1: 0x6d14f620, - 0x226c4: 0x6c6ac820, 0x226c6: 0x6d3e3820, - 0x226c8: 0x6c644420, 0x226c9: 0x6cec6420, - 0x226cc: 0x6c644620, - 0x226df: 0x6c15c020, - 0x226e1: 0x6cdd7420, 0x226e2: 0x6cdd7620, 0x226e3: 0x6c605020, - 0x226e4: 0x6cd96420, 0x226e6: 0x6ce2f420, 0x226e7: 0x6caf7420, - 0x226e8: 0x6cb32c20, - 0x226ee: 0x6c9d5a20, - 0x226f4: 0x6d12fc20, 0x226f6: 0x6cbe1c20, 0x226f7: 0x6c6d1620, - 0x226fa: 0x6c73ae20, - 0x226fd: 0x6d24f420, 0x226fe: 0x6cc83e20, - // Block 0x89c, offset 0x22700 - 0x22714: 0x6c04fa20, - 0x22730: 0x6c0d3a20, - 0x22734: 0x6cf0ae20, 0x22735: 0x6d2a8820, 0x22736: 0x6cbcd020, 0x22737: 0x6cd9ce20, - 0x22738: 0x6c91ca20, - 0x2273c: 0x6c2ecc20, 0x2273d: 0x6c1fb820, 0x2273e: 0x6c09f620, 0x2273f: 0x6d3a1a20, - // Block 0x89d, offset 0x22740 - 0x22740: 0x6c966220, 0x22741: 0x6c3aba20, 0x22742: 0x6cb1cc20, 0x22743: 0x6d1b6620, - 0x22744: 0x6d08a220, 0x22746: 0x6c02e020, 0x22747: 0x6d3d7820, - 0x22748: 0x6d40c820, 0x2274b: 0x6c08ea20, - 0x22751: 0x6c812620, 0x22753: 0x6ce40820, - 0x22759: 0x6ce5c820, 0x2275a: 0x6c64c820, - 0x2275f: 0x6ce7c020, - 0x2277d: 0x6c343420, 0x2277e: 0x6c308420, - // Block 0x89e, offset 0x22780 - 0x22782: 0x6c0b4220, - 0x227a0: 0x6d36b020, 0x227a2: 0x6c3b8a20, - 0x227a6: 0x6c776a20, 0x227a7: 0x6d36b220, - 0x227a8: 0x6d2cfc20, 0x227a9: 0x6c0a1e20, 0x227aa: 0x6c7b6e20, - 0x227ac: 0x6c050220, 0x227ad: 0x6c73b820, 0x227ae: 0x6cc13420, - 0x227b0: 0x6cb51e20, 0x227b1: 0x6c824e20, 0x227b2: 0x6d00da20, 0x227b3: 0x6ce0ca20, - 0x227bc: 0x6cd9d420, 0x227be: 0x6c075020, - // Block 0x89f, offset 0x227c0 - 0x227c7: 0x6d106820, - 0x227c8: 0x6c65ce20, - 0x227e5: 0x6d2a8a20, - // Block 0x8a0, offset 0x22800 - 0x22800: 0x6d3b6a20, 0x22803: 0x6c38b820, - 0x22805: 0x6ccf2420, 0x22807: 0x6cbf5e20, - 0x22809: 0x6cb3a020, 0x2280b: 0x6ce60220, - 0x2280c: 0x6ccc1a20, 0x2280d: 0x6d28c820, - 0x22811: 0x6ca7ac20, 0x22812: 0x6c48fa20, 0x22813: 0x6c250a20, - 0x22821: 0x6cbc5e20, 0x22823: 0x6c2ee420, - 0x22833: 0x6cb1ee20, - 0x22834: 0x6c226a20, 0x22836: 0x6c058e20, - // Block 0x8a1, offset 0x22840 - 0x2284d: 0x6d1b8a20, - 0x22851: 0x6cfc3020, - 0x22854: 0x6d161820, 0x22855: 0x6c9e9e20, 0x22856: 0x6c32b220, 0x22857: 0x6d395620, - 0x22859: 0x6c798c20, - 0x22862: 0x6d2ee020, - 0x22876: 0x6c8eb820, - 0x22878: 0x6d355820, 0x22879: 0x6c15ee20, 0x2287a: 0x6c31ca20, 0x2287b: 0x6d25c020, - 0x2287e: 0x6cddd220, 0x2287f: 0x6c6b5820, - // Block 0x8a2, offset 0x22880 - 0x22880: 0x6c86c820, 0x22881: 0x6c460420, - 0x2288c: 0x6c054220, - 0x22897: 0x6c4c9220, - 0x22898: 0x6c8a3420, 0x22899: 0x6cd08220, - 0x228a3: 0x6ca7c020, - 0x228a5: 0x6c24bc20, 0x228a6: 0x6cf04c20, - 0x228a8: 0x6cead620, 0x228ab: 0x6cda6020, - 0x228ad: 0x6c8fc420, - 0x228b3: 0x6cff3820, - 0x228b4: 0x6d0df820, - // Block 0x8a3, offset 0x228c0 - 0x228c3: 0x6cbebe20, - 0x228cd: 0x6cf73020, 0x228cf: 0x6d21e220, - 0x228d1: 0x6d337220, 0x228d2: 0x6d027420, 0x228d3: 0x6c146e20, - 0x228d4: 0x6c3c0020, 0x228d6: 0x6c4c9c20, - 0x228d8: 0x6c6e3e20, 0x228d9: 0x6c808220, 0x228da: 0x6cfafe20, - 0x228dd: 0x6c8d8e20, - 0x228ee: 0x6c830020, - 0x228f2: 0x6c760220, 0x228f3: 0x6d002a20, - 0x228fc: 0x6d28d820, - // Block 0x8a4, offset 0x22900 - 0x22904: 0x6c493e20, 0x22905: 0x6cbd0820, 0x22906: 0x6c963e20, 0x22907: 0x6d124a20, - 0x22908: 0x6c945620, 0x22909: 0x6cdeee20, - 0x22911: 0x6c964020, - 0x2291e: 0x6c03a420, 0x2291f: 0x6c165420, - 0x22921: 0x6d3dec20, - 0x2292b: 0x6ce5d020, - 0x2292f: 0x6cecaa20, - 0x22930: 0x6c8dd420, - 0x22934: 0x6d24aa20, 0x22935: 0x6cb72c20, 0x22937: 0x6cb58020, - 0x2293c: 0x6c619420, 0x2293d: 0x6c0eb620, 0x2293f: 0x6cd1a420, - // Block 0x8a5, offset 0x22940 - 0x22940: 0x6c3f4a20, 0x22942: 0x6c4a4620, - 0x22945: 0x6c2d0e20, 0x22947: 0x6c4fa420, - 0x22949: 0x6c411220, 0x2294b: 0x6cb5c820, - 0x22953: 0x6c19fe20, - 0x22954: 0x6c5bc220, 0x22957: 0x6cf9cc20, - 0x22958: 0x6cd27020, 0x22959: 0x6d365820, 0x2295a: 0x6cb61420, - 0x2295c: 0x6c4d7420, 0x2295f: 0x6c692c20, - 0x22960: 0x6c867620, 0x22962: 0x6c8a7820, - 0x22964: 0x6cbba620, - 0x22968: 0x6cc99c20, 0x2296a: 0x6cb55220, 0x2296b: 0x6cd19620, - 0x2296e: 0x6c6a7220, - 0x22975: 0x6c06e420, 0x22976: 0x6c0aec20, 0x22977: 0x6c032420, - 0x22978: 0x6c755c20, 0x22979: 0x6caf3a20, - 0x2297c: 0x6c282220, 0x2297f: 0x6ce0e620, - // Block 0x8a6, offset 0x22980 - 0x22980: 0x6c7cca20, 0x22981: 0x6c7a2820, 0x22983: 0x6c79d020, - 0x22989: 0x6cd1a620, 0x2298a: 0x6cd1a820, 0x2298b: 0x6c5e9a20, - 0x2298c: 0x6c063620, - 0x22990: 0x6c785a20, 0x22991: 0x6c7b9020, - 0x22996: 0x6c9f9c20, - 0x22999: 0x6c89e020, 0x2299a: 0x6c35f220, 0x2299b: 0x6c43d820, - 0x2299f: 0x6cee0420, - 0x229a0: 0x6c344020, 0x229a3: 0x6cb85220, - 0x229a4: 0x6c573220, 0x229a6: 0x6c539e20, - 0x229a9: 0x6cae5e20, 0x229ab: 0x6c698c20, - 0x229b0: 0x6cc0f020, 0x229b1: 0x6d3f3c20, 0x229b2: 0x6d391820, 0x229b3: 0x6c7b9620, - 0x229b5: 0x6ccbd820, 0x229b7: 0x6c61cc20, - 0x229b8: 0x6cee6c20, 0x229b9: 0x6cb40820, 0x229ba: 0x6d090620, - 0x229bc: 0x6cce6620, - // Block 0x8a7, offset 0x229c0 - 0x229c2: 0x6c80b620, 0x229c3: 0x6d351620, - 0x229c4: 0x6ce6c620, 0x229c7: 0x6c26f020, - 0x229d5: 0x6d0faa20, 0x229d6: 0x6c6d0020, 0x229d7: 0x6d351820, - 0x229da: 0x6d3d5a20, - 0x229dc: 0x6d28b420, 0x229dd: 0x6c14f220, - 0x229e2: 0x6c998020, - 0x229e6: 0x6c797820, 0x229e7: 0x6d388420, - 0x229e8: 0x6c54ca20, 0x229e9: 0x6cae7220, - 0x229ed: 0x6c6ffc20, - 0x229f8: 0x6c21bc20, 0x229f9: 0x6c9fae20, - 0x229fe: 0x6cffec20, - // Block 0x8a8, offset 0x22a00 - 0x22a00: 0x6c322220, 0x22a01: 0x6cef1820, 0x22a03: 0x6c119a20, - 0x22a04: 0x6d214a20, 0x22a05: 0x6c326220, 0x22a06: 0x6c763620, 0x22a07: 0x6cb0a220, - 0x22a0a: 0x6c1a1a20, - 0x22a0e: 0x6c218020, - 0x22a10: 0x6cceb420, 0x22a11: 0x6d0d9e20, 0x22a12: 0x6c7b2820, - 0x22a14: 0x6d265020, - 0x22a26: 0x6cb61620, 0x22a27: 0x6d32e020, - 0x22a29: 0x6c78c220, 0x22a2a: 0x6cb61820, 0x22a2b: 0x6d354020, - 0x22a2c: 0x6c928420, - 0x22a31: 0x6caf7c20, 0x22a32: 0x6cab0420, 0x22a33: 0x6cad7c20, - 0x22a3a: 0x6c3a6020, - 0x22a3f: 0x6cf19c20, - // Block 0x8a9, offset 0x22a40 - 0x22a42: 0x6c9b2c20, - 0x22a48: 0x6ccd5620, - 0x22a4c: 0x6d04a020, 0x22a4e: 0x6c351020, 0x22a4f: 0x6c0c9220, - 0x22a5a: 0x6d1eb020, - 0x22a5c: 0x6c97f620, 0x22a5e: 0x6c8a7a20, - 0x22a61: 0x6d00ea20, 0x22a62: 0x6c949c20, 0x22a63: 0x6cbba820, - 0x22a64: 0x6c2ae620, 0x22a66: 0x6c1a3e20, 0x22a67: 0x6c1a4020, - 0x22a6d: 0x6c21d820, - 0x22a78: 0x6c131420, - // Block 0x8aa, offset 0x22a80 - 0x22a80: 0x6c825e20, 0x22a81: 0x6d2e1c20, 0x22a82: 0x6c853620, 0x22a83: 0x6c885e20, - 0x22a84: 0x6cc45820, - 0x22a8d: 0x6c18ee20, 0x22a8f: 0x6c1a4820, - 0x22a90: 0x6c473c20, 0x22a92: 0x6d403a20, 0x22a93: 0x6c1df420, - 0x22a94: 0x6c204420, - 0x22a9c: 0x6c835220, 0x22a9d: 0x6cd7a820, 0x22a9e: 0x6c941020, - 0x22aa3: 0x6c3f2420, - 0x22aa5: 0x6c871620, 0x22aa7: 0x6cca6020, - 0x22aab: 0x6cca0c20, - 0x22aaf: 0x6cc9b220, - 0x22ab3: 0x6ca8b020, - 0x22ab6: 0x6d413c20, 0x22ab7: 0x6c855020, - 0x22abb: 0x6cd58c20, - 0x22abe: 0x6c3f2a20, - // Block 0x8ab, offset 0x22ac0 - 0x22ac9: 0x6c094620, - 0x22acd: 0x6c2a0820, - 0x22ad2: 0x6cd1b220, - 0x22ad6: 0x6c422020, 0x22ad7: 0x6ce09e20, - 0x22adc: 0x6c97f820, 0x22adf: 0x6c842820, - 0x22ae2: 0x6c0a4c20, - 0x22ae6: 0x6cac7e20, - 0x22ae8: 0x6d1eca20, - 0x22aed: 0x6c6f5020, 0x22aef: 0x6c4c1220, - 0x22af0: 0x6c89dc20, 0x22af3: 0x6cf2de20, - 0x22af4: 0x6cb85420, 0x22af5: 0x6c30e820, 0x22af7: 0x6c8afa20, - 0x22af9: 0x6c68e020, 0x22afb: 0x6c8afc20, - // Block 0x8ac, offset 0x22b00 - 0x22b01: 0x6ce56020, - 0x22b04: 0x6c4c2620, 0x22b06: 0x6cacde20, 0x22b07: 0x6cbb8e20, - 0x22b09: 0x6c2b8a20, 0x22b0a: 0x6d284420, - 0x22b12: 0x6c821420, - 0x22b16: 0x6cd7cc20, 0x22b17: 0x6d02b020, - 0x22b1c: 0x6d02c420, 0x22b1d: 0x6cfe2620, 0x22b1e: 0x6c95ac20, - 0x22b24: 0x6c07e820, 0x22b25: 0x6ce55a20, - 0x22b2c: 0x6cffee20, 0x22b2e: 0x6c30b420, - 0x22b33: 0x6c296e20, - 0x22b34: 0x6ce67c20, 0x22b35: 0x6d3bcc20, - 0x22b3b: 0x6cab4620, - 0x22b3d: 0x6cf30e20, - // Block 0x8ad, offset 0x22b40 - 0x22b44: 0x6d02ee20, 0x22b45: 0x6cc87a20, - 0x22b48: 0x6d3dae20, 0x22b49: 0x6c299020, - 0x22b4d: 0x6c257420, - 0x22b51: 0x6d3dc820, - 0x22b57: 0x6c238620, - 0x22b58: 0x6c159220, - 0x22b5d: 0x6d100820, - 0x22b67: 0x6d0d5e20, - 0x22b73: 0x6d0d6820, - 0x22b75: 0x6d323620, - 0x22b7d: 0x6caade20, 0x22b7e: 0x6d0e7220, - // Block 0x8ae, offset 0x22b80 - 0x22b85: 0x6c39d820, - 0x22b89: 0x6d0da020, 0x22b8a: 0x6d214e20, - 0x22b8d: 0x6ce34020, 0x22b8e: 0x6c401a20, 0x22b8f: 0x6c07a020, - 0x22b91: 0x6d0db220, 0x22b93: 0x6c5ad220, - 0x22b99: 0x6c5a6220, - 0x22b9c: 0x6c4b7420, 0x22b9d: 0x6d0ece20, 0x22b9f: 0x6c55da20, - 0x22ba0: 0x6c0c3620, - 0x22ba7: 0x6cdcc420, - 0x22bae: 0x6d3f3020, 0x22baf: 0x6c618620, - 0x22bb0: 0x6c35ae20, 0x22bb1: 0x6c61ce20, 0x22bb2: 0x6c7ccc20, - 0x22bb4: 0x6c89b620, - 0x22bb8: 0x6c5dda20, 0x22bba: 0x6cef3a20, 0x22bbb: 0x6d3cea20, - 0x22bbf: 0x6ce6ae20, - // Block 0x8af, offset 0x22bc0 - 0x22bc3: 0x6d290e20, - 0x22bc4: 0x6d201020, - 0x22bc9: 0x6cc5c020, - 0x22bcd: 0x6c9e4e20, - 0x22bda: 0x6ca31020, - 0x22bdd: 0x6ce84220, 0x22bdf: 0x6c27be20, - 0x22be1: 0x6c73ec20, - 0x22be4: 0x6d056e20, 0x22be5: 0x6c2b1820, - 0x22bf0: 0x6cfe1a20, - 0x22bf7: 0x6d048a20, - 0x22bfa: 0x6d1fac20, 0x22bfb: 0x6c489620, - 0x22bfe: 0x6cf5a420, - // Block 0x8b0, offset 0x22c00 - 0x22c08: 0x6c51bc20, - 0x22c0d: 0x6c2f6c20, - 0x22c10: 0x6c914020, 0x22c12: 0x6d061a20, - 0x22c14: 0x6d391a20, 0x22c15: 0x6cfca820, 0x22c16: 0x6c598820, 0x22c17: 0x6c138c20, - 0x22c18: 0x6cd2c420, 0x22c19: 0x6c421820, 0x22c1a: 0x6caadc20, 0x22c1b: 0x6c01aa20, - 0x22c1f: 0x6d003c20, - 0x22c27: 0x6c502c20, - 0x22c32: 0x6cbd2a20, 0x22c33: 0x6c450620, - 0x22c34: 0x6ccce020, 0x22c35: 0x6c3e4c20, - 0x22c3d: 0x6d2b4c20, - // Block 0x8b1, offset 0x22c40 - 0x22c47: 0x6c287c20, - 0x22c56: 0x6c2d1420, 0x22c57: 0x6ccfdc20, - 0x22c59: 0x6d411820, - 0x22c62: 0x6c0ca620, - 0x22c66: 0x6c20d020, 0x22c67: 0x6d30f820, - 0x22c68: 0x6c276e20, 0x22c6b: 0x6cf2b620, - 0x22c6c: 0x6cbf2420, - 0x22c70: 0x6c8bb420, 0x22c72: 0x6c5cc820, 0x22c73: 0x6c5ed020, - // Block 0x8b2, offset 0x22c80 - 0x22c85: 0x6c127620, - 0x22c8a: 0x6ca28620, - 0x22c8d: 0x6c2ea820, 0x22c8e: 0x6cf09620, - 0x22ca0: 0x6c0b9a20, 0x22ca1: 0x6ce3c020, - 0x22ca5: 0x6ce8be20, - 0x22cb6: 0x6c453620, - // Block 0x8b3, offset 0x22cc0 - 0x22cc4: 0x6c1b3220, 0x22cc5: 0x6c23ee20, 0x22cc6: 0x6ce3c420, - 0x22cd2: 0x6c5de620, 0x22cd3: 0x6cb50e20, - 0x22cd4: 0x6ccab820, 0x22cd5: 0x6ccaa020, 0x22cd6: 0x6d085220, 0x22cd7: 0x6c021c20, - 0x22cd8: 0x6ca3ce20, 0x22cda: 0x6d0fd020, 0x22cdb: 0x6cd4f420, - 0x22cdc: 0x6ccc0620, - 0x22ce1: 0x6ce6d620, - 0x22ce9: 0x6d0bc420, 0x22cea: 0x6c5a5820, - 0x22cee: 0x6c0d4220, - 0x22cfe: 0x6caba020, 0x22cff: 0x6c128820, - // Block 0x8b4, offset 0x22d00 - 0x22d01: 0x6c026a20, 0x22d03: 0x6c99ae20, - 0x22d14: 0x6c9b3620, 0x22d16: 0x6ce47220, - 0x22d1d: 0x6ccaa220, 0x22d1e: 0x6d073a20, 0x22d1f: 0x6c771020, - 0x22d27: 0x6c811020, - 0x22d36: 0x6c0cc020, 0x22d37: 0x6c23b220, - 0x22d3a: 0x6cfb8e20, - // Block 0x8b5, offset 0x22d40 - 0x22d44: 0x6cea2a20, - 0x22d49: 0x6d240a20, 0x22d4a: 0x6c28c220, 0x22d4b: 0x6d1d5420, - 0x22d4d: 0x6d2f7820, 0x22d4f: 0x6cb4b620, - 0x22d58: 0x6c5c4e20, - 0x22d5e: 0x6c00ea20, 0x22d5f: 0x6ca0b220, - 0x22d62: 0x6c6dde20, 0x22d63: 0x6c7fce20, - 0x22d72: 0x6c8b5820, 0x22d73: 0x6cb1a420, - 0x22d75: 0x6c0fa420, 0x22d76: 0x6cbf8220, - 0x22d79: 0x6c0aa220, - 0x22d7f: 0x6d1dd420, - // Block 0x8b6, offset 0x22d80 - 0x22d85: 0x6c871820, - 0x22d8d: 0x6ca8b220, 0x22d8f: 0x6c2a8820, - 0x22d93: 0x6c584620, - 0x22d97: 0x6d272420, - 0x22d9a: 0x6c212c20, - 0x22d9c: 0x6c87b020, 0x22d9e: 0x6d2ef420, 0x22d9f: 0x6c8dd620, - 0x22da0: 0x6c217020, - 0x22da7: 0x6c12d220, - 0x22da8: 0x6d09ea20, - 0x22dac: 0x6c71ac20, 0x22dad: 0x6c5cac20, - 0x22dbe: 0x6ce6f820, - // Block 0x8b7, offset 0x22dc0 - 0x22dc6: 0x6ca91220, 0x22dc7: 0x6c727a20, - 0x22dcf: 0x6c144c20, - 0x22dd6: 0x6d2a2e20, - 0x22ddb: 0x6d24a020, - 0x22ddf: 0x6c78f420, - 0x22de6: 0x6c7bea20, 0x22de7: 0x6c3a4a20, - 0x22def: 0x6d282620, - 0x22df0: 0x6cb9fc20, - 0x22df4: 0x6cc2dc20, - 0x22df8: 0x6cb38a20, 0x22dfa: 0x6cadf620, - // Block 0x8b8, offset 0x22e00 - 0x22e04: 0x6c453820, 0x22e05: 0x6d17e420, 0x22e06: 0x6c961020, - 0x22e11: 0x6c7b5a20, 0x22e13: 0x6d085420, - 0x22e14: 0x6ca76e20, - 0x22e1a: 0x6c55ac20, 0x22e1b: 0x6c715820, - 0x22e29: 0x6d136a20, - 0x22e2e: 0x6cf73420, - 0x22e31: 0x6d271c20, 0x22e32: 0x6ce19020, 0x22e33: 0x6cb23e20, - 0x22e34: 0x6c33c820, 0x22e35: 0x6c06d420, - 0x22e38: 0x6c8a6020, - // Block 0x8b9, offset 0x22e40 - 0x22e40: 0x6d1e0e20, - 0x22e4e: 0x6d0acc20, - 0x22e51: 0x6c68bc20, - 0x22e54: 0x6c7dcc20, 0x22e56: 0x6d321820, 0x22e57: 0x6cd59c20, - 0x22e5a: 0x6cd24820, - 0x22e5e: 0x6d1efa20, 0x22e5f: 0x6cac1a20, - 0x22e60: 0x6cff6e20, 0x22e61: 0x6c5fe020, - 0x22e76: 0x6cb4d220, 0x22e77: 0x6c50c620, - 0x22e7a: 0x6c799620, - // Block 0x8ba, offset 0x22e80 - 0x22e82: 0x6d12d020, 0x22e83: 0x6c1bf020, - 0x22e8a: 0x6c77a220, 0x22e8b: 0x6d269020, - 0x22e8e: 0x6cec1a20, 0x22e8f: 0x6ca71820, - 0x22e91: 0x6c222e20, 0x22e93: 0x6d14a020, - 0x22ea4: 0x6c704620, - 0x22eab: 0x6d0f4e20, - 0x22eac: 0x6c83a620, 0x22eae: 0x6c270a20, 0x22eaf: 0x6c1d0c20, - 0x22eb5: 0x6d14c620, - 0x22eba: 0x6c4e9a20, - 0x22ebf: 0x6d13de20, - // Block 0x8bb, offset 0x22ec0 - 0x22ec1: 0x6c1d4a20, 0x22ec2: 0x6c568020, 0x22ec3: 0x6d3b6220, - 0x22ee6: 0x6cbf0a20, 0x22ee7: 0x6c34de20, - 0x22ef8: 0x6ce73220, 0x22ef9: 0x6cfa9020, - 0x22eff: 0x6c3e5020, - // Block 0x8bc, offset 0x22f00 - 0x22f02: 0x6c2d5020, 0x22f03: 0x6cf77820, - 0x22f04: 0x6d003e20, 0x22f05: 0x6d323820, 0x22f06: 0x6cbc3e20, 0x22f07: 0x6ce85620, - 0x22f37: 0x6c4eb020, - 0x22f38: 0x6c7bf220, 0x22f39: 0x6cdd1a20, 0x22f3b: 0x6cd46220, - 0x22f3c: 0x6ce58020, - // Block 0x8bd, offset 0x22f40 - 0x22f40: 0x6d315020, 0x22f43: 0x6ca58c20, - 0x22f45: 0x6cba0a20, 0x22f46: 0x6d1a6620, - 0x22f48: 0x6c899220, 0x22f49: 0x6ccc5420, 0x22f4a: 0x6d3f4c20, 0x22f4b: 0x6cafec20, - 0x22f4c: 0x6c42c620, 0x22f4f: 0x6c6d0a20, - 0x22f50: 0x6d1f3620, 0x22f52: 0x6ccd8c20, - 0x22f54: 0x6c9d4620, 0x22f55: 0x6cab9c20, 0x22f57: 0x6c54cc20, - 0x22f5b: 0x6d204620, - 0x22f5d: 0x6c9bd420, - // Block 0x8be, offset 0x22f80 - 0x22f90: 0x6d352a20, 0x22f93: 0x6c08e020, - 0x22f97: 0x6ccfe820, - 0x22f98: 0x6cb79420, 0x22f99: 0x6cfaa620, 0x22f9a: 0x6cac5820, 0x22f9b: 0x6c776e20, - 0x22fab: 0x6cd68620, - 0x22fac: 0x6cafee20, 0x22fae: 0x6d290220, 0x22faf: 0x6d3a6c20, - 0x22fb1: 0x6cd9c020, 0x22fb2: 0x6c6f1820, - 0x22fb5: 0x6c150020, 0x22fb6: 0x6c38a420, 0x22fb7: 0x6cff8e20, - 0x22fb8: 0x6d1aec20, 0x22fb9: 0x6c540e20, 0x22fba: 0x6c999220, 0x22fbb: 0x6ce8c020, - 0x22fbd: 0x6c621820, - // Block 0x8bf, offset 0x22fc0 - 0x22fc1: 0x6d151c20, 0x22fc3: 0x6d236c20, - 0x22fc4: 0x6c6ee020, 0x22fc5: 0x6cad9220, 0x22fc7: 0x6cfed820, - 0x22fc9: 0x6c468c20, - 0x22fcc: 0x6c465020, 0x22fcd: 0x6cdcf220, 0x22fce: 0x6cfc1620, 0x22fcf: 0x6d3baa20, - 0x22ffe: 0x6c1dba20, - // Block 0x8c0, offset 0x23000 - 0x23004: 0x6cbb7e20, 0x23005: 0x6ce34220, 0x23006: 0x6d27b020, - 0x23009: 0x6cccec20, 0x2300a: 0x6c8b1420, - 0x2300c: 0x6d353620, - 0x23010: 0x6cabf220, - 0x23023: 0x6c712e20, - 0x23024: 0x6c7f1220, - 0x23028: 0x6d3f1820, 0x2302a: 0x6cc1a420, 0x2302b: 0x6c47b020, - 0x2302c: 0x6c747a20, 0x2302d: 0x6d348220, 0x2302e: 0x6c021e20, 0x2302f: 0x6cbe2020, - 0x23030: 0x6cb00620, 0x23031: 0x6d417820, 0x23033: 0x6cb9b020, - 0x23035: 0x6c25e620, 0x23037: 0x6c606620, - 0x23038: 0x6ce35220, 0x23039: 0x6cc7b620, 0x2303b: 0x6c4d4220, - 0x2303c: 0x6d0a2620, 0x2303e: 0x6c073c20, 0x2303f: 0x6d348420, - // Block 0x8c1, offset 0x23040 - 0x23041: 0x6c340020, - 0x2304b: 0x6c293220, - 0x23050: 0x6cc62e20, - 0x23072: 0x6c41a820, - 0x23075: 0x6c42ae20, 0x23076: 0x6cde7220, - 0x23078: 0x6cebae20, 0x23079: 0x6d105e20, 0x2307a: 0x6c7a4e20, 0x2307b: 0x6d368c20, - // Block 0x8c2, offset 0x23080 - 0x23096: 0x6c64d020, 0x23097: 0x6ca6be20, - 0x23098: 0x6cd00e20, 0x23099: 0x6c058620, 0x2309a: 0x6cd66e20, 0x2309b: 0x6c30c020, - 0x2309d: 0x6cb91420, 0x2309e: 0x6c4e2820, 0x2309f: 0x6cb83020, - 0x230a0: 0x6c41e420, 0x230a3: 0x6c215a20, - 0x230a4: 0x6c13fe20, 0x230a5: 0x6c0a2620, 0x230a6: 0x6d140c20, 0x230a7: 0x6c3d9020, - 0x230a8: 0x6c35b820, 0x230aa: 0x6c816c20, 0x230ab: 0x6c4fe020, - 0x230ac: 0x6c842a20, - 0x230b1: 0x6ce28020, 0x230b2: 0x6cd01020, - 0x230b4: 0x6d1a9020, 0x230b7: 0x6c64d220, - 0x230bb: 0x6c140020, - // Block 0x8c3, offset 0x230c0 - 0x230d7: 0x6ca86020, - 0x230d8: 0x6c23f620, 0x230db: 0x6d154620, - 0x230df: 0x6ce12220, - 0x230e2: 0x6c738820, - 0x230f0: 0x6c1c5820, 0x230f1: 0x6c468e20, - 0x230f4: 0x6c6b1a20, 0x230f5: 0x6d307c20, 0x230f6: 0x6c559220, 0x230f7: 0x6c987220, - 0x230fb: 0x6d406220, - 0x230fc: 0x6cd8e820, 0x230ff: 0x6c3ad020, - // Block 0x8c4, offset 0x23100 - 0x23100: 0x6d3e8620, 0x23101: 0x6d3e8820, 0x23103: 0x6c6b3420, - 0x23104: 0x6cd82820, 0x23106: 0x6c211620, 0x23107: 0x6cad9820, - 0x2310b: 0x6d128e20, - 0x2310c: 0x6c2b4420, 0x2310e: 0x6c825820, 0x2310f: 0x6d05e420, - 0x23110: 0x6cc7c820, 0x23112: 0x6cabde20, 0x23113: 0x6c738e20, - 0x23114: 0x6cf8dc20, 0x23115: 0x6d133e20, 0x23116: 0x6c014c20, - 0x23118: 0x6d189420, 0x23119: 0x6c64f420, - 0x2311c: 0x6cd93820, 0x2311d: 0x6cf2c420, 0x2311f: 0x6ccb5820, - 0x23120: 0x6d355020, 0x23121: 0x6c088e20, 0x23122: 0x6d3be220, - 0x23126: 0x6c67fa20, 0x23127: 0x6c506820, - 0x23129: 0x6c1c6c20, 0x2312a: 0x6c340820, - // Block 0x8c5, offset 0x23140 - 0x23153: 0x6c0f5820, - 0x23154: 0x6c60a820, 0x23155: 0x6c1fb020, 0x23157: 0x6c962620, - 0x2315a: 0x6cc8b220, - 0x2316b: 0x6c55b020, - 0x23171: 0x6c28c420, - 0x23174: 0x6c4e6420, 0x23175: 0x6cc3fe20, 0x23176: 0x6ccc1e20, 0x23177: 0x6d2e1e20, - 0x23178: 0x6d2b0e20, 0x23179: 0x6c201220, 0x2317a: 0x6cb53620, 0x2317b: 0x6c2ef020, - 0x2317d: 0x6d2ce220, 0x2317e: 0x6ce83220, - // Block 0x8c6, offset 0x23180 - 0x23181: 0x6c221220, 0x23182: 0x6cc99e20, - 0x23184: 0x6c955620, 0x23187: 0x6c60be20, - 0x231a2: 0x6c95c220, 0x231a3: 0x6cbdb220, - 0x231a7: 0x6cbf6c20, - 0x231a8: 0x6c739420, - 0x231ac: 0x6c00e020, 0x231ad: 0x6c65e220, - 0x231b9: 0x6ce42a20, 0x231ba: 0x6cf1b620, - 0x231bd: 0x6cbbb620, - // Block 0x8c7, offset 0x231c0 - 0x231c1: 0x6cac0820, 0x231c2: 0x6c5d0620, - 0x231c5: 0x6c00ec20, 0x231c7: 0x6cd7a220, - 0x231c8: 0x6c887220, 0x231c9: 0x6c337420, 0x231cb: 0x6cdebc20, - 0x231cc: 0x6c6cbe20, 0x231cd: 0x6c0a8a20, 0x231ce: 0x6d0de820, 0x231cf: 0x6c435a20, - 0x231d0: 0x6cb18820, 0x231d1: 0x6d242c20, 0x231d2: 0x6ccf7c20, - 0x231d5: 0x6c651420, 0x231d7: 0x6c55dc20, - 0x231da: 0x6c8b4e20, - 0x231dc: 0x6c0bce20, 0x231dd: 0x6cdb4e20, 0x231de: 0x6c689420, - 0x231f8: 0x6d3cb820, - 0x231fd: 0x6c4dc220, - // Block 0x8c8, offset 0x23200 - 0x23207: 0x6c340e20, - 0x23210: 0x6d014e20, 0x23211: 0x6c9b8220, 0x23212: 0x6c3db420, 0x23213: 0x6c931a20, - 0x23214: 0x6ce0b220, 0x23217: 0x6c8ecc20, - 0x23218: 0x6cfaee20, 0x23219: 0x6cca9420, - 0x2321c: 0x6c240220, 0x2321d: 0x6d3c2620, 0x2321f: 0x6c188e20, - 0x23230: 0x6c892820, - 0x23234: 0x6c848c20, - // Block 0x8c9, offset 0x23240 - 0x23240: 0x6caf1a20, 0x23241: 0x6ceb9420, - 0x23244: 0x6cebb820, 0x23246: 0x6c8a4a20, 0x23247: 0x6d002620, - 0x23248: 0x6c20f620, 0x23249: 0x6c581a20, 0x2324a: 0x6ca7c220, 0x2324b: 0x6cb94820, - 0x2324c: 0x6c871c20, 0x2324f: 0x6cad3e20, - 0x23250: 0x6ce5b020, 0x23251: 0x6c8ece20, 0x23252: 0x6cf40a20, - 0x23264: 0x6d1d2620, 0x23266: 0x6d2c6820, - 0x23270: 0x6d21ee20, 0x23272: 0x6cfc5020, 0x23273: 0x6d083820, - 0x23274: 0x6cd68a20, 0x23275: 0x6cf74220, - 0x23278: 0x6c9a4220, 0x23279: 0x6ccbb420, 0x2327a: 0x6c893420, - 0x2327c: 0x6c6f9020, 0x2327d: 0x6c81ec20, - // Block 0x8ca, offset 0x23280 - 0x2328e: 0x6cff5020, 0x2328f: 0x6d407420, - 0x2329a: 0x6c8ee820, - 0x2329c: 0x6d2ff020, 0x2329e: 0x6d30c220, - 0x232a0: 0x6c830820, - 0x232ad: 0x6c32b420, - 0x232b7: 0x6c663420, - 0x232b8: 0x6cd68c20, 0x232b9: 0x6d425620, 0x232ba: 0x6cbd0c20, - 0x232bc: 0x6c81ca20, - // Block 0x8cb, offset 0x232c0 - 0x232c9: 0x6d248420, 0x232ca: 0x6d196620, 0x232cb: 0x6ca66e20, - 0x232ce: 0x6c134620, - 0x232d5: 0x6d0f1a20, 0x232d7: 0x6cc89020, - 0x232de: 0x6d0d1c20, 0x232df: 0x6c2f1e20, - 0x232e0: 0x6c9df620, - 0x232e7: 0x6c82a420, - 0x232e9: 0x6cecae20, - 0x232f0: 0x6ca2fe20, - 0x232f6: 0x6d0d2420, - 0x232fa: 0x6c831c20, - 0x232fd: 0x6ccc3020, 0x232fe: 0x6c551620, - // Block 0x8cc, offset 0x23300 - 0x23301: 0x6cf58020, 0x23302: 0x6cf58220, - 0x23304: 0x6d1fa020, 0x23305: 0x6c4d9220, 0x23307: 0x6c4d0820, - 0x23309: 0x6cebc820, 0x2330a: 0x6d068220, 0x2330b: 0x6caf3c20, - 0x2330c: 0x6cdf8e20, 0x2330d: 0x6cf58a20, 0x2330e: 0x6cf58c20, 0x2330f: 0x6c0d2420, - 0x23310: 0x6cbd1a20, 0x23311: 0x6cf58e20, 0x23312: 0x6d20c420, 0x23313: 0x6cf84a20, - 0x23315: 0x6c22b620, 0x23316: 0x6cba4020, 0x23317: 0x6cf95420, - 0x2331a: 0x6cec0620, 0x2331b: 0x6c35f420, - 0x2331c: 0x6d1fae20, 0x2331d: 0x6d041a20, 0x2331e: 0x6ca5c220, 0x2331f: 0x6c4de420, - 0x23320: 0x6c094a20, 0x23321: 0x6cd0ec20, - 0x23324: 0x6d2d6220, 0x23325: 0x6c2d4420, 0x23326: 0x6d222c20, - 0x23328: 0x6cab7a20, 0x2332a: 0x6c4ae820, 0x2332b: 0x6cee0620, - 0x2332c: 0x6cb8c620, 0x2332d: 0x6d14c820, - 0x23330: 0x6d40b020, 0x23332: 0x6cb8c820, 0x23333: 0x6c2f9c20, - 0x23334: 0x6c793420, 0x23336: 0x6c1f2620, 0x23337: 0x6d13e020, - 0x2333a: 0x6c4d9e20, 0x2333b: 0x6c7b6420, - // Block 0x8cd, offset 0x23340 - 0x23348: 0x6c2d5820, 0x23349: 0x6cf88a20, 0x2334a: 0x6d3e3c20, 0x2334b: 0x6c8d0420, - 0x2334c: 0x6d3f4e20, 0x2334e: 0x6d234420, 0x2334f: 0x6c5ccc20, - 0x23351: 0x6cd86e20, 0x23352: 0x6c76d620, - 0x2335a: 0x6c01c420, - 0x2335c: 0x6d1fca20, 0x2335d: 0x6c605420, 0x2335e: 0x6c5d2c20, 0x2335f: 0x6cb82e20, - 0x23360: 0x6c541020, 0x23361: 0x6c541220, 0x23363: 0x6c2d5c20, - 0x23369: 0x6d004c20, - 0x2336d: 0x6ccf5620, 0x2336e: 0x6ccc5c20, - 0x23372: 0x6d00ca20, 0x23373: 0x6d112220, - 0x23374: 0x6c26f420, 0x23376: 0x6d01d820, 0x23377: 0x6c1ac620, - 0x23378: 0x6d1fde20, 0x23379: 0x6c50a220, 0x2337a: 0x6ccc6220, - 0x2337f: 0x6cdf2e20, - // Block 0x8ce, offset 0x23380 - 0x23381: 0x6d3a1c20, 0x23383: 0x6c006c20, - 0x23387: 0x6cc3e020, - 0x23388: 0x6d2aea20, 0x2338a: 0x6c7e4a20, 0x2338b: 0x6c911620, - 0x2338c: 0x6c1fc820, 0x2338e: 0x6d1fe620, - 0x23396: 0x6ce41020, - 0x23398: 0x6cd1fa20, - 0x233a1: 0x6d000a20, 0x233a2: 0x6cf8ee20, - 0x233a8: 0x6c5e1220, 0x233a9: 0x6c1c8620, 0x233aa: 0x6d18e620, - 0x233af: 0x6cd54420, - 0x233b0: 0x6d270020, 0x233b1: 0x6c155420, 0x233b2: 0x6c36da20, 0x233b3: 0x6cf73620, - 0x233b4: 0x6cf74420, 0x233b5: 0x6d1d2a20, 0x233b6: 0x6d410020, 0x233b7: 0x6d28a220, - 0x233ba: 0x6d28a820, - // Block 0x8cf, offset 0x233c0 - 0x233c2: 0x6cde2c20, 0x233c3: 0x6ced7020, - 0x233c7: 0x6d031e20, - 0x233ca: 0x6cee4820, 0x233cb: 0x6c3f3820, - 0x233d0: 0x6c91b620, - 0x233de: 0x6c656820, - 0x233e1: 0x6d0c6620, 0x233e3: 0x6c094c20, - 0x233e4: 0x6c78fc20, 0x233e5: 0x6c497820, - 0x233e8: 0x6d3e1820, - 0x233ee: 0x6c7cce20, 0x233ef: 0x6d38e020, - 0x233f0: 0x6d35be20, 0x233f3: 0x6ce8a420, - 0x233f7: 0x6cde4c20, - 0x233f9: 0x6c1f3e20, 0x233fa: 0x6c196e20, 0x233fb: 0x6c1a7420, - 0x233fc: 0x6d3af420, 0x233fe: 0x6c26f220, - // Block 0x8d0, offset 0x23400 - 0x23407: 0x6c09c620, - 0x23409: 0x6c641c20, - 0x2340c: 0x6d17e620, 0x2340f: 0x6d26c420, - 0x23410: 0x6c428a20, - 0x23416: 0x6c41ae20, - 0x2341c: 0x6cbbac20, - 0x23420: 0x6c1eb020, 0x23421: 0x6c1eb620, 0x23422: 0x6c0a6a20, - 0x23426: 0x6c4b8a20, - 0x23429: 0x6c47e020, 0x2342a: 0x6c0e0020, 0x2342b: 0x6d1b9420, - 0x2342c: 0x6d3cbc20, 0x2342d: 0x6c47ec20, 0x2342f: 0x6c876820, - 0x23435: 0x6c35c420, 0x23436: 0x6c271420, - 0x2343c: 0x6c118620, - // Block 0x8d1, offset 0x23440 - 0x23442: 0x6ce3d420, 0x23443: 0x6c323620, - 0x23444: 0x6d168c20, - 0x23448: 0x6c2e6020, 0x2344a: 0x6ca97e20, - 0x2344c: 0x6d094420, 0x2344d: 0x6ca54a20, 0x2344e: 0x6c4b3220, 0x2344f: 0x6c779e20, - 0x23452: 0x6c201a20, - 0x23456: 0x6d2c2020, 0x23457: 0x6d1efc20, - 0x23459: 0x6c043420, 0x2345a: 0x6cd24a20, 0x2345b: 0x6c2d3e20, - 0x2345c: 0x6cabb420, 0x2345d: 0x6cc01620, - 0x23461: 0x6d094820, 0x23463: 0x6ca0e420, - 0x23464: 0x6c77e020, 0x23465: 0x6d1fb020, 0x23466: 0x6c68d220, 0x23467: 0x6c0ec620, - 0x2346c: 0x6d052020, - 0x23472: 0x6c9ce820, 0x23473: 0x6c95f220, - 0x23475: 0x6d094e20, 0x23477: 0x6c34e220, - 0x23479: 0x6c37c620, 0x2347a: 0x6cccd820, - 0x2347c: 0x6c7cee20, 0x2347d: 0x6ca52c20, 0x2347e: 0x6c9e1420, 0x2347f: 0x6c85ce20, - // Block 0x8d2, offset 0x23480 - 0x23480: 0x6c949620, 0x23482: 0x6c2e8420, - 0x23484: 0x6cb85620, 0x23485: 0x6c832a20, 0x23487: 0x6c997020, - 0x23489: 0x6c524c20, 0x2348a: 0x6c181620, 0x2348b: 0x6d35e620, - 0x2348d: 0x6c477c20, 0x2348e: 0x6c25b820, - 0x23493: 0x6cf4de20, - 0x23494: 0x6ce26420, 0x23497: 0x6cf61220, - 0x23498: 0x6d10a620, 0x23499: 0x6cefc620, 0x2349b: 0x6d40be20, - 0x2349c: 0x6c96be20, 0x2349d: 0x6d225a20, 0x2349e: 0x6caf0820, 0x2349f: 0x6d17a420, - 0x234a0: 0x6cbe1620, 0x234a1: 0x6d26b620, 0x234a2: 0x6c754c20, 0x234a3: 0x6c67e620, - 0x234a4: 0x6d06d820, 0x234a5: 0x6c07ea20, - 0x234aa: 0x6c95b020, 0x234ab: 0x6d3c6020, - 0x234b2: 0x6c326420, 0x234b3: 0x6cfe4020, - 0x234b6: 0x6c5be420, - 0x234ba: 0x6c479e20, 0x234bb: 0x6c77b020, - 0x234be: 0x6d037c20, 0x234bf: 0x6c5cf020, - // Block 0x8d3, offset 0x234c0 - 0x234c0: 0x6c0af820, - 0x234c4: 0x6c78c420, 0x234c5: 0x6c77b220, - 0x234c8: 0x6c25e820, - 0x234cf: 0x6c92a420, - 0x234d1: 0x6d41c620, 0x234d2: 0x6d2a2020, 0x234d3: 0x6c692e20, - 0x234d4: 0x6c49a020, - 0x234d9: 0x6d0c2220, 0x234da: 0x6c376620, - 0x234dc: 0x6cbe8820, 0x234df: 0x6c2ae820, - 0x234e0: 0x6cd8ea20, 0x234e1: 0x6cdc7220, 0x234e2: 0x6c8aa420, - 0x234e7: 0x6ccdb020, - 0x234e9: 0x6c0a6e20, 0x234ea: 0x6cf0e420, 0x234eb: 0x6d136020, - 0x234ed: 0x6d2d5020, 0x234ef: 0x6d129420, - 0x234f0: 0x6c2e4c20, 0x234f1: 0x6c00ee20, - 0x234f4: 0x6c680620, 0x234f7: 0x6cda6220, - 0x234f9: 0x6c581c20, 0x234fa: 0x6d246020, - 0x234fd: 0x6cc50a20, - // Block 0x8d4, offset 0x23500 - 0x23500: 0x6c2cfa20, 0x23501: 0x6d413e20, 0x23502: 0x6c047420, - 0x23504: 0x6cbd5a20, 0x23507: 0x6c633620, - 0x23509: 0x6cafcc20, - 0x2350c: 0x6ce7ec20, - 0x23510: 0x6c1da220, - 0x23515: 0x6c4af020, - 0x23520: 0x6c5ee620, - 0x23528: 0x6d096420, 0x2352a: 0x6c2d6020, - 0x2352d: 0x6c0bac20, 0x2352e: 0x6d291c20, 0x2352f: 0x6ce76820, - 0x23536: 0x6ccd5820, - 0x23538: 0x6c482620, 0x23539: 0x6cc3ec20, - // Block 0x8d5, offset 0x23540 - 0x23540: 0x6c47cc20, - 0x23548: 0x6c55b220, 0x23549: 0x6c7b0420, - 0x2354c: 0x6c46d820, 0x2354e: 0x6cdb3220, - 0x23550: 0x6c1df620, 0x23552: 0x6c795c20, - 0x23554: 0x6c317e20, - 0x23559: 0x6d190a20, - 0x2355c: 0x6c2a4220, 0x2355d: 0x6cbaf820, - 0x23563: 0x6c900220, - 0x23565: 0x6c84cc20, 0x23567: 0x6c87a020, - 0x23568: 0x6cbe6420, 0x2356a: 0x6ceed420, - 0x2356c: 0x6ca1bc20, - 0x23571: 0x6cb74420, 0x23573: 0x6c67a020, - 0x23574: 0x6d008c20, - 0x23579: 0x6c277820, 0x2357b: 0x6c90a420, - // Block 0x8d6, offset 0x23580 - 0x23582: 0x6c497620, - 0x23586: 0x6cadc820, - 0x23589: 0x6cafce20, 0x2358b: 0x6c735420, - 0x2358d: 0x6c06aa20, 0x2358e: 0x6c747c20, 0x2358f: 0x6c738420, - 0x23590: 0x6cd3b420, - 0x23595: 0x6d014a20, - 0x23598: 0x6cc8a820, 0x23599: 0x6c6ec220, 0x2359a: 0x6cb3be20, 0x2359b: 0x6cc9f420, - 0x235a0: 0x6c5e7a20, - 0x235a9: 0x6c3b1820, 0x235aa: 0x6c06e820, 0x235ab: 0x6c6bc220, - 0x235ac: 0x6cc94020, 0x235ae: 0x6caf3e20, - 0x235b4: 0x6c2c2220, 0x235b5: 0x6c98c820, 0x235b6: 0x6c03ec20, 0x235b7: 0x6c03ee20, - 0x235b8: 0x6ce57820, 0x235b9: 0x6c8cba20, 0x235ba: 0x6cd0f020, 0x235bb: 0x6d31c220, - 0x235bc: 0x6caf4620, 0x235bd: 0x6cf4c620, 0x235bf: 0x6d2b4220, - // Block 0x8d7, offset 0x235c0 - 0x235c0: 0x6c063a20, - 0x235c7: 0x6c938020, - 0x235d6: 0x6c4fa020, 0x235d7: 0x6c30e020, - 0x235d8: 0x6c3e0e20, 0x235d9: 0x6ca5c420, - 0x235dd: 0x6c43de20, - 0x235e0: 0x6cc79820, 0x235e1: 0x6cfbfc20, - 0x235e4: 0x6c096020, - 0x235ee: 0x6c98d220, - 0x235f2: 0x6cc70a20, 0x235f3: 0x6cc04c20, - 0x235f7: 0x6c0ee820, - 0x235f9: 0x6c4fa620, 0x235fa: 0x6ca4ee20, 0x235fb: 0x6d0c8620, - // Block 0x8d8, offset 0x23600 - 0x23603: 0x6cad5c20, - 0x23604: 0x6cdbc020, 0x23606: 0x6ceba220, - 0x23608: 0x6cc10a20, 0x23609: 0x6c83d620, 0x2360a: 0x6c2a7220, - 0x2360c: 0x6c6aca20, 0x2360d: 0x6c6acc20, 0x2360e: 0x6c4bc820, 0x2360f: 0x6c649c20, - 0x23610: 0x6c099e20, - 0x23620: 0x6cca5620, 0x23621: 0x6c053020, 0x23622: 0x6c214a20, - 0x23626: 0x6ca3c220, 0x23627: 0x6c054e20, - 0x2362a: 0x6cc68820, 0x2362b: 0x6c636c20, - 0x2362c: 0x6cd9c220, - 0x23630: 0x6c2a7420, - 0x2363e: 0x6cfaac20, 0x2363f: 0x6d2d8020, - // Block 0x8d9, offset 0x23640 - 0x23640: 0x6c999620, 0x23643: 0x6d3e5020, - 0x23645: 0x6c623c20, 0x23646: 0x6cb61c20, - 0x2364b: 0x6cc82420, - 0x2364c: 0x6cdd2c20, 0x2364d: 0x6cc71620, 0x2364e: 0x6cf50c20, 0x2364f: 0x6cc69620, - 0x23650: 0x6cc69820, - 0x2365a: 0x6cde7620, - 0x2365c: 0x6cd9d020, - 0x23664: 0x6c842c20, 0x23667: 0x6c24fc20, - 0x23668: 0x6d3fb020, 0x23669: 0x6c9ad220, 0x2366a: 0x6cf80820, - 0x2366c: 0x6c989e20, 0x2366d: 0x6ca86220, 0x2366f: 0x6cdbd220, - 0x23671: 0x6cadea20, - 0x23674: 0x6c0a2820, 0x23675: 0x6c2c9020, - 0x23678: 0x6cc1be20, 0x23679: 0x6cbbfa20, 0x2367b: 0x6c3b4420, - 0x2367c: 0x6cdb1620, - // Block 0x8da, offset 0x23680 - 0x23683: 0x6d05e620, - 0x23687: 0x6cc72420, - 0x23688: 0x6c5f3220, 0x2368b: 0x6cc1d620, - 0x2368c: 0x6c8b3820, - 0x23695: 0x6ccafe20, - 0x23698: 0x6c7dd620, 0x2369a: 0x6c257620, 0x2369b: 0x6d136c20, - 0x2369c: 0x6c0e3220, 0x2369e: 0x6c6b5c20, - 0x236a0: 0x6cc1e020, 0x236a1: 0x6cc1e220, - 0x236a5: 0x6c9b6e20, 0x236a6: 0x6cc49020, - 0x236a8: 0x6c0d5e20, 0x236a9: 0x6c178220, - 0x236ac: 0x6c31d420, - 0x236b6: 0x6cc4ec20, 0x236b7: 0x6cfb0220, - 0x236ba: 0x6ce25220, 0x236bb: 0x6cc20a20, - 0x236bc: 0x6ca8b420, 0x236bf: 0x6cd51c20, - // Block 0x8db, offset 0x236c0 - 0x236c0: 0x6c920220, 0x236c2: 0x6c7dda20, - 0x236c8: 0x6c9f3620, 0x236c9: 0x6c9f9e20, - 0x236cd: 0x6c287e20, - 0x236d0: 0x6d1b6820, 0x236d3: 0x6d001020, - 0x236d7: 0x6c618820, - 0x236dc: 0x6d19b220, - 0x236e6: 0x6c3b3820, 0x236e7: 0x6d383420, - 0x236eb: 0x6c47c020, - 0x236f1: 0x6c13c420, 0x236f3: 0x6c8e3c20, - 0x236f6: 0x6c102c20, - 0x236fa: 0x6cabae20, 0x236fb: 0x6cd87620, - 0x236fc: 0x6c29b820, 0x236fd: 0x6d31b020, - // Block 0x8dc, offset 0x23700 - 0x23700: 0x6cccb620, 0x23702: 0x6c1fbe20, - 0x23704: 0x6c6fa820, - 0x2370a: 0x6c787620, 0x2370b: 0x6c1af820, - 0x23711: 0x6c565c20, 0x23712: 0x6c858220, 0x23713: 0x6ccbc620, - 0x23716: 0x6cac1820, 0x23717: 0x6ceee220, - 0x23718: 0x6cf42620, - 0x2371c: 0x6d1c5420, - 0x23721: 0x6ccbc820, 0x23722: 0x6c2b1020, - 0x23725: 0x6c27b820, - 0x23731: 0x6ce83a20, 0x23732: 0x6c50ca20, 0x23733: 0x6cb34e20, - 0x23735: 0x6d34f620, 0x23736: 0x6ca98020, 0x23737: 0x6ca67e20, - 0x2373d: 0x6cc6f820, 0x2373e: 0x6c48ea20, - // Block 0x8dd, offset 0x23740 - 0x23740: 0x6d343e20, 0x23743: 0x6c5fe220, - 0x2375c: 0x6c392c20, 0x2375f: 0x6c6a8020, - 0x23760: 0x6c4d3820, - 0x23764: 0x6d2e4e20, 0x23766: 0x6cf86420, - 0x23769: 0x6d3e1220, - 0x2376c: 0x6cf76e20, 0x2376d: 0x6cb1ac20, - 0x23770: 0x6c078020, 0x23772: 0x6c657220, - // Block 0x8de, offset 0x23780 - 0x23793: 0x6c665c20, - 0x23796: 0x6d28ae20, - 0x2379e: 0x6c07ac20, 0x2379f: 0x6c995e20, - 0x237a2: 0x6d2a7620, 0x237a3: 0x6d3c3820, - 0x237a5: 0x6c7bbe20, - 0x237a8: 0x6c089e20, 0x237aa: 0x6cac2220, - 0x237bc: 0x6c996020, 0x237bd: 0x6ce09020, - // Block 0x8df, offset 0x237c0 - 0x237de: 0x6cea7a20, 0x237df: 0x6c95aa20, - 0x237e2: 0x6cdf9a20, - 0x237f1: 0x6c016a20, - 0x237f7: 0x6c4e0420, - 0x237f8: 0x6d3a0c20, 0x237fa: 0x6c34e820, 0x237fb: 0x6c34ea20, - 0x237fc: 0x6c421c20, - // Block 0x8e0, offset 0x23800 - 0x23806: 0x6cbf8c20, - 0x23808: 0x6cee1220, 0x2380a: 0x6ca10420, 0x2380b: 0x6d30f220, - 0x2380c: 0x6cf1d620, 0x2380d: 0x6d3c3a20, 0x2380f: 0x6c69fe20, - 0x23810: 0x6cad8e20, - 0x23818: 0x6cdaa820, - 0x2381d: 0x6c724020, - 0x23820: 0x6cb4ec20, 0x23821: 0x6c11f420, 0x23823: 0x6ce94a20, - 0x23824: 0x6ccbec20, 0x23826: 0x6ceb1620, - 0x23829: 0x6c579420, 0x2382b: 0x6d176220, - // Block 0x8e1, offset 0x23840 - 0x23860: 0x6c9f4820, 0x23861: 0x6d37b420, - 0x23865: 0x6cd77e20, - 0x23869: 0x6d176420, 0x2386a: 0x6cee1420, 0x2386b: 0x6c024220, - 0x23876: 0x6cda7820, - 0x2387e: 0x6c4b0020, 0x2387f: 0x6ceb8020, - // Block 0x8e2, offset 0x23880 - 0x23880: 0x6c5b5220, 0x23883: 0x6d06dc20, - 0x23884: 0x6d296c20, 0x23886: 0x6d3f1220, 0x23887: 0x6c0b9e20, - 0x23889: 0x6c26a620, 0x2388a: 0x6d19ca20, 0x2388b: 0x6cc35c20, - 0x2388e: 0x6c580e20, 0x2388f: 0x6ca2e020, - 0x23890: 0x6d28ba20, 0x23892: 0x6ce32620, - 0x23898: 0x6d14f820, 0x23899: 0x6cdfaa20, 0x2389a: 0x6ccf1820, 0x2389b: 0x6cd78220, - 0x2389d: 0x6d03e620, - 0x238a0: 0x6d1fce20, 0x238a3: 0x6c3b7620, - // Block 0x8e3, offset 0x238c0 - 0x238c7: 0x6c78b220, - 0x238cb: 0x6c3e7c20, - 0x238d2: 0x6c9fb220, - 0x238da: 0x6cb09820, - 0x238dc: 0x6c604220, 0x238dd: 0x6cbc4a20, 0x238de: 0x6d37fc20, 0x238df: 0x6c422820, - 0x238e0: 0x6d24f820, 0x238e1: 0x6c1b3620, - 0x238e5: 0x6cba5a20, 0x238e7: 0x6d424220, - 0x238e9: 0x6d00bc20, 0x238ea: 0x6c98ea20, - 0x238ec: 0x6c556e20, 0x238ee: 0x6cb0a420, 0x238ef: 0x6d0a9420, - 0x238f1: 0x6cf9d220, 0x238f2: 0x6ce34420, - 0x238f5: 0x6ca34e20, 0x238f6: 0x6c1fac20, - // Block 0x8e4, offset 0x23900 - 0x23900: 0x6cf45020, - 0x2392c: 0x6c599820, 0x2392d: 0x6d096620, 0x2392e: 0x6ce26620, - 0x23930: 0x6cbc4c20, 0x23933: 0x6c685020, - 0x2393c: 0x6c293020, 0x2393d: 0x6c044620, - // Block 0x8e5, offset 0x23940 - 0x2394d: 0x6c297620, 0x2394e: 0x6c79f820, - 0x23950: 0x6c70b220, 0x23951: 0x6ccc0a20, 0x23952: 0x6c6dc820, - 0x23955: 0x6ca06c20, 0x23956: 0x6caa0220, - 0x23958: 0x6cd78e20, 0x2395a: 0x6cd5f820, 0x2395b: 0x6d3c2020, - 0x2395c: 0x6c3ec220, 0x2395f: 0x6d29de20, - 0x23960: 0x6d00cc20, 0x23961: 0x6c812820, 0x23962: 0x6ce70420, - 0x23969: 0x6d306e20, - 0x2396c: 0x6c11fe20, 0x2396e: 0x6d26cc20, - 0x23971: 0x6d393620, - // Block 0x8e6, offset 0x23980 - 0x2399a: 0x6cdfb420, - 0x2399e: 0x6d0cb420, 0x2399f: 0x6c928820, - 0x239a0: 0x6d0db620, - 0x239a6: 0x6d2ae020, 0x239a7: 0x6cd66c20, - // Block 0x8e7, offset 0x239c0 - 0x239c5: 0x6c4c3620, 0x239c6: 0x6d3a2020, - 0x239c8: 0x6cc7bc20, 0x239c9: 0x6cc7be20, - 0x239cc: 0x6c76e620, 0x239cd: 0x6c626220, 0x239ce: 0x6c42da20, - 0x239d2: 0x6d01fa20, - 0x239d5: 0x6caba220, 0x239d6: 0x6c64d420, - 0x239da: 0x6d349220, 0x239db: 0x6d2c4820, - 0x239dd: 0x6c53a820, 0x239df: 0x6c7b7020, - 0x239e1: 0x6c0f4420, - 0x239e4: 0x6ccb4820, 0x239e5: 0x6c01cc20, 0x239e6: 0x6c66b820, - 0x239e8: 0x6ce2ac20, 0x239eb: 0x6cd93420, - 0x239ed: 0x6c9c0c20, 0x239ee: 0x6d1a9420, 0x239ef: 0x6cdfb620, - 0x239f0: 0x6c4c3820, 0x239f3: 0x6cc84620, - 0x239f4: 0x6cf0ba20, 0x239f7: 0x6cd8de20, - // Block 0x8e8, offset 0x23a00 - 0x23a24: 0x6cb7c220, 0x23a26: 0x6d2f0a20, - // Block 0x8e9, offset 0x23a40 - 0x23a45: 0x6c304020, 0x23a46: 0x6c3eee20, 0x23a47: 0x6cd07620, - 0x23a48: 0x6cdb1a20, 0x23a49: 0x6d18a020, 0x23a4a: 0x6c891820, - 0x23a4c: 0x6c516e20, 0x23a4e: 0x6d319420, - 0x23a50: 0x6d2afe20, 0x23a52: 0x6c250c20, 0x23a53: 0x6c250e20, - 0x23a5d: 0x6c3cf220, 0x23a5e: 0x6c853220, 0x23a5f: 0x6c7a0220, - 0x23a63: 0x6d000620, - 0x23a64: 0x6d1fee20, - // Block 0x8ea, offset 0x23a80 - 0x23a83: 0x6c4fea20, - 0x23a89: 0x6c4f0620, 0x23a8a: 0x6c790c20, - 0x23a9d: 0x6d23ec20, - 0x23aa3: 0x6c58e220, - 0x23aa4: 0x6cdd3e20, 0x23aa6: 0x6c7e9c20, - 0x23aa8: 0x6c313c20, 0x23aa9: 0x6c66de20, 0x23aaa: 0x6cb32020, 0x23aab: 0x6c0b5420, - 0x23ab0: 0x6d097420, 0x23ab2: 0x6c0bc820, - 0x23ab7: 0x6cf0e620, - // Block 0x8eb, offset 0x23ac0 - 0x23ae1: 0x6c28d620, 0x23ae2: 0x6c6b5e20, 0x23ae3: 0x6c046020, - 0x23ae5: 0x6ca74420, 0x23ae6: 0x6cfd2620, 0x23ae7: 0x6ccb7620, - 0x23aea: 0x6c576420, 0x23aeb: 0x6c1fa420, - 0x23aee: 0x6caba620, 0x23aef: 0x6c8b5020, - 0x23af0: 0x6c2ba420, 0x23af1: 0x6c114e20, 0x23af3: 0x6d2c5e20, - 0x23af5: 0x6c936820, - 0x23af9: 0x6c5e1420, - 0x23afc: 0x6c86ce20, 0x23afd: 0x6d1d1620, 0x23aff: 0x6cf03a20, - // Block 0x8ec, offset 0x23b00 - 0x23b00: 0x6c0a8c20, 0x23b01: 0x6c4c9620, 0x23b03: 0x6cb0ce20, - 0x23b06: 0x6c0c3a20, - 0x23b20: 0x6d0dea20, - 0x23b24: 0x6d3bee20, - 0x23b32: 0x6c539420, - 0x23b36: 0x6c8c7820, 0x23b37: 0x6c36ce20, - 0x23b39: 0x6d1b1820, 0x23b3a: 0x6c808020, - 0x23b3c: 0x6d123820, 0x23b3f: 0x6d08c820, - // Block 0x8ed, offset 0x23b40 - 0x23b40: 0x6c86fa20, - 0x23b68: 0x6c808420, 0x23b69: 0x6c8d9020, 0x23b6a: 0x6cf73820, 0x23b6b: 0x6c52de20, - 0x23b6d: 0x6c696a20, 0x23b6e: 0x6d3dd220, - 0x23b72: 0x6d34b620, - 0x23b75: 0x6c0fb820, 0x23b76: 0x6ce29620, 0x23b77: 0x6c019820, - 0x23b7a: 0x6d0a5220, 0x23b7b: 0x6c82fa20, - 0x23b7c: 0x6d29ec20, 0x23b7d: 0x6c5b7c20, - // Block 0x8ee, offset 0x23b80 - 0x23b8e: 0x6cf92620, 0x23b8f: 0x6c539820, - 0x23b91: 0x6c397820, 0x23b92: 0x6c662420, 0x23b93: 0x6c23c820, - 0x23b94: 0x6d28da20, 0x23b96: 0x6c10e020, - 0x23b98: 0x6d1ece20, 0x23b9b: 0x6c338820, - 0x23b9c: 0x6cac4e20, - 0x23ba5: 0x6cdede20, 0x23ba7: 0x6cacc420, - 0x23bab: 0x6c386e20, - 0x23bac: 0x6cf74620, - 0x23bb6: 0x6d124c20, 0x23bb7: 0x6c957620, - 0x23bba: 0x6c0b2220, - 0x23bbc: 0x6c6d7420, 0x23bbd: 0x6c876a20, - // Block 0x8ef, offset 0x23bc0 - 0x23bca: 0x6d0f0a20, 0x23bcb: 0x6c315020, - 0x23bce: 0x6c981620, - 0x23bd0: 0x6c45ca20, 0x23bd1: 0x6cc51420, 0x23bd2: 0x6c121220, - 0x23be3: 0x6c9ae420, - 0x23bf1: 0x6c47fc20, 0x23bf2: 0x6cd69e20, - 0x23bf8: 0x6d0d2020, 0x23bf9: 0x6c0adc20, - // Block 0x8f0, offset 0x23c00 - 0x23c00: 0x6c0c6a20, 0x23c01: 0x6c1a6220, 0x23c02: 0x6c7ce620, - 0x23c04: 0x6c5d8820, - 0x23c0d: 0x6c1be620, 0x23c0f: 0x6cf2d020, - 0x23c11: 0x6c23e820, 0x23c12: 0x6d357a20, - 0x23c19: 0x6cd70820, - 0x23c1c: 0x6c48a220, 0x23c1d: 0x6cb40020, 0x23c1e: 0x6d068620, 0x23c1f: 0x6cd7d020, - 0x23c21: 0x6cf42e20, - 0x23c2e: 0x6c3d4020, - 0x23c30: 0x6cd31e20, 0x23c33: 0x6c5b9220, - 0x23c34: 0x6c597c20, 0x23c35: 0x6cabb620, - 0x23c3c: 0x6d3a5e20, 0x23c3e: 0x6d14a220, - // Block 0x8f1, offset 0x23c40 - 0x23c43: 0x6c85a820, - 0x23c44: 0x6ccd3420, - 0x23c5c: 0x6c9f3820, 0x23c5e: 0x6c437c20, - 0x23c60: 0x6c54b020, - 0x23c6f: 0x6c371220, - 0x23c70: 0x6c380e20, 0x23c73: 0x6d06aa20, - 0x23c74: 0x6d14ca20, - 0x23c7e: 0x6d1d3620, - // Block 0x8f2, offset 0x23c80 - 0x23c94: 0x6c1b1820, - 0x23c99: 0x6d14cc20, - 0x23ca5: 0x6c2b6a20, 0x23ca6: 0x6c5b5020, 0x23ca7: 0x6c510c20, - 0x23ca9: 0x6d2c7a20, - 0x23cb6: 0x6d27a420, 0x23cb7: 0x6cfa9c20, - // Block 0x8f3, offset 0x23cc0 - 0x23ccc: 0x6cfb4c20, 0x23ccd: 0x6c81d220, 0x23cce: 0x6cced420, 0x23ccf: 0x6cd36820, - 0x23cd0: 0x6d3d5220, - 0x23ce4: 0x6c0ca820, 0x23ce5: 0x6c6fc020, 0x23ce6: 0x6cf29220, 0x23ce7: 0x6c68f820, - 0x23ce8: 0x6c3e7e20, 0x23cea: 0x6cfd7620, 0x23ceb: 0x6c768a20, - // Block 0x8f4, offset 0x23d00 - 0x23d32: 0x6ca4fe20, - 0x23d34: 0x6c5ddc20, 0x23d35: 0x6c605620, 0x23d36: 0x6c7e7e20, - 0x23d3b: 0x6c3d1220, - 0x23d3c: 0x6ccd4c20, 0x23d3d: 0x6c8a9c20, 0x23d3e: 0x6c9ee020, 0x23d3f: 0x6c182620, - // Block 0x8f5, offset 0x23d40 - 0x23d42: 0x6ca05e20, - 0x23d4f: 0x6c909820, - 0x23d68: 0x6c34f620, 0x23d6b: 0x6ca50020, - 0x23d6d: 0x6c5ee820, - 0x23d70: 0x6d3b0820, - // Block 0x8f6, offset 0x23d80 - 0x23d82: 0x6cdad220, 0x23d83: 0x6c34f820, - 0x23d87: 0x6c6f2820, - 0x23d8a: 0x6d291e20, 0x23d8b: 0x6c5b5c20, - 0x23d8c: 0x6d1cfe20, 0x23d8d: 0x6c557a20, 0x23d8e: 0x6c8c5820, 0x23d8f: 0x6cf25820, - 0x23d90: 0x6c4ee820, - 0x23d94: 0x6ca40620, - 0x23db7: 0x6cf8b020, - 0x23db9: 0x6c422c20, - 0x23dbe: 0x6c51d420, 0x23dbf: 0x6c5f0820, - // Block 0x8f7, offset 0x23dc0 - 0x23dc0: 0x6cfdf020, 0x23dc1: 0x6ccc0c20, - 0x23dd0: 0x6cea0c20, 0x23dd2: 0x6d2f6c20, 0x23dd3: 0x6cd60420, - 0x23dd5: 0x6d1fe820, 0x23dd6: 0x6c64d820, - 0x23ddc: 0x6d2a8c20, - 0x23de4: 0x6d2ed820, - 0x23dfd: 0x6cc92c20, - // Block 0x8f8, offset 0x23e00 - 0x23e04: 0x6d0c2420, - 0x23e0b: 0x6c255a20, - 0x23e17: 0x6c608a20, - 0x23e18: 0x6cce1a20, - 0x23e23: 0x6c36a820, - 0x23e24: 0x6c817420, 0x23e25: 0x6ce07820, 0x23e27: 0x6d3b2820, - 0x23e2d: 0x6c8c3620, 0x23e2f: 0x6d2b9220, - 0x23e31: 0x6c732a20, 0x23e32: 0x6c550220, - // Block 0x8f9, offset 0x23e40 - 0x23e57: 0x6cd07820, - 0x23e58: 0x6c5dfa20, - 0x23e5c: 0x6c7d2020, - 0x23e71: 0x6c1f7620, 0x23e72: 0x6d395020, - 0x23e76: 0x6c023020, - 0x23e78: 0x6d3db220, - 0x23e7d: 0x6d03a420, 0x23e7f: 0x6c9ef420, - // Block 0x8fa, offset 0x23e80 - 0x23e80: 0x6c550c20, - 0x23e94: 0x6ce01a20, - 0x23e99: 0x6c0a7220, - 0x23ea3: 0x6c2f8420, - 0x23ea9: 0x6c769820, 0x23eab: 0x6c0c3c20, - 0x23eb0: 0x6c5e1620, 0x23eb1: 0x6c8b5220, 0x23eb2: 0x6c24b820, - // Block 0x8fb, offset 0x23ec0 - 0x23ec3: 0x6cfd2820, - 0x23ec4: 0x6cc55620, - 0x23ed3: 0x6d270220, - 0x23ed5: 0x6d09be20, 0x23ed7: 0x6c8a8020, - 0x23ee3: 0x6ccc2a20, - 0x23ee6: 0x6cd3fc20, - 0x23eea: 0x6d025c20, - 0x23ef3: 0x6cff4a20, - 0x23ef7: 0x6d129620, - 0x23ef8: 0x6c805020, 0x23ef9: 0x6d192e20, - 0x23eff: 0x6c88da20, - // Block 0x8fc, offset 0x23f00 - 0x23f14: 0x6c0fba20, 0x23f15: 0x6c126e20, - 0x23f1d: 0x6d124220, - 0x23f26: 0x6c893620, - 0x23f3b: 0x6cdef020, - // Block 0x8fd, offset 0x23f40 - 0x23f51: 0x6c62ec20, - 0x23f54: 0x6cf75220, 0x23f55: 0x6d377020, - 0x23f5a: 0x6cf75620, - 0x23f5d: 0x6d273220, - 0x23f64: 0x6cfc6c20, 0x23f66: 0x6d3df820, - 0x23f6f: 0x6d2ef820, - 0x23f75: 0x6d410620, 0x23f77: 0x6ca2ce20, - 0x23f7e: 0x6c2a0420, 0x23f7f: 0x6c8ad620, - // Block 0x8fe, offset 0x23f80 - 0x23f80: 0x6ca2d220, - 0x23f89: 0x6cad5420, 0x23f8b: 0x6c721620, - 0x23f96: 0x6c95b220, - 0x23f99: 0x6cd64820, 0x23f9a: 0x6cce5420, - 0x23f9d: 0x6c95b420, 0x23f9f: 0x6c3b3a20, - 0x23fa3: 0x6c065820, - 0x23fa8: 0x6c865820, 0x23fab: 0x6d04a220, - 0x23fb6: 0x6c290820, - // Block 0x8ff, offset 0x23fc0 - 0x23fc0: 0x6c1a8c20, - 0x23fc4: 0x6d2f1420, 0x23fc7: 0x6cda3a20, - 0x23fca: 0x6cd03e20, - 0x23fd2: 0x6c447220, - 0x23fd8: 0x6d209020, 0x23fda: 0x6c5ad420, 0x23fdb: 0x6c183e20, - 0x23fdd: 0x6c698420, 0x23fde: 0x6d3ac420, 0x23fdf: 0x6cd4b220, - 0x23fe2: 0x6cff8420, - 0x23fe6: 0x6ca91420, - 0x23fed: 0x6c674420, 0x23fef: 0x6c674820, - 0x23ff7: 0x6c2e0e20, - 0x23ffd: 0x6cbb0c20, 0x23ffe: 0x6cc04e20, - // Block 0x900, offset 0x24000 - 0x24000: 0x6c3c4020, - 0x24006: 0x6d2e6620, 0x24007: 0x6c77fa20, - 0x24012: 0x6c2ece20, 0x24013: 0x6d2aec20, - 0x24016: 0x6c49f820, 0x24017: 0x6ccb5c20, - 0x24018: 0x6c3bea20, 0x2401b: 0x6c67bc20, - 0x2401d: 0x6d0cd820, 0x2401e: 0x6d370820, - 0x24022: 0x6c872220, - 0x24026: 0x6c8ddc20, - 0x2402a: 0x6d146420, - 0x2402c: 0x6cc23e20, 0x2402d: 0x6cac5220, 0x2402e: 0x6c463a20, - 0x24030: 0x6c640220, 0x24031: 0x6c50da20, 0x24033: 0x6caf0c20, - 0x24035: 0x6c721820, 0x24037: 0x6c180620, - 0x2403a: 0x6c8af220, 0x2403b: 0x6cd35220, - 0x2403c: 0x6cb37a20, 0x2403d: 0x6cfe2820, 0x2403f: 0x6cb08e20, - // Block 0x901, offset 0x24040 - 0x24040: 0x6c95ae20, 0x24041: 0x6c243420, 0x24043: 0x6d225020, - 0x24047: 0x6c79a820, - 0x24048: 0x6d01b020, - 0x2404d: 0x6ced1e20, 0x2404e: 0x6d0d8e20, 0x2404f: 0x6cadd820, - 0x24053: 0x6c1a0620, - 0x24058: 0x6ce34620, 0x24059: 0x6c182820, 0x2405a: 0x6c09ce20, 0x2405b: 0x6c890820, - 0x2405c: 0x6c641e20, 0x2405e: 0x6ce68220, - 0x24062: 0x6ce2f620, - 0x24068: 0x6c2edc20, 0x2406a: 0x6cd60620, 0x2406b: 0x6c842e20, - 0x2406c: 0x6c936020, 0x2406d: 0x6cf97420, 0x2406f: 0x6c24e420, - 0x24073: 0x6c0e9220, - 0x24074: 0x6ce9ba20, 0x24075: 0x6cb45020, 0x24077: 0x6c8c6220, - 0x24078: 0x6c3bec20, 0x2407a: 0x6c0f7620, 0x2407b: 0x6c163620, - 0x2407e: 0x6c290a20, 0x2407f: 0x6cdf5820, - // Block 0x902, offset 0x24080 - 0x24080: 0x6c2a3c20, 0x24083: 0x6c872420, - 0x24085: 0x6d0b1220, 0x24086: 0x6d0b1820, 0x24087: 0x6d2d6620, - 0x2408a: 0x6d14e220, - 0x2408c: 0x6cb4fa20, - 0x24094: 0x6c564420, 0x24096: 0x6ce62a20, - 0x24098: 0x6c79cc20, 0x2409b: 0x6c213220, - 0x2409c: 0x6d1f0020, 0x2409d: 0x6c3bd020, 0x2409f: 0x6caab220, - 0x240a0: 0x6ce53020, 0x240a1: 0x6c6cde20, 0x240a2: 0x6cafbc20, 0x240a3: 0x6c18a420, - 0x240a4: 0x6cb08820, 0x240a6: 0x6c6bc420, 0x240a7: 0x6c4ac820, - 0x240b2: 0x6d3c3220, - 0x240b5: 0x6c552420, 0x240b6: 0x6c1e2420, 0x240b7: 0x6cd5a020, - 0x240b8: 0x6ce1b420, 0x240b9: 0x6cafc620, 0x240ba: 0x6cc70020, 0x240bb: 0x6cc70220, - 0x240bd: 0x6c544e20, 0x240be: 0x6cae5a20, - // Block 0x903, offset 0x240c0 - 0x240c5: 0x6c043e20, 0x240c7: 0x6cf99a20, - 0x240cb: 0x6cbdcc20, - 0x240cc: 0x6ca63220, 0x240ce: 0x6ce1b620, 0x240cf: 0x6cc26a20, - 0x240d2: 0x6d008e20, - 0x240d4: 0x6d2fa820, 0x240d5: 0x6c570e20, 0x240d6: 0x6d02c820, - 0x240d8: 0x6cd42e20, 0x240db: 0x6ce8a620, - 0x240dd: 0x6c895020, 0x240de: 0x6c097c20, 0x240df: 0x6c1e5a20, - 0x240e1: 0x6d037020, 0x240e3: 0x6d02cc20, - 0x240e4: 0x6c3d6820, - 0x240e9: 0x6c6bde20, - 0x240ed: 0x6c3f5e20, - 0x240f0: 0x6ce27a20, 0x240f1: 0x6ccf4c20, - 0x240f4: 0x6c174620, 0x240f5: 0x6c20b820, - 0x240fc: 0x6cc47a20, 0x240fd: 0x6c545620, 0x240fe: 0x6c07ec20, - // Block 0x904, offset 0x24100 - 0x24100: 0x6c113020, - 0x24105: 0x6ca21420, - 0x24109: 0x6d059e20, 0x2410a: 0x6c2eaa20, - 0x2410d: 0x6c15c220, 0x2410e: 0x6d215c20, 0x2410f: 0x6d383620, - 0x24113: 0x6c83e620, - 0x24114: 0x6cd43420, - 0x2411a: 0x6c31a420, - 0x2411c: 0x6c98bc20, 0x2411d: 0x6c59d420, 0x2411f: 0x6ce22c20, - 0x24121: 0x6c326620, 0x24122: 0x6ce34820, 0x24123: 0x6cd10820, - 0x24124: 0x6c9a0e20, - 0x24128: 0x6d316820, 0x24129: 0x6cbd9020, 0x2412a: 0x6cb0ae20, 0x2412b: 0x6ce11620, - 0x2412c: 0x6c123820, 0x2412d: 0x6d112420, 0x2412f: 0x6d054620, - 0x24130: 0x6c053620, 0x24131: 0x6c47b220, - 0x24135: 0x6c10aa20, - 0x2413c: 0x6c46c620, 0x2413d: 0x6c0f2e20, - // Block 0x905, offset 0x24140 - 0x24141: 0x6cf21020, - 0x24144: 0x6c624420, - 0x2414a: 0x6c7e4c20, - 0x2414d: 0x6c24e620, 0x2414e: 0x6c9fc820, 0x2414f: 0x6c242820, - 0x24150: 0x6cab4e20, 0x24151: 0x6d1da620, - 0x24156: 0x6c98fe20, 0x24157: 0x6c78c820, - 0x24158: 0x6c981e20, 0x24159: 0x6c2f8020, 0x2415a: 0x6c582e20, 0x2415b: 0x6c34ac20, - 0x2415c: 0x6c677420, 0x2415d: 0x6cdb0220, - 0x24162: 0x6c135c20, 0x24163: 0x6cde9e20, - 0x24165: 0x6c59f820, 0x24166: 0x6c74be20, 0x24167: 0x6d0a4020, - 0x2416a: 0x6d04a620, - 0x2416c: 0x6c9d8820, 0x2416d: 0x6cc45620, 0x2416e: 0x6c817620, - 0x24171: 0x6d370a20, 0x24172: 0x6cf02820, - 0x24177: 0x6ccb6e20, - 0x2417b: 0x6d29ea20, - // Block 0x906, offset 0x24180 - 0x24181: 0x6c019620, 0x24182: 0x6cf10c20, - 0x24184: 0x6c581e20, 0x24187: 0x6d2e9e20, - 0x24189: 0x6d1c2c20, 0x2418a: 0x6c43bc20, 0x2418b: 0x6c5c9220, - 0x2418d: 0x6cc33420, - 0x24193: 0x6c8b7c20, - 0x24194: 0x6c719a20, 0x24195: 0x6c03de20, 0x24196: 0x6c82a620, - 0x24198: 0x6c97ac20, 0x24199: 0x6c8dde20, - 0x2419c: 0x6c856a20, 0x2419d: 0x6c611420, - 0x241a1: 0x6c5b1620, 0x241a2: 0x6d031820, 0x241a3: 0x6cd30020, - 0x241a4: 0x6d300e20, 0x241a7: 0x6c0e4820, - 0x241ab: 0x6c137a20, - 0x241af: 0x6c137e20, - 0x241b0: 0x6c6d8c20, 0x241b1: 0x6c031c20, 0x241b2: 0x6c06da20, - 0x241b5: 0x6d0e3c20, 0x241b7: 0x6c565e20, - 0x241b9: 0x6d20ba20, 0x241bb: 0x6c091e20, - 0x241bc: 0x6c1ff220, 0x241be: 0x6c612220, - // Block 0x907, offset 0x241c0 - 0x241c2: 0x6ca26c20, - 0x241c4: 0x6c98c420, 0x241c5: 0x6d379420, 0x241c7: 0x6d12c620, - 0x241c8: 0x6c30a020, 0x241c9: 0x6d12a420, - 0x241cd: 0x6cc63c20, 0x241ce: 0x6d19a620, - 0x241d0: 0x6c501e20, 0x241d2: 0x6ca31220, 0x241d3: 0x6ce61020, - 0x241d4: 0x6c3fb620, 0x241d5: 0x6ca22c20, 0x241d6: 0x6d291020, - 0x241d8: 0x6c552820, 0x241da: 0x6c185c20, 0x241db: 0x6ceaf420, - 0x241de: 0x6c1f1220, 0x241df: 0x6c3df820, - 0x241e7: 0x6c063420, - 0x241ec: 0x6c2bde20, 0x241ed: 0x6c111c20, 0x241ee: 0x6c921220, 0x241ef: 0x6cb35020, - 0x241f0: 0x6c268620, 0x241f1: 0x6d12da20, 0x241f3: 0x6d15d220, - 0x241f7: 0x6cfdb620, - 0x241f8: 0x6c086e20, 0x241f9: 0x6d398c20, 0x241fb: 0x6d14a620, - 0x241fd: 0x6c93d220, 0x241ff: 0x6c7b9420, - // Block 0x908, offset 0x24200 - 0x24202: 0x6d35a420, - 0x24207: 0x6cec0820, - 0x24208: 0x6c2b1c20, 0x24209: 0x6cd5b020, 0x2420a: 0x6c8ad820, 0x2420b: 0x6d2a4220, - 0x2420c: 0x6d35a620, 0x2420d: 0x6ca49e20, - 0x24217: 0x6c147220, - 0x2421a: 0x6cfea620, 0x2421b: 0x6d2a0220, - 0x2421e: 0x6d22f420, 0x2421f: 0x6c310620, - 0x24220: 0x6c143e20, 0x24221: 0x6d009020, 0x24222: 0x6d0fa220, - 0x24224: 0x6cfc0220, 0x24225: 0x6c05f220, - 0x2422e: 0x6d2cec20, - 0x24230: 0x6cc03420, 0x24232: 0x6c553420, 0x24233: 0x6d293220, - 0x24234: 0x6c741620, 0x24236: 0x6c4d9a20, - 0x2423f: 0x6c01ae20, - // Block 0x909, offset 0x24240 - 0x24240: 0x6d2a7820, 0x24243: 0x6ccc4c20, - 0x24245: 0x6cfcb220, 0x24246: 0x6c1b9e20, 0x24247: 0x6d0d6a20, - 0x24249: 0x6c01ba20, - 0x2424d: 0x6d305220, 0x2424e: 0x6c742c20, - 0x24251: 0x6c85ea20, 0x24253: 0x6c822020, - 0x24256: 0x6c112c20, - 0x24258: 0x6c924220, 0x2425a: 0x6c634c20, - 0x2425d: 0x6cfa3820, 0x2425e: 0x6cfff020, 0x2425f: 0x6d0c0c20, - 0x24260: 0x6d05a020, 0x24262: 0x6c33f020, 0x24263: 0x6d1c7620, - 0x24264: 0x6c5ab820, 0x24265: 0x6ce32820, 0x24266: 0x6caa0020, 0x24267: 0x6cf7e820, - 0x2426a: 0x6ce8b220, - 0x24277: 0x6cec5620, - 0x24278: 0x6c186620, - 0x2427c: 0x6c52aa20, 0x2427e: 0x6ce32a20, 0x2427f: 0x6d07a020, - // Block 0x90a, offset 0x24280 - 0x24280: 0x6d28bc20, - 0x24287: 0x6c43f020, - 0x2428b: 0x6c908c20, - 0x2428c: 0x6c147c20, 0x2428d: 0x6cac6020, 0x2428e: 0x6c605820, - 0x24290: 0x6cde5e20, 0x24293: 0x6cf64e20, - 0x24296: 0x6cfeda20, - 0x24298: 0x6ccab620, 0x24299: 0x6c637020, 0x2429a: 0x6cdad420, 0x2429b: 0x6c599a20, - 0x2429d: 0x6c25bc20, 0x2429f: 0x6cde6020, - 0x242a0: 0x6cd65420, - 0x242aa: 0x6c3e9a20, 0x242ab: 0x6c863620, - 0x242ad: 0x6ccf5a20, 0x242af: 0x6ce10620, - 0x242b6: 0x6c2cd020, - 0x242ba: 0x6c09fa20, - 0x242bc: 0x6c46c820, 0x242bd: 0x6c244620, 0x242bf: 0x6cb90820, - // Block 0x90b, offset 0x242c0 - 0x242c2: 0x6c824620, 0x242c3: 0x6cdaea20, - 0x242c6: 0x6d402420, 0x242c7: 0x6c4faa20, - 0x242cf: 0x6c1c4420, - 0x242d0: 0x6c128020, 0x242d3: 0x6cf30420, - 0x242d4: 0x6cfef220, 0x242d5: 0x6c8b2020, 0x242d6: 0x6d0c1e20, - 0x242dd: 0x6c09fc20, 0x242df: 0x6c594220, - 0x242e1: 0x6cf67820, 0x242e2: 0x6c1ac820, 0x242e3: 0x6d05d620, - 0x242e4: 0x6ca4bc20, 0x242e5: 0x6d0cc020, 0x242e7: 0x6d01fc20, - 0x242e8: 0x6d2c4a20, 0x242ea: 0x6cdc5e20, - 0x242ec: 0x6cf8ca20, 0x242ed: 0x6c080620, 0x242ee: 0x6cc48420, 0x242ef: 0x6cd79820, - 0x242f0: 0x6c049020, 0x242f1: 0x6c4b6a20, 0x242f2: 0x6c763c20, 0x242f3: 0x6c188020, - 0x242f6: 0x6d072820, - 0x242fe: 0x6c368620, 0x242ff: 0x6c865a20, - // Block 0x90c, offset 0x24300 - 0x24300: 0x6cf69e20, 0x24301: 0x6c594c20, 0x24302: 0x6cdb0420, - 0x24304: 0x6c16f620, - 0x2430a: 0x6c92a820, 0x2430b: 0x6d0cc220, - 0x2430e: 0x6c290620, 0x2430f: 0x6c284620, - 0x24310: 0x6d0f6a20, 0x24312: 0x6d2d3620, 0x24313: 0x6c729020, - 0x24315: 0x6c345e20, 0x24316: 0x6ccabe20, 0x24317: 0x6c7f2a20, - 0x24318: 0x6cdb1c20, - 0x2431f: 0x6d2b0020, - 0x24323: 0x6c0a5020, - 0x24326: 0x6d1b8c20, - 0x24328: 0x6c4fb420, 0x2432a: 0x6c8b3a20, - 0x2432d: 0x6c4ff620, 0x2432e: 0x6d0fdc20, - 0x24334: 0x6cd7a420, 0x24335: 0x6c00f020, 0x24336: 0x6cbf7420, - 0x24339: 0x6c82ec20, 0x2433a: 0x6d011220, - 0x2433c: 0x6cd3f220, - // Block 0x90d, offset 0x24340 - 0x24343: 0x6c91ec20, - 0x24345: 0x6cc41220, 0x24346: 0x6c888020, - 0x2434c: 0x6d001a20, 0x2434e: 0x6d1c2020, - 0x24351: 0x6d012620, - 0x24358: 0x6c8d9e20, 0x24359: 0x6d1ed620, - 0x2435e: 0x6c294020, 0x2435f: 0x6c806020, - 0x24360: 0x6cff5e20, - 0x24368: 0x6d182a20, - 0x2436c: 0x6cf34c20, 0x2436e: 0x6d168e20, 0x2436f: 0x6ceaa420, - 0x24370: 0x6c102e20, 0x24372: 0x6d032020, - 0x24375: 0x6cd7c420, 0x24376: 0x6c6c2a20, - 0x24378: 0x6c031e20, 0x24379: 0x6c383020, 0x2437b: 0x6ca0d420, - 0x2437c: 0x6cc91220, - // Block 0x90e, offset 0x24380 - 0x2438a: 0x6c26ea20, 0x2438b: 0x6c619820, - 0x24390: 0x6cda8820, 0x24391: 0x6cbf0620, 0x24392: 0x6c033020, - 0x243a6: 0x6ce48c20, 0x243a7: 0x6d1f0a20, - 0x243a9: 0x6ceb0020, 0x243ab: 0x6cec6c20, - 0x243ac: 0x6d202e20, 0x243ae: 0x6c2fe820, - 0x243b1: 0x6cf7d820, 0x243b2: 0x6c799820, - 0x243b6: 0x6cbf0c20, 0x243b7: 0x6c32f820, - 0x243b8: 0x6c34e420, 0x243ba: 0x6d173620, - // Block 0x90f, offset 0x243c0 - 0x243d2: 0x6cf5c820, 0x243d3: 0x6cbd2420, - 0x243d4: 0x6cda9220, 0x243d7: 0x6c8e5220, - 0x243d9: 0x6cecd820, - 0x243ed: 0x6c17da20, 0x243ee: 0x6d399a20, - 0x243f0: 0x6c997220, - 0x243f7: 0x6cc2de20, - 0x243fd: 0x6d208c20, 0x243ff: 0x6d17ac20, - // Block 0x910, offset 0x24400 - 0x24400: 0x6c9c5020, 0x24403: 0x6c7f0c20, - 0x24404: 0x6d362e20, - 0x24424: 0x6ca5e620, 0x24426: 0x6c048220, - 0x2442a: 0x6c300420, - 0x2442e: 0x6d363020, - // Block 0x911, offset 0x24440 - 0x24455: 0x6d17ec20, - 0x24458: 0x6c8d1e20, 0x24459: 0x6d216020, 0x2445a: 0x6c231e20, 0x2445b: 0x6c2c6a20, - 0x2445c: 0x6d365c20, - 0x24460: 0x6cc86820, 0x24463: 0x6c669a20, - 0x24469: 0x6ced8c20, 0x2446b: 0x6c6d2c20, - 0x2446d: 0x6cad0820, - // Block 0x912, offset 0x24480 - 0x2448d: 0x6c928a20, 0x2448e: 0x6cc1a620, - 0x24490: 0x6cf80020, 0x24491: 0x6c26b420, - 0x24496: 0x6c56c220, 0x24497: 0x6c95bc20, - 0x24499: 0x6c822820, - 0x244b6: 0x6c45f820, - 0x244bb: 0x6c8e2620, - // Block 0x913, offset 0x244c0 - 0x244c2: 0x6c817820, - 0x244c4: 0x6d3be420, - 0x244e8: 0x6d2a5220, 0x244e9: 0x6c506a20, 0x244ea: 0x6cfe5420, - 0x244ed: 0x6c507020, 0x244ee: 0x6c86a220, - 0x244f1: 0x6c2d8820, 0x244f2: 0x6c444020, - 0x244fd: 0x6c58a820, - // Block 0x914, offset 0x24500 - 0x24504: 0x6c36b620, 0x24506: 0x6cf9fe20, - 0x2450b: 0x6c651820, - 0x2450c: 0x6cb67420, 0x2450d: 0x6cfa0820, 0x2450e: 0x6d1ffa20, - 0x24521: 0x6d330420, - 0x2452a: 0x6d3bf220, - 0x2452e: 0x6c163a20, - // Block 0x915, offset 0x24540 - 0x24549: 0x6d027a20, - 0x24555: 0x6ca4d620, - 0x2455d: 0x6c62ee20, 0x2455e: 0x6ce4d620, - 0x24563: 0x6d0e3220, - 0x24567: 0x6c500c20, - 0x24568: 0x6d030820, 0x24569: 0x6c8de020, 0x2456b: 0x6c047620, - 0x2456c: 0x6c081220, - 0x24571: 0x6c463e20, 0x24572: 0x6c8cc820, - 0x24575: 0x6c7df420, 0x24576: 0x6cb85e20, 0x24577: 0x6c699e20, - 0x24579: 0x6c371420, 0x2457a: 0x6d10fa20, 0x2457b: 0x6c316e20, - // Block 0x916, offset 0x24580 - 0x24581: 0x6c5d9220, 0x24582: 0x6c322420, 0x24583: 0x6cadbe20, - 0x2458c: 0x6d259820, 0x2458f: 0x6c90b820, - 0x24590: 0x6d03f820, 0x24593: 0x6c883a20, - 0x24594: 0x6d113820, 0x24595: 0x6cf6a020, 0x24596: 0x6d114420, - 0x24598: 0x6cf70020, 0x2459b: 0x6c918a20, - 0x2459d: 0x6d0f0020, - 0x245a0: 0x6cc33820, - 0x245a5: 0x6cc50020, 0x245a6: 0x6cec2020, 0x245a7: 0x6d40a420, - 0x245a8: 0x6c392e20, 0x245a9: 0x6d16c620, 0x245aa: 0x6c323c20, 0x245ab: 0x6cdc2620, - 0x245ad: 0x6caf4820, 0x245af: 0x6c4de820, - 0x245b1: 0x6d069820, 0x245b3: 0x6c45e620, - 0x245b5: 0x6c2c2e20, 0x245b7: 0x6ca32620, - 0x245be: 0x6c34ec20, 0x245bf: 0x6cebda20, - // Block 0x917, offset 0x245c0 - 0x245c2: 0x6ca81820, - 0x245c8: 0x6c2e1a20, 0x245c9: 0x6c598e20, - 0x245cc: 0x6ce32c20, 0x245cd: 0x6c395420, - 0x245d1: 0x6cf3ca20, 0x245d2: 0x6c01fe20, - 0x245d4: 0x6cb2a820, - 0x245d9: 0x6c4e1420, 0x245db: 0x6c428820, - 0x245dc: 0x6c83e820, 0x245de: 0x6c339c20, 0x245df: 0x6c400e20, - 0x245e0: 0x6ca35020, 0x245e2: 0x6c132220, - 0x245e7: 0x6c6a2820, - 0x245e9: 0x6cbed020, 0x245eb: 0x6d1bd020, - 0x245ec: 0x6cfdd220, - 0x245f1: 0x6c557c20, - 0x245f4: 0x6cdaec20, - 0x245fb: 0x6c43a420, - 0x245fc: 0x6c368820, 0x245fd: 0x6d072a20, - // Block 0x918, offset 0x24600 - 0x24606: 0x6cf6cc20, - 0x2460a: 0x6c774c20, 0x2460b: 0x6c4c8a20, - 0x2460c: 0x6c6a3620, 0x2460d: 0x6c200c20, 0x2460e: 0x6c826220, 0x2460f: 0x6c527620, - 0x24610: 0x6d41f420, - 0x24615: 0x6cb1e620, - 0x24618: 0x6c2ab420, 0x24619: 0x6cf70220, 0x2461a: 0x6c826820, - 0x2461c: 0x6ccdc620, - 0x24627: 0x6c918c20, - 0x24629: 0x6c338a20, 0x2462a: 0x6c760420, - 0x2462d: 0x6c164820, 0x2462f: 0x6d012c20, - 0x24630: 0x6cec0220, 0x24631: 0x6d30c420, 0x24633: 0x6d3b9e20, - 0x24637: 0x6c8f6020, - 0x24638: 0x6c82aa20, - 0x2463c: 0x6c273620, 0x2463d: 0x6c417820, - // Block 0x919, offset 0x24640 - 0x24644: 0x6cd34020, 0x24647: 0x6d0da420, - 0x2464c: 0x6c41b420, - 0x24650: 0x6d0d0020, - 0x24656: 0x6cdbac20, - 0x2465a: 0x6d37a620, - 0x2465c: 0x6cd34220, - 0x24661: 0x6cd15c20, - 0x24665: 0x6c15ae20, - 0x24677: 0x6c5a0820, - 0x24678: 0x6d1b8e20, 0x2467b: 0x6c9bee20, - // Block 0x91a, offset 0x24680 - 0x24682: 0x6cc4f220, - 0x24685: 0x6cfdae20, - 0x24688: 0x6c071420, - 0x2468c: 0x6c200820, - 0x24691: 0x6cb47620, - 0x24699: 0x6c77d220, 0x2469a: 0x6c7e3820, - 0x2469d: 0x6cc35020, 0x2469f: 0x6c4f9220, - 0x246a0: 0x6c1bf220, 0x246a1: 0x6c983820, - 0x246a6: 0x6d2cb020, - 0x246aa: 0x6c3bd220, - 0x246ac: 0x6c17b420, - 0x246b3: 0x6c6e1820, - // Block 0x91b, offset 0x246c0 - 0x246c3: 0x6c8ada20, - 0x246c5: 0x6ca31c20, 0x246c6: 0x6ca31e20, 0x246c7: 0x6ce72a20, - 0x246cb: 0x6cc46620, - 0x246cc: 0x6d411620, 0x246cd: 0x6caf5420, 0x246ce: 0x6d1fba20, - 0x246d0: 0x6cd4be20, - 0x246db: 0x6c8af420, - 0x246dc: 0x6cd43020, 0x246dd: 0x6ce97e20, 0x246df: 0x6c430220, - 0x246e0: 0x6ccea220, 0x246e1: 0x6ceb0420, 0x246e3: 0x6ca3f220, - 0x246e7: 0x6ceb7a20, - 0x246e8: 0x6c458220, 0x246e9: 0x6c2e1c20, - 0x246f4: 0x6c9bd020, 0x246f5: 0x6c052820, 0x246f7: 0x6d00a420, - 0x246f8: 0x6cd8b420, 0x246f9: 0x6ce6c820, 0x246fa: 0x6c4b4220, - 0x246fd: 0x6c3e8020, 0x246fe: 0x6c4b4820, - // Block 0x91c, offset 0x24700 - 0x24709: 0x6c4b4a20, - 0x24711: 0x6d3a7420, 0x24713: 0x6c7f1420, - 0x24715: 0x6c951620, 0x24716: 0x6ce50020, 0x24717: 0x6cc4c620, - 0x2471a: 0x6c300820, - 0x24728: 0x6c737220, 0x24729: 0x6d0cac20, - 0x2472c: 0x6cc84020, 0x2472d: 0x6c283a20, - 0x24730: 0x6c999e20, - 0x24736: 0x6c944020, - 0x24738: 0x6d072c20, 0x2473a: 0x6cf6a220, - // Block 0x91d, offset 0x24740 - 0x24742: 0x6c967420, 0x24743: 0x6cb52220, - 0x24745: 0x6c144820, - 0x24748: 0x6cce1e20, 0x24749: 0x6c4f0820, 0x2474a: 0x6cb2ce20, - 0x2474e: 0x6c5f3820, - 0x24753: 0x6c86a620, - 0x24755: 0x6d240c20, 0x24756: 0x6c04a420, - 0x24758: 0x6ce29220, - 0x2475d: 0x6c1de820, - 0x24760: 0x6c1dea20, - 0x24764: 0x6cb54420, 0x24765: 0x6cf70420, 0x24766: 0x6c076820, - 0x2476a: 0x6d138020, - 0x2476d: 0x6c4a1020, 0x2476f: 0x6d3b3a20, - 0x24773: 0x6c827c20, - 0x24774: 0x6c827e20, 0x24775: 0x6c13be20, - // Block 0x91e, offset 0x24780 - 0x24780: 0x6c4a1420, - 0x2478d: 0x6c2f2420, - 0x24793: 0x6d0b4420, - 0x24798: 0x6ca7fc20, 0x24799: 0x6cd4de20, 0x2479b: 0x6d363220, - 0x2479f: 0x6d36e420, - 0x247a2: 0x6d36e620, 0x247a3: 0x6cb07620, - 0x247a5: 0x6c6f4e20, 0x247a6: 0x6c6f5220, 0x247a7: 0x6d169020, - 0x247a8: 0x6d201220, 0x247aa: 0x6c6f5420, - 0x247af: 0x6c58f220, - 0x247b1: 0x6c323e20, - 0x247bb: 0x6ce20c20, - 0x247bc: 0x6cbc9e20, 0x247bd: 0x6cbd5c20, 0x247be: 0x6d032420, 0x247bf: 0x6c14bc20, - // Block 0x91f, offset 0x247c0 - 0x247c0: 0x6c61ae20, 0x247c2: 0x6cbe0a20, - 0x247ca: 0x6c324620, 0x247cb: 0x6d33aa20, - 0x247ce: 0x6cab7820, - 0x247d0: 0x6cf4c820, 0x247d2: 0x6cf18620, - 0x247d8: 0x6c096620, 0x247db: 0x6c069420, - 0x247dd: 0x6ca23c20, 0x247de: 0x6c6cf420, 0x247df: 0x6ce21220, - 0x247e0: 0x6c89e220, - 0x247e5: 0x6c127220, 0x247e6: 0x6d2c2820, - 0x247ec: 0x6c1b8e20, 0x247ed: 0x6d0ae020, 0x247ee: 0x6c7c6420, 0x247ef: 0x6d1b4420, - 0x247f8: 0x6c8f8820, 0x247f9: 0x6cb86020, 0x247fb: 0x6c4f4c20, - 0x247fc: 0x6cce5020, 0x247fd: 0x6c4d6420, 0x247fe: 0x6c139220, - // Block 0x920, offset 0x24800 - 0x24800: 0x6c68e220, 0x24801: 0x6c81ae20, - 0x24808: 0x6cf5fa20, 0x2480b: 0x6c0ef220, - 0x24813: 0x6d351a20, - 0x24815: 0x6cea8a20, 0x24816: 0x6c3e8220, - 0x24818: 0x6c54ce20, 0x2481a: 0x6ca83220, 0x2481b: 0x6d17ae20, - 0x2481c: 0x6d3c4020, - 0x24820: 0x6c13e620, - 0x24824: 0x6cdb8220, 0x24827: 0x6d283620, - 0x2482e: 0x6c325e20, - 0x24830: 0x6cf61c20, 0x24831: 0x6c203620, 0x24832: 0x6d03e820, 0x24833: 0x6c68fa20, - 0x24834: 0x6ccfea20, - // Block 0x921, offset 0x24840 - 0x24840: 0x6cedca20, 0x24841: 0x6c06a220, 0x24842: 0x6c3a3a20, 0x24843: 0x6c669c20, - 0x24844: 0x6cc30020, 0x24845: 0x6d17f020, 0x24846: 0x6c300a20, 0x24847: 0x6d06f620, - 0x24848: 0x6ca35220, 0x24849: 0x6c605a20, - 0x2484c: 0x6d31e620, 0x2484d: 0x6cb5fa20, 0x2484e: 0x6c330a20, 0x2484f: 0x6d1a7220, - 0x24851: 0x6c700420, 0x24852: 0x6caffe20, 0x24853: 0x6d033e20, - 0x24854: 0x6c94fe20, 0x24855: 0x6c113420, 0x24856: 0x6c8e2020, 0x24857: 0x6c0cac20, - 0x24858: 0x6c2a1c20, 0x24859: 0x6c2a7620, - 0x2485f: 0x6c7ed820, - 0x24861: 0x6cf65020, 0x24862: 0x6c725620, - 0x24864: 0x6cff9020, 0x24866: 0x6c6dc020, - 0x24879: 0x6cec7220, 0x2487b: 0x6ca50a20, - 0x2487c: 0x6cfd8220, 0x2487d: 0x6cc3e220, 0x2487e: 0x6cbcd420, 0x2487f: 0x6ce86a20, - // Block 0x922, offset 0x24880 - 0x24880: 0x6d064a20, 0x24881: 0x6c5bfc20, - 0x24885: 0x6c9f6c20, 0x24886: 0x6ceff220, - 0x24888: 0x6d1f5620, 0x24889: 0x6ce9ae20, 0x2488a: 0x6c278020, - 0x2488e: 0x6c786c20, 0x2488f: 0x6ca36220, - 0x24891: 0x6c401c20, 0x24892: 0x6d239620, 0x24893: 0x6d354420, - 0x24895: 0x6c4dae20, 0x24896: 0x6c002e20, 0x24897: 0x6c401e20, - 0x248a1: 0x6d0f6220, - 0x248a4: 0x6cd27e20, 0x248a6: 0x6c150c20, - 0x248aa: 0x6c1c5c20, 0x248ab: 0x6d284820, - 0x248ac: 0x6cd65a20, 0x248ae: 0x6cdb0620, 0x248af: 0x6cca8620, - 0x248b1: 0x6c368a20, 0x248b2: 0x6d332e20, 0x248b3: 0x6c004e20, - 0x248b4: 0x6cdd8c20, 0x248b5: 0x6c10b220, 0x248b7: 0x6cc45220, - 0x248b8: 0x6d185e20, 0x248b9: 0x6d0dca20, 0x248bb: 0x6ca36620, - 0x248bc: 0x6cf46a20, - // Block 0x923, offset 0x248c0 - 0x248c7: 0x6c865c20, - 0x248c8: 0x6c865e20, 0x248ca: 0x6cf6a820, 0x248cb: 0x6c749c20, - 0x248cc: 0x6cd1ea20, 0x248ce: 0x6d0b5c20, - 0x248db: 0x6c18e420, - 0x248dc: 0x6d1c8c20, 0x248dd: 0x6c0a5220, 0x248de: 0x6c184020, - 0x248e1: 0x6d2bfc20, 0x248e2: 0x6ceb9020, 0x248e3: 0x6c56c620, - 0x248e4: 0x6ce2b220, 0x248e5: 0x6d1d4c20, 0x248e6: 0x6c08f820, 0x248e7: 0x6ca91e20, - 0x248e8: 0x6c891a20, 0x248e9: 0x6d034c20, 0x248ea: 0x6d229020, - 0x248f2: 0x6c075e20, - 0x248f4: 0x6ca07820, 0x248f5: 0x6c331420, 0x248f7: 0x6c29ea20, - 0x248f8: 0x6cb64c20, - // Block 0x924, offset 0x24900 - 0x24900: 0x6cd65c20, 0x24903: 0x6cff1e20, - 0x24904: 0x6d380a20, 0x24905: 0x6d3cb220, 0x24907: 0x6c0bca20, - 0x24909: 0x6cf02a20, 0x2490a: 0x6cf6ec20, - 0x2490c: 0x6c2aae20, 0x2490e: 0x6d005620, 0x2490f: 0x6cac4620, - 0x24910: 0x6ca87a20, 0x24913: 0x6c0cfa20, - 0x24914: 0x6ccf7a20, 0x24915: 0x6c3ad820, 0x24916: 0x6c9fcc20, 0x24917: 0x6cb7e820, - 0x2492a: 0x6ccdbc20, 0x2492b: 0x6cdd9c20, - 0x24937: 0x6c60c020, - 0x2493a: 0x6c285020, 0x2493b: 0x6c739c20, - 0x2493c: 0x6c930420, 0x2493e: 0x6c02f620, - // Block 0x925, offset 0x24940 - 0x24942: 0x6d18ea20, 0x24943: 0x6cd57a20, - 0x24944: 0x6cdc9c20, 0x24945: 0x6cf0f220, 0x24946: 0x6cecec20, 0x24947: 0x6c1ef420, - 0x2494c: 0x6cf32820, - 0x24956: 0x6c0aa420, - 0x24958: 0x6d1b1a20, 0x24959: 0x6c5d8220, - 0x2495c: 0x6c769c20, 0x2495d: 0x6ca93020, - 0x24962: 0x6c00fc20, - 0x24964: 0x6c870020, 0x24966: 0x6d2d0220, - 0x24971: 0x6c933020, - 0x24976: 0x6c0bd420, 0x24977: 0x6cac8a20, - 0x2497f: 0x6c4b9c20, - // Block 0x926, offset 0x24980 - 0x24980: 0x6cda6a20, 0x24981: 0x6c9ba020, 0x24982: 0x6cfc5220, 0x24983: 0x6c906e20, - 0x24985: 0x6cb80220, - 0x2498b: 0x6c164a20, - 0x2498c: 0x6d195c20, 0x2498d: 0x6c4f8e20, 0x2498f: 0x6c88e020, - 0x24990: 0x6c49c220, 0x24992: 0x6cf06020, - 0x24997: 0x6c752020, - 0x24998: 0x6c829c20, 0x24999: 0x6c946620, 0x2499a: 0x6c87a620, - 0x2499c: 0x6cb03e20, - 0x249a2: 0x6c58e820, - 0x249ae: 0x6c4a5820, - 0x249b3: 0x6c713420, - 0x249b6: 0x6c2aa220, - 0x249ba: 0x6c3ad220, - // Block 0x927, offset 0x249c0 - 0x249c1: 0x6d338e20, 0x249c3: 0x6c9a7a20, - 0x249c5: 0x6c58f420, - 0x249c9: 0x6cabba20, 0x249ca: 0x6c08c420, - 0x249cc: 0x6cb30020, - 0x249d3: 0x6c374220, - 0x249d5: 0x6c58fc20, - 0x249e3: 0x6c170c20, - 0x249e5: 0x6c95fc20, 0x249e6: 0x6c3d2820, - 0x249ef: 0x6c1db220, - 0x249f1: 0x6d40c020, 0x249f2: 0x6ca3fe20, 0x249f3: 0x6cffae20, - 0x249f9: 0x6c044820, 0x249fa: 0x6c926620, - 0x249fc: 0x6c961220, 0x249ff: 0x6ca76620, - // Block 0x928, offset 0x24a00 - 0x24a00: 0x6d2ad020, - 0x24a04: 0x6d3b0a20, 0x24a05: 0x6c557420, - 0x24a08: 0x6c5ad820, 0x24a09: 0x6ce17c20, 0x24a0a: 0x6c1dca20, - 0x24a11: 0x6c59e020, 0x24a12: 0x6c30b820, - 0x24a1b: 0x6c9eba20, - 0x24a1d: 0x6c0f5a20, - 0x24a20: 0x6c2ca420, 0x24a22: 0x6c2ad020, 0x24a23: 0x6cb41620, - 0x24a25: 0x6cd94020, 0x24a26: 0x6c1dec20, - 0x24a2b: 0x6d123c20, - 0x24a2c: 0x6c9bf020, 0x24a2d: 0x6c8fc820, - 0x24a32: 0x6c888220, - 0x24a35: 0x6c0d0620, - 0x24a3a: 0x6c93c220, - 0x24a3f: 0x6ccba020, - // Block 0x929, offset 0x24a40 - 0x24a40: 0x6d425820, - 0x24a44: 0x6c25aa20, 0x24a45: 0x6c8de420, 0x24a46: 0x6d331a20, 0x24a47: 0x6cb05220, - 0x24a48: 0x6c05c220, 0x24a4b: 0x6cc3a420, - 0x24a4e: 0x6caf4a20, 0x24a4f: 0x6ca44220, - 0x24a50: 0x6caf4c20, 0x24a51: 0x6c0fe220, 0x24a52: 0x6c06f020, 0x24a53: 0x6c37e820, - 0x24a55: 0x6c9fa620, 0x24a56: 0x6ca0f220, 0x24a57: 0x6cec2420, - 0x24a58: 0x6d2f6020, 0x24a59: 0x6d35c220, 0x24a5a: 0x6c240c20, - 0x24a5f: 0x6d0a0620, - 0x24a60: 0x6c602020, 0x24a61: 0x6c4b4420, 0x24a63: 0x6c19ea20, - 0x24a67: 0x6c4ec620, - 0x24a68: 0x6cfff220, 0x24a69: 0x6cc3c020, 0x24a6b: 0x6c21be20, - 0x24a6d: 0x6c3f6420, - 0x24a73: 0x6cbdde20, - 0x24a74: 0x6c926820, 0x24a75: 0x6cc3d020, 0x24a76: 0x6c2d1e20, 0x24a77: 0x6cb8f020, - 0x24a7c: 0x6c16ee20, 0x24a7d: 0x6cde6220, 0x24a7e: 0x6c06ae20, - // Block 0x92a, offset 0x24a80 - 0x24a81: 0x6c326c20, 0x24a82: 0x6c082620, 0x24a83: 0x6c547820, - 0x24a88: 0x6d2c8420, 0x24a89: 0x6d2c8620, - 0x24a8e: 0x6cc3ee20, 0x24a8f: 0x6c967620, - 0x24a90: 0x6c4e2c20, 0x24a93: 0x6c8e8620, - 0x24a94: 0x6c92d020, 0x24a96: 0x6d3e8c20, - 0x24a98: 0x6cb07020, 0x24a99: 0x6d395220, 0x24a9b: 0x6d2a2420, - 0x24a9d: 0x6ca9a020, - 0x24aa0: 0x6c5c5620, 0x24aa3: 0x6d092020, - 0x24aa5: 0x6c7ea020, - 0x24aab: 0x6caa0620, - 0x24aac: 0x6d0dfa20, 0x24aad: 0x6cc4d820, 0x24aae: 0x6ca52220, - 0x24ab0: 0x6c7eb420, 0x24ab1: 0x6c4a1220, 0x24ab2: 0x6c31e220, - 0x24ab5: 0x6c919020, - 0x24ab9: 0x6c663c20, 0x24aba: 0x6d028c20, 0x24abb: 0x6cb80e20, - 0x24abe: 0x6cfe7420, - // Block 0x92b, offset 0x24ac0 - 0x24ac1: 0x6c4cb020, 0x24ac2: 0x6c6a8420, 0x24ac3: 0x6c98b620, - 0x24ac6: 0x6cf95820, 0x24ac7: 0x6c7c3620, - 0x24ace: 0x6d1e7620, - 0x24ad0: 0x6c4d3c20, 0x24ad1: 0x6c9d3220, 0x24ad2: 0x6d11fc20, - 0x24ad5: 0x6cf14c20, - 0x24adf: 0x6c85f220, - 0x24ae0: 0x6c735820, 0x24ae1: 0x6cf36420, 0x24ae2: 0x6cbbda20, - 0x24aee: 0x6c2e2a20, 0x24aef: 0x6c1f4220, - 0x24af2: 0x6cdd1c20, - 0x24af5: 0x6c1cc420, - 0x24af8: 0x6cc2a020, 0x24af9: 0x6ccf5e20, - // Block 0x92c, offset 0x24b00 - 0x24b02: 0x6c9bd820, 0x24b03: 0x6c726820, - 0x24b0b: 0x6ce8e620, - 0x24b12: 0x6ca9c020, 0x24b13: 0x6ca07a20, - 0x24b19: 0x6c3bee20, - 0x24b22: 0x6c027020, 0x24b23: 0x6c4c3e20, - 0x24b24: 0x6c55b420, 0x24b25: 0x6c11b820, 0x24b26: 0x6c33b220, 0x24b27: 0x6c4d4820, - 0x24b28: 0x6c694e20, - 0x24b30: 0x6c473a20, - 0x24b35: 0x6c6c6020, - 0x24b38: 0x6d0fe420, - // Block 0x92d, offset 0x24b40 - 0x24b40: 0x6c145020, - 0x24b4c: 0x6c5b0820, - 0x24b54: 0x6cc20c20, 0x24b55: 0x6c784420, - 0x24b5f: 0x6cbe6620, - 0x24b60: 0x6d197a20, 0x24b63: 0x6c767a20, - 0x24b64: 0x6c68b820, 0x24b67: 0x6c1d6220, - 0x24b68: 0x6c103020, 0x24b69: 0x6c44ae20, 0x24b6a: 0x6c682620, 0x24b6b: 0x6d339020, - 0x24b6e: 0x6cf20020, - 0x24b70: 0x6c0d2220, - 0x24b74: 0x6d048820, 0x24b75: 0x6c393020, - 0x24b78: 0x6d147620, 0x24b79: 0x6c203020, 0x24b7a: 0x6d11ee20, - 0x24b7d: 0x6d0f4c20, 0x24b7e: 0x6c324020, 0x24b7f: 0x6d0d4a20, - // Block 0x92e, offset 0x24b80 - 0x24b81: 0x6c9b0a20, - 0x24b87: 0x6c1a9620, - 0x24b88: 0x6ca27420, 0x24b89: 0x6c683420, 0x24b8b: 0x6caa7a20, - 0x24b8d: 0x6c4c6420, 0x24b8e: 0x6d094a20, - 0x24b91: 0x6c3e1c20, 0x24b92: 0x6d08dc20, 0x24b93: 0x6c3d4c20, - 0x24b94: 0x6cae1020, 0x24b95: 0x6ca0ea20, 0x24b96: 0x6cf5a820, 0x24b97: 0x6cf2dc20, - 0x24b98: 0x6ccd3620, 0x24b9b: 0x6cf5aa20, - 0x24b9c: 0x6cb75a20, 0x24b9d: 0x6c9e5220, - 0x24ba6: 0x6c282820, - 0x24ba8: 0x6c1e2820, - 0x24bb1: 0x6c3a9c20, 0x24bb2: 0x6c9ec820, - 0x24bb4: 0x6d095020, 0x24bb5: 0x6d06ae20, 0x24bb6: 0x6cd7dc20, 0x24bb7: 0x6c71b220, - 0x24bb8: 0x6c993420, 0x24bb9: 0x6c063e20, 0x24bbb: 0x6d14d220, - 0x24bbc: 0x6c485020, 0x24bbd: 0x6ca69220, 0x24bbf: 0x6d14d420, - // Block 0x92f, offset 0x24bc0 - 0x24bc1: 0x6d429020, - 0x24bc4: 0x6caa5420, - 0x24bd1: 0x6c2d4820, 0x24bd2: 0x6c393c20, 0x24bd3: 0x6d173a20, - 0x24bd4: 0x6cd35a20, 0x24bd7: 0x6c240e20, - 0x24bd8: 0x6d31ce20, - 0x24bde: 0x6cd36a20, 0x24bdf: 0x6c68e620, - 0x24be0: 0x6c546a20, 0x24be1: 0x6c375020, - 0x24be6: 0x6c833220, 0x24be7: 0x6d095420, - 0x24be8: 0x6c452c20, 0x24bea: 0x6cd43220, - 0x24bec: 0x6c72ec20, - 0x24bf4: 0x6c6ab820, 0x24bf5: 0x6cef0020, 0x24bf7: 0x6cd44620, - 0x24bf8: 0x6c6e7620, 0x24bfa: 0x6d061c20, 0x24bfb: 0x6c1d4c20, - // Block 0x930, offset 0x24c00 - 0x24c05: 0x6c675e20, 0x24c06: 0x6ca20a20, - 0x24c09: 0x6d231a20, - 0x24c0c: 0x6c745220, - 0x24c11: 0x6ce6ea20, - 0x24c14: 0x6cfec420, 0x24c16: 0x6c30ac20, - 0x24c18: 0x6c4c6c20, 0x24c19: 0x6c986220, 0x24c1a: 0x6cedcc20, 0x24c1b: 0x6d06de20, - 0x24c1c: 0x6cee5420, 0x24c1d: 0x6cdd2020, 0x24c1e: 0x6c736620, 0x24c1f: 0x6d26b820, - 0x24c21: 0x6c4e1620, 0x24c23: 0x6ccfec20, - 0x24c25: 0x6d00ac20, 0x24c26: 0x6c8e5a20, 0x24c27: 0x6cc8f020, - 0x24c2f: 0x6c09a620, - 0x24c32: 0x6ca53220, - 0x24c36: 0x6ced8420, 0x24c37: 0x6c700020, - 0x24c38: 0x6cc38c20, - // Block 0x931, offset 0x24c40 - 0x24c44: 0x6ca6a220, 0x24c46: 0x6c9c5220, 0x24c47: 0x6cdd2220, - 0x24c49: 0x6cbb4020, - 0x24c4c: 0x6c4ed220, 0x24c4d: 0x6d3d6c20, 0x24c4e: 0x6c9c5e20, 0x24c4f: 0x6d06f820, - 0x24c51: 0x6c810420, 0x24c52: 0x6c6aee20, 0x24c53: 0x6c2faa20, - 0x24c54: 0x6c171820, 0x24c55: 0x6d365e20, 0x24c56: 0x6c3a0c20, 0x24c57: 0x6c63cc20, - 0x24c58: 0x6c75cc20, 0x24c59: 0x6c5dde20, 0x24c5a: 0x6cb4fe20, 0x24c5b: 0x6c70a620, - 0x24c5c: 0x6d3cd420, 0x24c5e: 0x6c2d6420, 0x24c5f: 0x6c690c20, - 0x24c60: 0x6d0af220, 0x24c62: 0x6d2dfa20, - 0x24c6d: 0x6d33f220, 0x24c6f: 0x6c973620, - 0x24c70: 0x6c54da20, 0x24c71: 0x6d01ca20, 0x24c72: 0x6cd27420, 0x24c73: 0x6c4a7220, - 0x24c7f: 0x6d06fa20, - // Block 0x932, offset 0x24c80 - 0x24c82: 0x6c606a20, - 0x24c84: 0x6c20b020, 0x24c86: 0x6c99a220, 0x24c87: 0x6cc84220, - 0x24c88: 0x6d05bc20, 0x24c89: 0x6c594620, 0x24c8a: 0x6ccc6420, 0x24c8b: 0x6c71c820, - 0x24c8f: 0x6c7c0020, - 0x24c91: 0x6c542020, 0x24c92: 0x6c491e20, 0x24c93: 0x6c486a20, - 0x24c95: 0x6c9c6420, 0x24c96: 0x6c2ed020, 0x24c97: 0x6c0a0020, - 0x24c98: 0x6c899820, 0x24c99: 0x6c7e8620, 0x24c9a: 0x6ccd5220, 0x24c9b: 0x6c928c20, - 0x24c9c: 0x6cf8b420, 0x24c9f: 0x6cda2220, - 0x24cac: 0x6cab4220, 0x24cae: 0x6c838020, - 0x24cb7: 0x6c7a5020, - 0x24cb8: 0x6c4a7c20, 0x24cbb: 0x6cf67a20, - 0x24cbc: 0x6cac6c20, 0x24cbd: 0x6ccb4c20, 0x24cbe: 0x6c754e20, 0x24cbf: 0x6c53d020, - // Block 0x933, offset 0x24cc0 - 0x24cc0: 0x6c49a220, 0x24cc1: 0x6c727c20, 0x24cc3: 0x6ca3d220, - 0x24cc4: 0x6c575020, 0x24cc5: 0x6c442220, 0x24cc6: 0x6c866020, 0x24cc7: 0x6c46d020, - 0x24cc8: 0x6ce41420, 0x24cca: 0x6c96d820, 0x24ccb: 0x6ce2ae20, - 0x24ccc: 0x6c26ba20, - 0x24cd0: 0x6cb52420, 0x24cd1: 0x6d23c620, 0x24cd2: 0x6c693020, 0x24cd3: 0x6c9ee620, - 0x24cd4: 0x6c451820, 0x24cd5: 0x6c9c0e20, 0x24cd6: 0x6cf0c020, - 0x24cd8: 0x6ce36620, 0x24cd9: 0x6cb63a20, - 0x24cdc: 0x6c18e620, 0x24cdd: 0x6c30c220, 0x24cdf: 0x6cac6e20, - 0x24cf0: 0x6c4efc20, - 0x24cf4: 0x6c9d8a20, 0x24cf5: 0x6c967820, 0x24cf6: 0x6c92d220, 0x24cf7: 0x6cb53020, - 0x24cf8: 0x6c795220, 0x24cfa: 0x6c2ee820, 0x24cfb: 0x6cb7d820, - 0x24cfc: 0x6c687c20, 0x24cfd: 0x6c774e20, 0x24cfe: 0x6cbbb020, 0x24cff: 0x6c9d8c20, - // Block 0x934, offset 0x24d00 - 0x24d00: 0x6ccd0c20, - 0x24d07: 0x6c64da20, - 0x24d08: 0x6c843c20, 0x24d09: 0x6c78d620, 0x24d0a: 0x6d073c20, - 0x24d11: 0x6c977a20, 0x24d12: 0x6c3cf420, 0x24d13: 0x6c163420, - 0x24d14: 0x6c5b6420, - 0x24d27: 0x6c7a0420, - 0x24d2a: 0x6cf02c20, 0x24d2b: 0x6c49a820, - 0x24d2c: 0x6c60c220, 0x24d2d: 0x6d421c20, 0x24d2e: 0x6c5e0a20, 0x24d2f: 0x6d00fe20, - 0x24d34: 0x6cdc8420, 0x24d36: 0x6cc88220, - 0x24d38: 0x6ce28620, - 0x24d3c: 0x6d336820, 0x24d3d: 0x6c7d8820, 0x24d3e: 0x6cfe0020, 0x24d3f: 0x6c9dda20, - // Block 0x935, offset 0x24d40 - 0x24d41: 0x6cf8f020, - 0x24d4c: 0x6cc94820, - 0x24d59: 0x6c36c620, 0x24d5a: 0x6c9efe20, 0x24d5b: 0x6d3a8820, - 0x24d5c: 0x6d406c20, 0x24d5d: 0x6c9bec20, 0x24d5f: 0x6cf70620, - 0x24d61: 0x6ce14e20, 0x24d63: 0x6c645220, - 0x24d64: 0x6c16d020, 0x24d65: 0x6c60dc20, - 0x24d6e: 0x6d3dbc20, - 0x24d7f: 0x6c520420, - // Block 0x936, offset 0x24d80 - 0x24d80: 0x6c141020, 0x24d81: 0x6cb7fc20, 0x24d82: 0x6c9dea20, 0x24d83: 0x6d320220, - 0x24d84: 0x6c7a6c20, 0x24d85: 0x6d138220, 0x24d86: 0x6d38c020, - 0x24d88: 0x6c652020, 0x24d8a: 0x6cacc220, - 0x24d8d: 0x6c5b0220, 0x24d8f: 0x6ca02220, - 0x24d90: 0x6c8f5020, - 0x24d98: 0x6cd73420, 0x24d9a: 0x6c974a20, 0x24d9b: 0x6c849c20, - 0x24d9e: 0x6cd7ae20, 0x24d9f: 0x6d159020, - 0x24da4: 0x6c872c20, - 0x24da8: 0x6d005e20, 0x24da9: 0x6ce28a20, 0x24daa: 0x6d051020, - 0x24dad: 0x6d08ce20, 0x24dae: 0x6c874820, 0x24daf: 0x6c9ba220, - 0x24db0: 0x6cef6a20, 0x24db1: 0x6c9ba420, - 0x24dba: 0x6d124e20, 0x24dbb: 0x6c7ffe20, - 0x24dbc: 0x6c8da020, 0x24dbd: 0x6d1c3820, 0x24dbe: 0x6d1c3a20, 0x24dbf: 0x6c876c20, - // Block 0x937, offset 0x24dc0 - 0x24dc0: 0x6c662820, 0x24dc1: 0x6c4aaa20, - 0x24dc5: 0x6c494020, 0x24dc6: 0x6d028220, - 0x24dc9: 0x6ccf9220, 0x24dcb: 0x6d418420, - 0x24dd3: 0x6c771e20, - 0x24dd4: 0x6c82a820, - 0x24dda: 0x6c0bde20, - 0x24ddd: 0x6cd54e20, 0x24dde: 0x6caa7820, 0x24ddf: 0x6d069a20, - 0x24de3: 0x6c503020, - 0x24de8: 0x6c4af220, 0x24dea: 0x6d2d4020, 0x24deb: 0x6c80c620, - 0x24dec: 0x6c248e20, 0x24ded: 0x6d363620, 0x24dee: 0x6c3ca820, 0x24def: 0x6cbd3220, - 0x24df1: 0x6d2acc20, 0x24df2: 0x6ca35420, 0x24df3: 0x6ca99a20, - 0x24df4: 0x6d17f420, 0x24df7: 0x6c232c20, - 0x24df8: 0x6cd1e020, 0x24df9: 0x6c65c220, 0x24dfa: 0x6d3fa420, 0x24dfb: 0x6d0db820, - 0x24dfc: 0x6d1bd620, - // Block 0x938, offset 0x24e00 - 0x24e00: 0x6cc86e20, 0x24e02: 0x6cc6a420, 0x24e03: 0x6cf8cc20, - 0x24e05: 0x6c492420, 0x24e06: 0x6c769420, - 0x24e08: 0x6cf51420, 0x24e0a: 0x6cbda820, 0x24e0b: 0x6c235820, - 0x24e0d: 0x6d2b0620, 0x24e0e: 0x6d024220, - 0x24e10: 0x6d241020, 0x24e11: 0x6d29a020, 0x24e12: 0x6c206620, 0x24e13: 0x6c853c20, - 0x24e14: 0x6c853e20, 0x24e15: 0x6d075020, 0x24e16: 0x6c9c9020, 0x24e17: 0x6d075420, - 0x24e18: 0x6cc88c20, 0x24e1b: 0x6c4b9420, - 0x24e1c: 0x6cc73020, 0x24e1f: 0x6c991420, - 0x24e21: 0x6cbdbe20, 0x24e22: 0x6c24be20, 0x24e23: 0x6c24c020, - 0x24e24: 0x6c24c620, - 0x24e2e: 0x6cf35a20, - 0x24e30: 0x6c383220, 0x24e31: 0x6c037620, - 0x24e38: 0x6cb85820, 0x24e39: 0x6d35ee20, 0x24e3a: 0x6ce5d420, - // Block 0x939, offset 0x24e40 - 0x24e44: 0x6d35f020, 0x24e45: 0x6d345a20, 0x24e47: 0x6c591420, - 0x24e48: 0x6c1da420, 0x24e4a: 0x6d35f220, - 0x24e4e: 0x6d1cf020, - 0x24e52: 0x6cf4f020, 0x24e53: 0x6c06a420, - 0x24e55: 0x6c534c20, 0x24e56: 0x6cd06420, - 0x24e58: 0x6c746620, 0x24e59: 0x6c7d0420, - 0x24e5c: 0x6d15f820, 0x24e5d: 0x6d0bbe20, - 0x24e60: 0x6c087c20, - 0x24e64: 0x6c7aea20, 0x24e65: 0x6cb8f220, - 0x24e68: 0x6d2f6620, 0x24e6a: 0x6c766820, 0x24e6b: 0x6cce1220, - 0x24e6e: 0x6c01ca20, 0x24e6f: 0x6d307020, - 0x24e70: 0x6d369420, - 0x24e77: 0x6d36b620, - 0x24e79: 0x6c693220, - // Block 0x93a, offset 0x24e80 - 0x24e80: 0x6cd83020, 0x24e81: 0x6cb45c20, 0x24e82: 0x6cab9420, - 0x24e8a: 0x6d3dbe20, - 0x24e91: 0x6d1c3c20, 0x24e93: 0x6c584a20, - 0x24e95: 0x6d0b6e20, - 0x24e98: 0x6cd23c20, 0x24e99: 0x6cabb220, 0x24e9a: 0x6cb48420, - 0x24e9e: 0x6c983c20, 0x24e9f: 0x6c146220, - 0x24ea9: 0x6d278e20, - 0x24eac: 0x6c476a20, - 0x24eb9: 0x6c282a20, 0x24ebb: 0x6ca4a020, - 0x24ebd: 0x6d302620, 0x24ebf: 0x6c552c20, - // Block 0x93b, offset 0x24ec0 - 0x24ec5: 0x6c792c20, 0x24ec7: 0x6c2e8c20, - 0x24ec8: 0x6ce63c20, 0x24ecb: 0x6c48ee20, - 0x24ece: 0x6cbef020, 0x24ecf: 0x6cd2ca20, - 0x24ed0: 0x6c640c20, 0x24ed1: 0x6c02ca20, 0x24ed2: 0x6ca2f620, 0x24ed3: 0x6cb23a20, - 0x24ed4: 0x6c63b220, - 0x24ee1: 0x6d30ec20, 0x24ee2: 0x6c108620, 0x24ee3: 0x6cf2b020, - 0x24ee5: 0x6c141e20, - 0x24eea: 0x6ca4a420, 0x24eeb: 0x6c76c620, - 0x24eef: 0x6c319220, - 0x24ef0: 0x6c48f020, 0x24ef1: 0x6cbf0e20, 0x24ef3: 0x6cc66a20, - 0x24ef4: 0x6d15e820, 0x24ef5: 0x6c32fe20, 0x24ef6: 0x6c82c020, - 0x24ef8: 0x6d387a20, 0x24ef9: 0x6c7ac220, 0x24efa: 0x6c354020, 0x24efb: 0x6cfa9e20, - 0x24efc: 0x6c2d5420, 0x24efd: 0x6caaf020, 0x24efe: 0x6c361620, 0x24eff: 0x6d1d8620, - // Block 0x93c, offset 0x24f00 - 0x24f00: 0x6cf4e220, 0x24f01: 0x6c793a20, - 0x24f13: 0x6d35f420, - 0x24f17: 0x6d351c20, - 0x24f18: 0x6d0a0820, 0x24f1b: 0x6d334a20, - 0x24f1e: 0x6d0fae20, - 0x24f20: 0x6c5dc420, 0x24f21: 0x6c602220, 0x24f22: 0x6ca4f020, - 0x24f27: 0x6d0ba020, - 0x24f28: 0x6c924620, 0x24f2b: 0x6c3d7220, - 0x24f2c: 0x6cca1c20, 0x24f2d: 0x6c1f4420, 0x24f2e: 0x6cefca20, - 0x24f30: 0x6c3f6820, 0x24f31: 0x6c794020, 0x24f32: 0x6cd8c020, 0x24f33: 0x6c778620, - 0x24f35: 0x6d17b020, 0x24f36: 0x6c579a20, - 0x24f3e: 0x6d225e20, - // Block 0x93d, offset 0x24f40 - 0x24f43: 0x6c861420, - 0x24f46: 0x6c8c2020, 0x24f47: 0x6c321e20, - 0x24f48: 0x6c363c20, - 0x24f4c: 0x6cbb4220, 0x24f4d: 0x6c31a620, - 0x24f50: 0x6c6af020, 0x24f51: 0x6c21c620, 0x24f52: 0x6cfcd420, - 0x24f56: 0x6c430a20, - 0x24f6c: 0x6c2a1e20, - 0x24f70: 0x6c52b420, - 0x24f7b: 0x6d3fa620, - 0x24f7e: 0x6cb7b620, 0x24f7f: 0x6ceb3820, - // Block 0x93e, offset 0x24f80 - 0x24f80: 0x6c52b820, 0x24f81: 0x6cb06420, 0x24f82: 0x6c453c20, - 0x24f84: 0x6ca85020, 0x24f87: 0x6c798420, - 0x24f8a: 0x6d354620, - 0x24f91: 0x6cffb420, - 0x24fa1: 0x6ccf6620, 0x24fa2: 0x6d217620, 0x24fa3: 0x6c676a20, - 0x24fa9: 0x6cb70a20, 0x24faa: 0x6c190a20, 0x24fab: 0x6cca8220, - 0x24fad: 0x6cdd8e20, 0x24fae: 0x6cb9bc20, 0x24faf: 0x6c5c1a20, - 0x24fb1: 0x6ccda020, 0x24fb2: 0x6c368c20, - 0x24fbb: 0x6cbfbc20, - 0x24fbd: 0x6c78ca20, - // Block 0x93f, offset 0x24fc0 - 0x24fc0: 0x6cf23420, 0x24fc1: 0x6d3e7c20, 0x24fc2: 0x6c608e20, - 0x24fc7: 0x6c26e220, - 0x24fc9: 0x6c263620, - 0x24fcd: 0x6c90f620, 0x24fce: 0x6c775020, 0x24fcf: 0x6c7e1220, - 0x24fd0: 0x6c2b8e20, 0x24fd1: 0x6cbc7e20, 0x24fd3: 0x6ca16420, - 0x24fd6: 0x6c4cce20, 0x24fd7: 0x6c52c620, - 0x24fd8: 0x6c177c20, 0x24fd9: 0x6c522620, - 0x24fe2: 0x6c129020, 0x24fe3: 0x6d308c20, - 0x24fe6: 0x6c4bea20, - 0x24ff0: 0x6d05ec20, 0x24ff1: 0x6caece20, 0x24ff2: 0x6c74ca20, - 0x24ff5: 0x6c41ee20, 0x24ff6: 0x6cd83220, - 0x24ff8: 0x6cdc8620, 0x24ff9: 0x6cc40420, 0x24ffb: 0x6cf3f220, - 0x24ffc: 0x6d0cda20, 0x24ffd: 0x6caf1820, 0x24ffe: 0x6cffc420, 0x24fff: 0x6cac4820, - // Block 0x940, offset 0x25000 - 0x2500d: 0x6c7e9e20, - 0x25017: 0x6c085a20, - 0x25018: 0x6d320020, 0x25019: 0x6c60de20, - 0x2501c: 0x6c6cc020, 0x2501d: 0x6c887420, 0x2501e: 0x6c791220, - 0x25020: 0x6d38d620, - 0x25028: 0x6d2a9620, 0x2502a: 0x6c822e20, 0x2502b: 0x6cb54820, - 0x2502c: 0x6c0e3820, - 0x25035: 0x6d1b1c20, 0x25036: 0x6cb1f620, - 0x2503b: 0x6cda3820, - 0x2503c: 0x6c941620, 0x2503e: 0x6c2bb420, 0x2503f: 0x6c31e420, - // Block 0x941, offset 0x25040 - 0x25040: 0x6c8a8820, 0x25041: 0x6d3dd620, - 0x2504a: 0x6c16fc20, - 0x25052: 0x6c194020, 0x25053: 0x6cdee020, - 0x25059: 0x6cc41e20, 0x2505a: 0x6c2a4c20, - 0x2505d: 0x6cc51020, 0x2505f: 0x6cb3ba20, - 0x25066: 0x6d37e020, 0x25067: 0x6d006020, - 0x2506a: 0x6c679620, 0x2506b: 0x6cc21820, - 0x2506c: 0x6c831020, 0x2506d: 0x6c10f020, 0x2506e: 0x6cc39a20, - 0x25075: 0x6cfe7220, 0x25076: 0x6c836820, - 0x2507a: 0x6c809620, - 0x2507f: 0x6c7e6820, - // Block 0x942, offset 0x25080 - 0x25081: 0x6c7e6a20, - 0x25084: 0x6d24b420, - 0x2508a: 0x6c697e20, 0x2508b: 0x6cbd4e20, - 0x2508c: 0x6c5e7e20, 0x2508f: 0x6c41c820, - 0x25092: 0x6d169220, - 0x250a0: 0x6d16c820, 0x250a1: 0x6d339e20, - 0x250a4: 0x6c0c6e20, 0x250a5: 0x6cd0e620, 0x250a6: 0x6c6fd820, - 0x250ab: 0x6c509420, - 0x250ac: 0x6c3e2020, 0x250ae: 0x6c706620, - // Block 0x943, offset 0x250c0 - 0x250c0: 0x6d426620, 0x250c1: 0x6d14ac20, - 0x250c6: 0x6cfc9420, 0x250c7: 0x6d14ae20, - 0x250c9: 0x6cd8a220, 0x250cb: 0x6c20f220, - 0x250ce: 0x6ca0fa20, - 0x250e1: 0x6d2d6c20, 0x250e3: 0x6d0a0020, - 0x250e6: 0x6cc79a20, - 0x250e8: 0x6c5db020, - 0x250ec: 0x6cce6a20, - 0x250f0: 0x6cd46620, - 0x250fe: 0x6d203e20, 0x250ff: 0x6d231c20, - // Block 0x944, offset 0x25100 - 0x25102: 0x6c75b420, - 0x25109: 0x6d3e4220, 0x2510a: 0x6c925c20, - 0x2511a: 0x6c1baa20, 0x2511b: 0x6c7d6620, - 0x25120: 0x6d3ce420, - 0x25126: 0x6c541420, - 0x25129: 0x6d064420, - 0x2513e: 0x6d3f9c20, 0x2513f: 0x6d1d4220, - // Block 0x945, offset 0x25140 - 0x25142: 0x6d39b020, - 0x25145: 0x6c8f3a20, - 0x25151: 0x6caa6820, - 0x25158: 0x6c0a3020, 0x2515a: 0x6c1c5e20, - 0x2515c: 0x6d412420, 0x2515d: 0x6c3cb820, 0x2515e: 0x6c92aa20, 0x2515f: 0x6cb49220, - 0x25165: 0x6d3bdc20, 0x25167: 0x6d308020, - 0x25168: 0x6cd1ec20, 0x25169: 0x6d227e20, 0x2516a: 0x6c92ac20, 0x2516b: 0x6c896820, - 0x2516f: 0x6c74c020, - 0x25170: 0x6c8aa620, 0x25171: 0x6c080820, - // Block 0x946, offset 0x25180 - 0x25183: 0x6d18ce20, - 0x25184: 0x6c492820, - 0x2518c: 0x6c02ae20, 0x2518f: 0x6c4b8220, - 0x25190: 0x6c9fce20, 0x25192: 0x6d0dec20, 0x25193: 0x6c7fd220, - 0x25196: 0x6c0f9220, - 0x25199: 0x6d29a620, 0x2519a: 0x6d1ffe20, - 0x251a5: 0x6d194420, 0x251a6: 0x6ca66020, - 0x251ac: 0x6ca66620, 0x251ad: 0x6c4ce020, 0x251ae: 0x6c760a20, - 0x251b0: 0x6cd21820, 0x251b2: 0x6cfc5c20, - 0x251b4: 0x6cb95e20, 0x251b5: 0x6cc42020, 0x251b6: 0x6c7cc420, - // Block 0x947, offset 0x251c0 - 0x251c0: 0x6ccf1620, 0x251c2: 0x6c5dd620, - 0x251c4: 0x6ced8e20, - 0x251ca: 0x6c3af220, 0x251cb: 0x6c3b0020, - 0x251cd: 0x6d22c420, - 0x251d1: 0x6d339220, 0x251d2: 0x6c48a420, - 0x251d4: 0x6c6a8620, 0x251d5: 0x6c983e20, 0x251d6: 0x6c50cc20, - 0x251d8: 0x6d1fa820, - 0x251df: 0x6c324220, - 0x251e0: 0x6cd7d220, 0x251e2: 0x6c859420, - 0x251e5: 0x6c6a9420, 0x251e6: 0x6ca98a20, 0x251e7: 0x6c03ac20, - 0x251e8: 0x6d20de20, - 0x251ee: 0x6d33b220, - 0x251f8: 0x6c50e020, 0x251f9: 0x6c77e820, - 0x251fe: 0x6c324a20, 0x251ff: 0x6c634820, - // Block 0x948, offset 0x25200 - 0x25201: 0x6c186020, 0x25203: 0x6c20f420, - 0x25204: 0x6c50f820, 0x25205: 0x6d2d2620, - 0x2520a: 0x6c9a8c20, - 0x2520d: 0x6c50fa20, 0x2520e: 0x6d3f0420, 0x2520f: 0x6d3a0620, - 0x25212: 0x6ceb0e20, - 0x25218: 0x6d421820, 0x2521a: 0x6cc7a220, 0x2521b: 0x6c34ee20, - 0x2521c: 0x6c67e020, - 0x25227: 0x6c526420, - 0x25229: 0x6c07e620, 0x2522a: 0x6ca10820, - 0x2522f: 0x6d40ba20, - 0x25232: 0x6c0caa20, - 0x25234: 0x6c7a9820, 0x25235: 0x6c63c020, - 0x2523a: 0x6d3d0420, - 0x2523c: 0x6d04d620, - // Block 0x949, offset 0x25240 - 0x25243: 0x6c512820, - 0x25245: 0x6cbb7220, - 0x2524d: 0x6c3a5c20, 0x2524e: 0x6cd10a20, - 0x25252: 0x6d3c9620, 0x25253: 0x6c7b6a20, - 0x25254: 0x6d2b5420, 0x25255: 0x6cfaae20, 0x25257: 0x6c09d620, - 0x25258: 0x6d17f620, 0x2525a: 0x6c171a20, - 0x2526a: 0x6c999a20, - 0x25276: 0x6ced3020, - 0x2527d: 0x6cf37620, 0x2527e: 0x6c7a5220, 0x2527f: 0x6cf2be20, - // Block 0x94a, offset 0x25280 - 0x25280: 0x6d038a20, 0x25281: 0x6c781620, 0x25283: 0x6c6f8220, - 0x25284: 0x6c329c20, 0x25285: 0x6c594820, - 0x25288: 0x6d369620, 0x25289: 0x6c130620, 0x2528a: 0x6cc75a20, 0x2528b: 0x6c606e20, - 0x2528d: 0x6d131a20, - 0x2529b: 0x6c6dca20, - 0x2529c: 0x6d106220, - 0x252a1: 0x6d400220, - 0x252a9: 0x6c11d620, - 0x252b1: 0x6cd81c20, 0x252b2: 0x6c866220, 0x252b3: 0x6c47c620, - 0x252b4: 0x6c172220, 0x252b6: 0x6c3a6820, 0x252b7: 0x6c8e8a20, - 0x252b9: 0x6c6b1e20, 0x252ba: 0x6d276020, - 0x252bd: 0x6d36ba20, - // Block 0x94b, offset 0x252c0 - 0x252c0: 0x6c1dd220, 0x252c1: 0x6c0cbc20, - 0x252d2: 0x6c5f1a20, - 0x252dc: 0x6c955220, 0x252dd: 0x6c64f820, 0x252df: 0x6c206020, - 0x252e0: 0x6cd6de20, 0x252e2: 0x6c93fe20, 0x252e3: 0x6c75ea20, - 0x252e4: 0x6c69c820, 0x252e6: 0x6ce42020, 0x252e7: 0x6d2c0020, - 0x252ea: 0x6d18a820, - 0x252ec: 0x6c235a20, 0x252ed: 0x6ca57420, 0x252ee: 0x6c638220, - 0x252f4: 0x6c627c20, - 0x252fd: 0x6c00ce20, - // Block 0x94c, offset 0x25300 - 0x25307: 0x6c65d820, - 0x2530a: 0x6c07ca20, - 0x2530c: 0x6c38c620, 0x2530d: 0x6cdc8a20, 0x2530e: 0x6d421e20, - 0x25310: 0x6c42e420, 0x25311: 0x6c432420, 0x25312: 0x6c817e20, - 0x25314: 0x6d3db620, - 0x2531f: 0x6c56ca20, - 0x25322: 0x6ce9c420, - 0x25326: 0x6c0a7420, 0x25327: 0x6c716420, - 0x2532e: 0x6c575a20, - 0x25332: 0x6c1a4a20, - 0x25336: 0x6c7b4220, 0x25337: 0x6c291420, - 0x25338: 0x6c444c20, 0x25339: 0x6d011420, 0x2533b: 0x6c6b6220, - 0x2533d: 0x6c117620, - // Block 0x94d, offset 0x25340 - 0x25346: 0x6d40ec20, - 0x25348: 0x6cb46820, 0x2534b: 0x6cd57c20, - 0x2534c: 0x6c104820, - 0x25357: 0x6ca93220, - 0x25358: 0x6d0dfc20, 0x25359: 0x6d396020, 0x2535b: 0x6c9b8420, - 0x2535d: 0x6c0b5e20, 0x2535f: 0x6cfe6420, - 0x25364: 0x6c931c20, 0x25365: 0x6c849020, - 0x25369: 0x6c62ca20, 0x2536b: 0x6c9f0a20, - 0x2536c: 0x6c835620, 0x2536e: 0x6d375820, 0x2536f: 0x6d1ecc20, - 0x25370: 0x6c0b6020, - 0x25378: 0x6ca2bc20, 0x25379: 0x6cc4da20, - // Block 0x94e, offset 0x25380 - 0x25382: 0x6ca7c620, - 0x2538a: 0x6cc33a20, 0x2538b: 0x6d30c620, - 0x25390: 0x6c836620, - 0x25397: 0x6c294820, - 0x25398: 0x6c752e20, - 0x2539c: 0x6c8dc420, 0x2539e: 0x6c8de820, 0x2539f: 0x6d0d2620, - 0x253a3: 0x6d118620, - 0x253a4: 0x6d321220, 0x253a5: 0x6cb4ce20, 0x253a6: 0x6c008a20, - 0x253a8: 0x6caa3e20, 0x253a9: 0x6c988220, - 0x253b1: 0x6c76c220, 0x253b3: 0x6c6f5c20, - 0x253b4: 0x6d0d5820, 0x253b5: 0x6c9e5420, 0x253b7: 0x6d1a3e20, - 0x253b8: 0x6ceccc20, 0x253b9: 0x6d11f420, 0x253ba: 0x6cebce20, 0x253bb: 0x6cafc820, - 0x253bc: 0x6cdc2c20, - // Block 0x94f, offset 0x253c0 - 0x253c5: 0x6c799a20, - 0x253c8: 0x6c532c20, 0x253ca: 0x6ca03020, 0x253cb: 0x6c8cd220, - 0x253cc: 0x6d173e20, 0x253cd: 0x6ccfd220, 0x253cf: 0x6d429220, - 0x253db: 0x6ce85020, - 0x253dd: 0x6d1e7820, 0x253df: 0x6cec2620, - 0x253e0: 0x6c4af420, 0x253e1: 0x6c53bc20, - 0x253e5: 0x6cd36e20, 0x253e7: 0x6d049220, - 0x253e9: 0x6c000620, - 0x253f1: 0x6c19ee20, 0x253f3: 0x6c793c20, - 0x253f4: 0x6d176c20, 0x253f5: 0x6d104820, 0x253f6: 0x6ce67420, 0x253f7: 0x6c311e20, - 0x253f8: 0x6c13e820, 0x253f9: 0x6c8f3020, - 0x253fd: 0x6cc06a20, 0x253fe: 0x6d084e20, 0x253ff: 0x6ccfee20, - // Block 0x950, offset 0x25400 - 0x25400: 0x6c7b5420, 0x25401: 0x6ce7ca20, 0x25403: 0x6cba0e20, - 0x25405: 0x6c1e4220, - 0x2540a: 0x6cf1de20, - 0x2540c: 0x6c906820, 0x2540d: 0x6c018820, - 0x25414: 0x6c76d820, 0x25416: 0x6d11b020, - 0x25418: 0x6c3e8420, - 0x2541c: 0x6c084220, 0x2541d: 0x6c803020, 0x2541e: 0x6cb86c20, 0x2541f: 0x6c2d6620, - 0x25422: 0x6c69a620, 0x25423: 0x6c4a7420, - 0x25425: 0x6d049820, - 0x25428: 0x6c78bc20, - 0x25436: 0x6cfcd620, 0x25437: 0x6cf33a20, - // Block 0x951, offset 0x25440 - 0x25442: 0x6c45f620, - 0x25446: 0x6cab8620, 0x25447: 0x6c781820, - 0x2544b: 0x6c7a5420, - 0x25451: 0x6ce4be20, 0x25452: 0x6c46d420, 0x25453: 0x6c96a220, - 0x25455: 0x6c8f3e20, - 0x25459: 0x6cf0c220, 0x2545a: 0x6cf1ec20, - 0x25461: 0x6c462020, 0x25463: 0x6ce8e820, - 0x25464: 0x6ca91620, 0x25467: 0x6c9d7c20, - 0x2546b: 0x6c80e020, - 0x2546c: 0x6cba2220, 0x2546d: 0x6c977e20, 0x2546e: 0x6d308e20, - 0x25470: 0x6c57c620, 0x25471: 0x6d1db620, 0x25472: 0x6c6d5020, - 0x25474: 0x6c9aae20, 0x25477: 0x6c3ef020, - 0x2547b: 0x6cc1c220, - // Block 0x952, offset 0x25480 - 0x2548c: 0x6c8f4820, 0x2548d: 0x6c406220, 0x2548e: 0x6c28c620, - 0x25490: 0x6c460020, 0x25492: 0x6c256e20, - 0x25495: 0x6d040c20, - 0x2549c: 0x6ce87c20, 0x2549d: 0x6cd48020, - 0x254aa: 0x6cbf8420, - 0x254b3: 0x6cc6e020, - 0x254bb: 0x6c874c20, - 0x254bf: 0x6c5f9220, - // Block 0x953, offset 0x254c0 - 0x254c0: 0x6cebbc20, - 0x254cc: 0x6ce7aa20, - 0x254d2: 0x6ce04c20, - 0x254d4: 0x6c8dea20, 0x254d6: 0x6d169420, 0x254d7: 0x6cc85220, - 0x254d9: 0x6cabe220, - 0x254dd: 0x6c10e820, - 0x254e1: 0x6d269820, 0x254e2: 0x6cc3b020, 0x254e3: 0x6d3ade20, - 0x254e4: 0x6c4d6220, - 0x254f1: 0x6c381220, 0x254f2: 0x6c4d6820, - // Block 0x954, offset 0x25500 - 0x25500: 0x6c101620, 0x25501: 0x6cb25620, 0x25502: 0x6c8b0c20, - 0x2550a: 0x6c7cd420, 0x2550b: 0x6c3e9e20, - 0x2550c: 0x6ce50620, 0x2550d: 0x6cf2fc20, 0x2550f: 0x6c70aa20, - 0x25518: 0x6d318620, 0x2551a: 0x6c3ec620, - 0x25522: 0x6c8f9e20, - 0x25526: 0x6cf8ce20, 0x25527: 0x6ce4c020, - 0x2552b: 0x6c626620, - 0x2552f: 0x6d122c20, - 0x25531: 0x6c246620, - 0x25534: 0x6cad3020, 0x25535: 0x6cbce820, - 0x2553b: 0x6c8fb420, - 0x2553c: 0x6c615820, - // Block 0x955, offset 0x25540 - 0x25542: 0x6ce79a20, 0x25543: 0x6d158420, - 0x25545: 0x6c168420, - 0x2554b: 0x6c45c220, - 0x2554e: 0x6c309620, - 0x25556: 0x6cfda420, - 0x25559: 0x6ce6b620, 0x2555b: 0x6d3b7020, - 0x2555c: 0x6d15c820, 0x2555d: 0x6d170020, 0x2555e: 0x6d3ef820, 0x2555f: 0x6cb6e020, - 0x25562: 0x6c141a20, - 0x2556c: 0x6c33e220, 0x2556f: 0x6c1cbc20, - 0x25570: 0x6c922a20, 0x25571: 0x6c33ea20, 0x25573: 0x6c399220, - 0x25574: 0x6cd35c20, 0x25575: 0x6ce3e420, 0x25576: 0x6c5eaa20, 0x25577: 0x6cbfaa20, - 0x25578: 0x6cd70e20, 0x25579: 0x6c18b020, - 0x2557c: 0x6c5a6820, 0x2557d: 0x6cd41220, - // Block 0x956, offset 0x25580 - 0x25580: 0x6d279c20, - 0x25586: 0x6c8f8420, - 0x25588: 0x6c97b620, 0x25589: 0x6c464220, - 0x2558d: 0x6cfaa020, 0x2558e: 0x6ca10a20, - 0x25590: 0x6cd05e20, 0x25592: 0x6cb30820, 0x25593: 0x6d120420, - 0x25594: 0x6cc0fa20, 0x25595: 0x6cc4c020, - 0x25599: 0x6c724220, - 0x2559c: 0x6d1ada20, 0x2559d: 0x6c041020, 0x2559e: 0x6ca81c20, - 0x255a0: 0x6c1d6c20, - 0x255aa: 0x6cc67820, 0x255ab: 0x6c202020, - 0x255ac: 0x6ca83420, 0x255ad: 0x6c861620, 0x255ae: 0x6c676220, 0x255af: 0x6c77ac20, - 0x255b0: 0x6c12f020, 0x255b1: 0x6c1d5220, 0x255b2: 0x6d3b5620, 0x255b3: 0x6d3f1420, - 0x255b4: 0x6d0fb820, - 0x255bc: 0x6cf1e020, - // Block 0x957, offset 0x255c0 - 0x255cb: 0x6c620420, - 0x255cc: 0x6c620620, - 0x255d0: 0x6c93e820, 0x255d1: 0x6cc07820, 0x255d2: 0x6c33fc20, 0x255d3: 0x6c05cc20, - 0x255d4: 0x6c14ce20, 0x255d6: 0x6c0f1620, - 0x255d8: 0x6c1abe20, 0x255d9: 0x6d30fa20, 0x255da: 0x6c98b820, - 0x255dc: 0x6c621c20, 0x255dd: 0x6c9eb620, 0x255de: 0x6d262620, - 0x255e0: 0x6cf3d220, 0x255e1: 0x6d366420, 0x255e2: 0x6cb25c20, - 0x255e5: 0x6c1ccc20, - 0x255eb: 0x6c9c6020, - 0x255ec: 0x6c3a3c20, 0x255ed: 0x6c25c020, 0x255ee: 0x6c9b2420, - // Block 0x958, offset 0x25600 - 0x2560d: 0x6d1a8220, 0x2560e: 0x6c989a20, 0x2560f: 0x6c2d2420, - 0x25610: 0x6c2dd620, 0x25612: 0x6cb9b420, - 0x25615: 0x6c4f9820, 0x25616: 0x6d348620, 0x25617: 0x6c713e20, - 0x25618: 0x6ca76820, - 0x2561c: 0x6c9c6620, 0x2561d: 0x6c47b620, - 0x25623: 0x6d3b5820, - 0x25624: 0x6ca85220, 0x25625: 0x6d3d8420, 0x25627: 0x6d131c20, - 0x25628: 0x6c23dc20, 0x2562a: 0x6d05be20, - 0x2562c: 0x6cf8b820, 0x2562f: 0x6c0e8420, - 0x2563e: 0x6c11d820, - // Block 0x959, offset 0x25640 - 0x25643: 0x6d0dba20, - 0x25651: 0x6c6cb220, - 0x25654: 0x6c71ce20, 0x25655: 0x6c298620, 0x25656: 0x6c327620, - 0x25658: 0x6d128c20, 0x25659: 0x6c6ea020, 0x2565a: 0x6c78cc20, 0x2565b: 0x6c962220, - 0x2565c: 0x6cf00220, 0x2565d: 0x6ce87620, 0x2565e: 0x6d1f6020, 0x2565f: 0x6cac3020, - 0x25661: 0x6cb01020, 0x25662: 0x6c2fb820, - 0x25664: 0x6cf00420, 0x25665: 0x6c183620, 0x25666: 0x6c66bc20, - 0x25668: 0x6cd81e20, 0x25669: 0x6d3d8a20, 0x2566a: 0x6cda4020, - 0x2566c: 0x6cc87420, 0x2566e: 0x6d218420, - 0x25673: 0x6c368e20, - 0x25676: 0x6c7a7e20, - 0x25678: 0x6d3b2220, - 0x2567e: 0x6cf9e820, - // Block 0x95a, offset 0x25680 - 0x2569b: 0x6c3ef220, - 0x2569c: 0x6ce23e20, 0x2569d: 0x6cf6d020, 0x2569e: 0x6c1d8020, 0x2569f: 0x6c41ec20, - 0x256a0: 0x6c936420, 0x256a1: 0x6c131620, 0x256a2: 0x6ccdb220, 0x256a3: 0x6c8e9c20, - 0x256a5: 0x6cf8e020, 0x256a6: 0x6c5f3e20, 0x256a7: 0x6d161220, - 0x256a8: 0x6ce01220, 0x256aa: 0x6c55b620, - 0x256ad: 0x6c25c820, 0x256ae: 0x6c447820, - 0x256b0: 0x6cd3dc20, 0x256b1: 0x6ccac020, 0x256b2: 0x6c53d420, 0x256b3: 0x6cfd0e20, - 0x256b6: 0x6cf9f020, - 0x256bb: 0x6ca2ae20, - 0x256bc: 0x6cdd9620, 0x256be: 0x6d2d4c20, - // Block 0x95b, offset 0x256c0 - 0x256c0: 0x6c3d9e20, 0x256c1: 0x6ccb6220, 0x256c2: 0x6caa4620, 0x256c3: 0x6d18ac20, - 0x256e7: 0x6cbdaa20, - 0x256e8: 0x6cbedc20, - 0x256f5: 0x6c5c5a20, 0x256f6: 0x6cd6e220, 0x256f7: 0x6c284a20, - 0x256f8: 0x6cab5420, 0x256f9: 0x6ca17420, 0x256fa: 0x6cb92420, 0x256fb: 0x6c1c8020, - 0x256fc: 0x6cac0620, 0x256fd: 0x6c739620, - // Block 0x95c, offset 0x25700 - 0x25700: 0x6c178020, 0x25701: 0x6c8b3c20, 0x25702: 0x6c0db420, 0x25703: 0x6c7a0a20, - 0x25704: 0x6c28c820, 0x25705: 0x6c1dee20, 0x25706: 0x6ce70620, 0x25707: 0x6c28ca20, - 0x25708: 0x6c97ce20, 0x25709: 0x6c56ce20, 0x2570a: 0x6c8a2820, 0x2570b: 0x6cfbae20, - 0x2570d: 0x6c129820, 0x2570e: 0x6c92ea20, 0x2570f: 0x6c204220, - 0x25710: 0x6cf3f420, 0x25711: 0x6c978820, - 0x25715: 0x6d3f2420, 0x25717: 0x6c328020, - 0x2571a: 0x6cd6f220, 0x2571b: 0x6c406420, - 0x2571c: 0x6c72a620, 0x2571d: 0x6d395820, 0x2571f: 0x6c2e4220, - 0x25720: 0x6cee5a20, 0x25721: 0x6c206820, 0x25722: 0x6cb92620, 0x25723: 0x6cea1220, - 0x25725: 0x6c886420, 0x25726: 0x6c0c2e20, 0x25727: 0x6c845420, - 0x2572a: 0x6c845620, - // Block 0x95d, offset 0x25740 - 0x25746: 0x6c0a9220, 0x25747: 0x6c407620, - 0x25748: 0x6c257820, 0x25749: 0x6c318020, 0x2574b: 0x6d29a820, - 0x2574c: 0x6c8fb620, 0x2574d: 0x6d0a4a20, 0x2574e: 0x6cbf7a20, 0x2574f: 0x6c5f6e20, - 0x25750: 0x6cba2c20, 0x25752: 0x6c65fa20, 0x25753: 0x6cce9020, - 0x25754: 0x6c351e20, 0x25755: 0x6cd51620, 0x25756: 0x6c10c820, 0x25757: 0x6d05f820, - 0x25758: 0x6c304420, 0x2575a: 0x6cc49220, - 0x2575c: 0x6d0fe620, 0x2575d: 0x6cc8b420, 0x2575e: 0x6c8c7020, 0x2575f: 0x6c65fc20, - 0x25760: 0x6c2ca820, 0x25761: 0x6c3ba020, 0x25762: 0x6c2d9020, 0x25763: 0x6d41dc20, - 0x25765: 0x6ca94820, - 0x2576a: 0x6cdba020, 0x2576b: 0x6ce52420, - 0x2576c: 0x6c01da20, 0x2576f: 0x6c131c20, - 0x25770: 0x6c2fc220, 0x25771: 0x6cd02820, 0x25772: 0x6c328420, 0x25773: 0x6ce39420, - 0x25774: 0x6c695420, 0x25775: 0x6d41de20, 0x25776: 0x6d2f1020, 0x25777: 0x6c65fe20, - 0x25778: 0x6c28da20, 0x25779: 0x6c285420, 0x2577a: 0x6cd97420, - // Block 0x95e, offset 0x25780 - 0x25790: 0x6d2e2620, 0x25791: 0x6ce69620, 0x25792: 0x6d372a20, - 0x25795: 0x6d1f8220, 0x25796: 0x6cac0e20, - 0x257a1: 0x6c854220, - 0x257a4: 0x6cb9d820, 0x257a6: 0x6cdca620, 0x257a7: 0x6c71dc20, - 0x257a8: 0x6c010020, 0x257a9: 0x6c445020, 0x257aa: 0x6c72b420, 0x257ab: 0x6cea7220, - 0x257ac: 0x6c0aa620, 0x257ad: 0x6cb87e20, 0x257ae: 0x6c0fa820, 0x257af: 0x6c5c7c20, - 0x257b1: 0x6c670020, - 0x257b4: 0x6c466420, 0x257b5: 0x6cdba420, - 0x257ba: 0x6c227a20, 0x257bb: 0x6cbb5c20, - 0x257bf: 0x6d0cf420, - // Block 0x95f, offset 0x257c0 - 0x257cf: 0x6c2d9420, - 0x257d2: 0x6c9f0420, - 0x257dc: 0x6cb3b620, 0x257dd: 0x6c8e1620, 0x257de: 0x6c6b7420, 0x257df: 0x6d3b3e20, - 0x257e0: 0x6c47ee20, 0x257e3: 0x6c32aa20, - 0x257e4: 0x6d2fee20, 0x257e6: 0x6ccebe20, 0x257e7: 0x6cbdf020, - 0x257e8: 0x6c9ca420, 0x257ea: 0x6cb2e220, 0x257eb: 0x6c23c020, - 0x257ec: 0x6c1d8820, 0x257ef: 0x6cc9ae20, - 0x257f6: 0x6ce52620, - // Block 0x960, offset 0x25800 - 0x25805: 0x6c8edc20, 0x25806: 0x6c936c20, 0x25807: 0x6c91fc20, - 0x25808: 0x6d407620, - 0x2580c: 0x6c941e20, 0x2580d: 0x6c58e620, 0x2580f: 0x6ce5b420, - 0x25810: 0x6ce9d820, 0x25811: 0x6cbb5220, 0x25812: 0x6c8c8020, 0x25813: 0x6c06c220, - 0x25814: 0x6cad7620, 0x25815: 0x6d2dc420, 0x25817: 0x6c874e20, - 0x2581b: 0x6ce3b220, - 0x2581c: 0x6c560020, - 0x25822: 0x6c8b6c20, - 0x25835: 0x6c5b8020, 0x25836: 0x6cc16420, 0x25837: 0x6d086820, - 0x25839: 0x6c6ec620, 0x2583a: 0x6c2f1220, 0x2583b: 0x6cdc0820, - 0x2583d: 0x6cf11e20, 0x2583f: 0x6d0d1420, - // Block 0x961, offset 0x25840 - 0x25840: 0x6d0c4a20, 0x25841: 0x6c050e20, 0x25843: 0x6c67ce20, - 0x25844: 0x6ca66820, 0x25845: 0x6c876e20, 0x25846: 0x6c560620, 0x25847: 0x6cb80420, - 0x25848: 0x6d37e220, - 0x25851: 0x6c0acc20, - 0x25854: 0x6d220020, 0x25855: 0x6c2f1420, 0x25856: 0x6c8c8a20, 0x25857: 0x6c878c20, - 0x25858: 0x6d3de620, 0x25859: 0x6c62f020, 0x2585a: 0x6c70e620, - 0x2585c: 0x6c3c8820, 0x2585e: 0x6d248820, - 0x25868: 0x6c8b7e20, 0x25869: 0x6d28e020, 0x2586a: 0x6cb9e820, 0x2586b: 0x6c6a4620, - 0x2586c: 0x6c494220, 0x2586e: 0x6d3dee20, - 0x25871: 0x6c40a220, - 0x25879: 0x6ccba220, - 0x2587c: 0x6c248a20, - // Block 0x962, offset 0x25880 - 0x25883: 0x6c5b8220, - 0x25888: 0x6c29a620, 0x25889: 0x6c901c20, 0x2588a: 0x6d198420, - 0x25897: 0x6cc96020, - 0x25898: 0x6d274220, 0x2589a: 0x6c2bc620, - 0x258a1: 0x6c420820, 0x258a2: 0x6d295c20, 0x258a3: 0x6ccdf420, - 0x258a4: 0x6d24b020, 0x258a5: 0x6c0fde20, 0x258a7: 0x6c2f9820, - 0x258a8: 0x6c388c20, 0x258aa: 0x6d22d820, - 0x258ac: 0x6ccfc420, - 0x258b2: 0x6c457020, - 0x258b4: 0x6c9ed020, 0x258b5: 0x6cea4a20, - 0x258b8: 0x6c8af620, - // Block 0x963, offset 0x258c0 - 0x258c1: 0x6d2bd420, 0x258c2: 0x6cadbc20, - 0x258c4: 0x6c9c4a20, 0x258c6: 0x6c9ffa20, 0x258c7: 0x6c394a20, - 0x258c9: 0x6ca33620, 0x258ca: 0x6cd8b820, 0x258cb: 0x6d14ea20, - 0x258cc: 0x6c635020, 0x258cd: 0x6d3ae620, - 0x258d3: 0x6c047e20, - 0x258d4: 0x6d231e20, 0x258d6: 0x6cb35820, - 0x258da: 0x6c582820, 0x258db: 0x6c11f820, - 0x258dc: 0x6c684a20, - 0x258e0: 0x6cdfe420, - 0x258e9: 0x6d363a20, 0x258eb: 0x6c9cf420, - 0x258ec: 0x6c77ae20, - 0x258f1: 0x6d109a20, 0x258f2: 0x6c335020, 0x258f3: 0x6cc36020, - 0x258f4: 0x6c10a420, 0x258f5: 0x6c1f5420, 0x258f6: 0x6cbc2820, 0x258f7: 0x6c8e6c20, - 0x258f8: 0x6c0f1820, 0x258fa: 0x6c772e20, 0x258fb: 0x6c3bde20, - // Block 0x964, offset 0x25900 - 0x25905: 0x6c2a2020, - 0x25909: 0x6c312820, 0x2590a: 0x6c440820, - 0x25919: 0x6c8d3a20, 0x2591a: 0x6cf79420, - 0x2591c: 0x6ca6ba20, 0x2591d: 0x6d389620, 0x2591e: 0x6d389820, - 0x25923: 0x6c1d7820, - 0x25934: 0x6ca6ee20, 0x25935: 0x6c5f0c20, 0x25937: 0x6cc12420, - // Block 0x965, offset 0x25940 - 0x25944: 0x6c763e20, 0x25947: 0x6cfcfc20, - 0x25949: 0x6c516820, 0x2594b: 0x6c8bd220, - 0x2594d: 0x6d3e7e20, - 0x25951: 0x6cab8c20, 0x25952: 0x6c245620, - 0x25957: 0x6c140420, - 0x2595d: 0x6d383820, 0x2595e: 0x6c102420, - 0x25964: 0x6c1d8220, 0x25965: 0x6cf8e220, 0x25966: 0x6cc99220, 0x25967: 0x6cfb9620, - 0x25968: 0x6ccb6420, 0x25969: 0x6c9e6020, 0x2596b: 0x6c38c020, - 0x2596c: 0x6d341620, 0x2596e: 0x6c256420, - 0x25974: 0x6cfa4620, - 0x2597e: 0x6cab1420, 0x2597f: 0x6c845820, - // Block 0x966, offset 0x25980 - 0x25980: 0x6d40de20, 0x25982: 0x6c24f220, 0x25983: 0x6d2b1220, - 0x25985: 0x6c845a20, - 0x25998: 0x6cb67620, 0x2599a: 0x6d3d1020, 0x2599b: 0x6c257a20, - 0x2599c: 0x6cb41e20, 0x2599e: 0x6c38d620, 0x2599f: 0x6ce02620, - 0x259a9: 0x6d3eac20, 0x259aa: 0x6d412a20, 0x259ab: 0x6d38bc20, - 0x259ac: 0x6cc6d020, 0x259ad: 0x6c8bee20, 0x259ae: 0x6ce02820, - 0x259b6: 0x6cd3fe20, - 0x259ba: 0x6c251420, 0x259bb: 0x6d3eb820, - 0x259bc: 0x6c3db620, - // Block 0x967, offset 0x259c0 - 0x259c1: 0x6d001c20, - 0x259c8: 0x6c3c7420, - 0x259cf: 0x6cfd4220, - 0x259d0: 0x6c670c20, 0x259d2: 0x6c3c0420, - 0x259d7: 0x6c875020, - 0x259d8: 0x6ca19820, - 0x259df: 0x6d1ed020, - 0x259e5: 0x6c5e5020, 0x259e7: 0x6cc16620, - 0x259ec: 0x6ca78220, - 0x259f0: 0x6c9cbe20, 0x259f3: 0x6cb80a20, - 0x259f6: 0x6c51ae20, - 0x259f8: 0x6c893a20, - 0x259ff: 0x6d42b420, - // Block 0x968, offset 0x25a00 - 0x25a02: 0x6c8df220, - 0x25a05: 0x6d39f820, 0x25a07: 0x6ca78c20, - 0x25a0a: 0x6c612420, 0x25a0b: 0x6cc62620, - 0x25a0c: 0x6c6a9620, 0x25a0d: 0x6c41d020, - 0x25a10: 0x6d170220, 0x25a13: 0x6d38ce20, - 0x25a15: 0x6cf4ca20, - 0x25a1a: 0x6c44fe20, 0x25a1b: 0x6c243220, - 0x25a1d: 0x6c9ed220, - 0x25a21: 0x6d0a0220, 0x25a23: 0x6d33cc20, - 0x25a24: 0x6cff7620, 0x25a27: 0x6c3e3a20, - 0x25a28: 0x6c553620, - 0x25a2c: 0x6c2b1e20, 0x25a2e: 0x6c741820, 0x25a2f: 0x6c2e1220, - 0x25a39: 0x6cd44420, - 0x25a3c: 0x6cee0a20, - // Block 0x969, offset 0x25a40 - 0x25a43: 0x6ca33820, - 0x25a44: 0x6c2b2620, 0x25a45: 0x6cd37020, 0x25a46: 0x6c224020, 0x25a47: 0x6cd4d220, - 0x25a49: 0x6cec2c20, 0x25a4a: 0x6c181820, 0x25a4b: 0x6c389820, - 0x25a4d: 0x6c470820, 0x25a4e: 0x6d24e620, - 0x25a51: 0x6c491420, - 0x25a5a: 0x6cbcbc20, - 0x25a5c: 0x6d2de820, 0x25a5d: 0x6c276020, 0x25a5e: 0x6cceee20, - 0x25a66: 0x6d388820, 0x25a67: 0x6cfde420, - 0x25a68: 0x6ca00020, 0x25a69: 0x6d3f5020, 0x25a6a: 0x6c599620, 0x25a6b: 0x6c9c5420, - 0x25a6d: 0x6cf88c20, 0x25a6e: 0x6d363c20, 0x25a6f: 0x6cac2820, - 0x25a70: 0x6c349420, - 0x25a74: 0x6c22c820, 0x25a75: 0x6ca1d420, 0x25a77: 0x6c17be20, - 0x25a79: 0x6d17b620, 0x25a7a: 0x6c464820, - // Block 0x96a, offset 0x25a80 - 0x25a87: 0x6c6dba20, - 0x25a93: 0x6d2b8020, - 0x25a94: 0x6cb25e20, 0x25a95: 0x6d130420, 0x25a96: 0x6c6af420, - 0x25a98: 0x6caf7620, 0x25a9b: 0x6ccbfe20, - 0x25a9c: 0x6d3c4420, 0x25a9d: 0x6c6f1e20, - 0x25aa0: 0x6c8e6e20, 0x25aa1: 0x6d227020, 0x25aa3: 0x6c70ac20, - 0x25aa8: 0x6caafe20, - 0x25ab8: 0x6c999c20, - // Block 0x96b, offset 0x25ac0 - 0x25ac4: 0x6c187420, 0x25ac6: 0x6d3bd420, 0x25ac7: 0x6ca76a20, - 0x25ac8: 0x6c79aa20, 0x25ac9: 0x6c6a2e20, 0x25aca: 0x6c57b020, - 0x25acd: 0x6d02e220, 0x25ace: 0x6d424a20, 0x25acf: 0x6d0e9620, - 0x25ad0: 0x6c748220, - 0x25ad5: 0x6c54ea20, 0x25ad6: 0x6d393a20, 0x25ad7: 0x6ccf6a20, - 0x25ad9: 0x6d0dbc20, 0x25adb: 0x6d01de20, - 0x25adc: 0x6c2ed420, 0x25adf: 0x6c187a20, - 0x25af2: 0x6c65c620, 0x25af3: 0x6c624c20, - 0x25af6: 0x6c21ce20, 0x25af7: 0x6c537420, - // Block 0x96c, offset 0x25b00 - 0x25b00: 0x6c26bc20, - 0x25b04: 0x6c764020, 0x25b05: 0x6d039820, 0x25b06: 0x6c5c1c20, 0x25b07: 0x6c65d020, - 0x25b08: 0x6d394820, 0x25b09: 0x6d2c8c20, 0x25b0a: 0x6c403820, 0x25b0b: 0x6c1c6020, - 0x25b0c: 0x6c082e20, 0x25b0d: 0x6cab0a20, - 0x25b11: 0x6c626820, 0x25b12: 0x6cb9c020, - 0x25b14: 0x6ced9620, 0x25b15: 0x6cab6a20, 0x25b16: 0x6c0a3220, 0x25b17: 0x6cd79c20, - 0x25b20: 0x6c6dd020, 0x25b21: 0x6d132e20, - // Block 0x96d, offset 0x25b40 - 0x25b44: 0x6c3a7220, 0x25b47: 0x6c844420, - 0x25b4a: 0x6c868020, 0x25b4b: 0x6cb01e20, - 0x25b52: 0x6cdc7a20, 0x25b53: 0x6c8e9e20, - 0x25b54: 0x6c517220, 0x25b55: 0x6c5d1420, 0x25b56: 0x6ce07a20, 0x25b57: 0x6cd79e20, - 0x25b58: 0x6d36ec20, 0x25b59: 0x6c0f5c20, - 0x25b5d: 0x6cf8e420, - 0x25b61: 0x6cb33620, 0x25b62: 0x6cc45c20, - 0x25b64: 0x6ca2b020, - 0x25b7d: 0x6d1db820, - // Block 0x96e, offset 0x25b80 - 0x25b82: 0x6c279620, - 0x25b8a: 0x6cb72220, 0x25b8b: 0x6c2e0220, - 0x25b8c: 0x6ca87c20, 0x25b8d: 0x6cd6e420, 0x25b8f: 0x6cce8c20, - 0x25b90: 0x6c7dc420, 0x25b91: 0x6cdc9020, 0x25b93: 0x6c30ca20, - 0x25b94: 0x6c2ef220, - 0x25b9c: 0x6c45ba20, - 0x25baf: 0x6d3bb020, - 0x25bb0: 0x6c4c8c20, - 0x25bbc: 0x6d05fa20, 0x25bbd: 0x6cc1e820, - // Block 0x96f, offset 0x25bc0 - 0x25bc0: 0x6d0a4c20, 0x25bc3: 0x6c689a20, - 0x25bc4: 0x6d30aa20, 0x25bc6: 0x6c2d9220, 0x25bc7: 0x6cca7620, - 0x25bc8: 0x6c080c20, 0x25bca: 0x6cdda620, 0x25bcb: 0x6cba2e20, - 0x25bcf: 0x6d05fc20, - 0x25bd1: 0x6d0a4e20, - 0x25bd4: 0x6ca17a20, - 0x25bf5: 0x6cdca820, 0x25bf6: 0x6c7ea820, 0x25bf7: 0x6d3a8a20, - 0x25bf8: 0x6d396420, 0x25bfa: 0x6c870820, - 0x25bfc: 0x6c280e20, 0x25bfd: 0x6c717820, 0x25bff: 0x6d286e20, - // Block 0x970, offset 0x25c00 - 0x25c00: 0x6c15fc20, 0x25c01: 0x6c956020, - 0x25c04: 0x6ccb8220, 0x25c06: 0x6c888620, - 0x25c08: 0x6d414e20, 0x25c0b: 0x6c7f7020, - 0x25c0c: 0x6cd6ec20, 0x25c0d: 0x6cbcfe20, - 0x25c18: 0x6c30ce20, - 0x25c1e: 0x6cf54a20, 0x25c1f: 0x6c9b9020, - 0x25c21: 0x6c62ce20, - 0x25c24: 0x6c1aee20, 0x25c26: 0x6ca65c20, - 0x25c38: 0x6d116e20, 0x25c3b: 0x6c7ec020, - 0x25c3e: 0x6c942020, - // Block 0x971, offset 0x25c40 - 0x25c40: 0x6cdcbe20, 0x25c41: 0x6c3dbe20, - 0x25c44: 0x6c830420, 0x25c45: 0x6cf05820, - 0x25c4e: 0x6c237820, - 0x25c54: 0x6c877020, 0x25c56: 0x6cb22820, - 0x25c58: 0x6c759020, 0x25c59: 0x6c71e420, 0x25c5b: 0x6c7ecc20, - 0x25c67: 0x6c62f220, - 0x25c6a: 0x6c9f1a20, - 0x25c6c: 0x6d125020, 0x25c6d: 0x6c0b2620, - 0x25c71: 0x6c23d420, 0x25c72: 0x6cd85e20, - 0x25c75: 0x6cd86020, - 0x25c78: 0x6c51b020, - // Block 0x972, offset 0x25c80 - 0x25c83: 0x6ca48820, - 0x25c85: 0x6c2f2620, - 0x25c88: 0x6c180220, 0x25c89: 0x6d282220, 0x25c8b: 0x6d052220, - 0x25c8c: 0x6cd4c220, 0x25c8e: 0x6c15b020, 0x25c8f: 0x6c9f4c20, - 0x25c90: 0x6c87fe20, 0x25c91: 0x6d19e620, 0x25c92: 0x6d037620, 0x25c93: 0x6cee9020, - 0x25c94: 0x6c479020, 0x25c95: 0x6ce7f020, 0x25c96: 0x6cddf620, 0x25c97: 0x6c3a5e20, - 0x25c98: 0x6c265420, 0x25c99: 0x6ca84620, 0x25c9a: 0x6c244820, 0x25c9b: 0x6d426e20, - 0x25c9c: 0x6c6b2020, 0x25c9d: 0x6d08b020, 0x25c9e: 0x6c0f5e20, 0x25c9f: 0x6c6c5e20, - 0x25ca0: 0x6d1b1220, 0x25ca1: 0x6d05f020, 0x25ca3: 0x6d20e420, - 0x25ca4: 0x6d048c20, 0x25ca6: 0x6cb76c20, 0x25ca7: 0x6c069620, - 0x25ca8: 0x6d03dc20, 0x25ca9: 0x6c45ec20, - 0x25cac: 0x6d418c20, - 0x25cb0: 0x6c6a1a20, 0x25cb2: 0x6c763020, - 0x25cb5: 0x6d03f020, 0x25cb6: 0x6c06b220, 0x25cb7: 0x6cd4ee20, - 0x25cb8: 0x6d23a020, 0x25cba: 0x6d38ee20, 0x25cbb: 0x6d2e0420, - // Block 0x973, offset 0x25cc0 - 0x25cc2: 0x6d37c620, - 0x25cc6: 0x6c140620, - 0x25cc8: 0x6c20e020, 0x25cc9: 0x6c8f4220, - 0x25cce: 0x6cdbdc20, - 0x25cd0: 0x6d3a8620, - 0x25cd9: 0x6c0bd220, - 0x25cdd: 0x6d035420, 0x25cdf: 0x6d0bce20, - 0x25ce2: 0x6c8daa20, - 0x25ce7: 0x6d0bd220, - 0x25cec: 0x6ce63020, - 0x25cf9: 0x6c2b5a20, - // Block 0x974, offset 0x25d00 - 0x25d01: 0x6cafca20, 0x25d02: 0x6c567620, 0x25d03: 0x6c132a20, - 0x25d0a: 0x6ce45e20, 0x25d0b: 0x6ca20220, - 0x25d0c: 0x6c731620, 0x25d0e: 0x6ca20420, - 0x25d10: 0x6c723020, 0x25d11: 0x6c8f0020, 0x25d13: 0x6c8e0c20, - 0x25d17: 0x6c8f0220, - 0x25d18: 0x6c568820, - 0x25d26: 0x6c3e3e20, 0x25d27: 0x6c553820, - 0x25d2a: 0x6c361820, 0x25d2b: 0x6c458420, - 0x25d2c: 0x6c470a20, - 0x25d31: 0x6c48b420, - 0x25d39: 0x6c94a420, 0x25d3b: 0x6c389a20, - 0x25d3c: 0x6c93e220, 0x25d3d: 0x6c9b1820, 0x25d3e: 0x6c3e8a20, 0x25d3f: 0x6c8e5e20, - // Block 0x975, offset 0x25d40 - 0x25d45: 0x6d00c220, 0x25d46: 0x6c471e20, - 0x25d48: 0x6cfcda20, 0x25d49: 0x6c0f1a20, 0x25d4b: 0x6c622220, - 0x25d53: 0x6cc2a220, - 0x25d54: 0x6c927220, - 0x25d5e: 0x6cd79420, - 0x25d61: 0x6ca20820, 0x25d62: 0x6d23a420, 0x25d63: 0x6c4eea20, - 0x25d69: 0x6d26d020, 0x25d6a: 0x6c289e20, - 0x25d6f: 0x6d218620, - 0x25d70: 0x6c64de20, 0x25d73: 0x6c429020, - 0x25d7f: 0x6c129420, - // Block 0x976, offset 0x25d80 - 0x25d80: 0x6cd0c820, 0x25d81: 0x6c8f1c20, - 0x25d86: 0x6c687e20, - 0x25d89: 0x6cdb2020, 0x25d8a: 0x6cdb2220, 0x25d8b: 0x6d383e20, - 0x25d92: 0x6c8aaa20, - 0x25d94: 0x6d085c20, 0x25d95: 0x6c92ee20, 0x25d97: 0x6c629e20, - 0x25d9a: 0x6d0cdc20, - 0x25d9f: 0x6c930820, - 0x25da1: 0x6c9fd220, 0x25da2: 0x6ce39620, - 0x25da6: 0x6c595c20, - 0x25da9: 0x6d18ec20, 0x25daa: 0x6ce08220, - 0x25dac: 0x6cf48820, - 0x25db0: 0x6c5f8020, - 0x25db7: 0x6c31e620, - 0x25db8: 0x6c7d9420, 0x25dba: 0x6c758e20, - 0x25dbf: 0x6cd21a20, - // Block 0x977, offset 0x25dc0 - 0x25dc0: 0x6ca44e20, 0x25dc1: 0x6cb3bc20, - 0x25dc4: 0x6cd52020, 0x25dc5: 0x6cc37e20, - 0x25dcc: 0x6cc5bc20, 0x25dcf: 0x6c3b6220, - 0x25dd2: 0x6cde3a20, 0x25dd3: 0x6cea4820, - 0x25dd5: 0x6d0f9c20, - 0x25de6: 0x6c342c20, 0x25de7: 0x6c21fc20, - 0x25de9: 0x6c478020, 0x25dea: 0x6c3b6e20, - 0x25ded: 0x6cc74620, - 0x25df1: 0x6c42c020, 0x25df2: 0x6cfdbe20, - 0x25df4: 0x6cfdc020, 0x25df5: 0x6c545420, 0x25df7: 0x6ce1c420, - 0x25df8: 0x6ccd8420, 0x25df9: 0x6d0fba20, 0x25dfa: 0x6d3f5220, - 0x25dfc: 0x6d256a20, - // Block 0x978, offset 0x25e00 - 0x25e04: 0x6cda7420, 0x25e07: 0x6c203820, - 0x25e08: 0x6cfdc820, 0x25e0a: 0x6c048a20, - 0x25e0c: 0x6c97c020, 0x25e0e: 0x6c3f6e20, 0x25e0f: 0x6c7e6420, - 0x25e10: 0x6c851e20, 0x25e12: 0x6c6af620, 0x25e13: 0x6d1ea820, - 0x25e18: 0x6d23a620, 0x25e1a: 0x6c1c4820, - 0x25e1c: 0x6c203a20, 0x25e1d: 0x6d182e20, 0x25e1e: 0x6ccd0020, - 0x25e22: 0x6c609220, 0x25e23: 0x6d0c2820, - 0x25e26: 0x6cf51820, 0x25e27: 0x6c215c20, - 0x25e28: 0x6c987420, - 0x25e2d: 0x6c3ede20, 0x25e2e: 0x6c637c20, 0x25e2f: 0x6c46d620, - 0x25e30: 0x6c474420, 0x25e31: 0x6c63e420, - 0x25e35: 0x6cfb9820, 0x25e37: 0x6c6d6020, - 0x25e38: 0x6d3f6420, 0x25e39: 0x6c90bc20, - 0x25e3c: 0x6c46da20, - // Block 0x979, offset 0x25e40 - 0x25e40: 0x6cc57c20, 0x25e42: 0x6ccd1420, - 0x25e45: 0x6c74da20, 0x25e46: 0x6ce79c20, 0x25e47: 0x6d1ffc20, - 0x25e54: 0x6c651a20, 0x25e55: 0x6c31dc20, 0x25e57: 0x6c55f020, - 0x25e5b: 0x6ccace20, - 0x25e5c: 0x6d246220, - 0x25e62: 0x6c974e20, - 0x25e64: 0x6d342620, 0x25e65: 0x6d0c4420, 0x25e66: 0x6c42f020, - 0x25e68: 0x6c582020, - 0x25e6e: 0x6cc34420, - 0x25e71: 0x6d103e20, 0x25e73: 0x6d418820, - 0x25e77: 0x6cfe8e20, - 0x25e78: 0x6d170620, 0x25e79: 0x6d0d5a20, 0x25e7a: 0x6c531e20, 0x25e7b: 0x6d20e620, - 0x25e7f: 0x6c1c0020, - // Block 0x97a, offset 0x25e80 - 0x25e81: 0x6c1b1020, - 0x25e84: 0x6c4f6a20, 0x25e85: 0x6ccb1e20, 0x25e86: 0x6cabbe20, 0x25e87: 0x6cde4020, - 0x25e88: 0x6c3b2620, 0x25e89: 0x6c1aa020, - 0x25e8c: 0x6c533220, 0x25e8d: 0x6d095220, - 0x25e96: 0x6d351e20, - 0x25e9b: 0x6cc19020, - 0x25ea0: 0x6cf5fe20, 0x25ea1: 0x6c3e6220, 0x25ea3: 0x6cd4e020, - 0x25ea4: 0x6c4d6a20, 0x25ea6: 0x6cb38c20, - 0x25ea8: 0x6c229a20, - 0x25eb0: 0x6c149a20, 0x25eb3: 0x6c52ae20, - 0x25eb8: 0x6cad7a20, 0x25eb9: 0x6ccff820, 0x25eba: 0x6cfede20, - 0x25ebd: 0x6d07ac20, 0x25ebe: 0x6c229e20, 0x25ebf: 0x6ce68420, - // Block 0x97b, offset 0x25ec0 - 0x25ec0: 0x6cb39620, - 0x25ec7: 0x6cde7e20, - 0x25ec8: 0x6c13a820, 0x25ecb: 0x6d40ce20, - 0x25ecc: 0x6c5de820, 0x25ecd: 0x6d071820, 0x25ece: 0x6d0e9820, 0x25ecf: 0x6c149e20, - 0x25ed1: 0x6ceb3420, - 0x25ed8: 0x6cfb8420, 0x25ed9: 0x6d07c620, 0x25eda: 0x6c542a20, 0x25edb: 0x6c58de20, - 0x25edc: 0x6c442620, 0x25edd: 0x6c1d3c20, 0x25ede: 0x6c0a3620, 0x25edf: 0x6c52bc20, - 0x25ee0: 0x6c52be20, 0x25ee1: 0x6c1b4a20, 0x25ee3: 0x6c140820, - 0x25eef: 0x6d2c8e20, - 0x25ef1: 0x6d2d1e20, 0x25ef2: 0x6cdea220, - 0x25ef5: 0x6cb3a220, 0x25ef6: 0x6cdea420, - 0x25ef8: 0x6d1f6e20, 0x25ef9: 0x6c3ef420, 0x25efa: 0x6c220e20, 0x25efb: 0x6c26be20, - 0x25efc: 0x6cde1a20, 0x25efe: 0x6c8ea020, - // Block 0x97c, offset 0x25f00 - 0x25f01: 0x6c221020, 0x25f03: 0x6c52d420, - 0x25f05: 0x6c4f1a20, 0x25f06: 0x6c7e5020, - 0x25f08: 0x6cd20420, - 0x25f0d: 0x6ce79e20, 0x25f0e: 0x6c5c7020, 0x25f0f: 0x6c518620, - 0x25f10: 0x6cb1d820, 0x25f11: 0x6d243a20, - 0x25f1c: 0x6cfaf020, 0x25f1d: 0x6c4e6c20, 0x25f1f: 0x6cb3ac20, - 0x25f26: 0x6c7ec220, 0x25f27: 0x6c5e5220, - 0x25f30: 0x6cdf8420, - 0x25f34: 0x6c819e20, 0x25f36: 0x6cd5b420, - 0x25f3a: 0x6c2a0a20, 0x25f3b: 0x6c2d1020, - // Block 0x97d, offset 0x25f40 - 0x25f48: 0x6d04a820, 0x25f4b: 0x6cee6020, - 0x25f4d: 0x6c17f820, 0x25f4e: 0x6ca3ae20, - 0x25f50: 0x6c73d420, 0x25f53: 0x6c375220, - 0x25f54: 0x6c375a20, 0x25f55: 0x6caa6c20, 0x25f56: 0x6caa8820, - 0x25f5d: 0x6d3bae20, - 0x25f62: 0x6cab2220, - 0x25f64: 0x6c8ac220, 0x25f65: 0x6c82b420, 0x25f67: 0x6c032a20, - 0x25f6c: 0x6c196820, 0x25f6f: 0x6c4a6a20, - 0x25f70: 0x6cc2f820, 0x25f71: 0x6c448820, 0x25f73: 0x6c45ee20, - 0x25f74: 0x6ccee020, - 0x25f79: 0x6c7f2020, 0x25f7a: 0x6d32e820, 0x25f7b: 0x6d183020, - 0x25f7c: 0x6c4bda20, 0x25f7d: 0x6ceea620, 0x25f7e: 0x6c951e20, - // Block 0x97e, offset 0x25f80 - 0x25f82: 0x6cd28620, 0x25f83: 0x6d1be820, - 0x25f84: 0x6cd14620, 0x25f85: 0x6ce8ea20, 0x25f86: 0x6c0a3820, - 0x25f88: 0x6d2aee20, 0x25f89: 0x6d383a20, 0x25f8b: 0x6cc72620, - 0x25f8c: 0x6cb64e20, 0x25f8d: 0x6c405620, 0x25f8e: 0x6c131820, - 0x25f93: 0x6c845c20, - 0x25f94: 0x6c978c20, 0x25f96: 0x6c886620, 0x25f97: 0x6c0c3020, - 0x25f9b: 0x6c207e20, - 0x25f9c: 0x6d18ee20, - 0x25fa0: 0x6cac3620, - 0x25fa5: 0x6d191420, 0x25fa6: 0x6c7b4820, - 0x25fa9: 0x6c0c5220, 0x25fab: 0x6c1c9e20, - 0x25fac: 0x6cc22020, 0x25fad: 0x6ca1ae20, 0x25fae: 0x6d301620, 0x25faf: 0x6ccc3c20, - 0x25fb0: 0x6ccc3e20, - 0x25fb7: 0x6d109620, - 0x25fb8: 0x6c457420, 0x25fb9: 0x6ca3b620, - 0x25fbc: 0x6d018420, 0x25fbf: 0x6ce53220, - // Block 0x97f, offset 0x25fc0 - 0x25fc6: 0x6d127820, - 0x25fc9: 0x6ccbe220, - 0x25fcf: 0x6ccaec20, - 0x25fd2: 0x6c2cc620, 0x25fd3: 0x6d06c220, - 0x25fd9: 0x6cc19220, - 0x25fe0: 0x6c52b020, 0x25fe1: 0x6cd16620, 0x25fe2: 0x6ce6ec20, - 0x25ff0: 0x6c352e20, - 0x25ff5: 0x6c89ea20, 0x25ff7: 0x6c53c220, - 0x25ff8: 0x6c852020, 0x25ffa: 0x6cfdee20, - 0x25ffd: 0x6cd0b620, - // Block 0x980, offset 0x26000 - 0x26000: 0x6c3d8220, - 0x26008: 0x6d0dc020, 0x26009: 0x6cee3220, 0x2600a: 0x6cb51620, 0x2600b: 0x6c34a620, - 0x2600d: 0x6c57b220, 0x2600e: 0x6cb90c20, - 0x26010: 0x6d01e020, - 0x2601d: 0x6c22d620, 0x2601e: 0x6cd11020, - 0x26022: 0x6c37dc20, - 0x26024: 0x6d039a20, 0x26026: 0x6cea0e20, 0x26027: 0x6d0ea220, - 0x26029: 0x6c8b2820, - 0x2602c: 0x6c9c6e20, - 0x26038: 0x6d402c20, 0x2603a: 0x6d3e8020, - 0x2603c: 0x6c55ba20, 0x2603d: 0x6d1c9e20, 0x2603e: 0x6c885620, 0x2603f: 0x6c266a20, - // Block 0x981, offset 0x26040 - 0x26040: 0x6ce4c420, 0x26041: 0x6ce53e20, - 0x2604b: 0x6cc6b020, - 0x2604d: 0x6c00d020, - 0x26050: 0x6c00e420, 0x26051: 0x6d309e20, 0x26052: 0x6c4c4620, 0x26053: 0x6c92f020, - 0x26054: 0x6d2f7a20, 0x26055: 0x6c9c8220, 0x26056: 0x6c8a2a20, 0x26057: 0x6d30a020, - 0x2605b: 0x6cc25020, - 0x2605c: 0x6c236820, 0x2605f: 0x6ce65020, - 0x26061: 0x6ce02c20, 0x26062: 0x6d2e2820, 0x26063: 0x6c55e020, - 0x26065: 0x6cb1da20, 0x26067: 0x6c267020, - 0x26068: 0x6cc6d220, - 0x2606e: 0x6ca52020, - 0x26073: 0x6ca45a20, - 0x26074: 0x6c291a20, 0x26075: 0x6c695c20, - 0x2607b: 0x6c72b620, - 0x2607c: 0x6c37ac20, - // Block 0x982, offset 0x26080 - 0x2608a: 0x6c877420, - 0x2608c: 0x6c4c4e20, 0x2608d: 0x6cec7e20, - 0x26092: 0x6ca7ee20, - 0x26094: 0x6c6c3420, - 0x260a9: 0x6cb04a20, 0x260aa: 0x6c1bde20, - 0x260b2: 0x6cb04c20, 0x260b3: 0x6d166e20, - 0x260b4: 0x6c316220, 0x260b5: 0x6cec1420, 0x260b6: 0x6d099020, - 0x260b8: 0x6cb73c20, 0x260b9: 0x6ccd6c20, - 0x260bc: 0x6d056a20, 0x260bf: 0x6c509020, - // Block 0x983, offset 0x260c0 - 0x260c0: 0x6caca620, 0x260c2: 0x6cadb420, - 0x260c4: 0x6d045a20, 0x260c6: 0x6c1b7e20, 0x260c7: 0x6cdf9020, - 0x260c8: 0x6d41a620, 0x260c9: 0x6d414820, 0x260ca: 0x6cb74c20, 0x260cb: 0x6c316420, - 0x260d9: 0x6cd70c20, - 0x260dc: 0x6ca2f220, 0x260dd: 0x6cf59620, - 0x260e7: 0x6c179420, - 0x260e8: 0x6d16d020, 0x260eb: 0x6d329e20, - 0x260ee: 0x6c70fe20, 0x260ef: 0x6c274c20, - 0x260f1: 0x6cc9fc20, - 0x260f4: 0x6d3ac820, 0x260f5: 0x6ced7620, - 0x260f8: 0x6cc9fe20, 0x260f9: 0x6c04f220, 0x260fa: 0x6c643c20, 0x260fb: 0x6c972c20, - // Block 0x984, offset 0x26100 - 0x26108: 0x6ceb9c20, 0x2610a: 0x6cb76020, - 0x2610f: 0x6d3c0c20, - 0x26110: 0x6ceb0220, 0x26113: 0x6cb28c20, - 0x2611d: 0x6cae6220, 0x2611e: 0x6c7b9a20, 0x2611f: 0x6d14d820, - 0x26121: 0x6d018620, 0x26122: 0x6d264c20, 0x26123: 0x6c523020, - 0x26125: 0x6c53f220, 0x26126: 0x6d32a420, 0x26127: 0x6c217420, - 0x26128: 0x6cd35e20, 0x26129: 0x6cec1c20, 0x2612b: 0x6d009620, - 0x26138: 0x6c452a20, - // Block 0x985, offset 0x26140 - 0x26145: 0x6c35fe20, - 0x2614f: 0x6c7a7220, - 0x26150: 0x6ca32c20, 0x26153: 0x6c707420, - 0x26154: 0x6d088e20, 0x26155: 0x6cc0fe20, 0x26156: 0x6c181c20, 0x26157: 0x6c939620, - 0x26158: 0x6c511420, 0x26159: 0x6cd16020, 0x2615a: 0x6ca44620, - 0x2615c: 0x6c511620, 0x2615d: 0x6c13de20, 0x2615e: 0x6d0bfe20, 0x2615f: 0x6c450a20, - 0x26160: 0x6ca81e20, 0x26162: 0x6c4c6a20, 0x26163: 0x6d0c8c20, - 0x26164: 0x6c494e20, 0x26167: 0x6d360420, - 0x26168: 0x6c81f420, - 0x2616f: 0x6c321820, - 0x26170: 0x6cb78220, 0x26171: 0x6cc10020, 0x26172: 0x6c742e20, - // Block 0x986, offset 0x26180 - 0x26181: 0x6c3c4220, 0x26183: 0x6d06c420, - 0x26184: 0x6ce9fc20, 0x26186: 0x6c4e1820, 0x26187: 0x6c7a4220, - 0x2618a: 0x6ccff020, 0x2618b: 0x6d363e20, - 0x2618d: 0x6cad2c20, 0x2618e: 0x6d32cc20, 0x2618f: 0x6c861820, - 0x26190: 0x6ced2620, 0x26192: 0x6c391020, 0x26193: 0x6d033a20, - 0x26196: 0x6d0bb620, - 0x2619b: 0x6c709820, - 0x2619c: 0x6cd0a620, - 0x261ad: 0x6c989020, 0x261af: 0x6cea7e20, - 0x261b0: 0x6d3d6620, 0x261b1: 0x6cf62820, 0x261b2: 0x6d1b5820, 0x261b3: 0x6c6db620, - 0x261b4: 0x6cea5420, 0x261b7: 0x6c453220, - 0x261b8: 0x6c620a20, - // Block 0x987, offset 0x261c0 - 0x261cf: 0x6d3ba820, - 0x261d2: 0x6ce5f220, - 0x261d4: 0x6d33e220, 0x261d6: 0x6c604420, - 0x261da: 0x6d1c8220, 0x261db: 0x6cf0aa20, - 0x261dd: 0x6c593c20, 0x261de: 0x6ce68620, 0x261df: 0x6c150620, - 0x261e2: 0x6c7c8e20, 0x261e3: 0x6cb86e20, - 0x261e4: 0x6c04fc20, 0x261e5: 0x6c13a420, 0x261e6: 0x6ceb8420, 0x261e7: 0x6ca43020, - 0x261e8: 0x6c6a2420, 0x261ea: 0x6d0c1620, - 0x261ec: 0x6ce8ca20, 0x261ee: 0x6cf1e620, - 0x261f0: 0x6c232020, 0x261f3: 0x6d06fc20, - 0x261f4: 0x6d1b6020, 0x261f7: 0x6c084420, - 0x261fc: 0x6c935820, - // Block 0x988, offset 0x26200 - 0x26201: 0x6d290620, 0x26202: 0x6c265820, - 0x26206: 0x6ca84820, 0x26207: 0x6c71c220, - 0x26208: 0x6c541620, - 0x2620c: 0x6c453a20, - 0x26215: 0x6c541820, 0x26216: 0x6c76b220, 0x26217: 0x6c459620, - 0x26219: 0x6c5b5e20, 0x2621a: 0x6d01e220, - 0x2621d: 0x6cf8ba20, 0x2621e: 0x6c4e2420, 0x2621f: 0x6c9c6820, - 0x26221: 0x6cf25c20, 0x26222: 0x6c5d3620, 0x26223: 0x6ccabc20, - 0x26224: 0x6d034220, 0x26225: 0x6d307220, 0x26226: 0x6c5dea20, - 0x26228: 0x6c45a020, 0x2622b: 0x6cc9e420, - 0x2622c: 0x6c6c4a20, 0x2622d: 0x6cebec20, - 0x26231: 0x6c332420, 0x26232: 0x6c1aca20, - 0x2623d: 0x6cf67e20, - // Block 0x989, offset 0x26240 - 0x26242: 0x6c9c6a20, 0x26243: 0x6d29e020, - 0x26244: 0x6cca8420, - 0x26253: 0x6cea5e20, - 0x26254: 0x6d366820, 0x26255: 0x6cf1ea20, - 0x26258: 0x6d1a9820, 0x26259: 0x6cea8220, 0x2625b: 0x6c1cda20, - 0x2625c: 0x6d2af020, 0x2625e: 0x6cff0a20, 0x2625f: 0x6ca07420, - 0x26260: 0x6c245820, 0x26263: 0x6c0b4e20, - 0x26264: 0x6d04f020, 0x26267: 0x6d154c20, - 0x2626e: 0x6c5a6020, - 0x26270: 0x6d2bf820, 0x26271: 0x6cdd3620, 0x26272: 0x6c5cfe20, 0x26273: 0x6c727e20, - // Block 0x98a, offset 0x26280 - 0x26281: 0x6c245a20, - 0x26284: 0x6c5f4020, 0x26285: 0x6d0a4420, 0x26286: 0x6cdcfe20, 0x26287: 0x6c135e20, - 0x26289: 0x6d18b020, - 0x2628e: 0x6c0c2220, - 0x26292: 0x6c74c220, 0x26293: 0x6c868220, - 0x26296: 0x6cad9a20, - 0x2629b: 0x6d289c20, - 0x2629c: 0x6d134220, 0x2629e: 0x6c0a5a20, 0x2629f: 0x6d310020, - 0x262a0: 0x6d310220, 0x262a2: 0x6c702420, 0x262a3: 0x6d309020, - 0x262a6: 0x6cd60e20, - 0x262aa: 0x6cf6d620, - 0x262b7: 0x6d065820, - 0x262b8: 0x6ca3a620, 0x262b9: 0x6cfb9a20, 0x262ba: 0x6c4bec20, 0x262bb: 0x6cf0d220, - 0x262be: 0x6c60c420, 0x262bf: 0x6cc9a220, - // Block 0x98b, offset 0x262c0 - 0x262c2: 0x6c304220, 0x262c3: 0x6caac820, - 0x262c4: 0x6c327a20, 0x262c5: 0x6d32fc20, 0x262c6: 0x6c7a6420, - 0x262c9: 0x6ca01c20, - 0x262d5: 0x6c05d820, 0x262d6: 0x6c5c5020, - 0x262d9: 0x6d3fc620, - 0x262e8: 0x6cca5c20, 0x262ea: 0x6ce29420, 0x262eb: 0x6d157220, - 0x262ed: 0x6d241620, - 0x262f1: 0x6d123220, 0x262f2: 0x6ca94a20, - 0x262f4: 0x6c1dfa20, 0x262f5: 0x6c5d4820, 0x262f7: 0x6c337620, - 0x262f9: 0x6cb7f220, 0x262fa: 0x6d1d1820, 0x262fb: 0x6c0e3420, - 0x262fc: 0x6ca92e20, 0x262fd: 0x6c5a1a20, - // Block 0x98c, offset 0x26300 - 0x26306: 0x6d1d1a20, - 0x2630a: 0x6c05da20, - 0x2630e: 0x6c4a2820, 0x2630f: 0x6c82f620, - 0x26310: 0x6d421020, - 0x26319: 0x6c15fe20, - 0x26323: 0x6c660a20, - 0x26327: 0x6c9b9220, - 0x26329: 0x6d002820, - 0x2632f: 0x6d035620, - 0x26331: 0x6c849e20, - 0x2633a: 0x6cbc2e20, - 0x2633f: 0x6cf05c20, - // Block 0x98d, offset 0x26340 - 0x26340: 0x6ca37620, 0x26342: 0x6cacee20, - 0x26344: 0x6c829020, 0x26347: 0x6c958220, - 0x2634b: 0x6c946220, - 0x2634d: 0x6c44ea20, 0x2634f: 0x6c946420, - 0x26352: 0x6cc22220, - 0x26356: 0x6c959020, - 0x26358: 0x6ca46820, 0x2635b: 0x6c959220, - 0x2635c: 0x6d273e20, - 0x26362: 0x6cd71a20, - 0x26365: 0x6c9d3e20, 0x26366: 0x6cede820, 0x26367: 0x6c12f420, - 0x26368: 0x6c64a620, 0x26369: 0x6cee2020, - 0x2636f: 0x6c637e20, - 0x26374: 0x6c58c020, - 0x26378: 0x6c894220, 0x26379: 0x6d3f2c20, 0x2637a: 0x6c040a20, 0x2637b: 0x6cd43c20, - 0x2637e: 0x6cecf220, - // Block 0x98e, offset 0x26380 - 0x26382: 0x6cd4c420, - 0x26387: 0x6c4a4e20, - 0x26388: 0x6cf5cc20, 0x2638a: 0x6cc79c20, 0x2638b: 0x6d11fe20, - 0x2638e: 0x6c42c220, - 0x26395: 0x6d26d220, - 0x26398: 0x6d1da820, 0x26399: 0x6cec3c20, 0x2639a: 0x6c0f4620, - 0x2639f: 0x6d034e20, - 0x263a2: 0x6cb0c620, 0x263a3: 0x6c0f7820, - 0x263a6: 0x6c4d7e20, 0x263a7: 0x6d2d5220, - 0x263a8: 0x6cf33020, 0x263aa: 0x6d138420, 0x263ab: 0x6c0ab820, - 0x263ac: 0x6c4d8620, - 0x263b8: 0x6c1c0220, 0x263bb: 0x6d360620, - 0x263bd: 0x6ca5dc20, - // Block 0x98f, offset 0x263c0 - 0x263c1: 0x6cf3d420, 0x263c2: 0x6c006e20, - 0x263c8: 0x6c006a20, 0x263c9: 0x6d229220, 0x263ca: 0x6c1c7020, - 0x263cd: 0x6c6eac20, 0x263ce: 0x6d371020, 0x263cf: 0x6d372c20, - 0x263d0: 0x6d372e20, 0x263d1: 0x6c70ee20, - 0x263d6: 0x6c4dd820, - 0x263da: 0x6cb24c20, - 0x263dd: 0x6d11a620, - 0x263e3: 0x6d1f1e20, - 0x263e4: 0x6cb25420, 0x263e6: 0x6ca11020, - 0x263ec: 0x6d429e20, 0x263ed: 0x6cb38e20, 0x263ef: 0x6d091220, - 0x263f0: 0x6c7bc420, 0x263f1: 0x6d17bc20, 0x263f2: 0x6cb39020, - 0x263fb: 0x6d3c9c20, - // Block 0x990, offset 0x26400 - 0x26403: 0x6ca5fa20, - 0x26404: 0x6cc0b020, 0x26405: 0x6c23f820, - 0x2640c: 0x6d11cc20, - 0x26411: 0x6c3b9820, - 0x26415: 0x6cf9f420, 0x26417: 0x6c677c20, - 0x26418: 0x6c13b220, 0x2641b: 0x6d000e20, - 0x2641c: 0x6c13b420, - 0x26422: 0x6c1a5020, 0x26423: 0x6c257e20, - 0x26427: 0x6cbf7c20, - 0x26429: 0x6d245220, 0x2642b: 0x6d21d820, - 0x2642f: 0x6cf21620, - 0x26431: 0x6c13c020, 0x26432: 0x6d22ae20, - 0x26439: 0x6d425420, 0x2643a: 0x6c29fc20, - 0x2643d: 0x6c73a820, 0x2643e: 0x6c29fe20, 0x2643f: 0x6d1c4c20, - // Block 0x991, offset 0x26440 - 0x26441: 0x6c3cd420, - 0x26445: 0x6cf27a20, - 0x26448: 0x6c6cf620, 0x26449: 0x6cb76e20, 0x2644b: 0x6cbe0e20, - 0x2644d: 0x6c7dee20, 0x2644f: 0x6cdf9e20, - 0x26450: 0x6cfa9420, 0x26452: 0x6ce46420, - 0x26454: 0x6c7df620, 0x26456: 0x6ce53a20, - 0x26458: 0x6c556420, 0x26459: 0x6d39aa20, 0x2645a: 0x6d2d7620, 0x2645b: 0x6cde5820, - 0x2645d: 0x6ce46e20, 0x2645e: 0x6cde6820, 0x2645f: 0x6cde8020, - 0x26460: 0x6c574820, 0x26461: 0x6d0dc220, 0x26462: 0x6ce61620, - 0x26464: 0x6ce61820, 0x26465: 0x6cde8220, - 0x2646c: 0x6c581020, 0x2646e: 0x6c63e620, 0x2646f: 0x6cb7e020, - 0x26471: 0x6cdeae20, - 0x26474: 0x6cdfc220, 0x26475: 0x6c57ce20, - 0x26478: 0x6d3bf620, 0x26479: 0x6c572220, - 0x2647c: 0x6c800c20, - // Block 0x992, offset 0x26480 - 0x26486: 0x6d420420, 0x26487: 0x6d169820, - 0x26488: 0x6c3dfe20, 0x26489: 0x6cf4bc20, 0x2648b: 0x6c3e0020, - 0x2648d: 0x6c2f5620, 0x2648e: 0x6cde3c20, - 0x26496: 0x6c17b820, - 0x26499: 0x6cc64220, 0x2649a: 0x6cc35620, - 0x2649c: 0x6c438420, - 0x264a1: 0x6c3e6620, 0x264a2: 0x6c2c4c20, 0x264a3: 0x6c2dc620, - 0x264a4: 0x6d1e3020, 0x264a6: 0x6c643e20, - 0x264a9: 0x6c8f8e20, - 0x264ac: 0x6d1e3220, 0x264ad: 0x6cafe020, 0x264af: 0x6c5d7820, - 0x264b0: 0x6cbf3020, 0x264b2: 0x6c38a020, 0x264b3: 0x6cf3d620, - 0x264b4: 0x6ce74e20, 0x264b5: 0x6c4f7e20, - 0x264b8: 0x6cdfac20, - 0x264be: 0x6c525020, - // Block 0x993, offset 0x264c0 - 0x264c4: 0x6ce56220, - 0x264c8: 0x6d388e20, 0x264cb: 0x6c045420, - 0x264cc: 0x6d01e420, 0x264cd: 0x6c29c620, 0x264cf: 0x6c6c4c20, - 0x264d5: 0x6c54ec20, 0x264d6: 0x6c06b620, - 0x264d8: 0x6c2fb220, - 0x264dc: 0x6caac420, 0x264dd: 0x6cf0c620, 0x264de: 0x6d218c20, - 0x264e0: 0x6d039c20, 0x264e1: 0x6c3ee020, 0x264e2: 0x6cfd0020, 0x264e3: 0x6cb7c420, - 0x264e4: 0x6ce87820, 0x264e7: 0x6c609420, - 0x264e9: 0x6d1d4620, 0x264eb: 0x6c2ae420, - 0x264ec: 0x6ceeb020, 0x264ed: 0x6cf6ae20, 0x264ef: 0x6cac0220, - 0x264f1: 0x6cd12020, 0x264f2: 0x6d1fec20, - 0x264f4: 0x6c005220, 0x264f5: 0x6c66d220, 0x264f7: 0x6c466020, - 0x264f8: 0x6cc93020, - 0x264fc: 0x6c462220, 0x264ff: 0x6ccc6e20, - // Block 0x994, offset 0x26500 - 0x26500: 0x6ce13a20, - 0x26507: 0x6c92f220, - 0x26508: 0x6c027820, 0x2650a: 0x6cb7ee20, 0x2650b: 0x6d04fc20, - 0x2650d: 0x6c271020, - 0x26511: 0x6c382a20, 0x26512: 0x6cf0f420, - 0x26514: 0x6c341020, 0x26515: 0x6c8a3a20, 0x26516: 0x6c386620, 0x26517: 0x6c5a1c20, - 0x26518: 0x6c74dc20, 0x26519: 0x6cdec020, 0x2651a: 0x6d422020, 0x2651b: 0x6cc53020, - 0x2651c: 0x6c117a20, 0x2651d: 0x6ce2c020, - 0x26520: 0x6c57d020, 0x26521: 0x6d05fe20, 0x26523: 0x6d2dae20, - 0x26527: 0x6c41f420, - 0x2652a: 0x6caeea20, 0x2652b: 0x6c118020, - 0x2652c: 0x6d005820, 0x2652d: 0x6c26d020, - 0x26531: 0x6c62d020, - 0x26536: 0x6c854820, - 0x26539: 0x6cac9020, - 0x2653d: 0x6c8ffa20, 0x2653e: 0x6c877620, 0x2653f: 0x6cf7c220, - // Block 0x995, offset 0x26540 - 0x26540: 0x6ce2d620, 0x26543: 0x6c8dac20, - 0x26548: 0x6c855820, 0x26549: 0x6cc4a220, 0x2654a: 0x6c8df420, - 0x2654e: 0x6c4bca20, - 0x26554: 0x6cb30a20, 0x26555: 0x6ca11220, 0x26556: 0x6cabf020, - 0x26559: 0x6c03b420, - 0x26561: 0x6cb62820, - 0x26564: 0x6d0cc420, - 0x2656a: 0x6cec3e20, 0x2656b: 0x6c020c20, - 0x2656d: 0x6ca04a20, 0x2656e: 0x6c9fca20, 0x2656f: 0x6d0ab220, - 0x26570: 0x6c9b9420, 0x26573: 0x6c48d620, - 0x26576: 0x6c682420, - 0x2657b: 0x6c410a20, - // Block 0x996, offset 0x26580 - 0x26581: 0x6c110a20, 0x26582: 0x6cf4ac20, 0x26583: 0x6d301820, - 0x26584: 0x6cc58820, 0x26585: 0x6c79b420, - 0x26594: 0x6d2f8a20, 0x26595: 0x6d37a220, 0x26596: 0x6cc00a20, 0x26597: 0x6c4c1420, - 0x26598: 0x6c456a20, 0x26599: 0x6cb40220, 0x2659a: 0x6c566c20, 0x2659b: 0x6c9e0820, - 0x2659e: 0x6ce45a20, - 0x265a3: 0x6cee0020, - 0x265b8: 0x6d3a0020, 0x265b9: 0x6c268a20, 0x265ba: 0x6d048e20, 0x265bb: 0x6ca2d420, - 0x265be: 0x6c72de20, - // Block 0x997, offset 0x265c0 - 0x265c1: 0x6ca71a20, - 0x265c8: 0x6c567820, 0x265c9: 0x6ccbd420, - 0x265dc: 0x6d33b820, 0x265df: 0x6cdde420, - 0x265e1: 0x6cd7d820, - 0x265e5: 0x6d170820, - 0x265ed: 0x6cbf1020, 0x265ee: 0x6d35c820, 0x265ef: 0x6c939220, - 0x265f0: 0x6cc79e20, 0x265f2: 0x6cb5ac20, 0x265f3: 0x6d224020, - 0x265f4: 0x6d386a20, 0x265f5: 0x6d0fa620, 0x265f6: 0x6cfc0420, 0x265f7: 0x6ca1cc20, - 0x265f8: 0x6c1d9a20, 0x265f9: 0x6c5aa820, 0x265fa: 0x6c6f6420, 0x265fb: 0x6c6fec20, - 0x265fc: 0x6cb19220, - // Block 0x998, offset 0x26600 - 0x26601: 0x6c699220, 0x26603: 0x6c48c620, - 0x26605: 0x6ca0fe20, - 0x26610: 0x6cf5ce20, 0x26611: 0x6cb43220, - 0x2662f: 0x6c61d420, - 0x26636: 0x6cf1da20, 0x26637: 0x6c071620, - 0x26638: 0x6d15ea20, 0x26639: 0x6c3e6a20, 0x2663a: 0x6cd7e420, 0x2663b: 0x6c72f020, - 0x2663c: 0x6c61f620, 0x2663e: 0x6ca69a20, - // Block 0x999, offset 0x26640 - 0x26640: 0x6c07b620, - 0x26645: 0x6d06c620, - 0x26648: 0x6cbdd220, 0x26649: 0x6c0ef820, - 0x2664c: 0x6cede620, 0x2664d: 0x6d30f620, 0x2664f: 0x6cf2e620, - 0x26650: 0x6ccea420, 0x26651: 0x6d2a8020, 0x26652: 0x6d101820, - 0x26655: 0x6cd98a20, 0x26656: 0x6ca82020, - 0x2665b: 0x6c098620, - 0x26663: 0x6c242420, - 0x26664: 0x6cbab220, - 0x2666a: 0x6cffe620, 0x2666b: 0x6d33d620, - 0x2666c: 0x6ccf1020, 0x2666f: 0x6d360820, - 0x26670: 0x6cae7020, - // Block 0x99a, offset 0x26680 - 0x2668f: 0x6c2e1e20, - 0x26696: 0x6cf2f820, - 0x26698: 0x6d352020, 0x26699: 0x6c098820, 0x2669b: 0x6c3b7020, - 0x266a5: 0x6c052a20, - 0x266aa: 0x6cc06c20, 0x266ab: 0x6ca63a20, - 0x266ac: 0x6c0f0620, 0x266ad: 0x6c33f220, 0x266af: 0x6cd2d020, - 0x266b0: 0x6d05a220, 0x266b1: 0x6c16ac20, 0x266b2: 0x6d05a420, 0x266b3: 0x6d128020, - 0x266b4: 0x6c9c5620, - 0x266b8: 0x6d02d620, 0x266b9: 0x6d3d6820, 0x266ba: 0x6c3ff620, - 0x266bd: 0x6cb06020, 0x266be: 0x6d095e20, - // Block 0x99b, offset 0x266c0 - 0x266c0: 0x6d235020, 0x266c1: 0x6cfb6020, 0x266c2: 0x6d235220, 0x266c3: 0x6d213420, - 0x266c5: 0x6c709a20, 0x266c6: 0x6cddec20, 0x266c7: 0x6c797c20, - 0x266ca: 0x6d32ce20, 0x266cb: 0x6c9b1a20, - 0x266cc: 0x6c428420, - 0x266d2: 0x6ca28a20, 0x266d3: 0x6cf7ea20, - 0x266d4: 0x6c09aa20, 0x266d6: 0x6c3ff820, - 0x266dc: 0x6cfff420, - 0x266e0: 0x6c6f7620, 0x266e3: 0x6c468820, - 0x266f0: 0x6c1b2820, 0x266f1: 0x6c6f7820, 0x266f2: 0x6c6f7a20, - 0x266f5: 0x6ccbf820, 0x266f7: 0x6c3a0820, - // Block 0x99c, offset 0x26700 - 0x2672b: 0x6c3e8c20, - 0x2672f: 0x6ced8a20, - 0x26730: 0x6d05a620, 0x26731: 0x6c0e7620, - // Block 0x99d, offset 0x26740 - 0x26741: 0x6c504820, 0x26743: 0x6d00c420, - 0x26744: 0x6cb11820, 0x26745: 0x6d227420, 0x26747: 0x6ce4ae20, - 0x26748: 0x6cb00020, 0x2674a: 0x6cd2d220, 0x2674b: 0x6c7afc20, - 0x2674c: 0x6c5ef020, 0x2674f: 0x6d2be420, - 0x26750: 0x6ca3cc20, 0x26751: 0x6ca20620, 0x26753: 0x6c3ea620, - 0x26754: 0x6c326820, 0x26757: 0x6cd13e20, - 0x26758: 0x6c13ee20, 0x2675a: 0x6c1b3820, 0x2675b: 0x6c4b0820, - 0x2675c: 0x6c9f6620, 0x2675d: 0x6ce0c220, 0x2675e: 0x6c044c20, 0x2675f: 0x6cbac220, - 0x26761: 0x6d3d7420, 0x26762: 0x6cf0ac20, 0x26763: 0x6d0a1e20, - 0x26765: 0x6c9e9620, 0x26766: 0x6d290820, 0x26767: 0x6d1f4a20, - 0x26769: 0x6d204c20, 0x2676b: 0x6cccee20, - 0x2676c: 0x6c514220, 0x2676d: 0x6c93a220, 0x2676e: 0x6d347820, - 0x26772: 0x6c6e9020, 0x26773: 0x6d317020, - 0x26776: 0x6c9b2620, 0x26777: 0x6d1f4c20, - 0x26779: 0x6cf30020, 0x2677a: 0x6c038620, - 0x2677d: 0x6c737820, 0x2677e: 0x6cc7b220, 0x2677f: 0x6c23f220, - // Block 0x99e, offset 0x26780 - 0x26780: 0x6d33fc20, - 0x26789: 0x6c557620, 0x2678a: 0x6d0f5c20, - 0x2678c: 0x6c75d020, 0x2678d: 0x6ccf1c20, 0x2678e: 0x6c79f220, - 0x26791: 0x6cb9a820, - 0x26794: 0x6c9b2820, - 0x2679a: 0x6ce58c20, - // Block 0x99f, offset 0x267c0 - 0x267d0: 0x6ca84a20, - 0x267df: 0x6c1b3a20, - 0x267e1: 0x6d047220, 0x267e3: 0x6c5d3820, - 0x267e6: 0x6c2b8020, 0x267e7: 0x6c80d620, - 0x267e9: 0x6d2a1a20, 0x267ea: 0x6c130a20, 0x267eb: 0x6cdd8420, - 0x267ec: 0x6d412c20, 0x267ed: 0x6cdbd020, 0x267ef: 0x6cf9e020, - 0x267f1: 0x6d01e620, - 0x267f4: 0x6c6b1220, 0x267f5: 0x6d1f5820, 0x267f7: 0x6c46ca20, - 0x267f8: 0x6c451620, - 0x267fc: 0x6c75d820, 0x267fd: 0x6c5a5e20, 0x267fe: 0x6c607420, 0x267ff: 0x6cb3ca20, - // Block 0x9a0, offset 0x26800 - 0x26800: 0x6cf37820, 0x26802: 0x6d183420, - 0x26805: 0x6ca3a420, 0x26807: 0x6cc71820, - 0x26808: 0x6ca40820, 0x2680a: 0x6cb2c020, 0x2680b: 0x6ccd9420, - 0x2680c: 0x6c2dd820, 0x2680d: 0x6c607620, 0x2680e: 0x6c571420, 0x2680f: 0x6c335620, - 0x26810: 0x6c79a020, 0x26811: 0x6cde8620, 0x26813: 0x6c53c620, - 0x26815: 0x6cd4f820, - 0x26819: 0x6c526a20, 0x2681a: 0x6c3bc020, - 0x26832: 0x6c79fa20, - // Block 0x9a1, offset 0x26840 - 0x26859: 0x6ca70220, - 0x2685d: 0x6c1e9e20, - 0x26866: 0x6cbb5a20, - 0x26872: 0x6cf8bc20, 0x26873: 0x6c558020, - 0x26874: 0x6cd99620, 0x26875: 0x6cf30a20, 0x26877: 0x6c4d7620, - 0x26878: 0x6cc7b820, 0x26879: 0x6c9b3020, 0x2687b: 0x6cca2420, - 0x2687d: 0x6cf3de20, 0x2687f: 0x6d1f6420, - // Block 0x9a2, offset 0x26880 - 0x26881: 0x6cdfba20, 0x26882: 0x6cd01220, - 0x26886: 0x6cb71220, - 0x26888: 0x6c4c8420, 0x26889: 0x6cb87420, 0x2688a: 0x6cfad020, - 0x2688f: 0x6cdbd620, - 0x26890: 0x6c92b020, 0x26893: 0x6cb52620, - 0x26894: 0x6c2ddc20, 0x26897: 0x6cb64020, - 0x26898: 0x6c63dc20, 0x26899: 0x6d1f6620, 0x2689a: 0x6cf79e20, 0x2689b: 0x6c177a20, - 0x268a1: 0x6c9d7e20, 0x268a2: 0x6c911820, 0x268a3: 0x6c08f220, - 0x268aa: 0x6cadec20, - 0x268ae: 0x6d318e20, 0x268af: 0x6cd01420, - 0x268b0: 0x6c15da20, 0x268b1: 0x6c403a20, - 0x268b6: 0x6cc13820, 0x268b7: 0x6cd82220, - 0x268ba: 0x6d417a20, - // Block 0x9a3, offset 0x268c0 - 0x268eb: 0x6d2fd620, - 0x268fd: 0x6cb01220, - // Block 0x9a4, offset 0x26900 - 0x26900: 0x6c23fa20, - 0x26906: 0x6c42e220, 0x26907: 0x6c31b620, - 0x26909: 0x6c3da420, 0x2690a: 0x6c492620, 0x2690b: 0x6ccae620, - 0x2690c: 0x6cda2a20, 0x2690d: 0x6c65da20, 0x2690e: 0x6cb3e020, - 0x26910: 0x6c11ac20, 0x26911: 0x6c085020, 0x26912: 0x6ca20c20, 0x26913: 0x6d2f7420, - 0x26914: 0x6cff9a20, 0x26916: 0x6c715c20, 0x26917: 0x6cd50620, - 0x26918: 0x6c65dc20, 0x26919: 0x6c844e20, 0x2691b: 0x6c203e20, - 0x2691c: 0x6c81e220, 0x2691e: 0x6c51ea20, 0x2691f: 0x6c55bc20, - 0x26920: 0x6c473220, 0x26921: 0x6d2f0c20, 0x26922: 0x6c6b3620, 0x26923: 0x6cfe5620, - 0x26925: 0x6c317820, 0x26926: 0x6c4e3220, 0x26927: 0x6c63e820, - 0x26928: 0x6cfe5820, 0x26929: 0x6c60ae20, 0x2692a: 0x6cd56c20, 0x2692b: 0x6c812e20, - 0x2692c: 0x6c5f4220, 0x2692d: 0x6ccd0e20, - 0x26930: 0x6ce1ee20, 0x26931: 0x6d3e8e20, 0x26932: 0x6cd69620, - 0x26934: 0x6c60b020, 0x26935: 0x6c1f7820, 0x26936: 0x6c628020, 0x26937: 0x6cd01c20, - 0x26938: 0x6c8c6820, 0x26939: 0x6c8a2020, 0x2693b: 0x6cca2a20, - 0x2693d: 0x6c019220, 0x2693e: 0x6cc87c20, - // Block 0x9a5, offset 0x26940 - 0x26940: 0x6ce37820, 0x26941: 0x6c28b820, 0x26943: 0x6c589c20, - 0x26945: 0x6cc99420, - // Block 0x9a6, offset 0x26980 - 0x26986: 0x6cc8a420, 0x26987: 0x6cf38020, - 0x26988: 0x6c729620, 0x26989: 0x6c589e20, 0x2698a: 0x6c838620, 0x2698b: 0x6c92dc20, - 0x2698e: 0x6cdfbe20, 0x2698f: 0x6d2b9620, - 0x26993: 0x6cb9ca20, - 0x26997: 0x6cf6d820, - 0x269a1: 0x6c22a220, 0x269a2: 0x6ccf2620, - 0x269a7: 0x6cc99620, - 0x269aa: 0x6c99bc20, 0x269ab: 0x6cc1da20, - 0x269ad: 0x6c0f7a20, 0x269ae: 0x6c41f020, - 0x269b0: 0x6cbcea20, 0x269b1: 0x6c739a20, 0x269b2: 0x6c290e20, 0x269b3: 0x6c16cc20, - 0x269b4: 0x6d0fde20, 0x269b5: 0x6c518020, 0x269b7: 0x6c5f5c20, - 0x269b9: 0x6c0df820, 0x269bb: 0x6c9a3020, - 0x269bf: 0x6c33b820, - // Block 0x9a7, offset 0x269c0 - 0x269c0: 0x6c02b020, 0x269c1: 0x6c6dd820, 0x269c2: 0x6c92f420, 0x269c3: 0x6c9e6620, - 0x269c4: 0x6c2d8a20, 0x269c5: 0x6c51f220, 0x269c7: 0x6c650420, - 0x269ca: 0x6c575e20, 0x269cb: 0x6c466220, - 0x269ce: 0x6c92f620, 0x269cf: 0x6c3f0a20, - 0x269d0: 0x6c5b7220, 0x269d2: 0x6d2b6620, - 0x269d4: 0x6c6d6220, 0x269d5: 0x6cd83420, 0x269d6: 0x6cc43e20, - 0x269dc: 0x6c28cc20, 0x269de: 0x6ced9e20, 0x269df: 0x6c0b5620, - 0x269e4: 0x6c63ee20, - 0x269eb: 0x6c284e20, - 0x269ec: 0x6c6f8a20, 0x269ed: 0x6cfb9c20, 0x269ee: 0x6c0f7c20, - // Block 0x9a8, offset 0x26a00 - 0x26a0f: 0x6cfa0020, - 0x26a11: 0x6c0c3220, - 0x26a15: 0x6cb3a820, - 0x26a18: 0x6ccae820, 0x26a19: 0x6c076620, 0x26a1a: 0x6ccc8020, 0x26a1b: 0x6cf02e20, - 0x26a1d: 0x6c123e20, 0x26a1e: 0x6c92f820, - 0x26a29: 0x6c28ce20, 0x26a2b: 0x6c47e820, - 0x26a2c: 0x6d289e20, 0x26a2d: 0x6c055820, 0x26a2e: 0x6c423820, - 0x26a31: 0x6c175420, 0x26a32: 0x6c62ae20, 0x26a33: 0x6c8ab620, - 0x26a35: 0x6cbf7e20, 0x26a36: 0x6c66f420, 0x26a37: 0x6c930a20, - 0x26a38: 0x6c32a620, 0x26a39: 0x6cdb8a20, 0x26a3a: 0x6d116020, 0x26a3b: 0x6d1b1620, - 0x26a3d: 0x6cdec220, 0x26a3e: 0x6d116220, 0x26a3f: 0x6c6de020, - // Block 0x9a9, offset 0x26a40 - 0x26a40: 0x6c1ebc20, 0x26a41: 0x6c3f1220, 0x26a42: 0x6d25c220, 0x26a43: 0x6ccebc20, - 0x26a45: 0x6c0e3620, 0x26a46: 0x6c299e20, 0x26a47: 0x6cd3f820, - 0x26a4a: 0x6c916420, 0x26a4b: 0x6cbcf220, - 0x26a4c: 0x6c955c20, 0x26a4d: 0x6cb3ae20, 0x26a4f: 0x6c9b7a20, - 0x26a50: 0x6c6b6620, 0x26a53: 0x6c5f7220, - 0x26a56: 0x6c930c20, - // Block 0x9aa, offset 0x26a80 - 0x26a84: 0x6c172a20, 0x26a85: 0x6c9f0020, 0x26a86: 0x6c9b7c20, 0x26a87: 0x6c660220, - 0x26a8a: 0x6c114020, - 0x26a8c: 0x6cdb5220, - 0x26a94: 0x6c51fe20, 0x26a95: 0x6cc9aa20, 0x26a97: 0x6d3eae20, - 0x26a98: 0x6c795e20, 0x26a99: 0x6c452220, 0x26a9a: 0x6cd83a20, - 0x26aa0: 0x6ce3a420, 0x26aa1: 0x6d2e8e20, 0x26aa2: 0x6d026420, 0x26aa3: 0x6cd70020, - 0x26aa4: 0x6c1bcc20, 0x26aa5: 0x6d1ec620, 0x26aa6: 0x6c91f820, 0x26aa7: 0x6c9c1a20, - 0x26aa8: 0x6c8b6020, 0x26aa9: 0x6cd8f620, - 0x26aac: 0x6cf71820, 0x26aad: 0x6c38da20, 0x26aae: 0x6c3db820, 0x26aaf: 0x6cd08820, - 0x26ab0: 0x6ce3a620, 0x26ab1: 0x6c14a420, 0x26ab2: 0x6d270620, - 0x26ab4: 0x6c3dba20, 0x26ab5: 0x6c670220, 0x26ab6: 0x6c2cb020, - 0x26aba: 0x6d011a20, 0x26abb: 0x6c281220, - 0x26abf: 0x6d34b020, - // Block 0x9ab, offset 0x26ac0 - 0x26ac3: 0x6d075620, - 0x26ac8: 0x6ca89820, 0x26ac9: 0x6c397420, 0x26aca: 0x6c9b8820, 0x26acb: 0x6c9fd420, - 0x26afe: 0x6c90d220, 0x26aff: 0x6c31e820, - // Block 0x9ac, offset 0x26b00 - 0x26b01: 0x6d2e9620, 0x26b02: 0x6c671020, 0x26b03: 0x6c4f2e20, - 0x26b04: 0x6c28e220, 0x26b05: 0x6ccbb220, 0x26b06: 0x6c671220, 0x26b07: 0x6ce03e20, - 0x26b08: 0x6c696c20, 0x26b09: 0x6cb34220, 0x26b0b: 0x6cb2e420, - 0x26b0d: 0x6d3bf820, 0x26b0f: 0x6c8a4c20, - 0x26b10: 0x6d3f6620, 0x26b12: 0x6d3dd820, - 0x26b14: 0x6c56de20, - 0x26b19: 0x6cf92020, 0x26b1b: 0x6c9b9620, - 0x26b1c: 0x6c72ba20, 0x26b1d: 0x6c9f0c20, 0x26b1e: 0x6cfbcc20, - 0x26b20: 0x6c7d3820, 0x26b21: 0x6c9b9820, 0x26b22: 0x6c653420, - 0x26b26: 0x6caa0a20, - 0x26b28: 0x6c2cb220, 0x26b29: 0x6ccad220, - // Block 0x9ad, offset 0x26b40 - 0x26b4f: 0x6c1f8c20, - 0x26b50: 0x6d34bc20, 0x26b51: 0x6cb9e220, 0x26b52: 0x6c93c420, - 0x26b54: 0x6d3ddc20, - 0x26b58: 0x6d42b020, 0x26b59: 0x6c4e4820, 0x26b5a: 0x6cdc1820, 0x26b5b: 0x6c46e220, - 0x26b5d: 0x6c1e3c20, 0x26b5e: 0x6c62da20, 0x26b5f: 0x6d194820, - 0x26b60: 0x6d21f020, - 0x26b68: 0x6caa0c20, 0x26b69: 0x6ca66420, 0x26b6a: 0x6cc93620, - 0x26b6e: 0x6c8c0820, - 0x26b71: 0x6ca93820, - // Block 0x9ae, offset 0x26b80 - 0x26b8d: 0x6cbc1620, 0x26b8e: 0x6d117c20, 0x26b8f: 0x6c409c20, - 0x26b90: 0x6cd6b620, 0x26b91: 0x6c7d3e20, 0x26b92: 0x6cc21220, 0x26b93: 0x6c304a20, - 0x26b94: 0x6cd58a20, - 0x26b9a: 0x6c84c020, 0x26b9b: 0x6c719220, - 0x26b9c: 0x6cc8bc20, - 0x26ba0: 0x6d2c6c20, - 0x26ba4: 0x6cff5420, - 0x26bb8: 0x6c9ae220, 0x26bb9: 0x6cd29820, 0x26bba: 0x6c2cfc20, 0x26bbb: 0x6c878e20, - 0x26bbc: 0x6c2b0420, 0x26bbd: 0x6d29c420, 0x26bbf: 0x6c958420, - // Block 0x9af, offset 0x26bc0 - 0x26bc0: 0x6c11c620, 0x26bc3: 0x6c023c20, - 0x26bc6: 0x6c663620, - 0x26bc8: 0x6c2e5020, 0x26bcb: 0x6d1cd820, - 0x26bd6: 0x6d197220, 0x26bd7: 0x6c294620, - 0x26bd8: 0x6caa1220, 0x26bda: 0x6d272620, - 0x26bee: 0x6c855620, 0x26bef: 0x6c84e220, - 0x26bf0: 0x6c56f620, 0x26bf2: 0x6d206420, - 0x26bfa: 0x6ca48420, - // Block 0x9b0, offset 0x26c00 - 0x26c02: 0x6c194a20, - 0x26c09: 0x6c3c9220, 0x26c0a: 0x6c0cd220, - 0x26c0f: 0x6c97d820, - 0x26c10: 0x6c424a20, 0x26c11: 0x6c5e6020, 0x26c13: 0x6c241c20, - 0x26c15: 0x6d200020, - 0x26c18: 0x6d206620, - 0x26c1c: 0x6d057c20, - 0x26c21: 0x6d06b020, 0x26c22: 0x6c561820, 0x26c23: 0x6c915020, - 0x26c25: 0x6cf9b820, 0x26c26: 0x6d177420, - 0x26c2e: 0x6c561e20, 0x26c2f: 0x6c569020, - 0x26c30: 0x6d3f0a20, - 0x26c37: 0x6c458c20, - 0x26c38: 0x6ce99220, 0x26c39: 0x6cf36a20, 0x26c3a: 0x6c8d2020, 0x26c3b: 0x6c472020, - 0x26c3c: 0x6d37be20, - // Block 0x9b1, offset 0x26c40 - 0x26c44: 0x6c915820, - 0x26c48: 0x6d412e20, - 0x26c4c: 0x6ce76a20, 0x26c4d: 0x6cf97020, 0x26c4e: 0x6c515c20, - 0x26c53: 0x6d26e220, - 0x26c59: 0x6ca40c20, 0x26c5a: 0x6c0f4820, 0x26c5b: 0x6c54fa20, - 0x26c5c: 0x6cb7e220, 0x26c5d: 0x6cd53a20, 0x26c5e: 0x6cbadc20, 0x26c5f: 0x6d38ae20, - 0x26c60: 0x6d122620, 0x26c61: 0x6c473420, - 0x26c65: 0x6c049e20, 0x26c66: 0x6c76ec20, - 0x26c6e: 0x6c517620, 0x26c6f: 0x6c628420, - 0x26c70: 0x6c55be20, 0x26c71: 0x6d0cde20, - 0x26c76: 0x6c212020, 0x26c77: 0x6c2f8620, - 0x26c78: 0x6cbfce20, 0x26c79: 0x6c543620, - 0x26c7c: 0x6c507420, 0x26c7f: 0x6d413220, - // Block 0x9b2, offset 0x26c80 - 0x26c81: 0x6cfbb820, - 0x26c84: 0x6cfa5220, 0x26c85: 0x6cf91820, - 0x26c88: 0x6ccb8420, - 0x26c8c: 0x6c445a20, 0x26c8d: 0x6cf92220, - 0x26c91: 0x6c445e20, - 0x26c94: 0x6c93c620, 0x26c96: 0x6c446020, 0x26c97: 0x6c78ea20, - 0x26c99: 0x6cd48a20, 0x26c9a: 0x6d3b5020, - 0x26c9c: 0x6ce2de20, 0x26c9d: 0x6d0b7820, 0x26c9e: 0x6ca67c20, - 0x26ca6: 0x6c95e220, 0x26ca7: 0x6cdbae20, - 0x26caa: 0x6c159e20, - 0x26cad: 0x6cf4cc20, 0x26caf: 0x6d208220, - 0x26cb9: 0x6d2a4420, 0x26cbb: 0x6d174420, - 0x26cbc: 0x6cf5d220, 0x26cbd: 0x6c533620, 0x26cbe: 0x6cc2ce20, 0x26cbf: 0x6cee0c20, - // Block 0x9b3, offset 0x26cc0 - 0x26cc0: 0x6c1b9820, 0x26cc1: 0x6cf87420, 0x26cc2: 0x6ce4e020, 0x26cc3: 0x6d27e420, - 0x26cc5: 0x6d13e220, 0x26cc6: 0x6c600620, 0x26cc7: 0x6c5aaa20, - 0x26cc8: 0x6c3d1620, 0x26cca: 0x6c3f5420, - 0x26ccd: 0x6c600820, 0x26cce: 0x6d080a20, - 0x26cd1: 0x6cdf6c20, 0x26cd3: 0x6c324e20, - 0x26cd7: 0x6d255620, - 0x26cdb: 0x6c2c3220, - 0x26cde: 0x6d3a6620, 0x26cdf: 0x6cdf0620, - 0x26ce1: 0x6cc70c20, 0x26ce2: 0x6d090a20, 0x26ce3: 0x6d232020, - 0x26ce4: 0x6c394e20, 0x26ce5: 0x6c06ca20, 0x26ce7: 0x6cc24420, - 0x26ce9: 0x6c109620, 0x26cea: 0x6c635420, 0x26ceb: 0x6d2c2c20, - 0x26ced: 0x6caa5a20, 0x26cee: 0x6ccf1420, - 0x26cf2: 0x6c860220, - // Block 0x9b4, offset 0x26d00 - 0x26d04: 0x6c4af620, 0x26d05: 0x6c48de20, 0x26d07: 0x6c276420, - 0x26d0f: 0x6c40fa20, - 0x26d12: 0x6c22cc20, - 0x26d14: 0x6d0d9220, 0x26d15: 0x6cd92220, 0x26d16: 0x6cd38820, - 0x26d18: 0x6c7a9c20, 0x26d19: 0x6d352e20, 0x26d1a: 0x6ce75020, 0x26d1b: 0x6cc19620, - 0x26d1c: 0x6c364220, 0x26d1e: 0x6d03ea20, 0x26d1f: 0x6cc7b020, - 0x26d20: 0x6d213820, 0x26d23: 0x6d17c020, - 0x26d24: 0x6d17c220, 0x26d25: 0x6d06e420, 0x26d26: 0x6c3d2c20, 0x26d27: 0x6c43f820, - 0x26d2c: 0x6c512a20, 0x26d2d: 0x6d19e820, 0x26d2f: 0x6c53be20, - 0x26d31: 0x6c349820, - 0x26d3d: 0x6d03ec20, 0x26d3e: 0x6c38a220, - // Block 0x9b5, offset 0x26d40 - 0x26d49: 0x6cb50020, 0x26d4a: 0x6ccc0220, - 0x26d4c: 0x6c326a20, 0x26d4d: 0x6c2c7220, 0x26d4e: 0x6c83fa20, 0x26d4f: 0x6d180620, - 0x26d50: 0x6cf78c20, 0x26d51: 0x6c451420, 0x26d52: 0x6ce75820, 0x26d53: 0x6c77c020, - 0x26d54: 0x6c53c420, 0x26d55: 0x6c7db820, 0x26d56: 0x6ca84c20, 0x26d57: 0x6c1b3c20, - 0x26d58: 0x6ce34e20, 0x26d5a: 0x6ce75a20, - 0x26d60: 0x6c83fc20, 0x26d61: 0x6ca35c20, - 0x26d71: 0x6d2d8220, 0x26d72: 0x6c06cc20, - // Block 0x9b6, offset 0x26d80 - 0x26d81: 0x6ce59220, 0x26d83: 0x6d289420, - 0x26d84: 0x6c367420, 0x26d85: 0x6cd47620, 0x26d86: 0x6c798820, 0x26d87: 0x6caeb820, - 0x26d88: 0x6c402020, 0x26d89: 0x6c929820, 0x26d8a: 0x6d01e820, 0x26d8b: 0x6d01ea20, - 0x26d8c: 0x6d04e820, 0x26d8d: 0x6c929a20, 0x26d8e: 0x6ce50a20, 0x26d8f: 0x6cde8820, - 0x26d90: 0x6c22da20, 0x26d91: 0x6cc12a20, 0x26d93: 0x6c402220, - 0x26d94: 0x6d340620, 0x26d96: 0x6d01ec20, 0x26d97: 0x6d408220, - 0x26d98: 0x6c3abe20, 0x26d99: 0x6c9f7420, 0x26d9a: 0x6d038c20, - 0x26d9d: 0x6ce76c20, 0x26d9e: 0x6cb60220, - 0x26da0: 0x6cb15c20, 0x26da2: 0x6cdc5620, 0x26da3: 0x6c37a020, - 0x26da7: 0x6c562c20, - 0x26dbb: 0x6cd92e20, - 0x26dbd: 0x6c0cb020, 0x26dbe: 0x6c2f6620, 0x26dbf: 0x6c04d220, - // Block 0x9b7, offset 0x26dc0 - 0x26dc0: 0x6cd1e220, 0x26dc1: 0x6d01ee20, 0x26dc2: 0x6cff9420, 0x26dc3: 0x6c3a6620, - 0x26dd2: 0x6c202620, 0x26dd3: 0x6cd67020, - 0x26dd4: 0x6d10b220, 0x26dd5: 0x6c74a220, 0x26dd6: 0x6cd14820, - 0x26dd8: 0x6d1eb220, 0x26dd9: 0x6c396c20, - 0x26ddc: 0x6c7c9a20, 0x26ddd: 0x6c2c9820, 0x26ddf: 0x6c990220, - 0x26de0: 0x6c6b2420, 0x26de2: 0x6d0cc820, - 0x26de5: 0x6ceeb420, - 0x26de8: 0x6cca7220, 0x26de9: 0x6c6b2620, 0x26dea: 0x6d219220, 0x26deb: 0x6cf0c820, - 0x26dec: 0x6c369220, 0x26ded: 0x6cc31220, 0x26dee: 0x6c6f2e20, 0x26def: 0x6c3cba20, - 0x26df0: 0x6c8fa620, 0x26df1: 0x6c2ee220, 0x26df2: 0x6cb12420, - 0x26df4: 0x6c891420, 0x26df5: 0x6c559820, 0x26df6: 0x6c93fa20, - 0x26dff: 0x6c2d7a20, - // Block 0x9b8, offset 0x26e00 - 0x26e03: 0x6c255e20, - 0x26e04: 0x6ca1e420, - 0x26e15: 0x6cedea20, 0x26e16: 0x6c72fe20, 0x26e17: 0x6c782e20, - 0x26e18: 0x6d0cca20, 0x26e19: 0x6c693420, - 0x26e21: 0x6c45b020, 0x26e23: 0x6cc6b620, - 0x26e24: 0x6cdce220, 0x26e25: 0x6ccdb620, - 0x26e28: 0x6c1b5420, 0x26e2a: 0x6cb65220, 0x26e2b: 0x6cdd9820, - 0x26e2d: 0x6d134420, 0x26e2e: 0x6d2a5420, 0x26e2f: 0x6cc39620, - 0x26e30: 0x6d2e1820, 0x26e31: 0x6c035a20, 0x26e32: 0x6d40d620, 0x26e33: 0x6cdd9a20, - 0x26e34: 0x6d309220, 0x26e35: 0x6cf8e820, 0x26e37: 0x6c1eec20, - 0x26e38: 0x6c694820, 0x26e39: 0x6d41d220, 0x26e3a: 0x6c43aa20, 0x26e3b: 0x6cf52420, - 0x26e3e: 0x6c94c020, 0x26e3f: 0x6c60b420, - // Block 0x9b9, offset 0x26e40 - 0x26e42: 0x6d00ec20, 0x26e43: 0x6d00ee20, - 0x26e46: 0x6c30f620, - 0x26e4b: 0x6cbfc620, - 0x26e51: 0x6cb2d020, 0x26e53: 0x6c8ea420, - 0x26e65: 0x6c6b3820, 0x26e67: 0x6c5c4020, - 0x26e6b: 0x6ccc7a20, - 0x26e78: 0x6d34a620, 0x26e79: 0x6c00e620, 0x26e7a: 0x6d074a20, 0x26e7b: 0x6c0a7820, - 0x26e7d: 0x6d126820, 0x26e7e: 0x6ca6d820, 0x26e7f: 0x6d3a2e20, - // Block 0x9ba, offset 0x26e80 - 0x26e81: 0x6cdb4220, 0x26e83: 0x6d010220, - 0x26e84: 0x6d241820, 0x26e85: 0x6cc14820, - 0x26e88: 0x6d40e020, 0x26e89: 0x6d341820, 0x26e8a: 0x6d2ee420, 0x26e8b: 0x6c94c420, - 0x26e8c: 0x6cf03020, 0x26e8d: 0x6c1ce820, 0x26e8e: 0x6c9d9620, - 0x26e90: 0x6c5f5e20, 0x26e92: 0x6cdb4420, 0x26e93: 0x6d12b620, - 0x26e94: 0x6cf7ac20, 0x26e95: 0x6ce96420, 0x26e96: 0x6c886c20, 0x26e97: 0x6d082e20, - 0x26e99: 0x6cf52c20, - 0x26e9f: 0x6c990c20, - 0x26eac: 0x6c538e20, 0x26eaf: 0x6c94c620, - 0x26eb0: 0x6c31ce20, 0x26eb1: 0x6c23ba20, 0x26eb2: 0x6c152e20, 0x26eb3: 0x6c92fc20, - 0x26eb4: 0x6cdb4620, - // Block 0x9bb, offset 0x26ec0 - 0x26ec0: 0x6c94c820, - 0x26ec6: 0x6d37d220, 0x26ec7: 0x6c847420, - 0x26ec8: 0x6c3ae220, 0x26eca: 0x6c6e3820, 0x26ecb: 0x6c7d2c20, - 0x26ecc: 0x6d18f420, 0x26ecd: 0x6c576620, 0x26ece: 0x6c258020, - 0x26ed0: 0x6d243c20, 0x26ed1: 0x6c083620, 0x26ed2: 0x6cea3020, 0x26ed3: 0x6cd58020, - 0x26ed4: 0x6c27a220, 0x26ed5: 0x6cf38a20, 0x26ed6: 0x6c22ea20, 0x26ed7: 0x6ca95e20, - 0x26ed8: 0x6c29a020, 0x26ed9: 0x6d40ee20, 0x26eda: 0x6c4e4220, - 0x26edc: 0x6cb02e20, 0x26edd: 0x6c204620, - 0x26ee0: 0x6c328620, 0x26ee1: 0x6cabe020, - 0x26ee4: 0x6d39d620, 0x26ee6: 0x6d011620, 0x26ee7: 0x6d30ac20, - 0x26ee8: 0x6cbcf420, 0x26ee9: 0x6d07dc20, 0x26eeb: 0x6ccb0820, - // Block 0x9bc, offset 0x26f00 - 0x26f00: 0x6c0a9620, 0x26f02: 0x6c407c20, - 0x26f08: 0x6c86d820, - 0x26f0e: 0x6c359620, - 0x26f10: 0x6d126e20, 0x26f11: 0x6cd58420, 0x26f13: 0x6ccb8620, - 0x26f15: 0x6cb54a20, 0x26f16: 0x6c4cf220, 0x26f17: 0x6ccb8820, - 0x26f19: 0x6c408620, 0x26f1a: 0x6c990e20, - 0x26f1c: 0x6c827620, 0x26f1d: 0x6d2db420, - 0x26f28: 0x6c14a620, - 0x26f2d: 0x6cf0fc20, - 0x26f3d: 0x6c827820, 0x26f3f: 0x6d2b6c20, - // Block 0x9bd, offset 0x26f40 - 0x26f40: 0x6d1c0e20, 0x26f41: 0x6c010220, 0x26f42: 0x6d005c20, - 0x26f44: 0x6c0aaa20, - 0x26f4b: 0x6c155a20, - 0x26f4e: 0x6cb03620, 0x26f4f: 0x6c23c220, - 0x26f50: 0x6c8b6620, 0x26f51: 0x6cb69c20, 0x26f53: 0x6c62d420, - 0x26f54: 0x6c6df220, 0x26f55: 0x6c302820, 0x26f56: 0x6c3a4620, 0x26f57: 0x6d159220, - 0x26f58: 0x6ce97220, - 0x26f68: 0x6c9bf620, 0x26f69: 0x6c11be20, 0x26f6a: 0x6d0b3c20, - 0x26f72: 0x6d103c20, - 0x26f74: 0x6ce6a220, - 0x26f78: 0x6d34be20, 0x26f7a: 0x6d027c20, 0x26f7b: 0x6c942220, - 0x26f7d: 0x6c875420, 0x26f7f: 0x6c991620, - // Block 0x9be, offset 0x26f80 - 0x26f82: 0x6cfa1820, - 0x26f85: 0x6cda4420, - 0x26f96: 0x6cda6c20, 0x26f97: 0x6d097e20, - 0x26f9d: 0x6c877a20, 0x26f9e: 0x6d25d820, - 0x26fa1: 0x6d2e4020, 0x26fa3: 0x6cdef220, - 0x26fa4: 0x6d083a20, 0x26fa5: 0x6cf12020, 0x26fa6: 0x6d139620, 0x26fa7: 0x6cad1a20, - 0x26fa8: 0x6c991820, 0x26fa9: 0x6ce3b620, 0x26faa: 0x6cb22a20, - 0x26fac: 0x6c328e20, 0x26fad: 0x6cc0a820, 0x26fae: 0x6d162c20, - 0x26fb3: 0x6ceb6020, - 0x26fb4: 0x6c14aa20, 0x26fb7: 0x6c6d7620, - 0x26fbc: 0x6c35aa20, - // Block 0x9bf, offset 0x26fc0 - 0x26fc3: 0x6c157420, - 0x26fc4: 0x6d1c4420, 0x26fc5: 0x6c8dae20, 0x26fc7: 0x6cfc5e20, - 0x26fc9: 0x6cb55a20, 0x26fcb: 0x6d272220, - 0x26fcc: 0x6c94ce20, 0x26fcd: 0x6d1cda20, 0x26fce: 0x6cc21a20, - 0x26fd2: 0x6c3a7820, 0x26fd3: 0x6d3eca20, - 0x26fd9: 0x6cbe6220, - 0x26fdd: 0x6ca94020, 0x26fde: 0x6cf13220, 0x26fdf: 0x6cd6c220, - 0x26fe1: 0x6c40a420, - 0x26fe4: 0x6ca1aa20, 0x26fe5: 0x6ca1ac20, 0x26fe6: 0x6ceb6820, 0x26fe7: 0x6c14ae20, - 0x26fe8: 0x6d2a1220, - 0x26fee: 0x6c84da20, 0x26fef: 0x6c84e420, - 0x26ff1: 0x6cfa2020, 0x26ff2: 0x6c733420, - 0x26ff4: 0x6ca41a20, 0x26ff5: 0x6c9db420, - 0x26ff8: 0x6c5a3e20, 0x26ffa: 0x6cd6f620, - 0x26ffc: 0x6d066420, 0x26fff: 0x6c3a7a20, - // Block 0x9c0, offset 0x27000 - 0x27001: 0x6d029420, - 0x27006: 0x6cdefa20, 0x27007: 0x6d1e6a20, - 0x27009: 0x6d2e4420, - 0x27011: 0x6cbb3420, 0x27012: 0x6ca46a20, - 0x27014: 0x6c8c9420, - 0x27018: 0x6c948220, 0x27019: 0x6cfc6e20, 0x2701a: 0x6c3f2c20, - 0x2701c: 0x6c8df820, - 0x27020: 0x6ccadc20, 0x27022: 0x6c5ca620, - 0x27028: 0x6ce66020, 0x2702a: 0x6cbe7020, - 0x2702c: 0x6c598a20, 0x2702e: 0x6c01b220, - 0x27035: 0x6c97c220, 0x27037: 0x6ca6b220, - 0x2703b: 0x6c4c8020, - 0x2703c: 0x6cab8820, 0x2703f: 0x6cfe4620, - // Block 0x9c1, offset 0x27040 - 0x27041: 0x6c6c5620, - 0x27046: 0x6d32f620, - 0x27048: 0x6ca2cc20, 0x2704b: 0x6cca5e20, - 0x2704c: 0x6c56d020, 0x2704e: 0x6d40f020, 0x2704f: 0x6c5b7620, - 0x27052: 0x6c5f7420, - 0x27056: 0x6d138a20, - 0x27066: 0x6d03de20, - 0x27069: 0x6c7e6c20, 0x2706a: 0x6d232220, 0x2706b: 0x6c745820, - 0x27071: 0x6cd5da20, 0x27072: 0x6d32d620, - 0x27074: 0x6d1e4e20, 0x27076: 0x6c439c20, - 0x27078: 0x6c66ae20, 0x27079: 0x6d034820, - 0x2707c: 0x6c5aec20, 0x2707f: 0x6cd67820, - // Block 0x9c2, offset 0x27080 - 0x27082: 0x6c1cf020, 0x27083: 0x6c4f8a20, - 0x27088: 0x6c8a6420, - 0x2708d: 0x6c674a20, 0x2708f: 0x6c456c20, - 0x27091: 0x6d3d3020, - 0x27097: 0x6cb6de20, - 0x2709c: 0x6cb8b820, 0x2709e: 0x6c30e220, 0x2709f: 0x6cb30220, - 0x270a2: 0x6c567a20, - 0x270a5: 0x6ca98c20, 0x270a7: 0x6cb76420, - 0x270a8: 0x6c2db420, 0x270a9: 0x6c2db620, 0x270ab: 0x6c85b220, - 0x270ae: 0x6d046220, - 0x270bd: 0x6ca2da20, 0x270bf: 0x6d32a620, - // Block 0x9c3, offset 0x270c0 - 0x270c0: 0x6c7e6e20, 0x270c1: 0x6d35cc20, 0x270c3: 0x6c35b220, - 0x270c4: 0x6c0e6620, 0x270c5: 0x6cb30620, 0x270c6: 0x6d058420, 0x270c7: 0x6d1e7a20, - 0x270c8: 0x6c223c20, 0x270c9: 0x6c85e220, - 0x270cc: 0x6cad5820, 0x270cf: 0x6d053a20, - 0x270db: 0x6cb4a820, - 0x270dd: 0x6c17e420, 0x270de: 0x6cb78420, - 0x270e1: 0x6d177620, 0x270e3: 0x6ce31c20, - 0x270e4: 0x6c348820, 0x270e5: 0x6c8f9020, 0x270e7: 0x6c668020, - 0x270ed: 0x6d2e6020, 0x270ee: 0x6d261220, - 0x270f6: 0x6d210820, - 0x270f8: 0x6c44ca20, 0x270fa: 0x6c546c20, - 0x270fe: 0x6cb6f820, - // Block 0x9c4, offset 0x27100 - 0x27100: 0x6ca28c20, 0x27101: 0x6c592a20, 0x27102: 0x6c906a20, 0x27103: 0x6cf89420, - 0x27104: 0x6c356c20, 0x27105: 0x6c80fe20, 0x27106: 0x6c3aae20, 0x27107: 0x6ced2820, - 0x27109: 0x6c259620, 0x2710b: 0x6caea420, - 0x2710f: 0x6c262c20, - 0x27110: 0x6cf22420, - 0x27121: 0x6c430620, - 0x27125: 0x6c254820, - 0x27128: 0x6cb7a620, 0x27129: 0x6c83fe20, 0x2712a: 0x6cbcc820, 0x2712b: 0x6cba6020, - 0x2712c: 0x6c798220, 0x2712d: 0x6c082220, 0x2712f: 0x6cd46c20, - 0x27137: 0x6ceea220, - // Block 0x9c5, offset 0x27140 - 0x27144: 0x6cccf220, - 0x2714f: 0x6d3e6e20, - 0x27152: 0x6ce40c20, 0x27153: 0x6cb90e20, - 0x27154: 0x6c31ac20, 0x27157: 0x6ce8dc20, - 0x2715a: 0x6ceeaa20, - 0x2715e: 0x6c558420, 0x2715f: 0x6d038e20, - 0x27161: 0x6ccd0220, 0x27162: 0x6d354a20, - 0x27167: 0x6c1bb820, - 0x27178: 0x6d394a20, 0x27179: 0x6cf23620, 0x2717a: 0x6c1b4c20, 0x2717b: 0x6cdd9420, - 0x2717c: 0x6d020220, 0x2717e: 0x6c78d220, - // Block 0x9c6, offset 0x27180 - 0x27181: 0x6ccca220, 0x27182: 0x6cd1f220, 0x27183: 0x6cd47820, - 0x27185: 0x6c6bfc20, - 0x27189: 0x6c431c20, 0x2718a: 0x6c93b220, - 0x27194: 0x6d020420, - 0x2719a: 0x6d354c20, - 0x2719e: 0x6c978220, - 0x271a0: 0x6cd67420, 0x271a1: 0x6c78da20, 0x271a3: 0x6c2dfe20, - 0x271a4: 0x6d141a20, 0x271a6: 0x6cdb2420, 0x271a7: 0x6c206420, - 0x271b1: 0x6c256820, 0x271b2: 0x6cebb220, - 0x271b5: 0x6d022020, - 0x271bd: 0x6d082620, - // Block 0x9c7, offset 0x271c0 - 0x271c2: 0x6c51f420, 0x271c3: 0x6c74ce20, - 0x271c6: 0x6ce43020, 0x271c7: 0x6c3ada20, - 0x271c9: 0x6d355620, 0x271ca: 0x6cd3e820, 0x271cb: 0x6ce9c620, - 0x271ce: 0x6c1cea20, - 0x271d0: 0x6ce43220, 0x271d1: 0x6d2e8820, 0x271d2: 0x6c527820, - 0x271d4: 0x6cc1de20, 0x271d5: 0x6cef4220, 0x271d7: 0x6c33ba20, - 0x271d8: 0x6c067220, - 0x271dc: 0x6c8a2c20, - 0x271e4: 0x6cd83620, - 0x271ea: 0x6c0c8420, 0x271eb: 0x6d023420, - 0x271ec: 0x6c0cfc20, 0x271ee: 0x6c23d820, - 0x271f2: 0x6c72ac20, 0x271f3: 0x6c518820, - 0x271f7: 0x6c7d3020, - 0x271f8: 0x6d1dc820, - // Block 0x9c8, offset 0x27200 - 0x27200: 0x6cd62220, - 0x2720d: 0x6ca89a20, 0x2720f: 0x6d21da20, - 0x27210: 0x6d3dca20, 0x27211: 0x6c9b8c20, 0x27212: 0x6c55f220, - 0x27215: 0x6c8b6220, - 0x2721d: 0x6c6a4020, 0x2721e: 0x6d048220, - 0x27223: 0x6d0e0020, - 0x27229: 0x6c6b7a20, 0x2722a: 0x6c7eb820, 0x2722b: 0x6cd62e20, - 0x2722c: 0x6c6b7c20, 0x2722d: 0x6c828220, - 0x27230: 0x6d40fc20, 0x27232: 0x6cd40420, - 0x27238: 0x6cef6c20, 0x27239: 0x6c318620, 0x2723a: 0x6cdb6420, - // Block 0x9c9, offset 0x27240 - 0x27243: 0x6d012e20, - 0x27244: 0x6cc4f620, - 0x2724c: 0x6c964e20, - 0x27251: 0x6cb96420, - 0x27258: 0x6ca48620, 0x27259: 0x6c8dec20, - 0x2725c: 0x6c630620, - 0x27260: 0x6ca03e20, 0x27263: 0x6c476220, - 0x27268: 0x6d080c20, - 0x2726c: 0x6d058e20, - 0x27271: 0x6c0f3620, - 0x2727c: 0x6ceebc20, - // Block 0x9ca, offset 0x27280 - 0x27282: 0x6c7a6e20, - 0x27286: 0x6cecf020, - 0x27288: 0x6c143c20, 0x2728a: 0x6c996820, 0x2728b: 0x6c789a20, - 0x2728e: 0x6c22c420, - 0x27292: 0x6cfcbc20, 0x27293: 0x6ca11620, - 0x2729a: 0x6c5cc420, 0x2729b: 0x6c162c20, - 0x2729c: 0x6cd1c620, 0x2729d: 0x6d31dc20, 0x2729e: 0x6c364420, 0x2729f: 0x6c9c5a20, - 0x272a1: 0x6cd1c820, 0x272a2: 0x6cc11420, 0x272a3: 0x6cd4e420, - 0x272a5: 0x6c220420, 0x272a6: 0x6d0d9420, - 0x272a9: 0x6c54dc20, 0x272aa: 0x6cb50220, 0x272ab: 0x6d366c20, - 0x272ac: 0x6c599c20, - 0x272b4: 0x6d353820, 0x272b6: 0x6d1fda20, - 0x272bc: 0x6c435420, 0x272bd: 0x6d11c420, 0x272be: 0x6cb3cc20, - // Block 0x9cb, offset 0x272c0 - 0x272c7: 0x6d153620, - 0x272c8: 0x6c1a8420, 0x272c9: 0x6c625020, 0x272cb: 0x6c007420, - 0x272cd: 0x6c308620, 0x272cf: 0x6cdc6220, - 0x272d1: 0x6c701c20, - 0x272d8: 0x6cb7c820, 0x272d9: 0x6c884420, 0x272da: 0x6d085620, - 0x272dc: 0x6c8a7620, - 0x272e1: 0x6d285820, 0x272e2: 0x6d085a20, 0x272e3: 0x6c23e620, - 0x272e4: 0x6cb10020, 0x272e6: 0x6c7c9c20, - 0x272e8: 0x6ce37a20, 0x272e9: 0x6c58e020, 0x272ea: 0x6c280020, 0x272eb: 0x6c4b7820, - 0x272ec: 0x6c188a20, 0x272ee: 0x6cce3c20, 0x272ef: 0x6c628620, - 0x272f4: 0x6c891c20, 0x272f5: 0x6c76b620, 0x272f6: 0x6cd17820, - 0x272f8: 0x6c30cc20, 0x272f9: 0x6d1f8020, 0x272fa: 0x6cb66220, - 0x272fc: 0x6cffc620, - // Block 0x9cc, offset 0x27300 - 0x27302: 0x6d18f620, 0x27303: 0x6c90c420, - 0x27306: 0x6c206a20, - 0x2730b: 0x6c81e620, - 0x2730c: 0x6c42ec20, - 0x27310: 0x6d2ba220, 0x27312: 0x6cef6420, - 0x27316: 0x6c653620, - 0x2731b: 0x6d1c3220, - 0x2731c: 0x6c38f420, 0x2731d: 0x6c877c20, 0x2731e: 0x6cb94e20, - 0x27322: 0x6d125420, - 0x27326: 0x6c7c5a20, 0x27327: 0x6cef7a20, - 0x27329: 0x6cc42620, - 0x2732c: 0x6cffca20, 0x2732d: 0x6cc42820, - 0x27330: 0x6c551820, - 0x27335: 0x6c342020, 0x27336: 0x6c1f1e20, - 0x27339: 0x6ccfd620, - 0x2733c: 0x6d3d5620, 0x2733d: 0x6c355e20, 0x2733e: 0x6c61f820, - // Block 0x9cd, offset 0x27340 - 0x27341: 0x6cdfde20, 0x27343: 0x6cabc420, - 0x2734b: 0x6c6be220, - 0x2734c: 0x6cbc4220, - 0x27351: 0x6cb99620, 0x27352: 0x6c724c20, - 0x27355: 0x6cc06e20, 0x27356: 0x6ceb2220, - 0x2735a: 0x6caafa20, 0x2735b: 0x6cd8c620, - 0x2735f: 0x6d14fe20, - 0x27361: 0x6c47a220, 0x27362: 0x6c5d3220, 0x27363: 0x6cabda20, - 0x27364: 0x6d3e5a20, 0x27366: 0x6c685220, - 0x27369: 0x6cf80420, 0x2736a: 0x6cceb820, - 0x2736c: 0x6d153820, 0x2736d: 0x6d369e20, - 0x27375: 0x6c952420, 0x27377: 0x6d38a020, - 0x27378: 0x6c74a420, 0x27379: 0x6ce00620, 0x2737a: 0x6cab0c20, 0x2737b: 0x6c728020, - 0x2737c: 0x6c559c20, 0x2737e: 0x6d36c220, - // Block 0x9ce, offset 0x27380 - 0x27383: 0x6c088820, - 0x2738d: 0x6c1c7220, 0x2738e: 0x6d07d020, 0x2738f: 0x6c60b620, - 0x27390: 0x6c48a020, 0x27391: 0x6c715e20, 0x27392: 0x6cf31620, 0x27393: 0x6ceb4a20, - 0x27395: 0x6cc09820, 0x27396: 0x6ceebe20, 0x27397: 0x6c32a220, - 0x27399: 0x6cd47c20, 0x2739b: 0x6d31fe20, - 0x2739c: 0x6ca55420, 0x2739f: 0x6cf8f620, - 0x273a0: 0x6d30a420, 0x273a1: 0x6d371620, 0x273a3: 0x6ca2ea20, - 0x273a8: 0x6c650620, - 0x273ae: 0x6d114e20, 0x273af: 0x6c4c9820, - 0x273b2: 0x6c2c0820, - 0x273b4: 0x6c5e1c20, 0x273b5: 0x6c6de220, - 0x273bc: 0x6c74ec20, 0x273bd: 0x6d270820, - // Block 0x9cf, offset 0x273c0 - 0x273c4: 0x6c60ee20, 0x273c6: 0x6cdb5c20, - 0x273c8: 0x6c654020, 0x273ca: 0x6c7d9820, 0x273cb: 0x6cf33220, - 0x273cc: 0x6c7c1e20, 0x273cd: 0x6c0c6020, 0x273ce: 0x6c751220, - 0x273d1: 0x6c0ad620, 0x273d3: 0x6c157a20, - 0x273d5: 0x6d3ecc20, 0x273d6: 0x6c87c220, - 0x273da: 0x6c3d0e20, 0x273db: 0x6cb9f020, - 0x273dc: 0x6d0d4020, 0x273de: 0x6ce08c20, 0x273df: 0x6ca0d820, - 0x273e3: 0x6c79e420, - 0x273e4: 0x6cf5d420, - 0x273ee: 0x6c569220, 0x273ef: 0x6c569420, - 0x273f1: 0x6c3e7020, - 0x273f4: 0x6d104c20, 0x273f5: 0x6c4cea20, 0x273f7: 0x6cc57020, - 0x273f8: 0x6d1b4c20, 0x273f9: 0x6c3c4420, 0x273fa: 0x6c75b620, - 0x273fc: 0x6d27a620, 0x273ff: 0x6d0a8820, - // Block 0x9d0, offset 0x27400 - 0x27401: 0x6cf87c20, - 0x2740e: 0x6cf96220, - 0x27411: 0x6c4f7620, - 0x2741a: 0x6c569620, - 0x2741d: 0x6c54d020, 0x2741e: 0x6cb4aa20, 0x2741f: 0x6c385020, - 0x27424: 0x6c636420, 0x27427: 0x6d150420, - 0x2742d: 0x6ceac820, 0x2742e: 0x6ca2e220, - 0x27438: 0x6d1a6a20, 0x27439: 0x6d1b5a20, - // Block 0x9d1, offset 0x27440 - 0x27443: 0x6c622a20, - 0x27444: 0x6cee5620, 0x27445: 0x6cd3a420, 0x27446: 0x6c330c20, 0x27447: 0x6c34fc20, - 0x27449: 0x6ceb3020, 0x2744a: 0x6cebe620, 0x2744b: 0x6c863e20, - 0x2744f: 0x6cc55220, - 0x27452: 0x6c22d020, 0x27453: 0x6d070220, - 0x27454: 0x6d389020, 0x27455: 0x6d3f5a20, - 0x2745c: 0x6cee2a20, 0x2745d: 0x6d0b5820, 0x2745f: 0x6c622c20, - 0x27460: 0x6c179e20, - 0x27469: 0x6c606020, - 0x27475: 0x6ccd5420, 0x27476: 0x6ce8de20, - 0x27478: 0x6c0cf620, 0x27479: 0x6cf8be20, 0x2747a: 0x6caf7e20, 0x2747b: 0x6d2cd420, - 0x2747e: 0x6c5c0620, - // Block 0x9d2, offset 0x27480 - 0x27480: 0x6cdd3020, 0x27482: 0x6c51da20, - 0x27484: 0x6d265220, 0x27486: 0x6cf37c20, - 0x27488: 0x6c8d4020, 0x2748a: 0x6d2cd620, 0x2748b: 0x6c574a20, - 0x27497: 0x6c151220, - 0x2749f: 0x6c367620, - 0x274a1: 0x6c18e020, - 0x274a7: 0x6cdc6620, - 0x274a9: 0x6ce51420, - 0x274b0: 0x6d36c420, 0x274b1: 0x6ce41620, 0x274b2: 0x6c022e20, 0x274b3: 0x6d3d9020, - 0x274b4: 0x6d3f6020, 0x274b5: 0x6c783020, 0x274b7: 0x6ccb4e20, - 0x274b8: 0x6ce4c220, 0x274b9: 0x6c92b620, - 0x274be: 0x6ccd2620, 0x274bf: 0x6d2c9020, - // Block 0x9d3, offset 0x274c0 - 0x274c3: 0x6c1cde20, - 0x274c5: 0x6d0ea620, - 0x274d2: 0x6ca25420, 0x274d3: 0x6c54fc20, - 0x274da: 0x6c1ad420, - 0x274dd: 0x6cdb0a20, - 0x274e3: 0x6ca51420, - 0x274e6: 0x6c60b820, 0x274e7: 0x6c346020, - 0x274e8: 0x6c547e20, 0x274ea: 0x6c23de20, 0x274eb: 0x6d2c0220, - 0x274ec: 0x6d1a9c20, 0x274ee: 0x6cffbe20, - 0x274f0: 0x6c0bbc20, 0x274f1: 0x6c085220, 0x274f2: 0x6c7e9a20, - 0x274f4: 0x6c1ad820, 0x274f6: 0x6cb87820, - 0x274f8: 0x6c015220, 0x274f9: 0x6cd1fe20, - 0x274fc: 0x6c1c7420, - // Block 0x9d4, offset 0x27500 - 0x27505: 0x6caa6a20, 0x27507: 0x6c628820, - 0x27513: 0x6cab9220, - 0x27515: 0x6cf97a20, - 0x27518: 0x6c14a020, 0x2751a: 0x6c005620, - 0x2751d: 0x6cd17c20, 0x2751e: 0x6c518220, - 0x27520: 0x6c60ca20, 0x27521: 0x6c1ade20, 0x27522: 0x6cf8fa20, 0x27523: 0x6d32fe20, - 0x27526: 0x6cde0020, - 0x27528: 0x6c96e220, 0x2752b: 0x6caf9a20, - 0x2752e: 0x6d05f220, 0x2752f: 0x6cba2a20, - 0x27539: 0x6cfa4e20, - // Block 0x9d5, offset 0x27540 - 0x2754a: 0x6d241a20, - 0x27551: 0x6c6b4620, 0x27552: 0x6cfa5420, 0x27553: 0x6c91ee20, - 0x27555: 0x6cbcf620, 0x27557: 0x6c145220, - 0x2755b: 0x6d107020, - 0x2755c: 0x6c62b020, 0x2755d: 0x6ccc3620, 0x2755e: 0x6c912020, - 0x27560: 0x6c5f7620, 0x27561: 0x6d373020, 0x27562: 0x6cee5c20, - 0x27564: 0x6c0a9820, 0x27565: 0x6c015820, 0x27566: 0x6d142a20, 0x27567: 0x6c015a20, - 0x2756c: 0x6c847620, - 0x27579: 0x6cfaec20, - 0x2757e: 0x6c703620, 0x2757f: 0x6ce08420, - // Block 0x9d6, offset 0x27580 - 0x27581: 0x6c507a20, 0x27582: 0x6c520620, - 0x27585: 0x6d2c0620, 0x27586: 0x6d2e2e20, 0x27587: 0x6d191a20, - 0x27588: 0x6cf91a20, 0x2758a: 0x6cf91c20, 0x2758b: 0x6c384420, - 0x2758c: 0x6d0cf620, 0x2758f: 0x6ca25620, - 0x27595: 0x6c474020, - 0x2759e: 0x6d27d020, - 0x275a4: 0x6d384820, 0x275a6: 0x6c160220, 0x275a7: 0x6c208620, - 0x275a8: 0x6c5c8a20, 0x275a9: 0x6d28d620, 0x275aa: 0x6c4c0820, 0x275ab: 0x6c661c20, - 0x275ac: 0x6d0b3e20, - 0x275b0: 0x6cfe6820, 0x275b1: 0x6c520820, - // Block 0x9d7, offset 0x275c0 - 0x275c3: 0x6c28e820, - 0x275c7: 0x6c9df020, - 0x275c8: 0x6ca93a20, 0x275ca: 0x6c9ba620, - 0x275cc: 0x6c8b6e20, 0x275cd: 0x6d396a20, 0x275ce: 0x6cb42220, 0x275cf: 0x6cdf0a20, - 0x275d3: 0x6d1cd020, - 0x275d4: 0x6ce2cc20, 0x275d5: 0x6c4ca220, - 0x275da: 0x6cbb3020, - 0x275dc: 0x6c942420, 0x275dd: 0x6cc9b820, 0x275de: 0x6c8b7020, 0x275df: 0x6c1b6c20, - 0x275e0: 0x6d015020, 0x275e3: 0x6c4ca820, - 0x275e4: 0x6c067e20, 0x275e5: 0x6c964220, 0x275e6: 0x6c73a420, - 0x275ea: 0x6c36e820, - 0x275f3: 0x6c51a820, - 0x275f5: 0x6c9aba20, - 0x275f8: 0x6d028820, 0x275f9: 0x6cb22c20, 0x275fb: 0x6c4dc420, - 0x275fc: 0x6c194420, 0x275fd: 0x6ccdec20, 0x275fe: 0x6c5ca020, - // Block 0x9d8, offset 0x27600 - 0x27606: 0x6d1c4820, - 0x27608: 0x6c663e20, - 0x2760d: 0x6c016620, - 0x27611: 0x6cdef420, 0x27612: 0x6d144220, 0x27613: 0x6ce9dc20, - 0x27617: 0x6c8ef220, - 0x27619: 0x6d425a20, 0x2761b: 0x6c84ec20, - 0x2761d: 0x6cb23420, 0x2761e: 0x6d098420, - 0x27620: 0x6ca5a220, 0x27621: 0x6c315820, - 0x27624: 0x6c806c20, - 0x2762a: 0x6d2d5e20, 0x2762b: 0x6c73e620, - 0x2762c: 0x6d314620, 0x2762d: 0x6c600c20, 0x2762e: 0x6cb8ce20, - 0x27630: 0x6c4da220, 0x27631: 0x6c3b7220, 0x27633: 0x6c4da420, - 0x27634: 0x6c535620, 0x27635: 0x6c514620, 0x27636: 0x6c541a20, - 0x2763a: 0x6d2e7820, 0x2763b: 0x6c1dd420, - 0x2763c: 0x6cdf7e20, 0x2763d: 0x6cba7820, 0x2763f: 0x6ccf7420, - // Block 0x9d9, offset 0x27640 - 0x27640: 0x6d1bee20, 0x27643: 0x6cbd4020, - 0x27646: 0x6c5e0e20, - 0x27648: 0x6cf8fc20, 0x27649: 0x6c51f820, 0x2764a: 0x6cf90820, 0x2764b: 0x6cf97e20, - 0x2764c: 0x6c4fb620, 0x2764d: 0x6c81e820, 0x2764f: 0x6c870c20, - 0x27652: 0x6c19a220, - 0x27656: 0x6c760620, 0x27657: 0x6cf76020, - 0x27658: 0x6c4e7620, - 0x2765e: 0x6c311620, - 0x27660: 0x6c30ae20, 0x27661: 0x6cec9220, - 0x27664: 0x6c30b020, 0x27665: 0x6d293820, 0x27666: 0x6c737a20, - 0x27668: 0x6c90e620, 0x27669: 0x6c1f6220, 0x2766b: 0x6d32ea20, - 0x2766f: 0x6cb64420, - 0x27670: 0x6c770e20, 0x27671: 0x6c5df420, 0x27672: 0x6c7f2420, - 0x2767a: 0x6c410620, - 0x2767c: 0x6cd48220, 0x2767e: 0x6c301a20, - // Block 0x9da, offset 0x27680 - 0x27683: 0x6c90c820, - 0x27684: 0x6ce93e20, 0x27687: 0x6d21ca20, - 0x27688: 0x6cf52e20, 0x2768a: 0x6ce4ce20, - 0x27692: 0x6c4c9e20, - 0x27698: 0x6ce04420, 0x27699: 0x6cb6ae20, - 0x276a0: 0x6c8b8020, 0x276a1: 0x6c87b420, 0x276a3: 0x6d09d020, - 0x276a8: 0x6c452820, 0x276a9: 0x6ce63820, 0x276aa: 0x6c4ea220, 0x276ab: 0x6c1f2a20, - 0x276ad: 0x6cea4c20, 0x276af: 0x6d047a20, - 0x276b0: 0x6d1f3020, 0x276b1: 0x6ca11820, 0x276b2: 0x6c1ba420, - 0x276b4: 0x6c562020, 0x276b5: 0x6c317020, 0x276b7: 0x6ca24420, - 0x276b9: 0x6ca34420, 0x276bb: 0x6c8d0c20, - 0x276bf: 0x6c00ae20, - // Block 0x9db, offset 0x276c0 - 0x276c0: 0x6cfab020, - 0x276c4: 0x6c76e020, 0x276c5: 0x6cd8cc20, 0x276c6: 0x6cca0420, - 0x276ca: 0x6d180e20, - 0x276cf: 0x6d183c20, - 0x276d0: 0x6d000020, 0x276d2: 0x6d340820, 0x276d3: 0x6c313020, - 0x276d8: 0x6c973e20, - 0x276dc: 0x6c950a20, 0x276dd: 0x6c74a820, - 0x276e1: 0x6cbad620, 0x276e2: 0x6c8d4a20, - 0x276e9: 0x6cb12c20, 0x276ea: 0x6c23fc20, 0x276eb: 0x6c351820, - 0x276ec: 0x6d229420, - 0x276f0: 0x6d3d0a20, 0x276f2: 0x6cf8fe20, 0x276f3: 0x6c581620, - 0x276f4: 0x6ca02020, 0x276f5: 0x6ce14420, - 0x276f9: 0x6cb41820, 0x276fb: 0x6c9da420, - 0x276fc: 0x6c979020, 0x276fe: 0x6c48d420, - // Block 0x9dc, offset 0x27700 - 0x27700: 0x6cb93620, 0x27702: 0x6c8bfa20, 0x27703: 0x6c9fd620, - 0x27704: 0x6cf04e20, 0x27705: 0x6c136820, 0x27707: 0x6c56e220, - 0x27708: 0x6cdc0420, 0x2770b: 0x6c72bc20, - 0x2770c: 0x6ccc8420, 0x2770d: 0x6c9ba820, - 0x27717: 0x6cef7620, - 0x27718: 0x6cf75a20, 0x27719: 0x6c8e2a20, - 0x2771c: 0x6c0ad820, 0x2771d: 0x6cf13820, - 0x27721: 0x6c85b420, 0x27722: 0x6d304420, - 0x27724: 0x6d1df220, 0x27725: 0x6c554e20, 0x27726: 0x6cecda20, 0x27727: 0x6c034c20, - 0x27728: 0x6c649220, - 0x2772d: 0x6d426a20, 0x2772e: 0x6d2df220, 0x2772f: 0x6c0e7a20, - 0x27730: 0x6cbfb220, 0x27731: 0x6d0f5a20, - 0x27734: 0x6c300620, 0x27735: 0x6cc19820, - 0x2773a: 0x6caff820, 0x2773b: 0x6d2d2c20, - 0x2773e: 0x6cccf420, 0x2773f: 0x6c46bc20, - // Block 0x9dd, offset 0x27740 - 0x27740: 0x6c0c9020, 0x27741: 0x6d152220, 0x27742: 0x6c3eaa20, - 0x27744: 0x6d034020, 0x27745: 0x6cd3a620, 0x27746: 0x6ce6fc20, - 0x27749: 0x6c2f6220, - 0x2774c: 0x6ce86e20, 0x2774d: 0x6cfef620, 0x2774e: 0x6cf3e020, 0x2774f: 0x6cade420, - 0x27750: 0x6c5ade20, - 0x27755: 0x6c7f2220, - 0x27759: 0x6cd8e220, 0x2775a: 0x6c250220, 0x2775b: 0x6ccc7220, - 0x2775c: 0x6d38f020, 0x2775d: 0x6d2fd820, 0x2775e: 0x6cef3220, 0x2775f: 0x6c7f2620, - 0x27760: 0x6c0a3a20, 0x27763: 0x6c303e20, - 0x27766: 0x6ca51620, 0x27767: 0x6d005420, - 0x27768: 0x6cc54020, 0x27769: 0x6ce98e20, 0x2776a: 0x6cf0d820, 0x2776b: 0x6d1f7020, - 0x2776c: 0x6c9a2820, 0x2776d: 0x6d25b220, 0x2776e: 0x6d384220, - 0x27776: 0x6cd9ea20, - 0x27778: 0x6c474820, 0x27779: 0x6ccee620, 0x2777b: 0x6d2f9220, - 0x2777c: 0x6cb02820, 0x2777f: 0x6ce70820, - // Block 0x9de, offset 0x27780 - 0x27781: 0x6c1ae220, 0x27782: 0x6caedc20, 0x27783: 0x6c153c20, - 0x27784: 0x6d1dca20, 0x27785: 0x6cd6ea20, 0x27787: 0x6cf48420, - 0x27789: 0x6cb03020, 0x2778a: 0x6c596020, - 0x2778c: 0x6c3f1e20, 0x2778e: 0x6c0c9620, - 0x27793: 0x6ca4d020, - 0x27795: 0x6c0c9820, 0x27796: 0x6cf11420, 0x27797: 0x6d1dd620, - 0x27799: 0x6ca52620, 0x2779a: 0x6c48fe20, - 0x277a0: 0x6c879220, 0x277a2: 0x6d035e20, 0x277a3: 0x6d0d2220, - 0x277a4: 0x6cb37420, 0x277a5: 0x6cadca20, - 0x277aa: 0x6cdd5c20, - 0x277ac: 0x6cc5e220, 0x277ad: 0x6ccd3a20, - 0x277b2: 0x6cdd5e20, - 0x277b8: 0x6c27d620, 0x277ba: 0x6c9af020, - // Block 0x9df, offset 0x277c0 - 0x277c3: 0x6cd44820, - 0x277c8: 0x6c46a620, 0x277ca: 0x6c4da620, 0x277cb: 0x6cd39020, - 0x277cc: 0x6d102020, 0x277ce: 0x6c479620, - 0x277db: 0x6c77fe20, - 0x277de: 0x6c709c20, - 0x277e0: 0x6cac2e20, 0x277e1: 0x6c12f820, 0x277e2: 0x6c05b220, 0x277e3: 0x6d047020, - 0x277e4: 0x6c111420, 0x277e7: 0x6c8c2420, - 0x277e8: 0x6c00b020, - 0x277ec: 0x6c9d6220, 0x277ed: 0x6c7f3e20, - 0x277f1: 0x6cfee020, 0x277f3: 0x6ccf1e20, - 0x277fb: 0x6c5d7c20, - 0x277fc: 0x6ca6b420, - // Block 0x9e0, offset 0x27800 - 0x27804: 0x6d335620, 0x27806: 0x6c8c5c20, 0x27807: 0x6d2c4420, - 0x2780a: 0x6d27be20, - 0x2780d: 0x6d071c20, - 0x27814: 0x6c1a2a20, 0x27815: 0x6cf2c020, 0x27816: 0x6cf68620, - 0x27819: 0x6c074820, - 0x2781c: 0x6cce1c20, - 0x27820: 0x6d23d020, 0x27821: 0x6c9d8020, - 0x27832: 0x6c32b020, - 0x27835: 0x6c144a20, 0x27837: 0x6d2b0820, - 0x27838: 0x6c1a8820, 0x2783a: 0x6ce69220, - // Block 0x9e1, offset 0x27840 - 0x27845: 0x6d157020, - 0x2784b: 0x6d10ba20, - 0x2784e: 0x6c7a6620, - 0x27850: 0x6c3b9c20, 0x27851: 0x6d010420, 0x27852: 0x6c1a8a20, - 0x2785b: 0x6c7d2420, - 0x2785f: 0x6c0d6220, - 0x27861: 0x6c90cc20, - 0x27865: 0x6d18fa20, 0x27866: 0x6c9da620, 0x27867: 0x6d024620, - 0x27871: 0x6c4a9c20, 0x27873: 0x6c955e20, - 0x27876: 0x6ccdce20, - 0x2787e: 0x6c717a20, 0x2787f: 0x6c318420, - // Block 0x9e2, offset 0x27880 - 0x27882: 0x6cfaf220, - 0x27885: 0x6d356020, - 0x27888: 0x6c0d9020, - 0x27895: 0x6d356220, 0x27896: 0x6d3bfa20, 0x27897: 0x6d092a20, - 0x27898: 0x6c893020, 0x27899: 0x6cdcb220, - 0x278a6: 0x6c808c20, 0x278a7: 0x6c72cc20, - 0x278a8: 0x6c9df220, 0x278a9: 0x6d0ab420, 0x278aa: 0x6d2ea020, 0x278ab: 0x6c4c0c20, - 0x278b2: 0x6d376820, - 0x278bd: 0x6cf12c20, 0x278be: 0x6cc36a20, 0x278bf: 0x6c14ac20, - // Block 0x9e3, offset 0x278c0 - 0x278c8: 0x6cc63020, 0x278ca: 0x6d272820, - 0x278cc: 0x6d3ece20, - 0x278d0: 0x6c965420, 0x278d1: 0x6c4b3620, 0x278d3: 0x6c19f420, - 0x278d5: 0x6c709e20, 0x278d6: 0x6ce4fe20, 0x278d7: 0x6ced9820, - 0x278db: 0x6d33d820, - 0x278de: 0x6ca42c20, - 0x278e3: 0x6c4db420, - 0x278e8: 0x6cf6b020, 0x278e9: 0x6c8bd420, - 0x278ec: 0x6d0c2e20, 0x278ed: 0x6d074220, - 0x278f2: 0x6c56d220, 0x278f3: 0x6c423620, - 0x278f4: 0x6d074c20, 0x278f6: 0x6cf90a20, - 0x278fa: 0x6c258420, - 0x278fd: 0x6cf92a20, 0x278fe: 0x6c560220, - // Block 0x9e4, offset 0x27900 - 0x27905: 0x6d0c4c20, - 0x2790e: 0x6d170e20, 0x2790f: 0x6c1b1a20, - 0x27910: 0x6c741c20, 0x27912: 0x6d40b220, - 0x2791c: 0x6c699420, 0x2791d: 0x6d178220, 0x2791f: 0x6ce05e20, - 0x27920: 0x6c1c1420, 0x27921: 0x6c037a20, 0x27922: 0x6ce82820, 0x27923: 0x6d3f7a20, - 0x27924: 0x6cc05420, 0x27927: 0x6c1c1620, - 0x27928: 0x6cf7e020, - 0x27930: 0x6ca69c20, 0x27932: 0x6c241420, - 0x27934: 0x6cf44820, 0x27936: 0x6c1f4820, 0x27937: 0x6cda4e20, - 0x27938: 0x6d1df820, 0x27939: 0x6c71bc20, 0x2793a: 0x6c037e20, - 0x2793c: 0x6c229c20, 0x2793d: 0x6c2c6420, 0x2793e: 0x6cac9820, 0x2793f: 0x6c1c2620, - // Block 0x9e5, offset 0x27940 - 0x27941: 0x6cc0ac20, 0x27943: 0x6d0ca420, - 0x2794d: 0x6d2d2e20, - 0x27952: 0x6cfce220, 0x27953: 0x6c084620, - 0x27954: 0x6c7ba620, 0x27955: 0x6cb7a820, 0x27956: 0x6d389220, 0x27957: 0x6c713820, - 0x27958: 0x6cbcca20, 0x27959: 0x6ca13420, 0x2795a: 0x6d258c20, - 0x2795c: 0x6c4b5820, 0x2795d: 0x6d417220, - 0x27967: 0x6cbccc20, - 0x27970: 0x6c558a20, 0x27971: 0x6cc08820, 0x27972: 0x6c4d2220, 0x27973: 0x6c402c20, - 0x27974: 0x6c812a20, 0x27975: 0x6ccc6c20, 0x27976: 0x6cf68820, 0x27977: 0x6c101c20, - 0x27978: 0x6cd3ba20, 0x27979: 0x6d1e5220, 0x2797a: 0x6c49f020, - 0x2797c: 0x6ca85420, 0x2797f: 0x6c545820, - // Block 0x9e6, offset 0x27980 - 0x2798a: 0x6c9d7220, - 0x2798e: 0x6c369420, 0x2798f: 0x6cfb8a20, - 0x27990: 0x6d280020, 0x27991: 0x6d073220, 0x27992: 0x6cbde420, 0x27993: 0x6c301220, - 0x27994: 0x6c838220, 0x27995: 0x6cb7ca20, 0x27996: 0x6c7fb020, 0x27997: 0x6c3ee420, - 0x27998: 0x6cb71420, 0x27999: 0x6c1d3e20, - 0x2799c: 0x6c245c20, 0x2799f: 0x6ca16620, - 0x279a0: 0x6c06b820, - 0x279a4: 0x6c2a2e20, - 0x279a8: 0x6c6b3a20, 0x279a9: 0x6c1d5c20, 0x279aa: 0x6c1c7620, 0x279ab: 0x6d23f820, - 0x279ac: 0x6c24ee20, 0x279ad: 0x6cdb2620, 0x279ae: 0x6ce42420, 0x279af: 0x6cd61020, - 0x279b0: 0x6d2c4c20, 0x279b1: 0x6c3ef820, 0x279b3: 0x6c184620, - 0x279b4: 0x6c3d0c20, 0x279b5: 0x6c543220, 0x279b6: 0x6d2c4e20, - // Block 0x9e7, offset 0x279c0 - 0x279c4: 0x6c6b3c20, 0x279c5: 0x6d2c5020, 0x279c6: 0x6d2d9c20, - 0x279c9: 0x6d0dde20, 0x279ca: 0x6c4d3020, 0x279cb: 0x6cf48220, - 0x279cc: 0x6c576220, 0x279cd: 0x6c2cde20, 0x279ce: 0x6d115420, 0x279cf: 0x6cd9ec20, - 0x279d0: 0x6cb92c20, 0x279d1: 0x6c60cc20, 0x279d2: 0x6d04aa20, 0x279d3: 0x6cb7f020, - 0x279d4: 0x6c758420, 0x279d6: 0x6c4d3220, - 0x279de: 0x6d0dee20, 0x279df: 0x6c6b6820, - 0x279e0: 0x6c24f420, 0x279e2: 0x6ce96a20, 0x279e3: 0x6d2ee620, - 0x279e4: 0x6cb16c20, 0x279e5: 0x6c930e20, 0x279e6: 0x6d342020, 0x279e7: 0x6c1f8820, - 0x279e8: 0x6c9da820, 0x279e9: 0x6cbaec20, 0x279eb: 0x6c892420, - 0x279f2: 0x6c86dc20, - 0x279f6: 0x6c359a20, 0x279f7: 0x6cdb5820, - 0x279f8: 0x6c74f020, 0x279fb: 0x6c717c20, - 0x279fc: 0x6ce03a20, 0x279fd: 0x6c8a4820, 0x279fe: 0x6cca0a20, 0x279ff: 0x6c309220, - // Block 0x9e8, offset 0x27a00 - 0x27a01: 0x6d28d420, 0x27a02: 0x6d34b220, - 0x27a06: 0x6d08ca20, 0x27a07: 0x6c8d8620, - 0x27a0a: 0x6c2abe20, - 0x27a0d: 0x6d2dbe20, 0x27a0e: 0x6d07f020, 0x27a0f: 0x6cbdf220, - 0x27a10: 0x6c69da20, 0x27a11: 0x6cb0da20, - 0x27a14: 0x6c4e6e20, - 0x27a1a: 0x6d21f220, 0x27a1b: 0x6c4ca420, - 0x27a1d: 0x6d0a5420, - 0x27a20: 0x6d0a5620, 0x27a21: 0x6c156c20, 0x27a22: 0x6c6b8020, 0x27a23: 0x6c719420, - 0x27a24: 0x6d0e1820, 0x27a25: 0x6c31f620, 0x27a27: 0x6c53e020, - 0x27a28: 0x6cfd4a20, 0x27a29: 0x6d0a5820, - 0x27a2e: 0x6c8db020, 0x27a2f: 0x6c6b8620, - 0x27a30: 0x6d197e20, 0x27a31: 0x6cc22a20, 0x27a32: 0x6c41c020, 0x27a33: 0x6c3c8c20, - 0x27a35: 0x6c753820, 0x27a36: 0x6cc16e20, - 0x27a3b: 0x6c6fe020, - 0x27a3d: 0x6c61ba20, 0x27a3e: 0x6c612c20, - // Block 0x9e9, offset 0x27a40 - 0x27a45: 0x6cf77420, 0x27a46: 0x6cacd220, - 0x27a48: 0x6c7bf020, 0x27a49: 0x6c7a8e20, 0x27a4b: 0x6c7a9020, - 0x27a4c: 0x6d2cbe20, 0x27a4f: 0x6c03b220, - 0x27a52: 0x6c190220, 0x27a53: 0x6c569820, - 0x27a54: 0x6caa6220, 0x27a55: 0x6c356220, 0x27a56: 0x6d046a20, 0x27a57: 0x6c33ce20, - 0x27a58: 0x6cd10020, 0x27a59: 0x6cecdc20, 0x27a5a: 0x6c3b2e20, - 0x27a5d: 0x6cf60420, 0x27a5e: 0x6d3e2e20, - 0x27a60: 0x6c569a20, - 0x27a65: 0x6c0cea20, 0x27a67: 0x6ceba620, - 0x27a68: 0x6c04cc20, 0x27a69: 0x6c43e420, 0x27a6b: 0x6c77f620, - 0x27a72: 0x6d3c8c20, 0x27a73: 0x6c3e9220, - 0x27a74: 0x6ca12020, 0x27a75: 0x6c63c620, 0x27a76: 0x6ceb2620, 0x27a77: 0x6d235a20, - 0x27a79: 0x6ca24620, 0x27a7a: 0x6c745e20, 0x27a7b: 0x6c712820, - 0x27a7c: 0x6c486220, 0x27a7d: 0x6cb35a20, - // Block 0x9ea, offset 0x27a80 - 0x27a80: 0x6ca63c20, - 0x27a84: 0x6cec1e20, 0x27a85: 0x6d0d9620, - 0x27a94: 0x6c1e2c20, 0x27a95: 0x6c7ba820, 0x27a96: 0x6c4d7020, - 0x27a98: 0x6cfdd020, 0x27a99: 0x6cf65c20, 0x27a9b: 0x6c25a820, - 0x27a9c: 0x6ce6fe20, 0x27a9d: 0x6cc92420, 0x27a9f: 0x6c345820, - 0x27aa0: 0x6c182a20, - 0x27aa4: 0x6c833820, 0x27aa5: 0x6d3e6420, 0x27aa7: 0x6d332420, - 0x27aa8: 0x6d426c20, 0x27aab: 0x6c773020, - 0x27aac: 0x6d293a20, 0x27aae: 0x6d250020, 0x27aaf: 0x6cbf4620, - 0x27ab3: 0x6c381820, - 0x27ab4: 0x6d0a2220, 0x27ab6: 0x6c622e20, - 0x27ab8: 0x6c13a620, - // Block 0x9eb, offset 0x27ac0 - 0x27ac0: 0x6cd4fe20, 0x27ac1: 0x6d08a820, 0x27ac2: 0x6d00d220, 0x27ac3: 0x6ce2f820, - 0x27ac4: 0x6c4ef220, 0x27ac5: 0x6cfac020, 0x27ac6: 0x6ccd0420, 0x27ac7: 0x6cea8c20, - 0x27ac8: 0x6c4f8420, 0x27ac9: 0x6c7dbc20, 0x27aca: 0x6c133620, 0x27acb: 0x6c30bc20, - 0x27acc: 0x6caac620, 0x27acd: 0x6d0e9a20, 0x27ace: 0x6c1a2c20, 0x27acf: 0x6cb40a20, - 0x27ad0: 0x6cb7ba20, 0x27ad1: 0x6d26d420, 0x27ad2: 0x6c3d8c20, - 0x27ad7: 0x6ce6dc20, - 0x27adf: 0x6cf2c220, - 0x27ae0: 0x6cd11220, 0x27ae1: 0x6ceb8c20, - 0x27af4: 0x6ce06a20, 0x27af6: 0x6d0b6020, 0x27af7: 0x6d36ca20, - 0x27af8: 0x6c92be20, 0x27af9: 0x6d0dd020, 0x27afa: 0x6c70c220, - 0x27afd: 0x6c2a8020, 0x27aff: 0x6c1f7020, - // Block 0x9ec, offset 0x27b00 - 0x27b00: 0x6d412620, 0x27b01: 0x6c369620, 0x27b02: 0x6d349620, 0x27b03: 0x6caec020, - 0x27b05: 0x6c0cbe20, 0x27b07: 0x6c2c0220, - 0x27b10: 0x6c7f2820, 0x27b12: 0x6d133020, - 0x27b1c: 0x6c4fe620, 0x27b1d: 0x6cac7420, 0x27b1e: 0x6ce0ae20, 0x27b1f: 0x6c774a20, - 0x27b20: 0x6d05ea20, 0x27b21: 0x6d408e20, 0x27b22: 0x6c628c20, 0x27b23: 0x6cf52620, - 0x27b26: 0x6c204020, - 0x27b29: 0x6cb3a420, 0x27b2a: 0x6d0dd620, 0x27b2b: 0x6cebb420, - 0x27b2d: 0x6c31b820, 0x27b2f: 0x6cb13020, - 0x27b30: 0x6c1c7820, 0x27b31: 0x6c5d4420, 0x27b32: 0x6cb26820, - 0x27b34: 0x6c235c20, 0x27b35: 0x6d2c9620, - 0x27b3a: 0x6cec9e20, - 0x27b3f: 0x6cec6620, - // Block 0x9ed, offset 0x27b40 - 0x27b43: 0x6c36ae20, - 0x27b44: 0x6cf0da20, 0x27b45: 0x6c040420, 0x27b47: 0x6c678020, - 0x27b53: 0x6c140a20, - 0x27b55: 0x6c1f8220, 0x27b56: 0x6c7af220, 0x27b57: 0x6ce2bc20, - 0x27b58: 0x6d406a20, 0x27b59: 0x6c86ac20, 0x27b5a: 0x6cdeb220, 0x27b5b: 0x6cc9a420, - 0x27b5e: 0x6cac7a20, 0x27b5f: 0x6cac7c20, - 0x27b63: 0x6ccb0020, - 0x27b64: 0x6cbbba20, - 0x27b6d: 0x6d40e220, 0x27b6f: 0x6d371820, - 0x27b70: 0x6d0de020, 0x27b72: 0x6c6b4820, 0x27b73: 0x6ca5aa20, - // Block 0x9ee, offset 0x27b80 - 0x27b84: 0x6c944420, 0x27b85: 0x6cc15220, 0x27b87: 0x6c2af220, - 0x27b88: 0x6c897620, 0x27b89: 0x6c15f220, 0x27b8a: 0x6cbcf820, 0x27b8b: 0x6c912220, - 0x27b8c: 0x6c2efe20, 0x27b8d: 0x6c24f620, - 0x27b90: 0x6c615c20, 0x27b93: 0x6c178420, - 0x27b94: 0x6cd69a20, 0x27b95: 0x6d40f220, 0x27b97: 0x6c775a20, - 0x27b9a: 0x6cbaf020, 0x27b9b: 0x6c847820, - 0x27bae: 0x6cd65e20, 0x27baf: 0x6d243e20, - 0x27bb0: 0x6d2ee820, 0x27bb1: 0x6c82f220, - // Block 0x9ef, offset 0x27bc0 - 0x27bc5: 0x6cb33e20, - 0x27bca: 0x6d30b620, 0x27bcb: 0x6d001e20, - 0x27bcd: 0x6ce08620, 0x27bce: 0x6c258620, 0x27bcf: 0x6c7fdc20, - 0x27bd1: 0x6d060220, 0x27bd2: 0x6cd62820, 0x27bd3: 0x6d2c9c20, - 0x27bd4: 0x6c11ba20, 0x27bd7: 0x6c08fe20, - 0x27bd8: 0x6caf1c20, - 0x27bdd: 0x6c1a5620, - 0x27be3: 0x6cbc0c20, - 0x27be4: 0x6c5f8620, - 0x27bea: 0x6d2d0420, - 0x27bec: 0x6c7fde20, - // Block 0x9f0, offset 0x27c00 - 0x27c01: 0x6ce52820, 0x27c02: 0x6cc9b020, 0x27c03: 0x6c6c6e20, - 0x27c04: 0x6d3b4020, 0x27c05: 0x6c352220, 0x27c07: 0x6c145620, - 0x27c08: 0x6c73a020, 0x27c09: 0x6ce16220, 0x27c0a: 0x6c086420, - 0x27c0c: 0x6c38e820, 0x27c0d: 0x6c8b6820, 0x27c0e: 0x6d2b6e20, 0x27c0f: 0x6cdcb420, - 0x27c19: 0x6ccb8c20, - 0x27c27: 0x6d375c20, - 0x27c28: 0x6ce9d420, 0x27c2a: 0x6cbe5e20, - 0x27c2c: 0x6c21e620, - 0x27c30: 0x6cdee620, 0x27c31: 0x6c0e3c20, 0x27c32: 0x6cf1f620, - 0x27c35: 0x6cb36220, - 0x27c3d: 0x6ca09a20, 0x27c3e: 0x6c10e420, - // Block 0x9f1, offset 0x27c40 - 0x27c41: 0x6c7c2020, 0x27c43: 0x6c260220, - 0x27c44: 0x6cc54420, 0x27c45: 0x6c068020, 0x27c46: 0x6c7f8020, - 0x27c4d: 0x6ca75220, 0x27c4e: 0x6c84c220, - 0x27c55: 0x6c697220, 0x27c56: 0x6c919e20, 0x27c57: 0x6c879620, - 0x27c58: 0x6c900820, 0x27c59: 0x6c4baa20, - 0x27c5d: 0x6c161c20, - 0x27c64: 0x6cfb1820, 0x27c66: 0x6c165620, - 0x27c68: 0x6d029020, 0x27c69: 0x6d2ea820, - 0x27c6f: 0x6cd6c620, - 0x27c7b: 0x6c9d1220, - 0x27c7c: 0x6c947420, 0x27c7d: 0x6c965620, - // Block 0x9f2, offset 0x27c80 - 0x27c80: 0x6c2d0220, - 0x27c88: 0x6c2f2820, 0x27c8a: 0x6cecb220, 0x27c8b: 0x6d274620, - 0x27c8c: 0x6c948620, 0x27c8e: 0x6c948a20, - 0x27c93: 0x6c837220, - 0x27c95: 0x6cec6020, 0x27c96: 0x6c2f3e20, 0x27c97: 0x6ca59620, - 0x27c98: 0x6cceb220, 0x27c99: 0x6d019e20, 0x27c9a: 0x6cafe820, - 0x27ca5: 0x6c98dc20, 0x27ca7: 0x6d1ade20, - 0x27ca9: 0x6c0f0a20, 0x27cab: 0x6d3b0220, - 0x27cae: 0x6c1cc820, - 0x27cb6: 0x6ca24820, 0x27cb7: 0x6ceb2820, - 0x27cb9: 0x6ce7be20, 0x27cba: 0x6d128820, - // Block 0x9f3, offset 0x27cc0 - 0x27cc1: 0x6c5a7220, 0x27cc3: 0x6cc60020, - 0x27cc5: 0x6d130620, - 0x27ccb: 0x6ceb3a20, - 0x27cd6: 0x6d413a20, 0x27cd7: 0x6d23d220, - 0x27cda: 0x6c000c20, - 0x27cdc: 0x6d38a420, 0x27cdd: 0x6cec9c20, - 0x27ce1: 0x6c34ae20, 0x27ce2: 0x6d384420, 0x27ce3: 0x6c4cfc20, - 0x27ce4: 0x6c5a0420, 0x27ce5: 0x6c9e6220, - 0x27ce9: 0x6c211a20, 0x27cea: 0x6cbce420, 0x27ceb: 0x6c45b220, - 0x27cec: 0x6ce69420, 0x27ced: 0x6c9a2a20, - 0x27cf1: 0x6ce1a420, - 0x27cf4: 0x6cc6c420, 0x27cf7: 0x6cc6c620, - 0x27cf8: 0x6cb66420, 0x27cf9: 0x6c4c9a20, - 0x27cfd: 0x6cfe6220, 0x27cfe: 0x6ce4ca20, - // Block 0x9f4, offset 0x27d00 - 0x27d05: 0x6cff4020, - 0x27d08: 0x6d2db620, 0x27d09: 0x6c258820, - 0x27d14: 0x6c7ffc20, - 0x27d18: 0x6cd02e20, 0x27d1a: 0x6c830e20, 0x27d1b: 0x6c879820, - 0x27d1d: 0x6c14e620, 0x27d1e: 0x6ca8d020, 0x27d1f: 0x6c947620, - 0x27d21: 0x6ce63a20, 0x27d22: 0x6c5ba620, - 0x27d27: 0x6c458020, - 0x27d30: 0x6cb77220, 0x27d31: 0x6d20fa20, 0x27d33: 0x6d02d220, - 0x27d38: 0x6d26ae20, 0x27d39: 0x6c034e20, 0x27d3a: 0x6c276a20, 0x27d3b: 0x6c5eba20, - 0x27d3c: 0x6d089220, 0x27d3f: 0x6c743c20, - // Block 0x9f5, offset 0x27d40 - 0x27d40: 0x6ca99420, - 0x27d48: 0x6c325220, 0x27d49: 0x6c602620, - 0x27d50: 0x6cabc820, 0x27d51: 0x6c45f020, 0x27d52: 0x6c07ba20, - 0x27d54: 0x6c794220, 0x27d55: 0x6d105020, 0x27d56: 0x6c8f0820, 0x27d57: 0x6ca5ee20, - 0x27d58: 0x6d2cca20, 0x27d59: 0x6d1b5c20, 0x27d5a: 0x6ca72820, 0x27d5b: 0x6cad9020, - 0x27d5d: 0x6c458e20, 0x27d5e: 0x6c109e20, 0x27d5f: 0x6c512e20, - 0x27d60: 0x6cc71220, 0x27d61: 0x6c4b5020, - 0x27d65: 0x6c09b620, 0x27d66: 0x6cf63020, 0x27d67: 0x6c712a20, - 0x27d68: 0x6c5cf420, 0x27d69: 0x6c09e420, 0x27d6b: 0x6ce56420, - 0x27d6c: 0x6d332820, 0x27d6f: 0x6d181020, - 0x27d70: 0x6c22d220, 0x27d72: 0x6c0e2620, - 0x27d77: 0x6c459c20, - 0x27d7a: 0x6c381a20, - 0x27d7d: 0x6d0fce20, 0x27d7e: 0x6d064820, - // Block 0x9f6, offset 0x27d80 - 0x27d81: 0x6c52b620, - 0x27d84: 0x6d2a0a20, 0x27d85: 0x6c148420, 0x27d86: 0x6c537620, - 0x27d88: 0x6ce4b820, - 0x27d8c: 0x6d340a20, 0x27d8d: 0x6d039220, 0x27d8e: 0x6d062220, - 0x27d91: 0x6d325820, - 0x27d94: 0x6ced4020, - 0x27d98: 0x6c75dc20, - 0x27d9d: 0x6cf30c20, - 0x27da0: 0x6c92c220, 0x27da2: 0x6d32f220, 0x27da3: 0x6cc71a20, - 0x27da4: 0x6c1a3c20, 0x27da5: 0x6c3ee620, 0x27da7: 0x6c369820, - 0x27da8: 0x6ce1e620, 0x27da9: 0x6ce12e20, 0x27dab: 0x6c730020, - 0x27dac: 0x6c17c020, 0x27dad: 0x6cde9620, 0x27dae: 0x6c2c0420, - 0x27db0: 0x6d3fc020, 0x27db3: 0x6c794c20, - 0x27db4: 0x6ce99820, 0x27db6: 0x6c794e20, - // Block 0x9f7, offset 0x27dc0 - 0x27dc5: 0x6cc71c20, 0x27dc6: 0x6d276420, 0x27dc7: 0x6c517a20, - 0x27dc8: 0x6d400820, 0x27dc9: 0x6c235e20, 0x27dca: 0x6cbfcc20, - 0x27dce: 0x6ca2b420, 0x27dcf: 0x6c346420, - 0x27dd0: 0x6d065a20, 0x27dd1: 0x6c795620, 0x27dd2: 0x6cfd1220, - 0x27ddb: 0x6c31ba20, - 0x27ddc: 0x6c76ee20, 0x27dde: 0x6d1bf020, - 0x27de2: 0x6d3e9620, - 0x27de7: 0x6c5a0620, - 0x27de9: 0x6caed020, 0x27deb: 0x6c86ae20, - 0x27ded: 0x6c0f8220, 0x27dee: 0x6c444420, 0x27def: 0x6c716620, - 0x27df0: 0x6c783420, 0x27df2: 0x6c55ce20, 0x27df3: 0x6d115820, - 0x27df4: 0x6ce14820, 0x27df6: 0x6cbf7020, 0x27df7: 0x6cc72820, - 0x27df8: 0x6c8f1e20, 0x27df9: 0x6c5c5e20, 0x27dfa: 0x6c5f6220, - // Block 0x9f8, offset 0x27e00 - 0x27e09: 0x6d371a20, 0x27e0b: 0x6ce15220, - 0x27e0c: 0x6d355c20, 0x27e0d: 0x6c775e20, - 0x27e14: 0x6d107220, 0x27e16: 0x6ce18420, 0x27e17: 0x6c52d820, - 0x27e1b: 0x6c897820, - 0x27e1d: 0x6c12a020, - 0x27e21: 0x6ca3aa20, 0x27e22: 0x6d400e20, - 0x27e24: 0x6c2af420, 0x27e26: 0x6c68a220, 0x27e27: 0x6caeec20, - 0x27e29: 0x6c49fa20, 0x27e2a: 0x6c377420, 0x27e2b: 0x6c670620, - 0x27e2c: 0x6c69d220, 0x27e2d: 0x6caaca20, 0x27e2e: 0x6d2a6220, - 0x27e33: 0x6caef620, - 0x27e34: 0x6c292020, 0x27e36: 0x6cc1f620, 0x27e37: 0x6c889620, - 0x27e38: 0x6ca2be20, 0x27e39: 0x6c805220, - 0x27e3e: 0x6c3baa20, - // Block 0x9f9, offset 0x27e40 - 0x27e42: 0x6c5d0e20, - 0x27e46: 0x6c7bb420, - 0x27e48: 0x6d1b2a20, 0x27e49: 0x6cd69c20, 0x27e4a: 0x6c671e20, - 0x27e52: 0x6c964420, - 0x27e54: 0x6c933c20, - 0x27e5a: 0x6c446a20, 0x27e5b: 0x6cc51220, - 0x27e5e: 0x6cb22e20, - 0x27e60: 0x6c900a20, - 0x27e64: 0x6d320c20, 0x27e65: 0x6cfd4c20, - 0x27e68: 0x6c8c8e20, 0x27e69: 0x6c88aa20, 0x27e6a: 0x6ccd2420, 0x27e6b: 0x6c0fd420, - 0x27e6c: 0x6c87a820, - 0x27e73: 0x6d013a20, - 0x27e74: 0x6c446e20, 0x27e75: 0x6c9fe020, 0x27e76: 0x6c88ae20, - 0x27e79: 0x6c753c20, 0x27e7a: 0x6d38c820, - 0x27e7f: 0x6c784820, - // Block 0x9fa, offset 0x27e80 - 0x27e81: 0x6c2f2a20, 0x27e83: 0x6d30ce20, - 0x27e85: 0x6cd4ac20, 0x27e86: 0x6c5e9020, 0x27e87: 0x6c8f7c20, - 0x27e88: 0x6c49ea20, 0x27e89: 0x6d2a5620, 0x27e8a: 0x6cfd4420, 0x27e8b: 0x6cb8ae20, - 0x27e8d: 0x6ccfd820, - 0x27e90: 0x6d1ae020, 0x27e91: 0x6c6be420, - 0x27e94: 0x6ccffe20, 0x27e95: 0x6cd00020, 0x27e96: 0x6cc95220, - 0x27e9b: 0x6cf8c020, - 0x27ea1: 0x6c7aac20, 0x27ea3: 0x6cc1c620, - 0x27ea5: 0x6c443e20, 0x27ea6: 0x6c050820, - 0x27ea8: 0x6c0a7c20, 0x27ea9: 0x6cb92e20, - 0x27eb0: 0x6c0d6420, 0x27eb1: 0x6c050a20, 0x27eb3: 0x6d42ae20, - 0x27eb4: 0x6cb0d020, 0x27eb6: 0x6c5e3620, - 0x27ebe: 0x6c051020, - // Block 0x9fb, offset 0x27ec0 - 0x27eca: 0x6ca9d820, - 0x27ecc: 0x6c18fc20, 0x27ece: 0x6cae4e20, - 0x27ed1: 0x6c3f2e20, 0x27ed2: 0x6ce88220, - 0x27edc: 0x6cb04e20, 0x27edd: 0x6cb36420, - 0x27ee0: 0x6c1b7420, 0x27ee3: 0x6d093e20, - 0x27ee4: 0x6cb74020, 0x27ee5: 0x6cf4b220, - 0x27ee8: 0x6d357e20, 0x27ee9: 0x6c2c1c20, 0x27eea: 0x6c22fe20, 0x27eeb: 0x6d1ef420, - 0x27ef9: 0x6c230020, - 0x27efc: 0x6c2c1e20, 0x27efd: 0x6d3d2620, 0x27eff: 0x6d408020, - // Block 0x9fc, offset 0x27f00 - 0x27f00: 0x6c238c20, 0x27f03: 0x6caca820, - 0x27f04: 0x6d0d4c20, 0x27f05: 0x6cb74e20, 0x27f06: 0x6cc6fa20, 0x27f07: 0x6c63a420, - 0x27f09: 0x6d359220, 0x27f0a: 0x6cc00e20, 0x27f0b: 0x6d268a20, - 0x27f0d: 0x6cd32420, - 0x27f11: 0x6c4fc020, - 0x27f19: 0x6ceab220, - 0x27f1c: 0x6c0cde20, 0x27f1e: 0x6c770020, - 0x27f22: 0x6c21aa20, - 0x27f24: 0x6c229020, 0x27f26: 0x6d1ad020, 0x27f27: 0x6cd34c20, - 0x27f28: 0x6ca3b820, 0x27f29: 0x6cc85820, 0x27f2b: 0x6d0f9e20, - 0x27f2c: 0x6c1a9820, 0x27f2e: 0x6c21f820, - 0x27f31: 0x6c457620, 0x27f32: 0x6c9c4220, - 0x27f34: 0x6c612e20, - 0x27f3c: 0x6c44b220, 0x27f3d: 0x6d2a6c20, - // Block 0x9fd, offset 0x27f40 - 0x27f41: 0x6c081420, - 0x27f47: 0x6d030c20, - 0x27f48: 0x6c7df020, 0x27f4a: 0x6c2e8e20, - 0x27f4d: 0x6ce66a20, - 0x27f5a: 0x6cd71c20, - 0x27f5e: 0x6c275620, - 0x27f66: 0x6c851020, - 0x27f68: 0x6d1e2820, 0x27f69: 0x6c684220, - 0x27f6c: 0x6cde0420, 0x27f6d: 0x6cc24620, 0x27f6e: 0x6d1a6020, 0x27f6f: 0x6d24e820, - 0x27f70: 0x6c6abc20, 0x27f72: 0x6cb8da20, 0x27f73: 0x6d10a020, - 0x27f74: 0x6d0ba620, 0x27f77: 0x6cbe4a20, - 0x27f7f: 0x6cadd420, - // Block 0x9fe, offset 0x27f80 - 0x27f97: 0x6c635820, - 0x27f99: 0x6ce82c20, 0x27f9b: 0x6ce2ec20, - 0x27fa1: 0x6c33f620, 0x27fa2: 0x6c15ba20, 0x27fa3: 0x6c636820, - 0x27fa4: 0x6c1c2820, 0x27fa5: 0x6c64aa20, 0x27fa6: 0x6cd5e020, - 0x27faf: 0x6cde5a20, - // Block 0x9ff, offset 0x27fc0 - 0x27fd5: 0x6d33ea20, 0x27fd7: 0x6d256e20, - 0x27fda: 0x6c54d420, - 0x27fdc: 0x6c8b1220, - 0x27fe0: 0x6d2ad420, 0x27fe2: 0x6c1f5e20, - 0x27fe6: 0x6cc0ba20, 0x27fe7: 0x6c07fa20, - 0x27ff9: 0x6c588620, 0x27ffa: 0x6c7aca20, 0x27ffb: 0x6cd10c20, - 0x27ffd: 0x6c6afe20, 0x27fff: 0x6cee2c20, - // Block 0xa00, offset 0x28000 - 0x28003: 0x6c54de20, - 0x2800a: 0x6d2ae620, 0x2800b: 0x6d297020, - 0x2800c: 0x6d106420, 0x2800e: 0x6c1bba20, 0x2800f: 0x6c701220, - 0x2801a: 0x6c89fe20, 0x2801b: 0x6d209620, - 0x28020: 0x6c0b4a20, 0x28022: 0x6c7bc820, - 0x2802c: 0x6c1e4a20, 0x2802d: 0x6d0b3620, 0x2802e: 0x6d3d8620, - 0x28030: 0x6cbcda20, 0x28031: 0x6cfcf020, 0x28033: 0x6d250620, - 0x28034: 0x6cf46e20, 0x28035: 0x6c693620, 0x28036: 0x6cfe5020, 0x28037: 0x6ccc7420, - 0x28039: 0x6d36cc20, - 0x2803c: 0x6c1d5a20, 0x2803e: 0x6c0b0620, 0x2803f: 0x6ceeb820, - // Block 0xa01, offset 0x28040 - 0x28053: 0x6c2a3220, - 0x2805d: 0x6d23d820, 0x2805e: 0x6ce9b820, - 0x28061: 0x6c17c220, - 0x28065: 0x6c5c4420, 0x28066: 0x6cba2620, - 0x28068: 0x6cf01a20, - 0x28070: 0x6d1f7420, - 0x2807c: 0x6c2ca020, 0x2807e: 0x6c26f620, - // Block 0xa02, offset 0x28080 - 0x28081: 0x6d1f7620, 0x28082: 0x6c702620, 0x28083: 0x6ce9bc20, - 0x28084: 0x6d297620, 0x28087: 0x6c5c6020, - 0x28089: 0x6ccc8220, - 0x2808c: 0x6c5e1020, - 0x28094: 0x6d115a20, - 0x28099: 0x6cfd1e20, - 0x2809e: 0x6cfd2020, - 0x280ac: 0x6c2caa20, 0x280ae: 0x6c703220, - 0x280b2: 0x6c5c7420, - 0x280b4: 0x6c77cc20, 0x280b5: 0x6d1f8420, - 0x280b8: 0x6c870e20, - 0x280bc: 0x6c201420, 0x280be: 0x6c1b6820, - // Block 0xa03, offset 0x280c0 - 0x280c0: 0x6c5e3820, 0x280c2: 0x6d1f9020, - 0x280c4: 0x6d270e20, - 0x280ce: 0x6cded820, 0x280cf: 0x6d29b420, - 0x280d3: 0x6ca8ac20, - 0x280d4: 0x6d3b4a20, - 0x280e1: 0x6cfc6220, - 0x280e9: 0x6cd22a20, 0x280eb: 0x6c79ca20, - 0x280ec: 0x6cb6c620, 0x280ed: 0x6ce91420, 0x280ee: 0x6c387e20, 0x280ef: 0x6c258e20, - 0x280f2: 0x6cea3820, 0x280f3: 0x6c137420, - 0x280f4: 0x6c110020, 0x280f5: 0x6cfe1420, 0x280f6: 0x6cadfc20, 0x280f7: 0x6c6e0220, - 0x280f8: 0x6cb56a20, 0x280f9: 0x6cceae20, 0x280fa: 0x6ca97420, 0x280fb: 0x6ca30420, - 0x280fd: 0x6cbd5020, - // Block 0xa04, offset 0x28100 - 0x2810d: 0x6c090c20, - 0x28113: 0x6c092420, - 0x28114: 0x6c05a220, 0x28115: 0x6c0b7620, 0x28116: 0x6d3e0220, 0x28117: 0x6ca30a20, - 0x28118: 0x6cf07020, 0x28119: 0x6c4fbe20, - 0x28121: 0x6c6c8220, 0x28123: 0x6d333c20, - 0x28127: 0x6cbc8220, - 0x2812e: 0x6c501620, 0x2812f: 0x6ce71e20, - 0x28130: 0x6d2a4020, 0x28131: 0x6cd15420, 0x28132: 0x6c25a420, 0x28133: 0x6c597e20, - 0x28134: 0x6cc78e20, 0x28135: 0x6d292e20, 0x28136: 0x6ca6f820, - 0x2813e: 0x6cfa8620, - // Block 0xa05, offset 0x28140 - 0x28148: 0x6cc2bc20, 0x28149: 0x6c619a20, 0x2814a: 0x6d1a3620, 0x2814b: 0x6c850620, - 0x2814c: 0x6c984620, 0x2814d: 0x6cceca20, 0x2814e: 0x6c4e8e20, 0x2814f: 0x6c260e20, - 0x28150: 0x6c759c20, 0x28151: 0x6c61bc20, 0x28152: 0x6c107820, 0x28153: 0x6c905420, - 0x28154: 0x6c3d2220, 0x28155: 0x6d1f0e20, 0x28156: 0x6c7b1c20, - 0x2815c: 0x6cfe2220, - 0x28161: 0x6d279420, 0x28163: 0x6cbd5e20, - 0x28164: 0x6c5b2c20, 0x28165: 0x6cb42e20, - 0x2816b: 0x6c83b220, - 0x2816c: 0x6cadcc20, 0x2816d: 0x6cd4c620, 0x2816e: 0x6c707620, 0x2816f: 0x6d14e020, - 0x28170: 0x6d32a820, 0x28171: 0x6c1d0e20, 0x28173: 0x6cf77620, - 0x28175: 0x6c561a20, 0x28176: 0x6cc74420, - // Block 0xa06, offset 0x28180 - 0x2818c: 0x6c590c20, 0x2818d: 0x6cbc3c20, 0x2818e: 0x6d33d020, 0x2818f: 0x6d1c6c20, - 0x28190: 0x6cf7e220, 0x28191: 0x6cbb7620, 0x28192: 0x6c61fa20, 0x28193: 0x6d32bc20, - 0x28194: 0x6c59b420, 0x28196: 0x6d210a20, 0x28197: 0x6d405a20, - 0x28198: 0x6c99f420, - 0x2819c: 0x6cd13220, - 0x281a9: 0x6cc2e620, - 0x281b0: 0x6c676020, 0x281b1: 0x6c512020, 0x281b3: 0x6ce75220, - 0x281b4: 0x6c513020, 0x281b5: 0x6cf15220, 0x281b6: 0x6d17cc20, 0x281b7: 0x6cacfe20, - 0x281ba: 0x6cf22620, 0x281bb: 0x6cb99820, - 0x281bc: 0x6c862020, 0x281bd: 0x6d150a20, 0x281be: 0x6c20ac20, 0x281bf: 0x6d06e820, - // Block 0xa07, offset 0x281c0 - 0x281c0: 0x6cefd020, - 0x281c6: 0x6c439420, - 0x281c8: 0x6d226220, 0x281cb: 0x6d2d4420, - 0x281cc: 0x6c41a220, 0x281cd: 0x6cb8f620, 0x281ce: 0x6c773220, 0x281cf: 0x6c840220, - 0x281d0: 0x6cd00220, 0x281d1: 0x6c499220, 0x281d3: 0x6cb17c20, - 0x281d6: 0x6c840420, - 0x281d8: 0x6c562620, 0x281db: 0x6ce8ce20, - 0x281dc: 0x6cd75620, 0x281de: 0x6c56aa20, 0x281df: 0x6c840620, - 0x281e2: 0x6c910a20, - 0x281e6: 0x6c297020, - 0x281e8: 0x6d42a420, 0x281e9: 0x6cccf620, 0x281eb: 0x6ccf6e20, - 0x281ed: 0x6c3cb620, 0x281ee: 0x6c726e20, 0x281ef: 0x6ce76e20, - 0x281f0: 0x6c691a20, 0x281f1: 0x6cbbe620, 0x281f2: 0x6c42d420, 0x281f3: 0x6d3e7020, - 0x281f4: 0x6c59e620, 0x281f5: 0x6ccd0620, - 0x281f8: 0x6cdff620, - // Block 0xa08, offset 0x28200 - 0x2820c: 0x6ceaca20, 0x2820e: 0x6c8e2220, - 0x28210: 0x6c1a2e20, 0x28211: 0x6cf27020, 0x28212: 0x6d425020, 0x28213: 0x6d23da20, - 0x28215: 0x6d3a2220, 0x28217: 0x6cc45420, - 0x28218: 0x6cf80a20, 0x28219: 0x6cc1b620, 0x2821b: 0x6c442820, - 0x28222: 0x6cb52a20, 0x28223: 0x6d05e020, - 0x28228: 0x6c415220, 0x28229: 0x6cc3f820, 0x2822a: 0x6c1ddc20, 0x2822b: 0x6c9b4e20, - 0x28232: 0x6cd02020, 0x28233: 0x6cc1c820, - 0x28236: 0x6cbbb420, 0x28237: 0x6c11b420, - 0x2823a: 0x6c86b020, - 0x2823c: 0x6ceda220, 0x2823d: 0x6c826620, 0x2823e: 0x6d03a820, 0x2823f: 0x6c80ea20, - // Block 0xa09, offset 0x28240 - 0x28242: 0x6cd3ec20, 0x28243: 0x6d330020, - 0x28244: 0x6c38ce20, - 0x2824a: 0x6d371c20, - 0x2824f: 0x6d1aa420, - 0x28251: 0x6c86de20, - 0x28256: 0x6ca08820, 0x28257: 0x6cf04020, - 0x28259: 0x6d1c1020, 0x2825a: 0x6cc4e420, - 0x28260: 0x6cc2a820, - 0x28265: 0x6c95ce20, - 0x28272: 0x6c275820, - 0x28274: 0x6d1b4e20, 0x28275: 0x6c08da20, 0x28276: 0x6c438820, - 0x28278: 0x6cf20a20, 0x28279: 0x6d0d7620, 0x2827a: 0x6c9e1e20, - 0x2827c: 0x6c42a020, 0x2827d: 0x6cc05620, 0x2827e: 0x6d33da20, - // Block 0xa0a, offset 0x28280 - 0x2828b: 0x6c471c20, - 0x2828c: 0x6ce75420, 0x2828e: 0x6c8d1420, 0x2828f: 0x6ce33620, - 0x28290: 0x6c224c20, 0x28291: 0x6d150c20, 0x28292: 0x6c395a20, 0x28293: 0x6cb31220, - 0x28294: 0x6c09b820, 0x28296: 0x6c064e20, - 0x2829f: 0x6cae7620, - 0x282a1: 0x6cdb8420, - 0x282a4: 0x6cd92820, 0x282a5: 0x6cef1a20, 0x282a6: 0x6cff9220, - 0x282ac: 0x6c504c20, 0x282ad: 0x6d0dac20, - 0x282b6: 0x6d152620, 0x282b7: 0x6d2a1e20, - 0x282b8: 0x6d1d0020, 0x282b9: 0x6ca43220, - 0x282bf: 0x6d289620, - // Block 0xa0b, offset 0x282c0 - 0x282c1: 0x6ce50c20, 0x282c2: 0x6cf68a20, 0x282c3: 0x6c69b420, - 0x282c4: 0x6d0cbc20, - 0x282cc: 0x6ca55e20, 0x282cd: 0x6ce07020, 0x282ce: 0x6d0eaa20, 0x282cf: 0x6ce51a20, - 0x282d0: 0x6d36ce20, 0x282d1: 0x6c1d7a20, 0x282d2: 0x6ce23a20, - 0x282d7: 0x6d2cdc20, - 0x282de: 0x6c9e3a20, - 0x282e1: 0x6cf47020, 0x282e2: 0x6d1b0220, 0x282e3: 0x6d0eac20, - 0x282e4: 0x6c81ba20, - 0x282e9: 0x6cb31e20, 0x282eb: 0x6c5d4620, - 0x282ec: 0x6c4d4620, 0x282ed: 0x6ca21a20, 0x282ee: 0x6c236020, - 0x282f1: 0x6c7aae20, 0x282f2: 0x6c1d8420, - 0x282f4: 0x6d1ff020, - 0x282f8: 0x6d3da020, 0x282fb: 0x6cd9e420, - // Block 0xa0c, offset 0x28300 - 0x28302: 0x6d1b7e20, - 0x28305: 0x6d41da20, 0x28306: 0x6cca7420, 0x28307: 0x6c8f4a20, - 0x28308: 0x6c4f2020, 0x28309: 0x6cf0ec20, 0x2830a: 0x6c9b6020, 0x2830b: 0x6c55d020, - 0x2830c: 0x6c86b220, 0x2830e: 0x6c9d9c20, - 0x28310: 0x6c054020, 0x28311: 0x6c65f020, - 0x2831c: 0x6cc40620, - 0x28320: 0x6c9b6220, 0x28322: 0x6ca21c20, 0x28323: 0x6c53ac20, - 0x28324: 0x6c56d820, 0x28325: 0x6c9c8e20, 0x28326: 0x6ccca820, - 0x28329: 0x6cce2620, 0x2832a: 0x6c17c620, - 0x2832c: 0x6d3dc220, 0x2832e: 0x6d342220, 0x2832f: 0x6ca77020, - 0x28335: 0x6c62b220, - 0x28338: 0x6c784020, 0x28339: 0x6d330620, - 0x2833f: 0x6c281420, - // Block 0xa0d, offset 0x28340 - 0x28340: 0x6c8a8220, 0x28341: 0x6d2e3020, 0x28342: 0x6c460620, 0x28343: 0x6c818c20, - 0x28344: 0x6c571e20, 0x28345: 0x6c1fd220, 0x28347: 0x6c660c20, - 0x28348: 0x6c7d3220, - 0x2834d: 0x6ccf0220, - 0x28354: 0x6c191c20, 0x28355: 0x6ce08820, 0x28357: 0x6c55f820, - 0x28358: 0x6c9b9e20, 0x28359: 0x6cada420, 0x2835a: 0x6d2e3820, 0x2835b: 0x6c16d620, - 0x2835d: 0x6c41f820, - 0x28360: 0x6d193a20, 0x28362: 0x6cdcb620, - 0x28366: 0x6d076420, 0x28367: 0x6c62de20, - 0x28368: 0x6c808e20, - 0x2836c: 0x6d159620, 0x2836f: 0x6c9dae20, - 0x28371: 0x6c9f1420, - 0x28375: 0x6c24a620, - 0x28378: 0x6c805a20, 0x2837b: 0x6d0c4e20, - 0x2837e: 0x6c9ccc20, - // Block 0xa0e, offset 0x28380 - 0x28382: 0x6d1e6820, 0x28383: 0x6c125420, - 0x28384: 0x6c664420, 0x28387: 0x6cda0a20, - 0x2838e: 0x6d0d2a20, - 0x28391: 0x6c736020, - 0x28395: 0x6c369c20, - 0x28398: 0x6c3bf220, 0x2839a: 0x6c3bf620, - 0x283a1: 0x6c4a2a20, 0x283a2: 0x6c96fc20, - 0x283a4: 0x6c8ab820, - 0x283a9: 0x6c1cca20, 0x283ab: 0x6c840820, - 0x283b1: 0x6d349c20, - 0x283b4: 0x6d024820, 0x283b7: 0x6c1dfc20, - 0x283b9: 0x6c60fc20, - 0x283bd: 0x6caf5c20, - // Block 0xa0f, offset 0x283c0 - 0x283c2: 0x6c6abe20, - 0x283c7: 0x6d38e420, - 0x283cd: 0x6d046c20, - 0x283d1: 0x6c7bfc20, - 0x283d9: 0x6c6e2220, 0x283db: 0x6c56a020, - 0x283de: 0x6cb99c20, - 0x283e3: 0x6c133220, - 0x283e6: 0x6cb60420, 0x283e7: 0x6ced3220, - 0x283e8: 0x6c98ec20, 0x283ea: 0x6c30f020, - 0x283f4: 0x6c79d220, 0x283f6: 0x6c277c20, - 0x283f8: 0x6ca4b420, 0x283fa: 0x6c536a20, - // Block 0xa10, offset 0x28400 - 0x28402: 0x6c7f4020, 0x28403: 0x6c34aa20, - 0x28404: 0x6cb91020, 0x28406: 0x6d1a8820, - 0x28416: 0x6c911220, 0x28417: 0x6c5ae020, - 0x2841b: 0x6c402e20, - 0x2841c: 0x6c98f420, 0x2841e: 0x6d389a20, - 0x28421: 0x6d1dfa20, - 0x2842d: 0x6c817020, 0x2842e: 0x6c609c20, 0x2842f: 0x6d186a20, - 0x28430: 0x6c8e8c20, 0x28431: 0x6c235220, 0x28433: 0x6ca43c20, - // Block 0xa11, offset 0x28440 - 0x28450: 0x6cea2620, 0x28451: 0x6cfe5220, - 0x28455: 0x6c0bba20, 0x28456: 0x6c207820, 0x28457: 0x6cf52020, - 0x28459: 0x6c70c620, - 0x28465: 0x6d005220, 0x28466: 0x6caf9220, 0x28467: 0x6d3da220, - 0x28468: 0x6cc8e420, 0x2846a: 0x6ccafa20, 0x2846b: 0x6d3f6220, - 0x2846d: 0x6d336220, - 0x28470: 0x6d40da20, 0x28471: 0x6cc14220, 0x28473: 0x6c1c7a20, - 0x28475: 0x6d36f020, - // Block 0xa12, offset 0x28480 - 0x28497: 0x6cc37a20, - 0x28498: 0x6cb92020, 0x28499: 0x6d0afc20, 0x2849a: 0x6c17c420, 0x2849b: 0x6c517c20, - 0x2849c: 0x6cc80420, - 0x284a0: 0x6c70cc20, 0x284a1: 0x6cf52820, - 0x284ac: 0x6c1c7c20, 0x284ad: 0x6c7c0420, 0x284af: 0x6c240020, - 0x284b0: 0x6cc89220, 0x284b1: 0x6c7e1e20, 0x284b2: 0x6c1b5e20, 0x284b3: 0x6d40e420, - 0x284b4: 0x6c688620, 0x284b6: 0x6d21c420, 0x284b7: 0x6ce8fe20, - 0x284b8: 0x6c9b6420, 0x284b9: 0x6c266c20, 0x284ba: 0x6cd7a020, - // Block 0xa13, offset 0x284c0 - 0x284e5: 0x6c3c6c20, 0x284e6: 0x6c469020, 0x284e7: 0x6c301c20, - 0x284e8: 0x6c142220, 0x284e9: 0x6c99be20, 0x284ea: 0x6c15e820, 0x284eb: 0x6c0b1020, - 0x284ec: 0x6d241e20, 0x284ef: 0x6cecea20, - 0x284f0: 0x6d40e620, 0x284f2: 0x6d3ea420, - 0x284f4: 0x6c1fec20, 0x284f5: 0x6ced5620, 0x284f6: 0x6cebf420, - 0x284f8: 0x6cc2a620, 0x284fb: 0x6ced5820, - 0x284fd: 0x6cfa5020, - // Block 0xa14, offset 0x28500 - 0x28504: 0x6d1d5620, 0x28505: 0x6c66e820, - 0x28508: 0x6cf04220, 0x28509: 0x6ce39a20, 0x2850a: 0x6ccaca20, - 0x2850c: 0x6cb67a20, 0x2850d: 0x6ccc2020, 0x2850e: 0x6d244220, 0x2850f: 0x6c60e220, - 0x28510: 0x6c314420, 0x28511: 0x6c15f620, 0x28512: 0x6ce96c20, - 0x28515: 0x6c8ec420, 0x28517: 0x6d3cba20, - 0x28533: 0x6cc89420, - 0x28536: 0x6d0eda20, 0x28537: 0x6c47ea20, - 0x28539: 0x6c86e220, 0x2853a: 0x6c13ba20, - 0x2853e: 0x6c2cac20, - // Block 0xa15, offset 0x28540 - 0x28540: 0x6d2e2a20, 0x28541: 0x6cb32220, - 0x28552: 0x6c912620, - 0x28554: 0x6d374c20, - // Block 0xa16, offset 0x28580 - 0x28581: 0x6c888a20, - 0x28585: 0x6c95ca20, - 0x2858d: 0x6c352420, - 0x28590: 0x6c750820, 0x28591: 0x6c873420, 0x28592: 0x6c7ff220, - 0x28594: 0x6cc89620, 0x28595: 0x6c474220, 0x28596: 0x6c155c20, 0x28597: 0x6d060620, - 0x2859a: 0x6d356420, - // Block 0xa17, offset 0x285c0 - 0x285c1: 0x6d097c20, 0x285c2: 0x6c0e9c20, 0x285c3: 0x6c19aa20, - 0x285c5: 0x6d3b4220, 0x285c6: 0x6c522a20, - 0x285c9: 0x6c04ac20, - 0x285d3: 0x6c2f0820, - 0x285d6: 0x6d2e3a20, 0x285d7: 0x6c4ca620, - 0x285da: 0x6c0c5420, 0x285db: 0x6c7ec620, - 0x285fa: 0x6c6c7620, - // Block 0xa18, offset 0x28600 - 0x28602: 0x6c411c20, - 0x28612: 0x6c9c1e20, - 0x28614: 0x6d247e20, - 0x2862a: 0x6cf82a20, - 0x2862c: 0x6cb17820, 0x2862d: 0x6cd85020, - 0x28634: 0x6c2b0020, - 0x28638: 0x6c219e20, 0x28639: 0x6c2bbe20, 0x2863a: 0x6c5fa820, 0x2863b: 0x6c157620, - 0x2863f: 0x6d3dea20, - // Block 0xa19, offset 0x28640 - 0x28653: 0x6c115220, - 0x2865e: 0x6c681620, - 0x28672: 0x6ce80220, - 0x2867d: 0x6c84e820, - // Block 0xa1a, offset 0x28680 - 0x28682: 0x6cba9020, - 0x28686: 0x6c21a020, - 0x2868f: 0x6cdef820, - 0x28691: 0x6c2e5220, 0x28693: 0x6c664820, - 0x2869b: 0x6d356820, - 0x2869c: 0x6c753220, 0x2869e: 0x6ca0a420, - 0x286a0: 0x6c959620, - 0x286a6: 0x6c062420, - 0x286ad: 0x6d415e20, - 0x286b5: 0x6d300820, - 0x286b8: 0x6d220c20, 0x286bb: 0x6c062a20, - 0x286be: 0x6c969420, 0x286bf: 0x6cf85020, - // Block 0xa1b, offset 0x286c0 - 0x286c0: 0x6c567c20, 0x286c1: 0x6d171220, 0x286c2: 0x6c355020, 0x286c3: 0x6c470220, - 0x286c4: 0x6ce89e20, 0x286c5: 0x6d314a20, 0x286c7: 0x6cc07220, - 0x286c8: 0x6cdaba20, 0x286c9: 0x6c89c620, 0x286ca: 0x6cc11a20, 0x286cb: 0x6c8d2620, - 0x286cc: 0x6c499420, 0x286cd: 0x6c80e420, 0x286ce: 0x6ce7dc20, 0x286cf: 0x6c266620, - 0x286d0: 0x6c911e20, 0x286d1: 0x6c5a1220, 0x286d2: 0x6cd47e20, 0x286d3: 0x6c688820, - 0x286d4: 0x6d41f620, 0x286d5: 0x6c411a20, 0x286d6: 0x6cef5220, - 0x286d9: 0x6c7d4e20, 0x286da: 0x6c32bc20, 0x286db: 0x6cd92020, - 0x286dc: 0x6cb5e020, 0x286dd: 0x6d101a20, - 0x286e1: 0x6cd37820, 0x286e3: 0x6c411420, - 0x286e6: 0x6c2a1a20, 0x286e7: 0x6d11b220, - 0x286eb: 0x6cb99e20, - 0x286ed: 0x6cce7220, 0x286ee: 0x6c16ae20, 0x286ef: 0x6ca05020, - 0x286f1: 0x6ca05a20, - 0x286f5: 0x6ca50620, - 0x286f8: 0x6c232220, 0x286fa: 0x6ca84e20, 0x286fb: 0x6d2f6a20, - 0x286fc: 0x6c133420, 0x286ff: 0x6cd92a20, - // Block 0xa1c, offset 0x28700 - 0x28700: 0x6ca85820, 0x28701: 0x6c22dc20, - 0x28704: 0x6c75de20, 0x28706: 0x6cce7e20, - 0x28708: 0x6d3a2420, 0x28709: 0x6c34b020, 0x2870a: 0x6c01ce20, 0x2870b: 0x6c088c20, - 0x2870e: 0x6ce41820, - 0x28710: 0x6cb06a20, 0x28711: 0x6cf9ee20, 0x28712: 0x6cc09420, 0x28713: 0x6cd14e20, - 0x28717: 0x6ce0d820, - 0x2871b: 0x6c978420, - 0x2871c: 0x6cb10420, 0x2871e: 0x6ce43420, 0x2871f: 0x6cc6cc20, - 0x28727: 0x6c237220, - 0x2872a: 0x6c5f7a20, 0x2872b: 0x6c3cc020, - 0x2872c: 0x6cf53c20, 0x2872d: 0x6c69d620, 0x2872e: 0x6c818e20, 0x2872f: 0x6d2ba620, - 0x28730: 0x6caeee20, 0x28731: 0x6c11e420, 0x28733: 0x6ca9de20, - 0x28735: 0x6c160c20, - 0x2873e: 0x6c97a420, 0x2873f: 0x6c4ba820, - // Block 0xa1d, offset 0x28740 - 0x28740: 0x6ca7d820, 0x28741: 0x6c1d0220, 0x28742: 0x6c165820, - 0x28746: 0x6ca48a20, - 0x28749: 0x6cf95c20, 0x2874a: 0x6c6f6620, 0x2874b: 0x6c613020, - 0x2874c: 0x6d323420, - 0x28751: 0x6ce6ca20, - 0x28754: 0x6c9ace20, 0x28755: 0x6d26b220, 0x28757: 0x6d37bc20, - 0x28758: 0x6cea5620, 0x28759: 0x6cc8d220, 0x2875a: 0x6d01ba20, 0x2875b: 0x6cf63420, - 0x2875d: 0x6ce6d220, 0x2875e: 0x6ca99820, - 0x28760: 0x6cee2820, 0x28761: 0x6c64ae20, 0x28763: 0x6c3b3420, - 0x28772: 0x6c0ba620, - 0x28777: 0x6d152820, - 0x2877a: 0x6c2ec420, 0x2877b: 0x6c5ef820, - 0x2877c: 0x6c41de20, 0x2877f: 0x6c64c420, - // Block 0xa1e, offset 0x28780 - 0x28780: 0x6c6ee220, - 0x28786: 0x6c763820, - 0x2878a: 0x6cc3d620, - 0x2878c: 0x6ca40420, 0x2878d: 0x6ca1de20, 0x2878e: 0x6d072220, 0x2878f: 0x6cd96a20, - 0x28790: 0x6cd0c020, 0x28791: 0x6c7bac20, 0x28792: 0x6cc3e620, 0x28793: 0x6cef2820, - 0x28797: 0x6c2eda20, - 0x28798: 0x6ca40a20, 0x2879a: 0x6cc92a20, 0x2879b: 0x6c45a220, - 0x2879c: 0x6c313220, 0x2879e: 0x6ca73020, - 0x287a1: 0x6c175020, 0x287a2: 0x6c515e20, 0x287a3: 0x6d0e9e20, - 0x287a9: 0x6ce8f020, 0x287aa: 0x6c104420, - 0x287ac: 0x6c559e20, 0x287ad: 0x6d1e5820, 0x287af: 0x6cd2d620, - 0x287b0: 0x6c1f7220, - 0x287b9: 0x6cff0e20, 0x287ba: 0x6c9ad620, 0x287bb: 0x6c852a20, - 0x287bc: 0x6ce37220, 0x287be: 0x6c64e620, - // Block 0xa1f, offset 0x287c0 - 0x287c2: 0x6d354e20, 0x287c3: 0x6c487220, - 0x287c4: 0x6c496220, 0x287c6: 0x6cb7cc20, - 0x287c8: 0x6c3a1820, 0x287c9: 0x6d229820, 0x287ca: 0x6d309620, 0x287cb: 0x6cf01c20, - 0x287cc: 0x6c35ba20, 0x287cd: 0x6c14da20, 0x287ce: 0x6cf6e020, - 0x287d0: 0x6c47d420, - 0x287d7: 0x6cc3fa20, - 0x287d8: 0x6c5c4620, 0x287da: 0x6d00f620, 0x287db: 0x6d1bf420, - 0x287dd: 0x6cdeaa20, 0x287de: 0x6cec5820, 0x287df: 0x6c3efe20, - 0x287e0: 0x6c6c0820, 0x287e1: 0x6cb0bc20, - 0x287e5: 0x6cd15020, 0x287e6: 0x6d21c620, 0x287e7: 0x6c7ace20, - 0x287e9: 0x6cb0ca20, 0x287ea: 0x6d010620, 0x287eb: 0x6caaac20, - 0x287ec: 0x6cfd2420, 0x287ed: 0x6c66ea20, 0x287ee: 0x6d074e20, - 0x287f0: 0x6c0a7e20, - 0x287f4: 0x6ca41220, 0x287f6: 0x6c897020, - 0x287f8: 0x6cb13420, - 0x287fc: 0x6c6eb820, - // Block 0xa20, offset 0x28800 - 0x28800: 0x6cde1c20, 0x28801: 0x6d0edc20, 0x28802: 0x6c00f820, - 0x28805: 0x6cff3020, 0x28806: 0x6cbaf420, 0x28807: 0x6cf48620, - 0x28808: 0x6ce15620, 0x2880a: 0x6c75f420, - 0x28810: 0x6c7e2820, - 0x28817: 0x6c813220, - 0x28819: 0x6ca5b020, - 0x2881c: 0x6c314a20, 0x2881d: 0x6cd54620, 0x2881f: 0x6c696220, - 0x28820: 0x6ca89c20, 0x28822: 0x6d21dc20, - 0x28828: 0x6c132020, 0x2882a: 0x6c696420, - 0x2882c: 0x6c57d620, 0x2882d: 0x6cf1c020, 0x2882e: 0x6d127020, 0x2882f: 0x6c35a020, - 0x28830: 0x6c49fe20, 0x28831: 0x6c572020, 0x28832: 0x6c68a620, - 0x2883a: 0x6c835820, - 0x2883c: 0x6cce2820, 0x2883d: 0x6d1e8020, 0x2883f: 0x6c2ac220, - // Block 0xa21, offset 0x28840 - 0x28840: 0x6c493820, 0x28841: 0x6ca97220, 0x28843: 0x6cdcc020, - 0x28844: 0x6cfe6c20, 0x28846: 0x6cc9b420, 0x28847: 0x6c168c20, - 0x2884e: 0x6cc90c20, - 0x28850: 0x6d277020, 0x28852: 0x6c3b4c20, 0x28853: 0x6c672420, - 0x28854: 0x6d076a20, - 0x28858: 0x6cf93020, 0x28859: 0x6cd54a20, - 0x28865: 0x6d013220, 0x28866: 0x6c87ac20, - 0x28869: 0x6ce80420, - 0x2886c: 0x6c9d1020, 0x2886d: 0x6c162020, 0x2886e: 0x6c5d6a20, - 0x28871: 0x6d3bb820, 0x28872: 0x6d273420, - 0x2887b: 0x6c801a20, - 0x2887d: 0x6d0d2c20, 0x2887e: 0x6c29a820, 0x2887f: 0x6cfe1820, - // Block 0xa22, offset 0x28880 - 0x28880: 0x6d267220, 0x28881: 0x6ce6b020, 0x28882: 0x6c07d220, 0x28883: 0x6cca4620, - 0x28884: 0x6cfc9620, 0x28885: 0x6c2e7a20, 0x28886: 0x6cb09c20, 0x28887: 0x6cb11220, - 0x28889: 0x6cde0c20, 0x2888b: 0x6c687220, - 0x2888c: 0x6d126620, 0x2888e: 0x6d271020, - 0x28890: 0x6cc61420, 0x28891: 0x6cbc1820, 0x28892: 0x6cb56220, 0x28893: 0x6c2da620, - 0x28894: 0x6cb56420, 0x28897: 0x6c4e7e20, - 0x28898: 0x6d253220, 0x28899: 0x6d1ee220, 0x2889a: 0x6c5fd020, 0x2889b: 0x6c412820, - 0x2889c: 0x6c4d0620, 0x2889d: 0x6cd30420, 0x2889f: 0x6cc0c820, - 0x288a9: 0x6cf1fa20, - 0x288ac: 0x6d321620, 0x288ad: 0x6cb2f220, 0x288ae: 0x6d0c5e20, 0x288af: 0x6c46e820, - 0x288b0: 0x6c720420, 0x288b1: 0x6ce52e20, - 0x288b7: 0x6c35d820, - 0x288ba: 0x6d0ace20, 0x288bb: 0x6c8c4620, - 0x288bc: 0x6c092620, - // Block 0xa23, offset 0x288c0 - 0x288c0: 0x6d3eea20, 0x288c1: 0x6c530820, 0x288c3: 0x6c347420, - 0x288c5: 0x6c333c20, 0x288c6: 0x6d087220, - 0x288c8: 0x6ccd3020, 0x288ca: 0x6ccd3220, 0x288cb: 0x6d10d220, - 0x288cc: 0x6cc4b020, - 0x288d4: 0x6ceaf820, 0x288d7: 0x6c0dac20, - 0x288d8: 0x6d069e20, 0x288d9: 0x6cea1a20, 0x288da: 0x6c19d220, - 0x288dc: 0x6c30fe20, 0x288dd: 0x6d171420, - 0x288e1: 0x6c180820, - 0x288f5: 0x6c731a20, 0x288f6: 0x6c5eae20, - 0x288f8: 0x6d2fae20, 0x288f9: 0x6c07de20, 0x288fb: 0x6ce4e220, - // Block 0xa24, offset 0x28900 - 0x28900: 0x6cae6420, - 0x28905: 0x6c3fda20, - 0x28916: 0x6ceb7620, - 0x28918: 0x6cfb3e20, 0x28919: 0x6ca69420, 0x2891a: 0x6c8f8620, - 0x2891d: 0x6d3d4220, 0x2891f: 0x6d32c020, - 0x28920: 0x6cd74820, 0x28921: 0x6d3f7c20, 0x28922: 0x6c3c4620, 0x28923: 0x6c32be20, - 0x28924: 0x6cb09420, 0x28925: 0x6d0d7820, 0x28926: 0x6cda1620, 0x28927: 0x6cc05820, - 0x28928: 0x6c362220, 0x28929: 0x6cb98e20, 0x2892b: 0x6cba0620, - 0x2892d: 0x6c10d420, 0x2892e: 0x6d0a8a20, - 0x28935: 0x6d3c8220, - 0x28938: 0x6c993a20, 0x28939: 0x6c68ee20, - 0x2893f: 0x6d2dea20, - // Block 0xa25, offset 0x28940 - 0x28940: 0x6caffa20, 0x28941: 0x6cf63620, 0x28942: 0x6d0e7c20, 0x28943: 0x6c3ab420, - 0x28944: 0x6ca83620, 0x28946: 0x6d364620, - 0x28948: 0x6cdd6a20, 0x2894a: 0x6d17d020, - 0x2894c: 0x6c82c620, 0x2894d: 0x6d06ea20, 0x2894f: 0x6d17d220, - 0x28952: 0x6cee9620, - 0x28955: 0x6c5ede20, 0x28956: 0x6c186e20, 0x28957: 0x6c2eba20, - 0x28963: 0x6d257020, - 0x28965: 0x6cf78020, 0x28967: 0x6c8e6220, - 0x28968: 0x6cdd6c20, - 0x28971: 0x6c07fc20, 0x28972: 0x6cfa4020, 0x28973: 0x6d0e8c20, - 0x28975: 0x6c24d020, 0x28977: 0x6c773420, - 0x2897a: 0x6cbe4e20, 0x2897b: 0x6c909a20, - 0x2897c: 0x6c087e20, - // Block 0xa26, offset 0x28980 - 0x28988: 0x6d2e6a20, 0x28989: 0x6c24ae20, 0x2898a: 0x6cf3e220, 0x2898b: 0x6d05c020, - 0x2898c: 0x6c187e20, 0x2898d: 0x6c4fd820, 0x2898e: 0x6c748820, - 0x28990: 0x6c192e20, 0x28991: 0x6c13fa20, 0x28992: 0x6c15ce20, 0x28993: 0x6d348820, - 0x28994: 0x6d0a2a20, - 0x289a3: 0x6c441a20, - 0x289a4: 0x6c18e220, 0x289a5: 0x6d132020, - 0x289aa: 0x6c1ee820, 0x289ab: 0x6cc1b820, - 0x289ac: 0x6d020620, 0x289ae: 0x6d2e7c20, 0x289af: 0x6c790820, - 0x289b1: 0x6c74ae20, - 0x289bd: 0x6cc1ba20, 0x289bf: 0x6c9b5020, - // Block 0xa27, offset 0x289c0 - 0x289c0: 0x6d134e20, 0x289c1: 0x6d406620, 0x289c2: 0x6cb45620, - 0x289c4: 0x6cd3e420, - 0x289c9: 0x6cd57220, 0x289ca: 0x6c152a20, - 0x289cd: 0x6c31c420, 0x289cf: 0x6c4c4a20, - 0x289d0: 0x6c92fe20, 0x289d1: 0x6d0c3820, - 0x289d6: 0x6ca7ba20, 0x289d7: 0x6c0d6620, - 0x289df: 0x6ce9cc20, - 0x289e6: 0x6ca6dc20, 0x289e7: 0x6c584220, - 0x289e8: 0x6cb9de20, - 0x289ef: 0x6cfa6020, - 0x289f2: 0x6c8dc620, - 0x289f7: 0x6c882820, - 0x289f9: 0x6d186e20, 0x289fb: 0x6c866620, - 0x289fc: 0x6cd8f020, 0x289ff: 0x6c279a20, - // Block 0xa28, offset 0x28a00 - 0x28a02: 0x6cf11620, - 0x28a05: 0x6c22c020, - 0x28a09: 0x6c6fbe20, 0x28a0a: 0x6c534420, - 0x28a0c: 0x6d210e20, 0x28a0e: 0x6c7c6e20, - 0x28a12: 0x6c4f8020, 0x28a13: 0x6c439620, - 0x28a14: 0x6c39e620, 0x28a17: 0x6c7c8020, - 0x28a1a: 0x6c4a6c20, 0x28a1b: 0x6c1bb020, - 0x28a1e: 0x6c6fc220, - 0x28a21: 0x6cdbce20, - 0x28a24: 0x6c2ec620, - 0x28a2c: 0x6cdc0c20, - 0x28a30: 0x6cbd8620, - 0x28a34: 0x6c4a8020, - 0x28a3b: 0x6d3c6620, - 0x28a3e: 0x6ce5de20, - // Block 0xa29, offset 0x28a40 - 0x28a41: 0x6d26d820, - 0x28a47: 0x6d419220, - 0x28a4f: 0x6cf3e820, - 0x28a50: 0x6c250820, - 0x28a5b: 0x6d36d220, - 0x28a60: 0x6cd72e20, 0x28a62: 0x6c301420, - 0x28a6d: 0x6cef3c20, - 0x28a7f: 0x6c1d4220, - // Block 0xa2a, offset 0x28a80 - 0x28a8b: 0x6cc8f420, - 0x28a96: 0x6c60d420, - 0x28a9c: 0x6c2de820, 0x28a9e: 0x6c124020, - 0x28aa0: 0x6c7a0c20, 0x28aa3: 0x6cef5420, - 0x28aa7: 0x6c11bc20, - 0x28aaa: 0x6c968020, 0x28aab: 0x6caba820, - 0x28ab2: 0x6cca3820, - 0x28ab6: 0x6cef6620, - 0x28abc: 0x6cca3e20, 0x28abf: 0x6c6c7020, - // Block 0xa2b, offset 0x28ac0 - 0x28acc: 0x6cef6e20, - 0x28ade: 0x6c115420, 0x28adf: 0x6c84d020, - 0x28aef: 0x6d273a20, - 0x28af4: 0x6d277220, 0x28af7: 0x6c196420, - 0x28afa: 0x6ccce420, - // Block 0xa2c, offset 0x28b00 - 0x28b02: 0x6c54d620, 0x28b03: 0x6ccc9e20, - 0x28b04: 0x6cea5820, 0x28b06: 0x6c3d3020, - 0x28b08: 0x6cbe1820, 0x28b09: 0x6d05ac20, - 0x28b0d: 0x6c1fe620, 0x28b0e: 0x6c400420, - 0x28b12: 0x6d181220, 0x28b13: 0x6c300c20, - 0x28b14: 0x6c3eb420, 0x28b15: 0x6c3eb620, 0x28b16: 0x6d2ad620, 0x28b17: 0x6cb4ae20, - 0x28b19: 0x6c8d2c20, - 0x28b1d: 0x6ccca020, 0x28b1e: 0x6cad9420, - 0x28b22: 0x6d1a8a20, 0x28b23: 0x6c961e20, - 0x28b24: 0x6c57b620, 0x28b25: 0x6d1b6e20, 0x28b26: 0x6c084a20, 0x28b27: 0x6d209820, - 0x28b28: 0x6ccf7020, 0x28b2a: 0x6d01f220, 0x28b2b: 0x6c1ee620, - 0x28b34: 0x6ccf7220, 0x28b35: 0x6c2d7220, - 0x28b39: 0x6d187020, 0x28b3b: 0x6c183a20, - 0x28b3c: 0x6c451c20, 0x28b3d: 0x6c8fa820, 0x28b3e: 0x6cb2ca20, 0x28b3f: 0x6d280220, - // Block 0xa2d, offset 0x28b40 - 0x28b40: 0x6d0eae20, 0x28b41: 0x6ca15a20, 0x28b43: 0x6cdbd820, - 0x28b4b: 0x6c6ea420, - 0x28b4d: 0x6cd99c20, 0x28b4e: 0x6cad0c20, - 0x28b50: 0x6d0b3820, 0x28b51: 0x6ccb5020, 0x28b52: 0x6c34b820, - 0x28b55: 0x6c207a20, 0x28b56: 0x6d022420, - 0x28b58: 0x6ce95a20, 0x28b59: 0x6c45b420, 0x28b5a: 0x6d08b620, - 0x28b5c: 0x6c7e4e20, 0x28b5e: 0x6c8d5e20, - 0x28b60: 0x6c279020, 0x28b61: 0x6d2c5220, - 0x28b6c: 0x6d1a0a20, 0x28b6d: 0x6cd93c20, 0x28b6f: 0x6d229a20, - 0x28b70: 0x6ceb4c20, 0x28b71: 0x6ceb4e20, - 0x28b74: 0x6c03c420, 0x28b75: 0x6cc4d620, 0x28b76: 0x6c0f8420, 0x28b77: 0x6c279c20, - 0x28b79: 0x6d2c5a20, 0x28b7a: 0x6c543a20, - 0x28b7e: 0x6c5b7820, - // Block 0xa2e, offset 0x28b80 - 0x28b85: 0x6c916020, - 0x28b8a: 0x6c8e2820, 0x28b8b: 0x6cc7d620, - 0x28b95: 0x6c28d220, 0x28b96: 0x6c9b6620, 0x28b97: 0x6cfa5820, - 0x28b98: 0x6cf26220, 0x28b99: 0x6c4e4620, 0x28b9a: 0x6d3eb020, 0x28b9b: 0x6d327420, - 0x28b9c: 0x6ccb7c20, 0x28b9d: 0x6c25fa20, 0x28b9e: 0x6c86e420, - 0x28ba0: 0x6c2ce220, 0x28ba1: 0x6c887e20, 0x28ba2: 0x6c46e020, - 0x28ba6: 0x6caee020, - 0x28baa: 0x6d1c0a20, - 0x28bac: 0x6c548420, 0x28bae: 0x6c336c20, 0x28baf: 0x6cf53e20, - 0x28bb7: 0x6cb1be20, - 0x28bb8: 0x6c520020, 0x28bba: 0x6c8fb820, 0x28bbb: 0x6ca18420, - 0x28bbc: 0x6c3a7620, 0x28bbd: 0x6c93be20, 0x28bbe: 0x6d2b2020, 0x28bbf: 0x6c0fae20, - // Block 0xa2f, offset 0x28bc0 - 0x28bc0: 0x6c2d9620, 0x28bc1: 0x6c98aa20, 0x28bc3: 0x6d3c4e20, - 0x28bc4: 0x6c932220, 0x28bc5: 0x6cace820, 0x28bc6: 0x6c337c20, 0x28bc7: 0x6c10ce20, - 0x28bcc: 0x6c189020, 0x28bcd: 0x6c981220, - 0x28bd6: 0x6cf72420, - 0x28bdd: 0x6c019a20, 0x28bde: 0x6d37dc20, - 0x28be0: 0x6ca44a20, 0x28be1: 0x6cebba20, 0x28be2: 0x6c519c20, - 0x28be5: 0x6c338220, 0x28be6: 0x6ceca020, 0x28be7: 0x6d37de20, - 0x28be8: 0x6c133e20, 0x28be9: 0x6c873620, 0x28bea: 0x6cd6aa20, - 0x28bee: 0x6c134020, - 0x28bf0: 0x6cd84a20, 0x28bf2: 0x6c338420, - 0x28bf4: 0x6c5cdc20, - 0x28bfc: 0x6c654220, 0x28bfd: 0x6ca9e220, 0x28bfe: 0x6c28ea20, 0x28bff: 0x6c409820, - // Block 0xa30, offset 0x28c00 - 0x28c00: 0x6c5e4e20, 0x28c01: 0x6c5c9620, 0x28c02: 0x6c228420, - 0x28c04: 0x6d1e6620, 0x28c05: 0x6cc9b620, 0x28c06: 0x6ce6a420, - 0x28c0e: 0x6c8f5a20, - 0x28c11: 0x6cdb8c20, 0x28c12: 0x6c8da220, 0x28c13: 0x6c97a620, - 0x28c14: 0x6c2d9c20, - 0x28c18: 0x6cad4020, 0x28c1a: 0x6c8da420, - 0x28c1d: 0x6c878620, 0x28c1f: 0x6caa1020, - 0x28c23: 0x6c8b7820, - 0x28c24: 0x6ccd6220, 0x28c26: 0x6c3afe20, - 0x28c2b: 0x6ccd6420, - 0x28c2e: 0x6c8db820, 0x28c2f: 0x6d2eaa20, - 0x28c31: 0x6c0d7820, 0x28c32: 0x6c84dc20, - 0x28c35: 0x6cd86420, 0x28c36: 0x6cc4fc20, 0x28c37: 0x6c655820, - 0x28c38: 0x6d3df020, 0x28c3b: 0x6c8dbe20, - 0x28c3c: 0x6c8dc020, 0x28c3d: 0x6c9c2420, 0x28c3f: 0x6cd6c820, - // Block 0xa31, offset 0x28c40 - 0x28c44: 0x6c8dc820, 0x28c47: 0x6c5d5020, - 0x28c4e: 0x6c8dee20, 0x28c4f: 0x6c655e20, - 0x28c50: 0x6cc23a20, - 0x28c54: 0x6ca9ea20, 0x28c55: 0x6c6e7c20, 0x28c56: 0x6c187020, - 0x28c5c: 0x6d318820, 0x28c5d: 0x6cbede20, 0x28c5f: 0x6cbee220, - 0x28c60: 0x6c36c820, 0x28c63: 0x6ccb9420, - 0x28c69: 0x6c071a20, 0x28c6b: 0x6c3a0020, - 0x28c6e: 0x6c3ab620, 0x28c6f: 0x6c3a3820, - 0x28c74: 0x6c399820, 0x28c75: 0x6c7a7c20, - 0x28c7a: 0x6d28c620, 0x28c7b: 0x6c5c2220, - 0x28c7d: 0x6c3a4420, - // Block 0xa32, offset 0x28c80 - 0x28c81: 0x6c338620, - 0x28c86: 0x6cabca20, 0x28c87: 0x6ca99c20, - 0x28c88: 0x6cad2e20, 0x28c89: 0x6c289820, 0x28c8a: 0x6c27e820, 0x28c8b: 0x6c00b220, - 0x28c8d: 0x6ce50e20, 0x28c8e: 0x6c17a420, 0x28c8f: 0x6c02ac20, - 0x28c90: 0x6c9aa020, 0x28c91: 0x6ca43420, - 0x28c94: 0x6c0ff420, 0x28c95: 0x6d23b420, 0x28c96: 0x6cfac420, 0x28c97: 0x6c973a20, - 0x28c9a: 0x6cb26420, - 0x28c9c: 0x6c331020, 0x28c9e: 0x6c2a3020, - 0x28ca1: 0x6d043a20, 0x28ca2: 0x6ca6ce20, 0x28ca3: 0x6c4dba20, - 0x28ca4: 0x6c1f7a20, 0x28ca5: 0x6cd64a20, 0x28ca6: 0x6c97cc20, - 0x28cac: 0x6ceda420, 0x28cad: 0x6d18dc20, 0x28cae: 0x6c2e4820, 0x28caf: 0x6d0c3a20, - 0x28cb1: 0x6cf32420, 0x28cb2: 0x6cdba220, - 0x28cb4: 0x6c019420, 0x28cb5: 0x6c7fd420, 0x28cb6: 0x6ca43e20, - 0x28cb8: 0x6cc0b620, 0x28cb9: 0x6c9e6820, 0x28cba: 0x6caae420, 0x28cbb: 0x6c11c020, - 0x28cbc: 0x6c11e620, - // Block 0xa33, offset 0x28cc0 - 0x28cc0: 0x6c808620, 0x28cc1: 0x6ce52a20, 0x28cc2: 0x6d139220, - 0x28cc4: 0x6ca74e20, 0x28cc6: 0x6cd64e20, - 0x28ccb: 0x6c228620, - 0x28ccd: 0x6c663a20, - 0x28cd0: 0x6c424020, - 0x28cd4: 0x6c673220, 0x28cd5: 0x6c4caa20, 0x28cd7: 0x6d2dd620, - 0x28cd9: 0x6c95dc20, - 0x28cdc: 0x6c5ebc20, 0x28cdd: 0x6c4b5220, - 0x28ce1: 0x6c63d220, 0x28ce2: 0x6c614a20, - 0x28ce5: 0x6d08a020, 0x28ce7: 0x6c3c5a20, - 0x28ceb: 0x6c09ea20, - 0x28cec: 0x6cb60a20, 0x28cef: 0x6d258e20, - 0x28cf0: 0x6c021a20, 0x28cf1: 0x6c2b3820, - 0x28cf4: 0x6c366820, 0x28cf5: 0x6c3b7e20, - 0x28cf8: 0x6c727020, 0x28cf9: 0x6ca64220, 0x28cfa: 0x6ceb3c20, - 0x28cfc: 0x6cd00c20, 0x28cfd: 0x6c3eca20, 0x28cfe: 0x6cf9e420, 0x28cff: 0x6cc1ac20, - // Block 0xa34, offset 0x28d00 - 0x28d00: 0x6cb39a20, 0x28d01: 0x6ced4220, 0x28d02: 0x6c8d4220, 0x28d03: 0x6c96d220, - 0x28d04: 0x6d394020, 0x28d05: 0x6c065c20, 0x28d07: 0x6d23b620, - 0x28d0c: 0x6c082a20, 0x28d0d: 0x6c973c20, 0x28d0f: 0x6c637a20, - 0x28d11: 0x6d102e20, 0x28d13: 0x6c7ade20, - 0x28d14: 0x6c69c020, 0x28d16: 0x6c0df220, - 0x28d1a: 0x6c962420, 0x28d1b: 0x6c4b1820, - 0x28d1c: 0x6c351420, 0x28d1d: 0x6d36d420, - 0x28d21: 0x6d326020, 0x28d22: 0x6c369e20, 0x28d23: 0x6d39ca20, - 0x28d24: 0x6c039020, - 0x28d28: 0x6d326220, 0x28d29: 0x6c3c6820, 0x28d2a: 0x6c313820, 0x28d2b: 0x6ca73c20, - 0x28d2c: 0x6c10bc20, 0x28d2d: 0x6c336020, 0x28d2e: 0x6ccc1c20, 0x28d2f: 0x6ccb6820, - 0x28d30: 0x6c0a6220, - 0x28d34: 0x6d36f420, 0x28d35: 0x6d309820, 0x28d36: 0x6c10be20, - 0x28d3a: 0x6c74c420, 0x28d3b: 0x6d0aa820, - 0x28d3f: 0x6cf90020, - // Block 0xa35, offset 0x28d40 - 0x28d41: 0x6d3db820, 0x28d42: 0x6c045a20, 0x28d43: 0x6d115c20, - 0x28d44: 0x6c1e3420, 0x28d45: 0x6cdeb620, 0x28d46: 0x6cb93020, - 0x28d48: 0x6ca53820, 0x28d49: 0x6d242020, 0x28d4a: 0x6c36bc20, 0x28d4b: 0x6c650820, - 0x28d4c: 0x6d18de20, 0x28d4d: 0x6cff2a20, 0x28d4f: 0x6ca88020, - 0x28d52: 0x6c0db620, - 0x28d57: 0x6c4cd420, - 0x28d58: 0x6d010820, 0x28d59: 0x6c2e4a20, - 0x28d5c: 0x6c70d620, 0x28d5d: 0x6cdda420, 0x28d5e: 0x6c2ef420, 0x28d5f: 0x6c3f1420, - 0x28d60: 0x6c9e4420, 0x28d61: 0x6cd3fa20, 0x28d62: 0x6d08c420, 0x28d63: 0x6ce39c20, - 0x28d64: 0x6d244420, 0x28d67: 0x6d011820, - 0x28d68: 0x6c3f1620, 0x28d69: 0x6d373420, 0x28d6a: 0x6ca65a20, 0x28d6b: 0x6d08c620, - 0x28d6c: 0x6d0fe820, 0x28d6e: 0x6c3cd020, 0x28d6f: 0x6d403c20, - 0x28d70: 0x6d395e20, 0x28d71: 0x6d07de20, - 0x28d75: 0x6d39d820, 0x28d77: 0x6c7edc20, - 0x28d79: 0x6d1d5820, 0x28d7a: 0x6c435c20, 0x28d7b: 0x6c7e2c20, - 0x28d7d: 0x6c358820, 0x28d7e: 0x6cef5620, 0x28d7f: 0x6c9a3620, - // Block 0xa36, offset 0x28d80 - 0x28d83: 0x6c57fe20, - 0x28d84: 0x6c1e3820, 0x28d86: 0x6cddb220, 0x28d87: 0x6cdec820, - 0x28d88: 0x6cddb420, 0x28d89: 0x6cdeca20, 0x28d8a: 0x6d097a20, - 0x28d8c: 0x6c460820, 0x28d8d: 0x6c643220, 0x28d8f: 0x6c0fb020, - 0x28d90: 0x6cdecc20, 0x28d91: 0x6d25f620, - 0x28d98: 0x6cdece20, - 0x28d9d: 0x6c20ec20, - 0x28da0: 0x6d047820, 0x28da1: 0x6c519820, 0x28da2: 0x6cdd4820, - 0x28da7: 0x6ca18a20, - 0x28da8: 0x6c1d2c20, 0x28da9: 0x6cdbe420, 0x28daa: 0x6d2b2220, 0x28dab: 0x6c933220, - 0x28dac: 0x6d2eea20, 0x28dad: 0x6c963c20, 0x28dae: 0x6d075820, 0x28daf: 0x6c653a20, - 0x28db0: 0x6ccd2220, 0x28db2: 0x6d075a20, - 0x28dbe: 0x6c67cc20, - // Block 0xa37, offset 0x28dc0 - 0x28dc2: 0x6c067c20, 0x28dc3: 0x6c970c20, - 0x28dc5: 0x6ce7a020, 0x28dc6: 0x6cf92c20, - 0x28dc9: 0x6cc6e620, 0x28dcb: 0x6cd12a20, - 0x28dcc: 0x6d396c20, 0x28dce: 0x6c654420, 0x28dcf: 0x6c409a20, - 0x28dd0: 0x6c2afa20, 0x28dd3: 0x6d1de220, - 0x28dd4: 0x6c70e420, 0x28dd6: 0x6d195e20, 0x28dd7: 0x6c054820, - 0x28dd9: 0x6ccb9620, 0x28dda: 0x6cdcc620, - 0x28ddc: 0x6c346e20, 0x28ddd: 0x6d028420, - 0x28de1: 0x6c58c820, - 0x28de5: 0x6cc80c20, 0x28de6: 0x6ca66c20, 0x28de7: 0x6d397020, - 0x28de8: 0x6c4bac20, 0x28dea: 0x6c964820, - 0x28df2: 0x6d342e20, 0x28df3: 0x6d076c20, - 0x28df5: 0x6d343020, 0x28df7: 0x6c752a20, - 0x28df8: 0x6c70e820, 0x28dfb: 0x6d25da20, - 0x28dfc: 0x6c91a420, 0x28dff: 0x6c0fda20, - // Block 0xa38, offset 0x28e00 - 0x28e02: 0x6cc6ea20, 0x28e03: 0x6d029620, - 0x28e09: 0x6cf83220, 0x28e0a: 0x6c959a20, - 0x28e0e: 0x6c447020, - 0x28e11: 0x6d414620, 0x28e12: 0x6c4eca20, - 0x28e14: 0x6c685620, 0x28e15: 0x6cc95420, 0x28e16: 0x6cbd8a20, 0x28e17: 0x6cc43c20, - 0x28e18: 0x6cad6420, 0x28e19: 0x6d26da20, 0x28e1a: 0x6c182c20, 0x28e1b: 0x6c3ece20, - 0x28e1c: 0x6cadc020, 0x28e1f: 0x6c9aa420, - 0x28e22: 0x6ce1de20, - 0x28e24: 0x6c78f020, 0x28e25: 0x6cf8d420, - 0x28e2b: 0x6c351620, - 0x28e2d: 0x6d187220, - 0x28e30: 0x6cdc7e20, 0x28e32: 0x6cf9f820, 0x28e33: 0x6c730420, - 0x28e35: 0x6cef3e20, 0x28e37: 0x6d18ba20, - 0x28e39: 0x6d242220, 0x28e3b: 0x6c045c20, - 0x28e3c: 0x6ceb5820, 0x28e3d: 0x6cdeb820, 0x28e3e: 0x6cad6e20, - // Block 0xa39, offset 0x28e40 - 0x28e42: 0x6c0dfc20, - 0x28e45: 0x6d286820, 0x28e46: 0x6d286a20, 0x28e47: 0x6c32e220, - 0x28e48: 0x6cc88620, 0x28e49: 0x6cef5820, - 0x28e4f: 0x6cf05020, - 0x28e50: 0x6c4b9820, 0x28e52: 0x6c26d420, 0x28e53: 0x6cfa1420, - 0x28e56: 0x6c5d4a20, 0x28e57: 0x6c733220, - 0x28e58: 0x6cdbe620, 0x28e5a: 0x6cdcbc20, - 0x28e5d: 0x6c90d620, 0x28e5e: 0x6c046420, 0x28e5f: 0x6d246e20, - 0x28e60: 0x6d337420, 0x28e61: 0x6c4ba620, 0x28e63: 0x6c7c5820, - 0x28e64: 0x6c42f220, 0x28e65: 0x6c281620, - 0x28e69: 0x6cfc5a20, 0x28e6a: 0x6d2d2420, 0x28e6b: 0x6ccb9820, - 0x28e6d: 0x6c784620, 0x28e6e: 0x6c105020, 0x28e6f: 0x6c0fce20, - 0x28e72: 0x6cdcc820, - 0x28e74: 0x6d249420, 0x28e75: 0x6c105220, 0x28e76: 0x6c6f9220, 0x28e77: 0x6c6f9420, - 0x28e79: 0x6c73aa20, 0x28e7a: 0x6c754220, - 0x28e7c: 0x6ca31620, 0x28e7d: 0x6d2d1c20, 0x28e7e: 0x6ce1ba20, 0x28e7f: 0x6cefec20, - // Block 0xa3a, offset 0x28e80 - 0x28e80: 0x6cf9dc20, 0x28e81: 0x6d01cc20, - 0x28e85: 0x6cc9a620, 0x28e86: 0x6c5f6620, - 0x28e89: 0x6d026a20, - 0x28e8c: 0x6c338c20, 0x28e8d: 0x6d3f2620, - 0x28e98: 0x6d25ee20, 0x28e99: 0x6cbe1e20, 0x28e9a: 0x6c3ed020, 0x28e9b: 0x6caeba20, - 0x28e9c: 0x6cad6620, 0x28e9e: 0x6d1b7620, - 0x28ea0: 0x6c52c220, 0x28ea1: 0x6d40d420, 0x28ea3: 0x6c45a820, - 0x28ea4: 0x6c308820, 0x28ea5: 0x6c50a820, 0x28ea6: 0x6cf31020, - 0x28ea8: 0x6cace220, 0x28eab: 0x6cdb2820, - 0x28eac: 0x6c76f020, 0x28ead: 0x6ca88220, 0x28eae: 0x6c4ffa20, 0x28eaf: 0x6c3cfa20, - 0x28eb0: 0x6c36be20, 0x28eb1: 0x6d137620, - 0x28eb4: 0x6ce69820, 0x28eb5: 0x6c309420, 0x28eb6: 0x6d30ba20, 0x28eb7: 0x6cca7820, - 0x28ebb: 0x6ca18c20, - 0x28ebc: 0x6cdb6020, 0x28ebe: 0x6c823220, - // Block 0xa3b, offset 0x28ec0 - 0x28ec0: 0x6cb4a620, 0x28ec1: 0x6c35a620, 0x28ec2: 0x6d3de220, 0x28ec3: 0x6d139820, - 0x28ec7: 0x6cfda220, - 0x28ec8: 0x6c4a2c20, 0x28ec9: 0x6cc59e20, 0x28eca: 0x6c8dfe20, - 0x28ecd: 0x6c02cc20, - 0x28ed0: 0x6c146820, 0x28ed2: 0x6c345620, 0x28ed3: 0x6cbf3620, - 0x28ed4: 0x6c7a4620, 0x28ed5: 0x6d05b020, 0x28ed6: 0x6c587c20, 0x28ed7: 0x6d10aa20, - 0x28ed8: 0x6d324620, 0x28ed9: 0x6ce6da20, 0x28eda: 0x6c082420, - 0x28edd: 0x6c020220, 0x28edf: 0x6c76b420, - 0x28ee1: 0x6c7a4c20, 0x28ee2: 0x6cadde20, 0x28ee3: 0x6d205220, - 0x28ee4: 0x6c02aa20, 0x28ee5: 0x6c9ad020, 0x28ee6: 0x6ca13620, - 0x28eec: 0x6c3f7220, 0x28eed: 0x6cbe5020, 0x28eee: 0x6c7e8220, 0x28eef: 0x6c30f220, - 0x28ef0: 0x6ce06c20, 0x28ef3: 0x6cba1c20, - 0x28ef4: 0x6d121c20, 0x28ef5: 0x6cf0b620, 0x28ef6: 0x6c558c20, 0x28ef7: 0x6ca14620, - 0x28ef8: 0x6c50a620, 0x28ef9: 0x6d08ac20, 0x28efb: 0x6c0a1220, - 0x28efc: 0x6cb31a20, 0x28efe: 0x6c2b3c20, - // Block 0xa3c, offset 0x28f00 - 0x28f00: 0x6d31f020, 0x28f02: 0x6cd1e420, 0x28f03: 0x6c76e420, - 0x28f04: 0x6c130c20, 0x28f07: 0x6d05c420, - 0x28f08: 0x6d31f220, 0x28f0a: 0x6d3a7820, - 0x28f0f: 0x6c5c2420, - 0x28f10: 0x6c1bc020, 0x28f13: 0x6c53aa20, - 0x28f14: 0x6caa0420, 0x28f15: 0x6ca86a20, 0x28f16: 0x6d0eb020, - 0x28f18: 0x6c1d4020, 0x28f19: 0x6c3f8620, 0x28f1a: 0x6c49f420, 0x28f1b: 0x6cb52c20, - 0x28f1d: 0x6c44a220, 0x28f1e: 0x6ce6e020, - 0x28f22: 0x6ce07220, 0x28f23: 0x6cba2020, - 0x28f26: 0x6c702020, 0x28f27: 0x6d05e220, - 0x28f28: 0x6cb71620, 0x28f2a: 0x6d326420, - 0x28f2e: 0x6cc09c20, - 0x28f30: 0x6c35bc20, 0x28f33: 0x6c5c4c20, - 0x28f34: 0x6c53d820, 0x28f35: 0x6cbeb420, 0x28f37: 0x6c17e020, - 0x28f3a: 0x6c405c20, - 0x28f3c: 0x6c52ce20, 0x28f3d: 0x6cf6e220, 0x28f3e: 0x6cf3ee20, 0x28f3f: 0x6c987820, - // Block 0xa3d, offset 0x28f40 - 0x28f42: 0x6ce2fc20, - 0x28f45: 0x6c52d020, - 0x28f50: 0x6c0f6a20, 0x28f52: 0x6cbde820, 0x28f53: 0x6c44a420, - 0x28f56: 0x6c3f0020, 0x28f57: 0x6c7cde20, - 0x28f5d: 0x6c0cfe20, 0x28f5e: 0x6c6eba20, 0x28f5f: 0x6c76f220, - 0x28f60: 0x6c4a9020, 0x28f62: 0x6c432820, 0x28f63: 0x6d05f420, - 0x28f64: 0x6c01d420, 0x28f65: 0x6d26f420, 0x28f66: 0x6cf53420, 0x28f67: 0x6d157a20, - 0x28f68: 0x6c6dda20, 0x28f6a: 0x6c930220, 0x28f6b: 0x6cc31c20, - 0x28f6c: 0x6ce9c820, 0x28f6e: 0x6c62a420, - 0x28f7a: 0x6c6f3420, 0x28f7b: 0x6c74d420, - 0x28f7c: 0x6cb1d620, 0x28f7d: 0x6c7d8a20, - // Block 0xa3e, offset 0x28f80 - 0x28f80: 0x6cec7420, 0x28f81: 0x6c5c7620, 0x28f82: 0x6c341220, 0x28f83: 0x6d25f420, - 0x28f84: 0x6c6b6a20, 0x28f86: 0x6c4b9020, 0x28f87: 0x6c432e20, - 0x28f88: 0x6cb3b220, 0x28f89: 0x6c9ade20, 0x28f8a: 0x6d3bf020, 0x28f8b: 0x6c4f9c20, - 0x28f94: 0x6d1e0420, 0x28f95: 0x6cc0a420, 0x28f97: 0x6c834e20, - 0x28f98: 0x6c020620, 0x28f99: 0x6cb08020, 0x28f9a: 0x6cf24220, - 0x28f9d: 0x6cbe2a20, 0x28f9f: 0x6cbdee20, - 0x28fa0: 0x6c9f0620, 0x28fa1: 0x6c30d020, 0x28fa2: 0x6c9c9420, 0x28fa3: 0x6d2db820, - 0x28fa5: 0x6cbec020, 0x28fa6: 0x6d158c20, - 0x28fae: 0x6c04aa20, - 0x28fb1: 0x6c730a20, 0x28fb3: 0x6d2b2420, - 0x28fb4: 0x6d075c20, 0x28fb5: 0x6c7ff420, 0x28fb6: 0x6c968220, 0x28fb7: 0x6c968420, - 0x28fb8: 0x6cab6220, 0x28fb9: 0x6c06c020, 0x28fbb: 0x6cb3e820, - 0x28fbc: 0x6d075e20, - // Block 0xa3f, offset 0x28fc0 - 0x28fc0: 0x6c02fe20, - 0x28fc6: 0x6c53ae20, - 0x28fc9: 0x6c53b020, 0x28fca: 0x6d2e3c20, - 0x28fcc: 0x6ccbb620, 0x28fcd: 0x6c433020, 0x28fcf: 0x6cb34420, - 0x28fd0: 0x6c8aae20, - 0x28fd5: 0x6cec7a20, 0x28fd6: 0x6d07f420, - 0x28fdc: 0x6c7cb820, 0x28fdf: 0x6c36ea20, - 0x28fe0: 0x6c4f3e20, 0x28fe1: 0x6ccb9a20, - 0x28fe4: 0x6c28ee20, - 0x28fea: 0x6d07f620, - 0x28fec: 0x6c36f420, 0x28fed: 0x6c415a20, 0x28fef: 0x6c29c820, - 0x28ff1: 0x6c9bfa20, 0x28ff2: 0x6d143e20, 0x28ff3: 0x6ca94e20, - 0x28ff5: 0x6cb23020, - 0x28ff9: 0x6c124620, - 0x28ffe: 0x6d263c20, - // Block 0xa40, offset 0x29000 - 0x29000: 0x6c36fc20, 0x29001: 0x6ca8ca20, - 0x29004: 0x6d1b2e20, 0x29007: 0x6cbbca20, - 0x29009: 0x6c52e220, 0x2900a: 0x6c8dca20, - 0x2900c: 0x6c14e820, 0x2900d: 0x6d1d3020, - 0x29012: 0x6c494820, - 0x29014: 0x6ca7ca20, 0x29015: 0x6d05c620, 0x29016: 0x6cdff820, 0x29017: 0x6c6d6e20, - 0x2901b: 0x6caea620, - 0x2901d: 0x6c89e820, - 0x29020: 0x6c072c20, 0x29023: 0x6d030020, - 0x29024: 0x6cea6020, 0x29025: 0x6c174e20, 0x29026: 0x6c41a420, - 0x29028: 0x6c54e020, 0x29029: 0x6cee2e20, - 0x2902c: 0x6c3eba20, 0x2902d: 0x6cae2220, 0x2902f: 0x6ca4b620, - 0x29030: 0x6d0a1820, 0x29031: 0x6d096c20, - 0x29034: 0x6c8f1220, 0x29035: 0x6c8d4420, 0x29036: 0x6d097020, 0x29037: 0x6cc12e20, - 0x29038: 0x6c4fda20, 0x29039: 0x6d153c20, 0x2903a: 0x6c4ef420, - 0x2903c: 0x6c3ed220, 0x2903d: 0x6c038a20, 0x2903e: 0x6d153e20, - // Block 0xa41, offset 0x29040 - 0x29040: 0x6c0f3820, - 0x29044: 0x6c52c420, 0x29045: 0x6c866a20, - 0x29049: 0x6cc98820, 0x2904a: 0x6cf6b220, - 0x2904e: 0x6cd3ce20, 0x2904f: 0x6cb15e20, - 0x29050: 0x6c57c220, 0x29051: 0x6d155220, 0x29052: 0x6c0f5220, 0x29053: 0x6c0f6c20, - 0x29054: 0x6ca57620, 0x29055: 0x6cc09e20, - 0x29058: 0x6cf01e20, 0x29059: 0x6c184a20, 0x2905a: 0x6d1f7820, - 0x2905c: 0x6cf0dc20, 0x2905d: 0x6c5b6820, 0x2905e: 0x6cc99a20, - 0x29062: 0x6c53da20, 0x29063: 0x6cd9e820, - 0x29064: 0x6c4f1220, 0x29065: 0x6cad6a20, 0x29067: 0x6c39b020, - 0x29069: 0x6c8eae20, 0x2906a: 0x6d395a20, 0x2906b: 0x6cb02a20, - 0x2906d: 0x6c86b620, - 0x29070: 0x6c20e820, 0x29071: 0x6cf6fc20, 0x29072: 0x6d330220, - 0x29074: 0x6c085620, 0x29075: 0x6d333420, 0x29076: 0x6cdc9620, 0x29077: 0x6d0de420, - 0x2907c: 0x6cbe5a20, 0x2907d: 0x6cf53620, 0x2907e: 0x6c89a620, - // Block 0xa42, offset 0x29080 - 0x29080: 0x6d2fe420, 0x29081: 0x6c897220, - 0x29085: 0x6c6a3c20, 0x29087: 0x6c52da20, - 0x29088: 0x6d1ec020, 0x2908a: 0x6c7ea220, 0x2908b: 0x6c548620, - 0x2908d: 0x6d263620, 0x2908e: 0x6c539620, 0x2908f: 0x6d137820, - 0x29091: 0x6d1d1c20, 0x29092: 0x6d086020, 0x29093: 0x6d1f8620, - 0x29098: 0x6cc32020, - 0x2909c: 0x6ce15e20, 0x2909d: 0x6cddb620, 0x2909f: 0x6c871020, - 0x290a0: 0x6cd9fc20, 0x290a1: 0x6c871220, - 0x290a4: 0x6d245420, 0x290a7: 0x6d192020, - 0x290ad: 0x6d051220, 0x290ae: 0x6c028620, 0x290af: 0x6ce97420, - 0x290b0: 0x6cdb6220, 0x290b1: 0x6cd67a20, 0x290b3: 0x6d247020, - 0x290b5: 0x6c3c7a20, - 0x290b9: 0x6cdb6620, 0x290ba: 0x6ce9da20, 0x290bb: 0x6d247220, - 0x290bc: 0x6d331020, 0x290bd: 0x6d331220, 0x290bf: 0x6ce25420, - // Block 0xa43, offset 0x290c0 - 0x290c4: 0x6c8ee020, 0x290c6: 0x6c1a5c20, 0x290c7: 0x6cdc0620, - 0x290c8: 0x6ccad820, - 0x290cf: 0x6c47f420, - 0x290d0: 0x6c3c8a20, 0x290d1: 0x6c8b8420, 0x290d2: 0x6cb17a20, - 0x290d6: 0x6c87b620, - 0x290d8: 0x6c901820, 0x290d9: 0x6c1e7020, 0x290da: 0x6cff6220, 0x290db: 0x6c52e420, - 0x290dc: 0x6d029820, 0x290dd: 0x6ccf9420, - 0x290e0: 0x6c902620, 0x290e1: 0x6c53ea20, 0x290e2: 0x6d083e20, 0x290e3: 0x6c3c9620, - 0x290e5: 0x6c037420, 0x290e6: 0x6c0ecc20, 0x290e7: 0x6ce22620, - 0x290e8: 0x6cdabc20, 0x290e9: 0x6d2fb820, 0x290ea: 0x6c0c0220, 0x290eb: 0x6cd9c420, - 0x290ec: 0x6ce9aa20, 0x290ed: 0x6cdd8820, 0x290ee: 0x6cfefa20, 0x290ef: 0x6c527220, - 0x290f0: 0x6ccac620, 0x290f2: 0x6c3a1020, - 0x290f7: 0x6ca9aa20, - 0x290f8: 0x6c98ac20, - 0x290fd: 0x6c58ca20, 0x290fe: 0x6d343420, - // Block 0xa44, offset 0x29100 - 0x29102: 0x6d171620, - 0x29104: 0x6d22fe20, 0x29107: 0x6d14f020, - 0x29108: 0x6d264e20, 0x29109: 0x6c1b2220, - 0x29115: 0x6d1aea20, 0x29116: 0x6ca9a620, 0x29117: 0x6cc71420, - 0x2911b: 0x6ca34a20, - 0x29123: 0x6ce4a620, - 0x29125: 0x6c035020, - 0x2912a: 0x6c379c20, 0x2912b: 0x6d32dc20, - 0x2912c: 0x6c366a20, 0x2912d: 0x6cb3dc20, 0x2912e: 0x6c5efa20, 0x2912f: 0x6ca5f620, - 0x29131: 0x6c6f2020, 0x29132: 0x6c63d420, - 0x29135: 0x6c41a620, - 0x29139: 0x6c8d2e20, 0x2913b: 0x6d41bc20, - 0x2913e: 0x6c073820, - // Block 0xa45, offset 0x29140 - 0x29145: 0x6cd4f220, 0x29146: 0x6d15fc20, 0x29147: 0x6cabf420, - 0x2914b: 0x6ca50e20, - 0x2914c: 0x6cd3c020, 0x2914e: 0x6c97c620, 0x2914f: 0x6cd3c220, - 0x29151: 0x6ce35e20, - 0x29158: 0x6c45a420, - 0x2915d: 0x6c834420, 0x2915e: 0x6c061020, 0x2915f: 0x6d251020, - 0x29160: 0x6d422820, 0x29161: 0x6c80e620, 0x29162: 0x6d04f220, - 0x29165: 0x6d294220, 0x29166: 0x6c1a8620, 0x29167: 0x6c64e820, - 0x29168: 0x6c99b420, 0x29169: 0x6c63e220, 0x2916a: 0x6d23de20, - 0x2916d: 0x6d23e020, 0x2916e: 0x6d155420, - 0x29172: 0x6c982020, 0x29173: 0x6d294420, - 0x29175: 0x6d3ca820, 0x29176: 0x6ce37620, - 0x29179: 0x6cf8d620, 0x2917a: 0x6c716020, 0x2917b: 0x6d299e20, - 0x2917c: 0x6c92e420, 0x2917d: 0x6ce24420, - // Block 0xa46, offset 0x29180 - 0x29180: 0x6d3cb020, 0x29181: 0x6c8d6020, 0x29183: 0x6c729c20, - 0x29186: 0x6c5f4c20, 0x29187: 0x6c733020, - 0x2918a: 0x6d3e9a20, - 0x2918c: 0x6d265a20, 0x2918d: 0x6c301620, - 0x29192: 0x6ca47020, - 0x29196: 0x6c1d2420, - 0x2919f: 0x6c022020, - 0x291a3: 0x6c44e020, - 0x291a5: 0x6c0e9420, 0x291a6: 0x6c2fbc20, 0x291a7: 0x6cf02220, - 0x291ac: 0x6cc31a20, 0x291ad: 0x6c783a20, - 0x291b0: 0x6cb0cc20, 0x291b1: 0x6c76f420, 0x291b2: 0x6c3f0e20, 0x291b3: 0x6d1e6220, - 0x291b5: 0x6ce96620, 0x291b6: 0x6ce81e20, 0x291b7: 0x6d205a20, - 0x291b8: 0x6d10c020, 0x291ba: 0x6d126c20, - 0x291bd: 0x6d0ed220, - // Block 0xa47, offset 0x291c0 - 0x291c8: 0x6cfbb220, 0x291ca: 0x6ce38e20, - 0x291cc: 0x6cdc9820, - 0x291d0: 0x6c227420, - 0x291d4: 0x6d066220, 0x291d5: 0x6cf53820, 0x291d6: 0x6c117420, 0x291d7: 0x6d242420, - 0x291da: 0x6c15f820, 0x291db: 0x6cfa1020, - 0x291dd: 0x6c77ce20, 0x291de: 0x6c124220, 0x291df: 0x6c13bc20, - 0x291e0: 0x6cc0b420, 0x291e3: 0x6c267220, - 0x291e5: 0x6cdb5620, - 0x291e8: 0x6c571c20, - 0x291f7: 0x6cf38e20, - 0x291f8: 0x6d251a20, - 0x291fd: 0x6c681220, 0x291fe: 0x6cfe0820, 0x291ff: 0x6d2d0620, - // Block 0xa48, offset 0x29200 - 0x29200: 0x6cca3a20, 0x29201: 0x6ca09220, 0x29203: 0x6cce3e20, - 0x29204: 0x6c12a420, 0x29205: 0x6cdbe220, 0x29206: 0x6c208420, 0x29207: 0x6c9c9620, - 0x29208: 0x6d3a3420, 0x29209: 0x6c1d2820, 0x2920a: 0x6c62c220, 0x2920b: 0x6c1d2a20, - 0x29219: 0x6c889020, - 0x2921e: 0x6c4d8020, - 0x29224: 0x6c33c220, 0x29225: 0x6cfe0c20, 0x29226: 0x6c19ae20, 0x29227: 0x6cce4020, - 0x29228: 0x6c873820, 0x29229: 0x6c5a2c20, - 0x2922c: 0x6c2af820, 0x2922f: 0x6c897a20, - 0x29236: 0x6d28a420, - 0x2923a: 0x6c5e4420, 0x2923b: 0x6c8c0420, - 0x2923e: 0x6c31ee20, 0x2923f: 0x6c4f3620, - // Block 0xa49, offset 0x29240 - 0x29240: 0x6d1ddc20, 0x29241: 0x6d263a20, 0x29242: 0x6c4cf420, 0x29243: 0x6c8d9c20, - 0x29245: 0x6c88de20, 0x29247: 0x6c030220, - 0x29248: 0x6c292220, 0x29249: 0x6d194e20, 0x2924a: 0x6ca9e420, 0x2924b: 0x6ccde620, - 0x2924d: 0x6d035c20, - 0x29250: 0x6c26da20, 0x29251: 0x6d247420, 0x29252: 0x6c118220, 0x29253: 0x6cf33420, - 0x29254: 0x6c141420, 0x29255: 0x6c0fca20, 0x29257: 0x6c663020, - 0x2925e: 0x6c9bb820, 0x2925f: 0x6cf05e20, - 0x29260: 0x6ca09e20, - 0x29265: 0x6cd73820, 0x29266: 0x6c6b8220, 0x29267: 0x6cd7b220, - 0x29268: 0x6c5e5420, 0x2926b: 0x6c21ee20, - 0x2926d: 0x6c901420, 0x2926e: 0x6c582420, - 0x29270: 0x6ceada20, 0x29273: 0x6d220620, - 0x29276: 0x6c165a20, 0x29277: 0x6d1dee20, - 0x29278: 0x6c5e5e20, 0x2927a: 0x6c806820, - 0x2927f: 0x6ca30c20, - // Block 0xa4a, offset 0x29280 - 0x29280: 0x6c032220, 0x29281: 0x6c418020, 0x29282: 0x6d15cc20, 0x29283: 0x6c63ac20, - 0x29285: 0x6c269220, 0x29286: 0x6c2fa420, 0x29287: 0x6d0a8220, - 0x29288: 0x6cc59620, 0x29289: 0x6c732020, 0x2928a: 0x6ce94c20, 0x2928b: 0x6d064020, - 0x2928c: 0x6cd99220, 0x2928e: 0x6c128420, 0x2928f: 0x6c198e20, - 0x29291: 0x6c2f7020, - 0x2929a: 0x6c4d2620, - 0x2929f: 0x6cf47220, - 0x292a6: 0x6cb72020, - 0x292a8: 0x6c5f6820, - 0x292ae: 0x6c7cac20, 0x292af: 0x6cef5e20, - 0x292b6: 0x6cd44e20, 0x292b7: 0x6c3f2820, - 0x292b9: 0x6ce97a20, 0x292bb: 0x6c0cf020, - 0x292bd: 0x6cdff020, 0x292be: 0x6c4f5220, 0x292bf: 0x6cb1ce20, - // Block 0xa4b, offset 0x292c0 - 0x292c3: 0x6d217e20, - 0x292c4: 0x6cdffa20, - 0x292cc: 0x6cfd9020, 0x292ce: 0x6d050c20, - 0x292d3: 0x6cf26820, - 0x292d4: 0x6c4d8220, 0x292d5: 0x6caef220, - 0x292dd: 0x6ce04620, 0x292df: 0x6c0d0a20, - 0x292e0: 0x6cfd9e20, 0x292e3: 0x6d162e20, - 0x292e6: 0x6cb19020, 0x292e7: 0x6c586c20, - 0x292e8: 0x6ca24020, 0x292e9: 0x6c035220, 0x292eb: 0x6c396020, - 0x292ef: 0x6c2f6020, - 0x292f7: 0x6c3b3c20, - 0x292fa: 0x6c6bf620, - 0x292fe: 0x6cdd4a20, - // Block 0xa4c, offset 0x29300 - 0x29304: 0x6ced9220, 0x29305: 0x6c43a220, - 0x29308: 0x6c3b3e20, 0x2930a: 0x6ceb4420, - 0x2930c: 0x6cf1a620, 0x2930d: 0x6c487620, 0x2930e: 0x6c343620, - 0x29310: 0x6d308820, 0x29311: 0x6c22a020, 0x29312: 0x6d11ce20, - 0x29314: 0x6c050420, 0x29315: 0x6c10b820, 0x29316: 0x6ca15c20, - 0x29318: 0x6cb35e20, 0x2931b: 0x6c443020, - 0x2931e: 0x6c8e9220, - 0x29321: 0x6cc4d020, - 0x29328: 0x6c41b020, 0x2932a: 0x6c55a220, 0x2932b: 0x6ca1e620, - 0x2932e: 0x6d04f620, 0x2932f: 0x6c59a220, - 0x29330: 0x6c3f0220, 0x29331: 0x6c5b4220, 0x29333: 0x6cc1ca20, - 0x29334: 0x6c6b3e20, 0x29335: 0x6cead220, 0x29336: 0x6d21ac20, 0x29337: 0x6ca16820, - 0x29338: 0x6d38b220, 0x29339: 0x6c702820, 0x2933b: 0x6cd53c20, - 0x2933c: 0x6c7bae20, 0x2933d: 0x6cbf6620, 0x2933e: 0x6c8b2c20, 0x2933f: 0x6c405e20, - // Block 0xa4d, offset 0x29340 - 0x2934a: 0x6d074420, - 0x29356: 0x6c8c6e20, - 0x29358: 0x6ca88420, 0x2935a: 0x6caf9c20, - 0x2935c: 0x6c406e20, 0x2935d: 0x6c10c620, 0x2935e: 0x6d18e020, - 0x29361: 0x6c0f8620, 0x29363: 0x6c358420, - 0x29369: 0x6d30a620, 0x2936b: 0x6c86b820, - 0x2936e: 0x6ce92620, 0x2936f: 0x6c26cc20, - 0x29371: 0x6c931620, 0x29372: 0x6d0c4020, 0x29373: 0x6c301e20, - 0x29374: 0x6cbcfc20, 0x29375: 0x6ced5c20, 0x29376: 0x6ca03c20, 0x29377: 0x6d418020, - 0x29378: 0x6c408420, 0x29379: 0x6cc15620, 0x2937a: 0x6c078e20, 0x2937b: 0x6c02b420, - 0x2937c: 0x6cbaf620, - // Block 0xa4e, offset 0x29380 - 0x29381: 0x6cc44020, - 0x29388: 0x6cc41020, 0x29389: 0x6c576a20, 0x2938a: 0x6cfd2a20, 0x2938b: 0x6c7dd820, - 0x2938f: 0x6c258220, - 0x29392: 0x6d158820, - 0x29396: 0x6c1ae420, 0x29397: 0x6d404020, - 0x29398: 0x6ca52420, 0x29399: 0x6c1a5820, 0x2939a: 0x6c32a820, 0x2939b: 0x6d1e0620, - 0x2939c: 0x6d30e020, 0x2939e: 0x6ce0b020, 0x2939f: 0x6d0ff020, - 0x293a0: 0x6d011e20, 0x293a1: 0x6d07ec20, 0x293a3: 0x6c32e420, - 0x293a4: 0x6cd64c20, 0x293a5: 0x6cfbbe20, 0x293a6: 0x6cfbc020, - 0x293a9: 0x6c359e20, - 0x293b2: 0x6c7e5420, - 0x293b8: 0x6cf10220, 0x293b9: 0x6d1ec820, 0x293ba: 0x6d21e020, - 0x293bd: 0x6ce30420, 0x293bf: 0x6c6c7220, - // Block 0xa4f, offset 0x293c0 - 0x293c1: 0x6ce16420, 0x293c2: 0x6cb69e20, - 0x293c4: 0x6c2cec20, 0x293c5: 0x6ce1fe20, 0x293c6: 0x6c941820, 0x293c7: 0x6d2e9a20, - 0x293c8: 0x6cf17020, 0x293c9: 0x6c62d620, 0x293ca: 0x6c023820, 0x293cb: 0x6cabaa20, - 0x293cc: 0x6cb88420, - 0x293d0: 0x6cd21220, 0x293d1: 0x6cde2420, - 0x293d4: 0x6ca18e20, - 0x293d8: 0x6d1f9220, - 0x293e0: 0x6d2c6a20, 0x293e3: 0x6d117220, - 0x293eb: 0x6c1cfa20, - 0x293ec: 0x6c84b220, 0x293ed: 0x6d21f420, 0x293ee: 0x6c161420, 0x293ef: 0x6d143620, - 0x293f2: 0x6c1c9420, - 0x293f4: 0x6c84b420, - 0x293fd: 0x6ce90a20, 0x293ff: 0x6d40fe20, - // Block 0xa50, offset 0x29400 - 0x29402: 0x6cfbd620, - 0x29407: 0x6cf93620, - 0x29409: 0x6c0d0c20, 0x2940a: 0x6c4e4a20, 0x2940b: 0x6cb6b020, - 0x2940c: 0x6cca7a20, 0x2940e: 0x6c3a2c20, - 0x29410: 0x6ccdea20, - 0x29418: 0x6c584820, - 0x29420: 0x6c059a20, 0x29421: 0x6d220220, 0x29422: 0x6d220420, - 0x29424: 0x6c610420, - 0x29431: 0x6c7b0620, 0x29432: 0x6d3fe420, - 0x29439: 0x6cfd5420, 0x2943a: 0x6c9bc020, - // Block 0xa51, offset 0x29440 - 0x29443: 0x6c87b820, - 0x29444: 0x6d377820, 0x29445: 0x6c38fc20, 0x29446: 0x6c8b8820, 0x29447: 0x6c115620, - 0x29448: 0x6c320a20, 0x29449: 0x6c4a0020, 0x2944a: 0x6d04b020, 0x2944b: 0x6c84ea20, - 0x2944c: 0x6cb80c20, 0x2944f: 0x6c753420, - 0x29450: 0x6ceade20, 0x29452: 0x6c72d220, 0x29453: 0x6cff6420, - 0x29458: 0x6cc23420, - 0x2945c: 0x6d3bba20, - 0x29461: 0x6c754420, - 0x29466: 0x6c6bbc20, - 0x29468: 0x6d390620, 0x29469: 0x6cfc8820, 0x2946a: 0x6c8f7020, 0x2946b: 0x6d100420, - 0x2946c: 0x6cc4b220, 0x2946d: 0x6d16d620, 0x2946e: 0x6c8ae020, 0x2946f: 0x6c0e5620, - 0x29470: 0x6c5ce220, 0x29471: 0x6c61be20, 0x29472: 0x6c306a20, 0x29473: 0x6d386420, - 0x29474: 0x6cc29220, 0x29475: 0x6c6a9c20, - 0x2947a: 0x6c710820, - 0x2947c: 0x6c078620, 0x2947f: 0x6c087620, - // Block 0xa52, offset 0x29480 - 0x29480: 0x6c43fe20, 0x29481: 0x6c217c20, 0x29483: 0x6cb9a220, - 0x29484: 0x6cd9c820, 0x29485: 0x6cf0a020, 0x29486: 0x6c1a1420, 0x29487: 0x6c909020, - 0x29488: 0x6d213e20, 0x29489: 0x6c7e4620, 0x2948a: 0x6cb9a420, 0x2948b: 0x6c2cd220, - 0x2948c: 0x6cde0e20, 0x2948d: 0x6d2e6c20, 0x2948f: 0x6c38b620, - 0x29490: 0x6c8b5620, 0x29491: 0x6ce64420, 0x29492: 0x6c5ebe20, 0x29493: 0x6cb8de20, - 0x29494: 0x6c556820, 0x29497: 0x6d214220, - 0x29498: 0x6cb79c20, 0x29499: 0x6d214420, 0x2949a: 0x6cebe020, - 0x2949c: 0x6c03bc20, 0x2949d: 0x6cb61020, 0x2949e: 0x6cc95620, 0x2949f: 0x6cbb8620, - 0x294a0: 0x6d0bc220, 0x294a1: 0x6cfc1e20, - 0x294a8: 0x6c220820, 0x294a9: 0x6c396220, 0x294ab: 0x6c7dba20, - 0x294ac: 0x6c4be020, 0x294ad: 0x6cc39220, 0x294ae: 0x6c367a20, 0x294af: 0x6cbf4e20, - 0x294b2: 0x6c96d420, 0x294b3: 0x6c7a5820, - 0x294b4: 0x6d11c620, 0x294b7: 0x6cc39420, - 0x294b8: 0x6c1e6420, 0x294b9: 0x6c642c20, 0x294bb: 0x6d3a7a20, - 0x294bd: 0x6c331220, 0x294be: 0x6cec0a20, - // Block 0xa53, offset 0x294c0 - 0x294c0: 0x6ca51220, - 0x294c4: 0x6d0cce20, 0x294c5: 0x6ce78020, - 0x294cb: 0x6d03fe20, - 0x294cc: 0x6c4bee20, 0x294cd: 0x6cb26a20, - 0x294d1: 0x6d229c20, 0x294d2: 0x6c51ec20, - 0x294d4: 0x6d3da420, 0x294d7: 0x6ccf0020, - 0x294d8: 0x6d22a220, 0x294db: 0x6c62a620, - 0x294dd: 0x6cbaea20, 0x294de: 0x6cd73220, 0x294df: 0x6c21de20, - 0x294e0: 0x6d40e820, 0x294e1: 0x6c838e20, 0x294e2: 0x6ca60e20, - 0x294e4: 0x6cebf820, 0x294e5: 0x6d2c5c20, 0x294e7: 0x6c28d420, - 0x294ee: 0x6c328820, 0x294ef: 0x6c0bd020, - 0x294f0: 0x6c6a3e20, 0x294f1: 0x6cb87c20, 0x294f2: 0x6c519020, 0x294f3: 0x6c1d5e20, - 0x294f4: 0x6d0ce620, 0x294f6: 0x6d0ee020, - 0x294fa: 0x6cd94e20, 0x294fb: 0x6ce2c420, - 0x294fc: 0x6d11e020, 0x294fe: 0x6c779620, - // Block 0xa54, offset 0x29500 - 0x29500: 0x6d3c6e20, 0x29501: 0x6c4b9a20, 0x29502: 0x6c005a20, 0x29503: 0x6c4d8420, - 0x29508: 0x6cddb820, 0x29509: 0x6d076020, 0x2950a: 0x6c0c5020, - 0x2950c: 0x6c3cfc20, 0x2950d: 0x6cc15e20, 0x2950e: 0x6c98ae20, - 0x29510: 0x6c4ca020, - 0x29516: 0x6c0ac420, 0x29517: 0x6c751020, - 0x29518: 0x6c208a20, 0x2951b: 0x6cb47420, - 0x2951f: 0x6d195020, - 0x29522: 0x6cb95020, 0x29523: 0x6d196220, - 0x29524: 0x6c36ec20, 0x29525: 0x6c8da620, 0x29527: 0x6c0ace20, - 0x2952d: 0x6c5e5620, 0x2952e: 0x6ca0b620, - 0x29531: 0x6d09ce20, - 0x29534: 0x6d0f1e20, - 0x29538: 0x6c87ba20, 0x2953a: 0x6ce04e20, - 0x2953e: 0x6c947e20, - // Block 0xa55, offset 0x29540 - 0x29540: 0x6c769020, 0x29541: 0x6c99aa20, 0x29542: 0x6cfefc20, - 0x29547: 0x6c007220, - 0x2954a: 0x6cde1420, - 0x2954d: 0x6c9aac20, 0x2954f: 0x6c4c4220, - 0x29553: 0x6c432220, - 0x29554: 0x6ca4c220, 0x29555: 0x6c4ffc20, - 0x29560: 0x6cc39820, - 0x29565: 0x6c12a620, 0x29566: 0x6ccb0a20, - 0x2956b: 0x6cb03c20, - 0x29572: 0x6d006220, 0x29573: 0x6cff6620, - 0x29574: 0x6c712c20, - 0x29579: 0x6c1a2420, 0x2957a: 0x6ca50820, - // Block 0xa56, offset 0x29580 - 0x29580: 0x6ca58e20, - 0x2958d: 0x6ca25220, 0x2958f: 0x6cce8020, - 0x29591: 0x6c2cda20, - 0x29594: 0x6c8d5220, 0x29596: 0x6d31f820, 0x29597: 0x6d11d020, - 0x29599: 0x6c404a20, 0x2959a: 0x6cb9c620, 0x2959b: 0x6cbf5820, - 0x2959c: 0x6c715620, 0x2959d: 0x6c0e2c20, 0x2959e: 0x6c990620, 0x2959f: 0x6d2ce020, - 0x295a0: 0x6cdf0820, - 0x295a4: 0x6c1ce020, - 0x295ab: 0x6d2d3220, - 0x295ad: 0x6cd1f420, 0x295ae: 0x6d1e7c20, - 0x295b0: 0x6cbf6820, 0x295b1: 0x6c2a3820, 0x295b2: 0x6ce42620, 0x295b3: 0x6d3c7820, - 0x295b5: 0x6d1b8020, 0x295b7: 0x6ca51820, - 0x295b8: 0x6c0e9620, 0x295b9: 0x6c7bb220, 0x295ba: 0x6d355220, 0x295bb: 0x6c34ba20, - 0x295bc: 0x6c236220, 0x295bd: 0x6c061620, - // Block 0xa57, offset 0x295c0 - 0x295c7: 0x6c846820, - 0x295ca: 0x6c716c20, 0x295cb: 0x6cf1bc20, - 0x295cc: 0x6c8b3e20, 0x295cf: 0x6cf2c620, - 0x295d0: 0x6cd2de20, 0x295d1: 0x6ca7b620, 0x295d2: 0x6c987c20, 0x295d3: 0x6c6f8c20, - 0x295d8: 0x6d050020, - 0x295dd: 0x6cf2a420, 0x295df: 0x6c2a4020, - 0x295e1: 0x6cf70e20, 0x295e2: 0x6c01e020, 0x295e3: 0x6c26ce20, - 0x295e4: 0x6d401020, 0x295e5: 0x6c4f2a20, 0x295e6: 0x6c20ea20, 0x295e7: 0x6c089820, - 0x295e9: 0x6c309020, 0x295eb: 0x6d2f1220, - 0x295ef: 0x6d0b0220, - 0x295f2: 0x6c2bac20, 0x295f3: 0x6c5d6420, - 0x295f7: 0x6c9f8020, - 0x295fa: 0x6c408820, - 0x295fc: 0x6c061e20, 0x295fd: 0x6c78e420, 0x295fe: 0x6c991020, 0x295ff: 0x6cc55820, - // Block 0xa58, offset 0x29600 - 0x29600: 0x6d3fda20, 0x29601: 0x6cb88020, 0x29602: 0x6cf98020, 0x29603: 0x6cda0220, - 0x29604: 0x6d050e20, 0x29605: 0x6ca36e20, - 0x29609: 0x6c979620, - 0x2960e: 0x6d2c0820, 0x2960f: 0x6c154a20, - 0x29610: 0x6ccf8420, 0x29611: 0x6cf2ca20, - 0x29616: 0x6c005c20, 0x29617: 0x6c059820, - 0x29618: 0x6c4fb820, 0x2961a: 0x6ccad420, 0x2961b: 0x6cddba20, - 0x2961c: 0x6ce44020, 0x2961d: 0x6d0bcc20, 0x2961f: 0x6c0e3a20, - 0x29620: 0x6cc6e420, - 0x2962b: 0x6ccc2c20, - 0x2962c: 0x6cf26a20, 0x2962f: 0x6c028a20, - 0x29631: 0x6d3c2820, 0x29633: 0x6cb1c020, - 0x29634: 0x6cdbe820, 0x29635: 0x6d143820, 0x29636: 0x6cda0420, 0x29637: 0x6c30d220, - 0x29638: 0x6cda0620, 0x29639: 0x6c956e20, - // Block 0xa59, offset 0x29640 - 0x29643: 0x6c3afc20, - 0x29644: 0x6d422220, 0x29646: 0x6ca53c20, 0x29647: 0x6c2ac420, - 0x29648: 0x6d34c220, 0x29649: 0x6c25d020, 0x2964a: 0x6c8a5820, 0x2964b: 0x6c616420, - 0x2964c: 0x6c0ea020, 0x2964d: 0x6c23d020, 0x2964e: 0x6c1a6020, 0x2964f: 0x6c104e20, - 0x29651: 0x6cca1020, 0x29652: 0x6d29be20, - 0x29658: 0x6c69e420, 0x2965b: 0x6d125220, - 0x2965c: 0x6c920620, 0x2965e: 0x6c121420, - 0x29668: 0x6ca67020, - 0x29670: 0x6c6b8820, 0x29671: 0x6cb47c20, 0x29672: 0x6d3c5020, 0x29673: 0x6d29c820, - 0x2967a: 0x6c87c420, - 0x2967d: 0x6c7ed020, - // Block 0xa5a, offset 0x29680 - 0x29680: 0x6c1d0620, 0x29683: 0x6d2eae20, - 0x2968d: 0x6c0bb420, 0x2968e: 0x6cf23220, - 0x29693: 0x6c53de20, - 0x29697: 0x6cb1fc20, - 0x29699: 0x6ccb9e20, - 0x2969e: 0x6ca67220, 0x2969f: 0x6c3b4e20, - 0x296a0: 0x6d065620, 0x296a2: 0x6cd2da20, - 0x296a4: 0x6c72c220, - 0x296a8: 0x6c752420, 0x296aa: 0x6d24a220, - 0x296ac: 0x6c4c2a20, 0x296ad: 0x6c4c3420, 0x296af: 0x6c55a420, - 0x296b2: 0x6c869020, 0x296b3: 0x6d00fa20, - 0x296b4: 0x6c376c20, 0x296b5: 0x6d25b420, 0x296b6: 0x6c4d2e20, - 0x296b9: 0x6c6ebc20, 0x296bb: 0x6c78de20, - 0x296bd: 0x6d3fcc20, 0x296be: 0x6c3ae620, - // Block 0xa5b, offset 0x296c0 - 0x296c0: 0x6cae8820, 0x296c1: 0x6c44e220, 0x296c3: 0x6c652820, - 0x296c4: 0x6ca61220, 0x296c6: 0x6cfbc220, 0x296c7: 0x6c873c20, - 0x296c8: 0x6c17a820, 0x296ca: 0x6c377620, 0x296cb: 0x6c44e820, - 0x296cc: 0x6d247620, 0x296cd: 0x6c560420, 0x296ce: 0x6c3af820, 0x296cf: 0x6c028c20, - 0x296d3: 0x6c37b220, - 0x296d8: 0x6c78ec20, 0x296d9: 0x6c7ab620, 0x296da: 0x6c0fd020, - 0x296dd: 0x6d13a020, 0x296de: 0x6c69e820, - 0x296e6: 0x6c17ae20, 0x296e7: 0x6c44ec20, - 0x296e8: 0x6cc82e20, 0x296ea: 0x6d273c20, - 0x296ec: 0x6c8c1620, - 0x296f1: 0x6d24a620, 0x296f2: 0x6d274820, 0x296f3: 0x6d2d1220, - 0x296f4: 0x6cff6820, 0x296f7: 0x6c9f2420, - 0x296fb: 0x6c4af820, - 0x296fc: 0x6c6f6e20, 0x296fe: 0x6cebaa20, - // Block 0xa5c, offset 0x29700 - 0x29701: 0x6cf78220, 0x29702: 0x6cefd620, 0x29703: 0x6d3d6a20, - 0x29704: 0x6cf0a220, 0x29705: 0x6c7c8420, - 0x29708: 0x6c9a9820, 0x2970a: 0x6c505020, 0x2970b: 0x6c4f5020, - 0x2970c: 0x6c399a20, 0x2970d: 0x6ca96e20, 0x2970e: 0x6d205420, 0x2970f: 0x6c57a420, - 0x29712: 0x6c812420, - 0x29720: 0x6d3a1820, 0x29721: 0x6c4b1620, 0x29722: 0x6c0a1620, 0x29723: 0x6c642e20, - 0x29724: 0x6ce59c20, 0x29726: 0x6c93f020, 0x29727: 0x6c79a220, - 0x29728: 0x6d419420, 0x29729: 0x6c8d4620, 0x2972a: 0x6cb63220, - 0x2972c: 0x6d3a1e20, - 0x29731: 0x6c47ba20, 0x29732: 0x6d413020, - 0x29734: 0x6d0f6620, 0x29735: 0x6cda5620, 0x29737: 0x6c7c9620, - 0x29739: 0x6c167a20, 0x2973b: 0x6d113e20, - 0x2973e: 0x6d23e220, - // Block 0xa5d, offset 0x29740 - 0x29745: 0x6cd50420, 0x29746: 0x6c7f5420, 0x29747: 0x6d187620, - 0x29748: 0x6c30c420, - 0x2974c: 0x6cf3f020, 0x2974d: 0x6d1d1220, 0x2974e: 0x6c3f0420, 0x2974f: 0x6d3be820, - 0x29750: 0x6c3f8a20, 0x29752: 0x6cdb2a20, 0x29753: 0x6c853420, - 0x29754: 0x6d122820, 0x29755: 0x6cea1020, - 0x2975d: 0x6c4b7a20, - 0x29761: 0x6c940020, 0x29762: 0x6d0ed420, 0x29763: 0x6cb66620, - 0x29764: 0x6c813020, 0x29765: 0x6d3a3020, 0x29767: 0x6c4b1e20, - 0x29768: 0x6c551020, - 0x2976f: 0x6c6ddc20, - 0x29772: 0x6c1bc620, - 0x29775: 0x6c717220, 0x29776: 0x6d2c6020, - 0x29778: 0x6c9e8020, - // Block 0xa5e, offset 0x29780 - 0x29780: 0x6d39da20, 0x29781: 0x6c41ba20, 0x29782: 0x6d047620, 0x29783: 0x6c60e620, - 0x29787: 0x6cccaa20, - 0x29788: 0x6c9ab620, 0x29789: 0x6d287420, - 0x2978d: 0x6cd48820, - 0x29790: 0x6c941a20, 0x29791: 0x6d206020, 0x29792: 0x6c681420, 0x29793: 0x6caacc20, - 0x29798: 0x6c72c420, 0x29799: 0x6d206220, - 0x2979c: 0x6d195220, 0x2979d: 0x6ce2ce20, 0x2979e: 0x6cef7220, 0x2979f: 0x6c17f620, - 0x297a0: 0x6c8c8620, 0x297a1: 0x6c483020, 0x297a3: 0x6c875a20, - 0x297a4: 0x6c8ab020, 0x297a7: 0x6c68ac20, - 0x297a8: 0x6d0ff620, 0x297a9: 0x6c0c5e20, 0x297aa: 0x6cb6a220, - 0x297ae: 0x6d196420, - 0x297b1: 0x6c0d7620, 0x297b2: 0x6c9bbc20, 0x297b3: 0x6c145a20, - 0x297b5: 0x6c41be20, - 0x297b9: 0x6cc21c20, 0x297ba: 0x6c2bc020, 0x297bb: 0x6c82a020, - // Block 0xa5f, offset 0x297c0 - 0x297c0: 0x6c8dcc20, - 0x297c4: 0x6c585220, 0x297c5: 0x6cc23220, 0x297c7: 0x6c959c20, - 0x297c9: 0x6c7cc820, - 0x297cd: 0x6cc08020, 0x297ce: 0x6d227620, 0x297cf: 0x6c57a620, - 0x297d3: 0x6c833a20, - 0x297d5: 0x6cc60620, 0x297d6: 0x6cffb620, 0x297d7: 0x6cd8da20, - 0x297da: 0x6c327220, 0x297db: 0x6c0cb420, - 0x297e0: 0x6ca97020, 0x297e2: 0x6c51e020, 0x297e3: 0x6cadc420, - 0x297e5: 0x6c3acc20, 0x297e6: 0x6ca2aa20, - 0x297e9: 0x6c3d9620, - 0x297ec: 0x6c55a820, 0x297ed: 0x6cedec20, 0x297ee: 0x6ccc1420, - 0x297f0: 0x6c687420, 0x297f1: 0x6cf47420, - 0x297f9: 0x6c404c20, - // Block 0xa60, offset 0x29800 - 0x29801: 0x6c0df620, 0x29802: 0x6d3b3020, - 0x29804: 0x6d3a2a20, 0x29805: 0x6c1ada20, 0x29807: 0x6cd07c20, - 0x29808: 0x6c550820, 0x29809: 0x6c101e20, - 0x2980e: 0x6cc4d420, - 0x29816: 0x6ca2b620, - 0x29818: 0x6c869220, 0x2981b: 0x6c638820, - 0x2981e: 0x6c96e020, - 0x29821: 0x6c9b6820, 0x29822: 0x6ca1f020, 0x29823: 0x6d38b820, - 0x29824: 0x6cfc3820, 0x29825: 0x6c5b7420, 0x29826: 0x6c48fc20, 0x29827: 0x6c702c20, - 0x29829: 0x6ca2b820, 0x2982b: 0x6cc82a20, - 0x2982d: 0x6cf3fc20, 0x2982f: 0x6cc7d820, - 0x29831: 0x6d2ce620, - // Block 0xa61, offset 0x29840 - 0x29841: 0x6caae220, 0x29842: 0x6d010a20, - 0x29844: 0x6c680220, - 0x2984b: 0x6c853a20, - 0x2984c: 0x6cd51020, 0x2984d: 0x6d190020, 0x2984e: 0x6c2bae20, 0x2984f: 0x6cbe9220, - 0x29850: 0x6c717420, 0x29853: 0x6d373620, - 0x29855: 0x6c80f020, 0x29856: 0x6c10ca20, 0x29857: 0x6c7bca20, - 0x29858: 0x6d190220, 0x2985a: 0x6c0f9a20, - 0x29867: 0x6c1c8c20, - 0x2986d: 0x6c680c20, 0x2986f: 0x6cf32a20, - 0x29870: 0x6d0aac20, - 0x29875: 0x6cea3220, 0x29876: 0x6c987e20, - 0x29878: 0x6c39b220, 0x29879: 0x6d3dce20, 0x2987b: 0x6cb88220, - 0x2987d: 0x6cde2220, 0x2987e: 0x6cb68a20, - // Block 0xa62, offset 0x29880 - 0x29880: 0x6caf1e20, 0x29881: 0x6c0cc620, 0x29882: 0x6c3bfe20, 0x29883: 0x6ce92820, - 0x29884: 0x6c57d220, 0x29887: 0x6c36d220, - 0x2988b: 0x6c36d420, - 0x2988e: 0x6c2fc420, - 0x29890: 0x6cc7e220, - 0x29896: 0x6c36d620, - 0x2989e: 0x6d0ef020, 0x2989f: 0x6cd8f820, - 0x298a5: 0x6d1cc020, 0x298a6: 0x6ca61620, 0x298a7: 0x6ca61820, - 0x298a8: 0x6d158e20, - 0x298b9: 0x6c9c9820, - 0x298be: 0x6d129820, 0x298bf: 0x6cb32620, - // Block 0xa63, offset 0x298c0 - 0x298c0: 0x6c240420, 0x298c2: 0x6cf11820, - 0x298c4: 0x6c4d8820, 0x298c5: 0x6d1c2820, 0x298c7: 0x6ce6a020, - 0x298c8: 0x6d375e20, 0x298c9: 0x6c3a2a20, 0x298ca: 0x6d1f9420, - 0x298cd: 0x6c7cb020, 0x298ce: 0x6c01e220, 0x298cf: 0x6c03d220, - 0x298d1: 0x6c4f3420, - 0x298de: 0x6ca41620, 0x298df: 0x6ca3da20, - 0x298e2: 0x6c6df420, - 0x298e5: 0x6ceece20, - 0x298f1: 0x6c1f8e20, 0x298f3: 0x6cddbe20, - 0x298f4: 0x6ce20020, 0x298f5: 0x6cb6a620, 0x298f6: 0x6ce16620, 0x298f7: 0x6cf05a20, - 0x298f8: 0x6c41fc20, 0x298fa: 0x6c446420, - 0x298fc: 0x6c4f3820, 0x298fe: 0x6ca37420, 0x298ff: 0x6c446620, - // Block 0xa64, offset 0x29900 - 0x29904: 0x6d331420, - 0x29917: 0x6cde2820, - 0x2991b: 0x6cd84c20, - 0x2991d: 0x6ca6de20, 0x2991e: 0x6cca9820, - 0x2992b: 0x6d012a20, - 0x2992f: 0x6d410220, - 0x29930: 0x6d21fc20, 0x29931: 0x6ca6e020, 0x29932: 0x6cb55420, - 0x29935: 0x6cd03220, - 0x2993c: 0x6c102020, - // Block 0xa65, offset 0x29940 - 0x2994b: 0x6c7d9a20, - 0x2994c: 0x6c84c420, 0x2994e: 0x6c488220, - 0x29956: 0x6d0e1c20, 0x29957: 0x6c10d220, - 0x29958: 0x6c672a20, 0x2995a: 0x6cf40e20, 0x2995b: 0x6c134420, - 0x2995c: 0x6c8c0e20, 0x2995d: 0x6d3c0420, 0x2995f: 0x6c5b0e20, - 0x29961: 0x6ce7a620, 0x29962: 0x6d2ca220, - 0x29964: 0x6c522c20, 0x29967: 0x6c4ce220, - 0x29971: 0x6c6e4220, - 0x29975: 0x6c2f1620, 0x29977: 0x6d1cdc20, - 0x2997c: 0x6d377420, - // Block 0xa66, offset 0x29980 - 0x29982: 0x6cf06620, - 0x29984: 0x6c62fa20, 0x29985: 0x6cc73620, - 0x29988: 0x6c030620, 0x29989: 0x6c292420, 0x2998a: 0x6c958a20, 0x2998b: 0x6d13a220, - 0x2998c: 0x6ceed220, - 0x29992: 0x6cbb3220, - 0x29999: 0x6c446c20, 0x2999a: 0x6c62fc20, - 0x299a6: 0x6d409620, - 0x299a8: 0x6d15a620, 0x299ab: 0x6d2ca420, - 0x299ad: 0x6c8b8c20, - 0x299b4: 0x6d13a820, - 0x299bc: 0x6d2dd420, - // Block 0xa67, offset 0x299c0 - 0x299c0: 0x6c1e1620, 0x299c1: 0x6c0c6620, - 0x299c6: 0x6d077020, 0x299c7: 0x6d1eda20, - 0x299cd: 0x6d029a20, 0x299ce: 0x6cef7c20, 0x299cf: 0x6c87ca20, - 0x299db: 0x6c0fdc20, - 0x299dc: 0x6c664c20, 0x299dd: 0x6c158220, 0x299de: 0x6c7d9e20, - 0x299e1: 0x6cbe9a20, - 0x299e7: 0x6cd6ce20, - 0x299e8: 0x6cf76420, 0x299e9: 0x6cc23620, - 0x299f0: 0x6c95a020, 0x299f3: 0x6c294c20, - 0x299f4: 0x6ca71020, 0x299f5: 0x6c855a20, 0x299f7: 0x6c03e420, - 0x299f9: 0x6c365220, 0x299fa: 0x6c3d7a20, 0x299fb: 0x6c400620, - 0x299fc: 0x6c5d1220, 0x299fd: 0x6d2cd820, 0x299fe: 0x6c014420, - // Block 0xa68, offset 0x29a00 - 0x29a01: 0x6cc09620, 0x29a02: 0x6c1dd620, 0x29a03: 0x6c9e3c20, - 0x29a04: 0x6d0aa620, 0x29a05: 0x6ce92420, 0x29a06: 0x6ca60c20, 0x29a07: 0x6c570220, - 0x29a08: 0x6cd50a20, 0x29a0a: 0x6d05f620, 0x29a0b: 0x6d384620, - 0x29a0c: 0x6c776220, - 0x29a12: 0x6cfee220, 0x29a13: 0x6cfee420, - 0x29a14: 0x6c22d420, 0x29a15: 0x6c1c3c20, 0x29a17: 0x6c2dd220, - 0x29a18: 0x6d181420, 0x29a1a: 0x6c2f6420, - 0x29a1d: 0x6c4ef620, 0x29a1e: 0x6cece420, - 0x29a20: 0x6d160220, 0x29a21: 0x6c066020, 0x29a22: 0x6d184220, - 0x29a27: 0x6d0a9e20, - 0x29a2c: 0x6cfdd420, - 0x29a33: 0x6c08a420, - 0x29a36: 0x6c6b3020, 0x29a37: 0x6c43a620, - 0x29a38: 0x6d2b5620, 0x29a3a: 0x6d326a20, 0x29a3b: 0x6c55aa20, - 0x29a3c: 0x6cf6b420, 0x29a3d: 0x6d02e820, 0x29a3e: 0x6cff1220, 0x29a3f: 0x6c404e20, - // Block 0xa69, offset 0x29a40 - 0x29a40: 0x6d383c20, 0x29a42: 0x6c99b620, 0x29a43: 0x6d02ea20, - 0x29a44: 0x6cbad820, - 0x29a48: 0x6c3b9220, 0x29a49: 0x6c049820, 0x29a4a: 0x6c583220, - 0x29a51: 0x6c687620, 0x29a53: 0x6c066620, - 0x29a54: 0x6d0af820, 0x29a55: 0x6d114020, - 0x29a5b: 0x6cf8d820, - 0x29a5d: 0x6c729e20, 0x29a5f: 0x6cc27c20, - 0x29a60: 0x6d26f020, 0x29a61: 0x6cdf4220, 0x29a62: 0x6ce81820, 0x29a63: 0x6ca16c20, - 0x29a64: 0x6d2c5420, 0x29a65: 0x6cc1ce20, 0x29a67: 0x6c3da620, - 0x29a69: 0x6cc1d020, 0x29a6a: 0x6c1c7e20, - 0x29a6c: 0x6d1f7c20, - 0x29a77: 0x6ce38620, - 0x29a7a: 0x6cebf020, - 0x29a7d: 0x6ceb5620, 0x29a7f: 0x6c1eb220, - // Block 0xa6a, offset 0x29a80 - 0x29a81: 0x6c43b020, - 0x29a88: 0x6d251620, 0x29a89: 0x6c43b220, 0x29a8a: 0x6cc1d220, - 0x29a8f: 0x6c72a020, - 0x29a92: 0x6c2ef820, 0x29a93: 0x6d157e20, - 0x29a94: 0x6cd20820, 0x29a95: 0x6d18e420, 0x29a97: 0x6c4b2020, - 0x29a98: 0x6c680420, 0x29a9a: 0x6cd94420, 0x29a9b: 0x6cbf7220, - 0x29a9d: 0x6c36c220, 0x29a9e: 0x6c59a420, 0x29a9f: 0x6c5b4620, - 0x29aa0: 0x6d0a4620, 0x29aa3: 0x6c717020, - 0x29aa5: 0x6d2d2220, 0x29aa6: 0x6c1c8220, 0x29aa7: 0x6c81c020, - 0x29aa9: 0x6cb66820, 0x29aaa: 0x6d050420, - 0x29aac: 0x6c5af620, 0x29aad: 0x6ce79820, - 0x29aba: 0x6c407220, - 0x29abd: 0x6d0a4820, 0x29abe: 0x6c6b4e20, 0x29abf: 0x6c9d0620, - // Block 0xa6b, offset 0x29ac0 - 0x29ac0: 0x6d242820, - 0x29ac8: 0x6d3c4a20, 0x29ac9: 0x6c688e20, 0x29aca: 0x6d373820, 0x29acb: 0x6c1a5220, - 0x29acd: 0x6c6b6c20, 0x29ace: 0x6cff3220, 0x29acf: 0x6c18f220, - 0x29ad0: 0x6c848220, 0x29ad1: 0x6d26fe20, 0x29ad3: 0x6d373a20, - 0x29ad4: 0x6c818820, 0x29ad5: 0x6cf32c20, 0x29ad6: 0x6cc1ea20, - 0x29ad8: 0x6cedce20, 0x29ada: 0x6d142e20, 0x29adb: 0x6d190420, - 0x29adc: 0x6c80f220, 0x29ade: 0x6ce7fa20, 0x29adf: 0x6c015c20, - 0x29ae0: 0x6c74e420, 0x29ae1: 0x6d0ee420, - 0x29ae5: 0x6c72b020, 0x29ae7: 0x6d327620, - 0x29ae9: 0x6d373c20, 0x29aea: 0x6c98a820, - 0x29aee: 0x6d055420, - 0x29af1: 0x6c208020, 0x29af2: 0x6c1e6c20, - 0x29af8: 0x6cbafc20, 0x29af9: 0x6c3a2620, 0x29afa: 0x6c16d420, - 0x29afc: 0x6c9dec20, 0x29afd: 0x6cdb5a20, 0x29afe: 0x6c02b820, - // Block 0xa6c, offset 0x29b00 - 0x29b00: 0x6c3f9620, - 0x29b04: 0x6cf10620, 0x29b05: 0x6d342420, 0x29b06: 0x6c9f8220, 0x29b07: 0x6c168820, - 0x29b08: 0x6d0cfa20, 0x29b09: 0x6d245820, 0x29b0b: 0x6c408a20, - 0x29b0c: 0x6cded020, 0x29b0d: 0x6c616020, 0x29b0f: 0x6c3aee20, - 0x29b12: 0x6c55f620, 0x29b13: 0x6c70e220, - 0x29b15: 0x6d22ac20, - 0x29b1b: 0x6cb69220, - 0x29b1c: 0x6c9a3820, 0x29b1f: 0x6c0ccc20, - 0x29b20: 0x6c4cd820, - 0x29b24: 0x6ca04c20, 0x29b26: 0x6ced5e20, 0x29b27: 0x6ced6020, - 0x29b34: 0x6c6dec20, 0x29b35: 0x6d245a20, 0x29b36: 0x6cfbce20, - 0x29b39: 0x6c212a20, 0x29b3a: 0x6c60f820, - 0x29b3c: 0x6cfd9620, 0x29b3d: 0x6cae4420, 0x29b3e: 0x6c409220, - // Block 0xa6d, offset 0x29b40 - 0x29b42: 0x6c8ed820, - 0x29b44: 0x6cc9da20, 0x29b45: 0x6d08f020, 0x29b46: 0x6d409220, - 0x29b48: 0x6c6b7e20, 0x29b4b: 0x6d2dc220, - 0x29b4d: 0x6d21e820, 0x29b4e: 0x6d21ea20, 0x29b4f: 0x6c9a4020, - 0x29b50: 0x6c9ea820, 0x29b51: 0x6c99c020, 0x29b52: 0x6c346a20, 0x29b53: 0x6c409420, - 0x29b5b: 0x6c671820, - 0x29b66: 0x6c9e8420, - 0x29b68: 0x6c023a20, - 0x29b6d: 0x6c78e620, - 0x29b76: 0x6c544420, - 0x29b7a: 0x6c46e420, - 0x29b7c: 0x6cf74c20, 0x29b7e: 0x6cc6e820, 0x29b7f: 0x6c43be20, - // Block 0xa6e, offset 0x29b80 - 0x29b80: 0x6cac9220, 0x29b81: 0x6d25d420, 0x29b82: 0x6cfa5e20, - 0x29b85: 0x6ccc2e20, 0x29b86: 0x6cafa620, - 0x29b88: 0x6cbe9620, 0x29b89: 0x6d1dde20, 0x29b8a: 0x6cc20220, - 0x29b8c: 0x6c462820, 0x29b8e: 0x6c446820, 0x29b8f: 0x6cfb0820, - 0x29b91: 0x6cdb6820, - 0x29b95: 0x6c04ae20, 0x29b96: 0x6cb6a820, 0x29b97: 0x6c548820, - 0x29b9b: 0x6cf74e20, - 0x29b9d: 0x6cf39220, - 0x29bad: 0x6cb55620, 0x29bae: 0x6c56ec20, 0x29baf: 0x6c4aae20, - 0x29bb1: 0x6c2bbc20, 0x29bb2: 0x6cce2c20, 0x29bb3: 0x6c975220, - 0x29bb4: 0x6c9fde20, 0x29bb5: 0x6c62ea20, 0x29bb6: 0x6cf7c820, 0x29bb7: 0x6cfb1020, - 0x29bb8: 0x6c610220, 0x29bb9: 0x6c16d820, 0x29bba: 0x6c7a1220, 0x29bbb: 0x6c1cfc20, - // Block 0xa6f, offset 0x29bc0 - 0x29bc2: 0x6d2ef020, 0x29bc3: 0x6cb1aa20, - 0x29bc4: 0x6cdb6c20, 0x29bc5: 0x6c94cc20, 0x29bc6: 0x6c84c620, 0x29bc7: 0x6c9c2020, - 0x29bc8: 0x6c1cfe20, 0x29bc9: 0x6ce47c20, 0x29bcb: 0x6c8da820, - 0x29bcd: 0x6c1c9a20, - 0x29bd6: 0x6c1d0020, - 0x29bd9: 0x6c1c9c20, - 0x29bdd: 0x6ca7c820, 0x29bdf: 0x6d1e0a20, - 0x29bee: 0x6c9db020, - 0x29bf0: 0x6cd51e20, 0x29bf2: 0x6cf93820, - 0x29bf4: 0x6c36f620, 0x29bf5: 0x6d3ec820, - 0x29bf8: 0x6c6b8420, 0x29bf9: 0x6c5faa20, 0x29bfa: 0x6c53e820, 0x29bfb: 0x6cd18220, - 0x29bfc: 0x6c879c20, 0x29bfe: 0x6cb55c20, - // Block 0xa70, offset 0x29c00 - 0x29c00: 0x6d38c620, 0x29c01: 0x6cd85820, 0x29c02: 0x6cc21e20, - 0x29c0b: 0x6d013420, - 0x29c17: 0x6cd85a20, - 0x29c1b: 0x6d061220, - 0x29c20: 0x6c409e20, - 0x29c2f: 0x6ca9e620, - 0x29c30: 0x6d0bd020, 0x29c31: 0x6c8ef020, 0x29c32: 0x6c643420, 0x29c33: 0x6c4ab020, - 0x29c34: 0x6c7cc020, 0x29c35: 0x6c1ca220, 0x29c36: 0x6c121620, 0x29c37: 0x6c1ed020, - 0x29c39: 0x6c4c5020, 0x29c3b: 0x6c285a20, - 0x29c3f: 0x6c672e20, - // Block 0xa71, offset 0x29c40 - 0x29c41: 0x6c292620, 0x29c42: 0x6c548c20, - 0x29c44: 0x6c7a1420, 0x29c46: 0x6c1f9220, 0x29c47: 0x6cb96220, - 0x29c48: 0x6c010c20, 0x29c4a: 0x6cb0e420, - 0x29c51: 0x6d0abc20, 0x29c52: 0x6c6dfc20, 0x29c53: 0x6c9c2620, - 0x29c55: 0x6c0d7a20, 0x29c56: 0x6c801620, 0x29c57: 0x6c47fa20, - 0x29c58: 0x6c1e1420, 0x29c5b: 0x6d1dec20, - 0x29c5c: 0x6c488420, 0x29c5d: 0x6d220a20, 0x29c5e: 0x6d397420, - 0x29c6d: 0x6c115820, 0x29c6f: 0x6c8ef420, - 0x29c70: 0x6c105420, 0x29c71: 0x6c965820, 0x29c72: 0x6c6b8c20, 0x29c73: 0x6d31a820, - 0x29c74: 0x6c9f2220, 0x29c75: 0x6c4a1620, 0x29c77: 0x6c63f820, - 0x29c79: 0x6c7ed220, - // Block 0xa72, offset 0x29c80 - 0x29c80: 0x6cd48c20, 0x29c83: 0x6c4c5220, - 0x29c86: 0x6c9c2820, 0x29c87: 0x6cb9ea20, - 0x29c88: 0x6c7f8420, 0x29c8a: 0x6c51b220, 0x29c8b: 0x6ce97c20, - 0x29c91: 0x6c5b1020, - 0x29c98: 0x6c52e620, - 0x29c9c: 0x6c93c820, 0x29c9f: 0x6c63fa20, - 0x29ca5: 0x6c4ab220, - 0x29ca8: 0x6d144420, 0x29ca9: 0x6c585420, - 0x29cb0: 0x6c95a220, - 0x29cb4: 0x6c754620, - 0x29cb8: 0x6c49ce20, 0x29cbb: 0x6cc34820, - 0x29cbc: 0x6ca7cc20, 0x29cbf: 0x6c97b220, - // Block 0xa73, offset 0x29cc0 - 0x29cc2: 0x6d282420, 0x29cc3: 0x6cf18a20, - 0x29cc4: 0x6c1c0c20, 0x29cc5: 0x6c1c1820, 0x29cc6: 0x6d33dc20, - 0x29cc8: 0x6c224420, 0x29cc9: 0x6d3c3e20, 0x29cca: 0x6c573c20, 0x29ccb: 0x6c6ac020, - 0x29ccc: 0x6cc19e20, 0x29ccd: 0x6ce86620, 0x29cce: 0x6c9f6a20, 0x29ccf: 0x6c9a2020, - 0x29cd0: 0x6d218020, 0x29cd1: 0x6c026e20, 0x29cd2: 0x6c049a20, - 0x29cd4: 0x6caf8c20, 0x29cd5: 0x6d31a420, 0x29cd6: 0x6c91d020, 0x29cd7: 0x6c1c5420, - 0x29cd8: 0x6ce7f620, 0x29cda: 0x6c6a3420, - 0x29cdc: 0x6d2da420, - 0x29ce2: 0x6c6c6820, 0x29ce3: 0x6c91f020, - 0x29ce6: 0x6c670a20, 0x29ce7: 0x6ce0b420, - 0x29ce8: 0x6c168a20, 0x29cea: 0x6c22ee20, - 0x29ced: 0x6cec5c20, 0x29cee: 0x6c240620, 0x29cef: 0x6c771a20, - 0x29cf1: 0x6c0bd820, - 0x29cf8: 0x6cf17620, 0x29cfb: 0x6cb95620, - 0x29cff: 0x6c424220, - // Block 0xa74, offset 0x29d00 - 0x29d02: 0x6c5ca220, - 0x29d04: 0x6c420620, 0x29d06: 0x6c630020, 0x29d07: 0x6c424620, - 0x29d09: 0x6c580820, - 0x29d0d: 0x6cd8dc20, - 0x29d10: 0x6c3d9a20, - 0x29d15: 0x6cb01620, 0x29d17: 0x6c10d620, - 0x29d1c: 0x6c07c620, - 0x29d22: 0x6cd2dc20, - 0x29d25: 0x6c58b020, 0x29d27: 0x6c4a9420, - 0x29d2a: 0x6cab9620, - 0x29d33: 0x6cad7020, - 0x29d35: 0x6d1d2020, 0x29d36: 0x6ce6e620, 0x29d37: 0x6d001820, - 0x29d39: 0x6d3b3620, 0x29d3b: 0x6d21d220, - // Block 0xa75, offset 0x29d40 - 0x29d41: 0x6c66fa20, - 0x29d44: 0x6cc25420, 0x29d45: 0x6ced6220, 0x29d46: 0x6c7d9220, 0x29d47: 0x6d3c7220, - 0x29d49: 0x6d245c20, 0x29d4a: 0x6c4cda20, 0x29d4b: 0x6cb2de20, - 0x29d4c: 0x6d41a420, 0x29d4d: 0x6d40fa20, 0x29d4f: 0x6d39e820, - 0x29d50: 0x6caa9c20, 0x29d51: 0x6d39ea20, - 0x29d56: 0x6cb17620, 0x29d57: 0x6c9cac20, - 0x29d5c: 0x6c0ad220, 0x29d5d: 0x6cdb6e20, - 0x29d61: 0x6cb47a20, 0x29d62: 0x6c9cc420, - 0x29d6b: 0x6d13a620, - 0x29d6c: 0x6d22b420, 0x29d6e: 0x6d249620, - 0x29d70: 0x6d3a9420, 0x29d73: 0x6c8dc220, - 0x29d7a: 0x6caa3620, - 0x29d7e: 0x6c8d3020, - // Block 0xa76, offset 0x29d80 - 0x29d80: 0x6c8a7020, 0x29d82: 0x6ceace20, - 0x29d84: 0x6c08f020, 0x29d85: 0x6ca36a20, 0x29d86: 0x6cc1bc20, - 0x29d88: 0x6cb01820, 0x29d89: 0x6c30f420, 0x29d8a: 0x6ca86e20, 0x29d8b: 0x6cea6820, - 0x29d8d: 0x6c5f2620, 0x29d8f: 0x6c8d5420, - 0x29d93: 0x6c7aaa20, - 0x29d94: 0x6cdb2c20, - 0x29d98: 0x6ce81a20, - 0x29d9e: 0x6ca38620, 0x29d9f: 0x6d2b0c20, - 0x29da2: 0x6ce7c420, 0x29da3: 0x6c444a20, - 0x29da4: 0x6c331820, 0x29da7: 0x6c6b5020, - 0x29da9: 0x6ce4c820, 0x29daa: 0x6ce5e220, 0x29dab: 0x6c1b6020, - 0x29dac: 0x6cc14e20, 0x29dae: 0x6ccc2820, - 0x29db0: 0x6c0f9e20, 0x29db1: 0x6c848420, 0x29db3: 0x6c963a20, - 0x29db5: 0x6c8a4420, 0x29db6: 0x6cd62620, 0x29db7: 0x6c2ad220, - 0x29db9: 0x6c1ae620, 0x29dba: 0x6c9f0220, - 0x29dbc: 0x6ce24e20, 0x29dbd: 0x6c5d0c20, 0x29dbf: 0x6ca7e220, - // Block 0xa77, offset 0x29dc0 - 0x29dc1: 0x6c75fe20, 0x29dc2: 0x6c56dc20, - 0x29dc4: 0x6c932e20, 0x29dc5: 0x6d138820, 0x29dc7: 0x6ca18620, - 0x29dc8: 0x6c17c820, - 0x29dcc: 0x6cddd420, 0x29dce: 0x6c784220, 0x29dcf: 0x6c409620, - 0x29dd1: 0x6c17aa20, - 0x29dd4: 0x6cddbc20, 0x29dd7: 0x6cbfe220, - 0x29ddb: 0x6cdb6a20, - 0x29ddd: 0x6d287620, 0x29ddf: 0x6cddc220, - 0x29de0: 0x6c7a7020, 0x29de1: 0x6c0fc420, 0x29de3: 0x6c90fe20, - 0x29de4: 0x6ca1a220, 0x29de6: 0x6c88e220, 0x29de7: 0x6d08d220, - 0x29de8: 0x6cddc420, 0x29de9: 0x6c97aa20, 0x29dea: 0x6c0ad420, - 0x29df2: 0x6ce44820, - 0x29df4: 0x6c88a620, 0x29df5: 0x6ce04a20, 0x29df6: 0x6ccdf220, - 0x29df8: 0x6cc22820, 0x29df9: 0x6c320820, 0x29dfa: 0x6c58d420, 0x29dfb: 0x6ccb0e20, - 0x29dff: 0x6c7c2620, - // Block 0xa78, offset 0x29e00 - 0x29e03: 0x6ca8dc20, - 0x29e05: 0x6ca8de20, 0x29e06: 0x6c95a420, 0x29e07: 0x6d425c20, - 0x29e08: 0x6d174e20, 0x29e09: 0x6cfcc020, 0x29e0a: 0x6c179820, 0x29e0b: 0x6ce61220, - 0x29e12: 0x6cd79620, - 0x29e14: 0x6c9d0020, 0x29e17: 0x6c9c7220, - 0x29e1b: 0x6ced5220, - 0x29e1d: 0x6c07c820, 0x29e1e: 0x6cbae020, - 0x29e20: 0x6ca0b020, 0x29e23: 0x6c8eca20, - 0x29e24: 0x6cf32e20, 0x29e26: 0x6c9a7020, - 0x29e28: 0x6ce7fe20, 0x29e2b: 0x6ca25a20, - 0x29e2d: 0x6c9a4420, - 0x29e32: 0x6d42b620, - 0x29e34: 0x6cea6420, 0x29e35: 0x6c778c20, 0x29e36: 0x6cea6a20, - 0x29e3a: 0x6c184c20, 0x29e3b: 0x6d336a20, - 0x29e3d: 0x6c1cec20, 0x29e3e: 0x6ce47820, - // Block 0xa79, offset 0x29e40 - 0x29e40: 0x6d372020, 0x29e41: 0x6c153420, 0x29e42: 0x6c153e20, - 0x29e45: 0x6cbe5c20, 0x29e46: 0x6cea3420, 0x29e47: 0x6c5b7a20, - 0x29e48: 0x6cc41420, 0x29e49: 0x6d2dba20, 0x29e4a: 0x6c652c20, 0x29e4b: 0x6c154c20, - 0x29e4d: 0x6c5a2620, 0x29e4f: 0x6c5b0620, - 0x29e50: 0x6c1b6a20, 0x29e52: 0x6c5a2820, 0x29e53: 0x6c528220, - 0x29e54: 0x6d280820, 0x29e56: 0x6ce94020, 0x29e57: 0x6c0b1c20, - 0x29e59: 0x6c5a3620, 0x29e5a: 0x6d280a20, - 0x29e5f: 0x6ca1a420, - 0x29e60: 0x6c45c420, 0x29e62: 0x6c45c620, - 0x29e64: 0x6c4bb020, 0x29e66: 0x6c157820, - 0x29e68: 0x6cc42220, 0x29e69: 0x6cc8ee20, 0x29e6a: 0x6c7c2820, 0x29e6b: 0x6cb1c220, - 0x29e6e: 0x6cc80220, - 0x29e72: 0x6ca9a220, 0x29e73: 0x6c56c820, - 0x29e74: 0x6c6cb820, 0x29e75: 0x6ca6d220, 0x29e76: 0x6c067420, - 0x29e78: 0x6ca65620, 0x29e7a: 0x6c0a8420, 0x29e7b: 0x6c55d820, - 0x29e7c: 0x6c846a20, 0x29e7f: 0x6d39dc20, - // Block 0xa7a, offset 0x29e80 - 0x29e80: 0x6ca2fc20, 0x29e82: 0x6cc36620, 0x29e83: 0x6c3cd220, - 0x29e84: 0x6c090020, 0x29e85: 0x6c84a020, 0x29e86: 0x6c0d0820, 0x29e87: 0x6ca70e20, - 0x29e88: 0x6c304820, 0x29e8b: 0x6c88a020, - 0x29e8c: 0x6ca6e420, 0x29e8d: 0x6c88a820, 0x29e8e: 0x6c968820, 0x29e8f: 0x6d30ca20, - 0x29e93: 0x6c639420, - 0x29e94: 0x6d15a820, 0x29e96: 0x6c904c20, - 0x29e98: 0x6d181820, - 0x29e9d: 0x6c278e20, 0x29e9e: 0x6c327820, - 0x29ea3: 0x6d160c20, - 0x29ea5: 0x6cdf8220, 0x29ea6: 0x6c4f5420, 0x29ea7: 0x6cd61620, - 0x29eac: 0x6cece820, 0x29eae: 0x6cdb2e20, 0x29eaf: 0x6d11d820, - 0x29eb0: 0x6c37e020, 0x29eb2: 0x6d326e20, - 0x29eba: 0x6c313e20, 0x29ebb: 0x6c651220, - 0x29ebf: 0x6cace620, - // Block 0xa7b, offset 0x29ec0 - 0x29ec0: 0x6c5afe20, 0x29ec2: 0x6c145420, 0x29ec3: 0x6ccd1c20, - 0x29ec4: 0x6c916620, 0x29ec6: 0x6d244c20, - 0x29ec8: 0x6d0ef420, 0x29ec9: 0x6ced6420, 0x29eca: 0x6cbc6e20, 0x29ecb: 0x6c953420, - 0x29ecc: 0x6d245e20, 0x29ecf: 0x6ce90620, - 0x29ed0: 0x6cf10820, 0x29ed2: 0x6cea8e20, - 0x29ed5: 0x6c5d1820, 0x29ed6: 0x6c079020, 0x29ed7: 0x6cbd0620, - 0x29ed9: 0x6c6c7420, 0x29eda: 0x6c7f3620, - 0x29edc: 0x6d356620, 0x29edd: 0x6d21ec20, 0x29edf: 0x6c22f020, - 0x29ee6: 0x6d139420, 0x29ee7: 0x6c2f0c20, - 0x29ee8: 0x6c145820, 0x29ee9: 0x6c2d9a20, 0x29eea: 0x6c97a220, - 0x29eec: 0x6c2afc20, 0x29eed: 0x6ceed020, 0x29eee: 0x6ca75020, 0x29eef: 0x6c835e20, - 0x29ef0: 0x6c0db820, 0x29ef1: 0x6cf39420, 0x29ef3: 0x6d320820, - 0x29ef6: 0x6cc77420, 0x29ef7: 0x6cec7c20, - 0x29ef8: 0x6c9dac20, 0x29ef9: 0x6c6c1020, 0x29efb: 0x6c544620, - 0x29efd: 0x6d2d5620, 0x29efe: 0x6cc80a20, 0x29eff: 0x6d3ec620, - // Block 0xa7c, offset 0x29f00 - 0x29f00: 0x6cac9420, 0x29f02: 0x6ca1a620, - 0x29f04: 0x6c9db220, 0x29f06: 0x6cb55820, 0x29f07: 0x6ca1a820, - 0x29f0a: 0x6d342c20, 0x29f0b: 0x6c04b020, - 0x29f0d: 0x6c9f1820, 0x29f0f: 0x6c933e20, - 0x29f11: 0x6cb55e20, 0x29f12: 0x6c1d0420, - 0x29f14: 0x6c84d220, 0x29f15: 0x6d196e20, - 0x29f18: 0x6c2b0620, 0x29f19: 0x6c25d220, 0x29f1b: 0x6c339020, - 0x29f1c: 0x6c96e820, 0x29f1d: 0x6d0e2c20, 0x29f1f: 0x6d2bba20, - 0x29f20: 0x6d0e2e20, 0x29f21: 0x6c339220, 0x29f22: 0x6cb42620, - 0x29f25: 0x6d273020, - 0x29f29: 0x6c5e5c20, 0x29f2a: 0x6c975420, 0x29f2b: 0x6c664620, - 0x29f2c: 0x6ca9e820, 0x29f2d: 0x6cbdc020, 0x29f2f: 0x6cbdc220, - 0x29f32: 0x6d13aa20, - 0x29f34: 0x6cdf5420, - 0x29f39: 0x6c655c20, - 0x29f3c: 0x6c141620, 0x29f3e: 0x6c28f220, 0x29f3f: 0x6ce2e220, - // Block 0xa7d, offset 0x29f40 - 0x29f40: 0x6c87ce20, 0x29f43: 0x6ca77c20, - 0x29f44: 0x6c158420, 0x29f45: 0x6d29f620, - 0x29f4a: 0x6d24b820, - 0x29f4c: 0x6d41e220, 0x29f4d: 0x6c0b2020, - 0x29f50: 0x6c1ef820, - 0x29f58: 0x6cc48c20, 0x29f5a: 0x6cc49820, 0x29f5b: 0x6d0f7020, - 0x29f5c: 0x6c0fe820, - 0x29f61: 0x6c247820, - 0x29f6c: 0x6c9cae20, 0x29f6e: 0x6c787420, - 0x29f70: 0x6c248420, - 0x29f77: 0x6cf7ce20, - 0x29f79: 0x6c968a20, 0x29f7b: 0x6cd22020, - 0x29f7c: 0x6c2d0420, 0x29f7f: 0x6cd22220, - // Block 0xa7e, offset 0x29f80 - 0x29f82: 0x6c2f7620, 0x29f83: 0x6c6ee420, - 0x29f85: 0x6d25a820, 0x29f86: 0x6c41b220, - 0x29f8a: 0x6c5ca420, 0x29f8b: 0x6c5f4e20, - 0x29f8d: 0x6caed420, 0x29f8f: 0x6c2ab220, - 0x29f91: 0x6c085e20, - 0x29f94: 0x6cacea20, 0x29f95: 0x6cded420, 0x29f97: 0x6d252220, - 0x29f98: 0x6c42ee20, 0x29f99: 0x6d252420, - 0x29f9f: 0x6c639220, - 0x29fa3: 0x6c799020, - 0x29fa6: 0x6c309820, - 0x29fa9: 0x6cfbd820, 0x29faa: 0x6cb80620, - 0x29fac: 0x6cca7c20, - 0x29fb0: 0x6d1b9820, 0x29fb3: 0x6c901a20, - 0x29fb6: 0x6ce29a20, 0x29fb7: 0x6c902420, - 0x29fba: 0x6cc60820, - 0x29fbd: 0x6d1b9020, 0x29fbe: 0x6cb2d820, 0x29fbf: 0x6cb41c20, - // Block 0xa7f, offset 0x29fc0 - 0x29fc0: 0x6d25be20, 0x29fc1: 0x6cc72a20, 0x29fc3: 0x6c399e20, - 0x29fc7: 0x6c4f5820, - 0x29fc8: 0x6c9c8820, 0x29fc9: 0x6c55ea20, 0x29fca: 0x6d3eb620, - 0x29fcc: 0x6c8d7e20, 0x29fcd: 0x6c6eea20, 0x29fce: 0x6cc72e20, - 0x29fd2: 0x6cb2e020, 0x29fd3: 0x6c49fc20, - 0x29fd4: 0x6c37ae20, - 0x29fdd: 0x6c247e20, 0x29fde: 0x6c760020, - 0x29fe6: 0x6d052a20, - 0x29fe8: 0x6c377a20, 0x29fe9: 0x6ce44420, 0x29feb: 0x6d0ff820, - 0x29fed: 0x6c010a20, 0x29fee: 0x6c560820, 0x29fef: 0x6cf7ca20, - 0x29ff1: 0x6c560a20, 0x29ff3: 0x6cd85220, - 0x29ff4: 0x6c854e20, 0x29ff6: 0x6d197020, 0x29ff7: 0x6c47f620, - 0x29ff9: 0x6ce16a20, - // Block 0xa80, offset 0x2a000 - 0x2a000: 0x6cc42420, 0x2a001: 0x6d3fe620, 0x2a002: 0x6c84de20, - 0x2a004: 0x6c69ec20, 0x2a007: 0x6c38fe20, - 0x2a008: 0x6cb47e20, 0x2a009: 0x6cd86620, 0x2a00b: 0x6c6b9020, - 0x2a00c: 0x6c91b220, 0x2a00d: 0x6c87d020, 0x2a00e: 0x6c158620, - 0x2a010: 0x6d122220, - 0x2a015: 0x6c5b0020, - 0x2a019: 0x6c53e420, 0x2a01a: 0x6c2cea20, 0x2a01b: 0x6cc0be20, - 0x2a01c: 0x6c74f820, 0x2a01e: 0x6cb0d420, - 0x2a022: 0x6c7c5220, - 0x2a025: 0x6cf82820, 0x2a026: 0x6ce30c20, - 0x2a029: 0x6d076820, - 0x2a02f: 0x6c0b6220, - 0x2a032: 0x6c50b020, 0x2a033: 0x6c88ac20, - 0x2a036: 0x6cdb7620, 0x2a037: 0x6c8ab220, - 0x2a03c: 0x6c6c7820, - // Block 0xa81, offset 0x2a040 - 0x2a041: 0x6c87d220, 0x2a042: 0x6c158820, - 0x2a045: 0x6cb65a20, 0x2a046: 0x6cb66c20, - 0x2a049: 0x6d3ec020, 0x2a04b: 0x6d3ec420, - 0x2a04d: 0x6cb6b220, 0x2a04f: 0x6cb6b820, - 0x2a050: 0x6d3ed020, 0x2a052: 0x6d2d1020, 0x2a053: 0x6d2d1420, - 0x2a054: 0x6cabec20, 0x2a056: 0x6c70d820, - 0x2a059: 0x6d0df420, - 0x2a05c: 0x6c4f8c20, 0x2a05d: 0x6ca37020, - 0x2a064: 0x6d0e0220, 0x2a066: 0x6d2e9c20, 0x2a067: 0x6cd2e020, - 0x2a068: 0x6d34ba20, - 0x2a06d: 0x6d2c0a20, - 0x2a074: 0x6cc73420, 0x2a075: 0x6d2c0c20, 0x2a077: 0x6d195820, - 0x2a078: 0x6ca02820, 0x2a079: 0x6d0b4020, 0x2a07b: 0x6d376620, - 0x2a07d: 0x6c7e3020, 0x2a07e: 0x6cfa1c20, - // Block 0xa82, offset 0x2a080 - 0x2a080: 0x6cb13820, 0x2a081: 0x6cdeec20, 0x2a083: 0x6d162a20, - 0x2a086: 0x6d051620, 0x2a087: 0x6d2d0c20, - 0x2a089: 0x6c34c420, 0x2a08a: 0x6c36e420, - 0x2a08e: 0x6d1ab420, - 0x2a090: 0x6c36ee20, 0x2a091: 0x6cdb8e20, 0x2a092: 0x6c016420, 0x2a093: 0x6c260420, - 0x2a095: 0x6ceb6420, 0x2a097: 0x6ceb6620, - 0x2a098: 0x6cfa1e20, 0x2a09b: 0x6c21ea20, - 0x2a09d: 0x6cdb9020, - 0x2a0a5: 0x6c62f420, 0x2a0a6: 0x6cba3620, 0x2a0a7: 0x6d410420, - 0x2a0a8: 0x6d2d0e20, 0x2a0a9: 0x6d280e20, 0x2a0aa: 0x6d2ea620, - 0x2a0ac: 0x6d159c20, - 0x2a0b2: 0x6d0b4220, 0x2a0b3: 0x6d266020, - 0x2a0b9: 0x6c51ac20, 0x2a0ba: 0x6cb88820, - 0x2a0be: 0x6c13c220, - // Block 0xa83, offset 0x2a0c0 - 0x2a0c3: 0x6cab7020, - 0x2a0c8: 0x6c560c20, 0x2a0ca: 0x6d0f2020, - 0x2a0cc: 0x6cbd0e20, 0x2a0cd: 0x6c0fd820, 0x2a0ce: 0x6cbafe20, 0x2a0cf: 0x6c6c1420, - 0x2a0db: 0x6ca6e820, - 0x2a0de: 0x6c162420, 0x2a0df: 0x6cbdf620, - 0x2a0e1: 0x6d2a3220, - 0x2a0e4: 0x6d1b3220, 0x2a0e5: 0x6d029c20, 0x2a0e7: 0x6cb6ba20, - 0x2a0e8: 0x6c673420, 0x2a0eb: 0x6d061420, - 0x2a0ed: 0x6d2bbc20, 0x2a0ef: 0x6c370420, - 0x2a0f3: 0x6d40a020, - 0x2a0f4: 0x6d163220, - 0x2a0f9: 0x6d34c820, 0x2a0fa: 0x6c87d420, - 0x2a0fd: 0x6c87d620, 0x2a0fe: 0x6d1aba20, - // Block 0xa84, offset 0x2a100 - 0x2a101: 0x6c88b220, 0x2a103: 0x6c158a20, - 0x2a105: 0x6c754820, 0x2a107: 0x6d28e620, - 0x2a10e: 0x6d2d1620, 0x2a10f: 0x6cb12220, - 0x2a111: 0x6c8fd220, 0x2a113: 0x6c8fd420, - 0x2a118: 0x6c8fe220, - 0x2a11d: 0x6c900020, - 0x2a120: 0x6c900c20, 0x2a122: 0x6c98b220, - 0x2a125: 0x6d30d020, - 0x2a12c: 0x6c423a20, 0x2a12d: 0x6c466a20, 0x2a12e: 0x6cc49a20, 0x2a12f: 0x6c248020, - 0x2a130: 0x6c68aa20, - 0x2a137: 0x6c0fec20, - 0x2a139: 0x6d3b4c20, 0x2a13a: 0x6cbfe820, 0x2a13b: 0x6d0f7220, - // Block 0xa85, offset 0x2a140 - 0x2a140: 0x6d003020, 0x2a142: 0x6c5b4820, 0x2a143: 0x6cc16c20, - 0x2a148: 0x6c8e0220, 0x2a14a: 0x6d1ab220, - 0x2a14e: 0x6cb0e820, - 0x2a152: 0x6c88b020, - // Block 0xa86, offset 0x2a180 - 0x2a19d: 0x6c343c20, - // Block 0xa87, offset 0x2a1c0 - 0x2a1c8: 0x6c040c20, - 0x2a1cf: 0x6d2d9220, - // Block 0xa88, offset 0x2a200 - 0x2a22e: 0x6c943c20, - // Block 0xa89, offset 0x2a240 - 0x2a24a: 0x6cd94a20, - 0x2a257: 0x6c73ac20, - // Block 0xa8a, offset 0x2a280 - 0x2a29d: 0x6d1d8e20, - // Block 0xa8b, offset 0x2a2c0 - 0x2a2f9: 0x6caa5c20, - // Block 0xa8c, offset 0x2a300 - 0x2a310: 0x6c230620, - // Block 0xa8d, offset 0x2a340 - 0x2a362: 0x6cfc9220, - // Block 0xa8e, offset 0x2a380 - 0x2a3a1: 0x6c85dc20, - // Block 0xa8f, offset 0x2a3c0 - 0x2a3c8: 0x6c3abc20, - 0x2a3d9: 0x6cdb3a20, - // Block 0xa90, offset 0x2a400 - 0x2a41c: 0x6c79dc20, - // Block 0xa91, offset 0x2a440 - 0x2a468: 0x6c1a9e20, - 0x2a478: 0x6d09b220, - // Block 0xa92, offset 0x2a480 - 0x2a4b0: 0x6cb86a20, - // Block 0xa93, offset 0x2a4c0 - 0x2a4d0: 0x6c45fe20, - // Block 0xa94, offset 0x2a500 - 0x2a500: 0x6c5ef220, - 0x2a528: 0x6c953a20, - // Block 0xa95, offset 0x2a540 - 0x2a559: 0x6d165020, - 0x2a55f: 0x6d146820, - 0x2a562: 0x6ca49820, - 0x2a570: 0x6cf7de20, 0x2a572: 0x6cffaa20, - // Block 0xa96, offset 0x2a580 - 0x2a58b: 0x6c73b020, - // Block 0xa97, offset 0x2a5c0 - 0x2a5c4: 0x6d268220, 0x2a5c6: 0x6c7b1020, - 0x2a5c9: 0x6c8cc220, - 0x2a5d0: 0x6ca5f020, 0x2a5d3: 0x6c108a20, - // Block 0xa98, offset 0x2a600 - 0x2a636: 0x6c4e3a20, - // Block 0xa99, offset 0x2a640 - 0x2a667: 0x6c3d5820, - 0x2a669: 0x6c230a20, - // Block 0xa9a, offset 0x2a680 - 0x2a68e: 0x6c74d220, - // Block 0xa9b, offset 0x2a6c0 - 0x2a6e0: 0x6d2eb220, - 0x2a6e6: 0x6c109020, 0x2a6e7: 0x6cda9a20, - 0x2a6ee: 0x6c59cc20, - 0x2a6f4: 0x6d2da220, - // Block 0xa9c, offset 0x2a700 - 0x2a71d: 0x6c73ea20, - 0x2a723: 0x6c4ea420, - 0x2a724: 0x6c003a20, - 0x2a728: 0x6ce33820, - // Block 0xa9d, offset 0x2a740 - 0x2a748: 0x6d06ca20, 0x2a749: 0x6c534620, - 0x2a752: 0x6c3e4620, - 0x2a754: 0x6c5b4020, 0x2a755: 0x6cd1e620, - 0x2a759: 0x6cb41220, - // Block 0xa9e, offset 0x2a780 - 0x2a79b: 0x6d33bc20, - 0x2a79e: 0x6c740c20, - 0x2a7a2: 0x6ca90020, - 0x2a7b6: 0x6c1c5220, - 0x2a7b8: 0x6ce36020, - // Block 0xa9f, offset 0x2a7c0 - 0x2a7c0: 0x6c857420, 0x2a7c1: 0x6cecb420, 0x2a7c2: 0x6d144620, 0x2a7c3: 0x48024420, - 0x2a7c4: 0x6ca62220, 0x2a7c5: 0x6cf43220, 0x2a7c6: 0x6ce9f420, 0x2a7c7: 0x6c0e1020, - 0x2a7c8: 0x6d28b220, 0x2a7c9: 0x6c071c20, 0x2a7ca: 0x6ccbb820, 0x2a7cb: 0x6cfe3c20, - 0x2a7cc: 0x6c75ee20, 0x2a7cd: 0x6cddc620, 0x2a7ce: 0x6c9dfe20, 0x2a7cf: 0x6ce92020, - 0x2a7d0: 0x6c5a2a20, 0x2a7d1: 0x6c720620, 0x2a7d2: 0x480a3820, 0x2a7d3: 0x44697220, - 0x2a7d4: 0x6ca57e20, 0x2a7d5: 0x6d292620, 0x2a7d6: 0x480a9620, 0x2a7d7: 0x6cc6ec20, - 0x2a7d8: 0x6d24d020, 0x2a7d9: 0x6c0da020, 0x2a7da: 0x6c2fd820, 0x2a7db: 0x6c7bdc20, - 0x2a7dc: 0x6cbee220, 0x2a7dd: 0x6cb9ec20, 0x2a7de: 0x6cc5a020, 0x2a7df: 0x6cafae20, - 0x2a7e0: 0x6c787a20, 0x2a7e1: 0x6c95a620, 0x2a7e2: 0x6c438c20, 0x2a7e3: 0x6c15bc20, - 0x2a7e4: 0x6c5fc020, 0x2a7e5: 0x6d1e1820, 0x2a7e6: 0x6c9e0c20, 0x2a7e7: 0x6cbd7c20, - 0x2a7e8: 0x6cce9420, 0x2a7e9: 0x6c059e20, 0x2a7ea: 0x6c22f420, 0x2a7eb: 0x6c06c620, - 0x2a7ec: 0x6c5b8420, 0x2a7ed: 0x6c068e20, 0x2a7ee: 0x6c0efe20, 0x2a7ef: 0x6c5fd220, - 0x2a7f0: 0x6c5fec20, 0x2a7f1: 0x6cbe3a20, 0x2a7f2: 0x6cbe3a20, 0x2a7f3: 0x6cbe3a20, - 0x2a7f4: 0x48145820, 0x2a7f5: 0x6c5a8620, 0x2a7f6: 0x6c5fb820, 0x2a7f7: 0x6cda0e20, - 0x2a7f8: 0x4816c620, 0x2a7f9: 0x6c697a20, 0x2a7fa: 0x6c1bd620, 0x2a7fb: 0x6d108620, - 0x2a7fc: 0x6cfc7820, 0x2a7fd: 0x6cf56a20, 0x2a7fe: 0x6c19b620, 0x2a7ff: 0x6d385a20, - // Block 0xaa0, offset 0x2a800 - 0x2a800: 0x6c35e420, 0x2a801: 0x6c9ec220, 0x2a802: 0x6ce0e820, 0x2a803: 0x6cb6ec20, - 0x2a804: 0x6cfb5820, 0x2a805: 0x6ccd8a20, 0x2a806: 0x6ccd8a20, 0x2a807: 0x6c5bbc20, - 0x2a808: 0x6c1aae20, 0x2a809: 0x6d2bd620, 0x2a80a: 0x6d110420, 0x2a80b: 0x6ce8d420, - 0x2a80c: 0x6ce0a020, 0x2a80d: 0x6ce8d620, 0x2a80e: 0x6c4fd020, 0x2a80f: 0x6cae3420, - 0x2a810: 0x6cbc9020, 0x2a811: 0x6d3c2c20, 0x2a812: 0x6c19c620, 0x2a813: 0x6d344c20, - 0x2a814: 0x6ce92220, 0x2a815: 0x6d03ca20, 0x2a816: 0x6c223620, 0x2a817: 0x6c064c20, - 0x2a818: 0x6c2c7c20, 0x2a819: 0x4829c820, 0x2a81a: 0x6c972420, 0x2a81b: 0x6c554020, - 0x2a81c: 0x6c3c9c20, 0x2a81d: 0x6c341620, 0x2a81e: 0x6c9c0420, 0x2a81f: 0x6cceea20, - 0x2a820: 0x6c1bda20, 0x2a821: 0x482dd420, 0x2a822: 0x6c5ea220, 0x2a823: 0x6d20ec20, - 0x2a824: 0x6ce9f820, 0x2a825: 0x6cb1e820, 0x2a826: 0x6c3fe420, 0x2a827: 0x6ccae220, - 0x2a828: 0x6c139820, 0x2a829: 0x6cc52820, 0x2a82a: 0x6c804820, 0x2a82b: 0x6c804820, - 0x2a82c: 0x48339020, 0x2a82d: 0x6d24da20, 0x2a82e: 0x6d365020, 0x2a82f: 0x6ca91020, - 0x2a830: 0x6c061c20, 0x2a831: 0x6c81ee20, 0x2a832: 0x6cd45020, 0x2a833: 0x6c674e20, - 0x2a834: 0x6c28f820, 0x2a835: 0x6d1edc20, 0x2a836: 0x6d11f020, 0x2a837: 0x6ce8a020, - 0x2a838: 0x6c17fa20, 0x2a839: 0x6d053020, 0x2a83a: 0x6cb8a420, 0x2a83b: 0x6cf3b020, - 0x2a83c: 0x6d0d7a20, 0x2a83d: 0x483bcc20, 0x2a83e: 0x6c2ccc20, 0x2a83f: 0x6d3e3620, - // Block 0xaa1, offset 0x2a840 - 0x2a840: 0x6c15c620, 0x2a841: 0x6d09d820, 0x2a842: 0x6c175e20, 0x2a843: 0x6d15b220, - 0x2a844: 0x6d0a8c20, 0x2a845: 0x6cd71420, 0x2a846: 0x6c997a20, 0x2a847: 0x6c3b8620, - 0x2a848: 0x6c980020, 0x2a849: 0x48430620, 0x2a84a: 0x6d16e820, 0x2a84b: 0x6c0e0e20, - 0x2a84c: 0x6c097620, 0x2a84d: 0x6cd5c220, 0x2a84e: 0x6c80b420, 0x2a84f: 0x6cd79620, - 0x2a850: 0x6c45cc20, 0x2a851: 0x48466220, 0x2a852: 0x48466220, 0x2a853: 0x6d20e820, - 0x2a854: 0x6ce1b020, 0x2a855: 0x6ce1b020, 0x2a856: 0x6d16b220, 0x2a857: 0x48657020, - 0x2a858: 0x48c3b420, 0x2a859: 0x6d03c020, 0x2a85a: 0x6c2dc420, 0x2a85b: 0x6ccd7820, - 0x2a85c: 0x6c300020, 0x2a85d: 0x6cc58620, 0x2a85e: 0x6d357420, 0x2a85f: 0x6c7bb620, - 0x2a860: 0x6d24d420, 0x2a861: 0x6c5a4620, 0x2a862: 0x6c73f820, 0x2a863: 0x6c5b4c20, - 0x2a864: 0x6c2ff820, 0x2a865: 0x6c339820, 0x2a866: 0x6c224e20, 0x2a867: 0x6c599420, - 0x2a868: 0x6cd0ac20, 0x2a869: 0x6c599420, 0x2a86a: 0x6c90a220, 0x2a86b: 0x6d2b8a20, - 0x2a86c: 0x6cfd0820, 0x2a86d: 0x6c3be420, 0x2a86e: 0x6c11da20, 0x2a86f: 0x6c9b4a20, - 0x2a870: 0x6c1a5420, 0x2a871: 0x6c804a20, 0x2a872: 0x6c19b220, 0x2a873: 0x6c63b620, - 0x2a874: 0x6c7a1820, 0x2a875: 0x6c063220, 0x2a876: 0x6c036820, 0x2a877: 0x6c72e420, - 0x2a878: 0x48561820, 0x2a879: 0x6cecf820, 0x2a87a: 0x6cb1ea20, 0x2a87b: 0x6ccf2c20, - 0x2a87c: 0x6ccae020, 0x2a87d: 0x6c600020, 0x2a87e: 0x4857e220, 0x2a87f: 0x6c6d1420, - // Block 0xaa2, offset 0x2a880 - 0x2a880: 0x6d0ca820, 0x2a881: 0x6d0d6620, 0x2a882: 0x6c30b620, 0x2a883: 0x6ca07220, - 0x2a884: 0x6c67f620, 0x2a885: 0x6c5ae420, 0x2a886: 0x6c691420, 0x2a887: 0x4474d820, - 0x2a888: 0x6c9fa820, 0x2a889: 0x6c6e8420, 0x2a88a: 0x48601420, 0x2a88b: 0x6c61ec20, - 0x2a88c: 0x6cd4b820, 0x2a88d: 0x6c6cea20, 0x2a88e: 0x6cf01620, 0x2a88f: 0x6cd55a20, - 0x2a890: 0x6cf15420, 0x2a891: 0x6c16e420, 0x2a892: 0x6c994e20, 0x2a893: 0x6c9e1820, - 0x2a894: 0x6d41b020, 0x2a895: 0x6c6d2820, 0x2a896: 0x6ca31420, 0x2a897: 0x6ce05420, - 0x2a898: 0x6c80f820, 0x2a899: 0x6cee5220, 0x2a89a: 0x6d3f9820, 0x2a89b: 0x6cb6d620, - 0x2a89c: 0x6c0bea20, 0x2a89d: 0x48678620, 0x2a89e: 0x6c572820, 0x2a89f: 0x6c48dc20, - 0x2a8a0: 0x6c5e8e20, 0x2a8a1: 0x6cca6a20, 0x2a8a2: 0x6c99ec20, 0x2a8a3: 0x4868da20, - 0x2a8a4: 0x6c022a20, 0x2a8a5: 0x6c078420, 0x2a8a6: 0x6d3e3a20, 0x2a8a7: 0x6c513820, - 0x2a8a8: 0x6d2be020, 0x2a8a9: 0x6d112020, 0x2a8aa: 0x6c415020, 0x2a8ab: 0x6ccefe20, - 0x2a8ac: 0x486d4620, 0x2a8ad: 0x6d370620, 0x2a8ae: 0x6d159820, 0x2a8af: 0x6c22aa20, - 0x2a8b0: 0x48714e20, 0x2a8b1: 0x6d05d420, 0x2a8b2: 0x6c7d9c20, 0x2a8b3: 0x6cdc4620, - 0x2a8b4: 0x6cf15820, 0x2a8b5: 0x6ccbda20, 0x2a8b6: 0x6cbc4020, 0x2a8b7: 0x48751a20, - 0x2a8b8: 0x483a1620, 0x2a8b9: 0x4875f420, 0x2a8ba: 0x6c391c20, 0x2a8bb: 0x48797820, - 0x2a8bc: 0x6d0c6820, 0x2a8bd: 0x6c077e20, 0x2a8be: 0x6cb8a820, 0x2a8bf: 0x6cf3b620, - // Block 0xaa3, offset 0x2a8c0 - 0x2a8c0: 0x6cac1e20, 0x2a8c1: 0x6c4d3a20, 0x2a8c2: 0x6c8e4a20, 0x2a8c3: 0x6c502e20, - 0x2a8c4: 0x6c6cee20, 0x2a8c5: 0x6ca80820, 0x2a8c6: 0x6c07ac20, 0x2a8c7: 0x6cb28620, - 0x2a8c8: 0x6c42a220, 0x2a8c9: 0x6d0c0820, 0x2a8ca: 0x6c903620, 0x2a8cb: 0x6d3e4020, - 0x2a8cc: 0x6c2cce20, 0x2a8cd: 0x6ccc0a20, 0x2a8ce: 0x6d0bf820, 0x2a8cf: 0x6c177620, - 0x2a8d0: 0x487ebc20, 0x2a8d1: 0x487f1c20, 0x2a8d2: 0x6c3b8c20, 0x2a8d3: 0x6d270a20, - 0x2a8d4: 0x6c6eb420, 0x2a8d5: 0x6d1cba20, 0x2a8d6: 0x6cd63020, 0x2a8d7: 0x6cb9e020, - 0x2a8d8: 0x6d28f220, 0x2a8d9: 0x6d3bbe20, 0x2a8da: 0x6ce08e20, 0x2a8db: 0x480a4a20, - 0x2a8dc: 0x6c32cc20, 0x2a8dd: 0x4884c620, 0x2a8de: 0x6c233e20, 0x2a8df: 0x48875620, - 0x2a8e0: 0x6c24c420, 0x2a8e1: 0x6c74c820, 0x2a8e2: 0x6d2c3a20, 0x2a8e3: 0x488c1020, - 0x2a8e4: 0x6cf61a20, 0x2a8e5: 0x6c074020, 0x2a8e6: 0x6d0e3c20, 0x2a8e7: 0x48902820, - 0x2a8e8: 0x6cde2020, 0x2a8e9: 0x6cedda20, 0x2a8ea: 0x6c45d620, 0x2a8eb: 0x6d268820, - 0x2a8ec: 0x6cb29020, 0x2a8ed: 0x6cb29020, 0x2a8ee: 0x6c277a20, 0x2a8ef: 0x6d215e20, - 0x2a8f0: 0x6d325020, 0x2a8f1: 0x6cdd8a20, 0x2a8f2: 0x6cbf7620, 0x2a8f3: 0x6d03d220, - 0x2a8f4: 0x6cc89c20, 0x2a8f5: 0x48986c20, 0x2a8f6: 0x6d28f620, 0x2a8f7: 0x48992420, - 0x2a8f8: 0x6d176620, 0x2a8f9: 0x6cb2b420, 0x2a8fa: 0x6d226e20, 0x2a8fb: 0x489f4220, - 0x2a8fc: 0x489f7020, 0x2a8fd: 0x48a08820, 0x2a8fe: 0x6d0c7620, 0x2a8ff: 0x6c627820, - // Block 0xaa4, offset 0x2a900 - 0x2a900: 0x6d344020, 0x2a901: 0x48a1e620, 0x2a902: 0x48a1e420, 0x2a903: 0x48a23220, - 0x2a904: 0x48a26620, 0x2a905: 0x6d313c20, 0x2a906: 0x6d313e20, 0x2a907: 0x6d313e20, - 0x2a908: 0x6c736420, 0x2a909: 0x6c6ad220, 0x2a90a: 0x6c188220, 0x2a90b: 0x6d130220, - 0x2a90c: 0x6cd23420, 0x2a90d: 0x48a83a20, 0x2a90e: 0x6d03e220, 0x2a90f: 0x6c926e20, - 0x2a910: 0x6ce4ba20, 0x2a911: 0x6c5b7020, 0x2a912: 0x6c6fd820, 0x2a913: 0x6d411420, - 0x2a914: 0x6c1baa20, 0x2a915: 0x6c8f3a20, 0x2a916: 0x6c3e9c20, 0x2a917: 0x6cd52420, - 0x2a918: 0x6c657420, 0x2a919: 0x6c47c420, 0x2a91a: 0x6c624a20, 0x2a91b: 0x6cf1f020, - 0x2a91c: 0x48b2f820, 0x2a91d: 0x6ce4c020, 0x2a91e: 0x6ce4c020, 0x2a91f: 0x6cb26020, - 0x2a920: 0x6cb2be20, 0x2a921: 0x48b75620, 0x2a922: 0x6d3bde20, 0x2a923: 0x6d3a2820, - 0x2a924: 0x6cf00020, 0x2a925: 0x6c178020, 0x2a926: 0x6c076020, 0x2a927: 0x6cf8f420, - 0x2a928: 0x6c680820, 0x2a929: 0x6cca3020, 0x2a92a: 0x6c61b020, 0x2a92b: 0x48bf0c20, - 0x2a92c: 0x6c07ee20, 0x2a92d: 0x6d10b020, 0x2a92e: 0x6d3e6a20, 0x2a92f: 0x6d400620, - 0x2a930: 0x6ccac220, 0x2a931: 0x6c965020, 0x2a932: 0x6d03dc20, 0x2a933: 0x48c48e20, - 0x2a934: 0x6c9a0420, 0x2a935: 0x48c5b220, 0x2a936: 0x6c177e20, 0x2a937: 0x48c67c20, - 0x2a938: 0x6d104a20, 0x2a939: 0x6c027e20, 0x2a93a: 0x6d30d220, 0x2a93b: 0x48c9b420, - 0x2a93c: 0x48ca4620, 0x2a93d: 0x6cb25820, 0x2a93e: 0x48cb5020, 0x2a93f: 0x6c236620, - // Block 0xaa5, offset 0x2a940 - 0x2a940: 0x6c78f420, 0x2a941: 0x6cc5d220, 0x2a942: 0x6d22da20, 0x2a943: 0x6c252c20, - 0x2a944: 0x6c231a20, 0x2a945: 0x6caff420, 0x2a946: 0x6d1d4020, 0x2a947: 0x48cf4e20, - 0x2a948: 0x48cf6a20, 0x2a949: 0x6d085420, 0x2a94a: 0x48673820, 0x2a94b: 0x6d20e820, - 0x2a94c: 0x6cf89220, 0x2a94d: 0x6c225220, 0x2a94e: 0x6c07f020, 0x2a94f: 0x6cb6ce20, - 0x2a950: 0x6d22c820, 0x2a951: 0x6d338420, 0x2a952: 0x6c813e20, 0x2a953: 0x6c570620, - 0x2a954: 0x6c398620, 0x2a955: 0x6d0b1420, 0x2a956: 0x6c7a7620, 0x2a957: 0x48d67820, - 0x2a958: 0x6cc91420, 0x2a959: 0x6c148e20, 0x2a95a: 0x6cc65e20, 0x2a95b: 0x6c6aa820, - 0x2a95c: 0x6cf3bc20, 0x2a95d: 0x6c988a20, 0x2a95e: 0x6c2bf220, 0x2a95f: 0x6d311420, - 0x2a960: 0x6cb28e20, 0x2a961: 0x6c711c20, 0x2a962: 0x6c757020, 0x2a963: 0x6c114420, - 0x2a964: 0x48d86c20, 0x2a965: 0x6cdd8420, 0x2a966: 0x48d9aa20, 0x2a967: 0x448a5620, - 0x2a968: 0x6cb2ae20, 0x2a969: 0x6c6ca620, 0x2a96a: 0x6c25ea20, 0x2a96b: 0x48e79420, - 0x2a96c: 0x6cc8a220, 0x2a96d: 0x48de5820, 0x2a96e: 0x6c19a420, 0x2a96f: 0x6c936e20, - 0x2a970: 0x6c175420, 0x2a971: 0x6c93c420, 0x2a972: 0x6c7cba20, 0x2a973: 0x6caaa220, - 0x2a974: 0x6c91c420, 0x2a975: 0x6c7c4820, 0x2a976: 0x6cf90620, 0x2a977: 0x6c1aa420, - 0x2a978: 0x6cb8ca20, 0x2a979: 0x6d24fc20, 0x2a97a: 0x6cb2b020, 0x2a97b: 0x6d276220, - 0x2a97c: 0x6c2ed620, 0x2a97d: 0x6d39be20, 0x2a97e: 0x6c22de20, 0x2a97f: 0x6c5f4420, - // Block 0xaa6, offset 0x2a980 - 0x2a980: 0x6c4b2220, 0x2a981: 0x6cfe0220, 0x2a982: 0x6c22ec20, 0x2a983: 0x6d3cd820, - 0x2a984: 0x6d13be20, 0x2a985: 0x6c668020, 0x2a986: 0x6c8e6020, 0x2a987: 0x6cd72420, - 0x2a988: 0x6c929c20, 0x2a989: 0x6d0daa20, 0x2a98a: 0x6c996a20, 0x2a98b: 0x48f15c20, - 0x2a98c: 0x48f2cc20, 0x2a98d: 0x6ca8e820, 0x2a98e: 0x6d25ea20, 0x2a98f: 0x6c1a2220, - 0x2a990: 0x6d23f620, 0x2a991: 0x6c0bdc20, 0x2a992: 0x6cd2b020, 0x2a993: 0x6c649220, - 0x2a994: 0x6c498620, 0x2a995: 0x6c09b020, 0x2a996: 0x6c424420, 0x2a997: 0x6cb6ea20, - 0x2a998: 0x6cd61020, 0x2a999: 0x6d2fdc20, 0x2a99a: 0x6c038220, 0x2a99b: 0x6c658c20, - 0x2a99c: 0x6cb11c20, 0x2a99d: 0x4811bc20, 0x2a99e: 0x6cc5e420, 0x2a99f: 0x6cd50820, - 0x2a9a0: 0x490ba420, 0x2a9a1: 0x490bda20, 0x2a9a2: 0x6cb6c420, 0x2a9a3: 0x6cb27e20, - 0x2a9a4: 0x6d3e4a20, 0x2a9a5: 0x490e5c20, 0x2a9a6: 0x6c176420, 0x2a9a7: 0x6c0f1c20, - 0x2a9a8: 0x6d07ca20, 0x2a9a9: 0x6c575620, 0x2a9aa: 0x6c0dee20, 0x2a9ab: 0x6cbb5020, - 0x2a9ac: 0x6d295820, 0x2a9ad: 0x4917f420, 0x2a9ae: 0x6c763420, 0x2a9af: 0x6cae7c20, - 0x2a9b0: 0x6ccca420, 0x2a9b1: 0x491aee20, 0x2a9b2: 0x6cef3620, 0x2a9b3: 0x6cb8e820, - 0x2a9b4: 0x6cf69820, 0x2a9b5: 0x6d280620, 0x2a9b6: 0x6cace820, 0x2a9b7: 0x6cb26420, - 0x2a9b8: 0x6c930020, 0x2a9b9: 0x6c160820, 0x2a9ba: 0x6c0ab220, 0x2a9bb: 0x49281420, - 0x2a9bc: 0x6c7d6c20, 0x2a9bd: 0x6d0eb020, 0x2a9be: 0x6c35b420, 0x2a9bf: 0x6c35b420, - // Block 0xaa7, offset 0x2a9c0 - 0x2a9c0: 0x6cb26620, 0x2a9c1: 0x6d097020, 0x2a9c2: 0x6c5eb020, 0x2a9c3: 0x6c04d420, - 0x2a9c4: 0x6c36b220, 0x2a9c5: 0x6d276c20, 0x2a9c6: 0x6c060a20, 0x2a9c7: 0x6cea1420, - 0x2a9c8: 0x6c423020, 0x2a9c9: 0x6cbf6820, 0x2a9ca: 0x6d320420, 0x2a9cb: 0x6c62d820, - 0x2a9cc: 0x6c64ec20, 0x2a9cd: 0x6c702e20, 0x2a9ce: 0x6c60f620, 0x2a9cf: 0x6cb02c20, - 0x2a9d0: 0x6d21ea20, 0x2a9d1: 0x6c968620, 0x2a9d2: 0x6ccc2e20, 0x2a9d3: 0x49441c20, - 0x2a9d4: 0x49452220, 0x2a9d5: 0x6c966820, 0x2a9d6: 0x6cba8620, 0x2a9d7: 0x6d353420, - 0x2a9d8: 0x6c9e0a20, 0x2a9d9: 0x6d342a20, 0x2a9da: 0x6c9d7420, 0x2a9db: 0x6c3ba420, - 0x2a9dc: 0x6c08a220, 0x2a9dd: 0x6cb13820, - // Block 0xaa8, offset 0x2aa00 - 0x2aa00: 0x6c00c220, 0x2aa01: 0xe0002416, 0x2aa02: 0x029cb684, 0x2aa03: 0x029cb484, - 0x2aa04: 0x6c000e20, 0x2aa05: 0x029d7684, 0x2aa06: 0x6c008a20, 0x2aa07: 0x6c009220, - 0x2aa08: 0x6c009e20, 0x2aa09: 0x02a40484, 0x2aa0a: 0x6c00b820, 0x2aa0b: 0xe0002413, - 0x2aa0c: 0x6c01a420, 0x2aa0d: 0x6c01a620, 0x2aa0e: 0xe000241f, 0x2aa0f: 0x02b84684, - 0x2aa10: 0x02b84484, 0x2aa11: 0xe0002422, 0x2aa12: 0x02bbe684, 0x2aa13: 0x02bcf484, - 0x2aa14: 0x02bea284, 0x2aa15: 0x6c01e620, 0x2aa16: 0x02bf8884, 0x2aa17: 0xe0002428, - 0x2aa18: 0x02c49884, 0x2aa19: 0x02ca6a84, 0x2aa1b: 0x02cbc284, - 0x2aa1c: 0x6c049420, 0x2aa1d: 0x6c049a20, 0x2aa1e: 0xe0002436, 0x2aa1f: 0x2c098083, - 0x2aa20: 0x02d82284, 0x2aa21: 0x02d86a84, 0x2aa22: 0x02d87484, 0x2aa23: 0x02e0d884, - 0x2aa24: 0x02e45684, 0x2aa25: 0x6c04d420, 0x2aa26: 0x029c5884, 0x2aa27: 0x6c04ee20, - 0x2aa28: 0x02e55a84, 0x2aa29: 0xe000243f, 0x2aa2a: 0x6c0a1820, 0x2aa2b: 0xe0002445, - 0x2aa2c: 0x6c0a3220, 0x2aa2d: 0x02f27684, 0x2aa2e: 0x6c13f420, 0x2aa2f: 0x02f9f284, - 0x2aa30: 0x02fd3e84, 0x2aa31: 0x02fea684, 0x2aa32: 0x02fea484, 0x2aa33: 0xe0002451, - 0x2aa34: 0xe0002454, 0x2aa35: 0xe000244e, 0x2aa36: 0x6c143820, 0x2aa37: 0xe000245a, - 0x2aa38: 0x02ff1684, 0x2aa39: 0x03000484, 0x2aa3a: 0x03010084, 0x2aa3b: 0xe000245d, - 0x2aa3c: 0x6c050a20, 0x2aa3d: 0xe0002463, 0x2aa3e: 0x6c020220, 0x2aa3f: 0xe0002466, - // Block 0xaa9, offset 0x2aa40 - 0x2aa40: 0xe0002469, 0x2aa41: 0x030c9c84, 0x2aa42: 0x0310c884, 0x2aa43: 0x03130084, - 0x2aa44: 0x0312fe84, 0x2aa45: 0x03138284, 0x2aa46: 0x6c26a420, 0x2aa47: 0xe000246c, - 0x2aa48: 0x03174084, 0x2aa49: 0x031a3a84, 0x2aa4a: 0x6c270020, 0x2aa4b: 0x031ecc84, - 0x2aa4c: 0x6c020620, 0x2aa4d: 0x6c051c20, 0x2aa4e: 0xe0002475, 0x2aa4f: 0x6c00cc20, - 0x2aa50: 0x03290a84, 0x2aa51: 0x032aee84, 0x2aa52: 0x032af084, 0x2aa53: 0x032afe84, - 0x2aa54: 0x032bd084, 0x2aa55: 0xe000247b, 0x2aa56: 0x6c00ce20, 0x2aa57: 0x6c427620, - 0x2aa58: 0x032ea484, 0x2aa59: 0x032fcc84, 0x2aa5a: 0x0330ea84, 0x2aa5b: 0x03319c84, - 0x2aa5c: 0x0331bc84, 0x2aa5d: 0x0331be84, 0x2aa5e: 0x6c636020, 0x2aa5f: 0x0331c084, - 0x2aa60: 0x0332c684, 0x2aa61: 0xe0002484, 0x2aa62: 0x0334d884, 0x2aa63: 0x6c63aa20, - 0x2aa64: 0xe000248a, 0x2aa65: 0x0338f884, 0x2aa66: 0x033c3e84, 0x2aa67: 0xe000248d, - 0x2aa68: 0x033d4c84, 0x2aa69: 0x033d8884, 0x2aa6a: 0x033dfc84, 0x2aa6b: 0xe0002490, - 0x2aa6c: 0x033ea084, 0x2aa6d: 0xe0002493, 0x2aa6e: 0x033efe84, 0x2aa6f: 0xe0002496, - 0x2aa70: 0x033f3284, 0x2aa71: 0xe0002499, 0x2aa72: 0xe000249c, 0x2aa73: 0x2c28ac83, - // Block 0xaaa, offset 0x2aa80 - 0x2aa80: 0x2c000286, 0x2aa81: 0x2c000483, 0x2aa82: 0x2c000683, 0x2aa83: 0x2c000883, - 0x2aa84: 0x2c001084, 0x2aa85: 0x2c002483, 0x2aa86: 0x2c007486, 0x2aa87: 0x2c007c83, - 0x2aa88: 0x2c007e84, 0x2aa89: 0x2c008483, 0x2aa8a: 0x2c008683, 0x2aa8b: 0x2c008884, - 0x2aa8c: 0x2c008c83, 0x2aa8d: 0x2c008e83, 0x2aa8e: 0x2c009083, 0x2aa8f: 0x2c009483, - 0x2aa90: 0x2c009a83, 0x2aa91: 0x2c00a083, 0x2aa92: 0x2c00a883, 0x2aa93: 0x2c00aa83, - 0x2aa94: 0x2c00ac83, 0x2aa95: 0x2c00b083, 0x2aa96: 0x2c00b483, 0x2aa97: 0x2c00b685, - 0x2aa98: 0x2c00ba83, 0x2aa99: 0x2c00bc83, 0x2aa9a: 0x2c00be83, 0x2aa9b: 0x2c00c083, - 0x2aa9c: 0x2c00c483, 0x2aa9d: 0x2c018083, 0x2aa9e: 0x2c018283, 0x2aa9f: 0x2c018484, - 0x2aaa0: 0x2c018683, 0x2aaa1: 0x2c018883, 0x2aaa2: 0x2c018c83, 0x2aaa3: 0x2c018e83, - 0x2aaa4: 0x2c019083, 0x2aaa5: 0x2c019484, 0x2aaa6: 0x2c019683, 0x2aaa7: 0x2c01a083, - 0x2aaa8: 0x2c01a283, 0x2aaa9: 0x2c01a883, 0x2aaaa: 0x2c01ac83, 0x2aaab: 0x2c01b283, - 0x2aaac: 0x2c01b683, 0x2aaad: 0x2c01ba83, 0x2aaae: 0x2c01bc83, 0x2aaaf: 0x2c01c483, - 0x2aab0: 0x2c01c683, 0x2aab1: 0x2c01cc83, 0x2aab2: 0x2c01ce83, 0x2aab3: 0x2c01d283, - 0x2aab4: 0x2c01d483, 0x2aab5: 0x2c01d683, 0x2aab6: 0x2c01d883, 0x2aab7: 0x2c01dc83, - 0x2aab8: 0x2c01e083, 0x2aab9: 0x2c01e883, 0x2aaba: 0x2c01ec83, 0x2aabb: 0x2c01ee83, - 0x2aabc: 0x2c046683, 0x2aabd: 0x2c046c83, 0x2aabe: 0x2c046e83, 0x2aabf: 0x2c047484, - // Block 0xaab, offset 0x2aac0 - 0x2aac0: 0x2c047e83, 0x2aac1: 0x2c048083, 0x2aac2: 0x2c048484, 0x2aac3: 0x2c048683, - 0x2aac4: 0x2c048a83, 0x2aac5: 0x2c048e83, 0x2aac6: 0x2c049083, 0x2aac7: 0x2c049684, - 0x2aac8: 0x2c049883, 0x2aac9: 0x2c049c85, 0x2aaca: 0x2c049e84, 0x2aacb: 0x2c04a683, - 0x2aacc: 0x2c04a883, 0x2aacd: 0x2c04ae83, 0x2aace: 0x2c04b483, 0x2aacf: 0x2c04b683, - 0x2aad0: 0x2c04bc83, 0x2aad1: 0x2c04be83, 0x2aad2: 0x2c04c283, 0x2aad3: 0x2c04c483, - 0x2aad4: 0x2c04c684, 0x2aad5: 0x2c04d084, 0x2aad6: 0x2c04d683, 0x2aad7: 0x2c04de83, - 0x2aad8: 0x2c04e083, 0x2aad9: 0x2c04e483, 0x2aada: 0x2c04e883, 0x2aadb: 0x2c04ec83, - 0x2aadc: 0x2c04f083, 0x2aadd: 0x2c04f483, 0x2aade: 0x2c09ee83, 0x2aadf: 0x2c09f283, - 0x2aae0: 0x2c09fa83, 0x2aae1: 0x2c09fc83, 0x2aae2: 0x2c09fe83, 0x2aae3: 0x2c0a0284, - 0x2aae4: 0x2c0a0683, 0x2aae5: 0x2c0a0a83, 0x2aae6: 0x2c0a1a83, 0x2aae7: 0x2c0a2083, - 0x2aae8: 0x2c0a2283, 0x2aae9: 0x2c0a2483, 0x2aaea: 0x2c0a2683, 0x2aaeb: 0x2c0a2883, - 0x2aaec: 0x2c0a2a83, 0x2aaed: 0x2c0a2c83, 0x2aaee: 0x2c0a2e83, 0x2aaef: 0x2c0a3083, - 0x2aaf0: 0x2c0a3483, 0x2aaf1: 0x2c0a3883, 0x2aaf2: 0x2c0a3c83, 0x2aaf3: 0x2c0a4083, - 0x2aaf4: 0x2c0a4483, 0x2aaf5: 0x2c141083, 0x2aaf6: 0x2c141483, 0x2aaf7: 0x2c141683, - 0x2aaf8: 0x2c143083, 0x2aaf9: 0x2c143483, 0x2aafa: 0x2c143a83, 0x2aafb: 0x2c144283, - 0x2aafc: 0x2c144483, 0x2aafd: 0x2c144883, 0x2aafe: 0x2c144c83, 0x2aaff: 0x2c145083, - // Block 0xaac, offset 0x2ab00 - 0x2ab00: 0x2c145283, 0x2ab01: 0x2c145683, 0x2ab02: 0x2c147a83, 0x2ab03: 0x2c147e83, - 0x2ab04: 0x2c148283, 0x2ab05: 0x2c148883, 0x2ab06: 0x2c149083, 0x2ab07: 0x2c149283, - 0x2ab08: 0x2c149483, 0x2ab09: 0x2c149883, 0x2ab0a: 0x2c149a83, 0x2ab0b: 0x2c149e83, - 0x2ab0c: 0x2c14ca83, 0x2ab0d: 0x2c14cc83, 0x2ab0e: 0x2c14ce83, 0x2ab0f: 0x2c14d083, - 0x2ab10: 0x2c14d283, 0x2ab11: 0x2c14d483, 0x2ab12: 0x2c26a083, 0x2ab13: 0x2c26a683, - 0x2ab14: 0x2c26aa83, 0x2ab15: 0x2c26e683, 0x2ab16: 0x2c26ea83, 0x2ab17: 0x2c26ec83, - 0x2ab18: 0x2c26f283, 0x2ab19: 0x2c26f483, 0x2ab1a: 0x2c26fa83, 0x2ab1b: 0x2c26fc84, - 0x2ab1c: 0x2c270283, 0x2ab1d: 0x2c270683, 0x2ab1e: 0x2c270e83, 0x2ab1f: 0x2c271c83, - 0x2ab20: 0x2c272083, 0x2ab21: 0x2c272683, 0x2ab22: 0x2c278a83, 0x2ab23: 0x2c27ec83, - 0x2ab24: 0x2c27ee83, 0x2ab25: 0x2c27f083, 0x2ab26: 0x2c41dc84, 0x2ab27: 0x2c41fe83, - 0x2ab28: 0x2c420283, 0x2ab29: 0x2c421083, 0x2ab2a: 0x2c427283, 0x2ab2b: 0x2c427483, - 0x2ab2c: 0x2c427883, 0x2ab2d: 0x2c427a83, 0x2ab2e: 0x2c427e83, 0x2ab2f: 0x2c632e83, - 0x2ab30: 0x2c633283, 0x2ab31: 0x2c633483, 0x2ab32: 0x2c633c83, 0x2ab33: 0x2c633e83, - 0x2ab34: 0x2c634083, 0x2ab35: 0x2c634e83, 0x2ab36: 0x2c635c83, 0x2ab37: 0x2c636283, - 0x2ab38: 0x2c637e83, 0x2ab39: 0x2c638283, 0x2ab3a: 0x2c8a8e83, 0x2ab3b: 0x2c8aae83, - 0x2ab3c: 0x2c8ab083, 0x2ab3d: 0x2c8ab283, 0x2ab3e: 0x2c8ab483, 0x2ab3f: 0x2c8aba83, - // Block 0xaad, offset 0x2ab40 - 0x2ab40: 0x2c8abc83, 0x2ab41: 0x2c8abe83, 0x2ab42: 0x2cb74483, 0x2ab43: 0x2cb75283, - 0x2ab44: 0x2cb78283, 0x2ab45: 0x2cb78683, 0x2ab46: 0x2cb78a83, 0x2ab47: 0x2cb79483, - 0x2ab48: 0x2ce8b483, 0x2ab49: 0x2ce8b883, 0x2ab4a: 0x2ce8ba83, 0x2ab4b: 0x2ce8be83, - 0x2ab4c: 0x2d187483, 0x2ab4d: 0x2d187883, 0x2ab4e: 0x2d187a83, 0x2ab4f: 0x2d188083, - 0x2ab50: 0x2d478083, 0x2ab51: 0x2d478283, 0x2ab52: 0x2d75b683, 0x2ab53: 0x2d9f9c83, - 0x2ab54: 0x2d9f9e83, 0x2ab55: 0x2dc24283, - 0x2ab70: 0x40273a20, 0x2ab71: 0x40273c20, 0x2ab72: 0x40273e20, 0x2ab73: 0x40274020, - 0x2ab74: 0x40274220, 0x2ab75: 0x40274420, 0x2ab76: 0x40274620, 0x2ab77: 0x40274820, - 0x2ab78: 0x40274a20, 0x2ab79: 0x40274c20, 0x2ab7a: 0x40274e20, 0x2ab7b: 0x40275020, - // Block 0xaae, offset 0x2ab80 - 0x2ab80: 0x00021283, 0x2ab81: 0x40025c20, 0x2ab82: 0x40030420, 0x2ab83: 0x40051220, - 0x2ab84: 0x40279a20, 0x2ab85: 0x6c021420, 0x2ab86: 0x6c002820, 0x2ab87: 0x6c002a20, - 0x2ab88: 0x40049c20, 0x2ab89: 0x40049e20, 0x2ab8a: 0x4004a020, 0x2ab8b: 0x4004a220, - 0x2ab8c: 0x4004a420, 0x2ab8d: 0x4004a620, 0x2ab8e: 0x4004a820, 0x2ab8f: 0x4004aa20, - 0x2ab90: 0x4004ac20, 0x2ab91: 0x4004ae20, 0x2ab92: 0x40279c20, 0x2ab93: 0x40279e20, - 0x2ab94: 0x4004b020, 0x2ab95: 0x4004b220, 0x2ab96: 0x4004b420, 0x2ab97: 0x4004b620, - 0x2ab98: 0x4004b820, 0x2ab99: 0x4004ba20, 0x2ab9a: 0x4004bc20, 0x2ab9b: 0x4004be20, - 0x2ab9c: 0x40023820, 0x2ab9d: 0x4003ea20, 0x2ab9e: 0x4003ec20, 0x2ab9f: 0x4003ee20, - 0x2aba0: 0x4027a020, 0x2aba1: 0x6c002c20, 0x2aba2: 0x6c00d220, 0x2aba3: 0x6c021620, - 0x2aba4: 0x6c00d420, 0x2aba5: 0x6c002e20, 0x2aba6: 0x6c00d620, 0x2aba7: 0x6c021820, - 0x2aba8: 0x6c053820, 0x2aba9: 0x6c053a20, 0x2abaa: 0xada12202, 0x2abab: 0xae412302, - 0x2abac: 0xae812402, 0x2abad: 0xade12502, 0x2abae: 0xae012602, 0x2abaf: 0xae012702, - 0x2abb0: 0x40023a20, 0x2abb1: 0x4027ce20, 0x2abb2: 0xe0000152, 0x2abb3: 0x4027d020, - 0x2abb4: 0xe0000155, 0x2abb5: 0x4027d220, 0x2abb6: 0x00279c84, 0x2abb7: 0x4027a220, - 0x2abb8: 0x2c00b684, 0x2abb9: 0x2c00e683, 0x2abba: 0x2c036883, 0x2abbb: 0x6c003020, - 0x2abbc: 0xe000231a, 0x2abbd: 0x40051420, 0x2abbe: 0x4027a420, 0x2abbf: 0x4027a620, - // Block 0xaaf, offset 0x2abc0 - 0x2abc0: 0x00633a84, 0x2abc1: 0x00634484, 0x2abc2: 0x0064f684, 0x2abc3: 0x0064f884, - 0x2abc4: 0x00635a84, 0x2abc5: 0x00635c84, 0x2abc6: 0x00635e84, 0x2abc7: 0x0063ee84, - 0x2abc8: 0x0063f084, 0x2abc9: 0x0063f684, 0x2abca: 0x00640884, 0x2abcb: 0x00640a84, - 0x2abcc: 0x00640e84, 0x2abcd: 0x00642284, 0x2abce: 0x00642884, - 0x2abd0: 0x4027a820, 0x2abd1: 0x4027aa20, 0x2abd2: 0x2c000285, 0x2abd3: 0x2c007485, - 0x2abd4: 0x2c00dc85, 0x2abd5: 0x2c079084, 0x2abd6: 0x2c00de84, 0x2abd7: 0x2c023685, - 0x2abd8: 0x2c00e084, 0x2abd9: 0x2c0a0e83, 0x2abda: 0x2c001083, 0x2abdb: 0x2c054883, - 0x2abdc: 0x2c003283, 0x2abdd: 0x2c03de84, 0x2abde: 0x2c0ed083, 0x2abdf: 0x2c007e83, - 0x2abe0: 0xe000237a, 0x2abe1: 0xe0002383, 0x2abe2: 0xe0002380, 0x2abe3: 0xe000237d, - 0x2abe4: 0x40661c20, 0x2abe5: 0xe000238c, 0x2abe6: 0x40661620, 0x2abe7: 0xe0002389, - 0x2abe8: 0xe000239e, 0x2abe9: 0xe0002386, 0x2abea: 0xe0002395, 0x2abeb: 0xe000239b, - 0x2abec: 0x40663420, 0x2abed: 0x4065f220, 0x2abee: 0xe000238f, 0x2abef: 0xe0002392, - 0x2abf0: 0x40663020, 0x2abf1: 0x40663220, 0x2abf2: 0x40662c20, 0x2abf3: 0xe0002398, - 0x2abf4: 0x0065dc99, 0x2abf5: 0x0065e699, 0x2abf6: 0x0065ee99, 0x2abf7: 0x0065f499, - 0x2abf8: 0x40660c20, 0x2abf9: 0x40660e20, 0x2abfa: 0x40661020, - // Block 0xab0, offset 0x2ac00 - 0x2ac00: 0xf0000404, 0x2ac01: 0xf0000404, 0x2ac02: 0xf0000404, 0x2ac03: 0xf0000404, - 0x2ac04: 0xf0000404, 0x2ac05: 0xf0000404, 0x2ac06: 0xf0000404, 0x2ac07: 0xf0000404, - 0x2ac08: 0xf0000404, 0x2ac09: 0xf0000404, 0x2ac0a: 0xf0000404, 0x2ac0b: 0xf0000404, - 0x2ac0c: 0xf0000404, 0x2ac0d: 0xf0000404, 0x2ac0e: 0xe000004c, 0x2ac0f: 0xe0000051, - 0x2ac10: 0xe0000056, 0x2ac11: 0xe000005b, 0x2ac12: 0xe0000060, 0x2ac13: 0xe0000065, - 0x2ac14: 0xe000006a, 0x2ac15: 0xe000006f, 0x2ac16: 0xe0000083, 0x2ac17: 0xe000008d, - 0x2ac18: 0xe0000092, 0x2ac19: 0xe0000097, 0x2ac1a: 0xe000009c, 0x2ac1b: 0xe00000a1, - 0x2ac1c: 0xe0000088, 0x2ac1d: 0xe0000074, 0x2ac1e: 0xe000007c, - 0x2ac20: 0xe000b5b7, 0x2ac21: 0xe000b5c3, 0x2ac22: 0xe000b5cf, 0x2ac23: 0xe000b5f7, - 0x2ac24: 0xe000b5d7, 0x2ac25: 0xe000b5db, 0x2ac26: 0xe000b5bb, 0x2ac27: 0xe000b5c7, - 0x2ac28: 0xe000b5bf, 0x2ac29: 0xe000b5cb, 0x2ac2a: 0xe000b5e3, 0x2ac2b: 0xe000b5ef, - 0x2ac2c: 0xe000b5eb, 0x2ac2d: 0xe000b5e7, 0x2ac2e: 0xe000b627, 0x2ac2f: 0xe000b5d3, - 0x2ac30: 0xe000b5df, 0x2ac31: 0xe000b62b, 0x2ac32: 0xe000b607, 0x2ac33: 0xe000b623, - 0x2ac34: 0xe000b603, 0x2ac35: 0xe000b62f, 0x2ac36: 0xe000b637, 0x2ac37: 0xe000b633, - 0x2ac38: 0xe000b613, 0x2ac39: 0xe000b5f3, 0x2ac3a: 0xe000b61b, 0x2ac3b: 0xe000b61f, - 0x2ac3c: 0xe000b643, 0x2ac3d: 0xe000b5fb, 0x2ac3e: 0xe000b63f, 0x2ac3f: 0xe000b617, - // Block 0xab1, offset 0x2ac40 - 0x2ac40: 0xe000b63b, 0x2ac41: 0xe000b5ff, 0x2ac42: 0xe000b60b, 0x2ac43: 0xe000b60f, - 0x2ac44: 0x2c8e8e83, 0x2ac45: 0x2c08be83, 0x2ac46: 0x2c048483, 0x2ac47: 0x2d326883, - 0x2ac48: 0xe00002e3, 0x2ac49: 0xe00003d8, 0x2ac4a: 0xe00004b3, 0x2ac4b: 0xe000057d, - 0x2ac4c: 0xe0000648, 0x2ac4d: 0xe00006f0, 0x2ac4e: 0xe000079c, 0x2ac4f: 0xe0000841, - 0x2ac50: 0xe0000ec0, 0x2ac51: 0xf0000606, 0x2ac52: 0xf0000606, 0x2ac53: 0xf0000606, - 0x2ac54: 0xf0000606, 0x2ac55: 0xf0000606, 0x2ac56: 0xf0000606, 0x2ac57: 0xf0000606, - 0x2ac58: 0xf0000606, 0x2ac59: 0xf0000606, 0x2ac5a: 0xf0000606, 0x2ac5b: 0xf0000606, - 0x2ac5c: 0xf0000606, 0x2ac5d: 0xf0000606, 0x2ac5e: 0xf0000606, 0x2ac5f: 0xf0000606, - 0x2ac60: 0x0062ac86, 0x2ac61: 0x0062b086, 0x2ac62: 0x0062b286, 0x2ac63: 0x0062b686, - 0x2ac64: 0x0062b886, 0x2ac65: 0x0062ba86, 0x2ac66: 0x0062be86, 0x2ac67: 0x0062c286, - 0x2ac68: 0x0062c486, 0x2ac69: 0x0062c886, 0x2ac6a: 0x0062ca86, 0x2ac6b: 0x0062cc86, - 0x2ac6c: 0x0062ce86, 0x2ac6d: 0x0062d086, 0x2ac6e: 0xf0000606, 0x2ac6f: 0xf0000606, - 0x2ac70: 0xf0000606, 0x2ac71: 0xf0000606, 0x2ac72: 0xf0000606, 0x2ac73: 0xf0000606, - 0x2ac74: 0xf0000606, 0x2ac75: 0xf0000606, 0x2ac76: 0xf0000606, 0x2ac77: 0xf0000606, - 0x2ac78: 0xf0000606, 0x2ac79: 0xf0000606, 0x2ac7a: 0xf0000606, 0x2ac7b: 0xf0000606, - 0x2ac7c: 0xe0002127, 0x2ac7d: 0xe0002122, 0x2ac7e: 0xf0000606, 0x2ac7f: 0x4027ac20, - // Block 0xab2, offset 0x2ac80 - 0x2ac80: 0x2c000284, 0x2ac81: 0x2c007484, 0x2ac82: 0x2c00dc84, 0x2ac83: 0x2c079083, - 0x2ac84: 0x2c028883, 0x2ac85: 0x2c02d883, 0x2ac86: 0x2c003683, 0x2ac87: 0x2c008883, - 0x2ac88: 0x2c006283, 0x2ac89: 0x2c00b683, 0x2ac8a: 0x2c049c84, 0x2ac8b: 0x2c04d083, - 0x2ac8c: 0x2c04c683, 0x2ac8d: 0x2c049e83, 0x2ac8e: 0x2c41dc83, 0x2ac8f: 0x2c018483, - 0x2ac90: 0x2c049683, 0x2ac91: 0x2c741683, 0x2ac92: 0x2c127484, 0x2ac93: 0x2c3cee83, - 0x2ac94: 0x2c0e3e83, 0x2ac95: 0x2c791683, 0x2ac96: 0x2c86f083, 0x2ac97: 0x2c7de083, - 0x2ac98: 0x2c185283, 0x2ac99: 0x2c7e3883, 0x2ac9a: 0x2c24b683, 0x2ac9b: 0x2c019483, - 0x2ac9c: 0x2d6c7483, 0x2ac9d: 0x2d9fc483, 0x2ac9e: 0x2c0db883, 0x2ac9f: 0x2c38fa83, - 0x2aca0: 0x2ce74883, 0x2aca1: 0x2c0bc083, 0x2aca2: 0x2c063e83, 0x2aca3: 0x2c097683, - 0x2aca4: 0x2c00de83, 0x2aca5: 0x2c023684, 0x2aca6: 0x2c00e083, 0x2aca7: 0x2c089284, - 0x2aca8: 0x2c075484, 0x2aca9: 0x2c18a683, 0x2acaa: 0x2c300483, 0x2acab: 0x2c2fd883, - 0x2acac: 0x2d2efa83, 0x2acad: 0x2c0ba083, 0x2acae: 0x2d0f3883, 0x2acaf: 0x2c2bb283, - 0x2acb0: 0x2c2e8e83, 0x2acb1: 0xf0000606, 0x2acb2: 0xf0000606, 0x2acb3: 0xf0000606, - 0x2acb4: 0xf0000606, 0x2acb5: 0xf0000606, 0x2acb6: 0xf0000606, 0x2acb7: 0xf0000606, - 0x2acb8: 0xf0000606, 0x2acb9: 0xf0000606, 0x2acba: 0xf0000606, 0x2acbb: 0xf0000606, - 0x2acbc: 0xf0000606, 0x2acbd: 0xf0000606, 0x2acbe: 0xf0000606, 0x2acbf: 0xf0000606, - // Block 0xab3, offset 0x2acc0 - 0x2acc0: 0xf0000203, 0x2acc1: 0xf0000203, 0x2acc2: 0xf0000203, 0x2acc3: 0xf0000203, - 0x2acc4: 0xf0000203, 0x2acc5: 0xf0000203, 0x2acc6: 0xf0000203, 0x2acc7: 0xf0000203, - 0x2acc8: 0xf0000203, 0x2acc9: 0xe000b66f, 0x2acca: 0xe000b67b, 0x2accb: 0xe000b687, - 0x2accc: 0xf0001c1d, 0x2accd: 0xe0000b85, 0x2acce: 0xf0001d1c, 0x2accf: 0xe0000d14, - 0x2acd0: 0x00657693, 0x2acd1: 0x00657893, 0x2acd2: 0x00657a93, 0x2acd3: 0x00657e93, - 0x2acd4: 0x00658093, 0x2acd5: 0x00658293, 0x2acd6: 0x00658493, 0x2acd7: 0x00658693, - 0x2acd8: 0x00658893, 0x2acd9: 0x00658a93, 0x2acda: 0x00658c93, 0x2acdb: 0x00658e93, - 0x2acdc: 0x00659093, 0x2acdd: 0x00659293, 0x2acde: 0x00659493, 0x2acdf: 0x00659693, - 0x2ace0: 0x00659893, 0x2ace1: 0x00659a93, 0x2ace2: 0x00659c93, 0x2ace3: 0x00659e93, - 0x2ace4: 0x0065a093, 0x2ace5: 0x0065a293, 0x2ace6: 0x0065a493, 0x2ace7: 0x0065a693, - 0x2ace8: 0x0065a893, 0x2ace9: 0x0065aa93, 0x2acea: 0x0065ac93, 0x2aceb: 0x0065ae93, - 0x2acec: 0x0065b093, 0x2aced: 0x0065b293, 0x2acee: 0x0065b493, 0x2acef: 0x0065b693, - 0x2acf0: 0x0065b893, 0x2acf1: 0x0065ba93, 0x2acf2: 0x0065bc93, 0x2acf3: 0x0065be93, - 0x2acf4: 0x0065c093, 0x2acf5: 0x0065c493, 0x2acf6: 0x0065c693, 0x2acf7: 0x0065c893, - 0x2acf8: 0x0065ca93, 0x2acf9: 0x0065cc93, 0x2acfa: 0x0065ce93, 0x2acfb: 0x0065d093, - 0x2acfc: 0x0065d293, 0x2acfd: 0x0065d493, 0x2acfe: 0x0065d693, - // Block 0xab4, offset 0x2ad00 - 0x2ad00: 0xe000230b, 0x2ad01: 0xe00022f8, 0x2ad02: 0xe00022fc, 0x2ad03: 0xe0002311, - 0x2ad04: 0xe0002316, 0x2ad05: 0xe000231d, 0x2ad06: 0xe0002321, 0x2ad07: 0xe0002325, - 0x2ad08: 0xe000232b, 0x2ad09: 0xf0001c1c, 0x2ad0a: 0xe0002330, 0x2ad0b: 0xe000233c, - 0x2ad0c: 0xe0002340, 0x2ad0d: 0xe0002337, 0x2ad0e: 0xe0002346, 0x2ad0f: 0xe000234b, - 0x2ad10: 0xe000234f, 0x2ad11: 0xe0002353, 0x2ad12: 0xf0001c1c, 0x2ad13: 0xe000235e, - 0x2ad14: 0xe0002358, 0x2ad15: 0xf0001c1c, 0x2ad16: 0xe0002363, 0x2ad17: 0xe000236d, - 0x2ad18: 0xf0000203, 0x2ad19: 0xf0000203, 0x2ad1a: 0xf0000203, 0x2ad1b: 0xf0000203, - 0x2ad1c: 0xf0000203, 0x2ad1d: 0xf0000203, 0x2ad1e: 0xf0000203, 0x2ad1f: 0xf0000203, - 0x2ad20: 0xf0000203, 0x2ad21: 0xf0000203, 0x2ad22: 0xe000b673, 0x2ad23: 0xe000b67f, - 0x2ad24: 0xe000b68b, 0x2ad25: 0xe000b693, 0x2ad26: 0xe000b69b, 0x2ad27: 0xe000b6a3, - 0x2ad28: 0xe000b6ab, 0x2ad29: 0xe000b6b3, 0x2ad2a: 0xe000b6bb, 0x2ad2b: 0xe000b6c3, - 0x2ad2c: 0xe000b6cb, 0x2ad2d: 0xe000b6d3, 0x2ad2e: 0xe000b6db, 0x2ad2f: 0xe000b6e3, - 0x2ad30: 0xe000b6eb, 0x2ad31: 0xe0000c1e, 0x2ad32: 0xf0001c1c, 0x2ad33: 0xf0001d1d, - 0x2ad34: 0xe0000a31, 0x2ad35: 0xf0001d1c, 0x2ad36: 0xf0001c1c, 0x2ad37: 0xf0001c1c, - 0x2ad38: 0xe0000ac2, 0x2ad39: 0xe0000ac6, 0x2ad3a: 0xf0001d1d, 0x2ad3b: 0xf0000203, - 0x2ad3c: 0xf0000203, 0x2ad3d: 0xf0000203, 0x2ad3e: 0xf0000203, 0x2ad3f: 0xe000b70b, - // Block 0xab5, offset 0x2ad40 - 0x2ad40: 0xf0001d1c, 0x2ad41: 0xf0001d1d, 0x2ad42: 0xe00009b7, 0x2ad43: 0xf0001c1d, - 0x2ad44: 0xf0001c1c, 0x2ad45: 0xf0001c1c, 0x2ad46: 0xe0000a66, 0x2ad47: 0xe0000a7a, - 0x2ad48: 0xf0001d1c, 0x2ad49: 0xf0001c1d, 0x2ad4a: 0xf0001c1c, 0x2ad4b: 0xf0001d1d, - 0x2ad4c: 0xf0001c1c, 0x2ad4d: 0xf0001d1d, 0x2ad4e: 0xf0001d1d, 0x2ad4f: 0xf0001c1c, - 0x2ad50: 0xf0001c1c, 0x2ad51: 0xf0001c1c, 0x2ad52: 0xe0000d0d, 0x2ad53: 0xf0001c1c, - 0x2ad54: 0xf0001c1c, 0x2ad55: 0xe0000d3a, 0x2ad56: 0xe0000d46, 0x2ad57: 0xf0001d1d, - 0x2ad58: 0xe0000eb0, 0x2ad59: 0xe0000eb8, 0x2ad5a: 0xf0001d1d, 0x2ad5b: 0xf0001c1c, - 0x2ad5c: 0xf0001c1d, 0x2ad5d: 0xf0001c1d, 0x2ad5e: 0xe00010b2, 0x2ad5f: 0xe00009c8, - 0x2ad60: 0xf0000203, 0x2ad61: 0xf0000203, 0x2ad62: 0xf0000203, 0x2ad63: 0xf0000203, - 0x2ad64: 0xf0000203, 0x2ad65: 0xf0000203, 0x2ad66: 0xf0000203, 0x2ad67: 0xf0000203, - 0x2ad68: 0xf0000203, 0x2ad69: 0xe000b66b, 0x2ad6a: 0xe000b677, 0x2ad6b: 0xe000b683, - 0x2ad6c: 0xe000b68f, 0x2ad6d: 0xe000b697, 0x2ad6e: 0xe000b69f, 0x2ad6f: 0xe000b6a7, - 0x2ad70: 0xe000b6af, 0x2ad71: 0xe000b6b7, 0x2ad72: 0xe000b6bf, 0x2ad73: 0xe000b6c7, - 0x2ad74: 0xe000b6cf, 0x2ad75: 0xe000b6d7, 0x2ad76: 0xe000b6df, 0x2ad77: 0xe000b6e7, - 0x2ad78: 0xe000b6ef, 0x2ad79: 0xe000b6f3, 0x2ad7a: 0xe000b6f7, 0x2ad7b: 0xe000b6fb, - 0x2ad7c: 0xe000b6ff, 0x2ad7d: 0xe000b703, 0x2ad7e: 0xe000b707, 0x2ad7f: 0xe0000bdf, - // Block 0xab6, offset 0x2ad80 - 0x2ad80: 0x6c053e20, 0x2ad81: 0x6c0acc20, 0x2ad82: 0x6c0ace20, 0x2ad83: 0x6c00f620, - 0x2ad84: 0x6c00f820, 0x2ad85: 0x6c004e20, 0x2ad86: 0x6c0aee20, 0x2ad87: 0x6c011a20, - 0x2ad88: 0x6c011c20, 0x2ad89: 0x6c011e20, 0x2ad8a: 0x6c025820, 0x2ad8b: 0x6c025a20, - 0x2ad8c: 0x6c059820, 0x2ad8d: 0x6c059a20, 0x2ad8e: 0x6c059c20, 0x2ad8f: 0x6c059e20, - 0x2ad90: 0x6c0b0e20, 0x2ad91: 0x6c0b1020, 0x2ad92: 0x6c0b1220, 0x2ad93: 0x6c0b1420, - 0x2ad94: 0x6c0b1620, 0x2ad95: 0x6c0b1820, 0x2ad96: 0x6c160a20, 0x2ad97: 0x6c160c20, - 0x2ad98: 0x6c160e20, 0x2ad99: 0x6c28d820, 0x2ad9a: 0x6c28da20, 0x2ad9b: 0x6c28dc20, - 0x2ad9c: 0x6c430a20, 0x2ad9d: 0x6c430c20, 0x2ad9e: 0x6c430e20, 0x2ad9f: 0x6c431020, - 0x2ada0: 0x6c431220, 0x2ada1: 0x6c8b0620, 0x2ada2: 0x6c8b0820, 0x2ada3: 0x6c8b0a20, - 0x2ada4: 0x6cb7b020, 0x2ada5: 0x6d75d620, 0x2ada6: 0x6de00620, 0x2ada7: 0x6c027820, - 0x2ada8: 0x6c28f220, 0x2ada9: 0x6c28fa20, 0x2adaa: 0x6c0b5020, 0x2adab: 0x6c0b5220, - 0x2adac: 0x6c163420, 0x2adad: 0x6c290c20, 0x2adae: 0x6ce8e420, 0x2adaf: 0x6d9fa820, - 0x2adb0: 0x6c05b820, 0x2adb1: 0x6c05ba20, 0x2adb2: 0x6c05bc20, 0x2adb3: 0x6c05be20, - 0x2adb4: 0x6c05c020, 0x2adb5: 0x6c05c220, 0x2adb6: 0x6c05c420, 0x2adb7: 0x6c05c620, - 0x2adb8: 0x6c0b6820, 0x2adb9: 0x6c0b6a20, 0x2adba: 0x6c0b6c20, 0x2adbb: 0x6c0b6e20, - 0x2adbc: 0x6c0b7020, 0x2adbd: 0x6c0b7220, 0x2adbe: 0x6c0b7420, 0x2adbf: 0x6c0b7620, - // Block 0xab7, offset 0x2adc0 - 0x2adc0: 0x6c0b7820, 0x2adc1: 0x6c164620, 0x2adc2: 0x6c164820, 0x2adc3: 0x6c164a20, - 0x2adc4: 0x6c164c20, 0x2adc5: 0x6c164e20, 0x2adc6: 0x6c165020, 0x2adc7: 0x6c165220, - 0x2adc8: 0x6c165420, 0x2adc9: 0x6c292220, 0x2adca: 0x6c292420, 0x2adcb: 0x6c292620, - 0x2adcc: 0x6c292820, 0x2adcd: 0x6c292a20, 0x2adce: 0x6c292c20, 0x2adcf: 0x6c292e20, - 0x2add0: 0x6c293020, 0x2add1: 0x6c293220, 0x2add2: 0x6c293420, 0x2add3: 0x6c293620, - 0x2add4: 0x6c293820, 0x2add5: 0x6c293a20, 0x2add6: 0x6c293c20, 0x2add7: 0x6c434620, - 0x2add8: 0x6c434820, 0x2add9: 0x6c434a20, 0x2adda: 0x6c434c20, 0x2addb: 0x6c434e20, - 0x2addc: 0x6c435020, 0x2addd: 0x6c435220, 0x2adde: 0x6c435420, 0x2addf: 0x6c435620, - 0x2ade0: 0x6c435820, 0x2ade1: 0x6c435a20, 0x2ade2: 0x6c435c20, 0x2ade3: 0x6c641a20, - 0x2ade4: 0x6c8b3e20, 0x2ade5: 0x6c641c20, 0x2ade6: 0x6c641e20, 0x2ade7: 0x6c642020, - 0x2ade8: 0x6c642220, 0x2ade9: 0x6c642420, 0x2adea: 0x6c642620, 0x2adeb: 0x6c642820, - 0x2adec: 0x6c642a20, 0x2aded: 0x6c642c20, 0x2adee: 0x6c8b4020, 0x2adef: 0x6c8b4220, - 0x2adf0: 0x6c8b4420, 0x2adf1: 0x6c8b4620, 0x2adf2: 0x6c8b4820, 0x2adf3: 0x6cb7da20, - 0x2adf4: 0x6cb7dc20, 0x2adf5: 0x6cb7de20, 0x2adf6: 0x6cb7e020, 0x2adf7: 0x6cb7e220, - 0x2adf8: 0x6cb7e420, 0x2adf9: 0x6cb7e620, 0x2adfa: 0x6cb7e820, 0x2adfb: 0x6ce8fe20, - 0x2adfc: 0x6ce90020, 0x2adfd: 0x6ce90220, 0x2adfe: 0x6ce90420, 0x2adff: 0x6ce90620, - // Block 0xab8, offset 0x2ae00 - 0x2ae00: 0x6ce90820, 0x2ae01: 0x6ce90a20, 0x2ae02: 0x6d18ae20, 0x2ae03: 0x6d18b020, - 0x2ae04: 0x6d18b220, 0x2ae05: 0x6d18b420, 0x2ae06: 0x6d18b620, 0x2ae07: 0x6d18b820, - 0x2ae08: 0x6d18ba20, 0x2ae09: 0x6d18bc20, 0x2ae0a: 0x6d18be20, 0x2ae0b: 0x6d18c020, - 0x2ae0c: 0x6d18c220, 0x2ae0d: 0x6d18c420, 0x2ae0e: 0x6d18c620, 0x2ae0f: 0x6d18c820, - 0x2ae10: 0x6d18ca20, 0x2ae11: 0x6d47b220, 0x2ae12: 0x6d47b420, 0x2ae13: 0x6d47b620, - 0x2ae14: 0x6d47b820, 0x2ae15: 0x6d47ba20, 0x2ae16: 0x6d47bc20, 0x2ae17: 0x6d47be20, - 0x2ae18: 0x6d47c020, 0x2ae19: 0x6d75f420, 0x2ae1a: 0x6d75f620, 0x2ae1b: 0x6d75f820, - 0x2ae1c: 0x6d75fa20, 0x2ae1d: 0x6d9faa20, 0x2ae1e: 0x6d9fac20, 0x2ae1f: 0x6dc24a20, - 0x2ae20: 0x6dc24c20, 0x2ae21: 0x6de00e20, 0x2ae22: 0x6de01020, 0x2ae23: 0x6de01220, - 0x2ae24: 0x6df86e20, 0x2ae25: 0x6df87020, 0x2ae26: 0x6df87220, 0x2ae27: 0x6e0c3e20, - 0x2ae28: 0x6e0c4020, 0x2ae29: 0x6e284a20, 0x2ae2a: 0x6e3ce220, 0x2ae2b: 0x6c0c4420, - 0x2ae2c: 0x6c2a2c20, 0x2ae2d: 0x6c657020, 0x2ae2e: 0x6c8c6620, 0x2ae2f: 0x6dc28c20, - 0x2ae30: 0x6c061620, 0x2ae31: 0x6c061820, 0x2ae32: 0x6c0c5820, 0x2ae33: 0x6c174e20, - 0x2ae34: 0x6c175020, 0x2ae35: 0x6c175c20, 0x2ae36: 0x6c175e20, 0x2ae37: 0x6c176020, - 0x2ae38: 0x6c447420, 0x2ae39: 0x6df89620, 0x2ae3a: 0x6c2a5c20, 0x2ae3b: 0x6c8c8420, - 0x2ae3c: 0x6c8c8620, 0x2ae3d: 0x6cb8f220, 0x2ae3e: 0x6cea0820, 0x2ae3f: 0x6e1c1c20, - // Block 0xab9, offset 0x2ae40 - 0x2ae40: 0x6c02fa20, 0x2ae41: 0x6c02fc20, 0x2ae42: 0x6c449020, 0x2ae43: 0x6cb8fc20, - 0x2ae44: 0x6d487620, 0x2ae45: 0x6c030620, 0x2ae46: 0x6c0c9820, 0x2ae47: 0x6c0c9a20, - 0x2ae48: 0x6c178e20, 0x2ae49: 0x6c2a7420, 0x2ae4a: 0x6c2a7620, 0x2ae4b: 0x6c2a7820, - 0x2ae4c: 0x6c2a7a20, 0x2ae4d: 0x6c2a7c20, 0x2ae4e: 0x6c44a020, 0x2ae4f: 0x6c44a220, - 0x2ae50: 0x6c65c220, 0x2ae51: 0x6c65c420, 0x2ae52: 0x6c65c620, 0x2ae53: 0x6c8c9620, - 0x2ae54: 0x6cb90c20, 0x2ae55: 0x6cb90e20, 0x2ae56: 0x6cea1220, 0x2ae57: 0x6d19ea20, - 0x2ae58: 0x6c8cbe20, 0x2ae59: 0x6c0cd220, 0x2ae5a: 0x6c067c20, 0x2ae5b: 0x6c067e20, - 0x2ae5c: 0x6c068020, 0x2ae5d: 0x6c0ce620, 0x2ae5e: 0x6c0ce820, 0x2ae5f: 0x6c17da20, - 0x2ae60: 0x6c17dc20, 0x2ae61: 0x6c2abc20, 0x2ae62: 0x6c2abe20, 0x2ae63: 0x6c2ac020, - 0x2ae64: 0x6c2ac220, 0x2ae65: 0x6c2ac420, 0x2ae66: 0x6c2ac620, 0x2ae67: 0x6c44e020, - 0x2ae68: 0x6c44e220, 0x2ae69: 0x6c44e420, 0x2ae6a: 0x6c44e620, 0x2ae6b: 0x6c44e820, - 0x2ae6c: 0x6c661220, 0x2ae6d: 0x6c661420, 0x2ae6e: 0x6c661620, 0x2ae6f: 0x6c661820, - 0x2ae70: 0x6c661a20, 0x2ae71: 0x6c8cd820, 0x2ae72: 0x6c8cda20, 0x2ae73: 0x6c8cdc20, - 0x2ae74: 0x6c8cde20, 0x2ae75: 0x6c8ce020, 0x2ae76: 0x6c8ce220, 0x2ae77: 0x6cb94620, - 0x2ae78: 0x6cb94820, 0x2ae79: 0x6cb94a20, 0x2ae7a: 0x6cb94c20, 0x2ae7b: 0x6cb94e20, - 0x2ae7c: 0x6cea3c20, 0x2ae7d: 0x6cea3e20, 0x2ae7e: 0x6d1a0e20, 0x2ae7f: 0x6d1a1020, - // Block 0xaba, offset 0x2ae80 - 0x2ae80: 0x6d1a1220, 0x2ae81: 0x6d1a1420, 0x2ae82: 0x6d1a1620, 0x2ae83: 0x6d1a1820, - 0x2ae84: 0x6d1a1a20, 0x2ae85: 0x6d1a1c20, 0x2ae86: 0x6d1a1e20, 0x2ae87: 0x6d1a2020, - 0x2ae88: 0x6d1a2220, 0x2ae89: 0x6d1a2420, 0x2ae8a: 0x6d489620, 0x2ae8b: 0x6d76a420, - 0x2ae8c: 0x6d76a620, 0x2ae8d: 0x6d76a820, 0x2ae8e: 0x6da03020, 0x2ae8f: 0x6da03220, - 0x2ae90: 0x6dc2b620, 0x2ae91: 0x6de05620, 0x2ae92: 0x6df8a620, 0x2ae93: 0x6c06a020, - 0x2ae94: 0x6c0d3a20, 0x2ae95: 0x6c0d3c20, 0x2ae96: 0x6c0d3e20, 0x2ae97: 0x6c183820, - 0x2ae98: 0x6c183a20, 0x2ae99: 0x6c2b4c20, 0x2ae9a: 0x6c2b4e20, 0x2ae9b: 0x6c2b5020, - 0x2ae9c: 0x6c454e20, 0x2ae9d: 0x6c66a620, 0x2ae9e: 0x6c66a820, 0x2ae9f: 0x6c66aa20, - 0x2aea0: 0x6c8d4220, 0x2aea1: 0x6cb9aa20, 0x2aea2: 0x6d1a7620, 0x2aea3: 0x6da05420, - 0x2aea4: 0x6da05620, 0x2aea5: 0x6da05820, 0x2aea6: 0x6da05a20, 0x2aea7: 0x6dc2c420, - 0x2aea8: 0x6c8d6a20, 0x2aea9: 0x6cb9d420, 0x2aeaa: 0x6ceac220, 0x2aeab: 0x6c035820, - 0x2aeac: 0x6c2b9a20, 0x2aead: 0x6c8d8020, 0x2aeae: 0x6e123e20, 0x2aeaf: 0x6c188c20, - 0x2aeb0: 0x6c188e20, 0x2aeb1: 0x6c8d8620, 0x2aeb2: 0x6cead220, 0x2aeb3: 0x6cead420, - 0x2aeb4: 0x6cead620, 0x2aeb5: 0x6d1aba20, 0x2aeb6: 0x6e3cf020, 0x2aeb7: 0x6c18a420, - 0x2aeb8: 0x6cb9f020, 0x2aeb9: 0x6c036620, 0x2aeba: 0x6c0d8020, 0x2aebb: 0x6c0d8220, - 0x2aebc: 0x6ceae020, 0x2aebd: 0x6c2bd420, 0x2aebe: 0x6c016e20, 0x2aebf: 0x6c017020, - // Block 0xabb, offset 0x2aec0 - 0x2aec0: 0x6c18d020, 0x2aec1: 0x6c2bf220, 0x2aec2: 0x6c0dc820, 0x2aec3: 0x6c0dca20, - 0x2aec4: 0x6c0dcc20, 0x2aec5: 0x6c18dc20, 0x2aec6: 0x6c18de20, 0x2aec7: 0x6c18e020, - 0x2aec8: 0x6c2c0020, 0x2aec9: 0x6c2c0220, 0x2aeca: 0x6c45f620, 0x2aecb: 0x6c673220, - 0x2aecc: 0x6c673420, 0x2aecd: 0x6c673620, 0x2aece: 0x6cba0a20, 0x2aecf: 0x6ceb0220, - 0x2aed0: 0x6d1adc20, 0x2aed1: 0x6d1ade20, 0x2aed2: 0x6d491820, 0x2aed3: 0x6da08620, - 0x2aed4: 0x6e319620, 0x2aed5: 0x6c039020, 0x2aed6: 0x6c677020, 0x2aed7: 0x6c8de220, - 0x2aed8: 0x6c8de420, 0x2aed9: 0x6d493a20, 0x2aeda: 0x6c039c20, 0x2aedb: 0x6c039e20, - 0x2aedc: 0x6c0e0620, 0x2aedd: 0x6c190c20, 0x2aede: 0x6c2c3a20, 0x2aedf: 0x6c463e20, - 0x2aee0: 0x6cba4220, 0x2aee1: 0x6d1b2020, 0x2aee2: 0x6d3d7420, 0x2aee3: 0x6c073020, - 0x2aee4: 0x6c073220, 0x2aee5: 0x6c073420, 0x2aee6: 0x6c0e1c20, 0x2aee7: 0x6c0e1e20, - 0x2aee8: 0x6c0e2020, 0x2aee9: 0x6c192220, 0x2aeea: 0x6c192420, 0x2aeeb: 0x6c192620, - 0x2aeec: 0x6c192820, 0x2aeed: 0x6c192a20, 0x2aeee: 0x6c192c20, 0x2aeef: 0x6c192e20, - 0x2aef0: 0x6c193020, 0x2aef1: 0x6c193220, 0x2aef2: 0x6c193420, 0x2aef3: 0x6c193620, - 0x2aef4: 0x6c193820, 0x2aef5: 0x6c193a20, 0x2aef6: 0x6c193c20, 0x2aef7: 0x6c2c5620, - 0x2aef8: 0x6c2c5820, 0x2aef9: 0x6c2c5a20, 0x2aefa: 0x6c2c5c20, 0x2aefb: 0x6c2c5e20, - 0x2aefc: 0x6c2c6020, 0x2aefd: 0x6c2c6220, 0x2aefe: 0x6c2c6420, 0x2aeff: 0x6c2c6620, - // Block 0xabc, offset 0x2af00 - 0x2af00: 0x6c466820, 0x2af01: 0x6c466a20, 0x2af02: 0x6c466c20, 0x2af03: 0x6c466e20, - 0x2af04: 0x6c467020, 0x2af05: 0x6c467220, 0x2af06: 0x6c467420, 0x2af07: 0x6c467620, - 0x2af08: 0x6c467820, 0x2af09: 0x6c467a20, 0x2af0a: 0x6c467c20, 0x2af0b: 0x6c467e20, - 0x2af0c: 0x6c468020, 0x2af0d: 0x6c468220, 0x2af0e: 0x6c468420, 0x2af0f: 0x6c679a20, - 0x2af10: 0x6c679c20, 0x2af11: 0x6c679e20, 0x2af12: 0x6c67a020, 0x2af13: 0x6c67a220, - 0x2af14: 0x6c67a420, 0x2af15: 0x6c67a620, 0x2af16: 0x6c67a820, 0x2af17: 0x6c67aa20, - 0x2af18: 0x6c67ac20, 0x2af19: 0x6c67ae20, 0x2af1a: 0x6c67b020, 0x2af1b: 0x6c67b220, - 0x2af1c: 0x6c67b420, 0x2af1d: 0x6c67b620, 0x2af1e: 0x6c67b820, 0x2af1f: 0x6c8e1220, - 0x2af20: 0x6c8e1420, 0x2af21: 0x6c8e1620, 0x2af22: 0x6c8e1820, 0x2af23: 0x6c8e1a20, - 0x2af24: 0x6c8e1c20, 0x2af25: 0x6c8e1e20, 0x2af26: 0x6c8e2020, 0x2af27: 0x6c8e2220, - 0x2af28: 0x6c8e2420, 0x2af29: 0x6c8e2620, 0x2af2a: 0x6c8e2820, 0x2af2b: 0x6c8e2a20, - 0x2af2c: 0x6c8e2c20, 0x2af2d: 0x6c8e2e20, 0x2af2e: 0x6c8e3020, 0x2af2f: 0x6c8e3220, - 0x2af30: 0x6c8e3420, 0x2af31: 0x6c8e3620, 0x2af32: 0x6c8e3820, 0x2af33: 0x6c8e3a20, - 0x2af34: 0x6c8e3c20, 0x2af35: 0x6c8e3e20, 0x2af36: 0x6cba5c20, 0x2af37: 0x6cba5e20, - 0x2af38: 0x6cba6020, 0x2af39: 0x6cba6220, 0x2af3a: 0x6cba6420, 0x2af3b: 0x6cba6620, - 0x2af3c: 0x6cba6820, 0x2af3d: 0x6cba6a20, 0x2af3e: 0x6cba6c20, 0x2af3f: 0x6cba6e20, - // Block 0xabd, offset 0x2af40 - 0x2af40: 0x6cba7020, 0x2af41: 0x6cba7220, 0x2af42: 0x6cba7420, 0x2af43: 0x6cba7620, - 0x2af44: 0x6cba7820, 0x2af45: 0x6cba7a20, 0x2af46: 0x6cba7c20, 0x2af47: 0x6cba7e20, - 0x2af48: 0x6cba8020, 0x2af49: 0x6cba8220, 0x2af4a: 0x6cba8420, 0x2af4b: 0x6cba8620, - 0x2af4c: 0x6cba8820, 0x2af4d: 0x6cba8a20, 0x2af4e: 0x6cba8c20, 0x2af4f: 0x6cba8e20, - 0x2af50: 0x6cba9020, 0x2af51: 0x6cba9220, 0x2af52: 0x6ceb4e20, 0x2af53: 0x6ceb5020, - 0x2af54: 0x6ceb5220, 0x2af55: 0x6ceb5420, 0x2af56: 0x6ceb5620, 0x2af57: 0x6ceb5820, - 0x2af58: 0x6ceb5a20, 0x2af59: 0x6ceb5c20, 0x2af5a: 0x6ceb5e20, 0x2af5b: 0x6ceb6020, - 0x2af5c: 0x6ceb6220, 0x2af5d: 0x6ceb6420, 0x2af5e: 0x6ceb6620, 0x2af5f: 0x6ceb6820, - 0x2af60: 0x6ceb6a20, 0x2af61: 0x6ceb6c20, 0x2af62: 0x6d1b3420, 0x2af63: 0x6d1b3620, - 0x2af64: 0x6d1b3820, 0x2af65: 0x6d1b3a20, 0x2af66: 0x6d1b3c20, 0x2af67: 0x6d1b3e20, - 0x2af68: 0x6d1b4020, 0x2af69: 0x6d1b4220, 0x2af6a: 0x6d1b4420, 0x2af6b: 0x6d1b4620, - 0x2af6c: 0x6d1b4820, 0x2af6d: 0x6d1b4a20, 0x2af6e: 0x6d1b4c20, 0x2af6f: 0x6d1b4e20, - 0x2af70: 0x6d1b5020, 0x2af71: 0x6d494e20, 0x2af72: 0x6d495020, 0x2af73: 0x6d495220, - 0x2af74: 0x6d495420, 0x2af75: 0x6d495620, 0x2af76: 0x6d495820, 0x2af77: 0x6d495a20, - 0x2af78: 0x6d495c20, 0x2af79: 0x6d495e20, 0x2af7a: 0x6d496020, 0x2af7b: 0x6d770e20, - 0x2af7c: 0x6d771020, 0x2af7d: 0x6d771220, 0x2af7e: 0x6d771420, 0x2af7f: 0x6d771620, - // Block 0xabe, offset 0x2af80 - 0x2af80: 0x6d771820, 0x2af81: 0x6d771a20, 0x2af82: 0x6d771c20, 0x2af83: 0x6d771e20, - 0x2af84: 0x6d772020, 0x2af85: 0x6da09a20, 0x2af86: 0x6da09c20, 0x2af87: 0x6da09e20, - 0x2af88: 0x6da0a020, 0x2af89: 0x6dc2fa20, 0x2af8a: 0x6dc2fc20, 0x2af8b: 0x6dc2fe20, - 0x2af8c: 0x6dc30020, 0x2af8d: 0x6dc30220, 0x2af8e: 0x6dc30420, 0x2af8f: 0x6dc30620, - 0x2af90: 0x6de07e20, 0x2af91: 0x6de08020, 0x2af92: 0x6de08220, 0x2af93: 0x6df8cc20, - 0x2af94: 0x6df8ce20, 0x2af95: 0x6e0c9220, 0x2af96: 0x6e0c9420, 0x2af97: 0x6e0c9620, - 0x2af98: 0x6e1c2e20, 0x2af99: 0x6e287220, 0x2af9a: 0x6e287420, 0x2af9b: 0x6e384620, - 0x2af9c: 0x6e3cf820, 0x2af9d: 0x6c078820, 0x2af9e: 0x6c06a220, 0x2af9f: 0x6c0e9620, - 0x2afa0: 0x6c2d7e20, 0x2afa1: 0x6c2d8020, 0x2afa2: 0x6c47dc20, 0x2afa3: 0x6c694e20, - 0x2afa4: 0x6d1cf020, 0x2afa5: 0x6df92a20, 0x2afa6: 0x6c07a020, 0x2afa7: 0x6c1a9820, - 0x2afa8: 0x6c1a9a20, 0x2afa9: 0x6c1a9c20, 0x2afaa: 0x6c1a9e20, 0x2afab: 0x6c1aa020, - 0x2afac: 0x6c1aa220, 0x2afad: 0x6c1aa420, 0x2afae: 0x6c1aa620, 0x2afaf: 0x6c1aa820, - 0x2afb0: 0x6c1aaa20, 0x2afb1: 0x6c2daa20, 0x2afb2: 0x6c2dac20, 0x2afb3: 0x6c2dae20, - 0x2afb4: 0x6c2db020, 0x2afb5: 0x6c2db220, 0x2afb6: 0x6c480020, 0x2afb7: 0x6c480220, - 0x2afb8: 0x6c480420, 0x2afb9: 0x6c480620, 0x2afba: 0x6c480820, 0x2afbb: 0x6c480a20, - 0x2afbc: 0x6c480c20, 0x2afbd: 0x6c480e20, 0x2afbe: 0x6c481020, 0x2afbf: 0x6c697e20, - // Block 0xabf, offset 0x2afc0 - 0x2afc0: 0x6c698020, 0x2afc1: 0x6c698220, 0x2afc2: 0x6c698420, 0x2afc3: 0x6c698620, - 0x2afc4: 0x6c698820, 0x2afc5: 0x6c698a20, 0x2afc6: 0x6c698c20, 0x2afc7: 0x6c904620, - 0x2afc8: 0x6c904820, 0x2afc9: 0x6c904a20, 0x2afca: 0x6c904c20, 0x2afcb: 0x6c904e20, - 0x2afcc: 0x6c905020, 0x2afcd: 0x6c905220, 0x2afce: 0x6cbc6420, 0x2afcf: 0x6cbc6620, - 0x2afd0: 0x6cbc6820, 0x2afd1: 0x6cbc6a20, 0x2afd2: 0x6cbc6c20, 0x2afd3: 0x6cbc6e20, - 0x2afd4: 0x6cbc7020, 0x2afd5: 0x6cbc7220, 0x2afd6: 0x6cbc7420, 0x2afd7: 0x6cbc7620, - 0x2afd8: 0x6cbc7820, 0x2afd9: 0x6ced4a20, 0x2afda: 0x6ced4c20, 0x2afdb: 0x6ced4e20, - 0x2afdc: 0x6ced5020, 0x2afdd: 0x6ced5220, 0x2afde: 0x6ced5420, 0x2afdf: 0x6ced5620, - 0x2afe0: 0x6d1d1620, 0x2afe1: 0x6d1d1820, 0x2afe2: 0x6d1d1a20, 0x2afe3: 0x6d1d1c20, - 0x2afe4: 0x6d1d1e20, 0x2afe5: 0x6d1d2020, 0x2afe6: 0x6d1d2220, 0x2afe7: 0x6d4ac820, - 0x2afe8: 0x6d4aca20, 0x2afe9: 0x6d4acc20, 0x2afea: 0x6d4ace20, 0x2afeb: 0x6d4ad020, - 0x2afec: 0x6d4ad220, 0x2afed: 0x6d4ad420, 0x2afee: 0x6d4ad620, 0x2afef: 0x6d4ad820, - 0x2aff0: 0x6d786620, 0x2aff1: 0x6d786820, 0x2aff2: 0x6d786a20, 0x2aff3: 0x6d786c20, - 0x2aff4: 0x6d786e20, 0x2aff5: 0x6d787020, 0x2aff6: 0x6d787220, 0x2aff7: 0x6da18820, - 0x2aff8: 0x6da18a20, 0x2aff9: 0x6da18c20, 0x2affa: 0x6da18e20, 0x2affb: 0x6dc3e020, - 0x2affc: 0x6dc3e220, 0x2affd: 0x6dc3e420, 0x2affe: 0x6de10220, 0x2afff: 0x6de10420, - // Block 0xac0, offset 0x2b000 - 0x2b000: 0x6df93220, 0x2b001: 0x6e31c220, 0x2b002: 0x6e385e20, 0x2b003: 0x6cbd8620, - 0x2b004: 0x6d4ba020, 0x2b005: 0x6c48f020, 0x2b006: 0x6c48f420, 0x2b007: 0x6c48f620, - 0x2b008: 0x6c07ce20, 0x2b009: 0x6c2e8c20, 0x2b00a: 0x6cbd9820, 0x2b00b: 0x6d1e0c20, - 0x2b00c: 0x6d1e0e20, 0x2b00d: 0x6dc44620, 0x2b00e: 0x6c07dc20, 0x2b00f: 0x6c0f2c20, - 0x2b010: 0x6c0f2e20, 0x2b011: 0x6c0f3020, 0x2b012: 0x6c1b8a20, 0x2b013: 0x6c1b8c20, - 0x2b014: 0x6c2e9a20, 0x2b015: 0x6c2e9c20, 0x2b016: 0x6c2e9e20, 0x2b017: 0x6c2ea020, - 0x2b018: 0x6c2ea220, 0x2b019: 0x6c2ea420, 0x2b01a: 0x6c490220, 0x2b01b: 0x6c490420, - 0x2b01c: 0x6c919820, 0x2b01d: 0x6c919a20, 0x2b01e: 0x6c919c20, 0x2b01f: 0x6cbdb620, - 0x2b020: 0x6cee7620, 0x2b021: 0x6d791c20, 0x2b022: 0x6c07fc20, 0x2b023: 0x6c0f5620, - 0x2b024: 0x6c0f5820, 0x2b025: 0x6c0f5a20, 0x2b026: 0x6c0f5c20, 0x2b027: 0x6c0f5e20, - 0x2b028: 0x6c0f6020, 0x2b029: 0x6c1bc420, 0x2b02a: 0x6c1bc620, 0x2b02b: 0x6c1bc820, - 0x2b02c: 0x6c1bca20, 0x2b02d: 0x6c1bcc20, 0x2b02e: 0x6c1bce20, 0x2b02f: 0x6c1bd020, - 0x2b030: 0x6c2ef420, 0x2b031: 0x6c2ef620, 0x2b032: 0x6c2ef820, 0x2b033: 0x6c2efa20, - 0x2b034: 0x6c2efc20, 0x2b035: 0x6c2efe20, 0x2b036: 0x6c2f0020, 0x2b037: 0x6c2f0220, - 0x2b038: 0x6c2f0420, 0x2b039: 0x6c2f0620, 0x2b03a: 0x6c2f0820, 0x2b03b: 0x6c2f0a20, - 0x2b03c: 0x6c2f0c20, 0x2b03d: 0x6c2f0e20, 0x2b03e: 0x6c2f1020, 0x2b03f: 0x6c2f1220, - // Block 0xac1, offset 0x2b040 - 0x2b040: 0x6c2f1420, 0x2b041: 0x6c2f1620, 0x2b042: 0x6c493e20, 0x2b043: 0x6c494020, - 0x2b044: 0x6c494220, 0x2b045: 0x6c494420, 0x2b046: 0x6c494620, 0x2b047: 0x6c494820, - 0x2b048: 0x6c494a20, 0x2b049: 0x6c494c20, 0x2b04a: 0x6c494e20, 0x2b04b: 0x6c495020, - 0x2b04c: 0x6c495220, 0x2b04d: 0x6c6aea20, 0x2b04e: 0x6c6aec20, 0x2b04f: 0x6c6aee20, - 0x2b050: 0x6c6af020, 0x2b051: 0x6c6af220, 0x2b052: 0x6c6af420, 0x2b053: 0x6c6af620, - 0x2b054: 0x6c6af820, 0x2b055: 0x6c6afa20, 0x2b056: 0x6c6afc20, 0x2b057: 0x6c6afe20, - 0x2b058: 0x6c6b0020, 0x2b059: 0x6c6b0220, 0x2b05a: 0x6c6b0420, 0x2b05b: 0x6c6b0620, - 0x2b05c: 0x6c6b0820, 0x2b05d: 0x6c6b0a20, 0x2b05e: 0x6c6b0c20, 0x2b05f: 0x6c6b0e20, - 0x2b060: 0x6c1bd220, 0x2b061: 0x6c6b1020, 0x2b062: 0x6c6b1220, 0x2b063: 0x6c6b1420, - 0x2b064: 0x6c6b1620, 0x2b065: 0x6c91da20, 0x2b066: 0x6c91dc20, 0x2b067: 0x6c91de20, - 0x2b068: 0x6c91e020, 0x2b069: 0x6c91e220, 0x2b06a: 0x6c91e420, 0x2b06b: 0x6c91e620, - 0x2b06c: 0x6c91e820, 0x2b06d: 0x6c91ea20, 0x2b06e: 0x6cbdf220, 0x2b06f: 0x6cbdf420, - 0x2b070: 0x6cbdf620, 0x2b071: 0x6cbdf820, 0x2b072: 0x6cbdfa20, 0x2b073: 0x6cbdfc20, - 0x2b074: 0x6cbdfe20, 0x2b075: 0x6cbe0020, 0x2b076: 0x6cbe0220, 0x2b077: 0x6cbe0420, - 0x2b078: 0x6cbe0620, 0x2b079: 0x6cbe0820, 0x2b07a: 0x6cbe0a20, 0x2b07b: 0x6cbe0c20, - 0x2b07c: 0x6cbe0e20, 0x2b07d: 0x6cbe1020, 0x2b07e: 0x6cbe1220, 0x2b07f: 0x6cbe1420, - // Block 0xac2, offset 0x2b080 - 0x2b080: 0x6cbe1620, 0x2b081: 0x6cbe1820, 0x2b082: 0x6cbe1a20, 0x2b083: 0x6cbe1c20, - 0x2b084: 0x6cbe1e20, 0x2b085: 0x6ceea620, 0x2b086: 0x6ceea820, 0x2b087: 0x6ceeaa20, - 0x2b088: 0x6ceeac20, 0x2b089: 0x6ceeae20, 0x2b08a: 0x6ceeb020, 0x2b08b: 0x6ceeb220, - 0x2b08c: 0x6ceeb420, 0x2b08d: 0x6ceeb620, 0x2b08e: 0x6ceeb820, 0x2b08f: 0x6ceeba20, - 0x2b090: 0x6ceebc20, 0x2b091: 0x6ceebe20, 0x2b092: 0x6ceec020, 0x2b093: 0x6ceec220, - 0x2b094: 0x6ceec420, 0x2b095: 0x6d1e5220, 0x2b096: 0x6d1e5420, 0x2b097: 0x6d1e5620, - 0x2b098: 0x6d1e5820, 0x2b099: 0x6d1e5a20, 0x2b09a: 0x6d1e5c20, 0x2b09b: 0x6d1e5e20, - 0x2b09c: 0x6d1e6020, 0x2b09d: 0x6d1e6220, 0x2b09e: 0x6d1e6420, 0x2b09f: 0x6d1e6620, - 0x2b0a0: 0x6d1e6820, 0x2b0a1: 0x6d1e6a20, 0x2b0a2: 0x6d1e6c20, 0x2b0a3: 0x6d4bde20, - 0x2b0a4: 0x6d4be020, 0x2b0a5: 0x6d4be220, 0x2b0a6: 0x6d4be420, 0x2b0a7: 0x6d4be620, - 0x2b0a8: 0x6d4be820, 0x2b0a9: 0x6d793820, 0x2b0aa: 0x6d793a20, 0x2b0ab: 0x6d793c20, - 0x2b0ac: 0x6d793e20, 0x2b0ad: 0x6d794020, 0x2b0ae: 0x6da22220, 0x2b0af: 0x6da22420, - 0x2b0b0: 0x6dc45420, 0x2b0b1: 0x6dc45620, 0x2b0b2: 0x6de15a20, 0x2b0b3: 0x6de15c20, - 0x2b0b4: 0x6de15e20, 0x2b0b5: 0x6de16020, 0x2b0b6: 0x6df95c20, 0x2b0b7: 0x6df95e20, - 0x2b0b8: 0x6df96020, 0x2b0b9: 0x6e0d2820, 0x2b0ba: 0x6e1c9820, 0x2b0bb: 0x6e3d1620, - 0x2b0bc: 0x6e3d1820, 0x2b0bd: 0x6c0fa620, 0x2b0be: 0x6c1c6220, 0x2b0bf: 0x6c1c6420, - // Block 0xac3, offset 0x2b0c0 - 0x2b0c0: 0x6c2fc820, 0x2b0c1: 0x6c4a1c20, 0x2b0c2: 0x6c6bdc20, 0x2b0c3: 0x6c6bde20, - 0x2b0c4: 0x6cbf4220, 0x2b0c5: 0x6cef7820, 0x2b0c6: 0x6d4cb620, 0x2b0c7: 0x6d79e020, - 0x2b0c8: 0x6e386820, 0x2b0c9: 0x6c03f620, 0x2b0ca: 0x6c081e20, 0x2b0cb: 0x6c082020, - 0x2b0cc: 0x6c0fb820, 0x2b0cd: 0x6c0fba20, 0x2b0ce: 0x6c1c8620, 0x2b0cf: 0x6c1c8820, - 0x2b0d0: 0x6c1c8a20, 0x2b0d1: 0x6c1c8c20, 0x2b0d2: 0x6c2ffa20, 0x2b0d3: 0x6c4a4020, - 0x2b0d4: 0x6c4a4220, 0x2b0d5: 0x6c4a4420, 0x2b0d6: 0x6c4a4620, 0x2b0d7: 0x6c6bf620, - 0x2b0d8: 0x6c6bf820, 0x2b0d9: 0x6c6bfa20, 0x2b0da: 0x6c6bfc20, 0x2b0db: 0x6c932220, - 0x2b0dc: 0x6c932420, 0x2b0dd: 0x6c932620, 0x2b0de: 0x6c932820, 0x2b0df: 0x6c932a20, - 0x2b0e0: 0x6c932c20, 0x2b0e1: 0x6c932e20, 0x2b0e2: 0x6cbf6420, 0x2b0e3: 0x6cbf6620, - 0x2b0e4: 0x6cef9a20, 0x2b0e5: 0x6cef9c20, 0x2b0e6: 0x6cef9e20, 0x2b0e7: 0x6cefa020, - 0x2b0e8: 0x6cefa220, 0x2b0e9: 0x6d1f3c20, 0x2b0ea: 0x6d1f3e20, 0x2b0eb: 0x6d1f4020, - 0x2b0ec: 0x6d1f4220, 0x2b0ed: 0x6d4cc820, 0x2b0ee: 0x6d4cca20, 0x2b0ef: 0x6d4ccc20, - 0x2b0f0: 0x6dc49420, 0x2b0f1: 0x6e0d4620, 0x2b0f2: 0x6e3d1a20, 0x2b0f3: 0x6c083020, - 0x2b0f4: 0x6c1cbc20, 0x2b0f5: 0x6c304420, 0x2b0f6: 0x6c6c7220, 0x2b0f7: 0x6cbfd420, - 0x2b0f8: 0x6c6c7c20, 0x2b0f9: 0x6cbfea20, 0x2b0fa: 0x6d1fba20, 0x2b0fb: 0x6d4d3820, - 0x2b0fc: 0x6c0ffa20, 0x2b0fd: 0x6c1cd620, 0x2b0fe: 0x6c306a20, 0x2b0ff: 0x6c306c20, - // Block 0xac4, offset 0x2b100 - 0x2b100: 0x6c4aba20, 0x2b101: 0x6c4abc20, 0x2b102: 0x6c6c9420, 0x2b103: 0x6c93b820, - 0x2b104: 0x6c93ba20, 0x2b105: 0x6c93bc20, 0x2b106: 0x6c93be20, 0x2b107: 0x6cc00220, - 0x2b108: 0x6cc00420, 0x2b109: 0x6cf01220, 0x2b10a: 0x6cf01420, 0x2b10b: 0x6c085020, - 0x2b10c: 0x6c100a20, 0x2b10d: 0x6c100c20, 0x2b10e: 0x6c1cf820, 0x2b10f: 0x6c308020, - 0x2b110: 0x6c308220, 0x2b111: 0x6c308420, 0x2b112: 0x6c4acc20, 0x2b113: 0x6c4ace20, - 0x2b114: 0x6c4ad020, 0x2b115: 0x6c4ad220, 0x2b116: 0x6c4ad420, 0x2b117: 0x6c6cac20, - 0x2b118: 0x6c93cc20, 0x2b119: 0x6c93ce20, 0x2b11a: 0x6cc02020, 0x2b11b: 0x6cc02220, - 0x2b11c: 0x6d1fda20, 0x2b11d: 0x6d1fdc20, 0x2b11e: 0x6d1fde20, 0x2b11f: 0x6d4d5e20, - 0x2b120: 0x6d4d6020, 0x2b121: 0x6de1be20, 0x2b122: 0x6c040c20, 0x2b123: 0x6c1d1e20, - 0x2b124: 0x6c086420, 0x2b125: 0x6c086620, 0x2b126: 0x6c086820, 0x2b127: 0x6c086a20, - 0x2b128: 0x6c103620, 0x2b129: 0x6c103820, 0x2b12a: 0x6c103a20, 0x2b12b: 0x6c103c20, - 0x2b12c: 0x6c103e20, 0x2b12d: 0x6c104020, 0x2b12e: 0x6c104220, 0x2b12f: 0x6c104420, - 0x2b130: 0x6c1d2c20, 0x2b131: 0x6c1d2e20, 0x2b132: 0x6c1d3020, 0x2b133: 0x6c1d3220, - 0x2b134: 0x6c1d3420, 0x2b135: 0x6c1d3620, 0x2b136: 0x6c1d3820, 0x2b137: 0x6c1d2020, - 0x2b138: 0x6c1d3a20, 0x2b139: 0x6c30b820, 0x2b13a: 0x6c30ba20, 0x2b13b: 0x6c30bc20, - 0x2b13c: 0x6c30be20, 0x2b13d: 0x6c30c020, 0x2b13e: 0x6c30c220, 0x2b13f: 0x6c30c420, - // Block 0xac5, offset 0x2b140 - 0x2b140: 0x6c30c620, 0x2b141: 0x6c30c820, 0x2b142: 0x6c30ca20, 0x2b143: 0x6c30cc20, - 0x2b144: 0x6c4b2020, 0x2b145: 0x6c4b2220, 0x2b146: 0x6c4b2420, 0x2b147: 0x6c6d0020, - 0x2b148: 0x6c6d0220, 0x2b149: 0x6c6d0420, 0x2b14a: 0x6c6d0620, 0x2b14b: 0x6c6d0820, - 0x2b14c: 0x6c6d0a20, 0x2b14d: 0x6c6d0c20, 0x2b14e: 0x6c6d0e20, 0x2b14f: 0x6c6d1020, - 0x2b150: 0x6c6d1220, 0x2b151: 0x6c6d1420, 0x2b152: 0x6c6d1620, 0x2b153: 0x6c6d1820, - 0x2b154: 0x6c6d1a20, 0x2b155: 0x6c6d1c20, 0x2b156: 0x6c6d1e20, 0x2b157: 0x6c941620, - 0x2b158: 0x6c941820, 0x2b159: 0x6c941a20, 0x2b15a: 0x6c941c20, 0x2b15b: 0x6c941e20, - 0x2b15c: 0x6c942020, 0x2b15d: 0x6c942220, 0x2b15e: 0x6c942420, 0x2b15f: 0x6c942620, - 0x2b160: 0x6c942820, 0x2b161: 0x6c942a20, 0x2b162: 0x6c942c20, 0x2b163: 0x6c942e20, - 0x2b164: 0x6c943020, 0x2b165: 0x6c943220, 0x2b166: 0x6cc07020, 0x2b167: 0x6cc07220, - 0x2b168: 0x6cc07420, 0x2b169: 0x6cc07620, 0x2b16a: 0x6cc07820, 0x2b16b: 0x6cc07a20, - 0x2b16c: 0x6cc07c20, 0x2b16d: 0x6cc07e20, 0x2b16e: 0x6cc08020, 0x2b16f: 0x6cc08220, - 0x2b170: 0x6cf06820, 0x2b171: 0x6cf06a20, 0x2b172: 0x6cf06c20, 0x2b173: 0x6cf06e20, - 0x2b174: 0x6cf07020, 0x2b175: 0x6cf07220, 0x2b176: 0x6cf07420, 0x2b177: 0x6cf07620, - 0x2b178: 0x6cf07820, 0x2b179: 0x6d200020, 0x2b17a: 0x6d200220, 0x2b17b: 0x6d200420, - 0x2b17c: 0x6d200620, 0x2b17d: 0x6d200820, 0x2b17e: 0x6d200a20, 0x2b17f: 0x6d200c20, - // Block 0xac6, offset 0x2b180 - 0x2b180: 0x6d200e20, 0x2b181: 0x6d201020, 0x2b182: 0x6d201220, 0x2b183: 0x6d201420, - 0x2b184: 0x6d201620, 0x2b185: 0x6d4d9420, 0x2b186: 0x6d4d9620, 0x2b187: 0x6d4d9820, - 0x2b188: 0x6d4d9a20, 0x2b189: 0x6d4d9c20, 0x2b18a: 0x6d4d9e20, 0x2b18b: 0x6d4da020, - 0x2b18c: 0x6d4da220, 0x2b18d: 0x6d4da420, 0x2b18e: 0x6d4da620, 0x2b18f: 0x6d4da820, - 0x2b190: 0x6d4daa20, 0x2b191: 0x6d7a6020, 0x2b192: 0x6d7a6220, 0x2b193: 0x6d7a6420, - 0x2b194: 0x6d7a6620, 0x2b195: 0x6d7a6820, 0x2b196: 0x6d7a6a20, 0x2b197: 0x6d7a6c20, - 0x2b198: 0x6da2e220, 0x2b199: 0x6da2e420, 0x2b19a: 0x6da2e620, 0x2b19b: 0x6da2e820, - 0x2b19c: 0x6da2ea20, 0x2b19d: 0x6dc4d020, 0x2b19e: 0x6dc4d220, 0x2b19f: 0x6dc4d420, - 0x2b1a0: 0x6de1d020, 0x2b1a1: 0x6de1d220, 0x2b1a2: 0x6de1d420, 0x2b1a3: 0x6de1d620, - 0x2b1a4: 0x6df9b020, 0x2b1a5: 0x6e0d7020, 0x2b1a6: 0x6e0d7220, 0x2b1a7: 0x6e1cd620, - 0x2b1a8: 0x6e429020, 0x2b1a9: 0x6c109220, 0x2b1aa: 0x6c041c20, 0x2b1ab: 0x6c6de820, - 0x2b1ac: 0x6c6dea20, 0x2b1ad: 0x6cc16e20, 0x2b1ae: 0x6d4e4c20, 0x2b1af: 0x6c08a020, - 0x2b1b0: 0x6c318820, 0x2b1b1: 0x6c955820, 0x2b1b2: 0x6c08a620, 0x2b1b3: 0x6c08a820, - 0x2b1b4: 0x6c10ae20, 0x2b1b5: 0x6c10b020, 0x2b1b6: 0x6c10b220, 0x2b1b7: 0x6c1dea20, - 0x2b1b8: 0x6c1dec20, 0x2b1b9: 0x6c1dee20, 0x2b1ba: 0x6c1df020, 0x2b1bb: 0x6c1df220, - 0x2b1bc: 0x6c1df420, 0x2b1bd: 0x6c319220, 0x2b1be: 0x6c319420, 0x2b1bf: 0x6c319620, - // Block 0xac7, offset 0x2b1c0 - 0x2b1c0: 0x6c319820, 0x2b1c1: 0x6c4bf020, 0x2b1c2: 0x6c4bf220, 0x2b1c3: 0x6c4bf420, - 0x2b1c4: 0x6c4bf620, 0x2b1c5: 0x6c4bf820, 0x2b1c6: 0x6c4bfa20, 0x2b1c7: 0x6c6dfc20, - 0x2b1c8: 0x6c6dfe20, 0x2b1c9: 0x6c956420, 0x2b1ca: 0x6c956620, 0x2b1cb: 0x6c956820, - 0x2b1cc: 0x6c956a20, 0x2b1cd: 0x6c956c20, 0x2b1ce: 0x6c956e20, 0x2b1cf: 0x6cc18820, - 0x2b1d0: 0x6cc18a20, 0x2b1d1: 0x6cc18c20, 0x2b1d2: 0x6cc18e20, 0x2b1d3: 0x6cc19020, - 0x2b1d4: 0x6cc19220, 0x2b1d5: 0x6cc19420, 0x2b1d6: 0x6cc19620, 0x2b1d7: 0x6cf11a20, - 0x2b1d8: 0x6cf11c20, 0x2b1d9: 0x6cf11e20, 0x2b1da: 0x6cf12020, 0x2b1db: 0x6cf12220, - 0x2b1dc: 0x6d20c020, 0x2b1dd: 0x6d20c220, 0x2b1de: 0x6d20c420, 0x2b1df: 0x6d20c620, - 0x2b1e0: 0x6d4e5a20, 0x2b1e1: 0x6d4e5c20, 0x2b1e2: 0x6d7ae820, 0x2b1e3: 0x6d7aea20, - 0x2b1e4: 0x6d7aec20, 0x2b1e5: 0x6da35c20, 0x2b1e6: 0x6da35e20, 0x2b1e7: 0x6df9dc20, - 0x2b1e8: 0x6df9de20, 0x2b1e9: 0x6e1d0420, 0x2b1ea: 0x6e1d0620, 0x2b1eb: 0x6cc1fc20, - 0x2b1ec: 0x6cc1fe20, 0x2b1ed: 0x6d210c20, 0x2b1ee: 0x6d7b2420, 0x2b1ef: 0x6c10e420, - 0x2b1f0: 0x6c10e620, 0x2b1f1: 0x6c10e820, 0x2b1f2: 0x6c1e4220, 0x2b1f3: 0x6c1e4420, - 0x2b1f4: 0x6c31f220, 0x2b1f5: 0x6c31f420, 0x2b1f6: 0x6c31f620, 0x2b1f7: 0x6c31f820, - 0x2b1f8: 0x6c31fa20, 0x2b1f9: 0x6c31fc20, 0x2b1fa: 0x6c31fe20, 0x2b1fb: 0x6c320020, - 0x2b1fc: 0x6c4c6820, 0x2b1fd: 0x6c4c6a20, 0x2b1fe: 0x6c4c6c20, 0x2b1ff: 0x6c4c6e20, - // Block 0xac8, offset 0x2b200 - 0x2b200: 0x6c4c7020, 0x2b201: 0x6c4c7220, 0x2b202: 0x6c4c7420, 0x2b203: 0x6c6e6020, - 0x2b204: 0x6c6e6220, 0x2b205: 0x6c6e6420, 0x2b206: 0x6c6e6620, 0x2b207: 0x6c6e6820, - 0x2b208: 0x6c95d820, 0x2b209: 0x6c95da20, 0x2b20a: 0x6c95dc20, 0x2b20b: 0x6c95de20, - 0x2b20c: 0x6c95e020, 0x2b20d: 0x6cc20420, 0x2b20e: 0x6cc20620, 0x2b20f: 0x6cc20820, - 0x2b210: 0x6cc20a20, 0x2b211: 0x6cf16a20, 0x2b212: 0x6d211620, 0x2b213: 0x6d211820, - 0x2b214: 0x6d211a20, 0x2b215: 0x6d211c20, 0x2b216: 0x6d4eb620, 0x2b217: 0x6d4eb820, - 0x2b218: 0x6d4eba20, 0x2b219: 0x6d7b2620, 0x2b21a: 0x6d7b2820, 0x2b21b: 0x6d7b2a20, - 0x2b21c: 0x6d7b2c20, 0x2b21d: 0x6de23020, 0x2b21e: 0x6df9ec20, 0x2b21f: 0x6c110820, - 0x2b220: 0x6c324420, 0x2b221: 0x6d217420, 0x2b222: 0x6d4f0020, 0x2b223: 0x6d7b5c20, - 0x2b224: 0x6c1ea620, 0x2b225: 0x6c4ce020, 0x2b226: 0x6cf1b820, 0x2b227: 0x6c044820, - 0x2b228: 0x6c112020, 0x2b229: 0x6c112220, 0x2b22a: 0x6c112420, 0x2b22b: 0x6c112620, - 0x2b22c: 0x6c1eb220, 0x2b22d: 0x6c1eb420, 0x2b22e: 0x6c326020, 0x2b22f: 0x6c326220, - 0x2b230: 0x6c326420, 0x2b231: 0x6c326620, 0x2b232: 0x6c4cec20, 0x2b233: 0x6c4cee20, - 0x2b234: 0x6c4cf020, 0x2b235: 0x6c4cf220, 0x2b236: 0x6c4cf420, 0x2b237: 0x6c4cf620, - 0x2b238: 0x6c6ed820, 0x2b239: 0x6c6eda20, 0x2b23a: 0x6c966820, 0x2b23b: 0x6c966a20, - 0x2b23c: 0x6c966c20, 0x2b23d: 0x6cc27e20, 0x2b23e: 0x6cc28020, 0x2b23f: 0x6cc28220, - // Block 0xac9, offset 0x2b240 - 0x2b240: 0x6cf1c220, 0x2b241: 0x6cf1c420, 0x2b242: 0x6cf1c620, 0x2b243: 0x6d218420, - 0x2b244: 0x6d4f0820, 0x2b245: 0x6d4f0a20, 0x2b246: 0x6e0dac20, 0x2b247: 0x6c329a20, - 0x2b248: 0x6d7b7820, 0x2b249: 0x6c115620, 0x2b24a: 0x6c1ede20, 0x2b24b: 0x6c32a420, - 0x2b24c: 0x6c32a620, 0x2b24d: 0x6c32a820, 0x2b24e: 0x6c96aa20, 0x2b24f: 0x6cc2ae20, - 0x2b250: 0x6cc2b020, 0x2b251: 0x6d21b220, 0x2b252: 0x6d4f2620, 0x2b253: 0x6d7b8220, - 0x2b254: 0x6c090020, 0x2b255: 0x6c116020, 0x2b256: 0x6c1eea20, 0x2b257: 0x6c1eec20, - 0x2b258: 0x6c32b420, 0x2b259: 0x6c32b620, 0x2b25a: 0x6c4d3c20, 0x2b25b: 0x6c4d3e20, - 0x2b25c: 0x6c4d4020, 0x2b25d: 0x6c4d4220, 0x2b25e: 0x6c4d4420, 0x2b25f: 0x6c4d4620, - 0x2b260: 0x6c4d4820, 0x2b261: 0x6c4d4a20, 0x2b262: 0x6c6f1220, 0x2b263: 0x6c6f1420, - 0x2b264: 0x6c96c620, 0x2b265: 0x6c96c820, 0x2b266: 0x6c96ca20, 0x2b267: 0x6c96cc20, - 0x2b268: 0x6c96ce20, 0x2b269: 0x6c96d020, 0x2b26a: 0x6cc2c020, 0x2b26b: 0x6cc2c220, - 0x2b26c: 0x6cc2c420, 0x2b26d: 0x6cc2c620, 0x2b26e: 0x6cc2c820, 0x2b26f: 0x6cf1f620, - 0x2b270: 0x6d21bc20, 0x2b271: 0x6d21be20, 0x2b272: 0x6d21c020, 0x2b273: 0x6d4f3620, - 0x2b274: 0x6d4f3820, 0x2b275: 0x6d7b8c20, 0x2b276: 0x6d7b8e20, 0x2b277: 0x6da3c020, - 0x2b278: 0x6de27220, 0x2b279: 0x6dfa1a20, 0x2b27a: 0x6c090620, 0x2b27b: 0x6c116e20, - 0x2b27c: 0x6c117220, 0x2b27d: 0x6c1f1c20, 0x2b27e: 0x6c117420, 0x2b27f: 0x6c117620, - // Block 0xaca, offset 0x2b280 - 0x2b280: 0x6c1f1e20, 0x2b281: 0x6c32e020, 0x2b282: 0x6c32e220, 0x2b283: 0x6c1f3220, - 0x2b284: 0x6c1f3420, 0x2b285: 0x6c32e420, 0x2b286: 0x6c1f3620, 0x2b287: 0x6c1f3820, - 0x2b288: 0x6c1f3a20, 0x2b289: 0x6c1f3c20, 0x2b28a: 0x6c1f3e20, 0x2b28b: 0x6c1f4020, - 0x2b28c: 0x6c32fc20, 0x2b28d: 0x6c4d7c20, 0x2b28e: 0x6c4d7e20, 0x2b28f: 0x6c32fe20, - 0x2b290: 0x6c330020, 0x2b291: 0x6c330220, 0x2b292: 0x6c330420, 0x2b293: 0x6c330620, - 0x2b294: 0x6c330820, 0x2b295: 0x6c330a20, 0x2b296: 0x6c330c20, 0x2b297: 0x6c4d8020, - 0x2b298: 0x6c330e20, 0x2b299: 0x6c4d8220, 0x2b29a: 0x6c4da220, 0x2b29b: 0x6c4da420, - 0x2b29c: 0x6c4da620, 0x2b29d: 0x6c4da820, 0x2b29e: 0x6c4daa20, 0x2b29f: 0x6c6f5620, - 0x2b2a0: 0x6c6f5820, 0x2b2a1: 0x6c4dac20, 0x2b2a2: 0x6c4dae20, 0x2b2a3: 0x6c6f5a20, - 0x2b2a4: 0x6c4db020, 0x2b2a5: 0x6c4db220, 0x2b2a6: 0x6c4db420, 0x2b2a7: 0x6c4db620, - 0x2b2a8: 0x6c4db820, 0x2b2a9: 0x6c6f5c20, 0x2b2aa: 0x6c6f5e20, 0x2b2ab: 0x6c6f6020, - 0x2b2ac: 0x6c4dba20, 0x2b2ad: 0x6c4dbc20, 0x2b2ae: 0x6c972e20, 0x2b2af: 0x6c6f8a20, - 0x2b2b0: 0x6c973020, 0x2b2b1: 0x6c6f8c20, 0x2b2b2: 0x6c973220, 0x2b2b3: 0x6c6f8e20, - 0x2b2b4: 0x6c6f9020, 0x2b2b5: 0x6c973420, 0x2b2b6: 0x6c6f9220, 0x2b2b7: 0x6c6f9420, - 0x2b2b8: 0x6c6f9620, 0x2b2b9: 0x6c6f9820, 0x2b2ba: 0x6c4dbe20, 0x2b2bb: 0x6c973620, - 0x2b2bc: 0x6c6f9a20, 0x2b2bd: 0x6c6f9c20, 0x2b2be: 0x6c975620, 0x2b2bf: 0x6c975820, - // Block 0xacb, offset 0x2b2c0 - 0x2b2c0: 0x6c975a20, 0x2b2c1: 0x6cc30420, 0x2b2c2: 0x6c975c20, 0x2b2c3: 0x6c975e20, - 0x2b2c4: 0x6c976020, 0x2b2c5: 0x6c976220, 0x2b2c6: 0x6c976420, 0x2b2c7: 0x6c976620, - 0x2b2c8: 0x6cc30620, 0x2b2c9: 0x6c976820, 0x2b2ca: 0x6c976a20, 0x2b2cb: 0x6cc30820, - 0x2b2cc: 0x6c976c20, 0x2b2cd: 0x6c976e20, 0x2b2ce: 0x6cc30a20, 0x2b2cf: 0x6c977020, - 0x2b2d0: 0x6cc30c20, 0x2b2d1: 0x6cc30e20, 0x2b2d2: 0x6c977220, 0x2b2d3: 0x6c977420, - 0x2b2d4: 0x6c977620, 0x2b2d5: 0x6cc31020, 0x2b2d6: 0x6cc31220, 0x2b2d7: 0x6c977820, - 0x2b2d8: 0x6c977a20, 0x2b2d9: 0x6c977c20, 0x2b2da: 0x6cc33c20, 0x2b2db: 0x6cc33e20, - 0x2b2dc: 0x6cc34020, 0x2b2dd: 0x6cc34220, 0x2b2de: 0x6cc34420, 0x2b2df: 0x6cc34620, - 0x2b2e0: 0x6cc34820, 0x2b2e1: 0x6cc34a20, 0x2b2e2: 0x6cc34c20, 0x2b2e3: 0x6cf24220, - 0x2b2e4: 0x6cf24420, 0x2b2e5: 0x6cc34e20, 0x2b2e6: 0x6cf24620, 0x2b2e7: 0x6cc35020, - 0x2b2e8: 0x6cf24820, 0x2b2e9: 0x6cc35220, 0x2b2ea: 0x6cc35420, 0x2b2eb: 0x6cc35620, - 0x2b2ec: 0x6cf26620, 0x2b2ed: 0x6cf26820, 0x2b2ee: 0x6cf26a20, 0x2b2ef: 0x6d220420, - 0x2b2f0: 0x6cf26c20, 0x2b2f1: 0x6cf26e20, 0x2b2f2: 0x6d220620, 0x2b2f3: 0x6cf27020, - 0x2b2f4: 0x6cf27220, 0x2b2f5: 0x6cf27420, 0x2b2f6: 0x6d220820, 0x2b2f7: 0x6d220a20, - 0x2b2f8: 0x6d220c20, 0x2b2f9: 0x6d220e20, 0x2b2fa: 0x6cf27620, 0x2b2fb: 0x6d221020, - 0x2b2fc: 0x6d222a20, 0x2b2fd: 0x6d222c20, 0x2b2fe: 0x6d222e20, 0x2b2ff: 0x6d4f6420, - // Block 0xacc, offset 0x2b300 - 0x2b300: 0x6d223020, 0x2b301: 0x6d4f6620, 0x2b302: 0x6d4f6820, 0x2b303: 0x6d223220, - 0x2b304: 0x6d4f6a20, 0x2b305: 0x6d223420, 0x2b306: 0x6d223620, 0x2b307: 0x6d223820, - 0x2b308: 0x6d223a20, 0x2b309: 0x6d4f9820, 0x2b30a: 0x6d4f9a20, 0x2b30b: 0x6d4f9c20, - 0x2b30c: 0x6d7bb220, 0x2b30d: 0x6d4f9e20, 0x2b30e: 0x6d4fa020, 0x2b30f: 0x6d4fa220, - 0x2b310: 0x6d4fa420, 0x2b311: 0x6d4fa620, 0x2b312: 0x6d4fa820, 0x2b313: 0x6d4faa20, - 0x2b314: 0x6d7bb420, 0x2b315: 0x6d4fac20, 0x2b316: 0x6d4fae20, 0x2b317: 0x6d7bce20, - 0x2b318: 0x6da3d420, 0x2b319: 0x6d7bd020, 0x2b31a: 0x6dc57420, 0x2b31b: 0x6dc57620, - 0x2b31c: 0x6da3e620, 0x2b31d: 0x6dc57820, 0x2b31e: 0x6dc57a20, 0x2b31f: 0x6dc57c20, - 0x2b320: 0x6da3e820, 0x2b321: 0x6dc58820, 0x2b322: 0x6dc58a20, 0x2b323: 0x6dfa2a20, - 0x2b324: 0x6dfa2c20, 0x2b325: 0x6de28420, 0x2b326: 0x6de28620, 0x2b327: 0x6de28820, - 0x2b328: 0x6dfa3020, 0x2b329: 0x6dfa3220, 0x2b32a: 0x6dfa3420, 0x2b32b: 0x6e1d3420, - 0x2b32c: 0x6e1d3620, 0x2b32d: 0x6e403c20, 0x2b32e: 0x6c1ffc20, 0x2b32f: 0x6c1ffe20, - 0x2b330: 0x6c33dc20, 0x2b331: 0x6c33de20, 0x2b332: 0x6c33e020, 0x2b333: 0x6c4e9e20, - 0x2b334: 0x6c709620, 0x2b335: 0x6c709820, 0x2b336: 0x6c709a20, 0x2b337: 0x6c98b620, - 0x2b338: 0x6cc48e20, 0x2b339: 0x6cf37620, 0x2b33a: 0x6d233220, 0x2b33b: 0x6d50be20, - 0x2b33c: 0x6d50c020, 0x2b33d: 0x6da46820, 0x2b33e: 0x6c201620, 0x2b33f: 0x6c340220, - // Block 0xacd, offset 0x2b340 - 0x2b340: 0x6c340420, 0x2b341: 0x6c4ec820, 0x2b342: 0x6c4eca20, 0x2b343: 0x6c093220, - 0x2b344: 0x6c093420, 0x2b345: 0x6c093620, 0x2b346: 0x6c11d620, 0x2b347: 0x6c11d820, - 0x2b348: 0x6c11da20, 0x2b349: 0x6c202820, 0x2b34a: 0x6c202a20, 0x2b34b: 0x6c202c20, - 0x2b34c: 0x6c202e20, 0x2b34d: 0x6c203020, 0x2b34e: 0x6c203220, 0x2b34f: 0x6c203420, - 0x2b350: 0x6c203620, 0x2b351: 0x6c203820, 0x2b352: 0x6c341e20, 0x2b353: 0x6c342020, - 0x2b354: 0x6c342220, 0x2b355: 0x6c342420, 0x2b356: 0x6c342620, 0x2b357: 0x6c342820, - 0x2b358: 0x6c4ef220, 0x2b359: 0x6c342a20, 0x2b35a: 0x6c342c20, 0x2b35b: 0x6c342e20, - 0x2b35c: 0x6c343020, 0x2b35d: 0x6c343220, 0x2b35e: 0x6c343420, 0x2b35f: 0x6c343620, - 0x2b360: 0x6c343820, 0x2b361: 0x6c4ef820, 0x2b362: 0x6c4efa20, 0x2b363: 0x6c4efc20, - 0x2b364: 0x6c4efe20, 0x2b365: 0x6c4f0020, 0x2b366: 0x6c4f0220, 0x2b367: 0x6c4f0420, - 0x2b368: 0x6c4f0620, 0x2b369: 0x6c4f0820, 0x2b36a: 0x6c4f0a20, 0x2b36b: 0x6c4f0c20, - 0x2b36c: 0x6c70ca20, 0x2b36d: 0x6c70cc20, 0x2b36e: 0x6c4f0e20, 0x2b36f: 0x6c4f1020, - 0x2b370: 0x6c4f1220, 0x2b371: 0x6c70ce20, 0x2b372: 0x6c70e020, 0x2b373: 0x6c98e220, - 0x2b374: 0x6c70e220, 0x2b375: 0x6c70e420, 0x2b376: 0x6c70e620, 0x2b377: 0x6c70e820, - 0x2b378: 0x6c70ea20, 0x2b379: 0x6c98e820, 0x2b37a: 0x6c98ea20, 0x2b37b: 0x6c98ec20, - 0x2b37c: 0x6c98ee20, 0x2b37d: 0x6c98f020, 0x2b37e: 0x6c98f220, 0x2b37f: 0x6c98f420, - // Block 0xace, offset 0x2b380 - 0x2b380: 0x6c98f620, 0x2b381: 0x6c98f820, 0x2b382: 0x6c98fa20, 0x2b383: 0x6c98fc20, - 0x2b384: 0x6c98fe20, 0x2b385: 0x6c990020, 0x2b386: 0x6c990220, 0x2b387: 0x6cc4bc20, - 0x2b388: 0x6c990420, 0x2b389: 0x6cc4c820, 0x2b38a: 0x6cc4ca20, 0x2b38b: 0x6cc4cc20, - 0x2b38c: 0x6cf3a820, 0x2b38d: 0x6cf3aa20, 0x2b38e: 0x6cc4ce20, 0x2b38f: 0x6cc4d020, - 0x2b390: 0x6cc4d220, 0x2b391: 0x6cc4d420, 0x2b392: 0x6cc4d620, 0x2b393: 0x6cc4d820, - 0x2b394: 0x6cc4da20, 0x2b395: 0x6cc4dc20, 0x2b396: 0x6cc66c20, 0x2b397: 0x6cc4de20, - 0x2b398: 0x6cc4e020, 0x2b399: 0x6cf3b220, 0x2b39a: 0x6cf3b420, 0x2b39b: 0x6cf3b620, - 0x2b39c: 0x6cf3b820, 0x2b39d: 0x6cf3ba20, 0x2b39e: 0x6cf3bc20, 0x2b39f: 0x6cf3be20, - 0x2b3a0: 0x6cf3c020, 0x2b3a1: 0x6cf3c220, 0x2b3a2: 0x6cf3c420, 0x2b3a3: 0x6cf3c620, - 0x2b3a4: 0x6cf3c820, 0x2b3a5: 0x6cf3ca20, 0x2b3a6: 0x6cf3cc20, 0x2b3a7: 0x6cf3ce20, - 0x2b3a8: 0x6cf3d020, 0x2b3a9: 0x6cf3d220, 0x2b3aa: 0x6cf3d420, 0x2b3ab: 0x6cf3d620, - 0x2b3ac: 0x6cf3d820, 0x2b3ad: 0x6d237220, 0x2b3ae: 0x6d237420, 0x2b3af: 0x6d237620, - 0x2b3b0: 0x6d237820, 0x2b3b1: 0x6d237a20, 0x2b3b2: 0x6d237c20, 0x2b3b3: 0x6d237e20, - 0x2b3b4: 0x6d238020, 0x2b3b5: 0x6d238220, 0x2b3b6: 0x6d238420, 0x2b3b7: 0x6d238620, - 0x2b3b8: 0x6d238820, 0x2b3b9: 0x6d238a20, 0x2b3ba: 0x6d238c20, 0x2b3bb: 0x6d50fc20, - 0x2b3bc: 0x6d50fe20, 0x2b3bd: 0x6d238e20, 0x2b3be: 0x6d239020, 0x2b3bf: 0x6d239220, - // Block 0xacf, offset 0x2b3c0 - 0x2b3c0: 0x6d239420, 0x2b3c1: 0x6d239620, 0x2b3c2: 0x6d239820, 0x2b3c3: 0x6d511020, - 0x2b3c4: 0x6d511220, 0x2b3c5: 0x6d511420, 0x2b3c6: 0x6d511620, 0x2b3c7: 0x6d511820, - 0x2b3c8: 0x6d511a20, 0x2b3c9: 0x6d511c20, 0x2b3ca: 0x6d511e20, 0x2b3cb: 0x6d512020, - 0x2b3cc: 0x6d512220, 0x2b3cd: 0x6d512420, 0x2b3ce: 0x6d512620, 0x2b3cf: 0x6d512820, - 0x2b3d0: 0x6d512a20, 0x2b3d1: 0x6d512c20, 0x2b3d2: 0x6d7cb420, 0x2b3d3: 0x6da47a20, - 0x2b3d4: 0x6d7cb620, 0x2b3d5: 0x6d7cb820, 0x2b3d6: 0x6d7cba20, 0x2b3d7: 0x6d7cbc20, - 0x2b3d8: 0x6d7cbe20, 0x2b3d9: 0x6d7cc020, 0x2b3da: 0x6da48220, 0x2b3db: 0x6da48420, - 0x2b3dc: 0x6da48620, 0x2b3dd: 0x6da48820, 0x2b3de: 0x6da48a20, 0x2b3df: 0x6da48c20, - 0x2b3e0: 0x6dc60e20, 0x2b3e1: 0x6dc61020, 0x2b3e2: 0x6dc61220, 0x2b3e3: 0x6dc61420, - 0x2b3e4: 0x6dc61620, 0x2b3e5: 0x6dc61820, 0x2b3e6: 0x6dc61a20, 0x2b3e7: 0x6dc61c20, - 0x2b3e8: 0x6dc61e20, 0x2b3e9: 0x6dc62020, 0x2b3ea: 0x6dc62220, 0x2b3eb: 0x6dc62420, - 0x2b3ec: 0x6de2ea20, 0x2b3ed: 0x6de2ec20, 0x2b3ee: 0x6dfa5c20, 0x2b3ef: 0x6dfa5e20, - 0x2b3f0: 0x6dfa6020, 0x2b3f1: 0x6e0df020, 0x2b3f2: 0x6e0df220, 0x2b3f3: 0x6e0df420, - 0x2b3f4: 0x6e0df620, 0x2b3f5: 0x6e28f820, 0x2b3f6: 0x6e28fa20, 0x2b3f7: 0x6e28fc20, - 0x2b3f8: 0x6e389020, 0x2b3f9: 0x6e389220, 0x2b3fa: 0x6c352e20, 0x2b3fb: 0x6c722220, - 0x2b3fc: 0x6c722420, 0x2b3fd: 0x6c9a9420, 0x2b3fe: 0x6cc67020, 0x2b3ff: 0x6c211c20, - // Block 0xad0, offset 0x2b400 - 0x2b400: 0x6c211e20, 0x2b401: 0x6c354020, 0x2b402: 0x6c354220, 0x2b403: 0x6c503420, - 0x2b404: 0x6c503620, 0x2b405: 0x6c503820, 0x2b406: 0x6c503a20, 0x2b407: 0x6c723620, - 0x2b408: 0x6c723820, 0x2b409: 0x6c723a20, 0x2b40a: 0x6c9aa020, 0x2b40b: 0x6c9aa220, - 0x2b40c: 0x6c9aa420, 0x2b40d: 0x6c9aa620, 0x2b40e: 0x6c9aa820, 0x2b40f: 0x6cc68220, - 0x2b410: 0x6cc68420, 0x2b411: 0x6cc68620, 0x2b412: 0x6cc68820, 0x2b413: 0x6cc68a20, - 0x2b414: 0x6cc68c20, 0x2b415: 0x6cc68e20, 0x2b416: 0x6cc69020, 0x2b417: 0x6cc69220, - 0x2b418: 0x6cc69420, 0x2b419: 0x6cc69620, 0x2b41a: 0x6cc69820, 0x2b41b: 0x6cf52c20, - 0x2b41c: 0x6cf52e20, 0x2b41d: 0x6cf53020, 0x2b41e: 0x6cf53220, 0x2b41f: 0x6cf53420, - 0x2b420: 0x6d24f020, 0x2b421: 0x6d24f220, 0x2b422: 0x6d24f420, 0x2b423: 0x6d24f620, - 0x2b424: 0x6d527220, 0x2b425: 0x6d527420, 0x2b426: 0x6d527620, 0x2b427: 0x6d7dae20, - 0x2b428: 0x6d7db020, 0x2b429: 0x6d7db220, 0x2b42a: 0x6d7db420, 0x2b42b: 0x6dc6b620, - 0x2b42c: 0x6dc6b820, 0x2b42d: 0x6dfab220, 0x2b42e: 0x6e0e2c20, 0x2b42f: 0x6c213a20, - 0x2b430: 0x6c728c20, 0x2b431: 0x6cf58c20, 0x2b432: 0x6c124020, 0x2b433: 0x6c124220, - 0x2b434: 0x6c358220, 0x2b435: 0x6c507a20, 0x2b436: 0x6c729a20, 0x2b437: 0x6c9b2820, - 0x2b438: 0x6cc71420, 0x2b439: 0x6d52cc20, 0x2b43a: 0x6da54220, 0x2b43b: 0x6e292a20, - 0x2b43c: 0x6c508220, 0x2b43d: 0x6c508420, 0x2b43e: 0x6c72aa20, 0x2b43f: 0x6c72ac20, - // Block 0xad1, offset 0x2b440 - 0x2b440: 0x6cc72420, 0x2b441: 0x6d255620, 0x2b442: 0x6d52d620, 0x2b443: 0x6c124620, - 0x2b444: 0x6c359e20, 0x2b445: 0x6c72b420, 0x2b446: 0x6c508e20, 0x2b447: 0x6c72b620, - 0x2b448: 0x6c72b820, 0x2b449: 0x6c72ba20, 0x2b44a: 0x6c9b4220, 0x2b44b: 0x6c9b4420, - 0x2b44c: 0x6c9b4620, 0x2b44d: 0x6cc74420, 0x2b44e: 0x6d52e420, 0x2b44f: 0x6d52e620, - 0x2b450: 0x6c124c20, 0x2b451: 0x6c124e20, 0x2b452: 0x6c215020, 0x2b453: 0x6c215220, - 0x2b454: 0x6c215420, 0x2b455: 0x6c215620, 0x2b456: 0x6c215820, 0x2b457: 0x6c215a20, - 0x2b458: 0x6c35b020, 0x2b459: 0x6c35b220, 0x2b45a: 0x6c35b420, 0x2b45b: 0x6c50b020, - 0x2b45c: 0x6c50b220, 0x2b45d: 0x6c50b420, 0x2b45e: 0x6c50b620, 0x2b45f: 0x6c50b820, - 0x2b460: 0x6c50ba20, 0x2b461: 0x6c50bc20, 0x2b462: 0x6c50be20, 0x2b463: 0x6c50c020, - 0x2b464: 0x6c50c220, 0x2b465: 0x6c72f020, 0x2b466: 0x6c72f220, 0x2b467: 0x6c72f420, - 0x2b468: 0x6c72f620, 0x2b469: 0x6c72f820, 0x2b46a: 0x6c72fa20, 0x2b46b: 0x6c72fc20, - 0x2b46c: 0x6c72fe20, 0x2b46d: 0x6c730020, 0x2b46e: 0x6c730220, 0x2b46f: 0x6c9b7020, - 0x2b470: 0x6c9b7220, 0x2b471: 0x6c9b7420, 0x2b472: 0x6c9b7620, 0x2b473: 0x6c9b7820, - 0x2b474: 0x6c9b7a20, 0x2b475: 0x6cc76e20, 0x2b476: 0x6cc77020, 0x2b477: 0x6cc77220, - 0x2b478: 0x6cc77420, 0x2b479: 0x6cc77620, 0x2b47a: 0x6cc77820, 0x2b47b: 0x6cc77a20, - 0x2b47c: 0x6cc77c20, 0x2b47d: 0x6cc77e20, 0x2b47e: 0x6cc78020, 0x2b47f: 0x6cc78220, - // Block 0xad2, offset 0x2b480 - 0x2b480: 0x6cc78420, 0x2b481: 0x6cf5d820, 0x2b482: 0x6cf5da20, 0x2b483: 0x6cf5dc20, - 0x2b484: 0x6cf5de20, 0x2b485: 0x6cf5e020, 0x2b486: 0x6cf5e220, 0x2b487: 0x6cf5e420, - 0x2b488: 0x6cf5e620, 0x2b489: 0x6cf5e820, 0x2b48a: 0x6cf5ea20, 0x2b48b: 0x6cf5ec20, - 0x2b48c: 0x6cf5ee20, 0x2b48d: 0x6d257620, 0x2b48e: 0x6d257820, 0x2b48f: 0x6d257a20, - 0x2b490: 0x6d257c20, 0x2b491: 0x6d52f420, 0x2b492: 0x6d52f620, 0x2b493: 0x6d52f820, - 0x2b494: 0x6d52fa20, 0x2b495: 0x6d52fc20, 0x2b496: 0x6d52fe20, 0x2b497: 0x6d7e3220, - 0x2b498: 0x6d7e3420, 0x2b499: 0x6d7e3620, 0x2b49a: 0x6d7e3820, 0x2b49b: 0x6d7e3a20, - 0x2b49c: 0x6d7e3c20, 0x2b49d: 0x6d7e3e20, 0x2b49e: 0x6d7e4020, 0x2b49f: 0x6d7e4220, - 0x2b4a0: 0x6da55e20, 0x2b4a1: 0x6da56020, 0x2b4a2: 0x6da56220, 0x2b4a3: 0x6dc6fa20, - 0x2b4a4: 0x6dc6fc20, 0x2b4a5: 0x6dc6fe20, 0x2b4a6: 0x6dc70020, 0x2b4a7: 0x6dc70220, - 0x2b4a8: 0x6dc70420, 0x2b4a9: 0x6de38420, 0x2b4aa: 0x6de38620, 0x2b4ab: 0x6dfade20, - 0x2b4ac: 0x6e1d9a20, 0x2b4ad: 0x6e1d9c20, 0x2b4ae: 0x6e292e20, 0x2b4af: 0x6e38a620, - 0x2b4b0: 0x6c126e20, 0x2b4b1: 0x6d7ed420, 0x2b4b2: 0x6da5aa20, 0x2b4b3: 0x6c364a20, - 0x2b4b4: 0x6c73aa20, 0x2b4b5: 0x6c73ac20, 0x2b4b6: 0x6c9c1620, 0x2b4b7: 0x6c9c1820, - 0x2b4b8: 0x6cc85820, 0x2b4b9: 0x6cd95a20, 0x2b4ba: 0x6d260220, 0x2b4bb: 0x6d260420, - 0x2b4bc: 0x6d538020, 0x2b4bd: 0x6d538220, 0x2b4be: 0x6d538420, 0x2b4bf: 0x6d7ee420, - // Block 0xad3, offset 0x2b4c0 - 0x2b4c0: 0x6da5b020, 0x2b4c1: 0x6c127a20, 0x2b4c2: 0x6c21b020, 0x2b4c3: 0x6c21b220, - 0x2b4c4: 0x6c21b420, 0x2b4c5: 0x6c21b620, 0x2b4c6: 0x6c21b820, 0x2b4c7: 0x6c365820, - 0x2b4c8: 0x6c365a20, 0x2b4c9: 0x6c365c20, 0x2b4ca: 0x6c365e20, 0x2b4cb: 0x6c366020, - 0x2b4cc: 0x6c366220, 0x2b4cd: 0x6c366420, 0x2b4ce: 0x6c366620, 0x2b4cf: 0x6c366820, - 0x2b4d0: 0x6c366a20, 0x2b4d1: 0x6c518620, 0x2b4d2: 0x6c518820, 0x2b4d3: 0x6c518a20, - 0x2b4d4: 0x6c518c20, 0x2b4d5: 0x6c518e20, 0x2b4d6: 0x6c519020, 0x2b4d7: 0x6c519220, - 0x2b4d8: 0x6c73c620, 0x2b4d9: 0x6c73c820, 0x2b4da: 0x6c73ca20, 0x2b4db: 0x6c73cc20, - 0x2b4dc: 0x6c73ce20, 0x2b4dd: 0x6c73d020, 0x2b4de: 0x6c73d220, 0x2b4df: 0x6c73d420, - 0x2b4e0: 0x6c73d620, 0x2b4e1: 0x6c73d820, 0x2b4e2: 0x6c73da20, 0x2b4e3: 0x6c73dc20, - 0x2b4e4: 0x6c73de20, 0x2b4e5: 0x6c73e020, 0x2b4e6: 0x6c73e220, 0x2b4e7: 0x6c73e420, - 0x2b4e8: 0x6c9c3620, 0x2b4e9: 0x6c9c3820, 0x2b4ea: 0x6c9c3a20, 0x2b4eb: 0x6c9c3c20, - 0x2b4ec: 0x6c9c3e20, 0x2b4ed: 0x6c9c4020, 0x2b4ee: 0x6c9c4220, 0x2b4ef: 0x6c9c4420, - 0x2b4f0: 0x6c9c4620, 0x2b4f1: 0x6c9c4820, 0x2b4f2: 0x6c9c4a20, 0x2b4f3: 0x6c9c4c20, - 0x2b4f4: 0x6c9c4e20, 0x2b4f5: 0x6c9c5020, 0x2b4f6: 0x6cc88620, 0x2b4f7: 0x6c9c5220, - 0x2b4f8: 0x6cc88820, 0x2b4f9: 0x6cc88a20, 0x2b4fa: 0x6cc88c20, 0x2b4fb: 0x6cc88e20, - 0x2b4fc: 0x6cc89020, 0x2b4fd: 0x6cc89220, 0x2b4fe: 0x6cc89420, 0x2b4ff: 0x6cc89620, - // Block 0xad4, offset 0x2b500 - 0x2b500: 0x6cc89820, 0x2b501: 0x6cc89a20, 0x2b502: 0x6cc89c20, 0x2b503: 0x6cc89e20, - 0x2b504: 0x6cc8a020, 0x2b505: 0x6cc8a220, 0x2b506: 0x6cc8a420, 0x2b507: 0x6cc8a620, - 0x2b508: 0x6cc8a820, 0x2b509: 0x6cc8aa20, 0x2b50a: 0x6cc8ac20, 0x2b50b: 0x6cf6b220, - 0x2b50c: 0x6cf6b420, 0x2b50d: 0x6cf6b620, 0x2b50e: 0x6cf6b820, 0x2b50f: 0x6cf6ba20, - 0x2b510: 0x6cf6bc20, 0x2b511: 0x6cf6be20, 0x2b512: 0x6cf6c020, 0x2b513: 0x6cf6c220, - 0x2b514: 0x6cf6c420, 0x2b515: 0x6cf6c620, 0x2b516: 0x6cf6c820, 0x2b517: 0x6cf6ca20, - 0x2b518: 0x6cf6cc20, 0x2b519: 0x6cf6ce20, 0x2b51a: 0x6cf6d020, 0x2b51b: 0x6cf6d220, - 0x2b51c: 0x6cf6d420, 0x2b51d: 0x6cf6d620, 0x2b51e: 0x6cf6d820, 0x2b51f: 0x6cf6da20, - 0x2b520: 0x6cf6dc20, 0x2b521: 0x6cfbd820, 0x2b522: 0x6cf6de20, 0x2b523: 0x6cf6e020, - 0x2b524: 0x6d261a20, 0x2b525: 0x6d261c20, 0x2b526: 0x6d261e20, 0x2b527: 0x6d262020, - 0x2b528: 0x6d262220, 0x2b529: 0x6d262420, 0x2b52a: 0x6d262620, 0x2b52b: 0x6d262820, - 0x2b52c: 0x6d262a20, 0x2b52d: 0x6d262c20, 0x2b52e: 0x6d262e20, 0x2b52f: 0x6d263020, - 0x2b530: 0x6d263220, 0x2b531: 0x6d263420, 0x2b532: 0x6d263620, 0x2b533: 0x6d263820, - 0x2b534: 0x6d263a20, 0x2b535: 0x6d263c20, 0x2b536: 0x6d263e20, 0x2b537: 0x6d264020, - 0x2b538: 0x6d264220, 0x2b539: 0x6d264420, 0x2b53a: 0x6d264620, 0x2b53b: 0x6d264820, - 0x2b53c: 0x6d264a20, 0x2b53d: 0x6d264c20, 0x2b53e: 0x6d539e20, 0x2b53f: 0x6d53a020, - // Block 0xad5, offset 0x2b540 - 0x2b540: 0x6d53a220, 0x2b541: 0x6d53a420, 0x2b542: 0x6d53a620, 0x2b543: 0x6d53a820, - 0x2b544: 0x6d53aa20, 0x2b545: 0x6d53ac20, 0x2b546: 0x6d53ae20, 0x2b547: 0x6d53b020, - 0x2b548: 0x6d53b220, 0x2b549: 0x6d53b420, 0x2b54a: 0x6d53b620, 0x2b54b: 0x6d53b820, - 0x2b54c: 0x6d53ba20, 0x2b54d: 0x6d53bc20, 0x2b54e: 0x6d53be20, 0x2b54f: 0x6d53c020, - 0x2b550: 0x6d7f0220, 0x2b551: 0x6d53c220, 0x2b552: 0x6d53c420, 0x2b553: 0x6d7f0420, - 0x2b554: 0x6d7f0620, 0x2b555: 0x6d7f0820, 0x2b556: 0x6d7f0a20, 0x2b557: 0x6d7f0c20, - 0x2b558: 0x6d7f0e20, 0x2b559: 0x6d7f1020, 0x2b55a: 0x6d7f1220, 0x2b55b: 0x6d7f1420, - 0x2b55c: 0x6d7f1620, 0x2b55d: 0x6d7f1820, 0x2b55e: 0x6d7f1a20, 0x2b55f: 0x6d7f1c20, - 0x2b560: 0x6d53c620, 0x2b561: 0x6d7f1e20, 0x2b562: 0x6d7f2020, 0x2b563: 0x6d7f2220, - 0x2b564: 0x6d7f2420, 0x2b565: 0x6d7f2620, 0x2b566: 0x6d7f2820, 0x2b567: 0x6d7f2a20, - 0x2b568: 0x6d7f2c20, 0x2b569: 0x6d7f2e20, 0x2b56a: 0x6da5c220, 0x2b56b: 0x6da5c420, - 0x2b56c: 0x6da5c620, 0x2b56d: 0x6da5c820, 0x2b56e: 0x6da5ca20, 0x2b56f: 0x6da5cc20, - 0x2b570: 0x6da5ce20, 0x2b571: 0x6da5d020, 0x2b572: 0x6da5d220, 0x2b573: 0x6da5d420, - 0x2b574: 0x6da5d620, 0x2b575: 0x6da5d820, 0x2b576: 0x6da5da20, 0x2b577: 0x6dc75420, - 0x2b578: 0x6dc75620, 0x2b579: 0x6dc75820, 0x2b57a: 0x6dc75a20, 0x2b57b: 0x6dc75c20, - 0x2b57c: 0x6dc75e20, 0x2b57d: 0x6dc76020, 0x2b57e: 0x6de3b420, 0x2b57f: 0x6de3b620, - // Block 0xad6, offset 0x2b580 - 0x2b580: 0x6de3b820, 0x2b581: 0x6de3ba20, 0x2b582: 0x6de3bc20, 0x2b583: 0x6de3be20, - 0x2b584: 0x6de3c020, 0x2b585: 0x6de3c220, 0x2b586: 0x6de3c420, 0x2b587: 0x6de3c620, - 0x2b588: 0x6de3c820, 0x2b589: 0x6dfb0820, 0x2b58a: 0x6dfb0a20, 0x2b58b: 0x6dfb0c20, - 0x2b58c: 0x6dfb0e20, 0x2b58d: 0x6dfb1020, 0x2b58e: 0x6dfb1220, 0x2b58f: 0x6dfb1420, - 0x2b590: 0x6dfb1620, 0x2b591: 0x6dfb1820, 0x2b592: 0x6dfb1a20, 0x2b593: 0x6dfb1c20, - 0x2b594: 0x6e0e5e20, 0x2b595: 0x6e0e6020, 0x2b596: 0x6dfb1e20, 0x2b597: 0x6e1db220, - 0x2b598: 0x6e1db420, 0x2b599: 0x6e293a20, 0x2b59a: 0x6e293c20, 0x2b59b: 0x6e293e20, - 0x2b59c: 0x6e294020, 0x2b59d: 0x6c223820, 0x2b59e: 0x6c223a20, 0x2b59f: 0x6c376620, - 0x2b5a0: 0x6c376820, 0x2b5a1: 0x6c376a20, 0x2b5a2: 0x6c376c20, 0x2b5a3: 0x6c52c220, - 0x2b5a4: 0x6c52c420, 0x2b5a5: 0x6c52c620, 0x2b5a6: 0x6c52c820, 0x2b5a7: 0x6c52ca20, - 0x2b5a8: 0x6c52cc20, 0x2b5a9: 0x6c754820, 0x2b5aa: 0x6c754a20, 0x2b5ab: 0x6c754c20, - 0x2b5ac: 0x6c754e20, 0x2b5ad: 0x6c755020, 0x2b5ae: 0x6c9da620, 0x2b5af: 0x6c9da820, - 0x2b5b0: 0x6c9daa20, 0x2b5b1: 0x6c9dac20, 0x2b5b2: 0x6cca8c20, 0x2b5b3: 0x6cca8e20, - 0x2b5b4: 0x6cca9020, 0x2b5b5: 0x6cca9220, 0x2b5b6: 0x6cca9420, 0x2b5b7: 0x6c75a620, - 0x2b5b8: 0x6cca9620, 0x2b5b9: 0x6cf8bc20, 0x2b5ba: 0x6cf8be20, 0x2b5bb: 0x6cf8c020, - 0x2b5bc: 0x6cf8c220, 0x2b5bd: 0x6cf8c420, 0x2b5be: 0x6cf8c620, 0x2b5bf: 0x6d280220, - // Block 0xad7, offset 0x2b5c0 - 0x2b5c0: 0x6d280420, 0x2b5c1: 0x6d280620, 0x2b5c2: 0x6d555220, 0x2b5c3: 0x6d555420, - 0x2b5c4: 0x6d80d020, 0x2b5c5: 0x6d80d220, 0x2b5c6: 0x6da6f420, 0x2b5c7: 0x6da6f620, - 0x2b5c8: 0x6da6f820, 0x2b5c9: 0x6da6fa20, 0x2b5ca: 0x6de47a20, 0x2b5cb: 0x6dfb9a20, - 0x2b5cc: 0x6e1e0c20, 0x2b5cd: 0x6e297620, 0x2b5ce: 0x6e38d620, 0x2b5cf: 0x6c12ba20, - 0x2b5d0: 0x6c224e20, 0x2b5d1: 0x6c225020, 0x2b5d2: 0x6c52f820, 0x2b5d3: 0x6c52fa20, - 0x2b5d4: 0x6c52fc20, 0x2b5d5: 0x6ccad220, 0x2b5d6: 0x6ccad420, 0x2b5d7: 0x6d284220, - 0x2b5d8: 0x6dc85c20, 0x2b5d9: 0x6c12c220, 0x2b5da: 0x6c37ca20, 0x2b5db: 0x6c37cc20, - 0x2b5dc: 0x6c37ce20, 0x2b5dd: 0x6c37d020, 0x2b5de: 0x6c530820, 0x2b5df: 0x6c530a20, - 0x2b5e0: 0x6c530c20, 0x2b5e1: 0x6c75a820, 0x2b5e2: 0x6c9de820, 0x2b5e3: 0x6c9dea20, - 0x2b5e4: 0x6ccaf820, 0x2b5e5: 0x6ccafa20, 0x2b5e6: 0x6ccafc20, 0x2b5e7: 0x6ccafe20, - 0x2b5e8: 0x6ccb0020, 0x2b5e9: 0x6ccb0220, 0x2b5ea: 0x6cf92220, 0x2b5eb: 0x6cf92420, - 0x2b5ec: 0x6cf92620, 0x2b5ed: 0x6cf92820, 0x2b5ee: 0x6cf92a20, 0x2b5ef: 0x6d285020, - 0x2b5f0: 0x6d285220, 0x2b5f1: 0x6d285420, 0x2b5f2: 0x6d285620, 0x2b5f3: 0x6d559a20, - 0x2b5f4: 0x6d559c20, 0x2b5f5: 0x6d810220, 0x2b5f6: 0x6d810420, 0x2b5f7: 0x6d810620, - 0x2b5f8: 0x6da71e20, 0x2b5f9: 0x6dfba420, 0x2b5fa: 0x6dfba620, 0x2b5fb: 0x6e297e20, - 0x2b5fc: 0x6c227420, 0x2b5fd: 0x6c380420, 0x2b5fe: 0x6c75dc20, 0x2b5ff: 0x6c75de20, - // Block 0xad8, offset 0x2b600 - 0x2b600: 0x6c9e2020, 0x2b601: 0x6ccb4a20, 0x2b602: 0x6ccb4c20, 0x2b603: 0x6ccb4e20, - 0x2b604: 0x6cf95620, 0x2b605: 0x6d287620, 0x2b606: 0x6d812820, 0x2b607: 0x6d812a20, - 0x2b608: 0x6d812c20, 0x2b609: 0x6da73620, 0x2b60a: 0x6dc87e20, 0x2b60b: 0x6c535620, - 0x2b60c: 0x6c12da20, 0x2b60d: 0x6c382020, 0x2b60e: 0x6c382220, 0x2b60f: 0x6c382420, - 0x2b610: 0x6c382620, 0x2b611: 0x6c382820, 0x2b612: 0x6c535e20, 0x2b613: 0x6c75f620, - 0x2b614: 0x6c9e5420, 0x2b615: 0x6c9e5620, 0x2b616: 0x6c9e5820, 0x2b617: 0x6c9e5a20, - 0x2b618: 0x6c9e5c20, 0x2b619: 0x6c9e5e20, 0x2b61a: 0x6c9e6020, 0x2b61b: 0x6ccb6a20, - 0x2b61c: 0x6ccb6c20, 0x2b61d: 0x6ccb6e20, 0x2b61e: 0x6ccb7020, 0x2b61f: 0x6cf98220, - 0x2b620: 0x6cf98420, 0x2b621: 0x6cf98620, 0x2b622: 0x6cf98820, 0x2b623: 0x6cf98a20, - 0x2b624: 0x6d289e20, 0x2b625: 0x6d28a020, 0x2b626: 0x6d28a220, 0x2b627: 0x6d28a420, - 0x2b628: 0x6d28a620, 0x2b629: 0x6d28a820, 0x2b62a: 0x6d815c20, 0x2b62b: 0x6d815e20, - 0x2b62c: 0x6d816020, 0x2b62d: 0x6d816220, 0x2b62e: 0x6d816420, 0x2b62f: 0x6dc89220, - 0x2b630: 0x6dc89420, 0x2b631: 0x6de4a220, 0x2b632: 0x6e3d4820, 0x2b633: 0x6c763820, - 0x2b634: 0x6c385620, 0x2b635: 0x6c9ea020, 0x2b636: 0x6d561220, 0x2b637: 0x6d819620, - 0x2b638: 0x6c04c820, 0x2b639: 0x6c099620, 0x2b63a: 0x6c099820, 0x2b63b: 0x6c12f420, - 0x2b63c: 0x6c099a20, 0x2b63d: 0x6c12fa20, 0x2b63e: 0x6c22a020, 0x2b63f: 0x6c12fc20, - // Block 0xad9, offset 0x2b640 - 0x2b640: 0x6c22a620, 0x2b641: 0x6c22a820, 0x2b642: 0x6c22aa20, 0x2b643: 0x6c22ac20, - 0x2b644: 0x6c22ae20, 0x2b645: 0x6c22b020, 0x2b646: 0x6c22b220, 0x2b647: 0x6c22b420, - 0x2b648: 0x6c22b620, 0x2b649: 0x6c22b820, 0x2b64a: 0x6c22ba20, 0x2b64b: 0x6c387020, - 0x2b64c: 0x6c387220, 0x2b64d: 0x6c387420, 0x2b64e: 0x6c387620, 0x2b64f: 0x6c387820, - 0x2b650: 0x6c387a20, 0x2b651: 0x6c387c20, 0x2b652: 0x6c387e20, 0x2b653: 0x6c388020, - 0x2b654: 0x6c388220, 0x2b655: 0x6c388420, 0x2b656: 0x6c53d820, 0x2b657: 0x6c53da20, - 0x2b658: 0x6c53dc20, 0x2b659: 0x6c53de20, 0x2b65a: 0x6c53e020, 0x2b65b: 0x6c53e220, - 0x2b65c: 0x6c53e420, 0x2b65d: 0x6c53e620, 0x2b65e: 0x6c53e820, 0x2b65f: 0x6c9eaa20, - 0x2b660: 0x6c53ea20, 0x2b661: 0x6c53ec20, 0x2b662: 0x6c53ee20, 0x2b663: 0x6c53f020, - 0x2b664: 0x6c765220, 0x2b665: 0x6c765420, 0x2b666: 0x6c765620, 0x2b667: 0x6c765820, - 0x2b668: 0x6c765a20, 0x2b669: 0x6c765c20, 0x2b66a: 0x6c765e20, 0x2b66b: 0x6c9eac20, - 0x2b66c: 0x6c766020, 0x2b66d: 0x6c766220, 0x2b66e: 0x6c766420, 0x2b66f: 0x6c766620, - 0x2b670: 0x6c766820, 0x2b671: 0x6c766a20, 0x2b672: 0x6c766c20, 0x2b673: 0x6c766e20, - 0x2b674: 0x6c9eb020, 0x2b675: 0x6c9eb220, 0x2b676: 0x6c9eb420, 0x2b677: 0x6c9eb620, - 0x2b678: 0x6c9eb820, 0x2b679: 0x6c9eba20, 0x2b67a: 0x6c9ebc20, 0x2b67b: 0x6c9ebe20, - 0x2b67c: 0x6ccbd620, 0x2b67d: 0x6c9ec020, 0x2b67e: 0x6c9ec220, 0x2b67f: 0x6c9ec420, - // Block 0xada, offset 0x2b680 - 0x2b680: 0x6c9ec620, 0x2b681: 0x6c9ec820, 0x2b682: 0x6c9eca20, 0x2b683: 0x6c9ecc20, - 0x2b684: 0x6c9ece20, 0x2b685: 0x6ccbd820, 0x2b686: 0x6c9ed020, 0x2b687: 0x6ccbda20, - 0x2b688: 0x6c9ed220, 0x2b689: 0x6c9ed420, 0x2b68a: 0x6c9ed620, 0x2b68b: 0x6c9ed820, - 0x2b68c: 0x6c9eda20, 0x2b68d: 0x6c9edc20, 0x2b68e: 0x6c9ede20, 0x2b68f: 0x6ccbe020, - 0x2b690: 0x6ccbe220, 0x2b691: 0x6ccbe420, 0x2b692: 0x6ccbe620, 0x2b693: 0x6ccbe820, - 0x2b694: 0x6ccbea20, 0x2b695: 0x6ccbec20, 0x2b696: 0x6ccbee20, 0x2b697: 0x6ccbf020, - 0x2b698: 0x6ccbf220, 0x2b699: 0x6ccbf420, 0x2b69a: 0x6ccbf620, 0x2b69b: 0x6ccbf820, - 0x2b69c: 0x6ccbfa20, 0x2b69d: 0x6ccbfc20, 0x2b69e: 0x6ccbfe20, 0x2b69f: 0x6ccc0020, - 0x2b6a0: 0x6ccc0220, 0x2b6a1: 0x6ccc0420, 0x2b6a2: 0x6ccc0620, 0x2b6a3: 0x6ccc0820, - 0x2b6a4: 0x6ccc0a20, 0x2b6a5: 0x6cf9e420, 0x2b6a6: 0x6cf9e620, 0x2b6a7: 0x6cf9e820, - 0x2b6a8: 0x6cf9ea20, 0x2b6a9: 0x6cf9ec20, 0x2b6aa: 0x6cf9ee20, 0x2b6ab: 0x6cf9f020, - 0x2b6ac: 0x6cf9f220, 0x2b6ad: 0x6cf9f420, 0x2b6ae: 0x6cf9f620, 0x2b6af: 0x6cf9f820, - 0x2b6b0: 0x6cf9fa20, 0x2b6b1: 0x6cf9fc20, 0x2b6b2: 0x6cf9fe20, 0x2b6b3: 0x6cfa0020, - 0x2b6b4: 0x6cfa0220, 0x2b6b5: 0x6cfa0420, 0x2b6b6: 0x6cfa0620, 0x2b6b7: 0x6cfa0820, - 0x2b6b8: 0x6cfa0a20, 0x2b6b9: 0x6cfa0c20, 0x2b6ba: 0x6cfa0e20, 0x2b6bb: 0x6cfa1020, - 0x2b6bc: 0x6d28f620, 0x2b6bd: 0x6d28f820, 0x2b6be: 0x6d28fa20, 0x2b6bf: 0x6d28fc20, - // Block 0xadb, offset 0x2b6c0 - 0x2b6c0: 0x6d28fe20, 0x2b6c1: 0x6d290020, 0x2b6c2: 0x6d290220, 0x2b6c3: 0x6d290420, - 0x2b6c4: 0x6d290620, 0x2b6c5: 0x6d290820, 0x2b6c6: 0x6d290a20, 0x2b6c7: 0x6d290c20, - 0x2b6c8: 0x6d290e20, 0x2b6c9: 0x6d291020, 0x2b6ca: 0x6d562420, 0x2b6cb: 0x6d562620, - 0x2b6cc: 0x6d562820, 0x2b6cd: 0x6d562a20, 0x2b6ce: 0x6d562c20, 0x2b6cf: 0x6d562e20, - 0x2b6d0: 0x6d563020, 0x2b6d1: 0x6d563220, 0x2b6d2: 0x6d563420, 0x2b6d3: 0x6d563620, - 0x2b6d4: 0x6d563820, 0x2b6d5: 0x6d563a20, 0x2b6d6: 0x6d563c20, 0x2b6d7: 0x6d563e20, - 0x2b6d8: 0x6d819820, 0x2b6d9: 0x6d564020, 0x2b6da: 0x6d564220, 0x2b6db: 0x6d564420, - 0x2b6dc: 0x6d564620, 0x2b6dd: 0x6d819e20, 0x2b6de: 0x6d81a020, 0x2b6df: 0x6d81a220, - 0x2b6e0: 0x6d81a420, 0x2b6e1: 0x6d81a620, 0x2b6e2: 0x6d81a820, 0x2b6e3: 0x6d81aa20, - 0x2b6e4: 0x6d81ac20, 0x2b6e5: 0x6d81ae20, 0x2b6e6: 0x6d81b020, 0x2b6e7: 0x6d81b220, - 0x2b6e8: 0x6da77620, 0x2b6e9: 0x6d81b420, 0x2b6ea: 0x6d81b620, 0x2b6eb: 0x6d81b820, - 0x2b6ec: 0x6d81ba20, 0x2b6ed: 0x6d81bc20, 0x2b6ee: 0x6d81be20, 0x2b6ef: 0x6da77c20, - 0x2b6f0: 0x6da77e20, 0x2b6f1: 0x6da78020, 0x2b6f2: 0x6da78220, 0x2b6f3: 0x6da78420, - 0x2b6f4: 0x6da78620, 0x2b6f5: 0x6da78820, 0x2b6f6: 0x6da78a20, 0x2b6f7: 0x6da78c20, - 0x2b6f8: 0x6da78e20, 0x2b6f9: 0x6da79020, 0x2b6fa: 0x6da79220, 0x2b6fb: 0x6da79420, - 0x2b6fc: 0x6da79620, 0x2b6fd: 0x6dc8c420, 0x2b6fe: 0x6dc8c620, 0x2b6ff: 0x6dc8c820, - // Block 0xadc, offset 0x2b700 - 0x2b700: 0x6dc8ca20, 0x2b701: 0x6dc8cc20, 0x2b702: 0x6dc8ce20, 0x2b703: 0x6dc8d020, - 0x2b704: 0x6de4b220, 0x2b705: 0x6de4b420, 0x2b706: 0x6de4b620, 0x2b707: 0x6de4b820, - 0x2b708: 0x6de4ba20, 0x2b709: 0x6de4bc20, 0x2b70a: 0x6de4be20, 0x2b70b: 0x6de4c020, - 0x2b70c: 0x6dfbc420, 0x2b70d: 0x6dfbc620, 0x2b70e: 0x6dfbc820, 0x2b70f: 0x6dfbca20, - 0x2b710: 0x6dfbcc20, 0x2b711: 0x6dfbce20, 0x2b712: 0x6e0efa20, 0x2b713: 0x6e0efc20, - 0x2b714: 0x6e0efe20, 0x2b715: 0x6e0f0020, 0x2b716: 0x6e0f0220, 0x2b717: 0x6e1e2e20, - 0x2b718: 0x6e0f0420, 0x2b719: 0x6e1e3020, 0x2b71a: 0x6e1e3220, 0x2b71b: 0x6e299820, - 0x2b71c: 0x6e299a20, 0x2b71d: 0x6e299c20, 0x2b71e: 0x6e329e20, 0x2b71f: 0x6e32a020, - 0x2b720: 0x6e3d5020, 0x2b721: 0x6c135620, 0x2b722: 0x6c135820, 0x2b723: 0x6c238a20, - 0x2b724: 0x6c238c20, 0x2b725: 0x6c238e20, 0x2b726: 0x6c399420, 0x2b727: 0x6c399620, - 0x2b728: 0x6c399820, 0x2b729: 0x6c399a20, 0x2b72a: 0x6c399c20, 0x2b72b: 0x6c551820, - 0x2b72c: 0x6c551a20, 0x2b72d: 0x6c551c20, 0x2b72e: 0x6c551e20, 0x2b72f: 0x6c552020, - 0x2b730: 0x6c552220, 0x2b731: 0x6c552420, 0x2b732: 0x6c552620, 0x2b733: 0x6c77ea20, - 0x2b734: 0x6c77ec20, 0x2b735: 0x6c77ee20, 0x2b736: 0x6c77f020, 0x2b737: 0x6c77f220, - 0x2b738: 0x6c77f420, 0x2b739: 0x6ca0de20, 0x2b73a: 0x6ca0e020, 0x2b73b: 0x6ca0e220, - 0x2b73c: 0x6ca0e420, 0x2b73d: 0x6ca0e620, 0x2b73e: 0x6ca0e820, 0x2b73f: 0x6ca0ea20, - // Block 0xadd, offset 0x2b740 - 0x2b740: 0x6ca0ec20, 0x2b741: 0x6ca0ee20, 0x2b742: 0x6ccdde20, 0x2b743: 0x6ccde020, - 0x2b744: 0x6ccde220, 0x2b745: 0x6ccde420, 0x2b746: 0x6ccde620, 0x2b747: 0x6ccde820, - 0x2b748: 0x6ccdea20, 0x2b749: 0x6ccdec20, 0x2b74a: 0x6ccdee20, 0x2b74b: 0x6ccdf020, - 0x2b74c: 0x6ccdf220, 0x2b74d: 0x6ccdf420, 0x2b74e: 0x6cfbda20, 0x2b74f: 0x6cfbdc20, - 0x2b750: 0x6cfbde20, 0x2b751: 0x6cfbe020, 0x2b752: 0x6cfbe220, 0x2b753: 0x6cfbe420, - 0x2b754: 0x6cfbe620, 0x2b755: 0x6cfbe820, 0x2b756: 0x6cfbea20, 0x2b757: 0x6cfbec20, - 0x2b758: 0x6cfbee20, 0x2b759: 0x6cfbf020, 0x2b75a: 0x6cfbf220, 0x2b75b: 0x6cfbf420, - 0x2b75c: 0x6cfbf620, 0x2b75d: 0x6cfbf820, 0x2b75e: 0x6cfbfa20, 0x2b75f: 0x6d2ad220, - 0x2b760: 0x6d2ad420, 0x2b761: 0x6d2ad620, 0x2b762: 0x6d2ad820, 0x2b763: 0x6d2ada20, - 0x2b764: 0x6d2adc20, 0x2b765: 0x6d2ade20, 0x2b766: 0x6d2ae020, 0x2b767: 0x6d2ae220, - 0x2b768: 0x6d2ae420, 0x2b769: 0x6d2ae620, 0x2b76a: 0x6d2ae820, 0x2b76b: 0x6d580e20, - 0x2b76c: 0x6d581020, 0x2b76d: 0x6d581220, 0x2b76e: 0x6d581420, 0x2b76f: 0x6d581620, - 0x2b770: 0x6d581820, 0x2b771: 0x6d581a20, 0x2b772: 0x6d581c20, 0x2b773: 0x6d82fe20, - 0x2b774: 0x6d830020, 0x2b775: 0x6d830220, 0x2b776: 0x6d830420, 0x2b777: 0x6d830620, - 0x2b778: 0x6d830820, 0x2b779: 0x6d830a20, 0x2b77a: 0x6d830c20, 0x2b77b: 0x6d830e20, - 0x2b77c: 0x6d831020, 0x2b77d: 0x6d831220, 0x2b77e: 0x6da87020, 0x2b77f: 0x6da87220, - // Block 0xade, offset 0x2b780 - 0x2b780: 0x6da87420, 0x2b781: 0x6da87620, 0x2b782: 0x6da87820, 0x2b783: 0x6da87a20, - 0x2b784: 0x6dc9ba20, 0x2b785: 0x6dc9bc20, 0x2b786: 0x6de57220, 0x2b787: 0x6de57420, - 0x2b788: 0x6dfc4a20, 0x2b789: 0x6de57620, 0x2b78a: 0x6dfc4c20, 0x2b78b: 0x6dfc4e20, - 0x2b78c: 0x6dfc5020, 0x2b78d: 0x6e0f7c20, 0x2b78e: 0x6e1e6e20, 0x2b78f: 0x6e29d620, - 0x2b790: 0x6e29d820, 0x2b791: 0x6e3d6620, 0x2b792: 0x6c3a2420, 0x2b793: 0x6c3a2620, - 0x2b794: 0x6ca1ce20, 0x2b795: 0x6d2bda20, 0x2b796: 0x6c561420, 0x2b797: 0x6c78d420, - 0x2b798: 0x6ca1da20, 0x2b799: 0x6cfd3e20, 0x2b79a: 0x6c3a4020, 0x2b79b: 0x6c561e20, - 0x2b79c: 0x6ccf2820, 0x2b79d: 0x6c3a4e20, 0x2b79e: 0x6c3a5020, 0x2b79f: 0x6c78ee20, - 0x2b7a0: 0x6c78f020, 0x2b7a1: 0x6c78f220, 0x2b7a2: 0x6d2bfa20, 0x2b7a3: 0x6da93c20, - 0x2b7a4: 0x6dca4420, 0x2b7a5: 0x6e0fb620, 0x2b7a6: 0x6c04ea20, 0x2b7a7: 0x6c790220, - 0x2b7a8: 0x6c137e20, 0x2b7a9: 0x6c23e820, 0x2b7aa: 0x6c23ea20, 0x2b7ab: 0x6c3a6220, - 0x2b7ac: 0x6c3a6420, 0x2b7ad: 0x6c3a6620, 0x2b7ae: 0x6c3a6820, 0x2b7af: 0x6c3a6a20, - 0x2b7b0: 0x6c564220, 0x2b7b1: 0x6c564420, 0x2b7b2: 0x6c564620, 0x2b7b3: 0x6c564820, - 0x2b7b4: 0x6c564a20, 0x2b7b5: 0x6c790820, 0x2b7b6: 0x6c790a20, 0x2b7b7: 0x6c790c20, - 0x2b7b8: 0x6c790e20, 0x2b7b9: 0x6ca20e20, 0x2b7ba: 0x6ca21020, 0x2b7bb: 0x6ca21220, - 0x2b7bc: 0x6ca21420, 0x2b7bd: 0x6ca21620, 0x2b7be: 0x6ca21820, 0x2b7bf: 0x6ca21a20, - // Block 0xadf, offset 0x2b7c0 - 0x2b7c0: 0x6ca21c20, 0x2b7c1: 0x6ccf7220, 0x2b7c2: 0x6ccf7420, 0x2b7c3: 0x6ccf7620, - 0x2b7c4: 0x6d2c0e20, 0x2b7c5: 0x6cfd7020, 0x2b7c6: 0x6cfd7220, 0x2b7c7: 0x6cfd7420, - 0x2b7c8: 0x6cfd7620, 0x2b7c9: 0x6d2c1020, 0x2b7ca: 0x6d2c1220, 0x2b7cb: 0x6d2c1420, - 0x2b7cc: 0x6d594620, 0x2b7cd: 0x6d594820, 0x2b7ce: 0x6d594a20, 0x2b7cf: 0x6d594c20, - 0x2b7d0: 0x6d594e20, 0x2b7d1: 0x6d845220, 0x2b7d2: 0x6d845420, 0x2b7d3: 0x6d845620, - 0x2b7d4: 0x6da94820, 0x2b7d5: 0x6da94a20, 0x2b7d6: 0x6da94c20, 0x2b7d7: 0x6dca5020, - 0x2b7d8: 0x6dca5220, 0x2b7d9: 0x6de5e420, 0x2b7da: 0x6e0fba20, 0x2b7db: 0x6e1e9a20, - 0x2b7dc: 0x6c3ab420, 0x2b7dd: 0x6c240220, 0x2b7de: 0x6c240420, 0x2b7df: 0x6c240620, - 0x2b7e0: 0x6c240820, 0x2b7e1: 0x6c3ab820, 0x2b7e2: 0x6c3aba20, 0x2b7e3: 0x6c3abc20, - 0x2b7e4: 0x6c3abe20, 0x2b7e5: 0x6c3ac020, 0x2b7e6: 0x6c3ac220, 0x2b7e7: 0x6c3ac420, - 0x2b7e8: 0x6c3ac620, 0x2b7e9: 0x6c3ac820, 0x2b7ea: 0x6c3aca20, 0x2b7eb: 0x6c569820, - 0x2b7ec: 0x6c569a20, 0x2b7ed: 0x6c569c20, 0x2b7ee: 0x6c569e20, 0x2b7ef: 0x6c56a020, - 0x2b7f0: 0x6c56a220, 0x2b7f1: 0x6c793420, 0x2b7f2: 0x6c793620, 0x2b7f3: 0x6c793820, - 0x2b7f4: 0x6c793a20, 0x2b7f5: 0x6c793c20, 0x2b7f6: 0x6c793e20, 0x2b7f7: 0x6c794020, - 0x2b7f8: 0x6c794220, 0x2b7f9: 0x6ca25420, 0x2b7fa: 0x6ca25620, 0x2b7fb: 0x6ca25820, - 0x2b7fc: 0x6ca25a20, 0x2b7fd: 0x6ca25c20, 0x2b7fe: 0x6ca25e20, 0x2b7ff: 0x6ca26020, - // Block 0xae0, offset 0x2b800 - 0x2b800: 0x6ca26220, 0x2b801: 0x6ccfd820, 0x2b802: 0x6ccfda20, 0x2b803: 0x6ccfdc20, - 0x2b804: 0x6ccfde20, 0x2b805: 0x6ccfe020, 0x2b806: 0x6ccfe220, 0x2b807: 0x6cfdc420, - 0x2b808: 0x6cfdc620, 0x2b809: 0x6cfdc820, 0x2b80a: 0x6cfdca20, 0x2b80b: 0x6cfdcc20, - 0x2b80c: 0x6cfdce20, 0x2b80d: 0x6cfdd020, 0x2b80e: 0x6d2c6c20, 0x2b80f: 0x6d2c6e20, - 0x2b810: 0x6d2c7020, 0x2b811: 0x6d2c7220, 0x2b812: 0x6d2c7420, 0x2b813: 0x6d2c7620, - 0x2b814: 0x6d598820, 0x2b815: 0x6d598a20, 0x2b816: 0x6d598c20, 0x2b817: 0x6d598e20, - 0x2b818: 0x6d599020, 0x2b819: 0x6d599220, 0x2b81a: 0x6d848020, 0x2b81b: 0x6d848220, - 0x2b81c: 0x6d848420, 0x2b81d: 0x6da96420, 0x2b81e: 0x6da96620, 0x2b81f: 0x6da96820, - 0x2b820: 0x6dca5820, 0x2b821: 0x6de60220, 0x2b822: 0x6de60420, 0x2b823: 0x6dfce820, - 0x2b824: 0x6dfcea20, 0x2b825: 0x6dfcec20, 0x2b826: 0x6dfcee20, 0x2b827: 0x6e32d420, - 0x2b828: 0x6c13b620, 0x2b829: 0x6c13b820, 0x2b82a: 0x6c13ba20, 0x2b82b: 0x6c13bc20, - 0x2b82c: 0x6c246c20, 0x2b82d: 0x6c246e20, 0x2b82e: 0x6c247020, 0x2b82f: 0x6c247220, - 0x2b830: 0x6c3b3820, 0x2b831: 0x6c572a20, 0x2b832: 0x6c3b3a20, 0x2b833: 0x6c3b3c20, - 0x2b834: 0x6c3b3e20, 0x2b835: 0x6c3b4020, 0x2b836: 0x6c3b4220, 0x2b837: 0x6c572c20, - 0x2b838: 0x6c79bc20, 0x2b839: 0x6c572e20, 0x2b83a: 0x6c573020, 0x2b83b: 0x6c573220, - 0x2b83c: 0x6c573420, 0x2b83d: 0x6c573620, 0x2b83e: 0x6c573820, 0x2b83f: 0x6c79c220, - // Block 0xae1, offset 0x2b840 - 0x2b840: 0x6c79c420, 0x2b841: 0x6c79c620, 0x2b842: 0x6c79c820, 0x2b843: 0x6c79ca20, - 0x2b844: 0x6c79cc20, 0x2b845: 0x6c79ce20, 0x2b846: 0x6c79d020, 0x2b847: 0x6c79d220, - 0x2b848: 0x6c79d420, 0x2b849: 0x6ca2da20, 0x2b84a: 0x6ca2dc20, 0x2b84b: 0x6ca2de20, - 0x2b84c: 0x6ca2e020, 0x2b84d: 0x6ca2e220, 0x2b84e: 0x6ca2e420, 0x2b84f: 0x6ca2e620, - 0x2b850: 0x6ca2e820, 0x2b851: 0x6cd07620, 0x2b852: 0x6cd07820, 0x2b853: 0x6cd07a20, - 0x2b854: 0x6cd07c20, 0x2b855: 0x6cd07e20, 0x2b856: 0x6cd08020, 0x2b857: 0x6cfe4a20, - 0x2b858: 0x6cd08220, 0x2b859: 0x6cd08420, 0x2b85a: 0x6cd08620, 0x2b85b: 0x6cd08820, - 0x2b85c: 0x6cd08a20, 0x2b85d: 0x6cfe4e20, 0x2b85e: 0x6cfe5020, 0x2b85f: 0x6cfe5220, - 0x2b860: 0x6cfe5420, 0x2b861: 0x6cfe5620, 0x2b862: 0x6cfe5820, 0x2b863: 0x6cfe5a20, - 0x2b864: 0x6cfe5c20, 0x2b865: 0x6cfe5e20, 0x2b866: 0x6cfe6020, 0x2b867: 0x6d2ce220, - 0x2b868: 0x6d2ce420, 0x2b869: 0x6d2ce620, 0x2b86a: 0x6d2ce820, 0x2b86b: 0x6d5a0a20, - 0x2b86c: 0x6d5a0c20, 0x2b86d: 0x6d5a0e20, 0x2b86e: 0x6d5a1020, 0x2b86f: 0x6d5a1220, - 0x2b870: 0x6d5a1420, 0x2b871: 0x6d5a1620, 0x2b872: 0x6d5a1820, 0x2b873: 0x6d5a1a20, - 0x2b874: 0x6d5a1c20, 0x2b875: 0x6d84ce20, 0x2b876: 0x6d84d020, 0x2b877: 0x6d84d220, - 0x2b878: 0x6d84d420, 0x2b879: 0x6da99620, 0x2b87a: 0x6da99820, 0x2b87b: 0x6d84d620, - 0x2b87c: 0x6d84d820, 0x2b87d: 0x6da99e20, 0x2b87e: 0x6dca8420, 0x2b87f: 0x6da9a020, - // Block 0xae2, offset 0x2b880 - 0x2b880: 0x6da9a220, 0x2b881: 0x6da9a420, 0x2b882: 0x6dca8620, 0x2b883: 0x6de62020, - 0x2b884: 0x6de62220, 0x2b885: 0x6de62420, 0x2b886: 0x6de62620, 0x2b887: 0x6dfcfe20, - 0x2b888: 0x6e2a1a20, 0x2b889: 0x6c57c620, 0x2b88a: 0x6c57c820, 0x2b88b: 0x6c7a7420, - 0x2b88c: 0x6c7a7620, 0x2b88d: 0x6ca37c20, 0x2b88e: 0x6ca37e20, 0x2b88f: 0x6cd16020, - 0x2b890: 0x6d2d8620, 0x2b891: 0x6d2d8820, 0x2b892: 0x6d2d8a20, 0x2b893: 0x6d5ab220, - 0x2b894: 0x6d5ab420, 0x2b895: 0x6dcae220, 0x2b896: 0x6e3d7020, 0x2b897: 0x6c24a020, - 0x2b898: 0x6c3bb220, 0x2b899: 0x6c3bb420, 0x2b89a: 0x6c57d620, 0x2b89b: 0x6c57d820, - 0x2b89c: 0x6c7a8620, 0x2b89d: 0x6c7a8820, 0x2b89e: 0x6c7a8a20, 0x2b89f: 0x6c7a8c20, - 0x2b8a0: 0x6c7a8e20, 0x2b8a1: 0x6ca38c20, 0x2b8a2: 0x6ca38e20, 0x2b8a3: 0x6ca39020, - 0x2b8a4: 0x6ca39220, 0x2b8a5: 0x6ca39420, 0x2b8a6: 0x6ca39620, 0x2b8a7: 0x6cd17020, - 0x2b8a8: 0x6cd17220, 0x2b8a9: 0x6cd17420, 0x2b8aa: 0x6cd17620, 0x2b8ab: 0x6cff5220, - 0x2b8ac: 0x6cff5420, 0x2b8ad: 0x6cff5620, 0x2b8ae: 0x6cff5820, 0x2b8af: 0x6cff5a20, - 0x2b8b0: 0x6cff5c20, 0x2b8b1: 0x6cff5e20, 0x2b8b2: 0x6d2d9820, 0x2b8b3: 0x6d2d9a20, - 0x2b8b4: 0x6d2d9c20, 0x2b8b5: 0x6d2d9e20, 0x2b8b6: 0x6d2da020, 0x2b8b7: 0x6d2da220, - 0x2b8b8: 0x6d5ac620, 0x2b8b9: 0x6d5ac820, 0x2b8ba: 0x6d5aca20, 0x2b8bb: 0x6d857220, - 0x2b8bc: 0x6d857420, 0x2b8bd: 0x6d857620, 0x2b8be: 0x6d857820, 0x2b8bf: 0x6daa1220, - // Block 0xae3, offset 0x2b8c0 - 0x2b8c0: 0x6daa1420, 0x2b8c1: 0x6daa1620, 0x2b8c2: 0x6daa1820, 0x2b8c3: 0x6daa1a20, - 0x2b8c4: 0x6daa1c20, 0x2b8c5: 0x6daa1e20, 0x2b8c6: 0x6dcaea20, 0x2b8c7: 0x6dcaec20, - 0x2b8c8: 0x6de66a20, 0x2b8c9: 0x6de66c20, 0x2b8ca: 0x6e1ecc20, 0x2b8cb: 0x6e32e820, - 0x2b8cc: 0x6e392220, 0x2b8cd: 0x6c7aae20, 0x2b8ce: 0x6cff8820, 0x2b8cf: 0x6d2dd220, - 0x2b8d0: 0x6d5af020, 0x2b8d1: 0x6daa3a20, 0x2b8d2: 0x6cd1a220, 0x2b8d3: 0x6d5af620, - 0x2b8d4: 0x6d859a20, 0x2b8d5: 0x6c24b020, 0x2b8d6: 0x6c24b220, 0x2b8d7: 0x6c24b420, - 0x2b8d8: 0x6c581e20, 0x2b8d9: 0x6c582020, 0x2b8da: 0x6c582220, 0x2b8db: 0x6c7aba20, - 0x2b8dc: 0x6c7abc20, 0x2b8dd: 0x6ca3d220, 0x2b8de: 0x6ca3d420, 0x2b8df: 0x6cd1ba20, - 0x2b8e0: 0x6cd1bc20, 0x2b8e1: 0x6cffa220, 0x2b8e2: 0x6cffa420, 0x2b8e3: 0x6cffa620, - 0x2b8e4: 0x6cffa820, 0x2b8e5: 0x6d2de020, 0x2b8e6: 0x6d5afe20, 0x2b8e7: 0x6d5b0020, - 0x2b8e8: 0x6d5b0220, 0x2b8e9: 0x6d859e20, 0x2b8ea: 0x6daa4420, 0x2b8eb: 0x6dcb0a20, - 0x2b8ec: 0x6dcb0c20, 0x2b8ed: 0x6de67e20, 0x2b8ee: 0x6dfd3420, 0x2b8ef: 0x6e2a4020, - 0x2b8f0: 0x6cfff020, 0x2b8f1: 0x6c24d420, 0x2b8f2: 0x6c24d620, 0x2b8f3: 0x6c3c1820, - 0x2b8f4: 0x6c3c1a20, 0x2b8f5: 0x6c3c1c20, 0x2b8f6: 0x6c3c1e20, 0x2b8f7: 0x6c589020, - 0x2b8f8: 0x6c589220, 0x2b8f9: 0x6c589420, 0x2b8fa: 0x6c589620, 0x2b8fb: 0x6c589820, - 0x2b8fc: 0x6c589a20, 0x2b8fd: 0x6c7b1220, 0x2b8fe: 0x6c7b1420, 0x2b8ff: 0x6c7b1620, - // Block 0xae4, offset 0x2b900 - 0x2b900: 0x6c7b1820, 0x2b901: 0x6c7b1a20, 0x2b902: 0x6c7b1c20, 0x2b903: 0x6c7b1e20, - 0x2b904: 0x6c7b2020, 0x2b905: 0x6c7b2220, 0x2b906: 0x6c7b2420, 0x2b907: 0x6c7b2620, - 0x2b908: 0x6c7b2820, 0x2b909: 0x6c7b2a20, 0x2b90a: 0x6ca41c20, 0x2b90b: 0x6ca41e20, - 0x2b90c: 0x6ca42020, 0x2b90d: 0x6ca42220, 0x2b90e: 0x6ca42420, 0x2b90f: 0x6ca42620, - 0x2b910: 0x6ca42820, 0x2b911: 0x6ca42a20, 0x2b912: 0x6ca42c20, 0x2b913: 0x6cd21220, - 0x2b914: 0x6cd21420, 0x2b915: 0x6cd21620, 0x2b916: 0x6cd21820, 0x2b917: 0x6cd21a20, - 0x2b918: 0x6cd21c20, 0x2b919: 0x6cd21e20, 0x2b91a: 0x6cd22020, 0x2b91b: 0x6cd22220, - 0x2b91c: 0x6cd22420, 0x2b91d: 0x6cd22620, 0x2b91e: 0x6cd22820, 0x2b91f: 0x6cd22a20, - 0x2b920: 0x6cd22c20, 0x2b921: 0x6cd22e20, 0x2b922: 0x6cfff620, 0x2b923: 0x6cfff820, - 0x2b924: 0x6cfffa20, 0x2b925: 0x6cfffc20, 0x2b926: 0x6cfffe20, 0x2b927: 0x6d000020, - 0x2b928: 0x6d000220, 0x2b929: 0x6d000420, 0x2b92a: 0x6d2e0820, 0x2b92b: 0x6d2e0a20, - 0x2b92c: 0x6d2e0c20, 0x2b92d: 0x6d2e0e20, 0x2b92e: 0x6d2e1020, 0x2b92f: 0x6d2e1220, - 0x2b930: 0x6d2e1420, 0x2b931: 0x6d2e1620, 0x2b932: 0x6d2e1820, 0x2b933: 0x6d2e1a20, - 0x2b934: 0x6d2e1c20, 0x2b935: 0x6d2e1e20, 0x2b936: 0x6d5b3220, 0x2b937: 0x6d5b3420, - 0x2b938: 0x6d5b3620, 0x2b939: 0x6d5b3820, 0x2b93a: 0x6d5b3a20, 0x2b93b: 0x6d5b3c20, - 0x2b93c: 0x6d5b3e20, 0x2b93d: 0x6d5b4020, 0x2b93e: 0x6d5b4220, 0x2b93f: 0x6d5b4420, - // Block 0xae5, offset 0x2b940 - 0x2b940: 0x6d5b4620, 0x2b941: 0x6d5b4820, 0x2b942: 0x6d85c620, 0x2b943: 0x6d85c820, - 0x2b944: 0x6d85ca20, 0x2b945: 0x6d85cc20, 0x2b946: 0x6d85ce20, 0x2b947: 0x6d85d020, - 0x2b948: 0x6d85d220, 0x2b949: 0x6daa7020, 0x2b94a: 0x6daa7220, 0x2b94b: 0x6dcb2020, - 0x2b94c: 0x6dcb2220, 0x2b94d: 0x6dcb2420, 0x2b94e: 0x6dcb2620, 0x2b94f: 0x6dcb2820, - 0x2b950: 0x6dcb2a20, 0x2b951: 0x6de69620, 0x2b952: 0x6de69820, 0x2b953: 0x6de69a20, - 0x2b954: 0x6dfd4a20, 0x2b955: 0x6e101e20, 0x2b956: 0x6e102020, 0x2b957: 0x6e102220, - 0x2b958: 0x6e1ee820, 0x2b959: 0x6e2a4820, 0x2b95a: 0x6e32ee20, 0x2b95b: 0x6e32f020, - 0x2b95c: 0x6e42c820, 0x2b95d: 0x6c24f820, 0x2b95e: 0x6c590c20, 0x2b95f: 0x6c7baa20, - 0x2b960: 0x6ca48e20, 0x2b961: 0x6ca49020, 0x2b962: 0x6d00ba20, 0x2b963: 0x6d2ea820, - 0x2b964: 0x6d2eaa20, 0x2b965: 0x6d5bdc20, 0x2b966: 0x6d865220, 0x2b967: 0x6de6dc20, - 0x2b968: 0x6e104420, 0x2b969: 0x6e393020, 0x2b96a: 0x6c3c5420, 0x2b96b: 0x6c593a20, - 0x2b96c: 0x6c593c20, 0x2b96d: 0x6c7bd420, 0x2b96e: 0x6c7bd620, 0x2b96f: 0x6ca4a820, - 0x2b970: 0x6ca4aa20, 0x2b971: 0x6cd2ee20, 0x2b972: 0x6d00e420, 0x2b973: 0x6d00e620, - 0x2b974: 0x6d2ec820, 0x2b975: 0x6d2eca20, 0x2b976: 0x6d5bf820, 0x2b977: 0x6d5bfa20, - 0x2b978: 0x6d866420, 0x2b979: 0x6dcb9220, 0x2b97a: 0x6dfd8020, 0x2b97b: 0x6c3c6620, - 0x2b97c: 0x6c594e20, 0x2b97d: 0x6c595020, 0x2b97e: 0x6c7bf020, 0x2b97f: 0x6c7bf220, - // Block 0xae6, offset 0x2b980 - 0x2b980: 0x6c7bf420, 0x2b981: 0x6ca4be20, 0x2b982: 0x6ca4c020, 0x2b983: 0x6cd30a20, - 0x2b984: 0x6d010820, 0x2b985: 0x6d010a20, 0x2b986: 0x6d2ef220, 0x2b987: 0x6d867e20, - 0x2b988: 0x6d868020, 0x2b989: 0x6dab1e20, 0x2b98a: 0x6de6fa20, 0x2b98b: 0x6e105420, - 0x2b98c: 0x6e1f0820, 0x2b98d: 0x6e443e20, 0x2b98e: 0x6c251420, 0x2b98f: 0x6c251620, - 0x2b990: 0x6c3c7620, 0x2b991: 0x6c3c7820, 0x2b992: 0x6c3c7a20, 0x2b993: 0x6c3c7c20, - 0x2b994: 0x6c3c7e20, 0x2b995: 0x6c597420, 0x2b996: 0x6c597620, 0x2b997: 0x6c597820, - 0x2b998: 0x6c597a20, 0x2b999: 0x6c597c20, 0x2b99a: 0x6c597e20, 0x2b99b: 0x6c598020, - 0x2b99c: 0x6c598220, 0x2b99d: 0x6c598420, 0x2b99e: 0x6c598620, 0x2b99f: 0x6c7c2e20, - 0x2b9a0: 0x6c7c3020, 0x2b9a1: 0x6c7c3220, 0x2b9a2: 0x6c7c3420, 0x2b9a3: 0x6c7c3620, - 0x2b9a4: 0x6c7c3820, 0x2b9a5: 0x6c7c3a20, 0x2b9a6: 0x6c7c3c20, 0x2b9a7: 0x6ca4f220, - 0x2b9a8: 0x6ca4f420, 0x2b9a9: 0x6ca4f620, 0x2b9aa: 0x6ca4f820, 0x2b9ab: 0x6ca4fa20, - 0x2b9ac: 0x6ca4fc20, 0x2b9ad: 0x6ca4fe20, 0x2b9ae: 0x6ca50020, 0x2b9af: 0x6cd32c20, - 0x2b9b0: 0x6cd32e20, 0x2b9b1: 0x6cd33020, 0x2b9b2: 0x6cd33220, 0x2b9b3: 0x6cd33420, - 0x2b9b4: 0x6cd33620, 0x2b9b5: 0x6cd33820, 0x2b9b6: 0x6cd33a20, 0x2b9b7: 0x6cd33c20, - 0x2b9b8: 0x6cd33e20, 0x2b9b9: 0x6cd34020, 0x2b9ba: 0x6cd34220, 0x2b9bb: 0x6cd34420, - 0x2b9bc: 0x6cd34620, 0x2b9bd: 0x6cd34820, 0x2b9be: 0x6cd34a20, 0x2b9bf: 0x6cd34c20, - // Block 0xae7, offset 0x2b9c0 - 0x2b9c0: 0x6cd34e20, 0x2b9c1: 0x6d013020, 0x2b9c2: 0x6d013220, 0x2b9c3: 0x6d013420, - 0x2b9c4: 0x6d013620, 0x2b9c5: 0x6d013820, 0x2b9c6: 0x6d013a20, 0x2b9c7: 0x6d013c20, - 0x2b9c8: 0x6d013e20, 0x2b9c9: 0x6d014020, 0x2b9ca: 0x6d2f0820, 0x2b9cb: 0x6d2f0a20, - 0x2b9cc: 0x6d2f0c20, 0x2b9cd: 0x6d2f0e20, 0x2b9ce: 0x6d2f1020, 0x2b9cf: 0x6d2f1220, - 0x2b9d0: 0x6d2f1420, 0x2b9d1: 0x6d2f1620, 0x2b9d2: 0x6d2f1820, 0x2b9d3: 0x6d2f1a20, - 0x2b9d4: 0x6d2f1c20, 0x2b9d5: 0x6d2f1e20, 0x2b9d6: 0x6d2f2020, 0x2b9d7: 0x6d5c2820, - 0x2b9d8: 0x6d5c2a20, 0x2b9d9: 0x6d5c2c20, 0x2b9da: 0x6d5c2e20, 0x2b9db: 0x6d5c3020, - 0x2b9dc: 0x6d5c3220, 0x2b9dd: 0x6d5c3420, 0x2b9de: 0x6d5c3620, 0x2b9df: 0x6d5c3820, - 0x2b9e0: 0x6d5c3a20, 0x2b9e1: 0x6d5c3c20, 0x2b9e2: 0x6d86ae20, 0x2b9e3: 0x6d86b020, - 0x2b9e4: 0x6d86b220, 0x2b9e5: 0x6d86b420, 0x2b9e6: 0x6d86b620, 0x2b9e7: 0x6d86b820, - 0x2b9e8: 0x6d86ba20, 0x2b9e9: 0x6d86bc20, 0x2b9ea: 0x6d86be20, 0x2b9eb: 0x6dab4e20, - 0x2b9ec: 0x6dab5020, 0x2b9ed: 0x6dab5220, 0x2b9ee: 0x6dab5420, 0x2b9ef: 0x6dab5620, - 0x2b9f0: 0x6dab5820, 0x2b9f1: 0x6dab5a20, 0x2b9f2: 0x6dab5c20, 0x2b9f3: 0x6dab5e20, - 0x2b9f4: 0x6dcbbe20, 0x2b9f5: 0x6dcbc020, 0x2b9f6: 0x6dcbc220, 0x2b9f7: 0x6dcbc420, - 0x2b9f8: 0x6dcbc620, 0x2b9f9: 0x6dcbc820, 0x2b9fa: 0x6dcbca20, 0x2b9fb: 0x6dfda620, - 0x2b9fc: 0x6dfda820, 0x2b9fd: 0x6dfdaa20, 0x2b9fe: 0x6dfdac20, 0x2b9ff: 0x6e105c20, - // Block 0xae8, offset 0x2ba00 - 0x2ba00: 0x6e105e20, 0x2ba01: 0x6e1f1620, 0x2ba02: 0x6e2a6820, 0x2ba03: 0x6e2a6a20, - 0x2ba04: 0x6e393820, 0x2ba05: 0x6e452e20, 0x2ba06: 0x6c3cb220, 0x2ba07: 0x6c5a1a20, - 0x2ba08: 0x6ca59420, 0x2ba09: 0x6d2fce20, 0x2ba0a: 0x6dabea20, 0x2ba0b: 0x6dabec20, - 0x2ba0c: 0x6dabee20, 0x2ba0d: 0x6dfde020, 0x2ba0e: 0x6e332220, 0x2ba0f: 0x6c7ce420, - 0x2ba10: 0x6c7ce620, 0x2ba11: 0x6c7cfc20, 0x2ba12: 0x6ca59c20, 0x2ba13: 0x6cd40a20, - 0x2ba14: 0x6d020620, 0x2ba15: 0x6d2fe820, 0x2ba16: 0x6c13ee20, 0x2ba17: 0x6c253820, - 0x2ba18: 0x6c3cbc20, 0x2ba19: 0x6c3cbe20, 0x2ba1a: 0x6c5a3c20, 0x2ba1b: 0x6c5a3e20, - 0x2ba1c: 0x6c5a4020, 0x2ba1d: 0x6c5a4220, 0x2ba1e: 0x6c5a4420, 0x2ba1f: 0x6c7cfe20, - 0x2ba20: 0x6c7d0020, 0x2ba21: 0x6c7d0220, 0x2ba22: 0x6c7d0420, 0x2ba23: 0x6c7d0620, - 0x2ba24: 0x6c7d0820, 0x2ba25: 0x6c7d0a20, 0x2ba26: 0x6c7d0c20, 0x2ba27: 0x6c7d0e20, - 0x2ba28: 0x6c7d1020, 0x2ba29: 0x6ca5d020, 0x2ba2a: 0x6ca5d220, 0x2ba2b: 0x6ca5d420, - 0x2ba2c: 0x6ca5d620, 0x2ba2d: 0x6ca5d820, 0x2ba2e: 0x6ca5da20, 0x2ba2f: 0x6ca5dc20, - 0x2ba30: 0x6cd42620, 0x2ba31: 0x6cd42820, 0x2ba32: 0x6cd42a20, 0x2ba33: 0x6cd42c20, - 0x2ba34: 0x6cd42e20, 0x2ba35: 0x6cd43020, 0x2ba36: 0x6cd43220, 0x2ba37: 0x6d023020, - 0x2ba38: 0x6d023220, 0x2ba39: 0x6d023420, 0x2ba3a: 0x6d023620, 0x2ba3b: 0x6d023820, - 0x2ba3c: 0x6d023a20, 0x2ba3d: 0x6d023c20, 0x2ba3e: 0x6d023e20, 0x2ba3f: 0x6d024020, - // Block 0xae9, offset 0x2ba40 - 0x2ba40: 0x6d024220, 0x2ba41: 0x6d024420, 0x2ba42: 0x6d024620, 0x2ba43: 0x6d024820, - 0x2ba44: 0x6d024a20, 0x2ba45: 0x6d024c20, 0x2ba46: 0x6d024e20, 0x2ba47: 0x6d025020, - 0x2ba48: 0x6d2ffc20, 0x2ba49: 0x6d2ffe20, 0x2ba4a: 0x6d300020, 0x2ba4b: 0x6d300220, - 0x2ba4c: 0x6d300420, 0x2ba4d: 0x6d300620, 0x2ba4e: 0x6d300820, 0x2ba4f: 0x6d300a20, - 0x2ba50: 0x6d300c20, 0x2ba51: 0x6d5cf820, 0x2ba52: 0x6d5cfa20, 0x2ba53: 0x6d5cfc20, - 0x2ba54: 0x6d5cfe20, 0x2ba55: 0x6d5d0020, 0x2ba56: 0x6d5d0220, 0x2ba57: 0x6d5d0420, - 0x2ba58: 0x6d876a20, 0x2ba59: 0x6d876c20, 0x2ba5a: 0x6d876e20, 0x2ba5b: 0x6d877020, - 0x2ba5c: 0x6d877220, 0x2ba5d: 0x6d877420, 0x2ba5e: 0x6d877620, 0x2ba5f: 0x6dac0a20, - 0x2ba60: 0x6d877820, 0x2ba61: 0x6dac0c20, 0x2ba62: 0x6dac0e20, 0x2ba63: 0x6dac1020, - 0x2ba64: 0x6dac1220, 0x2ba65: 0x6dac1420, 0x2ba66: 0x6dac1620, 0x2ba67: 0x6dac1820, - 0x2ba68: 0x6dac1a20, 0x2ba69: 0x6dcc4220, 0x2ba6a: 0x6dcc4420, 0x2ba6b: 0x6dcc4620, - 0x2ba6c: 0x6dcc4820, 0x2ba6d: 0x6dcc4a20, 0x2ba6e: 0x6dcc4c20, 0x2ba6f: 0x6dcc4e20, - 0x2ba70: 0x6de76a20, 0x2ba71: 0x6dfdec20, 0x2ba72: 0x6dfdee20, 0x2ba73: 0x6dfdf020, - 0x2ba74: 0x6e108c20, 0x2ba75: 0x6e108e20, 0x2ba76: 0x6e109020, 0x2ba77: 0x6e109220, - 0x2ba78: 0x6e1f3420, 0x2ba79: 0x6e1f3620, 0x2ba7a: 0x6e332420, 0x2ba7b: 0x6e3d9620, - 0x2ba7c: 0x6c254c20, 0x2ba7d: 0x6c5abe20, 0x2ba7e: 0x6c5ac020, 0x2ba7f: 0x6c5ac220, - // Block 0xaea, offset 0x2ba80 - 0x2ba80: 0x6c5ac420, 0x2ba81: 0x6c7dbe20, 0x2ba82: 0x6c7dc020, 0x2ba83: 0x6c7dc220, - 0x2ba84: 0x6ca68c20, 0x2ba85: 0x6ca68e20, 0x2ba86: 0x6ca69020, 0x2ba87: 0x6cd4b820, - 0x2ba88: 0x6cd4ba20, 0x2ba89: 0x6cd4bc20, 0x2ba8a: 0x6cd4be20, 0x2ba8b: 0x6d030820, - 0x2ba8c: 0x6d030a20, 0x2ba8d: 0x6d030c20, 0x2ba8e: 0x6d030e20, 0x2ba8f: 0x6d031020, - 0x2ba90: 0x6d031220, 0x2ba91: 0x6d031420, 0x2ba92: 0x6d031620, 0x2ba93: 0x6d30b420, - 0x2ba94: 0x6d30b620, 0x2ba95: 0x6d30b820, 0x2ba96: 0x6d30ba20, 0x2ba97: 0x6d30bc20, - 0x2ba98: 0x6d5d8820, 0x2ba99: 0x6d5d8a20, 0x2ba9a: 0x6d87f420, 0x2ba9b: 0x6d87f620, - 0x2ba9c: 0x6d87f820, 0x2ba9d: 0x6d87fa20, 0x2ba9e: 0x6d87fc20, 0x2ba9f: 0x6dac9e20, - 0x2baa0: 0x6dcca020, 0x2baa1: 0x6dcca220, 0x2baa2: 0x6de7aa20, 0x2baa3: 0x6dfe3820, - 0x2baa4: 0x6e10bc20, 0x2baa5: 0x6e444820, 0x2baa6: 0x6c256420, 0x2baa7: 0x6c256620, - 0x2baa8: 0x6c3d2e20, 0x2baa9: 0x6c3d3020, 0x2baaa: 0x6c3d3220, 0x2baab: 0x6c3d3420, - 0x2baac: 0x6c3d3620, 0x2baad: 0x6c3d3820, 0x2baae: 0x6c5b2e20, 0x2baaf: 0x6c5b3020, - 0x2bab0: 0x6c5b3220, 0x2bab1: 0x6c5b3420, 0x2bab2: 0x6c5b3620, 0x2bab3: 0x6c5b3820, - 0x2bab4: 0x6c5b3a20, 0x2bab5: 0x6c5b3c20, 0x2bab6: 0x6c7e3020, 0x2bab7: 0x6c7e3220, - 0x2bab8: 0x6c7e3420, 0x2bab9: 0x6c7e3620, 0x2baba: 0x6ca6f820, 0x2babb: 0x6ca6fa20, - 0x2babc: 0x6ca6fc20, 0x2babd: 0x6ca6fe20, 0x2babe: 0x6ca70020, 0x2babf: 0x6ca70220, - // Block 0xaeb, offset 0x2bac0 - 0x2bac0: 0x6ca70420, 0x2bac1: 0x6ca70620, 0x2bac2: 0x6ca70820, 0x2bac3: 0x6ca70a20, - 0x2bac4: 0x6ca70c20, 0x2bac5: 0x6ca70e20, 0x2bac6: 0x6ca71020, 0x2bac7: 0x6ca71220, - 0x2bac8: 0x6ca71420, 0x2bac9: 0x6ca71620, 0x2baca: 0x6ca71820, 0x2bacb: 0x6cd52e20, - 0x2bacc: 0x6cd53020, 0x2bacd: 0x6cd53220, 0x2bace: 0x6cd53420, 0x2bacf: 0x6cd53620, - 0x2bad0: 0x6cd53820, 0x2bad1: 0x6cd53a20, 0x2bad2: 0x6cd53c20, 0x2bad3: 0x6cd53e20, - 0x2bad4: 0x6d037c20, 0x2bad5: 0x6d037e20, 0x2bad6: 0x6d038020, 0x2bad7: 0x6d038220, - 0x2bad8: 0x6d038420, 0x2bad9: 0x6d038620, 0x2bada: 0x6d038820, 0x2badb: 0x6d038a20, - 0x2badc: 0x6d038c20, 0x2badd: 0x6d038e20, 0x2bade: 0x6d039020, 0x2badf: 0x6d039220, - 0x2bae0: 0x6d311a20, 0x2bae1: 0x6d311c20, 0x2bae2: 0x6d311e20, 0x2bae3: 0x6d312020, - 0x2bae4: 0x6d312220, 0x2bae5: 0x6d312420, 0x2bae6: 0x6d312620, 0x2bae7: 0x6d312820, - 0x2bae8: 0x6d312a20, 0x2bae9: 0x6d312c20, 0x2baea: 0x6d312e20, 0x2baeb: 0x6d313020, - 0x2baec: 0x6d5dd820, 0x2baed: 0x6d5dda20, 0x2baee: 0x6d5ddc20, 0x2baef: 0x6d5dde20, - 0x2baf0: 0x6d5de020, 0x2baf1: 0x6d5de220, 0x2baf2: 0x6d5de420, 0x2baf3: 0x6d5de620, - 0x2baf4: 0x6d5de820, 0x2baf5: 0x6d5dea20, 0x2baf6: 0x6d5dec20, 0x2baf7: 0x6d883420, - 0x2baf8: 0x6d883620, 0x2baf9: 0x6d883820, 0x2bafa: 0x6d883a20, 0x2bafb: 0x6d883c20, - 0x2bafc: 0x6d883e20, 0x2bafd: 0x6d884020, 0x2bafe: 0x6dacce20, 0x2baff: 0x6dacd020, - // Block 0xaec, offset 0x2bb00 - 0x2bb00: 0x6dacd220, 0x2bb01: 0x6dccc020, 0x2bb02: 0x6dccc220, 0x2bb03: 0x6dccc420, - 0x2bb04: 0x6dccc620, 0x2bb05: 0x6dccc820, 0x2bb06: 0x6dccca20, 0x2bb07: 0x6dcccc20, - 0x2bb08: 0x6dfe4620, 0x2bb09: 0x6dfe4820, 0x2bb0a: 0x6e10ca20, 0x2bb0b: 0x6e10cc20, - 0x2bb0c: 0x6e10ce20, 0x2bb0d: 0x6e10d020, 0x2bb0e: 0x6e1f6620, 0x2bb0f: 0x6e1f6820, - 0x2bb10: 0x6e453020, 0x2bb11: 0x6c257a20, 0x2bb12: 0x6c3d6820, 0x2bb13: 0x6c5b9220, - 0x2bb14: 0x6c5b9420, 0x2bb15: 0x6c5b9620, 0x2bb16: 0x6c5b9820, 0x2bb17: 0x6c7ea620, - 0x2bb18: 0x6c7ea820, 0x2bb19: 0x6c7eaa20, 0x2bb1a: 0x6ca77820, 0x2bb1b: 0x6ca77a20, - 0x2bb1c: 0x6ca77c20, 0x2bb1d: 0x6ca77e20, 0x2bb1e: 0x6ca78020, 0x2bb1f: 0x6ca78220, - 0x2bb20: 0x6ca78420, 0x2bb21: 0x6cd5a220, 0x2bb22: 0x6cd5a420, 0x2bb23: 0x6cd5a620, - 0x2bb24: 0x6cd5a820, 0x2bb25: 0x6cd5aa20, 0x2bb26: 0x6d042a20, 0x2bb27: 0x6d042c20, - 0x2bb28: 0x6d042e20, 0x2bb29: 0x6d043020, 0x2bb2a: 0x6d31c420, 0x2bb2b: 0x6d31c620, - 0x2bb2c: 0x6d5e6a20, 0x2bb2d: 0x6d5e6c20, 0x2bb2e: 0x6d5e6e20, 0x2bb2f: 0x6d88bc20, - 0x2bb30: 0x6d88be20, 0x2bb31: 0x6d88c020, 0x2bb32: 0x6d88c220, 0x2bb33: 0x6d88c420, - 0x2bb34: 0x6d88c620, 0x2bb35: 0x6dad4220, 0x2bb36: 0x6dad4420, 0x2bb37: 0x6dad4620, - 0x2bb38: 0x6dad4820, 0x2bb39: 0x6dad4a20, 0x2bb3a: 0x6dad4c20, 0x2bb3b: 0x6dad4e20, - 0x2bb3c: 0x6dcd1c20, 0x2bb3d: 0x6dcd1e20, 0x2bb3e: 0x6de7f220, 0x2bb3f: 0x6de7f420, - // Block 0xaed, offset 0x2bb40 - 0x2bb40: 0x6dfe8420, 0x2bb41: 0x6e1f7620, 0x2bb42: 0x6c140e20, 0x2bb43: 0x6c3d8c20, - 0x2bb44: 0x6c3d8e20, 0x2bb45: 0x6c5bd220, 0x2bb46: 0x6c5bd420, 0x2bb47: 0x6c7ef620, - 0x2bb48: 0x6c7ef820, 0x2bb49: 0x6c7efa20, 0x2bb4a: 0x6c7efc20, 0x2bb4b: 0x6ca7c620, - 0x2bb4c: 0x6cd60a20, 0x2bb4d: 0x6cd60c20, 0x2bb4e: 0x6d048620, 0x2bb4f: 0x6d048820, - 0x2bb50: 0x6d048a20, 0x2bb51: 0x6d048c20, 0x2bb52: 0x6d892020, 0x2bb53: 0x6dad8820, - 0x2bb54: 0x6dcd3820, 0x2bb55: 0x6de80620, 0x2bb56: 0x6c5bf620, 0x2bb57: 0x6c7f3220, - 0x2bb58: 0x6c7f3420, 0x2bb59: 0x6c7f3620, 0x2bb5a: 0x6c7f3820, 0x2bb5b: 0x6c7f3a20, - 0x2bb5c: 0x6c7f3c20, 0x2bb5d: 0x6c7f3e20, 0x2bb5e: 0x6ca7e820, 0x2bb5f: 0x6ca7ea20, - 0x2bb60: 0x6ca7ec20, 0x2bb61: 0x6ca7ee20, 0x2bb62: 0x6ca7f020, 0x2bb63: 0x6ca7f220, - 0x2bb64: 0x6ca7f420, 0x2bb65: 0x6ca7f620, 0x2bb66: 0x6ca7f820, 0x2bb67: 0x6cd63620, - 0x2bb68: 0x6cd63820, 0x2bb69: 0x6cd63a20, 0x2bb6a: 0x6cd63c20, 0x2bb6b: 0x6cd63e20, - 0x2bb6c: 0x6cd64020, 0x2bb6d: 0x6cd64220, 0x2bb6e: 0x6cd64420, 0x2bb6f: 0x6cd64620, - 0x2bb70: 0x6cd64820, 0x2bb71: 0x6cd64a20, 0x2bb72: 0x6cd64c20, 0x2bb73: 0x6cd64e20, - 0x2bb74: 0x6cd65020, 0x2bb75: 0x6d04b620, 0x2bb76: 0x6d04b820, 0x2bb77: 0x6d04ba20, - 0x2bb78: 0x6d04bc20, 0x2bb79: 0x6d04be20, 0x2bb7a: 0x6d04c020, 0x2bb7b: 0x6d04c220, - 0x2bb7c: 0x6d04c420, 0x2bb7d: 0x6d04c620, 0x2bb7e: 0x6d04c820, 0x2bb7f: 0x6d04ca20, - // Block 0xaee, offset 0x2bb80 - 0x2bb80: 0x6d04cc20, 0x2bb81: 0x6d323220, 0x2bb82: 0x6d323420, 0x2bb83: 0x6d323620, - 0x2bb84: 0x6d323820, 0x2bb85: 0x6d323a20, 0x2bb86: 0x6d323c20, 0x2bb87: 0x6d323e20, - 0x2bb88: 0x6d324020, 0x2bb89: 0x6d324220, 0x2bb8a: 0x6d324420, 0x2bb8b: 0x6d324620, - 0x2bb8c: 0x6d324820, 0x2bb8d: 0x6d324a20, 0x2bb8e: 0x6d5ecc20, 0x2bb8f: 0x6d5ece20, - 0x2bb90: 0x6d5ed020, 0x2bb91: 0x6d5ed220, 0x2bb92: 0x6d5ed420, 0x2bb93: 0x6d5ed620, - 0x2bb94: 0x6d5ed820, 0x2bb95: 0x6d5eda20, 0x2bb96: 0x6d5edc20, 0x2bb97: 0x6d5ede20, - 0x2bb98: 0x6d5ee020, 0x2bb99: 0x6d5ee220, 0x2bb9a: 0x6d5ee420, 0x2bb9b: 0x6d5ee620, - 0x2bb9c: 0x6d5ee820, 0x2bb9d: 0x6d5eea20, 0x2bb9e: 0x6d5eec20, 0x2bb9f: 0x6d5eee20, - 0x2bba0: 0x6d5ef020, 0x2bba1: 0x6d5ef220, 0x2bba2: 0x6d5ef420, 0x2bba3: 0x6d5ef620, - 0x2bba4: 0x6d5ef820, 0x2bba5: 0x6d5efa20, 0x2bba6: 0x6d5efc20, 0x2bba7: 0x6d5efe20, - 0x2bba8: 0x6d5f0020, 0x2bba9: 0x6d5f0220, 0x2bbaa: 0x6d892e20, 0x2bbab: 0x6d893020, - 0x2bbac: 0x6d893220, 0x2bbad: 0x6d893420, 0x2bbae: 0x6d893620, 0x2bbaf: 0x6d893820, - 0x2bbb0: 0x6d893a20, 0x2bbb1: 0x6d893c20, 0x2bbb2: 0x6d893e20, 0x2bbb3: 0x6d894020, - 0x2bbb4: 0x6d894220, 0x2bbb5: 0x6d894420, 0x2bbb6: 0x6d894620, 0x2bbb7: 0x6d894820, - 0x2bbb8: 0x6dada820, 0x2bbb9: 0x6dadaa20, 0x2bbba: 0x6dadac20, 0x2bbbb: 0x6dadae20, - 0x2bbbc: 0x6dadb020, 0x2bbbd: 0x6dadb220, 0x2bbbe: 0x6dadb420, 0x2bbbf: 0x6dadb620, - // Block 0xaef, offset 0x2bbc0 - 0x2bbc0: 0x6dadb820, 0x2bbc1: 0x6dadba20, 0x2bbc2: 0x6dadbc20, 0x2bbc3: 0x6dadbe20, - 0x2bbc4: 0x6dadc020, 0x2bbc5: 0x6dadc220, 0x2bbc6: 0x6dadc420, 0x2bbc7: 0x6dadc620, - 0x2bbc8: 0x6dcd4c20, 0x2bbc9: 0x6dcd4e20, 0x2bbca: 0x6dcd5020, 0x2bbcb: 0x6dcd5220, - 0x2bbcc: 0x6dcd5420, 0x2bbcd: 0x6dcd5620, 0x2bbce: 0x6dcd5820, 0x2bbcf: 0x6de81420, - 0x2bbd0: 0x6dcd5a20, 0x2bbd1: 0x6dcd5c20, 0x2bbd2: 0x6dcd5e20, 0x2bbd3: 0x6dcd6020, - 0x2bbd4: 0x6dcd6220, 0x2bbd5: 0x6dcd6420, 0x2bbd6: 0x6dcd6620, 0x2bbd7: 0x6dcd6820, - 0x2bbd8: 0x6dcd6a20, 0x2bbd9: 0x6dcd6c20, 0x2bbda: 0x6dcd6e20, 0x2bbdb: 0x6de81620, - 0x2bbdc: 0x6de81820, 0x2bbdd: 0x6de81a20, 0x2bbde: 0x6de81c20, 0x2bbdf: 0x6de81e20, - 0x2bbe0: 0x6de82020, 0x2bbe1: 0x6de82220, 0x2bbe2: 0x6de82420, 0x2bbe3: 0x6dcd7020, - 0x2bbe4: 0x6de82620, 0x2bbe5: 0x6dfeaa20, 0x2bbe6: 0x6e110820, 0x2bbe7: 0x6e110a20, - 0x2bbe8: 0x6e110c20, 0x2bbe9: 0x6e110e20, 0x2bbea: 0x6e111020, 0x2bbeb: 0x6e111220, - 0x2bbec: 0x6e111420, 0x2bbed: 0x6e111620, 0x2bbee: 0x6e1f8620, 0x2bbef: 0x6e1f8820, - 0x2bbf0: 0x6e1f8a20, 0x2bbf1: 0x6e1f8c20, 0x2bbf2: 0x6e2ac620, 0x2bbf3: 0x6e2ac820, - 0x2bbf4: 0x6e2aca20, 0x2bbf5: 0x6e2e7820, 0x2bbf6: 0x6e335220, 0x2bbf7: 0x6e3dac20, - 0x2bbf8: 0x6e408e20, 0x2bbf9: 0x6e453220, 0x2bbfa: 0x6c5c2e20, 0x2bbfb: 0x6c7faa20, - 0x2bbfc: 0x6c7fac20, 0x2bbfd: 0x6ca89220, 0x2bbfe: 0x6ca89420, 0x2bbff: 0x6ca89620, - // Block 0xaf0, offset 0x2bc00 - 0x2bc00: 0x6ca89820, 0x2bc01: 0x6cd6e020, 0x2bc02: 0x6cd6e220, 0x2bc03: 0x6cd6e420, - 0x2bc04: 0x6cd6e620, 0x2bc05: 0x6cd6e820, 0x2bc06: 0x6cd6ea20, 0x2bc07: 0x6d059820, - 0x2bc08: 0x6d059a20, 0x2bc09: 0x6d059c20, 0x2bc0a: 0x6d059e20, 0x2bc0b: 0x6d05a020, - 0x2bc0c: 0x6d05a220, 0x2bc0d: 0x6d333820, 0x2bc0e: 0x6d333a20, 0x2bc0f: 0x6d333c20, - 0x2bc10: 0x6d333e20, 0x2bc11: 0x6d334020, 0x2bc12: 0x6d334220, 0x2bc13: 0x6d5fee20, - 0x2bc14: 0x6d5ff020, 0x2bc15: 0x6d5ff220, 0x2bc16: 0x6d5ff420, 0x2bc17: 0x6d5ff620, - 0x2bc18: 0x6d5ff820, 0x2bc19: 0x6d5ffa20, 0x2bc1a: 0x6d8a5220, 0x2bc1b: 0x6d8a5420, - 0x2bc1c: 0x6daec620, 0x2bc1d: 0x6daec820, 0x2bc1e: 0x6daeca20, 0x2bc1f: 0x6daecc20, - 0x2bc20: 0x6daece20, 0x2bc21: 0x6daed020, 0x2bc22: 0x6daed220, 0x2bc23: 0x6dce6420, - 0x2bc24: 0x6dce6620, 0x2bc25: 0x6dce6820, 0x2bc26: 0x6dce6a20, 0x2bc27: 0x6dce6c20, - 0x2bc28: 0x6dce6e20, 0x2bc29: 0x6dce7020, 0x2bc2a: 0x6de8c220, 0x2bc2b: 0x6de8c420, - 0x2bc2c: 0x6de8c620, 0x2bc2d: 0x6dff1c20, 0x2bc2e: 0x6dff1e20, 0x2bc2f: 0x6e118a20, - 0x2bc30: 0x6e1fe220, 0x2bc31: 0x6e2b0420, 0x2bc32: 0x6e2b0620, 0x2bc33: 0x6e398420, - 0x2bc34: 0x6e398620, 0x2bc35: 0x6c3dba20, 0x2bc36: 0x6c5c5e20, 0x2bc37: 0x6c5c6020, - 0x2bc38: 0x6c5c6220, 0x2bc39: 0x6c5c6420, 0x2bc3a: 0x6c7fee20, 0x2bc3b: 0x6c7ff020, - 0x2bc3c: 0x6c7ff220, 0x2bc3d: 0x6c7ff420, 0x2bc3e: 0x6c7ff620, 0x2bc3f: 0x6c7ff820, - // Block 0xaf1, offset 0x2bc40 - 0x2bc40: 0x6c7ffa20, 0x2bc41: 0x6c7ffc20, 0x2bc42: 0x6c7ffe20, 0x2bc43: 0x6c800020, - 0x2bc44: 0x6c800220, 0x2bc45: 0x6c800420, 0x2bc46: 0x6c800620, 0x2bc47: 0x6c800820, - 0x2bc48: 0x6ca8f220, 0x2bc49: 0x6ca8f420, 0x2bc4a: 0x6ca8f620, 0x2bc4b: 0x6ca8f820, - 0x2bc4c: 0x6ca8fa20, 0x2bc4d: 0x6ca8fc20, 0x2bc4e: 0x6ca8fe20, 0x2bc4f: 0x6ca90020, - 0x2bc50: 0x6ca90220, 0x2bc51: 0x6ca90420, 0x2bc52: 0x6ca90620, 0x2bc53: 0x6ca90820, - 0x2bc54: 0x6ca90a20, 0x2bc55: 0x6cd74620, 0x2bc56: 0x6cd74820, 0x2bc57: 0x6cd74a20, - 0x2bc58: 0x6cd74c20, 0x2bc59: 0x6cd74e20, 0x2bc5a: 0x6cd75020, 0x2bc5b: 0x6cd75220, - 0x2bc5c: 0x6cd75420, 0x2bc5d: 0x6cd75620, 0x2bc5e: 0x6cd75820, 0x2bc5f: 0x6d060420, - 0x2bc60: 0x6d060620, 0x2bc61: 0x6d060820, 0x2bc62: 0x6d060a20, 0x2bc63: 0x6d060c20, - 0x2bc64: 0x6d060e20, 0x2bc65: 0x6d061020, 0x2bc66: 0x6d061220, 0x2bc67: 0x6d33b820, - 0x2bc68: 0x6d33ba20, 0x2bc69: 0x6d33bc20, 0x2bc6a: 0x6d33be20, 0x2bc6b: 0x6d33c020, - 0x2bc6c: 0x6d33c220, 0x2bc6d: 0x6d33c420, 0x2bc6e: 0x6d33c620, 0x2bc6f: 0x6d33c820, - 0x2bc70: 0x6d33ca20, 0x2bc71: 0x6d33cc20, 0x2bc72: 0x6d33ce20, 0x2bc73: 0x6d606420, - 0x2bc74: 0x6d606620, 0x2bc75: 0x6d606820, 0x2bc76: 0x6d606a20, 0x2bc77: 0x6d606c20, - 0x2bc78: 0x6d606e20, 0x2bc79: 0x6d607020, 0x2bc7a: 0x6d607220, 0x2bc7b: 0x6d607420, - 0x2bc7c: 0x6d607620, 0x2bc7d: 0x6d607820, 0x2bc7e: 0x6d607a20, 0x2bc7f: 0x6d607c20, - // Block 0xaf2, offset 0x2bc80 - 0x2bc80: 0x6d607e20, 0x2bc81: 0x6d608020, 0x2bc82: 0x6d608220, 0x2bc83: 0x6d608420, - 0x2bc84: 0x6d608620, 0x2bc85: 0x6d8aac20, 0x2bc86: 0x6d8aae20, 0x2bc87: 0x6d8ab020, - 0x2bc88: 0x6d8ab220, 0x2bc89: 0x6d8ab420, 0x2bc8a: 0x6d8ab620, 0x2bc8b: 0x6d8ab820, - 0x2bc8c: 0x6daf2020, 0x2bc8d: 0x6daf2220, 0x2bc8e: 0x6daf2420, 0x2bc8f: 0x6daf2620, - 0x2bc90: 0x6daf2820, 0x2bc91: 0x6daf2a20, 0x2bc92: 0x6daf2c20, 0x2bc93: 0x6daf2e20, - 0x2bc94: 0x6daf3020, 0x2bc95: 0x6daf3220, 0x2bc96: 0x6dcec020, 0x2bc97: 0x6dcec220, - 0x2bc98: 0x6dcec420, 0x2bc99: 0x6dcec620, 0x2bc9a: 0x6dcec820, 0x2bc9b: 0x6dceca20, - 0x2bc9c: 0x6de90c20, 0x2bc9d: 0x6de90e20, 0x2bc9e: 0x6de91020, 0x2bc9f: 0x6de91220, - 0x2bca0: 0x6de91420, 0x2bca1: 0x6de91620, 0x2bca2: 0x6de91820, 0x2bca3: 0x6dff3820, - 0x2bca4: 0x6dff3a20, 0x2bca5: 0x6dff3c20, 0x2bca6: 0x6dff3e20, 0x2bca7: 0x6dff4020, - 0x2bca8: 0x6e11a620, 0x2bca9: 0x6e11a820, 0x2bcaa: 0x6e200020, 0x2bcab: 0x6e200220, - 0x2bcac: 0x6e200420, 0x2bcad: 0x6e200620, 0x2bcae: 0x6e2b1420, 0x2bcaf: 0x6e338a20, - 0x2bcb0: 0x6e338c20, 0x2bcb1: 0x6e338e20, 0x2bcb2: 0x6e339020, 0x2bcb3: 0x6e399420, - 0x2bcb4: 0x6e399620, 0x2bcb5: 0x6e40a420, 0x2bcb6: 0x6c5c9820, 0x2bcb7: 0x6ca99e20, - 0x2bcb8: 0x6c809c20, 0x2bcb9: 0x6ca9a020, 0x2bcba: 0x6cd80e20, 0x2bcbb: 0x6cd81020, - 0x2bcbc: 0x6d06cc20, 0x2bcbd: 0x6d34c620, 0x2bcbe: 0x6d617c20, 0x2bcbf: 0x6d617e20, - // Block 0xaf3, offset 0x2bcc0 - 0x2bcc0: 0x6d8b9420, 0x2bcc1: 0x6de9a020, 0x2bcc2: 0x6c5cc420, 0x2bcc3: 0x6c80c420, - 0x2bcc4: 0x6ca9e220, 0x2bcc5: 0x6ca9e420, 0x2bcc6: 0x6ca9e620, 0x2bcc7: 0x6ca9e820, - 0x2bcc8: 0x6ca9ea20, 0x2bcc9: 0x6ca9ec20, 0x2bcca: 0x6cd85220, 0x2bccb: 0x6d34e020, - 0x2bccc: 0x6d34e220, 0x2bccd: 0x6d8ba620, 0x2bcce: 0x6e2b3220, 0x2bccf: 0x6c0a4820, - 0x2bcd0: 0x6c3e0220, 0x2bcd1: 0x6c5cce20, 0x2bcd2: 0x6c5cd020, 0x2bcd3: 0x6c5cd220, - 0x2bcd4: 0x6c5cd420, 0x2bcd5: 0x6c80d220, 0x2bcd6: 0x6c80d420, 0x2bcd7: 0x6c80d620, - 0x2bcd8: 0x6ca9fe20, 0x2bcd9: 0x6cd86420, 0x2bcda: 0x6cd86620, 0x2bcdb: 0x6d06fc20, - 0x2bcdc: 0x6d06fe20, 0x2bcdd: 0x6d070020, 0x2bcde: 0x6d34fc20, 0x2bcdf: 0x6d34fe20, - 0x2bce0: 0x6d8bba20, 0x2bce1: 0x6d8bbc20, 0x2bce2: 0x6db00620, 0x2bce3: 0x6dcf8c20, - 0x2bce4: 0x6de9b420, 0x2bce5: 0x6e120820, 0x2bce6: 0x6e33ae20, 0x2bce7: 0x6c812420, - 0x2bce8: 0x6c812620, 0x2bce9: 0x6c812820, 0x2bcea: 0x6caa2a20, 0x2bceb: 0x6caa2c20, - 0x2bcec: 0x6caa2e20, 0x2bced: 0x6caa3020, 0x2bcee: 0x6cd88220, 0x2bcef: 0x6cd88420, - 0x2bcf0: 0x6cd88620, 0x2bcf1: 0x6d074620, 0x2bcf2: 0x6d352e20, 0x2bcf3: 0x6d353020, - 0x2bcf4: 0x6d353220, 0x2bcf5: 0x6d353420, 0x2bcf6: 0x6d353620, 0x2bcf7: 0x6d61ca20, - 0x2bcf8: 0x6d8bf220, 0x2bcf9: 0x6d8bf420, 0x2bcfa: 0x6db02c20, 0x2bcfb: 0x6dcfa820, - 0x2bcfc: 0x6dcfaa20, 0x2bcfd: 0x6e204220, 0x2bcfe: 0x6c815620, 0x2bcff: 0x6c815820, - // Block 0xaf4, offset 0x2bd00 - 0x2bd00: 0x6caa6e20, 0x2bd01: 0x6caa7020, 0x2bd02: 0x6caa7220, 0x2bd03: 0x6caa7420, - 0x2bd04: 0x6caa7620, 0x2bd05: 0x6caa7820, 0x2bd06: 0x6caa7a20, 0x2bd07: 0x6cd8aa20, - 0x2bd08: 0x6cd8ac20, 0x2bd09: 0x6cd8ae20, 0x2bd0a: 0x6cd8b020, 0x2bd0b: 0x6d077c20, - 0x2bd0c: 0x6d077e20, 0x2bd0d: 0x6d078020, 0x2bd0e: 0x6d078220, 0x2bd0f: 0x6d355020, - 0x2bd10: 0x6d355220, 0x2bd11: 0x6d355420, 0x2bd12: 0x6d355620, 0x2bd13: 0x6d355820, - 0x2bd14: 0x6d8c0c20, 0x2bd15: 0x6d8c0e20, 0x2bd16: 0x6dcfd820, 0x2bd17: 0x6dcfda20, - 0x2bd18: 0x6dcfdc20, 0x2bd19: 0x6dffb220, 0x2bd1a: 0x6e122220, 0x2bd1b: 0x6c5d2e20, - 0x2bd1c: 0x6cd8f220, 0x2bd1d: 0x6cd8f420, 0x2bd1e: 0x6cd8f620, 0x2bd1f: 0x6c5d3a20, - 0x2bd20: 0x6c5d3c20, 0x2bd21: 0x6c81a620, 0x2bd22: 0x6c5d4820, 0x2bd23: 0x6caaba20, - 0x2bd24: 0x6d07b020, 0x2bd25: 0x6d07b220, 0x2bd26: 0x6d359420, 0x2bd27: 0x6d359620, - 0x2bd28: 0x6d359820, 0x2bd29: 0x6d359a20, 0x2bd2a: 0x6d359c20, 0x2bd2b: 0x6d624c20, - 0x2bd2c: 0x6d624e20, 0x2bd2d: 0x6db07e20, 0x2bd2e: 0x6db08020, 0x2bd2f: 0x6db08220, - 0x2bd30: 0x6dd01020, 0x2bd31: 0x6e122c20, 0x2bd32: 0x6c25e420, 0x2bd33: 0x6c81b620, - 0x2bd34: 0x6c81b820, 0x2bd35: 0x6caad020, 0x2bd36: 0x6caad220, 0x2bd37: 0x6cd90e20, - 0x2bd38: 0x6d07c020, 0x2bd39: 0x6d07c220, 0x2bd3a: 0x6d35ba20, 0x2bd3b: 0x6d35bc20, - 0x2bd3c: 0x6d35be20, 0x2bd3d: 0x6d35c020, 0x2bd3e: 0x6d35c220, 0x2bd3f: 0x6d626820, - // Block 0xaf5, offset 0x2bd40 - 0x2bd40: 0x6d626a20, 0x2bd41: 0x6d8c6220, 0x2bd42: 0x6d8c6420, 0x2bd43: 0x6d8c6620, - 0x2bd44: 0x6db09820, 0x2bd45: 0x6db09a20, 0x2bd46: 0x6db09c20, 0x2bd47: 0x6db09e20, - 0x2bd48: 0x6dd02a20, 0x2bd49: 0x6dffc620, 0x2bd4a: 0x6e205c20, 0x2bd4b: 0x6d07fc20, - 0x2bd4c: 0x6c145820, 0x2bd4d: 0x6c145a20, 0x2bd4e: 0x6c25ea20, 0x2bd4f: 0x6c25ec20, - 0x2bd50: 0x6c3e6220, 0x2bd51: 0x6c81fe20, 0x2bd52: 0x6c3e6420, 0x2bd53: 0x6c3e6620, - 0x2bd54: 0x6c3e6820, 0x2bd55: 0x6c3e6a20, 0x2bd56: 0x6c3e6c20, 0x2bd57: 0x6c3e6e20, - 0x2bd58: 0x6c3e7020, 0x2bd59: 0x6c3e7220, 0x2bd5a: 0x6c3e7420, 0x2bd5b: 0x6c3e7620, - 0x2bd5c: 0x6c3e7820, 0x2bd5d: 0x6c3e7a20, 0x2bd5e: 0x6c5d6220, 0x2bd5f: 0x6c5d6420, - 0x2bd60: 0x6c5d6620, 0x2bd61: 0x6c5d6820, 0x2bd62: 0x6c5d6a20, 0x2bd63: 0x6c5d6c20, - 0x2bd64: 0x6c5d6e20, 0x2bd65: 0x6c5d7020, 0x2bd66: 0x6c820020, 0x2bd67: 0x6c820220, - 0x2bd68: 0x6c820420, 0x2bd69: 0x6c820620, 0x2bd6a: 0x6c820820, 0x2bd6b: 0x6c820a20, - 0x2bd6c: 0x6c820c20, 0x2bd6d: 0x6c820e20, 0x2bd6e: 0x6c821020, 0x2bd6f: 0x6cab1220, - 0x2bd70: 0x6cab1420, 0x2bd71: 0x6cab1620, 0x2bd72: 0x6cab1820, 0x2bd73: 0x6cab1a20, - 0x2bd74: 0x6cab1c20, 0x2bd75: 0x6cab1e20, 0x2bd76: 0x6cab2020, 0x2bd77: 0x6cab2220, - 0x2bd78: 0x6cab2420, 0x2bd79: 0x6cab2620, 0x2bd7a: 0x6cab2820, 0x2bd7b: 0x6cab2a20, - 0x2bd7c: 0x6cd95c20, 0x2bd7d: 0x6cd95e20, 0x2bd7e: 0x6cd96020, 0x2bd7f: 0x6cd96220, - // Block 0xaf6, offset 0x2bd80 - 0x2bd80: 0x6cd96420, 0x2bd81: 0x6cd96620, 0x2bd82: 0x6cd96820, 0x2bd83: 0x6cd96a20, - 0x2bd84: 0x6cd96c20, 0x2bd85: 0x6cd96e20, 0x2bd86: 0x6cd97020, 0x2bd87: 0x6cd97220, - 0x2bd88: 0x6cd97420, 0x2bd89: 0x6cd97620, 0x2bd8a: 0x6cd97820, 0x2bd8b: 0x6cd97a20, - 0x2bd8c: 0x6cd97c20, 0x2bd8d: 0x6d080a20, 0x2bd8e: 0x6d080c20, 0x2bd8f: 0x6d080e20, - 0x2bd90: 0x6d081020, 0x2bd91: 0x6d081220, 0x2bd92: 0x6d081420, 0x2bd93: 0x6d081620, - 0x2bd94: 0x6d081820, 0x2bd95: 0x6d081a20, 0x2bd96: 0x6d081c20, 0x2bd97: 0x6d081e20, - 0x2bd98: 0x6d082020, 0x2bd99: 0x6d082220, 0x2bd9a: 0x6d082420, 0x2bd9b: 0x6d082620, - 0x2bd9c: 0x6d361c20, 0x2bd9d: 0x6d361e20, 0x2bd9e: 0x6d362020, 0x2bd9f: 0x6d362220, - 0x2bda0: 0x6d362420, 0x2bda1: 0x6d8c9e20, 0x2bda2: 0x6d362620, 0x2bda3: 0x6d362820, - 0x2bda4: 0x6d362a20, 0x2bda5: 0x6d362c20, 0x2bda6: 0x6d362e20, 0x2bda7: 0x6d363020, - 0x2bda8: 0x6d363220, 0x2bda9: 0x6d363420, 0x2bdaa: 0x6d363620, 0x2bdab: 0x6d62bc20, - 0x2bdac: 0x6d62be20, 0x2bdad: 0x6d62c020, 0x2bdae: 0x6d62c220, 0x2bdaf: 0x6d62c420, - 0x2bdb0: 0x6d62c620, 0x2bdb1: 0x6d62c820, 0x2bdb2: 0x6d62ca20, 0x2bdb3: 0x6d62cc20, - 0x2bdb4: 0x6d62ce20, 0x2bdb5: 0x6d8ca220, 0x2bdb6: 0x6d8ca420, 0x2bdb7: 0x6d8ca620, - 0x2bdb8: 0x6d8ca820, 0x2bdb9: 0x6d8caa20, 0x2bdba: 0x6d8cac20, 0x2bdbb: 0x6d8cae20, - 0x2bdbc: 0x6d8cb020, 0x2bdbd: 0x6d8cb220, 0x2bdbe: 0x6db0d620, 0x2bdbf: 0x6db0d820, - // Block 0xaf7, offset 0x2bdc0 - 0x2bdc0: 0x6db0da20, 0x2bdc1: 0x6db0dc20, 0x2bdc2: 0x6dd05e20, 0x2bdc3: 0x6dd06020, - 0x2bdc4: 0x6dd06220, 0x2bdc5: 0x6dd06420, 0x2bdc6: 0x6dea2020, 0x2bdc7: 0x6dea2220, - 0x2bdc8: 0x6dea2420, 0x2bdc9: 0x6dffe020, 0x2bdca: 0x6dffe220, 0x2bdcb: 0x6e124020, - 0x2bdcc: 0x6e124220, 0x2bdcd: 0x6e124420, 0x2bdce: 0x6e124620, 0x2bdcf: 0x6e206820, - 0x2bdd0: 0x6cabdc20, 0x2bdd1: 0x6dd0b020, 0x2bdd2: 0x6c5e4020, 0x2bdd3: 0x6d08fc20, - 0x2bdd4: 0x6c82fa20, 0x2bdd5: 0x6cabf220, 0x2bdd6: 0x6d370020, 0x2bdd7: 0x6d637020, - 0x2bdd8: 0x6d8d7420, 0x2bdd9: 0x6c831020, 0x2bdda: 0x6c831220, 0x2bddb: 0x6cac0420, - 0x2bddc: 0x6d638620, 0x2bddd: 0x6d372e20, 0x2bdde: 0x6d8d9620, 0x2bddf: 0x6e126a20, - 0x2bde0: 0x6c3f3420, 0x2bde1: 0x6c5e5a20, 0x2bde2: 0x6c5e5c20, 0x2bde3: 0x6c5e5e20, - 0x2bde4: 0x6c832820, 0x2bde5: 0x6c832a20, 0x2bde6: 0x6cac1020, 0x2bde7: 0x6cac1220, - 0x2bde8: 0x6cac1420, 0x2bde9: 0x6cac1620, 0x2bdea: 0x6cdac020, 0x2bdeb: 0x6cdac220, - 0x2bdec: 0x6cdac420, 0x2bded: 0x6cdac620, 0x2bdee: 0x6cdac820, 0x2bdef: 0x6d091e20, - 0x2bdf0: 0x6d092020, 0x2bdf1: 0x6d373220, 0x2bdf2: 0x6d373420, 0x2bdf3: 0x6d373620, - 0x2bdf4: 0x6d373820, 0x2bdf5: 0x6d373a20, 0x2bdf6: 0x6d373c20, 0x2bdf7: 0x6d373e20, - 0x2bdf8: 0x6d374020, 0x2bdf9: 0x6d639c20, 0x2bdfa: 0x6d639e20, 0x2bdfb: 0x6d63a020, - 0x2bdfc: 0x6d8d9820, 0x2bdfd: 0x6d8d9a20, 0x2bdfe: 0x6d8d9c20, 0x2bdff: 0x6db18e20, - // Block 0xaf8, offset 0x2be00 - 0x2be00: 0x6db19020, 0x2be01: 0x6db19220, 0x2be02: 0x6db19420, 0x2be03: 0x6db19620, - 0x2be04: 0x6db19820, 0x2be05: 0x6db19a20, 0x2be06: 0x6dd0dc20, 0x2be07: 0x6dd0de20, - 0x2be08: 0x6dd0e020, 0x2be09: 0x6e003420, 0x2be0a: 0x6c5e7a20, 0x2be0b: 0x6cac4c20, - 0x2be0c: 0x6d8dca20, 0x2be0d: 0x6d8dcc20, 0x2be0e: 0x6dd11820, 0x2be0f: 0x6dd11a20, - 0x2be10: 0x6e209c20, 0x2be11: 0x6c149c20, 0x2be12: 0x6c3f4620, 0x2be13: 0x6c3f4820, - 0x2be14: 0x6c3f4a20, 0x2be15: 0x6c5e7e20, 0x2be16: 0x6c5e8020, 0x2be17: 0x6c5e8220, - 0x2be18: 0x6c5e8420, 0x2be19: 0x6c5e8620, 0x2be1a: 0x6c836020, 0x2be1b: 0x6c836220, - 0x2be1c: 0x6c836420, 0x2be1d: 0x6c836620, 0x2be1e: 0x6c836820, 0x2be1f: 0x6c836a20, - 0x2be20: 0x6c836c20, 0x2be21: 0x6c836e20, 0x2be22: 0x6c837020, 0x2be23: 0x6c837220, - 0x2be24: 0x6c837420, 0x2be25: 0x6c837620, 0x2be26: 0x6cac5c20, 0x2be27: 0x6cac5e20, - 0x2be28: 0x6cac6020, 0x2be29: 0x6cac6220, 0x2be2a: 0x6cac6420, 0x2be2b: 0x6cac6620, - 0x2be2c: 0x6cac6820, 0x2be2d: 0x6cac6a20, 0x2be2e: 0x6cac6c20, 0x2be2f: 0x6cac6e20, - 0x2be30: 0x6cdaf220, 0x2be31: 0x6cdaf420, 0x2be32: 0x6cdaf620, 0x2be33: 0x6cdaf820, - 0x2be34: 0x6cdafa20, 0x2be35: 0x6cdafc20, 0x2be36: 0x6cdafe20, 0x2be37: 0x6cdb0020, - 0x2be38: 0x6cdb0220, 0x2be39: 0x6cdb0420, 0x2be3a: 0x6cdb0620, 0x2be3b: 0x6cdb0820, - 0x2be3c: 0x6cdb0a20, 0x2be3d: 0x6cdb0c20, 0x2be3e: 0x6cdb0e20, 0x2be3f: 0x6cdb1020, - // Block 0xaf9, offset 0x2be40 - 0x2be40: 0x6cdb1220, 0x2be41: 0x6cdb1420, 0x2be42: 0x6d095a20, 0x2be43: 0x6d095c20, - 0x2be44: 0x6d095e20, 0x2be45: 0x6d096020, 0x2be46: 0x6d096220, 0x2be47: 0x6d096420, - 0x2be48: 0x6d096620, 0x2be49: 0x6d096820, 0x2be4a: 0x6d096a20, 0x2be4b: 0x6d096c20, - 0x2be4c: 0x6d096e20, 0x2be4d: 0x6d097020, 0x2be4e: 0x6d097220, 0x2be4f: 0x6d097420, - 0x2be50: 0x6d097620, 0x2be51: 0x6d097820, 0x2be52: 0x6d097a20, 0x2be53: 0x6d097c20, - 0x2be54: 0x6d097e20, 0x2be55: 0x6d378020, 0x2be56: 0x6d098020, 0x2be57: 0x6d378220, - 0x2be58: 0x6d378420, 0x2be59: 0x6d378620, 0x2be5a: 0x6d378820, 0x2be5b: 0x6d378a20, - 0x2be5c: 0x6d378c20, 0x2be5d: 0x6d378e20, 0x2be5e: 0x6d379020, 0x2be5f: 0x6d379220, - 0x2be60: 0x6d379420, 0x2be61: 0x6d379620, 0x2be62: 0x6d379820, 0x2be63: 0x6d379a20, - 0x2be64: 0x6d379c20, 0x2be65: 0x6d379e20, 0x2be66: 0x6d37a020, 0x2be67: 0x6d37a220, - 0x2be68: 0x6d37a420, 0x2be69: 0x6d37a620, 0x2be6a: 0x6d37a820, 0x2be6b: 0x6d37aa20, - 0x2be6c: 0x6d37ac20, 0x2be6d: 0x6d37ae20, 0x2be6e: 0x6d63f220, 0x2be6f: 0x6d63f420, - 0x2be70: 0x6d63f620, 0x2be71: 0x6d63f820, 0x2be72: 0x6d63fa20, 0x2be73: 0x6d63fc20, - 0x2be74: 0x6d63fe20, 0x2be75: 0x6d640020, 0x2be76: 0x6d640220, 0x2be77: 0x6d640420, - 0x2be78: 0x6d640620, 0x2be79: 0x6d640820, 0x2be7a: 0x6d640a20, 0x2be7b: 0x6d640c20, - 0x2be7c: 0x6d8dda20, 0x2be7d: 0x6d8ddc20, 0x2be7e: 0x6d8dde20, 0x2be7f: 0x6d8de020, - // Block 0xafa, offset 0x2be80 - 0x2be80: 0x6d8de220, 0x2be81: 0x6d8de420, 0x2be82: 0x6d8de620, 0x2be83: 0x6d8de820, - 0x2be84: 0x6d8dea20, 0x2be85: 0x6d8dec20, 0x2be86: 0x6d8dee20, 0x2be87: 0x6d8df020, - 0x2be88: 0x6d8df220, 0x2be89: 0x6d8df420, 0x2be8a: 0x6d8df620, 0x2be8b: 0x6d8df820, - 0x2be8c: 0x6d8dfa20, 0x2be8d: 0x6d8dfc20, 0x2be8e: 0x6db1c020, 0x2be8f: 0x6db1c220, - 0x2be90: 0x6db1c420, 0x2be91: 0x6db1c620, 0x2be92: 0x6db1c820, 0x2be93: 0x6db1ca20, - 0x2be94: 0x6db1cc20, 0x2be95: 0x6db1ce20, 0x2be96: 0x6db1d020, 0x2be97: 0x6db1d220, - 0x2be98: 0x6db1d420, 0x2be99: 0x6db1d620, 0x2be9a: 0x6db1d820, 0x2be9b: 0x6db1da20, - 0x2be9c: 0x6db1dc20, 0x2be9d: 0x6db1de20, 0x2be9e: 0x6db1e020, 0x2be9f: 0x6db1e220, - 0x2bea0: 0x6db1e420, 0x2bea1: 0x6db1e620, 0x2bea2: 0x6db1e820, 0x2bea3: 0x6db1ea20, - 0x2bea4: 0x6db1ec20, 0x2bea5: 0x6db1ee20, 0x2bea6: 0x6db1f020, 0x2bea7: 0x6db1f220, - 0x2bea8: 0x6db1f420, 0x2bea9: 0x6db1f620, 0x2beaa: 0x6db1f820, 0x2beab: 0x6db1fa20, - 0x2beac: 0x6db1fc20, 0x2bead: 0x6dd11c20, 0x2beae: 0x6dd11e20, 0x2beaf: 0x6dd12020, - 0x2beb0: 0x6dd12220, 0x2beb1: 0x6dd12420, 0x2beb2: 0x6dd12620, 0x2beb3: 0x6dd12820, - 0x2beb4: 0x6dd12a20, 0x2beb5: 0x6dd12c20, 0x2beb6: 0x6dd12e20, 0x2beb7: 0x6dd13020, - 0x2beb8: 0x6dd13220, 0x2beb9: 0x6dd13420, 0x2beba: 0x6dd13620, 0x2bebb: 0x6dd13820, - 0x2bebc: 0x6dd13a20, 0x2bebd: 0x6dd13c20, 0x2bebe: 0x6dd13e20, 0x2bebf: 0x6dd14020, - // Block 0xafb, offset 0x2bec0 - 0x2bec0: 0x6dd14220, 0x2bec1: 0x6dd14420, 0x2bec2: 0x6dd14620, 0x2bec3: 0x6dd14820, - 0x2bec4: 0x6dd14a20, 0x2bec5: 0x6deaa420, 0x2bec6: 0x6deaa620, 0x2bec7: 0x6deaa820, - 0x2bec8: 0x6deaaa20, 0x2bec9: 0x6deaac20, 0x2beca: 0x6deaae20, 0x2becb: 0x6deab020, - 0x2becc: 0x6deab220, 0x2becd: 0x6deab420, 0x2bece: 0x6deab620, 0x2becf: 0x6deab820, - 0x2bed0: 0x6deaba20, 0x2bed1: 0x6deabc20, 0x2bed2: 0x6e005220, 0x2bed3: 0x6e005420, - 0x2bed4: 0x6e005620, 0x2bed5: 0x6e005820, 0x2bed6: 0x6e005a20, 0x2bed7: 0x6e005c20, - 0x2bed8: 0x6e005e20, 0x2bed9: 0x6e006020, 0x2beda: 0x6e006220, 0x2bedb: 0x6e006420, - 0x2bedc: 0x6e006620, 0x2bedd: 0x6e006820, 0x2bede: 0x6e127a20, 0x2bedf: 0x6e127c20, - 0x2bee0: 0x6e127e20, 0x2bee1: 0x6e128020, 0x2bee2: 0x6e128220, 0x2bee3: 0x6e128420, - 0x2bee4: 0x6e128620, 0x2bee5: 0x6e128820, 0x2bee6: 0x6e209e20, 0x2bee7: 0x6e20a020, - 0x2bee8: 0x6e20a220, 0x2bee9: 0x6e20a420, 0x2beea: 0x6e20a620, 0x2beeb: 0x6e20a820, - 0x2beec: 0x6e20aa20, 0x2beed: 0x6e20ac20, 0x2beee: 0x6e20ae20, 0x2beef: 0x6e20b020, - 0x2bef0: 0x6e20b220, 0x2bef1: 0x6e20b420, 0x2bef2: 0x6e20b620, 0x2bef3: 0x6e2b7420, - 0x2bef4: 0x6e2b7620, 0x2bef5: 0x6e2b7820, 0x2bef6: 0x6e2b7a20, 0x2bef7: 0x6e2b7c20, - 0x2bef8: 0x6e33e620, 0x2bef9: 0x6e33e820, 0x2befa: 0x6e33ea20, 0x2befb: 0x6e39c420, - 0x2befc: 0x6e39c620, 0x2befd: 0x6e39c820, 0x2befe: 0x6e3df220, 0x2beff: 0x6e40c820, - // Block 0xafc, offset 0x2bf00 - 0x2bf00: 0x6e40ca20, 0x2bf01: 0x6e42ee20, 0x2bf02: 0x6e446020, 0x2bf03: 0x6e446220, - 0x2bf04: 0x6e446420, 0x2bf05: 0x6e454820, 0x2bf06: 0x6e454a20, 0x2bf07: 0x6e46ce20, - 0x2bf08: 0x6c400e20, 0x2bf09: 0x6c5f9420, 0x2bf0a: 0x6c84c620, 0x2bf0b: 0x6c84c820, - 0x2bf0c: 0x6c84ca20, 0x2bf0d: 0x6c84cc20, 0x2bf0e: 0x6cae2220, 0x2bf0f: 0x6cae2420, - 0x2bf10: 0x6cdd4820, 0x2bf11: 0x6cdd4a20, 0x2bf12: 0x6d0bc220, 0x2bf13: 0x6d0bc420, - 0x2bf14: 0x6d0bc620, 0x2bf15: 0x6d0bc820, 0x2bf16: 0x6d0bca20, 0x2bf17: 0x6d65f420, - 0x2bf18: 0x6d8fc820, 0x2bf19: 0x6db39820, 0x2bf1a: 0x6dd29620, 0x2bf1b: 0x6dd29820, - 0x2bf1c: 0x6debd220, 0x2bf1d: 0x6c268820, 0x2bf1e: 0x6c5fa220, 0x2bf1f: 0x6c5fa420, - 0x2bf20: 0x6c5fa620, 0x2bf21: 0x6c84de20, 0x2bf22: 0x6c84e020, 0x2bf23: 0x6c84e220, - 0x2bf24: 0x6cae4e20, 0x2bf25: 0x6cae5020, 0x2bf26: 0x6cae5220, 0x2bf27: 0x6cae5420, - 0x2bf28: 0x6cae5620, 0x2bf29: 0x6cae5820, 0x2bf2a: 0x6cae5a20, 0x2bf2b: 0x6cae5c20, - 0x2bf2c: 0x6cae5e20, 0x2bf2d: 0x6cdd6620, 0x2bf2e: 0x6cdd6820, 0x2bf2f: 0x6cdd6a20, - 0x2bf30: 0x6cdd6c20, 0x2bf31: 0x6cdd6e20, 0x2bf32: 0x6cdd7020, 0x2bf33: 0x6cdd7220, - 0x2bf34: 0x6cdd7420, 0x2bf35: 0x6cdd7620, 0x2bf36: 0x6d0bde20, 0x2bf37: 0x6d0be020, - 0x2bf38: 0x6d0be220, 0x2bf39: 0x6d0be420, 0x2bf3a: 0x6d0be620, 0x2bf3b: 0x6d0be820, - 0x2bf3c: 0x6d0bea20, 0x2bf3d: 0x6d0bec20, 0x2bf3e: 0x6d0bee20, 0x2bf3f: 0x6d39e220, - // Block 0xafd, offset 0x2bf40 - 0x2bf40: 0x6d39e420, 0x2bf41: 0x6d39e620, 0x2bf42: 0x6d39e820, 0x2bf43: 0x6d39ea20, - 0x2bf44: 0x6d39ec20, 0x2bf45: 0x6d39ee20, 0x2bf46: 0x6d39f020, 0x2bf47: 0x6d39f220, - 0x2bf48: 0x6d39f420, 0x2bf49: 0x6d39f620, 0x2bf4a: 0x6d39f820, 0x2bf4b: 0x6d661220, - 0x2bf4c: 0x6d661420, 0x2bf4d: 0x6d661620, 0x2bf4e: 0x6d661820, 0x2bf4f: 0x6d661a20, - 0x2bf50: 0x6d661c20, 0x2bf51: 0x6d661e20, 0x2bf52: 0x6d662020, 0x2bf53: 0x6d662220, - 0x2bf54: 0x6d662420, 0x2bf55: 0x6d39fa20, 0x2bf56: 0x6d662620, 0x2bf57: 0x6d8ffa20, - 0x2bf58: 0x6d8ffc20, 0x2bf59: 0x6d8ffe20, 0x2bf5a: 0x6d900020, 0x2bf5b: 0x6d900220, - 0x2bf5c: 0x6d900420, 0x2bf5d: 0x6d900620, 0x2bf5e: 0x6d900820, 0x2bf5f: 0x6db3b420, - 0x2bf60: 0x6db3b620, 0x2bf61: 0x6db3b820, 0x2bf62: 0x6db3ba20, 0x2bf63: 0x6db3bc20, - 0x2bf64: 0x6db3be20, 0x2bf65: 0x6db3c020, 0x2bf66: 0x6db3c220, 0x2bf67: 0x6db3c420, - 0x2bf68: 0x6db3c620, 0x2bf69: 0x6db3c820, 0x2bf6a: 0x6db3ca20, 0x2bf6b: 0x6db3cc20, - 0x2bf6c: 0x6db3ce20, 0x2bf6d: 0x6db3d020, 0x2bf6e: 0x6db3d220, 0x2bf6f: 0x6dd2b020, - 0x2bf70: 0x6dd2b220, 0x2bf71: 0x6dd2b420, 0x2bf72: 0x6dd2b620, 0x2bf73: 0x6dd2b820, - 0x2bf74: 0x6debe620, 0x2bf75: 0x6debe820, 0x2bf76: 0x6debea20, 0x2bf77: 0x6debec20, - 0x2bf78: 0x6debee20, 0x2bf79: 0x6debf020, 0x2bf7a: 0x6debf220, 0x2bf7b: 0x6debf420, - 0x2bf7c: 0x6e016420, 0x2bf7d: 0x6e016620, 0x2bf7e: 0x6e016820, 0x2bf7f: 0x6e016a20, - // Block 0xafe, offset 0x2bf80 - 0x2bf80: 0x6e016c20, 0x2bf81: 0x6e016e20, 0x2bf82: 0x6e135020, 0x2bf83: 0x6e135220, - 0x2bf84: 0x6e135420, 0x2bf85: 0x6e212220, 0x2bf86: 0x6e212420, 0x2bf87: 0x6e212620, - 0x2bf88: 0x6e212820, 0x2bf89: 0x6e212a20, 0x2bf8a: 0x6e2bdc20, 0x2bf8b: 0x6e2bde20, - 0x2bf8c: 0x6e2be020, 0x2bf8d: 0x6e39ea20, 0x2bf8e: 0x6e42fc20, 0x2bf8f: 0x6c5ff620, - 0x2bf90: 0x6c858220, 0x2bf91: 0x6caf1a20, 0x2bf92: 0x6d0cbc20, 0x2bf93: 0x6d3b1020, - 0x2bf94: 0x6d673a20, 0x2bf95: 0x6c859420, 0x2bf96: 0x6cde5020, 0x2bf97: 0x6d912020, - 0x2bf98: 0x6d912220, 0x2bf99: 0x6e01e020, 0x2bf9a: 0x6c404420, 0x2bf9b: 0x6c404620, - 0x2bf9c: 0x6c600c20, 0x2bf9d: 0x6c600e20, 0x2bf9e: 0x6c601020, 0x2bf9f: 0x6c85a020, - 0x2bfa0: 0x6c85a220, 0x2bfa1: 0x6c85a420, 0x2bfa2: 0x6caf3420, 0x2bfa3: 0x6caf3620, - 0x2bfa4: 0x6caf3820, 0x2bfa5: 0x6caf3a20, 0x2bfa6: 0x6caf3c20, 0x2bfa7: 0x6caf3e20, - 0x2bfa8: 0x6cde6a20, 0x2bfa9: 0x6cde6c20, 0x2bfaa: 0x6cde6e20, 0x2bfab: 0x6cde7020, - 0x2bfac: 0x6cde7220, 0x2bfad: 0x6cde7420, 0x2bfae: 0x6cde7620, 0x2bfaf: 0x6d0cd820, - 0x2bfb0: 0x6d0cda20, 0x2bfb1: 0x6d0cdc20, 0x2bfb2: 0x6d0cde20, 0x2bfb3: 0x6d3b2820, - 0x2bfb4: 0x6d3b2a20, 0x2bfb5: 0x6d3b2c20, 0x2bfb6: 0x6d3b2e20, 0x2bfb7: 0x6d3b3020, - 0x2bfb8: 0x6d3b3220, 0x2bfb9: 0x6d3b3420, 0x2bfba: 0x6d3b3620, 0x2bfbb: 0x6d3b3820, - 0x2bfbc: 0x6d3b3a20, 0x2bfbd: 0x6d3b3c20, 0x2bfbe: 0x6d3b3e20, 0x2bfbf: 0x6d3b4020, - // Block 0xaff, offset 0x2bfc0 - 0x2bfc0: 0x6d3b4220, 0x2bfc1: 0x6d3b4420, 0x2bfc2: 0x6d3b4620, 0x2bfc3: 0x6d675820, - 0x2bfc4: 0x6d675a20, 0x2bfc5: 0x6d675c20, 0x2bfc6: 0x6d675e20, 0x2bfc7: 0x6d676020, - 0x2bfc8: 0x6d676220, 0x2bfc9: 0x6d676420, 0x2bfca: 0x6d676620, 0x2bfcb: 0x6d676820, - 0x2bfcc: 0x6d676a20, 0x2bfcd: 0x6d676c20, 0x2bfce: 0x6d913020, 0x2bfcf: 0x6d913220, - 0x2bfd0: 0x6d913420, 0x2bfd1: 0x6d913620, 0x2bfd2: 0x6d913820, 0x2bfd3: 0x6d913a20, - 0x2bfd4: 0x6db4da20, 0x2bfd5: 0x6db4dc20, 0x2bfd6: 0x6db4de20, 0x2bfd7: 0x6db4e020, - 0x2bfd8: 0x6db4e220, 0x2bfd9: 0x6db4e420, 0x2bfda: 0x6db4e620, 0x2bfdb: 0x6db4e820, - 0x2bfdc: 0x6db4ea20, 0x2bfdd: 0x6db4ec20, 0x2bfde: 0x6dd3aa20, 0x2bfdf: 0x6dd3ac20, - 0x2bfe0: 0x6dd3ae20, 0x2bfe1: 0x6dd3b020, 0x2bfe2: 0x6dd3b220, 0x2bfe3: 0x6dd3b420, - 0x2bfe4: 0x6decac20, 0x2bfe5: 0x6decae20, 0x2bfe6: 0x6e01e420, 0x2bfe7: 0x6e01e620, - 0x2bfe8: 0x6e01e820, 0x2bfe9: 0x6e01ea20, 0x2bfea: 0x6e13d020, 0x2bfeb: 0x6e218c20, - 0x2bfec: 0x6e2c2220, 0x2bfed: 0x6e2c2420, 0x2bfee: 0x6e346020, 0x2bfef: 0x6e346220, - 0x2bff0: 0x6e3a0a20, 0x2bff1: 0x6e40fe20, 0x2bff2: 0x6c606420, 0x2bff3: 0x6c862220, - 0x2bff4: 0x6cafe220, 0x2bff5: 0x6cdefa20, 0x2bff6: 0x6cdefc20, 0x2bff7: 0x6c862a20, - 0x2bff8: 0x6c862c20, 0x2bff9: 0x6cafee20, 0x2bffa: 0x6caff020, 0x2bffb: 0x6caff220, - 0x2bffc: 0x6cdf0a20, 0x2bffd: 0x6cdf0c20, 0x2bffe: 0x6cdf0e20, 0x2bfff: 0x6cdf1020, - // Block 0xb00, offset 0x2c000 - 0x2c000: 0x6d0d7c20, 0x2c001: 0x6d0d7e20, 0x2c002: 0x6d3bec20, 0x2c003: 0x6d3bee20, - 0x2c004: 0x6d67f820, 0x2c005: 0x6d67fa20, 0x2c006: 0x6d91c220, 0x2c007: 0x6d91c420, - 0x2c008: 0x6d91c620, 0x2c009: 0x6d91c820, 0x2c00a: 0x6db58020, 0x2c00b: 0x6db58220, - 0x2c00c: 0x6db58420, 0x2c00d: 0x6dd41420, 0x2c00e: 0x6dd41620, 0x2c00f: 0x6ded0420, - 0x2c010: 0x6ded0620, 0x2c011: 0x6ded0820, 0x2c012: 0x6ded0a20, 0x2c013: 0x6ded0c20, - 0x2c014: 0x6e13fc20, 0x2c015: 0x6e3e2e20, 0x2c016: 0x6e45d820, 0x2c017: 0x6cb01e20, - 0x2c018: 0x6d0db020, 0x2c019: 0x6d0db220, 0x2c01a: 0x6d0db420, 0x2c01b: 0x6d3c2020, - 0x2c01c: 0x6d683a20, 0x2c01d: 0x6d683c20, 0x2c01e: 0x6d683e20, 0x2c01f: 0x6d684020, - 0x2c020: 0x6d684220, 0x2c021: 0x6d920220, 0x2c022: 0x6d920420, 0x2c023: 0x6d920620, - 0x2c024: 0x6d920820, 0x2c025: 0x6db5a820, 0x2c026: 0x6db5aa20, 0x2c027: 0x6dd43620, - 0x2c028: 0x6ded2420, 0x2c029: 0x6ded2620, 0x2c02a: 0x6e022e20, 0x2c02b: 0x6e023020, - 0x2c02c: 0x6ded2820, 0x2c02d: 0x6e3a3620, 0x2c02e: 0x6c608620, 0x2c02f: 0x6c608820, - 0x2c030: 0x6c608a20, 0x2c031: 0x6c864a20, 0x2c032: 0x6c864c20, 0x2c033: 0x6cb05620, - 0x2c034: 0x6cb05820, 0x2c035: 0x6cb05a20, 0x2c036: 0x6cb05c20, 0x2c037: 0x6cb05e20, - 0x2c038: 0x6cb06020, 0x2c039: 0x6cb06220, 0x2c03a: 0x6cb06420, 0x2c03b: 0x6cb06620, - 0x2c03c: 0x6cb06820, 0x2c03d: 0x6cb06a20, 0x2c03e: 0x6cb06c20, 0x2c03f: 0x6cb06e20, - // Block 0xb01, offset 0x2c040 - 0x2c040: 0x6cb07020, 0x2c041: 0x6cb07220, 0x2c042: 0x6cb07420, 0x2c043: 0x6cb07620, - 0x2c044: 0x6cdf6020, 0x2c045: 0x6cdf6220, 0x2c046: 0x6cdf6420, 0x2c047: 0x6cdf6620, - 0x2c048: 0x6cdf6820, 0x2c049: 0x6cdf6a20, 0x2c04a: 0x6cdf6c20, 0x2c04b: 0x6cdf6e20, - 0x2c04c: 0x6cdf7020, 0x2c04d: 0x6cdf7220, 0x2c04e: 0x6cdf7420, 0x2c04f: 0x6cdf7620, - 0x2c050: 0x6cdf7820, 0x2c051: 0x6cdf7a20, 0x2c052: 0x6cdf7c20, 0x2c053: 0x6cdf7e20, - 0x2c054: 0x6d0de020, 0x2c055: 0x6d0de220, 0x2c056: 0x6d0de420, 0x2c057: 0x6d0de620, - 0x2c058: 0x6d0de820, 0x2c059: 0x6d0dea20, 0x2c05a: 0x6d0dec20, 0x2c05b: 0x6d0dee20, - 0x2c05c: 0x6d0df020, 0x2c05d: 0x6d3c4220, 0x2c05e: 0x6d3c4420, 0x2c05f: 0x6d3c4620, - 0x2c060: 0x6d3c4820, 0x2c061: 0x6d3c4a20, 0x2c062: 0x6d3c4c20, 0x2c063: 0x6d3c4e20, - 0x2c064: 0x6d3c5020, 0x2c065: 0x6d3c5220, 0x2c066: 0x6d3c5420, 0x2c067: 0x6d3c5620, - 0x2c068: 0x6d3c5820, 0x2c069: 0x6d687e20, 0x2c06a: 0x6d688020, 0x2c06b: 0x6d688220, - 0x2c06c: 0x6d688420, 0x2c06d: 0x6d688620, 0x2c06e: 0x6d688820, 0x2c06f: 0x6d688a20, - 0x2c070: 0x6d688c20, 0x2c071: 0x6d688e20, 0x2c072: 0x6d689020, 0x2c073: 0x6d689220, - 0x2c074: 0x6d689420, 0x2c075: 0x6d689620, 0x2c076: 0x6d689820, 0x2c077: 0x6d689a20, - 0x2c078: 0x6d689c20, 0x2c079: 0x6d923220, 0x2c07a: 0x6d923420, 0x2c07b: 0x6d923620, - 0x2c07c: 0x6d923820, 0x2c07d: 0x6d923a20, 0x2c07e: 0x6db5d620, 0x2c07f: 0x6db5d820, - // Block 0xb02, offset 0x2c080 - 0x2c080: 0x6db5da20, 0x2c081: 0x6db5dc20, 0x2c082: 0x6db5de20, 0x2c083: 0x6dd45220, - 0x2c084: 0x6dd45420, 0x2c085: 0x6dd45620, 0x2c086: 0x6dd45820, 0x2c087: 0x6dd45a20, - 0x2c088: 0x6dd45c20, 0x2c089: 0x6dd45e20, 0x2c08a: 0x6dd46020, 0x2c08b: 0x6ded4220, - 0x2c08c: 0x6ded4420, 0x2c08d: 0x6ded4620, 0x2c08e: 0x6ded4820, 0x2c08f: 0x6ded4a20, - 0x2c090: 0x6ded4c20, 0x2c091: 0x6ded4e20, 0x2c092: 0x6e024020, 0x2c093: 0x6e024220, - 0x2c094: 0x6e024420, 0x2c095: 0x6e024620, 0x2c096: 0x6e024820, 0x2c097: 0x6e024a20, - 0x2c098: 0x6e024c20, 0x2c099: 0x6e141620, 0x2c09a: 0x6e141820, 0x2c09b: 0x6e141a20, - 0x2c09c: 0x6e141c20, 0x2c09d: 0x6e141e20, 0x2c09e: 0x6e142020, 0x2c09f: 0x6e21c220, - 0x2c0a0: 0x6e21c420, 0x2c0a1: 0x6e21c620, 0x2c0a2: 0x6e2c4420, 0x2c0a3: 0x6cb10a20, - 0x2c0a4: 0x6d0eb220, 0x2c0a5: 0x6d697a20, 0x2c0a6: 0x6db69820, 0x2c0a7: 0x6db69a20, - 0x2c0a8: 0x6dd4fc20, 0x2c0a9: 0x6e2c7620, 0x2c0aa: 0x6c60be20, 0x2c0ab: 0x6c86c420, - 0x2c0ac: 0x6ce04820, 0x2c0ad: 0x6ce04a20, 0x2c0ae: 0x6d3d1620, 0x2c0af: 0x6d698420, - 0x2c0b0: 0x6db69e20, 0x2c0b1: 0x6dd4fe20, 0x2c0b2: 0x6e221620, 0x2c0b3: 0x6c40b620, - 0x2c0b4: 0x6cb15020, 0x2c0b5: 0x6ce05020, 0x2c0b6: 0x6d0eca20, 0x2c0b7: 0x6d3d1e20, - 0x2c0b8: 0x6d3d2020, 0x2c0b9: 0x6d3d2220, 0x2c0ba: 0x6d699620, 0x2c0bb: 0x6d930c20, - 0x2c0bc: 0x6d930e20, 0x2c0bd: 0x6d931020, 0x2c0be: 0x6d931220, 0x2c0bf: 0x6d931420, - // Block 0xb03, offset 0x2c0c0 - 0x2c0c0: 0x6db6ae20, 0x2c0c1: 0x6db6b020, 0x2c0c2: 0x6db6b220, 0x2c0c3: 0x6e147020, - 0x2c0c4: 0x6e3a5420, 0x2c0c5: 0x6c86d820, 0x2c0c6: 0x6cb15820, 0x2c0c7: 0x6cb15a20, - 0x2c0c8: 0x6ce05c20, 0x2c0c9: 0x6d0ed620, 0x2c0ca: 0x6d69b420, 0x2c0cb: 0x6d69b620, - 0x2c0cc: 0x6d69b820, 0x2c0cd: 0x6d932020, 0x2c0ce: 0x6d932220, 0x2c0cf: 0x6dd51420, - 0x2c0d0: 0x6dee0620, 0x2c0d1: 0x6dee0820, 0x2c0d2: 0x6e147620, 0x2c0d3: 0x6e222220, - 0x2c0d4: 0x6e3a5c20, 0x2c0d5: 0x6e3a5e20, 0x2c0d6: 0x6cb17820, 0x2c0d7: 0x6cb17a20, - 0x2c0d8: 0x6cb17c20, 0x2c0d9: 0x6cb17e20, 0x2c0da: 0x6ce07a20, 0x2c0db: 0x6ce07c20, - 0x2c0dc: 0x6d3d4e20, 0x2c0dd: 0x6d69dc20, 0x2c0de: 0x6d69de20, 0x2c0df: 0x6d934020, - 0x2c0e0: 0x6db6e220, 0x2c0e1: 0x6dd52820, 0x2c0e2: 0x6dd52a20, 0x2c0e3: 0x6dee1820, - 0x2c0e4: 0x6dee1a20, 0x2c0e5: 0x6dee1c20, 0x2c0e6: 0x6dee1e20, 0x2c0e7: 0x6cb19420, - 0x2c0e8: 0x6cb19620, 0x2c0e9: 0x6ce0ae20, 0x2c0ea: 0x6ce0b020, 0x2c0eb: 0x6ce0b220, - 0x2c0ec: 0x6ce0b420, 0x2c0ed: 0x6ce0b620, 0x2c0ee: 0x6ce0b820, 0x2c0ef: 0x6ce0ba20, - 0x2c0f0: 0x6d0f2820, 0x2c0f1: 0x6d0f2a20, 0x2c0f2: 0x6d0f2c20, 0x2c0f3: 0x6d3d7620, - 0x2c0f4: 0x6d3d7820, 0x2c0f5: 0x6d3d7a20, 0x2c0f6: 0x6d6a0020, 0x2c0f7: 0x6d6a0220, - 0x2c0f8: 0x6d6a0420, 0x2c0f9: 0x6d6a0620, 0x2c0fa: 0x6d6a0820, 0x2c0fb: 0x6d6a0a20, - 0x2c0fc: 0x6d6a0c20, 0x2c0fd: 0x6d6a0e20, 0x2c0fe: 0x6d6a1020, 0x2c0ff: 0x6d6a1220, - // Block 0xb04, offset 0x2c100 - 0x2c100: 0x6d936820, 0x2c101: 0x6d936a20, 0x2c102: 0x6d936c20, 0x2c103: 0x6d936e20, - 0x2c104: 0x6d937020, 0x2c105: 0x6db70420, 0x2c106: 0x6db70620, 0x2c107: 0x6dd54620, - 0x2c108: 0x6dee3620, 0x2c109: 0x6e02e220, 0x2c10a: 0x6e223020, 0x2c10b: 0x6e2c8a20, - 0x2c10c: 0x6d0f9020, 0x2c10d: 0x6d6a6e20, 0x2c10e: 0x6d6a7020, 0x2c10f: 0x6d93be20, - 0x2c110: 0x6d93c020, 0x2c111: 0x6c872620, 0x2c112: 0x6d0f9820, 0x2c113: 0x6d3dca20, - 0x2c114: 0x6d3dcc20, 0x2c115: 0x6e14a620, 0x2c116: 0x6c872820, 0x2c117: 0x6c872a20, - 0x2c118: 0x6c872c20, 0x2c119: 0x6cb1f220, 0x2c11a: 0x6cb1f420, 0x2c11b: 0x6cb1f620, - 0x2c11c: 0x6cb1f820, 0x2c11d: 0x6ce13e20, 0x2c11e: 0x6ce14020, 0x2c11f: 0x6ce14220, - 0x2c120: 0x6ce14420, 0x2c121: 0x6ce14620, 0x2c122: 0x6ce14820, 0x2c123: 0x6ce14a20, - 0x2c124: 0x6ce14c20, 0x2c125: 0x6d0fa820, 0x2c126: 0x6d0faa20, 0x2c127: 0x6d0fac20, - 0x2c128: 0x6d0fae20, 0x2c129: 0x6d0fb020, 0x2c12a: 0x6d0fb220, 0x2c12b: 0x6d3dd820, - 0x2c12c: 0x6d3dda20, 0x2c12d: 0x6d3ddc20, 0x2c12e: 0x6d3dde20, 0x2c12f: 0x6d3de020, - 0x2c130: 0x6d3de220, 0x2c131: 0x6d3de420, 0x2c132: 0x6d3de620, 0x2c133: 0x6d6a8420, - 0x2c134: 0x6d6a8620, 0x2c135: 0x6d6a8820, 0x2c136: 0x6d6a8a20, 0x2c137: 0x6d6a8c20, - 0x2c138: 0x6d6a8e20, 0x2c139: 0x6d93dc20, 0x2c13a: 0x6d93de20, 0x2c13b: 0x6d93e020, - 0x2c13c: 0x6d93e220, 0x2c13d: 0x6db74e20, 0x2c13e: 0x6db75020, 0x2c13f: 0x6db75220, - // Block 0xb05, offset 0x2c140 - 0x2c140: 0x6db75420, 0x2c141: 0x6dd59c20, 0x2c142: 0x6dd59e20, 0x2c143: 0x6dd5a020, - 0x2c144: 0x6dd5a220, 0x2c145: 0x6dd5a420, 0x2c146: 0x6dd5a620, 0x2c147: 0x6dee8620, - 0x2c148: 0x6e030a20, 0x2c149: 0x6e030c20, 0x2c14a: 0x6e030e20, 0x2c14b: 0x6e031020, - 0x2c14c: 0x6e14ae20, 0x2c14d: 0x6e225c20, 0x2c14e: 0x6e225e20, 0x2c14f: 0x6e226020, - 0x2c150: 0x6e2cae20, 0x2c151: 0x6e34ba20, 0x2c152: 0x6e3a6e20, 0x2c153: 0x6c611620, - 0x2c154: 0x6c611820, 0x2c155: 0x6c875020, 0x2c156: 0x6c875220, 0x2c157: 0x6cb23e20, - 0x2c158: 0x6cb24020, 0x2c159: 0x6cb24220, 0x2c15a: 0x6cb24420, 0x2c15b: 0x6cb24620, - 0x2c15c: 0x6cb24820, 0x2c15d: 0x6cb24a20, 0x2c15e: 0x6cb24c20, 0x2c15f: 0x6ce19c20, - 0x2c160: 0x6ce19e20, 0x2c161: 0x6ce1a020, 0x2c162: 0x6ce1a220, 0x2c163: 0x6ce1a420, - 0x2c164: 0x6ce1a620, 0x2c165: 0x6ce1a820, 0x2c166: 0x6ce1aa20, 0x2c167: 0x6ce1ac20, - 0x2c168: 0x6ce1ae20, 0x2c169: 0x6ce1b020, 0x2c16a: 0x6ce1b220, 0x2c16b: 0x6ce1b420, - 0x2c16c: 0x6ce1b620, 0x2c16d: 0x6ce1b820, 0x2c16e: 0x6d100a20, 0x2c16f: 0x6d100c20, - 0x2c170: 0x6d100e20, 0x2c171: 0x6d101020, 0x2c172: 0x6d101220, 0x2c173: 0x6d101420, - 0x2c174: 0x6d3e3a20, 0x2c175: 0x6d3e3c20, 0x2c176: 0x6d3e3e20, 0x2c177: 0x6d3e4020, - 0x2c178: 0x6d3e4220, 0x2c179: 0x6d3e4420, 0x2c17a: 0x6d3e4620, 0x2c17b: 0x6d3e4820, - 0x2c17c: 0x6d6ada20, 0x2c17d: 0x6d3e4a20, 0x2c17e: 0x6d6adc20, 0x2c17f: 0x6d6ade20, - // Block 0xb06, offset 0x2c180 - 0x2c180: 0x6d6ae020, 0x2c181: 0x6d6ae220, 0x2c182: 0x6d6ae420, 0x2c183: 0x6d6ae620, - 0x2c184: 0x6d6ae820, 0x2c185: 0x6d6aea20, 0x2c186: 0x6d6aec20, 0x2c187: 0x6d6aee20, - 0x2c188: 0x6d6af020, 0x2c189: 0x6d6af220, 0x2c18a: 0x6d6af420, 0x2c18b: 0x6d6af620, - 0x2c18c: 0x6d6af820, 0x2c18d: 0x6d943220, 0x2c18e: 0x6d943420, 0x2c18f: 0x6d943620, - 0x2c190: 0x6d943820, 0x2c191: 0x6d943a20, 0x2c192: 0x6d943c20, 0x2c193: 0x6d943e20, - 0x2c194: 0x6d944020, 0x2c195: 0x6d944220, 0x2c196: 0x6d944420, 0x2c197: 0x6db78420, - 0x2c198: 0x6db78620, 0x2c199: 0x6db78820, 0x2c19a: 0x6db78a20, 0x2c19b: 0x6db78c20, - 0x2c19c: 0x6db78e20, 0x2c19d: 0x6db79020, 0x2c19e: 0x6dd5de20, 0x2c19f: 0x6dd5e020, - 0x2c1a0: 0x6dd5e220, 0x2c1a1: 0x6dd5e420, 0x2c1a2: 0x6dd5e620, 0x2c1a3: 0x6deebe20, - 0x2c1a4: 0x6deec020, 0x2c1a5: 0x6deec220, 0x2c1a6: 0x6deec420, 0x2c1a7: 0x6deec620, - 0x2c1a8: 0x6e032c20, 0x2c1a9: 0x6e032e20, 0x2c1aa: 0x6e14c420, 0x2c1ab: 0x6e14c620, - 0x2c1ac: 0x6e227020, 0x2c1ad: 0x6e2cbe20, 0x2c1ae: 0x6e2cc020, 0x2c1af: 0x6e34c020, - 0x2c1b0: 0x6e3a7a20, 0x2c1b1: 0x6e432220, 0x2c1b2: 0x6ce23a20, 0x2c1b3: 0x6ce23c20, - 0x2c1b4: 0x6ce23e20, 0x2c1b5: 0x6ce24020, 0x2c1b6: 0x6ce24220, 0x2c1b7: 0x6d10b020, - 0x2c1b8: 0x6d10b220, 0x2c1b9: 0x6d10b420, 0x2c1ba: 0x6d10b620, 0x2c1bb: 0x6d6b9c20, - 0x2c1bc: 0x6d94e220, 0x2c1bd: 0x6db81620, 0x2c1be: 0x6db81820, 0x2c1bf: 0x6def6a20, - // Block 0xb07, offset 0x2c1c0 - 0x2c1c0: 0x6e039a20, 0x2c1c1: 0x6e2ce820, 0x2c1c2: 0x6c612c20, 0x2c1c3: 0x6c612e20, - 0x2c1c4: 0x6c613020, 0x2c1c5: 0x6c878c20, 0x2c1c6: 0x6cb2d220, 0x2c1c7: 0x6cb2d420, - 0x2c1c8: 0x6cb2d620, 0x2c1c9: 0x6cb2d820, 0x2c1ca: 0x6cb2da20, 0x2c1cb: 0x6cb2dc20, - 0x2c1cc: 0x6cb2de20, 0x2c1cd: 0x6cb2e020, 0x2c1ce: 0x6cb2e220, 0x2c1cf: 0x6ce26420, - 0x2c1d0: 0x6ce26620, 0x2c1d1: 0x6ce26820, 0x2c1d2: 0x6ce26a20, 0x2c1d3: 0x6d10e020, - 0x2c1d4: 0x6d10e220, 0x2c1d5: 0x6d10e420, 0x2c1d6: 0x6d10e620, 0x2c1d7: 0x6d10e820, - 0x2c1d8: 0x6d3f0220, 0x2c1d9: 0x6d3f0420, 0x2c1da: 0x6d3f0620, 0x2c1db: 0x6d3f0820, - 0x2c1dc: 0x6d6bc820, 0x2c1dd: 0x6d6bca20, 0x2c1de: 0x6d6bcc20, 0x2c1df: 0x6d6bce20, - 0x2c1e0: 0x6d94fe20, 0x2c1e1: 0x6d950020, 0x2c1e2: 0x6d950220, 0x2c1e3: 0x6d950420, - 0x2c1e4: 0x6d950620, 0x2c1e5: 0x6db83620, 0x2c1e6: 0x6db83820, 0x2c1e7: 0x6db83a20, - 0x2c1e8: 0x6db83c20, 0x2c1e9: 0x6db83e20, 0x2c1ea: 0x6db84020, 0x2c1eb: 0x6dd6c020, - 0x2c1ec: 0x6dd6c220, 0x2c1ed: 0x6dd6c420, 0x2c1ee: 0x6dd6c620, 0x2c1ef: 0x6dd6c820, - 0x2c1f0: 0x6dd6ca20, 0x2c1f1: 0x6dd6cc20, 0x2c1f2: 0x6def9220, 0x2c1f3: 0x6def9420, - 0x2c1f4: 0x6def9620, 0x2c1f5: 0x6def9820, 0x2c1f6: 0x6e03ac20, 0x2c1f7: 0x6e151220, - 0x2c1f8: 0x6e151420, 0x2c1f9: 0x6e151620, 0x2c1fa: 0x6e22b420, 0x2c1fb: 0x6e22b620, - 0x2c1fc: 0x6e34e020, 0x2c1fd: 0x6e3e5e20, 0x2c1fe: 0x6e412e20, 0x2c1ff: 0x6e45de20, - // Block 0xb08, offset 0x2c200 - 0x2c200: 0x6c87b820, 0x2c201: 0x6cb33820, 0x2c202: 0x6c614420, 0x2c203: 0x6d6c5420, - 0x2c204: 0x6e03ec20, 0x2c205: 0x6d115e20, 0x2c206: 0x6d3f7620, 0x2c207: 0x6d6c6020, - 0x2c208: 0x6e03f820, 0x2c209: 0x6e03fa20, 0x2c20a: 0x6c272820, 0x2c20b: 0x6c272a20, - 0x2c20c: 0x6c40f820, 0x2c20d: 0x6c40fa20, 0x2c20e: 0x6c40fc20, 0x2c20f: 0x6c40fe20, - 0x2c210: 0x6c616620, 0x2c211: 0x6c616820, 0x2c212: 0x6c87d820, 0x2c213: 0x6c87da20, - 0x2c214: 0x6c87dc20, 0x2c215: 0x6c87de20, 0x2c216: 0x6c87e020, 0x2c217: 0x6c87e220, - 0x2c218: 0x6c87e420, 0x2c219: 0x6cb34820, 0x2c21a: 0x6cb34a20, 0x2c21b: 0x6cb34c20, - 0x2c21c: 0x6ce2fa20, 0x2c21d: 0x6ce2fc20, 0x2c21e: 0x6ce2fe20, 0x2c21f: 0x6ce30020, - 0x2c220: 0x6ce30220, 0x2c221: 0x6d116820, 0x2c222: 0x6d3f7820, 0x2c223: 0x6d3f7a20, - 0x2c224: 0x6d3f7c20, 0x2c225: 0x6d3f7e20, 0x2c226: 0x6d6c6620, 0x2c227: 0x6d6c6820, - 0x2c228: 0x6d6c6a20, 0x2c229: 0x6d6c6c20, 0x2c22a: 0x6d959620, 0x2c22b: 0x6d959820, - 0x2c22c: 0x6d959a20, 0x2c22d: 0x6d959c20, 0x2c22e: 0x6db8b020, 0x2c22f: 0x6dd71e20, - 0x2c230: 0x6dd72020, 0x2c231: 0x6defda20, 0x2c232: 0x6e34f820, 0x2c233: 0x6c0a8c20, - 0x2c234: 0x6c153a20, 0x2c235: 0x6c278c20, 0x2c236: 0x6c278e20, 0x2c237: 0x6c279020, - 0x2c238: 0x6c417c20, 0x2c239: 0x6c417e20, 0x2c23a: 0x6c418020, 0x2c23b: 0x6c61d220, - 0x2c23c: 0x6c61d420, 0x2c23d: 0x6d11fc20, 0x2c23e: 0x6c61d620, 0x2c23f: 0x6c61d820, - // Block 0xb09, offset 0x2c240 - 0x2c240: 0x6c61da20, 0x2c241: 0x6c61dc20, 0x2c242: 0x6c61de20, 0x2c243: 0x6c886c20, - 0x2c244: 0x6c886e20, 0x2c245: 0x6c887020, 0x2c246: 0x6c887220, 0x2c247: 0x6c887420, - 0x2c248: 0x6d400420, 0x2c249: 0x6d400620, 0x2c24a: 0x6cb40020, 0x2c24b: 0x6cb40220, - 0x2c24c: 0x6cb40420, 0x2c24d: 0x6cb40620, 0x2c24e: 0x6cb40820, 0x2c24f: 0x6cb40a20, - 0x2c250: 0x6ce3c020, 0x2c251: 0x6ce3c220, 0x2c252: 0x6ce3c420, 0x2c253: 0x6d120020, - 0x2c254: 0x6d120220, 0x2c255: 0x6d120420, 0x2c256: 0x6db90420, 0x2c257: 0x6d120620, - 0x2c258: 0x6d400a20, 0x2c259: 0x6d400c20, 0x2c25a: 0x6d400e20, 0x2c25b: 0x6d401020, - 0x2c25c: 0x6d401220, 0x2c25d: 0x6d6cfa20, 0x2c25e: 0x6d6cfc20, 0x2c25f: 0x6d6cfe20, - 0x2c260: 0x6d6d0020, 0x2c261: 0x6d95fc20, 0x2c262: 0x6db90620, 0x2c263: 0x6e2d1620, - 0x2c264: 0x6e2d1820, 0x2c265: 0x6c625620, 0x2c266: 0x6c625820, 0x2c267: 0x6c88ea20, - 0x2c268: 0x6c88ec20, 0x2c269: 0x6cb47420, 0x2c26a: 0x6cb47620, 0x2c26b: 0x6cb47820, - 0x2c26c: 0x6cb47a20, 0x2c26d: 0x6cb47c20, 0x2c26e: 0x6ce42020, 0x2c26f: 0x6ce42220, - 0x2c270: 0x6ce42420, 0x2c271: 0x6d126a20, 0x2c272: 0x6ce42620, 0x2c273: 0x6ce42820, - 0x2c274: 0x6d126c20, 0x2c275: 0x6d126e20, 0x2c276: 0x6d127020, 0x2c277: 0x6d127220, - 0x2c278: 0x6d127420, 0x2c279: 0x6d127620, 0x2c27a: 0x6d407a20, 0x2c27b: 0x6d407c20, - 0x2c27c: 0x6d6d4820, 0x2c27d: 0x6d6d4a20, 0x2c27e: 0x6d6d4c20, 0x2c27f: 0x6d6d4e20, - // Block 0xb0a, offset 0x2c280 - 0x2c280: 0x6d963020, 0x2c281: 0x6d963220, 0x2c282: 0x6d963420, 0x2c283: 0x6d963620, - 0x2c284: 0x6d963820, 0x2c285: 0x6d963a20, 0x2c286: 0x6d963c20, 0x2c287: 0x6d963e20, - 0x2c288: 0x6d964020, 0x2c289: 0x6db93420, 0x2c28a: 0x6db93620, 0x2c28b: 0x6db93820, - 0x2c28c: 0x6db93a20, 0x2c28d: 0x6dd78020, 0x2c28e: 0x6df00a20, 0x2c28f: 0x6df00c20, - 0x2c290: 0x6df00e20, 0x2c291: 0x6df01020, 0x2c292: 0x6df01220, 0x2c293: 0x6e155c20, - 0x2c294: 0x6e155e20, 0x2c295: 0x6e22f020, 0x2c296: 0x6e22f220, 0x2c297: 0x6e34fe20, - 0x2c298: 0x6e350020, 0x2c299: 0x6e433820, 0x2c29a: 0x6cb4ca20, 0x2c29b: 0x6c890c20, - 0x2c29c: 0x6cb4d420, 0x2c29d: 0x6ce47c20, 0x2c29e: 0x6ce47e20, 0x2c29f: 0x6ce48020, - 0x2c2a0: 0x6ce48220, 0x2c2a1: 0x6d12c020, 0x2c2a2: 0x6d12c220, 0x2c2a3: 0x6d12c420, - 0x2c2a4: 0x6d40d620, 0x2c2a5: 0x6d40d820, 0x2c2a6: 0x6d40da20, 0x2c2a7: 0x6d40dc20, - 0x2c2a8: 0x6d40de20, 0x2c2a9: 0x6d40e020, 0x2c2aa: 0x6d40e220, 0x2c2ab: 0x6d6db220, - 0x2c2ac: 0x6d6db420, 0x2c2ad: 0x6d6db620, 0x2c2ae: 0x6d6db820, 0x2c2af: 0x6d6dba20, - 0x2c2b0: 0x6d6dbc20, 0x2c2b1: 0x6d6dbe20, 0x2c2b2: 0x6d6dc020, 0x2c2b3: 0x6d969a20, - 0x2c2b4: 0x6d969c20, 0x2c2b5: 0x6d969e20, 0x2c2b6: 0x6d96a020, 0x2c2b7: 0x6db9a020, - 0x2c2b8: 0x6db9a220, 0x2c2b9: 0x6db9a420, 0x2c2ba: 0x6db9a620, 0x2c2bb: 0x6db9a820, - 0x2c2bc: 0x6db9aa20, 0x2c2bd: 0x6dd7d820, 0x2c2be: 0x6dd7da20, 0x2c2bf: 0x6dd7dc20, - // Block 0xb0b, offset 0x2c2c0 - 0x2c2c0: 0x6dd7de20, 0x2c2c1: 0x6dd7e020, 0x2c2c2: 0x6dd7e220, 0x2c2c3: 0x6dd7e420, - 0x2c2c4: 0x6dd7e620, 0x2c2c5: 0x6dd7e820, 0x2c2c6: 0x6dd7ea20, 0x2c2c7: 0x6dd7ec20, - 0x2c2c8: 0x6df05620, 0x2c2c9: 0x6df05820, 0x2c2ca: 0x6df05a20, 0x2c2cb: 0x6df05c20, - 0x2c2cc: 0x6df05e20, 0x2c2cd: 0x6df06020, 0x2c2ce: 0x6df06220, 0x2c2cf: 0x6df06420, - 0x2c2d0: 0x6df06620, 0x2c2d1: 0x6df06820, 0x2c2d2: 0x6df06a20, 0x2c2d3: 0x6df06c20, - 0x2c2d4: 0x6e046a20, 0x2c2d5: 0x6e046c20, 0x2c2d6: 0x6e046e20, 0x2c2d7: 0x6e047020, - 0x2c2d8: 0x6e047220, 0x2c2d9: 0x6e047420, 0x2c2da: 0x6e047620, 0x2c2db: 0x6e047820, - 0x2c2dc: 0x6e047a20, 0x2c2dd: 0x6e158020, 0x2c2de: 0x6e158220, 0x2c2df: 0x6e158420, - 0x2c2e0: 0x6e158620, 0x2c2e1: 0x6e158820, 0x2c2e2: 0x6e158a20, 0x2c2e3: 0x6e158c20, - 0x2c2e4: 0x6e158e20, 0x2c2e5: 0x6e159020, 0x2c2e6: 0x6e159220, 0x2c2e7: 0x6e230620, - 0x2c2e8: 0x6e230820, 0x2c2e9: 0x6e230a20, 0x2c2ea: 0x6e230c20, 0x2c2eb: 0x6e230e20, - 0x2c2ec: 0x6e231020, 0x2c2ed: 0x6e231220, 0x2c2ee: 0x6e231420, 0x2c2ef: 0x6e2d3a20, - 0x2c2f0: 0x6e2d3c20, 0x2c2f1: 0x6e2d3e20, 0x2c2f2: 0x6e2d4020, 0x2c2f3: 0x6e2d4220, - 0x2c2f4: 0x6e2d4420, 0x2c2f5: 0x6e351620, 0x2c2f6: 0x6e351820, 0x2c2f7: 0x6e351a20, - 0x2c2f8: 0x6e3ab220, 0x2c2f9: 0x6e449220, 0x2c2fa: 0x6ce52420, 0x2c2fb: 0x6ce52620, - 0x2c2fc: 0x6ce52820, 0x2c2fd: 0x6d139e20, 0x2c2fe: 0x6d13a020, 0x2c2ff: 0x6d13a220, - // Block 0xb0c, offset 0x2c300 - 0x2c300: 0x6d41c220, 0x2c301: 0x6d6ed020, 0x2c302: 0x6dd8fa20, 0x2c303: 0x6e058c20, - 0x2c304: 0x6e058e20, 0x2c305: 0x6e059020, 0x2c306: 0x6e435820, 0x2c307: 0x6cb58820, - 0x2c308: 0x6d13f620, 0x2c309: 0x6d13f820, 0x2c30a: 0x6d41fc20, 0x2c30b: 0x6df16420, - 0x2c30c: 0x6cb5a620, 0x2c30d: 0x6cb5a820, 0x2c30e: 0x6ce58c20, 0x2c30f: 0x6ce58e20, - 0x2c310: 0x6ce59020, 0x2c311: 0x6ce59220, 0x2c312: 0x6d141820, 0x2c313: 0x6d141a20, - 0x2c314: 0x6d141c20, 0x2c315: 0x6d420c20, 0x2c316: 0x6d420e20, 0x2c317: 0x6d421020, - 0x2c318: 0x6d421220, 0x2c319: 0x6d421420, 0x2c31a: 0x6d421620, 0x2c31b: 0x6d421820, - 0x2c31c: 0x6d6f1c20, 0x2c31d: 0x6d6f1e20, 0x2c31e: 0x6d6f2020, 0x2c31f: 0x6d6f2220, - 0x2c320: 0x6d982420, 0x2c321: 0x6d982620, 0x2c322: 0x6d982820, 0x2c323: 0x6d982a20, - 0x2c324: 0x6d982c20, 0x2c325: 0x6d982e20, 0x2c326: 0x6d983020, 0x2c327: 0x6d983220, - 0x2c328: 0x6d983420, 0x2c329: 0x6dbb2620, 0x2c32a: 0x6dbb2820, 0x2c32b: 0x6dbb2a20, - 0x2c32c: 0x6dbb2c20, 0x2c32d: 0x6dbb2e20, 0x2c32e: 0x6dbb3020, 0x2c32f: 0x6dbb3220, - 0x2c330: 0x6df17420, 0x2c331: 0x6e05a020, 0x2c332: 0x6e165620, 0x2c333: 0x6e165820, - 0x2c334: 0x6e165a20, 0x2c335: 0x6e23a420, 0x2c336: 0x6d426220, 0x2c337: 0x6d6f8220, - 0x2c338: 0x6dbb8620, 0x2c339: 0x6c0ab020, 0x2c33a: 0x6c0ab220, 0x2c33b: 0x6c15a220, - 0x2c33c: 0x6c281e20, 0x2c33d: 0x6c282020, 0x2c33e: 0x6c89a220, 0x2c33f: 0x6c282220, - // Block 0xb0d, offset 0x2c340 - 0x2c340: 0x6c282420, 0x2c341: 0x6c421220, 0x2c342: 0x6c421420, 0x2c343: 0x6c421620, - 0x2c344: 0x6c62cc20, 0x2c345: 0x6c62ce20, 0x2c346: 0x6c62d020, 0x2c347: 0x6c62d220, - 0x2c348: 0x6c62d420, 0x2c349: 0x6c89a420, 0x2c34a: 0x6c89a620, 0x2c34b: 0x6c89a820, - 0x2c34c: 0x6c89aa20, 0x2c34d: 0x6c89ac20, 0x2c34e: 0x6c89ae20, 0x2c34f: 0x6c89b020, - 0x2c350: 0x6cb5da20, 0x2c351: 0x6cb5dc20, 0x2c352: 0x6cb5de20, 0x2c353: 0x6cb5e020, - 0x2c354: 0x6cb5e220, 0x2c355: 0x6cb5e420, 0x2c356: 0x6cb5e620, 0x2c357: 0x6ce5fc20, - 0x2c358: 0x6ce5fe20, 0x2c359: 0x6ce60020, 0x2c35a: 0x6d148020, 0x2c35b: 0x6d148220, - 0x2c35c: 0x6d148420, 0x2c35d: 0x6d148620, 0x2c35e: 0x6d148820, 0x2c35f: 0x6d148a20, - 0x2c360: 0x6d426c20, 0x2c361: 0x6d426e20, 0x2c362: 0x6d427020, 0x2c363: 0x6d427220, - 0x2c364: 0x6d6f8820, 0x2c365: 0x6d6f8a20, 0x2c366: 0x6d6f8c20, 0x2c367: 0x6d989220, - 0x2c368: 0x6d989420, 0x2c369: 0x6d6f8e20, 0x2c36a: 0x6d989620, 0x2c36b: 0x6dbb8c20, - 0x2c36c: 0x6dbb8e20, 0x2c36d: 0x6dbb9020, 0x2c36e: 0x6df1a220, 0x2c36f: 0x6e05da20, - 0x2c370: 0x6e169020, 0x2c371: 0x6c8a3020, 0x2c372: 0x6cb66020, 0x2c373: 0x6cb66220, - 0x2c374: 0x6ce68a20, 0x2c375: 0x6ce68c20, 0x2c376: 0x6ce68e20, 0x2c377: 0x6d14e020, - 0x2c378: 0x6d14e220, 0x2c379: 0x6d14e420, 0x2c37a: 0x6d14e620, 0x2c37b: 0x6d42d020, - 0x2c37c: 0x6d6fcc20, 0x2c37d: 0x6d6fce20, 0x2c37e: 0x6d98c820, 0x2c37f: 0x6d98ca20, - // Block 0xb0e, offset 0x2c380 - 0x2c380: 0x6d8a5620, 0x2c381: 0x6dbbb620, 0x2c382: 0x6dbbb820, 0x2c383: 0x6dd98a20, - 0x2c384: 0x6df1ae20, 0x2c385: 0x6e05ee20, 0x2c386: 0x6e05f020, 0x2c387: 0x6e05f220, - 0x2c388: 0x6e23be20, 0x2c389: 0x6e3afa20, 0x2c38a: 0x6e464620, 0x2c38b: 0x6cb67c20, - 0x2c38c: 0x6ce6be20, 0x2c38d: 0x6ce6c020, 0x2c38e: 0x6d151820, 0x2c38f: 0x6d430c20, - 0x2c390: 0x6d430e20, 0x2c391: 0x6d431020, 0x2c392: 0x6d431220, 0x2c393: 0x6d431420, - 0x2c394: 0x6d431620, 0x2c395: 0x6d431820, 0x2c396: 0x6d431a20, 0x2c397: 0x6d6ffc20, - 0x2c398: 0x6d6ffe20, 0x2c399: 0x6d700020, 0x2c39a: 0x6d990e20, 0x2c39b: 0x6d991020, - 0x2c39c: 0x6d991220, 0x2c39d: 0x6d991420, 0x2c39e: 0x6dbbec20, 0x2c39f: 0x6dbbee20, - 0x2c3a0: 0x6dbbf020, 0x2c3a1: 0x6dbbf220, 0x2c3a2: 0x6dbbf420, 0x2c3a3: 0x6dbbf620, - 0x2c3a4: 0x6dbbf820, 0x2c3a5: 0x6dd9be20, 0x2c3a6: 0x6dd9c020, 0x2c3a7: 0x6dd9c220, - 0x2c3a8: 0x6dd9c420, 0x2c3a9: 0x6dd9c620, 0x2c3aa: 0x6dd9c820, 0x2c3ab: 0x6df1d420, - 0x2c3ac: 0x6df1d620, 0x2c3ad: 0x6df1d820, 0x2c3ae: 0x6df1da20, 0x2c3af: 0x6df1dc20, - 0x2c3b0: 0x6e061a20, 0x2c3b1: 0x6e061c20, 0x2c3b2: 0x6e23d220, 0x2c3b3: 0x6e23d420, - 0x2c3b4: 0x6e23d620, 0x2c3b5: 0x6e2de620, 0x2c3b6: 0x6e2de820, 0x2c3b7: 0x6e358e20, - 0x2c3b8: 0x6e3b0220, 0x2c3b9: 0x6e416620, 0x2c3ba: 0x6e46f020, 0x2c3bb: 0x6e473e20, - 0x2c3bc: 0x6e240c20, 0x2c3bd: 0x6cb69c20, 0x2c3be: 0x6cb69e20, 0x2c3bf: 0x6ce6fe20, - // Block 0xb0f, offset 0x2c3c0 - 0x2c3c0: 0x6d705020, 0x2c3c1: 0x6e067220, 0x2c3c2: 0x6d156820, 0x2c3c3: 0x6d156a20, - 0x2c3c4: 0x6d156c20, 0x2c3c5: 0x6d435c20, 0x2c3c6: 0x6d435e20, 0x2c3c7: 0x6d436020, - 0x2c3c8: 0x6d998620, 0x2c3c9: 0x6d998820, 0x2c3ca: 0x6dbc5620, 0x2c3cb: 0x6e067c20, - 0x2c3cc: 0x6e16f020, 0x2c3cd: 0x6e16f220, 0x2c3ce: 0x6e240e20, 0x2c3cf: 0x6e35b420, - 0x2c3d0: 0x6ce71820, 0x2c3d1: 0x6ce71a20, 0x2c3d2: 0x6ce71c20, 0x2c3d3: 0x6d157c20, - 0x2c3d4: 0x6d157e20, 0x2c3d5: 0x6d158020, 0x2c3d6: 0x6d158220, 0x2c3d7: 0x6d158420, - 0x2c3d8: 0x6d158620, 0x2c3d9: 0x6d437e20, 0x2c3da: 0x6d438020, 0x2c3db: 0x6d438220, - 0x2c3dc: 0x6d438420, 0x2c3dd: 0x6d438620, 0x2c3de: 0x6d438820, 0x2c3df: 0x6d707220, - 0x2c3e0: 0x6d99a220, 0x2c3e1: 0x6d99a420, 0x2c3e2: 0x6d99a620, 0x2c3e3: 0x6d99a820, - 0x2c3e4: 0x6d99aa20, 0x2c3e5: 0x6d99ac20, 0x2c3e6: 0x6d99ae20, 0x2c3e7: 0x6d99b020, - 0x2c3e8: 0x6dbc6620, 0x2c3e9: 0x6dbc6820, 0x2c3ea: 0x6dbc6a20, 0x2c3eb: 0x6dbc6c20, - 0x2c3ec: 0x6dbc6e20, 0x2c3ed: 0x6dbc7020, 0x2c3ee: 0x6dbc7220, 0x2c3ef: 0x6dda3020, - 0x2c3f0: 0x6dda3220, 0x2c3f1: 0x6dda3420, 0x2c3f2: 0x6dda3620, 0x2c3f3: 0x6dda3820, - 0x2c3f4: 0x6dda3a20, 0x2c3f5: 0x6dda3c20, 0x2c3f6: 0x6df24220, 0x2c3f7: 0x6df24420, - 0x2c3f8: 0x6df24620, 0x2c3f9: 0x6df24820, 0x2c3fa: 0x6df24a20, 0x2c3fb: 0x6df24c20, - 0x2c3fc: 0x6e068a20, 0x2c3fd: 0x6e068c20, 0x2c3fe: 0x6e068e20, 0x2c3ff: 0x6e170a20, - // Block 0xb10, offset 0x2c400 - 0x2c400: 0x6e170c20, 0x2c401: 0x6e170e20, 0x2c402: 0x6e171020, 0x2c403: 0x6e171220, - 0x2c404: 0x6e171420, 0x2c405: 0x6e241420, 0x2c406: 0x6e241620, 0x2c407: 0x6e2e0a20, - 0x2c408: 0x6e2e0c20, 0x2c409: 0x6e35ba20, 0x2c40a: 0x6e3b2020, 0x2c40b: 0x6e3b2220, - 0x2c40c: 0x6e3edc20, 0x2c40d: 0x6e3ede20, 0x2c40e: 0x6e417620, 0x2c40f: 0x6d15c620, - 0x2c410: 0x6d43d820, 0x2c411: 0x6d43da20, 0x2c412: 0x6d43dc20, 0x2c413: 0x6d43de20, - 0x2c414: 0x6d99ec20, 0x2c415: 0x6dbcc420, 0x2c416: 0x6ddaa420, 0x2c417: 0x6ddaa620, - 0x2c418: 0x6ddaa820, 0x2c419: 0x6df2a420, 0x2c41a: 0x6df2a620, 0x2c41b: 0x6e174020, - 0x2c41c: 0x6e244620, 0x2c41d: 0x6e2e2c20, 0x2c41e: 0x6d15de20, 0x2c41f: 0x6d70e020, - 0x2c420: 0x6dbce820, 0x2c421: 0x6df2c220, 0x2c422: 0x6df2c420, 0x2c423: 0x6e06ea20, - 0x2c424: 0x6e175620, 0x2c425: 0x6e2e3620, 0x2c426: 0x6ce73c20, 0x2c427: 0x6ce73e20, - 0x2c428: 0x6ce74020, 0x2c429: 0x6d15e620, 0x2c42a: 0x6d440220, 0x2c42b: 0x6d9a0820, - 0x2c42c: 0x6d9a0a20, 0x2c42d: 0x6ddaca20, 0x2c42e: 0x6df2cc20, 0x2c42f: 0x6df2ce20, - 0x2c430: 0x6e245c20, 0x2c431: 0x6ce74420, 0x2c432: 0x6ce74620, 0x2c433: 0x6d15f420, - 0x2c434: 0x6d15f620, 0x2c435: 0x6d15f820, 0x2c436: 0x6d441420, 0x2c437: 0x6d441620, - 0x2c438: 0x6d441820, 0x2c439: 0x6d441a20, 0x2c43a: 0x6d441c20, 0x2c43b: 0x6d441e20, - 0x2c43c: 0x6d442020, 0x2c43d: 0x6d442220, 0x2c43e: 0x6d442420, 0x2c43f: 0x6d70f820, - // Block 0xb11, offset 0x2c440 - 0x2c440: 0x6d70fa20, 0x2c441: 0x6d70fc20, 0x2c442: 0x6d70fe20, 0x2c443: 0x6d9a1a20, - 0x2c444: 0x6d9a1c20, 0x2c445: 0x6d9a1e20, 0x2c446: 0x6d9a2020, 0x2c447: 0x6d9a2220, - 0x2c448: 0x6d9a2420, 0x2c449: 0x6d9a2620, 0x2c44a: 0x6d9a2820, 0x2c44b: 0x6dbcfa20, - 0x2c44c: 0x6dbcfc20, 0x2c44d: 0x6dbcfe20, 0x2c44e: 0x6dbd0020, 0x2c44f: 0x6dbd0220, - 0x2c450: 0x6dbd0420, 0x2c451: 0x6dbd0620, 0x2c452: 0x6dbd0820, 0x2c453: 0x6dbd0a20, - 0x2c454: 0x6ddadc20, 0x2c455: 0x6ddade20, 0x2c456: 0x6ddae020, 0x2c457: 0x6ddae220, - 0x2c458: 0x6ddae420, 0x2c459: 0x6ddae620, 0x2c45a: 0x6ddae820, 0x2c45b: 0x6ddaea20, - 0x2c45c: 0x6ddaec20, 0x2c45d: 0x6ddaee20, 0x2c45e: 0x6df2dc20, 0x2c45f: 0x6df2de20, - 0x2c460: 0x6df2e020, 0x2c461: 0x6df2e220, 0x2c462: 0x6df2e420, 0x2c463: 0x6df2e620, - 0x2c464: 0x6df2e820, 0x2c465: 0x6df2ea20, 0x2c466: 0x6df2ec20, 0x2c467: 0x6df2ee20, - 0x2c468: 0x6e070620, 0x2c469: 0x6e070820, 0x2c46a: 0x6e070a20, 0x2c46b: 0x6e070c20, - 0x2c46c: 0x6e176620, 0x2c46d: 0x6e176820, 0x2c46e: 0x6e176a20, 0x2c46f: 0x6e176c20, - 0x2c470: 0x6e176e20, 0x2c471: 0x6e177020, 0x2c472: 0x6e246820, 0x2c473: 0x6e246a20, - 0x2c474: 0x6e246c20, 0x2c475: 0x6e35da20, 0x2c476: 0x6e35dc20, 0x2c477: 0x6e3b3620, - 0x2c478: 0x6cb6cc20, 0x2c479: 0x6ce77820, 0x2c47a: 0x6d165020, 0x2c47b: 0x6d165220, - 0x2c47c: 0x6d165420, 0x2c47d: 0x6d165620, 0x2c47e: 0x6d447e20, 0x2c47f: 0x6d448020, - // Block 0xb12, offset 0x2c480 - 0x2c480: 0x6d448220, 0x2c481: 0x6d448420, 0x2c482: 0x6d448620, 0x2c483: 0x6d448820, - 0x2c484: 0x6d716c20, 0x2c485: 0x6d716e20, 0x2c486: 0x6d9abc20, 0x2c487: 0x6d9abe20, - 0x2c488: 0x6d9ac020, 0x2c489: 0x6d9ac220, 0x2c48a: 0x6d9ac420, 0x2c48b: 0x6dbd6c20, - 0x2c48c: 0x6dbd6e20, 0x2c48d: 0x6dbd7020, 0x2c48e: 0x6dbd7220, 0x2c48f: 0x6dbd7420, - 0x2c490: 0x6dbd7620, 0x2c491: 0x6ddb4220, 0x2c492: 0x6ddb4420, 0x2c493: 0x6ddb4620, - 0x2c494: 0x6ddb4820, 0x2c495: 0x6ddb4a20, 0x2c496: 0x6ddb4c20, 0x2c497: 0x6ddb4e20, - 0x2c498: 0x6df33c20, 0x2c499: 0x6df33e20, 0x2c49a: 0x6df34020, 0x2c49b: 0x6e074a20, - 0x2c49c: 0x6e074c20, 0x2c49d: 0x6e17ae20, 0x2c49e: 0x6e2e6e20, 0x2c49f: 0x6e35f220, - 0x2c4a0: 0x6dbdbc20, 0x2c4a1: 0x6ddb8620, 0x2c4a2: 0x6cb6d620, 0x2c4a3: 0x6ce79820, - 0x2c4a4: 0x6ce79a20, 0x2c4a5: 0x6ce79c20, 0x2c4a6: 0x6d168a20, 0x2c4a7: 0x6d168c20, - 0x2c4a8: 0x6d168e20, 0x2c4a9: 0x6d169020, 0x2c4aa: 0x6d169220, 0x2c4ab: 0x6d44c220, - 0x2c4ac: 0x6d44c420, 0x2c4ad: 0x6d44c620, 0x2c4ae: 0x6d44c820, 0x2c4af: 0x6d44ca20, - 0x2c4b0: 0x6d44cc20, 0x2c4b1: 0x6d44ce20, 0x2c4b2: 0x6d44d020, 0x2c4b3: 0x6d44d220, - 0x2c4b4: 0x6d44d420, 0x2c4b5: 0x6d719820, 0x2c4b6: 0x6d719a20, 0x2c4b7: 0x6d719c20, - 0x2c4b8: 0x6d719e20, 0x2c4b9: 0x6d71a020, 0x2c4ba: 0x6d71a220, 0x2c4bb: 0x6d71a420, - 0x2c4bc: 0x6d9afa20, 0x2c4bd: 0x6d9afc20, 0x2c4be: 0x6d9afe20, 0x2c4bf: 0x6d9b0020, - // Block 0xb13, offset 0x2c4c0 - 0x2c4c0: 0x6d9b0220, 0x2c4c1: 0x6d9b0420, 0x2c4c2: 0x6d9b0620, 0x2c4c3: 0x6dbdc020, - 0x2c4c4: 0x6dbdc220, 0x2c4c5: 0x6dbdc420, 0x2c4c6: 0x6dbdc620, 0x2c4c7: 0x6dbdc820, - 0x2c4c8: 0x6ddb8a20, 0x2c4c9: 0x6ddb8c20, 0x2c4ca: 0x6ddb8e20, 0x2c4cb: 0x6ddb9020, - 0x2c4cc: 0x6ddb9220, 0x2c4cd: 0x6ddb9420, 0x2c4ce: 0x6ddb9620, 0x2c4cf: 0x6ddb9820, - 0x2c4d0: 0x6df37e20, 0x2c4d1: 0x6df38020, 0x2c4d2: 0x6df38220, 0x2c4d3: 0x6df38420, - 0x2c4d4: 0x6df38620, 0x2c4d5: 0x6e076e20, 0x2c4d6: 0x6e077020, 0x2c4d7: 0x6e077220, - 0x2c4d8: 0x6e17e220, 0x2c4d9: 0x6e17e420, 0x2c4da: 0x6e17e620, 0x2c4db: 0x6e17e820, - 0x2c4dc: 0x6e17ea20, 0x2c4dd: 0x6e24a620, 0x2c4de: 0x6e24a820, 0x2c4df: 0x6e24aa20, - 0x2c4e0: 0x6e24ac20, 0x2c4e1: 0x6e2e7a20, 0x2c4e2: 0x6e2e7c20, 0x2c4e3: 0x6e2e7e20, - 0x2c4e4: 0x6e2e8020, 0x2c4e5: 0x6e360020, 0x2c4e6: 0x6e3f0420, 0x2c4e7: 0x6e3f0620, - 0x2c4e8: 0x6e419620, 0x2c4e9: 0x6e437420, 0x2c4ea: 0x6e182020, 0x2c4eb: 0x6d720820, - 0x2c4ec: 0x6d720a20, 0x2c4ed: 0x6ddbfa20, 0x2c4ee: 0x6df3e420, 0x2c4ef: 0x6d453420, - 0x2c4f0: 0x6dbe5020, 0x2c4f1: 0x6dbe5220, 0x2c4f2: 0x6dbe5420, 0x2c4f3: 0x6e419e20, - 0x2c4f4: 0x6ce7f020, 0x2c4f5: 0x6d171020, 0x2c4f6: 0x6d171220, 0x2c4f7: 0x6d454820, - 0x2c4f8: 0x6d454a20, 0x2c4f9: 0x6d454c20, 0x2c4fa: 0x6d454e20, 0x2c4fb: 0x6d455020, - 0x2c4fc: 0x6d455220, 0x2c4fd: 0x6d455420, 0x2c4fe: 0x6d455620, 0x2c4ff: 0x6d722420, - // Block 0xb14, offset 0x2c500 - 0x2c500: 0x6d722620, 0x2c501: 0x6d722820, 0x2c502: 0x6d722a20, 0x2c503: 0x6d722c20, - 0x2c504: 0x6d722e20, 0x2c505: 0x6d723020, 0x2c506: 0x6d9baa20, 0x2c507: 0x6d9bac20, - 0x2c508: 0x6d9bae20, 0x2c509: 0x6d9bb020, 0x2c50a: 0x6d9bb220, 0x2c50b: 0x6d9bb420, - 0x2c50c: 0x6d9bb620, 0x2c50d: 0x6d9bb820, 0x2c50e: 0x6dbe6620, 0x2c50f: 0x6dbe6820, - 0x2c510: 0x6dbe6a20, 0x2c511: 0x6dbe6c20, 0x2c512: 0x6dbe6e20, 0x2c513: 0x6ddc1620, - 0x2c514: 0x6ddc1820, 0x2c515: 0x6ddc1a20, 0x2c516: 0x6ddc1c20, 0x2c517: 0x6ddc1e20, - 0x2c518: 0x6ddc2020, 0x2c519: 0x6ddc2220, 0x2c51a: 0x6ddc2420, 0x2c51b: 0x6ddc2620, - 0x2c51c: 0x6df3fc20, 0x2c51d: 0x6df3fe20, 0x2c51e: 0x6df40020, 0x2c51f: 0x6df40220, - 0x2c520: 0x6df40420, 0x2c521: 0x6df40620, 0x2c522: 0x6df40820, 0x2c523: 0x6e07d820, - 0x2c524: 0x6e07da20, 0x2c525: 0x6e07dc20, 0x2c526: 0x6e07de20, 0x2c527: 0x6e07e020, - 0x2c528: 0x6e07e220, 0x2c529: 0x6e07e420, 0x2c52a: 0x6e183220, 0x2c52b: 0x6e183420, - 0x2c52c: 0x6e183620, 0x2c52d: 0x6e183820, 0x2c52e: 0x6e183a20, 0x2c52f: 0x6e183c20, - 0x2c530: 0x6e183e20, 0x2c531: 0x6e184020, 0x2c532: 0x6e24e420, 0x2c533: 0x6e24e620, - 0x2c534: 0x6e24e820, 0x2c535: 0x6e24ea20, 0x2c536: 0x6e24ec20, 0x2c537: 0x6e2e9e20, - 0x2c538: 0x6e2ea020, 0x2c539: 0x6e2ea220, 0x2c53a: 0x6e361c20, 0x2c53b: 0x6e361e20, - 0x2c53c: 0x6e362020, 0x2c53d: 0x6e3b5620, 0x2c53e: 0x6e3f1220, 0x2c53f: 0x6e41a220, - // Block 0xb15, offset 0x2c540 - 0x2c540: 0x6e437820, 0x2c541: 0x6e44c020, 0x2c542: 0x6e46b820, 0x2c543: 0x6d9c3020, - 0x2c544: 0x6dbec220, 0x2c545: 0x6e086c20, 0x2c546: 0x6cb72e20, 0x2c547: 0x6ce82a20, - 0x2c548: 0x6d45b820, 0x2c549: 0x6d45ba20, 0x2c54a: 0x6d72b220, 0x2c54b: 0x6d72b420, - 0x2c54c: 0x6d72b620, 0x2c54d: 0x6d72b820, 0x2c54e: 0x6d72ba20, 0x2c54f: 0x6d9c3620, - 0x2c550: 0x6d9c3820, 0x2c551: 0x6d9c3a20, 0x2c552: 0x6d9c3c20, 0x2c553: 0x6d9c3e20, - 0x2c554: 0x6d9c4020, 0x2c555: 0x6dbec620, 0x2c556: 0x6dbec820, 0x2c557: 0x6dbeca20, - 0x2c558: 0x6dbecc20, 0x2c559: 0x6dbece20, 0x2c55a: 0x6dbed020, 0x2c55b: 0x6ddca820, - 0x2c55c: 0x6ddcaa20, 0x2c55d: 0x6df48420, 0x2c55e: 0x6df48620, 0x2c55f: 0x6df48820, - 0x2c560: 0x6df48a20, 0x2c561: 0x6e087420, 0x2c562: 0x6e189220, 0x2c563: 0x6e254420, - 0x2c564: 0x6e2ee420, 0x2c565: 0x6e364220, 0x2c566: 0x6e3b7220, 0x2c567: 0x6ce83e20, - 0x2c568: 0x6d177220, 0x2c569: 0x6d45e420, 0x2c56a: 0x6df4a420, 0x2c56b: 0x6e256220, - 0x2c56c: 0x6e3b7e20, 0x2c56d: 0x6ce84220, 0x2c56e: 0x6ce84420, 0x2c56f: 0x6d45fa20, - 0x2c570: 0x6d45fc20, 0x2c571: 0x6d45fe20, 0x2c572: 0x6d460020, 0x2c573: 0x6d460220, - 0x2c574: 0x6d460420, 0x2c575: 0x6d72ee20, 0x2c576: 0x6d72f020, 0x2c577: 0x6d9c7c20, - 0x2c578: 0x6d9c7e20, 0x2c579: 0x6dbf0c20, 0x2c57a: 0x6dbf0e20, 0x2c57b: 0x6dbf1020, - 0x2c57c: 0x6dbf1220, 0x2c57d: 0x6ddce420, 0x2c57e: 0x6ddce620, 0x2c57f: 0x6ddce820, - // Block 0xb16, offset 0x2c580 - 0x2c580: 0x6ddcea20, 0x2c581: 0x6ddcec20, 0x2c582: 0x6ddcee20, 0x2c583: 0x6ddcf020, - 0x2c584: 0x6df4aa20, 0x2c585: 0x6df4ac20, 0x2c586: 0x6df4ae20, 0x2c587: 0x6df4b020, - 0x2c588: 0x6e08aa20, 0x2c589: 0x6e08ac20, 0x2c58a: 0x6e08ae20, 0x2c58b: 0x6e08b020, - 0x2c58c: 0x6e18b020, 0x2c58d: 0x6e18b220, 0x2c58e: 0x6e256a20, 0x2c58f: 0x6e365420, - 0x2c590: 0x6e365620, 0x2c591: 0x6e365820, 0x2c592: 0x6e365a20, 0x2c593: 0x6e3b8220, - 0x2c594: 0x6e3b8420, 0x2c595: 0x6e3f3020, 0x2c596: 0x6e44c820, 0x2c597: 0x6e08ec20, - 0x2c598: 0x6e18e820, 0x2c599: 0x6d464420, 0x2c59a: 0x6d464620, 0x2c59b: 0x6d734c20, - 0x2c59c: 0x6d9cc620, 0x2c59d: 0x6e25ac20, 0x2c59e: 0x6e3b9c20, 0x2c59f: 0x6d464e20, - 0x2c5a0: 0x6d735420, 0x2c5a1: 0x6d735620, 0x2c5a2: 0x6d9cda20, 0x2c5a3: 0x6d9cdc20, - 0x2c5a4: 0x6ddd4e20, 0x2c5a5: 0x6ddd5020, 0x2c5a6: 0x6ddd5220, 0x2c5a7: 0x6ddd5420, - 0x2c5a8: 0x6df50420, 0x2c5a9: 0x6df50620, 0x2c5aa: 0x6e090020, 0x2c5ab: 0x6e25b820, - 0x2c5ac: 0x6e25ba20, 0x2c5ad: 0x6e25bc20, 0x2c5ae: 0x6e2f3420, 0x2c5af: 0x6e368620, - 0x2c5b0: 0x6e368820, 0x2c5b1: 0x6e46ba20, 0x2c5b2: 0x6ce86c20, 0x2c5b3: 0x6d17c420, - 0x2c5b4: 0x6d468c20, 0x2c5b5: 0x6d468e20, 0x2c5b6: 0x6d469020, 0x2c5b7: 0x6d738620, - 0x2c5b8: 0x6d738820, 0x2c5b9: 0x6d738a20, 0x2c5ba: 0x6d738c20, 0x2c5bb: 0x6d738e20, - 0x2c5bc: 0x6d739020, 0x2c5bd: 0x6d739220, 0x2c5be: 0x6d739420, 0x2c5bf: 0x6d9d0e20, - // Block 0xb17, offset 0x2c5c0 - 0x2c5c0: 0x6d9d1020, 0x2c5c1: 0x6d9d1220, 0x2c5c2: 0x6d9d1420, 0x2c5c3: 0x6d9d1620, - 0x2c5c4: 0x6d9d1820, 0x2c5c5: 0x6d9d1a20, 0x2c5c6: 0x6d9d1c20, 0x2c5c7: 0x6d9d1e20, - 0x2c5c8: 0x6d9d2020, 0x2c5c9: 0x6d9d2220, 0x2c5ca: 0x6dbf9220, 0x2c5cb: 0x6dbf9420, - 0x2c5cc: 0x6dbf9620, 0x2c5cd: 0x6dbf9820, 0x2c5ce: 0x6dbf9a20, 0x2c5cf: 0x6ddd8420, - 0x2c5d0: 0x6ddd8620, 0x2c5d1: 0x6ddd8820, 0x2c5d2: 0x6ddd8a20, 0x2c5d3: 0x6ddd8c20, - 0x2c5d4: 0x6ddd8e20, 0x2c5d5: 0x6ddd9020, 0x2c5d6: 0x6ddd9220, 0x2c5d7: 0x6ddd9420, - 0x2c5d8: 0x6ddd9620, 0x2c5d9: 0x6df51e20, 0x2c5da: 0x6df52020, 0x2c5db: 0x6df52220, - 0x2c5dc: 0x6df52420, 0x2c5dd: 0x6df52620, 0x2c5de: 0x6df52820, 0x2c5df: 0x6df52a20, - 0x2c5e0: 0x6df52c20, 0x2c5e1: 0x6df52e20, 0x2c5e2: 0x6df53020, 0x2c5e3: 0x6df53220, - 0x2c5e4: 0x6df53420, 0x2c5e5: 0x6df53620, 0x2c5e6: 0x6df53820, 0x2c5e7: 0x6df53a20, - 0x2c5e8: 0x6df53c20, 0x2c5e9: 0x6df53e20, 0x2c5ea: 0x6df54020, 0x2c5eb: 0x6e091e20, - 0x2c5ec: 0x6e092020, 0x2c5ed: 0x6e092220, 0x2c5ee: 0x6e092420, 0x2c5ef: 0x6e092620, - 0x2c5f0: 0x6e092820, 0x2c5f1: 0x6e092a20, 0x2c5f2: 0x6e092c20, 0x2c5f3: 0x6e092e20, - 0x2c5f4: 0x6e093020, 0x2c5f5: 0x6e193420, 0x2c5f6: 0x6e193620, 0x2c5f7: 0x6e193820, - 0x2c5f8: 0x6e193a20, 0x2c5f9: 0x6e193c20, 0x2c5fa: 0x6e193e20, 0x2c5fb: 0x6e194020, - 0x2c5fc: 0x6e194220, 0x2c5fd: 0x6e194420, 0x2c5fe: 0x6e25c820, 0x2c5ff: 0x6e25ca20, - // Block 0xb18, offset 0x2c600 - 0x2c600: 0x6e25cc20, 0x2c601: 0x6e25ce20, 0x2c602: 0x6e25d020, 0x2c603: 0x6e25d220, - 0x2c604: 0x6e25d420, 0x2c605: 0x6e25d620, 0x2c606: 0x6e25d820, 0x2c607: 0x6e25da20, - 0x2c608: 0x6e25dc20, 0x2c609: 0x6e2f4820, 0x2c60a: 0x6e2f4a20, 0x2c60b: 0x6e2f4c20, - 0x2c60c: 0x6e2f4e20, 0x2c60d: 0x6e2f5020, 0x2c60e: 0x6e2f5220, 0x2c60f: 0x6e2f5420, - 0x2c610: 0x6e369a20, 0x2c611: 0x6e369c20, 0x2c612: 0x6e369e20, 0x2c613: 0x6e36a020, - 0x2c614: 0x6e36a220, 0x2c615: 0x6e36a420, 0x2c616: 0x6e3ba620, 0x2c617: 0x6e3ba820, - 0x2c618: 0x6e3baa20, 0x2c619: 0x6e3f5220, 0x2c61a: 0x6e41d620, 0x2c61b: 0x6e41d820, - 0x2c61c: 0x6e473220, 0x2c61d: 0x6d740a20, 0x2c61e: 0x6d9dac20, 0x2c61f: 0x6d9dae20, - 0x2c620: 0x6e09e820, 0x2c621: 0x6e09ea20, 0x2c622: 0x6e19f220, 0x2c623: 0x6e19f420, - 0x2c624: 0x6e19f620, 0x2c625: 0x6d180620, 0x2c626: 0x6d46e820, 0x2c627: 0x6d46ea20, - 0x2c628: 0x6d46ec20, 0x2c629: 0x6d46ee20, 0x2c62a: 0x6d46f020, 0x2c62b: 0x6d46f220, - 0x2c62c: 0x6d743620, 0x2c62d: 0x6d743820, 0x2c62e: 0x6d743a20, 0x2c62f: 0x6d743c20, - 0x2c630: 0x6d743e20, 0x2c631: 0x6d744020, 0x2c632: 0x6d744220, 0x2c633: 0x6d744420, - 0x2c634: 0x6d744620, 0x2c635: 0x6d744820, 0x2c636: 0x6d744a20, 0x2c637: 0x6d744c20, - 0x2c638: 0x6d744e20, 0x2c639: 0x6d9de220, 0x2c63a: 0x6d9de420, 0x2c63b: 0x6d9de620, - 0x2c63c: 0x6d9de820, 0x2c63d: 0x6d9dea20, 0x2c63e: 0x6d9dec20, 0x2c63f: 0x6d9dee20, - // Block 0xb19, offset 0x2c640 - 0x2c640: 0x6d9df020, 0x2c641: 0x6d9df220, 0x2c642: 0x6d9df420, 0x2c643: 0x6d9df620, - 0x2c644: 0x6d9df820, 0x2c645: 0x6d9dfa20, 0x2c646: 0x6d9dfc20, 0x2c647: 0x6d9dfe20, - 0x2c648: 0x6d9e0020, 0x2c649: 0x6d9e0220, 0x2c64a: 0x6d9e0420, 0x2c64b: 0x6dc06c20, - 0x2c64c: 0x6dc06e20, 0x2c64d: 0x6dc07020, 0x2c64e: 0x6dc07220, 0x2c64f: 0x6dc07420, - 0x2c650: 0x6dc07620, 0x2c651: 0x6dc07820, 0x2c652: 0x6dc07a20, 0x2c653: 0x6dc07c20, - 0x2c654: 0x6dc07e20, 0x2c655: 0x6dde3e20, 0x2c656: 0x6dde4020, 0x2c657: 0x6dde4220, - 0x2c658: 0x6dde4420, 0x2c659: 0x6dde4620, 0x2c65a: 0x6dde4820, 0x2c65b: 0x6dde4a20, - 0x2c65c: 0x6dde4c20, 0x2c65d: 0x6df63a20, 0x2c65e: 0x6df63c20, 0x2c65f: 0x6df63e20, - 0x2c660: 0x6df64020, 0x2c661: 0x6df64220, 0x2c662: 0x6df64420, 0x2c663: 0x6df64620, - 0x2c664: 0x6df64820, 0x2c665: 0x6df64a20, 0x2c666: 0x6e09f820, 0x2c667: 0x6e09fa20, - 0x2c668: 0x6e09fc20, 0x2c669: 0x6e09fe20, 0x2c66a: 0x6e0a0020, 0x2c66b: 0x6e0a0220, - 0x2c66c: 0x6e0a0420, 0x2c66d: 0x6e0a0620, 0x2c66e: 0x6e0a0820, 0x2c66f: 0x6e0a0a20, - 0x2c670: 0x6e0a0c20, 0x2c671: 0x6e1a0420, 0x2c672: 0x6e1a0620, 0x2c673: 0x6e1a0820, - 0x2c674: 0x6e1a0a20, 0x2c675: 0x6e1a0c20, 0x2c676: 0x6e1a0e20, 0x2c677: 0x6e267820, - 0x2c678: 0x6e267a20, 0x2c679: 0x6e267c20, 0x2c67a: 0x6e267e20, 0x2c67b: 0x6e268020, - 0x2c67c: 0x6e268220, 0x2c67d: 0x6e268420, 0x2c67e: 0x6e2fe020, 0x2c67f: 0x6e2fe220, - // Block 0xb1a, offset 0x2c680 - 0x2c680: 0x6e2fe420, 0x2c681: 0x6e2fe620, 0x2c682: 0x6e2fe820, 0x2c683: 0x6e2fea20, - 0x2c684: 0x6e2fec20, 0x2c685: 0x6e2fee20, 0x2c686: 0x6e2ff020, 0x2c687: 0x6e371820, - 0x2c688: 0x6e371a20, 0x2c689: 0x6e371c20, 0x2c68a: 0x6e371e20, 0x2c68b: 0x6e372020, - 0x2c68c: 0x6e3be620, 0x2c68d: 0x6e3be820, 0x2c68e: 0x6e3f8620, 0x2c68f: 0x6e41f820, - 0x2c690: 0x6e45fe20, 0x2c691: 0x6e46bc20, 0x2c692: 0x6e46d420, 0x2c693: 0x6d74de20, - 0x2c694: 0x6dc13420, 0x2c695: 0x6dc13620, 0x2c696: 0x6df72e20, 0x2c697: 0x6e0ad420, - 0x2c698: 0x6e1ac220, 0x2c699: 0x6e378a20, 0x2c69a: 0x6d74fe20, 0x2c69b: 0x6ddef020, - 0x2c69c: 0x6e1ac420, 0x2c69d: 0x6e30a820, 0x2c69e: 0x6e3c3220, 0x2c69f: 0x6d474a20, - 0x2c6a0: 0x6d750c20, 0x2c6a1: 0x6d750e20, 0x2c6a2: 0x6d751020, 0x2c6a3: 0x6d9edc20, - 0x2c6a4: 0x6d9ede20, 0x2c6a5: 0x6d9ee020, 0x2c6a6: 0x6ddefa20, 0x2c6a7: 0x6df74620, - 0x2c6a8: 0x6e1ad420, 0x2c6a9: 0x6e274220, 0x2c6aa: 0x6e379620, 0x2c6ab: 0x6e379820, - 0x2c6ac: 0x6d475020, 0x2c6ad: 0x6d475220, 0x2c6ae: 0x6d475420, 0x2c6af: 0x6d753020, - 0x2c6b0: 0x6d753220, 0x2c6b1: 0x6d9efe20, 0x2c6b2: 0x6d9f0020, 0x2c6b3: 0x6d9f0220, - 0x2c6b4: 0x6d9f0420, 0x2c6b5: 0x6dc16e20, 0x2c6b6: 0x6ddf2820, 0x2c6b7: 0x6ddf2a20, - 0x2c6b8: 0x6ddf2c20, 0x2c6b9: 0x6df76a20, 0x2c6ba: 0x6df76c20, 0x2c6bb: 0x6df76e20, - 0x2c6bc: 0x6df77020, 0x2c6bd: 0x6df77220, 0x2c6be: 0x6e1ae420, 0x2c6bf: 0x6e1ae620, - // Block 0xb1b, offset 0x2c6c0 - 0x2c6c0: 0x6e1ae820, 0x2c6c1: 0x6e275020, 0x2c6c2: 0x6e275220, 0x2c6c3: 0x6e30c820, - 0x2c6c4: 0x6e37a420, 0x2c6c5: 0x6e275420, 0x2c6c6: 0x6e3c4820, 0x2c6c7: 0x6d756220, - 0x2c6c8: 0x6e0b2620, 0x2c6c9: 0x6e0b2820, 0x2c6ca: 0x6d9f3220, 0x2c6cb: 0x6ddf5820, - 0x2c6cc: 0x6df7a420, 0x2c6cd: 0x6e0b3020, 0x2c6ce: 0x6e1afe20, 0x2c6cf: 0x6e30de20, - 0x2c6d0: 0x6e37b620, 0x2c6d1: 0x6d757e20, 0x2c6d2: 0x6d9f3a20, 0x2c6d3: 0x6d9f3c20, - 0x2c6d4: 0x6e0b3e20, 0x2c6d5: 0x6e0b4020, 0x2c6d6: 0x6e0b4220, 0x2c6d7: 0x6e1b0c20, - 0x2c6d8: 0x6e1b0e20, 0x2c6d9: 0x6e1b1020, 0x2c6da: 0x6e278220, 0x2c6db: 0x6e30e620, - 0x2c6dc: 0x6e3c4e20, 0x2c6dd: 0x6d187020, 0x2c6de: 0x6d477220, 0x2c6df: 0x6d758620, - 0x2c6e0: 0x6dc1bc20, 0x2c6e1: 0x6d9f4a20, 0x2c6e2: 0x6dc1be20, 0x2c6e3: 0x6dc1c020, - 0x2c6e4: 0x6ddf6a20, 0x2c6e5: 0x6ddf6c20, 0x2c6e6: 0x6ddf6e20, 0x2c6e7: 0x6ddf7020, - 0x2c6e8: 0x6df7c220, 0x2c6e9: 0x6df7c420, 0x2c6ea: 0x6e0b4e20, 0x2c6eb: 0x6e0b5020, - 0x2c6ec: 0x6e0b5220, 0x2c6ed: 0x6e1b1a20, 0x2c6ee: 0x6e1b1c20, 0x2c6ef: 0x6e1b1e20, - 0x2c6f0: 0x6e30f020, 0x2c6f1: 0x6e37c020, 0x2c6f2: 0x6e3c5220, 0x2c6f3: 0x6e3c5420, - 0x2c6f4: 0x6e3c5620, 0x2c6f5: 0x6e3fc620, 0x2c6f6: 0x6ddf8c20, 0x2c6f7: 0x6df7e220, - 0x2c6f8: 0x6e27ae20, 0x2c6f9: 0x6e37e420, 0x2c6fa: 0x6d9f7620, 0x2c6fb: 0x6e37e820, - 0x2c6fc: 0x6e37ea20, 0x2c6fd: 0x6ddfa420, 0x2c6fe: 0x6ddfa620, 0x2c6ff: 0x6ddfa820, - // Block 0xb1c, offset 0x2c700 - 0x2c700: 0x6df7f620, 0x2c701: 0x6e1b6c20, 0x2c702: 0x6d9f8020, 0x2c703: 0x6dc20020, - 0x2c704: 0x6ddfb620, 0x2c705: 0x6df80a20, 0x2c706: 0x6e1b7e20, 0x2c707: 0x6e27d620, - 0x2c708: 0x6e311820, 0x2c709: 0x6e311a20, 0x2c70a: 0x6ddfdc20, 0x2c70b: 0x6ddfde20, - 0x2c70c: 0x6df82020, 0x2c70d: 0x6e0bc420, 0x2c70e: 0x6e0bc620, 0x2c70f: 0x6e1b8820, - 0x2c710: 0x6e424c20, 0x2c711: 0x6e45a820, 0x2c712: 0x6dc22820, 0x2c713: 0x6dc22a20, - 0x2c714: 0x6ddff420, 0x2c715: 0x6df83a20, 0x2c716: 0x6df83c20, 0x2c717: 0x6e0bd420, - 0x2c718: 0x6e0bd620, 0x2c719: 0x6e0bd820, 0x2c71a: 0x6e1ba020, 0x2c71b: 0x6e1ba220, - 0x2c71c: 0x6e27fc20, 0x2c71d: 0x6e27fe20, 0x2c71e: 0x6e314620, 0x2c71f: 0x6e314820, - 0x2c720: 0x6e380c20, 0x2c721: 0x6e380e20, 0x2c722: 0x6e381020, 0x2c723: 0x6e3ca420, - 0x2c724: 0x6e3ca620, 0x2c725: 0x6e3fe620, 0x2c726: 0x6e3fe820, 0x2c727: 0x6e425620, - 0x2c728: 0x6e440420, 0x2c729: 0x6e450c20, 0x2c72a: 0x6e450e20, 0x2c72b: 0x6e46da20, - 0x2c72c: 0x6e283620, 0x2c72d: 0x6e0c2020, 0x2c72e: 0x6e0c2220, 0x2c72f: 0x6df86420, - 0x2c730: 0x6e0c2420, 0x2c731: 0x6e1be620, 0x2c732: 0x6e1be820, 0x2c733: 0x6e1bfe20, - 0x2c734: 0x6e3cd820, 0x2c735: 0x6e427e20, - // Block 0xb1d, offset 0x2c740 - 0x2c740: 0x6c000220, 0x2c741: 0x6c003220, 0x2c742: 0x6c003420, 0x2c743: 0x6c003620, - 0x2c744: 0x6c003820, 0x2c745: 0x6c003a20, 0x2c746: 0x6c003c20, 0x2c747: 0x6c00d820, - 0x2c748: 0x6c00da20, 0x2c749: 0x6c00dc20, 0x2c74a: 0x6c00de20, 0x2c74b: 0x6c00e020, - 0x2c74c: 0x6c00e220, 0x2c74d: 0x6c021a20, 0x2c74e: 0x6c021c20, 0x2c74f: 0x6c021e20, - 0x2c750: 0x6c022020, 0x2c751: 0x6c022220, 0x2c752: 0x6c022420, 0x2c753: 0x6c022620, - 0x2c754: 0x6c054020, 0x2c755: 0x6c054220, 0x2c756: 0x6c054420, 0x2c757: 0x6c053c20, - 0x2c758: 0x6c054620, 0x2c759: 0x6c054820, 0x2c75a: 0x6c054a20, 0x2c75b: 0x6c054c20, - 0x2c75c: 0x6c054e20, 0x2c75d: 0x6c055020, 0x2c75e: 0x6c0ad020, 0x2c75f: 0x6c0ad220, - 0x2c760: 0x6c0ad420, 0x2c761: 0x6c0ad620, 0x2c762: 0x6c0ad820, 0x2c763: 0x6c15e420, - 0x2c764: 0x6c15e620, 0x2c765: 0x6c15e820, 0x2c766: 0x6c28ae20, 0x2c767: 0x6c28b020, - 0x2c768: 0x6c000420, 0x2c769: 0x6c004420, 0x2c76a: 0x6c00fa20, 0x2c76b: 0x6c00fc20, - 0x2c76c: 0x6c04e220, 0x2c76d: 0x6c023620, 0x2c76e: 0x6c023820, 0x2c76f: 0x6c023a20, - 0x2c770: 0x6c023c20, 0x2c771: 0x6c056820, 0x2c772: 0x6c160020, 0x2c773: 0x6c28c420, - 0x2c774: 0x6c42f620, 0x2c775: 0x6c63d820, 0x2c776: 0x6c000620, 0x2c777: 0x6c004a20, - 0x2c778: 0x6c00fe20, 0x2c779: 0x6c024220, 0x2c77a: 0x6c024420, 0x2c77b: 0x6c056c20, - 0x2c77c: 0x6c056e20, 0x2c77d: 0x6c15ea20, 0x2c77e: 0x6c430020, 0x2c77f: 0x6c000820, - // Block 0xb1e, offset 0x2c780 - 0x2c780: 0x6c000a20, 0x2c781: 0x6c000c20, 0x2c782: 0x6c005020, 0x2c783: 0x6c005220, - 0x2c784: 0x6c005420, 0x2c785: 0x6c010620, 0x2c786: 0x6c010820, 0x2c787: 0x6c010a20, - 0x2c788: 0x6c010c20, 0x2c789: 0x6c010020, 0x2c78a: 0x6c010e20, 0x2c78b: 0x6c024820, - 0x2c78c: 0x6c024a20, 0x2c78d: 0x6c057420, 0x2c78e: 0x6c057620, 0x2c78f: 0x6c057820, - 0x2c790: 0x6c057a20, 0x2c791: 0x6c0af020, 0x2c792: 0x6c0af220, 0x2c793: 0x6c0af420, - 0x2c794: 0x6c0af620, 0x2c795: 0x6c160620, 0x2c796: 0x6c28d020, 0x2c797: 0x6c430220, - 0x2c798: 0x6c63e020, 0x2c799: 0x6c001020, 0x2c79a: 0x6c001220, 0x2c79b: 0x6c001420, - 0x2c79c: 0x6c006020, 0x2c79d: 0x6c006220, 0x2c79e: 0x6c012020, 0x2c79f: 0x6c012220, - 0x2c7a0: 0x6c012420, 0x2c7a1: 0x6c01d020, 0x2c7a2: 0x6c041020, 0x2c7a3: 0x6c025c20, - 0x2c7a4: 0x6c025e20, 0x2c7a5: 0x6c026020, 0x2c7a6: 0x6c026220, 0x2c7a7: 0x6c05a020, - 0x2c7a8: 0x6c0b1a20, 0x2c7a9: 0x6c0b1c20, 0x2c7aa: 0x6c0b1e20, 0x2c7ab: 0x6c0b2020, - 0x2c7ac: 0x6c0b2220, 0x2c7ad: 0x6c0b2420, 0x2c7ae: 0x6c0b2620, 0x2c7af: 0x6c0b2820, - 0x2c7b0: 0x6c0b2a20, 0x2c7b1: 0x6c161020, 0x2c7b2: 0x6c161220, 0x2c7b3: 0x6c28de20, - 0x2c7b4: 0x6c28e020, 0x2c7b5: 0x6c28e220, 0x2c7b6: 0x6c28e420, 0x2c7b7: 0x6c28e620, - 0x2c7b8: 0x6c28e820, 0x2c7b9: 0x6c431420, 0x2c7ba: 0x6c431620, 0x2c7bb: 0x6c431820, - 0x2c7bc: 0x6c431a20, 0x2c7bd: 0x6c63f220, 0x2c7be: 0x6c8b0c20, 0x2c7bf: 0x6c8b0e20, - // Block 0xb1f, offset 0x2c7c0 - 0x2c7c0: 0x6c8b1020, 0x2c7c1: 0x6cb7b220, 0x2c7c2: 0x6ce8d220, 0x2c7c3: 0x6ce8d420, - 0x2c7c4: 0x6ce8d620, 0x2c7c5: 0x6c002420, 0x2c7c6: 0x6c006a20, 0x2c7c7: 0x6c012c20, - 0x2c7c8: 0x6c027a20, 0x2c7c9: 0x6c0b3820, 0x2c7ca: 0x6c162020, 0x2c7cb: 0x6c28f420, - 0x2c7cc: 0x6c007420, 0x2c7cd: 0x6c013020, 0x2c7ce: 0x6c013220, 0x2c7cf: 0x6c013420, - 0x2c7d0: 0x6c00e420, 0x2c7d1: 0x6c028220, 0x2c7d2: 0x6c028420, 0x2c7d3: 0x6c028620, - 0x2c7d4: 0x6c028820, 0x2c7d5: 0x6c028a20, 0x2c7d6: 0x6c028c20, 0x2c7d7: 0x6c05b020, - 0x2c7d8: 0x6c0b3e20, 0x2c7d9: 0x6c0b4020, 0x2c7da: 0x6c0b4220, 0x2c7db: 0x6c28f820, - 0x2c7dc: 0x6c162a20, 0x2c7dd: 0x6c28fc20, 0x2c7de: 0x6c28fe20, 0x2c7df: 0x6c290020, - 0x2c7e0: 0x6c007c20, 0x2c7e1: 0x6c013620, 0x2c7e2: 0x6c029020, 0x2c7e3: 0x6c029220, - 0x2c7e4: 0x6c0b5420, 0x2c7e5: 0x6c0b5620, 0x2c7e6: 0x6c0b5820, 0x2c7e7: 0x6c0b5a20, - 0x2c7e8: 0x6c163620, 0x2c7e9: 0x6c163820, 0x2c7ea: 0x6c163a20, 0x2c7eb: 0x6c290e20, - 0x2c7ec: 0x6c291020, 0x2c7ed: 0x6c433420, 0x2c7ee: 0x6c433620, 0x2c7ef: 0x6c433820, - 0x2c7f0: 0x6c433a20, 0x2c7f1: 0x6c433c20, 0x2c7f2: 0x6c433e20, 0x2c7f3: 0x6c640a20, - 0x2c7f4: 0x6cb7c020, 0x2c7f5: 0x6cb7c220, 0x2c7f6: 0x6ce8e620, 0x2c7f7: 0x6ce8e820, - 0x2c7f8: 0x6d75da20, 0x2c7f9: 0x6e1c0620, 0x2c7fa: 0x6c007e20, 0x2c7fb: 0x6c008020, - 0x2c7fc: 0x6c013820, 0x2c7fd: 0x6c013a20, 0x2c7fe: 0x6c013c20, 0x2c7ff: 0x6c013e20, - // Block 0xb20, offset 0x2c800 - 0x2c800: 0x6c029620, 0x2c801: 0x6c029820, 0x2c802: 0x6c029a20, 0x2c803: 0x6c029c20, - 0x2c804: 0x6c029e20, 0x2c805: 0x6c02a020, 0x2c806: 0x6c02a220, 0x2c807: 0x6c02a420, - 0x2c808: 0x6c02a620, 0x2c809: 0x6c02a820, 0x2c80a: 0x6c02aa20, 0x2c80b: 0x6c02ac20, - 0x2c80c: 0x6c02ae20, 0x2c80d: 0x6c02b020, 0x2c80e: 0x6c02b220, 0x2c80f: 0x6c02b420, - 0x2c810: 0x6c02b620, 0x2c811: 0x6c02b820, 0x2c812: 0x6c02ba20, 0x2c813: 0x6c02bc20, - 0x2c814: 0x6c05c820, 0x2c815: 0x6c05ca20, 0x2c816: 0x6c05cc20, 0x2c817: 0x6c05ce20, - 0x2c818: 0x6c05d020, 0x2c819: 0x6c05d220, 0x2c81a: 0x6c05d420, 0x2c81b: 0x6c05d620, - 0x2c81c: 0x6c05d820, 0x2c81d: 0x6c05da20, 0x2c81e: 0x6c05dc20, 0x2c81f: 0x6c05de20, - 0x2c820: 0x6c05e020, 0x2c821: 0x6c05e220, 0x2c822: 0x6c05e420, 0x2c823: 0x6c05e620, - 0x2c824: 0x6c05e820, 0x2c825: 0x6c05ea20, 0x2c826: 0x6c05ec20, 0x2c827: 0x6c05ee20, - 0x2c828: 0x6c05f020, 0x2c829: 0x6c05f220, 0x2c82a: 0x6c05f420, 0x2c82b: 0x6c05f620, - 0x2c82c: 0x6c05f820, 0x2c82d: 0x6c05fa20, 0x2c82e: 0x6c0b7a20, 0x2c82f: 0x6c0b7c20, - 0x2c830: 0x6c0b7e20, 0x2c831: 0x6c0b8020, 0x2c832: 0x6c0b8220, 0x2c833: 0x6c0b8420, - 0x2c834: 0x6c0b8620, 0x2c835: 0x6c0b8820, 0x2c836: 0x6c0b8a20, 0x2c837: 0x6c0b8c20, - 0x2c838: 0x6c0b8e20, 0x2c839: 0x6c0b9020, 0x2c83a: 0x6c0b9220, 0x2c83b: 0x6c0b9420, - 0x2c83c: 0x6c0b9620, 0x2c83d: 0x6c0b9820, 0x2c83e: 0x6c0b9a20, 0x2c83f: 0x6c0b9c20, - // Block 0xb21, offset 0x2c840 - 0x2c840: 0x6c0b9e20, 0x2c841: 0x6c0ba020, 0x2c842: 0x6c0ba220, 0x2c843: 0x6c0ba420, - 0x2c844: 0x6c0ba620, 0x2c845: 0x6c0ba820, 0x2c846: 0x6c0baa20, 0x2c847: 0x6c0bac20, - 0x2c848: 0x6c0bae20, 0x2c849: 0x6c0bb020, 0x2c84a: 0x6c0bb220, 0x2c84b: 0x6c0bb420, - 0x2c84c: 0x6c0bb620, 0x2c84d: 0x6c0bb820, 0x2c84e: 0x6c0bba20, 0x2c84f: 0x6c0bbc20, - 0x2c850: 0x6c0bbe20, 0x2c851: 0x6c0bc020, 0x2c852: 0x6c0bc220, 0x2c853: 0x6c0bc420, - 0x2c854: 0x6c0bc620, 0x2c855: 0x6c0bc820, 0x2c856: 0x6c0bca20, 0x2c857: 0x6c0bcc20, - 0x2c858: 0x6c0bce20, 0x2c859: 0x6c0bd020, 0x2c85a: 0x6c0bd220, 0x2c85b: 0x6c0bd420, - 0x2c85c: 0x6c0bd620, 0x2c85d: 0x6c0bd820, 0x2c85e: 0x6c0bda20, 0x2c85f: 0x6c0bdc20, - 0x2c860: 0x6c0bde20, 0x2c861: 0x6c0be020, 0x2c862: 0x6c0be220, 0x2c863: 0x6c0be420, - 0x2c864: 0x6c0be620, 0x2c865: 0x6c0be820, 0x2c866: 0x6c0bea20, 0x2c867: 0x6c0bec20, - 0x2c868: 0x6c0bee20, 0x2c869: 0x6c0bf020, 0x2c86a: 0x6c0bf220, 0x2c86b: 0x6c0bf420, - 0x2c86c: 0x6c0bf620, 0x2c86d: 0x6c165620, 0x2c86e: 0x6c165820, 0x2c86f: 0x6c165a20, - 0x2c870: 0x6c165c20, 0x2c871: 0x6c165e20, 0x2c872: 0x6c166020, 0x2c873: 0x6c166220, - 0x2c874: 0x6c166420, 0x2c875: 0x6c166620, 0x2c876: 0x6c166820, 0x2c877: 0x6c166a20, - 0x2c878: 0x6c166c20, 0x2c879: 0x6c166e20, 0x2c87a: 0x6c167020, 0x2c87b: 0x6c167220, - 0x2c87c: 0x6c167420, 0x2c87d: 0x6c167620, 0x2c87e: 0x6c167820, 0x2c87f: 0x6c167a20, - // Block 0xb22, offset 0x2c880 - 0x2c880: 0x6c167c20, 0x2c881: 0x6c167e20, 0x2c882: 0x6c168020, 0x2c883: 0x6c168220, - 0x2c884: 0x6c168420, 0x2c885: 0x6c168620, 0x2c886: 0x6c168820, 0x2c887: 0x6c168a20, - 0x2c888: 0x6c168c20, 0x2c889: 0x6c168e20, 0x2c88a: 0x6c169020, 0x2c88b: 0x6c169220, - 0x2c88c: 0x6c292020, 0x2c88d: 0x6c169420, 0x2c88e: 0x6c169620, 0x2c88f: 0x6c169820, - 0x2c890: 0x6c169a20, 0x2c891: 0x6c169c20, 0x2c892: 0x6c169e20, 0x2c893: 0x6c16a020, - 0x2c894: 0x6c16a220, 0x2c895: 0x6c16a420, 0x2c896: 0x6c16a620, 0x2c897: 0x6c16a820, - 0x2c898: 0x6c16aa20, 0x2c899: 0x6c16ac20, 0x2c89a: 0x6c16ae20, 0x2c89b: 0x6c16b020, - 0x2c89c: 0x6c16b220, 0x2c89d: 0x6c16b420, 0x2c89e: 0x6c16b620, 0x2c89f: 0x6c16b820, - 0x2c8a0: 0x6c16ba20, 0x2c8a1: 0x6c16bc20, 0x2c8a2: 0x6c16be20, 0x2c8a3: 0x6c16c020, - 0x2c8a4: 0x6c0bf820, 0x2c8a5: 0x6c16c220, 0x2c8a6: 0x6c16c420, 0x2c8a7: 0x6c16c620, - 0x2c8a8: 0x6c16c820, 0x2c8a9: 0x6c293e20, 0x2c8aa: 0x6c294020, 0x2c8ab: 0x6c294220, - 0x2c8ac: 0x6c294420, 0x2c8ad: 0x6c294620, 0x2c8ae: 0x6c294820, 0x2c8af: 0x6c294a20, - 0x2c8b0: 0x6c294c20, 0x2c8b1: 0x6c294e20, 0x2c8b2: 0x6c295020, 0x2c8b3: 0x6c295220, - 0x2c8b4: 0x6c295420, 0x2c8b5: 0x6c295620, 0x2c8b6: 0x6c295820, 0x2c8b7: 0x6c295a20, - 0x2c8b8: 0x6c295c20, 0x2c8b9: 0x6c295e20, 0x2c8ba: 0x6c296020, 0x2c8bb: 0x6c296220, - 0x2c8bc: 0x6c296420, 0x2c8bd: 0x6c296620, 0x2c8be: 0x6c296820, 0x2c8bf: 0x6c296a20, - // Block 0xb23, offset 0x2c8c0 - 0x2c8c0: 0x6c296c20, 0x2c8c1: 0x6c296e20, 0x2c8c2: 0x6c297020, 0x2c8c3: 0x6c297220, - 0x2c8c4: 0x6c297420, 0x2c8c5: 0x6c297620, 0x2c8c6: 0x6c297820, 0x2c8c7: 0x6c297a20, - 0x2c8c8: 0x6c297c20, 0x2c8c9: 0x6c297e20, 0x2c8ca: 0x6c298020, 0x2c8cb: 0x6c298220, - 0x2c8cc: 0x6c298420, 0x2c8cd: 0x6c298620, 0x2c8ce: 0x6c298820, 0x2c8cf: 0x6c298a20, - 0x2c8d0: 0x6c298c20, 0x2c8d1: 0x6c298e20, 0x2c8d2: 0x6c299020, 0x2c8d3: 0x6c299220, - 0x2c8d4: 0x6c299420, 0x2c8d5: 0x6c299620, 0x2c8d6: 0x6c299820, 0x2c8d7: 0x6c299a20, - 0x2c8d8: 0x6c299c20, 0x2c8d9: 0x6c299e20, 0x2c8da: 0x6c29a020, 0x2c8db: 0x6c29a220, - 0x2c8dc: 0x6c29a420, 0x2c8dd: 0x6c29a620, 0x2c8de: 0x6c29a820, 0x2c8df: 0x6c29aa20, - 0x2c8e0: 0x6c29ac20, 0x2c8e1: 0x6c29ae20, 0x2c8e2: 0x6c29b020, 0x2c8e3: 0x6c29b220, - 0x2c8e4: 0x6c29b420, 0x2c8e5: 0x6c29b620, 0x2c8e6: 0x6c29b820, 0x2c8e7: 0x6c29ba20, - 0x2c8e8: 0x6c29bc20, 0x2c8e9: 0x6c29be20, 0x2c8ea: 0x6c29c020, 0x2c8eb: 0x6c29c220, - 0x2c8ec: 0x6c29c420, 0x2c8ed: 0x6c29c620, 0x2c8ee: 0x6c435e20, 0x2c8ef: 0x6c436020, - 0x2c8f0: 0x6c436220, 0x2c8f1: 0x6c436420, 0x2c8f2: 0x6c436620, 0x2c8f3: 0x6c436820, - 0x2c8f4: 0x6c436a20, 0x2c8f5: 0x6c436c20, 0x2c8f6: 0x6c436e20, 0x2c8f7: 0x6c437020, - 0x2c8f8: 0x6c437220, 0x2c8f9: 0x6c437420, 0x2c8fa: 0x6c437620, 0x2c8fb: 0x6c437820, - 0x2c8fc: 0x6c437a20, 0x2c8fd: 0x6c437c20, 0x2c8fe: 0x6c437e20, 0x2c8ff: 0x6c438020, - // Block 0xb24, offset 0x2c900 - 0x2c900: 0x6c438220, 0x2c901: 0x6c438420, 0x2c902: 0x6c438620, 0x2c903: 0x6c438820, - 0x2c904: 0x6c438a20, 0x2c905: 0x6c438c20, 0x2c906: 0x6c438e20, 0x2c907: 0x6c439020, - 0x2c908: 0x6c439220, 0x2c909: 0x6c439420, 0x2c90a: 0x6c439620, 0x2c90b: 0x6c439820, - 0x2c90c: 0x6c439a20, 0x2c90d: 0x6c439c20, 0x2c90e: 0x6c439e20, 0x2c90f: 0x6c43a020, - 0x2c910: 0x6c43a220, 0x2c911: 0x6c43a420, 0x2c912: 0x6c43a620, 0x2c913: 0x6c43a820, - 0x2c914: 0x6c43aa20, 0x2c915: 0x6c43ac20, 0x2c916: 0x6c43ae20, 0x2c917: 0x6c43b020, - 0x2c918: 0x6c43b220, 0x2c919: 0x6c43b420, 0x2c91a: 0x6c43b620, 0x2c91b: 0x6c43b820, - 0x2c91c: 0x6c43ba20, 0x2c91d: 0x6c43bc20, 0x2c91e: 0x6c43be20, 0x2c91f: 0x6c43c020, - 0x2c920: 0x6c43c220, 0x2c921: 0x6c43c420, 0x2c922: 0x6c43c620, 0x2c923: 0x6c43c820, - 0x2c924: 0x6c43ca20, 0x2c925: 0x6c43cc20, 0x2c926: 0x6c43ce20, 0x2c927: 0x6c43d020, - 0x2c928: 0x6c43d220, 0x2c929: 0x6c43d420, 0x2c92a: 0x6c43d620, 0x2c92b: 0x6c43d820, - 0x2c92c: 0x6c43da20, 0x2c92d: 0x6c43dc20, 0x2c92e: 0x6c642e20, 0x2c92f: 0x6c643020, - 0x2c930: 0x6c643220, 0x2c931: 0x6c643420, 0x2c932: 0x6c643620, 0x2c933: 0x6c643820, - 0x2c934: 0x6c643a20, 0x2c935: 0x6c643c20, 0x2c936: 0x6c643e20, 0x2c937: 0x6c644020, - 0x2c938: 0x6c644220, 0x2c939: 0x6c644420, 0x2c93a: 0x6c644620, 0x2c93b: 0x6c644820, - 0x2c93c: 0x6c644a20, 0x2c93d: 0x6c644c20, 0x2c93e: 0x6c644e20, 0x2c93f: 0x6c645020, - // Block 0xb25, offset 0x2c940 - 0x2c940: 0x6c645220, 0x2c941: 0x6c645420, 0x2c942: 0x6c645620, 0x2c943: 0x6c645820, - 0x2c944: 0x6c645a20, 0x2c945: 0x6c645c20, 0x2c946: 0x6c645e20, 0x2c947: 0x6c646020, - 0x2c948: 0x6c646220, 0x2c949: 0x6c646420, 0x2c94a: 0x6c646620, 0x2c94b: 0x6c646820, - 0x2c94c: 0x6c646a20, 0x2c94d: 0x6c646c20, 0x2c94e: 0x6c646e20, 0x2c94f: 0x6c647020, - 0x2c950: 0x6c647220, 0x2c951: 0x6c647420, 0x2c952: 0x6c647620, 0x2c953: 0x6c647820, - 0x2c954: 0x6c647a20, 0x2c955: 0x6c647c20, 0x2c956: 0x6c647e20, 0x2c957: 0x6c648020, - 0x2c958: 0x6c648220, 0x2c959: 0x6c648420, 0x2c95a: 0x6c648620, 0x2c95b: 0x6c648820, - 0x2c95c: 0x6c648a20, 0x2c95d: 0x6c648c20, 0x2c95e: 0x6c648e20, 0x2c95f: 0x6c649020, - 0x2c960: 0x6c649220, 0x2c961: 0x6c649420, 0x2c962: 0x6c649620, 0x2c963: 0x6c649820, - 0x2c964: 0x6c649a20, 0x2c965: 0x6c649c20, 0x2c966: 0x6c649e20, 0x2c967: 0x6c64a020, - 0x2c968: 0x6c64a220, 0x2c969: 0x6c64a420, 0x2c96a: 0x6c64a620, 0x2c96b: 0x6c64a820, - 0x2c96c: 0x6c64aa20, 0x2c96d: 0x6c64ac20, 0x2c96e: 0x6c64ae20, 0x2c96f: 0x6c64b020, - 0x2c970: 0x6c64b220, 0x2c971: 0x6c64b420, 0x2c972: 0x6c64b620, 0x2c973: 0x6c64b820, - 0x2c974: 0x6c64ba20, 0x2c975: 0x6c64bc20, 0x2c976: 0x6c64be20, 0x2c977: 0x6c64c020, - 0x2c978: 0x6c64c220, 0x2c979: 0x6c64c420, 0x2c97a: 0x6c64c620, 0x2c97b: 0x6c64c820, - 0x2c97c: 0x6c64ca20, 0x2c97d: 0x6c64cc20, 0x2c97e: 0x6c64ce20, 0x2c97f: 0x6c64d020, - // Block 0xb26, offset 0x2c980 - 0x2c980: 0x6c8b4a20, 0x2c981: 0x6c8b4c20, 0x2c982: 0x6c8b4e20, 0x2c983: 0x6c8b5020, - 0x2c984: 0x6c8b5220, 0x2c985: 0x6c8b5420, 0x2c986: 0x6c8b5620, 0x2c987: 0x6c8b5820, - 0x2c988: 0x6c8b5a20, 0x2c989: 0x6c8b5c20, 0x2c98a: 0x6c8b5e20, 0x2c98b: 0x6c8b6020, - 0x2c98c: 0x6c8b6220, 0x2c98d: 0x6c8b6420, 0x2c98e: 0x6c8b6620, 0x2c98f: 0x6c8b6820, - 0x2c990: 0x6c8b6a20, 0x2c991: 0x6c8b6c20, 0x2c992: 0x6c8b6e20, 0x2c993: 0x6c8b7020, - 0x2c994: 0x6c8b7220, 0x2c995: 0x6c8b7420, 0x2c996: 0x6c656e20, 0x2c997: 0x6c8b7620, - 0x2c998: 0x6c8b7820, 0x2c999: 0x6c8b7a20, 0x2c99a: 0x6c8b7c20, 0x2c99b: 0x6c8b7e20, - 0x2c99c: 0x6c8b8020, 0x2c99d: 0x6c8b8220, 0x2c99e: 0x6c8b8420, 0x2c99f: 0x6c8b8620, - 0x2c9a0: 0x6c8b8820, 0x2c9a1: 0x6c8b8a20, 0x2c9a2: 0x6c8b8c20, 0x2c9a3: 0x6c8b8e20, - 0x2c9a4: 0x6c8b9020, 0x2c9a5: 0x6c8b9220, 0x2c9a6: 0x6c8b9420, 0x2c9a7: 0x6c8b9620, - 0x2c9a8: 0x6cb7d820, 0x2c9a9: 0x6c8b9820, 0x2c9aa: 0x6c8b9a20, 0x2c9ab: 0x6c8b9c20, - 0x2c9ac: 0x6c8b9e20, 0x2c9ad: 0x6c8ba020, 0x2c9ae: 0x6c8ba220, 0x2c9af: 0x6c8ba420, - 0x2c9b0: 0x6c8ba620, 0x2c9b1: 0x6c8ba820, 0x2c9b2: 0x6c8baa20, 0x2c9b3: 0x6c8bac20, - 0x2c9b4: 0x6c8bae20, 0x2c9b5: 0x6c8bb020, 0x2c9b6: 0x6c8bb220, 0x2c9b7: 0x6c8bb420, - 0x2c9b8: 0x6c8bb620, 0x2c9b9: 0x6c8bb820, 0x2c9ba: 0x6c8bba20, 0x2c9bb: 0x6c8bbc20, - 0x2c9bc: 0x6c8bbe20, 0x2c9bd: 0x6c8bc020, 0x2c9be: 0x6c8bc220, 0x2c9bf: 0x6c8bc420, - // Block 0xb27, offset 0x2c9c0 - 0x2c9c0: 0x6cb7ea20, 0x2c9c1: 0x6cb7ec20, 0x2c9c2: 0x6cb7ee20, 0x2c9c3: 0x6cb7f020, - 0x2c9c4: 0x6cb7f220, 0x2c9c5: 0x6cb7f420, 0x2c9c6: 0x6cb7f620, 0x2c9c7: 0x6cb7f820, - 0x2c9c8: 0x6cb7fa20, 0x2c9c9: 0x6cb7fc20, 0x2c9ca: 0x6cb7fe20, 0x2c9cb: 0x6cb80020, - 0x2c9cc: 0x6cb80220, 0x2c9cd: 0x6cb80420, 0x2c9ce: 0x6cb80620, 0x2c9cf: 0x6cb80820, - 0x2c9d0: 0x6cb80a20, 0x2c9d1: 0x6cb80c20, 0x2c9d2: 0x6cb80e20, 0x2c9d3: 0x6cb81020, - 0x2c9d4: 0x6cb81220, 0x2c9d5: 0x6cb81420, 0x2c9d6: 0x6cb81620, 0x2c9d7: 0x6cb81820, - 0x2c9d8: 0x6cb81a20, 0x2c9d9: 0x6cb81c20, 0x2c9da: 0x6cb81e20, 0x2c9db: 0x6cb82020, - 0x2c9dc: 0x6cb82220, 0x2c9dd: 0x6cb82420, 0x2c9de: 0x6cb82620, 0x2c9df: 0x6cb82820, - 0x2c9e0: 0x6cb82a20, 0x2c9e1: 0x6cb82c20, 0x2c9e2: 0x6cb82e20, 0x2c9e3: 0x6cb83020, - 0x2c9e4: 0x6cb83220, 0x2c9e5: 0x6cb83420, 0x2c9e6: 0x6cb83620, 0x2c9e7: 0x6cb83820, - 0x2c9e8: 0x6cb83a20, 0x2c9e9: 0x6cb83c20, 0x2c9ea: 0x6ce90c20, 0x2c9eb: 0x6ce90e20, - 0x2c9ec: 0x6ce91020, 0x2c9ed: 0x6ce91220, 0x2c9ee: 0x6ce91420, 0x2c9ef: 0x6ce91620, - 0x2c9f0: 0x6ce91820, 0x2c9f1: 0x6ce91a20, 0x2c9f2: 0x6ce91c20, 0x2c9f3: 0x6ce91e20, - 0x2c9f4: 0x6ce92020, 0x2c9f5: 0x6ce92220, 0x2c9f6: 0x6ce92420, 0x2c9f7: 0x6ce92620, - 0x2c9f8: 0x6ce92820, 0x2c9f9: 0x6ce92a20, 0x2c9fa: 0x6ce92c20, 0x2c9fb: 0x6ce92e20, - 0x2c9fc: 0x6ce93020, 0x2c9fd: 0x6ce93220, 0x2c9fe: 0x6ce93420, 0x2c9ff: 0x6ce93620, - // Block 0xb28, offset 0x2ca00 - 0x2ca00: 0x6ce93820, 0x2ca01: 0x6ce93a20, 0x2ca02: 0x6ce93c20, 0x2ca03: 0x6ce93e20, - 0x2ca04: 0x6ce94020, 0x2ca05: 0x6ce94220, 0x2ca06: 0x6ce94420, 0x2ca07: 0x6ce94620, - 0x2ca08: 0x6ce94820, 0x2ca09: 0x6ce94a20, 0x2ca0a: 0x6ce94c20, 0x2ca0b: 0x6ce94e20, - 0x2ca0c: 0x6ce95020, 0x2ca0d: 0x6ce95220, 0x2ca0e: 0x6d18cc20, 0x2ca0f: 0x6d18ce20, - 0x2ca10: 0x6d18d020, 0x2ca11: 0x6d18d220, 0x2ca12: 0x6d18d420, 0x2ca13: 0x6d18d620, - 0x2ca14: 0x6d18d820, 0x2ca15: 0x6d18da20, 0x2ca16: 0x6d18dc20, 0x2ca17: 0x6d18de20, - 0x2ca18: 0x6d18e020, 0x2ca19: 0x6d18e220, 0x2ca1a: 0x6d18e420, 0x2ca1b: 0x6d18e620, - 0x2ca1c: 0x6d18e820, 0x2ca1d: 0x6d18ea20, 0x2ca1e: 0x6d18ec20, 0x2ca1f: 0x6d18ee20, - 0x2ca20: 0x6d18f020, 0x2ca21: 0x6d18f220, 0x2ca22: 0x6d18f420, 0x2ca23: 0x6d18f620, - 0x2ca24: 0x6d18f820, 0x2ca25: 0x6d18fa20, 0x2ca26: 0x6d18fc20, 0x2ca27: 0x6d18fe20, - 0x2ca28: 0x6d190020, 0x2ca29: 0x6d190220, 0x2ca2a: 0x6d190420, 0x2ca2b: 0x6d190620, - 0x2ca2c: 0x6d190820, 0x2ca2d: 0x6d190a20, 0x2ca2e: 0x6d190c20, 0x2ca2f: 0x6d190e20, - 0x2ca30: 0x6d191020, 0x2ca31: 0x6d191220, 0x2ca32: 0x6d19b420, 0x2ca33: 0x6d191420, - 0x2ca34: 0x6d191620, 0x2ca35: 0x6d47c220, 0x2ca36: 0x6d47c420, 0x2ca37: 0x6d191820, - 0x2ca38: 0x6d47c620, 0x2ca39: 0x6d47c820, 0x2ca3a: 0x6d47ca20, 0x2ca3b: 0x6d47cc20, - 0x2ca3c: 0x6d47ce20, 0x2ca3d: 0x6d47d020, 0x2ca3e: 0x6d47d220, 0x2ca3f: 0x6d47d420, - // Block 0xb29, offset 0x2ca40 - 0x2ca40: 0x6d47d620, 0x2ca41: 0x6d47d820, 0x2ca42: 0x6d47da20, 0x2ca43: 0x6d47dc20, - 0x2ca44: 0x6d47de20, 0x2ca45: 0x6d47e020, 0x2ca46: 0x6d47e220, 0x2ca47: 0x6d47e420, - 0x2ca48: 0x6d47e620, 0x2ca49: 0x6d47e820, 0x2ca4a: 0x6d47ea20, 0x2ca4b: 0x6d47ec20, - 0x2ca4c: 0x6d47ee20, 0x2ca4d: 0x6d47f020, 0x2ca4e: 0x6d47f220, 0x2ca4f: 0x6d47f420, - 0x2ca50: 0x6d75fc20, 0x2ca51: 0x6d75fe20, 0x2ca52: 0x6d760020, 0x2ca53: 0x6d760220, - 0x2ca54: 0x6d760420, 0x2ca55: 0x6d760620, 0x2ca56: 0x6d760820, 0x2ca57: 0x6d760a20, - 0x2ca58: 0x6d760c20, 0x2ca59: 0x6d760e20, 0x2ca5a: 0x6d761020, 0x2ca5b: 0x6d761220, - 0x2ca5c: 0x6d761420, 0x2ca5d: 0x6d761620, 0x2ca5e: 0x6d761820, 0x2ca5f: 0x6d9fae20, - 0x2ca60: 0x6d9fb020, 0x2ca61: 0x6d9fb220, 0x2ca62: 0x6d9fb420, 0x2ca63: 0x6d9fb620, - 0x2ca64: 0x6d9fb820, 0x2ca65: 0x6d9fba20, 0x2ca66: 0x6d9fbc20, 0x2ca67: 0x6d9fbe20, - 0x2ca68: 0x6d9fc020, 0x2ca69: 0x6d9fc220, 0x2ca6a: 0x6d9fc420, 0x2ca6b: 0x6d761a20, - 0x2ca6c: 0x6d9fc620, 0x2ca6d: 0x6dc24e20, 0x2ca6e: 0x6dc25020, 0x2ca6f: 0x6dc25220, - 0x2ca70: 0x6d485a20, 0x2ca71: 0x6dc25420, 0x2ca72: 0x6da00220, 0x2ca73: 0x6de01420, - 0x2ca74: 0x6de01620, 0x2ca75: 0x6de01820, 0x2ca76: 0x6df87420, 0x2ca77: 0x6e0c4220, - 0x2ca78: 0x6e0c4420, 0x2ca79: 0x6e0c4620, 0x2ca7a: 0x6e0c4820, 0x2ca7b: 0x6e1c0820, - 0x2ca7c: 0x6e1c0a20, 0x2ca7d: 0x6e284c20, 0x2ca7e: 0x6e318820, 0x2ca7f: 0x6c008420, - // Block 0xb2a, offset 0x2ca80 - 0x2ca80: 0x6c014620, 0x2ca81: 0x6c02c620, 0x2ca82: 0x6c02c820, 0x2ca83: 0x6c02ca20, - 0x2ca84: 0x6c060e20, 0x2ca85: 0x6c061420, 0x2ca86: 0x6c0c4620, 0x2ca87: 0x6c0c4820, - 0x2ca88: 0x6c0c4a20, 0x2ca89: 0x6c0c4c20, 0x2ca8a: 0x6c0c4e20, 0x2ca8b: 0x6c173420, - 0x2ca8c: 0x6c173620, 0x2ca8d: 0x6c173820, 0x2ca8e: 0x6c173a20, 0x2ca8f: 0x6c173c20, - 0x2ca90: 0x6c173e20, 0x2ca91: 0x6c174020, 0x2ca92: 0x6c2a2e20, 0x2ca93: 0x6c2a3020, - 0x2ca94: 0x6c2a3220, 0x2ca95: 0x6c2a3420, 0x2ca96: 0x6c2a3620, 0x2ca97: 0x6c445a20, - 0x2ca98: 0x6c445c20, 0x2ca99: 0x6c445e20, 0x2ca9a: 0x6c657220, 0x2ca9b: 0x6c657420, - 0x2ca9c: 0x6c8c6820, 0x2ca9d: 0x6c8c6a20, 0x2ca9e: 0x6c8c6c20, 0x2ca9f: 0x6cb8c620, - 0x2caa0: 0x6cb8c820, 0x2caa1: 0x6ce9e220, 0x2caa2: 0x6d19b620, 0x2caa3: 0x6d766620, - 0x2caa4: 0x6e0c6420, 0x2caa5: 0x6c008620, 0x2caa6: 0x6c014820, 0x2caa7: 0x6c02ce20, - 0x2caa8: 0x6c0c5a20, 0x2caa9: 0x6c2a4c20, 0x2caaa: 0x6c446c20, 0x2caab: 0x6c008820, - 0x2caac: 0x6c02d620, 0x2caad: 0x6c02d820, 0x2caae: 0x6c02da20, 0x2caaf: 0x6c02dc20, - 0x2cab0: 0x6c061c20, 0x2cab1: 0x6c0c6820, 0x2cab2: 0x6c0c6a20, 0x2cab3: 0x6c0c6c20, - 0x2cab4: 0x6c0c6e20, 0x2cab5: 0x6c176220, 0x2cab6: 0x6c2a5020, 0x2cab7: 0x6c2a5220, - 0x2cab8: 0x6c2a5420, 0x2cab9: 0x6c447620, 0x2caba: 0x6c659020, 0x2cabb: 0x6c447820, - 0x2cabc: 0x6c659220, 0x2cabd: 0x6c8c7e20, 0x2cabe: 0x6ce9f420, 0x2cabf: 0x6ce9f620, - // Block 0xb2b, offset 0x2cac0 - 0x2cac0: 0x6d767a20, 0x2cac1: 0x6dc29820, 0x2cac2: 0x6c008c20, 0x2cac3: 0x6c02e620, - 0x2cac4: 0x6c02e820, 0x2cac5: 0x6c02ea20, 0x2cac6: 0x6c02ec20, 0x2cac7: 0x6c02ee20, - 0x2cac8: 0x6c02f020, 0x2cac9: 0x6c062220, 0x2caca: 0x6c062420, 0x2cacb: 0x6c062620, - 0x2cacc: 0x6c062820, 0x2cacd: 0x6c0c7820, 0x2cace: 0x6c0c7a20, 0x2cacf: 0x6c177020, - 0x2cad0: 0x6c2a5e20, 0x2cad1: 0x6c448620, 0x2cad2: 0x6c448820, 0x2cad3: 0x6c659a20, - 0x2cad4: 0x6c659c20, 0x2cad5: 0x6c8c8820, 0x2cad6: 0x6c008e20, 0x2cad7: 0x6c02fe20, - 0x2cad8: 0x6c030020, 0x2cad9: 0x6c063e20, 0x2cada: 0x6c064020, 0x2cadb: 0x6c0c8620, - 0x2cadc: 0x6c0c8820, 0x2cadd: 0x6c178020, 0x2cade: 0x6c2a6a20, 0x2cadf: 0x6c449220, - 0x2cae0: 0x6c449420, 0x2cae1: 0x6c65a420, 0x2cae2: 0x6c65a620, 0x2cae3: 0x6c65a820, - 0x2cae4: 0x6c65aa20, 0x2cae5: 0x6c65ac20, 0x2cae6: 0x6c65ae20, 0x2cae7: 0x6c65b020, - 0x2cae8: 0x6c8c9020, 0x2cae9: 0x6d19e020, 0x2caea: 0x6d768820, 0x2caeb: 0x6c009020, - 0x2caec: 0x6c064a20, 0x2caed: 0x6c064c20, 0x2caee: 0x6c064e20, 0x2caef: 0x6c065020, - 0x2caf0: 0x6c0c9c20, 0x2caf1: 0x6c0c9e20, 0x2caf2: 0x6c0ca020, 0x2caf3: 0x6c0ca220, - 0x2caf4: 0x6c0ca420, 0x2caf5: 0x6c179020, 0x2caf6: 0x6c179220, 0x2caf7: 0x6c179420, - 0x2caf8: 0x6c179620, 0x2caf9: 0x6c179820, 0x2cafa: 0x6c179a20, 0x2cafb: 0x6c179c20, - 0x2cafc: 0x6c2a7e20, 0x2cafd: 0x6c2a8020, 0x2cafe: 0x6c2a8220, 0x2caff: 0x6c2a8420, - // Block 0xb2c, offset 0x2cb00 - 0x2cb00: 0x6c2a8620, 0x2cb01: 0x6c44a420, 0x2cb02: 0x6c44a620, 0x2cb03: 0x6c44a820, - 0x2cb04: 0x6c65c820, 0x2cb05: 0x6c65ca20, 0x2cb06: 0x6c65cc20, 0x2cb07: 0x6c65ce20, - 0x2cb08: 0x6c65d020, 0x2cb09: 0x6c65d220, 0x2cb0a: 0x6c65d420, 0x2cb0b: 0x6c65d620, - 0x2cb0c: 0x6c65d820, 0x2cb0d: 0x6c65da20, 0x2cb0e: 0x6c65dc20, 0x2cb0f: 0x6c8c9820, - 0x2cb10: 0x6c8c9a20, 0x2cb11: 0x6c8c9c20, 0x2cb12: 0x6cb91020, 0x2cb13: 0x6cb91220, - 0x2cb14: 0x6cb91420, 0x2cb15: 0x6cb91620, 0x2cb16: 0x6cb91820, 0x2cb17: 0x6cea1420, - 0x2cb18: 0x6d19ec20, 0x2cb19: 0x6d487820, 0x2cb1a: 0x6d487a20, 0x2cb1b: 0x6d487c20, - 0x2cb1c: 0x6d487e20, 0x2cb1d: 0x6d768e20, 0x2cb1e: 0x6d769020, 0x2cb1f: 0x6da01a20, - 0x2cb20: 0x6c009420, 0x2cb21: 0x6c015220, 0x2cb22: 0x6c015420, 0x2cb23: 0x6c015620, - 0x2cb24: 0x6c030a20, 0x2cb25: 0x6c065a20, 0x2cb26: 0x6c065c20, 0x2cb27: 0x6c065e20, - 0x2cb28: 0x6c0cba20, 0x2cb29: 0x6c0cbc20, 0x2cb2a: 0x6c0cbe20, 0x2cb2b: 0x6c0cc020, - 0x2cb2c: 0x6c17b820, 0x2cb2d: 0x6c2a9820, 0x2cb2e: 0x6c2a9a20, 0x2cb2f: 0x6c2a9c20, - 0x2cb30: 0x6c8cc020, 0x2cb31: 0x6cb93020, 0x2cb32: 0x6cb93220, 0x2cb33: 0x6d19fe20, - 0x2cb34: 0x6d1a0020, 0x2cb35: 0x6c009a20, 0x2cb36: 0x6c031c20, 0x2cb37: 0x6c066820, - 0x2cb38: 0x6c066a20, 0x2cb39: 0x6c066c20, 0x2cb3a: 0x6c066e20, 0x2cb3b: 0x6c067020, - 0x2cb3c: 0x6c0cd420, 0x2cb3d: 0x6c2ab220, 0x2cb3e: 0x6c44d820, 0x2cb3f: 0x6cb94020, - // Block 0xb2d, offset 0x2cb40 - 0x2cb40: 0x6c00a020, 0x2cb41: 0x6c00a220, 0x2cb42: 0x6c00a420, 0x2cb43: 0x6c015a20, - 0x2cb44: 0x6c015c20, 0x2cb45: 0x6c032420, 0x2cb46: 0x6c032620, 0x2cb47: 0x6c032820, - 0x2cb48: 0x6c032a20, 0x2cb49: 0x6c068220, 0x2cb4a: 0x6c068420, 0x2cb4b: 0x6c068620, - 0x2cb4c: 0x6c068820, 0x2cb4d: 0x6c068a20, 0x2cb4e: 0x6c0cea20, 0x2cb4f: 0x6c0cec20, - 0x2cb50: 0x6c0cee20, 0x2cb51: 0x6c0cf020, 0x2cb52: 0x6c0cf220, 0x2cb53: 0x6c0cf420, - 0x2cb54: 0x6c0cf620, 0x2cb55: 0x6c0cf820, 0x2cb56: 0x6c0cfa20, 0x2cb57: 0x6c0cfc20, - 0x2cb58: 0x6c0cfe20, 0x2cb59: 0x6c0d0020, 0x2cb5a: 0x6c0d0220, 0x2cb5b: 0x6c0d0420, - 0x2cb5c: 0x6c17de20, 0x2cb5d: 0x6c17e020, 0x2cb5e: 0x6c17e220, 0x2cb5f: 0x6c17e420, - 0x2cb60: 0x6c17e620, 0x2cb61: 0x6c17e820, 0x2cb62: 0x6c17ea20, 0x2cb63: 0x6c17ec20, - 0x2cb64: 0x6c17ee20, 0x2cb65: 0x6c17f020, 0x2cb66: 0x6c17f220, 0x2cb67: 0x6c17f420, - 0x2cb68: 0x6c17f620, 0x2cb69: 0x6c17f820, 0x2cb6a: 0x6c17fa20, 0x2cb6b: 0x6c17fc20, - 0x2cb6c: 0x6c17fe20, 0x2cb6d: 0x6c180020, 0x2cb6e: 0x6c2ac820, 0x2cb6f: 0x6c2aca20, - 0x2cb70: 0x6c2acc20, 0x2cb71: 0x6c2ace20, 0x2cb72: 0x6c2ad020, 0x2cb73: 0x6c2ad220, - 0x2cb74: 0x6c2ad420, 0x2cb75: 0x6c2ad620, 0x2cb76: 0x6c2ad820, 0x2cb77: 0x6c2ada20, - 0x2cb78: 0x6c2adc20, 0x2cb79: 0x6c2ade20, 0x2cb7a: 0x6c2ae020, 0x2cb7b: 0x6c2ae220, - 0x2cb7c: 0x6c2ae420, 0x2cb7d: 0x6c2ae620, 0x2cb7e: 0x6c2ae820, 0x2cb7f: 0x6c2aea20, - // Block 0xb2e, offset 0x2cb80 - 0x2cb80: 0x6c2aec20, 0x2cb81: 0x6c2aee20, 0x2cb82: 0x6c2af020, 0x2cb83: 0x6c44ea20, - 0x2cb84: 0x6c44ec20, 0x2cb85: 0x6c44ee20, 0x2cb86: 0x6c2b4a20, 0x2cb87: 0x6c44f020, - 0x2cb88: 0x6c44f220, 0x2cb89: 0x6c44f420, 0x2cb8a: 0x6c44f620, 0x2cb8b: 0x6c44f820, - 0x2cb8c: 0x6c44fa20, 0x2cb8d: 0x6c44fc20, 0x2cb8e: 0x6c44fe20, 0x2cb8f: 0x6c450020, - 0x2cb90: 0x6c450220, 0x2cb91: 0x6c450420, 0x2cb92: 0x6c661c20, 0x2cb93: 0x6c661e20, - 0x2cb94: 0x6c662020, 0x2cb95: 0x6c662220, 0x2cb96: 0x6c662420, 0x2cb97: 0x6c662620, - 0x2cb98: 0x6c662820, 0x2cb99: 0x6c662a20, 0x2cb9a: 0x6c662c20, 0x2cb9b: 0x6c662e20, - 0x2cb9c: 0x6c663020, 0x2cb9d: 0x6c663220, 0x2cb9e: 0x6c663420, 0x2cb9f: 0x6c663620, - 0x2cba0: 0x6c663820, 0x2cba1: 0x6c663a20, 0x2cba2: 0x6c663c20, 0x2cba3: 0x6c663e20, - 0x2cba4: 0x6c664020, 0x2cba5: 0x6c664220, 0x2cba6: 0x6c664420, 0x2cba7: 0x6c664620, - 0x2cba8: 0x6c8ce420, 0x2cba9: 0x6cb95020, 0x2cbaa: 0x6c8ce620, 0x2cbab: 0x6c8ce820, - 0x2cbac: 0x6c8cea20, 0x2cbad: 0x6c8cec20, 0x2cbae: 0x6c8cee20, 0x2cbaf: 0x6c8cf020, - 0x2cbb0: 0x6c8cf220, 0x2cbb1: 0x6c8cf420, 0x2cbb2: 0x6cb95220, 0x2cbb3: 0x6cb95420, - 0x2cbb4: 0x6cb95620, 0x2cbb5: 0x6cb95820, 0x2cbb6: 0x6c8cf620, 0x2cbb7: 0x6cea4020, - 0x2cbb8: 0x6cea4220, 0x2cbb9: 0x6cea4420, 0x2cbba: 0x6cea4620, 0x2cbbb: 0x6cea4820, - 0x2cbbc: 0x6cea4a20, 0x2cbbd: 0x6cea4c20, 0x2cbbe: 0x6cea4e20, 0x2cbbf: 0x6cea5020, - // Block 0xb2f, offset 0x2cbc0 - 0x2cbc0: 0x6d1a2620, 0x2cbc1: 0x6d1a2820, 0x2cbc2: 0x6d1a2a20, 0x2cbc3: 0x6d1a2c20, - 0x2cbc4: 0x6d1a2e20, 0x2cbc5: 0x6d489820, 0x2cbc6: 0x6d489a20, 0x2cbc7: 0x6d489c20, - 0x2cbc8: 0x6d489e20, 0x2cbc9: 0x6d48a020, 0x2cbca: 0x6d48a220, 0x2cbcb: 0x6d48a420, - 0x2cbcc: 0x6d48a620, 0x2cbcd: 0x6d48a820, 0x2cbce: 0x6d48aa20, 0x2cbcf: 0x6d48ac20, - 0x2cbd0: 0x6d76aa20, 0x2cbd1: 0x6d76ac20, 0x2cbd2: 0x6d76ae20, 0x2cbd3: 0x6d76b020, - 0x2cbd4: 0x6d76b220, 0x2cbd5: 0x6da03420, 0x2cbd6: 0x6de05820, 0x2cbd7: 0x6e0c7220, - 0x2cbd8: 0x6e0c7420, 0x2cbd9: 0x6e286020, 0x2cbda: 0x6e286220, 0x2cbdb: 0x6c00a820, - 0x2cbdc: 0x6c016020, 0x2cbdd: 0x6c033c20, 0x2cbde: 0x6c033e20, 0x2cbdf: 0x6c06a420, - 0x2cbe0: 0x6c06a620, 0x2cbe1: 0x6c06a820, 0x2cbe2: 0x6c06aa20, 0x2cbe3: 0x6c0d4020, - 0x2cbe4: 0x6c0d4220, 0x2cbe5: 0x6c0d4420, 0x2cbe6: 0x6c0d4620, 0x2cbe7: 0x6c0d4820, - 0x2cbe8: 0x6c0d4a20, 0x2cbe9: 0x6c183c20, 0x2cbea: 0x6c183e20, 0x2cbeb: 0x6c184020, - 0x2cbec: 0x6c184220, 0x2cbed: 0x6c184420, 0x2cbee: 0x6c184620, 0x2cbef: 0x6c184820, - 0x2cbf0: 0x6c184a20, 0x2cbf1: 0x6c184c20, 0x2cbf2: 0x6c184e20, 0x2cbf3: 0x6c185020, - 0x2cbf4: 0x6c185220, 0x2cbf5: 0x6c2b5220, 0x2cbf6: 0x6c2b5420, 0x2cbf7: 0x6c2b5620, - 0x2cbf8: 0x6c2b5820, 0x2cbf9: 0x6c2b5a20, 0x2cbfa: 0x6c2b5c20, 0x2cbfb: 0x6c2b5e20, - 0x2cbfc: 0x6c2b6020, 0x2cbfd: 0x6c2b6220, 0x2cbfe: 0x6c2b6420, 0x2cbff: 0x6c2b6620, - // Block 0xb30, offset 0x2cc00 - 0x2cc00: 0x6c455020, 0x2cc01: 0x6c455220, 0x2cc02: 0x6c455420, 0x2cc03: 0x6c455620, - 0x2cc04: 0x6c455820, 0x2cc05: 0x6c455a20, 0x2cc06: 0x6c2b8620, 0x2cc07: 0x6c455c20, - 0x2cc08: 0x6c455e20, 0x2cc09: 0x6c456020, 0x2cc0a: 0x6c456220, 0x2cc0b: 0x6c456420, - 0x2cc0c: 0x6c66ac20, 0x2cc0d: 0x6c66ae20, 0x2cc0e: 0x6c66b020, 0x2cc0f: 0x6c66b220, - 0x2cc10: 0x6c66b420, 0x2cc11: 0x6c66b620, 0x2cc12: 0x6c8d4420, 0x2cc13: 0x6c8d4620, - 0x2cc14: 0x6c8d4820, 0x2cc15: 0x6c8d4a20, 0x2cc16: 0x6c8d4c20, 0x2cc17: 0x6c9b7c20, - 0x2cc18: 0x6c8d4e20, 0x2cc19: 0x6c8d5020, 0x2cc1a: 0x6c8d5220, 0x2cc1b: 0x6cb9ac20, - 0x2cc1c: 0x6cb9ae20, 0x2cc1d: 0x6cb9b020, 0x2cc1e: 0x6cb9b220, 0x2cc1f: 0x6cea9220, - 0x2cc20: 0x6cea9420, 0x2cc21: 0x6cea9620, 0x2cc22: 0x6cea9820, 0x2cc23: 0x6cea9a20, - 0x2cc24: 0x6cea9c20, 0x2cc25: 0x6cea9e20, 0x2cc26: 0x6ceaa020, 0x2cc27: 0x6ceaa220, - 0x2cc28: 0x6d1a7820, 0x2cc29: 0x6d1a7a20, 0x2cc2a: 0x6d1a7c20, 0x2cc2b: 0x6d1a7e20, - 0x2cc2c: 0x6d1a8020, 0x2cc2d: 0x6d1a8220, 0x2cc2e: 0x6d48da20, 0x2cc2f: 0x6d48dc20, - 0x2cc30: 0x6d48de20, 0x2cc31: 0x6d48e020, 0x2cc32: 0x6d48e220, 0x2cc33: 0x6d76da20, - 0x2cc34: 0x6da05c20, 0x2cc35: 0x6da05e20, 0x2cc36: 0x6da06020, 0x2cc37: 0x6de06020, - 0x2cc38: 0x6de06620, 0x2cc39: 0x6c00aa20, 0x2cc3a: 0x6c016420, 0x2cc3b: 0x6c034620, - 0x2cc3c: 0x6c034820, 0x2cc3d: 0x6c034a20, 0x2cc3e: 0x6c034c20, 0x2cc3f: 0x6c034e20, - // Block 0xb31, offset 0x2cc40 - 0x2cc40: 0x6c035020, 0x2cc41: 0x6c035220, 0x2cc42: 0x6c035420, 0x2cc43: 0x6c06b420, - 0x2cc44: 0x6c06b620, 0x2cc45: 0x6c06b820, 0x2cc46: 0x6c06ba20, 0x2cc47: 0x6c06bc20, - 0x2cc48: 0x6c0d5e20, 0x2cc49: 0x6c187820, 0x2cc4a: 0x6c2b8820, 0x2cc4b: 0x6c2b8a20, - 0x2cc4c: 0x6c2b8c20, 0x2cc4d: 0x6c458220, 0x2cc4e: 0x6c66de20, 0x2cc4f: 0x6c8d6c20, - 0x2cc50: 0x6c8d6e20, 0x2cc51: 0x6cb9d620, 0x2cc52: 0x6cb9d820, 0x2cc53: 0x6c8d7e20, - 0x2cc54: 0x6d48f220, 0x2cc55: 0x6c00ac20, 0x2cc56: 0x6c035a20, 0x2cc57: 0x6c06c620, - 0x2cc58: 0x6c8d8220, 0x2cc59: 0x6c8d8420, 0x2cc5a: 0x6c00b020, 0x2cc5b: 0x6c06ca20, - 0x2cc5c: 0x6c06cc20, 0x2cc5d: 0x6c06ce20, 0x2cc5e: 0x6c06d020, 0x2cc5f: 0x6c0d6820, - 0x2cc60: 0x6c0d6a20, 0x2cc61: 0x6c0d6c20, 0x2cc62: 0x6c0d6e20, 0x2cc63: 0x6c189020, - 0x2cc64: 0x6c189220, 0x2cc65: 0x6c189420, 0x2cc66: 0x6c2b9e20, 0x2cc67: 0x6c45a020, - 0x2cc68: 0x6c45a220, 0x2cc69: 0x6c45a420, 0x2cc6a: 0x6c66fc20, 0x2cc6b: 0x6c66fe20, - 0x2cc6c: 0x6c8d8820, 0x2cc6d: 0x6c8d8a20, 0x2cc6e: 0x6c8d8c20, 0x2cc6f: 0x6cead820, - 0x2cc70: 0x6d1abc20, 0x2cc71: 0x6d1abe20, 0x2cc72: 0x6d1ac020, 0x2cc73: 0x6d48f620, - 0x2cc74: 0x6d76ea20, 0x2cc75: 0x6da07820, 0x2cc76: 0x6de06820, 0x2cc77: 0x6df8ba20, - 0x2cc78: 0x6c00b420, 0x2cc79: 0x6c036020, 0x2cc7a: 0x6c036220, 0x2cc7b: 0x6c18a620, - 0x2cc7c: 0x6c2ba820, 0x2cc7d: 0x6c45c020, 0x2cc7e: 0x6c8d9220, 0x2cc7f: 0x6c8d9420, - // Block 0xb32, offset 0x2cc80 - 0x2cc80: 0x6c8d9620, 0x2cc81: 0x6c00b620, 0x2cc82: 0x6c016820, 0x2cc83: 0x6c016a20, - 0x2cc84: 0x6c00e620, 0x2cc85: 0x6c036820, 0x2cc86: 0x6c036a20, 0x2cc87: 0x6c036c20, - 0x2cc88: 0x6c036e20, 0x2cc89: 0x6c06d220, 0x2cc8a: 0x6c06d420, 0x2cc8b: 0x6c0d8420, - 0x2cc8c: 0x6c06d620, 0x2cc8d: 0x6c0d8620, 0x2cc8e: 0x6c0d8820, 0x2cc8f: 0x6c0d8a20, - 0x2cc90: 0x6c0d8c20, 0x2cc91: 0x6c2bac20, 0x2cc92: 0x6c2bae20, 0x2cc93: 0x6c2bb020, - 0x2cc94: 0x6c2bb220, 0x2cc95: 0x6c2bb420, 0x2cc96: 0x6c2bb620, 0x2cc97: 0x6c45c820, - 0x2cc98: 0x6c45ca20, 0x2cc99: 0x6c8d9820, 0x2cc9a: 0x6cb9f220, 0x2cc9b: 0x6e0c8420, - 0x2cc9c: 0x6c00ba20, 0x2cc9d: 0x6c037620, 0x2cc9e: 0x6c037820, 0x2cc9f: 0x6c06e220, - 0x2cca0: 0x6c06e420, 0x2cca1: 0x6c06e620, 0x2cca2: 0x6c06e820, 0x2cca3: 0x6c18c020, - 0x2cca4: 0x6c18c220, 0x2cca5: 0x6c2bd620, 0x2cca6: 0x6c2bd820, 0x2cca7: 0x6c2bda20, - 0x2cca8: 0x6c8da820, 0x2cca9: 0x6c00bc20, 0x2ccaa: 0x6c017220, 0x2ccab: 0x6c017420, - 0x2ccac: 0x6c037c20, 0x2ccad: 0x6c06ec20, 0x2ccae: 0x6c06ee20, 0x2ccaf: 0x6c06f020, - 0x2ccb0: 0x6c0db820, 0x2ccb1: 0x6c0dba20, 0x2ccb2: 0x6c18d220, 0x2ccb3: 0x6c18d420, - 0x2ccb4: 0x6c18d620, 0x2ccb5: 0x6c18d820, 0x2ccb6: 0x6c2bf420, 0x2ccb7: 0x6c2bf620, - 0x2ccb8: 0x6c2bf820, 0x2ccb9: 0x6c2bfa20, 0x2ccba: 0x6c2bfc20, 0x2ccbb: 0x6c45e420, - 0x2ccbc: 0x6c45e620, 0x2ccbd: 0x6c45e820, 0x2ccbe: 0x6c8db620, 0x2ccbf: 0x6c673020, - // Block 0xb33, offset 0x2ccc0 - 0x2ccc0: 0x6ceaf820, 0x2ccc1: 0x6ceafa20, 0x2ccc2: 0x6c00be20, 0x2ccc3: 0x6c038620, - 0x2ccc4: 0x6c038820, 0x2ccc5: 0x6c038a20, 0x2ccc6: 0x6c038c20, 0x2ccc7: 0x6c06f420, - 0x2ccc8: 0x6c06f620, 0x2ccc9: 0x6c06f820, 0x2ccca: 0x6c0dce20, 0x2cccb: 0x6c0dd020, - 0x2cccc: 0x6c0dd220, 0x2cccd: 0x6c0dd420, 0x2ccce: 0x6c18e220, 0x2cccf: 0x6c18e420, - 0x2ccd0: 0x6c18e620, 0x2ccd1: 0x6c18e820, 0x2ccd2: 0x6c2c0420, 0x2ccd3: 0x6c2c0620, - 0x2ccd4: 0x6c2c0820, 0x2ccd5: 0x6c2c0a20, 0x2ccd6: 0x6c45f820, 0x2ccd7: 0x6c45fa20, - 0x2ccd8: 0x6c45fc20, 0x2ccd9: 0x6c45fe20, 0x2ccda: 0x6c460020, 0x2ccdb: 0x6c460220, - 0x2ccdc: 0x6c673820, 0x2ccdd: 0x6c673a20, 0x2ccde: 0x6c673c20, 0x2ccdf: 0x6c673e20, - 0x2cce0: 0x6c8db820, 0x2cce1: 0x6c8dba20, 0x2cce2: 0x6c8dbc20, 0x2cce3: 0x6c8dbe20, - 0x2cce4: 0x6cba0c20, 0x2cce5: 0x6cba0e20, 0x2cce6: 0x6cba1020, 0x2cce7: 0x6cba1220, - 0x2cce8: 0x6cba1420, 0x2cce9: 0x6c8dc020, 0x2ccea: 0x6ceb0420, 0x2cceb: 0x6ceb0620, - 0x2ccec: 0x6d1ae020, 0x2cced: 0x6d1ae220, 0x2ccee: 0x6d1ae420, 0x2ccef: 0x6ceb2020, - 0x2ccf0: 0x6d1ae620, 0x2ccf1: 0x6d491a20, 0x2ccf2: 0x6d491c20, 0x2ccf3: 0x6da08820, - 0x2ccf4: 0x6de07020, 0x2ccf5: 0x6e451620, 0x2ccf6: 0x6c00c020, 0x2ccf7: 0x6c039220, - 0x2ccf8: 0x6c039420, 0x2ccf9: 0x6c039620, 0x2ccfa: 0x6c070a20, 0x2ccfb: 0x6c070c20, - 0x2ccfc: 0x6c070e20, 0x2ccfd: 0x6c0df220, 0x2ccfe: 0x6c0df420, 0x2ccff: 0x6c190420, - // Block 0xb34, offset 0x2cd00 - 0x2cd00: 0x6c2c2820, 0x2cd01: 0x6c2c2a20, 0x2cd02: 0x6c2c2c20, 0x2cd03: 0x6c8de620, - 0x2cd04: 0x6c8de820, 0x2cd05: 0x6cba2e20, 0x2cd06: 0x6d1b1420, 0x2cd07: 0x6d493c20, - 0x2cd08: 0x6c00c420, 0x2cd09: 0x6c017e20, 0x2cd0a: 0x6c03a020, 0x2cd0b: 0x6c03a220, - 0x2cd0c: 0x6c03a420, 0x2cd0d: 0x6c03a620, 0x2cd0e: 0x6c03a820, 0x2cd0f: 0x6c071a20, - 0x2cd10: 0x6c071c20, 0x2cd11: 0x6c071e20, 0x2cd12: 0x6c0e0820, 0x2cd13: 0x6c190e20, - 0x2cd14: 0x6c2c3c20, 0x2cd15: 0x6c2c3e20, 0x2cd16: 0x6c2c4020, 0x2cd17: 0x6c2c4220, - 0x2cd18: 0x6c2c4420, 0x2cd19: 0x6c464020, 0x2cd1a: 0x6c464220, 0x2cd1b: 0x6c464420, - 0x2cd1c: 0x6c464620, 0x2cd1d: 0x6c464820, 0x2cd1e: 0x6c677c20, 0x2cd1f: 0x6c677e20, - 0x2cd20: 0x6ceb3220, 0x2cd21: 0x6d76fc20, 0x2cd22: 0x6dc2f620, 0x2cd23: 0x6c018020, - 0x2cd24: 0x6c073620, 0x2cd25: 0x6c073820, 0x2cd26: 0x6c073a20, 0x2cd27: 0x6c073c20, - 0x2cd28: 0x6c073e20, 0x2cd29: 0x6c074020, 0x2cd2a: 0x6c074220, 0x2cd2b: 0x6c074420, - 0x2cd2c: 0x6c074620, 0x2cd2d: 0x6c074820, 0x2cd2e: 0x6c074a20, 0x2cd2f: 0x6c074c20, - 0x2cd30: 0x6c074e20, 0x2cd31: 0x6c075020, 0x2cd32: 0x6c075220, 0x2cd33: 0x6c075420, - 0x2cd34: 0x6c075620, 0x2cd35: 0x6c075820, 0x2cd36: 0x6c075a20, 0x2cd37: 0x6c075c20, - 0x2cd38: 0x6c075e20, 0x2cd39: 0x6c076020, 0x2cd3a: 0x6c076220, 0x2cd3b: 0x6c076420, - 0x2cd3c: 0x6c076620, 0x2cd3d: 0x6c076820, 0x2cd3e: 0x6c076a20, 0x2cd3f: 0x6c0e2220, - // Block 0xb35, offset 0x2cd40 - 0x2cd40: 0x6c0e2420, 0x2cd41: 0x6c0e2620, 0x2cd42: 0x6c0e2820, 0x2cd43: 0x6c0e2a20, - 0x2cd44: 0x6c0e2c20, 0x2cd45: 0x6c0e2e20, 0x2cd46: 0x6c0e3020, 0x2cd47: 0x6c0e3220, - 0x2cd48: 0x6c0e3420, 0x2cd49: 0x6c0e3620, 0x2cd4a: 0x6c0e3820, 0x2cd4b: 0x6c0e3a20, - 0x2cd4c: 0x6c0e3c20, 0x2cd4d: 0x6c0e3e20, 0x2cd4e: 0x6c0e4020, 0x2cd4f: 0x6c0e4220, - 0x2cd50: 0x6c0e4420, 0x2cd51: 0x6c0e4620, 0x2cd52: 0x6c0e4820, 0x2cd53: 0x6c0e4a20, - 0x2cd54: 0x6c0e4c20, 0x2cd55: 0x6c0e4e20, 0x2cd56: 0x6c0e5020, 0x2cd57: 0x6c0e5220, - 0x2cd58: 0x6c193e20, 0x2cd59: 0x6c194020, 0x2cd5a: 0x6c194220, 0x2cd5b: 0x6c194420, - 0x2cd5c: 0x6c194620, 0x2cd5d: 0x6c194820, 0x2cd5e: 0x6c194a20, 0x2cd5f: 0x6c194c20, - 0x2cd60: 0x6c194e20, 0x2cd61: 0x6c195020, 0x2cd62: 0x6c195220, 0x2cd63: 0x6c195420, - 0x2cd64: 0x6c195620, 0x2cd65: 0x6c195820, 0x2cd66: 0x6c195a20, 0x2cd67: 0x6c195c20, - 0x2cd68: 0x6c195e20, 0x2cd69: 0x6c196020, 0x2cd6a: 0x6c196220, 0x2cd6b: 0x6c196420, - 0x2cd6c: 0x6c196620, 0x2cd6d: 0x6c196820, 0x2cd6e: 0x6c196a20, 0x2cd6f: 0x6c196c20, - 0x2cd70: 0x6c196e20, 0x2cd71: 0x6c197020, 0x2cd72: 0x6c197220, 0x2cd73: 0x6c197420, - 0x2cd74: 0x6c197620, 0x2cd75: 0x6c197820, 0x2cd76: 0x6c197a20, 0x2cd77: 0x6c197c20, - 0x2cd78: 0x6c197e20, 0x2cd79: 0x6c198020, 0x2cd7a: 0x6c198220, 0x2cd7b: 0x6c198420, - 0x2cd7c: 0x6c198620, 0x2cd7d: 0x6c198820, 0x2cd7e: 0x6c198a20, 0x2cd7f: 0x6c198c20, - // Block 0xb36, offset 0x2cd80 - 0x2cd80: 0x6c198e20, 0x2cd81: 0x6c199020, 0x2cd82: 0x6c199220, 0x2cd83: 0x6c199420, - 0x2cd84: 0x6c199620, 0x2cd85: 0x6c199820, 0x2cd86: 0x6c199a20, 0x2cd87: 0x6c199c20, - 0x2cd88: 0x6c199e20, 0x2cd89: 0x6c19a020, 0x2cd8a: 0x6c19a220, 0x2cd8b: 0x6c19a420, - 0x2cd8c: 0x6c19a620, 0x2cd8d: 0x6c19a820, 0x2cd8e: 0x6c19aa20, 0x2cd8f: 0x6c19ac20, - 0x2cd90: 0x6c19ae20, 0x2cd91: 0x6c19b020, 0x2cd92: 0x6c19b220, 0x2cd93: 0x6c19b420, - 0x2cd94: 0x6c19b620, 0x2cd95: 0x6c19b820, 0x2cd96: 0x6c19ba20, 0x2cd97: 0x6c19bc20, - 0x2cd98: 0x6c19be20, 0x2cd99: 0x6c19c020, 0x2cd9a: 0x6c19c220, 0x2cd9b: 0x6c19c420, - 0x2cd9c: 0x6c19c620, 0x2cd9d: 0x6c2c6820, 0x2cd9e: 0x6c2c6a20, 0x2cd9f: 0x6c2c6c20, - 0x2cda0: 0x6c2c6e20, 0x2cda1: 0x6c2c7020, 0x2cda2: 0x6c2c7220, 0x2cda3: 0x6c2c7420, - 0x2cda4: 0x6c2c7620, 0x2cda5: 0x6c2c7820, 0x2cda6: 0x6c2c7a20, 0x2cda7: 0x6c2c7c20, - 0x2cda8: 0x6c2c7e20, 0x2cda9: 0x6c2c8020, 0x2cdaa: 0x6c2c8220, 0x2cdab: 0x6c2c8420, - 0x2cdac: 0x6c2c8620, 0x2cdad: 0x6c2c8820, 0x2cdae: 0x6c2c8a20, 0x2cdaf: 0x6c2c8c20, - 0x2cdb0: 0x6c466420, 0x2cdb1: 0x6c2c8e20, 0x2cdb2: 0x6c466620, 0x2cdb3: 0x6c2c9020, - 0x2cdb4: 0x6c2c9220, 0x2cdb5: 0x6c2c9420, 0x2cdb6: 0x6c2c9620, 0x2cdb7: 0x6c2c9820, - 0x2cdb8: 0x6c2c9a20, 0x2cdb9: 0x6c2c9c20, 0x2cdba: 0x6c2c9e20, 0x2cdbb: 0x6c2ca020, - 0x2cdbc: 0x6c2ca220, 0x2cdbd: 0x6c2ca420, 0x2cdbe: 0x6c2ca620, 0x2cdbf: 0x6c2ca820, - // Block 0xb37, offset 0x2cdc0 - 0x2cdc0: 0x6c2caa20, 0x2cdc1: 0x6c2cac20, 0x2cdc2: 0x6c2cae20, 0x2cdc3: 0x6c2cb020, - 0x2cdc4: 0x6c2cb220, 0x2cdc5: 0x6c2cb420, 0x2cdc6: 0x6c2cb620, 0x2cdc7: 0x6c2cb820, - 0x2cdc8: 0x6c2cba20, 0x2cdc9: 0x6c2cbc20, 0x2cdca: 0x6c2cbe20, 0x2cdcb: 0x6c2cc020, - 0x2cdcc: 0x6c2cc220, 0x2cdcd: 0x6c2cc420, 0x2cdce: 0x6c2cc620, 0x2cdcf: 0x6c2cc820, - 0x2cdd0: 0x6c2cca20, 0x2cdd1: 0x6c2ccc20, 0x2cdd2: 0x6c2cce20, 0x2cdd3: 0x6c2cd020, - 0x2cdd4: 0x6c2cd220, 0x2cdd5: 0x6c2cd420, 0x2cdd6: 0x6c2cd620, 0x2cdd7: 0x6c2cd820, - 0x2cdd8: 0x6c2cda20, 0x2cdd9: 0x6c2cdc20, 0x2cdda: 0x6c2cde20, 0x2cddb: 0x6c2ce020, - 0x2cddc: 0x6c2ce220, 0x2cddd: 0x6c2ce420, 0x2cdde: 0x6c468620, 0x2cddf: 0x6c468820, - 0x2cde0: 0x6c468a20, 0x2cde1: 0x6c468c20, 0x2cde2: 0x6c468e20, 0x2cde3: 0x6c469020, - 0x2cde4: 0x6c469220, 0x2cde5: 0x6c469420, 0x2cde6: 0x6c469620, 0x2cde7: 0x6c469820, - 0x2cde8: 0x6c469a20, 0x2cde9: 0x6c469c20, 0x2cdea: 0x6c469e20, 0x2cdeb: 0x6c46a020, - 0x2cdec: 0x6c46a220, 0x2cded: 0x6c46a420, 0x2cdee: 0x6c46a620, 0x2cdef: 0x6c46a820, - 0x2cdf0: 0x6c46aa20, 0x2cdf1: 0x6c46ac20, 0x2cdf2: 0x6c46ae20, 0x2cdf3: 0x6c46b020, - 0x2cdf4: 0x6c46b220, 0x2cdf5: 0x6c46b420, 0x2cdf6: 0x6c46b620, 0x2cdf7: 0x6c46b820, - 0x2cdf8: 0x6c46ba20, 0x2cdf9: 0x6c46bc20, 0x2cdfa: 0x6c46be20, 0x2cdfb: 0x6c46c020, - 0x2cdfc: 0x6c46c220, 0x2cdfd: 0x6c46c420, 0x2cdfe: 0x6c46c620, 0x2cdff: 0x6c46c820, - // Block 0xb38, offset 0x2ce00 - 0x2ce00: 0x6c46ca20, 0x2ce01: 0x6c46cc20, 0x2ce02: 0x6c46ce20, 0x2ce03: 0x6c46d020, - 0x2ce04: 0x6c46d220, 0x2ce05: 0x6c46d420, 0x2ce06: 0x6c46d620, 0x2ce07: 0x6c46d820, - 0x2ce08: 0x6c46da20, 0x2ce09: 0x6c46dc20, 0x2ce0a: 0x6c46de20, 0x2ce0b: 0x6c46e020, - 0x2ce0c: 0x6c46e220, 0x2ce0d: 0x6c46e420, 0x2ce0e: 0x6c46e620, 0x2ce0f: 0x6c46e820, - 0x2ce10: 0x6c46ea20, 0x2ce11: 0x6c46ec20, 0x2ce12: 0x6c46ee20, 0x2ce13: 0x6c46f020, - 0x2ce14: 0x6c46f220, 0x2ce15: 0x6c46f420, 0x2ce16: 0x6c46f620, 0x2ce17: 0x6c46f820, - 0x2ce18: 0x6c46fa20, 0x2ce19: 0x6c46fc20, 0x2ce1a: 0x6c46fe20, 0x2ce1b: 0x6c470020, - 0x2ce1c: 0x6c470220, 0x2ce1d: 0x6c470420, 0x2ce1e: 0x6c470620, 0x2ce1f: 0x6c470820, - 0x2ce20: 0x6c67ba20, 0x2ce21: 0x6c67bc20, 0x2ce22: 0x6c67be20, 0x2ce23: 0x6c67c020, - 0x2ce24: 0x6c67c220, 0x2ce25: 0x6c67c420, 0x2ce26: 0x6c67c620, 0x2ce27: 0x6c67c820, - 0x2ce28: 0x6c67ca20, 0x2ce29: 0x6c67cc20, 0x2ce2a: 0x6c67ce20, 0x2ce2b: 0x6c67d020, - 0x2ce2c: 0x6c67d220, 0x2ce2d: 0x6c67d420, 0x2ce2e: 0x6c67d620, 0x2ce2f: 0x6c67d820, - 0x2ce30: 0x6c67da20, 0x2ce31: 0x6c67dc20, 0x2ce32: 0x6c67de20, 0x2ce33: 0x6c67e020, - 0x2ce34: 0x6c67e220, 0x2ce35: 0x6c67e420, 0x2ce36: 0x6c67e620, 0x2ce37: 0x6c67e820, - 0x2ce38: 0x6c67ea20, 0x2ce39: 0x6c67ec20, 0x2ce3a: 0x6c67ee20, 0x2ce3b: 0x6c67f020, - 0x2ce3c: 0x6c67f220, 0x2ce3d: 0x6c67f420, 0x2ce3e: 0x6c67f620, 0x2ce3f: 0x6c67f820, - // Block 0xb39, offset 0x2ce40 - 0x2ce40: 0x6c67fa20, 0x2ce41: 0x6c67fc20, 0x2ce42: 0x6c67fe20, 0x2ce43: 0x6c680020, - 0x2ce44: 0x6c680220, 0x2ce45: 0x6c680420, 0x2ce46: 0x6c680620, 0x2ce47: 0x6c680820, - 0x2ce48: 0x6c680a20, 0x2ce49: 0x6c680c20, 0x2ce4a: 0x6c680e20, 0x2ce4b: 0x6c681020, - 0x2ce4c: 0x6c8e1020, 0x2ce4d: 0x6c681220, 0x2ce4e: 0x6c681420, 0x2ce4f: 0x6c681620, - 0x2ce50: 0x6c681820, 0x2ce51: 0x6c681a20, 0x2ce52: 0x6c681c20, 0x2ce53: 0x6c681e20, - 0x2ce54: 0x6c682020, 0x2ce55: 0x6c682220, 0x2ce56: 0x6c682420, 0x2ce57: 0x6c682620, - 0x2ce58: 0x6c682820, 0x2ce59: 0x6c682a20, 0x2ce5a: 0x6c682c20, 0x2ce5b: 0x6c682e20, - 0x2ce5c: 0x6c683020, 0x2ce5d: 0x6c683220, 0x2ce5e: 0x6c683420, 0x2ce5f: 0x6c683620, - 0x2ce60: 0x6c683820, 0x2ce61: 0x6c683a20, 0x2ce62: 0x6c683c20, 0x2ce63: 0x6c683e20, - 0x2ce64: 0x6c684020, 0x2ce65: 0x6c684220, 0x2ce66: 0x6c684420, 0x2ce67: 0x6c684620, - 0x2ce68: 0x6c8e4020, 0x2ce69: 0x6c8e4220, 0x2ce6a: 0x6c8e4420, 0x2ce6b: 0x6c8e4620, - 0x2ce6c: 0x6c8e4820, 0x2ce6d: 0x6c8e4a20, 0x2ce6e: 0x6c8e4c20, 0x2ce6f: 0x6c8e4e20, - 0x2ce70: 0x6c8e5020, 0x2ce71: 0x6c8e5220, 0x2ce72: 0x6c8e5420, 0x2ce73: 0x6c8e5620, - 0x2ce74: 0x6c8e5820, 0x2ce75: 0x6c8e5a20, 0x2ce76: 0x6c8e5c20, 0x2ce77: 0x6c8e5e20, - 0x2ce78: 0x6c8e6020, 0x2ce79: 0x6c8e6220, 0x2ce7a: 0x6c8e6420, 0x2ce7b: 0x6c8e6620, - 0x2ce7c: 0x6c8e6820, 0x2ce7d: 0x6c8e6a20, 0x2ce7e: 0x6c8e6c20, 0x2ce7f: 0x6c8e6e20, - // Block 0xb3a, offset 0x2ce80 - 0x2ce80: 0x6c8e7020, 0x2ce81: 0x6c8e7220, 0x2ce82: 0x6c8e7420, 0x2ce83: 0x6c8e7620, - 0x2ce84: 0x6c8e7820, 0x2ce85: 0x6c8e7a20, 0x2ce86: 0x6c8e7c20, 0x2ce87: 0x6c8e7e20, - 0x2ce88: 0x6c8e8020, 0x2ce89: 0x6c8e8220, 0x2ce8a: 0x6c8e8420, 0x2ce8b: 0x6c8e8620, - 0x2ce8c: 0x6c8e8820, 0x2ce8d: 0x6c8e8a20, 0x2ce8e: 0x6c8e8c20, 0x2ce8f: 0x6c8e8e20, - 0x2ce90: 0x6c8e9020, 0x2ce91: 0x6c8e9220, 0x2ce92: 0x6c8e9420, 0x2ce93: 0x6c8e9620, - 0x2ce94: 0x6c8e9820, 0x2ce95: 0x6c8e9a20, 0x2ce96: 0x6c8e9c20, 0x2ce97: 0x6c8e9e20, - 0x2ce98: 0x6c8ea020, 0x2ce99: 0x6cba9420, 0x2ce9a: 0x6c8ea220, 0x2ce9b: 0x6c8ea420, - 0x2ce9c: 0x6c8ea620, 0x2ce9d: 0x6c8ea820, 0x2ce9e: 0x6c8eaa20, 0x2ce9f: 0x6c9aaa20, - 0x2cea0: 0x6c8eac20, 0x2cea1: 0x6c8eae20, 0x2cea2: 0x6c8eb020, 0x2cea3: 0x6c8eb220, - 0x2cea4: 0x6c8eb420, 0x2cea5: 0x6c8eb620, 0x2cea6: 0x6c8eb820, 0x2cea7: 0x6c8eba20, - 0x2cea8: 0x6c8ebc20, 0x2cea9: 0x6c8ebe20, 0x2ceaa: 0x6c8ec020, 0x2ceab: 0x6c901820, - 0x2ceac: 0x6c8ec220, 0x2cead: 0x6c8ec420, 0x2ceae: 0x6c8ec620, 0x2ceaf: 0x6c8ec820, - 0x2ceb0: 0x6c8eca20, 0x2ceb1: 0x6c8ecc20, 0x2ceb2: 0x6c8ece20, 0x2ceb3: 0x6c8ed020, - 0x2ceb4: 0x6c8ed220, 0x2ceb5: 0x6c8ed420, 0x2ceb6: 0x6c8ed620, 0x2ceb7: 0x6c8ed820, - 0x2ceb8: 0x6c8eda20, 0x2ceb9: 0x6c8edc20, 0x2ceba: 0x6cba9620, 0x2cebb: 0x6cba9820, - 0x2cebc: 0x6cba9a20, 0x2cebd: 0x6cba9c20, 0x2cebe: 0x6cba9e20, 0x2cebf: 0x6cbaa020, - // Block 0xb3b, offset 0x2cec0 - 0x2cec0: 0x6cbaa220, 0x2cec1: 0x6cbaa420, 0x2cec2: 0x6cbaa620, 0x2cec3: 0x6cbaa820, - 0x2cec4: 0x6cbaaa20, 0x2cec5: 0x6cbaac20, 0x2cec6: 0x6cbaae20, 0x2cec7: 0x6cbab020, - 0x2cec8: 0x6cbab220, 0x2cec9: 0x6cbab420, 0x2ceca: 0x6cbab620, 0x2cecb: 0x6cbab820, - 0x2cecc: 0x6cbaba20, 0x2cecd: 0x6ceb6e20, 0x2cece: 0x6cbabc20, 0x2cecf: 0x6cbabe20, - 0x2ced0: 0x6cbac020, 0x2ced1: 0x6cbac220, 0x2ced2: 0x6cbac420, 0x2ced3: 0x6cbac620, - 0x2ced4: 0x6cbac820, 0x2ced5: 0x6cbaca20, 0x2ced6: 0x6cbacc20, 0x2ced7: 0x6cbace20, - 0x2ced8: 0x6cbad020, 0x2ced9: 0x6cbad220, 0x2ceda: 0x6cbad420, 0x2cedb: 0x6cbad620, - 0x2cedc: 0x6cbad820, 0x2cedd: 0x6cbada20, 0x2cede: 0x6cbadc20, 0x2cedf: 0x6cbade20, - 0x2cee0: 0x6cbae020, 0x2cee1: 0x6cbae220, 0x2cee2: 0x6cbae420, 0x2cee3: 0x6cbae620, - 0x2cee4: 0x6cbae820, 0x2cee5: 0x6cbaea20, 0x2cee6: 0x6cbaec20, 0x2cee7: 0x6cbaee20, - 0x2cee8: 0x6cbaf020, 0x2cee9: 0x6cbaf220, 0x2ceea: 0x6cbaf420, 0x2ceeb: 0x6cbaf620, - 0x2ceec: 0x6cbaf820, 0x2ceed: 0x6cbafa20, 0x2ceee: 0x6cbafc20, 0x2ceef: 0x6cbafe20, - 0x2cef0: 0x6cbb0020, 0x2cef1: 0x6cbb0220, 0x2cef2: 0x6cbb0420, 0x2cef3: 0x6cbb0620, - 0x2cef4: 0x6cbb0820, 0x2cef5: 0x6cbb0a20, 0x2cef6: 0x6c901a20, 0x2cef7: 0x6cbb0c20, - 0x2cef8: 0x6cbb0e20, 0x2cef9: 0x6cbb1020, 0x2cefa: 0x6cbb1220, 0x2cefb: 0x6cbb1420, - 0x2cefc: 0x6cbb1620, 0x2cefd: 0x6cbb1820, 0x2cefe: 0x6cbb1a20, 0x2ceff: 0x6ceb7020, - // Block 0xb3c, offset 0x2cf00 - 0x2cf00: 0x6ceb7220, 0x2cf01: 0x6ceb7420, 0x2cf02: 0x6ceb7620, 0x2cf03: 0x6ceb7820, - 0x2cf04: 0x6ceb7a20, 0x2cf05: 0x6ceb7c20, 0x2cf06: 0x6ceb7e20, 0x2cf07: 0x6ceb8020, - 0x2cf08: 0x6ceb8220, 0x2cf09: 0x6ceb8420, 0x2cf0a: 0x6ceb8620, 0x2cf0b: 0x6ceb8820, - 0x2cf0c: 0x6ceb8a20, 0x2cf0d: 0x6ceb8c20, 0x2cf0e: 0x6ceb8e20, 0x2cf0f: 0x6ceb9020, - 0x2cf10: 0x6ceb9220, 0x2cf11: 0x6ceb9420, 0x2cf12: 0x6ceb9620, 0x2cf13: 0x6ceb9820, - 0x2cf14: 0x6ceb9a20, 0x2cf15: 0x6ceb9c20, 0x2cf16: 0x6ceb9e20, 0x2cf17: 0x6ceba020, - 0x2cf18: 0x6ceba220, 0x2cf19: 0x6ceba420, 0x2cf1a: 0x6ceba620, 0x2cf1b: 0x6ceba820, - 0x2cf1c: 0x6cebaa20, 0x2cf1d: 0x6cebac20, 0x2cf1e: 0x6cbc3e20, 0x2cf1f: 0x6cebae20, - 0x2cf20: 0x6cebb020, 0x2cf21: 0x6cebb220, 0x2cf22: 0x6cebb420, 0x2cf23: 0x6cebb620, - 0x2cf24: 0x6cebb820, 0x2cf25: 0x6cebba20, 0x2cf26: 0x6cebbc20, 0x2cf27: 0x6cebbe20, - 0x2cf28: 0x6cebc020, 0x2cf29: 0x6cebc220, 0x2cf2a: 0x6cebc420, 0x2cf2b: 0x6cebc620, - 0x2cf2c: 0x6cebc820, 0x2cf2d: 0x6cebca20, 0x2cf2e: 0x6cebcc20, 0x2cf2f: 0x6cebce20, - 0x2cf30: 0x6cebd020, 0x2cf31: 0x6cebd220, 0x2cf32: 0x6cebd420, 0x2cf33: 0x6cebd620, - 0x2cf34: 0x6cebd820, 0x2cf35: 0x6cebda20, 0x2cf36: 0x6d1b5220, 0x2cf37: 0x6d1b5420, - 0x2cf38: 0x6d1b5620, 0x2cf39: 0x6d1b5820, 0x2cf3a: 0x6d1b5a20, 0x2cf3b: 0x6d1b5c20, - 0x2cf3c: 0x6d1b5e20, 0x2cf3d: 0x6d1b6020, 0x2cf3e: 0x6d1b6220, 0x2cf3f: 0x6d1b6420, - // Block 0xb3d, offset 0x2cf40 - 0x2cf40: 0x6d1b6620, 0x2cf41: 0x6d1b6820, 0x2cf42: 0x6d1b6a20, 0x2cf43: 0x6d1b6c20, - 0x2cf44: 0x6d1b6e20, 0x2cf45: 0x6d1b7020, 0x2cf46: 0x6d1b7220, 0x2cf47: 0x6d1b7420, - 0x2cf48: 0x6d1b7620, 0x2cf49: 0x6d1b7820, 0x2cf4a: 0x6d1b7a20, 0x2cf4b: 0x6d1b7c20, - 0x2cf4c: 0x6d1b7e20, 0x2cf4d: 0x6d1b8020, 0x2cf4e: 0x6d1b8220, 0x2cf4f: 0x6d1b8420, - 0x2cf50: 0x6d1b8620, 0x2cf51: 0x6d1b8820, 0x2cf52: 0x6d1b8a20, 0x2cf53: 0x6d1b8c20, - 0x2cf54: 0x6d1b8e20, 0x2cf55: 0x6d1b9020, 0x2cf56: 0x6d1b9220, 0x2cf57: 0x6d1b9420, - 0x2cf58: 0x6d1b9620, 0x2cf59: 0x6d1b9820, 0x2cf5a: 0x6d1b9a20, 0x2cf5b: 0x6d1b9c20, - 0x2cf5c: 0x6d1b9e20, 0x2cf5d: 0x6d1ba020, 0x2cf5e: 0x6d1ba220, 0x2cf5f: 0x6d1cec20, - 0x2cf60: 0x6d496220, 0x2cf61: 0x6d1ba420, 0x2cf62: 0x6d1ba620, 0x2cf63: 0x6d1ba820, - 0x2cf64: 0x6d1baa20, 0x2cf65: 0x6d1bac20, 0x2cf66: 0x6d1bae20, 0x2cf67: 0x6d1bb020, - 0x2cf68: 0x6d1cee20, 0x2cf69: 0x6d496420, 0x2cf6a: 0x6d496620, 0x2cf6b: 0x6d496820, - 0x2cf6c: 0x6d496a20, 0x2cf6d: 0x6d496c20, 0x2cf6e: 0x6d496e20, 0x2cf6f: 0x6d497020, - 0x2cf70: 0x6d497220, 0x2cf71: 0x6d497420, 0x2cf72: 0x6d497620, 0x2cf73: 0x6d497820, - 0x2cf74: 0x6d497a20, 0x2cf75: 0x6d497c20, 0x2cf76: 0x6d497e20, 0x2cf77: 0x6d498020, - 0x2cf78: 0x6d498220, 0x2cf79: 0x6d498420, 0x2cf7a: 0x6d498620, 0x2cf7b: 0x6d498820, - 0x2cf7c: 0x6d498a20, 0x2cf7d: 0x6d498c20, 0x2cf7e: 0x6d498e20, 0x2cf7f: 0x6d499020, - // Block 0xb3e, offset 0x2cf80 - 0x2cf80: 0x6d499220, 0x2cf81: 0x6d499420, 0x2cf82: 0x6d499620, 0x2cf83: 0x6d499820, - 0x2cf84: 0x6d499a20, 0x2cf85: 0x6cbb1c20, 0x2cf86: 0x6d499c20, 0x2cf87: 0x6d499e20, - 0x2cf88: 0x6d49a020, 0x2cf89: 0x6d49a220, 0x2cf8a: 0x6d49a420, 0x2cf8b: 0x6d49a620, - 0x2cf8c: 0x6d49a820, 0x2cf8d: 0x6d49aa20, 0x2cf8e: 0x6d49ac20, 0x2cf8f: 0x6d49ae20, - 0x2cf90: 0x6d49b020, 0x2cf91: 0x6d1bb220, 0x2cf92: 0x6d49b220, 0x2cf93: 0x6d494c20, - 0x2cf94: 0x6d49b420, 0x2cf95: 0x6d590220, 0x2cf96: 0x6d49b620, 0x2cf97: 0x6d49b820, - 0x2cf98: 0x6d49ba20, 0x2cf99: 0x6d49bc20, 0x2cf9a: 0x6d49be20, 0x2cf9b: 0x6d49c020, - 0x2cf9c: 0x6d49c220, 0x2cf9d: 0x6d49c420, 0x2cf9e: 0x6d772220, 0x2cf9f: 0x6d772420, - 0x2cfa0: 0x6d772620, 0x2cfa1: 0x6d772820, 0x2cfa2: 0x6d772a20, 0x2cfa3: 0x6d772c20, - 0x2cfa4: 0x6d772e20, 0x2cfa5: 0x6d773020, 0x2cfa6: 0x6d773220, 0x2cfa7: 0x6d773420, - 0x2cfa8: 0x6d773620, 0x2cfa9: 0x6d773820, 0x2cfaa: 0x6d773a20, 0x2cfab: 0x6d773c20, - 0x2cfac: 0x6d773e20, 0x2cfad: 0x6d774020, 0x2cfae: 0x6d774220, 0x2cfaf: 0x6d774420, - 0x2cfb0: 0x6d774620, 0x2cfb1: 0x6d774820, 0x2cfb2: 0x6d774a20, 0x2cfb3: 0x6d774c20, - 0x2cfb4: 0x6d49c620, 0x2cfb5: 0x6d774e20, 0x2cfb6: 0x6d775020, 0x2cfb7: 0x6d775220, - 0x2cfb8: 0x6d775420, 0x2cfb9: 0x6d775620, 0x2cfba: 0x6d775820, 0x2cfbb: 0x6d775a20, - 0x2cfbc: 0x6d775c20, 0x2cfbd: 0x6da0a220, 0x2cfbe: 0x6da0a420, 0x2cfbf: 0x6da0a620, - // Block 0xb3f, offset 0x2cfc0 - 0x2cfc0: 0x6da0a820, 0x2cfc1: 0x6da0aa20, 0x2cfc2: 0x6da0ac20, 0x2cfc3: 0x6da0ae20, - 0x2cfc4: 0x6da0b020, 0x2cfc5: 0x6da0b220, 0x2cfc6: 0x6da0b420, 0x2cfc7: 0x6da0b620, - 0x2cfc8: 0x6da0b820, 0x2cfc9: 0x6da0ba20, 0x2cfca: 0x6da0bc20, 0x2cfcb: 0x6da0be20, - 0x2cfcc: 0x6da0c020, 0x2cfcd: 0x6da0c220, 0x2cfce: 0x6da0c420, 0x2cfcf: 0x6da0c620, - 0x2cfd0: 0x6da0c820, 0x2cfd1: 0x6da0ca20, 0x2cfd2: 0x6da0cc20, 0x2cfd3: 0x6da0ce20, - 0x2cfd4: 0x6dc30820, 0x2cfd5: 0x6dc30a20, 0x2cfd6: 0x6dc30c20, 0x2cfd7: 0x6dc30e20, - 0x2cfd8: 0x6dc31020, 0x2cfd9: 0x6dc31220, 0x2cfda: 0x6dc31420, 0x2cfdb: 0x6dc31620, - 0x2cfdc: 0x6dc31820, 0x2cfdd: 0x6dc31a20, 0x2cfde: 0x6dc31c20, 0x2cfdf: 0x6dc31e20, - 0x2cfe0: 0x6dc32020, 0x2cfe1: 0x6dc32220, 0x2cfe2: 0x6dc32420, 0x2cfe3: 0x6dc32620, - 0x2cfe4: 0x6dc32820, 0x2cfe5: 0x6de08420, 0x2cfe6: 0x6de08620, 0x2cfe7: 0x6de08820, - 0x2cfe8: 0x6de08a20, 0x2cfe9: 0x6de08c20, 0x2cfea: 0x6de08e20, 0x2cfeb: 0x6de09020, - 0x2cfec: 0x6de09220, 0x2cfed: 0x6de09420, 0x2cfee: 0x6dc3dc20, 0x2cfef: 0x6de09620, - 0x2cff0: 0x6de09820, 0x2cff1: 0x6df8d020, 0x2cff2: 0x6df8d220, 0x2cff3: 0x6df8d420, - 0x2cff4: 0x6df8d620, 0x2cff5: 0x6df8d820, 0x2cff6: 0x6df8da20, 0x2cff7: 0x6df8dc20, - 0x2cff8: 0x6df8de20, 0x2cff9: 0x6df8e020, 0x2cffa: 0x6e0c9020, 0x2cffb: 0x6e0c9820, - 0x2cffc: 0x6df92820, 0x2cffd: 0x6e0c9a20, 0x2cffe: 0x6e0c9c20, 0x2cfff: 0x6e0c9e20, - // Block 0xb40, offset 0x2d000 - 0x2d000: 0x6e0ca020, 0x2d001: 0x6e0ca220, 0x2d002: 0x6e0ca420, 0x2d003: 0x6e0ca620, - 0x2d004: 0x6e0ca820, 0x2d005: 0x6e1c3020, 0x2d006: 0x6e1c3220, 0x2d007: 0x6e1c3420, - 0x2d008: 0x6e1c3620, 0x2d009: 0x6e1c3820, 0x2d00a: 0x6e1c3a20, 0x2d00b: 0x6e1c3c20, - 0x2d00c: 0x6e287620, 0x2d00d: 0x6e0caa20, 0x2d00e: 0x6e1c3e20, 0x2d00f: 0x6e287820, - 0x2d010: 0x6e287a20, 0x2d011: 0x6e319e20, 0x2d012: 0x6e31a020, 0x2d013: 0x6e31a220, - 0x2d014: 0x6e384820, 0x2d015: 0x6e384a20, 0x2d016: 0x6e428420, 0x2d017: 0x6c018220, - 0x2d018: 0x6c078a20, 0x2d019: 0x6c078c20, 0x2d01a: 0x6c078e20, 0x2d01b: 0x6c079020, - 0x2d01c: 0x6c079220, 0x2d01d: 0x6c0e9820, 0x2d01e: 0x6c0e9a20, 0x2d01f: 0x6c0e9c20, - 0x2d020: 0x6c0e9e20, 0x2d021: 0x6c0ea020, 0x2d022: 0x6c0ea220, 0x2d023: 0x6c0ea420, - 0x2d024: 0x6c1a4a20, 0x2d025: 0x6c1a4c20, 0x2d026: 0x6c1a4e20, 0x2d027: 0x6c1a5020, - 0x2d028: 0x6c1a5220, 0x2d029: 0x6c1a5420, 0x2d02a: 0x6c1a5620, 0x2d02b: 0x6c1a5820, - 0x2d02c: 0x6c1a5a20, 0x2d02d: 0x6c1a5c20, 0x2d02e: 0x6c1a5e20, 0x2d02f: 0x6c1a6020, - 0x2d030: 0x6c1a6220, 0x2d031: 0x6c1a6420, 0x2d032: 0x6c1a6620, 0x2d033: 0x6c1a6820, - 0x2d034: 0x6c1a6a20, 0x2d035: 0x6c1a6c20, 0x2d036: 0x6c2d8220, 0x2d037: 0x6c2d8420, - 0x2d038: 0x6c2d8620, 0x2d039: 0x6c2d8820, 0x2d03a: 0x6c2d8a20, 0x2d03b: 0x6c2d8c20, - 0x2d03c: 0x6c2d8e20, 0x2d03d: 0x6c2d9020, 0x2d03e: 0x6c2d9220, 0x2d03f: 0x6c47de20, - // Block 0xb41, offset 0x2d040 - 0x2d040: 0x6c47e020, 0x2d041: 0x6c695020, 0x2d042: 0x6c695220, 0x2d043: 0x6c695420, - 0x2d044: 0x6c695620, 0x2d045: 0x6c695820, 0x2d046: 0x6c695a20, 0x2d047: 0x6c901c20, - 0x2d048: 0x6c901e20, 0x2d049: 0x6c902020, 0x2d04a: 0x6c902220, 0x2d04b: 0x6c902420, - 0x2d04c: 0x6cbc4020, 0x2d04d: 0x6cbc4220, 0x2d04e: 0x6cbc4420, 0x2d04f: 0x6c902620, - 0x2d050: 0x6cbc4620, 0x2d051: 0x6ced2820, 0x2d052: 0x6ced2a20, 0x2d053: 0x6ced2c20, - 0x2d054: 0x6ced2e20, 0x2d055: 0x6ced3020, 0x2d056: 0x6d1cf220, 0x2d057: 0x6d1cf420, - 0x2d058: 0x6d1cf620, 0x2d059: 0x6d1cf820, 0x2d05a: 0x6d4ab620, 0x2d05b: 0x6d785820, - 0x2d05c: 0x6d785a20, 0x2d05d: 0x6e1c7420, 0x2d05e: 0x6e3d0e20, 0x2d05f: 0x6c018420, - 0x2d060: 0x6c03ce20, 0x2d061: 0x6c03d020, 0x2d062: 0x6c07a220, 0x2d063: 0x6c07a420, - 0x2d064: 0x6c07a620, 0x2d065: 0x6c07a820, 0x2d066: 0x6c07aa20, 0x2d067: 0x6c07ac20, - 0x2d068: 0x6c0ec020, 0x2d069: 0x6c0ec220, 0x2d06a: 0x6c0ec420, 0x2d06b: 0x6c0ec620, - 0x2d06c: 0x6c0ec820, 0x2d06d: 0x6c0eca20, 0x2d06e: 0x6c0ecc20, 0x2d06f: 0x6c0ece20, - 0x2d070: 0x6c0ed020, 0x2d071: 0x6c0ed220, 0x2d072: 0x6c0ed420, 0x2d073: 0x6c0ed620, - 0x2d074: 0x6c0ed820, 0x2d075: 0x6c0eda20, 0x2d076: 0x6c0edc20, 0x2d077: 0x6c0ede20, - 0x2d078: 0x6c0ee020, 0x2d079: 0x6c0ee220, 0x2d07a: 0x6c0ee420, 0x2d07b: 0x6c1aac20, - 0x2d07c: 0x6c1aae20, 0x2d07d: 0x6c1ab020, 0x2d07e: 0x6c1ab220, 0x2d07f: 0x6c1ab420, - // Block 0xb42, offset 0x2d080 - 0x2d080: 0x6c1ab620, 0x2d081: 0x6c1ab820, 0x2d082: 0x6c1aba20, 0x2d083: 0x6c1abc20, - 0x2d084: 0x6c1abe20, 0x2d085: 0x6c1ac020, 0x2d086: 0x6c1ac220, 0x2d087: 0x6c1ac420, - 0x2d088: 0x6c1ac620, 0x2d089: 0x6c1ac820, 0x2d08a: 0x6c1aca20, 0x2d08b: 0x6c1acc20, - 0x2d08c: 0x6c1ace20, 0x2d08d: 0x6c1ad020, 0x2d08e: 0x6c1ad220, 0x2d08f: 0x6c1ad420, - 0x2d090: 0x6c1ad620, 0x2d091: 0x6c1ad820, 0x2d092: 0x6c1ada20, 0x2d093: 0x6c1adc20, - 0x2d094: 0x6c1ade20, 0x2d095: 0x6c1ae020, 0x2d096: 0x6c1ae220, 0x2d097: 0x6c1ae420, - 0x2d098: 0x6c1ae620, 0x2d099: 0x6c1ae820, 0x2d09a: 0x6c1aea20, 0x2d09b: 0x6c1aec20, - 0x2d09c: 0x6c1aee20, 0x2d09d: 0x6c1af020, 0x2d09e: 0x6c1af220, 0x2d09f: 0x6c1af420, - 0x2d0a0: 0x6c1af620, 0x2d0a1: 0x6c2db420, 0x2d0a2: 0x6c2db620, 0x2d0a3: 0x6c2db820, - 0x2d0a4: 0x6c2dba20, 0x2d0a5: 0x6c2dbc20, 0x2d0a6: 0x6c2dbe20, 0x2d0a7: 0x6c2dc020, - 0x2d0a8: 0x6c2dc220, 0x2d0a9: 0x6c2dc420, 0x2d0aa: 0x6c2dc620, 0x2d0ab: 0x6c2dc820, - 0x2d0ac: 0x6c2dca20, 0x2d0ad: 0x6c2dcc20, 0x2d0ae: 0x6c2dce20, 0x2d0af: 0x6c2dd020, - 0x2d0b0: 0x6c2dd220, 0x2d0b1: 0x6c2dd420, 0x2d0b2: 0x6c2dd620, 0x2d0b3: 0x6c2dd820, - 0x2d0b4: 0x6c2dda20, 0x2d0b5: 0x6c2ddc20, 0x2d0b6: 0x6c2dde20, 0x2d0b7: 0x6c2de020, - 0x2d0b8: 0x6c2de220, 0x2d0b9: 0x6c2de420, 0x2d0ba: 0x6c2de620, 0x2d0bb: 0x6c2de820, - 0x2d0bc: 0x6c2dea20, 0x2d0bd: 0x6c2dec20, 0x2d0be: 0x6c2dee20, 0x2d0bf: 0x6c2df020, - // Block 0xb43, offset 0x2d0c0 - 0x2d0c0: 0x6c2df220, 0x2d0c1: 0x6c2df420, 0x2d0c2: 0x6c2df620, 0x2d0c3: 0x6c2df820, - 0x2d0c4: 0x6c2dfa20, 0x2d0c5: 0x6c2dfc20, 0x2d0c6: 0x6c2dfe20, 0x2d0c7: 0x6c2e0020, - 0x2d0c8: 0x6c2e0220, 0x2d0c9: 0x6c2e0420, 0x2d0ca: 0x6c2e0620, 0x2d0cb: 0x6c481220, - 0x2d0cc: 0x6c481420, 0x2d0cd: 0x6c481620, 0x2d0ce: 0x6c481820, 0x2d0cf: 0x6c481a20, - 0x2d0d0: 0x6c481c20, 0x2d0d1: 0x6c481e20, 0x2d0d2: 0x6c482020, 0x2d0d3: 0x6c482220, - 0x2d0d4: 0x6c482420, 0x2d0d5: 0x6c482620, 0x2d0d6: 0x6c482820, 0x2d0d7: 0x6c482a20, - 0x2d0d8: 0x6c482c20, 0x2d0d9: 0x6c482e20, 0x2d0da: 0x6c483020, 0x2d0db: 0x6c483220, - 0x2d0dc: 0x6c483420, 0x2d0dd: 0x6c483620, 0x2d0de: 0x6c483820, 0x2d0df: 0x6c483a20, - 0x2d0e0: 0x6c483c20, 0x2d0e1: 0x6c483e20, 0x2d0e2: 0x6c484020, 0x2d0e3: 0x6c484220, - 0x2d0e4: 0x6c484420, 0x2d0e5: 0x6c484620, 0x2d0e6: 0x6c484820, 0x2d0e7: 0x6c484a20, - 0x2d0e8: 0x6c484c20, 0x2d0e9: 0x6c484e20, 0x2d0ea: 0x6c485020, 0x2d0eb: 0x6c485220, - 0x2d0ec: 0x6c485420, 0x2d0ed: 0x6c485620, 0x2d0ee: 0x6c485820, 0x2d0ef: 0x6c485a20, - 0x2d0f0: 0x6c485c20, 0x2d0f1: 0x6c485e20, 0x2d0f2: 0x6c486020, 0x2d0f3: 0x6c486220, - 0x2d0f4: 0x6c486420, 0x2d0f5: 0x6c486620, 0x2d0f6: 0x6c698e20, 0x2d0f7: 0x6c699020, - 0x2d0f8: 0x6c699220, 0x2d0f9: 0x6c699420, 0x2d0fa: 0x6c699620, 0x2d0fb: 0x6c699820, - 0x2d0fc: 0x6c699a20, 0x2d0fd: 0x6c699c20, 0x2d0fe: 0x6c699e20, 0x2d0ff: 0x6c69a020, - // Block 0xb44, offset 0x2d100 - 0x2d100: 0x6c69a220, 0x2d101: 0x6c69a420, 0x2d102: 0x6c69a620, 0x2d103: 0x6c69a820, - 0x2d104: 0x6c69aa20, 0x2d105: 0x6c69ac20, 0x2d106: 0x6c69ae20, 0x2d107: 0x6c69b020, - 0x2d108: 0x6c69b220, 0x2d109: 0x6c69b420, 0x2d10a: 0x6c69b620, 0x2d10b: 0x6c69b820, - 0x2d10c: 0x6c69ba20, 0x2d10d: 0x6c69bc20, 0x2d10e: 0x6c486820, 0x2d10f: 0x6c69be20, - 0x2d110: 0x6c69c020, 0x2d111: 0x6c69c220, 0x2d112: 0x6c69c420, 0x2d113: 0x6c69c620, - 0x2d114: 0x6c69c820, 0x2d115: 0x6c69ca20, 0x2d116: 0x6c69cc20, 0x2d117: 0x6c69ce20, - 0x2d118: 0x6c69d020, 0x2d119: 0x6c69d220, 0x2d11a: 0x6c69d420, 0x2d11b: 0x6c69d620, - 0x2d11c: 0x6c905420, 0x2d11d: 0x6c905620, 0x2d11e: 0x6c905820, 0x2d11f: 0x6c905a20, - 0x2d120: 0x6c905c20, 0x2d121: 0x6c905e20, 0x2d122: 0x6c906020, 0x2d123: 0x6c906220, - 0x2d124: 0x6c906420, 0x2d125: 0x6c906620, 0x2d126: 0x6c906820, 0x2d127: 0x6c906a20, - 0x2d128: 0x6c906c20, 0x2d129: 0x6c906e20, 0x2d12a: 0x6c915e20, 0x2d12b: 0x6c907020, - 0x2d12c: 0x6c907220, 0x2d12d: 0x6c907420, 0x2d12e: 0x6c907620, 0x2d12f: 0x6c907820, - 0x2d130: 0x6c907a20, 0x2d131: 0x6c907c20, 0x2d132: 0x6c907e20, 0x2d133: 0x6c908020, - 0x2d134: 0x6c908220, 0x2d135: 0x6c908420, 0x2d136: 0x6c908620, 0x2d137: 0x6c908820, - 0x2d138: 0x6c908a20, 0x2d139: 0x6c908c20, 0x2d13a: 0x6c908e20, 0x2d13b: 0x6c909020, - 0x2d13c: 0x6c909220, 0x2d13d: 0x6c909420, 0x2d13e: 0x6c909620, 0x2d13f: 0x6c909820, - // Block 0xb45, offset 0x2d140 - 0x2d140: 0x6c909a20, 0x2d141: 0x6c909c20, 0x2d142: 0x6c909e20, 0x2d143: 0x6c90a020, - 0x2d144: 0x6c90a220, 0x2d145: 0x6c90a420, 0x2d146: 0x6c90a620, 0x2d147: 0x6c90a820, - 0x2d148: 0x6c90aa20, 0x2d149: 0x6c90ac20, 0x2d14a: 0x6c90ae20, 0x2d14b: 0x6c90b020, - 0x2d14c: 0x6c90b220, 0x2d14d: 0x6c90b420, 0x2d14e: 0x6c90b620, 0x2d14f: 0x6c90b820, - 0x2d150: 0x6c90ba20, 0x2d151: 0x6c90bc20, 0x2d152: 0x6c90be20, 0x2d153: 0x6c90c020, - 0x2d154: 0x6c90c220, 0x2d155: 0x6c90c420, 0x2d156: 0x6cbc7a20, 0x2d157: 0x6cbc7c20, - 0x2d158: 0x6cbc7e20, 0x2d159: 0x6cbc8020, 0x2d15a: 0x6cbc8220, 0x2d15b: 0x6cbc8420, - 0x2d15c: 0x6cbc8620, 0x2d15d: 0x6cbc8820, 0x2d15e: 0x6cbc8a20, 0x2d15f: 0x6cbc8c20, - 0x2d160: 0x6cbc8e20, 0x2d161: 0x6cbc9020, 0x2d162: 0x6cbc9220, 0x2d163: 0x6cbc9420, - 0x2d164: 0x6cbc9620, 0x2d165: 0x6cbc9820, 0x2d166: 0x6cbc9a20, 0x2d167: 0x6cbc9c20, - 0x2d168: 0x6cbc9e20, 0x2d169: 0x6cbca020, 0x2d16a: 0x6cbca220, 0x2d16b: 0x6cbca420, - 0x2d16c: 0x6cbca620, 0x2d16d: 0x6cbca820, 0x2d16e: 0x6cbcaa20, 0x2d16f: 0x6cbcac20, - 0x2d170: 0x6cbcae20, 0x2d171: 0x6cbcb020, 0x2d172: 0x6c6a6e20, 0x2d173: 0x6cbcb220, - 0x2d174: 0x6cbcb420, 0x2d175: 0x6c916020, 0x2d176: 0x6cbcb620, 0x2d177: 0x6cbcb820, - 0x2d178: 0x6cbcba20, 0x2d179: 0x6cbcbc20, 0x2d17a: 0x6cbcbe20, 0x2d17b: 0x6cbcc020, - 0x2d17c: 0x6cbcc220, 0x2d17d: 0x6ced5820, 0x2d17e: 0x6cbcc420, 0x2d17f: 0x6cbcc620, - // Block 0xb46, offset 0x2d180 - 0x2d180: 0x6cbcc820, 0x2d181: 0x6cbcca20, 0x2d182: 0x6cbccc20, 0x2d183: 0x6ced5a20, - 0x2d184: 0x6cbcce20, 0x2d185: 0x6cbcd020, 0x2d186: 0x6cbcd220, 0x2d187: 0x6cbcd420, - 0x2d188: 0x6cbcd620, 0x2d189: 0x6ced5c20, 0x2d18a: 0x6ced5e20, 0x2d18b: 0x6ced6020, - 0x2d18c: 0x6ced6220, 0x2d18d: 0x6ced6420, 0x2d18e: 0x6ced6620, 0x2d18f: 0x6ced6820, - 0x2d190: 0x6ced6a20, 0x2d191: 0x6ced6c20, 0x2d192: 0x6ced6e20, 0x2d193: 0x6ced7020, - 0x2d194: 0x6ced7220, 0x2d195: 0x6ced7420, 0x2d196: 0x6ced7620, 0x2d197: 0x6ced7820, - 0x2d198: 0x6ced7a20, 0x2d199: 0x6ced7c20, 0x2d19a: 0x6ced7e20, 0x2d19b: 0x6ced8020, - 0x2d19c: 0x6ced8220, 0x2d19d: 0x6ced8420, 0x2d19e: 0x6ced8620, 0x2d19f: 0x6ced8820, - 0x2d1a0: 0x6ced8a20, 0x2d1a1: 0x6ced8c20, 0x2d1a2: 0x6ced8e20, 0x2d1a3: 0x6ced9020, - 0x2d1a4: 0x6ced9220, 0x2d1a5: 0x6ced9420, 0x2d1a6: 0x6ced9620, 0x2d1a7: 0x6ced9820, - 0x2d1a8: 0x6ced9a20, 0x2d1a9: 0x6ced9c20, 0x2d1aa: 0x6ced9e20, 0x2d1ab: 0x6ceda020, - 0x2d1ac: 0x6ceda220, 0x2d1ad: 0x6ceda420, 0x2d1ae: 0x6ceda620, 0x2d1af: 0x6ceda820, - 0x2d1b0: 0x6cedaa20, 0x2d1b1: 0x6cedac20, 0x2d1b2: 0x6d1d2420, 0x2d1b3: 0x6d1d2620, - 0x2d1b4: 0x6d1d2820, 0x2d1b5: 0x6d1d2a20, 0x2d1b6: 0x6d1d2c20, 0x2d1b7: 0x6d1d2e20, - 0x2d1b8: 0x6d1d3020, 0x2d1b9: 0x6d1d3220, 0x2d1ba: 0x6d1d3420, 0x2d1bb: 0x6d1d3620, - 0x2d1bc: 0x6d1d3820, 0x2d1bd: 0x6d1d3a20, 0x2d1be: 0x6d1d3c20, 0x2d1bf: 0x6d1d3e20, - // Block 0xb47, offset 0x2d1c0 - 0x2d1c0: 0x6d4ac620, 0x2d1c1: 0x6d1d4020, 0x2d1c2: 0x6d1d4220, 0x2d1c3: 0x6d1d4420, - 0x2d1c4: 0x6d1d4620, 0x2d1c5: 0x6d1d4820, 0x2d1c6: 0x6d1d4a20, 0x2d1c7: 0x6d1d4c20, - 0x2d1c8: 0x6d1d4e20, 0x2d1c9: 0x6d1d5020, 0x2d1ca: 0x6d1d5220, 0x2d1cb: 0x6d1d5420, - 0x2d1cc: 0x6d1d5620, 0x2d1cd: 0x6d1d5820, 0x2d1ce: 0x6d1d5a20, 0x2d1cf: 0x6d1d5c20, - 0x2d1d0: 0x6d1d5e20, 0x2d1d1: 0x6d1d6020, 0x2d1d2: 0x6d1d6220, 0x2d1d3: 0x6d1d6420, - 0x2d1d4: 0x6d1d6620, 0x2d1d5: 0x6d1d6820, 0x2d1d6: 0x6d1d6a20, 0x2d1d7: 0x6d1d6c20, - 0x2d1d8: 0x6d1d6e20, 0x2d1d9: 0x6d1d7020, 0x2d1da: 0x6d1d7220, 0x2d1db: 0x6d1d7420, - 0x2d1dc: 0x6d4ada20, 0x2d1dd: 0x6d4adc20, 0x2d1de: 0x6d4ade20, 0x2d1df: 0x6d4ae020, - 0x2d1e0: 0x6d4ae220, 0x2d1e1: 0x6d4ae420, 0x2d1e2: 0x6d4ae620, 0x2d1e3: 0x6d4ae820, - 0x2d1e4: 0x6d4aea20, 0x2d1e5: 0x6d4aec20, 0x2d1e6: 0x6d4aee20, 0x2d1e7: 0x6d4af020, - 0x2d1e8: 0x6d758820, 0x2d1e9: 0x6d4af220, 0x2d1ea: 0x6d4af420, 0x2d1eb: 0x6d4af620, - 0x2d1ec: 0x6d4af820, 0x2d1ed: 0x6d1df220, 0x2d1ee: 0x6d4afa20, 0x2d1ef: 0x6d4afc20, - 0x2d1f0: 0x6d4afe20, 0x2d1f1: 0x6d4b0020, 0x2d1f2: 0x6d4b0220, 0x2d1f3: 0x6d4b0420, - 0x2d1f4: 0x6d4b0620, 0x2d1f5: 0x6d4b0820, 0x2d1f6: 0x6d4b0a20, 0x2d1f7: 0x6d4b0c20, - 0x2d1f8: 0x6d4b0e20, 0x2d1f9: 0x6d4b1020, 0x2d1fa: 0x6d787420, 0x2d1fb: 0x6d787620, - 0x2d1fc: 0x6d787820, 0x2d1fd: 0x6d787a20, 0x2d1fe: 0x6d787c20, 0x2d1ff: 0x6d787e20, - // Block 0xb48, offset 0x2d200 - 0x2d200: 0x6d788020, 0x2d201: 0x6d788220, 0x2d202: 0x6d788420, 0x2d203: 0x6d788620, - 0x2d204: 0x6d788820, 0x2d205: 0x6d788a20, 0x2d206: 0x6d788c20, 0x2d207: 0x6d788e20, - 0x2d208: 0x6d789020, 0x2d209: 0x6d789220, 0x2d20a: 0x6d789420, 0x2d20b: 0x6d789620, - 0x2d20c: 0x6d789820, 0x2d20d: 0x6da19020, 0x2d20e: 0x6da19220, 0x2d20f: 0x6da19420, - 0x2d210: 0x6da19620, 0x2d211: 0x6da19820, 0x2d212: 0x6da19a20, 0x2d213: 0x6da19c20, - 0x2d214: 0x6da19e20, 0x2d215: 0x6da1a020, 0x2d216: 0x6da1a220, 0x2d217: 0x6da1a420, - 0x2d218: 0x6dc3e620, 0x2d219: 0x6dc3e820, 0x2d21a: 0x6de10620, 0x2d21b: 0x6de10820, - 0x2d21c: 0x6de10a20, 0x2d21d: 0x6de10c20, 0x2d21e: 0x6de10e20, 0x2d21f: 0x6de11020, - 0x2d220: 0x6de11220, 0x2d221: 0x6de07820, 0x2d222: 0x6de11420, 0x2d223: 0x6df93420, - 0x2d224: 0x6df93620, 0x2d225: 0x6df93820, 0x2d226: 0x6e0cfc20, 0x2d227: 0x6e288e20, - 0x2d228: 0x6e289020, 0x2d229: 0x6e31c420, 0x2d22a: 0x6e386020, 0x2d22b: 0x6c018620, - 0x2d22c: 0x6c03da20, 0x2d22d: 0x6c07c420, 0x2d22e: 0x6c0f0e20, 0x2d22f: 0x6c1b6620, - 0x2d230: 0x6c1b6820, 0x2d231: 0x6c1b6a20, 0x2d232: 0x6c1b6c20, 0x2d233: 0x6c1b6e20, - 0x2d234: 0x6c48e620, 0x2d235: 0x6c48e820, 0x2d236: 0x6c6a7020, 0x2d237: 0x6c916220, - 0x2d238: 0x6c916420, 0x2d239: 0x6cbd8820, 0x2d23a: 0x6cbd8a20, 0x2d23b: 0x6cbd8c20, - 0x2d23c: 0x6cee4e20, 0x2d23d: 0x6d1df420, 0x2d23e: 0x6d1df620, 0x2d23f: 0x6d4ba220, - // Block 0xb49, offset 0x2d240 - 0x2d240: 0x6d4ba420, 0x2d241: 0x6d790020, 0x2d242: 0x6c018820, 0x2d243: 0x6c03dc20, - 0x2d244: 0x6c07c820, 0x2d245: 0x6c0f1220, 0x2d246: 0x6c1b7420, 0x2d247: 0x6c2e8020, - 0x2d248: 0x6c48f220, 0x2d249: 0x6c48f820, 0x2d24a: 0x6c018c20, 0x2d24b: 0x6c1b7c20, - 0x2d24c: 0x6c2e8220, 0x2d24d: 0x6c48fa20, 0x2d24e: 0x6c6a8420, 0x2d24f: 0x6c6a8620, - 0x2d250: 0x6d1e0220, 0x2d251: 0x6dc43a20, 0x2d252: 0x6de14820, 0x2d253: 0x6dc43c20, - 0x2d254: 0x6e0d1e20, 0x2d255: 0x6c018e20, 0x2d256: 0x6c07d020, 0x2d257: 0x6c07d220, - 0x2d258: 0x6c07d420, 0x2d259: 0x6c0f1c20, 0x2d25a: 0x6c0f1e20, 0x2d25b: 0x6c0f2020, - 0x2d25c: 0x6c2e8e20, 0x2d25d: 0x6c2e9020, 0x2d25e: 0x6c6a8c20, 0x2d25f: 0x6c918020, - 0x2d260: 0x6c918220, 0x2d261: 0x6cbd9a20, 0x2d262: 0x6d1e1020, 0x2d263: 0x6d1e1220, - 0x2d264: 0x6d1e1420, 0x2d265: 0x6d1e1620, 0x2d266: 0x6d4bae20, 0x2d267: 0x6c019020, - 0x2d268: 0x6c019220, 0x2d269: 0x6c03de20, 0x2d26a: 0x6c03e020, 0x2d26b: 0x6c03e220, - 0x2d26c: 0x6c03e420, 0x2d26d: 0x6c03e620, 0x2d26e: 0x6c07de20, 0x2d26f: 0x6c07e020, - 0x2d270: 0x6c07e220, 0x2d271: 0x6c07e420, 0x2d272: 0x6c07e620, 0x2d273: 0x6c07e820, - 0x2d274: 0x6c07ea20, 0x2d275: 0x6c0f3220, 0x2d276: 0x6c0f3420, 0x2d277: 0x6c0f3620, - 0x2d278: 0x6c0f3820, 0x2d279: 0x6c0f3a20, 0x2d27a: 0x6c0f3c20, 0x2d27b: 0x6c0f3e20, - 0x2d27c: 0x6c0f4020, 0x2d27d: 0x6c1b8e20, 0x2d27e: 0x6c1b9020, 0x2d27f: 0x6c1b9220, - // Block 0xb4a, offset 0x2d280 - 0x2d280: 0x6c1b9420, 0x2d281: 0x6c1b9620, 0x2d282: 0x6c1b9820, 0x2d283: 0x6c2ea620, - 0x2d284: 0x6c2ea820, 0x2d285: 0x6c2eaa20, 0x2d286: 0x6c2eac20, 0x2d287: 0x6c2eae20, - 0x2d288: 0x6c2eb020, 0x2d289: 0x6c2eb220, 0x2d28a: 0x6c6aaa20, 0x2d28b: 0x6c2eb420, - 0x2d28c: 0x6c2eb620, 0x2d28d: 0x6c2eb820, 0x2d28e: 0x6c490620, 0x2d28f: 0x6c490820, - 0x2d290: 0x6c490a20, 0x2d291: 0x6c490c20, 0x2d292: 0x6c490e20, 0x2d293: 0x6c491020, - 0x2d294: 0x6c2ef220, 0x2d295: 0x6c491220, 0x2d296: 0x6c491420, 0x2d297: 0x6c6aac20, - 0x2d298: 0x6c6aae20, 0x2d299: 0x6c6ab020, 0x2d29a: 0x6c6ab220, 0x2d29b: 0x6c919e20, - 0x2d29c: 0x6c91a020, 0x2d29d: 0x6c91a220, 0x2d29e: 0x6c91a420, 0x2d29f: 0x6c91d220, - 0x2d2a0: 0x6cbdb820, 0x2d2a1: 0x6cbdba20, 0x2d2a2: 0x6c91d420, 0x2d2a3: 0x6cbdbc20, - 0x2d2a4: 0x6cbdbe20, 0x2d2a5: 0x6cbdc020, 0x2d2a6: 0x6cee7820, 0x2d2a7: 0x6cee7a20, - 0x2d2a8: 0x6cee7c20, 0x2d2a9: 0x6d1e2e20, 0x2d2aa: 0x6d1e3020, 0x2d2ab: 0x6d1e3220, - 0x2d2ac: 0x6d1e3420, 0x2d2ad: 0x6d4bb820, 0x2d2ae: 0x6d791e20, 0x2d2af: 0x6d792020, - 0x2d2b0: 0x6dc44c20, 0x2d2b1: 0x6e1c9220, 0x2d2b2: 0x6e28a420, 0x2d2b3: 0x6c019420, - 0x2d2b4: 0x6c07fe20, 0x2d2b5: 0x6c080020, 0x2d2b6: 0x6c080220, 0x2d2b7: 0x6c0f6220, - 0x2d2b8: 0x6c0f6420, 0x2d2b9: 0x6c0f6620, 0x2d2ba: 0x6c0f6820, 0x2d2bb: 0x6c0f6a20, - 0x2d2bc: 0x6c0f6c20, 0x2d2bd: 0x6c0f6e20, 0x2d2be: 0x6c0f7020, 0x2d2bf: 0x6c0f7220, - // Block 0xb4b, offset 0x2d2c0 - 0x2d2c0: 0x6c0f7420, 0x2d2c1: 0x6c0f7620, 0x2d2c2: 0x6c0f7820, 0x2d2c3: 0x6c0f7a20, - 0x2d2c4: 0x6c0f7c20, 0x2d2c5: 0x6c0f7e20, 0x2d2c6: 0x6c0f8020, 0x2d2c7: 0x6c0f8220, - 0x2d2c8: 0x6c0f8420, 0x2d2c9: 0x6c1bd420, 0x2d2ca: 0x6c1bd620, 0x2d2cb: 0x6c1bd820, - 0x2d2cc: 0x6c1bda20, 0x2d2cd: 0x6c495420, 0x2d2ce: 0x6c1bdc20, 0x2d2cf: 0x6c1bde20, - 0x2d2d0: 0x6c1be020, 0x2d2d1: 0x6c1be220, 0x2d2d2: 0x6c1be420, 0x2d2d3: 0x6c1be620, - 0x2d2d4: 0x6c1be820, 0x2d2d5: 0x6c1bea20, 0x2d2d6: 0x6c1bec20, 0x2d2d7: 0x6c1bee20, - 0x2d2d8: 0x6c1bf020, 0x2d2d9: 0x6c1bf220, 0x2d2da: 0x6c1bf420, 0x2d2db: 0x6c1bf620, - 0x2d2dc: 0x6c1bf820, 0x2d2dd: 0x6c1bfa20, 0x2d2de: 0x6c1bfc20, 0x2d2df: 0x6c1bfe20, - 0x2d2e0: 0x6c1c0020, 0x2d2e1: 0x6c1c0220, 0x2d2e2: 0x6c1c0420, 0x2d2e3: 0x6c1c0620, - 0x2d2e4: 0x6c1c0820, 0x2d2e5: 0x6c1c0a20, 0x2d2e6: 0x6c1c0c20, 0x2d2e7: 0x6c1c0e20, - 0x2d2e8: 0x6c1c1020, 0x2d2e9: 0x6c1c1220, 0x2d2ea: 0x6c1c1420, 0x2d2eb: 0x6c1c1620, - 0x2d2ec: 0x6c2f1820, 0x2d2ed: 0x6c2f1a20, 0x2d2ee: 0x6c2f1c20, 0x2d2ef: 0x6c2f1e20, - 0x2d2f0: 0x6c2f2020, 0x2d2f1: 0x6c2f2220, 0x2d2f2: 0x6c2f2420, 0x2d2f3: 0x6c2f2620, - 0x2d2f4: 0x6c2f2820, 0x2d2f5: 0x6c2f2a20, 0x2d2f6: 0x6c2f2c20, 0x2d2f7: 0x6c2f2e20, - 0x2d2f8: 0x6c2f3020, 0x2d2f9: 0x6c2f3220, 0x2d2fa: 0x6c2f3420, 0x2d2fb: 0x6c2f3620, - 0x2d2fc: 0x6c2f3820, 0x2d2fd: 0x6c2f3a20, 0x2d2fe: 0x6c2f3c20, 0x2d2ff: 0x6c2f3e20, - // Block 0xb4c, offset 0x2d300 - 0x2d300: 0x6c2f4020, 0x2d301: 0x6c2f4220, 0x2d302: 0x6c2f4420, 0x2d303: 0x6c2f4620, - 0x2d304: 0x6c2f4820, 0x2d305: 0x6c2f4a20, 0x2d306: 0x6c2f4c20, 0x2d307: 0x6c2f4e20, - 0x2d308: 0x6c2f5020, 0x2d309: 0x6c2f5220, 0x2d30a: 0x6c2f5420, 0x2d30b: 0x6c2f5620, - 0x2d30c: 0x6c2f5820, 0x2d30d: 0x6c2f5a20, 0x2d30e: 0x6c2f5c20, 0x2d30f: 0x6c2f5e20, - 0x2d310: 0x6c2f6020, 0x2d311: 0x6c2f6220, 0x2d312: 0x6c2f6420, 0x2d313: 0x6c2f6620, - 0x2d314: 0x6c2f6820, 0x2d315: 0x6c493c20, 0x2d316: 0x6c2f6a20, 0x2d317: 0x6c2f6c20, - 0x2d318: 0x6c495620, 0x2d319: 0x6c495820, 0x2d31a: 0x6c495a20, 0x2d31b: 0x6c495c20, - 0x2d31c: 0x6c495e20, 0x2d31d: 0x6c496020, 0x2d31e: 0x6c496220, 0x2d31f: 0x6c496420, - 0x2d320: 0x6c496620, 0x2d321: 0x6c496820, 0x2d322: 0x6c496a20, 0x2d323: 0x6c496c20, - 0x2d324: 0x6c496e20, 0x2d325: 0x6c497020, 0x2d326: 0x6c497220, 0x2d327: 0x6c497420, - 0x2d328: 0x6c497620, 0x2d329: 0x6c497820, 0x2d32a: 0x6c497a20, 0x2d32b: 0x6c497c20, - 0x2d32c: 0x6c6b1820, 0x2d32d: 0x6c497e20, 0x2d32e: 0x6c498020, 0x2d32f: 0x6c498220, - 0x2d330: 0x6c498420, 0x2d331: 0x6c498620, 0x2d332: 0x6c498820, 0x2d333: 0x6c498a20, - 0x2d334: 0x6c498c20, 0x2d335: 0x6c498e20, 0x2d336: 0x6c499020, 0x2d337: 0x6c499220, - 0x2d338: 0x6c499420, 0x2d339: 0x6c499620, 0x2d33a: 0x6c499820, 0x2d33b: 0x6c499a20, - 0x2d33c: 0x6c499c20, 0x2d33d: 0x6c499e20, 0x2d33e: 0x6c49a020, 0x2d33f: 0x6c49a220, - // Block 0xb4d, offset 0x2d340 - 0x2d340: 0x6c49a420, 0x2d341: 0x6c49a620, 0x2d342: 0x6c49a820, 0x2d343: 0x6c49aa20, - 0x2d344: 0x6c5c3020, 0x2d345: 0x6c49ac20, 0x2d346: 0x6c49ae20, 0x2d347: 0x6c49b020, - 0x2d348: 0x6c49b220, 0x2d349: 0x6c6b1a20, 0x2d34a: 0x6c6b1c20, 0x2d34b: 0x6c6b1e20, - 0x2d34c: 0x6c6b2020, 0x2d34d: 0x6c4a1a20, 0x2d34e: 0x6c6b2220, 0x2d34f: 0x6c6b2420, - 0x2d350: 0x6c6b2620, 0x2d351: 0x6c6b2820, 0x2d352: 0x6c6b2a20, 0x2d353: 0x6c6b2c20, - 0x2d354: 0x6c6b2e20, 0x2d355: 0x6c6b3020, 0x2d356: 0x6c6b3220, 0x2d357: 0x6c6b3420, - 0x2d358: 0x6c6b3620, 0x2d359: 0x6c6b3820, 0x2d35a: 0x6c6b3a20, 0x2d35b: 0x6c6b3c20, - 0x2d35c: 0x6c6b3e20, 0x2d35d: 0x6c6b4020, 0x2d35e: 0x6c6b4220, 0x2d35f: 0x6c6b4420, - 0x2d360: 0x6c6b4620, 0x2d361: 0x6c6b4820, 0x2d362: 0x6c6b4a20, 0x2d363: 0x6c6b4c20, - 0x2d364: 0x6c6b4e20, 0x2d365: 0x6c6b5020, 0x2d366: 0x6c6b5220, 0x2d367: 0x6c6b5420, - 0x2d368: 0x6c6b5620, 0x2d369: 0x6c6b5820, 0x2d36a: 0x6c6b5a20, 0x2d36b: 0x6c91d620, - 0x2d36c: 0x6c91ec20, 0x2d36d: 0x6c6b5c20, 0x2d36e: 0x6c6b5e20, 0x2d36f: 0x6c6b6020, - 0x2d370: 0x6c6b6220, 0x2d371: 0x6c6b6420, 0x2d372: 0x6c6b6620, 0x2d373: 0x6c6b6820, - 0x2d374: 0x6c6b6a20, 0x2d375: 0x6c91ee20, 0x2d376: 0x6c91f020, 0x2d377: 0x6c91f220, - 0x2d378: 0x6c91f420, 0x2d379: 0x6c91f620, 0x2d37a: 0x6c91f820, 0x2d37b: 0x6c91fa20, - 0x2d37c: 0x6c91fc20, 0x2d37d: 0x6c91d820, 0x2d37e: 0x6c91fe20, 0x2d37f: 0x6c920020, - // Block 0xb4e, offset 0x2d380 - 0x2d380: 0x6c920220, 0x2d381: 0x6c920420, 0x2d382: 0x6c920620, 0x2d383: 0x6c920820, - 0x2d384: 0x6c920a20, 0x2d385: 0x6c920c20, 0x2d386: 0x6c920e20, 0x2d387: 0x6c921020, - 0x2d388: 0x6c921220, 0x2d389: 0x6c921420, 0x2d38a: 0x6c921620, 0x2d38b: 0x6c921820, - 0x2d38c: 0x6c921a20, 0x2d38d: 0x6c921c20, 0x2d38e: 0x6c921e20, 0x2d38f: 0x6c922020, - 0x2d390: 0x6c922220, 0x2d391: 0x6c922420, 0x2d392: 0x6c922620, 0x2d393: 0x6c922820, - 0x2d394: 0x6c922a20, 0x2d395: 0x6c922c20, 0x2d396: 0x6c922e20, 0x2d397: 0x6c923020, - 0x2d398: 0x6c923220, 0x2d399: 0x6c923420, 0x2d39a: 0x6c923620, 0x2d39b: 0x6c923820, - 0x2d39c: 0x6c923a20, 0x2d39d: 0x6c923c20, 0x2d39e: 0x6c923e20, 0x2d39f: 0x6c924020, - 0x2d3a0: 0x6c924220, 0x2d3a1: 0x6c924420, 0x2d3a2: 0x6c924620, 0x2d3a3: 0x6c924820, - 0x2d3a4: 0x6c924a20, 0x2d3a5: 0x6c924c20, 0x2d3a6: 0x6c924e20, 0x2d3a7: 0x6c925020, - 0x2d3a8: 0x6c925220, 0x2d3a9: 0x6c925420, 0x2d3aa: 0x6c925620, 0x2d3ab: 0x6c925820, - 0x2d3ac: 0x6c925a20, 0x2d3ad: 0x6c925c20, 0x2d3ae: 0x6c925e20, 0x2d3af: 0x6c926020, - 0x2d3b0: 0x6c926220, 0x2d3b1: 0x6c926420, 0x2d3b2: 0x6c926620, 0x2d3b3: 0x6c926820, - 0x2d3b4: 0x6c926a20, 0x2d3b5: 0x6c926c20, 0x2d3b6: 0x6c926e20, 0x2d3b7: 0x6cbe2020, - 0x2d3b8: 0x6cbe2220, 0x2d3b9: 0x6cbe2420, 0x2d3ba: 0x6cbe2620, 0x2d3bb: 0x6cbe2820, - 0x2d3bc: 0x6cbe2a20, 0x2d3bd: 0x6cbe2c20, 0x2d3be: 0x6cbe2e20, 0x2d3bf: 0x6cbe3020, - // Block 0xb4f, offset 0x2d3c0 - 0x2d3c0: 0x6cbe3220, 0x2d3c1: 0x6cbe3420, 0x2d3c2: 0x6cbe3620, 0x2d3c3: 0x6cbe3820, - 0x2d3c4: 0x6cbe3a20, 0x2d3c5: 0x6cbe3c20, 0x2d3c6: 0x6cbe3e20, 0x2d3c7: 0x6cbe4020, - 0x2d3c8: 0x6cbe4220, 0x2d3c9: 0x6cbe4420, 0x2d3ca: 0x6cbe4620, 0x2d3cb: 0x6cbe4820, - 0x2d3cc: 0x6cbe4a20, 0x2d3cd: 0x6cbe4c20, 0x2d3ce: 0x6c930220, 0x2d3cf: 0x6cbe4e20, - 0x2d3d0: 0x6ceec620, 0x2d3d1: 0x6cbe5020, 0x2d3d2: 0x6cbe5220, 0x2d3d3: 0x6cbe5420, - 0x2d3d4: 0x6cbe5620, 0x2d3d5: 0x6cbe5820, 0x2d3d6: 0x6cbe5a20, 0x2d3d7: 0x6cbe5c20, - 0x2d3d8: 0x6cbe5e20, 0x2d3d9: 0x6cbe6020, 0x2d3da: 0x6cbe6220, 0x2d3db: 0x6cbe6420, - 0x2d3dc: 0x6cbe6620, 0x2d3dd: 0x6cbe6820, 0x2d3de: 0x6cbe6a20, 0x2d3df: 0x6cbe6c20, - 0x2d3e0: 0x6cbe6e20, 0x2d3e1: 0x6cbe7020, 0x2d3e2: 0x6cbe7220, 0x2d3e3: 0x6cbe7420, - 0x2d3e4: 0x6cbe7620, 0x2d3e5: 0x6cbe7820, 0x2d3e6: 0x6cbe7a20, 0x2d3e7: 0x6cbe7c20, - 0x2d3e8: 0x6cbe7e20, 0x2d3e9: 0x6cbe8020, 0x2d3ea: 0x6cbe8220, 0x2d3eb: 0x6cbe8420, - 0x2d3ec: 0x6cbe8620, 0x2d3ed: 0x6cbe8820, 0x2d3ee: 0x6cbe8a20, 0x2d3ef: 0x6cbe8c20, - 0x2d3f0: 0x6ceec820, 0x2d3f1: 0x6ceeca20, 0x2d3f2: 0x6ceecc20, 0x2d3f3: 0x6ceece20, - 0x2d3f4: 0x6ceed020, 0x2d3f5: 0x6ceed220, 0x2d3f6: 0x6ceed420, 0x2d3f7: 0x6ceed620, - 0x2d3f8: 0x6ceed820, 0x2d3f9: 0x6ceeda20, 0x2d3fa: 0x6ceedc20, 0x2d3fb: 0x6ceede20, - 0x2d3fc: 0x6ceee020, 0x2d3fd: 0x6ceee220, 0x2d3fe: 0x6ceee420, 0x2d3ff: 0x6ceee620, - // Block 0xb50, offset 0x2d400 - 0x2d400: 0x6ceee820, 0x2d401: 0x6ceeea20, 0x2d402: 0x6ceeec20, 0x2d403: 0x6ceeee20, - 0x2d404: 0x6ceef020, 0x2d405: 0x6ceef220, 0x2d406: 0x6ceef420, 0x2d407: 0x6ceef620, - 0x2d408: 0x6ceef820, 0x2d409: 0x6ceefa20, 0x2d40a: 0x6ceefc20, 0x2d40b: 0x6ceefe20, - 0x2d40c: 0x6cef0020, 0x2d40d: 0x6cef0220, 0x2d40e: 0x6cef0420, 0x2d40f: 0x6cbe8e20, - 0x2d410: 0x6cef0620, 0x2d411: 0x6cef0820, 0x2d412: 0x6cef0a20, 0x2d413: 0x6cef0c20, - 0x2d414: 0x6cef0e20, 0x2d415: 0x6d1e6e20, 0x2d416: 0x6d1e7020, 0x2d417: 0x6d1e7220, - 0x2d418: 0x6d1e7420, 0x2d419: 0x6d1e7620, 0x2d41a: 0x6d1e7820, 0x2d41b: 0x6d1e7a20, - 0x2d41c: 0x6d1e7c20, 0x2d41d: 0x6d1e7e20, 0x2d41e: 0x6d1e8020, 0x2d41f: 0x6d1e8220, - 0x2d420: 0x6d1e8420, 0x2d421: 0x6d1e8620, 0x2d422: 0x6d1e8820, 0x2d423: 0x6d1e8a20, - 0x2d424: 0x6d1e8c20, 0x2d425: 0x6d1e8e20, 0x2d426: 0x6d1e9020, 0x2d427: 0x6d1e9220, - 0x2d428: 0x6d1e9420, 0x2d429: 0x6d1e9620, 0x2d42a: 0x6d1e9820, 0x2d42b: 0x6d1e9a20, - 0x2d42c: 0x6d1e9c20, 0x2d42d: 0x6d1e9e20, 0x2d42e: 0x6d1ea020, 0x2d42f: 0x6d1ea220, - 0x2d430: 0x6d1ea420, 0x2d431: 0x6d1ea620, 0x2d432: 0x6d1ea820, 0x2d433: 0x6d1f2820, - 0x2d434: 0x6d4bea20, 0x2d435: 0x6d4bec20, 0x2d436: 0x6d4bee20, 0x2d437: 0x6d4bf020, - 0x2d438: 0x6d4bf220, 0x2d439: 0x6d4bf420, 0x2d43a: 0x6d4bf620, 0x2d43b: 0x6d4bf820, - 0x2d43c: 0x6d4bfa20, 0x2d43d: 0x6d4bfc20, 0x2d43e: 0x6d4bfe20, 0x2d43f: 0x6d4c0020, - // Block 0xb51, offset 0x2d440 - 0x2d440: 0x6d4c0220, 0x2d441: 0x6d4c0420, 0x2d442: 0x6d4c0620, 0x2d443: 0x6d4c0820, - 0x2d444: 0x6d4c0a20, 0x2d445: 0x6d4c0c20, 0x2d446: 0x6d4c0e20, 0x2d447: 0x6d4c1020, - 0x2d448: 0x6d4c1220, 0x2d449: 0x6d4c1420, 0x2d44a: 0x6d4c1620, 0x2d44b: 0x6d4c1820, - 0x2d44c: 0x6d4c1a20, 0x2d44d: 0x6d4c1c20, 0x2d44e: 0x6d4c1e20, 0x2d44f: 0x6d4c2020, - 0x2d450: 0x6d794220, 0x2d451: 0x6d794420, 0x2d452: 0x6d794620, 0x2d453: 0x6d794820, - 0x2d454: 0x6d794a20, 0x2d455: 0x6d794c20, 0x2d456: 0x6d794e20, 0x2d457: 0x6d795020, - 0x2d458: 0x6d795220, 0x2d459: 0x6d795420, 0x2d45a: 0x6d795620, 0x2d45b: 0x6d795820, - 0x2d45c: 0x6d795a20, 0x2d45d: 0x6d795c20, 0x2d45e: 0x6d795e20, 0x2d45f: 0x6d796020, - 0x2d460: 0x6d796220, 0x2d461: 0x6d796420, 0x2d462: 0x6d796620, 0x2d463: 0x6da22620, - 0x2d464: 0x6da22820, 0x2d465: 0x6da22a20, 0x2d466: 0x6da22c20, 0x2d467: 0x6da22e20, - 0x2d468: 0x6d79de20, 0x2d469: 0x6da23020, 0x2d46a: 0x6da23220, 0x2d46b: 0x6da23420, - 0x2d46c: 0x6da23620, 0x2d46d: 0x6da23820, 0x2d46e: 0x6da23a20, 0x2d46f: 0x6da23c20, - 0x2d470: 0x6da23e20, 0x2d471: 0x6da24020, 0x2d472: 0x6da24220, 0x2d473: 0x6da24420, - 0x2d474: 0x6d796820, 0x2d475: 0x6da24620, 0x2d476: 0x6da24820, 0x2d477: 0x6da24a20, - 0x2d478: 0x6dc45820, 0x2d479: 0x6de16220, 0x2d47a: 0x6dc45a20, 0x2d47b: 0x6dc45c20, - 0x2d47c: 0x6dc45e20, 0x2d47d: 0x6de15820, 0x2d47e: 0x6de16420, 0x2d47f: 0x6de16620, - // Block 0xb52, offset 0x2d480 - 0x2d480: 0x6df96220, 0x2d481: 0x6df96420, 0x2d482: 0x6df96620, 0x2d483: 0x6df96820, - 0x2d484: 0x6df96a20, 0x2d485: 0x6df96c20, 0x2d486: 0x6df96e20, 0x2d487: 0x6e0d2a20, - 0x2d488: 0x6e0d2c20, 0x2d489: 0x6e0d2e20, 0x2d48a: 0x6e1c9a20, 0x2d48b: 0x6e1c9c20, - 0x2d48c: 0x6e1c9e20, 0x2d48d: 0x6e28a620, 0x2d48e: 0x6e31d820, 0x2d48f: 0x6e31da20, - 0x2d490: 0x6c019620, 0x2d491: 0x6c019820, 0x2d492: 0x6c019a20, 0x2d493: 0x6c019c20, - 0x2d494: 0x6c03f220, 0x2d495: 0x6c081220, 0x2d496: 0x6c0fa820, 0x2d497: 0x6c0faa20, - 0x2d498: 0x6c0fac20, 0x2d499: 0x6c0fae20, 0x2d49a: 0x6c1c6620, 0x2d49b: 0x6c1c6820, - 0x2d49c: 0x6c1c6a20, 0x2d49d: 0x6c1c6c20, 0x2d49e: 0x6c1c6e20, 0x2d49f: 0x6c2fca20, - 0x2d4a0: 0x6c2fcc20, 0x2d4a1: 0x6c2fce20, 0x2d4a2: 0x6c2fd020, 0x2d4a3: 0x6c2fd220, - 0x2d4a4: 0x6c2fd420, 0x2d4a5: 0x6c2fd620, 0x2d4a6: 0x6c2fd820, 0x2d4a7: 0x6c2fda20, - 0x2d4a8: 0x6c4a1e20, 0x2d4a9: 0x6c4a2020, 0x2d4aa: 0x6c4a2220, 0x2d4ab: 0x6c6be020, - 0x2d4ac: 0x6c6be220, 0x2d4ad: 0x6c6be420, 0x2d4ae: 0x6c930420, 0x2d4af: 0x6c930620, - 0x2d4b0: 0x6c930820, 0x2d4b1: 0x6cbf4420, 0x2d4b2: 0x6c930a20, 0x2d4b3: 0x6cbf6220, - 0x2d4b4: 0x6cef7a20, 0x2d4b5: 0x6d1f2a20, 0x2d4b6: 0x6cef9820, 0x2d4b7: 0x6d1f2c20, - 0x2d4b8: 0x6d79e220, 0x2d4b9: 0x6d79e420, 0x2d4ba: 0x6da29620, 0x2d4bb: 0x6da29820, - 0x2d4bc: 0x6de19020, 0x2d4bd: 0x6df98620, 0x2d4be: 0x6df98820, 0x2d4bf: 0x6e1cb420, - // Block 0xb53, offset 0x2d4c0 - 0x2d4c0: 0x6c01a020, 0x2d4c1: 0x6c082220, 0x2d4c2: 0x6c082420, 0x2d4c3: 0x6c082620, - 0x2d4c4: 0x6c082820, 0x2d4c5: 0x6c0fbc20, 0x2d4c6: 0x6c0fbe20, 0x2d4c7: 0x6c0fc020, - 0x2d4c8: 0x6c0fc220, 0x2d4c9: 0x6c0fc420, 0x2d4ca: 0x6c1c8e20, 0x2d4cb: 0x6c1c9020, - 0x2d4cc: 0x6c1c9220, 0x2d4cd: 0x6c1c9420, 0x2d4ce: 0x6c1c9620, 0x2d4cf: 0x6c1c9820, - 0x2d4d0: 0x6c1c9a20, 0x2d4d1: 0x6c1c9c20, 0x2d4d2: 0x6c1c9e20, 0x2d4d3: 0x6c2ffc20, - 0x2d4d4: 0x6c2ffe20, 0x2d4d5: 0x6c300020, 0x2d4d6: 0x6c300220, 0x2d4d7: 0x6c300420, - 0x2d4d8: 0x6c300620, 0x2d4d9: 0x6c300820, 0x2d4da: 0x6c300a20, 0x2d4db: 0x6c300c20, - 0x2d4dc: 0x6c300e20, 0x2d4dd: 0x6c301020, 0x2d4de: 0x6c301220, 0x2d4df: 0x6c301420, - 0x2d4e0: 0x6c301620, 0x2d4e1: 0x6c301820, 0x2d4e2: 0x6c4a4820, 0x2d4e3: 0x6c4a4a20, - 0x2d4e4: 0x6c4a4c20, 0x2d4e5: 0x6c4a4e20, 0x2d4e6: 0x6c4a5020, 0x2d4e7: 0x6c6bfe20, - 0x2d4e8: 0x6c4a5220, 0x2d4e9: 0x6c4a5420, 0x2d4ea: 0x6c4a5620, 0x2d4eb: 0x6c4a5820, - 0x2d4ec: 0x6c6c0020, 0x2d4ed: 0x6c6c0220, 0x2d4ee: 0x6c6c0420, 0x2d4ef: 0x6c6c0620, - 0x2d4f0: 0x6c6c0820, 0x2d4f1: 0x6c6c0a20, 0x2d4f2: 0x6c6c0c20, 0x2d4f3: 0x6c6c0e20, - 0x2d4f4: 0x6c6c1020, 0x2d4f5: 0x6c6c1220, 0x2d4f6: 0x6c6c1420, 0x2d4f7: 0x6c6c1620, - 0x2d4f8: 0x6c6c1820, 0x2d4f9: 0x6c6c1a20, 0x2d4fa: 0x6c6c1c20, 0x2d4fb: 0x6c6c1e20, - 0x2d4fc: 0x6c6c2020, 0x2d4fd: 0x6c6c2220, 0x2d4fe: 0x6c6c2420, 0x2d4ff: 0x6c933020, - // Block 0xb54, offset 0x2d500 - 0x2d500: 0x6c933220, 0x2d501: 0x6c933420, 0x2d502: 0x6c933620, 0x2d503: 0x6c933820, - 0x2d504: 0x6c933a20, 0x2d505: 0x6c933c20, 0x2d506: 0x6c933e20, 0x2d507: 0x6c934020, - 0x2d508: 0x6c934220, 0x2d509: 0x6c934420, 0x2d50a: 0x6cbf6820, 0x2d50b: 0x6cbf6a20, - 0x2d50c: 0x6cbf6c20, 0x2d50d: 0x6cbf6e20, 0x2d50e: 0x6cbf7020, 0x2d50f: 0x6cbf7220, - 0x2d510: 0x6cbf7420, 0x2d511: 0x6cbf7620, 0x2d512: 0x6cbf7820, 0x2d513: 0x6cbf7a20, - 0x2d514: 0x6cbf7c20, 0x2d515: 0x6cbf7e20, 0x2d516: 0x6cefa420, 0x2d517: 0x6cefa620, - 0x2d518: 0x6cefa820, 0x2d519: 0x6cefaa20, 0x2d51a: 0x6cefac20, 0x2d51b: 0x6cefae20, - 0x2d51c: 0x6cefb020, 0x2d51d: 0x6cefb220, 0x2d51e: 0x6d1f4420, 0x2d51f: 0x6d1f4620, - 0x2d520: 0x6d1f4820, 0x2d521: 0x6d1f4a20, 0x2d522: 0x6d1f4c20, 0x2d523: 0x6d1f4e20, - 0x2d524: 0x6d1f5020, 0x2d525: 0x6d1f5220, 0x2d526: 0x6d1f5420, 0x2d527: 0x6d1f5620, - 0x2d528: 0x6d1f5820, 0x2d529: 0x6d4cce20, 0x2d52a: 0x6cbf8020, 0x2d52b: 0x6d4cd020, - 0x2d52c: 0x6d4cd220, 0x2d52d: 0x6d4cd420, 0x2d52e: 0x6d4cd620, 0x2d52f: 0x6d79fe20, - 0x2d530: 0x6d7a0020, 0x2d531: 0x6da2a020, 0x2d532: 0x6da2a220, 0x2d533: 0x6de19a20, - 0x2d534: 0x6de19c20, 0x2d535: 0x6de19e20, 0x2d536: 0x6df99620, 0x2d537: 0x6e0d4820, - 0x2d538: 0x6c01a220, 0x2d539: 0x6c083220, 0x2d53a: 0x6c0fe220, 0x2d53b: 0x6c0fe420, - 0x2d53c: 0x6c0fe620, 0x2d53d: 0x6c1cbe20, 0x2d53e: 0x6c1cc020, 0x2d53f: 0x6c1cc220, - // Block 0xb55, offset 0x2d540 - 0x2d540: 0x6c304620, 0x2d541: 0x6c4a8e20, 0x2d542: 0x6c4a9020, 0x2d543: 0x6c6c7420, - 0x2d544: 0x6c6c7620, 0x2d545: 0x6c6c7820, 0x2d546: 0x6c4a9220, 0x2d547: 0x6c938220, - 0x2d548: 0x6c938420, 0x2d549: 0x6c938620, 0x2d54a: 0x6cbfd620, 0x2d54b: 0x6cbfd820, - 0x2d54c: 0x6cbfda20, 0x2d54d: 0x6d1fac20, 0x2d54e: 0x6d4d2220, 0x2d54f: 0x6c01a820, - 0x2d550: 0x6c03fc20, 0x2d551: 0x6c03fe20, 0x2d552: 0x6c083420, 0x2d553: 0x6c083620, - 0x2d554: 0x6c083820, 0x2d555: 0x6c083a20, 0x2d556: 0x6c0fec20, 0x2d557: 0x6c0fee20, - 0x2d558: 0x6c0ff020, 0x2d559: 0x6c305820, 0x2d55a: 0x6c305a20, 0x2d55b: 0x6c4aa020, - 0x2d55c: 0x6c4aa220, 0x2d55d: 0x6c4aa420, 0x2d55e: 0x6cbfec20, 0x2d55f: 0x6cf00020, - 0x2d560: 0x6cf00220, 0x2d561: 0x6d1fbc20, 0x2d562: 0x6c01ac20, 0x2d563: 0x6c040420, - 0x2d564: 0x6c040620, 0x2d565: 0x6c0ffc20, 0x2d566: 0x6c0ffe20, 0x2d567: 0x6c100020, - 0x2d568: 0x6c1cd820, 0x2d569: 0x6c1cda20, 0x2d56a: 0x6c1cdc20, 0x2d56b: 0x6c1cde20, - 0x2d56c: 0x6c1ce020, 0x2d56d: 0x6c306e20, 0x2d56e: 0x6c4abe20, 0x2d56f: 0x6c4ac020, - 0x2d570: 0x6cc00620, 0x2d571: 0x6cc00820, 0x2d572: 0x6cf01620, 0x2d573: 0x6cf01820, - 0x2d574: 0x6cf01a20, 0x2d575: 0x6d4d5020, 0x2d576: 0x6da2d220, 0x2d577: 0x6da2d420, - 0x2d578: 0x6c01b220, 0x2d579: 0x6c024c20, 0x2d57a: 0x6c040a20, 0x2d57b: 0x6c085220, - 0x2d57c: 0x6c085420, 0x2d57d: 0x6c100e20, 0x2d57e: 0x6c1cfa20, 0x2d57f: 0x6c1cfc20, - // Block 0xb56, offset 0x2d580 - 0x2d580: 0x6c1cfe20, 0x2d581: 0x6c1d0020, 0x2d582: 0x6c1d0220, 0x2d583: 0x6c1d0420, - 0x2d584: 0x6c308620, 0x2d585: 0x6c308820, 0x2d586: 0x6c308a20, 0x2d587: 0x6c308c20, - 0x2d588: 0x6c308e20, 0x2d589: 0x6c309020, 0x2d58a: 0x6c309220, 0x2d58b: 0x6c4ad620, - 0x2d58c: 0x6c4ad820, 0x2d58d: 0x6c4ada20, 0x2d58e: 0x6c4adc20, 0x2d58f: 0x6c4ade20, - 0x2d590: 0x6c6cae20, 0x2d591: 0x6c6cb020, 0x2d592: 0x6c6cb220, 0x2d593: 0x6c6cb420, - 0x2d594: 0x6c6cb620, 0x2d595: 0x6c6cb820, 0x2d596: 0x6c6cba20, 0x2d597: 0x6c6cbc20, - 0x2d598: 0x6c6cbe20, 0x2d599: 0x6c93d020, 0x2d59a: 0x6c93d220, 0x2d59b: 0x6c93d420, - 0x2d59c: 0x6c93d620, 0x2d59d: 0x6c93d820, 0x2d59e: 0x6cc02420, 0x2d59f: 0x6cc02620, - 0x2d5a0: 0x6c941020, 0x2d5a1: 0x6cc02820, 0x2d5a2: 0x6d1fe020, 0x2d5a3: 0x6d1fe220, - 0x2d5a4: 0x6d4d6220, 0x2d5a5: 0x6d4d6420, 0x2d5a6: 0x6d4d6620, 0x2d5a7: 0x6d4d6820, - 0x2d5a8: 0x6da2da20, 0x2d5a9: 0x6dc4c620, 0x2d5aa: 0x6dc4c820, 0x2d5ab: 0x6de1c020, - 0x2d5ac: 0x6e0d6420, 0x2d5ad: 0x6e31f020, 0x2d5ae: 0x6c01b620, 0x2d5af: 0x6c040e20, - 0x2d5b0: 0x6c102820, 0x2d5b1: 0x6c01ba20, 0x2d5b2: 0x6c041220, 0x2d5b3: 0x6c086c20, - 0x2d5b4: 0x6c086e20, 0x2d5b5: 0x6c087020, 0x2d5b6: 0x6c087220, 0x2d5b7: 0x6c087420, - 0x2d5b8: 0x6c104620, 0x2d5b9: 0x6c104820, 0x2d5ba: 0x6c104a20, 0x2d5bb: 0x6c104c20, - 0x2d5bc: 0x6c104e20, 0x2d5bd: 0x6c105020, 0x2d5be: 0x6c105220, 0x2d5bf: 0x6c105420, - // Block 0xb57, offset 0x2d5c0 - 0x2d5c0: 0x6c105620, 0x2d5c1: 0x6c105820, 0x2d5c2: 0x6c105a20, 0x2d5c3: 0x6c105c20, - 0x2d5c4: 0x6c1d3c20, 0x2d5c5: 0x6c1d3e20, 0x2d5c6: 0x6c1d4020, 0x2d5c7: 0x6c1d4220, - 0x2d5c8: 0x6c1d4420, 0x2d5c9: 0x6c1d4620, 0x2d5ca: 0x6c1d4820, 0x2d5cb: 0x6c1d4a20, - 0x2d5cc: 0x6c1d4c20, 0x2d5cd: 0x6c1dd220, 0x2d5ce: 0x6c1d4e20, 0x2d5cf: 0x6c1d5020, - 0x2d5d0: 0x6c1d5220, 0x2d5d1: 0x6c1d5420, 0x2d5d2: 0x6c1d5620, 0x2d5d3: 0x6c1d5820, - 0x2d5d4: 0x6c1d5a20, 0x2d5d5: 0x6c1d5c20, 0x2d5d6: 0x6c1d5e20, 0x2d5d7: 0x6c1d6020, - 0x2d5d8: 0x6c1d6220, 0x2d5d9: 0x6c1d6420, 0x2d5da: 0x6c1d6620, 0x2d5db: 0x6c1d6820, - 0x2d5dc: 0x6c1d6a20, 0x2d5dd: 0x6c30ce20, 0x2d5de: 0x6c30d020, 0x2d5df: 0x6c30d220, - 0x2d5e0: 0x6c30d420, 0x2d5e1: 0x6c30d620, 0x2d5e2: 0x6c30d820, 0x2d5e3: 0x6c30da20, - 0x2d5e4: 0x6c30dc20, 0x2d5e5: 0x6c30de20, 0x2d5e6: 0x6c30e020, 0x2d5e7: 0x6c30e220, - 0x2d5e8: 0x6c30e420, 0x2d5e9: 0x6c30e620, 0x2d5ea: 0x6c30e820, 0x2d5eb: 0x6c30ea20, - 0x2d5ec: 0x6c30ec20, 0x2d5ed: 0x6c30ee20, 0x2d5ee: 0x6c30f020, 0x2d5ef: 0x6c30f220, - 0x2d5f0: 0x6c30f420, 0x2d5f1: 0x6c30f620, 0x2d5f2: 0x6c30f820, 0x2d5f3: 0x6c30fa20, - 0x2d5f4: 0x6c30fc20, 0x2d5f5: 0x6c30fe20, 0x2d5f6: 0x6c310020, 0x2d5f7: 0x6c310220, - 0x2d5f8: 0x6c310420, 0x2d5f9: 0x6c310620, 0x2d5fa: 0x6c310820, 0x2d5fb: 0x6c310a20, - 0x2d5fc: 0x6c310c20, 0x2d5fd: 0x6c310e20, 0x2d5fe: 0x6c311020, 0x2d5ff: 0x6c311220, - // Block 0xb58, offset 0x2d600 - 0x2d600: 0x6c311420, 0x2d601: 0x6c311620, 0x2d602: 0x6c311820, 0x2d603: 0x6c311a20, - 0x2d604: 0x6c311c20, 0x2d605: 0x6c311e20, 0x2d606: 0x6c4b2620, 0x2d607: 0x6c4b2820, - 0x2d608: 0x6c4b2a20, 0x2d609: 0x6c4b2c20, 0x2d60a: 0x6c4b2e20, 0x2d60b: 0x6c4b3020, - 0x2d60c: 0x6c4b3220, 0x2d60d: 0x6c4b3420, 0x2d60e: 0x6c4b3620, 0x2d60f: 0x6c4b3820, - 0x2d610: 0x6c4b3a20, 0x2d611: 0x6c4b3c20, 0x2d612: 0x6c4b3e20, 0x2d613: 0x6c4b4020, - 0x2d614: 0x6c4b4220, 0x2d615: 0x6c4b4420, 0x2d616: 0x6c4b4620, 0x2d617: 0x6c4b4820, - 0x2d618: 0x6c4b4a20, 0x2d619: 0x6c4b4c20, 0x2d61a: 0x6c4b4e20, 0x2d61b: 0x6c4b5020, - 0x2d61c: 0x6c4b5220, 0x2d61d: 0x6c4b5420, 0x2d61e: 0x6c4b5620, 0x2d61f: 0x6c4b5820, - 0x2d620: 0x6c4b5a20, 0x2d621: 0x6c4b5c20, 0x2d622: 0x6c4b5e20, 0x2d623: 0x6c4b6020, - 0x2d624: 0x6c4b6220, 0x2d625: 0x6c4b6420, 0x2d626: 0x6c4b6620, 0x2d627: 0x6c4b6820, - 0x2d628: 0x6c6d2020, 0x2d629: 0x6c6d2220, 0x2d62a: 0x6c6d2420, 0x2d62b: 0x6c6d2620, - 0x2d62c: 0x6c6d2820, 0x2d62d: 0x6c6d2a20, 0x2d62e: 0x6c6d2c20, 0x2d62f: 0x6c6d2e20, - 0x2d630: 0x6c6d3020, 0x2d631: 0x6c6d3220, 0x2d632: 0x6c6d3420, 0x2d633: 0x6c6d3620, - 0x2d634: 0x6c6d3820, 0x2d635: 0x6c6d3a20, 0x2d636: 0x6c6d3c20, 0x2d637: 0x6c6d3e20, - 0x2d638: 0x6c4bcc20, 0x2d639: 0x6c6d4020, 0x2d63a: 0x6c6d4220, 0x2d63b: 0x6c6d4420, - 0x2d63c: 0x6c6d4620, 0x2d63d: 0x6c6d4820, 0x2d63e: 0x6c6d4a20, 0x2d63f: 0x6c6d4c20, - // Block 0xb59, offset 0x2d640 - 0x2d640: 0x6c6d4e20, 0x2d641: 0x6c6d5020, 0x2d642: 0x6c6d5220, 0x2d643: 0x6c6d5420, - 0x2d644: 0x6c6d5620, 0x2d645: 0x6c6d5820, 0x2d646: 0x6c943420, 0x2d647: 0x6c943620, - 0x2d648: 0x6c943820, 0x2d649: 0x6c943a20, 0x2d64a: 0x6c943c20, 0x2d64b: 0x6c943e20, - 0x2d64c: 0x6c944020, 0x2d64d: 0x6c944220, 0x2d64e: 0x6c944420, 0x2d64f: 0x6c944620, - 0x2d650: 0x6c944820, 0x2d651: 0x6c944a20, 0x2d652: 0x6c944c20, 0x2d653: 0x6c944e20, - 0x2d654: 0x6c945020, 0x2d655: 0x6c945220, 0x2d656: 0x6c945420, 0x2d657: 0x6c945620, - 0x2d658: 0x6c945820, 0x2d659: 0x6c945a20, 0x2d65a: 0x6c945c20, 0x2d65b: 0x6c945e20, - 0x2d65c: 0x6c946020, 0x2d65d: 0x6c946220, 0x2d65e: 0x6c946420, 0x2d65f: 0x6c946620, - 0x2d660: 0x6c946820, 0x2d661: 0x6c946a20, 0x2d662: 0x6c946c20, 0x2d663: 0x6c946e20, - 0x2d664: 0x6c947020, 0x2d665: 0x6c947220, 0x2d666: 0x6c947420, 0x2d667: 0x6c947620, - 0x2d668: 0x6c947820, 0x2d669: 0x6c947a20, 0x2d66a: 0x6c947c20, 0x2d66b: 0x6c947e20, - 0x2d66c: 0x6c948020, 0x2d66d: 0x6c948220, 0x2d66e: 0x6c948420, 0x2d66f: 0x6c948620, - 0x2d670: 0x6c948820, 0x2d671: 0x6cc08420, 0x2d672: 0x6cc08620, 0x2d673: 0x6cc08820, - 0x2d674: 0x6cc08a20, 0x2d675: 0x6cc08c20, 0x2d676: 0x6cc08e20, 0x2d677: 0x6cc09020, - 0x2d678: 0x6cc09220, 0x2d679: 0x6cc09420, 0x2d67a: 0x6cc09620, 0x2d67b: 0x6cc09820, - 0x2d67c: 0x6cc09a20, 0x2d67d: 0x6cc09c20, 0x2d67e: 0x6cc09e20, 0x2d67f: 0x6cc0a020, - // Block 0xb5a, offset 0x2d680 - 0x2d680: 0x6cc0a220, 0x2d681: 0x6cc0a420, 0x2d682: 0x6cc0a620, 0x2d683: 0x6cc0a820, - 0x2d684: 0x6cc0aa20, 0x2d685: 0x6cc0ac20, 0x2d686: 0x6cc0ae20, 0x2d687: 0x6cc0b020, - 0x2d688: 0x6cc0b220, 0x2d689: 0x6cc0b420, 0x2d68a: 0x6cf07a20, 0x2d68b: 0x6cc0b620, - 0x2d68c: 0x6cc0b820, 0x2d68d: 0x6cc0ba20, 0x2d68e: 0x6cc0bc20, 0x2d68f: 0x6cc0be20, - 0x2d690: 0x6cc0c020, 0x2d691: 0x6cc0c220, 0x2d692: 0x6cc0c420, 0x2d693: 0x6cc0c620, - 0x2d694: 0x6cc0c820, 0x2d695: 0x6cc0ca20, 0x2d696: 0x6cc0cc20, 0x2d697: 0x6cc0ce20, - 0x2d698: 0x6cc0d020, 0x2d699: 0x6cc0d220, 0x2d69a: 0x6cc0d420, 0x2d69b: 0x6cc0d620, - 0x2d69c: 0x6cc0d820, 0x2d69d: 0x6cc0da20, 0x2d69e: 0x6cf07c20, 0x2d69f: 0x6cf07e20, - 0x2d6a0: 0x6cf08020, 0x2d6a1: 0x6cf08220, 0x2d6a2: 0x6cf08420, 0x2d6a3: 0x6cf08620, - 0x2d6a4: 0x6cf08820, 0x2d6a5: 0x6cf08a20, 0x2d6a6: 0x6cf08c20, 0x2d6a7: 0x6cf08e20, - 0x2d6a8: 0x6cf09020, 0x2d6a9: 0x6cf09220, 0x2d6aa: 0x6cf09420, 0x2d6ab: 0x6cc16a20, - 0x2d6ac: 0x6cf09620, 0x2d6ad: 0x6cf09820, 0x2d6ae: 0x6cf09a20, 0x2d6af: 0x6cf09c20, - 0x2d6b0: 0x6cf09e20, 0x2d6b1: 0x6cf0a020, 0x2d6b2: 0x6cf0a220, 0x2d6b3: 0x6cf0a420, - 0x2d6b4: 0x6cf0a620, 0x2d6b5: 0x6cf0a820, 0x2d6b6: 0x6cf0aa20, 0x2d6b7: 0x6d201820, - 0x2d6b8: 0x6d201a20, 0x2d6b9: 0x6d201c20, 0x2d6ba: 0x6d201e20, 0x2d6bb: 0x6d202020, - 0x2d6bc: 0x6d202220, 0x2d6bd: 0x6d202420, 0x2d6be: 0x6d202620, 0x2d6bf: 0x6d202820, - // Block 0xb5b, offset 0x2d6c0 - 0x2d6c0: 0x6d202a20, 0x2d6c1: 0x6d202c20, 0x2d6c2: 0x6d202e20, 0x2d6c3: 0x6d203020, - 0x2d6c4: 0x6d203220, 0x2d6c5: 0x6d203420, 0x2d6c6: 0x6d203620, 0x2d6c7: 0x6d203820, - 0x2d6c8: 0x6d203a20, 0x2d6c9: 0x6d203c20, 0x2d6ca: 0x6d203e20, 0x2d6cb: 0x6d204020, - 0x2d6cc: 0x6d204220, 0x2d6cd: 0x6d204420, 0x2d6ce: 0x6d204620, 0x2d6cf: 0x6d4dac20, - 0x2d6d0: 0x6d4dae20, 0x2d6d1: 0x6d4db020, 0x2d6d2: 0x6d4db220, 0x2d6d3: 0x6d4db420, - 0x2d6d4: 0x6d4db620, 0x2d6d5: 0x6d4db820, 0x2d6d6: 0x6d4dba20, 0x2d6d7: 0x6d4dbc20, - 0x2d6d8: 0x6d4dbe20, 0x2d6d9: 0x6d4dc020, 0x2d6da: 0x6d4dc220, 0x2d6db: 0x6d4dc420, - 0x2d6dc: 0x6d4dc620, 0x2d6dd: 0x6d4dc820, 0x2d6de: 0x6d4dca20, 0x2d6df: 0x6d4dcc20, - 0x2d6e0: 0x6d4dce20, 0x2d6e1: 0x6d4dd020, 0x2d6e2: 0x6d4dd220, 0x2d6e3: 0x6d4dd420, - 0x2d6e4: 0x6d4dd620, 0x2d6e5: 0x6d4dd820, 0x2d6e6: 0x6d7a6e20, 0x2d6e7: 0x6d7a7020, - 0x2d6e8: 0x6d7a7220, 0x2d6e9: 0x6d7a7420, 0x2d6ea: 0x6d7a7620, 0x2d6eb: 0x6d7a7820, - 0x2d6ec: 0x6d7a7a20, 0x2d6ed: 0x6d7a7c20, 0x2d6ee: 0x6d7a7e20, 0x2d6ef: 0x6d7a8020, - 0x2d6f0: 0x6d7a8220, 0x2d6f1: 0x6d7a8420, 0x2d6f2: 0x6d7a8620, 0x2d6f3: 0x6d7a8820, - 0x2d6f4: 0x6d7a8a20, 0x2d6f5: 0x6d7a8c20, 0x2d6f6: 0x6d7a8e20, 0x2d6f7: 0x6da2ec20, - 0x2d6f8: 0x6da2ee20, 0x2d6f9: 0x6da2f020, 0x2d6fa: 0x6da2f220, 0x2d6fb: 0x6da35220, - 0x2d6fc: 0x6da2f420, 0x2d6fd: 0x6da2f620, 0x2d6fe: 0x6da2f820, 0x2d6ff: 0x6da2fa20, - // Block 0xb5c, offset 0x2d700 - 0x2d700: 0x6dc4d620, 0x2d701: 0x6dc4d820, 0x2d702: 0x6dc4da20, 0x2d703: 0x6de1d820, - 0x2d704: 0x6de1da20, 0x2d705: 0x6de1dc20, 0x2d706: 0x6df9b220, 0x2d707: 0x6df9b420, - 0x2d708: 0x6df9b620, 0x2d709: 0x6df9b820, 0x2d70a: 0x6df9ba20, 0x2d70b: 0x6e0d6e20, - 0x2d70c: 0x6df9bc20, 0x2d70d: 0x6e0d7420, 0x2d70e: 0x6e1cd820, 0x2d70f: 0x6e0d7620, - 0x2d710: 0x6e0d7820, 0x2d711: 0x6e1cda20, 0x2d712: 0x6e1cdc20, 0x2d713: 0x6e1cde20, - 0x2d714: 0x6e1ce020, 0x2d715: 0x6e1ce220, 0x2d716: 0x6e28b220, 0x2d717: 0x6e1ce420, - 0x2d718: 0x6e28b420, 0x2d719: 0x6e31f420, 0x2d71a: 0x6e28b620, 0x2d71b: 0x6c01bc20, - 0x2d71c: 0x6c00c620, 0x2d71d: 0x6c01be20, 0x2d71e: 0x6c109420, 0x2d71f: 0x6c109620, - 0x2d720: 0x6c1dd420, 0x2d721: 0x6c272c20, 0x2d722: 0x6c954a20, 0x2d723: 0x6c954c20, - 0x2d724: 0x6d4e4820, 0x2d725: 0x6c01c420, 0x2d726: 0x6c089220, 0x2d727: 0x6c089420, - 0x2d728: 0x6c089620, 0x2d729: 0x6c10a220, 0x2d72a: 0x6c10a420, 0x2d72b: 0x6c1dde20, - 0x2d72c: 0x6c4bda20, 0x2d72d: 0x6c4bdc20, 0x2d72e: 0x6c6dec20, 0x2d72f: 0x6cc17020, - 0x2d730: 0x6cf11020, 0x2d731: 0x6c01c620, 0x2d732: 0x6c01c820, 0x2d733: 0x6c01ca20, - 0x2d734: 0x6c042820, 0x2d735: 0x6c1de620, 0x2d736: 0x6c318a20, 0x2d737: 0x6c4be020, - 0x2d738: 0x6c4be220, 0x2d739: 0x6c4be420, 0x2d73a: 0x6c4be620, 0x2d73b: 0x6c4be820, - 0x2d73c: 0x6c6df220, 0x2d73d: 0x6cc17820, 0x2d73e: 0x6c01cc20, 0x2d73f: 0x6c042c20, - // Block 0xb5d, offset 0x2d740 - 0x2d740: 0x6c042e20, 0x2d741: 0x6c043020, 0x2d742: 0x6c08aa20, 0x2d743: 0x6c08ac20, - 0x2d744: 0x6c08ae20, 0x2d745: 0x6c08b020, 0x2d746: 0x6c10b420, 0x2d747: 0x6c10b620, - 0x2d748: 0x6c10b820, 0x2d749: 0x6c1df620, 0x2d74a: 0x6c1df820, 0x2d74b: 0x6c1dfa20, - 0x2d74c: 0x6c1dfc20, 0x2d74d: 0x6c1dfe20, 0x2d74e: 0x6c1e0020, 0x2d74f: 0x6c1e0220, - 0x2d750: 0x6c1e0420, 0x2d751: 0x6c319a20, 0x2d752: 0x6c319c20, 0x2d753: 0x6c319e20, - 0x2d754: 0x6c31a020, 0x2d755: 0x6c31a220, 0x2d756: 0x6c31a420, 0x2d757: 0x6c31a620, - 0x2d758: 0x6c31a820, 0x2d759: 0x6c31aa20, 0x2d75a: 0x6c31ac20, 0x2d75b: 0x6c31ae20, - 0x2d75c: 0x6c31b020, 0x2d75d: 0x6c4bfc20, 0x2d75e: 0x6c4bfe20, 0x2d75f: 0x6c4c0020, - 0x2d760: 0x6c4c0220, 0x2d761: 0x6c4c0420, 0x2d762: 0x6c4c0620, 0x2d763: 0x6c4c0820, - 0x2d764: 0x6c4c0a20, 0x2d765: 0x6c4c0c20, 0x2d766: 0x6c4c0e20, 0x2d767: 0x6c4c1020, - 0x2d768: 0x6c6e0020, 0x2d769: 0x6c6e0220, 0x2d76a: 0x6c6e0420, 0x2d76b: 0x6c6e0620, - 0x2d76c: 0x6c6e0820, 0x2d76d: 0x6c6e0a20, 0x2d76e: 0x6c6e0c20, 0x2d76f: 0x6c6e0e20, - 0x2d770: 0x6c6e1020, 0x2d771: 0x6c6e1220, 0x2d772: 0x6c957020, 0x2d773: 0x6c957220, - 0x2d774: 0x6c957420, 0x2d775: 0x6c957620, 0x2d776: 0x6c957820, 0x2d777: 0x6c957a20, - 0x2d778: 0x6c957c20, 0x2d779: 0x6c957e20, 0x2d77a: 0x6c958020, 0x2d77b: 0x6c958220, - 0x2d77c: 0x6c958420, 0x2d77d: 0x6cc19820, 0x2d77e: 0x6c95ca20, 0x2d77f: 0x6cc19a20, - // Block 0xb5e, offset 0x2d780 - 0x2d780: 0x6cc19c20, 0x2d781: 0x6cc19e20, 0x2d782: 0x6cc1a020, 0x2d783: 0x6cc1a220, - 0x2d784: 0x6cc1a420, 0x2d785: 0x6cc1a620, 0x2d786: 0x6cc1a820, 0x2d787: 0x6cc1aa20, - 0x2d788: 0x6cc1f220, 0x2d789: 0x6cc1ac20, 0x2d78a: 0x6cf12420, 0x2d78b: 0x6cf12620, - 0x2d78c: 0x6cf12820, 0x2d78d: 0x6cf12a20, 0x2d78e: 0x6cf12c20, 0x2d78f: 0x6cf12e20, - 0x2d790: 0x6d082820, 0x2d791: 0x6d20c820, 0x2d792: 0x6d20ca20, 0x2d793: 0x6d20cc20, - 0x2d794: 0x6d20ce20, 0x2d795: 0x6d20d020, 0x2d796: 0x6d20d220, 0x2d797: 0x6d20d420, - 0x2d798: 0x6d20d620, 0x2d799: 0x6d20d820, 0x2d79a: 0x6d4e5e20, 0x2d79b: 0x6d20da20, - 0x2d79c: 0x6d4e6020, 0x2d79d: 0x6d4e6220, 0x2d79e: 0x6d4e6420, 0x2d79f: 0x6d4e6620, - 0x2d7a0: 0x6d4e6820, 0x2d7a1: 0x6d4e6a20, 0x2d7a2: 0x6d4e6c20, 0x2d7a3: 0x6d210620, - 0x2d7a4: 0x6d4e6e20, 0x2d7a5: 0x6d4e7020, 0x2d7a6: 0x6d7aee20, 0x2d7a7: 0x6d7af020, - 0x2d7a8: 0x6d7af220, 0x2d7a9: 0x6d4ea820, 0x2d7aa: 0x6da36020, 0x2d7ab: 0x6da36220, - 0x2d7ac: 0x6da36420, 0x2d7ad: 0x6dc51020, 0x2d7ae: 0x6dc51220, 0x2d7af: 0x6d7b1a20, - 0x2d7b0: 0x6de21220, 0x2d7b1: 0x6df9e020, 0x2d7b2: 0x6c01ce20, 0x2d7b3: 0x6c08ba20, - 0x2d7b4: 0x6c10da20, 0x2d7b5: 0x6c10dc20, 0x2d7b6: 0x6c10de20, 0x2d7b7: 0x6c31dc20, - 0x2d7b8: 0x6c31de20, 0x2d7b9: 0x6cf15a20, 0x2d7ba: 0x6c01d220, 0x2d7bb: 0x6c043220, - 0x2d7bc: 0x6c08be20, 0x2d7bd: 0x6c4c5e20, 0x2d7be: 0x6cc20020, 0x2d7bf: 0x6c01d420, - // Block 0xb5f, offset 0x2d7c0 - 0x2d7c0: 0x6c08c820, 0x2d7c1: 0x6c08ca20, 0x2d7c2: 0x6c08cc20, 0x2d7c3: 0x6c08ce20, - 0x2d7c4: 0x6c10ea20, 0x2d7c5: 0x6c10ec20, 0x2d7c6: 0x6c10ee20, 0x2d7c7: 0x6c1e4620, - 0x2d7c8: 0x6c1e4820, 0x2d7c9: 0x6c1e4a20, 0x2d7ca: 0x6c1e4c20, 0x2d7cb: 0x6c1e4e20, - 0x2d7cc: 0x6c1e5020, 0x2d7cd: 0x6c1e5220, 0x2d7ce: 0x6c1e5420, 0x2d7cf: 0x6c1e5620, - 0x2d7d0: 0x6c1e5820, 0x2d7d1: 0x6c1e5a20, 0x2d7d2: 0x6c1e5c20, 0x2d7d3: 0x6c1e5e20, - 0x2d7d4: 0x6c1e6020, 0x2d7d5: 0x6c320220, 0x2d7d6: 0x6c320420, 0x2d7d7: 0x6c320620, - 0x2d7d8: 0x6c31f020, 0x2d7d9: 0x6c320820, 0x2d7da: 0x6c320a20, 0x2d7db: 0x6c4c6620, - 0x2d7dc: 0x6c320c20, 0x2d7dd: 0x6c320e20, 0x2d7de: 0x6c321020, 0x2d7df: 0x6c321220, - 0x2d7e0: 0x6c4c7620, 0x2d7e1: 0x6c4c7820, 0x2d7e2: 0x6c4c7a20, 0x2d7e3: 0x6c4c7c20, - 0x2d7e4: 0x6c4c7e20, 0x2d7e5: 0x6c4c8020, 0x2d7e6: 0x6c4c8220, 0x2d7e7: 0x6c6e6a20, - 0x2d7e8: 0x6c6e6c20, 0x2d7e9: 0x6c6e6e20, 0x2d7ea: 0x6c6e7020, 0x2d7eb: 0x6c6e7220, - 0x2d7ec: 0x6c6e7420, 0x2d7ed: 0x6c6e7620, 0x2d7ee: 0x6c6e7820, 0x2d7ef: 0x6c6e7a20, - 0x2d7f0: 0x6c4cac20, 0x2d7f1: 0x6c95e220, 0x2d7f2: 0x6c95e420, 0x2d7f3: 0x6c95e620, - 0x2d7f4: 0x6c95e820, 0x2d7f5: 0x6c95ea20, 0x2d7f6: 0x6c95ec20, 0x2d7f7: 0x6c95ee20, - 0x2d7f8: 0x6c95f020, 0x2d7f9: 0x6c95f220, 0x2d7fa: 0x6c95f420, 0x2d7fb: 0x6c95f620, - 0x2d7fc: 0x6c95f820, 0x2d7fd: 0x6cc20c20, 0x2d7fe: 0x6c965020, 0x2d7ff: 0x6cc20e20, - // Block 0xb60, offset 0x2d800 - 0x2d800: 0x6cc21020, 0x2d801: 0x6cc21220, 0x2d802: 0x6cc21420, 0x2d803: 0x6cc21620, - 0x2d804: 0x6cc26420, 0x2d805: 0x6cf16c20, 0x2d806: 0x6cf16e20, 0x2d807: 0x6cf17020, - 0x2d808: 0x6cf17220, 0x2d809: 0x6cf17420, 0x2d80a: 0x6cc21820, 0x2d80b: 0x6cf17620, - 0x2d80c: 0x6cf17820, 0x2d80d: 0x6d211e20, 0x2d80e: 0x6d212020, 0x2d80f: 0x6d212220, - 0x2d810: 0x6d212420, 0x2d811: 0x6d212620, 0x2d812: 0x6d212820, 0x2d813: 0x6d212a20, - 0x2d814: 0x6d212c20, 0x2d815: 0x6d212e20, 0x2d816: 0x6d213020, 0x2d817: 0x6d213220, - 0x2d818: 0x6d213420, 0x2d819: 0x6d216c20, 0x2d81a: 0x6d4ebc20, 0x2d81b: 0x6d4ebe20, - 0x2d81c: 0x6d216e20, 0x2d81d: 0x6d4ec020, 0x2d81e: 0x6d4ec220, 0x2d81f: 0x6d4ec420, - 0x2d820: 0x6d4ec620, 0x2d821: 0x6d4ec820, 0x2d822: 0x6d4eca20, 0x2d823: 0x6d4ecc20, - 0x2d824: 0x6d4ece20, 0x2d825: 0x6d7b2e20, 0x2d826: 0x6d7b3020, 0x2d827: 0x6d7b3220, - 0x2d828: 0x6d7b3420, 0x2d829: 0x6d7b3620, 0x2d82a: 0x6d7b3820, 0x2d82b: 0x6dc52020, - 0x2d82c: 0x6de23220, 0x2d82d: 0x6de23420, 0x2d82e: 0x6df9ee20, 0x2d82f: 0x6df9f020, - 0x2d830: 0x6df9f220, 0x2d831: 0x6e0da020, 0x2d832: 0x6e1d1220, 0x2d833: 0x6e388020, - 0x2d834: 0x6c01d620, 0x2d835: 0x6c110a20, 0x2d836: 0x6c324220, 0x2d837: 0x6c1e8420, - 0x2d838: 0x6c324620, 0x2d839: 0x6c324820, 0x2d83a: 0x6c4cae20, 0x2d83b: 0x6c4cb020, - 0x2d83c: 0x6c4cb220, 0x2d83d: 0x6c6eba20, 0x2d83e: 0x6c01d820, 0x2d83f: 0x6c043c20, - // Block 0xb61, offset 0x2d840 - 0x2d840: 0x6c043e20, 0x2d841: 0x6c08da20, 0x2d842: 0x6c110e20, 0x2d843: 0x6c1e9020, - 0x2d844: 0x6c1e9220, 0x2d845: 0x6c1e9420, 0x2d846: 0x6c324c20, 0x2d847: 0x6c4cc220, - 0x2d848: 0x6c4cc420, 0x2d849: 0x6c6ec220, 0x2d84a: 0x6d218220, 0x2d84b: 0x6c01dc20, - 0x2d84c: 0x6c044220, 0x2d84d: 0x6c08e020, 0x2d84e: 0x6c111620, 0x2d84f: 0x6c111820, - 0x2d850: 0x6c111a20, 0x2d851: 0x6cc27a20, 0x2d852: 0x6cf1ba20, 0x2d853: 0x6c01e020, - 0x2d854: 0x6c044a20, 0x2d855: 0x6c044c20, 0x2d856: 0x6c044e20, 0x2d857: 0x6c08e220, - 0x2d858: 0x6c08e420, 0x2d859: 0x6c112820, 0x2d85a: 0x6c112a20, 0x2d85b: 0x6c112c20, - 0x2d85c: 0x6c112e20, 0x2d85d: 0x6c1eb620, 0x2d85e: 0x6c1eb820, 0x2d85f: 0x6c1eba20, - 0x2d860: 0x6c1ebc20, 0x2d861: 0x6c326820, 0x2d862: 0x6c326a20, 0x2d863: 0x6c326c20, - 0x2d864: 0x6c326e20, 0x2d865: 0x6c327020, 0x2d866: 0x6c327220, 0x2d867: 0x6c327420, - 0x2d868: 0x6c327620, 0x2d869: 0x6c327820, 0x2d86a: 0x6c327a20, 0x2d86b: 0x6c4cf820, - 0x2d86c: 0x6c4cfa20, 0x2d86d: 0x6c4cfc20, 0x2d86e: 0x6c4cfe20, 0x2d86f: 0x6c4d0020, - 0x2d870: 0x6c6edc20, 0x2d871: 0x6c6ede20, 0x2d872: 0x6c6ee020, 0x2d873: 0x6c6ee220, - 0x2d874: 0x6c966e20, 0x2d875: 0x6c967020, 0x2d876: 0x6c967220, 0x2d877: 0x6c967420, - 0x2d878: 0x6c967620, 0x2d879: 0x6c967820, 0x2d87a: 0x6cc28420, 0x2d87b: 0x6cc28620, - 0x2d87c: 0x6cc28820, 0x2d87d: 0x6cc28a20, 0x2d87e: 0x6cc28c20, 0x2d87f: 0x6cf1c820, - // Block 0xb62, offset 0x2d880 - 0x2d880: 0x6cf1ca20, 0x2d881: 0x6cf1cc20, 0x2d882: 0x6cf1ce20, 0x2d883: 0x6d218620, - 0x2d884: 0x6d218820, 0x2d885: 0x6d218a20, 0x2d886: 0x6d21a620, 0x2d887: 0x6d4f0c20, - 0x2d888: 0x6d4f0e20, 0x2d889: 0x6d4f1020, 0x2d88a: 0x6d7b6820, 0x2d88b: 0x6d7b6a20, - 0x2d88c: 0x6da3aa20, 0x2d88d: 0x6dc54020, 0x2d88e: 0x6e1d2220, 0x2d88f: 0x6e28ca20, - 0x2d890: 0x6c01e820, 0x2d891: 0x6c01ea20, 0x2d892: 0x6c08f820, 0x2d893: 0x6c114a20, - 0x2d894: 0x6c329c20, 0x2d895: 0x6c329e20, 0x2d896: 0x6c4d2a20, 0x2d897: 0x6c96a020, - 0x2d898: 0x6cc2a620, 0x2d899: 0x6cf1e020, 0x2d89a: 0x6cf1e220, 0x2d89b: 0x6d7b7a20, - 0x2d89c: 0x6d7b7c20, 0x2d89d: 0x6dc54e20, 0x2d89e: 0x6dc55020, 0x2d89f: 0x6de26820, - 0x2d8a0: 0x6e3d2420, 0x2d8a1: 0x6c01ec20, 0x2d8a2: 0x6c1ee020, 0x2d8a3: 0x6c1ee220, - 0x2d8a4: 0x6c1ee420, 0x2d8a5: 0x6c4d3420, 0x2d8a6: 0x6c4d3620, 0x2d8a7: 0x6c6f0020, - 0x2d8a8: 0x6c6f0220, 0x2d8a9: 0x6c96ac20, 0x2d8aa: 0x6cae2020, 0x2d8ab: 0x6c96ae20, - 0x2d8ac: 0x6c96b020, 0x2d8ad: 0x6cc2b220, 0x2d8ae: 0x6cf1ea20, 0x2d8af: 0x6d21b420, - 0x2d8b0: 0x6d21b620, 0x2d8b1: 0x6d4f2820, 0x2d8b2: 0x6e1d2820, 0x2d8b3: 0x6c01ee20, - 0x2d8b4: 0x6c116220, 0x2d8b5: 0x6c116420, 0x2d8b6: 0x6c1eee20, 0x2d8b7: 0x6c1ef020, - 0x2d8b8: 0x6c1ef220, 0x2d8b9: 0x6c1ef420, 0x2d8ba: 0x6c1ef620, 0x2d8bb: 0x6c1ef820, - 0x2d8bc: 0x6c32b820, 0x2d8bd: 0x6c32ba20, 0x2d8be: 0x6c32bc20, 0x2d8bf: 0x6c32be20, - // Block 0xb63, offset 0x2d8c0 - 0x2d8c0: 0x6c32c020, 0x2d8c1: 0x6c32c220, 0x2d8c2: 0x6c32c420, 0x2d8c3: 0x6c32c620, - 0x2d8c4: 0x6c32c820, 0x2d8c5: 0x6c4d4c20, 0x2d8c6: 0x6c4d4e20, 0x2d8c7: 0x6c4d5020, - 0x2d8c8: 0x6c4d5220, 0x2d8c9: 0x6c4d5420, 0x2d8ca: 0x6c4d5620, 0x2d8cb: 0x6c4d5820, - 0x2d8cc: 0x6c4d5a20, 0x2d8cd: 0x6c4d5c20, 0x2d8ce: 0x6c6f1620, 0x2d8cf: 0x6c6f1820, - 0x2d8d0: 0x6c6f1a20, 0x2d8d1: 0x6c6f1c20, 0x2d8d2: 0x6c6f1e20, 0x2d8d3: 0x6c6f2020, - 0x2d8d4: 0x6c4d5e20, 0x2d8d5: 0x6c6f2220, 0x2d8d6: 0x6c96d220, 0x2d8d7: 0x6c96d420, - 0x2d8d8: 0x6c96d620, 0x2d8d9: 0x6c96d820, 0x2d8da: 0x6cc2ca20, 0x2d8db: 0x6c96da20, - 0x2d8dc: 0x6c96dc20, 0x2d8dd: 0x6c96de20, 0x2d8de: 0x6c96e020, 0x2d8df: 0x6c96e220, - 0x2d8e0: 0x6c96e420, 0x2d8e1: 0x6c96e620, 0x2d8e2: 0x6c96e820, 0x2d8e3: 0x6c96ea20, - 0x2d8e4: 0x6c96ec20, 0x2d8e5: 0x6cc2cc20, 0x2d8e6: 0x6cc2ce20, 0x2d8e7: 0x6cc2d020, - 0x2d8e8: 0x6cc2d220, 0x2d8e9: 0x6cc2d420, 0x2d8ea: 0x6cc2d620, 0x2d8eb: 0x6cc2d820, - 0x2d8ec: 0x6cf1f820, 0x2d8ed: 0x6cf1fa20, 0x2d8ee: 0x6cf1fc20, 0x2d8ef: 0x6cf1fe20, - 0x2d8f0: 0x6cf20020, 0x2d8f1: 0x6d21c220, 0x2d8f2: 0x6d4f3a20, 0x2d8f3: 0x6d21c420, - 0x2d8f4: 0x6d21c620, 0x2d8f5: 0x6d4f3c20, 0x2d8f6: 0x6d220220, 0x2d8f7: 0x6d4f3e20, - 0x2d8f8: 0x6d4f4020, 0x2d8f9: 0x6d4f4220, 0x2d8fa: 0x6d4f4420, 0x2d8fb: 0x6d7b9020, - 0x2d8fc: 0x6d7b9220, 0x2d8fd: 0x6da3c220, 0x2d8fe: 0x6da3c420, 0x2d8ff: 0x6de27420, - // Block 0xb64, offset 0x2d900 - 0x2d900: 0x6dfa1c20, 0x2d901: 0x6dfa1e20, 0x2d902: 0x6e0dba20, 0x2d903: 0x6c046620, - 0x2d904: 0x6c01f020, 0x2d905: 0x6c090820, 0x2d906: 0x6c046820, 0x2d907: 0x6c090a20, - 0x2d908: 0x6c117020, 0x2d909: 0x6c090c20, 0x2d90a: 0x6c090e20, 0x2d90b: 0x6c117820, - 0x2d90c: 0x6c1f2020, 0x2d90d: 0x6c1f2220, 0x2d90e: 0x6c1f2420, 0x2d90f: 0x6c117a20, - 0x2d910: 0x6c1f2620, 0x2d911: 0x6c1f2820, 0x2d912: 0x6c1f2a20, 0x2d913: 0x6c117c20, - 0x2d914: 0x6c117e20, 0x2d915: 0x6c118020, 0x2d916: 0x6c118220, 0x2d917: 0x6c1f2c20, - 0x2d918: 0x6c1f2e20, 0x2d919: 0x6c118420, 0x2d91a: 0x6c118620, 0x2d91b: 0x6c118820, - 0x2d91c: 0x6c1f3020, 0x2d91d: 0x6c32e620, 0x2d91e: 0x6c32e820, 0x2d91f: 0x6c1f4220, - 0x2d920: 0x6c32ea20, 0x2d921: 0x6c1f4420, 0x2d922: 0x6c32ec20, 0x2d923: 0x6c1f4620, - 0x2d924: 0x6c1f4820, 0x2d925: 0x6c32ee20, 0x2d926: 0x6c1f4a20, 0x2d927: 0x6c1f4c20, - 0x2d928: 0x6c1f4e20, 0x2d929: 0x6c32f020, 0x2d92a: 0x6c1f5020, 0x2d92b: 0x6c1f5220, - 0x2d92c: 0x6c1f5420, 0x2d92d: 0x6c1f5620, 0x2d92e: 0x6c1f5820, 0x2d92f: 0x6c1f5a20, - 0x2d930: 0x6c1f5c20, 0x2d931: 0x6c1f5e20, 0x2d932: 0x6c1f6020, 0x2d933: 0x6c1f6220, - 0x2d934: 0x6c1f6420, 0x2d935: 0x6c32f220, 0x2d936: 0x6c1f6620, 0x2d937: 0x6c1f6820, - 0x2d938: 0x6c1f6a20, 0x2d939: 0x6c1f6c20, 0x2d93a: 0x6c1f6e20, 0x2d93b: 0x6c1f7020, - 0x2d93c: 0x6c1f7220, 0x2d93d: 0x6c32f420, 0x2d93e: 0x6c1f7420, 0x2d93f: 0x6c32f620, - // Block 0xb65, offset 0x2d940 - 0x2d940: 0x6c1f7620, 0x2d941: 0x6c32f820, 0x2d942: 0x6c32fa20, 0x2d943: 0x6c1f7820, - 0x2d944: 0x6c1f7a20, 0x2d945: 0x6c1f7c20, 0x2d946: 0x6c1f7e20, 0x2d947: 0x6c331020, - 0x2d948: 0x6c331220, 0x2d949: 0x6c331420, 0x2d94a: 0x6c331620, 0x2d94b: 0x6c331820, - 0x2d94c: 0x6c331a20, 0x2d94d: 0x6c331c20, 0x2d94e: 0x6c4d8420, 0x2d94f: 0x6c331e20, - 0x2d950: 0x6c332020, 0x2d951: 0x6c332220, 0x2d952: 0x6c4d8620, 0x2d953: 0x6c332420, - 0x2d954: 0x6c332620, 0x2d955: 0x6c332820, 0x2d956: 0x6c332a20, 0x2d957: 0x6c332c20, - 0x2d958: 0x6c4d8820, 0x2d959: 0x6c332e20, 0x2d95a: 0x6c333020, 0x2d95b: 0x6c333220, - 0x2d95c: 0x6c333420, 0x2d95d: 0x6c4d8a20, 0x2d95e: 0x6c333620, 0x2d95f: 0x6c333820, - 0x2d960: 0x6c4d8c20, 0x2d961: 0x6c333a20, 0x2d962: 0x6c333c20, 0x2d963: 0x6c4d8e20, - 0x2d964: 0x6c4d9020, 0x2d965: 0x6c4d9220, 0x2d966: 0x6c333e20, 0x2d967: 0x6c334020, - 0x2d968: 0x6c4d9420, 0x2d969: 0x6c334220, 0x2d96a: 0x6c334420, 0x2d96b: 0x6c334620, - 0x2d96c: 0x6c334820, 0x2d96d: 0x6c334a20, 0x2d96e: 0x6c334c20, 0x2d96f: 0x6c334e20, - 0x2d970: 0x6c335020, 0x2d971: 0x6c4d9620, 0x2d972: 0x6c335220, 0x2d973: 0x6c335420, - 0x2d974: 0x6c335620, 0x2d975: 0x6c335820, 0x2d976: 0x6c335a20, 0x2d977: 0x6c4d9820, - 0x2d978: 0x6c4d9a20, 0x2d979: 0x6c4d9c20, 0x2d97a: 0x6c335c20, 0x2d97b: 0x6c4d9e20, - 0x2d97c: 0x6c4da020, 0x2d97d: 0x6c335e20, 0x2d97e: 0x6c336020, 0x2d97f: 0x6c336220, - // Block 0xb66, offset 0x2d980 - 0x2d980: 0x6c4dc020, 0x2d981: 0x6c6f6220, 0x2d982: 0x6c4dc220, 0x2d983: 0x6c4dc420, - 0x2d984: 0x6c4dc620, 0x2d985: 0x6c4dc820, 0x2d986: 0x6c4dca20, 0x2d987: 0x6c4dcc20, - 0x2d988: 0x6c4dce20, 0x2d989: 0x6c4dd020, 0x2d98a: 0x6c4dd220, 0x2d98b: 0x6c6f6420, - 0x2d98c: 0x6c4dd420, 0x2d98d: 0x6c4dd620, 0x2d98e: 0x6c4dd820, 0x2d98f: 0x6c6f6620, - 0x2d990: 0x6c6f6820, 0x2d991: 0x6c4dda20, 0x2d992: 0x6c4ddc20, 0x2d993: 0x6c4dde20, - 0x2d994: 0x6c4de020, 0x2d995: 0x6c6f6a20, 0x2d996: 0x6c6f6c20, 0x2d997: 0x6c4de220, - 0x2d998: 0x6c4de420, 0x2d999: 0x6c6f6e20, 0x2d99a: 0x6c6f7020, 0x2d99b: 0x6c4de620, - 0x2d99c: 0x6c4de820, 0x2d99d: 0x6c6f7220, 0x2d99e: 0x6c4dea20, 0x2d99f: 0x6c4dec20, - 0x2d9a0: 0x6c4dee20, 0x2d9a1: 0x6c4df020, 0x2d9a2: 0x6c4df220, 0x2d9a3: 0x6c6f7420, - 0x2d9a4: 0x6c4df420, 0x2d9a5: 0x6c6f7620, 0x2d9a6: 0x6c4df620, 0x2d9a7: 0x6c6f7820, - 0x2d9a8: 0x6c4df820, 0x2d9a9: 0x6c6f7a20, 0x2d9aa: 0x6c4dfa20, 0x2d9ab: 0x6c4dfc20, - 0x2d9ac: 0x6c4dfe20, 0x2d9ad: 0x6c6f7c20, 0x2d9ae: 0x6c4e0020, 0x2d9af: 0x6c6f7e20, - 0x2d9b0: 0x6c4e0220, 0x2d9b1: 0x6c4e0420, 0x2d9b2: 0x6c4e0620, 0x2d9b3: 0x6c6f8020, - 0x2d9b4: 0x6c6f8220, 0x2d9b5: 0x6c6f8420, 0x2d9b6: 0x6c6f8620, 0x2d9b7: 0x6c6f8820, - 0x2d9b8: 0x6c4e0820, 0x2d9b9: 0x6c4e0a20, 0x2d9ba: 0x6c4e0c20, 0x2d9bb: 0x6c4e0e20, - 0x2d9bc: 0x6c4e1020, 0x2d9bd: 0x6c4e1220, 0x2d9be: 0x6c6f9e20, 0x2d9bf: 0x6c973820, - // Block 0xb67, offset 0x2d9c0 - 0x2d9c0: 0x6c6fa020, 0x2d9c1: 0x6c6fa220, 0x2d9c2: 0x6c6fa420, 0x2d9c3: 0x6c6fa620, - 0x2d9c4: 0x6c6fa820, 0x2d9c5: 0x6c6faa20, 0x2d9c6: 0x6c973a20, 0x2d9c7: 0x6c6fac20, - 0x2d9c8: 0x6c6fae20, 0x2d9c9: 0x6c973c20, 0x2d9ca: 0x6c973e20, 0x2d9cb: 0x6c6fb020, - 0x2d9cc: 0x6c6fb220, 0x2d9cd: 0x6c6fb420, 0x2d9ce: 0x6c6fb620, 0x2d9cf: 0x6c6fb820, - 0x2d9d0: 0x6c974020, 0x2d9d1: 0x6c6fba20, 0x2d9d2: 0x6c6fbc20, 0x2d9d3: 0x6c6fbe20, - 0x2d9d4: 0x6c6fc020, 0x2d9d5: 0x6c6fc220, 0x2d9d6: 0x6c6fc420, 0x2d9d7: 0x6c6fc620, - 0x2d9d8: 0x6c974220, 0x2d9d9: 0x6c6fc820, 0x2d9da: 0x6c6fca20, 0x2d9db: 0x6c6fcc20, - 0x2d9dc: 0x6c6fce20, 0x2d9dd: 0x6c6fd020, 0x2d9de: 0x6c6fd220, 0x2d9df: 0x6c6fd420, - 0x2d9e0: 0x6c974420, 0x2d9e1: 0x6c974620, 0x2d9e2: 0x6c6fd620, 0x2d9e3: 0x6c974820, - 0x2d9e4: 0x6c974a20, 0x2d9e5: 0x6c974c20, 0x2d9e6: 0x6c6fd820, 0x2d9e7: 0x6c6fda20, - 0x2d9e8: 0x6c974e20, 0x2d9e9: 0x6c6fdc20, 0x2d9ea: 0x6c975020, 0x2d9eb: 0x6c975220, - 0x2d9ec: 0x6c975420, 0x2d9ed: 0x6c6fde20, 0x2d9ee: 0x6c6fe020, 0x2d9ef: 0x6c6fe220, - 0x2d9f0: 0x6c977e20, 0x2d9f1: 0x6c978020, 0x2d9f2: 0x6cc31420, 0x2d9f3: 0x6cc31620, - 0x2d9f4: 0x6c978220, 0x2d9f5: 0x6c978420, 0x2d9f6: 0x6cc31820, 0x2d9f7: 0x6c978620, - 0x2d9f8: 0x6c978820, 0x2d9f9: 0x6cc31a20, 0x2d9fa: 0x6c978a20, 0x2d9fb: 0x6c978c20, - 0x2d9fc: 0x6c978e20, 0x2d9fd: 0x6c979020, 0x2d9fe: 0x6c979220, 0x2d9ff: 0x6c979420, - // Block 0xb68, offset 0x2da00 - 0x2da00: 0x6c979620, 0x2da01: 0x6cc31c20, 0x2da02: 0x6c979820, 0x2da03: 0x6c979a20, - 0x2da04: 0x6cc31e20, 0x2da05: 0x6c979c20, 0x2da06: 0x6c979e20, 0x2da07: 0x6c97a020, - 0x2da08: 0x6c97a220, 0x2da09: 0x6cc32020, 0x2da0a: 0x6c97a420, 0x2da0b: 0x6c97a620, - 0x2da0c: 0x6cc32220, 0x2da0d: 0x6c97a820, 0x2da0e: 0x6cc32420, 0x2da0f: 0x6c97aa20, - 0x2da10: 0x6c97ac20, 0x2da11: 0x6cc32620, 0x2da12: 0x6cc32820, 0x2da13: 0x6c97ae20, - 0x2da14: 0x6c97b020, 0x2da15: 0x6c97b220, 0x2da16: 0x6cc32a20, 0x2da17: 0x6c97b420, - 0x2da18: 0x6c97b620, 0x2da19: 0x6c97b820, 0x2da1a: 0x6c97ba20, 0x2da1b: 0x6c97bc20, - 0x2da1c: 0x6c97be20, 0x2da1d: 0x6c97c020, 0x2da1e: 0x6c97c220, 0x2da1f: 0x6c97c420, - 0x2da20: 0x6cc32c20, 0x2da21: 0x6cc32e20, 0x2da22: 0x6cc33020, 0x2da23: 0x6cc33220, - 0x2da24: 0x6c97c620, 0x2da25: 0x6cc33420, 0x2da26: 0x6c97c820, 0x2da27: 0x6c97ca20, - 0x2da28: 0x6c97cc20, 0x2da29: 0x6cc33620, 0x2da2a: 0x6cc33820, 0x2da2b: 0x6cc33a20, - 0x2da2c: 0x6c97ce20, 0x2da2d: 0x6c97d020, 0x2da2e: 0x6c97d220, 0x2da2f: 0x6c97d420, - 0x2da30: 0x6cc35820, 0x2da31: 0x6cc35a20, 0x2da32: 0x6cc35c20, 0x2da33: 0x6cf24a20, - 0x2da34: 0x6cc35e20, 0x2da35: 0x6cc36020, 0x2da36: 0x6cc36220, 0x2da37: 0x6cf24c20, - 0x2da38: 0x6cc36420, 0x2da39: 0x6cf24e20, 0x2da3a: 0x6cc36620, 0x2da3b: 0x6cc36820, - 0x2da3c: 0x6cc36a20, 0x2da3d: 0x6cc36c20, 0x2da3e: 0x6cc36e20, 0x2da3f: 0x6cc37020, - // Block 0xb69, offset 0x2da40 - 0x2da40: 0x6cc37220, 0x2da41: 0x6cf25020, 0x2da42: 0x6cf25220, 0x2da43: 0x6cc37420, - 0x2da44: 0x6cc37620, 0x2da45: 0x6cc37820, 0x2da46: 0x6cf25420, 0x2da47: 0x6cc37a20, - 0x2da48: 0x6cf25620, 0x2da49: 0x6cc37c20, 0x2da4a: 0x6cc37e20, 0x2da4b: 0x6cc38020, - 0x2da4c: 0x6cc38220, 0x2da4d: 0x6cf25820, 0x2da4e: 0x6cc38420, 0x2da4f: 0x6cf25a20, - 0x2da50: 0x6cc38620, 0x2da51: 0x6cc38820, 0x2da52: 0x6cc38a20, 0x2da53: 0x6cc38c20, - 0x2da54: 0x6cc38e20, 0x2da55: 0x6cc39020, 0x2da56: 0x6cc39220, 0x2da57: 0x6cf25c20, - 0x2da58: 0x6cc39420, 0x2da59: 0x6cf25e20, 0x2da5a: 0x6cf26020, 0x2da5b: 0x6cf26220, - 0x2da5c: 0x6cc39620, 0x2da5d: 0x6cc39820, 0x2da5e: 0x6cc39a20, 0x2da5f: 0x6cf26420, - 0x2da60: 0x6cc39c20, 0x2da61: 0x6cc39e20, 0x2da62: 0x6cc3a020, 0x2da63: 0x6cc3a220, - 0x2da64: 0x6cc3a420, 0x2da65: 0x6cc3a620, 0x2da66: 0x6cc3a820, 0x2da67: 0x6cf27820, - 0x2da68: 0x6d221220, 0x2da69: 0x6cf27a20, 0x2da6a: 0x6cf27c20, 0x2da6b: 0x6cf27e20, - 0x2da6c: 0x6d221420, 0x2da6d: 0x6cf28020, 0x2da6e: 0x6cf28220, 0x2da6f: 0x6cf28420, - 0x2da70: 0x6cf28620, 0x2da71: 0x6cf28820, 0x2da72: 0x6cf28a20, 0x2da73: 0x6d221620, - 0x2da74: 0x6cf28c20, 0x2da75: 0x6cf28e20, 0x2da76: 0x6cf29020, 0x2da77: 0x6cf29220, - 0x2da78: 0x6d221820, 0x2da79: 0x6cf29420, 0x2da7a: 0x6cf29620, 0x2da7b: 0x6d221a20, - 0x2da7c: 0x6cf29820, 0x2da7d: 0x6cf29a20, 0x2da7e: 0x6cf29c20, 0x2da7f: 0x6d221c20, - // Block 0xb6a, offset 0x2da80 - 0x2da80: 0x6cf29e20, 0x2da81: 0x6d221e20, 0x2da82: 0x6d222020, 0x2da83: 0x6cf2a020, - 0x2da84: 0x6cf2a220, 0x2da85: 0x6cf2a420, 0x2da86: 0x6cf2a620, 0x2da87: 0x6d222220, - 0x2da88: 0x6d222420, 0x2da89: 0x6cf2a820, 0x2da8a: 0x6cf2aa20, 0x2da8b: 0x6d222620, - 0x2da8c: 0x6cf2ac20, 0x2da8d: 0x6cf2ae20, 0x2da8e: 0x6cf2b020, 0x2da8f: 0x6cf2b220, - 0x2da90: 0x6d222820, 0x2da91: 0x6cf2b420, 0x2da92: 0x6d223c20, 0x2da93: 0x6d223e20, - 0x2da94: 0x6d224020, 0x2da95: 0x6d4f6c20, 0x2da96: 0x6d224220, 0x2da97: 0x6d4f6e20, - 0x2da98: 0x6d224420, 0x2da99: 0x6d4f7020, 0x2da9a: 0x6d224620, 0x2da9b: 0x6d224820, - 0x2da9c: 0x6d4f7220, 0x2da9d: 0x6d4f7420, 0x2da9e: 0x6d224a20, 0x2da9f: 0x6d224c20, - 0x2daa0: 0x6d224e20, 0x2daa1: 0x6d225020, 0x2daa2: 0x6d225220, 0x2daa3: 0x6d225420, - 0x2daa4: 0x6d4f7620, 0x2daa5: 0x6d225620, 0x2daa6: 0x6d4f7820, 0x2daa7: 0x6d4f7a20, - 0x2daa8: 0x6cc3aa20, 0x2daa9: 0x6d225820, 0x2daaa: 0x6d225a20, 0x2daab: 0x6d4f7c20, - 0x2daac: 0x6d225c20, 0x2daad: 0x6d4fb020, 0x2daae: 0x6d4f7e20, 0x2daaf: 0x6d225e20, - 0x2dab0: 0x6d4f8020, 0x2dab1: 0x6d226020, 0x2dab2: 0x6d226220, 0x2dab3: 0x6d226420, - 0x2dab4: 0x6d226620, 0x2dab5: 0x6d226820, 0x2dab6: 0x6d4f8220, 0x2dab7: 0x6d226a20, - 0x2dab8: 0x6d4f8420, 0x2dab9: 0x6d4f8620, 0x2daba: 0x6d226c20, 0x2dabb: 0x6d226e20, - 0x2dabc: 0x6d4f8820, 0x2dabd: 0x6d227020, 0x2dabe: 0x6d4f8a20, 0x2dabf: 0x6d4f8c20, - // Block 0xb6b, offset 0x2dac0 - 0x2dac0: 0x6d227220, 0x2dac1: 0x6d227420, 0x2dac2: 0x6d4f8e20, 0x2dac3: 0x6d4f9020, - 0x2dac4: 0x6d4f9220, 0x2dac5: 0x6d4f9420, 0x2dac6: 0x6d227620, 0x2dac7: 0x6d4f9620, - 0x2dac8: 0x6d227820, 0x2dac9: 0x6d4fb220, 0x2daca: 0x6d7bb620, 0x2dacb: 0x6d4fb420, - 0x2dacc: 0x6d7bb820, 0x2dacd: 0x6d4fb620, 0x2dace: 0x6d4fb820, 0x2dacf: 0x6d4fba20, - 0x2dad0: 0x6d4fbc20, 0x2dad1: 0x6d7bba20, 0x2dad2: 0x6d4fbe20, 0x2dad3: 0x6d4fc020, - 0x2dad4: 0x6d4fc220, 0x2dad5: 0x6d4fc420, 0x2dad6: 0x6d7bbc20, 0x2dad7: 0x6d7bbe20, - 0x2dad8: 0x6d4fc620, 0x2dad9: 0x6d7bc020, 0x2dada: 0x6d4fc820, 0x2dadb: 0x6d4fca20, - 0x2dadc: 0x6d4fcc20, 0x2dadd: 0x6d7bc220, 0x2dade: 0x6d4fce20, 0x2dadf: 0x6d4fd020, - 0x2dae0: 0x6d7bc420, 0x2dae1: 0x6d4fd220, 0x2dae2: 0x6d4fd420, 0x2dae3: 0x6d4fd620, - 0x2dae4: 0x6d4fd820, 0x2dae5: 0x6d7bc620, 0x2dae6: 0x6d4fda20, 0x2dae7: 0x6d4fdc20, - 0x2dae8: 0x6d7bc820, 0x2dae9: 0x6d7bca20, 0x2daea: 0x6d4fde20, 0x2daeb: 0x6d4fe020, - 0x2daec: 0x6d4fe220, 0x2daed: 0x6d4fe420, 0x2daee: 0x6d4fe620, 0x2daef: 0x6d4fe820, - 0x2daf0: 0x6d4fea20, 0x2daf1: 0x6d4fec20, 0x2daf2: 0x6d7bcc20, 0x2daf3: 0x6d4fee20, - 0x2daf4: 0x6d7bd220, 0x2daf5: 0x6da3d620, 0x2daf6: 0x6d7bd420, 0x2daf7: 0x6d7bd620, - 0x2daf8: 0x6d7bd820, 0x2daf9: 0x6d7bda20, 0x2dafa: 0x6d7bdc20, 0x2dafb: 0x6d7c8e20, - 0x2dafc: 0x6da3d820, 0x2dafd: 0x6d7bde20, 0x2dafe: 0x6d7be020, 0x2daff: 0x6d7be220, - // Block 0xb6c, offset 0x2db00 - 0x2db00: 0x6d7be420, 0x2db01: 0x6d7be620, 0x2db02: 0x6da3da20, 0x2db03: 0x6da3dc20, - 0x2db04: 0x6d7be820, 0x2db05: 0x6d7bea20, 0x2db06: 0x6d7bec20, 0x2db07: 0x6da3de20, - 0x2db08: 0x6d7bee20, 0x2db09: 0x6da3e020, 0x2db0a: 0x6d7bf020, 0x2db0b: 0x6da3e220, - 0x2db0c: 0x6d7bf220, 0x2db0d: 0x6d7bf420, 0x2db0e: 0x6d7bf620, 0x2db0f: 0x6d7bf820, - 0x2db10: 0x6d7bfa20, 0x2db11: 0x6da3e420, 0x2db12: 0x6d7bfc20, 0x2db13: 0x6d7bfe20, - 0x2db14: 0x6d7c0020, 0x2db15: 0x6dc57e20, 0x2db16: 0x6dc58020, 0x2db17: 0x6da3ea20, - 0x2db18: 0x6dc58220, 0x2db19: 0x6da3ec20, 0x2db1a: 0x6da3ee20, 0x2db1b: 0x6da3f020, - 0x2db1c: 0x6da3f220, 0x2db1d: 0x6da3f420, 0x2db1e: 0x6da3f620, 0x2db1f: 0x6dc58420, - 0x2db20: 0x6da3f820, 0x2db21: 0x6da3fa20, 0x2db22: 0x6da3fc20, 0x2db23: 0x6dc58620, - 0x2db24: 0x6da3fe20, 0x2db25: 0x6da40020, 0x2db26: 0x6da40220, 0x2db27: 0x6da40420, - 0x2db28: 0x6da40620, 0x2db29: 0x6dc58c20, 0x2db2a: 0x6dc58e20, 0x2db2b: 0x6dc59020, - 0x2db2c: 0x6de27e20, 0x2db2d: 0x6dc59220, 0x2db2e: 0x6dc59420, 0x2db2f: 0x6de28020, - 0x2db30: 0x6dc59620, 0x2db31: 0x6dc59820, 0x2db32: 0x6de28220, 0x2db33: 0x6dc59a20, - 0x2db34: 0x6dc59c20, 0x2db35: 0x6de28a20, 0x2db36: 0x6de28c20, 0x2db37: 0x6de28e20, - 0x2db38: 0x6dfa2e20, 0x2db39: 0x6dfa3620, 0x2db3a: 0x6dfa3820, 0x2db3b: 0x6de2de20, - 0x2db3c: 0x6e0dc020, 0x2db3d: 0x6e0dc220, 0x2db3e: 0x6e0dc420, 0x2db3f: 0x6e1d3220, - // Block 0xb6d, offset 0x2db40 - 0x2db40: 0x6e28d020, 0x2db41: 0x6e28d220, 0x2db42: 0x6e1d3820, 0x2db43: 0x6e28d420, - 0x2db44: 0x6e28d620, 0x2db45: 0x6e388a20, 0x2db46: 0x6e388c20, 0x2db47: 0x6e429820, - 0x2db48: 0x6c046c20, 0x2db49: 0x6c092020, 0x2db4a: 0x6c092220, 0x2db4b: 0x6c092420, - 0x2db4c: 0x6c11ba20, 0x2db4d: 0x6c11bc20, 0x2db4e: 0x6c11be20, 0x2db4f: 0x6c11c020, - 0x2db50: 0x6c11c220, 0x2db51: 0x6c200020, 0x2db52: 0x6c200220, 0x2db53: 0x6c200420, - 0x2db54: 0x6c33e220, 0x2db55: 0x6c33e420, 0x2db56: 0x6c33e620, 0x2db57: 0x6c33e820, - 0x2db58: 0x6c4ea020, 0x2db59: 0x6c709c20, 0x2db5a: 0x6c98b820, 0x2db5b: 0x6c98ba20, - 0x2db5c: 0x6c98bc20, 0x2db5d: 0x6c98be20, 0x2db5e: 0x6cc49020, 0x2db5f: 0x6cc49220, - 0x2db60: 0x6cf37820, 0x2db61: 0x6cf37a20, 0x2db62: 0x6cf37c20, 0x2db63: 0x6cf37e20, - 0x2db64: 0x6cf38020, 0x2db65: 0x6cf38220, 0x2db66: 0x6cf37420, 0x2db67: 0x6d233420, - 0x2db68: 0x6d233620, 0x2db69: 0x6d233820, 0x2db6a: 0x6d233a20, 0x2db6b: 0x6d233c20, - 0x2db6c: 0x6d233e20, 0x2db6d: 0x6d50c220, 0x2db6e: 0x6d50c420, 0x2db6f: 0x6d50c620, - 0x2db70: 0x6d7c9220, 0x2db71: 0x6d7c9020, 0x2db72: 0x6da46a20, 0x2db73: 0x6dc60020, - 0x2db74: 0x6da46c20, 0x2db75: 0x6e1d5220, 0x2db76: 0x6c046e20, 0x2db77: 0x6c047020, - 0x2db78: 0x6c047220, 0x2db79: 0x6c092c20, 0x2db7a: 0x6c201820, 0x2db7b: 0x6c201a20, - 0x2db7c: 0x6c201c20, 0x2db7d: 0x6c340620, 0x2db7e: 0x6c340820, 0x2db7f: 0x6c340a20, - // Block 0xb6e, offset 0x2db80 - 0x2db80: 0x6c340c20, 0x2db81: 0x6c4ecc20, 0x2db82: 0x6c4ece20, 0x2db83: 0x6c4ed020, - 0x2db84: 0x6c70b220, 0x2db85: 0x6c70b420, 0x2db86: 0x6c70b620, 0x2db87: 0x6c70b820, - 0x2db88: 0x6c98d620, 0x2db89: 0x6cc4ae20, 0x2db8a: 0x6cc4b020, 0x2db8b: 0x6c047420, - 0x2db8c: 0x6c01f420, 0x2db8d: 0x6c01f620, 0x2db8e: 0x6c047620, 0x2db8f: 0x6c095020, - 0x2db90: 0x6c093820, 0x2db91: 0x6c093a20, 0x2db92: 0x6c093c20, 0x2db93: 0x6c093e20, - 0x2db94: 0x6c094020, 0x2db95: 0x6c094220, 0x2db96: 0x6c094420, 0x2db97: 0x6c11dc20, - 0x2db98: 0x6c11de20, 0x2db99: 0x6c11e020, 0x2db9a: 0x6c11e220, 0x2db9b: 0x6c11e420, - 0x2db9c: 0x6c11e620, 0x2db9d: 0x6c11e820, 0x2db9e: 0x6c11ea20, 0x2db9f: 0x6c123420, - 0x2dba0: 0x6c11ec20, 0x2dba1: 0x6c11ee20, 0x2dba2: 0x6c11f020, 0x2dba3: 0x6c11f220, - 0x2dba4: 0x6c11f420, 0x2dba5: 0x6c11f620, 0x2dba6: 0x6c11f820, 0x2dba7: 0x6c11fa20, - 0x2dba8: 0x6c11fc20, 0x2dba9: 0x6c11fe20, 0x2dbaa: 0x6c120020, 0x2dbab: 0x6c120220, - 0x2dbac: 0x6c120420, 0x2dbad: 0x6c203a20, 0x2dbae: 0x6c203c20, 0x2dbaf: 0x6c203e20, - 0x2dbb0: 0x6c204020, 0x2dbb1: 0x6c204220, 0x2dbb2: 0x6c204420, 0x2dbb3: 0x6c204620, - 0x2dbb4: 0x6c204820, 0x2dbb5: 0x6c204a20, 0x2dbb6: 0x6c204c20, 0x2dbb7: 0x6c204e20, - 0x2dbb8: 0x6c211820, 0x2dbb9: 0x6c205020, 0x2dbba: 0x6c205220, 0x2dbbb: 0x6c205420, - 0x2dbbc: 0x6c205620, 0x2dbbd: 0x6c205820, 0x2dbbe: 0x6c205a20, 0x2dbbf: 0x6c341c20, - // Block 0xb6f, offset 0x2dbc0 - 0x2dbc0: 0x6c205c20, 0x2dbc1: 0x6c205e20, 0x2dbc2: 0x6c206020, 0x2dbc3: 0x6c206220, - 0x2dbc4: 0x6c206420, 0x2dbc5: 0x6c206620, 0x2dbc6: 0x6c206820, 0x2dbc7: 0x6c206a20, - 0x2dbc8: 0x6c206c20, 0x2dbc9: 0x6c206e20, 0x2dbca: 0x6c207020, 0x2dbcb: 0x6c207220, - 0x2dbcc: 0x6c207420, 0x2dbcd: 0x6c207620, 0x2dbce: 0x6c207820, 0x2dbcf: 0x6c207a20, - 0x2dbd0: 0x6c207c20, 0x2dbd1: 0x6c207e20, 0x2dbd2: 0x6c208020, 0x2dbd3: 0x6c208220, - 0x2dbd4: 0x6c208420, 0x2dbd5: 0x6c208620, 0x2dbd6: 0x6c208820, 0x2dbd7: 0x6c208a20, - 0x2dbd8: 0x6c208c20, 0x2dbd9: 0x6c208e20, 0x2dbda: 0x6c209020, 0x2dbdb: 0x6c209220, - 0x2dbdc: 0x6c209420, 0x2dbdd: 0x6c209620, 0x2dbde: 0x6c209820, 0x2dbdf: 0x6c209a20, - 0x2dbe0: 0x6c209c20, 0x2dbe1: 0x6c209e20, 0x2dbe2: 0x6c20a020, 0x2dbe3: 0x6c20a220, - 0x2dbe4: 0x6c20a420, 0x2dbe5: 0x6c20a620, 0x2dbe6: 0x6c343a20, 0x2dbe7: 0x6c343c20, - 0x2dbe8: 0x6c343e20, 0x2dbe9: 0x6c344020, 0x2dbea: 0x6c344220, 0x2dbeb: 0x6c344420, - 0x2dbec: 0x6c344620, 0x2dbed: 0x6c344820, 0x2dbee: 0x6c344a20, 0x2dbef: 0x6c344c20, - 0x2dbf0: 0x6c344e20, 0x2dbf1: 0x6c345020, 0x2dbf2: 0x6c345220, 0x2dbf3: 0x6c345420, - 0x2dbf4: 0x6c345620, 0x2dbf5: 0x6c345820, 0x2dbf6: 0x6c345a20, 0x2dbf7: 0x6c345c20, - 0x2dbf8: 0x6c345e20, 0x2dbf9: 0x6c346020, 0x2dbfa: 0x6c346220, 0x2dbfb: 0x6c346420, - 0x2dbfc: 0x6c346620, 0x2dbfd: 0x6c346820, 0x2dbfe: 0x6c346a20, 0x2dbff: 0x6c346c20, - // Block 0xb70, offset 0x2dc00 - 0x2dc00: 0x6c346e20, 0x2dc01: 0x6c347020, 0x2dc02: 0x6c347220, 0x2dc03: 0x6c347420, - 0x2dc04: 0x6c347620, 0x2dc05: 0x6c347820, 0x2dc06: 0x6c347a20, 0x2dc07: 0x6c347c20, - 0x2dc08: 0x6c347e20, 0x2dc09: 0x6c348020, 0x2dc0a: 0x6c348220, 0x2dc0b: 0x6c348420, - 0x2dc0c: 0x6c348620, 0x2dc0d: 0x6c348820, 0x2dc0e: 0x6c348a20, 0x2dc0f: 0x6c4ef420, - 0x2dc10: 0x6c348c20, 0x2dc11: 0x6c348e20, 0x2dc12: 0x6c349020, 0x2dc13: 0x6c349220, - 0x2dc14: 0x6c349420, 0x2dc15: 0x6c349620, 0x2dc16: 0x6c349820, 0x2dc17: 0x6c349a20, - 0x2dc18: 0x6c349c20, 0x2dc19: 0x6c349e20, 0x2dc1a: 0x6c34a020, 0x2dc1b: 0x6c34a220, - 0x2dc1c: 0x6c4ef620, 0x2dc1d: 0x6c34a420, 0x2dc1e: 0x6c34a620, 0x2dc1f: 0x6c34a820, - 0x2dc20: 0x6c34aa20, 0x2dc21: 0x6c34ac20, 0x2dc22: 0x6c34ae20, 0x2dc23: 0x6c34b020, - 0x2dc24: 0x6c34b220, 0x2dc25: 0x6c34b420, 0x2dc26: 0x6c34b620, 0x2dc27: 0x6c34b820, - 0x2dc28: 0x6c34ba20, 0x2dc29: 0x6c34bc20, 0x2dc2a: 0x6c4f1420, 0x2dc2b: 0x6c4f1620, - 0x2dc2c: 0x6c4f1820, 0x2dc2d: 0x6c4f1a20, 0x2dc2e: 0x6c4f1c20, 0x2dc2f: 0x6c4f1e20, - 0x2dc30: 0x6c4f2020, 0x2dc31: 0x6c4f2220, 0x2dc32: 0x6c70d020, 0x2dc33: 0x6c70d220, - 0x2dc34: 0x6c4f2420, 0x2dc35: 0x6c4f2620, 0x2dc36: 0x6c4f2820, 0x2dc37: 0x6c4f2a20, - 0x2dc38: 0x6c4f2c20, 0x2dc39: 0x6c4f2e20, 0x2dc3a: 0x6c4f3020, 0x2dc3b: 0x6c4f3220, - 0x2dc3c: 0x6c4f3420, 0x2dc3d: 0x6c4f3620, 0x2dc3e: 0x6c4f3820, 0x2dc3f: 0x6c70d420, - // Block 0xb71, offset 0x2dc40 - 0x2dc40: 0x6c4f3a20, 0x2dc41: 0x6c4f3c20, 0x2dc42: 0x6c4f3e20, 0x2dc43: 0x6c4f4020, - 0x2dc44: 0x6c4f4220, 0x2dc45: 0x6c4f4420, 0x2dc46: 0x6c4f4620, 0x2dc47: 0x6c4f4820, - 0x2dc48: 0x6c70d620, 0x2dc49: 0x6c4f4a20, 0x2dc4a: 0x6c4f4c20, 0x2dc4b: 0x6c4f4e20, - 0x2dc4c: 0x6c4f5020, 0x2dc4d: 0x6c4f5220, 0x2dc4e: 0x6c4f5420, 0x2dc4f: 0x6c4f5620, - 0x2dc50: 0x6c70d820, 0x2dc51: 0x6c4f5820, 0x2dc52: 0x6c4f5a20, 0x2dc53: 0x6c4f5c20, - 0x2dc54: 0x6c4f5e20, 0x2dc55: 0x6c4f6020, 0x2dc56: 0x6c4f6220, 0x2dc57: 0x6c4f6420, - 0x2dc58: 0x6c4f6620, 0x2dc59: 0x6c70da20, 0x2dc5a: 0x6c70dc20, 0x2dc5b: 0x6c70de20, - 0x2dc5c: 0x6c4f6820, 0x2dc5d: 0x6c4f6a20, 0x2dc5e: 0x6c4f6c20, 0x2dc5f: 0x6c4f6e20, - 0x2dc60: 0x6c4f7020, 0x2dc61: 0x6c4f7220, 0x2dc62: 0x6c4f7420, 0x2dc63: 0x6c4f7620, - 0x2dc64: 0x6c4f7820, 0x2dc65: 0x6c4f7a20, 0x2dc66: 0x6c4f7c20, 0x2dc67: 0x6c4f7e20, - 0x2dc68: 0x6c70ec20, 0x2dc69: 0x6c70ee20, 0x2dc6a: 0x6c70f020, 0x2dc6b: 0x6c70f220, - 0x2dc6c: 0x6c70f420, 0x2dc6d: 0x6c70f620, 0x2dc6e: 0x6c70f820, 0x2dc6f: 0x6c70fa20, - 0x2dc70: 0x6c70fc20, 0x2dc71: 0x6c70fe20, 0x2dc72: 0x6c98e420, 0x2dc73: 0x6c710020, - 0x2dc74: 0x6c710220, 0x2dc75: 0x6c710420, 0x2dc76: 0x6c710620, 0x2dc77: 0x6c710820, - 0x2dc78: 0x6c710a20, 0x2dc79: 0x6c710c20, 0x2dc7a: 0x6c710e20, 0x2dc7b: 0x6c98e620, - 0x2dc7c: 0x6c711020, 0x2dc7d: 0x6c711220, 0x2dc7e: 0x6c711420, 0x2dc7f: 0x6c711620, - // Block 0xb72, offset 0x2dc80 - 0x2dc80: 0x6c711820, 0x2dc81: 0x6c711a20, 0x2dc82: 0x6c711c20, 0x2dc83: 0x6c711e20, - 0x2dc84: 0x6c712020, 0x2dc85: 0x6c712220, 0x2dc86: 0x6c712420, 0x2dc87: 0x6c712620, - 0x2dc88: 0x6c712820, 0x2dc89: 0x6c712a20, 0x2dc8a: 0x6c712c20, 0x2dc8b: 0x6c712e20, - 0x2dc8c: 0x6c713020, 0x2dc8d: 0x6c713220, 0x2dc8e: 0x6c713420, 0x2dc8f: 0x6c713620, - 0x2dc90: 0x6c713820, 0x2dc91: 0x6c713a20, 0x2dc92: 0x6c713c20, 0x2dc93: 0x6c713e20, - 0x2dc94: 0x6c714020, 0x2dc95: 0x6c714220, 0x2dc96: 0x6c714420, 0x2dc97: 0x6c714620, - 0x2dc98: 0x6c714820, 0x2dc99: 0x6c714a20, 0x2dc9a: 0x6c714c20, 0x2dc9b: 0x6c714e20, - 0x2dc9c: 0x6c715020, 0x2dc9d: 0x6c715220, 0x2dc9e: 0x6c715420, 0x2dc9f: 0x6c715620, - 0x2dca0: 0x6c715820, 0x2dca1: 0x6c715a20, 0x2dca2: 0x6c715c20, 0x2dca3: 0x6c715e20, - 0x2dca4: 0x6c716020, 0x2dca5: 0x6c990620, 0x2dca6: 0x6c990820, 0x2dca7: 0x6c990a20, - 0x2dca8: 0x6c990c20, 0x2dca9: 0x6c990e20, 0x2dcaa: 0x6c991020, 0x2dcab: 0x6c991220, - 0x2dcac: 0x6c991420, 0x2dcad: 0x6c991620, 0x2dcae: 0x6c991820, 0x2dcaf: 0x6c991a20, - 0x2dcb0: 0x6c991c20, 0x2dcb1: 0x6c991e20, 0x2dcb2: 0x6c992020, 0x2dcb3: 0x6c992220, - 0x2dcb4: 0x6c992420, 0x2dcb5: 0x6c992620, 0x2dcb6: 0x6c992820, 0x2dcb7: 0x6c992a20, - 0x2dcb8: 0x6c992c20, 0x2dcb9: 0x6c992e20, 0x2dcba: 0x6c993020, 0x2dcbb: 0x6c993220, - 0x2dcbc: 0x6c993420, 0x2dcbd: 0x6c993620, 0x2dcbe: 0x6c993820, 0x2dcbf: 0x6c993a20, - // Block 0xb73, offset 0x2dcc0 - 0x2dcc0: 0x6c993c20, 0x2dcc1: 0x6c993e20, 0x2dcc2: 0x6c994020, 0x2dcc3: 0x6c994220, - 0x2dcc4: 0x6c994420, 0x2dcc5: 0x6c994620, 0x2dcc6: 0x6c994820, 0x2dcc7: 0x6c994a20, - 0x2dcc8: 0x6c994c20, 0x2dcc9: 0x6c994e20, 0x2dcca: 0x6c995020, 0x2dccb: 0x6c995220, - 0x2dccc: 0x6cc4be20, 0x2dccd: 0x6c995420, 0x2dcce: 0x6c995620, 0x2dccf: 0x6c995820, - 0x2dcd0: 0x6c995a20, 0x2dcd1: 0x6c995c20, 0x2dcd2: 0x6c995e20, 0x2dcd3: 0x6c996020, - 0x2dcd4: 0x6cc4c020, 0x2dcd5: 0x6c996220, 0x2dcd6: 0x6c996420, 0x2dcd7: 0x6c996620, - 0x2dcd8: 0x6c996820, 0x2dcd9: 0x6c996a20, 0x2dcda: 0x6c996c20, 0x2dcdb: 0x6c996e20, - 0x2dcdc: 0x6c997020, 0x2dcdd: 0x6c997220, 0x2dcde: 0x6c997420, 0x2dcdf: 0x6c997620, - 0x2dce0: 0x6c997820, 0x2dce1: 0x6c997a20, 0x2dce2: 0x6c997c20, 0x2dce3: 0x6cc4c220, - 0x2dce4: 0x6c997e20, 0x2dce5: 0x6c998020, 0x2dce6: 0x6c998220, 0x2dce7: 0x6c998420, - 0x2dce8: 0x6c998620, 0x2dce9: 0x6c998820, 0x2dcea: 0x6c998a20, 0x2dceb: 0x6c998c20, - 0x2dcec: 0x6c998e20, 0x2dced: 0x6c999020, 0x2dcee: 0x6c999220, 0x2dcef: 0x6c999420, - 0x2dcf0: 0x6cc4c420, 0x2dcf1: 0x6cc4c620, 0x2dcf2: 0x6c9a9220, 0x2dcf3: 0x6c999620, - 0x2dcf4: 0x6c999820, 0x2dcf5: 0x6c999a20, 0x2dcf6: 0x6c999c20, 0x2dcf7: 0x6c999e20, - 0x2dcf8: 0x6c99a020, 0x2dcf9: 0x6c99a220, 0x2dcfa: 0x6c99a420, 0x2dcfb: 0x6c99a620, - 0x2dcfc: 0x6c99a820, 0x2dcfd: 0x6c99aa20, 0x2dcfe: 0x6cc4e220, 0x2dcff: 0x6cc4e420, - // Block 0xb74, offset 0x2dd00 - 0x2dd00: 0x6cc4e620, 0x2dd01: 0x6cc4e820, 0x2dd02: 0x6cc4ea20, 0x2dd03: 0x6cc4ec20, - 0x2dd04: 0x6cc4ee20, 0x2dd05: 0x6cf51c20, 0x2dd06: 0x6cc4f020, 0x2dd07: 0x6cc4f220, - 0x2dd08: 0x6cc4f420, 0x2dd09: 0x6cc4f620, 0x2dd0a: 0x6cc4f820, 0x2dd0b: 0x6cc4fa20, - 0x2dd0c: 0x6cc4fc20, 0x2dd0d: 0x6cc4fe20, 0x2dd0e: 0x6cc50020, 0x2dd0f: 0x6cc50220, - 0x2dd10: 0x6cc50420, 0x2dd11: 0x6cc50620, 0x2dd12: 0x6cc50820, 0x2dd13: 0x6cc50a20, - 0x2dd14: 0x6cc50c20, 0x2dd15: 0x6cc50e20, 0x2dd16: 0x6cc51020, 0x2dd17: 0x6cc51220, - 0x2dd18: 0x6cc51420, 0x2dd19: 0x6cc51620, 0x2dd1a: 0x6cc51820, 0x2dd1b: 0x6cc51a20, - 0x2dd1c: 0x6cc51c20, 0x2dd1d: 0x6cc51e20, 0x2dd1e: 0x6cc52020, 0x2dd1f: 0x6cc52220, - 0x2dd20: 0x6cc52420, 0x2dd21: 0x6cc52620, 0x2dd22: 0x6cc52820, 0x2dd23: 0x6cc52a20, - 0x2dd24: 0x6c722020, 0x2dd25: 0x6cc52c20, 0x2dd26: 0x6cc52e20, 0x2dd27: 0x6cf3ac20, - 0x2dd28: 0x6cc53020, 0x2dd29: 0x6cc53220, 0x2dd2a: 0x6cc53420, 0x2dd2b: 0x6cf3ae20, - 0x2dd2c: 0x6cc53620, 0x2dd2d: 0x6cc53820, 0x2dd2e: 0x6cc53a20, 0x2dd2f: 0x6cc53c20, - 0x2dd30: 0x6cc53e20, 0x2dd31: 0x6cf3b020, 0x2dd32: 0x6cc54020, 0x2dd33: 0x6cc54220, - 0x2dd34: 0x6cc54420, 0x2dd35: 0x6cc54620, 0x2dd36: 0x6cc54820, 0x2dd37: 0x6cc54a20, - 0x2dd38: 0x6cc54c20, 0x2dd39: 0x6cc54e20, 0x2dd3a: 0x6cc55020, 0x2dd3b: 0x6cc55220, - 0x2dd3c: 0x6cc55420, 0x2dd3d: 0x6cc55620, 0x2dd3e: 0x6cc55820, 0x2dd3f: 0x6cc55a20, - // Block 0xb75, offset 0x2dd40 - 0x2dd40: 0x6cc55c20, 0x2dd41: 0x6cc55e20, 0x2dd42: 0x6cc56020, 0x2dd43: 0x6cc56220, - 0x2dd44: 0x6cc56420, 0x2dd45: 0x6cc56620, 0x2dd46: 0x6cf3da20, 0x2dd47: 0x6cf3dc20, - 0x2dd48: 0x6cf3de20, 0x2dd49: 0x6cf3e020, 0x2dd4a: 0x6cf3e220, 0x2dd4b: 0x6cf3e420, - 0x2dd4c: 0x6cf3e620, 0x2dd4d: 0x6cf3e820, 0x2dd4e: 0x6cf3ea20, 0x2dd4f: 0x6cf3ec20, - 0x2dd50: 0x6cf3ee20, 0x2dd51: 0x6cf3f020, 0x2dd52: 0x6cf3f220, 0x2dd53: 0x6cf3f420, - 0x2dd54: 0x6cf3f620, 0x2dd55: 0x6cf3f820, 0x2dd56: 0x6cf3fa20, 0x2dd57: 0x6cf3fc20, - 0x2dd58: 0x6cf3fe20, 0x2dd59: 0x6cf40020, 0x2dd5a: 0x6cf40220, 0x2dd5b: 0x6cf40420, - 0x2dd5c: 0x6cf40620, 0x2dd5d: 0x6cf40820, 0x2dd5e: 0x6cf40a20, 0x2dd5f: 0x6cf40c20, - 0x2dd60: 0x6cf40e20, 0x2dd61: 0x6cf41020, 0x2dd62: 0x6cf41220, 0x2dd63: 0x6cf41420, - 0x2dd64: 0x6cf41620, 0x2dd65: 0x6cf41820, 0x2dd66: 0x6cf41a20, 0x2dd67: 0x6cf41c20, - 0x2dd68: 0x6cf41e20, 0x2dd69: 0x6cf42020, 0x2dd6a: 0x6cf42220, 0x2dd6b: 0x6d236a20, - 0x2dd6c: 0x6cf42420, 0x2dd6d: 0x6cf42620, 0x2dd6e: 0x6cf42820, 0x2dd6f: 0x6cf42a20, - 0x2dd70: 0x6cf42c20, 0x2dd71: 0x6cf51e20, 0x2dd72: 0x6cf42e20, 0x2dd73: 0x6cf43020, - 0x2dd74: 0x6d236c20, 0x2dd75: 0x6cf43220, 0x2dd76: 0x6cf43420, 0x2dd77: 0x6cf43620, - 0x2dd78: 0x6cf43820, 0x2dd79: 0x6cf43a20, 0x2dd7a: 0x6cf43c20, 0x2dd7b: 0x6d236e20, - 0x2dd7c: 0x6cf43e20, 0x2dd7d: 0x6cf44020, 0x2dd7e: 0x6cf44220, 0x2dd7f: 0x6d237020, - // Block 0xb76, offset 0x2dd80 - 0x2dd80: 0x6cf44420, 0x2dd81: 0x6cf44620, 0x2dd82: 0x6cf44820, 0x2dd83: 0x6cf44a20, - 0x2dd84: 0x6cf44c20, 0x2dd85: 0x6cf44e20, 0x2dd86: 0x6cf45020, 0x2dd87: 0x6cf45220, - 0x2dd88: 0x6cf45420, 0x2dd89: 0x6cf45620, 0x2dd8a: 0x6cf45820, 0x2dd8b: 0x6d239a20, - 0x2dd8c: 0x6d239c20, 0x2dd8d: 0x6d239e20, 0x2dd8e: 0x6d23a020, 0x2dd8f: 0x6d23a220, - 0x2dd90: 0x6d23a420, 0x2dd91: 0x6d23a620, 0x2dd92: 0x6cc56820, 0x2dd93: 0x6d23a820, - 0x2dd94: 0x6d23aa20, 0x2dd95: 0x6d23ac20, 0x2dd96: 0x6d24e620, 0x2dd97: 0x6d23ae20, - 0x2dd98: 0x6d23b020, 0x2dd99: 0x6d23b220, 0x2dd9a: 0x6d23b420, 0x2dd9b: 0x6d23b620, - 0x2dd9c: 0x6d23b820, 0x2dd9d: 0x6d23ba20, 0x2dd9e: 0x6d23bc20, 0x2dd9f: 0x6d23be20, - 0x2dda0: 0x6d23c020, 0x2dda1: 0x6cc66e20, 0x2dda2: 0x6d23c220, 0x2dda3: 0x6d23c420, - 0x2dda4: 0x6d23c620, 0x2dda5: 0x6d23c820, 0x2dda6: 0x6d23ca20, 0x2dda7: 0x6d23cc20, - 0x2dda8: 0x6d510020, 0x2dda9: 0x6d510220, 0x2ddaa: 0x6d23ce20, 0x2ddab: 0x6d23d020, - 0x2ddac: 0x6d23d220, 0x2ddad: 0x6d23d420, 0x2ddae: 0x6d510420, 0x2ddaf: 0x6d510620, - 0x2ddb0: 0x6d510820, 0x2ddb1: 0x6d23d620, 0x2ddb2: 0x6d23d820, 0x2ddb3: 0x6d23da20, - 0x2ddb4: 0x6d23dc20, 0x2ddb5: 0x6d23de20, 0x2ddb6: 0x6d23e020, 0x2ddb7: 0x6d23e220, - 0x2ddb8: 0x6d23e420, 0x2ddb9: 0x6d510a20, 0x2ddba: 0x6d23e620, 0x2ddbb: 0x6d23e820, - 0x2ddbc: 0x6d23ea20, 0x2ddbd: 0x6d23ec20, 0x2ddbe: 0x6d23ee20, 0x2ddbf: 0x6d23f020, - // Block 0xb77, offset 0x2ddc0 - 0x2ddc0: 0x6d510c20, 0x2ddc1: 0x6d23f220, 0x2ddc2: 0x6d23f420, 0x2ddc3: 0x6d510e20, - 0x2ddc4: 0x6d23f620, 0x2ddc5: 0x6d512e20, 0x2ddc6: 0x6d513020, 0x2ddc7: 0x6d23f820, - 0x2ddc8: 0x6d513220, 0x2ddc9: 0x6d7cb220, 0x2ddca: 0x6d513420, 0x2ddcb: 0x6d513620, - 0x2ddcc: 0x6d513820, 0x2ddcd: 0x6d513a20, 0x2ddce: 0x6d513c20, 0x2ddcf: 0x6d513e20, - 0x2ddd0: 0x6d514020, 0x2ddd1: 0x6d514220, 0x2ddd2: 0x6d514420, 0x2ddd3: 0x6d514620, - 0x2ddd4: 0x6d514820, 0x2ddd5: 0x6d514a20, 0x2ddd6: 0x6d514c20, 0x2ddd7: 0x6d514e20, - 0x2ddd8: 0x6d515020, 0x2ddd9: 0x6d515220, 0x2ddda: 0x6d515420, 0x2dddb: 0x6d515620, - 0x2dddc: 0x6d515820, 0x2dddd: 0x6d515a20, 0x2ddde: 0x6d515c20, 0x2dddf: 0x6d515e20, - 0x2dde0: 0x6d516020, 0x2dde1: 0x6d516220, 0x2dde2: 0x6d516420, 0x2dde3: 0x6d516620, - 0x2dde4: 0x6d516820, 0x2dde5: 0x6d516a20, 0x2dde6: 0x6d24e820, 0x2dde7: 0x6d516c20, - 0x2dde8: 0x6d516e20, 0x2dde9: 0x6d517020, 0x2ddea: 0x6d517220, 0x2ddeb: 0x6d517420, - 0x2ddec: 0x6d517620, 0x2dded: 0x6d517820, 0x2ddee: 0x6d517a20, 0x2ddef: 0x6d517c20, - 0x2ddf0: 0x6d517e20, 0x2ddf1: 0x6d518020, 0x2ddf2: 0x6d518220, 0x2ddf3: 0x6d518420, - 0x2ddf4: 0x6d518620, 0x2ddf5: 0x6d518820, 0x2ddf6: 0x6d518a20, 0x2ddf7: 0x6d518c20, - 0x2ddf8: 0x6d518e20, 0x2ddf9: 0x6d519020, 0x2ddfa: 0x6d519220, 0x2ddfb: 0x6d7cc220, - 0x2ddfc: 0x6d7cc420, 0x2ddfd: 0x6d7cc620, 0x2ddfe: 0x6d7cc820, 0x2ddff: 0x6d7cca20, - // Block 0xb78, offset 0x2de00 - 0x2de00: 0x6d7ccc20, 0x2de01: 0x6d7cce20, 0x2de02: 0x6d7cd020, 0x2de03: 0x6d7cd220, - 0x2de04: 0x6d7cd420, 0x2de05: 0x6d7cd620, 0x2de06: 0x6d519420, 0x2de07: 0x6d7cd820, - 0x2de08: 0x6d7cda20, 0x2de09: 0x6d7cdc20, 0x2de0a: 0x6da47c20, 0x2de0b: 0x6d7cde20, - 0x2de0c: 0x6d7ce020, 0x2de0d: 0x6d7ce220, 0x2de0e: 0x6da47e20, 0x2de0f: 0x6d7ce420, - 0x2de10: 0x6d7ce620, 0x2de11: 0x6d7ce820, 0x2de12: 0x6d7cea20, 0x2de13: 0x6d7cec20, - 0x2de14: 0x6d7cee20, 0x2de15: 0x6d7cf020, 0x2de16: 0x6d7cf220, 0x2de17: 0x6d7cf420, - 0x2de18: 0x6da48020, 0x2de19: 0x6d7cf620, 0x2de1a: 0x6d7cf820, 0x2de1b: 0x6d7cfa20, - 0x2de1c: 0x6d7cfc20, 0x2de1d: 0x6d7cfe20, 0x2de1e: 0x6d7d0020, 0x2de1f: 0x6da48e20, - 0x2de20: 0x6da49020, 0x2de21: 0x6da49220, 0x2de22: 0x6da49420, 0x2de23: 0x6da49620, - 0x2de24: 0x6da49820, 0x2de25: 0x6dc62620, 0x2de26: 0x6da49a20, 0x2de27: 0x6dc60a20, - 0x2de28: 0x6da49c20, 0x2de29: 0x6da49e20, 0x2de2a: 0x6dc60c20, 0x2de2b: 0x6da4a020, - 0x2de2c: 0x6da4a220, 0x2de2d: 0x6da4a420, 0x2de2e: 0x6da4a620, 0x2de2f: 0x6da4a820, - 0x2de30: 0x6da4aa20, 0x2de31: 0x6da4ac20, 0x2de32: 0x6dc62820, 0x2de33: 0x6d7d9e20, - 0x2de34: 0x6dc62a20, 0x2de35: 0x6dc62c20, 0x2de36: 0x6dc62e20, 0x2de37: 0x6dc63020, - 0x2de38: 0x6dc63220, 0x2de39: 0x6dc63420, 0x2de3a: 0x6dc63620, 0x2de3b: 0x6dc63820, - 0x2de3c: 0x6dc63a20, 0x2de3d: 0x6dc63c20, 0x2de3e: 0x6dc63e20, 0x2de3f: 0x6dc64020, - // Block 0xb79, offset 0x2de40 - 0x2de40: 0x6de2e820, 0x2de41: 0x6dc64220, 0x2de42: 0x6dc64420, 0x2de43: 0x6dc64620, - 0x2de44: 0x6dc64820, 0x2de45: 0x6dc64a20, 0x2de46: 0x6dc64c20, 0x2de47: 0x6de2ee20, - 0x2de48: 0x6de2f020, 0x2de49: 0x6de2f220, 0x2de4a: 0x6de2f420, 0x2de4b: 0x6de2f620, - 0x2de4c: 0x6de2f820, 0x2de4d: 0x6de2fa20, 0x2de4e: 0x6de2fc20, 0x2de4f: 0x6de2fe20, - 0x2de50: 0x6de30020, 0x2de51: 0x6e0dee20, 0x2de52: 0x6de30220, 0x2de53: 0x6dfa6220, - 0x2de54: 0x6dfa6420, 0x2de55: 0x6dfa6620, 0x2de56: 0x6dfa6820, 0x2de57: 0x6dfa6a20, - 0x2de58: 0x6dfa6c20, 0x2de59: 0x6dfa6e20, 0x2de5a: 0x6dfa7020, 0x2de5b: 0x6e0df820, - 0x2de5c: 0x6e0dfa20, 0x2de5d: 0x6e0dfc20, 0x2de5e: 0x6e1d5620, 0x2de5f: 0x6e1d5820, - 0x2de60: 0x6e1d5a20, 0x2de61: 0x6e1d5c20, 0x2de62: 0x6e1d5e20, 0x2de63: 0x6e28f620, - 0x2de64: 0x6e1d6020, 0x2de65: 0x6e28fe20, 0x2de66: 0x6e1d6220, 0x2de67: 0x6e1d6420, - 0x2de68: 0x6e290020, 0x2de69: 0x6e290220, 0x2de6a: 0x6e290420, 0x2de6b: 0x6e290620, - 0x2de6c: 0x6e322620, 0x2de6d: 0x6e322820, 0x2de6e: 0x6e389420, 0x2de6f: 0x6c047e20, - 0x2de70: 0x6c123620, 0x2de71: 0x6c502a20, 0x2de72: 0x6cc67220, 0x2de73: 0x6d7da020, - 0x2de74: 0x6c048020, 0x2de75: 0x6c048220, 0x2de76: 0x6c123a20, 0x2de77: 0x6c123c20, - 0x2de78: 0x6c212020, 0x2de79: 0x6c212220, 0x2de7a: 0x6c212420, 0x2de7b: 0x6c212620, - 0x2de7c: 0x6c212820, 0x2de7d: 0x6c354420, 0x2de7e: 0x6c354620, 0x2de7f: 0x6c503220, - // Block 0xb7a, offset 0x2de80 - 0x2de80: 0x6c503c20, 0x2de81: 0x6c503e20, 0x2de82: 0x6c504020, 0x2de83: 0x6c504220, - 0x2de84: 0x6c504420, 0x2de85: 0x6c504620, 0x2de86: 0x6c723c20, 0x2de87: 0x6c723e20, - 0x2de88: 0x6c724020, 0x2de89: 0x6c724220, 0x2de8a: 0x6c724420, 0x2de8b: 0x6c724620, - 0x2de8c: 0x6c724820, 0x2de8d: 0x6c9aac20, 0x2de8e: 0x6c9aae20, 0x2de8f: 0x6c9ab020, - 0x2de90: 0x6c9ab220, 0x2de91: 0x6c9ab420, 0x2de92: 0x6c9ab620, 0x2de93: 0x6c9ab820, - 0x2de94: 0x6c9aba20, 0x2de95: 0x6c9abc20, 0x2de96: 0x6c9abe20, 0x2de97: 0x6c9ac020, - 0x2de98: 0x6c9ac220, 0x2de99: 0x6c9ac420, 0x2de9a: 0x6c9ac620, 0x2de9b: 0x6c9ac820, - 0x2de9c: 0x6cc69a20, 0x2de9d: 0x6c9b1420, 0x2de9e: 0x6cc69c20, 0x2de9f: 0x6cc69e20, - 0x2dea0: 0x6cc6a020, 0x2dea1: 0x6cc6a220, 0x2dea2: 0x6cc6a420, 0x2dea3: 0x6cc6a620, - 0x2dea4: 0x6cc6a820, 0x2dea5: 0x6cc6aa20, 0x2dea6: 0x6cc6ac20, 0x2dea7: 0x6cc6ae20, - 0x2dea8: 0x6cc6b020, 0x2dea9: 0x6cc6b220, 0x2deaa: 0x6cc6b420, 0x2deab: 0x6cf53620, - 0x2deac: 0x6cf53820, 0x2dead: 0x6cf52a20, 0x2deae: 0x6cf53a20, 0x2deaf: 0x6cf53c20, - 0x2deb0: 0x6cf53e20, 0x2deb1: 0x6d24f820, 0x2deb2: 0x6d24fa20, 0x2deb3: 0x6d24fc20, - 0x2deb4: 0x6d7dac20, 0x2deb5: 0x6d527820, 0x2deb6: 0x6d527a20, 0x2deb7: 0x6d527c20, - 0x2deb8: 0x6d527e20, 0x2deb9: 0x6d528020, 0x2deba: 0x6d528220, 0x2debb: 0x6d528420, - 0x2debc: 0x6d7db620, 0x2debd: 0x6d7db820, 0x2debe: 0x6d7dba20, 0x2debf: 0x6d7dbc20, - // Block 0xb7b, offset 0x2dec0 - 0x2dec0: 0x6da51420, 0x2dec1: 0x6da51620, 0x2dec2: 0x6da51820, 0x2dec3: 0x6da53e20, - 0x2dec4: 0x6de35a20, 0x2dec5: 0x6dfab420, 0x2dec6: 0x6dfab620, 0x2dec7: 0x6c048420, - 0x2dec8: 0x6c213c20, 0x2dec9: 0x6c357620, 0x2deca: 0x6c728e20, 0x2decb: 0x6c729020, - 0x2decc: 0x6cc70220, 0x2decd: 0x6c9b1620, 0x2dece: 0x6c9b1820, 0x2decf: 0x6c9b1a20, - 0x2ded0: 0x6cc70420, 0x2ded1: 0x6cc70620, 0x2ded2: 0x6cf58e20, 0x2ded3: 0x6d7e0420, - 0x2ded4: 0x6dc6dc20, 0x2ded5: 0x6e0e3c20, 0x2ded6: 0x6e292620, 0x2ded7: 0x6c048620, - 0x2ded8: 0x6c214220, 0x2ded9: 0x6c729c20, 0x2deda: 0x6c729e20, 0x2dedb: 0x6c9b2a20, - 0x2dedc: 0x6c9b2c20, 0x2dedd: 0x6cc71620, 0x2dede: 0x6cc72220, 0x2dedf: 0x6cf59820, - 0x2dee0: 0x6d254820, 0x2dee1: 0x6d254a20, 0x2dee2: 0x6d7e0a20, 0x2dee3: 0x6da54420, - 0x2dee4: 0x6c048a20, 0x2dee5: 0x6c095220, 0x2dee6: 0x6c358a20, 0x2dee7: 0x6c358c20, - 0x2dee8: 0x6c358e20, 0x2dee9: 0x6c359020, 0x2deea: 0x6c508620, 0x2deeb: 0x6c508820, - 0x2deec: 0x6c9b3820, 0x2deed: 0x6c9b3a20, 0x2deee: 0x6cc72620, 0x2deef: 0x6cc72820, - 0x2def0: 0x6cf5a220, 0x2def1: 0x6cc74220, 0x2def2: 0x6d255820, 0x2def3: 0x6d52d820, - 0x2def4: 0x6d7e0c20, 0x2def5: 0x6da54c20, 0x2def6: 0x6da54e20, 0x2def7: 0x6dc6e020, - 0x2def8: 0x6e38a220, 0x2def9: 0x6c048e20, 0x2defa: 0x6c35a020, 0x2defb: 0x6c35a220, - 0x2defc: 0x6c35a420, 0x2defd: 0x6c509020, 0x2defe: 0x6c509220, 0x2deff: 0x6c509420, - // Block 0xb7c, offset 0x2df00 - 0x2df00: 0x6c509620, 0x2df01: 0x6c72bc20, 0x2df02: 0x6c72be20, 0x2df03: 0x6c72c020, - 0x2df04: 0x6c72c220, 0x2df05: 0x6c72c420, 0x2df06: 0x6c72c620, 0x2df07: 0x6c9b4820, - 0x2df08: 0x6c9b4a20, 0x2df09: 0x6c9b4c20, 0x2df0a: 0x6c72c820, 0x2df0b: 0x6c9b4e20, - 0x2df0c: 0x6c9b5020, 0x2df0d: 0x6c9b5220, 0x2df0e: 0x6c9b5420, 0x2df0f: 0x6c9b5620, - 0x2df10: 0x6cc74620, 0x2df11: 0x6cc74820, 0x2df12: 0x6cf5b620, 0x2df13: 0x6cf5b820, - 0x2df14: 0x6cf5ba20, 0x2df15: 0x6cf5bc20, 0x2df16: 0x6d256420, 0x2df17: 0x6d256620, - 0x2df18: 0x6d7e1c20, 0x2df19: 0x6d7e1e20, 0x2df1a: 0x6da55a20, 0x2df1b: 0x6dc6ec20, - 0x2df1c: 0x6de37820, 0x2df1d: 0x6de37a20, 0x2df1e: 0x6de37c20, 0x2df1f: 0x6dfad820, - 0x2df20: 0x6c049020, 0x2df21: 0x6c049220, 0x2df22: 0x6c50ac20, 0x2df23: 0x6c9b6e20, - 0x2df24: 0x6cf5ce20, 0x2df25: 0x6c049620, 0x2df26: 0x6c095420, 0x2df27: 0x6c095620, - 0x2df28: 0x6c125020, 0x2df29: 0x6c125220, 0x2df2a: 0x6c125420, 0x2df2b: 0x6c125620, - 0x2df2c: 0x6c125820, 0x2df2d: 0x6c125a20, 0x2df2e: 0x6c125c20, 0x2df2f: 0x6c125e20, - 0x2df30: 0x6c215c20, 0x2df31: 0x6c215e20, 0x2df32: 0x6c216020, 0x2df33: 0x6c216220, - 0x2df34: 0x6c216420, 0x2df35: 0x6c216620, 0x2df36: 0x6c216820, 0x2df37: 0x6c216a20, - 0x2df38: 0x6c216c20, 0x2df39: 0x6c35b620, 0x2df3a: 0x6c35b820, 0x2df3b: 0x6c35ba20, - 0x2df3c: 0x6c35bc20, 0x2df3d: 0x6c35be20, 0x2df3e: 0x6c35c020, 0x2df3f: 0x6c35c220, - // Block 0xb7d, offset 0x2df40 - 0x2df40: 0x6c35c420, 0x2df41: 0x6c35c620, 0x2df42: 0x6c35c820, 0x2df43: 0x6c35ca20, - 0x2df44: 0x6c35cc20, 0x2df45: 0x6c35ce20, 0x2df46: 0x6c35d020, 0x2df47: 0x6c35d220, - 0x2df48: 0x6c35d420, 0x2df49: 0x6c35d620, 0x2df4a: 0x6c35d820, 0x2df4b: 0x6c35da20, - 0x2df4c: 0x6c35dc20, 0x2df4d: 0x6c35de20, 0x2df4e: 0x6c35e020, 0x2df4f: 0x6c35e220, - 0x2df50: 0x6c35e420, 0x2df51: 0x6c35e620, 0x2df52: 0x6c35e820, 0x2df53: 0x6c35ea20, - 0x2df54: 0x6c35ec20, 0x2df55: 0x6c35ee20, 0x2df56: 0x6c35f020, 0x2df57: 0x6c35f220, - 0x2df58: 0x6c35f420, 0x2df59: 0x6c35f620, 0x2df5a: 0x6c50c420, 0x2df5b: 0x6c50c620, - 0x2df5c: 0x6c50c820, 0x2df5d: 0x6c50ca20, 0x2df5e: 0x6c50cc20, 0x2df5f: 0x6c50ce20, - 0x2df60: 0x6c50d020, 0x2df61: 0x6c50d220, 0x2df62: 0x6c50d420, 0x2df63: 0x6c50d620, - 0x2df64: 0x6c50d820, 0x2df65: 0x6c50da20, 0x2df66: 0x6c50dc20, 0x2df67: 0x6c50de20, - 0x2df68: 0x6c50e020, 0x2df69: 0x6c50e220, 0x2df6a: 0x6c50e420, 0x2df6b: 0x6c50e620, - 0x2df6c: 0x6c50e820, 0x2df6d: 0x6c50ea20, 0x2df6e: 0x6c50ec20, 0x2df6f: 0x6c50ee20, - 0x2df70: 0x6c50f020, 0x2df71: 0x6c50f220, 0x2df72: 0x6c50f420, 0x2df73: 0x6c50f620, - 0x2df74: 0x6c50f820, 0x2df75: 0x6c50fa20, 0x2df76: 0x6c50fc20, 0x2df77: 0x6c50fe20, - 0x2df78: 0x6c510020, 0x2df79: 0x6c510220, 0x2df7a: 0x6c510420, 0x2df7b: 0x6c510620, - 0x2df7c: 0x6c510820, 0x2df7d: 0x6c510a20, 0x2df7e: 0x6c510c20, 0x2df7f: 0x6c510e20, - // Block 0xb7e, offset 0x2df80 - 0x2df80: 0x6c730420, 0x2df81: 0x6c730620, 0x2df82: 0x6c730820, 0x2df83: 0x6c730a20, - 0x2df84: 0x6c730c20, 0x2df85: 0x6c730e20, 0x2df86: 0x6c731020, 0x2df87: 0x6c731220, - 0x2df88: 0x6c731420, 0x2df89: 0x6c731620, 0x2df8a: 0x6c731820, 0x2df8b: 0x6c731a20, - 0x2df8c: 0x6c731c20, 0x2df8d: 0x6c731e20, 0x2df8e: 0x6c732020, 0x2df8f: 0x6c732220, - 0x2df90: 0x6c732420, 0x2df91: 0x6c732620, 0x2df92: 0x6c732820, 0x2df93: 0x6c732a20, - 0x2df94: 0x6c732c20, 0x2df95: 0x6c732e20, 0x2df96: 0x6c733020, 0x2df97: 0x6c9b7e20, - 0x2df98: 0x6c9b8020, 0x2df99: 0x6c9b8220, 0x2df9a: 0x6c9b8420, 0x2df9b: 0x6c9b8620, - 0x2df9c: 0x6c9b8820, 0x2df9d: 0x6c9b8a20, 0x2df9e: 0x6c9b8c20, 0x2df9f: 0x6c738c20, - 0x2dfa0: 0x6c738e20, 0x2dfa1: 0x6c9b8e20, 0x2dfa2: 0x6c9b9020, 0x2dfa3: 0x6c9b9220, - 0x2dfa4: 0x6c9b9420, 0x2dfa5: 0x6c9b9620, 0x2dfa6: 0x6c9b9820, 0x2dfa7: 0x6c9b9a20, - 0x2dfa8: 0x6c9b9c20, 0x2dfa9: 0x6c9b9e20, 0x2dfaa: 0x6cc78620, 0x2dfab: 0x6cc78820, - 0x2dfac: 0x6cc78a20, 0x2dfad: 0x6cc78c20, 0x2dfae: 0x6cc78e20, 0x2dfaf: 0x6cc79020, - 0x2dfb0: 0x6cc79220, 0x2dfb1: 0x6cc79420, 0x2dfb2: 0x6cc79620, 0x2dfb3: 0x6cc79820, - 0x2dfb4: 0x6cc79a20, 0x2dfb5: 0x6cc79c20, 0x2dfb6: 0x6cc79e20, 0x2dfb7: 0x6cc7a020, - 0x2dfb8: 0x6cf5d620, 0x2dfb9: 0x6cc7a220, 0x2dfba: 0x6cc7a420, 0x2dfbb: 0x6cc7a620, - 0x2dfbc: 0x6cc7a820, 0x2dfbd: 0x6cc7aa20, 0x2dfbe: 0x6cc7ac20, 0x2dfbf: 0x6cc7ae20, - // Block 0xb7f, offset 0x2dfc0 - 0x2dfc0: 0x6cc7b020, 0x2dfc1: 0x6cc7b220, 0x2dfc2: 0x6cc7b420, 0x2dfc3: 0x6cc7b620, - 0x2dfc4: 0x6cf5f020, 0x2dfc5: 0x6cf5f220, 0x2dfc6: 0x6cf5f420, 0x2dfc7: 0x6cf5f620, - 0x2dfc8: 0x6cf5f820, 0x2dfc9: 0x6cf5fa20, 0x2dfca: 0x6cf5fc20, 0x2dfcb: 0x6cf5fe20, - 0x2dfcc: 0x6cf60020, 0x2dfcd: 0x6cf60220, 0x2dfce: 0x6cf60420, 0x2dfcf: 0x6cf60620, - 0x2dfd0: 0x6cf60820, 0x2dfd1: 0x6cc7b820, 0x2dfd2: 0x6cf60a20, 0x2dfd3: 0x6cf60c20, - 0x2dfd4: 0x6cf60e20, 0x2dfd5: 0x6cf61020, 0x2dfd6: 0x6cf61220, 0x2dfd7: 0x6cf61420, - 0x2dfd8: 0x6cf61620, 0x2dfd9: 0x6cf61820, 0x2dfda: 0x6d257e20, 0x2dfdb: 0x6d258020, - 0x2dfdc: 0x6d258220, 0x2dfdd: 0x6d258420, 0x2dfde: 0x6d258620, 0x2dfdf: 0x6d258820, - 0x2dfe0: 0x6d258a20, 0x2dfe1: 0x6d258c20, 0x2dfe2: 0x6d258e20, 0x2dfe3: 0x6d259020, - 0x2dfe4: 0x6d259220, 0x2dfe5: 0x6d259420, 0x2dfe6: 0x6d259620, 0x2dfe7: 0x6d259820, - 0x2dfe8: 0x6d259a20, 0x2dfe9: 0x6d530020, 0x2dfea: 0x6d530220, 0x2dfeb: 0x6d530420, - 0x2dfec: 0x6d530620, 0x2dfed: 0x6d530820, 0x2dfee: 0x6d530a20, 0x2dfef: 0x6d530c20, - 0x2dff0: 0x6d530e20, 0x2dff1: 0x6d531020, 0x2dff2: 0x6d531220, 0x2dff3: 0x6d531420, - 0x2dff4: 0x6d531620, 0x2dff5: 0x6d531820, 0x2dff6: 0x6d531a20, 0x2dff7: 0x6d531c20, - 0x2dff8: 0x6d7e4420, 0x2dff9: 0x6d7e4620, 0x2dffa: 0x6d7e4820, 0x2dffb: 0x6d7e4a20, - 0x2dffc: 0x6d537220, 0x2dffd: 0x6d7e4c20, 0x2dffe: 0x6d7e4e20, 0x2dfff: 0x6d7e5020, - // Block 0xb80, offset 0x2e000 - 0x2e000: 0x6d7e5220, 0x2e001: 0x6d7e5420, 0x2e002: 0x6d7e5620, 0x2e003: 0x6d7e5820, - 0x2e004: 0x6d7e5a20, 0x2e005: 0x6d7e5c20, 0x2e006: 0x6d7e5e20, 0x2e007: 0x6d7e6020, - 0x2e008: 0x6d7e6220, 0x2e009: 0x6d7e6420, 0x2e00a: 0x6d7e6620, 0x2e00b: 0x6d7e6820, - 0x2e00c: 0x6d7e6a20, 0x2e00d: 0x6d7e6c20, 0x2e00e: 0x6da56420, 0x2e00f: 0x6d7ed220, - 0x2e010: 0x6da56620, 0x2e011: 0x6da56820, 0x2e012: 0x6da56a20, 0x2e013: 0x6da56c20, - 0x2e014: 0x6da56e20, 0x2e015: 0x6da57020, 0x2e016: 0x6da57220, 0x2e017: 0x6da57420, - 0x2e018: 0x6dc70620, 0x2e019: 0x6da5a820, 0x2e01a: 0x6da57620, 0x2e01b: 0x6dc70820, - 0x2e01c: 0x6dc70a20, 0x2e01d: 0x6de38820, 0x2e01e: 0x6de38a20, 0x2e01f: 0x6de38c20, - 0x2e020: 0x6de38e20, 0x2e021: 0x6de39020, 0x2e022: 0x6de39220, 0x2e023: 0x6dfae020, - 0x2e024: 0x6dfae220, 0x2e025: 0x6dfae420, 0x2e026: 0x6dfae620, 0x2e027: 0x6dfae820, - 0x2e028: 0x6dfaea20, 0x2e029: 0x6e0e4620, 0x2e02a: 0x6e293020, 0x2e02b: 0x6e293220, - 0x2e02c: 0x6e293420, 0x2e02d: 0x6e324a20, 0x2e02e: 0x6e324c20, 0x2e02f: 0x6e38a820, - 0x2e030: 0x6c049820, 0x2e031: 0x6c095e20, 0x2e032: 0x6c127020, 0x2e033: 0x6c127220, - 0x2e034: 0x6c219c20, 0x2e035: 0x6c219e20, 0x2e036: 0x6c364020, 0x2e037: 0x6c515c20, - 0x2e038: 0x6c739020, 0x2e039: 0x6c9c0a20, 0x2e03a: 0x6c739220, 0x2e03b: 0x6c73a820, - 0x2e03c: 0x6c9c0c20, 0x2e03d: 0x6c9ba020, 0x2e03e: 0x6cc84a20, 0x2e03f: 0x6cc84c20, - // Block 0xb81, offset 0x2e040 - 0x2e040: 0x6cb8f420, 0x2e041: 0x6cc84e20, 0x2e042: 0x6cc85020, 0x2e043: 0x6cf68820, - 0x2e044: 0x6d25f820, 0x2e045: 0x6d25fa20, 0x2e046: 0x6d7ed620, 0x2e047: 0x6e0e5820, - 0x2e048: 0x6c049c20, 0x2e049: 0x6c127420, 0x2e04a: 0x6c364c20, 0x2e04b: 0x6c364e20, - 0x2e04c: 0x6c365020, 0x2e04d: 0x6c365220, 0x2e04e: 0x6c516c20, 0x2e04f: 0x6c516e20, - 0x2e050: 0x6c517020, 0x2e051: 0x6c517220, 0x2e052: 0x6c73ae20, 0x2e053: 0x6c73b020, - 0x2e054: 0x6c73b220, 0x2e055: 0x6c73b420, 0x2e056: 0x6c9c1a20, 0x2e057: 0x6c73be20, - 0x2e058: 0x6c9c1c20, 0x2e059: 0x6c9c1e20, 0x2e05a: 0x6c9c2020, 0x2e05b: 0x6c9c2220, - 0x2e05c: 0x6cc85a20, 0x2e05d: 0x6cc85c20, 0x2e05e: 0x6cc85e20, 0x2e05f: 0x6cc86020, - 0x2e060: 0x6cf69420, 0x2e061: 0x6cf69620, 0x2e062: 0x6d260620, 0x2e063: 0x6d7ee620, - 0x2e064: 0x6d7ee820, 0x2e065: 0x6d7eea20, 0x2e066: 0x6dc74820, 0x2e067: 0x6dfb0220, - 0x2e068: 0x6c049e20, 0x2e069: 0x6c04a020, 0x2e06a: 0x6c096220, 0x2e06b: 0x6c096420, - 0x2e06c: 0x6c096620, 0x2e06d: 0x6c096820, 0x2e06e: 0x6c096a20, 0x2e06f: 0x6c096c20, - 0x2e070: 0x6c096e20, 0x2e071: 0x6c127c20, 0x2e072: 0x6c127e20, 0x2e073: 0x6c128020, - 0x2e074: 0x6c128220, 0x2e075: 0x6c128420, 0x2e076: 0x6c128620, 0x2e077: 0x6c128820, - 0x2e078: 0x6c128a20, 0x2e079: 0x6c128c20, 0x2e07a: 0x6c128e20, 0x2e07b: 0x6c129020, - 0x2e07c: 0x6c129220, 0x2e07d: 0x6c129420, 0x2e07e: 0x6c129620, 0x2e07f: 0x6c129820, - // Block 0xb82, offset 0x2e080 - 0x2e080: 0x6c129a20, 0x2e081: 0x6c129c20, 0x2e082: 0x6c129e20, 0x2e083: 0x6c12a020, - 0x2e084: 0x6c21ba20, 0x2e085: 0x6c21bc20, 0x2e086: 0x6c21be20, 0x2e087: 0x6c21c020, - 0x2e088: 0x6c21c220, 0x2e089: 0x6c21c420, 0x2e08a: 0x6c21c620, 0x2e08b: 0x6c21c820, - 0x2e08c: 0x6c21ca20, 0x2e08d: 0x6c21cc20, 0x2e08e: 0x6c21ce20, 0x2e08f: 0x6c21d020, - 0x2e090: 0x6c21d220, 0x2e091: 0x6c21d420, 0x2e092: 0x6c21d620, 0x2e093: 0x6c21d820, - 0x2e094: 0x6c21da20, 0x2e095: 0x6c21dc20, 0x2e096: 0x6c21de20, 0x2e097: 0x6c21e020, - 0x2e098: 0x6c21e220, 0x2e099: 0x6c21e420, 0x2e09a: 0x6c21e620, 0x2e09b: 0x6c21e820, - 0x2e09c: 0x6c21ea20, 0x2e09d: 0x6c21ec20, 0x2e09e: 0x6c21ee20, 0x2e09f: 0x6c21f020, - 0x2e0a0: 0x6c21f220, 0x2e0a1: 0x6c21f420, 0x2e0a2: 0x6c21f620, 0x2e0a3: 0x6c21f820, - 0x2e0a4: 0x6c21fa20, 0x2e0a5: 0x6c21fc20, 0x2e0a6: 0x6c21fe20, 0x2e0a7: 0x6c220020, - 0x2e0a8: 0x6c220220, 0x2e0a9: 0x6c220420, 0x2e0aa: 0x6c366c20, 0x2e0ab: 0x6c366e20, - 0x2e0ac: 0x6c367020, 0x2e0ad: 0x6c367220, 0x2e0ae: 0x6c367420, 0x2e0af: 0x6c367620, - 0x2e0b0: 0x6c367820, 0x2e0b1: 0x6c367a20, 0x2e0b2: 0x6c367c20, 0x2e0b3: 0x6c367e20, - 0x2e0b4: 0x6c368020, 0x2e0b5: 0x6c368220, 0x2e0b6: 0x6c368420, 0x2e0b7: 0x6c368620, - 0x2e0b8: 0x6c368820, 0x2e0b9: 0x6c368a20, 0x2e0ba: 0x6c368c20, 0x2e0bb: 0x6c368e20, - 0x2e0bc: 0x6c369020, 0x2e0bd: 0x6c369220, 0x2e0be: 0x6c369420, 0x2e0bf: 0x6c369620, - // Block 0xb83, offset 0x2e0c0 - 0x2e0c0: 0x6c369820, 0x2e0c1: 0x6c220620, 0x2e0c2: 0x6c369a20, 0x2e0c3: 0x6c369c20, - 0x2e0c4: 0x6c369e20, 0x2e0c5: 0x6c36a020, 0x2e0c6: 0x6c36a220, 0x2e0c7: 0x6c36a420, - 0x2e0c8: 0x6c36a620, 0x2e0c9: 0x6c36a820, 0x2e0ca: 0x6c36aa20, 0x2e0cb: 0x6c36ac20, - 0x2e0cc: 0x6c36ae20, 0x2e0cd: 0x6c36b020, 0x2e0ce: 0x6c36b220, 0x2e0cf: 0x6c36b420, - 0x2e0d0: 0x6c36b620, 0x2e0d1: 0x6c36b820, 0x2e0d2: 0x6c36ba20, 0x2e0d3: 0x6c36bc20, - 0x2e0d4: 0x6c36be20, 0x2e0d5: 0x6c36c020, 0x2e0d6: 0x6c36c220, 0x2e0d7: 0x6c36c420, - 0x2e0d8: 0x6c36c620, 0x2e0d9: 0x6c36c820, 0x2e0da: 0x6c36ca20, 0x2e0db: 0x6c36cc20, - 0x2e0dc: 0x6c36ce20, 0x2e0dd: 0x6c36d020, 0x2e0de: 0x6c36d220, 0x2e0df: 0x6c36d420, - 0x2e0e0: 0x6c36d620, 0x2e0e1: 0x6c36d820, 0x2e0e2: 0x6c36da20, 0x2e0e3: 0x6c36dc20, - 0x2e0e4: 0x6c36de20, 0x2e0e5: 0x6c36e020, 0x2e0e6: 0x6c36e220, 0x2e0e7: 0x6c36e420, - 0x2e0e8: 0x6c36e620, 0x2e0e9: 0x6c36e820, 0x2e0ea: 0x6c36ea20, 0x2e0eb: 0x6c36ec20, - 0x2e0ec: 0x6c36ee20, 0x2e0ed: 0x6c36f020, 0x2e0ee: 0x6c519420, 0x2e0ef: 0x6c519620, - 0x2e0f0: 0x6c519820, 0x2e0f1: 0x6c519a20, 0x2e0f2: 0x6c519c20, 0x2e0f3: 0x6c519e20, - 0x2e0f4: 0x6c51a020, 0x2e0f5: 0x6c51a220, 0x2e0f6: 0x6c51a420, 0x2e0f7: 0x6c51a620, - 0x2e0f8: 0x6c51a820, 0x2e0f9: 0x6c51aa20, 0x2e0fa: 0x6c51ac20, 0x2e0fb: 0x6c51ae20, - 0x2e0fc: 0x6c51b020, 0x2e0fd: 0x6c73c020, 0x2e0fe: 0x6c51b220, 0x2e0ff: 0x6c51b420, - // Block 0xb84, offset 0x2e100 - 0x2e100: 0x6c51b620, 0x2e101: 0x6c51b820, 0x2e102: 0x6c51ba20, 0x2e103: 0x6c51bc20, - 0x2e104: 0x6c51be20, 0x2e105: 0x6c51c020, 0x2e106: 0x6c51c220, 0x2e107: 0x6c51c420, - 0x2e108: 0x6c51c620, 0x2e109: 0x6c51c820, 0x2e10a: 0x6c51ca20, 0x2e10b: 0x6c51cc20, - 0x2e10c: 0x6c51ce20, 0x2e10d: 0x6c51d020, 0x2e10e: 0x6c51d220, 0x2e10f: 0x6c51d420, - 0x2e110: 0x6c51d620, 0x2e111: 0x6c51d820, 0x2e112: 0x6c51da20, 0x2e113: 0x6c51dc20, - 0x2e114: 0x6c51de20, 0x2e115: 0x6c51e020, 0x2e116: 0x6c51e220, 0x2e117: 0x6c51e420, - 0x2e118: 0x6c51e620, 0x2e119: 0x6c51e820, 0x2e11a: 0x6c51ea20, 0x2e11b: 0x6c51ec20, - 0x2e11c: 0x6c51ee20, 0x2e11d: 0x6c51f020, 0x2e11e: 0x6c51f220, 0x2e11f: 0x6c51f420, - 0x2e120: 0x6c51f620, 0x2e121: 0x6c73c220, 0x2e122: 0x6c51f820, 0x2e123: 0x6c51fa20, - 0x2e124: 0x6c51fc20, 0x2e125: 0x6c51fe20, 0x2e126: 0x6c520020, 0x2e127: 0x6c520220, - 0x2e128: 0x6c520420, 0x2e129: 0x6c520620, 0x2e12a: 0x6c520820, 0x2e12b: 0x6c520a20, - 0x2e12c: 0x6c520c20, 0x2e12d: 0x6c520e20, 0x2e12e: 0x6c521020, 0x2e12f: 0x6c521220, - 0x2e130: 0x6c521420, 0x2e131: 0x6c521620, 0x2e132: 0x6c521820, 0x2e133: 0x6c521a20, - 0x2e134: 0x6c73c420, 0x2e135: 0x6c521c20, 0x2e136: 0x6c521e20, 0x2e137: 0x6c522020, - 0x2e138: 0x6c522220, 0x2e139: 0x6c376420, 0x2e13a: 0x6c522420, 0x2e13b: 0x6c522620, - 0x2e13c: 0x6c522820, 0x2e13d: 0x6c522a20, 0x2e13e: 0x6c522c20, 0x2e13f: 0x6c522e20, - // Block 0xb85, offset 0x2e140 - 0x2e140: 0x6c523020, 0x2e141: 0x6c523220, 0x2e142: 0x6c523420, 0x2e143: 0x6c523620, - 0x2e144: 0x6c523820, 0x2e145: 0x6c523a20, 0x2e146: 0x6c523c20, 0x2e147: 0x6c523e20, - 0x2e148: 0x6c524020, 0x2e149: 0x6c524220, 0x2e14a: 0x6c524420, 0x2e14b: 0x6c524620, - 0x2e14c: 0x6c524820, 0x2e14d: 0x6c524a20, 0x2e14e: 0x6c524c20, 0x2e14f: 0x6c524e20, - 0x2e150: 0x6c525020, 0x2e151: 0x6c525220, 0x2e152: 0x6c73e620, 0x2e153: 0x6c73e820, - 0x2e154: 0x6c73ea20, 0x2e155: 0x6c73ec20, 0x2e156: 0x6c73ee20, 0x2e157: 0x6c73f020, - 0x2e158: 0x6c73f220, 0x2e159: 0x6c73f420, 0x2e15a: 0x6c73f620, 0x2e15b: 0x6c73f820, - 0x2e15c: 0x6c73fa20, 0x2e15d: 0x6c73fc20, 0x2e15e: 0x6c73fe20, 0x2e15f: 0x6c740020, - 0x2e160: 0x6c740220, 0x2e161: 0x6c740420, 0x2e162: 0x6c740620, 0x2e163: 0x6c740820, - 0x2e164: 0x6c740a20, 0x2e165: 0x6c740c20, 0x2e166: 0x6c740e20, 0x2e167: 0x6c741020, - 0x2e168: 0x6c741220, 0x2e169: 0x6c741420, 0x2e16a: 0x6c741620, 0x2e16b: 0x6c741820, - 0x2e16c: 0x6c741a20, 0x2e16d: 0x6c741c20, 0x2e16e: 0x6c741e20, 0x2e16f: 0x6c742020, - 0x2e170: 0x6c742220, 0x2e171: 0x6c742420, 0x2e172: 0x6c742620, 0x2e173: 0x6c742820, - 0x2e174: 0x6c742a20, 0x2e175: 0x6c742c20, 0x2e176: 0x6c742e20, 0x2e177: 0x6c743020, - 0x2e178: 0x6c743220, 0x2e179: 0x6c743420, 0x2e17a: 0x6c743620, 0x2e17b: 0x6c743820, - 0x2e17c: 0x6c743a20, 0x2e17d: 0x6c743c20, 0x2e17e: 0x6c743e20, 0x2e17f: 0x6c744020, - // Block 0xb86, offset 0x2e180 - 0x2e180: 0x6c744220, 0x2e181: 0x6c744420, 0x2e182: 0x6c744620, 0x2e183: 0x6c744820, - 0x2e184: 0x6c744a20, 0x2e185: 0x6c744c20, 0x2e186: 0x6c744e20, 0x2e187: 0x6c745020, - 0x2e188: 0x6c745220, 0x2e189: 0x6c745420, 0x2e18a: 0x6c745620, 0x2e18b: 0x6c745820, - 0x2e18c: 0x6c745a20, 0x2e18d: 0x6c745c20, 0x2e18e: 0x6c745e20, 0x2e18f: 0x6c746020, - 0x2e190: 0x6c746220, 0x2e191: 0x6c746420, 0x2e192: 0x6c52c020, 0x2e193: 0x6c746620, - 0x2e194: 0x6c746820, 0x2e195: 0x6c746a20, 0x2e196: 0x6c746c20, 0x2e197: 0x6c746e20, - 0x2e198: 0x6c747020, 0x2e199: 0x6c747220, 0x2e19a: 0x6c747420, 0x2e19b: 0x6c747620, - 0x2e19c: 0x6c747820, 0x2e19d: 0x6c747a20, 0x2e19e: 0x6c747c20, 0x2e19f: 0x6c747e20, - 0x2e1a0: 0x6c748020, 0x2e1a1: 0x6c748220, 0x2e1a2: 0x6c748420, 0x2e1a3: 0x6c748620, - 0x2e1a4: 0x6c748820, 0x2e1a5: 0x6c748a20, 0x2e1a6: 0x6c748c20, 0x2e1a7: 0x6c748e20, - 0x2e1a8: 0x6c749020, 0x2e1a9: 0x6c749220, 0x2e1aa: 0x6c749420, 0x2e1ab: 0x6c9c5420, - 0x2e1ac: 0x6c9c5620, 0x2e1ad: 0x6c9c5820, 0x2e1ae: 0x6c9c5a20, 0x2e1af: 0x6c9c5c20, - 0x2e1b0: 0x6c9c5e20, 0x2e1b1: 0x6c9c6020, 0x2e1b2: 0x6c9c6220, 0x2e1b3: 0x6c9c6420, - 0x2e1b4: 0x6c9c6620, 0x2e1b5: 0x6c9c6820, 0x2e1b6: 0x6c9c6a20, 0x2e1b7: 0x6c9c6c20, - 0x2e1b8: 0x6c9c6e20, 0x2e1b9: 0x6c9c7020, 0x2e1ba: 0x6c9c7220, 0x2e1bb: 0x6c9c7420, - 0x2e1bc: 0x6c9c7620, 0x2e1bd: 0x6c9c7820, 0x2e1be: 0x6c9c7a20, 0x2e1bf: 0x6c9c7c20, - // Block 0xb87, offset 0x2e1c0 - 0x2e1c0: 0x6c9c7e20, 0x2e1c1: 0x6c9c8020, 0x2e1c2: 0x6c9c8220, 0x2e1c3: 0x6c9c8420, - 0x2e1c4: 0x6c9c8620, 0x2e1c5: 0x6c9c8820, 0x2e1c6: 0x6c9c8a20, 0x2e1c7: 0x6c9c8c20, - 0x2e1c8: 0x6c9c8e20, 0x2e1c9: 0x6c9c9020, 0x2e1ca: 0x6c9c9220, 0x2e1cb: 0x6c9c9420, - 0x2e1cc: 0x6c9c9620, 0x2e1cd: 0x6c9c9820, 0x2e1ce: 0x6c9c9a20, 0x2e1cf: 0x6c9c9c20, - 0x2e1d0: 0x6c9c9e20, 0x2e1d1: 0x6c9ca020, 0x2e1d2: 0x6c9ca220, 0x2e1d3: 0x6c9ca420, - 0x2e1d4: 0x6c9ca620, 0x2e1d5: 0x6c9ca820, 0x2e1d6: 0x6c9caa20, 0x2e1d7: 0x6c9cac20, - 0x2e1d8: 0x6c9cae20, 0x2e1d9: 0x6c9cb020, 0x2e1da: 0x6c9cb220, 0x2e1db: 0x6c9cb420, - 0x2e1dc: 0x6c9cb620, 0x2e1dd: 0x6c9cb820, 0x2e1de: 0x6c9cba20, 0x2e1df: 0x6c9cbc20, - 0x2e1e0: 0x6c9cbe20, 0x2e1e1: 0x6c9cc020, 0x2e1e2: 0x6c9cc220, 0x2e1e3: 0x6c9cc420, - 0x2e1e4: 0x6c9cc620, 0x2e1e5: 0x6c9cc820, 0x2e1e6: 0x6c9cca20, 0x2e1e7: 0x6c9ccc20, - 0x2e1e8: 0x6c9cce20, 0x2e1e9: 0x6c9cd020, 0x2e1ea: 0x6c9cd220, 0x2e1eb: 0x6c9cd420, - 0x2e1ec: 0x6c9cd620, 0x2e1ed: 0x6c9cd820, 0x2e1ee: 0x6c9cda20, 0x2e1ef: 0x6c9cdc20, - 0x2e1f0: 0x6c9cde20, 0x2e1f1: 0x6c9ce020, 0x2e1f2: 0x6c9ce220, 0x2e1f3: 0x6c9ce420, - 0x2e1f4: 0x6cc88420, 0x2e1f5: 0x6c9ce620, 0x2e1f6: 0x6c9ce820, 0x2e1f7: 0x6c9cea20, - 0x2e1f8: 0x6c9cec20, 0x2e1f9: 0x6c9cee20, 0x2e1fa: 0x6c9cf020, 0x2e1fb: 0x6c9cf220, - 0x2e1fc: 0x6c9cf420, 0x2e1fd: 0x6c9cf620, 0x2e1fe: 0x6c9cf820, 0x2e1ff: 0x6c9cfa20, - // Block 0xb88, offset 0x2e200 - 0x2e200: 0x6c9cfc20, 0x2e201: 0x6c9cfe20, 0x2e202: 0x6c9d0020, 0x2e203: 0x6cc8ae20, - 0x2e204: 0x6cc8b020, 0x2e205: 0x6cc8b220, 0x2e206: 0x6cc8b420, 0x2e207: 0x6cc8b620, - 0x2e208: 0x6cc8b820, 0x2e209: 0x6cc8ba20, 0x2e20a: 0x6cc8bc20, 0x2e20b: 0x6cc8be20, - 0x2e20c: 0x6cc8c020, 0x2e20d: 0x6cc8c220, 0x2e20e: 0x6cc8c420, 0x2e20f: 0x6cc8c620, - 0x2e210: 0x6cc8c820, 0x2e211: 0x6cc8ca20, 0x2e212: 0x6cc8cc20, 0x2e213: 0x6cc8ce20, - 0x2e214: 0x6cc8d020, 0x2e215: 0x6cc8d220, 0x2e216: 0x6cc8d420, 0x2e217: 0x6cc8d620, - 0x2e218: 0x6cc8d820, 0x2e219: 0x6cc8da20, 0x2e21a: 0x6cc8dc20, 0x2e21b: 0x6cc8de20, - 0x2e21c: 0x6cc8e020, 0x2e21d: 0x6cc8e220, 0x2e21e: 0x6cc8e420, 0x2e21f: 0x6cc8e620, - 0x2e220: 0x6cc8e820, 0x2e221: 0x6cc8ea20, 0x2e222: 0x6cc8ec20, 0x2e223: 0x6cc8ee20, - 0x2e224: 0x6cc8f020, 0x2e225: 0x6cc8f220, 0x2e226: 0x6cc8f420, 0x2e227: 0x6cc8f620, - 0x2e228: 0x6cc8f820, 0x2e229: 0x6cc8fa20, 0x2e22a: 0x6cc8fc20, 0x2e22b: 0x6cc8fe20, - 0x2e22c: 0x6cc90020, 0x2e22d: 0x6cc90220, 0x2e22e: 0x6cc90420, 0x2e22f: 0x6cc90620, - 0x2e230: 0x6cc90820, 0x2e231: 0x6cc90a20, 0x2e232: 0x6cc90c20, 0x2e233: 0x6cc90e20, - 0x2e234: 0x6cc91020, 0x2e235: 0x6cc91220, 0x2e236: 0x6cc91420, 0x2e237: 0x6cc91620, - 0x2e238: 0x6cc91820, 0x2e239: 0x6cc91a20, 0x2e23a: 0x6cc91c20, 0x2e23b: 0x6cc91e20, - 0x2e23c: 0x6cc92020, 0x2e23d: 0x6cc92220, 0x2e23e: 0x6cc92420, 0x2e23f: 0x6cc92620, - // Block 0xb89, offset 0x2e240 - 0x2e240: 0x6cc92820, 0x2e241: 0x6cc92a20, 0x2e242: 0x6cc92c20, 0x2e243: 0x6cc92e20, - 0x2e244: 0x6cc93020, 0x2e245: 0x6cc93220, 0x2e246: 0x6cc93420, 0x2e247: 0x6cc93620, - 0x2e248: 0x6cc93820, 0x2e249: 0x6cc93a20, 0x2e24a: 0x6cc93c20, 0x2e24b: 0x6cc93e20, - 0x2e24c: 0x6cc94020, 0x2e24d: 0x6cc94220, 0x2e24e: 0x6cc94420, 0x2e24f: 0x6cc94620, - 0x2e250: 0x6cc94820, 0x2e251: 0x6cc94a20, 0x2e252: 0x6cc94c20, 0x2e253: 0x6cc94e20, - 0x2e254: 0x6cc95020, 0x2e255: 0x6cc95220, 0x2e256: 0x6cc95420, 0x2e257: 0x6cc95620, - 0x2e258: 0x6cc95820, 0x2e259: 0x6cc95a20, 0x2e25a: 0x6cc95c20, 0x2e25b: 0x6cc95e20, - 0x2e25c: 0x6cc96020, 0x2e25d: 0x6cc96220, 0x2e25e: 0x6cc96420, 0x2e25f: 0x6cc96620, - 0x2e260: 0x6cc96820, 0x2e261: 0x6cc96a20, 0x2e262: 0x6cc96c20, 0x2e263: 0x6cc96e20, - 0x2e264: 0x6cc97020, 0x2e265: 0x6cc97220, 0x2e266: 0x6cc97420, 0x2e267: 0x6cc97620, - 0x2e268: 0x6cc97820, 0x2e269: 0x6cc97a20, 0x2e26a: 0x6cc97c20, 0x2e26b: 0x6cc97e20, - 0x2e26c: 0x6cc98020, 0x2e26d: 0x6cc98220, 0x2e26e: 0x6cc98420, 0x2e26f: 0x6cf6e220, - 0x2e270: 0x6cf6e420, 0x2e271: 0x6cf6e620, 0x2e272: 0x6cf6e820, 0x2e273: 0x6cf6ea20, - 0x2e274: 0x6cf6ec20, 0x2e275: 0x6cf6ee20, 0x2e276: 0x6cf6f020, 0x2e277: 0x6cf6f220, - 0x2e278: 0x6cf6f420, 0x2e279: 0x6cf6f620, 0x2e27a: 0x6cf6f820, 0x2e27b: 0x6cf6fa20, - 0x2e27c: 0x6cf6fc20, 0x2e27d: 0x6cf6fe20, 0x2e27e: 0x6cf70020, 0x2e27f: 0x6cf70220, - // Block 0xb8a, offset 0x2e280 - 0x2e280: 0x6cf70420, 0x2e281: 0x6cf70620, 0x2e282: 0x6cf70820, 0x2e283: 0x6cf70a20, - 0x2e284: 0x6cf70c20, 0x2e285: 0x6cf70e20, 0x2e286: 0x6cf71020, 0x2e287: 0x6cf71220, - 0x2e288: 0x6cf71420, 0x2e289: 0x6cf71620, 0x2e28a: 0x6cf71820, 0x2e28b: 0x6cf71a20, - 0x2e28c: 0x6cf71c20, 0x2e28d: 0x6cf71e20, 0x2e28e: 0x6cf72020, 0x2e28f: 0x6cf72220, - 0x2e290: 0x6cf72420, 0x2e291: 0x6cf72620, 0x2e292: 0x6cf72820, 0x2e293: 0x6cf72a20, - 0x2e294: 0x6cf72c20, 0x2e295: 0x6cf72e20, 0x2e296: 0x6c9da420, 0x2e297: 0x6cf73020, - 0x2e298: 0x6cf73220, 0x2e299: 0x6cf73420, 0x2e29a: 0x6cf73620, 0x2e29b: 0x6cf73820, - 0x2e29c: 0x6cf73a20, 0x2e29d: 0x6cf73c20, 0x2e29e: 0x6cf73e20, 0x2e29f: 0x6cf74020, - 0x2e2a0: 0x6cf74220, 0x2e2a1: 0x6cf74420, 0x2e2a2: 0x6cf74620, 0x2e2a3: 0x6cf74820, - 0x2e2a4: 0x6cf74a20, 0x2e2a5: 0x6cf74c20, 0x2e2a6: 0x6cf74e20, 0x2e2a7: 0x6cf75020, - 0x2e2a8: 0x6cf75220, 0x2e2a9: 0x6cf75420, 0x2e2aa: 0x6cf75620, 0x2e2ab: 0x6cf75820, - 0x2e2ac: 0x6cf75a20, 0x2e2ad: 0x6cf75c20, 0x2e2ae: 0x6cca8820, 0x2e2af: 0x6cf75e20, - 0x2e2b0: 0x6cca8a20, 0x2e2b1: 0x6cf76020, 0x2e2b2: 0x6cf76220, 0x2e2b3: 0x6cf76420, - 0x2e2b4: 0x6cf76620, 0x2e2b5: 0x6cf76820, 0x2e2b6: 0x6cf76a20, 0x2e2b7: 0x6cf76c20, - 0x2e2b8: 0x6cf76e20, 0x2e2b9: 0x6cf77020, 0x2e2ba: 0x6cf77220, 0x2e2bb: 0x6cf77420, - 0x2e2bc: 0x6cf77620, 0x2e2bd: 0x6cf77820, 0x2e2be: 0x6cf77a20, 0x2e2bf: 0x6cf77c20, - // Block 0xb8b, offset 0x2e2c0 - 0x2e2c0: 0x6cf77e20, 0x2e2c1: 0x6cf78020, 0x2e2c2: 0x6cf78220, 0x2e2c3: 0x6cf78420, - 0x2e2c4: 0x6cf78620, 0x2e2c5: 0x6cf78820, 0x2e2c6: 0x6cf78a20, 0x2e2c7: 0x6cf78c20, - 0x2e2c8: 0x6cf78e20, 0x2e2c9: 0x6cf79020, 0x2e2ca: 0x6d264e20, 0x2e2cb: 0x6cf79220, - 0x2e2cc: 0x6cf79420, 0x2e2cd: 0x6d265020, 0x2e2ce: 0x6d265220, 0x2e2cf: 0x6d265420, - 0x2e2d0: 0x6d265620, 0x2e2d1: 0x6d265820, 0x2e2d2: 0x6d265a20, 0x2e2d3: 0x6d265c20, - 0x2e2d4: 0x6cf79620, 0x2e2d5: 0x6d265e20, 0x2e2d6: 0x6d266020, 0x2e2d7: 0x6d266220, - 0x2e2d8: 0x6cf79820, 0x2e2d9: 0x6d266420, 0x2e2da: 0x6d266620, 0x2e2db: 0x6d266820, - 0x2e2dc: 0x6d266a20, 0x2e2dd: 0x6d266c20, 0x2e2de: 0x6d266e20, 0x2e2df: 0x6d267020, - 0x2e2e0: 0x6d267220, 0x2e2e1: 0x6d267420, 0x2e2e2: 0x6d267620, 0x2e2e3: 0x6d267820, - 0x2e2e4: 0x6d267a20, 0x2e2e5: 0x6d267c20, 0x2e2e6: 0x6d267e20, 0x2e2e7: 0x6d268020, - 0x2e2e8: 0x6d268220, 0x2e2e9: 0x6d268420, 0x2e2ea: 0x6d268620, 0x2e2eb: 0x6d268820, - 0x2e2ec: 0x6d268a20, 0x2e2ed: 0x6d268c20, 0x2e2ee: 0x6d268e20, 0x2e2ef: 0x6d269020, - 0x2e2f0: 0x6d269220, 0x2e2f1: 0x6d269420, 0x2e2f2: 0x6d269620, 0x2e2f3: 0x6d269820, - 0x2e2f4: 0x6d269a20, 0x2e2f5: 0x6d269c20, 0x2e2f6: 0x6d269e20, 0x2e2f7: 0x6d26a020, - 0x2e2f8: 0x6d26a220, 0x2e2f9: 0x6d26a420, 0x2e2fa: 0x6d26a620, 0x2e2fb: 0x6d26a820, - 0x2e2fc: 0x6d26aa20, 0x2e2fd: 0x6d26ac20, 0x2e2fe: 0x6d26ae20, 0x2e2ff: 0x6d26b020, - // Block 0xb8c, offset 0x2e300 - 0x2e300: 0x6d26b220, 0x2e301: 0x6d26b420, 0x2e302: 0x6d26b620, 0x2e303: 0x6d26b820, - 0x2e304: 0x6d26ba20, 0x2e305: 0x6d26bc20, 0x2e306: 0x6d26be20, 0x2e307: 0x6d26c020, - 0x2e308: 0x6d26c220, 0x2e309: 0x6d26c420, 0x2e30a: 0x6d26c620, 0x2e30b: 0x6d26c820, - 0x2e30c: 0x6d26ca20, 0x2e30d: 0x6d26cc20, 0x2e30e: 0x6d26ce20, 0x2e30f: 0x6d26d020, - 0x2e310: 0x6d26d220, 0x2e311: 0x6d26d420, 0x2e312: 0x6d26d620, 0x2e313: 0x6d26d820, - 0x2e314: 0x6d26da20, 0x2e315: 0x6d26dc20, 0x2e316: 0x6d26de20, 0x2e317: 0x6d26e020, - 0x2e318: 0x6d26e220, 0x2e319: 0x6d26e420, 0x2e31a: 0x6d26e620, 0x2e31b: 0x6d26e820, - 0x2e31c: 0x6d26ea20, 0x2e31d: 0x6d26ec20, 0x2e31e: 0x6d26ee20, 0x2e31f: 0x6d26f020, - 0x2e320: 0x6d26f220, 0x2e321: 0x6d26f420, 0x2e322: 0x6d53c820, 0x2e323: 0x6d53ca20, - 0x2e324: 0x6d53cc20, 0x2e325: 0x6d53ce20, 0x2e326: 0x6d53d020, 0x2e327: 0x6d53d220, - 0x2e328: 0x6d53d420, 0x2e329: 0x6d539c20, 0x2e32a: 0x6d53d620, 0x2e32b: 0x6d53d820, - 0x2e32c: 0x6d53da20, 0x2e32d: 0x6d53dc20, 0x2e32e: 0x6d53de20, 0x2e32f: 0x6d53e020, - 0x2e330: 0x6d53e220, 0x2e331: 0x6d53e420, 0x2e332: 0x6d53e620, 0x2e333: 0x6d53e820, - 0x2e334: 0x6d53ea20, 0x2e335: 0x6d53ec20, 0x2e336: 0x6d53ee20, 0x2e337: 0x6d53f020, - 0x2e338: 0x6d53f220, 0x2e339: 0x6d53f420, 0x2e33a: 0x6d53f620, 0x2e33b: 0x6d53f820, - 0x2e33c: 0x6d53fa20, 0x2e33d: 0x6d53fc20, 0x2e33e: 0x6d53fe20, 0x2e33f: 0x6d540020, - // Block 0xb8d, offset 0x2e340 - 0x2e340: 0x6d540220, 0x2e341: 0x6d540420, 0x2e342: 0x6d540620, 0x2e343: 0x6d280020, - 0x2e344: 0x6d540820, 0x2e345: 0x6d540a20, 0x2e346: 0x6d540c20, 0x2e347: 0x6d540e20, - 0x2e348: 0x6d541020, 0x2e349: 0x6d541220, 0x2e34a: 0x6d541420, 0x2e34b: 0x6d541620, - 0x2e34c: 0x6d541820, 0x2e34d: 0x6d541a20, 0x2e34e: 0x6d541c20, 0x2e34f: 0x6d541e20, - 0x2e350: 0x6d542020, 0x2e351: 0x6d542220, 0x2e352: 0x6d542420, 0x2e353: 0x6d542620, - 0x2e354: 0x6d542820, 0x2e355: 0x6d542a20, 0x2e356: 0x6d542c20, 0x2e357: 0x6d542e20, - 0x2e358: 0x6d543020, 0x2e359: 0x6d543220, 0x2e35a: 0x6d543420, 0x2e35b: 0x6d543620, - 0x2e35c: 0x6d543820, 0x2e35d: 0x6d543a20, 0x2e35e: 0x6d543c20, 0x2e35f: 0x6d543e20, - 0x2e360: 0x6d544020, 0x2e361: 0x6d544220, 0x2e362: 0x6d544420, 0x2e363: 0x6d544620, - 0x2e364: 0x6d544820, 0x2e365: 0x6d544a20, 0x2e366: 0x6d544c20, 0x2e367: 0x6d544e20, - 0x2e368: 0x6d7efe20, 0x2e369: 0x6d545020, 0x2e36a: 0x6d545220, 0x2e36b: 0x6d545420, - 0x2e36c: 0x6d545620, 0x2e36d: 0x6d545820, 0x2e36e: 0x6d26f620, 0x2e36f: 0x6d545a20, - 0x2e370: 0x6d545c20, 0x2e371: 0x6d545e20, 0x2e372: 0x6d7f3020, 0x2e373: 0x6d7f3220, - 0x2e374: 0x6d7f3420, 0x2e375: 0x6d7f3620, 0x2e376: 0x6d7f3820, 0x2e377: 0x6d7f3a20, - 0x2e378: 0x6d7f3c20, 0x2e379: 0x6d7f3e20, 0x2e37a: 0x6d7f4020, 0x2e37b: 0x6d7f4220, - 0x2e37c: 0x6d7f4420, 0x2e37d: 0x6d7f4620, 0x2e37e: 0x6d7f4820, 0x2e37f: 0x6d7f4a20, - // Block 0xb8e, offset 0x2e380 - 0x2e380: 0x6d7f4c20, 0x2e381: 0x6d7f4e20, 0x2e382: 0x6d7f5020, 0x2e383: 0x6d7f5220, - 0x2e384: 0x6d7f5420, 0x2e385: 0x6d7f5620, 0x2e386: 0x6d7f5820, 0x2e387: 0x6d7f5a20, - 0x2e388: 0x6d7f5c20, 0x2e389: 0x6d7f5e20, 0x2e38a: 0x6d7f6020, 0x2e38b: 0x6d7f6220, - 0x2e38c: 0x6d7f6420, 0x2e38d: 0x6d7f6620, 0x2e38e: 0x6d7f6820, 0x2e38f: 0x6d7f6a20, - 0x2e390: 0x6d7f6c20, 0x2e391: 0x6d7f6e20, 0x2e392: 0x6d7f7020, 0x2e393: 0x6d7f7220, - 0x2e394: 0x6d7f7420, 0x2e395: 0x6d7f7620, 0x2e396: 0x6d7f7820, 0x2e397: 0x6d7f7a20, - 0x2e398: 0x6d7f7c20, 0x2e399: 0x6d7f7e20, 0x2e39a: 0x6d7f8020, 0x2e39b: 0x6d7f8220, - 0x2e39c: 0x6d7f8420, 0x2e39d: 0x6d7f8620, 0x2e39e: 0x6d7f8820, 0x2e39f: 0x6d7f8a20, - 0x2e3a0: 0x6d7f8c20, 0x2e3a1: 0x6d7f8e20, 0x2e3a2: 0x6d7f9020, 0x2e3a3: 0x6d7f9220, - 0x2e3a4: 0x6d7f9420, 0x2e3a5: 0x6d546020, 0x2e3a6: 0x6d7f9620, 0x2e3a7: 0x6d7f9820, - 0x2e3a8: 0x6d7f9a20, 0x2e3a9: 0x6d7f9c20, 0x2e3aa: 0x6d7f9e20, 0x2e3ab: 0x6d7fa020, - 0x2e3ac: 0x6d7fa220, 0x2e3ad: 0x6d7fa420, 0x2e3ae: 0x6d7fa620, 0x2e3af: 0x6d7fa820, - 0x2e3b0: 0x6d7faa20, 0x2e3b1: 0x6d7fac20, 0x2e3b2: 0x6d7fae20, 0x2e3b3: 0x6d7fb020, - 0x2e3b4: 0x6d7f0020, 0x2e3b5: 0x6d7fb220, 0x2e3b6: 0x6d7fb420, 0x2e3b7: 0x6d7fb620, - 0x2e3b8: 0x6d7fb820, 0x2e3b9: 0x6d7fba20, 0x2e3ba: 0x6d7fbc20, 0x2e3bb: 0x6d7fbe20, - 0x2e3bc: 0x6d7fc020, 0x2e3bd: 0x6da5dc20, 0x2e3be: 0x6da5de20, 0x2e3bf: 0x6da5e020, - // Block 0xb8f, offset 0x2e3c0 - 0x2e3c0: 0x6da5e220, 0x2e3c1: 0x6da5e420, 0x2e3c2: 0x6da5e620, 0x2e3c3: 0x6da5e820, - 0x2e3c4: 0x6da5ea20, 0x2e3c5: 0x6da5ec20, 0x2e3c6: 0x6da5ee20, 0x2e3c7: 0x6da5f020, - 0x2e3c8: 0x6da5f220, 0x2e3c9: 0x6da5f420, 0x2e3ca: 0x6da5f620, 0x2e3cb: 0x6da5f820, - 0x2e3cc: 0x6da5fa20, 0x2e3cd: 0x6da5fc20, 0x2e3ce: 0x6da5fe20, 0x2e3cf: 0x6da60020, - 0x2e3d0: 0x6da60220, 0x2e3d1: 0x6da60420, 0x2e3d2: 0x6da60620, 0x2e3d3: 0x6da60820, - 0x2e3d4: 0x6da60a20, 0x2e3d5: 0x6da60c20, 0x2e3d6: 0x6da60e20, 0x2e3d7: 0x6da61020, - 0x2e3d8: 0x6da61220, 0x2e3d9: 0x6da61420, 0x2e3da: 0x6da61620, 0x2e3db: 0x6da61820, - 0x2e3dc: 0x6da61a20, 0x2e3dd: 0x6da61c20, 0x2e3de: 0x6da61e20, 0x2e3df: 0x6da62020, - 0x2e3e0: 0x6da62220, 0x2e3e1: 0x6da62420, 0x2e3e2: 0x6da62620, 0x2e3e3: 0x6da62820, - 0x2e3e4: 0x6da62a20, 0x2e3e5: 0x6da62c20, 0x2e3e6: 0x6da62e20, 0x2e3e7: 0x6da63020, - 0x2e3e8: 0x6da63220, 0x2e3e9: 0x6da63420, 0x2e3ea: 0x6da63620, 0x2e3eb: 0x6dc76220, - 0x2e3ec: 0x6dc76420, 0x2e3ed: 0x6dc76620, 0x2e3ee: 0x6dc76820, 0x2e3ef: 0x6dc76a20, - 0x2e3f0: 0x6dc76c20, 0x2e3f1: 0x6dc76e20, 0x2e3f2: 0x6dc77020, 0x2e3f3: 0x6dc77220, - 0x2e3f4: 0x6dc77420, 0x2e3f5: 0x6dc77620, 0x2e3f6: 0x6dc77820, 0x2e3f7: 0x6dc77a20, - 0x2e3f8: 0x6dc77c20, 0x2e3f9: 0x6dc77e20, 0x2e3fa: 0x6dc78020, 0x2e3fb: 0x6dc78220, - 0x2e3fc: 0x6dc78420, 0x2e3fd: 0x6dc78620, 0x2e3fe: 0x6dc78820, 0x2e3ff: 0x6dc78a20, - // Block 0xb90, offset 0x2e400 - 0x2e400: 0x6dc78c20, 0x2e401: 0x6dc78e20, 0x2e402: 0x6dc79020, 0x2e403: 0x6dc79220, - 0x2e404: 0x6dc79420, 0x2e405: 0x6dc79620, 0x2e406: 0x6dc79820, 0x2e407: 0x6dc79a20, - 0x2e408: 0x6dc79c20, 0x2e409: 0x6dc79e20, 0x2e40a: 0x6dc7a020, 0x2e40b: 0x6de3ca20, - 0x2e40c: 0x6de3cc20, 0x2e40d: 0x6de3ce20, 0x2e40e: 0x6de3d020, 0x2e40f: 0x6de3d220, - 0x2e410: 0x6de3d420, 0x2e411: 0x6de3d620, 0x2e412: 0x6de3d820, 0x2e413: 0x6de3da20, - 0x2e414: 0x6de3dc20, 0x2e415: 0x6de3de20, 0x2e416: 0x6de3e020, 0x2e417: 0x6de3e220, - 0x2e418: 0x6de3e420, 0x2e419: 0x6de3e620, 0x2e41a: 0x6de3e820, 0x2e41b: 0x6da6f220, - 0x2e41c: 0x6de3ea20, 0x2e41d: 0x6de3ec20, 0x2e41e: 0x6de3ee20, 0x2e41f: 0x6de3f020, - 0x2e420: 0x6de3f220, 0x2e421: 0x6dc84c20, 0x2e422: 0x6de3f420, 0x2e423: 0x6de3f620, - 0x2e424: 0x6de3f820, 0x2e425: 0x6de3fa20, 0x2e426: 0x6de3fc20, 0x2e427: 0x6de47820, - 0x2e428: 0x6dfb2020, 0x2e429: 0x6dfb2220, 0x2e42a: 0x6dfb2420, 0x2e42b: 0x6de3fe20, - 0x2e42c: 0x6dfb2620, 0x2e42d: 0x6dc84e20, 0x2e42e: 0x6dfb2820, 0x2e42f: 0x6dfb2a20, - 0x2e430: 0x6dfb2c20, 0x2e431: 0x6dfb2e20, 0x2e432: 0x6dfb3020, 0x2e433: 0x6dfb3220, - 0x2e434: 0x6dfb3420, 0x2e435: 0x6dfb3620, 0x2e436: 0x6dfb3820, 0x2e437: 0x6e1db620, - 0x2e438: 0x6e0e6220, 0x2e439: 0x6dfb9820, 0x2e43a: 0x6e0e6420, 0x2e43b: 0x6e0e6620, - 0x2e43c: 0x6e0e6820, 0x2e43d: 0x6e0e6a20, 0x2e43e: 0x6e0e6c20, 0x2e43f: 0x6e0e6e20, - // Block 0xb91, offset 0x2e440 - 0x2e440: 0x6e0e7020, 0x2e441: 0x6e0e7220, 0x2e442: 0x6e0e7420, 0x2e443: 0x6e0e7620, - 0x2e444: 0x6e0e7820, 0x2e445: 0x6e0e7a20, 0x2e446: 0x6e1db820, 0x2e447: 0x6e1dba20, - 0x2e448: 0x6e1dbc20, 0x2e449: 0x6e1dbe20, 0x2e44a: 0x6e1dc020, 0x2e44b: 0x6e1dc220, - 0x2e44c: 0x6e0e7c20, 0x2e44d: 0x6e1dc420, 0x2e44e: 0x6e1dc620, 0x2e44f: 0x6e294220, - 0x2e450: 0x6e294420, 0x2e451: 0x6e294620, 0x2e452: 0x6e294820, 0x2e453: 0x6e325e20, - 0x2e454: 0x6e326020, 0x2e455: 0x6e326220, 0x2e456: 0x6e38b020, 0x2e457: 0x6e38b220, - 0x2e458: 0x6e38b420, 0x2e459: 0x6e38b620, 0x2e45a: 0x6e38b820, 0x2e45b: 0x6e38ba20, - 0x2e45c: 0x6e3d3020, 0x2e45d: 0x6e38d420, 0x2e45e: 0x6e42a620, 0x2e45f: 0x6e42a820, - 0x2e460: 0x6c04a620, 0x2e461: 0x6c12b420, 0x2e462: 0x6c12b620, 0x2e463: 0x6c376e20, - 0x2e464: 0x6c223c20, 0x2e465: 0x6c377020, 0x2e466: 0x6c377220, 0x2e467: 0x6c377420, - 0x2e468: 0x6c52ce20, 0x2e469: 0x6c52d020, 0x2e46a: 0x6c52d220, 0x2e46b: 0x6c755220, - 0x2e46c: 0x6c755420, 0x2e46d: 0x6c755620, 0x2e46e: 0x6c755820, 0x2e46f: 0x6c755a20, - 0x2e470: 0x6c755c20, 0x2e471: 0x6c755e20, 0x2e472: 0x6c9dae20, 0x2e473: 0x6c9db020, - 0x2e474: 0x6c758620, 0x2e475: 0x6c9db220, 0x2e476: 0x6c9db420, 0x2e477: 0x6c9db620, - 0x2e478: 0x6c9db820, 0x2e479: 0x6cca9820, 0x2e47a: 0x6cca9a20, 0x2e47b: 0x6cca9c20, - 0x2e47c: 0x6cca9e20, 0x2e47d: 0x6ccaa020, 0x2e47e: 0x6ccaa220, 0x2e47f: 0x6ccaa420, - // Block 0xb92, offset 0x2e480 - 0x2e480: 0x6cf8c820, 0x2e481: 0x6cf8ca20, 0x2e482: 0x6cf8cc20, 0x2e483: 0x6cf8ce20, - 0x2e484: 0x6cf8d020, 0x2e485: 0x6cf8d220, 0x2e486: 0x6cf8d420, 0x2e487: 0x6cf8d620, - 0x2e488: 0x6cf8d820, 0x2e489: 0x6d280820, 0x2e48a: 0x6d280a20, 0x2e48b: 0x6d280c20, - 0x2e48c: 0x6d280e20, 0x2e48d: 0x6d281020, 0x2e48e: 0x6d555620, 0x2e48f: 0x6d555820, - 0x2e490: 0x6d555a20, 0x2e491: 0x6d555c20, 0x2e492: 0x6d555e20, 0x2e493: 0x6d556020, - 0x2e494: 0x6d80d420, 0x2e495: 0x6d80d620, 0x2e496: 0x6d80d820, 0x2e497: 0x6d80da20, - 0x2e498: 0x6d80dc20, 0x2e499: 0x6d80de20, 0x2e49a: 0x6d80e020, 0x2e49b: 0x6da6fc20, - 0x2e49c: 0x6da6fe20, 0x2e49d: 0x6da70020, 0x2e49e: 0x6dc85020, 0x2e49f: 0x6dc85220, - 0x2e4a0: 0x6de47c20, 0x2e4a1: 0x6e1e0e20, 0x2e4a2: 0x6c04a820, 0x2e4a3: 0x6c097620, - 0x2e4a4: 0x6c12bc20, 0x2e4a5: 0x6c225220, 0x2e4a6: 0x6c379420, 0x2e4a7: 0x6c379620, - 0x2e4a8: 0x6c379820, 0x2e4a9: 0x6c379a20, 0x2e4aa: 0x6c52fe20, 0x2e4ab: 0x6c530020, - 0x2e4ac: 0x6c758820, 0x2e4ad: 0x6c758a20, 0x2e4ae: 0x6ccad620, 0x2e4af: 0x6ccad820, - 0x2e4b0: 0x6d284020, 0x2e4b1: 0x6cf90620, 0x2e4b2: 0x6cf90820, 0x2e4b3: 0x6cf90a20, - 0x2e4b4: 0x6d284420, 0x2e4b5: 0x6d558420, 0x2e4b6: 0x6d558620, 0x2e4b7: 0x6d80f220, - 0x2e4b8: 0x6dc85e20, 0x2e4b9: 0x6c04ae20, 0x2e4ba: 0x6c097c20, 0x2e4bb: 0x6c12c420, - 0x2e4bc: 0x6c225e20, 0x2e4bd: 0x6c37d220, 0x2e4be: 0x6c37d420, 0x2e4bf: 0x6c37d620, - // Block 0xb93, offset 0x2e4c0 - 0x2e4c0: 0x6c37d820, 0x2e4c1: 0x6c37da20, 0x2e4c2: 0x6c530e20, 0x2e4c3: 0x6c531020, - 0x2e4c4: 0x6c531220, 0x2e4c5: 0x6c531420, 0x2e4c6: 0x6c531620, 0x2e4c7: 0x6c531820, - 0x2e4c8: 0x6c75aa20, 0x2e4c9: 0x6c75ac20, 0x2e4ca: 0x6c75ae20, 0x2e4cb: 0x6c75b020, - 0x2e4cc: 0x6c9dec20, 0x2e4cd: 0x6c9dee20, 0x2e4ce: 0x6c9df020, 0x2e4cf: 0x6c9df220, - 0x2e4d0: 0x6c9df420, 0x2e4d1: 0x6c9df620, 0x2e4d2: 0x6c9df820, 0x2e4d3: 0x6c9dfa20, - 0x2e4d4: 0x6ccb0420, 0x2e4d5: 0x6ccb0620, 0x2e4d6: 0x6ccb0820, 0x2e4d7: 0x6ccb0a20, - 0x2e4d8: 0x6ccb0c20, 0x2e4d9: 0x6ccb0e20, 0x2e4da: 0x6ccb1020, 0x2e4db: 0x6cf92c20, - 0x2e4dc: 0x6cf92e20, 0x2e4dd: 0x6d285820, 0x2e4de: 0x6d285a20, 0x2e4df: 0x6d285c20, - 0x2e4e0: 0x6d285e20, 0x2e4e1: 0x6d286020, 0x2e4e2: 0x6d559e20, 0x2e4e3: 0x6d55a020, - 0x2e4e4: 0x6d55a220, 0x2e4e5: 0x6d55a420, 0x2e4e6: 0x6d55a620, 0x2e4e7: 0x6d810820, - 0x2e4e8: 0x6d810a20, 0x2e4e9: 0x6d810c20, 0x2e4ea: 0x6d810e20, 0x2e4eb: 0x6d811020, - 0x2e4ec: 0x6da72020, 0x2e4ed: 0x6da72220, 0x2e4ee: 0x6da72420, 0x2e4ef: 0x6dc86c20, - 0x2e4f0: 0x6de48a20, 0x2e4f1: 0x6de48c20, 0x2e4f2: 0x6e0ee220, 0x2e4f3: 0x6c04b420, - 0x2e4f4: 0x6c380620, 0x2e4f5: 0x6c534820, 0x2e4f6: 0x6c534a20, 0x2e4f7: 0x6c75e020, - 0x2e4f8: 0x6c9e2220, 0x2e4f9: 0x6c9e2420, 0x2e4fa: 0x6c9e2620, 0x2e4fb: 0x6c9e2820, - 0x2e4fc: 0x6ccb5020, 0x2e4fd: 0x6ccb5220, 0x2e4fe: 0x6ccb6820, 0x2e4ff: 0x6cf95820, - // Block 0xb94, offset 0x2e500 - 0x2e500: 0x6cf95a20, 0x2e501: 0x6cf95c20, 0x2e502: 0x6cf95e20, 0x2e503: 0x6d287820, - 0x2e504: 0x6d287a20, 0x2e505: 0x6d55ca20, 0x2e506: 0x6d55cc20, 0x2e507: 0x6d812e20, - 0x2e508: 0x6d813020, 0x2e509: 0x6dc89020, 0x2e50a: 0x6e298620, 0x2e50b: 0x6c04b620, - 0x2e50c: 0x6c04b820, 0x2e50d: 0x6c098020, 0x2e50e: 0x6c12d420, 0x2e50f: 0x6c227620, - 0x2e510: 0x6c227820, 0x2e511: 0x6c380e20, 0x2e512: 0x6c535220, 0x2e513: 0x6cf97c20, - 0x2e514: 0x6c04bc20, 0x2e515: 0x6c12d820, 0x2e516: 0x6c535820, 0x2e517: 0x6c535a20, - 0x2e518: 0x6c535c20, 0x2e519: 0x6c75ee20, 0x2e51a: 0x6da74620, 0x2e51b: 0x6c04be20, - 0x2e51c: 0x6c228220, 0x2e51d: 0x6c228420, 0x2e51e: 0x6c382a20, 0x2e51f: 0x6c382c20, - 0x2e520: 0x6c536020, 0x2e521: 0x6c536220, 0x2e522: 0x6c75f820, 0x2e523: 0x6c75fa20, - 0x2e524: 0x6c75fc20, 0x2e525: 0x6c75fe20, 0x2e526: 0x6c760020, 0x2e527: 0x6c760220, - 0x2e528: 0x6c760420, 0x2e529: 0x6c760620, 0x2e52a: 0x6c760820, 0x2e52b: 0x6c9e6220, - 0x2e52c: 0x6c9e6420, 0x2e52d: 0x6c9e6620, 0x2e52e: 0x6c9e6820, 0x2e52f: 0x6ccb7220, - 0x2e530: 0x6ccb7420, 0x2e531: 0x6ccb7620, 0x2e532: 0x6ccb7820, 0x2e533: 0x6ccb7a20, - 0x2e534: 0x6ccb7c20, 0x2e535: 0x6ccb7e20, 0x2e536: 0x6ccb8020, 0x2e537: 0x6cf98c20, - 0x2e538: 0x6cf98e20, 0x2e539: 0x6cf99020, 0x2e53a: 0x6cf99220, 0x2e53b: 0x6cf99420, - 0x2e53c: 0x6cf99620, 0x2e53d: 0x6cf99820, 0x2e53e: 0x6d28aa20, 0x2e53f: 0x6d55de20, - // Block 0xb95, offset 0x2e540 - 0x2e540: 0x6d55e020, 0x2e541: 0x6d55e220, 0x2e542: 0x6d55e420, 0x2e543: 0x6d816620, - 0x2e544: 0x6d816820, 0x2e545: 0x6d816a20, 0x2e546: 0x6d816c20, 0x2e547: 0x6d816e20, - 0x2e548: 0x6da74a20, 0x2e549: 0x6da74c20, 0x2e54a: 0x6da74e20, 0x2e54b: 0x6dc89620, - 0x2e54c: 0x6de4a420, 0x2e54d: 0x6e1e2420, 0x2e54e: 0x6e3d4a20, 0x2e54f: 0x6c04c220, - 0x2e550: 0x6c098420, 0x2e551: 0x6c098620, 0x2e552: 0x6c12e620, 0x2e553: 0x6c385020, - 0x2e554: 0x6c04c420, 0x2e555: 0x6c098a20, 0x2e556: 0x6c12ea20, 0x2e557: 0x6c12ec20, - 0x2e558: 0x6c12ee20, 0x2e559: 0x6c229620, 0x2e55a: 0x6c229820, 0x2e55b: 0x6c385820, - 0x2e55c: 0x6c385a20, 0x2e55d: 0x6c385c20, 0x2e55e: 0x6c53b820, 0x2e55f: 0x6c53ba20, - 0x2e560: 0x6c53bc20, 0x2e561: 0x6c53be20, 0x2e562: 0x6c53c020, 0x2e563: 0x6c763a20, - 0x2e564: 0x6c763c20, 0x2e565: 0x6c763e20, 0x2e566: 0x6c764020, 0x2e567: 0x6c764220, - 0x2e568: 0x6c764420, 0x2e569: 0x6c764620, 0x2e56a: 0x6c9ea220, 0x2e56b: 0x6c9ea420, - 0x2e56c: 0x6ccbc620, 0x2e56d: 0x6ccbc820, 0x2e56e: 0x6ccbca20, 0x2e56f: 0x6ccbcc20, - 0x2e570: 0x6ccbce20, 0x2e571: 0x6cf9d820, 0x2e572: 0x6d28ec20, 0x2e573: 0x6d28ee20, - 0x2e574: 0x6c04c620, 0x2e575: 0x6c01fa20, 0x2e576: 0x6c098e20, 0x2e577: 0x6c099020, - 0x2e578: 0x6c099220, 0x2e579: 0x6c099420, 0x2e57a: 0x6c098c20, 0x2e57b: 0x6c099c20, - 0x2e57c: 0x6c12f620, 0x2e57d: 0x6c0c5c20, 0x2e57e: 0x6c099e20, 0x2e57f: 0x6c09a020, - // Block 0xb96, offset 0x2e580 - 0x2e580: 0x6c09a220, 0x2e581: 0x6c09a420, 0x2e582: 0x6c229e20, 0x2e583: 0x6c09a620, - 0x2e584: 0x6c09a820, 0x2e585: 0x6c09aa20, 0x2e586: 0x6c12f820, 0x2e587: 0x6c09ac20, - 0x2e588: 0x6c09ae20, 0x2e589: 0x6c09b020, 0x2e58a: 0x6c12fe20, 0x2e58b: 0x6c130020, - 0x2e58c: 0x6c130220, 0x2e58d: 0x6c130420, 0x2e58e: 0x6c130620, 0x2e58f: 0x6c130820, - 0x2e590: 0x6c130a20, 0x2e591: 0x6c130c20, 0x2e592: 0x6c130e20, 0x2e593: 0x6c131020, - 0x2e594: 0x6c131220, 0x2e595: 0x6c131420, 0x2e596: 0x6c22a220, 0x2e597: 0x6c131620, - 0x2e598: 0x6c131820, 0x2e599: 0x6c131a20, 0x2e59a: 0x6c131c20, 0x2e59b: 0x6c131e20, - 0x2e59c: 0x6c132020, 0x2e59d: 0x6c132220, 0x2e59e: 0x6c22a420, 0x2e59f: 0x6c132420, - 0x2e5a0: 0x6c132620, 0x2e5a1: 0x6c132820, 0x2e5a2: 0x6c132a20, 0x2e5a3: 0x6c132c20, - 0x2e5a4: 0x6c132e20, 0x2e5a5: 0x6c22bc20, 0x2e5a6: 0x6c22be20, 0x2e5a7: 0x6c22c020, - 0x2e5a8: 0x6c22c220, 0x2e5a9: 0x6c22c420, 0x2e5aa: 0x6c22c620, 0x2e5ab: 0x6c22c820, - 0x2e5ac: 0x6c386620, 0x2e5ad: 0x6c22ca20, 0x2e5ae: 0x6c22cc20, 0x2e5af: 0x6c22ce20, - 0x2e5b0: 0x6c22d020, 0x2e5b1: 0x6c22d220, 0x2e5b2: 0x6c22d420, 0x2e5b3: 0x6c22d620, - 0x2e5b4: 0x6c22d820, 0x2e5b5: 0x6c22da20, 0x2e5b6: 0x6c22dc20, 0x2e5b7: 0x6c135420, - 0x2e5b8: 0x6c22de20, 0x2e5b9: 0x6c22e020, 0x2e5ba: 0x6c22e220, 0x2e5bb: 0x6c22e420, - 0x2e5bc: 0x6c22e620, 0x2e5bd: 0x6c22e820, 0x2e5be: 0x6c22ea20, 0x2e5bf: 0x6c22ec20, - // Block 0xb97, offset 0x2e5c0 - 0x2e5c0: 0x6c386820, 0x2e5c1: 0x6c22ee20, 0x2e5c2: 0x6c22f020, 0x2e5c3: 0x6c22f220, - 0x2e5c4: 0x6c22f420, 0x2e5c5: 0x6c22f620, 0x2e5c6: 0x6c22f820, 0x2e5c7: 0x6c22fa20, - 0x2e5c8: 0x6c22fc20, 0x2e5c9: 0x6c22fe20, 0x2e5ca: 0x6c386a20, 0x2e5cb: 0x6c230020, - 0x2e5cc: 0x6c230220, 0x2e5cd: 0x6c230420, 0x2e5ce: 0x6c230620, 0x2e5cf: 0x6c230820, - 0x2e5d0: 0x6c230a20, 0x2e5d1: 0x6c230c20, 0x2e5d2: 0x6c230e20, 0x2e5d3: 0x6c386c20, - 0x2e5d4: 0x6c231020, 0x2e5d5: 0x6c231220, 0x2e5d6: 0x6c231420, 0x2e5d7: 0x6c53ce20, - 0x2e5d8: 0x6c231620, 0x2e5d9: 0x6c231820, 0x2e5da: 0x6c231a20, 0x2e5db: 0x6c231c20, - 0x2e5dc: 0x6c231e20, 0x2e5dd: 0x6c386e20, 0x2e5de: 0x6c232020, 0x2e5df: 0x6c232220, - 0x2e5e0: 0x6c232420, 0x2e5e1: 0x6c232620, 0x2e5e2: 0x6c232820, 0x2e5e3: 0x6c232a20, - 0x2e5e4: 0x6c232c20, 0x2e5e5: 0x6c232e20, 0x2e5e6: 0x6c233020, 0x2e5e7: 0x6c233220, - 0x2e5e8: 0x6c233420, 0x2e5e9: 0x6c233620, 0x2e5ea: 0x6c233820, 0x2e5eb: 0x6c388620, - 0x2e5ec: 0x6c388820, 0x2e5ed: 0x6c388a20, 0x2e5ee: 0x6c388c20, 0x2e5ef: 0x6c53d020, - 0x2e5f0: 0x6c388e20, 0x2e5f1: 0x6c389020, 0x2e5f2: 0x6c389220, 0x2e5f3: 0x6c389420, - 0x2e5f4: 0x6c389620, 0x2e5f5: 0x6c389820, 0x2e5f6: 0x6c389a20, 0x2e5f7: 0x6c389c20, - 0x2e5f8: 0x6c389e20, 0x2e5f9: 0x6c38a020, 0x2e5fa: 0x6c38a220, 0x2e5fb: 0x6c38a420, - 0x2e5fc: 0x6c38a620, 0x2e5fd: 0x6c38a820, 0x2e5fe: 0x6c38aa20, 0x2e5ff: 0x6c38ac20, - // Block 0xb98, offset 0x2e600 - 0x2e600: 0x6c38ae20, 0x2e601: 0x6c38b020, 0x2e602: 0x6c38b220, 0x2e603: 0x6c38b420, - 0x2e604: 0x6c38b620, 0x2e605: 0x6c38b820, 0x2e606: 0x6c38ba20, 0x2e607: 0x6c38bc20, - 0x2e608: 0x6c38be20, 0x2e609: 0x6c53d220, 0x2e60a: 0x6c38c020, 0x2e60b: 0x6c38c220, - 0x2e60c: 0x6c38c420, 0x2e60d: 0x6c38c620, 0x2e60e: 0x6c38c820, 0x2e60f: 0x6c38ca20, - 0x2e610: 0x6c38cc20, 0x2e611: 0x6c38ce20, 0x2e612: 0x6c38d020, 0x2e613: 0x6c38d220, - 0x2e614: 0x6c38d420, 0x2e615: 0x6c38d620, 0x2e616: 0x6c38d820, 0x2e617: 0x6c38da20, - 0x2e618: 0x6c38dc20, 0x2e619: 0x6c38de20, 0x2e61a: 0x6c53f220, 0x2e61b: 0x6c38e020, - 0x2e61c: 0x6c38e220, 0x2e61d: 0x6c38e420, 0x2e61e: 0x6c38e620, 0x2e61f: 0x6c38e820, - 0x2e620: 0x6c38ea20, 0x2e621: 0x6c38ec20, 0x2e622: 0x6c38ee20, 0x2e623: 0x6c38f020, - 0x2e624: 0x6c38f220, 0x2e625: 0x6c38f420, 0x2e626: 0x6c38f620, 0x2e627: 0x6c38f820, - 0x2e628: 0x6c38fa20, 0x2e629: 0x6c38fc20, 0x2e62a: 0x6c38fe20, 0x2e62b: 0x6c390020, - 0x2e62c: 0x6c390220, 0x2e62d: 0x6c390420, 0x2e62e: 0x6c390620, 0x2e62f: 0x6c390820, - 0x2e630: 0x6c764a20, 0x2e631: 0x6c390a20, 0x2e632: 0x6c390c20, 0x2e633: 0x6c390e20, - 0x2e634: 0x6c53d420, 0x2e635: 0x6c5a4620, 0x2e636: 0x6c53d620, 0x2e637: 0x6c391020, - 0x2e638: 0x6c391220, 0x2e639: 0x6c391420, 0x2e63a: 0x6c391620, 0x2e63b: 0x6c391820, - 0x2e63c: 0x6c391a20, 0x2e63d: 0x6c391c20, 0x2e63e: 0x6c391e20, 0x2e63f: 0x6c53f420, - // Block 0xb99, offset 0x2e640 - 0x2e640: 0x6c53f620, 0x2e641: 0x6c53f820, 0x2e642: 0x6c53fa20, 0x2e643: 0x6c53fc20, - 0x2e644: 0x6c53fe20, 0x2e645: 0x6c540020, 0x2e646: 0x6c540220, 0x2e647: 0x6c540420, - 0x2e648: 0x6c540620, 0x2e649: 0x6c540820, 0x2e64a: 0x6c540a20, 0x2e64b: 0x6c540c20, - 0x2e64c: 0x6c540e20, 0x2e64d: 0x6c767020, 0x2e64e: 0x6c541020, 0x2e64f: 0x6c541220, - 0x2e650: 0x6c541420, 0x2e651: 0x6c541620, 0x2e652: 0x6c541820, 0x2e653: 0x6c541a20, - 0x2e654: 0x6c541c20, 0x2e655: 0x6c541e20, 0x2e656: 0x6c767220, 0x2e657: 0x6c542020, - 0x2e658: 0x6c542220, 0x2e659: 0x6c542420, 0x2e65a: 0x6c542620, 0x2e65b: 0x6c542820, - 0x2e65c: 0x6c764c20, 0x2e65d: 0x6c542a20, 0x2e65e: 0x6c542c20, 0x2e65f: 0x6c542e20, - 0x2e660: 0x6c543020, 0x2e661: 0x6c543220, 0x2e662: 0x6c543420, 0x2e663: 0x6c543620, - 0x2e664: 0x6c543820, 0x2e665: 0x6c543a20, 0x2e666: 0x6c543c20, 0x2e667: 0x6c543e20, - 0x2e668: 0x6c544020, 0x2e669: 0x6c544220, 0x2e66a: 0x6c544420, 0x2e66b: 0x6c544620, - 0x2e66c: 0x6c544820, 0x2e66d: 0x6c544a20, 0x2e66e: 0x6c544c20, 0x2e66f: 0x6c764e20, - 0x2e670: 0x6c399020, 0x2e671: 0x6c544e20, 0x2e672: 0x6c545020, 0x2e673: 0x6c545220, - 0x2e674: 0x6c545420, 0x2e675: 0x6c545620, 0x2e676: 0x6c545820, 0x2e677: 0x6c545a20, - 0x2e678: 0x6c545c20, 0x2e679: 0x6c545e20, 0x2e67a: 0x6c546020, 0x2e67b: 0x6c546220, - 0x2e67c: 0x6c546420, 0x2e67d: 0x6c546620, 0x2e67e: 0x6c546820, 0x2e67f: 0x6c546a20, - // Block 0xb9a, offset 0x2e680 - 0x2e680: 0x6c546c20, 0x2e681: 0x6c546e20, 0x2e682: 0x6c547020, 0x2e683: 0x6c547220, - 0x2e684: 0x6c547420, 0x2e685: 0x6c547620, 0x2e686: 0x6c765020, 0x2e687: 0x6c547820, - 0x2e688: 0x6c547a20, 0x2e689: 0x6c547c20, 0x2e68a: 0x6c547e20, 0x2e68b: 0x6c548020, - 0x2e68c: 0x6c548220, 0x2e68d: 0x6c548420, 0x2e68e: 0x6c548620, 0x2e68f: 0x6c548820, - 0x2e690: 0x6c548a20, 0x2e691: 0x6c548c20, 0x2e692: 0x6c548e20, 0x2e693: 0x6c549020, - 0x2e694: 0x6c549220, 0x2e695: 0x6c549420, 0x2e696: 0x6c767420, 0x2e697: 0x6c767620, - 0x2e698: 0x6c767820, 0x2e699: 0x6c767a20, 0x2e69a: 0x6c767c20, 0x2e69b: 0x6c767e20, - 0x2e69c: 0x6c768020, 0x2e69d: 0x6c768220, 0x2e69e: 0x6c768420, 0x2e69f: 0x6c768620, - 0x2e6a0: 0x6c768820, 0x2e6a1: 0x6c768a20, 0x2e6a2: 0x6c768c20, 0x2e6a3: 0x6c768e20, - 0x2e6a4: 0x6c769020, 0x2e6a5: 0x6c769220, 0x2e6a6: 0x6c769420, 0x2e6a7: 0x6c769620, - 0x2e6a8: 0x6c769820, 0x2e6a9: 0x6c769a20, 0x2e6aa: 0x6c769c20, 0x2e6ab: 0x6c769e20, - 0x2e6ac: 0x6c76a020, 0x2e6ad: 0x6c76a220, 0x2e6ae: 0x6c76a420, 0x2e6af: 0x6c76a620, - 0x2e6b0: 0x6c76a820, 0x2e6b1: 0x6c76aa20, 0x2e6b2: 0x6c76ac20, 0x2e6b3: 0x6c76ae20, - 0x2e6b4: 0x6c76b020, 0x2e6b5: 0x6c76b220, 0x2e6b6: 0x6c76b420, 0x2e6b7: 0x6c76b620, - 0x2e6b8: 0x6c76b820, 0x2e6b9: 0x6c76ba20, 0x2e6ba: 0x6c76bc20, 0x2e6bb: 0x6c76be20, - 0x2e6bc: 0x6c76c020, 0x2e6bd: 0x6c76c220, 0x2e6be: 0x6c76c420, 0x2e6bf: 0x6c76c620, - // Block 0xb9b, offset 0x2e6c0 - 0x2e6c0: 0x6c76c820, 0x2e6c1: 0x6c76ca20, 0x2e6c2: 0x6c76cc20, 0x2e6c3: 0x6c76ce20, - 0x2e6c4: 0x6c76d020, 0x2e6c5: 0x6c76d220, 0x2e6c6: 0x6c76d420, 0x2e6c7: 0x6c76d620, - 0x2e6c8: 0x6c76d820, 0x2e6c9: 0x6c76da20, 0x2e6ca: 0x6c76dc20, 0x2e6cb: 0x6c76de20, - 0x2e6cc: 0x6c76e020, 0x2e6cd: 0x6c76e220, 0x2e6ce: 0x6c9eae20, 0x2e6cf: 0x6c76e420, - 0x2e6d0: 0x6c76e620, 0x2e6d1: 0x6c76e820, 0x2e6d2: 0x6c76ea20, 0x2e6d3: 0x6c76ec20, - 0x2e6d4: 0x6c76ee20, 0x2e6d5: 0x6c76f020, 0x2e6d6: 0x6c76f220, 0x2e6d7: 0x6c76f420, - 0x2e6d8: 0x6c76f620, 0x2e6d9: 0x6c9ee020, 0x2e6da: 0x6c76f820, 0x2e6db: 0x6c76fa20, - 0x2e6dc: 0x6c76fc20, 0x2e6dd: 0x6c76fe20, 0x2e6de: 0x6c770020, 0x2e6df: 0x6c770220, - 0x2e6e0: 0x6c770420, 0x2e6e1: 0x6c770620, 0x2e6e2: 0x6c770820, 0x2e6e3: 0x6c770a20, - 0x2e6e4: 0x6c770c20, 0x2e6e5: 0x6c770e20, 0x2e6e6: 0x6c771020, 0x2e6e7: 0x6c771220, - 0x2e6e8: 0x6c771420, 0x2e6e9: 0x6c771620, 0x2e6ea: 0x6c9ee220, 0x2e6eb: 0x6c9ee420, - 0x2e6ec: 0x6c9ee620, 0x2e6ed: 0x6c9ee820, 0x2e6ee: 0x6c9eea20, 0x2e6ef: 0x6c9eec20, - 0x2e6f0: 0x6c9eee20, 0x2e6f1: 0x6c9ef020, 0x2e6f2: 0x6c9ef220, 0x2e6f3: 0x6c9ef420, - 0x2e6f4: 0x6c9ef620, 0x2e6f5: 0x6c9ef820, 0x2e6f6: 0x6c9efa20, 0x2e6f7: 0x6c9efc20, - 0x2e6f8: 0x6c9efe20, 0x2e6f9: 0x6c9f0020, 0x2e6fa: 0x6c9f0220, 0x2e6fb: 0x6c9f0420, - 0x2e6fc: 0x6c9f0620, 0x2e6fd: 0x6c9f0820, 0x2e6fe: 0x6c9f0a20, 0x2e6ff: 0x6c9f0c20, - // Block 0xb9c, offset 0x2e700 - 0x2e700: 0x6c9f0e20, 0x2e701: 0x6c9f1020, 0x2e702: 0x6c9f1220, 0x2e703: 0x6c9f1420, - 0x2e704: 0x6c9f1620, 0x2e705: 0x6c9f1820, 0x2e706: 0x6c9f1a20, 0x2e707: 0x6c9f1c20, - 0x2e708: 0x6c9f1e20, 0x2e709: 0x6c9f2020, 0x2e70a: 0x6c9f2220, 0x2e70b: 0x6c9f2420, - 0x2e70c: 0x6c9f2620, 0x2e70d: 0x6c9f2820, 0x2e70e: 0x6c9f2a20, 0x2e70f: 0x6c9f2c20, - 0x2e710: 0x6c9f2e20, 0x2e711: 0x6c9f3020, 0x2e712: 0x6c9f3220, 0x2e713: 0x6c9f3420, - 0x2e714: 0x6c9f3620, 0x2e715: 0x6c9f3820, 0x2e716: 0x6c9f3a20, 0x2e717: 0x6c9f3c20, - 0x2e718: 0x6c9f3e20, 0x2e719: 0x6c9f4020, 0x2e71a: 0x6c9f4220, 0x2e71b: 0x6c9f4420, - 0x2e71c: 0x6c9f4620, 0x2e71d: 0x6c9f4820, 0x2e71e: 0x6c9f4a20, 0x2e71f: 0x6c9f4c20, - 0x2e720: 0x6c9f4e20, 0x2e721: 0x6c9f5020, 0x2e722: 0x6c9f5220, 0x2e723: 0x6c9f5420, - 0x2e724: 0x6c9f5620, 0x2e725: 0x6c9f5820, 0x2e726: 0x6c9f5a20, 0x2e727: 0x6c9f5c20, - 0x2e728: 0x6c9f5e20, 0x2e729: 0x6c9f6020, 0x2e72a: 0x6c9f6220, 0x2e72b: 0x6c9f6420, - 0x2e72c: 0x6c9f6620, 0x2e72d: 0x6c9f6820, 0x2e72e: 0x6c9f6a20, 0x2e72f: 0x6c9f6c20, - 0x2e730: 0x6c9f6e20, 0x2e731: 0x6c9f7020, 0x2e732: 0x6c9f7220, 0x2e733: 0x6c9f7420, - 0x2e734: 0x6c9f7620, 0x2e735: 0x6c9f7820, 0x2e736: 0x6c9f7a20, 0x2e737: 0x6c9f7c20, - 0x2e738: 0x6c9f7e20, 0x2e739: 0x6c9f8020, 0x2e73a: 0x6c9f8220, 0x2e73b: 0x6c9f8420, - 0x2e73c: 0x6ccbdc20, 0x2e73d: 0x6c9f8620, 0x2e73e: 0x6ccbde20, 0x2e73f: 0x6c9f8820, - // Block 0xb9d, offset 0x2e740 - 0x2e740: 0x6c9f8a20, 0x2e741: 0x6c9f8c20, 0x2e742: 0x6c9f8e20, 0x2e743: 0x6ccc0c20, - 0x2e744: 0x6c9f9020, 0x2e745: 0x6c9f9220, 0x2e746: 0x6c9f9420, 0x2e747: 0x6c9f9620, - 0x2e748: 0x6c9f9820, 0x2e749: 0x6c9f9a20, 0x2e74a: 0x6c9f9c20, 0x2e74b: 0x6c9f9e20, - 0x2e74c: 0x6c9fa020, 0x2e74d: 0x6c9fa220, 0x2e74e: 0x6c9fa420, 0x2e74f: 0x6c9fa620, - 0x2e750: 0x6c9fa820, 0x2e751: 0x6c9faa20, 0x2e752: 0x6c9fac20, 0x2e753: 0x6c9fae20, - 0x2e754: 0x6c9fb020, 0x2e755: 0x6c9fb220, 0x2e756: 0x6c9fb420, 0x2e757: 0x6c9fb620, - 0x2e758: 0x6ccc0e20, 0x2e759: 0x6ccc1020, 0x2e75a: 0x6c9fb820, 0x2e75b: 0x6ccc1220, - 0x2e75c: 0x6ccc1420, 0x2e75d: 0x6ccc1620, 0x2e75e: 0x6ccc1820, 0x2e75f: 0x6ccc1a20, - 0x2e760: 0x6ccc1c20, 0x2e761: 0x6ccc1e20, 0x2e762: 0x6ccc2020, 0x2e763: 0x6ccc2220, - 0x2e764: 0x6ccc2420, 0x2e765: 0x6ccc2620, 0x2e766: 0x6ccc2820, 0x2e767: 0x6ccc2a20, - 0x2e768: 0x6ccc2c20, 0x2e769: 0x6ccc2e20, 0x2e76a: 0x6ccc3020, 0x2e76b: 0x6ccc3220, - 0x2e76c: 0x6ccc3420, 0x2e76d: 0x6ccc3620, 0x2e76e: 0x6ccc3820, 0x2e76f: 0x6ccc3a20, - 0x2e770: 0x6ccc3c20, 0x2e771: 0x6ccc3e20, 0x2e772: 0x6ccc4020, 0x2e773: 0x6ccc4220, - 0x2e774: 0x6ccc4420, 0x2e775: 0x6ccc4620, 0x2e776: 0x6ccc4820, 0x2e777: 0x6ccc4a20, - 0x2e778: 0x6ccc4c20, 0x2e779: 0x6ccc4e20, 0x2e77a: 0x6ccc5020, 0x2e77b: 0x6ccc5220, - 0x2e77c: 0x6ccc5420, 0x2e77d: 0x6ccc5620, 0x2e77e: 0x6ccc5820, 0x2e77f: 0x6ccc5a20, - // Block 0xb9e, offset 0x2e780 - 0x2e780: 0x6ccc5c20, 0x2e781: 0x6ccc5e20, 0x2e782: 0x6ccc6020, 0x2e783: 0x6ccc6220, - 0x2e784: 0x6ccc6420, 0x2e785: 0x6ccc6620, 0x2e786: 0x6ccc6820, 0x2e787: 0x6ccc6a20, - 0x2e788: 0x6ccc6c20, 0x2e789: 0x6ccc6e20, 0x2e78a: 0x6ccc7020, 0x2e78b: 0x6ccc7220, - 0x2e78c: 0x6ccc7420, 0x2e78d: 0x6ccc7620, 0x2e78e: 0x6ccc7820, 0x2e78f: 0x6ccc7a20, - 0x2e790: 0x6ccc7c20, 0x2e791: 0x6ccc7e20, 0x2e792: 0x6ccc8020, 0x2e793: 0x6ccc8220, - 0x2e794: 0x6ccc8420, 0x2e795: 0x6ccc8620, 0x2e796: 0x6ccc8820, 0x2e797: 0x6ccc8a20, - 0x2e798: 0x6ccc8c20, 0x2e799: 0x6ccc8e20, 0x2e79a: 0x6ccc9020, 0x2e79b: 0x6ccc9220, - 0x2e79c: 0x6ccc9420, 0x2e79d: 0x6ccc9620, 0x2e79e: 0x6ccc9820, 0x2e79f: 0x6ccc9a20, - 0x2e7a0: 0x6ccc9c20, 0x2e7a1: 0x6ccc9e20, 0x2e7a2: 0x6ccca020, 0x2e7a3: 0x6ccca220, - 0x2e7a4: 0x6ccca420, 0x2e7a5: 0x6ccca620, 0x2e7a6: 0x6ccca820, 0x2e7a7: 0x6cccaa20, - 0x2e7a8: 0x6cccac20, 0x2e7a9: 0x6cccae20, 0x2e7aa: 0x6cccb020, 0x2e7ab: 0x6cccb220, - 0x2e7ac: 0x6cf9e220, 0x2e7ad: 0x6cccb420, 0x2e7ae: 0x6cccb620, 0x2e7af: 0x6cccb820, - 0x2e7b0: 0x6cccba20, 0x2e7b1: 0x6cccbc20, 0x2e7b2: 0x6cccbe20, 0x2e7b3: 0x6cccc020, - 0x2e7b4: 0x6c9fba20, 0x2e7b5: 0x6cccc220, 0x2e7b6: 0x6cccc420, 0x2e7b7: 0x6cccc620, - 0x2e7b8: 0x6cccc820, 0x2e7b9: 0x6cccca20, 0x2e7ba: 0x6ccccc20, 0x2e7bb: 0x6cccce20, - 0x2e7bc: 0x6cccd020, 0x2e7bd: 0x6cccd220, 0x2e7be: 0x6cccd420, 0x2e7bf: 0x6cccd620, - // Block 0xb9f, offset 0x2e7c0 - 0x2e7c0: 0x6cccd820, 0x2e7c1: 0x6cccda20, 0x2e7c2: 0x6cccdc20, 0x2e7c3: 0x6cccde20, - 0x2e7c4: 0x6ccce020, 0x2e7c5: 0x6ccce220, 0x2e7c6: 0x6ccce420, 0x2e7c7: 0x6ccce620, - 0x2e7c8: 0x6ccce820, 0x2e7c9: 0x6cccea20, 0x2e7ca: 0x6cccec20, 0x2e7cb: 0x6cccee20, - 0x2e7cc: 0x6cccf020, 0x2e7cd: 0x6cfa1220, 0x2e7ce: 0x6cfa1420, 0x2e7cf: 0x6cfa1620, - 0x2e7d0: 0x6cfa1820, 0x2e7d1: 0x6cfa1a20, 0x2e7d2: 0x6cfa1c20, 0x2e7d3: 0x6cfa1e20, - 0x2e7d4: 0x6cfa2020, 0x2e7d5: 0x6cfa2220, 0x2e7d6: 0x6cfa2420, 0x2e7d7: 0x6cfa2620, - 0x2e7d8: 0x6cfa2820, 0x2e7d9: 0x6cfa2a20, 0x2e7da: 0x6cfa2c20, 0x2e7db: 0x6cfa2e20, - 0x2e7dc: 0x6cfa3020, 0x2e7dd: 0x6cfa3220, 0x2e7de: 0x6cfa3420, 0x2e7df: 0x6cfa3620, - 0x2e7e0: 0x6cfa3820, 0x2e7e1: 0x6cfa3a20, 0x2e7e2: 0x6cfa3c20, 0x2e7e3: 0x6cfa3e20, - 0x2e7e4: 0x6cfa4020, 0x2e7e5: 0x6cfa4220, 0x2e7e6: 0x6cfa4420, 0x2e7e7: 0x6cfa4620, - 0x2e7e8: 0x6cfa4820, 0x2e7e9: 0x6cfa4a20, 0x2e7ea: 0x6cfa4c20, 0x2e7eb: 0x6cfa4e20, - 0x2e7ec: 0x6cfa5020, 0x2e7ed: 0x6cfa5220, 0x2e7ee: 0x6cfa5420, 0x2e7ef: 0x6cfa5620, - 0x2e7f0: 0x6cfa5820, 0x2e7f1: 0x6cfa5a20, 0x2e7f2: 0x6cfa5c20, 0x2e7f3: 0x6cfa5e20, - 0x2e7f4: 0x6cfa6020, 0x2e7f5: 0x6cfa6220, 0x2e7f6: 0x6cfa6420, 0x2e7f7: 0x6cfa6620, - 0x2e7f8: 0x6cfa6820, 0x2e7f9: 0x6cfa6a20, 0x2e7fa: 0x6cfa6c20, 0x2e7fb: 0x6cfa6e20, - 0x2e7fc: 0x6cfa7020, 0x2e7fd: 0x6cfa7220, 0x2e7fe: 0x6cfa7420, 0x2e7ff: 0x6cfa7620, - // Block 0xba0, offset 0x2e800 - 0x2e800: 0x6cfa7820, 0x2e801: 0x6cfa7a20, 0x2e802: 0x6cfa7c20, 0x2e803: 0x6cfa7e20, - 0x2e804: 0x6cfa8020, 0x2e805: 0x6cfa8220, 0x2e806: 0x6cfa8420, 0x2e807: 0x6cfa8620, - 0x2e808: 0x6cfa8820, 0x2e809: 0x6cfa8a20, 0x2e80a: 0x6cfa8c20, 0x2e80b: 0x6cccf220, - 0x2e80c: 0x6d291220, 0x2e80d: 0x6cfa8e20, 0x2e80e: 0x6d28f420, 0x2e80f: 0x6cfa9020, - 0x2e810: 0x6cfa9220, 0x2e811: 0x6cfa9420, 0x2e812: 0x6cfa9620, 0x2e813: 0x6cfa9820, - 0x2e814: 0x6cfa9a20, 0x2e815: 0x6d561820, 0x2e816: 0x6cfa9c20, 0x2e817: 0x6cfa9e20, - 0x2e818: 0x6cfaa020, 0x2e819: 0x6cfaa220, 0x2e81a: 0x6cfbd620, 0x2e81b: 0x6cfaa420, - 0x2e81c: 0x6cfaa620, 0x2e81d: 0x6cfaa820, 0x2e81e: 0x6cccf420, 0x2e81f: 0x6cfaaa20, - 0x2e820: 0x6cfaac20, 0x2e821: 0x6cfaae20, 0x2e822: 0x6cfab020, 0x2e823: 0x6cfab220, - 0x2e824: 0x6cfab420, 0x2e825: 0x6cfab620, 0x2e826: 0x6cfab820, 0x2e827: 0x6cfaba20, - 0x2e828: 0x6cfabc20, 0x2e829: 0x6cfabe20, 0x2e82a: 0x6cfac020, 0x2e82b: 0x6d291420, - 0x2e82c: 0x6d291620, 0x2e82d: 0x6d291820, 0x2e82e: 0x6d291a20, 0x2e82f: 0x6d291c20, - 0x2e830: 0x6d291e20, 0x2e831: 0x6d292020, 0x2e832: 0x6d292220, 0x2e833: 0x6d292420, - 0x2e834: 0x6d292620, 0x2e835: 0x6d292820, 0x2e836: 0x6d292a20, 0x2e837: 0x6d292c20, - 0x2e838: 0x6d292e20, 0x2e839: 0x6d293020, 0x2e83a: 0x6d293220, 0x2e83b: 0x6d293420, - 0x2e83c: 0x6d293620, 0x2e83d: 0x6d293820, 0x2e83e: 0x6d293a20, 0x2e83f: 0x6d293c20, - // Block 0xba1, offset 0x2e840 - 0x2e840: 0x6d561a20, 0x2e841: 0x6d293e20, 0x2e842: 0x6d294020, 0x2e843: 0x6d294220, - 0x2e844: 0x6d294420, 0x2e845: 0x6d294620, 0x2e846: 0x6d294820, 0x2e847: 0x6d294a20, - 0x2e848: 0x6d294c20, 0x2e849: 0x6d294e20, 0x2e84a: 0x6d295020, 0x2e84b: 0x6d564820, - 0x2e84c: 0x6d295220, 0x2e84d: 0x6d295420, 0x2e84e: 0x6d295620, 0x2e84f: 0x6d295820, - 0x2e850: 0x6d561c20, 0x2e851: 0x6d295a20, 0x2e852: 0x6d295c20, 0x2e853: 0x6cfac220, - 0x2e854: 0x6d295e20, 0x2e855: 0x6d296020, 0x2e856: 0x6d296220, 0x2e857: 0x6d296420, - 0x2e858: 0x6d296620, 0x2e859: 0x6d296820, 0x2e85a: 0x6d296a20, 0x2e85b: 0x6d296c20, - 0x2e85c: 0x6d296e20, 0x2e85d: 0x6d297020, 0x2e85e: 0x6d297220, 0x2e85f: 0x6d297420, - 0x2e860: 0x6d297620, 0x2e861: 0x6d297820, 0x2e862: 0x6d297a20, 0x2e863: 0x6d297c20, - 0x2e864: 0x6d297e20, 0x2e865: 0x6d298020, 0x2e866: 0x6d561e20, 0x2e867: 0x6d298220, - 0x2e868: 0x6d298420, 0x2e869: 0x6d298620, 0x2e86a: 0x6d298820, 0x2e86b: 0x6d298a20, - 0x2e86c: 0x6d298c20, 0x2e86d: 0x6d298e20, 0x2e86e: 0x6d299020, 0x2e86f: 0x6d299220, - 0x2e870: 0x6d299420, 0x2e871: 0x6d299620, 0x2e872: 0x6d299820, 0x2e873: 0x6d299a20, - 0x2e874: 0x6d299c20, 0x2e875: 0x6d299e20, 0x2e876: 0x6d29a020, 0x2e877: 0x6d29a220, - 0x2e878: 0x6d29a420, 0x2e879: 0x6d29a620, 0x2e87a: 0x6d29a820, 0x2e87b: 0x6d29aa20, - 0x2e87c: 0x6d29ac20, 0x2e87d: 0x6d564a20, 0x2e87e: 0x6d29ae20, 0x2e87f: 0x6d562020, - // Block 0xba2, offset 0x2e880 - 0x2e880: 0x6d29b020, 0x2e881: 0x6d562220, 0x2e882: 0x6d29b220, 0x2e883: 0x6d29b420, - 0x2e884: 0x6d29b620, 0x2e885: 0x6d29b820, 0x2e886: 0x6d29ba20, 0x2e887: 0x6d29bc20, - 0x2e888: 0x6d29be20, 0x2e889: 0x6d29c020, 0x2e88a: 0x6d29c220, 0x2e88b: 0x6d29c420, - 0x2e88c: 0x6d29c620, 0x2e88d: 0x6d29c820, 0x2e88e: 0x6d2aca20, 0x2e88f: 0x6d564c20, - 0x2e890: 0x6d564e20, 0x2e891: 0x6d565020, 0x2e892: 0x6d565220, 0x2e893: 0x6d565420, - 0x2e894: 0x6d565620, 0x2e895: 0x6d565820, 0x2e896: 0x6d565a20, 0x2e897: 0x6d565c20, - 0x2e898: 0x6d565e20, 0x2e899: 0x6d566020, 0x2e89a: 0x6d566220, 0x2e89b: 0x6d566420, - 0x2e89c: 0x6d566620, 0x2e89d: 0x6d566820, 0x2e89e: 0x6d819a20, 0x2e89f: 0x6d566a20, - 0x2e8a0: 0x6d566c20, 0x2e8a1: 0x6d566e20, 0x2e8a2: 0x6d567020, 0x2e8a3: 0x6d567220, - 0x2e8a4: 0x6d567420, 0x2e8a5: 0x6d567620, 0x2e8a6: 0x6d567820, 0x2e8a7: 0x6d567a20, - 0x2e8a8: 0x6d567c20, 0x2e8a9: 0x6d567e20, 0x2e8aa: 0x6d568020, 0x2e8ab: 0x6d568220, - 0x2e8ac: 0x6d568420, 0x2e8ad: 0x6d568620, 0x2e8ae: 0x6d568820, 0x2e8af: 0x6d568a20, - 0x2e8b0: 0x6d568c20, 0x2e8b1: 0x6d568e20, 0x2e8b2: 0x6d569020, 0x2e8b3: 0x6d2acc20, - 0x2e8b4: 0x6d569220, 0x2e8b5: 0x6d569420, 0x2e8b6: 0x6d569620, 0x2e8b7: 0x6d569820, - 0x2e8b8: 0x6d569a20, 0x2e8b9: 0x6d569c20, 0x2e8ba: 0x6d569e20, 0x2e8bb: 0x6d56a020, - 0x2e8bc: 0x6d56a220, 0x2e8bd: 0x6d56a420, 0x2e8be: 0x6d56a620, 0x2e8bf: 0x6d56a820, - // Block 0xba3, offset 0x2e8c0 - 0x2e8c0: 0x6da79820, 0x2e8c1: 0x6d56aa20, 0x2e8c2: 0x6d56ac20, 0x2e8c3: 0x6d819c20, - 0x2e8c4: 0x6d56ae20, 0x2e8c5: 0x6d56b020, 0x2e8c6: 0x6d56b220, 0x2e8c7: 0x6d56b420, - 0x2e8c8: 0x6d56b620, 0x2e8c9: 0x6d56b820, 0x2e8ca: 0x6d56ba20, 0x2e8cb: 0x6d56bc20, - 0x2e8cc: 0x6d56be20, 0x2e8cd: 0x6d56c020, 0x2e8ce: 0x6d56c220, 0x2e8cf: 0x6d56c420, - 0x2e8d0: 0x6d56c620, 0x2e8d1: 0x6d56c820, 0x2e8d2: 0x6d56ca20, 0x2e8d3: 0x6d56cc20, - 0x2e8d4: 0x6d56ce20, 0x2e8d5: 0x6d56d020, 0x2e8d6: 0x6d56d220, 0x2e8d7: 0x6d56d420, - 0x2e8d8: 0x6d56d620, 0x2e8d9: 0x6d81c020, 0x2e8da: 0x6d56d820, 0x2e8db: 0x6d56da20, - 0x2e8dc: 0x6d56dc20, 0x2e8dd: 0x6d56de20, 0x2e8de: 0x6d81c220, 0x2e8df: 0x6d81c420, - 0x2e8e0: 0x6d81c620, 0x2e8e1: 0x6d81c820, 0x2e8e2: 0x6d81ca20, 0x2e8e3: 0x6d81cc20, - 0x2e8e4: 0x6d81ce20, 0x2e8e5: 0x6d81d020, 0x2e8e6: 0x6d81d220, 0x2e8e7: 0x6d81d420, - 0x2e8e8: 0x6d81d620, 0x2e8e9: 0x6da77820, 0x2e8ea: 0x6d81d820, 0x2e8eb: 0x6d81da20, - 0x2e8ec: 0x6d81dc20, 0x2e8ed: 0x6d81de20, 0x2e8ee: 0x6d81e020, 0x2e8ef: 0x6d81e220, - 0x2e8f0: 0x6d81e420, 0x2e8f1: 0x6d81e620, 0x2e8f2: 0x6d81e820, 0x2e8f3: 0x6d81ea20, - 0x2e8f4: 0x6d81ec20, 0x2e8f5: 0x6d81ee20, 0x2e8f6: 0x6d81f020, 0x2e8f7: 0x6d81f220, - 0x2e8f8: 0x6d81f420, 0x2e8f9: 0x6d81f620, 0x2e8fa: 0x6d81f820, 0x2e8fb: 0x6d81fa20, - 0x2e8fc: 0x6d81fc20, 0x2e8fd: 0x6d81fe20, 0x2e8fe: 0x6d820020, 0x2e8ff: 0x6d820220, - // Block 0xba4, offset 0x2e900 - 0x2e900: 0x6d820420, 0x2e901: 0x6d820620, 0x2e902: 0x6d820820, 0x2e903: 0x6d820a20, - 0x2e904: 0x6d820c20, 0x2e905: 0x6d820e20, 0x2e906: 0x6d580a20, 0x2e907: 0x6d821020, - 0x2e908: 0x6d821220, 0x2e909: 0x6d821420, 0x2e90a: 0x6d821620, 0x2e90b: 0x6d821820, - 0x2e90c: 0x6da77a20, 0x2e90d: 0x6d821a20, 0x2e90e: 0x6d821c20, 0x2e90f: 0x6d821e20, - 0x2e910: 0x6d56e020, 0x2e911: 0x6d822020, 0x2e912: 0x6d822220, 0x2e913: 0x6d822420, - 0x2e914: 0x6da79a20, 0x2e915: 0x6da79c20, 0x2e916: 0x6d822620, 0x2e917: 0x6da79e20, - 0x2e918: 0x6da7a020, 0x2e919: 0x6da7a220, 0x2e91a: 0x6da7a420, 0x2e91b: 0x6da7a620, - 0x2e91c: 0x6da7a820, 0x2e91d: 0x6da7aa20, 0x2e91e: 0x6da7ac20, 0x2e91f: 0x6da7ae20, - 0x2e920: 0x6da7b020, 0x2e921: 0x6da7b220, 0x2e922: 0x6da7b420, 0x2e923: 0x6da7b620, - 0x2e924: 0x6da7b820, 0x2e925: 0x6da7ba20, 0x2e926: 0x6da7bc20, 0x2e927: 0x6da7be20, - 0x2e928: 0x6da7c020, 0x2e929: 0x6da7c220, 0x2e92a: 0x6da7c420, 0x2e92b: 0x6da7c620, - 0x2e92c: 0x6da7c820, 0x2e92d: 0x6da7ca20, 0x2e92e: 0x6da7cc20, 0x2e92f: 0x6da7ce20, - 0x2e930: 0x6da7d020, 0x2e931: 0x6da7d220, 0x2e932: 0x6da7d420, 0x2e933: 0x6de4c220, - 0x2e934: 0x6da7d620, 0x2e935: 0x6da7d820, 0x2e936: 0x6da7da20, 0x2e937: 0x6dc8c220, - 0x2e938: 0x6da7dc20, 0x2e939: 0x6dc8d220, 0x2e93a: 0x6dc8d420, 0x2e93b: 0x6dc8d620, - 0x2e93c: 0x6dc8d820, 0x2e93d: 0x6dc8da20, 0x2e93e: 0x6dc8dc20, 0x2e93f: 0x6dc8de20, - // Block 0xba5, offset 0x2e940 - 0x2e940: 0x6dc8e020, 0x2e941: 0x6dc8e220, 0x2e942: 0x6dc8e420, 0x2e943: 0x6dc8e620, - 0x2e944: 0x6d82fc20, 0x2e945: 0x6dc8e820, 0x2e946: 0x6dc8ea20, 0x2e947: 0x6dc8ec20, - 0x2e948: 0x6dc8ee20, 0x2e949: 0x6dc8f020, 0x2e94a: 0x6dc8f220, 0x2e94b: 0x6dc8f420, - 0x2e94c: 0x6dc8f620, 0x2e94d: 0x6dc8f820, 0x2e94e: 0x6dc8fa20, 0x2e94f: 0x6dc8fc20, - 0x2e950: 0x6dc8fe20, 0x2e951: 0x6dc90020, 0x2e952: 0x6dc90220, 0x2e953: 0x6dc90420, - 0x2e954: 0x6dc90620, 0x2e955: 0x6de4c420, 0x2e956: 0x6de4c620, 0x2e957: 0x6de4c820, - 0x2e958: 0x6de4ca20, 0x2e959: 0x6de4cc20, 0x2e95a: 0x6de4ce20, 0x2e95b: 0x6de4d020, - 0x2e95c: 0x6de4d220, 0x2e95d: 0x6de4d420, 0x2e95e: 0x6de4d620, 0x2e95f: 0x6de4d820, - 0x2e960: 0x6de4da20, 0x2e961: 0x6de4dc20, 0x2e962: 0x6de4de20, 0x2e963: 0x6de4e020, - 0x2e964: 0x6de4e220, 0x2e965: 0x6de4e420, 0x2e966: 0x6dc9b820, 0x2e967: 0x6de4e620, - 0x2e968: 0x6de4e820, 0x2e969: 0x6de4ea20, 0x2e96a: 0x6dfbc220, 0x2e96b: 0x6de4ec20, - 0x2e96c: 0x6de4ee20, 0x2e96d: 0x6de4f020, 0x2e96e: 0x6de4f220, 0x2e96f: 0x6dfbd020, - 0x2e970: 0x6dfbd220, 0x2e971: 0x6dfbd420, 0x2e972: 0x6dfbd620, 0x2e973: 0x6dfbd820, - 0x2e974: 0x6dfbda20, 0x2e975: 0x6dfbdc20, 0x2e976: 0x6dfbde20, 0x2e977: 0x6dfbe020, - 0x2e978: 0x6dfbe220, 0x2e979: 0x6dfbe420, 0x2e97a: 0x6dfbe620, 0x2e97b: 0x6dfbe820, - 0x2e97c: 0x6dfbea20, 0x2e97d: 0x6dfbec20, 0x2e97e: 0x6dfbee20, 0x2e97f: 0x6dfbf020, - // Block 0xba6, offset 0x2e980 - 0x2e980: 0x6dfbf220, 0x2e981: 0x6dfbf420, 0x2e982: 0x6dfc4820, 0x2e983: 0x6e0f0620, - 0x2e984: 0x6e0f0820, 0x2e985: 0x6e0f0a20, 0x2e986: 0x6e0f0c20, 0x2e987: 0x6e0f0e20, - 0x2e988: 0x6e0f1020, 0x2e989: 0x6e0f1220, 0x2e98a: 0x6e0f1420, 0x2e98b: 0x6e0f1620, - 0x2e98c: 0x6e0f1820, 0x2e98d: 0x6e0f1a20, 0x2e98e: 0x6e3d5220, 0x2e98f: 0x6e0f1c20, - 0x2e990: 0x6e0f1e20, 0x2e991: 0x6e1e3420, 0x2e992: 0x6e1e3620, 0x2e993: 0x6e299620, - 0x2e994: 0x6e1e3820, 0x2e995: 0x6e1e3a20, 0x2e996: 0x6e1e3c20, 0x2e997: 0x6e1e3e20, - 0x2e998: 0x6e1e4020, 0x2e999: 0x6e299e20, 0x2e99a: 0x6e29a020, 0x2e99b: 0x6e29a220, - 0x2e99c: 0x6e29a420, 0x2e99d: 0x6e32a220, 0x2e99e: 0x6e32a420, 0x2e99f: 0x6e32a620, - 0x2e9a0: 0x6e32a820, 0x2e9a1: 0x6e32aa20, 0x2e9a2: 0x6e38e020, 0x2e9a3: 0x6e38e220, - 0x2e9a4: 0x6e3d5420, 0x2e9a5: 0x6e405c20, 0x2e9a6: 0x6e3d5620, 0x2e9a7: 0x6e405e20, - 0x2e9a8: 0x6e406020, 0x2e9a9: 0x6e45c420, 0x2e9aa: 0x6e463020, 0x2e9ab: 0x6c04d020, - 0x2e9ac: 0x6c04d220, 0x2e9ad: 0x6c09ca20, 0x2e9ae: 0x6c135a20, 0x2e9af: 0x6c135c20, - 0x2e9b0: 0x6c135e20, 0x2e9b1: 0x6c136020, 0x2e9b2: 0x6c136220, 0x2e9b3: 0x6c136420, - 0x2e9b4: 0x6c239020, 0x2e9b5: 0x6c239220, 0x2e9b6: 0x6c239420, 0x2e9b7: 0x6c239620, - 0x2e9b8: 0x6c239820, 0x2e9b9: 0x6c239a20, 0x2e9ba: 0x6c239c20, 0x2e9bb: 0x6c239e20, - 0x2e9bc: 0x6c23a020, 0x2e9bd: 0x6c23a220, 0x2e9be: 0x6c23a420, 0x2e9bf: 0x6c23a620, - // Block 0xba7, offset 0x2e9c0 - 0x2e9c0: 0x6c23a820, 0x2e9c1: 0x6c399e20, 0x2e9c2: 0x6c39a020, 0x2e9c3: 0x6c39a220, - 0x2e9c4: 0x6c39a420, 0x2e9c5: 0x6c39a620, 0x2e9c6: 0x6c39a820, 0x2e9c7: 0x6c399220, - 0x2e9c8: 0x6c39aa20, 0x2e9c9: 0x6c39ac20, 0x2e9ca: 0x6c39ae20, 0x2e9cb: 0x6c39b020, - 0x2e9cc: 0x6c39b220, 0x2e9cd: 0x6c39b420, 0x2e9ce: 0x6c39b620, 0x2e9cf: 0x6c39b820, - 0x2e9d0: 0x6c39ba20, 0x2e9d1: 0x6c39bc20, 0x2e9d2: 0x6c39be20, 0x2e9d3: 0x6c39c020, - 0x2e9d4: 0x6c39c220, 0x2e9d5: 0x6c39c420, 0x2e9d6: 0x6c39c620, 0x2e9d7: 0x6c39c820, - 0x2e9d8: 0x6c39ca20, 0x2e9d9: 0x6c39cc20, 0x2e9da: 0x6c39ce20, 0x2e9db: 0x6c39d020, - 0x2e9dc: 0x6c39d220, 0x2e9dd: 0x6c39d420, 0x2e9de: 0x6c39d620, 0x2e9df: 0x6c552820, - 0x2e9e0: 0x6c552a20, 0x2e9e1: 0x6c552c20, 0x2e9e2: 0x6c552e20, 0x2e9e3: 0x6c553020, - 0x2e9e4: 0x6c553220, 0x2e9e5: 0x6c553420, 0x2e9e6: 0x6c553620, 0x2e9e7: 0x6c553820, - 0x2e9e8: 0x6c553a20, 0x2e9e9: 0x6c553c20, 0x2e9ea: 0x6c553e20, 0x2e9eb: 0x6c554020, - 0x2e9ec: 0x6c554220, 0x2e9ed: 0x6c554420, 0x2e9ee: 0x6c554620, 0x2e9ef: 0x6c554820, - 0x2e9f0: 0x6c554a20, 0x2e9f1: 0x6c554c20, 0x2e9f2: 0x6c554e20, 0x2e9f3: 0x6c555020, - 0x2e9f4: 0x6c555220, 0x2e9f5: 0x6c555420, 0x2e9f6: 0x6c555620, 0x2e9f7: 0x6c555820, - 0x2e9f8: 0x6c555a20, 0x2e9f9: 0x6c555c20, 0x2e9fa: 0x6c555e20, 0x2e9fb: 0x6c556020, - 0x2e9fc: 0x6c556220, 0x2e9fd: 0x6c556420, 0x2e9fe: 0x6c556620, 0x2e9ff: 0x6c556820, - // Block 0xba8, offset 0x2ea00 - 0x2ea00: 0x6c556a20, 0x2ea01: 0x6c556c20, 0x2ea02: 0x6c556e20, 0x2ea03: 0x6c557020, - 0x2ea04: 0x6c77f620, 0x2ea05: 0x6c77f820, 0x2ea06: 0x6c77fa20, 0x2ea07: 0x6c77fc20, - 0x2ea08: 0x6c77fe20, 0x2ea09: 0x6c780020, 0x2ea0a: 0x6c780220, 0x2ea0b: 0x6c780420, - 0x2ea0c: 0x6c780620, 0x2ea0d: 0x6c780820, 0x2ea0e: 0x6c780a20, 0x2ea0f: 0x6c780c20, - 0x2ea10: 0x6c780e20, 0x2ea11: 0x6c781020, 0x2ea12: 0x6c781220, 0x2ea13: 0x6c781420, - 0x2ea14: 0x6c781620, 0x2ea15: 0x6c781820, 0x2ea16: 0x6c781a20, 0x2ea17: 0x6c781c20, - 0x2ea18: 0x6c781e20, 0x2ea19: 0x6c782020, 0x2ea1a: 0x6c782220, 0x2ea1b: 0x6c782420, - 0x2ea1c: 0x6c782620, 0x2ea1d: 0x6c782820, 0x2ea1e: 0x6c782a20, 0x2ea1f: 0x6c782c20, - 0x2ea20: 0x6c782e20, 0x2ea21: 0x6c783020, 0x2ea22: 0x6c783220, 0x2ea23: 0x6c783420, - 0x2ea24: 0x6c783620, 0x2ea25: 0x6c783820, 0x2ea26: 0x6c783a20, 0x2ea27: 0x6c783c20, - 0x2ea28: 0x6c783e20, 0x2ea29: 0x6c784020, 0x2ea2a: 0x6c784220, 0x2ea2b: 0x6c784420, - 0x2ea2c: 0x6c784620, 0x2ea2d: 0x6c784820, 0x2ea2e: 0x6c784a20, 0x2ea2f: 0x6ca0f020, - 0x2ea30: 0x6ca0f220, 0x2ea31: 0x6ca0f420, 0x2ea32: 0x6ca0f620, 0x2ea33: 0x6ca0f820, - 0x2ea34: 0x6ca0fa20, 0x2ea35: 0x6ca0fc20, 0x2ea36: 0x6ca0fe20, 0x2ea37: 0x6ca10020, - 0x2ea38: 0x6ca10220, 0x2ea39: 0x6ca10420, 0x2ea3a: 0x6ca10620, 0x2ea3b: 0x6ccddc20, - 0x2ea3c: 0x6ca10820, 0x2ea3d: 0x6ca10a20, 0x2ea3e: 0x6ca10c20, 0x2ea3f: 0x6ca10e20, - // Block 0xba9, offset 0x2ea40 - 0x2ea40: 0x6ca11020, 0x2ea41: 0x6ca11220, 0x2ea42: 0x6ca11420, 0x2ea43: 0x6ca11620, - 0x2ea44: 0x6ca11820, 0x2ea45: 0x6ca11a20, 0x2ea46: 0x6ca11c20, 0x2ea47: 0x6ca11e20, - 0x2ea48: 0x6ca12020, 0x2ea49: 0x6ca12220, 0x2ea4a: 0x6ca12420, 0x2ea4b: 0x6ca12620, - 0x2ea4c: 0x6ca12820, 0x2ea4d: 0x6ca12a20, 0x2ea4e: 0x6ca12c20, 0x2ea4f: 0x6ca12e20, - 0x2ea50: 0x6ca13020, 0x2ea51: 0x6ca13220, 0x2ea52: 0x6ca13420, 0x2ea53: 0x6ca13620, - 0x2ea54: 0x6ca1cc20, 0x2ea55: 0x6ca13820, 0x2ea56: 0x6ca13a20, 0x2ea57: 0x6ca13c20, - 0x2ea58: 0x6ca13e20, 0x2ea59: 0x6ccdf620, 0x2ea5a: 0x6ccdf820, 0x2ea5b: 0x6ccdfa20, - 0x2ea5c: 0x6ccdfc20, 0x2ea5d: 0x6ccdfe20, 0x2ea5e: 0x6cce0020, 0x2ea5f: 0x6cce0220, - 0x2ea60: 0x6cce0420, 0x2ea61: 0x6cce0620, 0x2ea62: 0x6cce0820, 0x2ea63: 0x6cce0a20, - 0x2ea64: 0x6cce0c20, 0x2ea65: 0x6cce0e20, 0x2ea66: 0x6cce1020, 0x2ea67: 0x6cce1220, - 0x2ea68: 0x6cce1420, 0x2ea69: 0x6cce1620, 0x2ea6a: 0x6cce1820, 0x2ea6b: 0x6cce1a20, - 0x2ea6c: 0x6cce1c20, 0x2ea6d: 0x6cce1e20, 0x2ea6e: 0x6cce2020, 0x2ea6f: 0x6cce2220, - 0x2ea70: 0x6cce2420, 0x2ea71: 0x6cce2620, 0x2ea72: 0x6cce2820, 0x2ea73: 0x6cce2a20, - 0x2ea74: 0x6cce2c20, 0x2ea75: 0x6cce2e20, 0x2ea76: 0x6cce3020, 0x2ea77: 0x6cce3220, - 0x2ea78: 0x6cce3420, 0x2ea79: 0x6cce3620, 0x2ea7a: 0x6cce3820, 0x2ea7b: 0x6cce3a20, - 0x2ea7c: 0x6cce3c20, 0x2ea7d: 0x6cce3e20, 0x2ea7e: 0x6cce4020, 0x2ea7f: 0x6cce4220, - // Block 0xbaa, offset 0x2ea80 - 0x2ea80: 0x6cce4420, 0x2ea81: 0x6cfbfc20, 0x2ea82: 0x6cfbfe20, 0x2ea83: 0x6cfc0020, - 0x2ea84: 0x6cfc0220, 0x2ea85: 0x6cfc0420, 0x2ea86: 0x6cfc0620, 0x2ea87: 0x6cfc0820, - 0x2ea88: 0x6cfc0a20, 0x2ea89: 0x6cfc0c20, 0x2ea8a: 0x6cfc0e20, 0x2ea8b: 0x6cfc1020, - 0x2ea8c: 0x6cfc1220, 0x2ea8d: 0x6cfc1420, 0x2ea8e: 0x6cfc1620, 0x2ea8f: 0x6cfc1820, - 0x2ea90: 0x6cfc1a20, 0x2ea91: 0x6cfc1c20, 0x2ea92: 0x6cfc1e20, 0x2ea93: 0x6cfc2020, - 0x2ea94: 0x6cfc2220, 0x2ea95: 0x6d2ace20, 0x2ea96: 0x6cfc2420, 0x2ea97: 0x6cfc2620, - 0x2ea98: 0x6cfc2820, 0x2ea99: 0x6cfc2a20, 0x2ea9a: 0x6cfc2c20, 0x2ea9b: 0x6d2ad020, - 0x2ea9c: 0x6cfc2e20, 0x2ea9d: 0x6cfc3020, 0x2ea9e: 0x6cfc3220, 0x2ea9f: 0x6cfc3420, - 0x2eaa0: 0x6cfc3620, 0x2eaa1: 0x6cfc3820, 0x2eaa2: 0x6cfc3a20, 0x2eaa3: 0x6cfc3c20, - 0x2eaa4: 0x6cfc3e20, 0x2eaa5: 0x6cfc4020, 0x2eaa6: 0x6cfc4220, 0x2eaa7: 0x6cfc4420, - 0x2eaa8: 0x6cfc4620, 0x2eaa9: 0x6cfc4820, 0x2eaaa: 0x6cfc4a20, 0x2eaab: 0x6cfc4c20, - 0x2eaac: 0x6cfc4e20, 0x2eaad: 0x6cfc5020, 0x2eaae: 0x6cce4620, 0x2eaaf: 0x6cfc5220, - 0x2eab0: 0x6cfc5420, 0x2eab1: 0x6cfc5620, 0x2eab2: 0x6cfc5820, 0x2eab3: 0x6cfc5a20, - 0x2eab4: 0x6cfc5c20, 0x2eab5: 0x6cfc5e20, 0x2eab6: 0x6cfc6020, 0x2eab7: 0x6cfc6220, - 0x2eab8: 0x6cfc6420, 0x2eab9: 0x6d2aea20, 0x2eaba: 0x6cfc6620, 0x2eabb: 0x6d2aec20, - 0x2eabc: 0x6d2aee20, 0x2eabd: 0x6d2af020, 0x2eabe: 0x6d2af220, 0x2eabf: 0x6d2af420, - // Block 0xbab, offset 0x2eac0 - 0x2eac0: 0x6d2af620, 0x2eac1: 0x6d2af820, 0x2eac2: 0x6d2afa20, 0x2eac3: 0x6d2afc20, - 0x2eac4: 0x6d2afe20, 0x2eac5: 0x6d2b0020, 0x2eac6: 0x6d2b0220, 0x2eac7: 0x6d2b0420, - 0x2eac8: 0x6d2b0620, 0x2eac9: 0x6d2b0820, 0x2eaca: 0x6d2b0a20, 0x2eacb: 0x6d2b0c20, - 0x2eacc: 0x6d2b0e20, 0x2eacd: 0x6d2b1020, 0x2eace: 0x6d2b1220, 0x2eacf: 0x6d2b1420, - 0x2ead0: 0x6d2b1620, 0x2ead1: 0x6d2b1820, 0x2ead2: 0x6d2b1a20, 0x2ead3: 0x6d2b1c20, - 0x2ead4: 0x6d2b1e20, 0x2ead5: 0x6d2b2020, 0x2ead6: 0x6d2b2220, 0x2ead7: 0x6d2b2420, - 0x2ead8: 0x6d2b2620, 0x2ead9: 0x6d2b2820, 0x2eada: 0x6d581e20, 0x2eadb: 0x6d582020, - 0x2eadc: 0x6d582220, 0x2eadd: 0x6d582420, 0x2eade: 0x6d582620, 0x2eadf: 0x6d582820, - 0x2eae0: 0x6d582a20, 0x2eae1: 0x6d582c20, 0x2eae2: 0x6d582e20, 0x2eae3: 0x6d583020, - 0x2eae4: 0x6d583220, 0x2eae5: 0x6d583420, 0x2eae6: 0x6d580c20, 0x2eae7: 0x6d583620, - 0x2eae8: 0x6d583820, 0x2eae9: 0x6d583a20, 0x2eaea: 0x6d583c20, 0x2eaeb: 0x6d583e20, - 0x2eaec: 0x6d584020, 0x2eaed: 0x6d584220, 0x2eaee: 0x6d584420, 0x2eaef: 0x6d584620, - 0x2eaf0: 0x6d584820, 0x2eaf1: 0x6d584a20, 0x2eaf2: 0x6d584c20, 0x2eaf3: 0x6d584e20, - 0x2eaf4: 0x6d585020, 0x2eaf5: 0x6d585220, 0x2eaf6: 0x6d831420, 0x2eaf7: 0x6d831620, - 0x2eaf8: 0x6d831820, 0x2eaf9: 0x6d831a20, 0x2eafa: 0x6d831c20, 0x2eafb: 0x6d831e20, - 0x2eafc: 0x6d832020, 0x2eafd: 0x6d832220, 0x2eafe: 0x6d832420, 0x2eaff: 0x6d832620, - // Block 0xbac, offset 0x2eb00 - 0x2eb00: 0x6d832820, 0x2eb01: 0x6d832a20, 0x2eb02: 0x6d832c20, 0x2eb03: 0x6d832e20, - 0x2eb04: 0x6d833020, 0x2eb05: 0x6d833220, 0x2eb06: 0x6d833420, 0x2eb07: 0x6d833620, - 0x2eb08: 0x6d833820, 0x2eb09: 0x6d833a20, 0x2eb0a: 0x6d833c20, 0x2eb0b: 0x6d833e20, - 0x2eb0c: 0x6d834020, 0x2eb0d: 0x6d834220, 0x2eb0e: 0x6d834420, 0x2eb0f: 0x6d834620, - 0x2eb10: 0x6d834820, 0x2eb11: 0x6d834a20, 0x2eb12: 0x6d834c20, 0x2eb13: 0x6d834e20, - 0x2eb14: 0x6d835020, 0x2eb15: 0x6d835220, 0x2eb16: 0x6d835420, 0x2eb17: 0x6d835620, - 0x2eb18: 0x6d835820, 0x2eb19: 0x6d835a20, 0x2eb1a: 0x6d835c20, 0x2eb1b: 0x6d835e20, - 0x2eb1c: 0x6d836020, 0x2eb1d: 0x6d836220, 0x2eb1e: 0x6d836420, 0x2eb1f: 0x6da87c20, - 0x2eb20: 0x6da87e20, 0x2eb21: 0x6da88020, 0x2eb22: 0x6da88220, 0x2eb23: 0x6da88420, - 0x2eb24: 0x6da88620, 0x2eb25: 0x6da88820, 0x2eb26: 0x6da88a20, 0x2eb27: 0x6da88c20, - 0x2eb28: 0x6da88e20, 0x2eb29: 0x6da89020, 0x2eb2a: 0x6da89220, 0x2eb2b: 0x6da89420, - 0x2eb2c: 0x6da89620, 0x2eb2d: 0x6da89820, 0x2eb2e: 0x6da89a20, 0x2eb2f: 0x6da89c20, - 0x2eb30: 0x6da89e20, 0x2eb31: 0x6da8a020, 0x2eb32: 0x6da8a220, 0x2eb33: 0x6da8a420, - 0x2eb34: 0x6da8a620, 0x2eb35: 0x6da8a820, 0x2eb36: 0x6da8aa20, 0x2eb37: 0x6da8ac20, - 0x2eb38: 0x6dc9be20, 0x2eb39: 0x6dc9c020, 0x2eb3a: 0x6dc9c220, 0x2eb3b: 0x6dc9c420, - 0x2eb3c: 0x6dc9c620, 0x2eb3d: 0x6dc9c820, 0x2eb3e: 0x6dc9ca20, 0x2eb3f: 0x6dc9cc20, - // Block 0xbad, offset 0x2eb40 - 0x2eb40: 0x6dc9ce20, 0x2eb41: 0x6dc9d020, 0x2eb42: 0x6de57020, 0x2eb43: 0x6dc9d220, - 0x2eb44: 0x6de57820, 0x2eb45: 0x6de57a20, 0x2eb46: 0x6de57c20, 0x2eb47: 0x6de57e20, - 0x2eb48: 0x6de58020, 0x2eb49: 0x6de58220, 0x2eb4a: 0x6de58420, 0x2eb4b: 0x6dfc5220, - 0x2eb4c: 0x6de58620, 0x2eb4d: 0x6de58820, 0x2eb4e: 0x6de58a20, 0x2eb4f: 0x6dfc5420, - 0x2eb50: 0x6dfc5620, 0x2eb51: 0x6dfc5820, 0x2eb52: 0x6dfc5a20, 0x2eb53: 0x6dfc5c20, - 0x2eb54: 0x6dfc5e20, 0x2eb55: 0x6de58c20, 0x2eb56: 0x6dfc6020, 0x2eb57: 0x6dfc6220, - 0x2eb58: 0x6dfc6420, 0x2eb59: 0x6e0f7e20, 0x2eb5a: 0x6e0f8020, 0x2eb5b: 0x6e0f8220, - 0x2eb5c: 0x6e1e7020, 0x2eb5d: 0x6e0fb220, 0x2eb5e: 0x6e1e7220, 0x2eb5f: 0x6e1e7420, - 0x2eb60: 0x6e1e7620, 0x2eb61: 0x6e29da20, 0x2eb62: 0x6e29dc20, 0x2eb63: 0x6e32c020, - 0x2eb64: 0x6e38f220, 0x2eb65: 0x6e38f420, 0x2eb66: 0x6e38f620, 0x2eb67: 0x6e42b620, - 0x2eb68: 0x6e443420, 0x2eb69: 0x6e468220, 0x2eb6a: 0x6c04d620, 0x2eb6b: 0x6c04d820, - 0x2eb6c: 0x6c3a2820, 0x2eb6d: 0x6c3a2a20, 0x2eb6e: 0x6c55ee20, 0x2eb6f: 0x6c55f020, - 0x2eb70: 0x6c55f220, 0x2eb71: 0x6c78ca20, 0x2eb72: 0x6ccf0a20, 0x2eb73: 0x6d2bdc20, - 0x2eb74: 0x6d590420, 0x2eb75: 0x6da93020, 0x2eb76: 0x6c04de20, 0x2eb77: 0x6c137a20, - 0x2eb78: 0x6c3a3a20, 0x2eb79: 0x6c78d620, 0x2eb7a: 0x6cfd4020, 0x2eb7b: 0x6c04e020, - 0x2eb7c: 0x6c561820, 0x2eb7d: 0x6ca1e020, 0x2eb7e: 0x6d2bec20, 0x2eb7f: 0x6c04e420, - // Block 0xbae, offset 0x2eb80 - 0x2eb80: 0x6c3a4620, 0x2eb81: 0x6c562020, 0x2eb82: 0x6c78e220, 0x2eb83: 0x6cfd4820, - 0x2eb84: 0x6d2bf020, 0x2eb85: 0x6d591e20, 0x2eb86: 0x6da93220, 0x2eb87: 0x6c04e820, - 0x2eb88: 0x6c3a5220, 0x2eb89: 0x6c562a20, 0x2eb8a: 0x6c562c20, 0x2eb8b: 0x6ccf3c20, - 0x2eb8c: 0x6ccf3e20, 0x2eb8d: 0x6ccf4020, 0x2eb8e: 0x6cfd5020, 0x2eb8f: 0x6cfd5220, - 0x2eb90: 0x6cfd5420, 0x2eb91: 0x6cfd5620, 0x2eb92: 0x6cfd5820, 0x2eb93: 0x6d2bfc20, - 0x2eb94: 0x6d2bfe20, 0x2eb95: 0x6d592820, 0x2eb96: 0x6d592a20, 0x2eb97: 0x6d592c20, - 0x2eb98: 0x6de5e220, 0x2eb99: 0x6c04ec20, 0x2eb9a: 0x6ccf6620, 0x2eb9b: 0x6c04f020, - 0x2eb9c: 0x6c04f220, 0x2eb9d: 0x6c138020, 0x2eb9e: 0x6c138220, 0x2eb9f: 0x6c138420, - 0x2eba0: 0x6c23ec20, 0x2eba1: 0x6c23ee20, 0x2eba2: 0x6c23f020, 0x2eba3: 0x6c23f220, - 0x2eba4: 0x6c23f420, 0x2eba5: 0x6c3a6c20, 0x2eba6: 0x6c3a6e20, 0x2eba7: 0x6c3a7020, - 0x2eba8: 0x6c3a7220, 0x2eba9: 0x6c3a7420, 0x2ebaa: 0x6c3a7620, 0x2ebab: 0x6c3a7820, - 0x2ebac: 0x6c3a7a20, 0x2ebad: 0x6c564c20, 0x2ebae: 0x6c564e20, 0x2ebaf: 0x6c565020, - 0x2ebb0: 0x6c565220, 0x2ebb1: 0x6c565420, 0x2ebb2: 0x6c565620, 0x2ebb3: 0x6c565820, - 0x2ebb4: 0x6c565a20, 0x2ebb5: 0x6c565c20, 0x2ebb6: 0x6c791020, 0x2ebb7: 0x6c791220, - 0x2ebb8: 0x6c791420, 0x2ebb9: 0x6c791620, 0x2ebba: 0x6c791820, 0x2ebbb: 0x6ca21e20, - 0x2ebbc: 0x6ca22020, 0x2ebbd: 0x6ca22220, 0x2ebbe: 0x6ca22420, 0x2ebbf: 0x6ca22620, - // Block 0xbaf, offset 0x2ebc0 - 0x2ebc0: 0x6ccf7820, 0x2ebc1: 0x6ca22820, 0x2ebc2: 0x6ccf7a20, 0x2ebc3: 0x6ccf7c20, - 0x2ebc4: 0x6ccf7e20, 0x2ebc5: 0x6ccf8020, 0x2ebc6: 0x6ccf8220, 0x2ebc7: 0x6ccf8420, - 0x2ebc8: 0x6ccf8620, 0x2ebc9: 0x6ccf8820, 0x2ebca: 0x6ccf8a20, 0x2ebcb: 0x6ccf8c20, - 0x2ebcc: 0x6cfd7820, 0x2ebcd: 0x6cfd7a20, 0x2ebce: 0x6cfd7c20, 0x2ebcf: 0x6cfd7e20, - 0x2ebd0: 0x6cfd8020, 0x2ebd1: 0x6cfd8220, 0x2ebd2: 0x6d2c1620, 0x2ebd3: 0x6d2c1820, - 0x2ebd4: 0x6d2c1a20, 0x2ebd5: 0x6d2c1c20, 0x2ebd6: 0x6d2c1e20, 0x2ebd7: 0x6d2c2020, - 0x2ebd8: 0x6d595020, 0x2ebd9: 0x6d595220, 0x2ebda: 0x6d595420, 0x2ebdb: 0x6d595620, - 0x2ebdc: 0x6d845820, 0x2ebdd: 0x6d845a20, 0x2ebde: 0x6d845c20, 0x2ebdf: 0x6d845e20, - 0x2ebe0: 0x6da94e20, 0x2ebe1: 0x6de5e620, 0x2ebe2: 0x6de5e820, 0x2ebe3: 0x6de5ea20, - 0x2ebe4: 0x6de5ec20, 0x2ebe5: 0x6de5ee20, 0x2ebe6: 0x6de5f020, 0x2ebe7: 0x6dfcd820, - 0x2ebe8: 0x6dfcda20, 0x2ebe9: 0x6e1e9c20, 0x2ebea: 0x6e390e20, 0x2ebeb: 0x6e407820, - 0x2ebec: 0x6c04f420, 0x2ebed: 0x6c01fe20, 0x2ebee: 0x6c09dc20, 0x2ebef: 0x6c09de20, - 0x2ebf0: 0x6c09e020, 0x2ebf1: 0x6c138c20, 0x2ebf2: 0x6c138e20, 0x2ebf3: 0x6c139020, - 0x2ebf4: 0x6c139220, 0x2ebf5: 0x6c139420, 0x2ebf6: 0x6c240020, 0x2ebf7: 0x6c139620, - 0x2ebf8: 0x6c139820, 0x2ebf9: 0x6c240a20, 0x2ebfa: 0x6c240c20, 0x2ebfb: 0x6c240e20, - 0x2ebfc: 0x6c241020, 0x2ebfd: 0x6c241220, 0x2ebfe: 0x6c241420, 0x2ebff: 0x6c241620, - // Block 0xbb0, offset 0x2ec00 - 0x2ec00: 0x6c3ab620, 0x2ec01: 0x6c241820, 0x2ec02: 0x6c241a20, 0x2ec03: 0x6c241c20, - 0x2ec04: 0x6c241e20, 0x2ec05: 0x6c242020, 0x2ec06: 0x6c242220, 0x2ec07: 0x6c242420, - 0x2ec08: 0x6c242620, 0x2ec09: 0x6c3acc20, 0x2ec0a: 0x6c569620, 0x2ec0b: 0x6c3ace20, - 0x2ec0c: 0x6c3ad020, 0x2ec0d: 0x6c3ad220, 0x2ec0e: 0x6c3ad420, 0x2ec0f: 0x6c3ad620, - 0x2ec10: 0x6c3ad820, 0x2ec11: 0x6c3ada20, 0x2ec12: 0x6c3adc20, 0x2ec13: 0x6c3ade20, - 0x2ec14: 0x6c3ae020, 0x2ec15: 0x6c3ae220, 0x2ec16: 0x6c3ae420, 0x2ec17: 0x6c3ae620, - 0x2ec18: 0x6c3ae820, 0x2ec19: 0x6c3aea20, 0x2ec1a: 0x6c3aec20, 0x2ec1b: 0x6c3aee20, - 0x2ec1c: 0x6c3af020, 0x2ec1d: 0x6c3af220, 0x2ec1e: 0x6c3af420, 0x2ec1f: 0x6c56a420, - 0x2ec20: 0x6c56a620, 0x2ec21: 0x6c56a820, 0x2ec22: 0x6c56aa20, 0x2ec23: 0x6c56ac20, - 0x2ec24: 0x6c56ae20, 0x2ec25: 0x6c56b020, 0x2ec26: 0x6c56b220, 0x2ec27: 0x6c56b420, - 0x2ec28: 0x6c56b620, 0x2ec29: 0x6c56b820, 0x2ec2a: 0x6c56ba20, 0x2ec2b: 0x6c56bc20, - 0x2ec2c: 0x6c56be20, 0x2ec2d: 0x6c56c020, 0x2ec2e: 0x6c56c220, 0x2ec2f: 0x6c56c420, - 0x2ec30: 0x6c56c620, 0x2ec31: 0x6c56c820, 0x2ec32: 0x6c56ca20, 0x2ec33: 0x6c794420, - 0x2ec34: 0x6c794620, 0x2ec35: 0x6c794820, 0x2ec36: 0x6c794a20, 0x2ec37: 0x6c794c20, - 0x2ec38: 0x6c794e20, 0x2ec39: 0x6c795020, 0x2ec3a: 0x6c795220, 0x2ec3b: 0x6c795420, - 0x2ec3c: 0x6c795620, 0x2ec3d: 0x6c795820, 0x2ec3e: 0x6c795a20, 0x2ec3f: 0x6ca25220, - // Block 0xbb1, offset 0x2ec40 - 0x2ec40: 0x6c795c20, 0x2ec41: 0x6c795e20, 0x2ec42: 0x6c796020, 0x2ec43: 0x6c796220, - 0x2ec44: 0x6ca26420, 0x2ec45: 0x6ca26620, 0x2ec46: 0x6ccfce20, 0x2ec47: 0x6ca26820, - 0x2ec48: 0x6ca26a20, 0x2ec49: 0x6ca26c20, 0x2ec4a: 0x6ca26e20, 0x2ec4b: 0x6ccfd020, - 0x2ec4c: 0x6ccfd220, 0x2ec4d: 0x6ca27020, 0x2ec4e: 0x6ca27220, 0x2ec4f: 0x6ca27420, - 0x2ec50: 0x6ca27620, 0x2ec51: 0x6ca27820, 0x2ec52: 0x6ccfd420, 0x2ec53: 0x6ca27a20, - 0x2ec54: 0x6ca27c20, 0x2ec55: 0x6ca27e20, 0x2ec56: 0x6ca28020, 0x2ec57: 0x6ca28220, - 0x2ec58: 0x6ca28420, 0x2ec59: 0x6ca28620, 0x2ec5a: 0x6ca28820, 0x2ec5b: 0x6ca28a20, - 0x2ec5c: 0x6ca28c20, 0x2ec5d: 0x6ca28e20, 0x2ec5e: 0x6ca29020, 0x2ec5f: 0x6ca29220, - 0x2ec60: 0x6ca29420, 0x2ec61: 0x6ca29620, 0x2ec62: 0x6ccfe420, 0x2ec63: 0x6ccfe620, - 0x2ec64: 0x6ccfe820, 0x2ec65: 0x6ccfea20, 0x2ec66: 0x6ccfec20, 0x2ec67: 0x6ccfee20, - 0x2ec68: 0x6ccff020, 0x2ec69: 0x6ccff220, 0x2ec6a: 0x6ca29820, 0x2ec6b: 0x6ccfd620, - 0x2ec6c: 0x6ccff420, 0x2ec6d: 0x6ccff620, 0x2ec6e: 0x6cfdbe20, 0x2ec6f: 0x6ccff820, - 0x2ec70: 0x6ccffa20, 0x2ec71: 0x6ccffc20, 0x2ec72: 0x6ccffe20, 0x2ec73: 0x6cd00020, - 0x2ec74: 0x6cd00220, 0x2ec75: 0x6cd00420, 0x2ec76: 0x6cd00620, 0x2ec77: 0x6cfdc020, - 0x2ec78: 0x6cd00820, 0x2ec79: 0x6cd00a20, 0x2ec7a: 0x6cfdd220, 0x2ec7b: 0x6cfdd420, - 0x2ec7c: 0x6cfdd620, 0x2ec7d: 0x6cfdd820, 0x2ec7e: 0x6cfdda20, 0x2ec7f: 0x6cfddc20, - // Block 0xbb2, offset 0x2ec80 - 0x2ec80: 0x6cfdde20, 0x2ec81: 0x6cfdc220, 0x2ec82: 0x6cfde020, 0x2ec83: 0x6d2c6a20, - 0x2ec84: 0x6d2c7820, 0x2ec85: 0x6cfde220, 0x2ec86: 0x6cfde420, 0x2ec87: 0x6cfde620, - 0x2ec88: 0x6cfde820, 0x2ec89: 0x6cfdea20, 0x2ec8a: 0x6cfdec20, 0x2ec8b: 0x6d599420, - 0x2ec8c: 0x6d2c7a20, 0x2ec8d: 0x6d2c7c20, 0x2ec8e: 0x6d598620, 0x2ec8f: 0x6d2c7e20, - 0x2ec90: 0x6d2c8020, 0x2ec91: 0x6d2c8220, 0x2ec92: 0x6d2c8420, 0x2ec93: 0x6d2c6820, - 0x2ec94: 0x6d2c8620, 0x2ec95: 0x6d2c8820, 0x2ec96: 0x6d599620, 0x2ec97: 0x6d599820, - 0x2ec98: 0x6d599a20, 0x2ec99: 0x6d599c20, 0x2ec9a: 0x6d599e20, 0x2ec9b: 0x6d59a020, - 0x2ec9c: 0x6d59a220, 0x2ec9d: 0x6d59a420, 0x2ec9e: 0x6d59a620, 0x2ec9f: 0x6d59a820, - 0x2eca0: 0x6d59aa20, 0x2eca1: 0x6d59ac20, 0x2eca2: 0x6d59ae20, 0x2eca3: 0x6d847e20, - 0x2eca4: 0x6d59b020, 0x2eca5: 0x6d848620, 0x2eca6: 0x6d848820, 0x2eca7: 0x6d848a20, - 0x2eca8: 0x6d848c20, 0x2eca9: 0x6d848e20, 0x2ecaa: 0x6d849020, 0x2ecab: 0x6d849220, - 0x2ecac: 0x6d849420, 0x2ecad: 0x6d849620, 0x2ecae: 0x6da96a20, 0x2ecaf: 0x6da96c20, - 0x2ecb0: 0x6da96e20, 0x2ecb1: 0x6da97020, 0x2ecb2: 0x6da97220, 0x2ecb3: 0x6da97420, - 0x2ecb4: 0x6da97620, 0x2ecb5: 0x6dca5a20, 0x2ecb6: 0x6dca5c20, 0x2ecb7: 0x6dca5e20, - 0x2ecb8: 0x6de60020, 0x2ecb9: 0x6de60620, 0x2ecba: 0x6de60820, 0x2ecbb: 0x6dfce620, - 0x2ecbc: 0x6dfcf020, 0x2ecbd: 0x6dfcf220, 0x2ecbe: 0x6e0fc820, 0x2ecbf: 0x6e1ea820, - // Block 0xbb3, offset 0x2ecc0 - 0x2ecc0: 0x6e1eaa20, 0x2ecc1: 0x6e2a0c20, 0x2ecc2: 0x6e2a0e20, 0x2ecc3: 0x6e2a1020, - 0x2ecc4: 0x6c09ee20, 0x2ecc5: 0x6c572620, 0x2ecc6: 0x6c79ba20, 0x2ecc7: 0x6ca2d620, - 0x2ecc8: 0x6ca2d820, 0x2ecc9: 0x6c09f220, 0x2ecca: 0x6c09f420, 0x2eccb: 0x6c04fa20, - 0x2eccc: 0x6c09f620, 0x2eccd: 0x6c09f820, 0x2ecce: 0x6c13be20, 0x2eccf: 0x6c13c020, - 0x2ecd0: 0x6c13c220, 0x2ecd1: 0x6c13c420, 0x2ecd2: 0x6c247420, 0x2ecd3: 0x6c247620, - 0x2ecd4: 0x6c247820, 0x2ecd5: 0x6c247a20, 0x2ecd6: 0x6c247c20, 0x2ecd7: 0x6c247e20, - 0x2ecd8: 0x6c248020, 0x2ecd9: 0x6c248220, 0x2ecda: 0x6c248420, 0x2ecdb: 0x6c248620, - 0x2ecdc: 0x6c3b4420, 0x2ecdd: 0x6c3b4620, 0x2ecde: 0x6c3b4820, 0x2ecdf: 0x6c3b4a20, - 0x2ece0: 0x6c3b4c20, 0x2ece1: 0x6c3b4e20, 0x2ece2: 0x6c3b5020, 0x2ece3: 0x6c3b5220, - 0x2ece4: 0x6c3b5420, 0x2ece5: 0x6c3b5620, 0x2ece6: 0x6c3b5820, 0x2ece7: 0x6c3b5a20, - 0x2ece8: 0x6c3b5c20, 0x2ece9: 0x6c3b5e20, 0x2ecea: 0x6c3b6020, 0x2eceb: 0x6c3b6220, - 0x2ecec: 0x6c3b6420, 0x2eced: 0x6c3b6620, 0x2ecee: 0x6c3b6820, 0x2ecef: 0x6c3b6a20, - 0x2ecf0: 0x6c3b6c20, 0x2ecf1: 0x6c3b6e20, 0x2ecf2: 0x6c573a20, 0x2ecf3: 0x6c573c20, - 0x2ecf4: 0x6c573e20, 0x2ecf5: 0x6c574020, 0x2ecf6: 0x6c574220, 0x2ecf7: 0x6c574420, - 0x2ecf8: 0x6c574620, 0x2ecf9: 0x6c574820, 0x2ecfa: 0x6c79be20, 0x2ecfb: 0x6c574a20, - 0x2ecfc: 0x6c79c020, 0x2ecfd: 0x6c574c20, 0x2ecfe: 0x6c574e20, 0x2ecff: 0x6c575020, - // Block 0xbb4, offset 0x2ed00 - 0x2ed00: 0x6c575220, 0x2ed01: 0x6c575420, 0x2ed02: 0x6c575620, 0x2ed03: 0x6c575820, - 0x2ed04: 0x6c575a20, 0x2ed05: 0x6c575c20, 0x2ed06: 0x6c575e20, 0x2ed07: 0x6c576020, - 0x2ed08: 0x6c576220, 0x2ed09: 0x6c576420, 0x2ed0a: 0x6c576620, 0x2ed0b: 0x6c576820, - 0x2ed0c: 0x6c576a20, 0x2ed0d: 0x6c576c20, 0x2ed0e: 0x6c576e20, 0x2ed0f: 0x6c577020, - 0x2ed10: 0x6c577220, 0x2ed11: 0x6c577420, 0x2ed12: 0x6c79d620, 0x2ed13: 0x6c79d820, - 0x2ed14: 0x6c79da20, 0x2ed15: 0x6c79dc20, 0x2ed16: 0x6c79de20, 0x2ed17: 0x6c79e020, - 0x2ed18: 0x6c79e220, 0x2ed19: 0x6c79e420, 0x2ed1a: 0x6c79e620, 0x2ed1b: 0x6c79e820, - 0x2ed1c: 0x6c79ea20, 0x2ed1d: 0x6c79ec20, 0x2ed1e: 0x6c79ee20, 0x2ed1f: 0x6c79f020, - 0x2ed20: 0x6c79f220, 0x2ed21: 0x6c79f420, 0x2ed22: 0x6c79f620, 0x2ed23: 0x6c79f820, - 0x2ed24: 0x6c79fa20, 0x2ed25: 0x6c79fc20, 0x2ed26: 0x6c79fe20, 0x2ed27: 0x6c7a0020, - 0x2ed28: 0x6c7a0220, 0x2ed29: 0x6c7a0420, 0x2ed2a: 0x6c7a0620, 0x2ed2b: 0x6c7a0820, - 0x2ed2c: 0x6c7a0a20, 0x2ed2d: 0x6c7a0c20, 0x2ed2e: 0x6c7a0e20, 0x2ed2f: 0x6c7a1020, - 0x2ed30: 0x6c7a1220, 0x2ed31: 0x6c7a1420, 0x2ed32: 0x6c7a1620, 0x2ed33: 0x6ca2ea20, - 0x2ed34: 0x6ca2ec20, 0x2ed35: 0x6ca2ee20, 0x2ed36: 0x6ca2f020, 0x2ed37: 0x6cd08c20, - 0x2ed38: 0x6ca2f220, 0x2ed39: 0x6c7a7220, 0x2ed3a: 0x6ca2f420, 0x2ed3b: 0x6ca2f620, - 0x2ed3c: 0x6ca2f820, 0x2ed3d: 0x6ca2fa20, 0x2ed3e: 0x6ca2fc20, 0x2ed3f: 0x6ca2fe20, - // Block 0xbb5, offset 0x2ed40 - 0x2ed40: 0x6ca30020, 0x2ed41: 0x6ca30220, 0x2ed42: 0x6ca30420, 0x2ed43: 0x6ca30620, - 0x2ed44: 0x6ca30820, 0x2ed45: 0x6ca30a20, 0x2ed46: 0x6ca30c20, 0x2ed47: 0x6ca30e20, - 0x2ed48: 0x6ca31020, 0x2ed49: 0x6c7a1820, 0x2ed4a: 0x6ca31220, 0x2ed4b: 0x6ca31420, - 0x2ed4c: 0x6ca31620, 0x2ed4d: 0x6ca31820, 0x2ed4e: 0x6ca31a20, 0x2ed4f: 0x6ca31c20, - 0x2ed50: 0x6ca31e20, 0x2ed51: 0x6ca32020, 0x2ed52: 0x6ca32220, 0x2ed53: 0x6ca32420, - 0x2ed54: 0x6cd08e20, 0x2ed55: 0x6cd09020, 0x2ed56: 0x6cd09220, 0x2ed57: 0x6cd09420, - 0x2ed58: 0x6cd09620, 0x2ed59: 0x6cd09820, 0x2ed5a: 0x6cd09a20, 0x2ed5b: 0x6cd09c20, - 0x2ed5c: 0x6cd09e20, 0x2ed5d: 0x6cd0a020, 0x2ed5e: 0x6cfe6220, 0x2ed5f: 0x6cd0a220, - 0x2ed60: 0x6cd0a420, 0x2ed61: 0x6cd0a620, 0x2ed62: 0x6cd0a820, 0x2ed63: 0x6cd0aa20, - 0x2ed64: 0x6cd0ac20, 0x2ed65: 0x6cd0ae20, 0x2ed66: 0x6cd0b020, 0x2ed67: 0x6cfe4c20, - 0x2ed68: 0x6cd0b220, 0x2ed69: 0x6cd0b420, 0x2ed6a: 0x6cd0b620, 0x2ed6b: 0x6cd0b820, - 0x2ed6c: 0x6cd0ba20, 0x2ed6d: 0x6cd0bc20, 0x2ed6e: 0x6cd0be20, 0x2ed6f: 0x6cd0c020, - 0x2ed70: 0x6cd0c220, 0x2ed71: 0x6cd0c420, 0x2ed72: 0x6cd0c620, 0x2ed73: 0x6cd0c820, - 0x2ed74: 0x6cd0ca20, 0x2ed75: 0x6cd0cc20, 0x2ed76: 0x6cd0ce20, 0x2ed77: 0x6cd0d020, - 0x2ed78: 0x6cd0d220, 0x2ed79: 0x6cd0d420, 0x2ed7a: 0x6cd0d620, 0x2ed7b: 0x6cd0d820, - 0x2ed7c: 0x6cd0da20, 0x2ed7d: 0x6cfe6420, 0x2ed7e: 0x6cfe6620, 0x2ed7f: 0x6cfe6820, - // Block 0xbb6, offset 0x2ed80 - 0x2ed80: 0x6cfe6a20, 0x2ed81: 0x6cfe6c20, 0x2ed82: 0x6cfe6e20, 0x2ed83: 0x6cfe7020, - 0x2ed84: 0x6cfe7220, 0x2ed85: 0x6cfe7420, 0x2ed86: 0x6cfe7620, 0x2ed87: 0x6cfe7820, - 0x2ed88: 0x6cfe7a20, 0x2ed89: 0x6cfe7c20, 0x2ed8a: 0x6cfe7e20, 0x2ed8b: 0x6cfe8020, - 0x2ed8c: 0x6cfe8220, 0x2ed8d: 0x6cfe8420, 0x2ed8e: 0x6cfe8620, 0x2ed8f: 0x6cfe8820, - 0x2ed90: 0x6cfe8a20, 0x2ed91: 0x6cfe8c20, 0x2ed92: 0x6cfe8e20, 0x2ed93: 0x6cfe9020, - 0x2ed94: 0x6cfe9220, 0x2ed95: 0x6cfe9420, 0x2ed96: 0x6cfe9620, 0x2ed97: 0x6cfe9820, - 0x2ed98: 0x6cfe9a20, 0x2ed99: 0x6cfe9c20, 0x2ed9a: 0x6cfe9e20, 0x2ed9b: 0x6cfea020, - 0x2ed9c: 0x6cfea220, 0x2ed9d: 0x6cfea420, 0x2ed9e: 0x6cfea620, 0x2ed9f: 0x6cfea820, - 0x2eda0: 0x6d2cea20, 0x2eda1: 0x6d2cec20, 0x2eda2: 0x6d2cee20, 0x2eda3: 0x6d2cf020, - 0x2eda4: 0x6d2cf220, 0x2eda5: 0x6d2cf420, 0x2eda6: 0x6d2cf620, 0x2eda7: 0x6d2cf820, - 0x2eda8: 0x6d2cfa20, 0x2eda9: 0x6d5a0620, 0x2edaa: 0x6d2cfc20, 0x2edab: 0x6d2cfe20, - 0x2edac: 0x6d5a0820, 0x2edad: 0x6d2d0020, 0x2edae: 0x6d2d0220, 0x2edaf: 0x6cff4020, - 0x2edb0: 0x6d2d0420, 0x2edb1: 0x6d2d0620, 0x2edb2: 0x6d2d0820, 0x2edb3: 0x6d2d0a20, - 0x2edb4: 0x6d2d0c20, 0x2edb5: 0x6d2d0e20, 0x2edb6: 0x6d2d1020, 0x2edb7: 0x6d2d1220, - 0x2edb8: 0x6d2d1420, 0x2edb9: 0x6d5a1e20, 0x2edba: 0x6d5a2020, 0x2edbb: 0x6d5a2220, - 0x2edbc: 0x6d5a2420, 0x2edbd: 0x6d5a2620, 0x2edbe: 0x6d5a2820, 0x2edbf: 0x6d84cc20, - // Block 0xbb7, offset 0x2edc0 - 0x2edc0: 0x6d5a2a20, 0x2edc1: 0x6d5a2c20, 0x2edc2: 0x6d5a2e20, 0x2edc3: 0x6d5a3020, - 0x2edc4: 0x6d5a3220, 0x2edc5: 0x6d5a3420, 0x2edc6: 0x6d5a3620, 0x2edc7: 0x6d5a3820, - 0x2edc8: 0x6d5a3a20, 0x2edc9: 0x6d5a3c20, 0x2edca: 0x6d5a3e20, 0x2edcb: 0x6d5a4020, - 0x2edcc: 0x6d5a4220, 0x2edcd: 0x6d84da20, 0x2edce: 0x6d5a4420, 0x2edcf: 0x6d84dc20, - 0x2edd0: 0x6da99a20, 0x2edd1: 0x6d84de20, 0x2edd2: 0x6d84e020, 0x2edd3: 0x6d5a4620, - 0x2edd4: 0x6d84e220, 0x2edd5: 0x6d84e420, 0x2edd6: 0x6d84e620, 0x2edd7: 0x6da99c20, - 0x2edd8: 0x6d84e820, 0x2edd9: 0x6d84ea20, 0x2edda: 0x6d84ec20, 0x2eddb: 0x6d84ee20, - 0x2eddc: 0x6d84f020, 0x2eddd: 0x6d84f220, 0x2edde: 0x6d84f420, 0x2eddf: 0x6d84f620, - 0x2ede0: 0x6d84f820, 0x2ede1: 0x6d84fa20, 0x2ede2: 0x6d856820, 0x2ede3: 0x6d84fc20, - 0x2ede4: 0x6d84fe20, 0x2ede5: 0x6da9a620, 0x2ede6: 0x6da9a820, 0x2ede7: 0x6dca8820, - 0x2ede8: 0x6da9aa20, 0x2ede9: 0x6da9ac20, 0x2edea: 0x6da9ae20, 0x2edeb: 0x6da9b020, - 0x2edec: 0x6da9b220, 0x2eded: 0x6da9b420, 0x2edee: 0x6da9b620, 0x2edef: 0x6da9b820, - 0x2edf0: 0x6da9ba20, 0x2edf1: 0x6da9bc20, 0x2edf2: 0x6da9be20, 0x2edf3: 0x6da9c020, - 0x2edf4: 0x6da9c220, 0x2edf5: 0x6dca8a20, 0x2edf6: 0x6dca8c20, 0x2edf7: 0x6de61c20, - 0x2edf8: 0x6dca8e20, 0x2edf9: 0x6dca9020, 0x2edfa: 0x6dfcfc20, 0x2edfb: 0x6dca9220, - 0x2edfc: 0x6dca9420, 0x2edfd: 0x6de61e20, 0x2edfe: 0x6dca9620, 0x2edff: 0x6dca9820, - // Block 0xbb8, offset 0x2ee00 - 0x2ee00: 0x6dca9a20, 0x2ee01: 0x6dca9c20, 0x2ee02: 0x6dca9e20, 0x2ee03: 0x6de62820, - 0x2ee04: 0x6de62a20, 0x2ee05: 0x6de62c20, 0x2ee06: 0x6de62e20, 0x2ee07: 0x6de63020, - 0x2ee08: 0x6de63220, 0x2ee09: 0x6de63420, 0x2ee0a: 0x6de63620, 0x2ee0b: 0x6de63820, - 0x2ee0c: 0x6dfd0020, 0x2ee0d: 0x6dfd0220, 0x2ee0e: 0x6dfd0420, 0x2ee0f: 0x6dfd0620, - 0x2ee10: 0x6dfd0820, 0x2ee11: 0x6dfd0a20, 0x2ee12: 0x6dfd0c20, 0x2ee13: 0x6e0fd620, - 0x2ee14: 0x6e0fd820, 0x2ee15: 0x6e1eb420, 0x2ee16: 0x6e0fda20, 0x2ee17: 0x6e1eb620, - 0x2ee18: 0x6e1eb820, 0x2ee19: 0x6e1eba20, 0x2ee1a: 0x6e2a1c20, 0x2ee1b: 0x6e32de20, - 0x2ee1c: 0x6c09fa20, 0x2ee1d: 0x6c3bac20, 0x2ee1e: 0x6c7a7820, 0x2ee1f: 0x6c7a7a20, - 0x2ee20: 0x6ca38020, 0x2ee21: 0x6cff4220, 0x2ee22: 0x6d856a20, 0x2ee23: 0x6de66820, - 0x2ee24: 0x6e1ec620, 0x2ee25: 0x6e32e420, 0x2ee26: 0x6c09fc20, 0x2ee27: 0x6c24a220, - 0x2ee28: 0x6c3bb620, 0x2ee29: 0x6c3bb820, 0x2ee2a: 0x6c57da20, 0x2ee2b: 0x6c57dc20, - 0x2ee2c: 0x6c57de20, 0x2ee2d: 0x6c57e020, 0x2ee2e: 0x6c57e220, 0x2ee2f: 0x6c57e420, - 0x2ee30: 0x6c57e620, 0x2ee31: 0x6c57e820, 0x2ee32: 0x6c57ea20, 0x2ee33: 0x6c7a9020, - 0x2ee34: 0x6c7a9220, 0x2ee35: 0x6c7a9420, 0x2ee36: 0x6ca39820, 0x2ee37: 0x6ca39a20, - 0x2ee38: 0x6ca39c20, 0x2ee39: 0x6cd17820, 0x2ee3a: 0x6cd17a20, 0x2ee3b: 0x6cd17c20, - 0x2ee3c: 0x6cd17e20, 0x2ee3d: 0x6cff6020, 0x2ee3e: 0x6cff6220, 0x2ee3f: 0x6cff6420, - // Block 0xbb9, offset 0x2ee40 - 0x2ee40: 0x6d2d9620, 0x2ee41: 0x6cff6620, 0x2ee42: 0x6d2da420, 0x2ee43: 0x6d2da620, - 0x2ee44: 0x6d2da820, 0x2ee45: 0x6d2daa20, 0x2ee46: 0x6d2dac20, 0x2ee47: 0x6d5acc20, - 0x2ee48: 0x6d5ace20, 0x2ee49: 0x6d5ad020, 0x2ee4a: 0x6d857a20, 0x2ee4b: 0x6d857c20, - 0x2ee4c: 0x6d857e20, 0x2ee4d: 0x6d858020, 0x2ee4e: 0x6d858220, 0x2ee4f: 0x6daa2020, - 0x2ee50: 0x6daa2220, 0x2ee51: 0x6daa2420, 0x2ee52: 0x6daa2620, 0x2ee53: 0x6dcaee20, - 0x2ee54: 0x6dcaf020, 0x2ee55: 0x6dcaf220, 0x2ee56: 0x6de66e20, 0x2ee57: 0x6e0ffa20, - 0x2ee58: 0x6c09fe20, 0x2ee59: 0x6c3bc420, 0x2ee5a: 0x6c57fe20, 0x2ee5b: 0x6ca3ba20, - 0x2ee5c: 0x6ca3bc20, 0x2ee5d: 0x6cff8a20, 0x2ee5e: 0x6cff8c20, 0x2ee5f: 0x6c0a0220, - 0x2ee60: 0x6c580a20, 0x2ee61: 0x6c7ab220, 0x2ee62: 0x6ca3be20, 0x2ee63: 0x6ca3c020, - 0x2ee64: 0x6cd1a420, 0x2ee65: 0x6cd1a620, 0x2ee66: 0x6cd1a820, 0x2ee67: 0x6d2dd620, - 0x2ee68: 0x6c0a0620, 0x2ee69: 0x6c0a0820, 0x2ee6a: 0x6c13d020, 0x2ee6b: 0x6c24aa20, - 0x2ee6c: 0x6c24ac20, 0x2ee6d: 0x6c581a20, 0x2ee6e: 0x6c581c20, 0x2ee6f: 0x6cd1b620, - 0x2ee70: 0x6c0a0a20, 0x2ee71: 0x6c0a0c20, 0x2ee72: 0x6c0a0e20, 0x2ee73: 0x6c0a1020, - 0x2ee74: 0x6c0a1220, 0x2ee75: 0x6c0a1420, 0x2ee76: 0x6c13d620, 0x2ee77: 0x6c24b620, - 0x2ee78: 0x6c24b820, 0x2ee79: 0x6c24ba20, 0x2ee7a: 0x6c24bc20, 0x2ee7b: 0x6c3be220, - 0x2ee7c: 0x6c24be20, 0x2ee7d: 0x6c3be420, 0x2ee7e: 0x6c3be620, 0x2ee7f: 0x6c3be820, - // Block 0xbba, offset 0x2ee80 - 0x2ee80: 0x6c3bea20, 0x2ee81: 0x6c3bec20, 0x2ee82: 0x6c3bee20, 0x2ee83: 0x6c3bf020, - 0x2ee84: 0x6c3bf220, 0x2ee85: 0x6c3bf420, 0x2ee86: 0x6c582420, 0x2ee87: 0x6c582620, - 0x2ee88: 0x6c582820, 0x2ee89: 0x6c582a20, 0x2ee8a: 0x6c582c20, 0x2ee8b: 0x6c582e20, - 0x2ee8c: 0x6c583020, 0x2ee8d: 0x6c583220, 0x2ee8e: 0x6c583420, 0x2ee8f: 0x6c583620, - 0x2ee90: 0x6c583820, 0x2ee91: 0x6c583a20, 0x2ee92: 0x6c583c20, 0x2ee93: 0x6c583e20, - 0x2ee94: 0x6c7abe20, 0x2ee95: 0x6c7ac020, 0x2ee96: 0x6c7ac220, 0x2ee97: 0x6c7ac420, - 0x2ee98: 0x6c7ac620, 0x2ee99: 0x6c7ac820, 0x2ee9a: 0x6c7aca20, 0x2ee9b: 0x6c7acc20, - 0x2ee9c: 0x6c7ace20, 0x2ee9d: 0x6c7ad020, 0x2ee9e: 0x6c7ad220, 0x2ee9f: 0x6c7ad420, - 0x2eea0: 0x6c7bac20, 0x2eea1: 0x6ca3d620, 0x2eea2: 0x6ca3d820, 0x2eea3: 0x6ca3da20, - 0x2eea4: 0x6ca3dc20, 0x2eea5: 0x6ca3de20, 0x2eea6: 0x6ca3e020, 0x2eea7: 0x6ca3e220, - 0x2eea8: 0x6ca89a20, 0x2eea9: 0x6ca3e420, 0x2eeaa: 0x6cd1be20, 0x2eeab: 0x6cd1c020, - 0x2eeac: 0x6cd1c220, 0x2eead: 0x6cd1c420, 0x2eeae: 0x6cd1c620, 0x2eeaf: 0x6cd1c820, - 0x2eeb0: 0x6ca3e620, 0x2eeb1: 0x6cd20620, 0x2eeb2: 0x6cd1ca20, 0x2eeb3: 0x6cd1cc20, - 0x2eeb4: 0x6cd1ce20, 0x2eeb5: 0x6cffaa20, 0x2eeb6: 0x6cffac20, 0x2eeb7: 0x6cffae20, - 0x2eeb8: 0x6cffb020, 0x2eeb9: 0x6cffb220, 0x2eeba: 0x6cffb420, 0x2eebb: 0x6d2de220, - 0x2eebc: 0x6d2de420, 0x2eebd: 0x6d2de620, 0x2eebe: 0x6d5b0420, 0x2eebf: 0x6d5b0620, - // Block 0xbbb, offset 0x2eec0 - 0x2eec0: 0x6d85a020, 0x2eec1: 0x6d85a220, 0x2eec2: 0x6d85a420, 0x2eec3: 0x6daa4620, - 0x2eec4: 0x6daa4820, 0x2eec5: 0x6dcb0e20, 0x2eec6: 0x6de68020, 0x2eec7: 0x6de68220, - 0x2eec8: 0x6dfd3620, 0x2eec9: 0x6dfd4820, 0x2eeca: 0x6e1ede20, 0x2eecb: 0x6c0a1a20, - 0x2eecc: 0x6c3c1420, 0x2eecd: 0x6c7b0e20, 0x2eece: 0x6cd20820, 0x2eecf: 0x6cd20a20, - 0x2eed0: 0x6d2e0420, 0x2eed1: 0x6d2e0620, 0x2eed2: 0x6c0a2020, 0x2eed3: 0x6c24d820, - 0x2eed4: 0x6c24da20, 0x2eed5: 0x6c24dc20, 0x2eed6: 0x6c24de20, 0x2eed7: 0x6c24e020, - 0x2eed8: 0x6c3c2020, 0x2eed9: 0x6c3c2220, 0x2eeda: 0x6c3c2420, 0x2eedb: 0x6c3c2620, - 0x2eedc: 0x6c3c2820, 0x2eedd: 0x6c3c2a20, 0x2eede: 0x6c3c2c20, 0x2eedf: 0x6c3c2e20, - 0x2eee0: 0x6c3c3020, 0x2eee1: 0x6c3c4220, 0x2eee2: 0x6c589c20, 0x2eee3: 0x6c589e20, - 0x2eee4: 0x6c58a020, 0x2eee5: 0x6c58a220, 0x2eee6: 0x6c58a420, 0x2eee7: 0x6c58a620, - 0x2eee8: 0x6c58a820, 0x2eee9: 0x6c58aa20, 0x2eeea: 0x6c58ac20, 0x2eeeb: 0x6c58ae20, - 0x2eeec: 0x6c58b020, 0x2eeed: 0x6c58b220, 0x2eeee: 0x6c58b420, 0x2eeef: 0x6c58b620, - 0x2eef0: 0x6c7b2c20, 0x2eef1: 0x6c7b2e20, 0x2eef2: 0x6c7b3020, 0x2eef3: 0x6c7b3220, - 0x2eef4: 0x6c7b3420, 0x2eef5: 0x6ca41a20, 0x2eef6: 0x6c7b3620, 0x2eef7: 0x6c7b3820, - 0x2eef8: 0x6c7b3a20, 0x2eef9: 0x6c7b3c20, 0x2eefa: 0x6c58b820, 0x2eefb: 0x6c7b3e20, - 0x2eefc: 0x6c7b4020, 0x2eefd: 0x6c7b4220, 0x2eefe: 0x6c7b4420, 0x2eeff: 0x6c7b4620, - // Block 0xbbc, offset 0x2ef00 - 0x2ef00: 0x6c7b4820, 0x2ef01: 0x6c7b4a20, 0x2ef02: 0x6c7b4c20, 0x2ef03: 0x6c7b4e20, - 0x2ef04: 0x6c7b5020, 0x2ef05: 0x6c7b5220, 0x2ef06: 0x6c7b5420, 0x2ef07: 0x6c7b5620, - 0x2ef08: 0x6c7b5820, 0x2ef09: 0x6c7b5a20, 0x2ef0a: 0x6ca42e20, 0x2ef0b: 0x6ca43020, - 0x2ef0c: 0x6ca43220, 0x2ef0d: 0x6ca43420, 0x2ef0e: 0x6ca43620, 0x2ef0f: 0x6ca43820, - 0x2ef10: 0x6ca43a20, 0x2ef11: 0x6ca43c20, 0x2ef12: 0x6ca43e20, 0x2ef13: 0x6ca44020, - 0x2ef14: 0x6ca44220, 0x2ef15: 0x6ca44420, 0x2ef16: 0x6ca44620, 0x2ef17: 0x6cd23020, - 0x2ef18: 0x6cd23220, 0x2ef19: 0x6cd23420, 0x2ef1a: 0x6cd23620, 0x2ef1b: 0x6cd23820, - 0x2ef1c: 0x6cd23a20, 0x2ef1d: 0x6cd23c20, 0x2ef1e: 0x6cd23e20, 0x2ef1f: 0x6cd24020, - 0x2ef20: 0x6cd24220, 0x2ef21: 0x6cd24420, 0x2ef22: 0x6cd24620, 0x2ef23: 0x6cd24820, - 0x2ef24: 0x6cd24a20, 0x2ef25: 0x6cd24c20, 0x2ef26: 0x6cd24e20, 0x2ef27: 0x6cd25020, - 0x2ef28: 0x6cd25220, 0x2ef29: 0x6cd25420, 0x2ef2a: 0x6cd25620, 0x2ef2b: 0x6cd25820, - 0x2ef2c: 0x6d000620, 0x2ef2d: 0x6d000820, 0x2ef2e: 0x6d000a20, 0x2ef2f: 0x6d000c20, - 0x2ef30: 0x6d000e20, 0x2ef31: 0x6d001020, 0x2ef32: 0x6d001220, 0x2ef33: 0x6d001420, - 0x2ef34: 0x6d001620, 0x2ef35: 0x6d001820, 0x2ef36: 0x6d001a20, 0x2ef37: 0x6d001c20, - 0x2ef38: 0x6d001e20, 0x2ef39: 0x6d002020, 0x2ef3a: 0x6d002220, 0x2ef3b: 0x6d002420, - 0x2ef3c: 0x6d002620, 0x2ef3d: 0x6d002820, 0x2ef3e: 0x6d002a20, 0x2ef3f: 0x6d002c20, - // Block 0xbbd, offset 0x2ef40 - 0x2ef40: 0x6d002e20, 0x2ef41: 0x6d003020, 0x2ef42: 0x6d003220, 0x2ef43: 0x6d003420, - 0x2ef44: 0x6d003620, 0x2ef45: 0x6d003820, 0x2ef46: 0x6d003a20, 0x2ef47: 0x6d2e2020, - 0x2ef48: 0x6d2e2220, 0x2ef49: 0x6d2e2420, 0x2ef4a: 0x6d2e2620, 0x2ef4b: 0x6d2e2820, - 0x2ef4c: 0x6d2e2a20, 0x2ef4d: 0x6d2e2c20, 0x2ef4e: 0x6d2e2e20, 0x2ef4f: 0x6d00b020, - 0x2ef50: 0x6d00b220, 0x2ef51: 0x6d2e3020, 0x2ef52: 0x6d2e3220, 0x2ef53: 0x6d2e3420, - 0x2ef54: 0x6d2e3620, 0x2ef55: 0x6d2e3820, 0x2ef56: 0x6d2e3a20, 0x2ef57: 0x6d2e3c20, - 0x2ef58: 0x6d2e3e20, 0x2ef59: 0x6d5b4a20, 0x2ef5a: 0x6d5b4c20, 0x2ef5b: 0x6d5b4e20, - 0x2ef5c: 0x6d5b5020, 0x2ef5d: 0x6d5b5220, 0x2ef5e: 0x6d5b5420, 0x2ef5f: 0x6d5b3020, - 0x2ef60: 0x6d5b5620, 0x2ef61: 0x6d5b5820, 0x2ef62: 0x6d5b5a20, 0x2ef63: 0x6d5b5c20, - 0x2ef64: 0x6d5b5e20, 0x2ef65: 0x6d5b6020, 0x2ef66: 0x6d5b6220, 0x2ef67: 0x6d2e4020, - 0x2ef68: 0x6d5b6420, 0x2ef69: 0x6d5b6620, 0x2ef6a: 0x6d5b6820, 0x2ef6b: 0x6d5b6a20, - 0x2ef6c: 0x6d85d420, 0x2ef6d: 0x6d85d620, 0x2ef6e: 0x6d85d820, 0x2ef6f: 0x6d85da20, - 0x2ef70: 0x6d85dc20, 0x2ef71: 0x6d85de20, 0x2ef72: 0x6d85e020, 0x2ef73: 0x6d85e220, - 0x2ef74: 0x6d85e420, 0x2ef75: 0x6d85e620, 0x2ef76: 0x6d85e820, 0x2ef77: 0x6d85ea20, - 0x2ef78: 0x6d85ec20, 0x2ef79: 0x6d85ee20, 0x2ef7a: 0x6d85f020, 0x2ef7b: 0x6d85f220, - 0x2ef7c: 0x6d85f420, 0x2ef7d: 0x6d85f620, 0x2ef7e: 0x6d85f820, 0x2ef7f: 0x6d85fa20, - // Block 0xbbe, offset 0x2ef80 - 0x2ef80: 0x6daa7420, 0x2ef81: 0x6daa7620, 0x2ef82: 0x6daa7820, 0x2ef83: 0x6daa7a20, - 0x2ef84: 0x6daa7c20, 0x2ef85: 0x6daa7e20, 0x2ef86: 0x6daa8020, 0x2ef87: 0x6daa8220, - 0x2ef88: 0x6daa8420, 0x2ef89: 0x6daa8620, 0x2ef8a: 0x6d85fc20, 0x2ef8b: 0x6daa8820, - 0x2ef8c: 0x6daa8a20, 0x2ef8d: 0x6daa8c20, 0x2ef8e: 0x6daa8e20, 0x2ef8f: 0x6dcb2c20, - 0x2ef90: 0x6dcb2e20, 0x2ef91: 0x6dcb3020, 0x2ef92: 0x6dcb3220, 0x2ef93: 0x6dcb3420, - 0x2ef94: 0x6dcb3620, 0x2ef95: 0x6dcb3820, 0x2ef96: 0x6dcb3a20, 0x2ef97: 0x6dcb3c20, - 0x2ef98: 0x6dcb3e20, 0x2ef99: 0x6dcb4020, 0x2ef9a: 0x6dcb4220, 0x2ef9b: 0x6dcb4420, - 0x2ef9c: 0x6dcb4620, 0x2ef9d: 0x6dcb4820, 0x2ef9e: 0x6dcb4a20, 0x2ef9f: 0x6de69c20, - 0x2efa0: 0x6de69e20, 0x2efa1: 0x6de6a020, 0x2efa2: 0x6dfd4c20, 0x2efa3: 0x6de6a220, - 0x2efa4: 0x6dcb8220, 0x2efa5: 0x6dfd4e20, 0x2efa6: 0x6dfd5020, 0x2efa7: 0x6e102420, - 0x2efa8: 0x6e102620, 0x2efa9: 0x6e102820, 0x2efaa: 0x6e102a20, 0x2efab: 0x6e102c20, - 0x2efac: 0x6e1eea20, 0x2efad: 0x6e1eec20, 0x2efae: 0x6e1eee20, 0x2efaf: 0x6e2a4a20, - 0x2efb0: 0x6e2a4c20, 0x2efb1: 0x6e32f220, 0x2efb2: 0x6e32f420, 0x2efb3: 0x6e3d8020, - 0x2efb4: 0x6e42ca20, 0x2efb5: 0x6e452a20, 0x2efb6: 0x6c0a2220, 0x2efb7: 0x6c3c4420, - 0x2efb8: 0x6c590220, 0x2efb9: 0x6c590420, 0x2efba: 0x6c590620, 0x2efbb: 0x6cd2b820, - 0x2efbc: 0x6cd2ba20, 0x2efbd: 0x6c0a2420, 0x2efbe: 0x6c13e020, 0x2efbf: 0x6c13e220, - // Block 0xbbf, offset 0x2efc0 - 0x2efc0: 0x6c24fa20, 0x2efc1: 0x6c24fc20, 0x2efc2: 0x6c24fe20, 0x2efc3: 0x6c250020, - 0x2efc4: 0x6c3c4620, 0x2efc5: 0x6c590e20, 0x2efc6: 0x6c591020, 0x2efc7: 0x6c591220, - 0x2efc8: 0x6c591420, 0x2efc9: 0x6ca48c20, 0x2efca: 0x6c7bae20, 0x2efcb: 0x6c7bb020, - 0x2efcc: 0x6c7bb220, 0x2efcd: 0x6c7bb420, 0x2efce: 0x6ca49220, 0x2efcf: 0x6ca49420, - 0x2efd0: 0x6ca49620, 0x2efd1: 0x6ca49820, 0x2efd2: 0x6cd2c420, 0x2efd3: 0x6cd2c620, - 0x2efd4: 0x6cd2c820, 0x2efd5: 0x6cd2ca20, 0x2efd6: 0x6cd2cc20, 0x2efd7: 0x6d00bc20, - 0x2efd8: 0x6d00be20, 0x2efd9: 0x6d00c020, 0x2efda: 0x6d5bde20, 0x2efdb: 0x6d5be020, - 0x2efdc: 0x6d5be220, 0x2efdd: 0x6d5be420, 0x2efde: 0x6d5be620, 0x2efdf: 0x6d865420, - 0x2efe0: 0x6d865620, 0x2efe1: 0x6d865820, 0x2efe2: 0x6dab0020, 0x2efe3: 0x6dab0220, - 0x2efe4: 0x6dab0420, 0x2efe5: 0x6dab0620, 0x2efe6: 0x6dcb8420, 0x2efe7: 0x6dcb8620, - 0x2efe8: 0x6dcb8820, 0x2efe9: 0x6de6de20, 0x2efea: 0x6dfd7420, 0x2efeb: 0x6dfd7620, - 0x2efec: 0x6e104620, 0x2efed: 0x6e1f0020, 0x2efee: 0x6c0a2620, 0x2efef: 0x6c3c5620, - 0x2eff0: 0x6c7bd820, 0x2eff1: 0x6c7bda20, 0x2eff2: 0x6ca4ac20, 0x2eff3: 0x6cd2f020, - 0x2eff4: 0x6cd2f220, 0x2eff5: 0x6d00e820, 0x2eff6: 0x6d2ecc20, 0x2eff7: 0x6d2ece20, - 0x2eff8: 0x6d2ed020, 0x2eff9: 0x6d2ed220, 0x2effa: 0x6d5bfc20, 0x2effb: 0x6d866620, - 0x2effc: 0x6dab1620, 0x2effd: 0x6dcb9420, 0x2effe: 0x6dfd8220, 0x2efff: 0x6c0a2820, - // Block 0xbc0, offset 0x2f000 - 0x2f000: 0x6c250c20, 0x2f001: 0x6c250e20, 0x2f002: 0x6c3c6820, 0x2f003: 0x6c595220, - 0x2f004: 0x6c595420, 0x2f005: 0x6c595620, 0x2f006: 0x6c595820, 0x2f007: 0x6c595a20, - 0x2f008: 0x6c595c20, 0x2f009: 0x6c7bf620, 0x2f00a: 0x6c7bf820, 0x2f00b: 0x6c7bfa20, - 0x2f00c: 0x6c7bfc20, 0x2f00d: 0x6c7bfe20, 0x2f00e: 0x6c7c0020, 0x2f00f: 0x6c7c0220, - 0x2f010: 0x6c7c0420, 0x2f011: 0x6c7c0620, 0x2f012: 0x6ca4c220, 0x2f013: 0x6ca4c420, - 0x2f014: 0x6ca4c620, 0x2f015: 0x6ca4c820, 0x2f016: 0x6ca4ca20, 0x2f017: 0x6ca4cc20, - 0x2f018: 0x6ca4ce20, 0x2f019: 0x6cd30c20, 0x2f01a: 0x6cd30e20, 0x2f01b: 0x6ca4d020, - 0x2f01c: 0x6cd31020, 0x2f01d: 0x6d010c20, 0x2f01e: 0x6d010e20, 0x2f01f: 0x6d011020, - 0x2f020: 0x6d2ef420, 0x2f021: 0x6d2ef620, 0x2f022: 0x6d2ef820, 0x2f023: 0x6d2efa20, - 0x2f024: 0x6d5c0c20, 0x2f025: 0x6d868220, 0x2f026: 0x6d868420, 0x2f027: 0x6d868620, - 0x2f028: 0x6dab2020, 0x2f029: 0x6dab2220, 0x2f02a: 0x6dab2420, 0x2f02b: 0x6dcba820, - 0x2f02c: 0x6dcbaa20, 0x2f02d: 0x6dfd8e20, 0x2f02e: 0x6c0a2a20, 0x2f02f: 0x6c251820, - 0x2f030: 0x6c3c8020, 0x2f031: 0x6c3c8220, 0x2f032: 0x6c3c8420, 0x2f033: 0x6c3c8620, - 0x2f034: 0x6c3c8820, 0x2f035: 0x6c3c8a20, 0x2f036: 0x6c598820, 0x2f037: 0x6c598a20, - 0x2f038: 0x6c598c20, 0x2f039: 0x6c598e20, 0x2f03a: 0x6c599020, 0x2f03b: 0x6c599220, - 0x2f03c: 0x6c599420, 0x2f03d: 0x6c599620, 0x2f03e: 0x6c599820, 0x2f03f: 0x6c599a20, - // Block 0xbc1, offset 0x2f040 - 0x2f040: 0x6c599c20, 0x2f041: 0x6c599e20, 0x2f042: 0x6c59a020, 0x2f043: 0x6c59a220, - 0x2f044: 0x6c59a420, 0x2f045: 0x6c59a620, 0x2f046: 0x6c59a820, 0x2f047: 0x6c59aa20, - 0x2f048: 0x6c59ac20, 0x2f049: 0x6c59ae20, 0x2f04a: 0x6c59b020, 0x2f04b: 0x6c59b220, - 0x2f04c: 0x6c59b420, 0x2f04d: 0x6c59b620, 0x2f04e: 0x6c7c3e20, 0x2f04f: 0x6c7c4020, - 0x2f050: 0x6c7c4220, 0x2f051: 0x6c7c4420, 0x2f052: 0x6c7c4620, 0x2f053: 0x6c7c4820, - 0x2f054: 0x6c7c4a20, 0x2f055: 0x6c7c4c20, 0x2f056: 0x6c7c4e20, 0x2f057: 0x6c7c5020, - 0x2f058: 0x6c7c5220, 0x2f059: 0x6c7c5420, 0x2f05a: 0x6c7c5620, 0x2f05b: 0x6c7c5820, - 0x2f05c: 0x6c7c5a20, 0x2f05d: 0x6c7c5c20, 0x2f05e: 0x6c7c5e20, 0x2f05f: 0x6c7c6020, - 0x2f060: 0x6c7c6220, 0x2f061: 0x6c7c6420, 0x2f062: 0x6c7c6620, 0x2f063: 0x6c7c6820, - 0x2f064: 0x6c7c6a20, 0x2f065: 0x6ca4ee20, 0x2f066: 0x6ca4f020, 0x2f067: 0x6c7c6c20, - 0x2f068: 0x6c7c6e20, 0x2f069: 0x6c7c7020, 0x2f06a: 0x6c7c7220, 0x2f06b: 0x6c7c7420, - 0x2f06c: 0x6c7c7620, 0x2f06d: 0x6ca50220, 0x2f06e: 0x6ca50420, 0x2f06f: 0x6ca50620, - 0x2f070: 0x6ca50820, 0x2f071: 0x6ca50a20, 0x2f072: 0x6ca50c20, 0x2f073: 0x6ca50e20, - 0x2f074: 0x6ca51020, 0x2f075: 0x6ca51220, 0x2f076: 0x6ca51420, 0x2f077: 0x6ca51620, - 0x2f078: 0x6ca51820, 0x2f079: 0x6ca51a20, 0x2f07a: 0x6ca51c20, 0x2f07b: 0x6ca51e20, - 0x2f07c: 0x6ca52020, 0x2f07d: 0x6ca52220, 0x2f07e: 0x6ca52420, 0x2f07f: 0x6c7c7820, - // Block 0xbc2, offset 0x2f080 - 0x2f080: 0x6ca59220, 0x2f081: 0x6ca52620, 0x2f082: 0x6cd35020, 0x2f083: 0x6cd35220, - 0x2f084: 0x6cd35420, 0x2f085: 0x6cd35620, 0x2f086: 0x6cd35820, 0x2f087: 0x6cd35a20, - 0x2f088: 0x6cd35c20, 0x2f089: 0x6cd35e20, 0x2f08a: 0x6cd36020, 0x2f08b: 0x6cd36220, - 0x2f08c: 0x6cd36420, 0x2f08d: 0x6cd36620, 0x2f08e: 0x6cd36820, 0x2f08f: 0x6cd36a20, - 0x2f090: 0x6cd36c20, 0x2f091: 0x6cd36e20, 0x2f092: 0x6d014220, 0x2f093: 0x6d014420, - 0x2f094: 0x6d014620, 0x2f095: 0x6d014820, 0x2f096: 0x6d014a20, 0x2f097: 0x6d014c20, - 0x2f098: 0x6d014e20, 0x2f099: 0x6d015020, 0x2f09a: 0x6d015220, 0x2f09b: 0x6d015420, - 0x2f09c: 0x6d015620, 0x2f09d: 0x6d015820, 0x2f09e: 0x6d015a20, 0x2f09f: 0x6d015c20, - 0x2f0a0: 0x6d015e20, 0x2f0a1: 0x6d01f620, 0x2f0a2: 0x6d016020, 0x2f0a3: 0x6d016220, - 0x2f0a4: 0x6d016420, 0x2f0a5: 0x6d016620, 0x2f0a6: 0x6d016820, 0x2f0a7: 0x6d016a20, - 0x2f0a8: 0x6d016c20, 0x2f0a9: 0x6d016e20, 0x2f0aa: 0x6d017020, 0x2f0ab: 0x6d017220, - 0x2f0ac: 0x6d017420, 0x2f0ad: 0x6d017620, 0x2f0ae: 0x6d2f2220, 0x2f0af: 0x6d2f2420, - 0x2f0b0: 0x6d2f2620, 0x2f0b1: 0x6d2f2820, 0x2f0b2: 0x6d2f2a20, 0x2f0b3: 0x6d2f2c20, - 0x2f0b4: 0x6d2f2e20, 0x2f0b5: 0x6d2f3020, 0x2f0b6: 0x6d2f3220, 0x2f0b7: 0x6d2f3420, - 0x2f0b8: 0x6d2f3620, 0x2f0b9: 0x6d01f820, 0x2f0ba: 0x6d2f3820, 0x2f0bb: 0x6d2f3a20, - 0x2f0bc: 0x6d2f3c20, 0x2f0bd: 0x6d2f3e20, 0x2f0be: 0x6d2f4020, 0x2f0bf: 0x6d2f4220, - // Block 0xbc3, offset 0x2f0c0 - 0x2f0c0: 0x6d2f4420, 0x2f0c1: 0x6d2f4620, 0x2f0c2: 0x6d2f4820, 0x2f0c3: 0x6d2f4a20, - 0x2f0c4: 0x6d2f4c20, 0x2f0c5: 0x6d2f4e20, 0x2f0c6: 0x6d2f5020, 0x2f0c7: 0x6d5c3e20, - 0x2f0c8: 0x6d5c4020, 0x2f0c9: 0x6d5c4220, 0x2f0ca: 0x6d5c4420, 0x2f0cb: 0x6d5c4620, - 0x2f0cc: 0x6d5c4820, 0x2f0cd: 0x6d5c4a20, 0x2f0ce: 0x6d5c4c20, 0x2f0cf: 0x6d5c4e20, - 0x2f0d0: 0x6d5c5020, 0x2f0d1: 0x6d5c5220, 0x2f0d2: 0x6d5c5420, 0x2f0d3: 0x6d5c5620, - 0x2f0d4: 0x6d86c020, 0x2f0d5: 0x6d86c220, 0x2f0d6: 0x6d86c420, 0x2f0d7: 0x6d86c620, - 0x2f0d8: 0x6d86c820, 0x2f0d9: 0x6d86ca20, 0x2f0da: 0x6d86cc20, 0x2f0db: 0x6d86ce20, - 0x2f0dc: 0x6d86d020, 0x2f0dd: 0x6d86d220, 0x2f0de: 0x6d86d420, 0x2f0df: 0x6d86d620, - 0x2f0e0: 0x6d86d820, 0x2f0e1: 0x6d86da20, 0x2f0e2: 0x6d86dc20, 0x2f0e3: 0x6d86de20, - 0x2f0e4: 0x6dab6020, 0x2f0e5: 0x6d875220, 0x2f0e6: 0x6dab6220, 0x2f0e7: 0x6dab6420, - 0x2f0e8: 0x6dab6620, 0x2f0e9: 0x6dab6820, 0x2f0ea: 0x6dab6a20, 0x2f0eb: 0x6dab6c20, - 0x2f0ec: 0x6dab6e20, 0x2f0ed: 0x6dab7020, 0x2f0ee: 0x6dab7220, 0x2f0ef: 0x6dab7420, - 0x2f0f0: 0x6dab7620, 0x2f0f1: 0x6dab7820, 0x2f0f2: 0x6dab7a20, 0x2f0f3: 0x6dab7c20, - 0x2f0f4: 0x6dab7e20, 0x2f0f5: 0x6dab8020, 0x2f0f6: 0x6dab8220, 0x2f0f7: 0x6dab8420, - 0x2f0f8: 0x6dcbcc20, 0x2f0f9: 0x6dcbce20, 0x2f0fa: 0x6dcbd020, 0x2f0fb: 0x6dcbd220, - 0x2f0fc: 0x6dcbd420, 0x2f0fd: 0x6dcbd620, 0x2f0fe: 0x6dcbd820, 0x2f0ff: 0x6dcbda20, - // Block 0xbc4, offset 0x2f100 - 0x2f100: 0x6dcbdc20, 0x2f101: 0x6dcbde20, 0x2f102: 0x6dcbe020, 0x2f103: 0x6de70c20, - 0x2f104: 0x6de70e20, 0x2f105: 0x6de71020, 0x2f106: 0x6de71220, 0x2f107: 0x6de71420, - 0x2f108: 0x6de71620, 0x2f109: 0x6de71820, 0x2f10a: 0x6de71a20, 0x2f10b: 0x6dfdae20, - 0x2f10c: 0x6dfdb020, 0x2f10d: 0x6dfdb220, 0x2f10e: 0x6dfdb420, 0x2f10f: 0x6dfdb620, - 0x2f110: 0x6e106020, 0x2f111: 0x6e106220, 0x2f112: 0x6e106420, 0x2f113: 0x6e106620, - 0x2f114: 0x6e2a6c20, 0x2f115: 0x6e331420, 0x2f116: 0x6e332020, 0x2f117: 0x6e331620, - 0x2f118: 0x6e393a20, 0x2f119: 0x6e393c20, 0x2f11a: 0x6e3d8a20, 0x2f11b: 0x6c0a2c20, - 0x2f11c: 0x6c5a1c20, 0x2f11d: 0x6c7cd620, 0x2f11e: 0x6cd3f420, 0x2f11f: 0x6cd3f620, - 0x2f120: 0x6d01fa20, 0x2f121: 0x6e394020, 0x2f122: 0x6c0a2e20, 0x2f123: 0x6c253220, - 0x2f124: 0x6c3cb620, 0x2f125: 0x6c3cb820, 0x2f126: 0x6c5a2420, 0x2f127: 0x6c5a2620, - 0x2f128: 0x6c5a2820, 0x2f129: 0x6c7ce820, 0x2f12a: 0x6ca59e20, 0x2f12b: 0x6ca5a020, - 0x2f12c: 0x6cd40c20, 0x2f12d: 0x6cd40e20, 0x2f12e: 0x6d020820, 0x2f12f: 0x6dabf820, - 0x2f130: 0x6dabfa20, 0x2f131: 0x6de76020, 0x2f132: 0x6dfde820, 0x2f133: 0x6c0a3020, - 0x2f134: 0x6c253a20, 0x2f135: 0x6c253c20, 0x2f136: 0x6c253e20, 0x2f137: 0x6c3cc020, - 0x2f138: 0x6c3cc220, 0x2f139: 0x6c3cc420, 0x2f13a: 0x6c3cc620, 0x2f13b: 0x6c3cc820, - 0x2f13c: 0x6c3cca20, 0x2f13d: 0x6c3ccc20, 0x2f13e: 0x6c3cce20, 0x2f13f: 0x6c3cd020, - // Block 0xbc5, offset 0x2f140 - 0x2f140: 0x6c3cd220, 0x2f141: 0x6c3cd420, 0x2f142: 0x6c5a4820, 0x2f143: 0x6c5a4a20, - 0x2f144: 0x6c5a4c20, 0x2f145: 0x6c5a4e20, 0x2f146: 0x6c5a5020, 0x2f147: 0x6c5a5220, - 0x2f148: 0x6c5a5420, 0x2f149: 0x6c5a5620, 0x2f14a: 0x6c5a5820, 0x2f14b: 0x6c5a5a20, - 0x2f14c: 0x6c5a5c20, 0x2f14d: 0x6c5a5e20, 0x2f14e: 0x6c5a6020, 0x2f14f: 0x6c5a6220, - 0x2f150: 0x6c5a6420, 0x2f151: 0x6c5a6620, 0x2f152: 0x6c5a6820, 0x2f153: 0x6c5a6a20, - 0x2f154: 0x6c5a6c20, 0x2f155: 0x6c5a6e20, 0x2f156: 0x6c5a7020, 0x2f157: 0x6c5a7220, - 0x2f158: 0x6c5a7420, 0x2f159: 0x6c5a7620, 0x2f15a: 0x6c5a7820, 0x2f15b: 0x6c5a7a20, - 0x2f15c: 0x6c5a7c20, 0x2f15d: 0x6c7d1220, 0x2f15e: 0x6c7d1420, 0x2f15f: 0x6c7d1620, - 0x2f160: 0x6c7d1820, 0x2f161: 0x6c7d1a20, 0x2f162: 0x6c7d1c20, 0x2f163: 0x6c7d1e20, - 0x2f164: 0x6c7d2020, 0x2f165: 0x6c7d2220, 0x2f166: 0x6ca5ce20, 0x2f167: 0x6c7d2420, - 0x2f168: 0x6c7d2620, 0x2f169: 0x6c7d2820, 0x2f16a: 0x6c7d2a20, 0x2f16b: 0x6c7d2c20, - 0x2f16c: 0x6c7d2e20, 0x2f16d: 0x6c7d3020, 0x2f16e: 0x6c7d3220, 0x2f16f: 0x6c7d3420, - 0x2f170: 0x6c7d3620, 0x2f171: 0x6c7d3820, 0x2f172: 0x6c7d3a20, 0x2f173: 0x6c7d3c20, - 0x2f174: 0x6c7d3e20, 0x2f175: 0x6c7d4020, 0x2f176: 0x6c7d4220, 0x2f177: 0x6c7d4420, - 0x2f178: 0x6c7d4620, 0x2f179: 0x6c7d4820, 0x2f17a: 0x6c7d4a20, 0x2f17b: 0x6c7d4c20, - 0x2f17c: 0x6c7d4e20, 0x2f17d: 0x6c7d5020, 0x2f17e: 0x6c7d5220, 0x2f17f: 0x6c7d5420, - // Block 0xbc6, offset 0x2f180 - 0x2f180: 0x6c7d5620, 0x2f181: 0x6c7d5820, 0x2f182: 0x6ca5de20, 0x2f183: 0x6ca5e020, - 0x2f184: 0x6ca5e220, 0x2f185: 0x6ca5e420, 0x2f186: 0x6ca5e620, 0x2f187: 0x6ca5e820, - 0x2f188: 0x6ca5ea20, 0x2f189: 0x6ca5ec20, 0x2f18a: 0x6ca5ee20, 0x2f18b: 0x6ca5f020, - 0x2f18c: 0x6ca5f220, 0x2f18d: 0x6ca5f420, 0x2f18e: 0x6ca5f620, 0x2f18f: 0x6ca5f820, - 0x2f190: 0x6ca5fa20, 0x2f191: 0x6ca5fc20, 0x2f192: 0x6ca5fe20, 0x2f193: 0x6ca60020, - 0x2f194: 0x6ca60220, 0x2f195: 0x6ca60420, 0x2f196: 0x6ca60620, 0x2f197: 0x6ca60820, - 0x2f198: 0x6ca60a20, 0x2f199: 0x6ca60c20, 0x2f19a: 0x6ca60e20, 0x2f19b: 0x6ca61020, - 0x2f19c: 0x6cd43420, 0x2f19d: 0x6cd43620, 0x2f19e: 0x6cd43820, 0x2f19f: 0x6cd43a20, - 0x2f1a0: 0x6cd43c20, 0x2f1a1: 0x6cd43e20, 0x2f1a2: 0x6cd44020, 0x2f1a3: 0x6cd44220, - 0x2f1a4: 0x6cd44420, 0x2f1a5: 0x6cd44620, 0x2f1a6: 0x6cd44820, 0x2f1a7: 0x6cd44a20, - 0x2f1a8: 0x6cd44c20, 0x2f1a9: 0x6cd44e20, 0x2f1aa: 0x6cd45020, 0x2f1ab: 0x6cd45220, - 0x2f1ac: 0x6cd45420, 0x2f1ad: 0x6cd45620, 0x2f1ae: 0x6cd45820, 0x2f1af: 0x6cd45a20, - 0x2f1b0: 0x6cd45c20, 0x2f1b1: 0x6cd45e20, 0x2f1b2: 0x6cd46020, 0x2f1b3: 0x6cd46220, - 0x2f1b4: 0x6cd46420, 0x2f1b5: 0x6cd46620, 0x2f1b6: 0x6cd46820, 0x2f1b7: 0x6cd46a20, - 0x2f1b8: 0x6d025220, 0x2f1b9: 0x6d025420, 0x2f1ba: 0x6d025620, 0x2f1bb: 0x6d025820, - 0x2f1bc: 0x6d025a20, 0x2f1bd: 0x6d025c20, 0x2f1be: 0x6d300e20, 0x2f1bf: 0x6d025e20, - // Block 0xbc7, offset 0x2f1c0 - 0x2f1c0: 0x6d026020, 0x2f1c1: 0x6d026220, 0x2f1c2: 0x6d026420, 0x2f1c3: 0x6d026620, - 0x2f1c4: 0x6d026820, 0x2f1c5: 0x6d026a20, 0x2f1c6: 0x6d026c20, 0x2f1c7: 0x6d026e20, - 0x2f1c8: 0x6d027020, 0x2f1c9: 0x6d027220, 0x2f1ca: 0x6d027420, 0x2f1cb: 0x6d027620, - 0x2f1cc: 0x6d027820, 0x2f1cd: 0x6d027a20, 0x2f1ce: 0x6d027c20, 0x2f1cf: 0x6d027e20, - 0x2f1d0: 0x6d028020, 0x2f1d1: 0x6d028220, 0x2f1d2: 0x6d028420, 0x2f1d3: 0x6d028620, - 0x2f1d4: 0x6d028820, 0x2f1d5: 0x6d028a20, 0x2f1d6: 0x6d028c20, 0x2f1d7: 0x6d028e20, - 0x2f1d8: 0x6d029020, 0x2f1d9: 0x6d029220, 0x2f1da: 0x6d029420, 0x2f1db: 0x6d029620, - 0x2f1dc: 0x6d029820, 0x2f1dd: 0x6d301020, 0x2f1de: 0x6d301220, 0x2f1df: 0x6d301420, - 0x2f1e0: 0x6d301620, 0x2f1e1: 0x6d301820, 0x2f1e2: 0x6d301a20, 0x2f1e3: 0x6d301c20, - 0x2f1e4: 0x6d301e20, 0x2f1e5: 0x6d302020, 0x2f1e6: 0x6d302220, 0x2f1e7: 0x6d302420, - 0x2f1e8: 0x6d302620, 0x2f1e9: 0x6d302820, 0x2f1ea: 0x6d302a20, 0x2f1eb: 0x6d302c20, - 0x2f1ec: 0x6d302e20, 0x2f1ed: 0x6d303020, 0x2f1ee: 0x6d303220, 0x2f1ef: 0x6d303420, - 0x2f1f0: 0x6d029a20, 0x2f1f1: 0x6d303620, 0x2f1f2: 0x6d303820, 0x2f1f3: 0x6d303a20, - 0x2f1f4: 0x6d303c20, 0x2f1f5: 0x6d303e20, 0x2f1f6: 0x6d304020, 0x2f1f7: 0x6d304220, - 0x2f1f8: 0x6d304420, 0x2f1f9: 0x6d304620, 0x2f1fa: 0x6d5d0620, 0x2f1fb: 0x6d5d0820, - 0x2f1fc: 0x6d5d0a20, 0x2f1fd: 0x6d5d0c20, 0x2f1fe: 0x6d5d0e20, 0x2f1ff: 0x6d5d1020, - // Block 0xbc8, offset 0x2f200 - 0x2f200: 0x6d5d1220, 0x2f201: 0x6d304820, 0x2f202: 0x6d5d1420, 0x2f203: 0x6d5d1620, - 0x2f204: 0x6d5d1820, 0x2f205: 0x6d5d1a20, 0x2f206: 0x6d5d1c20, 0x2f207: 0x6d5d1e20, - 0x2f208: 0x6d5d2020, 0x2f209: 0x6d5d2220, 0x2f20a: 0x6d5d2420, 0x2f20b: 0x6d5d2620, - 0x2f20c: 0x6d5d2820, 0x2f20d: 0x6d5d2a20, 0x2f20e: 0x6d5d2c20, 0x2f20f: 0x6d5d2e20, - 0x2f210: 0x6d5d3020, 0x2f211: 0x6d5d3220, 0x2f212: 0x6d5d3420, 0x2f213: 0x6d5d3620, - 0x2f214: 0x6d5d3820, 0x2f215: 0x6d5d3a20, 0x2f216: 0x6d876620, 0x2f217: 0x6d5d3c20, - 0x2f218: 0x6d5d3e20, 0x2f219: 0x6d5d4020, 0x2f21a: 0x6d877a20, 0x2f21b: 0x6d877c20, - 0x2f21c: 0x6d876820, 0x2f21d: 0x6d877e20, 0x2f21e: 0x6d878020, 0x2f21f: 0x6d878220, - 0x2f220: 0x6d878420, 0x2f221: 0x6d878620, 0x2f222: 0x6d878820, 0x2f223: 0x6d878a20, - 0x2f224: 0x6d5d4220, 0x2f225: 0x6d878c20, 0x2f226: 0x6d878e20, 0x2f227: 0x6d879020, - 0x2f228: 0x6d879220, 0x2f229: 0x6d879420, 0x2f22a: 0x6d879620, 0x2f22b: 0x6d879820, - 0x2f22c: 0x6d879a20, 0x2f22d: 0x6d879c20, 0x2f22e: 0x6d879e20, 0x2f22f: 0x6dac1c20, - 0x2f230: 0x6dac1e20, 0x2f231: 0x6dac2020, 0x2f232: 0x6dac2220, 0x2f233: 0x6dac2420, - 0x2f234: 0x6dac2620, 0x2f235: 0x6dac2820, 0x2f236: 0x6dac2a20, 0x2f237: 0x6dac2c20, - 0x2f238: 0x6dac2e20, 0x2f239: 0x6dac3020, 0x2f23a: 0x6dac3220, 0x2f23b: 0x6dac3420, - 0x2f23c: 0x6dac3620, 0x2f23d: 0x6dac3820, 0x2f23e: 0x6dac3a20, 0x2f23f: 0x6dac3c20, - // Block 0xbc9, offset 0x2f240 - 0x2f240: 0x6dac3e20, 0x2f241: 0x6dac4020, 0x2f242: 0x6dac4220, 0x2f243: 0x6dac4420, - 0x2f244: 0x6dac4620, 0x2f245: 0x6dac4820, 0x2f246: 0x6dcc5020, 0x2f247: 0x6dcc5220, - 0x2f248: 0x6dcc5420, 0x2f249: 0x6dcc5620, 0x2f24a: 0x6dcc5820, 0x2f24b: 0x6dcc5a20, - 0x2f24c: 0x6dcc5c20, 0x2f24d: 0x6dcc5e20, 0x2f24e: 0x6dcc6020, 0x2f24f: 0x6dcc6220, - 0x2f250: 0x6dcc6420, 0x2f251: 0x6dcc6620, 0x2f252: 0x6dcc6820, 0x2f253: 0x6dcc6a20, - 0x2f254: 0x6dcc6c20, 0x2f255: 0x6dcc6e20, 0x2f256: 0x6dcc7020, 0x2f257: 0x6de76c20, - 0x2f258: 0x6de76e20, 0x2f259: 0x6de77020, 0x2f25a: 0x6de77220, 0x2f25b: 0x6de77420, - 0x2f25c: 0x6de77620, 0x2f25d: 0x6de77820, 0x2f25e: 0x6de77a20, 0x2f25f: 0x6de77c20, - 0x2f260: 0x6de77e20, 0x2f261: 0x6de78020, 0x2f262: 0x6dfdf220, 0x2f263: 0x6dfdf420, - 0x2f264: 0x6dfdf620, 0x2f265: 0x6dfdf820, 0x2f266: 0x6dfdfa20, 0x2f267: 0x6dfdfc20, - 0x2f268: 0x6dfdfe20, 0x2f269: 0x6dfe0020, 0x2f26a: 0x6dfe0220, 0x2f26b: 0x6dfe0420, - 0x2f26c: 0x6dfe0620, 0x2f26d: 0x6e109420, 0x2f26e: 0x6e109620, 0x2f26f: 0x6e109820, - 0x2f270: 0x6e109a20, 0x2f271: 0x6e109c20, 0x2f272: 0x6e109e20, 0x2f273: 0x6e10a020, - 0x2f274: 0x6e10a220, 0x2f275: 0x6e1f3820, 0x2f276: 0x6e2a8820, 0x2f277: 0x6e2a8a20, - 0x2f278: 0x6e332620, 0x2f279: 0x6e394220, 0x2f27a: 0x6c0a3420, 0x2f27b: 0x6c04fe20, - 0x2f27c: 0x6c13f620, 0x2f27d: 0x6c254e20, 0x2f27e: 0x6c3cee20, 0x2f27f: 0x6c3cf020, - // Block 0xbca, offset 0x2f280 - 0x2f280: 0x6c3cf220, 0x2f281: 0x6c3cf420, 0x2f282: 0x6c3cf620, 0x2f283: 0x6c3cf820, - 0x2f284: 0x6c5ac620, 0x2f285: 0x6c5ac820, 0x2f286: 0x6c5aca20, 0x2f287: 0x6c5acc20, - 0x2f288: 0x6c5ace20, 0x2f289: 0x6c5ad020, 0x2f28a: 0x6c5ad220, 0x2f28b: 0x6c5ad420, - 0x2f28c: 0x6c5ad620, 0x2f28d: 0x6c5ad820, 0x2f28e: 0x6c5ada20, 0x2f28f: 0x6c7dc420, - 0x2f290: 0x6c7dc620, 0x2f291: 0x6c7dc820, 0x2f292: 0x6c7dca20, 0x2f293: 0x6c7dcc20, - 0x2f294: 0x6c7dce20, 0x2f295: 0x6c7dd020, 0x2f296: 0x6c7dd220, 0x2f297: 0x6c7dd420, - 0x2f298: 0x6c7dd620, 0x2f299: 0x6c7dd820, 0x2f29a: 0x6c7dda20, 0x2f29b: 0x6c7ddc20, - 0x2f29c: 0x6c7dde20, 0x2f29d: 0x6c7de020, 0x2f29e: 0x6c7de220, 0x2f29f: 0x6c7de420, - 0x2f2a0: 0x6c7de620, 0x2f2a1: 0x6ca68a20, 0x2f2a2: 0x6c7de820, 0x2f2a3: 0x6ca69220, - 0x2f2a4: 0x6ca69420, 0x2f2a5: 0x6ca69620, 0x2f2a6: 0x6cd4c020, 0x2f2a7: 0x6ca69820, - 0x2f2a8: 0x6ca69a20, 0x2f2a9: 0x6ca69c20, 0x2f2aa: 0x6ca69e20, 0x2f2ab: 0x6ca6a020, - 0x2f2ac: 0x6ca6a220, 0x2f2ad: 0x6ca6a420, 0x2f2ae: 0x6ca6a620, 0x2f2af: 0x6ca6a820, - 0x2f2b0: 0x6cd4c220, 0x2f2b1: 0x6cd4c420, 0x2f2b2: 0x6cd4c620, 0x2f2b3: 0x6cd4c820, - 0x2f2b4: 0x6cd4ca20, 0x2f2b5: 0x6cd4cc20, 0x2f2b6: 0x6cd4ce20, 0x2f2b7: 0x6cd4d020, - 0x2f2b8: 0x6cd4d220, 0x2f2b9: 0x6d031820, 0x2f2ba: 0x6d031a20, 0x2f2bb: 0x6d031c20, - 0x2f2bc: 0x6d031e20, 0x2f2bd: 0x6d032020, 0x2f2be: 0x6d032220, 0x2f2bf: 0x6d032420, - // Block 0xbcb, offset 0x2f2c0 - 0x2f2c0: 0x6d032620, 0x2f2c1: 0x6d032820, 0x2f2c2: 0x6d032a20, 0x2f2c3: 0x6d032c20, - 0x2f2c4: 0x6cd4d420, 0x2f2c5: 0x6d032e20, 0x2f2c6: 0x6d033020, 0x2f2c7: 0x6d30be20, - 0x2f2c8: 0x6d30c020, 0x2f2c9: 0x6d30c220, 0x2f2ca: 0x6d30c420, 0x2f2cb: 0x6d30c620, - 0x2f2cc: 0x6d30c820, 0x2f2cd: 0x6d30ca20, 0x2f2ce: 0x6d30cc20, 0x2f2cf: 0x6d30ce20, - 0x2f2d0: 0x6d30d020, 0x2f2d1: 0x6d30d220, 0x2f2d2: 0x6d30d420, 0x2f2d3: 0x6d30d620, - 0x2f2d4: 0x6d30d820, 0x2f2d5: 0x6d30da20, 0x2f2d6: 0x6d30dc20, 0x2f2d7: 0x6d30de20, - 0x2f2d8: 0x6d30e020, 0x2f2d9: 0x6d30e220, 0x2f2da: 0x6d5d8c20, 0x2f2db: 0x6d5d8e20, - 0x2f2dc: 0x6d5d9020, 0x2f2dd: 0x6d5d9220, 0x2f2de: 0x6d5d9420, 0x2f2df: 0x6d5d9620, - 0x2f2e0: 0x6d5d9820, 0x2f2e1: 0x6d5d9a20, 0x2f2e2: 0x6d5d9c20, 0x2f2e3: 0x6d5d9e20, - 0x2f2e4: 0x6d87fe20, 0x2f2e5: 0x6d880020, 0x2f2e6: 0x6d880220, 0x2f2e7: 0x6daca020, - 0x2f2e8: 0x6daca220, 0x2f2e9: 0x6d880420, 0x2f2ea: 0x6daca420, 0x2f2eb: 0x6daca620, - 0x2f2ec: 0x6dcca420, 0x2f2ed: 0x6dcca620, 0x2f2ee: 0x6dcca820, 0x2f2ef: 0x6dccaa20, - 0x2f2f0: 0x6de7ac20, 0x2f2f1: 0x6de7ae20, 0x2f2f2: 0x6dfe3a20, 0x2f2f3: 0x6e1f5620, - 0x2f2f4: 0x6e1f5820, 0x2f2f5: 0x6e2aa020, 0x2f2f6: 0x6e333020, 0x2f2f7: 0x6e333220, - 0x2f2f8: 0x6c0a3820, 0x2f2f9: 0x6c5b2a20, 0x2f2fa: 0x6c5b2c20, 0x2f2fb: 0x6ca6f420, - 0x2f2fc: 0x6cd52620, 0x2f2fd: 0x6d037620, 0x2f2fe: 0x6c0a3c20, 0x2f2ff: 0x6c256820, - // Block 0xbcc, offset 0x2f300 - 0x2f300: 0x6c256a20, 0x2f301: 0x6c256c20, 0x2f302: 0x6c256e20, 0x2f303: 0x6c257020, - 0x2f304: 0x6c3d3a20, 0x2f305: 0x6c3d3c20, 0x2f306: 0x6c3d3e20, 0x2f307: 0x6c3d4020, - 0x2f308: 0x6c3d4220, 0x2f309: 0x6c3d4420, 0x2f30a: 0x6c3d4620, 0x2f30b: 0x6c5b3e20, - 0x2f30c: 0x6c5b4020, 0x2f30d: 0x6c5b4220, 0x2f30e: 0x6c5b4420, 0x2f30f: 0x6c5b4620, - 0x2f310: 0x6c5b4820, 0x2f311: 0x6c5b4a20, 0x2f312: 0x6c5b4c20, 0x2f313: 0x6c5b4e20, - 0x2f314: 0x6c5b5020, 0x2f315: 0x6c5b5220, 0x2f316: 0x6c5b5420, 0x2f317: 0x6c5b5620, - 0x2f318: 0x6c7e3820, 0x2f319: 0x6c7e3a20, 0x2f31a: 0x6c7e3c20, 0x2f31b: 0x6c7e3e20, - 0x2f31c: 0x6c7e4020, 0x2f31d: 0x6c7e4220, 0x2f31e: 0x6c7e4420, 0x2f31f: 0x6c7e4620, - 0x2f320: 0x6c7e4820, 0x2f321: 0x6c7e4a20, 0x2f322: 0x6c7e4c20, 0x2f323: 0x6c7e4e20, - 0x2f324: 0x6c7e5020, 0x2f325: 0x6c7e5220, 0x2f326: 0x6c7e5420, 0x2f327: 0x6c7e5620, - 0x2f328: 0x6c7e5820, 0x2f329: 0x6c7e5a20, 0x2f32a: 0x6c7e5c20, 0x2f32b: 0x6c7e5e20, - 0x2f32c: 0x6c7e6020, 0x2f32d: 0x6c7e6220, 0x2f32e: 0x6c7e6420, 0x2f32f: 0x6c7e6620, - 0x2f330: 0x6c7e6820, 0x2f331: 0x6ca71a20, 0x2f332: 0x6ca71c20, 0x2f333: 0x6ca71e20, - 0x2f334: 0x6ca72020, 0x2f335: 0x6ca72220, 0x2f336: 0x6ca72420, 0x2f337: 0x6ca72620, - 0x2f338: 0x6ca72820, 0x2f339: 0x6ca72a20, 0x2f33a: 0x6ca72c20, 0x2f33b: 0x6ca72e20, - 0x2f33c: 0x6ca73020, 0x2f33d: 0x6ca73220, 0x2f33e: 0x6ca73420, 0x2f33f: 0x6cd54020, - // Block 0xbcd, offset 0x2f340 - 0x2f340: 0x6cd54220, 0x2f341: 0x6cd54420, 0x2f342: 0x6cd54620, 0x2f343: 0x6cd54820, - 0x2f344: 0x6cd54a20, 0x2f345: 0x6cd54c20, 0x2f346: 0x6ca73620, 0x2f347: 0x6cd54e20, - 0x2f348: 0x6cd55020, 0x2f349: 0x6cd55220, 0x2f34a: 0x6cd55420, 0x2f34b: 0x6cd55620, - 0x2f34c: 0x6cd55820, 0x2f34d: 0x6cd55a20, 0x2f34e: 0x6cd55c20, 0x2f34f: 0x6d039420, - 0x2f350: 0x6d039620, 0x2f351: 0x6d039820, 0x2f352: 0x6d039a20, 0x2f353: 0x6d039c20, - 0x2f354: 0x6d039e20, 0x2f355: 0x6d03a020, 0x2f356: 0x6d03a220, 0x2f357: 0x6d03a420, - 0x2f358: 0x6d03a620, 0x2f359: 0x6d03a820, 0x2f35a: 0x6d03aa20, 0x2f35b: 0x6d03ac20, - 0x2f35c: 0x6d03ae20, 0x2f35d: 0x6d03b020, 0x2f35e: 0x6d03b220, 0x2f35f: 0x6d03b420, - 0x2f360: 0x6d03b620, 0x2f361: 0x6d03b820, 0x2f362: 0x6d03ba20, 0x2f363: 0x6d03bc20, - 0x2f364: 0x6d03be20, 0x2f365: 0x6d03c020, 0x2f366: 0x6d313220, 0x2f367: 0x6d313420, - 0x2f368: 0x6d313620, 0x2f369: 0x6d313820, 0x2f36a: 0x6d313a20, 0x2f36b: 0x6d313c20, - 0x2f36c: 0x6d313e20, 0x2f36d: 0x6d314020, 0x2f36e: 0x6d314220, 0x2f36f: 0x6d314420, - 0x2f370: 0x6d314620, 0x2f371: 0x6d314820, 0x2f372: 0x6d314a20, 0x2f373: 0x6d314c20, - 0x2f374: 0x6d5dee20, 0x2f375: 0x6d31c220, 0x2f376: 0x6d5df020, 0x2f377: 0x6d5df220, - 0x2f378: 0x6d5df420, 0x2f379: 0x6d5df620, 0x2f37a: 0x6d5df820, 0x2f37b: 0x6d5dfa20, - 0x2f37c: 0x6d5dfc20, 0x2f37d: 0x6d5dfe20, 0x2f37e: 0x6d5e0020, 0x2f37f: 0x6d5e0220, - // Block 0xbce, offset 0x2f380 - 0x2f380: 0x6d5e0420, 0x2f381: 0x6d5e0620, 0x2f382: 0x6d5e0820, 0x2f383: 0x6d5e0a20, - 0x2f384: 0x6d884220, 0x2f385: 0x6d884420, 0x2f386: 0x6d884620, 0x2f387: 0x6d884820, - 0x2f388: 0x6d884a20, 0x2f389: 0x6dacd420, 0x2f38a: 0x6d314e20, 0x2f38b: 0x6d884c20, - 0x2f38c: 0x6d884e20, 0x2f38d: 0x6d885020, 0x2f38e: 0x6d885220, 0x2f38f: 0x6d885420, - 0x2f390: 0x6d885620, 0x2f391: 0x6d885820, 0x2f392: 0x6d885a20, 0x2f393: 0x6d88ba20, - 0x2f394: 0x6dacd620, 0x2f395: 0x6dacd820, 0x2f396: 0x6dacda20, 0x2f397: 0x6dacdc20, - 0x2f398: 0x6dacde20, 0x2f399: 0x6dace020, 0x2f39a: 0x6dace220, 0x2f39b: 0x6dace420, - 0x2f39c: 0x6dace620, 0x2f39d: 0x6dace820, 0x2f39e: 0x6dacea20, 0x2f39f: 0x6dccce20, - 0x2f3a0: 0x6dccd020, 0x2f3a1: 0x6dccd220, 0x2f3a2: 0x6dccd420, 0x2f3a3: 0x6dccd620, - 0x2f3a4: 0x6de7bc20, 0x2f3a5: 0x6de7be20, 0x2f3a6: 0x6de7c020, 0x2f3a7: 0x6de7c220, - 0x2f3a8: 0x6de7c420, 0x2f3a9: 0x6de7c620, 0x2f3aa: 0x6de7c820, 0x2f3ab: 0x6de7ca20, - 0x2f3ac: 0x6dfe4a20, 0x2f3ad: 0x6dfe4c20, 0x2f3ae: 0x6dfe4e20, 0x2f3af: 0x6dfe5020, - 0x2f3b0: 0x6e1f6a20, 0x2f3b1: 0x6e1f7420, 0x2f3b2: 0x6e333e20, 0x2f3b3: 0x6e333c20, - 0x2f3b4: 0x6c0a4020, 0x2f3b5: 0x6c140c20, 0x2f3b6: 0x6c257c20, 0x2f3b7: 0x6c257e20, - 0x2f3b8: 0x6c3d6a20, 0x2f3b9: 0x6c3d6c20, 0x2f3ba: 0x6c3d6e20, 0x2f3bb: 0x6c3d7020, - 0x2f3bc: 0x6c5b9a20, 0x2f3bd: 0x6c5b9c20, 0x2f3be: 0x6c5b9e20, 0x2f3bf: 0x6c5ba020, - // Block 0xbcf, offset 0x2f3c0 - 0x2f3c0: 0x6c5ba220, 0x2f3c1: 0x6c5ba420, 0x2f3c2: 0x6c5ba620, 0x2f3c3: 0x6c5ba820, - 0x2f3c4: 0x6c7eac20, 0x2f3c5: 0x6c7eae20, 0x2f3c6: 0x6c7eb020, 0x2f3c7: 0x6c7eb220, - 0x2f3c8: 0x6c7eb420, 0x2f3c9: 0x6c7eb620, 0x2f3ca: 0x6c7eb820, 0x2f3cb: 0x6c7eba20, - 0x2f3cc: 0x6c7ebc20, 0x2f3cd: 0x6c7ebe20, 0x2f3ce: 0x6c7ec020, 0x2f3cf: 0x6ca78620, - 0x2f3d0: 0x6ca78820, 0x2f3d1: 0x6ca78a20, 0x2f3d2: 0x6ca78c20, 0x2f3d3: 0x6ca78e20, - 0x2f3d4: 0x6ca79020, 0x2f3d5: 0x6ca79220, 0x2f3d6: 0x6cd5ac20, 0x2f3d7: 0x6cd5ae20, - 0x2f3d8: 0x6cd5b020, 0x2f3d9: 0x6cd5b220, 0x2f3da: 0x6ca7c420, 0x2f3db: 0x6cd5b420, - 0x2f3dc: 0x6cd5b620, 0x2f3dd: 0x6cd5b820, 0x2f3de: 0x6d043220, 0x2f3df: 0x6d043420, - 0x2f3e0: 0x6d043620, 0x2f3e1: 0x6d043820, 0x2f3e2: 0x6d043a20, 0x2f3e3: 0x6d043c20, - 0x2f3e4: 0x6d043e20, 0x2f3e5: 0x6d044020, 0x2f3e6: 0x6d044220, 0x2f3e7: 0x6d044420, - 0x2f3e8: 0x6d31c820, 0x2f3e9: 0x6d31ca20, 0x2f3ea: 0x6d31cc20, 0x2f3eb: 0x6d31ce20, - 0x2f3ec: 0x6d31d020, 0x2f3ed: 0x6d31d220, 0x2f3ee: 0x6d5e7020, 0x2f3ef: 0x6d5e7220, - 0x2f3f0: 0x6d5e7420, 0x2f3f1: 0x6d5e7620, 0x2f3f2: 0x6d5e7820, 0x2f3f3: 0x6d5e7a20, - 0x2f3f4: 0x6d5e7c20, 0x2f3f5: 0x6d88c820, 0x2f3f6: 0x6d88ca20, 0x2f3f7: 0x6d88cc20, - 0x2f3f8: 0x6d88ce20, 0x2f3f9: 0x6d88d020, 0x2f3fa: 0x6d88d220, 0x2f3fb: 0x6d88d420, - 0x2f3fc: 0x6d88d620, 0x2f3fd: 0x6d88d820, 0x2f3fe: 0x6dad5020, 0x2f3ff: 0x6dad5220, - // Block 0xbd0, offset 0x2f400 - 0x2f400: 0x6dad5420, 0x2f401: 0x6dad5620, 0x2f402: 0x6dad5820, 0x2f403: 0x6e10de20, - 0x2f404: 0x6dcd2020, 0x2f405: 0x6dcd2220, 0x2f406: 0x6de7f620, 0x2f407: 0x6dfe8620, - 0x2f408: 0x6e10e020, 0x2f409: 0x6e10e220, 0x2f40a: 0x6e1f7820, 0x2f40b: 0x6c0a4420, - 0x2f40c: 0x6c258a20, 0x2f40d: 0x6c258c20, 0x2f40e: 0x6c3d9020, 0x2f40f: 0x6c3d9220, - 0x2f410: 0x6c5bd620, 0x2f411: 0x6c5bd820, 0x2f412: 0x6c5bda20, 0x2f413: 0x6c5bdc20, - 0x2f414: 0x6c5bde20, 0x2f415: 0x6c5be020, 0x2f416: 0x6c5be220, 0x2f417: 0x6c5be420, - 0x2f418: 0x6c7efe20, 0x2f419: 0x6c7f0020, 0x2f41a: 0x6c7f0220, 0x2f41b: 0x6c7f0420, - 0x2f41c: 0x6c7f0620, 0x2f41d: 0x6c7f0820, 0x2f41e: 0x6c7f0a20, 0x2f41f: 0x6cb6ae20, - 0x2f420: 0x6cb6b020, 0x2f421: 0x6ca7c820, 0x2f422: 0x6cd60e20, 0x2f423: 0x6cd61020, - 0x2f424: 0x6cd61220, 0x2f425: 0x6cd61420, 0x2f426: 0x6cd61620, 0x2f427: 0x6cd61820, - 0x2f428: 0x6d048e20, 0x2f429: 0x6d049020, 0x2f42a: 0x6d049220, 0x2f42b: 0x6d049420, - 0x2f42c: 0x6d320820, 0x2f42d: 0x6d320a20, 0x2f42e: 0x6d322e20, 0x2f42f: 0x6d320c20, - 0x2f430: 0x6d320e20, 0x2f431: 0x6d892220, 0x2f432: 0x6dad8a20, 0x2f433: 0x6dad8c20, - 0x2f434: 0x6dad8e20, 0x2f435: 0x6dcd3a20, 0x2f436: 0x6dfe9a20, 0x2f437: 0x6dfe9c20, - 0x2f438: 0x6e1f7e20, 0x2f439: 0x6c141020, 0x2f43a: 0x6c3d9a20, 0x2f43b: 0x6c3d9c20, - 0x2f43c: 0x6c5bf820, 0x2f43d: 0x6c5bfa20, 0x2f43e: 0x6c5bfc20, 0x2f43f: 0x6c5bfe20, - // Block 0xbd1, offset 0x2f440 - 0x2f440: 0x6c5c0020, 0x2f441: 0x6c5c0220, 0x2f442: 0x6c5c0420, 0x2f443: 0x6c5c0620, - 0x2f444: 0x6c7fa820, 0x2f445: 0x6c7f4020, 0x2f446: 0x6c7f4220, 0x2f447: 0x6c7f4420, - 0x2f448: 0x6c7f4620, 0x2f449: 0x6c7f4820, 0x2f44a: 0x6c7f4a20, 0x2f44b: 0x6c7f4c20, - 0x2f44c: 0x6c7f4e20, 0x2f44d: 0x6c7f5020, 0x2f44e: 0x6c7f5220, 0x2f44f: 0x6c7f5420, - 0x2f450: 0x6c7f5620, 0x2f451: 0x6c7f5820, 0x2f452: 0x6c7f5a20, 0x2f453: 0x6c7f5c20, - 0x2f454: 0x6c7f5e20, 0x2f455: 0x6c7f6020, 0x2f456: 0x6ca7fa20, 0x2f457: 0x6ca7fc20, - 0x2f458: 0x6ca7fe20, 0x2f459: 0x6ca80020, 0x2f45a: 0x6ca80220, 0x2f45b: 0x6ca80420, - 0x2f45c: 0x6ca80620, 0x2f45d: 0x6ca80820, 0x2f45e: 0x6ca80a20, 0x2f45f: 0x6ca80c20, - 0x2f460: 0x6ca80e20, 0x2f461: 0x6ca81020, 0x2f462: 0x6ca81220, 0x2f463: 0x6ca81420, - 0x2f464: 0x6ca81620, 0x2f465: 0x6ca81820, 0x2f466: 0x6ca81a20, 0x2f467: 0x6ca81c20, - 0x2f468: 0x6ca81e20, 0x2f469: 0x6ca82020, 0x2f46a: 0x6ca82220, 0x2f46b: 0x6ca82420, - 0x2f46c: 0x6ca82620, 0x2f46d: 0x6ca82820, 0x2f46e: 0x6ca82a20, 0x2f46f: 0x6ca82c20, - 0x2f470: 0x6ca82e20, 0x2f471: 0x6ca83020, 0x2f472: 0x6ca83220, 0x2f473: 0x6ca83420, - 0x2f474: 0x6ca83620, 0x2f475: 0x6ca83820, 0x2f476: 0x6ca83a20, 0x2f477: 0x6ca83c20, - 0x2f478: 0x6ca83e20, 0x2f479: 0x6ca84020, 0x2f47a: 0x6ca84220, 0x2f47b: 0x6ca84420, - 0x2f47c: 0x6ca84620, 0x2f47d: 0x6ca84820, 0x2f47e: 0x6ca84a20, 0x2f47f: 0x6cd65220, - // Block 0xbd2, offset 0x2f480 - 0x2f480: 0x6cd65420, 0x2f481: 0x6cd65620, 0x2f482: 0x6cd65820, 0x2f483: 0x6cd65a20, - 0x2f484: 0x6cd65c20, 0x2f485: 0x6cd65e20, 0x2f486: 0x6cd66020, 0x2f487: 0x6cd66220, - 0x2f488: 0x6cd66420, 0x2f489: 0x6cd66620, 0x2f48a: 0x6cd66820, 0x2f48b: 0x6cd66a20, - 0x2f48c: 0x6cd66c20, 0x2f48d: 0x6cd66e20, 0x2f48e: 0x6cd67020, 0x2f48f: 0x6cd67220, - 0x2f490: 0x6cd67420, 0x2f491: 0x6cd67620, 0x2f492: 0x6cd67820, 0x2f493: 0x6cd67a20, - 0x2f494: 0x6cd67c20, 0x2f495: 0x6cd67e20, 0x2f496: 0x6cd68020, 0x2f497: 0x6cd68220, - 0x2f498: 0x6cd68420, 0x2f499: 0x6cd68620, 0x2f49a: 0x6cd68820, 0x2f49b: 0x6cd68a20, - 0x2f49c: 0x6cd68c20, 0x2f49d: 0x6cd68e20, 0x2f49e: 0x6d04ce20, 0x2f49f: 0x6d04d020, - 0x2f4a0: 0x6d04d220, 0x2f4a1: 0x6d04d420, 0x2f4a2: 0x6d04d620, 0x2f4a3: 0x6d04d820, - 0x2f4a4: 0x6d04da20, 0x2f4a5: 0x6d04dc20, 0x2f4a6: 0x6d04de20, 0x2f4a7: 0x6d04e020, - 0x2f4a8: 0x6d04e220, 0x2f4a9: 0x6d04e420, 0x2f4aa: 0x6d04e620, 0x2f4ab: 0x6d04e820, - 0x2f4ac: 0x6cd6de20, 0x2f4ad: 0x6d04ea20, 0x2f4ae: 0x6d04ec20, 0x2f4af: 0x6d04ee20, - 0x2f4b0: 0x6d04f020, 0x2f4b1: 0x6d04f220, 0x2f4b2: 0x6d04f420, 0x2f4b3: 0x6d04f620, - 0x2f4b4: 0x6d04f820, 0x2f4b5: 0x6d323020, 0x2f4b6: 0x6d04fa20, 0x2f4b7: 0x6d04fc20, - 0x2f4b8: 0x6d04fe20, 0x2f4b9: 0x6d050020, 0x2f4ba: 0x6d050220, 0x2f4bb: 0x6d050420, - 0x2f4bc: 0x6d050620, 0x2f4bd: 0x6d050820, 0x2f4be: 0x6d050a20, 0x2f4bf: 0x6d050c20, - // Block 0xbd3, offset 0x2f4c0 - 0x2f4c0: 0x6d050e20, 0x2f4c1: 0x6d324c20, 0x2f4c2: 0x6d324e20, 0x2f4c3: 0x6d325020, - 0x2f4c4: 0x6d325220, 0x2f4c5: 0x6d325420, 0x2f4c6: 0x6d325620, 0x2f4c7: 0x6d325820, - 0x2f4c8: 0x6d325a20, 0x2f4c9: 0x6d325c20, 0x2f4ca: 0x6d325e20, 0x2f4cb: 0x6d326020, - 0x2f4cc: 0x6d326220, 0x2f4cd: 0x6d326420, 0x2f4ce: 0x6d326620, 0x2f4cf: 0x6d326820, - 0x2f4d0: 0x6d326a20, 0x2f4d1: 0x6d326c20, 0x2f4d2: 0x6d326e20, 0x2f4d3: 0x6d327020, - 0x2f4d4: 0x6d327220, 0x2f4d5: 0x6d327420, 0x2f4d6: 0x6d327620, 0x2f4d7: 0x6d327820, - 0x2f4d8: 0x6d327a20, 0x2f4d9: 0x6d327c20, 0x2f4da: 0x6d327e20, 0x2f4db: 0x6d328020, - 0x2f4dc: 0x6d328220, 0x2f4dd: 0x6d328420, 0x2f4de: 0x6d328620, 0x2f4df: 0x6d328820, - 0x2f4e0: 0x6d328a20, 0x2f4e1: 0x6d328c20, 0x2f4e2: 0x6d328e20, 0x2f4e3: 0x6d329020, - 0x2f4e4: 0x6d329220, 0x2f4e5: 0x6d329420, 0x2f4e6: 0x6d329620, 0x2f4e7: 0x6d329820, - 0x2f4e8: 0x6d329a20, 0x2f4e9: 0x6d329c20, 0x2f4ea: 0x6d329e20, 0x2f4eb: 0x6d32a020, - 0x2f4ec: 0x6d5f0420, 0x2f4ed: 0x6d5f0620, 0x2f4ee: 0x6d5f0820, 0x2f4ef: 0x6d5f0a20, - 0x2f4f0: 0x6d5f0c20, 0x2f4f1: 0x6d5f0e20, 0x2f4f2: 0x6d5f1020, 0x2f4f3: 0x6d5f1220, - 0x2f4f4: 0x6d5f1420, 0x2f4f5: 0x6d5f1620, 0x2f4f6: 0x6d5f1820, 0x2f4f7: 0x6d5f1a20, - 0x2f4f8: 0x6d333620, 0x2f4f9: 0x6d5f1c20, 0x2f4fa: 0x6d5f1e20, 0x2f4fb: 0x6d5f2020, - 0x2f4fc: 0x6d5f2220, 0x2f4fd: 0x6d5f2420, 0x2f4fe: 0x6d5f2620, 0x2f4ff: 0x6d5f2820, - // Block 0xbd4, offset 0x2f500 - 0x2f500: 0x6d051020, 0x2f501: 0x6d5f2a20, 0x2f502: 0x6d5f2c20, 0x2f503: 0x6d5f2e20, - 0x2f504: 0x6d5f3020, 0x2f505: 0x6d5f3220, 0x2f506: 0x6d5f3420, 0x2f507: 0x6d5f3620, - 0x2f508: 0x6d5f3820, 0x2f509: 0x6d894a20, 0x2f50a: 0x6d5f3a20, 0x2f50b: 0x6d5f3c20, - 0x2f50c: 0x6d5f3e20, 0x2f50d: 0x6d5f4020, 0x2f50e: 0x6d5f4220, 0x2f50f: 0x6d5f4420, - 0x2f510: 0x6d5f4620, 0x2f511: 0x6d5f4820, 0x2f512: 0x6d5f4a20, 0x2f513: 0x6d5f4c20, - 0x2f514: 0x6d894c20, 0x2f515: 0x6d894e20, 0x2f516: 0x6d895020, 0x2f517: 0x6d895220, - 0x2f518: 0x6d895420, 0x2f519: 0x6d895620, 0x2f51a: 0x6d895820, 0x2f51b: 0x6d895a20, - 0x2f51c: 0x6d895c20, 0x2f51d: 0x6d895e20, 0x2f51e: 0x6d896020, 0x2f51f: 0x6d896220, - 0x2f520: 0x6d896420, 0x2f521: 0x6d896620, 0x2f522: 0x6d896820, 0x2f523: 0x6d896a20, - 0x2f524: 0x6d896c20, 0x2f525: 0x6d896e20, 0x2f526: 0x6d897020, 0x2f527: 0x6d897220, - 0x2f528: 0x6d897420, 0x2f529: 0x6d897620, 0x2f52a: 0x6d897820, 0x2f52b: 0x6d897a20, - 0x2f52c: 0x6d897c20, 0x2f52d: 0x6d897e20, 0x2f52e: 0x6d898020, 0x2f52f: 0x6d898220, - 0x2f530: 0x6dadc820, 0x2f531: 0x6dadca20, 0x2f532: 0x6dadcc20, 0x2f533: 0x6dadce20, - 0x2f534: 0x6dadd020, 0x2f535: 0x6dadd220, 0x2f536: 0x6dadd420, 0x2f537: 0x6dadd620, - 0x2f538: 0x6dadd820, 0x2f539: 0x6d8a5020, 0x2f53a: 0x6dadda20, 0x2f53b: 0x6daddc20, - 0x2f53c: 0x6dadde20, 0x2f53d: 0x6dade020, 0x2f53e: 0x6dade220, 0x2f53f: 0x6dade420, - // Block 0xbd5, offset 0x2f540 - 0x2f540: 0x6dade620, 0x2f541: 0x6dade820, 0x2f542: 0x6dadea20, 0x2f543: 0x6dadec20, - 0x2f544: 0x6dadee20, 0x2f545: 0x6dadf020, 0x2f546: 0x6dadf220, 0x2f547: 0x6dadf420, - 0x2f548: 0x6dadf620, 0x2f549: 0x6dadf820, 0x2f54a: 0x6dadfa20, 0x2f54b: 0x6dadfc20, - 0x2f54c: 0x6dadfe20, 0x2f54d: 0x6dae0020, 0x2f54e: 0x6dae0220, 0x2f54f: 0x6dae0420, - 0x2f550: 0x6dae0620, 0x2f551: 0x6d898420, 0x2f552: 0x6dae0820, 0x2f553: 0x6dae0a20, - 0x2f554: 0x6dae0c20, 0x2f555: 0x6dada620, 0x2f556: 0x6dae0e20, 0x2f557: 0x6dae1020, - 0x2f558: 0x6daec420, 0x2f559: 0x6dcd7220, 0x2f55a: 0x6dcd7420, 0x2f55b: 0x6dcd7620, - 0x2f55c: 0x6dcd7820, 0x2f55d: 0x6dcd7a20, 0x2f55e: 0x6dcd7c20, 0x2f55f: 0x6dcd7e20, - 0x2f560: 0x6dcd8020, 0x2f561: 0x6dcd8220, 0x2f562: 0x6dcd8420, 0x2f563: 0x6dcd8620, - 0x2f564: 0x6dcd8820, 0x2f565: 0x6dcd8a20, 0x2f566: 0x6dcd8c20, 0x2f567: 0x6dcd8e20, - 0x2f568: 0x6dcd9020, 0x2f569: 0x6dcd9220, 0x2f56a: 0x6dcd9420, 0x2f56b: 0x6dcd9620, - 0x2f56c: 0x6de81220, 0x2f56d: 0x6dcd9820, 0x2f56e: 0x6dcd9a20, 0x2f56f: 0x6dcd9c20, - 0x2f570: 0x6dcd9e20, 0x2f571: 0x6dcda020, 0x2f572: 0x6dcda220, 0x2f573: 0x6de82820, - 0x2f574: 0x6de82a20, 0x2f575: 0x6de82c20, 0x2f576: 0x6de82e20, 0x2f577: 0x6de83020, - 0x2f578: 0x6de83220, 0x2f579: 0x6de83420, 0x2f57a: 0x6de83620, 0x2f57b: 0x6de83820, - 0x2f57c: 0x6de83a20, 0x2f57d: 0x6de83c20, 0x2f57e: 0x6de83e20, 0x2f57f: 0x6de84020, - // Block 0xbd6, offset 0x2f580 - 0x2f580: 0x6de84220, 0x2f581: 0x6de84420, 0x2f582: 0x6de84620, 0x2f583: 0x6dfeac20, - 0x2f584: 0x6dfeae20, 0x2f585: 0x6dfeb020, 0x2f586: 0x6dfeb220, 0x2f587: 0x6dfeb420, - 0x2f588: 0x6dfeb620, 0x2f589: 0x6dfeb820, 0x2f58a: 0x6dfeba20, 0x2f58b: 0x6dfebc20, - 0x2f58c: 0x6dfebe20, 0x2f58d: 0x6dfec020, 0x2f58e: 0x6dfec220, 0x2f58f: 0x6dfec420, - 0x2f590: 0x6e111820, 0x2f591: 0x6e111a20, 0x2f592: 0x6e111c20, 0x2f593: 0x6e111e20, - 0x2f594: 0x6e112020, 0x2f595: 0x6dfec620, 0x2f596: 0x6e110620, 0x2f597: 0x6e1f8e20, - 0x2f598: 0x6e1f9020, 0x2f599: 0x6e1f9220, 0x2f59a: 0x6e1f9420, 0x2f59b: 0x6e1f9620, - 0x2f59c: 0x6e1f9820, 0x2f59d: 0x6e1f9a20, 0x2f59e: 0x6e2ac420, 0x2f59f: 0x6e1f9c20, - 0x2f5a0: 0x6e1f9e20, 0x2f5a1: 0x6e1fa020, 0x2f5a2: 0x6e2acc20, 0x2f5a3: 0x6e2ace20, - 0x2f5a4: 0x6e2ad020, 0x2f5a5: 0x6e2ad220, 0x2f5a6: 0x6e2ad420, 0x2f5a7: 0x6e2ad620, - 0x2f5a8: 0x6e2ad820, 0x2f5a9: 0x6e396020, 0x2f5aa: 0x6e335420, 0x2f5ab: 0x6e396220, - 0x2f5ac: 0x6e396420, 0x2f5ad: 0x6e396620, 0x2f5ae: 0x6e396820, 0x2f5af: 0x6e3dae20, - 0x2f5b0: 0x6e3db020, 0x2f5b1: 0x6e453420, 0x2f5b2: 0x6e463620, 0x2f5b3: 0x6c141420, - 0x2f5b4: 0x6c3da820, 0x2f5b5: 0x6c3daa20, 0x2f5b6: 0x6c3dac20, 0x2f5b7: 0x6c5c3220, - 0x2f5b8: 0x6c5c3420, 0x2f5b9: 0x6c5c3620, 0x2f5ba: 0x6c5c3820, 0x2f5bb: 0x6c5c3a20, - 0x2f5bc: 0x6c5c3c20, 0x2f5bd: 0x6c5c3e20, 0x2f5be: 0x6c5c4020, 0x2f5bf: 0x6c5c4220, - // Block 0xbd7, offset 0x2f5c0 - 0x2f5c0: 0x6c5c4420, 0x2f5c1: 0x6c5c4620, 0x2f5c2: 0x6c5c4820, 0x2f5c3: 0x6c7fae20, - 0x2f5c4: 0x6c7fb020, 0x2f5c5: 0x6c7fb220, 0x2f5c6: 0x6c7fb420, 0x2f5c7: 0x6c7fb620, - 0x2f5c8: 0x6c7fb820, 0x2f5c9: 0x6c7fba20, 0x2f5ca: 0x6c7fbc20, 0x2f5cb: 0x6c7fbe20, - 0x2f5cc: 0x6c7fc020, 0x2f5cd: 0x6c7fc220, 0x2f5ce: 0x6c7fc420, 0x2f5cf: 0x6c7fc620, - 0x2f5d0: 0x6c7fc820, 0x2f5d1: 0x6c7fca20, 0x2f5d2: 0x6ca89c20, 0x2f5d3: 0x6ca89e20, - 0x2f5d4: 0x6ca8a020, 0x2f5d5: 0x6ca8a220, 0x2f5d6: 0x6ca8a420, 0x2f5d7: 0x6ca8a620, - 0x2f5d8: 0x6ca8a820, 0x2f5d9: 0x6ca8aa20, 0x2f5da: 0x6ca8ac20, 0x2f5db: 0x6ca8ae20, - 0x2f5dc: 0x6ca8b020, 0x2f5dd: 0x6ca8b220, 0x2f5de: 0x6cd6ec20, 0x2f5df: 0x6cd6ee20, - 0x2f5e0: 0x6cd6f020, 0x2f5e1: 0x6cd6f220, 0x2f5e2: 0x6cd6f420, 0x2f5e3: 0x6ca8b420, - 0x2f5e4: 0x6cd6f620, 0x2f5e5: 0x6cd6f820, 0x2f5e6: 0x6cd6fa20, 0x2f5e7: 0x6cd6fc20, - 0x2f5e8: 0x6cd6fe20, 0x2f5e9: 0x6cd70020, 0x2f5ea: 0x6cd70220, 0x2f5eb: 0x6cd70420, - 0x2f5ec: 0x6cd70620, 0x2f5ed: 0x6cd70820, 0x2f5ee: 0x6d05a420, 0x2f5ef: 0x6d05a620, - 0x2f5f0: 0x6d05a820, 0x2f5f1: 0x6d05aa20, 0x2f5f2: 0x6d05ac20, 0x2f5f3: 0x6d05ae20, - 0x2f5f4: 0x6d05b020, 0x2f5f5: 0x6d05b220, 0x2f5f6: 0x6d334420, 0x2f5f7: 0x6d334620, - 0x2f5f8: 0x6d334820, 0x2f5f9: 0x6d334a20, 0x2f5fa: 0x6d334c20, 0x2f5fb: 0x6d334e20, - 0x2f5fc: 0x6d335020, 0x2f5fd: 0x6d335220, 0x2f5fe: 0x6d335420, 0x2f5ff: 0x6d335620, - // Block 0xbd8, offset 0x2f600 - 0x2f600: 0x6d05b420, 0x2f601: 0x6d335820, 0x2f602: 0x6d5ffc20, 0x2f603: 0x6d5ffe20, - 0x2f604: 0x6d600020, 0x2f605: 0x6d600220, 0x2f606: 0x6d600420, 0x2f607: 0x6d600620, - 0x2f608: 0x6d600820, 0x2f609: 0x6d600a20, 0x2f60a: 0x6d600c20, 0x2f60b: 0x6d600e20, - 0x2f60c: 0x6d601020, 0x2f60d: 0x6d601220, 0x2f60e: 0x6d601420, 0x2f60f: 0x6d8a5820, - 0x2f610: 0x6d8a5a20, 0x2f611: 0x6d8a5c20, 0x2f612: 0x6d8a5e20, 0x2f613: 0x6d8a6020, - 0x2f614: 0x6d8a6220, 0x2f615: 0x6d8a6420, 0x2f616: 0x6d8a6620, 0x2f617: 0x6d8a6820, - 0x2f618: 0x6d8a6a20, 0x2f619: 0x6daed420, 0x2f61a: 0x6daed620, 0x2f61b: 0x6daed820, - 0x2f61c: 0x6daeda20, 0x2f61d: 0x6daedc20, 0x2f61e: 0x6daede20, 0x2f61f: 0x6daee020, - 0x2f620: 0x6daee220, 0x2f621: 0x6daee420, 0x2f622: 0x6daee620, 0x2f623: 0x6dce7220, - 0x2f624: 0x6dce7420, 0x2f625: 0x6dce7620, 0x2f626: 0x6dce7820, 0x2f627: 0x6dce7a20, - 0x2f628: 0x6daee820, 0x2f629: 0x6de8c820, 0x2f62a: 0x6de8ca20, 0x2f62b: 0x6de8cc20, - 0x2f62c: 0x6de8ce20, 0x2f62d: 0x6de8d020, 0x2f62e: 0x6dff2020, 0x2f62f: 0x6dff2220, - 0x2f630: 0x6dff2420, 0x2f631: 0x6e1fe420, 0x2f632: 0x6e118c20, 0x2f633: 0x6e3dc220, - 0x2f634: 0x6e1fe620, 0x2f635: 0x6e2b0820, 0x2f636: 0x6e398820, 0x2f637: 0x6e409e20, - 0x2f638: 0x6c141620, 0x2f639: 0x6c141820, 0x2f63a: 0x6c259a20, 0x2f63b: 0x6c259c20, - 0x2f63c: 0x6c3dbc20, 0x2f63d: 0x6c3dbe20, 0x2f63e: 0x6c3dc020, 0x2f63f: 0x6c3dc220, - // Block 0xbd9, offset 0x2f640 - 0x2f640: 0x6c5c6620, 0x2f641: 0x6c5c6820, 0x2f642: 0x6c5c6a20, 0x2f643: 0x6c5c6c20, - 0x2f644: 0x6c5c6e20, 0x2f645: 0x6c5c7020, 0x2f646: 0x6c5c7220, 0x2f647: 0x6c5c7420, - 0x2f648: 0x6c5c7620, 0x2f649: 0x6c5c7820, 0x2f64a: 0x6c800a20, 0x2f64b: 0x6c800c20, - 0x2f64c: 0x6c800e20, 0x2f64d: 0x6c801020, 0x2f64e: 0x6c801220, 0x2f64f: 0x6c801420, - 0x2f650: 0x6c801620, 0x2f651: 0x6c801820, 0x2f652: 0x6c801a20, 0x2f653: 0x6c801c20, - 0x2f654: 0x6c801e20, 0x2f655: 0x6c802020, 0x2f656: 0x6c802220, 0x2f657: 0x6c802420, - 0x2f658: 0x6c802620, 0x2f659: 0x6c802820, 0x2f65a: 0x6c802a20, 0x2f65b: 0x6c802c20, - 0x2f65c: 0x6c802e20, 0x2f65d: 0x6c803020, 0x2f65e: 0x6c803220, 0x2f65f: 0x6c803420, - 0x2f660: 0x6c803620, 0x2f661: 0x6c803820, 0x2f662: 0x6c803a20, 0x2f663: 0x6c803c20, - 0x2f664: 0x6c803e20, 0x2f665: 0x6c804020, 0x2f666: 0x6c804220, 0x2f667: 0x6c804420, - 0x2f668: 0x6ca90c20, 0x2f669: 0x6ca90e20, 0x2f66a: 0x6cd74220, 0x2f66b: 0x6cd74420, - 0x2f66c: 0x6ca91020, 0x2f66d: 0x6ca91220, 0x2f66e: 0x6ca91420, 0x2f66f: 0x6ca91620, - 0x2f670: 0x6ca91820, 0x2f671: 0x6ca91a20, 0x2f672: 0x6ca91c20, 0x2f673: 0x6ca91e20, - 0x2f674: 0x6ca92020, 0x2f675: 0x6ca92220, 0x2f676: 0x6ca92420, 0x2f677: 0x6ca92620, - 0x2f678: 0x6ca92820, 0x2f679: 0x6ca92a20, 0x2f67a: 0x6ca92c20, 0x2f67b: 0x6ca92e20, - 0x2f67c: 0x6ca93020, 0x2f67d: 0x6ca93220, 0x2f67e: 0x6ca93420, 0x2f67f: 0x6ca93620, - // Block 0xbda, offset 0x2f680 - 0x2f680: 0x6ca93820, 0x2f681: 0x6ca93a20, 0x2f682: 0x6ca93c20, 0x2f683: 0x6ca93e20, - 0x2f684: 0x6ca94020, 0x2f685: 0x6ca94220, 0x2f686: 0x6ca94420, 0x2f687: 0x6ca94620, - 0x2f688: 0x6ca94820, 0x2f689: 0x6ca94a20, 0x2f68a: 0x6ca94c20, 0x2f68b: 0x6ca94e20, - 0x2f68c: 0x6ca95020, 0x2f68d: 0x6cd75a20, 0x2f68e: 0x6cd75c20, 0x2f68f: 0x6cd75e20, - 0x2f690: 0x6cd76020, 0x2f691: 0x6cd76220, 0x2f692: 0x6cd76420, 0x2f693: 0x6cd76620, - 0x2f694: 0x6cd76820, 0x2f695: 0x6cd76a20, 0x2f696: 0x6cd76c20, 0x2f697: 0x6cd76e20, - 0x2f698: 0x6cd77020, 0x2f699: 0x6cd77220, 0x2f69a: 0x6cd77420, 0x2f69b: 0x6d061420, - 0x2f69c: 0x6cd77620, 0x2f69d: 0x6cd77820, 0x2f69e: 0x6cd77a20, 0x2f69f: 0x6cd77c20, - 0x2f6a0: 0x6cd77e20, 0x2f6a1: 0x6cd78020, 0x2f6a2: 0x6cd78220, 0x2f6a3: 0x6cd78420, - 0x2f6a4: 0x6cd78620, 0x2f6a5: 0x6cd78820, 0x2f6a6: 0x6cd78a20, 0x2f6a7: 0x6cd78c20, - 0x2f6a8: 0x6cd78e20, 0x2f6a9: 0x6cd79020, 0x2f6aa: 0x6cd79220, 0x2f6ab: 0x6cd79420, - 0x2f6ac: 0x6cd79620, 0x2f6ad: 0x6cd79820, 0x2f6ae: 0x6cd79a20, 0x2f6af: 0x6cd79c20, - 0x2f6b0: 0x6cd79e20, 0x2f6b1: 0x6cd7a020, 0x2f6b2: 0x6cd7a220, 0x2f6b3: 0x6cd7a420, - 0x2f6b4: 0x6cd7a620, 0x2f6b5: 0x6cd7a820, 0x2f6b6: 0x6cd7aa20, 0x2f6b7: 0x6cd7ac20, - 0x2f6b8: 0x6d061620, 0x2f6b9: 0x6d061820, 0x2f6ba: 0x6d061a20, 0x2f6bb: 0x6d061c20, - 0x2f6bc: 0x6d061e20, 0x2f6bd: 0x6d062020, 0x2f6be: 0x6cd80c20, 0x2f6bf: 0x6d062220, - // Block 0xbdb, offset 0x2f6c0 - 0x2f6c0: 0x6d062420, 0x2f6c1: 0x6d062620, 0x2f6c2: 0x6d062820, 0x2f6c3: 0x6d062a20, - 0x2f6c4: 0x6d062c20, 0x2f6c5: 0x6d062e20, 0x2f6c6: 0x6d063020, 0x2f6c7: 0x6d063220, - 0x2f6c8: 0x6d063420, 0x2f6c9: 0x6d063620, 0x2f6ca: 0x6d063820, 0x2f6cb: 0x6d063a20, - 0x2f6cc: 0x6d063c20, 0x2f6cd: 0x6d063e20, 0x2f6ce: 0x6d064020, 0x2f6cf: 0x6d064220, - 0x2f6d0: 0x6d064420, 0x2f6d1: 0x6d064620, 0x2f6d2: 0x6d064820, 0x2f6d3: 0x6d064a20, - 0x2f6d4: 0x6d064c20, 0x2f6d5: 0x6d064e20, 0x2f6d6: 0x6d33b420, 0x2f6d7: 0x6d065020, - 0x2f6d8: 0x6d065220, 0x2f6d9: 0x6d065420, 0x2f6da: 0x6d065620, 0x2f6db: 0x6d065820, - 0x2f6dc: 0x6d33d020, 0x2f6dd: 0x6d33d220, 0x2f6de: 0x6d33d420, 0x2f6df: 0x6d33d620, - 0x2f6e0: 0x6d33d820, 0x2f6e1: 0x6d33da20, 0x2f6e2: 0x6d33dc20, 0x2f6e3: 0x6d33de20, - 0x2f6e4: 0x6d33e020, 0x2f6e5: 0x6d33e220, 0x2f6e6: 0x6d33e420, 0x2f6e7: 0x6d33e620, - 0x2f6e8: 0x6d33e820, 0x2f6e9: 0x6d33ea20, 0x2f6ea: 0x6d33ec20, 0x2f6eb: 0x6d33ee20, - 0x2f6ec: 0x6d33f020, 0x2f6ed: 0x6d33f220, 0x2f6ee: 0x6d33f420, 0x2f6ef: 0x6d33f620, - 0x2f6f0: 0x6d33f820, 0x2f6f1: 0x6d33fa20, 0x2f6f2: 0x6d33fc20, 0x2f6f3: 0x6d33fe20, - 0x2f6f4: 0x6d340020, 0x2f6f5: 0x6d340220, 0x2f6f6: 0x6d340420, 0x2f6f7: 0x6d340620, - 0x2f6f8: 0x6d340820, 0x2f6f9: 0x6d340a20, 0x2f6fa: 0x6d340c20, 0x2f6fb: 0x6d340e20, - 0x2f6fc: 0x6d341020, 0x2f6fd: 0x6d341220, 0x2f6fe: 0x6d341420, 0x2f6ff: 0x6d341620, - // Block 0xbdc, offset 0x2f700 - 0x2f700: 0x6d341820, 0x2f701: 0x6d341a20, 0x2f702: 0x6d341c20, 0x2f703: 0x6d341e20, - 0x2f704: 0x6d342020, 0x2f705: 0x6d342220, 0x2f706: 0x6d342420, 0x2f707: 0x6d342620, - 0x2f708: 0x6d342820, 0x2f709: 0x6d342a20, 0x2f70a: 0x6d342c20, 0x2f70b: 0x6d342e20, - 0x2f70c: 0x6d343020, 0x2f70d: 0x6d343220, 0x2f70e: 0x6d343420, 0x2f70f: 0x6d343620, - 0x2f710: 0x6d33b620, 0x2f711: 0x6d343820, 0x2f712: 0x6d343a20, 0x2f713: 0x6d608820, - 0x2f714: 0x6d343c20, 0x2f715: 0x6d343e20, 0x2f716: 0x6d608a20, 0x2f717: 0x6d608c20, - 0x2f718: 0x6d608e20, 0x2f719: 0x6d609020, 0x2f71a: 0x6d609220, 0x2f71b: 0x6d609420, - 0x2f71c: 0x6d609620, 0x2f71d: 0x6d609820, 0x2f71e: 0x6d609a20, 0x2f71f: 0x6d609c20, - 0x2f720: 0x6d609e20, 0x2f721: 0x6d60a020, 0x2f722: 0x6d60a220, 0x2f723: 0x6d60a420, - 0x2f724: 0x6d60a620, 0x2f725: 0x6d60a820, 0x2f726: 0x6d60aa20, 0x2f727: 0x6d60ac20, - 0x2f728: 0x6d60ae20, 0x2f729: 0x6d60b020, 0x2f72a: 0x6d60b220, 0x2f72b: 0x6d60b420, - 0x2f72c: 0x6d60b620, 0x2f72d: 0x6d60b820, 0x2f72e: 0x6d60ba20, 0x2f72f: 0x6d60bc20, - 0x2f730: 0x6d60be20, 0x2f731: 0x6d60c020, 0x2f732: 0x6d60c220, 0x2f733: 0x6d60c420, - 0x2f734: 0x6d60c620, 0x2f735: 0x6d60c820, 0x2f736: 0x6d60ca20, 0x2f737: 0x6d60cc20, - 0x2f738: 0x6d60ce20, 0x2f739: 0x6d60d020, 0x2f73a: 0x6d60d220, 0x2f73b: 0x6d60d420, - 0x2f73c: 0x6d60d620, 0x2f73d: 0x6d60d820, 0x2f73e: 0x6d60da20, 0x2f73f: 0x6d60dc20, - // Block 0xbdd, offset 0x2f740 - 0x2f740: 0x6d60de20, 0x2f741: 0x6d60e020, 0x2f742: 0x6d60e220, 0x2f743: 0x6d60e420, - 0x2f744: 0x6d60e620, 0x2f745: 0x6d60e820, 0x2f746: 0x6d60ea20, 0x2f747: 0x6d60ec20, - 0x2f748: 0x6d8aba20, 0x2f749: 0x6d8abc20, 0x2f74a: 0x6d8abe20, 0x2f74b: 0x6d8ac020, - 0x2f74c: 0x6d8ac220, 0x2f74d: 0x6d8ac420, 0x2f74e: 0x6d8ac620, 0x2f74f: 0x6d8ac820, - 0x2f750: 0x6d8aca20, 0x2f751: 0x6d8acc20, 0x2f752: 0x6d8ace20, 0x2f753: 0x6d8ad020, - 0x2f754: 0x6d8ad220, 0x2f755: 0x6d8ad420, 0x2f756: 0x6d8ad620, 0x2f757: 0x6d8ad820, - 0x2f758: 0x6d8ada20, 0x2f759: 0x6d8adc20, 0x2f75a: 0x6d8ade20, 0x2f75b: 0x6d8ae020, - 0x2f75c: 0x6d8ae220, 0x2f75d: 0x6d8ae420, 0x2f75e: 0x6d8ae620, 0x2f75f: 0x6d8ae820, - 0x2f760: 0x6d8aea20, 0x2f761: 0x6d8aec20, 0x2f762: 0x6d8aee20, 0x2f763: 0x6d8af020, - 0x2f764: 0x6d8af220, 0x2f765: 0x6d8af420, 0x2f766: 0x6d8af620, 0x2f767: 0x6d8af820, - 0x2f768: 0x6d8afa20, 0x2f769: 0x6daf3420, 0x2f76a: 0x6daf3620, 0x2f76b: 0x6daf3820, - 0x2f76c: 0x6daf3a20, 0x2f76d: 0x6daf3c20, 0x2f76e: 0x6daf3e20, 0x2f76f: 0x6daf4020, - 0x2f770: 0x6daf4220, 0x2f771: 0x6daf4420, 0x2f772: 0x6daf4620, 0x2f773: 0x6daf4820, - 0x2f774: 0x6daf4a20, 0x2f775: 0x6daf4c20, 0x2f776: 0x6daf4e20, 0x2f777: 0x6daf5020, - 0x2f778: 0x6daf5220, 0x2f779: 0x6daf5420, 0x2f77a: 0x6daf5620, 0x2f77b: 0x6daf5820, - 0x2f77c: 0x6daf5a20, 0x2f77d: 0x6daf5c20, 0x2f77e: 0x6daf5e20, 0x2f77f: 0x6daf6020, - // Block 0xbde, offset 0x2f780 - 0x2f780: 0x6daf6220, 0x2f781: 0x6daf6420, 0x2f782: 0x6daf6620, 0x2f783: 0x6daf6820, - 0x2f784: 0x6daf6a20, 0x2f785: 0x6daf6c20, 0x2f786: 0x6daf6e20, 0x2f787: 0x6daf7020, - 0x2f788: 0x6dafea20, 0x2f789: 0x6daf7220, 0x2f78a: 0x6daf7420, 0x2f78b: 0x6de91a20, - 0x2f78c: 0x6daf7620, 0x2f78d: 0x6daf7820, 0x2f78e: 0x6dcecc20, 0x2f78f: 0x6dcece20, - 0x2f790: 0x6dced020, 0x2f791: 0x6dced220, 0x2f792: 0x6dced420, 0x2f793: 0x6dced620, - 0x2f794: 0x6dced820, 0x2f795: 0x6dceda20, 0x2f796: 0x6dcedc20, 0x2f797: 0x6dcede20, - 0x2f798: 0x6dcee020, 0x2f799: 0x6dcee220, 0x2f79a: 0x6dcee420, 0x2f79b: 0x6dcee620, - 0x2f79c: 0x6dcee820, 0x2f79d: 0x6dceea20, 0x2f79e: 0x6dceec20, 0x2f79f: 0x6dceee20, - 0x2f7a0: 0x6dcef020, 0x2f7a1: 0x6dcef220, 0x2f7a2: 0x6dcef420, 0x2f7a3: 0x6dcef620, - 0x2f7a4: 0x6dcef820, 0x2f7a5: 0x6dcefa20, 0x2f7a6: 0x6de91c20, 0x2f7a7: 0x6dcefc20, - 0x2f7a8: 0x6de91e20, 0x2f7a9: 0x6de92020, 0x2f7aa: 0x6de92220, 0x2f7ab: 0x6de92420, - 0x2f7ac: 0x6de92620, 0x2f7ad: 0x6de92820, 0x2f7ae: 0x6de92a20, 0x2f7af: 0x6de92c20, - 0x2f7b0: 0x6de92e20, 0x2f7b1: 0x6dcefe20, 0x2f7b2: 0x6de93020, 0x2f7b3: 0x6de93220, - 0x2f7b4: 0x6de93420, 0x2f7b5: 0x6de93620, 0x2f7b6: 0x6de93820, 0x2f7b7: 0x6de93a20, - 0x2f7b8: 0x6de93c20, 0x2f7b9: 0x6de93e20, 0x2f7ba: 0x6de94020, 0x2f7bb: 0x6dff4220, - 0x2f7bc: 0x6dff4420, 0x2f7bd: 0x6dff4620, 0x2f7be: 0x6dff4820, 0x2f7bf: 0x6dff4a20, - // Block 0xbdf, offset 0x2f7c0 - 0x2f7c0: 0x6dff4c20, 0x2f7c1: 0x6dff4e20, 0x2f7c2: 0x6dff5020, 0x2f7c3: 0x6dff5220, - 0x2f7c4: 0x6e11aa20, 0x2f7c5: 0x6e11ac20, 0x2f7c6: 0x6e11ae20, 0x2f7c7: 0x6e11b020, - 0x2f7c8: 0x6e11b220, 0x2f7c9: 0x6e11b420, 0x2f7ca: 0x6e11b620, 0x2f7cb: 0x6e11b820, - 0x2f7cc: 0x6e11ba20, 0x2f7cd: 0x6e11bc20, 0x2f7ce: 0x6e11be20, 0x2f7cf: 0x6e11c020, - 0x2f7d0: 0x6e11c220, 0x2f7d1: 0x6e200820, 0x2f7d2: 0x6e200a20, 0x2f7d3: 0x6e2b1620, - 0x2f7d4: 0x6e2b1820, 0x2f7d5: 0x6e2b1a20, 0x2f7d6: 0x6e2b1c20, 0x2f7d7: 0x6e339220, - 0x2f7d8: 0x6e399820, 0x2f7d9: 0x6e399a20, 0x2f7da: 0x6e399c20, 0x2f7db: 0x6e399e20, - 0x2f7dc: 0x6e40a620, 0x2f7dd: 0x6e40a820, 0x2f7de: 0x6e445a20, 0x2f7df: 0x6c020020, - 0x2f7e0: 0x6c0a4620, 0x2f7e1: 0x6c141a20, 0x2f7e2: 0x6c141c20, 0x2f7e3: 0x6c141e20, - 0x2f7e4: 0x6c142020, 0x2f7e5: 0x6c142220, 0x2f7e6: 0x6c142420, 0x2f7e7: 0x6c142620, - 0x2f7e8: 0x6c142820, 0x2f7e9: 0x6c142a20, 0x2f7ea: 0x6c142c20, 0x2f7eb: 0x6c142e20, - 0x2f7ec: 0x6c25a020, 0x2f7ed: 0x6c25a220, 0x2f7ee: 0x6c25a420, 0x2f7ef: 0x6c25a620, - 0x2f7f0: 0x6c25a820, 0x2f7f1: 0x6c25aa20, 0x2f7f2: 0x6c25ac20, 0x2f7f3: 0x6c25ae20, - 0x2f7f4: 0x6c25b020, 0x2f7f5: 0x6c25b220, 0x2f7f6: 0x6c259e20, 0x2f7f7: 0x6c25b420, - 0x2f7f8: 0x6c25b620, 0x2f7f9: 0x6c25b820, 0x2f7fa: 0x6c25ba20, 0x2f7fb: 0x6c25bc20, - 0x2f7fc: 0x6c25be20, 0x2f7fd: 0x6c25c020, 0x2f7fe: 0x6c25c220, 0x2f7ff: 0x6c3dd620, - // Block 0xbe0, offset 0x2f800 - 0x2f800: 0x6c3dd820, 0x2f801: 0x6c3dda20, 0x2f802: 0x6c3ddc20, 0x2f803: 0x6c3dde20, - 0x2f804: 0x6c3de020, 0x2f805: 0x6c3de220, 0x2f806: 0x6c3de420, 0x2f807: 0x6c3de620, - 0x2f808: 0x6c3de820, 0x2f809: 0x6c3dea20, 0x2f80a: 0x6c3dec20, 0x2f80b: 0x6c3dee20, - 0x2f80c: 0x6c3df020, 0x2f80d: 0x6c3df220, 0x2f80e: 0x6c3df420, 0x2f80f: 0x6c3df620, - 0x2f810: 0x6c3df820, 0x2f811: 0x6c5c9a20, 0x2f812: 0x6c5c9c20, 0x2f813: 0x6c5c9e20, - 0x2f814: 0x6c5ca020, 0x2f815: 0x6c5ca220, 0x2f816: 0x6c5ca420, 0x2f817: 0x6c5ca620, - 0x2f818: 0x6c5ca820, 0x2f819: 0x6c5caa20, 0x2f81a: 0x6c5cac20, 0x2f81b: 0x6c5cae20, - 0x2f81c: 0x6c5cb020, 0x2f81d: 0x6c5cb220, 0x2f81e: 0x6c5cb420, 0x2f81f: 0x6c5cb620, - 0x2f820: 0x6c809e20, 0x2f821: 0x6c80a020, 0x2f822: 0x6c80a220, 0x2f823: 0x6c80a420, - 0x2f824: 0x6c80a620, 0x2f825: 0x6c80a820, 0x2f826: 0x6c80aa20, 0x2f827: 0x6c80ac20, - 0x2f828: 0x6c80ae20, 0x2f829: 0x6ca9a220, 0x2f82a: 0x6ca9a420, 0x2f82b: 0x6ca9a620, - 0x2f82c: 0x6ca9a820, 0x2f82d: 0x6ca9aa20, 0x2f82e: 0x6ca9ac20, 0x2f82f: 0x6ca9ae20, - 0x2f830: 0x6ca9b020, 0x2f831: 0x6ca9b220, 0x2f832: 0x6ca9b420, 0x2f833: 0x6ca9b620, - 0x2f834: 0x6ca9b820, 0x2f835: 0x6ca9ba20, 0x2f836: 0x6ca9bc20, 0x2f837: 0x6ca9be20, - 0x2f838: 0x6ca9c020, 0x2f839: 0x6ca9c220, 0x2f83a: 0x6ca9c420, 0x2f83b: 0x6ca9c620, - 0x2f83c: 0x6ca9c820, 0x2f83d: 0x6ca9ca20, 0x2f83e: 0x6ca9cc20, 0x2f83f: 0x6ca9ce20, - // Block 0xbe1, offset 0x2f840 - 0x2f840: 0x6ca9d020, 0x2f841: 0x6ca9d220, 0x2f842: 0x6cd81220, 0x2f843: 0x6cd81420, - 0x2f844: 0x6cd81620, 0x2f845: 0x6cd81820, 0x2f846: 0x6cd81a20, 0x2f847: 0x6cd81c20, - 0x2f848: 0x6cd81e20, 0x2f849: 0x6cd82020, 0x2f84a: 0x6cd82220, 0x2f84b: 0x6cd82420, - 0x2f84c: 0x6cd82620, 0x2f84d: 0x6cd82820, 0x2f84e: 0x6cd82a20, 0x2f84f: 0x6cd82c20, - 0x2f850: 0x6cd82e20, 0x2f851: 0x6cd83020, 0x2f852: 0x6cd83220, 0x2f853: 0x6cd83420, - 0x2f854: 0x6cd83620, 0x2f855: 0x6cd83820, 0x2f856: 0x6cd83a20, 0x2f857: 0x6cd83c20, - 0x2f858: 0x6cd83e20, 0x2f859: 0x6d06ce20, 0x2f85a: 0x6d06d020, 0x2f85b: 0x6d06d220, - 0x2f85c: 0x6d06d420, 0x2f85d: 0x6d06d620, 0x2f85e: 0x6d06d820, 0x2f85f: 0x6d06da20, - 0x2f860: 0x6d06dc20, 0x2f861: 0x6d06de20, 0x2f862: 0x6d06e020, 0x2f863: 0x6d06e220, - 0x2f864: 0x6d06e420, 0x2f865: 0x6d34c820, 0x2f866: 0x6d34ca20, 0x2f867: 0x6d34cc20, - 0x2f868: 0x6d34ce20, 0x2f869: 0x6d34d020, 0x2f86a: 0x6d34d220, 0x2f86b: 0x6d34d420, - 0x2f86c: 0x6d618020, 0x2f86d: 0x6d618220, 0x2f86e: 0x6d618420, 0x2f86f: 0x6d618620, - 0x2f870: 0x6d8b9620, 0x2f871: 0x6d8b9820, 0x2f872: 0x6d8b9a20, 0x2f873: 0x6d8b9c20, - 0x2f874: 0x6d8b9e20, 0x2f875: 0x6de9a220, 0x2f876: 0x6c143020, 0x2f877: 0x6c3e0020, - 0x2f878: 0x6c5cc620, 0x2f879: 0x6c80c620, 0x2f87a: 0x6c80c820, 0x2f87b: 0x6ca9ee20, - 0x2f87c: 0x6c80ca20, 0x2f87d: 0x6ca9f020, 0x2f87e: 0x6cd85420, 0x2f87f: 0x6cd85620, - // Block 0xbe2, offset 0x2f880 - 0x2f880: 0x6cd85820, 0x2f881: 0x6d34e420, 0x2f882: 0x6d34e620, 0x2f883: 0x6d8ba820, - 0x2f884: 0x6daff420, 0x2f885: 0x6daff620, 0x2f886: 0x6daff820, 0x2f887: 0x6dcf7c20, - 0x2f888: 0x6dcf7e20, 0x2f889: 0x6dcf8020, 0x2f88a: 0x6de9a420, 0x2f88b: 0x6de9a620, - 0x2f88c: 0x6dff9020, 0x2f88d: 0x6e120220, 0x2f88e: 0x6e203a20, 0x2f88f: 0x6e203c20, - 0x2f890: 0x6e33a620, 0x2f891: 0x6c143420, 0x2f892: 0x6c0a4a20, 0x2f893: 0x6c050420, - 0x2f894: 0x6c3e0420, 0x2f895: 0x6c25dc20, 0x2f896: 0x6c3e0620, 0x2f897: 0x6c3e0820, - 0x2f898: 0x6c5cd620, 0x2f899: 0x6c3e2020, 0x2f89a: 0x6c5cd820, 0x2f89b: 0x6c80d820, - 0x2f89c: 0x6c80da20, 0x2f89d: 0x6c80dc20, 0x2f89e: 0x6c80de20, 0x2f89f: 0x6c80e020, - 0x2f8a0: 0x6c80e220, 0x2f8a1: 0x6c80e420, 0x2f8a2: 0x6c80e620, 0x2f8a3: 0x6caa0020, - 0x2f8a4: 0x6cd86820, 0x2f8a5: 0x6cd86a20, 0x2f8a6: 0x6cd86c20, 0x2f8a7: 0x6d070220, - 0x2f8a8: 0x6d070420, 0x2f8a9: 0x6d070620, 0x2f8aa: 0x6d070820, 0x2f8ab: 0x6d070a20, - 0x2f8ac: 0x6d070c20, 0x2f8ad: 0x6d070e20, 0x2f8ae: 0x6d071020, 0x2f8af: 0x6d350020, - 0x2f8b0: 0x6d350220, 0x2f8b1: 0x6d350420, 0x2f8b2: 0x6d071220, 0x2f8b3: 0x6d350620, - 0x2f8b4: 0x6d350820, 0x2f8b5: 0x6d61a420, 0x2f8b6: 0x6d61a620, 0x2f8b7: 0x6d61a820, - 0x2f8b8: 0x6d61aa20, 0x2f8b9: 0x6d8bbe20, 0x2f8ba: 0x6d8bc020, 0x2f8bb: 0x6d8bc220, - 0x2f8bc: 0x6d8bc420, 0x2f8bd: 0x6db00820, 0x2f8be: 0x6db00a20, 0x2f8bf: 0x6db00c20, - // Block 0xbe3, offset 0x2f8c0 - 0x2f8c0: 0x6dcf8a20, 0x2f8c1: 0x6db00e20, 0x2f8c2: 0x6dcf8e20, 0x2f8c3: 0x6de9b620, - 0x2f8c4: 0x6de9b820, 0x2f8c5: 0x6de9ba20, 0x2f8c6: 0x6de9bc20, 0x2f8c7: 0x6e204020, - 0x2f8c8: 0x6e33b020, 0x2f8c9: 0x6e33b220, 0x2f8ca: 0x6c143a20, 0x2f8cb: 0x6c3e2220, - 0x2f8cc: 0x6c3e2420, 0x2f8cd: 0x6c5cf620, 0x2f8ce: 0x6c5cf820, 0x2f8cf: 0x6c5cfa20, - 0x2f8d0: 0x6c812220, 0x2f8d1: 0x6c5cfc20, 0x2f8d2: 0x6c812a20, 0x2f8d3: 0x6c812c20, - 0x2f8d4: 0x6c812e20, 0x2f8d5: 0x6caa3220, 0x2f8d6: 0x6c813020, 0x2f8d7: 0x6c813220, - 0x2f8d8: 0x6c813420, 0x2f8d9: 0x6c813620, 0x2f8da: 0x6caa3420, 0x2f8db: 0x6caa3620, - 0x2f8dc: 0x6caa3820, 0x2f8dd: 0x6caa3a20, 0x2f8de: 0x6caa3c20, 0x2f8df: 0x6caa3e20, - 0x2f8e0: 0x6cd88820, 0x2f8e1: 0x6cd88a20, 0x2f8e2: 0x6cd88c20, 0x2f8e3: 0x6d074820, - 0x2f8e4: 0x6d074a20, 0x2f8e5: 0x6d074c20, 0x2f8e6: 0x6d074e20, 0x2f8e7: 0x6d075020, - 0x2f8e8: 0x6d075220, 0x2f8e9: 0x6d075420, 0x2f8ea: 0x6d075620, 0x2f8eb: 0x6d353820, - 0x2f8ec: 0x6d61cc20, 0x2f8ed: 0x6d61ce20, 0x2f8ee: 0x6d61d020, 0x2f8ef: 0x6d61d220, - 0x2f8f0: 0x6d61d420, 0x2f8f1: 0x6d8bf620, 0x2f8f2: 0x6d8bf820, 0x2f8f3: 0x6dcfac20, - 0x2f8f4: 0x6dcfae20, 0x2f8f5: 0x6dcfb020, 0x2f8f6: 0x6de9d620, 0x2f8f7: 0x6de9d820, - 0x2f8f8: 0x6de9da20, 0x2f8f9: 0x6de9dc20, 0x2f8fa: 0x6dffa220, 0x2f8fb: 0x6e121020, - 0x2f8fc: 0x6e121220, 0x2f8fd: 0x6c144220, 0x2f8fe: 0x6c5d0c20, 0x2f8ff: 0x6c5d0e20, - // Block 0xbe4, offset 0x2f900 - 0x2f900: 0x6c815a20, 0x2f901: 0x6c815c20, 0x2f902: 0x6c815e20, 0x2f903: 0x6c816020, - 0x2f904: 0x6c816220, 0x2f905: 0x6c816420, 0x2f906: 0x6c816620, 0x2f907: 0x6caa7c20, - 0x2f908: 0x6caa7e20, 0x2f909: 0x6caa8020, 0x2f90a: 0x6caa8220, 0x2f90b: 0x6caa8420, - 0x2f90c: 0x6caa8620, 0x2f90d: 0x6caa8820, 0x2f90e: 0x6caa8a20, 0x2f90f: 0x6caa8c20, - 0x2f910: 0x6caa8e20, 0x2f911: 0x6caa9020, 0x2f912: 0x6caa9220, 0x2f913: 0x6cd8b220, - 0x2f914: 0x6cd8b420, 0x2f915: 0x6cd8b620, 0x2f916: 0x6cd8b820, 0x2f917: 0x6cd8ba20, - 0x2f918: 0x6cd8bc20, 0x2f919: 0x6cd8be20, 0x2f91a: 0x6cd8c020, 0x2f91b: 0x6d078420, - 0x2f91c: 0x6d078620, 0x2f91d: 0x6d078820, 0x2f91e: 0x6d355a20, 0x2f91f: 0x6d355c20, - 0x2f920: 0x6d355e20, 0x2f921: 0x6d356020, 0x2f922: 0x6d356220, 0x2f923: 0x6d356420, - 0x2f924: 0x6d356620, 0x2f925: 0x6d358c20, 0x2f926: 0x6d61f620, 0x2f927: 0x6d61f820, - 0x2f928: 0x6d61fa20, 0x2f929: 0x6d61fc20, 0x2f92a: 0x6d61fe20, 0x2f92b: 0x6d620020, - 0x2f92c: 0x6d620220, 0x2f92d: 0x6d620420, 0x2f92e: 0x6d8c1020, 0x2f92f: 0x6d8c1220, - 0x2f930: 0x6d8c1420, 0x2f931: 0x6d8c1620, 0x2f932: 0x6db05020, 0x2f933: 0x6db05220, - 0x2f934: 0x6db05420, 0x2f935: 0x6db05620, 0x2f936: 0x6db05820, 0x2f937: 0x6dcfde20, - 0x2f938: 0x6dcfe020, 0x2f939: 0x6dcfe220, 0x2f93a: 0x6dcfe420, 0x2f93b: 0x6dcfe620, - 0x2f93c: 0x6db05a20, 0x2f93d: 0x6de9ec20, 0x2f93e: 0x6de9ee20, 0x2f93f: 0x6dffb420, - // Block 0xbe5, offset 0x2f940 - 0x2f940: 0x6dffb620, 0x2f941: 0x6c144420, 0x2f942: 0x6c050620, 0x2f943: 0x6c144620, - 0x2f944: 0x6c819020, 0x2f945: 0x6c3e3620, 0x2f946: 0x6c819220, 0x2f947: 0x6c5d3820, - 0x2f948: 0x6caab220, 0x2f949: 0x6caab420, 0x2f94a: 0x6c81a420, 0x2f94b: 0x6cd8f820, - 0x2f94c: 0x6c144820, 0x2f94d: 0x6c5d3e20, 0x2f94e: 0x6c5d4020, 0x2f94f: 0x6c5d4220, - 0x2f950: 0x6c5d4420, 0x2f951: 0x6c5d4620, 0x2f952: 0x6c144c20, 0x2f953: 0x6c3e3e20, - 0x2f954: 0x6c5d4a20, 0x2f955: 0x6c81aa20, 0x2f956: 0x6c81ac20, 0x2f957: 0x6c81ae20, - 0x2f958: 0x6c81b020, 0x2f959: 0x6c81b220, 0x2f95a: 0x6caabc20, 0x2f95b: 0x6caabe20, - 0x2f95c: 0x6caac020, 0x2f95d: 0x6caac220, 0x2f95e: 0x6caac420, 0x2f95f: 0x6caac620, - 0x2f960: 0x6cd8fe20, 0x2f961: 0x6d07b420, 0x2f962: 0x6d07b620, 0x2f963: 0x6d359e20, - 0x2f964: 0x6d35a020, 0x2f965: 0x6d35a220, 0x2f966: 0x6d625020, 0x2f967: 0x6d625220, - 0x2f968: 0x6d8c4a20, 0x2f969: 0x6d8c4c20, 0x2f96a: 0x6d8c4e20, 0x2f96b: 0x6db08420, - 0x2f96c: 0x6db08620, 0x2f96d: 0x6dd01220, 0x2f96e: 0x6dd01420, 0x2f96f: 0x6dffc420, - 0x2f970: 0x6e122e20, 0x2f971: 0x6e205820, 0x2f972: 0x6e205a20, 0x2f973: 0x6c145020, - 0x2f974: 0x6c25e620, 0x2f975: 0x6c3e4620, 0x2f976: 0x6c5d5220, 0x2f977: 0x6c5d5420, - 0x2f978: 0x6c81ba20, 0x2f979: 0x6c81bc20, 0x2f97a: 0x6c81be20, 0x2f97b: 0x6c81c020, - 0x2f97c: 0x6c81c220, 0x2f97d: 0x6c81c420, 0x2f97e: 0x6c81c620, 0x2f97f: 0x6c81c820, - // Block 0xbe6, offset 0x2f980 - 0x2f980: 0x6c81ca20, 0x2f981: 0x6c81cc20, 0x2f982: 0x6c81ce20, 0x2f983: 0x6caad420, - 0x2f984: 0x6caad620, 0x2f985: 0x6caad820, 0x2f986: 0x6caada20, 0x2f987: 0x6caadc20, - 0x2f988: 0x6caade20, 0x2f989: 0x6caae020, 0x2f98a: 0x6caae220, 0x2f98b: 0x6caae420, - 0x2f98c: 0x6caae620, 0x2f98d: 0x6caae820, 0x2f98e: 0x6cd91020, 0x2f98f: 0x6cd91220, - 0x2f990: 0x6cd91420, 0x2f991: 0x6cd91620, 0x2f992: 0x6cd91820, 0x2f993: 0x6cd91a20, - 0x2f994: 0x6cd91c20, 0x2f995: 0x6d07c420, 0x2f996: 0x6d07c620, 0x2f997: 0x6d07c820, - 0x2f998: 0x6d07ca20, 0x2f999: 0x6d35c420, 0x2f99a: 0x6d35c620, 0x2f99b: 0x6d35c820, - 0x2f99c: 0x6d35ca20, 0x2f99d: 0x6d35cc20, 0x2f99e: 0x6d35ce20, 0x2f99f: 0x6d35d020, - 0x2f9a0: 0x6cd91e20, 0x2f9a1: 0x6d35d220, 0x2f9a2: 0x6d35d420, 0x2f9a3: 0x6d35d620, - 0x2f9a4: 0x6d626c20, 0x2f9a5: 0x6d626e20, 0x2f9a6: 0x6d627020, 0x2f9a7: 0x6d627220, - 0x2f9a8: 0x6d627420, 0x2f9a9: 0x6d627620, 0x2f9aa: 0x6d627820, 0x2f9ab: 0x6d627a20, - 0x2f9ac: 0x6d8c6820, 0x2f9ad: 0x6d8c6a20, 0x2f9ae: 0x6d8c9a20, 0x2f9af: 0x6db0a020, - 0x2f9b0: 0x6db0a220, 0x2f9b1: 0x6db0a420, 0x2f9b2: 0x6db0a620, 0x2f9b3: 0x6db0a820, - 0x2f9b4: 0x6db0cc20, 0x2f9b5: 0x6dd02c20, 0x2f9b6: 0x6dd02e20, 0x2f9b7: 0x6dd03020, - 0x2f9b8: 0x6dea0220, 0x2f9b9: 0x6dffc820, 0x2f9ba: 0x6dffca20, 0x2f9bb: 0x6dffcc20, - 0x2f9bc: 0x6dffce20, 0x2f9bd: 0x6e205e20, 0x2f9be: 0x6e206020, 0x2f9bf: 0x6c145220, - // Block 0xbe7, offset 0x2f9c0 - 0x2f9c0: 0x6c050820, 0x2f9c1: 0x6c81fa20, 0x2f9c2: 0x6c81fc20, 0x2f9c3: 0x6c3e5e20, - 0x2f9c4: 0x6d07fe20, 0x2f9c5: 0x6d080020, 0x2f9c6: 0x6d080220, 0x2f9c7: 0x6d360e20, - 0x2f9c8: 0x6d361020, 0x2f9c9: 0x6c145620, 0x2f9ca: 0x6c0a5420, 0x2f9cb: 0x6c145c20, - 0x2f9cc: 0x6c145e20, 0x2f9cd: 0x6c146020, 0x2f9ce: 0x6c146220, 0x2f9cf: 0x6c3e6020, - 0x2f9d0: 0x6c25ee20, 0x2f9d1: 0x6c25f020, 0x2f9d2: 0x6c25f220, 0x2f9d3: 0x6c25f420, - 0x2f9d4: 0x6c25f620, 0x2f9d5: 0x6c25f820, 0x2f9d6: 0x6c25fa20, 0x2f9d7: 0x6c25fc20, - 0x2f9d8: 0x6c25fe20, 0x2f9d9: 0x6c260020, 0x2f9da: 0x6c260220, 0x2f9db: 0x6c260420, - 0x2f9dc: 0x6c260620, 0x2f9dd: 0x6c260820, 0x2f9de: 0x6c260a20, 0x2f9df: 0x6c260c20, - 0x2f9e0: 0x6c260e20, 0x2f9e1: 0x6c3e7c20, 0x2f9e2: 0x6c3e7e20, 0x2f9e3: 0x6c3e8020, - 0x2f9e4: 0x6c3e8220, 0x2f9e5: 0x6c3e8420, 0x2f9e6: 0x6c3e8620, 0x2f9e7: 0x6c3e8820, - 0x2f9e8: 0x6c3e8a20, 0x2f9e9: 0x6c3e8c20, 0x2f9ea: 0x6c3e8e20, 0x2f9eb: 0x6c3e9020, - 0x2f9ec: 0x6c3e9220, 0x2f9ed: 0x6c3e9420, 0x2f9ee: 0x6c3e9620, 0x2f9ef: 0x6c3e9820, - 0x2f9f0: 0x6c3e9a20, 0x2f9f1: 0x6c3e9c20, 0x2f9f2: 0x6c3e9e20, 0x2f9f3: 0x6c3ea020, - 0x2f9f4: 0x6c3ea220, 0x2f9f5: 0x6c3ea420, 0x2f9f6: 0x6c3ea620, 0x2f9f7: 0x6c3ea820, - 0x2f9f8: 0x6c3eaa20, 0x2f9f9: 0x6c3eac20, 0x2f9fa: 0x6c3eae20, 0x2f9fb: 0x6c3eb020, - 0x2f9fc: 0x6c3eb220, 0x2f9fd: 0x6c3eb420, 0x2f9fe: 0x6c3eb620, 0x2f9ff: 0x6c3eb820, - // Block 0xbe8, offset 0x2fa00 - 0x2fa00: 0x6c3eba20, 0x2fa01: 0x6c3ebc20, 0x2fa02: 0x6c5d7220, 0x2fa03: 0x6c5d7420, - 0x2fa04: 0x6c5d7620, 0x2fa05: 0x6c5d7820, 0x2fa06: 0x6c5d7a20, 0x2fa07: 0x6c5d7c20, - 0x2fa08: 0x6c5d7e20, 0x2fa09: 0x6c5d8020, 0x2fa0a: 0x6c5d8220, 0x2fa0b: 0x6c5d8420, - 0x2fa0c: 0x6c5d8620, 0x2fa0d: 0x6c5d8820, 0x2fa0e: 0x6c5d8a20, 0x2fa0f: 0x6c5d8c20, - 0x2fa10: 0x6c5d8e20, 0x2fa11: 0x6c5d9020, 0x2fa12: 0x6c5d9220, 0x2fa13: 0x6c5d9420, - 0x2fa14: 0x6cd95220, 0x2fa15: 0x6c5d9620, 0x2fa16: 0x6c5d9820, 0x2fa17: 0x6c5d9a20, - 0x2fa18: 0x6c5d9c20, 0x2fa19: 0x6c5d9e20, 0x2fa1a: 0x6c5da020, 0x2fa1b: 0x6c5da220, - 0x2fa1c: 0x6c5da420, 0x2fa1d: 0x6c5da620, 0x2fa1e: 0x6c5da820, 0x2fa1f: 0x6c5daa20, - 0x2fa20: 0x6c5dac20, 0x2fa21: 0x6c5dae20, 0x2fa22: 0x6c5db020, 0x2fa23: 0x6c5db220, - 0x2fa24: 0x6c5db420, 0x2fa25: 0x6c5db620, 0x2fa26: 0x6c5db820, 0x2fa27: 0x6c5dba20, - 0x2fa28: 0x6c5dbc20, 0x2fa29: 0x6c5dbe20, 0x2fa2a: 0x6c5dc020, 0x2fa2b: 0x6c5dc220, - 0x2fa2c: 0x6cab1020, 0x2fa2d: 0x6c821220, 0x2fa2e: 0x6c821420, 0x2fa2f: 0x6c821620, - 0x2fa30: 0x6c821820, 0x2fa31: 0x6c821a20, 0x2fa32: 0x6c821c20, 0x2fa33: 0x6c821e20, - 0x2fa34: 0x6c822020, 0x2fa35: 0x6c822220, 0x2fa36: 0x6c822420, 0x2fa37: 0x6c822620, - 0x2fa38: 0x6c822820, 0x2fa39: 0x6c822a20, 0x2fa3a: 0x6c822c20, 0x2fa3b: 0x6c822e20, - 0x2fa3c: 0x6c823020, 0x2fa3d: 0x6c823220, 0x2fa3e: 0x6cd95420, 0x2fa3f: 0x6c823420, - // Block 0xbe9, offset 0x2fa40 - 0x2fa40: 0x6c823620, 0x2fa41: 0x6c823820, 0x2fa42: 0x6c823a20, 0x2fa43: 0x6c823c20, - 0x2fa44: 0x6c823e20, 0x2fa45: 0x6c824020, 0x2fa46: 0x6c824220, 0x2fa47: 0x6c824420, - 0x2fa48: 0x6c824620, 0x2fa49: 0x6c5dc420, 0x2fa4a: 0x6c824820, 0x2fa4b: 0x6c824a20, - 0x2fa4c: 0x6c824c20, 0x2fa4d: 0x6c824e20, 0x2fa4e: 0x6c825020, 0x2fa4f: 0x6c825220, - 0x2fa50: 0x6c825420, 0x2fa51: 0x6c825620, 0x2fa52: 0x6c825820, 0x2fa53: 0x6c825a20, - 0x2fa54: 0x6cd95620, 0x2fa55: 0x6cab2c20, 0x2fa56: 0x6cab2e20, 0x2fa57: 0x6cab3020, - 0x2fa58: 0x6cab3220, 0x2fa59: 0x6cab3420, 0x2fa5a: 0x6cab3620, 0x2fa5b: 0x6cab3820, - 0x2fa5c: 0x6cab3a20, 0x2fa5d: 0x6cab3c20, 0x2fa5e: 0x6cab3e20, 0x2fa5f: 0x6cab4020, - 0x2fa60: 0x6cd95820, 0x2fa61: 0x6cab4220, 0x2fa62: 0x6cab4420, 0x2fa63: 0x6cab4620, - 0x2fa64: 0x6cab4820, 0x2fa65: 0x6cab4a20, 0x2fa66: 0x6cab4c20, 0x2fa67: 0x6cab4e20, - 0x2fa68: 0x6cab5020, 0x2fa69: 0x6cab5220, 0x2fa6a: 0x6cab5420, 0x2fa6b: 0x6cab5620, - 0x2fa6c: 0x6cab5820, 0x2fa6d: 0x6cab5a20, 0x2fa6e: 0x6cab5c20, 0x2fa6f: 0x6cab5e20, - 0x2fa70: 0x6cab6020, 0x2fa71: 0x6cab6220, 0x2fa72: 0x6cab6420, 0x2fa73: 0x6cab6620, - 0x2fa74: 0x6cab6820, 0x2fa75: 0x6cab6a20, 0x2fa76: 0x6cab6c20, 0x2fa77: 0x6cab6e20, - 0x2fa78: 0x6cab7020, 0x2fa79: 0x6cd97e20, 0x2fa7a: 0x6cd98020, 0x2fa7b: 0x6cd98220, - 0x2fa7c: 0x6cd98420, 0x2fa7d: 0x6cd98620, 0x2fa7e: 0x6cd98820, 0x2fa7f: 0x6cd98a20, - // Block 0xbea, offset 0x2fa80 - 0x2fa80: 0x6cd98c20, 0x2fa81: 0x6cd98e20, 0x2fa82: 0x6cd99020, 0x2fa83: 0x6cd99220, - 0x2fa84: 0x6cd99420, 0x2fa85: 0x6cd99620, 0x2fa86: 0x6cd99820, 0x2fa87: 0x6cd99a20, - 0x2fa88: 0x6cd99c20, 0x2fa89: 0x6cd99e20, 0x2fa8a: 0x6cd9a020, 0x2fa8b: 0x6cd9a220, - 0x2fa8c: 0x6cd9a420, 0x2fa8d: 0x6cd9a620, 0x2fa8e: 0x6cd9a820, 0x2fa8f: 0x6cd9aa20, - 0x2fa90: 0x6d361a20, 0x2fa91: 0x6cd9ac20, 0x2fa92: 0x6cd9ae20, 0x2fa93: 0x6cd9b020, - 0x2fa94: 0x6cd9b220, 0x2fa95: 0x6cd9b420, 0x2fa96: 0x6cd9b620, 0x2fa97: 0x6cd9b820, - 0x2fa98: 0x6cd9ba20, 0x2fa99: 0x6cd9bc20, 0x2fa9a: 0x6cd9be20, 0x2fa9b: 0x6d082a20, - 0x2fa9c: 0x6d082c20, 0x2fa9d: 0x6d082e20, 0x2fa9e: 0x6d083020, 0x2fa9f: 0x6d083220, - 0x2faa0: 0x6d083420, 0x2faa1: 0x6d083620, 0x2faa2: 0x6d083820, 0x2faa3: 0x6d083a20, - 0x2faa4: 0x6d083c20, 0x2faa5: 0x6d083e20, 0x2faa6: 0x6d084020, 0x2faa7: 0x6d084220, - 0x2faa8: 0x6d084420, 0x2faa9: 0x6d084620, 0x2faaa: 0x6d084820, 0x2faab: 0x6d084a20, - 0x2faac: 0x6d084c20, 0x2faad: 0x6d084e20, 0x2faae: 0x6d085020, 0x2faaf: 0x6d085220, - 0x2fab0: 0x6d085420, 0x2fab1: 0x6d085620, 0x2fab2: 0x6d085820, 0x2fab3: 0x6d085a20, - 0x2fab4: 0x6cda6e20, 0x2fab5: 0x6d085c20, 0x2fab6: 0x6d085e20, 0x2fab7: 0x6d086020, - 0x2fab8: 0x6d086220, 0x2fab9: 0x6d086420, 0x2faba: 0x6d086620, 0x2fabb: 0x6d086820, - 0x2fabc: 0x6d086a20, 0x2fabd: 0x6d086c20, 0x2fabe: 0x6d086e20, 0x2fabf: 0x6d363820, - // Block 0xbeb, offset 0x2fac0 - 0x2fac0: 0x6d363a20, 0x2fac1: 0x6d363c20, 0x2fac2: 0x6d363e20, 0x2fac3: 0x6d364020, - 0x2fac4: 0x6d364220, 0x2fac5: 0x6d364420, 0x2fac6: 0x6d364620, 0x2fac7: 0x6d364820, - 0x2fac8: 0x6d364a20, 0x2fac9: 0x6d364c20, 0x2faca: 0x6d364e20, 0x2facb: 0x6d365020, - 0x2facc: 0x6d365220, 0x2facd: 0x6d365420, 0x2face: 0x6d365620, 0x2facf: 0x6d365820, - 0x2fad0: 0x6d8ca020, 0x2fad1: 0x6d365a20, 0x2fad2: 0x6d62d020, 0x2fad3: 0x6d62d220, - 0x2fad4: 0x6d62d420, 0x2fad5: 0x6d62d620, 0x2fad6: 0x6d62d820, 0x2fad7: 0x6d62da20, - 0x2fad8: 0x6d62dc20, 0x2fad9: 0x6d62de20, 0x2fada: 0x6d62e020, 0x2fadb: 0x6d62e220, - 0x2fadc: 0x6d62e420, 0x2fadd: 0x6d62e620, 0x2fade: 0x6d62e820, 0x2fadf: 0x6d62ea20, - 0x2fae0: 0x6d62ec20, 0x2fae1: 0x6d62ee20, 0x2fae2: 0x6d62f020, 0x2fae3: 0x6d62f220, - 0x2fae4: 0x6d538620, 0x2fae5: 0x6db0d420, 0x2fae6: 0x6d8cb420, 0x2fae7: 0x6d8cb620, - 0x2fae8: 0x6d8cb820, 0x2fae9: 0x6d8cba20, 0x2faea: 0x6d8cbc20, 0x2faeb: 0x6d8cbe20, - 0x2faec: 0x6d8cc020, 0x2faed: 0x6d8cc220, 0x2faee: 0x6d8cc420, 0x2faef: 0x6d8cc620, - 0x2faf0: 0x6d8cc820, 0x2faf1: 0x6d8cca20, 0x2faf2: 0x6d8ccc20, 0x2faf3: 0x6d8cce20, - 0x2faf4: 0x6d8cd020, 0x2faf5: 0x6d8cd220, 0x2faf6: 0x6d8cd420, 0x2faf7: 0x6d8d5820, - 0x2faf8: 0x6db0de20, 0x2faf9: 0x6d8d5a20, 0x2fafa: 0x6db0e020, 0x2fafb: 0x6db0e220, - 0x2fafc: 0x6db0e420, 0x2fafd: 0x6db0e620, 0x2fafe: 0x6db0e820, 0x2faff: 0x6db0ea20, - // Block 0xbec, offset 0x2fb00 - 0x2fb00: 0x6db0ec20, 0x2fb01: 0x6db0ee20, 0x2fb02: 0x6db0f020, 0x2fb03: 0x6db0f220, - 0x2fb04: 0x6db0f420, 0x2fb05: 0x6db0f620, 0x2fb06: 0x6db0f820, 0x2fb07: 0x6db0fa20, - 0x2fb08: 0x6db0fc20, 0x2fb09: 0x6db0fe20, 0x2fb0a: 0x6db10020, 0x2fb0b: 0x6dea1e20, - 0x2fb0c: 0x6db10220, 0x2fb0d: 0x6dd06620, 0x2fb0e: 0x6dd06820, 0x2fb0f: 0x6dd06a20, - 0x2fb10: 0x6dd06c20, 0x2fb11: 0x6dd06e20, 0x2fb12: 0x6dd07020, 0x2fb13: 0x6dd07220, - 0x2fb14: 0x6dea2620, 0x2fb15: 0x6dea2820, 0x2fb16: 0x6dffe420, 0x2fb17: 0x6dea2a20, - 0x2fb18: 0x6dea2c20, 0x2fb19: 0x6dffe620, 0x2fb1a: 0x6dffe820, 0x2fb1b: 0x6dffea20, - 0x2fb1c: 0x6dffec20, 0x2fb1d: 0x6e124820, 0x2fb1e: 0x6e206a20, 0x2fb1f: 0x6e206c20, - 0x2fb20: 0x6e39ae20, 0x2fb21: 0x6e39b020, 0x2fb22: 0x6e2b4820, 0x2fb23: 0x6c147a20, - 0x2fb24: 0x6c3f1a20, 0x2fb25: 0x6c3f1c20, 0x2fb26: 0x6cda7020, 0x2fb27: 0x6d36e420, - 0x2fb28: 0x6db16420, 0x2fb29: 0x6db16620, 0x2fb2a: 0x6c147e20, 0x2fb2b: 0x6c262820, - 0x2fb2c: 0x6c82dc20, 0x2fb2d: 0x6c82de20, 0x2fb2e: 0x6cda7c20, 0x2fb2f: 0x6cda7e20, - 0x2fb30: 0x6cda8020, 0x2fb31: 0x6d635a20, 0x2fb32: 0x6d8d5e20, 0x2fb33: 0x6c148220, - 0x2fb34: 0x6c5e4220, 0x2fb35: 0x6cda8c20, 0x2fb36: 0x6cda8e20, 0x2fb37: 0x6cda9020, - 0x2fb38: 0x6cda9220, 0x2fb39: 0x6cda9820, 0x2fb3a: 0x6d36f420, 0x2fb3b: 0x6d8d6620, - 0x2fb3c: 0x6c148820, 0x2fb3d: 0x6c3f2220, 0x2fb3e: 0x6c3f2420, 0x2fb3f: 0x6c5e4a20, - // Block 0xbed, offset 0x2fb40 - 0x2fb40: 0x6c82fc20, 0x2fb41: 0x6c82fe20, 0x2fb42: 0x6cabf420, 0x2fb43: 0x6cda9a20, - 0x2fb44: 0x6cda9c20, 0x2fb45: 0x6d090220, 0x2fb46: 0x6d8d7620, 0x2fb47: 0x6d370220, - 0x2fb48: 0x6d8d7220, 0x2fb49: 0x6d8d7820, 0x2fb4a: 0x6dd0c020, 0x2fb4b: 0x6dea7220, - 0x2fb4c: 0x6c149020, 0x2fb4d: 0x6c3f2c20, 0x2fb4e: 0x6c3f2e20, 0x2fb4f: 0x6c3f3020, - 0x2fb50: 0x6c831420, 0x2fb51: 0x6cac0620, 0x2fb52: 0x6cdaac20, 0x2fb53: 0x6d371820, - 0x2fb54: 0x6d371a20, 0x2fb55: 0x6d371c20, 0x2fb56: 0x6d638820, 0x2fb57: 0x6d638a20, - 0x2fb58: 0x6d8d8a20, 0x2fb59: 0x6dd0d220, 0x2fb5a: 0x6dea8020, 0x2fb5b: 0x6c149220, - 0x2fb5c: 0x6cdabe20, 0x2fb5d: 0x6d091c20, 0x2fb5e: 0x6d373020, 0x2fb5f: 0x6c149420, - 0x2fb60: 0x6c3f3620, 0x2fb61: 0x6c5e6020, 0x2fb62: 0x6c5e6220, 0x2fb63: 0x6c5e6420, - 0x2fb64: 0x6c5e6620, 0x2fb65: 0x6c832c20, 0x2fb66: 0x6c832e20, 0x2fb67: 0x6c833020, - 0x2fb68: 0x6c833220, 0x2fb69: 0x6c833420, 0x2fb6a: 0x6c833620, 0x2fb6b: 0x6c833820, - 0x2fb6c: 0x6c833a20, 0x2fb6d: 0x6c833c20, 0x2fb6e: 0x6c833e20, 0x2fb6f: 0x6c834020, - 0x2fb70: 0x6c834220, 0x2fb71: 0x6c834420, 0x2fb72: 0x6cac1820, 0x2fb73: 0x6cac1a20, - 0x2fb74: 0x6cac1c20, 0x2fb75: 0x6cac1e20, 0x2fb76: 0x6cac2020, 0x2fb77: 0x6cac2220, - 0x2fb78: 0x6cac2420, 0x2fb79: 0x6cac2620, 0x2fb7a: 0x6cac2820, 0x2fb7b: 0x6cac2a20, - 0x2fb7c: 0x6cdaca20, 0x2fb7d: 0x6cdacc20, 0x2fb7e: 0x6cdace20, 0x2fb7f: 0x6cdad020, - // Block 0xbee, offset 0x2fb80 - 0x2fb80: 0x6d092220, 0x2fb81: 0x6d092420, 0x2fb82: 0x6d092620, 0x2fb83: 0x6d092820, - 0x2fb84: 0x6d092a20, 0x2fb85: 0x6d092c20, 0x2fb86: 0x6d092e20, 0x2fb87: 0x6d093020, - 0x2fb88: 0x6d093220, 0x2fb89: 0x6d093420, 0x2fb8a: 0x6d374220, 0x2fb8b: 0x6d374420, - 0x2fb8c: 0x6d374620, 0x2fb8d: 0x6d374820, 0x2fb8e: 0x6d63a220, 0x2fb8f: 0x6d63a420, - 0x2fb90: 0x6d63a620, 0x2fb91: 0x6d63a820, 0x2fb92: 0x6d63aa20, 0x2fb93: 0x6d63ac20, - 0x2fb94: 0x6d63ae20, 0x2fb95: 0x6d8d9e20, 0x2fb96: 0x6d8da020, 0x2fb97: 0x6d8da220, - 0x2fb98: 0x6d8da420, 0x2fb99: 0x6d8da620, 0x2fb9a: 0x6db19c20, 0x2fb9b: 0x6db19e20, - 0x2fb9c: 0x6db1a020, 0x2fb9d: 0x6db1a220, 0x2fb9e: 0x6dd0e220, 0x2fb9f: 0x6dd0e420, - 0x2fba0: 0x6dd0e620, 0x2fba1: 0x6dea8620, 0x2fba2: 0x6dea8820, 0x2fba3: 0x6dea8a20, - 0x2fba4: 0x6dea8c20, 0x2fba5: 0x6dea8e20, 0x2fba6: 0x6e003620, 0x2fba7: 0x6e003820, - 0x2fba8: 0x6e003a20, 0x2fba9: 0x6e003c20, 0x2fbaa: 0x6e126c20, 0x2fbab: 0x6e208820, - 0x2fbac: 0x6e2b6e20, 0x2fbad: 0x6e33e220, 0x2fbae: 0x6c149820, 0x2fbaf: 0x6c263620, - 0x2fbb0: 0x6c3f4420, 0x2fbb1: 0x6db1bc20, 0x2fbb2: 0x6c149a20, 0x2fbb3: 0x6c835e20, - 0x2fbb4: 0x6cac4e20, 0x2fbb5: 0x6cdaf020, 0x2fbb6: 0x6deaa220, 0x2fbb7: 0x6e33e420, - 0x2fbb8: 0x6c149e20, 0x2fbb9: 0x6c020420, 0x2fbba: 0x6c0a5620, 0x2fbbb: 0x6c14a020, - 0x2fbbc: 0x6c14a220, 0x2fbbd: 0x6c14a420, 0x2fbbe: 0x6c14a620, 0x2fbbf: 0x6c14a820, - // Block 0xbef, offset 0x2fbc0 - 0x2fbc0: 0x6c14aa20, 0x2fbc1: 0x6c14ac20, 0x2fbc2: 0x6c14ae20, 0x2fbc3: 0x6c263820, - 0x2fbc4: 0x6c263a20, 0x2fbc5: 0x6c263c20, 0x2fbc6: 0x6c263e20, 0x2fbc7: 0x6c264020, - 0x2fbc8: 0x6c264220, 0x2fbc9: 0x6c264420, 0x2fbca: 0x6c264620, 0x2fbcb: 0x6c264820, - 0x2fbcc: 0x6c264a20, 0x2fbcd: 0x6c264c20, 0x2fbce: 0x6c264e20, 0x2fbcf: 0x6c265020, - 0x2fbd0: 0x6c265220, 0x2fbd1: 0x6c265420, 0x2fbd2: 0x6c265620, 0x2fbd3: 0x6c265820, - 0x2fbd4: 0x6c5e8820, 0x2fbd5: 0x6c265a20, 0x2fbd6: 0x6c265c20, 0x2fbd7: 0x6c265e20, - 0x2fbd8: 0x6c3f4c20, 0x2fbd9: 0x6c3f4e20, 0x2fbda: 0x6c3f5020, 0x2fbdb: 0x6c3f5220, - 0x2fbdc: 0x6c3f5420, 0x2fbdd: 0x6c3f5620, 0x2fbde: 0x6c3f5820, 0x2fbdf: 0x6c3f5a20, - 0x2fbe0: 0x6c3f5c20, 0x2fbe1: 0x6c3f5e20, 0x2fbe2: 0x6c3f6020, 0x2fbe3: 0x6c3f6220, - 0x2fbe4: 0x6c3f6420, 0x2fbe5: 0x6c3f6620, 0x2fbe6: 0x6c3f6820, 0x2fbe7: 0x6c3f6a20, - 0x2fbe8: 0x6c3f6c20, 0x2fbe9: 0x6c3f6e20, 0x2fbea: 0x6c3f7020, 0x2fbeb: 0x6c3f7220, - 0x2fbec: 0x6c3f7420, 0x2fbed: 0x6c3f7620, 0x2fbee: 0x6c3f7820, 0x2fbef: 0x6c3f7a20, - 0x2fbf0: 0x6c3f7c20, 0x2fbf1: 0x6c3f7e20, 0x2fbf2: 0x6c3f8020, 0x2fbf3: 0x6c3f8220, - 0x2fbf4: 0x6c3f8420, 0x2fbf5: 0x6c3f8620, 0x2fbf6: 0x6c3f8820, 0x2fbf7: 0x6c3f8a20, - 0x2fbf8: 0x6c3f8c20, 0x2fbf9: 0x6c3f8e20, 0x2fbfa: 0x6c3f9020, 0x2fbfb: 0x6c837820, - 0x2fbfc: 0x6c3f9220, 0x2fbfd: 0x6c3f9420, 0x2fbfe: 0x6c3f9620, 0x2fbff: 0x6c400c20, - // Block 0xbf0, offset 0x2fc00 - 0x2fc00: 0x6c3f9820, 0x2fc01: 0x6c3f9a20, 0x2fc02: 0x6c3f9c20, 0x2fc03: 0x6c3f9e20, - 0x2fc04: 0x6c3fa020, 0x2fc05: 0x6c3fa220, 0x2fc06: 0x6c3fa420, 0x2fc07: 0x6c3fa620, - 0x2fc08: 0x6c3fa820, 0x2fc09: 0x6c3faa20, 0x2fc0a: 0x6c3fac20, 0x2fc0b: 0x6c3fae20, - 0x2fc0c: 0x6c3fb020, 0x2fc0d: 0x6c3fb220, 0x2fc0e: 0x6c3fb420, 0x2fc0f: 0x6c3fb620, - 0x2fc10: 0x6c5e8a20, 0x2fc11: 0x6c5e8c20, 0x2fc12: 0x6c5e8e20, 0x2fc13: 0x6c5e9020, - 0x2fc14: 0x6c5e9220, 0x2fc15: 0x6c5e9420, 0x2fc16: 0x6c5e9620, 0x2fc17: 0x6c5e9820, - 0x2fc18: 0x6c5e9a20, 0x2fc19: 0x6c5e9c20, 0x2fc1a: 0x6c5e9e20, 0x2fc1b: 0x6c5ea020, - 0x2fc1c: 0x6c5ea220, 0x2fc1d: 0x6c5ea420, 0x2fc1e: 0x6c5ea620, 0x2fc1f: 0x6c5ea820, - 0x2fc20: 0x6c5eaa20, 0x2fc21: 0x6c5eac20, 0x2fc22: 0x6c5eae20, 0x2fc23: 0x6c5eb020, - 0x2fc24: 0x6c5eb220, 0x2fc25: 0x6c5eb420, 0x2fc26: 0x6c5eb620, 0x2fc27: 0x6c5eb820, - 0x2fc28: 0x6c5eba20, 0x2fc29: 0x6c5ebc20, 0x2fc2a: 0x6c5ebe20, 0x2fc2b: 0x6c5ec020, - 0x2fc2c: 0x6c5ec220, 0x2fc2d: 0x6c5ec420, 0x2fc2e: 0x6c5ec620, 0x2fc2f: 0x6c5ec820, - 0x2fc30: 0x6c5eca20, 0x2fc31: 0x6c5ecc20, 0x2fc32: 0x6c5ece20, 0x2fc33: 0x6c5ed020, - 0x2fc34: 0x6c5ed220, 0x2fc35: 0x6c5ed420, 0x2fc36: 0x6c5ed620, 0x2fc37: 0x6c5ed820, - 0x2fc38: 0x6c5eda20, 0x2fc39: 0x6c5edc20, 0x2fc3a: 0x6c5ede20, 0x2fc3b: 0x6c5ee020, - 0x2fc3c: 0x6c5ee220, 0x2fc3d: 0x6c5ee420, 0x2fc3e: 0x6c5ee620, 0x2fc3f: 0x6c5ee820, - // Block 0xbf1, offset 0x2fc40 - 0x2fc40: 0x6c5eea20, 0x2fc41: 0x6c5eec20, 0x2fc42: 0x6c5eee20, 0x2fc43: 0x6c5ef020, - 0x2fc44: 0x6c5ef220, 0x2fc45: 0x6c5ef420, 0x2fc46: 0x6c5ef620, 0x2fc47: 0x6c5ef820, - 0x2fc48: 0x6c837a20, 0x2fc49: 0x6c5efa20, 0x2fc4a: 0x6c5efc20, 0x2fc4b: 0x6c5efe20, - 0x2fc4c: 0x6c5f0020, 0x2fc4d: 0x6c5f0220, 0x2fc4e: 0x6c5f0420, 0x2fc4f: 0x6c5f0620, - 0x2fc50: 0x6c5f0820, 0x2fc51: 0x6c5f0a20, 0x2fc52: 0x6cdb1620, 0x2fc53: 0x6c5f0c20, - 0x2fc54: 0x6c5f0e20, 0x2fc55: 0x6c5f1020, 0x2fc56: 0x6c837c20, 0x2fc57: 0x6c837e20, - 0x2fc58: 0x6c838020, 0x2fc59: 0x6c838220, 0x2fc5a: 0x6c838420, 0x2fc5b: 0x6c838620, - 0x2fc5c: 0x6c838820, 0x2fc5d: 0x6cac7420, 0x2fc5e: 0x6c838a20, 0x2fc5f: 0x6c838c20, - 0x2fc60: 0x6c838e20, 0x2fc61: 0x6c839020, 0x2fc62: 0x6c839220, 0x2fc63: 0x6cac7620, - 0x2fc64: 0x6c839420, 0x2fc65: 0x6c839620, 0x2fc66: 0x6c839820, 0x2fc67: 0x6c839a20, - 0x2fc68: 0x6c839c20, 0x2fc69: 0x6c839e20, 0x2fc6a: 0x6c83a020, 0x2fc6b: 0x6c83a220, - 0x2fc6c: 0x6c83a420, 0x2fc6d: 0x6c83a620, 0x2fc6e: 0x6c83a820, 0x2fc6f: 0x6c83aa20, - 0x2fc70: 0x6c83ac20, 0x2fc71: 0x6c83ae20, 0x2fc72: 0x6c83b020, 0x2fc73: 0x6c83b220, - 0x2fc74: 0x6c83b420, 0x2fc75: 0x6c83b620, 0x2fc76: 0x6c83b820, 0x2fc77: 0x6c83ba20, - 0x2fc78: 0x6c83bc20, 0x2fc79: 0x6c83be20, 0x2fc7a: 0x6c5f9220, 0x2fc7b: 0x6cdb1820, - 0x2fc7c: 0x6c83c020, 0x2fc7d: 0x6c83c220, 0x2fc7e: 0x6c3fb820, 0x2fc7f: 0x6c83c420, - // Block 0xbf2, offset 0x2fc80 - 0x2fc80: 0x6c83c620, 0x2fc81: 0x6c83c820, 0x2fc82: 0x6c83ca20, 0x2fc83: 0x6c83cc20, - 0x2fc84: 0x6c83ce20, 0x2fc85: 0x6c83d020, 0x2fc86: 0x6cdb1a20, 0x2fc87: 0x6c83d220, - 0x2fc88: 0x6c83d420, 0x2fc89: 0x6c83d620, 0x2fc8a: 0x6c83d820, 0x2fc8b: 0x6c83da20, - 0x2fc8c: 0x6c83dc20, 0x2fc8d: 0x6c83de20, 0x2fc8e: 0x6c83e020, 0x2fc8f: 0x6c83e220, - 0x2fc90: 0x6c83e420, 0x2fc91: 0x6c83e620, 0x2fc92: 0x6c83e820, 0x2fc93: 0x6c84c420, - 0x2fc94: 0x6c83ea20, 0x2fc95: 0x6c83ec20, 0x2fc96: 0x6c83ee20, 0x2fc97: 0x6c83f020, - 0x2fc98: 0x6c83f220, 0x2fc99: 0x6cac7020, 0x2fc9a: 0x6c83f420, 0x2fc9b: 0x6c83f620, - 0x2fc9c: 0x6c83f820, 0x2fc9d: 0x6c83fa20, 0x2fc9e: 0x6c83fc20, 0x2fc9f: 0x6c83fe20, - 0x2fca0: 0x6c840020, 0x2fca1: 0x6c840220, 0x2fca2: 0x6c840420, 0x2fca3: 0x6c840620, - 0x2fca4: 0x6c840820, 0x2fca5: 0x6c840a20, 0x2fca6: 0x6c840c20, 0x2fca7: 0x6c840e20, - 0x2fca8: 0x6c841020, 0x2fca9: 0x6c841220, 0x2fcaa: 0x6c841420, 0x2fcab: 0x6cac7220, - 0x2fcac: 0x6c841620, 0x2fcad: 0x6c841820, 0x2fcae: 0x6c841a20, 0x2fcaf: 0x6c841c20, - 0x2fcb0: 0x6cac7820, 0x2fcb1: 0x6cac7a20, 0x2fcb2: 0x6cac7c20, 0x2fcb3: 0x6cac7e20, - 0x2fcb4: 0x6cac8020, 0x2fcb5: 0x6cac8220, 0x2fcb6: 0x6cac8420, 0x2fcb7: 0x6cac8620, - 0x2fcb8: 0x6cac8820, 0x2fcb9: 0x6cac8a20, 0x2fcba: 0x6cac8c20, 0x2fcbb: 0x6cac8e20, - 0x2fcbc: 0x6cac9020, 0x2fcbd: 0x6cac9220, 0x2fcbe: 0x6cac9420, 0x2fcbf: 0x6cac9620, - // Block 0xbf3, offset 0x2fcc0 - 0x2fcc0: 0x6cac9820, 0x2fcc1: 0x6cac9a20, 0x2fcc2: 0x6cac9c20, 0x2fcc3: 0x6cac9e20, - 0x2fcc4: 0x6caca020, 0x2fcc5: 0x6caca220, 0x2fcc6: 0x6caca420, 0x2fcc7: 0x6caca620, - 0x2fcc8: 0x6caca820, 0x2fcc9: 0x6cacaa20, 0x2fcca: 0x6cacac20, 0x2fccb: 0x6cacae20, - 0x2fccc: 0x6cacb020, 0x2fccd: 0x6cacb220, 0x2fcce: 0x6cacb420, 0x2fccf: 0x6cacb620, - 0x2fcd0: 0x6cacb820, 0x2fcd1: 0x6cacba20, 0x2fcd2: 0x6cacbc20, 0x2fcd3: 0x6cacbe20, - 0x2fcd4: 0x6cacc020, 0x2fcd5: 0x6cacc220, 0x2fcd6: 0x6cacc420, 0x2fcd7: 0x6cacc620, - 0x2fcd8: 0x6cacc820, 0x2fcd9: 0x6cacca20, 0x2fcda: 0x6cdb1c20, 0x2fcdb: 0x6caccc20, - 0x2fcdc: 0x6cacce20, 0x2fcdd: 0x6cacd020, 0x2fcde: 0x6cacd220, 0x2fcdf: 0x6cacd420, - 0x2fce0: 0x6cacd620, 0x2fce1: 0x6cacd820, 0x2fce2: 0x6cacda20, 0x2fce3: 0x6cacdc20, - 0x2fce4: 0x6cacde20, 0x2fce5: 0x6cace020, 0x2fce6: 0x6cace220, 0x2fce7: 0x6cace420, - 0x2fce8: 0x6cace620, 0x2fce9: 0x6cace820, 0x2fcea: 0x6cacea20, 0x2fceb: 0x6cacec20, - 0x2fcec: 0x6cacee20, 0x2fced: 0x6cae1e20, 0x2fcee: 0x6cacf020, 0x2fcef: 0x6cacf220, - 0x2fcf0: 0x6cacf420, 0x2fcf1: 0x6cacf620, 0x2fcf2: 0x6cacf820, 0x2fcf3: 0x6cacfa20, - 0x2fcf4: 0x6cacfc20, 0x2fcf5: 0x6cacfe20, 0x2fcf6: 0x6cad0020, 0x2fcf7: 0x6cad0220, - 0x2fcf8: 0x6cad0420, 0x2fcf9: 0x6cad0620, 0x2fcfa: 0x6cad0820, 0x2fcfb: 0x6d098220, - 0x2fcfc: 0x6cad0a20, 0x2fcfd: 0x6cad0c20, 0x2fcfe: 0x6cdb1e20, 0x2fcff: 0x6cdb2020, - // Block 0xbf4, offset 0x2fd00 - 0x2fd00: 0x6cdb2220, 0x2fd01: 0x6cdb2420, 0x2fd02: 0x6cdb2620, 0x2fd03: 0x6cdb2820, - 0x2fd04: 0x6cdb2a20, 0x2fd05: 0x6cdb2c20, 0x2fd06: 0x6cdb2e20, 0x2fd07: 0x6cdb3020, - 0x2fd08: 0x6cdb3220, 0x2fd09: 0x6cdb3420, 0x2fd0a: 0x6cdb3620, 0x2fd0b: 0x6cdb3820, - 0x2fd0c: 0x6cdb3a20, 0x2fd0d: 0x6cdb3c20, 0x2fd0e: 0x6cdb3e20, 0x2fd0f: 0x6cdb4020, - 0x2fd10: 0x6cdb4220, 0x2fd11: 0x6cdb4420, 0x2fd12: 0x6cdb4620, 0x2fd13: 0x6cdb4820, - 0x2fd14: 0x6cdb4a20, 0x2fd15: 0x6cdb4c20, 0x2fd16: 0x6cdb4e20, 0x2fd17: 0x6cdb5020, - 0x2fd18: 0x6cdb5220, 0x2fd19: 0x6d098420, 0x2fd1a: 0x6cdb5420, 0x2fd1b: 0x6cdb5620, - 0x2fd1c: 0x6cdb5820, 0x2fd1d: 0x6cdb5a20, 0x2fd1e: 0x6cdb5c20, 0x2fd1f: 0x6cdb5e20, - 0x2fd20: 0x6cdb6020, 0x2fd21: 0x6cdb6220, 0x2fd22: 0x6cdb6420, 0x2fd23: 0x6cdb6620, - 0x2fd24: 0x6cdb6820, 0x2fd25: 0x6cdb6a20, 0x2fd26: 0x6cdb6c20, 0x2fd27: 0x6cdb6e20, - 0x2fd28: 0x6cdb7020, 0x2fd29: 0x6cdb7220, 0x2fd2a: 0x6cdb7420, 0x2fd2b: 0x6cdb7620, - 0x2fd2c: 0x6cdb7820, 0x2fd2d: 0x6cdb7a20, 0x2fd2e: 0x6cdb7c20, 0x2fd2f: 0x6cdb7e20, - 0x2fd30: 0x6cdb8020, 0x2fd31: 0x6cdb8220, 0x2fd32: 0x6cdb8420, 0x2fd33: 0x6cdb8620, - 0x2fd34: 0x6cdb8820, 0x2fd35: 0x6cdb8a20, 0x2fd36: 0x6cdb8c20, 0x2fd37: 0x6cdb8e20, - 0x2fd38: 0x6cdb9020, 0x2fd39: 0x6cdb9220, 0x2fd3a: 0x6cdb9420, 0x2fd3b: 0x6cdb9620, - 0x2fd3c: 0x6cdb9820, 0x2fd3d: 0x6cdb9a20, 0x2fd3e: 0x6cdb9c20, 0x2fd3f: 0x6cdb9e20, - // Block 0xbf5, offset 0x2fd40 - 0x2fd40: 0x6cdba020, 0x2fd41: 0x6cdba220, 0x2fd42: 0x6cdba420, 0x2fd43: 0x6cdba620, - 0x2fd44: 0x6cdba820, 0x2fd45: 0x6cdbaa20, 0x2fd46: 0x6cdbac20, 0x2fd47: 0x6cdbae20, - 0x2fd48: 0x6cdbb020, 0x2fd49: 0x6cdbb220, 0x2fd4a: 0x6cdbb420, 0x2fd4b: 0x6cdbb620, - 0x2fd4c: 0x6cdbb820, 0x2fd4d: 0x6cdbba20, 0x2fd4e: 0x6cdbbc20, 0x2fd4f: 0x6cdbbe20, - 0x2fd50: 0x6cdbc020, 0x2fd51: 0x6cdbc220, 0x2fd52: 0x6cdbc420, 0x2fd53: 0x6cdbc620, - 0x2fd54: 0x6cdbc820, 0x2fd55: 0x6cdbca20, 0x2fd56: 0x6cdbcc20, 0x2fd57: 0x6cdbce20, - 0x2fd58: 0x6cdbd020, 0x2fd59: 0x6cdbd220, 0x2fd5a: 0x6cdbd420, 0x2fd5b: 0x6cdbd620, - 0x2fd5c: 0x6cdbd820, 0x2fd5d: 0x6cdbda20, 0x2fd5e: 0x6cdbdc20, 0x2fd5f: 0x6cdbde20, - 0x2fd60: 0x6cdbe020, 0x2fd61: 0x6cdbe220, 0x2fd62: 0x6cdbe420, 0x2fd63: 0x6cdbe620, - 0x2fd64: 0x6cdbe820, 0x2fd65: 0x6d098620, 0x2fd66: 0x6cdbea20, 0x2fd67: 0x6cdbec20, - 0x2fd68: 0x6d098820, 0x2fd69: 0x6d098a20, 0x2fd6a: 0x6d098c20, 0x2fd6b: 0x6d098e20, - 0x2fd6c: 0x6d037820, 0x2fd6d: 0x6d099020, 0x2fd6e: 0x6d099220, 0x2fd6f: 0x6d099420, - 0x2fd70: 0x6d099620, 0x2fd71: 0x6d099820, 0x2fd72: 0x6d099a20, 0x2fd73: 0x6d099c20, - 0x2fd74: 0x6d099e20, 0x2fd75: 0x6d09a020, 0x2fd76: 0x6d09a220, 0x2fd77: 0x6d09a420, - 0x2fd78: 0x6cdd4420, 0x2fd79: 0x6d09a620, 0x2fd7a: 0x6d09a820, 0x2fd7b: 0x6d09aa20, - 0x2fd7c: 0x6d09ac20, 0x2fd7d: 0x6d09ae20, 0x2fd7e: 0x6d09b020, 0x2fd7f: 0x6d09b220, - // Block 0xbf6, offset 0x2fd80 - 0x2fd80: 0x6d09b420, 0x2fd81: 0x6d09b620, 0x2fd82: 0x6d09b820, 0x2fd83: 0x6d09ba20, - 0x2fd84: 0x6d09bc20, 0x2fd85: 0x6d09be20, 0x2fd86: 0x6d09c020, 0x2fd87: 0x6d09c220, - 0x2fd88: 0x6d09c420, 0x2fd89: 0x6d09c620, 0x2fd8a: 0x6d09c820, 0x2fd8b: 0x6d09ca20, - 0x2fd8c: 0x6d09cc20, 0x2fd8d: 0x6d09ce20, 0x2fd8e: 0x6d09d020, 0x2fd8f: 0x6d09d220, - 0x2fd90: 0x6d09d420, 0x2fd91: 0x6d09d620, 0x2fd92: 0x6d09d820, 0x2fd93: 0x6d09da20, - 0x2fd94: 0x6d09dc20, 0x2fd95: 0x6d09de20, 0x2fd96: 0x6d09e020, 0x2fd97: 0x6cdbee20, - 0x2fd98: 0x6d09e220, 0x2fd99: 0x6d09e420, 0x2fd9a: 0x6d09e620, 0x2fd9b: 0x6d09e820, - 0x2fd9c: 0x6d09ea20, 0x2fd9d: 0x6d09ec20, 0x2fd9e: 0x6d09ee20, 0x2fd9f: 0x6d09f020, - 0x2fda0: 0x6d09f220, 0x2fda1: 0x6d09f420, 0x2fda2: 0x6d09f620, 0x2fda3: 0x6d09f820, - 0x2fda4: 0x6d09fa20, 0x2fda5: 0x6d09fc20, 0x2fda6: 0x6d09fe20, 0x2fda7: 0x6d0a0020, - 0x2fda8: 0x6d0a0220, 0x2fda9: 0x6d0a0420, 0x2fdaa: 0x6d0a0620, 0x2fdab: 0x6d0a0820, - 0x2fdac: 0x6d0a0a20, 0x2fdad: 0x6d0a0c20, 0x2fdae: 0x6d0a0e20, 0x2fdaf: 0x6d0a1020, - 0x2fdb0: 0x6d0a1220, 0x2fdb1: 0x6d0a1420, 0x2fdb2: 0x6d0a1620, 0x2fdb3: 0x6d0a1820, - 0x2fdb4: 0x6d0a1a20, 0x2fdb5: 0x6d0a1c20, 0x2fdb6: 0x6d0a1e20, 0x2fdb7: 0x6d0a2020, - 0x2fdb8: 0x6d0a2220, 0x2fdb9: 0x6d0a2420, 0x2fdba: 0x6d0a2620, 0x2fdbb: 0x6d0a2820, - 0x2fdbc: 0x6d0a2a20, 0x2fdbd: 0x6d0a2c20, 0x2fdbe: 0x6d0a2e20, 0x2fdbf: 0x6d0a3020, - // Block 0xbf7, offset 0x2fdc0 - 0x2fdc0: 0x6d0a3220, 0x2fdc1: 0x6d0a3420, 0x2fdc2: 0x6d0a3620, 0x2fdc3: 0x6d0a3820, - 0x2fdc4: 0x6d0a3a20, 0x2fdc5: 0x6d0a3c20, 0x2fdc6: 0x6d0a3e20, 0x2fdc7: 0x6d0a4020, - 0x2fdc8: 0x6d0a4220, 0x2fdc9: 0x6d0a4420, 0x2fdca: 0x6d640e20, 0x2fdcb: 0x6d0a4620, - 0x2fdcc: 0x6d0a4820, 0x2fdcd: 0x6d0a4a20, 0x2fdce: 0x6d0a4c20, 0x2fdcf: 0x6d0a4e20, - 0x2fdd0: 0x6d37b020, 0x2fdd1: 0x6d37b220, 0x2fdd2: 0x6d37b420, 0x2fdd3: 0x6d37b620, - 0x2fdd4: 0x6d37b820, 0x2fdd5: 0x6d37ba20, 0x2fdd6: 0x6d37bc20, 0x2fdd7: 0x6d37be20, - 0x2fdd8: 0x6d37c020, 0x2fdd9: 0x6d37c220, 0x2fdda: 0x6d37c420, 0x2fddb: 0x6d37c620, - 0x2fddc: 0x6d37c820, 0x2fddd: 0x6d37ca20, 0x2fdde: 0x6d37cc20, 0x2fddf: 0x6d37ce20, - 0x2fde0: 0x6d37d020, 0x2fde1: 0x6d37d220, 0x2fde2: 0x6d37d420, 0x2fde3: 0x6d37d620, - 0x2fde4: 0x6d37d820, 0x2fde5: 0x6d37da20, 0x2fde6: 0x6d37dc20, 0x2fde7: 0x6d37de20, - 0x2fde8: 0x6d37e020, 0x2fde9: 0x6d37e220, 0x2fdea: 0x6d37e420, 0x2fdeb: 0x6d37e620, - 0x2fdec: 0x6d37e820, 0x2fded: 0x6d37ea20, 0x2fdee: 0x6d37ec20, 0x2fdef: 0x6d37ee20, - 0x2fdf0: 0x6d37f020, 0x2fdf1: 0x6d37f220, 0x2fdf2: 0x6d37f420, 0x2fdf3: 0x6d37f620, - 0x2fdf4: 0x6d37f820, 0x2fdf5: 0x6d37fa20, 0x2fdf6: 0x6d37fc20, 0x2fdf7: 0x6d37fe20, - 0x2fdf8: 0x6d2b2a20, 0x2fdf9: 0x6d380020, 0x2fdfa: 0x6d380220, 0x2fdfb: 0x6d380420, - 0x2fdfc: 0x6d380620, 0x2fdfd: 0x6d380820, 0x2fdfe: 0x6d380a20, 0x2fdff: 0x6d380c20, - // Block 0xbf8, offset 0x2fe00 - 0x2fe00: 0x6d380e20, 0x2fe01: 0x6d381020, 0x2fe02: 0x6d381220, 0x2fe03: 0x6d381420, - 0x2fe04: 0x6d381620, 0x2fe05: 0x6d0bb820, 0x2fe06: 0x6d381820, 0x2fe07: 0x6d381a20, - 0x2fe08: 0x6d0bba20, 0x2fe09: 0x6d381c20, 0x2fe0a: 0x6d381e20, 0x2fe0b: 0x6d382020, - 0x2fe0c: 0x6d382220, 0x2fe0d: 0x6d382420, 0x2fe0e: 0x6d382620, 0x2fe0f: 0x6d382820, - 0x2fe10: 0x6d382a20, 0x2fe11: 0x6d382c20, 0x2fe12: 0x6d382e20, 0x2fe13: 0x6d383020, - 0x2fe14: 0x6d383220, 0x2fe15: 0x6d383420, 0x2fe16: 0x6d383620, 0x2fe17: 0x6d383820, - 0x2fe18: 0x6d383a20, 0x2fe19: 0x6d383c20, 0x2fe1a: 0x6d383e20, 0x2fe1b: 0x6d384020, - 0x2fe1c: 0x6d384220, 0x2fe1d: 0x6d384420, 0x2fe1e: 0x6d8dfe20, 0x2fe1f: 0x6d384620, - 0x2fe20: 0x6d641020, 0x2fe21: 0x6d384820, 0x2fe22: 0x6d384a20, 0x2fe23: 0x6d384c20, - 0x2fe24: 0x6d384e20, 0x2fe25: 0x6d39b820, 0x2fe26: 0x6d385020, 0x2fe27: 0x6d641220, - 0x2fe28: 0x6d641420, 0x2fe29: 0x6d641620, 0x2fe2a: 0x6d641820, 0x2fe2b: 0x6d641a20, - 0x2fe2c: 0x6d641c20, 0x2fe2d: 0x6d641e20, 0x2fe2e: 0x6d642020, 0x2fe2f: 0x6d642220, - 0x2fe30: 0x6d642420, 0x2fe31: 0x6d0bbc20, 0x2fe32: 0x6d642620, 0x2fe33: 0x6d642820, - 0x2fe34: 0x6d642a20, 0x2fe35: 0x6d642c20, 0x2fe36: 0x6d642e20, 0x2fe37: 0x6d643020, - 0x2fe38: 0x6d643220, 0x2fe39: 0x6d643420, 0x2fe3a: 0x6d643620, 0x2fe3b: 0x6d643820, - 0x2fe3c: 0x6d643a20, 0x2fe3d: 0x6d643c20, 0x2fe3e: 0x6d643e20, 0x2fe3f: 0x6d644020, - // Block 0xbf9, offset 0x2fe40 - 0x2fe40: 0x6d644220, 0x2fe41: 0x6d644420, 0x2fe42: 0x6d644620, 0x2fe43: 0x6d644820, - 0x2fe44: 0x6d644a20, 0x2fe45: 0x6d644c20, 0x2fe46: 0x6d644e20, 0x2fe47: 0x6d0bbe20, - 0x2fe48: 0x6d645020, 0x2fe49: 0x6d645220, 0x2fe4a: 0x6d645420, 0x2fe4b: 0x6d645620, - 0x2fe4c: 0x6d645820, 0x2fe4d: 0x6d645a20, 0x2fe4e: 0x6d645c20, 0x2fe4f: 0x6d645e20, - 0x2fe50: 0x6d646020, 0x2fe51: 0x6d646220, 0x2fe52: 0x6d646420, 0x2fe53: 0x6d646620, - 0x2fe54: 0x6d646820, 0x2fe55: 0x6d646a20, 0x2fe56: 0x6d646c20, 0x2fe57: 0x6d646e20, - 0x2fe58: 0x6d647020, 0x2fe59: 0x6d647220, 0x2fe5a: 0x6d647420, 0x2fe5b: 0x6d647620, - 0x2fe5c: 0x6d647820, 0x2fe5d: 0x6d647a20, 0x2fe5e: 0x6d647c20, 0x2fe5f: 0x6d647e20, - 0x2fe60: 0x6d648020, 0x2fe61: 0x6d648220, 0x2fe62: 0x6d648420, 0x2fe63: 0x6d648620, - 0x2fe64: 0x6d648820, 0x2fe65: 0x6d648a20, 0x2fe66: 0x6d648c20, 0x2fe67: 0x6d648e20, - 0x2fe68: 0x6d649020, 0x2fe69: 0x6d649220, 0x2fe6a: 0x6d649420, 0x2fe6b: 0x6d649620, - 0x2fe6c: 0x6d649820, 0x2fe6d: 0x6d649a20, 0x2fe6e: 0x6d649c20, 0x2fe6f: 0x6d649e20, - 0x2fe70: 0x6d64a020, 0x2fe71: 0x6d64a220, 0x2fe72: 0x6d64a420, 0x2fe73: 0x6d64a620, - 0x2fe74: 0x6d64a820, 0x2fe75: 0x6d64aa20, 0x2fe76: 0x6d64ac20, 0x2fe77: 0x6d64ae20, - 0x2fe78: 0x6d64b020, 0x2fe79: 0x6d64b220, 0x2fe7a: 0x6d64b420, 0x2fe7b: 0x6d64b620, - 0x2fe7c: 0x6d64b820, 0x2fe7d: 0x6d65f020, 0x2fe7e: 0x6d8e0020, 0x2fe7f: 0x6d8e0220, - // Block 0xbfa, offset 0x2fe80 - 0x2fe80: 0x6d8e0420, 0x2fe81: 0x6d8e0620, 0x2fe82: 0x6d8e0820, 0x2fe83: 0x6d8e0a20, - 0x2fe84: 0x6d8e0c20, 0x2fe85: 0x6d8e0e20, 0x2fe86: 0x6d8e1020, 0x2fe87: 0x6d8e1220, - 0x2fe88: 0x6d8e1420, 0x2fe89: 0x6d8e1620, 0x2fe8a: 0x6d8e1820, 0x2fe8b: 0x6d8e1a20, - 0x2fe8c: 0x6d8e1c20, 0x2fe8d: 0x6d8e1e20, 0x2fe8e: 0x6d8e2020, 0x2fe8f: 0x6d65f220, - 0x2fe90: 0x6d8e2220, 0x2fe91: 0x6d8e2420, 0x2fe92: 0x6d8e2620, 0x2fe93: 0x6d8e2820, - 0x2fe94: 0x6d8e2a20, 0x2fe95: 0x6d8e2c20, 0x2fe96: 0x6d8e2e20, 0x2fe97: 0x6db1fe20, - 0x2fe98: 0x6d8e3020, 0x2fe99: 0x6d8e3220, 0x2fe9a: 0x6d8e3420, 0x2fe9b: 0x6d8e3620, - 0x2fe9c: 0x6d8e3820, 0x2fe9d: 0x6d8e3a20, 0x2fe9e: 0x6d8e3c20, 0x2fe9f: 0x6d8e3e20, - 0x2fea0: 0x6d8e4020, 0x2fea1: 0x6d8e4220, 0x2fea2: 0x6d8e4420, 0x2fea3: 0x6d8e4620, - 0x2fea4: 0x6d8e4820, 0x2fea5: 0x6d8e4a20, 0x2fea6: 0x6d8e4c20, 0x2fea7: 0x6d8e4e20, - 0x2fea8: 0x6d8e5020, 0x2fea9: 0x6d8e5220, 0x2feaa: 0x6d8e5420, 0x2feab: 0x6d8e5620, - 0x2feac: 0x6d8e5820, 0x2fead: 0x6d8e5a20, 0x2feae: 0x6d8e5c20, 0x2feaf: 0x6d8e5e20, - 0x2feb0: 0x6d8e6020, 0x2feb1: 0x6d8e6220, 0x2feb2: 0x6d8e6420, 0x2feb3: 0x6d8e6620, - 0x2feb4: 0x6d8e6820, 0x2feb5: 0x6d8e6a20, 0x2feb6: 0x6db20020, 0x2feb7: 0x6db20220, - 0x2feb8: 0x6db20420, 0x2feb9: 0x6db20620, 0x2feba: 0x6db20820, 0x2febb: 0x6db20a20, - 0x2febc: 0x6db20c20, 0x2febd: 0x6db20e20, 0x2febe: 0x6db21020, 0x2febf: 0x6db21220, - // Block 0xbfb, offset 0x2fec0 - 0x2fec0: 0x6db21420, 0x2fec1: 0x6db21620, 0x2fec2: 0x6db21820, 0x2fec3: 0x6db21a20, - 0x2fec4: 0x6db21c20, 0x2fec5: 0x6db21e20, 0x2fec6: 0x6db22020, 0x2fec7: 0x6db22220, - 0x2fec8: 0x6db22420, 0x2fec9: 0x6db22620, 0x2feca: 0x6db22820, 0x2fecb: 0x6db22a20, - 0x2fecc: 0x6d8fc420, 0x2fecd: 0x6db22c20, 0x2fece: 0x6db22e20, 0x2fecf: 0x6db23020, - 0x2fed0: 0x6db23220, 0x2fed1: 0x6db23420, 0x2fed2: 0x6db23620, 0x2fed3: 0x6db23820, - 0x2fed4: 0x6db23a20, 0x2fed5: 0x6db23c20, 0x2fed6: 0x6db23e20, 0x2fed7: 0x6db24020, - 0x2fed8: 0x6db24220, 0x2fed9: 0x6db24420, 0x2feda: 0x6db24620, 0x2fedb: 0x6db24820, - 0x2fedc: 0x6db24a20, 0x2fedd: 0x6db24c20, 0x2fede: 0x6db24e20, 0x2fedf: 0x6db25020, - 0x2fee0: 0x6db25220, 0x2fee1: 0x6db25420, 0x2fee2: 0x6db25620, 0x2fee3: 0x6db25820, - 0x2fee4: 0x6db25a20, 0x2fee5: 0x6db25c20, 0x2fee6: 0x6db25e20, 0x2fee7: 0x6db26020, - 0x2fee8: 0x6db26220, 0x2fee9: 0x6dd14c20, 0x2feea: 0x6db26420, 0x2feeb: 0x6db26620, - 0x2feec: 0x6db26820, 0x2feed: 0x6db39420, 0x2feee: 0x6db26a20, 0x2feef: 0x6db39620, - 0x2fef0: 0x6dd14e20, 0x2fef1: 0x6dd15020, 0x2fef2: 0x6dd15220, 0x2fef3: 0x6dd15420, - 0x2fef4: 0x6dd15620, 0x2fef5: 0x6dd15820, 0x2fef6: 0x6dd15a20, 0x2fef7: 0x6dd15c20, - 0x2fef8: 0x6dd15e20, 0x2fef9: 0x6dd16020, 0x2fefa: 0x6dd16220, 0x2fefb: 0x6dd16420, - 0x2fefc: 0x6dd16620, 0x2fefd: 0x6dd16820, 0x2fefe: 0x6dd16a20, 0x2feff: 0x6dd16c20, - // Block 0xbfc, offset 0x2ff00 - 0x2ff00: 0x6dd16e20, 0x2ff01: 0x6dd17020, 0x2ff02: 0x6dd17220, 0x2ff03: 0x6dd17420, - 0x2ff04: 0x6dd17620, 0x2ff05: 0x6dd17820, 0x2ff06: 0x6dd17a20, 0x2ff07: 0x6dd17c20, - 0x2ff08: 0x6dd17e20, 0x2ff09: 0x6dd18020, 0x2ff0a: 0x6dd18220, 0x2ff0b: 0x6dd18420, - 0x2ff0c: 0x6dd18620, 0x2ff0d: 0x6dd18820, 0x2ff0e: 0x6dd18a20, 0x2ff0f: 0x6dd18c20, - 0x2ff10: 0x6dd18e20, 0x2ff11: 0x6deac020, 0x2ff12: 0x6dd19020, 0x2ff13: 0x6dd19220, - 0x2ff14: 0x6e128a20, 0x2ff15: 0x6deac220, 0x2ff16: 0x6deac420, 0x2ff17: 0x6deac620, - 0x2ff18: 0x6deac820, 0x2ff19: 0x6deaca20, 0x2ff1a: 0x6deacc20, 0x2ff1b: 0x6deace20, - 0x2ff1c: 0x6dead020, 0x2ff1d: 0x6dead220, 0x2ff1e: 0x6dead420, 0x2ff1f: 0x6dead620, - 0x2ff20: 0x6dead820, 0x2ff21: 0x6deada20, 0x2ff22: 0x6deadc20, 0x2ff23: 0x6deade20, - 0x2ff24: 0x6deae020, 0x2ff25: 0x6deae220, 0x2ff26: 0x6deae420, 0x2ff27: 0x6deae620, - 0x2ff28: 0x6deae820, 0x2ff29: 0x6deaea20, 0x2ff2a: 0x6deaec20, 0x2ff2b: 0x6deaee20, - 0x2ff2c: 0x6deaf020, 0x2ff2d: 0x6deaf220, 0x2ff2e: 0x6e006c20, 0x2ff2f: 0x6deaf420, - 0x2ff30: 0x6deaf620, 0x2ff31: 0x6deaf820, 0x2ff32: 0x6deafa20, 0x2ff33: 0x6deafc20, - 0x2ff34: 0x6deafe20, 0x2ff35: 0x6deb0020, 0x2ff36: 0x6e006e20, 0x2ff37: 0x6debce20, - 0x2ff38: 0x6debd020, 0x2ff39: 0x6e007020, 0x2ff3a: 0x6e007220, 0x2ff3b: 0x6e007420, - 0x2ff3c: 0x6e007620, 0x2ff3d: 0x6e007820, 0x2ff3e: 0x6e007a20, 0x2ff3f: 0x6e007c20, - // Block 0xbfd, offset 0x2ff40 - 0x2ff40: 0x6e007e20, 0x2ff41: 0x6e008020, 0x2ff42: 0x6e008220, 0x2ff43: 0x6e008420, - 0x2ff44: 0x6e008620, 0x2ff45: 0x6e008820, 0x2ff46: 0x6e008a20, 0x2ff47: 0x6e008c20, - 0x2ff48: 0x6e008e20, 0x2ff49: 0x6e009020, 0x2ff4a: 0x6e009220, 0x2ff4b: 0x6e009420, - 0x2ff4c: 0x6e009620, 0x2ff4d: 0x6e009820, 0x2ff4e: 0x6e009a20, 0x2ff4f: 0x6e009c20, - 0x2ff50: 0x6e009e20, 0x2ff51: 0x6e00a020, 0x2ff52: 0x6e015420, 0x2ff53: 0x6e00a220, - 0x2ff54: 0x6e00a420, 0x2ff55: 0x6e128c20, 0x2ff56: 0x6e128e20, 0x2ff57: 0x6e129020, - 0x2ff58: 0x6e129220, 0x2ff59: 0x6e129420, 0x2ff5a: 0x6e129620, 0x2ff5b: 0x6e015620, - 0x2ff5c: 0x6e129820, 0x2ff5d: 0x6e129a20, 0x2ff5e: 0x6e129c20, 0x2ff5f: 0x6e129e20, - 0x2ff60: 0x6e12a020, 0x2ff61: 0x6e12a220, 0x2ff62: 0x6e00a620, 0x2ff63: 0x6e12a420, - 0x2ff64: 0x6e006a20, 0x2ff65: 0x6e12a620, 0x2ff66: 0x6e12a820, 0x2ff67: 0x6e12aa20, - 0x2ff68: 0x6e12ac20, 0x2ff69: 0x6e12ae20, 0x2ff6a: 0x6e12b020, 0x2ff6b: 0x6e12b220, - 0x2ff6c: 0x6e20b820, 0x2ff6d: 0x6e12b420, 0x2ff6e: 0x6e12b620, 0x2ff6f: 0x6e12b820, - 0x2ff70: 0x6e015820, 0x2ff71: 0x6e2b7e20, 0x2ff72: 0x6e20ba20, 0x2ff73: 0x6e20bc20, - 0x2ff74: 0x6e20be20, 0x2ff75: 0x6e20c020, 0x2ff76: 0x6e20c220, 0x2ff77: 0x6e20c420, - 0x2ff78: 0x6e2b8020, 0x2ff79: 0x6e2b8220, 0x2ff7a: 0x6e2b8420, 0x2ff7b: 0x6e2b8620, - 0x2ff7c: 0x6e2b8820, 0x2ff7d: 0x6e2b8a20, 0x2ff7e: 0x6e2b8c20, 0x2ff7f: 0x6e2b8e20, - // Block 0xbfe, offset 0x2ff80 - 0x2ff80: 0x6e2b9020, 0x2ff81: 0x6e2b9220, 0x2ff82: 0x6e39ca20, 0x2ff83: 0x6e33ec20, - 0x2ff84: 0x6e3df420, 0x2ff85: 0x6e33ee20, 0x2ff86: 0x6e39cc20, 0x2ff87: 0x6e39ce20, - 0x2ff88: 0x6e39d020, 0x2ff89: 0x6e39d220, 0x2ff8a: 0x6e40cc20, 0x2ff8b: 0x6e446620, - 0x2ff8c: 0x6e42fa20, 0x2ff8d: 0x6c14ca20, 0x2ff8e: 0x6c401020, 0x2ff8f: 0x6c401220, - 0x2ff90: 0x6c5f9620, 0x2ff91: 0x6c84ce20, 0x2ff92: 0x6c674020, 0x2ff93: 0x6c84d020, - 0x2ff94: 0x6c84d220, 0x2ff95: 0x6cae2620, 0x2ff96: 0x6cae2820, 0x2ff97: 0x6cae2a20, - 0x2ff98: 0x6cae2c20, 0x2ff99: 0x6cae2e20, 0x2ff9a: 0x6cae3020, 0x2ff9b: 0x6cdd4c20, - 0x2ff9c: 0x6d0bc020, 0x2ff9d: 0x6cdd4e20, 0x2ff9e: 0x6d0bcc20, 0x2ff9f: 0x6d0bce20, - 0x2ffa0: 0x6d39ba20, 0x2ffa1: 0x6d39bc20, 0x2ffa2: 0x6d65f620, 0x2ffa3: 0x6d8fc620, - 0x2ffa4: 0x6d8fca20, 0x2ffa5: 0x6d8fcc20, 0x2ffa6: 0x6d8fce20, 0x2ffa7: 0x6db39a20, - 0x2ffa8: 0x6db39c20, 0x2ffa9: 0x6dd29a20, 0x2ffaa: 0x6e3e1220, 0x2ffab: 0x6c14cc20, - 0x2ffac: 0x6c268a20, 0x2ffad: 0x6c401620, 0x2ffae: 0x6c401820, 0x2ffaf: 0x6c401a20, - 0x2ffb0: 0x6c401c20, 0x2ffb1: 0x6c401e20, 0x2ffb2: 0x6c402020, 0x2ffb3: 0x6c5fa820, - 0x2ffb4: 0x6c5faa20, 0x2ffb5: 0x6c5fac20, 0x2ffb6: 0x6c5fae20, 0x2ffb7: 0x6c5fb020, - 0x2ffb8: 0x6c5fb220, 0x2ffb9: 0x6c5fb420, 0x2ffba: 0x6c5fb620, 0x2ffbb: 0x6c5fb820, - 0x2ffbc: 0x6c5fba20, 0x2ffbd: 0x6c5fbc20, 0x2ffbe: 0x6c5fbe20, 0x2ffbf: 0x6c5fc020, - // Block 0xbff, offset 0x2ffc0 - 0x2ffc0: 0x6c5fc220, 0x2ffc1: 0x6c5fc420, 0x2ffc2: 0x6c5fc620, 0x2ffc3: 0x6c5fc820, - 0x2ffc4: 0x6c84e420, 0x2ffc5: 0x6c84e620, 0x2ffc6: 0x6c84e820, 0x2ffc7: 0x6c84ea20, - 0x2ffc8: 0x6cdd7820, 0x2ffc9: 0x6c84ec20, 0x2ffca: 0x6c84ee20, 0x2ffcb: 0x6c84f020, - 0x2ffcc: 0x6c84f220, 0x2ffcd: 0x6c84f420, 0x2ffce: 0x6c84f620, 0x2ffcf: 0x6c84f820, - 0x2ffd0: 0x6c84fa20, 0x2ffd1: 0x6c84fc20, 0x2ffd2: 0x6c84fe20, 0x2ffd3: 0x6c850020, - 0x2ffd4: 0x6c850220, 0x2ffd5: 0x6c850420, 0x2ffd6: 0x6c850620, 0x2ffd7: 0x6c850820, - 0x2ffd8: 0x6c850a20, 0x2ffd9: 0x6c850c20, 0x2ffda: 0x6c850e20, 0x2ffdb: 0x6c851020, - 0x2ffdc: 0x6c851220, 0x2ffdd: 0x6c851420, 0x2ffde: 0x6c851620, 0x2ffdf: 0x6c851820, - 0x2ffe0: 0x6c851a20, 0x2ffe1: 0x6c851c20, 0x2ffe2: 0x6c851e20, 0x2ffe3: 0x6c852020, - 0x2ffe4: 0x6c852220, 0x2ffe5: 0x6c852420, 0x2ffe6: 0x6c852620, 0x2ffe7: 0x6c852820, - 0x2ffe8: 0x6c852a20, 0x2ffe9: 0x6c852c20, 0x2ffea: 0x6c852e20, 0x2ffeb: 0x6cae6020, - 0x2ffec: 0x6c853020, 0x2ffed: 0x6cae6220, 0x2ffee: 0x6cae6420, 0x2ffef: 0x6cae6620, - 0x2fff0: 0x6cae6820, 0x2fff1: 0x6cae6a20, 0x2fff2: 0x6cae6c20, 0x2fff3: 0x6cae6e20, - 0x2fff4: 0x6cae7020, 0x2fff5: 0x6cae7220, 0x2fff6: 0x6cae7420, 0x2fff7: 0x6cae7620, - 0x2fff8: 0x6cae7820, 0x2fff9: 0x6cae7a20, 0x2fffa: 0x6cae7c20, 0x2fffb: 0x6cae7e20, - 0x2fffc: 0x6cae8020, 0x2fffd: 0x6cae8220, 0x2fffe: 0x6cae8420, 0x2ffff: 0x6cae8620, - // Block 0xc00, offset 0x30000 - 0x30000: 0x6cae8820, 0x30001: 0x6cae8a20, 0x30002: 0x6cae8c20, 0x30003: 0x6cae8e20, - 0x30004: 0x6cae9020, 0x30005: 0x6cae9220, 0x30006: 0x6cae9420, 0x30007: 0x6cae9620, - 0x30008: 0x6cae9820, 0x30009: 0x6cae9a20, 0x3000a: 0x6cae9c20, 0x3000b: 0x6cae9e20, - 0x3000c: 0x6caea020, 0x3000d: 0x6caea220, 0x3000e: 0x6caea420, 0x3000f: 0x6caea620, - 0x30010: 0x6cdd7a20, 0x30011: 0x6cdd7c20, 0x30012: 0x6cdd7e20, 0x30013: 0x6cdd8020, - 0x30014: 0x6cdd8220, 0x30015: 0x6cdd8420, 0x30016: 0x6d0bf020, 0x30017: 0x6cdd8620, - 0x30018: 0x6cdd8820, 0x30019: 0x6cdd8a20, 0x3001a: 0x6cdd8c20, 0x3001b: 0x6cdd8e20, - 0x3001c: 0x6cdd9020, 0x3001d: 0x6cdd9220, 0x3001e: 0x6cdd9420, 0x3001f: 0x6cdd9620, - 0x30020: 0x6cdd9820, 0x30021: 0x6cdd9a20, 0x30022: 0x6cdd9c20, 0x30023: 0x6cdd9e20, - 0x30024: 0x6cdda020, 0x30025: 0x6cdda220, 0x30026: 0x6cdda420, 0x30027: 0x6cdda620, - 0x30028: 0x6cdda820, 0x30029: 0x6cddaa20, 0x3002a: 0x6cddac20, 0x3002b: 0x6cddae20, - 0x3002c: 0x6cddb020, 0x3002d: 0x6cddb220, 0x3002e: 0x6cddb420, 0x3002f: 0x6cddb620, - 0x30030: 0x6cddb820, 0x30031: 0x6cddba20, 0x30032: 0x6cddbc20, 0x30033: 0x6cddbe20, - 0x30034: 0x6cddc020, 0x30035: 0x6d0bf220, 0x30036: 0x6d0bf420, 0x30037: 0x6d0bf620, - 0x30038: 0x6d0bf820, 0x30039: 0x6d0bfa20, 0x3003a: 0x6d0bfc20, 0x3003b: 0x6d0bfe20, - 0x3003c: 0x6d0c0020, 0x3003d: 0x6d0c0220, 0x3003e: 0x6d0c0420, 0x3003f: 0x6d0c0620, - // Block 0xc01, offset 0x30040 - 0x30040: 0x6d0c0820, 0x30041: 0x6d0c0a20, 0x30042: 0x6d0c0c20, 0x30043: 0x6d0c0e20, - 0x30044: 0x6d0c1020, 0x30045: 0x6d0c1220, 0x30046: 0x6d0c1420, 0x30047: 0x6d0c1620, - 0x30048: 0x6d0c1820, 0x30049: 0x6d0c1a20, 0x3004a: 0x6d0c1c20, 0x3004b: 0x6d0c1e20, - 0x3004c: 0x6d0c2020, 0x3004d: 0x6d0c2220, 0x3004e: 0x6d0c2420, 0x3004f: 0x6d0c2620, - 0x30050: 0x6d0c2820, 0x30051: 0x6d39dc20, 0x30052: 0x6d39de20, 0x30053: 0x6d0c2a20, - 0x30054: 0x6d0c2c20, 0x30055: 0x6d0c2e20, 0x30056: 0x6d0c3020, 0x30057: 0x6d0c3220, - 0x30058: 0x6d39fc20, 0x30059: 0x6d39fe20, 0x3005a: 0x6d3a0020, 0x3005b: 0x6d3a0220, - 0x3005c: 0x6d3a0420, 0x3005d: 0x6d3a0620, 0x3005e: 0x6d3a0820, 0x3005f: 0x6d3a0a20, - 0x30060: 0x6d3a0c20, 0x30061: 0x6d3a0e20, 0x30062: 0x6d3a1020, 0x30063: 0x6d3a1220, - 0x30064: 0x6d3a1420, 0x30065: 0x6d3a1620, 0x30066: 0x6d3a1820, 0x30067: 0x6d3a1a20, - 0x30068: 0x6d3a1c20, 0x30069: 0x6d3a1e20, 0x3006a: 0x6d3a2020, 0x3006b: 0x6d39e020, - 0x3006c: 0x6d3a2220, 0x3006d: 0x6d3a2420, 0x3006e: 0x6d3a2620, 0x3006f: 0x6d3a2820, - 0x30070: 0x6d3a2a20, 0x30071: 0x6d3a2c20, 0x30072: 0x6d3a2e20, 0x30073: 0x6d3a3020, - 0x30074: 0x6d3a3220, 0x30075: 0x6d3a3420, 0x30076: 0x6d3a3620, 0x30077: 0x6d3a3820, - 0x30078: 0x6d3a3a20, 0x30079: 0x6d3a3c20, 0x3007a: 0x6d3a3e20, 0x3007b: 0x6d3a4020, - 0x3007c: 0x6d3a4220, 0x3007d: 0x6d3a4420, 0x3007e: 0x6d3a4620, 0x3007f: 0x6d3a4820, - // Block 0xc02, offset 0x30080 - 0x30080: 0x6d3a4a20, 0x30081: 0x6d3a4c20, 0x30082: 0x6d3a4e20, 0x30083: 0x6d3a5020, - 0x30084: 0x6d3a5220, 0x30085: 0x6d3a5420, 0x30086: 0x6d0c3420, 0x30087: 0x6d3a5620, - 0x30088: 0x6d3a5820, 0x30089: 0x6d3a5a20, 0x3008a: 0x6d3a5c20, 0x3008b: 0x6d3a5e20, - 0x3008c: 0x6d662820, 0x3008d: 0x6d0cba20, 0x3008e: 0x6d662a20, 0x3008f: 0x6d662c20, - 0x30090: 0x6d662e20, 0x30091: 0x6d663020, 0x30092: 0x6d663220, 0x30093: 0x6d663420, - 0x30094: 0x6d663620, 0x30095: 0x6d3b0c20, 0x30096: 0x6d663820, 0x30097: 0x6d663a20, - 0x30098: 0x6d663c20, 0x30099: 0x6d663e20, 0x3009a: 0x6d664020, 0x3009b: 0x6d664220, - 0x3009c: 0x6d664420, 0x3009d: 0x6d664620, 0x3009e: 0x6d664820, 0x3009f: 0x6d664a20, - 0x300a0: 0x6d664c20, 0x300a1: 0x6d664e20, 0x300a2: 0x6d665020, 0x300a3: 0x6d665220, - 0x300a4: 0x6d665420, 0x300a5: 0x6d665620, 0x300a6: 0x6d665820, 0x300a7: 0x6d665a20, - 0x300a8: 0x6d665c20, 0x300a9: 0x6d665e20, 0x300aa: 0x6d666020, 0x300ab: 0x6d3b0e20, - 0x300ac: 0x6d666220, 0x300ad: 0x6d666420, 0x300ae: 0x6d666620, 0x300af: 0x6d666820, - 0x300b0: 0x6d666a20, 0x300b1: 0x6d666c20, 0x300b2: 0x6d666e20, 0x300b3: 0x6d667020, - 0x300b4: 0x6d667220, 0x300b5: 0x6d667420, 0x300b6: 0x6d667620, 0x300b7: 0x6d667820, - 0x300b8: 0x6d667a20, 0x300b9: 0x6d900a20, 0x300ba: 0x6d667c20, 0x300bb: 0x6d667e20, - 0x300bc: 0x6d668020, 0x300bd: 0x6d668220, 0x300be: 0x6d668420, 0x300bf: 0x6d668620, - // Block 0xc03, offset 0x300c0 - 0x300c0: 0x6d668820, 0x300c1: 0x6d900c20, 0x300c2: 0x6d673820, 0x300c3: 0x6d900e20, - 0x300c4: 0x6d901020, 0x300c5: 0x6d901220, 0x300c6: 0x6d901420, 0x300c7: 0x6d901620, - 0x300c8: 0x6d901820, 0x300c9: 0x6d901a20, 0x300ca: 0x6d901c20, 0x300cb: 0x6d901e20, - 0x300cc: 0x6d902020, 0x300cd: 0x6d902220, 0x300ce: 0x6d902420, 0x300cf: 0x6d902620, - 0x300d0: 0x6d902820, 0x300d1: 0x6d902a20, 0x300d2: 0x6d902c20, 0x300d3: 0x6d902e20, - 0x300d4: 0x6d903020, 0x300d5: 0x6d903220, 0x300d6: 0x6d903420, 0x300d7: 0x6d903620, - 0x300d8: 0x6d903820, 0x300d9: 0x6d903a20, 0x300da: 0x6d903c20, 0x300db: 0x6d903e20, - 0x300dc: 0x6d904020, 0x300dd: 0x6d904220, 0x300de: 0x6d904420, 0x300df: 0x6d904620, - 0x300e0: 0x6d904820, 0x300e1: 0x6d904a20, 0x300e2: 0x6d904c20, 0x300e3: 0x6d904e20, - 0x300e4: 0x6d905020, 0x300e5: 0x6d905220, 0x300e6: 0x6d905420, 0x300e7: 0x6d905620, - 0x300e8: 0x6d905820, 0x300e9: 0x6d905a20, 0x300ea: 0x6db3d420, 0x300eb: 0x6db3d620, - 0x300ec: 0x6db3d820, 0x300ed: 0x6db3da20, 0x300ee: 0x6db3dc20, 0x300ef: 0x6db3de20, - 0x300f0: 0x6db3e020, 0x300f1: 0x6db3e220, 0x300f2: 0x6db3e420, 0x300f3: 0x6db3e620, - 0x300f4: 0x6db3e820, 0x300f5: 0x6db3ea20, 0x300f6: 0x6db3ec20, 0x300f7: 0x6db3ee20, - 0x300f8: 0x6db3f020, 0x300f9: 0x6db3f220, 0x300fa: 0x6db3f420, 0x300fb: 0x6db3f620, - 0x300fc: 0x6db3f820, 0x300fd: 0x6db3fa20, 0x300fe: 0x6db3fc20, 0x300ff: 0x6db3fe20, - // Block 0xc04, offset 0x30100 - 0x30100: 0x6db40020, 0x30101: 0x6db40220, 0x30102: 0x6db40420, 0x30103: 0x6db40620, - 0x30104: 0x6db40820, 0x30105: 0x6db40a20, 0x30106: 0x6db40c20, 0x30107: 0x6db40e20, - 0x30108: 0x6db41020, 0x30109: 0x6db41220, 0x3010a: 0x6db41420, 0x3010b: 0x6db41620, - 0x3010c: 0x6db41820, 0x3010d: 0x6db41a20, 0x3010e: 0x6db41c20, 0x3010f: 0x6db41e20, - 0x30110: 0x6db42020, 0x30111: 0x6db42220, 0x30112: 0x6db42420, 0x30113: 0x6dd2ba20, - 0x30114: 0x6dd2bc20, 0x30115: 0x6debe420, 0x30116: 0x6dd2be20, 0x30117: 0x6dd2ae20, - 0x30118: 0x6dd2c020, 0x30119: 0x6dd2c220, 0x3011a: 0x6dd2c420, 0x3011b: 0x6dd2c620, - 0x3011c: 0x6dd2c820, 0x3011d: 0x6dd2ca20, 0x3011e: 0x6db4c620, 0x3011f: 0x6dd2cc20, - 0x30120: 0x6dd2ce20, 0x30121: 0x6d668a20, 0x30122: 0x6dd2d020, 0x30123: 0x6dd2d220, - 0x30124: 0x6dd2d420, 0x30125: 0x6dd2d620, 0x30126: 0x6dd2d820, 0x30127: 0x6dd2da20, - 0x30128: 0x6dd2dc20, 0x30129: 0x6dd2de20, 0x3012a: 0x6dd2e020, 0x3012b: 0x6dd2e220, - 0x3012c: 0x6dd2e420, 0x3012d: 0x6dd2e620, 0x3012e: 0x6dd2e820, 0x3012f: 0x6dd2ea20, - 0x30130: 0x6dd2ec20, 0x30131: 0x6dd2ee20, 0x30132: 0x6dd2f020, 0x30133: 0x6dd2f220, - 0x30134: 0x6dd2f420, 0x30135: 0x6dd2f620, 0x30136: 0x6debf620, 0x30137: 0x6debf820, - 0x30138: 0x6debfa20, 0x30139: 0x6debfc20, 0x3013a: 0x6debfe20, 0x3013b: 0x6dec0020, - 0x3013c: 0x6dec0220, 0x3013d: 0x6dec0420, 0x3013e: 0x6dec0620, 0x3013f: 0x6dec0820, - // Block 0xc05, offset 0x30140 - 0x30140: 0x6dec0a20, 0x30141: 0x6debe220, 0x30142: 0x6dec0c20, 0x30143: 0x6dec0e20, - 0x30144: 0x6dec1020, 0x30145: 0x6dec1220, 0x30146: 0x6dec1420, 0x30147: 0x6dec1620, - 0x30148: 0x6dec1820, 0x30149: 0x6dec1a20, 0x3014a: 0x6dec1c20, 0x3014b: 0x6dec1e20, - 0x3014c: 0x6dec2020, 0x3014d: 0x6dec2220, 0x3014e: 0x6dd2f820, 0x3014f: 0x6dec2420, - 0x30150: 0x6e017020, 0x30151: 0x6e017220, 0x30152: 0x6e017420, 0x30153: 0x6e017620, - 0x30154: 0x6e017820, 0x30155: 0x6e017a20, 0x30156: 0x6e017c20, 0x30157: 0x6e017e20, - 0x30158: 0x6e018020, 0x30159: 0x6e018220, 0x3015a: 0x6e135620, 0x3015b: 0x6e135820, - 0x3015c: 0x6e135a20, 0x3015d: 0x6e135c20, 0x3015e: 0x6deca420, 0x3015f: 0x6e135e20, - 0x30160: 0x6e136020, 0x30161: 0x6e136220, 0x30162: 0x6e136420, 0x30163: 0x6e136620, - 0x30164: 0x6e136820, 0x30165: 0x6e212c20, 0x30166: 0x6e212e20, 0x30167: 0x6e213020, - 0x30168: 0x6e213220, 0x30169: 0x6e13c620, 0x3016a: 0x6e213420, 0x3016b: 0x6e13c820, - 0x3016c: 0x6e213620, 0x3016d: 0x6e2be220, 0x3016e: 0x6e2be420, 0x3016f: 0x6e2be620, - 0x30170: 0x6e2be820, 0x30171: 0x6e2bea20, 0x30172: 0x6e2bec20, 0x30173: 0x6e2bee20, - 0x30174: 0x6e2bda20, 0x30175: 0x6e342620, 0x30176: 0x6e342820, 0x30177: 0x6e342a20, - 0x30178: 0x6e342c20, 0x30179: 0x6e342e20, 0x3017a: 0x6e343020, 0x3017b: 0x6e39ec20, - 0x3017c: 0x6e3e1620, 0x3017d: 0x6e40de20, 0x3017e: 0x6e40e020, 0x3017f: 0x6e40fa20, - // Block 0xc06, offset 0x30180 - 0x30180: 0x6c14ce20, 0x30181: 0x6c5ff820, 0x30182: 0x6c5ffa20, 0x30183: 0x6c858420, - 0x30184: 0x6c858620, 0x30185: 0x6caf1c20, 0x30186: 0x6cde4420, 0x30187: 0x6cde4620, - 0x30188: 0x6cde4820, 0x30189: 0x6cde4a20, 0x3018a: 0x6e13ca20, 0x3018b: 0x6e345c20, - 0x3018c: 0x6c14d020, 0x3018d: 0x6c5ffe20, 0x3018e: 0x6c600020, 0x3018f: 0x6c859620, - 0x30190: 0x6caf2620, 0x30191: 0x6caf2820, 0x30192: 0x6caf2a20, 0x30193: 0x6caf2c20, - 0x30194: 0x6caf2e20, 0x30195: 0x6cde5220, 0x30196: 0x6cde5420, 0x30197: 0x6cde5620, - 0x30198: 0x6d0cc820, 0x30199: 0x6d0cca20, 0x3019a: 0x6d674620, 0x3019b: 0x6d674820, - 0x3019c: 0x6d674a20, 0x3019d: 0x6d674c20, 0x3019e: 0x6d912420, 0x3019f: 0x6d912620, - 0x301a0: 0x6d912820, 0x301a1: 0x6d912a20, 0x301a2: 0x6e345e20, 0x301a3: 0x6c14d220, - 0x301a4: 0x6c0a6020, 0x301a5: 0x6c404820, 0x301a6: 0x6c601220, 0x301a7: 0x6c601420, - 0x301a8: 0x6c404a20, 0x301a9: 0x6c601620, 0x301aa: 0x6c601820, 0x301ab: 0x6c601a20, - 0x301ac: 0x6c601c20, 0x301ad: 0x6c85a620, 0x301ae: 0x6c85a820, 0x301af: 0x6c85aa20, - 0x301b0: 0x6c85ac20, 0x301b1: 0x6c85ae20, 0x301b2: 0x6c85b020, 0x301b3: 0x6c85b220, - 0x301b4: 0x6c85b420, 0x301b5: 0x6c85b620, 0x301b6: 0x6c85b820, 0x301b7: 0x6c85ba20, - 0x301b8: 0x6c85bc20, 0x301b9: 0x6c85be20, 0x301ba: 0x6c85c020, 0x301bb: 0x6c85c220, - 0x301bc: 0x6c85c420, 0x301bd: 0x6c85c620, 0x301be: 0x6c85c820, 0x301bf: 0x6c85ca20, - // Block 0xc07, offset 0x301c0 - 0x301c0: 0x6c85cc20, 0x301c1: 0x6c85ce20, 0x301c2: 0x6c85d020, 0x301c3: 0x6c85d220, - 0x301c4: 0x6c85d420, 0x301c5: 0x6c85d620, 0x301c6: 0x6c85d820, 0x301c7: 0x6c85da20, - 0x301c8: 0x6caf4020, 0x301c9: 0x6caf4220, 0x301ca: 0x6caf4420, 0x301cb: 0x6caf4620, - 0x301cc: 0x6caf4820, 0x301cd: 0x6caf4a20, 0x301ce: 0x6caf4c20, 0x301cf: 0x6caf4e20, - 0x301d0: 0x6caf5020, 0x301d1: 0x6caf5220, 0x301d2: 0x6caf5420, 0x301d3: 0x6caf5620, - 0x301d4: 0x6caf5820, 0x301d5: 0x6caf5a20, 0x301d6: 0x6caf5c20, 0x301d7: 0x6caf5e20, - 0x301d8: 0x6caf6020, 0x301d9: 0x6caf6220, 0x301da: 0x6caf6420, 0x301db: 0x6caf6620, - 0x301dc: 0x6caf6820, 0x301dd: 0x6caf6a20, 0x301de: 0x6caf6c20, 0x301df: 0x6caf6e20, - 0x301e0: 0x6caf7020, 0x301e1: 0x6caf7220, 0x301e2: 0x6caf7420, 0x301e3: 0x6caf7620, - 0x301e4: 0x6caf7820, 0x301e5: 0x6caf7a20, 0x301e6: 0x6caf7c20, 0x301e7: 0x6caf7e20, - 0x301e8: 0x6caf8020, 0x301e9: 0x6caf8220, 0x301ea: 0x6caf8420, 0x301eb: 0x6caf8620, - 0x301ec: 0x6caf8820, 0x301ed: 0x6caf8a20, 0x301ee: 0x6caf8c20, 0x301ef: 0x6caf9020, - 0x301f0: 0x6caf8e20, 0x301f1: 0x6cde7820, 0x301f2: 0x6cde7a20, 0x301f3: 0x6cde7c20, - 0x301f4: 0x6cde7e20, 0x301f5: 0x6cde8020, 0x301f6: 0x6cde8220, 0x301f7: 0x6cde8420, - 0x301f8: 0x6cde8620, 0x301f9: 0x6cde8820, 0x301fa: 0x6cde8a20, 0x301fb: 0x6cde8c20, - 0x301fc: 0x6cde8e20, 0x301fd: 0x6cde9020, 0x301fe: 0x6cde9220, 0x301ff: 0x6cde9420, - // Block 0xc08, offset 0x30200 - 0x30200: 0x6cde9620, 0x30201: 0x6cde9820, 0x30202: 0x6cde9a20, 0x30203: 0x6cde9c20, - 0x30204: 0x6cde9e20, 0x30205: 0x6cdea020, 0x30206: 0x6cdea220, 0x30207: 0x6cdea420, - 0x30208: 0x6cdea620, 0x30209: 0x6cdea820, 0x3020a: 0x6d0ce020, 0x3020b: 0x6d0ce220, - 0x3020c: 0x6d0ce420, 0x3020d: 0x6d0ce620, 0x3020e: 0x6d0ce820, 0x3020f: 0x6d0cea20, - 0x30210: 0x6d0cec20, 0x30211: 0x6d0cee20, 0x30212: 0x6d0cf020, 0x30213: 0x6d0cf220, - 0x30214: 0x6d0cf420, 0x30215: 0x6d0cf620, 0x30216: 0x6d0cf820, 0x30217: 0x6cdeaa20, - 0x30218: 0x6d0cfa20, 0x30219: 0x6d0cfc20, 0x3021a: 0x6d0cfe20, 0x3021b: 0x6d0d0020, - 0x3021c: 0x6d0d0220, 0x3021d: 0x6d0d0420, 0x3021e: 0x6d0d0620, 0x3021f: 0x6d0d0820, - 0x30220: 0x6d0d0a20, 0x30221: 0x6d0d0c20, 0x30222: 0x6d3b2620, 0x30223: 0x6d0d0e20, - 0x30224: 0x6d0d1020, 0x30225: 0x6d0d1220, 0x30226: 0x6d676e20, 0x30227: 0x6d3b4820, - 0x30228: 0x6d3b4a20, 0x30229: 0x6d3b4c20, 0x3022a: 0x6d3b4e20, 0x3022b: 0x6d3b5020, - 0x3022c: 0x6d3b5220, 0x3022d: 0x6d3b5420, 0x3022e: 0x6d3b5620, 0x3022f: 0x6d3b5820, - 0x30230: 0x6d3b5a20, 0x30231: 0x6d3b5c20, 0x30232: 0x6d3b5e20, 0x30233: 0x6d3b6020, - 0x30234: 0x6d3b6220, 0x30235: 0x6d3b6420, 0x30236: 0x6d3b6620, 0x30237: 0x6d3b6820, - 0x30238: 0x6d3b6a20, 0x30239: 0x6d3b6c20, 0x3023a: 0x6d3b6e20, 0x3023b: 0x6d3b7020, - 0x3023c: 0x6d3b7220, 0x3023d: 0x6d3b7420, 0x3023e: 0x6d3b7620, 0x3023f: 0x6d3b7820, - // Block 0xc09, offset 0x30240 - 0x30240: 0x6d3b7a20, 0x30241: 0x6cdef820, 0x30242: 0x6d3b7c20, 0x30243: 0x6d3b7e20, - 0x30244: 0x6d3b8020, 0x30245: 0x6d677020, 0x30246: 0x6d677220, 0x30247: 0x6d677420, - 0x30248: 0x6d677620, 0x30249: 0x6d677820, 0x3024a: 0x6d677a20, 0x3024b: 0x6d677c20, - 0x3024c: 0x6d677e20, 0x3024d: 0x6d678020, 0x3024e: 0x6d678220, 0x3024f: 0x6d678420, - 0x30250: 0x6d678620, 0x30251: 0x6d678820, 0x30252: 0x6d678a20, 0x30253: 0x6d678c20, - 0x30254: 0x6d678e20, 0x30255: 0x6d679020, 0x30256: 0x6d679220, 0x30257: 0x6d679420, - 0x30258: 0x6d679620, 0x30259: 0x6d679820, 0x3025a: 0x6d3b8220, 0x3025b: 0x6d679a20, - 0x3025c: 0x6d679c20, 0x3025d: 0x6d679e20, 0x3025e: 0x6d913c20, 0x3025f: 0x6d913e20, - 0x30260: 0x6d914020, 0x30261: 0x6d914220, 0x30262: 0x6d914420, 0x30263: 0x6d914620, - 0x30264: 0x6d914820, 0x30265: 0x6d914a20, 0x30266: 0x6d914c20, 0x30267: 0x6d914e20, - 0x30268: 0x6d915020, 0x30269: 0x6d915220, 0x3026a: 0x6d915420, 0x3026b: 0x6d915620, - 0x3026c: 0x6d915820, 0x3026d: 0x6d915a20, 0x3026e: 0x6d915c20, 0x3026f: 0x6d915e20, - 0x30270: 0x6d916020, 0x30271: 0x6d916220, 0x30272: 0x6d916420, 0x30273: 0x6db4ee20, - 0x30274: 0x6d916620, 0x30275: 0x6db4f020, 0x30276: 0x6db4f220, 0x30277: 0x6db4f420, - 0x30278: 0x6db4f620, 0x30279: 0x6db4f820, 0x3027a: 0x6db4fa20, 0x3027b: 0x6db4fc20, - 0x3027c: 0x6db4fe20, 0x3027d: 0x6db50020, 0x3027e: 0x6db50220, 0x3027f: 0x6db50420, - // Block 0xc0a, offset 0x30280 - 0x30280: 0x6db50620, 0x30281: 0x6db50820, 0x30282: 0x6db50a20, 0x30283: 0x6db50c20, - 0x30284: 0x6db50e20, 0x30285: 0x6db51020, 0x30286: 0x6dd3b620, 0x30287: 0x6dd3b820, - 0x30288: 0x6dd3ba20, 0x30289: 0x6dd3bc20, 0x3028a: 0x6dd3be20, 0x3028b: 0x6dd3c020, - 0x3028c: 0x6dd3c220, 0x3028d: 0x6dd3c420, 0x3028e: 0x6dd3c620, 0x3028f: 0x6dd3c820, - 0x30290: 0x6dd3ca20, 0x30291: 0x6dd3cc20, 0x30292: 0x6db51420, 0x30293: 0x6dd3ce20, - 0x30294: 0x6db51220, 0x30295: 0x6dd3d020, 0x30296: 0x6decb020, 0x30297: 0x6decb220, - 0x30298: 0x6decb420, 0x30299: 0x6decb620, 0x3029a: 0x6decb820, 0x3029b: 0x6decba20, - 0x3029c: 0x6decbc20, 0x3029d: 0x6decbe20, 0x3029e: 0x6decc020, 0x3029f: 0x6decc220, - 0x302a0: 0x6decc420, 0x302a1: 0x6decc620, 0x302a2: 0x6decc820, 0x302a3: 0x6e01ec20, - 0x302a4: 0x6e01ee20, 0x302a5: 0x6e01f020, 0x302a6: 0x6e01f220, 0x302a7: 0x6e01f420, - 0x302a8: 0x6e01f620, 0x302a9: 0x6e13d220, 0x302aa: 0x6e13d420, 0x302ab: 0x6e13d620, - 0x302ac: 0x6e13d820, 0x302ad: 0x6e13da20, 0x302ae: 0x6e13dc20, 0x302af: 0x6e218e20, - 0x302b0: 0x6e219020, 0x302b1: 0x6e219220, 0x302b2: 0x6e219420, 0x302b3: 0x6e2c2620, - 0x302b4: 0x6e2c2820, 0x302b5: 0x6e346420, 0x302b6: 0x6e2c2a20, 0x302b7: 0x6e346620, - 0x302b8: 0x6e3a0c20, 0x302b9: 0x6e3a0e20, 0x302ba: 0x6e3a1020, 0x302bb: 0x6e3a1220, - 0x302bc: 0x6e3a1420, 0x302bd: 0x6e40fc20, 0x302be: 0x6c14d420, 0x302bf: 0x6c14d620, - // Block 0xc0b, offset 0x302c0 - 0x302c0: 0x6c14d820, 0x302c1: 0x6c606620, 0x302c2: 0x6cafe420, 0x302c3: 0x6cdefe20, - 0x302c4: 0x6cdf0020, 0x302c5: 0x6d0d7620, 0x302c6: 0x6dd40e20, 0x302c7: 0x6decfe20, - 0x302c8: 0x6ded0020, 0x302c9: 0x6e2c3820, 0x302ca: 0x6e3a2020, 0x302cb: 0x6c26a020, - 0x302cc: 0x6c606e20, 0x302cd: 0x6c862e20, 0x302ce: 0x6c863020, 0x302cf: 0x6caff420, - 0x302d0: 0x6caff620, 0x302d1: 0x6caff820, 0x302d2: 0x6caffa20, 0x302d3: 0x6caffc20, - 0x302d4: 0x6caffe20, 0x302d5: 0x6cdf1220, 0x302d6: 0x6ca6aa20, 0x302d7: 0x6cdf1420, - 0x302d8: 0x6cdf1620, 0x302d9: 0x6cdf0820, 0x302da: 0x6cdf1820, 0x302db: 0x6d0d8020, - 0x302dc: 0x6d0d8220, 0x302dd: 0x6d3bf020, 0x302de: 0x6d3bf220, 0x302df: 0x6d3bf420, - 0x302e0: 0x6d3bf620, 0x302e1: 0x6d3bf820, 0x302e2: 0x6d67fc20, 0x302e3: 0x6d67fe20, - 0x302e4: 0x6d680020, 0x302e5: 0x6d680220, 0x302e6: 0x6d91ca20, 0x302e7: 0x6d91cc20, - 0x302e8: 0x6d91ce20, 0x302e9: 0x6d683220, 0x302ea: 0x6d91d020, 0x302eb: 0x6db58620, - 0x302ec: 0x6db58820, 0x302ed: 0x6db58a20, 0x302ee: 0x6db58c20, 0x302ef: 0x6db58e20, - 0x302f0: 0x6dd41820, 0x302f1: 0x6dd41a20, 0x302f2: 0x6dd41c20, 0x302f3: 0x6dd41e20, - 0x302f4: 0x6ded0e20, 0x302f5: 0x6ded1020, 0x302f6: 0x6ded1220, 0x302f7: 0x6ded1420, - 0x302f8: 0x6ded1620, 0x302f9: 0x6e021a20, 0x302fa: 0x6e021c20, 0x302fb: 0x6e021e20, - 0x302fc: 0x6e13fe20, 0x302fd: 0x6e140020, 0x302fe: 0x6e21a220, 0x302ff: 0x6e21a420, - // Block 0xc0c, offset 0x30300 - 0x30300: 0x6e3a2420, 0x30301: 0x6c050c20, 0x30302: 0x6c14da20, 0x30303: 0x6c26a220, - 0x30304: 0x6c407220, 0x30305: 0x6c407420, 0x30306: 0x6c5adc20, 0x30307: 0x6c607220, - 0x30308: 0x6c607420, 0x30309: 0x6c607620, 0x3030a: 0x6c863e20, 0x3030b: 0x6cb01c20, - 0x3030c: 0x6cdf3420, 0x3030d: 0x6cdf3620, 0x3030e: 0x6d0dac20, 0x3030f: 0x6d3c1e20, - 0x30310: 0x6d683420, 0x30311: 0x6d683620, 0x30312: 0x6c26a620, 0x30313: 0x6c607c20, - 0x30314: 0x6c607e20, 0x30315: 0x6cb02020, 0x30316: 0x6cb02220, 0x30317: 0x6cb02420, - 0x30318: 0x6cb02620, 0x30319: 0x6cb02820, 0x3031a: 0x6cdf3820, 0x3031b: 0x6cdf3a20, - 0x3031c: 0x6d0db620, 0x3031d: 0x6cdf3c20, 0x3031e: 0x6cdf3e20, 0x3031f: 0x6d0db820, - 0x30320: 0x6d0dba20, 0x30321: 0x6d0dbc20, 0x30322: 0x6d0dbe20, 0x30323: 0x6d0dc020, - 0x30324: 0x6d0dc220, 0x30325: 0x6d0dc420, 0x30326: 0x6d0dc620, 0x30327: 0x6d0dc820, - 0x30328: 0x6d3c2220, 0x30329: 0x6d3c2420, 0x3032a: 0x6d3c2620, 0x3032b: 0x6d3c2820, - 0x3032c: 0x6d684420, 0x3032d: 0x6d684620, 0x3032e: 0x6d684820, 0x3032f: 0x6d684a20, - 0x30330: 0x6d687a20, 0x30331: 0x6d920a20, 0x30332: 0x6db5ac20, 0x30333: 0x6db5ae20, - 0x30334: 0x6dd43820, 0x30335: 0x6ded2a20, 0x30336: 0x6ded2c20, 0x30337: 0x6e023220, - 0x30338: 0x6e023420, 0x30339: 0x6e023620, 0x3033a: 0x6e140a20, 0x3033b: 0x6e21b420, - 0x3033c: 0x6e21b620, 0x3033d: 0x6e2c3c20, 0x3033e: 0x6e2c3e20, 0x3033f: 0x6e3a3820, - // Block 0xc0d, offset 0x30340 - 0x30340: 0x6c26aa20, 0x30341: 0x6c26ac20, 0x30342: 0x6c608c20, 0x30343: 0x6c608e20, - 0x30344: 0x6c609020, 0x30345: 0x6c609220, 0x30346: 0x6c609420, 0x30347: 0x6c609620, - 0x30348: 0x6c609820, 0x30349: 0x6c864e20, 0x3034a: 0x6c865020, 0x3034b: 0x6c865220, - 0x3034c: 0x6c865420, 0x3034d: 0x6c865620, 0x3034e: 0x6c865820, 0x3034f: 0x6c865a20, - 0x30350: 0x6c865c20, 0x30351: 0x6c865e20, 0x30352: 0x6c866020, 0x30353: 0x6c866220, - 0x30354: 0x6c866420, 0x30355: 0x6c866620, 0x30356: 0x6c866820, 0x30357: 0x6c866a20, - 0x30358: 0x6c866c20, 0x30359: 0x6c866e20, 0x3035a: 0x6c867020, 0x3035b: 0x6cb07820, - 0x3035c: 0x6cb07a20, 0x3035d: 0x6cb07c20, 0x3035e: 0x6cb07e20, 0x3035f: 0x6cb08020, - 0x30360: 0x6cb08220, 0x30361: 0x6cb08420, 0x30362: 0x6cb08620, 0x30363: 0x6cb08820, - 0x30364: 0x6cb08a20, 0x30365: 0x6cb08c20, 0x30366: 0x6cb08e20, 0x30367: 0x6cb09020, - 0x30368: 0x6cb09220, 0x30369: 0x6cb09420, 0x3036a: 0x6cb09620, 0x3036b: 0x6cb09820, - 0x3036c: 0x6cb09a20, 0x3036d: 0x6cb09c20, 0x3036e: 0x6cb09e20, 0x3036f: 0x6cb0a020, - 0x30370: 0x6cb0a220, 0x30371: 0x6cb0a420, 0x30372: 0x6cb0a620, 0x30373: 0x6cb0a820, - 0x30374: 0x6cdf8020, 0x30375: 0x6cdf8220, 0x30376: 0x6cdf8420, 0x30377: 0x6cdf8620, - 0x30378: 0x6cdf8820, 0x30379: 0x6cdf8a20, 0x3037a: 0x6cdf8c20, 0x3037b: 0x6cdf8e20, - 0x3037c: 0x6cdf9020, 0x3037d: 0x6cdf9220, 0x3037e: 0x6d0ddc20, 0x3037f: 0x6d0dde20, - // Block 0xc0e, offset 0x30380 - 0x30380: 0x6cdf9420, 0x30381: 0x6cdf9620, 0x30382: 0x6cdf9820, 0x30383: 0x6cdf9a20, - 0x30384: 0x6cdf9c20, 0x30385: 0x6cdf9e20, 0x30386: 0x6cdfa020, 0x30387: 0x6cdfa220, - 0x30388: 0x6cdfa420, 0x30389: 0x6cdfa620, 0x3038a: 0x6cdfa820, 0x3038b: 0x6cdfaa20, - 0x3038c: 0x6cdfac20, 0x3038d: 0x6cdfae20, 0x3038e: 0x6cdfb020, 0x3038f: 0x6cdfb220, - 0x30390: 0x6cdfb420, 0x30391: 0x6cdfb620, 0x30392: 0x6cdfb820, 0x30393: 0x6cdfba20, - 0x30394: 0x6cdfbc20, 0x30395: 0x6cdfbe20, 0x30396: 0x6cdfc020, 0x30397: 0x6cdfc220, - 0x30398: 0x6cdfc420, 0x30399: 0x6cdfc620, 0x3039a: 0x6cdfc820, 0x3039b: 0x6cdfca20, - 0x3039c: 0x6cdfcc20, 0x3039d: 0x6cdfce20, 0x3039e: 0x6cdfd020, 0x3039f: 0x6cdfd220, - 0x303a0: 0x6cdfd420, 0x303a1: 0x6d0df220, 0x303a2: 0x6d0df420, 0x303a3: 0x6d0df620, - 0x303a4: 0x6d0df820, 0x303a5: 0x6d0dfa20, 0x303a6: 0x6d0dfc20, 0x303a7: 0x6d0dfe20, - 0x303a8: 0x6d0e0020, 0x303a9: 0x6d0e0220, 0x303aa: 0x6d0e0420, 0x303ab: 0x6d0e0620, - 0x303ac: 0x6d0e0820, 0x303ad: 0x6d0e0a20, 0x303ae: 0x6d0e0c20, 0x303af: 0x6d0e0e20, - 0x303b0: 0x6d0e1020, 0x303b1: 0x6d0e1220, 0x303b2: 0x6d0e1420, 0x303b3: 0x6d0e1620, - 0x303b4: 0x6d0e1820, 0x303b5: 0x6d0e1a20, 0x303b6: 0x6d0e1c20, 0x303b7: 0x6d0e1e20, - 0x303b8: 0x6d0e2020, 0x303b9: 0x6d0e2220, 0x303ba: 0x6d0e2420, 0x303bb: 0x6d0e2620, - 0x303bc: 0x6d0e2820, 0x303bd: 0x6d0e2a20, 0x303be: 0x6d0e2c20, 0x303bf: 0x6d0e2e20, - // Block 0xc0f, offset 0x303c0 - 0x303c0: 0x6d0e3020, 0x303c1: 0x6d0e3220, 0x303c2: 0x6d0e3420, 0x303c3: 0x6d0e3620, - 0x303c4: 0x6d0e3820, 0x303c5: 0x6d0e3a20, 0x303c6: 0x6d0e3c20, 0x303c7: 0x6d0e3e20, - 0x303c8: 0x6d0e4020, 0x303c9: 0x6d0e4220, 0x303ca: 0x6d0e4420, 0x303cb: 0x6d3c5a20, - 0x303cc: 0x6d3c5c20, 0x303cd: 0x6d3c5e20, 0x303ce: 0x6d3c6020, 0x303cf: 0x6d3c6220, - 0x303d0: 0x6d3c6420, 0x303d1: 0x6d3c6620, 0x303d2: 0x6d3c6820, 0x303d3: 0x6d3c6a20, - 0x303d4: 0x6d3c6c20, 0x303d5: 0x6d687c20, 0x303d6: 0x6d3c6e20, 0x303d7: 0x6d3c7020, - 0x303d8: 0x6d3c7220, 0x303d9: 0x6d3c7420, 0x303da: 0x6d3c7620, 0x303db: 0x6d3c7820, - 0x303dc: 0x6d3c7a20, 0x303dd: 0x6d3c7c20, 0x303de: 0x6d3c7e20, 0x303df: 0x6d3c8020, - 0x303e0: 0x6d0e4620, 0x303e1: 0x6d3c8220, 0x303e2: 0x6d3c8420, 0x303e3: 0x6d3c8620, - 0x303e4: 0x6d3c8820, 0x303e5: 0x6d3c8a20, 0x303e6: 0x6d3c8c20, 0x303e7: 0x6d3c8e20, - 0x303e8: 0x6d3c9020, 0x303e9: 0x6d3c9220, 0x303ea: 0x6d3c9420, 0x303eb: 0x6d3c9620, - 0x303ec: 0x6d3c9820, 0x303ed: 0x6d3c9a20, 0x303ee: 0x6d3c9c20, 0x303ef: 0x6d689e20, - 0x303f0: 0x6d68a020, 0x303f1: 0x6d68a220, 0x303f2: 0x6d68a420, 0x303f3: 0x6d68a620, - 0x303f4: 0x6d68a820, 0x303f5: 0x6d68aa20, 0x303f6: 0x6d68ac20, 0x303f7: 0x6d68ae20, - 0x303f8: 0x6d68b020, 0x303f9: 0x6d68b220, 0x303fa: 0x6d68b420, 0x303fb: 0x6d68b620, - 0x303fc: 0x6d68b820, 0x303fd: 0x6d68ba20, 0x303fe: 0x6d68bc20, 0x303ff: 0x6d68be20, - // Block 0xc10, offset 0x30400 - 0x30400: 0x6d68c020, 0x30401: 0x6d68c220, 0x30402: 0x6d68c420, 0x30403: 0x6d68c620, - 0x30404: 0x6d68c820, 0x30405: 0x6d68ca20, 0x30406: 0x6d68cc20, 0x30407: 0x6d68ce20, - 0x30408: 0x6d68d020, 0x30409: 0x6d68d220, 0x3040a: 0x6d68d420, 0x3040b: 0x6d68d620, - 0x3040c: 0x6d68d820, 0x3040d: 0x6d68da20, 0x3040e: 0x6d68dc20, 0x3040f: 0x6d68de20, - 0x30410: 0x6d68e020, 0x30411: 0x6d68e220, 0x30412: 0x6d68e420, 0x30413: 0x6d68e620, - 0x30414: 0x6d68e820, 0x30415: 0x6d68ea20, 0x30416: 0x6d68ec20, 0x30417: 0x6d68ee20, - 0x30418: 0x6d68f020, 0x30419: 0x6d68f220, 0x3041a: 0x6d68f420, 0x3041b: 0x6d697620, - 0x3041c: 0x6d923c20, 0x3041d: 0x6d923e20, 0x3041e: 0x6d924020, 0x3041f: 0x6d924220, - 0x30420: 0x6d924420, 0x30421: 0x6d924620, 0x30422: 0x6d924820, 0x30423: 0x6d924a20, - 0x30424: 0x6d924c20, 0x30425: 0x6d924e20, 0x30426: 0x6d925020, 0x30427: 0x6d925220, - 0x30428: 0x6d925420, 0x30429: 0x6d68f620, 0x3042a: 0x6d925620, 0x3042b: 0x6d925820, - 0x3042c: 0x6d925a20, 0x3042d: 0x6d925c20, 0x3042e: 0x6d925e20, 0x3042f: 0x6d926020, - 0x30430: 0x6d926220, 0x30431: 0x6d926420, 0x30432: 0x6d926620, 0x30433: 0x6d926820, - 0x30434: 0x6d926a20, 0x30435: 0x6d926c20, 0x30436: 0x6d926e20, 0x30437: 0x6d927020, - 0x30438: 0x6d697820, 0x30439: 0x6d927220, 0x3043a: 0x6d927420, 0x3043b: 0x6d927620, - 0x3043c: 0x6d927820, 0x3043d: 0x6d927a20, 0x3043e: 0x6d927c20, 0x3043f: 0x6d927e20, - // Block 0xc11, offset 0x30440 - 0x30440: 0x6d928020, 0x30441: 0x6d928220, 0x30442: 0x6d928420, 0x30443: 0x6d928620, - 0x30444: 0x6db5e020, 0x30445: 0x6db5e220, 0x30446: 0x6db5e420, 0x30447: 0x6db5e620, - 0x30448: 0x6db5e820, 0x30449: 0x6db5ea20, 0x3044a: 0x6db5ec20, 0x3044b: 0x6db5ee20, - 0x3044c: 0x6db5f020, 0x3044d: 0x6db5f220, 0x3044e: 0x6db5f420, 0x3044f: 0x6db5f620, - 0x30450: 0x6db5f820, 0x30451: 0x6db5fa20, 0x30452: 0x6db5fc20, 0x30453: 0x6db5fe20, - 0x30454: 0x6d92fc20, 0x30455: 0x6db60020, 0x30456: 0x6db60220, 0x30457: 0x6db60420, - 0x30458: 0x6db60620, 0x30459: 0x6db60820, 0x3045a: 0x6db60a20, 0x3045b: 0x6db60c20, - 0x3045c: 0x6db60e20, 0x3045d: 0x6db61020, 0x3045e: 0x6db61220, 0x3045f: 0x6db61420, - 0x30460: 0x6db61620, 0x30461: 0x6db61820, 0x30462: 0x6db61a20, 0x30463: 0x6dd46220, - 0x30464: 0x6dd46420, 0x30465: 0x6dd46620, 0x30466: 0x6dd46820, 0x30467: 0x6dd46a20, - 0x30468: 0x6dd46c20, 0x30469: 0x6dd46e20, 0x3046a: 0x6dd47020, 0x3046b: 0x6dd47220, - 0x3046c: 0x6dd47420, 0x3046d: 0x6dd47620, 0x3046e: 0x6dd47820, 0x3046f: 0x6dd47a20, - 0x30470: 0x6dd47c20, 0x30471: 0x6dd47e20, 0x30472: 0x6dd48020, 0x30473: 0x6dd48220, - 0x30474: 0x6dd48420, 0x30475: 0x6dd48620, 0x30476: 0x6dd48820, 0x30477: 0x6dd48a20, - 0x30478: 0x6dd48c20, 0x30479: 0x6dd48e20, 0x3047a: 0x6dd49020, 0x3047b: 0x6dd49220, - 0x3047c: 0x6dd49420, 0x3047d: 0x6dd49620, 0x3047e: 0x6dd49820, 0x3047f: 0x6ded5020, - // Block 0xc12, offset 0x30480 - 0x30480: 0x6ded5220, 0x30481: 0x6ded5420, 0x30482: 0x6ded5620, 0x30483: 0x6ded5820, - 0x30484: 0x6ded5a20, 0x30485: 0x6e141420, 0x30486: 0x6ded5c20, 0x30487: 0x6dd4fa20, - 0x30488: 0x6ded5e20, 0x30489: 0x6ded6020, 0x3048a: 0x6ded6220, 0x3048b: 0x6ded6420, - 0x3048c: 0x6ded6620, 0x3048d: 0x6e024e20, 0x3048e: 0x6ded6820, 0x3048f: 0x6ded6a20, - 0x30490: 0x6ded6c20, 0x30491: 0x6ded6e20, 0x30492: 0x6ded7020, 0x30493: 0x6ded7220, - 0x30494: 0x6ded7420, 0x30495: 0x6ded7620, 0x30496: 0x6ded7820, 0x30497: 0x6ded7a20, - 0x30498: 0x6ded7c20, 0x30499: 0x6ded7e20, 0x3049a: 0x6ded8020, 0x3049b: 0x6ded8220, - 0x3049c: 0x6ded8420, 0x3049d: 0x6e025020, 0x3049e: 0x6e025220, 0x3049f: 0x6e025420, - 0x304a0: 0x6e025620, 0x304a1: 0x6e025820, 0x304a2: 0x6e025a20, 0x304a3: 0x6e025c20, - 0x304a4: 0x6e025e20, 0x304a5: 0x6e026020, 0x304a6: 0x6e026220, 0x304a7: 0x6e026420, - 0x304a8: 0x6e026620, 0x304a9: 0x6e026820, 0x304aa: 0x6e026a20, 0x304ab: 0x6e026c20, - 0x304ac: 0x6e026e20, 0x304ad: 0x6e027020, 0x304ae: 0x6e027220, 0x304af: 0x6e027420, - 0x304b0: 0x6e027620, 0x304b1: 0x6e027820, 0x304b2: 0x6e027a20, 0x304b3: 0x6e142220, - 0x304b4: 0x6e142420, 0x304b5: 0x6e142620, 0x304b6: 0x6e142820, 0x304b7: 0x6e142a20, - 0x304b8: 0x6e142c20, 0x304b9: 0x6e142e20, 0x304ba: 0x6e143020, 0x304bb: 0x6e143220, - 0x304bc: 0x6e143420, 0x304bd: 0x6e143620, 0x304be: 0x6e21c820, 0x304bf: 0x6e21ca20, - // Block 0xc13, offset 0x304c0 - 0x304c0: 0x6e21cc20, 0x304c1: 0x6e21ce20, 0x304c2: 0x6e21d020, 0x304c3: 0x6e21d220, - 0x304c4: 0x6e21d420, 0x304c5: 0x6e21d620, 0x304c6: 0x6e221420, 0x304c7: 0x6e2c4620, - 0x304c8: 0x6e2c4820, 0x304c9: 0x6e2c4a20, 0x304ca: 0x6e2c4c20, 0x304cb: 0x6e2c4e20, - 0x304cc: 0x6e2c5020, 0x304cd: 0x6e2c5220, 0x304ce: 0x6e2c5420, 0x304cf: 0x6e2c5620, - 0x304d0: 0x6e2c5820, 0x304d1: 0x6e347c20, 0x304d2: 0x6e347e20, 0x304d3: 0x6e348020, - 0x304d4: 0x6e348220, 0x304d5: 0x6e348420, 0x304d6: 0x6e348620, 0x304d7: 0x6e3a3c20, - 0x304d8: 0x6e3a3e20, 0x304d9: 0x6e3a4020, 0x304da: 0x6e3e3420, 0x304db: 0x6e3e3620, - 0x304dc: 0x6e410420, 0x304dd: 0x6e410620, 0x304de: 0x6e410820, 0x304df: 0x6e448020, - 0x304e0: 0x6c00c820, 0x304e1: 0x6c050e20, 0x304e2: 0x6c051020, 0x304e3: 0x6c051220, - 0x304e4: 0x6c051420, 0x304e5: 0x6c051620, 0x304e6: 0x6c0a6420, 0x304e7: 0x6c0a6620, - 0x304e8: 0x6c0a6820, 0x304e9: 0x6c0a6a20, 0x304ea: 0x6c0a6c20, 0x304eb: 0x6c0a6e20, - 0x304ec: 0x6c0a7020, 0x304ed: 0x6c0a7220, 0x304ee: 0x6c0a7420, 0x304ef: 0x6c0a7620, - 0x304f0: 0x6c0a7820, 0x304f1: 0x6c0a7a20, 0x304f2: 0x6c14dc20, 0x304f3: 0x6c14de20, - 0x304f4: 0x6c14e020, 0x304f5: 0x6c14e220, 0x304f6: 0x6c14e420, 0x304f7: 0x6c14e620, - 0x304f8: 0x6c14e820, 0x304f9: 0x6c14ea20, 0x304fa: 0x6c14ec20, 0x304fb: 0x6c14ee20, - 0x304fc: 0x6c14f020, 0x304fd: 0x6c14f220, 0x304fe: 0x6c14f420, 0x304ff: 0x6c14f620, - // Block 0xc14, offset 0x30500 - 0x30500: 0x6c14f820, 0x30501: 0x6c26b220, 0x30502: 0x6c26b420, 0x30503: 0x6c26b620, - 0x30504: 0x6c26b820, 0x30505: 0x6c26ba20, 0x30506: 0x6c26bc20, 0x30507: 0x6c26be20, - 0x30508: 0x6c26c020, 0x30509: 0x6c26c220, 0x3050a: 0x6c26c420, 0x3050b: 0x6c26c620, - 0x3050c: 0x6c26c820, 0x3050d: 0x6c26ca20, 0x3050e: 0x6c26cc20, 0x3050f: 0x6c26ce20, - 0x30510: 0x6c26d020, 0x30511: 0x6c26d220, 0x30512: 0x6c26d420, 0x30513: 0x6c407e20, - 0x30514: 0x6c408020, 0x30515: 0x6c408220, 0x30516: 0x6c408420, 0x30517: 0x6c408620, - 0x30518: 0x6c408820, 0x30519: 0x6c408a20, 0x3051a: 0x6c408c20, 0x3051b: 0x6c408e20, - 0x3051c: 0x6c409020, 0x3051d: 0x6c409220, 0x3051e: 0x6c409420, 0x3051f: 0x6c409620, - 0x30520: 0x6c409820, 0x30521: 0x6c409a20, 0x30522: 0x6c409c20, 0x30523: 0x6c409e20, - 0x30524: 0x6c40a020, 0x30525: 0x6c40a220, 0x30526: 0x6c40a420, 0x30527: 0x6c40a620, - 0x30528: 0x6c40a820, 0x30529: 0x6c40aa20, 0x3052a: 0x6c609c20, 0x3052b: 0x6c609e20, - 0x3052c: 0x6c60a020, 0x3052d: 0x6c60a220, 0x3052e: 0x6c60a420, 0x3052f: 0x6c60a620, - 0x30530: 0x6c60a820, 0x30531: 0x6c60aa20, 0x30532: 0x6c60ac20, 0x30533: 0x6c60ae20, - 0x30534: 0x6c60b020, 0x30535: 0x6c60b220, 0x30536: 0x6c60b420, 0x30537: 0x6c869020, - 0x30538: 0x6c869220, 0x30539: 0x6c869420, 0x3053a: 0x6c869620, 0x3053b: 0x6c869820, - 0x3053c: 0x6c869a20, 0x3053d: 0x6c869c20, 0x3053e: 0x6c869e20, 0x3053f: 0x6c86a020, - // Block 0xc15, offset 0x30540 - 0x30540: 0x6c86a220, 0x30541: 0x6c86a420, 0x30542: 0x6c86a620, 0x30543: 0x6c86a820, - 0x30544: 0x6c86aa20, 0x30545: 0x6c86ac20, 0x30546: 0x6c86ae20, 0x30547: 0x6c86b020, - 0x30548: 0x6c86b220, 0x30549: 0x6c86b420, 0x3054a: 0x6c86b620, 0x3054b: 0x6cb10c20, - 0x3054c: 0x6cb10e20, 0x3054d: 0x6cb11020, 0x3054e: 0x6cb11220, 0x3054f: 0x6cb11420, - 0x30550: 0x6cb11620, 0x30551: 0x6cb11820, 0x30552: 0x6cb11a20, 0x30553: 0x6cb11c20, - 0x30554: 0x6cb11e20, 0x30555: 0x6cb12020, 0x30556: 0x6cb12220, 0x30557: 0x6cb12420, - 0x30558: 0x6cb12620, 0x30559: 0x6cb12820, 0x3055a: 0x6cb12a20, 0x3055b: 0x6cb12c20, - 0x3055c: 0x6cb12e20, 0x3055d: 0x6cb13020, 0x3055e: 0x6cb13220, 0x3055f: 0x6ce02c20, - 0x30560: 0x6ce02e20, 0x30561: 0x6ce03020, 0x30562: 0x6ce03220, 0x30563: 0x6ce03420, - 0x30564: 0x6ce03620, 0x30565: 0x6ce03820, 0x30566: 0x6ce03a20, 0x30567: 0x6ce03c20, - 0x30568: 0x6d0eb420, 0x30569: 0x6d0eb620, 0x3056a: 0x6d0eb820, 0x3056b: 0x6d0eba20, - 0x3056c: 0x6d0ebc20, 0x3056d: 0x6d3d0620, 0x3056e: 0x6d3d0820, 0x3056f: 0x6d3d0a20, - 0x30570: 0x6d3d0c20, 0x30571: 0x6d3d0e20, 0x30572: 0x6d3d1020, 0x30573: 0x6d697c20, - 0x30574: 0x6d697e20, 0x30575: 0x6d698020, 0x30576: 0x6dede020, 0x30577: 0x6c26e620, - 0x30578: 0x6c86c620, 0x30579: 0x6cb14020, 0x3057a: 0x6cb14220, 0x3057b: 0x6cb14420, - 0x3057c: 0x6d0ec220, 0x3057d: 0x6d3d1820, 0x3057e: 0x6d698620, 0x3057f: 0x6db6a020, - // Block 0xc16, offset 0x30580 - 0x30580: 0x6db6a220, 0x30581: 0x6db6a420, 0x30582: 0x6dd50020, 0x30583: 0x6dede220, - 0x30584: 0x6e221820, 0x30585: 0x6e2c7820, 0x30586: 0x6c26ea20, 0x30587: 0x6c86ce20, - 0x30588: 0x6c86d020, 0x30589: 0x6cb15220, 0x3058a: 0x6d0ecc20, 0x3058b: 0x6d0ece20, - 0x3058c: 0x6d699820, 0x3058d: 0x6d699a20, 0x3058e: 0x6d699c20, 0x3058f: 0x6db6b420, - 0x30590: 0x6dd50420, 0x30591: 0x6e02ba20, 0x30592: 0x6e3a5620, 0x30593: 0x6e411420, - 0x30594: 0x6e431e20, 0x30595: 0x6c26ec20, 0x30596: 0x6c40b820, 0x30597: 0x6c86da20, - 0x30598: 0x6cb15c20, 0x30599: 0x6cb15e20, 0x3059a: 0x6cb16020, 0x3059b: 0x6cb16220, - 0x3059c: 0x6cb16420, 0x3059d: 0x6cb16620, 0x3059e: 0x6ce05e20, 0x3059f: 0x6ce06020, - 0x305a0: 0x6ce06220, 0x305a1: 0x6ce06420, 0x305a2: 0x6d0ed820, 0x305a3: 0x6d0eda20, - 0x305a4: 0x6d0edc20, 0x305a5: 0x6d0ede20, 0x305a6: 0x6d0ee020, 0x305a7: 0x6d3d2c20, - 0x305a8: 0x6d3d2e20, 0x305a9: 0x6d3d3020, 0x305aa: 0x6d3d3220, 0x305ab: 0x6d932420, - 0x305ac: 0x6d69da20, 0x305ad: 0x6d932620, 0x305ae: 0x6d932820, 0x305af: 0x6db6c620, - 0x305b0: 0x6db6c820, 0x305b1: 0x6db6ca20, 0x305b2: 0x6db6cc20, 0x305b3: 0x6db6ce20, - 0x305b4: 0x6dd51620, 0x305b5: 0x6dd51820, 0x305b6: 0x6dee1620, 0x305b7: 0x6dee0a20, - 0x305b8: 0x6c26f220, 0x305b9: 0x6c86e420, 0x305ba: 0x6c86e620, 0x305bb: 0x6c86e820, - 0x305bc: 0x6cb18020, 0x305bd: 0x6cb18220, 0x305be: 0x6ce07e20, 0x305bf: 0x6ce08020, - // Block 0xc17, offset 0x305c0 - 0x305c0: 0x6ce08220, 0x305c1: 0x6ce08420, 0x305c2: 0x6ce08620, 0x305c3: 0x6ce08820, - 0x305c4: 0x6d0efe20, 0x305c5: 0x6d0f0020, 0x305c6: 0x6d0f0220, 0x305c7: 0x6d0f0420, - 0x305c8: 0x6d0f0620, 0x305c9: 0x6d0f0820, 0x305ca: 0x6d0f0a20, 0x305cb: 0x6d3d5020, - 0x305cc: 0x6d3d5220, 0x305cd: 0x6d3d5420, 0x305ce: 0x6d69e020, 0x305cf: 0x6d69e220, - 0x305d0: 0x6d934220, 0x305d1: 0x6d934420, 0x305d2: 0x6d934620, 0x305d3: 0x6d934820, - 0x305d4: 0x6db6e420, 0x305d5: 0x6db6e620, 0x305d6: 0x6db6e820, 0x305d7: 0x6dd52c20, - 0x305d8: 0x6dd52e20, 0x305d9: 0x6dd53020, 0x305da: 0x6dee2020, 0x305db: 0x6e3a6620, - 0x305dc: 0x6e411c20, 0x305dd: 0x6c26f420, 0x305de: 0x6c60c820, 0x305df: 0x6c60ca20, - 0x305e0: 0x6c60cc20, 0x305e1: 0x6c86f020, 0x305e2: 0x6c86f220, 0x305e3: 0x6c86f420, - 0x305e4: 0x6c86f620, 0x305e5: 0x6cb19820, 0x305e6: 0x6cb19a20, 0x305e7: 0x6cb19c20, - 0x305e8: 0x6cb19e20, 0x305e9: 0x6cb1a020, 0x305ea: 0x6cb1a220, 0x305eb: 0x6cb1a420, - 0x305ec: 0x6cb1a620, 0x305ed: 0x6cb1a820, 0x305ee: 0x6cb1aa20, 0x305ef: 0x6ce0bc20, - 0x305f0: 0x6ce0be20, 0x305f1: 0x6ce0c020, 0x305f2: 0x6d0f2620, 0x305f3: 0x6ce0c220, - 0x305f4: 0x6ce0c420, 0x305f5: 0x6ce0c620, 0x305f6: 0x6ce0c820, 0x305f7: 0x6ce0ca20, - 0x305f8: 0x6ce0cc20, 0x305f9: 0x6ce0ce20, 0x305fa: 0x6ce0d020, 0x305fb: 0x6ce0d220, - 0x305fc: 0x6ce0d420, 0x305fd: 0x6ce0d620, 0x305fe: 0x6ce0d820, 0x305ff: 0x6ce0da20, - // Block 0xc18, offset 0x30600 - 0x30600: 0x6ce0dc20, 0x30601: 0x6ce0de20, 0x30602: 0x6d0f2e20, 0x30603: 0x6d0f3020, - 0x30604: 0x6d0f3220, 0x30605: 0x6d0f3420, 0x30606: 0x6d0f3620, 0x30607: 0x6d0f3820, - 0x30608: 0x6d0f3a20, 0x30609: 0x6d0f3c20, 0x3060a: 0x6d0f3e20, 0x3060b: 0x6d0f4020, - 0x3060c: 0x6d0f4220, 0x3060d: 0x6d0f4420, 0x3060e: 0x6d0f4620, 0x3060f: 0x6d3d7c20, - 0x30610: 0x6d3d7e20, 0x30611: 0x6d3d8020, 0x30612: 0x6d3d8220, 0x30613: 0x6d3d8420, - 0x30614: 0x6d3d8620, 0x30615: 0x6d3d8820, 0x30616: 0x6d3d8a20, 0x30617: 0x6d3d8c20, - 0x30618: 0x6d3d8e20, 0x30619: 0x6d6a1420, 0x3061a: 0x6d6a1620, 0x3061b: 0x6d6a1820, - 0x3061c: 0x6d6a1a20, 0x3061d: 0x6d6a1c20, 0x3061e: 0x6d6a1e20, 0x3061f: 0x6d6a2020, - 0x30620: 0x6d6a2220, 0x30621: 0x6d6a2420, 0x30622: 0x6d6a2620, 0x30623: 0x6d6a2820, - 0x30624: 0x6d6a2a20, 0x30625: 0x6d6a2c20, 0x30626: 0x6d6a2e20, 0x30627: 0x6d6a3020, - 0x30628: 0x6d6a3220, 0x30629: 0x6d6a3420, 0x3062a: 0x6d6a3620, 0x3062b: 0x6d6a3820, - 0x3062c: 0x6d6a3a20, 0x3062d: 0x6d6a6c20, 0x3062e: 0x6d937220, 0x3062f: 0x6d937420, - 0x30630: 0x6d937620, 0x30631: 0x6d937820, 0x30632: 0x6d937a20, 0x30633: 0x6d937c20, - 0x30634: 0x6d937e20, 0x30635: 0x6d938020, 0x30636: 0x6db70820, 0x30637: 0x6db70a20, - 0x30638: 0x6db70c20, 0x30639: 0x6db70e20, 0x3063a: 0x6db71020, 0x3063b: 0x6db71220, - 0x3063c: 0x6db71420, 0x3063d: 0x6db71620, 0x3063e: 0x6dd54820, 0x3063f: 0x6dd54a20, - // Block 0xc19, offset 0x30640 - 0x30640: 0x6dd54c20, 0x30641: 0x6dc6ba20, 0x30642: 0x6dd54e20, 0x30643: 0x6dd55020, - 0x30644: 0x6dd55220, 0x30645: 0x6dd55420, 0x30646: 0x6dee3820, 0x30647: 0x6dee3a20, - 0x30648: 0x6dee3c20, 0x30649: 0x6dee3e20, 0x3064a: 0x6dee4020, 0x3064b: 0x6dee4220, - 0x3064c: 0x6dee4420, 0x3064d: 0x6e02e420, 0x3064e: 0x6e02e620, 0x3064f: 0x6e02e820, - 0x30650: 0x6e148420, 0x30651: 0x6e148620, 0x30652: 0x6e148820, 0x30653: 0x6e148a20, - 0x30654: 0x6e148c20, 0x30655: 0x6e223220, 0x30656: 0x6e223420, 0x30657: 0x6e223620, - 0x30658: 0x6e223820, 0x30659: 0x6e2c8c20, 0x3065a: 0x6e2c8e20, 0x3065b: 0x6e34b020, - 0x3065c: 0x6e3a6820, 0x3065d: 0x6c051820, 0x3065e: 0x6c150020, 0x3065f: 0x6c150220, - 0x30660: 0x6c150420, 0x30661: 0x6c26f620, 0x30662: 0x6c26f820, 0x30663: 0x6c40c020, - 0x30664: 0x6c40c220, 0x30665: 0x6c40c420, 0x30666: 0x6c40c620, 0x30667: 0x6c40c820, - 0x30668: 0x6c40ca20, 0x30669: 0x6c40cc20, 0x3066a: 0x6c40ce20, 0x3066b: 0x6c40d020, - 0x3066c: 0x6c40d220, 0x3066d: 0x6c40d420, 0x3066e: 0x6c40d620, 0x3066f: 0x6c40d820, - 0x30670: 0x6c60dc20, 0x30671: 0x6c60de20, 0x30672: 0x6c60e020, 0x30673: 0x6c60e220, - 0x30674: 0x6c60e420, 0x30675: 0x6c60e620, 0x30676: 0x6c60e820, 0x30677: 0x6c60ea20, - 0x30678: 0x6c60ec20, 0x30679: 0x6c60ee20, 0x3067a: 0x6c60f020, 0x3067b: 0x6c60f220, - 0x3067c: 0x6c871020, 0x3067d: 0x6c871220, 0x3067e: 0x6c871420, 0x3067f: 0x6c871620, - // Block 0xc1a, offset 0x30680 - 0x30680: 0x6c871820, 0x30681: 0x6c871a20, 0x30682: 0x6c871c20, 0x30683: 0x6c871e20, - 0x30684: 0x6c872020, 0x30685: 0x6c872220, 0x30686: 0x6c872420, 0x30687: 0x6cb1dc20, - 0x30688: 0x6cb1de20, 0x30689: 0x6cb1e020, 0x3068a: 0x6cb1e220, 0x3068b: 0x6ce11820, - 0x3068c: 0x6ce11a20, 0x3068d: 0x6ce11c20, 0x3068e: 0x6ce11e20, 0x3068f: 0x6ce12020, - 0x30690: 0x6ce12220, 0x30691: 0x6ce12420, 0x30692: 0x6ce12620, 0x30693: 0x6ce12820, - 0x30694: 0x6ce12a20, 0x30695: 0x6ce12c20, 0x30696: 0x6d0f9220, 0x30697: 0x6d0f9420, - 0x30698: 0x6d3dc220, 0x30699: 0x6d3dc420, 0x3069a: 0x6d3dc620, 0x3069b: 0x6d3dc820, - 0x3069c: 0x6d6a7220, 0x3069d: 0x6d93c220, 0x3069e: 0x6d93c420, 0x3069f: 0x6d93c620, - 0x306a0: 0x6d93c820, 0x306a1: 0x6db74020, 0x306a2: 0x6db74220, 0x306a3: 0x6e14a420, - 0x306a4: 0x6c26fa20, 0x306a5: 0x6cb1e820, 0x306a6: 0x6cb1ea20, 0x306a7: 0x6cb1ec20, - 0x306a8: 0x6d0f9a20, 0x306a9: 0x6d0f9c20, 0x306aa: 0x6d0f9e20, 0x306ab: 0x6d3dce20, - 0x306ac: 0x6d93cc20, 0x306ad: 0x6d6a8220, 0x306ae: 0x6d93ce20, 0x306af: 0x6db74420, - 0x306b0: 0x6c26fc20, 0x306b1: 0x6c150620, 0x306b2: 0x6c60fe20, 0x306b3: 0x6c610020, - 0x306b4: 0x6c610220, 0x306b5: 0x6c610420, 0x306b6: 0x6c872e20, 0x306b7: 0x6c873020, - 0x306b8: 0x6c873220, 0x306b9: 0x6cb1fa20, 0x306ba: 0x6cb1fc20, 0x306bb: 0x6cb1fe20, - 0x306bc: 0x6cb20020, 0x306bd: 0x6cb20220, 0x306be: 0x6cb20420, 0x306bf: 0x6cb20620, - // Block 0xc1b, offset 0x306c0 - 0x306c0: 0x6ce14e20, 0x306c1: 0x6ce15020, 0x306c2: 0x6ce15220, 0x306c3: 0x6ce15420, - 0x306c4: 0x6ce15620, 0x306c5: 0x6ce15820, 0x306c6: 0x6ce15a20, 0x306c7: 0x6ce15c20, - 0x306c8: 0x6ce15e20, 0x306c9: 0x6ce16020, 0x306ca: 0x6ce16220, 0x306cb: 0x6ce16420, - 0x306cc: 0x6d0fb420, 0x306cd: 0x6d0fb620, 0x306ce: 0x6d0fb820, 0x306cf: 0x6d0fba20, - 0x306d0: 0x6d0fbc20, 0x306d1: 0x6d0fbe20, 0x306d2: 0x6d0fc020, 0x306d3: 0x6d0fc220, - 0x306d4: 0x6d0fc420, 0x306d5: 0x6d3de820, 0x306d6: 0x6d3dea20, 0x306d7: 0x6d3dec20, - 0x306d8: 0x6d3dee20, 0x306d9: 0x6d3df020, 0x306da: 0x6d3df220, 0x306db: 0x6d6a9020, - 0x306dc: 0x6d6a9220, 0x306dd: 0x6d6a9420, 0x306de: 0x6d6a9620, 0x306df: 0x6d6a9820, - 0x306e0: 0x6d6a9a20, 0x306e1: 0x6d6a9c20, 0x306e2: 0x6d6a9e20, 0x306e3: 0x6d6aa020, - 0x306e4: 0x6d6aa220, 0x306e5: 0x6d93e420, 0x306e6: 0x6d93e620, 0x306e7: 0x6d93e820, - 0x306e8: 0x6db75620, 0x306e9: 0x6dd5dc20, 0x306ea: 0x6dee8820, 0x306eb: 0x6dee8a20, - 0x306ec: 0x6dee8c20, 0x306ed: 0x6dee8e20, 0x306ee: 0x6e031220, 0x306ef: 0x6e14b020, - 0x306f0: 0x6e14b220, 0x306f1: 0x6e2cb020, 0x306f2: 0x6e3e4a20, 0x306f3: 0x6c270220, - 0x306f4: 0x6c611a20, 0x306f5: 0x6c875420, 0x306f6: 0x6c875620, 0x306f7: 0x6c875820, - 0x306f8: 0x6c875a20, 0x306f9: 0x6cb24e20, 0x306fa: 0x6cb25020, 0x306fb: 0x6cb25220, - 0x306fc: 0x6d101620, 0x306fd: 0x6cb25420, 0x306fe: 0x6cb25620, 0x306ff: 0x6cb25820, - // Block 0xc1c, offset 0x30700 - 0x30700: 0x6cb25a20, 0x30701: 0x6cb25c20, 0x30702: 0x6cb25e20, 0x30703: 0x6cb26020, - 0x30704: 0x6cb26220, 0x30705: 0x6ce1ba20, 0x30706: 0x6ce1bc20, 0x30707: 0x6ce1be20, - 0x30708: 0x6ce1c020, 0x30709: 0x6ce1c220, 0x3070a: 0x6ce1c420, 0x3070b: 0x6ce1c620, - 0x3070c: 0x6ce1c820, 0x3070d: 0x6ce1ca20, 0x3070e: 0x6ce1cc20, 0x3070f: 0x6ce1ce20, - 0x30710: 0x6d100820, 0x30711: 0x6ce1d020, 0x30712: 0x6ce1d220, 0x30713: 0x6ce1d420, - 0x30714: 0x6ce1d620, 0x30715: 0x6ce1d820, 0x30716: 0x6ce1da20, 0x30717: 0x6ce1dc20, - 0x30718: 0x6ce1de20, 0x30719: 0x6ce1e020, 0x3071a: 0x6ce1e220, 0x3071b: 0x6ce1e420, - 0x3071c: 0x6ce1e620, 0x3071d: 0x6ce1e820, 0x3071e: 0x6ce1ea20, 0x3071f: 0x6d101820, - 0x30720: 0x6d101a20, 0x30721: 0x6d101c20, 0x30722: 0x6d101e20, 0x30723: 0x6d102020, - 0x30724: 0x6d102220, 0x30725: 0x6d102420, 0x30726: 0x6d102620, 0x30727: 0x6d102820, - 0x30728: 0x6d102a20, 0x30729: 0x6d102c20, 0x3072a: 0x6d102e20, 0x3072b: 0x6d103020, - 0x3072c: 0x6d103220, 0x3072d: 0x6d103420, 0x3072e: 0x6d103620, 0x3072f: 0x6d103820, - 0x30730: 0x6d103a20, 0x30731: 0x6d103c20, 0x30732: 0x6d103e20, 0x30733: 0x6d104020, - 0x30734: 0x6d104220, 0x30735: 0x6ce1ec20, 0x30736: 0x6d104420, 0x30737: 0x6d104620, - 0x30738: 0x6d104820, 0x30739: 0x6d104a20, 0x3073a: 0x6d104c20, 0x3073b: 0x6d104e20, - 0x3073c: 0x6d3e4c20, 0x3073d: 0x6d3e4e20, 0x3073e: 0x6d3e5020, 0x3073f: 0x6d3e5220, - // Block 0xc1d, offset 0x30740 - 0x30740: 0x6d3e5420, 0x30741: 0x6d3e5620, 0x30742: 0x6d3e5820, 0x30743: 0x6d3e5a20, - 0x30744: 0x6d3e5c20, 0x30745: 0x6d3e5e20, 0x30746: 0x6d3e6020, 0x30747: 0x6d3e6220, - 0x30748: 0x6d3e6420, 0x30749: 0x6d3e6620, 0x3074a: 0x6d3e6820, 0x3074b: 0x6d3e6a20, - 0x3074c: 0x6d3e6c20, 0x3074d: 0x6d3e6e20, 0x3074e: 0x6d3e7020, 0x3074f: 0x6d6afa20, - 0x30750: 0x6d6afc20, 0x30751: 0x6d6afe20, 0x30752: 0x6d6b0020, 0x30753: 0x6d6b0220, - 0x30754: 0x6d6b0420, 0x30755: 0x6d6b0620, 0x30756: 0x6d6b0820, 0x30757: 0x6d6b0a20, - 0x30758: 0x6d6b0c20, 0x30759: 0x6d6b0e20, 0x3075a: 0x6d6b1020, 0x3075b: 0x6d6b1220, - 0x3075c: 0x6d6b1420, 0x3075d: 0x6d6b1620, 0x3075e: 0x6d6b1820, 0x3075f: 0x6d6b1a20, - 0x30760: 0x6d6b1c20, 0x30761: 0x6d6b1e20, 0x30762: 0x6d6b2020, 0x30763: 0x6d6b2220, - 0x30764: 0x6d6b2420, 0x30765: 0x6d6b2620, 0x30766: 0x6d6b2820, 0x30767: 0x6d6b2a20, - 0x30768: 0x6d6b2c20, 0x30769: 0x6d6b2e20, 0x3076a: 0x6d6b3020, 0x3076b: 0x6d6b9820, - 0x3076c: 0x6d6b3220, 0x3076d: 0x6d6b3420, 0x3076e: 0x6d6b3620, 0x3076f: 0x6d6b3820, - 0x30770: 0x6d944620, 0x30771: 0x6d944820, 0x30772: 0x6d944a20, 0x30773: 0x6d944c20, - 0x30774: 0x6d944e20, 0x30775: 0x6d945020, 0x30776: 0x6d945220, 0x30777: 0x6d6b9a20, - 0x30778: 0x6d945420, 0x30779: 0x6d945620, 0x3077a: 0x6d6b3a20, 0x3077b: 0x6d945820, - 0x3077c: 0x6d945a20, 0x3077d: 0x6d945c20, 0x3077e: 0x6d945e20, 0x3077f: 0x6d946020, - // Block 0xc1e, offset 0x30780 - 0x30780: 0x6d946220, 0x30781: 0x6d946420, 0x30782: 0x6d946620, 0x30783: 0x6d946820, - 0x30784: 0x6d946a20, 0x30785: 0x6d946c20, 0x30786: 0x6db79220, 0x30787: 0x6db79420, - 0x30788: 0x6db79620, 0x30789: 0x6db79820, 0x3078a: 0x6db79a20, 0x3078b: 0x6db79c20, - 0x3078c: 0x6db79e20, 0x3078d: 0x6db7a020, 0x3078e: 0x6db7a220, 0x3078f: 0x6db7a420, - 0x30790: 0x6db7a620, 0x30791: 0x6db7a820, 0x30792: 0x6db7aa20, 0x30793: 0x6db7ac20, - 0x30794: 0x6dd5e820, 0x30795: 0x6dd5ea20, 0x30796: 0x6dd5ec20, 0x30797: 0x6dd5ee20, - 0x30798: 0x6dd5f020, 0x30799: 0x6dd5f220, 0x3079a: 0x6dd5f420, 0x3079b: 0x6dd5f620, - 0x3079c: 0x6dd5f820, 0x3079d: 0x6dd5fa20, 0x3079e: 0x6dd5fc20, 0x3079f: 0x6dd5fe20, - 0x307a0: 0x6dd60020, 0x307a1: 0x6dd60220, 0x307a2: 0x6dd60420, 0x307a3: 0x6dd60620, - 0x307a4: 0x6dd60820, 0x307a5: 0x6dd60a20, 0x307a6: 0x6dd60c20, 0x307a7: 0x6dd60e20, - 0x307a8: 0x6deec820, 0x307a9: 0x6dd6aa20, 0x307aa: 0x6deeca20, 0x307ab: 0x6deecc20, - 0x307ac: 0x6deece20, 0x307ad: 0x6deed020, 0x307ae: 0x6dd61020, 0x307af: 0x6deed220, - 0x307b0: 0x6deed420, 0x307b1: 0x6deed620, 0x307b2: 0x6deed820, 0x307b3: 0x6deeda20, - 0x307b4: 0x6deedc20, 0x307b5: 0x6deede20, 0x307b6: 0x6deee020, 0x307b7: 0x6deee220, - 0x307b8: 0x6deee420, 0x307b9: 0x6deee620, 0x307ba: 0x6deee820, 0x307bb: 0x6deeea20, - 0x307bc: 0x6deeec20, 0x307bd: 0x6deeee20, 0x307be: 0x6deef020, 0x307bf: 0x6deef220, - // Block 0xc1f, offset 0x307c0 - 0x307c0: 0x6dd61220, 0x307c1: 0x6e033020, 0x307c2: 0x6e033220, 0x307c3: 0x6e033420, - 0x307c4: 0x6e033620, 0x307c5: 0x6e033820, 0x307c6: 0x6e033a20, 0x307c7: 0x6def6820, - 0x307c8: 0x6e033c20, 0x307c9: 0x6e033e20, 0x307ca: 0x6e14c820, 0x307cb: 0x6e14ca20, - 0x307cc: 0x6e14cc20, 0x307cd: 0x6e14ce20, 0x307ce: 0x6e14d020, 0x307cf: 0x6e14d220, - 0x307d0: 0x6e227220, 0x307d1: 0x6e227420, 0x307d2: 0x6e227620, 0x307d3: 0x6e227820, - 0x307d4: 0x6e227a20, 0x307d5: 0x6e227c20, 0x307d6: 0x6e227e20, 0x307d7: 0x6e22aa20, - 0x307d8: 0x6e2cc220, 0x307d9: 0x6e2cc420, 0x307da: 0x6e22ac20, 0x307db: 0x6e2cc620, - 0x307dc: 0x6e2cc820, 0x307dd: 0x6e34c220, 0x307de: 0x6e34c420, 0x307df: 0x6e34c620, - 0x307e0: 0x6e34c820, 0x307e1: 0x6e3a7c20, 0x307e2: 0x6e3a7e20, 0x307e3: 0x6e3a8020, - 0x307e4: 0x6e3a8220, 0x307e5: 0x6e3a8420, 0x307e6: 0x6e3e4c20, 0x307e7: 0x6e3e4e20, - 0x307e8: 0x6e432420, 0x307e9: 0x6e412220, 0x307ea: 0x6e412420, 0x307eb: 0x6c270620, - 0x307ec: 0x6c878020, 0x307ed: 0x6cb2aa20, 0x307ee: 0x6cb2ac20, 0x307ef: 0x6cb2ae20, - 0x307f0: 0x6ce24420, 0x307f1: 0x6d10b820, 0x307f2: 0x6d10ba20, 0x307f3: 0x6d3ee220, - 0x307f4: 0x6d3ee420, 0x307f5: 0x6d3ee620, 0x307f6: 0x6d6b9e20, 0x307f7: 0x6d6ba020, - 0x307f8: 0x6d6ba220, 0x307f9: 0x6d6ba420, 0x307fa: 0x6d6ba620, 0x307fb: 0x6d6ba820, - 0x307fc: 0x6d6baa20, 0x307fd: 0x6d94e420, 0x307fe: 0x6d94e620, 0x307ff: 0x6dd6ac20, - // Block 0xc20, offset 0x30800 - 0x30800: 0x6dd6ae20, 0x30801: 0x6dd6b020, 0x30802: 0x6def6c20, 0x30803: 0x6def6e20, - 0x30804: 0x6def7020, 0x30805: 0x6def7220, 0x30806: 0x6e039c20, 0x30807: 0x6e150620, - 0x30808: 0x6e34de20, 0x30809: 0x6e412c20, 0x3080a: 0x6c270e20, 0x3080b: 0x6c40e420, - 0x3080c: 0x6c613220, 0x3080d: 0x6c613420, 0x3080e: 0x6c878e20, 0x3080f: 0x6c879020, - 0x30810: 0x6c879220, 0x30811: 0x6c879420, 0x30812: 0x6c879620, 0x30813: 0x6c879820, - 0x30814: 0x6c879a20, 0x30815: 0x6c879c20, 0x30816: 0x6cb2e420, 0x30817: 0x6cb2e620, - 0x30818: 0x6cb2e820, 0x30819: 0x6cb2ea20, 0x3081a: 0x6cb2ec20, 0x3081b: 0x6cb2ee20, - 0x3081c: 0x6cb2f020, 0x3081d: 0x6cb2f220, 0x3081e: 0x6cb2f420, 0x3081f: 0x6cb2f620, - 0x30820: 0x6cb2f820, 0x30821: 0x6cb2fa20, 0x30822: 0x6cb2fc20, 0x30823: 0x6cb2fe20, - 0x30824: 0x6ce26c20, 0x30825: 0x6ce26e20, 0x30826: 0x6ce27020, 0x30827: 0x6ce27220, - 0x30828: 0x6ce27420, 0x30829: 0x6ce27620, 0x3082a: 0x6ce27820, 0x3082b: 0x6ce27a20, - 0x3082c: 0x6ce27c20, 0x3082d: 0x6d10ea20, 0x3082e: 0x6ce27e20, 0x3082f: 0x6ce28020, - 0x30830: 0x6ce28220, 0x30831: 0x6ce28420, 0x30832: 0x6ce28620, 0x30833: 0x6ce28820, - 0x30834: 0x6ce28a20, 0x30835: 0x6ce28c20, 0x30836: 0x6ce28e20, 0x30837: 0x6ce29020, - 0x30838: 0x6ce29220, 0x30839: 0x6ce29420, 0x3083a: 0x6ce29620, 0x3083b: 0x6ce29820, - 0x3083c: 0x6ce29a20, 0x3083d: 0x6ce29c20, 0x3083e: 0x6d10ec20, 0x3083f: 0x6d10ee20, - // Block 0xc21, offset 0x30840 - 0x30840: 0x6d10f020, 0x30841: 0x6d10f220, 0x30842: 0x6d10f420, 0x30843: 0x6d10f620, - 0x30844: 0x6d10f820, 0x30845: 0x6d10fa20, 0x30846: 0x6d10fc20, 0x30847: 0x6d10fe20, - 0x30848: 0x6d110020, 0x30849: 0x6d110220, 0x3084a: 0x6d110420, 0x3084b: 0x6d110620, - 0x3084c: 0x6d110820, 0x3084d: 0x6d3f0a20, 0x3084e: 0x6d3f0c20, 0x3084f: 0x6d3f0e20, - 0x30850: 0x6d3f1020, 0x30851: 0x6d3f1220, 0x30852: 0x6d3f1420, 0x30853: 0x6d3f1620, - 0x30854: 0x6d3f1820, 0x30855: 0x6d3f1a20, 0x30856: 0x6d6bd020, 0x30857: 0x6d6bd220, - 0x30858: 0x6d6bd420, 0x30859: 0x6d6bd620, 0x3085a: 0x6d6bd820, 0x3085b: 0x6d6bda20, - 0x3085c: 0x6d6bdc20, 0x3085d: 0x6d6bde20, 0x3085e: 0x6d6be020, 0x3085f: 0x6d6be220, - 0x30860: 0x6d6be420, 0x30861: 0x6d6be620, 0x30862: 0x6d6be820, 0x30863: 0x6d6bea20, - 0x30864: 0x6d6bec20, 0x30865: 0x6d6bee20, 0x30866: 0x6d6bf020, 0x30867: 0x6d6bf220, - 0x30868: 0x6d6bf420, 0x30869: 0x6d6bf620, 0x3086a: 0x6d6bf820, 0x3086b: 0x6d6bfa20, - 0x3086c: 0x6d6bfc20, 0x3086d: 0x6d950820, 0x3086e: 0x6d950a20, 0x3086f: 0x6d950c20, - 0x30870: 0x6d950e20, 0x30871: 0x6d951020, 0x30872: 0x6d951220, 0x30873: 0x6d951420, - 0x30874: 0x6d951620, 0x30875: 0x6d951820, 0x30876: 0x6d951a20, 0x30877: 0x6d951c20, - 0x30878: 0x6d951e20, 0x30879: 0x6d952020, 0x3087a: 0x6d952220, 0x3087b: 0x6d952420, - 0x3087c: 0x6d952620, 0x3087d: 0x6db84220, 0x3087e: 0x6db84420, 0x3087f: 0x6db84620, - // Block 0xc22, offset 0x30880 - 0x30880: 0x6db84820, 0x30881: 0x6db84a20, 0x30882: 0x6db84c20, 0x30883: 0x6db84e20, - 0x30884: 0x6db85020, 0x30885: 0x6db85220, 0x30886: 0x6dd6ce20, 0x30887: 0x6dd6d020, - 0x30888: 0x6dd6d220, 0x30889: 0x6dd6d420, 0x3088a: 0x6dd6d620, 0x3088b: 0x6dd6d820, - 0x3088c: 0x6dd6da20, 0x3088d: 0x6def9a20, 0x3088e: 0x6def9c20, 0x3088f: 0x6def9e20, - 0x30890: 0x6defa020, 0x30891: 0x6defa220, 0x30892: 0x6defa420, 0x30893: 0x6defa620, - 0x30894: 0x6defa820, 0x30895: 0x6e03ae20, 0x30896: 0x6e03b020, 0x30897: 0x6e03b220, - 0x30898: 0x6e03b420, 0x30899: 0x6e03b620, 0x3089a: 0x6e03b820, 0x3089b: 0x6e151820, - 0x3089c: 0x6e151a20, 0x3089d: 0x6e151c20, 0x3089e: 0x6e151e20, 0x3089f: 0x6e152020, - 0x308a0: 0x6e22b820, 0x308a1: 0x6e22ba20, 0x308a2: 0x6e22bc20, 0x308a3: 0x6e2cee20, - 0x308a4: 0x6e2cf020, 0x308a5: 0x6e413020, 0x308a6: 0x6c051a20, 0x308a7: 0x6c0a7e20, - 0x308a8: 0x6c150820, 0x308a9: 0x6c271020, 0x308aa: 0x6c271220, 0x308ab: 0x6c271420, - 0x308ac: 0x6c40e620, 0x308ad: 0x6c40e820, 0x308ae: 0x6c40ea20, 0x308af: 0x6c40ec20, - 0x308b0: 0x6c40ee20, 0x308b1: 0x6c614620, 0x308b2: 0x6c614820, 0x308b3: 0x6c614a20, - 0x308b4: 0x6c614c20, 0x308b5: 0x6c614e20, 0x308b6: 0x6c615020, 0x308b7: 0x6c615220, - 0x308b8: 0x6c615420, 0x308b9: 0x6c615620, 0x308ba: 0x6c615820, 0x308bb: 0x6c615a20, - 0x308bc: 0x6c87ba20, 0x308bd: 0x6c87bc20, 0x308be: 0x6c87be20, 0x308bf: 0x6c87c020, - // Block 0xc23, offset 0x308c0 - 0x308c0: 0x6c87c220, 0x308c1: 0x6c87c420, 0x308c2: 0x6c87c620, 0x308c3: 0x6c87c820, - 0x308c4: 0x6cb33a20, 0x308c5: 0x6cb33c20, 0x308c6: 0x6cb33e20, 0x308c7: 0x6ce2d820, - 0x308c8: 0x6ce2da20, 0x308c9: 0x6ce2dc20, 0x308ca: 0x6ce2de20, 0x308cb: 0x6ce2e020, - 0x308cc: 0x6ce2e220, 0x308cd: 0x6ce2e420, 0x308ce: 0x6ce2e620, 0x308cf: 0x6d113e20, - 0x308d0: 0x6d114020, 0x308d1: 0x6d114220, 0x308d2: 0x6d114420, 0x308d3: 0x6d114620, - 0x308d4: 0x6d114820, 0x308d5: 0x6d3f5e20, 0x308d6: 0x6d3f6020, 0x308d7: 0x6d3f6220, - 0x308d8: 0x6d6c4e20, 0x308d9: 0x6d957020, 0x308da: 0x6d957220, 0x308db: 0x6c271c20, - 0x308dc: 0x6ce2f020, 0x308dd: 0x6ce2f220, 0x308de: 0x6d114c20, 0x308df: 0x6d114e20, - 0x308e0: 0x6d115020, 0x308e1: 0x6d3f6820, 0x308e2: 0x6d3f6a20, 0x308e3: 0x6d3f6c20, - 0x308e4: 0x6d6c5620, 0x308e5: 0x6d957820, 0x308e6: 0x6d957a20, 0x308e7: 0x6d957c20, - 0x308e8: 0x6d957e20, 0x308e9: 0x6d958020, 0x308ea: 0x6d958220, 0x308eb: 0x6db89e20, - 0x308ec: 0x6dd71620, 0x308ed: 0x6defca20, 0x308ee: 0x6e03ee20, 0x308ef: 0x6e153620, - 0x308f0: 0x6c272020, 0x308f1: 0x6c87d620, 0x308f2: 0x6d116020, 0x308f3: 0x6d6c6220, - 0x308f4: 0x6defd620, 0x308f5: 0x6c272620, 0x308f6: 0x6c051e20, 0x308f7: 0x6c0a8020, - 0x308f8: 0x6c150a20, 0x308f9: 0x6c150c20, 0x308fa: 0x6c150e20, 0x308fb: 0x6c151020, - 0x308fc: 0x6c151220, 0x308fd: 0x6c151420, 0x308fe: 0x6c272e20, 0x308ff: 0x6c273020, - // Block 0xc24, offset 0x30900 - 0x30900: 0x6c273220, 0x30901: 0x6c273420, 0x30902: 0x6c273620, 0x30903: 0x6c273820, - 0x30904: 0x6c273a20, 0x30905: 0x6c273c20, 0x30906: 0x6c273e20, 0x30907: 0x6c274020, - 0x30908: 0x6c274220, 0x30909: 0x6c274420, 0x3090a: 0x6c410020, 0x3090b: 0x6c410220, - 0x3090c: 0x6c410420, 0x3090d: 0x6c410620, 0x3090e: 0x6c410820, 0x3090f: 0x6c410a20, - 0x30910: 0x6c410c20, 0x30911: 0x6c410e20, 0x30912: 0x6c411020, 0x30913: 0x6c411220, - 0x30914: 0x6c411420, 0x30915: 0x6c411620, 0x30916: 0x6c411820, 0x30917: 0x6c411a20, - 0x30918: 0x6c411c20, 0x30919: 0x6c411e20, 0x3091a: 0x6c412020, 0x3091b: 0x6c412220, - 0x3091c: 0x6c412420, 0x3091d: 0x6c412620, 0x3091e: 0x6c412820, 0x3091f: 0x6c412a20, - 0x30920: 0x6c616a20, 0x30921: 0x6c616c20, 0x30922: 0x6c616e20, 0x30923: 0x6c617020, - 0x30924: 0x6c617220, 0x30925: 0x6c617420, 0x30926: 0x6c617620, 0x30927: 0x6c617820, - 0x30928: 0x6c617a20, 0x30929: 0x6c617c20, 0x3092a: 0x6c617e20, 0x3092b: 0x6c618020, - 0x3092c: 0x6c412c20, 0x3092d: 0x6c618220, 0x3092e: 0x6c618420, 0x3092f: 0x6c618620, - 0x30930: 0x6c618820, 0x30931: 0x6c618a20, 0x30932: 0x6c618c20, 0x30933: 0x6c618e20, - 0x30934: 0x6c87e620, 0x30935: 0x6c87e820, 0x30936: 0x6c87ea20, 0x30937: 0x6c87ec20, - 0x30938: 0x6c87ee20, 0x30939: 0x6c87f020, 0x3093a: 0x6c87f220, 0x3093b: 0x6c87f420, - 0x3093c: 0x6c87f620, 0x3093d: 0x6c87f820, 0x3093e: 0x6c87fa20, 0x3093f: 0x6c87fc20, - // Block 0xc25, offset 0x30940 - 0x30940: 0x6c87fe20, 0x30941: 0x6c880020, 0x30942: 0x6c880220, 0x30943: 0x6c880420, - 0x30944: 0x6c880620, 0x30945: 0x6c880820, 0x30946: 0x6c880a20, 0x30947: 0x6c880c20, - 0x30948: 0x6c880e20, 0x30949: 0x6c881020, 0x3094a: 0x6c881220, 0x3094b: 0x6cb34e20, - 0x3094c: 0x6cb35020, 0x3094d: 0x6cb35220, 0x3094e: 0x6cb35420, 0x3094f: 0x6cb35620, - 0x30950: 0x6cb35820, 0x30951: 0x6cb35a20, 0x30952: 0x6cb35c20, 0x30953: 0x6cb35e20, - 0x30954: 0x6cb36020, 0x30955: 0x6cb36220, 0x30956: 0x6cb36420, 0x30957: 0x6cb36620, - 0x30958: 0x6cb36820, 0x30959: 0x6cb36a20, 0x3095a: 0x6cb36c20, 0x3095b: 0x6cb36e20, - 0x3095c: 0x6cb37020, 0x3095d: 0x6cb37220, 0x3095e: 0x6cb37420, 0x3095f: 0x6cb37620, - 0x30960: 0x6cb37820, 0x30961: 0x6cb37a20, 0x30962: 0x6cb37c20, 0x30963: 0x6cb37e20, - 0x30964: 0x6cb38020, 0x30965: 0x6cb38220, 0x30966: 0x6cb38420, 0x30967: 0x6cb38620, - 0x30968: 0x6ce30420, 0x30969: 0x6ce30620, 0x3096a: 0x6ce30820, 0x3096b: 0x6ce30a20, - 0x3096c: 0x6ce30c20, 0x3096d: 0x6ce30e20, 0x3096e: 0x6ce31020, 0x3096f: 0x6ce31220, - 0x30970: 0x6ce31420, 0x30971: 0x6ce31620, 0x30972: 0x6ce31820, 0x30973: 0x6ce31a20, - 0x30974: 0x6ce31c20, 0x30975: 0x6ce31e20, 0x30976: 0x6ce32020, 0x30977: 0x6ce32220, - 0x30978: 0x6ce32420, 0x30979: 0x6ce32620, 0x3097a: 0x6ce32820, 0x3097b: 0x6ce32a20, - 0x3097c: 0x6d116a20, 0x3097d: 0x6d116c20, 0x3097e: 0x6d116e20, 0x3097f: 0x6d117020, - // Block 0xc26, offset 0x30980 - 0x30980: 0x6d117220, 0x30981: 0x6d117420, 0x30982: 0x6d117620, 0x30983: 0x6d117820, - 0x30984: 0x6d117a20, 0x30985: 0x6d117c20, 0x30986: 0x6d117e20, 0x30987: 0x6d118020, - 0x30988: 0x6d118220, 0x30989: 0x6d118420, 0x3098a: 0x6d118620, 0x3098b: 0x6d118820, - 0x3098c: 0x6d118a20, 0x3098d: 0x6d118c20, 0x3098e: 0x6d118e20, 0x3098f: 0x6d119020, - 0x30990: 0x6d119220, 0x30991: 0x6d119420, 0x30992: 0x6d119620, 0x30993: 0x6d119820, - 0x30994: 0x6d119a20, 0x30995: 0x6d119c20, 0x30996: 0x6d119e20, 0x30997: 0x6d11a020, - 0x30998: 0x6d3f8020, 0x30999: 0x6d3f8220, 0x3099a: 0x6d3f8420, 0x3099b: 0x6d3f8620, - 0x3099c: 0x6d3f8820, 0x3099d: 0x6d3f8a20, 0x3099e: 0x6d3f8c20, 0x3099f: 0x6d3f8e20, - 0x309a0: 0x6d3f9020, 0x309a1: 0x6d3f9220, 0x309a2: 0x6d3f9420, 0x309a3: 0x6d3f9620, - 0x309a4: 0x6d3f9820, 0x309a5: 0x6d3f9a20, 0x309a6: 0x6d6c6e20, 0x309a7: 0x6d6c7020, - 0x309a8: 0x6d6c7220, 0x309a9: 0x6d6c7420, 0x309aa: 0x6d6c7620, 0x309ab: 0x6d6c7820, - 0x309ac: 0x6d6c7a20, 0x309ad: 0x6d6c7c20, 0x309ae: 0x6d6c7e20, 0x309af: 0x6d6c8020, - 0x309b0: 0x6d6c8220, 0x309b1: 0x6d6c8420, 0x309b2: 0x6d959e20, 0x309b3: 0x6d6c8620, - 0x309b4: 0x6d95a020, 0x309b5: 0x6d95a220, 0x309b6: 0x6d95a420, 0x309b7: 0x6d6c8820, - 0x309b8: 0x6d95a620, 0x309b9: 0x6d95a820, 0x309ba: 0x6d95aa20, 0x309bb: 0x6d95ac20, - 0x309bc: 0x6d95ae20, 0x309bd: 0x6db8b220, 0x309be: 0x6db8b420, 0x309bf: 0x6db8b620, - // Block 0xc27, offset 0x309c0 - 0x309c0: 0x6db8b820, 0x309c1: 0x6db8ba20, 0x309c2: 0x6db8bc20, 0x309c3: 0x6db8be20, - 0x309c4: 0x6db8c020, 0x309c5: 0x6db8c220, 0x309c6: 0x6d95b020, 0x309c7: 0x6dd72220, - 0x309c8: 0x6dd72420, 0x309c9: 0x6db8c420, 0x309ca: 0x6defdc20, 0x309cb: 0x6defde20, - 0x309cc: 0x6defe020, 0x309cd: 0x6e03fc20, 0x309ce: 0x6e153c20, 0x309cf: 0x6e2d0820, - 0x309d0: 0x6e2d0a20, 0x309d1: 0x6c278a20, 0x309d2: 0x6c0a8e20, 0x309d3: 0x6c0a9020, - 0x309d4: 0x6c153c20, 0x309d5: 0x6c886a20, 0x309d6: 0x6c153e20, 0x309d7: 0x6c154020, - 0x309d8: 0x6c154220, 0x309d9: 0x6c154420, 0x309da: 0x6c154620, 0x309db: 0x6c154820, - 0x309dc: 0x6c154a20, 0x309dd: 0x6c154c20, 0x309de: 0x6c279220, 0x309df: 0x6c279420, - 0x309e0: 0x6c279620, 0x309e1: 0x6c279820, 0x309e2: 0x6c279a20, 0x309e3: 0x6c279c20, - 0x309e4: 0x6c279e20, 0x309e5: 0x6c27a020, 0x309e6: 0x6c27a220, 0x309e7: 0x6c27a420, - 0x309e8: 0x6c27a620, 0x309e9: 0x6c27a820, 0x309ea: 0x6c27aa20, 0x309eb: 0x6cb3fc20, - 0x309ec: 0x6c27ac20, 0x309ed: 0x6c418220, 0x309ee: 0x6c418420, 0x309ef: 0x6c418620, - 0x309f0: 0x6c418820, 0x309f1: 0x6c418a20, 0x309f2: 0x6c418c20, 0x309f3: 0x6c418e20, - 0x309f4: 0x6c419020, 0x309f5: 0x6c419220, 0x309f6: 0x6c419420, 0x309f7: 0x6c419620, - 0x309f8: 0x6c419820, 0x309f9: 0x6c419a20, 0x309fa: 0x6c419c20, 0x309fb: 0x6c419e20, - 0x309fc: 0x6c61e020, 0x309fd: 0x6c61e220, 0x309fe: 0x6c61e420, 0x309ff: 0x6c61e620, - // Block 0xc28, offset 0x30a00 - 0x30a00: 0x6c61e820, 0x30a01: 0x6c61ea20, 0x30a02: 0x6c61ec20, 0x30a03: 0x6c61ee20, - 0x30a04: 0x6c61f020, 0x30a05: 0x6c61f220, 0x30a06: 0x6c61f420, 0x30a07: 0x6c61f620, - 0x30a08: 0x6c61f820, 0x30a09: 0x6c61fa20, 0x30a0a: 0x6c61fc20, 0x30a0b: 0x6c61fe20, - 0x30a0c: 0x6d11fe20, 0x30a0d: 0x6c620020, 0x30a0e: 0x6c620220, 0x30a0f: 0x6c620420, - 0x30a10: 0x6c620620, 0x30a11: 0x6c620820, 0x30a12: 0x6d400820, 0x30a13: 0x6c620a20, - 0x30a14: 0x6cb3fe20, 0x30a15: 0x6c620c20, 0x30a16: 0x6c887620, 0x30a17: 0x6c887820, - 0x30a18: 0x6c887a20, 0x30a19: 0x6c887c20, 0x30a1a: 0x6c887e20, 0x30a1b: 0x6c888020, - 0x30a1c: 0x6c888220, 0x30a1d: 0x6c888420, 0x30a1e: 0x6c888620, 0x30a1f: 0x6c888820, - 0x30a20: 0x6c888a20, 0x30a21: 0x6c888c20, 0x30a22: 0x6c888e20, 0x30a23: 0x6c889020, - 0x30a24: 0x6c889220, 0x30a25: 0x6c889420, 0x30a26: 0x6c889620, 0x30a27: 0x6c889820, - 0x30a28: 0x6cb40c20, 0x30a29: 0x6cb40e20, 0x30a2a: 0x6cb41020, 0x30a2b: 0x6cb41220, - 0x30a2c: 0x6cb41420, 0x30a2d: 0x6cb41620, 0x30a2e: 0x6cb41820, 0x30a2f: 0x6cb41a20, - 0x30a30: 0x6cb41c20, 0x30a31: 0x6c625420, 0x30a32: 0x6cb41e20, 0x30a33: 0x6cb42020, - 0x30a34: 0x6cb42220, 0x30a35: 0x6ce3be20, 0x30a36: 0x6d6cf820, 0x30a37: 0x6cb42420, - 0x30a38: 0x6cb42620, 0x30a39: 0x6ce3c620, 0x30a3a: 0x6d95fa20, 0x30a3b: 0x6ce3c820, - 0x30a3c: 0x6ce3ca20, 0x30a3d: 0x6cb42820, 0x30a3e: 0x6ce3cc20, 0x30a3f: 0x6ce3ce20, - // Block 0xc29, offset 0x30a40 - 0x30a40: 0x6ce3d020, 0x30a41: 0x6ce3d220, 0x30a42: 0x6ce3d420, 0x30a43: 0x6ce3d620, - 0x30a44: 0x6ce3d820, 0x30a45: 0x6ce3da20, 0x30a46: 0x6ce3dc20, 0x30a47: 0x6ce3de20, - 0x30a48: 0x6ce3e020, 0x30a49: 0x6ce3e220, 0x30a4a: 0x6ce3e420, 0x30a4b: 0x6d120820, - 0x30a4c: 0x6d120a20, 0x30a4d: 0x6d120c20, 0x30a4e: 0x6d120e20, 0x30a4f: 0x6d121020, - 0x30a50: 0x6d121220, 0x30a51: 0x6d121420, 0x30a52: 0x6d121620, 0x30a53: 0x6d121820, - 0x30a54: 0x6d121a20, 0x30a55: 0x6d121c20, 0x30a56: 0x6d121e20, 0x30a57: 0x6d122020, - 0x30a58: 0x6d401420, 0x30a59: 0x6d401620, 0x30a5a: 0x6d401820, 0x30a5b: 0x6d401a20, - 0x30a5c: 0x6d401c20, 0x30a5d: 0x6d401e20, 0x30a5e: 0x6d402020, 0x30a5f: 0x6d402220, - 0x30a60: 0x6d402420, 0x30a61: 0x6d402620, 0x30a62: 0x6d402820, 0x30a63: 0x6d402a20, - 0x30a64: 0x6d402c20, 0x30a65: 0x6d402e20, 0x30a66: 0x6d6d0220, 0x30a67: 0x6d6d0420, - 0x30a68: 0x6dd75620, 0x30a69: 0x6d6d0620, 0x30a6a: 0x6d6d0820, 0x30a6b: 0x6d6d0a20, - 0x30a6c: 0x6ce41e20, 0x30a6d: 0x6d6d0c20, 0x30a6e: 0x6d6d0e20, 0x30a6f: 0x6d6d1020, - 0x30a70: 0x6d6d1220, 0x30a71: 0x6d6d1420, 0x30a72: 0x6d6d1620, 0x30a73: 0x6d95fe20, - 0x30a74: 0x6d960020, 0x30a75: 0x6d960220, 0x30a76: 0x6d960420, 0x30a77: 0x6d960620, - 0x30a78: 0x6db90820, 0x30a79: 0x6db90a20, 0x30a7a: 0x6dd75820, 0x30a7b: 0x6dd75a20, - 0x30a7c: 0x6dd75c20, 0x30a7d: 0x6dd75e20, 0x30a7e: 0x6dd76020, 0x30a7f: 0x6deff620, - // Block 0xc2a, offset 0x30a80 - 0x30a80: 0x6deff820, 0x30a81: 0x6e042620, 0x30a82: 0x6deffa20, 0x30a83: 0x6e042820, - 0x30a84: 0x6e154e20, 0x30a85: 0x6e155020, 0x30a86: 0x6e155220, 0x30a87: 0x6e22ea20, - 0x30a88: 0x6e22ec20, 0x30a89: 0x6c27ec20, 0x30a8a: 0x6c625a20, 0x30a8b: 0x6c625c20, - 0x30a8c: 0x6c88ee20, 0x30a8d: 0x6c88f020, 0x30a8e: 0x6c88f220, 0x30a8f: 0x6c88f420, - 0x30a90: 0x6c88f620, 0x30a91: 0x6c88f820, 0x30a92: 0x6c88fa20, 0x30a93: 0x6cb47e20, - 0x30a94: 0x6cb48020, 0x30a95: 0x6cb48220, 0x30a96: 0x6cb48420, 0x30a97: 0x6cb48620, - 0x30a98: 0x6cb48820, 0x30a99: 0x6cb48a20, 0x30a9a: 0x6cb48c20, 0x30a9b: 0x6cb48e20, - 0x30a9c: 0x6cb49020, 0x30a9d: 0x6cb49220, 0x30a9e: 0x6cb49420, 0x30a9f: 0x6ce42a20, - 0x30aa0: 0x6ce42c20, 0x30aa1: 0x6ce42e20, 0x30aa2: 0x6ce43020, 0x30aa3: 0x6ce43220, - 0x30aa4: 0x6ce43420, 0x30aa5: 0x6ce43620, 0x30aa6: 0x6d127820, 0x30aa7: 0x6d127a20, - 0x30aa8: 0x6d127c20, 0x30aa9: 0x6d127e20, 0x30aaa: 0x6d128020, 0x30aab: 0x6d128220, - 0x30aac: 0x6d128420, 0x30aad: 0x6d128620, 0x30aae: 0x6d128820, 0x30aaf: 0x6d128a20, - 0x30ab0: 0x6d128c20, 0x30ab1: 0x6d128e20, 0x30ab2: 0x6d407e20, 0x30ab3: 0x6d408020, - 0x30ab4: 0x6d408220, 0x30ab5: 0x6d408420, 0x30ab6: 0x6d408620, 0x30ab7: 0x6d408820, - 0x30ab8: 0x6d408a20, 0x30ab9: 0x6d408c20, 0x30aba: 0x6d408e20, 0x30abb: 0x6d409020, - 0x30abc: 0x6d409220, 0x30abd: 0x6d409420, 0x30abe: 0x6d409620, 0x30abf: 0x6d409820, - // Block 0xc2b, offset 0x30ac0 - 0x30ac0: 0x6d6d5020, 0x30ac1: 0x6d6d5220, 0x30ac2: 0x6d6d5420, 0x30ac3: 0x6d6d5620, - 0x30ac4: 0x6d6d5820, 0x30ac5: 0x6d6d5a20, 0x30ac6: 0x6d6d5c20, 0x30ac7: 0x6d6d5e20, - 0x30ac8: 0x6d6d6020, 0x30ac9: 0x6d6d6220, 0x30aca: 0x6d6d6420, 0x30acb: 0x6d6d6620, - 0x30acc: 0x6d6d6820, 0x30acd: 0x6d964220, 0x30ace: 0x6d964420, 0x30acf: 0x6d964620, - 0x30ad0: 0x6d964820, 0x30ad1: 0x6d964a20, 0x30ad2: 0x6d964c20, 0x30ad3: 0x6d964e20, - 0x30ad4: 0x6d965020, 0x30ad5: 0x6d965220, 0x30ad6: 0x6d965420, 0x30ad7: 0x6d965620, - 0x30ad8: 0x6db93c20, 0x30ad9: 0x6db93e20, 0x30ada: 0x6db94020, 0x30adb: 0x6db94220, - 0x30adc: 0x6db94420, 0x30add: 0x6db94620, 0x30ade: 0x6db94820, 0x30adf: 0x6db94a20, - 0x30ae0: 0x6db94c20, 0x30ae1: 0x6db94e20, 0x30ae2: 0x6db95020, 0x30ae3: 0x6db95220, - 0x30ae4: 0x6db95420, 0x30ae5: 0x6dd78220, 0x30ae6: 0x6dd78420, 0x30ae7: 0x6dd78620, - 0x30ae8: 0x6dd78820, 0x30ae9: 0x6dd78a20, 0x30aea: 0x6dd78c20, 0x30aeb: 0x6dd78e20, - 0x30aec: 0x6dd79020, 0x30aed: 0x6df01420, 0x30aee: 0x6df01620, 0x30aef: 0x6df01820, - 0x30af0: 0x6df01a20, 0x30af1: 0x6df01c20, 0x30af2: 0x6e043420, 0x30af3: 0x6e043620, - 0x30af4: 0x6e043820, 0x30af5: 0x6e043a20, 0x30af6: 0x6e043c20, 0x30af7: 0x6e043e20, - 0x30af8: 0x6e044020, 0x30af9: 0x6e156020, 0x30afa: 0x6e156220, 0x30afb: 0x6e156420, - 0x30afc: 0x6e2d2620, 0x30afd: 0x6e350220, 0x30afe: 0x6e350420, 0x30aff: 0x6e350620, - // Block 0xc2c, offset 0x30b00 - 0x30b00: 0x6e350820, 0x30b01: 0x6e3aaa20, 0x30b02: 0x6e351420, 0x30b03: 0x6e3e6e20, - 0x30b04: 0x6e3e7020, 0x30b05: 0x6e413820, 0x30b06: 0x6c27ee20, 0x30b07: 0x6c41da20, - 0x30b08: 0x6cb4c420, 0x30b09: 0x6ce46a20, 0x30b0a: 0x6ce46c20, 0x30b0b: 0x6e046220, - 0x30b0c: 0x6c27f020, 0x30b0d: 0x6c625e20, 0x30b0e: 0x6cb4cc20, 0x30b0f: 0x6ce47020, - 0x30b10: 0x6dd7ce20, 0x30b11: 0x6c41dc20, 0x30b12: 0x6c41de20, 0x30b13: 0x6c626220, - 0x30b14: 0x6c626420, 0x30b15: 0x6c890e20, 0x30b16: 0x6c891020, 0x30b17: 0x6c891220, - 0x30b18: 0x6c891420, 0x30b19: 0x6c891620, 0x30b1a: 0x6c891820, 0x30b1b: 0x6c891a20, - 0x30b1c: 0x6c891c20, 0x30b1d: 0x6c891e20, 0x30b1e: 0x6c892020, 0x30b1f: 0x6c892220, - 0x30b20: 0x6c892420, 0x30b21: 0x6c892620, 0x30b22: 0x6c892820, 0x30b23: 0x6cb4d620, - 0x30b24: 0x6cb4d820, 0x30b25: 0x6cb4da20, 0x30b26: 0x6cb4dc20, 0x30b27: 0x6cb4de20, - 0x30b28: 0x6cb4e020, 0x30b29: 0x6cb4e220, 0x30b2a: 0x6cb4e420, 0x30b2b: 0x6cb4e620, - 0x30b2c: 0x6cb4e820, 0x30b2d: 0x6cb4ea20, 0x30b2e: 0x6cb4ec20, 0x30b2f: 0x6cb4ee20, - 0x30b30: 0x6cb4f020, 0x30b31: 0x6cb4f220, 0x30b32: 0x6cb4f420, 0x30b33: 0x6cb4f620, - 0x30b34: 0x6cb4f820, 0x30b35: 0x6cb4fa20, 0x30b36: 0x6cb4fc20, 0x30b37: 0x6cb4fe20, - 0x30b38: 0x6cb50020, 0x30b39: 0x6cb50220, 0x30b3a: 0x6cb50420, 0x30b3b: 0x6cb50620, - 0x30b3c: 0x6cb50820, 0x30b3d: 0x6ce48420, 0x30b3e: 0x6ce48620, 0x30b3f: 0x6ce48820, - // Block 0xc2d, offset 0x30b40 - 0x30b40: 0x6ce48a20, 0x30b41: 0x6ce48c20, 0x30b42: 0x6ce48e20, 0x30b43: 0x6ce49020, - 0x30b44: 0x6ce49220, 0x30b45: 0x6ce49420, 0x30b46: 0x6ce49620, 0x30b47: 0x6ce49820, - 0x30b48: 0x6ce49a20, 0x30b49: 0x6ce49c20, 0x30b4a: 0x6ce49e20, 0x30b4b: 0x6ce4a020, - 0x30b4c: 0x6ce4a220, 0x30b4d: 0x6ce4a420, 0x30b4e: 0x6ce4a620, 0x30b4f: 0x6ce4a820, - 0x30b50: 0x6ce4aa20, 0x30b51: 0x6ce4ac20, 0x30b52: 0x6ce4ae20, 0x30b53: 0x6ce4b020, - 0x30b54: 0x6ce4b220, 0x30b55: 0x6ce4b420, 0x30b56: 0x6ce4b620, 0x30b57: 0x6ce4b820, - 0x30b58: 0x6ce4ba20, 0x30b59: 0x6ce4bc20, 0x30b5a: 0x6ce4be20, 0x30b5b: 0x6ce4c020, - 0x30b5c: 0x6ce4c220, 0x30b5d: 0x6ce4c420, 0x30b5e: 0x6ce4c620, 0x30b5f: 0x6ce4c820, - 0x30b60: 0x6ce4ca20, 0x30b61: 0x6ce4cc20, 0x30b62: 0x6ce4ce20, 0x30b63: 0x6ce4d020, - 0x30b64: 0x6ce4d220, 0x30b65: 0x6ce4d420, 0x30b66: 0x6ce4d620, 0x30b67: 0x6ce4d820, - 0x30b68: 0x6ce4da20, 0x30b69: 0x6ce4dc20, 0x30b6a: 0x6ce4de20, 0x30b6b: 0x6ce4e020, - 0x30b6c: 0x6ce4e220, 0x30b6d: 0x6d40d420, 0x30b6e: 0x6d12c620, 0x30b6f: 0x6d12c820, - 0x30b70: 0x6d12ca20, 0x30b71: 0x6d12cc20, 0x30b72: 0x6d12ce20, 0x30b73: 0x6d12d020, - 0x30b74: 0x6d12d220, 0x30b75: 0x6d12d420, 0x30b76: 0x6d12d620, 0x30b77: 0x6d12d820, - 0x30b78: 0x6d12da20, 0x30b79: 0x6d12dc20, 0x30b7a: 0x6d12de20, 0x30b7b: 0x6d12e020, - 0x30b7c: 0x6d12e220, 0x30b7d: 0x6d12e420, 0x30b7e: 0x6d12e620, 0x30b7f: 0x6d12e820, - // Block 0xc2e, offset 0x30b80 - 0x30b80: 0x6d12ea20, 0x30b81: 0x6d12ec20, 0x30b82: 0x6d12ee20, 0x30b83: 0x6d12f020, - 0x30b84: 0x6d12f220, 0x30b85: 0x6d12f420, 0x30b86: 0x6d12f620, 0x30b87: 0x6d12f820, - 0x30b88: 0x6d12fa20, 0x30b89: 0x6d12fc20, 0x30b8a: 0x6d12fe20, 0x30b8b: 0x6d130020, - 0x30b8c: 0x6d130220, 0x30b8d: 0x6d130420, 0x30b8e: 0x6d130620, 0x30b8f: 0x6d130820, - 0x30b90: 0x6d130a20, 0x30b91: 0x6d130c20, 0x30b92: 0x6d130e20, 0x30b93: 0x6d131020, - 0x30b94: 0x6d131220, 0x30b95: 0x6d131420, 0x30b96: 0x6d131620, 0x30b97: 0x6d131820, - 0x30b98: 0x6d131a20, 0x30b99: 0x6d131c20, 0x30b9a: 0x6d131e20, 0x30b9b: 0x6d132020, - 0x30b9c: 0x6d132220, 0x30b9d: 0x6d132420, 0x30b9e: 0x6d132620, 0x30b9f: 0x6d132820, - 0x30ba0: 0x6d132a20, 0x30ba1: 0x6d132c20, 0x30ba2: 0x6d132e20, 0x30ba3: 0x6d133020, - 0x30ba4: 0x6d133220, 0x30ba5: 0x6d133420, 0x30ba6: 0x6d133620, 0x30ba7: 0x6d133820, - 0x30ba8: 0x6d133a20, 0x30ba9: 0x6d133c20, 0x30baa: 0x6d133e20, 0x30bab: 0x6d134020, - 0x30bac: 0x6d134220, 0x30bad: 0x6d134420, 0x30bae: 0x6d134620, 0x30baf: 0x6d134820, - 0x30bb0: 0x6d134a20, 0x30bb1: 0x6d134c20, 0x30bb2: 0x6d134e20, 0x30bb3: 0x6d135020, - 0x30bb4: 0x6d135220, 0x30bb5: 0x6d40e420, 0x30bb6: 0x6d40e620, 0x30bb7: 0x6d40e820, - 0x30bb8: 0x6d40ea20, 0x30bb9: 0x6d40ec20, 0x30bba: 0x6d40ee20, 0x30bbb: 0x6d40f020, - 0x30bbc: 0x6d41c020, 0x30bbd: 0x6d40f220, 0x30bbe: 0x6d40f420, 0x30bbf: 0x6d40f620, - // Block 0xc2f, offset 0x30bc0 - 0x30bc0: 0x6d40f820, 0x30bc1: 0x6d40fa20, 0x30bc2: 0x6d40fc20, 0x30bc3: 0x6d40fe20, - 0x30bc4: 0x6d410020, 0x30bc5: 0x6d410220, 0x30bc6: 0x6d410420, 0x30bc7: 0x6d410620, - 0x30bc8: 0x6d410820, 0x30bc9: 0x6d410a20, 0x30bca: 0x6d410c20, 0x30bcb: 0x6d410e20, - 0x30bcc: 0x6d411020, 0x30bcd: 0x6d411220, 0x30bce: 0x6d411420, 0x30bcf: 0x6d135420, - 0x30bd0: 0x6d411620, 0x30bd1: 0x6d411820, 0x30bd2: 0x6d411a20, 0x30bd3: 0x6d411c20, - 0x30bd4: 0x6d411e20, 0x30bd5: 0x6d412020, 0x30bd6: 0x6d412220, 0x30bd7: 0x6d412420, - 0x30bd8: 0x6d412620, 0x30bd9: 0x6d412820, 0x30bda: 0x6d412a20, 0x30bdb: 0x6d412c20, - 0x30bdc: 0x6d412e20, 0x30bdd: 0x6d413020, 0x30bde: 0x6d413220, 0x30bdf: 0x6d413420, - 0x30be0: 0x6d413620, 0x30be1: 0x6d413820, 0x30be2: 0x6d413a20, 0x30be3: 0x6d413c20, - 0x30be4: 0x6d413e20, 0x30be5: 0x6d414020, 0x30be6: 0x6d414220, 0x30be7: 0x6d414420, - 0x30be8: 0x6d414620, 0x30be9: 0x6d414820, 0x30bea: 0x6d414a20, 0x30beb: 0x6d414c20, - 0x30bec: 0x6d414e20, 0x30bed: 0x6d415020, 0x30bee: 0x6d415220, 0x30bef: 0x6d415420, - 0x30bf0: 0x6d415620, 0x30bf1: 0x6d415820, 0x30bf2: 0x6d6dc220, 0x30bf3: 0x6d6dc420, - 0x30bf4: 0x6d6dc620, 0x30bf5: 0x6d6dc820, 0x30bf6: 0x6d6dca20, 0x30bf7: 0x6d6dcc20, - 0x30bf8: 0x6d6dce20, 0x30bf9: 0x6d6dd020, 0x30bfa: 0x6d6dd220, 0x30bfb: 0x6d6dd420, - 0x30bfc: 0x6d6dd620, 0x30bfd: 0x6d6dd820, 0x30bfe: 0x6d6dda20, 0x30bff: 0x6d6ddc20, - // Block 0xc30, offset 0x30c00 - 0x30c00: 0x6d6dde20, 0x30c01: 0x6d6de020, 0x30c02: 0x6d6de220, 0x30c03: 0x6d6de420, - 0x30c04: 0x6d6de620, 0x30c05: 0x6d6de820, 0x30c06: 0x6d6dea20, 0x30c07: 0x6d6dec20, - 0x30c08: 0x6d6dee20, 0x30c09: 0x6d6df020, 0x30c0a: 0x6d6df220, 0x30c0b: 0x6d969820, - 0x30c0c: 0x6d6df420, 0x30c0d: 0x6d6df620, 0x30c0e: 0x6d6df820, 0x30c0f: 0x6d6dfa20, - 0x30c10: 0x6d6dfc20, 0x30c11: 0x6d6dfe20, 0x30c12: 0x6d6e0020, 0x30c13: 0x6d6e0220, - 0x30c14: 0x6d6e0420, 0x30c15: 0x6d6e0620, 0x30c16: 0x6d6e0820, 0x30c17: 0x6d6e0a20, - 0x30c18: 0x6d6e0c20, 0x30c19: 0x6d6e0e20, 0x30c1a: 0x6d6e1020, 0x30c1b: 0x6d6e1220, - 0x30c1c: 0x6d6e1420, 0x30c1d: 0x6d6e1620, 0x30c1e: 0x6d6e1820, 0x30c1f: 0x6d6e1a20, - 0x30c20: 0x6d6e1c20, 0x30c21: 0x6d6e1e20, 0x30c22: 0x6d6e2020, 0x30c23: 0x6d6e2220, - 0x30c24: 0x6d6e2420, 0x30c25: 0x6d6e2620, 0x30c26: 0x6d6e2820, 0x30c27: 0x6d6e2a20, - 0x30c28: 0x6d6e2c20, 0x30c29: 0x6d6e2e20, 0x30c2a: 0x6d6e3020, 0x30c2b: 0x6d6e3220, - 0x30c2c: 0x6d6e3420, 0x30c2d: 0x6d6e3620, 0x30c2e: 0x6d41be20, 0x30c2f: 0x6d6e3820, - 0x30c30: 0x6d6e3a20, 0x30c31: 0x6d6e3c20, 0x30c32: 0x6d6e3e20, 0x30c33: 0x6d6e4020, - 0x30c34: 0x6d6e4220, 0x30c35: 0x6d6e4420, 0x30c36: 0x6d6e4620, 0x30c37: 0x6d96a220, - 0x30c38: 0x6d96a420, 0x30c39: 0x6d96a620, 0x30c3a: 0x6d96a820, 0x30c3b: 0x6d96aa20, - 0x30c3c: 0x6d96ac20, 0x30c3d: 0x6d96ae20, 0x30c3e: 0x6d96b020, 0x30c3f: 0x6d96b220, - // Block 0xc31, offset 0x30c40 - 0x30c40: 0x6d96b420, 0x30c41: 0x6d96b620, 0x30c42: 0x6d96b820, 0x30c43: 0x6d96ba20, - 0x30c44: 0x6d96bc20, 0x30c45: 0x6d96be20, 0x30c46: 0x6d96c020, 0x30c47: 0x6d96c220, - 0x30c48: 0x6d96c420, 0x30c49: 0x6d96c620, 0x30c4a: 0x6d96c820, 0x30c4b: 0x6d96ca20, - 0x30c4c: 0x6d96cc20, 0x30c4d: 0x6d96ce20, 0x30c4e: 0x6d96d020, 0x30c4f: 0x6d96d220, - 0x30c50: 0x6d96d420, 0x30c51: 0x6d96d620, 0x30c52: 0x6d96d820, 0x30c53: 0x6d96da20, - 0x30c54: 0x6d96dc20, 0x30c55: 0x6d96de20, 0x30c56: 0x6d96e020, 0x30c57: 0x6d96e220, - 0x30c58: 0x6d96e420, 0x30c59: 0x6d96e620, 0x30c5a: 0x6d96e820, 0x30c5b: 0x6d96ea20, - 0x30c5c: 0x6d96ec20, 0x30c5d: 0x6d96ee20, 0x30c5e: 0x6d96f020, 0x30c5f: 0x6d96f220, - 0x30c60: 0x6d96f420, 0x30c61: 0x6d96f620, 0x30c62: 0x6d96f820, 0x30c63: 0x6d96fa20, - 0x30c64: 0x6d96fc20, 0x30c65: 0x6d96fe20, 0x30c66: 0x6d970020, 0x30c67: 0x6d970220, - 0x30c68: 0x6db9ac20, 0x30c69: 0x6d970420, 0x30c6a: 0x6d970620, 0x30c6b: 0x6d970820, - 0x30c6c: 0x6d970a20, 0x30c6d: 0x6d970c20, 0x30c6e: 0x6d970e20, 0x30c6f: 0x6d971020, - 0x30c70: 0x6d971220, 0x30c71: 0x6d971420, 0x30c72: 0x6d971620, 0x30c73: 0x6d971820, - 0x30c74: 0x6d971a20, 0x30c75: 0x6d971c20, 0x30c76: 0x6d971e20, 0x30c77: 0x6d972020, - 0x30c78: 0x6d972220, 0x30c79: 0x6d972420, 0x30c7a: 0x6d972620, 0x30c7b: 0x6d972820, - 0x30c7c: 0x6d972a20, 0x30c7d: 0x6d972c20, 0x30c7e: 0x6d972e20, 0x30c7f: 0x6d973020, - // Block 0xc32, offset 0x30c80 - 0x30c80: 0x6d973220, 0x30c81: 0x6d973420, 0x30c82: 0x6d973620, 0x30c83: 0x6d973820, - 0x30c84: 0x6d973a20, 0x30c85: 0x6d973c20, 0x30c86: 0x6d973e20, 0x30c87: 0x6db9ae20, - 0x30c88: 0x6d974020, 0x30c89: 0x6db9b020, 0x30c8a: 0x6db9b220, 0x30c8b: 0x6db9b420, - 0x30c8c: 0x6db9b620, 0x30c8d: 0x6db9b820, 0x30c8e: 0x6db9ba20, 0x30c8f: 0x6db9bc20, - 0x30c90: 0x6db9be20, 0x30c91: 0x6db9c020, 0x30c92: 0x6db9c220, 0x30c93: 0x6db9c420, - 0x30c94: 0x6db9c620, 0x30c95: 0x6db9c820, 0x30c96: 0x6db9ca20, 0x30c97: 0x6db9cc20, - 0x30c98: 0x6db9ce20, 0x30c99: 0x6db9d020, 0x30c9a: 0x6db9d220, 0x30c9b: 0x6db9d420, - 0x30c9c: 0x6db9d620, 0x30c9d: 0x6db9d820, 0x30c9e: 0x6db9da20, 0x30c9f: 0x6db9dc20, - 0x30ca0: 0x6db9de20, 0x30ca1: 0x6db9e020, 0x30ca2: 0x6db9e220, 0x30ca3: 0x6db9e420, - 0x30ca4: 0x6db9e620, 0x30ca5: 0x6db9e820, 0x30ca6: 0x6db9ea20, 0x30ca7: 0x6db9ec20, - 0x30ca8: 0x6db9ee20, 0x30ca9: 0x6db9f020, 0x30caa: 0x6db9f220, 0x30cab: 0x6db9f420, - 0x30cac: 0x6db9f620, 0x30cad: 0x6db9f820, 0x30cae: 0x6db9fa20, 0x30caf: 0x6db9fc20, - 0x30cb0: 0x6db9fe20, 0x30cb1: 0x6dba0020, 0x30cb2: 0x6dba0220, 0x30cb3: 0x6dba0420, - 0x30cb4: 0x6dba0620, 0x30cb5: 0x6dba0820, 0x30cb6: 0x6dba0a20, 0x30cb7: 0x6dba0c20, - 0x30cb8: 0x6dba0e20, 0x30cb9: 0x6dba1020, 0x30cba: 0x6d97ec20, 0x30cbb: 0x6dba1220, - 0x30cbc: 0x6dba1420, 0x30cbd: 0x6dba1620, 0x30cbe: 0x6dba1820, 0x30cbf: 0x6dba1a20, - // Block 0xc33, offset 0x30cc0 - 0x30cc0: 0x6dba1c20, 0x30cc1: 0x6dba1e20, 0x30cc2: 0x6dba2020, 0x30cc3: 0x6dba2220, - 0x30cc4: 0x6dba2420, 0x30cc5: 0x6dba2620, 0x30cc6: 0x6dba2820, 0x30cc7: 0x6dba2a20, - 0x30cc8: 0x6dd7ee20, 0x30cc9: 0x6dd7f020, 0x30cca: 0x6dd7f220, 0x30ccb: 0x6dd7f420, - 0x30ccc: 0x6dd7f620, 0x30ccd: 0x6dd7f820, 0x30cce: 0x6dd7fa20, 0x30ccf: 0x6dd7fc20, - 0x30cd0: 0x6dd7fe20, 0x30cd1: 0x6dd80020, 0x30cd2: 0x6dd80220, 0x30cd3: 0x6dd80420, - 0x30cd4: 0x6dd80620, 0x30cd5: 0x6dd80820, 0x30cd6: 0x6dd80a20, 0x30cd7: 0x6dd80c20, - 0x30cd8: 0x6dd80e20, 0x30cd9: 0x6dd81020, 0x30cda: 0x6dd81220, 0x30cdb: 0x6dd81420, - 0x30cdc: 0x6dd81620, 0x30cdd: 0x6dd81820, 0x30cde: 0x6dd81a20, 0x30cdf: 0x6dd81c20, - 0x30ce0: 0x6dd81e20, 0x30ce1: 0x6dbaec20, 0x30ce2: 0x6dd82020, 0x30ce3: 0x6dd82220, - 0x30ce4: 0x6dd82420, 0x30ce5: 0x6dd82620, 0x30ce6: 0x6dd82820, 0x30ce7: 0x6dd82a20, - 0x30ce8: 0x6dd82c20, 0x30ce9: 0x6df06e20, 0x30cea: 0x6dd82e20, 0x30ceb: 0x6dd83020, - 0x30cec: 0x6dd83220, 0x30ced: 0x6dd83420, 0x30cee: 0x6dd83620, 0x30cef: 0x6dbaee20, - 0x30cf0: 0x6dd83820, 0x30cf1: 0x6dd83a20, 0x30cf2: 0x6dd83c20, 0x30cf3: 0x6dd83e20, - 0x30cf4: 0x6dd84020, 0x30cf5: 0x6dd84220, 0x30cf6: 0x6dd84420, 0x30cf7: 0x6dd84620, - 0x30cf8: 0x6dd84820, 0x30cf9: 0x6dd84a20, 0x30cfa: 0x6dd84c20, 0x30cfb: 0x6dd84e20, - 0x30cfc: 0x6dd85020, 0x30cfd: 0x6dd85220, 0x30cfe: 0x6dd85420, 0x30cff: 0x6dd85620, - // Block 0xc34, offset 0x30d00 - 0x30d00: 0x6df07020, 0x30d01: 0x6df07220, 0x30d02: 0x6df07420, 0x30d03: 0x6df07620, - 0x30d04: 0x6df07820, 0x30d05: 0x6df07a20, 0x30d06: 0x6df07c20, 0x30d07: 0x6df07e20, - 0x30d08: 0x6df08020, 0x30d09: 0x6df08220, 0x30d0a: 0x6df08420, 0x30d0b: 0x6df08620, - 0x30d0c: 0x6df08820, 0x30d0d: 0x6df08a20, 0x30d0e: 0x6df08c20, 0x30d0f: 0x6df08e20, - 0x30d10: 0x6df09020, 0x30d11: 0x6df09220, 0x30d12: 0x6df09420, 0x30d13: 0x6df09620, - 0x30d14: 0x6df09820, 0x30d15: 0x6df09a20, 0x30d16: 0x6df09c20, 0x30d17: 0x6df09e20, - 0x30d18: 0x6df0a020, 0x30d19: 0x6df0a220, 0x30d1a: 0x6df0a420, 0x30d1b: 0x6df0a620, - 0x30d1c: 0x6df0a820, 0x30d1d: 0x6df0aa20, 0x30d1e: 0x6df0ac20, 0x30d1f: 0x6df0ae20, - 0x30d20: 0x6df0b020, 0x30d21: 0x6df0b220, 0x30d22: 0x6df0b420, 0x30d23: 0x6df0b620, - 0x30d24: 0x6df0b820, 0x30d25: 0x6df0ba20, 0x30d26: 0x6df0bc20, 0x30d27: 0x6df0be20, - 0x30d28: 0x6df0c020, 0x30d29: 0x6df0c220, 0x30d2a: 0x6df0c420, 0x30d2b: 0x6df0c620, - 0x30d2c: 0x6df0c820, 0x30d2d: 0x6df0ca20, 0x30d2e: 0x6df0cc20, 0x30d2f: 0x6df0ce20, - 0x30d30: 0x6df0d020, 0x30d31: 0x6df0d220, 0x30d32: 0x6df0d420, 0x30d33: 0x6e047c20, - 0x30d34: 0x6e159420, 0x30d35: 0x6e047e20, 0x30d36: 0x6e048020, 0x30d37: 0x6e048220, - 0x30d38: 0x6e048420, 0x30d39: 0x6df0d620, 0x30d3a: 0x6e048620, 0x30d3b: 0x6e048820, - 0x30d3c: 0x6e048a20, 0x30d3d: 0x6e048c20, 0x30d3e: 0x6e048e20, 0x30d3f: 0x6e049020, - // Block 0xc35, offset 0x30d40 - 0x30d40: 0x6e049220, 0x30d41: 0x6e049420, 0x30d42: 0x6e049620, 0x30d43: 0x6e049820, - 0x30d44: 0x6e049a20, 0x30d45: 0x6e049c20, 0x30d46: 0x6e049e20, 0x30d47: 0x6e04a020, - 0x30d48: 0x6e04a220, 0x30d49: 0x6e04a420, 0x30d4a: 0x6e04a620, 0x30d4b: 0x6e04a820, - 0x30d4c: 0x6e04aa20, 0x30d4d: 0x6e04ac20, 0x30d4e: 0x6e04ae20, 0x30d4f: 0x6e04b020, - 0x30d50: 0x6e04b220, 0x30d51: 0x6e04b420, 0x30d52: 0x6e04b620, 0x30d53: 0x6e04b820, - 0x30d54: 0x6e04ba20, 0x30d55: 0x6e04bc20, 0x30d56: 0x6e04be20, 0x30d57: 0x6e04c020, - 0x30d58: 0x6e04c220, 0x30d59: 0x6e04c420, 0x30d5a: 0x6e04c620, 0x30d5b: 0x6e04c820, - 0x30d5c: 0x6e04ca20, 0x30d5d: 0x6e04cc20, 0x30d5e: 0x6e04ce20, 0x30d5f: 0x6e04d020, - 0x30d60: 0x6e04d220, 0x30d61: 0x6e04d420, 0x30d62: 0x6e04d620, 0x30d63: 0x6e04d820, - 0x30d64: 0x6e04da20, 0x30d65: 0x6e04dc20, 0x30d66: 0x6e04de20, 0x30d67: 0x6e04e020, - 0x30d68: 0x6e04e220, 0x30d69: 0x6e159620, 0x30d6a: 0x6e159820, 0x30d6b: 0x6e159a20, - 0x30d6c: 0x6e159c20, 0x30d6d: 0x6e159e20, 0x30d6e: 0x6e15a020, 0x30d6f: 0x6e058820, - 0x30d70: 0x6e15a220, 0x30d71: 0x6e15a420, 0x30d72: 0x6e15a620, 0x30d73: 0x6e15a820, - 0x30d74: 0x6e15aa20, 0x30d75: 0x6e15ac20, 0x30d76: 0x6e15ae20, 0x30d77: 0x6e15b020, - 0x30d78: 0x6e15b220, 0x30d79: 0x6e15b420, 0x30d7a: 0x6e15b620, 0x30d7b: 0x6e15b820, - 0x30d7c: 0x6e058a20, 0x30d7d: 0x6e15ba20, 0x30d7e: 0x6e15bc20, 0x30d7f: 0x6e15be20, - // Block 0xc36, offset 0x30d80 - 0x30d80: 0x6e15c020, 0x30d81: 0x6e15c220, 0x30d82: 0x6e231620, 0x30d83: 0x6e231820, - 0x30d84: 0x6e231a20, 0x30d85: 0x6e231c20, 0x30d86: 0x6e231e20, 0x30d87: 0x6e232020, - 0x30d88: 0x6e232220, 0x30d89: 0x6e232420, 0x30d8a: 0x6e232620, 0x30d8b: 0x6e232820, - 0x30d8c: 0x6e232a20, 0x30d8d: 0x6e232c20, 0x30d8e: 0x6e232e20, 0x30d8f: 0x6e233020, - 0x30d90: 0x6e233220, 0x30d91: 0x6e233420, 0x30d92: 0x6e233620, 0x30d93: 0x6e233820, - 0x30d94: 0x6e233a20, 0x30d95: 0x6e2d4620, 0x30d96: 0x6e2d4820, 0x30d97: 0x6e2d4a20, - 0x30d98: 0x6e2d4c20, 0x30d99: 0x6e2d4e20, 0x30d9a: 0x6e2d5020, 0x30d9b: 0x6e2d5220, - 0x30d9c: 0x6e2d5420, 0x30d9d: 0x6e2d5620, 0x30d9e: 0x6e2d5820, 0x30d9f: 0x6e2d5a20, - 0x30da0: 0x6e2d5c20, 0x30da1: 0x6e2d5e20, 0x30da2: 0x6e2d6020, 0x30da3: 0x6e2d6220, - 0x30da4: 0x6e2d6420, 0x30da5: 0x6e2d6620, 0x30da6: 0x6e2d6820, 0x30da7: 0x6e233c20, - 0x30da8: 0x6e351c20, 0x30da9: 0x6e351e20, 0x30daa: 0x6e352020, 0x30dab: 0x6e352220, - 0x30dac: 0x6e352420, 0x30dad: 0x6e3ab420, 0x30dae: 0x6e3ab620, 0x30daf: 0x6e3ab820, - 0x30db0: 0x6e3aba20, 0x30db1: 0x6e3abc20, 0x30db2: 0x6e3abe20, 0x30db3: 0x6e3ac020, - 0x30db4: 0x6e3e7620, 0x30db5: 0x6e3e7820, 0x30db6: 0x6e3e7a20, 0x30db7: 0x6e3e7c20, - 0x30db8: 0x6e3e7e20, 0x30db9: 0x6e3e8020, 0x30dba: 0x6e3e8220, 0x30dbb: 0x6e414020, - 0x30dbc: 0x6e414220, 0x30dbd: 0x6e414420, 0x30dbe: 0x6e414620, 0x30dbf: 0x6e434020, - // Block 0xc37, offset 0x30dc0 - 0x30dc0: 0x6e434220, 0x30dc1: 0x6e434420, 0x30dc2: 0x6e434620, 0x30dc3: 0x6e449420, - 0x30dc4: 0x6e449620, 0x30dc5: 0x6c0aaa20, 0x30dc6: 0x6c158c20, 0x30dc7: 0x6c158e20, - 0x30dc8: 0x6c27f220, 0x30dc9: 0x6c27f420, 0x30dca: 0x6c27f620, 0x30dcb: 0x6c27f820, - 0x30dcc: 0x6c27fa20, 0x30dcd: 0x6c41e020, 0x30dce: 0x6c41e220, 0x30dcf: 0x6c41e420, - 0x30dd0: 0x6c41e620, 0x30dd1: 0x6c41e820, 0x30dd2: 0x6c41ea20, 0x30dd3: 0x6c41ec20, - 0x30dd4: 0x6c41ee20, 0x30dd5: 0x6c41f020, 0x30dd6: 0x6c41f220, 0x30dd7: 0x6c41f420, - 0x30dd8: 0x6c626620, 0x30dd9: 0x6c626820, 0x30dda: 0x6c626a20, 0x30ddb: 0x6c626c20, - 0x30ddc: 0x6c626e20, 0x30ddd: 0x6c627020, 0x30dde: 0x6c627220, 0x30ddf: 0x6c627420, - 0x30de0: 0x6c627620, 0x30de1: 0x6c627820, 0x30de2: 0x6c627a20, 0x30de3: 0x6c627c20, - 0x30de4: 0x6c627e20, 0x30de5: 0x6c628020, 0x30de6: 0x6c628220, 0x30de7: 0x6c628420, - 0x30de8: 0x6c628620, 0x30de9: 0x6c628820, 0x30dea: 0x6c628a20, 0x30deb: 0x6c628c20, - 0x30dec: 0x6c628e20, 0x30ded: 0x6c629020, 0x30dee: 0x6c629220, 0x30def: 0x6c629420, - 0x30df0: 0x6c893420, 0x30df1: 0x6c893620, 0x30df2: 0x6c893820, 0x30df3: 0x6c893a20, - 0x30df4: 0x6c893c20, 0x30df5: 0x6c893e20, 0x30df6: 0x6c894020, 0x30df7: 0x6c894220, - 0x30df8: 0x6c894420, 0x30df9: 0x6c894620, 0x30dfa: 0x6c894820, 0x30dfb: 0x6c894a20, - 0x30dfc: 0x6c894c20, 0x30dfd: 0x6c894e20, 0x30dfe: 0x6c895020, 0x30dff: 0x6c895220, - // Block 0xc38, offset 0x30e00 - 0x30e00: 0x6c895420, 0x30e01: 0x6c895620, 0x30e02: 0x6c895820, 0x30e03: 0x6c895a20, - 0x30e04: 0x6c895c20, 0x30e05: 0x6c895e20, 0x30e06: 0x6c896020, 0x30e07: 0x6c896220, - 0x30e08: 0x6c896420, 0x30e09: 0x6c896620, 0x30e0a: 0x6c896820, 0x30e0b: 0x6c896a20, - 0x30e0c: 0x6c896c20, 0x30e0d: 0x6c896e20, 0x30e0e: 0x6c897020, 0x30e0f: 0x6cb52220, - 0x30e10: 0x6cb52420, 0x30e11: 0x6cb52620, 0x30e12: 0x6cb52820, 0x30e13: 0x6cb52a20, - 0x30e14: 0x6cb52c20, 0x30e15: 0x6cb52e20, 0x30e16: 0x6cb53020, 0x30e17: 0x6cb53220, - 0x30e18: 0x6cb53420, 0x30e19: 0x6cb53620, 0x30e1a: 0x6cb53820, 0x30e1b: 0x6cb53a20, - 0x30e1c: 0x6cb53c20, 0x30e1d: 0x6cb53e20, 0x30e1e: 0x6cb54020, 0x30e1f: 0x6cb54220, - 0x30e20: 0x6cb54420, 0x30e21: 0x6cb54620, 0x30e22: 0x6cb54820, 0x30e23: 0x6cb54a20, - 0x30e24: 0x6cb54c20, 0x30e25: 0x6cb54e20, 0x30e26: 0x6cb55020, 0x30e27: 0x6cb55220, - 0x30e28: 0x6cb55420, 0x30e29: 0x6cb55620, 0x30e2a: 0x6cb55820, 0x30e2b: 0x6cb55a20, - 0x30e2c: 0x6cb55c20, 0x30e2d: 0x6cb55e20, 0x30e2e: 0x6cb56020, 0x30e2f: 0x6cb56220, - 0x30e30: 0x6cb56420, 0x30e31: 0x6cb56620, 0x30e32: 0x6cb56820, 0x30e33: 0x6cb56a20, - 0x30e34: 0x6cb56c20, 0x30e35: 0x6cb56e20, 0x30e36: 0x6cb57020, 0x30e37: 0x6cb57220, - 0x30e38: 0x6ce52a20, 0x30e39: 0x6ce52c20, 0x30e3a: 0x6ce52e20, 0x30e3b: 0x6ce53020, - 0x30e3c: 0x6ce53220, 0x30e3d: 0x6ce53420, 0x30e3e: 0x6ce53620, 0x30e3f: 0x6ce53820, - // Block 0xc39, offset 0x30e40 - 0x30e40: 0x6ce53a20, 0x30e41: 0x6ce53c20, 0x30e42: 0x6ce53e20, 0x30e43: 0x6ce54020, - 0x30e44: 0x6ce54220, 0x30e45: 0x6ce54420, 0x30e46: 0x6ce54620, 0x30e47: 0x6ce54820, - 0x30e48: 0x6ce54a20, 0x30e49: 0x6ce54c20, 0x30e4a: 0x6ce54e20, 0x30e4b: 0x6ce55020, - 0x30e4c: 0x6ce55220, 0x30e4d: 0x6ce55420, 0x30e4e: 0x6ce55620, 0x30e4f: 0x6ce55820, - 0x30e50: 0x6ce55a20, 0x30e51: 0x6ce55c20, 0x30e52: 0x6ce55e20, 0x30e53: 0x6ce56020, - 0x30e54: 0x6ce56220, 0x30e55: 0x6ce56420, 0x30e56: 0x6d13a420, 0x30e57: 0x6d13a620, - 0x30e58: 0x6d13a820, 0x30e59: 0x6d13aa20, 0x30e5a: 0x6d13ac20, 0x30e5b: 0x6d13ae20, - 0x30e5c: 0x6d13b020, 0x30e5d: 0x6d13b220, 0x30e5e: 0x6d13b420, 0x30e5f: 0x6d13b620, - 0x30e60: 0x6d13b820, 0x30e61: 0x6d13ba20, 0x30e62: 0x6d13bc20, 0x30e63: 0x6d13be20, - 0x30e64: 0x6d13c020, 0x30e65: 0x6d13c220, 0x30e66: 0x6d13c420, 0x30e67: 0x6d13c620, - 0x30e68: 0x6d13c820, 0x30e69: 0x6d13ca20, 0x30e6a: 0x6d13cc20, 0x30e6b: 0x6d13ce20, - 0x30e6c: 0x6d13d020, 0x30e6d: 0x6d13d220, 0x30e6e: 0x6d13d420, 0x30e6f: 0x6d13d620, - 0x30e70: 0x6d13d820, 0x30e71: 0x6d13da20, 0x30e72: 0x6d41c420, 0x30e73: 0x6d41c620, - 0x30e74: 0x6d41c820, 0x30e75: 0x6d41ca20, 0x30e76: 0x6d41cc20, 0x30e77: 0x6d41ce20, - 0x30e78: 0x6d41d020, 0x30e79: 0x6d41d220, 0x30e7a: 0x6d41d420, 0x30e7b: 0x6d41d620, - 0x30e7c: 0x6d41d820, 0x30e7d: 0x6d41da20, 0x30e7e: 0x6d41dc20, 0x30e7f: 0x6d41de20, - // Block 0xc3a, offset 0x30e80 - 0x30e80: 0x6d41e020, 0x30e81: 0x6d41e220, 0x30e82: 0x6d41e420, 0x30e83: 0x6d41e620, - 0x30e84: 0x6d41e820, 0x30e85: 0x6d41ea20, 0x30e86: 0x6d6ed220, 0x30e87: 0x6d6ed420, - 0x30e88: 0x6d6ed620, 0x30e89: 0x6d6ed820, 0x30e8a: 0x6d6eda20, 0x30e8b: 0x6d6edc20, - 0x30e8c: 0x6d6ede20, 0x30e8d: 0x6d6ee020, 0x30e8e: 0x6d6ee220, 0x30e8f: 0x6d6ee420, - 0x30e90: 0x6d6ee620, 0x30e91: 0x6d6ee820, 0x30e92: 0x6d6eea20, 0x30e93: 0x6d6eec20, - 0x30e94: 0x6d6eee20, 0x30e95: 0x6d6ef020, 0x30e96: 0x6d97ee20, 0x30e97: 0x6d97f020, - 0x30e98: 0x6d97f220, 0x30e99: 0x6d97f420, 0x30e9a: 0x6d97f620, 0x30e9b: 0x6d97f820, - 0x30e9c: 0x6d97fa20, 0x30e9d: 0x6d97fc20, 0x30e9e: 0x6d97fe20, 0x30e9f: 0x6d980020, - 0x30ea0: 0x6d980220, 0x30ea1: 0x6dbaf020, 0x30ea2: 0x6dbaf220, 0x30ea3: 0x6dbaf420, - 0x30ea4: 0x6dbaf620, 0x30ea5: 0x6dbaf820, 0x30ea6: 0x6dbafa20, 0x30ea7: 0x6dbafc20, - 0x30ea8: 0x6dbafe20, 0x30ea9: 0x6dbb0020, 0x30eaa: 0x6dbb0220, 0x30eab: 0x6dbb0420, - 0x30eac: 0x6dd8fc20, 0x30ead: 0x6dd8fe20, 0x30eae: 0x6dd90020, 0x30eaf: 0x6dd90220, - 0x30eb0: 0x6dd90420, 0x30eb1: 0x6dd90620, 0x30eb2: 0x6df15e20, 0x30eb3: 0x6e059220, - 0x30eb4: 0x6e059420, 0x30eb5: 0x6e239420, 0x30eb6: 0x6e239620, 0x30eb7: 0x6c41fe20, - 0x30eb8: 0x6c420020, 0x30eb9: 0x6cb58a20, 0x30eba: 0x6cb58c20, 0x30ebb: 0x6ce57220, - 0x30ebc: 0x6d6f0020, 0x30ebd: 0x6df16620, 0x30ebe: 0x6e239820, 0x30ebf: 0x6c0aac20, - // Block 0xc3b, offset 0x30ec0 - 0x30ec0: 0x6c420220, 0x30ec1: 0x6c62ac20, 0x30ec2: 0x6c62ae20, 0x30ec3: 0x6c898420, - 0x30ec4: 0x6c898620, 0x30ec5: 0x6c898820, 0x30ec6: 0x6cb5aa20, 0x30ec7: 0x6cb5ac20, - 0x30ec8: 0x6cb5ae20, 0x30ec9: 0x6cb5b020, 0x30eca: 0x6cb5b220, 0x30ecb: 0x6ce59420, - 0x30ecc: 0x6ce59620, 0x30ecd: 0x6ce59820, 0x30ece: 0x6ce59a20, 0x30ecf: 0x6ce59c20, - 0x30ed0: 0x6ce59e20, 0x30ed1: 0x6ce5a020, 0x30ed2: 0x6ce5a220, 0x30ed3: 0x6ce5a420, - 0x30ed4: 0x6ce5a620, 0x30ed5: 0x6ce5a820, 0x30ed6: 0x6ce5aa20, 0x30ed7: 0x6ce5ac20, - 0x30ed8: 0x6d141e20, 0x30ed9: 0x6d142020, 0x30eda: 0x6d142220, 0x30edb: 0x6d142420, - 0x30edc: 0x6d142620, 0x30edd: 0x6d142820, 0x30ede: 0x6d142a20, 0x30edf: 0x6d142c20, - 0x30ee0: 0x6d142e20, 0x30ee1: 0x6d421a20, 0x30ee2: 0x6d421c20, 0x30ee3: 0x6d421e20, - 0x30ee4: 0x6d422020, 0x30ee5: 0x6d422220, 0x30ee6: 0x6d422420, 0x30ee7: 0x6d422620, - 0x30ee8: 0x6d422820, 0x30ee9: 0x6d422a20, 0x30eea: 0x6d422c20, 0x30eeb: 0x6d6f2420, - 0x30eec: 0x6d6f2620, 0x30eed: 0x6d6f2820, 0x30eee: 0x6d6f2a20, 0x30eef: 0x6d6f2c20, - 0x30ef0: 0x6d6f2e20, 0x30ef1: 0x6d6f3020, 0x30ef2: 0x6d6f3220, 0x30ef3: 0x6d6f3420, - 0x30ef4: 0x6d6f3620, 0x30ef5: 0x6d983620, 0x30ef6: 0x6d983820, 0x30ef7: 0x6dbb3420, - 0x30ef8: 0x6d983a20, 0x30ef9: 0x6d983c20, 0x30efa: 0x6d983e20, 0x30efb: 0x6d984020, - 0x30efc: 0x6d984220, 0x30efd: 0x6d984420, 0x30efe: 0x6d984620, 0x30eff: 0x6d984820, - // Block 0xc3c, offset 0x30f00 - 0x30f00: 0x6dbb2420, 0x30f01: 0x6d984a20, 0x30f02: 0x6d984c20, 0x30f03: 0x6dbb3620, - 0x30f04: 0x6dbb3820, 0x30f05: 0x6dbb3a20, 0x30f06: 0x6dbb3c20, 0x30f07: 0x6dbb3e20, - 0x30f08: 0x6dbb4020, 0x30f09: 0x6dbb4220, 0x30f0a: 0x6dbb4420, 0x30f0b: 0x6dbb4620, - 0x30f0c: 0x6dbb4820, 0x30f0d: 0x6d988e20, 0x30f0e: 0x6dbb4a20, 0x30f0f: 0x6dbb4c20, - 0x30f10: 0x6dd92020, 0x30f11: 0x6dd92220, 0x30f12: 0x6dd92420, 0x30f13: 0x6dd92620, - 0x30f14: 0x6dd92820, 0x30f15: 0x6dd92a20, 0x30f16: 0x6dd92c20, 0x30f17: 0x6dd92e20, - 0x30f18: 0x6dd93020, 0x30f19: 0x6df17620, 0x30f1a: 0x6df17820, 0x30f1b: 0x6df17a20, - 0x30f1c: 0x6df17c20, 0x30f1d: 0x6df17e20, 0x30f1e: 0x6e05a220, 0x30f1f: 0x6e05a420, - 0x30f20: 0x6e05a620, 0x30f21: 0x6e05a820, 0x30f22: 0x6e165c20, 0x30f23: 0x6e165e20, - 0x30f24: 0x6e166020, 0x30f25: 0x6e166220, 0x30f26: 0x6e166420, 0x30f27: 0x6e23a620, - 0x30f28: 0x6c020a20, 0x30f29: 0x6c052620, 0x30f2a: 0x6c0aae20, 0x30f2b: 0x6c159020, - 0x30f2c: 0x6c159220, 0x30f2d: 0x6c159420, 0x30f2e: 0x6c159620, 0x30f2f: 0x6c159820, - 0x30f30: 0x6c280420, 0x30f31: 0x6c280620, 0x30f32: 0x6c280820, 0x30f33: 0x6c280a20, - 0x30f34: 0x6c280c20, 0x30f35: 0x6c280e20, 0x30f36: 0x6c281020, 0x30f37: 0x6c281220, - 0x30f38: 0x6c420820, 0x30f39: 0x6c420a20, 0x30f3a: 0x6c62b420, 0x30f3b: 0x6c62b620, - 0x30f3c: 0x6c62b820, 0x30f3d: 0x6c62ba20, 0x30f3e: 0x6c62bc20, 0x30f3f: 0x6c62be20, - // Block 0xc3d, offset 0x30f40 - 0x30f40: 0x6c62c020, 0x30f41: 0x6c62c220, 0x30f42: 0x6c62c420, 0x30f43: 0x6c899620, - 0x30f44: 0x6c899820, 0x30f45: 0x6c899a20, 0x30f46: 0x6c899c20, 0x30f47: 0x6cb5c420, - 0x30f48: 0x6cb5c620, 0x30f49: 0x6cb5c820, 0x30f4a: 0x6cb5ca20, 0x30f4b: 0x6cb5cc20, - 0x30f4c: 0x6cb5ce20, 0x30f4d: 0x6cb5d020, 0x30f4e: 0x6cb5d220, 0x30f4f: 0x6cb5d420, - 0x30f50: 0x6cb5d620, 0x30f51: 0x6ce5ea20, 0x30f52: 0x6ce5ec20, 0x30f53: 0x6ce5ee20, - 0x30f54: 0x6ce5f020, 0x30f55: 0x6ce5f220, 0x30f56: 0x6d146e20, 0x30f57: 0x6d147020, - 0x30f58: 0x6d147220, 0x30f59: 0x6d147420, 0x30f5a: 0x6d426420, 0x30f5b: 0x6d989020, - 0x30f5c: 0x6c421020, 0x30f5d: 0x6c020c20, 0x30f5e: 0x6c0ab420, 0x30f5f: 0x6c0ab620, - 0x30f60: 0x6c15a420, 0x30f61: 0x6c15a620, 0x30f62: 0x6c15a820, 0x30f63: 0x6c15aa20, - 0x30f64: 0x6c15ac20, 0x30f65: 0x6c282620, 0x30f66: 0x6c282820, 0x30f67: 0x6c282a20, - 0x30f68: 0x6c282c20, 0x30f69: 0x6c282e20, 0x30f6a: 0x6c283020, 0x30f6b: 0x6c283220, - 0x30f6c: 0x6c283420, 0x30f6d: 0x6c283620, 0x30f6e: 0x6c283820, 0x30f6f: 0x6c283a20, - 0x30f70: 0x6c283c20, 0x30f71: 0x6c283e20, 0x30f72: 0x6c284020, 0x30f73: 0x6c284220, - 0x30f74: 0x6c284420, 0x30f75: 0x6c284620, 0x30f76: 0x6c284820, 0x30f77: 0x6c421820, - 0x30f78: 0x6c421a20, 0x30f79: 0x6c421c20, 0x30f7a: 0x6c421e20, 0x30f7b: 0x6c422020, - 0x30f7c: 0x6c422220, 0x30f7d: 0x6c422420, 0x30f7e: 0x6c422620, 0x30f7f: 0x6c422820, - // Block 0xc3e, offset 0x30f80 - 0x30f80: 0x6c422a20, 0x30f81: 0x6c422c20, 0x30f82: 0x6c422e20, 0x30f83: 0x6c423020, - 0x30f84: 0x6c423220, 0x30f85: 0x6c423420, 0x30f86: 0x6c423620, 0x30f87: 0x6c423820, - 0x30f88: 0x6c423a20, 0x30f89: 0x6c423c20, 0x30f8a: 0x6c62d620, 0x30f8b: 0x6c62d820, - 0x30f8c: 0x6c62da20, 0x30f8d: 0x6c62dc20, 0x30f8e: 0x6c62de20, 0x30f8f: 0x6c62e020, - 0x30f90: 0x6c62e220, 0x30f91: 0x6c62e420, 0x30f92: 0x6c62e620, 0x30f93: 0x6c62e820, - 0x30f94: 0x6c62ea20, 0x30f95: 0x6c62ec20, 0x30f96: 0x6c89b220, 0x30f97: 0x6c89b420, - 0x30f98: 0x6c89b620, 0x30f99: 0x6c89b820, 0x30f9a: 0x6c89d820, 0x30f9b: 0x6c89ba20, - 0x30f9c: 0x6c89bc20, 0x30f9d: 0x6c89be20, 0x30f9e: 0x6c89c020, 0x30f9f: 0x6c89c220, - 0x30fa0: 0x6c89c420, 0x30fa1: 0x6c89c620, 0x30fa2: 0x6c89c820, 0x30fa3: 0x6c89ca20, - 0x30fa4: 0x6c89cc20, 0x30fa5: 0x6c89ce20, 0x30fa6: 0x6c89d020, 0x30fa7: 0x6c89d220, - 0x30fa8: 0x6c89d420, 0x30fa9: 0x6c89d620, 0x30faa: 0x6cb5e820, 0x30fab: 0x6cb5ea20, - 0x30fac: 0x6cb5ec20, 0x30fad: 0x6cb5ee20, 0x30fae: 0x6cb5f020, 0x30faf: 0x6cb5f220, - 0x30fb0: 0x6cb5f420, 0x30fb1: 0x6cb5f620, 0x30fb2: 0x6ce5fa20, 0x30fb3: 0x6cb5f820, - 0x30fb4: 0x6cb5fa20, 0x30fb5: 0x6cb5fc20, 0x30fb6: 0x6cb5fe20, 0x30fb7: 0x6cb60020, - 0x30fb8: 0x6cb60220, 0x30fb9: 0x6cb60420, 0x30fba: 0x6cb60620, 0x30fbb: 0x6ce60220, - 0x30fbc: 0x6cb60820, 0x30fbd: 0x6ce60420, 0x30fbe: 0x6ce60620, 0x30fbf: 0x6ce60820, - // Block 0xc3f, offset 0x30fc0 - 0x30fc0: 0x6ce60a20, 0x30fc1: 0x6ce60c20, 0x30fc2: 0x6ce60e20, 0x30fc3: 0x6ce61020, - 0x30fc4: 0x6ce61220, 0x30fc5: 0x6ce61420, 0x30fc6: 0x6ce61620, 0x30fc7: 0x6ce61820, - 0x30fc8: 0x6ce61a20, 0x30fc9: 0x6ce61c20, 0x30fca: 0x6ce61e20, 0x30fcb: 0x6ce62020, - 0x30fcc: 0x6ce62220, 0x30fcd: 0x6ce62420, 0x30fce: 0x6ce62620, 0x30fcf: 0x6d147e20, - 0x30fd0: 0x6ce62820, 0x30fd1: 0x6d148c20, 0x30fd2: 0x6d148e20, 0x30fd3: 0x6d149020, - 0x30fd4: 0x6d149220, 0x30fd5: 0x6d149420, 0x30fd6: 0x6d149620, 0x30fd7: 0x6d149820, - 0x30fd8: 0x6d149a20, 0x30fd9: 0x6d426a20, 0x30fda: 0x6d427420, 0x30fdb: 0x6d427620, - 0x30fdc: 0x6d427820, 0x30fdd: 0x6d427a20, 0x30fde: 0x6d427c20, 0x30fdf: 0x6d427e20, - 0x30fe0: 0x6d428020, 0x30fe1: 0x6d428220, 0x30fe2: 0x6d6f9020, 0x30fe3: 0x6d6f9220, - 0x30fe4: 0x6d6f9420, 0x30fe5: 0x6d6f9620, 0x30fe6: 0x6d989820, 0x30fe7: 0x6d989a20, - 0x30fe8: 0x6d989c20, 0x30fe9: 0x6d989e20, 0x30fea: 0x6d98a020, 0x30feb: 0x6d98a220, - 0x30fec: 0x6dbb9220, 0x30fed: 0x6dbb9420, 0x30fee: 0x6dbb9620, 0x30fef: 0x6dbb9820, - 0x30ff0: 0x6dbb9a20, 0x30ff1: 0x6dbb9c20, 0x30ff2: 0x6dbb9e20, 0x30ff3: 0x6dd96a20, - 0x30ff4: 0x6df1a420, 0x30ff5: 0x6e05dc20, 0x30ff6: 0x6c427220, 0x30ff7: 0x6d98c020, - 0x30ff8: 0x6dbbb220, 0x30ff9: 0x6c427420, 0x30ffa: 0x6c8a3220, 0x30ffb: 0x6c8a3420, - 0x30ffc: 0x6c8a3620, 0x30ffd: 0x6c8a3820, 0x30ffe: 0x6c8a3a20, 0x30fff: 0x6cb66420, - // Block 0xc40, offset 0x31000 - 0x31000: 0x6cb66620, 0x31001: 0x6ce69020, 0x31002: 0x6ce69220, 0x31003: 0x6ce69420, - 0x31004: 0x6ce69620, 0x31005: 0x6ce69820, 0x31006: 0x6ce69a20, 0x31007: 0x6ce69c20, - 0x31008: 0x6ce69e20, 0x31009: 0x6d14e820, 0x3100a: 0x6d14ea20, 0x3100b: 0x6d14ec20, - 0x3100c: 0x6d42ce20, 0x3100d: 0x6d14ee20, 0x3100e: 0x6d14f020, 0x3100f: 0x6d14f220, - 0x31010: 0x6d42d220, 0x31011: 0x6d42d420, 0x31012: 0x6d42d620, 0x31013: 0x6d6fd020, - 0x31014: 0x6d98cc20, 0x31015: 0x6d98ce20, 0x31016: 0x6dbbba20, 0x31017: 0x6dd98c20, - 0x31018: 0x6dd98e20, 0x31019: 0x6dd99020, 0x3101a: 0x6dd99220, 0x3101b: 0x6dd99420, - 0x3101c: 0x6dd99620, 0x3101d: 0x6dd99820, 0x3101e: 0x6dd99a20, 0x3101f: 0x6dd99c20, - 0x31020: 0x6dd99e20, 0x31021: 0x6df1b020, 0x31022: 0x6dd9bc20, 0x31023: 0x6df1b220, - 0x31024: 0x6e169620, 0x31025: 0x6e358020, 0x31026: 0x6e358220, 0x31027: 0x6e435c20, - 0x31028: 0x6c427820, 0x31029: 0x6cb67e20, 0x3102a: 0x6cb68020, 0x3102b: 0x6cb68220, - 0x3102c: 0x6ce6c220, 0x3102d: 0x6ce6c420, 0x3102e: 0x6ce6c620, 0x3102f: 0x6ce6c820, - 0x31030: 0x6ce6ca20, 0x31031: 0x6ce6cc20, 0x31032: 0x6ce6ce20, 0x31033: 0x6ce6d020, - 0x31034: 0x6d151a20, 0x31035: 0x6d151c20, 0x31036: 0x6d151e20, 0x31037: 0x6d152020, - 0x31038: 0x6d152220, 0x31039: 0x6d152420, 0x3103a: 0x6d152620, 0x3103b: 0x6d152820, - 0x3103c: 0x6d152a20, 0x3103d: 0x6d152c20, 0x3103e: 0x6d152e20, 0x3103f: 0x6d431c20, - // Block 0xc41, offset 0x31040 - 0x31040: 0x6d431e20, 0x31041: 0x6d432020, 0x31042: 0x6d700220, 0x31043: 0x6d700420, - 0x31044: 0x6d700620, 0x31045: 0x6d700820, 0x31046: 0x6d700a20, 0x31047: 0x6d700c20, - 0x31048: 0x6d700e20, 0x31049: 0x6d701020, 0x3104a: 0x6d701220, 0x3104b: 0x6d991620, - 0x3104c: 0x6d991820, 0x3104d: 0x6d991a20, 0x3104e: 0x6d991c20, 0x3104f: 0x6d991e20, - 0x31050: 0x6d992020, 0x31051: 0x6d992220, 0x31052: 0x6d992420, 0x31053: 0x6d992620, - 0x31054: 0x6d992820, 0x31055: 0x6d992a20, 0x31056: 0x6d992c20, 0x31057: 0x6d992e20, - 0x31058: 0x6dbbfa20, 0x31059: 0x6dbbfc20, 0x3105a: 0x6dbbfe20, 0x3105b: 0x6dbc0020, - 0x3105c: 0x6dbc0220, 0x3105d: 0x6dbc0420, 0x3105e: 0x6dbc0620, 0x3105f: 0x6dbc0820, - 0x31060: 0x6dbc0a20, 0x31061: 0x6dbc5220, 0x31062: 0x6dd9ca20, 0x31063: 0x6dd9cc20, - 0x31064: 0x6dd9ce20, 0x31065: 0x6dd9d020, 0x31066: 0x6df1de20, 0x31067: 0x6df1e020, - 0x31068: 0x6df1e220, 0x31069: 0x6df1e420, 0x3106a: 0x6df1e620, 0x3106b: 0x6df1e820, - 0x3106c: 0x6df1ea20, 0x3106d: 0x6df1ec20, 0x3106e: 0x6e061e20, 0x3106f: 0x6e062020, - 0x31070: 0x6e062220, 0x31071: 0x6e062420, 0x31072: 0x6e16b020, 0x31073: 0x6e062620, - 0x31074: 0x6e062820, 0x31075: 0x6e16b220, 0x31076: 0x6e16b420, 0x31077: 0x6e16b620, - 0x31078: 0x6e16b820, 0x31079: 0x6e16ba20, 0x3107a: 0x6e16bc20, 0x3107b: 0x6e16be20, - 0x3107c: 0x6e23d820, 0x3107d: 0x6e23da20, 0x3107e: 0x6e23dc20, 0x3107f: 0x6e23de20, - // Block 0xc42, offset 0x31080 - 0x31080: 0x6e23e020, 0x31081: 0x6e2dea20, 0x31082: 0x6e359020, 0x31083: 0x6e359220, - 0x31084: 0x6e359420, 0x31085: 0x6e359620, 0x31086: 0x6e359820, 0x31087: 0x6e359a20, - 0x31088: 0x6e359c20, 0x31089: 0x6e3b0420, 0x3108a: 0x6e3ec220, 0x3108b: 0x6e416820, - 0x3108c: 0x6e416a20, 0x3108d: 0x6e416c20, 0x3108e: 0x6e416e20, 0x3108f: 0x6e44a620, - 0x31090: 0x6e472220, 0x31091: 0x6c427a20, 0x31092: 0x6c427c20, 0x31093: 0x6ce6f620, - 0x31094: 0x6ce6f820, 0x31095: 0x6d155420, 0x31096: 0x6d155620, 0x31097: 0x6d435020, - 0x31098: 0x6d435220, 0x31099: 0x6d435420, 0x3109a: 0x6d704e20, 0x3109b: 0x6d997a20, - 0x3109c: 0x6d997c20, 0x3109d: 0x6dda1c20, 0x3109e: 0x6c427e20, 0x3109f: 0x6ce70020, - 0x310a0: 0x6d705220, 0x310a1: 0x6df23a20, 0x310a2: 0x6c632e20, 0x310a3: 0x6c428020, - 0x310a4: 0x6d436220, 0x310a5: 0x6d705c20, 0x310a6: 0x6d998a20, 0x310a7: 0x6e16f420, - 0x310a8: 0x6e2dfe20, 0x310a9: 0x6c633220, 0x310aa: 0x6cb6a820, 0x310ab: 0x6ce71e20, - 0x310ac: 0x6ce72020, 0x310ad: 0x6ce72220, 0x310ae: 0x6ce72420, 0x310af: 0x6ce72620, - 0x310b0: 0x6ce72820, 0x310b1: 0x6ce72a20, 0x310b2: 0x6d158820, 0x310b3: 0x6d158a20, - 0x310b4: 0x6d158c20, 0x310b5: 0x6d158e20, 0x310b6: 0x6d159020, 0x310b7: 0x6d159220, - 0x310b8: 0x6d159420, 0x310b9: 0x6d159620, 0x310ba: 0x6d438a20, 0x310bb: 0x6d438c20, - 0x310bc: 0x6d438e20, 0x310bd: 0x6d439020, 0x310be: 0x6d439220, 0x310bf: 0x6d439420, - // Block 0xc43, offset 0x310c0 - 0x310c0: 0x6d439620, 0x310c1: 0x6d439820, 0x310c2: 0x6d439a20, 0x310c3: 0x6d439c20, - 0x310c4: 0x6d439e20, 0x310c5: 0x6d43a020, 0x310c6: 0x6d43a220, 0x310c7: 0x6d707420, - 0x310c8: 0x6d707620, 0x310c9: 0x6d707820, 0x310ca: 0x6d707a20, 0x310cb: 0x6d707c20, - 0x310cc: 0x6d707e20, 0x310cd: 0x6d708020, 0x310ce: 0x6d708220, 0x310cf: 0x6d708420, - 0x310d0: 0x6d708620, 0x310d1: 0x6d708820, 0x310d2: 0x6d708a20, 0x310d3: 0x6d99b220, - 0x310d4: 0x6d99b420, 0x310d5: 0x6d99b620, 0x310d6: 0x6d99b820, 0x310d7: 0x6d99ba20, - 0x310d8: 0x6d99bc20, 0x310d9: 0x6d99be20, 0x310da: 0x6dbc7420, 0x310db: 0x6dbc7620, - 0x310dc: 0x6dbc7820, 0x310dd: 0x6dbc7a20, 0x310de: 0x6dbc7c20, 0x310df: 0x6dbc7e20, - 0x310e0: 0x6dbc8020, 0x310e1: 0x6dbc8220, 0x310e2: 0x6dda3e20, 0x310e3: 0x6dda4020, - 0x310e4: 0x6dda4220, 0x310e5: 0x6dda4420, 0x310e6: 0x6dda4620, 0x310e7: 0x6dda4820, - 0x310e8: 0x6dda4a20, 0x310e9: 0x6dda4c20, 0x310ea: 0x6dda4e20, 0x310eb: 0x6dda5020, - 0x310ec: 0x6dda5220, 0x310ed: 0x6dda5420, 0x310ee: 0x6dda5620, 0x310ef: 0x6dda5820, - 0x310f0: 0x6dda5a20, 0x310f1: 0x6df24e20, 0x310f2: 0x6df25020, 0x310f3: 0x6df25220, - 0x310f4: 0x6df25420, 0x310f5: 0x6df25620, 0x310f6: 0x6df25820, 0x310f7: 0x6df25a20, - 0x310f8: 0x6e069020, 0x310f9: 0x6e069220, 0x310fa: 0x6e069420, 0x310fb: 0x6e069620, - 0x310fc: 0x6e171620, 0x310fd: 0x6e171820, 0x310fe: 0x6e171a20, 0x310ff: 0x6e171c20, - // Block 0xc44, offset 0x31100 - 0x31100: 0x6e241820, 0x31101: 0x6e241a20, 0x31102: 0x6e241c20, 0x31103: 0x6e241e20, - 0x31104: 0x6e2e0e20, 0x31105: 0x6e2e1020, 0x31106: 0x6e35bc20, 0x31107: 0x6e35be20, - 0x31108: 0x6e35c020, 0x31109: 0x6e3ee020, 0x3110a: 0x6e456e20, 0x3110b: 0x6c633420, - 0x3110c: 0x6ce73420, 0x3110d: 0x6d43e020, 0x3110e: 0x6d43e220, 0x3110f: 0x6d70c220, - 0x31110: 0x6d70c420, 0x31111: 0x6d70c620, 0x31112: 0x6d99ee20, 0x31113: 0x6dbcc620, - 0x31114: 0x6dbcc820, 0x31115: 0x6dbcca20, 0x31116: 0x6ddaaa20, 0x31117: 0x6ddaac20, - 0x31118: 0x6ddaae20, 0x31119: 0x6ddab020, 0x3111a: 0x6ddab220, 0x3111b: 0x6e06d420, - 0x3111c: 0x6df2a820, 0x3111d: 0x6df2aa20, 0x3111e: 0x6df2ac20, 0x3111f: 0x6df2ae20, - 0x31120: 0x6e06d620, 0x31121: 0x6e174220, 0x31122: 0x6e174420, 0x31123: 0x6e244820, - 0x31124: 0x6e35ce20, 0x31125: 0x6e35d020, 0x31126: 0x6c053420, 0x31127: 0x6c287c20, - 0x31128: 0x6c633620, 0x31129: 0x6ce73820, 0x3112a: 0x6d15d420, 0x3112b: 0x6d15d620, - 0x3112c: 0x6d43fc20, 0x3112d: 0x6c633c20, 0x3112e: 0x6d15e020, 0x3112f: 0x6d70e220, - 0x31130: 0x6d9a0420, 0x31131: 0x6dbcea20, 0x31132: 0x6df2c620, 0x31133: 0x6c633e20, - 0x31134: 0x6d15e820, 0x31135: 0x6d15ea20, 0x31136: 0x6d440420, 0x31137: 0x6d440620, - 0x31138: 0x6d9a0c20, 0x31139: 0x6ddacc20, 0x3113a: 0x6ddace20, 0x3113b: 0x6df2d020, - 0x3113c: 0x6df2d220, 0x3113d: 0x6e06f220, 0x3113e: 0x6e06f420, 0x3113f: 0x6e06f620, - // Block 0xc45, offset 0x31140 - 0x31140: 0x6e2e3c20, 0x31141: 0x6c634020, 0x31142: 0x6cb6b220, 0x31143: 0x6cb6b420, - 0x31144: 0x6cb6b620, 0x31145: 0x6ce74820, 0x31146: 0x6ce74a20, 0x31147: 0x6ce74c20, - 0x31148: 0x6ce74e20, 0x31149: 0x6d15f220, 0x3114a: 0x6d15fa20, 0x3114b: 0x6d15fc20, - 0x3114c: 0x6d15fe20, 0x3114d: 0x6d160020, 0x3114e: 0x6d160220, 0x3114f: 0x6d160420, - 0x31150: 0x6d160620, 0x31151: 0x6d160820, 0x31152: 0x6d160a20, 0x31153: 0x6d160c20, - 0x31154: 0x6d442620, 0x31155: 0x6d442820, 0x31156: 0x6d442a20, 0x31157: 0x6d442c20, - 0x31158: 0x6d442e20, 0x31159: 0x6d441220, 0x3115a: 0x6d443020, 0x3115b: 0x6d710020, - 0x3115c: 0x6d710220, 0x3115d: 0x6d710420, 0x3115e: 0x6d710620, 0x3115f: 0x6d710820, - 0x31160: 0x6d710a20, 0x31161: 0x6d710c20, 0x31162: 0x6d710e20, 0x31163: 0x6d711020, - 0x31164: 0x6d9a2a20, 0x31165: 0x6d9a2c20, 0x31166: 0x6d711220, 0x31167: 0x6d711420, - 0x31168: 0x6d711620, 0x31169: 0x6d711820, 0x3116a: 0x6d711a20, 0x3116b: 0x6d711c20, - 0x3116c: 0x6d711e20, 0x3116d: 0x6d9a2e20, 0x3116e: 0x6d9a3020, 0x3116f: 0x6d9a3220, - 0x31170: 0x6d9a3420, 0x31171: 0x6d9a3620, 0x31172: 0x6d9a3820, 0x31173: 0x6d9a3a20, - 0x31174: 0x6d9a3c20, 0x31175: 0x6d9a3e20, 0x31176: 0x6d9a4020, 0x31177: 0x6d9a4220, - 0x31178: 0x6d9a4420, 0x31179: 0x6d9a4620, 0x3117a: 0x6d9a4820, 0x3117b: 0x6d9a4a20, - 0x3117c: 0x6d9a4c20, 0x3117d: 0x6d9a4e20, 0x3117e: 0x6ddaf020, 0x3117f: 0x6ddada20, - // Block 0xc46, offset 0x31180 - 0x31180: 0x6dbd0c20, 0x31181: 0x6dbd0e20, 0x31182: 0x6dbd1020, 0x31183: 0x6dbd1220, - 0x31184: 0x6dbd1420, 0x31185: 0x6dbd1620, 0x31186: 0x6dbd1820, 0x31187: 0x6dbd1a20, - 0x31188: 0x6dbd1c20, 0x31189: 0x6dbd1e20, 0x3118a: 0x6dbd2020, 0x3118b: 0x6ddaf220, - 0x3118c: 0x6ddaf420, 0x3118d: 0x6ddaf620, 0x3118e: 0x6ddaf820, 0x3118f: 0x6ddafa20, - 0x31190: 0x6ddafc20, 0x31191: 0x6ddafe20, 0x31192: 0x6ddb0020, 0x31193: 0x6ddb0220, - 0x31194: 0x6ddb0420, 0x31195: 0x6ddb0620, 0x31196: 0x6df2f020, 0x31197: 0x6df2f220, - 0x31198: 0x6df2f420, 0x31199: 0x6df2f620, 0x3119a: 0x6df2f820, 0x3119b: 0x6df2fa20, - 0x3119c: 0x6df2fc20, 0x3119d: 0x6df2fe20, 0x3119e: 0x6df30020, 0x3119f: 0x6e070e20, - 0x311a0: 0x6e071020, 0x311a1: 0x6e071220, 0x311a2: 0x6e071420, 0x311a3: 0x6e071620, - 0x311a4: 0x6e177220, 0x311a5: 0x6e177420, 0x311a6: 0x6e177620, 0x311a7: 0x6e177820, - 0x311a8: 0x6e177a20, 0x311a9: 0x6e246e20, 0x311aa: 0x6e247020, 0x311ab: 0x6e247220, - 0x311ac: 0x6e2e4020, 0x311ad: 0x6e2e4220, 0x311ae: 0x6e2e4420, 0x311af: 0x6e2e4620, - 0x311b0: 0x6e35de20, 0x311b1: 0x6e3b3820, 0x311b2: 0x6e3b3a20, 0x311b3: 0x6e418220, - 0x311b4: 0x6e418420, 0x311b5: 0x6c15d220, 0x311b6: 0x6c428620, 0x311b7: 0x6c428820, - 0x311b8: 0x6c634420, 0x311b9: 0x6c634620, 0x311ba: 0x6c634820, 0x311bb: 0x6c634a20, - 0x311bc: 0x6c8a5220, 0x311bd: 0x6c8a5420, 0x311be: 0x6c8a5620, 0x311bf: 0x6c8a5820, - // Block 0xc47, offset 0x311c0 - 0x311c0: 0x6c8a5a20, 0x311c1: 0x6c8a5c20, 0x311c2: 0x6c8a5e20, 0x311c3: 0x6c8a6020, - 0x311c4: 0x6c8a6220, 0x311c5: 0x6cb6c020, 0x311c6: 0x6cb6c220, 0x311c7: 0x6cb6c420, - 0x311c8: 0x6cb6c620, 0x311c9: 0x6ce76220, 0x311ca: 0x6ce76420, 0x311cb: 0x6ce76620, - 0x311cc: 0x6ce76820, 0x311cd: 0x6ce76a20, 0x311ce: 0x6ce76c20, 0x311cf: 0x6ce76e20, - 0x311d0: 0x6d163e20, 0x311d1: 0x6d164020, 0x311d2: 0x6d164220, 0x311d3: 0x6d164420, - 0x311d4: 0x6d164620, 0x311d5: 0x6d164820, 0x311d6: 0x6d164a20, 0x311d7: 0x6d447220, - 0x311d8: 0x6d715e20, 0x311d9: 0x6d716020, 0x311da: 0x6d716220, 0x311db: 0x6d716420, - 0x311dc: 0x6d716620, 0x311dd: 0x6d716820, 0x311de: 0x6d9ab220, 0x311df: 0x6d9ab420, - 0x311e0: 0x6d9ab620, 0x311e1: 0x6d9ab820, 0x311e2: 0x6ddb3e20, 0x311e3: 0x6ddb4020, - 0x311e4: 0x6df33820, 0x311e5: 0x6e074820, 0x311e6: 0x6e17aa20, 0x311e7: 0x6e2e6c20, - 0x311e8: 0x6c634e20, 0x311e9: 0x6ce77a20, 0x311ea: 0x6ce77c20, 0x311eb: 0x6d165820, - 0x311ec: 0x6d165a20, 0x311ed: 0x6d448a20, 0x311ee: 0x6d448c20, 0x311ef: 0x6d448e20, - 0x311f0: 0x6d449020, 0x311f1: 0x6d449220, 0x311f2: 0x6d717020, 0x311f3: 0x6d717220, - 0x311f4: 0x6d9ac620, 0x311f5: 0x6d9ac820, 0x311f6: 0x6dbd7820, 0x311f7: 0x6dbd7a20, - 0x311f8: 0x6ddb5020, 0x311f9: 0x6ddb5220, 0x311fa: 0x6ddb5420, 0x311fb: 0x6df34220, - 0x311fc: 0x6df34420, 0x311fd: 0x6df34620, 0x311fe: 0x6df34820, 0x311ff: 0x6df34a20, - // Block 0xc48, offset 0x31200 - 0x31200: 0x6df34c20, 0x31201: 0x6e074e20, 0x31202: 0x6e075020, 0x31203: 0x6e075220, - 0x31204: 0x6e075420, 0x31205: 0x6e17b020, 0x31206: 0x6e17b220, 0x31207: 0x6e17b420, - 0x31208: 0x6e17b620, 0x31209: 0x6e17b820, 0x3120a: 0x6e17ba20, 0x3120b: 0x6e249020, - 0x3120c: 0x6e418c20, 0x3120d: 0x6e418e20, 0x3120e: 0x6c053620, 0x3120f: 0x6c287e20, - 0x31210: 0x6c635020, 0x31211: 0x6c635220, 0x31212: 0x6c635420, 0x31213: 0x6ce78e20, - 0x31214: 0x6d168020, 0x31215: 0x6d44b820, 0x31216: 0x6d44b620, 0x31217: 0x6d44ba20, - 0x31218: 0x6d719420, 0x31219: 0x6d9af420, 0x3121a: 0x6d9af620, 0x3121b: 0x6c635c20, - 0x3121c: 0x6e17dc20, 0x3121d: 0x6e419420, 0x3121e: 0x6c020e20, 0x3121f: 0x6c636220, - 0x31220: 0x6c636420, 0x31221: 0x6cb6d820, 0x31222: 0x6c8a6820, 0x31223: 0x6c8a6a20, - 0x31224: 0x6c8a6c20, 0x31225: 0x6cb6da20, 0x31226: 0x6cb6dc20, 0x31227: 0x6ce79e20, - 0x31228: 0x6ce7a020, 0x31229: 0x6ce7a220, 0x3122a: 0x6ce7a420, 0x3122b: 0x6ce7a620, - 0x3122c: 0x6d169420, 0x3122d: 0x6ce7a820, 0x3122e: 0x6d169620, 0x3122f: 0x6ce7aa20, - 0x31230: 0x6ce7ac20, 0x31231: 0x6d169820, 0x31232: 0x6ce7ae20, 0x31233: 0x6d169a20, - 0x31234: 0x6d169c20, 0x31235: 0x6d169e20, 0x31236: 0x6d16a020, 0x31237: 0x6d16a220, - 0x31238: 0x6d44d620, 0x31239: 0x6d16a420, 0x3123a: 0x6d71a620, 0x3123b: 0x6d16a620, - 0x3123c: 0x6d16a820, 0x3123d: 0x6d16aa20, 0x3123e: 0x6d16ac20, 0x3123f: 0x6d16ae20, - // Block 0xc49, offset 0x31240 - 0x31240: 0x6d44d820, 0x31241: 0x6d44da20, 0x31242: 0x6d44dc20, 0x31243: 0x6d44de20, - 0x31244: 0x6d44e020, 0x31245: 0x6d44e220, 0x31246: 0x6d44e420, 0x31247: 0x6d44e620, - 0x31248: 0x6d71a820, 0x31249: 0x6d44e820, 0x3124a: 0x6d71aa20, 0x3124b: 0x6d71ac20, - 0x3124c: 0x6d44ea20, 0x3124d: 0x6d71ae20, 0x3124e: 0x6d44ec20, 0x3124f: 0x6d44ee20, - 0x31250: 0x6d9b0820, 0x31251: 0x6d71b020, 0x31252: 0x6d71b220, 0x31253: 0x6d71b420, - 0x31254: 0x6d71b620, 0x31255: 0x6d71b820, 0x31256: 0x6d71ba20, 0x31257: 0x6d71bc20, - 0x31258: 0x6d71be20, 0x31259: 0x6d71c020, 0x3125a: 0x6d9b0c20, 0x3125b: 0x6d9b0e20, - 0x3125c: 0x6d9b1020, 0x3125d: 0x6d9b0a20, 0x3125e: 0x6d9b1220, 0x3125f: 0x6d9b1420, - 0x31260: 0x6d9b1620, 0x31261: 0x6d9b1820, 0x31262: 0x6d9b1a20, 0x31263: 0x6d9b1c20, - 0x31264: 0x6d9b1e20, 0x31265: 0x6dbdca20, 0x31266: 0x6d9b2020, 0x31267: 0x6d9b2220, - 0x31268: 0x6d9b2420, 0x31269: 0x6d9b2620, 0x3126a: 0x6dbdcc20, 0x3126b: 0x6dbdce20, - 0x3126c: 0x6dbdd020, 0x3126d: 0x6dbdd220, 0x3126e: 0x6ddb9a20, 0x3126f: 0x6dbdd420, - 0x31270: 0x6dbdd620, 0x31271: 0x6dbdd820, 0x31272: 0x6dbdda20, 0x31273: 0x6dbddc20, - 0x31274: 0x6d9b8c20, 0x31275: 0x6dbdde20, 0x31276: 0x6ddb9c20, 0x31277: 0x6dbde020, - 0x31278: 0x6ddb9e20, 0x31279: 0x6ddba020, 0x3127a: 0x6ddba220, 0x3127b: 0x6ddba420, - 0x3127c: 0x6ddba620, 0x3127d: 0x6ddba820, 0x3127e: 0x6ddbaa20, 0x3127f: 0x6ddbac20, - // Block 0xc4a, offset 0x31280 - 0x31280: 0x6ddbae20, 0x31281: 0x6ddbb020, 0x31282: 0x6dbe4420, 0x31283: 0x6df38820, - 0x31284: 0x6df38a20, 0x31285: 0x6df38c20, 0x31286: 0x6dbe4620, 0x31287: 0x6df38e20, - 0x31288: 0x6df39020, 0x31289: 0x6df39220, 0x3128a: 0x6e077420, 0x3128b: 0x6e077620, - 0x3128c: 0x6e077820, 0x3128d: 0x6e077a20, 0x3128e: 0x6e077c20, 0x3128f: 0x6e17ec20, - 0x31290: 0x6e077e20, 0x31291: 0x6e078020, 0x31292: 0x6e078220, 0x31293: 0x6e078420, - 0x31294: 0x6e24ae20, 0x31295: 0x6e24b020, 0x31296: 0x6e17ee20, 0x31297: 0x6e17f020, - 0x31298: 0x6e17f220, 0x31299: 0x6e07c220, 0x3129a: 0x6e24b220, 0x3129b: 0x6e24b420, - 0x3129c: 0x6e2e8220, 0x3129d: 0x6e360220, 0x3129e: 0x6e3b4c20, 0x3129f: 0x6e3b4e20, - 0x312a0: 0x6e419820, 0x312a1: 0x6e419a20, 0x312a2: 0x6e457220, 0x312a3: 0x6c021020, - 0x312a4: 0x6c0ac220, 0x312a5: 0x6c0ac420, 0x312a6: 0x6c15d420, 0x312a7: 0x6c15d620, - 0x312a8: 0x6c288020, 0x312a9: 0x6c288220, 0x312aa: 0x6c288420, 0x312ab: 0x6c288620, - 0x312ac: 0x6c288820, 0x312ad: 0x6c288a20, 0x312ae: 0x6c288c20, 0x312af: 0x6c429820, - 0x312b0: 0x6c429a20, 0x312b1: 0x6c429c20, 0x312b2: 0x6c429e20, 0x312b3: 0x6c42a020, - 0x312b4: 0x6c42a220, 0x312b5: 0x6c636820, 0x312b6: 0x6c636a20, 0x312b7: 0x6c636c20, - 0x312b8: 0x6c636e20, 0x312b9: 0x6c637020, 0x312ba: 0x6c637220, 0x312bb: 0x6c637420, - 0x312bc: 0x6c637620, 0x312bd: 0x6c8a7420, 0x312be: 0x6c8a7620, 0x312bf: 0x6c8a7820, - // Block 0xc4b, offset 0x312c0 - 0x312c0: 0x6c8a7a20, 0x312c1: 0x6c8a7c20, 0x312c2: 0x6c8a7e20, 0x312c3: 0x6cb6fa20, - 0x312c4: 0x6cb6fc20, 0x312c5: 0x6cb6fe20, 0x312c6: 0x6cb70020, 0x312c7: 0x6ce7d820, - 0x312c8: 0x6ce7da20, 0x312c9: 0x6d16f420, 0x312ca: 0x6ce7dc20, 0x312cb: 0x6ce7de20, - 0x312cc: 0x6d16f620, 0x312cd: 0x6d16f820, 0x312ce: 0x6d16fa20, 0x312cf: 0x6d16fc20, - 0x312d0: 0x6d16fe20, 0x312d1: 0x6d452020, 0x312d2: 0x6d452220, 0x312d3: 0x6d71fe20, - 0x312d4: 0x6d720020, 0x312d5: 0x6e3b5220, 0x312d6: 0x6c637e20, 0x312d7: 0x6cb70c20, - 0x312d8: 0x6dbe4820, 0x312d9: 0x6c638220, 0x312da: 0x6d170820, 0x312db: 0x6d453620, - 0x312dc: 0x6d453820, 0x312dd: 0x6d453a20, 0x312de: 0x6d9ba020, 0x312df: 0x6d9ba220, - 0x312e0: 0x6d9ba420, 0x312e1: 0x6dbe5620, 0x312e2: 0x6dbe5820, 0x312e3: 0x6dbe5a20, - 0x312e4: 0x6ddc0420, 0x312e5: 0x6ddc0620, 0x312e6: 0x6df3ec20, 0x312e7: 0x6df3ee20, - 0x312e8: 0x6e07ca20, 0x312e9: 0x6e182420, 0x312ea: 0x6e2e9a20, 0x312eb: 0x6e41a020, - 0x312ec: 0x6c8a8e20, 0x312ed: 0x6ce7f220, 0x312ee: 0x6ce7f420, 0x312ef: 0x6d171420, - 0x312f0: 0x6d171620, 0x312f1: 0x6d171820, 0x312f2: 0x6d171a20, 0x312f3: 0x6d171c20, - 0x312f4: 0x6d171e20, 0x312f5: 0x6d172020, 0x312f6: 0x6d455820, 0x312f7: 0x6d455a20, - 0x312f8: 0x6d455c20, 0x312f9: 0x6d455e20, 0x312fa: 0x6d456020, 0x312fb: 0x6d456220, - 0x312fc: 0x6d456420, 0x312fd: 0x6d456620, 0x312fe: 0x6d456820, 0x312ff: 0x6d456a20, - // Block 0xc4c, offset 0x31300 - 0x31300: 0x6d456c20, 0x31301: 0x6d456e20, 0x31302: 0x6d457020, 0x31303: 0x6d457220, - 0x31304: 0x6d457420, 0x31305: 0x6d457620, 0x31306: 0x6d457820, 0x31307: 0x6d457a20, - 0x31308: 0x6d723220, 0x31309: 0x6d723420, 0x3130a: 0x6d723620, 0x3130b: 0x6d723820, - 0x3130c: 0x6d723a20, 0x3130d: 0x6d723c20, 0x3130e: 0x6d723e20, 0x3130f: 0x6d724020, - 0x31310: 0x6d724220, 0x31311: 0x6d724420, 0x31312: 0x6d724620, 0x31313: 0x6d724820, - 0x31314: 0x6d724a20, 0x31315: 0x6d724c20, 0x31316: 0x6d724e20, 0x31317: 0x6d725020, - 0x31318: 0x6d725220, 0x31319: 0x6d725420, 0x3131a: 0x6d725620, 0x3131b: 0x6d725820, - 0x3131c: 0x6d725a20, 0x3131d: 0x6d725c20, 0x3131e: 0x6d725e20, 0x3131f: 0x6d726020, - 0x31320: 0x6d726220, 0x31321: 0x6d9bba20, 0x31322: 0x6d9bbc20, 0x31323: 0x6d9bbe20, - 0x31324: 0x6d9bc020, 0x31325: 0x6d9bc220, 0x31326: 0x6d9bc420, 0x31327: 0x6d9bc620, - 0x31328: 0x6d9bc820, 0x31329: 0x6d9bca20, 0x3132a: 0x6d9bcc20, 0x3132b: 0x6d9bce20, - 0x3132c: 0x6d9bd020, 0x3132d: 0x6d9bd220, 0x3132e: 0x6d9bd420, 0x3132f: 0x6d9bd620, - 0x31330: 0x6d9bd820, 0x31331: 0x6d9bda20, 0x31332: 0x6d9bdc20, 0x31333: 0x6dbec020, - 0x31334: 0x6dbe7020, 0x31335: 0x6dbe7220, 0x31336: 0x6dbe7420, 0x31337: 0x6dbe7620, - 0x31338: 0x6dbe7820, 0x31339: 0x6dbe7a20, 0x3133a: 0x6dbe7c20, 0x3133b: 0x6dbe7e20, - 0x3133c: 0x6dbe8020, 0x3133d: 0x6dbe8220, 0x3133e: 0x6dbe8420, 0x3133f: 0x6dbe8620, - // Block 0xc4d, offset 0x31340 - 0x31340: 0x6dbe8820, 0x31341: 0x6dbe8a20, 0x31342: 0x6dbe8c20, 0x31343: 0x6dbe8e20, - 0x31344: 0x6ddc2820, 0x31345: 0x6ddc2a20, 0x31346: 0x6ddc2c20, 0x31347: 0x6ddc2e20, - 0x31348: 0x6ddc3020, 0x31349: 0x6ddc3220, 0x3134a: 0x6ddc3420, 0x3134b: 0x6ddc3620, - 0x3134c: 0x6ddc3820, 0x3134d: 0x6ddc3a20, 0x3134e: 0x6ddc3c20, 0x3134f: 0x6ddc3e20, - 0x31350: 0x6ddc4020, 0x31351: 0x6ddc4220, 0x31352: 0x6ddc4420, 0x31353: 0x6ddc4620, - 0x31354: 0x6df40a20, 0x31355: 0x6df40c20, 0x31356: 0x6df40e20, 0x31357: 0x6df41020, - 0x31358: 0x6df41220, 0x31359: 0x6df41420, 0x3135a: 0x6df41620, 0x3135b: 0x6df41820, - 0x3135c: 0x6df41a20, 0x3135d: 0x6df41c20, 0x3135e: 0x6df41e20, 0x3135f: 0x6df42020, - 0x31360: 0x6df42220, 0x31361: 0x6df42420, 0x31362: 0x6df42620, 0x31363: 0x6df42820, - 0x31364: 0x6df42a20, 0x31365: 0x6df42c20, 0x31366: 0x6df42e20, 0x31367: 0x6df43020, - 0x31368: 0x6df43220, 0x31369: 0x6e07e620, 0x3136a: 0x6e07e820, 0x3136b: 0x6e07ea20, - 0x3136c: 0x6e07ec20, 0x3136d: 0x6e07ee20, 0x3136e: 0x6e07f020, 0x3136f: 0x6e07f220, - 0x31370: 0x6e07f420, 0x31371: 0x6e07f620, 0x31372: 0x6e07f820, 0x31373: 0x6e07fa20, - 0x31374: 0x6e07fc20, 0x31375: 0x6e07fe20, 0x31376: 0x6e080020, 0x31377: 0x6e080220, - 0x31378: 0x6e080420, 0x31379: 0x6e184220, 0x3137a: 0x6e184420, 0x3137b: 0x6e184620, - 0x3137c: 0x6e184820, 0x3137d: 0x6e184a20, 0x3137e: 0x6e184c20, 0x3137f: 0x6e184e20, - // Block 0xc4e, offset 0x31380 - 0x31380: 0x6e185020, 0x31381: 0x6e185220, 0x31382: 0x6e185420, 0x31383: 0x6e185620, - 0x31384: 0x6e185820, 0x31385: 0x6e185a20, 0x31386: 0x6e185c20, 0x31387: 0x6e185e20, - 0x31388: 0x6e24ee20, 0x31389: 0x6e24f020, 0x3138a: 0x6e24f220, 0x3138b: 0x6e24f420, - 0x3138c: 0x6e24f620, 0x3138d: 0x6e24f820, 0x3138e: 0x6e24fa20, 0x3138f: 0x6e24fc20, - 0x31390: 0x6e24fe20, 0x31391: 0x6e250020, 0x31392: 0x6e250220, 0x31393: 0x6e250420, - 0x31394: 0x6e250620, 0x31395: 0x6e250820, 0x31396: 0x6e2ea420, 0x31397: 0x6e2ea620, - 0x31398: 0x6e2ea820, 0x31399: 0x6e2eaa20, 0x3139a: 0x6e2eac20, 0x3139b: 0x6e2eae20, - 0x3139c: 0x6e2eb020, 0x3139d: 0x6e362220, 0x3139e: 0x6e362420, 0x3139f: 0x6e362620, - 0x313a0: 0x6e3f1420, 0x313a1: 0x6e3f1620, 0x313a2: 0x6e3f1820, 0x313a3: 0x6e3f1a20, - 0x313a4: 0x6e41a420, 0x313a5: 0x6e3f2620, 0x313a6: 0x6e41a620, 0x313a7: 0x6e41a820, - 0x313a8: 0x6e437a20, 0x313a9: 0x6e437c20, 0x313aa: 0x6e44c220, 0x313ab: 0x6e457620, - 0x313ac: 0x6c021220, 0x313ad: 0x6c0ac620, 0x313ae: 0x6c15da20, 0x313af: 0x6c15dc20, - 0x313b0: 0x6c15de20, 0x313b1: 0x6c289820, 0x313b2: 0x6c289a20, 0x313b3: 0x6c289c20, - 0x313b4: 0x6c289e20, 0x313b5: 0x6c42ae20, 0x313b6: 0x6c42b020, 0x313b7: 0x6c42b220, - 0x313b8: 0x6c42b420, 0x313b9: 0x6c42b620, 0x313ba: 0x6c42b820, 0x313bb: 0x6c42ba20, - 0x313bc: 0x6c42bc20, 0x313bd: 0x6c42be20, 0x313be: 0x6c42c020, 0x313bf: 0x6c42c220, - // Block 0xc4f, offset 0x313c0 - 0x313c0: 0x6c42c420, 0x313c1: 0x6c638420, 0x313c2: 0x6c638620, 0x313c3: 0x6c638820, - 0x313c4: 0x6c638a20, 0x313c5: 0x6c638c20, 0x313c6: 0x6c638e20, 0x313c7: 0x6c639020, - 0x313c8: 0x6c639220, 0x313c9: 0x6c639420, 0x313ca: 0x6c8a9420, 0x313cb: 0x6c8a9620, - 0x313cc: 0x6c8a9820, 0x313cd: 0x6c8a9a20, 0x313ce: 0x6c8a9c20, 0x313cf: 0x6c8a9e20, - 0x313d0: 0x6cb71420, 0x313d1: 0x6cb71620, 0x313d2: 0x6cb71820, 0x313d3: 0x6cb71a20, - 0x313d4: 0x6cb71c20, 0x313d5: 0x6cb71e20, 0x313d6: 0x6cb72020, 0x313d7: 0x6ce80420, - 0x313d8: 0x6ce80620, 0x313d9: 0x6ce80820, 0x313da: 0x6ce80a20, 0x313db: 0x6ce80c20, - 0x313dc: 0x6d173220, 0x313dd: 0x6d173420, 0x313de: 0x6d173620, 0x313df: 0x6d173820, - 0x313e0: 0x6d45ac20, 0x313e1: 0x6d45ae20, 0x313e2: 0x6d45b020, 0x313e3: 0x6d72aa20, - 0x313e4: 0x6dbec420, 0x313e5: 0x6df48220, 0x313e6: 0x6e086e20, 0x313e7: 0x6e087020, - 0x313e8: 0x6c8aae20, 0x313e9: 0x6ce82c20, 0x313ea: 0x6d174820, 0x313eb: 0x6d174a20, - 0x313ec: 0x6d174c20, 0x313ed: 0x6d174e20, 0x313ee: 0x6d175020, 0x313ef: 0x6d45bc20, - 0x313f0: 0x6d45be20, 0x313f1: 0x6d45c020, 0x313f2: 0x6d72bc20, 0x313f3: 0x6d72be20, - 0x313f4: 0x6d72c020, 0x313f5: 0x6d72c220, 0x313f6: 0x6d72c420, 0x313f7: 0x6d72c620, - 0x313f8: 0x6d9c4220, 0x313f9: 0x6d9c4420, 0x313fa: 0x6d9c4620, 0x313fb: 0x6d9c4820, - 0x313fc: 0x6d9c4a20, 0x313fd: 0x6dbed220, 0x313fe: 0x6dbed420, 0x313ff: 0x6d9c6820, - // Block 0xc50, offset 0x31400 - 0x31400: 0x6ddcac20, 0x31401: 0x6ddcae20, 0x31402: 0x6df48c20, 0x31403: 0x6df48e20, - 0x31404: 0x6e087220, 0x31405: 0x6df49020, 0x31406: 0x6e087620, 0x31407: 0x6e087820, - 0x31408: 0x6e087a20, 0x31409: 0x6e087c20, 0x3140a: 0x6e087e20, 0x3140b: 0x6e088020, - 0x3140c: 0x6e088220, 0x3140d: 0x6e189420, 0x3140e: 0x6e189620, 0x3140f: 0x6e189820, - 0x31410: 0x6e254620, 0x31411: 0x6e2ee620, 0x31412: 0x6e254820, 0x31413: 0x6e2ee820, - 0x31414: 0x6e2eea20, 0x31415: 0x6e364420, 0x31416: 0x6e3b7420, 0x31417: 0x6e3f2820, - 0x31418: 0x6c8ab020, 0x31419: 0x6cb73620, 0x3141a: 0x6d45e620, 0x3141b: 0x6d72e220, - 0x3141c: 0x6ddcda20, 0x3141d: 0x6e256420, 0x3141e: 0x6e2ef820, 0x3141f: 0x6c8ab220, - 0x31420: 0x6ce84620, 0x31421: 0x6d177820, 0x31422: 0x6d177a20, 0x31423: 0x6d460620, - 0x31424: 0x6d460820, 0x31425: 0x6d460a20, 0x31426: 0x6d460c20, 0x31427: 0x6d460e20, - 0x31428: 0x6d461020, 0x31429: 0x6d461220, 0x3142a: 0x6d461420, 0x3142b: 0x6d72f220, - 0x3142c: 0x6d72f420, 0x3142d: 0x6d9c7a20, 0x3142e: 0x6d72f620, 0x3142f: 0x6d72f820, - 0x31430: 0x6d72fa20, 0x31431: 0x6d72fc20, 0x31432: 0x6d72fe20, 0x31433: 0x6d730020, - 0x31434: 0x6d730220, 0x31435: 0x6d9c8020, 0x31436: 0x6d9c8220, 0x31437: 0x6d9c8420, - 0x31438: 0x6d9c8620, 0x31439: 0x6d9c8820, 0x3143a: 0x6d9c8a20, 0x3143b: 0x6d9c8c20, - 0x3143c: 0x6dbf1420, 0x3143d: 0x6dbf1620, 0x3143e: 0x6dbf1820, 0x3143f: 0x6dbf1a20, - // Block 0xc51, offset 0x31440 - 0x31440: 0x6dbf1c20, 0x31441: 0x6dbf1e20, 0x31442: 0x6dbf2020, 0x31443: 0x6ddcf220, - 0x31444: 0x6ddcf420, 0x31445: 0x6ddcf620, 0x31446: 0x6ddcf820, 0x31447: 0x6d9c8e20, - 0x31448: 0x6ddcfa20, 0x31449: 0x6df4b220, 0x3144a: 0x6df4b420, 0x3144b: 0x6df4b620, - 0x3144c: 0x6df4b820, 0x3144d: 0x6df4ba20, 0x3144e: 0x6df4bc20, 0x3144f: 0x6df4be20, - 0x31450: 0x6e08b220, 0x31451: 0x6e08b420, 0x31452: 0x6e08b620, 0x31453: 0x6e08b820, - 0x31454: 0x6e18b420, 0x31455: 0x6e18b620, 0x31456: 0x6e18b820, 0x31457: 0x6e18ba20, - 0x31458: 0x6e18bc20, 0x31459: 0x6e256c20, 0x3145a: 0x6e256e20, 0x3145b: 0x6e257020, - 0x3145c: 0x6e257220, 0x3145d: 0x6e256820, 0x3145e: 0x6e2f0020, 0x3145f: 0x6e2f0220, - 0x31460: 0x6e2f0420, 0x31461: 0x6e365c20, 0x31462: 0x6e365e20, 0x31463: 0x6e3b8620, - 0x31464: 0x6e41be20, 0x31465: 0x6c8ab420, 0x31466: 0x6d463c20, 0x31467: 0x6d734420, - 0x31468: 0x6d9cc020, 0x31469: 0x6ddd3820, 0x3146a: 0x6e08ee20, 0x3146b: 0x6e25a420, - 0x3146c: 0x6e367420, 0x3146d: 0x6e367620, 0x3146e: 0x6e41c820, 0x3146f: 0x6c8aba20, - 0x31470: 0x6e41ca20, 0x31471: 0x6e44ca20, 0x31472: 0x6c8abc20, 0x31473: 0x6d9cc820, - 0x31474: 0x6dbf5620, 0x31475: 0x6ddd4020, 0x31476: 0x6ddd4220, 0x31477: 0x6df4fa20, - 0x31478: 0x6e08f420, 0x31479: 0x6e18f420, 0x3147a: 0x6e18f620, 0x3147b: 0x6e25ae20, - 0x3147c: 0x6c8abe20, 0x3147d: 0x6d179220, 0x3147e: 0x6d465020, 0x3147f: 0x6d465220, - // Block 0xc52, offset 0x31480 - 0x31480: 0x6d465420, 0x31481: 0x6d465620, 0x31482: 0x6d465820, 0x31483: 0x6d735820, - 0x31484: 0x6d735a20, 0x31485: 0x6d735c20, 0x31486: 0x6d735e20, 0x31487: 0x6d9cde20, - 0x31488: 0x6dbf6220, 0x31489: 0x6dbf6420, 0x3148a: 0x6ddd5620, 0x3148b: 0x6ddd5820, - 0x3148c: 0x6ddd5a20, 0x3148d: 0x6ddd5c20, 0x3148e: 0x6ddd5e20, 0x3148f: 0x6ddd6020, - 0x31490: 0x6e090220, 0x31491: 0x6e190620, 0x31492: 0x6e190820, 0x31493: 0x6e190a20, - 0x31494: 0x6e190c20, 0x31495: 0x6e25be20, 0x31496: 0x6e25c020, 0x31497: 0x6e368a20, - 0x31498: 0x6e368c20, 0x31499: 0x6e368e20, 0x3149a: 0x6cb74420, 0x3149b: 0x6d17c620, - 0x3149c: 0x6d17c820, 0x3149d: 0x6d17ca20, 0x3149e: 0x6d17cc20, 0x3149f: 0x6d469220, - 0x314a0: 0x6d469420, 0x314a1: 0x6d469620, 0x314a2: 0x6d469820, 0x314a3: 0x6d739620, - 0x314a4: 0x6d739820, 0x314a5: 0x6d739a20, 0x314a6: 0x6d739c20, 0x314a7: 0x6d739e20, - 0x314a8: 0x6d73a020, 0x314a9: 0x6d73a220, 0x314aa: 0x6d73a420, 0x314ab: 0x6d73a620, - 0x314ac: 0x6d73a820, 0x314ad: 0x6d73aa20, 0x314ae: 0x6d73ac20, 0x314af: 0x6d73ae20, - 0x314b0: 0x6d73b020, 0x314b1: 0x6d73b220, 0x314b2: 0x6d73b420, 0x314b3: 0x6d73b620, - 0x314b4: 0x6d73b820, 0x314b5: 0x6d73ba20, 0x314b6: 0x6d73bc20, 0x314b7: 0x6d73be20, - 0x314b8: 0x6d73c020, 0x314b9: 0x6d73c220, 0x314ba: 0x6d9d2420, 0x314bb: 0x6d9d2620, - 0x314bc: 0x6d9d2820, 0x314bd: 0x6d9d2a20, 0x314be: 0x6d9d2c20, 0x314bf: 0x6d9d2e20, - // Block 0xc53, offset 0x314c0 - 0x314c0: 0x6d9d3020, 0x314c1: 0x6d9d3220, 0x314c2: 0x6d9d3420, 0x314c3: 0x6d9d3620, - 0x314c4: 0x6d9d3820, 0x314c5: 0x6d9d3a20, 0x314c6: 0x6dbf9020, 0x314c7: 0x6d9d3c20, - 0x314c8: 0x6d9d3e20, 0x314c9: 0x6d9d4020, 0x314ca: 0x6d9d4220, 0x314cb: 0x6d9d4420, - 0x314cc: 0x6d9d4620, 0x314cd: 0x6d9d4820, 0x314ce: 0x6d9d4a20, 0x314cf: 0x6d9d4c20, - 0x314d0: 0x6d9d4e20, 0x314d1: 0x6d9d5020, 0x314d2: 0x6d9d5220, 0x314d3: 0x6d9d5420, - 0x314d4: 0x6d9d5620, 0x314d5: 0x6d9d5820, 0x314d6: 0x6d9d5a20, 0x314d7: 0x6d9d5c20, - 0x314d8: 0x6d9d5e20, 0x314d9: 0x6dbf9c20, 0x314da: 0x6dbf9e20, 0x314db: 0x6dbfa020, - 0x314dc: 0x6dbfa220, 0x314dd: 0x6dbfa420, 0x314de: 0x6dbfa620, 0x314df: 0x6dbfa820, - 0x314e0: 0x6dbfaa20, 0x314e1: 0x6dbfac20, 0x314e2: 0x6dbfae20, 0x314e3: 0x6d9d6020, - 0x314e4: 0x6dbfb020, 0x314e5: 0x6dbfb220, 0x314e6: 0x6dbfb420, 0x314e7: 0x6dbfb620, - 0x314e8: 0x6dbfb820, 0x314e9: 0x6dbfba20, 0x314ea: 0x6dbfbc20, 0x314eb: 0x6dbfbe20, - 0x314ec: 0x6dbfc020, 0x314ed: 0x6dbfc220, 0x314ee: 0x6dbfc420, 0x314ef: 0x6dbfc620, - 0x314f0: 0x6dbfc820, 0x314f1: 0x6dbfca20, 0x314f2: 0x6dbfcc20, 0x314f3: 0x6dbfce20, - 0x314f4: 0x6dbfd020, 0x314f5: 0x6ddd9820, 0x314f6: 0x6ddd9a20, 0x314f7: 0x6ddd9c20, - 0x314f8: 0x6ddd9e20, 0x314f9: 0x6ddda020, 0x314fa: 0x6dbfd220, 0x314fb: 0x6ddda220, - 0x314fc: 0x6ddda420, 0x314fd: 0x6ddda620, 0x314fe: 0x6ddda820, 0x314ff: 0x6dddaa20, - // Block 0xc54, offset 0x31500 - 0x31500: 0x6dddac20, 0x31501: 0x6dddae20, 0x31502: 0x6dddb020, 0x31503: 0x6dddb220, - 0x31504: 0x6dddb420, 0x31505: 0x6df51c20, 0x31506: 0x6dddb620, 0x31507: 0x6dddb820, - 0x31508: 0x6dddba20, 0x31509: 0x6dddbc20, 0x3150a: 0x6dddbe20, 0x3150b: 0x6dddc020, - 0x3150c: 0x6dddc220, 0x3150d: 0x6dddc420, 0x3150e: 0x6dc03a20, 0x3150f: 0x6dddc620, - 0x31510: 0x6dddc820, 0x31511: 0x6dddca20, 0x31512: 0x6dddcc20, 0x31513: 0x6dddce20, - 0x31514: 0x6df54220, 0x31515: 0x6df54420, 0x31516: 0x6df54620, 0x31517: 0x6df54820, - 0x31518: 0x6df54a20, 0x31519: 0x6df54c20, 0x3151a: 0x6df54e20, 0x3151b: 0x6df55020, - 0x3151c: 0x6df55220, 0x3151d: 0x6df55420, 0x3151e: 0x6df55620, 0x3151f: 0x6df55820, - 0x31520: 0x6df55a20, 0x31521: 0x6df55c20, 0x31522: 0x6df55e20, 0x31523: 0x6df56020, - 0x31524: 0x6df56220, 0x31525: 0x6df56420, 0x31526: 0x6df56620, 0x31527: 0x6df56820, - 0x31528: 0x6df56a20, 0x31529: 0x6df56c20, 0x3152a: 0x6df56e20, 0x3152b: 0x6df57020, - 0x3152c: 0x6df57220, 0x3152d: 0x6df57420, 0x3152e: 0x6df57620, 0x3152f: 0x6df57820, - 0x31530: 0x6df57a20, 0x31531: 0x6df57c20, 0x31532: 0x6df57e20, 0x31533: 0x6df58020, - 0x31534: 0x6df58220, 0x31535: 0x6df58420, 0x31536: 0x6e093220, 0x31537: 0x6e093420, - 0x31538: 0x6e093620, 0x31539: 0x6e093820, 0x3153a: 0x6df61c20, 0x3153b: 0x6e091c20, - 0x3153c: 0x6e093a20, 0x3153d: 0x6dddd020, 0x3153e: 0x6e093c20, 0x3153f: 0x6e093e20, - // Block 0xc55, offset 0x31540 - 0x31540: 0x6e094020, 0x31541: 0x6e094220, 0x31542: 0x6e094420, 0x31543: 0x6e094620, - 0x31544: 0x6e094820, 0x31545: 0x6e094a20, 0x31546: 0x6e094c20, 0x31547: 0x6e094e20, - 0x31548: 0x6e095020, 0x31549: 0x6e095220, 0x3154a: 0x6e095420, 0x3154b: 0x6e095620, - 0x3154c: 0x6e095820, 0x3154d: 0x6e095a20, 0x3154e: 0x6e095c20, 0x3154f: 0x6e095e20, - 0x31550: 0x6e096020, 0x31551: 0x6e096220, 0x31552: 0x6e096420, 0x31553: 0x6e096620, - 0x31554: 0x6e096820, 0x31555: 0x6e096a20, 0x31556: 0x6e096c20, 0x31557: 0x6e096e20, - 0x31558: 0x6e097020, 0x31559: 0x6e097220, 0x3155a: 0x6e097420, 0x3155b: 0x6e097620, - 0x3155c: 0x6e194620, 0x3155d: 0x6e194820, 0x3155e: 0x6e194a20, 0x3155f: 0x6e194c20, - 0x31560: 0x6e097820, 0x31561: 0x6e194e20, 0x31562: 0x6e195020, 0x31563: 0x6e195220, - 0x31564: 0x6e195420, 0x31565: 0x6e195620, 0x31566: 0x6e195820, 0x31567: 0x6e195a20, - 0x31568: 0x6e195c20, 0x31569: 0x6e195e20, 0x3156a: 0x6e196020, 0x3156b: 0x6e196220, - 0x3156c: 0x6e196420, 0x3156d: 0x6e196620, 0x3156e: 0x6e196820, 0x3156f: 0x6e196a20, - 0x31570: 0x6e196c20, 0x31571: 0x6e25de20, 0x31572: 0x6e25e020, 0x31573: 0x6e25e220, - 0x31574: 0x6e25e420, 0x31575: 0x6e25e620, 0x31576: 0x6e25e820, 0x31577: 0x6e25ea20, - 0x31578: 0x6e25ec20, 0x31579: 0x6e25ee20, 0x3157a: 0x6e25f020, 0x3157b: 0x6e25f220, - 0x3157c: 0x6e25f420, 0x3157d: 0x6e25f620, 0x3157e: 0x6e25f820, 0x3157f: 0x6e25fa20, - // Block 0xc56, offset 0x31580 - 0x31580: 0x6e09e620, 0x31581: 0x6e25fc20, 0x31582: 0x6e25fe20, 0x31583: 0x6e260020, - 0x31584: 0x6e260220, 0x31585: 0x6e260420, 0x31586: 0x6e260620, 0x31587: 0x6e260820, - 0x31588: 0x6e260a20, 0x31589: 0x6e267220, 0x3158a: 0x6e2f5620, 0x3158b: 0x6e2f5820, - 0x3158c: 0x6e2f5a20, 0x3158d: 0x6e2f5c20, 0x3158e: 0x6e2f5e20, 0x3158f: 0x6e2f6020, - 0x31590: 0x6e2f6220, 0x31591: 0x6e2f6420, 0x31592: 0x6e2f6620, 0x31593: 0x6e2f6820, - 0x31594: 0x6e2f6a20, 0x31595: 0x6e2f6c20, 0x31596: 0x6e2f6e20, 0x31597: 0x6e2f7020, - 0x31598: 0x6e2f7220, 0x31599: 0x6e2f7420, 0x3159a: 0x6e2f7620, 0x3159b: 0x6e2f7820, - 0x3159c: 0x6e36a620, 0x3159d: 0x6e36a820, 0x3159e: 0x6e36aa20, 0x3159f: 0x6e36ac20, - 0x315a0: 0x6e36ae20, 0x315a1: 0x6e36b020, 0x315a2: 0x6e36b220, 0x315a3: 0x6e36b420, - 0x315a4: 0x6e36b620, 0x315a5: 0x6e36b820, 0x315a6: 0x6e36ba20, 0x315a7: 0x6e36bc20, - 0x315a8: 0x6e3bac20, 0x315a9: 0x6e36be20, 0x315aa: 0x6e2fda20, 0x315ab: 0x6e36c020, - 0x315ac: 0x6e3bae20, 0x315ad: 0x6e3bb020, 0x315ae: 0x6e3bb220, 0x315af: 0x6e3bb420, - 0x315b0: 0x6e371420, 0x315b1: 0x6e3f5420, 0x315b2: 0x6e3f5620, 0x315b3: 0x6e3f5820, - 0x315b4: 0x6e3f5a20, 0x315b5: 0x6e3f5c20, 0x315b6: 0x6e3f5e20, 0x315b7: 0x6e41da20, - 0x315b8: 0x6e41dc20, 0x315b9: 0x6e44d220, 0x315ba: 0x6e458220, 0x315bb: 0x6e469a20, - 0x315bc: 0x6c42dc20, 0x315bd: 0x6c8ac020, 0x315be: 0x6cb74a20, 0x315bf: 0x6ce86e20, - // Block 0xc57, offset 0x315c0 - 0x315c0: 0x6ce87020, 0x315c1: 0x6ce87220, 0x315c2: 0x6ce87420, 0x315c3: 0x6ce87620, - 0x315c4: 0x6d17e020, 0x315c5: 0x6d17e220, 0x315c6: 0x6d17e420, 0x315c7: 0x6d17e620, - 0x315c8: 0x6d17e820, 0x315c9: 0x6d17ea20, 0x315ca: 0x6d17ec20, 0x315cb: 0x6d17ee20, - 0x315cc: 0x6d17f020, 0x315cd: 0x6d17f220, 0x315ce: 0x6d17f420, 0x315cf: 0x6d17f620, - 0x315d0: 0x6d17f820, 0x315d1: 0x6d46b620, 0x315d2: 0x6d46b820, 0x315d3: 0x6d46ba20, - 0x315d4: 0x6d46bc20, 0x315d5: 0x6d46be20, 0x315d6: 0x6d46c020, 0x315d7: 0x6d46c220, - 0x315d8: 0x6d46c420, 0x315d9: 0x6d46c620, 0x315da: 0x6d46c820, 0x315db: 0x6d46ca20, - 0x315dc: 0x6d46cc20, 0x315dd: 0x6d46ce20, 0x315de: 0x6d46d020, 0x315df: 0x6d46d220, - 0x315e0: 0x6d740c20, 0x315e1: 0x6d740e20, 0x315e2: 0x6d741020, 0x315e3: 0x6d741220, - 0x315e4: 0x6d741420, 0x315e5: 0x6d741620, 0x315e6: 0x6d741820, 0x315e7: 0x6d741a20, - 0x315e8: 0x6d741c20, 0x315e9: 0x6d741e20, 0x315ea: 0x6d742020, 0x315eb: 0x6d742220, - 0x315ec: 0x6d742420, 0x315ed: 0x6d9db020, 0x315ee: 0x6d9db220, 0x315ef: 0x6d9db420, - 0x315f0: 0x6d9db620, 0x315f1: 0x6d9db820, 0x315f2: 0x6d9dba20, 0x315f3: 0x6d9dbc20, - 0x315f4: 0x6d9dbe20, 0x315f5: 0x6d9dc020, 0x315f6: 0x6d9dc220, 0x315f7: 0x6d9dc420, - 0x315f8: 0x6d9dc620, 0x315f9: 0x6d9dc820, 0x315fa: 0x6d9dca20, 0x315fb: 0x6d9dcc20, - 0x315fc: 0x6dc03c20, 0x315fd: 0x6dc03e20, 0x315fe: 0x6dc06820, 0x315ff: 0x6dc04020, - // Block 0xc58, offset 0x31600 - 0x31600: 0x6dc04220, 0x31601: 0x6dc04420, 0x31602: 0x6dc04620, 0x31603: 0x6dc04820, - 0x31604: 0x6dc04a20, 0x31605: 0x6dc04c20, 0x31606: 0x6dc04e20, 0x31607: 0x6dc05020, - 0x31608: 0x6dc05220, 0x31609: 0x6dc05420, 0x3160a: 0x6dc05620, 0x3160b: 0x6dc05820, - 0x3160c: 0x6dde2e20, 0x3160d: 0x6dde3020, 0x3160e: 0x6dde3220, 0x3160f: 0x6dde3420, - 0x31610: 0x6dde3620, 0x31611: 0x6dde3820, 0x31612: 0x6dde3a20, 0x31613: 0x6df61e20, - 0x31614: 0x6df62020, 0x31615: 0x6df62220, 0x31616: 0x6df62420, 0x31617: 0x6df62620, - 0x31618: 0x6df62820, 0x31619: 0x6df62a20, 0x3161a: 0x6df62c20, 0x3161b: 0x6df62e20, - 0x3161c: 0x6e09ec20, 0x3161d: 0x6e09ee20, 0x3161e: 0x6e09f020, 0x3161f: 0x6e09f220, - 0x31620: 0x6e19f820, 0x31621: 0x6e19fa20, 0x31622: 0x6e19fc20, 0x31623: 0x6e19fe20, - 0x31624: 0x6e267420, 0x31625: 0x6cb75220, 0x31626: 0x6ce88620, 0x31627: 0x6d180820, - 0x31628: 0x6d180a20, 0x31629: 0x6d180c20, 0x3162a: 0x6d180e20, 0x3162b: 0x6d181020, - 0x3162c: 0x6c63ac20, 0x3162d: 0x6d181220, 0x3162e: 0x6d181420, 0x3162f: 0x6d181620, - 0x31630: 0x6d181820, 0x31631: 0x6d46f420, 0x31632: 0x6d46f620, 0x31633: 0x6d46f820, - 0x31634: 0x6d46fa20, 0x31635: 0x6d46fc20, 0x31636: 0x6d46fe20, 0x31637: 0x6d745020, - 0x31638: 0x6d745220, 0x31639: 0x6d745420, 0x3163a: 0x6d745620, 0x3163b: 0x6d745820, - 0x3163c: 0x6d745a20, 0x3163d: 0x6d745c20, 0x3163e: 0x6d745e20, 0x3163f: 0x6d746020, - // Block 0xc59, offset 0x31640 - 0x31640: 0x6d746220, 0x31641: 0x6d746420, 0x31642: 0x6d746620, 0x31643: 0x6d746820, - 0x31644: 0x6d746a20, 0x31645: 0x6d746c20, 0x31646: 0x6d746e20, 0x31647: 0x6d747020, - 0x31648: 0x6d747220, 0x31649: 0x6d747420, 0x3164a: 0x6d9e0620, 0x3164b: 0x6d747620, - 0x3164c: 0x6d747820, 0x3164d: 0x6d747a20, 0x3164e: 0x6d747c20, 0x3164f: 0x6d9e0820, - 0x31650: 0x6d9e0a20, 0x31651: 0x6d9e0c20, 0x31652: 0x6d9e0e20, 0x31653: 0x6d9e1020, - 0x31654: 0x6d9e1220, 0x31655: 0x6d9e1420, 0x31656: 0x6d9e1620, 0x31657: 0x6d9e1820, - 0x31658: 0x6d9e1a20, 0x31659: 0x6d9e1c20, 0x3165a: 0x6d9e1e20, 0x3165b: 0x6d9e2020, - 0x3165c: 0x6dc06a20, 0x3165d: 0x6d9e2220, 0x3165e: 0x6d9e2420, 0x3165f: 0x6d9e2620, - 0x31660: 0x6d9e2820, 0x31661: 0x6d9e2a20, 0x31662: 0x6d9e2c20, 0x31663: 0x6d9e2e20, - 0x31664: 0x6d9e3020, 0x31665: 0x6d9e3220, 0x31666: 0x6d9e3420, 0x31667: 0x6d9e3620, - 0x31668: 0x6d9e3820, 0x31669: 0x6d9e3a20, 0x3166a: 0x6d9e3c20, 0x3166b: 0x6d9e3e20, - 0x3166c: 0x6d9e4020, 0x3166d: 0x6dc08020, 0x3166e: 0x6dc08220, 0x3166f: 0x6dc08420, - 0x31670: 0x6dc08620, 0x31671: 0x6dc08820, 0x31672: 0x6dc08a20, 0x31673: 0x6dc08c20, - 0x31674: 0x6dc08e20, 0x31675: 0x6dc09020, 0x31676: 0x6dc09220, 0x31677: 0x6dc09420, - 0x31678: 0x6dc09620, 0x31679: 0x6dc09820, 0x3167a: 0x6dc09a20, 0x3167b: 0x6dc09c20, - 0x3167c: 0x6dc09e20, 0x3167d: 0x6dc0a020, 0x3167e: 0x6dc0a220, 0x3167f: 0x6dc0a420, - // Block 0xc5a, offset 0x31680 - 0x31680: 0x6dc0a620, 0x31681: 0x6dc0a820, 0x31682: 0x6dc0aa20, 0x31683: 0x6dc0ac20, - 0x31684: 0x6dc0ae20, 0x31685: 0x6dc0b020, 0x31686: 0x6dc0b220, 0x31687: 0x6dc0b420, - 0x31688: 0x6dc0b620, 0x31689: 0x6dc0b820, 0x3168a: 0x6dde4e20, 0x3168b: 0x6dde5020, - 0x3168c: 0x6dde5220, 0x3168d: 0x6dde5420, 0x3168e: 0x6dde5620, 0x3168f: 0x6dde5820, - 0x31690: 0x6dde5a20, 0x31691: 0x6dde5c20, 0x31692: 0x6dde5e20, 0x31693: 0x6dde6020, - 0x31694: 0x6dde6220, 0x31695: 0x6dde6420, 0x31696: 0x6dde6620, 0x31697: 0x6dde6820, - 0x31698: 0x6dde6a20, 0x31699: 0x6dde6c20, 0x3169a: 0x6dde6e20, 0x3169b: 0x6dde7020, - 0x3169c: 0x6dde7220, 0x3169d: 0x6dde7420, 0x3169e: 0x6dde7620, 0x3169f: 0x6dde7820, - 0x316a0: 0x6dde7a20, 0x316a1: 0x6df63820, 0x316a2: 0x6dde7c20, 0x316a3: 0x6dde7e20, - 0x316a4: 0x6dd43a20, 0x316a5: 0x6dde8020, 0x316a6: 0x6df64c20, 0x316a7: 0x6dc13220, - 0x316a8: 0x6df64e20, 0x316a9: 0x6df65020, 0x316aa: 0x6df65220, 0x316ab: 0x6df65420, - 0x316ac: 0x6df65620, 0x316ad: 0x6df65820, 0x316ae: 0x6df65a20, 0x316af: 0x6df65c20, - 0x316b0: 0x6df65e20, 0x316b1: 0x6df66020, 0x316b2: 0x6df66220, 0x316b3: 0x6df66420, - 0x316b4: 0x6df66620, 0x316b5: 0x6df66820, 0x316b6: 0x6df66a20, 0x316b7: 0x6df66c20, - 0x316b8: 0x6df66e20, 0x316b9: 0x6df67020, 0x316ba: 0x6df67220, 0x316bb: 0x6df67420, - 0x316bc: 0x6df67620, 0x316bd: 0x6df67820, 0x316be: 0x6df67a20, 0x316bf: 0x6df67c20, - // Block 0xc5b, offset 0x316c0 - 0x316c0: 0x6df67e20, 0x316c1: 0x6df68020, 0x316c2: 0x6df68220, 0x316c3: 0x6df68420, - 0x316c4: 0x6df68620, 0x316c5: 0x6df68820, 0x316c6: 0x6df68a20, 0x316c7: 0x6df68c20, - 0x316c8: 0x6df68e20, 0x316c9: 0x6df69020, 0x316ca: 0x6df69220, 0x316cb: 0x6df69420, - 0x316cc: 0x6df69620, 0x316cd: 0x6df69820, 0x316ce: 0x6df69a20, 0x316cf: 0x6df69c20, - 0x316d0: 0x6e0a0e20, 0x316d1: 0x6df69e20, 0x316d2: 0x6e0a1020, 0x316d3: 0x6e0a1220, - 0x316d4: 0x6e0a1420, 0x316d5: 0x6e0a1620, 0x316d6: 0x6e0a1820, 0x316d7: 0x6e0a1a20, - 0x316d8: 0x6e0a1c20, 0x316d9: 0x6e0a1e20, 0x316da: 0x6e0a2020, 0x316db: 0x6e0a2220, - 0x316dc: 0x6e0a2420, 0x316dd: 0x6e0a2620, 0x316de: 0x6e0a2820, 0x316df: 0x6e0a2a20, - 0x316e0: 0x6e0a2c20, 0x316e1: 0x6e0a2e20, 0x316e2: 0x6e0a3020, 0x316e3: 0x6e0a3220, - 0x316e4: 0x6e0a3420, 0x316e5: 0x6e0a3620, 0x316e6: 0x6e0a3820, 0x316e7: 0x6e0a3a20, - 0x316e8: 0x6e0a3c20, 0x316e9: 0x6e0a3e20, 0x316ea: 0x6e0a4020, 0x316eb: 0x6e0a4220, - 0x316ec: 0x6e1a1020, 0x316ed: 0x6e1a1220, 0x316ee: 0x6e1a1420, 0x316ef: 0x6e1a1620, - 0x316f0: 0x6e1a1820, 0x316f1: 0x6e1a1a20, 0x316f2: 0x6e1a1c20, 0x316f3: 0x6e1a1e20, - 0x316f4: 0x6e1a2020, 0x316f5: 0x6e1a2220, 0x316f6: 0x6e1a2420, 0x316f7: 0x6e1a2620, - 0x316f8: 0x6e1a2820, 0x316f9: 0x6e1a2a20, 0x316fa: 0x6e1a2c20, 0x316fb: 0x6e1a2e20, - 0x316fc: 0x6e1a3020, 0x316fd: 0x6e1a3220, 0x316fe: 0x6e1a3420, 0x316ff: 0x6e0ad220, - // Block 0xc5c, offset 0x31700 - 0x31700: 0x6e1a3620, 0x31701: 0x6e1a3820, 0x31702: 0x6e1a3a20, 0x31703: 0x6e1a3c20, - 0x31704: 0x6e1a3e20, 0x31705: 0x6e1a4020, 0x31706: 0x6e1a4220, 0x31707: 0x6e1a4420, - 0x31708: 0x6e1a4620, 0x31709: 0x6e1a4820, 0x3170a: 0x6e1a4a20, 0x3170b: 0x6e268620, - 0x3170c: 0x6e1a4c20, 0x3170d: 0x6e1a4e20, 0x3170e: 0x6e1a5020, 0x3170f: 0x6e1a5220, - 0x31710: 0x6e268820, 0x31711: 0x6e268a20, 0x31712: 0x6e268c20, 0x31713: 0x6e268e20, - 0x31714: 0x6e269020, 0x31715: 0x6e269220, 0x31716: 0x6e269420, 0x31717: 0x6e269620, - 0x31718: 0x6e269820, 0x31719: 0x6e269a20, 0x3171a: 0x6e269c20, 0x3171b: 0x6e269e20, - 0x3171c: 0x6e26a020, 0x3171d: 0x6e26a220, 0x3171e: 0x6e26a420, 0x3171f: 0x6e26a620, - 0x31720: 0x6e260c20, 0x31721: 0x6e2ff220, 0x31722: 0x6e2ff420, 0x31723: 0x6e2ff620, - 0x31724: 0x6e2ff820, 0x31725: 0x6e2ffa20, 0x31726: 0x6e2ffc20, 0x31727: 0x6e2ffe20, - 0x31728: 0x6e300020, 0x31729: 0x6e273020, 0x3172a: 0x6e300220, 0x3172b: 0x6e300420, - 0x3172c: 0x6e300620, 0x3172d: 0x6e300820, 0x3172e: 0x6e300a20, 0x3172f: 0x6e300c20, - 0x31730: 0x6e300e20, 0x31731: 0x6e301020, 0x31732: 0x6e301220, 0x31733: 0x6e301420, - 0x31734: 0x6e301620, 0x31735: 0x6e273220, 0x31736: 0x6e301820, 0x31737: 0x6e301a20, - 0x31738: 0x6e301c20, 0x31739: 0x6e372220, 0x3173a: 0x6e371620, 0x3173b: 0x6e301e20, - 0x3173c: 0x6e302020, 0x3173d: 0x6e372420, 0x3173e: 0x6e372620, 0x3173f: 0x6e372820, - // Block 0xc5d, offset 0x31740 - 0x31740: 0x6e372a20, 0x31741: 0x6e372c20, 0x31742: 0x6e372e20, 0x31743: 0x6e373020, - 0x31744: 0x6e373220, 0x31745: 0x6e373420, 0x31746: 0x6e373620, 0x31747: 0x6e373820, - 0x31748: 0x6e373a20, 0x31749: 0x6e373c20, 0x3174a: 0x6e373e20, 0x3174b: 0x6e3bea20, - 0x3174c: 0x6e3bec20, 0x3174d: 0x6e3bee20, 0x3174e: 0x6e3bf020, 0x3174f: 0x6e3bf220, - 0x31750: 0x6e3bf420, 0x31751: 0x6e3bf620, 0x31752: 0x6e3bf820, 0x31753: 0x6e3f8820, - 0x31754: 0x6e3f8a20, 0x31755: 0x6e41fa20, 0x31756: 0x6e41fc20, 0x31757: 0x6e41fe20, - 0x31758: 0x6e43c020, 0x31759: 0x6e43c220, 0x3175a: 0x6e43c420, 0x3175b: 0x6e44e620, - 0x3175c: 0x6e44e820, 0x3175d: 0x6e458c20, 0x3175e: 0x6e458e20, 0x3175f: 0x6c0ac820, - 0x31760: 0x6c28a620, 0x31761: 0x6c28a820, 0x31762: 0x6c42de20, 0x31763: 0x6c42e020, - 0x31764: 0x6c42e220, 0x31765: 0x6c63ae20, 0x31766: 0x6c63b020, 0x31767: 0x6c63b220, - 0x31768: 0x6c63b420, 0x31769: 0x6c63b620, 0x3176a: 0x6c8ac420, 0x3176b: 0x6c8ac620, - 0x3176c: 0x6c8ac820, 0x3176d: 0x6c8aca20, 0x3176e: 0x6c8acc20, 0x3176f: 0x6c8ace20, - 0x31770: 0x6c8ad020, 0x31771: 0x6c8ad220, 0x31772: 0x6c8ad420, 0x31773: 0x6c8ad620, - 0x31774: 0x6c8ad820, 0x31775: 0x6c8ada20, 0x31776: 0x6c8adc20, 0x31777: 0x6cb75620, - 0x31778: 0x6cb75820, 0x31779: 0x6cb75a20, 0x3177a: 0x6cb75c20, 0x3177b: 0x6cb75e20, - 0x3177c: 0x6cb76020, 0x3177d: 0x6cb76220, 0x3177e: 0x6cb76420, 0x3177f: 0x6cb76620, - // Block 0xc5e, offset 0x31780 - 0x31780: 0x6ce89020, 0x31781: 0x6ce89220, 0x31782: 0x6ce89420, 0x31783: 0x6ce89620, - 0x31784: 0x6ce89820, 0x31785: 0x6ce89a20, 0x31786: 0x6ce89c20, 0x31787: 0x6ce89e20, - 0x31788: 0x6ce8a020, 0x31789: 0x6d183020, 0x3178a: 0x6d183220, 0x3178b: 0x6d183420, - 0x3178c: 0x6d183620, 0x3178d: 0x6d183820, 0x3178e: 0x6d183a20, 0x3178f: 0x6d183c20, - 0x31790: 0x6d183e20, 0x31791: 0x6d184020, 0x31792: 0x6d184220, 0x31793: 0x6d184420, - 0x31794: 0x6d184620, 0x31795: 0x6d472620, 0x31796: 0x6d472820, 0x31797: 0x6d472a20, - 0x31798: 0x6d74e020, 0x31799: 0x6d472c20, 0x3179a: 0x6d472e20, 0x3179b: 0x6d473020, - 0x3179c: 0x6d473220, 0x3179d: 0x6d74e220, 0x3179e: 0x6d74e420, 0x3179f: 0x6d74e620, - 0x317a0: 0x6d74e820, 0x317a1: 0x6d74ea20, 0x317a2: 0x6d74ec20, 0x317a3: 0x6d74ee20, - 0x317a4: 0x6d74f020, 0x317a5: 0x6d9eba20, 0x317a6: 0x6d9ebc20, 0x317a7: 0x6d9ebe20, - 0x317a8: 0x6d9ec020, 0x317a9: 0x6dc13820, 0x317aa: 0x6dc13a20, 0x317ab: 0x6dc13c20, - 0x317ac: 0x6dc13e20, 0x317ad: 0x6ddee620, 0x317ae: 0x6ddee820, 0x317af: 0x6ddeea20, - 0x317b0: 0x6ddeec20, 0x317b1: 0x6df73020, 0x317b2: 0x6df73220, 0x317b3: 0x6e273420, - 0x317b4: 0x6e273620, 0x317b5: 0x6cb78220, 0x317b6: 0x6d750020, 0x317b7: 0x6d9eca20, - 0x317b8: 0x6df73620, 0x317b9: 0x6e0ad820, 0x317ba: 0x6e1ac620, 0x317bb: 0x6e1ac820, - 0x317bc: 0x6e378c20, 0x317bd: 0x6e378e20, 0x317be: 0x6d9ed820, 0x317bf: 0x6cb78620, - // Block 0xc5f, offset 0x317c0 - 0x317c0: 0x6d185620, 0x317c1: 0x6d185820, 0x317c2: 0x6d185a20, 0x317c3: 0x6d751220, - 0x317c4: 0x6d751420, 0x317c5: 0x6d9ee220, 0x317c6: 0x6d9ee420, 0x317c7: 0x6d9ee620, - 0x317c8: 0x6d9ee820, 0x317c9: 0x6dc14820, 0x317ca: 0x6dc14a20, 0x317cb: 0x6dc14c20, - 0x317cc: 0x6ddefc20, 0x317cd: 0x6ddefe20, 0x317ce: 0x6ddf0020, 0x317cf: 0x6ddf0220, - 0x317d0: 0x6ddf0420, 0x317d1: 0x6df74820, 0x317d2: 0x6df74a20, 0x317d3: 0x6df74c20, - 0x317d4: 0x6df74e20, 0x317d5: 0x6df75020, 0x317d6: 0x6df75220, 0x317d7: 0x6df75420, - 0x317d8: 0x6e0aec20, 0x317d9: 0x6e0aee20, 0x317da: 0x6e0af020, 0x317db: 0x6e0af220, - 0x317dc: 0x6e1ad620, 0x317dd: 0x6e1ad820, 0x317de: 0x6e274420, 0x317df: 0x6e30b220, - 0x317e0: 0x6e379a20, 0x317e1: 0x6e3c3820, 0x317e2: 0x6e43e220, 0x317e3: 0x6e460a20, - 0x317e4: 0x6e46a220, 0x317e5: 0x6cb78a20, 0x317e6: 0x6c28aa20, 0x317e7: 0x6d475620, - 0x317e8: 0x6d753420, 0x317e9: 0x6d753620, 0x317ea: 0x6d753820, 0x317eb: 0x6d753a20, - 0x317ec: 0x6d9f0620, 0x317ed: 0x6d9f0820, 0x317ee: 0x6d9f0a20, 0x317ef: 0x6dc17020, - 0x317f0: 0x6dc17220, 0x317f1: 0x6ddf2e20, 0x317f2: 0x6ddf3020, 0x317f3: 0x6df77420, - 0x317f4: 0x6df77620, 0x317f5: 0x6e0b0620, 0x317f6: 0x6e275620, 0x317f7: 0x6e44fe20, - 0x317f8: 0x6cb78c20, 0x317f9: 0x6d755a20, 0x317fa: 0x6d9f2620, 0x317fb: 0x6cb79420, - 0x317fc: 0x6d476420, 0x317fd: 0x6d476620, 0x317fe: 0x6d756420, 0x317ff: 0x6ddf5220, - // Block 0xc60, offset 0x31800 - 0x31800: 0x6df79a20, 0x31801: 0x6e0b2a20, 0x31802: 0x6e30dc20, 0x31803: 0x6ce8b420, - 0x31804: 0x6ce8b620, 0x31805: 0x6d9f3420, 0x31806: 0x6d9f3620, 0x31807: 0x6dc19420, - 0x31808: 0x6dc19620, 0x31809: 0x6dc19820, 0x3180a: 0x6ddf5a20, 0x3180b: 0x6ddf5c20, - 0x3180c: 0x6e3c4c20, 0x3180d: 0x6ce8b820, 0x3180e: 0x6d758020, 0x3180f: 0x6dc1a820, - 0x31810: 0x6e278420, 0x31811: 0x6ce8ba20, 0x31812: 0x6cb79620, 0x31813: 0x6d758a20, - 0x31814: 0x6d9f4c20, 0x31815: 0x6d9f4e20, 0x31816: 0x6d9f5020, 0x31817: 0x6d9f5220, - 0x31818: 0x6d9f5420, 0x31819: 0x6d585420, 0x3181a: 0x6dc1c220, 0x3181b: 0x6dc1c420, - 0x3181c: 0x6dc1c620, 0x3181d: 0x6dc1c820, 0x3181e: 0x6dc1ca20, 0x3181f: 0x6ddf7220, - 0x31820: 0x6ddf7420, 0x31821: 0x6ddf7620, 0x31822: 0x6df7c620, 0x31823: 0x6df7c820, - 0x31824: 0x6e0b5420, 0x31825: 0x6e0b5620, 0x31826: 0x6e0b5820, 0x31827: 0x6e0b5a20, - 0x31828: 0x6e0b5c20, 0x31829: 0x6e0b5e20, 0x3182a: 0x6e0b6020, 0x3182b: 0x6e1b2020, - 0x3182c: 0x6e1b2220, 0x3182d: 0x6e1b2420, 0x3182e: 0x6e1b2620, 0x3182f: 0x6e1b2820, - 0x31830: 0x6e278820, 0x31831: 0x6e278a20, 0x31832: 0x6e30f220, 0x31833: 0x6e30f420, - 0x31834: 0x6e30f620, 0x31835: 0x6e3c5820, 0x31836: 0x6e3fc820, 0x31837: 0x6e423420, - 0x31838: 0x6e43f420, 0x31839: 0x6ce8be20, 0x3183a: 0x6d9f7220, 0x3183b: 0x6dc1e620, - 0x3183c: 0x6df7e020, 0x3183d: 0x6d187420, 0x3183e: 0x6c42e420, 0x3183f: 0x6dc1e820, - // Block 0xc61, offset 0x31840 - 0x31840: 0x6ddf8e20, 0x31841: 0x6ddf9020, 0x31842: 0x6ddf9220, 0x31843: 0x6df7e420, - 0x31844: 0x6df7e620, 0x31845: 0x6e1b6620, 0x31846: 0x6e310c20, 0x31847: 0x6e310e20, - 0x31848: 0x6e3c7020, 0x31849: 0x6e3c7220, 0x3184a: 0x6e3fd420, 0x3184b: 0x6ce8c020, - 0x3184c: 0x6d187620, 0x3184d: 0x6e0b9620, 0x3184e: 0x6d187820, 0x3184f: 0x6d75a020, - 0x31850: 0x6d75a220, 0x31851: 0x6d75a420, 0x31852: 0x6d9f7820, 0x31853: 0x6d187a20, - 0x31854: 0x6d187c20, 0x31855: 0x6ddfaa20, 0x31856: 0x6ddfac20, 0x31857: 0x6df7f820, - 0x31858: 0x6e1b6e20, 0x31859: 0x6e1b7020, 0x3185a: 0x6e1b7220, 0x3185b: 0x6e1b7420, - 0x3185c: 0x6e311420, 0x3185d: 0x6e3c7a20, 0x3185e: 0x6e37ec20, 0x3185f: 0x6e3c7c20, - 0x31860: 0x6d188020, 0x31861: 0x6c42e620, 0x31862: 0x6dc20220, 0x31863: 0x6dc20420, - 0x31864: 0x6dc20620, 0x31865: 0x6ddfb820, 0x31866: 0x6ddfba20, 0x31867: 0x6ddfbc20, - 0x31868: 0x6ddfbe20, 0x31869: 0x6ddfc020, 0x3186a: 0x6ddfc220, 0x3186b: 0x6ddfc420, - 0x3186c: 0x6ddfc620, 0x3186d: 0x6df80c20, 0x3186e: 0x6e0ba420, 0x3186f: 0x6e0ba620, - 0x31870: 0x6e0ba820, 0x31871: 0x6e1b8020, 0x31872: 0x6e27d820, 0x31873: 0x6e27da20, - 0x31874: 0x6e27dc20, 0x31875: 0x6e27de20, 0x31876: 0x6e311c20, 0x31877: 0x6e311e20, - 0x31878: 0x6e312020, 0x31879: 0x6e312220, 0x3187a: 0x6e440020, 0x3187b: 0x6d478020, - 0x3187c: 0x6d9f8820, 0x3187d: 0x6d9f8a20, 0x3187e: 0x6dc22020, 0x3187f: 0x6dc22220, - // Block 0xc62, offset 0x31880 - 0x31880: 0x6df82220, 0x31881: 0x6df82420, 0x31882: 0x6e27f420, 0x31883: 0x6e313820, - 0x31884: 0x6e313a20, 0x31885: 0x6e380020, 0x31886: 0x6e380220, 0x31887: 0x6e3c9220, - 0x31888: 0x6e424e20, 0x31889: 0x6e46fc20, 0x3188a: 0x6d478220, 0x3188b: 0x6dc22c20, - 0x3188c: 0x6ddfec20, 0x3188d: 0x6df83420, 0x3188e: 0x6e1b9a20, 0x3188f: 0x6e314420, - 0x31890: 0x6c15e220, 0x31891: 0x6d75b420, 0x31892: 0x6d75b620, 0x31893: 0x6d9f9220, - 0x31894: 0x6dc23020, 0x31895: 0x6ddff620, 0x31896: 0x6df83e20, 0x31897: 0x6df84020, - 0x31898: 0x6df84220, 0x31899: 0x6e0bda20, 0x3189a: 0x6e0bdc20, 0x3189b: 0x6e0bde20, - 0x3189c: 0x6e1b9e20, 0x3189d: 0x6e0be020, 0x3189e: 0x6e0be220, 0x3189f: 0x6e0be420, - 0x318a0: 0x6e0be620, 0x318a1: 0x6e0be820, 0x318a2: 0x6dc23a20, 0x318a3: 0x6e0bea20, - 0x318a4: 0x6e1ba420, 0x318a5: 0x6e1ba620, 0x318a6: 0x6e1ba820, 0x318a7: 0x6e1baa20, - 0x318a8: 0x6e1bac20, 0x318a9: 0x6e1bae20, 0x318aa: 0x6e280020, 0x318ab: 0x6e280220, - 0x318ac: 0x6e280420, 0x318ad: 0x6e314a20, 0x318ae: 0x6e314c20, 0x318af: 0x6e314e20, - 0x318b0: 0x6e315020, 0x318b1: 0x6e315220, 0x318b2: 0x6e381220, 0x318b3: 0x6e381420, - 0x318b4: 0x6e381620, 0x318b5: 0x6e381820, 0x318b6: 0x6e381a20, 0x318b7: 0x6e381c20, - 0x318b8: 0x6e3ca820, 0x318b9: 0x6e3caa20, 0x318ba: 0x6e3cac20, 0x318bb: 0x6e3cae20, - 0x318bc: 0x6e440620, 0x318bd: 0x6e440820, 0x318be: 0x6e46dc20, 0x318bf: 0x6c42e820, - // Block 0xc63, offset 0x318c0 - 0x318c0: 0x6c8aee20, 0x318c1: 0x6cb79820, 0x318c2: 0x6ce8c420, 0x318c3: 0x6d188220, - 0x318c4: 0x6d188420, 0x318c5: 0x6d188620, 0x318c6: 0x6d188820, 0x318c7: 0x6d478620, - 0x318c8: 0x6d478820, 0x318c9: 0x6d75ba20, 0x318ca: 0x6d75bc20, 0x318cb: 0x6dc23c20, - 0x318cc: 0x6dc23e20, 0x318cd: 0x6d9f9c20, 0x318ce: 0x6de00020, 0x318cf: 0x6df85a20, - 0x318d0: 0x6de23620, 0x318d1: 0x6e0c1220, 0x318d2: 0x6e1be220, 0x318d3: 0x6e283820, - 0x318d4: 0x6e283a20, 0x318d5: 0x6e283c20, 0x318d6: 0x6e467820, 0x318d7: 0x6e46a820, - 0x318d8: 0x6e473c20, 0x318d9: 0x6c0aca20, 0x318da: 0x6cb79a20, 0x318db: 0x6cb79c20, - 0x318dc: 0x6d9f9e20, 0x318dd: 0x6e1bea20, 0x318de: 0x6e441620, 0x318df: 0x6c28ac20, - 0x318e0: 0x6dc24220, 0x318e1: 0x6e1c0020, 0x318e2: 0x6e284620, 0x318e3: 0x6e3cda20, - 0x318e4: 0x6e3ffc20, 0x318e5: 0x6e3ffe20, 0x318e6: 0x6d585620, 0x318e7: 0x6d7e6e20, - 0x318e8: 0x6c670020, 0x318e9: 0x6db26c20, 0x318ea: 0x6c610620, 0x318eb: 0x6ce29e20, - 0x318ec: 0x6d974220, 0x318ed: 0x6e186020, 0x318ee: 0x6e41aa20, 0x318ef: 0x6d135620, - 0x318f0: 0x6c04aa20, 0x318f1: 0x6c079420, 0x318f2: 0x6dd85820, 0x318f3: 0x6d789a20, - 0x318f4: 0x6c006420, 0x318f5: 0x6c01f820, 0x318f6: 0x6c03d220, 0x318f7: 0x6c0a5820, - 0x318f8: 0x6c083c20, 0x318f9: 0x6c0c7020, 0x318fa: 0x6c2bb820, 0x318fb: 0x6ded8620, - 0x318fc: 0x6da1a620, 0x318fd: 0x6d585820, 0x318fe: 0x6d00ea20, 0x318ff: 0x6cae1c20, - // Block 0xc64, offset 0x31900 - 0x31900: 0x6e134020, 0x31901: 0x6d0e4820, 0x31902: 0x6dd6dc20, 0x31903: 0x6cd37020, - 0x31904: 0x6c749620, 0x31905: 0x6daca820, 0x31906: 0x6c3cfa20, 0x31907: 0x6c29c820, - 0x31908: 0x6c1efa20, 0x31909: 0x6c1efc20, 0x3190a: 0x6cad0e20, 0x3190b: 0x6db51620, - // Block 0xc65, offset 0x31940 - 0x31940: 0x6c86d020, 0x31941: 0x6c219c20, 0x31942: 0x6c270e20, 0x31943: 0x6d0f3a20, - 0x31944: 0x6cfa9420, 0x31945: 0x6c160020, 0x31946: 0x6c073820, 0x31947: 0x6d9f9e20, - 0x31948: 0x6d9f9e20, 0x31949: 0x6c490c20, 0x3194a: 0x6c41dc20, 0x3194b: 0x6cbab020, - 0x3194c: 0x6c2eb020, 0x3194d: 0x6de28c20, 0x3194e: 0x6e102820, 0x3194f: 0x6de9ba20, - 0x31950: 0x6e2b8e20, 0x31951: 0x6db3f420, 0x31952: 0x6d3b6a20, 0x31953: 0x6e2d0820, - 0x31954: 0x6d540620, 0x31955: 0x6c542820, 0x31956: 0x6c782020, 0x31957: 0x6c79ee20, - 0x31958: 0x6d09ae20, 0x31959: 0x6d128020, 0x3195a: 0x6d9bda20, 0x3195b: 0x6ce8d220, - 0x3195c: 0x6c18d820, 0x3195d: 0x6e0e7820, 0x3195e: 0x6e0f8220, 0x3195f: 0x6e12b420, - 0x31960: 0x6e458e20, 0x31961: 0x6cc0c020, 0x31962: 0x6da7c620, 0x31963: 0x6dd18820, - 0x31964: 0x6e01ee20, 0x31965: 0x6c348020, 0x31966: 0x6dea2c20, 0x31967: 0x6e135e20, - 0x31968: 0x6cc21820, 0x31969: 0x6c73be20, 0x3196a: 0x6c769c20, 0x3196b: 0x6c795620, - 0x3196c: 0x6c620220, 0x3196d: 0x6c297820, 0x3196e: 0x6c179420, 0x3196f: 0x6cb9b220, - 0x31970: 0x6d7cd420, 0x31971: 0x6de3da20, 0x31972: 0x6dfc5620, 0x31973: 0x6d868620, - 0x31974: 0x6c144420, 0x31975: 0x6e008a20, 0x31976: 0x6d0bc020, 0x31977: 0x6d103820, - 0x31978: 0x6e16b020, 0x31979: 0x6d73ae20, 0x3197a: 0x6e371620, 0x3197b: 0x6d027820, - 0x3197c: 0x6d032420, 0x3197d: 0x6d33d820, 0x3197e: 0x6cdb3420, 0x3197f: 0x6d96bc20, - // Block 0xc66, offset 0x31980 - 0x31980: 0x6cb78620, 0x31981: 0x6d68ec20, 0x31982: 0x6de11020, 0x31983: 0x6c1e9220, - 0x31984: 0x6e1f9e20, 0x31985: 0x6e206020, 0x31986: 0x6c23f020, 0x31987: 0x6d5d2420, - 0x31988: 0x6d0f2e20, 0x31989: 0x6d152020, 0x3198a: 0x6dc3e620, 0x3198b: 0x6d1fe020, - 0x3198c: 0x6d542620, 0x3198d: 0x6c9f4220, 0x3198e: 0x6d295820, 0x3198f: 0x6ca91620, - 0x31990: 0x6daf5020, 0x31991: 0x6c62d820, 0x31992: 0x6c8d4420, 0x31993: 0x6c145c20, - 0x31994: 0x6d487e20, 0x31995: 0x6c65d820, 0x31996: 0x6d03ae20, 0x31997: 0x6d341420, - 0x31998: 0x6cdb8220, 0x31999: 0x6cb5fc20, 0x3199a: 0x6e21cc20, 0x3199b: 0x6c4ef420, - 0x3199c: 0x6d540620, 0x3199d: 0x6d927c20, 0x3199e: 0x6c024220, 0x3199f: 0x6d1f5620, - 0x319a0: 0x6c4d8620, 0x319a1: 0x6ca2d620, 0x319a2: 0x6ca3e620, 0x319a3: 0x6c06c620, - 0x319a4: 0x6dac3420, 0x319a5: 0x6c438020, 0x319a6: 0x6cc2d420, 0x319a7: 0x6c021a20, - 0x319a8: 0x6c38c420, 0x319a9: 0x6d527e20, 0x319aa: 0x6c803a20, 0x319ab: 0x6c8de620, - 0x319ac: 0x6ced8620, 0x319ad: 0x6c599e20, 0x319ae: 0x6d09c620, 0x319af: 0x6d3c9420, - 0x319b0: 0x6c9e2620, 0x319b1: 0x6c272020, 0x319b2: 0x6c22fc20, 0x319b3: 0x6c4f3820, - 0x319b4: 0x6c5eb420, 0x319b5: 0x6c997820, 0x319b6: 0x6ca3de20, 0x319b7: 0x6c433620, - 0x319b8: 0x6c2a4c20, 0x319b9: 0x6c65d220, 0x319ba: 0x6c9c8020, 0x319bb: 0x6dce7a20, - 0x319bc: 0x6c263620, 0x319bd: 0x6d68e420, 0x319be: 0x6ce47020, 0x319bf: 0x6da05e20, - // Block 0xc67, offset 0x319c0 - 0x319c0: 0x6c199220, 0x319c1: 0x6c019420, 0x319c2: 0x6de23220, 0x319c3: 0x6c72c420, - 0x319c4: 0x6dc8dc20, 0x319c5: 0x6dfe0220, 0x319c6: 0x6d6f2820, 0x319c7: 0x6e44c220, - 0x319c8: 0x6df75420, 0x319c9: 0x6d758020, 0x319ca: 0x6c00a820, 0x319cb: 0x6d7e5e20, - 0x319cc: 0x6d80f220, 0x319cd: 0x6e22bc20, 0x319ce: 0x6c10da20, 0x319cf: 0x6d4fbc20, - 0x319d0: 0x6e28d020, 0x319d1: 0x6d515420, 0x319d2: 0x6d297c20, 0x319d3: 0x6cfc0c20, - 0x319d4: 0x6d5a3c20, 0x319d5: 0x6c3d4620, 0x319d6: 0x6d60c620, 0x319d7: 0x6db0a020, - 0x319d8: 0x6d6bf020, 0x319d9: 0x6d642020, 0x319da: 0x6cb37e20, 0x319db: 0x6db9b220, - 0x319dc: 0x6c0cfc20, 0x319dd: 0x6c0d4020, 0x319de: 0x6c46c420, 0x319df: 0x6c77fe20, - 0x319e0: 0x6cde9a20, 0x319e1: 0x6d3c9420, 0x319e2: 0x6cf17420, 0x319e3: 0x6c32f220, - 0x319e4: 0x6c993220, 0x319e5: 0x6da72420, 0x319e6: 0x6de83e20, 0x319e7: 0x6dca5a20, - 0x319e8: 0x6c05e820, 0x319e9: 0x6c2d8820, 0x319ea: 0x6d1f5620, 0x319eb: 0x6da2f220, - 0x319ec: 0x6c333420, 0x319ed: 0x6c573a20, 0x319ee: 0x6d5a0620, 0x319ef: 0x6caa3420, - 0x319f0: 0x6caada20, 0x319f1: 0x6d12d220, 0x319f2: 0x6d151e20, 0x319f3: 0x6e359c20, - 0x319f4: 0x6d442e20, 0x319f5: 0x6c298220, 0x319f6: 0x6dcca820, 0x319f7: 0x6e043820, - 0x319f8: 0x6dbbb220, 0x319f9: 0x6cc32e20, 0x319fa: 0x6c006a20, 0x319fb: 0x6d18e420, - 0x319fc: 0x6d4cd620, 0x319fd: 0x6c1cfc20, 0x319fe: 0x6c729c20, 0x319ff: 0x6d540620, - // Block 0xc68, offset 0x31a00 - 0x31a00: 0x6d834420, 0x31a01: 0x6daa7820, 0x31a02: 0x6d643a20, 0x31a03: 0x6d95ae20, - 0x31a04: 0x6d9f9c20, 0x31a05: 0x6cf5f820, 0x31a06: 0x6c283820, 0x31a07: 0x6d48a020, - 0x31a08: 0x6c368e20, 0x31a09: 0x6c521a20, 0x31a0a: 0x6c546e20, 0x31a0b: 0x6cfa3020, - 0x31a0c: 0x6c7a1820, 0x31a0d: 0x6c7ac820, 0x31a0e: 0x6cd45220, 0x31a0f: 0x6c801620, - 0x31a10: 0x6df30020, 0x31a11: 0x6c02d820, 0x31a12: 0x6d50c420, 0x31a13: 0x6cb60220, - 0x31a14: 0x6c64a820, 0x31a15: 0x6c945a20, 0x31a16: 0x6c9f6220, 0x31a17: 0x6d6bf820, - 0x31a18: 0x6c4d5820, 0x31a19: 0x6cf2a220, 0x31a1a: 0x6c73f020, 0x31a1b: 0x6ca2d620, - 0x31a1c: 0x6ce61620, 0x31a1d: 0x6c17f820, 0x31a1e: 0x6c0e4220, 0x31a1f: 0x6d4d6420, - 0x31a20: 0x6c35ea20, 0x31a21: 0x6c21ce20, 0x31a22: 0x6c9cce20, 0x31a23: 0x6c38f420, - 0x31a24: 0x6ca30c20, 0x31a25: 0x6cd24620, 0x31a26: 0x6d8bbe20, 0x31a27: 0x6d0cea20, - 0x31a28: 0x6d0d0c20, 0x31a29: 0x6c27f020, 0x31a2a: 0x6dd9bc20, 0x31a2b: 0x6c8d9420, - 0x31a2c: 0x6cfa6c20, 0x31a2d: 0x6c194820, 0x31a2e: 0x6d834820, 0x31a2f: 0x6d84e820, - 0x31a30: 0x6e007220, 0x31a31: 0x6d6f9220, 0x31a32: 0x6e2f7020, 0x31a33: 0x6e30b220, - 0x31a34: 0x6c36c420, 0x31a35: 0x6c9f2420, 0x31a36: 0x6db16420, 0x31a37: 0x6c0a4420, - 0x31a38: 0x6ca80e20, 0x31a39: 0x6ca89c20, 0x31a3a: 0x6c3ab620, 0x31a3b: 0x6c39cc20, - 0x31a3c: 0x6ded7c20, 0x31a3d: 0x6c029620, 0x31a3e: 0x6c83b820, 0x31a3f: 0x6c2ae020, - // Block 0xc69, offset 0x31a40 - 0x31a40: 0x6c032820, 0x31a41: 0x6c4c8220, 0x31a42: 0x6c349220, 0x31a43: 0x6d8a6620, - 0x31a44: 0x6c0fbc20, 0x31a45: 0x6c542c20, 0x31a46: 0x6d531620, 0x31a47: 0x6d952420, - 0x31a48: 0x6c14d020, 0x31a49: 0x6c62dc20, 0x31a4a: 0x6c26a020, 0x31a4b: 0x6d212a20, - 0x31a4c: 0x6c014620, 0x31a4d: 0x6ceb7220, 0x31a4e: 0x6ceb3420, 0x31a4f: 0x6c69d820, - 0x31a50: 0x6ced7e20, 0x31a51: 0x6cc0dc20, 0x31a52: 0x6cc79a20, 0x31a53: 0x6cf79a20, - 0x31a54: 0x6d26f820, 0x31a55: 0x6d769020, 0x31a56: 0x6ca29820, 0x31a57: 0x6c7bf820, - 0x31a58: 0x6c13f620, 0x31a59: 0x6c7de220, 0x31a5a: 0x6ca69620, 0x31a5b: 0x6d30ce20, - 0x31a5c: 0x6d155620, 0x31a5d: 0x6d335420, 0x31a5e: 0x6c144220, 0x31a5f: 0x6deabe20, - 0x31a60: 0x6e015420, 0x31a61: 0x6caea820, 0x31a62: 0x6d697820, 0x31a63: 0x6cb20820, - 0x31a64: 0x6c412e20, 0x31a65: 0x6ce32420, 0x31a66: 0x6cb42820, 0x31a67: 0x6d6e4820, - 0x31a68: 0x6d974420, 0x31a69: 0x6d149c20, 0x31a6a: 0x6ce7aa20, 0x31a6b: 0x6d16a820, - 0x31a6c: 0x6d9b2420, 0x31a6d: 0x6e1a2020, 0x31a6e: 0x6c888620, 0x31a6f: 0x6d98c020, - 0x31a70: 0x6c435e20, 0x31a71: 0x6d18fe20, 0x31a72: 0x6c173820, 0x31a73: 0x6c456020, - 0x31a74: 0x6cea9c20, 0x31a75: 0x6c2bac20, 0x31a76: 0x6cbada20, 0x31a77: 0x6d1b7220, - 0x31a78: 0x6d773620, 0x31a79: 0x6cbcc820, 0x31a7a: 0x6d758820, 0x31a7b: 0x6d4d6220, - 0x31a7c: 0x6c01b620, 0x31a7d: 0x6c6fc020, 0x31a7e: 0x6cc3aa20, 0x31a7f: 0x6d4fb820, - // Block 0xc6a, offset 0x31a80 - 0x31a80: 0x6de28220, 0x31a81: 0x6c9ab020, 0x31a82: 0x6c50ac20, 0x31a83: 0x6cc7b820, - 0x31a84: 0x6c9c8820, 0x31a85: 0x6c76b620, 0x31a86: 0x6c9fb820, 0x31a87: 0x6d297a20, - 0x31a88: 0x6cce4620, 0x31a89: 0x6c04d820, 0x31a8a: 0x6cd0a820, 0x31a8b: 0x6d028220, - 0x31a8c: 0x6c3cee20, 0x31a8d: 0x6c5ad020, 0x31a8e: 0x6c5ace20, 0x31a8f: 0x6c7dc620, - 0x31a90: 0x6c7dd220, 0x31a91: 0x6c7de020, 0x31a92: 0x6d30ca20, 0x31a93: 0x6d30cc20, - 0x31a94: 0x6d5e0420, 0x31a95: 0x6c5ba420, 0x31a96: 0x6d051020, 0x31a97: 0x6d60c620, - 0x31a98: 0x6d8abc20, 0x31a99: 0x6daf6420, 0x31a9a: 0x6d071220, 0x31a9b: 0x6c3e3620, - 0x31a9c: 0x6c82de20, 0x31a9d: 0x6c020420, 0x31a9e: 0x6c020420, 0x31a9f: 0x6cdbee20, - 0x31aa0: 0x6d678620, 0x31aa1: 0x6ca6aa20, 0x31aa2: 0x6d928220, 0x31aa3: 0x6dd48e20, - 0x31aa4: 0x6d3d8420, 0x31aa5: 0x6dee3c20, 0x31aa6: 0x6c051e20, 0x31aa7: 0x6ce32420, - 0x31aa8: 0x6df1b220, 0x31aa9: 0x6e06f620, 0x31aaa: 0x6d9a4a20, 0x31aab: 0x6c6f8420, - 0x31aac: 0x6cfce020, 0x31aad: 0x6d8d8a20, - 0x31ab0: 0x6c28ae20, 0x31ab1: 0x6c179020, 0x31ab2: 0x6c0c5a20, 0x31ab3: 0x6c296c20, - 0x31ab4: 0x6c061420, 0x31ab5: 0x6d767a20, 0x31ab6: 0x6c455c20, 0x31ab7: 0x6c016420, - 0x31ab8: 0x6cbada20, 0x31ab9: 0x6c8e9a20, 0x31aba: 0x6cbad220, 0x31abb: 0x6cebb420, - 0x31abc: 0x6ced7e20, 0x31abd: 0x6d4b0420, 0x31abe: 0x6c2ea820, 0x31abf: 0x6c2ef220, - // Block 0xc6b, offset 0x31ac0 - 0x31ac0: 0x6c924620, 0x31ac1: 0x6d79de20, 0x31ac2: 0x6d212820, 0x31ac3: 0x6d216c20, - 0x31ac4: 0x6c96ac20, 0x31ac5: 0x6cf1fa20, 0x31ac6: 0x6c97b620, 0x31ac7: 0x6cf2b020, - 0x31ac8: 0x6cf25620, 0x31ac9: 0x6d4fb820, 0x31aca: 0x6d224e20, 0x31acb: 0x6de28220, - 0x31acc: 0x6da46c20, 0x31acd: 0x6cc4ee20, 0x31ace: 0x6cf40620, 0x31acf: 0x6cc56820, - 0x31ad0: 0x6c9abe20, 0x31ad1: 0x6cc79a20, 0x31ad2: 0x6c73be20, 0x31ad3: 0x6c9c2220, - 0x31ad4: 0x6c21de20, 0x31ad5: 0x6c04ae20, 0x31ad6: 0x6c9e2620, 0x31ad7: 0x6c546e20, - 0x31ad8: 0x6cfaa420, 0x31ad9: 0x6cccf220, 0x31ada: 0x6d297a20, 0x31adb: 0x6de4d620, - 0x31adc: 0x6cce4620, 0x31add: 0x6dab6420, 0x31ade: 0x6da93020, 0x31adf: 0x6c09de20, - 0x31ae0: 0x6ca29820, 0x31ae1: 0x6d2d0620, 0x31ae2: 0x6d2dac20, 0x31ae3: 0x6c3be220, - 0x31ae4: 0x6d5b5220, 0x31ae5: 0x6d5b3020, 0x31ae6: 0x6c7bf820, 0x31ae7: 0x6ca4d020, - 0x31ae8: 0x6c3c8820, 0x31ae9: 0x6cd36020, 0x31aea: 0x6ca59220, 0x31aeb: 0x6d5d2820, - 0x31aec: 0x6d5e7620, 0x31aed: 0x6d051020, 0x31aee: 0x6c5c3a20, 0x31aef: 0x6d061420, - 0x31af0: 0x6d60c620, 0x31af1: 0x6cd85420, 0x31af2: 0x6c3e3620, 0x31af3: 0x6c83e820, - 0x31af4: 0x6cdb7e20, 0x31af5: 0x6d900a20, 0x31af6: 0x6db50820, 0x31af7: 0x6dd40e20, - 0x31af8: 0x6ca6aa20, 0x31af9: 0x6d68be20, 0x31afa: 0x6d697820, 0x31afb: 0x6d68d620, - 0x31afc: 0x6d928220, 0x31afd: 0x6d927c20, 0x31afe: 0x6d925c20, 0x31aff: 0x6dd48e20, - // Block 0xc6c, offset 0x31b00 - 0x31b00: 0x6e2c4c20, 0x31b01: 0x6dee3c20, 0x31b02: 0x6d951e20, 0x31b03: 0x6d959e20, - 0x31b04: 0x6db93e20, 0x31b05: 0x6d40e620, 0x31b06: 0x6cb60820, 0x31b07: 0x6df1b220, - 0x31b08: 0x6d155620, 0x31b09: 0x6e06d420, 0x31b0a: 0x6e06f620, 0x31b0b: 0x6d15fc20, - 0x31b0c: 0x6d9a4a20, 0x31b0d: 0x6e08b620, 0x31b0e: 0x6d9f9e20, 0x31b0f: 0x6d502220, - 0x31b10: 0x6d501620, 0x31b11: 0x6c36f420, 0x31b12: 0x6cf6d620, 0x31b13: 0x6c597a20, - 0x31b14: 0x6cd34020, 0x31b15: 0x6d5c7220, 0x31b16: 0x6dcdba20, 0x31b17: 0x6d0fcc20, - 0x31b18: 0x6e313820, 0x31b19: 0x6de00020, - // Block 0xc6d, offset 0x31b40 - 0x31b40: 0xf0001c1c, 0x31b41: 0xf0001c1c, 0x31b42: 0x00658c9c, - 0x31b50: 0x2c047483, 0x31b51: 0x2c0faa83, 0x31b52: 0x2c03a483, 0x31b53: 0xf0001c1c, - 0x31b54: 0x2c007483, 0x31b55: 0x2c0f1e83, 0x31b56: 0x2d0dc083, 0x31b57: 0x2c03de83, - 0x31b58: 0x2c0b5483, 0x31b59: 0x2c50d083, 0x31b5a: 0x2cce0683, 0x31b5b: 0x2c729c83, - 0x31b5c: 0x2c44fc83, 0x31b5d: 0x2c4d5a83, 0x31b5e: 0x2c0c7883, 0x31b5f: 0x2cf5a283, - 0x31b60: 0x2c17e083, 0x31b61: 0x2ca93c83, 0x31b62: 0x2c0a0283, 0x31b63: 0x2cb1a083, - 0x31b64: 0x2c1b6883, 0x31b65: 0x2c198083, 0x31b66: 0x2d295e83, 0x31b67: 0x2c208683, - 0x31b68: 0x2c714283, 0x31b69: 0x2c000283, 0x31b6a: 0x2c00dc83, 0x31b6b: 0x2d118683, - 0x31b6c: 0x2c089283, 0x31b6d: 0x2c023683, 0x31b6e: 0x2c075483, 0x31b6f: 0x2c4f4883, - 0x31b70: 0x2c26fc83, 0x31b71: 0x2c093e83, 0x31b72: 0x2d032883, 0x31b73: 0x2c3d6e83, - 0x31b74: 0x2c0e3483, 0x31b75: 0x2cccd883, 0x31b76: 0x2c127483, 0x31b77: 0x2c049c83, - 0x31b78: 0x2c0a1083, 0x31b79: 0x2cb95283, 0x31b7a: 0x2c901a83, - // Block 0xc6e, offset 0x31b80 - 0x31b80: 0xe000b653, 0x31b81: 0xe000b64b, 0x31b82: 0xe000b647, 0x31b83: 0xe000b657, - 0x31b84: 0xe000b65b, 0x31b85: 0xe000b64f, 0x31b86: 0xe000b663, 0x31b87: 0xe000b667, - 0x31b88: 0xe000b65f, - 0x31b90: 0x2c96d483, 0x31b91: 0x2c074c83, - // Block 0xc6f, offset 0x31bc0 - 0x31bc0: 0x6c003e20, 0x31bc1: 0x6c004020, 0x31bc2: 0x6c004220, 0x31bc3: 0x6c00e820, - 0x31bc4: 0x6c00ea20, 0x31bc5: 0x6c00ec20, 0x31bc6: 0x6c00ee20, 0x31bc7: 0x6c022820, - 0x31bc8: 0x6c022a20, 0x31bc9: 0x6c022c20, 0x31bca: 0x6c022e20, 0x31bcb: 0x6c023020, - 0x31bcc: 0x6c023220, 0x31bcd: 0x6c055220, 0x31bce: 0x6c055420, 0x31bcf: 0x6c055620, - 0x31bd0: 0x6c055820, 0x31bd1: 0x6c055a20, 0x31bd2: 0x6c055c20, 0x31bd3: 0x6c055e20, - 0x31bd4: 0x6c056020, 0x31bd5: 0x6c056220, 0x31bd6: 0x6c056420, 0x31bd7: 0x6c056620, - 0x31bd8: 0x6c0ada20, 0x31bd9: 0x6c0adc20, 0x31bda: 0x6c0ade20, 0x31bdb: 0x6c0f4220, - 0x31bdc: 0x6c0ae020, 0x31bdd: 0x6c0dac20, 0x31bde: 0x6c0ae220, 0x31bdf: 0x6c0ae420, - 0x31be0: 0x6c0ae620, 0x31be1: 0x6c15ec20, 0x31be2: 0x6c15ee20, 0x31be3: 0x6c15f020, - 0x31be4: 0x6c15f220, 0x31be5: 0x6c162c20, 0x31be6: 0x6c15f420, 0x31be7: 0x6c15f620, - 0x31be8: 0x6c15f820, 0x31be9: 0x6c0b3a20, 0x31bea: 0x6c15fa20, 0x31beb: 0x6c15fc20, - 0x31bec: 0x6c28b220, 0x31bed: 0x6c28b420, 0x31bee: 0x6c28b620, 0x31bef: 0x6c2d9420, - 0x31bf0: 0x6c28b820, 0x31bf1: 0x6c28ba20, 0x31bf2: 0x6c28bc20, 0x31bf3: 0x6c28be20, - 0x31bf4: 0x6c28c020, 0x31bf5: 0x6c42ea20, 0x31bf6: 0x6c42ec20, 0x31bf7: 0x6c470a20, - 0x31bf8: 0x6c42ee20, 0x31bf9: 0x6c470c20, 0x31bfa: 0x6c42f020, 0x31bfb: 0x6c42f220, - 0x31bfc: 0x6c6a8820, 0x31bfd: 0x6c63cc20, 0x31bfe: 0x6c63ce20, 0x31bff: 0x6c63d020, - // Block 0xc70, offset 0x31c00 - 0x31c00: 0x6c63d220, 0x31c01: 0x6c8af020, 0x31c02: 0x6c8af220, 0x31c03: 0x6c8af420, - 0x31c04: 0x6c8af620, 0x31c05: 0x6c8af820, 0x31c06: 0x6cb79e20, 0x31c07: 0x6cb7a020, - 0x31c08: 0x6cb7a220, 0x31c09: 0x6cb93420, 0x31c0a: 0x6cb7a420, 0x31c0b: 0x6cb7a620, - 0x31c0c: 0x6ce8ca20, 0x31c0d: 0x6ce8cc20, 0x31c0e: 0x6d188c20, 0x31c0f: 0x6d188e20, - 0x31c10: 0x6d189020, 0x31c11: 0x6d189220, 0x31c12: 0x6d189420, 0x31c13: 0x6d479020, - 0x31c14: 0x6d479220, 0x31c15: 0x6d75c220, 0x31c16: 0x6d9fa420, 0x31c17: 0x6d75c420, - 0x31c18: 0x6d75c620, 0x31c19: 0x6d75c820, 0x31c1a: 0x6d75ca20, 0x31c1b: 0x6d75cc20, - 0x31c1c: 0x6da01620, 0x31c1d: 0x6d75ce20, 0x31c1e: 0x6da57820, 0x31c1f: 0x6dc24420, - 0x31c20: 0x6df86a20, 0x31c21: 0x6c004620, 0x31c22: 0x6c004820, 0x31c23: 0x6c023e20, - 0x31c24: 0x6c079620, 0x31c25: 0x6c056a20, 0x31c26: 0x6c0aea20, 0x31c27: 0x6c160220, - 0x31c28: 0x6c160420, 0x31c29: 0x6c28c620, 0x31c2a: 0x6c28c820, 0x31c2b: 0x6c28ca20, - 0x31c2c: 0x6c28cc20, 0x31c2d: 0x6c42f820, 0x31c2e: 0x6c42fa20, 0x31c2f: 0x6c42fc20, - 0x31c30: 0x6c63da20, 0x31c31: 0x6c63dc20, 0x31c32: 0x6c15ae20, 0x31c33: 0x6c8afc20, - 0x31c34: 0x6cb7a820, 0x31c35: 0x6cb7aa20, 0x31c36: 0x6d189820, 0x31c37: 0x6d1bb420, - 0x31c38: 0x6d479420, 0x31c39: 0x6dc24620, 0x31c3a: 0x6de00420, 0x31c3b: 0x6e1c0420, - 0x31c3c: 0x6c010220, 0x31c3d: 0x6c010420, 0x31c3e: 0x6c026420, 0x31c3f: 0x6c024620, - // Block 0xc71, offset 0x31c40 - 0x31c40: 0x6c057020, 0x31c41: 0x6c057220, 0x31c42: 0x6c0aec20, 0x31c43: 0x6c63de20, - 0x31c44: 0x6ce8ce20, 0x31c45: 0x6d75d420, 0x31c46: 0x6c005620, 0x31c47: 0x6c005820, - 0x31c48: 0x6c005a20, 0x31c49: 0x6c005c20, 0x31c4a: 0x6c005e20, 0x31c4b: 0x6c011020, - 0x31c4c: 0x6c011220, 0x31c4d: 0x6c011420, 0x31c4e: 0x6c011620, 0x31c4f: 0x6c024e20, - 0x31c50: 0x6c025020, 0x31c51: 0x6c025220, 0x31c52: 0x6c025420, 0x31c53: 0x6c025620, - 0x31c54: 0x6c057c20, 0x31c55: 0x6c057e20, 0x31c56: 0x6c058020, 0x31c57: 0x6c058220, - 0x31c58: 0x6c058420, 0x31c59: 0x6c058620, 0x31c5a: 0x6c058820, 0x31c5b: 0x6c058a20, - 0x31c5c: 0x6c058c20, 0x31c5d: 0x6c058e20, 0x31c5e: 0x6c059020, 0x31c5f: 0x6c059220, - 0x31c60: 0x6c059420, 0x31c61: 0x6c059620, 0x31c62: 0x6c0af820, 0x31c63: 0x6c0afa20, - 0x31c64: 0x6c0afc20, 0x31c65: 0x6c0afe20, 0x31c66: 0x6c0b0020, 0x31c67: 0x6c0b0220, - 0x31c68: 0x6c149620, 0x31c69: 0x6c0b0420, 0x31c6a: 0x6c0b0620, 0x31c6b: 0x6c0b0820, - 0x31c6c: 0x6c0dd620, 0x31c6d: 0x6c0b0a20, 0x31c6e: 0x6c0dd820, 0x31c6f: 0x6c160820, - 0x31c70: 0x6c18ea20, 0x31c71: 0x6c227c20, 0x31c72: 0x6c28d220, 0x31c73: 0x6c28d420, - 0x31c74: 0x6c430420, 0x31c75: 0x6c3bd820, 0x31c76: 0x6c28d620, 0x31c77: 0x6c430620, - 0x31c78: 0x6c431c20, 0x31c79: 0x6c63e220, 0x31c7a: 0x6c63e420, 0x31c7b: 0x6c63e620, - 0x31c7c: 0x6c63e820, 0x31c7d: 0x6c63ea20, 0x31c7e: 0x6c63ec20, 0x31c7f: 0x6c8afe20, - // Block 0xc72, offset 0x31c80 - 0x31c80: 0x6c8b0020, 0x31c81: 0x6c8b0220, 0x31c82: 0x6c8b0420, 0x31c83: 0x6cb7ac20, - 0x31c84: 0x6cb7ae20, 0x31c85: 0x6d189a20, 0x31c86: 0x6ce8d020, 0x31c87: 0x6d479620, - 0x31c88: 0x6e284820, 0x31c89: 0x6c001620, 0x31c8a: 0x6c001820, 0x31c8b: 0x6c001a20, - 0x31c8c: 0x6c001c20, 0x31c8d: 0x6c001e20, 0x31c8e: 0x6c002020, 0x31c8f: 0x6c006620, - 0x31c90: 0x6c006820, 0x31c91: 0x6c002220, 0x31c92: 0x6c012620, 0x31c93: 0x6c012820, - 0x31c94: 0x6c012a20, 0x31c95: 0x6c026620, 0x31c96: 0x6c026820, 0x31c97: 0x6c026a20, - 0x31c98: 0x6c026c20, 0x31c99: 0x6c026e20, 0x31c9a: 0x6c027020, 0x31c9b: 0x6c027220, - 0x31c9c: 0x6c027420, 0x31c9d: 0x6c027620, 0x31c9e: 0x6c05a220, 0x31c9f: 0x6c05a420, - 0x31ca0: 0x6c05a620, 0x31ca1: 0x6c05a820, 0x31ca2: 0x6c05aa20, 0x31ca3: 0x6c05ac20, - 0x31ca4: 0x6c0b2c20, 0x31ca5: 0x6c0b2e20, 0x31ca6: 0x6c0b3020, 0x31ca7: 0x6c0b3220, - 0x31ca8: 0x6c0b3420, 0x31ca9: 0x6c161420, 0x31caa: 0x6c161620, 0x31cab: 0x6c24c020, - 0x31cac: 0x6c161820, 0x31cad: 0x6c28ea20, 0x31cae: 0x6c28ec20, 0x31caf: 0x6c28ee20, - 0x31cb0: 0x6c3bda20, 0x31cb1: 0x6c2fdc20, 0x31cb2: 0x6c431e20, 0x31cb3: 0x6c432020, - 0x31cb4: 0x6c432220, 0x31cb5: 0x6c432420, 0x31cb6: 0x6c432620, 0x31cb7: 0x6c432820, - 0x31cb8: 0x6c63f420, 0x31cb9: 0x6c63f620, 0x31cba: 0x6c63f820, 0x31cbb: 0x6c63fa20, - 0x31cbc: 0x6c8b1220, 0x31cbd: 0x6c8b1420, 0x31cbe: 0x6c8b1620, 0x31cbf: 0x6c8b1820, - // Block 0xc73, offset 0x31cc0 - 0x31cc0: 0x6c8b1a20, 0x31cc1: 0x6c8b1c20, 0x31cc2: 0x6c8b1e20, 0x31cc3: 0x6ce8d820, - 0x31cc4: 0x6ce8da20, 0x31cc5: 0x6d189c20, 0x31cc6: 0x6d189e20, 0x31cc7: 0x6d18a020, - 0x31cc8: 0x6d18a220, 0x31cc9: 0x6d9fa620, 0x31cca: 0x6de00820, 0x31ccb: 0x6df86c20, - 0x31ccc: 0x6c002620, 0x31ccd: 0x6c006c20, 0x31cce: 0x6c006e20, 0x31ccf: 0x6c007020, - 0x31cd0: 0x6c007220, 0x31cd1: 0x6c012e20, 0x31cd2: 0x6c027c20, 0x31cd3: 0x6c027e20, - 0x31cd4: 0x6c028020, 0x31cd5: 0x6c0b3c20, 0x31cd6: 0x6c162220, 0x31cd7: 0x6c162420, - 0x31cd8: 0x6c162620, 0x31cd9: 0x6c28f620, 0x31cda: 0x6c8b2220, 0x31cdb: 0x6cb7ba20, - 0x31cdc: 0x6d479820, 0x31cdd: 0x6d75d820, 0x31cde: 0x6c007620, 0x31cdf: 0x6c007820, - 0x31ce0: 0x6c007a20, 0x31ce1: 0x6c028e20, 0x31ce2: 0x6c0b4420, 0x31ce3: 0x6c0b4620, - 0x31ce4: 0x6c0b4820, 0x31ce5: 0x6c0b4a20, 0x31ce6: 0x6c0b4c20, 0x31ce7: 0x6c0b4e20, - 0x31ce8: 0x6c162e20, 0x31ce9: 0x6c163020, 0x31cea: 0x6c163220, 0x31ceb: 0x6c290220, - 0x31cec: 0x6c290420, 0x31ced: 0x6c290620, 0x31cee: 0x6c290820, 0x31cef: 0x6c290a20, - 0x31cf0: 0x6c432c20, 0x31cf1: 0x6c432e20, 0x31cf2: 0x6c433020, 0x31cf3: 0x6c433220, - 0x31cf4: 0x6c4d0220, 0x31cf5: 0x6c640220, 0x31cf6: 0x6c640420, 0x31cf7: 0x6c640620, - 0x31cf8: 0x6c640820, 0x31cf9: 0x6c8b2420, 0x31cfa: 0x6c8b2620, 0x31cfb: 0x6cb7be20, - 0x31cfc: 0x6ce8de20, 0x31cfd: 0x6ce8e020, 0x31cfe: 0x6ce8e220, 0x31cff: 0x6d18a620, - // Block 0xc74, offset 0x31d00 - 0x31d00: 0x6d479a20, 0x31d01: 0x6c029420, 0x31d02: 0x6c05b220, 0x31d03: 0x6c0b5c20, - 0x31d04: 0x6c0b5e20, 0x31d05: 0x6c0b6020, 0x31d06: 0x6c0b6220, 0x31d07: 0x6c0b6420, - 0x31d08: 0x6c163c20, 0x31d09: 0x6c163e20, 0x31d0a: 0x6c164020, 0x31d0b: 0x6c164220, - 0x31d0c: 0x6c291220, 0x31d0d: 0x6c291420, 0x31d0e: 0x6c291620, 0x31d0f: 0x6c291820, - 0x31d10: 0x6c291a20, 0x31d11: 0x6c291c20, 0x31d12: 0x6c291e20, 0x31d13: 0x6c434020, - 0x31d14: 0x6c434220, 0x31d15: 0x6c434420, 0x31d16: 0x6c640c20, 0x31d17: 0x6c6a8e20, - 0x31d18: 0x6c640e20, 0x31d19: 0x6c641020, 0x31d1a: 0x6c641220, 0x31d1b: 0x6c641420, - 0x31d1c: 0x6c641620, 0x31d1d: 0x6c641820, 0x31d1e: 0x6c8b2820, 0x31d1f: 0x6c8b2a20, - 0x31d20: 0x6c8b2c20, 0x31d21: 0x6c8b2e20, 0x31d22: 0x6c8b3020, 0x31d23: 0x6c8b3220, - 0x31d24: 0x6c8b3420, 0x31d25: 0x6c8b3620, 0x31d26: 0x6c8b3820, 0x31d27: 0x6c8b3a20, - 0x31d28: 0x6cb7c420, 0x31d29: 0x6cb7c620, 0x31d2a: 0x6cb7c820, 0x31d2b: 0x6cb7ca20, - 0x31d2c: 0x6cb7cc20, 0x31d2d: 0x6cb7ce20, 0x31d2e: 0x6cb7d020, 0x31d2f: 0x6cb7d220, - 0x31d30: 0x6cd41020, 0x31d31: 0x6cbd9c20, 0x31d32: 0x6cb7d420, 0x31d33: 0x6ce8ea20, - 0x31d34: 0x6ce8ec20, 0x31d35: 0x6ce8ee20, 0x31d36: 0x6ce8f020, 0x31d37: 0x6ce8f220, - 0x31d38: 0x6ce8f420, 0x31d39: 0x6cf16620, 0x31d3a: 0x6ce8f620, 0x31d3b: 0x6ce8f820, - 0x31d3c: 0x6ce8fa20, 0x31d3d: 0x6cf00420, 0x31d3e: 0x6d18aa20, 0x31d3f: 0x6d18ac20, - // Block 0xc75, offset 0x31d40 - 0x31d40: 0x6ce8fc20, 0x31d41: 0x6d479e20, 0x31d42: 0x6d47a020, 0x31d43: 0x6d47a220, - 0x31d44: 0x6d47a420, 0x31d45: 0x6d47a620, 0x31d46: 0x6d47a820, 0x31d47: 0x6d47aa20, - 0x31d48: 0x6d47ac20, 0x31d49: 0x6d47ae20, 0x31d4a: 0x6d49c820, 0x31d4b: 0x6d75dc20, - 0x31d4c: 0x6d75de20, 0x31d4d: 0x6d75e020, 0x31d4e: 0x6d75e220, 0x31d4f: 0x6d75e420, - 0x31d50: 0x6d75e620, 0x31d51: 0x6d75e820, 0x31d52: 0x6d75ea20, 0x31d53: 0x6d790e20, - 0x31d54: 0x6d75ec20, 0x31d55: 0x6d791020, 0x31d56: 0x6d75ee20, 0x31d57: 0x6d75f020, - 0x31d58: 0x6d75f220, 0x31d59: 0x6da20a20, 0x31d5a: 0x6dc24820, 0x31d5b: 0x6dc70c20, - 0x31d5c: 0x6ddfee20, 0x31d5d: 0x6de00a20, 0x31d5e: 0x6e0c3c20, 0x31d5f: 0x6e318620, - 0x31d60: 0x6e428220, 0x31d61: 0x6e442020, 0x31d62: 0x6c008220, 0x31d63: 0x6c014020, - 0x31d64: 0x6c014220, 0x31d65: 0x6c014420, 0x31d66: 0x6c02be20, 0x31d67: 0x6c02c020, - 0x31d68: 0x6c02c220, 0x31d69: 0x6c05fc20, 0x31d6a: 0x6c05fe20, 0x31d6b: 0x6c060020, - 0x31d6c: 0x6c060220, 0x31d6d: 0x6c060420, 0x31d6e: 0x6c06ac20, 0x31d6f: 0x6c060620, - 0x31d70: 0x6c060820, 0x31d71: 0x6c06d820, 0x31d72: 0x6c08d020, 0x31d73: 0x6c060a20, - 0x31d74: 0x6c0bfa20, 0x31d75: 0x6c0bfc20, 0x31d76: 0x6c0bfe20, 0x31d77: 0x6c0c0020, - 0x31d78: 0x6c0c0220, 0x31d79: 0x6c0c0420, 0x31d7a: 0x6c0c0620, 0x31d7b: 0x6c0c0820, - 0x31d7c: 0x6c0c0a20, 0x31d7d: 0x6c0c0c20, 0x31d7e: 0x6c0c0e20, 0x31d7f: 0x6c0c1020, - // Block 0xc76, offset 0x31d80 - 0x31d80: 0x6c0c1220, 0x31d81: 0x6c0c1420, 0x31d82: 0x6c0c1620, 0x31d83: 0x6c0c1820, - 0x31d84: 0x6c0c1a20, 0x31d85: 0x6c0c1c20, 0x31d86: 0x6c0c1e20, 0x31d87: 0x6c0c2020, - 0x31d88: 0x6c0c2220, 0x31d89: 0x6c0c2420, 0x31d8a: 0x6c0c2620, 0x31d8b: 0x6c0c2820, - 0x31d8c: 0x6c0c2a20, 0x31d8d: 0x6c0c2c20, 0x31d8e: 0x6c0c2e20, 0x31d8f: 0x6c0c3020, - 0x31d90: 0x6c0c3220, 0x31d91: 0x6c0c3420, 0x31d92: 0x6c0c5e20, 0x31d93: 0x6c0c3620, - 0x31d94: 0x6c0c3820, 0x31d95: 0x6c0c3a20, 0x31d96: 0x6c16ca20, 0x31d97: 0x6c16cc20, - 0x31d98: 0x6c16ce20, 0x31d99: 0x6c16d020, 0x31d9a: 0x6c16d220, 0x31d9b: 0x6c16d420, - 0x31d9c: 0x6c16d620, 0x31d9d: 0x6c16d820, 0x31d9e: 0x6c16da20, 0x31d9f: 0x6c16dc20, - 0x31da0: 0x6c16de20, 0x31da1: 0x6c16e020, 0x31da2: 0x6c16e220, 0x31da3: 0x6c16e420, - 0x31da4: 0x6c16e620, 0x31da5: 0x6c16e820, 0x31da6: 0x6c16ea20, 0x31da7: 0x6c16ec20, - 0x31da8: 0x6c16ee20, 0x31da9: 0x6c16f020, 0x31daa: 0x6c16f220, 0x31dab: 0x6c16f420, - 0x31dac: 0x6c16f620, 0x31dad: 0x6c16f820, 0x31dae: 0x6c16fa20, 0x31daf: 0x6c16fc20, - 0x31db0: 0x6c16fe20, 0x31db1: 0x6c170020, 0x31db2: 0x6c170220, 0x31db3: 0x6c170420, - 0x31db4: 0x6c170620, 0x31db5: 0x6c170820, 0x31db6: 0x6c170a20, 0x31db7: 0x6c170c20, - 0x31db8: 0x6c170e20, 0x31db9: 0x6c171020, 0x31dba: 0x6c171220, 0x31dbb: 0x6c171420, - 0x31dbc: 0x6c171620, 0x31dbd: 0x6c171820, 0x31dbe: 0x6c171a20, 0x31dbf: 0x6c171c20, - // Block 0xc77, offset 0x31dc0 - 0x31dc0: 0x6c171e20, 0x31dc1: 0x6c172020, 0x31dc2: 0x6c19c820, 0x31dc3: 0x6c29ca20, - 0x31dc4: 0x6c29cc20, 0x31dc5: 0x6c29ce20, 0x31dc6: 0x6c29d020, 0x31dc7: 0x6c29d220, - 0x31dc8: 0x6c29d420, 0x31dc9: 0x6c29d620, 0x31dca: 0x6c29d820, 0x31dcb: 0x6c29da20, - 0x31dcc: 0x6c29dc20, 0x31dcd: 0x6c29de20, 0x31dce: 0x6c29e020, 0x31dcf: 0x6c29e220, - 0x31dd0: 0x6c29e420, 0x31dd1: 0x6c29e620, 0x31dd2: 0x6c29e820, 0x31dd3: 0x6c29ea20, - 0x31dd4: 0x6c29ec20, 0x31dd5: 0x6c29ee20, 0x31dd6: 0x6c29f020, 0x31dd7: 0x6c29f220, - 0x31dd8: 0x6c29f420, 0x31dd9: 0x6c29f620, 0x31dda: 0x6c29f820, 0x31ddb: 0x6c29fa20, - 0x31ddc: 0x6c29fc20, 0x31ddd: 0x6c29fe20, 0x31dde: 0x6c2a0020, 0x31ddf: 0x6c2a0220, - 0x31de0: 0x6c2a0420, 0x31de1: 0x6c2a0620, 0x31de2: 0x6c2a0820, 0x31de3: 0x6c2a0a20, - 0x31de4: 0x6c305c20, 0x31de5: 0x6c2a0c20, 0x31de6: 0x6c2a0e20, 0x31de7: 0x6c2a1020, - 0x31de8: 0x6c2a1220, 0x31de9: 0x6c2a1420, 0x31dea: 0x6c2a1620, 0x31deb: 0x6c2a1820, - 0x31dec: 0x6c2a1a20, 0x31ded: 0x6c43de20, 0x31dee: 0x6c43e020, 0x31def: 0x6c43e220, - 0x31df0: 0x6c43e420, 0x31df1: 0x6c43e620, 0x31df2: 0x6c43e820, 0x31df3: 0x6c43ea20, - 0x31df4: 0x6c43ec20, 0x31df5: 0x6c43ee20, 0x31df6: 0x6c43f020, 0x31df7: 0x6c43f220, - 0x31df8: 0x6c43f420, 0x31df9: 0x6c43f620, 0x31dfa: 0x6c43f820, 0x31dfb: 0x6c43fa20, - 0x31dfc: 0x6c43fc20, 0x31dfd: 0x6c43fe20, 0x31dfe: 0x6c440020, 0x31dff: 0x6c440220, - // Block 0xc78, offset 0x31e00 - 0x31e00: 0x6c440420, 0x31e01: 0x6c440620, 0x31e02: 0x6c440820, 0x31e03: 0x6c440a20, - 0x31e04: 0x6c440c20, 0x31e05: 0x6c440e20, 0x31e06: 0x6c441020, 0x31e07: 0x6c441220, - 0x31e08: 0x6c441420, 0x31e09: 0x6c441620, 0x31e0a: 0x6c441820, 0x31e0b: 0x6c441a20, - 0x31e0c: 0x6c441c20, 0x31e0d: 0x6c441e20, 0x31e0e: 0x6c442020, 0x31e0f: 0x6c442220, - 0x31e10: 0x6c442420, 0x31e11: 0x6c442620, 0x31e12: 0x6c442820, 0x31e13: 0x6c442a20, - 0x31e14: 0x6c442c20, 0x31e15: 0x6c442e20, 0x31e16: 0x6c443020, 0x31e17: 0x6c443220, - 0x31e18: 0x6c443420, 0x31e19: 0x6c443620, 0x31e1a: 0x6c443820, 0x31e1b: 0x6c443a20, - 0x31e1c: 0x6c443c20, 0x31e1d: 0x6c443e20, 0x31e1e: 0x6c444020, 0x31e1f: 0x6c444220, - 0x31e20: 0x6c444420, 0x31e21: 0x6c444620, 0x31e22: 0x6c444820, 0x31e23: 0x6c64d220, - 0x31e24: 0x6c64d420, 0x31e25: 0x6c64d620, 0x31e26: 0x6c64d820, 0x31e27: 0x6c64da20, - 0x31e28: 0x6c64dc20, 0x31e29: 0x6c64de20, 0x31e2a: 0x6c64e020, 0x31e2b: 0x6c64e220, - 0x31e2c: 0x6c64e420, 0x31e2d: 0x6c64e620, 0x31e2e: 0x6c64e820, 0x31e2f: 0x6c64ea20, - 0x31e30: 0x6c64ec20, 0x31e31: 0x6c64ee20, 0x31e32: 0x6c64f020, 0x31e33: 0x6c64f220, - 0x31e34: 0x6c64f420, 0x31e35: 0x6c64f620, 0x31e36: 0x6c64f820, 0x31e37: 0x6c64fa20, - 0x31e38: 0x6c64fc20, 0x31e39: 0x6c64fe20, 0x31e3a: 0x6c650020, 0x31e3b: 0x6c650220, - 0x31e3c: 0x6c650420, 0x31e3d: 0x6c650620, 0x31e3e: 0x6c650820, 0x31e3f: 0x6c650a20, - // Block 0xc79, offset 0x31e40 - 0x31e40: 0x6c650c20, 0x31e41: 0x6c650e20, 0x31e42: 0x6c651020, 0x31e43: 0x6c651220, - 0x31e44: 0x6c651420, 0x31e45: 0x6c651620, 0x31e46: 0x6c651820, 0x31e47: 0x6c651a20, - 0x31e48: 0x6c651c20, 0x31e49: 0x6c651e20, 0x31e4a: 0x6c652020, 0x31e4b: 0x6c652220, - 0x31e4c: 0x6c652420, 0x31e4d: 0x6c652620, 0x31e4e: 0x6c652820, 0x31e4f: 0x6c652a20, - 0x31e50: 0x6c652c20, 0x31e51: 0x6c652e20, 0x31e52: 0x6c653020, 0x31e53: 0x6c653220, - 0x31e54: 0x6c653420, 0x31e55: 0x6c653620, 0x31e56: 0x6c653820, 0x31e57: 0x6c653a20, - 0x31e58: 0x6c653c20, 0x31e59: 0x6c653e20, 0x31e5a: 0x6c654020, 0x31e5b: 0x6c654220, - 0x31e5c: 0x6c654420, 0x31e5d: 0x6c654620, 0x31e5e: 0x6c654820, 0x31e5f: 0x6c654a20, - 0x31e60: 0x6c654c20, 0x31e61: 0x6c654e20, 0x31e62: 0x6c655020, 0x31e63: 0x6c655220, - 0x31e64: 0x6c655420, 0x31e65: 0x6c655620, 0x31e66: 0x6c655820, 0x31e67: 0x6c8bc620, - 0x31e68: 0x6c8bc820, 0x31e69: 0x6c8bca20, 0x31e6a: 0x6c8bcc20, 0x31e6b: 0x6c8bce20, - 0x31e6c: 0x6c8bd020, 0x31e6d: 0x6c8bd220, 0x31e6e: 0x6c8bd420, 0x31e6f: 0x6c8bd620, - 0x31e70: 0x6c8bd820, 0x31e71: 0x6c8bda20, 0x31e72: 0x6c8bdc20, 0x31e73: 0x6c8bde20, - 0x31e74: 0x6c8be020, 0x31e75: 0x6c8be220, 0x31e76: 0x6c8be420, 0x31e77: 0x6c8be620, - 0x31e78: 0x6c8be820, 0x31e79: 0x6c8bea20, 0x31e7a: 0x6c8bec20, 0x31e7b: 0x6c8bee20, - 0x31e7c: 0x6c8bf020, 0x31e7d: 0x6c8bf220, 0x31e7e: 0x6c8bf420, 0x31e7f: 0x6c8bf620, - // Block 0xc7a, offset 0x31e80 - 0x31e80: 0x6c8bf820, 0x31e81: 0x6c8bfa20, 0x31e82: 0x6c8bfc20, 0x31e83: 0x6c8bfe20, - 0x31e84: 0x6c8c0020, 0x31e85: 0x6c8c0220, 0x31e86: 0x6c8c0420, 0x31e87: 0x6c8c0620, - 0x31e88: 0x6c8c0820, 0x31e89: 0x6c8c0a20, 0x31e8a: 0x6c8c0c20, 0x31e8b: 0x6c8c0e20, - 0x31e8c: 0x6c8c1020, 0x31e8d: 0x6c8c1220, 0x31e8e: 0x6c8c1420, 0x31e8f: 0x6c8c1620, - 0x31e90: 0x6c8c1820, 0x31e91: 0x6c428e20, 0x31e92: 0x6c8c1a20, 0x31e93: 0x6c8c1c20, - 0x31e94: 0x6c8c1e20, 0x31e95: 0x6c8c2020, 0x31e96: 0x6c8c2220, 0x31e97: 0x6c8c2420, - 0x31e98: 0x6c8c2620, 0x31e99: 0x6c8c2820, 0x31e9a: 0x6c8c2a20, 0x31e9b: 0x6c8c2c20, - 0x31e9c: 0x6c8c2e20, 0x31e9d: 0x6c8c3020, 0x31e9e: 0x6c8c3220, 0x31e9f: 0x6c655a20, - 0x31ea0: 0x6c8c3420, 0x31ea1: 0x6c8c3620, 0x31ea2: 0x6c8c3820, 0x31ea3: 0x6c8c3a20, - 0x31ea4: 0x6c8c3c20, 0x31ea5: 0x6c8c3e20, 0x31ea6: 0x6c8c4020, 0x31ea7: 0x6c8c4220, - 0x31ea8: 0x6c8c4420, 0x31ea9: 0x6c8c4620, 0x31eaa: 0x6c8c4820, 0x31eab: 0x6c8c4a20, - 0x31eac: 0x6c8c4c20, 0x31ead: 0x6cb83e20, 0x31eae: 0x6cb84020, 0x31eaf: 0x6cb84220, - 0x31eb0: 0x6cb84420, 0x31eb1: 0x6cb84620, 0x31eb2: 0x6cb84820, 0x31eb3: 0x6cb84a20, - 0x31eb4: 0x6cb84c20, 0x31eb5: 0x6cb84e20, 0x31eb6: 0x6cb85020, 0x31eb7: 0x6cb85220, - 0x31eb8: 0x6cb85420, 0x31eb9: 0x6cb85620, 0x31eba: 0x6cb85820, 0x31ebb: 0x6cb85a20, - 0x31ebc: 0x6cb85c20, 0x31ebd: 0x6cb85e20, 0x31ebe: 0x6cb86020, 0x31ebf: 0x6cb86220, - // Block 0xc7b, offset 0x31ec0 - 0x31ec0: 0x6cb86420, 0x31ec1: 0x6cb86620, 0x31ec2: 0x6cb86820, 0x31ec3: 0x6cb86a20, - 0x31ec4: 0x6cb86c20, 0x31ec5: 0x6cb86e20, 0x31ec6: 0x6cb8d620, 0x31ec7: 0x6cb87020, - 0x31ec8: 0x6cb87220, 0x31ec9: 0x6cb87420, 0x31eca: 0x6cb87620, 0x31ecb: 0x6cb87820, - 0x31ecc: 0x6cb87a20, 0x31ecd: 0x6cb87c20, 0x31ece: 0x6cb87e20, 0x31ecf: 0x6cb88020, - 0x31ed0: 0x6cb88220, 0x31ed1: 0x6cb88420, 0x31ed2: 0x6cb88620, 0x31ed3: 0x6cb88820, - 0x31ed4: 0x6cb88a20, 0x31ed5: 0x6cb88c20, 0x31ed6: 0x6cb88e20, 0x31ed7: 0x6cb89020, - 0x31ed8: 0x6cb89220, 0x31ed9: 0x6cb89420, 0x31eda: 0x6cb89620, 0x31edb: 0x6cb89820, - 0x31edc: 0x6cb89a20, 0x31edd: 0x6cb89c20, 0x31ede: 0x6cbd9420, 0x31edf: 0x6cd2ce20, - 0x31ee0: 0x6cb89e20, 0x31ee1: 0x6cb8a020, 0x31ee2: 0x6cb8a220, 0x31ee3: 0x6cb8a420, - 0x31ee4: 0x6cb8a620, 0x31ee5: 0x6cb8a820, 0x31ee6: 0x6cb8aa20, 0x31ee7: 0x6cb8ac20, - 0x31ee8: 0x6cb8ae20, 0x31ee9: 0x6cb8b020, 0x31eea: 0x6ca52820, 0x31eeb: 0x6ce95420, - 0x31eec: 0x6ce95620, 0x31eed: 0x6ce95820, 0x31eee: 0x6ce95a20, 0x31eef: 0x6ce95c20, - 0x31ef0: 0x6ce95e20, 0x31ef1: 0x6ce96020, 0x31ef2: 0x6ce96220, 0x31ef3: 0x6ce96420, - 0x31ef4: 0x6ce96620, 0x31ef5: 0x6ce96820, 0x31ef6: 0x6ce96a20, 0x31ef7: 0x6ce96c20, - 0x31ef8: 0x6ce96e20, 0x31ef9: 0x6ce97020, 0x31efa: 0x6ce97220, 0x31efb: 0x6ce97420, - 0x31efc: 0x6ce97620, 0x31efd: 0x6ce97820, 0x31efe: 0x6ce97a20, 0x31eff: 0x6ce97c20, - // Block 0xc7c, offset 0x31f00 - 0x31f00: 0x6ce97e20, 0x31f01: 0x6ce98020, 0x31f02: 0x6ce98220, 0x31f03: 0x6ce98420, - 0x31f04: 0x6ce98620, 0x31f05: 0x6ce98820, 0x31f06: 0x6ce98a20, 0x31f07: 0x6ce98c20, - 0x31f08: 0x6ce98e20, 0x31f09: 0x6ce99020, 0x31f0a: 0x6ce99220, 0x31f0b: 0x6ce99420, - 0x31f0c: 0x6ce99620, 0x31f0d: 0x6ce99820, 0x31f0e: 0x6ce99a20, 0x31f0f: 0x6ce99c20, - 0x31f10: 0x6ce99e20, 0x31f11: 0x6ce9a020, 0x31f12: 0x6ce9a220, 0x31f13: 0x6ce9a420, - 0x31f14: 0x6ce9a620, 0x31f15: 0x6ce9a820, 0x31f16: 0x6ce9aa20, 0x31f17: 0x6ce9ac20, - 0x31f18: 0x6ce9ae20, 0x31f19: 0x6ce9b020, 0x31f1a: 0x6ce9b220, 0x31f1b: 0x6ce9b420, - 0x31f1c: 0x6ce9b620, 0x31f1d: 0x6ce9b820, 0x31f1e: 0x6ce9ba20, 0x31f1f: 0x6ce9bc20, - 0x31f20: 0x6ce9be20, 0x31f21: 0x6ce9c020, 0x31f22: 0x6d01fc20, 0x31f23: 0x6ce9c220, - 0x31f24: 0x6ce9c420, 0x31f25: 0x6d191a20, 0x31f26: 0x6ce9c620, 0x31f27: 0x6ce9c820, - 0x31f28: 0x6ce9ca20, 0x31f29: 0x6ce9cc20, 0x31f2a: 0x6ce9ce20, 0x31f2b: 0x6ce9d020, - 0x31f2c: 0x6ce9d220, 0x31f2d: 0x6d191c20, 0x31f2e: 0x6d191e20, 0x31f2f: 0x6d192020, - 0x31f30: 0x6d192220, 0x31f31: 0x6d192420, 0x31f32: 0x6d192620, 0x31f33: 0x6d192820, - 0x31f34: 0x6d192a20, 0x31f35: 0x6d192c20, 0x31f36: 0x6d192e20, 0x31f37: 0x6d193020, - 0x31f38: 0x6d193220, 0x31f39: 0x6d193420, 0x31f3a: 0x6d193620, 0x31f3b: 0x6d193820, - 0x31f3c: 0x6d193a20, 0x31f3d: 0x6d193c20, 0x31f3e: 0x6d193e20, 0x31f3f: 0x6d194020, - // Block 0xc7d, offset 0x31f40 - 0x31f40: 0x6d194220, 0x31f41: 0x6d194420, 0x31f42: 0x6d194620, 0x31f43: 0x6d194820, - 0x31f44: 0x6d194a20, 0x31f45: 0x6d194c20, 0x31f46: 0x6d194e20, 0x31f47: 0x6d195020, - 0x31f48: 0x6d195220, 0x31f49: 0x6d195420, 0x31f4a: 0x6d195620, 0x31f4b: 0x6d195820, - 0x31f4c: 0x6d195a20, 0x31f4d: 0x6d195c20, 0x31f4e: 0x6d195e20, 0x31f4f: 0x6d196020, - 0x31f50: 0x6d196220, 0x31f51: 0x6d196420, 0x31f52: 0x6d196620, 0x31f53: 0x6d196820, - 0x31f54: 0x6d196a20, 0x31f55: 0x6d196c20, 0x31f56: 0x6d196e20, 0x31f57: 0x6d197020, - 0x31f58: 0x6d311420, 0x31f59: 0x6d197220, 0x31f5a: 0x6d197420, 0x31f5b: 0x6d2bee20, - 0x31f5c: 0x6e0bec20, 0x31f5d: 0x6d197620, 0x31f5e: 0x6d197820, 0x31f5f: 0x6d197a20, - 0x31f60: 0x6d197c20, 0x31f61: 0x6d197e20, 0x31f62: 0x6d198020, 0x31f63: 0x6d198220, - 0x31f64: 0x6d198420, 0x31f65: 0x6d198620, 0x31f66: 0x6d198820, 0x31f67: 0x6d198a20, - 0x31f68: 0x6d198c20, 0x31f69: 0x6d198e20, 0x31f6a: 0x6d199020, 0x31f6b: 0x6d199220, - 0x31f6c: 0x6d199420, 0x31f6d: 0x6d199620, 0x31f6e: 0x6d199820, 0x31f6f: 0x6d199a20, - 0x31f70: 0x6d199c20, 0x31f71: 0x6d199e20, 0x31f72: 0x6d19a020, 0x31f73: 0x6d19a220, - 0x31f74: 0x6d19a420, 0x31f75: 0x6ce9d420, 0x31f76: 0x6d234020, 0x31f77: 0x6d47f620, - 0x31f78: 0x6d47f820, 0x31f79: 0x6d47fa20, 0x31f7a: 0x6d47fc20, 0x31f7b: 0x6d47fe20, - 0x31f7c: 0x6d480020, 0x31f7d: 0x6d480220, 0x31f7e: 0x6d480420, 0x31f7f: 0x6d480620, - // Block 0xc7e, offset 0x31f80 - 0x31f80: 0x6d480820, 0x31f81: 0x6d480a20, 0x31f82: 0x6d480c20, 0x31f83: 0x6d480e20, - 0x31f84: 0x6d481020, 0x31f85: 0x6d481220, 0x31f86: 0x6d481420, 0x31f87: 0x6d481620, - 0x31f88: 0x6d481820, 0x31f89: 0x6d481a20, 0x31f8a: 0x6d481c20, 0x31f8b: 0x6d481e20, - 0x31f8c: 0x6d482020, 0x31f8d: 0x6d482220, 0x31f8e: 0x6d482420, 0x31f8f: 0x6d482620, - 0x31f90: 0x6d19a620, 0x31f91: 0x6d482820, 0x31f92: 0x6d761c20, 0x31f93: 0x6d49ca20, - 0x31f94: 0x6d482a20, 0x31f95: 0x6d482c20, 0x31f96: 0x6d482e20, 0x31f97: 0x6d483020, - 0x31f98: 0x6d483220, 0x31f99: 0x6d483420, 0x31f9a: 0x6d483620, 0x31f9b: 0x6d483820, - 0x31f9c: 0x6d483a20, 0x31f9d: 0x6d483c20, 0x31f9e: 0x6d483e20, 0x31f9f: 0x6d484020, - 0x31fa0: 0x6d484220, 0x31fa1: 0x6d484420, 0x31fa2: 0x6d484620, 0x31fa3: 0x6d484820, - 0x31fa4: 0x6d484a20, 0x31fa5: 0x6d484c20, 0x31fa6: 0x6d484e20, 0x31fa7: 0x6d49cc20, - 0x31fa8: 0x6d761e20, 0x31fa9: 0x6d762020, 0x31faa: 0x6d762220, 0x31fab: 0x6d762420, - 0x31fac: 0x6d762620, 0x31fad: 0x6d762820, 0x31fae: 0x6d762a20, 0x31faf: 0x6d762c20, - 0x31fb0: 0x6d762e20, 0x31fb1: 0x6d763020, 0x31fb2: 0x6d763220, 0x31fb3: 0x6d763420, - 0x31fb4: 0x6d763620, 0x31fb5: 0x6d763820, 0x31fb6: 0x6d763a20, 0x31fb7: 0x6d763c20, - 0x31fb8: 0x6d763e20, 0x31fb9: 0x6d764020, 0x31fba: 0x6d764220, 0x31fbb: 0x6d764420, - 0x31fbc: 0x6d764620, 0x31fbd: 0x6d764820, 0x31fbe: 0x6d764a20, 0x31fbf: 0x6d764c20, - // Block 0xc7f, offset 0x31fc0 - 0x31fc0: 0x6d764e20, 0x31fc1: 0x6d765020, 0x31fc2: 0x6d765220, 0x31fc3: 0x6d765420, - 0x31fc4: 0x6d765620, 0x31fc5: 0x6d765820, 0x31fc6: 0x6d765a20, 0x31fc7: 0x6d765c20, - 0x31fc8: 0x6d9fc820, 0x31fc9: 0x6d9fca20, 0x31fca: 0x6d9fcc20, 0x31fcb: 0x6d9fce20, - 0x31fcc: 0x6d9fd020, 0x31fcd: 0x6d9fd220, 0x31fce: 0x6d9fd420, 0x31fcf: 0x6d9fd620, - 0x31fd0: 0x6d9fd820, 0x31fd1: 0x6d9fda20, 0x31fd2: 0x6d9fdc20, 0x31fd3: 0x6d9fde20, - 0x31fd4: 0x6d9fe020, 0x31fd5: 0x6d9fe220, 0x31fd6: 0x6d9fe420, 0x31fd7: 0x6d9fe620, - 0x31fd8: 0x6d9fe820, 0x31fd9: 0x6d9fea20, 0x31fda: 0x6d9fec20, 0x31fdb: 0x6d9fee20, - 0x31fdc: 0x6db61c20, 0x31fdd: 0x6d9ff020, 0x31fde: 0x6d9ff220, 0x31fdf: 0x6d9ff420, - 0x31fe0: 0x6d9ff620, 0x31fe1: 0x6d9ff820, 0x31fe2: 0x6d9ffa20, 0x31fe3: 0x6dc25620, - 0x31fe4: 0x6dc25820, 0x31fe5: 0x6dc25a20, 0x31fe6: 0x6dc25c20, 0x31fe7: 0x6dc25e20, - 0x31fe8: 0x6dc26020, 0x31fe9: 0x6dc26220, 0x31fea: 0x6dc26420, 0x31feb: 0x6dc26620, - 0x31fec: 0x6dc26820, 0x31fed: 0x6dc26a20, 0x31fee: 0x6dc26c20, 0x31fef: 0x6dc26e20, - 0x31ff0: 0x6dc27020, 0x31ff1: 0x6dc27220, 0x31ff2: 0x6dc27420, 0x31ff3: 0x6dc27620, - 0x31ff4: 0x6dc27820, 0x31ff5: 0x6dc27a20, 0x31ff6: 0x6dc27c20, 0x31ff7: 0x6dc27e20, - 0x31ff8: 0x6dc28020, 0x31ff9: 0x6dc28220, 0x31ffa: 0x6dc28420, 0x31ffb: 0x6de01a20, - 0x31ffc: 0x6de01c20, 0x31ffd: 0x6de01e20, 0x31ffe: 0x6de02020, 0x31fff: 0x6de02220, - // Block 0xc80, offset 0x32000 - 0x32000: 0x6de02420, 0x32001: 0x6de02620, 0x32002: 0x6de5da20, 0x32003: 0x6de02820, - 0x32004: 0x6de02a20, 0x32005: 0x6de02c20, 0x32006: 0x6de02e20, 0x32007: 0x6de03020, - 0x32008: 0x6de03220, 0x32009: 0x6de03420, 0x3200a: 0x6de03620, 0x3200b: 0x6de03820, - 0x3200c: 0x6de03a20, 0x3200d: 0x6df87620, 0x3200e: 0x6df87820, 0x3200f: 0x6df87a20, - 0x32010: 0x6df87c20, 0x32011: 0x6df87e20, 0x32012: 0x6df88020, 0x32013: 0x6df88220, - 0x32014: 0x6df88420, 0x32015: 0x6df88620, 0x32016: 0x6df88820, 0x32017: 0x6e0c4a20, - 0x32018: 0x6e0c4c20, 0x32019: 0x6e0c4e20, 0x3201a: 0x6e0c5020, 0x3201b: 0x6e0c5220, - 0x3201c: 0x6e0c5420, 0x3201d: 0x6e0c5620, 0x3201e: 0x6df88a20, 0x3201f: 0x6e0c5820, - 0x32020: 0x6e0c5a20, 0x32021: 0x6e0c5c20, 0x32022: 0x6e0c5e20, 0x32023: 0x6e0c6020, - 0x32024: 0x6e1c0c20, 0x32025: 0x6e1c0e20, 0x32026: 0x6e1c1020, 0x32027: 0x6e1c1220, - 0x32028: 0x6e1c1420, 0x32029: 0x6e1c1620, 0x3202a: 0x6e284e20, 0x3202b: 0x6e285020, - 0x3202c: 0x6e285220, 0x3202d: 0x6e285420, 0x3202e: 0x6e285620, 0x3202f: 0x6e285820, - 0x32030: 0x6e318a20, 0x32031: 0x6e38ae20, 0x32032: 0x6e3ce420, 0x32033: 0x6e3ce620, - 0x32034: 0x6e446c20, 0x32035: 0x6e442220, 0x32036: 0x6c02cc20, 0x32037: 0x6c061020, - 0x32038: 0x6c061220, 0x32039: 0x6c0c5020, 0x3203a: 0x6c0c5220, 0x3203b: 0x6c0c5420, - 0x3203c: 0x6c0c5620, 0x3203d: 0x6c174220, 0x3203e: 0x6c174420, 0x3203f: 0x6c174620, - // Block 0xc81, offset 0x32040 - 0x32040: 0x6c174820, 0x32041: 0x6c174a20, 0x32042: 0x6c174c20, 0x32043: 0x6c2a3820, - 0x32044: 0x6c2a3a20, 0x32045: 0x6c2a3c20, 0x32046: 0x6c2a3e20, 0x32047: 0x6c2a4020, - 0x32048: 0x6c2a4220, 0x32049: 0x6c2a4420, 0x3204a: 0x6c2a4620, 0x3204b: 0x6c2a4820, - 0x3204c: 0x6c446020, 0x3204d: 0x6c446220, 0x3204e: 0x6c446420, 0x3204f: 0x6c446620, - 0x32050: 0x6c657620, 0x32051: 0x6c657820, 0x32052: 0x6c657a20, 0x32053: 0x6c657c20, - 0x32054: 0x6c657e20, 0x32055: 0x6c658020, 0x32056: 0x6c658220, 0x32057: 0x6c8c6e20, - 0x32058: 0x6c8c7020, 0x32059: 0x6c8c7220, 0x3205a: 0x6c8c7420, 0x3205b: 0x6c8c7620, - 0x3205c: 0x6c8c7820, 0x3205d: 0x6c8c7a20, 0x3205e: 0x6cb8ca20, 0x3205f: 0x6cb8cc20, - 0x32060: 0x6cb8ce20, 0x32061: 0x6cb8d020, 0x32062: 0x6cb8d220, 0x32063: 0x6cb8d420, - 0x32064: 0x6ce9e420, 0x32065: 0x6ce9e620, 0x32066: 0x6ce9e820, 0x32067: 0x6d19b820, - 0x32068: 0x6d19ba20, 0x32069: 0x6d19bc20, 0x3206a: 0x6d19be20, 0x3206b: 0x6d19c020, - 0x3206c: 0x6d19c220, 0x3206d: 0x6d19c420, 0x3206e: 0x6d19c620, 0x3206f: 0x6d19c820, - 0x32070: 0x6d485c20, 0x32071: 0x6d485e20, 0x32072: 0x6d486020, 0x32073: 0x6d766820, - 0x32074: 0x6d486220, 0x32075: 0x6d486420, 0x32076: 0x6d486620, 0x32077: 0x6d486820, - 0x32078: 0x6d766a20, 0x32079: 0x6d766c20, 0x3207a: 0x6d766e20, 0x3207b: 0x6d767020, - 0x3207c: 0x6d767220, 0x3207d: 0x6d767420, 0x3207e: 0x6d767620, 0x3207f: 0x6da00420, - // Block 0xc82, offset 0x32080 - 0x32080: 0x6da00620, 0x32081: 0x6da00820, 0x32082: 0x6da00a20, 0x32083: 0x6da00c20, - 0x32084: 0x6da00e20, 0x32085: 0x6da01020, 0x32086: 0x6dc28e20, 0x32087: 0x6da01220, - 0x32088: 0x6dc29020, 0x32089: 0x6dc29220, 0x3208a: 0x6dc29420, 0x3208b: 0x6de04220, - 0x3208c: 0x6de23820, 0x3208d: 0x6df88e20, 0x3208e: 0x6de04420, 0x3208f: 0x6df89020, - 0x32090: 0x6df89220, 0x32091: 0x6e0c6620, 0x32092: 0x6e0c6820, 0x32093: 0x6e1c1820, - 0x32094: 0x6e1c1a20, 0x32095: 0x6e285a20, 0x32096: 0x6e285c20, 0x32097: 0x6e318c20, - 0x32098: 0x6e318e20, 0x32099: 0x6e319020, 0x3209a: 0x6e3ce820, 0x3209b: 0x6c014a20, - 0x3209c: 0x6c02d020, 0x3209d: 0x6c02d220, 0x3209e: 0x6c02d420, 0x3209f: 0x6c061a20, - 0x320a0: 0x6c0c6020, 0x320a1: 0x6c0c6220, 0x320a2: 0x6c0c6420, 0x320a3: 0x6c0c6620, - 0x320a4: 0x6c175220, 0x320a5: 0x6c175420, 0x320a6: 0x6c175620, 0x320a7: 0x6c175820, - 0x320a8: 0x6c175a20, 0x320a9: 0x6c2a4e20, 0x320aa: 0x6c446e20, 0x320ab: 0x6c447020, - 0x320ac: 0x6c447220, 0x320ad: 0x6c658620, 0x320ae: 0x6c658820, 0x320af: 0x6c658a20, - 0x320b0: 0x6c658c20, 0x320b1: 0x6c8c7c20, 0x320b2: 0x6cb8d820, 0x320b3: 0x6cb8da20, - 0x320b4: 0x6ce9ec20, 0x320b5: 0x6ce9ee20, 0x320b6: 0x6ce9f020, 0x320b7: 0x6ce9f220, - 0x320b8: 0x6d19ca20, 0x320b9: 0x6d19cc20, 0x320ba: 0x6d19ce20, 0x320bb: 0x6d19d020, - 0x320bc: 0x6d767820, 0x320bd: 0x6da01420, 0x320be: 0x6dc29620, 0x320bf: 0x6df89420, - // Block 0xc83, offset 0x320c0 - 0x320c0: 0x6c014c20, 0x320c1: 0x6c02de20, 0x320c2: 0x6c02e020, 0x320c3: 0x6c02e220, - 0x320c4: 0x6c02e420, 0x320c5: 0x6c061e20, 0x320c6: 0x6c062020, 0x320c7: 0x6c020820, - 0x320c8: 0x6c0c7220, 0x320c9: 0x6c0c7420, 0x320ca: 0x6c176420, 0x320cb: 0x6c176620, - 0x320cc: 0x6c176820, 0x320cd: 0x6c176a20, 0x320ce: 0x6c176c20, 0x320cf: 0x6c176e20, - 0x320d0: 0x6c2a5620, 0x320d1: 0x6c2a5820, 0x320d2: 0x6c447a20, 0x320d3: 0x6c447c20, - 0x320d4: 0x6c447e20, 0x320d5: 0x6c448020, 0x320d6: 0x6c448220, 0x320d7: 0x6c448420, - 0x320d8: 0x6c4d0420, 0x320d9: 0x6c659420, 0x320da: 0x6c659620, 0x320db: 0x6c659820, - 0x320dc: 0x6c8c8020, 0x320dd: 0x6c8c8220, 0x320de: 0x6cb8dc20, 0x320df: 0x6cb8de20, - 0x320e0: 0x6cb8e020, 0x320e1: 0x6cb8e220, 0x320e2: 0x6cb8e420, 0x320e3: 0x6cb8e620, - 0x320e4: 0x6cb8e820, 0x320e5: 0x6cb8ea20, 0x320e6: 0x6cb8ec20, 0x320e7: 0x6cb8ee20, - 0x320e8: 0x6ce9f820, 0x320e9: 0x6ce9fa20, 0x320ea: 0x6ce9fc20, 0x320eb: 0x6ce9fe20, - 0x320ec: 0x6cea0020, 0x320ed: 0x6cea0220, 0x320ee: 0x6cea0420, 0x320ef: 0x6d19d220, - 0x320f0: 0x6d19d420, 0x320f1: 0x6d19d620, 0x320f2: 0x6d1b1620, 0x320f3: 0x6d767c20, - 0x320f4: 0x6d767e20, 0x320f5: 0x6d768020, 0x320f6: 0x6dc29a20, 0x320f7: 0x6dc29c20, - 0x320f8: 0x6de04820, 0x320f9: 0x6de04a20, 0x320fa: 0x6de04c20, 0x320fb: 0x6e474020, - 0x320fc: 0x6c014e20, 0x320fd: 0x6c02f220, 0x320fe: 0x6c02f420, 0x320ff: 0x6c02f620, - // Block 0xc84, offset 0x32100 - 0x32100: 0x6c02f820, 0x32101: 0x6c062a20, 0x32102: 0x6c062c20, 0x32103: 0x6c062e20, - 0x32104: 0x6c063020, 0x32105: 0x6c063220, 0x32106: 0x6c063420, 0x32107: 0x6c063620, - 0x32108: 0x6c063820, 0x32109: 0x6c063a20, 0x3210a: 0x6c063c20, 0x3210b: 0x6c0c7c20, - 0x3210c: 0x6c0c7e20, 0x3210d: 0x6c0c8020, 0x3210e: 0x6c0c8220, 0x3210f: 0x6c0c8420, - 0x32110: 0x6c177220, 0x32111: 0x6c177420, 0x32112: 0x6c177620, 0x32113: 0x6c177820, - 0x32114: 0x6c177a20, 0x32115: 0x6c177c20, 0x32116: 0x6c2a6020, 0x32117: 0x6c2a6220, - 0x32118: 0x6c2a6420, 0x32119: 0x6c2a6620, 0x3211a: 0x6c2a6820, 0x3211b: 0x6c448a20, - 0x3211c: 0x6c448c20, 0x3211d: 0x6c659e20, 0x3211e: 0x6c65a020, 0x3211f: 0x6c65a220, - 0x32120: 0x6c8c8a20, 0x32121: 0x6c8c8c20, 0x32122: 0x6c8c8e20, 0x32123: 0x6cb8f620, - 0x32124: 0x6cb8f820, 0x32125: 0x6cb8fa20, 0x32126: 0x6cea0a20, 0x32127: 0x6cea0c20, - 0x32128: 0x6d19dc20, 0x32129: 0x6d19de20, 0x3212a: 0x6d487220, 0x3212b: 0x6d227a20, - 0x3212c: 0x6d487420, 0x3212d: 0x6d768420, 0x3212e: 0x6d768620, 0x3212f: 0x6dc29e20, - 0x32130: 0x6dc2a020, 0x32131: 0x6df89820, 0x32132: 0x6e1c1e20, 0x32133: 0x6c030220, - 0x32134: 0x6c030420, 0x32135: 0x6c064220, 0x32136: 0x6c064420, 0x32137: 0x6c064620, - 0x32138: 0x6c064820, 0x32139: 0x6c0c8a20, 0x3213a: 0x6c0c8c20, 0x3213b: 0x6c0c8e20, - 0x3213c: 0x6c0c9020, 0x3213d: 0x6c0c9220, 0x3213e: 0x6c0c9420, 0x3213f: 0x6c0c9620, - // Block 0xc85, offset 0x32140 - 0x32140: 0x6c178220, 0x32141: 0x6c178420, 0x32142: 0x6c178620, 0x32143: 0x6c178820, - 0x32144: 0x6c2a6c20, 0x32145: 0x6c2a6e20, 0x32146: 0x6c2a7020, 0x32147: 0x6c449620, - 0x32148: 0x6c449820, 0x32149: 0x6c449a20, 0x3214a: 0x6c449c20, 0x3214b: 0x6c449e20, - 0x3214c: 0x6c65b220, 0x3214d: 0x6c65b420, 0x3214e: 0x6c65b620, 0x3214f: 0x6c65b820, - 0x32150: 0x6c65ba20, 0x32151: 0x6c65bc20, 0x32152: 0x6c65be20, 0x32153: 0x6c8c9220, - 0x32154: 0x6cb8fe20, 0x32155: 0x6cb90020, 0x32156: 0x6cb90220, 0x32157: 0x6cb90420, - 0x32158: 0x6cb90620, 0x32159: 0x6cb90820, 0x3215a: 0x6cea0e20, 0x3215b: 0x6cea1020, - 0x3215c: 0x6d19e220, 0x3215d: 0x6d19e420, 0x3215e: 0x6d19e620, 0x3215f: 0x6d30e420, - 0x32160: 0x6d768a20, 0x32161: 0x6d768c20, 0x32162: 0x6da01820, 0x32163: 0x6dc2a220, - 0x32164: 0x6dc2a420, 0x32165: 0x6dc2a620, 0x32166: 0x6df89a20, 0x32167: 0x6df89c20, - 0x32168: 0x6df89e20, 0x32169: 0x6e0c6a20, 0x3216a: 0x6e1c2020, 0x3216b: 0x6e285e20, - 0x3216c: 0x6c015020, 0x3216d: 0x6c030820, 0x3216e: 0x6c065220, 0x3216f: 0x6c065420, - 0x32170: 0x6c065620, 0x32171: 0x6c0ca620, 0x32172: 0x6c0ca820, 0x32173: 0x6c0caa20, - 0x32174: 0x6c0cac20, 0x32175: 0x6c0cae20, 0x32176: 0x6c0cb020, 0x32177: 0x6c179e20, - 0x32178: 0x6c17a020, 0x32179: 0x6c17a220, 0x3217a: 0x6c17a420, 0x3217b: 0x6c17a620, - 0x3217c: 0x6c17a820, 0x3217d: 0x6c17aa20, 0x3217e: 0x6c17ac20, 0x3217f: 0x6c17ae20, - // Block 0xc86, offset 0x32180 - 0x32180: 0x6c2a8820, 0x32181: 0x6c17b020, 0x32182: 0x6c2a8a20, 0x32183: 0x6c2a8c20, - 0x32184: 0x6c2a8e20, 0x32185: 0x6c2a9020, 0x32186: 0x6c2a9220, 0x32187: 0x6c2a9420, - 0x32188: 0x6c44aa20, 0x32189: 0x6c44ac20, 0x3218a: 0x6c44ae20, 0x3218b: 0x6c44b020, - 0x3218c: 0x6c44b220, 0x3218d: 0x6c44b420, 0x3218e: 0x6c44b620, 0x3218f: 0x6c44b820, - 0x32190: 0x6c44ba20, 0x32191: 0x6c44bc20, 0x32192: 0x6c44be20, 0x32193: 0x6c44c020, - 0x32194: 0x6c44c220, 0x32195: 0x6c44c420, 0x32196: 0x6c44c620, 0x32197: 0x6c44c820, - 0x32198: 0x6c65de20, 0x32199: 0x6c65e020, 0x3219a: 0x6c65e220, 0x3219b: 0x6c65e420, - 0x3219c: 0x6c65e620, 0x3219d: 0x6c65e820, 0x3219e: 0x6c65ea20, 0x3219f: 0x6c65ec20, - 0x321a0: 0x6c65ee20, 0x321a1: 0x6c65f020, 0x321a2: 0x6c65f220, 0x321a3: 0x6c65f420, - 0x321a4: 0x6c65f620, 0x321a5: 0x6c8c9e20, 0x321a6: 0x6c8ca020, 0x321a7: 0x6c8ca220, - 0x321a8: 0x6c8ca420, 0x321a9: 0x6c8ca620, 0x321aa: 0x6c8ca820, 0x321ab: 0x6c8caa20, - 0x321ac: 0x6c8cac20, 0x321ad: 0x6c8cae20, 0x321ae: 0x6c8cb020, 0x321af: 0x6c8cb220, - 0x321b0: 0x6c8cb420, 0x321b1: 0x6cb91a20, 0x321b2: 0x6cb91c20, 0x321b3: 0x6cb91e20, - 0x321b4: 0x6cb92020, 0x321b5: 0x6cb92220, 0x321b6: 0x6cb92420, 0x321b7: 0x6cb92620, - 0x321b8: 0x6cb92820, 0x321b9: 0x6cb92a20, 0x321ba: 0x6cea1620, 0x321bb: 0x6cea1820, - 0x321bc: 0x6cea1a20, 0x321bd: 0x6cea1c20, 0x321be: 0x6cea1e20, 0x321bf: 0x6cea2020, - // Block 0xc87, offset 0x321c0 - 0x321c0: 0x6cea2220, 0x321c1: 0x6cea2420, 0x321c2: 0x6cea2620, 0x321c3: 0x6cea2820, - 0x321c4: 0x6d19ee20, 0x321c5: 0x6d19f020, 0x321c6: 0x6d19f220, 0x321c7: 0x6d19f420, - 0x321c8: 0x6d19f620, 0x321c9: 0x6d19f820, 0x321ca: 0x6d488020, 0x321cb: 0x6d488220, - 0x321cc: 0x6d488420, 0x321cd: 0x6d488620, 0x321ce: 0x6d488820, 0x321cf: 0x6d488a20, - 0x321d0: 0x6d488c20, 0x321d1: 0x6d488e20, 0x321d2: 0x6d769220, 0x321d3: 0x6d19fa20, - 0x321d4: 0x6d769420, 0x321d5: 0x6d769620, 0x321d6: 0x6da01c20, 0x321d7: 0x6da01e20, - 0x321d8: 0x6da02020, 0x321d9: 0x6da02220, 0x321da: 0x6da02420, 0x321db: 0x6da02620, - 0x321dc: 0x6da02820, 0x321dd: 0x6dc2a820, 0x321de: 0x6dc2aa20, 0x321df: 0x6dc2ac20, - 0x321e0: 0x6dc2ae20, 0x321e1: 0x6dc2b020, 0x321e2: 0x6de04e20, 0x321e3: 0x6de05020, - 0x321e4: 0x6e0c6c20, 0x321e5: 0x6e1c2220, 0x321e6: 0x6e3cea20, 0x321e7: 0x6c009620, - 0x321e8: 0x6c009820, 0x321e9: 0x6c030c20, 0x321ea: 0x6c030e20, 0x321eb: 0x6c031020, - 0x321ec: 0x6c031220, 0x321ed: 0x6c031420, 0x321ee: 0x6c031620, 0x321ef: 0x6c031820, - 0x321f0: 0x6c031a20, 0x321f1: 0x6c066020, 0x321f2: 0x6c066220, 0x321f3: 0x6c066420, - 0x321f4: 0x6c066620, 0x321f5: 0x6c0cc220, 0x321f6: 0x6c0cc420, 0x321f7: 0x6c0cc620, - 0x321f8: 0x6c0cc820, 0x321f9: 0x6c0cca20, 0x321fa: 0x6c0ccc20, 0x321fb: 0x6c0cce20, - 0x321fc: 0x6c17ba20, 0x321fd: 0x6c17bc20, 0x321fe: 0x6c17be20, 0x321ff: 0x6c17c020, - // Block 0xc88, offset 0x32200 - 0x32200: 0x6c17c220, 0x32201: 0x6c17c420, 0x32202: 0x6c17c620, 0x32203: 0x6c17c820, - 0x32204: 0x6c17ca20, 0x32205: 0x6c17cc20, 0x32206: 0x6c2a9e20, 0x32207: 0x6c2aa020, - 0x32208: 0x6c2aa220, 0x32209: 0x6c2aa420, 0x3220a: 0x6c2aa620, 0x3220b: 0x6c2aa820, - 0x3220c: 0x6c2aaa20, 0x3220d: 0x6c2aac20, 0x3220e: 0x6c2aae20, 0x3220f: 0x6c44d220, - 0x32210: 0x6c44d420, 0x32211: 0x6c44d620, 0x32212: 0x6c660020, 0x32213: 0x6c660220, - 0x32214: 0x6c660420, 0x32215: 0x6c660620, 0x32216: 0x6c660820, 0x32217: 0x6c6de220, - 0x32218: 0x6c8cc220, 0x32219: 0x6c8cc420, 0x3221a: 0x6c916e20, 0x3221b: 0x6c8cc620, - 0x3221c: 0x6c8cc820, 0x3221d: 0x6c8cca20, 0x3221e: 0x6c8ccc20, 0x3221f: 0x6cb93620, - 0x32220: 0x6cb93820, 0x32221: 0x6cb93a20, 0x32222: 0x6cb93c20, 0x32223: 0x6cb93e20, - 0x32224: 0x6cea2e20, 0x32225: 0x6cea3020, 0x32226: 0x6cea3220, 0x32227: 0x6cea3420, - 0x32228: 0x6d1a0220, 0x32229: 0x6d1a0420, 0x3222a: 0x6d1a0620, 0x3222b: 0x6d489220, - 0x3222c: 0x6d717420, 0x3222d: 0x6d769a20, 0x3222e: 0x6d769c20, 0x3222f: 0x6d769e20, - 0x32230: 0x6d76a020, 0x32231: 0x6da02c20, 0x32232: 0x6df8a220, 0x32233: 0x6e0c6e20, - 0x32234: 0x6c009c20, 0x32235: 0x6c015820, 0x32236: 0x6c031e20, 0x32237: 0x6c032020, - 0x32238: 0x6c032220, 0x32239: 0x6c067220, 0x3223a: 0x6c067420, 0x3223b: 0x6c067620, - 0x3223c: 0x6c076c20, 0x3223d: 0x6c067820, 0x3223e: 0x6c0cd620, 0x3223f: 0x6c0cd820, - // Block 0xc89, offset 0x32240 - 0x32240: 0x6c0cda20, 0x32241: 0x6c0cdc20, 0x32242: 0x6c0cde20, 0x32243: 0x6c0ce020, - 0x32244: 0x6c0ce220, 0x32245: 0x6c0ce420, 0x32246: 0x6c17d020, 0x32247: 0x6c17d220, - 0x32248: 0x6c17d420, 0x32249: 0x6c17d620, 0x3224a: 0x6c17d820, 0x3224b: 0x6c2ab420, - 0x3224c: 0x6c2ab620, 0x3224d: 0x6c2ab820, 0x3224e: 0x6c44da20, 0x3224f: 0x6c44dc20, - 0x32250: 0x6c44de20, 0x32251: 0x6c633020, 0x32252: 0x6c660c20, 0x32253: 0x6c660e20, - 0x32254: 0x6c8cd020, 0x32255: 0x6c8cd220, 0x32256: 0x6c8cd420, 0x32257: 0x6c8cd620, - 0x32258: 0x6cb94220, 0x32259: 0x6d1a0820, 0x3225a: 0x6d1a0a20, 0x3225b: 0x6d4b1220, - 0x3225c: 0x6d489420, 0x3225d: 0x6d76a220, 0x3225e: 0x6da02e20, 0x3225f: 0x6de05220, - 0x32260: 0x6df8a420, 0x32261: 0x6e0c7020, 0x32262: 0x6e319220, 0x32263: 0x6c00a620, - 0x32264: 0x6c015e20, 0x32265: 0x6c032c20, 0x32266: 0x6c032e20, 0x32267: 0x6c033020, - 0x32268: 0x6c033220, 0x32269: 0x6c033420, 0x3226a: 0x6c033620, 0x3226b: 0x6c033820, - 0x3226c: 0x6c033a20, 0x3226d: 0x6c068c20, 0x3226e: 0x6c068e20, 0x3226f: 0x6c069020, - 0x32270: 0x6c069220, 0x32271: 0x6c069420, 0x32272: 0x6c069620, 0x32273: 0x6c069820, - 0x32274: 0x6c069a20, 0x32275: 0x6c0d0620, 0x32276: 0x6c069c20, 0x32277: 0x6c0d0820, - 0x32278: 0x6c0d0a20, 0x32279: 0x6c0d0c20, 0x3227a: 0x6c0d0e20, 0x3227b: 0x6c069e20, - 0x3227c: 0x6c0d1020, 0x3227d: 0x6c0d1220, 0x3227e: 0x6c0d1420, 0x3227f: 0x6c0d1620, - // Block 0xc8a, offset 0x32280 - 0x32280: 0x6c0d1820, 0x32281: 0x6c0d1a20, 0x32282: 0x6c0d1c20, 0x32283: 0x6c0d1e20, - 0x32284: 0x6c0d2020, 0x32285: 0x6c0d2220, 0x32286: 0x6c0d2420, 0x32287: 0x6c0d2620, - 0x32288: 0x6c0d2820, 0x32289: 0x6c0d2a20, 0x3228a: 0x6c0d2c20, 0x3228b: 0x6c0d2e20, - 0x3228c: 0x6c0d3020, 0x3228d: 0x6c0d3220, 0x3228e: 0x6c180220, 0x3228f: 0x6c180420, - 0x32290: 0x6c180620, 0x32291: 0x6c180820, 0x32292: 0x6c180a20, 0x32293: 0x6c180c20, - 0x32294: 0x6c180e20, 0x32295: 0x6c181020, 0x32296: 0x6c181220, 0x32297: 0x6c181420, - 0x32298: 0x6c181620, 0x32299: 0x6c181820, 0x3229a: 0x6c181a20, 0x3229b: 0x6c181c20, - 0x3229c: 0x6c181e20, 0x3229d: 0x6c182020, 0x3229e: 0x6c182220, 0x3229f: 0x6c182420, - 0x322a0: 0x6c182620, 0x322a1: 0x6c182820, 0x322a2: 0x6c182a20, 0x322a3: 0x6c182c20, - 0x322a4: 0x6c182e20, 0x322a5: 0x6c183020, 0x322a6: 0x6c183220, 0x322a7: 0x6c2af220, - 0x322a8: 0x6c2af420, 0x322a9: 0x6c2af620, 0x322aa: 0x6c2af820, 0x322ab: 0x6c2afa20, - 0x322ac: 0x6c2afc20, 0x322ad: 0x6c2afe20, 0x322ae: 0x6c2b0020, 0x322af: 0x6c2b0220, - 0x322b0: 0x6c2b0420, 0x322b1: 0x6c2b0620, 0x322b2: 0x6c2b0820, 0x322b3: 0x6c2b0a20, - 0x322b4: 0x6c2b0c20, 0x322b5: 0x6c2b0e20, 0x322b6: 0x6c2b1020, 0x322b7: 0x6c2b1220, - 0x322b8: 0x6c2b1420, 0x322b9: 0x6c2b1620, 0x322ba: 0x6c2b1820, 0x322bb: 0x6c2b1a20, - 0x322bc: 0x6c2b1c20, 0x322bd: 0x6c2b1e20, 0x322be: 0x6c2b2020, 0x322bf: 0x6c2b2220, - // Block 0xc8b, offset 0x322c0 - 0x322c0: 0x6c2b2420, 0x322c1: 0x6c2b2620, 0x322c2: 0x6c2b2820, 0x322c3: 0x6c2b2a20, - 0x322c4: 0x6c2b2c20, 0x322c5: 0x6c2b2e20, 0x322c6: 0x6c2b3020, 0x322c7: 0x6c2b3220, - 0x322c8: 0x6c2b3420, 0x322c9: 0x6c2b3620, 0x322ca: 0x6c2b3820, 0x322cb: 0x6c2b3a20, - 0x322cc: 0x6c2b3c20, 0x322cd: 0x6c2b3e20, 0x322ce: 0x6c2b4020, 0x322cf: 0x6c2b4220, - 0x322d0: 0x6c450620, 0x322d1: 0x6c450820, 0x322d2: 0x6c450a20, 0x322d3: 0x6c450c20, - 0x322d4: 0x6c450e20, 0x322d5: 0x6c451020, 0x322d6: 0x6c451220, 0x322d7: 0x6c451420, - 0x322d8: 0x6c451620, 0x322d9: 0x6c451820, 0x322da: 0x6c451a20, 0x322db: 0x6c451c20, - 0x322dc: 0x6c451e20, 0x322dd: 0x6c452020, 0x322de: 0x6c452220, 0x322df: 0x6c452420, - 0x322e0: 0x6c452620, 0x322e1: 0x6c452820, 0x322e2: 0x6c452a20, 0x322e3: 0x6c452c20, - 0x322e4: 0x6c452e20, 0x322e5: 0x6c453020, 0x322e6: 0x6c453220, 0x322e7: 0x6c453420, - 0x322e8: 0x6c453620, 0x322e9: 0x6c453820, 0x322ea: 0x6c453a20, 0x322eb: 0x6c453c20, - 0x322ec: 0x6c453e20, 0x322ed: 0x6c454020, 0x322ee: 0x6c454220, 0x322ef: 0x6c454420, - 0x322f0: 0x6c454620, 0x322f1: 0x6c664820, 0x322f2: 0x6c664a20, 0x322f3: 0x6c664c20, - 0x322f4: 0x6c664e20, 0x322f5: 0x6c665020, 0x322f6: 0x6c665220, 0x322f7: 0x6c665420, - 0x322f8: 0x6c665620, 0x322f9: 0x6c665820, 0x322fa: 0x6c665a20, 0x322fb: 0x6c665c20, - 0x322fc: 0x6c665e20, 0x322fd: 0x6c666020, 0x322fe: 0x6c666220, 0x322ff: 0x6c666420, - // Block 0xc8c, offset 0x32300 - 0x32300: 0x6c666620, 0x32301: 0x6c666820, 0x32302: 0x6c666a20, 0x32303: 0x6c666c20, - 0x32304: 0x6c666e20, 0x32305: 0x6c667020, 0x32306: 0x6c667220, 0x32307: 0x6c667420, - 0x32308: 0x6c667620, 0x32309: 0x6c667820, 0x3230a: 0x6c667a20, 0x3230b: 0x6c667c20, - 0x3230c: 0x6c667e20, 0x3230d: 0x6c668020, 0x3230e: 0x6c668220, 0x3230f: 0x6c668420, - 0x32310: 0x6c668620, 0x32311: 0x6c668820, 0x32312: 0x6c668a20, 0x32313: 0x6c668c20, - 0x32314: 0x6c668e20, 0x32315: 0x6c669020, 0x32316: 0x6c669220, 0x32317: 0x6c669420, - 0x32318: 0x6c669620, 0x32319: 0x6c669820, 0x3231a: 0x6c669a20, 0x3231b: 0x6c669c20, - 0x3231c: 0x6c669e20, 0x3231d: 0x6c8cf820, 0x3231e: 0x6c8cfa20, 0x3231f: 0x6c8cfc20, - 0x32320: 0x6c8cfe20, 0x32321: 0x6c8d0020, 0x32322: 0x6c8d0220, 0x32323: 0x6c8d0420, - 0x32324: 0x6c8d0620, 0x32325: 0x6c8d0820, 0x32326: 0x6c8d0a20, 0x32327: 0x6c8d0c20, - 0x32328: 0x6c8d0e20, 0x32329: 0x6c8d1020, 0x3232a: 0x6c8d1220, 0x3232b: 0x6c8d1420, - 0x3232c: 0x6c8d1620, 0x3232d: 0x6c8d1820, 0x3232e: 0x6c8d1a20, 0x3232f: 0x6c8d1c20, - 0x32330: 0x6c8d1e20, 0x32331: 0x6c8d2020, 0x32332: 0x6c8d2220, 0x32333: 0x6c8d2420, - 0x32334: 0x6c8d2620, 0x32335: 0x6c8d2820, 0x32336: 0x6c66a020, 0x32337: 0x6c8d2a20, - 0x32338: 0x6c8d2c20, 0x32339: 0x6c8d2e20, 0x3233a: 0x6c8d3020, 0x3233b: 0x6c8d3220, - 0x3233c: 0x6c8d3420, 0x3233d: 0x6c8d3620, 0x3233e: 0x6c8d3820, 0x3233f: 0x6cb95a20, - // Block 0xc8d, offset 0x32340 - 0x32340: 0x6cb95c20, 0x32341: 0x6cb95e20, 0x32342: 0x6cb96020, 0x32343: 0x6cb96220, - 0x32344: 0x6cb96420, 0x32345: 0x6cb96620, 0x32346: 0x6cb96820, 0x32347: 0x6cb96a20, - 0x32348: 0x6cb96c20, 0x32349: 0x6cb96e20, 0x3234a: 0x6cb97020, 0x3234b: 0x6cb97220, - 0x3234c: 0x6cb97420, 0x3234d: 0x6cb97620, 0x3234e: 0x6cb97820, 0x3234f: 0x6cb97a20, - 0x32350: 0x6cb97c20, 0x32351: 0x6cb97e20, 0x32352: 0x6cb98020, 0x32353: 0x6cb98220, - 0x32354: 0x6cb98420, 0x32355: 0x6cb98620, 0x32356: 0x6cb98820, 0x32357: 0x6cb98a20, - 0x32358: 0x6cb98c20, 0x32359: 0x6cb98e20, 0x3235a: 0x6cb99020, 0x3235b: 0x6cb99220, - 0x3235c: 0x6cd55e20, 0x3235d: 0x6cb99420, 0x3235e: 0x6cb99620, 0x3235f: 0x6cb99820, - 0x32360: 0x6cb99a20, 0x32361: 0x6cb99c20, 0x32362: 0x6cb99e20, 0x32363: 0x6cb9a020, - 0x32364: 0x6cb9a220, 0x32365: 0x6cea5220, 0x32366: 0x6cea5420, 0x32367: 0x6cea5620, - 0x32368: 0x6cea5820, 0x32369: 0x6cea5a20, 0x3236a: 0x6cea5c20, 0x3236b: 0x6cea5e20, - 0x3236c: 0x6cea6020, 0x3236d: 0x6cea6220, 0x3236e: 0x6cea6420, 0x3236f: 0x6cea6620, - 0x32370: 0x6cea6820, 0x32371: 0x6cea6a20, 0x32372: 0x6cea6c20, 0x32373: 0x6cea6e20, - 0x32374: 0x6cea7020, 0x32375: 0x6cea7220, 0x32376: 0x6cea7420, 0x32377: 0x6cea7620, - 0x32378: 0x6cea7820, 0x32379: 0x6cea7a20, 0x3237a: 0x6cea7c20, 0x3237b: 0x6cea7e20, - 0x3237c: 0x6cea8020, 0x3237d: 0x6cea8220, 0x3237e: 0x6cea8420, 0x3237f: 0x6cea8620, - // Block 0xc8e, offset 0x32380 - 0x32380: 0x6cea8820, 0x32381: 0x6cea8a20, 0x32382: 0x6d1a3020, 0x32383: 0x6d1a3220, - 0x32384: 0x6d1a3420, 0x32385: 0x6d1a3620, 0x32386: 0x6d1a3820, 0x32387: 0x6d1a3a20, - 0x32388: 0x6d1a3c20, 0x32389: 0x6d1a3e20, 0x3238a: 0x6d1a4020, 0x3238b: 0x6d1a4220, - 0x3238c: 0x6d1a4420, 0x3238d: 0x6d1a4620, 0x3238e: 0x6d1a4820, 0x3238f: 0x6d1a4a20, - 0x32390: 0x6d1a4c20, 0x32391: 0x6d1a4e20, 0x32392: 0x6d1a5020, 0x32393: 0x6d1a5220, - 0x32394: 0x6d1a5420, 0x32395: 0x6d1a5620, 0x32396: 0x6d1a5820, 0x32397: 0x6d1a5a20, - 0x32398: 0x6d1a5c20, 0x32399: 0x6d1a5e20, 0x3239a: 0x6d1a6020, 0x3239b: 0x6d1a6220, - 0x3239c: 0x6d1a6420, 0x3239d: 0x6d1a6620, 0x3239e: 0x6d1a6820, 0x3239f: 0x6d1a6a20, - 0x323a0: 0x6d48ae20, 0x323a1: 0x6d1a6c20, 0x323a2: 0x6d1a6e20, 0x323a3: 0x6d1a7020, - 0x323a4: 0x6d1a7220, 0x323a5: 0x6d1a7420, 0x323a6: 0x6d48b020, 0x323a7: 0x6d48b220, - 0x323a8: 0x6d48b420, 0x323a9: 0x6d48b620, 0x323aa: 0x6d48b820, 0x323ab: 0x6d48ba20, - 0x323ac: 0x6d48bc20, 0x323ad: 0x6d48be20, 0x323ae: 0x6d48c020, 0x323af: 0x6d48c220, - 0x323b0: 0x6d48c420, 0x323b1: 0x6d48c620, 0x323b2: 0x6d48c820, 0x323b3: 0x6d48ca20, - 0x323b4: 0x6d48cc20, 0x323b5: 0x6d48ce20, 0x323b6: 0x6d48d020, 0x323b7: 0x6d48d220, - 0x323b8: 0x6d48d420, 0x323b9: 0x6d48d620, 0x323ba: 0x6d76b420, 0x323bb: 0x6d76b620, - 0x323bc: 0x6d76b820, 0x323bd: 0x6d76ba20, 0x323be: 0x6d76bc20, 0x323bf: 0x6d76be20, - // Block 0xc8f, offset 0x323c0 - 0x323c0: 0x6d76c020, 0x323c1: 0x6d76c220, 0x323c2: 0x6d76c420, 0x323c3: 0x6d76c620, - 0x323c4: 0x6d76c820, 0x323c5: 0x6d76ca20, 0x323c6: 0x6d76cc20, 0x323c7: 0x6d76ce20, - 0x323c8: 0x6d76d020, 0x323c9: 0x6d76d220, 0x323ca: 0x6d76d420, 0x323cb: 0x6d938220, - 0x323cc: 0x6da03620, 0x323cd: 0x6da03820, 0x323ce: 0x6da03a20, 0x323cf: 0x6da03c20, - 0x323d0: 0x6da03e20, 0x323d1: 0x6da04020, 0x323d2: 0x6da04220, 0x323d3: 0x6da04420, - 0x323d4: 0x6da04620, 0x323d5: 0x6da04820, 0x323d6: 0x6da04a20, 0x323d7: 0x6da04c20, - 0x323d8: 0x6da04e20, 0x323d9: 0x6da05020, 0x323da: 0x6da05220, 0x323db: 0x6dc2b820, - 0x323dc: 0x6dc2ba20, 0x323dd: 0x6dc2bc20, 0x323de: 0x6dc2be20, 0x323df: 0x6dc2c020, - 0x323e0: 0x6dc2c220, 0x323e1: 0x6de05a20, 0x323e2: 0x6de05c20, 0x323e3: 0x6de05e20, - 0x323e4: 0x6df8a820, 0x323e5: 0x6e0c7620, 0x323e6: 0x6df8aa20, 0x323e7: 0x6df8ac20, - 0x323e8: 0x6df8ae20, 0x323e9: 0x6df8b020, 0x323ea: 0x6e0c7820, 0x323eb: 0x6e0c7a20, - 0x323ec: 0x6e0c7c20, 0x323ed: 0x6e0c7e20, 0x323ee: 0x6e286420, 0x323ef: 0x6e319420, - 0x323f0: 0x6e3cec20, 0x323f1: 0x6e3cee20, 0x323f2: 0x6c016220, 0x323f3: 0x6c034020, - 0x323f4: 0x6c034220, 0x323f5: 0x6c034420, 0x323f6: 0x6c06ae20, 0x323f7: 0x6c06b020, - 0x323f8: 0x6c06b220, 0x323f9: 0x6c0d4c20, 0x323fa: 0x6c0d4e20, 0x323fb: 0x6c0d5020, - 0x323fc: 0x6c0d5220, 0x323fd: 0x6c0d5420, 0x323fe: 0x6c0d5620, 0x323ff: 0x6c0d5820, - // Block 0xc90, offset 0x32400 - 0x32400: 0x6c0d5a20, 0x32401: 0x6c0d5c20, 0x32402: 0x6c185420, 0x32403: 0x6c185620, - 0x32404: 0x6c185820, 0x32405: 0x6c185a20, 0x32406: 0x6c185c20, 0x32407: 0x6c185e20, - 0x32408: 0x6c186020, 0x32409: 0x6c186220, 0x3240a: 0x6c186420, 0x3240b: 0x6c186620, - 0x3240c: 0x6c186820, 0x3240d: 0x6c186a20, 0x3240e: 0x6c186c20, 0x3240f: 0x6c186e20, - 0x32410: 0x6c187020, 0x32411: 0x6c2b6820, 0x32412: 0x6c2b6a20, 0x32413: 0x6c2b6c20, - 0x32414: 0x6c2b6e20, 0x32415: 0x6c2b7020, 0x32416: 0x6c2b7220, 0x32417: 0x6c2b7420, - 0x32418: 0x6c2b7620, 0x32419: 0x6c2b7820, 0x3241a: 0x6c2b7a20, 0x3241b: 0x6c2b7c20, - 0x3241c: 0x6c2b7e20, 0x3241d: 0x6c2b8020, 0x3241e: 0x6c456620, 0x3241f: 0x6c456820, - 0x32420: 0x6c456a20, 0x32421: 0x6c456c20, 0x32422: 0x6c456e20, 0x32423: 0x6c457020, - 0x32424: 0x6c457220, 0x32425: 0x6c457420, 0x32426: 0x6c457620, 0x32427: 0x6c457820, - 0x32428: 0x6c457a20, 0x32429: 0x6c457c20, 0x3242a: 0x6c457e20, 0x3242b: 0x6c66b820, - 0x3242c: 0x6c66ba20, 0x3242d: 0x6c66bc20, 0x3242e: 0x6c66be20, 0x3242f: 0x6c66c020, - 0x32430: 0x6c66c220, 0x32431: 0x6c66c420, 0x32432: 0x6c66c620, 0x32433: 0x6c66c820, - 0x32434: 0x6c66ca20, 0x32435: 0x6c66cc20, 0x32436: 0x6c66ce20, 0x32437: 0x6c66d020, - 0x32438: 0x6c66d220, 0x32439: 0x6c66d420, 0x3243a: 0x6c66d620, 0x3243b: 0x6c8d5420, - 0x3243c: 0x6c8d5620, 0x3243d: 0x6c8d5820, 0x3243e: 0x6c8d5a20, 0x3243f: 0x6c8d5c20, - // Block 0xc91, offset 0x32440 - 0x32440: 0x6c8d5e20, 0x32441: 0x6c8d6020, 0x32442: 0x6c8d6220, 0x32443: 0x6c8d6420, - 0x32444: 0x6c8d6620, 0x32445: 0x6cb9b420, 0x32446: 0x6cb9b620, 0x32447: 0x6cb9b820, - 0x32448: 0x6cb9ba20, 0x32449: 0x6cb9bc20, 0x3244a: 0x6cb9be20, 0x3244b: 0x6cb9c020, - 0x3244c: 0x6cb9c220, 0x3244d: 0x6cb9c420, 0x3244e: 0x6cb9c620, 0x3244f: 0x6cb9c820, - 0x32450: 0x6cb9ca20, 0x32451: 0x6cb9cc20, 0x32452: 0x6cb9ce20, 0x32453: 0x6ceaa420, - 0x32454: 0x6ceaa620, 0x32455: 0x6ceaa820, 0x32456: 0x6ceaaa20, 0x32457: 0x6ceaac20, - 0x32458: 0x6ceaae20, 0x32459: 0x6ceab020, 0x3245a: 0x6ceab220, 0x3245b: 0x6ceab420, - 0x3245c: 0x6ceab620, 0x3245d: 0x6ceab820, 0x3245e: 0x6ceaba20, 0x3245f: 0x6ceabc20, - 0x32460: 0x6d1a8420, 0x32461: 0x6d1a8620, 0x32462: 0x6d1a8820, 0x32463: 0x6d1a8a20, - 0x32464: 0x6d1a8c20, 0x32465: 0x6d1a8e20, 0x32466: 0x6d1a9020, 0x32467: 0x6d1a9220, - 0x32468: 0x6d1a9420, 0x32469: 0x6d1a9620, 0x3246a: 0x6d1a9820, 0x3246b: 0x6d1a9a20, - 0x3246c: 0x6d1a9c20, 0x3246d: 0x6d1a9e20, 0x3246e: 0x6d1aa020, 0x3246f: 0x6d1aa220, - 0x32470: 0x6d48e420, 0x32471: 0x6d48e620, 0x32472: 0x6d48e820, 0x32473: 0x6d48ea20, - 0x32474: 0x6d48ec20, 0x32475: 0x6d48ee20, 0x32476: 0x6d76dc20, 0x32477: 0x6d76de20, - 0x32478: 0x6d76e020, 0x32479: 0x6da06220, 0x3247a: 0x6da06420, 0x3247b: 0x6da06620, - 0x3247c: 0x6da06820, 0x3247d: 0x6da06a20, 0x3247e: 0x6da06c20, 0x3247f: 0x6da06e20, - // Block 0xc92, offset 0x32480 - 0x32480: 0x6dc2c620, 0x32481: 0x6dc2c820, 0x32482: 0x6dc2ca20, 0x32483: 0x6dc2cc20, - 0x32484: 0x6de06220, 0x32485: 0x6de06420, 0x32486: 0x6df8b220, 0x32487: 0x6e0c8020, - 0x32488: 0x6e286620, 0x32489: 0x6e286820, 0x3248a: 0x6e384220, 0x3248b: 0x6e46ae20, - 0x3248c: 0x6c035620, 0x3248d: 0x6c06be20, 0x3248e: 0x6c06c020, 0x3248f: 0x6c06c220, - 0x32490: 0x6c06c420, 0x32491: 0x6c0d6020, 0x32492: 0x6c0d6220, 0x32493: 0x6c0d6420, - 0x32494: 0x6c187a20, 0x32495: 0x6c187c20, 0x32496: 0x6c187e20, 0x32497: 0x6c188020, - 0x32498: 0x6c2b8e20, 0x32499: 0x6c2b9020, 0x3249a: 0x6c2b9220, 0x3249b: 0x6c2b9420, - 0x3249c: 0x6c2b9620, 0x3249d: 0x6c2b9820, 0x3249e: 0x6c458420, 0x3249f: 0x6c458620, - 0x324a0: 0x6c458820, 0x324a1: 0x6c458a20, 0x324a2: 0x6c458c20, 0x324a3: 0x6c458e20, - 0x324a4: 0x6c66e020, 0x324a5: 0x6c66e220, 0x324a6: 0x6c66e420, 0x324a7: 0x6c66e620, - 0x324a8: 0x6c66e820, 0x324a9: 0x6c66ea20, 0x324aa: 0x6c66ec20, 0x324ab: 0x6c66ee20, - 0x324ac: 0x6c66f020, 0x324ad: 0x6c66f220, 0x324ae: 0x6c8d7020, 0x324af: 0x6c8d7220, - 0x324b0: 0x6c8d7420, 0x324b1: 0x6c8d7620, 0x324b2: 0x6c8d7820, 0x324b3: 0x6c8d7a20, - 0x324b4: 0x6c8d7c20, 0x324b5: 0x6cb9da20, 0x324b6: 0x6cb9dc20, 0x324b7: 0x6cb9de20, - 0x324b8: 0x6ceac420, 0x324b9: 0x6ceac620, 0x324ba: 0x6ceac820, 0x324bb: 0x6ceaca20, - 0x324bc: 0x6ceacc20, 0x324bd: 0x6d1aa820, 0x324be: 0x6d1aaa20, 0x324bf: 0x6d1aac20, - // Block 0xc93, offset 0x324c0 - 0x324c0: 0x6d1aae20, 0x324c1: 0x6d1ab020, 0x324c2: 0x6d1ab220, 0x324c3: 0x6d48f420, - 0x324c4: 0x6d76e220, 0x324c5: 0x6d76e420, 0x324c6: 0x6d76e620, 0x324c7: 0x6d76e820, - 0x324c8: 0x6da07020, 0x324c9: 0x6da07220, 0x324ca: 0x6da07420, 0x324cb: 0x6df8b420, - 0x324cc: 0x6df8b620, 0x324cd: 0x6df8b820, 0x324ce: 0x6c00ae20, 0x324cf: 0x6c035c20, - 0x324d0: 0x6c06c820, 0x324d1: 0x6c188220, 0x324d2: 0x6c188420, 0x324d3: 0x6c188620, - 0x324d4: 0x6c188820, 0x324d5: 0x6c188a20, 0x324d6: 0x6c2b9c20, 0x324d7: 0x6c459020, - 0x324d8: 0x6c459220, 0x324d9: 0x6c459420, 0x324da: 0x6c459620, 0x324db: 0x6c459820, - 0x324dc: 0x6c459a20, 0x324dd: 0x6c459c20, 0x324de: 0x6c66f420, 0x324df: 0x6c66f620, - 0x324e0: 0x6c66f820, 0x324e1: 0x6c66fa20, 0x324e2: 0x6c63d420, 0x324e3: 0x6cb9e020, - 0x324e4: 0x6cb9e220, 0x324e5: 0x6ceace20, 0x324e6: 0x6d1ab420, 0x324e7: 0x6d1ab620, - 0x324e8: 0x6d1ab820, 0x324e9: 0x6da07620, 0x324ea: 0x6dc2ce20, 0x324eb: 0x6dea7420, - 0x324ec: 0x6c00b220, 0x324ed: 0x6c035e20, 0x324ee: 0x6c0d7020, 0x324ef: 0x6c0d7220, - 0x324f0: 0x6c0d7420, 0x324f1: 0x6c0d7620, 0x324f2: 0x6c0d7a20, 0x324f3: 0x6c189620, - 0x324f4: 0x6c189820, 0x324f5: 0x6c189a20, 0x324f6: 0x6c189c20, 0x324f7: 0x6c189e20, - 0x324f8: 0x6c2ba020, 0x324f9: 0x6c2ba220, 0x324fa: 0x6c2ba420, 0x324fb: 0x6c2ba620, - 0x324fc: 0x6c45a620, 0x324fd: 0x6c45a820, 0x324fe: 0x6c45aa20, 0x324ff: 0x6c45ac20, - // Block 0xc94, offset 0x32500 - 0x32500: 0x6c45ae20, 0x32501: 0x6c45b020, 0x32502: 0x6c45b220, 0x32503: 0x6c45c220, - 0x32504: 0x6c45b420, 0x32505: 0x6c45b620, 0x32506: 0x6c45b820, 0x32507: 0x6c45ba20, - 0x32508: 0x6c45bc20, 0x32509: 0x6c670220, 0x3250a: 0x6c670420, 0x3250b: 0x6c670620, - 0x3250c: 0x6c670820, 0x3250d: 0x6c670a20, 0x3250e: 0x6c8d8e20, 0x3250f: 0x6c8d9020, - 0x32510: 0x6cb9e420, 0x32511: 0x6cb9e620, 0x32512: 0x6cb9e820, 0x32513: 0x6cb9ea20, - 0x32514: 0x6cb9ec20, 0x32515: 0x6cb9ee20, 0x32516: 0x6ceada20, 0x32517: 0x6ceadc20, - 0x32518: 0x6ceade20, 0x32519: 0x6d1ac220, 0x3251a: 0x6d1ac420, 0x3251b: 0x6d1ac620, - 0x3251c: 0x6d48f820, 0x3251d: 0x6d48fa20, 0x3251e: 0x6d48fc20, 0x3251f: 0x6d48fe20, - 0x32520: 0x6d490020, 0x32521: 0x6d490220, 0x32522: 0x6d76ec20, 0x32523: 0x6d76ee20, - 0x32524: 0x6dc2d020, 0x32525: 0x6dc2d220, 0x32526: 0x6de06a20, 0x32527: 0x6de06c20, - 0x32528: 0x6df8bc20, 0x32529: 0x6df8be20, 0x3252a: 0x6e1c2420, 0x3252b: 0x6e3cf220, - 0x3252c: 0x6e451420, 0x3252d: 0x6c036420, 0x3252e: 0x6c0d7c20, 0x3252f: 0x6c0d7e20, - 0x32530: 0x6c18a820, 0x32531: 0x6c18aa20, 0x32532: 0x6c18ac20, 0x32533: 0x6c2baa20, - 0x32534: 0x6c45c420, 0x32535: 0x6c45c620, 0x32536: 0x6c670e20, 0x32537: 0x6d1aca20, - 0x32538: 0x6df8c220, 0x32539: 0x6e1c2620, 0x3253a: 0x6e1c2820, 0x3253b: 0x6c037020, - 0x3253c: 0x6c037220, 0x3253d: 0x6c06da20, 0x3253e: 0x6c06dc20, 0x3253f: 0x6c037420, - // Block 0xc95, offset 0x32540 - 0x32540: 0x6c06de20, 0x32541: 0x6c06e020, 0x32542: 0x6c0d8e20, 0x32543: 0x6c0d9020, - 0x32544: 0x6c0d9220, 0x32545: 0x6c0d9420, 0x32546: 0x6c0d9620, 0x32547: 0x6c0d9820, - 0x32548: 0x6c0d9a20, 0x32549: 0x6c0d9c20, 0x3254a: 0x6c0d9e20, 0x3254b: 0x6c0da020, - 0x3254c: 0x6c0da220, 0x3254d: 0x6c0da420, 0x3254e: 0x6c0da620, 0x3254f: 0x6c0da820, - 0x32550: 0x6c0daa20, 0x32551: 0x6c18ae20, 0x32552: 0x6c18b020, 0x32553: 0x6c18b220, - 0x32554: 0x6c18b420, 0x32555: 0x6c18b620, 0x32556: 0x6c18b820, 0x32557: 0x6c18ba20, - 0x32558: 0x6c2bba20, 0x32559: 0x6c2bbc20, 0x3255a: 0x6c2bbe20, 0x3255b: 0x6c2bc020, - 0x3255c: 0x6c2bc220, 0x3255d: 0x6c2bc420, 0x3255e: 0x6c2bc620, 0x3255f: 0x6c2bc820, - 0x32560: 0x6c2bca20, 0x32561: 0x6c2bcc20, 0x32562: 0x6c2bce20, 0x32563: 0x6c671020, - 0x32564: 0x6c671220, 0x32565: 0x6c671420, 0x32566: 0x6c671620, 0x32567: 0x6c671820, - 0x32568: 0x6c671a20, 0x32569: 0x6c671c20, 0x3256a: 0x6c8d9a20, 0x3256b: 0x6c8d9c20, - 0x3256c: 0x6c8d9e20, 0x3256d: 0x6c8da020, 0x3256e: 0x6c8da220, 0x3256f: 0x6c8da420, - 0x32570: 0x6cb9f420, 0x32571: 0x6cb9f620, 0x32572: 0x6cb9f820, 0x32573: 0x6cb9fa20, - 0x32574: 0x6ceae220, 0x32575: 0x6ceae420, 0x32576: 0x6ceae620, 0x32577: 0x6ceae820, - 0x32578: 0x6ceaea20, 0x32579: 0x6ceaec20, 0x3257a: 0x6ceaee20, 0x3257b: 0x6ceaf020, - 0x3257c: 0x6ceaf220, 0x3257d: 0x6d1acc20, 0x3257e: 0x6d1ace20, 0x3257f: 0x6d1ad020, - // Block 0xc96, offset 0x32580 - 0x32580: 0x6d490420, 0x32581: 0x6d490620, 0x32582: 0x6d490820, 0x32583: 0x6d490a20, - 0x32584: 0x6d490c20, 0x32585: 0x6da07a20, 0x32586: 0x6da07c20, 0x32587: 0x6da07e20, - 0x32588: 0x6da08020, 0x32589: 0x6dc2d420, 0x3258a: 0x6dc2d620, 0x3258b: 0x6dc2d820, - 0x3258c: 0x6dc2da20, 0x3258d: 0x6dc2dc20, 0x3258e: 0x6de06e20, 0x3258f: 0x6e0c8620, - 0x32590: 0x6e384420, 0x32591: 0x6e3cf420, 0x32592: 0x6c016c20, 0x32593: 0x6c06ea20, - 0x32594: 0x6c0dae20, 0x32595: 0x6c0db020, 0x32596: 0x6c0db220, 0x32597: 0x6c0db420, - 0x32598: 0x6c0db620, 0x32599: 0x6c18c420, 0x3259a: 0x6c18c620, 0x3259b: 0x6c18c820, - 0x3259c: 0x6c18ca20, 0x3259d: 0x6c161a20, 0x3259e: 0x6c2bdc20, 0x3259f: 0x6c2bde20, - 0x325a0: 0x6c2be020, 0x325a1: 0x6c2be220, 0x325a2: 0x6c2be420, 0x325a3: 0x6c2be620, - 0x325a4: 0x6c2be820, 0x325a5: 0x6c2bea20, 0x325a6: 0x6c2bec20, 0x325a7: 0x6c2bee20, - 0x325a8: 0x6c2bf020, 0x325a9: 0x6c45ce20, 0x325aa: 0x6c45d020, 0x325ab: 0x6c45d220, - 0x325ac: 0x6c45d420, 0x325ad: 0x6c45d620, 0x325ae: 0x6c45d820, 0x325af: 0x6c45da20, - 0x325b0: 0x6c45dc20, 0x325b1: 0x6c45de20, 0x325b2: 0x6c45e020, 0x325b3: 0x6c672020, - 0x325b4: 0x6c672220, 0x325b5: 0x6c672420, 0x325b6: 0x6c672620, 0x325b7: 0x6c672820, - 0x325b8: 0x6cb78420, 0x325b9: 0x6c672a20, 0x325ba: 0x6c8daa20, 0x325bb: 0x6c8dac20, - 0x325bc: 0x6c8dae20, 0x325bd: 0x6c8db020, 0x325be: 0x6c8db220, 0x325bf: 0x6c8db420, - // Block 0xc97, offset 0x325c0 - 0x325c0: 0x6cb9fc20, 0x325c1: 0x6cb9fe20, 0x325c2: 0x6cba0020, 0x325c3: 0x6cbd9e20, - 0x325c4: 0x6cba0220, 0x325c5: 0x6ceaf620, 0x325c6: 0x6d1ad420, 0x325c7: 0x6d1ad620, - 0x325c8: 0x6d491220, 0x325c9: 0x6d491420, 0x325ca: 0x6d491620, 0x325cb: 0x6e400820, - 0x325cc: 0x6e467a20, 0x325cd: 0x6c037e20, 0x325ce: 0x6c038020, 0x325cf: 0x6c038220, - 0x325d0: 0x6c038420, 0x325d1: 0x6c06f220, 0x325d2: 0x6c0dbc20, 0x325d3: 0x6c0dbe20, - 0x325d4: 0x6c0dc020, 0x325d5: 0x6c0dc220, 0x325d6: 0x6c0dc420, 0x325d7: 0x6c0dc620, - 0x325d8: 0x6c18da20, 0x325d9: 0x6c45ea20, 0x325da: 0x6c45ec20, 0x325db: 0x6c45ee20, - 0x325dc: 0x6c45f020, 0x325dd: 0x6c45f220, 0x325de: 0x6c672e20, 0x325df: 0x6cba0420, - 0x325e0: 0x6cba0620, 0x325e1: 0x6cba0820, 0x325e2: 0x6ceafc20, 0x325e3: 0x6ceafe20, - 0x325e4: 0x6ceb0020, 0x325e5: 0x6d1ada20, 0x325e6: 0x6da08420, 0x325e7: 0x6dc2e020, - 0x325e8: 0x6dc2e220, 0x325e9: 0x6dc2e420, 0x325ea: 0x6dc2e620, 0x325eb: 0x6e3cf620, - 0x325ec: 0x6c038e20, 0x325ed: 0x6c06fa20, 0x325ee: 0x6c06fc20, 0x325ef: 0x6c06fe20, - 0x325f0: 0x6c070020, 0x325f1: 0x6c070220, 0x325f2: 0x6c070420, 0x325f3: 0x6c070620, - 0x325f4: 0x6c0dda20, 0x325f5: 0x6c0ddc20, 0x325f6: 0x6c0dde20, 0x325f7: 0x6c0de020, - 0x325f8: 0x6c0de220, 0x325f9: 0x6c0de420, 0x325fa: 0x6c0de620, 0x325fb: 0x6c0de820, - 0x325fc: 0x6c0dea20, 0x325fd: 0x6c0dec20, 0x325fe: 0x6c0dee20, 0x325ff: 0x6c0df020, - // Block 0xc98, offset 0x32600 - 0x32600: 0x6c18ec20, 0x32601: 0x6c18ee20, 0x32602: 0x6c18f020, 0x32603: 0x6c18f220, - 0x32604: 0x6c18f420, 0x32605: 0x6c18f620, 0x32606: 0x6c18f820, 0x32607: 0x6c18fa20, - 0x32608: 0x6c18fc20, 0x32609: 0x6c18fe20, 0x3260a: 0x6c2c0c20, 0x3260b: 0x6c2c0e20, - 0x3260c: 0x6c2c1020, 0x3260d: 0x6c2c1220, 0x3260e: 0x6c2c1420, 0x3260f: 0x6c2c1620, - 0x32610: 0x6c2c1820, 0x32611: 0x6c2c1a20, 0x32612: 0x6c2c1c20, 0x32613: 0x6c2c1e20, - 0x32614: 0x6c2c2020, 0x32615: 0x6c2c2220, 0x32616: 0x6c2a5a20, 0x32617: 0x6c460420, - 0x32618: 0x6c460620, 0x32619: 0x6c460820, 0x3261a: 0x6c460a20, 0x3261b: 0x6c460c20, - 0x3261c: 0x6c460e20, 0x3261d: 0x6c461020, 0x3261e: 0x6c461220, 0x3261f: 0x6c461420, - 0x32620: 0x6c461620, 0x32621: 0x6c461820, 0x32622: 0x6c461a20, 0x32623: 0x6c461c20, - 0x32624: 0x6c461e20, 0x32625: 0x6c462020, 0x32626: 0x6c462220, 0x32627: 0x6c674220, - 0x32628: 0x6c674420, 0x32629: 0x6c674620, 0x3262a: 0x6c674820, 0x3262b: 0x6c674a20, - 0x3262c: 0x6c674c20, 0x3262d: 0x6c674e20, 0x3262e: 0x6c675020, 0x3262f: 0x6c675220, - 0x32630: 0x6c675420, 0x32631: 0x6c675620, 0x32632: 0x6c675820, 0x32633: 0x6c675a20, - 0x32634: 0x6c675c20, 0x32635: 0x6c675e20, 0x32636: 0x6c676020, 0x32637: 0x6c676220, - 0x32638: 0x6c8dc220, 0x32639: 0x6c8dc420, 0x3263a: 0x6c8dc620, 0x3263b: 0x6c8dc820, - 0x3263c: 0x6c8dca20, 0x3263d: 0x6c8dcc20, 0x3263e: 0x6c8dce20, 0x3263f: 0x6ceb0820, - // Block 0xc99, offset 0x32640 - 0x32640: 0x6c8dd020, 0x32641: 0x6c8dd220, 0x32642: 0x6c8dd420, 0x32643: 0x6c8dd620, - 0x32644: 0x6c8dd820, 0x32645: 0x6c8dda20, 0x32646: 0x6c8ddc20, 0x32647: 0x6cba1620, - 0x32648: 0x6cba1820, 0x32649: 0x6cba1a20, 0x3264a: 0x6cba1c20, 0x3264b: 0x6cba1e20, - 0x3264c: 0x6cba2020, 0x3264d: 0x6cba2220, 0x3264e: 0x6cba2420, 0x3264f: 0x6cba2620, - 0x32650: 0x6cba2820, 0x32651: 0x6ceb0a20, 0x32652: 0x6ceb0c20, 0x32653: 0x6ceb0e20, - 0x32654: 0x6ceb1020, 0x32655: 0x6ceb1220, 0x32656: 0x6ceb1420, 0x32657: 0x6ceb1620, - 0x32658: 0x6ceb1820, 0x32659: 0x6d1ae820, 0x3265a: 0x6d1aea20, 0x3265b: 0x6d1aec20, - 0x3265c: 0x6d1aee20, 0x3265d: 0x6d1af020, 0x3265e: 0x6d1af220, 0x3265f: 0x6d1af420, - 0x32660: 0x6d1af620, 0x32661: 0x6d1af820, 0x32662: 0x6d1afa20, 0x32663: 0x6d1afc20, - 0x32664: 0x6d1afe20, 0x32665: 0x6d1b0020, 0x32666: 0x6d1b0220, 0x32667: 0x6d1b0420, - 0x32668: 0x6d1b0620, 0x32669: 0x6d1b0820, 0x3266a: 0x6d1b0a20, 0x3266b: 0x6d1b0c20, - 0x3266c: 0x6d1b0e20, 0x3266d: 0x6d491e20, 0x3266e: 0x6d492020, 0x3266f: 0x6d492220, - 0x32670: 0x6d492420, 0x32671: 0x6d492620, 0x32672: 0x6d492820, 0x32673: 0x6d492a20, - 0x32674: 0x6d492c20, 0x32675: 0x6d492e20, 0x32676: 0x6d493020, 0x32677: 0x6d493220, - 0x32678: 0x6d493420, 0x32679: 0x6d5ad220, 0x3267a: 0x6d76f020, 0x3267b: 0x6d76f220, - 0x3267c: 0x6d76f420, 0x3267d: 0x6d76f620, 0x3267e: 0x6d76f820, 0x3267f: 0x6da08a20, - // Block 0xc9a, offset 0x32680 - 0x32680: 0x6dc2e820, 0x32681: 0x6dc2ea20, 0x32682: 0x6dc2ec20, 0x32683: 0x6dc2ee20, - 0x32684: 0x6dc2f020, 0x32685: 0x6dc2f220, 0x32686: 0x6dc2f420, 0x32687: 0x6df8c620, - 0x32688: 0x6dfbb620, 0x32689: 0x6e0c8820, 0x3268a: 0x6e0c8a20, 0x3268b: 0x6e1c2a20, - 0x3268c: 0x6e286a20, 0x3268d: 0x6e286c20, 0x3268e: 0x6e286e20, 0x3268f: 0x6e319820, - 0x32690: 0x6e442420, 0x32691: 0x6e462220, 0x32692: 0x6e467c20, 0x32693: 0x6c017620, - 0x32694: 0x6c017820, 0x32695: 0x6c017a20, 0x32696: 0x6c017c20, 0x32697: 0x6c039820, - 0x32698: 0x6c039a20, 0x32699: 0x6c071020, 0x3269a: 0x6c071220, 0x3269b: 0x6c071420, - 0x3269c: 0x6c071620, 0x3269d: 0x6c071820, 0x3269e: 0x6c0df620, 0x3269f: 0x6c0df820, - 0x326a0: 0x6c0dfa20, 0x326a1: 0x6c0dfc20, 0x326a2: 0x6c0dfe20, 0x326a3: 0x6c0e0020, - 0x326a4: 0x6c0e0220, 0x326a5: 0x6c0e0420, 0x326a6: 0x6c190620, 0x326a7: 0x6c190820, - 0x326a8: 0x6c190a20, 0x326a9: 0x6c2c2e20, 0x326aa: 0x6c2c3020, 0x326ab: 0x6c2c3220, - 0x326ac: 0x6c2c3420, 0x326ad: 0x6c2c3620, 0x326ae: 0x6c2ab020, 0x326af: 0x6c2c3820, - 0x326b0: 0x6c462c20, 0x326b1: 0x6c462e20, 0x326b2: 0x6c463020, 0x326b3: 0x6c464a20, - 0x326b4: 0x6c463220, 0x326b5: 0x6c463420, 0x326b6: 0x6c463620, 0x326b7: 0x6c463820, - 0x326b8: 0x6c463a20, 0x326b9: 0x6c677220, 0x326ba: 0x6c677420, 0x326bb: 0x6c677620, - 0x326bc: 0x6c677820, 0x326bd: 0x6c8dea20, 0x326be: 0x6c8dec20, 0x326bf: 0x6cba3020, - // Block 0xc9b, offset 0x326c0 - 0x326c0: 0x6cba3220, 0x326c1: 0x6cba3420, 0x326c2: 0x6cba3620, 0x326c3: 0x6cba3820, - 0x326c4: 0x6cba3a20, 0x326c5: 0x6cba3c20, 0x326c6: 0x6ceb2220, 0x326c7: 0x6ceb2420, - 0x326c8: 0x6ceb2620, 0x326c9: 0x6ceb2820, 0x326ca: 0x6ceb2a20, 0x326cb: 0x6ceb2c20, - 0x326cc: 0x6ceb2e20, 0x326cd: 0x6d1b1820, 0x326ce: 0x6d1b1a20, 0x326cf: 0x6d1b1c20, - 0x326d0: 0x6d1b1e20, 0x326d1: 0x6d493e20, 0x326d2: 0x6d494020, 0x326d3: 0x6d76fa20, - 0x326d4: 0x6de07220, 0x326d5: 0x6da08e20, 0x326d6: 0x6da09020, 0x326d7: 0x6da09220, - 0x326d8: 0x6de07420, 0x326d9: 0x6de07620, 0x326da: 0x6c03aa20, 0x326db: 0x6c03ac20, - 0x326dc: 0x6c03ae20, 0x326dd: 0x6c03b020, 0x326de: 0x6c03b220, 0x326df: 0x6c03b420, - 0x326e0: 0x6c03b620, 0x326e1: 0x6c072020, 0x326e2: 0x6c072220, 0x326e3: 0x6c072420, - 0x326e4: 0x6c072620, 0x326e5: 0x6c072820, 0x326e6: 0x6c072a20, 0x326e7: 0x6c072c20, - 0x326e8: 0x6c072e20, 0x326e9: 0x6c0e0a20, 0x326ea: 0x6c0e0c20, 0x326eb: 0x6c0e0e20, - 0x326ec: 0x6c0e1020, 0x326ed: 0x6c0e1220, 0x326ee: 0x6c0e1420, 0x326ef: 0x6c0e1620, - 0x326f0: 0x6c0e1820, 0x326f1: 0x6c191020, 0x326f2: 0x6c191220, 0x326f3: 0x6c191420, - 0x326f4: 0x6c191620, 0x326f5: 0x6c191820, 0x326f6: 0x6c191a20, 0x326f7: 0x6c191c20, - 0x326f8: 0x6c191e20, 0x326f9: 0x6c2c4620, 0x326fa: 0x6c2c4820, 0x326fb: 0x6c2c4a20, - 0x326fc: 0x6c2c4c20, 0x326fd: 0x6c2c4e20, 0x326fe: 0x6c2c5020, 0x326ff: 0x6c464c20, - // Block 0xc9c, offset 0x32700 - 0x32700: 0x6c464e20, 0x32701: 0x6c465020, 0x32702: 0x6c465220, 0x32703: 0x6c465420, - 0x32704: 0x6c465620, 0x32705: 0x6c465820, 0x32706: 0x6c465a20, 0x32707: 0x6c465c20, - 0x32708: 0x6c465e20, 0x32709: 0x6c45e220, 0x3270a: 0x6c678020, 0x3270b: 0x6c678220, - 0x3270c: 0x6c678420, 0x3270d: 0x6c678620, 0x3270e: 0x6c678820, 0x3270f: 0x6c678a20, - 0x32710: 0x6c678c20, 0x32711: 0x6c678e20, 0x32712: 0x6c679020, 0x32713: 0x6c679220, - 0x32714: 0x6c679420, 0x32715: 0x6c8df020, 0x32716: 0x6c8df220, 0x32717: 0x6c8df420, - 0x32718: 0x6c8df620, 0x32719: 0x6c8df820, 0x3271a: 0x6c8dfa20, 0x3271b: 0x6c8dfc20, - 0x3271c: 0x6c8dfe20, 0x3271d: 0x6c8e0020, 0x3271e: 0x6c8e0220, 0x3271f: 0x6c8e0420, - 0x32720: 0x6c8e0620, 0x32721: 0x6c8e0820, 0x32722: 0x6c8e0a20, 0x32723: 0x6c8e0c20, - 0x32724: 0x6c8e0e20, 0x32725: 0x6cba4420, 0x32726: 0x6cba4620, 0x32727: 0x6cba4820, - 0x32728: 0x6cba4a20, 0x32729: 0x6cba4c20, 0x3272a: 0x6cba4e20, 0x3272b: 0x6cba5020, - 0x3272c: 0x6cba5220, 0x3272d: 0x6cba5420, 0x3272e: 0x6cba5620, 0x3272f: 0x6ceb3620, - 0x32730: 0x6ceb3820, 0x32731: 0x6ceb3a20, 0x32732: 0x6ceb3c20, 0x32733: 0x6ceb3e20, - 0x32734: 0x6ceb4020, 0x32735: 0x6ceb4220, 0x32736: 0x6cee5e20, 0x32737: 0x6ceb4420, - 0x32738: 0x6ceb4620, 0x32739: 0x6ceb4820, 0x3273a: 0x6ceb4a20, 0x3273b: 0x6d19d820, - 0x3273c: 0x6d1b2220, 0x3273d: 0x6d1b2420, 0x3273e: 0x6d1b2620, 0x3273f: 0x6d1b2820, - // Block 0xc9d, offset 0x32740 - 0x32740: 0x6d1b2a20, 0x32741: 0x6d1b2c20, 0x32742: 0x6d1b2e20, 0x32743: 0x6d494420, - 0x32744: 0x6d494620, 0x32745: 0x6d494820, 0x32746: 0x6d494a20, 0x32747: 0x6d76fe20, - 0x32748: 0x6d770020, 0x32749: 0x6d770220, 0x3274a: 0x6d770420, 0x3274b: 0x6d770620, - 0x3274c: 0x6d770820, 0x3274d: 0x6da09420, 0x3274e: 0x6da09620, 0x3274f: 0x6da09820, - 0x32750: 0x6dc2f820, 0x32751: 0x6de07a20, 0x32752: 0x6de07c20, 0x32753: 0x6e0c8c20, - 0x32754: 0x6e0c8e20, 0x32755: 0x6e1c2c20, 0x32756: 0x6e287020, 0x32757: 0x6e319a20, - 0x32758: 0x6e319c20, 0x32759: 0x6c03bc20, 0x3275a: 0x6c03be20, 0x3275b: 0x6c03c020, - 0x3275c: 0x6c03c220, 0x3275d: 0x6c03c420, 0x3275e: 0x6c03c620, 0x3275f: 0x6c076e20, - 0x32760: 0x6c077020, 0x32761: 0x6c077220, 0x32762: 0x6c077420, 0x32763: 0x6c077620, - 0x32764: 0x6c077820, 0x32765: 0x6c077a20, 0x32766: 0x6c077c20, 0x32767: 0x6c077e20, - 0x32768: 0x6c078020, 0x32769: 0x6c078220, 0x3276a: 0x6c078420, 0x3276b: 0x6c0e5420, - 0x3276c: 0x6c0e5620, 0x3276d: 0x6c0e5820, 0x3276e: 0x6c0e5a20, 0x3276f: 0x6c0e5c20, - 0x32770: 0x6c0e5e20, 0x32771: 0x6c0e6020, 0x32772: 0x6c0e6220, 0x32773: 0x6c0e6420, - 0x32774: 0x6c0e6620, 0x32775: 0x6c0e6820, 0x32776: 0x6c0e6a20, 0x32777: 0x6c0e6c20, - 0x32778: 0x6c0e6e20, 0x32779: 0x6c0e7020, 0x3277a: 0x6c0e7220, 0x3277b: 0x6c0e7420, - 0x3277c: 0x6c0e7620, 0x3277d: 0x6c0e7820, 0x3277e: 0x6c0e7a20, 0x3277f: 0x6c0e7c20, - // Block 0xc9e, offset 0x32780 - 0x32780: 0x6c0e7e20, 0x32781: 0x6c0e8020, 0x32782: 0x6c0e8220, 0x32783: 0x6c0e8420, - 0x32784: 0x6c0e8620, 0x32785: 0x6c0e8820, 0x32786: 0x6c0e8a20, 0x32787: 0x6c0e8c20, - 0x32788: 0x6c0e8e20, 0x32789: 0x6c0e9020, 0x3278a: 0x6c0e9220, 0x3278b: 0x6c19ca20, - 0x3278c: 0x6c19cc20, 0x3278d: 0x6c19ce20, 0x3278e: 0x6c19d020, 0x3278f: 0x6c19d220, - 0x32790: 0x6c19d420, 0x32791: 0x6c19d620, 0x32792: 0x6c19d820, 0x32793: 0x6c19da20, - 0x32794: 0x6c19dc20, 0x32795: 0x6c19de20, 0x32796: 0x6c19e020, 0x32797: 0x6c19e220, - 0x32798: 0x6c19e420, 0x32799: 0x6c19e620, 0x3279a: 0x6c19e820, 0x3279b: 0x6c19ea20, - 0x3279c: 0x6c19ec20, 0x3279d: 0x6c19ee20, 0x3279e: 0x6c19f020, 0x3279f: 0x6c19f220, - 0x327a0: 0x6c19f420, 0x327a1: 0x6c19f620, 0x327a2: 0x6c19f820, 0x327a3: 0x6c19fa20, - 0x327a4: 0x6c19fc20, 0x327a5: 0x6c19fe20, 0x327a6: 0x6c1a0020, 0x327a7: 0x6c1a0220, - 0x327a8: 0x6c1a0420, 0x327a9: 0x6c1a0620, 0x327aa: 0x6c1a0820, 0x327ab: 0x6c1a0a20, - 0x327ac: 0x6c1a0c20, 0x327ad: 0x6c1a0e20, 0x327ae: 0x6c1a1020, 0x327af: 0x6c1a1220, - 0x327b0: 0x6c1a1420, 0x327b1: 0x6c1a1620, 0x327b2: 0x6c1a1820, 0x327b3: 0x6c1a1a20, - 0x327b4: 0x6c1a1c20, 0x327b5: 0x6c1a1e20, 0x327b6: 0x6c1a2020, 0x327b7: 0x6c1a2220, - 0x327b8: 0x6c1a2420, 0x327b9: 0x6c1a2620, 0x327ba: 0x6c1a2820, 0x327bb: 0x6c1a2a20, - 0x327bc: 0x6c1a2c20, 0x327bd: 0x6c1a2e20, 0x327be: 0x6c1a3020, 0x327bf: 0x6c1a3220, - // Block 0xc9f, offset 0x327c0 - 0x327c0: 0x6c1a3420, 0x327c1: 0x6c1a3620, 0x327c2: 0x6c1a3820, 0x327c3: 0x6c1a3a20, - 0x327c4: 0x6c1a3c20, 0x327c5: 0x6c1a3e20, 0x327c6: 0x6c1a4020, 0x327c7: 0x6c1a4220, - 0x327c8: 0x6c2ce620, 0x327c9: 0x6c2ce820, 0x327ca: 0x6c2cea20, 0x327cb: 0x6c2cec20, - 0x327cc: 0x6c2cee20, 0x327cd: 0x6c2cf020, 0x327ce: 0x6c2cf220, 0x327cf: 0x6c2cf420, - 0x327d0: 0x6c2cf620, 0x327d1: 0x6c2cf820, 0x327d2: 0x6c2cfa20, 0x327d3: 0x6c2cfc20, - 0x327d4: 0x6c2cfe20, 0x327d5: 0x6c2d0020, 0x327d6: 0x6c2d0220, 0x327d7: 0x6c2d0420, - 0x327d8: 0x6c2d0620, 0x327d9: 0x6c2d0820, 0x327da: 0x6c2d0a20, 0x327db: 0x6c2d0c20, - 0x327dc: 0x6c2d0e20, 0x327dd: 0x6c2d1020, 0x327de: 0x6c2d1220, 0x327df: 0x6c2d1420, - 0x327e0: 0x6c2d1620, 0x327e1: 0x6c2d1820, 0x327e2: 0x6c2d1a20, 0x327e3: 0x6c2d1c20, - 0x327e4: 0x6c2d1e20, 0x327e5: 0x6c2d2020, 0x327e6: 0x6c2d2220, 0x327e7: 0x6c2d2420, - 0x327e8: 0x6c2d2620, 0x327e9: 0x6c2d2820, 0x327ea: 0x6c2d2a20, 0x327eb: 0x6c2d2c20, - 0x327ec: 0x6c2d2e20, 0x327ed: 0x6c2d3020, 0x327ee: 0x6c2d3220, 0x327ef: 0x6c2d3420, - 0x327f0: 0x6c2d3620, 0x327f1: 0x6c2d3820, 0x327f2: 0x6c2d3a20, 0x327f3: 0x6c2d3c20, - 0x327f4: 0x6c2d3e20, 0x327f5: 0x6c2d4020, 0x327f6: 0x6c2d4220, 0x327f7: 0x6c2d4420, - 0x327f8: 0x6c2d4620, 0x327f9: 0x6c2d4820, 0x327fa: 0x6c2d4a20, 0x327fb: 0x6c2d4c20, - 0x327fc: 0x6c2d4e20, 0x327fd: 0x6c2d5020, 0x327fe: 0x6c2d5220, 0x327ff: 0x6c2d5420, - // Block 0xca0, offset 0x32800 - 0x32800: 0x6c2d5620, 0x32801: 0x6c2d5820, 0x32802: 0x6c2d5a20, 0x32803: 0x6c2d5c20, - 0x32804: 0x6c2d5e20, 0x32805: 0x6c2d6020, 0x32806: 0x6c2d6220, 0x32807: 0x6c2d6420, - 0x32808: 0x6c2d6620, 0x32809: 0x6c2d6820, 0x3280a: 0x6c2d6a20, 0x3280b: 0x6c2d6c20, - 0x3280c: 0x6c2d6e20, 0x3280d: 0x6c2d7020, 0x3280e: 0x6c2d7220, 0x3280f: 0x6c2d7420, - 0x32810: 0x6c470e20, 0x32811: 0x6c471020, 0x32812: 0x6c471220, 0x32813: 0x6c471420, - 0x32814: 0x6c471620, 0x32815: 0x6c471820, 0x32816: 0x6c471a20, 0x32817: 0x6c471c20, - 0x32818: 0x6c471e20, 0x32819: 0x6c472020, 0x3281a: 0x6c472220, 0x3281b: 0x6c472420, - 0x3281c: 0x6c472620, 0x3281d: 0x6c472820, 0x3281e: 0x6c472a20, 0x3281f: 0x6c472c20, - 0x32820: 0x6c472e20, 0x32821: 0x6c473020, 0x32822: 0x6c473220, 0x32823: 0x6c473420, - 0x32824: 0x6c473620, 0x32825: 0x6c473820, 0x32826: 0x6c473a20, 0x32827: 0x6c473c20, - 0x32828: 0x6c473e20, 0x32829: 0x6c474020, 0x3282a: 0x6c474220, 0x3282b: 0x6c474420, - 0x3282c: 0x6c474620, 0x3282d: 0x6c474820, 0x3282e: 0x6c474a20, 0x3282f: 0x6c474c20, - 0x32830: 0x6c474e20, 0x32831: 0x6c475020, 0x32832: 0x6c475220, 0x32833: 0x6c475420, - 0x32834: 0x6c475620, 0x32835: 0x6c475820, 0x32836: 0x6c475a20, 0x32837: 0x6c475c20, - 0x32838: 0x6c475e20, 0x32839: 0x6c476020, 0x3283a: 0x6c476220, 0x3283b: 0x6c476420, - 0x3283c: 0x6c476620, 0x3283d: 0x6c476820, 0x3283e: 0x6c476a20, 0x3283f: 0x6c476c20, - // Block 0xca1, offset 0x32840 - 0x32840: 0x6c476e20, 0x32841: 0x6c477020, 0x32842: 0x6c477220, 0x32843: 0x6c477420, - 0x32844: 0x6c477620, 0x32845: 0x6c477820, 0x32846: 0x6c477a20, 0x32847: 0x6c477c20, - 0x32848: 0x6c477e20, 0x32849: 0x6c478020, 0x3284a: 0x6c478220, 0x3284b: 0x6c478420, - 0x3284c: 0x6c478620, 0x3284d: 0x6c478820, 0x3284e: 0x6c478a20, 0x3284f: 0x6c478c20, - 0x32850: 0x6c478e20, 0x32851: 0x6c479020, 0x32852: 0x6c479220, 0x32853: 0x6c479420, - 0x32854: 0x6c479620, 0x32855: 0x6c479820, 0x32856: 0x6c479a20, 0x32857: 0x6c479c20, - 0x32858: 0x6c479e20, 0x32859: 0x6c47a020, 0x3285a: 0x6c47a220, 0x3285b: 0x6c47a420, - 0x3285c: 0x6c47a620, 0x3285d: 0x6c47a820, 0x3285e: 0x6c47aa20, 0x3285f: 0x6c47ac20, - 0x32860: 0x6c47ae20, 0x32861: 0x6c47b020, 0x32862: 0x6c47b220, 0x32863: 0x6c47b420, - 0x32864: 0x6c47b620, 0x32865: 0x6c47b820, 0x32866: 0x6c47ba20, 0x32867: 0x6c47bc20, - 0x32868: 0x6c47be20, 0x32869: 0x6c47c020, 0x3286a: 0x6c47c220, 0x3286b: 0x6c47c420, - 0x3286c: 0x6c684820, 0x3286d: 0x6c684a20, 0x3286e: 0x6c684c20, 0x3286f: 0x6c684e20, - 0x32870: 0x6c685020, 0x32871: 0x6c685220, 0x32872: 0x6c685420, 0x32873: 0x6c685620, - 0x32874: 0x6c685820, 0x32875: 0x6c685a20, 0x32876: 0x6c685c20, 0x32877: 0x6c685e20, - 0x32878: 0x6c686020, 0x32879: 0x6c686220, 0x3287a: 0x6c686420, 0x3287b: 0x6c686620, - 0x3287c: 0x6c686820, 0x3287d: 0x6c686a20, 0x3287e: 0x6c686c20, 0x3287f: 0x6c686e20, - // Block 0xca2, offset 0x32880 - 0x32880: 0x6c687020, 0x32881: 0x6c687220, 0x32882: 0x6c687420, 0x32883: 0x6c687620, - 0x32884: 0x6c687820, 0x32885: 0x6c687a20, 0x32886: 0x6c687c20, 0x32887: 0x6c687e20, - 0x32888: 0x6c688020, 0x32889: 0x6c688220, 0x3288a: 0x6c688420, 0x3288b: 0x6c688620, - 0x3288c: 0x6c688820, 0x3288d: 0x6c688a20, 0x3288e: 0x6c688c20, 0x3288f: 0x6c688e20, - 0x32890: 0x6c689020, 0x32891: 0x6c689220, 0x32892: 0x6c689420, 0x32893: 0x6c689620, - 0x32894: 0x6c689820, 0x32895: 0x6c689a20, 0x32896: 0x6c689c20, 0x32897: 0x6c689e20, - 0x32898: 0x6c68a020, 0x32899: 0x6c68a220, 0x3289a: 0x6c68a420, 0x3289b: 0x6c68a620, - 0x3289c: 0x6c68a820, 0x3289d: 0x6c68aa20, 0x3289e: 0x6c68ac20, 0x3289f: 0x6c68ae20, - 0x328a0: 0x6c68b020, 0x328a1: 0x6c68b220, 0x328a2: 0x6c68b420, 0x328a3: 0x6c68b620, - 0x328a4: 0x6c68b820, 0x328a5: 0x6c8ede20, 0x328a6: 0x6c68ba20, 0x328a7: 0x6c68bc20, - 0x328a8: 0x6c68be20, 0x328a9: 0x6c68c020, 0x328aa: 0x6c68c220, 0x328ab: 0x6c7ab620, - 0x328ac: 0x6c68c420, 0x328ad: 0x6c68c620, 0x328ae: 0x6c68c820, 0x328af: 0x6c68ca20, - 0x328b0: 0x6c68cc20, 0x328b1: 0x6c68ce20, 0x328b2: 0x6c68d020, 0x328b3: 0x6c68d220, - 0x328b4: 0x6c68d420, 0x328b5: 0x6c68d620, 0x328b6: 0x6c68d820, 0x328b7: 0x6c68da20, - 0x328b8: 0x6c68dc20, 0x328b9: 0x6c68de20, 0x328ba: 0x6c68e020, 0x328bb: 0x6c68e220, - 0x328bc: 0x6c68e420, 0x328bd: 0x6c68e620, 0x328be: 0x6c68e820, 0x328bf: 0x6c68ea20, - // Block 0xca3, offset 0x328c0 - 0x328c0: 0x6c68ec20, 0x328c1: 0x6c68ee20, 0x328c2: 0x6c68f020, 0x328c3: 0x6c68f220, - 0x328c4: 0x6c68f420, 0x328c5: 0x6c68f620, 0x328c6: 0x6c68f820, 0x328c7: 0x6c68fa20, - 0x328c8: 0x6c68fc20, 0x328c9: 0x6c68fe20, 0x328ca: 0x6c690020, 0x328cb: 0x6c690220, - 0x328cc: 0x6c690420, 0x328cd: 0x6c690620, 0x328ce: 0x6c690820, 0x328cf: 0x6c690a20, - 0x328d0: 0x6c690c20, 0x328d1: 0x6c690e20, 0x328d2: 0x6c691020, 0x328d3: 0x6c691220, - 0x328d4: 0x6c691420, 0x328d5: 0x6c691620, 0x328d6: 0x6c691820, 0x328d7: 0x6c691a20, - 0x328d8: 0x6c691c20, 0x328d9: 0x6c691e20, 0x328da: 0x6c692020, 0x328db: 0x6c692220, - 0x328dc: 0x6c692420, 0x328dd: 0x6c692620, 0x328de: 0x6c692820, 0x328df: 0x6c692a20, - 0x328e0: 0x6c692c20, 0x328e1: 0x6c692e20, 0x328e2: 0x6c693020, 0x328e3: 0x6c693220, - 0x328e4: 0x6c693420, 0x328e5: 0x6c693620, 0x328e6: 0x6c7a1a20, 0x328e7: 0x6c8ee020, - 0x328e8: 0x6c8ee220, 0x328e9: 0x6c8ee420, 0x328ea: 0x6c8ee620, 0x328eb: 0x6c8ee820, - 0x328ec: 0x6c8eea20, 0x328ed: 0x6c8eec20, 0x328ee: 0x6c8eee20, 0x328ef: 0x6c8ef020, - 0x328f0: 0x6c8ef220, 0x328f1: 0x6c8ef420, 0x328f2: 0x6c8ef620, 0x328f3: 0x6c8ef820, - 0x328f4: 0x6c8efa20, 0x328f5: 0x6c8efc20, 0x328f6: 0x6c8efe20, 0x328f7: 0x6c8f0020, - 0x328f8: 0x6c8f0220, 0x328f9: 0x6c8f0420, 0x328fa: 0x6c8f0620, 0x328fb: 0x6c8f0820, - 0x328fc: 0x6c8f0a20, 0x328fd: 0x6c8f0c20, 0x328fe: 0x6c8f0e20, 0x328ff: 0x6c8f1020, - // Block 0xca4, offset 0x32900 - 0x32900: 0x6c8f1220, 0x32901: 0x6c8f1420, 0x32902: 0x6c8f1620, 0x32903: 0x6c8f1820, - 0x32904: 0x6c8f1a20, 0x32905: 0x6c8f1c20, 0x32906: 0x6c8f1e20, 0x32907: 0x6c8f2020, - 0x32908: 0x6c8f2220, 0x32909: 0x6c8f2420, 0x3290a: 0x6c8f2620, 0x3290b: 0x6c8f2820, - 0x3290c: 0x6c8f2a20, 0x3290d: 0x6c8f2c20, 0x3290e: 0x6c8f2e20, 0x3290f: 0x6c8f3020, - 0x32910: 0x6c8f3220, 0x32911: 0x6c8f3420, 0x32912: 0x6c8f3620, 0x32913: 0x6c8f3820, - 0x32914: 0x6c8f3a20, 0x32915: 0x6c8f3c20, 0x32916: 0x6c8f3e20, 0x32917: 0x6c8f4020, - 0x32918: 0x6c8f4220, 0x32919: 0x6c8f4420, 0x3291a: 0x6c8f4620, 0x3291b: 0x6c8f4820, - 0x3291c: 0x6c8f4a20, 0x3291d: 0x6c8f4c20, 0x3291e: 0x6c8f4e20, 0x3291f: 0x6c8f5020, - 0x32920: 0x6c8f5220, 0x32921: 0x6c8f5420, 0x32922: 0x6c8f5620, 0x32923: 0x6c8f5820, - 0x32924: 0x6c8f5a20, 0x32925: 0x6c8f5c20, 0x32926: 0x6c8f5e20, 0x32927: 0x6c8f6020, - 0x32928: 0x6c8f6220, 0x32929: 0x6c8f6420, 0x3292a: 0x6c8f6620, 0x3292b: 0x6c8f6820, - 0x3292c: 0x6c8f6a20, 0x3292d: 0x6c8f6c20, 0x3292e: 0x6c8f6e20, 0x3292f: 0x6c8f7020, - 0x32930: 0x6c8f7220, 0x32931: 0x6c8f7420, 0x32932: 0x6c8f7620, 0x32933: 0x6c8f7820, - 0x32934: 0x6c8f7a20, 0x32935: 0x6c8f7c20, 0x32936: 0x6c8f7e20, 0x32937: 0x6c8f8020, - 0x32938: 0x6c8f8220, 0x32939: 0x6c8f8420, 0x3293a: 0x6c8f8620, 0x3293b: 0x6c8f8820, - 0x3293c: 0x6c8f8a20, 0x3293d: 0x6c8f8c20, 0x3293e: 0x6c8f8e20, 0x3293f: 0x6c8f9020, - // Block 0xca5, offset 0x32940 - 0x32940: 0x6c8f9220, 0x32941: 0x6c8f9420, 0x32942: 0x6c8f9620, 0x32943: 0x6c8f9820, - 0x32944: 0x6c8f9a20, 0x32945: 0x6c8f9c20, 0x32946: 0x6c8f9e20, 0x32947: 0x6c8fa020, - 0x32948: 0x6c8fa220, 0x32949: 0x6c8fa420, 0x3294a: 0x6c8fa620, 0x3294b: 0x6c8fa820, - 0x3294c: 0x6c8faa20, 0x3294d: 0x6c8fac20, 0x3294e: 0x6c8fae20, 0x3294f: 0x6c8fb020, - 0x32950: 0x6c8fb220, 0x32951: 0x6c8fb420, 0x32952: 0x6c8fb620, 0x32953: 0x6c8fb820, - 0x32954: 0x6c8fba20, 0x32955: 0x6c8fbc20, 0x32956: 0x6c8fbe20, 0x32957: 0x6c8fc020, - 0x32958: 0x6c8fc220, 0x32959: 0x6c8fc420, 0x3295a: 0x6c8fc620, 0x3295b: 0x6c8fc820, - 0x3295c: 0x6c8fca20, 0x3295d: 0x6c8fcc20, 0x3295e: 0x6c8fce20, 0x3295f: 0x6c8fd020, - 0x32960: 0x6c8fd220, 0x32961: 0x6c8fd420, 0x32962: 0x6c8fd620, 0x32963: 0x6c8fd820, - 0x32964: 0x6c8fda20, 0x32965: 0x6c8fdc20, 0x32966: 0x6c8fde20, 0x32967: 0x6c8fe020, - 0x32968: 0x6c8fe220, 0x32969: 0x6c8fe420, 0x3296a: 0x6c8fe620, 0x3296b: 0x6c8fe820, - 0x3296c: 0x6c8fea20, 0x3296d: 0x6c8fec20, 0x3296e: 0x6c8fee20, 0x3296f: 0x6c8ff020, - 0x32970: 0x6c8ff220, 0x32971: 0x6c8ff420, 0x32972: 0x6c8ff620, 0x32973: 0x6c8ff820, - 0x32974: 0x6c8ffa20, 0x32975: 0x6c8ffc20, 0x32976: 0x6c8ffe20, 0x32977: 0x6cbb1e20, - 0x32978: 0x6cbb2020, 0x32979: 0x6cbb2220, 0x3297a: 0x6cbb2420, 0x3297b: 0x6cbb2620, - 0x3297c: 0x6cbb2820, 0x3297d: 0x6cbb2a20, 0x3297e: 0x6cbb2c20, 0x3297f: 0x6cbb2e20, - // Block 0xca6, offset 0x32980 - 0x32980: 0x6cbb3020, 0x32981: 0x6cbb3220, 0x32982: 0x6cbb3420, 0x32983: 0x6cbb3620, - 0x32984: 0x6cbb3820, 0x32985: 0x6cbb3a20, 0x32986: 0x6cbb3c20, 0x32987: 0x6cbb3e20, - 0x32988: 0x6cbb4020, 0x32989: 0x6cbb4220, 0x3298a: 0x6cbb4420, 0x3298b: 0x6cbb4620, - 0x3298c: 0x6cbb4820, 0x3298d: 0x6cbb4a20, 0x3298e: 0x6cbb4c20, 0x3298f: 0x6cbb4e20, - 0x32990: 0x6cbb5020, 0x32991: 0x6cbb5220, 0x32992: 0x6cbb5420, 0x32993: 0x6cbb5620, - 0x32994: 0x6cbb5820, 0x32995: 0x6cbb5a20, 0x32996: 0x6cbb5c20, 0x32997: 0x6cbb5e20, - 0x32998: 0x6cbb6020, 0x32999: 0x6cbb6220, 0x3299a: 0x6cbb6420, 0x3299b: 0x6cbb6620, - 0x3299c: 0x6cbb6820, 0x3299d: 0x6cbb6a20, 0x3299e: 0x6cbb6c20, 0x3299f: 0x6cbb6e20, - 0x329a0: 0x6cbb7020, 0x329a1: 0x6cbb7220, 0x329a2: 0x6cebdc20, 0x329a3: 0x6cbb7420, - 0x329a4: 0x6cbb7620, 0x329a5: 0x6cbb7820, 0x329a6: 0x6cbb7a20, 0x329a7: 0x6cbb7c20, - 0x329a8: 0x6cbb7e20, 0x329a9: 0x6cbb8020, 0x329aa: 0x6cbb8220, 0x329ab: 0x6cbb8420, - 0x329ac: 0x6cbb8620, 0x329ad: 0x6cbb8820, 0x329ae: 0x6cbb8a20, 0x329af: 0x6cbb8c20, - 0x329b0: 0x6cbb8e20, 0x329b1: 0x6cbb9020, 0x329b2: 0x6cbb9220, 0x329b3: 0x6cbb9420, - 0x329b4: 0x6cbb9620, 0x329b5: 0x6cbb9820, 0x329b6: 0x6cbb9a20, 0x329b7: 0x6cbb9c20, - 0x329b8: 0x6cbb9e20, 0x329b9: 0x6cbba020, 0x329ba: 0x6cbba220, 0x329bb: 0x6cbba420, - 0x329bc: 0x6cbba620, 0x329bd: 0x6cbba820, 0x329be: 0x6cbbaa20, 0x329bf: 0x6cbbac20, - // Block 0xca7, offset 0x329c0 - 0x329c0: 0x6cbbae20, 0x329c1: 0x6cbbb020, 0x329c2: 0x6cbbb220, 0x329c3: 0x6cbbb420, - 0x329c4: 0x6cbbb620, 0x329c5: 0x6cbbb820, 0x329c6: 0x6cbbba20, 0x329c7: 0x6cbbbc20, - 0x329c8: 0x6cbbbe20, 0x329c9: 0x6cbbc020, 0x329ca: 0x6cbbc220, 0x329cb: 0x6cbbc420, - 0x329cc: 0x6cbbc620, 0x329cd: 0x6cbbc820, 0x329ce: 0x6cbbca20, 0x329cf: 0x6cbbcc20, - 0x329d0: 0x6cbbce20, 0x329d1: 0x6cbbd020, 0x329d2: 0x6cbbd220, 0x329d3: 0x6cbbd420, - 0x329d4: 0x6cbbd620, 0x329d5: 0x6cbbd820, 0x329d6: 0x6cbbda20, 0x329d7: 0x6cbbdc20, - 0x329d8: 0x6cbbde20, 0x329d9: 0x6cbbe020, 0x329da: 0x6cbbe220, 0x329db: 0x6cbbe420, - 0x329dc: 0x6cbbe620, 0x329dd: 0x6cbbe820, 0x329de: 0x6cbbea20, 0x329df: 0x6cbbec20, - 0x329e0: 0x6cbbee20, 0x329e1: 0x6cbbf020, 0x329e2: 0x6cbbf220, 0x329e3: 0x6cbbf420, - 0x329e4: 0x6cbbf620, 0x329e5: 0x6cbbf820, 0x329e6: 0x6cbbfa20, 0x329e7: 0x6cbbfc20, - 0x329e8: 0x6cbbfe20, 0x329e9: 0x6cbc0020, 0x329ea: 0x6cbc0220, 0x329eb: 0x6cbc0420, - 0x329ec: 0x6cbc0620, 0x329ed: 0x6cbc0820, 0x329ee: 0x6cbc0a20, 0x329ef: 0x6cbc0c20, - 0x329f0: 0x6cbc0e20, 0x329f1: 0x6cbc1020, 0x329f2: 0x6cbc1220, 0x329f3: 0x6cbc1420, - 0x329f4: 0x6cbc1620, 0x329f5: 0x6cbc1820, 0x329f6: 0x6cebde20, 0x329f7: 0x6cebe020, - 0x329f8: 0x6cebe220, 0x329f9: 0x6cebe420, 0x329fa: 0x6cebe620, 0x329fb: 0x6cbc1a20, - 0x329fc: 0x6cbc1c20, 0x329fd: 0x6cbc1e20, 0x329fe: 0x6cbc2020, 0x329ff: 0x6cebe820, - // Block 0xca8, offset 0x32a00 - 0x32a00: 0x6cebea20, 0x32a01: 0x6cebec20, 0x32a02: 0x6cebee20, 0x32a03: 0x6cebf020, - 0x32a04: 0x6cebf220, 0x32a05: 0x6cebf420, 0x32a06: 0x6cebf620, 0x32a07: 0x6cebf820, - 0x32a08: 0x6cebfa20, 0x32a09: 0x6cebfc20, 0x32a0a: 0x6cebfe20, 0x32a0b: 0x6cec0020, - 0x32a0c: 0x6cec0220, 0x32a0d: 0x6cec0420, 0x32a0e: 0x6cec0620, 0x32a0f: 0x6cec0820, - 0x32a10: 0x6cec0a20, 0x32a11: 0x6cec0c20, 0x32a12: 0x6cec0e20, 0x32a13: 0x6cec1020, - 0x32a14: 0x6cec1220, 0x32a15: 0x6cec1420, 0x32a16: 0x6cec1620, 0x32a17: 0x6cec1820, - 0x32a18: 0x6cec1a20, 0x32a19: 0x6cec1c20, 0x32a1a: 0x6cec1e20, 0x32a1b: 0x6cec2020, - 0x32a1c: 0x6cec2220, 0x32a1d: 0x6cec2420, 0x32a1e: 0x6cec2620, 0x32a1f: 0x6cec2820, - 0x32a20: 0x6cec2a20, 0x32a21: 0x6cec2c20, 0x32a22: 0x6cec2e20, 0x32a23: 0x6cec3020, - 0x32a24: 0x6cec3220, 0x32a25: 0x6cec3420, 0x32a26: 0x6cec3620, 0x32a27: 0x6cec3820, - 0x32a28: 0x6cec3a20, 0x32a29: 0x6cec3c20, 0x32a2a: 0x6cec3e20, 0x32a2b: 0x6cec4020, - 0x32a2c: 0x6cec4220, 0x32a2d: 0x6cec4420, 0x32a2e: 0x6cec4620, 0x32a2f: 0x6cec4820, - 0x32a30: 0x6d49ce20, 0x32a31: 0x6d49d020, 0x32a32: 0x6d49d220, 0x32a33: 0x6cec4a20, - 0x32a34: 0x6cec4c20, 0x32a35: 0x6cec4e20, 0x32a36: 0x6cec5020, 0x32a37: 0x6cec5220, - 0x32a38: 0x6cec5420, 0x32a39: 0x6cec5620, 0x32a3a: 0x6cec5820, 0x32a3b: 0x6cec5a20, - 0x32a3c: 0x6cec5c20, 0x32a3d: 0x6cec5e20, 0x32a3e: 0x6cec6020, 0x32a3f: 0x6cec6220, - // Block 0xca9, offset 0x32a40 - 0x32a40: 0x6cec6420, 0x32a41: 0x6cec6620, 0x32a42: 0x6cec6820, 0x32a43: 0x6cec6a20, - 0x32a44: 0x6cec6c20, 0x32a45: 0x6cec6e20, 0x32a46: 0x6cec7020, 0x32a47: 0x6cec7220, - 0x32a48: 0x6cec7420, 0x32a49: 0x6cec7620, 0x32a4a: 0x6cec7820, 0x32a4b: 0x6cec7a20, - 0x32a4c: 0x6cec7c20, 0x32a4d: 0x6cec7e20, 0x32a4e: 0x6cec8020, 0x32a4f: 0x6cec8220, - 0x32a50: 0x6cec8420, 0x32a51: 0x6cec8620, 0x32a52: 0x6cec8820, 0x32a53: 0x6cec8a20, - 0x32a54: 0x6cec8c20, 0x32a55: 0x6cec8e20, 0x32a56: 0x6cec9020, 0x32a57: 0x6cec9220, - 0x32a58: 0x6cec9420, 0x32a59: 0x6cec9620, 0x32a5a: 0x6cec9820, 0x32a5b: 0x6cec9a20, - 0x32a5c: 0x6cec9c20, 0x32a5d: 0x6cec9e20, 0x32a5e: 0x6ceca020, 0x32a5f: 0x6ceca220, - 0x32a60: 0x6ceca420, 0x32a61: 0x6ceca620, 0x32a62: 0x6ceca820, 0x32a63: 0x6cecaa20, - 0x32a64: 0x6cecac20, 0x32a65: 0x6cecae20, 0x32a66: 0x6cecb020, 0x32a67: 0x6cecb220, - 0x32a68: 0x6cecb420, 0x32a69: 0x6cecb620, 0x32a6a: 0x6cecb820, 0x32a6b: 0x6cecba20, - 0x32a6c: 0x6cecbc20, 0x32a6d: 0x6cecbe20, 0x32a6e: 0x6cecc020, 0x32a6f: 0x6cecc220, - 0x32a70: 0x6cecc420, 0x32a71: 0x6cecc620, 0x32a72: 0x6cecc820, 0x32a73: 0x6cecca20, - 0x32a74: 0x6ceccc20, 0x32a75: 0x6cecce20, 0x32a76: 0x6cecd020, 0x32a77: 0x6cecd220, - 0x32a78: 0x6cecd420, 0x32a79: 0x6cecd620, 0x32a7a: 0x6cecd820, 0x32a7b: 0x6cecda20, - 0x32a7c: 0x6cecdc20, 0x32a7d: 0x6cecde20, 0x32a7e: 0x6cece020, 0x32a7f: 0x6cece220, - // Block 0xcaa, offset 0x32a80 - 0x32a80: 0x6cece420, 0x32a81: 0x6cece620, 0x32a82: 0x6cece820, 0x32a83: 0x6cecea20, - 0x32a84: 0x6cecec20, 0x32a85: 0x6cecee20, 0x32a86: 0x6cecf020, 0x32a87: 0x6cecf220, - 0x32a88: 0x6cecf420, 0x32a89: 0x6cecf620, 0x32a8a: 0x6cecf820, 0x32a8b: 0x6cecfa20, - 0x32a8c: 0x6cecfc20, 0x32a8d: 0x6cecfe20, 0x32a8e: 0x6ced0020, 0x32a8f: 0x6ced0220, - 0x32a90: 0x6ced0420, 0x32a91: 0x6ced0620, 0x32a92: 0x6ced0820, 0x32a93: 0x6ced0a20, - 0x32a94: 0x6d1bb620, 0x32a95: 0x6d1bb820, 0x32a96: 0x6d1bba20, 0x32a97: 0x6d1bbc20, - 0x32a98: 0x6d1bbe20, 0x32a99: 0x6d1bc020, 0x32a9a: 0x6d1bc220, 0x32a9b: 0x6d1bc420, - 0x32a9c: 0x6d1bc620, 0x32a9d: 0x6d1bc820, 0x32a9e: 0x6d1bca20, 0x32a9f: 0x6d1bcc20, - 0x32aa0: 0x6d1bce20, 0x32aa1: 0x6d1bd020, 0x32aa2: 0x6d1bd220, 0x32aa3: 0x6d1bd420, - 0x32aa4: 0x6d1bd620, 0x32aa5: 0x6d1bd820, 0x32aa6: 0x6d1bda20, 0x32aa7: 0x6d1bdc20, - 0x32aa8: 0x6d1bde20, 0x32aa9: 0x6d1be020, 0x32aaa: 0x6d1be220, 0x32aab: 0x6d1be420, - 0x32aac: 0x6d1be620, 0x32aad: 0x6d1be820, 0x32aae: 0x6d1bea20, 0x32aaf: 0x6d1bec20, - 0x32ab0: 0x6d1bee20, 0x32ab1: 0x6d1bf020, 0x32ab2: 0x6d1bf220, 0x32ab3: 0x6d1bf420, - 0x32ab4: 0x6d1bf620, 0x32ab5: 0x6d1bf820, 0x32ab6: 0x6d1bfa20, 0x32ab7: 0x6d1bfc20, - 0x32ab8: 0x6d1bfe20, 0x32ab9: 0x6d1c0020, 0x32aba: 0x6d1c0220, 0x32abb: 0x6d1c0420, - 0x32abc: 0x6d1c0620, 0x32abd: 0x6d1c0820, 0x32abe: 0x6d1c0a20, 0x32abf: 0x6d1c0c20, - // Block 0xcab, offset 0x32ac0 - 0x32ac0: 0x6d1c0e20, 0x32ac1: 0x6d1c1020, 0x32ac2: 0x6d1c1220, 0x32ac3: 0x6d1c1420, - 0x32ac4: 0x6d1c1620, 0x32ac5: 0x6d1c1820, 0x32ac6: 0x6d1c1a20, 0x32ac7: 0x6d1c1c20, - 0x32ac8: 0x6d1c1e20, 0x32ac9: 0x6d1c2020, 0x32aca: 0x6d1c2220, 0x32acb: 0x6d1c2420, - 0x32acc: 0x6d1c2620, 0x32acd: 0x6d1c2820, 0x32ace: 0x6d1c2a20, 0x32acf: 0x6d1c2c20, - 0x32ad0: 0x6d1c2e20, 0x32ad1: 0x6d1c3020, 0x32ad2: 0x6d1c3220, 0x32ad3: 0x6d1c3420, - 0x32ad4: 0x6d1c3620, 0x32ad5: 0x6d1c3820, 0x32ad6: 0x6d1c3a20, 0x32ad7: 0x6d1c3c20, - 0x32ad8: 0x6d1c3e20, 0x32ad9: 0x6d1c4020, 0x32ada: 0x6d1c4220, 0x32adb: 0x6d1c4420, - 0x32adc: 0x6d1c4620, 0x32add: 0x6d1c4820, 0x32ade: 0x6d1c4a20, 0x32adf: 0x6d1c4c20, - 0x32ae0: 0x6d1c4e20, 0x32ae1: 0x6d1c5020, 0x32ae2: 0x6d1c5220, 0x32ae3: 0x6d1c5420, - 0x32ae4: 0x6d1c5620, 0x32ae5: 0x6d1c5820, 0x32ae6: 0x6d1c5a20, 0x32ae7: 0x6d1c5c20, - 0x32ae8: 0x6d1c5e20, 0x32ae9: 0x6d1c6020, 0x32aea: 0x6d1c6220, 0x32aeb: 0x6d1c6420, - 0x32aec: 0x6d1c6620, 0x32aed: 0x6d1c6820, 0x32aee: 0x6d1c6a20, 0x32aef: 0x6d1c6c20, - 0x32af0: 0x6d1c6e20, 0x32af1: 0x6d1c7020, 0x32af2: 0x6d1c7220, 0x32af3: 0x6d1c7420, - 0x32af4: 0x6d1c7620, 0x32af5: 0x6d1c7820, 0x32af6: 0x6d1c7a20, 0x32af7: 0x6d1c7c20, - 0x32af8: 0x6d1c7e20, 0x32af9: 0x6d1c8020, 0x32afa: 0x6d1c8220, 0x32afb: 0x6d1c8420, - 0x32afc: 0x6d1c8620, 0x32afd: 0x6d1c8820, 0x32afe: 0x6d1c8a20, 0x32aff: 0x6d1c8c20, - // Block 0xcac, offset 0x32b00 - 0x32b00: 0x6d1c8e20, 0x32b01: 0x6d1c9020, 0x32b02: 0x6d1c9220, 0x32b03: 0x6d1c9420, - 0x32b04: 0x6d1c9620, 0x32b05: 0x6d1c9820, 0x32b06: 0x6d1c9a20, 0x32b07: 0x6d1c9c20, - 0x32b08: 0x6d1c9e20, 0x32b09: 0x6d1ca020, 0x32b0a: 0x6d1ca220, 0x32b0b: 0x6d1ca420, - 0x32b0c: 0x6d1ca620, 0x32b0d: 0x6d1ca820, 0x32b0e: 0x6d1caa20, 0x32b0f: 0x6d1cac20, - 0x32b10: 0x6d1cae20, 0x32b11: 0x6d1cb020, 0x32b12: 0x6d1cb220, 0x32b13: 0x6d1cb420, - 0x32b14: 0x6d1cb620, 0x32b15: 0x6d1cb820, 0x32b16: 0x6d1cba20, 0x32b17: 0x6d1cbc20, - 0x32b18: 0x6d1cbe20, 0x32b19: 0x6d1cc020, 0x32b1a: 0x6d1cc220, 0x32b1b: 0x6d1cc420, - 0x32b1c: 0x6d1cc620, 0x32b1d: 0x6d1cc820, 0x32b1e: 0x6d1cca20, 0x32b1f: 0x6d1ccc20, - 0x32b20: 0x6d1cce20, 0x32b21: 0x6d49d420, 0x32b22: 0x6d49d620, 0x32b23: 0x6d49d820, - 0x32b24: 0x6d49da20, 0x32b25: 0x6d49dc20, 0x32b26: 0x6d49de20, 0x32b27: 0x6d49e020, - 0x32b28: 0x6d49e220, 0x32b29: 0x6d49e420, 0x32b2a: 0x6d49e620, 0x32b2b: 0x6d49e820, - 0x32b2c: 0x6d49ea20, 0x32b2d: 0x6d49ec20, 0x32b2e: 0x6d49ee20, 0x32b2f: 0x6d49f020, - 0x32b30: 0x6d49f220, 0x32b31: 0x6d49f420, 0x32b32: 0x6d49f620, 0x32b33: 0x6d49f820, - 0x32b34: 0x6d49fa20, 0x32b35: 0x6d49fc20, 0x32b36: 0x6d49fe20, 0x32b37: 0x6d4a0020, - 0x32b38: 0x6d4a0220, 0x32b39: 0x6d4a0420, 0x32b3a: 0x6d4a0620, 0x32b3b: 0x6d4a0820, - 0x32b3c: 0x6d4a0a20, 0x32b3d: 0x6d4a0c20, 0x32b3e: 0x6d4a0e20, 0x32b3f: 0x6d4a1020, - // Block 0xcad, offset 0x32b40 - 0x32b40: 0x6d4a1220, 0x32b41: 0x6d4a1420, 0x32b42: 0x6d4a1620, 0x32b43: 0x6d4a1820, - 0x32b44: 0x6d4a1a20, 0x32b45: 0x6d4a1c20, 0x32b46: 0x6d4a1e20, 0x32b47: 0x6d4a2020, - 0x32b48: 0x6d4a2220, 0x32b49: 0x6d4a2420, 0x32b4a: 0x6d4a2620, 0x32b4b: 0x6d4a2820, - 0x32b4c: 0x6d4a2a20, 0x32b4d: 0x6d4a2c20, 0x32b4e: 0x6d4a2e20, 0x32b4f: 0x6d4a3020, - 0x32b50: 0x6d4a3220, 0x32b51: 0x6d4a3420, 0x32b52: 0x6d4a3620, 0x32b53: 0x6d4a3820, - 0x32b54: 0x6d4a3a20, 0x32b55: 0x6d4a3c20, 0x32b56: 0x6d4a3e20, 0x32b57: 0x6d4a4020, - 0x32b58: 0x6d4a4220, 0x32b59: 0x6d4a4420, 0x32b5a: 0x6d4a4620, 0x32b5b: 0x6d4a4820, - 0x32b5c: 0x6d4a4a20, 0x32b5d: 0x6d4a4c20, 0x32b5e: 0x6d4a4e20, 0x32b5f: 0x6d4a5020, - 0x32b60: 0x6d4a5220, 0x32b61: 0x6d4a5420, 0x32b62: 0x6d4a5620, 0x32b63: 0x6d4a5820, - 0x32b64: 0x6d4a5a20, 0x32b65: 0x6d4a5c20, 0x32b66: 0x6d4a5e20, 0x32b67: 0x6d311620, - 0x32b68: 0x6d4a6020, 0x32b69: 0x6d4a6220, 0x32b6a: 0x6d4a6420, 0x32b6b: 0x6d4a6620, - 0x32b6c: 0x6d4a6820, 0x32b6d: 0x6d4a6a20, 0x32b6e: 0x6d4a6c20, 0x32b6f: 0x6d4a6e20, - 0x32b70: 0x6d4a7020, 0x32b71: 0x6d4a7220, 0x32b72: 0x6d4a7420, 0x32b73: 0x6d4a7620, - 0x32b74: 0x6d4a7820, 0x32b75: 0x6d4a7a20, 0x32b76: 0x6d4a7c20, 0x32b77: 0x6d4a7e20, - 0x32b78: 0x6d4a8020, 0x32b79: 0x6d4a8220, 0x32b7a: 0x6d4a8420, 0x32b7b: 0x6d4a8620, - 0x32b7c: 0x6d4a8820, 0x32b7d: 0x6d4a8a20, 0x32b7e: 0x6d4a8c20, 0x32b7f: 0x6d4a8e20, - // Block 0xcae, offset 0x32b80 - 0x32b80: 0x6d4a9020, 0x32b81: 0x6d4a9220, 0x32b82: 0x6d4a9420, 0x32b83: 0x6d4a9620, - 0x32b84: 0x6d4a9820, 0x32b85: 0x6d4a9a20, 0x32b86: 0x6d4a9c20, 0x32b87: 0x6d775e20, - 0x32b88: 0x6d776020, 0x32b89: 0x6d776220, 0x32b8a: 0x6d776420, 0x32b8b: 0x6d776620, - 0x32b8c: 0x6d776820, 0x32b8d: 0x6d776a20, 0x32b8e: 0x6d776c20, 0x32b8f: 0x6d776e20, - 0x32b90: 0x6d777020, 0x32b91: 0x6d777220, 0x32b92: 0x6d777420, 0x32b93: 0x6d777620, - 0x32b94: 0x6d777820, 0x32b95: 0x6d777a20, 0x32b96: 0x6d777c20, 0x32b97: 0x6d777e20, - 0x32b98: 0x6d778020, 0x32b99: 0x6d778220, 0x32b9a: 0x6d778420, 0x32b9b: 0x6d778620, - 0x32b9c: 0x6d778820, 0x32b9d: 0x6d778a20, 0x32b9e: 0x6d778c20, 0x32b9f: 0x6d778e20, - 0x32ba0: 0x6d779020, 0x32ba1: 0x6d779220, 0x32ba2: 0x6d779420, 0x32ba3: 0x6d779620, - 0x32ba4: 0x6d779820, 0x32ba5: 0x6d779a20, 0x32ba6: 0x6d779c20, 0x32ba7: 0x6d779e20, - 0x32ba8: 0x6d77a020, 0x32ba9: 0x6d77a220, 0x32baa: 0x6d77a420, 0x32bab: 0x6d77a620, - 0x32bac: 0x6d77a820, 0x32bad: 0x6d77aa20, 0x32bae: 0x6d77ac20, 0x32baf: 0x6d77ae20, - 0x32bb0: 0x6d77b020, 0x32bb1: 0x6d77b220, 0x32bb2: 0x6d77b420, 0x32bb3: 0x6d77b620, - 0x32bb4: 0x6d77b820, 0x32bb5: 0x6d77ba20, 0x32bb6: 0x6d77bc20, 0x32bb7: 0x6d77be20, - 0x32bb8: 0x6d77c020, 0x32bb9: 0x6d77c220, 0x32bba: 0x6d77c420, 0x32bbb: 0x6d77c620, - 0x32bbc: 0x6d77c820, 0x32bbd: 0x6d77ca20, 0x32bbe: 0x6d77cc20, 0x32bbf: 0x6d77ce20, - // Block 0xcaf, offset 0x32bc0 - 0x32bc0: 0x6d77d020, 0x32bc1: 0x6d77d220, 0x32bc2: 0x6d77d420, 0x32bc3: 0x6d77d620, - 0x32bc4: 0x6d77d820, 0x32bc5: 0x6d77da20, 0x32bc6: 0x6d77dc20, 0x32bc7: 0x6d77de20, - 0x32bc8: 0x6d77e020, 0x32bc9: 0x6d77e220, 0x32bca: 0x6d77e420, 0x32bcb: 0x6d77e620, - 0x32bcc: 0x6d77e820, 0x32bcd: 0x6d77ea20, 0x32bce: 0x6d77ec20, 0x32bcf: 0x6d77ee20, - 0x32bd0: 0x6d77f020, 0x32bd1: 0x6d77f220, 0x32bd2: 0x6d77f420, 0x32bd3: 0x6d77f620, - 0x32bd4: 0x6d4a9e20, 0x32bd5: 0x6d77f820, 0x32bd6: 0x6d77fa20, 0x32bd7: 0x6d77fc20, - 0x32bd8: 0x6d77fe20, 0x32bd9: 0x6d780020, 0x32bda: 0x6d780220, 0x32bdb: 0x6d780420, - 0x32bdc: 0x6d780620, 0x32bdd: 0x6d780820, 0x32bde: 0x6d780a20, 0x32bdf: 0x6d780c20, - 0x32be0: 0x6d780e20, 0x32be1: 0x6d781020, 0x32be2: 0x6d781220, 0x32be3: 0x6d781420, - 0x32be4: 0x6d781620, 0x32be5: 0x6d781820, 0x32be6: 0x6d4aa020, 0x32be7: 0x6d781a20, - 0x32be8: 0x6d781c20, 0x32be9: 0x6d781e20, 0x32bea: 0x6d782020, 0x32beb: 0x6d782220, - 0x32bec: 0x6d782420, 0x32bed: 0x6d782620, 0x32bee: 0x6d782820, 0x32bef: 0x6d782a20, - 0x32bf0: 0x6d782c20, 0x32bf1: 0x6d782e20, 0x32bf2: 0x6d783020, 0x32bf3: 0x6d783220, - 0x32bf4: 0x6d783420, 0x32bf5: 0x6d783620, 0x32bf6: 0x6d783820, 0x32bf7: 0x6d783a20, - 0x32bf8: 0x6d783c20, 0x32bf9: 0x6d783e20, 0x32bfa: 0x6d784020, 0x32bfb: 0x6d784220, - 0x32bfc: 0x6d784420, 0x32bfd: 0x6da0d020, 0x32bfe: 0x6da0d220, 0x32bff: 0x6da0d420, - // Block 0xcb0, offset 0x32c00 - 0x32c00: 0x6da0d620, 0x32c01: 0x6da0d820, 0x32c02: 0x6da0da20, 0x32c03: 0x6da0dc20, - 0x32c04: 0x6da0de20, 0x32c05: 0x6da0e020, 0x32c06: 0x6da0e220, 0x32c07: 0x6da0e420, - 0x32c08: 0x6da0e620, 0x32c09: 0x6da0e820, 0x32c0a: 0x6da0ea20, 0x32c0b: 0x6da0ec20, - 0x32c0c: 0x6da0ee20, 0x32c0d: 0x6da0f020, 0x32c0e: 0x6da0f220, 0x32c0f: 0x6da0f420, - 0x32c10: 0x6da0f620, 0x32c11: 0x6da0f820, 0x32c12: 0x6da0fa20, 0x32c13: 0x6da0fc20, - 0x32c14: 0x6da0fe20, 0x32c15: 0x6da10020, 0x32c16: 0x6da10220, 0x32c17: 0x6da10420, - 0x32c18: 0x6da10620, 0x32c19: 0x6da10820, 0x32c1a: 0x6da10a20, 0x32c1b: 0x6da10c20, - 0x32c1c: 0x6da10e20, 0x32c1d: 0x6da11020, 0x32c1e: 0x6da11220, 0x32c1f: 0x6da11420, - 0x32c20: 0x6da11620, 0x32c21: 0x6da11820, 0x32c22: 0x6da11a20, 0x32c23: 0x6da11c20, - 0x32c24: 0x6da11e20, 0x32c25: 0x6da12020, 0x32c26: 0x6da12220, 0x32c27: 0x6da12420, - 0x32c28: 0x6da12620, 0x32c29: 0x6da12820, 0x32c2a: 0x6da12a20, 0x32c2b: 0x6da12c20, - 0x32c2c: 0x6da12e20, 0x32c2d: 0x6da13020, 0x32c2e: 0x6da13220, 0x32c2f: 0x6da13420, - 0x32c30: 0x6da13620, 0x32c31: 0x6da13820, 0x32c32: 0x6da13a20, 0x32c33: 0x6da13c20, - 0x32c34: 0x6da13e20, 0x32c35: 0x6da14020, 0x32c36: 0x6da14220, 0x32c37: 0x6da14420, - 0x32c38: 0x6da14620, 0x32c39: 0x6da14820, 0x32c3a: 0x6da14a20, 0x32c3b: 0x6da14c20, - 0x32c3c: 0x6da14e20, 0x32c3d: 0x6da15020, 0x32c3e: 0x6da15220, 0x32c3f: 0x6da15420, - // Block 0xcb1, offset 0x32c40 - 0x32c40: 0x6da15620, 0x32c41: 0x6da15820, 0x32c42: 0x6da15a20, 0x32c43: 0x6da15c20, - 0x32c44: 0x6da15e20, 0x32c45: 0x6da16020, 0x32c46: 0x6da16220, 0x32c47: 0x6da16420, - 0x32c48: 0x6da16620, 0x32c49: 0x6da16820, 0x32c4a: 0x6da16a20, 0x32c4b: 0x6da16c20, - 0x32c4c: 0x6da16e20, 0x32c4d: 0x6da17020, 0x32c4e: 0x6da17220, 0x32c4f: 0x6dc32a20, - 0x32c50: 0x6dc32c20, 0x32c51: 0x6dc32e20, 0x32c52: 0x6dc33020, 0x32c53: 0x6dc33220, - 0x32c54: 0x6dc33420, 0x32c55: 0x6dc33620, 0x32c56: 0x6dc33820, 0x32c57: 0x6dc33a20, - 0x32c58: 0x6dc33c20, 0x32c59: 0x6dc33e20, 0x32c5a: 0x6dc34020, 0x32c5b: 0x6dc34220, - 0x32c5c: 0x6dc34420, 0x32c5d: 0x6dc34620, 0x32c5e: 0x6dc34820, 0x32c5f: 0x6dc34a20, - 0x32c60: 0x6dc34c20, 0x32c61: 0x6dc34e20, 0x32c62: 0x6dc35020, 0x32c63: 0x6dc35220, - 0x32c64: 0x6dc35420, 0x32c65: 0x6dc35620, 0x32c66: 0x6dc35820, 0x32c67: 0x6dc35a20, - 0x32c68: 0x6dc35c20, 0x32c69: 0x6dc35e20, 0x32c6a: 0x6dc36020, 0x32c6b: 0x6dc36220, - 0x32c6c: 0x6dc36420, 0x32c6d: 0x6dc36620, 0x32c6e: 0x6dc36820, 0x32c6f: 0x6dc36a20, - 0x32c70: 0x6dc36c20, 0x32c71: 0x6dc36e20, 0x32c72: 0x6dc37020, 0x32c73: 0x6dc37220, - 0x32c74: 0x6dc37420, 0x32c75: 0x6dc37620, 0x32c76: 0x6dc37820, 0x32c77: 0x6dc37a20, - 0x32c78: 0x6dc37c20, 0x32c79: 0x6dc37e20, 0x32c7a: 0x6dc38020, 0x32c7b: 0x6dc38220, - 0x32c7c: 0x6dc38420, 0x32c7d: 0x6dc38620, 0x32c7e: 0x6dc38820, 0x32c7f: 0x6dc38a20, - // Block 0xcb2, offset 0x32c80 - 0x32c80: 0x6dc38c20, 0x32c81: 0x6dc38e20, 0x32c82: 0x6dc39020, 0x32c83: 0x6dc39220, - 0x32c84: 0x6dc39420, 0x32c85: 0x6dc39620, 0x32c86: 0x6dc39820, 0x32c87: 0x6dc39a20, - 0x32c88: 0x6dc39c20, 0x32c89: 0x6dc39e20, 0x32c8a: 0x6dc3a020, 0x32c8b: 0x6dc3a220, - 0x32c8c: 0x6dc3a420, 0x32c8d: 0x6dc3a620, 0x32c8e: 0x6dc3a820, 0x32c8f: 0x6dc3aa20, - 0x32c90: 0x6dc3ac20, 0x32c91: 0x6dc3ae20, 0x32c92: 0x6dc3b020, 0x32c93: 0x6dc3b220, - 0x32c94: 0x6dc3b420, 0x32c95: 0x6dc3b620, 0x32c96: 0x6dc3b820, 0x32c97: 0x6dc3ba20, - 0x32c98: 0x6dc3bc20, 0x32c99: 0x6dc3be20, 0x32c9a: 0x6dc3c020, 0x32c9b: 0x6dc3c220, - 0x32c9c: 0x6dc3c420, 0x32c9d: 0x6dc3c620, 0x32c9e: 0x6dc3c820, 0x32c9f: 0x6dc3ca20, - 0x32ca0: 0x6de09a20, 0x32ca1: 0x6de09c20, 0x32ca2: 0x6de09e20, 0x32ca3: 0x6de0a020, - 0x32ca4: 0x6de0a220, 0x32ca5: 0x6de0a420, 0x32ca6: 0x6de0a620, 0x32ca7: 0x6de0a820, - 0x32ca8: 0x6de0aa20, 0x32ca9: 0x6de0ac20, 0x32caa: 0x6de0ae20, 0x32cab: 0x6de0b020, - 0x32cac: 0x6de0b220, 0x32cad: 0x6de0b420, 0x32cae: 0x6de0b620, 0x32caf: 0x6de0b820, - 0x32cb0: 0x6dc3cc20, 0x32cb1: 0x6de0ba20, 0x32cb2: 0x6de0bc20, 0x32cb3: 0x6de0be20, - 0x32cb4: 0x6de0c020, 0x32cb5: 0x6de0c220, 0x32cb6: 0x6de0c420, 0x32cb7: 0x6de0c620, - 0x32cb8: 0x6de0c820, 0x32cb9: 0x6de0ca20, 0x32cba: 0x6de0cc20, 0x32cbb: 0x6de0ce20, - 0x32cbc: 0x6de0d020, 0x32cbd: 0x6de0d220, 0x32cbe: 0x6de0d420, 0x32cbf: 0x6de0d620, - // Block 0xcb3, offset 0x32cc0 - 0x32cc0: 0x6de0d820, 0x32cc1: 0x6de0da20, 0x32cc2: 0x6de0dc20, 0x32cc3: 0x6de0de20, - 0x32cc4: 0x6de0e020, 0x32cc5: 0x6de0e220, 0x32cc6: 0x6de0e420, 0x32cc7: 0x6de0e620, - 0x32cc8: 0x6de0e820, 0x32cc9: 0x6de5dc20, 0x32cca: 0x6de0ea20, 0x32ccb: 0x6de0ec20, - 0x32ccc: 0x6de0ee20, 0x32ccd: 0x6de0f020, 0x32cce: 0x6de0f220, 0x32ccf: 0x6de0f420, - 0x32cd0: 0x6de0f620, 0x32cd1: 0x6df8e220, 0x32cd2: 0x6df8e420, 0x32cd3: 0x6df8e620, - 0x32cd4: 0x6df8e820, 0x32cd5: 0x6df8ea20, 0x32cd6: 0x6df8ec20, 0x32cd7: 0x6df8ee20, - 0x32cd8: 0x6df8f020, 0x32cd9: 0x6df8f220, 0x32cda: 0x6df8f420, 0x32cdb: 0x6df8f620, - 0x32cdc: 0x6df8f820, 0x32cdd: 0x6df8fa20, 0x32cde: 0x6df8fc20, 0x32cdf: 0x6df8fe20, - 0x32ce0: 0x6df90020, 0x32ce1: 0x6df90220, 0x32ce2: 0x6df90420, 0x32ce3: 0x6df90620, - 0x32ce4: 0x6df90820, 0x32ce5: 0x6df90a20, 0x32ce6: 0x6df90c20, 0x32ce7: 0x6df90e20, - 0x32ce8: 0x6df91020, 0x32ce9: 0x6df91220, 0x32cea: 0x6df91420, 0x32ceb: 0x6df91620, - 0x32cec: 0x6df91820, 0x32ced: 0x6df91a20, 0x32cee: 0x6df91c20, 0x32cef: 0x6df91e20, - 0x32cf0: 0x6df92020, 0x32cf1: 0x6e0cac20, 0x32cf2: 0x6e0cae20, 0x32cf3: 0x6e0cb020, - 0x32cf4: 0x6e0cb220, 0x32cf5: 0x6e0cb420, 0x32cf6: 0x6e0cb620, 0x32cf7: 0x6e0cb820, - 0x32cf8: 0x6e0cba20, 0x32cf9: 0x6e0cbc20, 0x32cfa: 0x6e0cbe20, 0x32cfb: 0x6e0cc020, - 0x32cfc: 0x6e0cc220, 0x32cfd: 0x6e0cc420, 0x32cfe: 0x6e0cc620, 0x32cff: 0x6e0cc820, - // Block 0xcb4, offset 0x32d00 - 0x32d00: 0x6e0cca20, 0x32d01: 0x6e0ccc20, 0x32d02: 0x6e0cce20, 0x32d03: 0x6e0cd020, - 0x32d04: 0x6e0cd220, 0x32d05: 0x6e0cd420, 0x32d06: 0x6e0cd620, 0x32d07: 0x6e0cd820, - 0x32d08: 0x6e0cda20, 0x32d09: 0x6e0cdc20, 0x32d0a: 0x6e0cde20, 0x32d0b: 0x6e0ce020, - 0x32d0c: 0x6e0ce220, 0x32d0d: 0x6e0ce420, 0x32d0e: 0x6e0ce620, 0x32d0f: 0x6e0ce820, - 0x32d10: 0x6e0cea20, 0x32d11: 0x6e0cec20, 0x32d12: 0x6e0cee20, 0x32d13: 0x6e0cf020, - 0x32d14: 0x6e0cf220, 0x32d15: 0x6e0d1c20, 0x32d16: 0x6e121420, 0x32d17: 0x6e1c4020, - 0x32d18: 0x6e1c4220, 0x32d19: 0x6e1c4420, 0x32d1a: 0x6e1c4620, 0x32d1b: 0x6e1c4820, - 0x32d1c: 0x6e1c4a20, 0x32d1d: 0x6e1c4c20, 0x32d1e: 0x6e1c4e20, 0x32d1f: 0x6e1c5020, - 0x32d20: 0x6e1c5220, 0x32d21: 0x6e1c5420, 0x32d22: 0x6e1c5620, 0x32d23: 0x6e0cf420, - 0x32d24: 0x6e1c5820, 0x32d25: 0x6e1c5a20, 0x32d26: 0x6e1c5c20, 0x32d27: 0x6e1c5e20, - 0x32d28: 0x6e1c6020, 0x32d29: 0x6e1c6220, 0x32d2a: 0x6e1c6420, 0x32d2b: 0x6e1c6620, - 0x32d2c: 0x6e1c6820, 0x32d2d: 0x6e1c6a20, 0x32d2e: 0x6e1c6c20, 0x32d2f: 0x6e1c6e20, - 0x32d30: 0x6e287c20, 0x32d31: 0x6e287e20, 0x32d32: 0x6e288020, 0x32d33: 0x6e288220, - 0x32d34: 0x6e288420, 0x32d35: 0x6e288620, 0x32d36: 0x6e288820, 0x32d37: 0x6e288a20, - 0x32d38: 0x6e288c20, 0x32d39: 0x6e31a420, 0x32d3a: 0x6e31a620, 0x32d3b: 0x6e31a820, - 0x32d3c: 0x6e31aa20, 0x32d3d: 0x6e31ac20, 0x32d3e: 0x6e31ae20, 0x32d3f: 0x6e31b020, - // Block 0xcb5, offset 0x32d40 - 0x32d40: 0x6e31b220, 0x32d41: 0x6e31b420, 0x32d42: 0x6e31b620, 0x32d43: 0x6e31b820, - 0x32d44: 0x6e31ba20, 0x32d45: 0x6e31bc20, 0x32d46: 0x6e384c20, 0x32d47: 0x6e384e20, - 0x32d48: 0x6e385020, 0x32d49: 0x6e385220, 0x32d4a: 0x6e385420, 0x32d4b: 0x6e385620, - 0x32d4c: 0x6e385820, 0x32d4d: 0x6e385a20, 0x32d4e: 0x6e385c20, 0x32d4f: 0x6e3cfa20, - 0x32d50: 0x6e3cfc20, 0x32d51: 0x6e3cfe20, 0x32d52: 0x6e3d0020, 0x32d53: 0x6e3d0220, - 0x32d54: 0x6e3d0420, 0x32d55: 0x6e3d0620, 0x32d56: 0x6e3d0820, 0x32d57: 0x6e3d0a20, - 0x32d58: 0x6e3d0c20, 0x32d59: 0x6e400a20, 0x32d5a: 0x6e400c20, 0x32d5b: 0x6e428620, - 0x32d5c: 0x6e428820, 0x32d5d: 0x6e428a20, 0x32d5e: 0x6e400e20, 0x32d5f: 0x6e45bc20, - 0x32d60: 0x6c03c820, 0x32d61: 0x6c03ca20, 0x32d62: 0x6c03cc20, 0x32d63: 0x6c079820, - 0x32d64: 0x6c079a20, 0x32d65: 0x6c079c20, 0x32d66: 0x6c079e20, 0x32d67: 0x6c0ea620, - 0x32d68: 0x6c0ea820, 0x32d69: 0x6c0eaa20, 0x32d6a: 0x6c0eac20, 0x32d6b: 0x6c0eae20, - 0x32d6c: 0x6c0eb020, 0x32d6d: 0x6c0eb220, 0x32d6e: 0x6c0eb420, 0x32d6f: 0x6c0eb620, - 0x32d70: 0x6c0eb820, 0x32d71: 0x6c0eba20, 0x32d72: 0x6c0ebc20, 0x32d73: 0x6c0ebe20, - 0x32d74: 0x6c1a6e20, 0x32d75: 0x6c1a7020, 0x32d76: 0x6c1a7220, 0x32d77: 0x6c1a7420, - 0x32d78: 0x6c1a7620, 0x32d79: 0x6c1a7820, 0x32d7a: 0x6c1a7a20, 0x32d7b: 0x6c1a7c20, - 0x32d7c: 0x6c1a7e20, 0x32d7d: 0x6c1a8020, 0x32d7e: 0x6c1a8220, 0x32d7f: 0x6c1a8420, - // Block 0xcb6, offset 0x32d80 - 0x32d80: 0x6c1a8620, 0x32d81: 0x6c1a8820, 0x32d82: 0x6c1a8a20, 0x32d83: 0x6c1a8c20, - 0x32d84: 0x6c1a8e20, 0x32d85: 0x6c1a9020, 0x32d86: 0x6c1a9220, 0x32d87: 0x6c1a9420, - 0x32d88: 0x6c2d9620, 0x32d89: 0x6c2d9820, 0x32d8a: 0x6c2d9a20, 0x32d8b: 0x6c2d9c20, - 0x32d8c: 0x6c2d9e20, 0x32d8d: 0x6c3bf620, 0x32d8e: 0x6c2da020, 0x32d8f: 0x6c2da220, - 0x32d90: 0x6c2da420, 0x32d91: 0x6c2da620, 0x32d92: 0x6c47e220, 0x32d93: 0x6c47e420, - 0x32d94: 0x6c47e620, 0x32d95: 0x6c47e820, 0x32d96: 0x6c47ea20, 0x32d97: 0x6c47ec20, - 0x32d98: 0x6c47ee20, 0x32d99: 0x6c47f020, 0x32d9a: 0x6c47f220, 0x32d9b: 0x6c47f420, - 0x32d9c: 0x6c47f620, 0x32d9d: 0x6c47f820, 0x32d9e: 0x6c47fa20, 0x32d9f: 0x6c47fc20, - 0x32da0: 0x6c695c20, 0x32da1: 0x6c695e20, 0x32da2: 0x6c696020, 0x32da3: 0x6c696220, - 0x32da4: 0x6c696420, 0x32da5: 0x6c696620, 0x32da6: 0x6c696820, 0x32da7: 0x6c696a20, - 0x32da8: 0x6c696c20, 0x32da9: 0x6c696e20, 0x32daa: 0x6c697020, 0x32dab: 0x6c697220, - 0x32dac: 0x6c697420, 0x32dad: 0x6c697620, 0x32dae: 0x6c697820, 0x32daf: 0x6c697a20, - 0x32db0: 0x6c902820, 0x32db1: 0x6c902a20, 0x32db2: 0x6c902c20, 0x32db3: 0x6c902e20, - 0x32db4: 0x6c903020, 0x32db5: 0x6c903220, 0x32db6: 0x6c903420, 0x32db7: 0x6c903620, - 0x32db8: 0x6c903820, 0x32db9: 0x6c903a20, 0x32dba: 0x6c903c20, 0x32dbb: 0x6c903e20, - 0x32dbc: 0x6cbc4820, 0x32dbd: 0x6cbc4a20, 0x32dbe: 0x6cbc4c20, 0x32dbf: 0x6cbc4e20, - // Block 0xcb7, offset 0x32dc0 - 0x32dc0: 0x6c904020, 0x32dc1: 0x6cbc5020, 0x32dc2: 0x6cbc5220, 0x32dc3: 0x6cbc5420, - 0x32dc4: 0x6cbc5620, 0x32dc5: 0x6cbc5820, 0x32dc6: 0x6cbc5a20, 0x32dc7: 0x6cbc5c20, - 0x32dc8: 0x6cbc5e20, 0x32dc9: 0x6cbc6020, 0x32dca: 0x6ced3220, 0x32dcb: 0x6ced3420, - 0x32dcc: 0x6ced3620, 0x32dcd: 0x6ced3820, 0x32dce: 0x6ced3a20, 0x32dcf: 0x6ced3c20, - 0x32dd0: 0x6ced3e20, 0x32dd1: 0x6ced4020, 0x32dd2: 0x6ced4220, 0x32dd3: 0x6ced4420, - 0x32dd4: 0x6ced4620, 0x32dd5: 0x6d1cfa20, 0x32dd6: 0x6d1cfc20, 0x32dd7: 0x6d1cfe20, - 0x32dd8: 0x6d1d0020, 0x32dd9: 0x6d1d0220, 0x32dda: 0x6d1d0420, 0x32ddb: 0x6d1d0620, - 0x32ddc: 0x6d1d0820, 0x32ddd: 0x6d1d0a20, 0x32dde: 0x6d1d0c20, 0x32ddf: 0x6d1d0e20, - 0x32de0: 0x6d1d1020, 0x32de1: 0x6d1d1220, 0x32de2: 0x6d4ab820, 0x32de3: 0x6d4aba20, - 0x32de4: 0x6d4abc20, 0x32de5: 0x6d785c20, 0x32de6: 0x6d4abe20, 0x32de7: 0x6d4ac020, - 0x32de8: 0x6d4ac220, 0x32de9: 0x6d4ac420, 0x32dea: 0x6d785e20, 0x32deb: 0x6d786020, - 0x32dec: 0x6d786220, 0x32ded: 0x6da17e20, 0x32dee: 0x6da18020, 0x32def: 0x6da18220, - 0x32df0: 0x6da18420, 0x32df1: 0x6da18620, 0x32df2: 0x6dc3de20, 0x32df3: 0x6de0fe20, - 0x32df4: 0x6de10020, 0x32df5: 0x6df92c20, 0x32df6: 0x6df92e20, 0x32df7: 0x6df93020, - 0x32df8: 0x6e0cf620, 0x32df9: 0x6e0cf820, 0x32dfa: 0x6e0cfa20, 0x32dfb: 0x6e3d1020, - 0x32dfc: 0x6c03d420, 0x32dfd: 0x6c03d620, 0x32dfe: 0x6c03d820, 0x32dff: 0x6c07ae20, - // Block 0xcb8, offset 0x32e00 - 0x32e00: 0x6c07b020, 0x32e01: 0x6c07b220, 0x32e02: 0x6c07b420, 0x32e03: 0x6c07b620, - 0x32e04: 0x6c07b820, 0x32e05: 0x6c07ba20, 0x32e06: 0x6c07bc20, 0x32e07: 0x6c07be20, - 0x32e08: 0x6c0ee620, 0x32e09: 0x6c0ee820, 0x32e0a: 0x6c0eea20, 0x32e0b: 0x6c0eec20, - 0x32e0c: 0x6c0eee20, 0x32e0d: 0x6c0ef020, 0x32e0e: 0x6c0ef220, 0x32e0f: 0x6c0ef420, - 0x32e10: 0x6c0ef620, 0x32e11: 0x6c0ef820, 0x32e12: 0x6c0efa20, 0x32e13: 0x6c0efc20, - 0x32e14: 0x6c0efe20, 0x32e15: 0x6c0f0020, 0x32e16: 0x6c0f0220, 0x32e17: 0x6c0fb020, - 0x32e18: 0x6c1af820, 0x32e19: 0x6c1afa20, 0x32e1a: 0x6c1afc20, 0x32e1b: 0x6c1afe20, - 0x32e1c: 0x6c1b0020, 0x32e1d: 0x6c1b0220, 0x32e1e: 0x6c1b0420, 0x32e1f: 0x6c1b0620, - 0x32e20: 0x6c1b0820, 0x32e21: 0x6c1b0a20, 0x32e22: 0x6c1b0c20, 0x32e23: 0x6c1b0e20, - 0x32e24: 0x6c1b1020, 0x32e25: 0x6c1b1220, 0x32e26: 0x6c1b1420, 0x32e27: 0x6c1b1620, - 0x32e28: 0x6c1b1820, 0x32e29: 0x6c1b1a20, 0x32e2a: 0x6c1b1c20, 0x32e2b: 0x6c1b1e20, - 0x32e2c: 0x6c1b2020, 0x32e2d: 0x6c1b2220, 0x32e2e: 0x6c1b2420, 0x32e2f: 0x6c1b2620, - 0x32e30: 0x6c1b2820, 0x32e31: 0x6c1b2a20, 0x32e32: 0x6c1b2c20, 0x32e33: 0x6c1b2e20, - 0x32e34: 0x6c1b3020, 0x32e35: 0x6c1b3220, 0x32e36: 0x6c1b3420, 0x32e37: 0x6c1b3620, - 0x32e38: 0x6c1b3820, 0x32e39: 0x6c1b3a20, 0x32e3a: 0x6c1b3c20, 0x32e3b: 0x6c1b3e20, - 0x32e3c: 0x6c1b4020, 0x32e3d: 0x6c1b4220, 0x32e3e: 0x6c1b4420, 0x32e3f: 0x6c1b4620, - // Block 0xcb9, offset 0x32e40 - 0x32e40: 0x6c1b4820, 0x32e41: 0x6c1b4a20, 0x32e42: 0x6c1b4c20, 0x32e43: 0x6c1b4e20, - 0x32e44: 0x6c2e0820, 0x32e45: 0x6c2e0a20, 0x32e46: 0x6c2e0c20, 0x32e47: 0x6c2e0e20, - 0x32e48: 0x6c2e1020, 0x32e49: 0x6c2e1220, 0x32e4a: 0x6c2e1420, 0x32e4b: 0x6c2e1620, - 0x32e4c: 0x6c2e1820, 0x32e4d: 0x6c2e1a20, 0x32e4e: 0x6c2e1c20, 0x32e4f: 0x6c2e1e20, - 0x32e50: 0x6c2e2020, 0x32e51: 0x6c2e2220, 0x32e52: 0x6c2e2420, 0x32e53: 0x6c2e2620, - 0x32e54: 0x6c2e2820, 0x32e55: 0x6c2e2a20, 0x32e56: 0x6c2e2c20, 0x32e57: 0x6c2e2e20, - 0x32e58: 0x6c2e3020, 0x32e59: 0x6c2e3220, 0x32e5a: 0x6c2e3420, 0x32e5b: 0x6c2e3620, - 0x32e5c: 0x6c2e3820, 0x32e5d: 0x6c2e3a20, 0x32e5e: 0x6c2e3c20, 0x32e5f: 0x6c2e3e20, - 0x32e60: 0x6c2e4020, 0x32e61: 0x6c2e4220, 0x32e62: 0x6c2e4420, 0x32e63: 0x6c2e4620, - 0x32e64: 0x6c2e4820, 0x32e65: 0x6c2e4a20, 0x32e66: 0x6c2e4c20, 0x32e67: 0x6c2e4e20, - 0x32e68: 0x6c2e5020, 0x32e69: 0x6c2e5220, 0x32e6a: 0x6c2e5420, 0x32e6b: 0x6c2e5620, - 0x32e6c: 0x6c2e5820, 0x32e6d: 0x6c2e5a20, 0x32e6e: 0x6c2e5c20, 0x32e6f: 0x6c2e5e20, - 0x32e70: 0x6c2e6020, 0x32e71: 0x6c2e6220, 0x32e72: 0x6c2e6420, 0x32e73: 0x6c2e6620, - 0x32e74: 0x6c2e6820, 0x32e75: 0x6c2e6a20, 0x32e76: 0x6c2e6c20, 0x32e77: 0x6c486a20, - 0x32e78: 0x6c486c20, 0x32e79: 0x6c486e20, 0x32e7a: 0x6c487020, 0x32e7b: 0x6c487220, - 0x32e7c: 0x6c487420, 0x32e7d: 0x6c487620, 0x32e7e: 0x6c487820, 0x32e7f: 0x6c487a20, - // Block 0xcba, offset 0x32e80 - 0x32e80: 0x6c487c20, 0x32e81: 0x6c487e20, 0x32e82: 0x6c488020, 0x32e83: 0x6c488220, - 0x32e84: 0x6c488420, 0x32e85: 0x6c488620, 0x32e86: 0x6c488820, 0x32e87: 0x6c488a20, - 0x32e88: 0x6c488c20, 0x32e89: 0x6c488e20, 0x32e8a: 0x6c489020, 0x32e8b: 0x6c489220, - 0x32e8c: 0x6c489420, 0x32e8d: 0x6c489620, 0x32e8e: 0x6c489820, 0x32e8f: 0x6c489a20, - 0x32e90: 0x6c489c20, 0x32e91: 0x6c489e20, 0x32e92: 0x6c48a020, 0x32e93: 0x6c48a220, - 0x32e94: 0x6c48a420, 0x32e95: 0x6c48a620, 0x32e96: 0x6c48a820, 0x32e97: 0x6c48aa20, - 0x32e98: 0x6c48ac20, 0x32e99: 0x6c48ae20, 0x32e9a: 0x6c48b020, 0x32e9b: 0x6c48b220, - 0x32e9c: 0x6c5dc620, 0x32e9d: 0x6c48b420, 0x32e9e: 0x6c48b620, 0x32e9f: 0x6c48b820, - 0x32ea0: 0x6c48ba20, 0x32ea1: 0x6c48bc20, 0x32ea2: 0x6c48be20, 0x32ea3: 0x6c48c020, - 0x32ea4: 0x6c48c220, 0x32ea5: 0x6c48c420, 0x32ea6: 0x6c48c620, 0x32ea7: 0x6c48c820, - 0x32ea8: 0x6c48ca20, 0x32ea9: 0x6c48cc20, 0x32eaa: 0x6c48ce20, 0x32eab: 0x6c48d020, - 0x32eac: 0x6c48d220, 0x32ead: 0x6c69da20, 0x32eae: 0x6c69dc20, 0x32eaf: 0x6c69de20, - 0x32eb0: 0x6c69e020, 0x32eb1: 0x6c69e220, 0x32eb2: 0x6c69e420, 0x32eb3: 0x6c69e620, - 0x32eb4: 0x6c69e820, 0x32eb5: 0x6c69ea20, 0x32eb6: 0x6c69ec20, 0x32eb7: 0x6c69ee20, - 0x32eb8: 0x6c69f020, 0x32eb9: 0x6c69f220, 0x32eba: 0x6c69f420, 0x32ebb: 0x6c69f620, - 0x32ebc: 0x6c69f820, 0x32ebd: 0x6c69fa20, 0x32ebe: 0x6c69fc20, 0x32ebf: 0x6c69fe20, - // Block 0xcbb, offset 0x32ec0 - 0x32ec0: 0x6c6a0020, 0x32ec1: 0x6c6a0220, 0x32ec2: 0x6c6a0420, 0x32ec3: 0x6c6a0620, - 0x32ec4: 0x6c6a0820, 0x32ec5: 0x6c6a0a20, 0x32ec6: 0x6c6a0c20, 0x32ec7: 0x6c6a0e20, - 0x32ec8: 0x6c6a1020, 0x32ec9: 0x6c6a1220, 0x32eca: 0x6c6a1420, 0x32ecb: 0x6c6a1620, - 0x32ecc: 0x6c6a1820, 0x32ecd: 0x6c6a1a20, 0x32ece: 0x6c6a1c20, 0x32ecf: 0x6c6a1e20, - 0x32ed0: 0x6c6a2020, 0x32ed1: 0x6c6a2220, 0x32ed2: 0x6c6a2420, 0x32ed3: 0x6c6a2620, - 0x32ed4: 0x6c6a2820, 0x32ed5: 0x6c6a2a20, 0x32ed6: 0x6c6a2c20, 0x32ed7: 0x6c6a2e20, - 0x32ed8: 0x6c6a3020, 0x32ed9: 0x6c6a3220, 0x32eda: 0x6c6a3420, 0x32edb: 0x6c6a3620, - 0x32edc: 0x6c6a3820, 0x32edd: 0x6c6a3a20, 0x32ede: 0x6c6a3c20, 0x32edf: 0x6c6a3e20, - 0x32ee0: 0x6c6a4020, 0x32ee1: 0x6c6a4220, 0x32ee2: 0x6c6a4420, 0x32ee3: 0x6c6a4620, - 0x32ee4: 0x6c6a4820, 0x32ee5: 0x6c6a4a20, 0x32ee6: 0x6c90c620, 0x32ee7: 0x6c90c820, - 0x32ee8: 0x6c90ca20, 0x32ee9: 0x6c90cc20, 0x32eea: 0x6c90ce20, 0x32eeb: 0x6c90d020, - 0x32eec: 0x6c90d220, 0x32eed: 0x6c90d420, 0x32eee: 0x6c90d620, 0x32eef: 0x6c90d820, - 0x32ef0: 0x6c90da20, 0x32ef1: 0x6c90dc20, 0x32ef2: 0x6c90de20, 0x32ef3: 0x6c90e020, - 0x32ef4: 0x6c90e220, 0x32ef5: 0x6c90e420, 0x32ef6: 0x6c90e620, 0x32ef7: 0x6c90e820, - 0x32ef8: 0x6c90ea20, 0x32ef9: 0x6c90ec20, 0x32efa: 0x6c90ee20, 0x32efb: 0x6c90f020, - 0x32efc: 0x6c90f220, 0x32efd: 0x6c90f420, 0x32efe: 0x6c90f620, 0x32eff: 0x6c90f820, - // Block 0xcbc, offset 0x32f00 - 0x32f00: 0x6c90fa20, 0x32f01: 0x6c90fc20, 0x32f02: 0x6c90fe20, 0x32f03: 0x6c910020, - 0x32f04: 0x6c910220, 0x32f05: 0x6c910420, 0x32f06: 0x6c910620, 0x32f07: 0x6c910820, - 0x32f08: 0x6c910a20, 0x32f09: 0x6c910c20, 0x32f0a: 0x6c910e20, 0x32f0b: 0x6c911020, - 0x32f0c: 0x6c911220, 0x32f0d: 0x6c911420, 0x32f0e: 0x6c911620, 0x32f0f: 0x6c911820, - 0x32f10: 0x6c911a20, 0x32f11: 0x6c911c20, 0x32f12: 0x6c911e20, 0x32f13: 0x6c912020, - 0x32f14: 0x6c912220, 0x32f15: 0x6c912420, 0x32f16: 0x6c912620, 0x32f17: 0x6c912820, - 0x32f18: 0x6c912a20, 0x32f19: 0x6c912c20, 0x32f1a: 0x6c912e20, 0x32f1b: 0x6c913020, - 0x32f1c: 0x6c913220, 0x32f1d: 0x6c913420, 0x32f1e: 0x6c913620, 0x32f1f: 0x6c913820, - 0x32f20: 0x6c913a20, 0x32f21: 0x6c913c20, 0x32f22: 0x6c913e20, 0x32f23: 0x6c914020, - 0x32f24: 0x6cbcd820, 0x32f25: 0x6cbcda20, 0x32f26: 0x6cbcdc20, 0x32f27: 0x6cbcde20, - 0x32f28: 0x6cbce020, 0x32f29: 0x6cbce220, 0x32f2a: 0x6cbce420, 0x32f2b: 0x6cbce620, - 0x32f2c: 0x6cbce820, 0x32f2d: 0x6cbcea20, 0x32f2e: 0x6cbcec20, 0x32f2f: 0x6cbcee20, - 0x32f30: 0x6cbcf020, 0x32f31: 0x6cbcf220, 0x32f32: 0x6cbcf420, 0x32f33: 0x6cbcf620, - 0x32f34: 0x6cbcf820, 0x32f35: 0x6cbcfa20, 0x32f36: 0x6cbcfc20, 0x32f37: 0x6cbcfe20, - 0x32f38: 0x6cbd0020, 0x32f39: 0x6cbd0220, 0x32f3a: 0x6cbd0420, 0x32f3b: 0x6cbd0620, - 0x32f3c: 0x6cbd0820, 0x32f3d: 0x6cbd0a20, 0x32f3e: 0x6cbd0c20, 0x32f3f: 0x6cbd0e20, - // Block 0xcbd, offset 0x32f40 - 0x32f40: 0x6cbd1020, 0x32f41: 0x6cbd1220, 0x32f42: 0x6cbd1420, 0x32f43: 0x6cbd1620, - 0x32f44: 0x6cbd1820, 0x32f45: 0x6cbd1a20, 0x32f46: 0x6cbd1c20, 0x32f47: 0x6cbd1e20, - 0x32f48: 0x6cbd2020, 0x32f49: 0x6cbd2220, 0x32f4a: 0x6cbd2420, 0x32f4b: 0x6cbd2620, - 0x32f4c: 0x6cbd2820, 0x32f4d: 0x6cbd2a20, 0x32f4e: 0x6cbd2c20, 0x32f4f: 0x6cbd2e20, - 0x32f50: 0x6cbd3020, 0x32f51: 0x6cbd3220, 0x32f52: 0x6cbd3420, 0x32f53: 0x6cbd3620, - 0x32f54: 0x6cbd3820, 0x32f55: 0x6cbd3a20, 0x32f56: 0x6cbd3c20, 0x32f57: 0x6cbd3e20, - 0x32f58: 0x6cbd4020, 0x32f59: 0x6cbd4220, 0x32f5a: 0x6cbd4420, 0x32f5b: 0x6cbd4620, - 0x32f5c: 0x6cbd4820, 0x32f5d: 0x6cbd4a20, 0x32f5e: 0x6cbd4c20, 0x32f5f: 0x6cbd4e20, - 0x32f60: 0x6cbd5020, 0x32f61: 0x6cbd5220, 0x32f62: 0x6cbd5420, 0x32f63: 0x6cbd5620, - 0x32f64: 0x6cbd5820, 0x32f65: 0x6cbd5a20, 0x32f66: 0x6cbd5c20, 0x32f67: 0x6cbd5e20, - 0x32f68: 0x6cbd6020, 0x32f69: 0x6cbd6220, 0x32f6a: 0x6cbd6420, 0x32f6b: 0x6cbd6620, - 0x32f6c: 0x6cbd6820, 0x32f6d: 0x6cbd6a20, 0x32f6e: 0x6cedae20, 0x32f6f: 0x6cedb020, - 0x32f70: 0x6cedb220, 0x32f71: 0x6cedb420, 0x32f72: 0x6cedb620, 0x32f73: 0x6cedb820, - 0x32f74: 0x6cedba20, 0x32f75: 0x6cedbc20, 0x32f76: 0x6cedbe20, 0x32f77: 0x6cedc020, - 0x32f78: 0x6cedc220, 0x32f79: 0x6cedc420, 0x32f7a: 0x6cedc620, 0x32f7b: 0x6cedc820, - 0x32f7c: 0x6cedca20, 0x32f7d: 0x6cedcc20, 0x32f7e: 0x6cedce20, 0x32f7f: 0x6cedd020, - // Block 0xcbe, offset 0x32f80 - 0x32f80: 0x6cedd220, 0x32f81: 0x6cedd420, 0x32f82: 0x6cedd620, 0x32f83: 0x6cedd820, - 0x32f84: 0x6cedda20, 0x32f85: 0x6ceddc20, 0x32f86: 0x6cedde20, 0x32f87: 0x6cede020, - 0x32f88: 0x6cede220, 0x32f89: 0x6cede420, 0x32f8a: 0x6cede620, 0x32f8b: 0x6cede820, - 0x32f8c: 0x6cedea20, 0x32f8d: 0x6cedec20, 0x32f8e: 0x6cedee20, 0x32f8f: 0x6cedf020, - 0x32f90: 0x6cedf220, 0x32f91: 0x6cedf420, 0x32f92: 0x6cedf620, 0x32f93: 0x6cedf820, - 0x32f94: 0x6cedfa20, 0x32f95: 0x6cedfc20, 0x32f96: 0x6cedfe20, 0x32f97: 0x6cee0020, - 0x32f98: 0x6cee0220, 0x32f99: 0x6cee0420, 0x32f9a: 0x6cee0620, 0x32f9b: 0x6cee0820, - 0x32f9c: 0x6cee0a20, 0x32f9d: 0x6cee0c20, 0x32f9e: 0x6cee0e20, 0x32f9f: 0x6cee1020, - 0x32fa0: 0x6cee1220, 0x32fa1: 0x6cee1420, 0x32fa2: 0x6cee1620, 0x32fa3: 0x6cee1820, - 0x32fa4: 0x6cee1a20, 0x32fa5: 0x6cee1c20, 0x32fa6: 0x6cee1e20, 0x32fa7: 0x6cee2020, - 0x32fa8: 0x6cee2220, 0x32fa9: 0x6cee2420, 0x32faa: 0x6cee2620, 0x32fab: 0x6cee2820, - 0x32fac: 0x6cee2a20, 0x32fad: 0x6d1d7620, 0x32fae: 0x6d1d7820, 0x32faf: 0x6d1d7a20, - 0x32fb0: 0x6d1d7c20, 0x32fb1: 0x6d1d7e20, 0x32fb2: 0x6d1d8020, 0x32fb3: 0x6d1d8220, - 0x32fb4: 0x6d1d8420, 0x32fb5: 0x6d1d8620, 0x32fb6: 0x6d1d8820, 0x32fb7: 0x6d1d8a20, - 0x32fb8: 0x6d1d8c20, 0x32fb9: 0x6d1d8e20, 0x32fba: 0x6d1d9020, 0x32fbb: 0x6d1d9220, - 0x32fbc: 0x6d1d9420, 0x32fbd: 0x6d1d9620, 0x32fbe: 0x6d1d9820, 0x32fbf: 0x6d1d9a20, - // Block 0xcbf, offset 0x32fc0 - 0x32fc0: 0x6d1d9c20, 0x32fc1: 0x6d1d9e20, 0x32fc2: 0x6d1da020, 0x32fc3: 0x6d1da220, - 0x32fc4: 0x6d1da420, 0x32fc5: 0x6d1da620, 0x32fc6: 0x6d1da820, 0x32fc7: 0x6d1daa20, - 0x32fc8: 0x6d1dac20, 0x32fc9: 0x6d1dae20, 0x32fca: 0x6d1db020, 0x32fcb: 0x6d1db220, - 0x32fcc: 0x6d1db420, 0x32fcd: 0x6d1db620, 0x32fce: 0x6d1db820, 0x32fcf: 0x6d1dba20, - 0x32fd0: 0x6d1dbc20, 0x32fd1: 0x6d1dbe20, 0x32fd2: 0x6d1dc020, 0x32fd3: 0x6d1dc220, - 0x32fd4: 0x6d1dc420, 0x32fd5: 0x6d1dc620, 0x32fd6: 0x6d1dc820, 0x32fd7: 0x6d1dca20, - 0x32fd8: 0x6d1dcc20, 0x32fd9: 0x6d1dce20, 0x32fda: 0x6d1dd020, 0x32fdb: 0x6d1dd220, - 0x32fdc: 0x6d1dd420, 0x32fdd: 0x6d1dd620, 0x32fde: 0x6d4b1420, 0x32fdf: 0x6d4b1620, - 0x32fe0: 0x6d4b1820, 0x32fe1: 0x6d4b1a20, 0x32fe2: 0x6d4b1c20, 0x32fe3: 0x6d4b1e20, - 0x32fe4: 0x6d4b2020, 0x32fe5: 0x6d4b2220, 0x32fe6: 0x6d4b2420, 0x32fe7: 0x6d4b2620, - 0x32fe8: 0x6d4b2820, 0x32fe9: 0x6d4b2a20, 0x32fea: 0x6d4b2c20, 0x32feb: 0x6d4b2e20, - 0x32fec: 0x6d4b3020, 0x32fed: 0x6d4b3220, 0x32fee: 0x6d4b3420, 0x32fef: 0x6d4b3620, - 0x32ff0: 0x6d4b3820, 0x32ff1: 0x6d4b3a20, 0x32ff2: 0x6d4b3c20, 0x32ff3: 0x6d4b3e20, - 0x32ff4: 0x6d4b4020, 0x32ff5: 0x6d4b4220, 0x32ff6: 0x6d4b4420, 0x32ff7: 0x6d4b4620, - 0x32ff8: 0x6d4b4820, 0x32ff9: 0x6d4b4a20, 0x32ffa: 0x6d4b4c20, 0x32ffb: 0x6d4b4e20, - 0x32ffc: 0x6d4b5020, 0x32ffd: 0x6d4b5220, 0x32ffe: 0x6d4b5420, 0x32fff: 0x6d4b5620, - // Block 0xcc0, offset 0x33000 - 0x33000: 0x6d4b5820, 0x33001: 0x6d4b5a20, 0x33002: 0x6d4b5c20, 0x33003: 0x6d4b5e20, - 0x33004: 0x6d4b6020, 0x33005: 0x6d4b6220, 0x33006: 0x6d4b6420, 0x33007: 0x6d4b6620, - 0x33008: 0x6d4b6820, 0x33009: 0x6d4b6a20, 0x3300a: 0x6d4b6c20, 0x3300b: 0x6d4b6e20, - 0x3300c: 0x6d4b7020, 0x3300d: 0x6d4b7220, 0x3300e: 0x6d4b7420, 0x3300f: 0x6d4b7620, - 0x33010: 0x6d4b7820, 0x33011: 0x6d4b7a20, 0x33012: 0x6d4b7c20, 0x33013: 0x6d4b7e20, - 0x33014: 0x6d4b8020, 0x33015: 0x6d4b8220, 0x33016: 0x6d4b8420, 0x33017: 0x6d4b8620, - 0x33018: 0x6d4b8820, 0x33019: 0x6d4b8a20, 0x3301a: 0x6d4b8c20, 0x3301b: 0x6d4b8e20, - 0x3301c: 0x6d4b9020, 0x3301d: 0x6d4b9220, 0x3301e: 0x6d789c20, 0x3301f: 0x6d789e20, - 0x33020: 0x6d78a020, 0x33021: 0x6d78a220, 0x33022: 0x6d78a420, 0x33023: 0x6d78a620, - 0x33024: 0x6d78a820, 0x33025: 0x6d78aa20, 0x33026: 0x6d78ac20, 0x33027: 0x6d78ae20, - 0x33028: 0x6d78b020, 0x33029: 0x6d78b220, 0x3302a: 0x6d78b420, 0x3302b: 0x6d78b620, - 0x3302c: 0x6d78b820, 0x3302d: 0x6d78ba20, 0x3302e: 0x6d78bc20, 0x3302f: 0x6d78be20, - 0x33030: 0x6d78c020, 0x33031: 0x6d78c220, 0x33032: 0x6d78c420, 0x33033: 0x6d78c620, - 0x33034: 0x6d78c820, 0x33035: 0x6d78ca20, 0x33036: 0x6d78cc20, 0x33037: 0x6d78ce20, - 0x33038: 0x6d78d020, 0x33039: 0x6d78d220, 0x3303a: 0x6d980c20, 0x3303b: 0x6d78d420, - 0x3303c: 0x6d78d620, 0x3303d: 0x6d78d820, 0x3303e: 0x6d78da20, 0x3303f: 0x6d78dc20, - // Block 0xcc1, offset 0x33040 - 0x33040: 0x6d78de20, 0x33041: 0x6d78e020, 0x33042: 0x6d78e220, 0x33043: 0x6d78e420, - 0x33044: 0x6d78e620, 0x33045: 0x6d78e820, 0x33046: 0x6d78ea20, 0x33047: 0x6d78ec20, - 0x33048: 0x6d78ee20, 0x33049: 0x6da1a820, 0x3304a: 0x6da1aa20, 0x3304b: 0x6da1ac20, - 0x3304c: 0x6da1ae20, 0x3304d: 0x6da1b020, 0x3304e: 0x6da1b220, 0x3304f: 0x6da1b420, - 0x33050: 0x6da1b620, 0x33051: 0x6da1b820, 0x33052: 0x6da1ba20, 0x33053: 0x6da1bc20, - 0x33054: 0x6da1be20, 0x33055: 0x6da1c020, 0x33056: 0x6da1c220, 0x33057: 0x6da1c420, - 0x33058: 0x6da1c620, 0x33059: 0x6da1c820, 0x3305a: 0x6da1ca20, 0x3305b: 0x6da1cc20, - 0x3305c: 0x6da1ce20, 0x3305d: 0x6da1d020, 0x3305e: 0x6da1d220, 0x3305f: 0x6da1d420, - 0x33060: 0x6da1d620, 0x33061: 0x6dc1f820, 0x33062: 0x6da1d820, 0x33063: 0x6da1da20, - 0x33064: 0x6da1dc20, 0x33065: 0x6da1de20, 0x33066: 0x6da1e020, 0x33067: 0x6da1e220, - 0x33068: 0x6da1e420, 0x33069: 0x6da1e620, 0x3306a: 0x6da1e820, 0x3306b: 0x6da1ea20, - 0x3306c: 0x6da1ec20, 0x3306d: 0x6da1ee20, 0x3306e: 0x6da1f020, 0x3306f: 0x6da1f220, - 0x33070: 0x6dc3ea20, 0x33071: 0x6dc3ec20, 0x33072: 0x6dc3ee20, 0x33073: 0x6dc3f020, - 0x33074: 0x6dc3f220, 0x33075: 0x6dc3f420, 0x33076: 0x6dc3f620, 0x33077: 0x6dc3f820, - 0x33078: 0x6dc3fa20, 0x33079: 0x6dc3fc20, 0x3307a: 0x6dc3fe20, 0x3307b: 0x6dc40020, - 0x3307c: 0x6dc40220, 0x3307d: 0x6dc40420, 0x3307e: 0x6dc40620, 0x3307f: 0x6dc40820, - // Block 0xcc2, offset 0x33080 - 0x33080: 0x6de11620, 0x33081: 0x6dc40a20, 0x33082: 0x6dc40c20, 0x33083: 0x6dc40e20, - 0x33084: 0x6dc41020, 0x33085: 0x6dc41220, 0x33086: 0x6dc41420, 0x33087: 0x6dc41620, - 0x33088: 0x6dc41820, 0x33089: 0x6dc41a20, 0x3308a: 0x6dc41c20, 0x3308b: 0x6dc41e20, - 0x3308c: 0x6dc42020, 0x3308d: 0x6dc42220, 0x3308e: 0x6dc42420, 0x3308f: 0x6dc42620, - 0x33090: 0x6de11820, 0x33091: 0x6de11a20, 0x33092: 0x6de11c20, 0x33093: 0x6de11e20, - 0x33094: 0x6de12020, 0x33095: 0x6de12220, 0x33096: 0x6de12420, 0x33097: 0x6de12620, - 0x33098: 0x6de12820, 0x33099: 0x6de12a20, 0x3309a: 0x6de12c20, 0x3309b: 0x6dede420, - 0x3309c: 0x6de12e20, 0x3309d: 0x6de13020, 0x3309e: 0x6de13220, 0x3309f: 0x6de13420, - 0x330a0: 0x6de13620, 0x330a1: 0x6de13820, 0x330a2: 0x6de13a20, 0x330a3: 0x6de13c20, - 0x330a4: 0x6de13e20, 0x330a5: 0x6de14020, 0x330a6: 0x6df93a20, 0x330a7: 0x6df93c20, - 0x330a8: 0x6df93e20, 0x330a9: 0x6df94020, 0x330aa: 0x6df94220, 0x330ab: 0x6df94420, - 0x330ac: 0x6df94620, 0x330ad: 0x6df94820, 0x330ae: 0x6df94a20, 0x330af: 0x6df94c20, - 0x330b0: 0x6df94e20, 0x330b1: 0x6e0cfe20, 0x330b2: 0x6e0d0020, 0x330b3: 0x6e0d0220, - 0x330b4: 0x6e0d0420, 0x330b5: 0x6e0d0620, 0x330b6: 0x6e0d0820, 0x330b7: 0x6e078620, - 0x330b8: 0x6e0d0a20, 0x330b9: 0x6e0d0c20, 0x330ba: 0x6e1c7620, 0x330bb: 0x6e0d0e20, - 0x330bc: 0x6e0d1020, 0x330bd: 0x6e0d1220, 0x330be: 0x6e0d1420, 0x330bf: 0x6e0d1620, - // Block 0xcc3, offset 0x330c0 - 0x330c0: 0x6e0d1820, 0x330c1: 0x6e0d1a20, 0x330c2: 0x6e1c7820, 0x330c3: 0x6e1c7a20, - 0x330c4: 0x6e1c7c20, 0x330c5: 0x6e1c7e20, 0x330c6: 0x6e1c8020, 0x330c7: 0x6e1c8220, - 0x330c8: 0x6e1c8420, 0x330c9: 0x6e1c8620, 0x330ca: 0x6e289220, 0x330cb: 0x6e289420, - 0x330cc: 0x6e289620, 0x330cd: 0x6e289820, 0x330ce: 0x6e289a20, 0x330cf: 0x6e31c620, - 0x330d0: 0x6e31c820, 0x330d1: 0x6e31ca20, 0x330d2: 0x6e31cc20, 0x330d3: 0x6e31ce20, - 0x330d4: 0x6e31d020, 0x330d5: 0x6e31d220, 0x330d6: 0x6e3d1220, 0x330d7: 0x6e442620, - 0x330d8: 0x6e451820, 0x330d9: 0x6e46e220, 0x330da: 0x6e471e20, 0x330db: 0x6c07c620, - 0x330dc: 0x6c0f1020, 0x330dd: 0x6c1b7020, 0x330de: 0x6c1b7220, 0x330df: 0x6c2e7e20, - 0x330e0: 0x6c48ea20, 0x330e1: 0x6c48ec20, 0x330e2: 0x6c48ee20, 0x330e3: 0x6c6a7220, - 0x330e4: 0x6c6a7420, 0x330e5: 0x6c6a7620, 0x330e6: 0x6c6a7820, 0x330e7: 0x6c6a7a20, - 0x330e8: 0x6c6a7c20, 0x330e9: 0x6c6a7e20, 0x330ea: 0x6c916620, 0x330eb: 0x6c916820, - 0x330ec: 0x6c916a20, 0x330ed: 0x6c916c20, 0x330ee: 0x6cbd8e20, 0x330ef: 0x6cbd9020, - 0x330f0: 0x6cee5020, 0x330f1: 0x6cbdc220, 0x330f2: 0x6cee5220, 0x330f3: 0x6cee5420, - 0x330f4: 0x6cee5620, 0x330f5: 0x6cee5820, 0x330f6: 0x6d1df820, 0x330f7: 0x6d187e20, - 0x330f8: 0x6d1dfa20, 0x330f9: 0x6d1dfc20, 0x330fa: 0x6d1dfe20, 0x330fb: 0x6d1e0020, - 0x330fc: 0x6d4ba620, 0x330fd: 0x6d4ba820, 0x330fe: 0x6d790220, 0x330ff: 0x6d790420, - // Block 0xcc4, offset 0x33100 - 0x33100: 0x6d790620, 0x33101: 0x6da20020, 0x33102: 0x6da20220, 0x33103: 0x6da20420, - 0x33104: 0x6da20620, 0x33105: 0x6dc43020, 0x33106: 0x6dd50620, 0x33107: 0x6dc43220, - 0x33108: 0x6dc43420, 0x33109: 0x6dc43620, 0x3310a: 0x6dc43820, 0x3310b: 0x6de14420, - 0x3310c: 0x6de14620, 0x3310d: 0x6df95220, 0x3310e: 0x6dfe0820, 0x3310f: 0x6e1c8820, - 0x33110: 0x6e1c8a20, 0x33111: 0x6e1c8c20, 0x33112: 0x6c018a20, 0x33113: 0x6c07ca20, - 0x33114: 0x6c07cc20, 0x33115: 0x6c0f1420, 0x33116: 0x6c0f1620, 0x33117: 0x6c1b7620, - 0x33118: 0x6c1b7820, 0x33119: 0x6c1b7a20, 0x3311a: 0x6c6a8220, 0x3311b: 0x6c917020, - 0x3311c: 0x6c917220, 0x3311d: 0x6cee5c20, 0x3311e: 0x6c0f1820, 0x3311f: 0x6c0f1a20, - 0x33120: 0x6c1b7e20, 0x33121: 0x6c1b8020, 0x33122: 0x6c2e8420, 0x33123: 0x6c2e8620, - 0x33124: 0x6c2e8820, 0x33125: 0x6c2e8a20, 0x33126: 0x6c6a8a20, 0x33127: 0x6c917420, - 0x33128: 0x6c917620, 0x33129: 0x6c917820, 0x3312a: 0x6c917a20, 0x3312b: 0x6c917c20, - 0x3312c: 0x6c917e20, 0x3312d: 0x6cbd9620, 0x3312e: 0x6cee6020, 0x3312f: 0x6cee6220, - 0x33130: 0x6cee6420, 0x33131: 0x6cee6620, 0x33132: 0x6d1e0420, 0x33133: 0x6d1e0620, - 0x33134: 0x6d1e0820, 0x33135: 0x6d1e0a20, 0x33136: 0x6d4baa20, 0x33137: 0x6d4bac20, - 0x33138: 0x6d790820, 0x33139: 0x6d790a20, 0x3313a: 0x6d790c20, 0x3313b: 0x6da20820, - 0x3313c: 0x6dc43e20, 0x3313d: 0x6dc44020, 0x3313e: 0x6dc44220, 0x3313f: 0x6dc44420, - // Block 0xcc5, offset 0x33140 - 0x33140: 0x6de14a20, 0x33141: 0x6df95620, 0x33142: 0x6e289c20, 0x33143: 0x6e451a20, - 0x33144: 0x6c07d620, 0x33145: 0x6c07d820, 0x33146: 0x6c07da20, 0x33147: 0x6c0f2220, - 0x33148: 0x6c0f2420, 0x33149: 0x6c0f2620, 0x3314a: 0x6c1b8220, 0x3314b: 0x6c1b8420, - 0x3314c: 0x6c1b8620, 0x3314d: 0x6c2e9220, 0x3314e: 0x6c2e9420, 0x3314f: 0x6c2e9620, - 0x33150: 0x6c48fc20, 0x33151: 0x6c48fe20, 0x33152: 0x6c6a9020, 0x33153: 0x6c6a9220, - 0x33154: 0x6c6a9420, 0x33155: 0x6c6a9620, 0x33156: 0x6c6a9820, 0x33157: 0x6c6a9a20, - 0x33158: 0x6c6a9c20, 0x33159: 0x6c6a9e20, 0x3315a: 0x6c6aa020, 0x3315b: 0x6c6aa220, - 0x3315c: 0x6c6aa420, 0x3315d: 0x6c918420, 0x3315e: 0x6c918620, 0x3315f: 0x6c918820, - 0x33160: 0x6c918a20, 0x33161: 0x6c918c20, 0x33162: 0x6c918e20, 0x33163: 0x6c919020, - 0x33164: 0x6c919220, 0x33165: 0x6c919420, 0x33166: 0x6cbda020, 0x33167: 0x6cbda220, - 0x33168: 0x6cbda420, 0x33169: 0x6cbda620, 0x3316a: 0x6cbda820, 0x3316b: 0x6cbdaa20, - 0x3316c: 0x6cbdac20, 0x3316d: 0x6cbdae20, 0x3316e: 0x6cbdb020, 0x3316f: 0x6cee6a20, - 0x33170: 0x6cbdb220, 0x33171: 0x6cee6c20, 0x33172: 0x6cee6e20, 0x33173: 0x6cee7020, - 0x33174: 0x6cee7220, 0x33175: 0x6cee7420, 0x33176: 0x6d1e1820, 0x33177: 0x6d1e1a20, - 0x33178: 0x6d1e1c20, 0x33179: 0x6d1e1e20, 0x3317a: 0x6d1e2020, 0x3317b: 0x6d1e2220, - 0x3317c: 0x6d1e2420, 0x3317d: 0x6d1e2620, 0x3317e: 0x6d1e2820, 0x3317f: 0x6d4bb020, - // Block 0xcc6, offset 0x33180 - 0x33180: 0x6d4bb220, 0x33181: 0x6d4bb420, 0x33182: 0x6d791220, 0x33183: 0x6d791420, - 0x33184: 0x6d791620, 0x33185: 0x6d791820, 0x33186: 0x6da20c20, 0x33187: 0x6da20e20, - 0x33188: 0x6da21020, 0x33189: 0x6dc44820, 0x3318a: 0x6dc44a20, 0x3318b: 0x6de14c20, - 0x3318c: 0x6de14e20, 0x3318d: 0x6e0d2020, 0x3318e: 0x6e0d2220, 0x3318f: 0x6e3d1420, - 0x33190: 0x6de15020, 0x33191: 0x6e45be20, 0x33192: 0x6c03e820, 0x33193: 0x6c03ea20, - 0x33194: 0x6c03ec20, 0x33195: 0x6c07ec20, 0x33196: 0x6c07ee20, 0x33197: 0x6c07f020, - 0x33198: 0x6c07f220, 0x33199: 0x6c07f420, 0x3319a: 0x6c07f620, 0x3319b: 0x6c07f820, - 0x3319c: 0x6c04f620, 0x3319d: 0x6c0f4420, 0x3319e: 0x6c0f4620, 0x3319f: 0x6c0f4820, - 0x331a0: 0x6c0f4a20, 0x331a1: 0x6c0f4c20, 0x331a2: 0x6c0f4e20, 0x331a3: 0x6c0f5020, - 0x331a4: 0x6c0f5220, 0x331a5: 0x6c1b9a20, 0x331a6: 0x6c1b9c20, 0x331a7: 0x6c1b9e20, - 0x331a8: 0x6c1ba020, 0x331a9: 0x6c1ba220, 0x331aa: 0x6c1ba420, 0x331ab: 0x6c1ba620, - 0x331ac: 0x6c1ba820, 0x331ad: 0x6c1baa20, 0x331ae: 0x6c1bac20, 0x331af: 0x6c1bae20, - 0x331b0: 0x6c1bb020, 0x331b1: 0x6c1bb220, 0x331b2: 0x6c1bb420, 0x331b3: 0x6c1bb620, - 0x331b4: 0x6c1bb820, 0x331b5: 0x6c1bba20, 0x331b6: 0x6c1bbc20, 0x331b7: 0x6c2eba20, - 0x331b8: 0x6c2ebc20, 0x331b9: 0x6c2ebe20, 0x331ba: 0x6c2ec020, 0x331bb: 0x6c2ec220, - 0x331bc: 0x6c2ec420, 0x331bd: 0x6c2ec620, 0x331be: 0x6c2ec820, 0x331bf: 0x6c2eca20, - // Block 0xcc7, offset 0x331c0 - 0x331c0: 0x6c2ecc20, 0x331c1: 0x6c2ece20, 0x331c2: 0x6c2ed020, 0x331c3: 0x6c2ed220, - 0x331c4: 0x6c2ed420, 0x331c5: 0x6c2ed620, 0x331c6: 0x6c2ed820, 0x331c7: 0x6c2eda20, - 0x331c8: 0x6c2edc20, 0x331c9: 0x6c2ede20, 0x331ca: 0x6c2ee020, 0x331cb: 0x6c2ee220, - 0x331cc: 0x6c2ee420, 0x331cd: 0x6c491620, 0x331ce: 0x6c491820, 0x331cf: 0x6c491a20, - 0x331d0: 0x6c491c20, 0x331d1: 0x6c491e20, 0x331d2: 0x6c492020, 0x331d3: 0x6c492220, - 0x331d4: 0x6c492420, 0x331d5: 0x6c492620, 0x331d6: 0x6c492820, 0x331d7: 0x6c492a20, - 0x331d8: 0x6c492c20, 0x331d9: 0x6c492e20, 0x331da: 0x6c493020, 0x331db: 0x6c493220, - 0x331dc: 0x6c493420, 0x331dd: 0x6c6ab420, 0x331de: 0x6c6ab620, 0x331df: 0x6c6ab820, - 0x331e0: 0x6c6aba20, 0x331e1: 0x6c6abc20, 0x331e2: 0x6c6abe20, 0x331e3: 0x6c6ac020, - 0x331e4: 0x6c6ac220, 0x331e5: 0x6c6ac420, 0x331e6: 0x6c6ac620, 0x331e7: 0x6c6ac820, - 0x331e8: 0x6c6aca20, 0x331e9: 0x6c6acc20, 0x331ea: 0x6c6ace20, 0x331eb: 0x6c6ad020, - 0x331ec: 0x6c6ad220, 0x331ed: 0x6c6ad420, 0x331ee: 0x6c6ad620, 0x331ef: 0x6c6ad820, - 0x331f0: 0x6c6ada20, 0x331f1: 0x6c6adc20, 0x331f2: 0x6c6ade20, 0x331f3: 0x6c6ae020, - 0x331f4: 0x6c91a620, 0x331f5: 0x6c91a820, 0x331f6: 0x6c91aa20, 0x331f7: 0x6c91ac20, - 0x331f8: 0x6c91ae20, 0x331f9: 0x6c91b020, 0x331fa: 0x6c91b220, 0x331fb: 0x6c91b420, - 0x331fc: 0x6c91b620, 0x331fd: 0x6c91b820, 0x331fe: 0x6c91ba20, 0x331ff: 0x6c91bc20, - // Block 0xcc8, offset 0x33200 - 0x33200: 0x6c91be20, 0x33201: 0x6c91c020, 0x33202: 0x6c91c220, 0x33203: 0x6c91c420, - 0x33204: 0x6c91c620, 0x33205: 0x6c91c820, 0x33206: 0x6c91ca20, 0x33207: 0x6cbdc420, - 0x33208: 0x6cbdc620, 0x33209: 0x6cbdc820, 0x3320a: 0x6cbdca20, 0x3320b: 0x6cbdcc20, - 0x3320c: 0x6cbdce20, 0x3320d: 0x6cbdd020, 0x3320e: 0x6cbdd220, 0x3320f: 0x6cbdd420, - 0x33210: 0x6cbdd620, 0x33211: 0x6cbdd820, 0x33212: 0x6cbdda20, 0x33213: 0x6cbddc20, - 0x33214: 0x6cbdde20, 0x33215: 0x6cbde020, 0x33216: 0x6cbde220, 0x33217: 0x6cbde420, - 0x33218: 0x6cbde620, 0x33219: 0x6cbde820, 0x3321a: 0x6cbdea20, 0x3321b: 0x6cee7e20, - 0x3321c: 0x6cee8020, 0x3321d: 0x6cee8220, 0x3321e: 0x6cee8420, 0x3321f: 0x6cee8620, - 0x33220: 0x6cee8820, 0x33221: 0x6cee8a20, 0x33222: 0x6cee8c20, 0x33223: 0x6cee8e20, - 0x33224: 0x6cee9020, 0x33225: 0x6cee9220, 0x33226: 0x6cee9420, 0x33227: 0x6cee9620, - 0x33228: 0x6cee9820, 0x33229: 0x6cee9a20, 0x3322a: 0x6cee9c20, 0x3322b: 0x6cee9e20, - 0x3322c: 0x6d1e3620, 0x3322d: 0x6d1e3820, 0x3322e: 0x6d1e3a20, 0x3322f: 0x6d1e3c20, - 0x33230: 0x6d1e3e20, 0x33231: 0x6d1e4020, 0x33232: 0x6d1e4220, 0x33233: 0x6d1e4420, - 0x33234: 0x6d1e4620, 0x33235: 0x6d1e4820, 0x33236: 0x6d1e4a20, 0x33237: 0x6d4bba20, - 0x33238: 0x6d4bbc20, 0x33239: 0x6d4bbe20, 0x3323a: 0x6d4bc020, 0x3323b: 0x6d4bc220, - 0x3323c: 0x6d4bc420, 0x3323d: 0x6d4bc620, 0x3323e: 0x6d4bc820, 0x3323f: 0x6d4bca20, - // Block 0xcc9, offset 0x33240 - 0x33240: 0x6d4bcc20, 0x33241: 0x6d4bce20, 0x33242: 0x6d4bd020, 0x33243: 0x6d4bd220, - 0x33244: 0x6d4bd420, 0x33245: 0x6d4bd620, 0x33246: 0x6d792220, 0x33247: 0x6d792420, - 0x33248: 0x6d792620, 0x33249: 0x6d792820, 0x3324a: 0x6d792a20, 0x3324b: 0x6d792c20, - 0x3324c: 0x6d792e20, 0x3324d: 0x6d793020, 0x3324e: 0x6d793220, 0x3324f: 0x6da21220, - 0x33250: 0x6da21420, 0x33251: 0x6da21620, 0x33252: 0x6da21820, 0x33253: 0x6da21a20, - 0x33254: 0x6da21c20, 0x33255: 0x6da21e20, 0x33256: 0x6da22020, 0x33257: 0x6dc44e20, - 0x33258: 0x6de15220, 0x33259: 0x6de15420, 0x3325a: 0x6de15620, 0x3325b: 0x6df95820, - 0x3325c: 0x6e0d2420, 0x3325d: 0x6e0d2620, 0x3325e: 0x6e1c9420, 0x3325f: 0x6e1c9620, - 0x33260: 0x6e289e20, 0x33261: 0x6e28a020, 0x33262: 0x6e28a220, 0x33263: 0x6e31d420, - 0x33264: 0x6e31d620, 0x33265: 0x6e401220, 0x33266: 0x6c03f020, 0x33267: 0x6c080420, - 0x33268: 0x6c080620, 0x33269: 0x6c080820, 0x3326a: 0x6c080a20, 0x3326b: 0x6c080c20, - 0x3326c: 0x6c080e20, 0x3326d: 0x6c081020, 0x3326e: 0x6c0f8620, 0x3326f: 0x6c0f8820, - 0x33270: 0x6c0f8a20, 0x33271: 0x6c0f8c20, 0x33272: 0x6c0f8e20, 0x33273: 0x6c0f9020, - 0x33274: 0x6c0f9220, 0x33275: 0x6c0f9420, 0x33276: 0x6c0f9620, 0x33277: 0x6c0f9820, - 0x33278: 0x6c0f9a20, 0x33279: 0x6c0f9c20, 0x3327a: 0x6c0f9e20, 0x3327b: 0x6c0fa020, - 0x3327c: 0x6c1c1820, 0x3327d: 0x6c1c1a20, 0x3327e: 0x6c1c1c20, 0x3327f: 0x6c1c1e20, - // Block 0xcca, offset 0x33280 - 0x33280: 0x6c1c2020, 0x33281: 0x6c1c2220, 0x33282: 0x6c1c2420, 0x33283: 0x6c1c2620, - 0x33284: 0x6c1c2820, 0x33285: 0x6c1c2a20, 0x33286: 0x6c1c2c20, 0x33287: 0x6c1c2e20, - 0x33288: 0x6c1c3020, 0x33289: 0x6c1c3220, 0x3328a: 0x6c1c3420, 0x3328b: 0x6c1c3620, - 0x3328c: 0x6c1c3820, 0x3328d: 0x6c1c3a20, 0x3328e: 0x6c1c3c20, 0x3328f: 0x6c1c3e20, - 0x33290: 0x6c1c4020, 0x33291: 0x6c1c4220, 0x33292: 0x6c1c4420, 0x33293: 0x6c1c4620, - 0x33294: 0x6c1c4820, 0x33295: 0x6c1c4a20, 0x33296: 0x6c1c4c20, 0x33297: 0x6c1c4e20, - 0x33298: 0x6c1c5020, 0x33299: 0x6c2f6e20, 0x3329a: 0x6c2f7020, 0x3329b: 0x6c2f7220, - 0x3329c: 0x6c2f7420, 0x3329d: 0x6c2f7620, 0x3329e: 0x6c2f7820, 0x3329f: 0x6c2f7a20, - 0x332a0: 0x6c2f7c20, 0x332a1: 0x6c2f7e20, 0x332a2: 0x6c2f8020, 0x332a3: 0x6c2f8220, - 0x332a4: 0x6c2f8420, 0x332a5: 0x6c2f8620, 0x332a6: 0x6c2f8820, 0x332a7: 0x6c2f8a20, - 0x332a8: 0x6c2f8c20, 0x332a9: 0x6c2f8e20, 0x332aa: 0x6c2f9020, 0x332ab: 0x6c2f9220, - 0x332ac: 0x6c2f9420, 0x332ad: 0x6c2f9620, 0x332ae: 0x6c2f9820, 0x332af: 0x6c2f9a20, - 0x332b0: 0x6c2f9c20, 0x332b1: 0x6c2f9e20, 0x332b2: 0x6c2fa020, 0x332b3: 0x6c2fa220, - 0x332b4: 0x6c2fa420, 0x332b5: 0x6c2fa620, 0x332b6: 0x6c2fa820, 0x332b7: 0x6c2faa20, - 0x332b8: 0x6c2fac20, 0x332b9: 0x6c2fae20, 0x332ba: 0x6c2fb020, 0x332bb: 0x6c2fb220, - 0x332bc: 0x6c2fb420, 0x332bd: 0x6c2fb620, 0x332be: 0x6c2fb820, 0x332bf: 0x6c2fba20, - // Block 0xccb, offset 0x332c0 - 0x332c0: 0x6c2fbc20, 0x332c1: 0x6c2fbe20, 0x332c2: 0x6c49b420, 0x332c3: 0x6c49b620, - 0x332c4: 0x6c49b820, 0x332c5: 0x6c49ba20, 0x332c6: 0x6c49bc20, 0x332c7: 0x6c49be20, - 0x332c8: 0x6c49c020, 0x332c9: 0x6c49c220, 0x332ca: 0x6c49c420, 0x332cb: 0x6c49c620, - 0x332cc: 0x6c49c820, 0x332cd: 0x6c49ca20, 0x332ce: 0x6c49cc20, 0x332cf: 0x6c49ce20, - 0x332d0: 0x6c49d020, 0x332d1: 0x6c49d220, 0x332d2: 0x6c49d420, 0x332d3: 0x6c49d620, - 0x332d4: 0x6c49d820, 0x332d5: 0x6c49da20, 0x332d6: 0x6c49dc20, 0x332d7: 0x6c49de20, - 0x332d8: 0x6c49e020, 0x332d9: 0x6c49e220, 0x332da: 0x6c49e420, 0x332db: 0x6c49e620, - 0x332dc: 0x6c49e820, 0x332dd: 0x6c49ea20, 0x332de: 0x6c49ec20, 0x332df: 0x6c49ee20, - 0x332e0: 0x6c49f020, 0x332e1: 0x6c49f220, 0x332e2: 0x6c49f420, 0x332e3: 0x6c49f620, - 0x332e4: 0x6c49f820, 0x332e5: 0x6c49fa20, 0x332e6: 0x6c49fc20, 0x332e7: 0x6c49fe20, - 0x332e8: 0x6c4a0020, 0x332e9: 0x6c4a0220, 0x332ea: 0x6c4a0420, 0x332eb: 0x6c4a0620, - 0x332ec: 0x6c4a0820, 0x332ed: 0x6c4a0a20, 0x332ee: 0x6c6b6c20, 0x332ef: 0x6c6b6e20, - 0x332f0: 0x6c6b7020, 0x332f1: 0x6c6b7220, 0x332f2: 0x6c6b7420, 0x332f3: 0x6c6b7620, - 0x332f4: 0x6c6b7820, 0x332f5: 0x6c6b7a20, 0x332f6: 0x6c6b7c20, 0x332f7: 0x6c6b7e20, - 0x332f8: 0x6c6b8020, 0x332f9: 0x6c6b8220, 0x332fa: 0x6c6b8420, 0x332fb: 0x6c6b8620, - 0x332fc: 0x6c6b8820, 0x332fd: 0x6c6b8a20, 0x332fe: 0x6c6b8c20, 0x332ff: 0x6c6b8e20, - // Block 0xccc, offset 0x33300 - 0x33300: 0x6c6b9020, 0x33301: 0x6c6b9220, 0x33302: 0x6c6b9420, 0x33303: 0x6c6b9620, - 0x33304: 0x6c6b9820, 0x33305: 0x6c6b9a20, 0x33306: 0x6c6b9c20, 0x33307: 0x6c6b9e20, - 0x33308: 0x6c6ba020, 0x33309: 0x6c6ba220, 0x3330a: 0x6c6ba420, 0x3330b: 0x6c6ba620, - 0x3330c: 0x6c6ba820, 0x3330d: 0x6c6baa20, 0x3330e: 0x6c6bac20, 0x3330f: 0x6c6bae20, - 0x33310: 0x6c6bb020, 0x33311: 0x6c6bb220, 0x33312: 0x6c6bb420, 0x33313: 0x6c6bb620, - 0x33314: 0x6c6bb820, 0x33315: 0x6c6bba20, 0x33316: 0x6c6bbc20, 0x33317: 0x6c6bbe20, - 0x33318: 0x6c6bc020, 0x33319: 0x6c6bc220, 0x3331a: 0x6c6bc420, 0x3331b: 0x6c6bc620, - 0x3331c: 0x6c6bc820, 0x3331d: 0x6c6bca20, 0x3331e: 0x6c927020, 0x3331f: 0x6c927220, - 0x33320: 0x6c927420, 0x33321: 0x6c927620, 0x33322: 0x6c927820, 0x33323: 0x6c927a20, - 0x33324: 0x6c927c20, 0x33325: 0x6c927e20, 0x33326: 0x6c928020, 0x33327: 0x6c928220, - 0x33328: 0x6c928420, 0x33329: 0x6c928620, 0x3332a: 0x6c928820, 0x3332b: 0x6c928a20, - 0x3332c: 0x6c928c20, 0x3332d: 0x6c928e20, 0x3332e: 0x6c929020, 0x3332f: 0x6c929220, - 0x33330: 0x6c929420, 0x33331: 0x6c929620, 0x33332: 0x6c929820, 0x33333: 0x6c929a20, - 0x33334: 0x6c929c20, 0x33335: 0x6c929e20, 0x33336: 0x6c92a020, 0x33337: 0x6c92a220, - 0x33338: 0x6c92a420, 0x33339: 0x6c92a620, 0x3333a: 0x6c92a820, 0x3333b: 0x6c92aa20, - 0x3333c: 0x6c92ac20, 0x3333d: 0x6c92ae20, 0x3333e: 0x6c92b020, 0x3333f: 0x6c92b220, - // Block 0xccd, offset 0x33340 - 0x33340: 0x6c92b420, 0x33341: 0x6c92b620, 0x33342: 0x6c92b820, 0x33343: 0x6c92ba20, - 0x33344: 0x6c92bc20, 0x33345: 0x6c92be20, 0x33346: 0x6c92c020, 0x33347: 0x6c92c220, - 0x33348: 0x6c92c420, 0x33349: 0x6c92c620, 0x3334a: 0x6c92c820, 0x3334b: 0x6c92ca20, - 0x3334c: 0x6c92cc20, 0x3334d: 0x6c92ce20, 0x3334e: 0x6c92d020, 0x3334f: 0x6c92d220, - 0x33350: 0x6c92d420, 0x33351: 0x6c92d620, 0x33352: 0x6c92d820, 0x33353: 0x6c92da20, - 0x33354: 0x6c92dc20, 0x33355: 0x6c92de20, 0x33356: 0x6c92e020, 0x33357: 0x6c92e220, - 0x33358: 0x6c92e420, 0x33359: 0x6c92e620, 0x3335a: 0x6c92e820, 0x3335b: 0x6c92ea20, - 0x3335c: 0x6cbe9020, 0x3335d: 0x6cbe9220, 0x3335e: 0x6cbe9420, 0x3335f: 0x6cbe9620, - 0x33360: 0x6cbe9820, 0x33361: 0x6cbe9a20, 0x33362: 0x6cbe9c20, 0x33363: 0x6cbe9e20, - 0x33364: 0x6cbea020, 0x33365: 0x6cbea220, 0x33366: 0x6cbea420, 0x33367: 0x6cbea620, - 0x33368: 0x6cbea820, 0x33369: 0x6cbeaa20, 0x3336a: 0x6cbeac20, 0x3336b: 0x6cbeae20, - 0x3336c: 0x6cbeb020, 0x3336d: 0x6cbeb220, 0x3336e: 0x6cbeb420, 0x3336f: 0x6cbeb620, - 0x33370: 0x6cbeb820, 0x33371: 0x6cbeba20, 0x33372: 0x6cbebc20, 0x33373: 0x6cbebe20, - 0x33374: 0x6cbec020, 0x33375: 0x6cbec220, 0x33376: 0x6cbec420, 0x33377: 0x6cbec620, - 0x33378: 0x6cbec820, 0x33379: 0x6cbeca20, 0x3337a: 0x6cbecc20, 0x3337b: 0x6cbece20, - 0x3337c: 0x6cbed020, 0x3337d: 0x6cbed220, 0x3337e: 0x6cbed420, 0x3337f: 0x6cbed620, - // Block 0xcce, offset 0x33380 - 0x33380: 0x6cbed820, 0x33381: 0x6cbeda20, 0x33382: 0x6cbedc20, 0x33383: 0x6cbede20, - 0x33384: 0x6cbee020, 0x33385: 0x6cbee220, 0x33386: 0x6cbee420, 0x33387: 0x6cbee620, - 0x33388: 0x6cbee820, 0x33389: 0x6cbeea20, 0x3338a: 0x6cbeec20, 0x3338b: 0x6cbeee20, - 0x3338c: 0x6cbef020, 0x3338d: 0x6cbef220, 0x3338e: 0x6cbef420, 0x3338f: 0x6cbef620, - 0x33390: 0x6cbef820, 0x33391: 0x6cbefa20, 0x33392: 0x6cbefc20, 0x33393: 0x6cbefe20, - 0x33394: 0x6cbf0020, 0x33395: 0x6cbf0220, 0x33396: 0x6cbf0420, 0x33397: 0x6cbf0620, - 0x33398: 0x6cbf0820, 0x33399: 0x6cbf0a20, 0x3339a: 0x6cbf0c20, 0x3339b: 0x6cbf0e20, - 0x3339c: 0x6cbf1020, 0x3339d: 0x6cbf1220, 0x3339e: 0x6cbf1420, 0x3339f: 0x6cbf1620, - 0x333a0: 0x6cbf1820, 0x333a1: 0x6cbf1a20, 0x333a2: 0x6cbf1c20, 0x333a3: 0x6cbf1e20, - 0x333a4: 0x6cbf2020, 0x333a5: 0x6cbf2220, 0x333a6: 0x6cbf2420, 0x333a7: 0x6cbf2620, - 0x333a8: 0x6cef1020, 0x333a9: 0x6cef1220, 0x333aa: 0x6cef1420, 0x333ab: 0x6cef1620, - 0x333ac: 0x6cef1820, 0x333ad: 0x6cef1a20, 0x333ae: 0x6cef1c20, 0x333af: 0x6cef1e20, - 0x333b0: 0x6cef2020, 0x333b1: 0x6cef2220, 0x333b2: 0x6cef2420, 0x333b3: 0x6cef2620, - 0x333b4: 0x6cef2820, 0x333b5: 0x6cef2a20, 0x333b6: 0x6cef2c20, 0x333b7: 0x6cef2e20, - 0x333b8: 0x6cef3020, 0x333b9: 0x6cef3220, 0x333ba: 0x6cef3420, 0x333bb: 0x6cef3620, - 0x333bc: 0x6cef3820, 0x333bd: 0x6cef3a20, 0x333be: 0x6cef3c20, 0x333bf: 0x6cef3e20, - // Block 0xccf, offset 0x333c0 - 0x333c0: 0x6cef4020, 0x333c1: 0x6cef4220, 0x333c2: 0x6cef4420, 0x333c3: 0x6cef4620, - 0x333c4: 0x6cef4820, 0x333c5: 0x6cef4a20, 0x333c6: 0x6cef4c20, 0x333c7: 0x6cef4e20, - 0x333c8: 0x6cef5020, 0x333c9: 0x6cef5220, 0x333ca: 0x6cef5420, 0x333cb: 0x6cef5620, - 0x333cc: 0x6cef5820, 0x333cd: 0x6cef5a20, 0x333ce: 0x6cef5c20, 0x333cf: 0x6cef5e20, - 0x333d0: 0x6cef6020, 0x333d1: 0x6cef6220, 0x333d2: 0x6cef6420, 0x333d3: 0x6cef6620, - 0x333d4: 0x6cef6820, 0x333d5: 0x6cef6a20, 0x333d6: 0x6d4c2220, 0x333d7: 0x6d1eaa20, - 0x333d8: 0x6d4c2420, 0x333d9: 0x6d1eac20, 0x333da: 0x6d1eae20, 0x333db: 0x6d1eb020, - 0x333dc: 0x6d1eb220, 0x333dd: 0x6d1eb420, 0x333de: 0x6d1eb620, 0x333df: 0x6d1eb820, - 0x333e0: 0x6d1eba20, 0x333e1: 0x6d1ebc20, 0x333e2: 0x6d1ebe20, 0x333e3: 0x6cbf2820, - 0x333e4: 0x6d1ec020, 0x333e5: 0x6d1ec220, 0x333e6: 0x6d1ec420, 0x333e7: 0x6d1ec620, - 0x333e8: 0x6d1ec820, 0x333e9: 0x6d1eca20, 0x333ea: 0x6d1ecc20, 0x333eb: 0x6d1ece20, - 0x333ec: 0x6d1ed020, 0x333ed: 0x6d1ed220, 0x333ee: 0x6d1ed420, 0x333ef: 0x6d1ed620, - 0x333f0: 0x6d1ed820, 0x333f1: 0x6d1eda20, 0x333f2: 0x6d4c2620, 0x333f3: 0x6d1edc20, - 0x333f4: 0x6d1ede20, 0x333f5: 0x6d1ee020, 0x333f6: 0x6d1ee220, 0x333f7: 0x6d1ee420, - 0x333f8: 0x6d1ee620, 0x333f9: 0x6d1ee820, 0x333fa: 0x6d1eea20, 0x333fb: 0x6d1eec20, - 0x333fc: 0x6d1eee20, 0x333fd: 0x6d1ef020, 0x333fe: 0x6d1ef220, 0x333ff: 0x6d1ef420, - // Block 0xcd0, offset 0x33400 - 0x33400: 0x6d1ef620, 0x33401: 0x6d1ef820, 0x33402: 0x6d1efa20, 0x33403: 0x6d1efc20, - 0x33404: 0x6d1efe20, 0x33405: 0x6d1f0020, 0x33406: 0x6d1f0220, 0x33407: 0x6d1f0420, - 0x33408: 0x6d1f0620, 0x33409: 0x6d1f0820, 0x3340a: 0x6d1f0a20, 0x3340b: 0x6d1f0c20, - 0x3340c: 0x6d1f0e20, 0x3340d: 0x6d1f1020, 0x3340e: 0x6d1f1220, 0x3340f: 0x6d4c2820, - 0x33410: 0x6d4c2a20, 0x33411: 0x6d4c2c20, 0x33412: 0x6d4c2e20, 0x33413: 0x6d4c3020, - 0x33414: 0x6d4c3220, 0x33415: 0x6d4c3420, 0x33416: 0x6d4c3620, 0x33417: 0x6d4c3820, - 0x33418: 0x6d4c3a20, 0x33419: 0x6d4c3c20, 0x3341a: 0x6d4c3e20, 0x3341b: 0x6d4c4020, - 0x3341c: 0x6d4c4220, 0x3341d: 0x6d4c4420, 0x3341e: 0x6d4c4620, 0x3341f: 0x6d4c4820, - 0x33420: 0x6d4c4a20, 0x33421: 0x6d4c4c20, 0x33422: 0x6d4c4e20, 0x33423: 0x6d4c5020, - 0x33424: 0x6d4c5220, 0x33425: 0x6d4c5420, 0x33426: 0x6d4c5620, 0x33427: 0x6d4c5820, - 0x33428: 0x6d4c5a20, 0x33429: 0x6d4c5c20, 0x3342a: 0x6d4c5e20, 0x3342b: 0x6d4c6020, - 0x3342c: 0x6d4c6220, 0x3342d: 0x6d4c6420, 0x3342e: 0x6d4c6620, 0x3342f: 0x6d4c6820, - 0x33430: 0x6d4c6a20, 0x33431: 0x6d4c6c20, 0x33432: 0x6d4c6e20, 0x33433: 0x6d4c7020, - 0x33434: 0x6d4c7220, 0x33435: 0x6d4c7420, 0x33436: 0x6d4c7620, 0x33437: 0x6d4c7820, - 0x33438: 0x6d4c7a20, 0x33439: 0x6d4c7c20, 0x3343a: 0x6d4c7e20, 0x3343b: 0x6d4c8020, - 0x3343c: 0x6d4c8220, 0x3343d: 0x6d4c8420, 0x3343e: 0x6d4c8620, 0x3343f: 0x6d4c8820, - // Block 0xcd1, offset 0x33440 - 0x33440: 0x6d4c8a20, 0x33441: 0x6d4c8c20, 0x33442: 0x6d4c8e20, 0x33443: 0x6d4c9020, - 0x33444: 0x6d4c9220, 0x33445: 0x6d4c9420, 0x33446: 0x6d4c9620, 0x33447: 0x6d4c9820, - 0x33448: 0x6d4c9a20, 0x33449: 0x6d4c9c20, 0x3344a: 0x6d4c9e20, 0x3344b: 0x6d4ca020, - 0x3344c: 0x6d4ca220, 0x3344d: 0x6d4ca420, 0x3344e: 0x6d796a20, 0x3344f: 0x6d601620, - 0x33450: 0x6d4ca620, 0x33451: 0x6d796c20, 0x33452: 0x6d796e20, 0x33453: 0x6d797020, - 0x33454: 0x6d797220, 0x33455: 0x6d797420, 0x33456: 0x6d797620, 0x33457: 0x6d797820, - 0x33458: 0x6d797a20, 0x33459: 0x6d797c20, 0x3345a: 0x6d797e20, 0x3345b: 0x6d798020, - 0x3345c: 0x6d798220, 0x3345d: 0x6d798420, 0x3345e: 0x6d798620, 0x3345f: 0x6d798820, - 0x33460: 0x6d798a20, 0x33461: 0x6d798c20, 0x33462: 0x6d798e20, 0x33463: 0x6d799020, - 0x33464: 0x6d799220, 0x33465: 0x6d799420, 0x33466: 0x6d799620, 0x33467: 0x6d799820, - 0x33468: 0x6d799a20, 0x33469: 0x6d799c20, 0x3346a: 0x6d799e20, 0x3346b: 0x6d79a020, - 0x3346c: 0x6d79a220, 0x3346d: 0x6d79a420, 0x3346e: 0x6d79a620, 0x3346f: 0x6d79a820, - 0x33470: 0x6d79aa20, 0x33471: 0x6d79ac20, 0x33472: 0x6d79ae20, 0x33473: 0x6d79b020, - 0x33474: 0x6d79b220, 0x33475: 0x6d79b420, 0x33476: 0x6d79b620, 0x33477: 0x6d79b820, - 0x33478: 0x6d79ba20, 0x33479: 0x6d79bc20, 0x3347a: 0x6d79be20, 0x3347b: 0x6d79c020, - 0x3347c: 0x6d79c220, 0x3347d: 0x6d79c420, 0x3347e: 0x6d79c620, 0x3347f: 0x6d79c820, - // Block 0xcd2, offset 0x33480 - 0x33480: 0x6d79ca20, 0x33481: 0x6d79cc20, 0x33482: 0x6d79ce20, 0x33483: 0x6d79d020, - 0x33484: 0x6d79d220, 0x33485: 0x6da24c20, 0x33486: 0x6da24e20, 0x33487: 0x6da25020, - 0x33488: 0x6da25220, 0x33489: 0x6da25420, 0x3348a: 0x6da25620, 0x3348b: 0x6da25820, - 0x3348c: 0x6da25a20, 0x3348d: 0x6da25c20, 0x3348e: 0x6da25e20, 0x3348f: 0x6da26020, - 0x33490: 0x6da26220, 0x33491: 0x6da26420, 0x33492: 0x6da26620, 0x33493: 0x6da26820, - 0x33494: 0x6da26a20, 0x33495: 0x6da26c20, 0x33496: 0x6da26e20, 0x33497: 0x6da27020, - 0x33498: 0x6da27220, 0x33499: 0x6da27420, 0x3349a: 0x6da27620, 0x3349b: 0x6da27820, - 0x3349c: 0x6da27a20, 0x3349d: 0x6da27c20, 0x3349e: 0x6da27e20, 0x3349f: 0x6da28020, - 0x334a0: 0x6da28220, 0x334a1: 0x6da28420, 0x334a2: 0x6db99820, 0x334a3: 0x6da28620, - 0x334a4: 0x6da28820, 0x334a5: 0x6da28a20, 0x334a6: 0x6da28c20, 0x334a7: 0x6da28e20, - 0x334a8: 0x6da29020, 0x334a9: 0x6da29220, 0x334aa: 0x6dc46020, 0x334ab: 0x6dc46220, - 0x334ac: 0x6dc46420, 0x334ad: 0x6dc46620, 0x334ae: 0x6dc46820, 0x334af: 0x6dc46a20, - 0x334b0: 0x6dc46c20, 0x334b1: 0x6dc46e20, 0x334b2: 0x6dc47020, 0x334b3: 0x6dc47220, - 0x334b4: 0x6dc47420, 0x334b5: 0x6dc47620, 0x334b6: 0x6dc47820, 0x334b7: 0x6dc47a20, - 0x334b8: 0x6dc47c20, 0x334b9: 0x6dc47e20, 0x334ba: 0x6dc48020, 0x334bb: 0x6dc48220, - 0x334bc: 0x6dc48420, 0x334bd: 0x6de16820, 0x334be: 0x6de16a20, 0x334bf: 0x6de16c20, - // Block 0xcd3, offset 0x334c0 - 0x334c0: 0x6de16e20, 0x334c1: 0x6de17020, 0x334c2: 0x6de17220, 0x334c3: 0x6de17420, - 0x334c4: 0x6de17620, 0x334c5: 0x6de17820, 0x334c6: 0x6de17a20, 0x334c7: 0x6de17c20, - 0x334c8: 0x6de17e20, 0x334c9: 0x6de18020, 0x334ca: 0x6de18220, 0x334cb: 0x6de18420, - 0x334cc: 0x6de18620, 0x334cd: 0x6de18820, 0x334ce: 0x6df97020, 0x334cf: 0x6df97220, - 0x334d0: 0x6df97420, 0x334d1: 0x6df97620, 0x334d2: 0x6df97820, 0x334d3: 0x6df97a20, - 0x334d4: 0x6df97c20, 0x334d5: 0x6df97e20, 0x334d6: 0x6df98020, 0x334d7: 0x6df98220, - 0x334d8: 0x6e0d3020, 0x334d9: 0x6e0d3220, 0x334da: 0x6e0d3420, 0x334db: 0x6e0d3620, - 0x334dc: 0x6e0d3820, 0x334dd: 0x6e0d3a20, 0x334de: 0x6de18a20, 0x334df: 0x6e0d3c20, - 0x334e0: 0x6e0d3e20, 0x334e1: 0x6e1ca020, 0x334e2: 0x6e1ca220, 0x334e3: 0x6e1ca420, - 0x334e4: 0x6e1ca620, 0x334e5: 0x6e1ca820, 0x334e6: 0x6e1caa20, 0x334e7: 0x6e1cac20, - 0x334e8: 0x6e1cae20, 0x334e9: 0x6e1cb020, 0x334ea: 0x6e1cb220, 0x334eb: 0x6e28a820, - 0x334ec: 0x6e28aa20, 0x334ed: 0x6e28ac20, 0x334ee: 0x6e31dc20, 0x334ef: 0x6e31de20, - 0x334f0: 0x6e31e020, 0x334f1: 0x6e31e220, 0x334f2: 0x6e31e420, 0x334f3: 0x6e31e620, - 0x334f4: 0x6e386220, 0x334f5: 0x6e386420, 0x334f6: 0x6e386620, 0x334f7: 0x6e401420, - 0x334f8: 0x6e401620, 0x334f9: 0x6e401820, 0x334fa: 0x6e401a20, 0x334fb: 0x6e467e20, - 0x334fc: 0x6c019e20, 0x334fd: 0x6c03f420, 0x334fe: 0x6c081420, 0x334ff: 0x6c081620, - // Block 0xcd4, offset 0x33500 - 0x33500: 0x6c081820, 0x33501: 0x6c081a20, 0x33502: 0x6c081c20, 0x33503: 0x6c0fb220, - 0x33504: 0x6c0fb420, 0x33505: 0x6c0fb620, 0x33506: 0x6c1c7020, 0x33507: 0x6c1c7220, - 0x33508: 0x6c1c7420, 0x33509: 0x6c1c7620, 0x3350a: 0x6c1c7820, 0x3350b: 0x6c18cc20, - 0x3350c: 0x6c1c7a20, 0x3350d: 0x6c1c7c20, 0x3350e: 0x6c2fde20, 0x3350f: 0x6c2fe020, - 0x33510: 0x6c2fe220, 0x33511: 0x6c2fe420, 0x33512: 0x6c2fe620, 0x33513: 0x6c2fe820, - 0x33514: 0x6c2fea20, 0x33515: 0x6c2fec20, 0x33516: 0x6c2fee20, 0x33517: 0x6c2ff020, - 0x33518: 0x6c2ff220, 0x33519: 0x6c2ff420, 0x3351a: 0x6c2ff620, 0x3351b: 0x6c4a2420, - 0x3351c: 0x6c4a2620, 0x3351d: 0x6c4a2820, 0x3351e: 0x6c4a2a20, 0x3351f: 0x6c4a2c20, - 0x33520: 0x6c4a2e20, 0x33521: 0x6c4a3020, 0x33522: 0x6c4a3220, 0x33523: 0x6c4a3420, - 0x33524: 0x6c4a3620, 0x33525: 0x6c4a3820, 0x33526: 0x6c4a3a20, 0x33527: 0x6c4a3c20, - 0x33528: 0x6c6be620, 0x33529: 0x6c6be820, 0x3352a: 0x6c6bea20, 0x3352b: 0x6c6bec20, - 0x3352c: 0x6c6bee20, 0x3352d: 0x6c6bf020, 0x3352e: 0x6c930c20, 0x3352f: 0x6c930e20, - 0x33530: 0x6c931020, 0x33531: 0x6c931220, 0x33532: 0x6c931420, 0x33533: 0x6c931620, - 0x33534: 0x6c931820, 0x33535: 0x6c931a20, 0x33536: 0x6cbf4620, 0x33537: 0x6cbf4820, - 0x33538: 0x6cbf4a20, 0x33539: 0x6cbf4c20, 0x3353a: 0x6cbf4e20, 0x3353b: 0x6cbf5020, - 0x3353c: 0x6cbf5220, 0x3353d: 0x6cbf5420, 0x3353e: 0x6cbf5620, 0x3353f: 0x6cbf5820, - // Block 0xcd5, offset 0x33540 - 0x33540: 0x6cbf5a20, 0x33541: 0x6cbf5c20, 0x33542: 0x6cbf5e20, 0x33543: 0x6cef7c20, - 0x33544: 0x6cef7e20, 0x33545: 0x6cef8020, 0x33546: 0x6cef8220, 0x33547: 0x6cef8420, - 0x33548: 0x6cef8620, 0x33549: 0x6cef8820, 0x3354a: 0x6cef8a20, 0x3354b: 0x6cef8c20, - 0x3354c: 0x6cef8e20, 0x3354d: 0x6cef9020, 0x3354e: 0x6cef9220, 0x3354f: 0x6cef9420, - 0x33550: 0x6cef9620, 0x33551: 0x6d1f2e20, 0x33552: 0x6d1f3020, 0x33553: 0x6d1f3220, - 0x33554: 0x6d1f3420, 0x33555: 0x6d1f3620, 0x33556: 0x6d1f3820, 0x33557: 0x6d4cb820, - 0x33558: 0x6d4cba20, 0x33559: 0x6d4cbc20, 0x3355a: 0x6d4cbe20, 0x3355b: 0x6d4cc020, - 0x3355c: 0x6d4cc220, 0x3355d: 0x6d4cc420, 0x3355e: 0x6d79e620, 0x3355f: 0x6d79e820, - 0x33560: 0x6d79ea20, 0x33561: 0x6d79ec20, 0x33562: 0x6d79ee20, 0x33563: 0x6d79f020, - 0x33564: 0x6d79f220, 0x33565: 0x6d79f420, 0x33566: 0x6d79f620, 0x33567: 0x6d79f820, - 0x33568: 0x6d79fa20, 0x33569: 0x6da29a20, 0x3356a: 0x6dc48e20, 0x3356b: 0x6dc49020, - 0x3356c: 0x6dc49220, 0x3356d: 0x6de19220, 0x3356e: 0x6de19420, 0x3356f: 0x6de19620, - 0x33570: 0x6de19820, 0x33571: 0x6df98a20, 0x33572: 0x6df98c20, 0x33573: 0x6df98e20, - 0x33574: 0x6df99020, 0x33575: 0x6df99220, 0x33576: 0x6df99420, 0x33577: 0x6e1cb620, - 0x33578: 0x6e401c20, 0x33579: 0x6c03f820, 0x3357a: 0x6c082a20, 0x3357b: 0x6c082c20, - 0x3357c: 0x6c082e20, 0x3357d: 0x6c0fc620, 0x3357e: 0x6c0fc820, 0x3357f: 0x6c0fca20, - // Block 0xcd6, offset 0x33580 - 0x33580: 0x6c0fcc20, 0x33581: 0x6c0fce20, 0x33582: 0x6c0fd020, 0x33583: 0x6c0fd220, - 0x33584: 0x6c0fd420, 0x33585: 0x6c0fd620, 0x33586: 0x6c0fd820, 0x33587: 0x6c0fda20, - 0x33588: 0x6c0fdc20, 0x33589: 0x6c0fde20, 0x3358a: 0x6c0fe020, 0x3358b: 0x6c1ca020, - 0x3358c: 0x6c1ca220, 0x3358d: 0x6c1ca420, 0x3358e: 0x6c1ca620, 0x3358f: 0x6c1ca820, - 0x33590: 0x6c1caa20, 0x33591: 0x6c1cac20, 0x33592: 0x6c1cae20, 0x33593: 0x6c1cb020, - 0x33594: 0x6c1cb220, 0x33595: 0x6c1cb420, 0x33596: 0x6c301a20, 0x33597: 0x6c301c20, - 0x33598: 0x6c301e20, 0x33599: 0x6c302020, 0x3359a: 0x6c302220, 0x3359b: 0x6c302420, - 0x3359c: 0x6c302620, 0x3359d: 0x6c302820, 0x3359e: 0x6c302a20, 0x3359f: 0x6c302c20, - 0x335a0: 0x6c302e20, 0x335a1: 0x6c303020, 0x335a2: 0x6c303220, 0x335a3: 0x6c303420, - 0x335a4: 0x6c303620, 0x335a5: 0x6c303820, 0x335a6: 0x6c303a20, 0x335a7: 0x6c303c20, - 0x335a8: 0x6c303e20, 0x335a9: 0x6c4a5a20, 0x335aa: 0x6c4a5c20, 0x335ab: 0x6c4a5e20, - 0x335ac: 0x6c4a6020, 0x335ad: 0x6c4a6220, 0x335ae: 0x6c4a6420, 0x335af: 0x6c4a6620, - 0x335b0: 0x6c4a6820, 0x335b1: 0x6c4a6a20, 0x335b2: 0x6c4a6c20, 0x335b3: 0x6c4a6e20, - 0x335b4: 0x6c4a7020, 0x335b5: 0x6c4a7220, 0x335b6: 0x6c4a7420, 0x335b7: 0x6c4a7620, - 0x335b8: 0x6c4a7820, 0x335b9: 0x6c4a7a20, 0x335ba: 0x6c4a7c20, 0x335bb: 0x6c4a7e20, - 0x335bc: 0x6c4a8020, 0x335bd: 0x6c4a8220, 0x335be: 0x6c4a8420, 0x335bf: 0x6c4a8620, - // Block 0xcd7, offset 0x335c0 - 0x335c0: 0x6c6c2620, 0x335c1: 0x6c6c2820, 0x335c2: 0x6c6c2a20, 0x335c3: 0x6c6c2c20, - 0x335c4: 0x6c6c2e20, 0x335c5: 0x6c6c3020, 0x335c6: 0x6c6c3220, 0x335c7: 0x6c6c3420, - 0x335c8: 0x6c6c3620, 0x335c9: 0x6c6c3820, 0x335ca: 0x6c6c3a20, 0x335cb: 0x6c6c3c20, - 0x335cc: 0x6c6c3e20, 0x335cd: 0x6c6c4020, 0x335ce: 0x6c6c4220, 0x335cf: 0x6c6c4420, - 0x335d0: 0x6c6c4620, 0x335d1: 0x6c6c4820, 0x335d2: 0x6c6c4a20, 0x335d3: 0x6c6c4c20, - 0x335d4: 0x6c6c4e20, 0x335d5: 0x6c6c5020, 0x335d6: 0x6c6c5220, 0x335d7: 0x6c6c5420, - 0x335d8: 0x6c6c5620, 0x335d9: 0x6c6c5820, 0x335da: 0x6c6c5a20, 0x335db: 0x6c6c5c20, - 0x335dc: 0x6c6c5e20, 0x335dd: 0x6c6c6020, 0x335de: 0x6c6c6220, 0x335df: 0x6c6c6420, - 0x335e0: 0x6c6c6620, 0x335e1: 0x6c6c6820, 0x335e2: 0x6c934620, 0x335e3: 0x6c934820, - 0x335e4: 0x6c934a20, 0x335e5: 0x6c934c20, 0x335e6: 0x6c934e20, 0x335e7: 0x6c935020, - 0x335e8: 0x6c935220, 0x335e9: 0x6c935420, 0x335ea: 0x6c935620, 0x335eb: 0x6c935820, - 0x335ec: 0x6c935a20, 0x335ed: 0x6c935c20, 0x335ee: 0x6c935e20, 0x335ef: 0x6c936020, - 0x335f0: 0x6c936220, 0x335f1: 0x6c936420, 0x335f2: 0x6c936620, 0x335f3: 0x6c936820, - 0x335f4: 0x6c936a20, 0x335f5: 0x6c936c20, 0x335f6: 0x6c936e20, 0x335f7: 0x6c937020, - 0x335f8: 0x6c937220, 0x335f9: 0x6c937420, 0x335fa: 0x6c937620, 0x335fb: 0x6c937820, - 0x335fc: 0x6c937a20, 0x335fd: 0x6cbf8220, 0x335fe: 0x6cbf8420, 0x335ff: 0x6cbf8620, - // Block 0xcd8, offset 0x33600 - 0x33600: 0x6cbf8820, 0x33601: 0x6cbf8a20, 0x33602: 0x6cbf8c20, 0x33603: 0x6cbf8e20, - 0x33604: 0x6cbf9020, 0x33605: 0x6cbf9220, 0x33606: 0x6cbf9420, 0x33607: 0x6cbf9620, - 0x33608: 0x6cbf9820, 0x33609: 0x6cbf9a20, 0x3360a: 0x6cbf9c20, 0x3360b: 0x6cbf9e20, - 0x3360c: 0x6cbfa020, 0x3360d: 0x6cbfa220, 0x3360e: 0x6cbfa420, 0x3360f: 0x6cbfa620, - 0x33610: 0x6cbfa820, 0x33611: 0x6cbfaa20, 0x33612: 0x6cbfac20, 0x33613: 0x6cbfae20, - 0x33614: 0x6cbfb020, 0x33615: 0x6cbfb220, 0x33616: 0x6cbfb420, 0x33617: 0x6cbfb620, - 0x33618: 0x6cbfb820, 0x33619: 0x6cbfba20, 0x3361a: 0x6cbfbc20, 0x3361b: 0x6cbfbe20, - 0x3361c: 0x6cbfc020, 0x3361d: 0x6cbfc220, 0x3361e: 0x6cbfc420, 0x3361f: 0x6cefb420, - 0x33620: 0x6cefb620, 0x33621: 0x6cefb820, 0x33622: 0x6cefba20, 0x33623: 0x6cefbc20, - 0x33624: 0x6cefbe20, 0x33625: 0x6cefc020, 0x33626: 0x6cefc220, 0x33627: 0x6cefc420, - 0x33628: 0x6cefc620, 0x33629: 0x6cefc820, 0x3362a: 0x6cefca20, 0x3362b: 0x6cefcc20, - 0x3362c: 0x6cefce20, 0x3362d: 0x6cefd020, 0x3362e: 0x6cefd220, 0x3362f: 0x6cefd420, - 0x33630: 0x6cefd620, 0x33631: 0x6cefd820, 0x33632: 0x6cefda20, 0x33633: 0x6cefdc20, - 0x33634: 0x6cefde20, 0x33635: 0x6cefe020, 0x33636: 0x6cefe220, 0x33637: 0x6cefe420, - 0x33638: 0x6cefe620, 0x33639: 0x6cefe820, 0x3363a: 0x6cefea20, 0x3363b: 0x6d1f5a20, - 0x3363c: 0x6d1f5c20, 0x3363d: 0x6d1f5e20, 0x3363e: 0x6d1f6020, 0x3363f: 0x6d1f6220, - // Block 0xcd9, offset 0x33640 - 0x33640: 0x6d1f6420, 0x33641: 0x6d1f6620, 0x33642: 0x6d1f6820, 0x33643: 0x6d1f6a20, - 0x33644: 0x6d1f6c20, 0x33645: 0x6d1f6e20, 0x33646: 0x6d1f7020, 0x33647: 0x6d1f7220, - 0x33648: 0x6d1f7420, 0x33649: 0x6d1f7620, 0x3364a: 0x6d1f7820, 0x3364b: 0x6d1f7a20, - 0x3364c: 0x6d1f7c20, 0x3364d: 0x6d1f7e20, 0x3364e: 0x6d1f8020, 0x3364f: 0x6d1f8220, - 0x33650: 0x6d1f8420, 0x33651: 0x6d1f8620, 0x33652: 0x6d1f8820, 0x33653: 0x6d1f8a20, - 0x33654: 0x6d1f8c20, 0x33655: 0x6d1f8e20, 0x33656: 0x6d1f9020, 0x33657: 0x6d1f9220, - 0x33658: 0x6d1f9420, 0x33659: 0x6d1f9620, 0x3365a: 0x6d1f9820, 0x3365b: 0x6d1f9a20, - 0x3365c: 0x6d1f9c20, 0x3365d: 0x6d1f9e20, 0x3365e: 0x6d1b3020, 0x3365f: 0x6d4cd820, - 0x33660: 0x6d4cda20, 0x33661: 0x6d4cdc20, 0x33662: 0x6d4cde20, 0x33663: 0x6d4ce020, - 0x33664: 0x6d4ce220, 0x33665: 0x6d4ce420, 0x33666: 0x6d4ce620, 0x33667: 0x6d4ce820, - 0x33668: 0x6d4cea20, 0x33669: 0x6d4cec20, 0x3366a: 0x6d4cee20, 0x3366b: 0x6d4cf020, - 0x3366c: 0x6d4cf220, 0x3366d: 0x6d4cf420, 0x3366e: 0x6d4cf620, 0x3366f: 0x6d4cf820, - 0x33670: 0x6d4cfa20, 0x33671: 0x6d4cfc20, 0x33672: 0x6d4cfe20, 0x33673: 0x6d4d0020, - 0x33674: 0x6d4d0220, 0x33675: 0x6d4d0420, 0x33676: 0x6d4d0620, 0x33677: 0x6d4d0820, - 0x33678: 0x6d4d0a20, 0x33679: 0x6d4d0c20, 0x3367a: 0x6d4d0e20, 0x3367b: 0x6d4d1020, - 0x3367c: 0x6d4d1220, 0x3367d: 0x6d4d1420, 0x3367e: 0x6d7a0220, 0x3367f: 0x6d7a0420, - // Block 0xcda, offset 0x33680 - 0x33680: 0x6d7a0620, 0x33681: 0x6d7a0820, 0x33682: 0x6d7a0a20, 0x33683: 0x6d7a0c20, - 0x33684: 0x6d7a0e20, 0x33685: 0x6d7a1020, 0x33686: 0x6d7a1220, 0x33687: 0x6d7a1420, - 0x33688: 0x6d7a1620, 0x33689: 0x6d7a1820, 0x3368a: 0x6d7a1a20, 0x3368b: 0x6d7a1c20, - 0x3368c: 0x6d7a1e20, 0x3368d: 0x6d7a2020, 0x3368e: 0x6d7a2220, 0x3368f: 0x6d7a2420, - 0x33690: 0x6d7a2620, 0x33691: 0x6da2a420, 0x33692: 0x6da2a620, 0x33693: 0x6da2a820, - 0x33694: 0x6da2aa20, 0x33695: 0x6da2ac20, 0x33696: 0x6da2ae20, 0x33697: 0x6da2b020, - 0x33698: 0x6da2b220, 0x33699: 0x6da2b420, 0x3369a: 0x6da2b620, 0x3369b: 0x6da2b820, - 0x3369c: 0x6da2ba20, 0x3369d: 0x6da2bc20, 0x3369e: 0x6dc49620, 0x3369f: 0x6dc49820, - 0x336a0: 0x6dc49a20, 0x336a1: 0x6dc49c20, 0x336a2: 0x6dc49e20, 0x336a3: 0x6dc4a020, - 0x336a4: 0x6dc4a220, 0x336a5: 0x6dc4a420, 0x336a6: 0x6dc4a620, 0x336a7: 0x6dc4a820, - 0x336a8: 0x6dc4aa20, 0x336a9: 0x6dc4ac20, 0x336aa: 0x6dc4ae20, 0x336ab: 0x6dc4b020, - 0x336ac: 0x6de1a020, 0x336ad: 0x6de1a220, 0x336ae: 0x6de1a420, 0x336af: 0x6de1a620, - 0x336b0: 0x6de1a820, 0x336b1: 0x6de1aa20, 0x336b2: 0x6de1ac20, 0x336b3: 0x6de1ae20, - 0x336b4: 0x6de1b020, 0x336b5: 0x6de1b220, 0x336b6: 0x6de1b420, 0x336b7: 0x6df99820, - 0x336b8: 0x6df99a20, 0x336b9: 0x6df99c20, 0x336ba: 0x6df99e20, 0x336bb: 0x6df9a020, - 0x336bc: 0x6e0d4a20, 0x336bd: 0x6e0d4c20, 0x336be: 0x6e0d4e20, 0x336bf: 0x6e0d5020, - // Block 0xcdb, offset 0x336c0 - 0x336c0: 0x6e0d5220, 0x336c1: 0x6e0d5420, 0x336c2: 0x6e0d5620, 0x336c3: 0x6e0d5820, - 0x336c4: 0x6e1cb820, 0x336c5: 0x6e1cba20, 0x336c6: 0x6e1cbc20, 0x336c7: 0x6e1cbe20, - 0x336c8: 0x6e1cc020, 0x336c9: 0x6e1cc220, 0x336ca: 0x6e1cc420, 0x336cb: 0x6e1cc620, - 0x336cc: 0x6e28b020, 0x336cd: 0x6e31e820, 0x336ce: 0x6e401e20, 0x336cf: 0x6e31ea20, - 0x336d0: 0x6e31ec20, 0x336d1: 0x6e386a20, 0x336d2: 0x6e428e20, 0x336d3: 0x6e386c20, - 0x336d4: 0x6e386e20, 0x336d5: 0x6e387020, 0x336d6: 0x6e3d1c20, 0x336d7: 0x6e3d1e20, - 0x336d8: 0x6e3d2020, 0x336d9: 0x6e402020, 0x336da: 0x6e402220, 0x336db: 0x6e442820, - 0x336dc: 0x6e46e420, 0x336dd: 0x6c03fa20, 0x336de: 0x6c0fe820, 0x336df: 0x6c304820, - 0x336e0: 0x6c304a20, 0x336e1: 0x6c304c20, 0x336e2: 0x6c304e20, 0x336e3: 0x6c305020, - 0x336e4: 0x6c305220, 0x336e5: 0x6c305420, 0x336e6: 0x6c305620, 0x336e7: 0x6c4a9420, - 0x336e8: 0x6c4a9620, 0x336e9: 0x6c4a9820, 0x336ea: 0x6c4a9a20, 0x336eb: 0x6c4a9c20, - 0x336ec: 0x6c4a9e20, 0x336ed: 0x6c6c7a20, 0x336ee: 0x6c938820, 0x336ef: 0x6c938a20, - 0x336f0: 0x6c938c20, 0x336f1: 0x6c938e20, 0x336f2: 0x6c939020, 0x336f3: 0x6cbfdc20, - 0x336f4: 0x6cbfde20, 0x336f5: 0x6cbfe020, 0x336f6: 0x6cbfe220, 0x336f7: 0x6cbfe420, - 0x336f8: 0x6cbfe620, 0x336f9: 0x6ceff820, 0x336fa: 0x6ceffa20, 0x336fb: 0x6ceffc20, - 0x336fc: 0x6ceffe20, 0x336fd: 0x6d1fae20, 0x336fe: 0x6d1fb020, 0x336ff: 0x6d1fb220, - // Block 0xcdc, offset 0x33700 - 0x33700: 0x6d1fb420, 0x33701: 0x6d1fb620, 0x33702: 0x6d1fb820, 0x33703: 0x6d4d2420, - 0x33704: 0x6d4d2620, 0x33705: 0x6d4d2820, 0x33706: 0x6d4d2a20, 0x33707: 0x6d4d2c20, - 0x33708: 0x6d4d2e20, 0x33709: 0x6d4d3020, 0x3370a: 0x6d7a3020, 0x3370b: 0x6d7a3220, - 0x3370c: 0x6d7a3420, 0x3370d: 0x6da2c020, 0x3370e: 0x6da2c220, 0x3370f: 0x6da2c420, - 0x33710: 0x6dc4b820, 0x33711: 0x6de1b620, 0x33712: 0x6df9a620, 0x33713: 0x6e0d5c20, - 0x33714: 0x6c01aa20, 0x33715: 0x6c040020, 0x33716: 0x6c040220, 0x33717: 0x6c083e20, - 0x33718: 0x6c084020, 0x33719: 0x6c0ff220, 0x3371a: 0x6c0ff420, 0x3371b: 0x6c0ff620, - 0x3371c: 0x6c0ff820, 0x3371d: 0x6c1cc420, 0x3371e: 0x6c1cc620, 0x3371f: 0x6c1cc820, - 0x33720: 0x6c1cca20, 0x33721: 0x6c1ccc20, 0x33722: 0x6c1cce20, 0x33723: 0x6c1cd020, - 0x33724: 0x6c1cd220, 0x33725: 0x6c305e20, 0x33726: 0x6c306020, 0x33727: 0x6c306220, - 0x33728: 0x6c306420, 0x33729: 0x6c306620, 0x3372a: 0x6c4aa620, 0x3372b: 0x6c4aa820, - 0x3372c: 0x6c4aaa20, 0x3372d: 0x6c4aac20, 0x3372e: 0x6c4aae20, 0x3372f: 0x6c4ab020, - 0x33730: 0x6c4ab220, 0x33731: 0x6c4ab420, 0x33732: 0x6c4ab620, 0x33733: 0x6c4ab820, - 0x33734: 0x6c6c7e20, 0x33735: 0x6c6c8020, 0x33736: 0x6c6c8220, 0x33737: 0x6c6c8420, - 0x33738: 0x6c6c8620, 0x33739: 0x6c6c8820, 0x3373a: 0x6c6c8a20, 0x3373b: 0x6c6c8c20, - 0x3373c: 0x6c6c8e20, 0x3373d: 0x6c939620, 0x3373e: 0x6c939820, 0x3373f: 0x6c939a20, - // Block 0xcdd, offset 0x33740 - 0x33740: 0x6c939c20, 0x33741: 0x6c939e20, 0x33742: 0x6c93a020, 0x33743: 0x6c93a220, - 0x33744: 0x6c93a420, 0x33745: 0x6c93a620, 0x33746: 0x6c93a820, 0x33747: 0x6c93aa20, - 0x33748: 0x6c93ac20, 0x33749: 0x6c93ae20, 0x3374a: 0x6c93b020, 0x3374b: 0x6c93b220, - 0x3374c: 0x6c93b420, 0x3374d: 0x6c93b620, 0x3374e: 0x6cbfee20, 0x3374f: 0x6cbff020, - 0x33750: 0x6cbff220, 0x33751: 0x6cbff420, 0x33752: 0x6cbff620, 0x33753: 0x6cbff820, - 0x33754: 0x6cbffa20, 0x33755: 0x6cbffc20, 0x33756: 0x6cbffe20, 0x33757: 0x6cc00020, - 0x33758: 0x6cf00620, 0x33759: 0x6cf00820, 0x3375a: 0x6cf00a20, 0x3375b: 0x6cf00c20, - 0x3375c: 0x6cf00e20, 0x3375d: 0x6cf01020, 0x3375e: 0x6d1fbe20, 0x3375f: 0x6d1fc020, - 0x33760: 0x6d1fc220, 0x33761: 0x6d1fc420, 0x33762: 0x6d1fc620, 0x33763: 0x6d1fc820, - 0x33764: 0x6d1fca20, 0x33765: 0x6d1fcc20, 0x33766: 0x6d4d3a20, 0x33767: 0x6d4d3c20, - 0x33768: 0x6d4d3e20, 0x33769: 0x6d4d4020, 0x3376a: 0x6d4d4220, 0x3376b: 0x6d4d4420, - 0x3376c: 0x6d4d4620, 0x3376d: 0x6d4d4820, 0x3376e: 0x6d4d4a20, 0x3376f: 0x6d4d4c20, - 0x33770: 0x6d7a3820, 0x33771: 0x6d7a3a20, 0x33772: 0x6d7a3c20, 0x33773: 0x6d7a3e20, - 0x33774: 0x6da2c820, 0x33775: 0x6da2ca20, 0x33776: 0x6da2cc20, 0x33777: 0x6dc4ba20, - 0x33778: 0x6dc4bc20, 0x33779: 0x6dc4be20, 0x3377a: 0x6dc4c020, 0x3377b: 0x6dc4c220, - 0x3377c: 0x6de1b820, 0x3377d: 0x6de1ba20, 0x3377e: 0x6de1bc20, 0x3377f: 0x6e0d5e20, - // Block 0xcde, offset 0x33780 - 0x33780: 0x6e462420, 0x33781: 0x6c01ae20, 0x33782: 0x6c01b020, 0x33783: 0x6c040820, - 0x33784: 0x6c084220, 0x33785: 0x6c084420, 0x33786: 0x6c084620, 0x33787: 0x6c084820, - 0x33788: 0x6c084a20, 0x33789: 0x6c084c20, 0x3378a: 0x6c084e20, 0x3378b: 0x6c100220, - 0x3378c: 0x6c100420, 0x3378d: 0x6c100620, 0x3378e: 0x6c100820, 0x3378f: 0x6c1ce220, - 0x33790: 0x6c1ce420, 0x33791: 0x6c1ce620, 0x33792: 0x6c1ce820, 0x33793: 0x6c1cea20, - 0x33794: 0x6c1cec20, 0x33795: 0x6c1cee20, 0x33796: 0x6c1cf020, 0x33797: 0x6c1cf220, - 0x33798: 0x6c1cf420, 0x33799: 0x6c1cf620, 0x3379a: 0x6c307020, 0x3379b: 0x6c307220, - 0x3379c: 0x6c307420, 0x3379d: 0x6c307620, 0x3379e: 0x6c307820, 0x3379f: 0x6c307a20, - 0x337a0: 0x6c307c20, 0x337a1: 0x6c307e20, 0x337a2: 0x6c4ac220, 0x337a3: 0x6c4ac420, - 0x337a4: 0x6c4ac620, 0x337a5: 0x6c5fca20, 0x337a6: 0x6c4ac820, 0x337a7: 0x6c4aca20, - 0x337a8: 0x6c6c9620, 0x337a9: 0x6c6c9820, 0x337aa: 0x6c6c9a20, 0x337ab: 0x6c6c9c20, - 0x337ac: 0x6c6c9e20, 0x337ad: 0x6c6ca020, 0x337ae: 0x6c6ca220, 0x337af: 0x6c6ca420, - 0x337b0: 0x6c6ca620, 0x337b1: 0x6c6ca820, 0x337b2: 0x6c6caa20, 0x337b3: 0x6c93c020, - 0x337b4: 0x6c93c220, 0x337b5: 0x6c93c420, 0x337b6: 0x6c93c620, 0x337b7: 0x6c93c820, - 0x337b8: 0x6c93ca20, 0x337b9: 0x6cc00a20, 0x337ba: 0x6cc00c20, 0x337bb: 0x6cc00e20, - 0x337bc: 0x6cc01020, 0x337bd: 0x6cc01220, 0x337be: 0x6cc01420, 0x337bf: 0x6cc01620, - // Block 0xcdf, offset 0x337c0 - 0x337c0: 0x6cc01820, 0x337c1: 0x6cc01a20, 0x337c2: 0x6cc01c20, 0x337c3: 0x6cf01c20, - 0x337c4: 0x6cf01e20, 0x337c5: 0x6cf02020, 0x337c6: 0x6cf02220, 0x337c7: 0x6cf02420, - 0x337c8: 0x6cf02620, 0x337c9: 0x6cf02820, 0x337ca: 0x6cf02a20, 0x337cb: 0x6d1fd020, - 0x337cc: 0x6d1fd220, 0x337cd: 0x6d1fd420, 0x337ce: 0x6d1fd620, 0x337cf: 0x6d1fd820, - 0x337d0: 0x6d4d5220, 0x337d1: 0x6d4d5420, 0x337d2: 0x6d4d5620, 0x337d3: 0x6d4d5820, - 0x337d4: 0x6d4d5a20, 0x337d5: 0x6d4d5c20, 0x337d6: 0x6d7a4220, 0x337d7: 0x6d7a4420, - 0x337d8: 0x6d7a4620, 0x337d9: 0x6d7a4820, 0x337da: 0x6d7a4a20, 0x337db: 0x6da2d620, - 0x337dc: 0x6da2d820, 0x337dd: 0x6e0d6020, 0x337de: 0x6e0d6220, 0x337df: 0x6e1cc820, - 0x337e0: 0x6e1cca20, 0x337e1: 0x6e387220, 0x337e2: 0x6e387420, 0x337e3: 0x6c01b420, - 0x337e4: 0x6c085620, 0x337e5: 0x6c085820, 0x337e6: 0x6c085a20, 0x337e7: 0x6c085c20, - 0x337e8: 0x6c085e20, 0x337e9: 0x6c101020, 0x337ea: 0x6c101220, 0x337eb: 0x6c101420, - 0x337ec: 0x6c101620, 0x337ed: 0x6c101820, 0x337ee: 0x6c101a20, 0x337ef: 0x6c101c20, - 0x337f0: 0x6c101e20, 0x337f1: 0x6c102020, 0x337f2: 0x6c102220, 0x337f3: 0x6c102420, - 0x337f4: 0x6c086020, 0x337f5: 0x6c1d0620, 0x337f6: 0x6c1d0820, 0x337f7: 0x6c1d0a20, - 0x337f8: 0x6c1d0c20, 0x337f9: 0x6c1d0e20, 0x337fa: 0x6c1d1020, 0x337fb: 0x6c1d1220, - 0x337fc: 0x6c1d1420, 0x337fd: 0x6c1d1620, 0x337fe: 0x6c309420, 0x337ff: 0x6c309620, - // Block 0xce0, offset 0x33800 - 0x33800: 0x6c309820, 0x33801: 0x6c309a20, 0x33802: 0x6c309c20, 0x33803: 0x6c309e20, - 0x33804: 0x6c30a020, 0x33805: 0x6c30a220, 0x33806: 0x6c30a420, 0x33807: 0x6c30a620, - 0x33808: 0x6c30a820, 0x33809: 0x6c30aa20, 0x3380a: 0x6c30ac20, 0x3380b: 0x6c30ae20, - 0x3380c: 0x6c4ae020, 0x3380d: 0x6c4ae220, 0x3380e: 0x6c4ae420, 0x3380f: 0x6c4ae620, - 0x33810: 0x6c4ae820, 0x33811: 0x6c4aea20, 0x33812: 0x6c4aec20, 0x33813: 0x6c4aee20, - 0x33814: 0x6c4af020, 0x33815: 0x6c4af220, 0x33816: 0x6c4af420, 0x33817: 0x6c4af620, - 0x33818: 0x6c4af820, 0x33819: 0x6c4afa20, 0x3381a: 0x6c4afc20, 0x3381b: 0x6c4afe20, - 0x3381c: 0x6c4b0020, 0x3381d: 0x6c4b0220, 0x3381e: 0x6c4b0420, 0x3381f: 0x6c4b0620, - 0x33820: 0x6c4b0820, 0x33821: 0x6c4b0a20, 0x33822: 0x6c6cc020, 0x33823: 0x6c6cc220, - 0x33824: 0x6c6cc420, 0x33825: 0x6c6cc620, 0x33826: 0x6c6cc820, 0x33827: 0x6c6cca20, - 0x33828: 0x6c6ccc20, 0x33829: 0x6c6cce20, 0x3382a: 0x6c6cd020, 0x3382b: 0x6c6cd220, - 0x3382c: 0x6c6cd420, 0x3382d: 0x6c6cd620, 0x3382e: 0x6c6cd820, 0x3382f: 0x6c6cda20, - 0x33830: 0x6c6cdc20, 0x33831: 0x6c6cde20, 0x33832: 0x6c6ce020, 0x33833: 0x6c6ce220, - 0x33834: 0x6c6ce420, 0x33835: 0x6c6ce620, 0x33836: 0x6c6ce820, 0x33837: 0x6c6cea20, - 0x33838: 0x6c6cec20, 0x33839: 0x6c6cee20, 0x3383a: 0x6c93da20, 0x3383b: 0x6c93dc20, - 0x3383c: 0x6c93de20, 0x3383d: 0x6c93e020, 0x3383e: 0x6c93e220, 0x3383f: 0x6c93e420, - // Block 0xce1, offset 0x33840 - 0x33840: 0x6c93e620, 0x33841: 0x6c93e820, 0x33842: 0x6c93ea20, 0x33843: 0x6c93ec20, - 0x33844: 0x6c93ee20, 0x33845: 0x6c93f020, 0x33846: 0x6c93f220, 0x33847: 0x6c93f420, - 0x33848: 0x6c93f620, 0x33849: 0x6c93f820, 0x3384a: 0x6c93fa20, 0x3384b: 0x6c93fc20, - 0x3384c: 0x6c93fe20, 0x3384d: 0x6c940020, 0x3384e: 0x6c940220, 0x3384f: 0x6c940420, - 0x33850: 0x6c940620, 0x33851: 0x6c940820, 0x33852: 0x6c940a20, 0x33853: 0x6c940c20, - 0x33854: 0x6cc02a20, 0x33855: 0x6cc02c20, 0x33856: 0x6cc02e20, 0x33857: 0x6cc03020, - 0x33858: 0x6cc03220, 0x33859: 0x6cc03420, 0x3385a: 0x6cc03620, 0x3385b: 0x6cc03820, - 0x3385c: 0x6cc03a20, 0x3385d: 0x6cc03c20, 0x3385e: 0x6cc03e20, 0x3385f: 0x6cc04020, - 0x33860: 0x6cc04220, 0x33861: 0x6cc04420, 0x33862: 0x6cc04620, 0x33863: 0x6cc04820, - 0x33864: 0x6cc04a20, 0x33865: 0x6cc04c20, 0x33866: 0x6cc04e20, 0x33867: 0x6cc05020, - 0x33868: 0x6cc05220, 0x33869: 0x6cc05420, 0x3386a: 0x6cc05620, 0x3386b: 0x6cc05820, - 0x3386c: 0x6cf02e20, 0x3386d: 0x6cf03020, 0x3386e: 0x6cf03220, 0x3386f: 0x6cf03420, - 0x33870: 0x6cf03620, 0x33871: 0x6cf03820, 0x33872: 0x6cf03a20, 0x33873: 0x6cf03c20, - 0x33874: 0x6cf03e20, 0x33875: 0x6cf04020, 0x33876: 0x6cf04220, 0x33877: 0x6cf04420, - 0x33878: 0x6cf04620, 0x33879: 0x6cf04820, 0x3387a: 0x6cf04a20, 0x3387b: 0x6cf04c20, - 0x3387c: 0x6cf04e20, 0x3387d: 0x6cf05020, 0x3387e: 0x6cf05220, 0x3387f: 0x6cf05420, - // Block 0xce2, offset 0x33880 - 0x33880: 0x6cf05620, 0x33881: 0x6cf05820, 0x33882: 0x6cf05a20, 0x33883: 0x6cf05c20, - 0x33884: 0x6d1fe420, 0x33885: 0x6d1fe620, 0x33886: 0x6d1fe820, 0x33887: 0x6d1fea20, - 0x33888: 0x6d1fec20, 0x33889: 0x6d1fee20, 0x3388a: 0x6d1ff020, 0x3388b: 0x6d1ff220, - 0x3388c: 0x6d1ff420, 0x3388d: 0x6d1ff620, 0x3388e: 0x6d1ff820, 0x3388f: 0x6d1ffa20, - 0x33890: 0x6d4d6a20, 0x33891: 0x6d4d6c20, 0x33892: 0x6d4d6e20, 0x33893: 0x6d4d7020, - 0x33894: 0x6d4d7220, 0x33895: 0x6d4d7420, 0x33896: 0x6d4d7620, 0x33897: 0x6d4d7820, - 0x33898: 0x6d4d7a20, 0x33899: 0x6d4d7c20, 0x3389a: 0x6d4d7e20, 0x3389b: 0x6d4d8020, - 0x3389c: 0x6d4d8220, 0x3389d: 0x6d4d8420, 0x3389e: 0x6d4d8620, 0x3389f: 0x6d7a4c20, - 0x338a0: 0x6d7a4e20, 0x338a1: 0x6d7a5020, 0x338a2: 0x6d7a5220, 0x338a3: 0x6d7a5420, - 0x338a4: 0x6d7a5620, 0x338a5: 0x6d7a5820, 0x338a6: 0x6d7a5a20, 0x338a7: 0x6d7a5c20, - 0x338a8: 0x6da2dc20, 0x338a9: 0x6da2de20, 0x338aa: 0x6dc4ca20, 0x338ab: 0x6dc4cc20, - 0x338ac: 0x6de1c220, 0x338ad: 0x6de1c420, 0x338ae: 0x6de1c620, 0x338af: 0x6de1c820, - 0x338b0: 0x6de1ca20, 0x338b1: 0x6df9a820, 0x338b2: 0x6df9aa20, 0x338b3: 0x6df9ac20, - 0x338b4: 0x6df9ae20, 0x338b5: 0x6e0d6620, 0x338b6: 0x6e0d6820, 0x338b7: 0x6e0d6a20, - 0x338b8: 0x6e1ccc20, 0x338b9: 0x6e1cce20, 0x338ba: 0x6e1cd020, 0x338bb: 0x6e31f220, - 0x338bc: 0x6e387620, 0x338bd: 0x6e387820, 0x338be: 0x6c01b820, 0x338bf: 0x6c086220, - // Block 0xce3, offset 0x338c0 - 0x338c0: 0x6c102a20, 0x338c1: 0x6c102c20, 0x338c2: 0x6c102e20, 0x338c3: 0x6c103020, - 0x338c4: 0x6c103220, 0x338c5: 0x6c103420, 0x338c6: 0x6c1d2220, 0x338c7: 0x6c1d2420, - 0x338c8: 0x6c1d2620, 0x338c9: 0x6c1d2820, 0x338ca: 0x6c1d2a20, 0x338cb: 0x6c30b220, - 0x338cc: 0x6c30b420, 0x338cd: 0x6c30b620, 0x338ce: 0x6c4b1220, 0x338cf: 0x6c4b1420, - 0x338d0: 0x6c4b1620, 0x338d1: 0x6c4b1820, 0x338d2: 0x6c4b1a20, 0x338d3: 0x6c4b1c20, - 0x338d4: 0x6c4b1e20, 0x338d5: 0x6c6cf420, 0x338d6: 0x6c6cf620, 0x338d7: 0x6c6cf820, - 0x338d8: 0x6c6cfa20, 0x338d9: 0x6c6cfc20, 0x338da: 0x6c6cfe20, 0x338db: 0x6c941220, - 0x338dc: 0x6c941420, 0x338dd: 0x6cc06220, 0x338de: 0x6cc06420, 0x338df: 0x6cc06620, - 0x338e0: 0x6cc06820, 0x338e1: 0x6cc06a20, 0x338e2: 0x6cc06c20, 0x338e3: 0x6cc06e20, - 0x338e4: 0x6cf06420, 0x338e5: 0x6cf06620, 0x338e6: 0x6d4d8c20, 0x338e7: 0x6d4d8e20, - 0x338e8: 0x6d4d9020, 0x338e9: 0x6d4d9220, 0x338ea: 0x6dc4ce20, 0x338eb: 0x6e0d6c20, - 0x338ec: 0x6e1cd420, 0x338ed: 0x6c041420, 0x338ee: 0x6c041620, 0x338ef: 0x6c041820, - 0x338f0: 0x6c087620, 0x338f1: 0x6c087820, 0x338f2: 0x6c087a20, 0x338f3: 0x6c087c20, - 0x338f4: 0x6c087e20, 0x338f5: 0x6c088020, 0x338f6: 0x6c088220, 0x338f7: 0x6c088420, - 0x338f8: 0x6c088620, 0x338f9: 0x6c088820, 0x338fa: 0x6c088a20, 0x338fb: 0x6c088c20, - 0x338fc: 0x6c088e20, 0x338fd: 0x6c089020, 0x338fe: 0x6c105e20, 0x338ff: 0x6c106020, - // Block 0xce4, offset 0x33900 - 0x33900: 0x6c106220, 0x33901: 0x6c106420, 0x33902: 0x6c106620, 0x33903: 0x6c106820, - 0x33904: 0x6c106a20, 0x33905: 0x6c106c20, 0x33906: 0x6c106e20, 0x33907: 0x6c107020, - 0x33908: 0x6c107220, 0x33909: 0x6c107420, 0x3390a: 0x6c107620, 0x3390b: 0x6c107820, - 0x3390c: 0x6c107a20, 0x3390d: 0x6c107c20, 0x3390e: 0x6c107e20, 0x3390f: 0x6c108020, - 0x33910: 0x6c108220, 0x33911: 0x6c108420, 0x33912: 0x6c108620, 0x33913: 0x6c1d6c20, - 0x33914: 0x6c1d6e20, 0x33915: 0x6c1d7020, 0x33916: 0x6c1d7220, 0x33917: 0x6c1d7420, - 0x33918: 0x6c1d7620, 0x33919: 0x6c1d7820, 0x3391a: 0x6c1d7a20, 0x3391b: 0x6c1d7c20, - 0x3391c: 0x6c1d7e20, 0x3391d: 0x6c1d8020, 0x3391e: 0x6c1d8220, 0x3391f: 0x6c1d8420, - 0x33920: 0x6c1d8620, 0x33921: 0x6c1d8820, 0x33922: 0x6c1d8a20, 0x33923: 0x6c1d8c20, - 0x33924: 0x6c1d8e20, 0x33925: 0x6c1d9020, 0x33926: 0x6c1d9220, 0x33927: 0x6c1d9420, - 0x33928: 0x6c1d9620, 0x33929: 0x6c1d9820, 0x3392a: 0x6c1d9a20, 0x3392b: 0x6c1d9c20, - 0x3392c: 0x6c1d9e20, 0x3392d: 0x6c1da020, 0x3392e: 0x6c1da220, 0x3392f: 0x6c1da420, - 0x33930: 0x6c1da620, 0x33931: 0x6c1da820, 0x33932: 0x6c1daa20, 0x33933: 0x6c1dac20, - 0x33934: 0x6c1dae20, 0x33935: 0x6c1db020, 0x33936: 0x6c1db220, 0x33937: 0x6c1db420, - 0x33938: 0x6c1db620, 0x33939: 0x6c1db820, 0x3393a: 0x6c1dba20, 0x3393b: 0x6c1dbc20, - 0x3393c: 0x6c1dbe20, 0x3393d: 0x6c1dc020, 0x3393e: 0x6c1dc220, 0x3393f: 0x6c1dc420, - // Block 0xce5, offset 0x33940 - 0x33940: 0x6c1dc620, 0x33941: 0x6c1dc820, 0x33942: 0x6c1dca20, 0x33943: 0x6c312020, - 0x33944: 0x6c312220, 0x33945: 0x6c312420, 0x33946: 0x6c312620, 0x33947: 0x6c312820, - 0x33948: 0x6c312a20, 0x33949: 0x6c312c20, 0x3394a: 0x6c312e20, 0x3394b: 0x6c313020, - 0x3394c: 0x6c313220, 0x3394d: 0x6c313420, 0x3394e: 0x6c313620, 0x3394f: 0x6c313820, - 0x33950: 0x6c313a20, 0x33951: 0x6c313c20, 0x33952: 0x6c313e20, 0x33953: 0x6c314020, - 0x33954: 0x6c314220, 0x33955: 0x6c314420, 0x33956: 0x6c314620, 0x33957: 0x6c314820, - 0x33958: 0x6c314a20, 0x33959: 0x6c314c20, 0x3395a: 0x6c314e20, 0x3395b: 0x6c315020, - 0x3395c: 0x6c315220, 0x3395d: 0x6c315420, 0x3395e: 0x6c315620, 0x3395f: 0x6c315820, - 0x33960: 0x6c315a20, 0x33961: 0x6c315c20, 0x33962: 0x6c315e20, 0x33963: 0x6c316020, - 0x33964: 0x6c3bdc20, 0x33965: 0x6c316220, 0x33966: 0x6c316420, 0x33967: 0x6c316620, - 0x33968: 0x6c316820, 0x33969: 0x6c316a20, 0x3396a: 0x6c316c20, 0x3396b: 0x6c4b6a20, - 0x3396c: 0x6c4b6c20, 0x3396d: 0x6c4b6e20, 0x3396e: 0x6c4b7020, 0x3396f: 0x6c4b7220, - 0x33970: 0x6c4b7420, 0x33971: 0x6c4b7620, 0x33972: 0x6c4b7820, 0x33973: 0x6c4b7a20, - 0x33974: 0x6c4b7c20, 0x33975: 0x6c4b7e20, 0x33976: 0x6c4b8020, 0x33977: 0x6c4b8220, - 0x33978: 0x6c4b8420, 0x33979: 0x6c4b8620, 0x3397a: 0x6c4b8820, 0x3397b: 0x6c4b8a20, - 0x3397c: 0x6c4b8c20, 0x3397d: 0x6c4b8e20, 0x3397e: 0x6c4b9020, 0x3397f: 0x6c4b9220, - // Block 0xce6, offset 0x33980 - 0x33980: 0x6c4b9420, 0x33981: 0x6c4b9620, 0x33982: 0x6c4b9820, 0x33983: 0x6c4b9a20, - 0x33984: 0x6c4b9c20, 0x33985: 0x6c4b9e20, 0x33986: 0x6c4ba020, 0x33987: 0x6c4ba220, - 0x33988: 0x6c4ba420, 0x33989: 0x6c4ba620, 0x3398a: 0x6c4ba820, 0x3398b: 0x6c4baa20, - 0x3398c: 0x6c4bac20, 0x3398d: 0x6c4bae20, 0x3398e: 0x6c4bb020, 0x3398f: 0x6c4bb220, - 0x33990: 0x6c4bb420, 0x33991: 0x6c4bb620, 0x33992: 0x6c4bb820, 0x33993: 0x6c4bba20, - 0x33994: 0x6c4bbc20, 0x33995: 0x6c6d5a20, 0x33996: 0x6c6d5c20, 0x33997: 0x6c6d5e20, - 0x33998: 0x6c6d6020, 0x33999: 0x6c6d6220, 0x3399a: 0x6c6d6420, 0x3399b: 0x6c6d6620, - 0x3399c: 0x6c6d6820, 0x3399d: 0x6c6d6a20, 0x3399e: 0x6c6d6c20, 0x3399f: 0x6c6d6e20, - 0x339a0: 0x6c6d7020, 0x339a1: 0x6c6d7220, 0x339a2: 0x6c6d7420, 0x339a3: 0x6c6d7620, - 0x339a4: 0x6c6d7820, 0x339a5: 0x6c6d7a20, 0x339a6: 0x6c6d7c20, 0x339a7: 0x6c6d7e20, - 0x339a8: 0x6c6d8020, 0x339a9: 0x6c6d8220, 0x339aa: 0x6c6d8420, 0x339ab: 0x6c6d8620, - 0x339ac: 0x6c6d8820, 0x339ad: 0x6c6d8a20, 0x339ae: 0x6c6d8c20, 0x339af: 0x6c6d8e20, - 0x339b0: 0x6c6d9020, 0x339b1: 0x6c6d9220, 0x339b2: 0x6c6d9420, 0x339b3: 0x6c6d9620, - 0x339b4: 0x6c6d9820, 0x339b5: 0x6c6d9a20, 0x339b6: 0x6c6d9c20, 0x339b7: 0x6c6d9e20, - 0x339b8: 0x6c6da020, 0x339b9: 0x6c6da220, 0x339ba: 0x6c6da420, 0x339bb: 0x6c6da620, - 0x339bc: 0x6c6da820, 0x339bd: 0x6c6daa20, 0x339be: 0x6c6dac20, 0x339bf: 0x6c6dae20, - // Block 0xce7, offset 0x339c0 - 0x339c0: 0x6c6db020, 0x339c1: 0x6c6db220, 0x339c2: 0x6c6db420, 0x339c3: 0x6c6db620, - 0x339c4: 0x6c6db820, 0x339c5: 0x6c6dba20, 0x339c6: 0x6c6dbc20, 0x339c7: 0x6c6dbe20, - 0x339c8: 0x6c6dc020, 0x339c9: 0x6c6dc220, 0x339ca: 0x6c6dc420, 0x339cb: 0x6c6dc620, - 0x339cc: 0x6c6dc820, 0x339cd: 0x6c6dca20, 0x339ce: 0x6c6dcc20, 0x339cf: 0x6c6dce20, - 0x339d0: 0x6c6dd020, 0x339d1: 0x6c948a20, 0x339d2: 0x6c948c20, 0x339d3: 0x6c948e20, - 0x339d4: 0x6c949020, 0x339d5: 0x6c949220, 0x339d6: 0x6c949420, 0x339d7: 0x6c949620, - 0x339d8: 0x6c949820, 0x339d9: 0x6c949a20, 0x339da: 0x6c949c20, 0x339db: 0x6c949e20, - 0x339dc: 0x6c94a020, 0x339dd: 0x6c94a220, 0x339de: 0x6c94a420, 0x339df: 0x6c94a620, - 0x339e0: 0x6c94a820, 0x339e1: 0x6c94aa20, 0x339e2: 0x6c94ac20, 0x339e3: 0x6c94ae20, - 0x339e4: 0x6c94b020, 0x339e5: 0x6c94b220, 0x339e6: 0x6c94b420, 0x339e7: 0x6c94b620, - 0x339e8: 0x6c94b820, 0x339e9: 0x6c94ba20, 0x339ea: 0x6c94bc20, 0x339eb: 0x6c94be20, - 0x339ec: 0x6c94c020, 0x339ed: 0x6c94c220, 0x339ee: 0x6c94c420, 0x339ef: 0x6c94c620, - 0x339f0: 0x6c94c820, 0x339f1: 0x6c94ca20, 0x339f2: 0x6c94cc20, 0x339f3: 0x6c94ce20, - 0x339f4: 0x6c94d020, 0x339f5: 0x6c94d220, 0x339f6: 0x6c94d420, 0x339f7: 0x6c94d620, - 0x339f8: 0x6c94d820, 0x339f9: 0x6c94da20, 0x339fa: 0x6c94dc20, 0x339fb: 0x6c94de20, - 0x339fc: 0x6c94e020, 0x339fd: 0x6c94e220, 0x339fe: 0x6c94e420, 0x339ff: 0x6c94e620, - // Block 0xce8, offset 0x33a00 - 0x33a00: 0x6c94e820, 0x33a01: 0x6c94ea20, 0x33a02: 0x6c94ec20, 0x33a03: 0x6c94ee20, - 0x33a04: 0x6c94f020, 0x33a05: 0x6c94f220, 0x33a06: 0x6c94f420, 0x33a07: 0x6c94f620, - 0x33a08: 0x6c94f820, 0x33a09: 0x6c94fa20, 0x33a0a: 0x6c94fc20, 0x33a0b: 0x6c94fe20, - 0x33a0c: 0x6c950020, 0x33a0d: 0x6c950220, 0x33a0e: 0x6c950420, 0x33a0f: 0x6c950620, - 0x33a10: 0x6c950820, 0x33a11: 0x6c950a20, 0x33a12: 0x6c950c20, 0x33a13: 0x6c950e20, - 0x33a14: 0x6c951020, 0x33a15: 0x6c951220, 0x33a16: 0x6c951420, 0x33a17: 0x6c951620, - 0x33a18: 0x6c951820, 0x33a19: 0x6c951a20, 0x33a1a: 0x6c951c20, 0x33a1b: 0x6c951e20, - 0x33a1c: 0x6c952020, 0x33a1d: 0x6c952220, 0x33a1e: 0x6c952420, 0x33a1f: 0x6c952620, - 0x33a20: 0x6c952820, 0x33a21: 0x6c952a20, 0x33a22: 0x6c952c20, 0x33a23: 0x6c952e20, - 0x33a24: 0x6c953020, 0x33a25: 0x6c953220, 0x33a26: 0x6c953420, 0x33a27: 0x6c953620, - 0x33a28: 0x6c953820, 0x33a29: 0x6c953a20, 0x33a2a: 0x6cc0de20, 0x33a2b: 0x6cc0e020, - 0x33a2c: 0x6cc0e220, 0x33a2d: 0x6cc0e420, 0x33a2e: 0x6cc0e620, 0x33a2f: 0x6cc0e820, - 0x33a30: 0x6cc0ea20, 0x33a31: 0x6cc0ec20, 0x33a32: 0x6cc0ee20, 0x33a33: 0x6cc0f020, - 0x33a34: 0x6cc0f220, 0x33a35: 0x6cc0f420, 0x33a36: 0x6cc0f620, 0x33a37: 0x6cc0f820, - 0x33a38: 0x6cc0fa20, 0x33a39: 0x6cc0fc20, 0x33a3a: 0x6cc0fe20, 0x33a3b: 0x6cc10020, - 0x33a3c: 0x6cc10220, 0x33a3d: 0x6cc10420, 0x33a3e: 0x6cc10620, 0x33a3f: 0x6cc10820, - // Block 0xce9, offset 0x33a40 - 0x33a40: 0x6cc10a20, 0x33a41: 0x6cc10c20, 0x33a42: 0x6cc10e20, 0x33a43: 0x6cc11020, - 0x33a44: 0x6cc11220, 0x33a45: 0x6cc11420, 0x33a46: 0x6cc11620, 0x33a47: 0x6cc11820, - 0x33a48: 0x6cc11a20, 0x33a49: 0x6cc11c20, 0x33a4a: 0x6cc11e20, 0x33a4b: 0x6cc12020, - 0x33a4c: 0x6cc12220, 0x33a4d: 0x6cc12420, 0x33a4e: 0x6cc12620, 0x33a4f: 0x6cc12820, - 0x33a50: 0x6cc12a20, 0x33a51: 0x6cc12c20, 0x33a52: 0x6cc12e20, 0x33a53: 0x6cc13020, - 0x33a54: 0x6cc13220, 0x33a55: 0x6cc13420, 0x33a56: 0x6cc13620, 0x33a57: 0x6cc13820, - 0x33a58: 0x6cc13a20, 0x33a59: 0x6cc13c20, 0x33a5a: 0x6cc13e20, 0x33a5b: 0x6cc14020, - 0x33a5c: 0x6cc14220, 0x33a5d: 0x6cc14420, 0x33a5e: 0x6cc14620, 0x33a5f: 0x6cc14820, - 0x33a60: 0x6cc14a20, 0x33a61: 0x6cc14c20, 0x33a62: 0x6cc14e20, 0x33a63: 0x6cc15020, - 0x33a64: 0x6cc15220, 0x33a65: 0x6cc15420, 0x33a66: 0x6cc15620, 0x33a67: 0x6cc15820, - 0x33a68: 0x6cc15a20, 0x33a69: 0x6cc15c20, 0x33a6a: 0x6cf0ac20, 0x33a6b: 0x6cf0ae20, - 0x33a6c: 0x6cf0b020, 0x33a6d: 0x6cf0b220, 0x33a6e: 0x6cf0b420, 0x33a6f: 0x6cf0b620, - 0x33a70: 0x6cf0b820, 0x33a71: 0x6cf0ba20, 0x33a72: 0x6cf0bc20, 0x33a73: 0x6cf0be20, - 0x33a74: 0x6cf0c020, 0x33a75: 0x6cf0c220, 0x33a76: 0x6cf0c420, 0x33a77: 0x6cf0c620, - 0x33a78: 0x6cf0c820, 0x33a79: 0x6cf0ca20, 0x33a7a: 0x6cf0cc20, 0x33a7b: 0x6cf0ce20, - 0x33a7c: 0x6cf0d020, 0x33a7d: 0x6cf0d220, 0x33a7e: 0x6cf0d420, 0x33a7f: 0x6cf0d620, - // Block 0xcea, offset 0x33a80 - 0x33a80: 0x6cf0d820, 0x33a81: 0x6cf0da20, 0x33a82: 0x6cf0dc20, 0x33a83: 0x6cf0de20, - 0x33a84: 0x6cf0e020, 0x33a85: 0x6cf0e220, 0x33a86: 0x6cf0e420, 0x33a87: 0x6cf0e620, - 0x33a88: 0x6cf0e820, 0x33a89: 0x6cf0ea20, 0x33a8a: 0x6cf0ec20, 0x33a8b: 0x6cf0ee20, - 0x33a8c: 0x6cf0f020, 0x33a8d: 0x6cf0f220, 0x33a8e: 0x6cf0f420, 0x33a8f: 0x6cf0f620, - 0x33a90: 0x6cf0f820, 0x33a91: 0x6cf0fa20, 0x33a92: 0x6cf0fc20, 0x33a93: 0x6cf0fe20, - 0x33a94: 0x6cf10020, 0x33a95: 0x6cf10220, 0x33a96: 0x6cf10420, 0x33a97: 0x6cf10620, - 0x33a98: 0x6d204820, 0x33a99: 0x6d204a20, 0x33a9a: 0x6d204c20, 0x33a9b: 0x6d204e20, - 0x33a9c: 0x6d205020, 0x33a9d: 0x6d205220, 0x33a9e: 0x6d205420, 0x33a9f: 0x6d205620, - 0x33aa0: 0x6d205820, 0x33aa1: 0x6d205a20, 0x33aa2: 0x6d205c20, 0x33aa3: 0x6d205e20, - 0x33aa4: 0x6d206020, 0x33aa5: 0x6d206220, 0x33aa6: 0x6d206420, 0x33aa7: 0x6d206620, - 0x33aa8: 0x6d206820, 0x33aa9: 0x6d206a20, 0x33aaa: 0x6d206c20, 0x33aab: 0x6d206e20, - 0x33aac: 0x6d207020, 0x33aad: 0x6d207220, 0x33aae: 0x6d207420, 0x33aaf: 0x6d207620, - 0x33ab0: 0x6d207820, 0x33ab1: 0x6d207a20, 0x33ab2: 0x6d207c20, 0x33ab3: 0x6d207e20, - 0x33ab4: 0x6d208020, 0x33ab5: 0x6d208220, 0x33ab6: 0x6d208420, 0x33ab7: 0x6d208620, - 0x33ab8: 0x6d208820, 0x33ab9: 0x6d208a20, 0x33aba: 0x6d208c20, 0x33abb: 0x6d208e20, - 0x33abc: 0x6d209020, 0x33abd: 0x6d209220, 0x33abe: 0x6d209420, 0x33abf: 0x6d209620, - // Block 0xceb, offset 0x33ac0 - 0x33ac0: 0x6d209820, 0x33ac1: 0x6d209a20, 0x33ac2: 0x6d209c20, 0x33ac3: 0x6d209e20, - 0x33ac4: 0x6d20a020, 0x33ac5: 0x6d20a220, 0x33ac6: 0x6d20a420, 0x33ac7: 0x6d20a620, - 0x33ac8: 0x6d20a820, 0x33ac9: 0x6d20aa20, 0x33aca: 0x6d4dda20, 0x33acb: 0x6d4ddc20, - 0x33acc: 0x6d4dde20, 0x33acd: 0x6d4de020, 0x33ace: 0x6d4de220, 0x33acf: 0x6d4de420, - 0x33ad0: 0x6d4de620, 0x33ad1: 0x6d4de820, 0x33ad2: 0x6d4dea20, 0x33ad3: 0x6d4dec20, - 0x33ad4: 0x6d4dee20, 0x33ad5: 0x6d4df020, 0x33ad6: 0x6d4df220, 0x33ad7: 0x6d4df420, - 0x33ad8: 0x6d4df620, 0x33ad9: 0x6d4df820, 0x33ada: 0x6d4dfa20, 0x33adb: 0x6d4dfc20, - 0x33adc: 0x6d4dfe20, 0x33add: 0x6d4e0020, 0x33ade: 0x6d4e0220, 0x33adf: 0x6d4e0420, - 0x33ae0: 0x6d4e0620, 0x33ae1: 0x6d4e0820, 0x33ae2: 0x6d4e0a20, 0x33ae3: 0x6d4e0c20, - 0x33ae4: 0x6d4e0e20, 0x33ae5: 0x6d4e1020, 0x33ae6: 0x6d4e1220, 0x33ae7: 0x6d4e1420, - 0x33ae8: 0x6d4e1620, 0x33ae9: 0x6d4e1820, 0x33aea: 0x6d4e1a20, 0x33aeb: 0x6d4e1c20, - 0x33aec: 0x6d4e1e20, 0x33aed: 0x6d4e2020, 0x33aee: 0x6d4e2220, 0x33aef: 0x6d4e2420, - 0x33af0: 0x6d4e2620, 0x33af1: 0x6d4e2820, 0x33af2: 0x6d4e2a20, 0x33af3: 0x6d4e2c20, - 0x33af4: 0x6d4e2e20, 0x33af5: 0x6d4e3020, 0x33af6: 0x6d4e3220, 0x33af7: 0x6d4e3420, - 0x33af8: 0x6d4e3620, 0x33af9: 0x6d4e3820, 0x33afa: 0x6d4e3a20, 0x33afb: 0x6d4e3c20, - 0x33afc: 0x6d4e3e20, 0x33afd: 0x6d7a9020, 0x33afe: 0x6d7a9220, 0x33aff: 0x6d7a9420, - // Block 0xcec, offset 0x33b00 - 0x33b00: 0x6d7a9620, 0x33b01: 0x6d7a9820, 0x33b02: 0x6d7a9a20, 0x33b03: 0x6d7a9c20, - 0x33b04: 0x6d7a9e20, 0x33b05: 0x6d7aa020, 0x33b06: 0x6d7aa220, 0x33b07: 0x6d7aa420, - 0x33b08: 0x6d7aa620, 0x33b09: 0x6da2fc20, 0x33b0a: 0x6d7aa820, 0x33b0b: 0x6d7aaa20, - 0x33b0c: 0x6d7aac20, 0x33b0d: 0x6d7aae20, 0x33b0e: 0x6d7ab020, 0x33b0f: 0x6d7ab220, - 0x33b10: 0x6d7ab420, 0x33b11: 0x6d7ab620, 0x33b12: 0x6d7ab820, 0x33b13: 0x6d7aba20, - 0x33b14: 0x6d7abc20, 0x33b15: 0x6d7abe20, 0x33b16: 0x6d7ac020, 0x33b17: 0x6d7ac220, - 0x33b18: 0x6d7ac420, 0x33b19: 0x6d7ac620, 0x33b1a: 0x6d7ac820, 0x33b1b: 0x6d7aca20, - 0x33b1c: 0x6da2fe20, 0x33b1d: 0x6da30020, 0x33b1e: 0x6da30220, 0x33b1f: 0x6da30420, - 0x33b20: 0x6da30620, 0x33b21: 0x6da30820, 0x33b22: 0x6da30a20, 0x33b23: 0x6da30c20, - 0x33b24: 0x6da30e20, 0x33b25: 0x6da31020, 0x33b26: 0x6da31220, 0x33b27: 0x6da31420, - 0x33b28: 0x6da31620, 0x33b29: 0x6da31820, 0x33b2a: 0x6da31a20, 0x33b2b: 0x6da31c20, - 0x33b2c: 0x6da31e20, 0x33b2d: 0x6da32020, 0x33b2e: 0x6da32220, 0x33b2f: 0x6da32420, - 0x33b30: 0x6da32620, 0x33b31: 0x6da32820, 0x33b32: 0x6da32a20, 0x33b33: 0x6da32c20, - 0x33b34: 0x6da32e20, 0x33b35: 0x6da33020, 0x33b36: 0x6da33220, 0x33b37: 0x6da33420, - 0x33b38: 0x6da33620, 0x33b39: 0x6da33820, 0x33b3a: 0x6da33a20, 0x33b3b: 0x6da33c20, - 0x33b3c: 0x6da33e20, 0x33b3d: 0x6da34020, 0x33b3e: 0x6da34220, 0x33b3f: 0x6da34420, - // Block 0xced, offset 0x33b40 - 0x33b40: 0x6da34620, 0x33b41: 0x6da34820, 0x33b42: 0x6dc4dc20, 0x33b43: 0x6dc4de20, - 0x33b44: 0x6dc4e020, 0x33b45: 0x6dc4e220, 0x33b46: 0x6dc4e420, 0x33b47: 0x6dc4e620, - 0x33b48: 0x6dc4e820, 0x33b49: 0x6dc4ea20, 0x33b4a: 0x6dc4ec20, 0x33b4b: 0x6dc4ee20, - 0x33b4c: 0x6dc4f020, 0x33b4d: 0x6dc4f220, 0x33b4e: 0x6dc4f420, 0x33b4f: 0x6dc4f620, - 0x33b50: 0x6dc4f820, 0x33b51: 0x6dc4fa20, 0x33b52: 0x6dc4fc20, 0x33b53: 0x6dc4fe20, - 0x33b54: 0x6dc50020, 0x33b55: 0x6dc50220, 0x33b56: 0x6dc50420, 0x33b57: 0x6dc45020, - 0x33b58: 0x6de1de20, 0x33b59: 0x6de1e020, 0x33b5a: 0x6de1e220, 0x33b5b: 0x6de1e420, - 0x33b5c: 0x6de1e620, 0x33b5d: 0x6de1e820, 0x33b5e: 0x6de1ea20, 0x33b5f: 0x6de1ec20, - 0x33b60: 0x6dc50620, 0x33b61: 0x6de1ee20, 0x33b62: 0x6de1f020, 0x33b63: 0x6de1f220, - 0x33b64: 0x6de1f420, 0x33b65: 0x6de1f620, 0x33b66: 0x6de1f820, 0x33b67: 0x6de1fa20, - 0x33b68: 0x6de1fc20, 0x33b69: 0x6de1fe20, 0x33b6a: 0x6de20020, 0x33b6b: 0x6de20220, - 0x33b6c: 0x6de20420, 0x33b6d: 0x6de20620, 0x33b6e: 0x6df9be20, 0x33b6f: 0x6df9c020, - 0x33b70: 0x6df9c220, 0x33b71: 0x6df9c420, 0x33b72: 0x6df9c620, 0x33b73: 0x6df9c820, - 0x33b74: 0x6df9ca20, 0x33b75: 0x6df9cc20, 0x33b76: 0x6df9ce20, 0x33b77: 0x6df9d020, - 0x33b78: 0x6df9d220, 0x33b79: 0x6df9d420, 0x33b7a: 0x6df9d620, 0x33b7b: 0x6da34a20, - 0x33b7c: 0x6e0d7a20, 0x33b7d: 0x6e0d7c20, 0x33b7e: 0x6e0d7e20, 0x33b7f: 0x6e0d8020, - // Block 0xcee, offset 0x33b80 - 0x33b80: 0x6e0d8220, 0x33b81: 0x6e0d8420, 0x33b82: 0x6e0d8620, 0x33b83: 0x6e0d8820, - 0x33b84: 0x6e0d8a20, 0x33b85: 0x6e0d8c20, 0x33b86: 0x6e0d8e20, 0x33b87: 0x6e1ce620, - 0x33b88: 0x6e1ce820, 0x33b89: 0x6e1cea20, 0x33b8a: 0x6e1cec20, 0x33b8b: 0x6e1cee20, - 0x33b8c: 0x6e1cf020, 0x33b8d: 0x6e1cf220, 0x33b8e: 0x6e1cf420, 0x33b8f: 0x6e1cf620, - 0x33b90: 0x6e1cf820, 0x33b91: 0x6e1cfa20, 0x33b92: 0x6e28b820, 0x33b93: 0x6e28ba20, - 0x33b94: 0x6e31f620, 0x33b95: 0x6e31f820, 0x33b96: 0x6e31fa20, 0x33b97: 0x6e31fc20, - 0x33b98: 0x6e31fe20, 0x33b99: 0x6e320020, 0x33b9a: 0x6e320220, 0x33b9b: 0x6e320420, - 0x33b9c: 0x6e320620, 0x33b9d: 0x6e387a20, 0x33b9e: 0x6e387c20, 0x33b9f: 0x6e387e20, - 0x33ba0: 0x6e402420, 0x33ba1: 0x6e402620, 0x33ba2: 0x6e429220, 0x33ba3: 0x6e402820, - 0x33ba4: 0x6e402a20, 0x33ba5: 0x6e462620, 0x33ba6: 0x6c01c020, 0x33ba7: 0x6c041a20, - 0x33ba8: 0x6c01c220, 0x33ba9: 0x6c109820, 0x33baa: 0x6c109a20, 0x33bab: 0x6c109c20, - 0x33bac: 0x6c109e20, 0x33bad: 0x6c10a020, 0x33bae: 0x6c1dd620, 0x33baf: 0x6c1dd820, - 0x33bb0: 0x6c1dda20, 0x33bb1: 0x6c317a20, 0x33bb2: 0x6c317c20, 0x33bb3: 0x6c317e20, - 0x33bb4: 0x6c318020, 0x33bb5: 0x6c318220, 0x33bb6: 0x6c318420, 0x33bb7: 0x6c4bce20, - 0x33bb8: 0x6c4bd020, 0x33bb9: 0x6c4bd220, 0x33bba: 0x6c4bd420, 0x33bbb: 0x6c4bd620, - 0x33bbc: 0x6c6de420, 0x33bbd: 0x6c6de620, 0x33bbe: 0x6c954e20, 0x33bbf: 0x6c955020, - // Block 0xcef, offset 0x33bc0 - 0x33bc0: 0x6c955220, 0x33bc1: 0x6cc16c20, 0x33bc2: 0x6d20ba20, 0x33bc3: 0x6d4e4a20, - 0x33bc4: 0x6d7ad420, 0x33bc5: 0x6d7ad620, 0x33bc6: 0x6d7ad820, 0x33bc7: 0x6da35420, - 0x33bc8: 0x6dc50820, 0x33bc9: 0x6de20c20, 0x33bca: 0x6de20e20, 0x33bcb: 0x6df9d820, - 0x33bcc: 0x6e1cfe20, 0x33bcd: 0x6e1d0020, 0x33bce: 0x6e320820, 0x33bcf: 0x6e402c20, - 0x33bd0: 0x6e442a20, 0x33bd1: 0x6c041e20, 0x33bd2: 0x6c042020, 0x33bd3: 0x6c042220, - 0x33bd4: 0x6c042420, 0x33bd5: 0x6c042620, 0x33bd6: 0x6c089820, 0x33bd7: 0x6c089a20, - 0x33bd8: 0x6c089c20, 0x33bd9: 0x6c089e20, 0x33bda: 0x6c10a620, 0x33bdb: 0x6c10a820, - 0x33bdc: 0x6c1de020, 0x33bdd: 0x6c1de220, 0x33bde: 0x6c1de420, 0x33bdf: 0x6c318620, - 0x33be0: 0x6c4bde20, 0x33be1: 0x6c6dee20, 0x33be2: 0x6c6df020, 0x33be3: 0x6c955420, - 0x33be4: 0x6cc17220, 0x33be5: 0x6cc17420, 0x33be6: 0x6cf11220, 0x33be7: 0x6cf11420, - 0x33be8: 0x6d4e4e20, 0x33be9: 0x6d4e5020, 0x33bea: 0x6d4e5220, 0x33beb: 0x6d4e5420, - 0x33bec: 0x6d7ada20, 0x33bed: 0x6da35620, 0x33bee: 0x6dc50a20, 0x33bef: 0x6de21020, - 0x33bf0: 0x6e0d9220, 0x33bf1: 0x6e0d9420, 0x33bf2: 0x6e0d9620, 0x33bf3: 0x6c042a20, - 0x33bf4: 0x6c08a220, 0x33bf5: 0x6c08a420, 0x33bf6: 0x6c10ac20, 0x33bf7: 0x6c318c20, - 0x33bf8: 0x6c318e20, 0x33bf9: 0x6c4bea20, 0x33bfa: 0x6c4bec20, 0x33bfb: 0x6c4bee20, - 0x33bfc: 0x6c6df420, 0x33bfd: 0x6c6df620, 0x33bfe: 0x6c6df820, 0x33bff: 0x6c6dfa20, - // Block 0xcf0, offset 0x33c00 - 0x33c00: 0x6c955a20, 0x33c01: 0x6c955c20, 0x33c02: 0x6c955e20, 0x33c03: 0x6c956020, - 0x33c04: 0x6c956220, 0x33c05: 0x6cc17a20, 0x33c06: 0x6cc17c20, 0x33c07: 0x6cc17e20, - 0x33c08: 0x6cc18020, 0x33c09: 0x6cc18220, 0x33c0a: 0x6cf11820, 0x33c0b: 0x6d4e5620, - 0x33c0c: 0x6d4e5820, 0x33c0d: 0x6d7ae020, 0x33c0e: 0x6da35a20, 0x33c0f: 0x6d7ae220, - 0x33c10: 0x6dc50e20, 0x33c11: 0x6df9da20, 0x33c12: 0x6c08b220, 0x33c13: 0x6c08b420, - 0x33c14: 0x6c08b620, 0x33c15: 0x6c10ba20, 0x33c16: 0x6c10bc20, 0x33c17: 0x6c10be20, - 0x33c18: 0x6c10c020, 0x33c19: 0x6c10c220, 0x33c1a: 0x6c10c420, 0x33c1b: 0x6c10c620, - 0x33c1c: 0x6c10c820, 0x33c1d: 0x6c10ca20, 0x33c1e: 0x6c10cc20, 0x33c1f: 0x6c10ce20, - 0x33c20: 0x6c10d020, 0x33c21: 0x6c10d220, 0x33c22: 0x6c10d420, 0x33c23: 0x6c10d620, - 0x33c24: 0x6c10d820, 0x33c25: 0x6c1e0620, 0x33c26: 0x6c1e0820, 0x33c27: 0x6c1e0a20, - 0x33c28: 0x6c1e0c20, 0x33c29: 0x6c1e0e20, 0x33c2a: 0x6c1e1020, 0x33c2b: 0x6c1e1220, - 0x33c2c: 0x6c1e1420, 0x33c2d: 0x6c1e1620, 0x33c2e: 0x6c1e1820, 0x33c2f: 0x6c1e1a20, - 0x33c30: 0x6c1e1c20, 0x33c31: 0x6c1e1e20, 0x33c32: 0x6c1e2020, 0x33c33: 0x6c1e2220, - 0x33c34: 0x6c1e2420, 0x33c35: 0x6c1e2620, 0x33c36: 0x6c1e2820, 0x33c37: 0x6c1e2a20, - 0x33c38: 0x6c1e2c20, 0x33c39: 0x6c1e2e20, 0x33c3a: 0x6c1e3020, 0x33c3b: 0x6c31b220, - 0x33c3c: 0x6c31b420, 0x33c3d: 0x6c31b620, 0x33c3e: 0x6c31b820, 0x33c3f: 0x6c31ba20, - // Block 0xcf1, offset 0x33c40 - 0x33c40: 0x6c31bc20, 0x33c41: 0x6c31be20, 0x33c42: 0x6c31c020, 0x33c43: 0x6c31c220, - 0x33c44: 0x6c31c420, 0x33c45: 0x6c31c620, 0x33c46: 0x6c31c820, 0x33c47: 0x6c31ca20, - 0x33c48: 0x6c31cc20, 0x33c49: 0x6c31ce20, 0x33c4a: 0x6c31d020, 0x33c4b: 0x6c31d220, - 0x33c4c: 0x6c31d420, 0x33c4d: 0x6c31d620, 0x33c4e: 0x6c31d820, 0x33c4f: 0x6c31da20, - 0x33c50: 0x6c4c1220, 0x33c51: 0x6c4c1420, 0x33c52: 0x6c4c1620, 0x33c53: 0x6c4c1820, - 0x33c54: 0x6c4c1a20, 0x33c55: 0x6c4c1c20, 0x33c56: 0x6c4c1e20, 0x33c57: 0x6c4c2020, - 0x33c58: 0x6c4c2220, 0x33c59: 0x6c4c2420, 0x33c5a: 0x6c4c2620, 0x33c5b: 0x6c4c2820, - 0x33c5c: 0x6c4c2a20, 0x33c5d: 0x6c4c2c20, 0x33c5e: 0x6c4c2e20, 0x33c5f: 0x6c4c3020, - 0x33c60: 0x6c4c3220, 0x33c61: 0x6c4c3420, 0x33c62: 0x6c4c3620, 0x33c63: 0x6c4c3820, - 0x33c64: 0x6c4c3a20, 0x33c65: 0x6c4c3c20, 0x33c66: 0x6c4c3e20, 0x33c67: 0x6c4c4020, - 0x33c68: 0x6c4c4220, 0x33c69: 0x6c4c4420, 0x33c6a: 0x6c4c4620, 0x33c6b: 0x6c4c4820, - 0x33c6c: 0x6c4c4a20, 0x33c6d: 0x6c4c4c20, 0x33c6e: 0x6c4c4e20, 0x33c6f: 0x6c4c5020, - 0x33c70: 0x6c4c5220, 0x33c71: 0x6c6e1420, 0x33c72: 0x6c6e1620, 0x33c73: 0x6c6e1820, - 0x33c74: 0x6c6e1a20, 0x33c75: 0x6c6e1c20, 0x33c76: 0x6c6e1e20, 0x33c77: 0x6c6e2020, - 0x33c78: 0x6c6e2220, 0x33c79: 0x6c6e2420, 0x33c7a: 0x6c6e2620, 0x33c7b: 0x6c6e2820, - 0x33c7c: 0x6c6e2a20, 0x33c7d: 0x6c6e2c20, 0x33c7e: 0x6c6e2e20, 0x33c7f: 0x6c6e3020, - // Block 0xcf2, offset 0x33c80 - 0x33c80: 0x6c6e3220, 0x33c81: 0x6c6e3420, 0x33c82: 0x6c6e3620, 0x33c83: 0x6c6e3820, - 0x33c84: 0x6c6e3a20, 0x33c85: 0x6c6e3c20, 0x33c86: 0x6c6e3e20, 0x33c87: 0x6c6e4020, - 0x33c88: 0x6c6e4220, 0x33c89: 0x6c6e4420, 0x33c8a: 0x6c6e4620, 0x33c8b: 0x6c6e4820, - 0x33c8c: 0x6c6e4a20, 0x33c8d: 0x6c958620, 0x33c8e: 0x6c958820, 0x33c8f: 0x6c958a20, - 0x33c90: 0x6c958c20, 0x33c91: 0x6c958e20, 0x33c92: 0x6c959020, 0x33c93: 0x6c959220, - 0x33c94: 0x6c959420, 0x33c95: 0x6c959620, 0x33c96: 0x6c959820, 0x33c97: 0x6c959a20, - 0x33c98: 0x6c959c20, 0x33c99: 0x6c959e20, 0x33c9a: 0x6c95a020, 0x33c9b: 0x6c95a220, - 0x33c9c: 0x6c95a420, 0x33c9d: 0x6c95a620, 0x33c9e: 0x6c95a820, 0x33c9f: 0x6c95aa20, - 0x33ca0: 0x6c95ac20, 0x33ca1: 0x6c95ae20, 0x33ca2: 0x6c95b020, 0x33ca3: 0x6c95b220, - 0x33ca4: 0x6c95b420, 0x33ca5: 0x6c95b620, 0x33ca6: 0x6c95b820, 0x33ca7: 0x6c95ba20, - 0x33ca8: 0x6c95bc20, 0x33ca9: 0x6c95be20, 0x33caa: 0x6c95c020, 0x33cab: 0x6cc1ae20, - 0x33cac: 0x6cc1b020, 0x33cad: 0x6cc1b220, 0x33cae: 0x6cc1b420, 0x33caf: 0x6cc1b620, - 0x33cb0: 0x6cc1b820, 0x33cb1: 0x6cc1ba20, 0x33cb2: 0x6cc1bc20, 0x33cb3: 0x6cc1be20, - 0x33cb4: 0x6cc1c020, 0x33cb5: 0x6cc1c220, 0x33cb6: 0x6cc1c420, 0x33cb7: 0x6cc1c620, - 0x33cb8: 0x6cc1c820, 0x33cb9: 0x6cc1ca20, 0x33cba: 0x6cc1cc20, 0x33cbb: 0x6cc1ce20, - 0x33cbc: 0x6cc1d020, 0x33cbd: 0x6cc1d220, 0x33cbe: 0x6cc1d420, 0x33cbf: 0x6cc1d620, - // Block 0xcf3, offset 0x33cc0 - 0x33cc0: 0x6cc1d820, 0x33cc1: 0x6cc1da20, 0x33cc2: 0x6cc1dc20, 0x33cc3: 0x6cc1de20, - 0x33cc4: 0x6cc1e020, 0x33cc5: 0x6cc1e220, 0x33cc6: 0x6cc1e420, 0x33cc7: 0x6cc1e620, - 0x33cc8: 0x6cc1e820, 0x33cc9: 0x6cc1ea20, 0x33cca: 0x6cf13020, 0x33ccb: 0x6cf13220, - 0x33ccc: 0x6cf13420, 0x33ccd: 0x6cf13620, 0x33cce: 0x6cf13820, 0x33ccf: 0x6cf13a20, - 0x33cd0: 0x6cf13c20, 0x33cd1: 0x6cf13e20, 0x33cd2: 0x6cf14020, 0x33cd3: 0x6cf14220, - 0x33cd4: 0x6cf14420, 0x33cd5: 0x6cf14620, 0x33cd6: 0x6cf14820, 0x33cd7: 0x6cf14a20, - 0x33cd8: 0x6cf14c20, 0x33cd9: 0x6cf14e20, 0x33cda: 0x6cf15020, 0x33cdb: 0x6cf15220, - 0x33cdc: 0x6cf15420, 0x33cdd: 0x6cf15620, 0x33cde: 0x6cf15820, 0x33cdf: 0x6d20dc20, - 0x33ce0: 0x6d20de20, 0x33ce1: 0x6d20e020, 0x33ce2: 0x6d20e220, 0x33ce3: 0x6d20e420, - 0x33ce4: 0x6d20e620, 0x33ce5: 0x6d20e820, 0x33ce6: 0x6d20ea20, 0x33ce7: 0x6d20ec20, - 0x33ce8: 0x6d20ee20, 0x33ce9: 0x6d20f020, 0x33cea: 0x6d20f220, 0x33ceb: 0x6d20f420, - 0x33cec: 0x6d20f620, 0x33ced: 0x6d20f820, 0x33cee: 0x6d20fa20, 0x33cef: 0x6d20fc20, - 0x33cf0: 0x6d20fe20, 0x33cf1: 0x6d210020, 0x33cf2: 0x6d210220, 0x33cf3: 0x6d4e7220, - 0x33cf4: 0x6d4e7420, 0x33cf5: 0x6d4e7620, 0x33cf6: 0x6d4e7820, 0x33cf7: 0x6d4e7a20, - 0x33cf8: 0x6d4e7c20, 0x33cf9: 0x6d4e7e20, 0x33cfa: 0x6d4e8020, 0x33cfb: 0x6d4e8220, - 0x33cfc: 0x6d4e8420, 0x33cfd: 0x6d4e8620, 0x33cfe: 0x6d4e8820, 0x33cff: 0x6d4e8a20, - // Block 0xcf4, offset 0x33d00 - 0x33d00: 0x6d4e8c20, 0x33d01: 0x6d4e8e20, 0x33d02: 0x6d4e9020, 0x33d03: 0x6d4e9220, - 0x33d04: 0x6d4e9420, 0x33d05: 0x6d4e9620, 0x33d06: 0x6d4e9820, 0x33d07: 0x6d4e9a20, - 0x33d08: 0x6d4e9c20, 0x33d09: 0x6d4e9e20, 0x33d0a: 0x6d4ea020, 0x33d0b: 0x6d4ea220, - 0x33d0c: 0x6d4ea420, 0x33d0d: 0x6d7af420, 0x33d0e: 0x6d7af620, 0x33d0f: 0x6d7af820, - 0x33d10: 0x6d7afa20, 0x33d11: 0x6d7afc20, 0x33d12: 0x6d7afe20, 0x33d13: 0x6d7b0020, - 0x33d14: 0x6d7b0220, 0x33d15: 0x6d7b0420, 0x33d16: 0x6d7b0620, 0x33d17: 0x6d7b0820, - 0x33d18: 0x6d7b0a20, 0x33d19: 0x6d7b0c20, 0x33d1a: 0x6d7b0e20, 0x33d1b: 0x6d7b1020, - 0x33d1c: 0x6d7b1220, 0x33d1d: 0x6d7b1420, 0x33d1e: 0x6d7b1620, 0x33d1f: 0x6da36620, - 0x33d20: 0x6da36820, 0x33d21: 0x6da36a20, 0x33d22: 0x6da36c20, 0x33d23: 0x6da36e20, - 0x33d24: 0x6da37020, 0x33d25: 0x6da37220, 0x33d26: 0x6da37420, 0x33d27: 0x6da37620, - 0x33d28: 0x6da37820, 0x33d29: 0x6dc51420, 0x33d2a: 0x6dc51620, 0x33d2b: 0x6dc51820, - 0x33d2c: 0x6dc51a20, 0x33d2d: 0x6de21420, 0x33d2e: 0x6de21620, 0x33d2f: 0x6de21820, - 0x33d30: 0x6de21a20, 0x33d31: 0x6de21c20, 0x33d32: 0x6de21e20, 0x33d33: 0x6de22020, - 0x33d34: 0x6de22220, 0x33d35: 0x6de22420, 0x33d36: 0x6de22620, 0x33d37: 0x6de22820, - 0x33d38: 0x6df9e220, 0x33d39: 0x6df9e420, 0x33d3a: 0x6df9e620, 0x33d3b: 0x6e0d9820, - 0x33d3c: 0x6e0d9a20, 0x33d3d: 0x6e0d9c20, 0x33d3e: 0x6e1d0820, 0x33d3f: 0x6e1d0a20, - // Block 0xcf5, offset 0x33d40 - 0x33d40: 0x6e1d0c20, 0x33d41: 0x6e1d0e20, 0x33d42: 0x6e28bc20, 0x33d43: 0x6e320a20, - 0x33d44: 0x6e320c20, 0x33d45: 0x6e320e20, 0x33d46: 0x6e321020, 0x33d47: 0x6e402e20, - 0x33d48: 0x6e403020, 0x33d49: 0x6c08bc20, 0x33d4a: 0x6c1e3220, 0x33d4b: 0x6c1e3420, - 0x33d4c: 0x6c1e3620, 0x33d4d: 0x6c31e020, 0x33d4e: 0x6c31e220, 0x33d4f: 0x6c31e420, - 0x33d50: 0x6c31e620, 0x33d51: 0x6c4c5420, 0x33d52: 0x6c4c5620, 0x33d53: 0x6c4c5820, - 0x33d54: 0x6c4c5a20, 0x33d55: 0x6c4c5c20, 0x33d56: 0x6c6e4e20, 0x33d57: 0x6c6e5020, - 0x33d58: 0x6c6e5220, 0x33d59: 0x6c6e5420, 0x33d5a: 0x6c95cc20, 0x33d5b: 0x6cc1f420, - 0x33d5c: 0x6cc1f620, 0x33d5d: 0x6cc1f820, 0x33d5e: 0x6cf15c20, 0x33d5f: 0x6cf15e20, - 0x33d60: 0x6cf16020, 0x33d61: 0x6d18a420, 0x33d62: 0x6d210820, 0x33d63: 0x6d1e2a20, - 0x33d64: 0x6d210a20, 0x33d65: 0x6d4eaa20, 0x33d66: 0x6d7b1c20, 0x33d67: 0x6d7b1e20, - 0x33d68: 0x6d7b2020, 0x33d69: 0x6d7b2220, 0x33d6a: 0x6dc51c20, 0x33d6b: 0x6de22c20, - 0x33d6c: 0x6df9ea20, 0x33d6d: 0x6e0d9e20, 0x33d6e: 0x6e28be20, 0x33d6f: 0x6c043420, - 0x33d70: 0x6c043620, 0x33d71: 0x6c043820, 0x33d72: 0x6c08c020, 0x33d73: 0x6c08c220, - 0x33d74: 0x6c08c420, 0x33d75: 0x6c08c620, 0x33d76: 0x6c10e020, 0x33d77: 0x6c1e3a20, - 0x33d78: 0x6c1e3c20, 0x33d79: 0x6c1e3e20, 0x33d7a: 0x6c1e4020, 0x33d7b: 0x6c31e820, - 0x33d7c: 0x6c31ea20, 0x33d7d: 0x6c31ec20, 0x33d7e: 0x6c31ee20, 0x33d7f: 0x6c4c6020, - // Block 0xcf6, offset 0x33d80 - 0x33d80: 0x6c4b0c20, 0x33d81: 0x6c6e5620, 0x33d82: 0x6c4c6220, 0x33d83: 0x6c6e5820, - 0x33d84: 0x6c6e5a20, 0x33d85: 0x6c6e5c20, 0x33d86: 0x6c6e5e20, 0x33d87: 0x6c95d220, - 0x33d88: 0x6c95d420, 0x33d89: 0x6c95d620, 0x33d8a: 0x6cc20220, 0x33d8b: 0x6cf16820, - 0x33d8c: 0x6d210e20, 0x33d8d: 0x6d211020, 0x33d8e: 0x6d211220, 0x33d8f: 0x6d211420, - 0x33d90: 0x6d4eae20, 0x33d91: 0x6d4eb020, 0x33d92: 0x6d4eb220, 0x33d93: 0x6d4eb420, - 0x33d94: 0x6da2ce20, 0x33d95: 0x6dc2b220, 0x33d96: 0x6e1d1020, 0x33d97: 0x6c10f020, - 0x33d98: 0x6c10f220, 0x33d99: 0x6c10f420, 0x33d9a: 0x6c10f620, 0x33d9b: 0x6c10f820, - 0x33d9c: 0x6c10fa20, 0x33d9d: 0x6c10fc20, 0x33d9e: 0x6c10fe20, 0x33d9f: 0x6c110020, - 0x33da0: 0x6c110220, 0x33da1: 0x6c110420, 0x33da2: 0x6c110620, 0x33da3: 0x6c1e6220, - 0x33da4: 0x6c1e6420, 0x33da5: 0x6c1e6620, 0x33da6: 0x6c1e6820, 0x33da7: 0x6c1e6a20, - 0x33da8: 0x6c1e6c20, 0x33da9: 0x6c1e6e20, 0x33daa: 0x6c1e7020, 0x33dab: 0x6c1e7220, - 0x33dac: 0x6c1e7420, 0x33dad: 0x6c1e7620, 0x33dae: 0x6c1e7820, 0x33daf: 0x6c1e7a20, - 0x33db0: 0x6c1e7c20, 0x33db1: 0x6c1e7e20, 0x33db2: 0x6c321420, 0x33db3: 0x6c321620, - 0x33db4: 0x6c321820, 0x33db5: 0x6c321a20, 0x33db6: 0x6c321c20, 0x33db7: 0x6c321e20, - 0x33db8: 0x6c322020, 0x33db9: 0x6c322220, 0x33dba: 0x6c322420, 0x33dbb: 0x6c322620, - 0x33dbc: 0x6c322820, 0x33dbd: 0x6c322a20, 0x33dbe: 0x6c322c20, 0x33dbf: 0x6c322e20, - // Block 0xcf7, offset 0x33dc0 - 0x33dc0: 0x6c323020, 0x33dc1: 0x6c323220, 0x33dc2: 0x6c323420, 0x33dc3: 0x6c323620, - 0x33dc4: 0x6c323820, 0x33dc5: 0x6c323a20, 0x33dc6: 0x6c323c20, 0x33dc7: 0x6c4c8420, - 0x33dc8: 0x6c4c8620, 0x33dc9: 0x6c4c8820, 0x33dca: 0x6c4c8a20, 0x33dcb: 0x6c4c8c20, - 0x33dcc: 0x6c4c8e20, 0x33dcd: 0x6c4c9020, 0x33dce: 0x6c4c9220, 0x33dcf: 0x6c4c9420, - 0x33dd0: 0x6c4c9620, 0x33dd1: 0x6c4c9820, 0x33dd2: 0x6c4c9a20, 0x33dd3: 0x6c4c9c20, - 0x33dd4: 0x6c4c9e20, 0x33dd5: 0x6c4ca020, 0x33dd6: 0x6c4ca220, 0x33dd7: 0x6c4ca420, - 0x33dd8: 0x6c4ca620, 0x33dd9: 0x6c6e7c20, 0x33dda: 0x6c6e7e20, 0x33ddb: 0x6c6e8020, - 0x33ddc: 0x6c6e8220, 0x33ddd: 0x6c6e8420, 0x33dde: 0x6c6e8620, 0x33ddf: 0x6c6e8820, - 0x33de0: 0x6c6e8a20, 0x33de1: 0x6c6e8c20, 0x33de2: 0x6c6e8e20, 0x33de3: 0x6c6e9020, - 0x33de4: 0x6c6e9220, 0x33de5: 0x6c6e9420, 0x33de6: 0x6c6e9620, 0x33de7: 0x6c6e9820, - 0x33de8: 0x6c6e9a20, 0x33de9: 0x6c6e9c20, 0x33dea: 0x6c6e9e20, 0x33deb: 0x6c6ea020, - 0x33dec: 0x6c6ea220, 0x33ded: 0x6c6ea420, 0x33dee: 0x6c6ea620, 0x33def: 0x6c6ea820, - 0x33df0: 0x6c6eaa20, 0x33df1: 0x6c6eac20, 0x33df2: 0x6c6bf220, 0x33df3: 0x6c95fa20, - 0x33df4: 0x6c95fc20, 0x33df5: 0x6c95fe20, 0x33df6: 0x6c960020, 0x33df7: 0x6c960220, - 0x33df8: 0x6c960420, 0x33df9: 0x6c960620, 0x33dfa: 0x6c960820, 0x33dfb: 0x6c960a20, - 0x33dfc: 0x6c960c20, 0x33dfd: 0x6c960e20, 0x33dfe: 0x6c961020, 0x33dff: 0x6c961220, - // Block 0xcf8, offset 0x33e00 - 0x33e00: 0x6c961420, 0x33e01: 0x6c961620, 0x33e02: 0x6c961820, 0x33e03: 0x6c961a20, - 0x33e04: 0x6c961c20, 0x33e05: 0x6c961e20, 0x33e06: 0x6c962020, 0x33e07: 0x6c962220, - 0x33e08: 0x6c962420, 0x33e09: 0x6c962620, 0x33e0a: 0x6c962820, 0x33e0b: 0x6c962a20, - 0x33e0c: 0x6c962c20, 0x33e0d: 0x6c962e20, 0x33e0e: 0x6c963020, 0x33e0f: 0x6c963220, - 0x33e10: 0x6c963420, 0x33e11: 0x6c963620, 0x33e12: 0x6c963820, 0x33e13: 0x6c963a20, - 0x33e14: 0x6c963c20, 0x33e15: 0x6c963e20, 0x33e16: 0x6cb78820, 0x33e17: 0x6c964020, - 0x33e18: 0x6c964220, 0x33e19: 0x6c964420, 0x33e1a: 0x6c964620, 0x33e1b: 0x6cc21a20, - 0x33e1c: 0x6cc21c20, 0x33e1d: 0x6cc21e20, 0x33e1e: 0x6cc22020, 0x33e1f: 0x6cc22220, - 0x33e20: 0x6cc22420, 0x33e21: 0x6cc22620, 0x33e22: 0x6cc22820, 0x33e23: 0x6cc22a20, - 0x33e24: 0x6cc22c20, 0x33e25: 0x6cc22e20, 0x33e26: 0x6cc23020, 0x33e27: 0x6cc23220, - 0x33e28: 0x6cc23420, 0x33e29: 0x6cc23620, 0x33e2a: 0x6cc23820, 0x33e2b: 0x6cc23a20, - 0x33e2c: 0x6cc23c20, 0x33e2d: 0x6cc23e20, 0x33e2e: 0x6cc24020, 0x33e2f: 0x6cc24220, - 0x33e30: 0x6cc24420, 0x33e31: 0x6cc24620, 0x33e32: 0x6cc24820, 0x33e33: 0x6cc24a20, - 0x33e34: 0x6cc24c20, 0x33e35: 0x6cc24e20, 0x33e36: 0x6cc25020, 0x33e37: 0x6cc25220, - 0x33e38: 0x6cc25420, 0x33e39: 0x6cc25620, 0x33e3a: 0x6cc25820, 0x33e3b: 0x6cc25a20, - 0x33e3c: 0x6cf17a20, 0x33e3d: 0x6cc25c20, 0x33e3e: 0x6cc25e20, 0x33e3f: 0x6cf17c20, - // Block 0xcf9, offset 0x33e40 - 0x33e40: 0x6cf17e20, 0x33e41: 0x6cf18020, 0x33e42: 0x6cf18220, 0x33e43: 0x6cf18420, - 0x33e44: 0x6cf18620, 0x33e45: 0x6cf18820, 0x33e46: 0x6cf18a20, 0x33e47: 0x6cf18c20, - 0x33e48: 0x6cf18e20, 0x33e49: 0x6cf19020, 0x33e4a: 0x6cf19220, 0x33e4b: 0x6cf19420, - 0x33e4c: 0x6cf19620, 0x33e4d: 0x6cf19820, 0x33e4e: 0x6cf19a20, 0x33e4f: 0x6cf19c20, - 0x33e50: 0x6cf19e20, 0x33e51: 0x6cf1a020, 0x33e52: 0x6cf1a220, 0x33e53: 0x6cf1a420, - 0x33e54: 0x6cf1a620, 0x33e55: 0x6d213620, 0x33e56: 0x6d213820, 0x33e57: 0x6d213a20, - 0x33e58: 0x6d213c20, 0x33e59: 0x6d213e20, 0x33e5a: 0x6d214020, 0x33e5b: 0x6d214220, - 0x33e5c: 0x6d214420, 0x33e5d: 0x6d214620, 0x33e5e: 0x6d214820, 0x33e5f: 0x6d214a20, - 0x33e60: 0x6d214c20, 0x33e61: 0x6d214e20, 0x33e62: 0x6d215020, 0x33e63: 0x6d215220, - 0x33e64: 0x6d215420, 0x33e65: 0x6d215620, 0x33e66: 0x6d215820, 0x33e67: 0x6d215a20, - 0x33e68: 0x6d215c20, 0x33e69: 0x6d215e20, 0x33e6a: 0x6d216020, 0x33e6b: 0x6d216220, - 0x33e6c: 0x6d216420, 0x33e6d: 0x6d4ed020, 0x33e6e: 0x6d4ed220, 0x33e6f: 0x6d4ed420, - 0x33e70: 0x6d4ed620, 0x33e71: 0x6d4ed820, 0x33e72: 0x6d4eda20, 0x33e73: 0x6d4edc20, - 0x33e74: 0x6d4ede20, 0x33e75: 0x6d4ee020, 0x33e76: 0x6d4ee220, 0x33e77: 0x6d4ee420, - 0x33e78: 0x6d4ee620, 0x33e79: 0x6d4ee820, 0x33e7a: 0x6d4eea20, 0x33e7b: 0x6d4eec20, - 0x33e7c: 0x6d4eee20, 0x33e7d: 0x6d4ef020, 0x33e7e: 0x6d4ef220, 0x33e7f: 0x6d4ef420, - // Block 0xcfa, offset 0x33e80 - 0x33e80: 0x6d4ef620, 0x33e81: 0x6d4ef820, 0x33e82: 0x6d7b3a20, 0x33e83: 0x6d7b3c20, - 0x33e84: 0x6d7b3e20, 0x33e85: 0x6d7b4020, 0x33e86: 0x6d7b4220, 0x33e87: 0x6d7b4420, - 0x33e88: 0x6d7b4620, 0x33e89: 0x6d7b4820, 0x33e8a: 0x6d7b4a20, 0x33e8b: 0x6d7b4c20, - 0x33e8c: 0x6d7b4e20, 0x33e8d: 0x6d7b5020, 0x33e8e: 0x6d7b5220, 0x33e8f: 0x6d7b5420, - 0x33e90: 0x6d7b5620, 0x33e91: 0x6da37c20, 0x33e92: 0x6da37e20, 0x33e93: 0x6da38020, - 0x33e94: 0x6da38220, 0x33e95: 0x6da38420, 0x33e96: 0x6da38620, 0x33e97: 0x6da38820, - 0x33e98: 0x6da38a20, 0x33e99: 0x6da38c20, 0x33e9a: 0x6da38e20, 0x33e9b: 0x6da39020, - 0x33e9c: 0x6db42620, 0x33e9d: 0x6da39220, 0x33e9e: 0x6da39420, 0x33e9f: 0x6da39620, - 0x33ea0: 0x6da39820, 0x33ea1: 0x6dc52220, 0x33ea2: 0x6dc52420, 0x33ea3: 0x6dc52620, - 0x33ea4: 0x6dc52820, 0x33ea5: 0x6dc52a20, 0x33ea6: 0x6dc52c20, 0x33ea7: 0x6dc52e20, - 0x33ea8: 0x6dc53020, 0x33ea9: 0x6dc53220, 0x33eaa: 0x6dc53420, 0x33eab: 0x6dc53620, - 0x33eac: 0x6dc53820, 0x33ead: 0x6dc53a20, 0x33eae: 0x6de23a20, 0x33eaf: 0x6de23c20, - 0x33eb0: 0x6de23e20, 0x33eb1: 0x6de24020, 0x33eb2: 0x6de24220, 0x33eb3: 0x6de24420, - 0x33eb4: 0x6de24620, 0x33eb5: 0x6de24820, 0x33eb6: 0x6de24a20, 0x33eb7: 0x6de24c20, - 0x33eb8: 0x6de24e20, 0x33eb9: 0x6de25020, 0x33eba: 0x6de25220, 0x33ebb: 0x6df9f420, - 0x33ebc: 0x6df9f620, 0x33ebd: 0x6df9f820, 0x33ebe: 0x6df9fa20, 0x33ebf: 0x6df9fc20, - // Block 0xcfb, offset 0x33ec0 - 0x33ec0: 0x6df9fe20, 0x33ec1: 0x6dfa0020, 0x33ec2: 0x6dfa0220, 0x33ec3: 0x6dfa0420, - 0x33ec4: 0x6e0da220, 0x33ec5: 0x6e0da420, 0x33ec6: 0x6e0da620, 0x33ec7: 0x6e0f2020, - 0x33ec8: 0x6e1d1420, 0x33ec9: 0x6e1d1620, 0x33eca: 0x6e1d1820, 0x33ecb: 0x6e1d1a20, - 0x33ecc: 0x6e1d1c20, 0x33ecd: 0x6e28c020, 0x33ece: 0x6e28c220, 0x33ecf: 0x6e28c420, - 0x33ed0: 0x6e28c620, 0x33ed1: 0x6e28c820, 0x33ed2: 0x6e321220, 0x33ed3: 0x6e3d2220, - 0x33ed4: 0x6e403220, 0x33ed5: 0x6e403420, 0x33ed6: 0x6e429420, 0x33ed7: 0x6c043a20, - 0x33ed8: 0x6c08d220, 0x33ed9: 0x6c08d420, 0x33eda: 0x6c08d620, 0x33edb: 0x6c1e8620, - 0x33edc: 0x6c110c20, 0x33edd: 0x6c1e8820, 0x33ede: 0x6c1e8a20, 0x33edf: 0x6c324a20, - 0x33ee0: 0x6c4cb420, 0x33ee1: 0x6c4cb620, 0x33ee2: 0x6c4cb820, 0x33ee3: 0x6c4cba20, - 0x33ee4: 0x6c4cbc20, 0x33ee5: 0x6c4cbe20, 0x33ee6: 0x6c6ebc20, 0x33ee7: 0x6c6ebe20, - 0x33ee8: 0x6c965220, 0x33ee9: 0x6c965420, 0x33eea: 0x6c965620, 0x33eeb: 0x6cc26620, - 0x33eec: 0x6c01da20, 0x33eed: 0x6c044020, 0x33eee: 0x6c08dc20, 0x33eef: 0x6c08de20, - 0x33ef0: 0x6c111020, 0x33ef1: 0x6c111220, 0x33ef2: 0x6c111420, 0x33ef3: 0x6c1e9620, - 0x33ef4: 0x6c4cc620, 0x33ef5: 0x6c1e9820, 0x33ef6: 0x6c1e9a20, 0x33ef7: 0x6c1e9c20, - 0x33ef8: 0x6c1e9e20, 0x33ef9: 0x6c1ea020, 0x33efa: 0x6c1ea220, 0x33efb: 0x6c324e20, - 0x33efc: 0x6c4cc820, 0x33efd: 0x6c325020, 0x33efe: 0x6c325220, 0x33eff: 0x6c325420, - // Block 0xcfc, offset 0x33f00 - 0x33f00: 0x6c325620, 0x33f01: 0x6c325820, 0x33f02: 0x6c4cca20, 0x33f03: 0x6c4ccc20, - 0x33f04: 0x6c4cce20, 0x33f05: 0x6c4cd020, 0x33f06: 0x6c4cd220, 0x33f07: 0x6c4cd420, - 0x33f08: 0x6c4cd620, 0x33f09: 0x6c4cd820, 0x33f0a: 0x6c4cda20, 0x33f0b: 0x6c4cdc20, - 0x33f0c: 0x6c4cde20, 0x33f0d: 0x6c6ec420, 0x33f0e: 0x6c6ec620, 0x33f0f: 0x6c6ec820, - 0x33f10: 0x6c6eca20, 0x33f11: 0x6c6ecc20, 0x33f12: 0x6c6ece20, 0x33f13: 0x6c6ed020, - 0x33f14: 0x6c965a20, 0x33f15: 0x6c965c20, 0x33f16: 0x6c965e20, 0x33f17: 0x6c966020, - 0x33f18: 0x6c966220, 0x33f19: 0x6c966420, 0x33f1a: 0x6cc26820, 0x33f1b: 0x6cc26a20, - 0x33f1c: 0x6cc26c20, 0x33f1d: 0x6cc26e20, 0x33f1e: 0x6cc27020, 0x33f1f: 0x6cc27220, - 0x33f20: 0x6cc27420, 0x33f21: 0x6cc27620, 0x33f22: 0x6cf1ae20, 0x33f23: 0x6cf1b020, - 0x33f24: 0x6cf1b220, 0x33f25: 0x6cf1b420, 0x33f26: 0x6d217620, 0x33f27: 0x6d217820, - 0x33f28: 0x6d217a20, 0x33f29: 0x6d217c20, 0x33f2a: 0x6d217e20, 0x33f2b: 0x6d218020, - 0x33f2c: 0x6d4f0220, 0x33f2d: 0x6d1a0c20, 0x33f2e: 0x6d7b5e20, 0x33f2f: 0x6d7b6020, - 0x33f30: 0x6d7b6220, 0x33f31: 0x6d7b6420, 0x33f32: 0x6da3a020, 0x33f33: 0x6da3a220, - 0x33f34: 0x6da3a420, 0x33f35: 0x6de25620, 0x33f36: 0x6e1d1e20, 0x33f37: 0x6e403620, - 0x33f38: 0x6e403820, 0x33f39: 0x6e442c20, 0x33f3a: 0x6c01de20, 0x33f3b: 0x6c044420, - 0x33f3c: 0x6c044620, 0x33f3d: 0x6c111c20, 0x33f3e: 0x6c111e20, 0x33f3f: 0x6c1ea820, - // Block 0xcfd, offset 0x33f40 - 0x33f40: 0x6c1eaa20, 0x33f41: 0x6c1eac20, 0x33f42: 0x6c1eae20, 0x33f43: 0x6c1eb020, - 0x33f44: 0x6c325c20, 0x33f45: 0x6c325e20, 0x33f46: 0x6c4ce220, 0x33f47: 0x6c4ce420, - 0x33f48: 0x6c4ce620, 0x33f49: 0x6c4ce820, 0x33f4a: 0x6c4cea20, 0x33f4b: 0x6c6ed420, - 0x33f4c: 0x6c6ed620, 0x33f4d: 0x6c966620, 0x33f4e: 0x6cc27c20, 0x33f4f: 0x6cf1bc20, - 0x33f50: 0x6cf1be20, 0x33f51: 0x6d4f0420, 0x33f52: 0x6d4f0620, 0x33f53: 0x6d7b6620, - 0x33f54: 0x6da3a820, 0x33f55: 0x6dc53e20, 0x33f56: 0x6e0daa20, 0x33f57: 0x6c01e220, - 0x33f58: 0x6c01e420, 0x33f59: 0x6c045020, 0x33f5a: 0x6c045220, 0x33f5b: 0x6c045420, - 0x33f5c: 0x6c045620, 0x33f5d: 0x6c045820, 0x33f5e: 0x6c045a20, 0x33f5f: 0x6c045c20, - 0x33f60: 0x6c045e20, 0x33f61: 0x6c046020, 0x33f62: 0x6c08e620, 0x33f63: 0x6c08e820, - 0x33f64: 0x6c08ea20, 0x33f65: 0x6c08ec20, 0x33f66: 0x6c08ee20, 0x33f67: 0x6c08f020, - 0x33f68: 0x6c08f220, 0x33f69: 0x6c08f420, 0x33f6a: 0x6c08f620, 0x33f6b: 0x6c113020, - 0x33f6c: 0x6c113220, 0x33f6d: 0x6c113420, 0x33f6e: 0x6c113620, 0x33f6f: 0x6c113820, - 0x33f70: 0x6c113a20, 0x33f71: 0x6c113c20, 0x33f72: 0x6c113e20, 0x33f73: 0x6c114020, - 0x33f74: 0x6c114220, 0x33f75: 0x6c114420, 0x33f76: 0x6c114620, 0x33f77: 0x6c1ebe20, - 0x33f78: 0x6c1ec020, 0x33f79: 0x6c1ec220, 0x33f7a: 0x6c1ec420, 0x33f7b: 0x6c1ec620, - 0x33f7c: 0x6c1ec820, 0x33f7d: 0x6c1eca20, 0x33f7e: 0x6c1ecc20, 0x33f7f: 0x6c1ece20, - // Block 0xcfe, offset 0x33f80 - 0x33f80: 0x6c1ed020, 0x33f81: 0x6c1ed220, 0x33f82: 0x6c1ed420, 0x33f83: 0x6c1ed620, - 0x33f84: 0x6c1ed820, 0x33f85: 0x6c1eda20, 0x33f86: 0x6c327c20, 0x33f87: 0x6c327e20, - 0x33f88: 0x6c328020, 0x33f89: 0x6c328220, 0x33f8a: 0x6c328420, 0x33f8b: 0x6c328620, - 0x33f8c: 0x6c328820, 0x33f8d: 0x6c328a20, 0x33f8e: 0x6c328c20, 0x33f8f: 0x6c328e20, - 0x33f90: 0x6c329020, 0x33f91: 0x6c329220, 0x33f92: 0x6c329420, 0x33f93: 0x6c329620, - 0x33f94: 0x6c4d0620, 0x33f95: 0x6c4d0820, 0x33f96: 0x6c4d0a20, 0x33f97: 0x6c4d0c20, - 0x33f98: 0x6c4d0e20, 0x33f99: 0x6c4d1020, 0x33f9a: 0x6c4d1220, 0x33f9b: 0x6c4d1420, - 0x33f9c: 0x6c4d1620, 0x33f9d: 0x6c4d1820, 0x33f9e: 0x6c4d1a20, 0x33f9f: 0x6c4d1c20, - 0x33fa0: 0x6c4d1e20, 0x33fa1: 0x6c4d2020, 0x33fa2: 0x6c4d2220, 0x33fa3: 0x6c4d2420, - 0x33fa4: 0x6c6ee420, 0x33fa5: 0x6c6ee620, 0x33fa6: 0x6c6ee820, 0x33fa7: 0x6c6eea20, - 0x33fa8: 0x6c6eec20, 0x33fa9: 0x6c6eee20, 0x33faa: 0x6c6ef020, 0x33fab: 0x6c6ef220, - 0x33fac: 0x6c6ef420, 0x33fad: 0x6c6ef620, 0x33fae: 0x6c967a20, 0x33faf: 0x6c967c20, - 0x33fb0: 0x6c967e20, 0x33fb1: 0x6c968020, 0x33fb2: 0x6c968220, 0x33fb3: 0x6c968420, - 0x33fb4: 0x6c968620, 0x33fb5: 0x6c968820, 0x33fb6: 0x6c968a20, 0x33fb7: 0x6c968c20, - 0x33fb8: 0x6c968e20, 0x33fb9: 0x6c969020, 0x33fba: 0x6c969220, 0x33fbb: 0x6c969420, - 0x33fbc: 0x6c969620, 0x33fbd: 0x6c969820, 0x33fbe: 0x6c969a20, 0x33fbf: 0x6c969c20, - // Block 0xcff, offset 0x33fc0 - 0x33fc0: 0x6cc28e20, 0x33fc1: 0x6cc29020, 0x33fc2: 0x6cc29220, 0x33fc3: 0x6cc29420, - 0x33fc4: 0x6cc29620, 0x33fc5: 0x6cc29820, 0x33fc6: 0x6cc29a20, 0x33fc7: 0x6cc29c20, - 0x33fc8: 0x6cc29e20, 0x33fc9: 0x6cc2a020, 0x33fca: 0x6cf1d020, 0x33fcb: 0x6cf1d220, - 0x33fcc: 0x6cf1d420, 0x33fcd: 0x6cf1d620, 0x33fce: 0x6cf1d820, 0x33fcf: 0x6cf1da20, - 0x33fd0: 0x6cf1dc20, 0x33fd1: 0x6cf1de20, 0x33fd2: 0x6d218c20, 0x33fd3: 0x6d218e20, - 0x33fd4: 0x6d219020, 0x33fd5: 0x6d219220, 0x33fd6: 0x6d219420, 0x33fd7: 0x6d219620, - 0x33fd8: 0x6d219820, 0x33fd9: 0x6d219a20, 0x33fda: 0x6d219c20, 0x33fdb: 0x6d219e20, - 0x33fdc: 0x6d21a020, 0x33fdd: 0x6d21a220, 0x33fde: 0x6d4f1220, 0x33fdf: 0x6d4f1420, - 0x33fe0: 0x6d4f1620, 0x33fe1: 0x6d4f1820, 0x33fe2: 0x6d4f1a20, 0x33fe3: 0x6d4f1c20, - 0x33fe4: 0x6d4f1e20, 0x33fe5: 0x6d7b6c20, 0x33fe6: 0x6d7b6e20, 0x33fe7: 0x6d7b7020, - 0x33fe8: 0x6d7b7220, 0x33fe9: 0x6d7b7420, 0x33fea: 0x6d7b7620, 0x33feb: 0x6d8a6c20, - 0x33fec: 0x6da3ac20, 0x33fed: 0x6da3ae20, 0x33fee: 0x6da3b020, 0x33fef: 0x6da3b220, - 0x33ff0: 0x6da3b420, 0x33ff1: 0x6da3b620, 0x33ff2: 0x6dc54220, 0x33ff3: 0x6dc54420, - 0x33ff4: 0x6dc54620, 0x33ff5: 0x6dc54820, 0x33ff6: 0x6dc54a20, 0x33ff7: 0x6dc54c20, - 0x33ff8: 0x6de25820, 0x33ff9: 0x6de25a20, 0x33ffa: 0x6de25c20, 0x33ffb: 0x6de25e20, - 0x33ffc: 0x6de26020, 0x33ffd: 0x6de26220, 0x33ffe: 0x6de26420, 0x33fff: 0x6dfa0620, - // Block 0xd00, offset 0x34000 - 0x34000: 0x6dfa0820, 0x34001: 0x6dfa0a20, 0x34002: 0x6dfa0c20, 0x34003: 0x6dfa0e20, - 0x34004: 0x6dfa1020, 0x34005: 0x6dfa1220, 0x34006: 0x6e0dae20, 0x34007: 0x6e0db020, - 0x34008: 0x6e0db220, 0x34009: 0x6e0db420, 0x3400a: 0x6e1d2420, 0x3400b: 0x6e321420, - 0x3400c: 0x6e388220, 0x3400d: 0x6e429620, 0x3400e: 0x6e462820, 0x3400f: 0x6c114c20, - 0x34010: 0x6c114e20, 0x34011: 0x6c115020, 0x34012: 0x6c115220, 0x34013: 0x6c1edc20, - 0x34014: 0x6c32a020, 0x34015: 0x6c32a220, 0x34016: 0x6c3bf820, 0x34017: 0x6c4d2c20, - 0x34018: 0x6c4d2e20, 0x34019: 0x6c4d3020, 0x3401a: 0x6c4d3220, 0x3401b: 0x6c6efa20, - 0x3401c: 0x6c6efc20, 0x3401d: 0x6c6efe20, 0x3401e: 0x6c96a220, 0x3401f: 0x6c96a420, - 0x34020: 0x6c96a620, 0x34021: 0x6c96a820, 0x34022: 0x6cc2a820, 0x34023: 0x6cc2aa20, - 0x34024: 0x6cc2ac20, 0x34025: 0x6cf1e420, 0x34026: 0x6cf1e620, 0x34027: 0x6cf1e820, - 0x34028: 0x6d21a820, 0x34029: 0x6d21aa20, 0x3402a: 0x6d21ac20, 0x3402b: 0x6d21ae20, - 0x3402c: 0x6d21b020, 0x3402d: 0x6d4f2020, 0x3402e: 0x6d4f2220, 0x3402f: 0x6d7b7e20, - 0x34030: 0x6d7adc20, 0x34031: 0x6d7b8020, 0x34032: 0x6da3ba20, 0x34033: 0x6dc55220, - 0x34034: 0x6dc55420, 0x34035: 0x6dc55620, 0x34036: 0x6dc55820, 0x34037: 0x6de26a20, - 0x34038: 0x6de26c20, 0x34039: 0x6de26e20, 0x3403a: 0x6de27020, 0x3403b: 0x6dfa1420, - 0x3403c: 0x6dfa1620, 0x3403d: 0x6e1d2620, 0x3403e: 0x6e28cc20, 0x3403f: 0x6e3d2620, - // Block 0xd01, offset 0x34040 - 0x34040: 0x6c08fa20, 0x34041: 0x6c08fc20, 0x34042: 0x6c08fe20, 0x34043: 0x6c115820, - 0x34044: 0x6c115a20, 0x34045: 0x6c115c20, 0x34046: 0x6c115e20, 0x34047: 0x6c1ee620, - 0x34048: 0x6c1ee820, 0x34049: 0x6c32aa20, 0x3404a: 0x6c32ac20, 0x3404b: 0x6c32ae20, - 0x3404c: 0x6c32b020, 0x3404d: 0x6c32b220, 0x3404e: 0x6c4d3820, 0x3404f: 0x6c6f0420, - 0x34050: 0x6c6f0620, 0x34051: 0x6c6f0820, 0x34052: 0x6c6f0a20, 0x34053: 0x6c6f0c20, - 0x34054: 0x6c96b220, 0x34055: 0x6c96b420, 0x34056: 0x6c96b620, 0x34057: 0x6c96b820, - 0x34058: 0x6c96ba20, 0x34059: 0x6c96bc20, 0x3405a: 0x6c96be20, 0x3405b: 0x6c96c020, - 0x3405c: 0x6c96c220, 0x3405d: 0x6c96c420, 0x3405e: 0x6cc2b420, 0x3405f: 0x6cc2b620, - 0x34060: 0x6cc2b820, 0x34061: 0x6cc2ba20, 0x34062: 0x6cc2bc20, 0x34063: 0x6cc2be20, - 0x34064: 0x6cf1ec20, 0x34065: 0x6cf1ee20, 0x34066: 0x6cf1f020, 0x34067: 0x6cf1f220, - 0x34068: 0x6cf1f420, 0x34069: 0x6d21b820, 0x3406a: 0x6d21ba20, 0x3406b: 0x6d4f2a20, - 0x3406c: 0x6d4f2c20, 0x3406d: 0x6d4f2e20, 0x3406e: 0x6d4f3020, 0x3406f: 0x6d4f3220, - 0x34070: 0x6d7b8420, 0x34071: 0x6d7b8620, 0x34072: 0x6d7b8820, 0x34073: 0x6d7b8a20, - 0x34074: 0x6da3bc20, 0x34075: 0x6dc55c20, 0x34076: 0x6e0db820, 0x34077: 0x6dfa1820, - 0x34078: 0x6e1d2a20, 0x34079: 0x6e1d2c20, 0x3407a: 0x6e1d2e20, 0x3407b: 0x6e388620, - 0x3407c: 0x6c046220, 0x3407d: 0x6c046420, 0x3407e: 0x6c090220, 0x3407f: 0x6c090420, - // Block 0xd02, offset 0x34080 - 0x34080: 0x6c116620, 0x34081: 0x6c116820, 0x34082: 0x6c116a20, 0x34083: 0x6c116c20, - 0x34084: 0x6c1efe20, 0x34085: 0x6c1f0020, 0x34086: 0x6c1f0220, 0x34087: 0x6c1f0420, - 0x34088: 0x6c1f0620, 0x34089: 0x6c1f0820, 0x3408a: 0x6c1f0a20, 0x3408b: 0x6c1f0c20, - 0x3408c: 0x6c1f0e20, 0x3408d: 0x6c1f1020, 0x3408e: 0x6c1f1220, 0x3408f: 0x6c1f1420, - 0x34090: 0x6c1f1620, 0x34091: 0x6c1f1820, 0x34092: 0x6c32ca20, 0x34093: 0x6c32cc20, - 0x34094: 0x6c32ce20, 0x34095: 0x6c32d020, 0x34096: 0x6c32d220, 0x34097: 0x6c32d420, - 0x34098: 0x6c32d620, 0x34099: 0x6c32d820, 0x3409a: 0x6c32da20, 0x3409b: 0x6c32dc20, - 0x3409c: 0x6c4d6020, 0x3409d: 0x6c4d6220, 0x3409e: 0x6c4d6420, 0x3409f: 0x6c4d6620, - 0x340a0: 0x6c4d6820, 0x340a1: 0x6c4d6a20, 0x340a2: 0x6c4d6c20, 0x340a3: 0x6c4d6e20, - 0x340a4: 0x6c4d7020, 0x340a5: 0x6c4d7220, 0x340a6: 0x6c4d7420, 0x340a7: 0x6c4d7620, - 0x340a8: 0x6c4d7820, 0x340a9: 0x6c4d7a20, 0x340aa: 0x6c6f2420, 0x340ab: 0x6c6f2620, - 0x340ac: 0x6c6f2820, 0x340ad: 0x6c6f2a20, 0x340ae: 0x6c6f2c20, 0x340af: 0x6c6f2e20, - 0x340b0: 0x6c6f3020, 0x340b1: 0x6c6f3220, 0x340b2: 0x6c6f3420, 0x340b3: 0x6c6f3620, - 0x340b4: 0x6c6f3820, 0x340b5: 0x6c6f3a20, 0x340b6: 0x6c6f3c20, 0x340b7: 0x6c6f3e20, - 0x340b8: 0x6c6f4020, 0x340b9: 0x6c6f4220, 0x340ba: 0x6c6f4420, 0x340bb: 0x6c6f4620, - 0x340bc: 0x6c6f4820, 0x340bd: 0x6c6f4a20, 0x340be: 0x6c6f4c20, 0x340bf: 0x6c6f4e20, - // Block 0xd03, offset 0x340c0 - 0x340c0: 0x6c6f5020, 0x340c1: 0x6c96ee20, 0x340c2: 0x6c96f020, 0x340c3: 0x6c96f220, - 0x340c4: 0x6c96f420, 0x340c5: 0x6c96f620, 0x340c6: 0x6c96f820, 0x340c7: 0x6c96fa20, - 0x340c8: 0x6c96fc20, 0x340c9: 0x6c96fe20, 0x340ca: 0x6c970020, 0x340cb: 0x6c970220, - 0x340cc: 0x6c970420, 0x340cd: 0x6c970620, 0x340ce: 0x6c970820, 0x340cf: 0x6c970a20, - 0x340d0: 0x6c970c20, 0x340d1: 0x6c970e20, 0x340d2: 0x6c971020, 0x340d3: 0x6c971220, - 0x340d4: 0x6c971420, 0x340d5: 0x6c971620, 0x340d6: 0x6c971820, 0x340d7: 0x6c971a20, - 0x340d8: 0x6c971c20, 0x340d9: 0x6c971e20, 0x340da: 0x6c972020, 0x340db: 0x6c972220, - 0x340dc: 0x6c972420, 0x340dd: 0x6c972620, 0x340de: 0x6c972820, 0x340df: 0x6cc2da20, - 0x340e0: 0x6cc2dc20, 0x340e1: 0x6cc2de20, 0x340e2: 0x6cc2e020, 0x340e3: 0x6cc2e220, - 0x340e4: 0x6cc2e420, 0x340e5: 0x6cc2e620, 0x340e6: 0x6cc2e820, 0x340e7: 0x6cc2ea20, - 0x340e8: 0x6cc2ec20, 0x340e9: 0x6cc2ee20, 0x340ea: 0x6cc2f020, 0x340eb: 0x6cc2f220, - 0x340ec: 0x6cde5820, 0x340ed: 0x6cc2f420, 0x340ee: 0x6cc2f620, 0x340ef: 0x6cc2f820, - 0x340f0: 0x6cc2fa20, 0x340f1: 0x6cc2fc20, 0x340f2: 0x6cf20220, 0x340f3: 0x6cf20420, - 0x340f4: 0x6cf20620, 0x340f5: 0x6cf20820, 0x340f6: 0x6cf20a20, 0x340f7: 0x6cf20c20, - 0x340f8: 0x6cf20e20, 0x340f9: 0x6cf21020, 0x340fa: 0x6cf21220, 0x340fb: 0x6cf21420, - 0x340fc: 0x6cf21620, 0x340fd: 0x6cf21820, 0x340fe: 0x6cf21a20, 0x340ff: 0x6cf21c20, - // Block 0xd04, offset 0x34100 - 0x34100: 0x6cf21e20, 0x34101: 0x6cf22020, 0x34102: 0x6cf22220, 0x34103: 0x6cf22420, - 0x34104: 0x6cf22620, 0x34105: 0x6cf22820, 0x34106: 0x6cf22a20, 0x34107: 0x6cf22c20, - 0x34108: 0x6cf22e20, 0x34109: 0x6cf23020, 0x3410a: 0x6cf23220, 0x3410b: 0x6cf23420, - 0x3410c: 0x6cf23620, 0x3410d: 0x6cf23820, 0x3410e: 0x6cf23a20, 0x3410f: 0x6d21c820, - 0x34110: 0x6d21ca20, 0x34111: 0x6d21cc20, 0x34112: 0x6d21ce20, 0x34113: 0x6d21d020, - 0x34114: 0x6d21d220, 0x34115: 0x6d21d420, 0x34116: 0x6d21d620, 0x34117: 0x6d21d820, - 0x34118: 0x6d21da20, 0x34119: 0x6d21dc20, 0x3411a: 0x6d21de20, 0x3411b: 0x6d21e020, - 0x3411c: 0x6d21e220, 0x3411d: 0x6d21e420, 0x3411e: 0x6d21e620, 0x3411f: 0x6d21e820, - 0x34120: 0x6d21ea20, 0x34121: 0x6d21ec20, 0x34122: 0x6d21ee20, 0x34123: 0x6d21f020, - 0x34124: 0x6d21f220, 0x34125: 0x6d21f420, 0x34126: 0x6d21f620, 0x34127: 0x6cf23c20, - 0x34128: 0x6d21f820, 0x34129: 0x6d21fa20, 0x3412a: 0x6d4f4620, 0x3412b: 0x6d4f4820, - 0x3412c: 0x6d4f4a20, 0x3412d: 0x6d4f4c20, 0x3412e: 0x6d4f4e20, 0x3412f: 0x6d4f5020, - 0x34130: 0x6d4f5220, 0x34131: 0x6d4f5420, 0x34132: 0x6d4f5620, 0x34133: 0x6d4f5820, - 0x34134: 0x6d4f5a20, 0x34135: 0x6d4f5c20, 0x34136: 0x6d4f5e20, 0x34137: 0x6d4f6020, - 0x34138: 0x6d4f6220, 0x34139: 0x6d7b9420, 0x3413a: 0x6d7b9620, 0x3413b: 0x6d7b9820, - 0x3413c: 0x6d7b9a20, 0x3413d: 0x6d7b9c20, 0x3413e: 0x6d7b9e20, 0x3413f: 0x6d7ba020, - // Block 0xd05, offset 0x34140 - 0x34140: 0x6d7ba220, 0x34141: 0x6d7ba420, 0x34142: 0x6d7ba620, 0x34143: 0x6d7ba820, - 0x34144: 0x6d7baa20, 0x34145: 0x6d912c20, 0x34146: 0x6d7bac20, 0x34147: 0x6d7bae20, - 0x34148: 0x6da3c620, 0x34149: 0x6da3c820, 0x3414a: 0x6da3ca20, 0x3414b: 0x6db4d020, - 0x3414c: 0x6da3cc20, 0x3414d: 0x6da3ce20, 0x3414e: 0x6da3d020, 0x3414f: 0x6dc55e20, - 0x34150: 0x6dc56020, 0x34151: 0x6dc56220, 0x34152: 0x6dc56420, 0x34153: 0x6dc56620, - 0x34154: 0x6dc56820, 0x34155: 0x6dc56a20, 0x34156: 0x6dc56c20, 0x34157: 0x6dc56e20, - 0x34158: 0x6de27620, 0x34159: 0x6de27820, 0x3415a: 0x6de27a20, 0x3415b: 0x6df7ca20, - 0x3415c: 0x6de27c20, 0x3415d: 0x6dfa2020, 0x3415e: 0x6dfa2220, 0x3415f: 0x6dfa2420, - 0x34160: 0x6dfa2620, 0x34161: 0x6e01e220, 0x34162: 0x6dfa2820, 0x34163: 0x6e0dbc20, - 0x34164: 0x6e0dbe20, 0x34165: 0x6e1d3020, 0x34166: 0x6e28ce20, 0x34167: 0x6e388820, - 0x34168: 0x6e403a20, 0x34169: 0x6c01f220, 0x3416a: 0x6c046a20, 0x3416b: 0x6c091020, - 0x3416c: 0x6c091220, 0x3416d: 0x6c091420, 0x3416e: 0x6c091620, 0x3416f: 0x6c091820, - 0x34170: 0x6c091a20, 0x34171: 0x6c091c20, 0x34172: 0x6c118a20, 0x34173: 0x6c118c20, - 0x34174: 0x6c118e20, 0x34175: 0x6c119020, 0x34176: 0x6c119220, 0x34177: 0x6c119420, - 0x34178: 0x6c119620, 0x34179: 0x6c119820, 0x3417a: 0x6c119a20, 0x3417b: 0x6c119c20, - 0x3417c: 0x6c119e20, 0x3417d: 0x6c11a020, 0x3417e: 0x6c11a220, 0x3417f: 0x6c11a420, - // Block 0xd06, offset 0x34180 - 0x34180: 0x6c11a620, 0x34181: 0x6c11a820, 0x34182: 0x6c11aa20, 0x34183: 0x6c11ac20, - 0x34184: 0x6c11ae20, 0x34185: 0x6c11b020, 0x34186: 0x6c11b220, 0x34187: 0x6c11b420, - 0x34188: 0x6c11b620, 0x34189: 0x6c1f8020, 0x3418a: 0x6c1f8220, 0x3418b: 0x6c1f8420, - 0x3418c: 0x6c1f8620, 0x3418d: 0x6c1f8820, 0x3418e: 0x6c1f8a20, 0x3418f: 0x6c1f8c20, - 0x34190: 0x6c1f8e20, 0x34191: 0x6c1f9020, 0x34192: 0x6c1f9220, 0x34193: 0x6c1f9420, - 0x34194: 0x6c1f9620, 0x34195: 0x6c1f9820, 0x34196: 0x6c1f9a20, 0x34197: 0x6c1f9c20, - 0x34198: 0x6c1f9e20, 0x34199: 0x6c1fa020, 0x3419a: 0x6c1fa220, 0x3419b: 0x6c1fa420, - 0x3419c: 0x6c1fa620, 0x3419d: 0x6c1fa820, 0x3419e: 0x6c1faa20, 0x3419f: 0x6c1fac20, - 0x341a0: 0x6c1fae20, 0x341a1: 0x6c1fb020, 0x341a2: 0x6c1fb220, 0x341a3: 0x6c1fb420, - 0x341a4: 0x6c1fb620, 0x341a5: 0x6c1fb820, 0x341a6: 0x6c1fba20, 0x341a7: 0x6c1fbc20, - 0x341a8: 0x6c1fbe20, 0x341a9: 0x6c1fc020, 0x341aa: 0x6c1fc220, 0x341ab: 0x6c1fc420, - 0x341ac: 0x6c1fc620, 0x341ad: 0x6c1fc820, 0x341ae: 0x6c1fca20, 0x341af: 0x6c1fcc20, - 0x341b0: 0x6c1fce20, 0x341b1: 0x6c1fd020, 0x341b2: 0x6c1fd220, 0x341b3: 0x6c1fd420, - 0x341b4: 0x6c1fd620, 0x341b5: 0x6c1fd820, 0x341b6: 0x6c1fda20, 0x341b7: 0x6c1fdc20, - 0x341b8: 0x6c1fde20, 0x341b9: 0x6c1fe020, 0x341ba: 0x6c1fe220, 0x341bb: 0x6c1fe420, - 0x341bc: 0x6c1fe620, 0x341bd: 0x6c1fe820, 0x341be: 0x6c1fea20, 0x341bf: 0x6c336420, - // Block 0xd07, offset 0x341c0 - 0x341c0: 0x6c336620, 0x341c1: 0x6c336820, 0x341c2: 0x6c336a20, 0x341c3: 0x6c336c20, - 0x341c4: 0x6c336e20, 0x341c5: 0x6c337020, 0x341c6: 0x6c337220, 0x341c7: 0x6c337420, - 0x341c8: 0x6c337620, 0x341c9: 0x6c337820, 0x341ca: 0x6c337a20, 0x341cb: 0x6c337c20, - 0x341cc: 0x6c337e20, 0x341cd: 0x6c338020, 0x341ce: 0x6c338220, 0x341cf: 0x6c338420, - 0x341d0: 0x6c338620, 0x341d1: 0x6c338820, 0x341d2: 0x6c338a20, 0x341d3: 0x6c338c20, - 0x341d4: 0x6c338e20, 0x341d5: 0x6c339020, 0x341d6: 0x6c339220, 0x341d7: 0x6c339420, - 0x341d8: 0x6c339620, 0x341d9: 0x6c339820, 0x341da: 0x6c339a20, 0x341db: 0x6c339c20, - 0x341dc: 0x6c339e20, 0x341dd: 0x6c33a020, 0x341de: 0x6c33a220, 0x341df: 0x6c33a420, - 0x341e0: 0x6c33a620, 0x341e1: 0x6c33a820, 0x341e2: 0x6c33aa20, 0x341e3: 0x6c33ac20, - 0x341e4: 0x6c33ae20, 0x341e5: 0x6c33b020, 0x341e6: 0x6c33b220, 0x341e7: 0x6c33b420, - 0x341e8: 0x6c33b620, 0x341e9: 0x6c33b820, 0x341ea: 0x6c33ba20, 0x341eb: 0x6c33bc20, - 0x341ec: 0x6c33be20, 0x341ed: 0x6c33c020, 0x341ee: 0x6c33c220, 0x341ef: 0x6c33c420, - 0x341f0: 0x6c33c620, 0x341f1: 0x6c33c820, 0x341f2: 0x6c33ca20, 0x341f3: 0x6c33cc20, - 0x341f4: 0x6c4e1420, 0x341f5: 0x6c4e1620, 0x341f6: 0x6c4e1820, 0x341f7: 0x6c4e1a20, - 0x341f8: 0x6c4e1c20, 0x341f9: 0x6c4e1e20, 0x341fa: 0x6c4e2020, 0x341fb: 0x6c4e2220, - 0x341fc: 0x6c4e2420, 0x341fd: 0x6c4e2620, 0x341fe: 0x6c4e2820, 0x341ff: 0x6c4e2a20, - // Block 0xd08, offset 0x34200 - 0x34200: 0x6c4e2c20, 0x34201: 0x6c4e2e20, 0x34202: 0x6c4e3020, 0x34203: 0x6c4e3220, - 0x34204: 0x6c4e3420, 0x34205: 0x6c4e3620, 0x34206: 0x6c4e3820, 0x34207: 0x6c4e3a20, - 0x34208: 0x6c4e3c20, 0x34209: 0x6c4e3e20, 0x3420a: 0x6c4e4020, 0x3420b: 0x6c4e4220, - 0x3420c: 0x6c4e4420, 0x3420d: 0x6c4e4620, 0x3420e: 0x6c4e4820, 0x3420f: 0x6c4e4a20, - 0x34210: 0x6c4e4c20, 0x34211: 0x6c4e4e20, 0x34212: 0x6c4e5020, 0x34213: 0x6c4e5220, - 0x34214: 0x6c4e5420, 0x34215: 0x6c4e5620, 0x34216: 0x6c4e5820, 0x34217: 0x6c4e5a20, - 0x34218: 0x6c4e5c20, 0x34219: 0x6c4e5e20, 0x3421a: 0x6c4e6020, 0x3421b: 0x6c4e6220, - 0x3421c: 0x6c4e6420, 0x3421d: 0x6c4e6620, 0x3421e: 0x6c4e6820, 0x3421f: 0x6c4e6a20, - 0x34220: 0x6c4e6c20, 0x34221: 0x6c4e6e20, 0x34222: 0x6c4e7020, 0x34223: 0x6c4e7220, - 0x34224: 0x6c4e7420, 0x34225: 0x6c4e7620, 0x34226: 0x6c4e7820, 0x34227: 0x6c4e7a20, - 0x34228: 0x6c4e7c20, 0x34229: 0x6c4e7e20, 0x3422a: 0x6c4e8020, 0x3422b: 0x6c4e8220, - 0x3422c: 0x6c4e8420, 0x3422d: 0x6c4e8620, 0x3422e: 0x6c4e8820, 0x3422f: 0x6c4e8a20, - 0x34230: 0x6c4e8c20, 0x34231: 0x6c6fe420, 0x34232: 0x6c6fe620, 0x34233: 0x6c6fe820, - 0x34234: 0x6c6fea20, 0x34235: 0x6c6fec20, 0x34236: 0x6c6fee20, 0x34237: 0x6c6ff020, - 0x34238: 0x6c6ff220, 0x34239: 0x6c6ff420, 0x3423a: 0x6c6ff620, 0x3423b: 0x6c6ff820, - 0x3423c: 0x6c6ffa20, 0x3423d: 0x6c6ffc20, 0x3423e: 0x6c6ffe20, 0x3423f: 0x6c700020, - // Block 0xd09, offset 0x34240 - 0x34240: 0x6c700220, 0x34241: 0x6c700420, 0x34242: 0x6c700620, 0x34243: 0x6c700820, - 0x34244: 0x6c700a20, 0x34245: 0x6c700c20, 0x34246: 0x6c700e20, 0x34247: 0x6c701020, - 0x34248: 0x6c701220, 0x34249: 0x6c701420, 0x3424a: 0x6c701620, 0x3424b: 0x6c701820, - 0x3424c: 0x6c701a20, 0x3424d: 0x6c701c20, 0x3424e: 0x6c701e20, 0x3424f: 0x6c702020, - 0x34250: 0x6c702220, 0x34251: 0x6c702420, 0x34252: 0x6c702620, 0x34253: 0x6c702820, - 0x34254: 0x6c702a20, 0x34255: 0x6c702c20, 0x34256: 0x6c702e20, 0x34257: 0x6c703020, - 0x34258: 0x6c703220, 0x34259: 0x6c703420, 0x3425a: 0x6c703620, 0x3425b: 0x6c703820, - 0x3425c: 0x6c703a20, 0x3425d: 0x6c703c20, 0x3425e: 0x6c703e20, 0x3425f: 0x6c704020, - 0x34260: 0x6c704220, 0x34261: 0x6c704420, 0x34262: 0x6c704620, 0x34263: 0x6c704820, - 0x34264: 0x6c704a20, 0x34265: 0x6c704c20, 0x34266: 0x6c704e20, 0x34267: 0x6c705020, - 0x34268: 0x6c705220, 0x34269: 0x6c705420, 0x3426a: 0x6c705620, 0x3426b: 0x6c705820, - 0x3426c: 0x6c705a20, 0x3426d: 0x6c705c20, 0x3426e: 0x6c705e20, 0x3426f: 0x6c706020, - 0x34270: 0x6c706220, 0x34271: 0x6c706420, 0x34272: 0x6c706620, 0x34273: 0x6c706820, - 0x34274: 0x6c706a20, 0x34275: 0x6c706c20, 0x34276: 0x6c706e20, 0x34277: 0x6c707020, - 0x34278: 0x6c707220, 0x34279: 0x6c707420, 0x3427a: 0x6c707620, 0x3427b: 0x6c707820, - 0x3427c: 0x6c707a20, 0x3427d: 0x6c707c20, 0x3427e: 0x6c707e20, 0x3427f: 0x6c708020, - // Block 0xd0a, offset 0x34280 - 0x34280: 0x6c97d620, 0x34281: 0x6c97d820, 0x34282: 0x6c97da20, 0x34283: 0x6c97dc20, - 0x34284: 0x6c97de20, 0x34285: 0x6c97e020, 0x34286: 0x6c97e220, 0x34287: 0x6c97e420, - 0x34288: 0x6c97e620, 0x34289: 0x6c97e820, 0x3428a: 0x6c97ea20, 0x3428b: 0x6c97ec20, - 0x3428c: 0x6c97ee20, 0x3428d: 0x6c97f020, 0x3428e: 0x6c97f220, 0x3428f: 0x6c97f420, - 0x34290: 0x6c97f620, 0x34291: 0x6c97f820, 0x34292: 0x6c97fa20, 0x34293: 0x6c97fc20, - 0x34294: 0x6c97fe20, 0x34295: 0x6c980020, 0x34296: 0x6c980220, 0x34297: 0x6c980420, - 0x34298: 0x6c980620, 0x34299: 0x6c980820, 0x3429a: 0x6c980a20, 0x3429b: 0x6c980c20, - 0x3429c: 0x6c980e20, 0x3429d: 0x6c981020, 0x3429e: 0x6c981220, 0x3429f: 0x6c981420, - 0x342a0: 0x6c981620, 0x342a1: 0x6c981820, 0x342a2: 0x6c981a20, 0x342a3: 0x6c981c20, - 0x342a4: 0x6c981e20, 0x342a5: 0x6c982020, 0x342a6: 0x6c982220, 0x342a7: 0x6c982420, - 0x342a8: 0x6c982620, 0x342a9: 0x6c982820, 0x342aa: 0x6c982a20, 0x342ab: 0x6c982c20, - 0x342ac: 0x6c982e20, 0x342ad: 0x6c983020, 0x342ae: 0x6c983220, 0x342af: 0x6c983420, - 0x342b0: 0x6c983620, 0x342b1: 0x6c983820, 0x342b2: 0x6c983a20, 0x342b3: 0x6c983c20, - 0x342b4: 0x6c983e20, 0x342b5: 0x6c984020, 0x342b6: 0x6c984220, 0x342b7: 0x6c984420, - 0x342b8: 0x6c984620, 0x342b9: 0x6c984820, 0x342ba: 0x6c984a20, 0x342bb: 0x6c984c20, - 0x342bc: 0x6c984e20, 0x342bd: 0x6c985020, 0x342be: 0x6c985220, 0x342bf: 0x6c985420, - // Block 0xd0b, offset 0x342c0 - 0x342c0: 0x6c985620, 0x342c1: 0x6c985820, 0x342c2: 0x6c985a20, 0x342c3: 0x6c985c20, - 0x342c4: 0x6c985e20, 0x342c5: 0x6c986020, 0x342c6: 0x6c986220, 0x342c7: 0x6c986420, - 0x342c8: 0x6c986620, 0x342c9: 0x6c986820, 0x342ca: 0x6c986a20, 0x342cb: 0x6c986c20, - 0x342cc: 0x6c986e20, 0x342cd: 0x6c987020, 0x342ce: 0x6c987220, 0x342cf: 0x6c987420, - 0x342d0: 0x6c987620, 0x342d1: 0x6c987820, 0x342d2: 0x6c987a20, 0x342d3: 0x6c987c20, - 0x342d4: 0x6c987e20, 0x342d5: 0x6c988020, 0x342d6: 0x6c988220, 0x342d7: 0x6c988420, - 0x342d8: 0x6c988620, 0x342d9: 0x6c988820, 0x342da: 0x6c988a20, 0x342db: 0x6c988c20, - 0x342dc: 0x6c988e20, 0x342dd: 0x6c989020, 0x342de: 0x6c989220, 0x342df: 0x6c989420, - 0x342e0: 0x6c989620, 0x342e1: 0x6c989820, 0x342e2: 0x6c989a20, 0x342e3: 0x6c989c20, - 0x342e4: 0x6c989e20, 0x342e5: 0x6c98a020, 0x342e6: 0x6c98a220, 0x342e7: 0x6c98a420, - 0x342e8: 0x6cc3ac20, 0x342e9: 0x6cc3ae20, 0x342ea: 0x6cc3b020, 0x342eb: 0x6cc3b220, - 0x342ec: 0x6cc3b420, 0x342ed: 0x6cc3b620, 0x342ee: 0x6cc3b820, 0x342ef: 0x6cc3ba20, - 0x342f0: 0x6cc3bc20, 0x342f1: 0x6cc3be20, 0x342f2: 0x6cc3c020, 0x342f3: 0x6cc3c220, - 0x342f4: 0x6cc3c420, 0x342f5: 0x6cc3c620, 0x342f6: 0x6cc3c820, 0x342f7: 0x6cc3ca20, - 0x342f8: 0x6cc3cc20, 0x342f9: 0x6cc3ce20, 0x342fa: 0x6cc3d020, 0x342fb: 0x6cc3d220, - 0x342fc: 0x6cc3d420, 0x342fd: 0x6cc3d620, 0x342fe: 0x6cc3d820, 0x342ff: 0x6cc3da20, - // Block 0xd0c, offset 0x34300 - 0x34300: 0x6cc3dc20, 0x34301: 0x6cc3de20, 0x34302: 0x6cc3e020, 0x34303: 0x6cc3e220, - 0x34304: 0x6cc3e420, 0x34305: 0x6cc3e620, 0x34306: 0x6cc3e820, 0x34307: 0x6cc3ea20, - 0x34308: 0x6cc3ec20, 0x34309: 0x6cc3ee20, 0x3430a: 0x6cc3f020, 0x3430b: 0x6cc3f220, - 0x3430c: 0x6cc3f420, 0x3430d: 0x6cc3f620, 0x3430e: 0x6cc3f820, 0x3430f: 0x6cc3fa20, - 0x34310: 0x6cc3fc20, 0x34311: 0x6cc3fe20, 0x34312: 0x6cc40020, 0x34313: 0x6cc40220, - 0x34314: 0x6cc40420, 0x34315: 0x6cc40620, 0x34316: 0x6cc40820, 0x34317: 0x6cc40a20, - 0x34318: 0x6cc40c20, 0x34319: 0x6cc40e20, 0x3431a: 0x6cc41020, 0x3431b: 0x6cc41220, - 0x3431c: 0x6cc41420, 0x3431d: 0x6cc41620, 0x3431e: 0x6cc41820, 0x3431f: 0x6cc41a20, - 0x34320: 0x6cc41c20, 0x34321: 0x6cc41e20, 0x34322: 0x6cc42020, 0x34323: 0x6cc42220, - 0x34324: 0x6cc42420, 0x34325: 0x6cc42620, 0x34326: 0x6cc42820, 0x34327: 0x6cc42a20, - 0x34328: 0x6cc42c20, 0x34329: 0x6cc42e20, 0x3432a: 0x6cc43020, 0x3432b: 0x6cc43220, - 0x3432c: 0x6cc43420, 0x3432d: 0x6cc43620, 0x3432e: 0x6cc43820, 0x3432f: 0x6cc43a20, - 0x34330: 0x6cc43c20, 0x34331: 0x6cc43e20, 0x34332: 0x6cc44020, 0x34333: 0x6cc44220, - 0x34334: 0x6cc44420, 0x34335: 0x6cc44620, 0x34336: 0x6cc44820, 0x34337: 0x6cc44a20, - 0x34338: 0x6cc44c20, 0x34339: 0x6cc44e20, 0x3433a: 0x6cc45020, 0x3433b: 0x6cc45220, - 0x3433c: 0x6cc45420, 0x3433d: 0x6cc45620, 0x3433e: 0x6cc45820, 0x3433f: 0x6cc45a20, - // Block 0xd0d, offset 0x34340 - 0x34340: 0x6cc45c20, 0x34341: 0x6cc45e20, 0x34342: 0x6cc46020, 0x34343: 0x6cc46220, - 0x34344: 0x6cc46420, 0x34345: 0x6cc46620, 0x34346: 0x6cc46820, 0x34347: 0x6cc46a20, - 0x34348: 0x6cc46c20, 0x34349: 0x6cc46e20, 0x3434a: 0x6cc47020, 0x3434b: 0x6cc47220, - 0x3434c: 0x6cc47420, 0x3434d: 0x6cf2b620, 0x3434e: 0x6cf2b820, 0x3434f: 0x6cf2ba20, - 0x34350: 0x6cf2bc20, 0x34351: 0x6cf2be20, 0x34352: 0x6cf2c020, 0x34353: 0x6cf2c220, - 0x34354: 0x6cf2c420, 0x34355: 0x6cf2c620, 0x34356: 0x6cf2c820, 0x34357: 0x6cf2ca20, - 0x34358: 0x6cf2cc20, 0x34359: 0x6cf2ce20, 0x3435a: 0x6cf2d020, 0x3435b: 0x6cf2d220, - 0x3435c: 0x6cf2d420, 0x3435d: 0x6cf2d620, 0x3435e: 0x6cf2d820, 0x3435f: 0x6cf2da20, - 0x34360: 0x6cf2dc20, 0x34361: 0x6cf2de20, 0x34362: 0x6cf2e020, 0x34363: 0x6cf2e220, - 0x34364: 0x6cf2e420, 0x34365: 0x6cf2e620, 0x34366: 0x6cf2e820, 0x34367: 0x6cf2ea20, - 0x34368: 0x6cf2ec20, 0x34369: 0x6cf2ee20, 0x3436a: 0x6cf2f020, 0x3436b: 0x6cf2f220, - 0x3436c: 0x6cf2f420, 0x3436d: 0x6cf2f620, 0x3436e: 0x6cf2f820, 0x3436f: 0x6cf2fa20, - 0x34370: 0x6cf2fc20, 0x34371: 0x6cf2fe20, 0x34372: 0x6cf30020, 0x34373: 0x6cf30220, - 0x34374: 0x6cf30420, 0x34375: 0x6cf30620, 0x34376: 0x6cf30820, 0x34377: 0x6cf30a20, - 0x34378: 0x6cf30c20, 0x34379: 0x6cf30e20, 0x3437a: 0x6cf31020, 0x3437b: 0x6cf31220, - 0x3437c: 0x6cf31420, 0x3437d: 0x6cf31620, 0x3437e: 0x6cf31820, 0x3437f: 0x6cf31a20, - // Block 0xd0e, offset 0x34380 - 0x34380: 0x6cf31c20, 0x34381: 0x6cf31e20, 0x34382: 0x6cf32020, 0x34383: 0x6cf32220, - 0x34384: 0x6cf32420, 0x34385: 0x6cf32620, 0x34386: 0x6cf32820, 0x34387: 0x6cf32a20, - 0x34388: 0x6cf32c20, 0x34389: 0x6cf32e20, 0x3438a: 0x6cf33020, 0x3438b: 0x6cf33220, - 0x3438c: 0x6cf33420, 0x3438d: 0x6cf33620, 0x3438e: 0x6cf33820, 0x3438f: 0x6cf33a20, - 0x34390: 0x6cf33c20, 0x34391: 0x6cf33e20, 0x34392: 0x6cf34020, 0x34393: 0x6cf34220, - 0x34394: 0x6cf34420, 0x34395: 0x6cf34620, 0x34396: 0x6cf34820, 0x34397: 0x6cf34a20, - 0x34398: 0x6cf34c20, 0x34399: 0x6cf34e20, 0x3439a: 0x6cf35020, 0x3439b: 0x6cf35220, - 0x3439c: 0x6cf35420, 0x3439d: 0x6cf35620, 0x3439e: 0x6cf35820, 0x3439f: 0x6cf35a20, - 0x343a0: 0x6d227c20, 0x343a1: 0x6d227e20, 0x343a2: 0x6d228020, 0x343a3: 0x6d228220, - 0x343a4: 0x6d228420, 0x343a5: 0x6d228620, 0x343a6: 0x6d228820, 0x343a7: 0x6d228a20, - 0x343a8: 0x6d228c20, 0x343a9: 0x6d228e20, 0x343aa: 0x6d229020, 0x343ab: 0x6d229220, - 0x343ac: 0x6d229420, 0x343ad: 0x6d229620, 0x343ae: 0x6d229820, 0x343af: 0x6d229a20, - 0x343b0: 0x6d229c20, 0x343b1: 0x6d229e20, 0x343b2: 0x6d22a020, 0x343b3: 0x6d22a220, - 0x343b4: 0x6d22a420, 0x343b5: 0x6d22a620, 0x343b6: 0x6d22a820, 0x343b7: 0x6d22aa20, - 0x343b8: 0x6d22ac20, 0x343b9: 0x6d22ae20, 0x343ba: 0x6d22b020, 0x343bb: 0x6d22b220, - 0x343bc: 0x6d22b420, 0x343bd: 0x6d22b620, 0x343be: 0x6d22b820, 0x343bf: 0x6d22ba20, - // Block 0xd0f, offset 0x343c0 - 0x343c0: 0x6d22bc20, 0x343c1: 0x6d22be20, 0x343c2: 0x6d22c020, 0x343c3: 0x6d22c220, - 0x343c4: 0x6d22c420, 0x343c5: 0x6d22c620, 0x343c6: 0x6d22c820, 0x343c7: 0x6d22ca20, - 0x343c8: 0x6d22cc20, 0x343c9: 0x6d22ce20, 0x343ca: 0x6d22d020, 0x343cb: 0x6d22d220, - 0x343cc: 0x6d22d420, 0x343cd: 0x6d22d620, 0x343ce: 0x6d22d820, 0x343cf: 0x6d22da20, - 0x343d0: 0x6d22dc20, 0x343d1: 0x6d22de20, 0x343d2: 0x6d22e020, 0x343d3: 0x6d22e220, - 0x343d4: 0x6d22e420, 0x343d5: 0x6d22e620, 0x343d6: 0x6d22e820, 0x343d7: 0x6d22ea20, - 0x343d8: 0x6d22ec20, 0x343d9: 0x6d22ee20, 0x343da: 0x6d22f020, 0x343db: 0x6d22f220, - 0x343dc: 0x6d22f420, 0x343dd: 0x6d22f620, 0x343de: 0x6d22f820, 0x343df: 0x6d22fa20, - 0x343e0: 0x6d22fc20, 0x343e1: 0x6d22fe20, 0x343e2: 0x6d230020, 0x343e3: 0x6d230220, - 0x343e4: 0x6d230420, 0x343e5: 0x6d230620, 0x343e6: 0x6d230820, 0x343e7: 0x6d230a20, - 0x343e8: 0x6d230c20, 0x343e9: 0x6d230e20, 0x343ea: 0x6d231020, 0x343eb: 0x6d231220, - 0x343ec: 0x6d231420, 0x343ed: 0x6d231620, 0x343ee: 0x6d231820, 0x343ef: 0x6d231a20, - 0x343f0: 0x6d231c20, 0x343f1: 0x6d4ff020, 0x343f2: 0x6d4ff220, 0x343f3: 0x6d4ff420, - 0x343f4: 0x6d4ff620, 0x343f5: 0x6d4ff820, 0x343f6: 0x6d4ffa20, 0x343f7: 0x6d4ffc20, - 0x343f8: 0x6d4ffe20, 0x343f9: 0x6d500020, 0x343fa: 0x6d500220, 0x343fb: 0x6d500420, - 0x343fc: 0x6d500620, 0x343fd: 0x6d500820, 0x343fe: 0x6d500a20, 0x343ff: 0x6d500c20, - // Block 0xd10, offset 0x34400 - 0x34400: 0x6d500e20, 0x34401: 0x6d501020, 0x34402: 0x6d501220, 0x34403: 0x6d501420, - 0x34404: 0x6d501620, 0x34405: 0x6d501820, 0x34406: 0x6d501a20, 0x34407: 0x6d501c20, - 0x34408: 0x6d501e20, 0x34409: 0x6d502020, 0x3440a: 0x6d502220, 0x3440b: 0x6d502420, - 0x3440c: 0x6d502620, 0x3440d: 0x6d502820, 0x3440e: 0x6d502a20, 0x3440f: 0x6d502c20, - 0x34410: 0x6d502e20, 0x34411: 0x6d503020, 0x34412: 0x6d503220, 0x34413: 0x6d503420, - 0x34414: 0x6d503620, 0x34415: 0x6d503820, 0x34416: 0x6d503a20, 0x34417: 0x6d503c20, - 0x34418: 0x6d503e20, 0x34419: 0x6d504020, 0x3441a: 0x6d504220, 0x3441b: 0x6d504420, - 0x3441c: 0x6d504620, 0x3441d: 0x6d504820, 0x3441e: 0x6d504a20, 0x3441f: 0x6d504c20, - 0x34420: 0x6d504e20, 0x34421: 0x6d505020, 0x34422: 0x6d505220, 0x34423: 0x6d505420, - 0x34424: 0x6d505620, 0x34425: 0x6d505820, 0x34426: 0x6d505a20, 0x34427: 0x6d505c20, - 0x34428: 0x6d505e20, 0x34429: 0x6d506020, 0x3442a: 0x6d506220, 0x3442b: 0x6d506420, - 0x3442c: 0x6d506620, 0x3442d: 0x6d506820, 0x3442e: 0x6d506a20, 0x3442f: 0x6d506c20, - 0x34430: 0x6d506e20, 0x34431: 0x6d507020, 0x34432: 0x6d507220, 0x34433: 0x6d507420, - 0x34434: 0x6d507620, 0x34435: 0x6d507820, 0x34436: 0x6d507a20, 0x34437: 0x6d507c20, - 0x34438: 0x6d507e20, 0x34439: 0x6d508020, 0x3443a: 0x6d508220, 0x3443b: 0x6d508420, - 0x3443c: 0x6d508620, 0x3443d: 0x6d508820, 0x3443e: 0x6d508a20, 0x3443f: 0x6d508c20, - // Block 0xd11, offset 0x34440 - 0x34440: 0x6d508e20, 0x34441: 0x6d509020, 0x34442: 0x6d509220, 0x34443: 0x6d509420, - 0x34444: 0x6d509620, 0x34445: 0x6d509820, 0x34446: 0x6d509a20, 0x34447: 0x6d509c20, - 0x34448: 0x6d509e20, 0x34449: 0x6d50a020, 0x3444a: 0x6d50a220, 0x3444b: 0x6d50a420, - 0x3444c: 0x6d50a620, 0x3444d: 0x6d50a820, 0x3444e: 0x6d50aa20, 0x3444f: 0x6d50ac20, - 0x34450: 0x6d50ae20, 0x34451: 0x6d50b020, 0x34452: 0x6d7c0220, 0x34453: 0x6d7c0420, - 0x34454: 0x6d7c0620, 0x34455: 0x6d7c0820, 0x34456: 0x6d7c0a20, 0x34457: 0x6d7c0c20, - 0x34458: 0x6d7c0e20, 0x34459: 0x6d7c1020, 0x3445a: 0x6d7c1220, 0x3445b: 0x6d7c1420, - 0x3445c: 0x6d7c1620, 0x3445d: 0x6d7c1820, 0x3445e: 0x6d7c1a20, 0x3445f: 0x6d7c1c20, - 0x34460: 0x6d7c1e20, 0x34461: 0x6d7c2020, 0x34462: 0x6d7c2220, 0x34463: 0x6d7c2420, - 0x34464: 0x6d7c2620, 0x34465: 0x6d7c2820, 0x34466: 0x6d7c2a20, 0x34467: 0x6d7c2c20, - 0x34468: 0x6d7c2e20, 0x34469: 0x6d7c3020, 0x3446a: 0x6d7c3220, 0x3446b: 0x6d7c3420, - 0x3446c: 0x6d7c3620, 0x3446d: 0x6d7c3820, 0x3446e: 0x6d7c3a20, 0x3446f: 0x6d7c3c20, - 0x34470: 0x6d7c3e20, 0x34471: 0x6d7c4020, 0x34472: 0x6d7c4220, 0x34473: 0x6d7c4420, - 0x34474: 0x6d7c4620, 0x34475: 0x6d7c4820, 0x34476: 0x6d7c4a20, 0x34477: 0x6d7c4c20, - 0x34478: 0x6d7c4e20, 0x34479: 0x6d7c5020, 0x3447a: 0x6d7c5220, 0x3447b: 0x6d7c5420, - 0x3447c: 0x6d7c5620, 0x3447d: 0x6d7c5820, 0x3447e: 0x6d7c5a20, 0x3447f: 0x6d7c5c20, - // Block 0xd12, offset 0x34480 - 0x34480: 0x6d7c5e20, 0x34481: 0x6d7c6020, 0x34482: 0x6d7c6220, 0x34483: 0x6d7c6420, - 0x34484: 0x6d7c6620, 0x34485: 0x6d7c6820, 0x34486: 0x6d7c6a20, 0x34487: 0x6d7c6c20, - 0x34488: 0x6d7c6e20, 0x34489: 0x6d7c7020, 0x3448a: 0x6d7c7220, 0x3448b: 0x6d7c7420, - 0x3448c: 0x6d7c7620, 0x3448d: 0x6d7c7820, 0x3448e: 0x6da40820, 0x3448f: 0x6da40a20, - 0x34490: 0x6da40c20, 0x34491: 0x6da40e20, 0x34492: 0x6da41020, 0x34493: 0x6da41220, - 0x34494: 0x6da41420, 0x34495: 0x6da41620, 0x34496: 0x6da41820, 0x34497: 0x6da41a20, - 0x34498: 0x6da41c20, 0x34499: 0x6da41e20, 0x3449a: 0x6da42020, 0x3449b: 0x6da42220, - 0x3449c: 0x6da42420, 0x3449d: 0x6da42620, 0x3449e: 0x6da42820, 0x3449f: 0x6da42a20, - 0x344a0: 0x6da42c20, 0x344a1: 0x6da42e20, 0x344a2: 0x6da43020, 0x344a3: 0x6da43220, - 0x344a4: 0x6da43420, 0x344a5: 0x6da43620, 0x344a6: 0x6da43820, 0x344a7: 0x6da43a20, - 0x344a8: 0x6da43c20, 0x344a9: 0x6da43e20, 0x344aa: 0x6da44020, 0x344ab: 0x6da44220, - 0x344ac: 0x6da44420, 0x344ad: 0x6da44620, 0x344ae: 0x6da44820, 0x344af: 0x6da44a20, - 0x344b0: 0x6da44c20, 0x344b1: 0x6da44e20, 0x344b2: 0x6da45020, 0x344b3: 0x6da45220, - 0x344b4: 0x6da45420, 0x344b5: 0x6da45620, 0x344b6: 0x6da45820, 0x344b7: 0x6da45a20, - 0x344b8: 0x6da45c20, 0x344b9: 0x6da45e20, 0x344ba: 0x6da46020, 0x344bb: 0x6dc59e20, - 0x344bc: 0x6dc5a020, 0x344bd: 0x6dc5a220, 0x344be: 0x6dc5a420, 0x344bf: 0x6dc5a620, - // Block 0xd13, offset 0x344c0 - 0x344c0: 0x6dc5a820, 0x344c1: 0x6dc5aa20, 0x344c2: 0x6dc5ac20, 0x344c3: 0x6dc5ae20, - 0x344c4: 0x6dc5b020, 0x344c5: 0x6dc5b220, 0x344c6: 0x6dc5b420, 0x344c7: 0x6dc5b620, - 0x344c8: 0x6dc5b820, 0x344c9: 0x6dc5ba20, 0x344ca: 0x6dc5bc20, 0x344cb: 0x6dc5be20, - 0x344cc: 0x6dc5c020, 0x344cd: 0x6dc5c220, 0x344ce: 0x6dc5c420, 0x344cf: 0x6dc5c620, - 0x344d0: 0x6dc5c820, 0x344d1: 0x6dc5ca20, 0x344d2: 0x6dc5cc20, 0x344d3: 0x6dc5ce20, - 0x344d4: 0x6dc5d020, 0x344d5: 0x6dc5d220, 0x344d6: 0x6dc5d420, 0x344d7: 0x6dc5d620, - 0x344d8: 0x6dc5d820, 0x344d9: 0x6dc5da20, 0x344da: 0x6dc5dc20, 0x344db: 0x6dc5de20, - 0x344dc: 0x6dc5e020, 0x344dd: 0x6dc5e220, 0x344de: 0x6dc5e420, 0x344df: 0x6dc5e620, - 0x344e0: 0x6dc5e820, 0x344e1: 0x6dc5ea20, 0x344e2: 0x6dc5ec20, 0x344e3: 0x6dc5ee20, - 0x344e4: 0x6dc5f020, 0x344e5: 0x6dc5f220, 0x344e6: 0x6de29020, 0x344e7: 0x6de29220, - 0x344e8: 0x6de29420, 0x344e9: 0x6de29620, 0x344ea: 0x6de29820, 0x344eb: 0x6de29a20, - 0x344ec: 0x6de29c20, 0x344ed: 0x6de29e20, 0x344ee: 0x6de2a020, 0x344ef: 0x6de2a220, - 0x344f0: 0x6de2a420, 0x344f1: 0x6de2a620, 0x344f2: 0x6de2a820, 0x344f3: 0x6de2aa20, - 0x344f4: 0x6de2ac20, 0x344f5: 0x6de2ae20, 0x344f6: 0x6de2b020, 0x344f7: 0x6de2b220, - 0x344f8: 0x6de2b420, 0x344f9: 0x6de2b620, 0x344fa: 0x6de2b820, 0x344fb: 0x6de2ba20, - 0x344fc: 0x6de2bc20, 0x344fd: 0x6de2be20, 0x344fe: 0x6de2c020, 0x344ff: 0x6de2c220, - // Block 0xd14, offset 0x34500 - 0x34500: 0x6de2c420, 0x34501: 0x6de2c620, 0x34502: 0x6de2c820, 0x34503: 0x6de2ca20, - 0x34504: 0x6de2cc20, 0x34505: 0x6de2ce20, 0x34506: 0x6de2d020, 0x34507: 0x6de2d220, - 0x34508: 0x6de2d420, 0x34509: 0x6de2d620, 0x3450a: 0x6de2d820, 0x3450b: 0x6dfa3a20, - 0x3450c: 0x6dfa3c20, 0x3450d: 0x6dfa3e20, 0x3450e: 0x6dfa4020, 0x3450f: 0x6dfa4220, - 0x34510: 0x6dfa4420, 0x34511: 0x6dfa4620, 0x34512: 0x6dfa4820, 0x34513: 0x6dfa4a20, - 0x34514: 0x6dfa4c20, 0x34515: 0x6dfa4e20, 0x34516: 0x6dfa5020, 0x34517: 0x6e0dc620, - 0x34518: 0x6e0dc820, 0x34519: 0x6e0dca20, 0x3451a: 0x6e0dcc20, 0x3451b: 0x6e0dce20, - 0x3451c: 0x6e0dd020, 0x3451d: 0x6e0dd220, 0x3451e: 0x6e0dd420, 0x3451f: 0x6e0dd620, - 0x34520: 0x6e0dd820, 0x34521: 0x6e0dda20, 0x34522: 0x6e0ddc20, 0x34523: 0x6e0dde20, - 0x34524: 0x6e0de020, 0x34525: 0x6e1d3a20, 0x34526: 0x6e1d3c20, 0x34527: 0x6e1d3e20, - 0x34528: 0x6e1d4020, 0x34529: 0x6e1d4220, 0x3452a: 0x6e1d4420, 0x3452b: 0x6e1d4620, - 0x3452c: 0x6e1d4820, 0x3452d: 0x6e1d4a20, 0x3452e: 0x6e1d4c20, 0x3452f: 0x6e28d820, - 0x34530: 0x6e28da20, 0x34531: 0x6e28dc20, 0x34532: 0x6e28de20, 0x34533: 0x6e28e020, - 0x34534: 0x6e28e220, 0x34535: 0x6e28e420, 0x34536: 0x6e28e620, 0x34537: 0x6e28e820, - 0x34538: 0x6e28ea20, 0x34539: 0x6e28ec20, 0x3453a: 0x6e28ee20, 0x3453b: 0x6e321620, - 0x3453c: 0x6e321820, 0x3453d: 0x6e321a20, 0x3453e: 0x6e321c20, 0x3453f: 0x6e321e20, - // Block 0xd15, offset 0x34540 - 0x34540: 0x6e322020, 0x34541: 0x6e322220, 0x34542: 0x6e322420, 0x34543: 0x6e3d2820, - 0x34544: 0x6e3d2a20, 0x34545: 0x6e403e20, 0x34546: 0x6e404020, 0x34547: 0x6e404220, - 0x34548: 0x6e429a20, 0x34549: 0x6e429c20, 0x3454a: 0x6e451c20, 0x3454b: 0x6e45c020, - 0x3454c: 0x6c092620, 0x3454d: 0x6c092820, 0x3454e: 0x6c11c420, 0x3454f: 0x6c11c620, - 0x34550: 0x6c11c820, 0x34551: 0x6c11ca20, 0x34552: 0x6c200620, 0x34553: 0x6c200820, - 0x34554: 0x6c200a20, 0x34555: 0x6c200c20, 0x34556: 0x6c200e20, 0x34557: 0x6c201020, - 0x34558: 0x6c201220, 0x34559: 0x6c201420, 0x3455a: 0x6c33ea20, 0x3455b: 0x6c33ec20, - 0x3455c: 0x6c33ee20, 0x3455d: 0x6c33f020, 0x3455e: 0x6c33f220, 0x3455f: 0x6c33f420, - 0x34560: 0x6c33f620, 0x34561: 0x6c33f820, 0x34562: 0x6c33fa20, 0x34563: 0x6c33fc20, - 0x34564: 0x6c33fe20, 0x34565: 0x6c340020, 0x34566: 0x6c4ea220, 0x34567: 0x6c4ea420, - 0x34568: 0x6c4ea620, 0x34569: 0x6c4ea820, 0x3456a: 0x6c4eaa20, 0x3456b: 0x6c4eac20, - 0x3456c: 0x6c4eae20, 0x3456d: 0x6c4eb020, 0x3456e: 0x6c4eb220, 0x3456f: 0x6c4eb420, - 0x34570: 0x6c4eb620, 0x34571: 0x6c4eb820, 0x34572: 0x6c4eba20, 0x34573: 0x6c4ebc20, - 0x34574: 0x6c4ebe20, 0x34575: 0x6c4ec020, 0x34576: 0x6c4ec220, 0x34577: 0x6c709e20, - 0x34578: 0x6c70a020, 0x34579: 0x6c70a220, 0x3457a: 0x6c70a420, 0x3457b: 0x6c70a620, - 0x3457c: 0x6c70a820, 0x3457d: 0x6c70aa20, 0x3457e: 0x6c70ac20, 0x3457f: 0x6c98c020, - // Block 0xd16, offset 0x34580 - 0x34580: 0x6c98c220, 0x34581: 0x6c98c420, 0x34582: 0x6c98c620, 0x34583: 0x6c98c820, - 0x34584: 0x6c98ca20, 0x34585: 0x6c98cc20, 0x34586: 0x6c98ce20, 0x34587: 0x6c98d020, - 0x34588: 0x6cc49420, 0x34589: 0x6cc49620, 0x3458a: 0x6cc49820, 0x3458b: 0x6cc49a20, - 0x3458c: 0x6cc49c20, 0x3458d: 0x6cc49e20, 0x3458e: 0x6cc4a020, 0x3458f: 0x6cc4a220, - 0x34590: 0x6cc4a420, 0x34591: 0x6cc4a620, 0x34592: 0x6cc4a820, 0x34593: 0x6cc4aa20, - 0x34594: 0x6cf38420, 0x34595: 0x6cf38620, 0x34596: 0x6cf38820, 0x34597: 0x6cf38a20, - 0x34598: 0x6cf38c20, 0x34599: 0x6cf38e20, 0x3459a: 0x6cf39020, 0x3459b: 0x6cf39220, - 0x3459c: 0x6cf39420, 0x3459d: 0x6cf39620, 0x3459e: 0x6cf39820, 0x3459f: 0x6cf39a20, - 0x345a0: 0x6cf39c20, 0x345a1: 0x6cf39e20, 0x345a2: 0x6d234220, 0x345a3: 0x6d234420, - 0x345a4: 0x6d234620, 0x345a5: 0x6d234820, 0x345a6: 0x6d234a20, 0x345a7: 0x6d234c20, - 0x345a8: 0x6d50c820, 0x345a9: 0x6d234e20, 0x345aa: 0x6d235020, 0x345ab: 0x6d235220, - 0x345ac: 0x6d235420, 0x345ad: 0x6d235620, 0x345ae: 0x6d235820, 0x345af: 0x6d235a20, - 0x345b0: 0x6d235c20, 0x345b1: 0x6d235e20, 0x345b2: 0x6d50ca20, 0x345b3: 0x6d50cc20, - 0x345b4: 0x6d50ce20, 0x345b5: 0x6d50d020, 0x345b6: 0x6d50d220, 0x345b7: 0x6d50d420, - 0x345b8: 0x6d50d620, 0x345b9: 0x6d50d820, 0x345ba: 0x6d50da20, 0x345bb: 0x6d50dc20, - 0x345bc: 0x6d50de20, 0x345bd: 0x6d50e020, 0x345be: 0x6d50e220, 0x345bf: 0x6d50e420, - // Block 0xd17, offset 0x345c0 - 0x345c0: 0x6d50e620, 0x345c1: 0x6d50e820, 0x345c2: 0x6d50ea20, 0x345c3: 0x6d50ec20, - 0x345c4: 0x6d50ee20, 0x345c5: 0x6d50f020, 0x345c6: 0x6d50f220, 0x345c7: 0x6d7c9420, - 0x345c8: 0x6d7c9620, 0x345c9: 0x6d7c9820, 0x345ca: 0x6d7c9a20, 0x345cb: 0x6d7c9c20, - 0x345cc: 0x6d7c9e20, 0x345cd: 0x6d7ca020, 0x345ce: 0x6d7ca220, 0x345cf: 0x6d7ca420, - 0x345d0: 0x6d784620, 0x345d1: 0x6d7ca620, 0x345d2: 0x6d7ca820, 0x345d3: 0x6da46e20, - 0x345d4: 0x6da47020, 0x345d5: 0x6da47220, 0x345d6: 0x6da47420, 0x345d7: 0x6da47620, - 0x345d8: 0x6dc60220, 0x345d9: 0x6dc60420, 0x345da: 0x6de2e020, 0x345db: 0x6de2e220, - 0x345dc: 0x6de2e420, 0x345dd: 0x6de2e620, 0x345de: 0x6dfa5620, 0x345df: 0x6dfa5820, - 0x345e0: 0x6dfa5a20, 0x345e1: 0x6e0de620, 0x345e2: 0x6e0de820, 0x345e3: 0x6e0dea20, - 0x345e4: 0x6c092e20, 0x345e5: 0x6c093020, 0x345e6: 0x6c11ce20, 0x345e7: 0x6c11d020, - 0x345e8: 0x6c11d220, 0x345e9: 0x6c11d420, 0x345ea: 0x6c201e20, 0x345eb: 0x6c202020, - 0x345ec: 0x6c202220, 0x345ed: 0x6c202420, 0x345ee: 0x6c202620, 0x345ef: 0x6c340e20, - 0x345f0: 0x6c341020, 0x345f1: 0x6c341220, 0x345f2: 0x6c341420, 0x345f3: 0x6c341620, - 0x345f4: 0x6c341820, 0x345f5: 0x6c341a20, 0x345f6: 0x6c4ed220, 0x345f7: 0x6c4ed420, - 0x345f8: 0x6c4ed620, 0x345f9: 0x6c4ed820, 0x345fa: 0x6c4eda20, 0x345fb: 0x6c4edc20, - 0x345fc: 0x6c4ede20, 0x345fd: 0x6c4ee020, 0x345fe: 0x6c4ee220, 0x345ff: 0x6c4ee420, - // Block 0xd18, offset 0x34600 - 0x34600: 0x6c4ee620, 0x34601: 0x6c4ee820, 0x34602: 0x6c4eea20, 0x34603: 0x6c4eec20, - 0x34604: 0x6c4eee20, 0x34605: 0x6c70ba20, 0x34606: 0x6c70bc20, 0x34607: 0x6c70be20, - 0x34608: 0x6c70c020, 0x34609: 0x6c70c220, 0x3460a: 0x6c70c420, 0x3460b: 0x6c70c620, - 0x3460c: 0x6c70c820, 0x3460d: 0x6c98d820, 0x3460e: 0x6c98da20, 0x3460f: 0x6c98dc20, - 0x34610: 0x6c98de20, 0x34611: 0x6cc4b220, 0x34612: 0x6cc4b420, 0x34613: 0x6cc4b620, - 0x34614: 0x6cc4b820, 0x34615: 0x6cc4ba20, 0x34616: 0x6cf3a220, 0x34617: 0x6cf3a420, - 0x34618: 0x6d236220, 0x34619: 0x6d236420, 0x3461a: 0x6d236620, 0x3461b: 0x6d236820, - 0x3461c: 0x6d50f420, 0x3461d: 0x6d50f620, 0x3461e: 0x6d50f820, 0x3461f: 0x6d7cb020, - 0x34620: 0x6da47820, 0x34621: 0x6dc60620, 0x34622: 0x6e0dec20, 0x34623: 0x6e28f220, - 0x34624: 0x6e28f420, 0x34625: 0x6c047820, 0x34626: 0x6c047a20, 0x34627: 0x6c047c20, - 0x34628: 0x6c094620, 0x34629: 0x6c094820, 0x3462a: 0x6c094a20, 0x3462b: 0x6c094c20, - 0x3462c: 0x6c094e20, 0x3462d: 0x6c120620, 0x3462e: 0x6c120820, 0x3462f: 0x6c120a20, - 0x34630: 0x6c120c20, 0x34631: 0x6c120e20, 0x34632: 0x6c121020, 0x34633: 0x6c121220, - 0x34634: 0x6c121420, 0x34635: 0x6c121620, 0x34636: 0x6c121820, 0x34637: 0x6c121a20, - 0x34638: 0x6c121c20, 0x34639: 0x6c121e20, 0x3463a: 0x6c122020, 0x3463b: 0x6c122220, - 0x3463c: 0x6c122420, 0x3463d: 0x6c122620, 0x3463e: 0x6c122820, 0x3463f: 0x6c122a20, - // Block 0xd19, offset 0x34640 - 0x34640: 0x6c122c20, 0x34641: 0x6c122e20, 0x34642: 0x6c123020, 0x34643: 0x6c20a820, - 0x34644: 0x6c20aa20, 0x34645: 0x6c20ac20, 0x34646: 0x6c20ae20, 0x34647: 0x6c20b020, - 0x34648: 0x6c20b220, 0x34649: 0x6c20b420, 0x3464a: 0x6c20b620, 0x3464b: 0x6c20b820, - 0x3464c: 0x6c20ba20, 0x3464d: 0x6c20bc20, 0x3464e: 0x6c20be20, 0x3464f: 0x6c20c020, - 0x34650: 0x6c20c220, 0x34651: 0x6c20c420, 0x34652: 0x6c20c620, 0x34653: 0x6c20c820, - 0x34654: 0x6c20ca20, 0x34655: 0x6c20cc20, 0x34656: 0x6c20ce20, 0x34657: 0x6c20d020, - 0x34658: 0x6c20d220, 0x34659: 0x6c20d420, 0x3465a: 0x6c20d620, 0x3465b: 0x6c20d820, - 0x3465c: 0x6c20da20, 0x3465d: 0x6c20dc20, 0x3465e: 0x6c20de20, 0x3465f: 0x6c20e020, - 0x34660: 0x6c20e220, 0x34661: 0x6c20e420, 0x34662: 0x6c20e620, 0x34663: 0x6c20e820, - 0x34664: 0x6c20ea20, 0x34665: 0x6c20ec20, 0x34666: 0x6c20ee20, 0x34667: 0x6c20f020, - 0x34668: 0x6c20f220, 0x34669: 0x6c20f420, 0x3466a: 0x6c20f620, 0x3466b: 0x6c20f820, - 0x3466c: 0x6c20fa20, 0x3466d: 0x6c20fc20, 0x3466e: 0x6c20fe20, 0x3466f: 0x6c210020, - 0x34670: 0x6c210220, 0x34671: 0x6c210420, 0x34672: 0x6c210620, 0x34673: 0x6c210820, - 0x34674: 0x6c34be20, 0x34675: 0x6c34c020, 0x34676: 0x6c34c220, 0x34677: 0x6c34c420, - 0x34678: 0x6c34c620, 0x34679: 0x6c34c820, 0x3467a: 0x6c34ca20, 0x3467b: 0x6c34cc20, - 0x3467c: 0x6c34ce20, 0x3467d: 0x6c34d020, 0x3467e: 0x6c34d220, 0x3467f: 0x6c34d420, - // Block 0xd1a, offset 0x34680 - 0x34680: 0x6c34d620, 0x34681: 0x6c34d820, 0x34682: 0x6c34da20, 0x34683: 0x6c34dc20, - 0x34684: 0x6c34de20, 0x34685: 0x6c34e020, 0x34686: 0x6c34e220, 0x34687: 0x6c34e420, - 0x34688: 0x6c34e620, 0x34689: 0x6c34e820, 0x3468a: 0x6c34ea20, 0x3468b: 0x6c34ec20, - 0x3468c: 0x6c34ee20, 0x3468d: 0x6c34f020, 0x3468e: 0x6c34f220, 0x3468f: 0x6c34f420, - 0x34690: 0x6c34f620, 0x34691: 0x6c34f820, 0x34692: 0x6c34fa20, 0x34693: 0x6c34fc20, - 0x34694: 0x6c34fe20, 0x34695: 0x6c350020, 0x34696: 0x6c350220, 0x34697: 0x6c350420, - 0x34698: 0x6c350620, 0x34699: 0x6c350820, 0x3469a: 0x6c350a20, 0x3469b: 0x6c350c20, - 0x3469c: 0x6c350e20, 0x3469d: 0x6c351020, 0x3469e: 0x6c351220, 0x3469f: 0x6c351420, - 0x346a0: 0x6c351620, 0x346a1: 0x6c351820, 0x346a2: 0x6c351a20, 0x346a3: 0x6c351c20, - 0x346a4: 0x6c4f8020, 0x346a5: 0x6c4f8220, 0x346a6: 0x6c4f8420, 0x346a7: 0x6c4f8620, - 0x346a8: 0x6c4f8820, 0x346a9: 0x6c4f8a20, 0x346aa: 0x6c4f8c20, 0x346ab: 0x6c4f8e20, - 0x346ac: 0x6c4f9020, 0x346ad: 0x6c4f9220, 0x346ae: 0x6c4f9420, 0x346af: 0x6c4f9620, - 0x346b0: 0x6c4f9820, 0x346b1: 0x6c4f9a20, 0x346b2: 0x6c4f9c20, 0x346b3: 0x6c4f9e20, - 0x346b4: 0x6c4fa020, 0x346b5: 0x6c4fa220, 0x346b6: 0x6c4fa420, 0x346b7: 0x6c4fa620, - 0x346b8: 0x6c4fa820, 0x346b9: 0x6c4faa20, 0x346ba: 0x6c4fac20, 0x346bb: 0x6c4fae20, - 0x346bc: 0x6c4fb020, 0x346bd: 0x6c4fb220, 0x346be: 0x6c4fb420, 0x346bf: 0x6c4fb620, - // Block 0xd1b, offset 0x346c0 - 0x346c0: 0x6c4fb820, 0x346c1: 0x6c4fba20, 0x346c2: 0x6c4fbc20, 0x346c3: 0x6c4fbe20, - 0x346c4: 0x6c4fc020, 0x346c5: 0x6c4fc220, 0x346c6: 0x6c4fc420, 0x346c7: 0x6c4fc620, - 0x346c8: 0x6c4fc820, 0x346c9: 0x6c4fca20, 0x346ca: 0x6c4fcc20, 0x346cb: 0x6c4fce20, - 0x346cc: 0x6c4fd020, 0x346cd: 0x6c4fd220, 0x346ce: 0x6c4fd420, 0x346cf: 0x6c4fd620, - 0x346d0: 0x6c4fd820, 0x346d1: 0x6c4fda20, 0x346d2: 0x6c4fdc20, 0x346d3: 0x6c4fde20, - 0x346d4: 0x6c4fe020, 0x346d5: 0x6c4fe220, 0x346d6: 0x6c4fe420, 0x346d7: 0x6c4fe620, - 0x346d8: 0x6c4fe820, 0x346d9: 0x6c4fea20, 0x346da: 0x6c4fec20, 0x346db: 0x6c4fee20, - 0x346dc: 0x6c4ff020, 0x346dd: 0x6c4ff220, 0x346de: 0x6c4ff420, 0x346df: 0x6c4ff620, - 0x346e0: 0x6c4ff820, 0x346e1: 0x6c4ffa20, 0x346e2: 0x6c4ffc20, 0x346e3: 0x6c4ffe20, - 0x346e4: 0x6c500020, 0x346e5: 0x6c500220, 0x346e6: 0x6c500420, 0x346e7: 0x6c500620, - 0x346e8: 0x6c500820, 0x346e9: 0x6c500a20, 0x346ea: 0x6c500c20, 0x346eb: 0x6c500e20, - 0x346ec: 0x6c501020, 0x346ed: 0x6c501220, 0x346ee: 0x6c501420, 0x346ef: 0x6c716220, - 0x346f0: 0x6c716420, 0x346f1: 0x6c716620, 0x346f2: 0x6c716820, 0x346f3: 0x6c716a20, - 0x346f4: 0x6c716c20, 0x346f5: 0x6c716e20, 0x346f6: 0x6c717020, 0x346f7: 0x6c717220, - 0x346f8: 0x6c717420, 0x346f9: 0x6c717620, 0x346fa: 0x6c717820, 0x346fb: 0x6c717a20, - 0x346fc: 0x6c717c20, 0x346fd: 0x6c717e20, 0x346fe: 0x6c718020, 0x346ff: 0x6c718220, - // Block 0xd1c, offset 0x34700 - 0x34700: 0x6c718420, 0x34701: 0x6c718620, 0x34702: 0x6c718820, 0x34703: 0x6c718a20, - 0x34704: 0x6c718c20, 0x34705: 0x6c718e20, 0x34706: 0x6c719020, 0x34707: 0x6c719220, - 0x34708: 0x6c719420, 0x34709: 0x6c719620, 0x3470a: 0x6c719820, 0x3470b: 0x6c719a20, - 0x3470c: 0x6c719c20, 0x3470d: 0x6c719e20, 0x3470e: 0x6c71a020, 0x3470f: 0x6c71a220, - 0x34710: 0x6c71a420, 0x34711: 0x6c71a620, 0x34712: 0x6c71a820, 0x34713: 0x6c71aa20, - 0x34714: 0x6c71ac20, 0x34715: 0x6c71ae20, 0x34716: 0x6c71b020, 0x34717: 0x6c71b220, - 0x34718: 0x6c71b420, 0x34719: 0x6c71b620, 0x3471a: 0x6c71b820, 0x3471b: 0x6c71ba20, - 0x3471c: 0x6c71bc20, 0x3471d: 0x6c71be20, 0x3471e: 0x6c71c020, 0x3471f: 0x6c71c220, - 0x34720: 0x6c71c420, 0x34721: 0x6c71c620, 0x34722: 0x6c71c820, 0x34723: 0x6c71ca20, - 0x34724: 0x6c71cc20, 0x34725: 0x6c71ce20, 0x34726: 0x6c71d020, 0x34727: 0x6c71d220, - 0x34728: 0x6c71d420, 0x34729: 0x6c71d620, 0x3472a: 0x6c71d820, 0x3472b: 0x6c71da20, - 0x3472c: 0x6c71dc20, 0x3472d: 0x6c71de20, 0x3472e: 0x6c71e020, 0x3472f: 0x6c71e220, - 0x34730: 0x6c71e420, 0x34731: 0x6c71e620, 0x34732: 0x6c71e820, 0x34733: 0x6c71ea20, - 0x34734: 0x6c71ec20, 0x34735: 0x6c71ee20, 0x34736: 0x6c71f020, 0x34737: 0x6c71f220, - 0x34738: 0x6c71f420, 0x34739: 0x6c71f620, 0x3473a: 0x6c71f820, 0x3473b: 0x6c71fa20, - 0x3473c: 0x6c71fc20, 0x3473d: 0x6c71fe20, 0x3473e: 0x6c720020, 0x3473f: 0x6c720220, - // Block 0xd1d, offset 0x34740 - 0x34740: 0x6c720420, 0x34741: 0x6c99ac20, 0x34742: 0x6c99ae20, 0x34743: 0x6c99b020, - 0x34744: 0x6c99b220, 0x34745: 0x6c99b420, 0x34746: 0x6c99b620, 0x34747: 0x6c99b820, - 0x34748: 0x6c99ba20, 0x34749: 0x6c99bc20, 0x3474a: 0x6c99be20, 0x3474b: 0x6c99c020, - 0x3474c: 0x6c99c220, 0x3474d: 0x6c99c420, 0x3474e: 0x6c99c620, 0x3474f: 0x6c99c820, - 0x34750: 0x6c99ca20, 0x34751: 0x6c99cc20, 0x34752: 0x6c99ce20, 0x34753: 0x6c99d020, - 0x34754: 0x6c99d220, 0x34755: 0x6c99d420, 0x34756: 0x6c99d620, 0x34757: 0x6c99d820, - 0x34758: 0x6c99da20, 0x34759: 0x6c99dc20, 0x3475a: 0x6c99de20, 0x3475b: 0x6c99e020, - 0x3475c: 0x6c99e220, 0x3475d: 0x6c99e420, 0x3475e: 0x6c99e620, 0x3475f: 0x6c99e820, - 0x34760: 0x6c99ea20, 0x34761: 0x6c99ec20, 0x34762: 0x6c99ee20, 0x34763: 0x6c99f020, - 0x34764: 0x6c99f220, 0x34765: 0x6c99f420, 0x34766: 0x6c99f620, 0x34767: 0x6c99f820, - 0x34768: 0x6c99fa20, 0x34769: 0x6c99fc20, 0x3476a: 0x6c99fe20, 0x3476b: 0x6c9a0020, - 0x3476c: 0x6c9a0220, 0x3476d: 0x6c9a0420, 0x3476e: 0x6c9a0620, 0x3476f: 0x6c9a0820, - 0x34770: 0x6c9a0a20, 0x34771: 0x6c9a0c20, 0x34772: 0x6c9a0e20, 0x34773: 0x6c9a1020, - 0x34774: 0x6c9a1220, 0x34775: 0x6c9a1420, 0x34776: 0x6c9a1620, 0x34777: 0x6c9a1820, - 0x34778: 0x6c9a1a20, 0x34779: 0x6c9a1c20, 0x3477a: 0x6c9a1e20, 0x3477b: 0x6c9a2020, - 0x3477c: 0x6c9a2220, 0x3477d: 0x6c9a2420, 0x3477e: 0x6c9a2620, 0x3477f: 0x6c9a2820, - // Block 0xd1e, offset 0x34780 - 0x34780: 0x6c9a2a20, 0x34781: 0x6c9a2c20, 0x34782: 0x6c9a2e20, 0x34783: 0x6c9a3020, - 0x34784: 0x6c9a3220, 0x34785: 0x6c9a3420, 0x34786: 0x6c9a3620, 0x34787: 0x6c9a3820, - 0x34788: 0x6c9a3a20, 0x34789: 0x6c9a3c20, 0x3478a: 0x6c9a3e20, 0x3478b: 0x6c9a4020, - 0x3478c: 0x6c9a4220, 0x3478d: 0x6c9a4420, 0x3478e: 0x6c9a4620, 0x3478f: 0x6c9a4820, - 0x34790: 0x6c9a4a20, 0x34791: 0x6c9a4c20, 0x34792: 0x6c9a4e20, 0x34793: 0x6c9a5020, - 0x34794: 0x6c9a5220, 0x34795: 0x6c9a5420, 0x34796: 0x6c9a5620, 0x34797: 0x6c9a5820, - 0x34798: 0x6c9a5a20, 0x34799: 0x6c9a5c20, 0x3479a: 0x6c9a5e20, 0x3479b: 0x6c9a6020, - 0x3479c: 0x6c9a6220, 0x3479d: 0x6c9a6420, 0x3479e: 0x6c9a6620, 0x3479f: 0x6c9a6820, - 0x347a0: 0x6c9a6a20, 0x347a1: 0x6c9a6c20, 0x347a2: 0x6c9a6e20, 0x347a3: 0x6c9a7020, - 0x347a4: 0x6c9a7220, 0x347a5: 0x6c9a7420, 0x347a6: 0x6c9a7620, 0x347a7: 0x6c9a7820, - 0x347a8: 0x6c9a7a20, 0x347a9: 0x6cc56a20, 0x347aa: 0x6cc56c20, 0x347ab: 0x6cc56e20, - 0x347ac: 0x6cc57020, 0x347ad: 0x6cc57220, 0x347ae: 0x6cc57420, 0x347af: 0x6cc57620, - 0x347b0: 0x6cc57820, 0x347b1: 0x6cc57a20, 0x347b2: 0x6cc57c20, 0x347b3: 0x6cc57e20, - 0x347b4: 0x6cc58020, 0x347b5: 0x6cc58220, 0x347b6: 0x6cc58420, 0x347b7: 0x6cc58620, - 0x347b8: 0x6cc58820, 0x347b9: 0x6cc58a20, 0x347ba: 0x6cc58c20, 0x347bb: 0x6cc58e20, - 0x347bc: 0x6cc59020, 0x347bd: 0x6cc59220, 0x347be: 0x6cc59420, 0x347bf: 0x6cc59620, - // Block 0xd1f, offset 0x347c0 - 0x347c0: 0x6cc59820, 0x347c1: 0x6cc59a20, 0x347c2: 0x6cc59c20, 0x347c3: 0x6cc59e20, - 0x347c4: 0x6cc5a020, 0x347c5: 0x6cc5a220, 0x347c6: 0x6cc5a420, 0x347c7: 0x6cc5a620, - 0x347c8: 0x6cc5a820, 0x347c9: 0x6cc5aa20, 0x347ca: 0x6cc5ac20, 0x347cb: 0x6cc5ae20, - 0x347cc: 0x6cc5b020, 0x347cd: 0x6cc5b220, 0x347ce: 0x6cc5b420, 0x347cf: 0x6cc5b620, - 0x347d0: 0x6cc5b820, 0x347d1: 0x6cc5ba20, 0x347d2: 0x6cc5bc20, 0x347d3: 0x6cc5be20, - 0x347d4: 0x6cc5c020, 0x347d5: 0x6cc5c220, 0x347d6: 0x6cc5c420, 0x347d7: 0x6cc5c620, - 0x347d8: 0x6cc5c820, 0x347d9: 0x6cc5ca20, 0x347da: 0x6cc5cc20, 0x347db: 0x6cc5ce20, - 0x347dc: 0x6cc5d020, 0x347dd: 0x6cc5d220, 0x347de: 0x6cc5d420, 0x347df: 0x6cc5d620, - 0x347e0: 0x6cc5d820, 0x347e1: 0x6cc5da20, 0x347e2: 0x6cc5dc20, 0x347e3: 0x6cc5de20, - 0x347e4: 0x6cc5e020, 0x347e5: 0x6cc5e220, 0x347e6: 0x6cc5e420, 0x347e7: 0x6cc5e620, - 0x347e8: 0x6cc5e820, 0x347e9: 0x6cc5ea20, 0x347ea: 0x6cc5ec20, 0x347eb: 0x6cc5ee20, - 0x347ec: 0x6cc5f020, 0x347ed: 0x6cc5f220, 0x347ee: 0x6cc5f420, 0x347ef: 0x6cc5f620, - 0x347f0: 0x6cc5f820, 0x347f1: 0x6cc5fa20, 0x347f2: 0x6cc5fc20, 0x347f3: 0x6cc5fe20, - 0x347f4: 0x6cc60020, 0x347f5: 0x6cc60220, 0x347f6: 0x6cc60420, 0x347f7: 0x6cc60620, - 0x347f8: 0x6cc60820, 0x347f9: 0x6cc60a20, 0x347fa: 0x6cc60c20, 0x347fb: 0x6cc60e20, - 0x347fc: 0x6cc61020, 0x347fd: 0x6cc61220, 0x347fe: 0x6cc61420, 0x347ff: 0x6d017820, - // Block 0xd20, offset 0x34800 - 0x34800: 0x6cc61620, 0x34801: 0x6cc61820, 0x34802: 0x6cc61a20, 0x34803: 0x6cc61c20, - 0x34804: 0x6cc61e20, 0x34805: 0x6cc62020, 0x34806: 0x6cc62220, 0x34807: 0x6cc62420, - 0x34808: 0x6cc62620, 0x34809: 0x6cc62820, 0x3480a: 0x6cc62a20, 0x3480b: 0x6cc62c20, - 0x3480c: 0x6cc62e20, 0x3480d: 0x6cc63020, 0x3480e: 0x6cc63220, 0x3480f: 0x6cc63420, - 0x34810: 0x6cc63620, 0x34811: 0x6cc63820, 0x34812: 0x6cc63a20, 0x34813: 0x6cc63c20, - 0x34814: 0x6cc63e20, 0x34815: 0x6cc64020, 0x34816: 0x6cc64220, 0x34817: 0x6cc64420, - 0x34818: 0x6cc64620, 0x34819: 0x6cc64820, 0x3481a: 0x6cc64a20, 0x3481b: 0x6cc64c20, - 0x3481c: 0x6cc64e20, 0x3481d: 0x6cc65020, 0x3481e: 0x6cc65220, 0x3481f: 0x6cf45a20, - 0x34820: 0x6cf45c20, 0x34821: 0x6cf45e20, 0x34822: 0x6cf46020, 0x34823: 0x6cf46220, - 0x34824: 0x6cf46420, 0x34825: 0x6cf46620, 0x34826: 0x6cf46820, 0x34827: 0x6cf46a20, - 0x34828: 0x6cf46c20, 0x34829: 0x6cf46e20, 0x3482a: 0x6cf47020, 0x3482b: 0x6cf47220, - 0x3482c: 0x6cf47420, 0x3482d: 0x6cf47620, 0x3482e: 0x6cf47820, 0x3482f: 0x6cf47a20, - 0x34830: 0x6cf47c20, 0x34831: 0x6cf47e20, 0x34832: 0x6cf48020, 0x34833: 0x6cf48220, - 0x34834: 0x6cf48420, 0x34835: 0x6cf48620, 0x34836: 0x6cf48820, 0x34837: 0x6cf48a20, - 0x34838: 0x6cf48c20, 0x34839: 0x6cf48e20, 0x3483a: 0x6cf49020, 0x3483b: 0x6cf49220, - 0x3483c: 0x6cf49420, 0x3483d: 0x6cf49620, 0x3483e: 0x6cf49820, 0x3483f: 0x6cf49a20, - // Block 0xd21, offset 0x34840 - 0x34840: 0x6cf49c20, 0x34841: 0x6cf49e20, 0x34842: 0x6cf4a020, 0x34843: 0x6cf4a220, - 0x34844: 0x6cf4a420, 0x34845: 0x6cf4a620, 0x34846: 0x6cf4a820, 0x34847: 0x6cf4aa20, - 0x34848: 0x6cf4ac20, 0x34849: 0x6cf4ae20, 0x3484a: 0x6cf4b020, 0x3484b: 0x6cf4b220, - 0x3484c: 0x6cf4b420, 0x3484d: 0x6cf4b620, 0x3484e: 0x6cf4b820, 0x3484f: 0x6cf4ba20, - 0x34850: 0x6cf4bc20, 0x34851: 0x6cf4be20, 0x34852: 0x6cf4c020, 0x34853: 0x6cf4c220, - 0x34854: 0x6cf4c420, 0x34855: 0x6cf4c620, 0x34856: 0x6cf4c820, 0x34857: 0x6cf4ca20, - 0x34858: 0x6cf4cc20, 0x34859: 0x6cf4ce20, 0x3485a: 0x6cf4d020, 0x3485b: 0x6cf4d220, - 0x3485c: 0x6cf4d420, 0x3485d: 0x6cf4d620, 0x3485e: 0x6cf4d820, 0x3485f: 0x6cf4da20, - 0x34860: 0x6cf4dc20, 0x34861: 0x6cf4de20, 0x34862: 0x6cf4e020, 0x34863: 0x6cf4e220, - 0x34864: 0x6cf4e420, 0x34865: 0x6cf4e620, 0x34866: 0x6cf4e820, 0x34867: 0x6cf4ea20, - 0x34868: 0x6cf4ec20, 0x34869: 0x6cf4ee20, 0x3486a: 0x6cf4f020, 0x3486b: 0x6cf4f220, - 0x3486c: 0x6cf4f420, 0x3486d: 0x6cf4f620, 0x3486e: 0x6cf4f820, 0x3486f: 0x6cf4fa20, - 0x34870: 0x6cf4fc20, 0x34871: 0x6cf4fe20, 0x34872: 0x6cf50020, 0x34873: 0x6d23fa20, - 0x34874: 0x6d23fc20, 0x34875: 0x6d23fe20, 0x34876: 0x6d240020, 0x34877: 0x6d240220, - 0x34878: 0x6d240420, 0x34879: 0x6d240620, 0x3487a: 0x6d240820, 0x3487b: 0x6d240a20, - 0x3487c: 0x6d240c20, 0x3487d: 0x6d240e20, 0x3487e: 0x6d241020, 0x3487f: 0x6d241220, - // Block 0xd22, offset 0x34880 - 0x34880: 0x6d241420, 0x34881: 0x6d241620, 0x34882: 0x6d241820, 0x34883: 0x6d241a20, - 0x34884: 0x6d241c20, 0x34885: 0x6d241e20, 0x34886: 0x6d242020, 0x34887: 0x6d242220, - 0x34888: 0x6d242420, 0x34889: 0x6d242620, 0x3488a: 0x6d242820, 0x3488b: 0x6d242a20, - 0x3488c: 0x6d242c20, 0x3488d: 0x6d242e20, 0x3488e: 0x6d243020, 0x3488f: 0x6d243220, - 0x34890: 0x6d243420, 0x34891: 0x6d243620, 0x34892: 0x6d243820, 0x34893: 0x6d243a20, - 0x34894: 0x6d243c20, 0x34895: 0x6d243e20, 0x34896: 0x6d244020, 0x34897: 0x6d244220, - 0x34898: 0x6d244420, 0x34899: 0x6d244620, 0x3489a: 0x6d244820, 0x3489b: 0x6d244a20, - 0x3489c: 0x6d244c20, 0x3489d: 0x6d244e20, 0x3489e: 0x6d245020, 0x3489f: 0x6d245220, - 0x348a0: 0x6d245420, 0x348a1: 0x6d245620, 0x348a2: 0x6d245820, 0x348a3: 0x6d245a20, - 0x348a4: 0x6d245c20, 0x348a5: 0x6d245e20, 0x348a6: 0x6d246020, 0x348a7: 0x6d246220, - 0x348a8: 0x6d246420, 0x348a9: 0x6d246620, 0x348aa: 0x6d246820, 0x348ab: 0x6d246a20, - 0x348ac: 0x6d246c20, 0x348ad: 0x6d246e20, 0x348ae: 0x6d247020, 0x348af: 0x6d247220, - 0x348b0: 0x6d247420, 0x348b1: 0x6d247620, 0x348b2: 0x6d247820, 0x348b3: 0x6d247a20, - 0x348b4: 0x6d247c20, 0x348b5: 0x6d247e20, 0x348b6: 0x6d248020, 0x348b7: 0x6d248220, - 0x348b8: 0x6d248420, 0x348b9: 0x6d248620, 0x348ba: 0x6d248820, 0x348bb: 0x6d248a20, - 0x348bc: 0x6d248c20, 0x348bd: 0x6d248e20, 0x348be: 0x6d249020, 0x348bf: 0x6d249220, - // Block 0xd23, offset 0x348c0 - 0x348c0: 0x6d249420, 0x348c1: 0x6d249620, 0x348c2: 0x6d249820, 0x348c3: 0x6d249a20, - 0x348c4: 0x6d249c20, 0x348c5: 0x6d249e20, 0x348c6: 0x6d24a020, 0x348c7: 0x6d24a220, - 0x348c8: 0x6d24a420, 0x348c9: 0x6d24a620, 0x348ca: 0x6d24a820, 0x348cb: 0x6d24aa20, - 0x348cc: 0x6d24ac20, 0x348cd: 0x6d24ae20, 0x348ce: 0x6d24b020, 0x348cf: 0x6d24b220, - 0x348d0: 0x6d24b420, 0x348d1: 0x6d24b620, 0x348d2: 0x6d24b820, 0x348d3: 0x6d24ba20, - 0x348d4: 0x6d24bc20, 0x348d5: 0x6d24be20, 0x348d6: 0x6d24c020, 0x348d7: 0x6d24c220, - 0x348d8: 0x6d24c420, 0x348d9: 0x6d24c620, 0x348da: 0x6d24c820, 0x348db: 0x6d24ca20, - 0x348dc: 0x6d24cc20, 0x348dd: 0x6d24ce20, 0x348de: 0x6d24d020, 0x348df: 0x6d24d220, - 0x348e0: 0x6d519620, 0x348e1: 0x6d519820, 0x348e2: 0x6d519a20, 0x348e3: 0x6d519c20, - 0x348e4: 0x6d519e20, 0x348e5: 0x6d51a020, 0x348e6: 0x6d51a220, 0x348e7: 0x6d51a420, - 0x348e8: 0x6d51a620, 0x348e9: 0x6d51a820, 0x348ea: 0x6d51aa20, 0x348eb: 0x6d51ac20, - 0x348ec: 0x6d51ae20, 0x348ed: 0x6d51b020, 0x348ee: 0x6d51b220, 0x348ef: 0x6d51b420, - 0x348f0: 0x6d51b620, 0x348f1: 0x6d51b820, 0x348f2: 0x6d51ba20, 0x348f3: 0x6d51bc20, - 0x348f4: 0x6d51be20, 0x348f5: 0x6d51c020, 0x348f6: 0x6d51c220, 0x348f7: 0x6d51c420, - 0x348f8: 0x6d51c620, 0x348f9: 0x6d51c820, 0x348fa: 0x6d51ca20, 0x348fb: 0x6d51cc20, - 0x348fc: 0x6d51ce20, 0x348fd: 0x6d51d020, 0x348fe: 0x6d51d220, 0x348ff: 0x6d51d420, - // Block 0xd24, offset 0x34900 - 0x34900: 0x6d51d620, 0x34901: 0x6d51d820, 0x34902: 0x6d51da20, 0x34903: 0x6d51dc20, - 0x34904: 0x6d51de20, 0x34905: 0x6d51e020, 0x34906: 0x6d51e220, 0x34907: 0x6d51e420, - 0x34908: 0x6d51e620, 0x34909: 0x6d51e820, 0x3490a: 0x6d51ea20, 0x3490b: 0x6d51ec20, - 0x3490c: 0x6d51ee20, 0x3490d: 0x6d51f020, 0x3490e: 0x6d51f220, 0x3490f: 0x6d51f420, - 0x34910: 0x6d51f620, 0x34911: 0x6d51f820, 0x34912: 0x6d51fa20, 0x34913: 0x6d51fc20, - 0x34914: 0x6d51fe20, 0x34915: 0x6d520020, 0x34916: 0x6d520220, 0x34917: 0x6d520420, - 0x34918: 0x6d520620, 0x34919: 0x6d520820, 0x3491a: 0x6d520a20, 0x3491b: 0x6d520c20, - 0x3491c: 0x6d520e20, 0x3491d: 0x6d521020, 0x3491e: 0x6d521220, 0x3491f: 0x6d521420, - 0x34920: 0x6d521620, 0x34921: 0x6d521820, 0x34922: 0x6d521a20, 0x34923: 0x6d521c20, - 0x34924: 0x6d521e20, 0x34925: 0x6d522020, 0x34926: 0x6d522220, 0x34927: 0x6d522420, - 0x34928: 0x6d522620, 0x34929: 0x6d522820, 0x3492a: 0x6d522a20, 0x3492b: 0x6d522c20, - 0x3492c: 0x6d522e20, 0x3492d: 0x6d523020, 0x3492e: 0x6d523220, 0x3492f: 0x6d523420, - 0x34930: 0x6d523620, 0x34931: 0x6d523820, 0x34932: 0x6d523a20, 0x34933: 0x6d523c20, - 0x34934: 0x6d523e20, 0x34935: 0x6d524020, 0x34936: 0x6d524220, 0x34937: 0x6d524420, - 0x34938: 0x6d524620, 0x34939: 0x6d524820, 0x3493a: 0x6d524a20, 0x3493b: 0x6d524c20, - 0x3493c: 0x6d524e20, 0x3493d: 0x6d525020, 0x3493e: 0x6d525220, 0x3493f: 0x6d7d0220, - // Block 0xd25, offset 0x34940 - 0x34940: 0x6d7d0420, 0x34941: 0x6d7d0620, 0x34942: 0x6d7d0820, 0x34943: 0x6d7d0a20, - 0x34944: 0x6d7d0c20, 0x34945: 0x6d7d0e20, 0x34946: 0x6d7d1020, 0x34947: 0x6d7d1220, - 0x34948: 0x6d7d1420, 0x34949: 0x6d7d1620, 0x3494a: 0x6d7d1820, 0x3494b: 0x6d7d1a20, - 0x3494c: 0x6d7d1c20, 0x3494d: 0x6d7d1e20, 0x3494e: 0x6d7d2020, 0x3494f: 0x6d7d2220, - 0x34950: 0x6d7d2420, 0x34951: 0x6d7d2620, 0x34952: 0x6d7d2820, 0x34953: 0x6d7d2a20, - 0x34954: 0x6d7d2c20, 0x34955: 0x6d7d2e20, 0x34956: 0x6d7d3020, 0x34957: 0x6d7d3220, - 0x34958: 0x6d7d3420, 0x34959: 0x6d7d3620, 0x3495a: 0x6d7d3820, 0x3495b: 0x6d7d3a20, - 0x3495c: 0x6d7d3c20, 0x3495d: 0x6d7d3e20, 0x3495e: 0x6d7d4020, 0x3495f: 0x6d7d4220, - 0x34960: 0x6d7d4420, 0x34961: 0x6d7d4620, 0x34962: 0x6d7d4820, 0x34963: 0x6d7d4a20, - 0x34964: 0x6d7d4c20, 0x34965: 0x6d7d4e20, 0x34966: 0x6d7d5020, 0x34967: 0x6d7d5220, - 0x34968: 0x6d7d5420, 0x34969: 0x6d7d5620, 0x3496a: 0x6d7d5820, 0x3496b: 0x6d7d5a20, - 0x3496c: 0x6d7d5c20, 0x3496d: 0x6d7d5e20, 0x3496e: 0x6d7d6020, 0x3496f: 0x6d7d6220, - 0x34970: 0x6d7d6420, 0x34971: 0x6d7d6620, 0x34972: 0x6d7d6820, 0x34973: 0x6d7d6a20, - 0x34974: 0x6d7d6c20, 0x34975: 0x6d7d6e20, 0x34976: 0x6d7d7020, 0x34977: 0x6d7d7220, - 0x34978: 0x6d7d7420, 0x34979: 0x6d7d7620, 0x3497a: 0x6d7d7820, 0x3497b: 0x6d7d7a20, - 0x3497c: 0x6d7d7c20, 0x3497d: 0x6d7d7e20, 0x3497e: 0x6d7d8020, 0x3497f: 0x6d7d8220, - // Block 0xd26, offset 0x34980 - 0x34980: 0x6d7d8420, 0x34981: 0x6d7d8620, 0x34982: 0x6d7d8820, 0x34983: 0x6d7d8a20, - 0x34984: 0x6d7d8c20, 0x34985: 0x6d525420, 0x34986: 0x6d7d8e20, 0x34987: 0x6d7d9020, - 0x34988: 0x6d7d9220, 0x34989: 0x6d7d9420, 0x3498a: 0x6d7d9620, 0x3498b: 0x6da4ae20, - 0x3498c: 0x6da4b020, 0x3498d: 0x6da4b220, 0x3498e: 0x6da4b420, 0x3498f: 0x6da4b620, - 0x34990: 0x6da4b820, 0x34991: 0x6da4ba20, 0x34992: 0x6da4bc20, 0x34993: 0x6da4be20, - 0x34994: 0x6da4c020, 0x34995: 0x6da4c220, 0x34996: 0x6da4c420, 0x34997: 0x6da4c620, - 0x34998: 0x6da4c820, 0x34999: 0x6da4ca20, 0x3499a: 0x6da4cc20, 0x3499b: 0x6da4ce20, - 0x3499c: 0x6da4d020, 0x3499d: 0x6da4d220, 0x3499e: 0x6da4d420, 0x3499f: 0x6da4d620, - 0x349a0: 0x6da4d820, 0x349a1: 0x6da4da20, 0x349a2: 0x6da4dc20, 0x349a3: 0x6da4de20, - 0x349a4: 0x6da4e020, 0x349a5: 0x6da4e220, 0x349a6: 0x6da4e420, 0x349a7: 0x6da4e620, - 0x349a8: 0x6da4e820, 0x349a9: 0x6da4ea20, 0x349aa: 0x6da4ec20, 0x349ab: 0x6da4ee20, - 0x349ac: 0x6da4f020, 0x349ad: 0x6da4f220, 0x349ae: 0x6da4f420, 0x349af: 0x6da4f620, - 0x349b0: 0x6da4f820, 0x349b1: 0x6da4fa20, 0x349b2: 0x6da4fc20, 0x349b3: 0x6da4fe20, - 0x349b4: 0x6da50020, 0x349b5: 0x6da50220, 0x349b6: 0x6dc64e20, 0x349b7: 0x6dc65020, - 0x349b8: 0x6dc65220, 0x349b9: 0x6dc65420, 0x349ba: 0x6dc65620, 0x349bb: 0x6dc65820, - 0x349bc: 0x6dc65a20, 0x349bd: 0x6dc65c20, 0x349be: 0x6dc65e20, 0x349bf: 0x6dc66020, - // Block 0xd27, offset 0x349c0 - 0x349c0: 0x6dc66220, 0x349c1: 0x6dc66420, 0x349c2: 0x6dc66620, 0x349c3: 0x6dc66820, - 0x349c4: 0x6dc66a20, 0x349c5: 0x6dc66c20, 0x349c6: 0x6dc66e20, 0x349c7: 0x6dc67020, - 0x349c8: 0x6dc67220, 0x349c9: 0x6dc67420, 0x349ca: 0x6dc67620, 0x349cb: 0x6dc67820, - 0x349cc: 0x6dc67a20, 0x349cd: 0x6dc67c20, 0x349ce: 0x6dc67e20, 0x349cf: 0x6dc68020, - 0x349d0: 0x6dc68220, 0x349d1: 0x6dc68420, 0x349d2: 0x6dc68620, 0x349d3: 0x6dc68820, - 0x349d4: 0x6dc68a20, 0x349d5: 0x6dc68c20, 0x349d6: 0x6dc68e20, 0x349d7: 0x6dc69020, - 0x349d8: 0x6dc69220, 0x349d9: 0x6dc69420, 0x349da: 0x6dc69620, 0x349db: 0x6dc69820, - 0x349dc: 0x6dc69a20, 0x349dd: 0x6dc69c20, 0x349de: 0x6dc69e20, 0x349df: 0x6dc6a020, - 0x349e0: 0x6dc6a220, 0x349e1: 0x6dc6a420, 0x349e2: 0x6dc6a620, 0x349e3: 0x6de30420, - 0x349e4: 0x6de30620, 0x349e5: 0x6de30820, 0x349e6: 0x6de30a20, 0x349e7: 0x6de30c20, - 0x349e8: 0x6de30e20, 0x349e9: 0x6de31020, 0x349ea: 0x6de31220, 0x349eb: 0x6de31420, - 0x349ec: 0x6de31620, 0x349ed: 0x6de31820, 0x349ee: 0x6de31a20, 0x349ef: 0x6de31c20, - 0x349f0: 0x6de31e20, 0x349f1: 0x6de32020, 0x349f2: 0x6de32220, 0x349f3: 0x6de32420, - 0x349f4: 0x6de32620, 0x349f5: 0x6de32820, 0x349f6: 0x6de32a20, 0x349f7: 0x6de32c20, - 0x349f8: 0x6de32e20, 0x349f9: 0x6de33020, 0x349fa: 0x6de33220, 0x349fb: 0x6de33420, - 0x349fc: 0x6de33620, 0x349fd: 0x6de33820, 0x349fe: 0x6de33a20, 0x349ff: 0x6de33c20, - // Block 0xd28, offset 0x34a00 - 0x34a00: 0x6de33e20, 0x34a01: 0x6de34020, 0x34a02: 0x6de34220, 0x34a03: 0x6de34420, - 0x34a04: 0x6de34620, 0x34a05: 0x6de34820, 0x34a06: 0x6de34a20, 0x34a07: 0x6de34c20, - 0x34a08: 0x6de34e20, 0x34a09: 0x6de35020, 0x34a0a: 0x6de35220, 0x34a0b: 0x6de35420, - 0x34a0c: 0x6de35620, 0x34a0d: 0x6dfa7220, 0x34a0e: 0x6dfa7420, 0x34a0f: 0x6dfa7620, - 0x34a10: 0x6dfa7820, 0x34a11: 0x6dfa7a20, 0x34a12: 0x6dfa7c20, 0x34a13: 0x6dfa7e20, - 0x34a14: 0x6dfa8020, 0x34a15: 0x6dfa8220, 0x34a16: 0x6dfa8420, 0x34a17: 0x6dfa8620, - 0x34a18: 0x6dfa8820, 0x34a19: 0x6dfa8a20, 0x34a1a: 0x6dfa8c20, 0x34a1b: 0x6dfa8e20, - 0x34a1c: 0x6dfa9020, 0x34a1d: 0x6dfa9220, 0x34a1e: 0x6dfa9420, 0x34a1f: 0x6dfa9620, - 0x34a20: 0x6dfa9820, 0x34a21: 0x6dfa9a20, 0x34a22: 0x6e0dfe20, 0x34a23: 0x6dfa9c20, - 0x34a24: 0x6dfa9e20, 0x34a25: 0x6dfaa020, 0x34a26: 0x6dfaa220, 0x34a27: 0x6dfaa420, - 0x34a28: 0x6dfaa620, 0x34a29: 0x6dfaa820, 0x34a2a: 0x6dfaaa20, 0x34a2b: 0x6dfaac20, - 0x34a2c: 0x6e0e0020, 0x34a2d: 0x6e0e0220, 0x34a2e: 0x6e0e0420, 0x34a2f: 0x6e0e0620, - 0x34a30: 0x6e0e0820, 0x34a31: 0x6e0e0a20, 0x34a32: 0x6e0e0c20, 0x34a33: 0x6e0e0e20, - 0x34a34: 0x6e0e1020, 0x34a35: 0x6e0e1220, 0x34a36: 0x6e0e1420, 0x34a37: 0x6e0e1620, - 0x34a38: 0x6e0e1820, 0x34a39: 0x6e0e1a20, 0x34a3a: 0x6e0e1c20, 0x34a3b: 0x6e0e1e20, - 0x34a3c: 0x6e0e2020, 0x34a3d: 0x6e0e2220, 0x34a3e: 0x6e0e2420, 0x34a3f: 0x6e0e2620, - // Block 0xd29, offset 0x34a40 - 0x34a40: 0x6e0e2820, 0x34a41: 0x6e0e2a20, 0x34a42: 0x6e1d6620, 0x34a43: 0x6e1d6820, - 0x34a44: 0x6e1d6a20, 0x34a45: 0x6e1d6c20, 0x34a46: 0x6e1d6e20, 0x34a47: 0x6e1d7020, - 0x34a48: 0x6e1d7220, 0x34a49: 0x6e1d7420, 0x34a4a: 0x6e1d7620, 0x34a4b: 0x6e1d7820, - 0x34a4c: 0x6e1d7a20, 0x34a4d: 0x6e1d7c20, 0x34a4e: 0x6e1d7e20, 0x34a4f: 0x6e1d8020, - 0x34a50: 0x6e1d8220, 0x34a51: 0x6e1d8420, 0x34a52: 0x6e1d8620, 0x34a53: 0x6e1d8820, - 0x34a54: 0x6e1d8a20, 0x34a55: 0x6e1d8c20, 0x34a56: 0x6e290820, 0x34a57: 0x6e290a20, - 0x34a58: 0x6e290c20, 0x34a59: 0x6e290e20, 0x34a5a: 0x6e291020, 0x34a5b: 0x6e291220, - 0x34a5c: 0x6e291420, 0x34a5d: 0x6e291620, 0x34a5e: 0x6e322a20, 0x34a5f: 0x6e322c20, - 0x34a60: 0x6e322e20, 0x34a61: 0x6e323020, 0x34a62: 0x6e323220, 0x34a63: 0x6e323420, - 0x34a64: 0x6e323620, 0x34a65: 0x6e323820, 0x34a66: 0x6e323a20, 0x34a67: 0x6e323c20, - 0x34a68: 0x6e323e20, 0x34a69: 0x6e324020, 0x34a6a: 0x6e324220, 0x34a6b: 0x6e324420, - 0x34a6c: 0x6e389620, 0x34a6d: 0x6e389820, 0x34a6e: 0x6e389a20, 0x34a6f: 0x6e389c20, - 0x34a70: 0x6e404420, 0x34a71: 0x6e404620, 0x34a72: 0x6e404820, 0x34a73: 0x6e429e20, - 0x34a74: 0x6e462a20, 0x34a75: 0x6c123820, 0x34a76: 0x6c211a20, 0x34a77: 0x6c353020, - 0x34a78: 0x6c353220, 0x34a79: 0x6c353420, 0x34a7a: 0x6c353620, 0x34a7b: 0x6c353820, - 0x34a7c: 0x6c353a20, 0x34a7d: 0x6c353c20, 0x34a7e: 0x6c502c20, 0x34a7f: 0x6c502e20, - // Block 0xd2a, offset 0x34a80 - 0x34a80: 0x6c503020, 0x34a81: 0x6c722620, 0x34a82: 0x6c722820, 0x34a83: 0x6c722a20, - 0x34a84: 0x6c722c20, 0x34a85: 0x6c722e20, 0x34a86: 0x6c723020, 0x34a87: 0x6c723220, - 0x34a88: 0x6c6aa620, 0x34a89: 0x6c723420, 0x34a8a: 0x6c9a9620, 0x34a8b: 0x6c9a9820, - 0x34a8c: 0x6c9a9a20, 0x34a8d: 0x6c9a9c20, 0x34a8e: 0x6cc67420, 0x34a8f: 0x6cc67620, - 0x34a90: 0x6cc67820, 0x34a91: 0x6cc67a20, 0x34a92: 0x6cc67c20, 0x34a93: 0x6cc67e20, - 0x34a94: 0x6cc68020, 0x34a95: 0x6cf52020, 0x34a96: 0x6cf52220, 0x34a97: 0x6cf52420, - 0x34a98: 0x6cf52620, 0x34a99: 0x6cf52820, 0x34a9a: 0x6d24ea20, 0x34a9b: 0x6d24ec20, - 0x34a9c: 0x6d24ee20, 0x34a9d: 0x6d526a20, 0x34a9e: 0x6d526c20, 0x34a9f: 0x6d526e20, - 0x34aa0: 0x6d7da220, 0x34aa1: 0x6d7da420, 0x34aa2: 0x6d7da620, 0x34aa3: 0x6d7da820, - 0x34aa4: 0x6d7daa20, 0x34aa5: 0x6da50a20, 0x34aa6: 0x6da50c20, 0x34aa7: 0x6da50e20, - 0x34aa8: 0x6da51020, 0x34aa9: 0x6da51220, 0x34aaa: 0x6dfab020, 0x34aab: 0x6c212a20, - 0x34aac: 0x6c212c20, 0x34aad: 0x6c212e20, 0x34aae: 0x6c213020, 0x34aaf: 0x6c213220, - 0x34ab0: 0x6c213420, 0x34ab1: 0x6c213620, 0x34ab2: 0x6c213820, 0x34ab3: 0x6c354820, - 0x34ab4: 0x6c354a20, 0x34ab5: 0x6c354c20, 0x34ab6: 0x6c354e20, 0x34ab7: 0x6c355020, - 0x34ab8: 0x6c355220, 0x34ab9: 0x6c355420, 0x34aba: 0x6c355620, 0x34abb: 0x6c355820, - 0x34abc: 0x6c355a20, 0x34abd: 0x6c355c20, 0x34abe: 0x6c355e20, 0x34abf: 0x6c356020, - // Block 0xd2b, offset 0x34ac0 - 0x34ac0: 0x6c356220, 0x34ac1: 0x6c356420, 0x34ac2: 0x6c356620, 0x34ac3: 0x6c356820, - 0x34ac4: 0x6c356a20, 0x34ac5: 0x6c356c20, 0x34ac6: 0x6c356e20, 0x34ac7: 0x6c357020, - 0x34ac8: 0x6c357220, 0x34ac9: 0x6c504820, 0x34aca: 0x6c504a20, 0x34acb: 0x6c504c20, - 0x34acc: 0x6c504e20, 0x34acd: 0x6c505020, 0x34ace: 0x6c505220, 0x34acf: 0x6c505420, - 0x34ad0: 0x6c505620, 0x34ad1: 0x6c505820, 0x34ad2: 0x6c505a20, 0x34ad3: 0x6c505c20, - 0x34ad4: 0x6c505e20, 0x34ad5: 0x6c506020, 0x34ad6: 0x6c506220, 0x34ad7: 0x6c506420, - 0x34ad8: 0x6c506620, 0x34ad9: 0x6c506820, 0x34ada: 0x6c506a20, 0x34adb: 0x6c724a20, - 0x34adc: 0x6c724c20, 0x34add: 0x6c724e20, 0x34ade: 0x6c725020, 0x34adf: 0x6c725220, - 0x34ae0: 0x6c725420, 0x34ae1: 0x6c725620, 0x34ae2: 0x6c725820, 0x34ae3: 0x6c725a20, - 0x34ae4: 0x6c725c20, 0x34ae5: 0x6c725e20, 0x34ae6: 0x6c726020, 0x34ae7: 0x6c726220, - 0x34ae8: 0x6c726420, 0x34ae9: 0x6c726620, 0x34aea: 0x6c726820, 0x34aeb: 0x6c726a20, - 0x34aec: 0x6c726c20, 0x34aed: 0x6c726e20, 0x34aee: 0x6c727020, 0x34aef: 0x6c727220, - 0x34af0: 0x6c727420, 0x34af1: 0x6c727620, 0x34af2: 0x6c727820, 0x34af3: 0x6c727a20, - 0x34af4: 0x6c727c20, 0x34af5: 0x6c727e20, 0x34af6: 0x6c728020, 0x34af7: 0x6c728220, - 0x34af8: 0x6c728420, 0x34af9: 0x6c9aca20, 0x34afa: 0x6c9acc20, 0x34afb: 0x6c9ace20, - 0x34afc: 0x6c9ad020, 0x34afd: 0x6c9ad220, 0x34afe: 0x6c9ad420, 0x34aff: 0x6c9ad620, - // Block 0xd2c, offset 0x34b00 - 0x34b00: 0x6c9ad820, 0x34b01: 0x6c9ada20, 0x34b02: 0x6c9adc20, 0x34b03: 0x6c9ade20, - 0x34b04: 0x6c9ae020, 0x34b05: 0x6c9ae220, 0x34b06: 0x6c9ae420, 0x34b07: 0x6c9ae620, - 0x34b08: 0x6c9ae820, 0x34b09: 0x6c9aea20, 0x34b0a: 0x6c9aec20, 0x34b0b: 0x6c9aee20, - 0x34b0c: 0x6c9af020, 0x34b0d: 0x6c9af220, 0x34b0e: 0x6c9af420, 0x34b0f: 0x6c9af620, - 0x34b10: 0x6c9af820, 0x34b11: 0x6c9afa20, 0x34b12: 0x6c9afc20, 0x34b13: 0x6c9afe20, - 0x34b14: 0x6c9b0020, 0x34b15: 0x6c9b0220, 0x34b16: 0x6c9b0420, 0x34b17: 0x6c9b0620, - 0x34b18: 0x6c9b0820, 0x34b19: 0x6c9b0a20, 0x34b1a: 0x6cc6b620, 0x34b1b: 0x6cc6b820, - 0x34b1c: 0x6c9b0c20, 0x34b1d: 0x6cc6ba20, 0x34b1e: 0x6cc6bc20, 0x34b1f: 0x6cc6be20, - 0x34b20: 0x6cc6c020, 0x34b21: 0x6cc6c220, 0x34b22: 0x6cc6c420, 0x34b23: 0x6cc6c620, - 0x34b24: 0x6cc6c820, 0x34b25: 0x6cc6ca20, 0x34b26: 0x6cc6cc20, 0x34b27: 0x6cc6ce20, - 0x34b28: 0x6cc6d020, 0x34b29: 0x6cc6d220, 0x34b2a: 0x6cc6d420, 0x34b2b: 0x6cc6d620, - 0x34b2c: 0x6cc6d820, 0x34b2d: 0x6cc6da20, 0x34b2e: 0x6cc6dc20, 0x34b2f: 0x6cc6de20, - 0x34b30: 0x6cc6e020, 0x34b31: 0x6cc6e220, 0x34b32: 0x6cc6e420, 0x34b33: 0x6cc6e620, - 0x34b34: 0x6cc6e820, 0x34b35: 0x6cc6ea20, 0x34b36: 0x6cc6ec20, 0x34b37: 0x6c9b0e20, - 0x34b38: 0x6cc6ee20, 0x34b39: 0x6cc6f020, 0x34b3a: 0x6cc6f220, 0x34b3b: 0x6cc6f420, - 0x34b3c: 0x6cc6f620, 0x34b3d: 0x6cc6f820, 0x34b3e: 0x6cc6fa20, 0x34b3f: 0x6cf54020, - // Block 0xd2d, offset 0x34b40 - 0x34b40: 0x6cf54220, 0x34b41: 0x6cf54420, 0x34b42: 0x6cf54620, 0x34b43: 0x6cf54820, - 0x34b44: 0x6cf54a20, 0x34b45: 0x6cf54c20, 0x34b46: 0x6cf54e20, 0x34b47: 0x6cf55020, - 0x34b48: 0x6cf55220, 0x34b49: 0x6cf55420, 0x34b4a: 0x6cf55620, 0x34b4b: 0x6cf55820, - 0x34b4c: 0x6cf55a20, 0x34b4d: 0x6cf55c20, 0x34b4e: 0x6cf55e20, 0x34b4f: 0x6cf56020, - 0x34b50: 0x6cf56220, 0x34b51: 0x6cf56420, 0x34b52: 0x6cf56620, 0x34b53: 0x6cf56820, - 0x34b54: 0x6cf56a20, 0x34b55: 0x6cf56c20, 0x34b56: 0x6cf56e20, 0x34b57: 0x6cf57020, - 0x34b58: 0x6cf57220, 0x34b59: 0x6cf57420, 0x34b5a: 0x6cf57620, 0x34b5b: 0x6cf57820, - 0x34b5c: 0x6cf57a20, 0x34b5d: 0x6cf57c20, 0x34b5e: 0x6cf57e20, 0x34b5f: 0x6cf58020, - 0x34b60: 0x6cf58220, 0x34b61: 0x6cf58420, 0x34b62: 0x6cf58620, 0x34b63: 0x6cc6fc20, - 0x34b64: 0x6cf58820, 0x34b65: 0x6d017a20, 0x34b66: 0x6d24fe20, 0x34b67: 0x6d250020, - 0x34b68: 0x6d250220, 0x34b69: 0x6d250420, 0x34b6a: 0x6d250620, 0x34b6b: 0x6d250820, - 0x34b6c: 0x6d250a20, 0x34b6d: 0x6d250c20, 0x34b6e: 0x6d250e20, 0x34b6f: 0x6d251020, - 0x34b70: 0x6d251220, 0x34b71: 0x6d251420, 0x34b72: 0x6d251620, 0x34b73: 0x6d251820, - 0x34b74: 0x6d251a20, 0x34b75: 0x6d251c20, 0x34b76: 0x6d251e20, 0x34b77: 0x6d252020, - 0x34b78: 0x6d252220, 0x34b79: 0x6d252420, 0x34b7a: 0x6d252620, 0x34b7b: 0x6d252820, - 0x34b7c: 0x6d252a20, 0x34b7d: 0x6d252c20, 0x34b7e: 0x6d252e20, 0x34b7f: 0x6d253020, - // Block 0xd2e, offset 0x34b80 - 0x34b80: 0x6d253220, 0x34b81: 0x6d253420, 0x34b82: 0x6d253620, 0x34b83: 0x6d253820, - 0x34b84: 0x6d253a20, 0x34b85: 0x6d253c20, 0x34b86: 0x6d033220, 0x34b87: 0x6d528620, - 0x34b88: 0x6d528820, 0x34b89: 0x6d528a20, 0x34b8a: 0x6d528c20, 0x34b8b: 0x6d528e20, - 0x34b8c: 0x6d529020, 0x34b8d: 0x6d529220, 0x34b8e: 0x6d529420, 0x34b8f: 0x6d529620, - 0x34b90: 0x6d529820, 0x34b91: 0x6d529a20, 0x34b92: 0x6d529c20, 0x34b93: 0x6d529e20, - 0x34b94: 0x6d52a020, 0x34b95: 0x6d52a220, 0x34b96: 0x6d52a420, 0x34b97: 0x6d52a620, - 0x34b98: 0x6d52a820, 0x34b99: 0x6d52aa20, 0x34b9a: 0x6d52ac20, 0x34b9b: 0x6d52ae20, - 0x34b9c: 0x6d52b020, 0x34b9d: 0x6d52b220, 0x34b9e: 0x6d7dbe20, 0x34b9f: 0x6d7dc020, - 0x34ba0: 0x6d7dc220, 0x34ba1: 0x6d7dc420, 0x34ba2: 0x6d7dc620, 0x34ba3: 0x6d7dc820, - 0x34ba4: 0x6d7dca20, 0x34ba5: 0x6d7dcc20, 0x34ba6: 0x6d7dce20, 0x34ba7: 0x6d7dd020, - 0x34ba8: 0x6d7dd220, 0x34ba9: 0x6d7dd420, 0x34baa: 0x6d7dd620, 0x34bab: 0x6d7dd820, - 0x34bac: 0x6d7dda20, 0x34bad: 0x6d7ddc20, 0x34bae: 0x6d7dde20, 0x34baf: 0x6d7de020, - 0x34bb0: 0x6d7de220, 0x34bb1: 0x6d7de420, 0x34bb2: 0x6d7de620, 0x34bb3: 0x6d7de820, - 0x34bb4: 0x6d7dea20, 0x34bb5: 0x6d7dec20, 0x34bb6: 0x6d7dee20, 0x34bb7: 0x6d7df020, - 0x34bb8: 0x6d7df220, 0x34bb9: 0x6d7df420, 0x34bba: 0x6d7df620, 0x34bbb: 0x6d7df820, - 0x34bbc: 0x6d7dfa20, 0x34bbd: 0x6d7dfc20, 0x34bbe: 0x6da51a20, 0x34bbf: 0x6da51c20, - // Block 0xd2f, offset 0x34bc0 - 0x34bc0: 0x6da51e20, 0x34bc1: 0x6da52020, 0x34bc2: 0x6da52220, 0x34bc3: 0x6da52420, - 0x34bc4: 0x6dc6bc20, 0x34bc5: 0x6da52620, 0x34bc6: 0x6da52820, 0x34bc7: 0x6da52a20, - 0x34bc8: 0x6da52c20, 0x34bc9: 0x6da52e20, 0x34bca: 0x6da53020, 0x34bcb: 0x6da53220, - 0x34bcc: 0x6da53420, 0x34bcd: 0x6da53620, 0x34bce: 0x6da53820, 0x34bcf: 0x6da53a20, - 0x34bd0: 0x6dc6be20, 0x34bd1: 0x6dc6c020, 0x34bd2: 0x6dc6c220, 0x34bd3: 0x6dc6c420, - 0x34bd4: 0x6dc6c620, 0x34bd5: 0x6dc6c820, 0x34bd6: 0x6dc6ca20, 0x34bd7: 0x6dc6cc20, - 0x34bd8: 0x6dc6ce20, 0x34bd9: 0x6dc6d020, 0x34bda: 0x6dc6d220, 0x34bdb: 0x6de35c20, - 0x34bdc: 0x6de35e20, 0x34bdd: 0x6de36020, 0x34bde: 0x6de36220, 0x34bdf: 0x6de36420, - 0x34be0: 0x6de36620, 0x34be1: 0x6de36820, 0x34be2: 0x6de36a20, 0x34be3: 0x6dfab820, - 0x34be4: 0x6dfaba20, 0x34be5: 0x6dfabc20, 0x34be6: 0x6dfabe20, 0x34be7: 0x6dfac020, - 0x34be8: 0x6dfac220, 0x34be9: 0x6dfac420, 0x34bea: 0x6dfac620, 0x34beb: 0x6dfac820, - 0x34bec: 0x6dfaca20, 0x34bed: 0x6dfacc20, 0x34bee: 0x6e0e2e20, 0x34bef: 0x6e0e3020, - 0x34bf0: 0x6e0e3220, 0x34bf1: 0x6e0e3420, 0x34bf2: 0x6e0e3620, 0x34bf3: 0x6e1d9020, - 0x34bf4: 0x6e1d9220, 0x34bf5: 0x6e291a20, 0x34bf6: 0x6e291c20, 0x34bf7: 0x6e291e20, - 0x34bf8: 0x6e292020, 0x34bf9: 0x6e292220, 0x34bfa: 0x6e292420, 0x34bfb: 0x6e389e20, - 0x34bfc: 0x6e38a020, 0x34bfd: 0x6e404a20, 0x34bfe: 0x6e404c20, 0x34bff: 0x6e42a020, - // Block 0xd30, offset 0x34c00 - 0x34c00: 0x6e442e20, 0x34c01: 0x6c123e20, 0x34c02: 0x6c213e20, 0x34c03: 0x6c357820, - 0x34c04: 0x6c357a20, 0x34c05: 0x6c357c20, 0x34c06: 0x6c507020, 0x34c07: 0x6c507220, - 0x34c08: 0x6c507420, 0x34c09: 0x6c507620, 0x34c0a: 0x6c729220, 0x34c0b: 0x6c728620, - 0x34c0c: 0x6c729420, 0x34c0d: 0x6c729620, 0x34c0e: 0x6c9b1c20, 0x34c0f: 0x6c9b1e20, - 0x34c10: 0x6c9b2020, 0x34c11: 0x6c9b2220, 0x34c12: 0x6c9b2420, 0x34c13: 0x6c9b2620, - 0x34c14: 0x6cc70820, 0x34c15: 0x6cc70a20, 0x34c16: 0x6cc70c20, 0x34c17: 0x6cf59020, - 0x34c18: 0x6cf59220, 0x34c19: 0x6cf59420, 0x34c1a: 0x6d52b420, 0x34c1b: 0x6d52be20, - 0x34c1c: 0x6d52c020, 0x34c1d: 0x6d52c220, 0x34c1e: 0x6d52c420, 0x34c1f: 0x6d52c620, - 0x34c20: 0x6d52c820, 0x34c21: 0x6d52ca20, 0x34c22: 0x6d7e0620, 0x34c23: 0x6d7e0820, - 0x34c24: 0x6da54020, 0x34c25: 0x6dc6d820, 0x34c26: 0x6dc6da20, 0x34c27: 0x6de36e20, - 0x34c28: 0x6dfad020, 0x34c29: 0x6e0e3e20, 0x34c2a: 0x6e0e4020, 0x34c2b: 0x6e292820, - 0x34c2c: 0x6c048820, 0x34c2d: 0x6c214420, 0x34c2e: 0x6c358420, 0x34c2f: 0x6c358620, - 0x34c30: 0x6c358820, 0x34c31: 0x6c507c20, 0x34c32: 0x6c507e20, 0x34c33: 0x6c72a020, - 0x34c34: 0x6c72a220, 0x34c35: 0x6c72a420, 0x34c36: 0x6c72a620, 0x34c37: 0x6c9b2e20, - 0x34c38: 0x6c9b3020, 0x34c39: 0x6c9b3220, 0x34c3a: 0x6c9b3420, 0x34c3b: 0x6c9b3620, - 0x34c3c: 0x6cc71820, 0x34c3d: 0x6cc71a20, 0x34c3e: 0x6cc71c20, 0x34c3f: 0x6cc71e20, - // Block 0xd31, offset 0x34c40 - 0x34c40: 0x6cc72020, 0x34c41: 0x6cf59a20, 0x34c42: 0x6d254c20, 0x34c43: 0x6cf59c20, - 0x34c44: 0x6cf59e20, 0x34c45: 0x6cf5a020, 0x34c46: 0x6d254e20, 0x34c47: 0x6d255020, - 0x34c48: 0x6d255220, 0x34c49: 0x6d52ce20, 0x34c4a: 0x6d52d020, 0x34c4b: 0x6d52d220, - 0x34c4c: 0x6da54620, 0x34c4d: 0x6da54820, 0x34c4e: 0x6dc6de20, 0x34c4f: 0x6de37020, - 0x34c50: 0x6dfad220, 0x34c51: 0x6c048c20, 0x34c52: 0x6c124420, 0x34c53: 0x6c214620, - 0x34c54: 0x6c359220, 0x34c55: 0x6c359420, 0x34c56: 0x6c359620, 0x34c57: 0x6c359820, - 0x34c58: 0x6c359a20, 0x34c59: 0x6c508a20, 0x34c5a: 0x6c508c20, 0x34c5b: 0x6c72ae20, - 0x34c5c: 0x6c72b020, 0x34c5d: 0x6c72b220, 0x34c5e: 0x6c9b3c20, 0x34c5f: 0x6c9b3e20, - 0x34c60: 0x6c9b4020, 0x34c61: 0x6cc72a20, 0x34c62: 0x6cc72c20, 0x34c63: 0x6cc72e20, - 0x34c64: 0x6cc73020, 0x34c65: 0x6cc73220, 0x34c66: 0x6cc73420, 0x34c67: 0x6cc73620, - 0x34c68: 0x6cc73820, 0x34c69: 0x6cc73a20, 0x34c6a: 0x6cc73c20, 0x34c6b: 0x6ca6ac20, - 0x34c6c: 0x6cc73e20, 0x34c6d: 0x6cc74020, 0x34c6e: 0x6cf5a420, 0x34c6f: 0x6cf5a620, - 0x34c70: 0x6cf5a820, 0x34c71: 0x6cf5aa20, 0x34c72: 0x6cf5ac20, 0x34c73: 0x6cf5ae20, - 0x34c74: 0x6cf5b020, 0x34c75: 0x6cf5b220, 0x34c76: 0x6d255a20, 0x34c77: 0x6d255c20, - 0x34c78: 0x6d255e20, 0x34c79: 0x6d256020, 0x34c7a: 0x6d256220, 0x34c7b: 0x6d52da20, - 0x34c7c: 0x6d52dc20, 0x34c7d: 0x6d52de20, 0x34c7e: 0x6d52e020, 0x34c7f: 0x6d52e220, - // Block 0xd32, offset 0x34c80 - 0x34c80: 0x6d7e0e20, 0x34c81: 0x6d7e1020, 0x34c82: 0x6d7e1220, 0x34c83: 0x6d7e1420, - 0x34c84: 0x6d7e1620, 0x34c85: 0x6d7e1820, 0x34c86: 0x6d7e1a20, 0x34c87: 0x6da55020, - 0x34c88: 0x6da55220, 0x34c89: 0x6da55420, 0x34c8a: 0x6da55620, 0x34c8b: 0x6da55820, - 0x34c8c: 0x6dc6e220, 0x34c8d: 0x6dc6e420, 0x34c8e: 0x6dc6e620, 0x34c8f: 0x6dc6e820, - 0x34c90: 0x6dc6ea20, 0x34c91: 0x6de37220, 0x34c92: 0x6de37420, 0x34c93: 0x6de37620, - 0x34c94: 0x6dfad420, 0x34c95: 0x6dfad620, 0x34c96: 0x6e1d9420, 0x34c97: 0x6c124820, - 0x34c98: 0x6c214820, 0x34c99: 0x6c214a20, 0x34c9a: 0x6c35a620, 0x34c9b: 0x6c35a820, - 0x34c9c: 0x6c35aa20, 0x34c9d: 0x6c509820, 0x34c9e: 0x6c509a20, 0x34c9f: 0x6c509c20, - 0x34ca0: 0x6c509e20, 0x34ca1: 0x6c50a020, 0x34ca2: 0x6c50a220, 0x34ca3: 0x6c50a420, - 0x34ca4: 0x6c50a620, 0x34ca5: 0x6c50a820, 0x34ca6: 0x6c72ca20, 0x34ca7: 0x6c72cc20, - 0x34ca8: 0x6c72ce20, 0x34ca9: 0x6c72d020, 0x34caa: 0x6c72d220, 0x34cab: 0x6c72d420, - 0x34cac: 0x6c72d620, 0x34cad: 0x6c72d820, 0x34cae: 0x6c72da20, 0x34caf: 0x6c72dc20, - 0x34cb0: 0x6c72de20, 0x34cb1: 0x6c72e020, 0x34cb2: 0x6c72e220, 0x34cb3: 0x6c9b5820, - 0x34cb4: 0x6c9b5a20, 0x34cb5: 0x6c9b5c20, 0x34cb6: 0x6c9b5e20, 0x34cb7: 0x6c9b6020, - 0x34cb8: 0x6c9b6220, 0x34cb9: 0x6c9b6420, 0x34cba: 0x6c9b6620, 0x34cbb: 0x6c9b6820, - 0x34cbc: 0x6cc74a20, 0x34cbd: 0x6cc74c20, 0x34cbe: 0x6cc74e20, 0x34cbf: 0x6cc75020, - // Block 0xd33, offset 0x34cc0 - 0x34cc0: 0x6cc75220, 0x34cc1: 0x6cc75420, 0x34cc2: 0x6cc75620, 0x34cc3: 0x6cc75820, - 0x34cc4: 0x6cc75a20, 0x34cc5: 0x6cc75c20, 0x34cc6: 0x6cc75e20, 0x34cc7: 0x6cc76020, - 0x34cc8: 0x6cf5be20, 0x34cc9: 0x6cf5c020, 0x34cca: 0x6cf5c220, 0x34ccb: 0x6cf5c420, - 0x34ccc: 0x6cf5c620, 0x34ccd: 0x6cf5c820, 0x34cce: 0x6d256820, 0x34ccf: 0x6d256a20, - 0x34cd0: 0x6d256c20, 0x34cd1: 0x6d256e20, 0x34cd2: 0x6d257020, 0x34cd3: 0x6d257220, - 0x34cd4: 0x6d52e820, 0x34cd5: 0x6d52ea20, 0x34cd6: 0x6d52ec20, 0x34cd7: 0x6d7e2020, - 0x34cd8: 0x6d7e2220, 0x34cd9: 0x6d7e2420, 0x34cda: 0x6d7e2620, 0x34cdb: 0x6d7e2820, - 0x34cdc: 0x6d7e2a20, 0x34cdd: 0x6da55c20, 0x34cde: 0x6dc6ee20, 0x34cdf: 0x6dc6f020, - 0x34ce0: 0x6dc6f220, 0x34ce1: 0x6dc6f420, 0x34ce2: 0x6dc6f620, 0x34ce3: 0x6dc6f820, - 0x34ce4: 0x6de37e20, 0x34ce5: 0x6dfada20, 0x34ce6: 0x6e0e4420, 0x34ce7: 0x6e1d9620, - 0x34ce8: 0x6e1d9820, 0x34ce9: 0x6e292c20, 0x34cea: 0x6e324820, 0x34ceb: 0x6e38a420, - 0x34cec: 0x6e3d2e20, 0x34ced: 0x6c124a20, 0x34cee: 0x6c214c20, 0x34cef: 0x6c214e20, - 0x34cf0: 0x6c50ae20, 0x34cf1: 0x6c72ea20, 0x34cf2: 0x6c72ec20, 0x34cf3: 0x6c72ee20, - 0x34cf4: 0x6cc76a20, 0x34cf5: 0x6cc76c20, 0x34cf6: 0x6cf5d020, 0x34cf7: 0x6cf5d220, - 0x34cf8: 0x6cf5d420, 0x34cf9: 0x6d52f220, 0x34cfa: 0x6d7e3020, 0x34cfb: 0x6c095820, - 0x34cfc: 0x6c095a20, 0x34cfd: 0x6c095c20, 0x34cfe: 0x6c126020, 0x34cff: 0x6c126220, - // Block 0xd34, offset 0x34d00 - 0x34d00: 0x6c126420, 0x34d01: 0x6c126620, 0x34d02: 0x6c126820, 0x34d03: 0x6c126a20, - 0x34d04: 0x6c216e20, 0x34d05: 0x6c126c20, 0x34d06: 0x6c217020, 0x34d07: 0x6c217220, - 0x34d08: 0x6c217420, 0x34d09: 0x6c217620, 0x34d0a: 0x6c217820, 0x34d0b: 0x6c217a20, - 0x34d0c: 0x6c217c20, 0x34d0d: 0x6c217e20, 0x34d0e: 0x6c218020, 0x34d0f: 0x6c218220, - 0x34d10: 0x6c218420, 0x34d11: 0x6c218620, 0x34d12: 0x6c218820, 0x34d13: 0x6c218a20, - 0x34d14: 0x6c218c20, 0x34d15: 0x6c218e20, 0x34d16: 0x6c219020, 0x34d17: 0x6c219220, - 0x34d18: 0x6c219420, 0x34d19: 0x6c219620, 0x34d1a: 0x6c35f820, 0x34d1b: 0x6c35fa20, - 0x34d1c: 0x6c35fc20, 0x34d1d: 0x6c35fe20, 0x34d1e: 0x6c360020, 0x34d1f: 0x6c360220, - 0x34d20: 0x6c360420, 0x34d21: 0x6c360620, 0x34d22: 0x6c360820, 0x34d23: 0x6c360a20, - 0x34d24: 0x6c360c20, 0x34d25: 0x6c360e20, 0x34d26: 0x6c361020, 0x34d27: 0x6c361220, - 0x34d28: 0x6c361420, 0x34d29: 0x6c361620, 0x34d2a: 0x6c361820, 0x34d2b: 0x6c361a20, - 0x34d2c: 0x6c361c20, 0x34d2d: 0x6c361e20, 0x34d2e: 0x6c362020, 0x34d2f: 0x6c362220, - 0x34d30: 0x6c362420, 0x34d31: 0x6c362620, 0x34d32: 0x6c362820, 0x34d33: 0x6c362a20, - 0x34d34: 0x6c362c20, 0x34d35: 0x6c362e20, 0x34d36: 0x6c363020, 0x34d37: 0x6c511020, - 0x34d38: 0x6c511220, 0x34d39: 0x6c511420, 0x34d3a: 0x6c511620, 0x34d3b: 0x6c511820, - 0x34d3c: 0x6c511a20, 0x34d3d: 0x6c511c20, 0x34d3e: 0x6c511e20, 0x34d3f: 0x6c512020, - // Block 0xd35, offset 0x34d40 - 0x34d40: 0x6c512220, 0x34d41: 0x6c512420, 0x34d42: 0x6c512620, 0x34d43: 0x6c512820, - 0x34d44: 0x6c512a20, 0x34d45: 0x6c512c20, 0x34d46: 0x6c512e20, 0x34d47: 0x6c513020, - 0x34d48: 0x6c513220, 0x34d49: 0x6c515e20, 0x34d4a: 0x6c513420, 0x34d4b: 0x6c513620, - 0x34d4c: 0x6c513820, 0x34d4d: 0x6c513a20, 0x34d4e: 0x6c513c20, 0x34d4f: 0x6c513e20, - 0x34d50: 0x6c514020, 0x34d51: 0x6c514220, 0x34d52: 0x6c733220, 0x34d53: 0x6c733420, - 0x34d54: 0x6c733620, 0x34d55: 0x6c733820, 0x34d56: 0x6c733a20, 0x34d57: 0x6c733c20, - 0x34d58: 0x6c733e20, 0x34d59: 0x6c734020, 0x34d5a: 0x6c734220, 0x34d5b: 0x6c734420, - 0x34d5c: 0x6c734620, 0x34d5d: 0x6c734820, 0x34d5e: 0x6c734a20, 0x34d5f: 0x6c734c20, - 0x34d60: 0x6c734e20, 0x34d61: 0x6c735020, 0x34d62: 0x6c735220, 0x34d63: 0x6c735420, - 0x34d64: 0x6c735620, 0x34d65: 0x6c735820, 0x34d66: 0x6c735a20, 0x34d67: 0x6c735c20, - 0x34d68: 0x6c735e20, 0x34d69: 0x6c736020, 0x34d6a: 0x6c736220, 0x34d6b: 0x6c736420, - 0x34d6c: 0x6c736620, 0x34d6d: 0x6c736820, 0x34d6e: 0x6c736a20, 0x34d6f: 0x6c736c20, - 0x34d70: 0x6c736e20, 0x34d71: 0x6c737020, 0x34d72: 0x6c9ba220, 0x34d73: 0x6c9ba420, - 0x34d74: 0x6c9ba620, 0x34d75: 0x6c9ba820, 0x34d76: 0x6c9baa20, 0x34d77: 0x6c9bac20, - 0x34d78: 0x6c9bae20, 0x34d79: 0x6c9bb020, 0x34d7a: 0x6c9bb220, 0x34d7b: 0x6c9bb420, - 0x34d7c: 0x6c9bb620, 0x34d7d: 0x6c9bb820, 0x34d7e: 0x6c9bba20, 0x34d7f: 0x6c9bbc20, - // Block 0xd36, offset 0x34d80 - 0x34d80: 0x6c9bbe20, 0x34d81: 0x6c9bc020, 0x34d82: 0x6c9bc220, 0x34d83: 0x6c9bc420, - 0x34d84: 0x6c9bc620, 0x34d85: 0x6c9bc820, 0x34d86: 0x6c9bca20, 0x34d87: 0x6c9bcc20, - 0x34d88: 0x6c9bce20, 0x34d89: 0x6c9bd020, 0x34d8a: 0x6c9bd220, 0x34d8b: 0x6c9bd420, - 0x34d8c: 0x6c9bd620, 0x34d8d: 0x6c9bd820, 0x34d8e: 0x6c9bda20, 0x34d8f: 0x6c9bdc20, - 0x34d90: 0x6c9bde20, 0x34d91: 0x6c9be020, 0x34d92: 0x6c9be220, 0x34d93: 0x6c9be420, - 0x34d94: 0x6c9be620, 0x34d95: 0x6c9be820, 0x34d96: 0x6c9bea20, 0x34d97: 0x6c9bec20, - 0x34d98: 0x6c9bee20, 0x34d99: 0x6c9bf020, 0x34d9a: 0x6c9bf220, 0x34d9b: 0x6c9bf420, - 0x34d9c: 0x6c9bf620, 0x34d9d: 0x6c9bf820, 0x34d9e: 0x6c9bfa20, 0x34d9f: 0x6c9bfc20, - 0x34da0: 0x6c9bfe20, 0x34da1: 0x6c9c0020, 0x34da2: 0x6cc7ba20, 0x34da3: 0x6cc7bc20, - 0x34da4: 0x6cc7be20, 0x34da5: 0x6cc7c020, 0x34da6: 0x6cc7c220, 0x34da7: 0x6cc7c420, - 0x34da8: 0x6cc7c620, 0x34da9: 0x6cc7c820, 0x34daa: 0x6cc7ca20, 0x34dab: 0x6cc7cc20, - 0x34dac: 0x6cc7ce20, 0x34dad: 0x6cc7d020, 0x34dae: 0x6cc7d220, 0x34daf: 0x6cc7d420, - 0x34db0: 0x6cc7d620, 0x34db1: 0x6cc7d820, 0x34db2: 0x6cc7da20, 0x34db3: 0x6cc7dc20, - 0x34db4: 0x6cc7de20, 0x34db5: 0x6cc7e020, 0x34db6: 0x6cc7e220, 0x34db7: 0x6cc7e420, - 0x34db8: 0x6cc7e620, 0x34db9: 0x6cc7e820, 0x34dba: 0x6cc7ea20, 0x34dbb: 0x6cc7ec20, - 0x34dbc: 0x6cc7ee20, 0x34dbd: 0x6cc7f020, 0x34dbe: 0x6cc7f220, 0x34dbf: 0x6cc7f420, - // Block 0xd37, offset 0x34dc0 - 0x34dc0: 0x6cc7f620, 0x34dc1: 0x6cc7f820, 0x34dc2: 0x6cc7fa20, 0x34dc3: 0x6cc7fc20, - 0x34dc4: 0x6cc7fe20, 0x34dc5: 0x6cc80020, 0x34dc6: 0x6cc80220, 0x34dc7: 0x6cc80420, - 0x34dc8: 0x6cc80620, 0x34dc9: 0x6cc80820, 0x34dca: 0x6cc80a20, 0x34dcb: 0x6cc80c20, - 0x34dcc: 0x6cc80e20, 0x34dcd: 0x6cc81020, 0x34dce: 0x6cc81220, 0x34dcf: 0x6cc81420, - 0x34dd0: 0x6cc81620, 0x34dd1: 0x6cc81820, 0x34dd2: 0x6cc81a20, 0x34dd3: 0x6cc81c20, - 0x34dd4: 0x6cc81e20, 0x34dd5: 0x6cc82020, 0x34dd6: 0x6cc82220, 0x34dd7: 0x6cc82420, - 0x34dd8: 0x6cc82620, 0x34dd9: 0x6cc82820, 0x34dda: 0x6cc82a20, 0x34ddb: 0x6cc82c20, - 0x34ddc: 0x6cc82e20, 0x34ddd: 0x6cc83020, 0x34dde: 0x6cc83220, 0x34ddf: 0x6cc83420, - 0x34de0: 0x6cc83620, 0x34de1: 0x6cc83820, 0x34de2: 0x6cc83a20, 0x34de3: 0x6cc83c20, - 0x34de4: 0x6cf61a20, 0x34de5: 0x6cf61c20, 0x34de6: 0x6cf61e20, 0x34de7: 0x6cf62020, - 0x34de8: 0x6cf62220, 0x34de9: 0x6cf62420, 0x34dea: 0x6cf62620, 0x34deb: 0x6cf62820, - 0x34dec: 0x6cf62a20, 0x34ded: 0x6cf62c20, 0x34dee: 0x6cf62e20, 0x34def: 0x6cf63020, - 0x34df0: 0x6cf63220, 0x34df1: 0x6cf63420, 0x34df2: 0x6cf63620, 0x34df3: 0x6cf63820, - 0x34df4: 0x6cf63a20, 0x34df5: 0x6cf63c20, 0x34df6: 0x6cf63e20, 0x34df7: 0x6cf64020, - 0x34df8: 0x6cf64220, 0x34df9: 0x6cf64420, 0x34dfa: 0x6cf64620, 0x34dfb: 0x6cf64820, - 0x34dfc: 0x6cf64a20, 0x34dfd: 0x6cf64c20, 0x34dfe: 0x6cf64e20, 0x34dff: 0x6cf65020, - // Block 0xd38, offset 0x34e00 - 0x34e00: 0x6cf65220, 0x34e01: 0x6cf65420, 0x34e02: 0x6cf65620, 0x34e03: 0x6cf65820, - 0x34e04: 0x6cf65a20, 0x34e05: 0x6cf65c20, 0x34e06: 0x6cf65e20, 0x34e07: 0x6cf66020, - 0x34e08: 0x6cf66220, 0x34e09: 0x6cf66420, 0x34e0a: 0x6cf66620, 0x34e0b: 0x6cf66820, - 0x34e0c: 0x6cf66a20, 0x34e0d: 0x6cf66c20, 0x34e0e: 0x6cf66e20, 0x34e0f: 0x6cf67020, - 0x34e10: 0x6cf67220, 0x34e11: 0x6cf67420, 0x34e12: 0x6d259c20, 0x34e13: 0x6d259e20, - 0x34e14: 0x6d25a020, 0x34e15: 0x6d25a220, 0x34e16: 0x6d25a420, 0x34e17: 0x6d25a620, - 0x34e18: 0x6d25a820, 0x34e19: 0x6d25aa20, 0x34e1a: 0x6d25ac20, 0x34e1b: 0x6d25ae20, - 0x34e1c: 0x6d25b020, 0x34e1d: 0x6d25b220, 0x34e1e: 0x6d25b420, 0x34e1f: 0x6d25b620, - 0x34e20: 0x6d25b820, 0x34e21: 0x6cf1ac20, 0x34e22: 0x6d25ba20, 0x34e23: 0x6d25bc20, - 0x34e24: 0x6d25be20, 0x34e25: 0x6d25c020, 0x34e26: 0x6d25c220, 0x34e27: 0x6d25c420, - 0x34e28: 0x6d25c620, 0x34e29: 0x6d25c820, 0x34e2a: 0x6d25ca20, 0x34e2b: 0x6d25cc20, - 0x34e2c: 0x6d25ce20, 0x34e2d: 0x6d25d020, 0x34e2e: 0x6d25d220, 0x34e2f: 0x6d25d420, - 0x34e30: 0x6d25d620, 0x34e31: 0x6d25d820, 0x34e32: 0x6d25da20, 0x34e33: 0x6d25dc20, - 0x34e34: 0x6d25de20, 0x34e35: 0x6d25e020, 0x34e36: 0x6d25e220, 0x34e37: 0x6d25e420, - 0x34e38: 0x6d25e620, 0x34e39: 0x6d25e820, 0x34e3a: 0x6d25ea20, 0x34e3b: 0x6d531e20, - 0x34e3c: 0x6d532020, 0x34e3d: 0x6d532220, 0x34e3e: 0x6d532420, 0x34e3f: 0x6d532620, - // Block 0xd39, offset 0x34e40 - 0x34e40: 0x6d532820, 0x34e41: 0x6d532a20, 0x34e42: 0x6d532c20, 0x34e43: 0x6d532e20, - 0x34e44: 0x6d533020, 0x34e45: 0x6d533220, 0x34e46: 0x6d533420, 0x34e47: 0x6d533620, - 0x34e48: 0x6d533820, 0x34e49: 0x6d7e7020, 0x34e4a: 0x6d533a20, 0x34e4b: 0x6d533c20, - 0x34e4c: 0x6d533e20, 0x34e4d: 0x6d534020, 0x34e4e: 0x6d534220, 0x34e4f: 0x6d534420, - 0x34e50: 0x6d534620, 0x34e51: 0x6d534820, 0x34e52: 0x6d4d3220, 0x34e53: 0x6d534a20, - 0x34e54: 0x6d534c20, 0x34e55: 0x6d534e20, 0x34e56: 0x6d535020, 0x34e57: 0x6d535220, - 0x34e58: 0x6d535420, 0x34e59: 0x6d535620, 0x34e5a: 0x6d535820, 0x34e5b: 0x6d535a20, - 0x34e5c: 0x6d535c20, 0x34e5d: 0x6d535e20, 0x34e5e: 0x6d7e7220, 0x34e5f: 0x6d7e7420, - 0x34e60: 0x6d7e7620, 0x34e61: 0x6d7e7820, 0x34e62: 0x6d7e7a20, 0x34e63: 0x6d7e7c20, - 0x34e64: 0x6d7e7e20, 0x34e65: 0x6d7e8020, 0x34e66: 0x6d7e8220, 0x34e67: 0x6d7e8420, - 0x34e68: 0x6d7e8620, 0x34e69: 0x6d7e8820, 0x34e6a: 0x6d7e8a20, 0x34e6b: 0x6d7e8c20, - 0x34e6c: 0x6d7e8e20, 0x34e6d: 0x6d7e9020, 0x34e6e: 0x6d7e9220, 0x34e6f: 0x6d7e9420, - 0x34e70: 0x6d7e9620, 0x34e71: 0x6d7e9820, 0x34e72: 0x6d7e9a20, 0x34e73: 0x6d7e9c20, - 0x34e74: 0x6d7e9e20, 0x34e75: 0x6d7ea020, 0x34e76: 0x6d7ea220, 0x34e77: 0x6d7ea420, - 0x34e78: 0x6d7ea620, 0x34e79: 0x6d7ea820, 0x34e7a: 0x6d7eaa20, 0x34e7b: 0x6d7eac20, - 0x34e7c: 0x6d7eae20, 0x34e7d: 0x6d7eb020, 0x34e7e: 0x6d7eb220, 0x34e7f: 0x6d7eb420, - // Block 0xd3a, offset 0x34e80 - 0x34e80: 0x6d7eb620, 0x34e81: 0x6d7eb820, 0x34e82: 0x6d7eba20, 0x34e83: 0x6d7ebc20, - 0x34e84: 0x6d7ebe20, 0x34e85: 0x6d7ec020, 0x34e86: 0x6d7ec220, 0x34e87: 0x6d536020, - 0x34e88: 0x6d7ec420, 0x34e89: 0x6da57a20, 0x34e8a: 0x6da57c20, 0x34e8b: 0x6da57e20, - 0x34e8c: 0x6da58020, 0x34e8d: 0x6da58220, 0x34e8e: 0x6da58420, 0x34e8f: 0x6da58620, - 0x34e90: 0x6da58820, 0x34e91: 0x6da58a20, 0x34e92: 0x6da58c20, 0x34e93: 0x6da58e20, - 0x34e94: 0x6da59020, 0x34e95: 0x6da59220, 0x34e96: 0x6da59420, 0x34e97: 0x6da59620, - 0x34e98: 0x6da59820, 0x34e99: 0x6da59a20, 0x34e9a: 0x6da59c20, 0x34e9b: 0x6da59e20, - 0x34e9c: 0x6da5a020, 0x34e9d: 0x6da5a220, 0x34e9e: 0x6dc70e20, 0x34e9f: 0x6dc71020, - 0x34ea0: 0x6dc71220, 0x34ea1: 0x6dc71420, 0x34ea2: 0x6dc71620, 0x34ea3: 0x6dc71820, - 0x34ea4: 0x6dc71a20, 0x34ea5: 0x6dc71c20, 0x34ea6: 0x6dc71e20, 0x34ea7: 0x6dc72020, - 0x34ea8: 0x6dc72220, 0x34ea9: 0x6dc72420, 0x34eaa: 0x6dc72620, 0x34eab: 0x6dc72820, - 0x34eac: 0x6dc72a20, 0x34ead: 0x6dc72c20, 0x34eae: 0x6dc72e20, 0x34eaf: 0x6dc73020, - 0x34eb0: 0x6dc73220, 0x34eb1: 0x6dc73420, 0x34eb2: 0x6de39420, 0x34eb3: 0x6de39620, - 0x34eb4: 0x6de39820, 0x34eb5: 0x6de39a20, 0x34eb6: 0x6de39c20, 0x34eb7: 0x6de39e20, - 0x34eb8: 0x6de3a020, 0x34eb9: 0x6de3a220, 0x34eba: 0x6de3a420, 0x34ebb: 0x6de3a620, - 0x34ebc: 0x6de3a820, 0x34ebd: 0x6de3aa20, 0x34ebe: 0x6de3ac20, 0x34ebf: 0x6dfaec20, - // Block 0xd3b, offset 0x34ec0 - 0x34ec0: 0x6dfaee20, 0x34ec1: 0x6dfaf020, 0x34ec2: 0x6dfaf220, 0x34ec3: 0x6dfaf420, - 0x34ec4: 0x6dfaf620, 0x34ec5: 0x6dfaf820, 0x34ec6: 0x6dfafa20, 0x34ec7: 0x6dfafc20, - 0x34ec8: 0x6e0e4820, 0x34ec9: 0x6e0e4a20, 0x34eca: 0x6e0e4c20, 0x34ecb: 0x6e0e4e20, - 0x34ecc: 0x6e0e5020, 0x34ecd: 0x6e1d9e20, 0x34ece: 0x6e1da020, 0x34ecf: 0x6e1da220, - 0x34ed0: 0x6e1da420, 0x34ed1: 0x6e1da620, 0x34ed2: 0x6e1da820, 0x34ed3: 0x6e1daa20, - 0x34ed4: 0x6e1dac20, 0x34ed5: 0x6e1dae20, 0x34ed6: 0x6e293620, 0x34ed7: 0x6e324e20, - 0x34ed8: 0x6e325020, 0x34ed9: 0x6e325220, 0x34eda: 0x6e348820, 0x34edb: 0x6e325420, - 0x34edc: 0x6e38aa20, 0x34edd: 0x6e38ac20, 0x34ede: 0x6e40ba20, 0x34edf: 0x6e42a220, - 0x34ee0: 0x6e46e620, 0x34ee1: 0x6c21a020, 0x34ee2: 0x6c21a220, 0x34ee3: 0x6c364220, - 0x34ee4: 0x6c364420, 0x34ee5: 0x6c364620, 0x34ee6: 0x6c364820, 0x34ee7: 0x6c516020, - 0x34ee8: 0x6c516220, 0x34ee9: 0x6c516420, 0x34eea: 0x6c516620, 0x34eeb: 0x6c516820, - 0x34eec: 0x6c516a20, 0x34eed: 0x6c739420, 0x34eee: 0x6c739620, 0x34eef: 0x6c739820, - 0x34ef0: 0x6c739a20, 0x34ef1: 0x6c739c20, 0x34ef2: 0x6c739e20, 0x34ef3: 0x6c73a020, - 0x34ef4: 0x6c73a220, 0x34ef5: 0x6c73a420, 0x34ef6: 0x6c73a620, 0x34ef7: 0x6c9c0e20, - 0x34ef8: 0x6c9c1020, 0x34ef9: 0x6c9c1220, 0x34efa: 0x6c9c1420, 0x34efb: 0x6cc85220, - 0x34efc: 0x6cc85420, 0x34efd: 0x6cc85620, 0x34efe: 0x6cf68a20, 0x34eff: 0x6cf68c20, - // Block 0xd3c, offset 0x34f00 - 0x34f00: 0x6cf68e20, 0x34f01: 0x6cf69020, 0x34f02: 0x6cf69220, 0x34f03: 0x6d25fc20, - 0x34f04: 0x6d25fe20, 0x34f05: 0x6d260020, 0x34f06: 0x6d537420, 0x34f07: 0x6d537620, - 0x34f08: 0x6d537820, 0x34f09: 0x6d537a20, 0x34f0a: 0x6d537c20, 0x34f0b: 0x6d7ed820, - 0x34f0c: 0x6d7eda20, 0x34f0d: 0x6d7edc20, 0x34f0e: 0x6d7ede20, 0x34f0f: 0x6da5ac20, - 0x34f10: 0x6da5ae20, 0x34f11: 0x6dc73e20, 0x34f12: 0x6dc74020, 0x34f13: 0x6dc74220, - 0x34f14: 0x6dc74420, 0x34f15: 0x6dc74620, 0x34f16: 0x6de3ae20, 0x34f17: 0x6de3b020, - 0x34f18: 0x6dfafe20, 0x34f19: 0x6dfb0020, 0x34f1a: 0x6e325820, 0x34f1b: 0x6e42a420, - 0x34f1c: 0x6e46c620, 0x34f1d: 0x6c096020, 0x34f1e: 0x6c127620, 0x34f1f: 0x6c21a420, - 0x34f20: 0x6c21a620, 0x34f21: 0x6c21a820, 0x34f22: 0x6c21aa20, 0x34f23: 0x6c21ac20, - 0x34f24: 0x6c365420, 0x34f25: 0x6c517420, 0x34f26: 0x6c517620, 0x34f27: 0x6c517820, - 0x34f28: 0x6c5dc820, 0x34f29: 0x6c517a20, 0x34f2a: 0x6c517c20, 0x34f2b: 0x6c517e20, - 0x34f2c: 0x6c518020, 0x34f2d: 0x6c73b620, 0x34f2e: 0x6c73b820, 0x34f2f: 0x6c825c20, - 0x34f30: 0x6c825e20, 0x34f31: 0x6c9c2420, 0x34f32: 0x6c9c2620, 0x34f33: 0x6c9c2820, - 0x34f34: 0x6c9c2a20, 0x34f35: 0x6c9c2c20, 0x34f36: 0x6c9c2e20, 0x34f37: 0x6cc86220, - 0x34f38: 0x6cc86420, 0x34f39: 0x6cc86620, 0x34f3a: 0x6cc86820, 0x34f3b: 0x6cc86a20, - 0x34f3c: 0x6cc86c20, 0x34f3d: 0x6cc86e20, 0x34f3e: 0x6cc87020, 0x34f3f: 0x6cc87220, - // Block 0xd3d, offset 0x34f40 - 0x34f40: 0x6cc87420, 0x34f41: 0x6cc87620, 0x34f42: 0x6cc87820, 0x34f43: 0x6cc87a20, - 0x34f44: 0x6cf69820, 0x34f45: 0x6cf69a20, 0x34f46: 0x6cf69c20, 0x34f47: 0x6cf69e20, - 0x34f48: 0x6cf6a020, 0x34f49: 0x6cf6a220, 0x34f4a: 0x6cf6a420, 0x34f4b: 0x6cf6a620, - 0x34f4c: 0x6cf6a820, 0x34f4d: 0x6d260820, 0x34f4e: 0x6d260a20, 0x34f4f: 0x6d260c20, - 0x34f50: 0x6d260e20, 0x34f51: 0x6d261020, 0x34f52: 0x6d538820, 0x34f53: 0x6d538a20, - 0x34f54: 0x6d538c20, 0x34f55: 0x6d538e20, 0x34f56: 0x6d539020, 0x34f57: 0x6d539220, - 0x34f58: 0x6d539420, 0x34f59: 0x6d539620, 0x34f5a: 0x6d7eec20, 0x34f5b: 0x6d7eee20, - 0x34f5c: 0x6da5b220, 0x34f5d: 0x6d7ef020, 0x34f5e: 0x6d7ef220, 0x34f5f: 0x6d7ef420, - 0x34f60: 0x6d7ef620, 0x34f61: 0x6d7ef820, 0x34f62: 0x6d7efa20, 0x34f63: 0x6da5b420, - 0x34f64: 0x6da5b620, 0x34f65: 0x6da5b820, 0x34f66: 0x6da5ba20, 0x34f67: 0x6da5bc20, - 0x34f68: 0x6da5be20, 0x34f69: 0x6dc74a20, 0x34f6a: 0x6dc74c20, 0x34f6b: 0x6dc74e20, - 0x34f6c: 0x6dc75020, 0x34f6d: 0x6dc75220, 0x34f6e: 0x6dfb0420, 0x34f6f: 0x6dfb0620, - 0x34f70: 0x6e1db020, 0x34f71: 0x6e293820, 0x34f72: 0x6e325a20, 0x34f73: 0x6c04a220, - 0x34f74: 0x6c04a420, 0x34f75: 0x6c097020, 0x34f76: 0x6c097220, 0x34f77: 0x6c097420, - 0x34f78: 0x6c12a220, 0x34f79: 0x6c12a420, 0x34f7a: 0x6c12a620, 0x34f7b: 0x6c12a820, - 0x34f7c: 0x6c12aa20, 0x34f7d: 0x6c12ac20, 0x34f7e: 0x6c12ae20, 0x34f7f: 0x6c12b020, - // Block 0xd3e, offset 0x34f80 - 0x34f80: 0x6c12b220, 0x34f81: 0x6c220820, 0x34f82: 0x6c220a20, 0x34f83: 0x6c220c20, - 0x34f84: 0x6c220e20, 0x34f85: 0x6c221020, 0x34f86: 0x6c221220, 0x34f87: 0x6c221420, - 0x34f88: 0x6c221620, 0x34f89: 0x6c221820, 0x34f8a: 0x6c221a20, 0x34f8b: 0x6c221c20, - 0x34f8c: 0x6c221e20, 0x34f8d: 0x6c222020, 0x34f8e: 0x6c222220, 0x34f8f: 0x6c222420, - 0x34f90: 0x6c222620, 0x34f91: 0x6c222820, 0x34f92: 0x6c222a20, 0x34f93: 0x6c222c20, - 0x34f94: 0x6c36f220, 0x34f95: 0x6c36f420, 0x34f96: 0x6c36f620, 0x34f97: 0x6c36f820, - 0x34f98: 0x6c36fa20, 0x34f99: 0x6c36fc20, 0x34f9a: 0x6c36fe20, 0x34f9b: 0x6c370020, - 0x34f9c: 0x6c370220, 0x34f9d: 0x6c370420, 0x34f9e: 0x6c370620, 0x34f9f: 0x6c370820, - 0x34fa0: 0x6c370a20, 0x34fa1: 0x6c370c20, 0x34fa2: 0x6c370e20, 0x34fa3: 0x6c371020, - 0x34fa4: 0x6c371220, 0x34fa5: 0x6c371420, 0x34fa6: 0x6c371620, 0x34fa7: 0x6c371820, - 0x34fa8: 0x6c371a20, 0x34fa9: 0x6c371c20, 0x34faa: 0x6c371e20, 0x34fab: 0x6c372020, - 0x34fac: 0x6c372220, 0x34fad: 0x6c372420, 0x34fae: 0x6c372620, 0x34faf: 0x6c372820, - 0x34fb0: 0x6c372a20, 0x34fb1: 0x6c372c20, 0x34fb2: 0x6c372e20, 0x34fb3: 0x6c373020, - 0x34fb4: 0x6c373220, 0x34fb5: 0x6c373420, 0x34fb6: 0x6c373620, 0x34fb7: 0x6c373820, - 0x34fb8: 0x6c373a20, 0x34fb9: 0x6c373c20, 0x34fba: 0x6c373e20, 0x34fbb: 0x6c374020, - 0x34fbc: 0x6c374220, 0x34fbd: 0x6c374420, 0x34fbe: 0x6c374620, 0x34fbf: 0x6c374820, - // Block 0xd3f, offset 0x34fc0 - 0x34fc0: 0x6c374a20, 0x34fc1: 0x6c374c20, 0x34fc2: 0x6c374e20, 0x34fc3: 0x6c375020, - 0x34fc4: 0x6c375220, 0x34fc5: 0x6c375420, 0x34fc6: 0x6c375620, 0x34fc7: 0x6c375820, - 0x34fc8: 0x6c525420, 0x34fc9: 0x6c525620, 0x34fca: 0x6c525820, 0x34fcb: 0x6c525a20, - 0x34fcc: 0x6c525c20, 0x34fcd: 0x6c525e20, 0x34fce: 0x6c526020, 0x34fcf: 0x6c526220, - 0x34fd0: 0x6c526420, 0x34fd1: 0x6c526620, 0x34fd2: 0x6c526820, 0x34fd3: 0x6c526a20, - 0x34fd4: 0x6c526c20, 0x34fd5: 0x6c526e20, 0x34fd6: 0x6c527020, 0x34fd7: 0x6c527220, - 0x34fd8: 0x6c527420, 0x34fd9: 0x6c527620, 0x34fda: 0x6c527820, 0x34fdb: 0x6c527a20, - 0x34fdc: 0x6c527c20, 0x34fdd: 0x6c527e20, 0x34fde: 0x6c528020, 0x34fdf: 0x6c528220, - 0x34fe0: 0x6c528420, 0x34fe1: 0x6c528620, 0x34fe2: 0x6c528820, 0x34fe3: 0x6c528a20, - 0x34fe4: 0x6c528c20, 0x34fe5: 0x6c528e20, 0x34fe6: 0x6c529020, 0x34fe7: 0x6c529220, - 0x34fe8: 0x6c529420, 0x34fe9: 0x6c529620, 0x34fea: 0x6c529820, 0x34feb: 0x6c529a20, - 0x34fec: 0x6c529c20, 0x34fed: 0x6c529e20, 0x34fee: 0x6c52a020, 0x34fef: 0x6c52a220, - 0x34ff0: 0x6c52a420, 0x34ff1: 0x6c52a620, 0x34ff2: 0x6c52a820, 0x34ff3: 0x6c52aa20, - 0x34ff4: 0x6c52ac20, 0x34ff5: 0x6c749820, 0x34ff6: 0x6c749a20, 0x34ff7: 0x6c749c20, - 0x34ff8: 0x6c749e20, 0x34ff9: 0x6c74a020, 0x34ffa: 0x6c74a220, 0x34ffb: 0x6c74a420, - 0x34ffc: 0x6c74a620, 0x34ffd: 0x6c74a820, 0x34ffe: 0x6c74aa20, 0x34fff: 0x6c74ac20, - // Block 0xd40, offset 0x35000 - 0x35000: 0x6c74ae20, 0x35001: 0x6c74b020, 0x35002: 0x6c74b220, 0x35003: 0x6c74b420, - 0x35004: 0x6c74b620, 0x35005: 0x6c74b820, 0x35006: 0x6c74ba20, 0x35007: 0x6c74bc20, - 0x35008: 0x6c74be20, 0x35009: 0x6c74c020, 0x3500a: 0x6c74c220, 0x3500b: 0x6c74c420, - 0x3500c: 0x6c74c620, 0x3500d: 0x6c74c820, 0x3500e: 0x6c74ca20, 0x3500f: 0x6c74cc20, - 0x35010: 0x6c74ce20, 0x35011: 0x6c74d020, 0x35012: 0x6c74d220, 0x35013: 0x6c74d420, - 0x35014: 0x6c74d620, 0x35015: 0x6c74d820, 0x35016: 0x6c74da20, 0x35017: 0x6c74dc20, - 0x35018: 0x6c74de20, 0x35019: 0x6c74e020, 0x3501a: 0x6c74e220, 0x3501b: 0x6c74e420, - 0x3501c: 0x6c74e620, 0x3501d: 0x6c74e820, 0x3501e: 0x6c74ea20, 0x3501f: 0x6c74ec20, - 0x35020: 0x6c74ee20, 0x35021: 0x6c74f020, 0x35022: 0x6c74f220, 0x35023: 0x6c74f420, - 0x35024: 0x6c74f620, 0x35025: 0x6c74f820, 0x35026: 0x6c74fa20, 0x35027: 0x6c6a4c20, - 0x35028: 0x6c74fc20, 0x35029: 0x6c74fe20, 0x3502a: 0x6c750020, 0x3502b: 0x6c750220, - 0x3502c: 0x6c750420, 0x3502d: 0x6c750620, 0x3502e: 0x6c750820, 0x3502f: 0x6c750a20, - 0x35030: 0x6c750c20, 0x35031: 0x6c750e20, 0x35032: 0x6c751020, 0x35033: 0x6c751220, - 0x35034: 0x6c751420, 0x35035: 0x6c751620, 0x35036: 0x6c751820, 0x35037: 0x6c751a20, - 0x35038: 0x6c751c20, 0x35039: 0x6c751e20, 0x3503a: 0x6c752020, 0x3503b: 0x6c752220, - 0x3503c: 0x6c752420, 0x3503d: 0x6c752620, 0x3503e: 0x6c752820, 0x3503f: 0x6c9d0220, - // Block 0xd41, offset 0x35040 - 0x35040: 0x6c9d0420, 0x35041: 0x6c9d0620, 0x35042: 0x6c9d0820, 0x35043: 0x6c9d0a20, - 0x35044: 0x6c9d0c20, 0x35045: 0x6c9d0e20, 0x35046: 0x6c9d1020, 0x35047: 0x6c9d1220, - 0x35048: 0x6c9d1420, 0x35049: 0x6c9d1620, 0x3504a: 0x6c9d1820, 0x3504b: 0x6c9d1a20, - 0x3504c: 0x6c9d1c20, 0x3504d: 0x6c9d1e20, 0x3504e: 0x6c9d2020, 0x3504f: 0x6c9d2220, - 0x35050: 0x6c9d2420, 0x35051: 0x6c9d2620, 0x35052: 0x6c9d2820, 0x35053: 0x6c9d2a20, - 0x35054: 0x6c9d2c20, 0x35055: 0x6c9d2e20, 0x35056: 0x6c9d3020, 0x35057: 0x6c9d3220, - 0x35058: 0x6c9d3420, 0x35059: 0x6c9d3620, 0x3505a: 0x6c9d3820, 0x3505b: 0x6c9d3a20, - 0x3505c: 0x6c9d3c20, 0x3505d: 0x6c9d3e20, 0x3505e: 0x6c9d4020, 0x3505f: 0x6c9d4220, - 0x35060: 0x6c9d4420, 0x35061: 0x6c9d4620, 0x35062: 0x6c9d4820, 0x35063: 0x6c9d4a20, - 0x35064: 0x6c9d4c20, 0x35065: 0x6c9d4e20, 0x35066: 0x6c9d5020, 0x35067: 0x6c9d5220, - 0x35068: 0x6c9d5420, 0x35069: 0x6c9d5620, 0x3506a: 0x6c9d5820, 0x3506b: 0x6c9d5a20, - 0x3506c: 0x6c9d5c20, 0x3506d: 0x6c9d5e20, 0x3506e: 0x6c9d6020, 0x3506f: 0x6c9d6220, - 0x35070: 0x6c9d6420, 0x35071: 0x6c9d6620, 0x35072: 0x6c9d6820, 0x35073: 0x6c9d6a20, - 0x35074: 0x6c9d6c20, 0x35075: 0x6c9d6e20, 0x35076: 0x6c9d7020, 0x35077: 0x6c9d7220, - 0x35078: 0x6c9d7420, 0x35079: 0x6c9d7620, 0x3507a: 0x6c9d7820, 0x3507b: 0x6c9d7a20, - 0x3507c: 0x6c9d7c20, 0x3507d: 0x6c9d7e20, 0x3507e: 0x6c9d8020, 0x3507f: 0x6c9d8220, - // Block 0xd42, offset 0x35080 - 0x35080: 0x6c9d8420, 0x35081: 0x6cc98620, 0x35082: 0x6cc98820, 0x35083: 0x6cc98a20, - 0x35084: 0x6cc98c20, 0x35085: 0x6cc98e20, 0x35086: 0x6cc99020, 0x35087: 0x6cc99220, - 0x35088: 0x6cc99420, 0x35089: 0x6cc99620, 0x3508a: 0x6cc99820, 0x3508b: 0x6cc99a20, - 0x3508c: 0x6cc99c20, 0x3508d: 0x6cc99e20, 0x3508e: 0x6cc9a020, 0x3508f: 0x6cc9a220, - 0x35090: 0x6cc9a420, 0x35091: 0x6cc9a620, 0x35092: 0x6cc9a820, 0x35093: 0x6cc9aa20, - 0x35094: 0x6cc9ac20, 0x35095: 0x6cc9ae20, 0x35096: 0x6cc9b020, 0x35097: 0x6cc9b220, - 0x35098: 0x6cc9b420, 0x35099: 0x6cc9b620, 0x3509a: 0x6cc9b820, 0x3509b: 0x6cc9ba20, - 0x3509c: 0x6cc9bc20, 0x3509d: 0x6cc9be20, 0x3509e: 0x6cc9c020, 0x3509f: 0x6cc9c220, - 0x350a0: 0x6cc9c420, 0x350a1: 0x6cc9c620, 0x350a2: 0x6cc9c820, 0x350a3: 0x6cc9ca20, - 0x350a4: 0x6cc9cc20, 0x350a5: 0x6cc9ce20, 0x350a6: 0x6cc9d020, 0x350a7: 0x6cc9d220, - 0x350a8: 0x6cc9d420, 0x350a9: 0x6cc9d620, 0x350aa: 0x6cc9d820, 0x350ab: 0x6cc9da20, - 0x350ac: 0x6cc9dc20, 0x350ad: 0x6cc9de20, 0x350ae: 0x6cc9e020, 0x350af: 0x6cc9e220, - 0x350b0: 0x6cc9e420, 0x350b1: 0x6cc9e620, 0x350b2: 0x6cc9e820, 0x350b3: 0x6cc9ea20, - 0x350b4: 0x6cc9ec20, 0x350b5: 0x6cc9ee20, 0x350b6: 0x6cc9f020, 0x350b7: 0x6cc9f220, - 0x350b8: 0x6cc9f420, 0x350b9: 0x6cc9f620, 0x350ba: 0x6cc9f820, 0x350bb: 0x6cc9fa20, - 0x350bc: 0x6cc9fc20, 0x350bd: 0x6cc9fe20, 0x350be: 0x6cca0020, 0x350bf: 0x6cca0220, - // Block 0xd43, offset 0x350c0 - 0x350c0: 0x6cca0420, 0x350c1: 0x6cca0620, 0x350c2: 0x6cca0820, 0x350c3: 0x6cca0a20, - 0x350c4: 0x6cca0c20, 0x350c5: 0x6cca0e20, 0x350c6: 0x6cca1020, 0x350c7: 0x6cca1220, - 0x350c8: 0x6cca1420, 0x350c9: 0x6cca1620, 0x350ca: 0x6cca1820, 0x350cb: 0x6cca1a20, - 0x350cc: 0x6cca1c20, 0x350cd: 0x6cca1e20, 0x350ce: 0x6cca2020, 0x350cf: 0x6cca2220, - 0x350d0: 0x6cca2420, 0x350d1: 0x6cca2620, 0x350d2: 0x6cca2820, 0x350d3: 0x6cca2a20, - 0x350d4: 0x6cca2c20, 0x350d5: 0x6cca2e20, 0x350d6: 0x6cca3020, 0x350d7: 0x6cca3220, - 0x350d8: 0x6cca3420, 0x350d9: 0x6cca3620, 0x350da: 0x6cca3820, 0x350db: 0x6cca3a20, - 0x350dc: 0x6cca3c20, 0x350dd: 0x6cca3e20, 0x350de: 0x6cca4020, 0x350df: 0x6cca4220, - 0x350e0: 0x6cca4420, 0x350e1: 0x6cca4620, 0x350e2: 0x6cca4820, 0x350e3: 0x6cca4a20, - 0x350e4: 0x6cca4c20, 0x350e5: 0x6cca4e20, 0x350e6: 0x6cca5020, 0x350e7: 0x6cca5220, - 0x350e8: 0x6cca5420, 0x350e9: 0x6cca5620, 0x350ea: 0x6cca5820, 0x350eb: 0x6cca5a20, - 0x350ec: 0x6cca5c20, 0x350ed: 0x6cca5e20, 0x350ee: 0x6cca6020, 0x350ef: 0x6cca6220, - 0x350f0: 0x6cca6420, 0x350f1: 0x6cf79c20, 0x350f2: 0x6cf79e20, 0x350f3: 0x6cf7a020, - 0x350f4: 0x6cf7a220, 0x350f5: 0x6cf7a420, 0x350f6: 0x6cf7a620, 0x350f7: 0x6cf7a820, - 0x350f8: 0x6cf7aa20, 0x350f9: 0x6cf7ac20, 0x350fa: 0x6cf7ae20, 0x350fb: 0x6cf7b020, - 0x350fc: 0x6cf7b220, 0x350fd: 0x6cf7b420, 0x350fe: 0x6cf7b620, 0x350ff: 0x6cf7b820, - // Block 0xd44, offset 0x35100 - 0x35100: 0x6cf7ba20, 0x35101: 0x6cf7bc20, 0x35102: 0x6cf7be20, 0x35103: 0x6cf7c020, - 0x35104: 0x6cf7c220, 0x35105: 0x6cf7c420, 0x35106: 0x6cf7c620, 0x35107: 0x6cf7c820, - 0x35108: 0x6cf7ca20, 0x35109: 0x6cf7cc20, 0x3510a: 0x6cf7ce20, 0x3510b: 0x6cf7d020, - 0x3510c: 0x6cf7d220, 0x3510d: 0x6cf7d420, 0x3510e: 0x6cf7d620, 0x3510f: 0x6cf7d820, - 0x35110: 0x6cf7da20, 0x35111: 0x6cf7dc20, 0x35112: 0x6cf7de20, 0x35113: 0x6cf7e020, - 0x35114: 0x6cf7e220, 0x35115: 0x6cf7e420, 0x35116: 0x6cf7e620, 0x35117: 0x6cf7e820, - 0x35118: 0x6cf7ea20, 0x35119: 0x6cf7ec20, 0x3511a: 0x6cf7ee20, 0x3511b: 0x6cf7f020, - 0x3511c: 0x6cf7f220, 0x3511d: 0x6cf7f420, 0x3511e: 0x6cf7f620, 0x3511f: 0x6cf7f820, - 0x35120: 0x6cf7fa20, 0x35121: 0x6cf7fc20, 0x35122: 0x6cf7fe20, 0x35123: 0x6cf80020, - 0x35124: 0x6d26fa20, 0x35125: 0x6cf80220, 0x35126: 0x6cf80420, 0x35127: 0x6cf80620, - 0x35128: 0x6cf80820, 0x35129: 0x6cf80a20, 0x3512a: 0x6cf80c20, 0x3512b: 0x6cf80e20, - 0x3512c: 0x6cf81020, 0x3512d: 0x6cf81220, 0x3512e: 0x6cf81420, 0x3512f: 0x6cf81620, - 0x35130: 0x6cf81820, 0x35131: 0x6cf81a20, 0x35132: 0x6cf81c20, 0x35133: 0x6cf81e20, - 0x35134: 0x6cf82020, 0x35135: 0x6cf82220, 0x35136: 0x6cf82420, 0x35137: 0x6cf82620, - 0x35138: 0x6cf82820, 0x35139: 0x6cf82a20, 0x3513a: 0x6cf82c20, 0x3513b: 0x6cf82e20, - 0x3513c: 0x6cf83020, 0x3513d: 0x6cf83220, 0x3513e: 0x6cf83420, 0x3513f: 0x6cf83620, - // Block 0xd45, offset 0x35140 - 0x35140: 0x6cf83820, 0x35141: 0x6cf83a20, 0x35142: 0x6cf83c20, 0x35143: 0x6cf83e20, - 0x35144: 0x6cf84020, 0x35145: 0x6cf84220, 0x35146: 0x6cf84420, 0x35147: 0x6cf84620, - 0x35148: 0x6cf84820, 0x35149: 0x6cf84a20, 0x3514a: 0x6cf84c20, 0x3514b: 0x6cf84e20, - 0x3514c: 0x6cf85020, 0x3514d: 0x6cf85220, 0x3514e: 0x6cf85420, 0x3514f: 0x6cf85620, - 0x35150: 0x6cf85820, 0x35151: 0x6cf85a20, 0x35152: 0x6cf85c20, 0x35153: 0x6cf85e20, - 0x35154: 0x6cf86020, 0x35155: 0x6cf86220, 0x35156: 0x6cf86420, 0x35157: 0x6cf86620, - 0x35158: 0x6cf86820, 0x35159: 0x6cf86a20, 0x3515a: 0x6cf86c20, 0x3515b: 0x6cf86e20, - 0x3515c: 0x6cf87020, 0x3515d: 0x6cf87220, 0x3515e: 0x6cf87420, 0x3515f: 0x6cf87620, - 0x35160: 0x6cf87820, 0x35161: 0x6cf87a20, 0x35162: 0x6cf87c20, 0x35163: 0x6cf87e20, - 0x35164: 0x6cf88020, 0x35165: 0x6cf88220, 0x35166: 0x6cf88420, 0x35167: 0x6cf88620, - 0x35168: 0x6cf88820, 0x35169: 0x6cf88a20, 0x3516a: 0x6d26fc20, 0x3516b: 0x6d26fe20, - 0x3516c: 0x6d270020, 0x3516d: 0x6d270220, 0x3516e: 0x6d270420, 0x3516f: 0x6d270620, - 0x35170: 0x6d270820, 0x35171: 0x6d270a20, 0x35172: 0x6d270c20, 0x35173: 0x6d270e20, - 0x35174: 0x6d271020, 0x35175: 0x6d271220, 0x35176: 0x6d271420, 0x35177: 0x6d271620, - 0x35178: 0x6d271820, 0x35179: 0x6d271a20, 0x3517a: 0x6d271c20, 0x3517b: 0x6d271e20, - 0x3517c: 0x6d272020, 0x3517d: 0x6d272220, 0x3517e: 0x6d272420, 0x3517f: 0x6d272620, - // Block 0xd46, offset 0x35180 - 0x35180: 0x6d272820, 0x35181: 0x6d272a20, 0x35182: 0x6d272c20, 0x35183: 0x6d272e20, - 0x35184: 0x6d273020, 0x35185: 0x6d273220, 0x35186: 0x6d273420, 0x35187: 0x6d273620, - 0x35188: 0x6d273820, 0x35189: 0x6d273a20, 0x3518a: 0x6d273c20, 0x3518b: 0x6d273e20, - 0x3518c: 0x6d274020, 0x3518d: 0x6d274220, 0x3518e: 0x6d274420, 0x3518f: 0x6d274620, - 0x35190: 0x6d274820, 0x35191: 0x6d274a20, 0x35192: 0x6d274c20, 0x35193: 0x6d274e20, - 0x35194: 0x6d275020, 0x35195: 0x6d275220, 0x35196: 0x6d275420, 0x35197: 0x6d275620, - 0x35198: 0x6d275820, 0x35199: 0x6d275a20, 0x3519a: 0x6d275c20, 0x3519b: 0x6d275e20, - 0x3519c: 0x6d276020, 0x3519d: 0x6d276220, 0x3519e: 0x6d276420, 0x3519f: 0x6d276620, - 0x351a0: 0x6d276820, 0x351a1: 0x6d276a20, 0x351a2: 0x6d276c20, 0x351a3: 0x6d276e20, - 0x351a4: 0x6d277020, 0x351a5: 0x6d277220, 0x351a6: 0x6d277420, 0x351a7: 0x6d277620, - 0x351a8: 0x6d277820, 0x351a9: 0x6d277a20, 0x351aa: 0x6d277c20, 0x351ab: 0x6d277e20, - 0x351ac: 0x6d278020, 0x351ad: 0x6d278220, 0x351ae: 0x6d278420, 0x351af: 0x6d278620, - 0x351b0: 0x6d278820, 0x351b1: 0x6d278a20, 0x351b2: 0x6d278c20, 0x351b3: 0x6d278e20, - 0x351b4: 0x6d279020, 0x351b5: 0x6d279220, 0x351b6: 0x6d279420, 0x351b7: 0x6d279620, - 0x351b8: 0x6d279820, 0x351b9: 0x6d279a20, 0x351ba: 0x6d279c20, 0x351bb: 0x6d279e20, - 0x351bc: 0x6d27a020, 0x351bd: 0x6d27a220, 0x351be: 0x6d27a420, 0x351bf: 0x6d27a620, - // Block 0xd47, offset 0x351c0 - 0x351c0: 0x6d27a820, 0x351c1: 0x6d27aa20, 0x351c2: 0x6d27ac20, 0x351c3: 0x6d27ae20, - 0x351c4: 0x6d27b020, 0x351c5: 0x6d27b220, 0x351c6: 0x6d27b420, 0x351c7: 0x6d27b620, - 0x351c8: 0x6d27b820, 0x351c9: 0x6d27ba20, 0x351ca: 0x6d27bc20, 0x351cb: 0x6d27be20, - 0x351cc: 0x6d27c020, 0x351cd: 0x6d27c220, 0x351ce: 0x6d27c420, 0x351cf: 0x6d27c620, - 0x351d0: 0x6d27c820, 0x351d1: 0x6d27ca20, 0x351d2: 0x6d27cc20, 0x351d3: 0x6d27ce20, - 0x351d4: 0x6d27d020, 0x351d5: 0x6d546220, 0x351d6: 0x6d546420, 0x351d7: 0x6d546620, - 0x351d8: 0x6d546820, 0x351d9: 0x6d546a20, 0x351da: 0x6d546c20, 0x351db: 0x6d546e20, - 0x351dc: 0x6d547020, 0x351dd: 0x6d547220, 0x351de: 0x6d547420, 0x351df: 0x6d547620, - 0x351e0: 0x6d547820, 0x351e1: 0x6d547a20, 0x351e2: 0x6d547c20, 0x351e3: 0x6d547e20, - 0x351e4: 0x6d548020, 0x351e5: 0x6d548220, 0x351e6: 0x6d548420, 0x351e7: 0x6d548620, - 0x351e8: 0x6d548820, 0x351e9: 0x6d548a20, 0x351ea: 0x6d548c20, 0x351eb: 0x6d548e20, - 0x351ec: 0x6d549020, 0x351ed: 0x6d549220, 0x351ee: 0x6d549420, 0x351ef: 0x6d549620, - 0x351f0: 0x6d549820, 0x351f1: 0x6d549a20, 0x351f2: 0x6d549c20, 0x351f3: 0x6d549e20, - 0x351f4: 0x6d54a020, 0x351f5: 0x6d54a220, 0x351f6: 0x6d54a420, 0x351f7: 0x6d54a620, - 0x351f8: 0x6d54a820, 0x351f9: 0x6d54aa20, 0x351fa: 0x6d54ac20, 0x351fb: 0x6d54ae20, - 0x351fc: 0x6d54b020, 0x351fd: 0x6d54b220, 0x351fe: 0x6d54b420, 0x351ff: 0x6d54b620, - // Block 0xd48, offset 0x35200 - 0x35200: 0x6d54b820, 0x35201: 0x6d54ba20, 0x35202: 0x6d54bc20, 0x35203: 0x6d54be20, - 0x35204: 0x6d54c020, 0x35205: 0x6d54c220, 0x35206: 0x6d54c420, 0x35207: 0x6d54c620, - 0x35208: 0x6d54c820, 0x35209: 0x6d54ca20, 0x3520a: 0x6d54cc20, 0x3520b: 0x6d54ce20, - 0x3520c: 0x6d54d020, 0x3520d: 0x6d54d220, 0x3520e: 0x6d54d420, 0x3520f: 0x6d54d620, - 0x35210: 0x6d54d820, 0x35211: 0x6d54da20, 0x35212: 0x6d7fc220, 0x35213: 0x6d54dc20, - 0x35214: 0x6d54de20, 0x35215: 0x6d54e020, 0x35216: 0x6d54e220, 0x35217: 0x6d54e420, - 0x35218: 0x6d54e620, 0x35219: 0x6d54e820, 0x3521a: 0x6d54ea20, 0x3521b: 0x6d54ec20, - 0x3521c: 0x6d54ee20, 0x3521d: 0x6d54f020, 0x3521e: 0x6d54f220, 0x3521f: 0x6d54f420, - 0x35220: 0x6d54f620, 0x35221: 0x6d54f820, 0x35222: 0x6d54fa20, 0x35223: 0x6d54fc20, - 0x35224: 0x6d54fe20, 0x35225: 0x6d550020, 0x35226: 0x6d550220, 0x35227: 0x6d550420, - 0x35228: 0x6d550620, 0x35229: 0x6d550820, 0x3522a: 0x6d550a20, 0x3522b: 0x6d550c20, - 0x3522c: 0x6d550e20, 0x3522d: 0x6d551020, 0x3522e: 0x6d551220, 0x3522f: 0x6d551420, - 0x35230: 0x6d551620, 0x35231: 0x6d551820, 0x35232: 0x6d551a20, 0x35233: 0x6d551c20, - 0x35234: 0x6d551e20, 0x35235: 0x6d552020, 0x35236: 0x6d552220, 0x35237: 0x6d552420, - 0x35238: 0x6d552620, 0x35239: 0x6d552820, 0x3523a: 0x6d552a20, 0x3523b: 0x6d7fc420, - 0x3523c: 0x6d7fc620, 0x3523d: 0x6d7fc820, 0x3523e: 0x6d7fca20, 0x3523f: 0x6d7fcc20, - // Block 0xd49, offset 0x35240 - 0x35240: 0x6d7fce20, 0x35241: 0x6d7fd020, 0x35242: 0x6d7fd220, 0x35243: 0x6d7fd420, - 0x35244: 0x6d7fd620, 0x35245: 0x6d7fd820, 0x35246: 0x6d7fda20, 0x35247: 0x6d7fdc20, - 0x35248: 0x6d7fde20, 0x35249: 0x6d7fe020, 0x3524a: 0x6d7fe220, 0x3524b: 0x6d7fe420, - 0x3524c: 0x6d7fe620, 0x3524d: 0x6d7fe820, 0x3524e: 0x6d7fea20, 0x3524f: 0x6d7fec20, - 0x35250: 0x6d7fee20, 0x35251: 0x6d7ff020, 0x35252: 0x6d7ff220, 0x35253: 0x6d7ff420, - 0x35254: 0x6d7ff620, 0x35255: 0x6d7ff820, 0x35256: 0x6d7ffa20, 0x35257: 0x6d7ffc20, - 0x35258: 0x6d7ffe20, 0x35259: 0x6d800020, 0x3525a: 0x6d800220, 0x3525b: 0x6d800420, - 0x3525c: 0x6d800620, 0x3525d: 0x6d800820, 0x3525e: 0x6d800a20, 0x3525f: 0x6d800c20, - 0x35260: 0x6d800e20, 0x35261: 0x6d801020, 0x35262: 0x6d801220, 0x35263: 0x6d801420, - 0x35264: 0x6d801620, 0x35265: 0x6d801820, 0x35266: 0x6d801a20, 0x35267: 0x6d801c20, - 0x35268: 0x6d801e20, 0x35269: 0x6d802020, 0x3526a: 0x6d802220, 0x3526b: 0x6d802420, - 0x3526c: 0x6d802620, 0x3526d: 0x6d802820, 0x3526e: 0x6d802a20, 0x3526f: 0x6d802c20, - 0x35270: 0x6d802e20, 0x35271: 0x6d803020, 0x35272: 0x6d803220, 0x35273: 0x6d803420, - 0x35274: 0x6d803620, 0x35275: 0x6d803820, 0x35276: 0x6d803a20, 0x35277: 0x6d803c20, - 0x35278: 0x6d803e20, 0x35279: 0x6d804020, 0x3527a: 0x6d804220, 0x3527b: 0x6d804420, - 0x3527c: 0x6d804620, 0x3527d: 0x6d804820, 0x3527e: 0x6d804a20, 0x3527f: 0x6d804c20, - // Block 0xd4a, offset 0x35280 - 0x35280: 0x6d804e20, 0x35281: 0x6d805020, 0x35282: 0x6d805220, 0x35283: 0x6d805420, - 0x35284: 0x6d805620, 0x35285: 0x6d805820, 0x35286: 0x6d805a20, 0x35287: 0x6d805c20, - 0x35288: 0x6d805e20, 0x35289: 0x6d806020, 0x3528a: 0x6d806220, 0x3528b: 0x6d806420, - 0x3528c: 0x6d806620, 0x3528d: 0x6d806820, 0x3528e: 0x6d806a20, 0x3528f: 0x6d806c20, - 0x35290: 0x6d806e20, 0x35291: 0x6d807020, 0x35292: 0x6d807220, 0x35293: 0x6d807420, - 0x35294: 0x6d807620, 0x35295: 0x6d807820, 0x35296: 0x6d807a20, 0x35297: 0x6d807c20, - 0x35298: 0x6d807e20, 0x35299: 0x6d808020, 0x3529a: 0x6d808220, 0x3529b: 0x6d808420, - 0x3529c: 0x6d808620, 0x3529d: 0x6d808820, 0x3529e: 0x6d808a20, 0x3529f: 0x6d808c20, - 0x352a0: 0x6d808e20, 0x352a1: 0x6d809020, 0x352a2: 0x6d809220, 0x352a3: 0x6d809420, - 0x352a4: 0x6d809620, 0x352a5: 0x6d809820, 0x352a6: 0x6d809a20, 0x352a7: 0x6d809c20, - 0x352a8: 0x6d809e20, 0x352a9: 0x6d80a020, 0x352aa: 0x6d80a220, 0x352ab: 0x6d80a420, - 0x352ac: 0x6d80a620, 0x352ad: 0x6d80a820, 0x352ae: 0x6d80aa20, 0x352af: 0x6d80ac20, - 0x352b0: 0x6da63820, 0x352b1: 0x6da63a20, 0x352b2: 0x6da63c20, 0x352b3: 0x6da63e20, - 0x352b4: 0x6da64020, 0x352b5: 0x6da64220, 0x352b6: 0x6da64420, 0x352b7: 0x6da64620, - 0x352b8: 0x6da64820, 0x352b9: 0x6da64a20, 0x352ba: 0x6da64c20, 0x352bb: 0x6da64e20, - 0x352bc: 0x6da65020, 0x352bd: 0x6da65220, 0x352be: 0x6da65420, 0x352bf: 0x6da65620, - // Block 0xd4b, offset 0x352c0 - 0x352c0: 0x6da65820, 0x352c1: 0x6da65a20, 0x352c2: 0x6da65c20, 0x352c3: 0x6da65e20, - 0x352c4: 0x6da66020, 0x352c5: 0x6da66220, 0x352c6: 0x6da66420, 0x352c7: 0x6da66620, - 0x352c8: 0x6da66820, 0x352c9: 0x6da66a20, 0x352ca: 0x6da66c20, 0x352cb: 0x6da66e20, - 0x352cc: 0x6da67020, 0x352cd: 0x6da67220, 0x352ce: 0x6da67420, 0x352cf: 0x6da67620, - 0x352d0: 0x6da67820, 0x352d1: 0x6da67a20, 0x352d2: 0x6da67c20, 0x352d3: 0x6da67e20, - 0x352d4: 0x6da68020, 0x352d5: 0x6da68220, 0x352d6: 0x6da68420, 0x352d7: 0x6da68620, - 0x352d8: 0x6da68820, 0x352d9: 0x6da68a20, 0x352da: 0x6da68c20, 0x352db: 0x6da68e20, - 0x352dc: 0x6da69020, 0x352dd: 0x6da69220, 0x352de: 0x6da69420, 0x352df: 0x6da69620, - 0x352e0: 0x6da69820, 0x352e1: 0x6da69a20, 0x352e2: 0x6d883220, 0x352e3: 0x6da69c20, - 0x352e4: 0x6da69e20, 0x352e5: 0x6da6a020, 0x352e6: 0x6da6a220, 0x352e7: 0x6da6a420, - 0x352e8: 0x6da6a620, 0x352e9: 0x6da6a820, 0x352ea: 0x6da6aa20, 0x352eb: 0x6da6ac20, - 0x352ec: 0x6da6ae20, 0x352ed: 0x6da6b020, 0x352ee: 0x6da6b220, 0x352ef: 0x6da6b420, - 0x352f0: 0x6da6b620, 0x352f1: 0x6da6b820, 0x352f2: 0x6da6ba20, 0x352f3: 0x6da6bc20, - 0x352f4: 0x6da6be20, 0x352f5: 0x6da6c020, 0x352f6: 0x6da6c220, 0x352f7: 0x6da6c420, - 0x352f8: 0x6da6c620, 0x352f9: 0x6da6c820, 0x352fa: 0x6da6ca20, 0x352fb: 0x6da6cc20, - 0x352fc: 0x6da6ce20, 0x352fd: 0x6da6d020, 0x352fe: 0x6da6d220, 0x352ff: 0x6da6d420, - // Block 0xd4c, offset 0x35300 - 0x35300: 0x6da6d620, 0x35301: 0x6dc7a220, 0x35302: 0x6dc7a420, 0x35303: 0x6dc7a620, - 0x35304: 0x6dc7a820, 0x35305: 0x6dc7aa20, 0x35306: 0x6dc7ac20, 0x35307: 0x6dc7ae20, - 0x35308: 0x6dc7b020, 0x35309: 0x6dc7b220, 0x3530a: 0x6dc7b420, 0x3530b: 0x6dc7b620, - 0x3530c: 0x6dc7b820, 0x3530d: 0x6dc7ba20, 0x3530e: 0x6dc7bc20, 0x3530f: 0x6dc7be20, - 0x35310: 0x6dc7c020, 0x35311: 0x6dc7c220, 0x35312: 0x6dc7c420, 0x35313: 0x6dc7c620, - 0x35314: 0x6dc7c820, 0x35315: 0x6dc7ca20, 0x35316: 0x6dc7cc20, 0x35317: 0x6dc7ce20, - 0x35318: 0x6dc7d020, 0x35319: 0x6de40020, 0x3531a: 0x6dc7d220, 0x3531b: 0x6dc7d420, - 0x3531c: 0x6dc7d620, 0x3531d: 0x6dc7d820, 0x3531e: 0x6dc7da20, 0x3531f: 0x6dc7dc20, - 0x35320: 0x6dc7de20, 0x35321: 0x6dc7e020, 0x35322: 0x6dc7e220, 0x35323: 0x6dc7e420, - 0x35324: 0x6dc7e620, 0x35325: 0x6dc7e820, 0x35326: 0x6dc7ea20, 0x35327: 0x6dc7ec20, - 0x35328: 0x6dc7ee20, 0x35329: 0x6dc7f020, 0x3532a: 0x6dc7f220, 0x3532b: 0x6dc7f420, - 0x3532c: 0x6dc7f620, 0x3532d: 0x6dc7f820, 0x3532e: 0x6dc7fa20, 0x3532f: 0x6dc7fc20, - 0x35330: 0x6dc7fe20, 0x35331: 0x6dc80020, 0x35332: 0x6dc80220, 0x35333: 0x6dc80420, - 0x35334: 0x6dc80620, 0x35335: 0x6dc80820, 0x35336: 0x6dc80a20, 0x35337: 0x6dc80c20, - 0x35338: 0x6dc80e20, 0x35339: 0x6dc81020, 0x3533a: 0x6dc81220, 0x3533b: 0x6dc81420, - 0x3533c: 0x6dc81620, 0x3533d: 0x6dc81820, 0x3533e: 0x6dc81a20, 0x3533f: 0x6dc81c20, - // Block 0xd4d, offset 0x35340 - 0x35340: 0x6dc81e20, 0x35341: 0x6dc82020, 0x35342: 0x6dc82220, 0x35343: 0x6dc82420, - 0x35344: 0x6dc82620, 0x35345: 0x6dc82820, 0x35346: 0x6dc82a20, 0x35347: 0x6dc82c20, - 0x35348: 0x6dc82e20, 0x35349: 0x6dc83020, 0x3534a: 0x6dc83220, 0x3534b: 0x6dc83420, - 0x3534c: 0x6dc83620, 0x3534d: 0x6dc83820, 0x3534e: 0x6dc83a20, 0x3534f: 0x6dcc7220, - 0x35350: 0x6de40220, 0x35351: 0x6de40420, 0x35352: 0x6de40620, 0x35353: 0x6de40820, - 0x35354: 0x6de40a20, 0x35355: 0x6de40c20, 0x35356: 0x6de40e20, 0x35357: 0x6de41020, - 0x35358: 0x6de41220, 0x35359: 0x6de41420, 0x3535a: 0x6de41620, 0x3535b: 0x6de41820, - 0x3535c: 0x6de41a20, 0x3535d: 0x6de41c20, 0x3535e: 0x6de41e20, 0x3535f: 0x6de42020, - 0x35360: 0x6de42220, 0x35361: 0x6de42420, 0x35362: 0x6de42620, 0x35363: 0x6de42820, - 0x35364: 0x6de42a20, 0x35365: 0x6de42c20, 0x35366: 0x6de42e20, 0x35367: 0x6de43020, - 0x35368: 0x6de43220, 0x35369: 0x6de43420, 0x3536a: 0x6de43620, 0x3536b: 0x6de43820, - 0x3536c: 0x6de43a20, 0x3536d: 0x6de43c20, 0x3536e: 0x6de43e20, 0x3536f: 0x6de44020, - 0x35370: 0x6de44220, 0x35371: 0x6de44420, 0x35372: 0x6de44620, 0x35373: 0x6de44820, - 0x35374: 0x6de44a20, 0x35375: 0x6de44c20, 0x35376: 0x6de44e20, 0x35377: 0x6de45020, - 0x35378: 0x6de45220, 0x35379: 0x6de45420, 0x3537a: 0x6de45620, 0x3537b: 0x6de45820, - 0x3537c: 0x6de45a20, 0x3537d: 0x6de45c20, 0x3537e: 0x6de45e20, 0x3537f: 0x6de46020, - // Block 0xd4e, offset 0x35380 - 0x35380: 0x6de46220, 0x35381: 0x6de46420, 0x35382: 0x6de46620, 0x35383: 0x6de46820, - 0x35384: 0x6dfb3a20, 0x35385: 0x6dfb3c20, 0x35386: 0x6dfb3e20, 0x35387: 0x6dfb4020, - 0x35388: 0x6dfb4220, 0x35389: 0x6dfb4420, 0x3538a: 0x6dfb4620, 0x3538b: 0x6dfb4820, - 0x3538c: 0x6dfb4a20, 0x3538d: 0x6dfb4c20, 0x3538e: 0x6dfb4e20, 0x3538f: 0x6dfb5020, - 0x35390: 0x6dfb5220, 0x35391: 0x6de46a20, 0x35392: 0x6dfb5420, 0x35393: 0x6dfb5620, - 0x35394: 0x6dfb5820, 0x35395: 0x6dfb5a20, 0x35396: 0x6dfb5c20, 0x35397: 0x6dfb5e20, - 0x35398: 0x6dfb6020, 0x35399: 0x6dfb6220, 0x3539a: 0x6dfb6420, 0x3539b: 0x6dfb6620, - 0x3539c: 0x6dfb6820, 0x3539d: 0x6dfb6a20, 0x3539e: 0x6dfb6c20, 0x3539f: 0x6dfb6e20, - 0x353a0: 0x6dfb7020, 0x353a1: 0x6dfb7220, 0x353a2: 0x6dfb7420, 0x353a3: 0x6dfb7620, - 0x353a4: 0x6dfb7820, 0x353a5: 0x6dfb7a20, 0x353a6: 0x6dfb7c20, 0x353a7: 0x6dfb7e20, - 0x353a8: 0x6dfb8020, 0x353a9: 0x6dfb8220, 0x353aa: 0x6dfb8420, 0x353ab: 0x6dfb8620, - 0x353ac: 0x6dfb8820, 0x353ad: 0x6dfb8a20, 0x353ae: 0x6dfb8c20, 0x353af: 0x6e0e7e20, - 0x353b0: 0x6e0e8020, 0x353b1: 0x6e0e8220, 0x353b2: 0x6e0e8420, 0x353b3: 0x6e0e8620, - 0x353b4: 0x6e0e8820, 0x353b5: 0x6e0e8a20, 0x353b6: 0x6e0e8c20, 0x353b7: 0x6e0e8e20, - 0x353b8: 0x6e0e9020, 0x353b9: 0x6e0e9220, 0x353ba: 0x6e0e9420, 0x353bb: 0x6e0e9620, - 0x353bc: 0x6e0e9820, 0x353bd: 0x6e0e9a20, 0x353be: 0x6e0e9c20, 0x353bf: 0x6e0e9e20, - // Block 0xd4f, offset 0x353c0 - 0x353c0: 0x6e0ea020, 0x353c1: 0x6e0ea220, 0x353c2: 0x6e1dc820, 0x353c3: 0x6e0ea420, - 0x353c4: 0x6e0ea620, 0x353c5: 0x6e0ea820, 0x353c6: 0x6e0eaa20, 0x353c7: 0x6e0eac20, - 0x353c8: 0x6e0eae20, 0x353c9: 0x6e0eb020, 0x353ca: 0x6e0eb220, 0x353cb: 0x6e0eb420, - 0x353cc: 0x6e0eb620, 0x353cd: 0x6e0eb820, 0x353ce: 0x6e0eba20, 0x353cf: 0x6e0ebc20, - 0x353d0: 0x6e0ebe20, 0x353d1: 0x6e0ec020, 0x353d2: 0x6e0ec220, 0x353d3: 0x6e0ec420, - 0x353d4: 0x6e0ec620, 0x353d5: 0x6e0ec820, 0x353d6: 0x6e0eca20, 0x353d7: 0x6e0ecc20, - 0x353d8: 0x6e0ece20, 0x353d9: 0x6e1dca20, 0x353da: 0x6e1dcc20, 0x353db: 0x6e1dce20, - 0x353dc: 0x6e1dd020, 0x353dd: 0x6e1dd220, 0x353de: 0x6e1dd420, 0x353df: 0x6e1dd620, - 0x353e0: 0x6e1dd820, 0x353e1: 0x6e1dda20, 0x353e2: 0x6e1ddc20, 0x353e3: 0x6e1dde20, - 0x353e4: 0x6e1de020, 0x353e5: 0x6e1de220, 0x353e6: 0x6e1de420, 0x353e7: 0x6e1de620, - 0x353e8: 0x6e1de820, 0x353e9: 0x6e1dea20, 0x353ea: 0x6e1dec20, 0x353eb: 0x6e1dee20, - 0x353ec: 0x6e1df020, 0x353ed: 0x6e1df220, 0x353ee: 0x6e1df420, 0x353ef: 0x6e1df620, - 0x353f0: 0x6e1df820, 0x353f1: 0x6e1dfa20, 0x353f2: 0x6e1dfc20, 0x353f3: 0x6e1dfe20, - 0x353f4: 0x6e1e0020, 0x353f5: 0x6e1e0220, 0x353f6: 0x6e1e0420, 0x353f7: 0x6e294a20, - 0x353f8: 0x6e294c20, 0x353f9: 0x6e294e20, 0x353fa: 0x6e295020, 0x353fb: 0x6e295220, - 0x353fc: 0x6e295420, 0x353fd: 0x6e295620, 0x353fe: 0x6e295820, 0x353ff: 0x6e295a20, - // Block 0xd50, offset 0x35400 - 0x35400: 0x6e295c20, 0x35401: 0x6e295e20, 0x35402: 0x6e296020, 0x35403: 0x6e296220, - 0x35404: 0x6e296420, 0x35405: 0x6e296620, 0x35406: 0x6e296820, 0x35407: 0x6e296a20, - 0x35408: 0x6e296c20, 0x35409: 0x6e296e20, 0x3540a: 0x6e297020, 0x3540b: 0x6e326420, - 0x3540c: 0x6e326620, 0x3540d: 0x6e326820, 0x3540e: 0x6e326a20, 0x3540f: 0x6e326c20, - 0x35410: 0x6e326e20, 0x35411: 0x6e327020, 0x35412: 0x6e327220, 0x35413: 0x6e327420, - 0x35414: 0x6e327620, 0x35415: 0x6e327820, 0x35416: 0x6e327a20, 0x35417: 0x6e327c20, - 0x35418: 0x6e327e20, 0x35419: 0x6e328020, 0x3541a: 0x6e328220, 0x3541b: 0x6e328420, - 0x3541c: 0x6e328620, 0x3541d: 0x6e328820, 0x3541e: 0x6e38bc20, 0x3541f: 0x6e38be20, - 0x35420: 0x6e38c020, 0x35421: 0x6e38c220, 0x35422: 0x6e38c420, 0x35423: 0x6e38c620, - 0x35424: 0x6e38c820, 0x35425: 0x6e38ca20, 0x35426: 0x6e38cc20, 0x35427: 0x6e38ce20, - 0x35428: 0x6e38d020, 0x35429: 0x6e3d3220, 0x3542a: 0x6e3d3420, 0x3542b: 0x6e3d3620, - 0x3542c: 0x6e3d3820, 0x3542d: 0x6e3d3a20, 0x3542e: 0x6e3d3c20, 0x3542f: 0x6e3d3e20, - 0x35430: 0x6e3d4020, 0x35431: 0x6e3d4220, 0x35432: 0x6e404e20, 0x35433: 0x6e401020, - 0x35434: 0x6e405020, 0x35435: 0x6e405220, 0x35436: 0x6e42aa20, 0x35437: 0x6e42ac20, - 0x35438: 0x6e42ae20, 0x35439: 0x6e443020, 0x3543a: 0x6e451e20, 0x3543b: 0x6e452020, - 0x3543c: 0x6e45c220, 0x3543d: 0x6e462c20, 0x3543e: 0x6e462e20, 0x3543f: 0x6e46b020, - // Block 0xd51, offset 0x35440 - 0x35440: 0x6c12b820, 0x35441: 0x6c223e20, 0x35442: 0x6c224020, 0x35443: 0x6c224220, - 0x35444: 0x6c224420, 0x35445: 0x6c224620, 0x35446: 0x6c224820, 0x35447: 0x6c224a20, - 0x35448: 0x6c224c20, 0x35449: 0x6c377620, 0x3544a: 0x6c377820, 0x3544b: 0x6c377a20, - 0x3544c: 0x6c377c20, 0x3544d: 0x6c377e20, 0x3544e: 0x6c378020, 0x3544f: 0x6c378220, - 0x35450: 0x6c378420, 0x35451: 0x6c378620, 0x35452: 0x6c378820, 0x35453: 0x6c378a20, - 0x35454: 0x6c378c20, 0x35455: 0x6c378e20, 0x35456: 0x6c379020, 0x35457: 0x6c52d420, - 0x35458: 0x6c52d620, 0x35459: 0x6c52d820, 0x3545a: 0x6c52da20, 0x3545b: 0x6c52dc20, - 0x3545c: 0x6c52de20, 0x3545d: 0x6c52e020, 0x3545e: 0x6c52e220, 0x3545f: 0x6c52e420, - 0x35460: 0x6c52e620, 0x35461: 0x6c52e820, 0x35462: 0x6c52ea20, 0x35463: 0x6c52ec20, - 0x35464: 0x6c52ee20, 0x35465: 0x6c52f020, 0x35466: 0x6c52f220, 0x35467: 0x6c756020, - 0x35468: 0x6c756220, 0x35469: 0x6c756420, 0x3546a: 0x6c756620, 0x3546b: 0x6c756820, - 0x3546c: 0x6c756a20, 0x3546d: 0x6c756c20, 0x3546e: 0x6c756e20, 0x3546f: 0x6c757020, - 0x35470: 0x6c757220, 0x35471: 0x6c757420, 0x35472: 0x6c757620, 0x35473: 0x6c757820, - 0x35474: 0x6c757a20, 0x35475: 0x6c757c20, 0x35476: 0x6c757e20, 0x35477: 0x6c758020, - 0x35478: 0x6c758220, 0x35479: 0x6c758420, 0x3547a: 0x6c9dba20, 0x3547b: 0x6c9dbc20, - 0x3547c: 0x6c9dbe20, 0x3547d: 0x6c9dc020, 0x3547e: 0x6c9dc220, 0x3547f: 0x6c9dc420, - // Block 0xd52, offset 0x35480 - 0x35480: 0x6c9dc620, 0x35481: 0x6c9dc820, 0x35482: 0x6c9dca20, 0x35483: 0x6c9dcc20, - 0x35484: 0x6c9dce20, 0x35485: 0x6c9dd020, 0x35486: 0x6c9dd220, 0x35487: 0x6c9dd420, - 0x35488: 0x6ccaa620, 0x35489: 0x6ccaa820, 0x3548a: 0x6ccaaa20, 0x3548b: 0x6ccaac20, - 0x3548c: 0x6ccaae20, 0x3548d: 0x6ccab020, 0x3548e: 0x6ccab220, 0x3548f: 0x6ccab420, - 0x35490: 0x6ccab620, 0x35491: 0x6ccab820, 0x35492: 0x6ccaba20, 0x35493: 0x6ccabc20, - 0x35494: 0x6ccabe20, 0x35495: 0x6ccac020, 0x35496: 0x6ccac220, 0x35497: 0x6ccac420, - 0x35498: 0x6ccac620, 0x35499: 0x6ccac820, 0x3549a: 0x6ccaca20, 0x3549b: 0x6ccacc20, - 0x3549c: 0x6ccace20, 0x3549d: 0x6cf8da20, 0x3549e: 0x6cf8dc20, 0x3549f: 0x6cf8de20, - 0x354a0: 0x6cf8e020, 0x354a1: 0x6cf8e220, 0x354a2: 0x6cf8e420, 0x354a3: 0x6cf8e620, - 0x354a4: 0x6cf8e820, 0x354a5: 0x6cf8ea20, 0x354a6: 0x6cf8ec20, 0x354a7: 0x6cf8ee20, - 0x354a8: 0x6cf8f020, 0x354a9: 0x6cf8f220, 0x354aa: 0x6cf8f420, 0x354ab: 0x6cf8f620, - 0x354ac: 0x6d0f4820, 0x354ad: 0x6cf8f820, 0x354ae: 0x6cf8fa20, 0x354af: 0x6cf8fc20, - 0x354b0: 0x6cf8fe20, 0x354b1: 0x6cf90020, 0x354b2: 0x6d281220, 0x354b3: 0x6d281420, - 0x354b4: 0x6d281620, 0x354b5: 0x6d281820, 0x354b6: 0x6d281a20, 0x354b7: 0x6d281c20, - 0x354b8: 0x6d281e20, 0x354b9: 0x6d282020, 0x354ba: 0x6d282220, 0x354bb: 0x6d282420, - 0x354bc: 0x6d282620, 0x354bd: 0x6d282820, 0x354be: 0x6d282a20, 0x354bf: 0x6d282c20, - // Block 0xd53, offset 0x354c0 - 0x354c0: 0x6d282e20, 0x354c1: 0x6d283020, 0x354c2: 0x6d283220, 0x354c3: 0x6d283420, - 0x354c4: 0x6d283620, 0x354c5: 0x6d283820, 0x354c6: 0x6d283a20, 0x354c7: 0x6d283c20, - 0x354c8: 0x6d556220, 0x354c9: 0x6d556420, 0x354ca: 0x6d556620, 0x354cb: 0x6d556820, - 0x354cc: 0x6d556a20, 0x354cd: 0x6d556c20, 0x354ce: 0x6d556e20, 0x354cf: 0x6d557020, - 0x354d0: 0x6d557220, 0x354d1: 0x6d557420, 0x354d2: 0x6d557620, 0x354d3: 0x6d557820, - 0x354d4: 0x6d557a20, 0x354d5: 0x6d557c20, 0x354d6: 0x6d557e20, 0x354d7: 0x6d558020, - 0x354d8: 0x6d80e220, 0x354d9: 0x6d80e420, 0x354da: 0x6d80e620, 0x354db: 0x6d80e820, - 0x354dc: 0x6d80ea20, 0x354dd: 0x6d80ec20, 0x354de: 0x6d80ee20, 0x354df: 0x6d80f020, - 0x354e0: 0x6da70220, 0x354e1: 0x6da70420, 0x354e2: 0x6da70620, 0x354e3: 0x6da70820, - 0x354e4: 0x6da70a20, 0x354e5: 0x6da70c20, 0x354e6: 0x6da70e20, 0x354e7: 0x6da71020, - 0x354e8: 0x6dc85420, 0x354e9: 0x6dc85620, 0x354ea: 0x6dc85820, 0x354eb: 0x6dc85a20, - 0x354ec: 0x6de47e20, 0x354ed: 0x6de48020, 0x354ee: 0x6de48220, 0x354ef: 0x6de48420, - 0x354f0: 0x6de48620, 0x354f1: 0x6dfb9c20, 0x354f2: 0x6dfb9e20, 0x354f3: 0x6dfba020, - 0x354f4: 0x6e0ed820, 0x354f5: 0x6e0eda20, 0x354f6: 0x6e1e1020, 0x354f7: 0x6e0edc20, - 0x354f8: 0x6e0ede20, 0x354f9: 0x6e1e1220, 0x354fa: 0x6e1e1420, 0x354fb: 0x6e1e1620, - 0x354fc: 0x6e1e1820, 0x354fd: 0x6e297820, 0x354fe: 0x6e329020, 0x354ff: 0x6e38d820, - // Block 0xd54, offset 0x35500 - 0x35500: 0x6e38da20, 0x35501: 0x6e3d4620, 0x35502: 0x6c04ac20, 0x35503: 0x6c097820, - 0x35504: 0x6c097a20, 0x35505: 0x6c12be20, 0x35506: 0x6c12c020, 0x35507: 0x6c225420, - 0x35508: 0x6c225620, 0x35509: 0x6c379c20, 0x3550a: 0x6c225820, 0x3550b: 0x6c225a20, - 0x3550c: 0x6c225c20, 0x3550d: 0x6c379e20, 0x3550e: 0x6c37a020, 0x3550f: 0x6c37a220, - 0x35510: 0x6c37a420, 0x35511: 0x6c37a620, 0x35512: 0x6c37a820, 0x35513: 0x6c37aa20, - 0x35514: 0x6c37ac20, 0x35515: 0x6c37ae20, 0x35516: 0x6c37b020, 0x35517: 0x6c37b220, - 0x35518: 0x6c37b420, 0x35519: 0x6c37b620, 0x3551a: 0x6c37b820, 0x3551b: 0x6c37ba20, - 0x3551c: 0x6c37bc20, 0x3551d: 0x6c37be20, 0x3551e: 0x6c37c020, 0x3551f: 0x6c37c220, - 0x35520: 0x6c37c420, 0x35521: 0x6c37c620, 0x35522: 0x6c530220, 0x35523: 0x6c530420, - 0x35524: 0x6c530620, 0x35525: 0x6c2bd020, 0x35526: 0x6c758c20, 0x35527: 0x6c758e20, - 0x35528: 0x6c759020, 0x35529: 0x6c759220, 0x3552a: 0x6c759420, 0x3552b: 0x6c759620, - 0x3552c: 0x6c759820, 0x3552d: 0x6c759a20, 0x3552e: 0x6c759c20, 0x3552f: 0x6c759e20, - 0x35530: 0x6c75a020, 0x35531: 0x6c75a220, 0x35532: 0x6c6f0e20, 0x35533: 0x6c9dda20, - 0x35534: 0x6c9ddc20, 0x35535: 0x6c9dde20, 0x35536: 0x6c9de020, 0x35537: 0x6c9de220, - 0x35538: 0x6c9de420, 0x35539: 0x6ccada20, 0x3553a: 0x6ccadc20, 0x3553b: 0x6ccade20, - 0x3553c: 0x6ccae020, 0x3553d: 0x6ccae220, 0x3553e: 0x6ccae420, 0x3553f: 0x6ccae620, - // Block 0xd55, offset 0x35540 - 0x35540: 0x6ccae820, 0x35541: 0x6ccaea20, 0x35542: 0x6ccaec20, 0x35543: 0x6ccaee20, - 0x35544: 0x6ccaf020, 0x35545: 0x6ccaf220, 0x35546: 0x6ccaf420, 0x35547: 0x6cf90c20, - 0x35548: 0x6cf90e20, 0x35549: 0x6cf91020, 0x3554a: 0x6cf91220, 0x3554b: 0x6d75b820, - 0x3554c: 0x6cf91420, 0x3554d: 0x6cf91620, 0x3554e: 0x6cf91820, 0x3554f: 0x6cf1c020, - 0x35550: 0x6d284620, 0x35551: 0x6d284820, 0x35552: 0x6d284a20, 0x35553: 0x6d284c20, - 0x35554: 0x6d558820, 0x35555: 0x6d558a20, 0x35556: 0x6d558c20, 0x35557: 0x6d558e20, - 0x35558: 0x6d559020, 0x35559: 0x6d559220, 0x3555a: 0x6d559420, 0x3555b: 0x6d559620, - 0x3555c: 0x6d80f420, 0x3555d: 0x6d80f620, 0x3555e: 0x6d80f820, 0x3555f: 0x6d80fa20, - 0x35560: 0x6d80fc20, 0x35561: 0x6da71220, 0x35562: 0x6da71420, 0x35563: 0x6da71620, - 0x35564: 0x6da71820, 0x35565: 0x6da71a20, 0x35566: 0x6dc86020, 0x35567: 0x6dc86220, - 0x35568: 0x6dc86420, 0x35569: 0x6dc86620, 0x3556a: 0x6dc86820, 0x3556b: 0x6dc86a20, - 0x3556c: 0x6de48820, 0x3556d: 0x6de20820, 0x3556e: 0x6e0ee020, 0x3556f: 0x6e1e1a20, - 0x35570: 0x6e1e1c20, 0x35571: 0x6e297a20, 0x35572: 0x6e297c20, 0x35573: 0x6e329420, - 0x35574: 0x6e329620, 0x35575: 0x6c04b020, 0x35576: 0x6c04b220, 0x35577: 0x6c097e20, - 0x35578: 0x6c12c620, 0x35579: 0x6c12c820, 0x3557a: 0x6c12ca20, 0x3557b: 0x6c12cc20, - 0x3557c: 0x6c12ce20, 0x3557d: 0x6c12d020, 0x3557e: 0x6c12d220, 0x3557f: 0x6c226020, - // Block 0xd56, offset 0x35580 - 0x35580: 0x6c226220, 0x35581: 0x6c226420, 0x35582: 0x6c226620, 0x35583: 0x6c226820, - 0x35584: 0x6c226a20, 0x35585: 0x6c226c20, 0x35586: 0x6c226e20, 0x35587: 0x6c227020, - 0x35588: 0x6c227220, 0x35589: 0x6c37dc20, 0x3558a: 0x6c37de20, 0x3558b: 0x6c37e020, - 0x3558c: 0x6c37e220, 0x3558d: 0x6c37e420, 0x3558e: 0x6c37e620, 0x3558f: 0x6c37e820, - 0x35590: 0x6c37ea20, 0x35591: 0x6c37ec20, 0x35592: 0x6c37ee20, 0x35593: 0x6c37f020, - 0x35594: 0x6c37f220, 0x35595: 0x6c37f420, 0x35596: 0x6c37f620, 0x35597: 0x6c37f820, - 0x35598: 0x6c37fa20, 0x35599: 0x6c37fc20, 0x3559a: 0x6c37fe20, 0x3559b: 0x6c380020, - 0x3559c: 0x6c380220, 0x3559d: 0x6c531a20, 0x3559e: 0x6c531c20, 0x3559f: 0x6c531e20, - 0x355a0: 0x6c532020, 0x355a1: 0x6c532220, 0x355a2: 0x6c532420, 0x355a3: 0x6c532620, - 0x355a4: 0x6c532820, 0x355a5: 0x6c532a20, 0x355a6: 0x6c532c20, 0x355a7: 0x6c532e20, - 0x355a8: 0x6c533020, 0x355a9: 0x6c533220, 0x355aa: 0x6c533420, 0x355ab: 0x6c533620, - 0x355ac: 0x6c533820, 0x355ad: 0x6c533a20, 0x355ae: 0x6c533c20, 0x355af: 0x6c533e20, - 0x355b0: 0x6c534020, 0x355b1: 0x6c534220, 0x355b2: 0x6c75b220, 0x355b3: 0x6c75b420, - 0x355b4: 0x6c75b620, 0x355b5: 0x6c75b820, 0x355b6: 0x6c75ba20, 0x355b7: 0x6c75bc20, - 0x355b8: 0x6c75be20, 0x355b9: 0x6c75c020, 0x355ba: 0x6c75c220, 0x355bb: 0x6c75c420, - 0x355bc: 0x6c75c620, 0x355bd: 0x6c75c820, 0x355be: 0x6c75ca20, 0x355bf: 0x6c75cc20, - // Block 0xd57, offset 0x355c0 - 0x355c0: 0x6c75ce20, 0x355c1: 0x6c75d020, 0x355c2: 0x6c75d220, 0x355c3: 0x6c75d420, - 0x355c4: 0x6c75d620, 0x355c5: 0x6c9dfc20, 0x355c6: 0x6c9dfe20, 0x355c7: 0x6c9e0020, - 0x355c8: 0x6c9e0220, 0x355c9: 0x6c9e0420, 0x355ca: 0x6c9e0620, 0x355cb: 0x6c9e0820, - 0x355cc: 0x6c9e0a20, 0x355cd: 0x6c9e0c20, 0x355ce: 0x6c9e0e20, 0x355cf: 0x6c9e1020, - 0x355d0: 0x6c9e1220, 0x355d1: 0x6c9e1420, 0x355d2: 0x6c9e1620, 0x355d3: 0x6c9e1820, - 0x355d4: 0x6c9e1a20, 0x355d5: 0x6c9e1c20, 0x355d6: 0x6ccb1220, 0x355d7: 0x6ccb1420, - 0x355d8: 0x6ccb1620, 0x355d9: 0x6ccb1820, 0x355da: 0x6ccb1a20, 0x355db: 0x6ccb1c20, - 0x355dc: 0x6ccb1e20, 0x355dd: 0x6ccb2020, 0x355de: 0x6ccb2220, 0x355df: 0x6ccb2420, - 0x355e0: 0x6ccb2620, 0x355e1: 0x6ccb2820, 0x355e2: 0x6ccb2a20, 0x355e3: 0x6ccb2c20, - 0x355e4: 0x6ccb2e20, 0x355e5: 0x6ccb3020, 0x355e6: 0x6ccb3220, 0x355e7: 0x6ccb3420, - 0x355e8: 0x6ccb3620, 0x355e9: 0x6ccb3820, 0x355ea: 0x6ccb3a20, 0x355eb: 0x6ccb3c20, - 0x355ec: 0x6ccb3e20, 0x355ed: 0x6ccb4020, 0x355ee: 0x6ccb4220, 0x355ef: 0x6ccb4420, - 0x355f0: 0x6ccb4620, 0x355f1: 0x6cf93020, 0x355f2: 0x6cf93220, 0x355f3: 0x6cf93420, - 0x355f4: 0x6cf93620, 0x355f5: 0x6cf93820, 0x355f6: 0x6cf93a20, 0x355f7: 0x6cf93c20, - 0x355f8: 0x6cf93e20, 0x355f9: 0x6cf94020, 0x355fa: 0x6cf94220, 0x355fb: 0x6cf94420, - 0x355fc: 0x6cf94620, 0x355fd: 0x6cf94820, 0x355fe: 0x6cf94a20, 0x355ff: 0x6cf94c20, - // Block 0xd58, offset 0x35600 - 0x35600: 0x6cf94e20, 0x35601: 0x6cf95020, 0x35602: 0x6cf95220, 0x35603: 0x6cf95420, - 0x35604: 0x6d286220, 0x35605: 0x6d286420, 0x35606: 0x6d286620, 0x35607: 0x6d286820, - 0x35608: 0x6d286a20, 0x35609: 0x6d286c20, 0x3560a: 0x6d286e20, 0x3560b: 0x6d287020, - 0x3560c: 0x6d287220, 0x3560d: 0x6d55a820, 0x3560e: 0x6d55aa20, 0x3560f: 0x6d55ac20, - 0x35610: 0x6d55ae20, 0x35611: 0x6d55b020, 0x35612: 0x6d55b220, 0x35613: 0x6d55b420, - 0x35614: 0x6d55b620, 0x35615: 0x6d55b820, 0x35616: 0x6d55ba20, 0x35617: 0x6d55bc20, - 0x35618: 0x6d55be20, 0x35619: 0x6d55c020, 0x3561a: 0x6d55c220, 0x3561b: 0x6d55c420, - 0x3561c: 0x6d55c620, 0x3561d: 0x6d811220, 0x3561e: 0x6d811420, 0x3561f: 0x6d811620, - 0x35620: 0x6d811820, 0x35621: 0x6d811a20, 0x35622: 0x6d811c20, 0x35623: 0x6d811e20, - 0x35624: 0x6d812020, 0x35625: 0x6d812220, 0x35626: 0x6d812420, 0x35627: 0x6d812620, - 0x35628: 0x6da72620, 0x35629: 0x6da72820, 0x3562a: 0x6da72a20, 0x3562b: 0x6da72c20, - 0x3562c: 0x6da72e20, 0x3562d: 0x6da73020, 0x3562e: 0x6da73220, 0x3562f: 0x6dc86e20, - 0x35630: 0x6dc87020, 0x35631: 0x6dc87220, 0x35632: 0x6dc87420, 0x35633: 0x6dc87620, - 0x35634: 0x6dc87820, 0x35635: 0x6dc87a20, 0x35636: 0x6dc87c20, 0x35637: 0x6de48e20, - 0x35638: 0x6de49020, 0x35639: 0x6dfba820, 0x3563a: 0x6dfbaa20, 0x3563b: 0x6dfbac20, - 0x3563c: 0x6e0ee420, 0x3563d: 0x6e0ee620, 0x3563e: 0x6e1e1e20, 0x3563f: 0x6e298020, - // Block 0xd59, offset 0x35640 - 0x35640: 0x6e298220, 0x35641: 0x6e298420, 0x35642: 0x6c380820, 0x35643: 0x6c380a20, - 0x35644: 0x6c380c20, 0x35645: 0x6c534c20, 0x35646: 0x6c534e20, 0x35647: 0x6c535020, - 0x35648: 0x6c75e220, 0x35649: 0x6c75e420, 0x3564a: 0x6c75e620, 0x3564b: 0x6c9e2a20, - 0x3564c: 0x6c9e2c20, 0x3564d: 0x6c9e2e20, 0x3564e: 0x6c9e3020, 0x3564f: 0x6c9e3220, - 0x35650: 0x6c9e3420, 0x35651: 0x6c9e3620, 0x35652: 0x6c9e3820, 0x35653: 0x6c9e3a20, - 0x35654: 0x6c9e3c20, 0x35655: 0x6c9e3e20, 0x35656: 0x6c9e4020, 0x35657: 0x6c9e4220, - 0x35658: 0x6c9e4420, 0x35659: 0x6ccb5420, 0x3565a: 0x6ccb5620, 0x3565b: 0x6ccb5820, - 0x3565c: 0x6ccb5a20, 0x3565d: 0x6ccb5c20, 0x3565e: 0x6ccb5e20, 0x3565f: 0x6ccb6020, - 0x35660: 0x6cf96020, 0x35661: 0x6cf96220, 0x35662: 0x6cf96420, 0x35663: 0x6cf96620, - 0x35664: 0x6cf96820, 0x35665: 0x6cf96a20, 0x35666: 0x6cf96c20, 0x35667: 0x6cf96e20, - 0x35668: 0x6cf97020, 0x35669: 0x6cf97220, 0x3566a: 0x6cf97420, 0x3566b: 0x6cf97620, - 0x3566c: 0x6cf97820, 0x3566d: 0x6d017c20, 0x3566e: 0x6d287c20, 0x3566f: 0x6d287e20, - 0x35670: 0x6d288020, 0x35671: 0x6d288220, 0x35672: 0x6d288420, 0x35673: 0x6d288620, - 0x35674: 0x6d288820, 0x35675: 0x6d288a20, 0x35676: 0x6d55ce20, 0x35677: 0x6d55d020, - 0x35678: 0x6d55d220, 0x35679: 0x6d55d420, 0x3567a: 0x6d55d620, 0x3567b: 0x6d813220, - 0x3567c: 0x6d813420, 0x3567d: 0x6d813620, 0x3567e: 0x6d813820, 0x3567f: 0x6d813a20, - // Block 0xd5a, offset 0x35680 - 0x35680: 0x6d813c20, 0x35681: 0x6d813e20, 0x35682: 0x6d814020, 0x35683: 0x6d814220, - 0x35684: 0x6d814420, 0x35685: 0x6d814620, 0x35686: 0x6d814820, 0x35687: 0x6d814a20, - 0x35688: 0x6d814c20, 0x35689: 0x6d814e20, 0x3568a: 0x6d815020, 0x3568b: 0x6d815220, - 0x3568c: 0x6da73820, 0x3568d: 0x6da73a20, 0x3568e: 0x6da73c20, 0x3568f: 0x6da73e20, - 0x35690: 0x6dc88020, 0x35691: 0x6dc88220, 0x35692: 0x6dc88420, 0x35693: 0x6dc88620, - 0x35694: 0x6dc88820, 0x35695: 0x6dc88a20, 0x35696: 0x6dc88c20, 0x35697: 0x6dc88e20, - 0x35698: 0x6de49220, 0x35699: 0x6de49420, 0x3569a: 0x6de49620, 0x3569b: 0x6de49820, - 0x3569c: 0x6de49a20, 0x3569d: 0x6de49c20, 0x3569e: 0x6dfbae20, 0x3569f: 0x6dfbb020, - 0x356a0: 0x6e0ee820, 0x356a1: 0x6e0eea20, 0x356a2: 0x6e298820, 0x356a3: 0x6e298a20, - 0x356a4: 0x6e298c20, 0x356a5: 0x6e298e20, 0x356a6: 0x6e329820, 0x356a7: 0x6e329a20, - 0x356a8: 0x6e329c20, 0x356a9: 0x6e38dc20, 0x356aa: 0x6e405620, 0x356ab: 0x6e405820, - 0x356ac: 0x6c04ba20, 0x356ad: 0x6c12d620, 0x356ae: 0x6c227a20, 0x356af: 0x6c381020, - 0x356b0: 0x6c381220, 0x356b1: 0x6c381420, 0x356b2: 0x6c381620, 0x356b3: 0x6c535420, - 0x356b4: 0x6c75ec20, 0x356b5: 0x6c9e4820, 0x356b6: 0x6c9e4a20, 0x356b7: 0x6c9e4c20, - 0x356b8: 0x6c9e4e20, 0x356b9: 0x6cf97e20, 0x356ba: 0x6d288c20, 0x356bb: 0x6d288e20, - 0x356bc: 0x6d289020, 0x356bd: 0x6d815420, 0x356be: 0x6d815620, 0x356bf: 0x6da74420, - // Block 0xd5b, offset 0x356c0 - 0x356c0: 0x6de49e20, 0x356c1: 0x6e1e2020, 0x356c2: 0x6c227e20, 0x356c3: 0x6c228020, - 0x356c4: 0x6c381820, 0x356c5: 0x6c381a20, 0x356c6: 0x6c381c20, 0x356c7: 0x6c381e20, - 0x356c8: 0x6c75f020, 0x356c9: 0x6c75f220, 0x356ca: 0x6c75f420, 0x356cb: 0x6c9e5020, - 0x356cc: 0x6c9e5220, 0x356cd: 0x6cf98020, 0x356ce: 0x6d289420, 0x356cf: 0x6d289620, - 0x356d0: 0x6d289820, 0x356d1: 0x6d289a20, 0x356d2: 0x6d55dc20, 0x356d3: 0x6d815820, - 0x356d4: 0x6d815a20, 0x356d5: 0x6da74820, 0x356d6: 0x6de4a020, 0x356d7: 0x6dfbb220, - 0x356d8: 0x6dfbb420, 0x356d9: 0x6e1e2220, 0x356da: 0x6e405a20, 0x356db: 0x6c04c020, - 0x356dc: 0x6c12dc20, 0x356dd: 0x6c12de20, 0x356de: 0x6c12e020, 0x356df: 0x6c12e220, - 0x356e0: 0x6c12e420, 0x356e1: 0x6c228620, 0x356e2: 0x6c228820, 0x356e3: 0x6c228a20, - 0x356e4: 0x6c228c20, 0x356e5: 0x6c228e20, 0x356e6: 0x6c229020, 0x356e7: 0x6c229220, - 0x356e8: 0x6c229420, 0x356e9: 0x6c382e20, 0x356ea: 0x6c383020, 0x356eb: 0x6c383220, - 0x356ec: 0x6c383420, 0x356ed: 0x6c383620, 0x356ee: 0x6c383820, 0x356ef: 0x6c383a20, - 0x356f0: 0x6c383c20, 0x356f1: 0x6c383e20, 0x356f2: 0x6c384020, 0x356f3: 0x6c384220, - 0x356f4: 0x6c384420, 0x356f5: 0x6c384620, 0x356f6: 0x6c384820, 0x356f7: 0x6c384a20, - 0x356f8: 0x6c536420, 0x356f9: 0x6c536620, 0x356fa: 0x6c536820, 0x356fb: 0x6c536a20, - 0x356fc: 0x6c536c20, 0x356fd: 0x6c536e20, 0x356fe: 0x6c537020, 0x356ff: 0x6c537220, - // Block 0xd5c, offset 0x35700 - 0x35700: 0x6c537420, 0x35701: 0x6c537620, 0x35702: 0x6c537820, 0x35703: 0x6c537a20, - 0x35704: 0x6c537c20, 0x35705: 0x6c537e20, 0x35706: 0x6c538020, 0x35707: 0x6c538220, - 0x35708: 0x6c538420, 0x35709: 0x6c538620, 0x3570a: 0x6c538820, 0x3570b: 0x6c538a20, - 0x3570c: 0x6c538c20, 0x3570d: 0x6c538e20, 0x3570e: 0x6c539020, 0x3570f: 0x6c539220, - 0x35710: 0x6c539420, 0x35711: 0x6c539620, 0x35712: 0x6c539820, 0x35713: 0x6c539a20, - 0x35714: 0x6c539c20, 0x35715: 0x6c539e20, 0x35716: 0x6c53a020, 0x35717: 0x6c53a220, - 0x35718: 0x6c53a420, 0x35719: 0x6c53a620, 0x3571a: 0x6c53a820, 0x3571b: 0x6c53aa20, - 0x3571c: 0x6c760a20, 0x3571d: 0x6c760c20, 0x3571e: 0x6c760e20, 0x3571f: 0x6c761020, - 0x35720: 0x6c761220, 0x35721: 0x6c761420, 0x35722: 0x6c761620, 0x35723: 0x6c761820, - 0x35724: 0x6c761a20, 0x35725: 0x6c761c20, 0x35726: 0x6c761e20, 0x35727: 0x6c762020, - 0x35728: 0x6c762220, 0x35729: 0x6c762420, 0x3572a: 0x6c762620, 0x3572b: 0x6c762820, - 0x3572c: 0x6c762a20, 0x3572d: 0x6c762c20, 0x3572e: 0x6c762e20, 0x3572f: 0x6c763020, - 0x35730: 0x6c763220, 0x35731: 0x6c9e6a20, 0x35732: 0x6c9e6c20, 0x35733: 0x6c9e6e20, - 0x35734: 0x6c9e7020, 0x35735: 0x6c9e7220, 0x35736: 0x6c9e7420, 0x35737: 0x6c9e7620, - 0x35738: 0x6c9e7820, 0x35739: 0x6c9e7a20, 0x3573a: 0x6c9e7c20, 0x3573b: 0x6c9e7e20, - 0x3573c: 0x6c9e8020, 0x3573d: 0x6c9e8220, 0x3573e: 0x6c9e8420, 0x3573f: 0x6c9e8620, - // Block 0xd5d, offset 0x35740 - 0x35740: 0x6c9e8820, 0x35741: 0x6c9e8a20, 0x35742: 0x6c9e8c20, 0x35743: 0x6c9e8e20, - 0x35744: 0x6c9e9020, 0x35745: 0x6c9e9220, 0x35746: 0x6c9e9420, 0x35747: 0x6c9e9620, - 0x35748: 0x6ccb8220, 0x35749: 0x6ccb8420, 0x3574a: 0x6ccb8620, 0x3574b: 0x6ccb8820, - 0x3574c: 0x6ccb8a20, 0x3574d: 0x6ccb8c20, 0x3574e: 0x6ccb8e20, 0x3574f: 0x6ccb9020, - 0x35750: 0x6ccb9220, 0x35751: 0x6ccb9420, 0x35752: 0x6ccb9620, 0x35753: 0x6ccb9820, - 0x35754: 0x6ccb9a20, 0x35755: 0x6ccb9c20, 0x35756: 0x6ccb9e20, 0x35757: 0x6ccba020, - 0x35758: 0x6ccba220, 0x35759: 0x6ccba420, 0x3575a: 0x6ccba620, 0x3575b: 0x6ccba820, - 0x3575c: 0x6ccbaa20, 0x3575d: 0x6ccbac20, 0x3575e: 0x6ccbae20, 0x3575f: 0x6ccbb020, - 0x35760: 0x6ccbb220, 0x35761: 0x6ccbb420, 0x35762: 0x6ccbb620, 0x35763: 0x6ccbb820, - 0x35764: 0x6ccbba20, 0x35765: 0x6ccbbc20, 0x35766: 0x6ccbbe20, 0x35767: 0x6ccbc020, - 0x35768: 0x6cf99a20, 0x35769: 0x6cf99c20, 0x3576a: 0x6cf99e20, 0x3576b: 0x6cf9a020, - 0x3576c: 0x6cf9a220, 0x3576d: 0x6cf9a420, 0x3576e: 0x6cf9a620, 0x3576f: 0x6cf9a820, - 0x35770: 0x6cf9aa20, 0x35771: 0x6cf9ac20, 0x35772: 0x6cf9ae20, 0x35773: 0x6cf9b020, - 0x35774: 0x6cf9b220, 0x35775: 0x6cf9b420, 0x35776: 0x6cf9b620, 0x35777: 0x6cf9b820, - 0x35778: 0x6cf9ba20, 0x35779: 0x6cf9bc20, 0x3577a: 0x6cf9be20, 0x3577b: 0x6cf9c020, - 0x3577c: 0x6cf9c220, 0x3577d: 0x6cf9c420, 0x3577e: 0x6cf9c620, 0x3577f: 0x6cf9c820, - // Block 0xd5e, offset 0x35780 - 0x35780: 0x6cf9ca20, 0x35781: 0x6cf9cc20, 0x35782: 0x6cf9ce20, 0x35783: 0x6cf9d020, - 0x35784: 0x6cf9d220, 0x35785: 0x6d28ac20, 0x35786: 0x6d28ae20, 0x35787: 0x6d28b020, - 0x35788: 0x6d28b220, 0x35789: 0x6d28b420, 0x3578a: 0x6d28b620, 0x3578b: 0x6d28b820, - 0x3578c: 0x6d28ba20, 0x3578d: 0x6d28bc20, 0x3578e: 0x6d28be20, 0x3578f: 0x6d28c020, - 0x35790: 0x6d28c220, 0x35791: 0x6d28c420, 0x35792: 0x6d28c620, 0x35793: 0x6d28c820, - 0x35794: 0x6d28ca20, 0x35795: 0x6d28cc20, 0x35796: 0x6d28ce20, 0x35797: 0x6d28d020, - 0x35798: 0x6d28d220, 0x35799: 0x6d28d420, 0x3579a: 0x6d28d620, 0x3579b: 0x6d28d820, - 0x3579c: 0x6d28da20, 0x3579d: 0x6d28dc20, 0x3579e: 0x6d28de20, 0x3579f: 0x6d28e020, - 0x357a0: 0x6d28e220, 0x357a1: 0x6d28e420, 0x357a2: 0x6d28e620, 0x357a3: 0x6d55e620, - 0x357a4: 0x6d55e820, 0x357a5: 0x6d55ea20, 0x357a6: 0x6d55ec20, 0x357a7: 0x6d55ee20, - 0x357a8: 0x6d55f020, 0x357a9: 0x6d55f220, 0x357aa: 0x6d55f420, 0x357ab: 0x6d55f620, - 0x357ac: 0x6d55f820, 0x357ad: 0x6d55fa20, 0x357ae: 0x6d55fc20, 0x357af: 0x6d55fe20, - 0x357b0: 0x6d560020, 0x357b1: 0x6d560220, 0x357b2: 0x6d560420, 0x357b3: 0x6d560620, - 0x357b4: 0x6d560820, 0x357b5: 0x6d560a20, 0x357b6: 0x6d560c20, 0x357b7: 0x6d560e20, - 0x357b8: 0x6d817020, 0x357b9: 0x6d817220, 0x357ba: 0x6d817420, 0x357bb: 0x6d817620, - 0x357bc: 0x6d817820, 0x357bd: 0x6d817a20, 0x357be: 0x6d817c20, 0x357bf: 0x6d817e20, - // Block 0xd5f, offset 0x357c0 - 0x357c0: 0x6d818020, 0x357c1: 0x6d818220, 0x357c2: 0x6d818420, 0x357c3: 0x6d818620, - 0x357c4: 0x6d818820, 0x357c5: 0x6d818a20, 0x357c6: 0x6d818c20, 0x357c7: 0x6d818e20, - 0x357c8: 0x6d819020, 0x357c9: 0x6d819220, 0x357ca: 0x6da75020, 0x357cb: 0x6da75220, - 0x357cc: 0x6da75420, 0x357cd: 0x6da75620, 0x357ce: 0x6da75820, 0x357cf: 0x6da75a20, - 0x357d0: 0x6da75c20, 0x357d1: 0x6da75e20, 0x357d2: 0x6da76020, 0x357d3: 0x6da76220, - 0x357d4: 0x6da76420, 0x357d5: 0x6da76620, 0x357d6: 0x6da76820, 0x357d7: 0x6da76a20, - 0x357d8: 0x6da76c20, 0x357d9: 0x6da76e20, 0x357da: 0x6dc89820, 0x357db: 0x6dc89a20, - 0x357dc: 0x6dc89c20, 0x357dd: 0x6dc89e20, 0x357de: 0x6dc8a020, 0x357df: 0x6dc8a220, - 0x357e0: 0x6dc8a420, 0x357e1: 0x6dc8a620, 0x357e2: 0x6dc8a820, 0x357e3: 0x6dc8aa20, - 0x357e4: 0x6dc8ac20, 0x357e5: 0x6dc8ae20, 0x357e6: 0x6dc8b020, 0x357e7: 0x6dc8b220, - 0x357e8: 0x6dc8b420, 0x357e9: 0x6dc8b620, 0x357ea: 0x6dc8b820, 0x357eb: 0x6de4a620, - 0x357ec: 0x6de4a820, 0x357ed: 0x6de4aa20, 0x357ee: 0x6de4ac20, 0x357ef: 0x6de4ae20, - 0x357f0: 0x6de4b020, 0x357f1: 0x6dfbb820, 0x357f2: 0x6dfbba20, 0x357f3: 0x6dfbbc20, - 0x357f4: 0x6dfbbe20, 0x357f5: 0x6dfbc020, 0x357f6: 0x6e0eec20, 0x357f7: 0x6e0eee20, - 0x357f8: 0x6e0ef020, 0x357f9: 0x6e0ef220, 0x357fa: 0x6e0ef420, 0x357fb: 0x6e1e2620, - 0x357fc: 0x6e1e2820, 0x357fd: 0x6e1e2a20, 0x357fe: 0x6e1e2c20, 0x357ff: 0x6e299020, - // Block 0xd60, offset 0x35800 - 0x35800: 0x6e299220, 0x35801: 0x6e299420, 0x35802: 0x6e3d4c20, 0x35803: 0x6e3d4e20, - 0x35804: 0x6e42b020, 0x35805: 0x6c385220, 0x35806: 0x6c385420, 0x35807: 0x6c53b020, - 0x35808: 0x6c53b220, 0x35809: 0x6c53b420, 0x3580a: 0x6c53b620, 0x3580b: 0x6c9e9820, - 0x3580c: 0x6c9e9a20, 0x3580d: 0x6c9e9c20, 0x3580e: 0x6c9e9e20, 0x3580f: 0x6cf9d620, - 0x35810: 0x6d28ea20, 0x35811: 0x6d819420, 0x35812: 0x6da77020, 0x35813: 0x6dc8bc20, - 0x35814: 0x6dc8be20, 0x35815: 0x6c12f020, 0x35816: 0x6c12f220, 0x35817: 0x6c229a20, - 0x35818: 0x6c229c20, 0x35819: 0x6c385e20, 0x3581a: 0x6c386020, 0x3581b: 0x6c386220, - 0x3581c: 0x6c53c220, 0x3581d: 0x6c53c420, 0x3581e: 0x6c53c620, 0x3581f: 0x6c53c820, - 0x35820: 0x6c53ca20, 0x35821: 0x6c764820, 0x35822: 0x6ccbd020, 0x35823: 0x6c9ea620, - 0x35824: 0x6ccbd220, 0x35825: 0x6ccbd420, 0x35826: 0x6cf9da20, 0x35827: 0x6cf9dc20, - 0x35828: 0x6cf9de20, 0x35829: 0x6d28f020, 0x3582a: 0x6d561420, 0x3582b: 0x6d561620, - 0x3582c: 0x6da77220, 0x3582d: 0x6da77420, 0x3582e: 0x6dc8c020, 0x3582f: 0x6e0ef620, - 0x35830: 0x6e0ef820, 0x35831: 0x6c01fc20, 0x35832: 0x6c04ca20, 0x35833: 0x6c04cc20, - 0x35834: 0x6c04ce20, 0x35835: 0x6c09b220, 0x35836: 0x6c09b420, 0x35837: 0x6c09b620, - 0x35838: 0x6c09b820, 0x35839: 0x6c09ba20, 0x3583a: 0x6c09bc20, 0x3583b: 0x6c09be20, - 0x3583c: 0x6c09c020, 0x3583d: 0x6c09c220, 0x3583e: 0x6c09c420, 0x3583f: 0x6c09c620, - // Block 0xd61, offset 0x35840 - 0x35840: 0x6c133020, 0x35841: 0x6c133220, 0x35842: 0x6c133420, 0x35843: 0x6c133620, - 0x35844: 0x6c133820, 0x35845: 0x6c133a20, 0x35846: 0x6c133c20, 0x35847: 0x6c133e20, - 0x35848: 0x6c134020, 0x35849: 0x6c134220, 0x3584a: 0x6c134420, 0x3584b: 0x6c134620, - 0x3584c: 0x6c134820, 0x3584d: 0x6c134a20, 0x3584e: 0x6c233a20, 0x3584f: 0x6c233c20, - 0x35850: 0x6c233e20, 0x35851: 0x6c234020, 0x35852: 0x6c234220, 0x35853: 0x6c234420, - 0x35854: 0x6c234620, 0x35855: 0x6c234820, 0x35856: 0x6c234a20, 0x35857: 0x6c234c20, - 0x35858: 0x6c234e20, 0x35859: 0x6c235020, 0x3585a: 0x6c235220, 0x3585b: 0x6c235420, - 0x3585c: 0x6c235620, 0x3585d: 0x6c235820, 0x3585e: 0x6c235a20, 0x3585f: 0x6c235c20, - 0x35860: 0x6c235e20, 0x35861: 0x6c236020, 0x35862: 0x6c236220, 0x35863: 0x6c236420, - 0x35864: 0x6c236620, 0x35865: 0x6c236820, 0x35866: 0x6c236a20, 0x35867: 0x6c236c20, - 0x35868: 0x6c236e20, 0x35869: 0x6c237020, 0x3586a: 0x6c237220, 0x3586b: 0x6c237420, - 0x3586c: 0x6c237620, 0x3586d: 0x6c237820, 0x3586e: 0x6c237a20, 0x3586f: 0x6c237c20, - 0x35870: 0x6c237e20, 0x35871: 0x6c238020, 0x35872: 0x6c392020, 0x35873: 0x6c392220, - 0x35874: 0x6c392420, 0x35875: 0x6c392620, 0x35876: 0x6c392820, 0x35877: 0x6c392a20, - 0x35878: 0x6c392c20, 0x35879: 0x6c392e20, 0x3587a: 0x6c393020, 0x3587b: 0x6c393220, - 0x3587c: 0x6c393420, 0x3587d: 0x6c393620, 0x3587e: 0x6c393820, 0x3587f: 0x6c393a20, - // Block 0xd62, offset 0x35880 - 0x35880: 0x6c393c20, 0x35881: 0x6c393e20, 0x35882: 0x6c394020, 0x35883: 0x6c394220, - 0x35884: 0x6c394420, 0x35885: 0x6c394620, 0x35886: 0x6c394820, 0x35887: 0x6c394a20, - 0x35888: 0x6c394c20, 0x35889: 0x6c394e20, 0x3588a: 0x6c395020, 0x3588b: 0x6c395220, - 0x3588c: 0x6c395420, 0x3588d: 0x6c395620, 0x3588e: 0x6c395820, 0x3588f: 0x6c395a20, - 0x35890: 0x6c395c20, 0x35891: 0x6c395e20, 0x35892: 0x6c396020, 0x35893: 0x6c396220, - 0x35894: 0x6c396420, 0x35895: 0x6c396620, 0x35896: 0x6c396820, 0x35897: 0x6c396a20, - 0x35898: 0x6c396c20, 0x35899: 0x6c396e20, 0x3589a: 0x6c397020, 0x3589b: 0x6c397220, - 0x3589c: 0x6c397420, 0x3589d: 0x6c397620, 0x3589e: 0x6c397820, 0x3589f: 0x6c397a20, - 0x358a0: 0x6c397c20, 0x358a1: 0x6c397e20, 0x358a2: 0x6c398020, 0x358a3: 0x6c398220, - 0x358a4: 0x6c549620, 0x358a5: 0x6c549820, 0x358a6: 0x6c549a20, 0x358a7: 0x6c549c20, - 0x358a8: 0x6c549e20, 0x358a9: 0x6c54a020, 0x358aa: 0x6c54a220, 0x358ab: 0x6c54a420, - 0x358ac: 0x6c54a620, 0x358ad: 0x6c54a820, 0x358ae: 0x6c54aa20, 0x358af: 0x6c54ac20, - 0x358b0: 0x6c54ae20, 0x358b1: 0x6c54b020, 0x358b2: 0x6c54b220, 0x358b3: 0x6c54b420, - 0x358b4: 0x6c54b620, 0x358b5: 0x6c54b820, 0x358b6: 0x6c54ba20, 0x358b7: 0x6c54bc20, - 0x358b8: 0x6c54be20, 0x358b9: 0x6c54c020, 0x358ba: 0x6c54c220, 0x358bb: 0x6c54c420, - 0x358bc: 0x6c54c620, 0x358bd: 0x6c54c820, 0x358be: 0x6c54ca20, 0x358bf: 0x6c54cc20, - // Block 0xd63, offset 0x358c0 - 0x358c0: 0x6c54ce20, 0x358c1: 0x6c54d020, 0x358c2: 0x6c54d220, 0x358c3: 0x6c54d420, - 0x358c4: 0x6c54d620, 0x358c5: 0x6c54d820, 0x358c6: 0x6c54da20, 0x358c7: 0x6c54dc20, - 0x358c8: 0x6c54de20, 0x358c9: 0x6c54e020, 0x358ca: 0x6c54e220, 0x358cb: 0x6c54e420, - 0x358cc: 0x6c54e620, 0x358cd: 0x6c54e820, 0x358ce: 0x6c54ea20, 0x358cf: 0x6c54ec20, - 0x358d0: 0x6c54ee20, 0x358d1: 0x6c54f020, 0x358d2: 0x6c54f220, 0x358d3: 0x6c54f420, - 0x358d4: 0x6c54f620, 0x358d5: 0x6c54f820, 0x358d6: 0x6c54fa20, 0x358d7: 0x6c54fc20, - 0x358d8: 0x6c54fe20, 0x358d9: 0x6c550020, 0x358da: 0x6c550220, 0x358db: 0x6c550420, - 0x358dc: 0x6c550620, 0x358dd: 0x6c550820, 0x358de: 0x6c771820, 0x358df: 0x6c771a20, - 0x358e0: 0x6c771c20, 0x358e1: 0x6c771e20, 0x358e2: 0x6c772020, 0x358e3: 0x6c772220, - 0x358e4: 0x6c772420, 0x358e5: 0x6c772620, 0x358e6: 0x6c772820, 0x358e7: 0x6c772a20, - 0x358e8: 0x6c772c20, 0x358e9: 0x6c772e20, 0x358ea: 0x6c773020, 0x358eb: 0x6c773220, - 0x358ec: 0x6c773420, 0x358ed: 0x6c773620, 0x358ee: 0x6c773820, 0x358ef: 0x6c773a20, - 0x358f0: 0x6c773c20, 0x358f1: 0x6c773e20, 0x358f2: 0x6c774020, 0x358f3: 0x6c774220, - 0x358f4: 0x6c774420, 0x358f5: 0x6c774620, 0x358f6: 0x6c774820, 0x358f7: 0x6c774a20, - 0x358f8: 0x6c774c20, 0x358f9: 0x6c774e20, 0x358fa: 0x6c775020, 0x358fb: 0x6c775220, - 0x358fc: 0x6c775420, 0x358fd: 0x6c775620, 0x358fe: 0x6c775820, 0x358ff: 0x6c775a20, - // Block 0xd64, offset 0x35900 - 0x35900: 0x6c775c20, 0x35901: 0x6c775e20, 0x35902: 0x6c776020, 0x35903: 0x6c776220, - 0x35904: 0x6c776420, 0x35905: 0x6c776620, 0x35906: 0x6c776820, 0x35907: 0x6c776a20, - 0x35908: 0x6c776c20, 0x35909: 0x6c776e20, 0x3590a: 0x6c777020, 0x3590b: 0x6c777220, - 0x3590c: 0x6c777420, 0x3590d: 0x6c777620, 0x3590e: 0x6c777820, 0x3590f: 0x6c777a20, - 0x35910: 0x6c777c20, 0x35911: 0x6c777e20, 0x35912: 0x6c778020, 0x35913: 0x6c778220, - 0x35914: 0x6c778420, 0x35915: 0x6c778620, 0x35916: 0x6c778820, 0x35917: 0x6c778a20, - 0x35918: 0x6c778c20, 0x35919: 0x6c778e20, 0x3591a: 0x6c779020, 0x3591b: 0x6c779220, - 0x3591c: 0x6c779420, 0x3591d: 0x6c779620, 0x3591e: 0x6c779820, 0x3591f: 0x6c779a20, - 0x35920: 0x6c779c20, 0x35921: 0x6c779e20, 0x35922: 0x6c77a020, 0x35923: 0x6c77a220, - 0x35924: 0x6c77a420, 0x35925: 0x6c77a620, 0x35926: 0x6c77a820, 0x35927: 0x6c77aa20, - 0x35928: 0x6c77ac20, 0x35929: 0x6c77ae20, 0x3592a: 0x6c77b020, 0x3592b: 0x6c77b220, - 0x3592c: 0x6c77b420, 0x3592d: 0x6c77b620, 0x3592e: 0x6c77b820, 0x3592f: 0x6c77ba20, - 0x35930: 0x6c77bc20, 0x35931: 0x6c77be20, 0x35932: 0x6c77c020, 0x35933: 0x6c77c220, - 0x35934: 0x6c77c420, 0x35935: 0x6c77c620, 0x35936: 0x6c77c820, 0x35937: 0x6c9fbc20, - 0x35938: 0x6c9fbe20, 0x35939: 0x6c9fc020, 0x3593a: 0x6c9fc220, 0x3593b: 0x6c9fc420, - 0x3593c: 0x6c9fc620, 0x3593d: 0x6c9fc820, 0x3593e: 0x6c9fca20, 0x3593f: 0x6c9fcc20, - // Block 0xd65, offset 0x35940 - 0x35940: 0x6c9fce20, 0x35941: 0x6c9fd020, 0x35942: 0x6c9fd220, 0x35943: 0x6c9fd420, - 0x35944: 0x6c9fd620, 0x35945: 0x6c9fd820, 0x35946: 0x6c9fda20, 0x35947: 0x6c9fdc20, - 0x35948: 0x6c9fde20, 0x35949: 0x6c9fe020, 0x3594a: 0x6c9fe220, 0x3594b: 0x6c9fe420, - 0x3594c: 0x6c9fe620, 0x3594d: 0x6c9fe820, 0x3594e: 0x6c9fea20, 0x3594f: 0x6c9fec20, - 0x35950: 0x6c9fee20, 0x35951: 0x6c9ff020, 0x35952: 0x6c9ff220, 0x35953: 0x6c9ff420, - 0x35954: 0x6c9ff620, 0x35955: 0x6c9ff820, 0x35956: 0x6c9ffa20, 0x35957: 0x6c9ffc20, - 0x35958: 0x6c9ffe20, 0x35959: 0x6ca00020, 0x3595a: 0x6ca00220, 0x3595b: 0x6ca00420, - 0x3595c: 0x6ca00620, 0x3595d: 0x6ca00820, 0x3595e: 0x6ca00a20, 0x3595f: 0x6ca00c20, - 0x35960: 0x6ca00e20, 0x35961: 0x6ca01020, 0x35962: 0x6ca01220, 0x35963: 0x6ca01420, - 0x35964: 0x6ca01620, 0x35965: 0x6ca01820, 0x35966: 0x6ca01a20, 0x35967: 0x6ca01c20, - 0x35968: 0x6ca01e20, 0x35969: 0x6ca02020, 0x3596a: 0x6ca02220, 0x3596b: 0x6ca02420, - 0x3596c: 0x6ca02620, 0x3596d: 0x6ca02820, 0x3596e: 0x6ca02a20, 0x3596f: 0x6ca02c20, - 0x35970: 0x6ca02e20, 0x35971: 0x6ca03020, 0x35972: 0x6ca03220, 0x35973: 0x6ca03420, - 0x35974: 0x6ca03620, 0x35975: 0x6ca03820, 0x35976: 0x6ca03a20, 0x35977: 0x6ca03c20, - 0x35978: 0x6ca03e20, 0x35979: 0x6ca04020, 0x3597a: 0x6ca04220, 0x3597b: 0x6ca04420, - 0x3597c: 0x6ca04620, 0x3597d: 0x6ca04820, 0x3597e: 0x6ca04a20, 0x3597f: 0x6ca04c20, - // Block 0xd66, offset 0x35980 - 0x35980: 0x6ca04e20, 0x35981: 0x6ca05020, 0x35982: 0x6ca05220, 0x35983: 0x6ca05420, - 0x35984: 0x6ca05620, 0x35985: 0x6ca05820, 0x35986: 0x6ca05a20, 0x35987: 0x6ca05c20, - 0x35988: 0x6ca05e20, 0x35989: 0x6ca06020, 0x3598a: 0x6ca06220, 0x3598b: 0x6ca06420, - 0x3598c: 0x6ca06620, 0x3598d: 0x6ca06820, 0x3598e: 0x6ca06a20, 0x3598f: 0x6ca06c20, - 0x35990: 0x6ca06e20, 0x35991: 0x6ca07020, 0x35992: 0x6ca07220, 0x35993: 0x6ca07420, - 0x35994: 0x6ca07620, 0x35995: 0x6ca07820, 0x35996: 0x6ca07a20, 0x35997: 0x6ca07c20, - 0x35998: 0x6ca07e20, 0x35999: 0x6ca08020, 0x3599a: 0x6c77ca20, 0x3599b: 0x6ca08220, - 0x3599c: 0x6ca08420, 0x3599d: 0x6ca08620, 0x3599e: 0x6ca08820, 0x3599f: 0x6ca08a20, - 0x359a0: 0x6ca08c20, 0x359a1: 0x6ca08e20, 0x359a2: 0x6ca09020, 0x359a3: 0x6ca09220, - 0x359a4: 0x6ca09420, 0x359a5: 0x6ca09620, 0x359a6: 0x6ca09820, 0x359a7: 0x6ca09a20, - 0x359a8: 0x6ca09c20, 0x359a9: 0x6ca09e20, 0x359aa: 0x6ca0a020, 0x359ab: 0x6ca0a220, - 0x359ac: 0x6ca0a420, 0x359ad: 0x6ca0a620, 0x359ae: 0x6ca0a820, 0x359af: 0x6ca0aa20, - 0x359b0: 0x6ca0ac20, 0x359b1: 0x6ca0ae20, 0x359b2: 0x6ca0b020, 0x359b3: 0x6ca0b220, - 0x359b4: 0x6ca0b420, 0x359b5: 0x6ca0b620, 0x359b6: 0x6ca0b820, 0x359b7: 0x6ca0ba20, - 0x359b8: 0x6ca0bc20, 0x359b9: 0x6ca0be20, 0x359ba: 0x6ca0c020, 0x359bb: 0x6ca0c220, - 0x359bc: 0x6cccf620, 0x359bd: 0x6cccf820, 0x359be: 0x6cccfa20, 0x359bf: 0x6cccfc20, - // Block 0xd67, offset 0x359c0 - 0x359c0: 0x6cccfe20, 0x359c1: 0x6ccd0020, 0x359c2: 0x6ccd0220, 0x359c3: 0x6ccd0420, - 0x359c4: 0x6ccd0620, 0x359c5: 0x6ccd0820, 0x359c6: 0x6ccd0a20, 0x359c7: 0x6ccd0c20, - 0x359c8: 0x6ccd0e20, 0x359c9: 0x6ccd1020, 0x359ca: 0x6ca0c420, 0x359cb: 0x6ccd1220, - 0x359cc: 0x6ccd1420, 0x359cd: 0x6ccd1620, 0x359ce: 0x6ccd1820, 0x359cf: 0x6ccd1a20, - 0x359d0: 0x6ccd1c20, 0x359d1: 0x6ccd1e20, 0x359d2: 0x6ccd2020, 0x359d3: 0x6ccd2220, - 0x359d4: 0x6ccd2420, 0x359d5: 0x6ccd2620, 0x359d6: 0x6ccd2820, 0x359d7: 0x6ccd2a20, - 0x359d8: 0x6ccd2c20, 0x359d9: 0x6ccd2e20, 0x359da: 0x6ccd3020, 0x359db: 0x6ccd3220, - 0x359dc: 0x6ccd3420, 0x359dd: 0x6ccd3620, 0x359de: 0x6ccd3820, 0x359df: 0x6ccd3a20, - 0x359e0: 0x6ccd3c20, 0x359e1: 0x6ccd3e20, 0x359e2: 0x6ccd4020, 0x359e3: 0x6ccd4220, - 0x359e4: 0x6ccd4420, 0x359e5: 0x6ccd4620, 0x359e6: 0x6ccd4820, 0x359e7: 0x6ccd4a20, - 0x359e8: 0x6ccd4c20, 0x359e9: 0x6ccd4e20, 0x359ea: 0x6ccd5020, 0x359eb: 0x6ccd5220, - 0x359ec: 0x6ccd5420, 0x359ed: 0x6ccd5620, 0x359ee: 0x6ccd5820, 0x359ef: 0x6ccd5a20, - 0x359f0: 0x6ccd5c20, 0x359f1: 0x6ccd5e20, 0x359f2: 0x6ccd6020, 0x359f3: 0x6ccd6220, - 0x359f4: 0x6ccd6420, 0x359f5: 0x6ccd6620, 0x359f6: 0x6ccd6820, 0x359f7: 0x6ccd6a20, - 0x359f8: 0x6ccd6c20, 0x359f9: 0x6ccd6e20, 0x359fa: 0x6ccd7020, 0x359fb: 0x6ccd7220, - 0x359fc: 0x6ccd7420, 0x359fd: 0x6ccd7620, 0x359fe: 0x6ccd7820, 0x359ff: 0x6ccd7a20, - // Block 0xd68, offset 0x35a00 - 0x35a00: 0x6ccd7c20, 0x35a01: 0x6ccd7e20, 0x35a02: 0x6ccd8020, 0x35a03: 0x6ccd8220, - 0x35a04: 0x6ccd8420, 0x35a05: 0x6ccd8620, 0x35a06: 0x6ccd8820, 0x35a07: 0x6ccd8a20, - 0x35a08: 0x6ccd8c20, 0x35a09: 0x6ccd8e20, 0x35a0a: 0x6ccd9020, 0x35a0b: 0x6ccd9220, - 0x35a0c: 0x6ccd9420, 0x35a0d: 0x6ccd9620, 0x35a0e: 0x6ccd9820, 0x35a0f: 0x6ccd9a20, - 0x35a10: 0x6ccd9c20, 0x35a11: 0x6ccd9e20, 0x35a12: 0x6ccda020, 0x35a13: 0x6ccda220, - 0x35a14: 0x6ccda420, 0x35a15: 0x6ccda620, 0x35a16: 0x6ccda820, 0x35a17: 0x6ccdaa20, - 0x35a18: 0x6ccdac20, 0x35a19: 0x6ccdae20, 0x35a1a: 0x6ccdb020, 0x35a1b: 0x6ccdb220, - 0x35a1c: 0x6ccdb420, 0x35a1d: 0x6cfac420, 0x35a1e: 0x6cfac620, 0x35a1f: 0x6cfac820, - 0x35a20: 0x6cfaca20, 0x35a21: 0x6cfacc20, 0x35a22: 0x6cface20, 0x35a23: 0x6cfad020, - 0x35a24: 0x6cfad220, 0x35a25: 0x6cfad420, 0x35a26: 0x6cfad620, 0x35a27: 0x6cfad820, - 0x35a28: 0x6cfada20, 0x35a29: 0x6cfadc20, 0x35a2a: 0x6cfade20, 0x35a2b: 0x6cfae020, - 0x35a2c: 0x6cfae220, 0x35a2d: 0x6cfae420, 0x35a2e: 0x6cfae620, 0x35a2f: 0x6cfae820, - 0x35a30: 0x6cfaea20, 0x35a31: 0x6cfaec20, 0x35a32: 0x6cfaee20, 0x35a33: 0x6cfaf020, - 0x35a34: 0x6cfaf220, 0x35a35: 0x6cfaf420, 0x35a36: 0x6cfaf620, 0x35a37: 0x6cfaf820, - 0x35a38: 0x6cfafa20, 0x35a39: 0x6cfafc20, 0x35a3a: 0x6cfafe20, 0x35a3b: 0x6cfb0020, - 0x35a3c: 0x6cfb0220, 0x35a3d: 0x6cfb0420, 0x35a3e: 0x6cfb0620, 0x35a3f: 0x6cfb0820, - // Block 0xd69, offset 0x35a40 - 0x35a40: 0x6cfb0a20, 0x35a41: 0x6cfb0c20, 0x35a42: 0x6cfb0e20, 0x35a43: 0x6cfb1020, - 0x35a44: 0x6cfb1220, 0x35a45: 0x6cfb1420, 0x35a46: 0x6cfb1620, 0x35a47: 0x6cfb1820, - 0x35a48: 0x6cfb1a20, 0x35a49: 0x6cfb1c20, 0x35a4a: 0x6cfb1e20, 0x35a4b: 0x6cfb2020, - 0x35a4c: 0x6cfb2220, 0x35a4d: 0x6cfb2420, 0x35a4e: 0x6cfb2620, 0x35a4f: 0x6cfb2820, - 0x35a50: 0x6cfb2a20, 0x35a51: 0x6cfb2c20, 0x35a52: 0x6cfb2e20, 0x35a53: 0x6cfb3020, - 0x35a54: 0x6cfb3220, 0x35a55: 0x6cfb3420, 0x35a56: 0x6cfb3620, 0x35a57: 0x6cfb3820, - 0x35a58: 0x6cfb3a20, 0x35a59: 0x6cfb3c20, 0x35a5a: 0x6cfb3e20, 0x35a5b: 0x6cfb4020, - 0x35a5c: 0x6cfb4220, 0x35a5d: 0x6cfb4420, 0x35a5e: 0x6cfb4620, 0x35a5f: 0x6cfb4820, - 0x35a60: 0x6cfb4a20, 0x35a61: 0x6cfb4c20, 0x35a62: 0x6cfb4e20, 0x35a63: 0x6cfb5020, - 0x35a64: 0x6cfb5220, 0x35a65: 0x6cfb5420, 0x35a66: 0x6cfb5620, 0x35a67: 0x6cfb5820, - 0x35a68: 0x6cfb5a20, 0x35a69: 0x6cfb5c20, 0x35a6a: 0x6cfb5e20, 0x35a6b: 0x6cfb6020, - 0x35a6c: 0x6cfb6220, 0x35a6d: 0x6cfb6420, 0x35a6e: 0x6cfb6620, 0x35a6f: 0x6cfb6820, - 0x35a70: 0x6cfb6a20, 0x35a71: 0x6cfb6c20, 0x35a72: 0x6cfb6e20, 0x35a73: 0x6cfb7020, - 0x35a74: 0x6cfb7220, 0x35a75: 0x6cfb7420, 0x35a76: 0x6cfb7620, 0x35a77: 0x6cfb7820, - 0x35a78: 0x6cfb7a20, 0x35a79: 0x6cfb7c20, 0x35a7a: 0x6cfb7e20, 0x35a7b: 0x6cfb8020, - 0x35a7c: 0x6cfb8220, 0x35a7d: 0x6cfb8420, 0x35a7e: 0x6cfb8620, 0x35a7f: 0x6cfb8820, - // Block 0xd6a, offset 0x35a80 - 0x35a80: 0x6cfb8a20, 0x35a81: 0x6cfb8c20, 0x35a82: 0x6cfb8e20, 0x35a83: 0x6cfb9020, - 0x35a84: 0x6cfb9220, 0x35a85: 0x6cfb9420, 0x35a86: 0x6cfb9620, 0x35a87: 0x6cfb9820, - 0x35a88: 0x6cfb9a20, 0x35a89: 0x6cfb9c20, 0x35a8a: 0x6cfb9e20, 0x35a8b: 0x6cfba020, - 0x35a8c: 0x6cfba220, 0x35a8d: 0x6d29ca20, 0x35a8e: 0x6d29cc20, 0x35a8f: 0x6d29ce20, - 0x35a90: 0x6d29d020, 0x35a91: 0x6d29d220, 0x35a92: 0x6d29d420, 0x35a93: 0x6d29d620, - 0x35a94: 0x6d29d820, 0x35a95: 0x6d29da20, 0x35a96: 0x6d29dc20, 0x35a97: 0x6d29de20, - 0x35a98: 0x6d29e020, 0x35a99: 0x6d29e220, 0x35a9a: 0x6d29e420, 0x35a9b: 0x6d29e620, - 0x35a9c: 0x6d29e820, 0x35a9d: 0x6d29ea20, 0x35a9e: 0x6d29ec20, 0x35a9f: 0x6d29ee20, - 0x35aa0: 0x6d29f020, 0x35aa1: 0x6d29f220, 0x35aa2: 0x6d29f420, 0x35aa3: 0x6d29f620, - 0x35aa4: 0x6d29f820, 0x35aa5: 0x6d29fa20, 0x35aa6: 0x6d29fc20, 0x35aa7: 0x6d29fe20, - 0x35aa8: 0x6d2a0020, 0x35aa9: 0x6d2a0220, 0x35aaa: 0x6d2a0420, 0x35aab: 0x6d2a0620, - 0x35aac: 0x6d2a0820, 0x35aad: 0x6d2a0a20, 0x35aae: 0x6d2a0c20, 0x35aaf: 0x6d2a0e20, - 0x35ab0: 0x6d2a1020, 0x35ab1: 0x6d2a1220, 0x35ab2: 0x6d2a1420, 0x35ab3: 0x6d2a1620, - 0x35ab4: 0x6d56e220, 0x35ab5: 0x6d2a1820, 0x35ab6: 0x6d2a1a20, 0x35ab7: 0x6d2a1c20, - 0x35ab8: 0x6d2a1e20, 0x35ab9: 0x6d2a2020, 0x35aba: 0x6d2a2220, 0x35abb: 0x6d2a2420, - 0x35abc: 0x6d2a2620, 0x35abd: 0x6d2a2820, 0x35abe: 0x6d2a2a20, 0x35abf: 0x6d2a2c20, - // Block 0xd6b, offset 0x35ac0 - 0x35ac0: 0x6d2a2e20, 0x35ac1: 0x6d2a3020, 0x35ac2: 0x6d2a3220, 0x35ac3: 0x6d2a3420, - 0x35ac4: 0x6d2a3620, 0x35ac5: 0x6d2a3820, 0x35ac6: 0x6d2a3a20, 0x35ac7: 0x6d2a3c20, - 0x35ac8: 0x6d2a3e20, 0x35ac9: 0x6d2a4020, 0x35aca: 0x6d2a4220, 0x35acb: 0x6d2a4420, - 0x35acc: 0x6d2a4620, 0x35acd: 0x6d2a4820, 0x35ace: 0x6d2a4a20, 0x35acf: 0x6d2a4c20, - 0x35ad0: 0x6d2a4e20, 0x35ad1: 0x6d2a5020, 0x35ad2: 0x6d2a5220, 0x35ad3: 0x6d2a5420, - 0x35ad4: 0x6d2a5620, 0x35ad5: 0x6d2a5820, 0x35ad6: 0x6d2a5a20, 0x35ad7: 0x6d2a5c20, - 0x35ad8: 0x6d2a5e20, 0x35ad9: 0x6d4f2420, 0x35ada: 0x6d2a6020, 0x35adb: 0x6d2a6220, - 0x35adc: 0x6d2a6420, 0x35add: 0x6d2a6620, 0x35ade: 0x6d2a6820, 0x35adf: 0x6d2a6a20, - 0x35ae0: 0x6d2a6c20, 0x35ae1: 0x6d2a6e20, 0x35ae2: 0x6d2a7020, 0x35ae3: 0x6d2a7220, - 0x35ae4: 0x6d2a7420, 0x35ae5: 0x6d2a7620, 0x35ae6: 0x6d2a7820, 0x35ae7: 0x6d2a7a20, - 0x35ae8: 0x6d2a7c20, 0x35ae9: 0x6d2a7e20, 0x35aea: 0x6d2a8020, 0x35aeb: 0x6d2a8220, - 0x35aec: 0x6d2a8420, 0x35aed: 0x6d2a8620, 0x35aee: 0x6d2a8820, 0x35aef: 0x6d2a8a20, - 0x35af0: 0x6d2a8c20, 0x35af1: 0x6d2a8e20, 0x35af2: 0x6d2a9020, 0x35af3: 0x6d2a9220, - 0x35af4: 0x6d2a9420, 0x35af5: 0x6d2a9620, 0x35af6: 0x6d2a9820, 0x35af7: 0x6d2a9a20, - 0x35af8: 0x6d2a9c20, 0x35af9: 0x6d2a9e20, 0x35afa: 0x6d2aa020, 0x35afb: 0x6d2aa220, - 0x35afc: 0x6d2aa420, 0x35afd: 0x6d2aa620, 0x35afe: 0x6d2aa820, 0x35aff: 0x6d2aaa20, - // Block 0xd6c, offset 0x35b00 - 0x35b00: 0x6d2aac20, 0x35b01: 0x6d2aae20, 0x35b02: 0x6d2ab020, 0x35b03: 0x6d56e420, - 0x35b04: 0x6d56e620, 0x35b05: 0x6d56e820, 0x35b06: 0x6d56ea20, 0x35b07: 0x6d56ec20, - 0x35b08: 0x6d56ee20, 0x35b09: 0x6d56f020, 0x35b0a: 0x6d56f220, 0x35b0b: 0x6d56f420, - 0x35b0c: 0x6d56f620, 0x35b0d: 0x6d56f820, 0x35b0e: 0x6d56fa20, 0x35b0f: 0x6d56fc20, - 0x35b10: 0x6d56fe20, 0x35b11: 0x6d570020, 0x35b12: 0x6d570220, 0x35b13: 0x6d570420, - 0x35b14: 0x6d570620, 0x35b15: 0x6d570820, 0x35b16: 0x6d570a20, 0x35b17: 0x6d570c20, - 0x35b18: 0x6d570e20, 0x35b19: 0x6d571020, 0x35b1a: 0x6d571220, 0x35b1b: 0x6d571420, - 0x35b1c: 0x6d571620, 0x35b1d: 0x6d571820, 0x35b1e: 0x6d571a20, 0x35b1f: 0x6d571c20, - 0x35b20: 0x6d571e20, 0x35b21: 0x6d572020, 0x35b22: 0x6d572220, 0x35b23: 0x6d572420, - 0x35b24: 0x6d572620, 0x35b25: 0x6d572820, 0x35b26: 0x6d572a20, 0x35b27: 0x6d572c20, - 0x35b28: 0x6d572e20, 0x35b29: 0x6d573020, 0x35b2a: 0x6d573220, 0x35b2b: 0x6d573420, - 0x35b2c: 0x6d573620, 0x35b2d: 0x6d573820, 0x35b2e: 0x6d573a20, 0x35b2f: 0x6d573c20, - 0x35b30: 0x6d573e20, 0x35b31: 0x6d574020, 0x35b32: 0x6d574220, 0x35b33: 0x6d574420, - 0x35b34: 0x6d574620, 0x35b35: 0x6d574820, 0x35b36: 0x6d574a20, 0x35b37: 0x6d574c20, - 0x35b38: 0x6d574e20, 0x35b39: 0x6d575020, 0x35b3a: 0x6d575220, 0x35b3b: 0x6d575420, - 0x35b3c: 0x6d575620, 0x35b3d: 0x6d575820, 0x35b3e: 0x6d575a20, 0x35b3f: 0x6d575c20, - // Block 0xd6d, offset 0x35b40 - 0x35b40: 0x6d575e20, 0x35b41: 0x6d576020, 0x35b42: 0x6d576220, 0x35b43: 0x6d576420, - 0x35b44: 0x6d576620, 0x35b45: 0x6d576820, 0x35b46: 0x6d576a20, 0x35b47: 0x6d576c20, - 0x35b48: 0x6d576e20, 0x35b49: 0x6d577020, 0x35b4a: 0x6d577220, 0x35b4b: 0x6d577420, - 0x35b4c: 0x6d577620, 0x35b4d: 0x6d577820, 0x35b4e: 0x6d577a20, 0x35b4f: 0x6d577c20, - 0x35b50: 0x6d577e20, 0x35b51: 0x6d578020, 0x35b52: 0x6d578220, 0x35b53: 0x6d578420, - 0x35b54: 0x6d578620, 0x35b55: 0x6d578820, 0x35b56: 0x6d578a20, 0x35b57: 0x6d578c20, - 0x35b58: 0x6d578e20, 0x35b59: 0x6d579020, 0x35b5a: 0x6d579220, 0x35b5b: 0x6d579420, - 0x35b5c: 0x6d579620, 0x35b5d: 0x6d579820, 0x35b5e: 0x6d579a20, 0x35b5f: 0x6d579c20, - 0x35b60: 0x6d579e20, 0x35b61: 0x6d57a020, 0x35b62: 0x6d57a220, 0x35b63: 0x6d57a420, - 0x35b64: 0x6d57a620, 0x35b65: 0x6d57a820, 0x35b66: 0x6d57aa20, 0x35b67: 0x6d57ac20, - 0x35b68: 0x6d57ae20, 0x35b69: 0x6d822820, 0x35b6a: 0x6d57b020, 0x35b6b: 0x6d57b220, - 0x35b6c: 0x6d57b420, 0x35b6d: 0x6d57b620, 0x35b6e: 0x6d57b820, 0x35b6f: 0x6d57ba20, - 0x35b70: 0x6d57bc20, 0x35b71: 0x6d57be20, 0x35b72: 0x6d57c020, 0x35b73: 0x6d57c220, - 0x35b74: 0x6d57c420, 0x35b75: 0x6d57c620, 0x35b76: 0x6d57c820, 0x35b77: 0x6d57ca20, - 0x35b78: 0x6d57cc20, 0x35b79: 0x6d57ce20, 0x35b7a: 0x6d57d020, 0x35b7b: 0x6d57d220, - 0x35b7c: 0x6d57d420, 0x35b7d: 0x6d57d620, 0x35b7e: 0x6d57d820, 0x35b7f: 0x6d57da20, - // Block 0xd6e, offset 0x35b80 - 0x35b80: 0x6da7de20, 0x35b81: 0x6d57dc20, 0x35b82: 0x6d57de20, 0x35b83: 0x6d57e020, - 0x35b84: 0x6d57e220, 0x35b85: 0x6d822a20, 0x35b86: 0x6d822c20, 0x35b87: 0x6d822e20, - 0x35b88: 0x6d823020, 0x35b89: 0x6d823220, 0x35b8a: 0x6d823420, 0x35b8b: 0x6d823620, - 0x35b8c: 0x6d823820, 0x35b8d: 0x6d823a20, 0x35b8e: 0x6d823c20, 0x35b8f: 0x6d823e20, - 0x35b90: 0x6d824020, 0x35b91: 0x6d824220, 0x35b92: 0x6d824420, 0x35b93: 0x6d824620, - 0x35b94: 0x6d824820, 0x35b95: 0x6d824a20, 0x35b96: 0x6d824c20, 0x35b97: 0x6d824e20, - 0x35b98: 0x6d825020, 0x35b99: 0x6d825220, 0x35b9a: 0x6d825420, 0x35b9b: 0x6d825620, - 0x35b9c: 0x6d825820, 0x35b9d: 0x6d825a20, 0x35b9e: 0x6d825c20, 0x35b9f: 0x6d825e20, - 0x35ba0: 0x6d826020, 0x35ba1: 0x6d826220, 0x35ba2: 0x6d826420, 0x35ba3: 0x6d826620, - 0x35ba4: 0x6d826820, 0x35ba5: 0x6d826a20, 0x35ba6: 0x6d826c20, 0x35ba7: 0x6d826e20, - 0x35ba8: 0x6d827020, 0x35ba9: 0x6d827220, 0x35baa: 0x6d827420, 0x35bab: 0x6d827620, - 0x35bac: 0x6d827820, 0x35bad: 0x6d827a20, 0x35bae: 0x6d827c20, 0x35baf: 0x6d827e20, - 0x35bb0: 0x6d828020, 0x35bb1: 0x6d828220, 0x35bb2: 0x6d828420, 0x35bb3: 0x6d828620, - 0x35bb4: 0x6d828820, 0x35bb5: 0x6d828a20, 0x35bb6: 0x6d828c20, 0x35bb7: 0x6d828e20, - 0x35bb8: 0x6d829020, 0x35bb9: 0x6d829220, 0x35bba: 0x6d829420, 0x35bbb: 0x6d829620, - 0x35bbc: 0x6d829820, 0x35bbd: 0x6d829a20, 0x35bbe: 0x6d829c20, 0x35bbf: 0x6d829e20, - // Block 0xd6f, offset 0x35bc0 - 0x35bc0: 0x6d82a020, 0x35bc1: 0x6d82a220, 0x35bc2: 0x6d82a420, 0x35bc3: 0x6d82a620, - 0x35bc4: 0x6d82a820, 0x35bc5: 0x6d82aa20, 0x35bc6: 0x6d82ac20, 0x35bc7: 0x6d82ae20, - 0x35bc8: 0x6d82b020, 0x35bc9: 0x6d82b220, 0x35bca: 0x6d82b420, 0x35bcb: 0x6d82b620, - 0x35bcc: 0x6d82b820, 0x35bcd: 0x6d82ba20, 0x35bce: 0x6d82bc20, 0x35bcf: 0x6d82be20, - 0x35bd0: 0x6d82c020, 0x35bd1: 0x6d82c220, 0x35bd2: 0x6d82c420, 0x35bd3: 0x6d82c620, - 0x35bd4: 0x6d82c820, 0x35bd5: 0x6d82ca20, 0x35bd6: 0x6d82cc20, 0x35bd7: 0x6d82ce20, - 0x35bd8: 0x6d82d020, 0x35bd9: 0x6d82d220, 0x35bda: 0x6d82d420, 0x35bdb: 0x6d82d620, - 0x35bdc: 0x6d82d820, 0x35bdd: 0x6d82da20, 0x35bde: 0x6d82dc20, 0x35bdf: 0x6d82de20, - 0x35be0: 0x6d82e020, 0x35be1: 0x6d82e220, 0x35be2: 0x6d7ade20, 0x35be3: 0x6da7e020, - 0x35be4: 0x6da7e220, 0x35be5: 0x6da7e420, 0x35be6: 0x6da7e620, 0x35be7: 0x6da7e820, - 0x35be8: 0x6da7ea20, 0x35be9: 0x6da7ec20, 0x35bea: 0x6da7ee20, 0x35beb: 0x6da7f020, - 0x35bec: 0x6da7f220, 0x35bed: 0x6da7f420, 0x35bee: 0x6da7f620, 0x35bef: 0x6da7f820, - 0x35bf0: 0x6da7fa20, 0x35bf1: 0x6da7fc20, 0x35bf2: 0x6da7fe20, 0x35bf3: 0x6da80020, - 0x35bf4: 0x6da80220, 0x35bf5: 0x6da80420, 0x35bf6: 0x6da80620, 0x35bf7: 0x6da80820, - 0x35bf8: 0x6da80a20, 0x35bf9: 0x6da80c20, 0x35bfa: 0x6da80e20, 0x35bfb: 0x6da81020, - 0x35bfc: 0x6da81220, 0x35bfd: 0x6da81420, 0x35bfe: 0x6da81620, 0x35bff: 0x6da81820, - // Block 0xd70, offset 0x35c00 - 0x35c00: 0x6da81a20, 0x35c01: 0x6da81c20, 0x35c02: 0x6da81e20, 0x35c03: 0x6da82020, - 0x35c04: 0x6da82220, 0x35c05: 0x6da82420, 0x35c06: 0x6da82620, 0x35c07: 0x6da82820, - 0x35c08: 0x6da82a20, 0x35c09: 0x6da82c20, 0x35c0a: 0x6da82e20, 0x35c0b: 0x6da83020, - 0x35c0c: 0x6da83220, 0x35c0d: 0x6da83420, 0x35c0e: 0x6da83620, 0x35c0f: 0x6da83820, - 0x35c10: 0x6da83a20, 0x35c11: 0x6da83c20, 0x35c12: 0x6da83e20, 0x35c13: 0x6da84020, - 0x35c14: 0x6da84220, 0x35c15: 0x6da84420, 0x35c16: 0x6da84620, 0x35c17: 0x6da84820, - 0x35c18: 0x6da84a20, 0x35c19: 0x6da84c20, 0x35c1a: 0x6da84e20, 0x35c1b: 0x6da85020, - 0x35c1c: 0x6da85220, 0x35c1d: 0x6da85420, 0x35c1e: 0x6dc90820, 0x35c1f: 0x6da85620, - 0x35c20: 0x6da85820, 0x35c21: 0x6dc90a20, 0x35c22: 0x6dc90c20, 0x35c23: 0x6dc90e20, - 0x35c24: 0x6dc91020, 0x35c25: 0x6dc91220, 0x35c26: 0x6dc91420, 0x35c27: 0x6dc91620, - 0x35c28: 0x6dc91820, 0x35c29: 0x6dc91a20, 0x35c2a: 0x6dc91c20, 0x35c2b: 0x6dc91e20, - 0x35c2c: 0x6dc92020, 0x35c2d: 0x6dc92220, 0x35c2e: 0x6dc92420, 0x35c2f: 0x6dc92620, - 0x35c30: 0x6dc92820, 0x35c31: 0x6dc92a20, 0x35c32: 0x6dc92c20, 0x35c33: 0x6dc92e20, - 0x35c34: 0x6dc93020, 0x35c35: 0x6dc93220, 0x35c36: 0x6dc93420, 0x35c37: 0x6dc93620, - 0x35c38: 0x6dc93820, 0x35c39: 0x6dc93a20, 0x35c3a: 0x6dc93c20, 0x35c3b: 0x6dc93e20, - 0x35c3c: 0x6dc94020, 0x35c3d: 0x6dc94220, 0x35c3e: 0x6dc94420, 0x35c3f: 0x6dc94620, - // Block 0xd71, offset 0x35c40 - 0x35c40: 0x6dc94820, 0x35c41: 0x6dc94a20, 0x35c42: 0x6dc94c20, 0x35c43: 0x6dc94e20, - 0x35c44: 0x6dc95020, 0x35c45: 0x6dc95220, 0x35c46: 0x6dc95420, 0x35c47: 0x6dc95620, - 0x35c48: 0x6dc95820, 0x35c49: 0x6dc95a20, 0x35c4a: 0x6dc95c20, 0x35c4b: 0x6dc95e20, - 0x35c4c: 0x6dc96020, 0x35c4d: 0x6dc96220, 0x35c4e: 0x6dc96420, 0x35c4f: 0x6dc96620, - 0x35c50: 0x6dc96820, 0x35c51: 0x6dc96a20, 0x35c52: 0x6dc96c20, 0x35c53: 0x6dc96e20, - 0x35c54: 0x6dc97020, 0x35c55: 0x6dc97220, 0x35c56: 0x6dc97420, 0x35c57: 0x6dc97620, - 0x35c58: 0x6dc97820, 0x35c59: 0x6dc97a20, 0x35c5a: 0x6dc97c20, 0x35c5b: 0x6dc97e20, - 0x35c5c: 0x6dc98020, 0x35c5d: 0x6de4f420, 0x35c5e: 0x6dc98220, 0x35c5f: 0x6dc98420, - 0x35c60: 0x6dc98620, 0x35c61: 0x6de4f620, 0x35c62: 0x6dc98820, 0x35c63: 0x6dc98a20, - 0x35c64: 0x6dc98c20, 0x35c65: 0x6dc98e20, 0x35c66: 0x6dc99020, 0x35c67: 0x6dc99220, - 0x35c68: 0x6dc99420, 0x35c69: 0x6dc99620, 0x35c6a: 0x6dc99820, 0x35c6b: 0x6dc99a20, - 0x35c6c: 0x6dc99c20, 0x35c6d: 0x6dc99e20, 0x35c6e: 0x6dc9a020, 0x35c6f: 0x6dc9a220, - 0x35c70: 0x6dc9a420, 0x35c71: 0x6dc9a620, 0x35c72: 0x6dc9a820, 0x35c73: 0x6de4f820, - 0x35c74: 0x6de4fa20, 0x35c75: 0x6de4fc20, 0x35c76: 0x6de4fe20, 0x35c77: 0x6de50020, - 0x35c78: 0x6de50220, 0x35c79: 0x6de50420, 0x35c7a: 0x6de50620, 0x35c7b: 0x6de50820, - 0x35c7c: 0x6de50a20, 0x35c7d: 0x6de50c20, 0x35c7e: 0x6de50e20, 0x35c7f: 0x6de51020, - // Block 0xd72, offset 0x35c80 - 0x35c80: 0x6de51220, 0x35c81: 0x6de51420, 0x35c82: 0x6de51620, 0x35c83: 0x6de51820, - 0x35c84: 0x6de51a20, 0x35c85: 0x6de51c20, 0x35c86: 0x6de51e20, 0x35c87: 0x6de52020, - 0x35c88: 0x6de52220, 0x35c89: 0x6de52420, 0x35c8a: 0x6de52620, 0x35c8b: 0x6de52820, - 0x35c8c: 0x6de52a20, 0x35c8d: 0x6de52c20, 0x35c8e: 0x6de52e20, 0x35c8f: 0x6de53020, - 0x35c90: 0x6de53220, 0x35c91: 0x6de53420, 0x35c92: 0x6de53620, 0x35c93: 0x6de53820, - 0x35c94: 0x6de53a20, 0x35c95: 0x6de53c20, 0x35c96: 0x6de53e20, 0x35c97: 0x6de54020, - 0x35c98: 0x6de54220, 0x35c99: 0x6de54420, 0x35c9a: 0x6de54620, 0x35c9b: 0x6de54820, - 0x35c9c: 0x6de54a20, 0x35c9d: 0x6de54c20, 0x35c9e: 0x6de54e20, 0x35c9f: 0x6de55020, - 0x35ca0: 0x6de55220, 0x35ca1: 0x6de55420, 0x35ca2: 0x6de55620, 0x35ca3: 0x6de55820, - 0x35ca4: 0x6de55a20, 0x35ca5: 0x6de55c20, 0x35ca6: 0x6de55e20, 0x35ca7: 0x6de56020, - 0x35ca8: 0x6dfbf620, 0x35ca9: 0x6dfbf820, 0x35caa: 0x6dfbfa20, 0x35cab: 0x6dfbfc20, - 0x35cac: 0x6dfbfe20, 0x35cad: 0x6dfc0020, 0x35cae: 0x6dfc0220, 0x35caf: 0x6dfc0420, - 0x35cb0: 0x6dfc0620, 0x35cb1: 0x6dfc0820, 0x35cb2: 0x6dfc0a20, 0x35cb3: 0x6dfc0c20, - 0x35cb4: 0x6dfc0e20, 0x35cb5: 0x6dfc1020, 0x35cb6: 0x6dfc1220, 0x35cb7: 0x6dfc1420, - 0x35cb8: 0x6dfc1620, 0x35cb9: 0x6dfc1820, 0x35cba: 0x6dfc1a20, 0x35cbb: 0x6dfc1c20, - 0x35cbc: 0x6dfc1e20, 0x35cbd: 0x6dfc2020, 0x35cbe: 0x6dfc2220, 0x35cbf: 0x6dfc2420, - // Block 0xd73, offset 0x35cc0 - 0x35cc0: 0x6dfc2620, 0x35cc1: 0x6dfc2820, 0x35cc2: 0x6dfc2a20, 0x35cc3: 0x6dfc2c20, - 0x35cc4: 0x6dfc2e20, 0x35cc5: 0x6dfc3020, 0x35cc6: 0x6dfc3220, 0x35cc7: 0x6dfc3420, - 0x35cc8: 0x6dfc3620, 0x35cc9: 0x6dfc3820, 0x35cca: 0x6dfc3a20, 0x35ccb: 0x6dfc3c20, - 0x35ccc: 0x6dfc3e20, 0x35ccd: 0x6dfc4020, 0x35cce: 0x6e0f2220, 0x35ccf: 0x6e0f2420, - 0x35cd0: 0x6e0f2620, 0x35cd1: 0x6e0f2820, 0x35cd2: 0x6e0f2a20, 0x35cd3: 0x6e0f2c20, - 0x35cd4: 0x6e0f2e20, 0x35cd5: 0x6e0f3020, 0x35cd6: 0x6e0f3220, 0x35cd7: 0x6e0f3420, - 0x35cd8: 0x6e0f3620, 0x35cd9: 0x6e0f3820, 0x35cda: 0x6e0f3a20, 0x35cdb: 0x6e0f3c20, - 0x35cdc: 0x6e0f3e20, 0x35cdd: 0x6e0f4020, 0x35cde: 0x6e0f4220, 0x35cdf: 0x6e0f4420, - 0x35ce0: 0x6e0f4620, 0x35ce1: 0x6e0f4820, 0x35ce2: 0x6e0f4a20, 0x35ce3: 0x6e0f4c20, - 0x35ce4: 0x6e0f4e20, 0x35ce5: 0x6e0f5020, 0x35ce6: 0x6e0f5220, 0x35ce7: 0x6e0f5420, - 0x35ce8: 0x6e0f5620, 0x35ce9: 0x6e0f5820, 0x35cea: 0x6e0f5a20, 0x35ceb: 0x6e0f5c20, - 0x35cec: 0x6e0f5e20, 0x35ced: 0x6e0f6020, 0x35cee: 0x6e0f6220, 0x35cef: 0x6e0f6420, - 0x35cf0: 0x6e0f6620, 0x35cf1: 0x6e0f6820, 0x35cf2: 0x6e0f6a20, 0x35cf3: 0x6e0f6c20, - 0x35cf4: 0x6e0f6e20, 0x35cf5: 0x6e0f7020, 0x35cf6: 0x6e1e4220, 0x35cf7: 0x6e1e4420, - 0x35cf8: 0x6e1e4620, 0x35cf9: 0x6e1e4820, 0x35cfa: 0x6e1e4a20, 0x35cfb: 0x6e1e4c20, - 0x35cfc: 0x6e1e4e20, 0x35cfd: 0x6e1e5020, 0x35cfe: 0x6e1e5220, 0x35cff: 0x6e1e5420, - // Block 0xd74, offset 0x35d00 - 0x35d00: 0x6e1e5620, 0x35d01: 0x6e1e5820, 0x35d02: 0x6e1e5a20, 0x35d03: 0x6e1e5c20, - 0x35d04: 0x6e1e5e20, 0x35d05: 0x6e1e6020, 0x35d06: 0x6e1e6220, 0x35d07: 0x6e1e6420, - 0x35d08: 0x6e1e6620, 0x35d09: 0x6e1e6820, 0x35d0a: 0x6e29a620, 0x35d0b: 0x6e29a820, - 0x35d0c: 0x6e29aa20, 0x35d0d: 0x6e29ac20, 0x35d0e: 0x6e29ae20, 0x35d0f: 0x6e29b020, - 0x35d10: 0x6e29b220, 0x35d11: 0x6e29b420, 0x35d12: 0x6e29b620, 0x35d13: 0x6e29b820, - 0x35d14: 0x6e29ba20, 0x35d15: 0x6e29bc20, 0x35d16: 0x6e29be20, 0x35d17: 0x6e29c020, - 0x35d18: 0x6e29c220, 0x35d19: 0x6e29c420, 0x35d1a: 0x6e29c620, 0x35d1b: 0x6e29c820, - 0x35d1c: 0x6e29ca20, 0x35d1d: 0x6e29cc20, 0x35d1e: 0x6e29ce20, 0x35d1f: 0x6e29d020, - 0x35d20: 0x6e32ac20, 0x35d21: 0x6e32ae20, 0x35d22: 0x6e32b020, 0x35d23: 0x6e32b220, - 0x35d24: 0x6e32b420, 0x35d25: 0x6e32b620, 0x35d26: 0x6e32b820, 0x35d27: 0x6e32ba20, - 0x35d28: 0x6e32bc20, 0x35d29: 0x6e38e420, 0x35d2a: 0x6e38e620, 0x35d2b: 0x6e38e820, - 0x35d2c: 0x6e38ea20, 0x35d2d: 0x6e38ec20, 0x35d2e: 0x6e38ee20, 0x35d2f: 0x6e38f020, - 0x35d30: 0x6e3d5820, 0x35d31: 0x6e3d5a20, 0x35d32: 0x6e3d5c20, 0x35d33: 0x6e3d5e20, - 0x35d34: 0x6e3d6020, 0x35d35: 0x6e3d6220, 0x35d36: 0x6e3d6420, 0x35d37: 0x6e406220, - 0x35d38: 0x6e406420, 0x35d39: 0x6e406620, 0x35d3a: 0x6e406820, 0x35d3b: 0x6e406a20, - 0x35d3c: 0x6e42b220, 0x35d3d: 0x6e42b420, 0x35d3e: 0x6e443220, 0x35d3f: 0x6e452220, - // Block 0xd75, offset 0x35d40 - 0x35d40: 0x6e468020, 0x35d41: 0x6e46c820, 0x35d42: 0x6c09cc20, 0x35d43: 0x6c136620, - 0x35d44: 0x6c136820, 0x35d45: 0x6c136a20, 0x35d46: 0x6c136c20, 0x35d47: 0x6c136e20, - 0x35d48: 0x6c137020, 0x35d49: 0x6c137220, 0x35d4a: 0x6c137420, 0x35d4b: 0x6c137620, - 0x35d4c: 0x6c137820, 0x35d4d: 0x6c23aa20, 0x35d4e: 0x6c23ac20, 0x35d4f: 0x6c23ae20, - 0x35d50: 0x6c23b020, 0x35d51: 0x6c23b220, 0x35d52: 0x6c23b420, 0x35d53: 0x6c23b620, - 0x35d54: 0x6c23b820, 0x35d55: 0x6c23ba20, 0x35d56: 0x6c23bc20, 0x35d57: 0x6c23be20, - 0x35d58: 0x6c23c020, 0x35d59: 0x6c23c220, 0x35d5a: 0x6c23c420, 0x35d5b: 0x6c23c620, - 0x35d5c: 0x6c23c820, 0x35d5d: 0x6c39d820, 0x35d5e: 0x6c39da20, 0x35d5f: 0x6c39dc20, - 0x35d60: 0x6c39de20, 0x35d61: 0x6c39e020, 0x35d62: 0x6c39e220, 0x35d63: 0x6c39e420, - 0x35d64: 0x6c39e620, 0x35d65: 0x6c39e820, 0x35d66: 0x6c39ea20, 0x35d67: 0x6c39ec20, - 0x35d68: 0x6c39ee20, 0x35d69: 0x6c39f020, 0x35d6a: 0x6c39f220, 0x35d6b: 0x6c39f420, - 0x35d6c: 0x6c39f620, 0x35d6d: 0x6c39f820, 0x35d6e: 0x6c39fa20, 0x35d6f: 0x6c39fc20, - 0x35d70: 0x6c39fe20, 0x35d71: 0x6c3a0020, 0x35d72: 0x6c3a0220, 0x35d73: 0x6c3a0420, - 0x35d74: 0x6c3a0620, 0x35d75: 0x6c3a0820, 0x35d76: 0x6c3a0a20, 0x35d77: 0x6c3a0c20, - 0x35d78: 0x6c3a0e20, 0x35d79: 0x6c3a1020, 0x35d7a: 0x6c3a1220, 0x35d7b: 0x6c3a1420, - 0x35d7c: 0x6c557220, 0x35d7d: 0x6c557420, 0x35d7e: 0x6c557620, 0x35d7f: 0x6c557820, - // Block 0xd76, offset 0x35d80 - 0x35d80: 0x6c557a20, 0x35d81: 0x6c557c20, 0x35d82: 0x6c557e20, 0x35d83: 0x6c558020, - 0x35d84: 0x6c558220, 0x35d85: 0x6c558420, 0x35d86: 0x6c558620, 0x35d87: 0x6c558820, - 0x35d88: 0x6c558a20, 0x35d89: 0x6c558c20, 0x35d8a: 0x6c558e20, 0x35d8b: 0x6c559020, - 0x35d8c: 0x6c559220, 0x35d8d: 0x6c559420, 0x35d8e: 0x6c559620, 0x35d8f: 0x6c559820, - 0x35d90: 0x6c559a20, 0x35d91: 0x6c559c20, 0x35d92: 0x6c559e20, 0x35d93: 0x6c55a020, - 0x35d94: 0x6c55a220, 0x35d95: 0x6c55a420, 0x35d96: 0x6c55a620, 0x35d97: 0x6c55a820, - 0x35d98: 0x6c55aa20, 0x35d99: 0x6c55ac20, 0x35d9a: 0x6c55ae20, 0x35d9b: 0x6c55b020, - 0x35d9c: 0x6c55b220, 0x35d9d: 0x6c55b420, 0x35d9e: 0x6c55b620, 0x35d9f: 0x6c55b820, - 0x35da0: 0x6c55ba20, 0x35da1: 0x6c55bc20, 0x35da2: 0x6c55be20, 0x35da3: 0x6c55c020, - 0x35da4: 0x6c55c220, 0x35da5: 0x6c55c420, 0x35da6: 0x6c55c620, 0x35da7: 0x6c55c820, - 0x35da8: 0x6c55ca20, 0x35da9: 0x6c55cc20, 0x35daa: 0x6c55ce20, 0x35dab: 0x6c55d020, - 0x35dac: 0x6c55d220, 0x35dad: 0x6c55d420, 0x35dae: 0x6c55d620, 0x35daf: 0x6c784c20, - 0x35db0: 0x6c784e20, 0x35db1: 0x6c785020, 0x35db2: 0x6c785220, 0x35db3: 0x6c785420, - 0x35db4: 0x6c785620, 0x35db5: 0x6c785820, 0x35db6: 0x6c785a20, 0x35db7: 0x6c785c20, - 0x35db8: 0x6c785e20, 0x35db9: 0x6c786020, 0x35dba: 0x6c786220, 0x35dbb: 0x6c786420, - 0x35dbc: 0x6c786620, 0x35dbd: 0x6c786820, 0x35dbe: 0x6c786a20, 0x35dbf: 0x6c786c20, - // Block 0xd77, offset 0x35dc0 - 0x35dc0: 0x6c786e20, 0x35dc1: 0x6c787020, 0x35dc2: 0x6c787220, 0x35dc3: 0x6c787420, - 0x35dc4: 0x6c787620, 0x35dc5: 0x6c787820, 0x35dc6: 0x6c787a20, 0x35dc7: 0x6c787c20, - 0x35dc8: 0x6c787e20, 0x35dc9: 0x6c788020, 0x35dca: 0x6c788220, 0x35dcb: 0x6c788420, - 0x35dcc: 0x6c788620, 0x35dcd: 0x6c788820, 0x35dce: 0x6c788a20, 0x35dcf: 0x6c788c20, - 0x35dd0: 0x6c788e20, 0x35dd1: 0x6c789020, 0x35dd2: 0x6c789220, 0x35dd3: 0x6c789420, - 0x35dd4: 0x6c789620, 0x35dd5: 0x6c789820, 0x35dd6: 0x6c789a20, 0x35dd7: 0x6c789c20, - 0x35dd8: 0x6c789e20, 0x35dd9: 0x6c78a020, 0x35dda: 0x6c78a220, 0x35ddb: 0x6c78a420, - 0x35ddc: 0x6c78a620, 0x35ddd: 0x6c78a820, 0x35dde: 0x6c78aa20, 0x35ddf: 0x6c78ac20, - 0x35de0: 0x6c78ae20, 0x35de1: 0x6c78b020, 0x35de2: 0x6c78b220, 0x35de3: 0x6c78b420, - 0x35de4: 0x6c78b620, 0x35de5: 0x6ca14020, 0x35de6: 0x6ca14220, 0x35de7: 0x6ca14420, - 0x35de8: 0x6ca14620, 0x35de9: 0x6ca14820, 0x35dea: 0x6ca14a20, 0x35deb: 0x6ca14c20, - 0x35dec: 0x6ca14e20, 0x35ded: 0x6ca15020, 0x35dee: 0x6ca15220, 0x35def: 0x6ca15420, - 0x35df0: 0x6ca15620, 0x35df1: 0x6ca15820, 0x35df2: 0x6ca15a20, 0x35df3: 0x6ca15c20, - 0x35df4: 0x6ca15e20, 0x35df5: 0x6ca16020, 0x35df6: 0x6ca16220, 0x35df7: 0x6ca16420, - 0x35df8: 0x6ca16620, 0x35df9: 0x6ca16820, 0x35dfa: 0x6ca16a20, 0x35dfb: 0x6ca16c20, - 0x35dfc: 0x6ca16e20, 0x35dfd: 0x6ca17020, 0x35dfe: 0x6ca17220, 0x35dff: 0x6ca17420, - // Block 0xd78, offset 0x35e00 - 0x35e00: 0x6ca17620, 0x35e01: 0x6ca17820, 0x35e02: 0x6ca17a20, 0x35e03: 0x6ca17c20, - 0x35e04: 0x6ca17e20, 0x35e05: 0x6ca18020, 0x35e06: 0x6ca18220, 0x35e07: 0x6ca18420, - 0x35e08: 0x6ca18620, 0x35e09: 0x6ca18820, 0x35e0a: 0x6ca18a20, 0x35e0b: 0x6ca18c20, - 0x35e0c: 0x6ca18e20, 0x35e0d: 0x6ca19020, 0x35e0e: 0x6ca19220, 0x35e0f: 0x6ca19420, - 0x35e10: 0x6ca19620, 0x35e11: 0x6ca19820, 0x35e12: 0x6ca19a20, 0x35e13: 0x6ca19c20, - 0x35e14: 0x6ca19e20, 0x35e15: 0x6ca1a020, 0x35e16: 0x6ca1a220, 0x35e17: 0x6ca1a420, - 0x35e18: 0x6ca1a620, 0x35e19: 0x6ca1a820, 0x35e1a: 0x6ca1aa20, 0x35e1b: 0x6ca1ac20, - 0x35e1c: 0x6ca1ae20, 0x35e1d: 0x6ca1b020, 0x35e1e: 0x6ca1b220, 0x35e1f: 0x6ca1b420, - 0x35e20: 0x6ca1b620, 0x35e21: 0x6ca1b820, 0x35e22: 0x6cce4820, 0x35e23: 0x6cce4a20, - 0x35e24: 0x6cce4c20, 0x35e25: 0x6cce4e20, 0x35e26: 0x6cce5020, 0x35e27: 0x6cce5220, - 0x35e28: 0x6cce5420, 0x35e29: 0x6cce5620, 0x35e2a: 0x6cce5820, 0x35e2b: 0x6cce5a20, - 0x35e2c: 0x6cce5c20, 0x35e2d: 0x6cce5e20, 0x35e2e: 0x6cce6020, 0x35e2f: 0x6cce6220, - 0x35e30: 0x6cce6420, 0x35e31: 0x6cce6620, 0x35e32: 0x6cce6820, 0x35e33: 0x6cce6a20, - 0x35e34: 0x6cce6c20, 0x35e35: 0x6cce6e20, 0x35e36: 0x6cce7020, 0x35e37: 0x6cce7220, - 0x35e38: 0x6cce7420, 0x35e39: 0x6cce7620, 0x35e3a: 0x6cce7820, 0x35e3b: 0x6cce7a20, - 0x35e3c: 0x6cce7c20, 0x35e3d: 0x6cce7e20, 0x35e3e: 0x6cce8020, 0x35e3f: 0x6cce8220, - // Block 0xd79, offset 0x35e40 - 0x35e40: 0x6cce8420, 0x35e41: 0x6cce8620, 0x35e42: 0x6cce8820, 0x35e43: 0x6cce8a20, - 0x35e44: 0x6cce8c20, 0x35e45: 0x6cce8e20, 0x35e46: 0x6cce9020, 0x35e47: 0x6cce9220, - 0x35e48: 0x6cce9420, 0x35e49: 0x6cce9620, 0x35e4a: 0x6cce9820, 0x35e4b: 0x6cce9a20, - 0x35e4c: 0x6cce9c20, 0x35e4d: 0x6cce9e20, 0x35e4e: 0x6ccea020, 0x35e4f: 0x6ccea220, - 0x35e50: 0x6ccea420, 0x35e51: 0x6ccea620, 0x35e52: 0x6ccea820, 0x35e53: 0x6cceaa20, - 0x35e54: 0x6cceac20, 0x35e55: 0x6cceae20, 0x35e56: 0x6cceb020, 0x35e57: 0x6cceb220, - 0x35e58: 0x6cceb420, 0x35e59: 0x6cceb620, 0x35e5a: 0x6cceb820, 0x35e5b: 0x6cceba20, - 0x35e5c: 0x6ccebc20, 0x35e5d: 0x6ccebe20, 0x35e5e: 0x6ccec020, 0x35e5f: 0x6ccec220, - 0x35e60: 0x6ccec420, 0x35e61: 0x6ccec620, 0x35e62: 0x6ccec820, 0x35e63: 0x6cceca20, - 0x35e64: 0x6ccecc20, 0x35e65: 0x6ccece20, 0x35e66: 0x6cced020, 0x35e67: 0x6cced220, - 0x35e68: 0x6cced420, 0x35e69: 0x6cced620, 0x35e6a: 0x6cced820, 0x35e6b: 0x6cceda20, - 0x35e6c: 0x6ccedc20, 0x35e6d: 0x6ccede20, 0x35e6e: 0x6ccee020, 0x35e6f: 0x6ccee220, - 0x35e70: 0x6ccee420, 0x35e71: 0x6ccee620, 0x35e72: 0x6cfc6820, 0x35e73: 0x6cfc6a20, - 0x35e74: 0x6cfc6c20, 0x35e75: 0x6cfc6e20, 0x35e76: 0x6cfc7020, 0x35e77: 0x6cfc7220, - 0x35e78: 0x6cfc7420, 0x35e79: 0x6cfc7620, 0x35e7a: 0x6cfc7820, 0x35e7b: 0x6cfc7a20, - 0x35e7c: 0x6cfc7c20, 0x35e7d: 0x6cfc7e20, 0x35e7e: 0x6cfc8020, 0x35e7f: 0x6cfc8220, - // Block 0xd7a, offset 0x35e80 - 0x35e80: 0x6cfc8420, 0x35e81: 0x6cfc8620, 0x35e82: 0x6cfc8820, 0x35e83: 0x6cfc8a20, - 0x35e84: 0x6cfc8c20, 0x35e85: 0x6cfc8e20, 0x35e86: 0x6cfc9020, 0x35e87: 0x6cfc9220, - 0x35e88: 0x6cfc9420, 0x35e89: 0x6cfc9620, 0x35e8a: 0x6cfc9820, 0x35e8b: 0x6cfc9a20, - 0x35e8c: 0x6cfc9c20, 0x35e8d: 0x6cfc9e20, 0x35e8e: 0x6cfca020, 0x35e8f: 0x6cfca220, - 0x35e90: 0x6cfca420, 0x35e91: 0x6cfca620, 0x35e92: 0x6cfca820, 0x35e93: 0x6cfcaa20, - 0x35e94: 0x6cfcac20, 0x35e95: 0x6cfcae20, 0x35e96: 0x6cfcb020, 0x35e97: 0x6cfcb220, - 0x35e98: 0x6cfcb420, 0x35e99: 0x6cfcb620, 0x35e9a: 0x6cfcb820, 0x35e9b: 0x6cfcba20, - 0x35e9c: 0x6cfcbc20, 0x35e9d: 0x6cfcbe20, 0x35e9e: 0x6cfcc020, 0x35e9f: 0x6cfcc220, - 0x35ea0: 0x6cfcc420, 0x35ea1: 0x6cfcc620, 0x35ea2: 0x6cfcc820, 0x35ea3: 0x6cfcca20, - 0x35ea4: 0x6cfccc20, 0x35ea5: 0x6cfcce20, 0x35ea6: 0x6cfcd020, 0x35ea7: 0x6cfcd220, - 0x35ea8: 0x6cfcd420, 0x35ea9: 0x6cfcd620, 0x35eaa: 0x6cfcd820, 0x35eab: 0x6cfcda20, - 0x35eac: 0x6cfcdc20, 0x35ead: 0x6cfcde20, 0x35eae: 0x6cfce020, 0x35eaf: 0x6cfce220, - 0x35eb0: 0x6cfce420, 0x35eb1: 0x6cfce620, 0x35eb2: 0x6cfce820, 0x35eb3: 0x6cb74620, - 0x35eb4: 0x6cfcea20, 0x35eb5: 0x6cfcec20, 0x35eb6: 0x6cfcee20, 0x35eb7: 0x6cfcf020, - 0x35eb8: 0x6cfcf220, 0x35eb9: 0x6cfcf420, 0x35eba: 0x6cfcf620, 0x35ebb: 0x6cfcf820, - 0x35ebc: 0x6cfcfa20, 0x35ebd: 0x6cfcfc20, 0x35ebe: 0x6cfcfe20, 0x35ebf: 0x6cfd0020, - // Block 0xd7b, offset 0x35ec0 - 0x35ec0: 0x6cfd0220, 0x35ec1: 0x6cfd0420, 0x35ec2: 0x6cfd0620, 0x35ec3: 0x6cfd0820, - 0x35ec4: 0x6cfd0a20, 0x35ec5: 0x6cfd0c20, 0x35ec6: 0x6cfd0e20, 0x35ec7: 0x6d2b2c20, - 0x35ec8: 0x6d2b2e20, 0x35ec9: 0x6d2b3020, 0x35eca: 0x6d2b3220, 0x35ecb: 0x6d2b3420, - 0x35ecc: 0x6d2b3620, 0x35ecd: 0x6d2b3820, 0x35ece: 0x6d2b3a20, 0x35ecf: 0x6d2b3c20, - 0x35ed0: 0x6d2b3e20, 0x35ed1: 0x6d2b4020, 0x35ed2: 0x6d2b4220, 0x35ed3: 0x6d2b4420, - 0x35ed4: 0x6d2b4620, 0x35ed5: 0x6d2b4820, 0x35ed6: 0x6d2b4a20, 0x35ed7: 0x6d2b4c20, - 0x35ed8: 0x6d2b4e20, 0x35ed9: 0x6d2b5020, 0x35eda: 0x6d2b5220, 0x35edb: 0x6d2b5420, - 0x35edc: 0x6d2b5620, 0x35edd: 0x6d2b5820, 0x35ede: 0x6d2b5a20, 0x35edf: 0x6d2b5c20, - 0x35ee0: 0x6d2b5e20, 0x35ee1: 0x6d2b6020, 0x35ee2: 0x6d2b6220, 0x35ee3: 0x6d2b6420, - 0x35ee4: 0x6d2b6620, 0x35ee5: 0x6d2b6820, 0x35ee6: 0x6d2b6a20, 0x35ee7: 0x6d2b6c20, - 0x35ee8: 0x6d2b6e20, 0x35ee9: 0x6d2b7020, 0x35eea: 0x6d2b7220, 0x35eeb: 0x6d2b7420, - 0x35eec: 0x6d2b7620, 0x35eed: 0x6d2b7820, 0x35eee: 0x6d2b7a20, 0x35eef: 0x6d2b7c20, - 0x35ef0: 0x6d2b7e20, 0x35ef1: 0x6d2b8020, 0x35ef2: 0x6d585a20, 0x35ef3: 0x6d2b8220, - 0x35ef4: 0x6d2b8420, 0x35ef5: 0x6d2b8620, 0x35ef6: 0x6d2b8820, 0x35ef7: 0x6d2b8a20, - 0x35ef8: 0x6d2b8c20, 0x35ef9: 0x6d2b8e20, 0x35efa: 0x6d2b9020, 0x35efb: 0x6d2b9220, - 0x35efc: 0x6d2b9420, 0x35efd: 0x6d2b9620, 0x35efe: 0x6d2b9820, 0x35eff: 0x6d2b9a20, - // Block 0xd7c, offset 0x35f00 - 0x35f00: 0x6d2b9c20, 0x35f01: 0x6d2b9e20, 0x35f02: 0x6d2ba020, 0x35f03: 0x6d2ba220, - 0x35f04: 0x6d2ba420, 0x35f05: 0x6d2ba620, 0x35f06: 0x6d2ba820, 0x35f07: 0x6d2baa20, - 0x35f08: 0x6d2bac20, 0x35f09: 0x6d2bae20, 0x35f0a: 0x6d2bb020, 0x35f0b: 0x6d2bb220, - 0x35f0c: 0x6d2bb420, 0x35f0d: 0x6d2bb620, 0x35f0e: 0x6d2bb820, 0x35f0f: 0x6cfd1020, - 0x35f10: 0x6d585c20, 0x35f11: 0x6d585e20, 0x35f12: 0x6d586020, 0x35f13: 0x6d586220, - 0x35f14: 0x6d586420, 0x35f15: 0x6d586620, 0x35f16: 0x6d586820, 0x35f17: 0x6d586a20, - 0x35f18: 0x6d586c20, 0x35f19: 0x6d586e20, 0x35f1a: 0x6d587020, 0x35f1b: 0x6d587220, - 0x35f1c: 0x6d587420, 0x35f1d: 0x6d587620, 0x35f1e: 0x6d587820, 0x35f1f: 0x6d587a20, - 0x35f20: 0x6d587c20, 0x35f21: 0x6d587e20, 0x35f22: 0x6d588020, 0x35f23: 0x6d588220, - 0x35f24: 0x6d588420, 0x35f25: 0x6d588620, 0x35f26: 0x6d588820, 0x35f27: 0x6d588a20, - 0x35f28: 0x6d588c20, 0x35f29: 0x6d836620, 0x35f2a: 0x6d588e20, 0x35f2b: 0x6d589020, - 0x35f2c: 0x6d589220, 0x35f2d: 0x6d589420, 0x35f2e: 0x6d589620, 0x35f2f: 0x6d589820, - 0x35f30: 0x6d589a20, 0x35f31: 0x6d589c20, 0x35f32: 0x6d589e20, 0x35f33: 0x6d58a020, - 0x35f34: 0x6d58a220, 0x35f35: 0x6d58a420, 0x35f36: 0x6d58a620, 0x35f37: 0x6d58a820, - 0x35f38: 0x6d58aa20, 0x35f39: 0x6d58ac20, 0x35f3a: 0x6d58ae20, 0x35f3b: 0x6d58b020, - 0x35f3c: 0x6d58b220, 0x35f3d: 0x6d58b420, 0x35f3e: 0x6d58b620, 0x35f3f: 0x6d58b820, - // Block 0xd7d, offset 0x35f40 - 0x35f40: 0x6d385220, 0x35f41: 0x6d58ba20, 0x35f42: 0x6d705e20, 0x35f43: 0x6d58bc20, - 0x35f44: 0x6d58be20, 0x35f45: 0x6d58c020, 0x35f46: 0x6d58c220, 0x35f47: 0x6d58c420, - 0x35f48: 0x6d58c620, 0x35f49: 0x6d58c820, 0x35f4a: 0x6d58ca20, 0x35f4b: 0x6d58cc20, - 0x35f4c: 0x6d58ce20, 0x35f4d: 0x6d58d020, 0x35f4e: 0x6d58d220, 0x35f4f: 0x6d58d420, - 0x35f50: 0x6d58d620, 0x35f51: 0x6d58d820, 0x35f52: 0x6d58da20, 0x35f53: 0x6d58dc20, - 0x35f54: 0x6d58de20, 0x35f55: 0x6d58e020, 0x35f56: 0x6d58e220, 0x35f57: 0x6d58e420, - 0x35f58: 0x6d58e620, 0x35f59: 0x6d58e820, 0x35f5a: 0x6d58ea20, 0x35f5b: 0x6d58ec20, - 0x35f5c: 0x6d58ee20, 0x35f5d: 0x6d836820, 0x35f5e: 0x6d836a20, 0x35f5f: 0x6d836c20, - 0x35f60: 0x6d836e20, 0x35f61: 0x6d837020, 0x35f62: 0x6d837220, 0x35f63: 0x6d837420, - 0x35f64: 0x6d837620, 0x35f65: 0x6d837820, 0x35f66: 0x6d837a20, 0x35f67: 0x6d837c20, - 0x35f68: 0x6d837e20, 0x35f69: 0x6d838020, 0x35f6a: 0x6d838220, 0x35f6b: 0x6d838420, - 0x35f6c: 0x6d838620, 0x35f6d: 0x6d838820, 0x35f6e: 0x6d838a20, 0x35f6f: 0x6d838c20, - 0x35f70: 0x6d838e20, 0x35f71: 0x6d839020, 0x35f72: 0x6d839220, 0x35f73: 0x6d839420, - 0x35f74: 0x6d839620, 0x35f75: 0x6d839820, 0x35f76: 0x6d839a20, 0x35f77: 0x6d839c20, - 0x35f78: 0x6d839e20, 0x35f79: 0x6d83a020, 0x35f7a: 0x6d83a220, 0x35f7b: 0x6d83a420, - 0x35f7c: 0x6d83a620, 0x35f7d: 0x6d83a820, 0x35f7e: 0x6d83aa20, 0x35f7f: 0x6d83ac20, - // Block 0xd7e, offset 0x35f80 - 0x35f80: 0x6d83ae20, 0x35f81: 0x6d83b020, 0x35f82: 0x6d83b220, 0x35f83: 0x6d83b420, - 0x35f84: 0x6d83b620, 0x35f85: 0x6d83b820, 0x35f86: 0x6d83ba20, 0x35f87: 0x6d83bc20, - 0x35f88: 0x6d83be20, 0x35f89: 0x6d83c020, 0x35f8a: 0x6d83c220, 0x35f8b: 0x6d83c420, - 0x35f8c: 0x6d83c620, 0x35f8d: 0x6d83c820, 0x35f8e: 0x6d83ca20, 0x35f8f: 0x6d83cc20, - 0x35f90: 0x6d83ce20, 0x35f91: 0x6d83d020, 0x35f92: 0x6d83d220, 0x35f93: 0x6d83d420, - 0x35f94: 0x6d83d620, 0x35f95: 0x6d83d820, 0x35f96: 0x6d83da20, 0x35f97: 0x6d83dc20, - 0x35f98: 0x6d83de20, 0x35f99: 0x6d83e020, 0x35f9a: 0x6d83e220, 0x35f9b: 0x6d83e420, - 0x35f9c: 0x6d83e620, 0x35f9d: 0x6d83e820, 0x35f9e: 0x6d83ea20, 0x35f9f: 0x6d83ec20, - 0x35fa0: 0x6d793420, 0x35fa1: 0x6d83ee20, 0x35fa2: 0x6d83f020, 0x35fa3: 0x6d83f220, - 0x35fa4: 0x6d83f420, 0x35fa5: 0x6d83f620, 0x35fa6: 0x6d83f820, 0x35fa7: 0x6d83fa20, - 0x35fa8: 0x6d83fc20, 0x35fa9: 0x6d83fe20, 0x35faa: 0x6d840020, 0x35fab: 0x6d840220, - 0x35fac: 0x6d840420, 0x35fad: 0x6d840620, 0x35fae: 0x6d840820, 0x35faf: 0x6d840a20, - 0x35fb0: 0x6d840c20, 0x35fb1: 0x6d840e20, 0x35fb2: 0x6d841020, 0x35fb3: 0x6d841220, - 0x35fb4: 0x6d841420, 0x35fb5: 0x6da8ae20, 0x35fb6: 0x6da8b020, 0x35fb7: 0x6da8b220, - 0x35fb8: 0x6da8b420, 0x35fb9: 0x6da8b620, 0x35fba: 0x6da8b820, 0x35fbb: 0x6da8ba20, - 0x35fbc: 0x6da8bc20, 0x35fbd: 0x6da8be20, 0x35fbe: 0x6da8c020, 0x35fbf: 0x6da8c220, - // Block 0xd7f, offset 0x35fc0 - 0x35fc0: 0x6da8c420, 0x35fc1: 0x6da8c620, 0x35fc2: 0x6da8c820, 0x35fc3: 0x6da8ca20, - 0x35fc4: 0x6da8cc20, 0x35fc5: 0x6da8ce20, 0x35fc6: 0x6da8d020, 0x35fc7: 0x6da8d220, - 0x35fc8: 0x6da8d420, 0x35fc9: 0x6da8d620, 0x35fca: 0x6da8d820, 0x35fcb: 0x6da8da20, - 0x35fcc: 0x6da8dc20, 0x35fcd: 0x6da8de20, 0x35fce: 0x6da8e020, 0x35fcf: 0x6da8e220, - 0x35fd0: 0x6da8e420, 0x35fd1: 0x6da8e620, 0x35fd2: 0x6da8e820, 0x35fd3: 0x6da8ea20, - 0x35fd4: 0x6da8ec20, 0x35fd5: 0x6da8ee20, 0x35fd6: 0x6da8f020, 0x35fd7: 0x6da8f220, - 0x35fd8: 0x6da8f420, 0x35fd9: 0x6da8f620, 0x35fda: 0x6da8f820, 0x35fdb: 0x6da8fa20, - 0x35fdc: 0x6da8fc20, 0x35fdd: 0x6da8fe20, 0x35fde: 0x6da90020, 0x35fdf: 0x6da90220, - 0x35fe0: 0x6da90420, 0x35fe1: 0x6da90620, 0x35fe2: 0x6da90820, 0x35fe3: 0x6da90a20, - 0x35fe4: 0x6dc9d420, 0x35fe5: 0x6dc9d620, 0x35fe6: 0x6dc9d820, 0x35fe7: 0x6dc9da20, - 0x35fe8: 0x6dc9dc20, 0x35fe9: 0x6dc9de20, 0x35fea: 0x6dc9e020, 0x35feb: 0x6dc9e220, - 0x35fec: 0x6dc9e420, 0x35fed: 0x6dc9e620, 0x35fee: 0x6dc9e820, 0x35fef: 0x6dc9ea20, - 0x35ff0: 0x6dc9ec20, 0x35ff1: 0x6dc9ee20, 0x35ff2: 0x6dc9f020, 0x35ff3: 0x6dc9f220, - 0x35ff4: 0x6dc9f420, 0x35ff5: 0x6dc9f620, 0x35ff6: 0x6dc9f820, 0x35ff7: 0x6dc9fa20, - 0x35ff8: 0x6dc9fc20, 0x35ff9: 0x6dc9fe20, 0x35ffa: 0x6dca0020, 0x35ffb: 0x6dca0220, - 0x35ffc: 0x6dca0420, 0x35ffd: 0x6dca0620, 0x35ffe: 0x6dca0820, 0x35fff: 0x6dca0a20, - // Block 0xd80, offset 0x36000 - 0x36000: 0x6dca0c20, 0x36001: 0x6dca0e20, 0x36002: 0x6dca1020, 0x36003: 0x6dd07420, - 0x36004: 0x6dca1220, 0x36005: 0x6dca1420, 0x36006: 0x6dca1620, 0x36007: 0x6dca1820, - 0x36008: 0x6dca1a20, 0x36009: 0x6dca1c20, 0x3600a: 0x6dca1e20, 0x3600b: 0x6dca2020, - 0x3600c: 0x6dca2220, 0x3600d: 0x6dca2420, 0x3600e: 0x6dca2620, 0x3600f: 0x6dca2820, - 0x36010: 0x6dca2a20, 0x36011: 0x6dca2c20, 0x36012: 0x6de58e20, 0x36013: 0x6de59020, - 0x36014: 0x6de59220, 0x36015: 0x6de59420, 0x36016: 0x6de59620, 0x36017: 0x6de59820, - 0x36018: 0x6de59a20, 0x36019: 0x6de59c20, 0x3601a: 0x6de59e20, 0x3601b: 0x6de5a020, - 0x3601c: 0x6de5a220, 0x3601d: 0x6de5a420, 0x3601e: 0x6de5a620, 0x3601f: 0x6de5a820, - 0x36020: 0x6de5aa20, 0x36021: 0x6de5ac20, 0x36022: 0x6de5ae20, 0x36023: 0x6de5b020, - 0x36024: 0x6de5b220, 0x36025: 0x6de5b420, 0x36026: 0x6de5b620, 0x36027: 0x6de5b820, - 0x36028: 0x6de5ba20, 0x36029: 0x6de5bc20, 0x3602a: 0x6de5be20, 0x3602b: 0x6de5c020, - 0x3602c: 0x6de5c220, 0x3602d: 0x6de5c420, 0x3602e: 0x6de5c620, 0x3602f: 0x6de5c820, - 0x36030: 0x6de5ca20, 0x36031: 0x6de5cc20, 0x36032: 0x6de5ce20, 0x36033: 0x6dfc6620, - 0x36034: 0x6dfc6820, 0x36035: 0x6dfc6a20, 0x36036: 0x6dfc6c20, 0x36037: 0x6dfc6e20, - 0x36038: 0x6dfc7020, 0x36039: 0x6dfc7220, 0x3603a: 0x6dfc7420, 0x3603b: 0x6dfc7620, - 0x3603c: 0x6dfc7820, 0x3603d: 0x6dfc7a20, 0x3603e: 0x6dfc7c20, 0x3603f: 0x6dfc7e20, - // Block 0xd81, offset 0x36040 - 0x36040: 0x6dfc8020, 0x36041: 0x6dfc8220, 0x36042: 0x6dfc8420, 0x36043: 0x6dfc8620, - 0x36044: 0x6dfc8820, 0x36045: 0x6dfc8a20, 0x36046: 0x6dfc8c20, 0x36047: 0x6dfc8e20, - 0x36048: 0x6dfc9020, 0x36049: 0x6dfc9220, 0x3604a: 0x6dfc9420, 0x3604b: 0x6dfc9620, - 0x3604c: 0x6dfc9820, 0x3604d: 0x6dfc9a20, 0x3604e: 0x6dfc9c20, 0x3604f: 0x6dfc9e20, - 0x36050: 0x6dfca020, 0x36051: 0x6dfca220, 0x36052: 0x6dfca420, 0x36053: 0x6dfca620, - 0x36054: 0x6dfca820, 0x36055: 0x6dfcaa20, 0x36056: 0x6dfcac20, 0x36057: 0x6dfcae20, - 0x36058: 0x6dfcb020, 0x36059: 0x6dfcb220, 0x3605a: 0x6dfcb420, 0x3605b: 0x6dfcb620, - 0x3605c: 0x6dfcb820, 0x3605d: 0x6dfcba20, 0x3605e: 0x6dfcbc20, 0x3605f: 0x6dfcbe20, - 0x36060: 0x6dfcc020, 0x36061: 0x6e0f8420, 0x36062: 0x6e0f8620, 0x36063: 0x6e0f8820, - 0x36064: 0x6e0f8a20, 0x36065: 0x6e0f8c20, 0x36066: 0x6e0f8e20, 0x36067: 0x6e0f9020, - 0x36068: 0x6dfcc220, 0x36069: 0x6e1e7820, 0x3606a: 0x6e0f9220, 0x3606b: 0x6e0f9420, - 0x3606c: 0x6e0f9620, 0x3606d: 0x6e0f9820, 0x3606e: 0x6e0f9a20, 0x3606f: 0x6e0f9c20, - 0x36070: 0x6e0f9e20, 0x36071: 0x6e0fa020, 0x36072: 0x6e0fa220, 0x36073: 0x6e0fa420, - 0x36074: 0x6e0fa620, 0x36075: 0x6e0fa820, 0x36076: 0x6e0faa20, 0x36077: 0x6e0fac20, - 0x36078: 0x6e0fae20, 0x36079: 0x6e0fb020, 0x3607a: 0x6e1e7a20, 0x3607b: 0x6e1e7c20, - 0x3607c: 0x6e29de20, 0x3607d: 0x6e1e7e20, 0x3607e: 0x6e1e8020, 0x3607f: 0x6e1e8220, - // Block 0xd82, offset 0x36080 - 0x36080: 0x6e1e8420, 0x36081: 0x6e1e8620, 0x36082: 0x6e1e8820, 0x36083: 0x6e1e8a20, - 0x36084: 0x6e1e8c20, 0x36085: 0x6e1e8e20, 0x36086: 0x6e1e9020, 0x36087: 0x6e1e9220, - 0x36088: 0x6e29e020, 0x36089: 0x6e29e220, 0x3608a: 0x6e29e420, 0x3608b: 0x6e29e620, - 0x3608c: 0x6e29e820, 0x3608d: 0x6e29ea20, 0x3608e: 0x6e29ec20, 0x3608f: 0x6e2b4a20, - 0x36090: 0x6e29ee20, 0x36091: 0x6e29f020, 0x36092: 0x6e29f220, 0x36093: 0x6e29f420, - 0x36094: 0x6e29f620, 0x36095: 0x6e29f820, 0x36096: 0x6e29fa20, 0x36097: 0x6e32c220, - 0x36098: 0x6e32c420, 0x36099: 0x6e32c620, 0x3609a: 0x6e32c820, 0x3609b: 0x6e32ca20, - 0x3609c: 0x6e38f820, 0x3609d: 0x6e38fa20, 0x3609e: 0x6e38fc20, 0x3609f: 0x6e33dc20, - 0x360a0: 0x6e38fe20, 0x360a1: 0x6e390020, 0x360a2: 0x6e390220, 0x360a3: 0x6e390420, - 0x360a4: 0x6e3d6820, 0x360a5: 0x6e3d6a20, 0x360a6: 0x6e406c20, 0x360a7: 0x6e406e20, - 0x360a8: 0x6e407020, 0x360a9: 0x6e407220, 0x360aa: 0x6e42b820, 0x360ab: 0x6e443620, - 0x360ac: 0x6e42ba20, 0x360ad: 0x6e452420, 0x360ae: 0x6e468420, 0x360af: 0x6c04da20, - 0x360b0: 0x6c04dc20, 0x360b1: 0x6c09d020, 0x360b2: 0x6c23d020, 0x360b3: 0x6c23d220, - 0x360b4: 0x6c23d420, 0x360b5: 0x6c23d620, 0x360b6: 0x6c3a2c20, 0x360b7: 0x6c3a2e20, - 0x360b8: 0x6c3a3020, 0x360b9: 0x6c3a3220, 0x360ba: 0x6c3a3420, 0x360bb: 0x6c3a3620, - 0x360bc: 0x6c3a3820, 0x360bd: 0x6c55f420, 0x360be: 0x6c55f620, 0x360bf: 0x6c55f820, - // Block 0xd83, offset 0x360c0 - 0x360c0: 0x6c55fa20, 0x360c1: 0x6c55fc20, 0x360c2: 0x6c55fe20, 0x360c3: 0x6c560020, - 0x360c4: 0x6c560220, 0x360c5: 0x6c560420, 0x360c6: 0x6c560620, 0x360c7: 0x6c560820, - 0x360c8: 0x6c560a20, 0x360c9: 0x6c560c20, 0x360ca: 0x6c560e20, 0x360cb: 0x6c561020, - 0x360cc: 0x6c78cc20, 0x360cd: 0x6c78ce20, 0x360ce: 0x6c78d020, 0x360cf: 0x6c78d220, - 0x360d0: 0x6ca1d020, 0x360d1: 0x6ca1d220, 0x360d2: 0x6ca1d420, 0x360d3: 0x6ca1d620, - 0x360d4: 0x6ccf0c20, 0x360d5: 0x6ccf0e20, 0x360d6: 0x6ccf1020, 0x360d7: 0x6cbc6220, - 0x360d8: 0x6ccf1220, 0x360d9: 0x6ccf1420, 0x360da: 0x6ccf1620, 0x360db: 0x6ccf1820, - 0x360dc: 0x6cfd2e20, 0x360dd: 0x6cfd3020, 0x360de: 0x6cfd3220, 0x360df: 0x6cfd3420, - 0x360e0: 0x6cfd3620, 0x360e1: 0x6cfd3820, 0x360e2: 0x6d2bde20, 0x360e3: 0x6d2be020, - 0x360e4: 0x6d2be220, 0x360e5: 0x6d2be420, 0x360e6: 0x6d2be620, 0x360e7: 0x6d590620, - 0x360e8: 0x6d590820, 0x360e9: 0x6d590a20, 0x360ea: 0x6d590c20, 0x360eb: 0x6d590e20, - 0x360ec: 0x6d591020, 0x360ed: 0x6d591220, 0x360ee: 0x6d842a20, 0x360ef: 0x6d842c20, - 0x360f0: 0x6d842e20, 0x360f1: 0x6d843020, 0x360f2: 0x6da91c20, 0x360f3: 0x6da91e20, - 0x360f4: 0x6da92020, 0x360f5: 0x6da92220, 0x360f6: 0x6da92420, 0x360f7: 0x6da92620, - 0x360f8: 0x6da92820, 0x360f9: 0x6dca3a20, 0x360fa: 0x6de5d420, 0x360fb: 0x6dca3c20, - 0x360fc: 0x6da92a20, 0x360fd: 0x6dca3e20, 0x360fe: 0x6dca4020, 0x360ff: 0x6de5d620, - // Block 0xd84, offset 0x36100 - 0x36100: 0x6de5d820, 0x36101: 0x6de9a820, 0x36102: 0x6dfcca20, 0x36103: 0x6dfccc20, - 0x36104: 0x6dfcce20, 0x36105: 0x6dfcd020, 0x36106: 0x6dfcd220, 0x36107: 0x6e0fb420, - 0x36108: 0x6e29fe20, 0x36109: 0x6e2a0020, 0x3610a: 0x6e2a0220, 0x3610b: 0x6e32ce20, - 0x3610c: 0x6e390a20, 0x3610d: 0x6e390c20, 0x3610e: 0x6c23da20, 0x3610f: 0x6c23dc20, - 0x36110: 0x6c3a3c20, 0x36111: 0x6c3a3e20, 0x36112: 0x6c561620, 0x36113: 0x6c78d820, - 0x36114: 0x6c78da20, 0x36115: 0x6ca1dc20, 0x36116: 0x6ccf2220, 0x36117: 0x6ccf2420, - 0x36118: 0x6cfd4220, 0x36119: 0x6d2be820, 0x3611a: 0x6d2bea20, 0x3611b: 0x6d843220, - 0x3611c: 0x6c09d220, 0x3611d: 0x6c3a4220, 0x3611e: 0x6c561a20, 0x3611f: 0x6c561c20, - 0x36120: 0x6c78de20, 0x36121: 0x6c78e020, 0x36122: 0x6ca1e220, 0x36123: 0x6ccf2620, - 0x36124: 0x6cfd4420, 0x36125: 0x6cfd4620, 0x36126: 0x6d591820, 0x36127: 0x6d591a20, - 0x36128: 0x6d591c20, 0x36129: 0x6d843420, 0x3612a: 0x6c04e620, 0x3612b: 0x6c09d420, - 0x3612c: 0x6c09d620, 0x3612d: 0x6c137c20, 0x3612e: 0x6c23de20, 0x3612f: 0x6c3a4820, - 0x36130: 0x6c3a4a20, 0x36131: 0x6c3a4c20, 0x36132: 0x6c562220, 0x36133: 0x6c562420, - 0x36134: 0x6c562620, 0x36135: 0x6c562820, 0x36136: 0x6c78e420, 0x36137: 0x6c78e620, - 0x36138: 0x6c78e820, 0x36139: 0x6c78ea20, 0x3613a: 0x6c78ec20, 0x3613b: 0x6ca1e420, - 0x3613c: 0x6ca1e620, 0x3613d: 0x6ca1e820, 0x3613e: 0x6ca1ea20, 0x3613f: 0x6ca1ec20, - // Block 0xd85, offset 0x36140 - 0x36140: 0x6ca1ee20, 0x36141: 0x6ca1f020, 0x36142: 0x6ca1f220, 0x36143: 0x6ca1f420, - 0x36144: 0x6ccf2a20, 0x36145: 0x6ccf2c20, 0x36146: 0x6ccf2e20, 0x36147: 0x6ccf3020, - 0x36148: 0x6ccf3220, 0x36149: 0x6ccf3420, 0x3614a: 0x6ccf3620, 0x3614b: 0x6ccf3820, - 0x3614c: 0x6cfd4a20, 0x3614d: 0x6cfd4c20, 0x3614e: 0x6cfd4e20, 0x3614f: 0x6d2bf220, - 0x36150: 0x6d2bf420, 0x36151: 0x6d2bf620, 0x36152: 0x6d2bf820, 0x36153: 0x6d592020, - 0x36154: 0x6d592220, 0x36155: 0x6d592420, 0x36156: 0x6d843620, 0x36157: 0x6d843820, - 0x36158: 0x6d843a20, 0x36159: 0x6d843c20, 0x3615a: 0x6d843e20, 0x3615b: 0x6d844020, - 0x3615c: 0x6da93420, 0x3615d: 0x6da93620, 0x3615e: 0x6da93820, 0x3615f: 0x6da93a20, - 0x36160: 0x6de5de20, 0x36161: 0x6de5e020, 0x36162: 0x6dfcd420, 0x36163: 0x6e1e9820, - 0x36164: 0x6e2a0420, 0x36165: 0x6e407620, 0x36166: 0x6e42bc20, 0x36167: 0x6e42be20, - 0x36168: 0x6c09d820, 0x36169: 0x6c23e020, 0x3616a: 0x6c23e220, 0x3616b: 0x6c23e420, - 0x3616c: 0x6c3a5420, 0x3616d: 0x6c3a5620, 0x3616e: 0x6c3a5820, 0x3616f: 0x6c3a5a20, - 0x36170: 0x6c3a5c20, 0x36171: 0x6c562e20, 0x36172: 0x6c563020, 0x36173: 0x6c563220, - 0x36174: 0x6c563420, 0x36175: 0x6c563620, 0x36176: 0x6c563820, 0x36177: 0x6c563a20, - 0x36178: 0x6c563c20, 0x36179: 0x6c563e20, 0x3617a: 0x6c78f420, 0x3617b: 0x6c78f620, - 0x3617c: 0x6c78f820, 0x3617d: 0x6c78fa20, 0x3617e: 0x6c78fc20, 0x3617f: 0x6c78fe20, - // Block 0xd86, offset 0x36180 - 0x36180: 0x6ca1f820, 0x36181: 0x6ca1fa20, 0x36182: 0x6ca1fc20, 0x36183: 0x6ca1fe20, - 0x36184: 0x6ca20020, 0x36185: 0x6ca20220, 0x36186: 0x6ca20420, 0x36187: 0x6ccf4220, - 0x36188: 0x6ccf4420, 0x36189: 0x6ccf4620, 0x3618a: 0x6ccf4820, 0x3618b: 0x6ccf4a20, - 0x3618c: 0x6ccf4c20, 0x3618d: 0x6ccf4e20, 0x3618e: 0x6ccf5020, 0x3618f: 0x6ccf5220, - 0x36190: 0x6ccf5420, 0x36191: 0x6ccf5620, 0x36192: 0x6ccf5820, 0x36193: 0x6ccf5a20, - 0x36194: 0x6ccf5c20, 0x36195: 0x6ccf5e20, 0x36196: 0x6ccf6020, 0x36197: 0x6ccf6220, - 0x36198: 0x6cfd5a20, 0x36199: 0x6cfd5c20, 0x3619a: 0x6cfd5e20, 0x3619b: 0x6cfd6020, - 0x3619c: 0x6cfd6220, 0x3619d: 0x6cfd6420, 0x3619e: 0x6cfd6620, 0x3619f: 0x6cfd6820, - 0x361a0: 0x6cfd6a20, 0x361a1: 0x6cfd6c20, 0x361a2: 0x6d2c0020, 0x361a3: 0x6d2c0220, - 0x361a4: 0x6d2c0420, 0x361a5: 0x6d2c0620, 0x361a6: 0x6d2c0820, 0x361a7: 0x6d2c0a20, - 0x361a8: 0x6d592e20, 0x361a9: 0x6d593020, 0x361aa: 0x6d593220, 0x361ab: 0x6d593420, - 0x361ac: 0x6d593620, 0x361ad: 0x6d593820, 0x361ae: 0x6d593a20, 0x361af: 0x6d593c20, - 0x361b0: 0x6d593e20, 0x361b1: 0x6d594020, 0x361b2: 0x6d594220, 0x361b3: 0x6d844220, - 0x361b4: 0x6d844420, 0x361b5: 0x6d844620, 0x361b6: 0x6d844820, 0x361b7: 0x6d844a20, - 0x361b8: 0x6d844c20, 0x361b9: 0x6d844e20, 0x361ba: 0x6da93e20, 0x361bb: 0x6da94020, - 0x361bc: 0x6da94220, 0x361bd: 0x6da94420, 0x361be: 0x6da94620, 0x361bf: 0x6dca4620, - // Block 0xd87, offset 0x361c0 - 0x361c0: 0x6dca4820, 0x361c1: 0x6dca4a20, 0x361c2: 0x6dca4c20, 0x361c3: 0x6dfcd620, - 0x361c4: 0x6e0fb820, 0x361c5: 0x6c23e620, 0x361c6: 0x6c3a5e20, 0x361c7: 0x6c564020, - 0x361c8: 0x6c790420, 0x361c9: 0x6c790620, 0x361ca: 0x6ca20a20, 0x361cb: 0x6ca20c20, - 0x361cc: 0x6ccf6820, 0x361cd: 0x6ccf6a20, 0x361ce: 0x6ccf6c20, 0x361cf: 0x6ccf6e20, - 0x361d0: 0x6cfd6e20, 0x361d1: 0x6d2c0c20, 0x361d2: 0x6d594420, 0x361d3: 0x6dca4e20, - 0x361d4: 0x6c09da20, 0x361d5: 0x6c138620, 0x361d6: 0x6c138820, 0x361d7: 0x6c138a20, - 0x361d8: 0x6c23f620, 0x361d9: 0x6c23f820, 0x361da: 0x6c23fa20, 0x361db: 0x6c23fc20, - 0x361dc: 0x6c3a7c20, 0x361dd: 0x6c3a7e20, 0x361de: 0x6c3a8020, 0x361df: 0x6c3a8220, - 0x361e0: 0x6c3a8420, 0x361e1: 0x6c3a8620, 0x361e2: 0x6c3a8820, 0x361e3: 0x6c3a8a20, - 0x361e4: 0x6c3a8c20, 0x361e5: 0x6c3a8e20, 0x361e6: 0x6c3a9020, 0x361e7: 0x6c3a9220, - 0x361e8: 0x6c3a9420, 0x361e9: 0x6c3a9620, 0x361ea: 0x6c3a9820, 0x361eb: 0x6c3a9a20, - 0x361ec: 0x6c3a9c20, 0x361ed: 0x6c3a9e20, 0x361ee: 0x6c3aa020, 0x361ef: 0x6c3aa220, - 0x361f0: 0x6c3aa420, 0x361f1: 0x6c3aa620, 0x361f2: 0x6c3aa820, 0x361f3: 0x6c3aaa20, - 0x361f4: 0x6c3aac20, 0x361f5: 0x6c3aae20, 0x361f6: 0x6c3ab020, 0x361f7: 0x6c3ab220, - 0x361f8: 0x6c565e20, 0x361f9: 0x6c566020, 0x361fa: 0x6c566220, 0x361fb: 0x6c566420, - 0x361fc: 0x6c566620, 0x361fd: 0x6c566820, 0x361fe: 0x6c566a20, 0x361ff: 0x6c566c20, - // Block 0xd88, offset 0x36200 - 0x36200: 0x6c566e20, 0x36201: 0x6c567020, 0x36202: 0x6c567220, 0x36203: 0x6c567420, - 0x36204: 0x6c567620, 0x36205: 0x6c567820, 0x36206: 0x6c567a20, 0x36207: 0x6c567c20, - 0x36208: 0x6c567e20, 0x36209: 0x6c568020, 0x3620a: 0x6c568220, 0x3620b: 0x6c568420, - 0x3620c: 0x6c568620, 0x3620d: 0x6c568820, 0x3620e: 0x6c568a20, 0x3620f: 0x6c568c20, - 0x36210: 0x6c568e20, 0x36211: 0x6c791a20, 0x36212: 0x6c791c20, 0x36213: 0x6c791e20, - 0x36214: 0x6c792020, 0x36215: 0x6c792220, 0x36216: 0x6c792420, 0x36217: 0x6c792620, - 0x36218: 0x6c792820, 0x36219: 0x6c792a20, 0x3621a: 0x6c792c20, 0x3621b: 0x6ca22a20, - 0x3621c: 0x6ca22c20, 0x3621d: 0x6ca22e20, 0x3621e: 0x6ca23020, 0x3621f: 0x6ca23220, - 0x36220: 0x6ca23420, 0x36221: 0x6ca23620, 0x36222: 0x6ca23820, 0x36223: 0x6ca23a20, - 0x36224: 0x6ca23c20, 0x36225: 0x6ca23e20, 0x36226: 0x6ca24020, 0x36227: 0x6ca24220, - 0x36228: 0x6ca24420, 0x36229: 0x6ca24620, 0x3622a: 0x6ca24820, 0x3622b: 0x6ca24a20, - 0x3622c: 0x6ca24c20, 0x3622d: 0x6ca24e20, 0x3622e: 0x6ca25020, 0x3622f: 0x6ccf8e20, - 0x36230: 0x6ccf9020, 0x36231: 0x6ccf9220, 0x36232: 0x6ccf9420, 0x36233: 0x6ccf9620, - 0x36234: 0x6ccf9820, 0x36235: 0x6ccf9a20, 0x36236: 0x6ccf9c20, 0x36237: 0x6ccf9e20, - 0x36238: 0x6ccfa020, 0x36239: 0x6ccfa220, 0x3623a: 0x6ccfa420, 0x3623b: 0x6ccfa620, - 0x3623c: 0x6ccfa820, 0x3623d: 0x6ccfaa20, 0x3623e: 0x6ccfac20, 0x3623f: 0x6ccfae20, - // Block 0xd89, offset 0x36240 - 0x36240: 0x6ccfb020, 0x36241: 0x6ccfb220, 0x36242: 0x6ccfb420, 0x36243: 0x6ccfb620, - 0x36244: 0x6ccfb820, 0x36245: 0x6ccfba20, 0x36246: 0x6ccfbc20, 0x36247: 0x6ccfbe20, - 0x36248: 0x6ccfc020, 0x36249: 0x6ccfc220, 0x3624a: 0x6ccfc420, 0x3624b: 0x6ccfc620, - 0x3624c: 0x6ccfc820, 0x3624d: 0x6cfd8420, 0x3624e: 0x6cfd8620, 0x3624f: 0x6cfd8820, - 0x36250: 0x6cfd8a20, 0x36251: 0x6cfd8c20, 0x36252: 0x6cfd8e20, 0x36253: 0x6cfd9020, - 0x36254: 0x6cfd9220, 0x36255: 0x6cfd9420, 0x36256: 0x6cfd9620, 0x36257: 0x6cfd9820, - 0x36258: 0x6cfd9a20, 0x36259: 0x6cfd9c20, 0x3625a: 0x6cfd9e20, 0x3625b: 0x6cfda020, - 0x3625c: 0x6cf91a20, 0x3625d: 0x6cfda220, 0x3625e: 0x6cfda420, 0x3625f: 0x6cfda620, - 0x36260: 0x6cfda820, 0x36261: 0x6cfdaa20, 0x36262: 0x6cfdac20, 0x36263: 0x6cfdae20, - 0x36264: 0x6cfdb020, 0x36265: 0x6cfdb220, 0x36266: 0x6cfdb420, 0x36267: 0x6cfdb620, - 0x36268: 0x6cfdb820, 0x36269: 0x6d2c2220, 0x3626a: 0x6d2c2420, 0x3626b: 0x6d2c2620, - 0x3626c: 0x6d2c2820, 0x3626d: 0x6d2c2a20, 0x3626e: 0x6d2c2c20, 0x3626f: 0x6d2c2e20, - 0x36270: 0x6d2c3020, 0x36271: 0x6d2c3220, 0x36272: 0x6d2c3420, 0x36273: 0x6d2c3620, - 0x36274: 0x6d2c3820, 0x36275: 0x6d2c3a20, 0x36276: 0x6d2c3c20, 0x36277: 0x6d2c3e20, - 0x36278: 0x6d2c4020, 0x36279: 0x6d2c4220, 0x3627a: 0x6d2c4420, 0x3627b: 0x6d2c4620, - 0x3627c: 0x6d2c4820, 0x3627d: 0x6d2c4a20, 0x3627e: 0x6d2c4c20, 0x3627f: 0x6cfdba20, - // Block 0xd8a, offset 0x36280 - 0x36280: 0x6d2c4e20, 0x36281: 0x6d2c5020, 0x36282: 0x6d2c5220, 0x36283: 0x6d2c5420, - 0x36284: 0x6d2c5620, 0x36285: 0x6d2c5820, 0x36286: 0x6d2c5a20, 0x36287: 0x6d2c5c20, - 0x36288: 0x6d2c5e20, 0x36289: 0x6d2c6020, 0x3628a: 0x6d595820, 0x3628b: 0x6d595a20, - 0x3628c: 0x6d595c20, 0x3628d: 0x6d595e20, 0x3628e: 0x6d596020, 0x3628f: 0x6d596220, - 0x36290: 0x6d596420, 0x36291: 0x6d596620, 0x36292: 0x6d596820, 0x36293: 0x6d596a20, - 0x36294: 0x6d596c20, 0x36295: 0x6d596e20, 0x36296: 0x6d597020, 0x36297: 0x6d55d820, - 0x36298: 0x6d597220, 0x36299: 0x6d597420, 0x3629a: 0x6d597620, 0x3629b: 0x6d597820, - 0x3629c: 0x6d597a20, 0x3629d: 0x6d597c20, 0x3629e: 0x6d597e20, 0x3629f: 0x6d598020, - 0x362a0: 0x6d598220, 0x362a1: 0x6d846020, 0x362a2: 0x6d846220, 0x362a3: 0x6d846420, - 0x362a4: 0x6d846620, 0x362a5: 0x6d846820, 0x362a6: 0x6d846a20, 0x362a7: 0x6d846c20, - 0x362a8: 0x6d846e20, 0x362a9: 0x6d847020, 0x362aa: 0x6d847220, 0x362ab: 0x6d847420, - 0x362ac: 0x6d847620, 0x362ad: 0x6d847820, 0x362ae: 0x6d847a20, 0x362af: 0x6da95020, - 0x362b0: 0x6da95220, 0x362b1: 0x6da95420, 0x362b2: 0x6da95620, 0x362b3: 0x6da95820, - 0x362b4: 0x6da95a20, 0x362b5: 0x6da95c20, 0x362b6: 0x6da95e20, 0x362b7: 0x6da96020, - 0x362b8: 0x6da96220, 0x362b9: 0x6dca5420, 0x362ba: 0x6dca5620, 0x362bb: 0x6de5f220, - 0x362bc: 0x6de5f420, 0x362bd: 0x6de5f620, 0x362be: 0x6de5f820, 0x362bf: 0x6de5fa20, - // Block 0xd8b, offset 0x362c0 - 0x362c0: 0x6de5fc20, 0x362c1: 0x6de5fe20, 0x362c2: 0x6dfcdc20, 0x362c3: 0x6dfcde20, - 0x362c4: 0x6dfce020, 0x362c5: 0x6dfce220, 0x362c6: 0x6dfce420, 0x362c7: 0x6e0fbc20, - 0x362c8: 0x6e0fbe20, 0x362c9: 0x6e0fc020, 0x362ca: 0x6e0fc220, 0x362cb: 0x6e0fc420, - 0x362cc: 0x6e1e9e20, 0x362cd: 0x6e1ea020, 0x362ce: 0x6e1ea220, 0x362cf: 0x6e1ea420, - 0x362d0: 0x6e1ea620, 0x362d1: 0x6e2a0620, 0x362d2: 0x6e2a0820, 0x362d3: 0x6e2a0a20, - 0x362d4: 0x6e32d020, 0x362d5: 0x6e32d220, 0x362d6: 0x6e391020, 0x362d7: 0x6e391220, - 0x362d8: 0x6e391420, 0x362d9: 0x6e42c020, 0x362da: 0x6c04f820, 0x362db: 0x6c09e220, - 0x362dc: 0x6c09e420, 0x362dd: 0x6c09e620, 0x362de: 0x6c09e820, 0x362df: 0x6c09ea20, - 0x362e0: 0x6c09ec20, 0x362e1: 0x6c139a20, 0x362e2: 0x6c139c20, 0x362e3: 0x6c139e20, - 0x362e4: 0x6c13a020, 0x362e5: 0x6c13a220, 0x362e6: 0x6c13a420, 0x362e7: 0x6c13a620, - 0x362e8: 0x6c13a820, 0x362e9: 0x6c13aa20, 0x362ea: 0x6c13ac20, 0x362eb: 0x6c13ae20, - 0x362ec: 0x6c13b020, 0x362ed: 0x6c13b220, 0x362ee: 0x6c13b420, 0x362ef: 0x6c242820, - 0x362f0: 0x6c242a20, 0x362f1: 0x6c242c20, 0x362f2: 0x6c242e20, 0x362f3: 0x6c243020, - 0x362f4: 0x6c243220, 0x362f5: 0x6c243420, 0x362f6: 0x6c243620, 0x362f7: 0x6c243820, - 0x362f8: 0x6c243a20, 0x362f9: 0x6c243c20, 0x362fa: 0x6c243e20, 0x362fb: 0x6c244020, - 0x362fc: 0x6c244220, 0x362fd: 0x6c244420, 0x362fe: 0x6c244620, 0x362ff: 0x6c244820, - // Block 0xd8c, offset 0x36300 - 0x36300: 0x6c244a20, 0x36301: 0x6c244c20, 0x36302: 0x6c244e20, 0x36303: 0x6c245020, - 0x36304: 0x6c245220, 0x36305: 0x6c245420, 0x36306: 0x6c245620, 0x36307: 0x6c245820, - 0x36308: 0x6c245a20, 0x36309: 0x6c245c20, 0x3630a: 0x6c245e20, 0x3630b: 0x6c246020, - 0x3630c: 0x6c246220, 0x3630d: 0x6c246420, 0x3630e: 0x6c246620, 0x3630f: 0x6c3af620, - 0x36310: 0x6c3af820, 0x36311: 0x6c3afa20, 0x36312: 0x6c3afc20, 0x36313: 0x6c3afe20, - 0x36314: 0x6c3b0020, 0x36315: 0x6c3b0220, 0x36316: 0x6c3b0420, 0x36317: 0x6c3b0620, - 0x36318: 0x6c3b0820, 0x36319: 0x6c3b0a20, 0x3631a: 0x6c3b0c20, 0x3631b: 0x6c3b0e20, - 0x3631c: 0x6c3b1020, 0x3631d: 0x6c3b1220, 0x3631e: 0x6c3b1420, 0x3631f: 0x6c3b1620, - 0x36320: 0x6c3b1820, 0x36321: 0x6c3b1a20, 0x36322: 0x6c3b1c20, 0x36323: 0x6c3b1e20, - 0x36324: 0x6c3b2020, 0x36325: 0x6c3b2220, 0x36326: 0x6c3b2420, 0x36327: 0x6c3b2620, - 0x36328: 0x6c3b2820, 0x36329: 0x6c3b2a20, 0x3632a: 0x6c3b2c20, 0x3632b: 0x6c3b2e20, - 0x3632c: 0x6c3b3020, 0x3632d: 0x6c3b3220, 0x3632e: 0x6c246820, 0x3632f: 0x6c56cc20, - 0x36330: 0x6c56ce20, 0x36331: 0x6c56d020, 0x36332: 0x6c56d220, 0x36333: 0x6c56d420, - 0x36334: 0x6c56d620, 0x36335: 0x6c56d820, 0x36336: 0x6c56da20, 0x36337: 0x6c56dc20, - 0x36338: 0x6c56de20, 0x36339: 0x6c56e020, 0x3633a: 0x6c56e220, 0x3633b: 0x6c56e420, - 0x3633c: 0x6c56e620, 0x3633d: 0x6c56e820, 0x3633e: 0x6c56ea20, 0x3633f: 0x6c56ec20, - // Block 0xd8d, offset 0x36340 - 0x36340: 0x6c56ee20, 0x36341: 0x6c56f020, 0x36342: 0x6c56f220, 0x36343: 0x6c56f420, - 0x36344: 0x6c56f620, 0x36345: 0x6c56f820, 0x36346: 0x6c56fa20, 0x36347: 0x6c56fc20, - 0x36348: 0x6c56fe20, 0x36349: 0x6c570020, 0x3634a: 0x6c570220, 0x3634b: 0x6c570420, - 0x3634c: 0x6c570620, 0x3634d: 0x6c570820, 0x3634e: 0x6c570a20, 0x3634f: 0x6c570c20, - 0x36350: 0x6c570e20, 0x36351: 0x6c571020, 0x36352: 0x6c571220, 0x36353: 0x6c571420, - 0x36354: 0x6c571620, 0x36355: 0x6c571820, 0x36356: 0x6c571a20, 0x36357: 0x6c571c20, - 0x36358: 0x6c571e20, 0x36359: 0x6c796420, 0x3635a: 0x6c796620, 0x3635b: 0x6c796820, - 0x3635c: 0x6c796a20, 0x3635d: 0x6c796c20, 0x3635e: 0x6c796e20, 0x3635f: 0x6c797020, - 0x36360: 0x6c797220, 0x36361: 0x6c797420, 0x36362: 0x6c797620, 0x36363: 0x6c572020, - 0x36364: 0x6c797820, 0x36365: 0x6c797a20, 0x36366: 0x6c797c20, 0x36367: 0x6c797e20, - 0x36368: 0x6c798020, 0x36369: 0x6c798220, 0x3636a: 0x6c798420, 0x3636b: 0x6c798620, - 0x3636c: 0x6c798820, 0x3636d: 0x6c798a20, 0x3636e: 0x6c798c20, 0x3636f: 0x6c798e20, - 0x36370: 0x6c799020, 0x36371: 0x6c799220, 0x36372: 0x6c799420, 0x36373: 0x6c799620, - 0x36374: 0x6c799820, 0x36375: 0x6c799a20, 0x36376: 0x6c799c20, 0x36377: 0x6c799e20, - 0x36378: 0x6c79a020, 0x36379: 0x6c79a220, 0x3637a: 0x6c79a420, 0x3637b: 0x6c79a620, - 0x3637c: 0x6c79a820, 0x3637d: 0x6c79aa20, 0x3637e: 0x6c79ac20, 0x3637f: 0x6c79ae20, - // Block 0xd8e, offset 0x36380 - 0x36380: 0x6c79b020, 0x36381: 0x6c79b220, 0x36382: 0x6c79b420, 0x36383: 0x6ca29a20, - 0x36384: 0x6ca29c20, 0x36385: 0x6ca29e20, 0x36386: 0x6ca2a020, 0x36387: 0x6ca2a220, - 0x36388: 0x6ca2a420, 0x36389: 0x6ca2a620, 0x3638a: 0x6ca2a820, 0x3638b: 0x6ca2aa20, - 0x3638c: 0x6ca2ac20, 0x3638d: 0x6ca2ae20, 0x3638e: 0x6ca2b020, 0x3638f: 0x6ca2b220, - 0x36390: 0x6ca2b420, 0x36391: 0x6ca2b620, 0x36392: 0x6ca2b820, 0x36393: 0x6ca2ba20, - 0x36394: 0x6ca2bc20, 0x36395: 0x6ca2be20, 0x36396: 0x6ca2c020, 0x36397: 0x6ca2c220, - 0x36398: 0x6ca2c420, 0x36399: 0x6ca2c620, 0x3639a: 0x6ca2c820, 0x3639b: 0x6ca2ca20, - 0x3639c: 0x6cd00c20, 0x3639d: 0x6cd00e20, 0x3639e: 0x6cd01020, 0x3639f: 0x6cd01220, - 0x363a0: 0x6cd01420, 0x363a1: 0x6cd01620, 0x363a2: 0x6cd01820, 0x363a3: 0x6cd01a20, - 0x363a4: 0x6cd01c20, 0x363a5: 0x6cd01e20, 0x363a6: 0x6cd02020, 0x363a7: 0x6cd02220, - 0x363a8: 0x6cd02420, 0x363a9: 0x6cd02620, 0x363aa: 0x6cd02820, 0x363ab: 0x6cd02a20, - 0x363ac: 0x6cd02c20, 0x363ad: 0x6cd02e20, 0x363ae: 0x6cd03020, 0x363af: 0x6cd03220, - 0x363b0: 0x6cd03420, 0x363b1: 0x6cd03620, 0x363b2: 0x6cd03820, 0x363b3: 0x6cd03a20, - 0x363b4: 0x6cd03c20, 0x363b5: 0x6cf3a620, 0x363b6: 0x6cd03e20, 0x363b7: 0x6cd04020, - 0x363b8: 0x6cd04220, 0x363b9: 0x6cd04420, 0x363ba: 0x6cd04620, 0x363bb: 0x6cd04820, - 0x363bc: 0x6cd04a20, 0x363bd: 0x6cd04c20, 0x363be: 0x6cd04e20, 0x363bf: 0x6cd05020, - // Block 0xd8f, offset 0x363c0 - 0x363c0: 0x6cd05220, 0x363c1: 0x6cd05420, 0x363c2: 0x6cd05620, 0x363c3: 0x6cd05820, - 0x363c4: 0x6cd05a20, 0x363c5: 0x6cd05c20, 0x363c6: 0x6cd05e20, 0x363c7: 0x6cd06020, - 0x363c8: 0x6cd06220, 0x363c9: 0x6cd06420, 0x363ca: 0x6cd06620, 0x363cb: 0x6cd06820, - 0x363cc: 0x6cd06a20, 0x363cd: 0x6cfdee20, 0x363ce: 0x6cfdf020, 0x363cf: 0x6cfdf220, - 0x363d0: 0x6cfdf420, 0x363d1: 0x6cfdf620, 0x363d2: 0x6cfdf820, 0x363d3: 0x6cfdfa20, - 0x363d4: 0x6cfdfc20, 0x363d5: 0x6cfdfe20, 0x363d6: 0x6cfe0020, 0x363d7: 0x6cfe0220, - 0x363d8: 0x6cfe0420, 0x363d9: 0x6cfe0620, 0x363da: 0x6cfe0820, 0x363db: 0x6cfe0a20, - 0x363dc: 0x6cfe0c20, 0x363dd: 0x6cfe0e20, 0x363de: 0x6cfe1020, 0x363df: 0x6cfe1220, - 0x363e0: 0x6cfe1420, 0x363e1: 0x6cfe1620, 0x363e2: 0x6cfe1820, 0x363e3: 0x6cfe1a20, - 0x363e4: 0x6cfe1c20, 0x363e5: 0x6cfe1e20, 0x363e6: 0x6cfe2020, 0x363e7: 0x6cfe2220, - 0x363e8: 0x6cfe2420, 0x363e9: 0x6cfe2620, 0x363ea: 0x6cfe2820, 0x363eb: 0x6cfe2a20, - 0x363ec: 0x6cfe2c20, 0x363ed: 0x6cfe2e20, 0x363ee: 0x6cfe3020, 0x363ef: 0x6cfe3220, - 0x363f0: 0x6cfe3420, 0x363f1: 0x6cfe3620, 0x363f2: 0x6cfe3820, 0x363f3: 0x6cfe3a20, - 0x363f4: 0x6cfe3c20, 0x363f5: 0x6cfe3e20, 0x363f6: 0x6cfe4020, 0x363f7: 0x6cfe4220, - 0x363f8: 0x6cfe4420, 0x363f9: 0x6d2c8a20, 0x363fa: 0x6d2c8c20, 0x363fb: 0x6d2c8e20, - 0x363fc: 0x6d2c9020, 0x363fd: 0x6d2c9220, 0x363fe: 0x6d2c9420, 0x363ff: 0x6d2c9620, - // Block 0xd90, offset 0x36400 - 0x36400: 0x6d2c9820, 0x36401: 0x6d2c9a20, 0x36402: 0x6d2c9c20, 0x36403: 0x6d2c9e20, - 0x36404: 0x6d2ca020, 0x36405: 0x6d2ca220, 0x36406: 0x6d2ca420, 0x36407: 0x6d2ca620, - 0x36408: 0x6d2ca820, 0x36409: 0x6d2caa20, 0x3640a: 0x6d2cac20, 0x3640b: 0x6d2cae20, - 0x3640c: 0x6d2cb020, 0x3640d: 0x6d2cb220, 0x3640e: 0x6d2cb420, 0x3640f: 0x6d2cb620, - 0x36410: 0x6d2cb820, 0x36411: 0x6d2cba20, 0x36412: 0x6d2cbc20, 0x36413: 0x6d2cbe20, - 0x36414: 0x6d2cc020, 0x36415: 0x6d2cc220, 0x36416: 0x6d2cc420, 0x36417: 0x6d2cc620, - 0x36418: 0x6d2cc820, 0x36419: 0x6d2cca20, 0x3641a: 0x6d2ccc20, 0x3641b: 0x6d2cce20, - 0x3641c: 0x6d2cd020, 0x3641d: 0x6d2cd220, 0x3641e: 0x6d2cd420, 0x3641f: 0x6d2cd620, - 0x36420: 0x6d2cd820, 0x36421: 0x6d2cda20, 0x36422: 0x6d2cdc20, 0x36423: 0x6d59b220, - 0x36424: 0x6d59b420, 0x36425: 0x6d59b620, 0x36426: 0x6d59b820, 0x36427: 0x6d59ba20, - 0x36428: 0x6d59bc20, 0x36429: 0x6d59be20, 0x3642a: 0x6d59c020, 0x3642b: 0x6d59c220, - 0x3642c: 0x6d59c420, 0x3642d: 0x6d59c620, 0x3642e: 0x6d59c820, 0x3642f: 0x6d59ca20, - 0x36430: 0x6d59cc20, 0x36431: 0x6d59ce20, 0x36432: 0x6d59d020, 0x36433: 0x6d59d220, - 0x36434: 0x6d59d420, 0x36435: 0x6d59d620, 0x36436: 0x6d59d820, 0x36437: 0x6d59da20, - 0x36438: 0x6d59dc20, 0x36439: 0x6d59de20, 0x3643a: 0x6d59e020, 0x3643b: 0x6d59e220, - 0x3643c: 0x6d59e420, 0x3643d: 0x6d59e620, 0x3643e: 0x6d59e820, 0x3643f: 0x6d59ea20, - // Block 0xd91, offset 0x36440 - 0x36440: 0x6d59ec20, 0x36441: 0x6d59ee20, 0x36442: 0x6d59f020, 0x36443: 0x6d59f220, - 0x36444: 0x6d59f420, 0x36445: 0x6d59f620, 0x36446: 0x6d59f820, 0x36447: 0x6d59fa20, - 0x36448: 0x6d59fc20, 0x36449: 0x6d59fe20, 0x3644a: 0x6d5a0020, 0x3644b: 0x6d5a0220, - 0x3644c: 0x6d849820, 0x3644d: 0x6d849a20, 0x3644e: 0x6d849c20, 0x3644f: 0x6d849e20, - 0x36450: 0x6d84a020, 0x36451: 0x6d84a220, 0x36452: 0x6d84a420, 0x36453: 0x6d84a620, - 0x36454: 0x6d84a820, 0x36455: 0x6d84aa20, 0x36456: 0x6d84ac20, 0x36457: 0x6d84ae20, - 0x36458: 0x6d84b020, 0x36459: 0x6d84b220, 0x3645a: 0x6d84b420, 0x3645b: 0x6d84b620, - 0x3645c: 0x6d84b820, 0x3645d: 0x6d84ba20, 0x3645e: 0x6d84bc20, 0x3645f: 0x6d84be20, - 0x36460: 0x6d84c020, 0x36461: 0x6d84c220, 0x36462: 0x6d84c420, 0x36463: 0x6d84c620, - 0x36464: 0x6d84c820, 0x36465: 0x6d84ca20, 0x36466: 0x6da97820, 0x36467: 0x6da97a20, - 0x36468: 0x6da97c20, 0x36469: 0x6da97e20, 0x3646a: 0x6da98020, 0x3646b: 0x6da98220, - 0x3646c: 0x6da98420, 0x3646d: 0x6da98620, 0x3646e: 0x6da98820, 0x3646f: 0x6da98a20, - 0x36470: 0x6da98c20, 0x36471: 0x6da98e20, 0x36472: 0x6da99020, 0x36473: 0x6da99220, - 0x36474: 0x6dca6020, 0x36475: 0x6dca6220, 0x36476: 0x6dca6420, 0x36477: 0x6dca6620, - 0x36478: 0x6dca6820, 0x36479: 0x6dca6a20, 0x3647a: 0x6dca6c20, 0x3647b: 0x6dca6e20, - 0x3647c: 0x6dca7020, 0x3647d: 0x6dca7220, 0x3647e: 0x6dca7420, 0x3647f: 0x6dca7620, - // Block 0xd92, offset 0x36480 - 0x36480: 0x6dca7820, 0x36481: 0x6dca7a20, 0x36482: 0x6dca7c20, 0x36483: 0x6dca7e20, - 0x36484: 0x6dca8020, 0x36485: 0x6de60a20, 0x36486: 0x6de60c20, 0x36487: 0x6de60e20, - 0x36488: 0x6de61020, 0x36489: 0x6de61220, 0x3648a: 0x6de61420, 0x3648b: 0x6de61620, - 0x3648c: 0x6de61820, 0x3648d: 0x6dfcf420, 0x3648e: 0x6dfcf620, 0x3648f: 0x6dfcf820, - 0x36490: 0x6dfcfa20, 0x36491: 0x6e0fca20, 0x36492: 0x6e0fcc20, 0x36493: 0x6e0fce20, - 0x36494: 0x6e0fd020, 0x36495: 0x6e0fd220, 0x36496: 0x6e0fd420, 0x36497: 0x6e1eac20, - 0x36498: 0x6e1eae20, 0x36499: 0x6e1eb020, 0x3649a: 0x6e1eb220, 0x3649b: 0x6e2a1220, - 0x3649c: 0x6e2a1420, 0x3649d: 0x6e2a1620, 0x3649e: 0x6e2a1820, 0x3649f: 0x6e32d620, - 0x364a0: 0x6e32d820, 0x364a1: 0x6e32da20, 0x364a2: 0x6e32dc20, 0x364a3: 0x6e391620, - 0x364a4: 0x6e407a20, 0x364a5: 0x6c09f020, 0x364a6: 0x6c572820, 0x364a7: 0x6cd07420, - 0x364a8: 0x6d2ce020, 0x364a9: 0x6c04fc20, 0x364aa: 0x6c13c620, 0x364ab: 0x6c13c820, - 0x364ac: 0x6c13ca20, 0x364ad: 0x6c248820, 0x364ae: 0x6c248a20, 0x364af: 0x6c248c20, - 0x364b0: 0x6c248e20, 0x364b1: 0x6c249020, 0x364b2: 0x6c249220, 0x364b3: 0x6c249420, - 0x364b4: 0x6c249620, 0x364b5: 0x6c249820, 0x364b6: 0x6c249a20, 0x364b7: 0x6c249c20, - 0x364b8: 0x6c249e20, 0x364b9: 0x6c3b7020, 0x364ba: 0x6c3b7220, 0x364bb: 0x6c3b7420, - 0x364bc: 0x6c3b7620, 0x364bd: 0x6c3b7820, 0x364be: 0x6c3b7a20, 0x364bf: 0x6c3b7c20, - // Block 0xd93, offset 0x364c0 - 0x364c0: 0x6c3b7e20, 0x364c1: 0x6c3b8020, 0x364c2: 0x6c3b8220, 0x364c3: 0x6c3b8420, - 0x364c4: 0x6c3b8620, 0x364c5: 0x6c3b8820, 0x364c6: 0x6c3b8a20, 0x364c7: 0x6c3b8c20, - 0x364c8: 0x6c3b8e20, 0x364c9: 0x6c3b9020, 0x364ca: 0x6c3b9220, 0x364cb: 0x6c3b9420, - 0x364cc: 0x6c3b9620, 0x364cd: 0x6c3b9820, 0x364ce: 0x6c3b9a20, 0x364cf: 0x6c577620, - 0x364d0: 0x6c577820, 0x364d1: 0x6c577a20, 0x364d2: 0x6c577c20, 0x364d3: 0x6c577e20, - 0x364d4: 0x6c578020, 0x364d5: 0x6c578220, 0x364d6: 0x6c578420, 0x364d7: 0x6c578620, - 0x364d8: 0x6c578820, 0x364d9: 0x6c578a20, 0x364da: 0x6c578c20, 0x364db: 0x6c578e20, - 0x364dc: 0x6c579020, 0x364dd: 0x6c579220, 0x364de: 0x6c579420, 0x364df: 0x6c579620, - 0x364e0: 0x6c579820, 0x364e1: 0x6c579a20, 0x364e2: 0x6c579c20, 0x364e3: 0x6c579e20, - 0x364e4: 0x6c57a020, 0x364e5: 0x6c57a220, 0x364e6: 0x6c57a420, 0x364e7: 0x6c57a620, - 0x364e8: 0x6c57a820, 0x364e9: 0x6c57aa20, 0x364ea: 0x6c57ac20, 0x364eb: 0x6c57ae20, - 0x364ec: 0x6c57b020, 0x364ed: 0x6c57b220, 0x364ee: 0x6c57b420, 0x364ef: 0x6c57b620, - 0x364f0: 0x6c57b820, 0x364f1: 0x6c57ba20, 0x364f2: 0x6c57bc20, 0x364f3: 0x6c57be20, - 0x364f4: 0x6c57c020, 0x364f5: 0x6c7a1c20, 0x364f6: 0x6c7a1e20, 0x364f7: 0x6c7a2020, - 0x364f8: 0x6c7a2220, 0x364f9: 0x6c7a2420, 0x364fa: 0x6c7a2620, 0x364fb: 0x6c7a2820, - 0x364fc: 0x6c7a2a20, 0x364fd: 0x6c7a2c20, 0x364fe: 0x6c7a2e20, 0x364ff: 0x6c7a3020, - // Block 0xd94, offset 0x36500 - 0x36500: 0x6c7a3220, 0x36501: 0x6c7a3420, 0x36502: 0x6c7a3620, 0x36503: 0x6c7a3820, - 0x36504: 0x6c7a3a20, 0x36505: 0x6c7a3c20, 0x36506: 0x6c7a3e20, 0x36507: 0x6c7a4020, - 0x36508: 0x6c7a4220, 0x36509: 0x6c7a4420, 0x3650a: 0x6c7a4620, 0x3650b: 0x6c7a4820, - 0x3650c: 0x6c7a4a20, 0x3650d: 0x6c7a4c20, 0x3650e: 0x6c7a4e20, 0x3650f: 0x6c7a5020, - 0x36510: 0x6c7a5220, 0x36511: 0x6c7a5420, 0x36512: 0x6c7a5620, 0x36513: 0x6c7a5820, - 0x36514: 0x6c7a5a20, 0x36515: 0x6c7a5c20, 0x36516: 0x6ca32620, 0x36517: 0x6ca32820, - 0x36518: 0x6ca32a20, 0x36519: 0x6ca32c20, 0x3651a: 0x6ca32e20, 0x3651b: 0x6ca33020, - 0x3651c: 0x6ca33220, 0x3651d: 0x6ca33420, 0x3651e: 0x6ca33620, 0x3651f: 0x6ca33820, - 0x36520: 0x6ca33a20, 0x36521: 0x6ca33c20, 0x36522: 0x6ca33e20, 0x36523: 0x6ca34020, - 0x36524: 0x6ca34220, 0x36525: 0x6ca34420, 0x36526: 0x6ca34620, 0x36527: 0x6ca34820, - 0x36528: 0x6ca34a20, 0x36529: 0x6ca34c20, 0x3652a: 0x6ca34e20, 0x3652b: 0x6ca35020, - 0x3652c: 0x6ca35220, 0x3652d: 0x6ca35420, 0x3652e: 0x6ca35620, 0x3652f: 0x6ca35820, - 0x36530: 0x6ca35a20, 0x36531: 0x6ca35c20, 0x36532: 0x6ca35e20, 0x36533: 0x6ca36020, - 0x36534: 0x6ca36220, 0x36535: 0x6ca36420, 0x36536: 0x6ca36620, 0x36537: 0x6ca36820, - 0x36538: 0x6ca36a20, 0x36539: 0x6ca36c20, 0x3653a: 0x6ca36e20, 0x3653b: 0x6cd0dc20, - 0x3653c: 0x6cd0de20, 0x3653d: 0x6cd0e020, 0x3653e: 0x6cd0e220, 0x3653f: 0x6cd0e420, - // Block 0xd95, offset 0x36540 - 0x36540: 0x6cd0e620, 0x36541: 0x6cd0e820, 0x36542: 0x6cd0ea20, 0x36543: 0x6cd0ec20, - 0x36544: 0x6cd0ee20, 0x36545: 0x6cd0f020, 0x36546: 0x6cd0f220, 0x36547: 0x6cd0f420, - 0x36548: 0x6cd0f620, 0x36549: 0x6cd0f820, 0x3654a: 0x6cd0fa20, 0x3654b: 0x6cd0fc20, - 0x3654c: 0x6cd0fe20, 0x3654d: 0x6cd10020, 0x3654e: 0x6cd10220, 0x3654f: 0x6cd10420, - 0x36550: 0x6cd10620, 0x36551: 0x6cd10820, 0x36552: 0x6cd10a20, 0x36553: 0x6cd10c20, - 0x36554: 0x6cd10e20, 0x36555: 0x6cd11020, 0x36556: 0x6cd11220, 0x36557: 0x6cd11420, - 0x36558: 0x6cd11620, 0x36559: 0x6cd11820, 0x3655a: 0x6cd11a20, 0x3655b: 0x6cd11c20, - 0x3655c: 0x6cd11e20, 0x3655d: 0x6cd12020, 0x3655e: 0x6cd12220, 0x3655f: 0x6cd12420, - 0x36560: 0x6cd12620, 0x36561: 0x6cd12820, 0x36562: 0x6cd12a20, 0x36563: 0x6cd12c20, - 0x36564: 0x6cd12e20, 0x36565: 0x6cd13020, 0x36566: 0x6cd13220, 0x36567: 0x6cd13420, - 0x36568: 0x6cd13620, 0x36569: 0x6cd13820, 0x3656a: 0x6cd13a20, 0x3656b: 0x6cd13c20, - 0x3656c: 0x6cd13e20, 0x3656d: 0x6cd14020, 0x3656e: 0x6cd14220, 0x3656f: 0x6cfeaa20, - 0x36570: 0x6cfeac20, 0x36571: 0x6cfeae20, 0x36572: 0x6cfeb020, 0x36573: 0x6cfeb220, - 0x36574: 0x6cfeb420, 0x36575: 0x6cfeb620, 0x36576: 0x6cfeb820, 0x36577: 0x6cfeba20, - 0x36578: 0x6cfebc20, 0x36579: 0x6cfebe20, 0x3657a: 0x6cfec020, 0x3657b: 0x6cfec220, - 0x3657c: 0x6cfec420, 0x3657d: 0x6cfec620, 0x3657e: 0x6cfec820, 0x3657f: 0x6cfeca20, - // Block 0xd96, offset 0x36580 - 0x36580: 0x6cfecc20, 0x36581: 0x6cfece20, 0x36582: 0x6cfed020, 0x36583: 0x6cfed220, - 0x36584: 0x6cfed420, 0x36585: 0x6cfed620, 0x36586: 0x6cfed820, 0x36587: 0x6cfeda20, - 0x36588: 0x6cfedc20, 0x36589: 0x6cfede20, 0x3658a: 0x6cfee020, 0x3658b: 0x6cfee220, - 0x3658c: 0x6cfee420, 0x3658d: 0x6cfee620, 0x3658e: 0x6cfee820, 0x3658f: 0x6cfeea20, - 0x36590: 0x6cfeec20, 0x36591: 0x6cfeee20, 0x36592: 0x6cfef020, 0x36593: 0x6cfef220, - 0x36594: 0x6cfef420, 0x36595: 0x6cfef620, 0x36596: 0x6cfef820, 0x36597: 0x6cfefa20, - 0x36598: 0x6cfefc20, 0x36599: 0x6cfefe20, 0x3659a: 0x6cff0020, 0x3659b: 0x6cff0220, - 0x3659c: 0x6cff0420, 0x3659d: 0x6cff0620, 0x3659e: 0x6cff0820, 0x3659f: 0x6cff0a20, - 0x365a0: 0x6cff0c20, 0x365a1: 0x6cff0e20, 0x365a2: 0x6cff1020, 0x365a3: 0x6cff1220, - 0x365a4: 0x6cff1420, 0x365a5: 0x6cff1620, 0x365a6: 0x6cff1820, 0x365a7: 0x6cff1a20, - 0x365a8: 0x6cff1c20, 0x365a9: 0x6cff1e20, 0x365aa: 0x6d2d1620, 0x365ab: 0x6d2d1820, - 0x365ac: 0x6d2d1a20, 0x365ad: 0x6d2d1c20, 0x365ae: 0x6d2d1e20, 0x365af: 0x6d2d2020, - 0x365b0: 0x6d2d2220, 0x365b1: 0x6d2d2420, 0x365b2: 0x6d2d2620, 0x365b3: 0x6d2d2820, - 0x365b4: 0x6d2d2a20, 0x365b5: 0x6d2d2c20, 0x365b6: 0x6d2d2e20, 0x365b7: 0x6d2d3020, - 0x365b8: 0x6d2d3220, 0x365b9: 0x6d2d3420, 0x365ba: 0x6d2d3620, 0x365bb: 0x6d2d3820, - 0x365bc: 0x6d2d3a20, 0x365bd: 0x6d2d3c20, 0x365be: 0x6d2d3e20, 0x365bf: 0x6d2d4020, - // Block 0xd97, offset 0x365c0 - 0x365c0: 0x6d2d4220, 0x365c1: 0x6d2d4420, 0x365c2: 0x6d2d4620, 0x365c3: 0x6d2d4820, - 0x365c4: 0x6d2d4a20, 0x365c5: 0x6d2d4c20, 0x365c6: 0x6d2d4e20, 0x365c7: 0x6d2d5020, - 0x365c8: 0x6d2d5220, 0x365c9: 0x6d2d5420, 0x365ca: 0x6d2d5620, 0x365cb: 0x6d2d5820, - 0x365cc: 0x6d2d5a20, 0x365cd: 0x6d2d5c20, 0x365ce: 0x6d2d5e20, 0x365cf: 0x6d2d6020, - 0x365d0: 0x6d2d6220, 0x365d1: 0x6d2d6420, 0x365d2: 0x6d2d6620, 0x365d3: 0x6d2d6820, - 0x365d4: 0x6d5a4820, 0x365d5: 0x6d5a4a20, 0x365d6: 0x6d5a4c20, 0x365d7: 0x6d5a4e20, - 0x365d8: 0x6d5a5020, 0x365d9: 0x6d5a5220, 0x365da: 0x6d5a5420, 0x365db: 0x6d5a5620, - 0x365dc: 0x6d5a5820, 0x365dd: 0x6d5a5a20, 0x365de: 0x6d5a5c20, 0x365df: 0x6d5a5e20, - 0x365e0: 0x6d5a6020, 0x365e1: 0x6d5a6220, 0x365e2: 0x6d5a6420, 0x365e3: 0x6d5a6620, - 0x365e4: 0x6d5a6820, 0x365e5: 0x6d5a6a20, 0x365e6: 0x6d5a6c20, 0x365e7: 0x6d5a6e20, - 0x365e8: 0x6d5a7020, 0x365e9: 0x6d5a7220, 0x365ea: 0x6d5a7420, 0x365eb: 0x6d5a7620, - 0x365ec: 0x6d5a7820, 0x365ed: 0x6d5a7a20, 0x365ee: 0x6d5a7c20, 0x365ef: 0x6d5a7e20, - 0x365f0: 0x6d5a8020, 0x365f1: 0x6d5a8220, 0x365f2: 0x6d5a8420, 0x365f3: 0x6d5a8620, - 0x365f4: 0x6d5a8820, 0x365f5: 0x6d5a8a20, 0x365f6: 0x6d5a8c20, 0x365f7: 0x6d5a8e20, - 0x365f8: 0x6d5a9020, 0x365f9: 0x6d5a9220, 0x365fa: 0x6d5a9420, 0x365fb: 0x6d5a9620, - 0x365fc: 0x6d5a9820, 0x365fd: 0x6d5a9a20, 0x365fe: 0x6d5a9c20, 0x365ff: 0x6d5a9e20, - // Block 0xd98, offset 0x36600 - 0x36600: 0x6d850020, 0x36601: 0x6d5aa020, 0x36602: 0x6d850220, 0x36603: 0x6d850420, - 0x36604: 0x6d850620, 0x36605: 0x6d850820, 0x36606: 0x6d850a20, 0x36607: 0x6d850c20, - 0x36608: 0x6d850e20, 0x36609: 0x6d851020, 0x3660a: 0x6d851220, 0x3660b: 0x6d851420, - 0x3660c: 0x6d851620, 0x3660d: 0x6d851820, 0x3660e: 0x6d851a20, 0x3660f: 0x6d851c20, - 0x36610: 0x6d851e20, 0x36611: 0x6d852020, 0x36612: 0x6d852220, 0x36613: 0x6d852420, - 0x36614: 0x6d852620, 0x36615: 0x6d852820, 0x36616: 0x6d852a20, 0x36617: 0x6d852c20, - 0x36618: 0x6d852e20, 0x36619: 0x6d853020, 0x3661a: 0x6d853220, 0x3661b: 0x6d853420, - 0x3661c: 0x6d853620, 0x3661d: 0x6d853820, 0x3661e: 0x6d853a20, 0x3661f: 0x6d853c20, - 0x36620: 0x6d853e20, 0x36621: 0x6d854020, 0x36622: 0x6d854220, 0x36623: 0x6d854420, - 0x36624: 0x6d854620, 0x36625: 0x6d854820, 0x36626: 0x6d854a20, 0x36627: 0x6d854c20, - 0x36628: 0x6d854e20, 0x36629: 0x6d855020, 0x3662a: 0x6d855220, 0x3662b: 0x6da9c420, - 0x3662c: 0x6da9c620, 0x3662d: 0x6da9c820, 0x3662e: 0x6da9ca20, 0x3662f: 0x6da9cc20, - 0x36630: 0x6da9ce20, 0x36631: 0x6da9d020, 0x36632: 0x6da9d220, 0x36633: 0x6da9d420, - 0x36634: 0x6da9d620, 0x36635: 0x6da9d820, 0x36636: 0x6da9da20, 0x36637: 0x6da9dc20, - 0x36638: 0x6da9de20, 0x36639: 0x6da9e020, 0x3663a: 0x6da9e220, 0x3663b: 0x6da9e420, - 0x3663c: 0x6da9e620, 0x3663d: 0x6da9e820, 0x3663e: 0x6da9ea20, 0x3663f: 0x6da9ec20, - // Block 0xd99, offset 0x36640 - 0x36640: 0x6da9ee20, 0x36641: 0x6da9f020, 0x36642: 0x6da9f220, 0x36643: 0x6da9f420, - 0x36644: 0x6da9f620, 0x36645: 0x6da9f820, 0x36646: 0x6da9fa20, 0x36647: 0x6da9fc20, - 0x36648: 0x6da9fe20, 0x36649: 0x6daa0020, 0x3664a: 0x6daa0220, 0x3664b: 0x6dcaa020, - 0x3664c: 0x6dcaa220, 0x3664d: 0x6dcaa420, 0x3664e: 0x6dcaa620, 0x3664f: 0x6dcaa820, - 0x36650: 0x6dcaaa20, 0x36651: 0x6dcaac20, 0x36652: 0x6dcaae20, 0x36653: 0x6dcab020, - 0x36654: 0x6dcab220, 0x36655: 0x6dcab420, 0x36656: 0x6dcab620, 0x36657: 0x6dcab820, - 0x36658: 0x6dcaba20, 0x36659: 0x6dcabc20, 0x3665a: 0x6dcabe20, 0x3665b: 0x6dcac020, - 0x3665c: 0x6dcac220, 0x3665d: 0x6dcac420, 0x3665e: 0x6dcac620, 0x3665f: 0x6dcac820, - 0x36660: 0x6dcaca20, 0x36661: 0x6dcacc20, 0x36662: 0x6dcace20, 0x36663: 0x6dcad020, - 0x36664: 0x6dcad220, 0x36665: 0x6dcad420, 0x36666: 0x6dcad620, 0x36667: 0x6dcad820, - 0x36668: 0x6dcada20, 0x36669: 0x6de63a20, 0x3666a: 0x6de63c20, 0x3666b: 0x6de63e20, - 0x3666c: 0x6de64020, 0x3666d: 0x6de64220, 0x3666e: 0x6de64420, 0x3666f: 0x6de64620, - 0x36670: 0x6de64820, 0x36671: 0x6de64a20, 0x36672: 0x6de64c20, 0x36673: 0x6de64e20, - 0x36674: 0x6dcadc20, 0x36675: 0x6de65020, 0x36676: 0x6de65220, 0x36677: 0x6de65420, - 0x36678: 0x6de65620, 0x36679: 0x6de65820, 0x3667a: 0x6de65a20, 0x3667b: 0x6de65c20, - 0x3667c: 0x6de65e20, 0x3667d: 0x6de66020, 0x3667e: 0x6dfd0e20, 0x3667f: 0x6dfd1020, - // Block 0xd9a, offset 0x36680 - 0x36680: 0x6dfd1220, 0x36681: 0x6dfd1420, 0x36682: 0x6dfd1620, 0x36683: 0x6dfd1820, - 0x36684: 0x6dfd1a20, 0x36685: 0x6dfd1c20, 0x36686: 0x6dfd1e20, 0x36687: 0x6dfd2020, - 0x36688: 0x6dfd2220, 0x36689: 0x6e0fdc20, 0x3668a: 0x6e0fde20, 0x3668b: 0x6e0fe020, - 0x3668c: 0x6e0fe220, 0x3668d: 0x6e0fe420, 0x3668e: 0x6e0fe620, 0x3668f: 0x6e0fe820, - 0x36690: 0x6e0fea20, 0x36691: 0x6e0fec20, 0x36692: 0x6e0fee20, 0x36693: 0x6e0ff020, - 0x36694: 0x6e1ebc20, 0x36695: 0x6e1ebe20, 0x36696: 0x6e1ec020, 0x36697: 0x6e1ec220, - 0x36698: 0x6e1ec420, 0x36699: 0x6e2a1e20, 0x3669a: 0x6e2a2020, 0x3669b: 0x6e2a2220, - 0x3669c: 0x6e2a2420, 0x3669d: 0x6e2a2620, 0x3669e: 0x6e2a2820, 0x3669f: 0x6e2a2a20, - 0x366a0: 0x6e32e020, 0x366a1: 0x6e33a820, 0x366a2: 0x6e3d6c20, 0x366a3: 0x6e391820, - 0x366a4: 0x6e391a20, 0x366a5: 0x6e391c20, 0x366a6: 0x6e391e20, 0x366a7: 0x6e392020, - 0x366a8: 0x6e3d6e20, 0x366a9: 0x6e42c220, 0x366aa: 0x6c3bae20, 0x366ab: 0x6c57ca20, - 0x366ac: 0x6c57cc20, 0x366ad: 0x6c57ce20, 0x366ae: 0x6c57d020, 0x366af: 0x6c57d220, - 0x366b0: 0x6c7a7c20, 0x366b1: 0x6c7a7e20, 0x366b2: 0x6c7a8020, 0x366b3: 0x6c7a8220, - 0x366b4: 0x6c7a8420, 0x366b5: 0x6ca38220, 0x366b6: 0x6ca38420, 0x366b7: 0x6ca38620, - 0x366b8: 0x6ca38820, 0x366b9: 0x6ca38a20, 0x366ba: 0x6cd16220, 0x366bb: 0x6cd16420, - 0x366bc: 0x6cd16620, 0x366bd: 0x6cd16820, 0x366be: 0x6cd16a20, 0x366bf: 0x6cd16c20, - // Block 0xd9b, offset 0x366c0 - 0x366c0: 0x6cd16e20, 0x366c1: 0x6cff4420, 0x366c2: 0x6cff4620, 0x366c3: 0x6cff4820, - 0x366c4: 0x6cff4a20, 0x366c5: 0x6cff4c20, 0x366c6: 0x6cff4e20, 0x366c7: 0x6d5ab620, - 0x366c8: 0x6d2d8c20, 0x366c9: 0x6d2d8e20, 0x366ca: 0x6d2d9020, 0x366cb: 0x6d2d9220, - 0x366cc: 0x6d2d9420, 0x366cd: 0x6d5ab820, 0x366ce: 0x6d856c20, 0x366cf: 0x6d856e20, - 0x366d0: 0x6d5aba20, 0x366d1: 0x6d5abc20, 0x366d2: 0x6d5abe20, 0x366d3: 0x6d5ac020, - 0x366d4: 0x6d5ac220, 0x366d5: 0x6d5ac420, 0x366d6: 0x6d857020, 0x366d7: 0x6daa1020, - 0x366d8: 0x6dcae420, 0x366d9: 0x6dcae620, 0x366da: 0x6dcae820, 0x366db: 0x6e0ff420, - 0x366dc: 0x6e0ff620, 0x366dd: 0x6e0ff820, 0x366de: 0x6e1ec820, 0x366df: 0x6e1eca20, - 0x366e0: 0x6e2a2e20, 0x366e1: 0x6e2a3020, 0x366e2: 0x6e32e620, 0x366e3: 0x6e3d7220, - 0x366e4: 0x6e3d7420, 0x366e5: 0x6e452620, 0x366e6: 0x6c24a420, 0x366e7: 0x6c24a620, - 0x366e8: 0x6c3bba20, 0x366e9: 0x6c3bbc20, 0x366ea: 0x6c3bbe20, 0x366eb: 0x6c3bc020, - 0x366ec: 0x6c57ec20, 0x366ed: 0x6c57ee20, 0x366ee: 0x6c57f020, 0x366ef: 0x6c57f220, - 0x366f0: 0x6c57f420, 0x366f1: 0x6c57f620, 0x366f2: 0x6c57f820, 0x366f3: 0x6c7a9620, - 0x366f4: 0x6c7a9820, 0x366f5: 0x6c7a9a20, 0x366f6: 0x6c7a9c20, 0x366f7: 0x6c7a9e20, - 0x366f8: 0x6c7aa020, 0x366f9: 0x6c7aa220, 0x366fa: 0x6c7aa420, 0x366fb: 0x6c7aa620, - 0x366fc: 0x6c7aa820, 0x366fd: 0x6c7aaa20, 0x366fe: 0x6ca39e20, 0x366ff: 0x6ca3a020, - // Block 0xd9c, offset 0x36700 - 0x36700: 0x6ca3a220, 0x36701: 0x6ca3a420, 0x36702: 0x6ca3a620, 0x36703: 0x6ca3a820, - 0x36704: 0x6ca3aa20, 0x36705: 0x6ca3ac20, 0x36706: 0x6ca3ae20, 0x36707: 0x6ca3b020, - 0x36708: 0x6ca3b220, 0x36709: 0x6ca3b420, 0x3670a: 0x6ca3b620, 0x3670b: 0x6ca3b820, - 0x3670c: 0x6cd18020, 0x3670d: 0x6cd18220, 0x3670e: 0x6cd18420, 0x3670f: 0x6cd18620, - 0x36710: 0x6cd18820, 0x36711: 0x6cd18a20, 0x36712: 0x6cd18c20, 0x36713: 0x6cd18e20, - 0x36714: 0x6cd19020, 0x36715: 0x6cd19220, 0x36716: 0x6cd19420, 0x36717: 0x6cd19620, - 0x36718: 0x6cd19820, 0x36719: 0x6cd19a20, 0x3671a: 0x6cd19c20, 0x3671b: 0x6cff6820, - 0x3671c: 0x6cff6a20, 0x3671d: 0x6cff6c20, 0x3671e: 0x6cff6e20, 0x3671f: 0x6cff7020, - 0x36720: 0x6cff7220, 0x36721: 0x6cff7420, 0x36722: 0x6cff7620, 0x36723: 0x6cff7820, - 0x36724: 0x6cff7a20, 0x36725: 0x6cff7c20, 0x36726: 0x6cff7e20, 0x36727: 0x6d2dae20, - 0x36728: 0x6d2db020, 0x36729: 0x6d2db220, 0x3672a: 0x6d2db420, 0x3672b: 0x6d2db620, - 0x3672c: 0x6d2db820, 0x3672d: 0x6d2dba20, 0x3672e: 0x6d2dbc20, 0x3672f: 0x6d2dbe20, - 0x36730: 0x6d2dc020, 0x36731: 0x6d2dc220, 0x36732: 0x6cff8020, 0x36733: 0x6d2dc420, - 0x36734: 0x6d2dc620, 0x36735: 0x6d2dc820, 0x36736: 0x6d2dca20, 0x36737: 0x6d2dcc20, - 0x36738: 0x6d2dce20, 0x36739: 0x6d5ad420, 0x3673a: 0x6d5ad620, 0x3673b: 0x6d5ad820, - 0x3673c: 0x6d5ada20, 0x3673d: 0x6d5adc20, 0x3673e: 0x6d5ade20, 0x3673f: 0x6d5ae020, - // Block 0xd9d, offset 0x36740 - 0x36740: 0x6d5ae220, 0x36741: 0x6d5ae420, 0x36742: 0x6d5ae620, 0x36743: 0x6d5ae820, - 0x36744: 0x6d5aea20, 0x36745: 0x6d858420, 0x36746: 0x6d858620, 0x36747: 0x6d858820, - 0x36748: 0x6d858a20, 0x36749: 0x6d858c20, 0x3674a: 0x6d858e20, 0x3674b: 0x6d859020, - 0x3674c: 0x6d859220, 0x3674d: 0x6d859420, 0x3674e: 0x6daa2820, 0x3674f: 0x6daa2a20, - 0x36750: 0x6daa2c20, 0x36751: 0x6daa2e20, 0x36752: 0x6daa3020, 0x36753: 0x6daa3220, - 0x36754: 0x6daa3420, 0x36755: 0x6daa3620, 0x36756: 0x6cff8220, 0x36757: 0x6daa3820, - 0x36758: 0x6dcaf420, 0x36759: 0x6dcaf620, 0x3675a: 0x6dcaf820, 0x3675b: 0x6dcafa20, - 0x3675c: 0x6dcafc20, 0x3675d: 0x6dcafe20, 0x3675e: 0x6dcb0020, 0x3675f: 0x6dcb0220, - 0x36760: 0x6de67020, 0x36761: 0x6de67220, 0x36762: 0x6dfd2c20, 0x36763: 0x6dfd2e20, - 0x36764: 0x6dfd3020, 0x36765: 0x6dfd3220, 0x36766: 0x6e0ffc20, 0x36767: 0x6e0ffe20, - 0x36768: 0x6e100020, 0x36769: 0x6e100220, 0x3676a: 0x6e100420, 0x3676b: 0x6e100620, - 0x3676c: 0x6e100820, 0x3676d: 0x6e1ece20, 0x3676e: 0x6e1ed020, 0x3676f: 0x6e1ed220, - 0x36770: 0x6e2a3220, 0x36771: 0x6e2a3420, 0x36772: 0x6e2a3620, 0x36773: 0x6e2a3820, - 0x36774: 0x6e2a3a20, 0x36775: 0x6e2a3c20, 0x36776: 0x6e32ea20, 0x36777: 0x6e392420, - 0x36778: 0x6e407c20, 0x36779: 0x6e443820, 0x3677a: 0x6c0a0020, 0x3677b: 0x6c3bc620, - 0x3677c: 0x6c3bc820, 0x3677d: 0x6c3bca20, 0x3677e: 0x6c3bcc20, 0x3677f: 0x6c3bce20, - // Block 0xd9e, offset 0x36780 - 0x36780: 0x6c3bd020, 0x36781: 0x6c580020, 0x36782: 0x6c580220, 0x36783: 0x6c580420, - 0x36784: 0x6c580620, 0x36785: 0x6c7ab020, 0x36786: 0x6cd19e20, 0x36787: 0x6cff8e20, - 0x36788: 0x6d2dd420, 0x36789: 0x6d5af220, 0x3678a: 0x6d5af420, 0x3678b: 0x6d859620, - 0x3678c: 0x6d859820, 0x3678d: 0x6daa3c20, 0x3678e: 0x6dcb0420, 0x3678f: 0x6dc4c420, - 0x36790: 0x6e100a20, 0x36791: 0x6e1ed620, 0x36792: 0x6e42c420, 0x36793: 0x6c0a0420, - 0x36794: 0x6c13ce20, 0x36795: 0x6c3bd220, 0x36796: 0x6c3bd420, 0x36797: 0x6c3bd620, - 0x36798: 0x6c580c20, 0x36799: 0x6c580e20, 0x3679a: 0x6c581020, 0x3679b: 0x6c581220, - 0x3679c: 0x6c581420, 0x3679d: 0x6c581620, 0x3679e: 0x6c581820, 0x3679f: 0x6c7ab420, - 0x367a0: 0x6ca3c220, 0x367a1: 0x6ca3c420, 0x367a2: 0x6ca3c620, 0x367a3: 0x6ca3c820, - 0x367a4: 0x6ca3ca20, 0x367a5: 0x6ca3cc20, 0x367a6: 0x6cd1aa20, 0x367a7: 0x6cd1ac20, - 0x367a8: 0x6cd1ae20, 0x367a9: 0x6cd1b020, 0x367aa: 0x6cd1b220, 0x367ab: 0x6cd1b420, - 0x367ac: 0x6cff9020, 0x367ad: 0x6cff9220, 0x367ae: 0x6cff9420, 0x367af: 0x6cff9620, - 0x367b0: 0x6cff9820, 0x367b1: 0x6cff9a20, 0x367b2: 0x6d2dd820, 0x367b3: 0x6d2dda20, - 0x367b4: 0x6d2ddc20, 0x367b5: 0x6d5af820, 0x367b6: 0x6d859c20, 0x367b7: 0x6daa3e20, - 0x367b8: 0x6daa4020, 0x367b9: 0x6daa4220, 0x367ba: 0x6dcb0620, 0x367bb: 0x6de67420, - 0x367bc: 0x6de67620, 0x367bd: 0x6de26620, 0x367be: 0x6de67820, 0x367bf: 0x6de67a20, - // Block 0xd9f, offset 0x367c0 - 0x367c0: 0x6e100c20, 0x367c1: 0x6e1ed820, 0x367c2: 0x6e1eda20, 0x367c3: 0x6c13d220, - 0x367c4: 0x6c24ae20, 0x367c5: 0x6c3bde20, 0x367c6: 0x6c3be020, 0x367c7: 0x6c7ab820, - 0x367c8: 0x6ca3d020, 0x367c9: 0x6cd1b820, 0x367ca: 0x6d2dde20, 0x367cb: 0x6d5afa20, - 0x367cc: 0x6d5afc20, 0x367cd: 0x6dcb0820, 0x367ce: 0x6de67c20, 0x367cf: 0x6e1edc20, - 0x367d0: 0x6e392620, 0x367d1: 0x6e2a3e20, 0x367d2: 0x6c0a1620, 0x367d3: 0x6c13d820, - 0x367d4: 0x6c13da20, 0x367d5: 0x6c24c220, 0x367d6: 0x6c24c420, 0x367d7: 0x6c24c620, - 0x367d8: 0x6c24c820, 0x367d9: 0x6c24ca20, 0x367da: 0x6c24cc20, 0x367db: 0x6c24ce20, - 0x367dc: 0x6c24d020, 0x367dd: 0x6c3bfa20, 0x367de: 0x6c3bfc20, 0x367df: 0x6c3bfe20, - 0x367e0: 0x6c3c0020, 0x367e1: 0x6c3c0220, 0x367e2: 0x6c3c0420, 0x367e3: 0x6c3c0620, - 0x367e4: 0x6c3c0820, 0x367e5: 0x6c3c0a20, 0x367e6: 0x6c3c0c20, 0x367e7: 0x6c3c0e20, - 0x367e8: 0x6c3c1020, 0x367e9: 0x6c584020, 0x367ea: 0x6c584220, 0x367eb: 0x6c584420, - 0x367ec: 0x6c584620, 0x367ed: 0x6c584820, 0x367ee: 0x6c584a20, 0x367ef: 0x6c584c20, - 0x367f0: 0x6c584e20, 0x367f1: 0x6c585020, 0x367f2: 0x6c585220, 0x367f3: 0x6c585420, - 0x367f4: 0x6c585620, 0x367f5: 0x6c585820, 0x367f6: 0x6c585a20, 0x367f7: 0x6c585c20, - 0x367f8: 0x6c585e20, 0x367f9: 0x6c586020, 0x367fa: 0x6c586220, 0x367fb: 0x6c586420, - 0x367fc: 0x6c586620, 0x367fd: 0x6c586820, 0x367fe: 0x6c586a20, 0x367ff: 0x6c586c20, - // Block 0xda0, offset 0x36800 - 0x36800: 0x6c586e20, 0x36801: 0x6c587020, 0x36802: 0x6c587220, 0x36803: 0x6c587420, - 0x36804: 0x6c587620, 0x36805: 0x6c587820, 0x36806: 0x6c587a20, 0x36807: 0x6c587c20, - 0x36808: 0x6c587e20, 0x36809: 0x6c588020, 0x3680a: 0x6c588220, 0x3680b: 0x6c588420, - 0x3680c: 0x6c7ad620, 0x3680d: 0x6c7ad820, 0x3680e: 0x6c7ada20, 0x3680f: 0x6c7adc20, - 0x36810: 0x6c7ade20, 0x36811: 0x6c7ae020, 0x36812: 0x6c7ae220, 0x36813: 0x6c7ae420, - 0x36814: 0x6c7ae620, 0x36815: 0x6c7ae820, 0x36816: 0x6c7aea20, 0x36817: 0x6c7aec20, - 0x36818: 0x6c7aee20, 0x36819: 0x6c7af020, 0x3681a: 0x6c7af220, 0x3681b: 0x6c7af420, - 0x3681c: 0x6c7af620, 0x3681d: 0x6c7af820, 0x3681e: 0x6c7afa20, 0x3681f: 0x6c7afc20, - 0x36820: 0x6c7afe20, 0x36821: 0x6c63fc20, 0x36822: 0x6c7b0020, 0x36823: 0x6c7b0220, - 0x36824: 0x6c7b0420, 0x36825: 0x6ca3e820, 0x36826: 0x6ca3ea20, 0x36827: 0x6ca3ec20, - 0x36828: 0x6ca3ee20, 0x36829: 0x6ca3f020, 0x3682a: 0x6ca3f220, 0x3682b: 0x6ca3f420, - 0x3682c: 0x6ca3f620, 0x3682d: 0x6ca3f820, 0x3682e: 0x6ca3fa20, 0x3682f: 0x6ca3fc20, - 0x36830: 0x6ca3fe20, 0x36831: 0x6ca40020, 0x36832: 0x6ca40220, 0x36833: 0x6ca40420, - 0x36834: 0x6ca40620, 0x36835: 0x6ca40820, 0x36836: 0x6ca40a20, 0x36837: 0x6ca40c20, - 0x36838: 0x6ca40e20, 0x36839: 0x6ca41020, 0x3683a: 0x6ca41220, 0x3683b: 0x6cd1d020, - 0x3683c: 0x6cd1d220, 0x3683d: 0x6cd1d420, 0x3683e: 0x6cd1d620, 0x3683f: 0x6cd1d820, - // Block 0xda1, offset 0x36840 - 0x36840: 0x6cd1da20, 0x36841: 0x6cd1dc20, 0x36842: 0x6cd1de20, 0x36843: 0x6cd1e020, - 0x36844: 0x6cd1e220, 0x36845: 0x6cd1e420, 0x36846: 0x6cd1e620, 0x36847: 0x6cd1e820, - 0x36848: 0x6cd1ea20, 0x36849: 0x6cd1ec20, 0x3684a: 0x6cd1ee20, 0x3684b: 0x6cd1f020, - 0x3684c: 0x6cd1f220, 0x3684d: 0x6cd1f420, 0x3684e: 0x6cd1f620, 0x3684f: 0x6cd1f820, - 0x36850: 0x6cd1fa20, 0x36851: 0x6cffb620, 0x36852: 0x6cffb820, 0x36853: 0x6cffba20, - 0x36854: 0x6cffbc20, 0x36855: 0x6cffbe20, 0x36856: 0x6cffc020, 0x36857: 0x6cffc220, - 0x36858: 0x6cffc420, 0x36859: 0x6cffc620, 0x3685a: 0x6cffc820, 0x3685b: 0x6cffca20, - 0x3685c: 0x6cffcc20, 0x3685d: 0x6cffce20, 0x3685e: 0x6cffd020, 0x3685f: 0x6cffd220, - 0x36860: 0x6cffd420, 0x36861: 0x6cffd620, 0x36862: 0x6cffd820, 0x36863: 0x6cffda20, - 0x36864: 0x6cffdc20, 0x36865: 0x6cffde20, 0x36866: 0x6cffe020, 0x36867: 0x6cffe220, - 0x36868: 0x6cffe420, 0x36869: 0x6cffe620, 0x3686a: 0x6cffe820, 0x3686b: 0x6d2de820, - 0x3686c: 0x6d2dea20, 0x3686d: 0x6d2dec20, 0x3686e: 0x6d2dee20, 0x3686f: 0x6d2df020, - 0x36870: 0x6d2df220, 0x36871: 0x6d2df420, 0x36872: 0x6d2df620, 0x36873: 0x6d2df820, - 0x36874: 0x6d2dfa20, 0x36875: 0x6d2dfc20, 0x36876: 0x6d2dfe20, 0x36877: 0x6d5b0820, - 0x36878: 0x6d5b0a20, 0x36879: 0x6d5b0c20, 0x3687a: 0x6d5b0e20, 0x3687b: 0x6d5b1020, - 0x3687c: 0x6d5b1220, 0x3687d: 0x6d5b1420, 0x3687e: 0x6d5b1620, 0x3687f: 0x6d5b1820, - // Block 0xda2, offset 0x36880 - 0x36880: 0x6d5b1a20, 0x36881: 0x6d5b1c20, 0x36882: 0x6d5b1e20, 0x36883: 0x6d5b2020, - 0x36884: 0x6d5b2220, 0x36885: 0x6d5b2420, 0x36886: 0x6d5b2620, 0x36887: 0x6d5b2820, - 0x36888: 0x6d85a620, 0x36889: 0x6d85a820, 0x3688a: 0x6d85aa20, 0x3688b: 0x6d85ac20, - 0x3688c: 0x6d85ae20, 0x3688d: 0x6d85b020, 0x3688e: 0x6d85b220, 0x3688f: 0x6d75d020, - 0x36890: 0x6d85b420, 0x36891: 0x6d85b620, 0x36892: 0x6daa4a20, 0x36893: 0x6daa4c20, - 0x36894: 0x6daa4e20, 0x36895: 0x6daa5020, 0x36896: 0x6daa5220, 0x36897: 0x6daa5420, - 0x36898: 0x6daa5620, 0x36899: 0x6daa5820, 0x3689a: 0x6daa5a20, 0x3689b: 0x6db99020, - 0x3689c: 0x6daa5c20, 0x3689d: 0x6daa5e20, 0x3689e: 0x6daa6020, 0x3689f: 0x6daa6220, - 0x368a0: 0x6daa6420, 0x368a1: 0x6daa6620, 0x368a2: 0x6daa6820, 0x368a3: 0x6daa6a20, - 0x368a4: 0x6dcb1020, 0x368a5: 0x6dcb1220, 0x368a6: 0x6dcb1420, 0x368a7: 0x6dcb1620, - 0x368a8: 0x6dcb1820, 0x368a9: 0x6de68420, 0x368aa: 0x6de68620, 0x368ab: 0x6de68820, - 0x368ac: 0x6de68a20, 0x368ad: 0x6de68c20, 0x368ae: 0x6de68e20, 0x368af: 0x6de69020, - 0x368b0: 0x6de69220, 0x368b1: 0x6dfd3820, 0x368b2: 0x6de69420, 0x368b3: 0x6dfd3a20, - 0x368b4: 0x6dfd3c20, 0x368b5: 0x6dfd3e20, 0x368b6: 0x6dfd4020, 0x368b7: 0x6dfd4220, - 0x368b8: 0x6dfd4420, 0x368b9: 0x6e100e20, 0x368ba: 0x6e101020, 0x368bb: 0x6e101220, - 0x368bc: 0x6e101420, 0x368bd: 0x6e101620, 0x368be: 0x6e101820, 0x368bf: 0x6e1ee020, - // Block 0xda3, offset 0x368c0 - 0x368c0: 0x6e1ee220, 0x368c1: 0x6e1ee420, 0x368c2: 0x6e2a4220, 0x368c3: 0x6e2a4420, - 0x368c4: 0x6e2a4620, 0x368c5: 0x6e32ec20, 0x368c6: 0x6e392820, 0x368c7: 0x6e3d7620, - 0x368c8: 0x6e3d7820, 0x368c9: 0x6e3d7a20, 0x368ca: 0x6e3d7c20, 0x368cb: 0x6e3d7e20, - 0x368cc: 0x6e407e20, 0x368cd: 0x6e408020, 0x368ce: 0x6e42c620, 0x368cf: 0x6e452820, - 0x368d0: 0x6e463220, 0x368d1: 0x6e468620, 0x368d2: 0x6e46e820, 0x368d3: 0x6c0a1c20, - 0x368d4: 0x6c0a1e20, 0x368d5: 0x6c13dc20, 0x368d6: 0x6c3c1620, 0x368d7: 0x6c7b1020, - 0x368d8: 0x6c588e20, 0x368d9: 0x6cd20c20, 0x368da: 0x6cd20e20, 0x368db: 0x6cd21020, - 0x368dc: 0x6cfff220, 0x368dd: 0x6cfff420, 0x368de: 0x6d5b2e20, 0x368df: 0x6d85be20, - 0x368e0: 0x6d85c020, 0x368e1: 0x6d85c220, 0x368e2: 0x6d85c420, 0x368e3: 0x6dcb1e20, - 0x368e4: 0x6e1ee620, 0x368e5: 0x6c13de20, 0x368e6: 0x6c24e220, 0x368e7: 0x6c24e420, - 0x368e8: 0x6c24e620, 0x368e9: 0x6c24e820, 0x368ea: 0x6c24ea20, 0x368eb: 0x6c24ec20, - 0x368ec: 0x6c24ee20, 0x368ed: 0x6c24f020, 0x368ee: 0x6c24f220, 0x368ef: 0x6c3c3220, - 0x368f0: 0x6c3c3420, 0x368f1: 0x6c3c3620, 0x368f2: 0x6c3c3820, 0x368f3: 0x6c3c3a20, - 0x368f4: 0x6c3c3c20, 0x368f5: 0x6c3c3e20, 0x368f6: 0x6c3c4020, 0x368f7: 0x6c58ba20, - 0x368f8: 0x6c58bc20, 0x368f9: 0x6c58be20, 0x368fa: 0x6c58c020, 0x368fb: 0x6c58c220, - 0x368fc: 0x6c58c420, 0x368fd: 0x6c58c620, 0x368fe: 0x6c58c820, 0x368ff: 0x6c58ca20, - // Block 0xda4, offset 0x36900 - 0x36900: 0x6c58cc20, 0x36901: 0x6c58ce20, 0x36902: 0x6c58d020, 0x36903: 0x6c58d220, - 0x36904: 0x6c58d420, 0x36905: 0x6c58d620, 0x36906: 0x6c58d820, 0x36907: 0x6c58da20, - 0x36908: 0x6c58dc20, 0x36909: 0x6c58de20, 0x3690a: 0x6c58e020, 0x3690b: 0x6c58e220, - 0x3690c: 0x6c58e420, 0x3690d: 0x6c58e620, 0x3690e: 0x6c58e820, 0x3690f: 0x6c58ea20, - 0x36910: 0x6c58ec20, 0x36911: 0x6c58ee20, 0x36912: 0x6c58f020, 0x36913: 0x6c58f220, - 0x36914: 0x6c58f420, 0x36915: 0x6c58f620, 0x36916: 0x6c58f820, 0x36917: 0x6c7b5c20, - 0x36918: 0x6c7b5e20, 0x36919: 0x6c7b6020, 0x3691a: 0x6c7b6220, 0x3691b: 0x6c7b6420, - 0x3691c: 0x6c7b6620, 0x3691d: 0x6c7b6820, 0x3691e: 0x6c7b6a20, 0x3691f: 0x6c7b6c20, - 0x36920: 0x6c7b6e20, 0x36921: 0x6c7b7020, 0x36922: 0x6c7b7220, 0x36923: 0x6c7b7420, - 0x36924: 0x6c7b7620, 0x36925: 0x6c7b7820, 0x36926: 0x6c7b7a20, 0x36927: 0x6c7b7c20, - 0x36928: 0x6c7b7e20, 0x36929: 0x6c7b8020, 0x3692a: 0x6c7b8220, 0x3692b: 0x6c7b8420, - 0x3692c: 0x6c7b8620, 0x3692d: 0x6c7b8820, 0x3692e: 0x6c7b8a20, 0x3692f: 0x6c7b8c20, - 0x36930: 0x6c7b8e20, 0x36931: 0x6c7b9020, 0x36932: 0x6c7b9220, 0x36933: 0x6c7b9420, - 0x36934: 0x6c7b9620, 0x36935: 0x6c7b9820, 0x36936: 0x6c7b9a20, 0x36937: 0x6ca44820, - 0x36938: 0x6ca44a20, 0x36939: 0x6ca44c20, 0x3693a: 0x6ca44e20, 0x3693b: 0x6ca45020, - 0x3693c: 0x6ca45220, 0x3693d: 0x6ca45420, 0x3693e: 0x6ca45620, 0x3693f: 0x6ca45820, - // Block 0xda5, offset 0x36940 - 0x36940: 0x6ca45a20, 0x36941: 0x6ca45c20, 0x36942: 0x6ca45e20, 0x36943: 0x6ca46020, - 0x36944: 0x6ca46220, 0x36945: 0x6ca46420, 0x36946: 0x6ca46620, 0x36947: 0x6ca46820, - 0x36948: 0x6ca46a20, 0x36949: 0x6ca46c20, 0x3694a: 0x6ca46e20, 0x3694b: 0x6ca47020, - 0x3694c: 0x6ca47220, 0x3694d: 0x6ca47420, 0x3694e: 0x6ca47620, 0x3694f: 0x6ca47820, - 0x36950: 0x6ca47a20, 0x36951: 0x6ca47c20, 0x36952: 0x6ca47e20, 0x36953: 0x6ca48020, - 0x36954: 0x6ca48220, 0x36955: 0x6cd25a20, 0x36956: 0x6cd25c20, 0x36957: 0x6cd25e20, - 0x36958: 0x6cd26020, 0x36959: 0x6cd26220, 0x3695a: 0x6cd26420, 0x3695b: 0x6cd26620, - 0x3695c: 0x6cd26820, 0x3695d: 0x6cd26a20, 0x3695e: 0x6cd26c20, 0x3695f: 0x6cd26e20, - 0x36960: 0x6cd27020, 0x36961: 0x6cd27220, 0x36962: 0x6cd27420, 0x36963: 0x6cd27620, - 0x36964: 0x6cd27820, 0x36965: 0x6cd27a20, 0x36966: 0x6cd27c20, 0x36967: 0x6cd27e20, - 0x36968: 0x6cd28020, 0x36969: 0x6cd28220, 0x3696a: 0x6cd28420, 0x3696b: 0x6cd28620, - 0x3696c: 0x6cd28820, 0x3696d: 0x6cd28a20, 0x3696e: 0x6cd28c20, 0x3696f: 0x6cd28e20, - 0x36970: 0x6cd29020, 0x36971: 0x6cd29220, 0x36972: 0x6cd29420, 0x36973: 0x6cd29620, - 0x36974: 0x6cd29820, 0x36975: 0x6cd29a20, 0x36976: 0x6cd29c20, 0x36977: 0x6cd29e20, - 0x36978: 0x6cd2a020, 0x36979: 0x6cd2a220, 0x3697a: 0x6cd2a420, 0x3697b: 0x6cd2a620, - 0x3697c: 0x6cd2a820, 0x3697d: 0x6cd2aa20, 0x3697e: 0x6cd2ac20, 0x3697f: 0x6cd2ae20, - // Block 0xda6, offset 0x36980 - 0x36980: 0x6cd2b020, 0x36981: 0x6cd2b220, 0x36982: 0x6d003c20, 0x36983: 0x6d003e20, - 0x36984: 0x6d004020, 0x36985: 0x6d004220, 0x36986: 0x6d004420, 0x36987: 0x6d004620, - 0x36988: 0x6d004820, 0x36989: 0x6d004a20, 0x3698a: 0x6d004c20, 0x3698b: 0x6d004e20, - 0x3698c: 0x6d005020, 0x3698d: 0x6d005220, 0x3698e: 0x6d005420, 0x3698f: 0x6d005620, - 0x36990: 0x6d005820, 0x36991: 0x6d005a20, 0x36992: 0x6d005c20, 0x36993: 0x6d005e20, - 0x36994: 0x6d006020, 0x36995: 0x6d006220, 0x36996: 0x6d006420, 0x36997: 0x6d006620, - 0x36998: 0x6d006820, 0x36999: 0x6d006a20, 0x3699a: 0x6d006c20, 0x3699b: 0x6d006e20, - 0x3699c: 0x6d007020, 0x3699d: 0x6d007220, 0x3699e: 0x6d007420, 0x3699f: 0x6d007620, - 0x369a0: 0x6d007820, 0x369a1: 0x6d007a20, 0x369a2: 0x6d007c20, 0x369a3: 0x6d007e20, - 0x369a4: 0x6d008020, 0x369a5: 0x6d008220, 0x369a6: 0x6d008420, 0x369a7: 0x6d008620, - 0x369a8: 0x6d008820, 0x369a9: 0x6d008a20, 0x369aa: 0x6d008c20, 0x369ab: 0x6d008e20, - 0x369ac: 0x6d009020, 0x369ad: 0x6d009220, 0x369ae: 0x6d009420, 0x369af: 0x6d009620, - 0x369b0: 0x6d009820, 0x369b1: 0x6d009a20, 0x369b2: 0x6d009c20, 0x369b3: 0x6d009e20, - 0x369b4: 0x6d00a020, 0x369b5: 0x6d00a220, 0x369b6: 0x6d00a420, 0x369b7: 0x6d00a620, - 0x369b8: 0x6d00a820, 0x369b9: 0x6d00aa20, 0x369ba: 0x6d00ac20, 0x369bb: 0x6d2e4220, - 0x369bc: 0x6d2e4420, 0x369bd: 0x6d2e4620, 0x369be: 0x6d2e4820, 0x369bf: 0x6d2e4a20, - // Block 0xda7, offset 0x369c0 - 0x369c0: 0x6d2e4c20, 0x369c1: 0x6d2e4e20, 0x369c2: 0x6d2e5020, 0x369c3: 0x6d2e5220, - 0x369c4: 0x6d2e5420, 0x369c5: 0x6d2e5620, 0x369c6: 0x6d2e5820, 0x369c7: 0x6d2e5a20, - 0x369c8: 0x6d2e5c20, 0x369c9: 0x6d2e5e20, 0x369ca: 0x6d2e6020, 0x369cb: 0x6d2e6220, - 0x369cc: 0x6d2e6420, 0x369cd: 0x6d2e6620, 0x369ce: 0x6d2e6820, 0x369cf: 0x6d2e6a20, - 0x369d0: 0x6d2e6c20, 0x369d1: 0x6d2e6e20, 0x369d2: 0x6d2e7020, 0x369d3: 0x6d2e7220, - 0x369d4: 0x6d2e7420, 0x369d5: 0x6d2e7620, 0x369d6: 0x6d2e7820, 0x369d7: 0x6d2e7a20, - 0x369d8: 0x6d2e7c20, 0x369d9: 0x6d2e7e20, 0x369da: 0x6d2e8020, 0x369db: 0x6d2e8220, - 0x369dc: 0x6d2e8420, 0x369dd: 0x6d2e8620, 0x369de: 0x6d2e8820, 0x369df: 0x6d2e8a20, - 0x369e0: 0x6d2e8c20, 0x369e1: 0x6d2e8e20, 0x369e2: 0x6d2e9020, 0x369e3: 0x6d2e9220, - 0x369e4: 0x6d2e9420, 0x369e5: 0x6d2e9620, 0x369e6: 0x6d2e9820, 0x369e7: 0x6d2e9a20, - 0x369e8: 0x6d2e9c20, 0x369e9: 0x6d2e9e20, 0x369ea: 0x6d5b6c20, 0x369eb: 0x6d5b6e20, - 0x369ec: 0x6d5b7020, 0x369ed: 0x6d5b7220, 0x369ee: 0x6d5b7420, 0x369ef: 0x6d5b7620, - 0x369f0: 0x6d5b7820, 0x369f1: 0x6d5b7a20, 0x369f2: 0x6d5b7c20, 0x369f3: 0x6d5b7e20, - 0x369f4: 0x6d5b8020, 0x369f5: 0x6d5b8220, 0x369f6: 0x6d5b8420, 0x369f7: 0x6d5b8620, - 0x369f8: 0x6d5b8820, 0x369f9: 0x6d5b8a20, 0x369fa: 0x6d5b8c20, 0x369fb: 0x6d5b8e20, - 0x369fc: 0x6d5b9020, 0x369fd: 0x6d5b9220, 0x369fe: 0x6d5b9420, 0x369ff: 0x6d5b9620, - // Block 0xda8, offset 0x36a00 - 0x36a00: 0x6d5b9820, 0x36a01: 0x6d5b9a20, 0x36a02: 0x6d5b9c20, 0x36a03: 0x6d5b9e20, - 0x36a04: 0x6d5ba020, 0x36a05: 0x6d5ba220, 0x36a06: 0x6d5ba420, 0x36a07: 0x6d5ba620, - 0x36a08: 0x6d5ba820, 0x36a09: 0x6d5baa20, 0x36a0a: 0x6d5bac20, 0x36a0b: 0x6d5bae20, - 0x36a0c: 0x6d5bb020, 0x36a0d: 0x6d5bb220, 0x36a0e: 0x6d5bb420, 0x36a0f: 0x6d5bb620, - 0x36a10: 0x6d5bb820, 0x36a11: 0x6d5bba20, 0x36a12: 0x6d5bbc20, 0x36a13: 0x6d5bbe20, - 0x36a14: 0x6d5bc020, 0x36a15: 0x6d5bc220, 0x36a16: 0x6d5bc420, 0x36a17: 0x6d5bc620, - 0x36a18: 0x6d5bc820, 0x36a19: 0x6d5bca20, 0x36a1a: 0x6d5bcc20, 0x36a1b: 0x6d5bce20, - 0x36a1c: 0x6d5bd020, 0x36a1d: 0x6d85fe20, 0x36a1e: 0x6d860020, 0x36a1f: 0x6d860220, - 0x36a20: 0x6d860420, 0x36a21: 0x6d860620, 0x36a22: 0x6d860820, 0x36a23: 0x6d860a20, - 0x36a24: 0x6d860c20, 0x36a25: 0x6d860e20, 0x36a26: 0x6d861020, 0x36a27: 0x6d861220, - 0x36a28: 0x6d861420, 0x36a29: 0x6d861620, 0x36a2a: 0x6d861820, 0x36a2b: 0x6d861a20, - 0x36a2c: 0x6d861c20, 0x36a2d: 0x6d861e20, 0x36a2e: 0x6d862020, 0x36a2f: 0x6d862220, - 0x36a30: 0x6d862420, 0x36a31: 0x6d862620, 0x36a32: 0x6d862820, 0x36a33: 0x6d862a20, - 0x36a34: 0x6d862c20, 0x36a35: 0x6d862e20, 0x36a36: 0x6d863020, 0x36a37: 0x6d863220, - 0x36a38: 0x6d863420, 0x36a39: 0x6d863620, 0x36a3a: 0x6d863820, 0x36a3b: 0x6d863a20, - 0x36a3c: 0x6d863c20, 0x36a3d: 0x6d863e20, 0x36a3e: 0x6d864020, 0x36a3f: 0x6d864220, - // Block 0xda9, offset 0x36a40 - 0x36a40: 0x6d864420, 0x36a41: 0x6d864620, 0x36a42: 0x6d864820, 0x36a43: 0x6daa9020, - 0x36a44: 0x6daa9220, 0x36a45: 0x6daa9420, 0x36a46: 0x6daa9620, 0x36a47: 0x6daa9820, - 0x36a48: 0x6daa9a20, 0x36a49: 0x6daa9c20, 0x36a4a: 0x6daa9e20, 0x36a4b: 0x6daaa020, - 0x36a4c: 0x6daaa220, 0x36a4d: 0x6daaa420, 0x36a4e: 0x6daaa620, 0x36a4f: 0x6daaa820, - 0x36a50: 0x6daaaa20, 0x36a51: 0x6daaac20, 0x36a52: 0x6daaae20, 0x36a53: 0x6daab020, - 0x36a54: 0x6daab220, 0x36a55: 0x6daab420, 0x36a56: 0x6daab620, 0x36a57: 0x6daab820, - 0x36a58: 0x6daaba20, 0x36a59: 0x6daabc20, 0x36a5a: 0x6daabe20, 0x36a5b: 0x6daac020, - 0x36a5c: 0x6daac220, 0x36a5d: 0x6daac420, 0x36a5e: 0x6d864a20, 0x36a5f: 0x6daac620, - 0x36a60: 0x6daac820, 0x36a61: 0x6daaca20, 0x36a62: 0x6daacc20, 0x36a63: 0x6daace20, - 0x36a64: 0x6daad020, 0x36a65: 0x6daad220, 0x36a66: 0x6daad420, 0x36a67: 0x6daad620, - 0x36a68: 0x6daad820, 0x36a69: 0x6daada20, 0x36a6a: 0x6daadc20, 0x36a6b: 0x6daade20, - 0x36a6c: 0x6daae020, 0x36a6d: 0x6daae220, 0x36a6e: 0x6daae420, 0x36a6f: 0x6daae620, - 0x36a70: 0x6daae820, 0x36a71: 0x6daaea20, 0x36a72: 0x6daaec20, 0x36a73: 0x6daaee20, - 0x36a74: 0x6daaf020, 0x36a75: 0x6daaf220, 0x36a76: 0x6daaf420, 0x36a77: 0x6daaf620, - 0x36a78: 0x6daaf820, 0x36a79: 0x6daafa20, 0x36a7a: 0x6dcb4c20, 0x36a7b: 0x6dcb4e20, - 0x36a7c: 0x6dcb5020, 0x36a7d: 0x6dcb5220, 0x36a7e: 0x6dcb5420, 0x36a7f: 0x6dcb5620, - // Block 0xdaa, offset 0x36a80 - 0x36a80: 0x6dcb5820, 0x36a81: 0x6dcb5a20, 0x36a82: 0x6dcb5c20, 0x36a83: 0x6dcb5e20, - 0x36a84: 0x6dcb6020, 0x36a85: 0x6dcb6220, 0x36a86: 0x6dcb6420, 0x36a87: 0x6dcb6620, - 0x36a88: 0x6dcb6820, 0x36a89: 0x6dcb6a20, 0x36a8a: 0x6dcb6c20, 0x36a8b: 0x6dcb6e20, - 0x36a8c: 0x6dcb7020, 0x36a8d: 0x6dcb7220, 0x36a8e: 0x6dcb7420, 0x36a8f: 0x6dcb7620, - 0x36a90: 0x6dcb7820, 0x36a91: 0x6dcb7a20, 0x36a92: 0x6dcb7c20, 0x36a93: 0x6dcb7e20, - 0x36a94: 0x6dcb8020, 0x36a95: 0x6de6a420, 0x36a96: 0x6de6a620, 0x36a97: 0x6de6a820, - 0x36a98: 0x6de6aa20, 0x36a99: 0x6de6ac20, 0x36a9a: 0x6de6ae20, 0x36a9b: 0x6de6b020, - 0x36a9c: 0x6de6b220, 0x36a9d: 0x6de6b420, 0x36a9e: 0x6de6b620, 0x36a9f: 0x6de6b820, - 0x36aa0: 0x6de6ba20, 0x36aa1: 0x6de6bc20, 0x36aa2: 0x6de6be20, 0x36aa3: 0x6de6c020, - 0x36aa4: 0x6de6c220, 0x36aa5: 0x6de6c420, 0x36aa6: 0x6de6c620, 0x36aa7: 0x6de6c820, - 0x36aa8: 0x6de6ca20, 0x36aa9: 0x6de6cc20, 0x36aaa: 0x6de6ce20, 0x36aab: 0x6de6d020, - 0x36aac: 0x6de6d220, 0x36aad: 0x6de6d420, 0x36aae: 0x6de6d620, 0x36aaf: 0x6de6d820, - 0x36ab0: 0x6dfd5220, 0x36ab1: 0x6dfd5420, 0x36ab2: 0x6dfd5620, 0x36ab3: 0x6dfd5820, - 0x36ab4: 0x6dfd5a20, 0x36ab5: 0x6dfd5c20, 0x36ab6: 0x6dfd5e20, 0x36ab7: 0x6dfd6020, - 0x36ab8: 0x6dfd6220, 0x36ab9: 0x6dfd6420, 0x36aba: 0x6dfd6620, 0x36abb: 0x6dfd6820, - 0x36abc: 0x6dfd6a20, 0x36abd: 0x6dfd6c20, 0x36abe: 0x6dfd6e20, 0x36abf: 0x6dfd7020, - // Block 0xdab, offset 0x36ac0 - 0x36ac0: 0x6e102e20, 0x36ac1: 0x6e103020, 0x36ac2: 0x6e103220, 0x36ac3: 0x6e103420, - 0x36ac4: 0x6e103620, 0x36ac5: 0x6e103820, 0x36ac6: 0x6e103a20, 0x36ac7: 0x6e103c20, - 0x36ac8: 0x6e103e20, 0x36ac9: 0x6e104020, 0x36aca: 0x6e104220, 0x36acb: 0x6e1ef020, - 0x36acc: 0x6e1ef220, 0x36acd: 0x6e1ef420, 0x36ace: 0x6e1ef620, 0x36acf: 0x6e1ef820, - 0x36ad0: 0x6e2a4e20, 0x36ad1: 0x6e2a5020, 0x36ad2: 0x6e2a5220, 0x36ad3: 0x6e2a5420, - 0x36ad4: 0x6e2a5620, 0x36ad5: 0x6e2a5820, 0x36ad6: 0x6e2a5a20, 0x36ad7: 0x6e2a5c20, - 0x36ad8: 0x6e32f620, 0x36ad9: 0x6e32f820, 0x36ada: 0x6e32fa20, 0x36adb: 0x6e32fc20, - 0x36adc: 0x6e392a20, 0x36add: 0x6e392c20, 0x36ade: 0x6e392e20, 0x36adf: 0x6e3d8220, - 0x36ae0: 0x6e3d8420, 0x36ae1: 0x6e3d8620, 0x36ae2: 0x6e408220, 0x36ae3: 0x6e42cc20, - 0x36ae4: 0x6e443a20, 0x36ae5: 0x6c24f420, 0x36ae6: 0x6c24f620, 0x36ae7: 0x6c590820, - 0x36ae8: 0x6c590a20, 0x36ae9: 0x6c7ba420, 0x36aea: 0x6c7ba620, 0x36aeb: 0x6c7ba820, - 0x36aec: 0x6ca48620, 0x36aed: 0x6ca48820, 0x36aee: 0x6ca48a20, 0x36aef: 0x6cd2bc20, - 0x36af0: 0x6cd2be20, 0x36af1: 0x6cd2c020, 0x36af2: 0x6cd2c220, 0x36af3: 0x6d00b420, - 0x36af4: 0x6d00b620, 0x36af5: 0x6d00b820, 0x36af6: 0x6d2ea620, 0x36af7: 0x6d5bd820, - 0x36af8: 0x6d5bda20, 0x36af9: 0x6d864c20, 0x36afa: 0x6d864e20, 0x36afb: 0x6dfd7220, - 0x36afc: 0x6d865020, 0x36afd: 0x6c13e420, 0x36afe: 0x6c13e620, 0x36aff: 0x6c250220, - // Block 0xdac, offset 0x36b00 - 0x36b00: 0x6c250420, 0x36b01: 0x6c250620, 0x36b02: 0x6c3c4820, 0x36b03: 0x6c3c4a20, - 0x36b04: 0x6c3c4c20, 0x36b05: 0x6c3c4e20, 0x36b06: 0x6c3c5020, 0x36b07: 0x6c3c5220, - 0x36b08: 0x6c591620, 0x36b09: 0x6c591820, 0x36b0a: 0x6c591a20, 0x36b0b: 0x6c591c20, - 0x36b0c: 0x6c591e20, 0x36b0d: 0x6c592020, 0x36b0e: 0x6c592220, 0x36b0f: 0x6c592420, - 0x36b10: 0x6c592620, 0x36b11: 0x6c592820, 0x36b12: 0x6c592a20, 0x36b13: 0x6c592c20, - 0x36b14: 0x6c592e20, 0x36b15: 0x6c593020, 0x36b16: 0x6c593220, 0x36b17: 0x6c593420, - 0x36b18: 0x6c7bb620, 0x36b19: 0x6c7bb820, 0x36b1a: 0x6c7bba20, 0x36b1b: 0x6c7bbc20, - 0x36b1c: 0x6c7bbe20, 0x36b1d: 0x6c7bc020, 0x36b1e: 0x6c7bc220, 0x36b1f: 0x6c7bc420, - 0x36b20: 0x6c7bc620, 0x36b21: 0x6c7bc820, 0x36b22: 0x6c7bca20, 0x36b23: 0x6c7bcc20, - 0x36b24: 0x6c7bce20, 0x36b25: 0x6ca49a20, 0x36b26: 0x6ca49c20, 0x36b27: 0x6ca49e20, - 0x36b28: 0x6ca4a020, 0x36b29: 0x6ca4a220, 0x36b2a: 0x6ca4a420, 0x36b2b: 0x6ca4a620, - 0x36b2c: 0x6cd2d020, 0x36b2d: 0x6cd2d220, 0x36b2e: 0x6cd2d420, 0x36b2f: 0x6cd2d620, - 0x36b30: 0x6cd2d820, 0x36b31: 0x6cd2da20, 0x36b32: 0x6cd2dc20, 0x36b33: 0x6cd2de20, - 0x36b34: 0x6cd2e020, 0x36b35: 0x6cd2e220, 0x36b36: 0x6cd2e420, 0x36b37: 0x6cd2e620, - 0x36b38: 0x6cd2e820, 0x36b39: 0x6d00c220, 0x36b3a: 0x6d00c420, 0x36b3b: 0x6d00c620, - 0x36b3c: 0x6d00c820, 0x36b3d: 0x6d00ca20, 0x36b3e: 0x6d00cc20, 0x36b3f: 0x6d00ce20, - // Block 0xdad, offset 0x36b40 - 0x36b40: 0x6d00d020, 0x36b41: 0x6d00d220, 0x36b42: 0x6d00d420, 0x36b43: 0x6d00d620, - 0x36b44: 0x6d00d820, 0x36b45: 0x6d00da20, 0x36b46: 0x6d00dc20, 0x36b47: 0x6d00de20, - 0x36b48: 0x6d2eac20, 0x36b49: 0x6d2eae20, 0x36b4a: 0x6d2eb020, 0x36b4b: 0x6d2eb220, - 0x36b4c: 0x6d2eb420, 0x36b4d: 0x6d2eb620, 0x36b4e: 0x6d2eb820, 0x36b4f: 0x6d2eba20, - 0x36b50: 0x6d2ebc20, 0x36b51: 0x6d2ebe20, 0x36b52: 0x6d2ec020, 0x36b53: 0x6d2ec220, - 0x36b54: 0x6d5be820, 0x36b55: 0x6d5bea20, 0x36b56: 0x6d5bec20, 0x36b57: 0x6d5bee20, - 0x36b58: 0x6d5bf020, 0x36b59: 0x6d5bf220, 0x36b5a: 0x6d5bf420, 0x36b5b: 0x6d865a20, - 0x36b5c: 0x6d865c20, 0x36b5d: 0x6d865e20, 0x36b5e: 0x6d866020, 0x36b5f: 0x6d866220, - 0x36b60: 0x6dab0820, 0x36b61: 0x6dab0a20, 0x36b62: 0x6dab0c20, 0x36b63: 0x6dab0e20, - 0x36b64: 0x6dab1020, 0x36b65: 0x6dab1220, 0x36b66: 0x6dab1420, 0x36b67: 0x6dcb8a20, - 0x36b68: 0x6dcb8c20, 0x36b69: 0x6dcb8e20, 0x36b6a: 0x6dcb9020, 0x36b6b: 0x6de6e020, - 0x36b6c: 0x6de6e220, 0x36b6d: 0x6de6e420, 0x36b6e: 0x6de6e620, 0x36b6f: 0x6de6e820, - 0x36b70: 0x6de6ea20, 0x36b71: 0x6de6ec20, 0x36b72: 0x6de6ee20, 0x36b73: 0x6de6f020, - 0x36b74: 0x6dfd7820, 0x36b75: 0x6dfd7a20, 0x36b76: 0x6dfd7c20, 0x36b77: 0x6dfd7e20, - 0x36b78: 0x6e104820, 0x36b79: 0x6e104a20, 0x36b7a: 0x6e104c20, 0x36b7b: 0x6e1efa20, - 0x36b7c: 0x6e1efc20, 0x36b7d: 0x6e1efe20, 0x36b7e: 0x6e2a5e20, 0x36b7f: 0x6e2a6020, - // Block 0xdae, offset 0x36b80 - 0x36b80: 0x6e32fe20, 0x36b81: 0x6e330020, 0x36b82: 0x6e330220, 0x36b83: 0x6e330420, - 0x36b84: 0x6e393220, 0x36b85: 0x6e443c20, 0x36b86: 0x6c250820, 0x36b87: 0x6c250a20, - 0x36b88: 0x6c3c5820, 0x36b89: 0x6c3c5a20, 0x36b8a: 0x6c3c5c20, 0x36b8b: 0x6c3c5e20, - 0x36b8c: 0x6c3c6020, 0x36b8d: 0x6c3c6220, 0x36b8e: 0x6c593e20, 0x36b8f: 0x6c594020, - 0x36b90: 0x6c594220, 0x36b91: 0x6c594420, 0x36b92: 0x6c594620, 0x36b93: 0x6c594820, - 0x36b94: 0x6c594a20, 0x36b95: 0x6c7bdc20, 0x36b96: 0x6c7bde20, 0x36b97: 0x6c7be020, - 0x36b98: 0x6c7be220, 0x36b99: 0x6c7be420, 0x36b9a: 0x6c7be620, 0x36b9b: 0x6c7be820, - 0x36b9c: 0x6c7bea20, 0x36b9d: 0x6c7bec20, 0x36b9e: 0x6c7bee20, 0x36b9f: 0x6ca4ae20, - 0x36ba0: 0x6ca4b020, 0x36ba1: 0x6ca4b220, 0x36ba2: 0x6ca4b420, 0x36ba3: 0x6ca4b620, - 0x36ba4: 0x6ca4b820, 0x36ba5: 0x6ca4ba20, 0x36ba6: 0x6ca4bc20, 0x36ba7: 0x6cd2f420, - 0x36ba8: 0x6cd2f620, 0x36ba9: 0x6cd2f820, 0x36baa: 0x6cd2fa20, 0x36bab: 0x6cd2fc20, - 0x36bac: 0x6cd2fe20, 0x36bad: 0x6cd30020, 0x36bae: 0x6cd30220, 0x36baf: 0x6d00ec20, - 0x36bb0: 0x6cd30420, 0x36bb1: 0x6cd30620, 0x36bb2: 0x6cd30820, 0x36bb3: 0x6d00ee20, - 0x36bb4: 0x6d00f020, 0x36bb5: 0x6d00f220, 0x36bb6: 0x6d00f420, 0x36bb7: 0x6d00f620, - 0x36bb8: 0x6d00f820, 0x36bb9: 0x6d00fa20, 0x36bba: 0x6d00fc20, 0x36bbb: 0x6d00fe20, - 0x36bbc: 0x6d010020, 0x36bbd: 0x6d010220, 0x36bbe: 0x6d010420, 0x36bbf: 0x6d010620, - // Block 0xdaf, offset 0x36bc0 - 0x36bc0: 0x6d2ed420, 0x36bc1: 0x6d2ed620, 0x36bc2: 0x6d2ed820, 0x36bc3: 0x6d2eda20, - 0x36bc4: 0x6d2edc20, 0x36bc5: 0x6d2ede20, 0x36bc6: 0x6d2ee020, 0x36bc7: 0x6d2ee220, - 0x36bc8: 0x6d2ee420, 0x36bc9: 0x6d2ee620, 0x36bca: 0x6d2ee820, 0x36bcb: 0x6d2eea20, - 0x36bcc: 0x6d2eec20, 0x36bcd: 0x6d5bfe20, 0x36bce: 0x6d5c0020, 0x36bcf: 0x6d5c0220, - 0x36bd0: 0x6d5c0420, 0x36bd1: 0x6d5c0620, 0x36bd2: 0x6d5c0820, 0x36bd3: 0x6d5c0a20, - 0x36bd4: 0x6d866820, 0x36bd5: 0x6d866a20, 0x36bd6: 0x6d866c20, 0x36bd7: 0x6d866e20, - 0x36bd8: 0x6d867020, 0x36bd9: 0x6d867220, 0x36bda: 0x6d867420, 0x36bdb: 0x6d867620, - 0x36bdc: 0x6d867820, 0x36bdd: 0x6d867a20, 0x36bde: 0x6d867c20, 0x36bdf: 0x6dab1820, - 0x36be0: 0x6dab1a20, 0x36be1: 0x6dab1c20, 0x36be2: 0x6dcb9620, 0x36be3: 0x6dcb9820, - 0x36be4: 0x6dcb9a20, 0x36be5: 0x6dcb9c20, 0x36be6: 0x6dcb9e20, 0x36be7: 0x6dcba020, - 0x36be8: 0x6dcba220, 0x36be9: 0x6dcba420, 0x36bea: 0x6dcba620, 0x36beb: 0x6de6f220, - 0x36bec: 0x6de6f420, 0x36bed: 0x6de6f620, 0x36bee: 0x6de6f820, 0x36bef: 0x6dfd8420, - 0x36bf0: 0x6dfd8620, 0x36bf1: 0x6dfd8820, 0x36bf2: 0x6dfd8a20, 0x36bf3: 0x6dfd8c20, - 0x36bf4: 0x6e105020, 0x36bf5: 0x6e105220, 0x36bf6: 0x6e1f0220, 0x36bf7: 0x6e1f0420, - 0x36bf8: 0x6e1f0620, 0x36bf9: 0x6e330620, 0x36bfa: 0x6e330820, 0x36bfb: 0x6e3c7e20, - 0x36bfc: 0x6e3fda20, 0x36bfd: 0x6e450420, 0x36bfe: 0x6e46a420, 0x36bff: 0x6c251020, - // Block 0xdb0, offset 0x36c00 - 0x36c00: 0x6c251220, 0x36c01: 0x6c3c6a20, 0x36c02: 0x6c3c6c20, 0x36c03: 0x6c3c6e20, - 0x36c04: 0x6c3c7020, 0x36c05: 0x6c3c7220, 0x36c06: 0x6c595e20, 0x36c07: 0x6c596020, - 0x36c08: 0x6c596220, 0x36c09: 0x6c596420, 0x36c0a: 0x6c596620, 0x36c0b: 0x6c596820, - 0x36c0c: 0x6c596a20, 0x36c0d: 0x6c596c20, 0x36c0e: 0x6c7c0820, 0x36c0f: 0x6c7c0a20, - 0x36c10: 0x6c7c0c20, 0x36c11: 0x6c7c0e20, 0x36c12: 0x6c7c1020, 0x36c13: 0x6c7c1220, - 0x36c14: 0x6c7c1420, 0x36c15: 0x6c7c1620, 0x36c16: 0x6c7c1820, 0x36c17: 0x6c7c1a20, - 0x36c18: 0x6c7c1c20, 0x36c19: 0x6c7c1e20, 0x36c1a: 0x6c7c2020, 0x36c1b: 0x6c7c2220, - 0x36c1c: 0x6c7c2420, 0x36c1d: 0x6c7c2620, 0x36c1e: 0x6ca4d220, 0x36c1f: 0x6ca4d420, - 0x36c20: 0x6ca4d620, 0x36c21: 0x6ca4d820, 0x36c22: 0x6ca4da20, 0x36c23: 0x6ca4dc20, - 0x36c24: 0x6ca4de20, 0x36c25: 0x6ca4e020, 0x36c26: 0x6ca4e220, 0x36c27: 0x6ca4e420, - 0x36c28: 0x6ca4e620, 0x36c29: 0x6ca4e820, 0x36c2a: 0x6ca4ea20, 0x36c2b: 0x6c7c2820, - 0x36c2c: 0x6cd31220, 0x36c2d: 0x6cd31420, 0x36c2e: 0x6cd31620, 0x36c2f: 0x6cd31820, - 0x36c30: 0x6cd31a20, 0x36c31: 0x6cd31c20, 0x36c32: 0x6cd31e20, 0x36c33: 0x6cd32020, - 0x36c34: 0x6cd32220, 0x36c35: 0x6cd32420, 0x36c36: 0x6cd32620, 0x36c37: 0x6d011220, - 0x36c38: 0x6d011420, 0x36c39: 0x6d011620, 0x36c3a: 0x6d011820, 0x36c3b: 0x6d011a20, - 0x36c3c: 0x6d011c20, 0x36c3d: 0x6d011e20, 0x36c3e: 0x6d012020, 0x36c3f: 0x6d012220, - // Block 0xdb1, offset 0x36c40 - 0x36c40: 0x6d012420, 0x36c41: 0x6d012620, 0x36c42: 0x6d012820, 0x36c43: 0x6d2efc20, - 0x36c44: 0x6d2efe20, 0x36c45: 0x6d2f0020, 0x36c46: 0x6d2f0220, 0x36c47: 0x6d5c0e20, - 0x36c48: 0x6d5c1020, 0x36c49: 0x6d5c1220, 0x36c4a: 0x6d5c1420, 0x36c4b: 0x6d5c1620, - 0x36c4c: 0x6d5c1820, 0x36c4d: 0x6d5c1a20, 0x36c4e: 0x6d5c1c20, 0x36c4f: 0x6d5c1e20, - 0x36c50: 0x6d5c2020, 0x36c51: 0x6d5c2220, 0x36c52: 0x6d5c2420, 0x36c53: 0x6d868820, - 0x36c54: 0x6d868a20, 0x36c55: 0x6d868c20, 0x36c56: 0x6d868e20, 0x36c57: 0x6d869020, - 0x36c58: 0x6d869220, 0x36c59: 0x6d869420, 0x36c5a: 0x6d869620, 0x36c5b: 0x6d869820, - 0x36c5c: 0x6d869a20, 0x36c5d: 0x6d869c20, 0x36c5e: 0x6d869e20, 0x36c5f: 0x6d86a020, - 0x36c60: 0x6d86a220, 0x36c61: 0x6d86a420, 0x36c62: 0x6d86a620, 0x36c63: 0x6d86a820, - 0x36c64: 0x6d86aa20, 0x36c65: 0x6dab2620, 0x36c66: 0x6dab2820, 0x36c67: 0x6dab2a20, - 0x36c68: 0x6dab2c20, 0x36c69: 0x6dab2e20, 0x36c6a: 0x6dab3020, 0x36c6b: 0x6dab3220, - 0x36c6c: 0x6dab3420, 0x36c6d: 0x6dab3620, 0x36c6e: 0x6dab3820, 0x36c6f: 0x6dab3a20, - 0x36c70: 0x6dab3c20, 0x36c71: 0x6dab3e20, 0x36c72: 0x6dab4020, 0x36c73: 0x6da02a20, - 0x36c74: 0x6dab4220, 0x36c75: 0x6dab4420, 0x36c76: 0x6dab4620, 0x36c77: 0x6dab4820, - 0x36c78: 0x6dcbac20, 0x36c79: 0x6dcbae20, 0x36c7a: 0x6dcbb020, 0x36c7b: 0x6de6fc20, - 0x36c7c: 0x6dcbb220, 0x36c7d: 0x6dcbb420, 0x36c7e: 0x6dcbb620, 0x36c7f: 0x6dcbb820, - // Block 0xdb2, offset 0x36c80 - 0x36c80: 0x6dcbba20, 0x36c81: 0x6de6fe20, 0x36c82: 0x6de70020, 0x36c83: 0x6de70220, - 0x36c84: 0x6de70420, 0x36c85: 0x6de70620, 0x36c86: 0x6de70820, 0x36c87: 0x6dfd9020, - 0x36c88: 0x6dfd9220, 0x36c89: 0x6dfd9420, 0x36c8a: 0x6dfd9620, 0x36c8b: 0x6dfd9820, - 0x36c8c: 0x6dfd9a20, 0x36c8d: 0x6dfd9c20, 0x36c8e: 0x6dfd9e20, 0x36c8f: 0x6dfda020, - 0x36c90: 0x6dfda220, 0x36c91: 0x6dfda420, 0x36c92: 0x6e105620, 0x36c93: 0x6e1f0a20, - 0x36c94: 0x6e1f0c20, 0x36c95: 0x6e1f0e20, 0x36c96: 0x6e1f1020, 0x36c97: 0x6e1f1220, - 0x36c98: 0x6e2a6220, 0x36c99: 0x6e2a6420, 0x36c9a: 0x6e330a20, 0x36c9b: 0x6e330c20, - 0x36c9c: 0x6e330e20, 0x36c9d: 0x6e331020, 0x36c9e: 0x6e2a6620, 0x36c9f: 0x6e393420, - 0x36ca0: 0x6e393620, 0x36ca1: 0x6e3d8820, 0x36ca2: 0x6e452c20, 0x36ca3: 0x6e468820, - 0x36ca4: 0x6c13e820, 0x36ca5: 0x6c13ea20, 0x36ca6: 0x6c251a20, 0x36ca7: 0x6c251c20, - 0x36ca8: 0x6c251e20, 0x36ca9: 0x6c252020, 0x36caa: 0x6c252220, 0x36cab: 0x6c252420, - 0x36cac: 0x6c252620, 0x36cad: 0x6c252820, 0x36cae: 0x6c252a20, 0x36caf: 0x6c252c20, - 0x36cb0: 0x6c252e20, 0x36cb1: 0x6c253020, 0x36cb2: 0x6c3c8c20, 0x36cb3: 0x6c3c8e20, - 0x36cb4: 0x6c3c9020, 0x36cb5: 0x6c3c9220, 0x36cb6: 0x6c3c9420, 0x36cb7: 0x6c3c9620, - 0x36cb8: 0x6c3c9820, 0x36cb9: 0x6c3c9a20, 0x36cba: 0x6c3c9c20, 0x36cbb: 0x6c3c9e20, - 0x36cbc: 0x6c3ca020, 0x36cbd: 0x6c3ca220, 0x36cbe: 0x6c3ca420, 0x36cbf: 0x6c3ca620, - // Block 0xdb3, offset 0x36cc0 - 0x36cc0: 0x6c3ca820, 0x36cc1: 0x6c3caa20, 0x36cc2: 0x6c3cac20, 0x36cc3: 0x6c59b820, - 0x36cc4: 0x6c59ba20, 0x36cc5: 0x6c59bc20, 0x36cc6: 0x6c59be20, 0x36cc7: 0x6c59c020, - 0x36cc8: 0x6c59c220, 0x36cc9: 0x6c59c420, 0x36cca: 0x6c59c620, 0x36ccb: 0x6c59c820, - 0x36ccc: 0x6c59ca20, 0x36ccd: 0x6c59cc20, 0x36cce: 0x6c59ce20, 0x36ccf: 0x6c59d020, - 0x36cd0: 0x6c59d220, 0x36cd1: 0x6c59d420, 0x36cd2: 0x6c59d620, 0x36cd3: 0x6c59d820, - 0x36cd4: 0x6c59da20, 0x36cd5: 0x6c59dc20, 0x36cd6: 0x6c59de20, 0x36cd7: 0x6c59e020, - 0x36cd8: 0x6c59e220, 0x36cd9: 0x6c59e420, 0x36cda: 0x6c59e620, 0x36cdb: 0x6c59e820, - 0x36cdc: 0x6c59ea20, 0x36cdd: 0x6c59ec20, 0x36cde: 0x6c59ee20, 0x36cdf: 0x6c59f020, - 0x36ce0: 0x6c59f220, 0x36ce1: 0x6c59f420, 0x36ce2: 0x6c59f620, 0x36ce3: 0x6c59f820, - 0x36ce4: 0x6c59fa20, 0x36ce5: 0x6c59fc20, 0x36ce6: 0x6c59fe20, 0x36ce7: 0x6c5a0020, - 0x36ce8: 0x6c5a0220, 0x36ce9: 0x6c5a0420, 0x36cea: 0x6c5a0620, 0x36ceb: 0x6c5a0820, - 0x36cec: 0x6c5a0a20, 0x36ced: 0x6c5a0c20, 0x36cee: 0x6c5a0e20, 0x36cef: 0x6c5a1020, - 0x36cf0: 0x6c5a1220, 0x36cf1: 0x6c7c7a20, 0x36cf2: 0x6c7c7c20, 0x36cf3: 0x6c7c7e20, - 0x36cf4: 0x6c7c8020, 0x36cf5: 0x6c7c8220, 0x36cf6: 0x6c7c8420, 0x36cf7: 0x6c7c8620, - 0x36cf8: 0x6c7c8820, 0x36cf9: 0x6c7c8a20, 0x36cfa: 0x6c7c8c20, 0x36cfb: 0x6c7c8e20, - 0x36cfc: 0x6c7c9020, 0x36cfd: 0x6c7c9220, 0x36cfe: 0x6c7c9420, 0x36cff: 0x6c7c9620, - // Block 0xdb4, offset 0x36d00 - 0x36d00: 0x6c7c9820, 0x36d01: 0x6c7c9a20, 0x36d02: 0x6c7c9c20, 0x36d03: 0x6c7c9e20, - 0x36d04: 0x6c7ca020, 0x36d05: 0x6c7ca220, 0x36d06: 0x6c7ca420, 0x36d07: 0x6c7ca620, - 0x36d08: 0x6c7ca820, 0x36d09: 0x6c7caa20, 0x36d0a: 0x6c7cac20, 0x36d0b: 0x6c7cae20, - 0x36d0c: 0x6c7cb020, 0x36d0d: 0x6c7cb220, 0x36d0e: 0x6c7cb420, 0x36d0f: 0x6c7cb620, - 0x36d10: 0x6c7cb820, 0x36d11: 0x6c7cba20, 0x36d12: 0x6c7cbc20, 0x36d13: 0x6c7cbe20, - 0x36d14: 0x6c7cc020, 0x36d15: 0x6c7cc220, 0x36d16: 0x6c7cc420, 0x36d17: 0x6c7cc620, - 0x36d18: 0x6c7cc820, 0x36d19: 0x6c7cca20, 0x36d1a: 0x6ca52a20, 0x36d1b: 0x6ca52c20, - 0x36d1c: 0x6ca52e20, 0x36d1d: 0x6ca53020, 0x36d1e: 0x6ca53220, 0x36d1f: 0x6ca53420, - 0x36d20: 0x6ca53620, 0x36d21: 0x6ca53820, 0x36d22: 0x6ca53a20, 0x36d23: 0x6ca53c20, - 0x36d24: 0x6ca53e20, 0x36d25: 0x6ca54020, 0x36d26: 0x6ca54220, 0x36d27: 0x6ca54420, - 0x36d28: 0x6ca54620, 0x36d29: 0x6ca54820, 0x36d2a: 0x6ca54a20, 0x36d2b: 0x6ca54c20, - 0x36d2c: 0x6ca54e20, 0x36d2d: 0x6ca55020, 0x36d2e: 0x6ca55220, 0x36d2f: 0x6ca55420, - 0x36d30: 0x6ca55620, 0x36d31: 0x6ca55820, 0x36d32: 0x6ca55a20, 0x36d33: 0x6ca55c20, - 0x36d34: 0x6ca55e20, 0x36d35: 0x6ca56020, 0x36d36: 0x6ca56220, 0x36d37: 0x6ca56420, - 0x36d38: 0x6ca56620, 0x36d39: 0x6ca56820, 0x36d3a: 0x6ca56a20, 0x36d3b: 0x6ca56c20, - 0x36d3c: 0x6ca56e20, 0x36d3d: 0x6ca57020, 0x36d3e: 0x6ca57220, 0x36d3f: 0x6ca57420, - // Block 0xdb5, offset 0x36d40 - 0x36d40: 0x6ca57620, 0x36d41: 0x6ca57820, 0x36d42: 0x6ca57a20, 0x36d43: 0x6ca57c20, - 0x36d44: 0x6ca57e20, 0x36d45: 0x6ca58020, 0x36d46: 0x6ca58220, 0x36d47: 0x6ca58420, - 0x36d48: 0x6ca58620, 0x36d49: 0x6ca58820, 0x36d4a: 0x6cd37220, 0x36d4b: 0x6cd37420, - 0x36d4c: 0x6cd37620, 0x36d4d: 0x6cd37820, 0x36d4e: 0x6cd37a20, 0x36d4f: 0x6cd37c20, - 0x36d50: 0x6cd37e20, 0x36d51: 0x6cd38020, 0x36d52: 0x6cd38220, 0x36d53: 0x6cd38420, - 0x36d54: 0x6cd38620, 0x36d55: 0x6cd38820, 0x36d56: 0x6cd38a20, 0x36d57: 0x6cd38c20, - 0x36d58: 0x6cd38e20, 0x36d59: 0x6cd39020, 0x36d5a: 0x6cd39220, 0x36d5b: 0x6cd39420, - 0x36d5c: 0x6cd39620, 0x36d5d: 0x6cd39820, 0x36d5e: 0x6cd39a20, 0x36d5f: 0x6cd39c20, - 0x36d60: 0x6cd39e20, 0x36d61: 0x6cd3a020, 0x36d62: 0x6cd3a220, 0x36d63: 0x6cd3a420, - 0x36d64: 0x6cd3a620, 0x36d65: 0x6cd3a820, 0x36d66: 0x6cd3aa20, 0x36d67: 0x6cd3ac20, - 0x36d68: 0x6cd3ae20, 0x36d69: 0x6cd3b020, 0x36d6a: 0x6cd3b220, 0x36d6b: 0x6cd3b420, - 0x36d6c: 0x6cd3b620, 0x36d6d: 0x6cd3b820, 0x36d6e: 0x6cd3ba20, 0x36d6f: 0x6cd3bc20, - 0x36d70: 0x6cd3be20, 0x36d71: 0x6cd3c020, 0x36d72: 0x6cd3c220, 0x36d73: 0x6cd3c420, - 0x36d74: 0x6cd3c620, 0x36d75: 0x6cd3c820, 0x36d76: 0x6cd3ca20, 0x36d77: 0x6cd3cc20, - 0x36d78: 0x6cd3ce20, 0x36d79: 0x6cd3d020, 0x36d7a: 0x6cd3d220, 0x36d7b: 0x6cd3d420, - 0x36d7c: 0x6cd3d620, 0x36d7d: 0x6cd3d820, 0x36d7e: 0x6cd3da20, 0x36d7f: 0x6cd3dc20, - // Block 0xdb6, offset 0x36d80 - 0x36d80: 0x6cd3de20, 0x36d81: 0x6cd3e020, 0x36d82: 0x6cd3e220, 0x36d83: 0x6cd3e420, - 0x36d84: 0x6cd3e620, 0x36d85: 0x6d017e20, 0x36d86: 0x6cd3e820, 0x36d87: 0x6cd3ea20, - 0x36d88: 0x6cd3ec20, 0x36d89: 0x6d018020, 0x36d8a: 0x6d018220, 0x36d8b: 0x6d018420, - 0x36d8c: 0x6d018620, 0x36d8d: 0x6d018820, 0x36d8e: 0x6d018a20, 0x36d8f: 0x6d018c20, - 0x36d90: 0x6d018e20, 0x36d91: 0x6d019020, 0x36d92: 0x6d019220, 0x36d93: 0x6d019420, - 0x36d94: 0x6d019620, 0x36d95: 0x6d019820, 0x36d96: 0x6d019a20, 0x36d97: 0x6d019c20, - 0x36d98: 0x6d019e20, 0x36d99: 0x6d01a020, 0x36d9a: 0x6d01a220, 0x36d9b: 0x6d01a420, - 0x36d9c: 0x6d01a620, 0x36d9d: 0x6d01a820, 0x36d9e: 0x6d01aa20, 0x36d9f: 0x6d01ac20, - 0x36da0: 0x6d01ae20, 0x36da1: 0x6d01b020, 0x36da2: 0x6d01b220, 0x36da3: 0x6d01b420, - 0x36da4: 0x6d01b620, 0x36da5: 0x6d01b820, 0x36da6: 0x6d01ba20, 0x36da7: 0x6d01bc20, - 0x36da8: 0x6d01be20, 0x36da9: 0x6d01c020, 0x36daa: 0x6d01c220, 0x36dab: 0x6cd3ee20, - 0x36dac: 0x6d01c420, 0x36dad: 0x6d01c620, 0x36dae: 0x6d01c820, 0x36daf: 0x6d01ca20, - 0x36db0: 0x6d01cc20, 0x36db1: 0x6d01ce20, 0x36db2: 0x6d01d020, 0x36db3: 0x6d01d220, - 0x36db4: 0x6cf5b420, 0x36db5: 0x6d01d420, 0x36db6: 0x6d01d620, 0x36db7: 0x6d01d820, - 0x36db8: 0x6d01da20, 0x36db9: 0x6d01dc20, 0x36dba: 0x6d01de20, 0x36dbb: 0x6d01e020, - 0x36dbc: 0x6d01e220, 0x36dbd: 0x6d01e420, 0x36dbe: 0x6d01e620, 0x36dbf: 0x6d01e820, - // Block 0xdb7, offset 0x36dc0 - 0x36dc0: 0x6d01ea20, 0x36dc1: 0x6d01ec20, 0x36dc2: 0x6d2f5220, 0x36dc3: 0x6d2f5420, - 0x36dc4: 0x6d2f5620, 0x36dc5: 0x6d2f5820, 0x36dc6: 0x6d2f5a20, 0x36dc7: 0x6d2f5c20, - 0x36dc8: 0x6d2f5e20, 0x36dc9: 0x6d2f6020, 0x36dca: 0x6d2f6220, 0x36dcb: 0x6d2f6420, - 0x36dcc: 0x6d2f6620, 0x36dcd: 0x6d2f6820, 0x36dce: 0x6d2f6a20, 0x36dcf: 0x6d2f6c20, - 0x36dd0: 0x6d2f6e20, 0x36dd1: 0x6d2f7020, 0x36dd2: 0x6d2f7220, 0x36dd3: 0x6d2f7420, - 0x36dd4: 0x6d2f7620, 0x36dd5: 0x6d2f7820, 0x36dd6: 0x6d2f7a20, 0x36dd7: 0x6d2f7c20, - 0x36dd8: 0x6d2f7e20, 0x36dd9: 0x6d2f8020, 0x36dda: 0x6d2f8220, 0x36ddb: 0x6d2f8420, - 0x36ddc: 0x6d2f8620, 0x36ddd: 0x6d2f8820, 0x36dde: 0x6d2f8a20, 0x36ddf: 0x6d2f8c20, - 0x36de0: 0x6d2f8e20, 0x36de1: 0x6d2f9020, 0x36de2: 0x6d2f9220, 0x36de3: 0x6d2f9420, - 0x36de4: 0x6d2f9620, 0x36de5: 0x6d2f9820, 0x36de6: 0x6d2f9a20, 0x36de7: 0x6d2f9c20, - 0x36de8: 0x6d2f9e20, 0x36de9: 0x6d2fa020, 0x36dea: 0x6d2fa220, 0x36deb: 0x6d2fa420, - 0x36dec: 0x6d2fa620, 0x36ded: 0x6d2fa820, 0x36dee: 0x6d2faa20, 0x36def: 0x6d2fac20, - 0x36df0: 0x6d2fae20, 0x36df1: 0x6d2fb020, 0x36df2: 0x6d2fb220, 0x36df3: 0x6d2fb420, - 0x36df4: 0x6d2fb620, 0x36df5: 0x6d2fb820, 0x36df6: 0x6d2fba20, 0x36df7: 0x6d2fbc20, - 0x36df8: 0x6d2fbe20, 0x36df9: 0x6d2fc020, 0x36dfa: 0x6d2fc220, 0x36dfb: 0x6d2fc420, - 0x36dfc: 0x6d5c5820, 0x36dfd: 0x6d5c5a20, 0x36dfe: 0x6d5c5c20, 0x36dff: 0x6d5c5e20, - // Block 0xdb8, offset 0x36e00 - 0x36e00: 0x6d5c6020, 0x36e01: 0x6d5c6220, 0x36e02: 0x6d5c6420, 0x36e03: 0x6d5c6620, - 0x36e04: 0x6d5c6820, 0x36e05: 0x6d5c6a20, 0x36e06: 0x6d5c6c20, 0x36e07: 0x6d5c6e20, - 0x36e08: 0x6d5c7020, 0x36e09: 0x6d5c7220, 0x36e0a: 0x6d5c7420, 0x36e0b: 0x6d5c7620, - 0x36e0c: 0x6d5c7820, 0x36e0d: 0x6d5c7a20, 0x36e0e: 0x6d5c7c20, 0x36e0f: 0x6d5c7e20, - 0x36e10: 0x6d5c8020, 0x36e11: 0x6d5c8220, 0x36e12: 0x6d5c8420, 0x36e13: 0x6d5c8620, - 0x36e14: 0x6d5c8820, 0x36e15: 0x6d5c8a20, 0x36e16: 0x6d5c8c20, 0x36e17: 0x6d5c8e20, - 0x36e18: 0x6d5c9020, 0x36e19: 0x6d5c9220, 0x36e1a: 0x6d5c9420, 0x36e1b: 0x6d5c9620, - 0x36e1c: 0x6d5c9820, 0x36e1d: 0x6d5c9a20, 0x36e1e: 0x6d5c9c20, 0x36e1f: 0x6d5c9e20, - 0x36e20: 0x6d5ca020, 0x36e21: 0x6d5ca220, 0x36e22: 0x6d5ca420, 0x36e23: 0x6d5ca620, - 0x36e24: 0x6d5ca820, 0x36e25: 0x6d5caa20, 0x36e26: 0x6d5cac20, 0x36e27: 0x6d5cae20, - 0x36e28: 0x6d5cb020, 0x36e29: 0x6d5cb220, 0x36e2a: 0x6d5cb420, 0x36e2b: 0x6d5cb620, - 0x36e2c: 0x6d5cb820, 0x36e2d: 0x6d5cba20, 0x36e2e: 0x6d5cbc20, 0x36e2f: 0x6d5cbe20, - 0x36e30: 0x6d5cc020, 0x36e31: 0x6d5cc220, 0x36e32: 0x6d5cc420, 0x36e33: 0x6d5cc620, - 0x36e34: 0x6d86e020, 0x36e35: 0x6d86e220, 0x36e36: 0x6d86e420, 0x36e37: 0x6d86e620, - 0x36e38: 0x6d86e820, 0x36e39: 0x6d86ea20, 0x36e3a: 0x6d86ec20, 0x36e3b: 0x6d86ee20, - 0x36e3c: 0x6d86f020, 0x36e3d: 0x6d86f220, 0x36e3e: 0x6d86f420, 0x36e3f: 0x6d86f620, - // Block 0xdb9, offset 0x36e40 - 0x36e40: 0x6d86f820, 0x36e41: 0x6d86fa20, 0x36e42: 0x6d86fc20, 0x36e43: 0x6d86fe20, - 0x36e44: 0x6d870020, 0x36e45: 0x6d870220, 0x36e46: 0x6d870420, 0x36e47: 0x6d5cc820, - 0x36e48: 0x6d870620, 0x36e49: 0x6d870820, 0x36e4a: 0x6d870a20, 0x36e4b: 0x6d870c20, - 0x36e4c: 0x6d870e20, 0x36e4d: 0x6d871020, 0x36e4e: 0x6d871220, 0x36e4f: 0x6d871420, - 0x36e50: 0x6d871620, 0x36e51: 0x6d871820, 0x36e52: 0x6d871a20, 0x36e53: 0x6d871c20, - 0x36e54: 0x6d871e20, 0x36e55: 0x6d872020, 0x36e56: 0x6d872220, 0x36e57: 0x6d872420, - 0x36e58: 0x6d872620, 0x36e59: 0x6d872820, 0x36e5a: 0x6d872a20, 0x36e5b: 0x6d872c20, - 0x36e5c: 0x6d872e20, 0x36e5d: 0x6d873020, 0x36e5e: 0x6d873220, 0x36e5f: 0x6d873420, - 0x36e60: 0x6d873620, 0x36e61: 0x6d873820, 0x36e62: 0x6d873a20, 0x36e63: 0x6d873c20, - 0x36e64: 0x6d873e20, 0x36e65: 0x6d874020, 0x36e66: 0x6d874220, 0x36e67: 0x6d874420, - 0x36e68: 0x6d874620, 0x36e69: 0x6d874820, 0x36e6a: 0x6dab8620, 0x36e6b: 0x6dab8820, - 0x36e6c: 0x6dab8a20, 0x36e6d: 0x6dab8c20, 0x36e6e: 0x6dab8e20, 0x36e6f: 0x6dab9020, - 0x36e70: 0x6dab9220, 0x36e71: 0x6dab9420, 0x36e72: 0x6dab9620, 0x36e73: 0x6dab9820, - 0x36e74: 0x6dab9a20, 0x36e75: 0x6dab9c20, 0x36e76: 0x6dab9e20, 0x36e77: 0x6daba020, - 0x36e78: 0x6daba220, 0x36e79: 0x6daba420, 0x36e7a: 0x6daba620, 0x36e7b: 0x6daba820, - 0x36e7c: 0x6dabaa20, 0x36e7d: 0x6dabac20, 0x36e7e: 0x6dabae20, 0x36e7f: 0x6dabb020, - // Block 0xdba, offset 0x36e80 - 0x36e80: 0x6dabb220, 0x36e81: 0x6dabb420, 0x36e82: 0x6dabb620, 0x36e83: 0x6dabb820, - 0x36e84: 0x6dabba20, 0x36e85: 0x6dabbc20, 0x36e86: 0x6dabbe20, 0x36e87: 0x6dabc020, - 0x36e88: 0x6dabc220, 0x36e89: 0x6dabc420, 0x36e8a: 0x6dabc620, 0x36e8b: 0x6dabc820, - 0x36e8c: 0x6dabca20, 0x36e8d: 0x6dabcc20, 0x36e8e: 0x6dabce20, 0x36e8f: 0x6dabd020, - 0x36e90: 0x6dabd220, 0x36e91: 0x6dabd420, 0x36e92: 0x6dabd620, 0x36e93: 0x6dabd820, - 0x36e94: 0x6dabda20, 0x36e95: 0x6dabdc20, 0x36e96: 0x6d874a20, 0x36e97: 0x6dabde20, - 0x36e98: 0x6dcbe220, 0x36e99: 0x6dcbe420, 0x36e9a: 0x6dcbe620, 0x36e9b: 0x6dcbe820, - 0x36e9c: 0x6dcbea20, 0x36e9d: 0x6dcbec20, 0x36e9e: 0x6dcbee20, 0x36e9f: 0x6dcbf020, - 0x36ea0: 0x6dcbf220, 0x36ea1: 0x6dcbf420, 0x36ea2: 0x6dcbf620, 0x36ea3: 0x6dcbf820, - 0x36ea4: 0x6dcbfa20, 0x36ea5: 0x6dcbfc20, 0x36ea6: 0x6dcbfe20, 0x36ea7: 0x6dcc0020, - 0x36ea8: 0x6dcc0220, 0x36ea9: 0x6dcc0420, 0x36eaa: 0x6dcc0620, 0x36eab: 0x6dcc0820, - 0x36eac: 0x6dcc0a20, 0x36ead: 0x6dcc0c20, 0x36eae: 0x6dcc0e20, 0x36eaf: 0x6dcc1020, - 0x36eb0: 0x6dcc1220, 0x36eb1: 0x6dcc1420, 0x36eb2: 0x6dcc1620, 0x36eb3: 0x6dcc1820, - 0x36eb4: 0x6dcc1a20, 0x36eb5: 0x6dcc1c20, 0x36eb6: 0x6dcc1e20, 0x36eb7: 0x6dcc2020, - 0x36eb8: 0x6dcc2220, 0x36eb9: 0x6dcc2420, 0x36eba: 0x6dcc2620, 0x36ebb: 0x6dcc2820, - 0x36ebc: 0x6dcc2a20, 0x36ebd: 0x6dcc2c20, 0x36ebe: 0x6dcc2e20, 0x36ebf: 0x6de71c20, - // Block 0xdbb, offset 0x36ec0 - 0x36ec0: 0x6de71e20, 0x36ec1: 0x6de72020, 0x36ec2: 0x6de72220, 0x36ec3: 0x6de72420, - 0x36ec4: 0x6de72620, 0x36ec5: 0x6de72820, 0x36ec6: 0x6de72a20, 0x36ec7: 0x6de72c20, - 0x36ec8: 0x6de72e20, 0x36ec9: 0x6de73020, 0x36eca: 0x6de73220, 0x36ecb: 0x6de73420, - 0x36ecc: 0x6de73620, 0x36ecd: 0x6de73820, 0x36ece: 0x6de73a20, 0x36ecf: 0x6de73c20, - 0x36ed0: 0x6de73e20, 0x36ed1: 0x6de74020, 0x36ed2: 0x6de74220, 0x36ed3: 0x6de74420, - 0x36ed4: 0x6de74620, 0x36ed5: 0x6df25c20, 0x36ed6: 0x6de74820, 0x36ed7: 0x6de74a20, - 0x36ed8: 0x6de74c20, 0x36ed9: 0x6de74e20, 0x36eda: 0x6dfdb820, 0x36edb: 0x6dfdba20, - 0x36edc: 0x6dfdbc20, 0x36edd: 0x6dfdbe20, 0x36ede: 0x6dfdc020, 0x36edf: 0x6dfdc220, - 0x36ee0: 0x6dfdc420, 0x36ee1: 0x6dfdc620, 0x36ee2: 0x6dfdc820, 0x36ee3: 0x6dfdca20, - 0x36ee4: 0x6dfdcc20, 0x36ee5: 0x6dfdce20, 0x36ee6: 0x6dfdd020, 0x36ee7: 0x6dfdd220, - 0x36ee8: 0x6dfdd420, 0x36ee9: 0x6dfdd620, 0x36eea: 0x6dfdd820, 0x36eeb: 0x6dfdda20, - 0x36eec: 0x6dfddc20, 0x36eed: 0x6e106820, 0x36eee: 0x6e106a20, 0x36eef: 0x6e106c20, - 0x36ef0: 0x6e106e20, 0x36ef1: 0x6e107020, 0x36ef2: 0x6e107220, 0x36ef3: 0x6e107420, - 0x36ef4: 0x6e107620, 0x36ef5: 0x6e107820, 0x36ef6: 0x6e107a20, 0x36ef7: 0x6e107c20, - 0x36ef8: 0x6e107e20, 0x36ef9: 0x6e108020, 0x36efa: 0x6e1f1820, 0x36efb: 0x6e1f1a20, - 0x36efc: 0x6e1f1c20, 0x36efd: 0x6e1f1e20, 0x36efe: 0x6e1f2020, 0x36eff: 0x6e1f2220, - // Block 0xdbc, offset 0x36f00 - 0x36f00: 0x6e1f2420, 0x36f01: 0x6e1f2620, 0x36f02: 0x6e108220, 0x36f03: 0x6e1f2820, - 0x36f04: 0x6e21a620, 0x36f05: 0x6e1f2a20, 0x36f06: 0x6e1f2c20, 0x36f07: 0x6e1f2e20, - 0x36f08: 0x6e2a6e20, 0x36f09: 0x6e2a7020, 0x36f0a: 0x6e2a7220, 0x36f0b: 0x6e2a7420, - 0x36f0c: 0x6e2a7620, 0x36f0d: 0x6e2a7820, 0x36f0e: 0x6e2a7a20, 0x36f0f: 0x6e331820, - 0x36f10: 0x6e331a20, 0x36f11: 0x6e331c20, 0x36f12: 0x6e331e20, 0x36f13: 0x6e393e20, - 0x36f14: 0x6e3d8c20, 0x36f15: 0x6e3d8e20, 0x36f16: 0x6e3d9020, 0x36f17: 0x6e3d9220, - 0x36f18: 0x6e3d9420, 0x36f19: 0x6e408420, 0x36f1a: 0x6e408620, 0x36f1b: 0x6e42ce20, - 0x36f1c: 0x6e444220, 0x36f1d: 0x6c13ec20, 0x36f1e: 0x6c3cb420, 0x36f1f: 0x6c5a1e20, - 0x36f20: 0x6c5a2020, 0x36f21: 0x6c7cd820, 0x36f22: 0x6c7cda20, 0x36f23: 0x6c7cdc20, - 0x36f24: 0x6c7cde20, 0x36f25: 0x6c7ce020, 0x36f26: 0x6c7ce220, 0x36f27: 0x6ca59620, - 0x36f28: 0x6ca59820, 0x36f29: 0x6ca59a20, 0x36f2a: 0x6cd3f820, 0x36f2b: 0x6cd3fa20, - 0x36f2c: 0x6cd3fc20, 0x36f2d: 0x6cd3fe20, 0x36f2e: 0x6cd40020, 0x36f2f: 0x6cd40220, - 0x36f30: 0x6cd40420, 0x36f31: 0x6cd40620, 0x36f32: 0x6d01fe20, 0x36f33: 0x6d020020, - 0x36f34: 0x6d020220, 0x36f35: 0x6d020420, 0x36f36: 0x6d2fd020, 0x36f37: 0x6d2fd220, - 0x36f38: 0x6d2fd420, 0x36f39: 0x6d2fd620, 0x36f3a: 0x6d2fd820, 0x36f3b: 0x6d2fda20, - 0x36f3c: 0x6d2fdc20, 0x36f3d: 0x6d2fde20, 0x36f3e: 0x6d2fe020, 0x36f3f: 0x6d2fe220, - // Block 0xdbd, offset 0x36f40 - 0x36f40: 0x6d2fe420, 0x36f41: 0x6d2fe620, 0x36f42: 0x6d5cd220, 0x36f43: 0x6d5cd420, - 0x36f44: 0x6d5cd620, 0x36f45: 0x6d5cd820, 0x36f46: 0x6d5cda20, 0x36f47: 0x6d5cdc20, - 0x36f48: 0x6d5cde20, 0x36f49: 0x6d5ce020, 0x36f4a: 0x6d875420, 0x36f4b: 0x6d875620, - 0x36f4c: 0x6d875820, 0x36f4d: 0x6d875a20, 0x36f4e: 0x6dcc3020, 0x36f4f: 0x6dabf020, - 0x36f50: 0x6dabf220, 0x36f51: 0x6dabf420, 0x36f52: 0x6dabf620, 0x36f53: 0x6dcc3220, - 0x36f54: 0x6dcc3420, 0x36f55: 0x6dcc3620, 0x36f56: 0x6de75220, 0x36f57: 0x6de75420, - 0x36f58: 0x6de75620, 0x36f59: 0x6de75820, 0x36f5a: 0x6de75a20, 0x36f5b: 0x6de75c20, - 0x36f5c: 0x6de75e20, 0x36f5d: 0x6e108820, 0x36f5e: 0x6dfde220, 0x36f5f: 0x6dfde420, - 0x36f60: 0x6dfde620, 0x36f61: 0x6e2a7c20, 0x36f62: 0x6e2a7e20, 0x36f63: 0x6e2a8020, - 0x36f64: 0x6e46ca20, 0x36f65: 0x6e46ea20, 0x36f66: 0x6c253420, 0x36f67: 0x6c253620, - 0x36f68: 0x6c3cba20, 0x36f69: 0x6c5a2a20, 0x36f6a: 0x6c5a2c20, 0x36f6b: 0x6c5a2e20, - 0x36f6c: 0x6c5a3020, 0x36f6d: 0x6c5a3220, 0x36f6e: 0x6c5a3420, 0x36f6f: 0x6c5a3620, - 0x36f70: 0x6c7cea20, 0x36f71: 0x6c7cec20, 0x36f72: 0x6c7cee20, 0x36f73: 0x6c7cf020, - 0x36f74: 0x6c7cf220, 0x36f75: 0x6c7cf420, 0x36f76: 0x6c7cf620, 0x36f77: 0x6c7cf820, - 0x36f78: 0x6c7cfa20, 0x36f79: 0x6ca5a220, 0x36f7a: 0x6ca5a420, 0x36f7b: 0x6ca5a620, - 0x36f7c: 0x6ca5a820, 0x36f7d: 0x6ca5aa20, 0x36f7e: 0x6ca5ac20, 0x36f7f: 0x6ca5ae20, - // Block 0xdbe, offset 0x36f80 - 0x36f80: 0x6ca5b020, 0x36f81: 0x6ca5b220, 0x36f82: 0x6ca5b420, 0x36f83: 0x6ca5b620, - 0x36f84: 0x6ca5b820, 0x36f85: 0x6ca5ba20, 0x36f86: 0x6ca5bc20, 0x36f87: 0x6ca5be20, - 0x36f88: 0x6ca5c020, 0x36f89: 0x6ca5c220, 0x36f8a: 0x6ca5c420, 0x36f8b: 0x6ca5c620, - 0x36f8c: 0x6ca5c820, 0x36f8d: 0x6ca5ca20, 0x36f8e: 0x6cd41220, 0x36f8f: 0x6cd41420, - 0x36f90: 0x6cd41620, 0x36f91: 0x6cd41820, 0x36f92: 0x6cd41a20, 0x36f93: 0x6cd41c20, - 0x36f94: 0x6cd41e20, 0x36f95: 0x6cd42020, 0x36f96: 0x6cd42220, 0x36f97: 0x6cd42420, - 0x36f98: 0x6d020a20, 0x36f99: 0x6d020c20, 0x36f9a: 0x6d020e20, 0x36f9b: 0x6d021020, - 0x36f9c: 0x6d021220, 0x36f9d: 0x6d021420, 0x36f9e: 0x6d021620, 0x36f9f: 0x6d021820, - 0x36fa0: 0x6d021a20, 0x36fa1: 0x6d021c20, 0x36fa2: 0x6d021e20, 0x36fa3: 0x6d022020, - 0x36fa4: 0x6d022220, 0x36fa5: 0x6d022420, 0x36fa6: 0x6d022620, 0x36fa7: 0x6d022820, - 0x36fa8: 0x6d022a20, 0x36fa9: 0x6d022c20, 0x36faa: 0x6d2fea20, 0x36fab: 0x6d2fec20, - 0x36fac: 0x6d2fee20, 0x36fad: 0x6d2ff020, 0x36fae: 0x6d2ff220, 0x36faf: 0x6d2ff420, - 0x36fb0: 0x6d2ff620, 0x36fb1: 0x6d2ff820, 0x36fb2: 0x6d5ce220, 0x36fb3: 0x6d5ce420, - 0x36fb4: 0x6d5ce620, 0x36fb5: 0x6d5ce820, 0x36fb6: 0x6d5cea20, 0x36fb7: 0x6d5cec20, - 0x36fb8: 0x6d5cee20, 0x36fb9: 0x6d5cf020, 0x36fba: 0x6d5cf220, 0x36fbb: 0x6d875c20, - 0x36fbc: 0x6d875e20, 0x36fbd: 0x6d876020, 0x36fbe: 0x6d876220, 0x36fbf: 0x6d876420, - // Block 0xdbf, offset 0x36fc0 - 0x36fc0: 0x6dabfc20, 0x36fc1: 0x6dabfe20, 0x36fc2: 0x6dac0020, 0x36fc3: 0x6dac0220, - 0x36fc4: 0x6dac0420, 0x36fc5: 0x6dac0620, 0x36fc6: 0x6dac0820, 0x36fc7: 0x6dcc3820, - 0x36fc8: 0x6dcc3a20, 0x36fc9: 0x6dcc3c20, 0x36fca: 0x6dcc3e20, 0x36fcb: 0x6dcc4020, - 0x36fcc: 0x6de76220, 0x36fcd: 0x6de76420, 0x36fce: 0x6de76620, 0x36fcf: 0x6de76820, - 0x36fd0: 0x6e2a8220, 0x36fd1: 0x6e1f3020, 0x36fd2: 0x6e1f3220, 0x36fd3: 0x6e2a8420, - 0x36fd4: 0x6e2a8620, 0x36fd5: 0x6c13f020, 0x36fd6: 0x6c13f220, 0x36fd7: 0x6c254020, - 0x36fd8: 0x6c254220, 0x36fd9: 0x6c254420, 0x36fda: 0x6c254620, 0x36fdb: 0x6c254820, - 0x36fdc: 0x6c254a20, 0x36fdd: 0x6c3cd620, 0x36fde: 0x6c3cd820, 0x36fdf: 0x6c3cda20, - 0x36fe0: 0x6c3cdc20, 0x36fe1: 0x6c3cde20, 0x36fe2: 0x6c3ce020, 0x36fe3: 0x6c3ce220, - 0x36fe4: 0x6c3ce420, 0x36fe5: 0x6c3ce620, 0x36fe6: 0x6c3ce820, 0x36fe7: 0x6c3cea20, - 0x36fe8: 0x6c3cec20, 0x36fe9: 0x6c5a7e20, 0x36fea: 0x6c5a8020, 0x36feb: 0x6c5a8220, - 0x36fec: 0x6c5a8420, 0x36fed: 0x6c5a8620, 0x36fee: 0x6c5a8820, 0x36fef: 0x6c5a8a20, - 0x36ff0: 0x6c5a8c20, 0x36ff1: 0x6c5a8e20, 0x36ff2: 0x6c5a9020, 0x36ff3: 0x6c5a9220, - 0x36ff4: 0x6c5a9420, 0x36ff5: 0x6c5a9620, 0x36ff6: 0x6c5a9820, 0x36ff7: 0x6c5a9a20, - 0x36ff8: 0x6c5a9c20, 0x36ff9: 0x6c5a9e20, 0x36ffa: 0x6c5aa020, 0x36ffb: 0x6c5aa220, - 0x36ffc: 0x6c5aa420, 0x36ffd: 0x6c5aa620, 0x36ffe: 0x6c5aa820, 0x36fff: 0x6c5aaa20, - // Block 0xdc0, offset 0x37000 - 0x37000: 0x6c5aac20, 0x37001: 0x6c5aae20, 0x37002: 0x6c5ab020, 0x37003: 0x6c5ab220, - 0x37004: 0x6c5ab420, 0x37005: 0x6c5ab620, 0x37006: 0x6c7d5a20, 0x37007: 0x6c7d5c20, - 0x37008: 0x6c7d5e20, 0x37009: 0x6c7d6020, 0x3700a: 0x6c7d6220, 0x3700b: 0x6c7d6420, - 0x3700c: 0x6c7d6620, 0x3700d: 0x6c7d6820, 0x3700e: 0x6c7d6a20, 0x3700f: 0x6c7d6c20, - 0x37010: 0x6c7d6e20, 0x37011: 0x6c7d7020, 0x37012: 0x6c7d7220, 0x37013: 0x6c7d7420, - 0x37014: 0x6c7d7620, 0x37015: 0x6c7d7820, 0x37016: 0x6c7d7a20, 0x37017: 0x6c7d7c20, - 0x37018: 0x6c7d7e20, 0x37019: 0x6c7d8020, 0x3701a: 0x6c7d8220, 0x3701b: 0x6c7d8420, - 0x3701c: 0x6c7d8620, 0x3701d: 0x6c7d8820, 0x3701e: 0x6c7d8a20, 0x3701f: 0x6c7d8c20, - 0x37020: 0x6c7d8e20, 0x37021: 0x6c7d9020, 0x37022: 0x6c7d9220, 0x37023: 0x6c7d9420, - 0x37024: 0x6c7d9620, 0x37025: 0x6c7d9820, 0x37026: 0x6c7d9a20, 0x37027: 0x6c7d9c20, - 0x37028: 0x6c7d9e20, 0x37029: 0x6c7da020, 0x3702a: 0x6c7da220, 0x3702b: 0x6c7da420, - 0x3702c: 0x6c7da620, 0x3702d: 0x6c7da820, 0x3702e: 0x6c7daa20, 0x3702f: 0x6c7dac20, - 0x37030: 0x6c7dae20, 0x37031: 0x6c7db020, 0x37032: 0x6c7db220, 0x37033: 0x6ca61220, - 0x37034: 0x6ca61420, 0x37035: 0x6ca61620, 0x37036: 0x6ca61820, 0x37037: 0x6ca61a20, - 0x37038: 0x6ca61c20, 0x37039: 0x6ca61e20, 0x3703a: 0x6ca62020, 0x3703b: 0x6ca62220, - 0x3703c: 0x6ca62420, 0x3703d: 0x6ca62620, 0x3703e: 0x6ca62820, 0x3703f: 0x6ca62a20, - // Block 0xdc1, offset 0x37040 - 0x37040: 0x6ca62c20, 0x37041: 0x6ca62e20, 0x37042: 0x6ca63020, 0x37043: 0x6ca63220, - 0x37044: 0x6ca63420, 0x37045: 0x6ca63620, 0x37046: 0x6ca63820, 0x37047: 0x6ca63a20, - 0x37048: 0x6ca63c20, 0x37049: 0x6ca63e20, 0x3704a: 0x6ca64020, 0x3704b: 0x6ca64220, - 0x3704c: 0x6ca64420, 0x3704d: 0x6ca64620, 0x3704e: 0x6ca64820, 0x3704f: 0x6ca64a20, - 0x37050: 0x6ca64c20, 0x37051: 0x6ca64e20, 0x37052: 0x6ca65020, 0x37053: 0x6ca65220, - 0x37054: 0x6ca65420, 0x37055: 0x6ca65620, 0x37056: 0x6ca65820, 0x37057: 0x6ca65a20, - 0x37058: 0x6ca65c20, 0x37059: 0x6ca65e20, 0x3705a: 0x6ca66020, 0x3705b: 0x6ca66220, - 0x3705c: 0x6ca66420, 0x3705d: 0x6ca66620, 0x3705e: 0x6ca66820, 0x3705f: 0x6ca66a20, - 0x37060: 0x6ca66c20, 0x37061: 0x6ca66e20, 0x37062: 0x6ca67020, 0x37063: 0x6ca67220, - 0x37064: 0x6ca67420, 0x37065: 0x6ca67620, 0x37066: 0x6ca67820, 0x37067: 0x6ca67a20, - 0x37068: 0x6ca67c20, 0x37069: 0x6ca67e20, 0x3706a: 0x6cd46c20, 0x3706b: 0x6cd46e20, - 0x3706c: 0x6cd47020, 0x3706d: 0x6cd47220, 0x3706e: 0x6cd47420, 0x3706f: 0x6cd47620, - 0x37070: 0x6cd47820, 0x37071: 0x6cd47a20, 0x37072: 0x6cd47c20, 0x37073: 0x6cd47e20, - 0x37074: 0x6cd48020, 0x37075: 0x6cd48220, 0x37076: 0x6cd48420, 0x37077: 0x6cd48620, - 0x37078: 0x6cd48820, 0x37079: 0x6cd48a20, 0x3707a: 0x6cd48c20, 0x3707b: 0x6cd48e20, - 0x3707c: 0x6cd49020, 0x3707d: 0x6cd49220, 0x3707e: 0x6cd49420, 0x3707f: 0x6cd49620, - // Block 0xdc2, offset 0x37080 - 0x37080: 0x6cd49820, 0x37081: 0x6cd49a20, 0x37082: 0x6cd49c20, 0x37083: 0x6cd49e20, - 0x37084: 0x6cd4a020, 0x37085: 0x6cd4a220, 0x37086: 0x6cd4a420, 0x37087: 0x6cd4a620, - 0x37088: 0x6cd4a820, 0x37089: 0x6cd4aa20, 0x3708a: 0x6d029c20, 0x3708b: 0x6d029e20, - 0x3708c: 0x6d02a020, 0x3708d: 0x6d02a220, 0x3708e: 0x6d02a420, 0x3708f: 0x6d02a620, - 0x37090: 0x6d02a820, 0x37091: 0x6d02aa20, 0x37092: 0x6d02ac20, 0x37093: 0x6d02ae20, - 0x37094: 0x6d02b020, 0x37095: 0x6d02b220, 0x37096: 0x6d02b420, 0x37097: 0x6d02b620, - 0x37098: 0x6d02b820, 0x37099: 0x6d02ba20, 0x3709a: 0x6d02bc20, 0x3709b: 0x6d02be20, - 0x3709c: 0x6d02c020, 0x3709d: 0x6d02c220, 0x3709e: 0x6d02c420, 0x3709f: 0x6d02c620, - 0x370a0: 0x6d02c820, 0x370a1: 0x6d02ca20, 0x370a2: 0x6d02cc20, 0x370a3: 0x6d02ce20, - 0x370a4: 0x6d02d020, 0x370a5: 0x6d02d220, 0x370a6: 0x6d02d420, 0x370a7: 0x6d02d620, - 0x370a8: 0x6d02d820, 0x370a9: 0x6d02da20, 0x370aa: 0x6d02dc20, 0x370ab: 0x6d02de20, - 0x370ac: 0x6d02e020, 0x370ad: 0x6d02e220, 0x370ae: 0x6d02e420, 0x370af: 0x6d02e620, - 0x370b0: 0x6d02e820, 0x370b1: 0x6d02ea20, 0x370b2: 0x6d02ec20, 0x370b3: 0x6d02ee20, - 0x370b4: 0x6d02f020, 0x370b5: 0x6d02f220, 0x370b6: 0x6d02f420, 0x370b7: 0x6d02f620, - 0x370b8: 0x6d02f820, 0x370b9: 0x6d02fa20, 0x370ba: 0x6d304a20, 0x370bb: 0x6d304c20, - 0x370bc: 0x6d304e20, 0x370bd: 0x6d305020, 0x370be: 0x6d305220, 0x370bf: 0x6d305420, - // Block 0xdc3, offset 0x370c0 - 0x370c0: 0x6d305620, 0x370c1: 0x6d305820, 0x370c2: 0x6d305a20, 0x370c3: 0x6d305c20, - 0x370c4: 0x6d305e20, 0x370c5: 0x6d306020, 0x370c6: 0x6d306220, 0x370c7: 0x6d306420, - 0x370c8: 0x6d306620, 0x370c9: 0x6d306820, 0x370ca: 0x6d306a20, 0x370cb: 0x6d306c20, - 0x370cc: 0x6d306e20, 0x370cd: 0x6d307020, 0x370ce: 0x6d307220, 0x370cf: 0x6d307420, - 0x370d0: 0x6d307620, 0x370d1: 0x6d307820, 0x370d2: 0x6d307a20, 0x370d3: 0x6d307c20, - 0x370d4: 0x6d307e20, 0x370d5: 0x6d308020, 0x370d6: 0x6d308220, 0x370d7: 0x6d308420, - 0x370d8: 0x6d308620, 0x370d9: 0x6d308820, 0x370da: 0x6d308a20, 0x370db: 0x6d308c20, - 0x370dc: 0x6d308e20, 0x370dd: 0x6d309020, 0x370de: 0x6d309220, 0x370df: 0x6d309420, - 0x370e0: 0x6d309620, 0x370e1: 0x6d309820, 0x370e2: 0x6d309a20, 0x370e3: 0x6d309c20, - 0x370e4: 0x6d309e20, 0x370e5: 0x6d30a020, 0x370e6: 0x6d30a220, 0x370e7: 0x6d30a420, - 0x370e8: 0x6d30a620, 0x370e9: 0x6d30a820, 0x370ea: 0x6d30aa20, 0x370eb: 0x6d30ac20, - 0x370ec: 0x6d30ae20, 0x370ed: 0x6d5d4420, 0x370ee: 0x6d5d4620, 0x370ef: 0x6d5d4820, - 0x370f0: 0x6d5d4a20, 0x370f1: 0x6d5d4c20, 0x370f2: 0x6d5d4e20, 0x370f3: 0x6d5d5020, - 0x370f4: 0x6d5d5220, 0x370f5: 0x6d5d5420, 0x370f6: 0x6d5d5620, 0x370f7: 0x6d5d5820, - 0x370f8: 0x6d5d5a20, 0x370f9: 0x6d5d5c20, 0x370fa: 0x6d5d5e20, 0x370fb: 0x6d5d6020, - 0x370fc: 0x6d5d6220, 0x370fd: 0x6d5d6420, 0x370fe: 0x6d5d6620, 0x370ff: 0x6d5d6820, - // Block 0xdc4, offset 0x37100 - 0x37100: 0x6d5d6a20, 0x37101: 0x6d5d6c20, 0x37102: 0x6d5d6e20, 0x37103: 0x6d5d7020, - 0x37104: 0x6d5d7220, 0x37105: 0x6d5d7420, 0x37106: 0x6d5d7620, 0x37107: 0x6d5d7820, - 0x37108: 0x6d5d7a20, 0x37109: 0x6d5d7c20, 0x3710a: 0x6d5d7e20, 0x3710b: 0x6d5d8020, - 0x3710c: 0x6d87a020, 0x3710d: 0x6d87a220, 0x3710e: 0x6d87a420, 0x3710f: 0x6d87a620, - 0x37110: 0x6d87a820, 0x37111: 0x6d87aa20, 0x37112: 0x6d87ac20, 0x37113: 0x6d87ae20, - 0x37114: 0x6d87b020, 0x37115: 0x6d87b220, 0x37116: 0x6d87b420, 0x37117: 0x6d87b620, - 0x37118: 0x6d87b820, 0x37119: 0x6d87ba20, 0x3711a: 0x6d87bc20, 0x3711b: 0x6d87be20, - 0x3711c: 0x6d87c020, 0x3711d: 0x6d87c220, 0x3711e: 0x6d87c420, 0x3711f: 0x6d87c620, - 0x37120: 0x6d87c820, 0x37121: 0x6d87ca20, 0x37122: 0x6d87cc20, 0x37123: 0x6d87ce20, - 0x37124: 0x6d87d020, 0x37125: 0x6d87d220, 0x37126: 0x6d87d420, 0x37127: 0x6d87d620, - 0x37128: 0x6d87d820, 0x37129: 0x6d87da20, 0x3712a: 0x6d87dc20, 0x3712b: 0x6d87de20, - 0x3712c: 0x6d87e020, 0x3712d: 0x6d87e220, 0x3712e: 0x6d87e420, 0x3712f: 0x6d87e620, - 0x37130: 0x6dac4a20, 0x37131: 0x6dac4c20, 0x37132: 0x6dac4e20, 0x37133: 0x6dac5020, - 0x37134: 0x6dac5220, 0x37135: 0x6dac5420, 0x37136: 0x6dac5620, 0x37137: 0x6dac5820, - 0x37138: 0x6dac5a20, 0x37139: 0x6dac5c20, 0x3713a: 0x6dac5e20, 0x3713b: 0x6dac6020, - 0x3713c: 0x6dac6220, 0x3713d: 0x6dac6420, 0x3713e: 0x6dac6620, 0x3713f: 0x6dac6820, - // Block 0xdc5, offset 0x37140 - 0x37140: 0x6dac6a20, 0x37141: 0x6dac6c20, 0x37142: 0x6dac6e20, 0x37143: 0x6dac7020, - 0x37144: 0x6dac7220, 0x37145: 0x6dac7420, 0x37146: 0x6dac7620, 0x37147: 0x6dac7820, - 0x37148: 0x6dac7a20, 0x37149: 0x6dac7c20, 0x3714a: 0x6dac7e20, 0x3714b: 0x6dac8020, - 0x3714c: 0x6dac8220, 0x3714d: 0x6dac8420, 0x3714e: 0x6dac8620, 0x3714f: 0x6dac8820, - 0x37150: 0x6dac8a20, 0x37151: 0x6dac8c20, 0x37152: 0x6dac8e20, 0x37153: 0x6dac9020, - 0x37154: 0x6dac9220, 0x37155: 0x6dac9420, 0x37156: 0x6dac9620, 0x37157: 0x6dcc7420, - 0x37158: 0x6dcc7620, 0x37159: 0x6dcc7820, 0x3715a: 0x6dcc7a20, 0x3715b: 0x6dcc7c20, - 0x3715c: 0x6dcc7e20, 0x3715d: 0x6dcc8020, 0x3715e: 0x6dcc8220, 0x3715f: 0x6dcc8420, - 0x37160: 0x6dcc8620, 0x37161: 0x6dcc8820, 0x37162: 0x6dcc8a20, 0x37163: 0x6dcc8c20, - 0x37164: 0x6dcc8e20, 0x37165: 0x6dcc9020, 0x37166: 0x6dcc9220, 0x37167: 0x6dcc9420, - 0x37168: 0x6dcc9620, 0x37169: 0x6dcc9820, 0x3716a: 0x6de78220, 0x3716b: 0x6de78420, - 0x3716c: 0x6de78620, 0x3716d: 0x6de78820, 0x3716e: 0x6de78a20, 0x3716f: 0x6de78c20, - 0x37170: 0x6de78e20, 0x37171: 0x6de79020, 0x37172: 0x6de79220, 0x37173: 0x6de79420, - 0x37174: 0x6de79620, 0x37175: 0x6de79820, 0x37176: 0x6de79a20, 0x37177: 0x6de79c20, - 0x37178: 0x6de79e20, 0x37179: 0x6de7a020, 0x3717a: 0x6de7a220, 0x3717b: 0x6dfe0a20, - 0x3717c: 0x6dfe0c20, 0x3717d: 0x6dfe0e20, 0x3717e: 0x6dfe1020, 0x3717f: 0x6dfe1220, - // Block 0xdc6, offset 0x37180 - 0x37180: 0x6dfe1420, 0x37181: 0x6dfe1620, 0x37182: 0x6dfe1820, 0x37183: 0x6dfe1a20, - 0x37184: 0x6dfe1c20, 0x37185: 0x6dfe1e20, 0x37186: 0x6dfe2020, 0x37187: 0x6dfe2220, - 0x37188: 0x6dfe2420, 0x37189: 0x6dfe2620, 0x3718a: 0x6dfe2820, 0x3718b: 0x6dfe2a20, - 0x3718c: 0x6dfe2c20, 0x3718d: 0x6dfe2e20, 0x3718e: 0x6dfe3020, 0x3718f: 0x6dfe3220, - 0x37190: 0x6dfe3420, 0x37191: 0x6dfe3620, 0x37192: 0x6e10a420, 0x37193: 0x6e10a620, - 0x37194: 0x6e10a820, 0x37195: 0x6e10aa20, 0x37196: 0x6e10ac20, 0x37197: 0x6e10ae20, - 0x37198: 0x6e10b020, 0x37199: 0x6e10b220, 0x3719a: 0x6e10b420, 0x3719b: 0x6e10b620, - 0x3719c: 0x6e10b820, 0x3719d: 0x6e1f3a20, 0x3719e: 0x6e1f3c20, 0x3719f: 0x6e1f3e20, - 0x371a0: 0x6e1f4020, 0x371a1: 0x6e1f4220, 0x371a2: 0x6e1f4420, 0x371a3: 0x6e1f4620, - 0x371a4: 0x6e1f4820, 0x371a5: 0x6e1f4a20, 0x371a6: 0x6e1f4c20, 0x371a7: 0x6e1f4e20, - 0x371a8: 0x6e1f5020, 0x371a9: 0x6e1f5220, 0x371aa: 0x6e1f5420, 0x371ab: 0x6e2a8c20, - 0x371ac: 0x6e2a8e20, 0x371ad: 0x6e2a9020, 0x371ae: 0x6e2a9220, 0x371af: 0x6e2a9420, - 0x371b0: 0x6e2a9620, 0x371b1: 0x6e2a9820, 0x371b2: 0x6e2a9a20, 0x371b3: 0x6e2a9c20, - 0x371b4: 0x6e332820, 0x371b5: 0x6e332a20, 0x371b6: 0x6e361a20, 0x371b7: 0x6e332c20, - 0x371b8: 0x6e332e20, 0x371b9: 0x6e394420, 0x371ba: 0x6e3d9820, 0x371bb: 0x6e3d9a20, - 0x371bc: 0x6e3d9c20, 0x371bd: 0x6e3d9e20, 0x371be: 0x6e408820, 0x371bf: 0x6e408a20, - // Block 0xdc7, offset 0x371c0 - 0x371c0: 0x6e408c20, 0x371c1: 0x6e42d020, 0x371c2: 0x6e42d220, 0x371c3: 0x6e444620, - 0x371c4: 0x6e46b220, 0x371c5: 0x6c050020, 0x371c6: 0x6c0a3620, 0x371c7: 0x6c13f820, - 0x371c8: 0x6c13fa20, 0x371c9: 0x6c13fc20, 0x371ca: 0x6c13fe20, 0x371cb: 0x6c140020, - 0x371cc: 0x6c140220, 0x371cd: 0x6c255020, 0x371ce: 0x6c255220, 0x371cf: 0x6c255420, - 0x371d0: 0x6c255620, 0x371d1: 0x6c255820, 0x371d2: 0x6c255a20, 0x371d3: 0x6c255c20, - 0x371d4: 0x6c255e20, 0x371d5: 0x6c3cfc20, 0x371d6: 0x6c3cfe20, 0x371d7: 0x6c3d0020, - 0x371d8: 0x6c3d0220, 0x371d9: 0x6c3d0420, 0x371da: 0x6c3d0620, 0x371db: 0x6c3d0820, - 0x371dc: 0x6c3d0a20, 0x371dd: 0x6c3d0c20, 0x371de: 0x6c3d0e20, 0x371df: 0x6c3d1020, - 0x371e0: 0x6c3d1220, 0x371e1: 0x6c3d1420, 0x371e2: 0x6c3d1620, 0x371e3: 0x6c3d1820, - 0x371e4: 0x6c3d1a20, 0x371e5: 0x6c3d1c20, 0x371e6: 0x6c3d1e20, 0x371e7: 0x6c3d2020, - 0x371e8: 0x6c3d2220, 0x371e9: 0x6c3d2420, 0x371ea: 0x6c3d2620, 0x371eb: 0x6c5ade20, - 0x371ec: 0x6c5ae020, 0x371ed: 0x6c5ae220, 0x371ee: 0x6c5ae420, 0x371ef: 0x6c5ae620, - 0x371f0: 0x6c5ae820, 0x371f1: 0x6c5aea20, 0x371f2: 0x6c5aec20, 0x371f3: 0x6c5aee20, - 0x371f4: 0x6c5af020, 0x371f5: 0x6c5af220, 0x371f6: 0x6c5af420, 0x371f7: 0x6c5af620, - 0x371f8: 0x6c5af820, 0x371f9: 0x6c5afa20, 0x371fa: 0x6c5afc20, 0x371fb: 0x6c5afe20, - 0x371fc: 0x6c5b0020, 0x371fd: 0x6c5b0220, 0x371fe: 0x6c5b0420, 0x371ff: 0x6c5b0620, - // Block 0xdc8, offset 0x37200 - 0x37200: 0x6c5b0820, 0x37201: 0x6c5b0a20, 0x37202: 0x6c5b0c20, 0x37203: 0x6c5b0e20, - 0x37204: 0x6c5b1020, 0x37205: 0x6c5b1220, 0x37206: 0x6c5b1420, 0x37207: 0x6c5b1620, - 0x37208: 0x6c5b1820, 0x37209: 0x6c5b1a20, 0x3720a: 0x6c5b1c20, 0x3720b: 0x6c5b1e20, - 0x3720c: 0x6c5b2020, 0x3720d: 0x6c5b2220, 0x3720e: 0x6c7dea20, 0x3720f: 0x6c7dec20, - 0x37210: 0x6c7dee20, 0x37211: 0x6c7df020, 0x37212: 0x6c7df220, 0x37213: 0x6c7df420, - 0x37214: 0x6c7df620, 0x37215: 0x6c7df820, 0x37216: 0x6c7dfa20, 0x37217: 0x6c7dfc20, - 0x37218: 0x6c7dfe20, 0x37219: 0x6c7e0020, 0x3721a: 0x6c7e0220, 0x3721b: 0x6c7e0420, - 0x3721c: 0x6c7e0620, 0x3721d: 0x6c7e0820, 0x3721e: 0x6c7e0a20, 0x3721f: 0x6c7e0c20, - 0x37220: 0x6c7e0e20, 0x37221: 0x6c7e1020, 0x37222: 0x6c7e1220, 0x37223: 0x6c7e1420, - 0x37224: 0x6c7e1620, 0x37225: 0x6c7e1820, 0x37226: 0x6c7e1a20, 0x37227: 0x6c7e1c20, - 0x37228: 0x6c7e1e20, 0x37229: 0x6c7e2020, 0x3722a: 0x6c7e2220, 0x3722b: 0x6ca6ae20, - 0x3722c: 0x6ca6b020, 0x3722d: 0x6ca6b220, 0x3722e: 0x6ca6b420, 0x3722f: 0x6ca6b620, - 0x37230: 0x6ca6b820, 0x37231: 0x6ca6ba20, 0x37232: 0x6ca6bc20, 0x37233: 0x6ca6be20, - 0x37234: 0x6ca6c020, 0x37235: 0x6ca6c220, 0x37236: 0x6ca6c420, 0x37237: 0x6ca6c620, - 0x37238: 0x6ca6c820, 0x37239: 0x6ca6ca20, 0x3723a: 0x6ca6cc20, 0x3723b: 0x6ca6ce20, - 0x3723c: 0x6ca6d020, 0x3723d: 0x6ca6d220, 0x3723e: 0x6ca6d420, 0x3723f: 0x6ca6d620, - // Block 0xdc9, offset 0x37240 - 0x37240: 0x6ca6d820, 0x37241: 0x6ca6da20, 0x37242: 0x6ca6dc20, 0x37243: 0x6ca6de20, - 0x37244: 0x6ca6e020, 0x37245: 0x6ca6e220, 0x37246: 0x6ca6e420, 0x37247: 0x6ca6e620, - 0x37248: 0x6cd4d620, 0x37249: 0x6cd4d820, 0x3724a: 0x6cd4da20, 0x3724b: 0x6cd4dc20, - 0x3724c: 0x6cd4de20, 0x3724d: 0x6cd4e020, 0x3724e: 0x6cd4e220, 0x3724f: 0x6cd4e420, - 0x37250: 0x6cd4e620, 0x37251: 0x6cd4e820, 0x37252: 0x6cd4ea20, 0x37253: 0x6cd4ec20, - 0x37254: 0x6cd4ee20, 0x37255: 0x6cd4f020, 0x37256: 0x6cd4f220, 0x37257: 0x6cd4f420, - 0x37258: 0x6cd4f620, 0x37259: 0x6cd4f820, 0x3725a: 0x6cd4fa20, 0x3725b: 0x6cd4fc20, - 0x3725c: 0x6cd4fe20, 0x3725d: 0x6cd50020, 0x3725e: 0x6cd50220, 0x3725f: 0x6cd50420, - 0x37260: 0x6cd50620, 0x37261: 0x6cd50820, 0x37262: 0x6cd50a20, 0x37263: 0x6cd50c20, - 0x37264: 0x6cd50e20, 0x37265: 0x6cd51020, 0x37266: 0x6d033420, 0x37267: 0x6d033620, - 0x37268: 0x6d033820, 0x37269: 0x6d033a20, 0x3726a: 0x6d033c20, 0x3726b: 0x6d033e20, - 0x3726c: 0x6d034020, 0x3726d: 0x6d034220, 0x3726e: 0x6d034420, 0x3726f: 0x6d034620, - 0x37270: 0x6d034820, 0x37271: 0x6d034a20, 0x37272: 0x6d034c20, 0x37273: 0x6d034e20, - 0x37274: 0x6d035020, 0x37275: 0x6d035220, 0x37276: 0x6d035420, 0x37277: 0x6d035620, - 0x37278: 0x6d035820, 0x37279: 0x6d035a20, 0x3727a: 0x6d035c20, 0x3727b: 0x6d035e20, - 0x3727c: 0x6d036020, 0x3727d: 0x6d036220, 0x3727e: 0x6d036420, 0x3727f: 0x6d036620, - // Block 0xdca, offset 0x37280 - 0x37280: 0x6d036820, 0x37281: 0x6d036a20, 0x37282: 0x6d036c20, 0x37283: 0x6d036e20, - 0x37284: 0x6d037020, 0x37285: 0x6d30e620, 0x37286: 0x6d30e820, 0x37287: 0x6d30ea20, - 0x37288: 0x6d30ec20, 0x37289: 0x6d30ee20, 0x3728a: 0x6d30f020, 0x3728b: 0x6d30f220, - 0x3728c: 0x6d30f420, 0x3728d: 0x6d30f620, 0x3728e: 0x6d30f820, 0x3728f: 0x6d30fa20, - 0x37290: 0x6d30fc20, 0x37291: 0x6d30fe20, 0x37292: 0x6d310020, 0x37293: 0x6d310220, - 0x37294: 0x6d310420, 0x37295: 0x6d310620, 0x37296: 0x6d310820, 0x37297: 0x6d310a20, - 0x37298: 0x6d5da020, 0x37299: 0x6d5da220, 0x3729a: 0x6d5da420, 0x3729b: 0x6d5da620, - 0x3729c: 0x6d5da820, 0x3729d: 0x6d5daa20, 0x3729e: 0x6d5dac20, 0x3729f: 0x6d5dae20, - 0x372a0: 0x6d5db020, 0x372a1: 0x6d5db220, 0x372a2: 0x6d5db420, 0x372a3: 0x6d5db620, - 0x372a4: 0x6d5db820, 0x372a5: 0x6d5dba20, 0x372a6: 0x6d5dbc20, 0x372a7: 0x6d5dbe20, - 0x372a8: 0x6d5dc020, 0x372a9: 0x6d5dc220, 0x372aa: 0x6d5dc420, 0x372ab: 0x6d5dc620, - 0x372ac: 0x6d5dc820, 0x372ad: 0x6d5dca20, 0x372ae: 0x6d880620, 0x372af: 0x6d880820, - 0x372b0: 0x6d880a20, 0x372b1: 0x6d880c20, 0x372b2: 0x6d880e20, 0x372b3: 0x6d881020, - 0x372b4: 0x6d881220, 0x372b5: 0x6d881420, 0x372b6: 0x6d881620, 0x372b7: 0x6d881820, - 0x372b8: 0x6d881a20, 0x372b9: 0x6d881c20, 0x372ba: 0x6d881e20, 0x372bb: 0x6d882020, - 0x372bc: 0x6d882220, 0x372bd: 0x6d882420, 0x372be: 0x6d882620, 0x372bf: 0x6d882820, - // Block 0xdcb, offset 0x372c0 - 0x372c0: 0x6d882a20, 0x372c1: 0x6d882c20, 0x372c2: 0x6d882e20, 0x372c3: 0x6dacaa20, - 0x372c4: 0x6dacac20, 0x372c5: 0x6dacae20, 0x372c6: 0x6dacb020, 0x372c7: 0x6dacb220, - 0x372c8: 0x6dacb420, 0x372c9: 0x6dacb620, 0x372ca: 0x6dacb820, 0x372cb: 0x6dacba20, - 0x372cc: 0x6dacbc20, 0x372cd: 0x6dacbe20, 0x372ce: 0x6dacc020, 0x372cf: 0x6dacc220, - 0x372d0: 0x6dacc420, 0x372d1: 0x6dacc620, 0x372d2: 0x6dccac20, 0x372d3: 0x6dccae20, - 0x372d4: 0x6dccb020, 0x372d5: 0x6dccb220, 0x372d6: 0x6dccb420, 0x372d7: 0x6dccb620, - 0x372d8: 0x6dccb820, 0x372d9: 0x6dccba20, 0x372da: 0x6de7b020, 0x372db: 0x6de7b220, - 0x372dc: 0x6de7b420, 0x372dd: 0x6de7b620, 0x372de: 0x6de7b820, 0x372df: 0x6de7ba20, - 0x372e0: 0x6dfe3c20, 0x372e1: 0x6dfe3e20, 0x372e2: 0x6dfe4020, 0x372e3: 0x6dfe4220, - 0x372e4: 0x6dfe4420, 0x372e5: 0x6e10be20, 0x372e6: 0x6e10c020, 0x372e7: 0x6e10c220, - 0x372e8: 0x6e10c420, 0x372e9: 0x6e10c620, 0x372ea: 0x6e1f5a20, 0x372eb: 0x6e1f5c20, - 0x372ec: 0x6e1f5e20, 0x372ed: 0x6e1f6020, 0x372ee: 0x6e1f6220, 0x372ef: 0x6e1f6420, - 0x372f0: 0x6e2aa220, 0x372f1: 0x6e2aa420, 0x372f2: 0x6e2aa620, 0x372f3: 0x6e2aa820, - 0x372f4: 0x6e333420, 0x372f5: 0x6e333620, 0x372f6: 0x6e394620, 0x372f7: 0x6e394820, - 0x372f8: 0x6e394a20, 0x372f9: 0x6e3da020, 0x372fa: 0x6e3da220, 0x372fb: 0x6c0a3a20, - 0x372fc: 0x6c3d2c20, 0x372fd: 0x6c7e2e20, 0x372fe: 0x6ca6f620, 0x372ff: 0x6cd52820, - // Block 0xdcc, offset 0x37300 - 0x37300: 0x6cb7b420, 0x37301: 0x6cd52a20, 0x37302: 0x6cd52c20, 0x37303: 0x6d037a20, - 0x37304: 0x6d311820, 0x37305: 0x6d5dd020, 0x37306: 0x6d5dd220, 0x37307: 0x6d5dd420, - 0x37308: 0x6dacca20, 0x37309: 0x6daccc20, 0x3730a: 0x6e10c820, 0x3730b: 0x6e333a20, - 0x3730c: 0x6c0a3e20, 0x3730d: 0x6c140420, 0x3730e: 0x6c140620, 0x3730f: 0x6c140820, - 0x37310: 0x6c257220, 0x37311: 0x6c257420, 0x37312: 0x6c257620, 0x37313: 0x6c257820, - 0x37314: 0x6c3d4820, 0x37315: 0x6c3d4a20, 0x37316: 0x6c3d4c20, 0x37317: 0x6c3d4e20, - 0x37318: 0x6c3d5020, 0x37319: 0x6c3d5220, 0x3731a: 0x6c3d5420, 0x3731b: 0x6c3d5620, - 0x3731c: 0x6c3d5820, 0x3731d: 0x6c3d5a20, 0x3731e: 0x6c3d5c20, 0x3731f: 0x6c3d5e20, - 0x37320: 0x6c3d6020, 0x37321: 0x6c3d6220, 0x37322: 0x6c3d6420, 0x37323: 0x6c5b5820, - 0x37324: 0x6c5b5a20, 0x37325: 0x6c5b5c20, 0x37326: 0x6c5b5e20, 0x37327: 0x6c5b6020, - 0x37328: 0x6c5b6220, 0x37329: 0x6c5b6420, 0x3732a: 0x6c5b6620, 0x3732b: 0x6c5b6820, - 0x3732c: 0x6c5b6a20, 0x3732d: 0x6c5b6c20, 0x3732e: 0x6c5b6e20, 0x3732f: 0x6c5b7020, - 0x37330: 0x6c5b7220, 0x37331: 0x6c5b7420, 0x37332: 0x6c5b7620, 0x37333: 0x6c5b7820, - 0x37334: 0x6c5b7a20, 0x37335: 0x6c5b7c20, 0x37336: 0x6c5b7e20, 0x37337: 0x6c5b8020, - 0x37338: 0x6c5b8220, 0x37339: 0x6c5b8420, 0x3733a: 0x6c5b8620, 0x3733b: 0x6c5b8820, - 0x3733c: 0x6c5b8a20, 0x3733d: 0x6c5b8c20, 0x3733e: 0x6c7e6a20, 0x3733f: 0x6c7e6c20, - // Block 0xdcd, offset 0x37340 - 0x37340: 0x6c7e6e20, 0x37341: 0x6c7e7020, 0x37342: 0x6c7e7220, 0x37343: 0x6c7e7420, - 0x37344: 0x6c7e7620, 0x37345: 0x6c7e7820, 0x37346: 0x6c7e7a20, 0x37347: 0x6c7e7c20, - 0x37348: 0x6c7e7e20, 0x37349: 0x6c7e8020, 0x3734a: 0x6c7e8220, 0x3734b: 0x6c7e8420, - 0x3734c: 0x6c7e8620, 0x3734d: 0x6c7e8820, 0x3734e: 0x6c7e8a20, 0x3734f: 0x6c7e8c20, - 0x37350: 0x6c7e8e20, 0x37351: 0x6c7e9020, 0x37352: 0x6c7e9220, 0x37353: 0x6c7e9420, - 0x37354: 0x6c7e9620, 0x37355: 0x6c7e9820, 0x37356: 0x6c7e9a20, 0x37357: 0x6c7e9c20, - 0x37358: 0x6ca73820, 0x37359: 0x6ca73a20, 0x3735a: 0x6ca73c20, 0x3735b: 0x6ca73e20, - 0x3735c: 0x6ca74020, 0x3735d: 0x6ca74220, 0x3735e: 0x6ca74420, 0x3735f: 0x6ca74620, - 0x37360: 0x6ca74820, 0x37361: 0x6ca74a20, 0x37362: 0x6ca74c20, 0x37363: 0x6ca74e20, - 0x37364: 0x6ca75020, 0x37365: 0x6ca75220, 0x37366: 0x6ca75420, 0x37367: 0x6ca75620, - 0x37368: 0x6ca75820, 0x37369: 0x6ca75a20, 0x3736a: 0x6ca75c20, 0x3736b: 0x6ca75e20, - 0x3736c: 0x6ca76020, 0x3736d: 0x6ca76220, 0x3736e: 0x6ca76420, 0x3736f: 0x6ca76620, - 0x37370: 0x6ca76820, 0x37371: 0x6ca76a20, 0x37372: 0x6cd56020, 0x37373: 0x6cd56220, - 0x37374: 0x6cd56420, 0x37375: 0x6cd56620, 0x37376: 0x6cd56820, 0x37377: 0x6cd56a20, - 0x37378: 0x6cd56c20, 0x37379: 0x6cd56e20, 0x3737a: 0x6cd57020, 0x3737b: 0x6cd57220, - 0x3737c: 0x6cd57420, 0x3737d: 0x6cd57620, 0x3737e: 0x6cd57820, 0x3737f: 0x6cd57a20, - // Block 0xdce, offset 0x37380 - 0x37380: 0x6cd57c20, 0x37381: 0x6cd57e20, 0x37382: 0x6cd58020, 0x37383: 0x6cd58220, - 0x37384: 0x6cd58420, 0x37385: 0x6ca76c20, 0x37386: 0x6cd58620, 0x37387: 0x6cd58820, - 0x37388: 0x6cd58a20, 0x37389: 0x6cd58c20, 0x3738a: 0x6cd58e20, 0x3738b: 0x6cd59020, - 0x3738c: 0x6cd59220, 0x3738d: 0x6d03c220, 0x3738e: 0x6d03c420, 0x3738f: 0x6d03c620, - 0x37390: 0x6d03c820, 0x37391: 0x6d03ca20, 0x37392: 0x6d03cc20, 0x37393: 0x6d03ce20, - 0x37394: 0x6d03d020, 0x37395: 0x6d03d220, 0x37396: 0x6d03d420, 0x37397: 0x6d03d620, - 0x37398: 0x6d03d820, 0x37399: 0x6d03da20, 0x3739a: 0x6d03dc20, 0x3739b: 0x6d03de20, - 0x3739c: 0x6d03e020, 0x3739d: 0x6d03e220, 0x3739e: 0x6d03e420, 0x3739f: 0x6d03e620, - 0x373a0: 0x6d03e820, 0x373a1: 0x6d03ea20, 0x373a2: 0x6d03ec20, 0x373a3: 0x6d03ee20, - 0x373a4: 0x6d03f020, 0x373a5: 0x6d03f220, 0x373a6: 0x6d03f420, 0x373a7: 0x6d03f620, - 0x373a8: 0x6d03f820, 0x373a9: 0x6d03fa20, 0x373aa: 0x6d03fc20, 0x373ab: 0x6d03fe20, - 0x373ac: 0x6d040020, 0x373ad: 0x6d040220, 0x373ae: 0x6d040420, 0x373af: 0x6d040620, - 0x373b0: 0x6d040820, 0x373b1: 0x6d040a20, 0x373b2: 0x6d040c20, 0x373b3: 0x6d040e20, - 0x373b4: 0x6d041020, 0x373b5: 0x6d041220, 0x373b6: 0x6d041420, 0x373b7: 0x6d041620, - 0x373b8: 0x6d041820, 0x373b9: 0x6d041a20, 0x373ba: 0x6d041c20, 0x373bb: 0x6d041e20, - 0x373bc: 0x6d042020, 0x373bd: 0x6d315020, 0x373be: 0x6d315220, 0x373bf: 0x6d315420, - // Block 0xdcf, offset 0x373c0 - 0x373c0: 0x6d315620, 0x373c1: 0x6d315820, 0x373c2: 0x6d315a20, 0x373c3: 0x6d315c20, - 0x373c4: 0x6d315e20, 0x373c5: 0x6d316020, 0x373c6: 0x6d316220, 0x373c7: 0x6d316420, - 0x373c8: 0x6d316620, 0x373c9: 0x6d316820, 0x373ca: 0x6d316a20, 0x373cb: 0x6d316c20, - 0x373cc: 0x6d316e20, 0x373cd: 0x6d317020, 0x373ce: 0x6d317220, 0x373cf: 0x6d317420, - 0x373d0: 0x6d317620, 0x373d1: 0x6d317820, 0x373d2: 0x6d317a20, 0x373d3: 0x6d317c20, - 0x373d4: 0x6d317e20, 0x373d5: 0x6d318020, 0x373d6: 0x6d318220, 0x373d7: 0x6d318420, - 0x373d8: 0x6d318620, 0x373d9: 0x6d318820, 0x373da: 0x6d318a20, 0x373db: 0x6d318c20, - 0x373dc: 0x6d318e20, 0x373dd: 0x6d319020, 0x373de: 0x6d319220, 0x373df: 0x6d319420, - 0x373e0: 0x6d319620, 0x373e1: 0x6d319820, 0x373e2: 0x6d319a20, 0x373e3: 0x6d319c20, - 0x373e4: 0x6d319e20, 0x373e5: 0x6d31a020, 0x373e6: 0x6d31a220, 0x373e7: 0x6d31a420, - 0x373e8: 0x6d31a620, 0x373e9: 0x6d31a820, 0x373ea: 0x6d31aa20, 0x373eb: 0x6d31ac20, - 0x373ec: 0x6d31ae20, 0x373ed: 0x6d31b020, 0x373ee: 0x6d31b220, 0x373ef: 0x6d31b420, - 0x373f0: 0x6d31b620, 0x373f1: 0x6d5e0c20, 0x373f2: 0x6d5e0e20, 0x373f3: 0x6d5e1020, - 0x373f4: 0x6d5e1220, 0x373f5: 0x6d5e1420, 0x373f6: 0x6d5e1620, 0x373f7: 0x6d5e1820, - 0x373f8: 0x6d5e1a20, 0x373f9: 0x6d5e1c20, 0x373fa: 0x6d5e1e20, 0x373fb: 0x6d5e2020, - 0x373fc: 0x6d5e2220, 0x373fd: 0x6d5e2420, 0x373fe: 0x6d5e2620, 0x373ff: 0x6d5e2820, - // Block 0xdd0, offset 0x37400 - 0x37400: 0x6d5e2a20, 0x37401: 0x6d5e2c20, 0x37402: 0x6d5e2e20, 0x37403: 0x6d5e3020, - 0x37404: 0x6d5e3220, 0x37405: 0x6d5e3420, 0x37406: 0x6d5e3620, 0x37407: 0x6d5e3820, - 0x37408: 0x6d5e3a20, 0x37409: 0x6d5e3c20, 0x3740a: 0x6d5e3e20, 0x3740b: 0x6d5e4020, - 0x3740c: 0x6d5e4220, 0x3740d: 0x6d5e4420, 0x3740e: 0x6d5e4620, 0x3740f: 0x6d5e4820, - 0x37410: 0x6d5e4a20, 0x37411: 0x6d5e4c20, 0x37412: 0x6d5e4e20, 0x37413: 0x6d5e5020, - 0x37414: 0x6d5e5220, 0x37415: 0x6d5e5420, 0x37416: 0x6d5e5620, 0x37417: 0x6d5e5820, - 0x37418: 0x6d5e5a20, 0x37419: 0x6d5e5c20, 0x3741a: 0x6d5e5e20, 0x3741b: 0x6d5e6020, - 0x3741c: 0x6d885c20, 0x3741d: 0x6d885e20, 0x3741e: 0x6d886020, 0x3741f: 0x6d886220, - 0x37420: 0x6d886420, 0x37421: 0x6d886620, 0x37422: 0x6d886820, 0x37423: 0x6d886a20, - 0x37424: 0x6d886c20, 0x37425: 0x6d886e20, 0x37426: 0x6d887020, 0x37427: 0x6d887220, - 0x37428: 0x6d887420, 0x37429: 0x6d887620, 0x3742a: 0x6d887820, 0x3742b: 0x6d887a20, - 0x3742c: 0x6d887c20, 0x3742d: 0x6d887e20, 0x3742e: 0x6d888020, 0x3742f: 0x6d888220, - 0x37430: 0x6d888420, 0x37431: 0x6d888620, 0x37432: 0x6d888820, 0x37433: 0x6d888a20, - 0x37434: 0x6d888c20, 0x37435: 0x6d888e20, 0x37436: 0x6d889020, 0x37437: 0x6d889220, - 0x37438: 0x6d889420, 0x37439: 0x6d889620, 0x3743a: 0x6d889820, 0x3743b: 0x6d889a20, - 0x3743c: 0x6d889c20, 0x3743d: 0x6d889e20, 0x3743e: 0x6d88a020, 0x3743f: 0x6d88a220, - // Block 0xdd1, offset 0x37440 - 0x37440: 0x6d88a420, 0x37441: 0x6d88a620, 0x37442: 0x6d88a820, 0x37443: 0x6d88aa20, - 0x37444: 0x6d88ac20, 0x37445: 0x6d88ae20, 0x37446: 0x6d88b020, 0x37447: 0x6d88b220, - 0x37448: 0x6d88b420, 0x37449: 0x6d88b620, 0x3744a: 0x6dacec20, 0x3744b: 0x6dacee20, - 0x3744c: 0x6dacf020, 0x3744d: 0x6dacf220, 0x3744e: 0x6dacf420, 0x3744f: 0x6dacf620, - 0x37450: 0x6dacf820, 0x37451: 0x6dacfa20, 0x37452: 0x6dacfc20, 0x37453: 0x6dacfe20, - 0x37454: 0x6dad0020, 0x37455: 0x6dad0220, 0x37456: 0x6dad0420, 0x37457: 0x6dad0620, - 0x37458: 0x6dad0820, 0x37459: 0x6dad0a20, 0x3745a: 0x6dad0c20, 0x3745b: 0x6dad0e20, - 0x3745c: 0x6dad1020, 0x3745d: 0x6dad1220, 0x3745e: 0x6dad1420, 0x3745f: 0x6dad1620, - 0x37460: 0x6dad1820, 0x37461: 0x6dad1a20, 0x37462: 0x6dad1c20, 0x37463: 0x6dad1e20, - 0x37464: 0x6dad2020, 0x37465: 0x6dad2220, 0x37466: 0x6dad2420, 0x37467: 0x6dad2620, - 0x37468: 0x6dad2820, 0x37469: 0x6dad2a20, 0x3746a: 0x6dad2c20, 0x3746b: 0x6dad2e20, - 0x3746c: 0x6dad3020, 0x3746d: 0x6dad3220, 0x3746e: 0x6dad3420, 0x3746f: 0x6dad3620, - 0x37470: 0x6dad3820, 0x37471: 0x6dad3a20, 0x37472: 0x6dad3c20, 0x37473: 0x6dad3e20, - 0x37474: 0x6dccd820, 0x37475: 0x6dccda20, 0x37476: 0x6dccdc20, 0x37477: 0x6dccde20, - 0x37478: 0x6dcce020, 0x37479: 0x6dcce220, 0x3747a: 0x6dcce420, 0x3747b: 0x6dcce620, - 0x3747c: 0x6dcce820, 0x3747d: 0x6dccea20, 0x3747e: 0x6dccec20, 0x3747f: 0x6dccee20, - // Block 0xdd2, offset 0x37480 - 0x37480: 0x6dccf020, 0x37481: 0x6dccf220, 0x37482: 0x6dccf420, 0x37483: 0x6dccf620, - 0x37484: 0x6dccf820, 0x37485: 0x6dccfa20, 0x37486: 0x6dccfc20, 0x37487: 0x6dccfe20, - 0x37488: 0x6dcd0020, 0x37489: 0x6dcd0220, 0x3748a: 0x6de7cc20, 0x3748b: 0x6dcd0420, - 0x3748c: 0x6dcd0620, 0x3748d: 0x6dcd0820, 0x3748e: 0x6dcd0a20, 0x3748f: 0x6dcd0c20, - 0x37490: 0x6dcd0e20, 0x37491: 0x6dcd1020, 0x37492: 0x6dcd1220, 0x37493: 0x6dcd1420, - 0x37494: 0x6dcd1620, 0x37495: 0x6de7ce20, 0x37496: 0x6de7d020, 0x37497: 0x6de7d220, - 0x37498: 0x6de7d420, 0x37499: 0x6de7d620, 0x3749a: 0x6de7d820, 0x3749b: 0x6de7da20, - 0x3749c: 0x6de7dc20, 0x3749d: 0x6de7de20, 0x3749e: 0x6de7e020, 0x3749f: 0x6de7e220, - 0x374a0: 0x6de7e420, 0x374a1: 0x6de7e620, 0x374a2: 0x6dfe5220, 0x374a3: 0x6de7e820, - 0x374a4: 0x6de7ea20, 0x374a5: 0x6de7ec20, 0x374a6: 0x6de7ee20, 0x374a7: 0x6de7f020, - 0x374a8: 0x6dfe5420, 0x374a9: 0x6dfe5620, 0x374aa: 0x6dfe5820, 0x374ab: 0x6dfe5a20, - 0x374ac: 0x6dfe5c20, 0x374ad: 0x6dfe5e20, 0x374ae: 0x6dfe6020, 0x374af: 0x6dfe6220, - 0x374b0: 0x6dfe6420, 0x374b1: 0x6dfe6620, 0x374b2: 0x6dfe6820, 0x374b3: 0x6dfe6a20, - 0x374b4: 0x6dfe6c20, 0x374b5: 0x6dfe6e20, 0x374b6: 0x6dfe7020, 0x374b7: 0x6e046620, - 0x374b8: 0x6dfe7220, 0x374b9: 0x6dfe7420, 0x374ba: 0x6dfe7620, 0x374bb: 0x6dfe7820, - 0x374bc: 0x6dfe7a20, 0x374bd: 0x6dfe7c20, 0x374be: 0x6dfe7e20, 0x374bf: 0x6dfe8020, - // Block 0xdd3, offset 0x374c0 - 0x374c0: 0x6e10d220, 0x374c1: 0x6e10d420, 0x374c2: 0x6e10d620, 0x374c3: 0x6e10d820, - 0x374c4: 0x6e10da20, 0x374c5: 0x6e10dc20, 0x374c6: 0x6e1f6c20, 0x374c7: 0x6e1f6e20, - 0x374c8: 0x6e1f7020, 0x374c9: 0x6e1f7220, 0x374ca: 0x6e2aaa20, 0x374cb: 0x6e2aac20, - 0x374cc: 0x6e2aae20, 0x374cd: 0x6e2ab020, 0x374ce: 0x6e2ab220, 0x374cf: 0x6e2ab420, - 0x374d0: 0x6e2ab620, 0x374d1: 0x6e2ab820, 0x374d2: 0x6e2aba20, 0x374d3: 0x6e334020, - 0x374d4: 0x6e328a20, 0x374d5: 0x6e334220, 0x374d6: 0x6e334420, 0x374d7: 0x6e394e20, - 0x374d8: 0x6e395020, 0x374d9: 0x6e395220, 0x374da: 0x6e395420, 0x374db: 0x6e3da420, - 0x374dc: 0x6e3da620, 0x374dd: 0x6e3da820, 0x374de: 0x6e444a20, 0x374df: 0x6e444c20, - 0x374e0: 0x6e463420, 0x374e1: 0x6e46cc20, 0x374e2: 0x6c0a4220, 0x374e3: 0x6c258020, - 0x374e4: 0x6c258220, 0x374e5: 0x6c258420, 0x374e6: 0x6c258620, 0x374e7: 0x6c3d7220, - 0x374e8: 0x6c3d7420, 0x374e9: 0x6c3d7620, 0x374ea: 0x6c3d7820, 0x374eb: 0x6c3d7a20, - 0x374ec: 0x6c3d7c20, 0x374ed: 0x6c3d7e20, 0x374ee: 0x6c3d8020, 0x374ef: 0x6c3d8220, - 0x374f0: 0x6c3d8420, 0x374f1: 0x6c3d8620, 0x374f2: 0x6c3d8820, 0x374f3: 0x6c3d8a20, - 0x374f4: 0x6c5baa20, 0x374f5: 0x6c5bac20, 0x374f6: 0x6c5bae20, 0x374f7: 0x6c5bb020, - 0x374f8: 0x6c5bb220, 0x374f9: 0x6c5bb420, 0x374fa: 0x6c5bb620, 0x374fb: 0x6c5bb820, - 0x374fc: 0x6c5bba20, 0x374fd: 0x6c5bbc20, 0x374fe: 0x6c5bbe20, 0x374ff: 0x6c5bc020, - // Block 0xdd4, offset 0x37500 - 0x37500: 0x6c5bc220, 0x37501: 0x6c5bc420, 0x37502: 0x6c5bc620, 0x37503: 0x6c5bc820, - 0x37504: 0x6c5bca20, 0x37505: 0x6c5bcc20, 0x37506: 0x6c5bce20, 0x37507: 0x6c7ec220, - 0x37508: 0x6c7ec420, 0x37509: 0x6c7ec620, 0x3750a: 0x6c7ec820, 0x3750b: 0x6c7eca20, - 0x3750c: 0x6c7ecc20, 0x3750d: 0x6c7ece20, 0x3750e: 0x6c7ed020, 0x3750f: 0x6c7ed220, - 0x37510: 0x6c7ed420, 0x37511: 0x6c7ed620, 0x37512: 0x6c7ed820, 0x37513: 0x6c7eda20, - 0x37514: 0x6c7edc20, 0x37515: 0x6c7ede20, 0x37516: 0x6c7ee020, 0x37517: 0x6c7ee220, - 0x37518: 0x6c7ee420, 0x37519: 0x6c7ee620, 0x3751a: 0x6c7ee820, 0x3751b: 0x6c7eea20, - 0x3751c: 0x6c7eec20, 0x3751d: 0x6c7eee20, 0x3751e: 0x6c7ef020, 0x3751f: 0x6c7ef220, - 0x37520: 0x6ca79420, 0x37521: 0x6ca79620, 0x37522: 0x6ca79820, 0x37523: 0x6ca79a20, - 0x37524: 0x6ca79c20, 0x37525: 0x6ca79e20, 0x37526: 0x6ca7a020, 0x37527: 0x6ca7a220, - 0x37528: 0x6ca7a420, 0x37529: 0x6ca7a620, 0x3752a: 0x6ca7a820, 0x3752b: 0x6ca7aa20, - 0x3752c: 0x6ca7ac20, 0x3752d: 0x6ca7ae20, 0x3752e: 0x6ca7b020, 0x3752f: 0x6ca7b220, - 0x37530: 0x6ca7b420, 0x37531: 0x6ca7b620, 0x37532: 0x6ca7b820, 0x37533: 0x6ca7ba20, - 0x37534: 0x6ca7bc20, 0x37535: 0x6ca7be20, 0x37536: 0x6cd5ba20, 0x37537: 0x6cd5bc20, - 0x37538: 0x6cd5be20, 0x37539: 0x6cd5c020, 0x3753a: 0x6cd5c220, 0x3753b: 0x6cd5c420, - 0x3753c: 0x6cd5c620, 0x3753d: 0x6cd5c820, 0x3753e: 0x6cd5ca20, 0x3753f: 0x6cd5cc20, - // Block 0xdd5, offset 0x37540 - 0x37540: 0x6cd5ce20, 0x37541: 0x6cd5d020, 0x37542: 0x6cd5d220, 0x37543: 0x6cd5d420, - 0x37544: 0x6cd5d620, 0x37545: 0x6cd5d820, 0x37546: 0x6cd5da20, 0x37547: 0x6cd5dc20, - 0x37548: 0x6cd5de20, 0x37549: 0x6cd5e020, 0x3754a: 0x6cd5e220, 0x3754b: 0x6cd5e420, - 0x3754c: 0x6cd5e620, 0x3754d: 0x6cd5e820, 0x3754e: 0x6cd5ea20, 0x3754f: 0x6cd5ec20, - 0x37550: 0x6cd5ee20, 0x37551: 0x6cd5f020, 0x37552: 0x6cd5f220, 0x37553: 0x6cd5f420, - 0x37554: 0x6cd5f620, 0x37555: 0x6cd5f820, 0x37556: 0x6cd5fa20, 0x37557: 0x6cd5fc20, - 0x37558: 0x6cd5fe20, 0x37559: 0x6cd60020, 0x3755a: 0x6cd60220, 0x3755b: 0x6d044620, - 0x3755c: 0x6d044820, 0x3755d: 0x6d044a20, 0x3755e: 0x6d044c20, 0x3755f: 0x6d044e20, - 0x37560: 0x6d045020, 0x37561: 0x6d045220, 0x37562: 0x6d045420, 0x37563: 0x6d045620, - 0x37564: 0x6d045820, 0x37565: 0x6d045a20, 0x37566: 0x6d045c20, 0x37567: 0x6d045e20, - 0x37568: 0x6d046020, 0x37569: 0x6d046220, 0x3756a: 0x6d046420, 0x3756b: 0x6d046620, - 0x3756c: 0x6d046820, 0x3756d: 0x6d046a20, 0x3756e: 0x6d046c20, 0x3756f: 0x6d046e20, - 0x37570: 0x6d047020, 0x37571: 0x6d047220, 0x37572: 0x6d047420, 0x37573: 0x6d047620, - 0x37574: 0x6d047820, 0x37575: 0x6d047a20, 0x37576: 0x6d047c20, 0x37577: 0x6d047e20, - 0x37578: 0x6d31d420, 0x37579: 0x6d31d620, 0x3757a: 0x6d31d820, 0x3757b: 0x6d31da20, - 0x3757c: 0x6d31dc20, 0x3757d: 0x6d31de20, 0x3757e: 0x6d31e020, 0x3757f: 0x6d31e220, - // Block 0xdd6, offset 0x37580 - 0x37580: 0x6d31e420, 0x37581: 0x6d31e620, 0x37582: 0x6d31e820, 0x37583: 0x6d31ea20, - 0x37584: 0x6d31ec20, 0x37585: 0x6d31ee20, 0x37586: 0x6d31f020, 0x37587: 0x6d31f220, - 0x37588: 0x6d31f420, 0x37589: 0x6d31f620, 0x3758a: 0x6d31f820, 0x3758b: 0x6d31fa20, - 0x3758c: 0x6d31fc20, 0x3758d: 0x6d31fe20, 0x3758e: 0x6d320020, 0x3758f: 0x6d320220, - 0x37590: 0x6d5e7e20, 0x37591: 0x6d5e8020, 0x37592: 0x6d5e8220, 0x37593: 0x6d5e8420, - 0x37594: 0x6d5e8620, 0x37595: 0x6d5e8820, 0x37596: 0x6d5e8a20, 0x37597: 0x6d5e8c20, - 0x37598: 0x6d5e8e20, 0x37599: 0x6d5e9020, 0x3759a: 0x6d5e9220, 0x3759b: 0x6d5e9420, - 0x3759c: 0x6d5e9620, 0x3759d: 0x6d5e9820, 0x3759e: 0x6d5e9a20, 0x3759f: 0x6d5e9c20, - 0x375a0: 0x6d5e9e20, 0x375a1: 0x6d5ea020, 0x375a2: 0x6d627c20, 0x375a3: 0x6d5ea220, - 0x375a4: 0x6d5ea420, 0x375a5: 0x6d5ea620, 0x375a6: 0x6d5ea820, 0x375a7: 0x6d5eaa20, - 0x375a8: 0x6d5eac20, 0x375a9: 0x6d5eae20, 0x375aa: 0x6d5eb020, 0x375ab: 0x6d5eb220, - 0x375ac: 0x6d88da20, 0x375ad: 0x6d88dc20, 0x375ae: 0x6d88de20, 0x375af: 0x6d88e020, - 0x375b0: 0x6d88e220, 0x375b1: 0x6d88e420, 0x375b2: 0x6d88e620, 0x375b3: 0x6d88e820, - 0x375b4: 0x6d88ea20, 0x375b5: 0x6d88ec20, 0x375b6: 0x6d88ee20, 0x375b7: 0x6d88f020, - 0x375b8: 0x6d88f220, 0x375b9: 0x6d88f420, 0x375ba: 0x6d88f620, 0x375bb: 0x6d88f820, - 0x375bc: 0x6dad5a20, 0x375bd: 0x6d88fa20, 0x375be: 0x6d88fc20, 0x375bf: 0x6d88fe20, - // Block 0xdd7, offset 0x375c0 - 0x375c0: 0x6d890020, 0x375c1: 0x6d890220, 0x375c2: 0x6d890420, 0x375c3: 0x6d890620, - 0x375c4: 0x6d890820, 0x375c5: 0x6d890a20, 0x375c6: 0x6d890c20, 0x375c7: 0x6d890e20, - 0x375c8: 0x6d891020, 0x375c9: 0x6d891220, 0x375ca: 0x6d891420, 0x375cb: 0x6d891620, - 0x375cc: 0x6dad5c20, 0x375cd: 0x6dad5e20, 0x375ce: 0x6dad6020, 0x375cf: 0x6dad6220, - 0x375d0: 0x6dad6420, 0x375d1: 0x6dad6620, 0x375d2: 0x6dad6820, 0x375d3: 0x6dad6a20, - 0x375d4: 0x6dad6c20, 0x375d5: 0x6dad6e20, 0x375d6: 0x6dad7020, 0x375d7: 0x6dad7220, - 0x375d8: 0x6dad7420, 0x375d9: 0x6dad7620, 0x375da: 0x6dad7820, 0x375db: 0x6dad7a20, - 0x375dc: 0x6dad7c20, 0x375dd: 0x6dad7e20, 0x375de: 0x6dad8020, 0x375df: 0x6dad8220, - 0x375e0: 0x6dcd2420, 0x375e1: 0x6dcd2620, 0x375e2: 0x6dcd2820, 0x375e3: 0x6dcd2a20, - 0x375e4: 0x6dcd2c20, 0x375e5: 0x6dcd2e20, 0x375e6: 0x6dcd3020, 0x375e7: 0x6dcd3220, - 0x375e8: 0x6dcd3420, 0x375e9: 0x6dad8420, 0x375ea: 0x6de7f820, 0x375eb: 0x6de7fa20, - 0x375ec: 0x6de7fc20, 0x375ed: 0x6de7fe20, 0x375ee: 0x6de80020, 0x375ef: 0x6de80220, - 0x375f0: 0x6dfe8820, 0x375f1: 0x6dfe8a20, 0x375f2: 0x6de80420, 0x375f3: 0x6dfe8c20, - 0x375f4: 0x6dfe8e20, 0x375f5: 0x6e10e420, 0x375f6: 0x6dfe9020, 0x375f7: 0x6dfe9220, - 0x375f8: 0x6dfe9420, 0x375f9: 0x6dfe9620, 0x375fa: 0x6dfe9820, 0x375fb: 0x6e10e620, - 0x375fc: 0x6e10e820, 0x375fd: 0x6e10ea20, 0x375fe: 0x6e10ec20, 0x375ff: 0x6e10ee20, - // Block 0xdd8, offset 0x37600 - 0x37600: 0x6e10f020, 0x37601: 0x6e10f220, 0x37602: 0x6e10f420, 0x37603: 0x6e10f620, - 0x37604: 0x6e10f820, 0x37605: 0x6e10fa20, 0x37606: 0x6e10fc20, 0x37607: 0x6e10fe20, - 0x37608: 0x6e110020, 0x37609: 0x6e1f7a20, 0x3760a: 0x6e2abc20, 0x3760b: 0x6e2abe20, - 0x3760c: 0x6e334620, 0x3760d: 0x6e334820, 0x3760e: 0x6e395620, 0x3760f: 0x6e334a20, - 0x37610: 0x6e334c20, 0x37611: 0x6e334e20, 0x37612: 0x6e395820, 0x37613: 0x6e3daa20, - 0x37614: 0x6e444e20, 0x37615: 0x6c258e20, 0x37616: 0x6c259020, 0x37617: 0x6c3d9420, - 0x37618: 0x6c3d9620, 0x37619: 0x6c5be620, 0x3761a: 0x6c5be820, 0x3761b: 0x6c5bea20, - 0x3761c: 0x6c5bec20, 0x3761d: 0x6c5bee20, 0x3761e: 0x6c5bf020, 0x3761f: 0x6c5bf220, - 0x37620: 0x6c7f0c20, 0x37621: 0x6c7f0e20, 0x37622: 0x6c7f1020, 0x37623: 0x6c7f1220, - 0x37624: 0x6c7f1420, 0x37625: 0x6c7f1620, 0x37626: 0x6c7f1820, 0x37627: 0x6c7f1a20, - 0x37628: 0x6c7f1c20, 0x37629: 0x6c7f1e20, 0x3762a: 0x6c7f2020, 0x3762b: 0x6c7f2220, - 0x3762c: 0x6c7f2420, 0x3762d: 0x6c7f2620, 0x3762e: 0x6c7f2820, 0x3762f: 0x6c7f2a20, - 0x37630: 0x6c7f2c20, 0x37631: 0x6ca7ca20, 0x37632: 0x6ca7cc20, 0x37633: 0x6ca7ce20, - 0x37634: 0x6ca7d020, 0x37635: 0x6ca7d220, 0x37636: 0x6ca7d420, 0x37637: 0x6ca7d620, - 0x37638: 0x6ca7d820, 0x37639: 0x6ca7da20, 0x3763a: 0x6ca7dc20, 0x3763b: 0x6ca7de20, - 0x3763c: 0x6ca7e020, 0x3763d: 0x6ca7e220, 0x3763e: 0x6cd61a20, 0x3763f: 0x6cd61c20, - // Block 0xdd9, offset 0x37640 - 0x37640: 0x6cd61e20, 0x37641: 0x6cd62020, 0x37642: 0x6cd62220, 0x37643: 0x6cd62420, - 0x37644: 0x6cd62620, 0x37645: 0x6cd62820, 0x37646: 0x6cd62a20, 0x37647: 0x6cd62c20, - 0x37648: 0x6cd62e20, 0x37649: 0x6cd63020, 0x3764a: 0x6d049620, 0x3764b: 0x6d049820, - 0x3764c: 0x6d049a20, 0x3764d: 0x6d049c20, 0x3764e: 0x6d049e20, 0x3764f: 0x6d04a020, - 0x37650: 0x6d04a220, 0x37651: 0x6d04a420, 0x37652: 0x6d04a620, 0x37653: 0x6d04a820, - 0x37654: 0x6d04aa20, 0x37655: 0x6d04ac20, 0x37656: 0x6d04ae20, 0x37657: 0x6d04b020, - 0x37658: 0x6d321020, 0x37659: 0x6d321220, 0x3765a: 0x6d321420, 0x3765b: 0x6d321620, - 0x3765c: 0x6d321820, 0x3765d: 0x6d321a20, 0x3765e: 0x6d321c20, 0x3765f: 0x6d321e20, - 0x37660: 0x6d322020, 0x37661: 0x6d322220, 0x37662: 0x6d322420, 0x37663: 0x6d322620, - 0x37664: 0x6d322820, 0x37665: 0x6d5eb620, 0x37666: 0x6d5eb820, 0x37667: 0x6d5eba20, - 0x37668: 0x6d5ebc20, 0x37669: 0x6d5ebe20, 0x3766a: 0x6d5ec020, 0x3766b: 0x6d5ec220, - 0x3766c: 0x6d5ec420, 0x3766d: 0x6d892420, 0x3766e: 0x6d892620, 0x3766f: 0x6dad9020, - 0x37670: 0x6d892820, 0x37671: 0x6d892a20, 0x37672: 0x6dad9220, 0x37673: 0x6dad9420, - 0x37674: 0x6dad9620, 0x37675: 0x6dad9820, 0x37676: 0x6dad9a20, 0x37677: 0x6dad9c20, - 0x37678: 0x6dad9e20, 0x37679: 0x6dada020, 0x3767a: 0x6de80820, 0x3767b: 0x6dada220, - 0x3767c: 0x6dcd3c20, 0x3767d: 0x6dcd3e20, 0x3767e: 0x6dcd4020, 0x3767f: 0x6dcd4220, - // Block 0xdda, offset 0x37680 - 0x37680: 0x6dcd4420, 0x37681: 0x6dcd4620, 0x37682: 0x6dc73620, 0x37683: 0x6dcd4820, - 0x37684: 0x6dcd4a20, 0x37685: 0x6de80a20, 0x37686: 0x6de80c20, 0x37687: 0x6de80e20, - 0x37688: 0x6dfe9e20, 0x37689: 0x6dfea020, 0x3768a: 0x6dfea220, 0x3768b: 0x6dfea420, - 0x3768c: 0x6dfea620, 0x3768d: 0x6dfea820, 0x3768e: 0x6e110220, 0x3768f: 0x6e110420, - 0x37690: 0x6e1f8020, 0x37691: 0x6e1f8220, 0x37692: 0x6e395a20, 0x37693: 0x6e2ac220, - 0x37694: 0x6e335020, 0x37695: 0x6e395c20, 0x37696: 0x6e395e20, 0x37697: 0x6c141220, - 0x37698: 0x6c259420, 0x37699: 0x6c3d9e20, 0x3769a: 0x6c3da020, 0x3769b: 0x6c3da220, - 0x3769c: 0x6c3da420, 0x3769d: 0x6c5c0820, 0x3769e: 0x6c5c0a20, 0x3769f: 0x6c5c0c20, - 0x376a0: 0x6c5c0e20, 0x376a1: 0x6c5c1020, 0x376a2: 0x6c5c1220, 0x376a3: 0x6c5c1420, - 0x376a4: 0x6c5c1620, 0x376a5: 0x6c5c1820, 0x376a6: 0x6c5c1a20, 0x376a7: 0x6c5c1c20, - 0x376a8: 0x6c5c1e20, 0x376a9: 0x6c5c2020, 0x376aa: 0x6c5c2220, 0x376ab: 0x6c5c2420, - 0x376ac: 0x6c5c2620, 0x376ad: 0x6c5c2820, 0x376ae: 0x6c5c2a20, 0x376af: 0x6c7f6220, - 0x376b0: 0x6c7f6420, 0x376b1: 0x6c7f6620, 0x376b2: 0x6c7f6820, 0x376b3: 0x6c7f6a20, - 0x376b4: 0x6c7f6c20, 0x376b5: 0x6c7f6e20, 0x376b6: 0x6c7f7020, 0x376b7: 0x6c7f7220, - 0x376b8: 0x6c7f7420, 0x376b9: 0x6c7f7620, 0x376ba: 0x6c7f7820, 0x376bb: 0x6c7f7a20, - 0x376bc: 0x6c7f7c20, 0x376bd: 0x6c7f7e20, 0x376be: 0x6c7f8020, 0x376bf: 0x6c7f8220, - // Block 0xddb, offset 0x376c0 - 0x376c0: 0x6c7f8420, 0x376c1: 0x6c7f8620, 0x376c2: 0x6c7f8820, 0x376c3: 0x6c7f8a20, - 0x376c4: 0x6c7f8c20, 0x376c5: 0x6c7f8e20, 0x376c6: 0x6c7f9020, 0x376c7: 0x6c7f9220, - 0x376c8: 0x6c7f9420, 0x376c9: 0x6c7f9620, 0x376ca: 0x6c7f9820, 0x376cb: 0x6c7f9a20, - 0x376cc: 0x6ca84c20, 0x376cd: 0x6ca84e20, 0x376ce: 0x6ca85020, 0x376cf: 0x6ca85220, - 0x376d0: 0x6ca85420, 0x376d1: 0x6ca85620, 0x376d2: 0x6ca85820, 0x376d3: 0x6ca85a20, - 0x376d4: 0x6ca85c20, 0x376d5: 0x6ca85e20, 0x376d6: 0x6ca86020, 0x376d7: 0x6ca86220, - 0x376d8: 0x6ca86420, 0x376d9: 0x6ca86620, 0x376da: 0x6ca86820, 0x376db: 0x6ca86a20, - 0x376dc: 0x6ca86c20, 0x376dd: 0x6ca86e20, 0x376de: 0x6ca87020, 0x376df: 0x6ca87220, - 0x376e0: 0x6ca87420, 0x376e1: 0x6ca87620, 0x376e2: 0x6ca87820, 0x376e3: 0x6ca87a20, - 0x376e4: 0x6ca87c20, 0x376e5: 0x6ca87e20, 0x376e6: 0x6ca88020, 0x376e7: 0x6ca88220, - 0x376e8: 0x6ca88420, 0x376e9: 0x6ca88620, 0x376ea: 0x6cd69020, 0x376eb: 0x6cd69220, - 0x376ec: 0x6cd69420, 0x376ed: 0x6cd69620, 0x376ee: 0x6cd69820, 0x376ef: 0x6cd69a20, - 0x376f0: 0x6cd69c20, 0x376f1: 0x6cd69e20, 0x376f2: 0x6cd6a020, 0x376f3: 0x6cd6a220, - 0x376f4: 0x6cd6a420, 0x376f5: 0x6cd6a620, 0x376f6: 0x6cd6a820, 0x376f7: 0x6cd6aa20, - 0x376f8: 0x6cd6ac20, 0x376f9: 0x6cd6ae20, 0x376fa: 0x6cd6b020, 0x376fb: 0x6cd6b220, - 0x376fc: 0x6cd6b420, 0x376fd: 0x6cd6b620, 0x376fe: 0x6cd6b820, 0x376ff: 0x6ca88820, - // Block 0xddc, offset 0x37700 - 0x37700: 0x6cd6ba20, 0x37701: 0x6cd6bc20, 0x37702: 0x6cd6be20, 0x37703: 0x6cd6c020, - 0x37704: 0x6cd6c220, 0x37705: 0x6cd6c420, 0x37706: 0x6cd6c620, 0x37707: 0x6cd6c820, - 0x37708: 0x6cd6ca20, 0x37709: 0x6cd6cc20, 0x3770a: 0x6cd6ce20, 0x3770b: 0x6cd6d020, - 0x3770c: 0x6cd6d220, 0x3770d: 0x6cd6d420, 0x3770e: 0x6cd6d620, 0x3770f: 0x6cd6d820, - 0x37710: 0x6d051220, 0x37711: 0x6d051420, 0x37712: 0x6d051620, 0x37713: 0x6d051820, - 0x37714: 0x6d051a20, 0x37715: 0x6d051c20, 0x37716: 0x6d051e20, 0x37717: 0x6d052020, - 0x37718: 0x6d052220, 0x37719: 0x6d052420, 0x3771a: 0x6d052620, 0x3771b: 0x6d052820, - 0x3771c: 0x6d052a20, 0x3771d: 0x6d052c20, 0x3771e: 0x6d052e20, 0x3771f: 0x6d053020, - 0x37720: 0x6d053220, 0x37721: 0x6d053420, 0x37722: 0x6d053620, 0x37723: 0x6d053820, - 0x37724: 0x6d053a20, 0x37725: 0x6d053c20, 0x37726: 0x6d053e20, 0x37727: 0x6d054020, - 0x37728: 0x6d054220, 0x37729: 0x6d054420, 0x3772a: 0x6d054620, 0x3772b: 0x6d054820, - 0x3772c: 0x6d054a20, 0x3772d: 0x6d054c20, 0x3772e: 0x6d054e20, 0x3772f: 0x6d055020, - 0x37730: 0x6d055220, 0x37731: 0x6d055420, 0x37732: 0x6d055620, 0x37733: 0x6d055820, - 0x37734: 0x6d055a20, 0x37735: 0x6d055c20, 0x37736: 0x6d055e20, 0x37737: 0x6d056020, - 0x37738: 0x6d056220, 0x37739: 0x6d056420, 0x3773a: 0x6d056620, 0x3773b: 0x6d056820, - 0x3773c: 0x6d056a20, 0x3773d: 0x6d056c20, 0x3773e: 0x6d056e20, 0x3773f: 0x6d057020, - // Block 0xddd, offset 0x37740 - 0x37740: 0x6d057220, 0x37741: 0x6d057420, 0x37742: 0x6d057620, 0x37743: 0x6d057820, - 0x37744: 0x6d057a20, 0x37745: 0x6d057c20, 0x37746: 0x6d057e20, 0x37747: 0x6d058020, - 0x37748: 0x6d058220, 0x37749: 0x6d058420, 0x3774a: 0x6d058620, 0x3774b: 0x6d058820, - 0x3774c: 0x6d058a20, 0x3774d: 0x6d32a220, 0x3774e: 0x6d32a420, 0x3774f: 0x6d32a620, - 0x37750: 0x6d32a820, 0x37751: 0x6d32aa20, 0x37752: 0x6d32ac20, 0x37753: 0x6d32ae20, - 0x37754: 0x6d32b020, 0x37755: 0x6d32b220, 0x37756: 0x6d32b420, 0x37757: 0x6d32b620, - 0x37758: 0x6d32b820, 0x37759: 0x6d32ba20, 0x3775a: 0x6d32bc20, 0x3775b: 0x6d32be20, - 0x3775c: 0x6d32c020, 0x3775d: 0x6d32c220, 0x3775e: 0x6d32c420, 0x3775f: 0x6d32c620, - 0x37760: 0x6d32c820, 0x37761: 0x6d32ca20, 0x37762: 0x6d32cc20, 0x37763: 0x6d32ce20, - 0x37764: 0x6d32d020, 0x37765: 0x6d32d220, 0x37766: 0x6d32d420, 0x37767: 0x6d32d620, - 0x37768: 0x6d32d820, 0x37769: 0x6d32da20, 0x3776a: 0x6d32dc20, 0x3776b: 0x6d32de20, - 0x3776c: 0x6d32e020, 0x3776d: 0x6d32e220, 0x3776e: 0x6d32e420, 0x3776f: 0x6d32e620, - 0x37770: 0x6d32e820, 0x37771: 0x6d32ea20, 0x37772: 0x6d32ec20, 0x37773: 0x6d32ee20, - 0x37774: 0x6d32f020, 0x37775: 0x6d32f220, 0x37776: 0x6d32f420, 0x37777: 0x6d32f620, - 0x37778: 0x6d32f820, 0x37779: 0x6d32fa20, 0x3777a: 0x6d32fc20, 0x3777b: 0x6d32fe20, - 0x3777c: 0x6d330020, 0x3777d: 0x6d330220, 0x3777e: 0x6d330420, 0x3777f: 0x6d330620, - // Block 0xdde, offset 0x37780 - 0x37780: 0x6d330820, 0x37781: 0x6d330a20, 0x37782: 0x6d330c20, 0x37783: 0x6d330e20, - 0x37784: 0x6d331020, 0x37785: 0x6d331220, 0x37786: 0x6d331420, 0x37787: 0x6d331620, - 0x37788: 0x6d331820, 0x37789: 0x6d331a20, 0x3778a: 0x6d331c20, 0x3778b: 0x6d331e20, - 0x3778c: 0x6d332020, 0x3778d: 0x6d332220, 0x3778e: 0x6d332420, 0x3778f: 0x6d332620, - 0x37790: 0x6d332820, 0x37791: 0x6d5f4e20, 0x37792: 0x6d5f5020, 0x37793: 0x6d5f5220, - 0x37794: 0x6d5f5420, 0x37795: 0x6d5f5620, 0x37796: 0x6d5f5820, 0x37797: 0x6d5f5a20, - 0x37798: 0x6d5f5c20, 0x37799: 0x6d5f5e20, 0x3779a: 0x6d5f6020, 0x3779b: 0x6d5f6220, - 0x3779c: 0x6d5f6420, 0x3779d: 0x6d5f6620, 0x3779e: 0x6d5f6820, 0x3779f: 0x6d5f6a20, - 0x377a0: 0x6d5f6c20, 0x377a1: 0x6d5f6e20, 0x377a2: 0x6d5f7020, 0x377a3: 0x6d5f7220, - 0x377a4: 0x6d5f7420, 0x377a5: 0x6d5f7620, 0x377a6: 0x6d5f7820, 0x377a7: 0x6d5f7a20, - 0x377a8: 0x6d5f7c20, 0x377a9: 0x6d5f7e20, 0x377aa: 0x6d5f8020, 0x377ab: 0x6d5f8220, - 0x377ac: 0x6d5f8420, 0x377ad: 0x6d5f8620, 0x377ae: 0x6d5f8820, 0x377af: 0x6d5f8a20, - 0x377b0: 0x6d5f8c20, 0x377b1: 0x6d5f8e20, 0x377b2: 0x6d5f9020, 0x377b3: 0x6d5f9220, - 0x377b4: 0x6d5f9420, 0x377b5: 0x6d5f9620, 0x377b6: 0x6d5f9820, 0x377b7: 0x6d5f9a20, - 0x377b8: 0x6d5f9c20, 0x377b9: 0x6d5f9e20, 0x377ba: 0x6d5fa020, 0x377bb: 0x6d5fa220, - 0x377bc: 0x6d5fa420, 0x377bd: 0x6d5fa620, 0x377be: 0x6d5fa820, 0x377bf: 0x6d5faa20, - // Block 0xddf, offset 0x377c0 - 0x377c0: 0x6d5fac20, 0x377c1: 0x6d5fae20, 0x377c2: 0x6d5fb020, 0x377c3: 0x6d5fb220, - 0x377c4: 0x6d5fb420, 0x377c5: 0x6d5fb620, 0x377c6: 0x6d5fb820, 0x377c7: 0x6d5fba20, - 0x377c8: 0x6d5fbc20, 0x377c9: 0x6d5fbe20, 0x377ca: 0x6d5fc020, 0x377cb: 0x6d5fc220, - 0x377cc: 0x6d5fc420, 0x377cd: 0x6d5fc620, 0x377ce: 0x6d5fc820, 0x377cf: 0x6d5fca20, - 0x377d0: 0x6d5fcc20, 0x377d1: 0x6d5fce20, 0x377d2: 0x6d5fd020, 0x377d3: 0x6d5fd220, - 0x377d4: 0x6d5fd420, 0x377d5: 0x6d5fd620, 0x377d6: 0x6d5fd820, 0x377d7: 0x6d5fda20, - 0x377d8: 0x6d898620, 0x377d9: 0x6d898820, 0x377da: 0x6d898a20, 0x377db: 0x6d898c20, - 0x377dc: 0x6d898e20, 0x377dd: 0x6d899020, 0x377de: 0x6d899220, 0x377df: 0x6d899420, - 0x377e0: 0x6d899620, 0x377e1: 0x6d899820, 0x377e2: 0x6d899a20, 0x377e3: 0x6d899c20, - 0x377e4: 0x6d899e20, 0x377e5: 0x6d89a020, 0x377e6: 0x6d89a220, 0x377e7: 0x6d89a420, - 0x377e8: 0x6d89a620, 0x377e9: 0x6d89a820, 0x377ea: 0x6d89aa20, 0x377eb: 0x6d89ac20, - 0x377ec: 0x6d89ae20, 0x377ed: 0x6d89b020, 0x377ee: 0x6d89b220, 0x377ef: 0x6d89b420, - 0x377f0: 0x6d89b620, 0x377f1: 0x6d89b820, 0x377f2: 0x6d89ba20, 0x377f3: 0x6d89bc20, - 0x377f4: 0x6d89be20, 0x377f5: 0x6d89c020, 0x377f6: 0x6d89c220, 0x377f7: 0x6d89c420, - 0x377f8: 0x6d89c620, 0x377f9: 0x6d89c820, 0x377fa: 0x6d89ca20, 0x377fb: 0x6d89cc20, - 0x377fc: 0x6d89ce20, 0x377fd: 0x6d89d020, 0x377fe: 0x6d89d220, 0x377ff: 0x6d89d420, - // Block 0xde0, offset 0x37800 - 0x37800: 0x6d89d620, 0x37801: 0x6d89d820, 0x37802: 0x6d89da20, 0x37803: 0x6d89dc20, - 0x37804: 0x6d89de20, 0x37805: 0x6d89e020, 0x37806: 0x6d89e220, 0x37807: 0x6d89e420, - 0x37808: 0x6d89e620, 0x37809: 0x6d89e820, 0x3780a: 0x6d89ea20, 0x3780b: 0x6d89ec20, - 0x3780c: 0x6d89ee20, 0x3780d: 0x6d89f020, 0x3780e: 0x6d89f220, 0x3780f: 0x6d89f420, - 0x37810: 0x6d89f620, 0x37811: 0x6d89f820, 0x37812: 0x6d89fa20, 0x37813: 0x6d89fc20, - 0x37814: 0x6d89fe20, 0x37815: 0x6d8a0020, 0x37816: 0x6d8a0220, 0x37817: 0x6d8a0420, - 0x37818: 0x6d8a0620, 0x37819: 0x6d8a0820, 0x3781a: 0x6d8a0a20, 0x3781b: 0x6d8a0c20, - 0x3781c: 0x6d8a0e20, 0x3781d: 0x6d8a1020, 0x3781e: 0x6d8a1220, 0x3781f: 0x6d8a1420, - 0x37820: 0x6d8a1620, 0x37821: 0x6d8a1820, 0x37822: 0x6d8a1a20, 0x37823: 0x6d8a1c20, - 0x37824: 0x6d8a1e20, 0x37825: 0x6d8a2020, 0x37826: 0x6d8a2220, 0x37827: 0x6d8a2420, - 0x37828: 0x6d8a2620, 0x37829: 0x6d8a2820, 0x3782a: 0x6d8a2a20, 0x3782b: 0x6d8a2c20, - 0x3782c: 0x6d8a2e20, 0x3782d: 0x6d8a3020, 0x3782e: 0x6d8a3220, 0x3782f: 0x6d8a3420, - 0x37830: 0x6d8a3620, 0x37831: 0x6d8a3820, 0x37832: 0x6d8a3a20, 0x37833: 0x6d8a3c20, - 0x37834: 0x6d8a3e20, 0x37835: 0x6dae1220, 0x37836: 0x6dae1420, 0x37837: 0x6dae1620, - 0x37838: 0x6dae1820, 0x37839: 0x6dae1a20, 0x3783a: 0x6dae1c20, 0x3783b: 0x6dae1e20, - 0x3783c: 0x6dae2020, 0x3783d: 0x6dae2220, 0x3783e: 0x6dae2420, 0x3783f: 0x6dae2620, - // Block 0xde1, offset 0x37840 - 0x37840: 0x6dae2820, 0x37841: 0x6dae2a20, 0x37842: 0x6dae2c20, 0x37843: 0x6dae2e20, - 0x37844: 0x6dae3020, 0x37845: 0x6dae3220, 0x37846: 0x6dae3420, 0x37847: 0x6dae3620, - 0x37848: 0x6dae3820, 0x37849: 0x6dae3a20, 0x3784a: 0x6dae3c20, 0x3784b: 0x6dae3e20, - 0x3784c: 0x6dae4020, 0x3784d: 0x6dae4220, 0x3784e: 0x6dae4420, 0x3784f: 0x6dae4620, - 0x37850: 0x6dae4820, 0x37851: 0x6dae4a20, 0x37852: 0x6dae4c20, 0x37853: 0x6dae4e20, - 0x37854: 0x6dae5020, 0x37855: 0x6dae5220, 0x37856: 0x6dae5420, 0x37857: 0x6dae5620, - 0x37858: 0x6dae5820, 0x37859: 0x6dae5a20, 0x3785a: 0x6dae5c20, 0x3785b: 0x6dae5e20, - 0x3785c: 0x6dae6020, 0x3785d: 0x6dae6220, 0x3785e: 0x6dae6420, 0x3785f: 0x6dae6620, - 0x37860: 0x6dae6820, 0x37861: 0x6dae6a20, 0x37862: 0x6dae6c20, 0x37863: 0x6dae6e20, - 0x37864: 0x6dae7020, 0x37865: 0x6dae7220, 0x37866: 0x6dae7420, 0x37867: 0x6dae7620, - 0x37868: 0x6dae7820, 0x37869: 0x6dae7a20, 0x3786a: 0x6dae7c20, 0x3786b: 0x6dae7e20, - 0x3786c: 0x6dae8020, 0x3786d: 0x6dae8220, 0x3786e: 0x6dae8420, 0x3786f: 0x6dae8620, - 0x37870: 0x6dae8820, 0x37871: 0x6dae8a20, 0x37872: 0x6dae8c20, 0x37873: 0x6dae8e20, - 0x37874: 0x6dae9020, 0x37875: 0x6dae9220, 0x37876: 0x6dae9420, 0x37877: 0x6dae9620, - 0x37878: 0x6dae9820, 0x37879: 0x6dae9a20, 0x3787a: 0x6dae9c20, 0x3787b: 0x6dae9e20, - 0x3787c: 0x6daea020, 0x3787d: 0x6daea220, 0x3787e: 0x6daea420, 0x3787f: 0x6daea620, - // Block 0xde2, offset 0x37880 - 0x37880: 0x6daea820, 0x37881: 0x6dcda420, 0x37882: 0x6daeaa20, 0x37883: 0x6daeac20, - 0x37884: 0x6daeae20, 0x37885: 0x6daeb020, 0x37886: 0x6dcda620, 0x37887: 0x6dcda820, - 0x37888: 0x6dcdaa20, 0x37889: 0x6dcdac20, 0x3788a: 0x6dcdae20, 0x3788b: 0x6dcdb020, - 0x3788c: 0x6dcdb220, 0x3788d: 0x6dcdb420, 0x3788e: 0x6dcdb620, 0x3788f: 0x6dcdb820, - 0x37890: 0x6dcdba20, 0x37891: 0x6dcdbc20, 0x37892: 0x6dcdbe20, 0x37893: 0x6dcdc020, - 0x37894: 0x6dcdc220, 0x37895: 0x6dcdc420, 0x37896: 0x6dcdc620, 0x37897: 0x6dcdc820, - 0x37898: 0x6dcdca20, 0x37899: 0x6dcdcc20, 0x3789a: 0x6dcdce20, 0x3789b: 0x6dcdd020, - 0x3789c: 0x6dcdd220, 0x3789d: 0x6dcdd420, 0x3789e: 0x6dcdd620, 0x3789f: 0x6dcdd820, - 0x378a0: 0x6dcdda20, 0x378a1: 0x6dcddc20, 0x378a2: 0x6dcdde20, 0x378a3: 0x6dcde020, - 0x378a4: 0x6dcde220, 0x378a5: 0x6dcde420, 0x378a6: 0x6dcde620, 0x378a7: 0x6dcde820, - 0x378a8: 0x6dcdea20, 0x378a9: 0x6dcdec20, 0x378aa: 0x6dcdee20, 0x378ab: 0x6dcdf020, - 0x378ac: 0x6dcdf220, 0x378ad: 0x6dcdf420, 0x378ae: 0x6dcdf620, 0x378af: 0x6dcdf820, - 0x378b0: 0x6dcdfa20, 0x378b1: 0x6dcdfc20, 0x378b2: 0x6dcdfe20, 0x378b3: 0x6dce0020, - 0x378b4: 0x6dce0220, 0x378b5: 0x6dce0420, 0x378b6: 0x6dce0620, 0x378b7: 0x6dce0820, - 0x378b8: 0x6dce0a20, 0x378b9: 0x6dce0c20, 0x378ba: 0x6dce0e20, 0x378bb: 0x6dce1020, - 0x378bc: 0x6dce1220, 0x378bd: 0x6dce1420, 0x378be: 0x6dce1620, 0x378bf: 0x6dce1820, - // Block 0xde3, offset 0x378c0 - 0x378c0: 0x6dce1a20, 0x378c1: 0x6dce1c20, 0x378c2: 0x6dce1e20, 0x378c3: 0x6dce2020, - 0x378c4: 0x6dce2220, 0x378c5: 0x6dce2420, 0x378c6: 0x6dce2620, 0x378c7: 0x6dce2820, - 0x378c8: 0x6dce2a20, 0x378c9: 0x6dce2c20, 0x378ca: 0x6dce2e20, 0x378cb: 0x6dce3020, - 0x378cc: 0x6dce3220, 0x378cd: 0x6dce3420, 0x378ce: 0x6daeb220, 0x378cf: 0x6dce3620, - 0x378d0: 0x6dce3820, 0x378d1: 0x6dce3a20, 0x378d2: 0x6dce3c20, 0x378d3: 0x6dce3e20, - 0x378d4: 0x6dce4020, 0x378d5: 0x6dce4220, 0x378d6: 0x6dce4420, 0x378d7: 0x6dce4620, - 0x378d8: 0x6dce4820, 0x378d9: 0x6dce4a20, 0x378da: 0x6dce4c20, 0x378db: 0x6dce4e20, - 0x378dc: 0x6dce5020, 0x378dd: 0x6dce5220, 0x378de: 0x6dce5420, 0x378df: 0x6dce5620, - 0x378e0: 0x6dce5820, 0x378e1: 0x6de84820, 0x378e2: 0x6de84a20, 0x378e3: 0x6de84c20, - 0x378e4: 0x6de84e20, 0x378e5: 0x6de85020, 0x378e6: 0x6de85220, 0x378e7: 0x6de85420, - 0x378e8: 0x6de85620, 0x378e9: 0x6de85820, 0x378ea: 0x6de85a20, 0x378eb: 0x6de85c20, - 0x378ec: 0x6de85e20, 0x378ed: 0x6de86020, 0x378ee: 0x6de86220, 0x378ef: 0x6de86420, - 0x378f0: 0x6de86620, 0x378f1: 0x6de86820, 0x378f2: 0x6de86a20, 0x378f3: 0x6de86c20, - 0x378f4: 0x6de86e20, 0x378f5: 0x6de87020, 0x378f6: 0x6de87220, 0x378f7: 0x6de87420, - 0x378f8: 0x6de87620, 0x378f9: 0x6de87820, 0x378fa: 0x6de87a20, 0x378fb: 0x6de87c20, - 0x378fc: 0x6de87e20, 0x378fd: 0x6de88020, 0x378fe: 0x6de88220, 0x378ff: 0x6de88420, - // Block 0xde4, offset 0x37900 - 0x37900: 0x6de88620, 0x37901: 0x6de88820, 0x37902: 0x6de88a20, 0x37903: 0x6de88c20, - 0x37904: 0x6de88e20, 0x37905: 0x6de89020, 0x37906: 0x6de89220, 0x37907: 0x6de89420, - 0x37908: 0x6de89620, 0x37909: 0x6de89820, 0x3790a: 0x6de89a20, 0x3790b: 0x6de89c20, - 0x3790c: 0x6de89e20, 0x3790d: 0x6de8a020, 0x3790e: 0x6de8a220, 0x3790f: 0x6de8a420, - 0x37910: 0x6de8a620, 0x37911: 0x6de8a820, 0x37912: 0x6de8aa20, 0x37913: 0x6de8ac20, - 0x37914: 0x6de8ae20, 0x37915: 0x6de8b020, 0x37916: 0x6de8b220, 0x37917: 0x6de8b420, - 0x37918: 0x6de8b620, 0x37919: 0x6de8b820, 0x3791a: 0x6de8ba20, 0x3791b: 0x6de8bc20, - 0x3791c: 0x6dfec820, 0x3791d: 0x6dfeca20, 0x3791e: 0x6dfecc20, 0x3791f: 0x6dfece20, - 0x37920: 0x6dfed020, 0x37921: 0x6dfed220, 0x37922: 0x6dfed420, 0x37923: 0x6dfed620, - 0x37924: 0x6dfed820, 0x37925: 0x6dfeda20, 0x37926: 0x6dfedc20, 0x37927: 0x6dfede20, - 0x37928: 0x6dfee020, 0x37929: 0x6dfee220, 0x3792a: 0x6dfee420, 0x3792b: 0x6dfee620, - 0x3792c: 0x6dfee820, 0x3792d: 0x6dfeea20, 0x3792e: 0x6dfeec20, 0x3792f: 0x6dfeee20, - 0x37930: 0x6dfef020, 0x37931: 0x6dfef220, 0x37932: 0x6dfef420, 0x37933: 0x6dfef620, - 0x37934: 0x6dfef820, 0x37935: 0x6dfefa20, 0x37936: 0x6dfefc20, 0x37937: 0x6dfefe20, - 0x37938: 0x6dff0020, 0x37939: 0x6dff0220, 0x3793a: 0x6dff0420, 0x3793b: 0x6dff0620, - 0x3793c: 0x6dff0820, 0x3793d: 0x6dff0a20, 0x3793e: 0x6dff0c20, 0x3793f: 0x6dff0e20, - // Block 0xde5, offset 0x37940 - 0x37940: 0x6dff1020, 0x37941: 0x6dff1220, 0x37942: 0x6dff1420, 0x37943: 0x6dff1620, - 0x37944: 0x6dff1820, 0x37945: 0x6e112220, 0x37946: 0x6e112420, 0x37947: 0x6e112620, - 0x37948: 0x6e112820, 0x37949: 0x6e112a20, 0x3794a: 0x6e112c20, 0x3794b: 0x6e112e20, - 0x3794c: 0x6e113020, 0x3794d: 0x6e113220, 0x3794e: 0x6e113420, 0x3794f: 0x6e113620, - 0x37950: 0x6e113820, 0x37951: 0x6e113a20, 0x37952: 0x6e113c20, 0x37953: 0x6e113e20, - 0x37954: 0x6e114020, 0x37955: 0x6e114220, 0x37956: 0x6e114420, 0x37957: 0x6e114620, - 0x37958: 0x6e114820, 0x37959: 0x6e114a20, 0x3795a: 0x6e114c20, 0x3795b: 0x6e114e20, - 0x3795c: 0x6e115020, 0x3795d: 0x6e115220, 0x3795e: 0x6e115420, 0x3795f: 0x6e115620, - 0x37960: 0x6e115820, 0x37961: 0x6e115a20, 0x37962: 0x6e115c20, 0x37963: 0x6e115e20, - 0x37964: 0x6e116020, 0x37965: 0x6e116220, 0x37966: 0x6e116420, 0x37967: 0x6e116620, - 0x37968: 0x6e116820, 0x37969: 0x6e116a20, 0x3796a: 0x6e116c20, 0x3796b: 0x6e116e20, - 0x3796c: 0x6e117020, 0x3796d: 0x6e117220, 0x3796e: 0x6e117420, 0x3796f: 0x6e117620, - 0x37970: 0x6e117820, 0x37971: 0x6e117a20, 0x37972: 0x6e117c20, 0x37973: 0x6e117e20, - 0x37974: 0x6e118020, 0x37975: 0x6e1fa220, 0x37976: 0x6e1fa420, 0x37977: 0x6e1fa620, - 0x37978: 0x6e1fa820, 0x37979: 0x6e1faa20, 0x3797a: 0x6e1fac20, 0x3797b: 0x6e1fae20, - 0x3797c: 0x6e1fb020, 0x3797d: 0x6e1fb220, 0x3797e: 0x6e1fb420, 0x3797f: 0x6e1fb620, - // Block 0xde6, offset 0x37980 - 0x37980: 0x6e1fb820, 0x37981: 0x6e1fba20, 0x37982: 0x6e1fbc20, 0x37983: 0x6e1fbe20, - 0x37984: 0x6e1fc020, 0x37985: 0x6e1fc220, 0x37986: 0x6e1fc420, 0x37987: 0x6e1fc620, - 0x37988: 0x6e1fc820, 0x37989: 0x6e1fca20, 0x3798a: 0x6e1fcc20, 0x3798b: 0x6e1fce20, - 0x3798c: 0x6e1fd020, 0x3798d: 0x6e1fd220, 0x3798e: 0x6e1fd420, 0x3798f: 0x6e1fd620, - 0x37990: 0x6e1fd820, 0x37991: 0x6e1fda20, 0x37992: 0x6e1fdc20, 0x37993: 0x6e1fde20, - 0x37994: 0x6e2ada20, 0x37995: 0x6e2adc20, 0x37996: 0x6e2ade20, 0x37997: 0x6e2ae020, - 0x37998: 0x6e2ae220, 0x37999: 0x6e2ae420, 0x3799a: 0x6e2ae620, 0x3799b: 0x6e2ae820, - 0x3799c: 0x6e2aea20, 0x3799d: 0x6e2aec20, 0x3799e: 0x6e2aee20, 0x3799f: 0x6e2af020, - 0x379a0: 0x6e2af220, 0x379a1: 0x6e2af420, 0x379a2: 0x6e2af620, 0x379a3: 0x6e2af820, - 0x379a4: 0x6e2afa20, 0x379a5: 0x6e2afc20, 0x379a6: 0x6e2afe20, 0x379a7: 0x6e2b0020, - 0x379a8: 0x6e335620, 0x379a9: 0x6e335820, 0x379aa: 0x6e335a20, 0x379ab: 0x6e335c20, - 0x379ac: 0x6e335e20, 0x379ad: 0x6e336020, 0x379ae: 0x6e336220, 0x379af: 0x6e336420, - 0x379b0: 0x6e336620, 0x379b1: 0x6e336820, 0x379b2: 0x6e336a20, 0x379b3: 0x6e336c20, - 0x379b4: 0x6e336e20, 0x379b5: 0x6e337020, 0x379b6: 0x6e337220, 0x379b7: 0x6e337420, - 0x379b8: 0x6e337620, 0x379b9: 0x6e337820, 0x379ba: 0x6e337a20, 0x379bb: 0x6e337c20, - 0x379bc: 0x6e396a20, 0x379bd: 0x6e396c20, 0x379be: 0x6e396e20, 0x379bf: 0x6e397020, - // Block 0xde7, offset 0x379c0 - 0x379c0: 0x6e397220, 0x379c1: 0x6e397420, 0x379c2: 0x6e397620, 0x379c3: 0x6e397820, - 0x379c4: 0x6e397a20, 0x379c5: 0x6e397c20, 0x379c6: 0x6e397e20, 0x379c7: 0x6e398020, - 0x379c8: 0x6e3db220, 0x379c9: 0x6e3db420, 0x379ca: 0x6e3db620, 0x379cb: 0x6e3db820, - 0x379cc: 0x6e3dba20, 0x379cd: 0x6e3dbc20, 0x379ce: 0x6e3dbe20, 0x379cf: 0x6e3dc020, - 0x379d0: 0x6e409020, 0x379d1: 0x6e409220, 0x379d2: 0x6e409420, 0x379d3: 0x6e409620, - 0x379d4: 0x6e409820, 0x379d5: 0x6e409a20, 0x379d6: 0x6e409c20, 0x379d7: 0x6e42d420, - 0x379d8: 0x6e445020, 0x379d9: 0x6e445220, 0x379da: 0x6e42d620, 0x379db: 0x6e42d820, - 0x379dc: 0x6e42da20, 0x379dd: 0x6e42dc20, 0x379de: 0x6e445420, 0x379df: 0x6e445620, - 0x379e0: 0x6e445820, 0x379e1: 0x6e453620, 0x379e2: 0x6e453820, 0x379e3: 0x6e45c620, - 0x379e4: 0x6e463820, 0x379e5: 0x6c259620, 0x379e6: 0x6c259820, 0x379e7: 0x6c3dae20, - 0x379e8: 0x6c3db020, 0x379e9: 0x6c3db220, 0x379ea: 0x6c3db420, 0x379eb: 0x6c5c4a20, - 0x379ec: 0x6c5c4c20, 0x379ed: 0x6c5c4e20, 0x379ee: 0x6c5c5020, 0x379ef: 0x6c5c5220, - 0x379f0: 0x6c5c5420, 0x379f1: 0x6c5c5620, 0x379f2: 0x6c5c5820, 0x379f3: 0x6c7fcc20, - 0x379f4: 0x6c7fce20, 0x379f5: 0x6c7fd020, 0x379f6: 0x6c7fd220, 0x379f7: 0x6c7fd420, - 0x379f8: 0x6c7fd620, 0x379f9: 0x6c7fd820, 0x379fa: 0x6c7fda20, 0x379fb: 0x6c7fdc20, - 0x379fc: 0x6c7fde20, 0x379fd: 0x6c7fe020, 0x379fe: 0x6c7fe220, 0x379ff: 0x6c7fe420, - // Block 0xde8, offset 0x37a00 - 0x37a00: 0x6c7fe620, 0x37a01: 0x6ca8b620, 0x37a02: 0x6ca8b820, 0x37a03: 0x6ca8ba20, - 0x37a04: 0x6ca8bc20, 0x37a05: 0x6ca8be20, 0x37a06: 0x6ca8c020, 0x37a07: 0x6ca8c220, - 0x37a08: 0x6ca8c420, 0x37a09: 0x6ca8c620, 0x37a0a: 0x6ca8c820, 0x37a0b: 0x6ca8ca20, - 0x37a0c: 0x6ca8cc20, 0x37a0d: 0x6ca8ce20, 0x37a0e: 0x6ca8d020, 0x37a0f: 0x6ca8d220, - 0x37a10: 0x6ca8d420, 0x37a11: 0x6ca8d620, 0x37a12: 0x6ca8d820, 0x37a13: 0x6ca8da20, - 0x37a14: 0x6ca8dc20, 0x37a15: 0x6ca8de20, 0x37a16: 0x6ca8e020, 0x37a17: 0x6cd70a20, - 0x37a18: 0x6ca8e220, 0x37a19: 0x6ca8e420, 0x37a1a: 0x6cd70c20, 0x37a1b: 0x6cd70e20, - 0x37a1c: 0x6cd71020, 0x37a1d: 0x6cd71220, 0x37a1e: 0x6cd71420, 0x37a1f: 0x6cd71620, - 0x37a20: 0x6cd71820, 0x37a21: 0x6cd71a20, 0x37a22: 0x6cd71c20, 0x37a23: 0x6cd71e20, - 0x37a24: 0x6cd72020, 0x37a25: 0x6cd72220, 0x37a26: 0x6cd72420, 0x37a27: 0x6cd72620, - 0x37a28: 0x6cd72820, 0x37a29: 0x6cd72a20, 0x37a2a: 0x6cd72c20, 0x37a2b: 0x6cd72e20, - 0x37a2c: 0x6cd73020, 0x37a2d: 0x6cd73220, 0x37a2e: 0x6cd73420, 0x37a2f: 0x6cd73620, - 0x37a30: 0x6cd73820, 0x37a31: 0x6ca8e620, 0x37a32: 0x6d05b620, 0x37a33: 0x6d05b820, - 0x37a34: 0x6d05ba20, 0x37a35: 0x6d05bc20, 0x37a36: 0x6d05be20, 0x37a37: 0x6d05c020, - 0x37a38: 0x6d05c220, 0x37a39: 0x6d05c420, 0x37a3a: 0x6d05c620, 0x37a3b: 0x6d05c820, - 0x37a3c: 0x6d05ca20, 0x37a3d: 0x6d05cc20, 0x37a3e: 0x6d05ce20, 0x37a3f: 0x6d05d020, - // Block 0xde9, offset 0x37a40 - 0x37a40: 0x6d05d220, 0x37a41: 0x6d05d420, 0x37a42: 0x6d05d620, 0x37a43: 0x6d05d820, - 0x37a44: 0x6d05da20, 0x37a45: 0x6d05dc20, 0x37a46: 0x6d05de20, 0x37a47: 0x6d05e020, - 0x37a48: 0x6d05e220, 0x37a49: 0x6d05e420, 0x37a4a: 0x6d05e620, 0x37a4b: 0x6d05e820, - 0x37a4c: 0x6d05ea20, 0x37a4d: 0x6d05ec20, 0x37a4e: 0x6d05ee20, 0x37a4f: 0x6d05f020, - 0x37a50: 0x6d05f220, 0x37a51: 0x6d05f420, 0x37a52: 0x6d05f620, 0x37a53: 0x6d05f820, - 0x37a54: 0x6d05fa20, 0x37a55: 0x6d05fc20, 0x37a56: 0x6d05fe20, 0x37a57: 0x6d060020, - 0x37a58: 0x6d335a20, 0x37a59: 0x6d335c20, 0x37a5a: 0x6d335e20, 0x37a5b: 0x6d336020, - 0x37a5c: 0x6d336220, 0x37a5d: 0x6d336420, 0x37a5e: 0x6d336620, 0x37a5f: 0x6d336820, - 0x37a60: 0x6d336a20, 0x37a61: 0x6d336c20, 0x37a62: 0x6d336e20, 0x37a63: 0x6d337020, - 0x37a64: 0x6d337220, 0x37a65: 0x6d337420, 0x37a66: 0x6d337620, 0x37a67: 0x6d337820, - 0x37a68: 0x6d337a20, 0x37a69: 0x6d337c20, 0x37a6a: 0x6d337e20, 0x37a6b: 0x6d338020, - 0x37a6c: 0x6d338220, 0x37a6d: 0x6d338420, 0x37a6e: 0x6d338620, 0x37a6f: 0x6d338820, - 0x37a70: 0x6d338a20, 0x37a71: 0x6d338c20, 0x37a72: 0x6d338e20, 0x37a73: 0x6d339020, - 0x37a74: 0x6d339220, 0x37a75: 0x6d339420, 0x37a76: 0x6d339620, 0x37a77: 0x6d339820, - 0x37a78: 0x6d339a20, 0x37a79: 0x6d339c20, 0x37a7a: 0x6d339e20, 0x37a7b: 0x6d33a020, - 0x37a7c: 0x6d33a220, 0x37a7d: 0x6d33a420, 0x37a7e: 0x6d33a620, 0x37a7f: 0x6d33a820, - // Block 0xdea, offset 0x37a80 - 0x37a80: 0x6d33aa20, 0x37a81: 0x6d601820, 0x37a82: 0x6d601a20, 0x37a83: 0x6d601c20, - 0x37a84: 0x6d601e20, 0x37a85: 0x6d602020, 0x37a86: 0x6d602220, 0x37a87: 0x6d602420, - 0x37a88: 0x6d602620, 0x37a89: 0x6d602820, 0x37a8a: 0x6d602a20, 0x37a8b: 0x6d602c20, - 0x37a8c: 0x6d602e20, 0x37a8d: 0x6d603020, 0x37a8e: 0x6d603220, 0x37a8f: 0x6d603420, - 0x37a90: 0x6d603620, 0x37a91: 0x6d603820, 0x37a92: 0x6d603a20, 0x37a93: 0x6d603c20, - 0x37a94: 0x6d603e20, 0x37a95: 0x6d604020, 0x37a96: 0x6d604220, 0x37a97: 0x6d604420, - 0x37a98: 0x6d604620, 0x37a99: 0x6d604820, 0x37a9a: 0x6d604a20, 0x37a9b: 0x6d604c20, - 0x37a9c: 0x6d604e20, 0x37a9d: 0x6d605020, 0x37a9e: 0x6d605220, 0x37a9f: 0x6d605420, - 0x37aa0: 0x6d605620, 0x37aa1: 0x6d605820, 0x37aa2: 0x6d605a20, 0x37aa3: 0x6d605c20, - 0x37aa4: 0x6d8a6e20, 0x37aa5: 0x6d8a7020, 0x37aa6: 0x6d8a7220, 0x37aa7: 0x6d8a7420, - 0x37aa8: 0x6d8a7620, 0x37aa9: 0x6d8a7820, 0x37aaa: 0x6d8a7a20, 0x37aab: 0x6d8a7c20, - 0x37aac: 0x6d8a7e20, 0x37aad: 0x6d8a8020, 0x37aae: 0x6d8a8220, 0x37aaf: 0x6d8a8420, - 0x37ab0: 0x6d8a8620, 0x37ab1: 0x6d8a8820, 0x37ab2: 0x6d8a8a20, 0x37ab3: 0x6d8a8c20, - 0x37ab4: 0x6d8a8e20, 0x37ab5: 0x6d8a9020, 0x37ab6: 0x6d8a9220, 0x37ab7: 0x6d8a9420, - 0x37ab8: 0x6d8a9620, 0x37ab9: 0x6d8a9820, 0x37aba: 0x6d8a9a20, 0x37abb: 0x6d8a9c20, - 0x37abc: 0x6d8a9e20, 0x37abd: 0x6d8aa020, 0x37abe: 0x6d8aa220, 0x37abf: 0x6daeea20, - // Block 0xdeb, offset 0x37ac0 - 0x37ac0: 0x6daeec20, 0x37ac1: 0x6daeee20, 0x37ac2: 0x6daef020, 0x37ac3: 0x6daef220, - 0x37ac4: 0x6daef420, 0x37ac5: 0x6daef620, 0x37ac6: 0x6daef820, 0x37ac7: 0x6daefa20, - 0x37ac8: 0x6daefc20, 0x37ac9: 0x6daefe20, 0x37aca: 0x6daf0020, 0x37acb: 0x6daf0220, - 0x37acc: 0x6daf0420, 0x37acd: 0x6daf0620, 0x37ace: 0x6daf0820, 0x37acf: 0x6daf0a20, - 0x37ad0: 0x6daf0c20, 0x37ad1: 0x6daf0e20, 0x37ad2: 0x6daf1020, 0x37ad3: 0x6daf1220, - 0x37ad4: 0x6daf1420, 0x37ad5: 0x6daf1620, 0x37ad6: 0x6daf1820, 0x37ad7: 0x6dce7c20, - 0x37ad8: 0x6dce7e20, 0x37ad9: 0x6dce8020, 0x37ada: 0x6dce8220, 0x37adb: 0x6dce8420, - 0x37adc: 0x6dce8620, 0x37add: 0x6dce8820, 0x37ade: 0x6dce8a20, 0x37adf: 0x6dce8c20, - 0x37ae0: 0x6dce8e20, 0x37ae1: 0x6dce9020, 0x37ae2: 0x6dce9220, 0x37ae3: 0x6dce9420, - 0x37ae4: 0x6dce9620, 0x37ae5: 0x6dce9820, 0x37ae6: 0x6dce9a20, 0x37ae7: 0x6dce9c20, - 0x37ae8: 0x6dce9e20, 0x37ae9: 0x6dcea020, 0x37aea: 0x6dcea220, 0x37aeb: 0x6dcea420, - 0x37aec: 0x6dcea620, 0x37aed: 0x6dcea820, 0x37aee: 0x6dceaa20, 0x37aef: 0x6dceac20, - 0x37af0: 0x6dceae20, 0x37af1: 0x6dceb020, 0x37af2: 0x6dceb220, 0x37af3: 0x6dceb420, - 0x37af4: 0x6dceb620, 0x37af5: 0x6dceb820, 0x37af6: 0x6de8d220, 0x37af7: 0x6de8d420, - 0x37af8: 0x6de8d620, 0x37af9: 0x6de8d820, 0x37afa: 0x6de8da20, 0x37afb: 0x6de8dc20, - 0x37afc: 0x6de8de20, 0x37afd: 0x6de8e020, 0x37afe: 0x6de8e220, 0x37aff: 0x6de8e420, - // Block 0xdec, offset 0x37b00 - 0x37b00: 0x6de8e620, 0x37b01: 0x6de8e820, 0x37b02: 0x6de8ea20, 0x37b03: 0x6de8ec20, - 0x37b04: 0x6de8ee20, 0x37b05: 0x6de8f020, 0x37b06: 0x6de8f220, 0x37b07: 0x6de8f420, - 0x37b08: 0x6de8f620, 0x37b09: 0x6de8f820, 0x37b0a: 0x6de8fa20, 0x37b0b: 0x6de8fc20, - 0x37b0c: 0x6de8fe20, 0x37b0d: 0x6de90020, 0x37b0e: 0x6de90220, 0x37b0f: 0x6dff2620, - 0x37b10: 0x6dff2820, 0x37b11: 0x6dff2a20, 0x37b12: 0x6dff2c20, 0x37b13: 0x6dff2e20, - 0x37b14: 0x6dff3020, 0x37b15: 0x6dff3220, 0x37b16: 0x6dff3420, 0x37b17: 0x6e118e20, - 0x37b18: 0x6e119020, 0x37b19: 0x6e119220, 0x37b1a: 0x6e119420, 0x37b1b: 0x6e119620, - 0x37b1c: 0x6e119820, 0x37b1d: 0x6e119a20, 0x37b1e: 0x6e119c20, 0x37b1f: 0x6e119e20, - 0x37b20: 0x6e11a020, 0x37b21: 0x6e1fe820, 0x37b22: 0x6e11a220, 0x37b23: 0x6e11a420, - 0x37b24: 0x6e1fea20, 0x37b25: 0x6e1fec20, 0x37b26: 0x6e1fee20, 0x37b27: 0x6e1ff020, - 0x37b28: 0x6e1ff220, 0x37b29: 0x6e1ff420, 0x37b2a: 0x6e1ff620, 0x37b2b: 0x6e1ff820, - 0x37b2c: 0x6e2b0a20, 0x37b2d: 0x6e2b0c20, 0x37b2e: 0x6e2b0e20, 0x37b2f: 0x6e2b1020, - 0x37b30: 0x6e2b1220, 0x37b31: 0x6e338020, 0x37b32: 0x6e338220, 0x37b33: 0x6e338420, - 0x37b34: 0x6e338620, 0x37b35: 0x6e338820, 0x37b36: 0x6e398a20, 0x37b37: 0x6e398c20, - 0x37b38: 0x6e398e20, 0x37b39: 0x6e399020, 0x37b3a: 0x6e399220, 0x37b3b: 0x6e3dc420, - 0x37b3c: 0x6e3dc620, 0x37b3d: 0x6e3dc820, 0x37b3e: 0x6e3dca20, 0x37b3f: 0x6e3dcc20, - // Block 0xded, offset 0x37b40 - 0x37b40: 0x6e40a020, 0x37b41: 0x6e40a220, 0x37b42: 0x6e453a20, 0x37b43: 0x6e45c820, - 0x37b44: 0x6e468a20, 0x37b45: 0x6c3dc420, 0x37b46: 0x6c3dc620, 0x37b47: 0x6c3dc820, - 0x37b48: 0x6c3dca20, 0x37b49: 0x6c3dcc20, 0x37b4a: 0x6c3dce20, 0x37b4b: 0x6c3dd020, - 0x37b4c: 0x6c5c7a20, 0x37b4d: 0x6c5c7c20, 0x37b4e: 0x6c5c7e20, 0x37b4f: 0x6c5c8020, - 0x37b50: 0x6c5c8220, 0x37b51: 0x6c5c8420, 0x37b52: 0x6c5c8620, 0x37b53: 0x6c5c8820, - 0x37b54: 0x6c5c8a20, 0x37b55: 0x6c5c8c20, 0x37b56: 0x6c5c8e20, 0x37b57: 0x6c5c9020, - 0x37b58: 0x6c5c9220, 0x37b59: 0x6c804620, 0x37b5a: 0x6c804820, 0x37b5b: 0x6c804a20, - 0x37b5c: 0x6c804c20, 0x37b5d: 0x6c804e20, 0x37b5e: 0x6c805020, 0x37b5f: 0x6c805220, - 0x37b60: 0x6c805420, 0x37b61: 0x6c805620, 0x37b62: 0x6c805820, 0x37b63: 0x6c805a20, - 0x37b64: 0x6c805c20, 0x37b65: 0x6c805e20, 0x37b66: 0x6c806020, 0x37b67: 0x6c806220, - 0x37b68: 0x6c806420, 0x37b69: 0x6c806620, 0x37b6a: 0x6c806820, 0x37b6b: 0x6c806a20, - 0x37b6c: 0x6c806c20, 0x37b6d: 0x6c806e20, 0x37b6e: 0x6c807020, 0x37b6f: 0x6c807220, - 0x37b70: 0x6c807420, 0x37b71: 0x6c807620, 0x37b72: 0x6c807820, 0x37b73: 0x6c807a20, - 0x37b74: 0x6c807c20, 0x37b75: 0x6c807e20, 0x37b76: 0x6c808020, 0x37b77: 0x6c808220, - 0x37b78: 0x6c808420, 0x37b79: 0x6c808620, 0x37b7a: 0x6c808820, 0x37b7b: 0x6c808a20, - 0x37b7c: 0x6c808c20, 0x37b7d: 0x6c808e20, 0x37b7e: 0x6c809020, 0x37b7f: 0x6c809220, - // Block 0xdee, offset 0x37b80 - 0x37b80: 0x6c809420, 0x37b81: 0x6c809620, 0x37b82: 0x6c809820, 0x37b83: 0x6ca95220, - 0x37b84: 0x6ca95420, 0x37b85: 0x6ca95620, 0x37b86: 0x6ca95820, 0x37b87: 0x6ca95a20, - 0x37b88: 0x6ca95c20, 0x37b89: 0x6ca95e20, 0x37b8a: 0x6ca96020, 0x37b8b: 0x6ca96220, - 0x37b8c: 0x6ca96420, 0x37b8d: 0x6ca96620, 0x37b8e: 0x6ca96820, 0x37b8f: 0x6ca96a20, - 0x37b90: 0x6ca96c20, 0x37b91: 0x6ca96e20, 0x37b92: 0x6ca97020, 0x37b93: 0x6ca97220, - 0x37b94: 0x6ca97420, 0x37b95: 0x6ca97620, 0x37b96: 0x6ca97820, 0x37b97: 0x6ca97a20, - 0x37b98: 0x6ca97c20, 0x37b99: 0x6ca97e20, 0x37b9a: 0x6ca98020, 0x37b9b: 0x6ca98220, - 0x37b9c: 0x6ca98420, 0x37b9d: 0x6ca98620, 0x37b9e: 0x6ca98820, 0x37b9f: 0x6ca98a20, - 0x37ba0: 0x6ca98c20, 0x37ba1: 0x6ca98e20, 0x37ba2: 0x6ca99020, 0x37ba3: 0x6ca99220, - 0x37ba4: 0x6ca99420, 0x37ba5: 0x6ca99620, 0x37ba6: 0x6cd7ae20, 0x37ba7: 0x6cd7b020, - 0x37ba8: 0x6cd7b220, 0x37ba9: 0x6cd7b420, 0x37baa: 0x6cd7b620, 0x37bab: 0x6cd7b820, - 0x37bac: 0x6cd7ba20, 0x37bad: 0x6cd7bc20, 0x37bae: 0x6cd7be20, 0x37baf: 0x6cd7c020, - 0x37bb0: 0x6cd7c220, 0x37bb1: 0x6cd7c420, 0x37bb2: 0x6cd7c620, 0x37bb3: 0x6cd7c820, - 0x37bb4: 0x6cd7ca20, 0x37bb5: 0x6cd7cc20, 0x37bb6: 0x6cd7ce20, 0x37bb7: 0x6cd7d020, - 0x37bb8: 0x6cd7d220, 0x37bb9: 0x6cd7d420, 0x37bba: 0x6cd7d620, 0x37bbb: 0x6cd7d820, - 0x37bbc: 0x6cd7da20, 0x37bbd: 0x6cd7dc20, 0x37bbe: 0x6cd7de20, 0x37bbf: 0x6cd7e020, - // Block 0xdef, offset 0x37bc0 - 0x37bc0: 0x6cd7e220, 0x37bc1: 0x6cd7e420, 0x37bc2: 0x6cd7e620, 0x37bc3: 0x6cd7e820, - 0x37bc4: 0x6cd7ea20, 0x37bc5: 0x6cd7ec20, 0x37bc6: 0x6cd7ee20, 0x37bc7: 0x6cd7f020, - 0x37bc8: 0x6cd7f220, 0x37bc9: 0x6cd7f420, 0x37bca: 0x6cd7f620, 0x37bcb: 0x6cd7f820, - 0x37bcc: 0x6cd7fa20, 0x37bcd: 0x6cd7fc20, 0x37bce: 0x6cd7fe20, 0x37bcf: 0x6cd80020, - 0x37bd0: 0x6cd80220, 0x37bd1: 0x6cd80420, 0x37bd2: 0x6d065a20, 0x37bd3: 0x6d065c20, - 0x37bd4: 0x6d065e20, 0x37bd5: 0x6d066020, 0x37bd6: 0x6d066220, 0x37bd7: 0x6d066420, - 0x37bd8: 0x6d066620, 0x37bd9: 0x6d066820, 0x37bda: 0x6d066a20, 0x37bdb: 0x6d066c20, - 0x37bdc: 0x6d066e20, 0x37bdd: 0x6d067020, 0x37bde: 0x6d067220, 0x37bdf: 0x6d067420, - 0x37be0: 0x6d067620, 0x37be1: 0x6d067820, 0x37be2: 0x6d067a20, 0x37be3: 0x6d067c20, - 0x37be4: 0x6d067e20, 0x37be5: 0x6d068020, 0x37be6: 0x6d068220, 0x37be7: 0x6d068420, - 0x37be8: 0x6d068620, 0x37be9: 0x6d068820, 0x37bea: 0x6d068a20, 0x37beb: 0x6d068c20, - 0x37bec: 0x6d068e20, 0x37bed: 0x6d069020, 0x37bee: 0x6d069220, 0x37bef: 0x6d069420, - 0x37bf0: 0x6d069620, 0x37bf1: 0x6d069820, 0x37bf2: 0x6d069a20, 0x37bf3: 0x6d069c20, - 0x37bf4: 0x6d069e20, 0x37bf5: 0x6d06a020, 0x37bf6: 0x6d06a220, 0x37bf7: 0x6d06a420, - 0x37bf8: 0x6d06a620, 0x37bf9: 0x6d06a820, 0x37bfa: 0x6d06aa20, 0x37bfb: 0x6d06ac20, - 0x37bfc: 0x6d06ae20, 0x37bfd: 0x6d06b020, 0x37bfe: 0x6d06b220, 0x37bff: 0x6d06b420, - // Block 0xdf0, offset 0x37c00 - 0x37c00: 0x6d06b620, 0x37c01: 0x6d06b820, 0x37c02: 0x6d06ba20, 0x37c03: 0x6d06bc20, - 0x37c04: 0x6d06be20, 0x37c05: 0x6d06c020, 0x37c06: 0x6d344020, 0x37c07: 0x6d344220, - 0x37c08: 0x6d344420, 0x37c09: 0x6d344620, 0x37c0a: 0x6d344820, 0x37c0b: 0x6d344a20, - 0x37c0c: 0x6d344c20, 0x37c0d: 0x6d344e20, 0x37c0e: 0x6d345020, 0x37c0f: 0x6d345220, - 0x37c10: 0x6d345420, 0x37c11: 0x6d345620, 0x37c12: 0x6d345820, 0x37c13: 0x6d345a20, - 0x37c14: 0x6d345c20, 0x37c15: 0x6d345e20, 0x37c16: 0x6d346020, 0x37c17: 0x6d346220, - 0x37c18: 0x6d346420, 0x37c19: 0x6d346620, 0x37c1a: 0x6d346820, 0x37c1b: 0x6d346a20, - 0x37c1c: 0x6d346c20, 0x37c1d: 0x6d346e20, 0x37c1e: 0x6d347020, 0x37c1f: 0x6d347220, - 0x37c20: 0x6d347420, 0x37c21: 0x6d347620, 0x37c22: 0x6d347820, 0x37c23: 0x6d347a20, - 0x37c24: 0x6d347c20, 0x37c25: 0x6d347e20, 0x37c26: 0x6d348020, 0x37c27: 0x6d348220, - 0x37c28: 0x6d348420, 0x37c29: 0x6d348620, 0x37c2a: 0x6d348820, 0x37c2b: 0x6d348a20, - 0x37c2c: 0x6d348c20, 0x37c2d: 0x6d348e20, 0x37c2e: 0x6d349020, 0x37c2f: 0x6d349220, - 0x37c30: 0x6d349420, 0x37c31: 0x6d349620, 0x37c32: 0x6d349820, 0x37c33: 0x6d349a20, - 0x37c34: 0x6d349c20, 0x37c35: 0x6d349e20, 0x37c36: 0x6d34a020, 0x37c37: 0x6d34a220, - 0x37c38: 0x6d34a420, 0x37c39: 0x6d34a620, 0x37c3a: 0x6d34a820, 0x37c3b: 0x6d34aa20, - 0x37c3c: 0x6d34ac20, 0x37c3d: 0x6d34ae20, 0x37c3e: 0x6d34b020, 0x37c3f: 0x6d34b220, - // Block 0xdf1, offset 0x37c40 - 0x37c40: 0x6d60ee20, 0x37c41: 0x6d60f020, 0x37c42: 0x6d60f220, 0x37c43: 0x6d60f420, - 0x37c44: 0x6d60f620, 0x37c45: 0x6d60f820, 0x37c46: 0x6d60fa20, 0x37c47: 0x6d60fc20, - 0x37c48: 0x6d60fe20, 0x37c49: 0x6d610020, 0x37c4a: 0x6d610220, 0x37c4b: 0x6d610420, - 0x37c4c: 0x6d610620, 0x37c4d: 0x6d610820, 0x37c4e: 0x6d610a20, 0x37c4f: 0x6d610c20, - 0x37c50: 0x6d610e20, 0x37c51: 0x6d611020, 0x37c52: 0x6d611220, 0x37c53: 0x6d611420, - 0x37c54: 0x6d611620, 0x37c55: 0x6d611820, 0x37c56: 0x6d611a20, 0x37c57: 0x6d611c20, - 0x37c58: 0x6d611e20, 0x37c59: 0x6d612020, 0x37c5a: 0x6d612220, 0x37c5b: 0x6d612420, - 0x37c5c: 0x6d612620, 0x37c5d: 0x6d612820, 0x37c5e: 0x6d612a20, 0x37c5f: 0x6d612c20, - 0x37c60: 0x6d612e20, 0x37c61: 0x6d613020, 0x37c62: 0x6d613220, 0x37c63: 0x6d613420, - 0x37c64: 0x6d613620, 0x37c65: 0x6d613820, 0x37c66: 0x6d613a20, 0x37c67: 0x6d8afc20, - 0x37c68: 0x6d613c20, 0x37c69: 0x6d613e20, 0x37c6a: 0x6d614020, 0x37c6b: 0x6d614220, - 0x37c6c: 0x6d614420, 0x37c6d: 0x6d614620, 0x37c6e: 0x6d614820, 0x37c6f: 0x6d614a20, - 0x37c70: 0x6d614c20, 0x37c71: 0x6d614e20, 0x37c72: 0x6d615020, 0x37c73: 0x6d615220, - 0x37c74: 0x6d615420, 0x37c75: 0x6d615620, 0x37c76: 0x6d615820, 0x37c77: 0x6d615a20, - 0x37c78: 0x6d615c20, 0x37c79: 0x6d615e20, 0x37c7a: 0x6d616020, 0x37c7b: 0x6d616220, - 0x37c7c: 0x6d616420, 0x37c7d: 0x6d616620, 0x37c7e: 0x6d616820, 0x37c7f: 0x6d616a20, - // Block 0xdf2, offset 0x37c80 - 0x37c80: 0x6d616c20, 0x37c81: 0x6d616e20, 0x37c82: 0x6d8afe20, 0x37c83: 0x6d8b0020, - 0x37c84: 0x6d8b0220, 0x37c85: 0x6d8b0420, 0x37c86: 0x6d8b0620, 0x37c87: 0x6d8b0820, - 0x37c88: 0x6d8b0a20, 0x37c89: 0x6d8b0c20, 0x37c8a: 0x6d8b0e20, 0x37c8b: 0x6d8b1020, - 0x37c8c: 0x6d8b1220, 0x37c8d: 0x6d8b1420, 0x37c8e: 0x6d8b1620, 0x37c8f: 0x6d8b1820, - 0x37c90: 0x6d8b1a20, 0x37c91: 0x6d8b1c20, 0x37c92: 0x6d8b1e20, 0x37c93: 0x6d8b2020, - 0x37c94: 0x6d8b2220, 0x37c95: 0x6d8b2420, 0x37c96: 0x6d8b2620, 0x37c97: 0x6d8b2820, - 0x37c98: 0x6d8b2a20, 0x37c99: 0x6d8b2c20, 0x37c9a: 0x6d8b2e20, 0x37c9b: 0x6d8b3020, - 0x37c9c: 0x6d8b3220, 0x37c9d: 0x6d8b3420, 0x37c9e: 0x6d8b3620, 0x37c9f: 0x6d8b3820, - 0x37ca0: 0x6d8b3a20, 0x37ca1: 0x6d8b3c20, 0x37ca2: 0x6d8b3e20, 0x37ca3: 0x6d8b4020, - 0x37ca4: 0x6d8b4220, 0x37ca5: 0x6d8b4420, 0x37ca6: 0x6d8b4620, 0x37ca7: 0x6d8b4820, - 0x37ca8: 0x6d8b4a20, 0x37ca9: 0x6d8b4c20, 0x37caa: 0x6d8b4e20, 0x37cab: 0x6d8b5020, - 0x37cac: 0x6d8b5220, 0x37cad: 0x6d8b5420, 0x37cae: 0x6d8b5620, 0x37caf: 0x6d8b5820, - 0x37cb0: 0x6d8b5a20, 0x37cb1: 0x6d8b5c20, 0x37cb2: 0x6d8b5e20, 0x37cb3: 0x6d8b6020, - 0x37cb4: 0x6d8b6220, 0x37cb5: 0x6d8b6420, 0x37cb6: 0x6d8b6620, 0x37cb7: 0x6d8b6820, - 0x37cb8: 0x6d8b6a20, 0x37cb9: 0x6d8b6c20, 0x37cba: 0x6d8b6e20, 0x37cbb: 0x6d8b7020, - 0x37cbc: 0x6d8b7220, 0x37cbd: 0x6d8b7420, 0x37cbe: 0x6d8b7620, 0x37cbf: 0x6d8b7820, - // Block 0xdf3, offset 0x37cc0 - 0x37cc0: 0x6d8b7a20, 0x37cc1: 0x6d8b7c20, 0x37cc2: 0x6daf7a20, 0x37cc3: 0x6d8b7e20, - 0x37cc4: 0x6d8b8020, 0x37cc5: 0x6d8b8220, 0x37cc6: 0x6d8b8420, 0x37cc7: 0x6d8b8620, - 0x37cc8: 0x6d8b8820, 0x37cc9: 0x6daf7c20, 0x37cca: 0x6daf7e20, 0x37ccb: 0x6daf8020, - 0x37ccc: 0x6daf8220, 0x37ccd: 0x6daf8420, 0x37cce: 0x6daf8620, 0x37ccf: 0x6daf8820, - 0x37cd0: 0x6daf8a20, 0x37cd1: 0x6daf8c20, 0x37cd2: 0x6daf8e20, 0x37cd3: 0x6daf9020, - 0x37cd4: 0x6daf9220, 0x37cd5: 0x6daf9420, 0x37cd6: 0x6daf9620, 0x37cd7: 0x6daf9820, - 0x37cd8: 0x6daf9a20, 0x37cd9: 0x6daf9c20, 0x37cda: 0x6daf9e20, 0x37cdb: 0x6dafa020, - 0x37cdc: 0x6dafa220, 0x37cdd: 0x6dafa420, 0x37cde: 0x6dafa620, 0x37cdf: 0x6dafa820, - 0x37ce0: 0x6dafaa20, 0x37ce1: 0x6dafac20, 0x37ce2: 0x6dafae20, 0x37ce3: 0x6dafb020, - 0x37ce4: 0x6dafb220, 0x37ce5: 0x6dafb420, 0x37ce6: 0x6dafb620, 0x37ce7: 0x6dafb820, - 0x37ce8: 0x6dafba20, 0x37ce9: 0x6dafbc20, 0x37cea: 0x6dafbe20, 0x37ceb: 0x6dafc020, - 0x37cec: 0x6dafc220, 0x37ced: 0x6dafc420, 0x37cee: 0x6dafc620, 0x37cef: 0x6dafc820, - 0x37cf0: 0x6dafca20, 0x37cf1: 0x6dafcc20, 0x37cf2: 0x6dafce20, 0x37cf3: 0x6dafd020, - 0x37cf4: 0x6dafd220, 0x37cf5: 0x6dafd420, 0x37cf6: 0x6dafd620, 0x37cf7: 0x6dafd820, - 0x37cf8: 0x6dafda20, 0x37cf9: 0x6dafdc20, 0x37cfa: 0x6dafde20, 0x37cfb: 0x6dafe020, - 0x37cfc: 0x6dcf0020, 0x37cfd: 0x6dcf0220, 0x37cfe: 0x6dcf0420, 0x37cff: 0x6dcf0620, - // Block 0xdf4, offset 0x37d00 - 0x37d00: 0x6dcf0820, 0x37d01: 0x6dcf0a20, 0x37d02: 0x6dcf0c20, 0x37d03: 0x6dcf0e20, - 0x37d04: 0x6dcf1020, 0x37d05: 0x6dcf1220, 0x37d06: 0x6dcf1420, 0x37d07: 0x6dcf1620, - 0x37d08: 0x6dcf1820, 0x37d09: 0x6dcf1a20, 0x37d0a: 0x6dcf1c20, 0x37d0b: 0x6dcf1e20, - 0x37d0c: 0x6dcf2020, 0x37d0d: 0x6dcf2220, 0x37d0e: 0x6dcf2420, 0x37d0f: 0x6dcf2620, - 0x37d10: 0x6dcf2820, 0x37d11: 0x6dcf2a20, 0x37d12: 0x6dcf2c20, 0x37d13: 0x6dcf2e20, - 0x37d14: 0x6dcf3020, 0x37d15: 0x6dcf3220, 0x37d16: 0x6dcf3420, 0x37d17: 0x6dcf3620, - 0x37d18: 0x6dcf3820, 0x37d19: 0x6dcf3a20, 0x37d1a: 0x6dcf3c20, 0x37d1b: 0x6dcf3e20, - 0x37d1c: 0x6dcf4020, 0x37d1d: 0x6dcf4220, 0x37d1e: 0x6dcf4420, 0x37d1f: 0x6dcf4620, - 0x37d20: 0x6dcf4820, 0x37d21: 0x6dcf4a20, 0x37d22: 0x6dcf4c20, 0x37d23: 0x6dcf4e20, - 0x37d24: 0x6dcf5020, 0x37d25: 0x6dcf5220, 0x37d26: 0x6dcf5420, 0x37d27: 0x6dcf5620, - 0x37d28: 0x6dcf5820, 0x37d29: 0x6dcf5a20, 0x37d2a: 0x6dcf5c20, 0x37d2b: 0x6dcf5e20, - 0x37d2c: 0x6dcf6020, 0x37d2d: 0x6dcf6220, 0x37d2e: 0x6dcf6420, 0x37d2f: 0x6dcf6620, - 0x37d30: 0x6dcf6820, 0x37d31: 0x6dcf6a20, 0x37d32: 0x6dcf6c20, 0x37d33: 0x6dcf6e20, - 0x37d34: 0x6dcf7020, 0x37d35: 0x6de94220, 0x37d36: 0x6de94420, 0x37d37: 0x6de94620, - 0x37d38: 0x6de94820, 0x37d39: 0x6de94a20, 0x37d3a: 0x6de94c20, 0x37d3b: 0x6de94e20, - 0x37d3c: 0x6de95020, 0x37d3d: 0x6de95220, 0x37d3e: 0x6de95420, 0x37d3f: 0x6de95620, - // Block 0xdf5, offset 0x37d40 - 0x37d40: 0x6de95820, 0x37d41: 0x6de95a20, 0x37d42: 0x6de95c20, 0x37d43: 0x6de95e20, - 0x37d44: 0x6de96020, 0x37d45: 0x6de96220, 0x37d46: 0x6de96420, 0x37d47: 0x6de96620, - 0x37d48: 0x6de96820, 0x37d49: 0x6de96a20, 0x37d4a: 0x6de96c20, 0x37d4b: 0x6de96e20, - 0x37d4c: 0x6de97020, 0x37d4d: 0x6de97220, 0x37d4e: 0x6de97420, 0x37d4f: 0x6de97620, - 0x37d50: 0x6de97820, 0x37d51: 0x6de97a20, 0x37d52: 0x6de97c20, 0x37d53: 0x6de97e20, - 0x37d54: 0x6de98020, 0x37d55: 0x6de98220, 0x37d56: 0x6de98420, 0x37d57: 0x6de98620, - 0x37d58: 0x6de98820, 0x37d59: 0x6de98a20, 0x37d5a: 0x6de98c20, 0x37d5b: 0x6de98e20, - 0x37d5c: 0x6dff5420, 0x37d5d: 0x6dff5620, 0x37d5e: 0x6dff5820, 0x37d5f: 0x6dff5a20, - 0x37d60: 0x6dff5c20, 0x37d61: 0x6dff5e20, 0x37d62: 0x6dff6020, 0x37d63: 0x6dff6220, - 0x37d64: 0x6e11c420, 0x37d65: 0x6de99020, 0x37d66: 0x6dff6420, 0x37d67: 0x6dff6620, - 0x37d68: 0x6e11c620, 0x37d69: 0x6dff6820, 0x37d6a: 0x6dff6a20, 0x37d6b: 0x6e11c820, - 0x37d6c: 0x6dff6c20, 0x37d6d: 0x6dff6e20, 0x37d6e: 0x6dff7020, 0x37d6f: 0x6dff7220, - 0x37d70: 0x6dff7420, 0x37d71: 0x6dff7620, 0x37d72: 0x6dff7820, 0x37d73: 0x6dff7a20, - 0x37d74: 0x6dff7c20, 0x37d75: 0x6dff7e20, 0x37d76: 0x6dff8020, 0x37d77: 0x6dff8220, - 0x37d78: 0x6dff8420, 0x37d79: 0x6dff8620, 0x37d7a: 0x6dff8820, 0x37d7b: 0x6e11ca20, - 0x37d7c: 0x6e11cc20, 0x37d7d: 0x6e11ce20, 0x37d7e: 0x6e11d020, 0x37d7f: 0x6e11d220, - // Block 0xdf6, offset 0x37d80 - 0x37d80: 0x6e11d420, 0x37d81: 0x6e11d620, 0x37d82: 0x6e200c20, 0x37d83: 0x6e11d820, - 0x37d84: 0x6e11da20, 0x37d85: 0x6e11dc20, 0x37d86: 0x6e11de20, 0x37d87: 0x6e11e020, - 0x37d88: 0x6e11e220, 0x37d89: 0x6e11e420, 0x37d8a: 0x6e11e620, 0x37d8b: 0x6e11e820, - 0x37d8c: 0x6e11ea20, 0x37d8d: 0x6e11ec20, 0x37d8e: 0x6e11ee20, 0x37d8f: 0x6e11f020, - 0x37d90: 0x6e11f220, 0x37d91: 0x6e11f420, 0x37d92: 0x6e11f620, 0x37d93: 0x6e11f820, - 0x37d94: 0x6e200e20, 0x37d95: 0x6e201020, 0x37d96: 0x6e201220, 0x37d97: 0x6e201420, - 0x37d98: 0x6e201620, 0x37d99: 0x6e201820, 0x37d9a: 0x6e201a20, 0x37d9b: 0x6e201c20, - 0x37d9c: 0x6e201e20, 0x37d9d: 0x6e202020, 0x37d9e: 0x6e202220, 0x37d9f: 0x6e202420, - 0x37da0: 0x6e202620, 0x37da1: 0x6e202820, 0x37da2: 0x6e202a20, 0x37da3: 0x6e202c20, - 0x37da4: 0x6e202e20, 0x37da5: 0x6e203020, 0x37da6: 0x6e203220, 0x37da7: 0x6e2b1e20, - 0x37da8: 0x6e2b2020, 0x37da9: 0x6e2b2220, 0x37daa: 0x6e2b2420, 0x37dab: 0x6e2b2620, - 0x37dac: 0x6e2b2820, 0x37dad: 0x6e2b2a20, 0x37dae: 0x6e2b2c20, 0x37daf: 0x6e2b2e20, - 0x37db0: 0x6e339420, 0x37db1: 0x6e339620, 0x37db2: 0x6e339820, 0x37db3: 0x6e339a20, - 0x37db4: 0x6e339c20, 0x37db5: 0x6e339e20, 0x37db6: 0x6e33a020, 0x37db7: 0x6e33a220, - 0x37db8: 0x6e39a020, 0x37db9: 0x6e33a420, 0x37dba: 0x6e39a220, 0x37dbb: 0x6e39a420, - 0x37dbc: 0x6e3dce20, 0x37dbd: 0x6e3dd020, 0x37dbe: 0x6e40aa20, 0x37dbf: 0x6e40ac20, - // Block 0xdf7, offset 0x37dc0 - 0x37dc0: 0x6e40ae20, 0x37dc1: 0x6e40b020, 0x37dc2: 0x6e40b220, 0x37dc3: 0x6e42e020, - 0x37dc4: 0x6e42e220, 0x37dc5: 0x6e445c20, 0x37dc6: 0x6e453c20, 0x37dc7: 0x6e45ca20, - 0x37dc8: 0x6c3dfa20, 0x37dc9: 0x6c5cb820, 0x37dca: 0x6c80b020, 0x37dcb: 0x6c80b220, - 0x37dcc: 0x6c80b420, 0x37dcd: 0x6ca9d420, 0x37dce: 0x6ca9d620, 0x37dcf: 0x6ca9d820, - 0x37dd0: 0x6ca9da20, 0x37dd1: 0x6cd84020, 0x37dd2: 0x6cd84220, 0x37dd3: 0x6cd84420, - 0x37dd4: 0x6cd84620, 0x37dd5: 0x6cd84820, 0x37dd6: 0x6d06e620, 0x37dd7: 0x6d06e820, - 0x37dd8: 0x6d06ea20, 0x37dd9: 0x6d06ec20, 0x37dda: 0x6d34d620, 0x37ddb: 0x6d618820, - 0x37ddc: 0x6d618a20, 0x37ddd: 0x6d618c20, 0x37dde: 0x6d8ba020, 0x37ddf: 0x6d8ba220, - 0x37de0: 0x6dafec20, 0x37de1: 0x6dafee20, 0x37de2: 0x6c143220, 0x37de3: 0x6c5cc820, - 0x37de4: 0x6c5cca20, 0x37de5: 0x6c5ccc20, 0x37de6: 0x6c80cc20, 0x37de7: 0x6c80ce20, - 0x37de8: 0x6c80d020, 0x37de9: 0x6ca9f220, 0x37dea: 0x6ca9f420, 0x37deb: 0x6ca9f620, - 0x37dec: 0x6ca9f820, 0x37ded: 0x6ca9fa20, 0x37dee: 0x6ca9fc20, 0x37def: 0x6cd85a20, - 0x37df0: 0x6cd85c20, 0x37df1: 0x6cd85e20, 0x37df2: 0x6cd86020, 0x37df3: 0x6cd86220, - 0x37df4: 0x6d06f220, 0x37df5: 0x6d06f420, 0x37df6: 0x6d06f620, 0x37df7: 0x6d06f820, - 0x37df8: 0x6d34e820, 0x37df9: 0x6d34ea20, 0x37dfa: 0x6d34ec20, 0x37dfb: 0x6d34ee20, - 0x37dfc: 0x6d34f020, 0x37dfd: 0x6d34f220, 0x37dfe: 0x6d34f420, 0x37dff: 0x6d34f620, - // Block 0xdf8, offset 0x37e00 - 0x37e00: 0x6d34f820, 0x37e01: 0x6d619220, 0x37e02: 0x6d619420, 0x37e03: 0x6d619620, - 0x37e04: 0x6d619820, 0x37e05: 0x6d619a20, 0x37e06: 0x6d619c20, 0x37e07: 0x6d619e20, - 0x37e08: 0x6d8baa20, 0x37e09: 0x6d8bac20, 0x37e0a: 0x6d8bae20, 0x37e0b: 0x6d8bb020, - 0x37e0c: 0x6d8bb220, 0x37e0d: 0x6d8bb420, 0x37e0e: 0x6d8bb620, 0x37e0f: 0x6daffa20, - 0x37e10: 0x6daffc20, 0x37e11: 0x6daffe20, 0x37e12: 0x6db00020, 0x37e13: 0x6db00220, - 0x37e14: 0x6db00420, 0x37e15: 0x6dcf8220, 0x37e16: 0x6dcf8420, 0x37e17: 0x6dcf8620, - 0x37e18: 0x6dcf8820, 0x37e19: 0x6de9aa20, 0x37e1a: 0x6de9ac20, 0x37e1b: 0x6de9ae20, - 0x37e1c: 0x6de9b020, 0x37e1d: 0x6dff9220, 0x37e1e: 0x6dff9420, 0x37e1f: 0x6e120420, - 0x37e20: 0x6e120620, 0x37e21: 0x6e203e20, 0x37e22: 0x6e2b3420, 0x37e23: 0x6e2b3620, - 0x37e24: 0x6e2b3820, 0x37e25: 0x6e33aa20, 0x37e26: 0x6e33ac20, 0x37e27: 0x6e3dd420, - 0x37e28: 0x6e40b620, 0x37e29: 0x6e45cc20, 0x37e2a: 0x6c0a4c20, 0x37e2b: 0x6c0a4e20, - 0x37e2c: 0x6c25cc20, 0x37e2d: 0x6c0a5020, 0x37e2e: 0x6c25ce20, 0x37e2f: 0x6c143620, - 0x37e30: 0x6c0a5220, 0x37e31: 0x6c25d020, 0x37e32: 0x6c25d220, 0x37e33: 0x6c25d420, - 0x37e34: 0x6c25d620, 0x37e35: 0x6c25d820, 0x37e36: 0x6c25da20, 0x37e37: 0x6c3e0a20, - 0x37e38: 0x6c3e0c20, 0x37e39: 0x6c3e0e20, 0x37e3a: 0x6c3e1020, 0x37e3b: 0x6c3e1220, - 0x37e3c: 0x6c3e1420, 0x37e3d: 0x6c3e1620, 0x37e3e: 0x6c3e1820, 0x37e3f: 0x6c3e1a20, - // Block 0xdf9, offset 0x37e40 - 0x37e40: 0x6c3e1c20, 0x37e41: 0x6c5cda20, 0x37e42: 0x6c5cdc20, 0x37e43: 0x6c5cde20, - 0x37e44: 0x6c5ce020, 0x37e45: 0x6c5ce220, 0x37e46: 0x6c5ce420, 0x37e47: 0x6c5ce620, - 0x37e48: 0x6c5ce820, 0x37e49: 0x6c5cea20, 0x37e4a: 0x6c5cec20, 0x37e4b: 0x6c5cee20, - 0x37e4c: 0x6c5cf020, 0x37e4d: 0x6c5cf220, 0x37e4e: 0x6c80e820, 0x37e4f: 0x6c80ea20, - 0x37e50: 0x6c80ec20, 0x37e51: 0x6c80ee20, 0x37e52: 0x6c80f020, 0x37e53: 0x6c80f220, - 0x37e54: 0x6c80f420, 0x37e55: 0x6c80f620, 0x37e56: 0x6c80f820, 0x37e57: 0x6c80fa20, - 0x37e58: 0x6c80fc20, 0x37e59: 0x6c80fe20, 0x37e5a: 0x6c810020, 0x37e5b: 0x6c810220, - 0x37e5c: 0x6c810420, 0x37e5d: 0x6c810620, 0x37e5e: 0x6c810820, 0x37e5f: 0x6c810a20, - 0x37e60: 0x6c810c20, 0x37e61: 0x6c810e20, 0x37e62: 0x6c811020, 0x37e63: 0x6c811220, - 0x37e64: 0x6c6dd220, 0x37e65: 0x6c811420, 0x37e66: 0x6c811620, 0x37e67: 0x6c811820, - 0x37e68: 0x6c811a20, 0x37e69: 0x6c811c20, 0x37e6a: 0x6caa0220, 0x37e6b: 0x6caa0420, - 0x37e6c: 0x6caa0620, 0x37e6d: 0x6caa0820, 0x37e6e: 0x6caa0a20, 0x37e6f: 0x6caa0c20, - 0x37e70: 0x6caa0e20, 0x37e71: 0x6caa1020, 0x37e72: 0x6caa1220, 0x37e73: 0x6c811e20, - 0x37e74: 0x6caa1420, 0x37e75: 0x6caa1620, 0x37e76: 0x6caa1820, 0x37e77: 0x6caa1a20, - 0x37e78: 0x6caa1c20, 0x37e79: 0x6caa1e20, 0x37e7a: 0x6caa2020, 0x37e7b: 0x6caa2220, - 0x37e7c: 0x6cd86e20, 0x37e7d: 0x6cd87020, 0x37e7e: 0x6cd87220, 0x37e7f: 0x6cd87420, - // Block 0xdfa, offset 0x37e80 - 0x37e80: 0x6cd87620, 0x37e81: 0x6cd87820, 0x37e82: 0x6cd87a20, 0x37e83: 0x6cd87c20, - 0x37e84: 0x6cd87e20, 0x37e85: 0x6d071420, 0x37e86: 0x6d071620, 0x37e87: 0x6d071820, - 0x37e88: 0x6d071a20, 0x37e89: 0x6d071c20, 0x37e8a: 0x6d071e20, 0x37e8b: 0x6d072020, - 0x37e8c: 0x6d072220, 0x37e8d: 0x6d072420, 0x37e8e: 0x6d072620, 0x37e8f: 0x6d072820, - 0x37e90: 0x6d072a20, 0x37e91: 0x6cd88020, 0x37e92: 0x6d072c20, 0x37e93: 0x6d072e20, - 0x37e94: 0x6d073020, 0x37e95: 0x6d073220, 0x37e96: 0x6d073420, 0x37e97: 0x6d073620, - 0x37e98: 0x6d073820, 0x37e99: 0x6d073a20, 0x37e9a: 0x6d073c20, 0x37e9b: 0x6d073e20, - 0x37e9c: 0x6d074020, 0x37e9d: 0x6d350a20, 0x37e9e: 0x6d350c20, 0x37e9f: 0x6d350e20, - 0x37ea0: 0x6d351020, 0x37ea1: 0x6d351220, 0x37ea2: 0x6d351420, 0x37ea3: 0x6d351620, - 0x37ea4: 0x6d351820, 0x37ea5: 0x6d351a20, 0x37ea6: 0x6d351c20, 0x37ea7: 0x6d351e20, - 0x37ea8: 0x6d352020, 0x37ea9: 0x6d352220, 0x37eaa: 0x6d217020, 0x37eab: 0x6d352420, - 0x37eac: 0x6d352620, 0x37ead: 0x6d352820, 0x37eae: 0x6d352a20, 0x37eaf: 0x6d61ac20, - 0x37eb0: 0x6d61ae20, 0x37eb1: 0x6d61b020, 0x37eb2: 0x6d61b220, 0x37eb3: 0x6d61b420, - 0x37eb4: 0x6d61b620, 0x37eb5: 0x6d61b820, 0x37eb6: 0x6d61ba20, 0x37eb7: 0x6d61bc20, - 0x37eb8: 0x6d61be20, 0x37eb9: 0x6d61c020, 0x37eba: 0x6d61c220, 0x37ebb: 0x6d61c420, - 0x37ebc: 0x6d61c620, 0x37ebd: 0x6d8bc620, 0x37ebe: 0x6d8bc820, 0x37ebf: 0x6d8bca20, - // Block 0xdfb, offset 0x37ec0 - 0x37ec0: 0x6d8bcc20, 0x37ec1: 0x6d8bce20, 0x37ec2: 0x6d8bd020, 0x37ec3: 0x6d8bd220, - 0x37ec4: 0x6d8bd420, 0x37ec5: 0x6d8bd620, 0x37ec6: 0x6d8bd820, 0x37ec7: 0x6d8bda20, - 0x37ec8: 0x6d8bdc20, 0x37ec9: 0x6d8bde20, 0x37eca: 0x6d8be020, 0x37ecb: 0x6d8be220, - 0x37ecc: 0x6d8be420, 0x37ecd: 0x6d8be620, 0x37ece: 0x6d8be820, 0x37ecf: 0x6d8bea20, - 0x37ed0: 0x6d8bec20, 0x37ed1: 0x6d8bee20, 0x37ed2: 0x6db01020, 0x37ed3: 0x6db01220, - 0x37ed4: 0x6db01420, 0x37ed5: 0x6db01620, 0x37ed6: 0x6db01820, 0x37ed7: 0x6db01a20, - 0x37ed8: 0x6db01c20, 0x37ed9: 0x6db01e20, 0x37eda: 0x6db02020, 0x37edb: 0x6db02220, - 0x37edc: 0x6db02420, 0x37edd: 0x6db02620, 0x37ede: 0x6db02820, 0x37edf: 0x6dcf9020, - 0x37ee0: 0x6dcf9220, 0x37ee1: 0x6dcf9420, 0x37ee2: 0x6dcf9620, 0x37ee3: 0x6dcf9820, - 0x37ee4: 0x6dcf9a20, 0x37ee5: 0x6dcf9c20, 0x37ee6: 0x6dcf9e20, 0x37ee7: 0x6dcfa020, - 0x37ee8: 0x6dcfa220, 0x37ee9: 0x6dcfb220, 0x37eea: 0x6de9be20, 0x37eeb: 0x6de9c020, - 0x37eec: 0x6de9c220, 0x37eed: 0x6de9c420, 0x37eee: 0x6de9c620, 0x37eef: 0x6de9c820, - 0x37ef0: 0x6de9ca20, 0x37ef1: 0x6de9cc20, 0x37ef2: 0x6de9ce20, 0x37ef3: 0x6de9d020, - 0x37ef4: 0x6de9d220, 0x37ef5: 0x6dff9620, 0x37ef6: 0x6dff9820, 0x37ef7: 0x6dff9a20, - 0x37ef8: 0x6dff9c20, 0x37ef9: 0x6dff9e20, 0x37efa: 0x6dffa020, 0x37efb: 0x6e120a20, - 0x37efc: 0x6e120c20, 0x37efd: 0x6e2b3a20, 0x37efe: 0x6e33b420, 0x37eff: 0x6e33b620, - // Block 0xdfc, offset 0x37f00 - 0x37f00: 0x6e33b820, 0x37f01: 0x6e33ba20, 0x37f02: 0x6e33bc20, 0x37f03: 0x6e33be20, - 0x37f04: 0x6e33c020, 0x37f05: 0x6e33c220, 0x37f06: 0x6e3dd620, 0x37f07: 0x6e40b820, - 0x37f08: 0x6e42e420, 0x37f09: 0x6e42e620, 0x37f0a: 0x6e42e820, 0x37f0b: 0x6c143c20, - 0x37f0c: 0x6c143e20, 0x37f0d: 0x6c144020, 0x37f0e: 0x6c3e2620, 0x37f0f: 0x6c3e2820, - 0x37f10: 0x6c3e2a20, 0x37f11: 0x6c5cfe20, 0x37f12: 0x6c5d0020, 0x37f13: 0x6c5d0220, - 0x37f14: 0x6c5d0420, 0x37f15: 0x6c5d0620, 0x37f16: 0x6c5d0820, 0x37f17: 0x6c813820, - 0x37f18: 0x6c813a20, 0x37f19: 0x6c813c20, 0x37f1a: 0x6c813e20, 0x37f1b: 0x6c814020, - 0x37f1c: 0x6c814220, 0x37f1d: 0x6c814420, 0x37f1e: 0x6c814620, 0x37f1f: 0x6c814820, - 0x37f20: 0x6c814a20, 0x37f21: 0x6c814c20, 0x37f22: 0x6c814e20, 0x37f23: 0x6c815020, - 0x37f24: 0x6c815220, 0x37f25: 0x6caa4020, 0x37f26: 0x6caa4220, 0x37f27: 0x6caa4420, - 0x37f28: 0x6caa4620, 0x37f29: 0x6caa4820, 0x37f2a: 0x6caa4a20, 0x37f2b: 0x6caa4c20, - 0x37f2c: 0x6caa4e20, 0x37f2d: 0x6caa5020, 0x37f2e: 0x6c815420, 0x37f2f: 0x6caa5220, - 0x37f30: 0x6caa5420, 0x37f31: 0x6caa5620, 0x37f32: 0x6caa5820, 0x37f33: 0x6caa5a20, - 0x37f34: 0x6caa5c20, 0x37f35: 0x6caa5e20, 0x37f36: 0x6caa6020, 0x37f37: 0x6caa6220, - 0x37f38: 0x6caa6420, 0x37f39: 0x6cd88e20, 0x37f3a: 0x6cd89020, 0x37f3b: 0x6cd89220, - 0x37f3c: 0x6cd89420, 0x37f3d: 0x6cd89620, 0x37f3e: 0x6cd89820, 0x37f3f: 0x6cd89a20, - // Block 0xdfd, offset 0x37f40 - 0x37f40: 0x6cd89c20, 0x37f41: 0x6cd89e20, 0x37f42: 0x6cd8a020, 0x37f43: 0x6cd8a220, - 0x37f44: 0x6cd8a420, 0x37f45: 0x6cba3e20, 0x37f46: 0x6d075820, 0x37f47: 0x6d075a20, - 0x37f48: 0x6d075c20, 0x37f49: 0x6d075e20, 0x37f4a: 0x6d076020, 0x37f4b: 0x6d076220, - 0x37f4c: 0x6d076420, 0x37f4d: 0x6d076620, 0x37f4e: 0x6d076820, 0x37f4f: 0x6d076a20, - 0x37f50: 0x6d076c20, 0x37f51: 0x6d076e20, 0x37f52: 0x6d077020, 0x37f53: 0x6d077220, - 0x37f54: 0x6d077420, 0x37f55: 0x6d077620, 0x37f56: 0x6d077820, 0x37f57: 0x6d353a20, - 0x37f58: 0x6d353c20, 0x37f59: 0x6d353e20, 0x37f5a: 0x6d354020, 0x37f5b: 0x6d354220, - 0x37f5c: 0x6d354420, 0x37f5d: 0x6d354620, 0x37f5e: 0x6d354820, 0x37f5f: 0x6d354a20, - 0x37f60: 0x6d354c20, 0x37f61: 0x6d354e20, 0x37f62: 0x6d61d620, 0x37f63: 0x6d61d820, - 0x37f64: 0x6d61da20, 0x37f65: 0x6d61dc20, 0x37f66: 0x6d61de20, 0x37f67: 0x6d61e020, - 0x37f68: 0x6d61e220, 0x37f69: 0x6d61e420, 0x37f6a: 0x6d61e620, 0x37f6b: 0x6d61e820, - 0x37f6c: 0x6d61ea20, 0x37f6d: 0x6d61ec20, 0x37f6e: 0x6d61ee20, 0x37f6f: 0x6d8bfa20, - 0x37f70: 0x6d8bfc20, 0x37f71: 0x6d8bfe20, 0x37f72: 0x6d8c0020, 0x37f73: 0x6d8c0220, - 0x37f74: 0x6d8c0420, 0x37f75: 0x6d8c0620, 0x37f76: 0x6d8c0820, 0x37f77: 0x6db02e20, - 0x37f78: 0x6db03020, 0x37f79: 0x6db03220, 0x37f7a: 0x6db03420, 0x37f7b: 0x6db03620, - 0x37f7c: 0x6db03820, 0x37f7d: 0x6db03a20, 0x37f7e: 0x6db03c20, 0x37f7f: 0x6db03e20, - // Block 0xdfe, offset 0x37f80 - 0x37f80: 0x6db04020, 0x37f81: 0x6db04220, 0x37f82: 0x6db04420, 0x37f83: 0x6db04620, - 0x37f84: 0x6db04820, 0x37f85: 0x6dcfb420, 0x37f86: 0x6dcfb620, 0x37f87: 0x6dcfb820, - 0x37f88: 0x6dcfba20, 0x37f89: 0x6dcfbc20, 0x37f8a: 0x6dcfbe20, 0x37f8b: 0x6dcfc020, - 0x37f8c: 0x6dcfc220, 0x37f8d: 0x6dcfc420, 0x37f8e: 0x6dcfc620, 0x37f8f: 0x6dcfc820, - 0x37f90: 0x6dcfca20, 0x37f91: 0x6dcfcc20, 0x37f92: 0x6dcfce20, 0x37f93: 0x6dcfd020, - 0x37f94: 0x6dcfd220, 0x37f95: 0x6de9de20, 0x37f96: 0x6de9e020, 0x37f97: 0x6de9e220, - 0x37f98: 0x6de9e420, 0x37f99: 0x6de9e620, 0x37f9a: 0x6de9e820, 0x37f9b: 0x6de9ea20, - 0x37f9c: 0x6dffa420, 0x37f9d: 0x6dffa620, 0x37f9e: 0x6dffa820, 0x37f9f: 0x6dffaa20, - 0x37fa0: 0x6dffac20, 0x37fa1: 0x6dffae20, 0x37fa2: 0x6e121620, 0x37fa3: 0x6e121820, - 0x37fa4: 0x6e121a20, 0x37fa5: 0x6e121c20, 0x37fa6: 0x6e121e20, 0x37fa7: 0x6e122020, - 0x37fa8: 0x6e204420, 0x37fa9: 0x6e204620, 0x37faa: 0x6e2b3c20, 0x37fab: 0x6e2b3e20, - 0x37fac: 0x6e33c420, 0x37fad: 0x6e39a820, 0x37fae: 0x6e3dd820, 0x37faf: 0x6e40bc20, - 0x37fb0: 0x6e453e20, 0x37fb1: 0x6e454020, 0x37fb2: 0x6c3e2e20, 0x37fb3: 0x6c25de20, - 0x37fb4: 0x6c5d1020, 0x37fb5: 0x6c5d1220, 0x37fb6: 0x6c5d1420, 0x37fb7: 0x6c5d1620, - 0x37fb8: 0x6c5d1820, 0x37fb9: 0x6c5d1a20, 0x37fba: 0x6c5d1c20, 0x37fbb: 0x6c5d1e20, - 0x37fbc: 0x6c5d2020, 0x37fbd: 0x6c5d2220, 0x37fbe: 0x6c5d2420, 0x37fbf: 0x6c5d2620, - // Block 0xdff, offset 0x37fc0 - 0x37fc0: 0x6c5d2820, 0x37fc1: 0x6c5d2a20, 0x37fc2: 0x6c816820, 0x37fc3: 0x6c816a20, - 0x37fc4: 0x6c816c20, 0x37fc5: 0x6c816e20, 0x37fc6: 0x6c817020, 0x37fc7: 0x6c817220, - 0x37fc8: 0x6c817420, 0x37fc9: 0x6c817620, 0x37fca: 0x6c817820, 0x37fcb: 0x6c817a20, - 0x37fcc: 0x6c817c20, 0x37fcd: 0x6c817e20, 0x37fce: 0x6c818020, 0x37fcf: 0x6c818220, - 0x37fd0: 0x6c818420, 0x37fd1: 0x6c818620, 0x37fd2: 0x6c818820, 0x37fd3: 0x6c818a20, - 0x37fd4: 0x6c818c20, 0x37fd5: 0x6caa9420, 0x37fd6: 0x6caa9620, 0x37fd7: 0x6caa9820, - 0x37fd8: 0x6caa9a20, 0x37fd9: 0x6caa9c20, 0x37fda: 0x6caa9e20, 0x37fdb: 0x6caaa020, - 0x37fdc: 0x6caaa220, 0x37fdd: 0x6caaa420, 0x37fde: 0x6caaa620, 0x37fdf: 0x6caaa820, - 0x37fe0: 0x6caaaa20, 0x37fe1: 0x6caaac20, 0x37fe2: 0x6caaae20, 0x37fe3: 0x6cd8c220, - 0x37fe4: 0x6cd8c420, 0x37fe5: 0x6cd8c620, 0x37fe6: 0x6cd8c820, 0x37fe7: 0x6cd8ca20, - 0x37fe8: 0x6cd8cc20, 0x37fe9: 0x6cd8ce20, 0x37fea: 0x6cd8d020, 0x37feb: 0x6cd8d220, - 0x37fec: 0x6cd8d420, 0x37fed: 0x6cd8d620, 0x37fee: 0x6cd8d820, 0x37fef: 0x6cd8da20, - 0x37ff0: 0x6cd8dc20, 0x37ff1: 0x6cd8de20, 0x37ff2: 0x6cd8e020, 0x37ff3: 0x6cd8e220, - 0x37ff4: 0x6cd8e420, 0x37ff5: 0x6cd8e620, 0x37ff6: 0x6cd8e820, 0x37ff7: 0x6cd8ea20, - 0x37ff8: 0x6d078a20, 0x37ff9: 0x6d078c20, 0x37ffa: 0x6d078e20, 0x37ffb: 0x6d079020, - 0x37ffc: 0x6d079220, 0x37ffd: 0x6d079420, 0x37ffe: 0x6d079620, 0x37fff: 0x6d079820, - // Block 0xe00, offset 0x38000 - 0x38000: 0x6d079a20, 0x38001: 0x6d079c20, 0x38002: 0x6d079e20, 0x38003: 0x6d07a020, - 0x38004: 0x6d07a220, 0x38005: 0x6d356820, 0x38006: 0x6d07a420, 0x38007: 0x6d356a20, - 0x38008: 0x6d356c20, 0x38009: 0x6d356e20, 0x3800a: 0x6d357020, 0x3800b: 0x6d357220, - 0x3800c: 0x6d357420, 0x3800d: 0x6d357620, 0x3800e: 0x6d357820, 0x3800f: 0x6d357a20, - 0x38010: 0x6d357c20, 0x38011: 0x6d231e20, 0x38012: 0x6d357e20, 0x38013: 0x6d358020, - 0x38014: 0x6d358220, 0x38015: 0x6d358420, 0x38016: 0x6d358620, 0x38017: 0x6d358820, - 0x38018: 0x6d620620, 0x38019: 0x6d620820, 0x3801a: 0x6d620a20, 0x3801b: 0x6d620c20, - 0x3801c: 0x6d620e20, 0x3801d: 0x6d621020, 0x3801e: 0x6d621220, 0x3801f: 0x6d621420, - 0x38020: 0x6d621620, 0x38021: 0x6d621820, 0x38022: 0x6d621a20, 0x38023: 0x6d621c20, - 0x38024: 0x6d621e20, 0x38025: 0x6d622020, 0x38026: 0x6d622220, 0x38027: 0x6d622420, - 0x38028: 0x6d622620, 0x38029: 0x6d622820, 0x3802a: 0x6d622a20, 0x3802b: 0x6d622c20, - 0x3802c: 0x6d622e20, 0x3802d: 0x6d623020, 0x3802e: 0x6d623220, 0x3802f: 0x6d623420, - 0x38030: 0x6d8c1820, 0x38031: 0x6d8c1a20, 0x38032: 0x6d8c1c20, 0x38033: 0x6d8c1e20, - 0x38034: 0x6d8c2020, 0x38035: 0x6d8c2220, 0x38036: 0x6d8c2420, 0x38037: 0x6d8c2620, - 0x38038: 0x6d8c2820, 0x38039: 0x6d8c2a20, 0x3803a: 0x6d8c2c20, 0x3803b: 0x6d623620, - 0x3803c: 0x6d8c2e20, 0x3803d: 0x6d8c3020, 0x3803e: 0x6d8c3220, 0x3803f: 0x6d8c3420, - // Block 0xe01, offset 0x38040 - 0x38040: 0x6d8c3620, 0x38041: 0x6d8c3820, 0x38042: 0x6d8c3a20, 0x38043: 0x6db05c20, - 0x38044: 0x6db05e20, 0x38045: 0x6db06020, 0x38046: 0x6db06220, 0x38047: 0x6db06420, - 0x38048: 0x6db06620, 0x38049: 0x6db06820, 0x3804a: 0x6db06a20, 0x3804b: 0x6db06c20, - 0x3804c: 0x6db06e20, 0x3804d: 0x6dcfe820, 0x3804e: 0x6dcfea20, 0x3804f: 0x6dcfec20, - 0x38050: 0x6dcfee20, 0x38051: 0x6dcff020, 0x38052: 0x6dcff220, 0x38053: 0x6dcff420, - 0x38054: 0x6dcff620, 0x38055: 0x6dcff820, 0x38056: 0x6dcffa20, 0x38057: 0x6dcffc20, - 0x38058: 0x6dcffe20, 0x38059: 0x6dd00020, 0x3805a: 0x6dd00220, 0x3805b: 0x6dd00420, - 0x3805c: 0x6de9f020, 0x3805d: 0x6de9f220, 0x3805e: 0x6d8c3c20, 0x3805f: 0x6dd00620, - 0x38060: 0x6de9f420, 0x38061: 0x6de9f620, 0x38062: 0x6dffb820, 0x38063: 0x6dffba20, - 0x38064: 0x6dffbc20, 0x38065: 0x6dffbe20, 0x38066: 0x6e122420, 0x38067: 0x6e204c20, - 0x38068: 0x6e122620, 0x38069: 0x6e122820, 0x3806a: 0x6dffc020, 0x3806b: 0x6dffc220, - 0x3806c: 0x6e122a20, 0x3806d: 0x6e204e20, 0x3806e: 0x6e205020, 0x3806f: 0x6e205220, - 0x38070: 0x6e33c620, 0x38071: 0x6c25e020, 0x38072: 0x6c25e220, 0x38073: 0x6c3e3020, - 0x38074: 0x6c3e3220, 0x38075: 0x6c3e3420, 0x38076: 0x6c5d3020, 0x38077: 0x6c5d3220, - 0x38078: 0x6c5d3420, 0x38079: 0x6c5d3620, 0x3807a: 0x6c819420, 0x3807b: 0x6c819620, - 0x3807c: 0x6c819820, 0x3807d: 0x6c819a20, 0x3807e: 0x6c819c20, 0x3807f: 0x6c819e20, - // Block 0xe02, offset 0x38080 - 0x38080: 0x6caab620, 0x38081: 0x6d07aa20, 0x38082: 0x6d358e20, 0x38083: 0x6db07220, - 0x38084: 0x6d623c20, 0x38085: 0x6d623e20, 0x38086: 0x6d8c4220, 0x38087: 0x6d8c4420, - 0x38088: 0x6db07420, 0x38089: 0x6db07620, 0x3808a: 0x6dd00c20, 0x3808b: 0x6e2b4020, - 0x3808c: 0x6e2b4220, 0x3808d: 0x6e3dda20, 0x3808e: 0x6c3e3820, 0x3808f: 0x6c3e3a20, - 0x38090: 0x6c144a20, 0x38091: 0x6c3e3c20, 0x38092: 0x6c81a820, 0x38093: 0x6caab820, - 0x38094: 0x6cd8fa20, 0x38095: 0x6cd8fc20, 0x38096: 0x6d07ae20, 0x38097: 0x6d359220, - 0x38098: 0x6d624220, 0x38099: 0x6d624420, 0x3809a: 0x6d624620, 0x3809b: 0x6d624820, - 0x3809c: 0x6d624a20, 0x3809d: 0x6d8c4620, 0x3809e: 0x6d8c4820, 0x3809f: 0x6db07820, - 0x380a0: 0x6db07a20, 0x380a1: 0x6db07c20, 0x380a2: 0x6e205620, 0x380a3: 0x6e33c820, - 0x380a4: 0x6c144e20, 0x380a5: 0x6c3e4020, 0x380a6: 0x6c3e4220, 0x380a7: 0x6c3e4420, - 0x380a8: 0x6c5d4c20, 0x380a9: 0x6c5d4e20, 0x380aa: 0x6c5d5020, 0x380ab: 0x6c81b420, - 0x380ac: 0x6caac820, 0x380ad: 0x6caaca20, 0x380ae: 0x6caacc20, 0x380af: 0x6cd90020, - 0x380b0: 0x6cd90220, 0x380b1: 0x6cd90420, 0x380b2: 0x6cd90620, 0x380b3: 0x6cd90820, - 0x380b4: 0x6d07b820, 0x380b5: 0x6d07ba20, 0x380b6: 0x6d07bc20, 0x380b7: 0x6d35a420, - 0x380b8: 0x6d35a620, 0x380b9: 0x6d35a820, 0x380ba: 0x6d35aa20, 0x380bb: 0x6d35ac20, - 0x380bc: 0x6d35ae20, 0x380bd: 0x6d35b020, 0x380be: 0x6d35b220, 0x380bf: 0x6d35b420, - // Block 0xe03, offset 0x380c0 - 0x380c0: 0x6d35b620, 0x380c1: 0x6d35b820, 0x380c2: 0x6d625420, 0x380c3: 0x6d625620, - 0x380c4: 0x6d625820, 0x380c5: 0x6d625a20, 0x380c6: 0x6d625c20, 0x380c7: 0x6d625e20, - 0x380c8: 0x6d626020, 0x380c9: 0x6d626220, 0x380ca: 0x6d626420, 0x380cb: 0x6d8c5020, - 0x380cc: 0x6d8c5220, 0x380cd: 0x6d8c5420, 0x380ce: 0x6d8c5620, 0x380cf: 0x6d8c5820, - 0x380d0: 0x6d8c5a20, 0x380d1: 0x6d8c5c20, 0x380d2: 0x6d8c5e20, 0x380d3: 0x6db08820, - 0x380d4: 0x6db08a20, 0x380d5: 0x6db08c20, 0x380d6: 0x6db08e20, 0x380d7: 0x6db09020, - 0x380d8: 0x6db09220, 0x380d9: 0x6db09420, 0x380da: 0x6db09620, 0x380db: 0x6dd01620, - 0x380dc: 0x6dd01820, 0x380dd: 0x6dd01a20, 0x380de: 0x6dd01c20, 0x380df: 0x6de9f820, - 0x380e0: 0x6dd01e20, 0x380e1: 0x6dd02020, 0x380e2: 0x6dd02220, 0x380e3: 0x6dd02420, - 0x380e4: 0x6dd02620, 0x380e5: 0x6de9fa20, 0x380e6: 0x6de9fc20, 0x380e7: 0x6de9fe20, - 0x380e8: 0x6dea0020, 0x380e9: 0x6e123020, 0x380ea: 0x6e123220, 0x380eb: 0x6e33ca20, - 0x380ec: 0x6e33cc20, 0x380ed: 0x6e39aa20, 0x380ee: 0x6c25e820, 0x380ef: 0x6c3e4820, - 0x380f0: 0x6c3e4a20, 0x380f1: 0x6c3e4c20, 0x380f2: 0x6c3e4e20, 0x380f3: 0x6c3e5020, - 0x380f4: 0x6c3e5220, 0x380f5: 0x6c3e5420, 0x380f6: 0x6c3e5620, 0x380f7: 0x6c5d5620, - 0x380f8: 0x6c5d5820, 0x380f9: 0x6c5d5a20, 0x380fa: 0x6c5d5c20, 0x380fb: 0x6c5d5e20, - 0x380fc: 0x6c81d020, 0x380fd: 0x6c81d220, 0x380fe: 0x6c81d420, 0x380ff: 0x6c81d620, - // Block 0xe04, offset 0x38100 - 0x38100: 0x6c81d820, 0x38101: 0x6c81da20, 0x38102: 0x6c81dc20, 0x38103: 0x6c81de20, - 0x38104: 0x6c81e020, 0x38105: 0x6c81e220, 0x38106: 0x6c81e420, 0x38107: 0x6c81e620, - 0x38108: 0x6c81e820, 0x38109: 0x6c81ea20, 0x3810a: 0x6c81ec20, 0x3810b: 0x6c81ee20, - 0x3810c: 0x6c81f020, 0x3810d: 0x6c81f220, 0x3810e: 0x6c81f420, 0x3810f: 0x6c81f620, - 0x38110: 0x6caaea20, 0x38111: 0x6caaec20, 0x38112: 0x6caaee20, 0x38113: 0x6caaf020, - 0x38114: 0x6caaf220, 0x38115: 0x6caaf420, 0x38116: 0x6caaf620, 0x38117: 0x6caaf820, - 0x38118: 0x6caafa20, 0x38119: 0x6caafc20, 0x3811a: 0x6caafe20, 0x3811b: 0x6cab0020, - 0x3811c: 0x6cab0220, 0x3811d: 0x6cab0420, 0x3811e: 0x6cab0620, 0x3811f: 0x6cab0820, - 0x38120: 0x6cd92020, 0x38121: 0x6cd92220, 0x38122: 0x6cd92420, 0x38123: 0x6d07cc20, - 0x38124: 0x6cd92620, 0x38125: 0x6cd92820, 0x38126: 0x6cd92a20, 0x38127: 0x6cd92c20, - 0x38128: 0x6cd92e20, 0x38129: 0x6cd93020, 0x3812a: 0x6cd93220, 0x3812b: 0x6cd93420, - 0x3812c: 0x6cd93620, 0x3812d: 0x6cd93820, 0x3812e: 0x6cd93a20, 0x3812f: 0x6cd93c20, - 0x38130: 0x6cd93e20, 0x38131: 0x6cd94020, 0x38132: 0x6cd94220, 0x38133: 0x6cd94420, - 0x38134: 0x6cd94620, 0x38135: 0x6d07ce20, 0x38136: 0x6d07d020, 0x38137: 0x6d07d220, - 0x38138: 0x6d07d420, 0x38139: 0x6d07d620, 0x3813a: 0x6d07d820, 0x3813b: 0x6d07da20, - 0x3813c: 0x6d07dc20, 0x3813d: 0x6d07de20, 0x3813e: 0x6d07e020, 0x3813f: 0x6d07e220, - // Block 0xe05, offset 0x38140 - 0x38140: 0x6d07e420, 0x38141: 0x6d07e620, 0x38142: 0x6d07e820, 0x38143: 0x6d07ea20, - 0x38144: 0x6d07ec20, 0x38145: 0x6d07ee20, 0x38146: 0x6d07f020, 0x38147: 0x6d07f220, - 0x38148: 0x6d35d820, 0x38149: 0x6d35da20, 0x3814a: 0x6d35dc20, 0x3814b: 0x6d35de20, - 0x3814c: 0x6d35e020, 0x3814d: 0x6d35e220, 0x3814e: 0x6d35e420, 0x3814f: 0x6d35e620, - 0x38150: 0x6d35e820, 0x38151: 0x6d35ea20, 0x38152: 0x6d35ec20, 0x38153: 0x6d35ee20, - 0x38154: 0x6d35f020, 0x38155: 0x6d35f220, 0x38156: 0x6d35f420, 0x38157: 0x6d07f420, - 0x38158: 0x6d35f620, 0x38159: 0x6d35f820, 0x3815a: 0x6d35fa20, 0x3815b: 0x6d35fc20, - 0x3815c: 0x6d35fe20, 0x3815d: 0x6d360020, 0x3815e: 0x6d360220, 0x3815f: 0x6d360420, - 0x38160: 0x6d360620, 0x38161: 0x6d360820, 0x38162: 0x6d627e20, 0x38163: 0x6d628020, - 0x38164: 0x6d628220, 0x38165: 0x6d628420, 0x38166: 0x6d628620, 0x38167: 0x6d628820, - 0x38168: 0x6d628a20, 0x38169: 0x6d628c20, 0x3816a: 0x6d628e20, 0x3816b: 0x6d629020, - 0x3816c: 0x6d629220, 0x3816d: 0x6d629420, 0x3816e: 0x6d629620, 0x3816f: 0x6d629820, - 0x38170: 0x6d629a20, 0x38171: 0x6d629c20, 0x38172: 0x6d629e20, 0x38173: 0x6d62a020, - 0x38174: 0x6d62a220, 0x38175: 0x6d62a420, 0x38176: 0x6d62a620, 0x38177: 0x6d62a820, - 0x38178: 0x6d62aa20, 0x38179: 0x6d62ac20, 0x3817a: 0x6d62ae20, 0x3817b: 0x6d62b020, - 0x3817c: 0x6d8c6c20, 0x3817d: 0x6d8c6e20, 0x3817e: 0x6d8c7020, 0x3817f: 0x6d8c7220, - // Block 0xe06, offset 0x38180 - 0x38180: 0x6d8c7420, 0x38181: 0x6d8c7620, 0x38182: 0x6d8c7820, 0x38183: 0x6d8c7a20, - 0x38184: 0x6d8c7c20, 0x38185: 0x6d8c7e20, 0x38186: 0x6d8c8020, 0x38187: 0x6d62b220, - 0x38188: 0x6d8c8220, 0x38189: 0x6d8c8420, 0x3818a: 0x6d8c8620, 0x3818b: 0x6d8c8820, - 0x3818c: 0x6d8c8a20, 0x3818d: 0x6d8c8c20, 0x3818e: 0x6d8c8e20, 0x3818f: 0x6d8c9020, - 0x38190: 0x6db0aa20, 0x38191: 0x6db0ac20, 0x38192: 0x6db0ae20, 0x38193: 0x6db0b020, - 0x38194: 0x6db0b220, 0x38195: 0x6db0b420, 0x38196: 0x6db0b620, 0x38197: 0x6db0b820, - 0x38198: 0x6db0ba20, 0x38199: 0x6db0bc20, 0x3819a: 0x6db0be20, 0x3819b: 0x6db0c020, - 0x3819c: 0x6db0c220, 0x3819d: 0x6db0c420, 0x3819e: 0x6db0c620, 0x3819f: 0x6dd03220, - 0x381a0: 0x6dd03420, 0x381a1: 0x6dd03620, 0x381a2: 0x6dd03820, 0x381a3: 0x6dd03a20, - 0x381a4: 0x6dd03c20, 0x381a5: 0x6dd03e20, 0x381a6: 0x6dd04020, 0x381a7: 0x6dd04220, - 0x381a8: 0x6dd04420, 0x381a9: 0x6dd04620, 0x381aa: 0x6dd04820, 0x381ab: 0x6dd04a20, - 0x381ac: 0x6dd04c20, 0x381ad: 0x6dd04e20, 0x381ae: 0x6dd05020, 0x381af: 0x6dd05220, - 0x381b0: 0x6dd05420, 0x381b1: 0x6dd05620, 0x381b2: 0x6dd05820, 0x381b3: 0x6dea0420, - 0x381b4: 0x6dea0620, 0x381b5: 0x6dea0820, 0x381b6: 0x6dea0a20, 0x381b7: 0x6dea0c20, - 0x381b8: 0x6dea0e20, 0x381b9: 0x6dea1020, 0x381ba: 0x6dea1220, 0x381bb: 0x6dea1420, - 0x381bc: 0x6dea1620, 0x381bd: 0x6dea1820, 0x381be: 0x6dffd020, 0x381bf: 0x6dffd220, - // Block 0xe07, offset 0x381c0 - 0x381c0: 0x6dffd420, 0x381c1: 0x6dffd620, 0x381c2: 0x6dffd820, 0x381c3: 0x6dffda20, - 0x381c4: 0x6dffdc20, 0x381c5: 0x6e123420, 0x381c6: 0x6e123620, 0x381c7: 0x6e123820, - 0x381c8: 0x6e123a20, 0x381c9: 0x6e123c20, 0x381ca: 0x6e206220, 0x381cb: 0x6e206420, - 0x381cc: 0x6e206620, 0x381cd: 0x6e2b4420, 0x381ce: 0x6e2b4620, 0x381cf: 0x6e33ce20, - 0x381d0: 0x6e39ac20, 0x381d1: 0x6e3ddc20, 0x381d2: 0x6c145420, 0x381d3: 0x6c3e5c20, - 0x381d4: 0x6c5d6020, 0x381d5: 0x6cab0a20, 0x381d6: 0x6cab0c20, 0x381d7: 0x6cab0e20, - 0x381d8: 0x6cd94c20, 0x381d9: 0x6cd94e20, 0x381da: 0x6cd95020, 0x381db: 0x6d080420, - 0x381dc: 0x6d080620, 0x381dd: 0x6d361220, 0x381de: 0x6d361420, 0x381df: 0x6d361620, - 0x381e0: 0x6d62b620, 0x381e1: 0x6d62b820, 0x381e2: 0x6d62ba20, 0x381e3: 0x6d8c9c20, - 0x381e4: 0x6db0ce20, 0x381e5: 0x6db0d020, 0x381e6: 0x6db0d220, 0x381e7: 0x6dea1c20, - 0x381e8: 0x6dffde20, 0x381e9: 0x6c146420, 0x381ea: 0x6c146620, 0x381eb: 0x6c146820, - 0x381ec: 0x6c146a20, 0x381ed: 0x6c146c20, 0x381ee: 0x6c146e20, 0x381ef: 0x6c147020, - 0x381f0: 0x6c147220, 0x381f1: 0x6c147420, 0x381f2: 0x6c147620, 0x381f3: 0x6c147820, - 0x381f4: 0x6c261020, 0x381f5: 0x6c261220, 0x381f6: 0x6c261420, 0x381f7: 0x6c261620, - 0x381f8: 0x6c261820, 0x381f9: 0x6c261a20, 0x381fa: 0x6c261c20, 0x381fb: 0x6c261e20, - 0x381fc: 0x6c262020, 0x381fd: 0x6c262220, 0x381fe: 0x6c262420, 0x381ff: 0x6c3ebe20, - // Block 0xe08, offset 0x38200 - 0x38200: 0x6c3ec020, 0x38201: 0x6c3ec220, 0x38202: 0x6c3ec420, 0x38203: 0x6c3ec620, - 0x38204: 0x6c3ec820, 0x38205: 0x6c3eca20, 0x38206: 0x6c3ecc20, 0x38207: 0x6c3ece20, - 0x38208: 0x6c3ed020, 0x38209: 0x6c3ed220, 0x3820a: 0x6c3ed420, 0x3820b: 0x6c3ed620, - 0x3820c: 0x6c3ed820, 0x3820d: 0x6c3eda20, 0x3820e: 0x6c3edc20, 0x3820f: 0x6c3ede20, - 0x38210: 0x6c3ee020, 0x38211: 0x6c3ee220, 0x38212: 0x6c3ee420, 0x38213: 0x6c3ee620, - 0x38214: 0x6c3ee820, 0x38215: 0x6c3eea20, 0x38216: 0x6c3eec20, 0x38217: 0x6c3eee20, - 0x38218: 0x6c3ef020, 0x38219: 0x6c3ef220, 0x3821a: 0x6c3ef420, 0x3821b: 0x6c3ef620, - 0x3821c: 0x6c3ef820, 0x3821d: 0x6c3efa20, 0x3821e: 0x6c3efc20, 0x3821f: 0x6c3efe20, - 0x38220: 0x6c3f0020, 0x38221: 0x6c3f0220, 0x38222: 0x6c3f0420, 0x38223: 0x6c3f0620, - 0x38224: 0x6c3f0820, 0x38225: 0x6c3f0a20, 0x38226: 0x6c3f0c20, 0x38227: 0x6c3f0e20, - 0x38228: 0x6c3f1020, 0x38229: 0x6c3f1220, 0x3822a: 0x6c5dca20, 0x3822b: 0x6c5dcc20, - 0x3822c: 0x6c5dce20, 0x3822d: 0x6c5dd020, 0x3822e: 0x6c5dd220, 0x3822f: 0x6c5dd420, - 0x38230: 0x6c5dd620, 0x38231: 0x6c5dd820, 0x38232: 0x6c5dda20, 0x38233: 0x6c5ddc20, - 0x38234: 0x6c5dde20, 0x38235: 0x6c5de020, 0x38236: 0x6c5de220, 0x38237: 0x6c5de420, - 0x38238: 0x6c5de620, 0x38239: 0x6c5de820, 0x3823a: 0x6c5dea20, 0x3823b: 0x6c5dec20, - 0x3823c: 0x6c5dee20, 0x3823d: 0x6c5df020, 0x3823e: 0x6c5df220, 0x3823f: 0x6c5df420, - // Block 0xe09, offset 0x38240 - 0x38240: 0x6c5df620, 0x38241: 0x6c5df820, 0x38242: 0x6c5dfa20, 0x38243: 0x6c5dfc20, - 0x38244: 0x6c5dfe20, 0x38245: 0x6c5e0020, 0x38246: 0x6c5e0220, 0x38247: 0x6c5e0420, - 0x38248: 0x6c5e0620, 0x38249: 0x6c5e0820, 0x3824a: 0x6c5e0a20, 0x3824b: 0x6c5e0c20, - 0x3824c: 0x6c5e0e20, 0x3824d: 0x6c5e1020, 0x3824e: 0x6c5e1220, 0x3824f: 0x6c5e1420, - 0x38250: 0x6c5e1620, 0x38251: 0x6c5e1820, 0x38252: 0x6c5e1a20, 0x38253: 0x6c5e1c20, - 0x38254: 0x6c5e1e20, 0x38255: 0x6c5e2020, 0x38256: 0x6c5e2220, 0x38257: 0x6c5e2420, - 0x38258: 0x6c5e2620, 0x38259: 0x6c5e2820, 0x3825a: 0x6c5e2a20, 0x3825b: 0x6c5e2c20, - 0x3825c: 0x6c5e2e20, 0x3825d: 0x6c826020, 0x3825e: 0x6c826220, 0x3825f: 0x6c826420, - 0x38260: 0x6c826620, 0x38261: 0x6c826820, 0x38262: 0x6c826a20, 0x38263: 0x6c826c20, - 0x38264: 0x6c826e20, 0x38265: 0x6c827020, 0x38266: 0x6c827220, 0x38267: 0x6c827420, - 0x38268: 0x6c827620, 0x38269: 0x6c827820, 0x3826a: 0x6c827a20, 0x3826b: 0x6c827c20, - 0x3826c: 0x6c827e20, 0x3826d: 0x6c828020, 0x3826e: 0x6c828220, 0x3826f: 0x6c828420, - 0x38270: 0x6c828620, 0x38271: 0x6c828820, 0x38272: 0x6c828a20, 0x38273: 0x6c828c20, - 0x38274: 0x6c828e20, 0x38275: 0x6c829020, 0x38276: 0x6c829220, 0x38277: 0x6c829420, - 0x38278: 0x6c829620, 0x38279: 0x6c829820, 0x3827a: 0x6c829a20, 0x3827b: 0x6c829c20, - 0x3827c: 0x6c829e20, 0x3827d: 0x6c82a020, 0x3827e: 0x6c82a220, 0x3827f: 0x6c82a420, - // Block 0xe0a, offset 0x38280 - 0x38280: 0x6c82a620, 0x38281: 0x6c82a820, 0x38282: 0x6c82aa20, 0x38283: 0x6c82ac20, - 0x38284: 0x6c82ae20, 0x38285: 0x6c82b020, 0x38286: 0x6c82b220, 0x38287: 0x6c82b420, - 0x38288: 0x6c82b620, 0x38289: 0x6c82b820, 0x3828a: 0x6c82ba20, 0x3828b: 0x6c82bc20, - 0x3828c: 0x6c82be20, 0x3828d: 0x6c82c020, 0x3828e: 0x6c82c220, 0x3828f: 0x6c82c420, - 0x38290: 0x6c82c620, 0x38291: 0x6c82c820, 0x38292: 0x6c82ca20, 0x38293: 0x6c82cc20, - 0x38294: 0x6cab7220, 0x38295: 0x6cab7420, 0x38296: 0x6cab7620, 0x38297: 0x6cab7820, - 0x38298: 0x6cab7a20, 0x38299: 0x6cab7c20, 0x3829a: 0x6cab7e20, 0x3829b: 0x6cab8020, - 0x3829c: 0x6cab8220, 0x3829d: 0x6cab8420, 0x3829e: 0x6cab8620, 0x3829f: 0x6cab8820, - 0x382a0: 0x6cab8a20, 0x382a1: 0x6cab8c20, 0x382a2: 0x6cab8e20, 0x382a3: 0x6cab9020, - 0x382a4: 0x6cab9220, 0x382a5: 0x6cab9420, 0x382a6: 0x6cab9620, 0x382a7: 0x6cab9820, - 0x382a8: 0x6cab9a20, 0x382a9: 0x6cab9c20, 0x382aa: 0x6cab9e20, 0x382ab: 0x6caba020, - 0x382ac: 0x6caba220, 0x382ad: 0x6caba420, 0x382ae: 0x6caba620, 0x382af: 0x6caba820, - 0x382b0: 0x6cabaa20, 0x382b1: 0x6cabac20, 0x382b2: 0x6cabae20, 0x382b3: 0x6cabb020, - 0x382b4: 0x6cabb220, 0x382b5: 0x6cabb420, 0x382b6: 0x6cabb620, 0x382b7: 0x6cabb820, - 0x382b8: 0x6cabba20, 0x382b9: 0x6cabbc20, 0x382ba: 0x6cabbe20, 0x382bb: 0x6cabc020, - 0x382bc: 0x6cabc220, 0x382bd: 0x6cabc420, 0x382be: 0x6cabc620, 0x382bf: 0x6cabc820, - // Block 0xe0b, offset 0x382c0 - 0x382c0: 0x6cabca20, 0x382c1: 0x6cabcc20, 0x382c2: 0x6cabce20, 0x382c3: 0x6cabd020, - 0x382c4: 0x6cabd220, 0x382c5: 0x6cabd420, 0x382c6: 0x6cd9c020, 0x382c7: 0x6cd9c220, - 0x382c8: 0x6cd9c420, 0x382c9: 0x6cd9c620, 0x382ca: 0x6cd9c820, 0x382cb: 0x6cd9ca20, - 0x382cc: 0x6cd9cc20, 0x382cd: 0x6cd9ce20, 0x382ce: 0x6cd9d020, 0x382cf: 0x6cd9d220, - 0x382d0: 0x6cd9d420, 0x382d1: 0x6cd9d620, 0x382d2: 0x6cd9d820, 0x382d3: 0x6cd9da20, - 0x382d4: 0x6cd9dc20, 0x382d5: 0x6cd9de20, 0x382d6: 0x6cd9e020, 0x382d7: 0x6cd9e220, - 0x382d8: 0x6cd9e420, 0x382d9: 0x6cd9e620, 0x382da: 0x6cd9e820, 0x382db: 0x6cd9ea20, - 0x382dc: 0x6cd9ec20, 0x382dd: 0x6cd9ee20, 0x382de: 0x6cd9f020, 0x382df: 0x6cd9f220, - 0x382e0: 0x6cd9f420, 0x382e1: 0x6cd9f620, 0x382e2: 0x6cd9f820, 0x382e3: 0x6cd9fa20, - 0x382e4: 0x6cd9fc20, 0x382e5: 0x6cd9fe20, 0x382e6: 0x6cda0020, 0x382e7: 0x6cda0220, - 0x382e8: 0x6cda0420, 0x382e9: 0x6cda0620, 0x382ea: 0x6cda0820, 0x382eb: 0x6cda0a20, - 0x382ec: 0x6cda0c20, 0x382ed: 0x6cda0e20, 0x382ee: 0x6cda1020, 0x382ef: 0x6cda1220, - 0x382f0: 0x6cda1420, 0x382f1: 0x6cda1620, 0x382f2: 0x6cda1820, 0x382f3: 0x6cc87c20, - 0x382f4: 0x6cda1a20, 0x382f5: 0x6cda1c20, 0x382f6: 0x6cda1e20, 0x382f7: 0x6cda2020, - 0x382f8: 0x6cda2220, 0x382f9: 0x6cda2420, 0x382fa: 0x6cda2620, 0x382fb: 0x6cda2820, - 0x382fc: 0x6cda2a20, 0x382fd: 0x6cda2c20, 0x382fe: 0x6cda2e20, 0x382ff: 0x6cda3020, - // Block 0xe0c, offset 0x38300 - 0x38300: 0x6cda3220, 0x38301: 0x6cda3420, 0x38302: 0x6cda3620, 0x38303: 0x6cda3820, - 0x38304: 0x6cda3a20, 0x38305: 0x6cda3c20, 0x38306: 0x6cda3e20, 0x38307: 0x6cda4020, - 0x38308: 0x6cda4220, 0x38309: 0x6cda4420, 0x3830a: 0x6cda4620, 0x3830b: 0x6cda4820, - 0x3830c: 0x6cda4a20, 0x3830d: 0x6cda4c20, 0x3830e: 0x6cda4e20, 0x3830f: 0x6cda5020, - 0x38310: 0x6cda5220, 0x38311: 0x6cda5420, 0x38312: 0x6cda5620, 0x38313: 0x6cda5820, - 0x38314: 0x6cda5a20, 0x38315: 0x6cda5c20, 0x38316: 0x6cda5e20, 0x38317: 0x6cda6020, - 0x38318: 0x6cda6220, 0x38319: 0x6cda6420, 0x3831a: 0x6d087020, 0x3831b: 0x6d087220, - 0x3831c: 0x6d087420, 0x3831d: 0x6d087620, 0x3831e: 0x6d087820, 0x3831f: 0x6d087a20, - 0x38320: 0x6d087c20, 0x38321: 0x6d087e20, 0x38322: 0x6d088020, 0x38323: 0x6d088220, - 0x38324: 0x6d088420, 0x38325: 0x6d088620, 0x38326: 0x6d088820, 0x38327: 0x6d088a20, - 0x38328: 0x6d088c20, 0x38329: 0x6d088e20, 0x3832a: 0x6d089020, 0x3832b: 0x6d089220, - 0x3832c: 0x6d089420, 0x3832d: 0x6d089620, 0x3832e: 0x6d089820, 0x3832f: 0x6d089a20, - 0x38330: 0x6d089c20, 0x38331: 0x6d089e20, 0x38332: 0x6d08a020, 0x38333: 0x6d08a220, - 0x38334: 0x6d08a420, 0x38335: 0x6d08a620, 0x38336: 0x6d08a820, 0x38337: 0x6d08aa20, - 0x38338: 0x6d08ac20, 0x38339: 0x6d08ae20, 0x3833a: 0x6d08b020, 0x3833b: 0x6d08b220, - 0x3833c: 0x6d08b420, 0x3833d: 0x6d08b620, 0x3833e: 0x6d08b820, 0x3833f: 0x6d08ba20, - // Block 0xe0d, offset 0x38340 - 0x38340: 0x6d08bc20, 0x38341: 0x6d08be20, 0x38342: 0x6d08c020, 0x38343: 0x6d08c220, - 0x38344: 0x6d08c420, 0x38345: 0x6d08c620, 0x38346: 0x6d08c820, 0x38347: 0x6d08ca20, - 0x38348: 0x6d08cc20, 0x38349: 0x6d08ce20, 0x3834a: 0x6d08d020, 0x3834b: 0x6d08d220, - 0x3834c: 0x6d08d420, 0x3834d: 0x6d08d620, 0x3834e: 0x6d08d820, 0x3834f: 0x6d08da20, - 0x38350: 0x6d08dc20, 0x38351: 0x6d08de20, 0x38352: 0x6d08e020, 0x38353: 0x6d08e220, - 0x38354: 0x6d08e420, 0x38355: 0x6d08e620, 0x38356: 0x6d08e820, 0x38357: 0x6d08ea20, - 0x38358: 0x6d08ec20, 0x38359: 0x6d365c20, 0x3835a: 0x6d365e20, 0x3835b: 0x6d366020, - 0x3835c: 0x6d366220, 0x3835d: 0x6d366420, 0x3835e: 0x6d366620, 0x3835f: 0x6d366820, - 0x38360: 0x6d366a20, 0x38361: 0x6d366c20, 0x38362: 0x6d366e20, 0x38363: 0x6d367020, - 0x38364: 0x6d367220, 0x38365: 0x6d367420, 0x38366: 0x6d367620, 0x38367: 0x6d367820, - 0x38368: 0x6d367a20, 0x38369: 0x6d367c20, 0x3836a: 0x6d367e20, 0x3836b: 0x6d368020, - 0x3836c: 0x6d368220, 0x3836d: 0x6d368420, 0x3836e: 0x6d368620, 0x3836f: 0x6d368820, - 0x38370: 0x6d368a20, 0x38371: 0x6d368c20, 0x38372: 0x6d368e20, 0x38373: 0x6d369020, - 0x38374: 0x6d369220, 0x38375: 0x6d369420, 0x38376: 0x6d369620, 0x38377: 0x6d369820, - 0x38378: 0x6d369a20, 0x38379: 0x6d369c20, 0x3837a: 0x6d369e20, 0x3837b: 0x6d36a020, - 0x3837c: 0x6d36a220, 0x3837d: 0x6d36a420, 0x3837e: 0x6d36a620, 0x3837f: 0x6d36a820, - // Block 0xe0e, offset 0x38380 - 0x38380: 0x6d36aa20, 0x38381: 0x6d36ac20, 0x38382: 0x6d36ae20, 0x38383: 0x6d36b020, - 0x38384: 0x6d36b220, 0x38385: 0x6d36b420, 0x38386: 0x6d36b620, 0x38387: 0x6d36b820, - 0x38388: 0x6d36ba20, 0x38389: 0x6d36bc20, 0x3838a: 0x6d36be20, 0x3838b: 0x6d36c020, - 0x3838c: 0x6d36c220, 0x3838d: 0x6d36c420, 0x3838e: 0x6d36c620, 0x3838f: 0x6d36c820, - 0x38390: 0x6d36ca20, 0x38391: 0x6d36cc20, 0x38392: 0x6d36ce20, 0x38393: 0x6d08ee20, - 0x38394: 0x6d08f020, 0x38395: 0x6d36d020, 0x38396: 0x6d36d220, 0x38397: 0x6d36d420, - 0x38398: 0x6d62f420, 0x38399: 0x6d62f620, 0x3839a: 0x6d62f820, 0x3839b: 0x6d62fa20, - 0x3839c: 0x6d62fc20, 0x3839d: 0x6d62fe20, 0x3839e: 0x6d630020, 0x3839f: 0x6d630220, - 0x383a0: 0x6d630420, 0x383a1: 0x6d630620, 0x383a2: 0x6d630820, 0x383a3: 0x6d630a20, - 0x383a4: 0x6d630c20, 0x383a5: 0x6d630e20, 0x383a6: 0x6d631020, 0x383a7: 0x6d631220, - 0x383a8: 0x6d631420, 0x383a9: 0x6d631620, 0x383aa: 0x6d631820, 0x383ab: 0x6d631a20, - 0x383ac: 0x6d631c20, 0x383ad: 0x6d631e20, 0x383ae: 0x6d632020, 0x383af: 0x6d632220, - 0x383b0: 0x6d632420, 0x383b1: 0x6d632620, 0x383b2: 0x6d632820, 0x383b3: 0x6d632a20, - 0x383b4: 0x6d632c20, 0x383b5: 0x6d632e20, 0x383b6: 0x6d633020, 0x383b7: 0x6d633220, - 0x383b8: 0x6d633420, 0x383b9: 0x6d633620, 0x383ba: 0x6d633820, 0x383bb: 0x6d633a20, - 0x383bc: 0x6d633c20, 0x383bd: 0x6d633e20, 0x383be: 0x6d634020, 0x383bf: 0x6d634220, - // Block 0xe0f, offset 0x383c0 - 0x383c0: 0x6d634420, 0x383c1: 0x6d634620, 0x383c2: 0x6d634820, 0x383c3: 0x6d8cd620, - 0x383c4: 0x6d8cd820, 0x383c5: 0x6d8cda20, 0x383c6: 0x6d8cdc20, 0x383c7: 0x6d8cde20, - 0x383c8: 0x6d8ce020, 0x383c9: 0x6d8ce220, 0x383ca: 0x6d8ce420, 0x383cb: 0x6d8ce620, - 0x383cc: 0x6d8ce820, 0x383cd: 0x6d8cea20, 0x383ce: 0x6d8cec20, 0x383cf: 0x6d8cee20, - 0x383d0: 0x6d8cf020, 0x383d1: 0x6d8cf220, 0x383d2: 0x6d8cf420, 0x383d3: 0x6d8cf620, - 0x383d4: 0x6d8cf820, 0x383d5: 0x6d8cfa20, 0x383d6: 0x6d8cfc20, 0x383d7: 0x6d8cfe20, - 0x383d8: 0x6d8d0020, 0x383d9: 0x6d8d0220, 0x383da: 0x6d8d0420, 0x383db: 0x6d8d0620, - 0x383dc: 0x6d8d0820, 0x383dd: 0x6d8d0a20, 0x383de: 0x6d8d0c20, 0x383df: 0x6d8d0e20, - 0x383e0: 0x6d8d1020, 0x383e1: 0x6d8d1220, 0x383e2: 0x6d8d1420, 0x383e3: 0x6d8d1620, - 0x383e4: 0x6d8d1820, 0x383e5: 0x6d8d1a20, 0x383e6: 0x6d8d1c20, 0x383e7: 0x6d8d1e20, - 0x383e8: 0x6d8d2020, 0x383e9: 0x6d8d2220, 0x383ea: 0x6d8d2420, 0x383eb: 0x6d8d2620, - 0x383ec: 0x6d8d2820, 0x383ed: 0x6d8d2a20, 0x383ee: 0x6d8d2c20, 0x383ef: 0x6d8d2e20, - 0x383f0: 0x6d8d3020, 0x383f1: 0x6d8d3220, 0x383f2: 0x6d8d3420, 0x383f3: 0x6d8d3620, - 0x383f4: 0x6d8d3820, 0x383f5: 0x6d8d3a20, 0x383f6: 0x6d8d3c20, 0x383f7: 0x6d8d3e20, - 0x383f8: 0x6d8d4020, 0x383f9: 0x6d8d4220, 0x383fa: 0x6d8d4420, 0x383fb: 0x6d8d4620, - 0x383fc: 0x6d8d4820, 0x383fd: 0x6d8d4a20, 0x383fe: 0x6db10420, 0x383ff: 0x6db10620, - // Block 0xe10, offset 0x38400 - 0x38400: 0x6db10820, 0x38401: 0x6db10a20, 0x38402: 0x6db10c20, 0x38403: 0x6db10e20, - 0x38404: 0x6d8d4c20, 0x38405: 0x6db11020, 0x38406: 0x6db11220, 0x38407: 0x6db11420, - 0x38408: 0x6db11620, 0x38409: 0x6db11820, 0x3840a: 0x6db11a20, 0x3840b: 0x6db11c20, - 0x3840c: 0x6db11e20, 0x3840d: 0x6db12020, 0x3840e: 0x6dd07620, 0x3840f: 0x6db12220, - 0x38410: 0x6db12420, 0x38411: 0x6db12620, 0x38412: 0x6db12820, 0x38413: 0x6db12a20, - 0x38414: 0x6db12c20, 0x38415: 0x6db12e20, 0x38416: 0x6da5c020, 0x38417: 0x6d7c7a20, - 0x38418: 0x6db13020, 0x38419: 0x6db13220, 0x3841a: 0x6db13420, 0x3841b: 0x6db13620, - 0x3841c: 0x6db13820, 0x3841d: 0x6db13a20, 0x3841e: 0x6db13c20, 0x3841f: 0x6db13e20, - 0x38420: 0x6db14020, 0x38421: 0x6db14220, 0x38422: 0x6db14420, 0x38423: 0x6db14620, - 0x38424: 0x6db14820, 0x38425: 0x6db14a20, 0x38426: 0x6db14c20, 0x38427: 0x6db14e20, - 0x38428: 0x6db15020, 0x38429: 0x6db15220, 0x3842a: 0x6db15420, 0x3842b: 0x6db15620, - 0x3842c: 0x6db15820, 0x3842d: 0x6db15a20, 0x3842e: 0x6d8d4e20, 0x3842f: 0x6db15c20, - 0x38430: 0x6dd07820, 0x38431: 0x6dd07a20, 0x38432: 0x6dd07c20, 0x38433: 0x6dd07e20, - 0x38434: 0x6dd08020, 0x38435: 0x6dd08220, 0x38436: 0x6dd08420, 0x38437: 0x6dd08620, - 0x38438: 0x6dd08820, 0x38439: 0x6dd08a20, 0x3843a: 0x6dd08c20, 0x3843b: 0x6dd08e20, - 0x3843c: 0x6dd09020, 0x3843d: 0x6dd09220, 0x3843e: 0x6dd09420, 0x3843f: 0x6dd09620, - // Block 0xe11, offset 0x38440 - 0x38440: 0x6dd09820, 0x38441: 0x6dd09a20, 0x38442: 0x6dd09c20, 0x38443: 0x6dd09e20, - 0x38444: 0x6dd0a020, 0x38445: 0x6dd0a220, 0x38446: 0x6dd0a420, 0x38447: 0x6dd0a620, - 0x38448: 0x6dd0a820, 0x38449: 0x6dd0aa20, 0x3844a: 0x6dea2e20, 0x3844b: 0x6dea3020, - 0x3844c: 0x6dea3220, 0x3844d: 0x6dea3420, 0x3844e: 0x6dea3620, 0x3844f: 0x6dea3820, - 0x38450: 0x6dea3a20, 0x38451: 0x6dea3c20, 0x38452: 0x6dea3e20, 0x38453: 0x6dea4020, - 0x38454: 0x6dea4220, 0x38455: 0x6dea4420, 0x38456: 0x6dea4620, 0x38457: 0x6dea4820, - 0x38458: 0x6dea4a20, 0x38459: 0x6dea4c20, 0x3845a: 0x6dea4e20, 0x3845b: 0x6dea5020, - 0x3845c: 0x6dea5220, 0x3845d: 0x6dea5420, 0x3845e: 0x6dea5620, 0x3845f: 0x6dea5820, - 0x38460: 0x6dea5a20, 0x38461: 0x6dea5c20, 0x38462: 0x6dea5e20, 0x38463: 0x6dea6020, - 0x38464: 0x6dea6220, 0x38465: 0x6dffee20, 0x38466: 0x6dfff020, 0x38467: 0x6dfff220, - 0x38468: 0x6dfff420, 0x38469: 0x6dfff620, 0x3846a: 0x6dfff820, 0x3846b: 0x6dfffa20, - 0x3846c: 0x6dfffc20, 0x3846d: 0x6dfffe20, 0x3846e: 0x6e000020, 0x3846f: 0x6e000220, - 0x38470: 0x6e000420, 0x38471: 0x6e000620, 0x38472: 0x6e000820, 0x38473: 0x6e000a20, - 0x38474: 0x6e000c20, 0x38475: 0x6e000e20, 0x38476: 0x6e001020, 0x38477: 0x6e001220, - 0x38478: 0x6e124a20, 0x38479: 0x6e124c20, 0x3847a: 0x6e124e20, 0x3847b: 0x6e125020, - 0x3847c: 0x6e125220, 0x3847d: 0x6e125420, 0x3847e: 0x6e125620, 0x3847f: 0x6e206e20, - // Block 0xe12, offset 0x38480 - 0x38480: 0x6e207020, 0x38481: 0x6e207220, 0x38482: 0x6e207420, 0x38483: 0x6e207620, - 0x38484: 0x6e207820, 0x38485: 0x6e207a20, 0x38486: 0x6e2b4c20, 0x38487: 0x6e2b4e20, - 0x38488: 0x6e2b5020, 0x38489: 0x6e2b5220, 0x3848a: 0x6e2b5420, 0x3848b: 0x6e2b5620, - 0x3848c: 0x6e2b5820, 0x3848d: 0x6e2b5a20, 0x3848e: 0x6e2b5c20, 0x3848f: 0x6e2b5e20, - 0x38490: 0x6e2b6020, 0x38491: 0x6e33d020, 0x38492: 0x6e33d220, 0x38493: 0x6e33d420, - 0x38494: 0x6e33d620, 0x38495: 0x6e33d820, 0x38496: 0x6e39b220, 0x38497: 0x6e39b420, - 0x38498: 0x6e3dde20, 0x38499: 0x6e3de020, 0x3849a: 0x6e3de220, 0x3849b: 0x6e40be20, - 0x3849c: 0x6e42ec20, 0x3849d: 0x6c262620, 0x3849e: 0x6c147c20, 0x3849f: 0x6c5e3820, - 0x384a0: 0x6c82d220, 0x384a1: 0x6c82d420, 0x384a2: 0x6c82d620, 0x384a3: 0x6c82d820, - 0x384a4: 0x6cabde20, 0x384a5: 0x6cabe020, 0x384a6: 0x6cda7220, 0x384a7: 0x6cda7420, - 0x384a8: 0x6cda7620, 0x384a9: 0x6cda7820, 0x384aa: 0x6d8d5c20, 0x384ab: 0x6d36e620, - 0x384ac: 0x6d36e820, 0x384ad: 0x6d635620, 0x384ae: 0x6d36ea20, 0x384af: 0x6d635820, - 0x384b0: 0x6db16820, 0x384b1: 0x6db16a20, 0x384b2: 0x6dd0b220, 0x384b3: 0x6dd0b420, - 0x384b4: 0x6e125a20, 0x384b5: 0x6e125c20, 0x384b6: 0x6e207e20, 0x384b7: 0x6e445e20, - 0x384b8: 0x6e45ce20, 0x384b9: 0x6c148020, 0x384ba: 0x6c262a20, 0x384bb: 0x6c262c20, - 0x384bc: 0x6c262e20, 0x384bd: 0x6c3f1e20, 0x384be: 0x6c5e3a20, 0x384bf: 0x6c5e3c20, - // Block 0xe13, offset 0x384c0 - 0x384c0: 0x6c5e3e20, 0x384c1: 0x6c82e020, 0x384c2: 0x6c82e220, 0x384c3: 0x6c82e420, - 0x384c4: 0x6c82e620, 0x384c5: 0x6c82e820, 0x384c6: 0x6c82ea20, 0x384c7: 0x6c82ec20, - 0x384c8: 0x6c82ee20, 0x384c9: 0x6c82f020, 0x384ca: 0x6c82f220, 0x384cb: 0x6c82f420, - 0x384cc: 0x6cabe220, 0x384cd: 0x6cabe420, 0x384ce: 0x6cabe620, 0x384cf: 0x6cabe820, - 0x384d0: 0x6cda8220, 0x384d1: 0x6cda8420, 0x384d2: 0x6cda8620, 0x384d3: 0x6cda8820, - 0x384d4: 0x6d08fa20, 0x384d5: 0x6d36ee20, 0x384d6: 0x6d36f020, 0x384d7: 0x6d36f220, - 0x384d8: 0x6d635c20, 0x384d9: 0x6d635e20, 0x384da: 0x6d636020, 0x384db: 0x6d636220, - 0x384dc: 0x6d636420, 0x384dd: 0x6d636620, 0x384de: 0x6d8d6020, 0x384df: 0x6d8d6220, - 0x384e0: 0x6d8d6420, 0x384e1: 0x6db16c20, 0x384e2: 0x6db16e20, 0x384e3: 0x6db17020, - 0x384e4: 0x6db17220, 0x384e5: 0x6dd0b820, 0x384e6: 0x6dea6820, 0x384e7: 0x6dea6a20, - 0x384e8: 0x6dea6c20, 0x384e9: 0x6dea6e20, 0x384ea: 0x6dea7020, 0x384eb: 0x6e001620, - 0x384ec: 0x6e001820, 0x384ed: 0x6e001a20, 0x384ee: 0x6e001c20, 0x384ef: 0x6e125e20, - 0x384f0: 0x6e126020, 0x384f1: 0x6e33da20, 0x384f2: 0x6e3de420, 0x384f3: 0x6c148420, - 0x384f4: 0x6c148620, 0x384f5: 0x6c3f2020, 0x384f6: 0x6c5e4420, 0x384f7: 0x6c5e4620, - 0x384f8: 0x6c5e4820, 0x384f9: 0x6c82f620, 0x384fa: 0x6c82f820, 0x384fb: 0x6cabea20, - 0x384fc: 0x6cabec20, 0x384fd: 0x6cabee20, 0x384fe: 0x6cabf020, 0x384ff: 0x6cda9420, - // Block 0xe14, offset 0x38500 - 0x38500: 0x6cda9620, 0x38501: 0x6d08fe20, 0x38502: 0x6d36f620, 0x38503: 0x6d36f820, - 0x38504: 0x6d36fa20, 0x38505: 0x6d636a20, 0x38506: 0x6d636c20, 0x38507: 0x6d636e20, - 0x38508: 0x6d1dd820, 0x38509: 0x6d8d6820, 0x3850a: 0x6d8d6a20, 0x3850b: 0x6d8d6c20, - 0x3850c: 0x6d8d6e20, 0x3850d: 0x6d8d7020, 0x3850e: 0x6db17420, 0x3850f: 0x6dd0bc20, - 0x38510: 0x6dd0be20, 0x38511: 0x6c148a20, 0x38512: 0x6c148c20, 0x38513: 0x6c148e20, - 0x38514: 0x6c263020, 0x38515: 0x6c3f2620, 0x38516: 0x6c3f2820, 0x38517: 0x6c5e4c20, - 0x38518: 0x6c5e4e20, 0x38519: 0x6c3f2a20, 0x3851a: 0x6c5e5020, 0x3851b: 0x6c5e5220, - 0x3851c: 0x6c5e5420, 0x3851d: 0x6c830020, 0x3851e: 0x6c830220, 0x3851f: 0x6c830420, - 0x38520: 0x6c830620, 0x38521: 0x6c830820, 0x38522: 0x6c830a20, 0x38523: 0x6c830c20, - 0x38524: 0x6c830e20, 0x38525: 0x6cabf620, 0x38526: 0x6cabf820, 0x38527: 0x6c5e5620, - 0x38528: 0x6cabfa20, 0x38529: 0x6cabfc20, 0x3852a: 0x6cabfe20, 0x3852b: 0x6cac0020, - 0x3852c: 0x6cac0220, 0x3852d: 0x6cda9e20, 0x3852e: 0x6cdaa020, 0x3852f: 0x6cdaa220, - 0x38530: 0x6cdaa420, 0x38531: 0x6cdaa620, 0x38532: 0x6cdaa820, 0x38533: 0x6d090420, - 0x38534: 0x6d090620, 0x38535: 0x6d090820, 0x38536: 0x6d090a20, 0x38537: 0x6d090c20, - 0x38538: 0x6d090e20, 0x38539: 0x6d091020, 0x3853a: 0x6d091220, 0x3853b: 0x6d370420, - 0x3853c: 0x6d370620, 0x3853d: 0x6d370820, 0x3853e: 0x6d370a20, 0x3853f: 0x6d370c20, - // Block 0xe15, offset 0x38540 - 0x38540: 0x6d370e20, 0x38541: 0x6d371020, 0x38542: 0x6d371220, 0x38543: 0x6d371420, - 0x38544: 0x6d371620, 0x38545: 0x6d637220, 0x38546: 0x6d637420, 0x38547: 0x6d637620, - 0x38548: 0x6d637820, 0x38549: 0x6d637a20, 0x3854a: 0x6d637c20, 0x3854b: 0x6d637e20, - 0x3854c: 0x6d638020, 0x3854d: 0x6d638220, 0x3854e: 0x6d638420, 0x3854f: 0x6d8d7a20, - 0x38550: 0x6d8d7c20, 0x38551: 0x6d8d7e20, 0x38552: 0x6d8d8020, 0x38553: 0x6d8d8220, - 0x38554: 0x6d5dd620, 0x38555: 0x6d8d8420, 0x38556: 0x6d8d8620, 0x38557: 0x6d8d8820, - 0x38558: 0x6db17620, 0x38559: 0x6db17820, 0x3855a: 0x6db17a20, 0x3855b: 0x6db17c20, - 0x3855c: 0x6db17e20, 0x3855d: 0x6db18020, 0x3855e: 0x6db18220, 0x3855f: 0x6db18420, - 0x38560: 0x6db18620, 0x38561: 0x6dd0c220, 0x38562: 0x6dd0c420, 0x38563: 0x6dd0c620, - 0x38564: 0x6dd0c820, 0x38565: 0x6dd0ca20, 0x38566: 0x6dd0cc20, 0x38567: 0x6dd0ce20, - 0x38568: 0x6dca2e20, 0x38569: 0x6dea7620, 0x3856a: 0x6dea7820, 0x3856b: 0x6dea7a20, - 0x3856c: 0x6dea7c20, 0x3856d: 0x6e002020, 0x3856e: 0x6e002220, 0x3856f: 0x6dea7e20, - 0x38570: 0x6e002420, 0x38571: 0x6e002620, 0x38572: 0x6e002820, 0x38573: 0x6e002a20, - 0x38574: 0x6e002c20, 0x38575: 0x6e002e20, 0x38576: 0x6e126220, 0x38577: 0x6e126420, - 0x38578: 0x6e126620, 0x38579: 0x6e208020, 0x3857a: 0x6e2b6420, 0x3857b: 0x6e2b6620, - 0x3857c: 0x6e33de20, 0x3857d: 0x6e39b620, 0x3857e: 0x6e39b820, 0x3857f: 0x6e39ba20, - // Block 0xe16, offset 0x38580 - 0x38580: 0x6e3de820, 0x38581: 0x6e40c020, 0x38582: 0x6e40c220, 0x38583: 0x6e454420, - 0x38584: 0x6e472c20, 0x38585: 0x6e473620, 0x38586: 0x6c263220, 0x38587: 0x6c5e5820, - 0x38588: 0x6c831620, 0x38589: 0x6c831820, 0x3858a: 0x6c831a20, 0x3858b: 0x6c831c20, - 0x3858c: 0x6c831e20, 0x3858d: 0x6c832020, 0x3858e: 0x6c832220, 0x3858f: 0x6c832420, - 0x38590: 0x6c832620, 0x38591: 0x6cac0820, 0x38592: 0x6cac0a20, 0x38593: 0x6cac0c20, - 0x38594: 0x6cac0e20, 0x38595: 0x6cdaae20, 0x38596: 0x6cdab020, 0x38597: 0x6cdab220, - 0x38598: 0x6cdab420, 0x38599: 0x6cdab620, 0x3859a: 0x6cdab820, 0x3859b: 0x6cdaba20, - 0x3859c: 0x6cdabc20, 0x3859d: 0x6d091420, 0x3859e: 0x6d091620, 0x3859f: 0x6d371e20, - 0x385a0: 0x6d372020, 0x385a1: 0x6d372220, 0x385a2: 0x6d372420, 0x385a3: 0x6d372620, - 0x385a4: 0x6d372820, 0x385a5: 0x6d372a20, 0x385a6: 0x6d372c20, 0x385a7: 0x6d638c20, - 0x385a8: 0x6d638e20, 0x385a9: 0x6d639020, 0x385aa: 0x6d639220, 0x385ab: 0x6d639420, - 0x385ac: 0x6d639620, 0x385ad: 0x6d8d8c20, 0x385ae: 0x6d8d8e20, 0x385af: 0x6d8d9020, - 0x385b0: 0x6d8d9220, 0x385b1: 0x6db18820, 0x385b2: 0x6db18a20, 0x385b3: 0x6db18c20, - 0x385b4: 0x6dd0d420, 0x385b5: 0x6dd0d620, 0x385b6: 0x6dd0d820, 0x385b7: 0x6dea8220, - 0x385b8: 0x6e003020, 0x385b9: 0x6e126820, 0x385ba: 0x6e208220, 0x385bb: 0x6e2b6820, - 0x385bc: 0x6e2b6a20, 0x385bd: 0x6e3dec20, 0x385be: 0x6d639820, 0x385bf: 0x6d639a20, - // Block 0xe17, offset 0x385c0 - 0x385c0: 0x6dd0da20, 0x385c1: 0x6e003220, 0x385c2: 0x6e2b6c20, 0x385c3: 0x6e208620, - 0x385c4: 0x6e33e020, 0x385c5: 0x6e39bc20, 0x385c6: 0x6e40c420, 0x385c7: 0x6c263420, - 0x385c8: 0x6c3f3820, 0x385c9: 0x6c3f3a20, 0x385ca: 0x6c3f3c20, 0x385cb: 0x6c3f3e20, - 0x385cc: 0x6c3f4020, 0x385cd: 0x6c3f4220, 0x385ce: 0x6c5e6820, 0x385cf: 0x6c5e6a20, - 0x385d0: 0x6c5e6c20, 0x385d1: 0x6c5e6e20, 0x385d2: 0x6c5e7020, 0x385d3: 0x6c5e7220, - 0x385d4: 0x6c5e7420, 0x385d5: 0x6c834620, 0x385d6: 0x6c834820, 0x385d7: 0x6c834a20, - 0x385d8: 0x6c834c20, 0x385d9: 0x6c834e20, 0x385da: 0x6c835020, 0x385db: 0x6c835220, - 0x385dc: 0x6c835420, 0x385dd: 0x6c835620, 0x385de: 0x6c835820, 0x385df: 0x6c835a20, - 0x385e0: 0x6c835c20, 0x385e1: 0x6cac2c20, 0x385e2: 0x6cac2e20, 0x385e3: 0x6cac3020, - 0x385e4: 0x6cac3220, 0x385e5: 0x6cac3420, 0x385e6: 0x6cac3620, 0x385e7: 0x6cac3820, - 0x385e8: 0x6cac3a20, 0x385e9: 0x6cac3c20, 0x385ea: 0x6cac3e20, 0x385eb: 0x6cac4020, - 0x385ec: 0x6cac4220, 0x385ed: 0x6cac4420, 0x385ee: 0x6cac4620, 0x385ef: 0x6cdad220, - 0x385f0: 0x6cdad420, 0x385f1: 0x6cdad620, 0x385f2: 0x6cdad820, 0x385f3: 0x6d093620, - 0x385f4: 0x6cdada20, 0x385f5: 0x6cdadc20, 0x385f6: 0x6cdade20, 0x385f7: 0x6cdae020, - 0x385f8: 0x6cdae220, 0x385f9: 0x6cdae420, 0x385fa: 0x6cdae620, 0x385fb: 0x6cdae820, - 0x385fc: 0x6cdaea20, 0x385fd: 0x6d093820, 0x385fe: 0x6d093a20, 0x385ff: 0x6d093c20, - // Block 0xe18, offset 0x38600 - 0x38600: 0x6d093e20, 0x38601: 0x6d094020, 0x38602: 0x6d094220, 0x38603: 0x6d094420, - 0x38604: 0x6d094620, 0x38605: 0x6d094820, 0x38606: 0x6d094a20, 0x38607: 0x6d094c20, - 0x38608: 0x6d094e20, 0x38609: 0x6d095020, 0x3860a: 0x6d374a20, 0x3860b: 0x6d374c20, - 0x3860c: 0x6d374e20, 0x3860d: 0x6d375020, 0x3860e: 0x6d375220, 0x3860f: 0x6d375420, - 0x38610: 0x6d375620, 0x38611: 0x6d375820, 0x38612: 0x6d375a20, 0x38613: 0x6d375c20, - 0x38614: 0x6d375e20, 0x38615: 0x6d376020, 0x38616: 0x6d376220, 0x38617: 0x6d376420, - 0x38618: 0x6d376620, 0x38619: 0x6d376820, 0x3861a: 0x6d376a20, 0x3861b: 0x6d376c20, - 0x3861c: 0x6d376e20, 0x3861d: 0x6d63b020, 0x3861e: 0x6d63b220, 0x3861f: 0x6d63b420, - 0x38620: 0x6d63b620, 0x38621: 0x6d63b820, 0x38622: 0x6d63ba20, 0x38623: 0x6d63bc20, - 0x38624: 0x6d63be20, 0x38625: 0x6d63c020, 0x38626: 0x6d63c220, 0x38627: 0x6d63c420, - 0x38628: 0x6d63c620, 0x38629: 0x6d63c820, 0x3862a: 0x6d63ca20, 0x3862b: 0x6d63cc20, - 0x3862c: 0x6d63ce20, 0x3862d: 0x6d63d020, 0x3862e: 0x6d63d220, 0x3862f: 0x6d63d420, - 0x38630: 0x6d63d620, 0x38631: 0x6d63d820, 0x38632: 0x6d63da20, 0x38633: 0x6d63dc20, - 0x38634: 0x6d8da820, 0x38635: 0x6d8daa20, 0x38636: 0x6d8dac20, 0x38637: 0x6d8dae20, - 0x38638: 0x6d8db020, 0x38639: 0x6d8db220, 0x3863a: 0x6d8db420, 0x3863b: 0x6d8db620, - 0x3863c: 0x6d8db820, 0x3863d: 0x6d8dba20, 0x3863e: 0x6d8dbc20, 0x3863f: 0x6d63de20, - // Block 0xe19, offset 0x38640 - 0x38640: 0x6d8dbe20, 0x38641: 0x6d8dc020, 0x38642: 0x6d8dc220, 0x38643: 0x6d8dc420, - 0x38644: 0x6d8dc620, 0x38645: 0x6d8dc820, 0x38646: 0x6db1a420, 0x38647: 0x6db1a620, - 0x38648: 0x6db1a820, 0x38649: 0x6db1aa20, 0x3864a: 0x6db1ac20, 0x3864b: 0x6db1ae20, - 0x3864c: 0x6db1b020, 0x3864d: 0x6db1b220, 0x3864e: 0x6db1b420, 0x3864f: 0x6db1b620, - 0x38650: 0x6db1b820, 0x38651: 0x6dd0e820, 0x38652: 0x6dd0ea20, 0x38653: 0x6dd0ec20, - 0x38654: 0x6dd0ee20, 0x38655: 0x6dd0f020, 0x38656: 0x6dd0f220, 0x38657: 0x6dd0f420, - 0x38658: 0x6dd0f620, 0x38659: 0x6dd0f820, 0x3865a: 0x6dd0fa20, 0x3865b: 0x6dd0fc20, - 0x3865c: 0x6dd0fe20, 0x3865d: 0x6dd10020, 0x3865e: 0x6dd10220, 0x3865f: 0x6dd10420, - 0x38660: 0x6dd10620, 0x38661: 0x6dd10820, 0x38662: 0x6dd10a20, 0x38663: 0x6dd10c20, - 0x38664: 0x6dd10e20, 0x38665: 0x6dd11020, 0x38666: 0x6dd11220, 0x38667: 0x6dd11420, - 0x38668: 0x6dea9020, 0x38669: 0x6dea9220, 0x3866a: 0x6dea9420, 0x3866b: 0x6dea9620, - 0x3866c: 0x6dea9820, 0x3866d: 0x6dea9a20, 0x3866e: 0x6dea9c20, 0x3866f: 0x6dea9e20, - 0x38670: 0x6deaa020, 0x38671: 0x6e003e20, 0x38672: 0x6e004020, 0x38673: 0x6e004220, - 0x38674: 0x6e004420, 0x38675: 0x6e004620, 0x38676: 0x6e126e20, 0x38677: 0x6e127020, - 0x38678: 0x6e127220, 0x38679: 0x6e105820, 0x3867a: 0x6e127420, 0x3867b: 0x6e127620, - 0x3867c: 0x6e127820, 0x3867d: 0x6e208a20, 0x3867e: 0x6e208c20, 0x3867f: 0x6e208e20, - // Block 0xe1a, offset 0x38680 - 0x38680: 0x6e209020, 0x38681: 0x6e209220, 0x38682: 0x6e209420, 0x38683: 0x6e2b7020, - 0x38684: 0x6e2b7220, 0x38685: 0x6e39be20, 0x38686: 0x6e39c020, 0x38687: 0x6e3dee20, - 0x38688: 0x6e40c620, 0x38689: 0x6e3df020, 0x3868a: 0x6e454620, 0x3868b: 0x6c5e7820, - 0x3868c: 0x6cac4820, 0x3868d: 0x6cac4a20, 0x3868e: 0x6cdaec20, 0x3868f: 0x6d095220, - 0x38690: 0x6d63e420, 0x38691: 0x6db1be20, 0x38692: 0x6e004a20, 0x38693: 0x6c5e7c20, - 0x38694: 0x6cac5020, 0x38695: 0x6cac5220, 0x38696: 0x6cac5420, 0x38697: 0x6cac5620, - 0x38698: 0x6cac5820, 0x38699: 0x6cac5a20, 0x3869a: 0x6cdaee20, 0x3869b: 0x6d095420, - 0x3869c: 0x6d095620, 0x3869d: 0x6d095820, 0x3869e: 0x6d377420, 0x3869f: 0x6d377620, - 0x386a0: 0x6d377820, 0x386a1: 0x6d377a20, 0x386a2: 0x6d377c20, 0x386a3: 0x6d377e20, - 0x386a4: 0x6d63e620, 0x386a5: 0x6d63e820, 0x386a6: 0x6d63ea20, 0x386a7: 0x6d63ec20, - 0x386a8: 0x6d63ee20, 0x386a9: 0x6d63f020, 0x386aa: 0x6d8dce20, 0x386ab: 0x6d8dd020, - 0x386ac: 0x6d8dd220, 0x386ad: 0x6d8dd420, 0x386ae: 0x6d8dd620, 0x386af: 0x6e004c20, - 0x386b0: 0x6e004e20, 0x386b1: 0x6e005020, 0x386b2: 0x6e39c220, 0x386b3: 0x6c0a5a20, - 0x386b4: 0x6c0a5c20, 0x386b5: 0x6c0a5e20, 0x386b6: 0x6c14b020, 0x386b7: 0x6c14b220, - 0x386b8: 0x6c14b420, 0x386b9: 0x6c14b620, 0x386ba: 0x6c14b820, 0x386bb: 0x6c14ba20, - 0x386bc: 0x6c14bc20, 0x386bd: 0x6c14be20, 0x386be: 0x6c14c020, 0x386bf: 0x6c14c220, - // Block 0xe1b, offset 0x386c0 - 0x386c0: 0x6c14c420, 0x386c1: 0x6c266020, 0x386c2: 0x6c266220, 0x386c3: 0x6c266420, - 0x386c4: 0x6c266620, 0x386c5: 0x6c266820, 0x386c6: 0x6c266a20, 0x386c7: 0x6c266c20, - 0x386c8: 0x6c266e20, 0x386c9: 0x6c267020, 0x386ca: 0x6c267220, 0x386cb: 0x6c267420, - 0x386cc: 0x6c267620, 0x386cd: 0x6c267820, 0x386ce: 0x6c267a20, 0x386cf: 0x6c267c20, - 0x386d0: 0x6c267e20, 0x386d1: 0x6c268020, 0x386d2: 0x6c268220, 0x386d3: 0x6c3fba20, - 0x386d4: 0x6c3fbc20, 0x386d5: 0x6c3fbe20, 0x386d6: 0x6c3fc020, 0x386d7: 0x6c3fc220, - 0x386d8: 0x6c3fc420, 0x386d9: 0x6c3fc620, 0x386da: 0x6c3fc820, 0x386db: 0x6c3fca20, - 0x386dc: 0x6c3fcc20, 0x386dd: 0x6c3fce20, 0x386de: 0x6c3fd020, 0x386df: 0x6c3fd220, - 0x386e0: 0x6c3fd420, 0x386e1: 0x6c3fd620, 0x386e2: 0x6c3fd820, 0x386e3: 0x6c3fda20, - 0x386e4: 0x6c3fdc20, 0x386e5: 0x6c3fde20, 0x386e6: 0x6c3fe020, 0x386e7: 0x6c3fe220, - 0x386e8: 0x6c3fe420, 0x386e9: 0x6c3fe620, 0x386ea: 0x6c3fe820, 0x386eb: 0x6c3fea20, - 0x386ec: 0x6c3fec20, 0x386ed: 0x6c3fee20, 0x386ee: 0x6c3ff020, 0x386ef: 0x6c3ff220, - 0x386f0: 0x6c3ff420, 0x386f1: 0x6c3ff620, 0x386f2: 0x6c3ff820, 0x386f3: 0x6c3ffa20, - 0x386f4: 0x6c3ffc20, 0x386f5: 0x6c3ffe20, 0x386f6: 0x6c400020, 0x386f7: 0x6c5f1220, - 0x386f8: 0x6c5f1420, 0x386f9: 0x6c5f1620, 0x386fa: 0x6c5f1820, 0x386fb: 0x6c5f1a20, - 0x386fc: 0x6c5f1c20, 0x386fd: 0x6c5f1e20, 0x386fe: 0x6c5f2020, 0x386ff: 0x6c5f2220, - // Block 0xe1c, offset 0x38700 - 0x38700: 0x6c5f2420, 0x38701: 0x6c5f2620, 0x38702: 0x6c5f2820, 0x38703: 0x6c5f2a20, - 0x38704: 0x6c5f2c20, 0x38705: 0x6c5f2e20, 0x38706: 0x6c5f3020, 0x38707: 0x6c5f3220, - 0x38708: 0x6c5f3420, 0x38709: 0x6c5f3620, 0x3870a: 0x6c5f3820, 0x3870b: 0x6c5f3a20, - 0x3870c: 0x6c5f3c20, 0x3870d: 0x6c5f3e20, 0x3870e: 0x6c5f4020, 0x3870f: 0x6c5f4220, - 0x38710: 0x6c5f4420, 0x38711: 0x6c5f4620, 0x38712: 0x6c5f4820, 0x38713: 0x6c5f4a20, - 0x38714: 0x6c5f4c20, 0x38715: 0x6c5f4e20, 0x38716: 0x6c5f5020, 0x38717: 0x6c5f5220, - 0x38718: 0x6c5f5420, 0x38719: 0x6c5f5620, 0x3871a: 0x6c5f5820, 0x3871b: 0x6c5f5a20, - 0x3871c: 0x6c5f5c20, 0x3871d: 0x6c5f5e20, 0x3871e: 0x6c5f6020, 0x3871f: 0x6c5f6220, - 0x38720: 0x6c5f6420, 0x38721: 0x6c5f6620, 0x38722: 0x6c5f6820, 0x38723: 0x6c5f6a20, - 0x38724: 0x6c5f6c20, 0x38725: 0x6c5f6e20, 0x38726: 0x6c5f7020, 0x38727: 0x6c5f7220, - 0x38728: 0x6c5f7420, 0x38729: 0x6c5f7620, 0x3872a: 0x6c5f7820, 0x3872b: 0x6c5f7a20, - 0x3872c: 0x6c5f7c20, 0x3872d: 0x6c841e20, 0x3872e: 0x6c842020, 0x3872f: 0x6c842220, - 0x38730: 0x6c842420, 0x38731: 0x6c842620, 0x38732: 0x6c842820, 0x38733: 0x6c842a20, - 0x38734: 0x6c842c20, 0x38735: 0x6c842e20, 0x38736: 0x6c843020, 0x38737: 0x6c843220, - 0x38738: 0x6c843420, 0x38739: 0x6c843620, 0x3873a: 0x6c843820, 0x3873b: 0x6c843a20, - 0x3873c: 0x6c843c20, 0x3873d: 0x6c843e20, 0x3873e: 0x6c844020, 0x3873f: 0x6c844220, - // Block 0xe1d, offset 0x38740 - 0x38740: 0x6c844420, 0x38741: 0x6c844620, 0x38742: 0x6c844820, 0x38743: 0x6c844a20, - 0x38744: 0x6c844c20, 0x38745: 0x6c844e20, 0x38746: 0x6c845020, 0x38747: 0x6c845220, - 0x38748: 0x6c845420, 0x38749: 0x6c845620, 0x3874a: 0x6c845820, 0x3874b: 0x6c845a20, - 0x3874c: 0x6c845c20, 0x3874d: 0x6c845e20, 0x3874e: 0x6c846020, 0x3874f: 0x6c846220, - 0x38750: 0x6c846420, 0x38751: 0x6c846620, 0x38752: 0x6c846820, 0x38753: 0x6c846a20, - 0x38754: 0x6c846c20, 0x38755: 0x6c846e20, 0x38756: 0x6c847020, 0x38757: 0x6c847220, - 0x38758: 0x6c847420, 0x38759: 0x6c847620, 0x3875a: 0x6c847820, 0x3875b: 0x6c847a20, - 0x3875c: 0x6c847c20, 0x3875d: 0x6c847e20, 0x3875e: 0x6c848020, 0x3875f: 0x6c848220, - 0x38760: 0x6c848420, 0x38761: 0x6c848620, 0x38762: 0x6c848820, 0x38763: 0x6c848a20, - 0x38764: 0x6c848c20, 0x38765: 0x6c848e20, 0x38766: 0x6c849020, 0x38767: 0x6c849220, - 0x38768: 0x6c849420, 0x38769: 0x6c849620, 0x3876a: 0x6c849820, 0x3876b: 0x6c849a20, - 0x3876c: 0x6c849c20, 0x3876d: 0x6c849e20, 0x3876e: 0x6c84a020, 0x3876f: 0x6c84a220, - 0x38770: 0x6c84a420, 0x38771: 0x6c84a620, 0x38772: 0x6c84a820, 0x38773: 0x6c84aa20, - 0x38774: 0x6c84ac20, 0x38775: 0x6c84ae20, 0x38776: 0x6cad1020, 0x38777: 0x6cad1220, - 0x38778: 0x6cad1420, 0x38779: 0x6cad1620, 0x3877a: 0x6cad1820, 0x3877b: 0x6cad1a20, - 0x3877c: 0x6cad1c20, 0x3877d: 0x6cad1e20, 0x3877e: 0x6cad2020, 0x3877f: 0x6cad2220, - // Block 0xe1e, offset 0x38780 - 0x38780: 0x6cad2420, 0x38781: 0x6cad2620, 0x38782: 0x6cad2820, 0x38783: 0x6cad2a20, - 0x38784: 0x6cad2c20, 0x38785: 0x6cad2e20, 0x38786: 0x6cad3020, 0x38787: 0x6cad3220, - 0x38788: 0x6cad3420, 0x38789: 0x6cad3620, 0x3878a: 0x6cad3820, 0x3878b: 0x6cad3a20, - 0x3878c: 0x6cad3c20, 0x3878d: 0x6cad3e20, 0x3878e: 0x6cad4020, 0x3878f: 0x6cad4220, - 0x38790: 0x6cad4420, 0x38791: 0x6cad4620, 0x38792: 0x6cad4820, 0x38793: 0x6cad4a20, - 0x38794: 0x6cad4c20, 0x38795: 0x6cad4e20, 0x38796: 0x6cad5020, 0x38797: 0x6cad5220, - 0x38798: 0x6cad5420, 0x38799: 0x6cad5620, 0x3879a: 0x6cad5820, 0x3879b: 0x6cad5a20, - 0x3879c: 0x6cad5c20, 0x3879d: 0x6cad5e20, 0x3879e: 0x6cad6020, 0x3879f: 0x6cad6220, - 0x387a0: 0x6cad6420, 0x387a1: 0x6cad6620, 0x387a2: 0x6cad6820, 0x387a3: 0x6cad6a20, - 0x387a4: 0x6cad6c20, 0x387a5: 0x6cad6e20, 0x387a6: 0x6cad7020, 0x387a7: 0x6cad7220, - 0x387a8: 0x6cad7420, 0x387a9: 0x6cad7620, 0x387aa: 0x6cad7820, 0x387ab: 0x6cad7a20, - 0x387ac: 0x6cad7c20, 0x387ad: 0x6cad7e20, 0x387ae: 0x6cad8020, 0x387af: 0x6cad8220, - 0x387b0: 0x6cad8420, 0x387b1: 0x6cdbf020, 0x387b2: 0x6cad8620, 0x387b3: 0x6cad8820, - 0x387b4: 0x6cad8a20, 0x387b5: 0x6cad8c20, 0x387b6: 0x6cad8e20, 0x387b7: 0x6cad9020, - 0x387b8: 0x6cad9220, 0x387b9: 0x6cad9420, 0x387ba: 0x6cad9620, 0x387bb: 0x6cad9820, - 0x387bc: 0x6cad9a20, 0x387bd: 0x6cad9c20, 0x387be: 0x6cad9e20, 0x387bf: 0x6cada020, - // Block 0xe1f, offset 0x387c0 - 0x387c0: 0x6cada220, 0x387c1: 0x6cada420, 0x387c2: 0x6cada620, 0x387c3: 0x6cada820, - 0x387c4: 0x6cadaa20, 0x387c5: 0x6cadac20, 0x387c6: 0x6cadae20, 0x387c7: 0x6cadb020, - 0x387c8: 0x6cadb220, 0x387c9: 0x6cadb420, 0x387ca: 0x6cadb620, 0x387cb: 0x6cadb820, - 0x387cc: 0x6cadba20, 0x387cd: 0x6cadbc20, 0x387ce: 0x6cadbe20, 0x387cf: 0x6cadc020, - 0x387d0: 0x6cadc220, 0x387d1: 0x6cadc420, 0x387d2: 0x6cadc620, 0x387d3: 0x6cadc820, - 0x387d4: 0x6cadca20, 0x387d5: 0x6cadcc20, 0x387d6: 0x6cdbf220, 0x387d7: 0x6cadce20, - 0x387d8: 0x6cadd020, 0x387d9: 0x6cadd220, 0x387da: 0x6cadd420, 0x387db: 0x6cadd620, - 0x387dc: 0x6cadd820, 0x387dd: 0x6cadda20, 0x387de: 0x6caddc20, 0x387df: 0x6cadde20, - 0x387e0: 0x6cade020, 0x387e1: 0x6cade220, 0x387e2: 0x6cade420, 0x387e3: 0x6cade620, - 0x387e4: 0x6cade820, 0x387e5: 0x6cadea20, 0x387e6: 0x6cadec20, 0x387e7: 0x6cadee20, - 0x387e8: 0x6cadf020, 0x387e9: 0x6cadf220, 0x387ea: 0x6cdbf420, 0x387eb: 0x6cdbf620, - 0x387ec: 0x6cdbf820, 0x387ed: 0x6cdbfa20, 0x387ee: 0x6cdbfc20, 0x387ef: 0x6cdbfe20, - 0x387f0: 0x6cdc0020, 0x387f1: 0x6cdc0220, 0x387f2: 0x6cdc0420, 0x387f3: 0x6cdc0620, - 0x387f4: 0x6cdc0820, 0x387f5: 0x6cdc0a20, 0x387f6: 0x6cdc0c20, 0x387f7: 0x6cdc0e20, - 0x387f8: 0x6cdc1020, 0x387f9: 0x6cdc1220, 0x387fa: 0x6cdc1420, 0x387fb: 0x6cdc1620, - 0x387fc: 0x6cdc1820, 0x387fd: 0x6cdc1a20, 0x387fe: 0x6cdc1c20, 0x387ff: 0x6cdc1e20, - // Block 0xe20, offset 0x38800 - 0x38800: 0x6cdc2020, 0x38801: 0x6cdc2220, 0x38802: 0x6cdc2420, 0x38803: 0x6cdc2620, - 0x38804: 0x6cdc2820, 0x38805: 0x6cdc2a20, 0x38806: 0x6cdc2c20, 0x38807: 0x6cdc2e20, - 0x38808: 0x6cdc3020, 0x38809: 0x6cdc3220, 0x3880a: 0x6cdc3420, 0x3880b: 0x6cdc3620, - 0x3880c: 0x6cdc3820, 0x3880d: 0x6cdc3a20, 0x3880e: 0x6cdc3c20, 0x3880f: 0x6cdc3e20, - 0x38810: 0x6cdc4020, 0x38811: 0x6cdc4220, 0x38812: 0x6cdc4420, 0x38813: 0x6cdc4620, - 0x38814: 0x6cdc4820, 0x38815: 0x6cdc4a20, 0x38816: 0x6cdc4c20, 0x38817: 0x6cdc4e20, - 0x38818: 0x6cdc5020, 0x38819: 0x6cdc5220, 0x3881a: 0x6cdc5420, 0x3881b: 0x6cdc5620, - 0x3881c: 0x6cdc5820, 0x3881d: 0x6cdc5a20, 0x3881e: 0x6cdc5c20, 0x3881f: 0x6cdc5e20, - 0x38820: 0x6cdc6020, 0x38821: 0x6cdc6220, 0x38822: 0x6cdc6420, 0x38823: 0x6cdc6620, - 0x38824: 0x6cdc6820, 0x38825: 0x6cdc6a20, 0x38826: 0x6cdc6c20, 0x38827: 0x6cdc6e20, - 0x38828: 0x6cdc7020, 0x38829: 0x6cdc7220, 0x3882a: 0x6cdc7420, 0x3882b: 0x6cdc7620, - 0x3882c: 0x6cdc7820, 0x3882d: 0x6cdc7a20, 0x3882e: 0x6cdc7c20, 0x3882f: 0x6cdc7e20, - 0x38830: 0x6cdc8020, 0x38831: 0x6cdc8220, 0x38832: 0x6cdc8420, 0x38833: 0x6cdc8620, - 0x38834: 0x6cdc8820, 0x38835: 0x6cdc8a20, 0x38836: 0x6cdc8c20, 0x38837: 0x6cdc8e20, - 0x38838: 0x6cdc9020, 0x38839: 0x6cdc9220, 0x3883a: 0x6cdc9420, 0x3883b: 0x6cdc9620, - 0x3883c: 0x6cdc9820, 0x3883d: 0x6cdc9a20, 0x3883e: 0x6cdc9c20, 0x3883f: 0x6cdc9e20, - // Block 0xe21, offset 0x38840 - 0x38840: 0x6cdca020, 0x38841: 0x6cdca220, 0x38842: 0x6cdca420, 0x38843: 0x6cdca620, - 0x38844: 0x6cdca820, 0x38845: 0x6cdcaa20, 0x38846: 0x6cdcac20, 0x38847: 0x6cdcae20, - 0x38848: 0x6cdcb020, 0x38849: 0x6cdcb220, 0x3884a: 0x6cdcb420, 0x3884b: 0x6cdcb620, - 0x3884c: 0x6cdcb820, 0x3884d: 0x6cdcba20, 0x3884e: 0x6cdcbc20, 0x3884f: 0x6cdcbe20, - 0x38850: 0x6cdcc020, 0x38851: 0x6cdcc220, 0x38852: 0x6cdcc420, 0x38853: 0x6cdcc620, - 0x38854: 0x6cdcc820, 0x38855: 0x6cdcca20, 0x38856: 0x6cdccc20, 0x38857: 0x6cdcce20, - 0x38858: 0x6cdcd020, 0x38859: 0x6cdcd220, 0x3885a: 0x6cdcd420, 0x3885b: 0x6cdcd620, - 0x3885c: 0x6cdcd820, 0x3885d: 0x6cdcda20, 0x3885e: 0x6cdcdc20, 0x3885f: 0x6cdcde20, - 0x38860: 0x6cdce020, 0x38861: 0x6cdce220, 0x38862: 0x6cdce420, 0x38863: 0x6cdce620, - 0x38864: 0x6cdce820, 0x38865: 0x6cdcea20, 0x38866: 0x6cdcec20, 0x38867: 0x6cdcee20, - 0x38868: 0x6cdcf020, 0x38869: 0x6cdcf220, 0x3886a: 0x6cdcf420, 0x3886b: 0x6cdcf620, - 0x3886c: 0x6cdcf820, 0x3886d: 0x6cdcfa20, 0x3886e: 0x6cdcfc20, 0x3886f: 0x6cdcfe20, - 0x38870: 0x6cdd0020, 0x38871: 0x6cdd0220, 0x38872: 0x6cdd0420, 0x38873: 0x6cdd0620, - 0x38874: 0x6cdd0820, 0x38875: 0x6cdd0a20, 0x38876: 0x6cdd0c20, 0x38877: 0x6cdd0e20, - 0x38878: 0x6cdd1020, 0x38879: 0x6cdd1220, 0x3887a: 0x6cdd1420, 0x3887b: 0x6cdd1620, - 0x3887c: 0x6cdd1820, 0x3887d: 0x6cdd1a20, 0x3887e: 0x6cdd1c20, 0x3887f: 0x6cdd1e20, - // Block 0xe22, offset 0x38880 - 0x38880: 0x6cdd2020, 0x38881: 0x6d0a5020, 0x38882: 0x6d0a5220, 0x38883: 0x6d0a5420, - 0x38884: 0x6d0a5620, 0x38885: 0x6d0a5820, 0x38886: 0x6d0a5a20, 0x38887: 0x6d0a5c20, - 0x38888: 0x6d0a5e20, 0x38889: 0x6d0a6020, 0x3888a: 0x6d0a6220, 0x3888b: 0x6d0a6420, - 0x3888c: 0x6d0a6620, 0x3888d: 0x6d0a6820, 0x3888e: 0x6d0a6a20, 0x3888f: 0x6d0a6c20, - 0x38890: 0x6d0a6e20, 0x38891: 0x6d0a7020, 0x38892: 0x6d0a7220, 0x38893: 0x6d0a7420, - 0x38894: 0x6d0a7620, 0x38895: 0x6d0a7820, 0x38896: 0x6d0a7a20, 0x38897: 0x6d0a7c20, - 0x38898: 0x6d0a7e20, 0x38899: 0x6d0a8020, 0x3889a: 0x6d0a8220, 0x3889b: 0x6d0a8420, - 0x3889c: 0x6d0a8620, 0x3889d: 0x6d0a8820, 0x3889e: 0x6d0a8a20, 0x3889f: 0x6d0a8c20, - 0x388a0: 0x6d0a8e20, 0x388a1: 0x6d0a9020, 0x388a2: 0x6d0a9220, 0x388a3: 0x6d0a9420, - 0x388a4: 0x6d0a9620, 0x388a5: 0x6d0a9820, 0x388a6: 0x6d0a9a20, 0x388a7: 0x6d0a9c20, - 0x388a8: 0x6d0a9e20, 0x388a9: 0x6d0aa020, 0x388aa: 0x6d0aa220, 0x388ab: 0x6d0aa420, - 0x388ac: 0x6d0aa620, 0x388ad: 0x6d0aa820, 0x388ae: 0x6d0aaa20, 0x388af: 0x6d0aac20, - 0x388b0: 0x6d0aae20, 0x388b1: 0x6d0ab020, 0x388b2: 0x6d0ab220, 0x388b3: 0x6d0ab420, - 0x388b4: 0x6d0ab620, 0x388b5: 0x6d0ab820, 0x388b6: 0x6d0aba20, 0x388b7: 0x6d0abc20, - 0x388b8: 0x6d0abe20, 0x388b9: 0x6d0ac020, 0x388ba: 0x6d0ac220, 0x388bb: 0x6d0ac420, - 0x388bc: 0x6d0ac620, 0x388bd: 0x6d0ac820, 0x388be: 0x6d0aca20, 0x388bf: 0x6d0acc20, - // Block 0xe23, offset 0x388c0 - 0x388c0: 0x6d0ace20, 0x388c1: 0x6d0ad020, 0x388c2: 0x6d0ad220, 0x388c3: 0x6d0ad420, - 0x388c4: 0x6d0ad620, 0x388c5: 0x6d0ad820, 0x388c6: 0x6d0ada20, 0x388c7: 0x6d0adc20, - 0x388c8: 0x6d0ade20, 0x388c9: 0x6d0ae020, 0x388ca: 0x6d0ae220, 0x388cb: 0x6d0ae420, - 0x388cc: 0x6d0ae620, 0x388cd: 0x6d0ae820, 0x388ce: 0x6d0aea20, 0x388cf: 0x6d0aec20, - 0x388d0: 0x6d0aee20, 0x388d1: 0x6d0af020, 0x388d2: 0x6d0af220, 0x388d3: 0x6d0af420, - 0x388d4: 0x6d0af620, 0x388d5: 0x6d0af820, 0x388d6: 0x6d0afa20, 0x388d7: 0x6d0afc20, - 0x388d8: 0x6d0afe20, 0x388d9: 0x6d0b0020, 0x388da: 0x6d0b0220, 0x388db: 0x6d0b0420, - 0x388dc: 0x6d0b0620, 0x388dd: 0x6d0b0820, 0x388de: 0x6d0b0a20, 0x388df: 0x6d0b0c20, - 0x388e0: 0x6d0b0e20, 0x388e1: 0x6d0b1020, 0x388e2: 0x6d0b1220, 0x388e3: 0x6d0b1420, - 0x388e4: 0x6d0b1620, 0x388e5: 0x6d0b1820, 0x388e6: 0x6d0b1a20, 0x388e7: 0x6d0b1c20, - 0x388e8: 0x6d0b1e20, 0x388e9: 0x6d0b2020, 0x388ea: 0x6d0b2220, 0x388eb: 0x6d0b2420, - 0x388ec: 0x6d0b2620, 0x388ed: 0x6d0b2820, 0x388ee: 0x6d0b2a20, 0x388ef: 0x6d0b2c20, - 0x388f0: 0x6d0b2e20, 0x388f1: 0x6d0b3020, 0x388f2: 0x6d0b3220, 0x388f3: 0x6d0b3420, - 0x388f4: 0x6d0b3620, 0x388f5: 0x6d0b3820, 0x388f6: 0x6cfba420, 0x388f7: 0x6d0b3a20, - 0x388f8: 0x6d0b3c20, 0x388f9: 0x6d0b3e20, 0x388fa: 0x6d0b4020, 0x388fb: 0x6d0b4220, - 0x388fc: 0x6d0b4420, 0x388fd: 0x6d0b4620, 0x388fe: 0x6d0b4820, 0x388ff: 0x6d0b4a20, - // Block 0xe24, offset 0x38900 - 0x38900: 0x6d0b4c20, 0x38901: 0x6d0b4e20, 0x38902: 0x6d0b5020, 0x38903: 0x6d0b5220, - 0x38904: 0x6d0b5420, 0x38905: 0x6d0b5620, 0x38906: 0x6d0b5820, 0x38907: 0x6d385420, - 0x38908: 0x6d0b5a20, 0x38909: 0x6d0b5c20, 0x3890a: 0x6d0b5e20, 0x3890b: 0x6d0b6020, - 0x3890c: 0x6d0b6220, 0x3890d: 0x6d0b6420, 0x3890e: 0x6d0b6620, 0x3890f: 0x6d0b6820, - 0x38910: 0x6d0b6a20, 0x38911: 0x6d0b6c20, 0x38912: 0x6d0b6e20, 0x38913: 0x6d0b7020, - 0x38914: 0x6d0b7220, 0x38915: 0x6d0b7420, 0x38916: 0x6d0b7620, 0x38917: 0x6d0b7820, - 0x38918: 0x6d0b7a20, 0x38919: 0x6d0b7c20, 0x3891a: 0x6d0b7e20, 0x3891b: 0x6d0b8020, - 0x3891c: 0x6d0b8220, 0x3891d: 0x6d0b8420, 0x3891e: 0x6d0b8620, 0x3891f: 0x6d0b8820, - 0x38920: 0x6d0b8a20, 0x38921: 0x6d385620, 0x38922: 0x6d385820, 0x38923: 0x6d385a20, - 0x38924: 0x6d385c20, 0x38925: 0x6d385e20, 0x38926: 0x6d386020, 0x38927: 0x6d386220, - 0x38928: 0x6d386420, 0x38929: 0x6d386620, 0x3892a: 0x6d386820, 0x3892b: 0x6d386a20, - 0x3892c: 0x6d386c20, 0x3892d: 0x6d386e20, 0x3892e: 0x6d387020, 0x3892f: 0x6d387220, - 0x38930: 0x6d387420, 0x38931: 0x6d387620, 0x38932: 0x6d387820, 0x38933: 0x6d387a20, - 0x38934: 0x6d387c20, 0x38935: 0x6d387e20, 0x38936: 0x6d388020, 0x38937: 0x6d388220, - 0x38938: 0x6d388420, 0x38939: 0x6d388620, 0x3893a: 0x6d388820, 0x3893b: 0x6d388a20, - 0x3893c: 0x6d388c20, 0x3893d: 0x6d388e20, 0x3893e: 0x6d389020, 0x3893f: 0x6d389220, - // Block 0xe25, offset 0x38940 - 0x38940: 0x6d389420, 0x38941: 0x6d389620, 0x38942: 0x6d389820, 0x38943: 0x6d389a20, - 0x38944: 0x6d389c20, 0x38945: 0x6d389e20, 0x38946: 0x6d38a020, 0x38947: 0x6d38a220, - 0x38948: 0x6d38a420, 0x38949: 0x6d38a620, 0x3894a: 0x6d38a820, 0x3894b: 0x6d38aa20, - 0x3894c: 0x6d38ac20, 0x3894d: 0x6d38ae20, 0x3894e: 0x6d38b020, 0x3894f: 0x6d38b220, - 0x38950: 0x6d38b420, 0x38951: 0x6d38b620, 0x38952: 0x6d38b820, 0x38953: 0x6d38ba20, - 0x38954: 0x6d38bc20, 0x38955: 0x6d38be20, 0x38956: 0x6d38c020, 0x38957: 0x6d38c220, - 0x38958: 0x6d38c420, 0x38959: 0x6d38c620, 0x3895a: 0x6d38c820, 0x3895b: 0x6d38ca20, - 0x3895c: 0x6d38cc20, 0x3895d: 0x6d38ce20, 0x3895e: 0x6d38d020, 0x3895f: 0x6d38d220, - 0x38960: 0x6d38d420, 0x38961: 0x6d38d620, 0x38962: 0x6d38d820, 0x38963: 0x6d38da20, - 0x38964: 0x6d38dc20, 0x38965: 0x6d38de20, 0x38966: 0x6d38e020, 0x38967: 0x6d38e220, - 0x38968: 0x6d38e420, 0x38969: 0x6d38e620, 0x3896a: 0x6d38e820, 0x3896b: 0x6d38ea20, - 0x3896c: 0x6d38ec20, 0x3896d: 0x6d38ee20, 0x3896e: 0x6d38f020, 0x3896f: 0x6d38f220, - 0x38970: 0x6d38f420, 0x38971: 0x6d38f620, 0x38972: 0x6d38f820, 0x38973: 0x6d38fa20, - 0x38974: 0x6d38fc20, 0x38975: 0x6d38fe20, 0x38976: 0x6d390020, 0x38977: 0x6d390220, - 0x38978: 0x6d390420, 0x38979: 0x6d390620, 0x3897a: 0x6d390820, 0x3897b: 0x6d390a20, - 0x3897c: 0x6d390c20, 0x3897d: 0x6d390e20, 0x3897e: 0x6d391020, 0x3897f: 0x6d391220, - // Block 0xe26, offset 0x38980 - 0x38980: 0x6d391420, 0x38981: 0x6d391620, 0x38982: 0x6d391820, 0x38983: 0x6d391a20, - 0x38984: 0x6d391c20, 0x38985: 0x6d391e20, 0x38986: 0x6d392020, 0x38987: 0x6d392220, - 0x38988: 0x6d392420, 0x38989: 0x6d392620, 0x3898a: 0x6d392820, 0x3898b: 0x6d392a20, - 0x3898c: 0x6d392c20, 0x3898d: 0x6d392e20, 0x3898e: 0x6d393020, 0x3898f: 0x6d393220, - 0x38990: 0x6d393420, 0x38991: 0x6d393620, 0x38992: 0x6d393820, 0x38993: 0x6d393a20, - 0x38994: 0x6d393c20, 0x38995: 0x6d393e20, 0x38996: 0x6d394020, 0x38997: 0x6d394220, - 0x38998: 0x6d394420, 0x38999: 0x6d394620, 0x3899a: 0x6d394820, 0x3899b: 0x6d394a20, - 0x3899c: 0x6d394c20, 0x3899d: 0x6d394e20, 0x3899e: 0x6d395020, 0x3899f: 0x6d395220, - 0x389a0: 0x6d395420, 0x389a1: 0x6d395620, 0x389a2: 0x6d395820, 0x389a3: 0x6d395a20, - 0x389a4: 0x6d395c20, 0x389a5: 0x6d395e20, 0x389a6: 0x6d396020, 0x389a7: 0x6d396220, - 0x389a8: 0x6d396420, 0x389a9: 0x6d396620, 0x389aa: 0x6d396820, 0x389ab: 0x6d396a20, - 0x389ac: 0x6d396c20, 0x389ad: 0x6d396e20, 0x389ae: 0x6d397020, 0x389af: 0x6d397220, - 0x389b0: 0x6d397420, 0x389b1: 0x6d397620, 0x389b2: 0x6d397820, 0x389b3: 0x6d397a20, - 0x389b4: 0x6d397c20, 0x389b5: 0x6d397e20, 0x389b6: 0x6d398020, 0x389b7: 0x6d398220, - 0x389b8: 0x6d398420, 0x389b9: 0x6d398620, 0x389ba: 0x6d398820, 0x389bb: 0x6d398a20, - 0x389bc: 0x6d398c20, 0x389bd: 0x6d398e20, 0x389be: 0x6d399020, 0x389bf: 0x6d64ba20, - // Block 0xe27, offset 0x389c0 - 0x389c0: 0x6d64bc20, 0x389c1: 0x6d64be20, 0x389c2: 0x6d64c020, 0x389c3: 0x6d64c220, - 0x389c4: 0x6d64c420, 0x389c5: 0x6d64c620, 0x389c6: 0x6d64c820, 0x389c7: 0x6d64ca20, - 0x389c8: 0x6d64cc20, 0x389c9: 0x6d64ce20, 0x389ca: 0x6d64d020, 0x389cb: 0x6d64d220, - 0x389cc: 0x6d64d420, 0x389cd: 0x6d64d620, 0x389ce: 0x6d64d820, 0x389cf: 0x6d64da20, - 0x389d0: 0x6d64dc20, 0x389d1: 0x6d64de20, 0x389d2: 0x6d64e020, 0x389d3: 0x6d64e220, - 0x389d4: 0x6d64e420, 0x389d5: 0x6d64e620, 0x389d6: 0x6d64e820, 0x389d7: 0x6d64ea20, - 0x389d8: 0x6d64ec20, 0x389d9: 0x6d64ee20, 0x389da: 0x6d64f020, 0x389db: 0x6d64f220, - 0x389dc: 0x6d64f420, 0x389dd: 0x6d64f620, 0x389de: 0x6d64f820, 0x389df: 0x6d64fa20, - 0x389e0: 0x6d64fc20, 0x389e1: 0x6d64fe20, 0x389e2: 0x6d650020, 0x389e3: 0x6d650220, - 0x389e4: 0x6d650420, 0x389e5: 0x6d650620, 0x389e6: 0x6d650820, 0x389e7: 0x6d650a20, - 0x389e8: 0x6d650c20, 0x389e9: 0x6d650e20, 0x389ea: 0x6d651020, 0x389eb: 0x6d651220, - 0x389ec: 0x6d651420, 0x389ed: 0x6d651620, 0x389ee: 0x6d651820, 0x389ef: 0x6d651a20, - 0x389f0: 0x6d651c20, 0x389f1: 0x6d651e20, 0x389f2: 0x6d652020, 0x389f3: 0x6d652220, - 0x389f4: 0x6d652420, 0x389f5: 0x6d652620, 0x389f6: 0x6d652820, 0x389f7: 0x6d652a20, - 0x389f8: 0x6d652c20, 0x389f9: 0x6d652e20, 0x389fa: 0x6d653020, 0x389fb: 0x6d653220, - 0x389fc: 0x6d653420, 0x389fd: 0x6d8e6c20, 0x389fe: 0x6d653620, 0x389ff: 0x6d653820, - // Block 0xe28, offset 0x38a00 - 0x38a00: 0x6d653a20, 0x38a01: 0x6d653c20, 0x38a02: 0x6d653e20, 0x38a03: 0x6d654020, - 0x38a04: 0x6d654220, 0x38a05: 0x6d654420, 0x38a06: 0x6d654620, 0x38a07: 0x6d654820, - 0x38a08: 0x6d654a20, 0x38a09: 0x6d654c20, 0x38a0a: 0x6d654e20, 0x38a0b: 0x6d655020, - 0x38a0c: 0x6d655220, 0x38a0d: 0x6d655420, 0x38a0e: 0x6d655620, 0x38a0f: 0x6d655820, - 0x38a10: 0x6d655a20, 0x38a11: 0x6d655c20, 0x38a12: 0x6d655e20, 0x38a13: 0x6d656020, - 0x38a14: 0x6d656220, 0x38a15: 0x6d656420, 0x38a16: 0x6d656620, 0x38a17: 0x6d656820, - 0x38a18: 0x6d656a20, 0x38a19: 0x6d656c20, 0x38a1a: 0x6d656e20, 0x38a1b: 0x6d657020, - 0x38a1c: 0x6d657220, 0x38a1d: 0x6d657420, 0x38a1e: 0x6d657620, 0x38a1f: 0x6d657820, - 0x38a20: 0x6d657a20, 0x38a21: 0x6d657c20, 0x38a22: 0x6d657e20, 0x38a23: 0x6d658020, - 0x38a24: 0x6d658220, 0x38a25: 0x6d658420, 0x38a26: 0x6d658620, 0x38a27: 0x6d658820, - 0x38a28: 0x6d658a20, 0x38a29: 0x6d658c20, 0x38a2a: 0x6d658e20, 0x38a2b: 0x6d659020, - 0x38a2c: 0x6d659220, 0x38a2d: 0x6d659420, 0x38a2e: 0x6d659620, 0x38a2f: 0x6d659820, - 0x38a30: 0x6d659a20, 0x38a31: 0x6d659c20, 0x38a32: 0x6d659e20, 0x38a33: 0x6d65a020, - 0x38a34: 0x6d65a220, 0x38a35: 0x6d65a420, 0x38a36: 0x6d65a620, 0x38a37: 0x6d65a820, - 0x38a38: 0x6d65aa20, 0x38a39: 0x6d65ac20, 0x38a3a: 0x6d65ae20, 0x38a3b: 0x6d65b020, - 0x38a3c: 0x6d65b220, 0x38a3d: 0x6d65b420, 0x38a3e: 0x6d65b620, 0x38a3f: 0x6d65b820, - // Block 0xe29, offset 0x38a40 - 0x38a40: 0x6d65ba20, 0x38a41: 0x6d65bc20, 0x38a42: 0x6d65be20, 0x38a43: 0x6d65c020, - 0x38a44: 0x6d65c220, 0x38a45: 0x6e454c20, 0x38a46: 0x6d8e6e20, 0x38a47: 0x6d8e7020, - 0x38a48: 0x6d8e7220, 0x38a49: 0x6d8e7420, 0x38a4a: 0x6d8e7620, 0x38a4b: 0x6d8e7820, - 0x38a4c: 0x6d8e7a20, 0x38a4d: 0x6d8e7c20, 0x38a4e: 0x6d8e7e20, 0x38a4f: 0x6d8e8020, - 0x38a50: 0x6d8e8220, 0x38a51: 0x6d8e8420, 0x38a52: 0x6d8e8620, 0x38a53: 0x6d8e8820, - 0x38a54: 0x6d8e8a20, 0x38a55: 0x6d8e8c20, 0x38a56: 0x6d8e8e20, 0x38a57: 0x6d8e9020, - 0x38a58: 0x6d8e9220, 0x38a59: 0x6d8e9420, 0x38a5a: 0x6d8e9620, 0x38a5b: 0x6d8e9820, - 0x38a5c: 0x6d8e9a20, 0x38a5d: 0x6d8e9c20, 0x38a5e: 0x6d8e9e20, 0x38a5f: 0x6d8ea020, - 0x38a60: 0x6d8ea220, 0x38a61: 0x6d8ea420, 0x38a62: 0x6d8ea620, 0x38a63: 0x6d8ea820, - 0x38a64: 0x6d8eaa20, 0x38a65: 0x6d8eac20, 0x38a66: 0x6d8eae20, 0x38a67: 0x6d8eb020, - 0x38a68: 0x6d8eb220, 0x38a69: 0x6d8eb420, 0x38a6a: 0x6d8eb620, 0x38a6b: 0x6d8eb820, - 0x38a6c: 0x6d8eba20, 0x38a6d: 0x6d8ebc20, 0x38a6e: 0x6d8ebe20, 0x38a6f: 0x6d8ec020, - 0x38a70: 0x6d8ec220, 0x38a71: 0x6d8ec420, 0x38a72: 0x6d8ec620, 0x38a73: 0x6d8ec820, - 0x38a74: 0x6d8eca20, 0x38a75: 0x6d8ecc20, 0x38a76: 0x6d8ece20, 0x38a77: 0x6d8ed020, - 0x38a78: 0x6d8ed220, 0x38a79: 0x6d8ed420, 0x38a7a: 0x6d8ed620, 0x38a7b: 0x6d8ed820, - 0x38a7c: 0x6d8eda20, 0x38a7d: 0x6d8edc20, 0x38a7e: 0x6d8ede20, 0x38a7f: 0x6d8ee020, - // Block 0xe2a, offset 0x38a80 - 0x38a80: 0x6d8ee220, 0x38a81: 0x6d8ee420, 0x38a82: 0x6d8ee620, 0x38a83: 0x6d8ee820, - 0x38a84: 0x6d8eea20, 0x38a85: 0x6d8eec20, 0x38a86: 0x6d8eee20, 0x38a87: 0x6dc5f420, - 0x38a88: 0x6d8ef020, 0x38a89: 0x6d8ef220, 0x38a8a: 0x6d8ef420, 0x38a8b: 0x6d8ef620, - 0x38a8c: 0x6d8ef820, 0x38a8d: 0x6d8efa20, 0x38a8e: 0x6d8efc20, 0x38a8f: 0x6d8efe20, - 0x38a90: 0x6d8f0020, 0x38a91: 0x6d8f0220, 0x38a92: 0x6d8f0420, 0x38a93: 0x6d8f0620, - 0x38a94: 0x6d8f0820, 0x38a95: 0x6d8f0a20, 0x38a96: 0x6d8f0c20, 0x38a97: 0x6d8f0e20, - 0x38a98: 0x6d8f1020, 0x38a99: 0x6d8f1220, 0x38a9a: 0x6d8f1420, 0x38a9b: 0x6d8f1620, - 0x38a9c: 0x6d8f1820, 0x38a9d: 0x6d8f1a20, 0x38a9e: 0x6d8f1c20, 0x38a9f: 0x6d8f1e20, - 0x38aa0: 0x6d8f2020, 0x38aa1: 0x6d8f2220, 0x38aa2: 0x6d8f2420, 0x38aa3: 0x6d8f2620, - 0x38aa4: 0x6d8f2820, 0x38aa5: 0x6d8f2a20, 0x38aa6: 0x6d8f2c20, 0x38aa7: 0x6d8f2e20, - 0x38aa8: 0x6d8f3020, 0x38aa9: 0x6d8f3220, 0x38aaa: 0x6d8f3420, 0x38aab: 0x6d8f3620, - 0x38aac: 0x6d8f3820, 0x38aad: 0x6d8f3a20, 0x38aae: 0x6d8f3c20, 0x38aaf: 0x6d8f3e20, - 0x38ab0: 0x6d8f4020, 0x38ab1: 0x6d8f4220, 0x38ab2: 0x6d8f4420, 0x38ab3: 0x6d8f4620, - 0x38ab4: 0x6d8f4820, 0x38ab5: 0x6d8f4a20, 0x38ab6: 0x6d8f4c20, 0x38ab7: 0x6d8f4e20, - 0x38ab8: 0x6d8f5020, 0x38ab9: 0x6d8f5220, 0x38aba: 0x6d8f5420, 0x38abb: 0x6d8f5620, - 0x38abc: 0x6d8f5820, 0x38abd: 0x6d8f5a20, 0x38abe: 0x6db26e20, 0x38abf: 0x6d8f5c20, - // Block 0xe2b, offset 0x38ac0 - 0x38ac0: 0x6d8f5e20, 0x38ac1: 0x6d8f6020, 0x38ac2: 0x6d8f6220, 0x38ac3: 0x6d8f6420, - 0x38ac4: 0x6d8f6620, 0x38ac5: 0x6d8f6820, 0x38ac6: 0x6d8f6a20, 0x38ac7: 0x6d8f6c20, - 0x38ac8: 0x6d8f6e20, 0x38ac9: 0x6d8f7020, 0x38aca: 0x6d8f7220, 0x38acb: 0x6d8f7420, - 0x38acc: 0x6d8f7620, 0x38acd: 0x6d8f7820, 0x38ace: 0x6d8f7a20, 0x38acf: 0x6d8f7c20, - 0x38ad0: 0x6d8f7e20, 0x38ad1: 0x6d8f8020, 0x38ad2: 0x6d8f8220, 0x38ad3: 0x6d8f8420, - 0x38ad4: 0x6d8f8620, 0x38ad5: 0x6d8f8820, 0x38ad6: 0x6d8f8a20, 0x38ad7: 0x6d8f8c20, - 0x38ad8: 0x6d8f8e20, 0x38ad9: 0x6d8f9020, 0x38ada: 0x6d8f9220, 0x38adb: 0x6d8f9420, - 0x38adc: 0x6d8f9620, 0x38add: 0x6d8f9820, 0x38ade: 0x6d8f9a20, 0x38adf: 0x6d8f9c20, - 0x38ae0: 0x6d8f9e20, 0x38ae1: 0x6d8fa020, 0x38ae2: 0x6d8fa220, 0x38ae3: 0x6d8fa420, - 0x38ae4: 0x6d8fa620, 0x38ae5: 0x6d8fa820, 0x38ae6: 0x6d8faa20, 0x38ae7: 0x6d8fac20, - 0x38ae8: 0x6d8fae20, 0x38ae9: 0x6db27020, 0x38aea: 0x6db27220, 0x38aeb: 0x6db27420, - 0x38aec: 0x6db27620, 0x38aed: 0x6db27820, 0x38aee: 0x6db27a20, 0x38aef: 0x6db27c20, - 0x38af0: 0x6db27e20, 0x38af1: 0x6db28020, 0x38af2: 0x6db28220, 0x38af3: 0x6db28420, - 0x38af4: 0x6db28620, 0x38af5: 0x6db28820, 0x38af6: 0x6db28a20, 0x38af7: 0x6db28c20, - 0x38af8: 0x6db28e20, 0x38af9: 0x6db29020, 0x38afa: 0x6db29220, 0x38afb: 0x6db29420, - 0x38afc: 0x6db29620, 0x38afd: 0x6db29820, 0x38afe: 0x6db29a20, 0x38aff: 0x6db29c20, - // Block 0xe2c, offset 0x38b00 - 0x38b00: 0x6db29e20, 0x38b01: 0x6db2a020, 0x38b02: 0x6db2a220, 0x38b03: 0x6db2a420, - 0x38b04: 0x6db2a620, 0x38b05: 0x6db2a820, 0x38b06: 0x6db2aa20, 0x38b07: 0x6db2ac20, - 0x38b08: 0x6db2ae20, 0x38b09: 0x6db2b020, 0x38b0a: 0x6db2b220, 0x38b0b: 0x6db2b420, - 0x38b0c: 0x6db2b620, 0x38b0d: 0x6db2b820, 0x38b0e: 0x6db2ba20, 0x38b0f: 0x6db2bc20, - 0x38b10: 0x6db2be20, 0x38b11: 0x6db2c020, 0x38b12: 0x6db2c220, 0x38b13: 0x6db2c420, - 0x38b14: 0x6db2c620, 0x38b15: 0x6db2c820, 0x38b16: 0x6db2ca20, 0x38b17: 0x6db2cc20, - 0x38b18: 0x6db2ce20, 0x38b19: 0x6db2d020, 0x38b1a: 0x6db2d220, 0x38b1b: 0x6db2d420, - 0x38b1c: 0x6db2d620, 0x38b1d: 0x6db2d820, 0x38b1e: 0x6db2da20, 0x38b1f: 0x6db2dc20, - 0x38b20: 0x6db2de20, 0x38b21: 0x6db2e020, 0x38b22: 0x6db2e220, 0x38b23: 0x6db2e420, - 0x38b24: 0x6db2e620, 0x38b25: 0x6db2e820, 0x38b26: 0x6db2ea20, 0x38b27: 0x6db2ec20, - 0x38b28: 0x6db2ee20, 0x38b29: 0x6db2f020, 0x38b2a: 0x6db2f220, 0x38b2b: 0x6db2f420, - 0x38b2c: 0x6db2f620, 0x38b2d: 0x6d8fb020, 0x38b2e: 0x6db2f820, 0x38b2f: 0x6db2fa20, - 0x38b30: 0x6db2fc20, 0x38b31: 0x6db2fe20, 0x38b32: 0x6db30020, 0x38b33: 0x6db30220, - 0x38b34: 0x6db30420, 0x38b35: 0x6db30620, 0x38b36: 0x6db30820, 0x38b37: 0x6db30a20, - 0x38b38: 0x6db30c20, 0x38b39: 0x6db30e20, 0x38b3a: 0x6db31020, 0x38b3b: 0x6db31220, - 0x38b3c: 0x6db31420, 0x38b3d: 0x6db31620, 0x38b3e: 0x6db31820, 0x38b3f: 0x6db31a20, - // Block 0xe2d, offset 0x38b40 - 0x38b40: 0x6db31c20, 0x38b41: 0x6db31e20, 0x38b42: 0x6db32020, 0x38b43: 0x6db32220, - 0x38b44: 0x6db32420, 0x38b45: 0x6db32620, 0x38b46: 0x6db32820, 0x38b47: 0x6db32a20, - 0x38b48: 0x6db32c20, 0x38b49: 0x6db32e20, 0x38b4a: 0x6db33020, 0x38b4b: 0x6db33220, - 0x38b4c: 0x6db33420, 0x38b4d: 0x6db33620, 0x38b4e: 0x6db33820, 0x38b4f: 0x6db33a20, - 0x38b50: 0x6db33c20, 0x38b51: 0x6db33e20, 0x38b52: 0x6db34020, 0x38b53: 0x6db34220, - 0x38b54: 0x6db34420, 0x38b55: 0x6db34620, 0x38b56: 0x6db34820, 0x38b57: 0x6db34a20, - 0x38b58: 0x6db34c20, 0x38b59: 0x6db34e20, 0x38b5a: 0x6db35020, 0x38b5b: 0x6db35220, - 0x38b5c: 0x6db35420, 0x38b5d: 0x6db35620, 0x38b5e: 0x6db35820, 0x38b5f: 0x6db35a20, - 0x38b60: 0x6db35c20, 0x38b61: 0x6db35e20, 0x38b62: 0x6db36020, 0x38b63: 0x6db36220, - 0x38b64: 0x6db36420, 0x38b65: 0x6db36620, 0x38b66: 0x6db36820, 0x38b67: 0x6db36a20, - 0x38b68: 0x6db36c20, 0x38b69: 0x6db36e20, 0x38b6a: 0x6dd19420, 0x38b6b: 0x6dd19620, - 0x38b6c: 0x6dd19820, 0x38b6d: 0x6dd19a20, 0x38b6e: 0x6dd19c20, 0x38b6f: 0x6dd19e20, - 0x38b70: 0x6dd1a020, 0x38b71: 0x6dd1a220, 0x38b72: 0x6dd1a420, 0x38b73: 0x6dd1a620, - 0x38b74: 0x6dd1a820, 0x38b75: 0x6dd1aa20, 0x38b76: 0x6dd1ac20, 0x38b77: 0x6dd1ae20, - 0x38b78: 0x6dd1b020, 0x38b79: 0x6dd1b220, 0x38b7a: 0x6dd1b420, 0x38b7b: 0x6dd1b620, - 0x38b7c: 0x6dd1b820, 0x38b7d: 0x6dd1ba20, 0x38b7e: 0x6dd1bc20, 0x38b7f: 0x6dd1be20, - // Block 0xe2e, offset 0x38b80 - 0x38b80: 0x6dd1c020, 0x38b81: 0x6dd1c220, 0x38b82: 0x6dd1c420, 0x38b83: 0x6dd1c620, - 0x38b84: 0x6dd1c820, 0x38b85: 0x6dd1ca20, 0x38b86: 0x6dd1cc20, 0x38b87: 0x6dd1ce20, - 0x38b88: 0x6dd1d020, 0x38b89: 0x6dd1d220, 0x38b8a: 0x6dd1d420, 0x38b8b: 0x6dd1d620, - 0x38b8c: 0x6dd1d820, 0x38b8d: 0x6dd1da20, 0x38b8e: 0x6dd1dc20, 0x38b8f: 0x6dd1de20, - 0x38b90: 0x6dd1e020, 0x38b91: 0x6dd1e220, 0x38b92: 0x6dd1e420, 0x38b93: 0x6dd1e620, - 0x38b94: 0x6deb0220, 0x38b95: 0x6deb0420, 0x38b96: 0x6dd1e820, 0x38b97: 0x6dd1ea20, - 0x38b98: 0x6dd1ec20, 0x38b99: 0x6dd1ee20, 0x38b9a: 0x6dd1f020, 0x38b9b: 0x6dd1f220, - 0x38b9c: 0x6dd1f420, 0x38b9d: 0x6deb0620, 0x38b9e: 0x6dd1f620, 0x38b9f: 0x6dd1f820, - 0x38ba0: 0x6dd1fa20, 0x38ba1: 0x6db37020, 0x38ba2: 0x6dd1fc20, 0x38ba3: 0x6dd1fe20, - 0x38ba4: 0x6dd20020, 0x38ba5: 0x6dd20220, 0x38ba6: 0x6dd20420, 0x38ba7: 0x6dd20620, - 0x38ba8: 0x6dd20820, 0x38ba9: 0x6dd20a20, 0x38baa: 0x6dd20c20, 0x38bab: 0x6dd20e20, - 0x38bac: 0x6dd21020, 0x38bad: 0x6dd21220, 0x38bae: 0x6dd21420, 0x38baf: 0x6dd21620, - 0x38bb0: 0x6dd21820, 0x38bb1: 0x6dd21a20, 0x38bb2: 0x6dd21c20, 0x38bb3: 0x6dd21e20, - 0x38bb4: 0x6dd22020, 0x38bb5: 0x6dd22220, 0x38bb6: 0x6dd22420, 0x38bb7: 0x6dd22620, - 0x38bb8: 0x6db37220, 0x38bb9: 0x6dd22820, 0x38bba: 0x6dd22a20, 0x38bbb: 0x6dd22c20, - 0x38bbc: 0x6dd22e20, 0x38bbd: 0x6dd23020, 0x38bbe: 0x6dd23220, 0x38bbf: 0x6dd23420, - // Block 0xe2f, offset 0x38bc0 - 0x38bc0: 0x6dd23620, 0x38bc1: 0x6dd23820, 0x38bc2: 0x6dd23a20, 0x38bc3: 0x6dd23c20, - 0x38bc4: 0x6dd23e20, 0x38bc5: 0x6dd24020, 0x38bc6: 0x6dd24220, 0x38bc7: 0x6dd24420, - 0x38bc8: 0x6dd24620, 0x38bc9: 0x6dd24820, 0x38bca: 0x6dd24a20, 0x38bcb: 0x6dd24c20, - 0x38bcc: 0x6dd24e20, 0x38bcd: 0x6dd25020, 0x38bce: 0x6dd25220, 0x38bcf: 0x6dd25420, - 0x38bd0: 0x6dd25620, 0x38bd1: 0x6dd25820, 0x38bd2: 0x6dd25a20, 0x38bd3: 0x6dd25c20, - 0x38bd4: 0x6dd25e20, 0x38bd5: 0x6dd26020, 0x38bd6: 0x6dd26220, 0x38bd7: 0x6dd26420, - 0x38bd8: 0x6dd26620, 0x38bd9: 0x6dd26820, 0x38bda: 0x6dd26a20, 0x38bdb: 0x6dd26c20, - 0x38bdc: 0x6dd26e20, 0x38bdd: 0x6dd27020, 0x38bde: 0x6dd27220, 0x38bdf: 0x6dd27420, - 0x38be0: 0x6deb0820, 0x38be1: 0x6deb0a20, 0x38be2: 0x6deb0c20, 0x38be3: 0x6deb0e20, - 0x38be4: 0x6deb1020, 0x38be5: 0x6deb1220, 0x38be6: 0x6deb1420, 0x38be7: 0x6deb1620, - 0x38be8: 0x6deb1820, 0x38be9: 0x6deb1a20, 0x38bea: 0x6deb1c20, 0x38beb: 0x6deb1e20, - 0x38bec: 0x6deb2020, 0x38bed: 0x6deb2220, 0x38bee: 0x6deb2420, 0x38bef: 0x6deb2620, - 0x38bf0: 0x6deb2820, 0x38bf1: 0x6deb2a20, 0x38bf2: 0x6deb2c20, 0x38bf3: 0x6deb2e20, - 0x38bf4: 0x6deb3020, 0x38bf5: 0x6deb3220, 0x38bf6: 0x6deb3420, 0x38bf7: 0x6deb3620, - 0x38bf8: 0x6deb3820, 0x38bf9: 0x6deb3a20, 0x38bfa: 0x6deb3c20, 0x38bfb: 0x6deb3e20, - 0x38bfc: 0x6deb4020, 0x38bfd: 0x6deb4220, 0x38bfe: 0x6deb4420, 0x38bff: 0x6deb4620, - // Block 0xe30, offset 0x38c00 - 0x38c00: 0x6deb4820, 0x38c01: 0x6deb4a20, 0x38c02: 0x6deb4c20, 0x38c03: 0x6deb4e20, - 0x38c04: 0x6deb5020, 0x38c05: 0x6deb5220, 0x38c06: 0x6deb5420, 0x38c07: 0x6deb5620, - 0x38c08: 0x6deb5820, 0x38c09: 0x6deb5a20, 0x38c0a: 0x6deb5c20, 0x38c0b: 0x6deb5e20, - 0x38c0c: 0x6deb6020, 0x38c0d: 0x6deb6220, 0x38c0e: 0x6deb6420, 0x38c0f: 0x6deb6620, - 0x38c10: 0x6deb6820, 0x38c11: 0x6deb6a20, 0x38c12: 0x6deb6c20, 0x38c13: 0x6deb6e20, - 0x38c14: 0x6deb7020, 0x38c15: 0x6deb7220, 0x38c16: 0x6deb7420, 0x38c17: 0x6deb7620, - 0x38c18: 0x6deb7820, 0x38c19: 0x6deb7a20, 0x38c1a: 0x6deb7c20, 0x38c1b: 0x6deb7e20, - 0x38c1c: 0x6deb8020, 0x38c1d: 0x6deb8220, 0x38c1e: 0x6deb8420, 0x38c1f: 0x6deb8620, - 0x38c20: 0x6deb8820, 0x38c21: 0x6deb8a20, 0x38c22: 0x6deb8c20, 0x38c23: 0x6deb8e20, - 0x38c24: 0x6deb9020, 0x38c25: 0x6deb9220, 0x38c26: 0x6deb9420, 0x38c27: 0x6deb9620, - 0x38c28: 0x6deb9820, 0x38c29: 0x6deb9a20, 0x38c2a: 0x6deb9c20, 0x38c2b: 0x6deb9e20, - 0x38c2c: 0x6deba020, 0x38c2d: 0x6deba220, 0x38c2e: 0x6deba420, 0x38c2f: 0x6deba620, - 0x38c30: 0x6deba820, 0x38c31: 0x6debaa20, 0x38c32: 0x6debac20, 0x38c33: 0x6debae20, - 0x38c34: 0x6debb020, 0x38c35: 0x6debb220, 0x38c36: 0x6debb420, 0x38c37: 0x6debb620, - 0x38c38: 0x6debb820, 0x38c39: 0x6debba20, 0x38c3a: 0x6debbc20, 0x38c3b: 0x6e00a820, - 0x38c3c: 0x6e00aa20, 0x38c3d: 0x6e00ac20, 0x38c3e: 0x6e00ae20, 0x38c3f: 0x6e00b020, - // Block 0xe31, offset 0x38c40 - 0x38c40: 0x6e00b220, 0x38c41: 0x6e00b420, 0x38c42: 0x6e00b620, 0x38c43: 0x6e00b820, - 0x38c44: 0x6e00ba20, 0x38c45: 0x6e00bc20, 0x38c46: 0x6e00be20, 0x38c47: 0x6e00c020, - 0x38c48: 0x6e00c220, 0x38c49: 0x6e00c420, 0x38c4a: 0x6e00c620, 0x38c4b: 0x6e00c820, - 0x38c4c: 0x6e00ca20, 0x38c4d: 0x6e00cc20, 0x38c4e: 0x6e00ce20, 0x38c4f: 0x6e00d020, - 0x38c50: 0x6e00d220, 0x38c51: 0x6e00d420, 0x38c52: 0x6e00d620, 0x38c53: 0x6e00d820, - 0x38c54: 0x6e00da20, 0x38c55: 0x6e00dc20, 0x38c56: 0x6e00de20, 0x38c57: 0x6e00e020, - 0x38c58: 0x6e00e220, 0x38c59: 0x6e00e420, 0x38c5a: 0x6e00e620, 0x38c5b: 0x6e00e820, - 0x38c5c: 0x6e00ea20, 0x38c5d: 0x6e00ec20, 0x38c5e: 0x6e00ee20, 0x38c5f: 0x6e00f020, - 0x38c60: 0x6e00f220, 0x38c61: 0x6e00f420, 0x38c62: 0x6e00f620, 0x38c63: 0x6e00f820, - 0x38c64: 0x6e00fa20, 0x38c65: 0x6e00fc20, 0x38c66: 0x6e00fe20, 0x38c67: 0x6e010020, - 0x38c68: 0x6e010220, 0x38c69: 0x6e010420, 0x38c6a: 0x6e010620, 0x38c6b: 0x6e010820, - 0x38c6c: 0x6e010a20, 0x38c6d: 0x6e010c20, 0x38c6e: 0x6e010e20, 0x38c6f: 0x6e011020, - 0x38c70: 0x6e011220, 0x38c71: 0x6e011420, 0x38c72: 0x6e011620, 0x38c73: 0x6e011820, - 0x38c74: 0x6e011a20, 0x38c75: 0x6e011c20, 0x38c76: 0x6e011e20, 0x38c77: 0x6e012020, - 0x38c78: 0x6e012220, 0x38c79: 0x6e012420, 0x38c7a: 0x6e012620, 0x38c7b: 0x6e012820, - 0x38c7c: 0x6e012a20, 0x38c7d: 0x6e012c20, 0x38c7e: 0x6e012e20, 0x38c7f: 0x6e013020, - // Block 0xe32, offset 0x38c80 - 0x38c80: 0x6e013220, 0x38c81: 0x6e013420, 0x38c82: 0x6e013620, 0x38c83: 0x6e013820, - 0x38c84: 0x6e013a20, 0x38c85: 0x6e013c20, 0x38c86: 0x6e013e20, 0x38c87: 0x6e014020, - 0x38c88: 0x6e014220, 0x38c89: 0x6e014420, 0x38c8a: 0x6e014620, 0x38c8b: 0x6e014820, - 0x38c8c: 0x6debbe20, 0x38c8d: 0x6e12ba20, 0x38c8e: 0x6e014a20, 0x38c8f: 0x6e12bc20, - 0x38c90: 0x6e12be20, 0x38c91: 0x6e12c020, 0x38c92: 0x6e12c220, 0x38c93: 0x6e12c420, - 0x38c94: 0x6e12c620, 0x38c95: 0x6e12c820, 0x38c96: 0x6e12ca20, 0x38c97: 0x6e12cc20, - 0x38c98: 0x6e12ce20, 0x38c99: 0x6e12d020, 0x38c9a: 0x6e12d220, 0x38c9b: 0x6e12d420, - 0x38c9c: 0x6e12d620, 0x38c9d: 0x6e12d820, 0x38c9e: 0x6e12da20, 0x38c9f: 0x6e12dc20, - 0x38ca0: 0x6e12de20, 0x38ca1: 0x6e12e020, 0x38ca2: 0x6e12e220, 0x38ca3: 0x6e12e420, - 0x38ca4: 0x6e12e620, 0x38ca5: 0x6e12e820, 0x38ca6: 0x6e12ea20, 0x38ca7: 0x6e12ec20, - 0x38ca8: 0x6e12ee20, 0x38ca9: 0x6e12f020, 0x38caa: 0x6e12f220, 0x38cab: 0x6e12f420, - 0x38cac: 0x6e12f620, 0x38cad: 0x6e12f820, 0x38cae: 0x6e12fa20, 0x38caf: 0x6e12fc20, - 0x38cb0: 0x6e12fe20, 0x38cb1: 0x6e130020, 0x38cb2: 0x6e130220, 0x38cb3: 0x6e130420, - 0x38cb4: 0x6e130620, 0x38cb5: 0x6e130820, 0x38cb6: 0x6e130a20, 0x38cb7: 0x6e130c20, - 0x38cb8: 0x6e130e20, 0x38cb9: 0x6e131020, 0x38cba: 0x6e131220, 0x38cbb: 0x6e131420, - 0x38cbc: 0x6e131620, 0x38cbd: 0x6e131820, 0x38cbe: 0x6e131a20, 0x38cbf: 0x6e131c20, - // Block 0xe33, offset 0x38cc0 - 0x38cc0: 0x6e131e20, 0x38cc1: 0x6e132020, 0x38cc2: 0x6e132220, 0x38cc3: 0x6e132420, - 0x38cc4: 0x6e132620, 0x38cc5: 0x6e132820, 0x38cc6: 0x6e132a20, 0x38cc7: 0x6e132c20, - 0x38cc8: 0x6e132e20, 0x38cc9: 0x6e133020, 0x38cca: 0x6e133220, 0x38ccb: 0x6e133420, - 0x38ccc: 0x6e133620, 0x38ccd: 0x6e20c620, 0x38cce: 0x6e20c820, 0x38ccf: 0x6e20ca20, - 0x38cd0: 0x6e20cc20, 0x38cd1: 0x6e20ce20, 0x38cd2: 0x6e20d020, 0x38cd3: 0x6e20d220, - 0x38cd4: 0x6e20d420, 0x38cd5: 0x6e20d620, 0x38cd6: 0x6e20d820, 0x38cd7: 0x6e20da20, - 0x38cd8: 0x6e20dc20, 0x38cd9: 0x6e20de20, 0x38cda: 0x6e20e020, 0x38cdb: 0x6e20e220, - 0x38cdc: 0x6e20e420, 0x38cdd: 0x6e20e620, 0x38cde: 0x6e20e820, 0x38cdf: 0x6e20ea20, - 0x38ce0: 0x6e20ec20, 0x38ce1: 0x6e20ee20, 0x38ce2: 0x6e20f020, 0x38ce3: 0x6e20f220, - 0x38ce4: 0x6e20f420, 0x38ce5: 0x6e20f620, 0x38ce6: 0x6e20f820, 0x38ce7: 0x6e20fa20, - 0x38ce8: 0x6e20fc20, 0x38ce9: 0x6e20fe20, 0x38cea: 0x6e210020, 0x38ceb: 0x6e210220, - 0x38cec: 0x6e210420, 0x38ced: 0x6e210620, 0x38cee: 0x6e210820, 0x38cef: 0x6e210a20, - 0x38cf0: 0x6e210c20, 0x38cf1: 0x6e210e20, 0x38cf2: 0x6e211020, 0x38cf3: 0x6e211220, - 0x38cf4: 0x6e211420, 0x38cf5: 0x6e211620, 0x38cf6: 0x6e2b9420, 0x38cf7: 0x6e2b9620, - 0x38cf8: 0x6e2b9820, 0x38cf9: 0x6e2b9a20, 0x38cfa: 0x6e2b9c20, 0x38cfb: 0x6e2b9e20, - 0x38cfc: 0x6e2ba020, 0x38cfd: 0x6e2ba220, 0x38cfe: 0x6e2ba420, 0x38cff: 0x6e2ba620, - // Block 0xe34, offset 0x38d00 - 0x38d00: 0x6e2ba820, 0x38d01: 0x6e2baa20, 0x38d02: 0x6e2bac20, 0x38d03: 0x6e2bae20, - 0x38d04: 0x6e2bb020, 0x38d05: 0x6e2bb220, 0x38d06: 0x6e2bb420, 0x38d07: 0x6e2bb620, - 0x38d08: 0x6e2bb820, 0x38d09: 0x6e2bba20, 0x38d0a: 0x6e2bbc20, 0x38d0b: 0x6e2bbe20, - 0x38d0c: 0x6e2bc020, 0x38d0d: 0x6e2bc220, 0x38d0e: 0x6e2bc420, 0x38d0f: 0x6e2bc620, - 0x38d10: 0x6e2bc820, 0x38d11: 0x6e2bca20, 0x38d12: 0x6e2bcc20, 0x38d13: 0x6e2bce20, - 0x38d14: 0x6e2bd020, 0x38d15: 0x6e2bd220, 0x38d16: 0x6e33f020, 0x38d17: 0x6e33f220, - 0x38d18: 0x6e33f420, 0x38d19: 0x6e33f620, 0x38d1a: 0x6e33f820, 0x38d1b: 0x6e33fa20, - 0x38d1c: 0x6e33fc20, 0x38d1d: 0x6e33fe20, 0x38d1e: 0x6e340020, 0x38d1f: 0x6e340220, - 0x38d20: 0x6e340420, 0x38d21: 0x6e340620, 0x38d22: 0x6e340820, 0x38d23: 0x6e340a20, - 0x38d24: 0x6e340c20, 0x38d25: 0x6e340e20, 0x38d26: 0x6e341020, 0x38d27: 0x6e341220, - 0x38d28: 0x6e341420, 0x38d29: 0x6e341620, 0x38d2a: 0x6e341820, 0x38d2b: 0x6e341a20, - 0x38d2c: 0x6e341c20, 0x38d2d: 0x6e341e20, 0x38d2e: 0x6e39d420, 0x38d2f: 0x6e39d620, - 0x38d30: 0x6e39d820, 0x38d31: 0x6e39da20, 0x38d32: 0x6e39dc20, 0x38d33: 0x6e39de20, - 0x38d34: 0x6e39e020, 0x38d35: 0x6e42f020, 0x38d36: 0x6e39e220, 0x38d37: 0x6e39e420, - 0x38d38: 0x6e39e620, 0x38d39: 0x6e39e820, 0x38d3a: 0x6e3df620, 0x38d3b: 0x6e3df820, - 0x38d3c: 0x6e3dfa20, 0x38d3d: 0x6e3dfc20, 0x38d3e: 0x6e3dfe20, 0x38d3f: 0x6e3e0020, - // Block 0xe35, offset 0x38d40 - 0x38d40: 0x6e3e0220, 0x38d41: 0x6e3e0420, 0x38d42: 0x6e3e0620, 0x38d43: 0x6e3e0820, - 0x38d44: 0x6e3e0a20, 0x38d45: 0x6e3e0c20, 0x38d46: 0x6e394c20, 0x38d47: 0x6e40ce20, - 0x38d48: 0x6e40d020, 0x38d49: 0x6e40d220, 0x38d4a: 0x6e40d420, 0x38d4b: 0x6e40d620, - 0x38d4c: 0x6e40d820, 0x38d4d: 0x6e40da20, 0x38d4e: 0x6e40dc20, 0x38d4f: 0x6e42f220, - 0x38d50: 0x6e42f420, 0x38d51: 0x6e42f620, 0x38d52: 0x6e42f820, 0x38d53: 0x6e470220, - 0x38d54: 0x6e446820, 0x38d55: 0x6e446a20, 0x38d56: 0x6e454e20, 0x38d57: 0x6e45d020, - 0x38d58: 0x6e472e20, 0x38d59: 0x6e468c20, 0x38d5a: 0x6e455020, 0x38d5b: 0x6c401420, - 0x38d5c: 0x6c5f9820, 0x38d5d: 0x6c5f9a20, 0x38d5e: 0x6c5f9c20, 0x38d5f: 0x6c84d420, - 0x38d60: 0x6c84d620, 0x38d61: 0x6c84d820, 0x38d62: 0x6c84da20, 0x38d63: 0x6cae3220, - 0x38d64: 0x6cae3420, 0x38d65: 0x6cae3620, 0x38d66: 0x6cae3820, 0x38d67: 0x6cae3a20, - 0x38d68: 0x6cae3c20, 0x38d69: 0x6cae3e20, 0x38d6a: 0x6cae4020, 0x38d6b: 0x6cae4220, - 0x38d6c: 0x6cae4420, 0x38d6d: 0x6cae4620, 0x38d6e: 0x6cae4820, 0x38d6f: 0x6cae4a20, - 0x38d70: 0x6cae4c20, 0x38d71: 0x6cdd5020, 0x38d72: 0x6cdd5220, 0x38d73: 0x6cdd5420, - 0x38d74: 0x6cdd5620, 0x38d75: 0x6cdd5820, 0x38d76: 0x6cdd5a20, 0x38d77: 0x6cdd5c20, - 0x38d78: 0x6cdd5e20, 0x38d79: 0x6cdd6020, 0x38d7a: 0x6d0bd020, 0x38d7b: 0x6d0bd220, - 0x38d7c: 0x6d0bd420, 0x38d7d: 0x6d0bd620, 0x38d7e: 0x6d0bd820, 0x38d7f: 0x6d0bda20, - // Block 0xe36, offset 0x38d80 - 0x38d80: 0x6d0bdc20, 0x38d81: 0x6d39be20, 0x38d82: 0x6d39c020, 0x38d83: 0x6d39c220, - 0x38d84: 0x6d39c420, 0x38d85: 0x6d39c620, 0x38d86: 0x6d39c820, 0x38d87: 0x6d39ca20, - 0x38d88: 0x6d39cc20, 0x38d89: 0x6d39ce20, 0x38d8a: 0x6d39d020, 0x38d8b: 0x6d39d220, - 0x38d8c: 0x6d39d420, 0x38d8d: 0x6d39d620, 0x38d8e: 0x6d39d820, 0x38d8f: 0x6d65f820, - 0x38d90: 0x6d65fa20, 0x38d91: 0x6d65fc20, 0x38d92: 0x6d65fe20, 0x38d93: 0x6d660020, - 0x38d94: 0x6d660220, 0x38d95: 0x6d660420, 0x38d96: 0x6d660620, 0x38d97: 0x6d660820, - 0x38d98: 0x6d660a20, 0x38d99: 0x6d660c20, 0x38d9a: 0x6d660e20, 0x38d9b: 0x6d661020, - 0x38d9c: 0x6d8fd020, 0x38d9d: 0x6d8fd220, 0x38d9e: 0x6d8fd420, 0x38d9f: 0x6d8fd620, - 0x38da0: 0x6d8fd820, 0x38da1: 0x6d8fda20, 0x38da2: 0x6d8fdc20, 0x38da3: 0x6d8fde20, - 0x38da4: 0x6d8fe020, 0x38da5: 0x6d8fe220, 0x38da6: 0x6d8fe420, 0x38da7: 0x6d8fe620, - 0x38da8: 0x6d8fe820, 0x38da9: 0x6d8fea20, 0x38daa: 0x6d8fec20, 0x38dab: 0x6d8fee20, - 0x38dac: 0x6d8ff020, 0x38dad: 0x6d8ff220, 0x38dae: 0x6d8ff420, 0x38daf: 0x6d8ff620, - 0x38db0: 0x6d8ff820, 0x38db1: 0x6db39e20, 0x38db2: 0x6db3a020, 0x38db3: 0x6db3a220, - 0x38db4: 0x6db3a420, 0x38db5: 0x6db3a620, 0x38db6: 0x6db3a820, 0x38db7: 0x6db3aa20, - 0x38db8: 0x6db3ac20, 0x38db9: 0x6db3ae20, 0x38dba: 0x6db3b020, 0x38dbb: 0x6dd29c20, - 0x38dbc: 0x6dd29e20, 0x38dbd: 0x6dd2a020, 0x38dbe: 0x6dd2a220, 0x38dbf: 0x6dd2a420, - // Block 0xe37, offset 0x38dc0 - 0x38dc0: 0x6dd2a620, 0x38dc1: 0x6dd2a820, 0x38dc2: 0x6debd420, 0x38dc3: 0x6dd2aa20, - 0x38dc4: 0x6dd2ac20, 0x38dc5: 0x6debd620, 0x38dc6: 0x6debd820, 0x38dc7: 0x6debda20, - 0x38dc8: 0x6debdc20, 0x38dc9: 0x6debde20, 0x38dca: 0x6debe020, 0x38dcb: 0x6e015a20, - 0x38dcc: 0x6e015c20, 0x38dcd: 0x6e015e20, 0x38dce: 0x6e016020, 0x38dcf: 0x6e016220, - 0x38dd0: 0x6df39420, 0x38dd1: 0x6e134220, 0x38dd2: 0x6e134420, 0x38dd3: 0x6e134620, - 0x38dd4: 0x6e134820, 0x38dd5: 0x6e134a20, 0x38dd6: 0x6e134c20, 0x38dd7: 0x6e134e20, - 0x38dd8: 0x6e211e20, 0x38dd9: 0x6e212020, 0x38dda: 0x6e2bd620, 0x38ddb: 0x6e2bd820, - 0x38ddc: 0x6e3e1420, 0x38ddd: 0x6c268c20, 0x38dde: 0x6c268e20, 0x38ddf: 0x6c402220, - 0x38de0: 0x6c402420, 0x38de1: 0x6c402620, 0x38de2: 0x6c402820, 0x38de3: 0x6c402a20, - 0x38de4: 0x6c402c20, 0x38de5: 0x6c402e20, 0x38de6: 0x6c403020, 0x38de7: 0x6c403220, - 0x38de8: 0x6c5fcc20, 0x38de9: 0x6c5fce20, 0x38dea: 0x6c5fd020, 0x38deb: 0x6c5fd220, - 0x38dec: 0x6c5fd420, 0x38ded: 0x6c5fd620, 0x38dee: 0x6c5fd820, 0x38def: 0x6c5fda20, - 0x38df0: 0x6c5fdc20, 0x38df1: 0x6c5fde20, 0x38df2: 0x6c5fe020, 0x38df3: 0x6c5fe220, - 0x38df4: 0x6c5fe420, 0x38df5: 0x6c5fe620, 0x38df6: 0x6c5fe820, 0x38df7: 0x6c5fea20, - 0x38df8: 0x6c5fec20, 0x38df9: 0x6c5fee20, 0x38dfa: 0x6c5ff020, 0x38dfb: 0x6c853220, - 0x38dfc: 0x6c853420, 0x38dfd: 0x6c853620, 0x38dfe: 0x6c853820, 0x38dff: 0x6c853a20, - // Block 0xe38, offset 0x38e00 - 0x38e00: 0x6c853c20, 0x38e01: 0x6c853e20, 0x38e02: 0x6c854020, 0x38e03: 0x6c854220, - 0x38e04: 0x6c854420, 0x38e05: 0x6c854620, 0x38e06: 0x6c854820, 0x38e07: 0x6c854a20, - 0x38e08: 0x6c854c20, 0x38e09: 0x6c854e20, 0x38e0a: 0x6c855020, 0x38e0b: 0x6c855220, - 0x38e0c: 0x6c855420, 0x38e0d: 0x6c855620, 0x38e0e: 0x6c855820, 0x38e0f: 0x6c855a20, - 0x38e10: 0x6c855c20, 0x38e11: 0x6c855e20, 0x38e12: 0x6c856020, 0x38e13: 0x6c856220, - 0x38e14: 0x6c856420, 0x38e15: 0x6c856620, 0x38e16: 0x6c856820, 0x38e17: 0x6c856a20, - 0x38e18: 0x6c856c20, 0x38e19: 0x6c856e20, 0x38e1a: 0x6c857020, 0x38e1b: 0x6c857220, - 0x38e1c: 0x6c857420, 0x38e1d: 0x6c857620, 0x38e1e: 0x6caeaa20, 0x38e1f: 0x6caeac20, - 0x38e20: 0x6caeae20, 0x38e21: 0x6caeb020, 0x38e22: 0x6caeb220, 0x38e23: 0x6caeb420, - 0x38e24: 0x6caeb620, 0x38e25: 0x6caeb820, 0x38e26: 0x6caeba20, 0x38e27: 0x6caebc20, - 0x38e28: 0x6caebe20, 0x38e29: 0x6caec020, 0x38e2a: 0x6caec220, 0x38e2b: 0x6caec420, - 0x38e2c: 0x6caec620, 0x38e2d: 0x6caec820, 0x38e2e: 0x6caeca20, 0x38e2f: 0x6caecc20, - 0x38e30: 0x6caece20, 0x38e31: 0x6caed020, 0x38e32: 0x6caed220, 0x38e33: 0x6caed420, - 0x38e34: 0x6caed620, 0x38e35: 0x6caed820, 0x38e36: 0x6caeda20, 0x38e37: 0x6caedc20, - 0x38e38: 0x6caede20, 0x38e39: 0x6caee020, 0x38e3a: 0x6caee220, 0x38e3b: 0x6caee420, - 0x38e3c: 0x6caee620, 0x38e3d: 0x6caee820, 0x38e3e: 0x6caeea20, 0x38e3f: 0x6caeec20, - // Block 0xe39, offset 0x38e40 - 0x38e40: 0x6caeee20, 0x38e41: 0x6caef020, 0x38e42: 0x6caef220, 0x38e43: 0x6caef420, - 0x38e44: 0x6caef620, 0x38e45: 0x6caef820, 0x38e46: 0x6caefa20, 0x38e47: 0x6caefc20, - 0x38e48: 0x6caefe20, 0x38e49: 0x6caf0020, 0x38e4a: 0x6caf0220, 0x38e4b: 0x6caf0420, - 0x38e4c: 0x6caf0620, 0x38e4d: 0x6caf0820, 0x38e4e: 0x6caf0a20, 0x38e4f: 0x6cddc220, - 0x38e50: 0x6cddc420, 0x38e51: 0x6cddc620, 0x38e52: 0x6cddc820, 0x38e53: 0x6cddca20, - 0x38e54: 0x6cddcc20, 0x38e55: 0x6cddce20, 0x38e56: 0x6cddd020, 0x38e57: 0x6cddd220, - 0x38e58: 0x6cddd420, 0x38e59: 0x6cddd620, 0x38e5a: 0x6cddd820, 0x38e5b: 0x6cddda20, - 0x38e5c: 0x6cdddc20, 0x38e5d: 0x6cddde20, 0x38e5e: 0x6cdde020, 0x38e5f: 0x6cdde220, - 0x38e60: 0x6cdde420, 0x38e61: 0x6cdde620, 0x38e62: 0x6cdde820, 0x38e63: 0x6cddea20, - 0x38e64: 0x6cddec20, 0x38e65: 0x6cddee20, 0x38e66: 0x6cddf020, 0x38e67: 0x6cddf220, - 0x38e68: 0x6cddf420, 0x38e69: 0x6cddf620, 0x38e6a: 0x6cddf820, 0x38e6b: 0x6d0c3620, - 0x38e6c: 0x6cddfa20, 0x38e6d: 0x6cddfc20, 0x38e6e: 0x6d0c3820, 0x38e6f: 0x6cddfe20, - 0x38e70: 0x6cde0020, 0x38e71: 0x6cde0220, 0x38e72: 0x6cde0420, 0x38e73: 0x6cde0620, - 0x38e74: 0x6cde0820, 0x38e75: 0x6cde0a20, 0x38e76: 0x6cde0c20, 0x38e77: 0x6cde0e20, - 0x38e78: 0x6cde1020, 0x38e79: 0x6cde1220, 0x38e7a: 0x6cde1420, 0x38e7b: 0x6cde1620, - 0x38e7c: 0x6cde1820, 0x38e7d: 0x6cde1a20, 0x38e7e: 0x6cde1c20, 0x38e7f: 0x6cde1e20, - // Block 0xe3a, offset 0x38e80 - 0x38e80: 0x6cde2020, 0x38e81: 0x6cde2220, 0x38e82: 0x6cde2420, 0x38e83: 0x6cde2620, - 0x38e84: 0x6cde2820, 0x38e85: 0x6cde2a20, 0x38e86: 0x6cde2c20, 0x38e87: 0x6cde2e20, - 0x38e88: 0x6d0c3a20, 0x38e89: 0x6d0c3c20, 0x38e8a: 0x6d0c3e20, 0x38e8b: 0x6d0c4020, - 0x38e8c: 0x6d0c4220, 0x38e8d: 0x6d0c4420, 0x38e8e: 0x6d0c4620, 0x38e8f: 0x6d0c4820, - 0x38e90: 0x6d0c4a20, 0x38e91: 0x6d0c4c20, 0x38e92: 0x6d0c4e20, 0x38e93: 0x6d0c5020, - 0x38e94: 0x6d0c5220, 0x38e95: 0x6d0c5420, 0x38e96: 0x6d0c5620, 0x38e97: 0x6d0c5820, - 0x38e98: 0x6d0c5a20, 0x38e99: 0x6d0c5c20, 0x38e9a: 0x6d0c5e20, 0x38e9b: 0x6d0c6020, - 0x38e9c: 0x6d0c6220, 0x38e9d: 0x6d0c6420, 0x38e9e: 0x6d3a6020, 0x38e9f: 0x6d0c6620, - 0x38ea0: 0x6d0c6820, 0x38ea1: 0x6d0c6a20, 0x38ea2: 0x6d0c6c20, 0x38ea3: 0x6d0c6e20, - 0x38ea4: 0x6d0c7020, 0x38ea5: 0x6d0c7220, 0x38ea6: 0x6d0c7420, 0x38ea7: 0x6d0c7620, - 0x38ea8: 0x6d0c7820, 0x38ea9: 0x6d0c7a20, 0x38eaa: 0x6d0c7c20, 0x38eab: 0x6d0c7e20, - 0x38eac: 0x6d0c8020, 0x38ead: 0x6d0c8220, 0x38eae: 0x6d0c8420, 0x38eaf: 0x6d0c8620, - 0x38eb0: 0x6d0c8820, 0x38eb1: 0x6d0c8a20, 0x38eb2: 0x6d0c8c20, 0x38eb3: 0x6d0c8e20, - 0x38eb4: 0x6d0c9020, 0x38eb5: 0x6d0c9220, 0x38eb6: 0x6d0c9420, 0x38eb7: 0x6d0c9620, - 0x38eb8: 0x6d0c9820, 0x38eb9: 0x6d0c9a20, 0x38eba: 0x6d0c9c20, 0x38ebb: 0x6d0c9e20, - 0x38ebc: 0x6d0ca020, 0x38ebd: 0x6d0ca220, 0x38ebe: 0x6d0ca420, 0x38ebf: 0x6d0ca620, - // Block 0xe3b, offset 0x38ec0 - 0x38ec0: 0x6d0ca820, 0x38ec1: 0x6d0caa20, 0x38ec2: 0x6d0cac20, 0x38ec3: 0x6d3a6220, - 0x38ec4: 0x6d3a6420, 0x38ec5: 0x6d3a6620, 0x38ec6: 0x6d3a6820, 0x38ec7: 0x6d3a6a20, - 0x38ec8: 0x6d3a6c20, 0x38ec9: 0x6d3a6e20, 0x38eca: 0x6d3a7020, 0x38ecb: 0x6d3a7220, - 0x38ecc: 0x6d3a7420, 0x38ecd: 0x6d3a7620, 0x38ece: 0x6d3a7820, 0x38ecf: 0x6d3a7a20, - 0x38ed0: 0x6d3a7c20, 0x38ed1: 0x6d3a7e20, 0x38ed2: 0x6d3a8020, 0x38ed3: 0x6d3a8220, - 0x38ed4: 0x6d3a8420, 0x38ed5: 0x6d3a8620, 0x38ed6: 0x6d3a8820, 0x38ed7: 0x6d3a8a20, - 0x38ed8: 0x6d3a8c20, 0x38ed9: 0x6d3a8e20, 0x38eda: 0x6d3a9020, 0x38edb: 0x6d3a9220, - 0x38edc: 0x6d3a9420, 0x38edd: 0x6d3a9620, 0x38ede: 0x6d0cae20, 0x38edf: 0x6d3a9820, - 0x38ee0: 0x6d3a9a20, 0x38ee1: 0x6d3a9c20, 0x38ee2: 0x6d3a9e20, 0x38ee3: 0x6d3aa020, - 0x38ee4: 0x6d3aa220, 0x38ee5: 0x6d3aa420, 0x38ee6: 0x6d3aa620, 0x38ee7: 0x6d3aa820, - 0x38ee8: 0x6d3aaa20, 0x38ee9: 0x6d3aac20, 0x38eea: 0x6d3aae20, 0x38eeb: 0x6d3ab020, - 0x38eec: 0x6d3ab220, 0x38eed: 0x6d3ab420, 0x38eee: 0x6d3ab620, 0x38eef: 0x6d3ab820, - 0x38ef0: 0x6d668c20, 0x38ef1: 0x6d3aba20, 0x38ef2: 0x6d3abc20, 0x38ef3: 0x6d3abe20, - 0x38ef4: 0x6d3ac020, 0x38ef5: 0x6d3ac220, 0x38ef6: 0x6d3ac420, 0x38ef7: 0x6d3ac620, - 0x38ef8: 0x6d3ac820, 0x38ef9: 0x6d3aca20, 0x38efa: 0x6d3acc20, 0x38efb: 0x6d3ace20, - 0x38efc: 0x6d3ad020, 0x38efd: 0x6d3ad220, 0x38efe: 0x6d3ad420, 0x38eff: 0x6d3ad620, - // Block 0xe3c, offset 0x38f00 - 0x38f00: 0x6d3ad820, 0x38f01: 0x6d3ada20, 0x38f02: 0x6d3adc20, 0x38f03: 0x6d3ade20, - 0x38f04: 0x6d3ae020, 0x38f05: 0x6d3ae220, 0x38f06: 0x6d3ae420, 0x38f07: 0x6d3ae620, - 0x38f08: 0x6d3ae820, 0x38f09: 0x6d3aea20, 0x38f0a: 0x6d3aec20, 0x38f0b: 0x6d3aee20, - 0x38f0c: 0x6d3af020, 0x38f0d: 0x6d3af220, 0x38f0e: 0x6d3af420, 0x38f0f: 0x6d3af620, - 0x38f10: 0x6d3af820, 0x38f11: 0x6d3afa20, 0x38f12: 0x6d668e20, 0x38f13: 0x6d669020, - 0x38f14: 0x6d669220, 0x38f15: 0x6d669420, 0x38f16: 0x6d669620, 0x38f17: 0x6d669820, - 0x38f18: 0x6d669a20, 0x38f19: 0x6d669c20, 0x38f1a: 0x6d669e20, 0x38f1b: 0x6d66a020, - 0x38f1c: 0x6d66a220, 0x38f1d: 0x6d66a420, 0x38f1e: 0x6d66a620, 0x38f1f: 0x6d66a820, - 0x38f20: 0x6d66aa20, 0x38f21: 0x6d66ac20, 0x38f22: 0x6d66ae20, 0x38f23: 0x6d66b020, - 0x38f24: 0x6d66b220, 0x38f25: 0x6d66b420, 0x38f26: 0x6d66b620, 0x38f27: 0x6d66b820, - 0x38f28: 0x6d66ba20, 0x38f29: 0x6d66bc20, 0x38f2a: 0x6d66be20, 0x38f2b: 0x6d66c020, - 0x38f2c: 0x6d66c220, 0x38f2d: 0x6d66c420, 0x38f2e: 0x6d66c620, 0x38f2f: 0x6d66c820, - 0x38f30: 0x6d66ca20, 0x38f31: 0x6d66cc20, 0x38f32: 0x6d66ce20, 0x38f33: 0x6d66d020, - 0x38f34: 0x6d66d220, 0x38f35: 0x6d66d420, 0x38f36: 0x6d66d620, 0x38f37: 0x6d66d820, - 0x38f38: 0x6d66da20, 0x38f39: 0x6d66dc20, 0x38f3a: 0x6d66de20, 0x38f3b: 0x6d66e020, - 0x38f3c: 0x6d66e220, 0x38f3d: 0x6d66e420, 0x38f3e: 0x6d66e620, 0x38f3f: 0x6d66e820, - // Block 0xe3d, offset 0x38f40 - 0x38f40: 0x6d66ea20, 0x38f41: 0x6d66ec20, 0x38f42: 0x6d66ee20, 0x38f43: 0x6d66f020, - 0x38f44: 0x6d66f220, 0x38f45: 0x6d66f420, 0x38f46: 0x6d66f620, 0x38f47: 0x6d66f820, - 0x38f48: 0x6d66fa20, 0x38f49: 0x6d66fc20, 0x38f4a: 0x6d66fe20, 0x38f4b: 0x6d670020, - 0x38f4c: 0x6d670220, 0x38f4d: 0x6d670420, 0x38f4e: 0x6d670620, 0x38f4f: 0x6d670820, - 0x38f50: 0x6d670a20, 0x38f51: 0x6d670c20, 0x38f52: 0x6d670e20, 0x38f53: 0x6d671020, - 0x38f54: 0x6d671220, 0x38f55: 0x6d671420, 0x38f56: 0x6d671620, 0x38f57: 0x6d671820, - 0x38f58: 0x6d671a20, 0x38f59: 0x6d671c20, 0x38f5a: 0x6d671e20, 0x38f5b: 0x6d672020, - 0x38f5c: 0x6d672220, 0x38f5d: 0x6d672420, 0x38f5e: 0x6d672620, 0x38f5f: 0x6d672820, - 0x38f60: 0x6d672a20, 0x38f61: 0x6d905c20, 0x38f62: 0x6d905e20, 0x38f63: 0x6d906020, - 0x38f64: 0x6d906220, 0x38f65: 0x6d906420, 0x38f66: 0x6d906620, 0x38f67: 0x6d906820, - 0x38f68: 0x6d906a20, 0x38f69: 0x6d906c20, 0x38f6a: 0x6d906e20, 0x38f6b: 0x6d907020, - 0x38f6c: 0x6d907220, 0x38f6d: 0x6d907420, 0x38f6e: 0x6d907620, 0x38f6f: 0x6d907820, - 0x38f70: 0x6d907a20, 0x38f71: 0x6d907c20, 0x38f72: 0x6d907e20, 0x38f73: 0x6d908020, - 0x38f74: 0x6d908220, 0x38f75: 0x6d908420, 0x38f76: 0x6d908620, 0x38f77: 0x6d908820, - 0x38f78: 0x6d908a20, 0x38f79: 0x6d908c20, 0x38f7a: 0x6d908e20, 0x38f7b: 0x6d909020, - 0x38f7c: 0x6d909220, 0x38f7d: 0x6d909420, 0x38f7e: 0x6d909620, 0x38f7f: 0x6d909820, - // Block 0xe3e, offset 0x38f80 - 0x38f80: 0x6d909a20, 0x38f81: 0x6d909c20, 0x38f82: 0x6d909e20, 0x38f83: 0x6d90a020, - 0x38f84: 0x6d90a220, 0x38f85: 0x6d90a420, 0x38f86: 0x6d90a620, 0x38f87: 0x6d672c20, - 0x38f88: 0x6d90a820, 0x38f89: 0x6d90aa20, 0x38f8a: 0x6d90ac20, 0x38f8b: 0x6d90ae20, - 0x38f8c: 0x6d90b020, 0x38f8d: 0x6d90b220, 0x38f8e: 0x6d90b420, 0x38f8f: 0x6d90b620, - 0x38f90: 0x6d90b820, 0x38f91: 0x6d90ba20, 0x38f92: 0x6d90bc20, 0x38f93: 0x6d90be20, - 0x38f94: 0x6d90c020, 0x38f95: 0x6d90c220, 0x38f96: 0x6d90c420, 0x38f97: 0x6d90c620, - 0x38f98: 0x6d90c820, 0x38f99: 0x6d90ca20, 0x38f9a: 0x6d90cc20, 0x38f9b: 0x6d90ce20, - 0x38f9c: 0x6d90d020, 0x38f9d: 0x6d90d220, 0x38f9e: 0x6d90d420, 0x38f9f: 0x6d90d620, - 0x38fa0: 0x6d90d820, 0x38fa1: 0x6d90da20, 0x38fa2: 0x6d90dc20, 0x38fa3: 0x6d90de20, - 0x38fa4: 0x6d90e020, 0x38fa5: 0x6d90e220, 0x38fa6: 0x6d90e420, 0x38fa7: 0x6d90e620, - 0x38fa8: 0x6d90e820, 0x38fa9: 0x6d90ea20, 0x38faa: 0x6d90ec20, 0x38fab: 0x6d90ee20, - 0x38fac: 0x6d90f020, 0x38fad: 0x6d90f220, 0x38fae: 0x6d90f420, 0x38faf: 0x6d90f620, - 0x38fb0: 0x6d90f820, 0x38fb1: 0x6d90fa20, 0x38fb2: 0x6d90fc20, 0x38fb3: 0x6d90fe20, - 0x38fb4: 0x6d910020, 0x38fb5: 0x6d910220, 0x38fb6: 0x6d910420, 0x38fb7: 0x6d910620, - 0x38fb8: 0x6db42820, 0x38fb9: 0x6db42a20, 0x38fba: 0x6db42c20, 0x38fbb: 0x6db42e20, - 0x38fbc: 0x6db43020, 0x38fbd: 0x6db43220, 0x38fbe: 0x6db43420, 0x38fbf: 0x6db43620, - // Block 0xe3f, offset 0x38fc0 - 0x38fc0: 0x6db43820, 0x38fc1: 0x6db43a20, 0x38fc2: 0x6db43c20, 0x38fc3: 0x6db43e20, - 0x38fc4: 0x6db44020, 0x38fc5: 0x6db44220, 0x38fc6: 0x6db44420, 0x38fc7: 0x6db44620, - 0x38fc8: 0x6db44820, 0x38fc9: 0x6db44a20, 0x38fca: 0x6db44c20, 0x38fcb: 0x6db44e20, - 0x38fcc: 0x6db45020, 0x38fcd: 0x6db45220, 0x38fce: 0x6db45420, 0x38fcf: 0x6db45620, - 0x38fd0: 0x6db45820, 0x38fd1: 0x6db45a20, 0x38fd2: 0x6db45c20, 0x38fd3: 0x6db45e20, - 0x38fd4: 0x6db46020, 0x38fd5: 0x6db46220, 0x38fd6: 0x6db46420, 0x38fd7: 0x6db46620, - 0x38fd8: 0x6db46820, 0x38fd9: 0x6db46a20, 0x38fda: 0x6db46c20, 0x38fdb: 0x6db46e20, - 0x38fdc: 0x6db47020, 0x38fdd: 0x6db47220, 0x38fde: 0x6db47420, 0x38fdf: 0x6db47620, - 0x38fe0: 0x6db47820, 0x38fe1: 0x6db47a20, 0x38fe2: 0x6db47c20, 0x38fe3: 0x6db47e20, - 0x38fe4: 0x6db48020, 0x38fe5: 0x6db48220, 0x38fe6: 0x6db48420, 0x38fe7: 0x6db48620, - 0x38fe8: 0x6db48820, 0x38fe9: 0x6db48a20, 0x38fea: 0x6db48c20, 0x38feb: 0x6db48e20, - 0x38fec: 0x6db49020, 0x38fed: 0x6db49220, 0x38fee: 0x6db49420, 0x38fef: 0x6db49620, - 0x38ff0: 0x6dcfa420, 0x38ff1: 0x6db49820, 0x38ff2: 0x6db49a20, 0x38ff3: 0x6db49c20, - 0x38ff4: 0x6db49e20, 0x38ff5: 0x6db4a020, 0x38ff6: 0x6db4a220, 0x38ff7: 0x6db4a420, - 0x38ff8: 0x6db4a620, 0x38ff9: 0x6db4a820, 0x38ffa: 0x6db4aa20, 0x38ffb: 0x6db4ac20, - 0x38ffc: 0x6db4ae20, 0x38ffd: 0x6db4b020, 0x38ffe: 0x6db4b220, 0x38fff: 0x6db4b420, - // Block 0xe40, offset 0x39000 - 0x39000: 0x6db4b620, 0x39001: 0x6db4b820, 0x39002: 0x6db4ba20, 0x39003: 0x6db4bc20, - 0x39004: 0x6dd2fa20, 0x39005: 0x6dd2fc20, 0x39006: 0x6dd2fe20, 0x39007: 0x6dd30020, - 0x39008: 0x6dd30220, 0x39009: 0x6dd30420, 0x3900a: 0x6dd30620, 0x3900b: 0x6dd30820, - 0x3900c: 0x6dd30a20, 0x3900d: 0x6dd30c20, 0x3900e: 0x6dd30e20, 0x3900f: 0x6dd31020, - 0x39010: 0x6dd31220, 0x39011: 0x6dd31420, 0x39012: 0x6dd31620, 0x39013: 0x6dd31820, - 0x39014: 0x6dd31a20, 0x39015: 0x6dd31c20, 0x39016: 0x6dd31e20, 0x39017: 0x6dd32020, - 0x39018: 0x6dd32220, 0x39019: 0x6dd32420, 0x3901a: 0x6dd32620, 0x3901b: 0x6dd32820, - 0x3901c: 0x6dd32a20, 0x3901d: 0x6dd32c20, 0x3901e: 0x6dd32e20, 0x3901f: 0x6dd33020, - 0x39020: 0x6dd33220, 0x39021: 0x6dd33420, 0x39022: 0x6dd33620, 0x39023: 0x6dd33820, - 0x39024: 0x6dd33a20, 0x39025: 0x6dd33c20, 0x39026: 0x6dd33e20, 0x39027: 0x6dd34020, - 0x39028: 0x6dd34220, 0x39029: 0x6dd34420, 0x3902a: 0x6dd34620, 0x3902b: 0x6dd34820, - 0x3902c: 0x6dd34a20, 0x3902d: 0x6dd34c20, 0x3902e: 0x6dd34e20, 0x3902f: 0x6dd35020, - 0x39030: 0x6dd35220, 0x39031: 0x6dd35420, 0x39032: 0x6dd35620, 0x39033: 0x6dd35820, - 0x39034: 0x6dd35a20, 0x39035: 0x6dd35c20, 0x39036: 0x6dd35e20, 0x39037: 0x6dd36020, - 0x39038: 0x6dd36220, 0x39039: 0x6dd36420, 0x3903a: 0x6dd36620, 0x3903b: 0x6dd36820, - 0x3903c: 0x6dd36a20, 0x3903d: 0x6dd36c20, 0x3903e: 0x6dd36e20, 0x3903f: 0x6dd37020, - // Block 0xe41, offset 0x39040 - 0x39040: 0x6dd37220, 0x39041: 0x6dd37420, 0x39042: 0x6dd37620, 0x39043: 0x6dd37820, - 0x39044: 0x6dd37a20, 0x39045: 0x6dd37c20, 0x39046: 0x6dd37e20, 0x39047: 0x6dd38020, - 0x39048: 0x6dd38220, 0x39049: 0x6dd38420, 0x3904a: 0x6dd38620, 0x3904b: 0x6dd38820, - 0x3904c: 0x6dd38a20, 0x3904d: 0x6dd38c20, 0x3904e: 0x6dec2620, 0x3904f: 0x6dec2820, - 0x39050: 0x6dec2a20, 0x39051: 0x6dec2c20, 0x39052: 0x6dec2e20, 0x39053: 0x6dec3020, - 0x39054: 0x6dec3220, 0x39055: 0x6dec3420, 0x39056: 0x6dec3620, 0x39057: 0x6dec3820, - 0x39058: 0x6dec3a20, 0x39059: 0x6dec3c20, 0x3905a: 0x6dec3e20, 0x3905b: 0x6dec4020, - 0x3905c: 0x6dec4220, 0x3905d: 0x6dec4420, 0x3905e: 0x6dec4620, 0x3905f: 0x6dec4820, - 0x39060: 0x6dec4a20, 0x39061: 0x6dec4c20, 0x39062: 0x6dec4e20, 0x39063: 0x6dec5020, - 0x39064: 0x6dec5220, 0x39065: 0x6dec5420, 0x39066: 0x6dec5620, 0x39067: 0x6dec5820, - 0x39068: 0x6dec5a20, 0x39069: 0x6dec5c20, 0x3906a: 0x6dec5e20, 0x3906b: 0x6dec6020, - 0x3906c: 0x6dec6220, 0x3906d: 0x6dec6420, 0x3906e: 0x6dec6620, 0x3906f: 0x6dec6820, - 0x39070: 0x6dec6a20, 0x39071: 0x6dec6c20, 0x39072: 0x6dec6e20, 0x39073: 0x6dec7020, - 0x39074: 0x6dec7220, 0x39075: 0x6dec7420, 0x39076: 0x6dec7620, 0x39077: 0x6dec7820, - 0x39078: 0x6dec7a20, 0x39079: 0x6dec7c20, 0x3907a: 0x6dec7e20, 0x3907b: 0x6dec8020, - 0x3907c: 0x6dec8220, 0x3907d: 0x6dec8420, 0x3907e: 0x6dec8620, 0x3907f: 0x6dec8820, - // Block 0xe42, offset 0x39080 - 0x39080: 0x6dec8a20, 0x39081: 0x6dec8c20, 0x39082: 0x6dec8e20, 0x39083: 0x6dec9020, - 0x39084: 0x6dec9220, 0x39085: 0x6dec9420, 0x39086: 0x6dec9620, 0x39087: 0x6dec9820, - 0x39088: 0x6dec9a20, 0x39089: 0x6e018420, 0x3908a: 0x6e018620, 0x3908b: 0x6e018820, - 0x3908c: 0x6e018a20, 0x3908d: 0x6e018c20, 0x3908e: 0x6e018e20, 0x3908f: 0x6e019020, - 0x39090: 0x6e019220, 0x39091: 0x6e019420, 0x39092: 0x6e019620, 0x39093: 0x6e019820, - 0x39094: 0x6e019a20, 0x39095: 0x6e019c20, 0x39096: 0x6e019e20, 0x39097: 0x6e01a020, - 0x39098: 0x6e01a220, 0x39099: 0x6e01a420, 0x3909a: 0x6e01a620, 0x3909b: 0x6e01a820, - 0x3909c: 0x6e01aa20, 0x3909d: 0x6e01ac20, 0x3909e: 0x6e01ae20, 0x3909f: 0x6e01b020, - 0x390a0: 0x6e01b220, 0x390a1: 0x6e01b420, 0x390a2: 0x6e01b620, 0x390a3: 0x6e01b820, - 0x390a4: 0x6e01ba20, 0x390a5: 0x6e01bc20, 0x390a6: 0x6e01be20, 0x390a7: 0x6e01c020, - 0x390a8: 0x6e01c220, 0x390a9: 0x6e01c420, 0x390aa: 0x6e01c620, 0x390ab: 0x6e01c820, - 0x390ac: 0x6e01ca20, 0x390ad: 0x6e01cc20, 0x390ae: 0x6e01ce20, 0x390af: 0x6e01d020, - 0x390b0: 0x6e01d220, 0x390b1: 0x6e136a20, 0x390b2: 0x6e136c20, 0x390b3: 0x6e136e20, - 0x390b4: 0x6e137020, 0x390b5: 0x6e137220, 0x390b6: 0x6e137420, 0x390b7: 0x6e137620, - 0x390b8: 0x6e137820, 0x390b9: 0x6e137a20, 0x390ba: 0x6e137c20, 0x390bb: 0x6e137e20, - 0x390bc: 0x6e138020, 0x390bd: 0x6e138220, 0x390be: 0x6e138420, 0x390bf: 0x6e138620, - // Block 0xe43, offset 0x390c0 - 0x390c0: 0x6e138820, 0x390c1: 0x6e138a20, 0x390c2: 0x6e138c20, 0x390c3: 0x6e138e20, - 0x390c4: 0x6e139020, 0x390c5: 0x6e139220, 0x390c6: 0x6e139420, 0x390c7: 0x6e139620, - 0x390c8: 0x6e139820, 0x390c9: 0x6e139a20, 0x390ca: 0x6e139c20, 0x390cb: 0x6e139e20, - 0x390cc: 0x6e13a020, 0x390cd: 0x6e13a220, 0x390ce: 0x6e13a420, 0x390cf: 0x6e13a620, - 0x390d0: 0x6e13a820, 0x390d1: 0x6e13aa20, 0x390d2: 0x6e13ac20, 0x390d3: 0x6e13ae20, - 0x390d4: 0x6e13b020, 0x390d5: 0x6e13b220, 0x390d6: 0x6e13b420, 0x390d7: 0x6e13b620, - 0x390d8: 0x6e13b820, 0x390d9: 0x6e13ba20, 0x390da: 0x6e13bc20, 0x390db: 0x6e13be20, - 0x390dc: 0x6e13c020, 0x390dd: 0x6e213820, 0x390de: 0x6e213a20, 0x390df: 0x6e213c20, - 0x390e0: 0x6e213e20, 0x390e1: 0x6e214020, 0x390e2: 0x6e214220, 0x390e3: 0x6e214420, - 0x390e4: 0x6e214620, 0x390e5: 0x6e214820, 0x390e6: 0x6e214a20, 0x390e7: 0x6e214c20, - 0x390e8: 0x6e214e20, 0x390e9: 0x6e215020, 0x390ea: 0x6e215220, 0x390eb: 0x6e215420, - 0x390ec: 0x6e215620, 0x390ed: 0x6e215820, 0x390ee: 0x6e215a20, 0x390ef: 0x6e215c20, - 0x390f0: 0x6e215e20, 0x390f1: 0x6e216020, 0x390f2: 0x6e216220, 0x390f3: 0x6e216420, - 0x390f4: 0x6e216620, 0x390f5: 0x6e216820, 0x390f6: 0x6e216a20, 0x390f7: 0x6e216c20, - 0x390f8: 0x6e216e20, 0x390f9: 0x6e217020, 0x390fa: 0x6e217220, 0x390fb: 0x6e217420, - 0x390fc: 0x6e217620, 0x390fd: 0x6e217820, 0x390fe: 0x6e217a20, 0x390ff: 0x6e217c20, - // Block 0xe44, offset 0x39100 - 0x39100: 0x6e217e20, 0x39101: 0x6e218020, 0x39102: 0x6e218220, 0x39103: 0x6e2bf020, - 0x39104: 0x6e2bf220, 0x39105: 0x6e2bf420, 0x39106: 0x6e2bf620, 0x39107: 0x6e2bf820, - 0x39108: 0x6e2bfa20, 0x39109: 0x6e2bfc20, 0x3910a: 0x6e2bfe20, 0x3910b: 0x6e2c0020, - 0x3910c: 0x6e2c0220, 0x3910d: 0x6e2c0420, 0x3910e: 0x6e2c0620, 0x3910f: 0x6e2c0820, - 0x39110: 0x6e2c0a20, 0x39111: 0x6e2c0c20, 0x39112: 0x6e2c0e20, 0x39113: 0x6e343220, - 0x39114: 0x6e2c1020, 0x39115: 0x6e2c1220, 0x39116: 0x6e2c1420, 0x39117: 0x6e2c1620, - 0x39118: 0x6e2c1820, 0x39119: 0x6e2c1a20, 0x3911a: 0x6e2c1c20, 0x3911b: 0x6e343420, - 0x3911c: 0x6e343620, 0x3911d: 0x6e343820, 0x3911e: 0x6e343a20, 0x3911f: 0x6e343c20, - 0x39120: 0x6e343e20, 0x39121: 0x6e344020, 0x39122: 0x6e344220, 0x39123: 0x6e344420, - 0x39124: 0x6e344620, 0x39125: 0x6e344820, 0x39126: 0x6e344a20, 0x39127: 0x6e344c20, - 0x39128: 0x6e344e20, 0x39129: 0x6e345020, 0x3912a: 0x6e345220, 0x3912b: 0x6e345420, - 0x3912c: 0x6e345620, 0x3912d: 0x6e345820, 0x3912e: 0x6e345a20, 0x3912f: 0x6e39ee20, - 0x39130: 0x6e39f020, 0x39131: 0x6e39f220, 0x39132: 0x6e39f420, 0x39133: 0x6e39f620, - 0x39134: 0x6e39f820, 0x39135: 0x6e39fa20, 0x39136: 0x6e39fc20, 0x39137: 0x6e39fe20, - 0x39138: 0x6e3a0020, 0x39139: 0x6e3a0220, 0x3913a: 0x6e3a0420, 0x3913b: 0x6e3a0620, - 0x3913c: 0x6e3a0820, 0x3913d: 0x6e3e1820, 0x3913e: 0x6e3e1a20, 0x3913f: 0x6e3e1c20, - // Block 0xe45, offset 0x39140 - 0x39140: 0x6e3e1e20, 0x39141: 0x6e3e2020, 0x39142: 0x6e3e2220, 0x39143: 0x6e3e2420, - 0x39144: 0x6e40e220, 0x39145: 0x6e40e420, 0x39146: 0x6e40e620, 0x39147: 0x6e40e820, - 0x39148: 0x6e40ea20, 0x39149: 0x6e40ec20, 0x3914a: 0x6e3e2620, 0x3914b: 0x6e40ee20, - 0x3914c: 0x6e40f020, 0x3914d: 0x6e40f220, 0x3914e: 0x6e40f420, 0x3914f: 0x6e40f620, - 0x39150: 0x6e40f820, 0x39151: 0x6e42fe20, 0x39152: 0x6e430020, 0x39153: 0x6e430220, - 0x39154: 0x6e430420, 0x39155: 0x6e430620, 0x39156: 0x6e430820, 0x39157: 0x6e430a20, - 0x39158: 0x6e446e20, 0x39159: 0x6e447020, 0x3915a: 0x6e447220, 0x3915b: 0x6e447420, - 0x3915c: 0x6e455220, 0x3915d: 0x6e455420, 0x3915e: 0x6e455620, 0x3915f: 0x6e455820, - 0x39160: 0x6e459020, 0x39161: 0x6e455a20, 0x39162: 0x6e45d220, 0x39163: 0x6e45d420, - 0x39164: 0x6e463a20, 0x39165: 0x6e463c20, 0x39166: 0x6e463e20, 0x39167: 0x6c403620, - 0x39168: 0x6c403820, 0x39169: 0x6c403a20, 0x3916a: 0x6c5ffc20, 0x3916b: 0x6c858820, - 0x3916c: 0x6c858a20, 0x3916d: 0x6c858c20, 0x3916e: 0x6c858e20, 0x3916f: 0x6c859020, - 0x39170: 0x6caf1e20, 0x39171: 0x6caf2020, 0x39172: 0x6caf2220, 0x39173: 0x6cde4c20, - 0x39174: 0x6cde4e20, 0x39175: 0x6d0cbe20, 0x39176: 0x6d0cc020, 0x39177: 0x6d0cc220, - 0x39178: 0x6d0cc420, 0x39179: 0x6d0cc620, 0x3917a: 0x6d3b1220, 0x3917b: 0x6d3b1420, - 0x3917c: 0x6d3b1620, 0x3917d: 0x6d3b1820, 0x3917e: 0x6d3b1a20, 0x3917f: 0x6d3b1c20, - // Block 0xe46, offset 0x39180 - 0x39180: 0x6d673c20, 0x39181: 0x6d673e20, 0x39182: 0x6d674020, 0x39183: 0x6d674220, - 0x39184: 0x6d3b1e20, 0x39185: 0x6d674420, 0x39186: 0x6d911620, 0x39187: 0x6d911820, - 0x39188: 0x6d911a20, 0x39189: 0x6d911c20, 0x3918a: 0x6d911e20, 0x3918b: 0x6db4c820, - 0x3918c: 0x6db4ca20, 0x3918d: 0x6db4cc20, 0x3918e: 0x6dd39820, 0x3918f: 0x6dd39a20, - 0x39190: 0x6dd39c20, 0x39191: 0x6dd39e20, 0x39192: 0x6dd3a020, 0x39193: 0x6dd3a220, - 0x39194: 0x6deca620, 0x39195: 0x6deca820, 0x39196: 0x6e01dc20, 0x39197: 0x6e01de20, - 0x39198: 0x6e13cc20, 0x39199: 0x6e218620, 0x3919a: 0x6e218820, 0x3919b: 0x6e2c1e20, - 0x3919c: 0x6e455c20, 0x3919d: 0x6c403c20, 0x3919e: 0x6c403e20, 0x3919f: 0x6c404020, - 0x391a0: 0x6c404220, 0x391a1: 0x6c600220, 0x391a2: 0x6c600420, 0x391a3: 0x6c600620, - 0x391a4: 0x6c600820, 0x391a5: 0x6c600a20, 0x391a6: 0x6c859820, 0x391a7: 0x6c859a20, - 0x391a8: 0x6c859c20, 0x391a9: 0x6c859e20, 0x391aa: 0x6caf3020, 0x391ab: 0x6cde5a20, - 0x391ac: 0x6cde5c20, 0x391ad: 0x6cde5e20, 0x391ae: 0x6cde6020, 0x391af: 0x6cde6220, - 0x391b0: 0x6cde6420, 0x391b1: 0x6cde6620, 0x391b2: 0x6d0ccc20, 0x391b3: 0x6d0cce20, - 0x391b4: 0x6d0cd020, 0x391b5: 0x6d0cd220, 0x391b6: 0x6d0cd420, 0x391b7: 0x6d0cd620, - 0x391b8: 0x6d3b2020, 0x391b9: 0x6d674e20, 0x391ba: 0x6d3b2220, 0x391bb: 0x6d3b2420, - 0x391bc: 0x6d675020, 0x391bd: 0x6d675220, 0x391be: 0x6d912e20, 0x391bf: 0x6db4d220, - // Block 0xe47, offset 0x391c0 - 0x391c0: 0x6db4d420, 0x391c1: 0x6db4d620, 0x391c2: 0x6dd3a420, 0x391c3: 0x6dd3a620, - 0x391c4: 0x6decaa20, 0x391c5: 0x6e13ce20, 0x391c6: 0x6e218a20, 0x391c7: 0x6c0a6220, - 0x391c8: 0x6c269020, 0x391c9: 0x6c269220, 0x391ca: 0x6c269420, 0x391cb: 0x6c269620, - 0x391cc: 0x6c269820, 0x391cd: 0x6c404c20, 0x391ce: 0x6c404e20, 0x391cf: 0x6c405020, - 0x391d0: 0x6c405220, 0x391d1: 0x6c405420, 0x391d2: 0x6c405620, 0x391d3: 0x6c405820, - 0x391d4: 0x6c405a20, 0x391d5: 0x6c405c20, 0x391d6: 0x6c405e20, 0x391d7: 0x6c406020, - 0x391d8: 0x6c406220, 0x391d9: 0x6c406420, 0x391da: 0x6c406620, 0x391db: 0x6c406820, - 0x391dc: 0x6c406a20, 0x391dd: 0x6c601e20, 0x391de: 0x6c602020, 0x391df: 0x6c602220, - 0x391e0: 0x6c602420, 0x391e1: 0x6c602620, 0x391e2: 0x6c602820, 0x391e3: 0x6c602a20, - 0x391e4: 0x6c602c20, 0x391e5: 0x6c602e20, 0x391e6: 0x6c603020, 0x391e7: 0x6c603220, - 0x391e8: 0x6c603420, 0x391e9: 0x6c603620, 0x391ea: 0x6c603820, 0x391eb: 0x6c603a20, - 0x391ec: 0x6c603c20, 0x391ed: 0x6c603e20, 0x391ee: 0x6c604020, 0x391ef: 0x6c604220, - 0x391f0: 0x6c604420, 0x391f1: 0x6c604620, 0x391f2: 0x6c604820, 0x391f3: 0x6c604a20, - 0x391f4: 0x6c604c20, 0x391f5: 0x6c604e20, 0x391f6: 0x6c605020, 0x391f7: 0x6c605220, - 0x391f8: 0x6c605420, 0x391f9: 0x6c605620, 0x391fa: 0x6c605820, 0x391fb: 0x6c605a20, - 0x391fc: 0x6c605c20, 0x391fd: 0x6c85dc20, 0x391fe: 0x6caf9220, 0x391ff: 0x6c85de20, - // Block 0xe48, offset 0x39200 - 0x39200: 0x6c85e020, 0x39201: 0x6c85e220, 0x39202: 0x6c85e420, 0x39203: 0x6c85e620, - 0x39204: 0x6c85e820, 0x39205: 0x6c85ea20, 0x39206: 0x6c85ec20, 0x39207: 0x6c85ee20, - 0x39208: 0x6c85f020, 0x39209: 0x6c85f220, 0x3920a: 0x6c85f420, 0x3920b: 0x6c85f620, - 0x3920c: 0x6c85f820, 0x3920d: 0x6c85fa20, 0x3920e: 0x6c85fc20, 0x3920f: 0x6c85fe20, - 0x39210: 0x6c860020, 0x39211: 0x6c860220, 0x39212: 0x6c860420, 0x39213: 0x6c860620, - 0x39214: 0x6c860820, 0x39215: 0x6c860a20, 0x39216: 0x6c860c20, 0x39217: 0x6c860e20, - 0x39218: 0x6c861020, 0x39219: 0x6c861220, 0x3921a: 0x6c861420, 0x3921b: 0x6c861620, - 0x3921c: 0x6c861820, 0x3921d: 0x6c861a20, 0x3921e: 0x6caf9420, 0x3921f: 0x6caf9620, - 0x39220: 0x6caf9820, 0x39221: 0x6caf9a20, 0x39222: 0x6caf9c20, 0x39223: 0x6caf9e20, - 0x39224: 0x6cafa020, 0x39225: 0x6cafa220, 0x39226: 0x6cafa420, 0x39227: 0x6cafa620, - 0x39228: 0x6cafa820, 0x39229: 0x6cafaa20, 0x3922a: 0x6cafac20, 0x3922b: 0x6cafae20, - 0x3922c: 0x6cafb020, 0x3922d: 0x6cafb220, 0x3922e: 0x6cafb420, 0x3922f: 0x6cafb620, - 0x39230: 0x6cafb820, 0x39231: 0x6cafba20, 0x39232: 0x6cafbc20, 0x39233: 0x6cafbe20, - 0x39234: 0x6cafc020, 0x39235: 0x6cafc220, 0x39236: 0x6cafc420, 0x39237: 0x6cafc620, - 0x39238: 0x6cafc820, 0x39239: 0x6cafca20, 0x3923a: 0x6cafcc20, 0x3923b: 0x6cafce20, - 0x3923c: 0x6cafd020, 0x3923d: 0x6cafd220, 0x3923e: 0x6cafd420, 0x3923f: 0x6cafd620, - // Block 0xe49, offset 0x39240 - 0x39240: 0x6cdeac20, 0x39241: 0x6cdeae20, 0x39242: 0x6cdeb020, 0x39243: 0x6cdeb220, - 0x39244: 0x6cdeb420, 0x39245: 0x6cdeb620, 0x39246: 0x6cdeb820, 0x39247: 0x6cdeba20, - 0x39248: 0x6cdebc20, 0x39249: 0x6cdebe20, 0x3924a: 0x6cdec020, 0x3924b: 0x6cdec220, - 0x3924c: 0x6cdec420, 0x3924d: 0x6cdec620, 0x3924e: 0x6cdec820, 0x3924f: 0x6cdeca20, - 0x39250: 0x6cdecc20, 0x39251: 0x6cdece20, 0x39252: 0x6cded020, 0x39253: 0x6cded220, - 0x39254: 0x6cded420, 0x39255: 0x6cded620, 0x39256: 0x6cded820, 0x39257: 0x6cdeda20, - 0x39258: 0x6cdedc20, 0x39259: 0x6cdede20, 0x3925a: 0x6cdee020, 0x3925b: 0x6cdee220, - 0x3925c: 0x6cdee420, 0x3925d: 0x6cdee620, 0x3925e: 0x6cdee820, 0x3925f: 0x6cdeea20, - 0x39260: 0x6cdeec20, 0x39261: 0x6cdeee20, 0x39262: 0x6cdef020, 0x39263: 0x6cdef220, - 0x39264: 0x6d0d1420, 0x39265: 0x6d0d1620, 0x39266: 0x6d0d1820, 0x39267: 0x6d0d1a20, - 0x39268: 0x6d0d1c20, 0x39269: 0x6d0d1e20, 0x3926a: 0x6d0d2020, 0x3926b: 0x6d0d2220, - 0x3926c: 0x6d0d2420, 0x3926d: 0x6d0d2620, 0x3926e: 0x6d0d2820, 0x3926f: 0x6d0d2a20, - 0x39270: 0x6d0d2c20, 0x39271: 0x6d0d2e20, 0x39272: 0x6d0d3020, 0x39273: 0x6d0d3220, - 0x39274: 0x6d0d3420, 0x39275: 0x6d0d3620, 0x39276: 0x6d0d3820, 0x39277: 0x6d0d3a20, - 0x39278: 0x6d0d3c20, 0x39279: 0x6d0d3e20, 0x3927a: 0x6d0d4020, 0x3927b: 0x6d3b8420, - 0x3927c: 0x6d0d4220, 0x3927d: 0x6d0d4420, 0x3927e: 0x6d0d4620, 0x3927f: 0x6d0d4820, - // Block 0xe4a, offset 0x39280 - 0x39280: 0x6d0d4a20, 0x39281: 0x6d0d4c20, 0x39282: 0x6d0d4e20, 0x39283: 0x6d0d5020, - 0x39284: 0x6d0d5220, 0x39285: 0x6d0d5420, 0x39286: 0x6d0d5620, 0x39287: 0x6d0d5820, - 0x39288: 0x6d0d5a20, 0x39289: 0x6d0d5c20, 0x3928a: 0x6d0d5e20, 0x3928b: 0x6d0d6020, - 0x3928c: 0x6d0d6220, 0x3928d: 0x6d0d6420, 0x3928e: 0x6d0d6620, 0x3928f: 0x6d3b8620, - 0x39290: 0x6d3b8820, 0x39291: 0x6d3b8a20, 0x39292: 0x6d3b8c20, 0x39293: 0x6d3b8e20, - 0x39294: 0x6d3b9020, 0x39295: 0x6d3b9220, 0x39296: 0x6d3b9420, 0x39297: 0x6d3b9620, - 0x39298: 0x6d3b9820, 0x39299: 0x6d3b9a20, 0x3929a: 0x6d3b9c20, 0x3929b: 0x6d3b9e20, - 0x3929c: 0x6d3ba020, 0x3929d: 0x6d3ba220, 0x3929e: 0x6d3ba420, 0x3929f: 0x6d3ba620, - 0x392a0: 0x6d3ba820, 0x392a1: 0x6d3baa20, 0x392a2: 0x6d3bac20, 0x392a3: 0x6d3bae20, - 0x392a4: 0x6d3bb020, 0x392a5: 0x6d3bb220, 0x392a6: 0x6d3bb420, 0x392a7: 0x6d3bb620, - 0x392a8: 0x6d3bb820, 0x392a9: 0x6d3bba20, 0x392aa: 0x6d3bbc20, 0x392ab: 0x6d3bbe20, - 0x392ac: 0x6d3bc020, 0x392ad: 0x6d3bc220, 0x392ae: 0x6d3bc420, 0x392af: 0x6d3bc620, - 0x392b0: 0x6d3bc820, 0x392b1: 0x6d3bca20, 0x392b2: 0x6d3bcc20, 0x392b3: 0x6d3bce20, - 0x392b4: 0x6d3bd020, 0x392b5: 0x6d3bd220, 0x392b6: 0x6d3bd420, 0x392b7: 0x6d3bd620, - 0x392b8: 0x6d67a020, 0x392b9: 0x6d67a220, 0x392ba: 0x6d67a420, 0x392bb: 0x6d67a620, - 0x392bc: 0x6d67a820, 0x392bd: 0x6d67aa20, 0x392be: 0x6d67ac20, 0x392bf: 0x6d67ae20, - // Block 0xe4b, offset 0x392c0 - 0x392c0: 0x6d67b020, 0x392c1: 0x6d67b220, 0x392c2: 0x6d67b420, 0x392c3: 0x6d67b620, - 0x392c4: 0x6d67b820, 0x392c5: 0x6d67ba20, 0x392c6: 0x6d67bc20, 0x392c7: 0x6d67be20, - 0x392c8: 0x6d67c020, 0x392c9: 0x6d67c220, 0x392ca: 0x6d67c420, 0x392cb: 0x6d67c620, - 0x392cc: 0x6d67c820, 0x392cd: 0x6d67ca20, 0x392ce: 0x6d67cc20, 0x392cf: 0x6d67ce20, - 0x392d0: 0x6d67d020, 0x392d1: 0x6d67d220, 0x392d2: 0x6d67d420, 0x392d3: 0x6d67d620, - 0x392d4: 0x6d67d820, 0x392d5: 0x6d67da20, 0x392d6: 0x6d67dc20, 0x392d7: 0x6d67de20, - 0x392d8: 0x6d67e020, 0x392d9: 0x6d67e220, 0x392da: 0x6d67e420, 0x392db: 0x6d67e620, - 0x392dc: 0x6d67e820, 0x392dd: 0x6d916820, 0x392de: 0x6d916a20, 0x392df: 0x6d916c20, - 0x392e0: 0x6d916e20, 0x392e1: 0x6d917020, 0x392e2: 0x6d917220, 0x392e3: 0x6d917420, - 0x392e4: 0x6d917620, 0x392e5: 0x6d917820, 0x392e6: 0x6d917a20, 0x392e7: 0x6d917c20, - 0x392e8: 0x6d67ea20, 0x392e9: 0x6d917e20, 0x392ea: 0x6d918020, 0x392eb: 0x6d918220, - 0x392ec: 0x6d918420, 0x392ed: 0x6db51820, 0x392ee: 0x6d918620, 0x392ef: 0x6d918820, - 0x392f0: 0x6d918a20, 0x392f1: 0x6d918c20, 0x392f2: 0x6d918e20, 0x392f3: 0x6d919020, - 0x392f4: 0x6d919220, 0x392f5: 0x6d919420, 0x392f6: 0x6d919620, 0x392f7: 0x6d919820, - 0x392f8: 0x6d919a20, 0x392f9: 0x6d919c20, 0x392fa: 0x6d919e20, 0x392fb: 0x6d91a020, - 0x392fc: 0x6d91a220, 0x392fd: 0x6d91a420, 0x392fe: 0x6d91a620, 0x392ff: 0x6d91a820, - // Block 0xe4c, offset 0x39300 - 0x39300: 0x6d91aa20, 0x39301: 0x6d91ac20, 0x39302: 0x6db51a20, 0x39303: 0x6db51c20, - 0x39304: 0x6db51e20, 0x39305: 0x6db52020, 0x39306: 0x6db52220, 0x39307: 0x6db52420, - 0x39308: 0x6db52620, 0x39309: 0x6db52820, 0x3930a: 0x6db52a20, 0x3930b: 0x6db52c20, - 0x3930c: 0x6db52e20, 0x3930d: 0x6db53020, 0x3930e: 0x6db53220, 0x3930f: 0x6db53420, - 0x39310: 0x6db53620, 0x39311: 0x6db53820, 0x39312: 0x6db53a20, 0x39313: 0x6db53c20, - 0x39314: 0x6db53e20, 0x39315: 0x6db54020, 0x39316: 0x6db54220, 0x39317: 0x6db54420, - 0x39318: 0x6db54620, 0x39319: 0x6db54820, 0x3931a: 0x6db54a20, 0x3931b: 0x6db54c20, - 0x3931c: 0x6db54e20, 0x3931d: 0x6db55020, 0x3931e: 0x6db55220, 0x3931f: 0x6db55420, - 0x39320: 0x6db55620, 0x39321: 0x6db55820, 0x39322: 0x6db55a20, 0x39323: 0x6db55c20, - 0x39324: 0x6db55e20, 0x39325: 0x6db56020, 0x39326: 0x6db56220, 0x39327: 0x6db56420, - 0x39328: 0x6db56620, 0x39329: 0x6db56820, 0x3932a: 0x6db56a20, 0x3932b: 0x6db56c20, - 0x3932c: 0x6db56e20, 0x3932d: 0x6db57020, 0x3932e: 0x6db57220, 0x3932f: 0x6db57420, - 0x39330: 0x6db57620, 0x39331: 0x6dd3d220, 0x39332: 0x6dd3d420, 0x39333: 0x6dd3d620, - 0x39334: 0x6dd3d820, 0x39335: 0x6dd3da20, 0x39336: 0x6dd3dc20, 0x39337: 0x6dd3de20, - 0x39338: 0x6dd3e020, 0x39339: 0x6dd3e220, 0x3933a: 0x6dd3e420, 0x3933b: 0x6dd3e620, - 0x3933c: 0x6dd3e820, 0x3933d: 0x6dd3ea20, 0x3933e: 0x6dd3ec20, 0x3933f: 0x6dd3ee20, - // Block 0xe4d, offset 0x39340 - 0x39340: 0x6dd3f020, 0x39341: 0x6dd3f220, 0x39342: 0x6dd3f420, 0x39343: 0x6dd3f620, - 0x39344: 0x6dd3f820, 0x39345: 0x6dd3fa20, 0x39346: 0x6dd3fc20, 0x39347: 0x6dd3fe20, - 0x39348: 0x6dd40020, 0x39349: 0x6dd40220, 0x3934a: 0x6dd40420, 0x3934b: 0x6dd40620, - 0x3934c: 0x6dd40820, 0x3934d: 0x6decca20, 0x3934e: 0x6deccc20, 0x3934f: 0x6decce20, - 0x39350: 0x6decd020, 0x39351: 0x6decd220, 0x39352: 0x6decd420, 0x39353: 0x6decd620, - 0x39354: 0x6decd820, 0x39355: 0x6decda20, 0x39356: 0x6decdc20, 0x39357: 0x6e01f820, - 0x39358: 0x6decde20, 0x39359: 0x6dece020, 0x3935a: 0x6dece220, 0x3935b: 0x6dece420, - 0x3935c: 0x6dece620, 0x3935d: 0x6dece820, 0x3935e: 0x6decea20, 0x3935f: 0x6decec20, - 0x39360: 0x6decee20, 0x39361: 0x6decf020, 0x39362: 0x6decf220, 0x39363: 0x6decf420, - 0x39364: 0x6decf620, 0x39365: 0x6decf820, 0x39366: 0x6decfa20, 0x39367: 0x6e01fa20, - 0x39368: 0x6e01fc20, 0x39369: 0x6e01fe20, 0x3936a: 0x6e020020, 0x3936b: 0x6e020220, - 0x3936c: 0x6e020420, 0x3936d: 0x6e020620, 0x3936e: 0x6e020820, 0x3936f: 0x6e020a20, - 0x39370: 0x6e020c20, 0x39371: 0x6e020e20, 0x39372: 0x6e13de20, 0x39373: 0x6e021020, - 0x39374: 0x6e021220, 0x39375: 0x6e021420, 0x39376: 0x6e13e020, 0x39377: 0x6e13e220, - 0x39378: 0x6e13e420, 0x39379: 0x6e13e620, 0x3937a: 0x6e13e820, 0x3937b: 0x6e13ea20, - 0x3937c: 0x6e13ec20, 0x3937d: 0x6e13ee20, 0x3937e: 0x6e13f020, 0x3937f: 0x6e13f220, - // Block 0xe4e, offset 0x39380 - 0x39380: 0x6e13f420, 0x39381: 0x6e13f620, 0x39382: 0x6e13f820, 0x39383: 0x6e219620, - 0x39384: 0x6e219820, 0x39385: 0x6e219a20, 0x39386: 0x6e219c20, 0x39387: 0x6e219e20, - 0x39388: 0x6e2c2c20, 0x39389: 0x6e2c2e20, 0x3938a: 0x6e2c3020, 0x3938b: 0x6e2c3220, - 0x3938c: 0x6e346820, 0x3938d: 0x6e346a20, 0x3938e: 0x6e346c20, 0x3938f: 0x6e346e20, - 0x39390: 0x6e3a1620, 0x39391: 0x6e3a1820, 0x39392: 0x6e3a1a20, 0x39393: 0x6e3a1c20, - 0x39394: 0x6e3a1e20, 0x39395: 0x6e3e2820, 0x39396: 0x6e3e2a20, 0x39397: 0x6e3e2c20, - 0x39398: 0x6e410020, 0x39399: 0x6e447820, 0x3939a: 0x6e447a20, 0x3939b: 0x6e45d620, - 0x3939c: 0x6e468e20, 0x3939d: 0x6e469020, 0x3939e: 0x6e470420, 0x3939f: 0x6e470620, - 0x393a0: 0x6c269a20, 0x393a1: 0x6c269c20, 0x393a2: 0x6c269e20, 0x393a3: 0x6c406c20, - 0x393a4: 0x6c606820, 0x393a5: 0x6c606a20, 0x393a6: 0x6c606c20, 0x393a7: 0x6c862420, - 0x393a8: 0x6c862620, 0x393a9: 0x6c862820, 0x393aa: 0x6cafe620, 0x393ab: 0x6cafe820, - 0x393ac: 0x6cafea20, 0x393ad: 0x6cdf0220, 0x393ae: 0x6cdf0420, 0x393af: 0x6d0d7820, - 0x393b0: 0x6d0d7a20, 0x393b1: 0x6d3bdc20, 0x393b2: 0x6d3bde20, 0x393b3: 0x6d3be020, - 0x393b4: 0x6d3be220, 0x393b5: 0x6d3be420, 0x393b6: 0x6d3be620, 0x393b7: 0x6d3be820, - 0x393b8: 0x6d3bea20, 0x393b9: 0x6d67f220, 0x393ba: 0x6d67f420, 0x393bb: 0x6d67f620, - 0x393bc: 0x6d91ba20, 0x393bd: 0x6d91bc20, 0x393be: 0x6d91be20, 0x393bf: 0x6db57e20, - // Block 0xe4f, offset 0x393c0 - 0x393c0: 0x6dd41020, 0x393c1: 0x6dd41220, 0x393c2: 0x6ded0220, 0x393c3: 0x6e021820, - 0x393c4: 0x6e13fa20, 0x393c5: 0x6e3a2220, 0x393c6: 0x6c406e20, 0x393c7: 0x6c407020, - 0x393c8: 0x6c607020, 0x393c9: 0x6c863220, 0x393ca: 0x6c863420, 0x393cb: 0x6c863620, - 0x393cc: 0x6c863820, 0x393cd: 0x6c863a20, 0x393ce: 0x6cb00020, 0x393cf: 0x6cb00220, - 0x393d0: 0x6cb00420, 0x393d1: 0x6cb00620, 0x393d2: 0x6cb00820, 0x393d3: 0x6cb00a20, - 0x393d4: 0x6cb00c20, 0x393d5: 0x6cb00e20, 0x393d6: 0x6cb01020, 0x393d7: 0x6cb01220, - 0x393d8: 0x6cb01420, 0x393d9: 0x6cb01620, 0x393da: 0x6cb01820, 0x393db: 0x6cb01a20, - 0x393dc: 0x6cdf1a20, 0x393dd: 0x6cdf1c20, 0x393de: 0x6cdf1e20, 0x393df: 0x6cdf2020, - 0x393e0: 0x6cdf2220, 0x393e1: 0x6cdf2420, 0x393e2: 0x6cdf2620, 0x393e3: 0x6cdf2820, - 0x393e4: 0x6cdf2a20, 0x393e5: 0x6cdf2c20, 0x393e6: 0x6cdf2e20, 0x393e7: 0x6cdf3020, - 0x393e8: 0x6d0d8420, 0x393e9: 0x6d0d8620, 0x393ea: 0x6d0d8820, 0x393eb: 0x6d0d8a20, - 0x393ec: 0x6d0d8c20, 0x393ed: 0x6d0d8e20, 0x393ee: 0x6d0d9020, 0x393ef: 0x6d0d9220, - 0x393f0: 0x6d0d9420, 0x393f1: 0x6d0d9620, 0x393f2: 0x6d0d9820, 0x393f3: 0x6d0d9a20, - 0x393f4: 0x6d0d9c20, 0x393f5: 0x6d0d9e20, 0x393f6: 0x6d0da020, 0x393f7: 0x6d0da220, - 0x393f8: 0x6d0da420, 0x393f9: 0x6d0da620, 0x393fa: 0x6d0da820, 0x393fb: 0x6d3bfa20, - 0x393fc: 0x6d3bfc20, 0x393fd: 0x6d3bfe20, 0x393fe: 0x6d3c0020, 0x393ff: 0x6d3c0220, - // Block 0xe50, offset 0x39400 - 0x39400: 0x6d3c0420, 0x39401: 0x6d3c0620, 0x39402: 0x6d3c0820, 0x39403: 0x6d3c0a20, - 0x39404: 0x6d3c0c20, 0x39405: 0x6d3c0e20, 0x39406: 0x6d3c1020, 0x39407: 0x6d3c1220, - 0x39408: 0x6d3c1420, 0x39409: 0x6d3c1620, 0x3940a: 0x6d3c1820, 0x3940b: 0x6d680420, - 0x3940c: 0x6d680620, 0x3940d: 0x6d680820, 0x3940e: 0x6d680a20, 0x3940f: 0x6d680c20, - 0x39410: 0x6d680e20, 0x39411: 0x6d681020, 0x39412: 0x6d681220, 0x39413: 0x6d681420, - 0x39414: 0x6d681620, 0x39415: 0x6d681820, 0x39416: 0x6d681a20, 0x39417: 0x6d681c20, - 0x39418: 0x6d681e20, 0x39419: 0x6d682020, 0x3941a: 0x6d682220, 0x3941b: 0x6d682420, - 0x3941c: 0x6d682620, 0x3941d: 0x6d682820, 0x3941e: 0x6d682a20, 0x3941f: 0x6d682c20, - 0x39420: 0x6d682e20, 0x39421: 0x6d91d220, 0x39422: 0x6d91d420, 0x39423: 0x6d91d620, - 0x39424: 0x6d91d820, 0x39425: 0x6d91da20, 0x39426: 0x6d91dc20, 0x39427: 0x6d91de20, - 0x39428: 0x6d91e020, 0x39429: 0x6d91e220, 0x3942a: 0x6d91e420, 0x3942b: 0x6d91e620, - 0x3942c: 0x6d91e820, 0x3942d: 0x6d91ea20, 0x3942e: 0x6d91ec20, 0x3942f: 0x6d91ee20, - 0x39430: 0x6d91f020, 0x39431: 0x6d91f220, 0x39432: 0x6d91f420, 0x39433: 0x6d91f620, - 0x39434: 0x6d91f820, 0x39435: 0x6d91fa20, 0x39436: 0x6d91fc20, 0x39437: 0x6db59020, - 0x39438: 0x6db59220, 0x39439: 0x6db59420, 0x3943a: 0x6db59620, 0x3943b: 0x6db59820, - 0x3943c: 0x6db59a20, 0x3943d: 0x6db59c20, 0x3943e: 0x6db59e20, 0x3943f: 0x6db5a020, - // Block 0xe51, offset 0x39440 - 0x39440: 0x6db5a220, 0x39441: 0x6db5a420, 0x39442: 0x6dd42020, 0x39443: 0x6dd42220, - 0x39444: 0x6dd42420, 0x39445: 0x6dd42620, 0x39446: 0x6dd42820, 0x39447: 0x6dd42a20, - 0x39448: 0x6dd42c20, 0x39449: 0x6dd42e20, 0x3944a: 0x6dd43020, 0x3944b: 0x6dd43220, - 0x3944c: 0x6ded1820, 0x3944d: 0x6ded1a20, 0x3944e: 0x6ded1c20, 0x3944f: 0x6ded1e20, - 0x39450: 0x6ded2020, 0x39451: 0x6ded2220, 0x39452: 0x6e022020, 0x39453: 0x6e022220, - 0x39454: 0x6e022420, 0x39455: 0x6e022620, 0x39456: 0x6e022820, 0x39457: 0x6e022a20, - 0x39458: 0x6e140220, 0x39459: 0x6e140420, 0x3945a: 0x6e140620, 0x3945b: 0x6e140820, - 0x3945c: 0x6e21a820, 0x3945d: 0x6e21aa20, 0x3945e: 0x6e21ac20, 0x3945f: 0x6e21ae20, - 0x39460: 0x6e21b020, 0x39461: 0x6e21b220, 0x39462: 0x6e347020, 0x39463: 0x6e347220, - 0x39464: 0x6e347420, 0x39465: 0x6e347620, 0x39466: 0x6e3a2620, 0x39467: 0x6e3a2820, - 0x39468: 0x6e3a2a20, 0x39469: 0x6e3a2c20, 0x3946a: 0x6e3a2e20, 0x3946b: 0x6e3a3020, - 0x3946c: 0x6e3e3020, 0x3946d: 0x6e410220, 0x3946e: 0x6e430c20, 0x3946f: 0x6e46b420, - 0x39470: 0x6e470820, 0x39471: 0x6e473020, 0x39472: 0x6c26a820, 0x39473: 0x6c407620, - 0x39474: 0x6c608020, 0x39475: 0x6c608220, 0x39476: 0x6c608420, 0x39477: 0x6c864220, - 0x39478: 0x6c864420, 0x39479: 0x6c864620, 0x3947a: 0x6c864820, 0x3947b: 0x6cb02a20, - 0x3947c: 0x6cb02c20, 0x3947d: 0x6cb02e20, 0x3947e: 0x6cb03020, 0x3947f: 0x6cb03220, - // Block 0xe52, offset 0x39480 - 0x39480: 0x6cb03420, 0x39481: 0x6cb03620, 0x39482: 0x6cb03820, 0x39483: 0x6cb03a20, - 0x39484: 0x6cb03c20, 0x39485: 0x6cb03e20, 0x39486: 0x6cb04020, 0x39487: 0x6cb04220, - 0x39488: 0x6cb04420, 0x39489: 0x6cb04620, 0x3948a: 0x6cb04820, 0x3948b: 0x6cb04a20, - 0x3948c: 0x6cb04c20, 0x3948d: 0x6cb04e20, 0x3948e: 0x6cb05020, 0x3948f: 0x6cb05220, - 0x39490: 0x6cb05420, 0x39491: 0x6cdf4020, 0x39492: 0x6cdf4220, 0x39493: 0x6cdf4420, - 0x39494: 0x6cdf4620, 0x39495: 0x6cdf4820, 0x39496: 0x6cdf4a20, 0x39497: 0x6cdf4c20, - 0x39498: 0x6cdf4e20, 0x39499: 0x6cdf5020, 0x3949a: 0x6cdf5220, 0x3949b: 0x6cdf5420, - 0x3949c: 0x6cdf5620, 0x3949d: 0x6cdf5820, 0x3949e: 0x6cdf5a20, 0x3949f: 0x6cdf5c20, - 0x394a0: 0x6cdf5e20, 0x394a1: 0x6d0dca20, 0x394a2: 0x6d0dcc20, 0x394a3: 0x6d0dce20, - 0x394a4: 0x6d0dd020, 0x394a5: 0x6d0dd220, 0x394a6: 0x6d0dd420, 0x394a7: 0x6d0dd620, - 0x394a8: 0x6d3c2a20, 0x394a9: 0x6d3c2c20, 0x394aa: 0x6d3c2e20, 0x394ab: 0x6d3c3020, - 0x394ac: 0x6d3c3220, 0x394ad: 0x6d3c3420, 0x394ae: 0x6d3c3620, 0x394af: 0x6d3c3820, - 0x394b0: 0x6d3c3a20, 0x394b1: 0x6d3c3c20, 0x394b2: 0x6d3c3e20, 0x394b3: 0x6d3c4020, - 0x394b4: 0x6d684c20, 0x394b5: 0x6d684e20, 0x394b6: 0x6d685020, 0x394b7: 0x6d685220, - 0x394b8: 0x6d685420, 0x394b9: 0x6d685620, 0x394ba: 0x6d685820, 0x394bb: 0x6d685a20, - 0x394bc: 0x6d685c20, 0x394bd: 0x6d685e20, 0x394be: 0x6d686020, 0x394bf: 0x6d686220, - // Block 0xe53, offset 0x394c0 - 0x394c0: 0x6d686420, 0x394c1: 0x6d686620, 0x394c2: 0x6d686820, 0x394c3: 0x6d686a20, - 0x394c4: 0x6d686c20, 0x394c5: 0x6d686e20, 0x394c6: 0x6d687020, 0x394c7: 0x6d687220, - 0x394c8: 0x6d687420, 0x394c9: 0x6d687620, 0x394ca: 0x6d687820, 0x394cb: 0x6d920c20, - 0x394cc: 0x6d920e20, 0x394cd: 0x6d921020, 0x394ce: 0x6d921220, 0x394cf: 0x6d921420, - 0x394d0: 0x6d921620, 0x394d1: 0x6d921820, 0x394d2: 0x6d921a20, 0x394d3: 0x6d921c20, - 0x394d4: 0x6d921e20, 0x394d5: 0x6d922020, 0x394d6: 0x6d922220, 0x394d7: 0x6d922420, - 0x394d8: 0x6d922620, 0x394d9: 0x6d922820, 0x394da: 0x6d922a20, 0x394db: 0x6db5b020, - 0x394dc: 0x6db5b220, 0x394dd: 0x6db5b420, 0x394de: 0x6db5b620, 0x394df: 0x6db5b820, - 0x394e0: 0x6db5ba20, 0x394e1: 0x6db5bc20, 0x394e2: 0x6d922c20, 0x394e3: 0x6db5be20, - 0x394e4: 0x6db5c020, 0x394e5: 0x6db5c220, 0x394e6: 0x6db5c420, 0x394e7: 0x6db5c620, - 0x394e8: 0x6db5c820, 0x394e9: 0x6db5ca20, 0x394ea: 0x6db5cc20, 0x394eb: 0x6db5ce20, - 0x394ec: 0x6db5d020, 0x394ed: 0x6db5d220, 0x394ee: 0x6db5d420, 0x394ef: 0x6dd43c20, - 0x394f0: 0x6dd43e20, 0x394f1: 0x6dd44020, 0x394f2: 0x6dd44220, 0x394f3: 0x6dd44420, - 0x394f4: 0x6dd44620, 0x394f5: 0x6dd44820, 0x394f6: 0x6dd44a20, 0x394f7: 0x6dd44c20, - 0x394f8: 0x6dd44e20, 0x394f9: 0x6dd45020, 0x394fa: 0x6ded2e20, 0x394fb: 0x6ded3020, - 0x394fc: 0x6ded3220, 0x394fd: 0x6ded3420, 0x394fe: 0x6ded3620, 0x394ff: 0x6ded3820, - // Block 0xe54, offset 0x39500 - 0x39500: 0x6ded3a20, 0x39501: 0x6ded3c20, 0x39502: 0x6ded3e20, 0x39503: 0x6ded4020, - 0x39504: 0x6e023820, 0x39505: 0x6e023a20, 0x39506: 0x6e023c20, 0x39507: 0x6e023e20, - 0x39508: 0x6e140c20, 0x39509: 0x6e140e20, 0x3950a: 0x6e141020, 0x3950b: 0x6e141220, - 0x3950c: 0x6e21b820, 0x3950d: 0x6e21ba20, 0x3950e: 0x6e21bc20, 0x3950f: 0x6e21be20, - 0x39510: 0x6e21c020, 0x39511: 0x6e2c4020, 0x39512: 0x6e2c4220, 0x39513: 0x6e347820, - 0x39514: 0x6e347a20, 0x39515: 0x6e3a3a20, 0x39516: 0x6e3e3220, 0x39517: 0x6e430e20, - 0x39518: 0x6e431020, 0x39519: 0x6e447c20, 0x3951a: 0x6e447e20, 0x3951b: 0x6c26ae20, - 0x3951c: 0x6c26b020, 0x3951d: 0x6c407820, 0x3951e: 0x6c407a20, 0x3951f: 0x6c407c20, - 0x39520: 0x6c609a20, 0x39521: 0x6c867220, 0x39522: 0x6c867420, 0x39523: 0x6c867620, - 0x39524: 0x6c867820, 0x39525: 0x6c867a20, 0x39526: 0x6c867c20, 0x39527: 0x6c867e20, - 0x39528: 0x6c868020, 0x39529: 0x6c868220, 0x3952a: 0x6c868420, 0x3952b: 0x6c868620, - 0x3952c: 0x6c868820, 0x3952d: 0x6c868a20, 0x3952e: 0x6cb0aa20, 0x3952f: 0x6cb0ac20, - 0x39530: 0x6cb0ae20, 0x39531: 0x6cb0b020, 0x39532: 0x6cb0b220, 0x39533: 0x6cb0b420, - 0x39534: 0x6cb0b620, 0x39535: 0x6cb0b820, 0x39536: 0x6cb0ba20, 0x39537: 0x6cb0bc20, - 0x39538: 0x6cb0be20, 0x39539: 0x6cb0c020, 0x3953a: 0x6cb0c220, 0x3953b: 0x6cb0c420, - 0x3953c: 0x6cb0c620, 0x3953d: 0x6cb0c820, 0x3953e: 0x6cb0ca20, 0x3953f: 0x6cb0cc20, - // Block 0xe55, offset 0x39540 - 0x39540: 0x6cb0ce20, 0x39541: 0x6cb0d020, 0x39542: 0x6cb0d220, 0x39543: 0x6cb0d420, - 0x39544: 0x6cb0d620, 0x39545: 0x6cb0d820, 0x39546: 0x6cb0da20, 0x39547: 0x6cb0dc20, - 0x39548: 0x6cb0de20, 0x39549: 0x6cb0e020, 0x3954a: 0x6cb0e220, 0x3954b: 0x6cb0e420, - 0x3954c: 0x6cb0e620, 0x3954d: 0x6cb0e820, 0x3954e: 0x6cb0ea20, 0x3954f: 0x6cb0ec20, - 0x39550: 0x6cb0ee20, 0x39551: 0x6cb0f020, 0x39552: 0x6cb0f220, 0x39553: 0x6cb0f420, - 0x39554: 0x6cb0f620, 0x39555: 0x6cb0f820, 0x39556: 0x6cb0fa20, 0x39557: 0x6cb0fc20, - 0x39558: 0x6cb0fe20, 0x39559: 0x6cb10020, 0x3955a: 0x6cb10220, 0x3955b: 0x6cb10420, - 0x3955c: 0x6cdfd620, 0x3955d: 0x6cdfd820, 0x3955e: 0x6cdfda20, 0x3955f: 0x6cdfdc20, - 0x39560: 0x6cdfde20, 0x39561: 0x6cdfe020, 0x39562: 0x6cdfe220, 0x39563: 0x6cdfe420, - 0x39564: 0x6cdfe620, 0x39565: 0x6cdfe820, 0x39566: 0x6cdfea20, 0x39567: 0x6cdfec20, - 0x39568: 0x6cdfee20, 0x39569: 0x6cdff020, 0x3956a: 0x6cdff220, 0x3956b: 0x6cdff420, - 0x3956c: 0x6cdff620, 0x3956d: 0x6cdff820, 0x3956e: 0x6cdffa20, 0x3956f: 0x6cdffc20, - 0x39570: 0x6cdffe20, 0x39571: 0x6ce00020, 0x39572: 0x6ce00220, 0x39573: 0x6ce00420, - 0x39574: 0x6ce00620, 0x39575: 0x6ce00820, 0x39576: 0x6ce00a20, 0x39577: 0x6ce00c20, - 0x39578: 0x6ce00e20, 0x39579: 0x6ce01020, 0x3957a: 0x6ce01220, 0x3957b: 0x6ce01420, - 0x3957c: 0x6ce01620, 0x3957d: 0x6ce01820, 0x3957e: 0x6ce01a20, 0x3957f: 0x6ce01c20, - // Block 0xe56, offset 0x39580 - 0x39580: 0x6ce01e20, 0x39581: 0x6ce02020, 0x39582: 0x6ce02220, 0x39583: 0x6d0e4a20, - 0x39584: 0x6d0e4c20, 0x39585: 0x6d0e4e20, 0x39586: 0x6d0e5020, 0x39587: 0x6d0e5220, - 0x39588: 0x6d0e5420, 0x39589: 0x6d0e5620, 0x3958a: 0x6d0e5820, 0x3958b: 0x6d0e5a20, - 0x3958c: 0x6d0e5c20, 0x3958d: 0x6d0e5e20, 0x3958e: 0x6d0e6020, 0x3958f: 0x6d0e6220, - 0x39590: 0x6d0e6420, 0x39591: 0x6d0e6620, 0x39592: 0x6d0e6820, 0x39593: 0x6d0e6a20, - 0x39594: 0x6d0e6c20, 0x39595: 0x6d0e6e20, 0x39596: 0x6d0e7020, 0x39597: 0x6d0e7220, - 0x39598: 0x6d0e7420, 0x39599: 0x6d0e7620, 0x3959a: 0x6d0e7820, 0x3959b: 0x6d0e7a20, - 0x3959c: 0x6d0e7c20, 0x3959d: 0x6d0e7e20, 0x3959e: 0x6d0e8020, 0x3959f: 0x6d0e8220, - 0x395a0: 0x6d0e8420, 0x395a1: 0x6d0e8620, 0x395a2: 0x6d0e8820, 0x395a3: 0x6d0e8a20, - 0x395a4: 0x6d0e8c20, 0x395a5: 0x6d0e8e20, 0x395a6: 0x6d0e9020, 0x395a7: 0x6d0e9220, - 0x395a8: 0x6d0e9420, 0x395a9: 0x6d0e9620, 0x395aa: 0x6d0e9820, 0x395ab: 0x6d0e9a20, - 0x395ac: 0x6d0e9c20, 0x395ad: 0x6d0e9e20, 0x395ae: 0x6d0ea020, 0x395af: 0x6d0ea220, - 0x395b0: 0x6d0ea420, 0x395b1: 0x6d0ea620, 0x395b2: 0x6d0ea820, 0x395b3: 0x6d0eaa20, - 0x395b4: 0x6d3c9e20, 0x395b5: 0x6d3ca020, 0x395b6: 0x6d3ca220, 0x395b7: 0x6d3ca420, - 0x395b8: 0x6d3ca620, 0x395b9: 0x6d3ca820, 0x395ba: 0x6d3caa20, 0x395bb: 0x6d3cac20, - 0x395bc: 0x6d3cae20, 0x395bd: 0x6d3cb020, 0x395be: 0x6d3cb220, 0x395bf: 0x6d3cb420, - // Block 0xe57, offset 0x395c0 - 0x395c0: 0x6d3cb620, 0x395c1: 0x6d3cb820, 0x395c2: 0x6d3cba20, 0x395c3: 0x6d3cbc20, - 0x395c4: 0x6d3cbe20, 0x395c5: 0x6d3cc020, 0x395c6: 0x6d3cc220, 0x395c7: 0x6d3cc420, - 0x395c8: 0x6d3cc620, 0x395c9: 0x6d3cc820, 0x395ca: 0x6d3cca20, 0x395cb: 0x6d3ccc20, - 0x395cc: 0x6d3cce20, 0x395cd: 0x6d3cd020, 0x395ce: 0x6d3cd220, 0x395cf: 0x6d3cd420, - 0x395d0: 0x6d3cd620, 0x395d1: 0x6d3cd820, 0x395d2: 0x6d3cda20, 0x395d3: 0x6d3cdc20, - 0x395d4: 0x6d3cde20, 0x395d5: 0x6d3ce020, 0x395d6: 0x6d3ce220, 0x395d7: 0x6d3ce420, - 0x395d8: 0x6d3ce620, 0x395d9: 0x6d3ce820, 0x395da: 0x6d3cea20, 0x395db: 0x6d3cec20, - 0x395dc: 0x6d0eac20, 0x395dd: 0x6d3cee20, 0x395de: 0x6d3cf020, 0x395df: 0x6d3cf220, - 0x395e0: 0x6d3cf420, 0x395e1: 0x6d3cf620, 0x395e2: 0x6d3cf820, 0x395e3: 0x6d3cfa20, - 0x395e4: 0x6d3cfc20, 0x395e5: 0x6d3cfe20, 0x395e6: 0x6d68f820, 0x395e7: 0x6d68fa20, - 0x395e8: 0x6d68fc20, 0x395e9: 0x6d68fe20, 0x395ea: 0x6d690020, 0x395eb: 0x6d690220, - 0x395ec: 0x6d690420, 0x395ed: 0x6d690620, 0x395ee: 0x6d690820, 0x395ef: 0x6d690a20, - 0x395f0: 0x6d690c20, 0x395f1: 0x6d690e20, 0x395f2: 0x6d691020, 0x395f3: 0x6d691220, - 0x395f4: 0x6d691420, 0x395f5: 0x6d691620, 0x395f6: 0x6d691820, 0x395f7: 0x6d691a20, - 0x395f8: 0x6d691c20, 0x395f9: 0x6d691e20, 0x395fa: 0x6d692020, 0x395fb: 0x6d692220, - 0x395fc: 0x6d692420, 0x395fd: 0x6d692620, 0x395fe: 0x6d692820, 0x395ff: 0x6d692a20, - // Block 0xe58, offset 0x39600 - 0x39600: 0x6d692c20, 0x39601: 0x6d692e20, 0x39602: 0x6d693020, 0x39603: 0x6d693220, - 0x39604: 0x6d693420, 0x39605: 0x6d693620, 0x39606: 0x6d693820, 0x39607: 0x6d693a20, - 0x39608: 0x6d693c20, 0x39609: 0x6d693e20, 0x3960a: 0x6d694020, 0x3960b: 0x6d694220, - 0x3960c: 0x6d694420, 0x3960d: 0x6d694620, 0x3960e: 0x6d694820, 0x3960f: 0x6d694a20, - 0x39610: 0x6d694c20, 0x39611: 0x6d694e20, 0x39612: 0x6d695020, 0x39613: 0x6d695220, - 0x39614: 0x6d695420, 0x39615: 0x6d695620, 0x39616: 0x6d695820, 0x39617: 0x6d695a20, - 0x39618: 0x6d695c20, 0x39619: 0x6d695e20, 0x3961a: 0x6d696020, 0x3961b: 0x6d696220, - 0x3961c: 0x6d696420, 0x3961d: 0x6d696620, 0x3961e: 0x6d696820, 0x3961f: 0x6d696a20, - 0x39620: 0x6d696c20, 0x39621: 0x6d696e20, 0x39622: 0x6d697020, 0x39623: 0x6d928820, - 0x39624: 0x6d928a20, 0x39625: 0x6d928c20, 0x39626: 0x6d928e20, 0x39627: 0x6d929020, - 0x39628: 0x6d929220, 0x39629: 0x6d929420, 0x3962a: 0x6d929620, 0x3962b: 0x6d929820, - 0x3962c: 0x6d929a20, 0x3962d: 0x6d929c20, 0x3962e: 0x6d929e20, 0x3962f: 0x6d92a020, - 0x39630: 0x6d92a220, 0x39631: 0x6d92a420, 0x39632: 0x6d92a620, 0x39633: 0x6d92a820, - 0x39634: 0x6d92aa20, 0x39635: 0x6d92ac20, 0x39636: 0x6d92ae20, 0x39637: 0x6d92b020, - 0x39638: 0x6d92b220, 0x39639: 0x6d92b420, 0x3963a: 0x6d92b620, 0x3963b: 0x6d92b820, - 0x3963c: 0x6d92ba20, 0x3963d: 0x6d92bc20, 0x3963e: 0x6d92be20, 0x3963f: 0x6d92c020, - // Block 0xe59, offset 0x39640 - 0x39640: 0x6d92c220, 0x39641: 0x6d92c420, 0x39642: 0x6d92c620, 0x39643: 0x6d92c820, - 0x39644: 0x6d92ca20, 0x39645: 0x6d92cc20, 0x39646: 0x6d92ce20, 0x39647: 0x6d92d020, - 0x39648: 0x6d92d220, 0x39649: 0x6d92d420, 0x3964a: 0x6d92d620, 0x3964b: 0x6d92d820, - 0x3964c: 0x6d92da20, 0x3964d: 0x6d92dc20, 0x3964e: 0x6d92de20, 0x3964f: 0x6d92e020, - 0x39650: 0x6d92e220, 0x39651: 0x6d92e420, 0x39652: 0x6d92e620, 0x39653: 0x6d92e820, - 0x39654: 0x6d92ea20, 0x39655: 0x6d92ec20, 0x39656: 0x6d92ee20, 0x39657: 0x6d92f020, - 0x39658: 0x6db61e20, 0x39659: 0x6db62020, 0x3965a: 0x6db62220, 0x3965b: 0x6db62420, - 0x3965c: 0x6db62620, 0x3965d: 0x6db62820, 0x3965e: 0x6db62a20, 0x3965f: 0x6db62c20, - 0x39660: 0x6db62e20, 0x39661: 0x6db63020, 0x39662: 0x6db63220, 0x39663: 0x6db63420, - 0x39664: 0x6db63620, 0x39665: 0x6db63820, 0x39666: 0x6db63a20, 0x39667: 0x6db63c20, - 0x39668: 0x6db63e20, 0x39669: 0x6db64020, 0x3966a: 0x6db64220, 0x3966b: 0x6db64420, - 0x3966c: 0x6db64620, 0x3966d: 0x6db64820, 0x3966e: 0x6db64a20, 0x3966f: 0x6db64c20, - 0x39670: 0x6db64e20, 0x39671: 0x6db65020, 0x39672: 0x6db65220, 0x39673: 0x6db65420, - 0x39674: 0x6db65620, 0x39675: 0x6db65820, 0x39676: 0x6db65a20, 0x39677: 0x6db65c20, - 0x39678: 0x6db65e20, 0x39679: 0x6db66020, 0x3967a: 0x6db66220, 0x3967b: 0x6db66420, - 0x3967c: 0x6db66620, 0x3967d: 0x6db66820, 0x3967e: 0x6db66a20, 0x3967f: 0x6db66c20, - // Block 0xe5a, offset 0x39680 - 0x39680: 0x6db66e20, 0x39681: 0x6db67020, 0x39682: 0x6db67220, 0x39683: 0x6db67420, - 0x39684: 0x6db67620, 0x39685: 0x6db67820, 0x39686: 0x6db67a20, 0x39687: 0x6db67c20, - 0x39688: 0x6db67e20, 0x39689: 0x6db68020, 0x3968a: 0x6db68220, 0x3968b: 0x6db68420, - 0x3968c: 0x6db68620, 0x3968d: 0x6db68820, 0x3968e: 0x6db68a20, 0x3968f: 0x6db68c20, - 0x39690: 0x6db68e20, 0x39691: 0x6db69020, 0x39692: 0x6dd49a20, 0x39693: 0x6dd49c20, - 0x39694: 0x6dd49e20, 0x39695: 0x6dd4a020, 0x39696: 0x6dd4a220, 0x39697: 0x6dd4a420, - 0x39698: 0x6dd4a620, 0x39699: 0x6dd4a820, 0x3969a: 0x6dd4aa20, 0x3969b: 0x6dd4ac20, - 0x3969c: 0x6dd4ae20, 0x3969d: 0x6dd4b020, 0x3969e: 0x6dd4b220, 0x3969f: 0x6dd4b420, - 0x396a0: 0x6dd4b620, 0x396a1: 0x6dd4b820, 0x396a2: 0x6dd4ba20, 0x396a3: 0x6dd4bc20, - 0x396a4: 0x6dd4be20, 0x396a5: 0x6dd4c020, 0x396a6: 0x6dd4c220, 0x396a7: 0x6dd4c420, - 0x396a8: 0x6dd4c620, 0x396a9: 0x6dd4c820, 0x396aa: 0x6dd4ca20, 0x396ab: 0x6dd4cc20, - 0x396ac: 0x6dd4ce20, 0x396ad: 0x6dd4d020, 0x396ae: 0x6dd4d220, 0x396af: 0x6dd4d420, - 0x396b0: 0x6dd4d620, 0x396b1: 0x6dd4d820, 0x396b2: 0x6dd4da20, 0x396b3: 0x6dd4dc20, - 0x396b4: 0x6dd4de20, 0x396b5: 0x6dd4e020, 0x396b6: 0x6dd4e220, 0x396b7: 0x6dd4e420, - 0x396b8: 0x6dd4e620, 0x396b9: 0x6dd4e820, 0x396ba: 0x6dd4ea20, 0x396bb: 0x6dd4ec20, - 0x396bc: 0x6dd4ee20, 0x396bd: 0x6dd4f020, 0x396be: 0x6ded8820, 0x396bf: 0x6ded8a20, - // Block 0xe5b, offset 0x396c0 - 0x396c0: 0x6ded8c20, 0x396c1: 0x6ded8e20, 0x396c2: 0x6ded9020, 0x396c3: 0x6ded9220, - 0x396c4: 0x6ded9420, 0x396c5: 0x6ded9620, 0x396c6: 0x6ded9820, 0x396c7: 0x6ded9a20, - 0x396c8: 0x6ded9c20, 0x396c9: 0x6ded9e20, 0x396ca: 0x6deda020, 0x396cb: 0x6deda220, - 0x396cc: 0x6deda420, 0x396cd: 0x6deda620, 0x396ce: 0x6deda820, 0x396cf: 0x6dedaa20, - 0x396d0: 0x6dedac20, 0x396d1: 0x6dedae20, 0x396d2: 0x6dedb020, 0x396d3: 0x6dedb220, - 0x396d4: 0x6dedb420, 0x396d5: 0x6dedb620, 0x396d6: 0x6dedb820, 0x396d7: 0x6dedba20, - 0x396d8: 0x6dedbc20, 0x396d9: 0x6dedbe20, 0x396da: 0x6dedc020, 0x396db: 0x6dedc220, - 0x396dc: 0x6dedc420, 0x396dd: 0x6dedc620, 0x396de: 0x6dedc820, 0x396df: 0x6dedca20, - 0x396e0: 0x6dedcc20, 0x396e1: 0x6dedce20, 0x396e2: 0x6dedd020, 0x396e3: 0x6dedd220, - 0x396e4: 0x6dedd420, 0x396e5: 0x6dedd620, 0x396e6: 0x6dedd820, 0x396e7: 0x6e027c20, - 0x396e8: 0x6e027e20, 0x396e9: 0x6e028020, 0x396ea: 0x6e028220, 0x396eb: 0x6e028420, - 0x396ec: 0x6e028620, 0x396ed: 0x6e028820, 0x396ee: 0x6e028a20, 0x396ef: 0x6e028c20, - 0x396f0: 0x6e028e20, 0x396f1: 0x6e029020, 0x396f2: 0x6e029220, 0x396f3: 0x6e029420, - 0x396f4: 0x6e029620, 0x396f5: 0x6e029820, 0x396f6: 0x6e029a20, 0x396f7: 0x6e029c20, - 0x396f8: 0x6e029e20, 0x396f9: 0x6e02a020, 0x396fa: 0x6e02a220, 0x396fb: 0x6e02a420, - 0x396fc: 0x6e02a620, 0x396fd: 0x6e02a820, 0x396fe: 0x6e02aa20, 0x396ff: 0x6e02ac20, - // Block 0xe5c, offset 0x39700 - 0x39700: 0x6e02ae20, 0x39701: 0x6e02b020, 0x39702: 0x6e143820, 0x39703: 0x6e143a20, - 0x39704: 0x6e143c20, 0x39705: 0x6e143e20, 0x39706: 0x6e144020, 0x39707: 0x6e144220, - 0x39708: 0x6e144420, 0x39709: 0x6e144620, 0x3970a: 0x6e144820, 0x3970b: 0x6e144a20, - 0x3970c: 0x6e144c20, 0x3970d: 0x6e144e20, 0x3970e: 0x6e145020, 0x3970f: 0x6e145220, - 0x39710: 0x6e145420, 0x39711: 0x6e21d820, 0x39712: 0x6e145620, 0x39713: 0x6e145820, - 0x39714: 0x6e145a20, 0x39715: 0x6e145c20, 0x39716: 0x6e145e20, 0x39717: 0x6e146020, - 0x39718: 0x6e146220, 0x39719: 0x6e146420, 0x3971a: 0x6e146620, 0x3971b: 0x6e146820, - 0x3971c: 0x6e21da20, 0x3971d: 0x6e21dc20, 0x3971e: 0x6e21de20, 0x3971f: 0x6e21e020, - 0x39720: 0x6e21e220, 0x39721: 0x6e21e420, 0x39722: 0x6e21e620, 0x39723: 0x6e21e820, - 0x39724: 0x6e21ea20, 0x39725: 0x6e21ec20, 0x39726: 0x6e21ee20, 0x39727: 0x6e21f020, - 0x39728: 0x6e21f220, 0x39729: 0x6e21f420, 0x3972a: 0x6e21f620, 0x3972b: 0x6e21f820, - 0x3972c: 0x6e21fa20, 0x3972d: 0x6e21fc20, 0x3972e: 0x6e21fe20, 0x3972f: 0x6e220020, - 0x39730: 0x6e220220, 0x39731: 0x6e220420, 0x39732: 0x6e220620, 0x39733: 0x6e220820, - 0x39734: 0x6e220a20, 0x39735: 0x6e220c20, 0x39736: 0x6e220e20, 0x39737: 0x6e221020, - 0x39738: 0x6e2c5a20, 0x39739: 0x6e2c5c20, 0x3973a: 0x6e2c5e20, 0x3973b: 0x6e2c6020, - 0x3973c: 0x6e2c6220, 0x3973d: 0x6e2c6420, 0x3973e: 0x6e2c6620, 0x3973f: 0x6e2c6820, - // Block 0xe5d, offset 0x39740 - 0x39740: 0x6e2c6a20, 0x39741: 0x6e2c6c20, 0x39742: 0x6e2c6e20, 0x39743: 0x6e2c7020, - 0x39744: 0x6e2c7220, 0x39745: 0x6e348a20, 0x39746: 0x6e348c20, 0x39747: 0x6e348e20, - 0x39748: 0x6e349020, 0x39749: 0x6e349220, 0x3974a: 0x6e349420, 0x3974b: 0x6e349620, - 0x3974c: 0x6e349820, 0x3974d: 0x6e349a20, 0x3974e: 0x6e349c20, 0x3974f: 0x6e349e20, - 0x39750: 0x6e34a020, 0x39751: 0x6e3a4220, 0x39752: 0x6e3a4420, 0x39753: 0x6e3a4620, - 0x39754: 0x6e3a4820, 0x39755: 0x6e3a4a20, 0x39756: 0x6e3a4c20, 0x39757: 0x6e3a4e20, - 0x39758: 0x6e3a5020, 0x39759: 0x6e3e3820, 0x3975a: 0x6e3e3a20, 0x3975b: 0x6e3e3c20, - 0x3975c: 0x6e3e3e20, 0x3975d: 0x6e3e4020, 0x3975e: 0x6e410a20, 0x3975f: 0x6e410c20, - 0x39760: 0x6e410e20, 0x39761: 0x6e411020, 0x39762: 0x6e431220, 0x39763: 0x6e431420, - 0x39764: 0x6e431620, 0x39765: 0x6e428c20, 0x39766: 0x6e431820, 0x39767: 0x6e431a20, - 0x39768: 0x6e448220, 0x39769: 0x6e472020, 0x3976a: 0x6c26d620, 0x3976b: 0x6c26e820, - 0x3976c: 0x6c86c820, 0x3976d: 0x6c86ca20, 0x3976e: 0x6c86cc20, 0x3976f: 0x6cb14620, - 0x39770: 0x6cb14820, 0x39771: 0x6cb14a20, 0x39772: 0x6cb14c20, 0x39773: 0x6ce04c20, - 0x39774: 0x6ce04e20, 0x39775: 0x6d0ec420, 0x39776: 0x6d0ec620, 0x39777: 0x6d0ec820, - 0x39778: 0x6d3d1a20, 0x39779: 0x6d3d1c20, 0x3977a: 0x6d698820, 0x3977b: 0x6d698a20, - 0x3977c: 0x6d698c20, 0x3977d: 0x6d698e20, 0x3977e: 0x6d699020, 0x3977f: 0x6d699220, - // Block 0xe5e, offset 0x39780 - 0x39780: 0x6d930020, 0x39781: 0x6d930220, 0x39782: 0x6d930420, 0x39783: 0x6d930620, - 0x39784: 0x6d930820, 0x39785: 0x6d930a20, 0x39786: 0x6db6a620, 0x39787: 0x6db6a820, - 0x39788: 0x6db6aa20, 0x39789: 0x6db6ac20, 0x3978a: 0x6dd50220, 0x3978b: 0x6dede620, - 0x3978c: 0x6dede820, 0x3978d: 0x6dedea20, 0x3978e: 0x6dedec20, 0x3978f: 0x6dedee20, - 0x39790: 0x6dedf020, 0x39791: 0x6dedf220, 0x39792: 0x6dedf420, 0x39793: 0x6e02b620, - 0x39794: 0x6e02b820, 0x39795: 0x6e146c20, 0x39796: 0x6e146e20, 0x39797: 0x6e3a5220, - 0x39798: 0x6e411220, 0x39799: 0x6e45da20, 0x3979a: 0x6c60c220, 0x3979b: 0x6c86d220, - 0x3979c: 0x6c86d420, 0x3979d: 0x6c86d620, 0x3979e: 0x6cb15420, 0x3979f: 0x6cb15620, - 0x397a0: 0x6ce05220, 0x397a1: 0x6ce05420, 0x397a2: 0x6ce05620, 0x397a3: 0x6ce05820, - 0x397a4: 0x6ce05a20, 0x397a5: 0x6d0ed020, 0x397a6: 0x6d0ed220, 0x397a7: 0x6cee2c20, - 0x397a8: 0x6d0ed420, 0x397a9: 0x6d3d2420, 0x397aa: 0x6d3d2620, 0x397ab: 0x6d3d2820, - 0x397ac: 0x6d3d2a20, 0x397ad: 0x6d699e20, 0x397ae: 0x6d69a020, 0x397af: 0x6d69a220, - 0x397b0: 0x6d69a420, 0x397b1: 0x6d69a620, 0x397b2: 0x6d69a820, 0x397b3: 0x6d69aa20, - 0x397b4: 0x6d69ac20, 0x397b5: 0x6d69ae20, 0x397b6: 0x6d69b020, 0x397b7: 0x6d931620, - 0x397b8: 0x6d931820, 0x397b9: 0x6d931a20, 0x397ba: 0x6d931c20, 0x397bb: 0x6d931e20, - 0x397bc: 0x6db6b620, 0x397bd: 0x6db6b820, 0x397be: 0x6db6ba20, 0x397bf: 0x6db6bc20, - // Block 0xe5f, offset 0x397c0 - 0x397c0: 0x6db6be20, 0x397c1: 0x6db6c020, 0x397c2: 0x6db6c220, 0x397c3: 0x6dd50820, - 0x397c4: 0x6dd50a20, 0x397c5: 0x6dd50c20, 0x397c6: 0x6dd50e20, 0x397c7: 0x6dd51020, - 0x397c8: 0x6db6c420, 0x397c9: 0x6dedf620, 0x397ca: 0x6dedf820, 0x397cb: 0x6dedfa20, - 0x397cc: 0x6dedfc20, 0x397cd: 0x6dedfe20, 0x397ce: 0x6dee0020, 0x397cf: 0x6dee0220, - 0x397d0: 0x6dee0420, 0x397d1: 0x6e02bc20, 0x397d2: 0x6e02be20, 0x397d3: 0x6e02c020, - 0x397d4: 0x6e02c220, 0x397d5: 0x6e02c420, 0x397d6: 0x6e02c620, 0x397d7: 0x6e147220, - 0x397d8: 0x6e147420, 0x397d9: 0x6e221a20, 0x397da: 0x6e221c20, 0x397db: 0x6e221e20, - 0x397dc: 0x6e222020, 0x397dd: 0x6e2c7a20, 0x397de: 0x6e2c7c20, 0x397df: 0x6e2c7e20, - 0x397e0: 0x6e34a820, 0x397e1: 0x6e3a5820, 0x397e2: 0x6e3a5a20, 0x397e3: 0x6e411620, - 0x397e4: 0x6e411820, 0x397e5: 0x6e448420, 0x397e6: 0x6c40ba20, 0x397e7: 0x6c26ee20, - 0x397e8: 0x6c26f020, 0x397e9: 0x6c60c420, 0x397ea: 0x6c86dc20, 0x397eb: 0x6c86de20, - 0x397ec: 0x6c86e020, 0x397ed: 0x6c86e220, 0x397ee: 0x6cb16820, 0x397ef: 0x6cb16a20, - 0x397f0: 0x6cb16c20, 0x397f1: 0x6cb16e20, 0x397f2: 0x6cb17020, 0x397f3: 0x6cb17220, - 0x397f4: 0x6cb17420, 0x397f5: 0x6ce06620, 0x397f6: 0x6ce06820, 0x397f7: 0x6ce06a20, - 0x397f8: 0x6ce06c20, 0x397f9: 0x6ce06e20, 0x397fa: 0x6ce07020, 0x397fb: 0x6ce07220, - 0x397fc: 0x6ce07420, 0x397fd: 0x6ce07620, 0x397fe: 0x6ce07820, 0x397ff: 0x6d0ee220, - // Block 0xe60, offset 0x39800 - 0x39800: 0x6d0ee420, 0x39801: 0x6d0ee620, 0x39802: 0x6d0ee820, 0x39803: 0x6d0eea20, - 0x39804: 0x6d0eec20, 0x39805: 0x6d0eee20, 0x39806: 0x6d0ef020, 0x39807: 0x6d0ef220, - 0x39808: 0x6d0ef420, 0x39809: 0x6d0ef620, 0x3980a: 0x6d0ef820, 0x3980b: 0x6d0efa20, - 0x3980c: 0x6d0efc20, 0x3980d: 0x6d3d3420, 0x3980e: 0x6d3d3620, 0x3980f: 0x6d3d3820, - 0x39810: 0x6d3d3a20, 0x39811: 0x6d3d3c20, 0x39812: 0x6d3d3e20, 0x39813: 0x6d3d4020, - 0x39814: 0x6d3d4220, 0x39815: 0x6d3d4420, 0x39816: 0x6d3d4620, 0x39817: 0x6d3d4820, - 0x39818: 0x6d69ba20, 0x39819: 0x6d69bc20, 0x3981a: 0x6d69be20, 0x3981b: 0x6d69c020, - 0x3981c: 0x6d69c220, 0x3981d: 0x6d69c420, 0x3981e: 0x6d69c620, 0x3981f: 0x6d69c820, - 0x39820: 0x6d69ca20, 0x39821: 0x6d69cc20, 0x39822: 0x6d69ce20, 0x39823: 0x6d69d020, - 0x39824: 0x6d69d220, 0x39825: 0x6d69d420, 0x39826: 0x6d69d620, 0x39827: 0x6d69d820, - 0x39828: 0x6d932a20, 0x39829: 0x6d932c20, 0x3982a: 0x6d932e20, 0x3982b: 0x6d933020, - 0x3982c: 0x6d933220, 0x3982d: 0x6d933420, 0x3982e: 0x6d933620, 0x3982f: 0x6d933820, - 0x39830: 0x6d933a20, 0x39831: 0x6d933c20, 0x39832: 0x6db6d020, 0x39833: 0x6db6d220, - 0x39834: 0x6db6d420, 0x39835: 0x6db6d620, 0x39836: 0x6db6d820, 0x39837: 0x6db6da20, - 0x39838: 0x6db6dc20, 0x39839: 0x6db6de20, 0x3983a: 0x6db6e020, 0x3983b: 0x6dd51a20, - 0x3983c: 0x6dd51c20, 0x3983d: 0x6dd51e20, 0x3983e: 0x6dd52020, 0x3983f: 0x6dd52220, - // Block 0xe61, offset 0x39840 - 0x39840: 0x6dd52420, 0x39841: 0x6dd52620, 0x39842: 0x6dee0c20, 0x39843: 0x6dee0e20, - 0x39844: 0x6dee1020, 0x39845: 0x6dee1220, 0x39846: 0x6dee1420, 0x39847: 0x6e02c820, - 0x39848: 0x6e02ca20, 0x39849: 0x6e02cc20, 0x3984a: 0x6e02ce20, 0x3984b: 0x6e02d020, - 0x3984c: 0x6e147820, 0x3984d: 0x6e147a20, 0x3984e: 0x6e147c20, 0x3984f: 0x6e147e20, - 0x39850: 0x6e222420, 0x39851: 0x6e222620, 0x39852: 0x6e222820, 0x39853: 0x6e222a20, - 0x39854: 0x6e2c8020, 0x39855: 0x6e2c8220, 0x39856: 0x6e2c8420, 0x39857: 0x6e222c20, - 0x39858: 0x6e34aa20, 0x39859: 0x6e34ac20, 0x3985a: 0x6e3a6020, 0x3985b: 0x6e3a6220, - 0x3985c: 0x6e3a6420, 0x3985d: 0x6e411a20, 0x3985e: 0x6e448620, 0x3985f: 0x6e46ec20, - 0x39860: 0x6c40be20, 0x39861: 0x6c60c620, 0x39862: 0x6c86ea20, 0x39863: 0x6c86ec20, - 0x39864: 0x6cb18420, 0x39865: 0x6cb18620, 0x39866: 0x6cb18820, 0x39867: 0x6cb18a20, - 0x39868: 0x6cb18c20, 0x39869: 0x6cb18e20, 0x3986a: 0x6cb19020, 0x3986b: 0x6cb19220, - 0x3986c: 0x6ce08a20, 0x3986d: 0x6ce08c20, 0x3986e: 0x6ce08e20, 0x3986f: 0x6ce09020, - 0x39870: 0x6ce09220, 0x39871: 0x6ce09420, 0x39872: 0x6ce09620, 0x39873: 0x6ce09820, - 0x39874: 0x6ce09a20, 0x39875: 0x6ce09c20, 0x39876: 0x6ce09e20, 0x39877: 0x6ce0a020, - 0x39878: 0x6ce0a220, 0x39879: 0x6ce0a420, 0x3987a: 0x6ce0a620, 0x3987b: 0x6ce0a820, - 0x3987c: 0x6ce0aa20, 0x3987d: 0x6ce0ac20, 0x3987e: 0x6d0f0c20, 0x3987f: 0x6d0f0e20, - // Block 0xe62, offset 0x39880 - 0x39880: 0x6d0f1020, 0x39881: 0x6d0f1220, 0x39882: 0x6d0f1420, 0x39883: 0x6d0f1620, - 0x39884: 0x6d0f1820, 0x39885: 0x6d0f1a20, 0x39886: 0x6d0f1c20, 0x39887: 0x6d0f1e20, - 0x39888: 0x6d0f2020, 0x39889: 0x6d0f2220, 0x3988a: 0x6d3d5620, 0x3988b: 0x6d3d5820, - 0x3988c: 0x6d3d5a20, 0x3988d: 0x6d3d5c20, 0x3988e: 0x6d3d5e20, 0x3988f: 0x6d3d6020, - 0x39890: 0x6d3d6220, 0x39891: 0x6d3d6420, 0x39892: 0x6d3d6620, 0x39893: 0x6d3d6820, - 0x39894: 0x6d3d6a20, 0x39895: 0x6d3d6c20, 0x39896: 0x6d3d6e20, 0x39897: 0x6d3d7020, - 0x39898: 0x6d3d7220, 0x39899: 0x6d69e420, 0x3989a: 0x6d69e620, 0x3989b: 0x6d69e820, - 0x3989c: 0x6d69ea20, 0x3989d: 0x6d69ec20, 0x3989e: 0x6d69ee20, 0x3989f: 0x6d69f020, - 0x398a0: 0x6d69f220, 0x398a1: 0x6d69f420, 0x398a2: 0x6d69f620, 0x398a3: 0x6d69f820, - 0x398a4: 0x6d69fa20, 0x398a5: 0x6d69fc20, 0x398a6: 0x6d934a20, 0x398a7: 0x6d934c20, - 0x398a8: 0x6d934e20, 0x398a9: 0x6d935020, 0x398aa: 0x6d935220, 0x398ab: 0x6d935420, - 0x398ac: 0x6d935620, 0x398ad: 0x6d935820, 0x398ae: 0x6d935a20, 0x398af: 0x6d935c20, - 0x398b0: 0x6d935e20, 0x398b1: 0x6d69fe20, 0x398b2: 0x6d936020, 0x398b3: 0x6d936220, - 0x398b4: 0x6d936420, 0x398b5: 0x6db6ea20, 0x398b6: 0x6db6ec20, 0x398b7: 0x6db6ee20, - 0x398b8: 0x6db6f020, 0x398b9: 0x6db6f220, 0x398ba: 0x6db6f420, 0x398bb: 0x6db6f620, - 0x398bc: 0x6db6f820, 0x398bd: 0x6db6fa20, 0x398be: 0x6db6fc20, 0x398bf: 0x6db6fe20, - // Block 0xe63, offset 0x398c0 - 0x398c0: 0x6db70020, 0x398c1: 0x6dd53220, 0x398c2: 0x6dd53420, 0x398c3: 0x6dd53620, - 0x398c4: 0x6dd53820, 0x398c5: 0x6dd53a20, 0x398c6: 0x6dee2220, 0x398c7: 0x6dd53c20, - 0x398c8: 0x6dd53e20, 0x398c9: 0x6dd54020, 0x398ca: 0x6dd54220, 0x398cb: 0x6dd54420, - 0x398cc: 0x6dee2420, 0x398cd: 0x6dee2620, 0x398ce: 0x6dee2820, 0x398cf: 0x6dee2a20, - 0x398d0: 0x6e02d220, 0x398d1: 0x6dee2c20, 0x398d2: 0x6dee2e20, 0x398d3: 0x6dee3020, - 0x398d4: 0x6dee3220, 0x398d5: 0x6dee3420, 0x398d6: 0x6e02d420, 0x398d7: 0x6e02d620, - 0x398d8: 0x6e02d820, 0x398d9: 0x6e02da20, 0x398da: 0x6e02dc20, 0x398db: 0x6e02de20, - 0x398dc: 0x6e02e020, 0x398dd: 0x6e148020, 0x398de: 0x6e148220, 0x398df: 0x6e222e20, - 0x398e0: 0x6e2c8620, 0x398e1: 0x6e2c8820, 0x398e2: 0x6e34ae20, 0x398e3: 0x6e411e20, - 0x398e4: 0x6c60ce20, 0x398e5: 0x6c60d020, 0x398e6: 0x6c60d220, 0x398e7: 0x6c60d420, - 0x398e8: 0x6c60d620, 0x398e9: 0x6c60d820, 0x398ea: 0x6c86f820, 0x398eb: 0x6c86fa20, - 0x398ec: 0x6c86fc20, 0x398ed: 0x6c86fe20, 0x398ee: 0x6c870020, 0x398ef: 0x6c870220, - 0x398f0: 0x6c870420, 0x398f1: 0x6c870620, 0x398f2: 0x6c870820, 0x398f3: 0x6cb1ac20, - 0x398f4: 0x6cb1ae20, 0x398f5: 0x6cb1b020, 0x398f6: 0x6cb1b220, 0x398f7: 0x6cb1b420, - 0x398f8: 0x6cb1b620, 0x398f9: 0x6cb1b820, 0x398fa: 0x6cb1ba20, 0x398fb: 0x6cb1bc20, - 0x398fc: 0x6cb1be20, 0x398fd: 0x6cb1c020, 0x398fe: 0x6cb1c220, 0x398ff: 0x6cb1c420, - // Block 0xe64, offset 0x39900 - 0x39900: 0x6cb1c620, 0x39901: 0x6cb1c820, 0x39902: 0x6cb1ca20, 0x39903: 0x6cb1cc20, - 0x39904: 0x6cb1ce20, 0x39905: 0x6cb1d020, 0x39906: 0x6cb1d220, 0x39907: 0x6cb1d420, - 0x39908: 0x6cb1d620, 0x39909: 0x6ce0e020, 0x3990a: 0x6ce0e220, 0x3990b: 0x6ce0e420, - 0x3990c: 0x6ce0e620, 0x3990d: 0x6ce0e820, 0x3990e: 0x6ce0ea20, 0x3990f: 0x6ce0ec20, - 0x39910: 0x6ce0ee20, 0x39911: 0x6ce0f020, 0x39912: 0x6ce0f220, 0x39913: 0x6ce0f420, - 0x39914: 0x6ce0f620, 0x39915: 0x6ce0f820, 0x39916: 0x6ce0fa20, 0x39917: 0x6ce0fc20, - 0x39918: 0x6ce0fe20, 0x39919: 0x6ce10020, 0x3991a: 0x6ce10220, 0x3991b: 0x6ce10420, - 0x3991c: 0x6ce10620, 0x3991d: 0x6ce10820, 0x3991e: 0x6ce10a20, 0x3991f: 0x6ce10c20, - 0x39920: 0x6ce10e20, 0x39921: 0x6ce11020, 0x39922: 0x6ce11220, 0x39923: 0x6d0f4a20, - 0x39924: 0x6d0f4c20, 0x39925: 0x6d0f4e20, 0x39926: 0x6d0f5020, 0x39927: 0x6d0f5220, - 0x39928: 0x6d0f5420, 0x39929: 0x6d0f5620, 0x3992a: 0x6d0f5820, 0x3992b: 0x6d0f5a20, - 0x3992c: 0x6d0f5c20, 0x3992d: 0x6d0f5e20, 0x3992e: 0x6d0f6020, 0x3992f: 0x6d0f6220, - 0x39930: 0x6d0f6420, 0x39931: 0x6d0f6620, 0x39932: 0x6d0f6820, 0x39933: 0x6d0f6a20, - 0x39934: 0x6d0f6c20, 0x39935: 0x6d0f6e20, 0x39936: 0x6d0f7020, 0x39937: 0x6d0f7220, - 0x39938: 0x6d0f7420, 0x39939: 0x6d0f7620, 0x3993a: 0x6d0f7820, 0x3993b: 0x6d0f7a20, - 0x3993c: 0x6d0f7c20, 0x3993d: 0x6d0f7e20, 0x3993e: 0x6d0f8020, 0x3993f: 0x6d0f8220, - // Block 0xe65, offset 0x39940 - 0x39940: 0x6d0f8420, 0x39941: 0x6d0f8620, 0x39942: 0x6d0f8820, 0x39943: 0x6d0f8a20, - 0x39944: 0x6d0f8c20, 0x39945: 0x6d3d9020, 0x39946: 0x6d3d9220, 0x39947: 0x6d3d9420, - 0x39948: 0x6d3d9620, 0x39949: 0x6d3d9820, 0x3994a: 0x6d3d9a20, 0x3994b: 0x6d3d9c20, - 0x3994c: 0x6d3d9e20, 0x3994d: 0x6d3da020, 0x3994e: 0x6d3da220, 0x3994f: 0x6d3da420, - 0x39950: 0x6d3da620, 0x39951: 0x6d3da820, 0x39952: 0x6d3daa20, 0x39953: 0x6d3dac20, - 0x39954: 0x6d3dae20, 0x39955: 0x6d3db020, 0x39956: 0x6d3db220, 0x39957: 0x6d3db420, - 0x39958: 0x6d3db620, 0x39959: 0x6d3db820, 0x3995a: 0x6d3dba20, 0x3995b: 0x6d6a3c20, - 0x3995c: 0x6d6a3e20, 0x3995d: 0x6d6a4020, 0x3995e: 0x6d6a4220, 0x3995f: 0x6d6a4420, - 0x39960: 0x6d6a4620, 0x39961: 0x6d6a4820, 0x39962: 0x6d6a4a20, 0x39963: 0x6d6a4c20, - 0x39964: 0x6d6a4e20, 0x39965: 0x6d6a5020, 0x39966: 0x6d6a5220, 0x39967: 0x6d6a5420, - 0x39968: 0x6d6a5620, 0x39969: 0x6d6a5820, 0x3996a: 0x6d6a5a20, 0x3996b: 0x6d6a5c20, - 0x3996c: 0x6d6a5e20, 0x3996d: 0x6d6a6020, 0x3996e: 0x6d6a6220, 0x3996f: 0x6d6a6420, - 0x39970: 0x6d6a6620, 0x39971: 0x6d938420, 0x39972: 0x6d938620, 0x39973: 0x6d938820, - 0x39974: 0x6d938a20, 0x39975: 0x6d938c20, 0x39976: 0x6d938e20, 0x39977: 0x6d939020, - 0x39978: 0x6d939220, 0x39979: 0x6d939420, 0x3997a: 0x6d939620, 0x3997b: 0x6d939820, - 0x3997c: 0x6d939a20, 0x3997d: 0x6d939c20, 0x3997e: 0x6d939e20, 0x3997f: 0x6d93a020, - // Block 0xe66, offset 0x39980 - 0x39980: 0x6d93a220, 0x39981: 0x6d93a420, 0x39982: 0x6d93a620, 0x39983: 0x6d93a820, - 0x39984: 0x6d93aa20, 0x39985: 0x6db02a20, 0x39986: 0x6d93ac20, 0x39987: 0x6d93ae20, - 0x39988: 0x6d93b020, 0x39989: 0x6d93b220, 0x3998a: 0x6d93b420, 0x3998b: 0x6d93b620, - 0x3998c: 0x6db71820, 0x3998d: 0x6db71a20, 0x3998e: 0x6db71c20, 0x3998f: 0x6db71e20, - 0x39990: 0x6db72020, 0x39991: 0x6db72220, 0x39992: 0x6db72420, 0x39993: 0x6db72620, - 0x39994: 0x6db72820, 0x39995: 0x6db72a20, 0x39996: 0x6db72c20, 0x39997: 0x6db72e20, - 0x39998: 0x6db73020, 0x39999: 0x6db73220, 0x3999a: 0x6db73420, 0x3999b: 0x6db73620, - 0x3999c: 0x6db73820, 0x3999d: 0x6db73a20, 0x3999e: 0x6dd55620, 0x3999f: 0x6dd55820, - 0x399a0: 0x6dd55a20, 0x399a1: 0x6dd55c20, 0x399a2: 0x6dd55e20, 0x399a3: 0x6dd56020, - 0x399a4: 0x6dd56220, 0x399a5: 0x6dd56420, 0x399a6: 0x6dd56620, 0x399a7: 0x6dd56820, - 0x399a8: 0x6dd56a20, 0x399a9: 0x6dd56c20, 0x399aa: 0x6dd56e20, 0x399ab: 0x6dd57020, - 0x399ac: 0x6dd57220, 0x399ad: 0x6dd57420, 0x399ae: 0x6dd57620, 0x399af: 0x6dd57820, - 0x399b0: 0x6dd57a20, 0x399b1: 0x6dd57c20, 0x399b2: 0x6dd57e20, 0x399b3: 0x6dd58020, - 0x399b4: 0x6dd58220, 0x399b5: 0x6dd58420, 0x399b6: 0x6dd58620, 0x399b7: 0x6dd58820, - 0x399b8: 0x6dd58a20, 0x399b9: 0x6dd58c20, 0x399ba: 0x6dd58e20, 0x399bb: 0x6dd59020, - 0x399bc: 0x6dee4620, 0x399bd: 0x6dee4820, 0x399be: 0x6dee4a20, 0x399bf: 0x6dee4c20, - // Block 0xe67, offset 0x399c0 - 0x399c0: 0x6dee4e20, 0x399c1: 0x6dee5020, 0x399c2: 0x6dee5220, 0x399c3: 0x6dee5420, - 0x399c4: 0x6dee5620, 0x399c5: 0x6dee5820, 0x399c6: 0x6dee5a20, 0x399c7: 0x6dee5c20, - 0x399c8: 0x6dee5e20, 0x399c9: 0x6dee6020, 0x399ca: 0x6dee6220, 0x399cb: 0x6dee6420, - 0x399cc: 0x6dee6620, 0x399cd: 0x6dee6820, 0x399ce: 0x6dee6a20, 0x399cf: 0x6dee6c20, - 0x399d0: 0x6dee6e20, 0x399d1: 0x6dee7020, 0x399d2: 0x6dee7220, 0x399d3: 0x6dee7420, - 0x399d4: 0x6dee7620, 0x399d5: 0x6dee7820, 0x399d6: 0x6e02ea20, 0x399d7: 0x6e02ec20, - 0x399d8: 0x6e02ee20, 0x399d9: 0x6e02f020, 0x399da: 0x6e02f220, 0x399db: 0x6e02f420, - 0x399dc: 0x6e02f620, 0x399dd: 0x6e02f820, 0x399de: 0x6e02fa20, 0x399df: 0x6e02fc20, - 0x399e0: 0x6e02fe20, 0x399e1: 0x6e030020, 0x399e2: 0x6e030220, 0x399e3: 0x6e030420, - 0x399e4: 0x6e030620, 0x399e5: 0x6e030820, 0x399e6: 0x6e148e20, 0x399e7: 0x6e149020, - 0x399e8: 0x6e149220, 0x399e9: 0x6e149420, 0x399ea: 0x6e149620, 0x399eb: 0x6e149820, - 0x399ec: 0x6e149a20, 0x399ed: 0x6e149c20, 0x399ee: 0x6e149e20, 0x399ef: 0x6e14a020, - 0x399f0: 0x6e14a220, 0x399f1: 0x6e223a20, 0x399f2: 0x6e223c20, 0x399f3: 0x6e223e20, - 0x399f4: 0x6e224020, 0x399f5: 0x6e224220, 0x399f6: 0x6e224420, 0x399f7: 0x6e224620, - 0x399f8: 0x6e224820, 0x399f9: 0x6e224a20, 0x399fa: 0x6e224c20, 0x399fb: 0x6e224e20, - 0x399fc: 0x6e225020, 0x399fd: 0x6e2c9020, 0x399fe: 0x6e2c9220, 0x399ff: 0x6e225220, - // Block 0xe68, offset 0x39a00 - 0x39a00: 0x6e2c9420, 0x39a01: 0x6e2c9620, 0x39a02: 0x6e2c9820, 0x39a03: 0x6e2c9a20, - 0x39a04: 0x6e2c9c20, 0x39a05: 0x6e2c9e20, 0x39a06: 0x6e2ca020, 0x39a07: 0x6e2ca220, - 0x39a08: 0x6e34b220, 0x39a09: 0x6e34b420, 0x39a0a: 0x6e34b620, 0x39a0b: 0x6e34b820, - 0x39a0c: 0x6e3a6a20, 0x39a0d: 0x6e3a6c20, 0x39a0e: 0x6e3e4420, 0x39a0f: 0x6e3e4620, - 0x39a10: 0x6e3e4820, 0x39a11: 0x6c40da20, 0x39a12: 0x6c60f420, 0x39a13: 0x6cb1e420, - 0x39a14: 0x6ce12e20, 0x39a15: 0x6ce13020, 0x39a16: 0x6ce13220, 0x39a17: 0x6d6a7420, - 0x39a18: 0x6c40dc20, 0x39a19: 0x6c60fa20, 0x39a1a: 0x6c60fc20, 0x39a1b: 0x6cb1ee20, - 0x39a1c: 0x6cb1f020, 0x39a1d: 0x6ce13620, 0x39a1e: 0x6ce13820, 0x39a1f: 0x6ce13a20, - 0x39a20: 0x6d0fa020, 0x39a21: 0x6d0fa220, 0x39a22: 0x6d0fa420, 0x39a23: 0x6d3dd020, - 0x39a24: 0x6d3dd220, 0x39a25: 0x6d3dd420, 0x39a26: 0x6d3dd620, 0x39a27: 0x6d6a7620, - 0x39a28: 0x6d6a7820, 0x39a29: 0x6d6a7a20, 0x39a2a: 0x6d6a7c20, 0x39a2b: 0x6d6a7e20, - 0x39a2c: 0x6d93d020, 0x39a2d: 0x6d93d220, 0x39a2e: 0x6d93d420, 0x39a2f: 0x6d93d620, - 0x39a30: 0x6d93d820, 0x39a31: 0x6d93da20, 0x39a32: 0x6db74620, 0x39a33: 0x6db74820, - 0x39a34: 0x6db74a20, 0x39a35: 0x6db74c20, 0x39a36: 0x6dd59620, 0x39a37: 0x6dd59820, - 0x39a38: 0x6dee7c20, 0x39a39: 0x6dee7e20, 0x39a3a: 0x6dee8020, 0x39a3b: 0x6dee8220, - 0x39a3c: 0x6dee8420, 0x39a3d: 0x6e14a820, 0x39a3e: 0x6e14aa20, 0x39a3f: 0x6e14ac20, - // Block 0xe69, offset 0x39a40 - 0x39a40: 0x6e225820, 0x39a41: 0x6e225a20, 0x39a42: 0x6e2ca620, 0x39a43: 0x6e2ca820, - 0x39a44: 0x6e2caa20, 0x39a45: 0x6e2cac20, 0x39a46: 0x6c26fe20, 0x39a47: 0x6c40de20, - 0x39a48: 0x6c610820, 0x39a49: 0x6c610a20, 0x39a4a: 0x6c610c20, 0x39a4b: 0x6c610e20, - 0x39a4c: 0x6c611020, 0x39a4d: 0x6c611220, 0x39a4e: 0x6c611420, 0x39a4f: 0x6c873420, - 0x39a50: 0x6c873620, 0x39a51: 0x6c873820, 0x39a52: 0x6c873a20, 0x39a53: 0x6c873c20, - 0x39a54: 0x6c873e20, 0x39a55: 0x6c874020, 0x39a56: 0x6c874220, 0x39a57: 0x6c874420, - 0x39a58: 0x6c874620, 0x39a59: 0x6c874820, 0x39a5a: 0x6c874a20, 0x39a5b: 0x6c874c20, - 0x39a5c: 0x6c874e20, 0x39a5d: 0x6cb20a20, 0x39a5e: 0x6cb20c20, 0x39a5f: 0x6cb20e20, - 0x39a60: 0x6cb21020, 0x39a61: 0x6cb21220, 0x39a62: 0x6cb21420, 0x39a63: 0x6cb21620, - 0x39a64: 0x6cb21820, 0x39a65: 0x6cb21a20, 0x39a66: 0x6cb21c20, 0x39a67: 0x6cb21e20, - 0x39a68: 0x6cb22020, 0x39a69: 0x6cb22220, 0x39a6a: 0x6cb22420, 0x39a6b: 0x6cb22620, - 0x39a6c: 0x6cb22820, 0x39a6d: 0x6cb22a20, 0x39a6e: 0x6cb22c20, 0x39a6f: 0x6cb22e20, - 0x39a70: 0x6cb23020, 0x39a71: 0x6cb23220, 0x39a72: 0x6cb23420, 0x39a73: 0x6cb23620, - 0x39a74: 0x6cb23820, 0x39a75: 0x6cb23a20, 0x39a76: 0x6ce16620, 0x39a77: 0x6ce16820, - 0x39a78: 0x6ce16a20, 0x39a79: 0x6ce16c20, 0x39a7a: 0x6ce16e20, 0x39a7b: 0x6ce17020, - 0x39a7c: 0x6ce17220, 0x39a7d: 0x6ce17420, 0x39a7e: 0x6ce17620, 0x39a7f: 0x6ce17820, - // Block 0xe6a, offset 0x39a80 - 0x39a80: 0x6ce17a20, 0x39a81: 0x6ce17c20, 0x39a82: 0x6ce17e20, 0x39a83: 0x6ce18020, - 0x39a84: 0x6ce18220, 0x39a85: 0x6ce18420, 0x39a86: 0x6ce18620, 0x39a87: 0x6ce18820, - 0x39a88: 0x6ce18a20, 0x39a89: 0x6ce18c20, 0x39a8a: 0x6ce18e20, 0x39a8b: 0x6ce19020, - 0x39a8c: 0x6ce19220, 0x39a8d: 0x6ce19420, 0x39a8e: 0x6ce19620, 0x39a8f: 0x6ce19820, - 0x39a90: 0x6d0fc620, 0x39a91: 0x6d0fc820, 0x39a92: 0x6d0fca20, 0x39a93: 0x6d0fcc20, - 0x39a94: 0x6d0fce20, 0x39a95: 0x6d0fd020, 0x39a96: 0x6d0fd220, 0x39a97: 0x6d0fd420, - 0x39a98: 0x6d0fd620, 0x39a99: 0x6d0fd820, 0x39a9a: 0x6d0fda20, 0x39a9b: 0x6d0fdc20, - 0x39a9c: 0x6d0fde20, 0x39a9d: 0x6d0fe020, 0x39a9e: 0x6d0fe220, 0x39a9f: 0x6d0fe420, - 0x39aa0: 0x6d0fe620, 0x39aa1: 0x6d0fe820, 0x39aa2: 0x6d0fea20, 0x39aa3: 0x6d0fec20, - 0x39aa4: 0x6d0fee20, 0x39aa5: 0x6d0ff020, 0x39aa6: 0x6d0ff220, 0x39aa7: 0x6d0ff420, - 0x39aa8: 0x6d0ff620, 0x39aa9: 0x6d0ff820, 0x39aaa: 0x6d0ffa20, 0x39aab: 0x6d0ffc20, - 0x39aac: 0x6d0ffe20, 0x39aad: 0x6d100020, 0x39aae: 0x6d100220, 0x39aaf: 0x6d3df420, - 0x39ab0: 0x6d3df620, 0x39ab1: 0x6d3df820, 0x39ab2: 0x6d3dfa20, 0x39ab3: 0x6d3dfc20, - 0x39ab4: 0x6d3dfe20, 0x39ab5: 0x6d3e0020, 0x39ab6: 0x6d3e0220, 0x39ab7: 0x6d3e0420, - 0x39ab8: 0x6d3e0620, 0x39ab9: 0x6d3e0820, 0x39aba: 0x6d3e0a20, 0x39abb: 0x6d3e0c20, - 0x39abc: 0x6d3e0e20, 0x39abd: 0x6d3e1020, 0x39abe: 0x6d3e1220, 0x39abf: 0x6d3e1420, - // Block 0xe6b, offset 0x39ac0 - 0x39ac0: 0x6d3e1620, 0x39ac1: 0x6d3e1820, 0x39ac2: 0x6d3e1a20, 0x39ac3: 0x6d3e1c20, - 0x39ac4: 0x6d3e1e20, 0x39ac5: 0x6d3e2020, 0x39ac6: 0x6d3e2220, 0x39ac7: 0x6d3e2420, - 0x39ac8: 0x6d3e2620, 0x39ac9: 0x6d3e2820, 0x39aca: 0x6d3e2a20, 0x39acb: 0x6d3e2c20, - 0x39acc: 0x6d3e2e20, 0x39acd: 0x6d3e3020, 0x39ace: 0x6d6aa420, 0x39acf: 0x6d6aa620, - 0x39ad0: 0x6d6aa820, 0x39ad1: 0x6d6aaa20, 0x39ad2: 0x6d6aac20, 0x39ad3: 0x6d6aae20, - 0x39ad4: 0x6d6ab020, 0x39ad5: 0x6d6ab220, 0x39ad6: 0x6d6ab420, 0x39ad7: 0x6d6ab620, - 0x39ad8: 0x6d6ab820, 0x39ad9: 0x6d6aba20, 0x39ada: 0x6d6abc20, 0x39adb: 0x6d6abe20, - 0x39adc: 0x6d6ac020, 0x39add: 0x6d3e3220, 0x39ade: 0x6d6ac220, 0x39adf: 0x6d93ea20, - 0x39ae0: 0x6d6ac420, 0x39ae1: 0x6d6ac620, 0x39ae2: 0x6d6ac820, 0x39ae3: 0x6d6aca20, - 0x39ae4: 0x6d6acc20, 0x39ae5: 0x6d6ace20, 0x39ae6: 0x6d6ad020, 0x39ae7: 0x6d6ad220, - 0x39ae8: 0x6d93ec20, 0x39ae9: 0x6d93ee20, 0x39aea: 0x6d93f020, 0x39aeb: 0x6d93f220, - 0x39aec: 0x6d93f420, 0x39aed: 0x6d93f620, 0x39aee: 0x6d93f820, 0x39aef: 0x6d93fa20, - 0x39af0: 0x6d93fc20, 0x39af1: 0x6d93fe20, 0x39af2: 0x6d940020, 0x39af3: 0x6d940220, - 0x39af4: 0x6d940420, 0x39af5: 0x6d940620, 0x39af6: 0x6d940820, 0x39af7: 0x6d940a20, - 0x39af8: 0x6d940c20, 0x39af9: 0x6d940e20, 0x39afa: 0x6d941020, 0x39afb: 0x6d941220, - 0x39afc: 0x6d941420, 0x39afd: 0x6d941620, 0x39afe: 0x6d941820, 0x39aff: 0x6d941a20, - // Block 0xe6c, offset 0x39b00 - 0x39b00: 0x6d941c20, 0x39b01: 0x6d941e20, 0x39b02: 0x6d942020, 0x39b03: 0x6d942220, - 0x39b04: 0x6d942420, 0x39b05: 0x6d942620, 0x39b06: 0x6d942820, 0x39b07: 0x6d942a20, - 0x39b08: 0x6d942c20, 0x39b09: 0x6db75820, 0x39b0a: 0x6db75a20, 0x39b0b: 0x6db75c20, - 0x39b0c: 0x6db75e20, 0x39b0d: 0x6db76020, 0x39b0e: 0x6db76220, 0x39b0f: 0x6db76420, - 0x39b10: 0x6db76620, 0x39b11: 0x6db76820, 0x39b12: 0x6db76a20, 0x39b13: 0x6db76c20, - 0x39b14: 0x6db76e20, 0x39b15: 0x6db77020, 0x39b16: 0x6db77220, 0x39b17: 0x6db77420, - 0x39b18: 0x6db77620, 0x39b19: 0x6db77820, 0x39b1a: 0x6db77a20, 0x39b1b: 0x6db77c20, - 0x39b1c: 0x6db77e20, 0x39b1d: 0x6db78020, 0x39b1e: 0x6dd5a820, 0x39b1f: 0x6dd5aa20, - 0x39b20: 0x6dd5ac20, 0x39b21: 0x6dd5ae20, 0x39b22: 0x6dd5b020, 0x39b23: 0x6dd5b220, - 0x39b24: 0x6dd5b420, 0x39b25: 0x6dd5b620, 0x39b26: 0x6dd5b820, 0x39b27: 0x6dd5ba20, - 0x39b28: 0x6dd5bc20, 0x39b29: 0x6dd5be20, 0x39b2a: 0x6dd5c020, 0x39b2b: 0x6dd5c220, - 0x39b2c: 0x6dd5c420, 0x39b2d: 0x6dd5c620, 0x39b2e: 0x6dd5c820, 0x39b2f: 0x6dd5ca20, - 0x39b30: 0x6dd5cc20, 0x39b31: 0x6dd5ce20, 0x39b32: 0x6dd5d020, 0x39b33: 0x6dd5d220, - 0x39b34: 0x6dd5d420, 0x39b35: 0x6dd5d620, 0x39b36: 0x6dee9020, 0x39b37: 0x6dee9220, - 0x39b38: 0x6dee9420, 0x39b39: 0x6dee9620, 0x39b3a: 0x6dee9820, 0x39b3b: 0x6dee9a20, - 0x39b3c: 0x6dee9c20, 0x39b3d: 0x6dee9e20, 0x39b3e: 0x6deea020, 0x39b3f: 0x6deea220, - // Block 0xe6d, offset 0x39b40 - 0x39b40: 0x6deea420, 0x39b41: 0x6deea620, 0x39b42: 0x6deea820, 0x39b43: 0x6deeaa20, - 0x39b44: 0x6deeac20, 0x39b45: 0x6deeae20, 0x39b46: 0x6deeb020, 0x39b47: 0x6deeb220, - 0x39b48: 0x6deeb420, 0x39b49: 0x6deeb620, 0x39b4a: 0x6deeb820, 0x39b4b: 0x6deeba20, - 0x39b4c: 0x6deebc20, 0x39b4d: 0x6e031420, 0x39b4e: 0x6e031620, 0x39b4f: 0x6e031820, - 0x39b50: 0x6e031a20, 0x39b51: 0x6e031c20, 0x39b52: 0x6e031e20, 0x39b53: 0x6e032020, - 0x39b54: 0x6e032220, 0x39b55: 0x6e032420, 0x39b56: 0x6e032620, 0x39b57: 0x6e032820, - 0x39b58: 0x6e032a20, 0x39b59: 0x6e14b420, 0x39b5a: 0x6e14b620, 0x39b5b: 0x6e14b820, - 0x39b5c: 0x6e14ba20, 0x39b5d: 0x6e14bc20, 0x39b5e: 0x6e14be20, 0x39b5f: 0x6e14c020, - 0x39b60: 0x6e14c220, 0x39b61: 0x6e226220, 0x39b62: 0x6e226420, 0x39b63: 0x6e226620, - 0x39b64: 0x6e226820, 0x39b65: 0x6e226a20, 0x39b66: 0x6e226c20, 0x39b67: 0x6e226e20, - 0x39b68: 0x6e2cb220, 0x39b69: 0x6e2cb420, 0x39b6a: 0x6e2cb620, 0x39b6b: 0x6e2cb820, - 0x39b6c: 0x6e2cba20, 0x39b6d: 0x6e2cbc20, 0x39b6e: 0x6e34bc20, 0x39b6f: 0x6e34be20, - 0x39b70: 0x6e3a7020, 0x39b71: 0x6e3a7220, 0x39b72: 0x6e3a7420, 0x39b73: 0x6e3a7620, - 0x39b74: 0x6e3a7820, 0x39b75: 0x6e412020, 0x39b76: 0x6e432020, 0x39b77: 0x6c270420, - 0x39b78: 0x6c40e020, 0x39b79: 0x6c40e220, 0x39b7a: 0x6c611c20, 0x39b7b: 0x6c611e20, - 0x39b7c: 0x6c612020, 0x39b7d: 0x6c612220, 0x39b7e: 0x6c612420, 0x39b7f: 0x6c612620, - // Block 0xe6e, offset 0x39b80 - 0x39b80: 0x6c612820, 0x39b81: 0x6c875c20, 0x39b82: 0x6c875e20, 0x39b83: 0x6c876020, - 0x39b84: 0x6c876220, 0x39b85: 0x6c876420, 0x39b86: 0x6c876620, 0x39b87: 0x6c876820, - 0x39b88: 0x6c876a20, 0x39b89: 0x6c876c20, 0x39b8a: 0x6c876e20, 0x39b8b: 0x6c877020, - 0x39b8c: 0x6c877220, 0x39b8d: 0x6c877420, 0x39b8e: 0x6c877620, 0x39b8f: 0x6c877820, - 0x39b90: 0x6c877a20, 0x39b91: 0x6c877c20, 0x39b92: 0x6cb26420, 0x39b93: 0x6cb26620, - 0x39b94: 0x6cb26820, 0x39b95: 0x6cb26a20, 0x39b96: 0x6cb26c20, 0x39b97: 0x6cb26e20, - 0x39b98: 0x6cb27020, 0x39b99: 0x6cb27220, 0x39b9a: 0x6cb27420, 0x39b9b: 0x6cb27620, - 0x39b9c: 0x6cb27820, 0x39b9d: 0x6cb27a20, 0x39b9e: 0x6cb27c20, 0x39b9f: 0x6cb27e20, - 0x39ba0: 0x6cb28020, 0x39ba1: 0x6cb28220, 0x39ba2: 0x6cb28420, 0x39ba3: 0x6cb28620, - 0x39ba4: 0x6cb28820, 0x39ba5: 0x6cb28a20, 0x39ba6: 0x6cb28c20, 0x39ba7: 0x6cb28e20, - 0x39ba8: 0x6cb29020, 0x39ba9: 0x6cb29220, 0x39baa: 0x6cb29420, 0x39bab: 0x6cb29620, - 0x39bac: 0x6cb29820, 0x39bad: 0x6cb29a20, 0x39bae: 0x6cb29c20, 0x39baf: 0x6cb29e20, - 0x39bb0: 0x6cb2a020, 0x39bb1: 0x6cb2a220, 0x39bb2: 0x6ce1ee20, 0x39bb3: 0x6ce1f020, - 0x39bb4: 0x6ce1f220, 0x39bb5: 0x6ce1f420, 0x39bb6: 0x6ce1f620, 0x39bb7: 0x6ce1f820, - 0x39bb8: 0x6ce1fa20, 0x39bb9: 0x6ce1fc20, 0x39bba: 0x6ce1fe20, 0x39bbb: 0x6ce20020, - 0x39bbc: 0x6ce20220, 0x39bbd: 0x6ce20420, 0x39bbe: 0x6ce20620, 0x39bbf: 0x6ce20820, - // Block 0xe6f, offset 0x39bc0 - 0x39bc0: 0x6ce20a20, 0x39bc1: 0x6ce20c20, 0x39bc2: 0x6ce20e20, 0x39bc3: 0x6ce21020, - 0x39bc4: 0x6ce21220, 0x39bc5: 0x6ce21420, 0x39bc6: 0x6ce21620, 0x39bc7: 0x6ce21820, - 0x39bc8: 0x6ce21a20, 0x39bc9: 0x6ce21c20, 0x39bca: 0x6ce21e20, 0x39bcb: 0x6ce22020, - 0x39bcc: 0x6ce22220, 0x39bcd: 0x6ce22420, 0x39bce: 0x6ce22620, 0x39bcf: 0x6ce22820, - 0x39bd0: 0x6ce22a20, 0x39bd1: 0x6ce22c20, 0x39bd2: 0x6ce22e20, 0x39bd3: 0x6ce23020, - 0x39bd4: 0x6ce23220, 0x39bd5: 0x6d105020, 0x39bd6: 0x6d105220, 0x39bd7: 0x6d105420, - 0x39bd8: 0x6d105620, 0x39bd9: 0x6d105820, 0x39bda: 0x6d105a20, 0x39bdb: 0x6d105c20, - 0x39bdc: 0x6d105e20, 0x39bdd: 0x6d106020, 0x39bde: 0x6d106220, 0x39bdf: 0x6d106420, - 0x39be0: 0x6d106620, 0x39be1: 0x6d106820, 0x39be2: 0x6d106a20, 0x39be3: 0x6d106c20, - 0x39be4: 0x6d106e20, 0x39be5: 0x6d107020, 0x39be6: 0x6d107220, 0x39be7: 0x6d107420, - 0x39be8: 0x6d107620, 0x39be9: 0x6d107820, 0x39bea: 0x6d107a20, 0x39beb: 0x6d107c20, - 0x39bec: 0x6d107e20, 0x39bed: 0x6d108020, 0x39bee: 0x6d108220, 0x39bef: 0x6d108420, - 0x39bf0: 0x6d108620, 0x39bf1: 0x6d108820, 0x39bf2: 0x6d108a20, 0x39bf3: 0x6d108c20, - 0x39bf4: 0x6d108e20, 0x39bf5: 0x6d109020, 0x39bf6: 0x6d109220, 0x39bf7: 0x6d109420, - 0x39bf8: 0x6d109620, 0x39bf9: 0x6d109820, 0x39bfa: 0x6d109a20, 0x39bfb: 0x6d109c20, - 0x39bfc: 0x6d109e20, 0x39bfd: 0x6d10a020, 0x39bfe: 0x6d10a220, 0x39bff: 0x6d10a420, - // Block 0xe70, offset 0x39c00 - 0x39c00: 0x6d3e7220, 0x39c01: 0x6d3e7420, 0x39c02: 0x6d3e7620, 0x39c03: 0x6d3e7820, - 0x39c04: 0x6d3e7a20, 0x39c05: 0x6d3e7c20, 0x39c06: 0x6d3e7e20, 0x39c07: 0x6d3e8020, - 0x39c08: 0x6d3e8220, 0x39c09: 0x6d3e8420, 0x39c0a: 0x6d3e8620, 0x39c0b: 0x6d3e8820, - 0x39c0c: 0x6d3e8a20, 0x39c0d: 0x6d3e8c20, 0x39c0e: 0x6d3e8e20, 0x39c0f: 0x6d3e9020, - 0x39c10: 0x6d3e9220, 0x39c11: 0x6d3e9420, 0x39c12: 0x6d3e9620, 0x39c13: 0x6d3e9820, - 0x39c14: 0x6d3e9a20, 0x39c15: 0x6d3e9c20, 0x39c16: 0x6d3e9e20, 0x39c17: 0x6d3ea020, - 0x39c18: 0x6d3ea220, 0x39c19: 0x6d3ea420, 0x39c1a: 0x6d3ea620, 0x39c1b: 0x6d3ea820, - 0x39c1c: 0x6d3eaa20, 0x39c1d: 0x6d3eac20, 0x39c1e: 0x6d3eae20, 0x39c1f: 0x6d3eb020, - 0x39c20: 0x6d3eb220, 0x39c21: 0x6d3eb420, 0x39c22: 0x6d3eb620, 0x39c23: 0x6d3eb820, - 0x39c24: 0x6d3eba20, 0x39c25: 0x6d3ebc20, 0x39c26: 0x6d3ebe20, 0x39c27: 0x6d3ec020, - 0x39c28: 0x6d3ec220, 0x39c29: 0x6d3ec420, 0x39c2a: 0x6d3ec620, 0x39c2b: 0x6d3ec820, - 0x39c2c: 0x6d3eca20, 0x39c2d: 0x6d3ecc20, 0x39c2e: 0x6d3ece20, 0x39c2f: 0x6d3ed020, - 0x39c30: 0x6d3ed220, 0x39c31: 0x6d3ed420, 0x39c32: 0x6d3ed620, 0x39c33: 0x6d3ed820, - 0x39c34: 0x6d3eda20, 0x39c35: 0x6d6b3c20, 0x39c36: 0x6d6b3e20, 0x39c37: 0x6d6b4020, - 0x39c38: 0x6d6b4220, 0x39c39: 0x6d6b4420, 0x39c3a: 0x6d6b4620, 0x39c3b: 0x6d6b4820, - 0x39c3c: 0x6d6b4a20, 0x39c3d: 0x6d6b4c20, 0x39c3e: 0x6d6b4e20, 0x39c3f: 0x6d6b5020, - // Block 0xe71, offset 0x39c40 - 0x39c40: 0x6d6b5220, 0x39c41: 0x6d6b5420, 0x39c42: 0x6d6b5620, 0x39c43: 0x6d6b5820, - 0x39c44: 0x6d6b5a20, 0x39c45: 0x6d6b5c20, 0x39c46: 0x6d6b5e20, 0x39c47: 0x6d6b6020, - 0x39c48: 0x6d6b6220, 0x39c49: 0x6d6b6420, 0x39c4a: 0x6d6b6620, 0x39c4b: 0x6d6b6820, - 0x39c4c: 0x6d6b6a20, 0x39c4d: 0x6d6b6c20, 0x39c4e: 0x6d6b6e20, 0x39c4f: 0x6d6b7020, - 0x39c50: 0x6d6b7220, 0x39c51: 0x6d6b7420, 0x39c52: 0x6d6b7620, 0x39c53: 0x6d6b7820, - 0x39c54: 0x6d6b7a20, 0x39c55: 0x6d6b7c20, 0x39c56: 0x6d6b7e20, 0x39c57: 0x6d6b8020, - 0x39c58: 0x6d6b8220, 0x39c59: 0x6d6b8420, 0x39c5a: 0x6d6b8620, 0x39c5b: 0x6d6b8820, - 0x39c5c: 0x6d6b8a20, 0x39c5d: 0x6d946e20, 0x39c5e: 0x6d947020, 0x39c5f: 0x6d6b8c20, - 0x39c60: 0x6d947220, 0x39c61: 0x6d947420, 0x39c62: 0x6d947620, 0x39c63: 0x6d947820, - 0x39c64: 0x6d947a20, 0x39c65: 0x6d947c20, 0x39c66: 0x6d947e20, 0x39c67: 0x6d948020, - 0x39c68: 0x6d948220, 0x39c69: 0x6d948420, 0x39c6a: 0x6d948620, 0x39c6b: 0x6d948820, - 0x39c6c: 0x6d948a20, 0x39c6d: 0x6d948c20, 0x39c6e: 0x6d948e20, 0x39c6f: 0x6d949020, - 0x39c70: 0x6d949220, 0x39c71: 0x6d949420, 0x39c72: 0x6d949620, 0x39c73: 0x6d949820, - 0x39c74: 0x6d949a20, 0x39c75: 0x6d949c20, 0x39c76: 0x6d949e20, 0x39c77: 0x6d94a020, - 0x39c78: 0x6d94a220, 0x39c79: 0x6d94a420, 0x39c7a: 0x6d94a620, 0x39c7b: 0x6d94a820, - 0x39c7c: 0x6d94aa20, 0x39c7d: 0x6d94ac20, 0x39c7e: 0x6d94ae20, 0x39c7f: 0x6d94b020, - // Block 0xe72, offset 0x39c80 - 0x39c80: 0x6d94b220, 0x39c81: 0x6d94b420, 0x39c82: 0x6d94b620, 0x39c83: 0x6d94b820, - 0x39c84: 0x6d94ba20, 0x39c85: 0x6d94bc20, 0x39c86: 0x6d94be20, 0x39c87: 0x6d94c020, - 0x39c88: 0x6d94c220, 0x39c89: 0x6d94c420, 0x39c8a: 0x6d94c620, 0x39c8b: 0x6d94c820, - 0x39c8c: 0x6d94ca20, 0x39c8d: 0x6d94cc20, 0x39c8e: 0x6d94ce20, 0x39c8f: 0x6d94d020, - 0x39c90: 0x6d94d220, 0x39c91: 0x6d94d420, 0x39c92: 0x6d94d620, 0x39c93: 0x6db7ae20, - 0x39c94: 0x6db7b020, 0x39c95: 0x6db7b220, 0x39c96: 0x6db7b420, 0x39c97: 0x6db7b620, - 0x39c98: 0x6db7b820, 0x39c99: 0x6db7ba20, 0x39c9a: 0x6db7bc20, 0x39c9b: 0x6db7be20, - 0x39c9c: 0x6db7c020, 0x39c9d: 0x6db7c220, 0x39c9e: 0x6db7c420, 0x39c9f: 0x6db7c620, - 0x39ca0: 0x6db7c820, 0x39ca1: 0x6db7ca20, 0x39ca2: 0x6db7cc20, 0x39ca3: 0x6db7ce20, - 0x39ca4: 0x6db7d020, 0x39ca5: 0x6db7d220, 0x39ca6: 0x6db7d420, 0x39ca7: 0x6db7d620, - 0x39ca8: 0x6db7d820, 0x39ca9: 0x6db7da20, 0x39caa: 0x6db7dc20, 0x39cab: 0x6db7de20, - 0x39cac: 0x6db7e020, 0x39cad: 0x6db7e220, 0x39cae: 0x6db7e420, 0x39caf: 0x6db7e620, - 0x39cb0: 0x6db7e820, 0x39cb1: 0x6db7ea20, 0x39cb2: 0x6db7ec20, 0x39cb3: 0x6db7ee20, - 0x39cb4: 0x6db7f020, 0x39cb5: 0x6db7f220, 0x39cb6: 0x6db7f420, 0x39cb7: 0x6db7f620, - 0x39cb8: 0x6db7f820, 0x39cb9: 0x6db7fa20, 0x39cba: 0x6db7fc20, 0x39cbb: 0x6db7fe20, - 0x39cbc: 0x6db80020, 0x39cbd: 0x6db80220, 0x39cbe: 0x6db80420, 0x39cbf: 0x6db80620, - // Block 0xe73, offset 0x39cc0 - 0x39cc0: 0x6db80820, 0x39cc1: 0x6db80a20, 0x39cc2: 0x6db80c20, 0x39cc3: 0x6dd61420, - 0x39cc4: 0x6db80e20, 0x39cc5: 0x6dd61620, 0x39cc6: 0x6dd61820, 0x39cc7: 0x6dd61a20, - 0x39cc8: 0x6dd61c20, 0x39cc9: 0x6dd61e20, 0x39cca: 0x6dd62020, 0x39ccb: 0x6dd62220, - 0x39ccc: 0x6dd62420, 0x39ccd: 0x6dd62620, 0x39cce: 0x6dd62820, 0x39ccf: 0x6dd62a20, - 0x39cd0: 0x6dd62c20, 0x39cd1: 0x6dd62e20, 0x39cd2: 0x6dd63020, 0x39cd3: 0x6dd63220, - 0x39cd4: 0x6dd63420, 0x39cd5: 0x6dd63620, 0x39cd6: 0x6dd63820, 0x39cd7: 0x6dd63a20, - 0x39cd8: 0x6dd63c20, 0x39cd9: 0x6dd63e20, 0x39cda: 0x6dd64020, 0x39cdb: 0x6dd64220, - 0x39cdc: 0x6dd64420, 0x39cdd: 0x6dd64620, 0x39cde: 0x6dd64820, 0x39cdf: 0x6dd64a20, - 0x39ce0: 0x6dd64c20, 0x39ce1: 0x6dd64e20, 0x39ce2: 0x6dd65020, 0x39ce3: 0x6dd65220, - 0x39ce4: 0x6dd65420, 0x39ce5: 0x6dd65620, 0x39ce6: 0x6dd65820, 0x39ce7: 0x6dd65a20, - 0x39ce8: 0x6dd65c20, 0x39ce9: 0x6dd65e20, 0x39cea: 0x6dd66020, 0x39ceb: 0x6dd66220, - 0x39cec: 0x6dd66420, 0x39ced: 0x6dd66620, 0x39cee: 0x6dd66820, 0x39cef: 0x6dd66a20, - 0x39cf0: 0x6dd66c20, 0x39cf1: 0x6dd66e20, 0x39cf2: 0x6dd67020, 0x39cf3: 0x6dd67220, - 0x39cf4: 0x6dd67420, 0x39cf5: 0x6dd67620, 0x39cf6: 0x6dd67820, 0x39cf7: 0x6dd67a20, - 0x39cf8: 0x6dd67c20, 0x39cf9: 0x6dd67e20, 0x39cfa: 0x6dd68020, 0x39cfb: 0x6dd68220, - 0x39cfc: 0x6dd68420, 0x39cfd: 0x6dd68620, 0x39cfe: 0x6dd68820, 0x39cff: 0x6dd68a20, - // Block 0xe74, offset 0x39d00 - 0x39d00: 0x6dd68c20, 0x39d01: 0x6dd68e20, 0x39d02: 0x6dd69020, 0x39d03: 0x6dd69220, - 0x39d04: 0x6dd69420, 0x39d05: 0x6dd69620, 0x39d06: 0x6dd69820, 0x39d07: 0x6dd69a20, - 0x39d08: 0x6dd69c20, 0x39d09: 0x6dd69e20, 0x39d0a: 0x6deef420, 0x39d0b: 0x6deef620, - 0x39d0c: 0x6deef820, 0x39d0d: 0x6deefa20, 0x39d0e: 0x6deefc20, 0x39d0f: 0x6deefe20, - 0x39d10: 0x6def0020, 0x39d11: 0x6def0220, 0x39d12: 0x6def0420, 0x39d13: 0x6def0620, - 0x39d14: 0x6def0820, 0x39d15: 0x6def0a20, 0x39d16: 0x6def0c20, 0x39d17: 0x6def0e20, - 0x39d18: 0x6def1020, 0x39d19: 0x6def1220, 0x39d1a: 0x6dd6a020, 0x39d1b: 0x6def1420, - 0x39d1c: 0x6def1620, 0x39d1d: 0x6def1820, 0x39d1e: 0x6def1a20, 0x39d1f: 0x6def1c20, - 0x39d20: 0x6def1e20, 0x39d21: 0x6def2020, 0x39d22: 0x6def2220, 0x39d23: 0x6def2420, - 0x39d24: 0x6def2620, 0x39d25: 0x6def2820, 0x39d26: 0x6def2a20, 0x39d27: 0x6def2c20, - 0x39d28: 0x6def2e20, 0x39d29: 0x6def3020, 0x39d2a: 0x6def3220, 0x39d2b: 0x6def3420, - 0x39d2c: 0x6def3620, 0x39d2d: 0x6def3820, 0x39d2e: 0x6def3a20, 0x39d2f: 0x6def3c20, - 0x39d30: 0x6def3e20, 0x39d31: 0x6def4020, 0x39d32: 0x6def4220, 0x39d33: 0x6def4420, - 0x39d34: 0x6def4620, 0x39d35: 0x6def4820, 0x39d36: 0x6def4a20, 0x39d37: 0x6def4c20, - 0x39d38: 0x6def4e20, 0x39d39: 0x6def5020, 0x39d3a: 0x6def5220, 0x39d3b: 0x6def5420, - 0x39d3c: 0x6def5620, 0x39d3d: 0x6def5820, 0x39d3e: 0x6def5a20, 0x39d3f: 0x6def5c20, - // Block 0xe75, offset 0x39d40 - 0x39d40: 0x6def5e20, 0x39d41: 0x6e034020, 0x39d42: 0x6e034220, 0x39d43: 0x6e034420, - 0x39d44: 0x6e034620, 0x39d45: 0x6e034820, 0x39d46: 0x6e034a20, 0x39d47: 0x6e034c20, - 0x39d48: 0x6e034e20, 0x39d49: 0x6e035020, 0x39d4a: 0x6e035220, 0x39d4b: 0x6e035420, - 0x39d4c: 0x6e035620, 0x39d4d: 0x6e035820, 0x39d4e: 0x6e035a20, 0x39d4f: 0x6e035c20, - 0x39d50: 0x6e035e20, 0x39d51: 0x6e036020, 0x39d52: 0x6e036220, 0x39d53: 0x6e036420, - 0x39d54: 0x6e036620, 0x39d55: 0x6e036820, 0x39d56: 0x6e036a20, 0x39d57: 0x6e036c20, - 0x39d58: 0x6e036e20, 0x39d59: 0x6e037020, 0x39d5a: 0x6e037220, 0x39d5b: 0x6e037420, - 0x39d5c: 0x6e037620, 0x39d5d: 0x6e037820, 0x39d5e: 0x6e037a20, 0x39d5f: 0x6e037c20, - 0x39d60: 0x6e037e20, 0x39d61: 0x6e038020, 0x39d62: 0x6e038220, 0x39d63: 0x6e038420, - 0x39d64: 0x6e038620, 0x39d65: 0x6e038820, 0x39d66: 0x6e038a20, 0x39d67: 0x6e038c20, - 0x39d68: 0x6e038e20, 0x39d69: 0x6e039020, 0x39d6a: 0x6e14d420, 0x39d6b: 0x6e14d620, - 0x39d6c: 0x6e14d820, 0x39d6d: 0x6e14da20, 0x39d6e: 0x6e14dc20, 0x39d6f: 0x6e14de20, - 0x39d70: 0x6e14e020, 0x39d71: 0x6e14e220, 0x39d72: 0x6e14e420, 0x39d73: 0x6e14e620, - 0x39d74: 0x6e14e820, 0x39d75: 0x6e14ea20, 0x39d76: 0x6e14ec20, 0x39d77: 0x6e14ee20, - 0x39d78: 0x6e14f020, 0x39d79: 0x6e14f220, 0x39d7a: 0x6e14f420, 0x39d7b: 0x6e14f620, - 0x39d7c: 0x6e14f820, 0x39d7d: 0x6e14fa20, 0x39d7e: 0x6e14fc20, 0x39d7f: 0x6e14fe20, - // Block 0xe76, offset 0x39d80 - 0x39d80: 0x6e150020, 0x39d81: 0x6e228020, 0x39d82: 0x6e228220, 0x39d83: 0x6e228420, - 0x39d84: 0x6e228620, 0x39d85: 0x6e228820, 0x39d86: 0x6e228a20, 0x39d87: 0x6e228c20, - 0x39d88: 0x6e228e20, 0x39d89: 0x6e229020, 0x39d8a: 0x6e229220, 0x39d8b: 0x6e229420, - 0x39d8c: 0x6e229620, 0x39d8d: 0x6e229820, 0x39d8e: 0x6e229a20, 0x39d8f: 0x6e229c20, - 0x39d90: 0x6e229e20, 0x39d91: 0x6e22a020, 0x39d92: 0x6e22a220, 0x39d93: 0x6e22a420, - 0x39d94: 0x6e22a620, 0x39d95: 0x6e22a820, 0x39d96: 0x6e2cca20, 0x39d97: 0x6e2ccc20, - 0x39d98: 0x6e2cce20, 0x39d99: 0x6e2cd020, 0x39d9a: 0x6e2cd220, 0x39d9b: 0x6e2cd420, - 0x39d9c: 0x6e2cd620, 0x39d9d: 0x6e2cd820, 0x39d9e: 0x6e2cda20, 0x39d9f: 0x6e2cdc20, - 0x39da0: 0x6e2cde20, 0x39da1: 0x6e2ce020, 0x39da2: 0x6e2ce220, 0x39da3: 0x6e2ce420, - 0x39da4: 0x6e34ca20, 0x39da5: 0x6e34cc20, 0x39da6: 0x6e34ce20, 0x39da7: 0x6e34d020, - 0x39da8: 0x6e34d220, 0x39da9: 0x6e34d420, 0x39daa: 0x6e34d620, 0x39dab: 0x6e34d820, - 0x39dac: 0x6e34da20, 0x39dad: 0x6e34dc20, 0x39dae: 0x6e3a8620, 0x39daf: 0x6e3a8820, - 0x39db0: 0x6e3a8a20, 0x39db1: 0x6e3a8c20, 0x39db2: 0x6e3a8e20, 0x39db3: 0x6e3a9020, - 0x39db4: 0x6e3a9220, 0x39db5: 0x6e3a9420, 0x39db6: 0x6e3a9620, 0x39db7: 0x6e3a9820, - 0x39db8: 0x6e3a9a20, 0x39db9: 0x6e3a9c20, 0x39dba: 0x6e3a9e20, 0x39dbb: 0x6e3e5020, - 0x39dbc: 0x6e3e5220, 0x39dbd: 0x6e3e5420, 0x39dbe: 0x6e3e5620, 0x39dbf: 0x6e3e5820, - // Block 0xe77, offset 0x39dc0 - 0x39dc0: 0x6e3e5a20, 0x39dc1: 0x6e412620, 0x39dc2: 0x6e412820, 0x39dc3: 0x6e412a20, - 0x39dc4: 0x6e432620, 0x39dc5: 0x6e432820, 0x39dc6: 0x6e432a20, 0x39dc7: 0x6e432c20, - 0x39dc8: 0x6e448820, 0x39dc9: 0x6e448a20, 0x39dca: 0x6e448c20, 0x39dcb: 0x6e455e20, - 0x39dcc: 0x6e456020, 0x39dcd: 0x6e45dc20, 0x39dce: 0x6e470a20, 0x39dcf: 0x6c270820, - 0x39dd0: 0x6c270a20, 0x39dd1: 0x6c270c20, 0x39dd2: 0x6c612a20, 0x39dd3: 0x6c878220, - 0x39dd4: 0x6c878420, 0x39dd5: 0x6c878620, 0x39dd6: 0x6c878820, 0x39dd7: 0x6c878a20, - 0x39dd8: 0x6cb2b020, 0x39dd9: 0x6cb2b220, 0x39dda: 0x6cb2b420, 0x39ddb: 0x6cb2b620, - 0x39ddc: 0x6cb2b820, 0x39ddd: 0x6cb2ba20, 0x39dde: 0x6cb2bc20, 0x39ddf: 0x6cb2be20, - 0x39de0: 0x6cb2c020, 0x39de1: 0x6cb2c220, 0x39de2: 0x6cb2c420, 0x39de3: 0x6cb2c620, - 0x39de4: 0x6cb2c820, 0x39de5: 0x6cb2ca20, 0x39de6: 0x6cb2cc20, 0x39de7: 0x6cb2ce20, - 0x39de8: 0x6cb2d020, 0x39de9: 0x6ce24620, 0x39dea: 0x6ce24820, 0x39deb: 0x6ce24a20, - 0x39dec: 0x6ce24c20, 0x39ded: 0x6ce24e20, 0x39dee: 0x6ce25020, 0x39def: 0x6ce25220, - 0x39df0: 0x6ce25420, 0x39df1: 0x6ce25620, 0x39df2: 0x6ce25820, 0x39df3: 0x6ce25a20, - 0x39df4: 0x6ce25c20, 0x39df5: 0x6ce25e20, 0x39df6: 0x6ce26020, 0x39df7: 0x6ce26220, - 0x39df8: 0x6d10bc20, 0x39df9: 0x6d10be20, 0x39dfa: 0x6d10c020, 0x39dfb: 0x6d10c220, - 0x39dfc: 0x6d10c420, 0x39dfd: 0x6d10c620, 0x39dfe: 0x6d10c820, 0x39dff: 0x6d10ca20, - // Block 0xe78, offset 0x39e00 - 0x39e00: 0x6d10cc20, 0x39e01: 0x6d10ce20, 0x39e02: 0x6d10d020, 0x39e03: 0x6d10d220, - 0x39e04: 0x6d10d420, 0x39e05: 0x6d10d620, 0x39e06: 0x6d10d820, 0x39e07: 0x6d10da20, - 0x39e08: 0x6d3ee820, 0x39e09: 0x6d3eea20, 0x39e0a: 0x6d3eec20, 0x39e0b: 0x6d3eee20, - 0x39e0c: 0x6d3ef020, 0x39e0d: 0x6d3ef220, 0x39e0e: 0x6d3ef420, 0x39e0f: 0x6d3ef620, - 0x39e10: 0x6d3ef820, 0x39e11: 0x6d3efa20, 0x39e12: 0x6d3efc20, 0x39e13: 0x6d3efe20, - 0x39e14: 0x6d6bac20, 0x39e15: 0x6d6bae20, 0x39e16: 0x6d6bb020, 0x39e17: 0x6d6bb220, - 0x39e18: 0x6d6bb420, 0x39e19: 0x6d6bb620, 0x39e1a: 0x6d6bb820, 0x39e1b: 0x6d6bba20, - 0x39e1c: 0x6d6bbc20, 0x39e1d: 0x6d6bbe20, 0x39e1e: 0x6d6bc020, 0x39e1f: 0x6d6bc220, - 0x39e20: 0x6d6bc420, 0x39e21: 0x6d6bc620, 0x39e22: 0x6d94e820, 0x39e23: 0x6d94ea20, - 0x39e24: 0x6d94ec20, 0x39e25: 0x6d94ee20, 0x39e26: 0x6db81a20, 0x39e27: 0x6d94f020, - 0x39e28: 0x6d94f220, 0x39e29: 0x6d94f420, 0x39e2a: 0x6d94f620, 0x39e2b: 0x6d94f820, - 0x39e2c: 0x6d94fa20, 0x39e2d: 0x6d94fc20, 0x39e2e: 0x6db81c20, 0x39e2f: 0x6db81e20, - 0x39e30: 0x6db82020, 0x39e31: 0x6db82220, 0x39e32: 0x6db82420, 0x39e33: 0x6db82620, - 0x39e34: 0x6db82820, 0x39e35: 0x6db82a20, 0x39e36: 0x6db82c20, 0x39e37: 0x6db82e20, - 0x39e38: 0x6db83020, 0x39e39: 0x6dd6b220, 0x39e3a: 0x6dd6b420, 0x39e3b: 0x6dd6b620, - 0x39e3c: 0x6dd6b820, 0x39e3d: 0x6dd6ba20, 0x39e3e: 0x6dd6bc20, 0x39e3f: 0x6def7420, - // Block 0xe79, offset 0x39e40 - 0x39e40: 0x6def7620, 0x39e41: 0x6def7820, 0x39e42: 0x6def7a20, 0x39e43: 0x6def7c20, - 0x39e44: 0x6def7e20, 0x39e45: 0x6def8020, 0x39e46: 0x6def8220, 0x39e47: 0x6def8420, - 0x39e48: 0x6def8620, 0x39e49: 0x6def8820, 0x39e4a: 0x6def8a20, 0x39e4b: 0x6def8c20, - 0x39e4c: 0x6def8e20, 0x39e4d: 0x6e039e20, 0x39e4e: 0x6e03a020, 0x39e4f: 0x6e03a220, - 0x39e50: 0x6e03a420, 0x39e51: 0x6e03a620, 0x39e52: 0x6e03a820, 0x39e53: 0x6e150820, - 0x39e54: 0x6e150a20, 0x39e55: 0x6e150c20, 0x39e56: 0x6e150e20, 0x39e57: 0x6e151020, - 0x39e58: 0x6e22ae20, 0x39e59: 0x6e22b020, 0x39e5a: 0x6e22b220, 0x39e5b: 0x6e2cea20, - 0x39e5c: 0x6e2cec20, 0x39e5d: 0x6e3aa020, 0x39e5e: 0x6e3aa220, 0x39e5f: 0x6e3e5c20, - 0x39e60: 0x6c613620, 0x39e61: 0x6c613820, 0x39e62: 0x6c613a20, 0x39e63: 0x6c613c20, - 0x39e64: 0x6c613e20, 0x39e65: 0x6c614020, 0x39e66: 0x6c614220, 0x39e67: 0x6c879e20, - 0x39e68: 0x6c87a020, 0x39e69: 0x6c87a220, 0x39e6a: 0x6c87a420, 0x39e6b: 0x6c87a620, - 0x39e6c: 0x6c87a820, 0x39e6d: 0x6c87aa20, 0x39e6e: 0x6c87ac20, 0x39e6f: 0x6c87ae20, - 0x39e70: 0x6c87b020, 0x39e71: 0x6c87b220, 0x39e72: 0x6c87b420, 0x39e73: 0x6cb30020, - 0x39e74: 0x6cb30220, 0x39e75: 0x6cb30420, 0x39e76: 0x6cb30620, 0x39e77: 0x6cb30820, - 0x39e78: 0x6cb30a20, 0x39e79: 0x6cb30c20, 0x39e7a: 0x6cb30e20, 0x39e7b: 0x6cb31020, - 0x39e7c: 0x6cb31220, 0x39e7d: 0x6cb31420, 0x39e7e: 0x6cb31620, 0x39e7f: 0x6cb31820, - // Block 0xe7a, offset 0x39e80 - 0x39e80: 0x6cb31a20, 0x39e81: 0x6cb31c20, 0x39e82: 0x6cb31e20, 0x39e83: 0x6cb32020, - 0x39e84: 0x6cb32220, 0x39e85: 0x6cb32420, 0x39e86: 0x6cb32620, 0x39e87: 0x6cb32820, - 0x39e88: 0x6cb32a20, 0x39e89: 0x6cb32c20, 0x39e8a: 0x6cb32e20, 0x39e8b: 0x6cb33020, - 0x39e8c: 0x6cb33220, 0x39e8d: 0x6cb33420, 0x39e8e: 0x6ce2a020, 0x39e8f: 0x6ce2a220, - 0x39e90: 0x6ce2a420, 0x39e91: 0x6ce2a620, 0x39e92: 0x6ce2a820, 0x39e93: 0x6ce2aa20, - 0x39e94: 0x6ce2ac20, 0x39e95: 0x6ce2ae20, 0x39e96: 0x6ce2b020, 0x39e97: 0x6ce2b220, - 0x39e98: 0x6ce2b420, 0x39e99: 0x6ce2b620, 0x39e9a: 0x6ce2b820, 0x39e9b: 0x6ce2ba20, - 0x39e9c: 0x6ce2bc20, 0x39e9d: 0x6ce2be20, 0x39e9e: 0x6ce2c020, 0x39e9f: 0x6ce2c220, - 0x39ea0: 0x6ce2c420, 0x39ea1: 0x6ce2c620, 0x39ea2: 0x6ce2c820, 0x39ea3: 0x6ce2ca20, - 0x39ea4: 0x6ce2cc20, 0x39ea5: 0x6ce2ce20, 0x39ea6: 0x6ce2d020, 0x39ea7: 0x6ce2d220, - 0x39ea8: 0x6d110a20, 0x39ea9: 0x6d110c20, 0x39eaa: 0x6d110e20, 0x39eab: 0x6d111020, - 0x39eac: 0x6d111220, 0x39ead: 0x6d111420, 0x39eae: 0x6d111620, 0x39eaf: 0x6d111820, - 0x39eb0: 0x6d111a20, 0x39eb1: 0x6d111c20, 0x39eb2: 0x6d111e20, 0x39eb3: 0x6d112020, - 0x39eb4: 0x6d112220, 0x39eb5: 0x6d112420, 0x39eb6: 0x6d112620, 0x39eb7: 0x6d112820, - 0x39eb8: 0x6d112a20, 0x39eb9: 0x6d112c20, 0x39eba: 0x6d112e20, 0x39ebb: 0x6d113020, - 0x39ebc: 0x6d113220, 0x39ebd: 0x6d113420, 0x39ebe: 0x6d113620, 0x39ebf: 0x6d113820, - // Block 0xe7b, offset 0x39ec0 - 0x39ec0: 0x6d113a20, 0x39ec1: 0x6d113c20, 0x39ec2: 0x6d3f1c20, 0x39ec3: 0x6d3f1e20, - 0x39ec4: 0x6d3f2020, 0x39ec5: 0x6d3f2220, 0x39ec6: 0x6d3f2420, 0x39ec7: 0x6d3f2620, - 0x39ec8: 0x6d3f2820, 0x39ec9: 0x6d3f2a20, 0x39eca: 0x6d3f2c20, 0x39ecb: 0x6d3f2e20, - 0x39ecc: 0x6d3f3020, 0x39ecd: 0x6d3f3220, 0x39ece: 0x6d3f3420, 0x39ecf: 0x6d3f3620, - 0x39ed0: 0x6d3f3820, 0x39ed1: 0x6d3f3a20, 0x39ed2: 0x6d3f3c20, 0x39ed3: 0x6d3f3e20, - 0x39ed4: 0x6d3f4020, 0x39ed5: 0x6d3f4220, 0x39ed6: 0x6d3f4420, 0x39ed7: 0x6d3f4620, - 0x39ed8: 0x6d3f4820, 0x39ed9: 0x6d3f4a20, 0x39eda: 0x6d3f4c20, 0x39edb: 0x6d3f4e20, - 0x39edc: 0x6d3f5020, 0x39edd: 0x6d3f5220, 0x39ede: 0x6d3f5420, 0x39edf: 0x6d3f5620, - 0x39ee0: 0x6d6bfe20, 0x39ee1: 0x6d6c0020, 0x39ee2: 0x6d6c0220, 0x39ee3: 0x6d6c0420, - 0x39ee4: 0x6d6c0620, 0x39ee5: 0x6d6c0820, 0x39ee6: 0x6d6c0a20, 0x39ee7: 0x6d6c0c20, - 0x39ee8: 0x6d6c0e20, 0x39ee9: 0x6d6c1020, 0x39eea: 0x6d6c1220, 0x39eeb: 0x6d6c1420, - 0x39eec: 0x6d6c1620, 0x39eed: 0x6d6c1820, 0x39eee: 0x6d6c1a20, 0x39eef: 0x6d6c1c20, - 0x39ef0: 0x6d6c1e20, 0x39ef1: 0x6d6c2020, 0x39ef2: 0x6d6c2220, 0x39ef3: 0x6d6c2420, - 0x39ef4: 0x6d6c2620, 0x39ef5: 0x6d6c2820, 0x39ef6: 0x6d6c2a20, 0x39ef7: 0x6d6c2c20, - 0x39ef8: 0x6d6c2e20, 0x39ef9: 0x6d6c3020, 0x39efa: 0x6d6c3220, 0x39efb: 0x6d6c3420, - 0x39efc: 0x6d6c3620, 0x39efd: 0x6d6c3820, 0x39efe: 0x6d6c3a20, 0x39eff: 0x6d6c3c20, - // Block 0xe7c, offset 0x39f00 - 0x39f00: 0x6d6c3e20, 0x39f01: 0x6d6c4020, 0x39f02: 0x6d6c4220, 0x39f03: 0x6d6c4420, - 0x39f04: 0x6d6c4620, 0x39f05: 0x6d6c4820, 0x39f06: 0x6d6c4a20, 0x39f07: 0x6d952820, - 0x39f08: 0x6d952a20, 0x39f09: 0x6d952c20, 0x39f0a: 0x6d952e20, 0x39f0b: 0x6d953020, - 0x39f0c: 0x6d953220, 0x39f0d: 0x6d953420, 0x39f0e: 0x6d953620, 0x39f0f: 0x6d953820, - 0x39f10: 0x6d953a20, 0x39f11: 0x6d953c20, 0x39f12: 0x6d953e20, 0x39f13: 0x6d954020, - 0x39f14: 0x6d954220, 0x39f15: 0x6d954420, 0x39f16: 0x6d954620, 0x39f17: 0x6d954820, - 0x39f18: 0x6d954a20, 0x39f19: 0x6d954c20, 0x39f1a: 0x6d954e20, 0x39f1b: 0x6d955020, - 0x39f1c: 0x6d955220, 0x39f1d: 0x6d955420, 0x39f1e: 0x6d955620, 0x39f1f: 0x6d955820, - 0x39f20: 0x6d955a20, 0x39f21: 0x6d955c20, 0x39f22: 0x6d955e20, 0x39f23: 0x6d956020, - 0x39f24: 0x6d956220, 0x39f25: 0x6d956420, 0x39f26: 0x6d956620, 0x39f27: 0x6d956820, - 0x39f28: 0x6d956a20, 0x39f29: 0x6db85420, 0x39f2a: 0x6db85620, 0x39f2b: 0x6db85820, - 0x39f2c: 0x6db85a20, 0x39f2d: 0x6db85c20, 0x39f2e: 0x6db85e20, 0x39f2f: 0x6db86020, - 0x39f30: 0x6db86220, 0x39f31: 0x6db86420, 0x39f32: 0x6db86620, 0x39f33: 0x6db86820, - 0x39f34: 0x6db86a20, 0x39f35: 0x6db86c20, 0x39f36: 0x6db86e20, 0x39f37: 0x6db87020, - 0x39f38: 0x6db87220, 0x39f39: 0x6db87420, 0x39f3a: 0x6db87620, 0x39f3b: 0x6db87820, - 0x39f3c: 0x6db87a20, 0x39f3d: 0x6db87c20, 0x39f3e: 0x6db87e20, 0x39f3f: 0x6db88020, - // Block 0xe7d, offset 0x39f40 - 0x39f40: 0x6db88220, 0x39f41: 0x6db88420, 0x39f42: 0x6db88620, 0x39f43: 0x6db88820, - 0x39f44: 0x6db88a20, 0x39f45: 0x6db88c20, 0x39f46: 0x6db88e20, 0x39f47: 0x6db89020, - 0x39f48: 0x6db89220, 0x39f49: 0x6db89420, 0x39f4a: 0x6dd6de20, 0x39f4b: 0x6dd6e020, - 0x39f4c: 0x6dd6e220, 0x39f4d: 0x6dd6e420, 0x39f4e: 0x6dd6e620, 0x39f4f: 0x6dd6e820, - 0x39f50: 0x6dd6ea20, 0x39f51: 0x6dd6ec20, 0x39f52: 0x6dd6ee20, 0x39f53: 0x6dd6f020, - 0x39f54: 0x6dd6f220, 0x39f55: 0x6dd6f420, 0x39f56: 0x6dd6f620, 0x39f57: 0x6dd6f820, - 0x39f58: 0x6dd6fa20, 0x39f59: 0x6dd6fc20, 0x39f5a: 0x6dd6fe20, 0x39f5b: 0x6dd70020, - 0x39f5c: 0x6dd70220, 0x39f5d: 0x6dd70420, 0x39f5e: 0x6dd70620, 0x39f5f: 0x6dd70820, - 0x39f60: 0x6dd70a20, 0x39f61: 0x6dd70c20, 0x39f62: 0x6dd70e20, 0x39f63: 0x6dd71020, - 0x39f64: 0x6defaa20, 0x39f65: 0x6defac20, 0x39f66: 0x6defae20, 0x39f67: 0x6defb020, - 0x39f68: 0x6defb220, 0x39f69: 0x6defb420, 0x39f6a: 0x6defb620, 0x39f6b: 0x6defb820, - 0x39f6c: 0x6defba20, 0x39f6d: 0x6defbc20, 0x39f6e: 0x6defbe20, 0x39f6f: 0x6defc020, - 0x39f70: 0x6defc220, 0x39f71: 0x6defc420, 0x39f72: 0x6e03ba20, 0x39f73: 0x6e03bc20, - 0x39f74: 0x6e03be20, 0x39f75: 0x6e03c020, 0x39f76: 0x6e03c220, 0x39f77: 0x6e03c420, - 0x39f78: 0x6e03c620, 0x39f79: 0x6e03c820, 0x39f7a: 0x6e03ca20, 0x39f7b: 0x6e03cc20, - 0x39f7c: 0x6e03ce20, 0x39f7d: 0x6e03d020, 0x39f7e: 0x6e03d220, 0x39f7f: 0x6e03d420, - // Block 0xe7e, offset 0x39f80 - 0x39f80: 0x6e03d620, 0x39f81: 0x6e03d820, 0x39f82: 0x6e03da20, 0x39f83: 0x6e03dc20, - 0x39f84: 0x6e03de20, 0x39f85: 0x6e03e020, 0x39f86: 0x6e03e220, 0x39f87: 0x6e03e420, - 0x39f88: 0x6e152220, 0x39f89: 0x6e152420, 0x39f8a: 0x6e152620, 0x39f8b: 0x6e152820, - 0x39f8c: 0x6e152a20, 0x39f8d: 0x6e152c20, 0x39f8e: 0x6e152e20, 0x39f8f: 0x6e153020, - 0x39f90: 0x6e153220, 0x39f91: 0x6e22be20, 0x39f92: 0x6e22c020, 0x39f93: 0x6e22c220, - 0x39f94: 0x6e22c420, 0x39f95: 0x6e22c620, 0x39f96: 0x6e22c820, 0x39f97: 0x6e22ca20, - 0x39f98: 0x6e22cc20, 0x39f99: 0x6e22ce20, 0x39f9a: 0x6e22d020, 0x39f9b: 0x6e22d220, - 0x39f9c: 0x6e22d420, 0x39f9d: 0x6e22d620, 0x39f9e: 0x6e2cf220, 0x39f9f: 0x6e2cf420, - 0x39fa0: 0x6e2cf620, 0x39fa1: 0x6e2cf820, 0x39fa2: 0x6e2cfa20, 0x39fa3: 0x6e2cfc20, - 0x39fa4: 0x6e2cfe20, 0x39fa5: 0x6e2d0020, 0x39fa6: 0x6e2d0220, 0x39fa7: 0x6e2d0420, - 0x39fa8: 0x6e2d0620, 0x39fa9: 0x6e34e220, 0x39faa: 0x6e34e420, 0x39fab: 0x6e34e620, - 0x39fac: 0x6e34e820, 0x39fad: 0x6e34ea20, 0x39fae: 0x6e34ec20, 0x39faf: 0x6e34ee20, - 0x39fb0: 0x6e34f020, 0x39fb1: 0x6e34f220, 0x39fb2: 0x6e34f420, 0x39fb3: 0x6e3aa420, - 0x39fb4: 0x6e3aa620, 0x39fb5: 0x6e3e6020, 0x39fb6: 0x6e3e6220, 0x39fb7: 0x6e3e6420, - 0x39fb8: 0x6e3e6620, 0x39fb9: 0x6e413220, 0x39fba: 0x6e432e20, 0x39fbb: 0x6e413420, - 0x39fbc: 0x6e433020, 0x39fbd: 0x6e3e6820, 0x39fbe: 0x6e413620, 0x39fbf: 0x6e433220, - // Block 0xe7f, offset 0x39fc0 - 0x39fc0: 0x6e433420, 0x39fc1: 0x6e448e20, 0x39fc2: 0x6e456220, 0x39fc3: 0x6e45e020, - 0x39fc4: 0x6e471420, 0x39fc5: 0x6c40f020, 0x39fc6: 0x6c40f220, 0x39fc7: 0x6c615c20, - 0x39fc8: 0x6c87ca20, 0x39fc9: 0x6d957420, 0x39fca: 0x6e03ea20, 0x39fcb: 0x6c271e20, - 0x39fcc: 0x6c40f620, 0x39fcd: 0x6c87d220, 0x39fce: 0x6c87d420, 0x39fcf: 0x6cb34220, - 0x39fd0: 0x6cb34420, 0x39fd1: 0x6cb34620, 0x39fd2: 0x6ce2f420, 0x39fd3: 0x6ce2f620, - 0x39fd4: 0x6d115220, 0x39fd5: 0x6d115420, 0x39fd6: 0x6d115620, 0x39fd7: 0x6d115820, - 0x39fd8: 0x6d3f6e20, 0x39fd9: 0x6d3f7020, 0x39fda: 0x6d3f7220, 0x39fdb: 0x6d3f7420, - 0x39fdc: 0x6d6c5820, 0x39fdd: 0x6d6c5a20, 0x39fde: 0x6d6c5c20, 0x39fdf: 0x6d6c5e20, - 0x39fe0: 0x6d958420, 0x39fe1: 0x6d958620, 0x39fe2: 0x6d958820, 0x39fe3: 0x6d958a20, - 0x39fe4: 0x6d958c20, 0x39fe5: 0x6d958e20, 0x39fe6: 0x6d959020, 0x39fe7: 0x6d959220, - 0x39fe8: 0x6db8a020, 0x39fe9: 0x6db8a220, 0x39fea: 0x6db8a420, 0x39feb: 0x6db8a620, - 0x39fec: 0x6db8a820, 0x39fed: 0x6db8aa20, 0x39fee: 0x6db8ac20, 0x39fef: 0x6db8ae20, - 0x39ff0: 0x6dd71820, 0x39ff1: 0x6dd71a20, 0x39ff2: 0x6dd71c20, 0x39ff3: 0x6dc60820, - 0x39ff4: 0x6dcb1a20, 0x39ff5: 0x6defcc20, 0x39ff6: 0x6defce20, 0x39ff7: 0x6defd020, - 0x39ff8: 0x6defd220, 0x39ff9: 0x6defd420, 0x39ffa: 0x6e03f020, 0x39ffb: 0x6e03f220, - 0x39ffc: 0x6e03f420, 0x39ffd: 0x6e153820, 0x39ffe: 0x6e22d820, 0x39fff: 0x6e22da20, - // Block 0xe80, offset 0x3a000 - 0x3a000: 0x6e34f620, 0x3a001: 0x6e449020, 0x3a002: 0x6e456420, 0x3a003: 0x6c272220, - 0x3a004: 0x6c272420, 0x3a005: 0x6d116220, 0x3a006: 0x6d116420, 0x3a007: 0x6d116620, - 0x3a008: 0x6d6c6420, 0x3a009: 0x6d959420, 0x3a00a: 0x6defd820, 0x3a00b: 0x6e153a20, - 0x3a00c: 0x6e22dc20, 0x3a00d: 0x6c0a8220, 0x3a00e: 0x6c0a8420, 0x3a00f: 0x6c0a8620, - 0x3a010: 0x6c0a8820, 0x3a011: 0x6c151620, 0x3a012: 0x6c151820, 0x3a013: 0x6c151a20, - 0x3a014: 0x6c151c20, 0x3a015: 0x6c151e20, 0x3a016: 0x6c152020, 0x3a017: 0x6c152220, - 0x3a018: 0x6c152420, 0x3a019: 0x6c152620, 0x3a01a: 0x6c152820, 0x3a01b: 0x6c152a20, - 0x3a01c: 0x6c152c20, 0x3a01d: 0x6c152e20, 0x3a01e: 0x6c153020, 0x3a01f: 0x6c153220, - 0x3a020: 0x6c153420, 0x3a021: 0x6c153620, 0x3a022: 0x6c274620, 0x3a023: 0x6c274820, - 0x3a024: 0x6c274a20, 0x3a025: 0x6c274c20, 0x3a026: 0x6c274e20, 0x3a027: 0x6c275020, - 0x3a028: 0x6c275220, 0x3a029: 0x6c275420, 0x3a02a: 0x6c275620, 0x3a02b: 0x6c275820, - 0x3a02c: 0x6c275a20, 0x3a02d: 0x6c275c20, 0x3a02e: 0x6c275e20, 0x3a02f: 0x6c276020, - 0x3a030: 0x6c276220, 0x3a031: 0x6c276420, 0x3a032: 0x6c276620, 0x3a033: 0x6c276820, - 0x3a034: 0x6c276a20, 0x3a035: 0x6c276c20, 0x3a036: 0x6c276e20, 0x3a037: 0x6c277020, - 0x3a038: 0x6c277220, 0x3a039: 0x6c277420, 0x3a03a: 0x6c277620, 0x3a03b: 0x6c277820, - 0x3a03c: 0x6c277a20, 0x3a03d: 0x6c277c20, 0x3a03e: 0x6c277e20, 0x3a03f: 0x6c278020, - // Block 0xe81, offset 0x3a040 - 0x3a040: 0x6c278220, 0x3a041: 0x6c278420, 0x3a042: 0x6c413020, 0x3a043: 0x6c413220, - 0x3a044: 0x6c413420, 0x3a045: 0x6c413620, 0x3a046: 0x6c413820, 0x3a047: 0x6c413a20, - 0x3a048: 0x6c413c20, 0x3a049: 0x6c413e20, 0x3a04a: 0x6c414020, 0x3a04b: 0x6c414220, - 0x3a04c: 0x6c414420, 0x3a04d: 0x6c414620, 0x3a04e: 0x6c414820, 0x3a04f: 0x6c414a20, - 0x3a050: 0x6c414c20, 0x3a051: 0x6c414e20, 0x3a052: 0x6c415020, 0x3a053: 0x6c415220, - 0x3a054: 0x6c415420, 0x3a055: 0x6c415620, 0x3a056: 0x6c415820, 0x3a057: 0x6c415a20, - 0x3a058: 0x6c415c20, 0x3a059: 0x6c415e20, 0x3a05a: 0x6c416020, 0x3a05b: 0x6c416220, - 0x3a05c: 0x6c416420, 0x3a05d: 0x6c416620, 0x3a05e: 0x6c416820, 0x3a05f: 0x6c416a20, - 0x3a060: 0x6c416c20, 0x3a061: 0x6c416e20, 0x3a062: 0x6c417020, 0x3a063: 0x6c417220, - 0x3a064: 0x6c417420, 0x3a065: 0x6c619020, 0x3a066: 0x6c619220, 0x3a067: 0x6c619420, - 0x3a068: 0x6c619620, 0x3a069: 0x6c619820, 0x3a06a: 0x6c619a20, 0x3a06b: 0x6c619c20, - 0x3a06c: 0x6c619e20, 0x3a06d: 0x6c61a020, 0x3a06e: 0x6c61a220, 0x3a06f: 0x6c61a420, - 0x3a070: 0x6c61a620, 0x3a071: 0x6c61a820, 0x3a072: 0x6c61aa20, 0x3a073: 0x6c61ac20, - 0x3a074: 0x6c61ae20, 0x3a075: 0x6c61b020, 0x3a076: 0x6c61b220, 0x3a077: 0x6c61b420, - 0x3a078: 0x6c61b620, 0x3a079: 0x6c61b820, 0x3a07a: 0x6c61ba20, 0x3a07b: 0x6c61bc20, - 0x3a07c: 0x6c61be20, 0x3a07d: 0x6c61c020, 0x3a07e: 0x6c61c220, 0x3a07f: 0x6c61c420, - // Block 0xe82, offset 0x3a080 - 0x3a080: 0x6c61c620, 0x3a081: 0x6c61c820, 0x3a082: 0x6c61ca20, 0x3a083: 0x6c61cc20, - 0x3a084: 0x6c61ce20, 0x3a085: 0x6c881420, 0x3a086: 0x6c881620, 0x3a087: 0x6c881820, - 0x3a088: 0x6c881a20, 0x3a089: 0x6c881c20, 0x3a08a: 0x6c881e20, 0x3a08b: 0x6c882020, - 0x3a08c: 0x6c882220, 0x3a08d: 0x6c882420, 0x3a08e: 0x6c882620, 0x3a08f: 0x6c882820, - 0x3a090: 0x6c882a20, 0x3a091: 0x6c882c20, 0x3a092: 0x6c882e20, 0x3a093: 0x6c883020, - 0x3a094: 0x6c883220, 0x3a095: 0x6c883420, 0x3a096: 0x6c883620, 0x3a097: 0x6c883820, - 0x3a098: 0x6c883a20, 0x3a099: 0x6c883c20, 0x3a09a: 0x6c883e20, 0x3a09b: 0x6c884020, - 0x3a09c: 0x6c884220, 0x3a09d: 0x6c884420, 0x3a09e: 0x6c884620, 0x3a09f: 0x6c884820, - 0x3a0a0: 0x6c884a20, 0x3a0a1: 0x6c884c20, 0x3a0a2: 0x6c884e20, 0x3a0a3: 0x6c885020, - 0x3a0a4: 0x6c885220, 0x3a0a5: 0x6c885420, 0x3a0a6: 0x6c885620, 0x3a0a7: 0x6c885820, - 0x3a0a8: 0x6c885a20, 0x3a0a9: 0x6c885c20, 0x3a0aa: 0x6c885e20, 0x3a0ab: 0x6cb38820, - 0x3a0ac: 0x6cb38a20, 0x3a0ad: 0x6cb38c20, 0x3a0ae: 0x6cb38e20, 0x3a0af: 0x6cb39020, - 0x3a0b0: 0x6cb39220, 0x3a0b1: 0x6cb39420, 0x3a0b2: 0x6cb39620, 0x3a0b3: 0x6cb39820, - 0x3a0b4: 0x6cb39a20, 0x3a0b5: 0x6cb39c20, 0x3a0b6: 0x6cb39e20, 0x3a0b7: 0x6cb3a020, - 0x3a0b8: 0x6cb3a220, 0x3a0b9: 0x6cb3a420, 0x3a0ba: 0x6cb3a620, 0x3a0bb: 0x6cb3a820, - 0x3a0bc: 0x6cb3aa20, 0x3a0bd: 0x6cb3ac20, 0x3a0be: 0x6cb3ae20, 0x3a0bf: 0x6cb3b020, - // Block 0xe83, offset 0x3a0c0 - 0x3a0c0: 0x6cb3b220, 0x3a0c1: 0x6cb3b420, 0x3a0c2: 0x6cb3b620, 0x3a0c3: 0x6cb3b820, - 0x3a0c4: 0x6cb3ba20, 0x3a0c5: 0x6cb3bc20, 0x3a0c6: 0x6cb3be20, 0x3a0c7: 0x6cb3c020, - 0x3a0c8: 0x6cb3c220, 0x3a0c9: 0x6cb3c420, 0x3a0ca: 0x6cb3c620, 0x3a0cb: 0x6cb3c820, - 0x3a0cc: 0x6cb3ca20, 0x3a0cd: 0x6cb3cc20, 0x3a0ce: 0x6ce32c20, 0x3a0cf: 0x6cb3ce20, - 0x3a0d0: 0x6cb3d020, 0x3a0d1: 0x6cb3d220, 0x3a0d2: 0x6cb3d420, 0x3a0d3: 0x6cb3d620, - 0x3a0d4: 0x6cb3d820, 0x3a0d5: 0x6cb3da20, 0x3a0d6: 0x6cb3dc20, 0x3a0d7: 0x6cb3de20, - 0x3a0d8: 0x6cb3e020, 0x3a0d9: 0x6cb3e220, 0x3a0da: 0x6cb3e420, 0x3a0db: 0x6cb3e620, - 0x3a0dc: 0x6cb3e820, 0x3a0dd: 0x6ce32e20, 0x3a0de: 0x6ce33020, 0x3a0df: 0x6ce33220, - 0x3a0e0: 0x6cb3ea20, 0x3a0e1: 0x6ce33420, 0x3a0e2: 0x6ce33620, 0x3a0e3: 0x6ce33820, - 0x3a0e4: 0x6ce33a20, 0x3a0e5: 0x6ce33c20, 0x3a0e6: 0x6ce33e20, 0x3a0e7: 0x6ce34020, - 0x3a0e8: 0x6ce34220, 0x3a0e9: 0x6ce34420, 0x3a0ea: 0x6ce34620, 0x3a0eb: 0x6ce34820, - 0x3a0ec: 0x6ce34a20, 0x3a0ed: 0x6ce34c20, 0x3a0ee: 0x6ce34e20, 0x3a0ef: 0x6ce35020, - 0x3a0f0: 0x6ce35220, 0x3a0f1: 0x6ce35420, 0x3a0f2: 0x6ce35620, 0x3a0f3: 0x6ce35820, - 0x3a0f4: 0x6ce35a20, 0x3a0f5: 0x6ce35c20, 0x3a0f6: 0x6ce35e20, 0x3a0f7: 0x6ce36020, - 0x3a0f8: 0x6ce36220, 0x3a0f9: 0x6ce36420, 0x3a0fa: 0x6ce36620, 0x3a0fb: 0x6ce36820, - 0x3a0fc: 0x6ce36a20, 0x3a0fd: 0x6ce36c20, 0x3a0fe: 0x6ce36e20, 0x3a0ff: 0x6ce37020, - // Block 0xe84, offset 0x3a100 - 0x3a100: 0x6ce37220, 0x3a101: 0x6ce37420, 0x3a102: 0x6ce37620, 0x3a103: 0x6ce37820, - 0x3a104: 0x6ce37a20, 0x3a105: 0x6ce37c20, 0x3a106: 0x6ce37e20, 0x3a107: 0x6ce38020, - 0x3a108: 0x6ce38220, 0x3a109: 0x6ce38420, 0x3a10a: 0x6ce38620, 0x3a10b: 0x6ce38820, - 0x3a10c: 0x6ce38a20, 0x3a10d: 0x6ce38c20, 0x3a10e: 0x6ce38e20, 0x3a10f: 0x6ce39020, - 0x3a110: 0x6ce39220, 0x3a111: 0x6ce39420, 0x3a112: 0x6ce39620, 0x3a113: 0x6ce39820, - 0x3a114: 0x6ce39a20, 0x3a115: 0x6ce39c20, 0x3a116: 0x6ce39e20, 0x3a117: 0x6ce3a020, - 0x3a118: 0x6ce3a220, 0x3a119: 0x6ce3a420, 0x3a11a: 0x6ce3a620, 0x3a11b: 0x6ce3a820, - 0x3a11c: 0x6ce3aa20, 0x3a11d: 0x6d11a220, 0x3a11e: 0x6d11a420, 0x3a11f: 0x6d11a620, - 0x3a120: 0x6d11a820, 0x3a121: 0x6d11aa20, 0x3a122: 0x6d11ac20, 0x3a123: 0x6d11ae20, - 0x3a124: 0x6d11b020, 0x3a125: 0x6d11b220, 0x3a126: 0x6d11b420, 0x3a127: 0x6d11b620, - 0x3a128: 0x6d11b820, 0x3a129: 0x6d11ba20, 0x3a12a: 0x6d11bc20, 0x3a12b: 0x6d11be20, - 0x3a12c: 0x6d11c020, 0x3a12d: 0x6d11c220, 0x3a12e: 0x6d11c420, 0x3a12f: 0x6d11c620, - 0x3a130: 0x6d11c820, 0x3a131: 0x6d11ca20, 0x3a132: 0x6d11cc20, 0x3a133: 0x6d11ce20, - 0x3a134: 0x6d11d020, 0x3a135: 0x6d11d220, 0x3a136: 0x6d11d420, 0x3a137: 0x6d11d620, - 0x3a138: 0x6d11d820, 0x3a139: 0x6d11da20, 0x3a13a: 0x6d11dc20, 0x3a13b: 0x6d11de20, - 0x3a13c: 0x6d11e020, 0x3a13d: 0x6d11e220, 0x3a13e: 0x6d11e420, 0x3a13f: 0x6d11e620, - // Block 0xe85, offset 0x3a140 - 0x3a140: 0x6d11e820, 0x3a141: 0x6d11ea20, 0x3a142: 0x6d11ec20, 0x3a143: 0x6d11ee20, - 0x3a144: 0x6d11f020, 0x3a145: 0x6d11f220, 0x3a146: 0x6d3f9c20, 0x3a147: 0x6d3f9e20, - 0x3a148: 0x6d3fa020, 0x3a149: 0x6d3fa220, 0x3a14a: 0x6d3fa420, 0x3a14b: 0x6d3fa620, - 0x3a14c: 0x6d3fa820, 0x3a14d: 0x6d3faa20, 0x3a14e: 0x6d3fac20, 0x3a14f: 0x6d3fae20, - 0x3a150: 0x6d3fb020, 0x3a151: 0x6d3fb220, 0x3a152: 0x6d3fb420, 0x3a153: 0x6d3fb620, - 0x3a154: 0x6d3fb820, 0x3a155: 0x6d3fba20, 0x3a156: 0x6d3fbc20, 0x3a157: 0x6d3fbe20, - 0x3a158: 0x6d3fc020, 0x3a159: 0x6d3fc220, 0x3a15a: 0x6d3fc420, 0x3a15b: 0x6d3fc620, - 0x3a15c: 0x6d3fc820, 0x3a15d: 0x6d3fca20, 0x3a15e: 0x6d3fcc20, 0x3a15f: 0x6d3fce20, - 0x3a160: 0x6d3fd020, 0x3a161: 0x6d3fd220, 0x3a162: 0x6d3fd420, 0x3a163: 0x6d3fd620, - 0x3a164: 0x6d3fd820, 0x3a165: 0x6d3fda20, 0x3a166: 0x6d3fdc20, 0x3a167: 0x6d3fde20, - 0x3a168: 0x6d3fe020, 0x3a169: 0x6d3fe220, 0x3a16a: 0x6d3fe420, 0x3a16b: 0x6d3fe620, - 0x3a16c: 0x6d3fe820, 0x3a16d: 0x6d3fea20, 0x3a16e: 0x6d3fec20, 0x3a16f: 0x6d3fee20, - 0x3a170: 0x6d3ff020, 0x3a171: 0x6d3ff220, 0x3a172: 0x6d3ff420, 0x3a173: 0x6d3ff620, - 0x3a174: 0x6d6c8a20, 0x3a175: 0x6d6c8c20, 0x3a176: 0x6d6c8e20, 0x3a177: 0x6d6c9020, - 0x3a178: 0x6d6c9220, 0x3a179: 0x6d6c9420, 0x3a17a: 0x6d6c9620, 0x3a17b: 0x6d6c9820, - 0x3a17c: 0x6d6c9a20, 0x3a17d: 0x6d6c9c20, 0x3a17e: 0x6d6c9e20, 0x3a17f: 0x6d6ca020, - // Block 0xe86, offset 0x3a180 - 0x3a180: 0x6d6ca220, 0x3a181: 0x6d6ca420, 0x3a182: 0x6d6ca620, 0x3a183: 0x6d6ca820, - 0x3a184: 0x6d6caa20, 0x3a185: 0x6d6cac20, 0x3a186: 0x6d6cae20, 0x3a187: 0x6d6cb020, - 0x3a188: 0x6d6cb220, 0x3a189: 0x6d6cb420, 0x3a18a: 0x6d6cb620, 0x3a18b: 0x6d6cb820, - 0x3a18c: 0x6d6cba20, 0x3a18d: 0x6d6cbc20, 0x3a18e: 0x6d6cbe20, 0x3a18f: 0x6d6cc020, - 0x3a190: 0x6d6cc220, 0x3a191: 0x6d6cc420, 0x3a192: 0x6d6cc620, 0x3a193: 0x6d784820, - 0x3a194: 0x6d6cc820, 0x3a195: 0x6d6cca20, 0x3a196: 0x6d6ccc20, 0x3a197: 0x6d6cce20, - 0x3a198: 0x6d6cd020, 0x3a199: 0x6d6cd220, 0x3a19a: 0x6d6cd420, 0x3a19b: 0x6d6cd620, - 0x3a19c: 0x6d6cd820, 0x3a19d: 0x6d6cda20, 0x3a19e: 0x6d6cdc20, 0x3a19f: 0x6d6cde20, - 0x3a1a0: 0x6d6ce020, 0x3a1a1: 0x6d6ce220, 0x3a1a2: 0x6d6ce420, 0x3a1a3: 0x6d6ce620, - 0x3a1a4: 0x6d6ce820, 0x3a1a5: 0x6d95b220, 0x3a1a6: 0x6d95b420, 0x3a1a7: 0x6d95b620, - 0x3a1a8: 0x6d95b820, 0x3a1a9: 0x6d95ba20, 0x3a1aa: 0x6d95bc20, 0x3a1ab: 0x6d95be20, - 0x3a1ac: 0x6d95c020, 0x3a1ad: 0x6d95c220, 0x3a1ae: 0x6d95c420, 0x3a1af: 0x6d95c620, - 0x3a1b0: 0x6d95c820, 0x3a1b1: 0x6d95ca20, 0x3a1b2: 0x6d95cc20, 0x3a1b3: 0x6d95ce20, - 0x3a1b4: 0x6d95d020, 0x3a1b5: 0x6d95d220, 0x3a1b6: 0x6d95d420, 0x3a1b7: 0x6d95d620, - 0x3a1b8: 0x6d95d820, 0x3a1b9: 0x6d95da20, 0x3a1ba: 0x6d95dc20, 0x3a1bb: 0x6d95de20, - 0x3a1bc: 0x6d95e020, 0x3a1bd: 0x6d95e220, 0x3a1be: 0x6d95e420, 0x3a1bf: 0x6d95e620, - // Block 0xe87, offset 0x3a1c0 - 0x3a1c0: 0x6d95e820, 0x3a1c1: 0x6d95ea20, 0x3a1c2: 0x6d95ec20, 0x3a1c3: 0x6d95ee20, - 0x3a1c4: 0x6d95f020, 0x3a1c5: 0x6d95f220, 0x3a1c6: 0x6d95f420, 0x3a1c7: 0x6db8c620, - 0x3a1c8: 0x6db8c820, 0x3a1c9: 0x6db8ca20, 0x3a1ca: 0x6db8cc20, 0x3a1cb: 0x6db8ce20, - 0x3a1cc: 0x6db8d020, 0x3a1cd: 0x6db8d220, 0x3a1ce: 0x6db8d420, 0x3a1cf: 0x6db8d620, - 0x3a1d0: 0x6db8d820, 0x3a1d1: 0x6db8da20, 0x3a1d2: 0x6db8dc20, 0x3a1d3: 0x6db8de20, - 0x3a1d4: 0x6db8e020, 0x3a1d5: 0x6db8e220, 0x3a1d6: 0x6db8e420, 0x3a1d7: 0x6db8e620, - 0x3a1d8: 0x6db8e820, 0x3a1d9: 0x6db8ea20, 0x3a1da: 0x6db8ec20, 0x3a1db: 0x6db8ee20, - 0x3a1dc: 0x6db8f020, 0x3a1dd: 0x6db8f220, 0x3a1de: 0x6db8f420, 0x3a1df: 0x6db8f620, - 0x3a1e0: 0x6db8f820, 0x3a1e1: 0x6dd72620, 0x3a1e2: 0x6dd72820, 0x3a1e3: 0x6dd72a20, - 0x3a1e4: 0x6dd72c20, 0x3a1e5: 0x6dd72e20, 0x3a1e6: 0x6dd73020, 0x3a1e7: 0x6dd73220, - 0x3a1e8: 0x6dd73420, 0x3a1e9: 0x6dd73620, 0x3a1ea: 0x6dd73820, 0x3a1eb: 0x6dd73a20, - 0x3a1ec: 0x6dd73c20, 0x3a1ed: 0x6dd73e20, 0x3a1ee: 0x6dd74020, 0x3a1ef: 0x6dd74220, - 0x3a1f0: 0x6dd74420, 0x3a1f1: 0x6dd74620, 0x3a1f2: 0x6dd74820, 0x3a1f3: 0x6dd74a20, - 0x3a1f4: 0x6dd74c20, 0x3a1f5: 0x6dd74e20, 0x3a1f6: 0x6dd75020, 0x3a1f7: 0x6defe220, - 0x3a1f8: 0x6defe420, 0x3a1f9: 0x6defe620, 0x3a1fa: 0x6defe820, 0x3a1fb: 0x6defea20, - 0x3a1fc: 0x6e03e620, 0x3a1fd: 0x6defec20, 0x3a1fe: 0x6defee20, 0x3a1ff: 0x6deff020, - // Block 0xe88, offset 0x3a200 - 0x3a200: 0x6deff220, 0x3a201: 0x6deff420, 0x3a202: 0x6e03fe20, 0x3a203: 0x6e040020, - 0x3a204: 0x6e040220, 0x3a205: 0x6e040420, 0x3a206: 0x6e040620, 0x3a207: 0x6e040820, - 0x3a208: 0x6e040a20, 0x3a209: 0x6e040c20, 0x3a20a: 0x6e040e20, 0x3a20b: 0x6e041020, - 0x3a20c: 0x6e041220, 0x3a20d: 0x6e041420, 0x3a20e: 0x6e041620, 0x3a20f: 0x6e041820, - 0x3a210: 0x6e041a20, 0x3a211: 0x6e041c20, 0x3a212: 0x6e153e20, 0x3a213: 0x6e154020, - 0x3a214: 0x6e154220, 0x3a215: 0x6e154420, 0x3a216: 0x6e154620, 0x3a217: 0x6e154820, - 0x3a218: 0x6e154a20, 0x3a219: 0x6e22de20, 0x3a21a: 0x6e22e020, 0x3a21b: 0x6e22e220, - 0x3a21c: 0x6e22e420, 0x3a21d: 0x6e22e620, 0x3a21e: 0x6e22e820, 0x3a21f: 0x6e2d0c20, - 0x3a220: 0x6e2d0e20, 0x3a221: 0x6e2d1020, 0x3a222: 0x6e2d1220, 0x3a223: 0x6e2d1420, - 0x3a224: 0x6e34fa20, 0x3a225: 0x6e34fc20, 0x3a226: 0x6e3aa820, 0x3a227: 0x6e3e6a20, - 0x3a228: 0x6c00ca20, 0x3a229: 0x6c052220, 0x3a22a: 0x6c052420, 0x3a22b: 0x6c0a9220, - 0x3a22c: 0x6c0a9420, 0x3a22d: 0x6c0a9620, 0x3a22e: 0x6c0a9820, 0x3a22f: 0x6c0a9a20, - 0x3a230: 0x6c0a9c20, 0x3a231: 0x6c0a9e20, 0x3a232: 0x6c0aa020, 0x3a233: 0x6c0aa220, - 0x3a234: 0x6c0aa420, 0x3a235: 0x6c0aa620, 0x3a236: 0x6c154e20, 0x3a237: 0x6c155020, - 0x3a238: 0x6c155220, 0x3a239: 0x6c155420, 0x3a23a: 0x6c155620, 0x3a23b: 0x6c155820, - 0x3a23c: 0x6c155a20, 0x3a23d: 0x6c155c20, 0x3a23e: 0x6c155e20, 0x3a23f: 0x6c156020, - // Block 0xe89, offset 0x3a240 - 0x3a240: 0x6c156220, 0x3a241: 0x6c156420, 0x3a242: 0x6c156620, 0x3a243: 0x6c156820, - 0x3a244: 0x6c156a20, 0x3a245: 0x6c156c20, 0x3a246: 0x6c156e20, 0x3a247: 0x6c157020, - 0x3a248: 0x6c157220, 0x3a249: 0x6c157420, 0x3a24a: 0x6c157620, 0x3a24b: 0x6c157820, - 0x3a24c: 0x6c157a20, 0x3a24d: 0x6c157c20, 0x3a24e: 0x6c157e20, 0x3a24f: 0x6c158020, - 0x3a250: 0x6c158220, 0x3a251: 0x6c158420, 0x3a252: 0x6c158620, 0x3a253: 0x6c27ae20, - 0x3a254: 0x6c27b020, 0x3a255: 0x6c27b220, 0x3a256: 0x6c27b420, 0x3a257: 0x6c27b620, - 0x3a258: 0x6c27b820, 0x3a259: 0x6c27ba20, 0x3a25a: 0x6c27bc20, 0x3a25b: 0x6c27be20, - 0x3a25c: 0x6c27c020, 0x3a25d: 0x6c27c220, 0x3a25e: 0x6c27c420, 0x3a25f: 0x6c27c620, - 0x3a260: 0x6c27c820, 0x3a261: 0x6c27ca20, 0x3a262: 0x6c27cc20, 0x3a263: 0x6c27ce20, - 0x3a264: 0x6c27d020, 0x3a265: 0x6c27d220, 0x3a266: 0x6c27d420, 0x3a267: 0x6c27d620, - 0x3a268: 0x6c27d820, 0x3a269: 0x6c27da20, 0x3a26a: 0x6c27dc20, 0x3a26b: 0x6c27de20, - 0x3a26c: 0x6c27e020, 0x3a26d: 0x6c27e220, 0x3a26e: 0x6c27e420, 0x3a26f: 0x6c41a020, - 0x3a270: 0x6c41a220, 0x3a271: 0x6c41a420, 0x3a272: 0x6c41a620, 0x3a273: 0x6c41a820, - 0x3a274: 0x6c41aa20, 0x3a275: 0x6c41ac20, 0x3a276: 0x6c41ae20, 0x3a277: 0x6c41b020, - 0x3a278: 0x6c41b220, 0x3a279: 0x6c41b420, 0x3a27a: 0x6c41b620, 0x3a27b: 0x6c41b820, - 0x3a27c: 0x6c41ba20, 0x3a27d: 0x6c41bc20, 0x3a27e: 0x6c41be20, 0x3a27f: 0x6c41c020, - // Block 0xe8a, offset 0x3a280 - 0x3a280: 0x6c41c220, 0x3a281: 0x6c41c420, 0x3a282: 0x6c41c620, 0x3a283: 0x6c41c820, - 0x3a284: 0x6c41ca20, 0x3a285: 0x6c41cc20, 0x3a286: 0x6c41ce20, 0x3a287: 0x6c41d020, - 0x3a288: 0x6c41d220, 0x3a289: 0x6c41d420, 0x3a28a: 0x6c41d620, 0x3a28b: 0x6c620e20, - 0x3a28c: 0x6c621020, 0x3a28d: 0x6c621220, 0x3a28e: 0x6c621420, 0x3a28f: 0x6c621620, - 0x3a290: 0x6c621820, 0x3a291: 0x6c621a20, 0x3a292: 0x6c621c20, 0x3a293: 0x6c621e20, - 0x3a294: 0x6c622020, 0x3a295: 0x6c622220, 0x3a296: 0x6c622420, 0x3a297: 0x6c622620, - 0x3a298: 0x6c622820, 0x3a299: 0x6c622a20, 0x3a29a: 0x6c622c20, 0x3a29b: 0x6c622e20, - 0x3a29c: 0x6c623020, 0x3a29d: 0x6c623220, 0x3a29e: 0x6c623420, 0x3a29f: 0x6c623620, - 0x3a2a0: 0x6c623820, 0x3a2a1: 0x6c623a20, 0x3a2a2: 0x6c623c20, 0x3a2a3: 0x6c623e20, - 0x3a2a4: 0x6c624020, 0x3a2a5: 0x6c624220, 0x3a2a6: 0x6c624420, 0x3a2a7: 0x6c624620, - 0x3a2a8: 0x6c624820, 0x3a2a9: 0x6c624a20, 0x3a2aa: 0x6c624c20, 0x3a2ab: 0x6c889a20, - 0x3a2ac: 0x6c889c20, 0x3a2ad: 0x6c889e20, 0x3a2ae: 0x6c88a020, 0x3a2af: 0x6c88a220, - 0x3a2b0: 0x6c88a420, 0x3a2b1: 0x6c88a620, 0x3a2b2: 0x6c88a820, 0x3a2b3: 0x6c88aa20, - 0x3a2b4: 0x6c88ac20, 0x3a2b5: 0x6c88ae20, 0x3a2b6: 0x6c88b020, 0x3a2b7: 0x6c88b220, - 0x3a2b8: 0x6c88b420, 0x3a2b9: 0x6c88b620, 0x3a2ba: 0x6c88b820, 0x3a2bb: 0x6c88ba20, - 0x3a2bc: 0x6c88bc20, 0x3a2bd: 0x6c88be20, 0x3a2be: 0x6c88c020, 0x3a2bf: 0x6c88c220, - // Block 0xe8b, offset 0x3a2c0 - 0x3a2c0: 0x6c88c420, 0x3a2c1: 0x6c88c620, 0x3a2c2: 0x6c88c820, 0x3a2c3: 0x6c88ca20, - 0x3a2c4: 0x6c88cc20, 0x3a2c5: 0x6c88ce20, 0x3a2c6: 0x6c88d020, 0x3a2c7: 0x6c88d220, - 0x3a2c8: 0x6c88d420, 0x3a2c9: 0x6c88d620, 0x3a2ca: 0x6c88d820, 0x3a2cb: 0x6c88da20, - 0x3a2cc: 0x6c88dc20, 0x3a2cd: 0x6c88de20, 0x3a2ce: 0x6c88e020, 0x3a2cf: 0x6cb42a20, - 0x3a2d0: 0x6cb42c20, 0x3a2d1: 0x6cb42e20, 0x3a2d2: 0x6cb43020, 0x3a2d3: 0x6cb43220, - 0x3a2d4: 0x6cb43420, 0x3a2d5: 0x6cb43620, 0x3a2d6: 0x6cb43820, 0x3a2d7: 0x6ce3e620, - 0x3a2d8: 0x6cb43a20, 0x3a2d9: 0x6cb43c20, 0x3a2da: 0x6cb43e20, 0x3a2db: 0x6cb44020, - 0x3a2dc: 0x6cb44220, 0x3a2dd: 0x6cb44420, 0x3a2de: 0x6cb44620, 0x3a2df: 0x6cb44820, - 0x3a2e0: 0x6cb44a20, 0x3a2e1: 0x6cb44c20, 0x3a2e2: 0x6cb44e20, 0x3a2e3: 0x6cb45020, - 0x3a2e4: 0x6cb45220, 0x3a2e5: 0x6cb45420, 0x3a2e6: 0x6cb45620, 0x3a2e7: 0x6cb45820, - 0x3a2e8: 0x6cb45a20, 0x3a2e9: 0x6cb45c20, 0x3a2ea: 0x6cb45e20, 0x3a2eb: 0x6cb46020, - 0x3a2ec: 0x6cb46220, 0x3a2ed: 0x6cb46420, 0x3a2ee: 0x6cb46620, 0x3a2ef: 0x6cb46820, - 0x3a2f0: 0x6cb46a20, 0x3a2f1: 0x6cb46c20, 0x3a2f2: 0x6ce3e820, 0x3a2f3: 0x6ce3ea20, - 0x3a2f4: 0x6ce3ec20, 0x3a2f5: 0x6ce3ee20, 0x3a2f6: 0x6ce3f020, 0x3a2f7: 0x6ce3f220, - 0x3a2f8: 0x6ce3f420, 0x3a2f9: 0x6ce3f620, 0x3a2fa: 0x6ce3f820, 0x3a2fb: 0x6ce3fa20, - 0x3a2fc: 0x6ce3fc20, 0x3a2fd: 0x6ce3fe20, 0x3a2fe: 0x6ce40020, 0x3a2ff: 0x6ce40220, - // Block 0xe8c, offset 0x3a300 - 0x3a300: 0x6ce40420, 0x3a301: 0x6ce40620, 0x3a302: 0x6ce40820, 0x3a303: 0x6ce40a20, - 0x3a304: 0x6ce40c20, 0x3a305: 0x6ce40e20, 0x3a306: 0x6ce41020, 0x3a307: 0x6ce41220, - 0x3a308: 0x6ce41420, 0x3a309: 0x6ce41620, 0x3a30a: 0x6ce41820, 0x3a30b: 0x6d122220, - 0x3a30c: 0x6d122420, 0x3a30d: 0x6d122620, 0x3a30e: 0x6d122820, 0x3a30f: 0x6d122a20, - 0x3a310: 0x6d122c20, 0x3a311: 0x6d122e20, 0x3a312: 0x6d123020, 0x3a313: 0x6d123220, - 0x3a314: 0x6d123420, 0x3a315: 0x6d123620, 0x3a316: 0x6d123820, 0x3a317: 0x6d123a20, - 0x3a318: 0x6d123c20, 0x3a319: 0x6d123e20, 0x3a31a: 0x6d124020, 0x3a31b: 0x6d124220, - 0x3a31c: 0x6d124420, 0x3a31d: 0x6d124620, 0x3a31e: 0x6d124820, 0x3a31f: 0x6d124a20, - 0x3a320: 0x6d124c20, 0x3a321: 0x6d124e20, 0x3a322: 0x6d125020, 0x3a323: 0x6d125220, - 0x3a324: 0x6d125420, 0x3a325: 0x6d125620, 0x3a326: 0x6d125820, 0x3a327: 0x6d125a20, - 0x3a328: 0x6d125c20, 0x3a329: 0x6d125e20, 0x3a32a: 0x6d126020, 0x3a32b: 0x6d403020, - 0x3a32c: 0x6d403220, 0x3a32d: 0x6d403420, 0x3a32e: 0x6d403620, 0x3a32f: 0x6d403820, - 0x3a330: 0x6d403a20, 0x3a331: 0x6d403c20, 0x3a332: 0x6d403e20, 0x3a333: 0x6d404020, - 0x3a334: 0x6d404220, 0x3a335: 0x6d404420, 0x3a336: 0x6d404620, 0x3a337: 0x6d404820, - 0x3a338: 0x6d404a20, 0x3a339: 0x6d126220, 0x3a33a: 0x6d404c20, 0x3a33b: 0x6d404e20, - 0x3a33c: 0x6d405020, 0x3a33d: 0x6d405220, 0x3a33e: 0x6d405420, 0x3a33f: 0x6d405620, - // Block 0xe8d, offset 0x3a340 - 0x3a340: 0x6d405820, 0x3a341: 0x6d405a20, 0x3a342: 0x6d405c20, 0x3a343: 0x6d405e20, - 0x3a344: 0x6d406020, 0x3a345: 0x6d406220, 0x3a346: 0x6d406420, 0x3a347: 0x6d406620, - 0x3a348: 0x6d406820, 0x3a349: 0x6d406a20, 0x3a34a: 0x6d406c20, 0x3a34b: 0x6d406e20, - 0x3a34c: 0x6d407020, 0x3a34d: 0x6d407220, 0x3a34e: 0x6d407420, 0x3a34f: 0x6d407620, - 0x3a350: 0x6d407820, 0x3a351: 0x6d6d1820, 0x3a352: 0x6d6d1a20, 0x3a353: 0x6d6d1c20, - 0x3a354: 0x6d6d1e20, 0x3a355: 0x6d6d2020, 0x3a356: 0x6d6d2220, 0x3a357: 0x6d6d2420, - 0x3a358: 0x6d6d2620, 0x3a359: 0x6d6d2820, 0x3a35a: 0x6d6d2a20, 0x3a35b: 0x6d6d2c20, - 0x3a35c: 0x6d6d2e20, 0x3a35d: 0x6d6d3020, 0x3a35e: 0x6d6d3220, 0x3a35f: 0x6d6d3420, - 0x3a360: 0x6d6d3620, 0x3a361: 0x6d6d3820, 0x3a362: 0x6d6d3a20, 0x3a363: 0x6d6d3c20, - 0x3a364: 0x6d6d3e20, 0x3a365: 0x6d6d4020, 0x3a366: 0x6d6d4220, 0x3a367: 0x6d960820, - 0x3a368: 0x6d960a20, 0x3a369: 0x6d960c20, 0x3a36a: 0x6d960e20, 0x3a36b: 0x6d961020, - 0x3a36c: 0x6d961220, 0x3a36d: 0x6d961420, 0x3a36e: 0x6d961620, 0x3a36f: 0x6d961820, - 0x3a370: 0x6d961a20, 0x3a371: 0x6d961c20, 0x3a372: 0x6d961e20, 0x3a373: 0x6d962020, - 0x3a374: 0x6d962220, 0x3a375: 0x6d962420, 0x3a376: 0x6d962620, 0x3a377: 0x6d962820, - 0x3a378: 0x6d962a20, 0x3a379: 0x6d962c20, 0x3a37a: 0x6db90c20, 0x3a37b: 0x6db90e20, - 0x3a37c: 0x6db91020, 0x3a37d: 0x6db91220, 0x3a37e: 0x6db91420, 0x3a37f: 0x6db91620, - // Block 0xe8e, offset 0x3a380 - 0x3a380: 0x6db91820, 0x3a381: 0x6db91a20, 0x3a382: 0x6db91c20, 0x3a383: 0x6db91e20, - 0x3a384: 0x6db92020, 0x3a385: 0x6db92220, 0x3a386: 0x6db92420, 0x3a387: 0x6db92620, - 0x3a388: 0x6db92820, 0x3a389: 0x6db92a20, 0x3a38a: 0x6db92c20, 0x3a38b: 0x6db92e20, - 0x3a38c: 0x6db93020, 0x3a38d: 0x6dd76220, 0x3a38e: 0x6dd76420, 0x3a38f: 0x6dd76620, - 0x3a390: 0x6dd76820, 0x3a391: 0x6dd76a20, 0x3a392: 0x6dd76c20, 0x3a393: 0x6dd76e20, - 0x3a394: 0x6dd77020, 0x3a395: 0x6dd77220, 0x3a396: 0x6dd77420, 0x3a397: 0x6dd77620, - 0x3a398: 0x6dd77820, 0x3a399: 0x6deffc20, 0x3a39a: 0x6deffe20, 0x3a39b: 0x6df00020, - 0x3a39c: 0x6df00220, 0x3a39d: 0x6df00420, 0x3a39e: 0x6df00620, 0x3a39f: 0x6df00820, - 0x3a3a0: 0x6e042a20, 0x3a3a1: 0x6e042c20, 0x3a3a2: 0x6e042e20, 0x3a3a3: 0x6e043020, - 0x3a3a4: 0x6e155420, 0x3a3a5: 0x6e155620, 0x3a3a6: 0x6e155820, 0x3a3a7: 0x6e155a20, - 0x3a3a8: 0x6e22ee20, 0x3a3a9: 0x6e2d1a20, 0x3a3aa: 0x6e2d1c20, 0x3a3ab: 0x6e2d1e20, - 0x3a3ac: 0x6e2d2020, 0x3a3ad: 0x6e2d2220, 0x3a3ae: 0x6e2d2420, 0x3a3af: 0x6e3e6c20, - 0x3a3b0: 0x6c88fc20, 0x3a3b1: 0x6c88fe20, 0x3a3b2: 0x6c890020, 0x3a3b3: 0x6c890220, - 0x3a3b4: 0x6cb49620, 0x3a3b5: 0x6cb49820, 0x3a3b6: 0x6cb49a20, 0x3a3b7: 0x6cb49c20, - 0x3a3b8: 0x6cb49e20, 0x3a3b9: 0x6cb4a020, 0x3a3ba: 0x6cb4a220, 0x3a3bb: 0x6cb4a420, - 0x3a3bc: 0x6cb4a620, 0x3a3bd: 0x6cb4a820, 0x3a3be: 0x6cb4aa20, 0x3a3bf: 0x6cb4ac20, - // Block 0xe8f, offset 0x3a3c0 - 0x3a3c0: 0x6cb4ae20, 0x3a3c1: 0x6cb4b020, 0x3a3c2: 0x6cb4b220, 0x3a3c3: 0x6cb4b420, - 0x3a3c4: 0x6cb4b620, 0x3a3c5: 0x6cb4b820, 0x3a3c6: 0x6cb4ba20, 0x3a3c7: 0x6cb4bc20, - 0x3a3c8: 0x6cb4be20, 0x3a3c9: 0x6cb4c020, 0x3a3ca: 0x6cb4c220, 0x3a3cb: 0x6ce43820, - 0x3a3cc: 0x6ce43a20, 0x3a3cd: 0x6ce43c20, 0x3a3ce: 0x6ce43e20, 0x3a3cf: 0x6ce44020, - 0x3a3d0: 0x6ce44220, 0x3a3d1: 0x6ce44420, 0x3a3d2: 0x6ce44620, 0x3a3d3: 0x6ce44820, - 0x3a3d4: 0x6ce44a20, 0x3a3d5: 0x6ce44c20, 0x3a3d6: 0x6ce44e20, 0x3a3d7: 0x6ce45020, - 0x3a3d8: 0x6ce45220, 0x3a3d9: 0x6ce45420, 0x3a3da: 0x6ce45620, 0x3a3db: 0x6ce45820, - 0x3a3dc: 0x6ce45a20, 0x3a3dd: 0x6ce45c20, 0x3a3de: 0x6ce45e20, 0x3a3df: 0x6ce46020, - 0x3a3e0: 0x6ce46220, 0x3a3e1: 0x6ce46420, 0x3a3e2: 0x6ce46620, 0x3a3e3: 0x6ce46820, - 0x3a3e4: 0x6d129020, 0x3a3e5: 0x6d129220, 0x3a3e6: 0x6d129420, 0x3a3e7: 0x6d129620, - 0x3a3e8: 0x6d129820, 0x3a3e9: 0x6d129a20, 0x3a3ea: 0x6d129c20, 0x3a3eb: 0x6d129e20, - 0x3a3ec: 0x6d12a020, 0x3a3ed: 0x6d12a220, 0x3a3ee: 0x6d12a420, 0x3a3ef: 0x6d12a620, - 0x3a3f0: 0x6d12a820, 0x3a3f1: 0x6d12aa20, 0x3a3f2: 0x6d12ac20, 0x3a3f3: 0x6d12ae20, - 0x3a3f4: 0x6d12b020, 0x3a3f5: 0x6d12b220, 0x3a3f6: 0x6d12b420, 0x3a3f7: 0x6d409a20, - 0x3a3f8: 0x6d409c20, 0x3a3f9: 0x6d409e20, 0x3a3fa: 0x6d40a020, 0x3a3fb: 0x6d40a220, - 0x3a3fc: 0x6d40a420, 0x3a3fd: 0x6d40a620, 0x3a3fe: 0x6d40a820, 0x3a3ff: 0x6d40aa20, - // Block 0xe90, offset 0x3a400 - 0x3a400: 0x6d40ac20, 0x3a401: 0x6d40ae20, 0x3a402: 0x6d40b020, 0x3a403: 0x6d40b220, - 0x3a404: 0x6d40b420, 0x3a405: 0x6d40b620, 0x3a406: 0x6d40b820, 0x3a407: 0x6d40ba20, - 0x3a408: 0x6d40bc20, 0x3a409: 0x6d40be20, 0x3a40a: 0x6d40c020, 0x3a40b: 0x6d40c220, - 0x3a40c: 0x6d6d6a20, 0x3a40d: 0x6d6d6c20, 0x3a40e: 0x6d6d6e20, 0x3a40f: 0x6d6d7020, - 0x3a410: 0x6d6d7220, 0x3a411: 0x6d6d7420, 0x3a412: 0x6d6d7620, 0x3a413: 0x6d6d7820, - 0x3a414: 0x6d6d7a20, 0x3a415: 0x6d6d7c20, 0x3a416: 0x6d6d7e20, 0x3a417: 0x6d6d8020, - 0x3a418: 0x6d6d8220, 0x3a419: 0x6d6d8420, 0x3a41a: 0x6d6d8620, 0x3a41b: 0x6d6d8820, - 0x3a41c: 0x6d6d8a20, 0x3a41d: 0x6d6d8c20, 0x3a41e: 0x6d6d8e20, 0x3a41f: 0x6d6d9020, - 0x3a420: 0x6d6d9220, 0x3a421: 0x6d6d9420, 0x3a422: 0x6d6d9620, 0x3a423: 0x6d6d9820, - 0x3a424: 0x6d6d9a20, 0x3a425: 0x6d6d9c20, 0x3a426: 0x6d6d9e20, 0x3a427: 0x6d6da020, - 0x3a428: 0x6d6da220, 0x3a429: 0x6d965820, 0x3a42a: 0x6d965a20, 0x3a42b: 0x6d965c20, - 0x3a42c: 0x6d965e20, 0x3a42d: 0x6d966020, 0x3a42e: 0x6d966220, 0x3a42f: 0x6d966420, - 0x3a430: 0x6d966620, 0x3a431: 0x6d966820, 0x3a432: 0x6d966a20, 0x3a433: 0x6d966c20, - 0x3a434: 0x6d966e20, 0x3a435: 0x6d967020, 0x3a436: 0x6d967220, 0x3a437: 0x6d967420, - 0x3a438: 0x6d967620, 0x3a439: 0x6d967820, 0x3a43a: 0x6d967a20, 0x3a43b: 0x6d967c20, - 0x3a43c: 0x6d967e20, 0x3a43d: 0x6d968020, 0x3a43e: 0x6d968220, 0x3a43f: 0x6d968420, - // Block 0xe91, offset 0x3a440 - 0x3a440: 0x6d968620, 0x3a441: 0x6d968820, 0x3a442: 0x6d968a20, 0x3a443: 0x6d968c20, - 0x3a444: 0x6d968e20, 0x3a445: 0x6db95620, 0x3a446: 0x6db95820, 0x3a447: 0x6db95a20, - 0x3a448: 0x6db95c20, 0x3a449: 0x6db95e20, 0x3a44a: 0x6db96020, 0x3a44b: 0x6db96220, - 0x3a44c: 0x6db96420, 0x3a44d: 0x6db96620, 0x3a44e: 0x6db96820, 0x3a44f: 0x6db96a20, - 0x3a450: 0x6db96c20, 0x3a451: 0x6db96e20, 0x3a452: 0x6db97020, 0x3a453: 0x6db97220, - 0x3a454: 0x6db97420, 0x3a455: 0x6db97620, 0x3a456: 0x6db97820, 0x3a457: 0x6db97a20, - 0x3a458: 0x6db97c20, 0x3a459: 0x6db97e20, 0x3a45a: 0x6db98020, 0x3a45b: 0x6db98220, - 0x3a45c: 0x6db98420, 0x3a45d: 0x6db98620, 0x3a45e: 0x6db98820, 0x3a45f: 0x6db98a20, - 0x3a460: 0x6db98c20, 0x3a461: 0x6dd79220, 0x3a462: 0x6dd79420, 0x3a463: 0x6dd79620, - 0x3a464: 0x6dd79820, 0x3a465: 0x6dd79a20, 0x3a466: 0x6dd79c20, 0x3a467: 0x6dd79e20, - 0x3a468: 0x6dd7a020, 0x3a469: 0x6dd7a220, 0x3a46a: 0x6dd7a420, 0x3a46b: 0x6dd7a620, - 0x3a46c: 0x6dd7a820, 0x3a46d: 0x6dd7aa20, 0x3a46e: 0x6dd7ac20, 0x3a46f: 0x6dd7ae20, - 0x3a470: 0x6dd7b020, 0x3a471: 0x6dd7b220, 0x3a472: 0x6dd7b420, 0x3a473: 0x6dd7b620, - 0x3a474: 0x6dd7b820, 0x3a475: 0x6dd7ba20, 0x3a476: 0x6dd7bc20, 0x3a477: 0x6dd7be20, - 0x3a478: 0x6dd7c020, 0x3a479: 0x6dd7c220, 0x3a47a: 0x6dd7c420, 0x3a47b: 0x6dd7c620, - 0x3a47c: 0x6dd7c820, 0x3a47d: 0x6df01e20, 0x3a47e: 0x6df02020, 0x3a47f: 0x6df02220, - // Block 0xe92, offset 0x3a480 - 0x3a480: 0x6df02420, 0x3a481: 0x6df02620, 0x3a482: 0x6df02820, 0x3a483: 0x6df02a20, - 0x3a484: 0x6df02c20, 0x3a485: 0x6df02e20, 0x3a486: 0x6df03020, 0x3a487: 0x6df03220, - 0x3a488: 0x6df03420, 0x3a489: 0x6df03620, 0x3a48a: 0x6df03820, 0x3a48b: 0x6df03a20, - 0x3a48c: 0x6df03c20, 0x3a48d: 0x6df03e20, 0x3a48e: 0x6df04020, 0x3a48f: 0x6df04220, - 0x3a490: 0x6df04420, 0x3a491: 0x6df04620, 0x3a492: 0x6df04820, 0x3a493: 0x6df04a20, - 0x3a494: 0x6df04c20, 0x3a495: 0x6df04e20, 0x3a496: 0x6e044220, 0x3a497: 0x6e044420, - 0x3a498: 0x6e044620, 0x3a499: 0x6e044820, 0x3a49a: 0x6e044a20, 0x3a49b: 0x6e044c20, - 0x3a49c: 0x6e044e20, 0x3a49d: 0x6e045020, 0x3a49e: 0x6e045220, 0x3a49f: 0x6e045420, - 0x3a4a0: 0x6e045620, 0x3a4a1: 0x6e045820, 0x3a4a2: 0x6e045a20, 0x3a4a3: 0x6e045c20, - 0x3a4a4: 0x6e045e20, 0x3a4a5: 0x6e046020, 0x3a4a6: 0x6e156620, 0x3a4a7: 0x6e156820, - 0x3a4a8: 0x6e156a20, 0x3a4a9: 0x6e156c20, 0x3a4aa: 0x6e156e20, 0x3a4ab: 0x6e157020, - 0x3a4ac: 0x6e157220, 0x3a4ad: 0x6e157420, 0x3a4ae: 0x6e22f420, 0x3a4af: 0x6e22f620, - 0x3a4b0: 0x6e22f820, 0x3a4b1: 0x6e22fa20, 0x3a4b2: 0x6e22fc20, 0x3a4b3: 0x6e22fe20, - 0x3a4b4: 0x6e230020, 0x3a4b5: 0x6e230220, 0x3a4b6: 0x6e2d2820, 0x3a4b7: 0x6e2d2a20, - 0x3a4b8: 0x6e2d2c20, 0x3a4b9: 0x6e2d2e20, 0x3a4ba: 0x6e2d3020, 0x3a4bb: 0x6e2d3220, - 0x3a4bc: 0x6e2d3420, 0x3a4bd: 0x6e2d3620, 0x3a4be: 0x6e350a20, 0x3a4bf: 0x6e350c20, - // Block 0xe93, offset 0x3a4c0 - 0x3a4c0: 0x6e350e20, 0x3a4c1: 0x6e351020, 0x3a4c2: 0x6e351220, 0x3a4c3: 0x6e3aac20, - 0x3a4c4: 0x6e3aae20, 0x3a4c5: 0x6e3e7220, 0x3a4c6: 0x6e3e7420, 0x3a4c7: 0x6e413a20, - 0x3a4c8: 0x6e413c20, 0x3a4c9: 0x6e413e20, 0x3a4ca: 0x6e433a20, 0x3a4cb: 0x6e433c20, - 0x3a4cc: 0x6e433e20, 0x3a4cd: 0x6e45e220, 0x3a4ce: 0x6e45e420, 0x3a4cf: 0x6c890620, - 0x3a4d0: 0x6cb4c620, 0x3a4d1: 0x6cb4c820, 0x3a4d2: 0x6d40ca20, 0x3a4d3: 0x6d40cc20, - 0x3a4d4: 0x6d40ce20, 0x3a4d5: 0x6d6da620, 0x3a4d6: 0x6d6da820, 0x3a4d7: 0x6d6daa20, - 0x3a4d8: 0x6d969020, 0x3a4d9: 0x6d969220, 0x3a4da: 0x6db99220, 0x3a4db: 0x6db99420, - 0x3a4dc: 0x6db99620, 0x3a4dd: 0x6dd7cc20, 0x3a4de: 0x6e046420, 0x3a4df: 0x6e157820, - 0x3a4e0: 0x6e157a20, 0x3a4e1: 0x6e230420, 0x3a4e2: 0x6cb4ce20, 0x3a4e3: 0x6c890820, - 0x3a4e4: 0x6c890a20, 0x3a4e5: 0x6cb4d020, 0x3a4e6: 0x6ce47220, 0x3a4e7: 0x6ce47420, - 0x3a4e8: 0x6ce47620, 0x3a4e9: 0x6ce47820, 0x3a4ea: 0x6d12bc20, 0x3a4eb: 0x6d12be20, - 0x3a4ec: 0x6d40d020, 0x3a4ed: 0x6d6dac20, 0x3a4ee: 0x6d6dae20, 0x3a4ef: 0x6d6db020, - 0x3a4f0: 0x6d969420, 0x3a4f1: 0x6d969620, 0x3a4f2: 0x6db99a20, 0x3a4f3: 0x6db99c20, - 0x3a4f4: 0x6dd7d020, 0x3a4f5: 0x6dd7d220, 0x3a4f6: 0x6dd7d420, 0x3a4f7: 0x6dd7d620, - 0x3a4f8: 0x6e046820, 0x3a4f9: 0x6e157c20, 0x3a4fa: 0x6e157e20, 0x3a4fb: 0x6e3ab020, - 0x3a4fc: 0x6e456620, 0x3a4fd: 0x6c892a20, 0x3a4fe: 0x6c892c20, 0x3a4ff: 0x6c892e20, - // Block 0xe94, offset 0x3a500 - 0x3a500: 0x6c893020, 0x3a501: 0x6c893220, 0x3a502: 0x6cb50a20, 0x3a503: 0x6cb50c20, - 0x3a504: 0x6cb50e20, 0x3a505: 0x6cb51020, 0x3a506: 0x6cb51220, 0x3a507: 0x6cb51420, - 0x3a508: 0x6cb51620, 0x3a509: 0x6cb51820, 0x3a50a: 0x6ce4e420, 0x3a50b: 0x6ce4e620, - 0x3a50c: 0x6ce4e820, 0x3a50d: 0x6ce4ea20, 0x3a50e: 0x6ce4ec20, 0x3a50f: 0x6ce4ee20, - 0x3a510: 0x6ce4f020, 0x3a511: 0x6ce4f220, 0x3a512: 0x6ce4f420, 0x3a513: 0x6ce4f620, - 0x3a514: 0x6ce4f820, 0x3a515: 0x6ce4fa20, 0x3a516: 0x6ce4fc20, 0x3a517: 0x6ce4fe20, - 0x3a518: 0x6ce50020, 0x3a519: 0x6ce50220, 0x3a51a: 0x6ce50420, 0x3a51b: 0x6ce50620, - 0x3a51c: 0x6ce50820, 0x3a51d: 0x6ce50a20, 0x3a51e: 0x6ce50c20, 0x3a51f: 0x6ce50e20, - 0x3a520: 0x6ce51020, 0x3a521: 0x6ce51220, 0x3a522: 0x6ce51420, 0x3a523: 0x6ce51620, - 0x3a524: 0x6ce51820, 0x3a525: 0x6d135820, 0x3a526: 0x6d135a20, 0x3a527: 0x6d135c20, - 0x3a528: 0x6d135e20, 0x3a529: 0x6d136020, 0x3a52a: 0x6d136220, 0x3a52b: 0x6d136420, - 0x3a52c: 0x6d136620, 0x3a52d: 0x6d136820, 0x3a52e: 0x6d136a20, 0x3a52f: 0x6d136c20, - 0x3a530: 0x6d136e20, 0x3a531: 0x6d137020, 0x3a532: 0x6d137220, 0x3a533: 0x6d137420, - 0x3a534: 0x6d137620, 0x3a535: 0x6d137820, 0x3a536: 0x6d137a20, 0x3a537: 0x6d137c20, - 0x3a538: 0x6d137e20, 0x3a539: 0x6d138020, 0x3a53a: 0x6d138220, 0x3a53b: 0x6d138420, - 0x3a53c: 0x6d138620, 0x3a53d: 0x6d138820, 0x3a53e: 0x6d138a20, 0x3a53f: 0x6d138c20, - // Block 0xe95, offset 0x3a540 - 0x3a540: 0x6d138e20, 0x3a541: 0x6d139020, 0x3a542: 0x6d415a20, 0x3a543: 0x6d415c20, - 0x3a544: 0x6d415e20, 0x3a545: 0x6d416020, 0x3a546: 0x6d416220, 0x3a547: 0x6d416420, - 0x3a548: 0x6d416620, 0x3a549: 0x6d416820, 0x3a54a: 0x6d416a20, 0x3a54b: 0x6d416c20, - 0x3a54c: 0x6d416e20, 0x3a54d: 0x6d417020, 0x3a54e: 0x6d417220, 0x3a54f: 0x6d417420, - 0x3a550: 0x6d417620, 0x3a551: 0x6d417820, 0x3a552: 0x6d417a20, 0x3a553: 0x6d417c20, - 0x3a554: 0x6d417e20, 0x3a555: 0x6d418020, 0x3a556: 0x6d418220, 0x3a557: 0x6d418420, - 0x3a558: 0x6d418620, 0x3a559: 0x6d418820, 0x3a55a: 0x6d418a20, 0x3a55b: 0x6d418c20, - 0x3a55c: 0x6d418e20, 0x3a55d: 0x6d419020, 0x3a55e: 0x6d377020, 0x3a55f: 0x6d419220, - 0x3a560: 0x6d419420, 0x3a561: 0x6d419620, 0x3a562: 0x6d419820, 0x3a563: 0x6d419a20, - 0x3a564: 0x6d419c20, 0x3a565: 0x6d419e20, 0x3a566: 0x6d41a020, 0x3a567: 0x6d41a220, - 0x3a568: 0x6d41a420, 0x3a569: 0x6d41a620, 0x3a56a: 0x6d41a820, 0x3a56b: 0x6d41aa20, - 0x3a56c: 0x6d6e4a20, 0x3a56d: 0x6d6e4c20, 0x3a56e: 0x6d6e4e20, 0x3a56f: 0x6d6e5020, - 0x3a570: 0x6d6e5220, 0x3a571: 0x6d6e5420, 0x3a572: 0x6d6e5620, 0x3a573: 0x6d6e5820, - 0x3a574: 0x6d6e5a20, 0x3a575: 0x6d6e5c20, 0x3a576: 0x6d6e5e20, 0x3a577: 0x6d6e6020, - 0x3a578: 0x6d6e6220, 0x3a579: 0x6d6e6420, 0x3a57a: 0x6d6e6620, 0x3a57b: 0x6d6e6820, - 0x3a57c: 0x6d6e6a20, 0x3a57d: 0x6d6e6c20, 0x3a57e: 0x6d6e6e20, 0x3a57f: 0x6d6e7020, - // Block 0xe96, offset 0x3a580 - 0x3a580: 0x6d6e7220, 0x3a581: 0x6d6e7420, 0x3a582: 0x6d6e7620, 0x3a583: 0x6d6e7820, - 0x3a584: 0x6d6e7a20, 0x3a585: 0x6d6e7c20, 0x3a586: 0x6d6e7e20, 0x3a587: 0x6d6e8020, - 0x3a588: 0x6d6e8220, 0x3a589: 0x6d6e8420, 0x3a58a: 0x6d6e8620, 0x3a58b: 0x6d6e8820, - 0x3a58c: 0x6d6e8a20, 0x3a58d: 0x6d6e8c20, 0x3a58e: 0x6d6e8e20, 0x3a58f: 0x6d6e9020, - 0x3a590: 0x6d6e9220, 0x3a591: 0x6d6e9420, 0x3a592: 0x6d6e9620, 0x3a593: 0x6d6e9820, - 0x3a594: 0x6d6e9a20, 0x3a595: 0x6d6e9c20, 0x3a596: 0x6d6e9e20, 0x3a597: 0x6d6ea020, - 0x3a598: 0x6d6ea220, 0x3a599: 0x6d6ea420, 0x3a59a: 0x6d6ea620, 0x3a59b: 0x6d6ea820, - 0x3a59c: 0x6d6eaa20, 0x3a59d: 0x6d6eac20, 0x3a59e: 0x6d6eae20, 0x3a59f: 0x6d6eb020, - 0x3a5a0: 0x6d6eb220, 0x3a5a1: 0x6d6eb420, 0x3a5a2: 0x6d6eb620, 0x3a5a3: 0x6d6eb820, - 0x3a5a4: 0x6d6eba20, 0x3a5a5: 0x6d6ebc20, 0x3a5a6: 0x6d974620, 0x3a5a7: 0x6d974820, - 0x3a5a8: 0x6d974a20, 0x3a5a9: 0x6d974c20, 0x3a5aa: 0x6d974e20, 0x3a5ab: 0x6d975020, - 0x3a5ac: 0x6d975220, 0x3a5ad: 0x6d975420, 0x3a5ae: 0x6d975620, 0x3a5af: 0x6d975820, - 0x3a5b0: 0x6d975a20, 0x3a5b1: 0x6d975c20, 0x3a5b2: 0x6d975e20, 0x3a5b3: 0x6d976020, - 0x3a5b4: 0x6d976220, 0x3a5b5: 0x6d976420, 0x3a5b6: 0x6d976620, 0x3a5b7: 0x6d976820, - 0x3a5b8: 0x6d976a20, 0x3a5b9: 0x6d976c20, 0x3a5ba: 0x6d976e20, 0x3a5bb: 0x6d977020, - 0x3a5bc: 0x6d977220, 0x3a5bd: 0x6d977420, 0x3a5be: 0x6d977620, 0x3a5bf: 0x6d977820, - // Block 0xe97, offset 0x3a5c0 - 0x3a5c0: 0x6d977a20, 0x3a5c1: 0x6d977c20, 0x3a5c2: 0x6d977e20, 0x3a5c3: 0x6d978020, - 0x3a5c4: 0x6d978220, 0x3a5c5: 0x6d978420, 0x3a5c6: 0x6d978620, 0x3a5c7: 0x6d978820, - 0x3a5c8: 0x6d978a20, 0x3a5c9: 0x6d978c20, 0x3a5ca: 0x6d978e20, 0x3a5cb: 0x6d979020, - 0x3a5cc: 0x6d979220, 0x3a5cd: 0x6d979420, 0x3a5ce: 0x6d979620, 0x3a5cf: 0x6d979820, - 0x3a5d0: 0x6d979a20, 0x3a5d1: 0x6d979c20, 0x3a5d2: 0x6d979e20, 0x3a5d3: 0x6d97a020, - 0x3a5d4: 0x6d97a220, 0x3a5d5: 0x6d97a420, 0x3a5d6: 0x6d97a620, 0x3a5d7: 0x6d97a820, - 0x3a5d8: 0x6d97aa20, 0x3a5d9: 0x6d97ac20, 0x3a5da: 0x6d97ae20, 0x3a5db: 0x6d97b020, - 0x3a5dc: 0x6d97b220, 0x3a5dd: 0x6d97b420, 0x3a5de: 0x6d97b620, 0x3a5df: 0x6d97b820, - 0x3a5e0: 0x6d97ba20, 0x3a5e1: 0x6d97bc20, 0x3a5e2: 0x6d97be20, 0x3a5e3: 0x6d97c020, - 0x3a5e4: 0x6d97c220, 0x3a5e5: 0x6d97c420, 0x3a5e6: 0x6d97c620, 0x3a5e7: 0x6d97c820, - 0x3a5e8: 0x6d97ca20, 0x3a5e9: 0x6d97cc20, 0x3a5ea: 0x6d97ce20, 0x3a5eb: 0x6d97d020, - 0x3a5ec: 0x6d97d220, 0x3a5ed: 0x6d97d420, 0x3a5ee: 0x6d97d620, 0x3a5ef: 0x6dba2c20, - 0x3a5f0: 0x6dba2e20, 0x3a5f1: 0x6dba3020, 0x3a5f2: 0x6dba3220, 0x3a5f3: 0x6dba3420, - 0x3a5f4: 0x6dba3620, 0x3a5f5: 0x6dba3820, 0x3a5f6: 0x6dba3a20, 0x3a5f7: 0x6dba3c20, - 0x3a5f8: 0x6dba3e20, 0x3a5f9: 0x6dba4020, 0x3a5fa: 0x6dba4220, 0x3a5fb: 0x6dba4420, - 0x3a5fc: 0x6dba4620, 0x3a5fd: 0x6dba4820, 0x3a5fe: 0x6dba4a20, 0x3a5ff: 0x6dba4c20, - // Block 0xe98, offset 0x3a600 - 0x3a600: 0x6dba4e20, 0x3a601: 0x6dba5020, 0x3a602: 0x6dba5220, 0x3a603: 0x6dba5420, - 0x3a604: 0x6dba5620, 0x3a605: 0x6dba5820, 0x3a606: 0x6dba5a20, 0x3a607: 0x6dba5c20, - 0x3a608: 0x6dba5e20, 0x3a609: 0x6dba6020, 0x3a60a: 0x6dba6220, 0x3a60b: 0x6dba6420, - 0x3a60c: 0x6dba6620, 0x3a60d: 0x6dba6820, 0x3a60e: 0x6dba6a20, 0x3a60f: 0x6dba6c20, - 0x3a610: 0x6dba6e20, 0x3a611: 0x6dba7020, 0x3a612: 0x6dba7220, 0x3a613: 0x6dba7420, - 0x3a614: 0x6dba7620, 0x3a615: 0x6dba7820, 0x3a616: 0x6dba7a20, 0x3a617: 0x6dba7c20, - 0x3a618: 0x6dba7e20, 0x3a619: 0x6dba8020, 0x3a61a: 0x6dba8220, 0x3a61b: 0x6dba8420, - 0x3a61c: 0x6dba8620, 0x3a61d: 0x6dba8820, 0x3a61e: 0x6dba8a20, 0x3a61f: 0x6dba8c20, - 0x3a620: 0x6dba8e20, 0x3a621: 0x6dba9020, 0x3a622: 0x6dba9220, 0x3a623: 0x6dba9420, - 0x3a624: 0x6dba9620, 0x3a625: 0x6dba9820, 0x3a626: 0x6dba9a20, 0x3a627: 0x6dba9c20, - 0x3a628: 0x6dba9e20, 0x3a629: 0x6dbaa020, 0x3a62a: 0x6dbaa220, 0x3a62b: 0x6dbaa420, - 0x3a62c: 0x6dbaa620, 0x3a62d: 0x6dbaa820, 0x3a62e: 0x6dbaaa20, 0x3a62f: 0x6dbaac20, - 0x3a630: 0x6dbaae20, 0x3a631: 0x6dbab020, 0x3a632: 0x6dbab220, 0x3a633: 0x6dbab420, - 0x3a634: 0x6dbab620, 0x3a635: 0x6dbab820, 0x3a636: 0x6dbaba20, 0x3a637: 0x6dbabc20, - 0x3a638: 0x6dbabe20, 0x3a639: 0x6dbac020, 0x3a63a: 0x6dbac220, 0x3a63b: 0x6dbac420, - 0x3a63c: 0x6dbac620, 0x3a63d: 0x6dbac820, 0x3a63e: 0x6dbaca20, 0x3a63f: 0x6dbacc20, - // Block 0xe99, offset 0x3a640 - 0x3a640: 0x6dbace20, 0x3a641: 0x6dbad020, 0x3a642: 0x6dbad220, 0x3a643: 0x6dbad420, - 0x3a644: 0x6dbad620, 0x3a645: 0x6dbad820, 0x3a646: 0x6dbada20, 0x3a647: 0x6dd85a20, - 0x3a648: 0x6dd85c20, 0x3a649: 0x6dd85e20, 0x3a64a: 0x6dd86020, 0x3a64b: 0x6dd86220, - 0x3a64c: 0x6dd86420, 0x3a64d: 0x6dd86620, 0x3a64e: 0x6dd86820, 0x3a64f: 0x6dd86a20, - 0x3a650: 0x6dd86c20, 0x3a651: 0x6dd86e20, 0x3a652: 0x6dd87020, 0x3a653: 0x6dd87220, - 0x3a654: 0x6dd87420, 0x3a655: 0x6dd87620, 0x3a656: 0x6dd87820, 0x3a657: 0x6dd87a20, - 0x3a658: 0x6dd87c20, 0x3a659: 0x6dd87e20, 0x3a65a: 0x6dd88020, 0x3a65b: 0x6dd88220, - 0x3a65c: 0x6dd88420, 0x3a65d: 0x6dd88620, 0x3a65e: 0x6dd88820, 0x3a65f: 0x6dd88a20, - 0x3a660: 0x6dd88c20, 0x3a661: 0x6dd88e20, 0x3a662: 0x6dd89020, 0x3a663: 0x6dd89220, - 0x3a664: 0x6dd89420, 0x3a665: 0x6dd89620, 0x3a666: 0x6dd89820, 0x3a667: 0x6dd89a20, - 0x3a668: 0x6dd89c20, 0x3a669: 0x6dd89e20, 0x3a66a: 0x6dd8a020, 0x3a66b: 0x6dd8a220, - 0x3a66c: 0x6dd8a420, 0x3a66d: 0x6dd8a620, 0x3a66e: 0x6dd8a820, 0x3a66f: 0x6dd8aa20, - 0x3a670: 0x6dd8ac20, 0x3a671: 0x6dd8ae20, 0x3a672: 0x6dd8b020, 0x3a673: 0x6dd8b220, - 0x3a674: 0x6dd8b420, 0x3a675: 0x6dd8b620, 0x3a676: 0x6dd8b820, 0x3a677: 0x6dd8ba20, - 0x3a678: 0x6dd8bc20, 0x3a679: 0x6dd8be20, 0x3a67a: 0x6dd8c020, 0x3a67b: 0x6dd8c220, - 0x3a67c: 0x6dd8c420, 0x3a67d: 0x6dd8c620, 0x3a67e: 0x6dd8c820, 0x3a67f: 0x6dd8ca20, - // Block 0xe9a, offset 0x3a680 - 0x3a680: 0x6dd8cc20, 0x3a681: 0x6dd8ce20, 0x3a682: 0x6dd8d020, 0x3a683: 0x6dd8d220, - 0x3a684: 0x6dd8d420, 0x3a685: 0x6dd8d620, 0x3a686: 0x6dd8d820, 0x3a687: 0x6dd8da20, - 0x3a688: 0x6dd8dc20, 0x3a689: 0x6dd8de20, 0x3a68a: 0x6dd8e020, 0x3a68b: 0x6dd8e220, - 0x3a68c: 0x6dd8e420, 0x3a68d: 0x6dd8e620, 0x3a68e: 0x6dd8e820, 0x3a68f: 0x6df0d820, - 0x3a690: 0x6df0da20, 0x3a691: 0x6df0dc20, 0x3a692: 0x6df0de20, 0x3a693: 0x6df0e020, - 0x3a694: 0x6df0e220, 0x3a695: 0x6df0e420, 0x3a696: 0x6df0e620, 0x3a697: 0x6df0e820, - 0x3a698: 0x6df0ea20, 0x3a699: 0x6df0ec20, 0x3a69a: 0x6df0ee20, 0x3a69b: 0x6df0f020, - 0x3a69c: 0x6df0f220, 0x3a69d: 0x6df0f420, 0x3a69e: 0x6df0f620, 0x3a69f: 0x6df0f820, - 0x3a6a0: 0x6df0fa20, 0x3a6a1: 0x6df0fc20, 0x3a6a2: 0x6df0fe20, 0x3a6a3: 0x6df10020, - 0x3a6a4: 0x6df10220, 0x3a6a5: 0x6df10420, 0x3a6a6: 0x6df10620, 0x3a6a7: 0x6df10820, - 0x3a6a8: 0x6df10a20, 0x3a6a9: 0x6df10c20, 0x3a6aa: 0x6df10e20, 0x3a6ab: 0x6df11020, - 0x3a6ac: 0x6df11220, 0x3a6ad: 0x6df11420, 0x3a6ae: 0x6df11620, 0x3a6af: 0x6df11820, - 0x3a6b0: 0x6df11a20, 0x3a6b1: 0x6df11c20, 0x3a6b2: 0x6df11e20, 0x3a6b3: 0x6df12020, - 0x3a6b4: 0x6df12220, 0x3a6b5: 0x6df12420, 0x3a6b6: 0x6df12620, 0x3a6b7: 0x6df12820, - 0x3a6b8: 0x6df12a20, 0x3a6b9: 0x6df12c20, 0x3a6ba: 0x6df12e20, 0x3a6bb: 0x6df13020, - 0x3a6bc: 0x6df13220, 0x3a6bd: 0x6df13420, 0x3a6be: 0x6df13620, 0x3a6bf: 0x6df13820, - // Block 0xe9b, offset 0x3a6c0 - 0x3a6c0: 0x6df13a20, 0x3a6c1: 0x6df13c20, 0x3a6c2: 0x6df13e20, 0x3a6c3: 0x6df14020, - 0x3a6c4: 0x6df14220, 0x3a6c5: 0x6df14420, 0x3a6c6: 0x6df14620, 0x3a6c7: 0x6df14820, - 0x3a6c8: 0x6df14a20, 0x3a6c9: 0x6df14c20, 0x3a6ca: 0x6df14e20, 0x3a6cb: 0x6df15020, - 0x3a6cc: 0x6df15220, 0x3a6cd: 0x6e04e420, 0x3a6ce: 0x6e04e620, 0x3a6cf: 0x6e04e820, - 0x3a6d0: 0x6e04ea20, 0x3a6d1: 0x6e04ec20, 0x3a6d2: 0x6e04ee20, 0x3a6d3: 0x6e04f020, - 0x3a6d4: 0x6e04f220, 0x3a6d5: 0x6e15c420, 0x3a6d6: 0x6e04f420, 0x3a6d7: 0x6e04f620, - 0x3a6d8: 0x6e04f820, 0x3a6d9: 0x6e04fa20, 0x3a6da: 0x6e04fc20, 0x3a6db: 0x6e04fe20, - 0x3a6dc: 0x6e050020, 0x3a6dd: 0x6e050220, 0x3a6de: 0x6e050420, 0x3a6df: 0x6e050620, - 0x3a6e0: 0x6e050820, 0x3a6e1: 0x6e050a20, 0x3a6e2: 0x6e050c20, 0x3a6e3: 0x6e050e20, - 0x3a6e4: 0x6e051020, 0x3a6e5: 0x6e051220, 0x3a6e6: 0x6e051420, 0x3a6e7: 0x6e051620, - 0x3a6e8: 0x6e051820, 0x3a6e9: 0x6e051a20, 0x3a6ea: 0x6e051c20, 0x3a6eb: 0x6e051e20, - 0x3a6ec: 0x6e052020, 0x3a6ed: 0x6e052220, 0x3a6ee: 0x6e052420, 0x3a6ef: 0x6e052620, - 0x3a6f0: 0x6e052820, 0x3a6f1: 0x6e052a20, 0x3a6f2: 0x6e052c20, 0x3a6f3: 0x6e052e20, - 0x3a6f4: 0x6e053020, 0x3a6f5: 0x6e053220, 0x3a6f6: 0x6e053420, 0x3a6f7: 0x6e053620, - 0x3a6f8: 0x6e053820, 0x3a6f9: 0x6e053a20, 0x3a6fa: 0x6e053c20, 0x3a6fb: 0x6e053e20, - 0x3a6fc: 0x6e054020, 0x3a6fd: 0x6e054220, 0x3a6fe: 0x6e054420, 0x3a6ff: 0x6e054620, - // Block 0xe9c, offset 0x3a700 - 0x3a700: 0x6e054820, 0x3a701: 0x6e054a20, 0x3a702: 0x6e054c20, 0x3a703: 0x6e054e20, - 0x3a704: 0x6e055020, 0x3a705: 0x6e055220, 0x3a706: 0x6e055420, 0x3a707: 0x6e055620, - 0x3a708: 0x6e055820, 0x3a709: 0x6e055a20, 0x3a70a: 0x6e055c20, 0x3a70b: 0x6e055e20, - 0x3a70c: 0x6e056020, 0x3a70d: 0x6e056220, 0x3a70e: 0x6e056420, 0x3a70f: 0x6e056620, - 0x3a710: 0x6e056820, 0x3a711: 0x6e056a20, 0x3a712: 0x6e056c20, 0x3a713: 0x6e056e20, - 0x3a714: 0x6e057020, 0x3a715: 0x6e15c620, 0x3a716: 0x6e15c820, 0x3a717: 0x6e15ca20, - 0x3a718: 0x6e15cc20, 0x3a719: 0x6e15ce20, 0x3a71a: 0x6e15d020, 0x3a71b: 0x6e15d220, - 0x3a71c: 0x6e15d420, 0x3a71d: 0x6e15d620, 0x3a71e: 0x6e15d820, 0x3a71f: 0x6e15da20, - 0x3a720: 0x6e15dc20, 0x3a721: 0x6e15de20, 0x3a722: 0x6e15e020, 0x3a723: 0x6e15e220, - 0x3a724: 0x6e15e420, 0x3a725: 0x6e15e620, 0x3a726: 0x6e15e820, 0x3a727: 0x6e15ea20, - 0x3a728: 0x6e15ec20, 0x3a729: 0x6e15ee20, 0x3a72a: 0x6e15f020, 0x3a72b: 0x6e15f220, - 0x3a72c: 0x6e15f420, 0x3a72d: 0x6e15f620, 0x3a72e: 0x6e15f820, 0x3a72f: 0x6e15fa20, - 0x3a730: 0x6e15fc20, 0x3a731: 0x6e15fe20, 0x3a732: 0x6e160020, 0x3a733: 0x6e160220, - 0x3a734: 0x6e160420, 0x3a735: 0x6e160620, 0x3a736: 0x6e160820, 0x3a737: 0x6e160a20, - 0x3a738: 0x6e160c20, 0x3a739: 0x6e160e20, 0x3a73a: 0x6e161020, 0x3a73b: 0x6e161220, - 0x3a73c: 0x6e161420, 0x3a73d: 0x6e161620, 0x3a73e: 0x6e161820, 0x3a73f: 0x6e161a20, - // Block 0xe9d, offset 0x3a740 - 0x3a740: 0x6e161c20, 0x3a741: 0x6e161e20, 0x3a742: 0x6e162020, 0x3a743: 0x6e162220, - 0x3a744: 0x6e162420, 0x3a745: 0x6e162620, 0x3a746: 0x6e162820, 0x3a747: 0x6e162a20, - 0x3a748: 0x6e162c20, 0x3a749: 0x6e162e20, 0x3a74a: 0x6e163020, 0x3a74b: 0x6e163220, - 0x3a74c: 0x6e163420, 0x3a74d: 0x6e163620, 0x3a74e: 0x6e163820, 0x3a74f: 0x6e163a20, - 0x3a750: 0x6e163c20, 0x3a751: 0x6e163e20, 0x3a752: 0x6e233e20, 0x3a753: 0x6e234020, - 0x3a754: 0x6e234220, 0x3a755: 0x6e234420, 0x3a756: 0x6e234620, 0x3a757: 0x6e234820, - 0x3a758: 0x6e234a20, 0x3a759: 0x6e234c20, 0x3a75a: 0x6e234e20, 0x3a75b: 0x6e235020, - 0x3a75c: 0x6e235220, 0x3a75d: 0x6e235420, 0x3a75e: 0x6e235620, 0x3a75f: 0x6e235820, - 0x3a760: 0x6e235a20, 0x3a761: 0x6e235c20, 0x3a762: 0x6e235e20, 0x3a763: 0x6e236020, - 0x3a764: 0x6e236220, 0x3a765: 0x6e236420, 0x3a766: 0x6e236620, 0x3a767: 0x6e236820, - 0x3a768: 0x6e236a20, 0x3a769: 0x6e236c20, 0x3a76a: 0x6e236e20, 0x3a76b: 0x6e237020, - 0x3a76c: 0x6e237220, 0x3a76d: 0x6e237420, 0x3a76e: 0x6e237620, 0x3a76f: 0x6e237820, - 0x3a770: 0x6e237a20, 0x3a771: 0x6e237c20, 0x3a772: 0x6e237e20, 0x3a773: 0x6e238020, - 0x3a774: 0x6e238220, 0x3a775: 0x6e238420, 0x3a776: 0x6e238620, 0x3a777: 0x6e238820, - 0x3a778: 0x6e2d6a20, 0x3a779: 0x6e2d6c20, 0x3a77a: 0x6e2d6e20, 0x3a77b: 0x6e2d7020, - 0x3a77c: 0x6e2d7220, 0x3a77d: 0x6e2d7420, 0x3a77e: 0x6e2d7620, 0x3a77f: 0x6e2d7820, - // Block 0xe9e, offset 0x3a780 - 0x3a780: 0x6e2d7a20, 0x3a781: 0x6e2d7c20, 0x3a782: 0x6e2d7e20, 0x3a783: 0x6e2d8020, - 0x3a784: 0x6e2d8220, 0x3a785: 0x6e2d8420, 0x3a786: 0x6e2d8620, 0x3a787: 0x6e2d8820, - 0x3a788: 0x6e2d8a20, 0x3a789: 0x6e2d8c20, 0x3a78a: 0x6e2d8e20, 0x3a78b: 0x6e2d9020, - 0x3a78c: 0x6e2d9220, 0x3a78d: 0x6e2d9420, 0x3a78e: 0x6e2d9620, 0x3a78f: 0x6e2d9820, - 0x3a790: 0x6e2d9a20, 0x3a791: 0x6e2d9c20, 0x3a792: 0x6e2d9e20, 0x3a793: 0x6e2da020, - 0x3a794: 0x6e2da220, 0x3a795: 0x6e2da420, 0x3a796: 0x6e2da620, 0x3a797: 0x6e2da820, - 0x3a798: 0x6e2daa20, 0x3a799: 0x6e2dac20, 0x3a79a: 0x6e2dae20, 0x3a79b: 0x6e2db020, - 0x3a79c: 0x6e2db220, 0x3a79d: 0x6e352620, 0x3a79e: 0x6e352820, 0x3a79f: 0x6e352a20, - 0x3a7a0: 0x6e352c20, 0x3a7a1: 0x6e352e20, 0x3a7a2: 0x6e353020, 0x3a7a3: 0x6e353220, - 0x3a7a4: 0x6e353420, 0x3a7a5: 0x6e353620, 0x3a7a6: 0x6e353820, 0x3a7a7: 0x6e353a20, - 0x3a7a8: 0x6e353c20, 0x3a7a9: 0x6e353e20, 0x3a7aa: 0x6e354020, 0x3a7ab: 0x6e354220, - 0x3a7ac: 0x6e354420, 0x3a7ad: 0x6e354620, 0x3a7ae: 0x6e354820, 0x3a7af: 0x6e354a20, - 0x3a7b0: 0x6e354c20, 0x3a7b1: 0x6e354e20, 0x3a7b2: 0x6e355020, 0x3a7b3: 0x6e355220, - 0x3a7b4: 0x6e355420, 0x3a7b5: 0x6e355620, 0x3a7b6: 0x6e355820, 0x3a7b7: 0x6e355a20, - 0x3a7b8: 0x6e355c20, 0x3a7b9: 0x6e355e20, 0x3a7ba: 0x6e3ac220, 0x3a7bb: 0x6e3ac420, - 0x3a7bc: 0x6e3ac620, 0x3a7bd: 0x6e3ac820, 0x3a7be: 0x6e3aca20, 0x3a7bf: 0x6e3acc20, - // Block 0xe9f, offset 0x3a7c0 - 0x3a7c0: 0x6e3ace20, 0x3a7c1: 0x6e3ad020, 0x3a7c2: 0x6e3ad220, 0x3a7c3: 0x6e3ad420, - 0x3a7c4: 0x6e3ad620, 0x3a7c5: 0x6e3ad820, 0x3a7c6: 0x6e3ada20, 0x3a7c7: 0x6e3adc20, - 0x3a7c8: 0x6e3ade20, 0x3a7c9: 0x6e3e8420, 0x3a7ca: 0x6e3e8620, 0x3a7cb: 0x6e3e8820, - 0x3a7cc: 0x6e3e8a20, 0x3a7cd: 0x6e3e8c20, 0x3a7ce: 0x6e3e8e20, 0x3a7cf: 0x6e3e9020, - 0x3a7d0: 0x6e3e9220, 0x3a7d1: 0x6e3e9420, 0x3a7d2: 0x6e3e9620, 0x3a7d3: 0x6e3e9820, - 0x3a7d4: 0x6e3e9a20, 0x3a7d5: 0x6e3e9c20, 0x3a7d6: 0x6e3e9e20, 0x3a7d7: 0x6e3ea020, - 0x3a7d8: 0x6e3ea220, 0x3a7d9: 0x6e3ea420, 0x3a7da: 0x6e3ea620, 0x3a7db: 0x6e3ea820, - 0x3a7dc: 0x6e3eaa20, 0x3a7dd: 0x6e3eac20, 0x3a7de: 0x6e414820, 0x3a7df: 0x6e414a20, - 0x3a7e0: 0x6e414c20, 0x3a7e1: 0x6e414e20, 0x3a7e2: 0x6e415020, 0x3a7e3: 0x6e415220, - 0x3a7e4: 0x6e415420, 0x3a7e5: 0x6e415620, 0x3a7e6: 0x6e415820, 0x3a7e7: 0x6e415a20, - 0x3a7e8: 0x6e415c20, 0x3a7e9: 0x6e434820, 0x3a7ea: 0x6e434a20, 0x3a7eb: 0x6e434c20, - 0x3a7ec: 0x6e434e20, 0x3a7ed: 0x6e435020, 0x3a7ee: 0x6e435220, 0x3a7ef: 0x6e435420, - 0x3a7f0: 0x6e435620, 0x3a7f1: 0x6e3ae020, 0x3a7f2: 0x6e449820, 0x3a7f3: 0x6e449a20, - 0x3a7f4: 0x6e449c20, 0x3a7f5: 0x6e449e20, 0x3a7f6: 0x6e44a020, 0x3a7f7: 0x6e456820, - 0x3a7f8: 0x6e456a20, 0x3a7f9: 0x6e456c20, 0x3a7fa: 0x6e45e620, 0x3a7fb: 0x6e464020, - 0x3a7fc: 0x6e46d020, 0x3a7fd: 0x6e471620, 0x3a7fe: 0x6c41f620, 0x3a7ff: 0x6c41f820, - // Block 0xea0, offset 0x3a800 - 0x3a800: 0x6c629620, 0x3a801: 0x6c629820, 0x3a802: 0x6c629a20, 0x3a803: 0x6c897220, - 0x3a804: 0x6c897420, 0x3a805: 0x6c897620, 0x3a806: 0x6c897820, 0x3a807: 0x6ce56620, - 0x3a808: 0x6ce56820, 0x3a809: 0x6d13dc20, 0x3a80a: 0x6d13de20, 0x3a80b: 0x6d13e020, - 0x3a80c: 0x6d13e220, 0x3a80d: 0x6d6ef220, 0x3a80e: 0x6d41ec20, 0x3a80f: 0x6d6ef420, - 0x3a810: 0x6d980420, 0x3a811: 0x6dbb0620, 0x3a812: 0x6d980620, 0x3a813: 0x6dbb0820, - 0x3a814: 0x6dbb0a20, 0x3a815: 0x6dd90820, 0x3a816: 0x6dd90a20, 0x3a817: 0x6c280020, - 0x3a818: 0x6c280220, 0x3a819: 0x6c62aa20, 0x3a81a: 0x6cb58e20, 0x3a81b: 0x6cb59020, - 0x3a81c: 0x6cb59220, 0x3a81d: 0x6cb59420, 0x3a81e: 0x6cb59620, 0x3a81f: 0x6cb59820, - 0x3a820: 0x6cb59a20, 0x3a821: 0x6cb59c20, 0x3a822: 0x6cb59e20, 0x3a823: 0x6cb5a020, - 0x3a824: 0x6cb5a220, 0x3a825: 0x6cb5a420, 0x3a826: 0x6ce57420, 0x3a827: 0x6ce57620, - 0x3a828: 0x6ce57820, 0x3a829: 0x6ce57a20, 0x3a82a: 0x6ce57c20, 0x3a82b: 0x6ce57e20, - 0x3a82c: 0x6ce58020, 0x3a82d: 0x6ce58220, 0x3a82e: 0x6ce58420, 0x3a82f: 0x6ce58620, - 0x3a830: 0x6ce58820, 0x3a831: 0x6ce58a20, 0x3a832: 0x6d13fa20, 0x3a833: 0x6d13fc20, - 0x3a834: 0x6d13fe20, 0x3a835: 0x6d140020, 0x3a836: 0x6d140220, 0x3a837: 0x6d140420, - 0x3a838: 0x6d140620, 0x3a839: 0x6d140820, 0x3a83a: 0x6d140a20, 0x3a83b: 0x6d140c20, - 0x3a83c: 0x6d140e20, 0x3a83d: 0x6d141020, 0x3a83e: 0x6d141220, 0x3a83f: 0x6d141420, - // Block 0xea1, offset 0x3a840 - 0x3a840: 0x6d41fe20, 0x3a841: 0x6d420020, 0x3a842: 0x6d420220, 0x3a843: 0x6d420420, - 0x3a844: 0x6d420620, 0x3a845: 0x6d420820, 0x3a846: 0x6d420a20, 0x3a847: 0x6d6f0220, - 0x3a848: 0x6d6f0420, 0x3a849: 0x6d6f0620, 0x3a84a: 0x6d6f0820, 0x3a84b: 0x6d6f0a20, - 0x3a84c: 0x6d6f0c20, 0x3a84d: 0x6d6f0e20, 0x3a84e: 0x6d6f1020, 0x3a84f: 0x6d6f1220, - 0x3a850: 0x6d6f1420, 0x3a851: 0x6d6f1620, 0x3a852: 0x6d6f1820, 0x3a853: 0x6d980e20, - 0x3a854: 0x6d981020, 0x3a855: 0x6d981220, 0x3a856: 0x6d981420, 0x3a857: 0x6d981620, - 0x3a858: 0x6d981820, 0x3a859: 0x6d981a20, 0x3a85a: 0x6d981c20, 0x3a85b: 0x6d981e20, - 0x3a85c: 0x6d982020, 0x3a85d: 0x6d982220, 0x3a85e: 0x6dbb1620, 0x3a85f: 0x6dbb1820, - 0x3a860: 0x6dbb1a20, 0x3a861: 0x6dbb1c20, 0x3a862: 0x6dbb1e20, 0x3a863: 0x6dbb2020, - 0x3a864: 0x6dbb2220, 0x3a865: 0x6dd91020, 0x3a866: 0x6dd91220, 0x3a867: 0x6dd91420, - 0x3a868: 0x6dd91620, 0x3a869: 0x6dd91820, 0x3a86a: 0x6dd91a20, 0x3a86b: 0x6dd91c20, - 0x3a86c: 0x6dd91e20, 0x3a86d: 0x6df16820, 0x3a86e: 0x6df16a20, 0x3a86f: 0x6df16c20, - 0x3a870: 0x6df16e20, 0x3a871: 0x6df17020, 0x3a872: 0x6df17220, 0x3a873: 0x6e059620, - 0x3a874: 0x6e059820, 0x3a875: 0x6e059a20, 0x3a876: 0x6e059c20, 0x3a877: 0x6e059e20, - 0x3a878: 0x6e165020, 0x3a879: 0x6e165220, 0x3a87a: 0x6e165420, 0x3a87b: 0x6e239a20, - 0x3a87c: 0x6e239c20, 0x3a87d: 0x6e239e20, 0x3a87e: 0x6e23a020, 0x3a87f: 0x6e23a220, - // Block 0xea2, offset 0x3a880 - 0x3a880: 0x6e2dba20, 0x3a881: 0x6e2dbc20, 0x3a882: 0x6e356820, 0x3a883: 0x6e356a20, - 0x3a884: 0x6e3eb020, 0x3a885: 0x6e435a20, 0x3a886: 0x6e44a220, 0x3a887: 0x6c420420, - 0x3a888: 0x6c420620, 0x3a889: 0x6c62b020, 0x3a88a: 0x6c898a20, 0x3a88b: 0x6c898c20, - 0x3a88c: 0x6c898e20, 0x3a88d: 0x6c899020, 0x3a88e: 0x6c899220, 0x3a88f: 0x6c899420, - 0x3a890: 0x6cb5b420, 0x3a891: 0x6cb5b620, 0x3a892: 0x6cb5b820, 0x3a893: 0x6cb5ba20, - 0x3a894: 0x6cb5bc20, 0x3a895: 0x6cb5be20, 0x3a896: 0x6cb5c020, 0x3a897: 0x6ce5ae20, - 0x3a898: 0x6ce5b020, 0x3a899: 0x6ce5b220, 0x3a89a: 0x6ce5b420, 0x3a89b: 0x6ce5b620, - 0x3a89c: 0x6ce5b820, 0x3a89d: 0x6ce5ba20, 0x3a89e: 0x6ce5bc20, 0x3a89f: 0x6ce5be20, - 0x3a8a0: 0x6ce5c020, 0x3a8a1: 0x6ce5c220, 0x3a8a2: 0x6ce5c420, 0x3a8a3: 0x6ce5c620, - 0x3a8a4: 0x6ce5c820, 0x3a8a5: 0x6ce5ca20, 0x3a8a6: 0x6ce5cc20, 0x3a8a7: 0x6ce5ce20, - 0x3a8a8: 0x6ce5d020, 0x3a8a9: 0x6ce5d220, 0x3a8aa: 0x6ce5d420, 0x3a8ab: 0x6ce5d620, - 0x3a8ac: 0x6ce5d820, 0x3a8ad: 0x6ce5da20, 0x3a8ae: 0x6ce5dc20, 0x3a8af: 0x6ce5de20, - 0x3a8b0: 0x6ce5e020, 0x3a8b1: 0x6ce5e220, 0x3a8b2: 0x6ce5e420, 0x3a8b3: 0x6d143020, - 0x3a8b4: 0x6d143220, 0x3a8b5: 0x6d143420, 0x3a8b6: 0x6d143620, 0x3a8b7: 0x6d143820, - 0x3a8b8: 0x6d143a20, 0x3a8b9: 0x6d143c20, 0x3a8ba: 0x6d143e20, 0x3a8bb: 0x6d144020, - 0x3a8bc: 0x6d144220, 0x3a8bd: 0x6d144420, 0x3a8be: 0x6d144620, 0x3a8bf: 0x6d144820, - // Block 0xea3, offset 0x3a8c0 - 0x3a8c0: 0x6d144a20, 0x3a8c1: 0x6d144c20, 0x3a8c2: 0x6d144e20, 0x3a8c3: 0x6d145020, - 0x3a8c4: 0x6d145220, 0x3a8c5: 0x6d145420, 0x3a8c6: 0x6d145620, 0x3a8c7: 0x6d145820, - 0x3a8c8: 0x6d145a20, 0x3a8c9: 0x6d145c20, 0x3a8ca: 0x6d145e20, 0x3a8cb: 0x6d146020, - 0x3a8cc: 0x6d146220, 0x3a8cd: 0x6d422e20, 0x3a8ce: 0x6d423020, 0x3a8cf: 0x6d423220, - 0x3a8d0: 0x6d423420, 0x3a8d1: 0x6d423620, 0x3a8d2: 0x6d423820, 0x3a8d3: 0x6d423a20, - 0x3a8d4: 0x6d423c20, 0x3a8d5: 0x6d423e20, 0x3a8d6: 0x6d424020, 0x3a8d7: 0x6d424220, - 0x3a8d8: 0x6d424420, 0x3a8d9: 0x6d424620, 0x3a8da: 0x6d424820, 0x3a8db: 0x6d424a20, - 0x3a8dc: 0x6d424c20, 0x3a8dd: 0x6d424e20, 0x3a8de: 0x6d425020, 0x3a8df: 0x6d425220, - 0x3a8e0: 0x6d425420, 0x3a8e1: 0x6d425620, 0x3a8e2: 0x6d425820, 0x3a8e3: 0x6d425a20, - 0x3a8e4: 0x6d425c20, 0x3a8e5: 0x6d425e20, 0x3a8e6: 0x6d426020, 0x3a8e7: 0x6d6f3820, - 0x3a8e8: 0x6d6f3a20, 0x3a8e9: 0x6d6f3c20, 0x3a8ea: 0x6d6f3e20, 0x3a8eb: 0x6d6f4020, - 0x3a8ec: 0x6d6f4220, 0x3a8ed: 0x6d6f4420, 0x3a8ee: 0x6d6f4620, 0x3a8ef: 0x6d6f4820, - 0x3a8f0: 0x6d6f4a20, 0x3a8f1: 0x6d6f4c20, 0x3a8f2: 0x6d6f4e20, 0x3a8f3: 0x6d6f5020, - 0x3a8f4: 0x6d6f5220, 0x3a8f5: 0x6d6f5420, 0x3a8f6: 0x6d6f5620, 0x3a8f7: 0x6d6f5820, - 0x3a8f8: 0x6d6f5a20, 0x3a8f9: 0x6d6f5c20, 0x3a8fa: 0x6d6f5e20, 0x3a8fb: 0x6d6f6020, - 0x3a8fc: 0x6d6f6220, 0x3a8fd: 0x6d6f6420, 0x3a8fe: 0x6d6f6620, 0x3a8ff: 0x6d6f6820, - // Block 0xea4, offset 0x3a900 - 0x3a900: 0x6d6f6a20, 0x3a901: 0x6d6f6c20, 0x3a902: 0x6d6f6e20, 0x3a903: 0x6d6f7020, - 0x3a904: 0x6d6f7220, 0x3a905: 0x6d6f7420, 0x3a906: 0x6d6f7620, 0x3a907: 0x6d6f7820, - 0x3a908: 0x6d984e20, 0x3a909: 0x6d985020, 0x3a90a: 0x6d985220, 0x3a90b: 0x6d985420, - 0x3a90c: 0x6d985620, 0x3a90d: 0x6d985820, 0x3a90e: 0x6d985a20, 0x3a90f: 0x6d985c20, - 0x3a910: 0x6d985e20, 0x3a911: 0x6d986020, 0x3a912: 0x6d986220, 0x3a913: 0x6d986420, - 0x3a914: 0x6d986620, 0x3a915: 0x6d986820, 0x3a916: 0x6d986a20, 0x3a917: 0x6d986c20, - 0x3a918: 0x6d986e20, 0x3a919: 0x6d987020, 0x3a91a: 0x6d987220, 0x3a91b: 0x6d987420, - 0x3a91c: 0x6d987620, 0x3a91d: 0x6d987820, 0x3a91e: 0x6d987a20, 0x3a91f: 0x6d987c20, - 0x3a920: 0x6d987e20, 0x3a921: 0x6d988020, 0x3a922: 0x6d988220, 0x3a923: 0x6d988420, - 0x3a924: 0x6d988620, 0x3a925: 0x6dbb4e20, 0x3a926: 0x6dbb5020, 0x3a927: 0x6dbb5220, - 0x3a928: 0x6dbb5420, 0x3a929: 0x6dbb5620, 0x3a92a: 0x6dbb5820, 0x3a92b: 0x6dbb5a20, - 0x3a92c: 0x6dbb5c20, 0x3a92d: 0x6dbb5e20, 0x3a92e: 0x6dbb6020, 0x3a92f: 0x6dbb6220, - 0x3a930: 0x6dbb6420, 0x3a931: 0x6dbb6620, 0x3a932: 0x6dbb6820, 0x3a933: 0x6dbb6a20, - 0x3a934: 0x6dbb6c20, 0x3a935: 0x6dbb6e20, 0x3a936: 0x6dbb7020, 0x3a937: 0x6dbb7220, - 0x3a938: 0x6dbb7420, 0x3a939: 0x6dbb7620, 0x3a93a: 0x6dbb7820, 0x3a93b: 0x6dbb7a20, - 0x3a93c: 0x6dbb7c20, 0x3a93d: 0x6dbb7e20, 0x3a93e: 0x6dbb8020, 0x3a93f: 0x6dbb8220, - // Block 0xea5, offset 0x3a940 - 0x3a940: 0x6dd93220, 0x3a941: 0x6dd93420, 0x3a942: 0x6dd93620, 0x3a943: 0x6dd93820, - 0x3a944: 0x6dd93a20, 0x3a945: 0x6dd93c20, 0x3a946: 0x6dd93e20, 0x3a947: 0x6dd94020, - 0x3a948: 0x6dd94220, 0x3a949: 0x6dd94420, 0x3a94a: 0x6dd94620, 0x3a94b: 0x6dd94820, - 0x3a94c: 0x6dd94a20, 0x3a94d: 0x6dd94c20, 0x3a94e: 0x6dd94e20, 0x3a94f: 0x6dd95020, - 0x3a950: 0x6dd95220, 0x3a951: 0x6dd95420, 0x3a952: 0x6dd95620, 0x3a953: 0x6dd95820, - 0x3a954: 0x6dd95a20, 0x3a955: 0x6dd95c20, 0x3a956: 0x6dd95e20, 0x3a957: 0x6dd96020, - 0x3a958: 0x6dd96220, 0x3a959: 0x6dd96420, 0x3a95a: 0x6dd96620, 0x3a95b: 0x6dd96820, - 0x3a95c: 0x6df18020, 0x3a95d: 0x6df18220, 0x3a95e: 0x6df18420, 0x3a95f: 0x6df18620, - 0x3a960: 0x6df18820, 0x3a961: 0x6df18a20, 0x3a962: 0x6df18c20, 0x3a963: 0x6df18e20, - 0x3a964: 0x6df19020, 0x3a965: 0x6df19220, 0x3a966: 0x6df19420, 0x3a967: 0x6df19620, - 0x3a968: 0x6df19820, 0x3a969: 0x6df19a20, 0x3a96a: 0x6df19c20, 0x3a96b: 0x6df19e20, - 0x3a96c: 0x6e05aa20, 0x3a96d: 0x6e05ac20, 0x3a96e: 0x6e05ae20, 0x3a96f: 0x6e05b020, - 0x3a970: 0x6e05b220, 0x3a971: 0x6e05b420, 0x3a972: 0x6e05b620, 0x3a973: 0x6e05b820, - 0x3a974: 0x6e05ba20, 0x3a975: 0x6e05bc20, 0x3a976: 0x6e05be20, 0x3a977: 0x6e05c020, - 0x3a978: 0x6e05c220, 0x3a979: 0x6e05c420, 0x3a97a: 0x6e05c620, 0x3a97b: 0x6e05c820, - 0x3a97c: 0x6e05ca20, 0x3a97d: 0x6e05cc20, 0x3a97e: 0x6e05ce20, 0x3a97f: 0x6e05d020, - // Block 0xea6, offset 0x3a980 - 0x3a980: 0x6e05d220, 0x3a981: 0x6e05d420, 0x3a982: 0x6e05d620, 0x3a983: 0x6e166620, - 0x3a984: 0x6e166820, 0x3a985: 0x6e166a20, 0x3a986: 0x6e166c20, 0x3a987: 0x6e166e20, - 0x3a988: 0x6e167020, 0x3a989: 0x6e167220, 0x3a98a: 0x6e167420, 0x3a98b: 0x6e167620, - 0x3a98c: 0x6e167820, 0x3a98d: 0x6e167a20, 0x3a98e: 0x6e167c20, 0x3a98f: 0x6e167e20, - 0x3a990: 0x6e168020, 0x3a991: 0x6e168220, 0x3a992: 0x6e168420, 0x3a993: 0x6e168620, - 0x3a994: 0x6e23a820, 0x3a995: 0x6e168820, 0x3a996: 0x6e168a20, 0x3a997: 0x6e168c20, - 0x3a998: 0x6e23aa20, 0x3a999: 0x6e23ac20, 0x3a99a: 0x6e23ae20, 0x3a99b: 0x6e23b020, - 0x3a99c: 0x6e23b220, 0x3a99d: 0x6e23b420, 0x3a99e: 0x6e23b620, 0x3a99f: 0x6e2dbe20, - 0x3a9a0: 0x6e2dc020, 0x3a9a1: 0x6e2dc220, 0x3a9a2: 0x6e2dc420, 0x3a9a3: 0x6e2dc620, - 0x3a9a4: 0x6e2dc820, 0x3a9a5: 0x6e2dca20, 0x3a9a6: 0x6e356c20, 0x3a9a7: 0x6e356e20, - 0x3a9a8: 0x6e357020, 0x3a9a9: 0x6e357220, 0x3a9aa: 0x6e357420, 0x3a9ab: 0x6e357620, - 0x3a9ac: 0x6e357820, 0x3a9ad: 0x6e357a20, 0x3a9ae: 0x6e357c20, 0x3a9af: 0x6e3ae820, - 0x3a9b0: 0x6e3aea20, 0x3a9b1: 0x6e3aec20, 0x3a9b2: 0x6e3aee20, 0x3a9b3: 0x6e3af020, - 0x3a9b4: 0x6e3af220, 0x3a9b5: 0x6e3af420, 0x3a9b6: 0x6e357e20, 0x3a9b7: 0x6e3eb220, - 0x3a9b8: 0x6e3af620, 0x3a9b9: 0x6e3eb420, 0x3a9ba: 0x6e3eb620, 0x3a9bb: 0x6e416020, - 0x3a9bc: 0x6e44a420, 0x3a9bd: 0x6e464220, 0x3a9be: 0x6e464420, 0x3a9bf: 0x6c159a20, - // Block 0xea7, offset 0x3a9c0 - 0x3a9c0: 0x6c159c20, 0x3a9c1: 0x6c159e20, 0x3a9c2: 0x6c281420, 0x3a9c3: 0x6c281620, - 0x3a9c4: 0x6c62c620, 0x3a9c5: 0x6c62c820, 0x3a9c6: 0x6ce5f420, 0x3a9c7: 0x6ce5f620, - 0x3a9c8: 0x6ce5f820, 0x3a9c9: 0x6d147620, 0x3a9ca: 0x6d147820, 0x3a9cb: 0x6d6f8420, - 0x3a9cc: 0x6d6f8620, 0x3a9cd: 0x6dbb8820, 0x3a9ce: 0x6e05d820, 0x3a9cf: 0x6c00d020, - 0x3a9d0: 0x6c052820, 0x3a9d1: 0x6c052a20, 0x3a9d2: 0x6c052c20, 0x3a9d3: 0x6c052e20, - 0x3a9d4: 0x6c053020, 0x3a9d5: 0x6c053220, 0x3a9d6: 0x6c0ab820, 0x3a9d7: 0x6c0aba20, - 0x3a9d8: 0x6c0abc20, 0x3a9d9: 0x6c0abe20, 0x3a9da: 0x6c15b020, 0x3a9db: 0x6c15b220, - 0x3a9dc: 0x6c15b420, 0x3a9dd: 0x6c15b620, 0x3a9de: 0x6c15b820, 0x3a9df: 0x6c15ba20, - 0x3a9e0: 0x6c15bc20, 0x3a9e1: 0x6c15be20, 0x3a9e2: 0x6c15c020, 0x3a9e3: 0x6c15c220, - 0x3a9e4: 0x6c15c420, 0x3a9e5: 0x6c15c620, 0x3a9e6: 0x6c15c820, 0x3a9e7: 0x6c15ca20, - 0x3a9e8: 0x6c15cc20, 0x3a9e9: 0x6c15ce20, 0x3a9ea: 0x6c284a20, 0x3a9eb: 0x6c284c20, - 0x3a9ec: 0x6c284e20, 0x3a9ed: 0x6c285020, 0x3a9ee: 0x6c285220, 0x3a9ef: 0x6c285420, - 0x3a9f0: 0x6c285620, 0x3a9f1: 0x6c285820, 0x3a9f2: 0x6c285a20, 0x3a9f3: 0x6c285c20, - 0x3a9f4: 0x6c285e20, 0x3a9f5: 0x6c286020, 0x3a9f6: 0x6c286220, 0x3a9f7: 0x6c286420, - 0x3a9f8: 0x6c286620, 0x3a9f9: 0x6c286820, 0x3a9fa: 0x6c286a20, 0x3a9fb: 0x6c286c20, - 0x3a9fc: 0x6c286e20, 0x3a9fd: 0x6c287020, 0x3a9fe: 0x6c287220, 0x3a9ff: 0x6c287420, - // Block 0xea8, offset 0x3aa00 - 0x3aa00: 0x6c287620, 0x3aa01: 0x6c423e20, 0x3aa02: 0x6c424020, 0x3aa03: 0x6c424220, - 0x3aa04: 0x6c424420, 0x3aa05: 0x6c424620, 0x3aa06: 0x6c424820, 0x3aa07: 0x6c424a20, - 0x3aa08: 0x6c424c20, 0x3aa09: 0x6c424e20, 0x3aa0a: 0x6c425020, 0x3aa0b: 0x6c425220, - 0x3aa0c: 0x6c425420, 0x3aa0d: 0x6c425620, 0x3aa0e: 0x6c425820, 0x3aa0f: 0x6c425a20, - 0x3aa10: 0x6c425c20, 0x3aa11: 0x6c425e20, 0x3aa12: 0x6c426020, 0x3aa13: 0x6c426220, - 0x3aa14: 0x6c426420, 0x3aa15: 0x6c426620, 0x3aa16: 0x6c426820, 0x3aa17: 0x6c426a20, - 0x3aa18: 0x6c62ee20, 0x3aa19: 0x6c62f020, 0x3aa1a: 0x6c62f220, 0x3aa1b: 0x6c62f420, - 0x3aa1c: 0x6c62f620, 0x3aa1d: 0x6c62f820, 0x3aa1e: 0x6c62fa20, 0x3aa1f: 0x6c62fc20, - 0x3aa20: 0x6c62fe20, 0x3aa21: 0x6c630020, 0x3aa22: 0x6c630220, 0x3aa23: 0x6c630420, - 0x3aa24: 0x6c630620, 0x3aa25: 0x6c630820, 0x3aa26: 0x6c630a20, 0x3aa27: 0x6c630c20, - 0x3aa28: 0x6c630e20, 0x3aa29: 0x6c631020, 0x3aa2a: 0x6c631220, 0x3aa2b: 0x6c631420, - 0x3aa2c: 0x6c631620, 0x3aa2d: 0x6c631820, 0x3aa2e: 0x6c631a20, 0x3aa2f: 0x6c631c20, - 0x3aa30: 0x6c631e20, 0x3aa31: 0x6c632020, 0x3aa32: 0x6c632220, 0x3aa33: 0x6c632420, - 0x3aa34: 0x6c6bf420, 0x3aa35: 0x6c89da20, 0x3aa36: 0x6c89dc20, 0x3aa37: 0x6c89de20, - 0x3aa38: 0x6c89e020, 0x3aa39: 0x6c89e220, 0x3aa3a: 0x6c89e420, 0x3aa3b: 0x6c89e620, - 0x3aa3c: 0x6c89e820, 0x3aa3d: 0x6c89ea20, 0x3aa3e: 0x6c89ec20, 0x3aa3f: 0x6c89ee20, - // Block 0xea9, offset 0x3aa40 - 0x3aa40: 0x6c89f020, 0x3aa41: 0x6c89f220, 0x3aa42: 0x6c89f420, 0x3aa43: 0x6c89f620, - 0x3aa44: 0x6c89f820, 0x3aa45: 0x6c89fa20, 0x3aa46: 0x6c89fc20, 0x3aa47: 0x6c89fe20, - 0x3aa48: 0x6c8a0020, 0x3aa49: 0x6c8a0220, 0x3aa4a: 0x6c8a0420, 0x3aa4b: 0x6c8a0620, - 0x3aa4c: 0x6c8a0820, 0x3aa4d: 0x6c8a0a20, 0x3aa4e: 0x6c8a0c20, 0x3aa4f: 0x6c8a0e20, - 0x3aa50: 0x6c8a1020, 0x3aa51: 0x6c8a1220, 0x3aa52: 0x6c8a1420, 0x3aa53: 0x6c8a1620, - 0x3aa54: 0x6c8a1820, 0x3aa55: 0x6c8a1a20, 0x3aa56: 0x6c8a1c20, 0x3aa57: 0x6c8a1e20, - 0x3aa58: 0x6c8a2020, 0x3aa59: 0x6c8a2220, 0x3aa5a: 0x6c8a2420, 0x3aa5b: 0x6c8a2620, - 0x3aa5c: 0x6c8a2820, 0x3aa5d: 0x6c8a2a20, 0x3aa5e: 0x6cb60a20, 0x3aa5f: 0x6cb60c20, - 0x3aa60: 0x6cb60e20, 0x3aa61: 0x6cb61020, 0x3aa62: 0x6cb61220, 0x3aa63: 0x6cb61420, - 0x3aa64: 0x6cb61620, 0x3aa65: 0x6cb61820, 0x3aa66: 0x6cb61a20, 0x3aa67: 0x6cb61c20, - 0x3aa68: 0x6cb61e20, 0x3aa69: 0x6cb62020, 0x3aa6a: 0x6cb62220, 0x3aa6b: 0x6cb62420, - 0x3aa6c: 0x6cb62620, 0x3aa6d: 0x6cb62820, 0x3aa6e: 0x6cb62a20, 0x3aa6f: 0x6cb62c20, - 0x3aa70: 0x6cb62e20, 0x3aa71: 0x6cb63020, 0x3aa72: 0x6cb63220, 0x3aa73: 0x6cb63420, - 0x3aa74: 0x6cb63620, 0x3aa75: 0x6cb63820, 0x3aa76: 0x6cb63a20, 0x3aa77: 0x6cb63c20, - 0x3aa78: 0x6cb63e20, 0x3aa79: 0x6cb64020, 0x3aa7a: 0x6cb64220, 0x3aa7b: 0x6cb64420, - 0x3aa7c: 0x6cb64620, 0x3aa7d: 0x6cb64820, 0x3aa7e: 0x6cb64a20, 0x3aa7f: 0x6cb64c20, - // Block 0xeaa, offset 0x3aa80 - 0x3aa80: 0x6ce62a20, 0x3aa81: 0x6ce62c20, 0x3aa82: 0x6ce62e20, 0x3aa83: 0x6ce63020, - 0x3aa84: 0x6ce63220, 0x3aa85: 0x6ce63420, 0x3aa86: 0x6ce63620, 0x3aa87: 0x6ce63820, - 0x3aa88: 0x6ce63a20, 0x3aa89: 0x6ce63c20, 0x3aa8a: 0x6ce63e20, 0x3aa8b: 0x6ce64020, - 0x3aa8c: 0x6ce64220, 0x3aa8d: 0x6ce64420, 0x3aa8e: 0x6ce64620, 0x3aa8f: 0x6ce64820, - 0x3aa90: 0x6ce64a20, 0x3aa91: 0x6ce64c20, 0x3aa92: 0x6ce64e20, 0x3aa93: 0x6ce65020, - 0x3aa94: 0x6ce65220, 0x3aa95: 0x6ce65420, 0x3aa96: 0x6ce65620, 0x3aa97: 0x6ce65820, - 0x3aa98: 0x6ce65a20, 0x3aa99: 0x6ce65c20, 0x3aa9a: 0x6ce65e20, 0x3aa9b: 0x6ce66020, - 0x3aa9c: 0x6ce66220, 0x3aa9d: 0x6ce66420, 0x3aa9e: 0x6ce66620, 0x3aa9f: 0x6ce66820, - 0x3aaa0: 0x6ce66a20, 0x3aaa1: 0x6ce66c20, 0x3aaa2: 0x6ce66e20, 0x3aaa3: 0x6ce67020, - 0x3aaa4: 0x6ce67220, 0x3aaa5: 0x6ce67420, 0x3aaa6: 0x6ce67620, 0x3aaa7: 0x6ce67820, - 0x3aaa8: 0x6ce67a20, 0x3aaa9: 0x6ce67c20, 0x3aaaa: 0x6ce67e20, 0x3aaab: 0x6ce68020, - 0x3aaac: 0x6ce68220, 0x3aaad: 0x6ce68420, 0x3aaae: 0x6d149e20, 0x3aaaf: 0x6d14a020, - 0x3aab0: 0x6d14a220, 0x3aab1: 0x6d14a420, 0x3aab2: 0x6d14a620, 0x3aab3: 0x6d14a820, - 0x3aab4: 0x6d14aa20, 0x3aab5: 0x6d14ac20, 0x3aab6: 0x6d14ae20, 0x3aab7: 0x6d14b020, - 0x3aab8: 0x6d14b220, 0x3aab9: 0x6d14b420, 0x3aaba: 0x6d14b620, 0x3aabb: 0x6d14b820, - 0x3aabc: 0x6d14ba20, 0x3aabd: 0x6d14bc20, 0x3aabe: 0x6d14be20, 0x3aabf: 0x6d14c020, - // Block 0xeab, offset 0x3aac0 - 0x3aac0: 0x6d14c220, 0x3aac1: 0x6d14c420, 0x3aac2: 0x6d14c620, 0x3aac3: 0x6d14c820, - 0x3aac4: 0x6d14ca20, 0x3aac5: 0x6d14cc20, 0x3aac6: 0x6d14ce20, 0x3aac7: 0x6d14d020, - 0x3aac8: 0x6d14d220, 0x3aac9: 0x6d14d420, 0x3aaca: 0x6d428420, 0x3aacb: 0x6d428620, - 0x3aacc: 0x6d428820, 0x3aacd: 0x6d428a20, 0x3aace: 0x6d428c20, 0x3aacf: 0x6d428e20, - 0x3aad0: 0x6d429020, 0x3aad1: 0x6d429220, 0x3aad2: 0x6d429420, 0x3aad3: 0x6d429620, - 0x3aad4: 0x6d429820, 0x3aad5: 0x6d429a20, 0x3aad6: 0x6d429c20, 0x3aad7: 0x6d429e20, - 0x3aad8: 0x6d42a020, 0x3aad9: 0x6d42a220, 0x3aada: 0x6d42a420, 0x3aadb: 0x6d42a620, - 0x3aadc: 0x6d42a820, 0x3aadd: 0x6d42aa20, 0x3aade: 0x6d42ac20, 0x3aadf: 0x6d42ae20, - 0x3aae0: 0x6d42b020, 0x3aae1: 0x6d42b220, 0x3aae2: 0x6d42b420, 0x3aae3: 0x6d42b620, - 0x3aae4: 0x6d42b820, 0x3aae5: 0x6d42ba20, 0x3aae6: 0x6d42bc20, 0x3aae7: 0x6d42be20, - 0x3aae8: 0x6d42c020, 0x3aae9: 0x6d42c220, 0x3aaea: 0x6d6f9820, 0x3aaeb: 0x6d6f9a20, - 0x3aaec: 0x6d6f9c20, 0x3aaed: 0x6d6f9e20, 0x3aaee: 0x6d6fa020, 0x3aaef: 0x6d6fa220, - 0x3aaf0: 0x6d6fa420, 0x3aaf1: 0x6d6fa620, 0x3aaf2: 0x6d6fa820, 0x3aaf3: 0x6d6faa20, - 0x3aaf4: 0x6d6fac20, 0x3aaf5: 0x6d6fae20, 0x3aaf6: 0x6d6fb020, 0x3aaf7: 0x6d6fb220, - 0x3aaf8: 0x6d6fb420, 0x3aaf9: 0x6d6fb620, 0x3aafa: 0x6d6fb820, 0x3aafb: 0x6d6fba20, - 0x3aafc: 0x6d6fbc20, 0x3aafd: 0x6d6fbe20, 0x3aafe: 0x6d6fc020, 0x3aaff: 0x6d98a420, - // Block 0xeac, offset 0x3ab00 - 0x3ab00: 0x6d98a620, 0x3ab01: 0x6d98a820, 0x3ab02: 0x6d98aa20, 0x3ab03: 0x6d98ac20, - 0x3ab04: 0x6d98ae20, 0x3ab05: 0x6d98b020, 0x3ab06: 0x6d98b220, 0x3ab07: 0x6d98b420, - 0x3ab08: 0x6d98b620, 0x3ab09: 0x6d98b820, 0x3ab0a: 0x6d98ba20, 0x3ab0b: 0x6d98bc20, - 0x3ab0c: 0x6d98be20, 0x3ab0d: 0x6dbba020, 0x3ab0e: 0x6dbba220, 0x3ab0f: 0x6dbba420, - 0x3ab10: 0x6dbba620, 0x3ab11: 0x6dbba820, 0x3ab12: 0x6dbbaa20, 0x3ab13: 0x6dbbac20, - 0x3ab14: 0x6dbbae20, 0x3ab15: 0x6dbbb020, 0x3ab16: 0x6dd96c20, 0x3ab17: 0x6dd96e20, - 0x3ab18: 0x6dd97020, 0x3ab19: 0x6dd97220, 0x3ab1a: 0x6dd97420, 0x3ab1b: 0x6dd97620, - 0x3ab1c: 0x6dd97820, 0x3ab1d: 0x6dd97a20, 0x3ab1e: 0x6dd97c20, 0x3ab1f: 0x6dd97e20, - 0x3ab20: 0x6dd98020, 0x3ab21: 0x6dd98220, 0x3ab22: 0x6df1a620, 0x3ab23: 0x6df1a820, - 0x3ab24: 0x6df1aa20, 0x3ab25: 0x6df1ac20, 0x3ab26: 0x6e05de20, 0x3ab27: 0x6e05e020, - 0x3ab28: 0x6e05e220, 0x3ab29: 0x6e05e420, 0x3ab2a: 0x6e05e620, 0x3ab2b: 0x6e05e820, - 0x3ab2c: 0x6e169220, 0x3ab2d: 0x6e169420, 0x3ab2e: 0x6e23b820, 0x3ab2f: 0x6e23ba20, - 0x3ab30: 0x6e2dcc20, 0x3ab31: 0x6e2dce20, 0x3ab32: 0x6e3eb820, 0x3ab33: 0x6e3eba20, - 0x3ab34: 0x6e416220, 0x3ab35: 0x6e416420, 0x3ab36: 0x6d14de20, 0x3ab37: 0x6d42cc20, - 0x3ab38: 0x6d6fc220, 0x3ab39: 0x6d6fc420, 0x3ab3a: 0x6d6fc620, 0x3ab3b: 0x6d6fc820, - 0x3ab3c: 0x6d98c220, 0x3ab3d: 0x6d98c420, 0x3ab3e: 0x6d98c620, 0x3ab3f: 0x6dbbb420, - // Block 0xead, offset 0x3ab40 - 0x3ab40: 0x6dd98620, 0x3ab41: 0x6dd98820, 0x3ab42: 0x6e05ea20, 0x3ab43: 0x6e05ec20, - 0x3ab44: 0x6e23bc20, 0x3ab45: 0x6c8a3c20, 0x3ab46: 0x6c8a3e20, 0x3ab47: 0x6c8a4020, - 0x3ab48: 0x6cb66820, 0x3ab49: 0x6cb66a20, 0x3ab4a: 0x6cb66c20, 0x3ab4b: 0x6cb66e20, - 0x3ab4c: 0x6cb67020, 0x3ab4d: 0x6cb67220, 0x3ab4e: 0x6cb67420, 0x3ab4f: 0x6cb67620, - 0x3ab50: 0x6cb67820, 0x3ab51: 0x6cb67a20, 0x3ab52: 0x6ce6a020, 0x3ab53: 0x6ce6a220, - 0x3ab54: 0x6ce6a420, 0x3ab55: 0x6ce6a620, 0x3ab56: 0x6ce6a820, 0x3ab57: 0x6ce6aa20, - 0x3ab58: 0x6ce6ac20, 0x3ab59: 0x6ce6ae20, 0x3ab5a: 0x6ce6b020, 0x3ab5b: 0x6ce6b220, - 0x3ab5c: 0x6ce6b420, 0x3ab5d: 0x6ce6b620, 0x3ab5e: 0x6ce6b820, 0x3ab5f: 0x6ce6ba20, - 0x3ab60: 0x6d14f420, 0x3ab61: 0x6d14f620, 0x3ab62: 0x6d14f820, 0x3ab63: 0x6d14fa20, - 0x3ab64: 0x6d14fc20, 0x3ab65: 0x6d14fe20, 0x3ab66: 0x6d150020, 0x3ab67: 0x6d150220, - 0x3ab68: 0x6d150420, 0x3ab69: 0x6d150620, 0x3ab6a: 0x6d150820, 0x3ab6b: 0x6d150a20, - 0x3ab6c: 0x6d150c20, 0x3ab6d: 0x6d150e20, 0x3ab6e: 0x6d151020, 0x3ab6f: 0x6d151220, - 0x3ab70: 0x6d151420, 0x3ab71: 0x6d151620, 0x3ab72: 0x6d42d820, 0x3ab73: 0x6d42da20, - 0x3ab74: 0x6d42dc20, 0x3ab75: 0x6d42de20, 0x3ab76: 0x6d42e020, 0x3ab77: 0x6d42e220, - 0x3ab78: 0x6d42e420, 0x3ab79: 0x6d42e620, 0x3ab7a: 0x6d42e820, 0x3ab7b: 0x6d42ea20, - 0x3ab7c: 0x6d42ec20, 0x3ab7d: 0x6d42ee20, 0x3ab7e: 0x6d42f020, 0x3ab7f: 0x6d42f220, - // Block 0xeae, offset 0x3ab80 - 0x3ab80: 0x6d42f420, 0x3ab81: 0x6d42f620, 0x3ab82: 0x6d42f820, 0x3ab83: 0x6d42fa20, - 0x3ab84: 0x6d42fc20, 0x3ab85: 0x6d42fe20, 0x3ab86: 0x6d430020, 0x3ab87: 0x6d430220, - 0x3ab88: 0x6d430420, 0x3ab89: 0x6d430620, 0x3ab8a: 0x6d430820, 0x3ab8b: 0x6d6fd220, - 0x3ab8c: 0x6d6fd420, 0x3ab8d: 0x6d6fd620, 0x3ab8e: 0x6d6fd820, 0x3ab8f: 0x6d6fda20, - 0x3ab90: 0x6d6fdc20, 0x3ab91: 0x6d6fde20, 0x3ab92: 0x6d6fe020, 0x3ab93: 0x6d6fe220, - 0x3ab94: 0x6d6fe420, 0x3ab95: 0x6d6fe620, 0x3ab96: 0x6d6fe820, 0x3ab97: 0x6d6fea20, - 0x3ab98: 0x6d6fec20, 0x3ab99: 0x6d6fee20, 0x3ab9a: 0x6d6ff020, 0x3ab9b: 0x6d6ff220, - 0x3ab9c: 0x6d6ff420, 0x3ab9d: 0x6d6ff620, 0x3ab9e: 0x6d6ff820, 0x3ab9f: 0x6d6ffa20, - 0x3aba0: 0x6d98d020, 0x3aba1: 0x6d98d220, 0x3aba2: 0x6d98d420, 0x3aba3: 0x6d98d620, - 0x3aba4: 0x6d98d820, 0x3aba5: 0x6d98da20, 0x3aba6: 0x6d98dc20, 0x3aba7: 0x6d98de20, - 0x3aba8: 0x6d98e020, 0x3aba9: 0x6d98e220, 0x3abaa: 0x6d98e420, 0x3abab: 0x6d98e620, - 0x3abac: 0x6d98e820, 0x3abad: 0x6d98ea20, 0x3abae: 0x6d98ec20, 0x3abaf: 0x6d98ee20, - 0x3abb0: 0x6d98f020, 0x3abb1: 0x6d98f220, 0x3abb2: 0x6d98f420, 0x3abb3: 0x6d98f620, - 0x3abb4: 0x6d98f820, 0x3abb5: 0x6d98fa20, 0x3abb6: 0x6d98fc20, 0x3abb7: 0x6d98fe20, - 0x3abb8: 0x6d990020, 0x3abb9: 0x6d990220, 0x3abba: 0x6d990420, 0x3abbb: 0x6d990620, - 0x3abbc: 0x6d990820, 0x3abbd: 0x6d990a20, 0x3abbe: 0x6d990c20, 0x3abbf: 0x6dbbbc20, - // Block 0xeaf, offset 0x3abc0 - 0x3abc0: 0x6dbbbe20, 0x3abc1: 0x6dbbc020, 0x3abc2: 0x6dbbc220, 0x3abc3: 0x6dbbc420, - 0x3abc4: 0x6dbbc620, 0x3abc5: 0x6dbbc820, 0x3abc6: 0x6dbbca20, 0x3abc7: 0x6dbbcc20, - 0x3abc8: 0x6dbbce20, 0x3abc9: 0x6dbbd020, 0x3abca: 0x6dbbd220, 0x3abcb: 0x6dbbd420, - 0x3abcc: 0x6dbbd620, 0x3abcd: 0x6dbbd820, 0x3abce: 0x6dbbda20, 0x3abcf: 0x6dbbdc20, - 0x3abd0: 0x6dbbde20, 0x3abd1: 0x6dbbe020, 0x3abd2: 0x6dbbe220, 0x3abd3: 0x6dbbe420, - 0x3abd4: 0x6dbbe620, 0x3abd5: 0x6dbbe820, 0x3abd6: 0x6dbbea20, 0x3abd7: 0x6dd9a020, - 0x3abd8: 0x6dd9a220, 0x3abd9: 0x6dd9a420, 0x3abda: 0x6dd9a620, 0x3abdb: 0x6dd9a820, - 0x3abdc: 0x6dd9aa20, 0x3abdd: 0x6dd9ac20, 0x3abde: 0x6dd9ae20, 0x3abdf: 0x6dd9b020, - 0x3abe0: 0x6dd9b220, 0x3abe1: 0x6dd9b420, 0x3abe2: 0x6dd9b620, 0x3abe3: 0x6dd9b820, - 0x3abe4: 0x6df1b420, 0x3abe5: 0x6df1b620, 0x3abe6: 0x6df1b820, 0x3abe7: 0x6df1ba20, - 0x3abe8: 0x6df1bc20, 0x3abe9: 0x6df1be20, 0x3abea: 0x6df1c020, 0x3abeb: 0x6df1c220, - 0x3abec: 0x6df1c420, 0x3abed: 0x6df1c620, 0x3abee: 0x6df1c820, 0x3abef: 0x6df1ca20, - 0x3abf0: 0x6df1cc20, 0x3abf1: 0x6df1ce20, 0x3abf2: 0x6df1d020, 0x3abf3: 0x6df1d220, - 0x3abf4: 0x6e05f420, 0x3abf5: 0x6e05f620, 0x3abf6: 0x6e05f820, 0x3abf7: 0x6e05fa20, - 0x3abf8: 0x6e05fc20, 0x3abf9: 0x6e05fe20, 0x3abfa: 0x6e060020, 0x3abfb: 0x6e060220, - 0x3abfc: 0x6e060420, 0x3abfd: 0x6e060620, 0x3abfe: 0x6e060820, 0x3abff: 0x6e060a20, - // Block 0xeb0, offset 0x3ac00 - 0x3ac00: 0x6e060c20, 0x3ac01: 0x6e060e20, 0x3ac02: 0x6e061020, 0x3ac03: 0x6e061220, - 0x3ac04: 0x6e061420, 0x3ac05: 0x6e061620, 0x3ac06: 0x6e061820, 0x3ac07: 0x6e169820, - 0x3ac08: 0x6e169a20, 0x3ac09: 0x6e169c20, 0x3ac0a: 0x6e169e20, 0x3ac0b: 0x6e16a020, - 0x3ac0c: 0x6e16a220, 0x3ac0d: 0x6e16a420, 0x3ac0e: 0x6e16a620, 0x3ac0f: 0x6e16a820, - 0x3ac10: 0x6e16aa20, 0x3ac11: 0x6e16ac20, 0x3ac12: 0x6e16ae20, 0x3ac13: 0x6e23c020, - 0x3ac14: 0x6e23c220, 0x3ac15: 0x6e23c420, 0x3ac16: 0x6e23c620, 0x3ac17: 0x6e23c820, - 0x3ac18: 0x6e23ca20, 0x3ac19: 0x6e23cc20, 0x3ac1a: 0x6e23ce20, 0x3ac1b: 0x6e23d020, - 0x3ac1c: 0x6e2dd020, 0x3ac1d: 0x6e2dd220, 0x3ac1e: 0x6e2dd420, 0x3ac1f: 0x6e2dd620, - 0x3ac20: 0x6e2dd820, 0x3ac21: 0x6e2dda20, 0x3ac22: 0x6e2ddc20, 0x3ac23: 0x6e2dde20, - 0x3ac24: 0x6e2de020, 0x3ac25: 0x6e2de220, 0x3ac26: 0x6e2de420, 0x3ac27: 0x6e358420, - 0x3ac28: 0x6e358620, 0x3ac29: 0x6e358820, 0x3ac2a: 0x6e358a20, 0x3ac2b: 0x6e358c20, - 0x3ac2c: 0x6e3afc20, 0x3ac2d: 0x6e3afe20, 0x3ac2e: 0x6e3b0020, 0x3ac2f: 0x6e3ebc20, - 0x3ac30: 0x6e3ebe20, 0x3ac31: 0x6e3ec020, 0x3ac32: 0x6e435e20, 0x3ac33: 0x6e436020, - 0x3ac34: 0x6e464820, 0x3ac35: 0x6e46ee20, 0x3ac36: 0x6c632c20, 0x3ac37: 0x6c8a4220, - 0x3ac38: 0x6c8a4420, 0x3ac39: 0x6cb68420, 0x3ac3a: 0x6cb68620, 0x3ac3b: 0x6cb68820, - 0x3ac3c: 0x6cb68a20, 0x3ac3d: 0x6cb68c20, 0x3ac3e: 0x6cb68e20, 0x3ac3f: 0x6cb69020, - // Block 0xeb1, offset 0x3ac40 - 0x3ac40: 0x6cb69220, 0x3ac41: 0x6cb69420, 0x3ac42: 0x6ce6d220, 0x3ac43: 0x6ce6d420, - 0x3ac44: 0x6ce6d620, 0x3ac45: 0x6ce6d820, 0x3ac46: 0x6ce6da20, 0x3ac47: 0x6ce6dc20, - 0x3ac48: 0x6ce6de20, 0x3ac49: 0x6ce6e020, 0x3ac4a: 0x6ce6e220, 0x3ac4b: 0x6ce6e420, - 0x3ac4c: 0x6ce6e620, 0x3ac4d: 0x6ce6e820, 0x3ac4e: 0x6ce6ea20, 0x3ac4f: 0x6ce6ec20, - 0x3ac50: 0x6ce6ee20, 0x3ac51: 0x6ce6f020, 0x3ac52: 0x6d153020, 0x3ac53: 0x6d153220, - 0x3ac54: 0x6d153420, 0x3ac55: 0x6d153620, 0x3ac56: 0x6d153820, 0x3ac57: 0x6d153a20, - 0x3ac58: 0x6d153c20, 0x3ac59: 0x6d153e20, 0x3ac5a: 0x6d154020, 0x3ac5b: 0x6d154220, - 0x3ac5c: 0x6d154420, 0x3ac5d: 0x6d154620, 0x3ac5e: 0x6d154820, 0x3ac5f: 0x6d154a20, - 0x3ac60: 0x6d154c20, 0x3ac61: 0x6d154e20, 0x3ac62: 0x6d432220, 0x3ac63: 0x6d432420, - 0x3ac64: 0x6d432620, 0x3ac65: 0x6d432820, 0x3ac66: 0x6d432a20, 0x3ac67: 0x6d432c20, - 0x3ac68: 0x6d432e20, 0x3ac69: 0x6d433020, 0x3ac6a: 0x6d433220, 0x3ac6b: 0x6d433420, - 0x3ac6c: 0x6d433620, 0x3ac6d: 0x6d433820, 0x3ac6e: 0x6d433a20, 0x3ac6f: 0x6d433c20, - 0x3ac70: 0x6d433e20, 0x3ac71: 0x6d434020, 0x3ac72: 0x6d434220, 0x3ac73: 0x6d434420, - 0x3ac74: 0x6d434620, 0x3ac75: 0x6d434820, 0x3ac76: 0x6d434a20, 0x3ac77: 0x6d701420, - 0x3ac78: 0x6d701620, 0x3ac79: 0x6d701820, 0x3ac7a: 0x6d701a20, 0x3ac7b: 0x6d701c20, - 0x3ac7c: 0x6d701e20, 0x3ac7d: 0x6d702020, 0x3ac7e: 0x6d702220, 0x3ac7f: 0x6d702420, - // Block 0xeb2, offset 0x3ac80 - 0x3ac80: 0x6d702620, 0x3ac81: 0x6d702820, 0x3ac82: 0x6d702a20, 0x3ac83: 0x6d702c20, - 0x3ac84: 0x6d702e20, 0x3ac85: 0x6d703020, 0x3ac86: 0x6d703220, 0x3ac87: 0x6d703420, - 0x3ac88: 0x6d703620, 0x3ac89: 0x6d703820, 0x3ac8a: 0x6d703a20, 0x3ac8b: 0x6d703c20, - 0x3ac8c: 0x6d703e20, 0x3ac8d: 0x6d704020, 0x3ac8e: 0x6d704220, 0x3ac8f: 0x6d704420, - 0x3ac90: 0x6d704620, 0x3ac91: 0x6d704820, 0x3ac92: 0x6d993020, 0x3ac93: 0x6d993220, - 0x3ac94: 0x6d993420, 0x3ac95: 0x6d993620, 0x3ac96: 0x6d993820, 0x3ac97: 0x6d993a20, - 0x3ac98: 0x6d993c20, 0x3ac99: 0x6d993e20, 0x3ac9a: 0x6d994020, 0x3ac9b: 0x6d994220, - 0x3ac9c: 0x6d994420, 0x3ac9d: 0x6d994620, 0x3ac9e: 0x6d994820, 0x3ac9f: 0x6d994a20, - 0x3aca0: 0x6d994c20, 0x3aca1: 0x6d994e20, 0x3aca2: 0x6d995020, 0x3aca3: 0x6d995220, - 0x3aca4: 0x6d995420, 0x3aca5: 0x6d995620, 0x3aca6: 0x6d995820, 0x3aca7: 0x6d995a20, - 0x3aca8: 0x6d995c20, 0x3aca9: 0x6d995e20, 0x3acaa: 0x6d996020, 0x3acab: 0x6d996220, - 0x3acac: 0x6d996420, 0x3acad: 0x6d996620, 0x3acae: 0x6d996820, 0x3acaf: 0x6d996a20, - 0x3acb0: 0x6d996c20, 0x3acb1: 0x6d996e20, 0x3acb2: 0x6d997020, 0x3acb3: 0x6d997220, - 0x3acb4: 0x6d997420, 0x3acb5: 0x6dbc0c20, 0x3acb6: 0x6dbc0e20, 0x3acb7: 0x6dbc1020, - 0x3acb8: 0x6dbc1220, 0x3acb9: 0x6dbc1420, 0x3acba: 0x6dbc1620, 0x3acbb: 0x6dbc1820, - 0x3acbc: 0x6dbc1a20, 0x3acbd: 0x6dbc1c20, 0x3acbe: 0x6dd9d220, 0x3acbf: 0x6dbc1e20, - // Block 0xeb3, offset 0x3acc0 - 0x3acc0: 0x6dbc2020, 0x3acc1: 0x6dbc2220, 0x3acc2: 0x6dbc2420, 0x3acc3: 0x6dbc2620, - 0x3acc4: 0x6dbc2820, 0x3acc5: 0x6dbc2a20, 0x3acc6: 0x6dbc2c20, 0x3acc7: 0x6dbc2e20, - 0x3acc8: 0x6dbc3020, 0x3acc9: 0x6dbc3220, 0x3acca: 0x6dbc3420, 0x3accb: 0x6dbc3620, - 0x3accc: 0x6dbc3820, 0x3accd: 0x6dbc3a20, 0x3acce: 0x6dbc3c20, 0x3accf: 0x6dbc3e20, - 0x3acd0: 0x6dbc4020, 0x3acd1: 0x6dbc4220, 0x3acd2: 0x6dbc4420, 0x3acd3: 0x6dbc4620, - 0x3acd4: 0x6dbc4820, 0x3acd5: 0x6dbc4a20, 0x3acd6: 0x6dbc4c20, 0x3acd7: 0x6dd9d420, - 0x3acd8: 0x6dd9d620, 0x3acd9: 0x6dd9d820, 0x3acda: 0x6dd9da20, 0x3acdb: 0x6dd9dc20, - 0x3acdc: 0x6dd9de20, 0x3acdd: 0x6dd9e020, 0x3acde: 0x6dd9e220, 0x3acdf: 0x6dd9e420, - 0x3ace0: 0x6dd9e620, 0x3ace1: 0x6dd9e820, 0x3ace2: 0x6dd9ea20, 0x3ace3: 0x6dd9ec20, - 0x3ace4: 0x6dd9ee20, 0x3ace5: 0x6dd9f020, 0x3ace6: 0x6dd9f220, 0x3ace7: 0x6dd9f420, - 0x3ace8: 0x6dd9f620, 0x3ace9: 0x6dd9f820, 0x3acea: 0x6dd9fa20, 0x3aceb: 0x6dd9fc20, - 0x3acec: 0x6dd9fe20, 0x3aced: 0x6dda0020, 0x3acee: 0x6db8fa20, 0x3acef: 0x6dda0220, - 0x3acf0: 0x6dda0420, 0x3acf1: 0x6dda0620, 0x3acf2: 0x6dda0820, 0x3acf3: 0x6dda0a20, - 0x3acf4: 0x6dda0c20, 0x3acf5: 0x6dda0e20, 0x3acf6: 0x6dda1020, 0x3acf7: 0x6dda1220, - 0x3acf8: 0x6dda1420, 0x3acf9: 0x6dda1620, 0x3acfa: 0x6dda1820, 0x3acfb: 0x6df1ee20, - 0x3acfc: 0x6df1f020, 0x3acfd: 0x6df1f220, 0x3acfe: 0x6df1f420, 0x3acff: 0x6df1f620, - // Block 0xeb4, offset 0x3ad00 - 0x3ad00: 0x6df1f820, 0x3ad01: 0x6df1fa20, 0x3ad02: 0x6df1fc20, 0x3ad03: 0x6df1fe20, - 0x3ad04: 0x6df20020, 0x3ad05: 0x6df20220, 0x3ad06: 0x6df20420, 0x3ad07: 0x6df20620, - 0x3ad08: 0x6df20820, 0x3ad09: 0x6df20a20, 0x3ad0a: 0x6df20c20, 0x3ad0b: 0x6df20e20, - 0x3ad0c: 0x6df21020, 0x3ad0d: 0x6df21220, 0x3ad0e: 0x6df21420, 0x3ad0f: 0x6df21620, - 0x3ad10: 0x6df21820, 0x3ad11: 0x6df21a20, 0x3ad12: 0x6df21c20, 0x3ad13: 0x6df21e20, - 0x3ad14: 0x6df22020, 0x3ad15: 0x6df22220, 0x3ad16: 0x6df22420, 0x3ad17: 0x6df22620, - 0x3ad18: 0x6df22820, 0x3ad19: 0x6df22a20, 0x3ad1a: 0x6df22c20, 0x3ad1b: 0x6df22e20, - 0x3ad1c: 0x6df23020, 0x3ad1d: 0x6e062a20, 0x3ad1e: 0x6e062c20, 0x3ad1f: 0x6e062e20, - 0x3ad20: 0x6e063020, 0x3ad21: 0x6e063220, 0x3ad22: 0x6e063420, 0x3ad23: 0x6e063620, - 0x3ad24: 0x6e063820, 0x3ad25: 0x6e063a20, 0x3ad26: 0x6e063c20, 0x3ad27: 0x6e063e20, - 0x3ad28: 0x6e064020, 0x3ad29: 0x6e064220, 0x3ad2a: 0x6e064420, 0x3ad2b: 0x6e064620, - 0x3ad2c: 0x6e064820, 0x3ad2d: 0x6e064a20, 0x3ad2e: 0x6e064c20, 0x3ad2f: 0x6e064e20, - 0x3ad30: 0x6e065020, 0x3ad31: 0x6e065220, 0x3ad32: 0x6e065420, 0x3ad33: 0x6e065620, - 0x3ad34: 0x6e065820, 0x3ad35: 0x6e065a20, 0x3ad36: 0x6e065c20, 0x3ad37: 0x6e065e20, - 0x3ad38: 0x6e066020, 0x3ad39: 0x6e066220, 0x3ad3a: 0x6e066420, 0x3ad3b: 0x6e066620, - 0x3ad3c: 0x6e16c020, 0x3ad3d: 0x6e16c220, 0x3ad3e: 0x6e16c420, 0x3ad3f: 0x6e16c620, - // Block 0xeb5, offset 0x3ad40 - 0x3ad40: 0x6e16c820, 0x3ad41: 0x6e16ca20, 0x3ad42: 0x6e16cc20, 0x3ad43: 0x6e16ce20, - 0x3ad44: 0x6e16d020, 0x3ad45: 0x6e16d220, 0x3ad46: 0x6e16d420, 0x3ad47: 0x6e16d620, - 0x3ad48: 0x6e16d820, 0x3ad49: 0x6e16da20, 0x3ad4a: 0x6e16dc20, 0x3ad4b: 0x6e16de20, - 0x3ad4c: 0x6e16e020, 0x3ad4d: 0x6e16e220, 0x3ad4e: 0x6e16e420, 0x3ad4f: 0x6e16e620, - 0x3ad50: 0x6e16e820, 0x3ad51: 0x6e23e220, 0x3ad52: 0x6e23e420, 0x3ad53: 0x6e23e620, - 0x3ad54: 0x6e23e820, 0x3ad55: 0x6e23ea20, 0x3ad56: 0x6e23ec20, 0x3ad57: 0x6e23ee20, - 0x3ad58: 0x6e23f020, 0x3ad59: 0x6e23f220, 0x3ad5a: 0x6e23f420, 0x3ad5b: 0x6e23f620, - 0x3ad5c: 0x6e23f820, 0x3ad5d: 0x6e23fa20, 0x3ad5e: 0x6e23fc20, 0x3ad5f: 0x6e23fe20, - 0x3ad60: 0x6e240020, 0x3ad61: 0x6e240220, 0x3ad62: 0x6e240420, 0x3ad63: 0x6e240620, - 0x3ad64: 0x6e2dec20, 0x3ad65: 0x6e2dee20, 0x3ad66: 0x6e2df020, 0x3ad67: 0x6e2df220, - 0x3ad68: 0x6e2df420, 0x3ad69: 0x6e2df620, 0x3ad6a: 0x6e2df820, 0x3ad6b: 0x6e2dfa20, - 0x3ad6c: 0x6e2dfc20, 0x3ad6d: 0x6e359e20, 0x3ad6e: 0x6e35a020, 0x3ad6f: 0x6e35a220, - 0x3ad70: 0x6e35a420, 0x3ad71: 0x6e35a620, 0x3ad72: 0x6e35a820, 0x3ad73: 0x6e35aa20, - 0x3ad74: 0x6e35ac20, 0x3ad75: 0x6e3b0620, 0x3ad76: 0x6e3b0820, 0x3ad77: 0x6e3b0a20, - 0x3ad78: 0x6e3b0c20, 0x3ad79: 0x6e3b0e20, 0x3ad7a: 0x6e3b1020, 0x3ad7b: 0x6e3b1220, - 0x3ad7c: 0x6e3b1420, 0x3ad7d: 0x6e3b1620, 0x3ad7e: 0x6e3b1820, 0x3ad7f: 0x6e3ec420, - // Block 0xeb6, offset 0x3ad80 - 0x3ad80: 0x6e3ec620, 0x3ad81: 0x6e3ec820, 0x3ad82: 0x6e3eca20, 0x3ad83: 0x6e3ecc20, - 0x3ad84: 0x6e3ece20, 0x3ad85: 0x6e3ed020, 0x3ad86: 0x6e3ed220, 0x3ad87: 0x6e3ed420, - 0x3ad88: 0x6e436220, 0x3ad89: 0x6e436420, 0x3ad8a: 0x6e44a820, 0x3ad8b: 0x6e44aa20, - 0x3ad8c: 0x6e44ac20, 0x3ad8d: 0x6e44ae20, 0x3ad8e: 0x6e44b020, 0x3ad8f: 0x6e45e820, - 0x3ad90: 0x6e464a20, 0x3ad91: 0x6e464c20, 0x3ad92: 0x6e471820, 0x3ad93: 0x6e472420, - 0x3ad94: 0x6e473820, 0x3ad95: 0x6cb69820, 0x3ad96: 0x6ce6fa20, 0x3ad97: 0x6ce6fc20, - 0x3ad98: 0x6d155820, 0x3ad99: 0x6d155a20, 0x3ad9a: 0x6d155c20, 0x3ad9b: 0x6d155e20, - 0x3ad9c: 0x6d435620, 0x3ad9d: 0x6d997e20, 0x3ad9e: 0x6d998020, 0x3ad9f: 0x6dbc5420, - 0x3ada0: 0x6dda1e20, 0x3ada1: 0x6df23620, 0x3ada2: 0x6e067020, 0x3ada3: 0x6e16ec20, - 0x3ada4: 0x6e35b220, 0x3ada5: 0x6e3b1a20, 0x3ada6: 0x6c8a4820, 0x3ada7: 0x6c8a4a20, - 0x3ada8: 0x6c8a4c20, 0x3ada9: 0x6cb6a020, 0x3adaa: 0x6cb6a220, 0x3adab: 0x6cb6a420, - 0x3adac: 0x6cb6a620, 0x3adad: 0x6ce70220, 0x3adae: 0x6ce70420, 0x3adaf: 0x6ce70620, - 0x3adb0: 0x6ce70820, 0x3adb1: 0x6ce70a20, 0x3adb2: 0x6ce70c20, 0x3adb3: 0x6ce70e20, - 0x3adb4: 0x6ce71020, 0x3adb5: 0x6d156420, 0x3adb6: 0x6d156620, 0x3adb7: 0x6d435820, - 0x3adb8: 0x6d705420, 0x3adb9: 0x6d705620, 0x3adba: 0x6d705820, 0x3adbb: 0x6d705a20, - 0x3adbc: 0x6d998420, 0x3adbd: 0x6dda2020, 0x3adbe: 0x6e067420, 0x3adbf: 0x6e067620, - // Block 0xeb7, offset 0x3adc0 - 0x3adc0: 0x6e067820, 0x3adc1: 0x6e067a20, 0x3adc2: 0x6e3ed620, 0x3adc3: 0x6ce71220, - 0x3adc4: 0x6ce71420, 0x3adc5: 0x6ce71620, 0x3adc6: 0x6d156e20, 0x3adc7: 0x6d157020, - 0x3adc8: 0x6d157220, 0x3adc9: 0x6d157420, 0x3adca: 0x6d157620, 0x3adcb: 0x6d157820, - 0x3adcc: 0x6d157a20, 0x3adcd: 0x6d436420, 0x3adce: 0x6d436620, 0x3adcf: 0x6d436820, - 0x3add0: 0x6d436a20, 0x3add1: 0x6d436c20, 0x3add2: 0x6d436e20, 0x3add3: 0x6d437020, - 0x3add4: 0x6d437220, 0x3add5: 0x6d437420, 0x3add6: 0x6d437620, 0x3add7: 0x6d437820, - 0x3add8: 0x6d437a20, 0x3add9: 0x6d706020, 0x3adda: 0x6d706220, 0x3addb: 0x6d706420, - 0x3addc: 0x6d706620, 0x3addd: 0x6d706820, 0x3adde: 0x6d706a20, 0x3addf: 0x6d706c20, - 0x3ade0: 0x6d706e20, 0x3ade1: 0x6d998c20, 0x3ade2: 0x6d998e20, 0x3ade3: 0x6d999020, - 0x3ade4: 0x6d999220, 0x3ade5: 0x6d999420, 0x3ade6: 0x6d999620, 0x3ade7: 0x6d999820, - 0x3ade8: 0x6d999a20, 0x3ade9: 0x6d999c20, 0x3adea: 0x6d999e20, 0x3adeb: 0x6dbc5820, - 0x3adec: 0x6dbc5a20, 0x3aded: 0x6dbc5c20, 0x3adee: 0x6dbc5e20, 0x3adef: 0x6dbc6020, - 0x3adf0: 0x6dbc6220, 0x3adf1: 0x6dbc6420, 0x3adf2: 0x6dda2220, 0x3adf3: 0x6dda2420, - 0x3adf4: 0x6dda2620, 0x3adf5: 0x6dda2820, 0x3adf6: 0x6dda2a20, 0x3adf7: 0x6dda2c20, - 0x3adf8: 0x6df23c20, 0x3adf9: 0x6df23e20, 0x3adfa: 0x6df24020, 0x3adfb: 0x6e067e20, - 0x3adfc: 0x6e068020, 0x3adfd: 0x6e068220, 0x3adfe: 0x6e068420, 0x3adff: 0x6e068620, - // Block 0xeb8, offset 0x3ae00 - 0x3ae00: 0x6e068820, 0x3ae01: 0x6e16f620, 0x3ae02: 0x6e16f820, 0x3ae03: 0x6e16fa20, - 0x3ae04: 0x6e16fc20, 0x3ae05: 0x6e16fe20, 0x3ae06: 0x6e170020, 0x3ae07: 0x6e170220, - 0x3ae08: 0x6e170420, 0x3ae09: 0x6e170620, 0x3ae0a: 0x6e241020, 0x3ae0b: 0x6e241220, - 0x3ae0c: 0x6e2e0020, 0x3ae0d: 0x6e2e0220, 0x3ae0e: 0x6e2e0420, 0x3ae0f: 0x6e2e0620, - 0x3ae10: 0x6e2e0820, 0x3ae11: 0x6e35b620, 0x3ae12: 0x6e35b820, 0x3ae13: 0x6e3b1e20, - 0x3ae14: 0x6e3ed820, 0x3ae15: 0x6e3eda20, 0x3ae16: 0x6e417020, 0x3ae17: 0x6e417220, - 0x3ae18: 0x6e417420, 0x3ae19: 0x6e436620, 0x3ae1a: 0x6e436820, 0x3ae1b: 0x6cb6aa20, - 0x3ae1c: 0x6cb6ac20, 0x3ae1d: 0x6ce72c20, 0x3ae1e: 0x6ce72e20, 0x3ae1f: 0x6ce73020, - 0x3ae20: 0x6ce73220, 0x3ae21: 0x6d159820, 0x3ae22: 0x6d159a20, 0x3ae23: 0x6d159c20, - 0x3ae24: 0x6d159e20, 0x3ae25: 0x6d15a020, 0x3ae26: 0x6d15a220, 0x3ae27: 0x6d15a420, - 0x3ae28: 0x6d15a620, 0x3ae29: 0x6d15a820, 0x3ae2a: 0x6d15aa20, 0x3ae2b: 0x6d15ac20, - 0x3ae2c: 0x6d15ae20, 0x3ae2d: 0x6d15b020, 0x3ae2e: 0x6d15b220, 0x3ae2f: 0x6d15b420, - 0x3ae30: 0x6d15b620, 0x3ae31: 0x6d15b820, 0x3ae32: 0x6d15ba20, 0x3ae33: 0x6d15bc20, - 0x3ae34: 0x6d15be20, 0x3ae35: 0x6d15c020, 0x3ae36: 0x6d15c220, 0x3ae37: 0x6d15c420, - 0x3ae38: 0x6d43a420, 0x3ae39: 0x6d43a620, 0x3ae3a: 0x6d43a820, 0x3ae3b: 0x6d43aa20, - 0x3ae3c: 0x6d43ac20, 0x3ae3d: 0x6d43ae20, 0x3ae3e: 0x6d43b020, 0x3ae3f: 0x6d43b220, - // Block 0xeb9, offset 0x3ae40 - 0x3ae40: 0x6d43b420, 0x3ae41: 0x6d43b620, 0x3ae42: 0x6d43b820, 0x3ae43: 0x6d43ba20, - 0x3ae44: 0x6d43bc20, 0x3ae45: 0x6d43be20, 0x3ae46: 0x6d43c020, 0x3ae47: 0x6d43c220, - 0x3ae48: 0x6d43c420, 0x3ae49: 0x6d43c620, 0x3ae4a: 0x6d43c820, 0x3ae4b: 0x6d43ca20, - 0x3ae4c: 0x6d43cc20, 0x3ae4d: 0x6d43ce20, 0x3ae4e: 0x6d43d020, 0x3ae4f: 0x6d43d220, - 0x3ae50: 0x6d708c20, 0x3ae51: 0x6d708e20, 0x3ae52: 0x6d709020, 0x3ae53: 0x6d709220, - 0x3ae54: 0x6d709420, 0x3ae55: 0x6d709620, 0x3ae56: 0x6d709820, 0x3ae57: 0x6d709a20, - 0x3ae58: 0x6d709c20, 0x3ae59: 0x6d709e20, 0x3ae5a: 0x6d70a020, 0x3ae5b: 0x6d70a220, - 0x3ae5c: 0x6d70a420, 0x3ae5d: 0x6d70a620, 0x3ae5e: 0x6d70a820, 0x3ae5f: 0x6d70aa20, - 0x3ae60: 0x6d70ac20, 0x3ae61: 0x6d70ae20, 0x3ae62: 0x6d70b020, 0x3ae63: 0x6d70b220, - 0x3ae64: 0x6d70b420, 0x3ae65: 0x6d70b620, 0x3ae66: 0x6d70b820, 0x3ae67: 0x6d70ba20, - 0x3ae68: 0x6d70bc20, 0x3ae69: 0x6d99c020, 0x3ae6a: 0x6d99c220, 0x3ae6b: 0x6d99c420, - 0x3ae6c: 0x6d99c620, 0x3ae6d: 0x6d99c820, 0x3ae6e: 0x6d99ca20, 0x3ae6f: 0x6d99cc20, - 0x3ae70: 0x6d99ce20, 0x3ae71: 0x6d99d020, 0x3ae72: 0x6d99d220, 0x3ae73: 0x6d99d420, - 0x3ae74: 0x6d99d620, 0x3ae75: 0x6d99d820, 0x3ae76: 0x6d99da20, 0x3ae77: 0x6d99dc20, - 0x3ae78: 0x6d99de20, 0x3ae79: 0x6d99e020, 0x3ae7a: 0x6d99e220, 0x3ae7b: 0x6d99e420, - 0x3ae7c: 0x6d99e620, 0x3ae7d: 0x6d99e820, 0x3ae7e: 0x6d99ea20, 0x3ae7f: 0x6dbc8420, - // Block 0xeba, offset 0x3ae80 - 0x3ae80: 0x6dbc8620, 0x3ae81: 0x6dbc8820, 0x3ae82: 0x6dbc8a20, 0x3ae83: 0x6dbc8c20, - 0x3ae84: 0x6dbc8e20, 0x3ae85: 0x6dbc9020, 0x3ae86: 0x6dbc9220, 0x3ae87: 0x6dbc9420, - 0x3ae88: 0x6dbc9620, 0x3ae89: 0x6dbc9820, 0x3ae8a: 0x6dbc9a20, 0x3ae8b: 0x6dbc9c20, - 0x3ae8c: 0x6dbc9e20, 0x3ae8d: 0x6dbca020, 0x3ae8e: 0x6dbca220, 0x3ae8f: 0x6dbca420, - 0x3ae90: 0x6dbca620, 0x3ae91: 0x6dbca820, 0x3ae92: 0x6dbcaa20, 0x3ae93: 0x6dbcac20, - 0x3ae94: 0x6dbcae20, 0x3ae95: 0x6dbcb020, 0x3ae96: 0x6dbcb220, 0x3ae97: 0x6dbcb420, - 0x3ae98: 0x6dbcb620, 0x3ae99: 0x6dbcb820, 0x3ae9a: 0x6dbcba20, 0x3ae9b: 0x6dbcbc20, - 0x3ae9c: 0x6dbcbe20, 0x3ae9d: 0x6dbcc020, 0x3ae9e: 0x6dbcc220, 0x3ae9f: 0x6dda5c20, - 0x3aea0: 0x6dda5e20, 0x3aea1: 0x6dda6020, 0x3aea2: 0x6dda6220, 0x3aea3: 0x6dda6420, - 0x3aea4: 0x6dda6620, 0x3aea5: 0x6dda6820, 0x3aea6: 0x6dda6a20, 0x3aea7: 0x6dda6c20, - 0x3aea8: 0x6dda6e20, 0x3aea9: 0x6dda7020, 0x3aeaa: 0x6dda7220, 0x3aeab: 0x6dda7420, - 0x3aeac: 0x6dda7620, 0x3aead: 0x6dda7820, 0x3aeae: 0x6dda7a20, 0x3aeaf: 0x6dda7c20, - 0x3aeb0: 0x6dda7e20, 0x3aeb1: 0x6dda8020, 0x3aeb2: 0x6dda8220, 0x3aeb3: 0x6dda8420, - 0x3aeb4: 0x6dda8620, 0x3aeb5: 0x6dda8820, 0x3aeb6: 0x6dda8a20, 0x3aeb7: 0x6dda8c20, - 0x3aeb8: 0x6dda8e20, 0x3aeb9: 0x6dda9020, 0x3aeba: 0x6dda9220, 0x3aebb: 0x6dda9420, - 0x3aebc: 0x6dda9620, 0x3aebd: 0x6dda9820, 0x3aebe: 0x6dda9a20, 0x3aebf: 0x6dda9c20, - // Block 0xebb, offset 0x3aec0 - 0x3aec0: 0x6dda9e20, 0x3aec1: 0x6ddaa020, 0x3aec2: 0x6ddaa220, 0x3aec3: 0x6df25e20, - 0x3aec4: 0x6df26020, 0x3aec5: 0x6df26220, 0x3aec6: 0x6df26420, 0x3aec7: 0x6df26620, - 0x3aec8: 0x6df26820, 0x3aec9: 0x6df26a20, 0x3aeca: 0x6df26c20, 0x3aecb: 0x6df26e20, - 0x3aecc: 0x6df27020, 0x3aecd: 0x6df27220, 0x3aece: 0x6df27420, 0x3aecf: 0x6df27620, - 0x3aed0: 0x6df27820, 0x3aed1: 0x6df27a20, 0x3aed2: 0x6df27c20, 0x3aed3: 0x6df27e20, - 0x3aed4: 0x6df28020, 0x3aed5: 0x6df28220, 0x3aed6: 0x6df28420, 0x3aed7: 0x6df28620, - 0x3aed8: 0x6df28820, 0x3aed9: 0x6df28a20, 0x3aeda: 0x6df28c20, 0x3aedb: 0x6df28e20, - 0x3aedc: 0x6df29020, 0x3aedd: 0x6df29220, 0x3aede: 0x6df29420, 0x3aedf: 0x6df29620, - 0x3aee0: 0x6df29820, 0x3aee1: 0x6df29a20, 0x3aee2: 0x6df29c20, 0x3aee3: 0x6df29e20, - 0x3aee4: 0x6df2a020, 0x3aee5: 0x6df2a220, 0x3aee6: 0x6e069820, 0x3aee7: 0x6e069a20, - 0x3aee8: 0x6e069c20, 0x3aee9: 0x6e069e20, 0x3aeea: 0x6e06a020, 0x3aeeb: 0x6e06a220, - 0x3aeec: 0x6e06a420, 0x3aeed: 0x6e06a620, 0x3aeee: 0x6e06a820, 0x3aeef: 0x6e06aa20, - 0x3aef0: 0x6e06ac20, 0x3aef1: 0x6e06ae20, 0x3aef2: 0x6e06b020, 0x3aef3: 0x6e06b220, - 0x3aef4: 0x6e06b420, 0x3aef5: 0x6e06b620, 0x3aef6: 0x6e06b820, 0x3aef7: 0x6e06ba20, - 0x3aef8: 0x6e06bc20, 0x3aef9: 0x6e06be20, 0x3aefa: 0x6e06c020, 0x3aefb: 0x6e06c220, - 0x3aefc: 0x6e06c420, 0x3aefd: 0x6e06c620, 0x3aefe: 0x6e06c820, 0x3aeff: 0x6e06ca20, - // Block 0xebc, offset 0x3af00 - 0x3af00: 0x6e06cc20, 0x3af01: 0x6e06ce20, 0x3af02: 0x6e06d020, 0x3af03: 0x6e171e20, - 0x3af04: 0x6e172020, 0x3af05: 0x6e172220, 0x3af06: 0x6e172420, 0x3af07: 0x6e172620, - 0x3af08: 0x6e172820, 0x3af09: 0x6e172a20, 0x3af0a: 0x6e172c20, 0x3af0b: 0x6e172e20, - 0x3af0c: 0x6e173020, 0x3af0d: 0x6e173220, 0x3af0e: 0x6e173420, 0x3af0f: 0x6e173620, - 0x3af10: 0x6e173820, 0x3af11: 0x6e173a20, 0x3af12: 0x6e173c20, 0x3af13: 0x6e242020, - 0x3af14: 0x6e242220, 0x3af15: 0x6e242420, 0x3af16: 0x6e242620, 0x3af17: 0x6e242820, - 0x3af18: 0x6e242a20, 0x3af19: 0x6e242c20, 0x3af1a: 0x6e242e20, 0x3af1b: 0x6e243020, - 0x3af1c: 0x6e243220, 0x3af1d: 0x6e243420, 0x3af1e: 0x6e243620, 0x3af1f: 0x6e243820, - 0x3af20: 0x6e243a20, 0x3af21: 0x6e243c20, 0x3af22: 0x6e243e20, 0x3af23: 0x6e244020, - 0x3af24: 0x6e244220, 0x3af25: 0x6e2e1220, 0x3af26: 0x6e2e1420, 0x3af27: 0x6e2e1620, - 0x3af28: 0x6e2e1820, 0x3af29: 0x6e2e1a20, 0x3af2a: 0x6e2e1c20, 0x3af2b: 0x6e2e1e20, - 0x3af2c: 0x6e2e2020, 0x3af2d: 0x6e2e2220, 0x3af2e: 0x6e2e2420, 0x3af2f: 0x6e2e2620, - 0x3af30: 0x6e2e2820, 0x3af31: 0x6e2e2a20, 0x3af32: 0x6e35c220, 0x3af33: 0x6e35c420, - 0x3af34: 0x6e35c620, 0x3af35: 0x6e35c820, 0x3af36: 0x6e35ca20, 0x3af37: 0x6e35cc20, - 0x3af38: 0x6e3b2420, 0x3af39: 0x6e3b2620, 0x3af3a: 0x6e3b2820, 0x3af3b: 0x6e3b9e20, - 0x3af3c: 0x6e3b2a20, 0x3af3d: 0x6e3b2c20, 0x3af3e: 0x6e3b2e20, 0x3af3f: 0x6e3ee220, - // Block 0xebd, offset 0x3af40 - 0x3af40: 0x6e3ee420, 0x3af41: 0x6e3ee620, 0x3af42: 0x6e3ee820, 0x3af43: 0x6e3eea20, - 0x3af44: 0x6e3eec20, 0x3af45: 0x6e3eee20, 0x3af46: 0x6e3ef020, 0x3af47: 0x6e417820, - 0x3af48: 0x6e436a20, 0x3af49: 0x6e436c20, 0x3af4a: 0x6e436e20, 0x3af4b: 0x6e457020, - 0x3af4c: 0x6e464e20, 0x3af4d: 0x6e465020, 0x3af4e: 0x6e469420, 0x3af4f: 0x6e469620, - 0x3af50: 0x6e46b620, 0x3af51: 0x6e471a20, 0x3af52: 0x6ce73620, 0x3af53: 0x6d15c820, - 0x3af54: 0x6d15ca20, 0x3af55: 0x6d15cc20, 0x3af56: 0x6d15ce20, 0x3af57: 0x6d15d020, - 0x3af58: 0x6d43e420, 0x3af59: 0x6d43e620, 0x3af5a: 0x6d43e820, 0x3af5b: 0x6d43ea20, - 0x3af5c: 0x6d43ec20, 0x3af5d: 0x6d43ee20, 0x3af5e: 0x6d43f020, 0x3af5f: 0x6d43f220, - 0x3af60: 0x6d43f420, 0x3af61: 0x6d43f620, 0x3af62: 0x6d43f820, 0x3af63: 0x6d43fa20, - 0x3af64: 0x6d70c820, 0x3af65: 0x6d70ca20, 0x3af66: 0x6d70cc20, 0x3af67: 0x6d70ce20, - 0x3af68: 0x6d70d020, 0x3af69: 0x6d70d220, 0x3af6a: 0x6d70d420, 0x3af6b: 0x6d70d620, - 0x3af6c: 0x6d70d820, 0x3af6d: 0x6d70da20, 0x3af6e: 0x6d70dc20, 0x3af6f: 0x6d99f020, - 0x3af70: 0x6d99f220, 0x3af71: 0x6d99f420, 0x3af72: 0x6d99f620, 0x3af73: 0x6d99f820, - 0x3af74: 0x6d99fa20, 0x3af75: 0x6d99fc20, 0x3af76: 0x6d99fe20, 0x3af77: 0x6d9a0020, - 0x3af78: 0x6dbccc20, 0x3af79: 0x6dbcce20, 0x3af7a: 0x6dbcd020, 0x3af7b: 0x6dbcd220, - 0x3af7c: 0x6dbcd420, 0x3af7d: 0x6dbcd620, 0x3af7e: 0x6dbcd820, 0x3af7f: 0x6dbcda20, - // Block 0xebe, offset 0x3af80 - 0x3af80: 0x6dbcdc20, 0x3af81: 0x6dbcde20, 0x3af82: 0x6dbce020, 0x3af83: 0x6dbce220, - 0x3af84: 0x6dbce420, 0x3af85: 0x6ddab420, 0x3af86: 0x6ddab620, 0x3af87: 0x6ddab820, - 0x3af88: 0x6ddaba20, 0x3af89: 0x6ddabc20, 0x3af8a: 0x6ddabe20, 0x3af8b: 0x6ddac020, - 0x3af8c: 0x6ddac220, 0x3af8d: 0x6ddac420, 0x3af8e: 0x6ddac620, 0x3af8f: 0x6df2b020, - 0x3af90: 0x6df2b220, 0x3af91: 0x6df2b420, 0x3af92: 0x6df2b620, 0x3af93: 0x6df2b820, - 0x3af94: 0x6df2ba20, 0x3af95: 0x6df2bc20, 0x3af96: 0x6df2be20, 0x3af97: 0x6df2c020, - 0x3af98: 0x6e06d820, 0x3af99: 0x6e06da20, 0x3af9a: 0x6e06dc20, 0x3af9b: 0x6e06de20, - 0x3af9c: 0x6e06e020, 0x3af9d: 0x6e06e220, 0x3af9e: 0x6e06e420, 0x3af9f: 0x6e06e620, - 0x3afa0: 0x6e174620, 0x3afa1: 0x6e174820, 0x3afa2: 0x6e174a20, 0x3afa3: 0x6e174c20, - 0x3afa4: 0x6e174e20, 0x3afa5: 0x6e175020, 0x3afa6: 0x6e175220, 0x3afa7: 0x6e175420, - 0x3afa8: 0x6e244a20, 0x3afa9: 0x6e244c20, 0x3afaa: 0x6e244e20, 0x3afab: 0x6e245020, - 0x3afac: 0x6e245220, 0x3afad: 0x6e245420, 0x3afae: 0x6e2e2e20, 0x3afaf: 0x6e2e3020, - 0x3afb0: 0x6e2e3220, 0x3afb1: 0x6e2e3420, 0x3afb2: 0x6e35d220, 0x3afb3: 0x6e35d420, - 0x3afb4: 0x6e3b3020, 0x3afb5: 0x6e3ef220, 0x3afb6: 0x6e417a20, 0x3afb7: 0x6e417c20, - 0x3afb8: 0x6e417e20, 0x3afb9: 0x6e437020, 0x3afba: 0x6e44b420, 0x3afbb: 0x6e44b620, - 0x3afbc: 0x6c428220, 0x3afbd: 0x6c633820, 0x3afbe: 0x6c633a20, 0x3afbf: 0x6d15d820, - // Block 0xebf, offset 0x3afc0 - 0x3afc0: 0x6d15da20, 0x3afc1: 0x6d15e220, 0x3afc2: 0x6d15e420, 0x3afc3: 0x6d70e420, - 0x3afc4: 0x6d9a0620, 0x3afc5: 0x6dbcec20, 0x3afc6: 0x6dbcee20, 0x3afc7: 0x6dbcf020, - 0x3afc8: 0x6ddac820, 0x3afc9: 0x6df2c820, 0x3afca: 0x6df2ca20, 0x3afcb: 0x6e06ec20, - 0x3afcc: 0x6e175820, 0x3afcd: 0x6e06ee20, 0x3afce: 0x6e06f020, 0x3afcf: 0x6e175a20, - 0x3afd0: 0x6e175c20, 0x3afd1: 0x6e245620, 0x3afd2: 0x6e245820, 0x3afd3: 0x6e245a20, - 0x3afd4: 0x6e2e3820, 0x3afd5: 0x6e2e3a20, 0x3afd6: 0x6e3b3220, 0x3afd7: 0x6ce74220, - 0x3afd8: 0x6d15ec20, 0x3afd9: 0x6d15ee20, 0x3afda: 0x6d440820, 0x3afdb: 0x6d440a20, - 0x3afdc: 0x6d440c20, 0x3afdd: 0x6d440e20, 0x3afde: 0x6d70e620, 0x3afdf: 0x6d70e820, - 0x3afe0: 0x6d70ea20, 0x3afe1: 0x6d70ec20, 0x3afe2: 0x6d70ee20, 0x3afe3: 0x6d70f020, - 0x3afe4: 0x6d70f220, 0x3afe5: 0x6d70f420, 0x3afe6: 0x6d70f620, 0x3afe7: 0x6d9a0e20, - 0x3afe8: 0x6d9a1020, 0x3afe9: 0x6d9a1220, 0x3afea: 0x6d9a1420, 0x3afeb: 0x6d9a1620, - 0x3afec: 0x6d9a1820, 0x3afed: 0x6dbcf220, 0x3afee: 0x6dbcf420, 0x3afef: 0x6dbcf620, - 0x3aff0: 0x6dbcf820, 0x3aff1: 0x6ddad020, 0x3aff2: 0x6ddad220, 0x3aff3: 0x6ddad420, - 0x3aff4: 0x6ddad620, 0x3aff5: 0x6df2d420, 0x3aff6: 0x6df2d620, 0x3aff7: 0x6df2d820, - 0x3aff8: 0x6df2da20, 0x3aff9: 0x6e06f820, 0x3affa: 0x6e06fa20, 0x3affb: 0x6e06fc20, - 0x3affc: 0x6e06fe20, 0x3affd: 0x6e070020, 0x3affe: 0x6e070220, 0x3afff: 0x6e175e20, - // Block 0xec0, offset 0x3b000 - 0x3b000: 0x6e176020, 0x3b001: 0x6e176220, 0x3b002: 0x6e245e20, 0x3b003: 0x6e246020, - 0x3b004: 0x6e246220, 0x3b005: 0x6e246420, 0x3b006: 0x6e246620, 0x3b007: 0x6e2e3e20, - 0x3b008: 0x6e35d820, 0x3b009: 0x6e418020, 0x3b00a: 0x6e469820, 0x3b00b: 0x6c634220, - 0x3b00c: 0x6cb6b820, 0x3b00d: 0x6cb6ba20, 0x3b00e: 0x6cb6bc20, 0x3b00f: 0x6cb6be20, - 0x3b010: 0x6ce75020, 0x3b011: 0x6ce75220, 0x3b012: 0x6ce75420, 0x3b013: 0x6ce75620, - 0x3b014: 0x6ce75820, 0x3b015: 0x6ce75a20, 0x3b016: 0x6ce75c20, 0x3b017: 0x6ce75e20, - 0x3b018: 0x6ce76020, 0x3b019: 0x6d160e20, 0x3b01a: 0x6d161020, 0x3b01b: 0x6d161220, - 0x3b01c: 0x6d161420, 0x3b01d: 0x6d161620, 0x3b01e: 0x6d161820, 0x3b01f: 0x6d161a20, - 0x3b020: 0x6d161c20, 0x3b021: 0x6d161e20, 0x3b022: 0x6d162020, 0x3b023: 0x6d162220, - 0x3b024: 0x6d162420, 0x3b025: 0x6d162620, 0x3b026: 0x6d162820, 0x3b027: 0x6d162a20, - 0x3b028: 0x6d162c20, 0x3b029: 0x6d162e20, 0x3b02a: 0x6d163020, 0x3b02b: 0x6d163220, - 0x3b02c: 0x6d163420, 0x3b02d: 0x6d163620, 0x3b02e: 0x6d163820, 0x3b02f: 0x6d163a20, - 0x3b030: 0x6d443220, 0x3b031: 0x6d443420, 0x3b032: 0x6d443620, 0x3b033: 0x6d443820, - 0x3b034: 0x6d443a20, 0x3b035: 0x6d443c20, 0x3b036: 0x6d443e20, 0x3b037: 0x6d444020, - 0x3b038: 0x6d444220, 0x3b039: 0x6d444420, 0x3b03a: 0x6d444620, 0x3b03b: 0x6d444820, - 0x3b03c: 0x6d444a20, 0x3b03d: 0x6d444c20, 0x3b03e: 0x6d444e20, 0x3b03f: 0x6d445020, - // Block 0xec1, offset 0x3b040 - 0x3b040: 0x6d445220, 0x3b041: 0x6d445420, 0x3b042: 0x6d445620, 0x3b043: 0x6d445820, - 0x3b044: 0x6d445a20, 0x3b045: 0x6d445c20, 0x3b046: 0x6d445e20, 0x3b047: 0x6d446020, - 0x3b048: 0x6d446220, 0x3b049: 0x6d446420, 0x3b04a: 0x6d446620, 0x3b04b: 0x6d446820, - 0x3b04c: 0x6d446a20, 0x3b04d: 0x6d446c20, 0x3b04e: 0x6d446e20, 0x3b04f: 0x6d712020, - 0x3b050: 0x6d712220, 0x3b051: 0x6d712420, 0x3b052: 0x6d712620, 0x3b053: 0x6d712820, - 0x3b054: 0x6d712a20, 0x3b055: 0x6d712c20, 0x3b056: 0x6d712e20, 0x3b057: 0x6d713020, - 0x3b058: 0x6d713220, 0x3b059: 0x6d713420, 0x3b05a: 0x6d713620, 0x3b05b: 0x6d713820, - 0x3b05c: 0x6d713a20, 0x3b05d: 0x6d713c20, 0x3b05e: 0x6d713e20, 0x3b05f: 0x6d714020, - 0x3b060: 0x6d714220, 0x3b061: 0x6d714420, 0x3b062: 0x6d714620, 0x3b063: 0x6d714820, - 0x3b064: 0x6d714a20, 0x3b065: 0x6d714c20, 0x3b066: 0x6d714e20, 0x3b067: 0x6d715020, - 0x3b068: 0x6d715220, 0x3b069: 0x6d715420, 0x3b06a: 0x6d715620, 0x3b06b: 0x6d715820, - 0x3b06c: 0x6d715a20, 0x3b06d: 0x6d715c20, 0x3b06e: 0x6d9a5020, 0x3b06f: 0x6d9a5220, - 0x3b070: 0x6d9a5420, 0x3b071: 0x6d9a5620, 0x3b072: 0x6d9a5820, 0x3b073: 0x6d9a5a20, - 0x3b074: 0x6d9a5c20, 0x3b075: 0x6d9a5e20, 0x3b076: 0x6d9a6020, 0x3b077: 0x6d9a6220, - 0x3b078: 0x6d9a6420, 0x3b079: 0x6d9a6620, 0x3b07a: 0x6d9a6820, 0x3b07b: 0x6d9a6a20, - 0x3b07c: 0x6d9a6c20, 0x3b07d: 0x6d9a6e20, 0x3b07e: 0x6d9a7020, 0x3b07f: 0x6d9a7220, - // Block 0xec2, offset 0x3b080 - 0x3b080: 0x6d9a7420, 0x3b081: 0x6d9a7620, 0x3b082: 0x6d9a7820, 0x3b083: 0x6d9a7a20, - 0x3b084: 0x6d9a7c20, 0x3b085: 0x6d9a7e20, 0x3b086: 0x6d9a8020, 0x3b087: 0x6d9a8220, - 0x3b088: 0x6d9a8420, 0x3b089: 0x6d9a8620, 0x3b08a: 0x6d9a8820, 0x3b08b: 0x6d9a8a20, - 0x3b08c: 0x6d9a8c20, 0x3b08d: 0x6d9a8e20, 0x3b08e: 0x6d9a9020, 0x3b08f: 0x6d9a9220, - 0x3b090: 0x6d9a9420, 0x3b091: 0x6d9a9620, 0x3b092: 0x6d9a9820, 0x3b093: 0x6d9a9a20, - 0x3b094: 0x6d9a9c20, 0x3b095: 0x6d9a9e20, 0x3b096: 0x6d9aa020, 0x3b097: 0x6d9aa220, - 0x3b098: 0x6d9aa420, 0x3b099: 0x6d9aa620, 0x3b09a: 0x6d9aa820, 0x3b09b: 0x6d9aaa20, - 0x3b09c: 0x6d9aac20, 0x3b09d: 0x6dbd2220, 0x3b09e: 0x6dbd2420, 0x3b09f: 0x6dbd2620, - 0x3b0a0: 0x6dbd2820, 0x3b0a1: 0x6dbd2a20, 0x3b0a2: 0x6dbd2c20, 0x3b0a3: 0x6dbd2e20, - 0x3b0a4: 0x6dbd3020, 0x3b0a5: 0x6dbd3220, 0x3b0a6: 0x6dbd3420, 0x3b0a7: 0x6dbd3620, - 0x3b0a8: 0x6dbd3820, 0x3b0a9: 0x6dbd3a20, 0x3b0aa: 0x6dbd3c20, 0x3b0ab: 0x6dbd3e20, - 0x3b0ac: 0x6dbd4020, 0x3b0ad: 0x6dbd4220, 0x3b0ae: 0x6dbd4420, 0x3b0af: 0x6dbd4620, - 0x3b0b0: 0x6dbd4820, 0x3b0b1: 0x6dbd4a20, 0x3b0b2: 0x6dbd4c20, 0x3b0b3: 0x6dbd4e20, - 0x3b0b4: 0x6dbd5020, 0x3b0b5: 0x6dbd5220, 0x3b0b6: 0x6dbd5420, 0x3b0b7: 0x6dbd5620, - 0x3b0b8: 0x6dbd5820, 0x3b0b9: 0x6dbd5a20, 0x3b0ba: 0x6dbd5c20, 0x3b0bb: 0x6dbd5e20, - 0x3b0bc: 0x6dbd6020, 0x3b0bd: 0x6dbd6220, 0x3b0be: 0x6dbd6420, 0x3b0bf: 0x6dbd6620, - // Block 0xec3, offset 0x3b0c0 - 0x3b0c0: 0x6ddb0820, 0x3b0c1: 0x6ddb0a20, 0x3b0c2: 0x6ddb0c20, 0x3b0c3: 0x6ddb0e20, - 0x3b0c4: 0x6ddb1020, 0x3b0c5: 0x6ddb1220, 0x3b0c6: 0x6ddb1420, 0x3b0c7: 0x6ddb1620, - 0x3b0c8: 0x6ddb1820, 0x3b0c9: 0x6ddb1a20, 0x3b0ca: 0x6ddb1c20, 0x3b0cb: 0x6ddb1e20, - 0x3b0cc: 0x6ddb2020, 0x3b0cd: 0x6ddb2220, 0x3b0ce: 0x6ddb2420, 0x3b0cf: 0x6ddb2620, - 0x3b0d0: 0x6ddb2820, 0x3b0d1: 0x6ddb2a20, 0x3b0d2: 0x6ddb2c20, 0x3b0d3: 0x6ddb2e20, - 0x3b0d4: 0x6ddb3020, 0x3b0d5: 0x6ddb3220, 0x3b0d6: 0x6ddb3420, 0x3b0d7: 0x6ddb3620, - 0x3b0d8: 0x6ddb3820, 0x3b0d9: 0x6df30220, 0x3b0da: 0x6df30420, 0x3b0db: 0x6df30620, - 0x3b0dc: 0x6df30820, 0x3b0dd: 0x6df30a20, 0x3b0de: 0x6df30c20, 0x3b0df: 0x6df30e20, - 0x3b0e0: 0x6df31020, 0x3b0e1: 0x6df31220, 0x3b0e2: 0x6df31420, 0x3b0e3: 0x6df31620, - 0x3b0e4: 0x6df31820, 0x3b0e5: 0x6df31a20, 0x3b0e6: 0x6df31c20, 0x3b0e7: 0x6df31e20, - 0x3b0e8: 0x6df32020, 0x3b0e9: 0x6df32220, 0x3b0ea: 0x6df32420, 0x3b0eb: 0x6df32620, - 0x3b0ec: 0x6df32820, 0x3b0ed: 0x6df32a20, 0x3b0ee: 0x6df32c20, 0x3b0ef: 0x6df32e20, - 0x3b0f0: 0x6df33020, 0x3b0f1: 0x6df33220, 0x3b0f2: 0x6df33420, 0x3b0f3: 0x6e071820, - 0x3b0f4: 0x6e071a20, 0x3b0f5: 0x6e071c20, 0x3b0f6: 0x6e071e20, 0x3b0f7: 0x6e072020, - 0x3b0f8: 0x6e072220, 0x3b0f9: 0x6e072420, 0x3b0fa: 0x6e072620, 0x3b0fb: 0x6e072820, - 0x3b0fc: 0x6e072a20, 0x3b0fd: 0x6e072c20, 0x3b0fe: 0x6e072e20, 0x3b0ff: 0x6e073020, - // Block 0xec4, offset 0x3b100 - 0x3b100: 0x6e073220, 0x3b101: 0x6e073420, 0x3b102: 0x6e073620, 0x3b103: 0x6e073820, - 0x3b104: 0x6e073a20, 0x3b105: 0x6e073c20, 0x3b106: 0x6e073e20, 0x3b107: 0x6e074020, - 0x3b108: 0x6e074220, 0x3b109: 0x6e177c20, 0x3b10a: 0x6e177e20, 0x3b10b: 0x6e178020, - 0x3b10c: 0x6e178220, 0x3b10d: 0x6e178420, 0x3b10e: 0x6e178620, 0x3b10f: 0x6e178820, - 0x3b110: 0x6e178a20, 0x3b111: 0x6e178c20, 0x3b112: 0x6e178e20, 0x3b113: 0x6e179020, - 0x3b114: 0x6e179220, 0x3b115: 0x6e179420, 0x3b116: 0x6e179620, 0x3b117: 0x6e179820, - 0x3b118: 0x6e179a20, 0x3b119: 0x6e179c20, 0x3b11a: 0x6e179e20, 0x3b11b: 0x6e17a020, - 0x3b11c: 0x6e17a220, 0x3b11d: 0x6e17a420, 0x3b11e: 0x6e17a620, 0x3b11f: 0x6e247420, - 0x3b120: 0x6e247620, 0x3b121: 0x6e247820, 0x3b122: 0x6e247a20, 0x3b123: 0x6e247c20, - 0x3b124: 0x6e247e20, 0x3b125: 0x6e248020, 0x3b126: 0x6e248220, 0x3b127: 0x6e248420, - 0x3b128: 0x6e248620, 0x3b129: 0x6e248820, 0x3b12a: 0x6e248a20, 0x3b12b: 0x6e248c20, - 0x3b12c: 0x6e2e4820, 0x3b12d: 0x6e2e4a20, 0x3b12e: 0x6e2e4c20, 0x3b12f: 0x6e2e4e20, - 0x3b130: 0x6e2e5020, 0x3b131: 0x6e2e5220, 0x3b132: 0x6e2e5420, 0x3b133: 0x6e2e5620, - 0x3b134: 0x6e2e5820, 0x3b135: 0x6e2e5a20, 0x3b136: 0x6e2e5c20, 0x3b137: 0x6e2e5e20, - 0x3b138: 0x6e2e6020, 0x3b139: 0x6e2e6220, 0x3b13a: 0x6e2e6420, 0x3b13b: 0x6e2e6620, - 0x3b13c: 0x6e2e6820, 0x3b13d: 0x6e2e6a20, 0x3b13e: 0x6e35e020, 0x3b13f: 0x6e35e220, - // Block 0xec5, offset 0x3b140 - 0x3b140: 0x6e35e420, 0x3b141: 0x6e35e620, 0x3b142: 0x6e35e820, 0x3b143: 0x6e35ea20, - 0x3b144: 0x6e35ec20, 0x3b145: 0x6e35ee20, 0x3b146: 0x6e3b3c20, 0x3b147: 0x6e3b3e20, - 0x3b148: 0x6e3b4020, 0x3b149: 0x6e3ef420, 0x3b14a: 0x6e3ef620, 0x3b14b: 0x6e3ef820, - 0x3b14c: 0x6e3efa20, 0x3b14d: 0x6e3efc20, 0x3b14e: 0x6e3efe20, 0x3b14f: 0x6e418620, - 0x3b150: 0x6e418820, 0x3b151: 0x6e418a20, 0x3b152: 0x6e44b820, 0x3b153: 0x6e44ba20, - 0x3b154: 0x6e460020, 0x3b155: 0x6d447420, 0x3b156: 0x6d447620, 0x3b157: 0x6df33a20, - 0x3b158: 0x6cb6ce20, 0x3b159: 0x6cb6d020, 0x3b15a: 0x6ce77e20, 0x3b15b: 0x6ce78020, - 0x3b15c: 0x6ce78220, 0x3b15d: 0x6ce78420, 0x3b15e: 0x6ce78620, 0x3b15f: 0x6ce78820, - 0x3b160: 0x6ce78a20, 0x3b161: 0x6ce78c20, 0x3b162: 0x6d165c20, 0x3b163: 0x6d165e20, - 0x3b164: 0x6d166020, 0x3b165: 0x6d166220, 0x3b166: 0x6d166420, 0x3b167: 0x6d166620, - 0x3b168: 0x6d166820, 0x3b169: 0x6d166a20, 0x3b16a: 0x6d166c20, 0x3b16b: 0x6d166e20, - 0x3b16c: 0x6d167020, 0x3b16d: 0x6d167220, 0x3b16e: 0x6d167420, 0x3b16f: 0x6d167620, - 0x3b170: 0x6cf59620, 0x3b171: 0x6d167820, 0x3b172: 0x6d167a20, 0x3b173: 0x6d167c20, - 0x3b174: 0x6d449420, 0x3b175: 0x6d449620, 0x3b176: 0x6d449820, 0x3b177: 0x6d449a20, - 0x3b178: 0x6d449c20, 0x3b179: 0x6d449e20, 0x3b17a: 0x6d44a020, 0x3b17b: 0x6d44a220, - 0x3b17c: 0x6d44a420, 0x3b17d: 0x6d44a620, 0x3b17e: 0x6d44a820, 0x3b17f: 0x6d44aa20, - // Block 0xec6, offset 0x3b180 - 0x3b180: 0x6d44ac20, 0x3b181: 0x6d44ae20, 0x3b182: 0x6d44b020, 0x3b183: 0x6d44b220, - 0x3b184: 0x6d717620, 0x3b185: 0x6d717820, 0x3b186: 0x6d717a20, 0x3b187: 0x6d717c20, - 0x3b188: 0x6d717e20, 0x3b189: 0x6d718020, 0x3b18a: 0x6d718220, 0x3b18b: 0x6d718420, - 0x3b18c: 0x6d718620, 0x3b18d: 0x6d718820, 0x3b18e: 0x6d718a20, 0x3b18f: 0x6d718c20, - 0x3b190: 0x6d718e20, 0x3b191: 0x6d719020, 0x3b192: 0x6d719220, 0x3b193: 0x6d9aca20, - 0x3b194: 0x6d9acc20, 0x3b195: 0x6d9ace20, 0x3b196: 0x6d9ad020, 0x3b197: 0x6d9ad220, - 0x3b198: 0x6d9ad420, 0x3b199: 0x6d9ad620, 0x3b19a: 0x6d9ad820, 0x3b19b: 0x6d9ada20, - 0x3b19c: 0x6d9adc20, 0x3b19d: 0x6d9ade20, 0x3b19e: 0x6d9ae020, 0x3b19f: 0x6d9ae220, - 0x3b1a0: 0x6d9ae420, 0x3b1a1: 0x6d9ae620, 0x3b1a2: 0x6d9ae820, 0x3b1a3: 0x6d9aea20, - 0x3b1a4: 0x6d9aec20, 0x3b1a5: 0x6d9aee20, 0x3b1a6: 0x6d9af020, 0x3b1a7: 0x6d9af220, - 0x3b1a8: 0x6dbd7c20, 0x3b1a9: 0x6dbd7e20, 0x3b1aa: 0x6dbd8020, 0x3b1ab: 0x6dbd8220, - 0x3b1ac: 0x6dbd8420, 0x3b1ad: 0x6dbd8620, 0x3b1ae: 0x6dbd8820, 0x3b1af: 0x6dbd8a20, - 0x3b1b0: 0x6dbd8c20, 0x3b1b1: 0x6dbd8e20, 0x3b1b2: 0x6dbd9020, 0x3b1b3: 0x6dbd9220, - 0x3b1b4: 0x6dbd9420, 0x3b1b5: 0x6dbd9620, 0x3b1b6: 0x6dbd9820, 0x3b1b7: 0x6dbd9a20, - 0x3b1b8: 0x6dbd9c20, 0x3b1b9: 0x6dbd9e20, 0x3b1ba: 0x6dbda020, 0x3b1bb: 0x6dbda220, - 0x3b1bc: 0x6dbda420, 0x3b1bd: 0x6dbda620, 0x3b1be: 0x6dbda820, 0x3b1bf: 0x6dbdaa20, - // Block 0xec7, offset 0x3b1c0 - 0x3b1c0: 0x6dbdac20, 0x3b1c1: 0x6dbdae20, 0x3b1c2: 0x6dbdb020, 0x3b1c3: 0x6dbdb220, - 0x3b1c4: 0x6dbdb420, 0x3b1c5: 0x6ddb5620, 0x3b1c6: 0x6ddb5820, 0x3b1c7: 0x6ddb5a20, - 0x3b1c8: 0x6ddb5c20, 0x3b1c9: 0x6ddb5e20, 0x3b1ca: 0x6ddb6020, 0x3b1cb: 0x6ddb6220, - 0x3b1cc: 0x6ddb6420, 0x3b1cd: 0x6ddb6620, 0x3b1ce: 0x6df34e20, 0x3b1cf: 0x6ddb6820, - 0x3b1d0: 0x6ddb6a20, 0x3b1d1: 0x6ddb6c20, 0x3b1d2: 0x6ddb6e20, 0x3b1d3: 0x6ddb7020, - 0x3b1d4: 0x6ddb7220, 0x3b1d5: 0x6ddb7420, 0x3b1d6: 0x6ddb7620, 0x3b1d7: 0x6ddb7820, - 0x3b1d8: 0x6ddb7a20, 0x3b1d9: 0x6ddb7c20, 0x3b1da: 0x6ddb7e20, 0x3b1db: 0x6ddb8020, - 0x3b1dc: 0x6df35020, 0x3b1dd: 0x6df35220, 0x3b1de: 0x6df35420, 0x3b1df: 0x6df35620, - 0x3b1e0: 0x6df35820, 0x3b1e1: 0x6df35a20, 0x3b1e2: 0x6df35c20, 0x3b1e3: 0x6df35e20, - 0x3b1e4: 0x6df36020, 0x3b1e5: 0x6df36220, 0x3b1e6: 0x6df36420, 0x3b1e7: 0x6df36620, - 0x3b1e8: 0x6df36820, 0x3b1e9: 0x6df36a20, 0x3b1ea: 0x6df36c20, 0x3b1eb: 0x6df36e20, - 0x3b1ec: 0x6df37020, 0x3b1ed: 0x6e075620, 0x3b1ee: 0x6e075820, 0x3b1ef: 0x6e075a20, - 0x3b1f0: 0x6e075c20, 0x3b1f1: 0x6e075e20, 0x3b1f2: 0x6e076020, 0x3b1f3: 0x6e076220, - 0x3b1f4: 0x6e076420, 0x3b1f5: 0x6e076620, 0x3b1f6: 0x6e076820, 0x3b1f7: 0x6e076a20, - 0x3b1f8: 0x6e17bc20, 0x3b1f9: 0x6e17be20, 0x3b1fa: 0x6e17c020, 0x3b1fb: 0x6e17c220, - 0x3b1fc: 0x6e17c420, 0x3b1fd: 0x6e17c620, 0x3b1fe: 0x6e17c820, 0x3b1ff: 0x6e17ca20, - // Block 0xec8, offset 0x3b200 - 0x3b200: 0x6e17cc20, 0x3b201: 0x6e17ce20, 0x3b202: 0x6e17d020, 0x3b203: 0x6e17d220, - 0x3b204: 0x6e17d420, 0x3b205: 0x6e17d620, 0x3b206: 0x6e17d820, 0x3b207: 0x6e17da20, - 0x3b208: 0x6e249220, 0x3b209: 0x6e249420, 0x3b20a: 0x6e249620, 0x3b20b: 0x6e249820, - 0x3b20c: 0x6e249a20, 0x3b20d: 0x6e249c20, 0x3b20e: 0x6e2e7020, 0x3b20f: 0x6e2e7220, - 0x3b210: 0x6e2e7420, 0x3b211: 0x6e35f420, 0x3b212: 0x6e35f620, 0x3b213: 0x6e35f820, - 0x3b214: 0x6e35fa20, 0x3b215: 0x6e35fc20, 0x3b216: 0x6e3b4220, 0x3b217: 0x6e3b4420, - 0x3b218: 0x6e3b4620, 0x3b219: 0x6e3b4820, 0x3b21a: 0x6e3b4a20, 0x3b21b: 0x6e3f0020, - 0x3b21c: 0x6e3f0220, 0x3b21d: 0x6e419020, 0x3b21e: 0x6e419220, 0x3b21f: 0x6e437220, - 0x3b220: 0x6e46d220, 0x3b221: 0x6e46f220, 0x3b222: 0x6e470c20, 0x3b223: 0x6e473420, - 0x3b224: 0x6e473a20, 0x3b225: 0x6c635620, 0x3b226: 0x6c635820, 0x3b227: 0x6cb6d220, - 0x3b228: 0x6ce79020, 0x3b229: 0x6ce79220, 0x3b22a: 0x6ce79420, 0x3b22b: 0x6d168220, - 0x3b22c: 0x6d168420, 0x3b22d: 0x6d44bc20, 0x3b22e: 0x6d44be20, 0x3b22f: 0x6d9af820, - 0x3b230: 0x6dbdb820, 0x3b231: 0x6c635e20, 0x3b232: 0x6d168820, 0x3b233: 0x6d44c020, - 0x3b234: 0x6d719620, 0x3b235: 0x6ddb8820, 0x3b236: 0x6df37820, 0x3b237: 0x6df37a20, - 0x3b238: 0x6df37c20, 0x3b239: 0x6e076c20, 0x3b23a: 0x6e17de20, 0x3b23b: 0x6e17e020, - 0x3b23c: 0x6e24a220, 0x3b23d: 0x6e24a420, 0x3b23e: 0x6e45ea20, 0x3b23f: 0x6c429020, - // Block 0xec9, offset 0x3b240 - 0x3b240: 0x6c429220, 0x3b241: 0x6c429420, 0x3b242: 0x6c636620, 0x3b243: 0x6c429620, - 0x3b244: 0x6c8a6e20, 0x3b245: 0x6c8a7020, 0x3b246: 0x6c8a7220, 0x3b247: 0x6cb6de20, - 0x3b248: 0x6cb6e020, 0x3b249: 0x6cb6e220, 0x3b24a: 0x6cb6e420, 0x3b24b: 0x6cb6e620, - 0x3b24c: 0x6cb6e820, 0x3b24d: 0x6cb6ea20, 0x3b24e: 0x6cb6ec20, 0x3b24f: 0x6cb6ee20, - 0x3b250: 0x6cb6f020, 0x3b251: 0x6cb6f220, 0x3b252: 0x6cb6f420, 0x3b253: 0x6cb6f620, - 0x3b254: 0x6cb6f820, 0x3b255: 0x6ce7b020, 0x3b256: 0x6ce7b220, 0x3b257: 0x6ce7b420, - 0x3b258: 0x6ce7b620, 0x3b259: 0x6ce7b820, 0x3b25a: 0x6ce7ba20, 0x3b25b: 0x6ce7bc20, - 0x3b25c: 0x6ce7be20, 0x3b25d: 0x6ce7c020, 0x3b25e: 0x6ce7c220, 0x3b25f: 0x6ce7c420, - 0x3b260: 0x6ce7c620, 0x3b261: 0x6ce7c820, 0x3b262: 0x6ce7ca20, 0x3b263: 0x6ce7cc20, - 0x3b264: 0x6ce7ce20, 0x3b265: 0x6ce7d020, 0x3b266: 0x6ce7d220, 0x3b267: 0x6ce7d420, - 0x3b268: 0x6d16b020, 0x3b269: 0x6d16b220, 0x3b26a: 0x6d16b420, 0x3b26b: 0x6d16b620, - 0x3b26c: 0x6d16b820, 0x3b26d: 0x6d16ba20, 0x3b26e: 0x6d16bc20, 0x3b26f: 0x6d16be20, - 0x3b270: 0x6d16c020, 0x3b271: 0x6d16c220, 0x3b272: 0x6d16c420, 0x3b273: 0x6d16c620, - 0x3b274: 0x6d16c820, 0x3b275: 0x6d16ca20, 0x3b276: 0x6d16cc20, 0x3b277: 0x6d16ce20, - 0x3b278: 0x6d16d020, 0x3b279: 0x6d16d220, 0x3b27a: 0x6d16d420, 0x3b27b: 0x6d16d620, - 0x3b27c: 0x6d16d820, 0x3b27d: 0x6d16da20, 0x3b27e: 0x6d16dc20, 0x3b27f: 0x6d16de20, - // Block 0xeca, offset 0x3b280 - 0x3b280: 0x6d16e020, 0x3b281: 0x6d16e220, 0x3b282: 0x6d16e420, 0x3b283: 0x6d16e620, - 0x3b284: 0x6d16e820, 0x3b285: 0x6d16ea20, 0x3b286: 0x6d16ec20, 0x3b287: 0x6d16ee20, - 0x3b288: 0x6d16f020, 0x3b289: 0x6d44f020, 0x3b28a: 0x6d44f220, 0x3b28b: 0x6d44f420, - 0x3b28c: 0x6d44f620, 0x3b28d: 0x6d44f820, 0x3b28e: 0x6d44fa20, 0x3b28f: 0x6d44fc20, - 0x3b290: 0x6d44fe20, 0x3b291: 0x6d450020, 0x3b292: 0x6d450220, 0x3b293: 0x6d450420, - 0x3b294: 0x6d450620, 0x3b295: 0x6d450820, 0x3b296: 0x6d450a20, 0x3b297: 0x6d450c20, - 0x3b298: 0x6d450e20, 0x3b299: 0x6d451020, 0x3b29a: 0x6d451220, 0x3b29b: 0x6d451420, - 0x3b29c: 0x6d451620, 0x3b29d: 0x6d71c220, 0x3b29e: 0x6d71c420, 0x3b29f: 0x6d71c620, - 0x3b2a0: 0x6d71c820, 0x3b2a1: 0x6d71ca20, 0x3b2a2: 0x6d71cc20, 0x3b2a3: 0x6d71ce20, - 0x3b2a4: 0x6d71d020, 0x3b2a5: 0x6d71d220, 0x3b2a6: 0x6d71d420, 0x3b2a7: 0x6d71d620, - 0x3b2a8: 0x6d71d820, 0x3b2a9: 0x6d71da20, 0x3b2aa: 0x6d71dc20, 0x3b2ab: 0x6d71de20, - 0x3b2ac: 0x6d71e020, 0x3b2ad: 0x6d71e220, 0x3b2ae: 0x6d71e420, 0x3b2af: 0x6d71e620, - 0x3b2b0: 0x6d71e820, 0x3b2b1: 0x6d71ea20, 0x3b2b2: 0x6d71ec20, 0x3b2b3: 0x6d71ee20, - 0x3b2b4: 0x6d71f020, 0x3b2b5: 0x6d71f220, 0x3b2b6: 0x6d71f420, 0x3b2b7: 0x6d71f620, - 0x3b2b8: 0x6d71f820, 0x3b2b9: 0x6d71fa20, 0x3b2ba: 0x6d9b2820, 0x3b2bb: 0x6d9b2a20, - 0x3b2bc: 0x6d9b2c20, 0x3b2bd: 0x6d9b2e20, 0x3b2be: 0x6d9b3020, 0x3b2bf: 0x6d9b3220, - // Block 0xecb, offset 0x3b2c0 - 0x3b2c0: 0x6d9b3420, 0x3b2c1: 0x6d9b3620, 0x3b2c2: 0x6d9b3820, 0x3b2c3: 0x6d9b3a20, - 0x3b2c4: 0x6d9b3c20, 0x3b2c5: 0x6d9b3e20, 0x3b2c6: 0x6d9b4020, 0x3b2c7: 0x6d9b4220, - 0x3b2c8: 0x6d9b4420, 0x3b2c9: 0x6d9b4620, 0x3b2ca: 0x6d9b4820, 0x3b2cb: 0x6d9b4a20, - 0x3b2cc: 0x6d9b4c20, 0x3b2cd: 0x6d9b4e20, 0x3b2ce: 0x6d9b5020, 0x3b2cf: 0x6d9b5220, - 0x3b2d0: 0x6d9b5420, 0x3b2d1: 0x6d9b5620, 0x3b2d2: 0x6d9b5820, 0x3b2d3: 0x6d9b5a20, - 0x3b2d4: 0x6d9b5c20, 0x3b2d5: 0x6d9b5e20, 0x3b2d6: 0x6d9b6020, 0x3b2d7: 0x6d9b6220, - 0x3b2d8: 0x6d9b6420, 0x3b2d9: 0x6d9b6620, 0x3b2da: 0x6d9b6820, 0x3b2db: 0x6d9b6a20, - 0x3b2dc: 0x6d9b6c20, 0x3b2dd: 0x6d9b6e20, 0x3b2de: 0x6d9b7020, 0x3b2df: 0x6d9b7220, - 0x3b2e0: 0x6d9b7420, 0x3b2e1: 0x6d9b7620, 0x3b2e2: 0x6d9b7820, 0x3b2e3: 0x6dbde220, - 0x3b2e4: 0x6d9b7a20, 0x3b2e5: 0x6d9b7c20, 0x3b2e6: 0x6d9b7e20, 0x3b2e7: 0x6d9b8020, - 0x3b2e8: 0x6d9b8220, 0x3b2e9: 0x6d9b8420, 0x3b2ea: 0x6d9b8620, 0x3b2eb: 0x6d9b8820, - 0x3b2ec: 0x6d9b8a20, 0x3b2ed: 0x6dbde420, 0x3b2ee: 0x6dbde620, 0x3b2ef: 0x6dbde820, - 0x3b2f0: 0x6dbdea20, 0x3b2f1: 0x6dbdec20, 0x3b2f2: 0x6dbdee20, 0x3b2f3: 0x6dbdf020, - 0x3b2f4: 0x6dbdf220, 0x3b2f5: 0x6dbdf420, 0x3b2f6: 0x6dbdf620, 0x3b2f7: 0x6dbdf820, - 0x3b2f8: 0x6dbdfa20, 0x3b2f9: 0x6dbdfc20, 0x3b2fa: 0x6dbdfe20, 0x3b2fb: 0x6dbe0020, - 0x3b2fc: 0x6dbe0220, 0x3b2fd: 0x6dbe0420, 0x3b2fe: 0x6dbe0620, 0x3b2ff: 0x6dbe0820, - // Block 0xecc, offset 0x3b300 - 0x3b300: 0x6dbe0a20, 0x3b301: 0x6dbe0c20, 0x3b302: 0x6dbe0e20, 0x3b303: 0x6dbe1020, - 0x3b304: 0x6dbe1220, 0x3b305: 0x6dbe1420, 0x3b306: 0x6dbe1620, 0x3b307: 0x6dbe1820, - 0x3b308: 0x6dbe1a20, 0x3b309: 0x6dbe1c20, 0x3b30a: 0x6dbe1e20, 0x3b30b: 0x6dbe2020, - 0x3b30c: 0x6dbe2220, 0x3b30d: 0x6dbe2420, 0x3b30e: 0x6dbe2620, 0x3b30f: 0x6dbe2820, - 0x3b310: 0x6dbe2a20, 0x3b311: 0x6dbe2c20, 0x3b312: 0x6dbe2e20, 0x3b313: 0x6dbe3020, - 0x3b314: 0x6dbe3220, 0x3b315: 0x6dbe3420, 0x3b316: 0x6dbe3620, 0x3b317: 0x6dbe3820, - 0x3b318: 0x6dbe3a20, 0x3b319: 0x6ddbb220, 0x3b31a: 0x6ddbb420, 0x3b31b: 0x6ddbb620, - 0x3b31c: 0x6ddbb820, 0x3b31d: 0x6ddbba20, 0x3b31e: 0x6ddbbc20, 0x3b31f: 0x6ddbbe20, - 0x3b320: 0x6ddbc020, 0x3b321: 0x6ddbc220, 0x3b322: 0x6ddbc420, 0x3b323: 0x6ddbc620, - 0x3b324: 0x6ddbc820, 0x3b325: 0x6ddbca20, 0x3b326: 0x6ddbcc20, 0x3b327: 0x6ddbce20, - 0x3b328: 0x6ddbd020, 0x3b329: 0x6ddbd220, 0x3b32a: 0x6ddbd420, 0x3b32b: 0x6ddbd620, - 0x3b32c: 0x6ddbd820, 0x3b32d: 0x6ddbda20, 0x3b32e: 0x6ddbdc20, 0x3b32f: 0x6ddbde20, - 0x3b330: 0x6ddbe020, 0x3b331: 0x6ddbe220, 0x3b332: 0x6ddbe420, 0x3b333: 0x6ddbe620, - 0x3b334: 0x6df39620, 0x3b335: 0x6ddbe820, 0x3b336: 0x6ddbea20, 0x3b337: 0x6ddbec20, - 0x3b338: 0x6ddbee20, 0x3b339: 0x6ddbf020, 0x3b33a: 0x6ddbf220, 0x3b33b: 0x6ddbf420, - 0x3b33c: 0x6ddbf620, 0x3b33d: 0x6df39820, 0x3b33e: 0x6df39a20, 0x3b33f: 0x6df39c20, - // Block 0xecd, offset 0x3b340 - 0x3b340: 0x6df39e20, 0x3b341: 0x6df3a020, 0x3b342: 0x6df3a220, 0x3b343: 0x6df3a420, - 0x3b344: 0x6df3a620, 0x3b345: 0x6df3a820, 0x3b346: 0x6df3aa20, 0x3b347: 0x6df3ac20, - 0x3b348: 0x6df3ae20, 0x3b349: 0x6df3b020, 0x3b34a: 0x6df3b220, 0x3b34b: 0x6df3b420, - 0x3b34c: 0x6df3b620, 0x3b34d: 0x6df3b820, 0x3b34e: 0x6df3ba20, 0x3b34f: 0x6df3bc20, - 0x3b350: 0x6df3be20, 0x3b351: 0x6df3c020, 0x3b352: 0x6df3c220, 0x3b353: 0x6df3c420, - 0x3b354: 0x6df3c620, 0x3b355: 0x6df3c820, 0x3b356: 0x6df3ca20, 0x3b357: 0x6df3cc20, - 0x3b358: 0x6df3ce20, 0x3b359: 0x6df3d020, 0x3b35a: 0x6df3d220, 0x3b35b: 0x6df3d420, - 0x3b35c: 0x6df3d620, 0x3b35d: 0x6df3d820, 0x3b35e: 0x6df3da20, 0x3b35f: 0x6df3dc20, - 0x3b360: 0x6df3de20, 0x3b361: 0x6e078820, 0x3b362: 0x6e078a20, 0x3b363: 0x6e078c20, - 0x3b364: 0x6e078e20, 0x3b365: 0x6e079020, 0x3b366: 0x6e079220, 0x3b367: 0x6e079420, - 0x3b368: 0x6e079620, 0x3b369: 0x6e079820, 0x3b36a: 0x6e079a20, 0x3b36b: 0x6e079c20, - 0x3b36c: 0x6e079e20, 0x3b36d: 0x6e07a020, 0x3b36e: 0x6e07a220, 0x3b36f: 0x6e07a420, - 0x3b370: 0x6e07a620, 0x3b371: 0x6e07a820, 0x3b372: 0x6e07aa20, 0x3b373: 0x6e07ac20, - 0x3b374: 0x6e07ae20, 0x3b375: 0x6e07b020, 0x3b376: 0x6e17f420, 0x3b377: 0x6e07b220, - 0x3b378: 0x6e07b420, 0x3b379: 0x6e07b620, 0x3b37a: 0x6e07b820, 0x3b37b: 0x6e07ba20, - 0x3b37c: 0x6e07bc20, 0x3b37d: 0x6e07be20, 0x3b37e: 0x6e17f620, 0x3b37f: 0x6e17f820, - // Block 0xece, offset 0x3b380 - 0x3b380: 0x6e17fa20, 0x3b381: 0x6e17fc20, 0x3b382: 0x6e17fe20, 0x3b383: 0x6e180020, - 0x3b384: 0x6e180220, 0x3b385: 0x6e180420, 0x3b386: 0x6e180620, 0x3b387: 0x6e180820, - 0x3b388: 0x6e180a20, 0x3b389: 0x6e180c20, 0x3b38a: 0x6e180e20, 0x3b38b: 0x6e181020, - 0x3b38c: 0x6e181220, 0x3b38d: 0x6e181420, 0x3b38e: 0x6e181620, 0x3b38f: 0x6e181820, - 0x3b390: 0x6e181a20, 0x3b391: 0x6e181c20, 0x3b392: 0x6e181e20, 0x3b393: 0x6e24b620, - 0x3b394: 0x6e24b820, 0x3b395: 0x6e24ba20, 0x3b396: 0x6e24bc20, 0x3b397: 0x6e24be20, - 0x3b398: 0x6e24c020, 0x3b399: 0x6e24c220, 0x3b39a: 0x6e24c420, 0x3b39b: 0x6e24c620, - 0x3b39c: 0x6e24c820, 0x3b39d: 0x6e24ca20, 0x3b39e: 0x6e24cc20, 0x3b39f: 0x6e24ce20, - 0x3b3a0: 0x6e24d020, 0x3b3a1: 0x6e24d220, 0x3b3a2: 0x6e24d420, 0x3b3a3: 0x6e24d620, - 0x3b3a4: 0x6e2e8420, 0x3b3a5: 0x6e2e8620, 0x3b3a6: 0x6e2e8820, 0x3b3a7: 0x6e2e8a20, - 0x3b3a8: 0x6e2e8c20, 0x3b3a9: 0x6e2e8e20, 0x3b3aa: 0x6e2e9020, 0x3b3ab: 0x6e2e9220, - 0x3b3ac: 0x6e2e9420, 0x3b3ad: 0x6e360420, 0x3b3ae: 0x6e360620, 0x3b3af: 0x6e360820, - 0x3b3b0: 0x6e360a20, 0x3b3b1: 0x6e360c20, 0x3b3b2: 0x6e360e20, 0x3b3b3: 0x6e361020, - 0x3b3b4: 0x6e361220, 0x3b3b5: 0x6e361420, 0x3b3b6: 0x6e3b5020, 0x3b3b7: 0x6e3f0820, - 0x3b3b8: 0x6e3f0a20, 0x3b3b9: 0x6e3f0c20, 0x3b3ba: 0x6e3f0e20, 0x3b3bb: 0x6e44bc20, - 0x3b3bc: 0x6e457420, 0x3b3bd: 0x6e465220, 0x3b3be: 0x6c288e20, 0x3b3bf: 0x6c289020, - // Block 0xecf, offset 0x3b3c0 - 0x3b3c0: 0x6c289220, 0x3b3c1: 0x6c42a420, 0x3b3c2: 0x6c42a620, 0x3b3c3: 0x6c637820, - 0x3b3c4: 0x6c8a8020, 0x3b3c5: 0x6c8a8220, 0x3b3c6: 0x6cb70220, 0x3b3c7: 0x6c8a8420, - 0x3b3c8: 0x6cb70420, 0x3b3c9: 0x6cb70620, 0x3b3ca: 0x6ce7e020, 0x3b3cb: 0x6ce7e220, - 0x3b3cc: 0x6d170020, 0x3b3cd: 0x6d452420, 0x3b3ce: 0x6d452620, 0x3b3cf: 0x6d720220, - 0x3b3d0: 0x6c638020, 0x3b3d1: 0x6cb70e20, 0x3b3d2: 0x6cb71020, 0x3b3d3: 0x6ce7ee20, - 0x3b3d4: 0x6d170620, 0x3b3d5: 0x6d452820, 0x3b3d6: 0x6d452a20, 0x3b3d7: 0x6d452c20, - 0x3b3d8: 0x6d452e20, 0x3b3d9: 0x6d453020, 0x3b3da: 0x6d720c20, 0x3b3db: 0x6d720e20, - 0x3b3dc: 0x6d721020, 0x3b3dd: 0x6d721220, 0x3b3de: 0x6d721420, 0x3b3df: 0x6d721620, - 0x3b3e0: 0x6d721820, 0x3b3e1: 0x6d9b9020, 0x3b3e2: 0x6d9b9220, 0x3b3e3: 0x6d9b9420, - 0x3b3e4: 0x6d9b9620, 0x3b3e5: 0x6d9b9820, 0x3b3e6: 0x6d9b9a20, 0x3b3e7: 0x6d9b9c20, - 0x3b3e8: 0x6dbe4a20, 0x3b3e9: 0x6dbe4c20, 0x3b3ea: 0x6ddbfc20, 0x3b3eb: 0x6ddbfe20, - 0x3b3ec: 0x6ddc0020, 0x3b3ed: 0x6ddc0220, 0x3b3ee: 0x6de36c20, 0x3b3ef: 0x6df3e620, - 0x3b3f0: 0x6dface20, 0x3b3f1: 0x6df3e820, 0x3b3f2: 0x6e07c620, 0x3b3f3: 0x6e182220, - 0x3b3f4: 0x6e24dc20, 0x3b3f5: 0x6e2e9620, 0x3b3f6: 0x6e2e9820, 0x3b3f7: 0x6e361620, - 0x3b3f8: 0x6e3b5420, 0x3b3f9: 0x6e419c20, 0x3b3fa: 0x6c8a8c20, 0x3b3fb: 0x6d170a20, - 0x3b3fc: 0x6d170c20, 0x3b3fd: 0x6d170e20, 0x3b3fe: 0x6d453c20, 0x3b3ff: 0x6d453e20, - // Block 0xed0, offset 0x3b400 - 0x3b400: 0x6d454020, 0x3b401: 0x6d454220, 0x3b402: 0x6d721a20, 0x3b403: 0x6d454420, - 0x3b404: 0x6d454620, 0x3b405: 0x6d721c20, 0x3b406: 0x6d721e20, 0x3b407: 0x6d9ba620, - 0x3b408: 0x6d9ba820, 0x3b409: 0x6dbe5c20, 0x3b40a: 0x6dbe5e20, 0x3b40b: 0x6dbe6020, - 0x3b40c: 0x6ddc0820, 0x3b40d: 0x6ddc0a20, 0x3b40e: 0x6ddc0c20, 0x3b40f: 0x6dbe6220, - 0x3b410: 0x6ddc0e20, 0x3b411: 0x6ddc1020, 0x3b412: 0x6ddc1220, 0x3b413: 0x6df3f020, - 0x3b414: 0x6df3f220, 0x3b415: 0x6df3f420, 0x3b416: 0x6df3f620, 0x3b417: 0x6df3f820, - 0x3b418: 0x6df3fa20, 0x3b419: 0x6e07cc20, 0x3b41a: 0x6e07ce20, 0x3b41b: 0x6e07d020, - 0x3b41c: 0x6e07d220, 0x3b41d: 0x6e182620, 0x3b41e: 0x6e182820, 0x3b41f: 0x6e182a20, - 0x3b420: 0x6e182c20, 0x3b421: 0x6e182e20, 0x3b422: 0x6e24de20, 0x3b423: 0x6e24e020, - 0x3b424: 0x6e2e9c20, 0x3b425: 0x6e3f1020, 0x3b426: 0x6e437620, 0x3b427: 0x6c8a9020, - 0x3b428: 0x6cb71220, 0x3b429: 0x6ce7f620, 0x3b42a: 0x6ce7f820, 0x3b42b: 0x6ce7fa20, - 0x3b42c: 0x6ce7fc20, 0x3b42d: 0x6ce7fe20, 0x3b42e: 0x6ce80020, 0x3b42f: 0x6ce80220, - 0x3b430: 0x6d172220, 0x3b431: 0x6d172420, 0x3b432: 0x6d172620, 0x3b433: 0x6d172820, - 0x3b434: 0x6d172a20, 0x3b435: 0x6d172c20, 0x3b436: 0x6d172e20, 0x3b437: 0x6d457c20, - 0x3b438: 0x6d457e20, 0x3b439: 0x6d458020, 0x3b43a: 0x6d458220, 0x3b43b: 0x6d458420, - 0x3b43c: 0x6d458620, 0x3b43d: 0x6d458820, 0x3b43e: 0x6d458a20, 0x3b43f: 0x6d726420, - // Block 0xed1, offset 0x3b440 - 0x3b440: 0x6d458c20, 0x3b441: 0x6d458e20, 0x3b442: 0x6d459020, 0x3b443: 0x6d459220, - 0x3b444: 0x6d459420, 0x3b445: 0x6d459620, 0x3b446: 0x6d726620, 0x3b447: 0x6d459820, - 0x3b448: 0x6d459a20, 0x3b449: 0x6d459c20, 0x3b44a: 0x6d459e20, 0x3b44b: 0x6d45a020, - 0x3b44c: 0x6d45a220, 0x3b44d: 0x6d726820, 0x3b44e: 0x6d726a20, 0x3b44f: 0x6d726c20, - 0x3b450: 0x6d726e20, 0x3b451: 0x6d727020, 0x3b452: 0x6d727220, 0x3b453: 0x6d727420, - 0x3b454: 0x6d727620, 0x3b455: 0x6d727820, 0x3b456: 0x6d727a20, 0x3b457: 0x6d727c20, - 0x3b458: 0x6d727e20, 0x3b459: 0x6d728020, 0x3b45a: 0x6d728220, 0x3b45b: 0x6d728420, - 0x3b45c: 0x6d728620, 0x3b45d: 0x6d728820, 0x3b45e: 0x6d728a20, 0x3b45f: 0x6d728c20, - 0x3b460: 0x6d728e20, 0x3b461: 0x6d729020, 0x3b462: 0x6d729220, 0x3b463: 0x6d729420, - 0x3b464: 0x6d729620, 0x3b465: 0x6d729820, 0x3b466: 0x6d729a20, 0x3b467: 0x6d729c20, - 0x3b468: 0x6d729e20, 0x3b469: 0x6d72a020, 0x3b46a: 0x6d72a220, 0x3b46b: 0x6d72a420, - 0x3b46c: 0x6d72a620, 0x3b46d: 0x6d72a820, 0x3b46e: 0x6d9bde20, 0x3b46f: 0x6d9be020, - 0x3b470: 0x6d9be220, 0x3b471: 0x6d9be420, 0x3b472: 0x6d9be620, 0x3b473: 0x6d9be820, - 0x3b474: 0x6d9bea20, 0x3b475: 0x6d9bec20, 0x3b476: 0x6d9bee20, 0x3b477: 0x6d9bf020, - 0x3b478: 0x6d9bf220, 0x3b479: 0x6d9bf420, 0x3b47a: 0x6d9bf620, 0x3b47b: 0x6d9bf820, - 0x3b47c: 0x6d9bfa20, 0x3b47d: 0x6d9bfc20, 0x3b47e: 0x6d9bfe20, 0x3b47f: 0x6d9c0020, - // Block 0xed2, offset 0x3b480 - 0x3b480: 0x6d9c0220, 0x3b481: 0x6d9c0420, 0x3b482: 0x6d9c0620, 0x3b483: 0x6d9c0820, - 0x3b484: 0x6d9c0a20, 0x3b485: 0x6d9c0c20, 0x3b486: 0x6d9c0e20, 0x3b487: 0x6d9c1020, - 0x3b488: 0x6d9c1220, 0x3b489: 0x6d9c1420, 0x3b48a: 0x6d9c1620, 0x3b48b: 0x6d9c1820, - 0x3b48c: 0x6d9c1a20, 0x3b48d: 0x6d9c1c20, 0x3b48e: 0x6d9c1e20, 0x3b48f: 0x6d9c2020, - 0x3b490: 0x6d9c2220, 0x3b491: 0x6d9c2420, 0x3b492: 0x6d9c2620, 0x3b493: 0x6d9c2820, - 0x3b494: 0x6d9c2a20, 0x3b495: 0x6d9c2c20, 0x3b496: 0x6dbe9020, 0x3b497: 0x6dbe9220, - 0x3b498: 0x6dbe9420, 0x3b499: 0x6dbe9620, 0x3b49a: 0x6dbe9820, 0x3b49b: 0x6dbe9a20, - 0x3b49c: 0x6dbe9c20, 0x3b49d: 0x6dbe9e20, 0x3b49e: 0x6dbea020, 0x3b49f: 0x6dbea220, - 0x3b4a0: 0x6dbea420, 0x3b4a1: 0x6dbea620, 0x3b4a2: 0x6dbea820, 0x3b4a3: 0x6dbeaa20, - 0x3b4a4: 0x6dbeac20, 0x3b4a5: 0x6dbeae20, 0x3b4a6: 0x6dbeb020, 0x3b4a7: 0x6dbeb220, - 0x3b4a8: 0x6dbeb420, 0x3b4a9: 0x6dbeb620, 0x3b4aa: 0x6dbeb820, 0x3b4ab: 0x6dbeba20, - 0x3b4ac: 0x6dbebc20, 0x3b4ad: 0x6ddc4820, 0x3b4ae: 0x6ddc4a20, 0x3b4af: 0x6ddc4c20, - 0x3b4b0: 0x6ddc4e20, 0x3b4b1: 0x6ddc5020, 0x3b4b2: 0x6ddc5220, 0x3b4b3: 0x6ddc5420, - 0x3b4b4: 0x6ddc5620, 0x3b4b5: 0x6ddc5820, 0x3b4b6: 0x6ddc5a20, 0x3b4b7: 0x6ddc5c20, - 0x3b4b8: 0x6ddc5e20, 0x3b4b9: 0x6ddc6020, 0x3b4ba: 0x6ddc6220, 0x3b4bb: 0x6ddc6420, - 0x3b4bc: 0x6ddc6620, 0x3b4bd: 0x6ddc6820, 0x3b4be: 0x6ddc6a20, 0x3b4bf: 0x6ddc6c20, - // Block 0xed3, offset 0x3b4c0 - 0x3b4c0: 0x6ddc6e20, 0x3b4c1: 0x6ddc7020, 0x3b4c2: 0x6ddc7220, 0x3b4c3: 0x6ddc7420, - 0x3b4c4: 0x6ddc7620, 0x3b4c5: 0x6ddc7820, 0x3b4c6: 0x6ddc7a20, 0x3b4c7: 0x6ddc7c20, - 0x3b4c8: 0x6ddc7e20, 0x3b4c9: 0x6ddc8020, 0x3b4ca: 0x6ddc8220, 0x3b4cb: 0x6ddc8420, - 0x3b4cc: 0x6ddc8620, 0x3b4cd: 0x6ddc8820, 0x3b4ce: 0x6ddc8a20, 0x3b4cf: 0x6ddc8c20, - 0x3b4d0: 0x6ddc8e20, 0x3b4d1: 0x6ddc9020, 0x3b4d2: 0x6ddc9220, 0x3b4d3: 0x6ddc9420, - 0x3b4d4: 0x6ddc9620, 0x3b4d5: 0x6ddc9820, 0x3b4d6: 0x6ddc9a20, 0x3b4d7: 0x6df43420, - 0x3b4d8: 0x6df43620, 0x3b4d9: 0x6df43820, 0x3b4da: 0x6df43a20, 0x3b4db: 0x6df43c20, - 0x3b4dc: 0x6df43e20, 0x3b4dd: 0x6df44020, 0x3b4de: 0x6ddc9c20, 0x3b4df: 0x6df44220, - 0x3b4e0: 0x6df44420, 0x3b4e1: 0x6df44620, 0x3b4e2: 0x6df44820, 0x3b4e3: 0x6df44a20, - 0x3b4e4: 0x6df44c20, 0x3b4e5: 0x6df44e20, 0x3b4e6: 0x6df45020, 0x3b4e7: 0x6df45220, - 0x3b4e8: 0x6df45420, 0x3b4e9: 0x6df45620, 0x3b4ea: 0x6df45820, 0x3b4eb: 0x6df45a20, - 0x3b4ec: 0x6df45c20, 0x3b4ed: 0x6df45e20, 0x3b4ee: 0x6df46020, 0x3b4ef: 0x6df46220, - 0x3b4f0: 0x6df46420, 0x3b4f1: 0x6df46620, 0x3b4f2: 0x6df46820, 0x3b4f3: 0x6df46a20, - 0x3b4f4: 0x6df46c20, 0x3b4f5: 0x6df46e20, 0x3b4f6: 0x6df47020, 0x3b4f7: 0x6dbebe20, - 0x3b4f8: 0x6df47220, 0x3b4f9: 0x6df47420, 0x3b4fa: 0x6df47620, 0x3b4fb: 0x6df47820, - 0x3b4fc: 0x6df47a20, 0x3b4fd: 0x6e080620, 0x3b4fe: 0x6e080820, 0x3b4ff: 0x6e080a20, - // Block 0xed4, offset 0x3b500 - 0x3b500: 0x6e080c20, 0x3b501: 0x6e080e20, 0x3b502: 0x6e081020, 0x3b503: 0x6e081220, - 0x3b504: 0x6e081420, 0x3b505: 0x6e081620, 0x3b506: 0x6e081820, 0x3b507: 0x6e081a20, - 0x3b508: 0x6e081c20, 0x3b509: 0x6e081e20, 0x3b50a: 0x6e082020, 0x3b50b: 0x6e082220, - 0x3b50c: 0x6e082420, 0x3b50d: 0x6e082620, 0x3b50e: 0x6e082820, 0x3b50f: 0x6e082a20, - 0x3b510: 0x6e082c20, 0x3b511: 0x6e082e20, 0x3b512: 0x6e083020, 0x3b513: 0x6e083220, - 0x3b514: 0x6e083420, 0x3b515: 0x6e083620, 0x3b516: 0x6e083820, 0x3b517: 0x6e083a20, - 0x3b518: 0x6e083c20, 0x3b519: 0x6e083e20, 0x3b51a: 0x6e084020, 0x3b51b: 0x6e084220, - 0x3b51c: 0x6e084420, 0x3b51d: 0x6e084620, 0x3b51e: 0x6e084820, 0x3b51f: 0x6e084a20, - 0x3b520: 0x6e084c20, 0x3b521: 0x6e084e20, 0x3b522: 0x6e085020, 0x3b523: 0x6e085220, - 0x3b524: 0x6e085420, 0x3b525: 0x6e085620, 0x3b526: 0x6e085820, 0x3b527: 0x6e085a20, - 0x3b528: 0x6e085c20, 0x3b529: 0x6e085e20, 0x3b52a: 0x6e086020, 0x3b52b: 0x6e186220, - 0x3b52c: 0x6e186420, 0x3b52d: 0x6e186620, 0x3b52e: 0x6e186820, 0x3b52f: 0x6e186a20, - 0x3b530: 0x6e186c20, 0x3b531: 0x6e186e20, 0x3b532: 0x6e187020, 0x3b533: 0x6e187220, - 0x3b534: 0x6e187420, 0x3b535: 0x6e187620, 0x3b536: 0x6e187820, 0x3b537: 0x6e187a20, - 0x3b538: 0x6e187c20, 0x3b539: 0x6e187e20, 0x3b53a: 0x6e188020, 0x3b53b: 0x6e188220, - 0x3b53c: 0x6e188420, 0x3b53d: 0x6e188620, 0x3b53e: 0x6e188820, 0x3b53f: 0x6e188a20, - // Block 0xed5, offset 0x3b540 - 0x3b540: 0x6e188c20, 0x3b541: 0x6e188e20, 0x3b542: 0x6e250a20, 0x3b543: 0x6e250c20, - 0x3b544: 0x6e250e20, 0x3b545: 0x6e251020, 0x3b546: 0x6e251220, 0x3b547: 0x6e251420, - 0x3b548: 0x6e251620, 0x3b549: 0x6e251820, 0x3b54a: 0x6e251a20, 0x3b54b: 0x6e251c20, - 0x3b54c: 0x6e251e20, 0x3b54d: 0x6e252020, 0x3b54e: 0x6e252220, 0x3b54f: 0x6e252420, - 0x3b550: 0x6e252620, 0x3b551: 0x6e252820, 0x3b552: 0x6e252a20, 0x3b553: 0x6e252c20, - 0x3b554: 0x6e252e20, 0x3b555: 0x6e253020, 0x3b556: 0x6e253220, 0x3b557: 0x6e253420, - 0x3b558: 0x6e253620, 0x3b559: 0x6e253820, 0x3b55a: 0x6e253a20, 0x3b55b: 0x6e253c20, - 0x3b55c: 0x6e253e20, 0x3b55d: 0x6e254020, 0x3b55e: 0x6e2eb220, 0x3b55f: 0x6e2eb420, - 0x3b560: 0x6e2eb620, 0x3b561: 0x6e2eb820, 0x3b562: 0x6e2eba20, 0x3b563: 0x6e2ebc20, - 0x3b564: 0x6e2ebe20, 0x3b565: 0x6e2ec020, 0x3b566: 0x6e2ec220, 0x3b567: 0x6e2ec420, - 0x3b568: 0x6e2ec620, 0x3b569: 0x6e2ec820, 0x3b56a: 0x6e2eca20, 0x3b56b: 0x6e2ecc20, - 0x3b56c: 0x6e2ece20, 0x3b56d: 0x6e2ed020, 0x3b56e: 0x6e2ed220, 0x3b56f: 0x6e2ed420, - 0x3b570: 0x6e2ed620, 0x3b571: 0x6e2ed820, 0x3b572: 0x6e2eda20, 0x3b573: 0x6e2edc20, - 0x3b574: 0x6e2ede20, 0x3b575: 0x6e2ee020, 0x3b576: 0x6e362820, 0x3b577: 0x6e362a20, - 0x3b578: 0x6e362c20, 0x3b579: 0x6e362e20, 0x3b57a: 0x6e363020, 0x3b57b: 0x6e363220, - 0x3b57c: 0x6e363420, 0x3b57d: 0x6e363620, 0x3b57e: 0x6e363820, 0x3b57f: 0x6e363a20, - // Block 0xed6, offset 0x3b580 - 0x3b580: 0x6e363c20, 0x3b581: 0x6e363e20, 0x3b582: 0x6e3b5820, 0x3b583: 0x6e3b5a20, - 0x3b584: 0x6e3b5c20, 0x3b585: 0x6e3b5e20, 0x3b586: 0x6e3b6020, 0x3b587: 0x6e3b6220, - 0x3b588: 0x6e3b6420, 0x3b589: 0x6e3b6620, 0x3b58a: 0x6e3b6820, 0x3b58b: 0x6e3b6a20, - 0x3b58c: 0x6e3b6c20, 0x3b58d: 0x6e3b6e20, 0x3b58e: 0x6e3b7020, 0x3b58f: 0x6e3f1c20, - 0x3b590: 0x6e3f1e20, 0x3b591: 0x6e3f2020, 0x3b592: 0x6e3f2220, 0x3b593: 0x6e3f2420, - 0x3b594: 0x6e41ac20, 0x3b595: 0x6e41ae20, 0x3b596: 0x6e41b020, 0x3b597: 0x6e41b220, - 0x3b598: 0x6e437e20, 0x3b599: 0x6e438020, 0x3b59a: 0x6e438220, 0x3b59b: 0x6e438420, - 0x3b59c: 0x6e438620, 0x3b59d: 0x6e438820, 0x3b59e: 0x6e438a20, 0x3b59f: 0x6e44c420, - 0x3b5a0: 0x6e44c620, 0x3b5a1: 0x6e457820, 0x3b5a2: 0x6e457a20, 0x3b5a3: 0x6e45ec20, - 0x3b5a4: 0x6e45ee20, 0x3b5a5: 0x6e46f420, 0x3b5a6: 0x6c28a020, 0x3b5a7: 0x6c42c620, - 0x3b5a8: 0x6c42c820, 0x3b5a9: 0x6c42ca20, 0x3b5aa: 0x6c42cc20, 0x3b5ab: 0x6c42ce20, - 0x3b5ac: 0x6c42d020, 0x3b5ad: 0x6c42d220, 0x3b5ae: 0x6c639620, 0x3b5af: 0x6c42d420, - 0x3b5b0: 0x6c639820, 0x3b5b1: 0x6c639a20, 0x3b5b2: 0x6c639c20, 0x3b5b3: 0x6c639e20, - 0x3b5b4: 0x6c63a020, 0x3b5b5: 0x6c63a220, 0x3b5b6: 0x6c63a420, 0x3b5b7: 0x6c8aa020, - 0x3b5b8: 0x6c8aa220, 0x3b5b9: 0x6c8aa420, 0x3b5ba: 0x6c8aa620, 0x3b5bb: 0x6cb72220, - 0x3b5bc: 0x6cb72420, 0x3b5bd: 0x6cb72620, 0x3b5be: 0x6ce80e20, 0x3b5bf: 0x6ce81020, - // Block 0xed7, offset 0x3b5c0 - 0x3b5c0: 0x6ce81220, 0x3b5c1: 0x6ce81420, 0x3b5c2: 0x6ce81620, 0x3b5c3: 0x6ce81820, - 0x3b5c4: 0x6d173a20, 0x3b5c5: 0x6ce81a20, 0x3b5c6: 0x6ce81c20, 0x3b5c7: 0x6ce81e20, - 0x3b5c8: 0x6ce82020, 0x3b5c9: 0x6ce82220, 0x3b5ca: 0x6ce82420, 0x3b5cb: 0x6d173c20, - 0x3b5cc: 0x6d173e20, 0x3b5cd: 0x6d174020, 0x3b5ce: 0x6d72ac20, 0x3b5cf: 0x6d72ae20, - 0x3b5d0: 0x6ddca620, 0x3b5d1: 0x6cb73020, 0x3b5d2: 0x6cb73220, 0x3b5d3: 0x6cb73420, - 0x3b5d4: 0x6ce82e20, 0x3b5d5: 0x6ce83020, 0x3b5d6: 0x6ce83220, 0x3b5d7: 0x6ce83420, - 0x3b5d8: 0x6ce83620, 0x3b5d9: 0x6ce83820, 0x3b5da: 0x6ce83a20, 0x3b5db: 0x6ce83c20, - 0x3b5dc: 0x6d175220, 0x3b5dd: 0x6d175420, 0x3b5de: 0x6d175620, 0x3b5df: 0x6d175820, - 0x3b5e0: 0x6d175a20, 0x3b5e1: 0x6d175c20, 0x3b5e2: 0x6d175e20, 0x3b5e3: 0x6d176020, - 0x3b5e4: 0x6d176220, 0x3b5e5: 0x6d176420, 0x3b5e6: 0x6d176620, 0x3b5e7: 0x6d176820, - 0x3b5e8: 0x6d176a20, 0x3b5e9: 0x6d176c20, 0x3b5ea: 0x6d176e20, 0x3b5eb: 0x6d177020, - 0x3b5ec: 0x6d45c220, 0x3b5ed: 0x6d45c420, 0x3b5ee: 0x6d45c620, 0x3b5ef: 0x6d45c820, - 0x3b5f0: 0x6d45ca20, 0x3b5f1: 0x6d45cc20, 0x3b5f2: 0x6d45ce20, 0x3b5f3: 0x6d45d020, - 0x3b5f4: 0x6d45d220, 0x3b5f5: 0x6d45d420, 0x3b5f6: 0x6d45d620, 0x3b5f7: 0x6d45d820, - 0x3b5f8: 0x6d45da20, 0x3b5f9: 0x6d45dc20, 0x3b5fa: 0x6d45de20, 0x3b5fb: 0x6d45e020, - 0x3b5fc: 0x6d45e220, 0x3b5fd: 0x6d72c820, 0x3b5fe: 0x6d72ca20, 0x3b5ff: 0x6d72cc20, - // Block 0xed8, offset 0x3b600 - 0x3b600: 0x6d72ce20, 0x3b601: 0x6d72d020, 0x3b602: 0x6d72d220, 0x3b603: 0x6d72d420, - 0x3b604: 0x6d72d620, 0x3b605: 0x6d72d820, 0x3b606: 0x6d72da20, 0x3b607: 0x6d72dc20, - 0x3b608: 0x6d72de20, 0x3b609: 0x6d9c4c20, 0x3b60a: 0x6d9c4e20, 0x3b60b: 0x6d9c5020, - 0x3b60c: 0x6d9c5220, 0x3b60d: 0x6d9c5420, 0x3b60e: 0x6d9c5620, 0x3b60f: 0x6d9c5820, - 0x3b610: 0x6d9c5a20, 0x3b611: 0x6d9c5c20, 0x3b612: 0x6d9c5e20, 0x3b613: 0x6d9c6020, - 0x3b614: 0x6d9c6220, 0x3b615: 0x6d9c6420, 0x3b616: 0x6d9c6620, 0x3b617: 0x6dbed620, - 0x3b618: 0x6dbed820, 0x3b619: 0x6dbeda20, 0x3b61a: 0x6dbedc20, 0x3b61b: 0x6dbede20, - 0x3b61c: 0x6dbee020, 0x3b61d: 0x6dbee220, 0x3b61e: 0x6dbee420, 0x3b61f: 0x6dbee620, - 0x3b620: 0x6dbee820, 0x3b621: 0x6dbeea20, 0x3b622: 0x6dbeec20, 0x3b623: 0x6dbeee20, - 0x3b624: 0x6dbef020, 0x3b625: 0x6dbef220, 0x3b626: 0x6dbef420, 0x3b627: 0x6dbef620, - 0x3b628: 0x6dbef820, 0x3b629: 0x6dbefa20, 0x3b62a: 0x6dbefc20, 0x3b62b: 0x6dbefe20, - 0x3b62c: 0x6dbf0020, 0x3b62d: 0x6ddcb020, 0x3b62e: 0x6ddcb220, 0x3b62f: 0x6ddcb420, - 0x3b630: 0x6ddcb620, 0x3b631: 0x6ddcb820, 0x3b632: 0x6ddcba20, 0x3b633: 0x6ddcbc20, - 0x3b634: 0x6ddcbe20, 0x3b635: 0x6ddcc020, 0x3b636: 0x6ddcc220, 0x3b637: 0x6ddcc420, - 0x3b638: 0x6ddcc620, 0x3b639: 0x6ddcc820, 0x3b63a: 0x6ddcca20, 0x3b63b: 0x6ddccc20, - 0x3b63c: 0x6ddcce20, 0x3b63d: 0x6ddcd020, 0x3b63e: 0x6ddcd220, 0x3b63f: 0x6ddcd420, - // Block 0xed9, offset 0x3b640 - 0x3b640: 0x6df49220, 0x3b641: 0x6df49420, 0x3b642: 0x6df49620, 0x3b643: 0x6df49820, - 0x3b644: 0x6df49a20, 0x3b645: 0x6df49c20, 0x3b646: 0x6df49e20, 0x3b647: 0x6df4a020, - 0x3b648: 0x6df4a220, 0x3b649: 0x6e088420, 0x3b64a: 0x6e088620, 0x3b64b: 0x6e088820, - 0x3b64c: 0x6e088a20, 0x3b64d: 0x6e088c20, 0x3b64e: 0x6e088e20, 0x3b64f: 0x6e089020, - 0x3b650: 0x6e089220, 0x3b651: 0x6e089420, 0x3b652: 0x6e089620, 0x3b653: 0x6e089820, - 0x3b654: 0x6e089a20, 0x3b655: 0x6e089c20, 0x3b656: 0x6e089e20, 0x3b657: 0x6e189a20, - 0x3b658: 0x6e189c20, 0x3b659: 0x6e189e20, 0x3b65a: 0x6e18a020, 0x3b65b: 0x6e18a220, - 0x3b65c: 0x6e18a420, 0x3b65d: 0x6e18a620, 0x3b65e: 0x6e18a820, 0x3b65f: 0x6e18aa20, - 0x3b660: 0x6e254a20, 0x3b661: 0x6e254c20, 0x3b662: 0x6e254e20, 0x3b663: 0x6e255020, - 0x3b664: 0x6e255220, 0x3b665: 0x6e255420, 0x3b666: 0x6e255620, 0x3b667: 0x6e255820, - 0x3b668: 0x6e255a20, 0x3b669: 0x6e255c20, 0x3b66a: 0x6e255e20, 0x3b66b: 0x6e256020, - 0x3b66c: 0x6e2eec20, 0x3b66d: 0x6e2eee20, 0x3b66e: 0x6e2ef020, 0x3b66f: 0x6e2ef220, - 0x3b670: 0x6e2ef420, 0x3b671: 0x6e2ef620, 0x3b672: 0x6e364620, 0x3b673: 0x6e364820, - 0x3b674: 0x6e364a20, 0x3b675: 0x6e364c20, 0x3b676: 0x6e364e20, 0x3b677: 0x6e3b7620, - 0x3b678: 0x6e3b7820, 0x3b679: 0x6e3b7a20, 0x3b67a: 0x6e3b7c20, 0x3b67b: 0x6e3f2a20, - 0x3b67c: 0x6e41b620, 0x3b67d: 0x6e41b820, 0x3b67e: 0x6e438c20, 0x3b67f: 0x6d177420, - // Block 0xeda, offset 0x3b680 - 0x3b680: 0x6d177620, 0x3b681: 0x6d45e820, 0x3b682: 0x6d45ea20, 0x3b683: 0x6d45ec20, - 0x3b684: 0x6d45ee20, 0x3b685: 0x6d45f020, 0x3b686: 0x6d45f220, 0x3b687: 0x6d45f420, - 0x3b688: 0x6d45f620, 0x3b689: 0x6d45f820, 0x3b68a: 0x6d72e420, 0x3b68b: 0x6d72e620, - 0x3b68c: 0x6d72e820, 0x3b68d: 0x6d72ea20, 0x3b68e: 0x6d9c6a20, 0x3b68f: 0x6d9c6c20, - 0x3b690: 0x6d9c6e20, 0x3b691: 0x6d9c7020, 0x3b692: 0x6d9c7220, 0x3b693: 0x6d9c7420, - 0x3b694: 0x6d9c7620, 0x3b695: 0x6dbf0220, 0x3b696: 0x6dbf0420, 0x3b697: 0x6dbf0620, - 0x3b698: 0x6dbf0820, 0x3b699: 0x6dbf0a20, 0x3b69a: 0x6ddcdc20, 0x3b69b: 0x6ddcde20, - 0x3b69c: 0x6ddce020, 0x3b69d: 0x6ddce220, 0x3b69e: 0x6df4a620, 0x3b69f: 0x6df4a820, - 0x3b6a0: 0x6e08a020, 0x3b6a1: 0x6e08a220, 0x3b6a2: 0x6e08a420, 0x3b6a3: 0x6e08a620, - 0x3b6a4: 0x6e08a820, 0x3b6a5: 0x6e18ac20, 0x3b6a6: 0x6e18ae20, 0x3b6a7: 0x6e256620, - 0x3b6a8: 0x6e2efa20, 0x3b6a9: 0x6e2efc20, 0x3b6aa: 0x6e2efe20, 0x3b6ab: 0x6e365020, - 0x3b6ac: 0x6e365220, 0x3b6ad: 0x6e3b8020, 0x3b6ae: 0x6e3f2c20, 0x3b6af: 0x6e3f2e20, - 0x3b6b0: 0x6e41ba20, 0x3b6b1: 0x6e41bc20, 0x3b6b2: 0x6e438e20, 0x3b6b3: 0x6e45f020, - 0x3b6b4: 0x6ce84820, 0x3b6b5: 0x6ce84a20, 0x3b6b6: 0x6ce84c20, 0x3b6b7: 0x6ce84e20, - 0x3b6b8: 0x6ce85020, 0x3b6b9: 0x6d177c20, 0x3b6ba: 0x6d177e20, 0x3b6bb: 0x6d178020, - 0x3b6bc: 0x6d178220, 0x3b6bd: 0x6d178420, 0x3b6be: 0x6d178620, 0x3b6bf: 0x6d461620, - // Block 0xedb, offset 0x3b6c0 - 0x3b6c0: 0x6d461820, 0x3b6c1: 0x6d461a20, 0x3b6c2: 0x6d461c20, 0x3b6c3: 0x6d461e20, - 0x3b6c4: 0x6d462020, 0x3b6c5: 0x6d462220, 0x3b6c6: 0x6d462420, 0x3b6c7: 0x6d462620, - 0x3b6c8: 0x6d462820, 0x3b6c9: 0x6d462a20, 0x3b6ca: 0x6d462c20, 0x3b6cb: 0x6d462e20, - 0x3b6cc: 0x6d463020, 0x3b6cd: 0x6d463220, 0x3b6ce: 0x6d463420, 0x3b6cf: 0x6d463620, - 0x3b6d0: 0x6d463820, 0x3b6d1: 0x6d730420, 0x3b6d2: 0x6d730620, 0x3b6d3: 0x6d730820, - 0x3b6d4: 0x6d730a20, 0x3b6d5: 0x6d730c20, 0x3b6d6: 0x6d730e20, 0x3b6d7: 0x6d731020, - 0x3b6d8: 0x6d731220, 0x3b6d9: 0x6d731420, 0x3b6da: 0x6d731620, 0x3b6db: 0x6d731820, - 0x3b6dc: 0x6d731a20, 0x3b6dd: 0x6d731c20, 0x3b6de: 0x6d731e20, 0x3b6df: 0x6d732020, - 0x3b6e0: 0x6d732220, 0x3b6e1: 0x6d732420, 0x3b6e2: 0x6d732620, 0x3b6e3: 0x6d732820, - 0x3b6e4: 0x6d732a20, 0x3b6e5: 0x6d732c20, 0x3b6e6: 0x6d732e20, 0x3b6e7: 0x6d733020, - 0x3b6e8: 0x6d733220, 0x3b6e9: 0x6d733420, 0x3b6ea: 0x6d733620, 0x3b6eb: 0x6d733820, - 0x3b6ec: 0x6d733a20, 0x3b6ed: 0x6d733c20, 0x3b6ee: 0x6d733e20, 0x3b6ef: 0x6d734020, - 0x3b6f0: 0x6d9c9020, 0x3b6f1: 0x6d9c9220, 0x3b6f2: 0x6d9c9420, 0x3b6f3: 0x6d9c9620, - 0x3b6f4: 0x6d9c9820, 0x3b6f5: 0x6d9c9a20, 0x3b6f6: 0x6d9c9c20, 0x3b6f7: 0x6d9c9e20, - 0x3b6f8: 0x6d9ca020, 0x3b6f9: 0x6d9ca220, 0x3b6fa: 0x6d9ca420, 0x3b6fb: 0x6d9ca620, - 0x3b6fc: 0x6d9ca820, 0x3b6fd: 0x6d9caa20, 0x3b6fe: 0x6d9cac20, 0x3b6ff: 0x6d9cae20, - // Block 0xedc, offset 0x3b700 - 0x3b700: 0x6d9cb020, 0x3b701: 0x6d9cb220, 0x3b702: 0x6d9cb420, 0x3b703: 0x6d9cb620, - 0x3b704: 0x6d9cb820, 0x3b705: 0x6d9cba20, 0x3b706: 0x6d9cbc20, 0x3b707: 0x6dbf2220, - 0x3b708: 0x6dbf2420, 0x3b709: 0x6dbf2620, 0x3b70a: 0x6dbf2820, 0x3b70b: 0x6dbf2a20, - 0x3b70c: 0x6dbf2c20, 0x3b70d: 0x6dbf2e20, 0x3b70e: 0x6dbf3020, 0x3b70f: 0x6dbf3220, - 0x3b710: 0x6dbf3420, 0x3b711: 0x6dbf3620, 0x3b712: 0x6dbf3820, 0x3b713: 0x6dbf3a20, - 0x3b714: 0x6dbf3c20, 0x3b715: 0x6dbf3e20, 0x3b716: 0x6dbf4020, 0x3b717: 0x6dbf4220, - 0x3b718: 0x6dbf4420, 0x3b719: 0x6dbf4620, 0x3b71a: 0x6dbf4820, 0x3b71b: 0x6dbf4a20, - 0x3b71c: 0x6dbf4c20, 0x3b71d: 0x6dbf4e20, 0x3b71e: 0x6ddcfc20, 0x3b71f: 0x6ddcfe20, - 0x3b720: 0x6ddd0020, 0x3b721: 0x6ddd0220, 0x3b722: 0x6ddd0420, 0x3b723: 0x6ddd0620, - 0x3b724: 0x6ddd0820, 0x3b725: 0x6ddd0a20, 0x3b726: 0x6ddd0c20, 0x3b727: 0x6ddd0e20, - 0x3b728: 0x6ddd1020, 0x3b729: 0x6ddd1220, 0x3b72a: 0x6ddd1420, 0x3b72b: 0x6ddd1620, - 0x3b72c: 0x6ddd1820, 0x3b72d: 0x6ddd1a20, 0x3b72e: 0x6ddd1c20, 0x3b72f: 0x6ddd1e20, - 0x3b730: 0x6ddd2020, 0x3b731: 0x6ddd2220, 0x3b732: 0x6ddd2420, 0x3b733: 0x6ddd2620, - 0x3b734: 0x6ddd2820, 0x3b735: 0x6ddd2a20, 0x3b736: 0x6ddd2c20, 0x3b737: 0x6ddd2e20, - 0x3b738: 0x6ddd3020, 0x3b739: 0x6ddd3220, 0x3b73a: 0x6df4c020, 0x3b73b: 0x6df4c220, - 0x3b73c: 0x6df4c420, 0x3b73d: 0x6df4c620, 0x3b73e: 0x6df4c820, 0x3b73f: 0x6df4ca20, - // Block 0xedd, offset 0x3b740 - 0x3b740: 0x6df4cc20, 0x3b741: 0x6df4ce20, 0x3b742: 0x6df4d020, 0x3b743: 0x6df4d220, - 0x3b744: 0x6df4d420, 0x3b745: 0x6df4d620, 0x3b746: 0x6df4d820, 0x3b747: 0x6df4da20, - 0x3b748: 0x6df4dc20, 0x3b749: 0x6df4de20, 0x3b74a: 0x6df4e020, 0x3b74b: 0x6df4e220, - 0x3b74c: 0x6df4e420, 0x3b74d: 0x6df4e620, 0x3b74e: 0x6df4e820, 0x3b74f: 0x6df4ea20, - 0x3b750: 0x6df4ec20, 0x3b751: 0x6df4ee20, 0x3b752: 0x6df4f020, 0x3b753: 0x6df4f220, - 0x3b754: 0x6df4f420, 0x3b755: 0x6df4f620, 0x3b756: 0x6e08ba20, 0x3b757: 0x6e08bc20, - 0x3b758: 0x6e08be20, 0x3b759: 0x6e08c020, 0x3b75a: 0x6e08c220, 0x3b75b: 0x6e08c420, - 0x3b75c: 0x6e08c620, 0x3b75d: 0x6e08c820, 0x3b75e: 0x6e08ca20, 0x3b75f: 0x6e08cc20, - 0x3b760: 0x6e08ce20, 0x3b761: 0x6e08d020, 0x3b762: 0x6e08d220, 0x3b763: 0x6e08d420, - 0x3b764: 0x6e08d620, 0x3b765: 0x6e08d820, 0x3b766: 0x6e08da20, 0x3b767: 0x6e08dc20, - 0x3b768: 0x6e08de20, 0x3b769: 0x6e08e020, 0x3b76a: 0x6e08e220, 0x3b76b: 0x6e08e420, - 0x3b76c: 0x6e08e620, 0x3b76d: 0x6e08e820, 0x3b76e: 0x6e08ea20, 0x3b76f: 0x6e18be20, - 0x3b770: 0x6e18c020, 0x3b771: 0x6e18c220, 0x3b772: 0x6e18c420, 0x3b773: 0x6e18c620, - 0x3b774: 0x6e18c820, 0x3b775: 0x6e18ca20, 0x3b776: 0x6e18cc20, 0x3b777: 0x6e18ce20, - 0x3b778: 0x6e18d020, 0x3b779: 0x6e18d220, 0x3b77a: 0x6e18d420, 0x3b77b: 0x6e18d620, - 0x3b77c: 0x6e18d820, 0x3b77d: 0x6e18da20, 0x3b77e: 0x6e18dc20, 0x3b77f: 0x6e18de20, - // Block 0xede, offset 0x3b780 - 0x3b780: 0x6e18e020, 0x3b781: 0x6e18e220, 0x3b782: 0x6e18e420, 0x3b783: 0x6e257420, - 0x3b784: 0x6e257620, 0x3b785: 0x6e257820, 0x3b786: 0x6e257a20, 0x3b787: 0x6e257c20, - 0x3b788: 0x6e257e20, 0x3b789: 0x6e258020, 0x3b78a: 0x6e258220, 0x3b78b: 0x6e258420, - 0x3b78c: 0x6e258620, 0x3b78d: 0x6e258820, 0x3b78e: 0x6e258a20, 0x3b78f: 0x6e258c20, - 0x3b790: 0x6e258e20, 0x3b791: 0x6e259020, 0x3b792: 0x6e259220, 0x3b793: 0x6e259420, - 0x3b794: 0x6e259620, 0x3b795: 0x6e259820, 0x3b796: 0x6e259a20, 0x3b797: 0x6e259c20, - 0x3b798: 0x6e259e20, 0x3b799: 0x6e25a020, 0x3b79a: 0x6e25a220, 0x3b79b: 0x6e2f0620, - 0x3b79c: 0x6e2f0820, 0x3b79d: 0x6e2f0a20, 0x3b79e: 0x6e2f0c20, 0x3b79f: 0x6e2f0e20, - 0x3b7a0: 0x6e2f1020, 0x3b7a1: 0x6e2f1220, 0x3b7a2: 0x6e2f1420, 0x3b7a3: 0x6e2f1620, - 0x3b7a4: 0x6e2f1820, 0x3b7a5: 0x6e2f1a20, 0x3b7a6: 0x6e366020, 0x3b7a7: 0x6e366220, - 0x3b7a8: 0x6e366420, 0x3b7a9: 0x6e366620, 0x3b7aa: 0x6e366820, 0x3b7ab: 0x6e366a20, - 0x3b7ac: 0x6e366c20, 0x3b7ad: 0x6e366e20, 0x3b7ae: 0x6e367020, 0x3b7af: 0x6e367220, - 0x3b7b0: 0x6e3b8820, 0x3b7b1: 0x6e3b8a20, 0x3b7b2: 0x6e3b8c20, 0x3b7b3: 0x6e3b8e20, - 0x3b7b4: 0x6e3b9020, 0x3b7b5: 0x6e3b9220, 0x3b7b6: 0x6e3b9420, 0x3b7b7: 0x6e3b9620, - 0x3b7b8: 0x6e3b9820, 0x3b7b9: 0x6e3b9a20, 0x3b7ba: 0x6e3f3220, 0x3b7bb: 0x6e3f3420, - 0x3b7bc: 0x6e3f3620, 0x3b7bd: 0x6e3f3820, 0x3b7be: 0x6e3f3a20, 0x3b7bf: 0x6e3f3c20, - // Block 0xedf, offset 0x3b7c0 - 0x3b7c0: 0x6e3f3e20, 0x3b7c1: 0x6e41c020, 0x3b7c2: 0x6e41c220, 0x3b7c3: 0x6e41c420, - 0x3b7c4: 0x6e41c620, 0x3b7c5: 0x6e439020, 0x3b7c6: 0x6e439220, 0x3b7c7: 0x6e439420, - 0x3b7c8: 0x6e45f220, 0x3b7c9: 0x6e465420, 0x3b7ca: 0x6c8ab620, 0x3b7cb: 0x6c8ab820, - 0x3b7cc: 0x6d178c20, 0x3b7cd: 0x6d463e20, 0x3b7ce: 0x6d464020, 0x3b7cf: 0x6d464220, - 0x3b7d0: 0x6d734620, 0x3b7d1: 0x6d9cc220, 0x3b7d2: 0x6dbf5420, 0x3b7d3: 0x6ddd3a20, - 0x3b7d4: 0x6ddd3c20, 0x3b7d5: 0x6e08f020, 0x3b7d6: 0x6e18ea20, 0x3b7d7: 0x6e18ec20, - 0x3b7d8: 0x6e18ee20, 0x3b7d9: 0x6e25a620, 0x3b7da: 0x6e25a820, 0x3b7db: 0x6e2f1c20, - 0x3b7dc: 0x6e367820, 0x3b7dd: 0x6e367a20, 0x3b7de: 0x6e367c20, 0x3b7df: 0x6e439620, - 0x3b7e0: 0x6d734820, 0x3b7e1: 0x6d734a20, 0x3b7e2: 0x6d9cc420, 0x3b7e3: 0x6ddd3e20, - 0x3b7e4: 0x6e08f220, 0x3b7e5: 0x6e18f020, 0x3b7e6: 0x6e18f220, 0x3b7e7: 0x6e25aa20, - 0x3b7e8: 0x6e2f1e20, 0x3b7e9: 0x6e41cc20, 0x3b7ea: 0x6e439820, 0x3b7eb: 0x6d178e20, - 0x3b7ec: 0x6d179020, 0x3b7ed: 0x6d464820, 0x3b7ee: 0x6d464a20, 0x3b7ef: 0x6d734e20, - 0x3b7f0: 0x6d735020, 0x3b7f1: 0x6d9cca20, 0x3b7f2: 0x6d9ccc20, 0x3b7f3: 0x6d9cce20, - 0x3b7f4: 0x6d9cd020, 0x3b7f5: 0x6d9cd220, 0x3b7f6: 0x6d9cd420, 0x3b7f7: 0x6d9cd620, - 0x3b7f8: 0x6d9cd820, 0x3b7f9: 0x6dbf5820, 0x3b7fa: 0x6dbf5a20, 0x3b7fb: 0x6dbf5c20, - 0x3b7fc: 0x6dbf5e20, 0x3b7fd: 0x6dbf6020, 0x3b7fe: 0x6ddd4420, 0x3b7ff: 0x6ddd4620, - // Block 0xee0, offset 0x3b800 - 0x3b800: 0x6ddd4820, 0x3b801: 0x6ddd4a20, 0x3b802: 0x6ddd4c20, 0x3b803: 0x6df4fc20, - 0x3b804: 0x6df4fe20, 0x3b805: 0x6df50020, 0x3b806: 0x6df50220, 0x3b807: 0x6e08f620, - 0x3b808: 0x6e08f820, 0x3b809: 0x6e08fa20, 0x3b80a: 0x6e08fc20, 0x3b80b: 0x6e08fe20, - 0x3b80c: 0x6e18f820, 0x3b80d: 0x6e18fa20, 0x3b80e: 0x6e18fc20, 0x3b80f: 0x6e18fe20, - 0x3b810: 0x6e190020, 0x3b811: 0x6e190220, 0x3b812: 0x6e25b020, 0x3b813: 0x6e25b220, - 0x3b814: 0x6e25b420, 0x3b815: 0x6e25b620, 0x3b816: 0x6e2f2020, 0x3b817: 0x6e2f2220, - 0x3b818: 0x6e2f2420, 0x3b819: 0x6e2f2620, 0x3b81a: 0x6e2f2820, 0x3b81b: 0x6e2f2a20, - 0x3b81c: 0x6e2f2c20, 0x3b81d: 0x6e2f2e20, 0x3b81e: 0x6e2f3020, 0x3b81f: 0x6e2f3220, - 0x3b820: 0x6e367e20, 0x3b821: 0x6e368020, 0x3b822: 0x6e368220, 0x3b823: 0x6e368420, - 0x3b824: 0x6e3ba020, 0x3b825: 0x6e3ba220, 0x3b826: 0x6e3f4020, 0x3b827: 0x6e3f4220, - 0x3b828: 0x6e3f4420, 0x3b829: 0x6e3f4620, 0x3b82a: 0x6e3f4820, 0x3b82b: 0x6e41ce20, - 0x3b82c: 0x6e41d020, 0x3b82d: 0x6e439a20, 0x3b82e: 0x6e439c20, 0x3b82f: 0x6e44cc20, - 0x3b830: 0x6e44ce20, 0x3b831: 0x6e457c20, 0x3b832: 0x6e457e20, 0x3b833: 0x6e458020, - 0x3b834: 0x6e45f420, 0x3b835: 0x6e45f620, 0x3b836: 0x6e465620, 0x3b837: 0x6e470e20, - 0x3b838: 0x6e471020, 0x3b839: 0x6cb73a20, 0x3b83a: 0x6cb73c20, 0x3b83b: 0x6cb73e20, - 0x3b83c: 0x6cb74020, 0x3b83d: 0x6ce85220, 0x3b83e: 0x6ce85420, 0x3b83f: 0x6ce85620, - // Block 0xee1, offset 0x3b840 - 0x3b840: 0x6ce85820, 0x3b841: 0x6ce85a20, 0x3b842: 0x6ce85c20, 0x3b843: 0x6ce85e20, - 0x3b844: 0x6ce86020, 0x3b845: 0x6ce86220, 0x3b846: 0x6ce86420, 0x3b847: 0x6ce86620, - 0x3b848: 0x6ce86820, 0x3b849: 0x6ce86a20, 0x3b84a: 0x6d179420, 0x3b84b: 0x6d179620, - 0x3b84c: 0x6d179820, 0x3b84d: 0x6d179a20, 0x3b84e: 0x6d179c20, 0x3b84f: 0x6d179e20, - 0x3b850: 0x6d17a020, 0x3b851: 0x6d17a220, 0x3b852: 0x6d17a420, 0x3b853: 0x6d17a620, - 0x3b854: 0x6d17a820, 0x3b855: 0x6d17aa20, 0x3b856: 0x6d17ac20, 0x3b857: 0x6d17ae20, - 0x3b858: 0x6d17b020, 0x3b859: 0x6d17b220, 0x3b85a: 0x6d17b420, 0x3b85b: 0x6d17b620, - 0x3b85c: 0x6d17b820, 0x3b85d: 0x6d17ba20, 0x3b85e: 0x6d17bc20, 0x3b85f: 0x6d17be20, - 0x3b860: 0x6d17c020, 0x3b861: 0x6d465a20, 0x3b862: 0x6d465c20, 0x3b863: 0x6d465e20, - 0x3b864: 0x6d466020, 0x3b865: 0x6d466220, 0x3b866: 0x6d466420, 0x3b867: 0x6d466620, - 0x3b868: 0x6d466820, 0x3b869: 0x6d466a20, 0x3b86a: 0x6d466c20, 0x3b86b: 0x6d466e20, - 0x3b86c: 0x6d467020, 0x3b86d: 0x6d467220, 0x3b86e: 0x6d467420, 0x3b86f: 0x6d467620, - 0x3b870: 0x6d467820, 0x3b871: 0x6d467a20, 0x3b872: 0x6d467c20, 0x3b873: 0x6d467e20, - 0x3b874: 0x6d468020, 0x3b875: 0x6d468220, 0x3b876: 0x6d468420, 0x3b877: 0x6d468620, - 0x3b878: 0x6d468820, 0x3b879: 0x6d468a20, 0x3b87a: 0x6d736020, 0x3b87b: 0x6d736220, - 0x3b87c: 0x6d736420, 0x3b87d: 0x6d736620, 0x3b87e: 0x6d736820, 0x3b87f: 0x6d736a20, - // Block 0xee2, offset 0x3b880 - 0x3b880: 0x6d736c20, 0x3b881: 0x6d736e20, 0x3b882: 0x6d737020, 0x3b883: 0x6d737220, - 0x3b884: 0x6d737420, 0x3b885: 0x6d737620, 0x3b886: 0x6d737820, 0x3b887: 0x6d737a20, - 0x3b888: 0x6d737c20, 0x3b889: 0x6d737e20, 0x3b88a: 0x6d738020, 0x3b88b: 0x6d738220, - 0x3b88c: 0x6d9ce020, 0x3b88d: 0x6d9ce220, 0x3b88e: 0x6d9ce420, 0x3b88f: 0x6d9ce620, - 0x3b890: 0x6d9ce820, 0x3b891: 0x6d9cea20, 0x3b892: 0x6d9cec20, 0x3b893: 0x6d9cee20, - 0x3b894: 0x6d9cf020, 0x3b895: 0x6d9cf220, 0x3b896: 0x6d9cf420, 0x3b897: 0x6d9cf620, - 0x3b898: 0x6d9cf820, 0x3b899: 0x6d9cfa20, 0x3b89a: 0x6d9cfc20, 0x3b89b: 0x6d9cfe20, - 0x3b89c: 0x6d9d0020, 0x3b89d: 0x6d9d0220, 0x3b89e: 0x6d9d0420, 0x3b89f: 0x6d9d0620, - 0x3b8a0: 0x6d9d0820, 0x3b8a1: 0x6d9d0a20, 0x3b8a2: 0x6dbf6620, 0x3b8a3: 0x6dbf6820, - 0x3b8a4: 0x6dbf6a20, 0x3b8a5: 0x6dbf6c20, 0x3b8a6: 0x6dbf6e20, 0x3b8a7: 0x6dbf7020, - 0x3b8a8: 0x6dbf7220, 0x3b8a9: 0x6dbf7420, 0x3b8aa: 0x6dbf7620, 0x3b8ab: 0x6dbf7820, - 0x3b8ac: 0x6dbf7a20, 0x3b8ad: 0x6dbf7c20, 0x3b8ae: 0x6dbf7e20, 0x3b8af: 0x6dbf8020, - 0x3b8b0: 0x6dbf8220, 0x3b8b1: 0x6dbf8420, 0x3b8b2: 0x6dbf8620, 0x3b8b3: 0x6dbf8820, - 0x3b8b4: 0x6dbf8a20, 0x3b8b5: 0x6ddd6220, 0x3b8b6: 0x6ddd6420, 0x3b8b7: 0x6ddd6620, - 0x3b8b8: 0x6ddd6820, 0x3b8b9: 0x6ddd6a20, 0x3b8ba: 0x6ddd6c20, 0x3b8bb: 0x6ddd6e20, - 0x3b8bc: 0x6ddd7020, 0x3b8bd: 0x6ddd7220, 0x3b8be: 0x6ddd7420, 0x3b8bf: 0x6ddd7620, - // Block 0xee3, offset 0x3b8c0 - 0x3b8c0: 0x6ddd7820, 0x3b8c1: 0x6ddd7a20, 0x3b8c2: 0x6ddd7c20, 0x3b8c3: 0x6ddd7e20, - 0x3b8c4: 0x6ddd8020, 0x3b8c5: 0x6ddd8220, 0x3b8c6: 0x6df50820, 0x3b8c7: 0x6df50a20, - 0x3b8c8: 0x6df50c20, 0x3b8c9: 0x6df50e20, 0x3b8ca: 0x6df51020, 0x3b8cb: 0x6df51220, - 0x3b8cc: 0x6df51420, 0x3b8cd: 0x6df51620, 0x3b8ce: 0x6df51820, 0x3b8cf: 0x6df51a20, - 0x3b8d0: 0x6e090420, 0x3b8d1: 0x6e090620, 0x3b8d2: 0x6e090820, 0x3b8d3: 0x6e090a20, - 0x3b8d4: 0x6e090c20, 0x3b8d5: 0x6e090e20, 0x3b8d6: 0x6e091020, 0x3b8d7: 0x6e091220, - 0x3b8d8: 0x6e091420, 0x3b8d9: 0x6e091620, 0x3b8da: 0x6e091820, 0x3b8db: 0x6e091a20, - 0x3b8dc: 0x6e190e20, 0x3b8dd: 0x6e191020, 0x3b8de: 0x6e191220, 0x3b8df: 0x6e191420, - 0x3b8e0: 0x6e191620, 0x3b8e1: 0x6e191820, 0x3b8e2: 0x6e191a20, 0x3b8e3: 0x6e191c20, - 0x3b8e4: 0x6e191e20, 0x3b8e5: 0x6e192020, 0x3b8e6: 0x6e192220, 0x3b8e7: 0x6e192420, - 0x3b8e8: 0x6e192620, 0x3b8e9: 0x6e192820, 0x3b8ea: 0x6e192a20, 0x3b8eb: 0x6e192c20, - 0x3b8ec: 0x6e192e20, 0x3b8ed: 0x6e193020, 0x3b8ee: 0x6e25c220, 0x3b8ef: 0x6e25c420, - 0x3b8f0: 0x6e25c620, 0x3b8f1: 0x6e2f3620, 0x3b8f2: 0x6e2f3820, 0x3b8f3: 0x6e2f3a20, - 0x3b8f4: 0x6e2f3c20, 0x3b8f5: 0x6e2f3e20, 0x3b8f6: 0x6e2f4020, 0x3b8f7: 0x6e2f4220, - 0x3b8f8: 0x6e2f4420, 0x3b8f9: 0x6e2f4620, 0x3b8fa: 0x6e369020, 0x3b8fb: 0x6e369220, - 0x3b8fc: 0x6e369420, 0x3b8fd: 0x6e369620, 0x3b8fe: 0x6e369820, 0x3b8ff: 0x6e3ba420, - // Block 0xee4, offset 0x3b900 - 0x3b900: 0x6e3f4a20, 0x3b901: 0x6e3f4c20, 0x3b902: 0x6e3f4e20, 0x3b903: 0x6e3f5020, - 0x3b904: 0x6e41d220, 0x3b905: 0x6e41d420, 0x3b906: 0x6e43a020, 0x3b907: 0x6e43a220, - 0x3b908: 0x6e44d020, 0x3b909: 0x6e45f820, 0x3b90a: 0x6e465820, 0x3b90b: 0x6cb74820, - 0x3b90c: 0x6d17ce20, 0x3b90d: 0x6d17d020, 0x3b90e: 0x6d17d220, 0x3b90f: 0x6d17d420, - 0x3b910: 0x6d17d620, 0x3b911: 0x6d17d820, 0x3b912: 0x6d17da20, 0x3b913: 0x6d17dc20, - 0x3b914: 0x6d469a20, 0x3b915: 0x6d469c20, 0x3b916: 0x6d469e20, 0x3b917: 0x6d46a020, - 0x3b918: 0x6d46a220, 0x3b919: 0x6d46a420, 0x3b91a: 0x6d46a620, 0x3b91b: 0x6d46a820, - 0x3b91c: 0x6d46aa20, 0x3b91d: 0x6d46ac20, 0x3b91e: 0x6d46ae20, 0x3b91f: 0x6d46b020, - 0x3b920: 0x6d73c420, 0x3b921: 0x6d73c620, 0x3b922: 0x6d73c820, 0x3b923: 0x6d73ca20, - 0x3b924: 0x6d73cc20, 0x3b925: 0x6d73ce20, 0x3b926: 0x6d73d020, 0x3b927: 0x6d73d220, - 0x3b928: 0x6d73d420, 0x3b929: 0x6d73d620, 0x3b92a: 0x6d73d820, 0x3b92b: 0x6d73da20, - 0x3b92c: 0x6d73dc20, 0x3b92d: 0x6d73de20, 0x3b92e: 0x6d73e020, 0x3b92f: 0x6d73e220, - 0x3b930: 0x6d73e420, 0x3b931: 0x6d73e620, 0x3b932: 0x6d73e820, 0x3b933: 0x6d73ea20, - 0x3b934: 0x6d73ec20, 0x3b935: 0x6d73ee20, 0x3b936: 0x6d73f020, 0x3b937: 0x6d73f220, - 0x3b938: 0x6d73f420, 0x3b939: 0x6d73f620, 0x3b93a: 0x6d73f820, 0x3b93b: 0x6d73fa20, - 0x3b93c: 0x6d73fc20, 0x3b93d: 0x6d73fe20, 0x3b93e: 0x6d740020, 0x3b93f: 0x6d740220, - // Block 0xee5, offset 0x3b940 - 0x3b940: 0x6d740420, 0x3b941: 0x6d9d6220, 0x3b942: 0x6d9d6420, 0x3b943: 0x6d9d6620, - 0x3b944: 0x6d9d6820, 0x3b945: 0x6d9d6a20, 0x3b946: 0x6d9d6c20, 0x3b947: 0x6d9d6e20, - 0x3b948: 0x6d9d7020, 0x3b949: 0x6d9d7220, 0x3b94a: 0x6d9d7420, 0x3b94b: 0x6d9d7620, - 0x3b94c: 0x6d9d7820, 0x3b94d: 0x6d9d7a20, 0x3b94e: 0x6d9d7c20, 0x3b94f: 0x6d9d7e20, - 0x3b950: 0x6d9d8020, 0x3b951: 0x6d9d8220, 0x3b952: 0x6d9d8420, 0x3b953: 0x6d9d8620, - 0x3b954: 0x6d9d8820, 0x3b955: 0x6d9d8a20, 0x3b956: 0x6d9d8c20, 0x3b957: 0x6d9d8e20, - 0x3b958: 0x6d9d9020, 0x3b959: 0x6d9d9220, 0x3b95a: 0x6d9d9420, 0x3b95b: 0x6d9d9620, - 0x3b95c: 0x6d9d9820, 0x3b95d: 0x6d9d9a20, 0x3b95e: 0x6d9d9c20, 0x3b95f: 0x6d9d9e20, - 0x3b960: 0x6d9da020, 0x3b961: 0x6dbfd420, 0x3b962: 0x6dbfd620, 0x3b963: 0x6dbfd820, - 0x3b964: 0x6dbfda20, 0x3b965: 0x6dbfdc20, 0x3b966: 0x6dbfde20, 0x3b967: 0x6dbfe020, - 0x3b968: 0x6dbfe220, 0x3b969: 0x6dbfe420, 0x3b96a: 0x6dbfe620, 0x3b96b: 0x6dbfe820, - 0x3b96c: 0x6dbfea20, 0x3b96d: 0x6dbfec20, 0x3b96e: 0x6dbfee20, 0x3b96f: 0x6dbff020, - 0x3b970: 0x6dbff220, 0x3b971: 0x6dbff420, 0x3b972: 0x6dbff620, 0x3b973: 0x6dbff820, - 0x3b974: 0x6dbffa20, 0x3b975: 0x6dbffc20, 0x3b976: 0x6dbffe20, 0x3b977: 0x6d46b220, - 0x3b978: 0x6dc00020, 0x3b979: 0x6dc00220, 0x3b97a: 0x6dc00420, 0x3b97b: 0x6dc00620, - 0x3b97c: 0x6dc00820, 0x3b97d: 0x6dc00a20, 0x3b97e: 0x6dc00c20, 0x3b97f: 0x6dc00e20, - // Block 0xee6, offset 0x3b980 - 0x3b980: 0x6dc01020, 0x3b981: 0x6dc01220, 0x3b982: 0x6dc01420, 0x3b983: 0x6dc01620, - 0x3b984: 0x6dc01820, 0x3b985: 0x6dc01a20, 0x3b986: 0x6dc01c20, 0x3b987: 0x6dc01e20, - 0x3b988: 0x6dc02020, 0x3b989: 0x6dc02220, 0x3b98a: 0x6dc02420, 0x3b98b: 0x6dc02620, - 0x3b98c: 0x6dc02820, 0x3b98d: 0x6dddd220, 0x3b98e: 0x6dddd420, 0x3b98f: 0x6dddd620, - 0x3b990: 0x6dddd820, 0x3b991: 0x6dddda20, 0x3b992: 0x6ddddc20, 0x3b993: 0x6dddde20, - 0x3b994: 0x6ddde020, 0x3b995: 0x6ddde220, 0x3b996: 0x6ddde420, 0x3b997: 0x6ddde620, - 0x3b998: 0x6ddde820, 0x3b999: 0x6dddea20, 0x3b99a: 0x6dddec20, 0x3b99b: 0x6dddee20, - 0x3b99c: 0x6dddf020, 0x3b99d: 0x6dddf220, 0x3b99e: 0x6dddf420, 0x3b99f: 0x6dddf620, - 0x3b9a0: 0x6dddf820, 0x3b9a1: 0x6dddfa20, 0x3b9a2: 0x6dddfc20, 0x3b9a3: 0x6dddfe20, - 0x3b9a4: 0x6dde0020, 0x3b9a5: 0x6dde0220, 0x3b9a6: 0x6dde0420, 0x3b9a7: 0x6dde0620, - 0x3b9a8: 0x6dde0820, 0x3b9a9: 0x6dde0a20, 0x3b9aa: 0x6dde0c20, 0x3b9ab: 0x6dde0e20, - 0x3b9ac: 0x6dde1020, 0x3b9ad: 0x6dde1220, 0x3b9ae: 0x6dde1420, 0x3b9af: 0x6dde1620, - 0x3b9b0: 0x6dde1820, 0x3b9b1: 0x6dde1a20, 0x3b9b2: 0x6dde1c20, 0x3b9b3: 0x6dde1e20, - 0x3b9b4: 0x6dde2020, 0x3b9b5: 0x6dde2220, 0x3b9b6: 0x6dde2420, 0x3b9b7: 0x6df58620, - 0x3b9b8: 0x6df58820, 0x3b9b9: 0x6df58a20, 0x3b9ba: 0x6df58c20, 0x3b9bb: 0x6df58e20, - 0x3b9bc: 0x6df59020, 0x3b9bd: 0x6df59220, 0x3b9be: 0x6df59420, 0x3b9bf: 0x6df59620, - // Block 0xee7, offset 0x3b9c0 - 0x3b9c0: 0x6df59820, 0x3b9c1: 0x6df59a20, 0x3b9c2: 0x6df59c20, 0x3b9c3: 0x6df59e20, - 0x3b9c4: 0x6df5a020, 0x3b9c5: 0x6df5a220, 0x3b9c6: 0x6df5a420, 0x3b9c7: 0x6df5a620, - 0x3b9c8: 0x6df5a820, 0x3b9c9: 0x6df5aa20, 0x3b9ca: 0x6df5ac20, 0x3b9cb: 0x6df5ae20, - 0x3b9cc: 0x6df5b020, 0x3b9cd: 0x6df5b220, 0x3b9ce: 0x6df5b420, 0x3b9cf: 0x6df5b620, - 0x3b9d0: 0x6df5b820, 0x3b9d1: 0x6df5ba20, 0x3b9d2: 0x6df5bc20, 0x3b9d3: 0x6df5be20, - 0x3b9d4: 0x6df5c020, 0x3b9d5: 0x6df5c220, 0x3b9d6: 0x6df5c420, 0x3b9d7: 0x6df5c620, - 0x3b9d8: 0x6df5c820, 0x3b9d9: 0x6df5ca20, 0x3b9da: 0x6df5cc20, 0x3b9db: 0x6df5ce20, - 0x3b9dc: 0x6df5d020, 0x3b9dd: 0x6df5d220, 0x3b9de: 0x6df5d420, 0x3b9df: 0x6df5d620, - 0x3b9e0: 0x6df5d820, 0x3b9e1: 0x6df5da20, 0x3b9e2: 0x6df5dc20, 0x3b9e3: 0x6df5de20, - 0x3b9e4: 0x6df5e020, 0x3b9e5: 0x6df5e220, 0x3b9e6: 0x6df5e420, 0x3b9e7: 0x6df5e620, - 0x3b9e8: 0x6df5e820, 0x3b9e9: 0x6df5ea20, 0x3b9ea: 0x6df5ec20, 0x3b9eb: 0x6df5ee20, - 0x3b9ec: 0x6df5f020, 0x3b9ed: 0x6df5f220, 0x3b9ee: 0x6df5f420, 0x3b9ef: 0x6df5f620, - 0x3b9f0: 0x6df5f820, 0x3b9f1: 0x6df5fa20, 0x3b9f2: 0x6df5fc20, 0x3b9f3: 0x6df5fe20, - 0x3b9f4: 0x6df60020, 0x3b9f5: 0x6df60220, 0x3b9f6: 0x6df60420, 0x3b9f7: 0x6df60620, - 0x3b9f8: 0x6df60820, 0x3b9f9: 0x6df60a20, 0x3b9fa: 0x6df60c20, 0x3b9fb: 0x6df60e20, - 0x3b9fc: 0x6df61020, 0x3b9fd: 0x6df61220, 0x3b9fe: 0x6e097a20, 0x3b9ff: 0x6e097c20, - // Block 0xee8, offset 0x3ba00 - 0x3ba00: 0x6e097e20, 0x3ba01: 0x6e098020, 0x3ba02: 0x6e098220, 0x3ba03: 0x6e098420, - 0x3ba04: 0x6e098620, 0x3ba05: 0x6e098820, 0x3ba06: 0x6e098a20, 0x3ba07: 0x6e098c20, - 0x3ba08: 0x6e098e20, 0x3ba09: 0x6e099020, 0x3ba0a: 0x6e099220, 0x3ba0b: 0x6e099420, - 0x3ba0c: 0x6e099620, 0x3ba0d: 0x6e099820, 0x3ba0e: 0x6e099a20, 0x3ba0f: 0x6e099c20, - 0x3ba10: 0x6e099e20, 0x3ba11: 0x6e09a020, 0x3ba12: 0x6e09a220, 0x3ba13: 0x6e09a420, - 0x3ba14: 0x6e09a620, 0x3ba15: 0x6e09a820, 0x3ba16: 0x6e09aa20, 0x3ba17: 0x6e09ac20, - 0x3ba18: 0x6e09ae20, 0x3ba19: 0x6e09b020, 0x3ba1a: 0x6e09b220, 0x3ba1b: 0x6e09b420, - 0x3ba1c: 0x6e09b620, 0x3ba1d: 0x6e09b820, 0x3ba1e: 0x6e09ba20, 0x3ba1f: 0x6e09bc20, - 0x3ba20: 0x6e09be20, 0x3ba21: 0x6e09c020, 0x3ba22: 0x6e09c220, 0x3ba23: 0x6e09c420, - 0x3ba24: 0x6e09c620, 0x3ba25: 0x6e09c820, 0x3ba26: 0x6e09ca20, 0x3ba27: 0x6e09cc20, - 0x3ba28: 0x6e09ce20, 0x3ba29: 0x6e09d020, 0x3ba2a: 0x6e09d220, 0x3ba2b: 0x6e09d420, - 0x3ba2c: 0x6e09d620, 0x3ba2d: 0x6e09d820, 0x3ba2e: 0x6e09da20, 0x3ba2f: 0x6e09dc20, - 0x3ba30: 0x6e09de20, 0x3ba31: 0x6e196e20, 0x3ba32: 0x6e197020, 0x3ba33: 0x6e197220, - 0x3ba34: 0x6e197420, 0x3ba35: 0x6e197620, 0x3ba36: 0x6e197820, 0x3ba37: 0x6e197a20, - 0x3ba38: 0x6e197c20, 0x3ba39: 0x6e197e20, 0x3ba3a: 0x6e198020, 0x3ba3b: 0x6e198220, - 0x3ba3c: 0x6e198420, 0x3ba3d: 0x6e198620, 0x3ba3e: 0x6e198820, 0x3ba3f: 0x6e198a20, - // Block 0xee9, offset 0x3ba40 - 0x3ba40: 0x6e198c20, 0x3ba41: 0x6e198e20, 0x3ba42: 0x6e199020, 0x3ba43: 0x6e199220, - 0x3ba44: 0x6e199420, 0x3ba45: 0x6e199620, 0x3ba46: 0x6e199820, 0x3ba47: 0x6e199a20, - 0x3ba48: 0x6e199c20, 0x3ba49: 0x6e199e20, 0x3ba4a: 0x6e19a020, 0x3ba4b: 0x6e19a220, - 0x3ba4c: 0x6e19a420, 0x3ba4d: 0x6e19a620, 0x3ba4e: 0x6e19a820, 0x3ba4f: 0x6e19aa20, - 0x3ba50: 0x6e19ac20, 0x3ba51: 0x6e19ae20, 0x3ba52: 0x6e19b020, 0x3ba53: 0x6e19b220, - 0x3ba54: 0x6e19b420, 0x3ba55: 0x6e19b620, 0x3ba56: 0x6e19b820, 0x3ba57: 0x6e19ba20, - 0x3ba58: 0x6e19bc20, 0x3ba59: 0x6e19be20, 0x3ba5a: 0x6e19c020, 0x3ba5b: 0x6e19c220, - 0x3ba5c: 0x6e19c420, 0x3ba5d: 0x6e19c620, 0x3ba5e: 0x6e19c820, 0x3ba5f: 0x6e19ca20, - 0x3ba60: 0x6e19cc20, 0x3ba61: 0x6e19ce20, 0x3ba62: 0x6e19d020, 0x3ba63: 0x6e19d220, - 0x3ba64: 0x6e19d420, 0x3ba65: 0x6e19d620, 0x3ba66: 0x6e19d820, 0x3ba67: 0x6e19da20, - 0x3ba68: 0x6e19dc20, 0x3ba69: 0x6e19de20, 0x3ba6a: 0x6e19e020, 0x3ba6b: 0x6e19e220, - 0x3ba6c: 0x6e19e420, 0x3ba6d: 0x6e260e20, 0x3ba6e: 0x6e261020, 0x3ba6f: 0x6e261220, - 0x3ba70: 0x6e261420, 0x3ba71: 0x6e261620, 0x3ba72: 0x6e261820, 0x3ba73: 0x6e261a20, - 0x3ba74: 0x6e261c20, 0x3ba75: 0x6e261e20, 0x3ba76: 0x6e262020, 0x3ba77: 0x6e262220, - 0x3ba78: 0x6e262420, 0x3ba79: 0x6e262620, 0x3ba7a: 0x6e262820, 0x3ba7b: 0x6e262a20, - 0x3ba7c: 0x6e262c20, 0x3ba7d: 0x6e262e20, 0x3ba7e: 0x6e263020, 0x3ba7f: 0x6e263220, - // Block 0xeea, offset 0x3ba80 - 0x3ba80: 0x6e263420, 0x3ba81: 0x6e263620, 0x3ba82: 0x6e263820, 0x3ba83: 0x6e263a20, - 0x3ba84: 0x6e263c20, 0x3ba85: 0x6e263e20, 0x3ba86: 0x6e264020, 0x3ba87: 0x6e264220, - 0x3ba88: 0x6e264420, 0x3ba89: 0x6e264620, 0x3ba8a: 0x6e264820, 0x3ba8b: 0x6e264a20, - 0x3ba8c: 0x6e264c20, 0x3ba8d: 0x6e264e20, 0x3ba8e: 0x6e265020, 0x3ba8f: 0x6e265220, - 0x3ba90: 0x6e265420, 0x3ba91: 0x6e265620, 0x3ba92: 0x6e265820, 0x3ba93: 0x6e265a20, - 0x3ba94: 0x6e265c20, 0x3ba95: 0x6e265e20, 0x3ba96: 0x6e266020, 0x3ba97: 0x6e266220, - 0x3ba98: 0x6e2f7a20, 0x3ba99: 0x6e2f7c20, 0x3ba9a: 0x6e2f7e20, 0x3ba9b: 0x6e2f8020, - 0x3ba9c: 0x6e2f8220, 0x3ba9d: 0x6e2f8420, 0x3ba9e: 0x6e2f8620, 0x3ba9f: 0x6e2f8820, - 0x3baa0: 0x6e2f8a20, 0x3baa1: 0x6e2f8c20, 0x3baa2: 0x6e2f8e20, 0x3baa3: 0x6e2f9020, - 0x3baa4: 0x6e2f9220, 0x3baa5: 0x6e2f9420, 0x3baa6: 0x6e2f9620, 0x3baa7: 0x6e2f9820, - 0x3baa8: 0x6e2f9a20, 0x3baa9: 0x6e2f9c20, 0x3baaa: 0x6e2f9e20, 0x3baab: 0x6e2fa020, - 0x3baac: 0x6e2fa220, 0x3baad: 0x6e2fa420, 0x3baae: 0x6e2fa620, 0x3baaf: 0x6e2fa820, - 0x3bab0: 0x6e2faa20, 0x3bab1: 0x6e2fac20, 0x3bab2: 0x6e2fae20, 0x3bab3: 0x6e2fb020, - 0x3bab4: 0x6e2fb220, 0x3bab5: 0x6e2fb420, 0x3bab6: 0x6e2fb620, 0x3bab7: 0x6e2fb820, - 0x3bab8: 0x6e2fba20, 0x3bab9: 0x6e2fbc20, 0x3baba: 0x6e2fbe20, 0x3babb: 0x6e2fc020, - 0x3babc: 0x6e2fc220, 0x3babd: 0x6e2fc420, 0x3babe: 0x6e2fc620, 0x3babf: 0x6e2fc820, - // Block 0xeeb, offset 0x3bac0 - 0x3bac0: 0x6e2fca20, 0x3bac1: 0x6e2fcc20, 0x3bac2: 0x6e36c220, 0x3bac3: 0x6e36c420, - 0x3bac4: 0x6e36c620, 0x3bac5: 0x6e36c820, 0x3bac6: 0x6e36ca20, 0x3bac7: 0x6e36cc20, - 0x3bac8: 0x6e36ce20, 0x3bac9: 0x6e36d020, 0x3baca: 0x6e36d220, 0x3bacb: 0x6e36d420, - 0x3bacc: 0x6e36d620, 0x3bacd: 0x6e36d820, 0x3bace: 0x6e36da20, 0x3bacf: 0x6e36dc20, - 0x3bad0: 0x6e36de20, 0x3bad1: 0x6e36e020, 0x3bad2: 0x6e36e220, 0x3bad3: 0x6e36e420, - 0x3bad4: 0x6e36e620, 0x3bad5: 0x6e36e820, 0x3bad6: 0x6e36ea20, 0x3bad7: 0x6e36ec20, - 0x3bad8: 0x6e36ee20, 0x3bad9: 0x6e36f020, 0x3bada: 0x6e36f220, 0x3badb: 0x6e36f420, - 0x3badc: 0x6e36f620, 0x3badd: 0x6e36f820, 0x3bade: 0x6e36fa20, 0x3badf: 0x6e36fc20, - 0x3bae0: 0x6e36fe20, 0x3bae1: 0x6e370020, 0x3bae2: 0x6e370220, 0x3bae3: 0x6e370420, - 0x3bae4: 0x6e370620, 0x3bae5: 0x6e3bb620, 0x3bae6: 0x6e3bb820, 0x3bae7: 0x6e3bba20, - 0x3bae8: 0x6e3bbc20, 0x3bae9: 0x6e3bbe20, 0x3baea: 0x6e3bc020, 0x3baeb: 0x6e3bc220, - 0x3baec: 0x6e3bc420, 0x3baed: 0x6e3bc620, 0x3baee: 0x6e3bc820, 0x3baef: 0x6e3bca20, - 0x3baf0: 0x6e3bcc20, 0x3baf1: 0x6e3bce20, 0x3baf2: 0x6e3bd020, 0x3baf3: 0x6e3bd220, - 0x3baf4: 0x6e3bd420, 0x3baf5: 0x6e3bd620, 0x3baf6: 0x6e3bd820, 0x3baf7: 0x6e3bda20, - 0x3baf8: 0x6e3bdc20, 0x3baf9: 0x6e3bde20, 0x3bafa: 0x6e3be020, 0x3bafb: 0x6e3f6020, - 0x3bafc: 0x6e3f6220, 0x3bafd: 0x6e3f6420, 0x3bafe: 0x6e3f6620, 0x3baff: 0x6e3f6820, - // Block 0xeec, offset 0x3bb00 - 0x3bb00: 0x6e3f6a20, 0x3bb01: 0x6e3f6c20, 0x3bb02: 0x6e3f6e20, 0x3bb03: 0x6e3f7020, - 0x3bb04: 0x6e3f7220, 0x3bb05: 0x6e3f7420, 0x3bb06: 0x6e3f7620, 0x3bb07: 0x6e3f7820, - 0x3bb08: 0x6e3f7a20, 0x3bb09: 0x6e3f7c20, 0x3bb0a: 0x6e3f7e20, 0x3bb0b: 0x6e3f8020, - 0x3bb0c: 0x6e3f8220, 0x3bb0d: 0x6e41de20, 0x3bb0e: 0x6e41e020, 0x3bb0f: 0x6e41e220, - 0x3bb10: 0x6e41e420, 0x3bb11: 0x6e41e620, 0x3bb12: 0x6e41e820, 0x3bb13: 0x6e41ea20, - 0x3bb14: 0x6e41ec20, 0x3bb15: 0x6e41ee20, 0x3bb16: 0x6e41f020, 0x3bb17: 0x6e41f220, - 0x3bb18: 0x6e41f420, 0x3bb19: 0x6e41f620, 0x3bb1a: 0x6e43a420, 0x3bb1b: 0x6e43a620, - 0x3bb1c: 0x6e43a820, 0x3bb1d: 0x6e43aa20, 0x3bb1e: 0x6e43ac20, 0x3bb1f: 0x6e43ae20, - 0x3bb20: 0x6e43b020, 0x3bb21: 0x6e43b220, 0x3bb22: 0x6e43b420, 0x3bb23: 0x6e43b620, - 0x3bb24: 0x6e43b820, 0x3bb25: 0x6e43ba20, 0x3bb26: 0x6e43bc20, 0x3bb27: 0x6e44d420, - 0x3bb28: 0x6e44d620, 0x3bb29: 0x6e44d820, 0x3bb2a: 0x6e44da20, 0x3bb2b: 0x6e44dc20, - 0x3bb2c: 0x6e44de20, 0x3bb2d: 0x6e44e020, 0x3bb2e: 0x6e44e220, 0x3bb2f: 0x6e44e420, - 0x3bb30: 0x6e458420, 0x3bb31: 0x6e458620, 0x3bb32: 0x6e458820, 0x3bb33: 0x6e45fa20, - 0x3bb34: 0x6e45fc20, 0x3bb35: 0x6e465a20, 0x3bb36: 0x6e465c20, 0x3bb37: 0x6e465e20, - 0x3bb38: 0x6e466020, 0x3bb39: 0x6ce87820, 0x3bb3a: 0x6ce87a20, 0x3bb3b: 0x6ce87c20, - 0x3bb3c: 0x6d46d420, 0x3bb3d: 0x6d46d620, 0x3bb3e: 0x6d46d820, 0x3bb3f: 0x6d46da20, - // Block 0xeed, offset 0x3bb40 - 0x3bb40: 0x6d17fa20, 0x3bb41: 0x6d742620, 0x3bb42: 0x6d742820, 0x3bb43: 0x6d742a20, - 0x3bb44: 0x6d742c20, 0x3bb45: 0x6d9dce20, 0x3bb46: 0x6d9dd020, 0x3bb47: 0x6d9dd220, - 0x3bb48: 0x6d9dd420, 0x3bb49: 0x6d742e20, 0x3bb4a: 0x6dc05a20, 0x3bb4b: 0x6dc05c20, - 0x3bb4c: 0x6df63020, 0x3bb4d: 0x6e1a0020, 0x3bb4e: 0x6e2fdc20, 0x3bb4f: 0x6ce88820, - 0x3bb50: 0x6ce88a20, 0x3bb51: 0x6ce88c20, 0x3bb52: 0x6d181a20, 0x3bb53: 0x6d181c20, - 0x3bb54: 0x6d181e20, 0x3bb55: 0x6d182020, 0x3bb56: 0x6d182220, 0x3bb57: 0x6d182420, - 0x3bb58: 0x6d182620, 0x3bb59: 0x6d182820, 0x3bb5a: 0x6d182a20, 0x3bb5b: 0x6d182c20, - 0x3bb5c: 0x6d182e20, 0x3bb5d: 0x6d470020, 0x3bb5e: 0x6d470220, 0x3bb5f: 0x6d470420, - 0x3bb60: 0x6d470620, 0x3bb61: 0x6d470820, 0x3bb62: 0x6d470a20, 0x3bb63: 0x6d470c20, - 0x3bb64: 0x6d470e20, 0x3bb65: 0x6d471020, 0x3bb66: 0x6d471220, 0x3bb67: 0x6d471420, - 0x3bb68: 0x6d471620, 0x3bb69: 0x6d471820, 0x3bb6a: 0x6d471a20, 0x3bb6b: 0x6d471c20, - 0x3bb6c: 0x6d471e20, 0x3bb6d: 0x6d472020, 0x3bb6e: 0x6d472220, 0x3bb6f: 0x6d472420, - 0x3bb70: 0x6d747e20, 0x3bb71: 0x6d748020, 0x3bb72: 0x6d748220, 0x3bb73: 0x6d748420, - 0x3bb74: 0x6d748620, 0x3bb75: 0x6d748820, 0x3bb76: 0x6d748a20, 0x3bb77: 0x6d748c20, - 0x3bb78: 0x6d748e20, 0x3bb79: 0x6d749020, 0x3bb7a: 0x6d749220, 0x3bb7b: 0x6d749420, - 0x3bb7c: 0x6d749620, 0x3bb7d: 0x6d749820, 0x3bb7e: 0x6d749a20, 0x3bb7f: 0x6d749c20, - // Block 0xeee, offset 0x3bb80 - 0x3bb80: 0x6d749e20, 0x3bb81: 0x6d74a020, 0x3bb82: 0x6d74a220, 0x3bb83: 0x6d74a420, - 0x3bb84: 0x6d74a620, 0x3bb85: 0x6d74a820, 0x3bb86: 0x6d74aa20, 0x3bb87: 0x6d74ac20, - 0x3bb88: 0x6d74ae20, 0x3bb89: 0x6d74b020, 0x3bb8a: 0x6d74b220, 0x3bb8b: 0x6d74b420, - 0x3bb8c: 0x6d74b620, 0x3bb8d: 0x6d74b820, 0x3bb8e: 0x6d74ba20, 0x3bb8f: 0x6d74bc20, - 0x3bb90: 0x6d74be20, 0x3bb91: 0x6d74c020, 0x3bb92: 0x6d74c220, 0x3bb93: 0x6d74c420, - 0x3bb94: 0x6d74c620, 0x3bb95: 0x6d74c820, 0x3bb96: 0x6d74ca20, 0x3bb97: 0x6d74cc20, - 0x3bb98: 0x6d74ce20, 0x3bb99: 0x6d74d020, 0x3bb9a: 0x6d74d220, 0x3bb9b: 0x6d74d420, - 0x3bb9c: 0x6d9e4220, 0x3bb9d: 0x6d9e4420, 0x3bb9e: 0x6d9e4620, 0x3bb9f: 0x6d9e4820, - 0x3bba0: 0x6d9e4a20, 0x3bba1: 0x6d9e4c20, 0x3bba2: 0x6d9e4e20, 0x3bba3: 0x6d9e5020, - 0x3bba4: 0x6d9e5220, 0x3bba5: 0x6d9e5420, 0x3bba6: 0x6d9e5620, 0x3bba7: 0x6d9e5820, - 0x3bba8: 0x6d9e5a20, 0x3bba9: 0x6d9e5c20, 0x3bbaa: 0x6d9e5e20, 0x3bbab: 0x6d9e6020, - 0x3bbac: 0x6d9e6220, 0x3bbad: 0x6d9e6420, 0x3bbae: 0x6d9e6620, 0x3bbaf: 0x6d9e6820, - 0x3bbb0: 0x6d9e6a20, 0x3bbb1: 0x6d9e6c20, 0x3bbb2: 0x6d9e6e20, 0x3bbb3: 0x6d9e7020, - 0x3bbb4: 0x6d9e7220, 0x3bbb5: 0x6d9e7420, 0x3bbb6: 0x6d9e7620, 0x3bbb7: 0x6d9e7820, - 0x3bbb8: 0x6d9e7a20, 0x3bbb9: 0x6d9e7c20, 0x3bbba: 0x6d9e7e20, 0x3bbbb: 0x6d9e8020, - 0x3bbbc: 0x6d9e8220, 0x3bbbd: 0x6d9e8420, 0x3bbbe: 0x6d9e8620, 0x3bbbf: 0x6d9e8820, - // Block 0xeef, offset 0x3bbc0 - 0x3bbc0: 0x6d9e8a20, 0x3bbc1: 0x6d9e8c20, 0x3bbc2: 0x6d9e8e20, 0x3bbc3: 0x6d9e9020, - 0x3bbc4: 0x6d9e9220, 0x3bbc5: 0x6d9e9420, 0x3bbc6: 0x6d9e9620, 0x3bbc7: 0x6d9e9820, - 0x3bbc8: 0x6d9e9a20, 0x3bbc9: 0x6d9e9c20, 0x3bbca: 0x6d9e9e20, 0x3bbcb: 0x6d9ea020, - 0x3bbcc: 0x6d9ea220, 0x3bbcd: 0x6d9ea420, 0x3bbce: 0x6d9ea620, 0x3bbcf: 0x6d9ea820, - 0x3bbd0: 0x6d9eaa20, 0x3bbd1: 0x6d9eac20, 0x3bbd2: 0x6dc0ba20, 0x3bbd3: 0x6dc0bc20, - 0x3bbd4: 0x6dc0be20, 0x3bbd5: 0x6dc0c020, 0x3bbd6: 0x6dc0c220, 0x3bbd7: 0x6dc0c420, - 0x3bbd8: 0x6dc0c620, 0x3bbd9: 0x6dc0c820, 0x3bbda: 0x6dc0ca20, 0x3bbdb: 0x6dc0cc20, - 0x3bbdc: 0x6dc0ce20, 0x3bbdd: 0x6dc0d020, 0x3bbde: 0x6dc0d220, 0x3bbdf: 0x6dc0d420, - 0x3bbe0: 0x6dc0d620, 0x3bbe1: 0x6dc0d820, 0x3bbe2: 0x6dc0da20, 0x3bbe3: 0x6dc0dc20, - 0x3bbe4: 0x6dc0de20, 0x3bbe5: 0x6dc0e020, 0x3bbe6: 0x6dc0e220, 0x3bbe7: 0x6dc0e420, - 0x3bbe8: 0x6dc0e620, 0x3bbe9: 0x6dc0e820, 0x3bbea: 0x6dc0ea20, 0x3bbeb: 0x6dc0ec20, - 0x3bbec: 0x6dc0ee20, 0x3bbed: 0x6dc0f020, 0x3bbee: 0x6dc0f220, 0x3bbef: 0x6dc0f420, - 0x3bbf0: 0x6dc0f620, 0x3bbf1: 0x6dc0f820, 0x3bbf2: 0x6dc0fa20, 0x3bbf3: 0x6dc0fc20, - 0x3bbf4: 0x6dc0fe20, 0x3bbf5: 0x6dc10020, 0x3bbf6: 0x6dc10220, 0x3bbf7: 0x6dc10420, - 0x3bbf8: 0x6dc10620, 0x3bbf9: 0x6dc10820, 0x3bbfa: 0x6dc10a20, 0x3bbfb: 0x6dc10c20, - 0x3bbfc: 0x6dc10e20, 0x3bbfd: 0x6dc11020, 0x3bbfe: 0x6dc11220, 0x3bbff: 0x6dc11420, - // Block 0xef0, offset 0x3bc00 - 0x3bc00: 0x6dc11620, 0x3bc01: 0x6dc11820, 0x3bc02: 0x6dc11a20, 0x3bc03: 0x6dc11c20, - 0x3bc04: 0x6dc11e20, 0x3bc05: 0x6dc12020, 0x3bc06: 0x6dc12220, 0x3bc07: 0x6dc12420, - 0x3bc08: 0x6dc12620, 0x3bc09: 0x6dc12820, 0x3bc0a: 0x6dde8220, 0x3bc0b: 0x6dde8420, - 0x3bc0c: 0x6dde8620, 0x3bc0d: 0x6dde8820, 0x3bc0e: 0x6dde8a20, 0x3bc0f: 0x6dde8c20, - 0x3bc10: 0x6dde8e20, 0x3bc11: 0x6dde9020, 0x3bc12: 0x6dde9220, 0x3bc13: 0x6dde9420, - 0x3bc14: 0x6dde9620, 0x3bc15: 0x6dde9820, 0x3bc16: 0x6dde9a20, 0x3bc17: 0x6dde9c20, - 0x3bc18: 0x6dde9e20, 0x3bc19: 0x6ddea020, 0x3bc1a: 0x6ddea220, 0x3bc1b: 0x6ddea420, - 0x3bc1c: 0x6ddea620, 0x3bc1d: 0x6ddea820, 0x3bc1e: 0x6ddeaa20, 0x3bc1f: 0x6ddeac20, - 0x3bc20: 0x6ddeae20, 0x3bc21: 0x6ddeb020, 0x3bc22: 0x6ddeb220, 0x3bc23: 0x6ddeb420, - 0x3bc24: 0x6ddeb620, 0x3bc25: 0x6ddeb820, 0x3bc26: 0x6ddeba20, 0x3bc27: 0x6ddebc20, - 0x3bc28: 0x6ddebe20, 0x3bc29: 0x6ddec020, 0x3bc2a: 0x6ddec220, 0x3bc2b: 0x6ddec420, - 0x3bc2c: 0x6ddec620, 0x3bc2d: 0x6ddec820, 0x3bc2e: 0x6ddeca20, 0x3bc2f: 0x6ddecc20, - 0x3bc30: 0x6ddece20, 0x3bc31: 0x6dded020, 0x3bc32: 0x6dded220, 0x3bc33: 0x6dded420, - 0x3bc34: 0x6dded620, 0x3bc35: 0x6dded820, 0x3bc36: 0x6ddeda20, 0x3bc37: 0x6df6a020, - 0x3bc38: 0x6df6a220, 0x3bc39: 0x6df6a420, 0x3bc3a: 0x6df6a620, 0x3bc3b: 0x6df6a820, - 0x3bc3c: 0x6df6aa20, 0x3bc3d: 0x6df6ac20, 0x3bc3e: 0x6df6ae20, 0x3bc3f: 0x6df6b020, - // Block 0xef1, offset 0x3bc40 - 0x3bc40: 0x6df6b220, 0x3bc41: 0x6df6b420, 0x3bc42: 0x6df6b620, 0x3bc43: 0x6df6b820, - 0x3bc44: 0x6df6ba20, 0x3bc45: 0x6df6bc20, 0x3bc46: 0x6df6be20, 0x3bc47: 0x6df6c020, - 0x3bc48: 0x6df6c220, 0x3bc49: 0x6df6c420, 0x3bc4a: 0x6df6c620, 0x3bc4b: 0x6df6c820, - 0x3bc4c: 0x6df6ca20, 0x3bc4d: 0x6df6cc20, 0x3bc4e: 0x6df6ce20, 0x3bc4f: 0x6df6d020, - 0x3bc50: 0x6df6d220, 0x3bc51: 0x6df6d420, 0x3bc52: 0x6df6d620, 0x3bc53: 0x6df6d820, - 0x3bc54: 0x6df6da20, 0x3bc55: 0x6df6dc20, 0x3bc56: 0x6df6de20, 0x3bc57: 0x6df6e020, - 0x3bc58: 0x6df6e220, 0x3bc59: 0x6df6e420, 0x3bc5a: 0x6df6e620, 0x3bc5b: 0x6df6e820, - 0x3bc5c: 0x6df6ea20, 0x3bc5d: 0x6df6ec20, 0x3bc5e: 0x6df6ee20, 0x3bc5f: 0x6df6f020, - 0x3bc60: 0x6df6f220, 0x3bc61: 0x6df6f420, 0x3bc62: 0x6df6f620, 0x3bc63: 0x6df6f820, - 0x3bc64: 0x6df6fa20, 0x3bc65: 0x6df6fc20, 0x3bc66: 0x6df6fe20, 0x3bc67: 0x6df70020, - 0x3bc68: 0x6df70220, 0x3bc69: 0x6df70420, 0x3bc6a: 0x6df70620, 0x3bc6b: 0x6df70820, - 0x3bc6c: 0x6df70a20, 0x3bc6d: 0x6df70c20, 0x3bc6e: 0x6df70e20, 0x3bc6f: 0x6df71020, - 0x3bc70: 0x6df71220, 0x3bc71: 0x6df71420, 0x3bc72: 0x6df71620, 0x3bc73: 0x6df71820, - 0x3bc74: 0x6df71a20, 0x3bc75: 0x6df71c20, 0x3bc76: 0x6e0a4420, 0x3bc77: 0x6e0a4620, - 0x3bc78: 0x6e0a4820, 0x3bc79: 0x6e0a4a20, 0x3bc7a: 0x6e0a4c20, 0x3bc7b: 0x6e0a4e20, - 0x3bc7c: 0x6e0a5020, 0x3bc7d: 0x6e0a5220, 0x3bc7e: 0x6e0a5420, 0x3bc7f: 0x6e0a5620, - // Block 0xef2, offset 0x3bc80 - 0x3bc80: 0x6e0a5820, 0x3bc81: 0x6e0a5a20, 0x3bc82: 0x6e0a5c20, 0x3bc83: 0x6e0a5e20, - 0x3bc84: 0x6e0a6020, 0x3bc85: 0x6e0a6220, 0x3bc86: 0x6e0a6420, 0x3bc87: 0x6e0a6620, - 0x3bc88: 0x6e0a6820, 0x3bc89: 0x6e0a6a20, 0x3bc8a: 0x6e0a6c20, 0x3bc8b: 0x6e0a6e20, - 0x3bc8c: 0x6e0a7020, 0x3bc8d: 0x6e0a7220, 0x3bc8e: 0x6e0a7420, 0x3bc8f: 0x6e0a7620, - 0x3bc90: 0x6e0a7820, 0x3bc91: 0x6e0a7a20, 0x3bc92: 0x6e0a7c20, 0x3bc93: 0x6e0a7e20, - 0x3bc94: 0x6e0a8020, 0x3bc95: 0x6e0a8220, 0x3bc96: 0x6e0a8420, 0x3bc97: 0x6e0a8620, - 0x3bc98: 0x6e0a8820, 0x3bc99: 0x6e0a8a20, 0x3bc9a: 0x6e0a8c20, 0x3bc9b: 0x6e0a8e20, - 0x3bc9c: 0x6e0a9020, 0x3bc9d: 0x6e0a9220, 0x3bc9e: 0x6e0a9420, 0x3bc9f: 0x6e0a9620, - 0x3bca0: 0x6e0a9820, 0x3bca1: 0x6e0a9a20, 0x3bca2: 0x6e0a9c20, 0x3bca3: 0x6e0a9e20, - 0x3bca4: 0x6e0aa020, 0x3bca5: 0x6e0aa220, 0x3bca6: 0x6e0aa420, 0x3bca7: 0x6e0aa620, - 0x3bca8: 0x6e0aa820, 0x3bca9: 0x6e0aaa20, 0x3bcaa: 0x6e0aac20, 0x3bcab: 0x6e0aae20, - 0x3bcac: 0x6e0ab020, 0x3bcad: 0x6e0ab220, 0x3bcae: 0x6e0ab420, 0x3bcaf: 0x6e0ab620, - 0x3bcb0: 0x6e0ab820, 0x3bcb1: 0x6e0aba20, 0x3bcb2: 0x6e0abc20, 0x3bcb3: 0x6e0abe20, - 0x3bcb4: 0x6e0ac020, 0x3bcb5: 0x6e0ac220, 0x3bcb6: 0x6e0ac420, 0x3bcb7: 0x6e0ac620, - 0x3bcb8: 0x6e0ac820, 0x3bcb9: 0x6e0aca20, 0x3bcba: 0x6e1a5420, 0x3bcbb: 0x6e1a5620, - 0x3bcbc: 0x6e1a5820, 0x3bcbd: 0x6e1a5a20, 0x3bcbe: 0x6e1a5c20, 0x3bcbf: 0x6e1a5e20, - // Block 0xef3, offset 0x3bcc0 - 0x3bcc0: 0x6e1a6020, 0x3bcc1: 0x6e1a6220, 0x3bcc2: 0x6e1a6420, 0x3bcc3: 0x6e1a6620, - 0x3bcc4: 0x6e1a6820, 0x3bcc5: 0x6e1a6a20, 0x3bcc6: 0x6e1a6c20, 0x3bcc7: 0x6e1a6e20, - 0x3bcc8: 0x6e1a7020, 0x3bcc9: 0x6e1a7220, 0x3bcca: 0x6e1a7420, 0x3bccb: 0x6e1a7620, - 0x3bccc: 0x6e1a7820, 0x3bccd: 0x6e1a7a20, 0x3bcce: 0x6e1a7c20, 0x3bccf: 0x6e1a7e20, - 0x3bcd0: 0x6e1a8020, 0x3bcd1: 0x6e1a8220, 0x3bcd2: 0x6e1a8420, 0x3bcd3: 0x6e1a8620, - 0x3bcd4: 0x6e1a8820, 0x3bcd5: 0x6e1a8a20, 0x3bcd6: 0x6e1a8c20, 0x3bcd7: 0x6e1a8e20, - 0x3bcd8: 0x6e1a9020, 0x3bcd9: 0x6e1a9220, 0x3bcda: 0x6e1a9420, 0x3bcdb: 0x6e1a9620, - 0x3bcdc: 0x6e1a9820, 0x3bcdd: 0x6e1a9a20, 0x3bcde: 0x6e1a9c20, 0x3bcdf: 0x6e1a9e20, - 0x3bce0: 0x6e1aa020, 0x3bce1: 0x6e1aa220, 0x3bce2: 0x6e1aa420, 0x3bce3: 0x6e1aa620, - 0x3bce4: 0x6e1aa820, 0x3bce5: 0x6e1aaa20, 0x3bce6: 0x6e1aac20, 0x3bce7: 0x6e1aae20, - 0x3bce8: 0x6e1ab020, 0x3bce9: 0x6e1ab220, 0x3bcea: 0x6e1ab420, 0x3bceb: 0x6e1ab620, - 0x3bcec: 0x6e1ab820, 0x3bced: 0x6e26a820, 0x3bcee: 0x6e26aa20, 0x3bcef: 0x6e26ac20, - 0x3bcf0: 0x6e26ae20, 0x3bcf1: 0x6e26b020, 0x3bcf2: 0x6e26b220, 0x3bcf3: 0x6e26b420, - 0x3bcf4: 0x6e26b620, 0x3bcf5: 0x6e26b820, 0x3bcf6: 0x6e26ba20, 0x3bcf7: 0x6e26bc20, - 0x3bcf8: 0x6e26be20, 0x3bcf9: 0x6e26c020, 0x3bcfa: 0x6e26c220, 0x3bcfb: 0x6e26c420, - 0x3bcfc: 0x6e26c620, 0x3bcfd: 0x6e26c820, 0x3bcfe: 0x6e26ca20, 0x3bcff: 0x6e26cc20, - // Block 0xef4, offset 0x3bd00 - 0x3bd00: 0x6e26ce20, 0x3bd01: 0x6e26d020, 0x3bd02: 0x6e26d220, 0x3bd03: 0x6e26d420, - 0x3bd04: 0x6e26d620, 0x3bd05: 0x6e26d820, 0x3bd06: 0x6e26da20, 0x3bd07: 0x6e26dc20, - 0x3bd08: 0x6e26de20, 0x3bd09: 0x6e26e020, 0x3bd0a: 0x6e26e220, 0x3bd0b: 0x6e26e420, - 0x3bd0c: 0x6e26e620, 0x3bd0d: 0x6e26e820, 0x3bd0e: 0x6e26ea20, 0x3bd0f: 0x6e26ec20, - 0x3bd10: 0x6e26ee20, 0x3bd11: 0x6e26f020, 0x3bd12: 0x6e26f220, 0x3bd13: 0x6e26f420, - 0x3bd14: 0x6e26f620, 0x3bd15: 0x6e26f820, 0x3bd16: 0x6e26fa20, 0x3bd17: 0x6e26fc20, - 0x3bd18: 0x6e26fe20, 0x3bd19: 0x6e270020, 0x3bd1a: 0x6e270220, 0x3bd1b: 0x6e270420, - 0x3bd1c: 0x6e270620, 0x3bd1d: 0x6e270820, 0x3bd1e: 0x6e270a20, 0x3bd1f: 0x6e270c20, - 0x3bd20: 0x6e270e20, 0x3bd21: 0x6e271020, 0x3bd22: 0x6e271220, 0x3bd23: 0x6e271420, - 0x3bd24: 0x6e271620, 0x3bd25: 0x6e271820, 0x3bd26: 0x6e271a20, 0x3bd27: 0x6e271c20, - 0x3bd28: 0x6e271e20, 0x3bd29: 0x6e272020, 0x3bd2a: 0x6e272220, 0x3bd2b: 0x6e272420, - 0x3bd2c: 0x6e272620, 0x3bd2d: 0x6e272820, 0x3bd2e: 0x6e272a20, 0x3bd2f: 0x6e302220, - 0x3bd30: 0x6e302420, 0x3bd31: 0x6e302620, 0x3bd32: 0x6e302820, 0x3bd33: 0x6e302a20, - 0x3bd34: 0x6e302c20, 0x3bd35: 0x6e302e20, 0x3bd36: 0x6e303020, 0x3bd37: 0x6e303220, - 0x3bd38: 0x6e303420, 0x3bd39: 0x6e303620, 0x3bd3a: 0x6e303820, 0x3bd3b: 0x6e303a20, - 0x3bd3c: 0x6e303c20, 0x3bd3d: 0x6e303e20, 0x3bd3e: 0x6e304020, 0x3bd3f: 0x6e304220, - // Block 0xef5, offset 0x3bd40 - 0x3bd40: 0x6e304420, 0x3bd41: 0x6e304620, 0x3bd42: 0x6e304820, 0x3bd43: 0x6e304a20, - 0x3bd44: 0x6e304c20, 0x3bd45: 0x6e304e20, 0x3bd46: 0x6e305020, 0x3bd47: 0x6e305220, - 0x3bd48: 0x6e305420, 0x3bd49: 0x6e305620, 0x3bd4a: 0x6e305820, 0x3bd4b: 0x6e305a20, - 0x3bd4c: 0x6e305c20, 0x3bd4d: 0x6e305e20, 0x3bd4e: 0x6e306020, 0x3bd4f: 0x6e306220, - 0x3bd50: 0x6e306420, 0x3bd51: 0x6e306620, 0x3bd52: 0x6e306820, 0x3bd53: 0x6e306a20, - 0x3bd54: 0x6e306c20, 0x3bd55: 0x6e306e20, 0x3bd56: 0x6e307020, 0x3bd57: 0x6e307220, - 0x3bd58: 0x6e307420, 0x3bd59: 0x6e307620, 0x3bd5a: 0x6e307820, 0x3bd5b: 0x6e307a20, - 0x3bd5c: 0x6e307c20, 0x3bd5d: 0x6e307e20, 0x3bd5e: 0x6e308020, 0x3bd5f: 0x6e308220, - 0x3bd60: 0x6e308420, 0x3bd61: 0x6e308620, 0x3bd62: 0x6e308820, 0x3bd63: 0x6e308a20, - 0x3bd64: 0x6e308c20, 0x3bd65: 0x6e308e20, 0x3bd66: 0x6e309020, 0x3bd67: 0x6e309220, - 0x3bd68: 0x6e309420, 0x3bd69: 0x6e309620, 0x3bd6a: 0x6e309820, 0x3bd6b: 0x6e309a20, - 0x3bd6c: 0x6e374020, 0x3bd6d: 0x6e309c20, 0x3bd6e: 0x6e374220, 0x3bd6f: 0x6e374420, - 0x3bd70: 0x6e374620, 0x3bd71: 0x6e374820, 0x3bd72: 0x6e374a20, 0x3bd73: 0x6e374c20, - 0x3bd74: 0x6e374e20, 0x3bd75: 0x6e375020, 0x3bd76: 0x6e375220, 0x3bd77: 0x6e375420, - 0x3bd78: 0x6e375620, 0x3bd79: 0x6e375820, 0x3bd7a: 0x6e375a20, 0x3bd7b: 0x6e375c20, - 0x3bd7c: 0x6e375e20, 0x3bd7d: 0x6e376020, 0x3bd7e: 0x6e376220, 0x3bd7f: 0x6e376420, - // Block 0xef6, offset 0x3bd80 - 0x3bd80: 0x6e376620, 0x3bd81: 0x6e376820, 0x3bd82: 0x6e376a20, 0x3bd83: 0x6e376c20, - 0x3bd84: 0x6e376e20, 0x3bd85: 0x6e377020, 0x3bd86: 0x6e377220, 0x3bd87: 0x6e377420, - 0x3bd88: 0x6e377620, 0x3bd89: 0x6e377820, 0x3bd8a: 0x6e377a20, 0x3bd8b: 0x6e377c20, - 0x3bd8c: 0x6e377e20, 0x3bd8d: 0x6e378020, 0x3bd8e: 0x6e378220, 0x3bd8f: 0x6e378420, - 0x3bd90: 0x6e378620, 0x3bd91: 0x6e3bfa20, 0x3bd92: 0x6e3bfc20, 0x3bd93: 0x6e3bfe20, - 0x3bd94: 0x6e3c0020, 0x3bd95: 0x6e3c0220, 0x3bd96: 0x6e3c0420, 0x3bd97: 0x6e3c0620, - 0x3bd98: 0x6e3c0820, 0x3bd99: 0x6e3c0a20, 0x3bd9a: 0x6e3c0c20, 0x3bd9b: 0x6e3c0e20, - 0x3bd9c: 0x6e3c1020, 0x3bd9d: 0x6e3c1220, 0x3bd9e: 0x6e3c8020, 0x3bd9f: 0x6e3c1420, - 0x3bda0: 0x6e3c1620, 0x3bda1: 0x6e3c1820, 0x3bda2: 0x6e3c1a20, 0x3bda3: 0x6e3c1c20, - 0x3bda4: 0x6e3c1e20, 0x3bda5: 0x6e3c2020, 0x3bda6: 0x6e3c2220, 0x3bda7: 0x6e3c2420, - 0x3bda8: 0x6e3c2620, 0x3bda9: 0x6e3c2820, 0x3bdaa: 0x6e3c2a20, 0x3bdab: 0x6e3c2c20, - 0x3bdac: 0x6e3c2e20, 0x3bdad: 0x6e3f8c20, 0x3bdae: 0x6e3f8e20, 0x3bdaf: 0x6e3f9020, - 0x3bdb0: 0x6e3f9220, 0x3bdb1: 0x6e3f9420, 0x3bdb2: 0x6e3f9620, 0x3bdb3: 0x6e3f9820, - 0x3bdb4: 0x6e3f9a20, 0x3bdb5: 0x6e3f9c20, 0x3bdb6: 0x6e3f9e20, 0x3bdb7: 0x6e3fa020, - 0x3bdb8: 0x6e3fa220, 0x3bdb9: 0x6e3fa420, 0x3bdba: 0x6e3fa620, 0x3bdbb: 0x6e3fa820, - 0x3bdbc: 0x6e3faa20, 0x3bdbd: 0x6e3fac20, 0x3bdbe: 0x6e3fae20, 0x3bdbf: 0x6e3fb020, - // Block 0xef7, offset 0x3bdc0 - 0x3bdc0: 0x6e3fb220, 0x3bdc1: 0x6e3fb420, 0x3bdc2: 0x6e3fb620, 0x3bdc3: 0x6e420020, - 0x3bdc4: 0x6e420220, 0x3bdc5: 0x6e420420, 0x3bdc6: 0x6e420620, 0x3bdc7: 0x6e420820, - 0x3bdc8: 0x6e420a20, 0x3bdc9: 0x6e420c20, 0x3bdca: 0x6e420e20, 0x3bdcb: 0x6e421020, - 0x3bdcc: 0x6e421220, 0x3bdcd: 0x6e421420, 0x3bdce: 0x6e421620, 0x3bdcf: 0x6e421820, - 0x3bdd0: 0x6e421a20, 0x3bdd1: 0x6e421c20, 0x3bdd2: 0x6e421e20, 0x3bdd3: 0x6e422020, - 0x3bdd4: 0x6e422220, 0x3bdd5: 0x6e422420, 0x3bdd6: 0x6e422620, 0x3bdd7: 0x6e422820, - 0x3bdd8: 0x6e43c620, 0x3bdd9: 0x6e43c820, 0x3bdda: 0x6e43ca20, 0x3bddb: 0x6e43cc20, - 0x3bddc: 0x6e43ce20, 0x3bddd: 0x6e43d020, 0x3bdde: 0x6e43d220, 0x3bddf: 0x6e43d420, - 0x3bde0: 0x6e43d620, 0x3bde1: 0x6e43d820, 0x3bde2: 0x6e43da20, 0x3bde3: 0x6e43dc20, - 0x3bde4: 0x6e43de20, 0x3bde5: 0x6e44ea20, 0x3bde6: 0x6e44ec20, 0x3bde7: 0x6e44ee20, - 0x3bde8: 0x6e44f020, 0x3bde9: 0x6e44f220, 0x3bdea: 0x6e44f420, 0x3bdeb: 0x6e44f620, - 0x3bdec: 0x6e44f820, 0x3bded: 0x6e44fa20, 0x3bdee: 0x6e459220, 0x3bdef: 0x6e459420, - 0x3bdf0: 0x6e459620, 0x3bdf1: 0x6e459820, 0x3bdf2: 0x6e459a20, 0x3bdf3: 0x6e459c20, - 0x3bdf4: 0x6e460220, 0x3bdf5: 0x6e460420, 0x3bdf6: 0x6e460620, 0x3bdf7: 0x6e460820, - 0x3bdf8: 0x6e466420, 0x3bdf9: 0x6e466620, 0x3bdfa: 0x6e466820, 0x3bdfb: 0x6e469c20, - 0x3bdfc: 0x6e469e20, 0x3bdfd: 0x6e46a020, 0x3bdfe: 0x6e46d620, 0x3bdff: 0x6e46f620, - // Block 0xef8, offset 0x3be00 - 0x3be00: 0x6e46f820, 0x3be01: 0x6c63b820, 0x3be02: 0x6c63ba20, 0x3be03: 0x6c63bc20, - 0x3be04: 0x6c8ade20, 0x3be05: 0x6cb76820, 0x3be06: 0x6cb76a20, 0x3be07: 0x6cb76c20, - 0x3be08: 0x6cb76e20, 0x3be09: 0x6cb77020, 0x3be0a: 0x6cb77220, 0x3be0b: 0x6cb77420, - 0x3be0c: 0x6ce8a220, 0x3be0d: 0x6ce8a420, 0x3be0e: 0x6d184820, 0x3be0f: 0x6d473420, - 0x3be10: 0x6d473620, 0x3be11: 0x6d74f220, 0x3be12: 0x6d74f420, 0x3be13: 0x6d74f620, - 0x3be14: 0x6d74f820, 0x3be15: 0x6e0ad620, 0x3be16: 0x6d474620, 0x3be17: 0x6d474820, - 0x3be18: 0x6d750220, 0x3be19: 0x6d750420, 0x3be1a: 0x6d750620, 0x3be1b: 0x6d750820, - 0x3be1c: 0x6d9ecc20, 0x3be1d: 0x6d9ece20, 0x3be1e: 0x6d9ed020, 0x3be1f: 0x6d9ed220, - 0x3be20: 0x6d9ed420, 0x3be21: 0x6d9ed620, 0x3be22: 0x6dc14420, 0x3be23: 0x6ddef220, - 0x3be24: 0x6ddef420, 0x3be25: 0x6ddef620, 0x3be26: 0x6df73820, 0x3be27: 0x6df73a20, - 0x3be28: 0x6df73c20, 0x3be29: 0x6df73e20, 0x3be2a: 0x6df74020, 0x3be2b: 0x6df74220, - 0x3be2c: 0x6df74420, 0x3be2d: 0x6e0ada20, 0x3be2e: 0x6e0adc20, 0x3be2f: 0x6e0ade20, - 0x3be30: 0x6e0ae020, 0x3be31: 0x6e0ae220, 0x3be32: 0x6e0ae420, 0x3be33: 0x6e0ae620, - 0x3be34: 0x6e0ae820, 0x3be35: 0x6e1aca20, 0x3be36: 0x6e1acc20, 0x3be37: 0x6e1ace20, - 0x3be38: 0x6e1ad020, 0x3be39: 0x6e1ad220, 0x3be3a: 0x6e273820, 0x3be3b: 0x6e273a20, - 0x3be3c: 0x6e273c20, 0x3be3d: 0x6e273e20, 0x3be3e: 0x6e274020, 0x3be3f: 0x6e30aa20, - // Block 0xef9, offset 0x3be40 - 0x3be40: 0x6e30ac20, 0x3be41: 0x6e30ae20, 0x3be42: 0x6e30b020, 0x3be43: 0x6e379020, - 0x3be44: 0x6e379220, 0x3be45: 0x6e379420, 0x3be46: 0x6e3c3420, 0x3be47: 0x6e3c3620, - 0x3be48: 0x6e3fba20, 0x3be49: 0x6e422a20, 0x3be4a: 0x6e43e020, 0x3be4b: 0x6d185c20, - 0x3be4c: 0x6d185e20, 0x3be4d: 0x6d474c20, 0x3be4e: 0x6d474e20, 0x3be4f: 0x6d751620, - 0x3be50: 0x6d751820, 0x3be51: 0x6d751a20, 0x3be52: 0x6d751c20, 0x3be53: 0x6d751e20, - 0x3be54: 0x6d752020, 0x3be55: 0x6d752220, 0x3be56: 0x6d752420, 0x3be57: 0x6d752620, - 0x3be58: 0x6d752820, 0x3be59: 0x6d752a20, 0x3be5a: 0x6d752c20, 0x3be5b: 0x6d9eea20, - 0x3be5c: 0x6d9eec20, 0x3be5d: 0x6d9eee20, 0x3be5e: 0x6d9ef020, 0x3be5f: 0x6d9ef220, - 0x3be60: 0x6d9ef420, 0x3be61: 0x6d9ef620, 0x3be62: 0x6d9ef820, 0x3be63: 0x6d9efa20, - 0x3be64: 0x6d9efc20, 0x3be65: 0x6dc14e20, 0x3be66: 0x6dc15020, 0x3be67: 0x6dc15220, - 0x3be68: 0x6dc15420, 0x3be69: 0x6dc15620, 0x3be6a: 0x6dc15820, 0x3be6b: 0x6dc15a20, - 0x3be6c: 0x6dc15c20, 0x3be6d: 0x6dc15e20, 0x3be6e: 0x6dc16020, 0x3be6f: 0x6dc16220, - 0x3be70: 0x6dc16420, 0x3be71: 0x6dc16620, 0x3be72: 0x6dc16820, 0x3be73: 0x6dc16a20, - 0x3be74: 0x6ddf0620, 0x3be75: 0x6ddf0820, 0x3be76: 0x6ddf0a20, 0x3be77: 0x6ddf0c20, - 0x3be78: 0x6ddf0e20, 0x3be79: 0x6ddf1020, 0x3be7a: 0x6ddf1220, 0x3be7b: 0x6ddf1420, - 0x3be7c: 0x6ddf1620, 0x3be7d: 0x6ddf1820, 0x3be7e: 0x6ddf1a20, 0x3be7f: 0x6ddf1c20, - // Block 0xefa, offset 0x3be80 - 0x3be80: 0x6ddf1e20, 0x3be81: 0x6ddf2020, 0x3be82: 0x6ddf2220, 0x3be83: 0x6ddf2420, - 0x3be84: 0x6df75620, 0x3be85: 0x6df75820, 0x3be86: 0x6df75a20, 0x3be87: 0x6df75c20, - 0x3be88: 0x6df75e20, 0x3be89: 0x6df76020, 0x3be8a: 0x6df76220, 0x3be8b: 0x6df76420, - 0x3be8c: 0x6df76620, 0x3be8d: 0x6df76820, 0x3be8e: 0x6e0af420, 0x3be8f: 0x6e0af620, - 0x3be90: 0x6e0af820, 0x3be91: 0x6e0afa20, 0x3be92: 0x6e0afc20, 0x3be93: 0x6e0afe20, - 0x3be94: 0x6e0b0020, 0x3be95: 0x6e0b0220, 0x3be96: 0x6e0b0420, 0x3be97: 0x6e1ada20, - 0x3be98: 0x6e1adc20, 0x3be99: 0x6e1ade20, 0x3be9a: 0x6e1ae020, 0x3be9b: 0x6e1ae220, - 0x3be9c: 0x6e274620, 0x3be9d: 0x6e274820, 0x3be9e: 0x6e274a20, 0x3be9f: 0x6e274c20, - 0x3bea0: 0x6e274e20, 0x3bea1: 0x6e30b420, 0x3bea2: 0x6e30b620, 0x3bea3: 0x6e30b820, - 0x3bea4: 0x6e30ba20, 0x3bea5: 0x6e30bc20, 0x3bea6: 0x6e30be20, 0x3bea7: 0x6e30c020, - 0x3bea8: 0x6e30c220, 0x3bea9: 0x6e30c420, 0x3beaa: 0x6e379c20, 0x3beab: 0x6e379e20, - 0x3beac: 0x6e37a020, 0x3bead: 0x6e37a220, 0x3beae: 0x6e3c3a20, 0x3beaf: 0x6e3c3c20, - 0x3beb0: 0x6e3c3e20, 0x3beb1: 0x6e3c4020, 0x3beb2: 0x6e3c4220, 0x3beb3: 0x6e3c4420, - 0x3beb4: 0x6e3c4620, 0x3beb5: 0x6e422c20, 0x3beb6: 0x6e43e420, 0x3beb7: 0x6e43e620, - 0x3beb8: 0x6e44fc20, 0x3beb9: 0x6e460c20, 0x3beba: 0x6e46d820, 0x3bebb: 0x6e46fa20, - 0x3bebc: 0x6d186220, 0x3bebd: 0x6d186420, 0x3bebe: 0x6d186620, 0x3bebf: 0x6d186820, - // Block 0xefb, offset 0x3bec0 - 0x3bec0: 0x6d186a20, 0x3bec1: 0x6d475820, 0x3bec2: 0x6d475a20, 0x3bec3: 0x6d475c20, - 0x3bec4: 0x6d475e20, 0x3bec5: 0x6d753c20, 0x3bec6: 0x6d753e20, 0x3bec7: 0x6d754020, - 0x3bec8: 0x6d754220, 0x3bec9: 0x6d754420, 0x3beca: 0x6d754620, 0x3becb: 0x6d754820, - 0x3becc: 0x6d754a20, 0x3becd: 0x6d754c20, 0x3bece: 0x6d754e20, 0x3becf: 0x6d755020, - 0x3bed0: 0x6d755220, 0x3bed1: 0x6d755420, 0x3bed2: 0x6d755620, 0x3bed3: 0x6d755820, - 0x3bed4: 0x6d9f0c20, 0x3bed5: 0x6d9f0e20, 0x3bed6: 0x6d9f1020, 0x3bed7: 0x6d9f1220, - 0x3bed8: 0x6d9f1420, 0x3bed9: 0x6d9f1620, 0x3beda: 0x6d9f1820, 0x3bedb: 0x6cbd9220, - 0x3bedc: 0x6d9f1a20, 0x3bedd: 0x6d9f1c20, 0x3bede: 0x6d9f1e20, 0x3bedf: 0x6d9f2020, - 0x3bee0: 0x6d9f2220, 0x3bee1: 0x6d9f2420, 0x3bee2: 0x6dc17420, 0x3bee3: 0x6dc17620, - 0x3bee4: 0x6dc17820, 0x3bee5: 0x6dc17a20, 0x3bee6: 0x6dc17c20, 0x3bee7: 0x6dc17e20, - 0x3bee8: 0x6dc18020, 0x3bee9: 0x6dc18220, 0x3beea: 0x6dc18420, 0x3beeb: 0x6dc18620, - 0x3beec: 0x6dc18820, 0x3beed: 0x6ddf3220, 0x3beee: 0x6ddf3420, 0x3beef: 0x6ddf3620, - 0x3bef0: 0x6ddf3820, 0x3bef1: 0x6ddf3a20, 0x3bef2: 0x6ddf3c20, 0x3bef3: 0x6ddf3e20, - 0x3bef4: 0x6ddf4020, 0x3bef5: 0x6ddf4220, 0x3bef6: 0x6ddf4420, 0x3bef7: 0x6ddf4620, - 0x3bef8: 0x6ddf4820, 0x3bef9: 0x6ddf4a20, 0x3befa: 0x6ddf4c20, 0x3befb: 0x6ddf4e20, - 0x3befc: 0x6df77820, 0x3befd: 0x6df77a20, 0x3befe: 0x6df77c20, 0x3beff: 0x6df77e20, - // Block 0xefc, offset 0x3bf00 - 0x3bf00: 0x6df78020, 0x3bf01: 0x6df78220, 0x3bf02: 0x6df78420, 0x3bf03: 0x6df78620, - 0x3bf04: 0x6df78820, 0x3bf05: 0x6df78a20, 0x3bf06: 0x6df78c20, 0x3bf07: 0x6df78e20, - 0x3bf08: 0x6df79020, 0x3bf09: 0x6df79220, 0x3bf0a: 0x6df79420, 0x3bf0b: 0x6df79620, - 0x3bf0c: 0x6e0b0820, 0x3bf0d: 0x6e0b0a20, 0x3bf0e: 0x6e0b0c20, 0x3bf0f: 0x6e0b0e20, - 0x3bf10: 0x6e0b1020, 0x3bf11: 0x6e0b1220, 0x3bf12: 0x6e0b1420, 0x3bf13: 0x6e0b1620, - 0x3bf14: 0x6e0b1820, 0x3bf15: 0x6e0b1a20, 0x3bf16: 0x6e0b1c20, 0x3bf17: 0x6e0b1e20, - 0x3bf18: 0x6e0b2020, 0x3bf19: 0x6e0b2220, 0x3bf1a: 0x6e0b2420, 0x3bf1b: 0x6e1aea20, - 0x3bf1c: 0x6e1aec20, 0x3bf1d: 0x6e1aee20, 0x3bf1e: 0x6e1af020, 0x3bf1f: 0x6e1af220, - 0x3bf20: 0x6e1af420, 0x3bf21: 0x6e1af620, 0x3bf22: 0x6e1af820, 0x3bf23: 0x6e275820, - 0x3bf24: 0x6e275a20, 0x3bf25: 0x6e275c20, 0x3bf26: 0x6e275e20, 0x3bf27: 0x6e276020, - 0x3bf28: 0x6e276220, 0x3bf29: 0x6e276420, 0x3bf2a: 0x6e276620, 0x3bf2b: 0x6e276820, - 0x3bf2c: 0x6e276a20, 0x3bf2d: 0x6e276c20, 0x3bf2e: 0x6e276e20, 0x3bf2f: 0x6e277020, - 0x3bf30: 0x6e277220, 0x3bf31: 0x6e277420, 0x3bf32: 0x6e30ca20, 0x3bf33: 0x6e30cc20, - 0x3bf34: 0x6e30ce20, 0x3bf35: 0x6e30d020, 0x3bf36: 0x6e30d220, 0x3bf37: 0x6e30d420, - 0x3bf38: 0x6e37a620, 0x3bf39: 0x6e37a820, 0x3bf3a: 0x6e37aa20, 0x3bf3b: 0x6e37ac20, - 0x3bf3c: 0x6e37ae20, 0x3bf3d: 0x6e37b020, 0x3bf3e: 0x6e37b220, 0x3bf3f: 0x6e3fbc20, - // Block 0xefd, offset 0x3bf40 - 0x3bf40: 0x6e3fbe20, 0x3bf41: 0x6e422e20, 0x3bf42: 0x6e423020, 0x3bf43: 0x6e43e820, - 0x3bf44: 0x6e43ea20, 0x3bf45: 0x6e43ec20, 0x3bf46: 0x6e45a020, 0x3bf47: 0x6e460e20, - 0x3bf48: 0x6c8aec20, 0x3bf49: 0x6cb78e20, 0x3bf4a: 0x6cb79020, 0x3bf4b: 0x6ce8b020, - 0x3bf4c: 0x6d476020, 0x3bf4d: 0x6c63ca20, 0x3bf4e: 0x6d755c20, 0x3bf4f: 0x6d755e20, - 0x3bf50: 0x6ddf5020, 0x3bf51: 0x6d186c20, 0x3bf52: 0x6d476820, 0x3bf53: 0x6d476a20, - 0x3bf54: 0x6d476c20, 0x3bf55: 0x6d756620, 0x3bf56: 0x6d756820, 0x3bf57: 0x6d756a20, - 0x3bf58: 0x6d756c20, 0x3bf59: 0x6d756e20, 0x3bf5a: 0x6d757020, 0x3bf5b: 0x6d9f2820, - 0x3bf5c: 0x6d9f2a20, 0x3bf5d: 0x6d9f2c20, 0x3bf5e: 0x6d9f2e20, 0x3bf5f: 0x6d9f3020, - 0x3bf60: 0x6dc18c20, 0x3bf61: 0x6dc18e20, 0x3bf62: 0x6dc19020, 0x3bf63: 0x6ddf5420, - 0x3bf64: 0x6ddf5620, 0x3bf65: 0x6df79c20, 0x3bf66: 0x6df79e20, 0x3bf67: 0x6df7a020, - 0x3bf68: 0x6e0b2c20, 0x3bf69: 0x6e0b2e20, 0x3bf6a: 0x6e1afa20, 0x3bf6b: 0x6e1afc20, - 0x3bf6c: 0x6e277620, 0x3bf6d: 0x6e30d620, 0x3bf6e: 0x6e30d820, 0x3bf6f: 0x6e30da20, - 0x3bf70: 0x6e37b420, 0x3bf71: 0x6e3c4a20, 0x3bf72: 0x6e461020, 0x3bf73: 0x6d186e20, - 0x3bf74: 0x6d476e20, 0x3bf75: 0x6d757220, 0x3bf76: 0x6d757420, 0x3bf77: 0x6d757620, - 0x3bf78: 0x6d757820, 0x3bf79: 0x6d757a20, 0x3bf7a: 0x6d9f3820, 0x3bf7b: 0x6dc19a20, - 0x3bf7c: 0x6dc19c20, 0x3bf7d: 0x6dc19e20, 0x3bf7e: 0x6dc1a020, 0x3bf7f: 0x6dc1a220, - // Block 0xefe, offset 0x3bf80 - 0x3bf80: 0x6dc1a420, 0x3bf81: 0x6dc1a620, 0x3bf82: 0x6ddf5e20, 0x3bf83: 0x6ddf6020, - 0x3bf84: 0x6ddf6220, 0x3bf85: 0x6ddf6420, 0x3bf86: 0x6df7a620, 0x3bf87: 0x6df7a820, - 0x3bf88: 0x6df7aa20, 0x3bf89: 0x6df7ac20, 0x3bf8a: 0x6df7ae20, 0x3bf8b: 0x6df7b020, - 0x3bf8c: 0x6df7b220, 0x3bf8d: 0x6df7b420, 0x3bf8e: 0x6df7b620, 0x3bf8f: 0x6df7b820, - 0x3bf90: 0x6df7ba20, 0x3bf91: 0x6df7bc20, 0x3bf92: 0x6df7be20, 0x3bf93: 0x6e0b3220, - 0x3bf94: 0x6e0b3420, 0x3bf95: 0x6e0b3620, 0x3bf96: 0x6e0b3820, 0x3bf97: 0x6e0b3a20, - 0x3bf98: 0x6e0b3c20, 0x3bf99: 0x6e1b0020, 0x3bf9a: 0x6e1b0220, 0x3bf9b: 0x6e1b0420, - 0x3bf9c: 0x6e1b0620, 0x3bf9d: 0x6e1b0820, 0x3bf9e: 0x6e1b0a20, 0x3bf9f: 0x6e277820, - 0x3bfa0: 0x6e277a20, 0x3bfa1: 0x6e277c20, 0x3bfa2: 0x6e277e20, 0x3bfa3: 0x6e278020, - 0x3bfa4: 0x6e30e020, 0x3bfa5: 0x6e30e220, 0x3bfa6: 0x6e30e420, 0x3bfa7: 0x6e37b820, - 0x3bfa8: 0x6e37ba20, 0x3bfa9: 0x6e37bc20, 0x3bfaa: 0x6e3fc020, 0x3bfab: 0x6e423220, - 0x3bfac: 0x6e461220, 0x3bfad: 0x6d477020, 0x3bfae: 0x6d758220, 0x3bfaf: 0x6d758420, - 0x3bfb0: 0x6d9f3e20, 0x3bfb1: 0x6d9f4020, 0x3bfb2: 0x6d9f4220, 0x3bfb3: 0x6d9f4420, - 0x3bfb4: 0x6d9f4620, 0x3bfb5: 0x6d9f4820, 0x3bfb6: 0x6dc1aa20, 0x3bfb7: 0x6dc1ac20, - 0x3bfb8: 0x6dc1ae20, 0x3bfb9: 0x6dc1b020, 0x3bfba: 0x6dc1b220, 0x3bfbb: 0x6dc1b420, - 0x3bfbc: 0x6dc1b620, 0x3bfbd: 0x6dc1b820, 0x3bfbe: 0x6dc1ba20, 0x3bfbf: 0x6ddf6620, - // Block 0xeff, offset 0x3bfc0 - 0x3bfc0: 0x6ddf6820, 0x3bfc1: 0x6df7c020, 0x3bfc2: 0x6e0b4420, 0x3bfc3: 0x6e0b4620, - 0x3bfc4: 0x6e0b4820, 0x3bfc5: 0x6e0b4a20, 0x3bfc6: 0x6e0b4c20, 0x3bfc7: 0x6e1b1220, - 0x3bfc8: 0x6e1b1420, 0x3bfc9: 0x6e1b1620, 0x3bfca: 0x6e1b1820, 0x3bfcb: 0x6e278620, - 0x3bfcc: 0x6e30e820, 0x3bfcd: 0x6e30ea20, 0x3bfce: 0x6e30ec20, 0x3bfcf: 0x6e30ee20, - 0x3bfd0: 0x6e37be20, 0x3bfd1: 0x6e3fc220, 0x3bfd2: 0x6e3c5020, 0x3bfd3: 0x6e3fc420, - 0x3bfd4: 0x6e43ee20, 0x3bfd5: 0x6e43f020, 0x3bfd6: 0x6e43f220, 0x3bfd7: 0x6ce8bc20, - 0x3bfd8: 0x6d187220, 0x3bfd9: 0x6d477420, 0x3bfda: 0x6d477620, 0x3bfdb: 0x6d477820, - 0x3bfdc: 0x6d758c20, 0x3bfdd: 0x6d758e20, 0x3bfde: 0x6d759020, 0x3bfdf: 0x6d759220, - 0x3bfe0: 0x6d759420, 0x3bfe1: 0x6d759620, 0x3bfe2: 0x6d759820, 0x3bfe3: 0x6d759a20, - 0x3bfe4: 0x6d9f5620, 0x3bfe5: 0x6d9f5820, 0x3bfe6: 0x6d9f5a20, 0x3bfe7: 0x6d9f5c20, - 0x3bfe8: 0x6d9f5e20, 0x3bfe9: 0x6d9f6020, 0x3bfea: 0x6d9f6220, 0x3bfeb: 0x6d9f6420, - 0x3bfec: 0x6d9f6620, 0x3bfed: 0x6d9f6820, 0x3bfee: 0x6d9f6a20, 0x3bfef: 0x6d9f6c20, - 0x3bff0: 0x6d9f6e20, 0x3bff1: 0x6d9f7020, 0x3bff2: 0x6dc1cc20, 0x3bff3: 0x6dc1ce20, - 0x3bff4: 0x6dc1d020, 0x3bff5: 0x6dc1d220, 0x3bff6: 0x6dc1d420, 0x3bff7: 0x6dc1d620, - 0x3bff8: 0x6dc1d820, 0x3bff9: 0x6dc1da20, 0x3bffa: 0x6dc1dc20, 0x3bffb: 0x6dc1de20, - 0x3bffc: 0x6dc1e020, 0x3bffd: 0x6dc1e220, 0x3bffe: 0x6dc1e420, 0x3bfff: 0x6ddf7820, - // Block 0xf00, offset 0x3c000 - 0x3c000: 0x6ddf7a20, 0x3c001: 0x6ddf7c20, 0x3c002: 0x6ddf7e20, 0x3c003: 0x6ddf8020, - 0x3c004: 0x6ddf8220, 0x3c005: 0x6ddf8420, 0x3c006: 0x6ddf8620, 0x3c007: 0x6ddf8820, - 0x3c008: 0x6df7cc20, 0x3c009: 0x6df7ce20, 0x3c00a: 0x6df7d020, 0x3c00b: 0x6df7d220, - 0x3c00c: 0x6df7d420, 0x3c00d: 0x6df7d620, 0x3c00e: 0x6df7d820, 0x3c00f: 0x6df7da20, - 0x3c010: 0x6df7dc20, 0x3c011: 0x6df7de20, 0x3c012: 0x6e0b6220, 0x3c013: 0x6e0b6420, - 0x3c014: 0x6e0b6620, 0x3c015: 0x6e0b6820, 0x3c016: 0x6e0b6a20, 0x3c017: 0x6e0b6c20, - 0x3c018: 0x6e0b6e20, 0x3c019: 0x6e0b7020, 0x3c01a: 0x6e0b7220, 0x3c01b: 0x6e0b7420, - 0x3c01c: 0x6e0b7620, 0x3c01d: 0x6e0b7820, 0x3c01e: 0x6e0b7a20, 0x3c01f: 0x6e0b7c20, - 0x3c020: 0x6e0b7e20, 0x3c021: 0x6e0b8020, 0x3c022: 0x6e0b8220, 0x3c023: 0x6e1b2a20, - 0x3c024: 0x6e0b8420, 0x3c025: 0x6e1b2c20, 0x3c026: 0x6e1b2e20, 0x3c027: 0x6e1b3020, - 0x3c028: 0x6e1b3220, 0x3c029: 0x6e1b3420, 0x3c02a: 0x6e1b3620, 0x3c02b: 0x6e1b3820, - 0x3c02c: 0x6e1b3a20, 0x3c02d: 0x6e1b3c20, 0x3c02e: 0x6e1b3e20, 0x3c02f: 0x6e1b4020, - 0x3c030: 0x6e1b4220, 0x3c031: 0x6e1b4420, 0x3c032: 0x6e1b4620, 0x3c033: 0x6e1b4820, - 0x3c034: 0x6e1b4a20, 0x3c035: 0x6e1b4c20, 0x3c036: 0x6e1b4e20, 0x3c037: 0x6e1b5020, - 0x3c038: 0x6e1b5220, 0x3c039: 0x6e1b5420, 0x3c03a: 0x6e1b5620, 0x3c03b: 0x6e1b5820, - 0x3c03c: 0x6e1b5a20, 0x3c03d: 0x6e1b5c20, 0x3c03e: 0x6e278c20, 0x3c03f: 0x6e278e20, - // Block 0xf01, offset 0x3c040 - 0x3c040: 0x6e279020, 0x3c041: 0x6e279220, 0x3c042: 0x6e279420, 0x3c043: 0x6e279620, - 0x3c044: 0x6e279820, 0x3c045: 0x6e279a20, 0x3c046: 0x6e279c20, 0x3c047: 0x6e279e20, - 0x3c048: 0x6e27a020, 0x3c049: 0x6e27a220, 0x3c04a: 0x6e27a420, 0x3c04b: 0x6e27a620, - 0x3c04c: 0x6e27a820, 0x3c04d: 0x6e27aa20, 0x3c04e: 0x6e27ac20, 0x3c04f: 0x6e30f820, - 0x3c050: 0x6e30fa20, 0x3c051: 0x6e30fc20, 0x3c052: 0x6e30fe20, 0x3c053: 0x6e310020, - 0x3c054: 0x6e310220, 0x3c055: 0x6e310420, 0x3c056: 0x6e310620, 0x3c057: 0x6e310820, - 0x3c058: 0x6e37c220, 0x3c059: 0x6e37c420, 0x3c05a: 0x6e37c620, 0x3c05b: 0x6e37c820, - 0x3c05c: 0x6e37ca20, 0x3c05d: 0x6e37cc20, 0x3c05e: 0x6e37ce20, 0x3c05f: 0x6e37d020, - 0x3c060: 0x6e37d220, 0x3c061: 0x6e37d420, 0x3c062: 0x6e37d620, 0x3c063: 0x6e37d820, - 0x3c064: 0x6e37da20, 0x3c065: 0x6e37dc20, 0x3c066: 0x6e37de20, 0x3c067: 0x6e37e020, - 0x3c068: 0x6e37e220, 0x3c069: 0x6e3c5a20, 0x3c06a: 0x6e3c5c20, 0x3c06b: 0x6e3c5e20, - 0x3c06c: 0x6e3c6020, 0x3c06d: 0x6e3c6220, 0x3c06e: 0x6e3c6420, 0x3c06f: 0x6e3c6620, - 0x3c070: 0x6e3c6820, 0x3c071: 0x6e3c6a20, 0x3c072: 0x6e3c6c20, 0x3c073: 0x6e3c6e20, - 0x3c074: 0x6e3fca20, 0x3c075: 0x6e3fcc20, 0x3c076: 0x6e3fce20, 0x3c077: 0x6e3fd020, - 0x3c078: 0x6e3fd220, 0x3c079: 0x6e423620, 0x3c07a: 0x6e423820, 0x3c07b: 0x6e423a20, - 0x3c07c: 0x6e423c20, 0x3c07d: 0x6e423e20, 0x3c07e: 0x6e424020, 0x3c07f: 0x6e43f620, - // Block 0xf02, offset 0x3c080 - 0x3c080: 0x6e43f820, 0x3c081: 0x6e43fa20, 0x3c082: 0x6e43fc20, 0x3c083: 0x6e450020, - 0x3c084: 0x6e450220, 0x3c085: 0x6e45a220, 0x3c086: 0x6e45a420, 0x3c087: 0x6e466a20, - 0x3c088: 0x6e466c20, 0x3c089: 0x6e471c20, 0x3c08a: 0x6e472a20, 0x3c08b: 0x6ddf8a20, - 0x3c08c: 0x6e0b8a20, 0x3c08d: 0x6e1b6020, 0x3c08e: 0x6e1b6220, 0x3c08f: 0x6e1b6420, - 0x3c090: 0x6e310a20, 0x3c091: 0x6d477a20, 0x3c092: 0x6d759c20, 0x3c093: 0x6d759e20, - 0x3c094: 0x6dc1ea20, 0x3c095: 0x6dc1ec20, 0x3c096: 0x6dc1ee20, 0x3c097: 0x6dc1f020, - 0x3c098: 0x6dc1f220, 0x3c099: 0x6dc1f420, 0x3c09a: 0x6ddf9420, 0x3c09b: 0x6ddf9620, - 0x3c09c: 0x6ddf9820, 0x3c09d: 0x6ddf9a20, 0x3c09e: 0x6ddf9c20, 0x3c09f: 0x6ddf9e20, - 0x3c0a0: 0x6ddfa020, 0x3c0a1: 0x6df7e820, 0x3c0a2: 0x6df7ea20, 0x3c0a3: 0x6df7ec20, - 0x3c0a4: 0x6df7ee20, 0x3c0a5: 0x6df7f020, 0x3c0a6: 0x6df7f220, 0x3c0a7: 0x6e0b8c20, - 0x3c0a8: 0x6e0b8e20, 0x3c0a9: 0x6e0b9020, 0x3c0aa: 0x6e0b9220, 0x3c0ab: 0x6e0b9420, - 0x3c0ac: 0x6e1b6820, 0x3c0ad: 0x6e1b6a20, 0x3c0ae: 0x6e27b020, 0x3c0af: 0x6e27b220, - 0x3c0b0: 0x6e27b420, 0x3c0b1: 0x6e27b620, 0x3c0b2: 0x6e27b820, 0x3c0b3: 0x6e27ba20, - 0x3c0b4: 0x6e27bc20, 0x3c0b5: 0x6e27be20, 0x3c0b6: 0x6e27c020, 0x3c0b7: 0x6e311020, - 0x3c0b8: 0x6e311220, 0x3c0b9: 0x6e37e620, 0x3c0ba: 0x6e3c7420, 0x3c0bb: 0x6e3cd420, - 0x3c0bc: 0x6e3fd620, 0x3c0bd: 0x6e3c7620, 0x3c0be: 0x6e3fd820, 0x3c0bf: 0x6e424220, - // Block 0xf03, offset 0x3c0c0 - 0x3c0c0: 0x6e424420, 0x3c0c1: 0x6e43fe20, 0x3c0c2: 0x6ce8c220, 0x3c0c3: 0x6d477c20, - 0x3c0c4: 0x6d75a620, 0x3c0c5: 0x6d75a820, 0x3c0c6: 0x6d75aa20, 0x3c0c7: 0x6d9f7a20, - 0x3c0c8: 0x6ddfa220, 0x3c0c9: 0x6e27c220, 0x3c0ca: 0x6e424620, 0x3c0cb: 0x6d9f7c20, - 0x3c0cc: 0x6d9f7e20, 0x3c0cd: 0x6dc1fa20, 0x3c0ce: 0x6dc1fc20, 0x3c0cf: 0x6dc1fe20, - 0x3c0d0: 0x6ddfae20, 0x3c0d1: 0x6ddfb020, 0x3c0d2: 0x6ddfb220, 0x3c0d3: 0x6ddfb420, - 0x3c0d4: 0x6df7fa20, 0x3c0d5: 0x6df7fc20, 0x3c0d6: 0x6df7fe20, 0x3c0d7: 0x6df80020, - 0x3c0d8: 0x6df80220, 0x3c0d9: 0x6df80420, 0x3c0da: 0x6df80620, 0x3c0db: 0x6df80820, - 0x3c0dc: 0x6e0b9820, 0x3c0dd: 0x6e0b9a20, 0x3c0de: 0x6e0b9c20, 0x3c0df: 0x6e0b9e20, - 0x3c0e0: 0x6e0ba020, 0x3c0e1: 0x6e0ba220, 0x3c0e2: 0x6e1b7620, 0x3c0e3: 0x6e1b7820, - 0x3c0e4: 0x6e1b7a20, 0x3c0e5: 0x6e1b7c20, 0x3c0e6: 0x6e27c620, 0x3c0e7: 0x6e27c820, - 0x3c0e8: 0x6e27ca20, 0x3c0e9: 0x6e27cc20, 0x3c0ea: 0x6e27ce20, 0x3c0eb: 0x6e27d020, - 0x3c0ec: 0x6e27d220, 0x3c0ed: 0x6e27d420, 0x3c0ee: 0x6e311620, 0x3c0ef: 0x6e37ee20, - 0x3c0f0: 0x6e37f020, 0x3c0f1: 0x6e37f220, 0x3c0f2: 0x6e37f420, 0x3c0f3: 0x6e3c8220, - 0x3c0f4: 0x6e3c8420, 0x3c0f5: 0x6e3fdc20, 0x3c0f6: 0x6e424820, 0x3c0f7: 0x6e450620, - 0x3c0f8: 0x6d75ae20, 0x3c0f9: 0x6d75b020, 0x3c0fa: 0x6d9f8220, 0x3c0fb: 0x6d9f8420, - 0x3c0fc: 0x6d9f8620, 0x3c0fd: 0x6dc20820, 0x3c0fe: 0x6dc20a20, 0x3c0ff: 0x6dc20c20, - // Block 0xf04, offset 0x3c100 - 0x3c100: 0x6dc20e20, 0x3c101: 0x6dc21020, 0x3c102: 0x6dc21220, 0x3c103: 0x6dc21420, - 0x3c104: 0x6dc21620, 0x3c105: 0x6dc21820, 0x3c106: 0x6dc21a20, 0x3c107: 0x6dc21c20, - 0x3c108: 0x6dc21e20, 0x3c109: 0x6ddfc820, 0x3c10a: 0x6ddfca20, 0x3c10b: 0x6ddfcc20, - 0x3c10c: 0x6ddfce20, 0x3c10d: 0x6ddfd020, 0x3c10e: 0x6ddfd220, 0x3c10f: 0x6ddfd420, - 0x3c110: 0x6ddfd620, 0x3c111: 0x6ddfd820, 0x3c112: 0x6df80e20, 0x3c113: 0x6df81020, - 0x3c114: 0x6df81220, 0x3c115: 0x6df81420, 0x3c116: 0x6df81620, 0x3c117: 0x6df81820, - 0x3c118: 0x6df81a20, 0x3c119: 0x6df81c20, 0x3c11a: 0x6e0baa20, 0x3c11b: 0x6e0bac20, - 0x3c11c: 0x6e0bae20, 0x3c11d: 0x6e0bb020, 0x3c11e: 0x6e0bb220, 0x3c11f: 0x6df81e20, - 0x3c120: 0x6e0bb420, 0x3c121: 0x6e0bb620, 0x3c122: 0x6e0bb820, 0x3c123: 0x6e0bba20, - 0x3c124: 0x6e0bbc20, 0x3c125: 0x6e0bbe20, 0x3c126: 0x6e0bc020, 0x3c127: 0x6e0bc220, - 0x3c128: 0x6e1b8220, 0x3c129: 0x6e1b8420, 0x3c12a: 0x6e1b8620, 0x3c12b: 0x6e27e020, - 0x3c12c: 0x6e27e220, 0x3c12d: 0x6e27e420, 0x3c12e: 0x6e27e620, 0x3c12f: 0x6e27e820, - 0x3c130: 0x6e27ea20, 0x3c131: 0x6e27ec20, 0x3c132: 0x6e27ee20, 0x3c133: 0x6e27f020, - 0x3c134: 0x6e27f220, 0x3c135: 0x6e312420, 0x3c136: 0x6e312620, 0x3c137: 0x6e312820, - 0x3c138: 0x6e312a20, 0x3c139: 0x6e312c20, 0x3c13a: 0x6e312e20, 0x3c13b: 0x6e313020, - 0x3c13c: 0x6e313220, 0x3c13d: 0x6e313420, 0x3c13e: 0x6e313620, 0x3c13f: 0x6e380420, - // Block 0xf05, offset 0x3c140 - 0x3c140: 0x6e37f620, 0x3c141: 0x6e37f820, 0x3c142: 0x6e37fa20, 0x3c143: 0x6e37fc20, - 0x3c144: 0x6e37fe20, 0x3c145: 0x6e3c8620, 0x3c146: 0x6e3c8820, 0x3c147: 0x6e3c8a20, - 0x3c148: 0x6e3c8c20, 0x3c149: 0x6e3c8e20, 0x3c14a: 0x6e3fde20, 0x3c14b: 0x6e424a20, - 0x3c14c: 0x6e450820, 0x3c14d: 0x6e450a20, 0x3c14e: 0x6e45a620, 0x3c14f: 0x6e461420, - 0x3c150: 0x6d75b220, 0x3c151: 0x6d9f8c20, 0x3c152: 0x6d9f8e20, 0x3c153: 0x6dc22420, - 0x3c154: 0x6dc22620, 0x3c155: 0x6ddfe020, 0x3c156: 0x6ddfe220, 0x3c157: 0x6ddfe420, - 0x3c158: 0x6ddfe620, 0x3c159: 0x6ddfe820, 0x3c15a: 0x6df82620, 0x3c15b: 0x6df82820, - 0x3c15c: 0x6df82a20, 0x3c15d: 0x6df82c20, 0x3c15e: 0x6df82e20, 0x3c15f: 0x6df83020, - 0x3c160: 0x6df83220, 0x3c161: 0x6e0bc820, 0x3c162: 0x6e0bca20, 0x3c163: 0x6e0bcc20, - 0x3c164: 0x6e0bce20, 0x3c165: 0x6e1b8a20, 0x3c166: 0x6e1b8c20, 0x3c167: 0x6e1b8e20, - 0x3c168: 0x6e1b9020, 0x3c169: 0x6e1b9220, 0x3c16a: 0x6e1b9420, 0x3c16b: 0x6e1b9620, - 0x3c16c: 0x6e1b9820, 0x3c16d: 0x6e27f620, 0x3c16e: 0x6e27f820, 0x3c16f: 0x6e313c20, - 0x3c170: 0x6e313e20, 0x3c171: 0x6e314020, 0x3c172: 0x6e314220, 0x3c173: 0x6e380620, - 0x3c174: 0x6e380820, 0x3c175: 0x6e380a20, 0x3c176: 0x6e3c9420, 0x3c177: 0x6e3c9620, - 0x3c178: 0x6e3c9820, 0x3c179: 0x6e3c9a20, 0x3c17a: 0x6e3c9c20, 0x3c17b: 0x6e3fe020, - 0x3c17c: 0x6e3fe220, 0x3c17d: 0x6e3fe420, 0x3c17e: 0x6e425020, 0x3c17f: 0x6e425220, - // Block 0xf06, offset 0x3c180 - 0x3c180: 0x6e425420, 0x3c181: 0x6e45aa20, 0x3c182: 0x6e461620, 0x3c183: 0x6e466e20, - 0x3c184: 0x6d478420, 0x3c185: 0x6d9f9020, 0x3c186: 0x6dc22e20, 0x3c187: 0x6ddff020, - 0x3c188: 0x6ddff220, 0x3c189: 0x6df83620, 0x3c18a: 0x6df83820, 0x3c18b: 0x6e0bd020, - 0x3c18c: 0x6e0bd220, 0x3c18d: 0x6e27fa20, 0x3c18e: 0x6e1b9c20, 0x3c18f: 0x6e3c9e20, - 0x3c190: 0x6e3ca020, 0x3c191: 0x6e3ca220, 0x3c192: 0x6e440220, 0x3c193: 0x6e45ac20, - 0x3c194: 0x6dc23220, 0x3c195: 0x6dc23420, 0x3c196: 0x6dc23620, 0x3c197: 0x6dc23820, - 0x3c198: 0x6ddff820, 0x3c199: 0x6ddffa20, 0x3c19a: 0x6ddffc20, 0x3c19b: 0x6df84420, - 0x3c19c: 0x6df84620, 0x3c19d: 0x6df84820, 0x3c19e: 0x6df84a20, 0x3c19f: 0x6df84c20, - 0x3c1a0: 0x6df84e20, 0x3c1a1: 0x6df85020, 0x3c1a2: 0x6df85220, 0x3c1a3: 0x6df85420, - 0x3c1a4: 0x6df85620, 0x3c1a5: 0x6e0bee20, 0x3c1a6: 0x6e0bf020, 0x3c1a7: 0x6e0bf220, - 0x3c1a8: 0x6e0bf420, 0x3c1a9: 0x6e0bf620, 0x3c1aa: 0x6e0bf820, 0x3c1ab: 0x6e0bfa20, - 0x3c1ac: 0x6e0bfc20, 0x3c1ad: 0x6e0bfe20, 0x3c1ae: 0x6e0c0020, 0x3c1af: 0x6e0c0220, - 0x3c1b0: 0x6e0c0420, 0x3c1b1: 0x6e0c0620, 0x3c1b2: 0x6e0c0820, 0x3c1b3: 0x6e0c0a20, - 0x3c1b4: 0x6e0c0c20, 0x3c1b5: 0x6e0c0e20, 0x3c1b6: 0x6e0c1020, 0x3c1b7: 0x6e1bb020, - 0x3c1b8: 0x6e1bb220, 0x3c1b9: 0x6e1bb420, 0x3c1ba: 0x6e1bb620, 0x3c1bb: 0x6e1bb820, - 0x3c1bc: 0x6e1bba20, 0x3c1bd: 0x6e1bbc20, 0x3c1be: 0x6e1bbe20, 0x3c1bf: 0x6e1bc020, - // Block 0xf07, offset 0x3c1c0 - 0x3c1c0: 0x6e1bc220, 0x3c1c1: 0x6e1bc420, 0x3c1c2: 0x6e1bc620, 0x3c1c3: 0x6e1bc820, - 0x3c1c4: 0x6e1bca20, 0x3c1c5: 0x6e1bcc20, 0x3c1c6: 0x6e1bce20, 0x3c1c7: 0x6e1bd020, - 0x3c1c8: 0x6e1bd220, 0x3c1c9: 0x6e1bd420, 0x3c1ca: 0x6e1bd620, 0x3c1cb: 0x6e1bd820, - 0x3c1cc: 0x6e1bda20, 0x3c1cd: 0x6e1bdc20, 0x3c1ce: 0x6e280620, 0x3c1cf: 0x6e280820, - 0x3c1d0: 0x6e280a20, 0x3c1d1: 0x6e280c20, 0x3c1d2: 0x6e280e20, 0x3c1d3: 0x6e281020, - 0x3c1d4: 0x6e281220, 0x3c1d5: 0x6e281420, 0x3c1d6: 0x6e281620, 0x3c1d7: 0x6e281820, - 0x3c1d8: 0x6e281a20, 0x3c1d9: 0x6e281c20, 0x3c1da: 0x6e281e20, 0x3c1db: 0x6e282020, - 0x3c1dc: 0x6e282220, 0x3c1dd: 0x6e282420, 0x3c1de: 0x6e282620, 0x3c1df: 0x6e282820, - 0x3c1e0: 0x6e282a20, 0x3c1e1: 0x6e282c20, 0x3c1e2: 0x6e282e20, 0x3c1e3: 0x6e283020, - 0x3c1e4: 0x6e283220, 0x3c1e5: 0x6e315420, 0x3c1e6: 0x6e315620, 0x3c1e7: 0x6e315820, - 0x3c1e8: 0x6e315a20, 0x3c1e9: 0x6e315c20, 0x3c1ea: 0x6e315e20, 0x3c1eb: 0x6e316020, - 0x3c1ec: 0x6e316220, 0x3c1ed: 0x6e316420, 0x3c1ee: 0x6e316620, 0x3c1ef: 0x6e316820, - 0x3c1f0: 0x6e316a20, 0x3c1f1: 0x6e316c20, 0x3c1f2: 0x6e316e20, 0x3c1f3: 0x6e317020, - 0x3c1f4: 0x6e317220, 0x3c1f5: 0x6e317420, 0x3c1f6: 0x6e317620, 0x3c1f7: 0x6e317820, - 0x3c1f8: 0x6e317a20, 0x3c1f9: 0x6e381e20, 0x3c1fa: 0x6e382020, 0x3c1fb: 0x6e382220, - 0x3c1fc: 0x6e382420, 0x3c1fd: 0x6e382620, 0x3c1fe: 0x6e382820, 0x3c1ff: 0x6e382a20, - // Block 0xf08, offset 0x3c200 - 0x3c200: 0x6e382c20, 0x3c201: 0x6e382e20, 0x3c202: 0x6e383020, 0x3c203: 0x6e383220, - 0x3c204: 0x6e383420, 0x3c205: 0x6e383620, 0x3c206: 0x6e383820, 0x3c207: 0x6e383a20, - 0x3c208: 0x6e383c20, 0x3c209: 0x6e3cb020, 0x3c20a: 0x6e3cb220, 0x3c20b: 0x6e3cb420, - 0x3c20c: 0x6e3cb620, 0x3c20d: 0x6e3cb820, 0x3c20e: 0x6e3cba20, 0x3c20f: 0x6e3cbc20, - 0x3c210: 0x6e3cbe20, 0x3c211: 0x6e3cc020, 0x3c212: 0x6e3cc220, 0x3c213: 0x6e3cc420, - 0x3c214: 0x6e3cc620, 0x3c215: 0x6e3cc820, 0x3c216: 0x6e3cca20, 0x3c217: 0x6e3ccc20, - 0x3c218: 0x6e3cce20, 0x3c219: 0x6e3cd020, 0x3c21a: 0x6e3fea20, 0x3c21b: 0x6e3fec20, - 0x3c21c: 0x6e3fee20, 0x3c21d: 0x6e3ff020, 0x3c21e: 0x6e3ff220, 0x3c21f: 0x6e3ff420, - 0x3c220: 0x6e3ff620, 0x3c221: 0x6e3ff820, 0x3c222: 0x6e3ffa20, 0x3c223: 0x6e425820, - 0x3c224: 0x6e425a20, 0x3c225: 0x6e425c20, 0x3c226: 0x6e425e20, 0x3c227: 0x6e426020, - 0x3c228: 0x6e426220, 0x3c229: 0x6e426420, 0x3c22a: 0x6e426620, 0x3c22b: 0x6e426820, - 0x3c22c: 0x6e426a20, 0x3c22d: 0x6e426c20, 0x3c22e: 0x6e426e20, 0x3c22f: 0x6e427020, - 0x3c230: 0x6e440a20, 0x3c231: 0x6e440c20, 0x3c232: 0x6e440e20, 0x3c233: 0x6e441020, - 0x3c234: 0x6e441220, 0x3c235: 0x6e441420, 0x3c236: 0x6e451020, 0x3c237: 0x6e45ae20, - 0x3c238: 0x6e45b020, 0x3c239: 0x6e45b220, 0x3c23a: 0x6e45b420, 0x3c23b: 0x6e45b620, - 0x3c23c: 0x6e45b820, 0x3c23d: 0x6e461820, 0x3c23e: 0x6e461a20, 0x3c23f: 0x6e461c20, - // Block 0xf09, offset 0x3c240 - 0x3c240: 0x6e461e20, 0x3c241: 0x6e467020, 0x3c242: 0x6e467220, 0x3c243: 0x6e467420, - 0x3c244: 0x6e467620, 0x3c245: 0x6e46a620, 0x3c246: 0x6e46be20, 0x3c247: 0x6e46c020, - 0x3c248: 0x6e46c220, 0x3c249: 0x6e46c420, 0x3c24a: 0x6e46de20, 0x3c24b: 0x6e46e020, - 0x3c24c: 0x6e46fe20, 0x3c24d: 0x6e472620, 0x3c24e: 0x6e472820, 0x3c24f: 0x6d478a20, - 0x3c250: 0x6d9f9420, 0x3c251: 0x6df85c20, 0x3c252: 0x6df85e20, 0x3c253: 0x6df86020, - 0x3c254: 0x6df86220, 0x3c255: 0x6e0c1420, 0x3c256: 0x6e0c1620, 0x3c257: 0x6e0c1820, - 0x3c258: 0x6e0c1a20, 0x3c259: 0x6e1be420, 0x3c25a: 0x6e0c1c20, 0x3c25b: 0x6e0c1e20, - 0x3c25c: 0x6e283e20, 0x3c25d: 0x6e284020, 0x3c25e: 0x6e284220, 0x3c25f: 0x6e284420, - 0x3c260: 0x6e317c20, 0x3c261: 0x6e317e20, 0x3c262: 0x6e3cd220, 0x3c263: 0x6e427420, - 0x3c264: 0x6e427620, 0x3c265: 0x6e474220, 0x3c266: 0x6d9fa020, 0x3c267: 0x6e1bec20, - 0x3c268: 0x6de00220, 0x3c269: 0x6df86620, 0x3c26a: 0x6df86820, 0x3c26b: 0x6e0c2620, - 0x3c26c: 0x6e0c2820, 0x3c26d: 0x6e0c2a20, 0x3c26e: 0x6e0c2c20, 0x3c26f: 0x6e0c2e20, - 0x3c270: 0x6e0c3020, 0x3c271: 0x6e0c3220, 0x3c272: 0x6e0c3420, 0x3c273: 0x6e0c3620, - 0x3c274: 0x6e0c3820, 0x3c275: 0x6e0c3a20, 0x3c276: 0x6e1bee20, 0x3c277: 0x6e1bf020, - 0x3c278: 0x6e1bf220, 0x3c279: 0x6e1bf420, 0x3c27a: 0x6e1bf620, 0x3c27b: 0x6e1bf820, - 0x3c27c: 0x6e1bfa20, 0x3c27d: 0x6e1bfc20, 0x3c27e: 0x6e318220, 0x3c27f: 0x6e318420, - // Block 0xf0a, offset 0x3c280 - 0x3c280: 0x6e384020, 0x3c281: 0x6e3cd620, 0x3c282: 0x6e427820, 0x3c283: 0x6e427a20, - 0x3c284: 0x6e427c20, 0x3c285: 0x6e441820, 0x3c286: 0x6e441a20, 0x3c287: 0x6e45ba20, - 0x3c288: 0x6e46aa20, 0x3c289: 0x6d9fa220, 0x3c28a: 0x6e1c0220, 0x3c28b: 0x6e3cdc20, - 0x3c28c: 0x6e3cde20, 0x3c28d: 0x6e3ce020, 0x3c28e: 0x6e400020, 0x3c28f: 0x6e400220, - 0x3c290: 0x6e400420, 0x3c291: 0x6e400620, 0x3c292: 0x6e428020, 0x3c293: 0x6e441e20, - 0x3c294: 0x6e462020, 0x3c295: 0x6e46ac20, 0x3c296: 0x6e471220, - // Block 0xf0b, offset 0x3c2c0 - 0x3c2c0: 0x6c00f020, 0x3c2c1: 0x6c00f220, 0x3c2c2: 0x6c023420, 0x3c2c3: 0x6c28c220, - 0x3c2c4: 0x6c42f420, 0x3c2c5: 0x6c63d620, 0x3c2c6: 0x6c8afa20, 0x3c2c7: 0x6d75d220, - 0x3c2c8: 0x6c024020, 0x3c2c9: 0x6c42fe20, 0x3c2ca: 0x6c004c20, 0x3c2cb: 0x6c28ce20, - 0x3c2cc: 0x6c0b0c20, 0x3c2cd: 0x6c430820, 0x3c2ce: 0x6c63ee20, 0x3c2cf: 0x6c63f020, - 0x3c2d0: 0x6c05ae20, 0x3c2d1: 0x6c0b3620, 0x3c2d2: 0x6c161c20, 0x3c2d3: 0x6c161e20, - 0x3c2d4: 0x6c28f020, 0x3c2d5: 0x6c432a20, 0x3c2d6: 0x6c63fe20, 0x3c2d7: 0x6c640020, - 0x3c2d8: 0x6c8b2020, 0x3c2d9: 0x6cb7b620, 0x3c2da: 0x6cb7b820, 0x3c2db: 0x6ce8dc20, - 0x3c2dc: 0x6c162820, 0x3c2dd: 0x6cb7bc20, 0x3c2de: 0x6d18a820, 0x3c2df: 0x6d479c20, - 0x3c2e0: 0x6c05b420, 0x3c2e1: 0x6c05b620, 0x3c2e2: 0x6c164420, 0x3c2e3: 0x6c8b3c20, - 0x3c2e4: 0x6cb7d620, 0x3c2e5: 0x6d47b020, 0x3c2e6: 0x6de00c20, 0x3c2e7: 0x6c02c420, - 0x3c2e8: 0x6c0c3c20, 0x3c2e9: 0x6c0c3e20, 0x3c2ea: 0x6c0c4020, 0x3c2eb: 0x6c0c4220, - 0x3c2ec: 0x6c172220, 0x3c2ed: 0x6c172420, 0x3c2ee: 0x6c172620, 0x3c2ef: 0x6c172820, - 0x3c2f0: 0x6c172a20, 0x3c2f1: 0x6c172c20, 0x3c2f2: 0x6c172e20, 0x3c2f3: 0x6c173020, - 0x3c2f4: 0x6c173220, 0x3c2f5: 0x6c2a1c20, 0x3c2f6: 0x6c2a1e20, 0x3c2f7: 0x6c2a2020, - 0x3c2f8: 0x6c2a2220, 0x3c2f9: 0x6c2a2420, 0x3c2fa: 0x6c2a2620, 0x3c2fb: 0x6c444a20, - 0x3c2fc: 0x6c444c20, 0x3c2fd: 0x6c444e20, 0x3c2fe: 0x6c445020, 0x3c2ff: 0x6c445220, - // Block 0xf0c, offset 0x3c300 - 0x3c300: 0x6c445420, 0x3c301: 0x6c445620, 0x3c302: 0x6c445820, 0x3c303: 0x6c655c20, - 0x3c304: 0x6c655e20, 0x3c305: 0x6c656020, 0x3c306: 0x6c656220, 0x3c307: 0x6c656420, - 0x3c308: 0x6c656620, 0x3c309: 0x6c656820, 0x3c30a: 0x6c656a20, 0x3c30b: 0x6c8c4e20, - 0x3c30c: 0x6c8c5020, 0x3c30d: 0x6c8c5220, 0x3c30e: 0x6c8c5420, 0x3c30f: 0x6c8c5620, - 0x3c310: 0x6c8c5820, 0x3c311: 0x6c8c5a20, 0x3c312: 0x6c8c5c20, 0x3c313: 0x6c8c5e20, - 0x3c314: 0x6c8c6020, 0x3c315: 0x6c8c6220, 0x3c316: 0x6cb8b220, 0x3c317: 0x6cb8b420, - 0x3c318: 0x6cb8b620, 0x3c319: 0x6cb8b820, 0x3c31a: 0x6cb8ba20, 0x3c31b: 0x6cb8bc20, - 0x3c31c: 0x6cb8be20, 0x3c31d: 0x6cb8c020, 0x3c31e: 0x6cb8c220, 0x3c31f: 0x6cb8c420, - 0x3c320: 0x6ce9d620, 0x3c321: 0x6ce9d820, 0x3c322: 0x6ce9da20, 0x3c323: 0x6ce9dc20, - 0x3c324: 0x6ce9de20, 0x3c325: 0x6d19a820, 0x3c326: 0x6d19aa20, 0x3c327: 0x6d19ac20, - 0x3c328: 0x6d19ae20, 0x3c329: 0x6d19b020, 0x3c32a: 0x6d19b220, 0x3c32b: 0x6d485020, - 0x3c32c: 0x6d485220, 0x3c32d: 0x6d485420, 0x3c32e: 0x6d485620, 0x3c32f: 0x6d485820, - 0x3c330: 0x6d765e20, 0x3c331: 0x6d766020, 0x3c332: 0x6d766220, 0x3c333: 0x6d766420, - 0x3c334: 0x6d9ffc20, 0x3c335: 0x6d9ffe20, 0x3c336: 0x6da00020, 0x3c337: 0x6dc28620, - 0x3c338: 0x6dc28820, 0x3c339: 0x6dc28a20, 0x3c33a: 0x6de03c20, 0x3c33b: 0x6de03e20, - 0x3c33c: 0x6de04020, 0x3c33d: 0x6df88c20, 0x3c33e: 0x6e0c6220, 0x3c33f: 0x6c2a4a20, - // Block 0xf0d, offset 0x3c340 - 0x3c340: 0x6c446820, 0x3c341: 0x6c658420, 0x3c342: 0x6ce9ea20, 0x3c343: 0x6d486a20, - 0x3c344: 0x6d486c20, 0x3c345: 0x6d486e20, 0x3c346: 0x6de04620, 0x3c347: 0x6c658e20, - 0x3c348: 0x6c0c7620, 0x3c349: 0x6cb8f020, 0x3c34a: 0x6cea0620, 0x3c34b: 0x6d19da20, - 0x3c34c: 0x6d487020, 0x3c34d: 0x6d768220, 0x3c34e: 0x6c177e20, 0x3c34f: 0x6c178a20, - 0x3c350: 0x6c178c20, 0x3c351: 0x6c2a7220, 0x3c352: 0x6c65c020, 0x3c353: 0x6c8c9420, - 0x3c354: 0x6cb90a20, 0x3c355: 0x6d19e820, 0x3c356: 0x6c065820, 0x3c357: 0x6c0cb220, - 0x3c358: 0x6c0cb420, 0x3c359: 0x6c0cb620, 0x3c35a: 0x6c0cb820, 0x3c35b: 0x6c17b220, - 0x3c35c: 0x6c17b420, 0x3c35d: 0x6c17b620, 0x3c35e: 0x6c2a9620, 0x3c35f: 0x6c44ca20, - 0x3c360: 0x6c44cc20, 0x3c361: 0x6c44ce20, 0x3c362: 0x6c65f820, 0x3c363: 0x6c65fa20, - 0x3c364: 0x6c65fc20, 0x3c365: 0x6c65fe20, 0x3c366: 0x6c8cb620, 0x3c367: 0x6c8cb820, - 0x3c368: 0x6c8cba20, 0x3c369: 0x6cb92c20, 0x3c36a: 0x6cb92e20, 0x3c36b: 0x6cea2a20, - 0x3c36c: 0x6cea2c20, 0x3c36d: 0x6d19fc20, 0x3c36e: 0x6d489020, 0x3c36f: 0x6d769820, - 0x3c370: 0x6df8a020, 0x3c371: 0x6c0cd020, 0x3c372: 0x6c17ce20, 0x3c373: 0x6c660a20, - 0x3c374: 0x6c8cce20, 0x3c375: 0x6cea3620, 0x3c376: 0x6c067a20, 0x3c377: 0x6c2aba20, - 0x3c378: 0x6c661020, 0x3c379: 0x6cb94420, 0x3c37a: 0x6cea3820, 0x3c37b: 0x6cea3a20, - 0x3c37c: 0x6dc2b420, 0x3c37d: 0x6de05420, 0x3c37e: 0x6c0d3420, 0x3c37f: 0x6c0d3620, - // Block 0xf0e, offset 0x3c380 - 0x3c380: 0x6c0d3820, 0x3c381: 0x6c183420, 0x3c382: 0x6c183620, 0x3c383: 0x6c2b4420, - 0x3c384: 0x6c2b4620, 0x3c385: 0x6c2b4820, 0x3c386: 0x6c454820, 0x3c387: 0x6c454a20, - 0x3c388: 0x6c66a220, 0x3c389: 0x6c66a420, 0x3c38a: 0x6c8d3a20, 0x3c38b: 0x6c8d3c20, - 0x3c38c: 0x6c8d3e20, 0x3c38d: 0x6c8d4020, 0x3c38e: 0x6cb9a420, 0x3c38f: 0x6cb9a620, - 0x3c390: 0x6cb9a820, 0x3c391: 0x6cea8c20, 0x3c392: 0x6cea8e20, 0x3c393: 0x6cea9020, - 0x3c394: 0x6d48d820, 0x3c395: 0x6d76d620, 0x3c396: 0x6d76d820, 0x3c397: 0x6c187220, - 0x3c398: 0x6c187420, 0x3c399: 0x6c187620, 0x3c39a: 0x6c2b8220, 0x3c39b: 0x6c2b8420, - 0x3c39c: 0x6c458020, 0x3c39d: 0x6c66d820, 0x3c39e: 0x6c66da20, 0x3c39f: 0x6c66dc20, - 0x3c3a0: 0x6c8d6820, 0x3c3a1: 0x6cb9d020, 0x3c3a2: 0x6cb9d220, 0x3c3a3: 0x6ceabe20, - 0x3c3a4: 0x6d1aa420, 0x3c3a5: 0x6d1aa620, 0x3c3a6: 0x6d48f020, 0x3c3a7: 0x6e0c8220, - 0x3c3a8: 0x6c016620, 0x3c3a9: 0x6c0d6620, 0x3c3aa: 0x6c459e20, 0x3c3ab: 0x6cead020, - 0x3c3ac: 0x6c0d7820, 0x3c3ad: 0x6c18a020, 0x3c3ae: 0x6c18a220, 0x3c3af: 0x6c45be20, - 0x3c3b0: 0x6c670c20, 0x3c3b1: 0x6d1ac820, 0x3c3b2: 0x6df8c020, 0x3c3b3: 0x6c18bc20, - 0x3c3b4: 0x6c671e20, 0x3c3b5: 0x6c8da620, 0x3c3b6: 0x6ceaf420, 0x3c3b7: 0x6d1ad220, - 0x3c3b8: 0x6d490e20, 0x3c3b9: 0x6d491020, 0x3c3ba: 0x6da08220, 0x3c3bb: 0x6dc2de20, - 0x3c3bc: 0x6df8c420, 0x3c3bd: 0x6c037a20, 0x3c3be: 0x6c18ce20, 0x3c3bf: 0x6c672c20, - // Block 0xf0f, offset 0x3c3c0 - 0x3c3c0: 0x6d1ad820, 0x3c3c1: 0x6c2bfe20, 0x3c3c2: 0x6c45f420, 0x3c3c3: 0x6c070820, - 0x3c3c4: 0x6c190020, 0x3c3c5: 0x6c2c2420, 0x3c3c6: 0x6c2c2620, 0x3c3c7: 0x6c462420, - 0x3c3c8: 0x6c462620, 0x3c3c9: 0x6c462820, 0x3c3ca: 0x6c462a20, 0x3c3cb: 0x6c676420, - 0x3c3cc: 0x6c676620, 0x3c3cd: 0x6c676820, 0x3c3ce: 0x6c676a20, 0x3c3cf: 0x6c8dde20, - 0x3c3d0: 0x6c8de020, 0x3c3d1: 0x6cba2a20, 0x3c3d2: 0x6cba2c20, 0x3c3d3: 0x6ceb1a20, - 0x3c3d4: 0x6ceb1c20, 0x3c3d5: 0x6ceb1e20, 0x3c3d6: 0x6d1b1020, 0x3c3d7: 0x6d1b1220, - 0x3c3d8: 0x6d493620, 0x3c3d9: 0x6d493820, 0x3c3da: 0x6da08c20, 0x3c3db: 0x6df8c820, - 0x3c3dc: 0x6c463c20, 0x3c3dd: 0x6c677a20, 0x3c3de: 0x6c8dee20, 0x3c3df: 0x6cba4020, - 0x3c3e0: 0x6ceb3020, 0x3c3e1: 0x6d494220, 0x3c3e2: 0x6df8ca20, 0x3c3e3: 0x6c03b820, - 0x3c3e4: 0x6c03ba20, 0x3c3e5: 0x6c0e1a20, 0x3c3e6: 0x6c192020, 0x3c3e7: 0x6c2c5220, - 0x3c3e8: 0x6c2c5420, 0x3c3e9: 0x6c466020, 0x3c3ea: 0x6c466220, 0x3c3eb: 0x6c679620, - 0x3c3ec: 0x6c679820, 0x3c3ed: 0x6cba5820, 0x3c3ee: 0x6cba5a20, 0x3c3ef: 0x6ceb4c20, - 0x3c3f0: 0x6d1b3220, 0x3c3f1: 0x6d770a20, 0x3c3f2: 0x6c078620, 0x3c3f3: 0x6c1a4420, - 0x3c3f4: 0x6c1a4620, 0x3c3f5: 0x6c1a4820, 0x3c3f6: 0x6c2d7620, 0x3c3f7: 0x6c2d7820, - 0x3c3f8: 0x6c2d7a20, 0x3c3f9: 0x6c2d7c20, 0x3c3fa: 0x6c47c620, 0x3c3fb: 0x6c47c820, - 0x3c3fc: 0x6c47ca20, 0x3c3fd: 0x6c47cc20, 0x3c3fe: 0x6c47ce20, 0x3c3ff: 0x6c47d020, - // Block 0xf10, offset 0x3c400 - 0x3c400: 0x6c47d220, 0x3c401: 0x6c47d420, 0x3c402: 0x6c47d620, 0x3c403: 0x6c47d820, - 0x3c404: 0x6c693820, 0x3c405: 0x6c693a20, 0x3c406: 0x6c693c20, 0x3c407: 0x6c693e20, - 0x3c408: 0x6c694020, 0x3c409: 0x6c694220, 0x3c40a: 0x6c694420, 0x3c40b: 0x6c694620, - 0x3c40c: 0x6c694820, 0x3c40d: 0x6c694a20, 0x3c40e: 0x6c694c20, 0x3c40f: 0x6d770c20, - 0x3c410: 0x6c900020, 0x3c411: 0x6c900220, 0x3c412: 0x6c900420, 0x3c413: 0x6c900620, - 0x3c414: 0x6c900820, 0x3c415: 0x6c900a20, 0x3c416: 0x6c900c20, 0x3c417: 0x6c900e20, - 0x3c418: 0x6c901020, 0x3c419: 0x6c901220, 0x3c41a: 0x6c901420, 0x3c41b: 0x6c901620, - 0x3c41c: 0x6cbc2220, 0x3c41d: 0x6cbc2420, 0x3c41e: 0x6cbc2620, 0x3c41f: 0x6cbc2820, - 0x3c420: 0x6cbc2a20, 0x3c421: 0x6cbc2c20, 0x3c422: 0x6cbc2e20, 0x3c423: 0x6cbc3020, - 0x3c424: 0x6cbc3220, 0x3c425: 0x6cbc3420, 0x3c426: 0x6cbc3620, 0x3c427: 0x6cbc3820, - 0x3c428: 0x6cbc3a20, 0x3c429: 0x6cbc3c20, 0x3c42a: 0x6ced0c20, 0x3c42b: 0x6ced0e20, - 0x3c42c: 0x6ced1020, 0x3c42d: 0x6ced1220, 0x3c42e: 0x6ced1420, 0x3c42f: 0x6ced1620, - 0x3c430: 0x6ced1820, 0x3c431: 0x6ced1a20, 0x3c432: 0x6ced1c20, 0x3c433: 0x6ced1e20, - 0x3c434: 0x6ced2020, 0x3c435: 0x6ced2220, 0x3c436: 0x6ced2420, 0x3c437: 0x6ced2620, - 0x3c438: 0x6d1cd020, 0x3c439: 0x6d1cd220, 0x3c43a: 0x6d1cd420, 0x3c43b: 0x6d1cd620, - 0x3c43c: 0x6d1cd820, 0x3c43d: 0x6d1cda20, 0x3c43e: 0x6d1cdc20, 0x3c43f: 0x6d1cde20, - // Block 0xf11, offset 0x3c440 - 0x3c440: 0x6d1ce020, 0x3c441: 0x6d1ce220, 0x3c442: 0x6d1ce420, 0x3c443: 0x6d1ce620, - 0x3c444: 0x6d1ce820, 0x3c445: 0x6d4aa220, 0x3c446: 0x6d4aa420, 0x3c447: 0x6d4aa620, - 0x3c448: 0x6d4aa820, 0x3c449: 0x6d4aaa20, 0x3c44a: 0x6d4aac20, 0x3c44b: 0x6d4aae20, - 0x3c44c: 0x6d4ab020, 0x3c44d: 0x6d4ab220, 0x3c44e: 0x6d784a20, 0x3c44f: 0x6d784c20, - 0x3c450: 0x6d784e20, 0x3c451: 0x6d785020, 0x3c452: 0x6d785220, 0x3c453: 0x6d785420, - 0x3c454: 0x6d785620, 0x3c455: 0x6da17420, 0x3c456: 0x6da17620, 0x3c457: 0x6da17820, - 0x3c458: 0x6da17a20, 0x3c459: 0x6dc3ce20, 0x3c45a: 0x6dc3d020, 0x3c45b: 0x6dc3d220, - 0x3c45c: 0x6dc3d420, 0x3c45d: 0x6dc3d620, 0x3c45e: 0x6dc3d820, 0x3c45f: 0x6de0f820, - 0x3c460: 0x6de0fa20, 0x3c461: 0x6de0fc20, 0x3c462: 0x6df92220, 0x3c463: 0x6df92420, - 0x3c464: 0x6df92620, 0x3c465: 0x6e1c7020, 0x3c466: 0x6e31be20, 0x3c467: 0x6e31c020, - 0x3c468: 0x6c1a9620, 0x3c469: 0x6c2da820, 0x3c46a: 0x6c47fe20, 0x3c46b: 0x6c697c20, - 0x3c46c: 0x6c904220, 0x3c46d: 0x6c904420, 0x3c46e: 0x6ced4820, 0x3c46f: 0x6d1d1420, - 0x3c470: 0x6d786420, 0x3c471: 0x6c07c020, 0x3c472: 0x6c07c220, 0x3c473: 0x6c0f0420, - 0x3c474: 0x6c0f0620, 0x3c475: 0x6c0f0820, 0x3c476: 0x6c0f0a20, 0x3c477: 0x6c0f0c20, - 0x3c478: 0x6c1b5020, 0x3c479: 0x6c1b5220, 0x3c47a: 0x6c1b5420, 0x3c47b: 0x6c1b5620, - 0x3c47c: 0x6c1b5820, 0x3c47d: 0x6c1b5a20, 0x3c47e: 0x6c1b5c20, 0x3c47f: 0x6c1b5e20, - // Block 0xf12, offset 0x3c480 - 0x3c480: 0x6c1b6020, 0x3c481: 0x6c1b6220, 0x3c482: 0x6c1b6420, 0x3c483: 0x6c2e6e20, - 0x3c484: 0x6c2e7020, 0x3c485: 0x6c2e7220, 0x3c486: 0x6c2e7420, 0x3c487: 0x6c2e7620, - 0x3c488: 0x6c2e7820, 0x3c489: 0x6c2e7a20, 0x3c48a: 0x6c2e7c20, 0x3c48b: 0x6c48d420, - 0x3c48c: 0x6c48d620, 0x3c48d: 0x6c48d820, 0x3c48e: 0x6c48da20, 0x3c48f: 0x6c48dc20, - 0x3c490: 0x6c48de20, 0x3c491: 0x6c48e020, 0x3c492: 0x6c48e220, 0x3c493: 0x6c48e420, - 0x3c494: 0x6c6a4e20, 0x3c495: 0x6c6a5020, 0x3c496: 0x6c6a5220, 0x3c497: 0x6c6a5420, - 0x3c498: 0x6c6a5620, 0x3c499: 0x6c6a5820, 0x3c49a: 0x6c6a5a20, 0x3c49b: 0x6c6a5c20, - 0x3c49c: 0x6c6a5e20, 0x3c49d: 0x6c6a6020, 0x3c49e: 0x6c6a6220, 0x3c49f: 0x6c6a6420, - 0x3c4a0: 0x6c6a6620, 0x3c4a1: 0x6c6a6820, 0x3c4a2: 0x6c6a6a20, 0x3c4a3: 0x6c6a6c20, - 0x3c4a4: 0x6c914220, 0x3c4a5: 0x6c914420, 0x3c4a6: 0x6c914620, 0x3c4a7: 0x6c914820, - 0x3c4a8: 0x6c914a20, 0x3c4a9: 0x6c914c20, 0x3c4aa: 0x6c914e20, 0x3c4ab: 0x6c915020, - 0x3c4ac: 0x6c915220, 0x3c4ad: 0x6c915420, 0x3c4ae: 0x6c915620, 0x3c4af: 0x6c915820, - 0x3c4b0: 0x6c915a20, 0x3c4b1: 0x6c915c20, 0x3c4b2: 0x6cbd6c20, 0x3c4b3: 0x6cbd6e20, - 0x3c4b4: 0x6cbd7020, 0x3c4b5: 0x6cbd7220, 0x3c4b6: 0x6cbd7420, 0x3c4b7: 0x6cbd7620, - 0x3c4b8: 0x6cbd7820, 0x3c4b9: 0x6cbd7a20, 0x3c4ba: 0x6cbd7c20, 0x3c4bb: 0x6cbd7e20, - 0x3c4bc: 0x6cbd8020, 0x3c4bd: 0x6cbd8220, 0x3c4be: 0x6cee2e20, 0x3c4bf: 0x6cee3020, - // Block 0xf13, offset 0x3c4c0 - 0x3c4c0: 0x6cee3220, 0x3c4c1: 0x6cee3420, 0x3c4c2: 0x6cee3620, 0x3c4c3: 0x6cee3820, - 0x3c4c4: 0x6cee3a20, 0x3c4c5: 0x6cee3c20, 0x3c4c6: 0x6cee3e20, 0x3c4c7: 0x6cee4020, - 0x3c4c8: 0x6cee4220, 0x3c4c9: 0x6cee4420, 0x3c4ca: 0x6cee4620, 0x3c4cb: 0x6cee4820, - 0x3c4cc: 0x6cee4a20, 0x3c4cd: 0x6cee4c20, 0x3c4ce: 0x6d1dda20, 0x3c4cf: 0x6d1ddc20, - 0x3c4d0: 0x6d1dde20, 0x3c4d1: 0x6d1de020, 0x3c4d2: 0x6d1de220, 0x3c4d3: 0x6d1de420, - 0x3c4d4: 0x6d1de620, 0x3c4d5: 0x6d1de820, 0x3c4d6: 0x6d1dea20, 0x3c4d7: 0x6d1dec20, - 0x3c4d8: 0x6d1dee20, 0x3c4d9: 0x6d4b9420, 0x3c4da: 0x6d4b9620, 0x3c4db: 0x6d4b9820, - 0x3c4dc: 0x6d4b9a20, 0x3c4dd: 0x6d4b9c20, 0x3c4de: 0x6d4b9e20, 0x3c4df: 0x6d78f020, - 0x3c4e0: 0x6d78f220, 0x3c4e1: 0x6d78f420, 0x3c4e2: 0x6d78f620, 0x3c4e3: 0x6d78f820, - 0x3c4e4: 0x6d78fa20, 0x3c4e5: 0x6d78fc20, 0x3c4e6: 0x6da1f420, 0x3c4e7: 0x6da1f620, - 0x3c4e8: 0x6da1f820, 0x3c4e9: 0x6da1fa20, 0x3c4ea: 0x6da1fc20, 0x3c4eb: 0x6da1fe20, - 0x3c4ec: 0x6dc42820, 0x3c4ed: 0x6dc42a20, 0x3c4ee: 0x6dc42c20, 0x3c4ef: 0x6dc42e20, - 0x3c4f0: 0x6de14220, 0x3c4f1: 0x6df95020, 0x3c4f2: 0x6c6a8020, 0x3c4f3: 0x6cee5a20, - 0x3c4f4: 0x6e1c8e20, 0x3c4f5: 0x6df95420, 0x3c4f6: 0x6cee6820, 0x3c4f7: 0x6c0f2820, - 0x3c4f8: 0x6c2e9820, 0x3c4f9: 0x6c490020, 0x3c4fa: 0x6c6aa820, 0x3c4fb: 0x6c919620, - 0x3c4fc: 0x6cbdb420, 0x3c4fd: 0x6d1e2c20, 0x3c4fe: 0x6d4bb620, 0x3c4ff: 0x6d791a20, - // Block 0xf14, offset 0x3c500 - 0x3c500: 0x6e1c9020, 0x3c501: 0x6c03ee20, 0x3c502: 0x6c07fa20, 0x3c503: 0x6c0f5420, - 0x3c504: 0x6c1bbe20, 0x3c505: 0x6c1bc020, 0x3c506: 0x6c1bc220, 0x3c507: 0x6c2ee620, - 0x3c508: 0x6c2ee820, 0x3c509: 0x6c2eea20, 0x3c50a: 0x6c2eec20, 0x3c50b: 0x6c2eee20, - 0x3c50c: 0x6c2ef020, 0x3c50d: 0x6c493620, 0x3c50e: 0x6c493820, 0x3c50f: 0x6c493a20, - 0x3c510: 0x6c6ae220, 0x3c511: 0x6c6ae420, 0x3c512: 0x6c6ae620, 0x3c513: 0x6c91cc20, - 0x3c514: 0x6c91ce20, 0x3c515: 0x6c91d020, 0x3c516: 0x6cbdec20, 0x3c517: 0x6cbdee20, - 0x3c518: 0x6cbdf020, 0x3c519: 0x6ceea020, 0x3c51a: 0x6ceea220, 0x3c51b: 0x6ceea420, - 0x3c51c: 0x6d1e4c20, 0x3c51d: 0x6d1e4e20, 0x3c51e: 0x6d1e5020, 0x3c51f: 0x6d4bd820, - 0x3c520: 0x6d4bda20, 0x3c521: 0x6d4bdc20, 0x3c522: 0x6dc45220, 0x3c523: 0x6df95a20, - 0x3c524: 0x6c0fa220, 0x3c525: 0x6c0fa420, 0x3c526: 0x6c1c5220, 0x3c527: 0x6c1c5420, - 0x3c528: 0x6c1c5620, 0x3c529: 0x6c1c5820, 0x3c52a: 0x6c1c5a20, 0x3c52b: 0x6c1c5c20, - 0x3c52c: 0x6c1c5e20, 0x3c52d: 0x6c2fc020, 0x3c52e: 0x6c2fc220, 0x3c52f: 0x6c2fc420, - 0x3c530: 0x6c2fc620, 0x3c531: 0x6c4a0c20, 0x3c532: 0x6c4a0e20, 0x3c533: 0x6c4a1020, - 0x3c534: 0x6c4a1220, 0x3c535: 0x6c4a1420, 0x3c536: 0x6c6bcc20, 0x3c537: 0x6c6bce20, - 0x3c538: 0x6c6bd020, 0x3c539: 0x6c6bd220, 0x3c53a: 0x6c6bd420, 0x3c53b: 0x6c92ec20, - 0x3c53c: 0x6c92ee20, 0x3c53d: 0x6c92f020, 0x3c53e: 0x6c92f220, 0x3c53f: 0x6c92f420, - // Block 0xf15, offset 0x3c540 - 0x3c540: 0x6c92f620, 0x3c541: 0x6c92f820, 0x3c542: 0x6c92fa20, 0x3c543: 0x6c92fc20, - 0x3c544: 0x6c92fe20, 0x3c545: 0x6c930020, 0x3c546: 0x6cbf2a20, 0x3c547: 0x6cbf2c20, - 0x3c548: 0x6cbf2e20, 0x3c549: 0x6cbf3020, 0x3c54a: 0x6cbf3220, 0x3c54b: 0x6cbf3420, - 0x3c54c: 0x6cbf3620, 0x3c54d: 0x6cbf3820, 0x3c54e: 0x6cbf3a20, 0x3c54f: 0x6cbf3c20, - 0x3c550: 0x6cbf3e20, 0x3c551: 0x6cef6c20, 0x3c552: 0x6cef6e20, 0x3c553: 0x6cef7020, - 0x3c554: 0x6cef7220, 0x3c555: 0x6cef7420, 0x3c556: 0x6cef7620, 0x3c557: 0x6d1f1420, - 0x3c558: 0x6d1f1620, 0x3c559: 0x6d1f1820, 0x3c55a: 0x6d1f1a20, 0x3c55b: 0x6d1f1c20, - 0x3c55c: 0x6d1f1e20, 0x3c55d: 0x6d1f2020, 0x3c55e: 0x6d1f2220, 0x3c55f: 0x6d1f2420, - 0x3c560: 0x6d4ca820, 0x3c561: 0x6d4caa20, 0x3c562: 0x6d4cac20, 0x3c563: 0x6d4cae20, - 0x3c564: 0x6d4cb020, 0x3c565: 0x6d4cb220, 0x3c566: 0x6d79d420, 0x3c567: 0x6d79d620, - 0x3c568: 0x6d79d820, 0x3c569: 0x6d79da20, 0x3c56a: 0x6d79dc20, 0x3c56b: 0x6da29420, - 0x3c56c: 0x6dc48620, 0x3c56d: 0x6dc48820, 0x3c56e: 0x6dc48a20, 0x3c56f: 0x6dc48c20, - 0x3c570: 0x6de18c20, 0x3c571: 0x6de18e20, 0x3c572: 0x6df98420, 0x3c573: 0x6e0d4020, - 0x3c574: 0x6e0d4220, 0x3c575: 0x6e28ae20, 0x3c576: 0x6c1c7e20, 0x3c577: 0x6c1c8020, - 0x3c578: 0x6c1c8220, 0x3c579: 0x6c1c8420, 0x3c57a: 0x6c2ff820, 0x3c57b: 0x6c4a3e20, - 0x3c57c: 0x6c931c20, 0x3c57d: 0x6c931e20, 0x3c57e: 0x6c932020, 0x3c57f: 0x6cbf6020, - // Block 0xf16, offset 0x3c580 - 0x3c580: 0x6d1f3a20, 0x3c581: 0x6d79fc20, 0x3c582: 0x6da29c20, 0x3c583: 0x6da29e20, - 0x3c584: 0x6e0d4420, 0x3c585: 0x6c1cb620, 0x3c586: 0x6c1cb820, 0x3c587: 0x6c1cba20, - 0x3c588: 0x6c304020, 0x3c589: 0x6c304220, 0x3c58a: 0x6c4a8820, 0x3c58b: 0x6c4a8a20, - 0x3c58c: 0x6c4a8c20, 0x3c58d: 0x6c6c6a20, 0x3c58e: 0x6c6c6c20, 0x3c58f: 0x6c6c6e20, - 0x3c590: 0x6c6c7020, 0x3c591: 0x6c937c20, 0x3c592: 0x6c937e20, 0x3c593: 0x6c938020, - 0x3c594: 0x6cbfc620, 0x3c595: 0x6cbfc820, 0x3c596: 0x6cbfca20, 0x3c597: 0x6cbfcc20, - 0x3c598: 0x6cbfce20, 0x3c599: 0x6cbfd020, 0x3c59a: 0x6cbfd220, 0x3c59b: 0x6cefec20, - 0x3c59c: 0x6cefee20, 0x3c59d: 0x6ceff020, 0x3c59e: 0x6ceff220, 0x3c59f: 0x6ceff420, - 0x3c5a0: 0x6ceff620, 0x3c5a1: 0x6d1fa020, 0x3c5a2: 0x6d1fa220, 0x3c5a3: 0x6d1fa420, - 0x3c5a4: 0x6d1fa620, 0x3c5a5: 0x6d1fa820, 0x3c5a6: 0x6d4d1620, 0x3c5a7: 0x6d4d1820, - 0x3c5a8: 0x6d4d1a20, 0x3c5a9: 0x6d4d1c20, 0x3c5aa: 0x6d4d1e20, 0x3c5ab: 0x6d7a2820, - 0x3c5ac: 0x6d7a2a20, 0x3c5ad: 0x6d7a2c20, 0x3c5ae: 0x6d7a2e20, 0x3c5af: 0x6da2be20, - 0x3c5b0: 0x6dc4b220, 0x3c5b1: 0x6dc4b420, 0x3c5b2: 0x6dc4b620, 0x3c5b3: 0x6df9a220, - 0x3c5b4: 0x6df9a420, 0x3c5b5: 0x6e0d5a20, 0x3c5b6: 0x6e31ee20, 0x3c5b7: 0x6c0fea20, - 0x3c5b8: 0x6c939220, 0x3c5b9: 0x6c939420, 0x3c5ba: 0x6cbfe820, 0x3c5bb: 0x6d4d3420, - 0x3c5bc: 0x6d4d3620, 0x3c5bd: 0x6d7a3620, 0x3c5be: 0x6da2c620, 0x3c5bf: 0x6c1cd420, - // Block 0xf17, offset 0x3c5c0 - 0x3c5c0: 0x6c306820, 0x3c5c1: 0x6c6c9020, 0x3c5c2: 0x6c6c9220, 0x3c5c3: 0x6d1fce20, - 0x3c5c4: 0x6d4d4e20, 0x3c5c5: 0x6d7a4020, 0x3c5c6: 0x6da2d020, 0x3c5c7: 0x6cc01e20, - 0x3c5c8: 0x6cf02c20, 0x3c5c9: 0x6c1d1820, 0x3c5ca: 0x6c1d1a20, 0x3c5cb: 0x6c1d1c20, - 0x3c5cc: 0x6c30b020, 0x3c5cd: 0x6c4b0e20, 0x3c5ce: 0x6c4b1020, 0x3c5cf: 0x6c6cf020, - 0x3c5d0: 0x6c6cf220, 0x3c5d1: 0x6c940e20, 0x3c5d2: 0x6cf05e20, 0x3c5d3: 0x6cf06020, - 0x3c5d4: 0x6cf06220, 0x3c5d5: 0x6cc05a20, 0x3c5d6: 0x6cc05c20, 0x3c5d7: 0x6cc05e20, - 0x3c5d8: 0x6cc06020, 0x3c5d9: 0x6d1ffc20, 0x3c5da: 0x6d1ffe20, 0x3c5db: 0x6d4d8820, - 0x3c5dc: 0x6d4d8a20, 0x3c5dd: 0x6d7a5e20, 0x3c5de: 0x6da2e020, 0x3c5df: 0x6de1cc20, - 0x3c5e0: 0x6de1ce20, 0x3c5e1: 0x6e1cd220, 0x3c5e2: 0x6c108820, 0x3c5e3: 0x6c108a20, - 0x3c5e4: 0x6c108c20, 0x3c5e5: 0x6c108e20, 0x3c5e6: 0x6c1dcc20, 0x3c5e7: 0x6c1dce20, - 0x3c5e8: 0x6c1dd020, 0x3c5e9: 0x6c316e20, 0x3c5ea: 0x6c317020, 0x3c5eb: 0x6c317220, - 0x3c5ec: 0x6c317420, 0x3c5ed: 0x6c317620, 0x3c5ee: 0x6c317820, 0x3c5ef: 0x6c4bbe20, - 0x3c5f0: 0x6c4bc020, 0x3c5f1: 0x6c4bc220, 0x3c5f2: 0x6c4bc420, 0x3c5f3: 0x6c4bc620, - 0x3c5f4: 0x6c4bc820, 0x3c5f5: 0x6c6dd420, 0x3c5f6: 0x6c6dd620, 0x3c5f7: 0x6c6dd820, - 0x3c5f8: 0x6c6dda20, 0x3c5f9: 0x6c6ddc20, 0x3c5fa: 0x6c6dde20, 0x3c5fb: 0x6c953c20, - 0x3c5fc: 0x6c953e20, 0x3c5fd: 0x6c954020, 0x3c5fe: 0x6c954220, 0x3c5ff: 0x6c954420, - // Block 0xf18, offset 0x3c600 - 0x3c600: 0x6c954620, 0x3c601: 0x6c954820, 0x3c602: 0x6cc15e20, 0x3c603: 0x6cc16020, - 0x3c604: 0x6cc16220, 0x3c605: 0x6cc16420, 0x3c606: 0x6cc16620, 0x3c607: 0x6cc16820, - 0x3c608: 0x6cf10820, 0x3c609: 0x6cf10a20, 0x3c60a: 0x6cf10c20, 0x3c60b: 0x6cf10e20, - 0x3c60c: 0x6d20ac20, 0x3c60d: 0x6d20ae20, 0x3c60e: 0x6d20b020, 0x3c60f: 0x6d20b220, - 0x3c610: 0x6d20b420, 0x3c611: 0x6d20b620, 0x3c612: 0x6d20b820, 0x3c613: 0x6d4e4020, - 0x3c614: 0x6d4e4220, 0x3c615: 0x6d4e4420, 0x3c616: 0x6d4e4620, 0x3c617: 0x6d7acc20, - 0x3c618: 0x6d7ace20, 0x3c619: 0x6d7ad020, 0x3c61a: 0x6d7ad220, 0x3c61b: 0x6da34c20, - 0x3c61c: 0x6da34e20, 0x3c61d: 0x6da35020, 0x3c61e: 0x6de20a20, 0x3c61f: 0x6e0d9020, - 0x3c620: 0x6e1cfc20, 0x3c621: 0x6c1ddc20, 0x3c622: 0x6c4bd820, 0x3c623: 0x6c10aa20, - 0x3c624: 0x6c955620, 0x3c625: 0x6cc17620, 0x3c626: 0x6cf11620, 0x3c627: 0x6d20bc20, - 0x3c628: 0x6da35820, 0x3c629: 0x6dc50c20, 0x3c62a: 0x6e1d0220, 0x3c62b: 0x6c319020, - 0x3c62c: 0x6c1de820, 0x3c62d: 0x6cc18420, 0x3c62e: 0x6cc18620, 0x3c62f: 0x6d20be20, - 0x3c630: 0x6d7ae420, 0x3c631: 0x6d7ae620, 0x3c632: 0x6c08b820, 0x3c633: 0x6c6e4c20, - 0x3c634: 0x6c95c220, 0x3c635: 0x6c95c420, 0x3c636: 0x6c95c620, 0x3c637: 0x6c95c820, - 0x3c638: 0x6cc1ec20, 0x3c639: 0x6cc1ee20, 0x3c63a: 0x6cc1f020, 0x3c63b: 0x6d210420, - 0x3c63c: 0x6d4ea620, 0x3c63d: 0x6d7b1820, 0x3c63e: 0x6da37a20, 0x3c63f: 0x6de22a20, - // Block 0xf19, offset 0x3c640 - 0x3c640: 0x6df9e820, 0x3c641: 0x6c1e3820, 0x3c642: 0x6c95ce20, 0x3c643: 0x6c95d020, - 0x3c644: 0x6cc1fa20, 0x3c645: 0x6cf16220, 0x3c646: 0x6cf16420, 0x3c647: 0x6d4eac20, - 0x3c648: 0x6dc51e20, 0x3c649: 0x6de22e20, 0x3c64a: 0x6c10e220, 0x3c64b: 0x6c4c6420, - 0x3c64c: 0x6c1e8020, 0x3c64d: 0x6c1e8220, 0x3c64e: 0x6c323e20, 0x3c64f: 0x6c324020, - 0x3c650: 0x6c4ca820, 0x3c651: 0x6c4caa20, 0x3c652: 0x6c6eae20, 0x3c653: 0x6c6eb020, - 0x3c654: 0x6c6eb220, 0x3c655: 0x6c6eb420, 0x3c656: 0x6c6eb620, 0x3c657: 0x6c6eb820, - 0x3c658: 0x6c964820, 0x3c659: 0x6c964a20, 0x3c65a: 0x6cc26020, 0x3c65b: 0x6cc26220, - 0x3c65c: 0x6cf1a820, 0x3c65d: 0x6cf1aa20, 0x3c65e: 0x6d216620, 0x3c65f: 0x6d216820, - 0x3c660: 0x6d216a20, 0x3c661: 0x6d4efa20, 0x3c662: 0x6d4efc20, 0x3c663: 0x6d4efe20, - 0x3c664: 0x6d7b5820, 0x3c665: 0x6d7b5a20, 0x3c666: 0x6da39a20, 0x3c667: 0x6da39c20, - 0x3c668: 0x6da39e20, 0x3c669: 0x6dc53c20, 0x3c66a: 0x6de25420, 0x3c66b: 0x6e0da820, - 0x3c66c: 0x6c08d820, 0x3c66d: 0x6c1e8c20, 0x3c66e: 0x6c1e8e20, 0x3c66f: 0x6c4cc020, - 0x3c670: 0x6c6ec020, 0x3c671: 0x6c965820, 0x3c672: 0x6d217220, 0x3c673: 0x6c1ea420, - 0x3c674: 0x6c325a20, 0x3c675: 0x6c6ed220, 0x3c676: 0x6cc27820, 0x3c677: 0x6cf1b620, - 0x3c678: 0x6da3a620, 0x3c679: 0x6e1d2020, 0x3c67a: 0x6c114820, 0x3c67b: 0x6c329820, - 0x3c67c: 0x6c4d2620, 0x3c67d: 0x6c4d2820, 0x3c67e: 0x6c6ef820, 0x3c67f: 0x6c969e20, - // Block 0xf1a, offset 0x3c680 - 0x3c680: 0x6cc2a220, 0x3c681: 0x6cc2a420, 0x3c682: 0x6d21a420, 0x3c683: 0x6da3b820, - 0x3c684: 0x6e0db620, 0x3c685: 0x6e388420, 0x3c686: 0x6c115420, 0x3c687: 0x6dc55a20, - 0x3c688: 0x6c6f1020, 0x3c689: 0x6d4f3420, 0x3c68a: 0x6da3be20, 0x3c68b: 0x6c1f1a20, - 0x3c68c: 0x6c32de20, 0x3c68d: 0x6c6f5220, 0x3c68e: 0x6c6f5420, 0x3c68f: 0x6c972a20, - 0x3c690: 0x6c972c20, 0x3c691: 0x6cc2fe20, 0x3c692: 0x6cc30020, 0x3c693: 0x6cc30220, - 0x3c694: 0x6cf23e20, 0x3c695: 0x6cf24020, 0x3c696: 0x6d21fc20, 0x3c697: 0x6d21fe20, - 0x3c698: 0x6d220020, 0x3c699: 0x6d7bb020, 0x3c69a: 0x6da3d220, 0x3c69b: 0x6dc57020, - 0x3c69c: 0x6dc57220, 0x3c69d: 0x6c091e20, 0x3c69e: 0x6c11b820, 0x3c69f: 0x6c1fec20, - 0x3c6a0: 0x6c1fee20, 0x3c6a1: 0x6c1ff020, 0x3c6a2: 0x6c1ff220, 0x3c6a3: 0x6c1ff420, - 0x3c6a4: 0x6c1ff620, 0x3c6a5: 0x6c1ff820, 0x3c6a6: 0x6c33ce20, 0x3c6a7: 0x6c33d020, - 0x3c6a8: 0x6c33d220, 0x3c6a9: 0x6c33d420, 0x3c6aa: 0x6c33d620, 0x3c6ab: 0x6c33d820, - 0x3c6ac: 0x6c33da20, 0x3c6ad: 0x6c4e8e20, 0x3c6ae: 0x6c4e9020, 0x3c6af: 0x6c4e9220, - 0x3c6b0: 0x6c4e9420, 0x3c6b1: 0x6c4e9620, 0x3c6b2: 0x6c4e9820, 0x3c6b3: 0x6c4e9a20, - 0x3c6b4: 0x6c4e9c20, 0x3c6b5: 0x6c708220, 0x3c6b6: 0x6c708420, 0x3c6b7: 0x6c708620, - 0x3c6b8: 0x6c708820, 0x3c6b9: 0x6c708a20, 0x3c6ba: 0x6c708c20, 0x3c6bb: 0x6c708e20, - 0x3c6bc: 0x6c709020, 0x3c6bd: 0x6c709220, 0x3c6be: 0x6c709420, 0x3c6bf: 0x6c98a620, - // Block 0xf1b, offset 0x3c6c0 - 0x3c6c0: 0x6c98a820, 0x3c6c1: 0x6c98aa20, 0x3c6c2: 0x6c98ac20, 0x3c6c3: 0x6c98ae20, - 0x3c6c4: 0x6c98b020, 0x3c6c5: 0x6c98b220, 0x3c6c6: 0x6c98b420, 0x3c6c7: 0x6cc47620, - 0x3c6c8: 0x6cc47820, 0x3c6c9: 0x6cc47a20, 0x3c6ca: 0x6cc47c20, 0x3c6cb: 0x6cc47e20, - 0x3c6cc: 0x6cc48020, 0x3c6cd: 0x6cc48220, 0x3c6ce: 0x6cc48420, 0x3c6cf: 0x6cc48620, - 0x3c6d0: 0x6cc48820, 0x3c6d1: 0x6cc48a20, 0x3c6d2: 0x6cc48c20, 0x3c6d3: 0x6cf35c20, - 0x3c6d4: 0x6cf35e20, 0x3c6d5: 0x6cf36020, 0x3c6d6: 0x6cf36220, 0x3c6d7: 0x6cf36420, - 0x3c6d8: 0x6cf36620, 0x3c6d9: 0x6cf36820, 0x3c6da: 0x6cf36a20, 0x3c6db: 0x6cf36c20, - 0x3c6dc: 0x6cf36e20, 0x3c6dd: 0x6cf37020, 0x3c6de: 0x6cf37220, 0x3c6df: 0x6d232020, - 0x3c6e0: 0x6d232220, 0x3c6e1: 0x6d232420, 0x3c6e2: 0x6d232620, 0x3c6e3: 0x6d232820, - 0x3c6e4: 0x6d232a20, 0x3c6e5: 0x6d232c20, 0x3c6e6: 0x6d232e20, 0x3c6e7: 0x6d233020, - 0x3c6e8: 0x6d50b220, 0x3c6e9: 0x6d50b420, 0x3c6ea: 0x6d50b620, 0x3c6eb: 0x6d50b820, - 0x3c6ec: 0x6d50ba20, 0x3c6ed: 0x6d50bc20, 0x3c6ee: 0x6d7c7c20, 0x3c6ef: 0x6d7c7e20, - 0x3c6f0: 0x6d7c8020, 0x3c6f1: 0x6d7c8220, 0x3c6f2: 0x6d7c8420, 0x3c6f3: 0x6d7c8620, - 0x3c6f4: 0x6d7c8820, 0x3c6f5: 0x6d7c8a20, 0x3c6f6: 0x6d7c8c20, 0x3c6f7: 0x6da46220, - 0x3c6f8: 0x6da46420, 0x3c6f9: 0x6da46620, 0x3c6fa: 0x6dc5f620, 0x3c6fb: 0x6dc5f820, - 0x3c6fc: 0x6dc5fa20, 0x3c6fd: 0x6dc5fc20, 0x3c6fe: 0x6dc5fe20, 0x3c6ff: 0x6de2da20, - // Block 0xf1c, offset 0x3c700 - 0x3c700: 0x6de2dc20, 0x3c701: 0x6dfa5220, 0x3c702: 0x6dfa5420, 0x3c703: 0x6e0de220, - 0x3c704: 0x6e0de420, 0x3c705: 0x6e1d4e20, 0x3c706: 0x6e1d5020, 0x3c707: 0x6e28f020, - 0x3c708: 0x6e388e20, 0x3c709: 0x6c092a20, 0x3c70a: 0x6c11cc20, 0x3c70b: 0x6c4ec420, - 0x3c70c: 0x6c4ec620, 0x3c70d: 0x6c70ae20, 0x3c70e: 0x6c70b020, 0x3c70f: 0x6c98d220, - 0x3c710: 0x6c98d420, 0x3c711: 0x6cc4ac20, 0x3c712: 0x6cf3a020, 0x3c713: 0x6d236020, - 0x3c714: 0x6d7caa20, 0x3c715: 0x6d7cac20, 0x3c716: 0x6d7cae20, 0x3c717: 0x6e3d2c20, - 0x3c718: 0x6c4ef020, 0x3c719: 0x6c98e020, 0x3c71a: 0x6d50fa20, 0x3c71b: 0x6e1d5420, - 0x3c71c: 0x6c123220, 0x3c71d: 0x6c210a20, 0x3c71e: 0x6c210c20, 0x3c71f: 0x6c210e20, - 0x3c720: 0x6c211020, 0x3c721: 0x6c211220, 0x3c722: 0x6c211420, 0x3c723: 0x6c211620, - 0x3c724: 0x6c351e20, 0x3c725: 0x6c352020, 0x3c726: 0x6c352220, 0x3c727: 0x6c352420, - 0x3c728: 0x6c352620, 0x3c729: 0x6c352820, 0x3c72a: 0x6c352a20, 0x3c72b: 0x6c501620, - 0x3c72c: 0x6c501820, 0x3c72d: 0x6c501a20, 0x3c72e: 0x6c501c20, 0x3c72f: 0x6c501e20, - 0x3c730: 0x6c502020, 0x3c731: 0x6c502220, 0x3c732: 0x6c502420, 0x3c733: 0x6c502620, - 0x3c734: 0x6c720620, 0x3c735: 0x6c720820, 0x3c736: 0x6c720a20, 0x3c737: 0x6c720c20, - 0x3c738: 0x6c720e20, 0x3c739: 0x6c721020, 0x3c73a: 0x6c721220, 0x3c73b: 0x6c721420, - 0x3c73c: 0x6c721620, 0x3c73d: 0x6c721820, 0x3c73e: 0x6c721a20, 0x3c73f: 0x6c721c20, - // Block 0xf1d, offset 0x3c740 - 0x3c740: 0x6c721e20, 0x3c741: 0x6c9a7c20, 0x3c742: 0x6c9a7e20, 0x3c743: 0x6c9a8020, - 0x3c744: 0x6c9a8220, 0x3c745: 0x6c9a8420, 0x3c746: 0x6c9a8620, 0x3c747: 0x6c9a8820, - 0x3c748: 0x6c9a8a20, 0x3c749: 0x6c9a8c20, 0x3c74a: 0x6c9a8e20, 0x3c74b: 0x6c9a9020, - 0x3c74c: 0x6cc65420, 0x3c74d: 0x6cc65620, 0x3c74e: 0x6cc65820, 0x3c74f: 0x6cc65a20, - 0x3c750: 0x6cc65c20, 0x3c751: 0x6cc65e20, 0x3c752: 0x6cc66020, 0x3c753: 0x6cc66220, - 0x3c754: 0x6cc66420, 0x3c755: 0x6cc66620, 0x3c756: 0x6cc66820, 0x3c757: 0x6cf50220, - 0x3c758: 0x6cf50420, 0x3c759: 0x6cf50620, 0x3c75a: 0x6cf50820, 0x3c75b: 0x6cf50a20, - 0x3c75c: 0x6cf50c20, 0x3c75d: 0x6cf50e20, 0x3c75e: 0x6cf51020, 0x3c75f: 0x6cf51220, - 0x3c760: 0x6cf51420, 0x3c761: 0x6cf51620, 0x3c762: 0x6cf51820, 0x3c763: 0x6d24d420, - 0x3c764: 0x6d24d620, 0x3c765: 0x6d24d820, 0x3c766: 0x6d24da20, 0x3c767: 0x6d24dc20, - 0x3c768: 0x6d24de20, 0x3c769: 0x6d24e020, 0x3c76a: 0x6d24e220, 0x3c76b: 0x6d525620, - 0x3c76c: 0x6d525820, 0x3c76d: 0x6d525a20, 0x3c76e: 0x6d525c20, 0x3c76f: 0x6d525e20, - 0x3c770: 0x6d526020, 0x3c771: 0x6d526220, 0x3c772: 0x6d526420, 0x3c773: 0x6d526620, - 0x3c774: 0x6d526820, 0x3c775: 0x6d7d9820, 0x3c776: 0x6d7d9a20, 0x3c777: 0x6d7d9c20, - 0x3c778: 0x6da50420, 0x3c779: 0x6da50620, 0x3c77a: 0x6da50820, 0x3c77b: 0x6dc6a820, - 0x3c77c: 0x6dc6aa20, 0x3c77d: 0x6dc6ac20, 0x3c77e: 0x6dc6ae20, 0x3c77f: 0x6dc6b020, - // Block 0xf1e, offset 0x3c780 - 0x3c780: 0x6dc6b220, 0x3c781: 0x6de35820, 0x3c782: 0x6dfaae20, 0x3c783: 0x6e1d8e20, - 0x3c784: 0x6e291820, 0x3c785: 0x6c9a9e20, 0x3c786: 0x6c353e20, 0x3c787: 0x6d527020, - 0x3c788: 0x6c357420, 0x3c789: 0x6c506c20, 0x3c78a: 0x6c506e20, 0x3c78b: 0x6c728820, - 0x3c78c: 0x6c728a20, 0x3c78d: 0x6c9b1020, 0x3c78e: 0x6cc6fe20, 0x3c78f: 0x6cc70020, - 0x3c790: 0x6cf58a20, 0x3c791: 0x6d253e20, 0x3c792: 0x6d254020, 0x3c793: 0x6d52b620, - 0x3c794: 0x6d52b820, 0x3c795: 0x6d52ba20, 0x3c796: 0x6d52bc20, 0x3c797: 0x6d7dfe20, - 0x3c798: 0x6d7e0020, 0x3c799: 0x6d7e0220, 0x3c79a: 0x6da53c20, 0x3c79b: 0x6dc6d420, - 0x3c79c: 0x6dc6d620, 0x3c79d: 0x6e0e3820, 0x3c79e: 0x6e0e3a20, 0x3c79f: 0x6e324620, - 0x3c7a0: 0x6c214020, 0x3c7a1: 0x6c357e20, 0x3c7a2: 0x6c358020, 0x3c7a3: 0x6c507820, - 0x3c7a4: 0x6c729820, 0x3c7a5: 0x6cc70e20, 0x3c7a6: 0x6cc71020, 0x3c7a7: 0x6cc71220, - 0x3c7a8: 0x6d254220, 0x3c7a9: 0x6d254420, 0x3c7aa: 0x6d254620, 0x3c7ab: 0x6c508020, - 0x3c7ac: 0x6c72a820, 0x3c7ad: 0x6d255420, 0x3c7ae: 0x6d52d420, 0x3c7af: 0x6da54a20, - 0x3c7b0: 0x6e0e4220, 0x3c7b1: 0x6c359c20, 0x3c7b2: 0x6c35ac20, 0x3c7b3: 0x6c35ae20, - 0x3c7b4: 0x6c50aa20, 0x3c7b5: 0x6c72e420, 0x3c7b6: 0x6c72e620, 0x3c7b7: 0x6c72e820, - 0x3c7b8: 0x6c9b6a20, 0x3c7b9: 0x6cc76220, 0x3c7ba: 0x6cc76420, 0x3c7bb: 0x6cc76620, - 0x3c7bc: 0x6cc76820, 0x3c7bd: 0x6cf5ca20, 0x3c7be: 0x6d257420, 0x3c7bf: 0x6d52ee20, - // Block 0xf1f, offset 0x3c7c0 - 0x3c7c0: 0x6d52f020, 0x3c7c1: 0x6d7e2c20, 0x3c7c2: 0x6d7e2e20, 0x3c7c3: 0x6de38020, - 0x3c7c4: 0x6de38220, 0x3c7c5: 0x6dfadc20, 0x3c7c6: 0x6c219820, 0x3c7c7: 0x6c219a20, - 0x3c7c8: 0x6c363220, 0x3c7c9: 0x6c363420, 0x3c7ca: 0x6c363620, 0x3c7cb: 0x6c363820, - 0x3c7cc: 0x6c363a20, 0x3c7cd: 0x6c363c20, 0x3c7ce: 0x6c363e20, 0x3c7cf: 0x6c514420, - 0x3c7d0: 0x6c514620, 0x3c7d1: 0x6c514820, 0x3c7d2: 0x6c514a20, 0x3c7d3: 0x6c514c20, - 0x3c7d4: 0x6c514e20, 0x3c7d5: 0x6c515020, 0x3c7d6: 0x6c515220, 0x3c7d7: 0x6c515420, - 0x3c7d8: 0x6c515620, 0x3c7d9: 0x6c737220, 0x3c7da: 0x6c737420, 0x3c7db: 0x6c737620, - 0x3c7dc: 0x6c737820, 0x3c7dd: 0x6c737a20, 0x3c7de: 0x6c737c20, 0x3c7df: 0x6c737e20, - 0x3c7e0: 0x6c738020, 0x3c7e1: 0x6c738220, 0x3c7e2: 0x6c738420, 0x3c7e3: 0x6c738620, - 0x3c7e4: 0x6c738820, 0x3c7e5: 0x6c9c0220, 0x3c7e6: 0x6c9c0420, 0x3c7e7: 0x6c9c0620, - 0x3c7e8: 0x6c9c0820, 0x3c7e9: 0x6cc83e20, 0x3c7ea: 0x6cc84020, 0x3c7eb: 0x6cc84220, - 0x3c7ec: 0x6cc84420, 0x3c7ed: 0x6cc84620, 0x3c7ee: 0x6cc84820, 0x3c7ef: 0x6cf67620, - 0x3c7f0: 0x6cf67820, 0x3c7f1: 0x6cf67a20, 0x3c7f2: 0x6cf67c20, 0x3c7f3: 0x6cf67e20, - 0x3c7f4: 0x6cf68020, 0x3c7f5: 0x6cf68220, 0x3c7f6: 0x6cf68420, 0x3c7f7: 0x6cf68620, - 0x3c7f8: 0x6d25ec20, 0x3c7f9: 0x6d25ee20, 0x3c7fa: 0x6d25f020, 0x3c7fb: 0x6d25f220, - 0x3c7fc: 0x6d25f420, 0x3c7fd: 0x6d25f620, 0x3c7fe: 0x6d536220, 0x3c7ff: 0x6d536420, - // Block 0xf20, offset 0x3c800 - 0x3c800: 0x6d536620, 0x3c801: 0x6d536820, 0x3c802: 0x6d536a20, 0x3c803: 0x6d536c20, - 0x3c804: 0x6d536e20, 0x3c805: 0x6d537020, 0x3c806: 0x6da5a420, 0x3c807: 0x6d7ec620, - 0x3c808: 0x6d7ec820, 0x3c809: 0x6d7eca20, 0x3c80a: 0x6d7ecc20, 0x3c80b: 0x6d7ece20, - 0x3c80c: 0x6d7ed020, 0x3c80d: 0x6da5a620, 0x3c80e: 0x6dc73820, 0x3c80f: 0x6dc73a20, - 0x3c810: 0x6dc73c20, 0x3c811: 0x6e0e5220, 0x3c812: 0x6e0e5420, 0x3c813: 0x6e0e5620, - 0x3c814: 0x6e325620, 0x3c815: 0x6d537e20, 0x3c816: 0x6d7ee020, 0x3c817: 0x6d7ee220, - 0x3c818: 0x6de3b220, 0x3c819: 0x6c127820, 0x3c81a: 0x6c21ae20, 0x3c81b: 0x6c365620, - 0x3c81c: 0x6c518220, 0x3c81d: 0x6c518420, 0x3c81e: 0x6c73ba20, 0x3c81f: 0x6d261220, - 0x3c820: 0x6c9c3020, 0x3c821: 0x6c9c3220, 0x3c822: 0x6c9c3420, 0x3c823: 0x6cc87e20, - 0x3c824: 0x6cf6aa20, 0x3c825: 0x6cf6ac20, 0x3c826: 0x6cf6ae20, 0x3c827: 0x6cf6b020, - 0x3c828: 0x6d261420, 0x3c829: 0x6d261620, 0x3c82a: 0x6d261820, 0x3c82b: 0x6d539820, - 0x3c82c: 0x6d539a20, 0x3c82d: 0x6d7efc20, 0x3c82e: 0x6e0e5a20, 0x3c82f: 0x6e0e5c20, - 0x3c830: 0x6e325c20, 0x3c831: 0x6c222e20, 0x3c832: 0x6c223020, 0x3c833: 0x6c223220, - 0x3c834: 0x6c223420, 0x3c835: 0x6c223620, 0x3c836: 0x6c375a20, 0x3c837: 0x6c375c20, - 0x3c838: 0x6c375e20, 0x3c839: 0x6c376020, 0x3c83a: 0x6c52ae20, 0x3c83b: 0x6c52b020, - 0x3c83c: 0x6c52b220, 0x3c83d: 0x6c52b420, 0x3c83e: 0x6c52b620, 0x3c83f: 0x6c52b820, - // Block 0xf21, offset 0x3c840 - 0x3c840: 0x6c52ba20, 0x3c841: 0x6c52bc20, 0x3c842: 0x6c52be20, 0x3c843: 0x6c752a20, - 0x3c844: 0x6c752c20, 0x3c845: 0x6c752e20, 0x3c846: 0x6c753020, 0x3c847: 0x6c753220, - 0x3c848: 0x6c753420, 0x3c849: 0x6c753620, 0x3c84a: 0x6c753820, 0x3c84b: 0x6c753a20, - 0x3c84c: 0x6c753c20, 0x3c84d: 0x6c753e20, 0x3c84e: 0x6c754020, 0x3c84f: 0x6c754220, - 0x3c850: 0x6c9d8620, 0x3c851: 0x6c9d8820, 0x3c852: 0x6c9d8a20, 0x3c853: 0x6c9d8c20, - 0x3c854: 0x6c9d8e20, 0x3c855: 0x6c9d9020, 0x3c856: 0x6c9d9220, 0x3c857: 0x6c9d9420, - 0x3c858: 0x6c9d9620, 0x3c859: 0x6c9d9820, 0x3c85a: 0x6c9d9a20, 0x3c85b: 0x6c9d9c20, - 0x3c85c: 0x6c9d9e20, 0x3c85d: 0x6c9da020, 0x3c85e: 0x6c9da220, 0x3c85f: 0x6cca6620, - 0x3c860: 0x6cca6820, 0x3c861: 0x6cca6a20, 0x3c862: 0x6cca6c20, 0x3c863: 0x6cca6e20, - 0x3c864: 0x6cca7020, 0x3c865: 0x6cca7220, 0x3c866: 0x6cca7420, 0x3c867: 0x6cca7620, - 0x3c868: 0x6cca7820, 0x3c869: 0x6cca7a20, 0x3c86a: 0x6cca7c20, 0x3c86b: 0x6cca7e20, - 0x3c86c: 0x6cca8020, 0x3c86d: 0x6cca8220, 0x3c86e: 0x6cca8420, 0x3c86f: 0x6cca8620, - 0x3c870: 0x6cf88c20, 0x3c871: 0x6cf88e20, 0x3c872: 0x6cf89020, 0x3c873: 0x6cf89220, - 0x3c874: 0x6cf89420, 0x3c875: 0x6cf89620, 0x3c876: 0x6cf89820, 0x3c877: 0x6cf89a20, - 0x3c878: 0x6cf89c20, 0x3c879: 0x6cf89e20, 0x3c87a: 0x6cf8a020, 0x3c87b: 0x6cf8a220, - 0x3c87c: 0x6cf8a420, 0x3c87d: 0x6cf8a620, 0x3c87e: 0x6cf8a820, 0x3c87f: 0x6cf8aa20, - // Block 0xf22, offset 0x3c880 - 0x3c880: 0x6cf8ac20, 0x3c881: 0x6cf8ae20, 0x3c882: 0x6cf8b020, 0x3c883: 0x6cf8b220, - 0x3c884: 0x6cf8b420, 0x3c885: 0x6cf8b620, 0x3c886: 0x6cf8b820, 0x3c887: 0x6cf8ba20, - 0x3c888: 0x6d27d220, 0x3c889: 0x6d27d420, 0x3c88a: 0x6d27d620, 0x3c88b: 0x6d27d820, - 0x3c88c: 0x6d27da20, 0x3c88d: 0x6d27dc20, 0x3c88e: 0x6d27de20, 0x3c88f: 0x6d27e020, - 0x3c890: 0x6d27e220, 0x3c891: 0x6d27e420, 0x3c892: 0x6d27e620, 0x3c893: 0x6d27e820, - 0x3c894: 0x6d27ea20, 0x3c895: 0x6d27ec20, 0x3c896: 0x6d27ee20, 0x3c897: 0x6d27f020, - 0x3c898: 0x6d27f220, 0x3c899: 0x6d27f420, 0x3c89a: 0x6d27f620, 0x3c89b: 0x6d27f820, - 0x3c89c: 0x6d27fa20, 0x3c89d: 0x6d552c20, 0x3c89e: 0x6d552e20, 0x3c89f: 0x6d553020, - 0x3c8a0: 0x6d553220, 0x3c8a1: 0x6d553420, 0x3c8a2: 0x6d553620, 0x3c8a3: 0x6d553820, - 0x3c8a4: 0x6d553a20, 0x3c8a5: 0x6d553c20, 0x3c8a6: 0x6d553e20, 0x3c8a7: 0x6d554020, - 0x3c8a8: 0x6d554220, 0x3c8a9: 0x6d554420, 0x3c8aa: 0x6d554620, 0x3c8ab: 0x6d554820, - 0x3c8ac: 0x6d554a20, 0x3c8ad: 0x6d80ae20, 0x3c8ae: 0x6d80b020, 0x3c8af: 0x6d80b220, - 0x3c8b0: 0x6d80b420, 0x3c8b1: 0x6d80b620, 0x3c8b2: 0x6d80b820, 0x3c8b3: 0x6d80ba20, - 0x3c8b4: 0x6d80bc20, 0x3c8b5: 0x6d80be20, 0x3c8b6: 0x6d80c020, 0x3c8b7: 0x6d80c220, - 0x3c8b8: 0x6d80c420, 0x3c8b9: 0x6d80c620, 0x3c8ba: 0x6d80c820, 0x3c8bb: 0x6d80ca20, - 0x3c8bc: 0x6d80cc20, 0x3c8bd: 0x6da6d820, 0x3c8be: 0x6da6da20, 0x3c8bf: 0x6da6dc20, - // Block 0xf23, offset 0x3c8c0 - 0x3c8c0: 0x6da6de20, 0x3c8c1: 0x6da6e020, 0x3c8c2: 0x6da6e220, 0x3c8c3: 0x6da6e420, - 0x3c8c4: 0x6da6e620, 0x3c8c5: 0x6da6e820, 0x3c8c6: 0x6da6ea20, 0x3c8c7: 0x6da6ec20, - 0x3c8c8: 0x6da6ee20, 0x3c8c9: 0x6dc83c20, 0x3c8ca: 0x6dc83e20, 0x3c8cb: 0x6dc84020, - 0x3c8cc: 0x6dc84220, 0x3c8cd: 0x6dc84420, 0x3c8ce: 0x6dc84620, 0x3c8cf: 0x6dc84820, - 0x3c8d0: 0x6de46c20, 0x3c8d1: 0x6de46e20, 0x3c8d2: 0x6de47020, 0x3c8d3: 0x6de47220, - 0x3c8d4: 0x6de47420, 0x3c8d5: 0x6de47620, 0x3c8d6: 0x6dfb8e20, 0x3c8d7: 0x6dfb9020, - 0x3c8d8: 0x6dfb9220, 0x3c8d9: 0x6dfb9420, 0x3c8da: 0x6dfb9620, 0x3c8db: 0x6e0ed020, - 0x3c8dc: 0x6e0ed220, 0x3c8dd: 0x6e0ed420, 0x3c8de: 0x6e0ed620, 0x3c8df: 0x6e1e0620, - 0x3c8e0: 0x6e1e0820, 0x3c8e1: 0x6e1e0a20, 0x3c8e2: 0x6e297220, 0x3c8e3: 0x6e297420, - 0x3c8e4: 0x6e328c20, 0x3c8e5: 0x6e328e20, 0x3c8e6: 0x6e38d220, 0x3c8e7: 0x6e405420, - 0x3c8e8: 0x6e3d4420, 0x3c8e9: 0x6c379220, 0x3c8ea: 0x6c52f420, 0x3c8eb: 0x6c52f620, - 0x3c8ec: 0x6c9dd620, 0x3c8ed: 0x6c9dd820, 0x3c8ee: 0x6ccad020, 0x3c8ef: 0x6cf90220, - 0x3c8f0: 0x6cf90420, 0x3c8f1: 0x6d283e20, 0x3c8f2: 0x6d558220, 0x3c8f3: 0x6dfba220, - 0x3c8f4: 0x6e329220, 0x3c8f5: 0x6c37c820, 0x3c8f6: 0x6c75a420, 0x3c8f7: 0x6c9de620, - 0x3c8f8: 0x6ccaf620, 0x3c8f9: 0x6cf91c20, 0x3c8fa: 0x6cf91e20, 0x3c8fb: 0x6d284e20, - 0x3c8fc: 0x6d559820, 0x3c8fd: 0x6d80fe20, 0x3c8fe: 0x6d810020, 0x3c8ff: 0x6da71c20, - // Block 0xf24, offset 0x3c900 - 0x3c900: 0x6c534420, 0x3c901: 0x6c534620, 0x3c902: 0x6c75d820, 0x3c903: 0x6c75da20, - 0x3c904: 0x6c9e1e20, 0x3c905: 0x6ccb4820, 0x3c906: 0x6d287420, 0x3c907: 0x6da73420, - 0x3c908: 0x6c75e820, 0x3c909: 0x6c75ea20, 0x3c90a: 0x6c9b1220, 0x3c90b: 0x6c9e4620, - 0x3c90c: 0x6ccb6220, 0x3c90d: 0x6ccb6420, 0x3c90e: 0x6ccb6620, 0x3c90f: 0x6cf97a20, - 0x3c910: 0x6d55da20, 0x3c911: 0x6da74020, 0x3c912: 0x6da74220, 0x3c913: 0x6e38de20, - 0x3c914: 0x6d289220, 0x3c915: 0x6d289c20, 0x3c916: 0x6c098220, 0x3c917: 0x6c384c20, - 0x3c918: 0x6c384e20, 0x3c919: 0x6c53ac20, 0x3c91a: 0x6c53ae20, 0x3c91b: 0x6c763420, - 0x3c91c: 0x6c763620, 0x3c91d: 0x6ccbc220, 0x3c91e: 0x6ccbc420, 0x3c91f: 0x6cf9d420, - 0x3c920: 0x6d28e820, 0x3c921: 0x6d561020, 0x3c922: 0x6dc8ba20, 0x3c923: 0x6c386420, - 0x3c924: 0x6c53cc20, 0x3c925: 0x6c9ea820, 0x3c926: 0x6cf9e020, 0x3c927: 0x6d28f220, - 0x3c928: 0x6c09c820, 0x3c929: 0x6c134c20, 0x3c92a: 0x6c134e20, 0x3c92b: 0x6c135020, - 0x3c92c: 0x6c135220, 0x3c92d: 0x6c238220, 0x3c92e: 0x6c238420, 0x3c92f: 0x6c238620, - 0x3c930: 0x6c238820, 0x3c931: 0x6c398420, 0x3c932: 0x6c398620, 0x3c933: 0x6c398820, - 0x3c934: 0x6c398a20, 0x3c935: 0x6c398c20, 0x3c936: 0x6c398e20, 0x3c937: 0x6c550a20, - 0x3c938: 0x6c550c20, 0x3c939: 0x6c550e20, 0x3c93a: 0x6c551020, 0x3c93b: 0x6c551220, - 0x3c93c: 0x6c551420, 0x3c93d: 0x6c551620, 0x3c93e: 0x6c77cc20, 0x3c93f: 0x6c77ce20, - // Block 0xf25, offset 0x3c940 - 0x3c940: 0x6c77d020, 0x3c941: 0x6c77d220, 0x3c942: 0x6c77d420, 0x3c943: 0x6c77d620, - 0x3c944: 0x6c77d820, 0x3c945: 0x6c77da20, 0x3c946: 0x6c77dc20, 0x3c947: 0x6c77de20, - 0x3c948: 0x6c77e020, 0x3c949: 0x6c77e220, 0x3c94a: 0x6c77e420, 0x3c94b: 0x6c77e620, - 0x3c94c: 0x6ca0c620, 0x3c94d: 0x6ca0c820, 0x3c94e: 0x6ca0ca20, 0x3c94f: 0x6ca0cc20, - 0x3c950: 0x6ca0ce20, 0x3c951: 0x6ca0d020, 0x3c952: 0x6ca0d220, 0x3c953: 0x6ca0d420, - 0x3c954: 0x6ca0d620, 0x3c955: 0x6ca0d820, 0x3c956: 0x6ca0da20, 0x3c957: 0x6ccdb620, - 0x3c958: 0x6ccdb820, 0x3c959: 0x6ccdba20, 0x3c95a: 0x6ccdbc20, 0x3c95b: 0x6ccdbe20, - 0x3c95c: 0x6ccdc020, 0x3c95d: 0x6ccdc220, 0x3c95e: 0x6ccdc420, 0x3c95f: 0x6ccdc620, - 0x3c960: 0x6ccdc820, 0x3c961: 0x6ccdca20, 0x3c962: 0x6ccdcc20, 0x3c963: 0x6ccdce20, - 0x3c964: 0x6ccdd020, 0x3c965: 0x6ccdd220, 0x3c966: 0x6ccdd420, 0x3c967: 0x6ccdd620, - 0x3c968: 0x6ccdd820, 0x3c969: 0x6ccdda20, 0x3c96a: 0x6cfba620, 0x3c96b: 0x6cfba820, - 0x3c96c: 0x6cfbaa20, 0x3c96d: 0x6cfbac20, 0x3c96e: 0x6cfbae20, 0x3c96f: 0x6cfbb020, - 0x3c970: 0x6cfbb220, 0x3c971: 0x6cfbb420, 0x3c972: 0x6cfbb620, 0x3c973: 0x6cfbb820, - 0x3c974: 0x6cfbba20, 0x3c975: 0x6cfbbc20, 0x3c976: 0x6cfbbe20, 0x3c977: 0x6cfbc020, - 0x3c978: 0x6cfbc220, 0x3c979: 0x6cfbc420, 0x3c97a: 0x6cfbc620, 0x3c97b: 0x6cfbc820, - 0x3c97c: 0x6cfbca20, 0x3c97d: 0x6cfbcc20, 0x3c97e: 0x6cfbce20, 0x3c97f: 0x6d2ab220, - // Block 0xf26, offset 0x3c980 - 0x3c980: 0x6d2ab420, 0x3c981: 0x6d2ab620, 0x3c982: 0x6d2ab820, 0x3c983: 0x6d2aba20, - 0x3c984: 0x6d2abc20, 0x3c985: 0x6d2abe20, 0x3c986: 0x6d2ac020, 0x3c987: 0x6d2ac220, - 0x3c988: 0x6d2ac420, 0x3c989: 0x6d2ac620, 0x3c98a: 0x6d2ac820, 0x3c98b: 0x6d57e420, - 0x3c98c: 0x6d57e620, 0x3c98d: 0x6d57e820, 0x3c98e: 0x6d57ea20, 0x3c98f: 0x6d57ec20, - 0x3c990: 0x6d57ee20, 0x3c991: 0x6d57f020, 0x3c992: 0x6d57f220, 0x3c993: 0x6d57f420, - 0x3c994: 0x6d57f620, 0x3c995: 0x6d57f820, 0x3c996: 0x6d57fa20, 0x3c997: 0x6d57fc20, - 0x3c998: 0x6d57fe20, 0x3c999: 0x6d580020, 0x3c99a: 0x6d580220, 0x3c99b: 0x6d580420, - 0x3c99c: 0x6d580620, 0x3c99d: 0x6d82e420, 0x3c99e: 0x6d82e620, 0x3c99f: 0x6d82e820, - 0x3c9a0: 0x6d82ea20, 0x3c9a1: 0x6d82ec20, 0x3c9a2: 0x6d82ee20, 0x3c9a3: 0x6d82f020, - 0x3c9a4: 0x6d82f220, 0x3c9a5: 0x6d82f420, 0x3c9a6: 0x6d82f620, 0x3c9a7: 0x6d82f820, - 0x3c9a8: 0x6da85a20, 0x3c9a9: 0x6da85c20, 0x3c9aa: 0x6da85e20, 0x3c9ab: 0x6da86020, - 0x3c9ac: 0x6da86220, 0x3c9ad: 0x6da86420, 0x3c9ae: 0x6da86620, 0x3c9af: 0x6da86820, - 0x3c9b0: 0x6da86a20, 0x3c9b1: 0x6da86c20, 0x3c9b2: 0x6da86e20, 0x3c9b3: 0x6dc9aa20, - 0x3c9b4: 0x6dc9ac20, 0x3c9b5: 0x6dc9ae20, 0x3c9b6: 0x6dc9b020, 0x3c9b7: 0x6dc9b220, - 0x3c9b8: 0x6dc9b420, 0x3c9b9: 0x6dc9b620, 0x3c9ba: 0x6de56220, 0x3c9bb: 0x6de56420, - 0x3c9bc: 0x6de56620, 0x3c9bd: 0x6de56820, 0x3c9be: 0x6de56a20, 0x3c9bf: 0x6de56c20, - // Block 0xf27, offset 0x3c9c0 - 0x3c9c0: 0x6dfc4220, 0x3c9c1: 0x6dfc4420, 0x3c9c2: 0x6dfc4620, 0x3c9c3: 0x6e0f7220, - 0x3c9c4: 0x6e0f7420, 0x3c9c5: 0x6e0f7620, 0x3c9c6: 0x6e0f7820, 0x3c9c7: 0x6e0f7a20, - 0x3c9c8: 0x6e1e6a20, 0x3c9c9: 0x6e1e6c20, 0x3c9ca: 0x6e29d220, 0x3c9cb: 0x6e29d420, - 0x3c9cc: 0x6e32be20, 0x3c9cd: 0x6c09ce20, 0x3c9ce: 0x6c23ca20, 0x3c9cf: 0x6c23cc20, - 0x3c9d0: 0x6c23ce20, 0x3c9d1: 0x6c3a1620, 0x3c9d2: 0x6c3a1820, 0x3c9d3: 0x6c3a1a20, - 0x3c9d4: 0x6c3a1c20, 0x3c9d5: 0x6c3a1e20, 0x3c9d6: 0x6c3a2020, 0x3c9d7: 0x6c3a2220, - 0x3c9d8: 0x6c55d820, 0x3c9d9: 0x6c55da20, 0x3c9da: 0x6c55dc20, 0x3c9db: 0x6c55de20, - 0x3c9dc: 0x6c55e020, 0x3c9dd: 0x6c55e220, 0x3c9de: 0x6c55e420, 0x3c9df: 0x6c55e620, - 0x3c9e0: 0x6c55e820, 0x3c9e1: 0x6c55ea20, 0x3c9e2: 0x6c55ec20, 0x3c9e3: 0x6c78b820, - 0x3c9e4: 0x6c78ba20, 0x3c9e5: 0x6c78bc20, 0x3c9e6: 0x6c78be20, 0x3c9e7: 0x6c78c020, - 0x3c9e8: 0x6c78c220, 0x3c9e9: 0x6c78c420, 0x3c9ea: 0x6c78c620, 0x3c9eb: 0x6ca1ba20, - 0x3c9ec: 0x6ca1bc20, 0x3c9ed: 0x6ca1be20, 0x3c9ee: 0x6ca1c020, 0x3c9ef: 0x6ca1c220, - 0x3c9f0: 0x6ca1c420, 0x3c9f1: 0x6ca1c620, 0x3c9f2: 0x6ca1c820, 0x3c9f3: 0x6ccee820, - 0x3c9f4: 0x6cceea20, 0x3c9f5: 0x6cceec20, 0x3c9f6: 0x6cceee20, 0x3c9f7: 0x6ccef020, - 0x3c9f8: 0x6ccef220, 0x3c9f9: 0x6ccef420, 0x3c9fa: 0x6ccef620, 0x3c9fb: 0x6ccef820, - 0x3c9fc: 0x6ccefa20, 0x3c9fd: 0x6ccefc20, 0x3c9fe: 0x6ccefe20, 0x3c9ff: 0x6ccf0020, - // Block 0xf28, offset 0x3ca00 - 0x3ca00: 0x6ccf0220, 0x3ca01: 0x6ccf0420, 0x3ca02: 0x6ccf0620, 0x3ca03: 0x6ccf0820, - 0x3ca04: 0x6cfd1220, 0x3ca05: 0x6cfd1420, 0x3ca06: 0x6cfd1620, 0x3ca07: 0x6cfd1820, - 0x3ca08: 0x6cfd1a20, 0x3ca09: 0x6cfd1c20, 0x3ca0a: 0x6cfd1e20, 0x3ca0b: 0x6cfd2020, - 0x3ca0c: 0x6cfd2220, 0x3ca0d: 0x6cfd2420, 0x3ca0e: 0x6cfd2620, 0x3ca0f: 0x6cfd2820, - 0x3ca10: 0x6cfd2a20, 0x3ca11: 0x6cfd2c20, 0x3ca12: 0x6d2bba20, 0x3ca13: 0x6d2bbc20, - 0x3ca14: 0x6d2bbe20, 0x3ca15: 0x6d2bc020, 0x3ca16: 0x6d2bc220, 0x3ca17: 0x6d2bc420, - 0x3ca18: 0x6d2bc620, 0x3ca19: 0x6d2bc820, 0x3ca1a: 0x6d2bca20, 0x3ca1b: 0x6d2bcc20, - 0x3ca1c: 0x6d2bce20, 0x3ca1d: 0x6d2bd020, 0x3ca1e: 0x6d2bd220, 0x3ca1f: 0x6d2bd420, - 0x3ca20: 0x6d2bd620, 0x3ca21: 0x6d58f020, 0x3ca22: 0x6d58f220, 0x3ca23: 0x6d58f420, - 0x3ca24: 0x6d58f620, 0x3ca25: 0x6d58f820, 0x3ca26: 0x6d58fa20, 0x3ca27: 0x6d58fc20, - 0x3ca28: 0x6d58fe20, 0x3ca29: 0x6d590020, 0x3ca2a: 0x6d841620, 0x3ca2b: 0x6d841820, - 0x3ca2c: 0x6d841a20, 0x3ca2d: 0x6d841c20, 0x3ca2e: 0x6d841e20, 0x3ca2f: 0x6d842020, - 0x3ca30: 0x6d842220, 0x3ca31: 0x6d842420, 0x3ca32: 0x6d842620, 0x3ca33: 0x6d842820, - 0x3ca34: 0x6da90c20, 0x3ca35: 0x6da90e20, 0x3ca36: 0x6da91020, 0x3ca37: 0x6da91220, - 0x3ca38: 0x6da91420, 0x3ca39: 0x6da91620, 0x3ca3a: 0x6da91820, 0x3ca3b: 0x6da91a20, - 0x3ca3c: 0x6dca3020, 0x3ca3d: 0x6dca3220, 0x3ca3e: 0x6dca3420, 0x3ca3f: 0x6dca3620, - // Block 0xf29, offset 0x3ca40 - 0x3ca40: 0x6dca3820, 0x3ca41: 0x6de5d020, 0x3ca42: 0x6de5d220, 0x3ca43: 0x6dfcc420, - 0x3ca44: 0x6dfcc620, 0x3ca45: 0x6dfcc820, 0x3ca46: 0x6e1e9420, 0x3ca47: 0x6e1e9620, - 0x3ca48: 0x6e29fc20, 0x3ca49: 0x6e32cc20, 0x3ca4a: 0x6e390620, 0x3ca4b: 0x6e390820, - 0x3ca4c: 0x6e407420, 0x3ca4d: 0x6c23d820, 0x3ca4e: 0x6c561220, 0x3ca4f: 0x6ca1d820, - 0x3ca50: 0x6ccf1a20, 0x3ca51: 0x6ccf1c20, 0x3ca52: 0x6ccf1e20, 0x3ca53: 0x6ccf2020, - 0x3ca54: 0x6cfd3a20, 0x3ca55: 0x6cfd3c20, 0x3ca56: 0x6d591420, 0x3ca57: 0x6d591620, - 0x3ca58: 0x6da92c20, 0x3ca59: 0x6da92e20, 0x3ca5a: 0x6e470020, 0x3ca5b: 0x6c78dc20, - 0x3ca5c: 0x6ca1de20, 0x3ca5d: 0x6c3a4420, 0x3ca5e: 0x6ca1f620, 0x3ca5f: 0x6ccf3a20, - 0x3ca60: 0x6d592620, 0x3ca61: 0x6dca4220, 0x3ca62: 0x6c790020, 0x3ca63: 0x6ca20620, - 0x3ca64: 0x6ca20820, 0x3ca65: 0x6ccf6420, 0x3ca66: 0x6d845020, 0x3ca67: 0x6c3a6020, - 0x3ca68: 0x6ccf7020, 0x3ca69: 0x6c23fe20, 0x3ca6a: 0x6c569020, 0x3ca6b: 0x6c569220, - 0x3ca6c: 0x6c792e20, 0x3ca6d: 0x6c793020, 0x3ca6e: 0x6c793220, 0x3ca6f: 0x6ccfca20, - 0x3ca70: 0x6cfdbc20, 0x3ca71: 0x6d2c6220, 0x3ca72: 0x6d2c6420, 0x3ca73: 0x6d2c6620, - 0x3ca74: 0x6d598420, 0x3ca75: 0x6d847c20, 0x3ca76: 0x6e0fc620, 0x3ca77: 0x6c246a20, - 0x3ca78: 0x6c3b3420, 0x3ca79: 0x6ccfcc20, 0x3ca7a: 0x6c572220, 0x3ca7b: 0x6c572420, - 0x3ca7c: 0x6c79b620, 0x3ca7d: 0x6c79b820, 0x3ca7e: 0x6ca2cc20, 0x3ca7f: 0x6ca2ce20, - // Block 0xf2a, offset 0x3ca80 - 0x3ca80: 0x6ca2d020, 0x3ca81: 0x6ca2d220, 0x3ca82: 0x6cd06c20, 0x3ca83: 0x6cd06e20, - 0x3ca84: 0x6cd07020, 0x3ca85: 0x6cd07220, 0x3ca86: 0x6cfe4620, 0x3ca87: 0x6cfe4820, - 0x3ca88: 0x6d2cde20, 0x3ca89: 0x6d5a0420, 0x3ca8a: 0x6da99420, 0x3ca8b: 0x6dca8220, - 0x3ca8c: 0x6de61a20, 0x3ca8d: 0x6c13cc20, 0x3ca8e: 0x6c3b9c20, 0x3ca8f: 0x6c3b9e20, - 0x3ca90: 0x6c3ba020, 0x3ca91: 0x6c3ba220, 0x3ca92: 0x6c3ba420, 0x3ca93: 0x6c3ba620, - 0x3ca94: 0x6c3ba820, 0x3ca95: 0x6c57c220, 0x3ca96: 0x6c57c420, 0x3ca97: 0x6c7a5e20, - 0x3ca98: 0x6c7a6020, 0x3ca99: 0x6c7a6220, 0x3ca9a: 0x6c7a6420, 0x3ca9b: 0x6c7a6620, - 0x3ca9c: 0x6c7a6820, 0x3ca9d: 0x6c7a6a20, 0x3ca9e: 0x6c7a6c20, 0x3ca9f: 0x6c7a6e20, - 0x3caa0: 0x6ca37020, 0x3caa1: 0x6ca37220, 0x3caa2: 0x6ca37420, 0x3caa3: 0x6ca37620, - 0x3caa4: 0x6ca37820, 0x3caa5: 0x6ca37a20, 0x3caa6: 0x6cd14420, 0x3caa7: 0x6cd14620, - 0x3caa8: 0x6cd14820, 0x3caa9: 0x6cd14a20, 0x3caaa: 0x6cd14c20, 0x3caab: 0x6cd14e20, - 0x3caac: 0x6cd15020, 0x3caad: 0x6cd15220, 0x3caae: 0x6cd15420, 0x3caaf: 0x6cd15620, - 0x3cab0: 0x6cd15820, 0x3cab1: 0x6cd15a20, 0x3cab2: 0x6cd15c20, 0x3cab3: 0x6cff2020, - 0x3cab4: 0x6cff2220, 0x3cab5: 0x6cff2420, 0x3cab6: 0x6cff2620, 0x3cab7: 0x6cff2820, - 0x3cab8: 0x6cff2a20, 0x3cab9: 0x6cff2c20, 0x3caba: 0x6cff2e20, 0x3cabb: 0x6cff3020, - 0x3cabc: 0x6cff3220, 0x3cabd: 0x6cff3420, 0x3cabe: 0x6cff3620, 0x3cabf: 0x6cff3820, - // Block 0xf2b, offset 0x3cac0 - 0x3cac0: 0x6cff3a20, 0x3cac1: 0x6cff3c20, 0x3cac2: 0x6cff3e20, 0x3cac3: 0x6d2d6a20, - 0x3cac4: 0x6d2d6c20, 0x3cac5: 0x6d2d6e20, 0x3cac6: 0x6d2d7020, 0x3cac7: 0x6d2d7220, - 0x3cac8: 0x6d2d7420, 0x3cac9: 0x6d2d7620, 0x3caca: 0x6d2d7820, 0x3cacb: 0x6d2d7a20, - 0x3cacc: 0x6d2d7c20, 0x3cacd: 0x6d2d7e20, 0x3cace: 0x6d2d8020, 0x3cacf: 0x6d2d8220, - 0x3cad0: 0x6d5aa220, 0x3cad1: 0x6d5aa420, 0x3cad2: 0x6d5aa620, 0x3cad3: 0x6d5aa820, - 0x3cad4: 0x6d5aaa20, 0x3cad5: 0x6d5aac20, 0x3cad6: 0x6d5aae20, 0x3cad7: 0x6d855420, - 0x3cad8: 0x6d855620, 0x3cad9: 0x6d855820, 0x3cada: 0x6d855a20, 0x3cadb: 0x6d855c20, - 0x3cadc: 0x6d855e20, 0x3cadd: 0x6d856020, 0x3cade: 0x6d856220, 0x3cadf: 0x6d856420, - 0x3cae0: 0x6d856620, 0x3cae1: 0x6daa0420, 0x3cae2: 0x6daa0620, 0x3cae3: 0x6daa0820, - 0x3cae4: 0x6daa0a20, 0x3cae5: 0x6daa0c20, 0x3cae6: 0x6daa0e20, 0x3cae7: 0x6dcade20, - 0x3cae8: 0x6dcae020, 0x3cae9: 0x6de66220, 0x3caea: 0x6de66420, 0x3caeb: 0x6de66620, - 0x3caec: 0x6dfd2420, 0x3caed: 0x6dfd2620, 0x3caee: 0x6dfd2820, 0x3caef: 0x6dfd2a20, - 0x3caf0: 0x6e0ff220, 0x3caf1: 0x6e2a2c20, 0x3caf2: 0x6e32e220, 0x3caf3: 0x6c3bb020, - 0x3caf4: 0x6c57d420, 0x3caf5: 0x6cff5020, 0x3caf6: 0x6c3bc220, 0x3caf7: 0x6c57fa20, - 0x3caf8: 0x6c57fc20, 0x3caf9: 0x6c7aac20, 0x3cafa: 0x6cff8420, 0x3cafb: 0x6cff8620, - 0x3cafc: 0x6d2dd020, 0x3cafd: 0x6d5aec20, 0x3cafe: 0x6d5aee20, 0x3caff: 0x6e1ed420, - // Block 0xf2c, offset 0x3cb00 - 0x3cb00: 0x6cd1a020, 0x3cb01: 0x6c24a820, 0x3cb02: 0x6ca3ce20, 0x3cb03: 0x6cff9c20, - 0x3cb04: 0x6cff9e20, 0x3cb05: 0x6cffa020, 0x3cb06: 0x6c13d420, 0x3cb07: 0x6c24d220, - 0x3cb08: 0x6c3c1220, 0x3cb09: 0x6c588620, 0x3cb0a: 0x6c588820, 0x3cb0b: 0x6c588a20, - 0x3cb0c: 0x6c588c20, 0x3cb0d: 0x6c7b0620, 0x3cb0e: 0x6c7b0820, 0x3cb0f: 0x6c7b0a20, - 0x3cb10: 0x6c7b0c20, 0x3cb11: 0x6ca41420, 0x3cb12: 0x6ca41620, 0x3cb13: 0x6cd1fc20, - 0x3cb14: 0x6cd1fe20, 0x3cb15: 0x6cd20020, 0x3cb16: 0x6cd20220, 0x3cb17: 0x6cd20420, - 0x3cb18: 0x6cffea20, 0x3cb19: 0x6cffec20, 0x3cb1a: 0x6cffee20, 0x3cb1b: 0x6d2e0020, - 0x3cb1c: 0x6d2e0220, 0x3cb1d: 0x6d5b2a20, 0x3cb1e: 0x6d5b2c20, 0x3cb1f: 0x6d85b820, - 0x3cb20: 0x6d85ba20, 0x3cb21: 0x6d85bc20, 0x3cb22: 0x6daa6c20, 0x3cb23: 0x6dcb1c20, - 0x3cb24: 0x6dfd4620, 0x3cb25: 0x6e101a20, 0x3cb26: 0x6e101c20, 0x3cb27: 0x6daa6e20, - 0x3cb28: 0x6c58fa20, 0x3cb29: 0x6c58fc20, 0x3cb2a: 0x6c58fe20, 0x3cb2b: 0x6c590020, - 0x3cb2c: 0x6c7b9c20, 0x3cb2d: 0x6c7b9e20, 0x3cb2e: 0x6c7ba020, 0x3cb2f: 0x6ca48420, - 0x3cb30: 0x6cd2b420, 0x3cb31: 0x6cd2b620, 0x3cb32: 0x6d00ae20, 0x3cb33: 0x6d2ea020, - 0x3cb34: 0x6d2ea220, 0x3cb35: 0x6d2ea420, 0x3cb36: 0x6d5bd220, 0x3cb37: 0x6d5bd420, - 0x3cb38: 0x6daafc20, 0x3cb39: 0x6daafe20, 0x3cb3a: 0x6de6da20, 0x3cb3b: 0x6c593620, - 0x3cb3c: 0x6c593820, 0x3cb3d: 0x6c7bd020, 0x3cb3e: 0x6cd2ea20, 0x3cb3f: 0x6cd2ec20, - // Block 0xf2d, offset 0x3cb40 - 0x3cb40: 0x6d00e020, 0x3cb41: 0x6d00e220, 0x3cb42: 0x6d2ec420, 0x3cb43: 0x6d2ec620, - 0x3cb44: 0x6d5bf620, 0x3cb45: 0x6e104e20, 0x3cb46: 0x6c3c6420, 0x3cb47: 0x6c594c20, - 0x3cb48: 0x6d2eee20, 0x3cb49: 0x6d2ef020, 0x3cb4a: 0x6c596e20, 0x3cb4b: 0x6c597020, - 0x3cb4c: 0x6c7c2a20, 0x3cb4d: 0x6c7c2c20, 0x3cb4e: 0x6ca4ec20, 0x3cb4f: 0x6cd32820, - 0x3cb50: 0x6cd32a20, 0x3cb51: 0x6d012a20, 0x3cb52: 0x6d012c20, 0x3cb53: 0x6d2f0420, - 0x3cb54: 0x6d2f0620, 0x3cb55: 0x6d5c2620, 0x3cb56: 0x6d86ac20, 0x3cb57: 0x6dab4a20, - 0x3cb58: 0x6dab4c20, 0x3cb59: 0x6dcbbc20, 0x3cb5a: 0x6de70a20, 0x3cb5b: 0x6e105a20, - 0x3cb5c: 0x6e1f1420, 0x3cb5d: 0x6e331220, 0x3cb5e: 0x6e444020, 0x3cb5f: 0x6c3cae20, - 0x3cb60: 0x6c3cb020, 0x3cb61: 0x6c5a1420, 0x3cb62: 0x6c5a1620, 0x3cb63: 0x6c5a1820, - 0x3cb64: 0x6c7ccc20, 0x3cb65: 0x6c7cce20, 0x3cb66: 0x6c7cd020, 0x3cb67: 0x6c7cd220, - 0x3cb68: 0x6ca58a20, 0x3cb69: 0x6ca58c20, 0x3cb6a: 0x6ca58e20, 0x3cb6b: 0x6cd3f020, - 0x3cb6c: 0x6cd3f220, 0x3cb6d: 0x6d01ee20, 0x3cb6e: 0x6d01f020, 0x3cb6f: 0x6d01f220, - 0x3cb70: 0x6d01f420, 0x3cb71: 0x6d2fc620, 0x3cb72: 0x6d2fc820, 0x3cb73: 0x6d2fca20, - 0x3cb74: 0x6d2fcc20, 0x3cb75: 0x6d5cca20, 0x3cb76: 0x6d5ccc20, 0x3cb77: 0x6d5cce20, - 0x3cb78: 0x6d5cd020, 0x3cb79: 0x6d874c20, 0x3cb7a: 0x6d874e20, 0x3cb7b: 0x6d875020, - 0x3cb7c: 0x6dabe020, 0x3cb7d: 0x6dabe220, 0x3cb7e: 0x6dabe420, 0x3cb7f: 0x6dabe620, - // Block 0xf2e, offset 0x3cb80 - 0x3cb80: 0x6dabe820, 0x3cb81: 0x6de75020, 0x3cb82: 0x6dfdde20, 0x3cb83: 0x6e108420, - 0x3cb84: 0x6e108620, 0x3cb85: 0x6e444420, 0x3cb86: 0x6c5a2220, 0x3cb87: 0x6cd40820, - 0x3cb88: 0x6c5a3820, 0x3cb89: 0x6c5a3a20, 0x3cb8a: 0x6ca5cc20, 0x3cb8b: 0x6d022e20, - 0x3cb8c: 0x6d2ffa20, 0x3cb8d: 0x6d5cf420, 0x3cb8e: 0x6d5cf620, 0x3cb8f: 0x6dfdea20, - 0x3cb90: 0x6e108a20, 0x3cb91: 0x6c5ab820, 0x3cb92: 0x6c5aba20, 0x3cb93: 0x6c5abc20, - 0x3cb94: 0x6c7db420, 0x3cb95: 0x6c7db620, 0x3cb96: 0x6c7db820, 0x3cb97: 0x6c7dba20, - 0x3cb98: 0x6c7dbc20, 0x3cb99: 0x6ca68020, 0x3cb9a: 0x6ca68220, 0x3cb9b: 0x6ca68420, - 0x3cb9c: 0x6ca68620, 0x3cb9d: 0x6ca68820, 0x3cb9e: 0x6cd4ac20, 0x3cb9f: 0x6cd4ae20, - 0x3cba0: 0x6cd4b020, 0x3cba1: 0x6cd4b220, 0x3cba2: 0x6cd4b420, 0x3cba3: 0x6cd4b620, - 0x3cba4: 0x6d02fc20, 0x3cba5: 0x6d02fe20, 0x3cba6: 0x6d030020, 0x3cba7: 0x6d030220, - 0x3cba8: 0x6d030420, 0x3cba9: 0x6d030620, 0x3cbaa: 0x6d30b020, 0x3cbab: 0x6d30b220, - 0x3cbac: 0x6d5d8220, 0x3cbad: 0x6d5d8420, 0x3cbae: 0x6d5d8620, 0x3cbaf: 0x6d87e820, - 0x3cbb0: 0x6d87ea20, 0x3cbb1: 0x6d87ec20, 0x3cbb2: 0x6d87ee20, 0x3cbb3: 0x6d87f020, - 0x3cbb4: 0x6d87f220, 0x3cbb5: 0x6dac9820, 0x3cbb6: 0x6dac9a20, 0x3cbb7: 0x6dac9c20, - 0x3cbb8: 0x6dcc9a20, 0x3cbb9: 0x6dcc9c20, 0x3cbba: 0x6dcc9e20, 0x3cbbb: 0x6de7a420, - 0x3cbbc: 0x6de7a620, 0x3cbbd: 0x6de7a820, 0x3cbbe: 0x6e10ba20, 0x3cbbf: 0x6e2a9e20, - // Block 0xf2f, offset 0x3cbc0 - 0x3cbc0: 0x6c256020, 0x3cbc1: 0x6c256220, 0x3cbc2: 0x6c3d2820, 0x3cbc3: 0x6c3d2a20, - 0x3cbc4: 0x6c5b2420, 0x3cbc5: 0x6c5b2620, 0x3cbc6: 0x6c5b2820, 0x3cbc7: 0x6c7e2420, - 0x3cbc8: 0x6c7e2620, 0x3cbc9: 0x6c7e2820, 0x3cbca: 0x6c7e2a20, 0x3cbcb: 0x6ca6e820, - 0x3cbcc: 0x6ca6ea20, 0x3cbcd: 0x6ca6ec20, 0x3cbce: 0x6ca6ee20, 0x3cbcf: 0x6ca6f020, - 0x3cbd0: 0x6cd51220, 0x3cbd1: 0x6cd51420, 0x3cbd2: 0x6cd51620, 0x3cbd3: 0x6cd51820, - 0x3cbd4: 0x6cd51a20, 0x3cbd5: 0x6cd51c20, 0x3cbd6: 0x6cd51e20, 0x3cbd7: 0x6cd52020, - 0x3cbd8: 0x6cd52220, 0x3cbd9: 0x6cd52420, 0x3cbda: 0x6d037220, 0x3cbdb: 0x6d037420, - 0x3cbdc: 0x6d310c20, 0x3cbdd: 0x6d310e20, 0x3cbde: 0x6d311020, 0x3cbdf: 0x6d311220, - 0x3cbe0: 0x6d5dcc20, 0x3cbe1: 0x6d5dce20, 0x3cbe2: 0x6dacc820, 0x3cbe3: 0x6dccbc20, - 0x3cbe4: 0x6e333820, 0x3cbe5: 0x6dccbe20, 0x3cbe6: 0x6c140a20, 0x3cbe7: 0x6c3d6620, - 0x3cbe8: 0x6c5b8e20, 0x3cbe9: 0x6c5b9020, 0x3cbea: 0x6c7e9e20, 0x3cbeb: 0x6c7ea020, - 0x3cbec: 0x6c7ea220, 0x3cbed: 0x6c7ea420, 0x3cbee: 0x6ca76e20, 0x3cbef: 0x6ca77020, - 0x3cbf0: 0x6ca77220, 0x3cbf1: 0x6ca77420, 0x3cbf2: 0x6cd59420, 0x3cbf3: 0x6cd59620, - 0x3cbf4: 0x6cd59820, 0x3cbf5: 0x6cd59a20, 0x3cbf6: 0x6cd59c20, 0x3cbf7: 0x6cd59e20, - 0x3cbf8: 0x6cd5a020, 0x3cbf9: 0x6d042220, 0x3cbfa: 0x6d042420, 0x3cbfb: 0x6d042620, - 0x3cbfc: 0x6d31b820, 0x3cbfd: 0x6d31ba20, 0x3cbfe: 0x6d31bc20, 0x3cbff: 0x6d31be20, - // Block 0xf30, offset 0x3cc00 - 0x3cc00: 0x6d31c020, 0x3cc01: 0x6d5e6220, 0x3cc02: 0x6d5e6420, 0x3cc03: 0x6d5e6620, - 0x3cc04: 0x6d5e6820, 0x3cc05: 0x6d88b820, 0x3cc06: 0x6dad4020, 0x3cc07: 0x6dcd1820, - 0x3cc08: 0x6dcd1a20, 0x3cc09: 0x6dfe8220, 0x3cc0a: 0x6c5bd020, 0x3cc0b: 0x6c7ef420, - 0x3cc0c: 0x6ca7c020, 0x3cc0d: 0x6ca7c220, 0x3cc0e: 0x6cd60420, 0x3cc0f: 0x6cd60620, - 0x3cc10: 0x6cd60820, 0x3cc11: 0x6d048020, 0x3cc12: 0x6d048220, 0x3cc13: 0x6d048420, - 0x3cc14: 0x6d320420, 0x3cc15: 0x6d320620, 0x3cc16: 0x6d5eb420, 0x3cc17: 0x6d891820, - 0x3cc18: 0x6d891a20, 0x3cc19: 0x6d891c20, 0x3cc1a: 0x6d891e20, 0x3cc1b: 0x6dad8620, - 0x3cc1c: 0x6dcd3620, 0x3cc1d: 0x6e2ac020, 0x3cc1e: 0x6c3d9820, 0x3cc1f: 0x6c5bf420, - 0x3cc20: 0x6c7f2e20, 0x3cc21: 0x6c7f3020, 0x3cc22: 0x6ca7e420, 0x3cc23: 0x6cd63220, - 0x3cc24: 0x6cd63420, 0x3cc25: 0x6d04b220, 0x3cc26: 0x6d04b420, 0x3cc27: 0x6d322a20, - 0x3cc28: 0x6d322c20, 0x3cc29: 0x6d5ec620, 0x3cc2a: 0x6d5ec820, 0x3cc2b: 0x6d5eca20, - 0x3cc2c: 0x6d892c20, 0x3cc2d: 0x6dada420, 0x3cc2e: 0x6de81020, 0x3cc2f: 0x6e1f8420, - 0x3cc30: 0x6c3da620, 0x3cc31: 0x6c5c2c20, 0x3cc32: 0x6c7f9c20, 0x3cc33: 0x6c7f9e20, - 0x3cc34: 0x6c7fa020, 0x3cc35: 0x6c7fa220, 0x3cc36: 0x6c7fa420, 0x3cc37: 0x6c7fa620, - 0x3cc38: 0x6ca88a20, 0x3cc39: 0x6ca88c20, 0x3cc3a: 0x6ca88e20, 0x3cc3b: 0x6ca89020, - 0x3cc3c: 0x6cd6da20, 0x3cc3d: 0x6cd6dc20, 0x3cc3e: 0x6d058c20, 0x3cc3f: 0x6d058e20, - // Block 0xf31, offset 0x3cc40 - 0x3cc40: 0x6d059020, 0x3cc41: 0x6d059220, 0x3cc42: 0x6d059420, 0x3cc43: 0x6d059620, - 0x3cc44: 0x6d332a20, 0x3cc45: 0x6d332c20, 0x3cc46: 0x6d332e20, 0x3cc47: 0x6d333020, - 0x3cc48: 0x6d333220, 0x3cc49: 0x6d333420, 0x3cc4a: 0x6d5fdc20, 0x3cc4b: 0x6d5fde20, - 0x3cc4c: 0x6d5fe020, 0x3cc4d: 0x6d5fe220, 0x3cc4e: 0x6d5fe420, 0x3cc4f: 0x6d5fe620, - 0x3cc50: 0x6d8a4020, 0x3cc51: 0x6d8a4220, 0x3cc52: 0x6d8a4420, 0x3cc53: 0x6d8a4620, - 0x3cc54: 0x6d8a4820, 0x3cc55: 0x6d8a4a20, 0x3cc56: 0x6d8a4c20, 0x3cc57: 0x6d8a4e20, - 0x3cc58: 0x6daeb420, 0x3cc59: 0x6daeb620, 0x3cc5a: 0x6daeb820, 0x3cc5b: 0x6daeba20, - 0x3cc5c: 0x6daebc20, 0x3cc5d: 0x6daebe20, 0x3cc5e: 0x6daec020, 0x3cc5f: 0x6daec220, - 0x3cc60: 0x6dce5a20, 0x3cc61: 0x6dce5c20, 0x3cc62: 0x6dce5e20, 0x3cc63: 0x6dce6020, - 0x3cc64: 0x6dce6220, 0x3cc65: 0x6de8be20, 0x3cc66: 0x6de8c020, 0x3cc67: 0x6dff1a20, - 0x3cc68: 0x6e118220, 0x3cc69: 0x6e118420, 0x3cc6a: 0x6e118620, 0x3cc6b: 0x6e118820, - 0x3cc6c: 0x6e1fe020, 0x3cc6d: 0x6e2b0220, 0x3cc6e: 0x6e337e20, 0x3cc6f: 0x6e398220, - 0x3cc70: 0x6e42de20, 0x3cc71: 0x6c3db620, 0x3cc72: 0x6c3db820, 0x3cc73: 0x6c5c5a20, - 0x3cc74: 0x6c5c5c20, 0x3cc75: 0x6c7fe820, 0x3cc76: 0x6c7fea20, 0x3cc77: 0x6c7fec20, - 0x3cc78: 0x6ca8e820, 0x3cc79: 0x6ca8ea20, 0x3cc7a: 0x6ca8ec20, 0x3cc7b: 0x6ca8ee20, - 0x3cc7c: 0x6ca8f020, 0x3cc7d: 0x6cd73a20, 0x3cc7e: 0x6cd73c20, 0x3cc7f: 0x6cd73e20, - // Block 0xf32, offset 0x3cc80 - 0x3cc80: 0x6cd74020, 0x3cc81: 0x6d060220, 0x3cc82: 0x6d33ac20, 0x3cc83: 0x6d33ae20, - 0x3cc84: 0x6d33b020, 0x3cc85: 0x6d33b220, 0x3cc86: 0x6d605e20, 0x3cc87: 0x6d606020, - 0x3cc88: 0x6d606220, 0x3cc89: 0x6d8aa420, 0x3cc8a: 0x6d8aa620, 0x3cc8b: 0x6d8aa820, - 0x3cc8c: 0x6d8aaa20, 0x3cc8d: 0x6daf1a20, 0x3cc8e: 0x6daf1c20, 0x3cc8f: 0x6dceba20, - 0x3cc90: 0x6dcebc20, 0x3cc91: 0x6dcebe20, 0x3cc92: 0x6de90420, 0x3cc93: 0x6de90620, - 0x3cc94: 0x6de90820, 0x3cc95: 0x6de90a20, 0x3cc96: 0x6dff3620, 0x3cc97: 0x6e1ffa20, - 0x3cc98: 0x6e1ffc20, 0x3cc99: 0x6e1ffe20, 0x3cc9a: 0x6c3dd220, 0x3cc9b: 0x6c3dd420, - 0x3cc9c: 0x6c5c9420, 0x3cc9d: 0x6c5c9620, 0x3cc9e: 0x6c809a20, 0x3cc9f: 0x6ca99820, - 0x3cca0: 0x6ca99a20, 0x3cca1: 0x6ca99c20, 0x3cca2: 0x6cd80620, 0x3cca3: 0x6cd80820, - 0x3cca4: 0x6cd80a20, 0x3cca5: 0x6d06c220, 0x3cca6: 0x6d06c420, 0x3cca7: 0x6d06c620, - 0x3cca8: 0x6d06c820, 0x3cca9: 0x6d06ca20, 0x3ccaa: 0x6d34b420, 0x3ccab: 0x6d34b620, - 0x3ccac: 0x6d34b820, 0x3ccad: 0x6d34ba20, 0x3ccae: 0x6d34bc20, 0x3ccaf: 0x6d34be20, - 0x3ccb0: 0x6d34c020, 0x3ccb1: 0x6d34c220, 0x3ccb2: 0x6d34c420, 0x3ccb3: 0x6d617020, - 0x3ccb4: 0x6d617220, 0x3ccb5: 0x6d617420, 0x3ccb6: 0x6d617620, 0x3ccb7: 0x6d617820, - 0x3ccb8: 0x6d8b8a20, 0x3ccb9: 0x6d8b8c20, 0x3ccba: 0x6d8b8e20, 0x3ccbb: 0x6d8b9020, - 0x3ccbc: 0x6d8b9220, 0x3ccbd: 0x6dafe220, 0x3ccbe: 0x6dafe420, 0x3ccbf: 0x6dafe620, - // Block 0xf33, offset 0x3ccc0 - 0x3ccc0: 0x6dafe820, 0x3ccc1: 0x6dcf7220, 0x3ccc2: 0x6dcf7420, 0x3ccc3: 0x6dcf7620, - 0x3ccc4: 0x6dcf7820, 0x3ccc5: 0x6de99220, 0x3ccc6: 0x6de99420, 0x3ccc7: 0x6de99620, - 0x3ccc8: 0x6de99820, 0x3ccc9: 0x6de99a20, 0x3ccca: 0x6de99c20, 0x3cccb: 0x6de99e20, - 0x3cccc: 0x6dff8a20, 0x3cccd: 0x6dff8c20, 0x3ccce: 0x6dff8e20, 0x3cccf: 0x6e11fa20, - 0x3ccd0: 0x6e11fc20, 0x3ccd1: 0x6e11fe20, 0x3ccd2: 0x6e203420, 0x3ccd3: 0x6e203620, - 0x3ccd4: 0x6e203820, 0x3ccd5: 0x6e2b3020, 0x3ccd6: 0x6e39a620, 0x3ccd7: 0x6e3dd220, - 0x3ccd8: 0x6e40b420, 0x3ccd9: 0x6c050220, 0x3ccda: 0x6c25c420, 0x3ccdb: 0x6c25c620, - 0x3ccdc: 0x6c25c820, 0x3ccdd: 0x6c25ca20, 0x3ccde: 0x6c3dfc20, 0x3ccdf: 0x6c3dfe20, - 0x3cce0: 0x6c5cba20, 0x3cce1: 0x6c5cbc20, 0x3cce2: 0x6c5cbe20, 0x3cce3: 0x6c5cc020, - 0x3cce4: 0x6c80b620, 0x3cce5: 0x6c80b820, 0x3cce6: 0x6c80ba20, 0x3cce7: 0x6c80bc20, - 0x3cce8: 0x6c80be20, 0x3cce9: 0x6c80c020, 0x3ccea: 0x6ca9dc20, 0x3cceb: 0x6ca9de20, - 0x3ccec: 0x6cd84a20, 0x3cced: 0x6cd84c20, 0x3ccee: 0x6cd84e20, 0x3ccef: 0x6d06ee20, - 0x3ccf0: 0x6d06f020, 0x3ccf1: 0x6d34d820, 0x3ccf2: 0x6d34da20, 0x3ccf3: 0x6d34dc20, - 0x3ccf4: 0x6d34de20, 0x3ccf5: 0x6d618e20, 0x3ccf6: 0x6d619020, 0x3ccf7: 0x6d8ba420, - 0x3ccf8: 0x6daff020, 0x3ccf9: 0x6e120020, 0x3ccfa: 0x6d06fa20, 0x3ccfb: 0x6d34fa20, - 0x3ccfc: 0x6d61a020, 0x3ccfd: 0x6d61a220, 0x3ccfe: 0x6d8bb820, 0x3ccff: 0x6de9b220, - // Block 0xf34, offset 0x3cd00 - 0x3cd00: 0x6c3e1e20, 0x3cd01: 0x6c5cf420, 0x3cd02: 0x6c812020, 0x3cd03: 0x6caa2420, - 0x3cd04: 0x6caa2620, 0x3cd05: 0x6caa2820, 0x3cd06: 0x6d074220, 0x3cd07: 0x6d074420, - 0x3cd08: 0x6d352c20, 0x3cd09: 0x6d61c820, 0x3cd0a: 0x6d8bf020, 0x3cd0b: 0x6dcfa620, - 0x3cd0c: 0x6de9d420, 0x3cd0d: 0x6e120e20, 0x3cd0e: 0x6c3e2c20, 0x3cd0f: 0x6caa6620, - 0x3cd10: 0x6caa6820, 0x3cd11: 0x6caa6a20, 0x3cd12: 0x6caa6c20, 0x3cd13: 0x6cd8a620, - 0x3cd14: 0x6cd8a820, 0x3cd15: 0x6d077a20, 0x3cd16: 0x6d61f020, 0x3cd17: 0x6d61f220, - 0x3cd18: 0x6d61f420, 0x3cd19: 0x6d8c0a20, 0x3cd1a: 0x6db04a20, 0x3cd1b: 0x6db04c20, - 0x3cd1c: 0x6db04e20, 0x3cd1d: 0x6dcfd420, 0x3cd1e: 0x6dcfd620, 0x3cd1f: 0x6dffb020, - 0x3cd20: 0x6e204820, 0x3cd21: 0x6e204a20, 0x3cd22: 0x6c5d2c20, 0x3cd23: 0x6c818e20, - 0x3cd24: 0x6caab020, 0x3cd25: 0x6cd8ec20, 0x3cd26: 0x6cd8ee20, 0x3cd27: 0x6cd8f020, - 0x3cd28: 0x6d07a620, 0x3cd29: 0x6d07a820, 0x3cd2a: 0x6d358a20, 0x3cd2b: 0x6d623820, - 0x3cd2c: 0x6d623a20, 0x3cd2d: 0x6d8c3e20, 0x3cd2e: 0x6d8c4020, 0x3cd2f: 0x6db07020, - 0x3cd30: 0x6dd00820, 0x3cd31: 0x6dd00a20, 0x3cd32: 0x6e205420, 0x3cd33: 0x6c81a020, - 0x3cd34: 0x6c81a220, 0x3cd35: 0x6d07ac20, 0x3cd36: 0x6d359020, 0x3cd37: 0x6d624020, - 0x3cd38: 0x6dd00e20, 0x3cd39: 0x6caace20, 0x3cd3a: 0x6cd90a20, 0x3cd3b: 0x6cd90c20, - 0x3cd3c: 0x6d07be20, 0x3cd3d: 0x6d626620, 0x3cd3e: 0x6d8c6020, 0x3cd3f: 0x6dd02820, - // Block 0xf35, offset 0x3cd40 - 0x3cd40: 0x6c3e5820, 0x3cd41: 0x6c81f820, 0x3cd42: 0x6cd94820, 0x3cd43: 0x6cd94a20, - 0x3cd44: 0x6d07f620, 0x3cd45: 0x6d07f820, 0x3cd46: 0x6d07fa20, 0x3cd47: 0x6d360a20, - 0x3cd48: 0x6d360c20, 0x3cd49: 0x6d62b420, 0x3cd4a: 0x6d8c9220, 0x3cd4b: 0x6d8c9420, - 0x3cd4c: 0x6d8c9620, 0x3cd4d: 0x6d8c9820, 0x3cd4e: 0x6db0c820, 0x3cd4f: 0x6db0ca20, - 0x3cd50: 0x6dd05a20, 0x3cd51: 0x6dd05c20, 0x3cd52: 0x6dea1a20, 0x3cd53: 0x6e42ea20, - 0x3cd54: 0x6d080820, 0x3cd55: 0x6d361820, 0x3cd56: 0x6c3f1420, 0x3cd57: 0x6c3f1620, - 0x3cd58: 0x6c3f1820, 0x3cd59: 0x6c5e3020, 0x3cd5a: 0x6c5e3220, 0x3cd5b: 0x6c5e3420, - 0x3cd5c: 0x6c5e3620, 0x3cd5d: 0x6c82ce20, 0x3cd5e: 0x6c82d020, 0x3cd5f: 0x6cabd620, - 0x3cd60: 0x6cabd820, 0x3cd61: 0x6cabda20, 0x3cd62: 0x6cda6620, 0x3cd63: 0x6cda6820, - 0x3cd64: 0x6cda6a20, 0x3cd65: 0x6cda6c20, 0x3cd66: 0x6d08f220, 0x3cd67: 0x6d08f420, - 0x3cd68: 0x6d08f620, 0x3cd69: 0x6d36d620, 0x3cd6a: 0x6d36d820, 0x3cd6b: 0x6d36da20, - 0x3cd6c: 0x6d36dc20, 0x3cd6d: 0x6d36de20, 0x3cd6e: 0x6d36e020, 0x3cd6f: 0x6d634a20, - 0x3cd70: 0x6d634c20, 0x3cd71: 0x6d634e20, 0x3cd72: 0x6d635020, 0x3cd73: 0x6d635220, - 0x3cd74: 0x6d635420, 0x3cd75: 0x6d8d5020, 0x3cd76: 0x6d8d5220, 0x3cd77: 0x6d8d5420, - 0x3cd78: 0x6d8d5620, 0x3cd79: 0x6db15e20, 0x3cd7a: 0x6db16020, 0x3cd7b: 0x6db16220, - 0x3cd7c: 0x6dd0ac20, 0x3cd7d: 0x6dd0ae20, 0x3cd7e: 0x6dea6420, 0x3cd7f: 0x6dea6620, - // Block 0xf36, offset 0x3cd80 - 0x3cd80: 0x6e001420, 0x3cd81: 0x6e125820, 0x3cd82: 0x6e207c20, 0x3cd83: 0x6e2b6220, - 0x3cd84: 0x6e454220, 0x3cd85: 0x6c82da20, 0x3cd86: 0x6cda7a20, 0x3cd87: 0x6d08f820, - 0x3cd88: 0x6d36ec20, 0x3cd89: 0x6dd0b620, 0x3cd8a: 0x6cda8a20, 0x3cd8b: 0x6d636820, - 0x3cd8c: 0x6dd0ba20, 0x3cd8d: 0x6e3de620, 0x3cd8e: 0x6d090020, 0x3cd8f: 0x6d36fc20, - 0x3cd90: 0x6d36fe20, 0x3cd91: 0x6e001e20, 0x3cd92: 0x6dd0d020, 0x3cd93: 0x6e3dea20, - 0x3cd94: 0x6c3f3220, 0x3cd95: 0x6d091820, 0x3cd96: 0x6d091a20, 0x3cd97: 0x6d8d9420, - 0x3cd98: 0x6dea8420, 0x3cd99: 0x6e208420, 0x3cd9a: 0x6c5e7620, 0x3cd9b: 0x6d377220, - 0x3cd9c: 0x6d63e020, 0x3cd9d: 0x6d63e220, 0x3cd9e: 0x6db1ba20, 0x3cd9f: 0x6dd11620, - 0x3cda0: 0x6e004820, 0x3cda1: 0x6e209620, 0x3cda2: 0x6e209820, 0x3cda3: 0x6e209a20, - 0x3cda4: 0x6d8dd820, 0x3cda5: 0x6c14c620, 0x3cda6: 0x6c14c820, 0x3cda7: 0x6c268420, - 0x3cda8: 0x6c268620, 0x3cda9: 0x6c400220, 0x3cdaa: 0x6c400420, 0x3cdab: 0x6c400620, - 0x3cdac: 0x6c400820, 0x3cdad: 0x6c400a20, 0x3cdae: 0x6c5f7e20, 0x3cdaf: 0x6c5f8020, - 0x3cdb0: 0x6c5f8220, 0x3cdb1: 0x6c5f8420, 0x3cdb2: 0x6c5f8620, 0x3cdb3: 0x6c5f8820, - 0x3cdb4: 0x6c5f8a20, 0x3cdb5: 0x6c5f8c20, 0x3cdb6: 0x6c84b020, 0x3cdb7: 0x6c84b220, - 0x3cdb8: 0x6c84b420, 0x3cdb9: 0x6c84b620, 0x3cdba: 0x6c84b820, 0x3cdbb: 0x6c84ba20, - 0x3cdbc: 0x6c84bc20, 0x3cdbd: 0x6c84be20, 0x3cdbe: 0x6c84c020, 0x3cdbf: 0x6cadf420, - // Block 0xf37, offset 0x3cdc0 - 0x3cdc0: 0x6cadf620, 0x3cdc1: 0x6cadf820, 0x3cdc2: 0x6cadfa20, 0x3cdc3: 0x6cadfc20, - 0x3cdc4: 0x6cadfe20, 0x3cdc5: 0x6cae0020, 0x3cdc6: 0x6cae0220, 0x3cdc7: 0x6cae0420, - 0x3cdc8: 0x6cae0620, 0x3cdc9: 0x6cae0820, 0x3cdca: 0x6cae0a20, 0x3cdcb: 0x6cae0c20, - 0x3cdcc: 0x6cae0e20, 0x3cdcd: 0x6cae1020, 0x3cdce: 0x6cae1220, 0x3cdcf: 0x6cae1420, - 0x3cdd0: 0x6cdd2220, 0x3cdd1: 0x6cdd2420, 0x3cdd2: 0x6cdd2620, 0x3cdd3: 0x6cdd2820, - 0x3cdd4: 0x6cdd2a20, 0x3cdd5: 0x6cdd2c20, 0x3cdd6: 0x6cdd2e20, 0x3cdd7: 0x6cdd3020, - 0x3cdd8: 0x6cdd3220, 0x3cdd9: 0x6cdd3420, 0x3cdda: 0x6cdd3620, 0x3cddb: 0x6cdd3820, - 0x3cddc: 0x6cdd3a20, 0x3cddd: 0x6cdd3c20, 0x3cdde: 0x6cdd3e20, 0x3cddf: 0x6cdd4020, - 0x3cde0: 0x6cdd4220, 0x3cde1: 0x6d0b8c20, 0x3cde2: 0x6d0b8e20, 0x3cde3: 0x6d0b9020, - 0x3cde4: 0x6d0b9220, 0x3cde5: 0x6d0b9420, 0x3cde6: 0x6d0b9620, 0x3cde7: 0x6d0b9820, - 0x3cde8: 0x6d0b9a20, 0x3cde9: 0x6d0b9c20, 0x3cdea: 0x6d0b9e20, 0x3cdeb: 0x6d0ba020, - 0x3cdec: 0x6d0ba220, 0x3cded: 0x6d0ba420, 0x3cdee: 0x6d0ba620, 0x3cdef: 0x6d0ba820, - 0x3cdf0: 0x6cdd4620, 0x3cdf1: 0x6d0baa20, 0x3cdf2: 0x6d0bac20, 0x3cdf3: 0x6d0bae20, - 0x3cdf4: 0x6d0bb020, 0x3cdf5: 0x6d0bb220, 0x3cdf6: 0x6d399220, 0x3cdf7: 0x6d399420, - 0x3cdf8: 0x6d399620, 0x3cdf9: 0x6d399820, 0x3cdfa: 0x6d399a20, 0x3cdfb: 0x6d399c20, - 0x3cdfc: 0x6d399e20, 0x3cdfd: 0x6d39a020, 0x3cdfe: 0x6d39a220, 0x3cdff: 0x6d39a420, - // Block 0xf38, offset 0x3ce00 - 0x3ce00: 0x6d39a620, 0x3ce01: 0x6d39a820, 0x3ce02: 0x6d39aa20, 0x3ce03: 0x6d39ac20, - 0x3ce04: 0x6d39ae20, 0x3ce05: 0x6d39b020, 0x3ce06: 0x6d39b220, 0x3ce07: 0x6d39b420, - 0x3ce08: 0x6d65c420, 0x3ce09: 0x6d65c620, 0x3ce0a: 0x6d65c820, 0x3ce0b: 0x6d65ca20, - 0x3ce0c: 0x6d65cc20, 0x3ce0d: 0x6d65ce20, 0x3ce0e: 0x6d65d020, 0x3ce0f: 0x6d65d220, - 0x3ce10: 0x6d65d420, 0x3ce11: 0x6d65d620, 0x3ce12: 0x6d65d820, 0x3ce13: 0x6d65da20, - 0x3ce14: 0x6d65dc20, 0x3ce15: 0x6d65de20, 0x3ce16: 0x6d65e020, 0x3ce17: 0x6d65e220, - 0x3ce18: 0x6d65e420, 0x3ce19: 0x6d65e620, 0x3ce1a: 0x6d65e820, 0x3ce1b: 0x6d65ea20, - 0x3ce1c: 0x6d65ec20, 0x3ce1d: 0x6d8fb220, 0x3ce1e: 0x6d8fb420, 0x3ce1f: 0x6d8fb620, - 0x3ce20: 0x6d8fb820, 0x3ce21: 0x6d8fba20, 0x3ce22: 0x6d8fbc20, 0x3ce23: 0x6d8fbe20, - 0x3ce24: 0x6d8fc020, 0x3ce25: 0x6db37420, 0x3ce26: 0x6db37620, 0x3ce27: 0x6db37820, - 0x3ce28: 0x6db37a20, 0x3ce29: 0x6db37c20, 0x3ce2a: 0x6db37e20, 0x3ce2b: 0x6db38020, - 0x3ce2c: 0x6db38220, 0x3ce2d: 0x6db38420, 0x3ce2e: 0x6db38620, 0x3ce2f: 0x6db38820, - 0x3ce30: 0x6db38a20, 0x3ce31: 0x6db38c20, 0x3ce32: 0x6db38e20, 0x3ce33: 0x6db39020, - 0x3ce34: 0x6db39220, 0x3ce35: 0x6dd27620, 0x3ce36: 0x6dd27820, 0x3ce37: 0x6dd27a20, - 0x3ce38: 0x6dd27c20, 0x3ce39: 0x6dd27e20, 0x3ce3a: 0x6dd28020, 0x3ce3b: 0x6dd28220, - 0x3ce3c: 0x6dd28420, 0x3ce3d: 0x6dd28620, 0x3ce3e: 0x6dd28820, 0x3ce3f: 0x6dd28a20, - // Block 0xf39, offset 0x3ce40 - 0x3ce40: 0x6dd28c20, 0x3ce41: 0x6dd28e20, 0x3ce42: 0x6dd29020, 0x3ce43: 0x6dd29220, - 0x3ce44: 0x6dd29420, 0x3ce45: 0x6debc020, 0x3ce46: 0x6debc220, 0x3ce47: 0x6debc420, - 0x3ce48: 0x6debc620, 0x3ce49: 0x6debc820, 0x3ce4a: 0x6debca20, 0x3ce4b: 0x6debcc20, - 0x3ce4c: 0x6e014c20, 0x3ce4d: 0x6e014e20, 0x3ce4e: 0x6e015020, 0x3ce4f: 0x6e015220, - 0x3ce50: 0x6e133820, 0x3ce51: 0x6e133a20, 0x3ce52: 0x6e133c20, 0x3ce53: 0x6e133e20, - 0x3ce54: 0x6e211820, 0x3ce55: 0x6e211a20, 0x3ce56: 0x6e211c20, 0x3ce57: 0x6e2bd420, - 0x3ce58: 0x6e342020, 0x3ce59: 0x6e342220, 0x3ce5a: 0x6e342420, 0x3ce5b: 0x6e3e0e20, - 0x3ce5c: 0x6e3e1020, 0x3ce5d: 0x6c5f9e20, 0x3ce5e: 0x6c5fa020, 0x3ce5f: 0x6c84dc20, - 0x3ce60: 0x6cdd6220, 0x3ce61: 0x6cdd6420, 0x3ce62: 0x6d39da20, 0x3ce63: 0x6db3b220, - 0x3ce64: 0x6c403420, 0x3ce65: 0x6c5ff220, 0x3ce66: 0x6c5ff420, 0x3ce67: 0x6c857820, - 0x3ce68: 0x6c857a20, 0x3ce69: 0x6c857c20, 0x3ce6a: 0x6c857e20, 0x3ce6b: 0x6c858020, - 0x3ce6c: 0x6caf0c20, 0x3ce6d: 0x6caf0e20, 0x3ce6e: 0x6caf1020, 0x3ce6f: 0x6caf1220, - 0x3ce70: 0x6caf1420, 0x3ce71: 0x6caf1620, 0x3ce72: 0x6caf1820, 0x3ce73: 0x6cde3020, - 0x3ce74: 0x6cde3220, 0x3ce75: 0x6cde3420, 0x3ce76: 0x6cde3620, 0x3ce77: 0x6cde3820, - 0x3ce78: 0x6cde3a20, 0x3ce79: 0x6cde3c20, 0x3ce7a: 0x6cde3e20, 0x3ce7b: 0x6cde4020, - 0x3ce7c: 0x6cde4220, 0x3ce7d: 0x6d0cb020, 0x3ce7e: 0x6d0cb220, 0x3ce7f: 0x6d0cb420, - // Block 0xf3a, offset 0x3ce80 - 0x3ce80: 0x6d0cb620, 0x3ce81: 0x6d0cb820, 0x3ce82: 0x6d3afc20, 0x3ce83: 0x6d3afe20, - 0x3ce84: 0x6d3b0020, 0x3ce85: 0x6d3b0220, 0x3ce86: 0x6d3b0420, 0x3ce87: 0x6d3b0620, - 0x3ce88: 0x6d3b0820, 0x3ce89: 0x6d3b0a20, 0x3ce8a: 0x6d672e20, 0x3ce8b: 0x6d673020, - 0x3ce8c: 0x6d673220, 0x3ce8d: 0x6d673420, 0x3ce8e: 0x6d673620, 0x3ce8f: 0x6d910820, - 0x3ce90: 0x6d910a20, 0x3ce91: 0x6d910c20, 0x3ce92: 0x6d910e20, 0x3ce93: 0x6d911020, - 0x3ce94: 0x6d911220, 0x3ce95: 0x6d911420, 0x3ce96: 0x6db4be20, 0x3ce97: 0x6db4c020, - 0x3ce98: 0x6db4c220, 0x3ce99: 0x6db4c420, 0x3ce9a: 0x6dd38e20, 0x3ce9b: 0x6dd39020, - 0x3ce9c: 0x6dd39220, 0x3ce9d: 0x6dd39420, 0x3ce9e: 0x6dd39620, 0x3ce9f: 0x6dec9c20, - 0x3cea0: 0x6dec9e20, 0x3cea1: 0x6deca020, 0x3cea2: 0x6deca220, 0x3cea3: 0x6e01d420, - 0x3cea4: 0x6e01d620, 0x3cea5: 0x6e01d820, 0x3cea6: 0x6e13c220, 0x3cea7: 0x6e13c420, - 0x3cea8: 0x6e218420, 0x3cea9: 0x6e447620, 0x3ceaa: 0x6c859220, 0x3ceab: 0x6caf2420, - 0x3ceac: 0x6db4ce20, 0x3cead: 0x6caf3220, 0x3ceae: 0x6cde6820, 0x3ceaf: 0x6d675420, - 0x3ceb0: 0x6dd3a820, 0x3ceb1: 0x6e2c2020, 0x3ceb2: 0x6c605e20, 0x3ceb3: 0x6c606020, - 0x3ceb4: 0x6c606220, 0x3ceb5: 0x6c861c20, 0x3ceb6: 0x6c861e20, 0x3ceb7: 0x6c862020, - 0x3ceb8: 0x6cafd820, 0x3ceb9: 0x6cafda20, 0x3ceba: 0x6cafdc20, 0x3cebb: 0x6cafde20, - 0x3cebc: 0x6cafe020, 0x3cebd: 0x6cdef420, 0x3cebe: 0x6d0d6820, 0x3cebf: 0x6d0d6a20, - // Block 0xf3b, offset 0x3cec0 - 0x3cec0: 0x6d0d6c20, 0x3cec1: 0x6d0d6e20, 0x3cec2: 0x6d0d7020, 0x3cec3: 0x6d0d7220, - 0x3cec4: 0x6d0d7420, 0x3cec5: 0x6d3bd820, 0x3cec6: 0x6d3bda20, 0x3cec7: 0x6d67ec20, - 0x3cec8: 0x6d67ee20, 0x3cec9: 0x6d67f020, 0x3ceca: 0x6d91ae20, 0x3cecb: 0x6d91b020, - 0x3cecc: 0x6d91b220, 0x3cecd: 0x6d91b420, 0x3cece: 0x6d91b620, 0x3cecf: 0x6d91b820, - 0x3ced0: 0x6db57820, 0x3ced1: 0x6db57a20, 0x3ced2: 0x6db57c20, 0x3ced3: 0x6dd40a20, - 0x3ced4: 0x6dd40c20, 0x3ced5: 0x6decfc20, 0x3ced6: 0x6e021620, 0x3ced7: 0x6e21a020, - 0x3ced8: 0x6e2c3420, 0x3ced9: 0x6e2c3620, 0x3ceda: 0x6cafec20, 0x3cedb: 0x6d91c020, - 0x3cedc: 0x6c863c20, 0x3cedd: 0x6cdf3220, 0x3cede: 0x6d0daa20, 0x3cedf: 0x6d3c1a20, - 0x3cee0: 0x6d3c1c20, 0x3cee1: 0x6d683020, 0x3cee2: 0x6d91fe20, 0x3cee3: 0x6d920020, - 0x3cee4: 0x6dd43420, 0x3cee5: 0x6e022c20, 0x3cee6: 0x6e3a3220, 0x3cee7: 0x6e3a3420, - 0x3cee8: 0x6c607820, 0x3cee9: 0x6c607a20, 0x3ceea: 0x6c864020, 0x3ceeb: 0x6d0dae20, - 0x3ceec: 0x6d683820, 0x3ceed: 0x6db5a620, 0x3ceee: 0x6d0dd820, 0x3ceef: 0x6d0dda20, - 0x3cef0: 0x6d922e20, 0x3cef1: 0x6d923020, 0x3cef2: 0x6c868c20, 0x3cef3: 0x6c868e20, - 0x3cef4: 0x6cb10620, 0x3cef5: 0x6cb10820, 0x3cef6: 0x6ce02420, 0x3cef7: 0x6ce02620, - 0x3cef8: 0x6ce02820, 0x3cef9: 0x6ce02a20, 0x3cefa: 0x6d0eae20, 0x3cefb: 0x6d0eb020, - 0x3cefc: 0x6d3d0020, 0x3cefd: 0x6d3d0220, 0x3cefe: 0x6d3d0420, 0x3ceff: 0x6d697220, - // Block 0xf3c, offset 0x3cf00 - 0x3cf00: 0x6d697420, 0x3cf01: 0x6d92f220, 0x3cf02: 0x6d92f420, 0x3cf03: 0x6d92f620, - 0x3cf04: 0x6d92f820, 0x3cf05: 0x6d92fa20, 0x3cf06: 0x6db69220, 0x3cf07: 0x6db69420, - 0x3cf08: 0x6db69620, 0x3cf09: 0x6dd4f220, 0x3cf0a: 0x6dd4f420, 0x3cf0b: 0x6dd4f620, - 0x3cf0c: 0x6dd4f820, 0x3cf0d: 0x6dedda20, 0x3cf0e: 0x6deddc20, 0x3cf0f: 0x6dedde20, - 0x3cf10: 0x6e02b220, 0x3cf11: 0x6e02b420, 0x3cf12: 0x6e146a20, 0x3cf13: 0x6e2c7420, - 0x3cf14: 0x6e34a220, 0x3cf15: 0x6e34a420, 0x3cf16: 0x6e34a620, 0x3cf17: 0x6e3e4220, - 0x3cf18: 0x6e431c20, 0x3cf19: 0x6c0a7c20, 0x3cf1a: 0x6c14fa20, 0x3cf1b: 0x6c14fc20, - 0x3cf1c: 0x6c26d820, 0x3cf1d: 0x6c26da20, 0x3cf1e: 0x6c26dc20, 0x3cf1f: 0x6c26de20, - 0x3cf20: 0x6c26e020, 0x3cf21: 0x6c26e220, 0x3cf22: 0x6c40ac20, 0x3cf23: 0x6c40ae20, - 0x3cf24: 0x6c40b020, 0x3cf25: 0x6c40b220, 0x3cf26: 0x6c40b420, 0x3cf27: 0x6c60b620, - 0x3cf28: 0x6c60b820, 0x3cf29: 0x6c60ba20, 0x3cf2a: 0x6c60bc20, 0x3cf2b: 0x6c86b820, - 0x3cf2c: 0x6c86ba20, 0x3cf2d: 0x6c86bc20, 0x3cf2e: 0x6c86be20, 0x3cf2f: 0x6cb13420, - 0x3cf30: 0x6cb13620, 0x3cf31: 0x6cb13820, 0x3cf32: 0x6cb13a20, 0x3cf33: 0x6cb13c20, - 0x3cf34: 0x6cb13e20, 0x3cf35: 0x6ce03e20, 0x3cf36: 0x6ce04020, 0x3cf37: 0x6ce04220, - 0x3cf38: 0x6ce04420, 0x3cf39: 0x6d0ebe20, 0x3cf3a: 0x6d0ec020, 0x3cf3b: 0x6d3d1220, - 0x3cf3c: 0x6d3d1420, 0x3cf3d: 0x6d698220, 0x3cf3e: 0x6d92fe20, 0x3cf3f: 0x6db69c20, - // Block 0xf3d, offset 0x3cf40 - 0x3cf40: 0x6c60c020, 0x3cf41: 0x6cb14e20, 0x3cf42: 0x6d699420, 0x3cf43: 0x6d69b220, - 0x3cf44: 0x6dd51220, 0x3cf45: 0x6c40bc20, 0x3cf46: 0x6cb17620, 0x3cf47: 0x6d3d4a20, - 0x3cf48: 0x6d3d4c20, 0x3cf49: 0x6d933e20, 0x3cf4a: 0x6c86ee20, 0x3cf4b: 0x6d0f2420, - 0x3cf4c: 0x6d936620, 0x3cf4d: 0x6db70220, 0x3cf4e: 0x6c60da20, 0x3cf4f: 0x6c870a20, - 0x3cf50: 0x6c870c20, 0x3cf51: 0x6c870e20, 0x3cf52: 0x6cb1d820, 0x3cf53: 0x6cb1da20, - 0x3cf54: 0x6ce11420, 0x3cf55: 0x6ce11620, 0x3cf56: 0x6d0f8e20, 0x3cf57: 0x6d3dbc20, - 0x3cf58: 0x6d3dbe20, 0x3cf59: 0x6d3dc020, 0x3cf5a: 0x6d6a6820, 0x3cf5b: 0x6d6a6a20, - 0x3cf5c: 0x6d93b820, 0x3cf5d: 0x6d93ba20, 0x3cf5e: 0x6d93bc20, 0x3cf5f: 0x6db73c20, - 0x3cf60: 0x6db73e20, 0x3cf61: 0x6dd59220, 0x3cf62: 0x6dee7a20, 0x3cf63: 0x6e225420, - 0x3cf64: 0x6e225620, 0x3cf65: 0x6e2ca420, 0x3cf66: 0x6c60f620, 0x3cf67: 0x6c60f820, - 0x3cf68: 0x6cb1e620, 0x3cf69: 0x6ce13420, 0x3cf6a: 0x6d0f9620, 0x3cf6b: 0x6d93ca20, - 0x3cf6c: 0x6dd59420, 0x3cf6d: 0x6ce13c20, 0x3cf6e: 0x6d0fa620, 0x3cf6f: 0x6d6a8020, - 0x3cf70: 0x6dd59a20, 0x3cf71: 0x6cb23c20, 0x3cf72: 0x6ce19a20, 0x3cf73: 0x6d100420, - 0x3cf74: 0x6d100620, 0x3cf75: 0x6d3e3420, 0x3cf76: 0x6d3e3620, 0x3cf77: 0x6d3e3820, - 0x3cf78: 0x6d6ad420, 0x3cf79: 0x6d6ad620, 0x3cf7a: 0x6d6ad820, 0x3cf7b: 0x6d942e20, - 0x3cf7c: 0x6d943020, 0x3cf7d: 0x6db78220, 0x3cf7e: 0x6dd5d820, 0x3cf7f: 0x6dd5da20, - // Block 0xf3e, offset 0x3cf80 - 0x3cf80: 0x6c877e20, 0x3cf81: 0x6cb2a420, 0x3cf82: 0x6cb2a620, 0x3cf83: 0x6cb2a820, - 0x3cf84: 0x6ce23420, 0x3cf85: 0x6ce23620, 0x3cf86: 0x6ce23820, 0x3cf87: 0x6d10a620, - 0x3cf88: 0x6d10a820, 0x3cf89: 0x6d10aa20, 0x3cf8a: 0x6d10ac20, 0x3cf8b: 0x6d10ae20, - 0x3cf8c: 0x6d3edc20, 0x3cf8d: 0x6d3ede20, 0x3cf8e: 0x6d3ee020, 0x3cf8f: 0x6d6b8e20, - 0x3cf90: 0x6d6b9020, 0x3cf91: 0x6d6b9220, 0x3cf92: 0x6d6b9420, 0x3cf93: 0x6d6b9620, - 0x3cf94: 0x6d94d820, 0x3cf95: 0x6d94da20, 0x3cf96: 0x6d94dc20, 0x3cf97: 0x6d94de20, - 0x3cf98: 0x6d94e020, 0x3cf99: 0x6db81020, 0x3cf9a: 0x6db81220, 0x3cf9b: 0x6db81420, - 0x3cf9c: 0x6dd6a220, 0x3cf9d: 0x6dd6a420, 0x3cf9e: 0x6dd6a620, 0x3cf9f: 0x6dd6a820, - 0x3cfa0: 0x6def6020, 0x3cfa1: 0x6def6220, 0x3cfa2: 0x6def6420, 0x3cfa3: 0x6e039220, - 0x3cfa4: 0x6e039420, 0x3cfa5: 0x6e039620, 0x3cfa6: 0x6e039820, 0x3cfa7: 0x6e150220, - 0x3cfa8: 0x6e150420, 0x3cfa9: 0x6e2ce620, 0x3cfaa: 0x6d10dc20, 0x3cfab: 0x6d10de20, - 0x3cfac: 0x6d3f0020, 0x3cfad: 0x6db83220, 0x3cfae: 0x6db83420, 0x3cfaf: 0x6dd6be20, - 0x3cfb0: 0x6def9020, 0x3cfb1: 0x6e03aa20, 0x3cfb2: 0x6c87b620, 0x3cfb3: 0x6cb33620, - 0x3cfb4: 0x6ce2d420, 0x3cfb5: 0x6ce2d620, 0x3cfb6: 0x6d3f5820, 0x3cfb7: 0x6d3f5a20, - 0x3cfb8: 0x6d3f5c20, 0x3cfb9: 0x6d6c4c20, 0x3cfba: 0x6d956c20, 0x3cfbb: 0x6d956e20, - 0x3cfbc: 0x6db89620, 0x3cfbd: 0x6db89820, 0x3cfbe: 0x6dd71220, 0x3cfbf: 0x6dd71420, - // Block 0xf3f, offset 0x3cfc0 - 0x3cfc0: 0x6defc620, 0x3cfc1: 0x6e03e820, 0x3cfc2: 0x6e153420, 0x3cfc3: 0x6e469220, - 0x3cfc4: 0x6c271620, 0x3cfc5: 0x6c271820, 0x3cfc6: 0x6c271a20, 0x3cfc7: 0x6c40f420, - 0x3cfc8: 0x6c615e20, 0x3cfc9: 0x6c616020, 0x3cfca: 0x6c616220, 0x3cfcb: 0x6c87cc20, - 0x3cfcc: 0x6c87ce20, 0x3cfcd: 0x6cb34020, 0x3cfce: 0x6ce2e820, 0x3cfcf: 0x6ce2ea20, - 0x3cfd0: 0x6ce2ec20, 0x3cfd1: 0x6ce2ee20, 0x3cfd2: 0x6d114a20, 0x3cfd3: 0x6c87d020, - 0x3cfd4: 0x6d3f6420, 0x3cfd5: 0x6d6c5020, 0x3cfd6: 0x6d6c5220, 0x3cfd7: 0x6d957620, - 0x3cfd8: 0x6db89a20, 0x3cfd9: 0x6defc820, 0x3cfda: 0x6ce2f820, 0x3cfdb: 0x6d115a20, - 0x3cfdc: 0x6d115c20, 0x3cfdd: 0x6e03f620, 0x3cfde: 0x6c052020, 0x3cfdf: 0x6c153820, - 0x3cfe0: 0x6c278620, 0x3cfe1: 0x6c278820, 0x3cfe2: 0x6c417620, 0x3cfe3: 0x6c417820, - 0x3cfe4: 0x6c417a20, 0x3cfe5: 0x6c61d020, 0x3cfe6: 0x6c886020, 0x3cfe7: 0x6c886220, - 0x3cfe8: 0x6c886420, 0x3cfe9: 0x6c886620, 0x3cfea: 0x6c886820, 0x3cfeb: 0x6cb3ec20, - 0x3cfec: 0x6cb3ee20, 0x3cfed: 0x6cb3f020, 0x3cfee: 0x6cb3f220, 0x3cfef: 0x6cb3f420, - 0x3cff0: 0x6cb3f620, 0x3cff1: 0x6cb3f820, 0x3cff2: 0x6cb3fa20, 0x3cff3: 0x6ce3ac20, - 0x3cff4: 0x6ce3ae20, 0x3cff5: 0x6ce3b020, 0x3cff6: 0x6ce3b220, 0x3cff7: 0x6ce3b420, - 0x3cff8: 0x6ce3b620, 0x3cff9: 0x6ce3b820, 0x3cffa: 0x6d11f420, 0x3cffb: 0x6d11f620, - 0x3cffc: 0x6d11f820, 0x3cffd: 0x6d11fa20, 0x3cffe: 0x6d3ff820, 0x3cfff: 0x6d3ffa20, - // Block 0xf40, offset 0x3d000 - 0x3d000: 0x6d3ffc20, 0x3d001: 0x6d3ffe20, 0x3d002: 0x6d400020, 0x3d003: 0x6d400220, - 0x3d004: 0x6d6cea20, 0x3d005: 0x6d6cec20, 0x3d006: 0x6d6cee20, 0x3d007: 0x6d6cf020, - 0x3d008: 0x6d6cf220, 0x3d009: 0x6d6cf420, 0x3d00a: 0x6d6cf620, 0x3d00b: 0x6d95f620, - 0x3d00c: 0x6db8fc20, 0x3d00d: 0x6db8fe20, 0x3d00e: 0x6db90020, 0x3d00f: 0x6db90220, - 0x3d010: 0x6dd75220, 0x3d011: 0x6dd75420, 0x3d012: 0x6e041e20, 0x3d013: 0x6e042020, - 0x3d014: 0x6e042220, 0x3d015: 0x6e042420, 0x3d016: 0x6e154c20, 0x3d017: 0x6c0aa820, - 0x3d018: 0x6c158820, 0x3d019: 0x6c158a20, 0x3d01a: 0x6c27e620, 0x3d01b: 0x6c27e820, - 0x3d01c: 0x6c41d820, 0x3d01d: 0x6c624e20, 0x3d01e: 0x6c625020, 0x3d01f: 0x6c625220, - 0x3d020: 0x6c88e220, 0x3d021: 0x6c88e420, 0x3d022: 0x6c88e620, 0x3d023: 0x6cb46e20, - 0x3d024: 0x6cb47020, 0x3d025: 0x6ce41a20, 0x3d026: 0x6ce41c20, 0x3d027: 0x6d126420, - 0x3d028: 0x6d126620, 0x3d029: 0x6d126820, 0x3d02a: 0x6d6d4420, 0x3d02b: 0x6d6d4620, - 0x3d02c: 0x6d962e20, 0x3d02d: 0x6db93220, 0x3d02e: 0x6dd77a20, 0x3d02f: 0x6dd77c20, - 0x3d030: 0x6dd77e20, 0x3d031: 0x6e043220, 0x3d032: 0x6e433620, 0x3d033: 0x6c890420, - 0x3d034: 0x6d12b620, 0x3d035: 0x6d12b820, 0x3d036: 0x6d40c420, 0x3d037: 0x6d40c620, - 0x3d038: 0x6d40c820, 0x3d039: 0x6d6da420, 0x3d03a: 0x6db98e20, 0x3d03b: 0x6dd7ca20, - 0x3d03c: 0x6df05020, 0x3d03d: 0x6df05220, 0x3d03e: 0x6e157620, 0x3d03f: 0x6e2d3820, - // Block 0xf41, offset 0x3d040 - 0x3d040: 0x6ce46e20, 0x3d041: 0x6cb4d220, 0x3d042: 0x6ce47a20, 0x3d043: 0x6d40d220, - 0x3d044: 0x6db99e20, 0x3d045: 0x6df05420, 0x3d046: 0x6cb51a20, 0x3d047: 0x6cb51c20, - 0x3d048: 0x6cb51e20, 0x3d049: 0x6cb52020, 0x3d04a: 0x6ce51a20, 0x3d04b: 0x6ce51c20, - 0x3d04c: 0x6ce51e20, 0x3d04d: 0x6ce52020, 0x3d04e: 0x6ce52220, 0x3d04f: 0x6d139220, - 0x3d050: 0x6d139420, 0x3d051: 0x6d139620, 0x3d052: 0x6d139820, 0x3d053: 0x6d139a20, - 0x3d054: 0x6d139c20, 0x3d055: 0x6d41ac20, 0x3d056: 0x6d41ae20, 0x3d057: 0x6d41b020, - 0x3d058: 0x6d41b220, 0x3d059: 0x6d41b420, 0x3d05a: 0x6d41b620, 0x3d05b: 0x6d41b820, - 0x3d05c: 0x6d41ba20, 0x3d05d: 0x6d6ebe20, 0x3d05e: 0x6d6ec020, 0x3d05f: 0x6d6ec220, - 0x3d060: 0x6d6ec420, 0x3d061: 0x6d6ec620, 0x3d062: 0x6d6ec820, 0x3d063: 0x6d6eca20, - 0x3d064: 0x6d6ecc20, 0x3d065: 0x6d6ece20, 0x3d066: 0x6d97d820, 0x3d067: 0x6d97da20, - 0x3d068: 0x6d97dc20, 0x3d069: 0x6d97de20, 0x3d06a: 0x6d97e020, 0x3d06b: 0x6d97e220, - 0x3d06c: 0x6d97e420, 0x3d06d: 0x6d97e620, 0x3d06e: 0x6d97e820, 0x3d06f: 0x6d97ea20, - 0x3d070: 0x6dbadc20, 0x3d071: 0x6dbade20, 0x3d072: 0x6dbae020, 0x3d073: 0x6dbae220, - 0x3d074: 0x6dbae420, 0x3d075: 0x6dbae620, 0x3d076: 0x6dbae820, 0x3d077: 0x6dbaea20, - 0x3d078: 0x6dd8ea20, 0x3d079: 0x6dd8ec20, 0x3d07a: 0x6dd8ee20, 0x3d07b: 0x6dd8f020, - 0x3d07c: 0x6dd8f220, 0x3d07d: 0x6dd8f420, 0x3d07e: 0x6dd8f620, 0x3d07f: 0x6df15420, - // Block 0xf42, offset 0x3d080 - 0x3d080: 0x6df15620, 0x3d081: 0x6df15820, 0x3d082: 0x6df15a20, 0x3d083: 0x6df15c20, - 0x3d084: 0x6e057220, 0x3d085: 0x6e057420, 0x3d086: 0x6e057620, 0x3d087: 0x6e057820, - 0x3d088: 0x6e057a20, 0x3d089: 0x6e057c20, 0x3d08a: 0x6e057e20, 0x3d08b: 0x6e058020, - 0x3d08c: 0x6e058220, 0x3d08d: 0x6e058420, 0x3d08e: 0x6e058620, 0x3d08f: 0x6e164020, - 0x3d090: 0x6e164220, 0x3d091: 0x6e164420, 0x3d092: 0x6e164620, 0x3d093: 0x6e164820, - 0x3d094: 0x6e164a20, 0x3d095: 0x6e164c20, 0x3d096: 0x6e238a20, 0x3d097: 0x6e238c20, - 0x3d098: 0x6e238e20, 0x3d099: 0x6e239020, 0x3d09a: 0x6e239220, 0x3d09b: 0x6e2db420, - 0x3d09c: 0x6e2db620, 0x3d09d: 0x6e356020, 0x3d09e: 0x6e356220, 0x3d09f: 0x6e356420, - 0x3d0a0: 0x6e3ae220, 0x3d0a1: 0x6e3ae420, 0x3d0a2: 0x6e3ae620, 0x3d0a3: 0x6e3eae20, - 0x3d0a4: 0x6e415e20, 0x3d0a5: 0x6c27fc20, 0x3d0a6: 0x6c41fa20, 0x3d0a7: 0x6c629c20, - 0x3d0a8: 0x6c629e20, 0x3d0a9: 0x6c62a020, 0x3d0aa: 0x6c62a220, 0x3d0ab: 0x6c62a420, - 0x3d0ac: 0x6c897a20, 0x3d0ad: 0x6c897c20, 0x3d0ae: 0x6c897e20, 0x3d0af: 0x6cb57420, - 0x3d0b0: 0x6cb57620, 0x3d0b1: 0x6cb57820, 0x3d0b2: 0x6cb57a20, 0x3d0b3: 0x6cb57c20, - 0x3d0b4: 0x6cb57e20, 0x3d0b5: 0x6ce56a20, 0x3d0b6: 0x6ce56c20, 0x3d0b7: 0x6ce56e20, - 0x3d0b8: 0x6d13e420, 0x3d0b9: 0x6d13e620, 0x3d0ba: 0x6d13e820, 0x3d0bb: 0x6d13ea20, - 0x3d0bc: 0x6d13ec20, 0x3d0bd: 0x6d13ee20, 0x3d0be: 0x6d13f020, 0x3d0bf: 0x6d13f220, - // Block 0xf43, offset 0x3d0c0 - 0x3d0c0: 0x6d41ee20, 0x3d0c1: 0x6d41f020, 0x3d0c2: 0x6d41f220, 0x3d0c3: 0x6d41f420, - 0x3d0c4: 0x6d41f620, 0x3d0c5: 0x6d6ef620, 0x3d0c6: 0x6d6ef820, 0x3d0c7: 0x6d6efa20, - 0x3d0c8: 0x6d6efc20, 0x3d0c9: 0x6d980820, 0x3d0ca: 0x6d980a20, 0x3d0cb: 0x6dbb0c20, - 0x3d0cc: 0x6dbb0e20, 0x3d0cd: 0x6dbb1020, 0x3d0ce: 0x6dbb1220, 0x3d0cf: 0x6dbb1420, - 0x3d0d0: 0x6dd90c20, 0x3d0d1: 0x6dd90e20, 0x3d0d2: 0x6df16020, 0x3d0d3: 0x6e164e20, - 0x3d0d4: 0x6e2db820, 0x3d0d5: 0x6e356620, 0x3d0d6: 0x6d141620, 0x3d0d7: 0x6d6f1a20, - 0x3d0d8: 0x6c62b220, 0x3d0d9: 0x6cb5c220, 0x3d0da: 0x6ce5e620, 0x3d0db: 0x6ce5e820, - 0x3d0dc: 0x6d146420, 0x3d0dd: 0x6d146620, 0x3d0de: 0x6d146820, 0x3d0df: 0x6d146a20, - 0x3d0e0: 0x6d146c20, 0x3d0e1: 0x6d6f7a20, 0x3d0e2: 0x6d6f7c20, 0x3d0e3: 0x6d6f7e20, - 0x3d0e4: 0x6d6f8020, 0x3d0e5: 0x6d988820, 0x3d0e6: 0x6d988a20, 0x3d0e7: 0x6d988c20, - 0x3d0e8: 0x6dbb8420, 0x3d0e9: 0x6df1a020, 0x3d0ea: 0x6e168e20, 0x3d0eb: 0x6e3af820, - 0x3d0ec: 0x6c15a020, 0x3d0ed: 0x6c281820, 0x3d0ee: 0x6c281a20, 0x3d0ef: 0x6c281c20, - 0x3d0f0: 0x6c420c20, 0x3d0f1: 0x6c62ca20, 0x3d0f2: 0x6c899e20, 0x3d0f3: 0x6c89a020, - 0x3d0f4: 0x6cb5d820, 0x3d0f5: 0x6d147a20, 0x3d0f6: 0x6d147c20, 0x3d0f7: 0x6d426620, - 0x3d0f8: 0x6d426820, 0x3d0f9: 0x6dbb8a20, 0x3d0fa: 0x6c0ac020, 0x3d0fb: 0x6c15d020, - 0x3d0fc: 0x6c287820, 0x3d0fd: 0x6c287a20, 0x3d0fe: 0x6c426c20, 0x3d0ff: 0x6c426e20, - // Block 0xf44, offset 0x3d100 - 0x3d100: 0x6c427020, 0x3d101: 0x6c632620, 0x3d102: 0x6c632820, 0x3d103: 0x6c632a20, - 0x3d104: 0x6c8a2c20, 0x3d105: 0x6c8a2e20, 0x3d106: 0x6cb64e20, 0x3d107: 0x6cb65020, - 0x3d108: 0x6cb65220, 0x3d109: 0x6cb65420, 0x3d10a: 0x6cb65620, 0x3d10b: 0x6cb65820, - 0x3d10c: 0x6cb65a20, 0x3d10d: 0x6cb65c20, 0x3d10e: 0x6ce68620, 0x3d10f: 0x6ce68820, - 0x3d110: 0x6d14d620, 0x3d111: 0x6d14d820, 0x3d112: 0x6d14da20, 0x3d113: 0x6d14dc20, - 0x3d114: 0x6d42c420, 0x3d115: 0x6d42c620, 0x3d116: 0x6d42c820, 0x3d117: 0x6d42ca20, - 0x3d118: 0x6dd98420, 0x3d119: 0x6d6fca20, 0x3d11a: 0x6ce6bc20, 0x3d11b: 0x6d430a20, - 0x3d11c: 0x6dd9ba20, 0x3d11d: 0x6c8a4620, 0x3d11e: 0x6cb69620, 0x3d11f: 0x6ce6f220, - 0x3d120: 0x6ce6f420, 0x3d121: 0x6d155020, 0x3d122: 0x6d155220, 0x3d123: 0x6d434c20, - 0x3d124: 0x6d434e20, 0x3d125: 0x6d704a20, 0x3d126: 0x6d704c20, 0x3d127: 0x6d997620, - 0x3d128: 0x6d997820, 0x3d129: 0x6dbc4e20, 0x3d12a: 0x6dbc5020, 0x3d12b: 0x6dda1a20, - 0x3d12c: 0x6df23220, 0x3d12d: 0x6df23420, 0x3d12e: 0x6e066820, 0x3d12f: 0x6e066a20, - 0x3d130: 0x6e066c20, 0x3d131: 0x6e066e20, 0x3d132: 0x6e16ea20, 0x3d133: 0x6e240820, - 0x3d134: 0x6e240a20, 0x3d135: 0x6e35ae20, 0x3d136: 0x6e35b020, 0x3d137: 0x6e44b220, - 0x3d138: 0x6cb69a20, 0x3d139: 0x6d156020, 0x3d13a: 0x6d156220, 0x3d13b: 0x6d998220, - 0x3d13c: 0x6df23820, 0x3d13d: 0x6d435a20, 0x3d13e: 0x6e16ee20, 0x3d13f: 0x6e3b1c20, - // Block 0xf45, offset 0x3d140 - 0x3d140: 0x6d437c20, 0x3d141: 0x6d707020, 0x3d142: 0x6d99a020, 0x3d143: 0x6dda2e20, - 0x3d144: 0x6e170820, 0x3d145: 0x6d43d420, 0x3d146: 0x6d43d620, 0x3d147: 0x6d70be20, - 0x3d148: 0x6d70c020, 0x3d149: 0x6e06d220, 0x3d14a: 0x6e173e20, 0x3d14b: 0x6e244420, - 0x3d14c: 0x6c8a4e20, 0x3d14d: 0x6d15d220, 0x3d14e: 0x6dbce620, 0x3d14f: 0x6e06e820, - 0x3d150: 0x6e35d620, 0x3d151: 0x6c428420, 0x3d152: 0x6c8a5020, 0x3d153: 0x6ce73a20, - 0x3d154: 0x6d43fe20, 0x3d155: 0x6d440020, 0x3d156: 0x6d9a0220, 0x3d157: 0x6d15f020, - 0x3d158: 0x6d441020, 0x3d159: 0x6ddad820, 0x3d15a: 0x6e070420, 0x3d15b: 0x6e176420, - 0x3d15c: 0x6e3b3420, 0x3d15d: 0x6d163c20, 0x3d15e: 0x6d447020, 0x3d15f: 0x6d9aae20, - 0x3d160: 0x6d9ab020, 0x3d161: 0x6dbd6820, 0x3d162: 0x6ddb3a20, 0x3d163: 0x6ddb3c20, - 0x3d164: 0x6df33620, 0x3d165: 0x6e074420, 0x3d166: 0x6e074620, 0x3d167: 0x6e17a820, - 0x3d168: 0x6e248e20, 0x3d169: 0x6e35f020, 0x3d16a: 0x6c634c20, 0x3d16b: 0x6c8a6420, - 0x3d16c: 0x6cb6c820, 0x3d16d: 0x6cb6ca20, 0x3d16e: 0x6ce77020, 0x3d16f: 0x6ce77220, - 0x3d170: 0x6ce77420, 0x3d171: 0x6ce77620, 0x3d172: 0x6d164c20, 0x3d173: 0x6d164e20, - 0x3d174: 0x6d447820, 0x3d175: 0x6d447a20, 0x3d176: 0x6d447c20, 0x3d177: 0x6d716a20, - 0x3d178: 0x6d9aba20, 0x3d179: 0x6dbd6a20, 0x3d17a: 0x6e17ac20, 0x3d17b: 0x6d167e20, - 0x3d17c: 0x6d44b420, 0x3d17d: 0x6dbdb620, 0x3d17e: 0x6ddb8220, 0x3d17f: 0x6ddb8420, - // Block 0xf46, offset 0x3d180 - 0x3d180: 0x6df37220, 0x3d181: 0x6df37420, 0x3d182: 0x6df37620, 0x3d183: 0x6e249e20, - 0x3d184: 0x6e24a020, 0x3d185: 0x6e2e7620, 0x3d186: 0x6e35fe20, 0x3d187: 0x6c428a20, - 0x3d188: 0x6cb6d420, 0x3d189: 0x6ce79620, 0x3d18a: 0x6d168620, 0x3d18b: 0x6dbdba20, - 0x3d18c: 0x6dbdbe20, 0x3d18d: 0x6ce7d620, 0x3d18e: 0x6d16f220, 0x3d18f: 0x6d451820, - 0x3d190: 0x6d451a20, 0x3d191: 0x6d451c20, 0x3d192: 0x6d451e20, 0x3d193: 0x6d71fc20, - 0x3d194: 0x6dbe3c20, 0x3d195: 0x6dbe3e20, 0x3d196: 0x6dbe4020, 0x3d197: 0x6dbe4220, - 0x3d198: 0x6ddbf820, 0x3d199: 0x6df3e020, 0x3d19a: 0x6df3e220, 0x3d19b: 0x6e07c020, - 0x3d19c: 0x6e24d820, 0x3d19d: 0x6e24da20, 0x3d19e: 0x6c15d820, 0x3d19f: 0x6c289420, - 0x3d1a0: 0x6c289620, 0x3d1a1: 0x6c42a820, 0x3d1a2: 0x6c42aa20, 0x3d1a3: 0x6c42ac20, - 0x3d1a4: 0x6c637a20, 0x3d1a5: 0x6c637c20, 0x3d1a6: 0x6c8a8620, 0x3d1a7: 0x6c8a8820, - 0x3d1a8: 0x6c8a8a20, 0x3d1a9: 0x6cb70820, 0x3d1aa: 0x6cb70a20, 0x3d1ab: 0x6ce7e420, - 0x3d1ac: 0x6ce7e620, 0x3d1ad: 0x6ce7e820, 0x3d1ae: 0x6ce7ea20, 0x3d1af: 0x6ce7ec20, - 0x3d1b0: 0x6d170220, 0x3d1b1: 0x6d170420, 0x3d1b2: 0x6d720420, 0x3d1b3: 0x6d720620, - 0x3d1b4: 0x6d9b8e20, 0x3d1b5: 0x6e07c420, 0x3d1b6: 0x6d453220, 0x3d1b7: 0x6d9b9e20, - 0x3d1b8: 0x6dbe4e20, 0x3d1b9: 0x6df3ea20, 0x3d1ba: 0x6e07c820, 0x3d1bb: 0x6e361820, - 0x3d1bc: 0x6d722020, 0x3d1bd: 0x6d722220, 0x3d1be: 0x6dbe6420, 0x3d1bf: 0x6ddc1420, - // Block 0xf47, offset 0x3d1c0 - 0x3d1c0: 0x6e07d420, 0x3d1c1: 0x6e07d620, 0x3d1c2: 0x6e183020, 0x3d1c3: 0x6e24e220, - 0x3d1c4: 0x6e44be20, 0x3d1c5: 0x6d173020, 0x3d1c6: 0x6d45a420, 0x3d1c7: 0x6d45a620, - 0x3d1c8: 0x6d45a820, 0x3d1c9: 0x6d45aa20, 0x3d1ca: 0x6d9c2e20, 0x3d1cb: 0x6ddc9e20, - 0x3d1cc: 0x6ddca020, 0x3d1cd: 0x6ddca220, 0x3d1ce: 0x6ddca420, 0x3d1cf: 0x6df47c20, - 0x3d1d0: 0x6df47e20, 0x3d1d1: 0x6df48020, 0x3d1d2: 0x6e086220, 0x3d1d3: 0x6e086420, - 0x3d1d4: 0x6e086620, 0x3d1d5: 0x6e086820, 0x3d1d6: 0x6e086a20, 0x3d1d7: 0x6e254220, - 0x3d1d8: 0x6e2ee220, 0x3d1d9: 0x6e364020, 0x3d1da: 0x6e41b420, 0x3d1db: 0x6c15e020, - 0x3d1dc: 0x6c28a220, 0x3d1dd: 0x6c28a420, 0x3d1de: 0x6c42d620, 0x3d1df: 0x6c42d820, - 0x3d1e0: 0x6c63a620, 0x3d1e1: 0x6c63a820, 0x3d1e2: 0x6c8aa820, 0x3d1e3: 0x6c8aaa20, - 0x3d1e4: 0x6c8aac20, 0x3d1e5: 0x6cb72820, 0x3d1e6: 0x6cb72a20, 0x3d1e7: 0x6cb72c20, - 0x3d1e8: 0x6ce82620, 0x3d1e9: 0x6ce82820, 0x3d1ea: 0x6d174220, 0x3d1eb: 0x6d174420, - 0x3d1ec: 0x6d174620, 0x3d1ed: 0x6d45b220, 0x3d1ee: 0x6d45b420, 0x3d1ef: 0x6d72b020, - 0x3d1f0: 0x6d9c3220, 0x3d1f1: 0x6e189020, 0x3d1f2: 0x6d72e020, 0x3d1f3: 0x6ddcd620, - 0x3d1f4: 0x6ddcd820, 0x3d1f5: 0x6ce84020, 0x3d1f6: 0x6d72ec20, 0x3d1f7: 0x6d9c7820, - 0x3d1f8: 0x6cb73820, 0x3d1f9: 0x6d178820, 0x3d1fa: 0x6d178a20, 0x3d1fb: 0x6d463a20, - 0x3d1fc: 0x6d734220, 0x3d1fd: 0x6d9cbe20, 0x3d1fe: 0x6dbf5020, 0x3d1ff: 0x6dbf5220, - // Block 0xf48, offset 0x3d200 - 0x3d200: 0x6ddd3420, 0x3d201: 0x6ddd3620, 0x3d202: 0x6df4f820, 0x3d203: 0x6e18e620, - 0x3d204: 0x6d464c20, 0x3d205: 0x6d735220, 0x3d206: 0x6e190420, 0x3d207: 0x6e439e20, - 0x3d208: 0x6cb74220, 0x3d209: 0x6d17c220, 0x3d20a: 0x6d738420, 0x3d20b: 0x6d9d0c20, - 0x3d20c: 0x6dbf8c20, 0x3d20d: 0x6dbf8e20, 0x3d20e: 0x6e193220, 0x3d20f: 0x6d17de20, - 0x3d210: 0x6d46b420, 0x3d211: 0x6d740620, 0x3d212: 0x6d740820, 0x3d213: 0x6d9da220, - 0x3d214: 0x6d9da420, 0x3d215: 0x6d9da620, 0x3d216: 0x6d9da820, 0x3d217: 0x6d9daa20, - 0x3d218: 0x6dc02a20, 0x3d219: 0x6dc02c20, 0x3d21a: 0x6dc02e20, 0x3d21b: 0x6dc03020, - 0x3d21c: 0x6dc03220, 0x3d21d: 0x6dc03420, 0x3d21e: 0x6dc03620, 0x3d21f: 0x6dc03820, - 0x3d220: 0x6dde2620, 0x3d221: 0x6dde2820, 0x3d222: 0x6dde2a20, 0x3d223: 0x6dde2c20, - 0x3d224: 0x6df61420, 0x3d225: 0x6df61620, 0x3d226: 0x6df61820, 0x3d227: 0x6df61a20, - 0x3d228: 0x6e09e020, 0x3d229: 0x6e09e220, 0x3d22a: 0x6e09e420, 0x3d22b: 0x6e19e620, - 0x3d22c: 0x6e19e820, 0x3d22d: 0x6e19ea20, 0x3d22e: 0x6e19ec20, 0x3d22f: 0x6e19ee20, - 0x3d230: 0x6e266420, 0x3d231: 0x6e266620, 0x3d232: 0x6e266820, 0x3d233: 0x6e266a20, - 0x3d234: 0x6e266c20, 0x3d235: 0x6e266e20, 0x3d236: 0x6e267020, 0x3d237: 0x6e2fce20, - 0x3d238: 0x6e2fd020, 0x3d239: 0x6e2fd220, 0x3d23a: 0x6e2fd420, 0x3d23b: 0x6e2fd620, - 0x3d23c: 0x6e2fd820, 0x3d23d: 0x6e370820, 0x3d23e: 0x6e370a20, 0x3d23f: 0x6e370c20, - // Block 0xf49, offset 0x3d240 - 0x3d240: 0x6e370e20, 0x3d241: 0x6e371020, 0x3d242: 0x6e3be220, 0x3d243: 0x6e3be420, - 0x3d244: 0x6e3f8420, 0x3d245: 0x6e43be20, 0x3d246: 0x6e458a20, 0x3d247: 0x6e466220, - 0x3d248: 0x6cb74c20, 0x3d249: 0x6cb74e20, 0x3d24a: 0x6cb75020, 0x3d24b: 0x6ce87e20, - 0x3d24c: 0x6ce88020, 0x3d24d: 0x6ce88220, 0x3d24e: 0x6d17fc20, 0x3d24f: 0x6d17fe20, - 0x3d250: 0x6d180020, 0x3d251: 0x6d180220, 0x3d252: 0x6c8ac220, 0x3d253: 0x6d46dc20, - 0x3d254: 0x6d46de20, 0x3d255: 0x6d46e020, 0x3d256: 0x6d46e220, 0x3d257: 0x6d46e420, - 0x3d258: 0x6d46e620, 0x3d259: 0x6d743020, 0x3d25a: 0x6d743220, 0x3d25b: 0x6d743420, - 0x3d25c: 0x6d9dd620, 0x3d25d: 0x6d9dd820, 0x3d25e: 0x6d9dda20, 0x3d25f: 0x6d9ddc20, - 0x3d260: 0x6d9dde20, 0x3d261: 0x6d9de020, 0x3d262: 0x6dc05e20, 0x3d263: 0x6dc06020, - 0x3d264: 0x6dc06220, 0x3d265: 0x6dc06420, 0x3d266: 0x6dde3c20, 0x3d267: 0x6df63220, - 0x3d268: 0x6df63420, 0x3d269: 0x6e09f420, 0x3d26a: 0x6e09f620, 0x3d26b: 0x6e1a0220, - 0x3d26c: 0x6e267620, 0x3d26d: 0x6e2fde20, 0x3d26e: 0x6ce88e20, 0x3d26f: 0x6d74d620, - 0x3d270: 0x6d74d820, 0x3d271: 0x6d74da20, 0x3d272: 0x6d74dc20, 0x3d273: 0x6d9eae20, - 0x3d274: 0x6d9eb020, 0x3d275: 0x6d9eb220, 0x3d276: 0x6d9eb420, 0x3d277: 0x6d9eb620, - 0x3d278: 0x6dc12a20, 0x3d279: 0x6dc12c20, 0x3d27a: 0x6dc12e20, 0x3d27b: 0x6dc13020, - 0x3d27c: 0x6ddedc20, 0x3d27d: 0x6ddede20, 0x3d27e: 0x6ddee020, 0x3d27f: 0x6ddee220, - // Block 0xf4a, offset 0x3d280 - 0x3d280: 0x6ddee420, 0x3d281: 0x6df71e20, 0x3d282: 0x6df72020, 0x3d283: 0x6df72220, - 0x3d284: 0x6df72420, 0x3d285: 0x6df72620, 0x3d286: 0x6df72820, 0x3d287: 0x6df72a20, - 0x3d288: 0x6df72c20, 0x3d289: 0x6e0acc20, 0x3d28a: 0x6e0ace20, 0x3d28b: 0x6e0ad020, - 0x3d28c: 0x6e1aba20, 0x3d28d: 0x6e1abc20, 0x3d28e: 0x6e1abe20, 0x3d28f: 0x6e1ac020, - 0x3d290: 0x6e272c20, 0x3d291: 0x6e309e20, 0x3d292: 0x6e30a020, 0x3d293: 0x6e30a220, - 0x3d294: 0x6e30a420, 0x3d295: 0x6e30a620, 0x3d296: 0x6e378820, 0x3d297: 0x6e3c3020, - 0x3d298: 0x6e3fb820, 0x3d299: 0x6e459e20, 0x3d29a: 0x6c63be20, 0x3d29b: 0x6c63c020, - 0x3d29c: 0x6c63c220, 0x3d29d: 0x6c63c420, 0x3d29e: 0x6c63c620, 0x3d29f: 0x6c8ae020, - 0x3d2a0: 0x6c8ae220, 0x3d2a1: 0x6c8ae420, 0x3d2a2: 0x6c8ae620, 0x3d2a3: 0x6c8ae820, - 0x3d2a4: 0x6c8aea20, 0x3d2a5: 0x6cb77620, 0x3d2a6: 0x6cb77820, 0x3d2a7: 0x6cb77a20, - 0x3d2a8: 0x6cb77c20, 0x3d2a9: 0x6cb77e20, 0x3d2aa: 0x6cb78020, 0x3d2ab: 0x6ce8a620, - 0x3d2ac: 0x6ce8a820, 0x3d2ad: 0x6ce8aa20, 0x3d2ae: 0x6ce8ac20, 0x3d2af: 0x6ce8ae20, - 0x3d2b0: 0x6d184a20, 0x3d2b1: 0x6d184c20, 0x3d2b2: 0x6d184e20, 0x3d2b3: 0x6d185020, - 0x3d2b4: 0x6d185220, 0x3d2b5: 0x6d185420, 0x3d2b6: 0x6d473820, 0x3d2b7: 0x6d473a20, - 0x3d2b8: 0x6d473c20, 0x3d2b9: 0x6d473e20, 0x3d2ba: 0x6d474020, 0x3d2bb: 0x6d474220, - 0x3d2bc: 0x6d474420, 0x3d2bd: 0x6d74fa20, 0x3d2be: 0x6d74fc20, 0x3d2bf: 0x6d9ec220, - // Block 0xf4b, offset 0x3d2c0 - 0x3d2c0: 0x6d9ec420, 0x3d2c1: 0x6d9ec620, 0x3d2c2: 0x6d9ec820, 0x3d2c3: 0x6dc14020, - 0x3d2c4: 0x6dc14220, 0x3d2c5: 0x6ddeee20, 0x3d2c6: 0x6df73420, 0x3d2c7: 0x6dc14620, - 0x3d2c8: 0x6ddef820, 0x3d2c9: 0x6e0aea20, 0x3d2ca: 0x6d9eda20, 0x3d2cb: 0x6d186020, - 0x3d2cc: 0x6d752e20, 0x3d2cd: 0x6dc16c20, 0x3d2ce: 0x6ddf2620, 0x3d2cf: 0x6e30c620, - 0x3d2d0: 0x6df79820, 0x3d2d1: 0x6cb79220, 0x3d2d2: 0x6ce8b220, 0x3d2d3: 0x6d476220, - 0x3d2d4: 0x6d756020, 0x3d2d5: 0x6dc18a20, 0x3d2d6: 0x6dc19220, 0x3d2d7: 0x6df7a220, - 0x3d2d8: 0x6d757c20, 0x3d2d9: 0x6e0b8620, 0x3d2da: 0x6e0b8820, 0x3d2db: 0x6e1b5e20, - 0x3d2dc: 0x6d9f7420, 0x3d2dd: 0x6df7f420, 0x3d2de: 0x6e3c7820, 0x3d2df: 0x6dc1f620, - 0x3d2e0: 0x6d75ac20, 0x3d2e1: 0x6e27c420, 0x3d2e2: 0x6d477e20, 0x3d2e3: 0x6e3c9020, - 0x3d2e4: 0x6ddfea20, 0x3d2e5: 0x6e1bde20, 0x3d2e6: 0x6e283420, 0x3d2e7: 0x6e427220, - 0x3d2e8: 0x6ce8c620, 0x3d2e9: 0x6d478c20, 0x3d2ea: 0x6d478e20, 0x3d2eb: 0x6d75be20, - 0x3d2ec: 0x6d9f9620, 0x3d2ed: 0x6d9f9820, 0x3d2ee: 0x6dc24020, 0x3d2ef: 0x6ddffe20, - 0x3d2f0: 0x6e1be020, 0x3d2f1: 0x6e318020, 0x3d2f2: 0x6d75c020, 0x3d2f3: 0x6ce8c820, - 0x3d2f4: 0x6e451220, - // Block 0xf4c, offset 0x3d300 - 0x3d300: 0x6c00f420, 0x3d301: 0x6c0ae820, 0x3d302: 0x6c15fe20, 0x3d303: 0x6d189620, - 0x3d304: 0x6c011820, 0x3d305: 0x6c0b6620, 0x3d306: 0x6c060c20, 0x3d307: 0x6c2a2820, - 0x3d308: 0x6c2a2a20, 0x3d309: 0x6c656c20, 0x3d30a: 0x6c8c6420, 0x3d30b: 0x6ce9e020, - 0x3d30c: 0x6c446a20, 0x3d30d: 0x6c448e20, 0x3d30e: 0x6c44d020, 0x3d30f: 0x6c8cbc20, - 0x3d310: 0x6c454c20, 0x3d311: 0x6ceac020, 0x3d312: 0x6c18be20, 0x3d313: 0x6c2bd220, - 0x3d314: 0x6c45cc20, 0x3d315: 0x6c190220, 0x3d316: 0x6c676c20, 0x3d317: 0x6c676e20, - 0x3d318: 0x6c0e9420, 0x3d319: 0x6c47da20, 0x3d31a: 0x6d1cea20, 0x3d31b: 0x6d4ab420, - 0x3d31c: 0x6da17c20, 0x3d31d: 0x6dc3da20, 0x3d31e: 0x6e1c7220, 0x3d31f: 0x6cbd8420, - 0x3d320: 0x6d1df020, 0x3d321: 0x6d78fe20, 0x3d322: 0x6c0f2a20, 0x3d323: 0x6c1b8820, - 0x3d324: 0x6c6ae820, 0x3d325: 0x6d793620, 0x3d326: 0x6c1c6020, 0x3d327: 0x6c4a1620, - 0x3d328: 0x6c4a1820, 0x3d329: 0x6c6bd620, 0x3d32a: 0x6c6bd820, 0x3d32b: 0x6c6bda20, - 0x3d32c: 0x6cbf4020, 0x3d32d: 0x6d1f2620, 0x3d32e: 0x6d4cb420, 0x3d32f: 0x6d4cc620, - 0x3d330: 0x6d1faa20, 0x3d331: 0x6d4d2020, 0x3d332: 0x6c102620, 0x3d333: 0x6c109020, - 0x3d334: 0x6c4bca20, 0x3d335: 0x6c6de020, 0x3d336: 0x6c964c20, 0x3d337: 0x6c964e20, - 0x3d338: 0x6c4d3a20, 0x3d339: 0x6c1ffa20, 0x3d33a: 0x6c352c20, 0x3d33b: 0x6c502820, - 0x3d33c: 0x6cc66a20, 0x3d33d: 0x6cf51a20, 0x3d33e: 0x6d24e420, 0x3d33f: 0x6dc6b420, - // Block 0xf4d, offset 0x3d340 - 0x3d340: 0x6c9b6c20, 0x3d341: 0x6cf5cc20, 0x3d342: 0x6c515820, 0x3d343: 0x6c515a20, - 0x3d344: 0x6c738a20, 0x3d345: 0x6c73bc20, 0x3d346: 0x6cc88020, 0x3d347: 0x6cc88220, - 0x3d348: 0x6c376220, 0x3d349: 0x6c754420, 0x3d34a: 0x6c754620, 0x3d34b: 0x6d27fc20, - 0x3d34c: 0x6d27fe20, 0x3d34d: 0x6d554c20, 0x3d34e: 0x6d554e20, 0x3d34f: 0x6d555020, - 0x3d350: 0x6d80ce20, 0x3d351: 0x6da6f020, 0x3d352: 0x6dc84a20, 0x3d353: 0x6cf92020, - 0x3d354: 0x6d55c820, 0x3d355: 0x6c098820, 0x3d356: 0x6c12e820, 0x3d357: 0x6c77e820, - 0x3d358: 0x6ca0dc20, 0x3d359: 0x6cfbd020, 0x3d35a: 0x6cfbd220, 0x3d35b: 0x6cfbd420, - 0x3d35c: 0x6d580820, 0x3d35d: 0x6d82fa20, 0x3d35e: 0x6de56e20, 0x3d35f: 0x6c78c820, - 0x3d360: 0x6ca1ca20, 0x3d361: 0x6d2bd820, 0x3d362: 0x6c569420, 0x3d363: 0x6c3b3620, - 0x3d364: 0x6ca2d420, 0x3d365: 0x6c3baa20, 0x3d366: 0x6c7a7020, 0x3d367: 0x6cd15e20, - 0x3d368: 0x6d2d8420, 0x3d369: 0x6d5ab020, 0x3d36a: 0x6c580820, 0x3d36b: 0x6ca41820, - 0x3d36c: 0x6c7ba220, 0x3d36d: 0x6d5bd620, 0x3d36e: 0x6c7bd220, 0x3d36f: 0x6c3c7420, - 0x3d370: 0x6c597220, 0x3d371: 0x6d012e20, 0x3d372: 0x6c7cd420, 0x3d373: 0x6ca59020, - 0x3d374: 0x6c7e2c20, 0x3d375: 0x6ca6f220, 0x3d376: 0x6d883020, 0x3d377: 0x6ca77620, - 0x3d378: 0x6d042820, 0x3d379: 0x6c258820, 0x3d37a: 0x6e1f7c20, 0x3d37b: 0x6c259220, - 0x3d37c: 0x6ca7e620, 0x3d37d: 0x6d5fe820, 0x3d37e: 0x6d5fea20, 0x3d37f: 0x6d5fec20, - // Block 0xf4e, offset 0x3d380 - 0x3d380: 0x6daf1e20, 0x3d381: 0x6d617a20, 0x3d382: 0x6dcf7a20, 0x3d383: 0x6c5cc220, - 0x3d384: 0x6c80c220, 0x3d385: 0x6ca9e020, 0x3d386: 0x6cd85020, 0x3d387: 0x6daff220, - 0x3d388: 0x6c5d0a20, 0x3d389: 0x6c3e5a20, 0x3d38a: 0x6d36e220, 0x3d38b: 0x6cdaaa20, - 0x3d38c: 0x6c5f8e20, 0x3d38d: 0x6c5f9020, 0x3d38e: 0x6c84c220, 0x3d38f: 0x6cae1620, - 0x3d390: 0x6cae1820, 0x3d391: 0x6cae1a20, 0x3d392: 0x6d0bb420, 0x3d393: 0x6d0bb620, - 0x3d394: 0x6d39b620, 0x3d395: 0x6d65ee20, 0x3d396: 0x6d8fc220, 0x3d397: 0x6e01da20, - 0x3d398: 0x6d675620, 0x3d399: 0x6db4d820, 0x3d39a: 0x6cdef620, 0x3d39b: 0x6cdf0620, - 0x3d39c: 0x6e2c3a20, 0x3d39d: 0x6e221220, 0x3d39e: 0x6c14fe20, 0x3d39f: 0x6c26e420, - 0x3d3a0: 0x6c86c020, 0x3d3a1: 0x6c86c220, 0x3d3a2: 0x6ce04620, 0x3d3a3: 0x6def6620, - 0x3d3a4: 0x6c616420, 0x3d3a5: 0x6d3f6620, 0x3d3a6: 0x6db89c20, 0x3d3a7: 0x6c0a8a20, - 0x3d3a8: 0x6ce3ba20, 0x3d3a9: 0x6ce3bc20, 0x3d3aa: 0x6d95f820, 0x3d3ab: 0x6c27ea20, - 0x3d3ac: 0x6c88e820, 0x3d3ad: 0x6cb47220, 0x3d3ae: 0x6d12ba20, 0x3d3af: 0x6c626020, - 0x3d3b0: 0x6d41bc20, 0x3d3b1: 0x6dd8f820, 0x3d3b2: 0x6c27fe20, 0x3d3b3: 0x6c41fc20, - 0x3d3b4: 0x6c62a620, 0x3d3b5: 0x6c62a820, 0x3d3b6: 0x6c898020, 0x3d3b7: 0x6c898220, - 0x3d3b8: 0x6cb58020, 0x3d3b9: 0x6cb58220, 0x3d3ba: 0x6cb58420, 0x3d3bb: 0x6cb58620, - 0x3d3bc: 0x6ce57020, 0x3d3bd: 0x6d13f420, 0x3d3be: 0x6d41f820, 0x3d3bf: 0x6d41fa20, - // Block 0xf4f, offset 0x3d3c0 - 0x3d3c0: 0x6d6efe20, 0x3d3c1: 0x6df16220, 0x3d3c2: 0x6c420e20, 0x3d3c3: 0x6cb65e20, - 0x3d3c4: 0x6d70de20, 0x3d3c5: 0x6d15dc20, 0x3d3c6: 0x6c8a6620, 0x3d3c7: 0x6c428c20, - 0x3d3c8: 0x6c635a20, 0x3d3c9: 0x6c8a9220, 0x3d3ca: 0x6c42da20, 0x3d3cb: 0x6d45b620, - 0x3d3cc: 0x6d9c3420, 0x3d3cd: 0x6e19f020, 0x3d3ce: 0x6e371220, 0x3d3cf: 0x6ce88420, - 0x3d3d0: 0x6d180420, 0x3d3d1: 0x6dc06620, 0x3d3d2: 0x6df63620, 0x3d3d3: 0x6cb75420, - 0x3d3d4: 0x6d9eb820, 0x3d3d5: 0x6e272e20, 0x3d3d6: 0x6c63c820, 0x3d3d7: 0x6d750a20, - 0x3d3d8: 0x6ddfda20, 0x3d3d9: 0x6df85820, 0x3d3da: 0x6d188a20, 0x3d3db: 0x6e383e20, - 0x3d3dc: 0x6d9f9a20, 0x3d3dd: 0x6e441c20, - // Block 0xf50, offset 0x3d400 - 0x3d400: 0x6c15ea20, 0x3d401: 0x6c00fe20, 0x3d402: 0x6c000c20, 0x3d403: 0x6c0b4420, - 0x3d404: 0x6c16ba20, 0x3d405: 0x6c435e20, 0x3d406: 0x6c437820, 0x3d407: 0x6c645620, - 0x3d408: 0x6c8bba20, 0x3d409: 0x6cb81c20, 0x3d40a: 0x6d18fe20, 0x3d40b: 0x6d18ce20, - 0x3d40c: 0x6d9fac20, 0x3d40d: 0x6c0ccc20, 0x3d40e: 0x6c173820, 0x3d40f: 0x6c2a3220, - 0x3d410: 0x6e0c6420, 0x3d411: 0x6c2a5220, 0x3d412: 0x6c8c8020, 0x3d413: 0x6df89620, - 0x3d414: 0x6c02ce20, 0x3d415: 0x6c0c7820, 0x3d416: 0x6c0c7c20, 0x3d417: 0x6c02fe20, - 0x3d418: 0x6c65aa20, 0x3d419: 0x6c02ae20, 0x3d41a: 0x6c064a20, 0x3d41b: 0x6c179020, - 0x3d41c: 0x6dbc5420, 0x3d41d: 0x6c009a20, 0x3d41e: 0x6c015a20, 0x3d41f: 0x6c17da20, - 0x3d420: 0x6c2ae220, 0x3d421: 0x6c2b4a20, 0x3d422: 0x6cb95220, 0x3d423: 0x6cea4020, - 0x3d424: 0x6c0d3c20, 0x3d425: 0x6c455c20, 0x3d426: 0x6c456020, 0x3d427: 0x6cea9c20, - 0x3d428: 0x6c016420, 0x3d429: 0x6c06b820, 0x3d42a: 0x6c06ba20, 0x3d42b: 0x6c06c620, - 0x3d42c: 0x6c06d220, 0x3d42d: 0x6c2bac20, 0x3d42e: 0x6cb9f220, 0x3d42f: 0x6c18d420, - 0x3d430: 0x6c45e820, 0x3d431: 0x6c673020, 0x3d432: 0x6c673020, 0x3d433: 0x6c673020, - 0x3d434: 0x6c038e20, 0x3d435: 0x6c135e20, 0x3d436: 0x6c03a020, 0x3d437: 0x6c677e20, - 0x3d438: 0x6c8e0c20, 0x3d439: 0x6c074420, 0x3d43a: 0x6c075020, 0x3d43b: 0x6c0e3020, - 0x3d43c: 0x6c468620, 0x3d43d: 0x6c197e20, 0x3d43e: 0x6c199e20, 0x3d43f: 0x6c2c7e20, - // Block 0xf51, offset 0x3d440 - 0x3d440: 0x6c468e20, 0x3d441: 0x6c67e620, 0x3d442: 0x6c681820, 0x3d443: 0x6c8e9620, - 0x3d444: 0x6c8eb220, 0x3d445: 0x6cbaaa20, 0x3d446: 0x6cbaaa20, 0x3d447: 0x6cbad220, - 0x3d448: 0x6cbaf620, 0x3d449: 0x6cbb0620, 0x3d44a: 0x6ceb7620, 0x3d44b: 0x6d1cf220, - 0x3d44c: 0x6d1b7220, 0x3d44d: 0x6d1cf420, 0x3d44e: 0x6d1bb220, 0x3d44f: 0x6d49c620, - 0x3d450: 0x6c032820, 0x3d451: 0x6c0f0e20, 0x3d452: 0x6c486820, 0x3d453: 0x6c908220, - 0x3d454: 0x6c90b420, 0x3d455: 0x6c481220, 0x3d456: 0x6c6a6e20, 0x3d457: 0x6cbcb020, - 0x3d458: 0x6d4af820, 0x3d459: 0x6de13e20, 0x3d45a: 0x6c1b6c20, 0x3d45b: 0x6c916220, - 0x3d45c: 0x6c1b7420, 0x3d45d: 0x6c0f1e20, 0x3d45e: 0x6d1e1020, 0x3d45f: 0x6c91d420, - 0x3d460: 0x6c080620, 0x3d461: 0x6c2f9020, 0x3d462: 0x6c6b1820, 0x3d463: 0x6c6b3c20, - 0x3d464: 0x6c6b5420, 0x3d465: 0x6c495620, 0x3d466: 0x6c924e20, 0x3d467: 0x6cbdf220, - 0x3d468: 0x6cbe0e20, 0x3d469: 0x6d4c1220, 0x3d46a: 0x6de16420, 0x3d46b: 0x6de16420, - 0x3d46c: 0x6c0fdc20, 0x3d46d: 0x6c933820, 0x3d46e: 0x6cefa820, 0x3d46f: 0x6d1f5620, - 0x3d470: 0x6de19a20, 0x3d471: 0x6e3d2020, 0x3d472: 0x6c1cc220, 0x3d473: 0x6c4a9220, - 0x3d474: 0x6c114a20, 0x3d475: 0x6c01ac20, 0x3d476: 0x6c4abc20, 0x3d477: 0x6c941020, - 0x3d478: 0x6c01b620, 0x3d479: 0x6c311420, 0x3d47a: 0x6c1dd220, 0x3d47b: 0x6c6d7820, - 0x3d47c: 0x6cc0a820, 0x3d47d: 0x6c6d7c20, 0x3d47e: 0x6cf09a20, 0x3d47f: 0x6cc16a20, - // Block 0xf52, offset 0x3d480 - 0x3d480: 0x6d202220, 0x3d481: 0x6c272c20, 0x3d482: 0x6c954a20, 0x3d483: 0x6c08a020, - 0x3d484: 0x6cc17820, 0x3d485: 0x6c6e0020, 0x3d486: 0x6cc19820, 0x3d487: 0x6d4ea820, - 0x3d488: 0x6d7ae820, 0x3d489: 0x6e320a20, 0x3d48a: 0x6c4c6820, 0x3d48b: 0x6c4cac20, - 0x3d48c: 0x6c95e620, 0x3d48d: 0x6c95ec20, 0x3d48e: 0x6cc21820, 0x3d48f: 0x6d476820, - 0x3d490: 0x6c01d820, 0x3d491: 0x6c111220, 0x3d492: 0x6c111220, 0x3d493: 0x6c82fe20, - 0x3d494: 0x6c326a20, 0x3d495: 0x6c326a20, 0x3d496: 0x6c329a20, 0x3d497: 0x6d7ea620, - 0x3d498: 0x6e201a20, 0x3d499: 0x6c1ee020, 0x3d49a: 0x6c96ae20, 0x3d49b: 0x6c6f1420, - 0x3d49c: 0x6cc2ca20, 0x3d49d: 0x6c1f2220, 0x3d49e: 0x6c1f2c20, 0x3d49f: 0x6c1f6c20, - 0x3d4a0: 0x6c6fa220, 0x3d4a1: 0x6c4dbe20, 0x3d4a2: 0x6c4da620, 0x3d4a3: 0x6c6fc020, - 0x3d4a4: 0x6c97fe20, 0x3d4a5: 0x6c97a020, 0x3d4a6: 0x6d222420, 0x3d4a7: 0x6cf2ac20, - 0x3d4a8: 0x6cf2b020, 0x3d4a9: 0x6cf2ac20, 0x3d4aa: 0x6d226c20, 0x3d4ab: 0x6d4fb820, - 0x3d4ac: 0x6d7bcc20, 0x3d4ad: 0x6d4fd820, 0x3d4ae: 0x6d4fe820, 0x3d4af: 0x6da3f620, - 0x3d4b0: 0x6de28220, 0x3d4b1: 0x6de28c20, 0x3d4b2: 0x6c11c220, 0x3d4b3: 0x6c98ba20, - 0x3d4b4: 0x6c11e820, 0x3d4b5: 0x6c345020, 0x3d4b6: 0x6c349420, 0x3d4b7: 0x6c713820, - 0x3d4b8: 0x6c4fd020, 0x3d4b9: 0x6c711220, 0x3d4ba: 0x6c4f3420, 0x3d4bb: 0x6c990c20, - 0x3d4bc: 0x6c994220, 0x3d4bd: 0x6c722020, 0x3d4be: 0x6cc57a20, 0x3d4bf: 0x6cf41220, - // Block 0xf53, offset 0x3d4c0 - 0x3d4c0: 0x6cf51c20, 0x3d4c1: 0x6c998820, 0x3d4c2: 0x6d237420, 0x3d4c3: 0x6d510220, - 0x3d4c4: 0x6d23ee20, 0x3d4c5: 0x6d515a20, 0x3d4c6: 0x6d23e220, 0x3d4c7: 0x6de2ea20, - 0x3d4c8: 0x6c9ab020, 0x3d4c9: 0x6cf53820, 0x3d4ca: 0x6da53020, 0x3d4cb: 0x6c9b6e20, - 0x3d4cc: 0x6c739020, 0x3d4cd: 0x6c731620, 0x3d4ce: 0x6d7e3620, 0x3d4cf: 0x6cc7b820, - 0x3d4d0: 0x6cf5e620, 0x3d4d1: 0x6c50c220, 0x3d4d2: 0x6c448820, 0x3d4d3: 0x6c8c8820, - 0x3d4d4: 0x6cb8f420, 0x3d4d5: 0x6d258220, 0x3d4d6: 0x6c3e9420, 0x3d4d7: 0x6c3e7220, - 0x3d4d8: 0x6c73be20, 0x3d4d9: 0x6c9c2220, 0x3d4da: 0x6cf69620, 0x3d4db: 0x6c21ee20, - 0x3d4dc: 0x6c21d820, 0x3d4dd: 0x6c220c20, 0x3d4de: 0x6c365c20, 0x3d4df: 0x6c522420, - 0x3d4e0: 0x6c36a020, 0x3d4e1: 0x6c52c020, 0x3d4e2: 0x6c9c8820, 0x3d4e3: 0x6c750620, - 0x3d4e4: 0x6c9c9a20, 0x3d4e5: 0x6c740020, 0x3d4e6: 0x6cc95020, 0x3d4e7: 0x6cf6d620, - 0x3d4e8: 0x6cf70820, 0x3d4e9: 0x6d267820, 0x3d4ea: 0x6d53d620, 0x3d4eb: 0x6da63220, - 0x3d4ec: 0x6d801420, 0x3d4ed: 0x6da6f220, 0x3d4ee: 0x6e1db420, 0x3d4ef: 0x6c12b420, - 0x3d4f0: 0x6c756020, 0x3d4f1: 0x6d80d420, 0x3d4f2: 0x6e38d620, 0x3d4f3: 0x6cf90820, - 0x3d4f4: 0x6d285c20, 0x3d4f5: 0x6c9e2620, 0x3d4f6: 0x6c9e2820, 0x3d4f7: 0x6c9e2e20, - 0x3d4f8: 0x6c30b220, 0x3d4f9: 0x6d288c20, 0x3d4fa: 0x6c130620, 0x3d4fb: 0x6c393420, - 0x3d4fc: 0x6c38ac20, 0x3d4fd: 0x6c38c620, 0x3d4fe: 0x6c22c020, 0x3d4ff: 0x6c767220, - // Block 0xf54, offset 0x3d500 - 0x3d500: 0x6c546820, 0x3d501: 0x6c76b620, 0x3d502: 0x6c546e20, 0x3d503: 0x6c769a20, - 0x3d504: 0x6c76b820, 0x3d505: 0x6c76d220, 0x3d506: 0x6c771820, 0x3d507: 0x6c545420, - 0x3d508: 0x6ccc3a20, 0x3d509: 0x6cccb620, 0x3d50a: 0x6cfa0020, 0x3d50b: 0x6cccf220, - 0x3d50c: 0x6cfa8620, 0x3d50d: 0x6d29d220, 0x3d50e: 0x6c9f8020, 0x3d50f: 0x6d568820, - 0x3d510: 0x6d571a20, 0x3d511: 0x6d577a20, 0x3d512: 0x6d580a20, 0x3d513: 0x6dfbe420, - 0x3d514: 0x6de4d620, 0x3d515: 0x6de4d020, 0x3d516: 0x6e0f0220, 0x3d517: 0x6e0f1420, - 0x3d518: 0x6c23a220, 0x3d519: 0x6c239620, 0x3d51a: 0x6c554420, 0x3d51b: 0x6cb8ea20, - 0x3d51c: 0x6cfc0420, 0x3d51d: 0x6cce4a20, 0x3d51e: 0x6d582220, 0x3d51f: 0x6d838420, - 0x3d520: 0x6e443420, 0x3d521: 0x6da93020, 0x3d522: 0x6cfd5420, 0x3d523: 0x6c790420, - 0x3d524: 0x6ccf7820, 0x3d525: 0x6d2c1c20, 0x3d526: 0x6c243420, 0x3d527: 0x6cfdfc20, - 0x3d528: 0x6de60820, 0x3d529: 0x6c04fa20, 0x3d52a: 0x6c246c20, 0x3d52b: 0x6c3b5620, - 0x3d52c: 0x6c79bc20, 0x3d52d: 0x6c79bc20, 0x3d52e: 0x6cfe7820, 0x3d52f: 0x6cfea220, - 0x3d530: 0x6d2d0620, 0x3d531: 0x6d5a3420, 0x3d532: 0x6de63620, 0x3d533: 0x6c57d820, - 0x3d534: 0x6cd1a420, 0x3d535: 0x6c585a20, 0x3d536: 0x6c3be620, 0x3d537: 0x6cffb820, - 0x3d538: 0x6ca3e620, 0x3d539: 0x6cf15e20, 0x3d53a: 0x6d00b220, 0x3d53b: 0x6dab0a20, - 0x3d53c: 0x6e104820, 0x3d53d: 0x6c3c7020, 0x3d53e: 0x6c594e20, 0x3d53f: 0x6d868020, - // Block 0xf55, offset 0x3d540 - 0x3d540: 0x6c3c8820, 0x3d541: 0x6c3c8e20, 0x3d542: 0x6c3c8c20, 0x3d543: 0x6c59e420, - 0x3d544: 0x6c7c7e20, 0x3d545: 0x6c7c5e20, 0x3d546: 0x6c7c6020, 0x3d547: 0x6c7c6020, - 0x3d548: 0x6cd36020, 0x3d549: 0x6cd34020, 0x3d54a: 0x6d5c4620, 0x3d54b: 0x6d013a20, - 0x3d54c: 0x6c13ee20, 0x3d54d: 0x6c3cd620, 0x3d54e: 0x6ca5f620, 0x3d54f: 0x6d027820, - 0x3d550: 0x6d5d2820, 0x3d551: 0x6dac1020, 0x3d552: 0x6c3d1e20, 0x3d553: 0x6c7dd220, - 0x3d554: 0x6cd4fa20, 0x3d555: 0x6d30e620, 0x3d556: 0x6d30ce20, 0x3d557: 0x6c7e5e20, - 0x3d558: 0x6c5b3020, 0x3d559: 0x6d5e0420, 0x3d55a: 0x6d314e20, 0x3d55b: 0x6d885420, - 0x3d55c: 0x6cd5c620, 0x3d55d: 0x6d5eba20, 0x3d55e: 0x6d5eba20, 0x3d55f: 0x6d322e20, - 0x3d560: 0x6d323420, 0x3d561: 0x6d32de20, 0x3d562: 0x6d5f3420, 0x3d563: 0x6d894a20, - 0x3d564: 0x6d5efe20, 0x3d565: 0x6dae2820, 0x3d566: 0x6d8a5e20, 0x3d567: 0x6daece20, - 0x3d568: 0x6daee820, 0x3d569: 0x6dce7220, 0x3d56a: 0x6c5c6620, 0x3d56b: 0x6c3dc620, - 0x3d56c: 0x6cd78420, 0x3d56d: 0x6d608020, 0x3d56e: 0x6d342620, 0x3d56f: 0x6d60e220, - 0x3d570: 0x6daf6c20, 0x3d571: 0x6e399620, 0x3d572: 0x6c80d020, 0x3d573: 0x6d619e20, - 0x3d574: 0x6cd86420, 0x3d575: 0x6d073a20, 0x3d576: 0x6d8bc020, 0x3d577: 0x6e33b420, - 0x3d578: 0x6caa3220, 0x3d579: 0x6dcfe420, 0x3d57a: 0x6c3e3620, 0x3d57b: 0x6d624620, - 0x3d57c: 0x6dd02420, 0x3d57d: 0x6cd91e20, 0x3d57e: 0x6d628a20, 0x3d57f: 0x6db0a220, - // Block 0xf56, offset 0x3d580 - 0x3d580: 0x6c21a420, 0x3d581: 0x6c3e6a20, 0x3d582: 0x6c3e9e20, 0x3d583: 0x6c823c20, - 0x3d584: 0x6cd97a20, 0x3d585: 0x6cd98820, 0x3d586: 0x6ceed220, 0x3d587: 0x6d367820, - 0x3d588: 0x6d369420, 0x3d589: 0x6d538a20, 0x3d58a: 0x6da5b220, 0x3d58b: 0x6c82fe20, - 0x3d58c: 0x6cda9c20, 0x3d58d: 0x6d114c20, 0x3d58e: 0x6cdac220, 0x3d58f: 0x6c265420, - 0x3d590: 0x6c264820, 0x3d591: 0x6c3f5620, 0x3d592: 0x6c185020, 0x3d593: 0x6c3f7e20, - 0x3d594: 0x6c3f8220, 0x3d595: 0x6c3f9420, 0x3d596: 0x6c5eb620, 0x3d597: 0x6c5f1c20, - 0x3d598: 0x6c5eb420, 0x3d599: 0x6cac7420, 0x3d59a: 0x6c840620, 0x3d59b: 0x6cae1e20, - 0x3d59c: 0x6cac7620, 0x3d59d: 0x6cad0c20, 0x3d59e: 0x6cdb6e20, 0x3d59f: 0x6cdbee20, - 0x3d5a0: 0x6c84c420, 0x3d5a1: 0x6cdb3620, 0x3d5a2: 0x6cdb3a20, 0x3d5a3: 0x6cdb5820, - 0x3d5a4: 0x6cdc0c20, 0x3d5a5: 0x6d386a20, 0x3d5a6: 0x6d0a7820, 0x3d5a7: 0x6db1fa20, - 0x3d5a8: 0x6d0bbc20, 0x3d5a9: 0x6d642820, 0x3d5aa: 0x6d646c20, 0x3d5ab: 0x6d90ac20, - 0x3d5ac: 0x6d8e4820, 0x3d5ad: 0x6db27620, 0x3d5ae: 0x6e006820, 0x3d5af: 0x6e128020, - 0x3d5b0: 0x6dd1a220, 0x3d5b1: 0x6e12c220, 0x3d5b2: 0x6e20a820, 0x3d5b3: 0x6c5f9620, - 0x3d5b4: 0x6d0bc020, 0x3d5b5: 0x6db39a20, 0x3d5b6: 0x6dd29a20, 0x3d5b7: 0x6c852c20, - 0x3d5b8: 0x6cdd7820, 0x3d5b9: 0x6d0c2420, 0x3d5ba: 0x6cdd9c20, 0x3d5bb: 0x6d900a20, - 0x3d5bc: 0x6d3a1c20, 0x3d5bd: 0x6d3b0e20, 0x3d5be: 0x6d901420, 0x3d5bf: 0x6d8ffa20, - // Block 0xf57, offset 0x3d5c0 - 0x3d5c0: 0x6d668a20, 0x3d5c1: 0x6debe220, 0x3d5c2: 0x6debf020, 0x3d5c3: 0x6d912820, - 0x3d5c4: 0x6c14d220, 0x3d5c5: 0x6cafa620, 0x3d5c6: 0x6cdeaa20, 0x3d5c7: 0x6d0d0620, - 0x3d5c8: 0x6d3b2c20, 0x3d5c9: 0x6d3b6e20, 0x3d5ca: 0x6c8c8420, 0x3d5cb: 0x6e430c20, - 0x3d5cc: 0x6c867c20, 0x3d5cd: 0x6cb06c20, 0x3d5ce: 0x6cdf6620, 0x3d5cf: 0x6d0e4620, - 0x3d5d0: 0x6d925c20, 0x3d5d1: 0x6e2c4c20, 0x3d5d2: 0x6c26ec20, 0x3d5d3: 0x6cb18c20, - 0x3d5d4: 0x6cb1a420, 0x3d5d5: 0x6ce0de20, 0x3d5d6: 0x6e34b020, 0x3d5d7: 0x6c873020, - 0x3d5d8: 0x6d93fa20, 0x3d5d9: 0x6d76c820, 0x3d5da: 0x6ce1c620, 0x3d5db: 0x6d101620, - 0x3d5dc: 0x6d103a20, 0x3d5dd: 0x6c458420, 0x3d5de: 0x6c879a20, 0x3d5df: 0x6d951e20, - 0x3d5e0: 0x6d6cc620, 0x3d5e1: 0x6d95c220, 0x3d5e2: 0x6c153c20, 0x3d5e3: 0x6c625420, - 0x3d5e4: 0x6d121420, 0x3d5e5: 0x6cb46620, 0x3d5e6: 0x6d401a20, 0x3d5e7: 0x6d12da20, - 0x3d5e8: 0x6d6e0a20, 0x3d5e9: 0x6d6e0c20, 0x3d5ea: 0x6d41c020, 0x3d5eb: 0x6df0d620, - 0x3d5ec: 0x6e04bc20, 0x3d5ed: 0x6e3ac220, 0x3d5ee: 0x6ce59420, 0x3d5ef: 0x6d420c20, - 0x3d5f0: 0x6dbb3420, 0x3d5f1: 0x6dbb7220, 0x3d5f2: 0x6d6f8c20, 0x3d5f3: 0x6ce69420, - 0x3d5f4: 0x6d7a8620, 0x3d5f5: 0x6dd9cc20, 0x3d5f6: 0x6df20220, 0x3d5f7: 0x6d706220, - 0x3d5f8: 0x6dbc7220, 0x3d5f9: 0x6df24220, 0x3d5fa: 0x6e06d620, 0x3d5fb: 0x6df2ca20, - 0x3d5fc: 0x6ce74620, 0x3d5fd: 0x6d712e20, 0x3d5fe: 0x6d15fc20, 0x3d5ff: 0x6d15fc20, - // Block 0xf58, offset 0x3d600 - 0x3d600: 0x6d711820, 0x3d601: 0x6d449820, 0x3d602: 0x6c8a6820, 0x3d603: 0x6d44d220, - 0x3d604: 0x6d9b2620, 0x3d605: 0x6df3ee20, 0x3d606: 0x6d457020, 0x3d607: 0x6dbe8420, - 0x3d608: 0x6d72ba20, 0x3d609: 0x6d9c9020, 0x3d60a: 0x6e08b620, 0x3d60b: 0x6e09e620, - 0x3d60c: 0x6d745c20, 0x3d60d: 0x6dc07220, 0x3d60e: 0x6e0a0620, 0x3d60f: 0x6dc13220, - 0x3d610: 0x6e0a7420, 0x3d611: 0x6e267a20, 0x3d612: 0x6e1a6a20, 0x3d613: 0x6e421620, - 0x3d614: 0x6d751a20, 0x3d615: 0x6cb79420, 0x3d616: 0x6e0b4220, 0x3d617: 0x6ce8be20, - 0x3d618: 0x6c42e420, 0x3d619: 0x6e1b6620, 0x3d61a: 0x6d75a020, 0x3d61b: 0x6ddfac20, - 0x3d61c: 0x6d478020, 0x3d61d: 0x6e1bc220, -} - -// mainLookup: 16576 entries, 33152 bytes -// Block 0 is the null block. -var mainLookup = [16576]uint16{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0x0e0: 0x1f, 0x0e1: 0x20, 0x0e2: 0x21, 0x0e3: 0x22, 0x0e4: 0x23, 0x0e5: 0x24, 0x0e6: 0x25, 0x0e7: 0x26, - 0x0e8: 0x27, 0x0e9: 0x28, 0x0ea: 0x29, 0x0eb: 0x2a, 0x0ec: 0x2b, 0x0ed: 0x2c, 0x0ee: 0x2d, 0x0ef: 0x2e, - 0x0f0: 0x2f, 0x0f1: 0x30, 0x0f2: 0x31, 0x0f3: 0x32, 0x0f4: 0x33, 0x0f5: 0x34, 0x0f6: 0x35, 0x0f7: 0x36, - 0x0f8: 0x37, 0x0f9: 0x38, 0x0fa: 0x39, 0x0fb: 0x3a, 0x0fc: 0x3b, 0x0fd: 0x3c, 0x0fe: 0x3d, 0x0ff: 0x3e, - // Block 0x4, offset 0x100 - 0x100: 0x3f, 0x101: 0x40, 0x102: 0x41, 0x103: 0x42, 0x104: 0x43, 0x105: 0x44, 0x106: 0x45, 0x107: 0x46, - 0x108: 0x47, 0x109: 0x48, 0x10a: 0x49, 0x10b: 0x4a, 0x10c: 0x4b, 0x10d: 0x4c, 0x10e: 0x4d, 0x10f: 0x4e, - 0x110: 0x4f, 0x111: 0x50, 0x112: 0x51, 0x113: 0x52, 0x114: 0x53, 0x115: 0x54, 0x116: 0x55, 0x117: 0x56, - 0x118: 0x57, 0x119: 0x58, 0x11a: 0x59, 0x11b: 0x5a, 0x11c: 0x5b, 0x11d: 0x5c, 0x11e: 0x5d, 0x11f: 0x5e, - 0x120: 0x5f, 0x121: 0x60, 0x122: 0x61, 0x123: 0x62, 0x124: 0x63, 0x125: 0x64, 0x126: 0x65, 0x127: 0x66, - 0x128: 0x67, 0x129: 0x68, 0x12a: 0x69, 0x12c: 0x6a, 0x12d: 0x6b, 0x12e: 0x6c, 0x12f: 0x6d, - 0x130: 0x6e, 0x131: 0x6f, 0x133: 0x70, 0x134: 0x71, 0x135: 0x72, 0x136: 0x73, 0x137: 0x74, - 0x138: 0x75, 0x139: 0x76, 0x13a: 0x77, 0x13b: 0x78, 0x13c: 0x79, 0x13d: 0x7a, 0x13e: 0x7b, 0x13f: 0x7c, - // Block 0x5, offset 0x140 - 0x140: 0x7d, 0x141: 0x7e, 0x142: 0x7f, 0x143: 0x80, 0x144: 0x81, 0x145: 0x82, 0x146: 0x83, 0x147: 0x84, - 0x148: 0x85, 0x149: 0x86, 0x14a: 0x87, 0x14b: 0x88, 0x14c: 0x89, 0x14d: 0x8a, 0x14e: 0x8b, 0x14f: 0x8c, - 0x150: 0x8d, 0x151: 0x8e, 0x152: 0x8f, 0x153: 0x90, 0x154: 0x91, 0x155: 0x92, 0x156: 0x93, 0x157: 0x94, - 0x158: 0x95, 0x159: 0x96, 0x15a: 0x97, 0x15b: 0x98, 0x15c: 0x99, 0x15d: 0x9a, 0x15e: 0x9b, 0x15f: 0x9c, - 0x160: 0x9d, 0x161: 0x9e, 0x162: 0x9f, 0x163: 0xa0, 0x164: 0xa1, 0x165: 0xa2, 0x166: 0xa3, 0x167: 0xa4, - 0x168: 0xa5, 0x169: 0xa6, 0x16a: 0xa7, 0x16b: 0xa8, 0x16c: 0xa9, 0x16d: 0xaa, - 0x170: 0xab, 0x171: 0xac, 0x172: 0xad, 0x173: 0xae, 0x174: 0xaf, 0x175: 0xb0, 0x176: 0xb1, 0x177: 0xb2, - 0x178: 0xb3, 0x17a: 0xb4, 0x17b: 0xb5, 0x17c: 0xb6, 0x17d: 0xb7, 0x17e: 0xb8, 0x17f: 0xb9, - // Block 0x6, offset 0x180 - 0x180: 0xba, 0x181: 0xbb, 0x182: 0xbc, 0x183: 0xbd, 0x184: 0xbe, 0x185: 0xbf, 0x186: 0xc0, 0x187: 0xc1, - 0x188: 0xc2, 0x189: 0xc3, 0x18a: 0xc4, 0x18b: 0xc5, 0x18c: 0xc6, 0x18d: 0xc7, 0x18e: 0xc8, 0x18f: 0xc9, - // Block 0x7, offset 0x1c0 - 0x1f7: 0xca, - // Block 0x8, offset 0x200 - 0x200: 0xcb, 0x201: 0xcc, 0x202: 0xcd, 0x203: 0xce, 0x204: 0xcf, 0x205: 0xd0, 0x206: 0xd1, 0x207: 0xd2, - 0x208: 0xd3, 0x209: 0xd4, 0x20a: 0xd5, 0x20b: 0xd6, 0x20c: 0xd7, 0x20d: 0xd8, 0x20e: 0xd9, 0x20f: 0xda, - 0x210: 0xdb, 0x211: 0xdc, 0x212: 0xdd, 0x213: 0xde, 0x214: 0xdf, 0x215: 0xe0, 0x216: 0xe1, 0x217: 0xe2, - 0x218: 0xe3, 0x219: 0xe4, 0x21a: 0xe5, 0x21b: 0xe6, 0x21c: 0xe7, 0x21d: 0xe8, 0x21e: 0xe9, 0x21f: 0xea, - 0x220: 0xeb, 0x221: 0xec, 0x222: 0xed, 0x223: 0xee, 0x224: 0xef, 0x225: 0xf0, 0x226: 0xf1, 0x227: 0xf2, - 0x228: 0xf3, 0x229: 0xf4, 0x22a: 0xf5, 0x22b: 0xf6, 0x22c: 0xf7, 0x22f: 0xf8, - // Block 0x9, offset 0x240 - 0x25e: 0xf9, 0x25f: 0xfa, - // Block 0xa, offset 0x280 - 0x2a4: 0xfb, 0x2a5: 0xfc, 0x2a6: 0xfd, 0x2a7: 0xfe, - 0x2a8: 0xff, 0x2a9: 0x100, 0x2aa: 0x101, 0x2ab: 0x102, 0x2ac: 0x103, 0x2ad: 0x104, 0x2ae: 0x105, 0x2af: 0x106, - 0x2b0: 0x107, 0x2b1: 0x108, 0x2b2: 0x109, 0x2b3: 0x10a, 0x2b4: 0x10b, 0x2b5: 0x10c, 0x2b6: 0x10d, 0x2b7: 0x10e, - 0x2b8: 0x10f, 0x2b9: 0x110, 0x2ba: 0x111, 0x2bb: 0x112, 0x2bc: 0x113, 0x2bd: 0x114, 0x2be: 0x115, 0x2bf: 0x116, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x117, 0x2c1: 0x118, 0x2c2: 0x119, 0x2c3: 0x11a, 0x2c4: 0x11b, 0x2c5: 0x11c, 0x2c6: 0x11d, 0x2c7: 0x11e, - 0x2ca: 0x11f, 0x2cb: 0x120, 0x2cc: 0x121, 0x2cd: 0x122, 0x2ce: 0x123, 0x2cf: 0x124, - 0x2d0: 0x125, 0x2d1: 0x126, 0x2d2: 0x127, - 0x2e0: 0x128, 0x2e1: 0x129, 0x2e4: 0x12a, 0x2e6: 0x12b, - 0x2e8: 0x12c, 0x2e9: 0x12d, 0x2ec: 0x12e, 0x2ed: 0x12f, - 0x2f0: 0x130, 0x2f1: 0x131, - 0x2f9: 0x132, - // Block 0xc, offset 0x300 - 0x300: 0x133, 0x301: 0x134, 0x302: 0x135, 0x303: 0x136, 0x304: 0x137, 0x305: 0x138, 0x306: 0x139, 0x307: 0x13a, - 0x31a: 0x13b, 0x31b: 0x13c, - // Block 0xd, offset 0x340 - 0x340: 0x13d, 0x341: 0x13e, 0x342: 0x13f, 0x343: 0x140, 0x344: 0x141, 0x345: 0x142, 0x346: 0x143, 0x347: 0x144, - 0x348: 0x145, 0x349: 0x146, 0x34a: 0x147, 0x34b: 0x148, 0x34c: 0x149, 0x34d: 0x14a, - 0x350: 0x14b, 0x351: 0x14c, - // Block 0xe, offset 0x380 - 0x380: 0x14d, 0x381: 0x14e, 0x382: 0x14f, 0x383: 0x150, 0x384: 0x151, 0x385: 0x152, 0x386: 0x153, 0x387: 0x154, - 0x388: 0x155, 0x389: 0x156, 0x38a: 0x157, 0x38b: 0x158, 0x38c: 0x159, 0x38d: 0x15a, 0x38e: 0x15b, 0x38f: 0x15c, - 0x390: 0x15d, - // Block 0xf, offset 0x3c0 - 0x3e0: 0x15e, 0x3e1: 0x15f, 0x3e2: 0x160, 0x3e3: 0x161, 0x3e4: 0x162, 0x3e5: 0x163, 0x3e6: 0x164, 0x3e7: 0x165, - 0x3e8: 0x166, - 0x3fc: 0x167, 0x3fd: 0x168, 0x3fe: 0x169, - // Block 0x10, offset 0x400 - 0x400: 0x16a, - // Block 0x11, offset 0x440 - 0x440: 0x16b, 0x441: 0x16c, 0x442: 0x16d, 0x443: 0x16e, 0x444: 0x16f, 0x445: 0x170, 0x446: 0x171, 0x447: 0x172, - 0x448: 0x173, 0x449: 0x174, 0x44c: 0x175, 0x44d: 0x176, - 0x450: 0x177, 0x451: 0x178, 0x452: 0x179, 0x453: 0x17a, 0x454: 0x17b, 0x455: 0x17c, 0x456: 0x17d, 0x457: 0x17e, - 0x458: 0x17f, 0x459: 0x180, 0x45a: 0x181, 0x45b: 0x182, 0x45c: 0x183, 0x45d: 0x184, 0x45e: 0x185, 0x45f: 0x186, - // Block 0x12, offset 0x480 - 0x4b8: 0x187, 0x4b9: 0x188, 0x4ba: 0x189, 0x4bb: 0x18a, - // Block 0x13, offset 0x4c0 - 0x4c0: 0x18b, 0x4c1: 0x18c, 0x4c2: 0x18d, 0x4c3: 0x18e, 0x4c4: 0x18f, 0x4c5: 0x190, 0x4c6: 0x191, 0x4c7: 0x192, - 0x4c8: 0x193, 0x4c9: 0x194, 0x4cc: 0x195, 0x4cd: 0x196, 0x4ce: 0x197, 0x4cf: 0x198, - 0x4d0: 0x199, 0x4d1: 0x19a, 0x4d2: 0x19b, 0x4d3: 0x19c, 0x4d4: 0x19d, 0x4d5: 0x19e, 0x4d7: 0x19f, - 0x4d8: 0x1a0, 0x4d9: 0x1a1, 0x4da: 0x1a2, 0x4db: 0x1a3, 0x4dc: 0x1a4, 0x4dd: 0x1a5, - // Block 0x14, offset 0x500 - 0x520: 0x1a6, 0x521: 0x1a7, 0x522: 0x1a8, 0x523: 0x1a9, 0x524: 0x1aa, 0x525: 0x1ab, 0x526: 0x1ac, 0x527: 0x1ad, - 0x528: 0x1ae, - // Block 0x15, offset 0x540 - 0x550: 0x09, 0x551: 0x0a, 0x552: 0x0b, 0x553: 0x0c, 0x556: 0x0d, - 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, - 0x56f: 0x12, - // Block 0x16, offset 0x580 - 0x580: 0x1af, 0x581: 0x1b0, 0x584: 0x1b0, 0x585: 0x1b0, 0x586: 0x1b0, 0x587: 0x1b1, - // Block 0x17, offset 0x5c0 - 0x5e0: 0x14, - // Block 0x18, offset 0x600 - 0x602: 0x01, 0x603: 0x02, 0x604: 0x03, 0x605: 0x04, 0x606: 0x05, 0x607: 0x06, - 0x608: 0x07, 0x609: 0x08, 0x60a: 0x09, 0x60b: 0x0a, 0x60c: 0x0b, 0x60d: 0x0c, 0x60e: 0x0d, 0x60f: 0x0e, - 0x610: 0x0f, 0x611: 0x10, 0x612: 0x11, 0x613: 0x12, 0x614: 0x13, 0x615: 0x14, 0x616: 0x15, 0x617: 0x16, - 0x618: 0x17, 0x619: 0x18, 0x61a: 0x19, 0x61b: 0x1a, 0x61c: 0x1b, 0x61d: 0x1c, 0x61e: 0x1d, 0x61f: 0x1e, - 0x620: 0x01, 0x621: 0x02, 0x622: 0x03, 0x623: 0x04, 0x624: 0x05, - 0x62a: 0x06, 0x62d: 0x07, 0x62f: 0x08, - 0x630: 0x13, 0x633: 0x15, - // Block 0x19, offset 0x640 - 0x640: 0x3f, 0x641: 0x40, 0x642: 0x41, 0x643: 0x42, 0x644: 0x43, 0x645: 0x44, 0x646: 0x45, 0x647: 0x46, - 0x648: 0x47, 0x649: 0x48, 0x64a: 0x49, 0x64b: 0x4a, 0x64c: 0x4b, 0x64d: 0x4c, 0x64e: 0x4d, 0x64f: 0x4e, - 0x650: 0x4f, 0x651: 0x50, 0x652: 0x51, 0x653: 0x52, 0x654: 0x53, 0x655: 0x54, 0x656: 0x55, 0x657: 0x56, - 0x658: 0x57, 0x659: 0x58, 0x65a: 0x59, 0x65b: 0x5a, 0x65c: 0x5b, 0x65d: 0x5c, 0x65e: 0x5d, 0x65f: 0x5e, - 0x660: 0x5f, 0x661: 0x60, 0x662: 0x61, 0x663: 0x62, 0x664: 0x63, 0x665: 0x64, 0x666: 0x65, 0x667: 0x66, - 0x668: 0x67, 0x669: 0x68, 0x66a: 0x69, 0x66c: 0x6a, 0x66d: 0x6b, 0x66e: 0x6c, 0x66f: 0x6d, - 0x670: 0x6e, 0x671: 0x6f, 0x673: 0x70, 0x674: 0x71, 0x675: 0x72, 0x676: 0x73, 0x677: 0x74, - 0x678: 0x1ba, 0x679: 0x1bb, 0x67a: 0x1bc, 0x67b: 0x1bd, 0x67c: 0x79, 0x67d: 0x7a, 0x67e: 0x7b, 0x67f: 0x7c, - // Block 0x1a, offset 0x680 - 0x680: 0x7d, 0x681: 0x7e, 0x682: 0x7f, 0x683: 0x80, 0x684: 0x1be, 0x685: 0x1bf, 0x686: 0x83, 0x687: 0x84, - 0x688: 0x85, 0x689: 0x86, 0x68a: 0x87, 0x68b: 0x88, 0x68c: 0x89, 0x68d: 0x8a, 0x68e: 0x8b, 0x68f: 0x8c, - 0x690: 0x8d, 0x691: 0x8e, 0x692: 0x1c0, 0x693: 0x90, 0x694: 0x91, 0x695: 0x92, 0x696: 0x93, 0x697: 0x94, - 0x698: 0x95, 0x699: 0x96, 0x69a: 0x97, 0x69b: 0x98, 0x69c: 0x99, 0x69d: 0x9a, 0x69e: 0x9b, 0x69f: 0x9c, - 0x6a0: 0x9d, 0x6a1: 0x9e, 0x6a2: 0x9f, 0x6a3: 0xa0, 0x6a4: 0xa1, 0x6a5: 0xa2, 0x6a6: 0xa3, 0x6a7: 0xa4, - 0x6a8: 0xa5, 0x6a9: 0xa6, 0x6aa: 0xa7, 0x6ab: 0xa8, 0x6ac: 0xa9, 0x6ad: 0xaa, - 0x6b0: 0xab, 0x6b1: 0xac, 0x6b2: 0xad, 0x6b3: 0xae, 0x6b4: 0xaf, 0x6b5: 0xb0, 0x6b6: 0xb1, 0x6b7: 0xb2, - 0x6b8: 0xb3, 0x6ba: 0xb4, 0x6bb: 0xb5, 0x6bc: 0xb6, 0x6bd: 0xb7, 0x6be: 0xb8, 0x6bf: 0xb9, - // Block 0x1b, offset 0x6c0 - 0x6c0: 0xba, 0x6c1: 0xbb, 0x6c2: 0xbc, 0x6c3: 0xbd, 0x6c4: 0xbe, 0x6c5: 0xbf, 0x6c6: 0xc0, 0x6c7: 0xc1, - 0x6c8: 0xc2, 0x6c9: 0xc3, 0x6ca: 0xc4, 0x6cb: 0x1c1, 0x6cc: 0xc6, 0x6cd: 0x1c2, 0x6ce: 0x1c3, 0x6cf: 0x1c4, - // Block 0x1c, offset 0x700 - 0x724: 0xfb, 0x725: 0xfc, 0x726: 0xfd, 0x727: 0xfe, - 0x728: 0xff, 0x729: 0x100, 0x72a: 0x101, 0x72b: 0x102, 0x72c: 0x1c5, 0x72d: 0x104, 0x72e: 0x105, 0x72f: 0x106, - 0x730: 0x107, 0x731: 0x108, 0x732: 0x109, 0x733: 0x10a, 0x734: 0x10b, 0x735: 0x10c, 0x736: 0x10d, 0x737: 0x10e, - 0x738: 0x10f, 0x739: 0x110, 0x73a: 0x111, 0x73b: 0x112, 0x73c: 0x113, 0x73d: 0x114, 0x73e: 0x115, 0x73f: 0x116, - // Block 0x1d, offset 0x740 - 0x740: 0x18b, 0x741: 0x18c, 0x742: 0x18d, 0x743: 0x18e, 0x744: 0x1c6, 0x745: 0x1c7, 0x746: 0x191, 0x747: 0x192, - 0x748: 0x193, 0x749: 0x194, 0x74c: 0x195, 0x74d: 0x196, 0x74e: 0x197, 0x74f: 0x198, - 0x750: 0x199, 0x751: 0x19a, 0x752: 0x19b, 0x753: 0x19c, 0x754: 0x19d, 0x755: 0x19e, 0x757: 0x19f, - 0x758: 0x1a0, 0x759: 0x1a1, 0x75a: 0x1a2, 0x75b: 0x1a3, 0x75c: 0x1a4, 0x75d: 0x1a5, - // Block 0x1e, offset 0x780 - 0x790: 0x09, 0x791: 0x0a, 0x792: 0x0b, 0x793: 0x0c, 0x796: 0x0d, - 0x79b: 0x0e, 0x79d: 0x0f, 0x79e: 0x10, 0x79f: 0x1b, - 0x7af: 0x12, - // Block 0x1f, offset 0x7c0 - 0x7c2: 0x01, 0x7c3: 0x1b4, 0x7c4: 0x1b5, 0x7c5: 0x1b6, 0x7c6: 0x1b7, 0x7c7: 0x1b8, - 0x7c8: 0x1b9, 0x7c9: 0x08, 0x7ca: 0x09, 0x7cb: 0x0a, 0x7cc: 0x0b, 0x7cd: 0x0c, 0x7ce: 0x0d, 0x7cf: 0x0e, - 0x7d0: 0x0f, 0x7d1: 0x10, 0x7d2: 0x11, 0x7d3: 0x12, 0x7d4: 0x13, 0x7d5: 0x14, 0x7d6: 0x15, 0x7d7: 0x16, - 0x7d8: 0x17, 0x7d9: 0x18, 0x7da: 0x19, 0x7db: 0x1a, 0x7dc: 0x1b, 0x7dd: 0x1c, 0x7de: 0x1d, 0x7df: 0x1e, - 0x7e0: 0x01, 0x7e1: 0x17, 0x7e2: 0x18, 0x7e3: 0x19, 0x7e4: 0x05, - 0x7ea: 0x06, 0x7ed: 0x07, 0x7ef: 0x1a, - 0x7f0: 0x1c, 0x7f3: 0x15, - // Block 0x20, offset 0x800 - 0x802: 0x01, 0x803: 0x02, 0x804: 0x03, 0x805: 0x1c8, 0x806: 0x05, 0x807: 0x06, - 0x808: 0x07, 0x809: 0x08, 0x80a: 0x09, 0x80b: 0x0a, 0x80c: 0x0b, 0x80d: 0x0c, 0x80e: 0x0d, 0x80f: 0x0e, - 0x810: 0x0f, 0x811: 0x10, 0x812: 0x11, 0x813: 0x12, 0x814: 0x13, 0x815: 0x14, 0x816: 0x15, 0x817: 0x16, - 0x818: 0x17, 0x819: 0x18, 0x81a: 0x19, 0x81b: 0x1a, 0x81c: 0x1b, 0x81d: 0x1c, 0x81e: 0x1d, 0x81f: 0x1e, - 0x820: 0x01, 0x821: 0x02, 0x822: 0x03, 0x823: 0x04, 0x824: 0x05, - 0x82a: 0x06, 0x82d: 0x07, 0x82f: 0x08, - 0x830: 0x13, 0x833: 0x15, - // Block 0x21, offset 0x840 - 0x864: 0xfb, 0x865: 0xfc, 0x866: 0xfd, 0x867: 0xfe, - 0x868: 0xff, 0x869: 0x100, 0x86a: 0x101, 0x86b: 0x102, 0x86c: 0x103, 0x86d: 0x104, 0x86e: 0x105, 0x86f: 0x1cb, - 0x870: 0x1cc, 0x871: 0x1cd, 0x872: 0x1ce, 0x873: 0x1cf, 0x874: 0x1d0, 0x875: 0x10c, 0x876: 0x10d, 0x877: 0x10e, - 0x878: 0x10f, 0x879: 0x110, 0x87a: 0x1d1, 0x87b: 0x1d2, 0x87c: 0x113, 0x87d: 0x114, 0x87e: 0x115, 0x87f: 0x116, - // Block 0x22, offset 0x880 - 0x882: 0x01, 0x883: 0x02, 0x884: 0x03, 0x885: 0x04, 0x886: 0x05, 0x887: 0x06, - 0x888: 0x07, 0x889: 0x08, 0x88a: 0x09, 0x88b: 0x0a, 0x88c: 0x0b, 0x88d: 0x0c, 0x88e: 0x0d, 0x88f: 0x0e, - 0x890: 0x0f, 0x891: 0x10, 0x892: 0x11, 0x893: 0x12, 0x894: 0x13, 0x895: 0x14, 0x896: 0x15, 0x897: 0x16, - 0x898: 0x1c9, 0x899: 0x1ca, 0x89a: 0x19, 0x89b: 0x1a, 0x89c: 0x1b, 0x89d: 0x1c, 0x89e: 0x1d, 0x89f: 0x1e, - 0x8a0: 0x01, 0x8a1: 0x02, 0x8a2: 0x03, 0x8a3: 0x04, 0x8a4: 0x05, - 0x8aa: 0x06, 0x8ad: 0x07, 0x8af: 0x1f, - 0x8b0: 0x13, 0x8b3: 0x15, - // Block 0x23, offset 0x8c0 - 0x8e0: 0x1f, 0x8e1: 0x20, 0x8e2: 0x21, 0x8e3: 0x22, 0x8e4: 0x23, 0x8e5: 0x24, 0x8e6: 0x1d3, 0x8e7: 0x1d4, - 0x8e8: 0x27, 0x8e9: 0x28, 0x8ea: 0x29, 0x8eb: 0x2a, 0x8ec: 0x2b, 0x8ed: 0x2c, 0x8ee: 0x2d, 0x8ef: 0x2e, - 0x8f0: 0x2f, 0x8f1: 0x30, 0x8f2: 0x31, 0x8f3: 0x32, 0x8f4: 0x33, 0x8f5: 0x34, 0x8f6: 0x35, 0x8f7: 0x36, - 0x8f8: 0x37, 0x8f9: 0x38, 0x8fa: 0x39, 0x8fb: 0x3a, 0x8fc: 0x3b, 0x8fd: 0x3c, 0x8fe: 0x3d, 0x8ff: 0x3e, - // Block 0x24, offset 0x900 - 0x902: 0x01, 0x903: 0x02, 0x904: 0x03, 0x905: 0x04, 0x906: 0x05, 0x907: 0x06, - 0x908: 0x07, 0x909: 0x08, 0x90a: 0x09, 0x90b: 0x0a, 0x90c: 0x0b, 0x90d: 0x0c, 0x90e: 0x0d, 0x90f: 0x0e, - 0x910: 0x0f, 0x911: 0x10, 0x912: 0x11, 0x913: 0x12, 0x914: 0x13, 0x915: 0x14, 0x916: 0x15, 0x917: 0x16, - 0x918: 0x17, 0x919: 0x18, 0x91a: 0x19, 0x91b: 0x1a, 0x91c: 0x1b, 0x91d: 0x1c, 0x91e: 0x1d, 0x91f: 0x1e, - 0x920: 0x21, 0x921: 0x02, 0x922: 0x03, 0x923: 0x04, 0x924: 0x05, - 0x92a: 0x06, 0x92d: 0x07, 0x92f: 0x08, - 0x930: 0x13, 0x933: 0x15, - // Block 0x25, offset 0x940 - 0x940: 0x3f, 0x941: 0x40, 0x942: 0x41, 0x943: 0x42, 0x944: 0x43, 0x945: 0x44, 0x946: 0x45, 0x947: 0x46, - 0x948: 0x47, 0x949: 0x48, 0x94a: 0x49, 0x94b: 0x4a, 0x94c: 0x4b, 0x94d: 0x4c, 0x94e: 0x4d, 0x94f: 0x4e, - 0x950: 0x4f, 0x951: 0x50, 0x952: 0x51, 0x953: 0x52, 0x954: 0x53, 0x955: 0x54, 0x956: 0x55, 0x957: 0x56, - 0x958: 0x57, 0x959: 0x58, 0x95a: 0x59, 0x95b: 0x5a, 0x95c: 0x5b, 0x95d: 0x5c, 0x95e: 0x5d, 0x95f: 0x5e, - 0x960: 0x5f, 0x961: 0x60, 0x962: 0x61, 0x963: 0x62, 0x964: 0x63, 0x965: 0x64, 0x966: 0x65, 0x967: 0x66, - 0x968: 0x67, 0x969: 0x68, 0x96a: 0x69, 0x96c: 0x6a, 0x96d: 0x6b, 0x96e: 0x6c, 0x96f: 0x6d, - 0x970: 0x6e, 0x971: 0x6f, 0x973: 0x70, 0x974: 0x71, 0x975: 0x72, 0x976: 0x73, 0x977: 0x74, - 0x978: 0x1de, 0x979: 0x1df, 0x97a: 0x1e0, 0x97b: 0x1e1, 0x97c: 0x79, 0x97d: 0x7a, 0x97e: 0x7b, 0x97f: 0x7c, - // Block 0x26, offset 0x980 - 0x980: 0x7d, 0x981: 0x7e, 0x982: 0x7f, 0x983: 0x80, 0x984: 0x81, 0x985: 0x1e2, 0x986: 0x83, 0x987: 0x84, - 0x988: 0x85, 0x989: 0x86, 0x98a: 0x87, 0x98b: 0x88, 0x98c: 0x89, 0x98d: 0x8a, 0x98e: 0x8b, 0x98f: 0x8c, - 0x990: 0x8d, 0x991: 0x8e, 0x992: 0x1e3, 0x993: 0x90, 0x994: 0x91, 0x995: 0x92, 0x996: 0x93, 0x997: 0x94, - 0x998: 0x95, 0x999: 0x96, 0x99a: 0x97, 0x99b: 0x98, 0x99c: 0x99, 0x99d: 0x9a, 0x99e: 0x9b, 0x99f: 0x9c, - 0x9a0: 0x9d, 0x9a1: 0x9e, 0x9a2: 0x9f, 0x9a3: 0xa0, 0x9a4: 0xa1, 0x9a5: 0xa2, 0x9a6: 0xa3, 0x9a7: 0xa4, - 0x9a8: 0xa5, 0x9a9: 0xa6, 0x9aa: 0xa7, 0x9ab: 0xa8, 0x9ac: 0xa9, 0x9ad: 0xaa, - 0x9b0: 0xab, 0x9b1: 0xac, 0x9b2: 0xad, 0x9b3: 0xae, 0x9b4: 0xaf, 0x9b5: 0xb0, 0x9b6: 0xb1, 0x9b7: 0xb2, - 0x9b8: 0xb3, 0x9ba: 0xb4, 0x9bb: 0xb5, 0x9bc: 0xb6, 0x9bd: 0xb7, 0x9be: 0xb8, 0x9bf: 0xb9, - // Block 0x27, offset 0x9c0 - 0x9c0: 0xba, 0x9c1: 0xbb, 0x9c2: 0xbc, 0x9c3: 0xbd, 0x9c4: 0xbe, 0x9c5: 0xbf, 0x9c6: 0xc0, 0x9c7: 0xc1, - 0x9c8: 0xc2, 0x9c9: 0xc3, 0x9ca: 0xc4, 0x9cb: 0xc5, 0x9cc: 0xc6, 0x9cd: 0x1e4, 0x9ce: 0xc8, 0x9cf: 0x1e5, - // Block 0x28, offset 0xa00 - 0xa00: 0x18b, 0xa01: 0x18c, 0xa02: 0x18d, 0xa03: 0x18e, 0xa04: 0x1e6, 0xa05: 0x190, 0xa06: 0x191, 0xa07: 0x192, - 0xa08: 0x193, 0xa09: 0x194, 0xa0c: 0x195, 0xa0d: 0x196, 0xa0e: 0x197, 0xa0f: 0x198, - 0xa10: 0x199, 0xa11: 0x19a, 0xa12: 0x19b, 0xa13: 0x19c, 0xa14: 0x19d, 0xa15: 0x19e, 0xa17: 0x19f, - 0xa18: 0x1a0, 0xa19: 0x1a1, 0xa1a: 0x1a2, 0xa1b: 0x1a3, 0xa1c: 0x1a4, 0xa1d: 0x1a5, - // Block 0x29, offset 0xa40 - 0xa50: 0x09, 0xa51: 0x0a, 0xa52: 0x0b, 0xa53: 0x0c, 0xa56: 0x0d, - 0xa5b: 0x0e, 0xa5d: 0x0f, 0xa5e: 0x10, 0xa5f: 0x26, - 0xa6f: 0x12, - // Block 0x2a, offset 0xa80 - 0xa82: 0x01, 0xa83: 0x1d7, 0xa84: 0x1d8, 0xa85: 0x1d9, 0xa86: 0x1da, 0xa87: 0x1db, - 0xa88: 0x1dc, 0xa89: 0x1dd, 0xa8a: 0x09, 0xa8b: 0x0a, 0xa8c: 0x0b, 0xa8d: 0x0c, 0xa8e: 0x0d, 0xa8f: 0x0e, - 0xa90: 0x0f, 0xa91: 0x10, 0xa92: 0x11, 0xa93: 0x12, 0xa94: 0x13, 0xa95: 0x14, 0xa96: 0x15, 0xa97: 0x16, - 0xa98: 0x17, 0xa99: 0x18, 0xa9a: 0x19, 0xa9b: 0x1a, 0xa9c: 0x1b, 0xa9d: 0x1c, 0xa9e: 0x1d, 0xa9f: 0x1e, - 0xaa0: 0x01, 0xaa1: 0x23, 0xaa2: 0x24, 0xaa3: 0x25, 0xaa4: 0x05, - 0xaaa: 0x06, 0xaad: 0x07, 0xaaf: 0x08, - 0xab0: 0x27, 0xab3: 0x15, - // Block 0x2b, offset 0xac0 - 0xac2: 0x01, 0xac3: 0x02, 0xac4: 0x03, 0xac5: 0x04, 0xac6: 0x05, 0xac7: 0x06, - 0xac8: 0x07, 0xac9: 0x08, 0xaca: 0x09, 0xacb: 0x0a, 0xacc: 0x0b, 0xacd: 0x0c, 0xace: 0x0d, 0xacf: 0x0e, - 0xad0: 0x1e7, 0xad1: 0x1e8, 0xad2: 0x11, 0xad3: 0x12, 0xad4: 0x13, 0xad5: 0x14, 0xad6: 0x15, 0xad7: 0x16, - 0xad8: 0x17, 0xad9: 0x18, 0xada: 0x19, 0xadb: 0x1a, 0xadc: 0x1b, 0xadd: 0x1c, 0xade: 0x1d, 0xadf: 0x1e, - 0xae0: 0x01, 0xae1: 0x02, 0xae2: 0x03, 0xae3: 0x04, 0xae4: 0x05, - 0xaea: 0x06, 0xaed: 0x07, 0xaef: 0x08, - 0xaf0: 0x13, 0xaf3: 0x15, - // Block 0x2c, offset 0xb00 - 0xb20: 0x1f, 0xb21: 0x20, 0xb22: 0x21, 0xb23: 0x22, 0xb24: 0x23, 0xb25: 0x24, 0xb26: 0x1e9, 0xb27: 0x26, - 0xb28: 0x27, 0xb29: 0x28, 0xb2a: 0x29, 0xb2b: 0x2a, 0xb2c: 0x2b, 0xb2d: 0x2c, 0xb2e: 0x2d, 0xb2f: 0x2e, - 0xb30: 0x2f, 0xb31: 0x30, 0xb32: 0x31, 0xb33: 0x32, 0xb34: 0x33, 0xb35: 0x34, 0xb36: 0x35, 0xb37: 0x36, - 0xb38: 0x37, 0xb39: 0x38, 0xb3a: 0x39, 0xb3b: 0x3a, 0xb3c: 0x3b, 0xb3d: 0x3c, 0xb3e: 0x3d, 0xb3f: 0x3e, - // Block 0x2d, offset 0xb40 - 0xb42: 0x01, 0xb43: 0x02, 0xb44: 0x03, 0xb45: 0x04, 0xb46: 0x05, 0xb47: 0x06, - 0xb48: 0x07, 0xb49: 0x08, 0xb4a: 0x09, 0xb4b: 0x0a, 0xb4c: 0x0b, 0xb4d: 0x0c, 0xb4e: 0x0d, 0xb4f: 0x0e, - 0xb50: 0x0f, 0xb51: 0x10, 0xb52: 0x11, 0xb53: 0x12, 0xb54: 0x13, 0xb55: 0x14, 0xb56: 0x15, 0xb57: 0x16, - 0xb58: 0x17, 0xb59: 0x18, 0xb5a: 0x19, 0xb5b: 0x1a, 0xb5c: 0x1b, 0xb5d: 0x1c, 0xb5e: 0x1d, 0xb5f: 0x1e, - 0xb60: 0x2a, 0xb61: 0x02, 0xb62: 0x03, 0xb63: 0x04, 0xb64: 0x05, - 0xb6a: 0x06, 0xb6d: 0x07, 0xb6f: 0x08, - 0xb70: 0x13, 0xb73: 0x15, - // Block 0x2e, offset 0xb80 - 0xb82: 0x01, 0xb83: 0x02, 0xb84: 0x1ec, 0xb85: 0x1ed, 0xb86: 0x05, 0xb87: 0x06, - 0xb88: 0x07, 0xb89: 0x08, 0xb8a: 0x09, 0xb8b: 0x0a, 0xb8c: 0x0b, 0xb8d: 0x0c, 0xb8e: 0x0d, 0xb8f: 0x0e, - 0xb90: 0x0f, 0xb91: 0x10, 0xb92: 0x11, 0xb93: 0x12, 0xb94: 0x13, 0xb95: 0x14, 0xb96: 0x15, 0xb97: 0x16, - 0xb98: 0x17, 0xb99: 0x18, 0xb9a: 0x19, 0xb9b: 0x1a, 0xb9c: 0x1b, 0xb9d: 0x1c, 0xb9e: 0x1d, 0xb9f: 0x1e, - 0xba0: 0x01, 0xba1: 0x02, 0xba2: 0x03, 0xba3: 0x04, 0xba4: 0x05, - 0xbaa: 0x06, 0xbad: 0x07, 0xbaf: 0x08, - 0xbb0: 0x13, 0xbb3: 0x15, - // Block 0x2f, offset 0xbc0 - 0xbc0: 0x3f, 0xbc1: 0x40, 0xbc2: 0x41, 0xbc3: 0x42, 0xbc4: 0x43, 0xbc5: 0x44, 0xbc6: 0x45, 0xbc7: 0x46, - 0xbc8: 0x47, 0xbc9: 0x48, 0xbca: 0x49, 0xbcb: 0x4a, 0xbcc: 0x4b, 0xbcd: 0x4c, 0xbce: 0x4d, 0xbcf: 0x4e, - 0xbd0: 0x4f, 0xbd1: 0x50, 0xbd2: 0x51, 0xbd3: 0x52, 0xbd4: 0x53, 0xbd5: 0x54, 0xbd6: 0x55, 0xbd7: 0x56, - 0xbd8: 0x57, 0xbd9: 0x58, 0xbda: 0x59, 0xbdb: 0x5a, 0xbdc: 0x5b, 0xbdd: 0x5c, 0xbde: 0x5d, 0xbdf: 0x5e, - 0xbe0: 0x5f, 0xbe1: 0x60, 0xbe2: 0x61, 0xbe3: 0x62, 0xbe4: 0x63, 0xbe5: 0x64, 0xbe6: 0x65, 0xbe7: 0x66, - 0xbe8: 0x67, 0xbe9: 0x68, 0xbea: 0x69, 0xbec: 0x6a, 0xbed: 0x6b, 0xbee: 0x6c, 0xbef: 0x6d, - 0xbf0: 0x6e, 0xbf1: 0x6f, 0xbf3: 0x70, 0xbf4: 0x71, 0xbf5: 0x72, 0xbf6: 0x73, 0xbf7: 0x74, - 0xbf8: 0x75, 0xbf9: 0x1f2, 0xbfa: 0x77, 0xbfb: 0x78, 0xbfc: 0x79, 0xbfd: 0x7a, 0xbfe: 0x7b, 0xbff: 0x7c, - // Block 0x30, offset 0xc00 - 0xc02: 0x01, 0xc03: 0x02, 0xc04: 0x1f0, 0xc05: 0x1f1, 0xc06: 0x05, 0xc07: 0x06, - 0xc08: 0x07, 0xc09: 0x08, 0xc0a: 0x09, 0xc0b: 0x0a, 0xc0c: 0x0b, 0xc0d: 0x0c, 0xc0e: 0x0d, 0xc0f: 0x0e, - 0xc10: 0x0f, 0xc11: 0x10, 0xc12: 0x11, 0xc13: 0x12, 0xc14: 0x13, 0xc15: 0x14, 0xc16: 0x15, 0xc17: 0x16, - 0xc18: 0x17, 0xc19: 0x18, 0xc1a: 0x19, 0xc1b: 0x1a, 0xc1c: 0x1b, 0xc1d: 0x1c, 0xc1e: 0x1d, 0xc1f: 0x1e, - 0xc20: 0x01, 0xc21: 0x2d, 0xc22: 0x03, 0xc23: 0x04, 0xc24: 0x05, - 0xc2a: 0x06, 0xc2d: 0x07, 0xc2f: 0x08, - 0xc30: 0x13, 0xc33: 0x15, - // Block 0x31, offset 0xc40 - 0xc40: 0x3f, 0xc41: 0x40, 0xc42: 0x41, 0xc43: 0x42, 0xc44: 0x43, 0xc45: 0x44, 0xc46: 0x45, 0xc47: 0x46, - 0xc48: 0x47, 0xc49: 0x48, 0xc4a: 0x49, 0xc4b: 0x4a, 0xc4c: 0x4b, 0xc4d: 0x4c, 0xc4e: 0x4d, 0xc4f: 0x4e, - 0xc50: 0x4f, 0xc51: 0x50, 0xc52: 0x51, 0xc53: 0x52, 0xc54: 0x53, 0xc55: 0x54, 0xc56: 0x55, 0xc57: 0x56, - 0xc58: 0x57, 0xc59: 0x58, 0xc5a: 0x59, 0xc5b: 0x5a, 0xc5c: 0x5b, 0xc5d: 0x5c, 0xc5e: 0x5d, 0xc5f: 0x5e, - 0xc60: 0x5f, 0xc61: 0x60, 0xc62: 0x61, 0xc63: 0x62, 0xc64: 0x63, 0xc65: 0x64, 0xc66: 0x65, 0xc67: 0x66, - 0xc68: 0x67, 0xc69: 0x68, 0xc6a: 0x69, 0xc6c: 0x6a, 0xc6d: 0x6b, 0xc6e: 0x6c, 0xc6f: 0x6d, - 0xc70: 0x6e, 0xc71: 0x6f, 0xc73: 0x70, 0xc74: 0x71, 0xc75: 0x72, 0xc76: 0x1fc, 0xc77: 0x74, - 0xc78: 0x75, 0xc79: 0x1fd, 0xc7a: 0x77, 0xc7b: 0x78, 0xc7c: 0x79, 0xc7d: 0x7a, 0xc7e: 0x7b, 0xc7f: 0x7c, - // Block 0x32, offset 0xc80 - 0xc80: 0x7d, 0xc81: 0x7e, 0xc82: 0x7f, 0xc83: 0x80, 0xc84: 0x1fe, 0xc85: 0x82, 0xc86: 0x83, 0xc87: 0x84, - 0xc88: 0x85, 0xc89: 0x86, 0xc8a: 0x87, 0xc8b: 0x88, 0xc8c: 0x89, 0xc8d: 0x8a, 0xc8e: 0x8b, 0xc8f: 0x8c, - 0xc90: 0x8d, 0xc91: 0x8e, 0xc92: 0x8f, 0xc93: 0x90, 0xc94: 0x91, 0xc95: 0x92, 0xc96: 0x93, 0xc97: 0x94, - 0xc98: 0x95, 0xc99: 0x96, 0xc9a: 0x97, 0xc9b: 0x98, 0xc9c: 0x99, 0xc9d: 0x9a, 0xc9e: 0x9b, 0xc9f: 0x9c, - 0xca0: 0x9d, 0xca1: 0x9e, 0xca2: 0x9f, 0xca3: 0xa0, 0xca4: 0xa1, 0xca5: 0xa2, 0xca6: 0xa3, 0xca7: 0xa4, - 0xca8: 0xa5, 0xca9: 0xa6, 0xcaa: 0xa7, 0xcab: 0xa8, 0xcac: 0xa9, 0xcad: 0xaa, - 0xcb0: 0xab, 0xcb1: 0xac, 0xcb2: 0xad, 0xcb3: 0xae, 0xcb4: 0xaf, 0xcb5: 0xb0, 0xcb6: 0xb1, 0xcb7: 0xb2, - 0xcb8: 0xb3, 0xcba: 0xb4, 0xcbb: 0xb5, 0xcbc: 0xb6, 0xcbd: 0xb7, 0xcbe: 0xb8, 0xcbf: 0xb9, - // Block 0x33, offset 0xcc0 - 0xcc2: 0x01, 0xcc3: 0x1f7, 0xcc4: 0x1f8, 0xcc5: 0x1f9, 0xcc6: 0x05, 0xcc7: 0x1fa, - 0xcc8: 0x1fb, 0xcc9: 0x08, 0xcca: 0x09, 0xccb: 0x0a, 0xccc: 0x0b, 0xccd: 0x0c, 0xcce: 0x0d, 0xccf: 0x0e, - 0xcd0: 0x0f, 0xcd1: 0x10, 0xcd2: 0x11, 0xcd3: 0x12, 0xcd4: 0x13, 0xcd5: 0x14, 0xcd6: 0x15, 0xcd7: 0x16, - 0xcd8: 0x17, 0xcd9: 0x18, 0xcda: 0x19, 0xcdb: 0x1a, 0xcdc: 0x1b, 0xcdd: 0x1c, 0xcde: 0x1d, 0xcdf: 0x1e, - 0xce0: 0x01, 0xce1: 0x2f, 0xce2: 0x30, 0xce3: 0x04, 0xce4: 0x05, - 0xcea: 0x06, 0xced: 0x07, 0xcef: 0x08, - 0xcf0: 0x13, 0xcf3: 0x15, - // Block 0x34, offset 0xd00 - 0xd00: 0x3f, 0xd01: 0x40, 0xd02: 0x41, 0xd03: 0x42, 0xd04: 0x43, 0xd05: 0x44, 0xd06: 0x45, 0xd07: 0x46, - 0xd08: 0x47, 0xd09: 0x48, 0xd0a: 0x49, 0xd0b: 0x4a, 0xd0c: 0x4b, 0xd0d: 0x4c, 0xd0e: 0x4d, 0xd0f: 0x4e, - 0xd10: 0x4f, 0xd11: 0x50, 0xd12: 0x51, 0xd13: 0x52, 0xd14: 0x53, 0xd15: 0x54, 0xd16: 0x55, 0xd17: 0x56, - 0xd18: 0x57, 0xd19: 0x58, 0xd1a: 0x59, 0xd1b: 0x5a, 0xd1c: 0x5b, 0xd1d: 0x5c, 0xd1e: 0x5d, 0xd1f: 0x5e, - 0xd20: 0x5f, 0xd21: 0x60, 0xd22: 0x61, 0xd23: 0x62, 0xd24: 0x63, 0xd25: 0x64, 0xd26: 0x65, 0xd27: 0x66, - 0xd28: 0x67, 0xd29: 0x68, 0xd2a: 0x69, 0xd2c: 0x6a, 0xd2d: 0x6b, 0xd2e: 0x6c, 0xd2f: 0x6d, - 0xd30: 0x6e, 0xd31: 0x6f, 0xd33: 0x70, 0xd34: 0x71, 0xd35: 0x72, 0xd36: 0x73, 0xd37: 0x74, - 0xd38: 0x75, 0xd39: 0x204, 0xd3a: 0x77, 0xd3b: 0x78, 0xd3c: 0x79, 0xd3d: 0x7a, 0xd3e: 0x7b, 0xd3f: 0x7c, - // Block 0x35, offset 0xd40 - 0xd42: 0x01, 0xd43: 0x201, 0xd44: 0x03, 0xd45: 0x04, 0xd46: 0x05, 0xd47: 0x202, - 0xd48: 0x203, 0xd49: 0x08, 0xd4a: 0x09, 0xd4b: 0x0a, 0xd4c: 0x0b, 0xd4d: 0x0c, 0xd4e: 0x0d, 0xd4f: 0x0e, - 0xd50: 0x0f, 0xd51: 0x10, 0xd52: 0x11, 0xd53: 0x12, 0xd54: 0x13, 0xd55: 0x14, 0xd56: 0x15, 0xd57: 0x16, - 0xd58: 0x17, 0xd59: 0x18, 0xd5a: 0x19, 0xd5b: 0x1a, 0xd5c: 0x1b, 0xd5d: 0x1c, 0xd5e: 0x1d, 0xd5f: 0x1e, - 0xd60: 0x01, 0xd61: 0x32, 0xd62: 0x03, 0xd63: 0x04, 0xd64: 0x05, - 0xd6a: 0x06, 0xd6d: 0x07, 0xd6f: 0x08, - 0xd70: 0x13, 0xd73: 0x15, - // Block 0x36, offset 0xd80 - 0xda0: 0x1f, 0xda1: 0x20, 0xda2: 0x21, 0xda3: 0x22, 0xda4: 0x23, 0xda5: 0x24, 0xda6: 0x25, 0xda7: 0x26, - 0xda8: 0x27, 0xda9: 0x28, 0xdaa: 0x29, 0xdab: 0x2a, 0xdac: 0x2b, 0xdad: 0x2c, 0xdae: 0x2d, 0xdaf: 0x2e, - 0xdb0: 0x2f, 0xdb1: 0x30, 0xdb2: 0x31, 0xdb3: 0x32, 0xdb4: 0x33, 0xdb5: 0x34, 0xdb6: 0x35, 0xdb7: 0x36, - 0xdb8: 0x37, 0xdb9: 0x38, 0xdba: 0x39, 0xdbb: 0x3a, 0xdbc: 0x205, 0xdbd: 0x206, 0xdbe: 0x207, 0xdbf: 0x3e, - // Block 0x37, offset 0xdc0 - 0xdc2: 0x01, 0xdc3: 0x02, 0xdc4: 0x03, 0xdc5: 0x04, 0xdc6: 0x05, 0xdc7: 0x06, - 0xdc8: 0x07, 0xdc9: 0x08, 0xdca: 0x09, 0xdcb: 0x0a, 0xdcc: 0x0b, 0xdcd: 0x0c, 0xdce: 0x0d, 0xdcf: 0x0e, - 0xdd0: 0x0f, 0xdd1: 0x10, 0xdd2: 0x11, 0xdd3: 0x12, 0xdd4: 0x13, 0xdd5: 0x14, 0xdd6: 0x15, 0xdd7: 0x16, - 0xdd8: 0x17, 0xdd9: 0x18, 0xdda: 0x19, 0xddb: 0x1a, 0xddc: 0x1b, 0xddd: 0x1c, 0xdde: 0x1d, 0xddf: 0x1e, - 0xde0: 0x34, 0xde1: 0x02, 0xde2: 0x03, 0xde3: 0x04, 0xde4: 0x05, - 0xdea: 0x06, 0xded: 0x07, 0xdef: 0x08, - 0xdf0: 0x13, 0xdf3: 0x15, - // Block 0x38, offset 0xe00 - 0xe00: 0x3f, 0xe01: 0x40, 0xe02: 0x41, 0xe03: 0x42, 0xe04: 0x43, 0xe05: 0x44, 0xe06: 0x45, 0xe07: 0x46, - 0xe08: 0x47, 0xe09: 0x48, 0xe0a: 0x49, 0xe0b: 0x4a, 0xe0c: 0x4b, 0xe0d: 0x4c, 0xe0e: 0x4d, 0xe0f: 0x4e, - 0xe10: 0x4f, 0xe11: 0x50, 0xe12: 0x51, 0xe13: 0x52, 0xe14: 0x53, 0xe15: 0x54, 0xe16: 0x55, 0xe17: 0x56, - 0xe18: 0x57, 0xe19: 0x58, 0xe1a: 0x59, 0xe1b: 0x5a, 0xe1c: 0x5b, 0xe1d: 0x5c, 0xe1e: 0x5d, 0xe1f: 0x5e, - 0xe20: 0x5f, 0xe21: 0x60, 0xe22: 0x61, 0xe23: 0x62, 0xe24: 0x63, 0xe25: 0x64, 0xe26: 0x65, 0xe27: 0x66, - 0xe28: 0x67, 0xe29: 0x68, 0xe2a: 0x69, 0xe2c: 0x6a, 0xe2d: 0x6b, 0xe2e: 0x6c, 0xe2f: 0x6d, - 0xe30: 0x6e, 0xe31: 0x6f, 0xe33: 0x70, 0xe34: 0x71, 0xe35: 0x72, 0xe36: 0x73, 0xe37: 0x74, - 0xe38: 0x75, 0xe39: 0x76, 0xe3a: 0x211, 0xe3b: 0x212, 0xe3c: 0x79, 0xe3d: 0x7a, 0xe3e: 0x7b, 0xe3f: 0x7c, - // Block 0x39, offset 0xe40 - 0xe40: 0x7d, 0xe41: 0x7e, 0xe42: 0x7f, 0xe43: 0x80, 0xe44: 0x81, 0xe45: 0x213, 0xe46: 0x83, 0xe47: 0x84, - 0xe48: 0x85, 0xe49: 0x86, 0xe4a: 0x87, 0xe4b: 0x88, 0xe4c: 0x89, 0xe4d: 0x8a, 0xe4e: 0x8b, 0xe4f: 0x8c, - 0xe50: 0x8d, 0xe51: 0x8e, 0xe52: 0x214, 0xe53: 0x90, 0xe54: 0x91, 0xe55: 0x92, 0xe56: 0x93, 0xe57: 0x94, - 0xe58: 0x95, 0xe59: 0x96, 0xe5a: 0x97, 0xe5b: 0x98, 0xe5c: 0x99, 0xe5d: 0x9a, 0xe5e: 0x9b, 0xe5f: 0x9c, - 0xe60: 0x9d, 0xe61: 0x9e, 0xe62: 0x9f, 0xe63: 0xa0, 0xe64: 0xa1, 0xe65: 0xa2, 0xe66: 0xa3, 0xe67: 0xa4, - 0xe68: 0xa5, 0xe69: 0xa6, 0xe6a: 0xa7, 0xe6b: 0xa8, 0xe6c: 0xa9, 0xe6d: 0xaa, - 0xe70: 0xab, 0xe71: 0xac, 0xe72: 0xad, 0xe73: 0xae, 0xe74: 0xaf, 0xe75: 0xb0, 0xe76: 0xb1, 0xe77: 0xb2, - 0xe78: 0xb3, 0xe7a: 0xb4, 0xe7b: 0xb5, 0xe7c: 0xb6, 0xe7d: 0xb7, 0xe7e: 0xb8, 0xe7f: 0xb9, - // Block 0x3a, offset 0xe80 - 0xe80: 0xba, 0xe81: 0xbb, 0xe82: 0xbc, 0xe83: 0xbd, 0xe84: 0xbe, 0xe85: 0xbf, 0xe86: 0xc0, 0xe87: 0xc1, - 0xe88: 0xc2, 0xe89: 0xc3, 0xe8a: 0xc4, 0xe8b: 0xc5, 0xe8c: 0xc6, 0xe8d: 0xc7, 0xe8e: 0xc8, 0xe8f: 0x215, - // Block 0x3b, offset 0xec0 - 0xec0: 0x18b, 0xec1: 0x18c, 0xec2: 0x18d, 0xec3: 0x18e, 0xec4: 0x216, 0xec5: 0x190, 0xec6: 0x191, 0xec7: 0x192, - 0xec8: 0x193, 0xec9: 0x194, 0xecc: 0x195, 0xecd: 0x196, 0xece: 0x197, 0xecf: 0x198, - 0xed0: 0x199, 0xed1: 0x19a, 0xed2: 0x19b, 0xed3: 0x19c, 0xed4: 0x19d, 0xed5: 0x19e, 0xed7: 0x19f, - 0xed8: 0x1a0, 0xed9: 0x1a1, 0xeda: 0x1a2, 0xedb: 0x1a3, 0xedc: 0x1a4, 0xedd: 0x1a5, - // Block 0x3c, offset 0xf00 - 0xf10: 0x09, 0xf11: 0x0a, 0xf12: 0x0b, 0xf13: 0x0c, 0xf16: 0x0d, - 0xf1b: 0x0e, 0xf1d: 0x0f, 0xf1e: 0x10, 0xf1f: 0x39, - 0xf2f: 0x12, - // Block 0x3d, offset 0xf40 - 0xf42: 0x01, 0xf43: 0x20a, 0xf44: 0x20b, 0xf45: 0x20c, 0xf46: 0x20d, 0xf47: 0x06, - 0xf48: 0x07, 0xf49: 0x20e, 0xf4a: 0x20f, 0xf4b: 0x0a, 0xf4c: 0x210, 0xf4d: 0x0c, 0xf4e: 0x0d, 0xf4f: 0x0e, - 0xf50: 0x0f, 0xf51: 0x10, 0xf52: 0x11, 0xf53: 0x12, 0xf54: 0x13, 0xf55: 0x14, 0xf56: 0x15, 0xf57: 0x16, - 0xf58: 0x17, 0xf59: 0x18, 0xf5a: 0x19, 0xf5b: 0x1a, 0xf5c: 0x1b, 0xf5d: 0x1c, 0xf5e: 0x1d, 0xf5f: 0x1e, - 0xf60: 0x01, 0xf61: 0x36, 0xf62: 0x37, 0xf63: 0x38, 0xf64: 0x05, - 0xf6a: 0x06, 0xf6d: 0x07, 0xf6f: 0x08, - 0xf70: 0x3a, 0xf73: 0x15, - // Block 0x3e, offset 0xf80 - 0xf80: 0x3f, 0xf81: 0x40, 0xf82: 0x41, 0xf83: 0x42, 0xf84: 0x43, 0xf85: 0x44, 0xf86: 0x45, 0xf87: 0x46, - 0xf88: 0x47, 0xf89: 0x48, 0xf8a: 0x49, 0xf8b: 0x4a, 0xf8c: 0x4b, 0xf8d: 0x4c, 0xf8e: 0x4d, 0xf8f: 0x4e, - 0xf90: 0x4f, 0xf91: 0x50, 0xf92: 0x51, 0xf93: 0x52, 0xf94: 0x53, 0xf95: 0x54, 0xf96: 0x55, 0xf97: 0x56, - 0xf98: 0x57, 0xf99: 0x58, 0xf9a: 0x59, 0xf9b: 0x5a, 0xf9c: 0x5b, 0xf9d: 0x5c, 0xf9e: 0x5d, 0xf9f: 0x5e, - 0xfa0: 0x5f, 0xfa1: 0x60, 0xfa2: 0x61, 0xfa3: 0x62, 0xfa4: 0x63, 0xfa5: 0x64, 0xfa6: 0x65, 0xfa7: 0x66, - 0xfa8: 0x67, 0xfa9: 0x68, 0xfaa: 0x69, 0xfac: 0x6a, 0xfad: 0x6b, 0xfae: 0x6c, 0xfaf: 0x6d, - 0xfb0: 0x6e, 0xfb1: 0x6f, 0xfb3: 0x70, 0xfb4: 0x71, 0xfb5: 0x72, 0xfb6: 0x73, 0xfb7: 0x74, - 0xfb8: 0x220, 0xfb9: 0x221, 0xfba: 0x222, 0xfbb: 0x223, 0xfbc: 0x79, 0xfbd: 0x7a, 0xfbe: 0x7b, 0xfbf: 0x224, - // Block 0x3f, offset 0xfc0 - 0xfc0: 0x225, 0xfc1: 0x226, 0xfc2: 0x7f, 0xfc3: 0x80, 0xfc4: 0x227, 0xfc5: 0x228, 0xfc6: 0x83, 0xfc7: 0x84, - 0xfc8: 0x85, 0xfc9: 0x229, 0xfca: 0x87, 0xfcb: 0x88, 0xfcc: 0x89, 0xfcd: 0x8a, 0xfce: 0x8b, 0xfcf: 0x8c, - 0xfd0: 0x8d, 0xfd1: 0x22a, 0xfd2: 0x22b, 0xfd3: 0x90, 0xfd4: 0x91, 0xfd5: 0x92, 0xfd6: 0x93, 0xfd7: 0x94, - 0xfd8: 0x95, 0xfd9: 0x96, 0xfda: 0x97, 0xfdb: 0x98, 0xfdc: 0x99, 0xfdd: 0x9a, 0xfde: 0x9b, 0xfdf: 0x9c, - 0xfe0: 0x9d, 0xfe1: 0x9e, 0xfe2: 0x9f, 0xfe3: 0xa0, 0xfe4: 0xa1, 0xfe5: 0xa2, 0xfe6: 0xa3, 0xfe7: 0xa4, - 0xfe8: 0xa5, 0xfe9: 0x22c, 0xfea: 0xa7, 0xfeb: 0xa8, 0xfec: 0xa9, 0xfed: 0xaa, - 0xff0: 0xab, 0xff1: 0xac, 0xff2: 0xad, 0xff3: 0xae, 0xff4: 0xaf, 0xff5: 0xb0, 0xff6: 0xb1, 0xff7: 0xb2, - 0xff8: 0xb3, 0xffa: 0xb4, 0xffb: 0xb5, 0xffc: 0xb6, 0xffd: 0xb7, 0xffe: 0xb8, 0xfff: 0xb9, - // Block 0x40, offset 0x1000 - 0x1000: 0xba, 0x1001: 0xbb, 0x1002: 0xbc, 0x1003: 0xbd, 0x1004: 0xbe, 0x1005: 0xbf, 0x1006: 0xc0, 0x1007: 0xc1, - 0x1008: 0x22d, 0x1009: 0x22e, 0x100a: 0x22f, 0x100b: 0x230, 0x100c: 0xc6, 0x100d: 0x231, 0x100e: 0x232, 0x100f: 0x233, - // Block 0x41, offset 0x1040 - 0x1064: 0xfb, 0x1065: 0xfc, 0x1066: 0xfd, 0x1067: 0xfe, - 0x1068: 0xff, 0x1069: 0x100, 0x106a: 0x101, 0x106b: 0x102, 0x106c: 0x234, 0x106d: 0x104, 0x106e: 0x105, 0x106f: 0x106, - 0x1070: 0x107, 0x1071: 0x108, 0x1072: 0x109, 0x1073: 0x10a, 0x1074: 0x10b, 0x1075: 0x10c, 0x1076: 0x10d, 0x1077: 0x10e, - 0x1078: 0x235, 0x1079: 0x110, 0x107a: 0x111, 0x107b: 0x112, 0x107c: 0x113, 0x107d: 0x114, 0x107e: 0x115, 0x107f: 0x116, - // Block 0x42, offset 0x1080 - 0x1080: 0x18b, 0x1081: 0x18c, 0x1082: 0x18d, 0x1083: 0x18e, 0x1084: 0x236, 0x1085: 0x237, 0x1086: 0x238, 0x1087: 0x192, - 0x1088: 0x193, 0x1089: 0x194, 0x108c: 0x195, 0x108d: 0x196, 0x108e: 0x197, 0x108f: 0x198, - 0x1090: 0x199, 0x1091: 0x19a, 0x1092: 0x19b, 0x1093: 0x19c, 0x1094: 0x19d, 0x1095: 0x19e, 0x1097: 0x19f, - 0x1098: 0x1a0, 0x1099: 0x1a1, 0x109a: 0x1a2, 0x109b: 0x1a3, 0x109c: 0x1a4, 0x109d: 0x1a5, - // Block 0x43, offset 0x10c0 - 0x10d0: 0x09, 0x10d1: 0x0a, 0x10d2: 0x0b, 0x10d3: 0x0c, 0x10d6: 0x0d, - 0x10db: 0x0e, 0x10dd: 0x0f, 0x10de: 0x10, 0x10df: 0x40, - 0x10ef: 0x12, - // Block 0x44, offset 0x1100 - 0x1102: 0x01, 0x1103: 0x219, 0x1104: 0x21a, 0x1105: 0x21b, 0x1106: 0x21c, 0x1107: 0x21d, - 0x1108: 0x21e, 0x1109: 0x08, 0x110a: 0x09, 0x110b: 0x0a, 0x110c: 0x0b, 0x110d: 0x21f, 0x110e: 0x0d, 0x110f: 0x0e, - 0x1110: 0x0f, 0x1111: 0x10, 0x1112: 0x11, 0x1113: 0x12, 0x1114: 0x13, 0x1115: 0x14, 0x1116: 0x15, 0x1117: 0x16, - 0x1118: 0x17, 0x1119: 0x18, 0x111a: 0x19, 0x111b: 0x1a, 0x111c: 0x1b, 0x111d: 0x1c, 0x111e: 0x1d, 0x111f: 0x1e, - 0x1120: 0x01, 0x1121: 0x3c, 0x1122: 0x3d, 0x1123: 0x3e, 0x1124: 0x05, - 0x112a: 0x06, 0x112d: 0x07, 0x112f: 0x3f, - 0x1130: 0x41, 0x1133: 0x15, - // Block 0x45, offset 0x1140 - 0x1142: 0x01, 0x1143: 0x02, 0x1144: 0x23b, 0x1145: 0x23c, 0x1146: 0x05, 0x1147: 0x06, - 0x1148: 0x07, 0x1149: 0x08, 0x114a: 0x09, 0x114b: 0x0a, 0x114c: 0x0b, 0x114d: 0x0c, 0x114e: 0x0d, 0x114f: 0x0e, - 0x1150: 0x0f, 0x1151: 0x10, 0x1152: 0x11, 0x1153: 0x12, 0x1154: 0x13, 0x1155: 0x14, 0x1156: 0x15, 0x1157: 0x16, - 0x1158: 0x17, 0x1159: 0x18, 0x115a: 0x19, 0x115b: 0x1a, 0x115c: 0x1b, 0x115d: 0x1c, 0x115e: 0x1d, 0x115f: 0x1e, - 0x1160: 0x01, 0x1161: 0x02, 0x1162: 0x03, 0x1163: 0x04, 0x1164: 0x05, - 0x116a: 0x06, 0x116d: 0x07, 0x116f: 0x08, - 0x1170: 0x13, 0x1173: 0x15, - // Block 0x46, offset 0x1180 - 0x1182: 0x01, 0x1183: 0x23f, 0x1184: 0x03, 0x1185: 0x04, 0x1186: 0x05, 0x1187: 0x06, - 0x1188: 0x07, 0x1189: 0x08, 0x118a: 0x09, 0x118b: 0x0a, 0x118c: 0x0b, 0x118d: 0x0c, 0x118e: 0x0d, 0x118f: 0x0e, - 0x1190: 0x0f, 0x1191: 0x10, 0x1192: 0x11, 0x1193: 0x12, 0x1194: 0x13, 0x1195: 0x14, 0x1196: 0x15, 0x1197: 0x16, - 0x1198: 0x17, 0x1199: 0x18, 0x119a: 0x19, 0x119b: 0x1a, 0x119c: 0x1b, 0x119d: 0x1c, 0x119e: 0x1d, 0x119f: 0x1e, - 0x11a0: 0x01, 0x11a1: 0x02, 0x11a2: 0x03, 0x11a3: 0x04, 0x11a4: 0x05, - 0x11aa: 0x06, 0x11ad: 0x07, 0x11af: 0x08, - 0x11b0: 0x13, 0x11b3: 0x15, - // Block 0x47, offset 0x11c0 - 0x11c0: 0x3f, 0x11c1: 0x40, 0x11c2: 0x41, 0x11c3: 0x42, 0x11c4: 0x43, 0x11c5: 0x44, 0x11c6: 0x45, 0x11c7: 0x46, - 0x11c8: 0x47, 0x11c9: 0x48, 0x11ca: 0x49, 0x11cb: 0x4a, 0x11cc: 0x4b, 0x11cd: 0x4c, 0x11ce: 0x4d, 0x11cf: 0x4e, - 0x11d0: 0x4f, 0x11d1: 0x50, 0x11d2: 0x51, 0x11d3: 0x52, 0x11d4: 0x53, 0x11d5: 0x54, 0x11d6: 0x55, 0x11d7: 0x56, - 0x11d8: 0x57, 0x11d9: 0x58, 0x11da: 0x59, 0x11db: 0x5a, 0x11dc: 0x5b, 0x11dd: 0x5c, 0x11de: 0x5d, 0x11df: 0x5e, - 0x11e0: 0x5f, 0x11e1: 0x60, 0x11e2: 0x61, 0x11e3: 0x62, 0x11e4: 0x63, 0x11e5: 0x64, 0x11e6: 0x65, 0x11e7: 0x66, - 0x11e8: 0x67, 0x11e9: 0x68, 0x11ea: 0x69, 0x11ec: 0x6a, 0x11ed: 0x6b, 0x11ee: 0x6c, 0x11ef: 0x6d, - 0x11f0: 0x6e, 0x11f1: 0x6f, 0x11f3: 0x70, 0x11f4: 0x71, 0x11f5: 0x72, 0x11f6: 0x73, 0x11f7: 0x74, - 0x11f8: 0x75, 0x11f9: 0x246, 0x11fa: 0x247, 0x11fb: 0x248, 0x11fc: 0x79, 0x11fd: 0x7a, 0x11fe: 0x7b, 0x11ff: 0x7c, - // Block 0x48, offset 0x1200 - 0x1200: 0x7d, 0x1201: 0x7e, 0x1202: 0x7f, 0x1203: 0x80, 0x1204: 0x81, 0x1205: 0x82, 0x1206: 0x83, 0x1207: 0x84, - 0x1208: 0x85, 0x1209: 0x86, 0x120a: 0x87, 0x120b: 0x88, 0x120c: 0x89, 0x120d: 0x8a, 0x120e: 0x8b, 0x120f: 0x8c, - 0x1210: 0x8d, 0x1211: 0x8e, 0x1212: 0x249, 0x1213: 0x90, 0x1214: 0x91, 0x1215: 0x92, 0x1216: 0x93, 0x1217: 0x94, - 0x1218: 0x95, 0x1219: 0x96, 0x121a: 0x97, 0x121b: 0x98, 0x121c: 0x99, 0x121d: 0x9a, 0x121e: 0x9b, 0x121f: 0x9c, - 0x1220: 0x9d, 0x1221: 0x9e, 0x1222: 0x9f, 0x1223: 0xa0, 0x1224: 0xa1, 0x1225: 0xa2, 0x1226: 0xa3, 0x1227: 0xa4, - 0x1228: 0xa5, 0x1229: 0xa6, 0x122a: 0xa7, 0x122b: 0xa8, 0x122c: 0xa9, 0x122d: 0xaa, - 0x1230: 0xab, 0x1231: 0xac, 0x1232: 0xad, 0x1233: 0xae, 0x1234: 0xaf, 0x1235: 0xb0, 0x1236: 0xb1, 0x1237: 0xb2, - 0x1238: 0xb3, 0x123a: 0xb4, 0x123b: 0xb5, 0x123c: 0xb6, 0x123d: 0xb7, 0x123e: 0xb8, 0x123f: 0xb9, - // Block 0x49, offset 0x1240 - 0x1240: 0xba, 0x1241: 0xbb, 0x1242: 0xbc, 0x1243: 0xbd, 0x1244: 0xbe, 0x1245: 0xbf, 0x1246: 0xc0, 0x1247: 0xc1, - 0x1248: 0xc2, 0x1249: 0xc3, 0x124a: 0xc4, 0x124b: 0xc5, 0x124c: 0xc6, 0x124d: 0xc7, 0x124e: 0x24a, 0x124f: 0x24b, - // Block 0x4a, offset 0x1280 - 0x1280: 0x18b, 0x1281: 0x18c, 0x1282: 0x18d, 0x1283: 0x18e, 0x1284: 0x24c, 0x1285: 0x24d, 0x1286: 0x191, 0x1287: 0x192, - 0x1288: 0x193, 0x1289: 0x194, 0x128c: 0x195, 0x128d: 0x196, 0x128e: 0x197, 0x128f: 0x198, - 0x1290: 0x199, 0x1291: 0x19a, 0x1292: 0x19b, 0x1293: 0x19c, 0x1294: 0x19d, 0x1295: 0x19e, 0x1297: 0x19f, - 0x1298: 0x1a0, 0x1299: 0x1a1, 0x129a: 0x1a2, 0x129b: 0x1a3, 0x129c: 0x1a4, 0x129d: 0x1a5, - // Block 0x4b, offset 0x12c0 - 0x12d0: 0x09, 0x12d1: 0x0a, 0x12d2: 0x0b, 0x12d3: 0x0c, 0x12d6: 0x0d, - 0x12db: 0x0e, 0x12dd: 0x0f, 0x12de: 0x10, 0x12df: 0x48, - 0x12ef: 0x12, - // Block 0x4c, offset 0x1300 - 0x1302: 0x01, 0x1303: 0x242, 0x1304: 0x03, 0x1305: 0x243, 0x1306: 0x05, 0x1307: 0x244, - 0x1308: 0x245, 0x1309: 0x08, 0x130a: 0x09, 0x130b: 0x0a, 0x130c: 0x0b, 0x130d: 0x0c, 0x130e: 0x0d, 0x130f: 0x0e, - 0x1310: 0x0f, 0x1311: 0x10, 0x1312: 0x11, 0x1313: 0x12, 0x1314: 0x13, 0x1315: 0x14, 0x1316: 0x15, 0x1317: 0x16, - 0x1318: 0x17, 0x1319: 0x18, 0x131a: 0x19, 0x131b: 0x1a, 0x131c: 0x1b, 0x131d: 0x1c, 0x131e: 0x1d, 0x131f: 0x1e, - 0x1320: 0x01, 0x1321: 0x45, 0x1322: 0x46, 0x1323: 0x47, 0x1324: 0x05, - 0x132a: 0x06, 0x132d: 0x07, 0x132f: 0x08, - 0x1330: 0x49, 0x1333: 0x15, - // Block 0x4d, offset 0x1340 - 0x1364: 0xfb, 0x1365: 0xfc, 0x1366: 0xfd, 0x1367: 0xfe, - 0x1368: 0xff, 0x1369: 0x100, 0x136a: 0x101, 0x136b: 0x102, 0x136c: 0x103, 0x136d: 0x104, 0x136e: 0x252, 0x136f: 0x106, - 0x1370: 0x253, 0x1371: 0x254, 0x1372: 0x255, 0x1373: 0x256, 0x1374: 0x257, 0x1375: 0x10c, 0x1376: 0x10d, 0x1377: 0x10e, - 0x1378: 0x10f, 0x1379: 0x110, 0x137a: 0x111, 0x137b: 0x112, 0x137c: 0x113, 0x137d: 0x114, 0x137e: 0x115, 0x137f: 0x116, - // Block 0x4e, offset 0x1380 - 0x1382: 0x01, 0x1383: 0x02, 0x1384: 0x03, 0x1385: 0x04, 0x1386: 0x05, 0x1387: 0x06, - 0x1388: 0x07, 0x1389: 0x08, 0x138a: 0x09, 0x138b: 0x0a, 0x138c: 0x0b, 0x138d: 0x0c, 0x138e: 0x0d, 0x138f: 0x0e, - 0x1390: 0x0f, 0x1391: 0x10, 0x1392: 0x11, 0x1393: 0x12, 0x1394: 0x13, 0x1395: 0x14, 0x1396: 0x15, 0x1397: 0x16, - 0x1398: 0x24e, 0x1399: 0x24f, 0x139a: 0x250, 0x139b: 0x251, 0x139c: 0x1b, 0x139d: 0x1c, 0x139e: 0x1d, 0x139f: 0x1e, - 0x13a0: 0x01, 0x13a1: 0x02, 0x13a2: 0x03, 0x13a3: 0x04, 0x13a4: 0x05, - 0x13aa: 0x06, 0x13ad: 0x07, 0x13af: 0x4b, - 0x13b0: 0x13, 0x13b3: 0x15, - // Block 0x4f, offset 0x13c0 - 0x13c0: 0x3f, 0x13c1: 0x40, 0x13c2: 0x41, 0x13c3: 0x42, 0x13c4: 0x43, 0x13c5: 0x44, 0x13c6: 0x45, 0x13c7: 0x46, - 0x13c8: 0x47, 0x13c9: 0x48, 0x13ca: 0x49, 0x13cb: 0x4a, 0x13cc: 0x4b, 0x13cd: 0x4c, 0x13ce: 0x4d, 0x13cf: 0x4e, - 0x13d0: 0x4f, 0x13d1: 0x50, 0x13d2: 0x51, 0x13d3: 0x52, 0x13d4: 0x53, 0x13d5: 0x54, 0x13d6: 0x55, 0x13d7: 0x56, - 0x13d8: 0x57, 0x13d9: 0x58, 0x13da: 0x59, 0x13db: 0x5a, 0x13dc: 0x5b, 0x13dd: 0x5c, 0x13de: 0x5d, 0x13df: 0x5e, - 0x13e0: 0x5f, 0x13e1: 0x60, 0x13e2: 0x61, 0x13e3: 0x62, 0x13e4: 0x63, 0x13e5: 0x64, 0x13e6: 0x65, 0x13e7: 0x66, - 0x13e8: 0x67, 0x13e9: 0x68, 0x13ea: 0x69, 0x13ec: 0x6a, 0x13ed: 0x6b, 0x13ee: 0x6c, 0x13ef: 0x6d, - 0x13f0: 0x6e, 0x13f1: 0x6f, 0x13f3: 0x70, 0x13f4: 0x71, 0x13f5: 0x72, 0x13f6: 0x73, 0x13f7: 0x74, - 0x13f8: 0x75, 0x13f9: 0x261, 0x13fa: 0x77, 0x13fb: 0x78, 0x13fc: 0x79, 0x13fd: 0x7a, 0x13fe: 0x7b, 0x13ff: 0x7c, - // Block 0x50, offset 0x1400 - 0x1400: 0x7d, 0x1401: 0x7e, 0x1402: 0x7f, 0x1403: 0x80, 0x1404: 0x262, 0x1405: 0x82, 0x1406: 0x83, 0x1407: 0x84, - 0x1408: 0x85, 0x1409: 0x86, 0x140a: 0x87, 0x140b: 0x88, 0x140c: 0x89, 0x140d: 0x8a, 0x140e: 0x8b, 0x140f: 0x8c, - 0x1410: 0x8d, 0x1411: 0x8e, 0x1412: 0x8f, 0x1413: 0x90, 0x1414: 0x91, 0x1415: 0x92, 0x1416: 0x93, 0x1417: 0x94, - 0x1418: 0x95, 0x1419: 0x96, 0x141a: 0x97, 0x141b: 0x98, 0x141c: 0x99, 0x141d: 0x9a, 0x141e: 0x9b, 0x141f: 0x9c, - 0x1420: 0x9d, 0x1421: 0x9e, 0x1422: 0x9f, 0x1423: 0xa0, 0x1424: 0xa1, 0x1425: 0xa2, 0x1426: 0xa3, 0x1427: 0xa4, - 0x1428: 0xa5, 0x1429: 0xa6, 0x142a: 0xa7, 0x142b: 0xa8, 0x142c: 0xa9, 0x142d: 0xaa, - 0x1430: 0xab, 0x1431: 0xac, 0x1432: 0xad, 0x1433: 0xae, 0x1434: 0xaf, 0x1435: 0xb0, 0x1436: 0xb1, 0x1437: 0xb2, - 0x1438: 0xb3, 0x143a: 0xb4, 0x143b: 0xb5, 0x143c: 0xb6, 0x143d: 0xb7, 0x143e: 0xb8, 0x143f: 0xb9, - // Block 0x51, offset 0x1440 - 0x1442: 0x01, 0x1443: 0x25a, 0x1444: 0x25b, 0x1445: 0x25c, 0x1446: 0x25d, 0x1447: 0x25e, - 0x1448: 0x25f, 0x1449: 0x08, 0x144a: 0x260, 0x144b: 0x0a, 0x144c: 0x0b, 0x144d: 0x0c, 0x144e: 0x0d, 0x144f: 0x0e, - 0x1450: 0x0f, 0x1451: 0x10, 0x1452: 0x11, 0x1453: 0x12, 0x1454: 0x13, 0x1455: 0x14, 0x1456: 0x15, 0x1457: 0x16, - 0x1458: 0x17, 0x1459: 0x18, 0x145a: 0x19, 0x145b: 0x1a, 0x145c: 0x1b, 0x145d: 0x1c, 0x145e: 0x1d, 0x145f: 0x1e, - 0x1460: 0x01, 0x1461: 0x4d, 0x1462: 0x4e, 0x1463: 0x04, 0x1464: 0x05, - 0x146a: 0x06, 0x146d: 0x07, 0x146f: 0x08, - 0x1470: 0x13, 0x1473: 0x15, - // Block 0x52, offset 0x1480 - 0x1480: 0x3f, 0x1481: 0x40, 0x1482: 0x41, 0x1483: 0x42, 0x1484: 0x43, 0x1485: 0x44, 0x1486: 0x45, 0x1487: 0x46, - 0x1488: 0x47, 0x1489: 0x48, 0x148a: 0x49, 0x148b: 0x4a, 0x148c: 0x4b, 0x148d: 0x4c, 0x148e: 0x4d, 0x148f: 0x4e, - 0x1490: 0x4f, 0x1491: 0x50, 0x1492: 0x51, 0x1493: 0x52, 0x1494: 0x53, 0x1495: 0x54, 0x1496: 0x55, 0x1497: 0x56, - 0x1498: 0x57, 0x1499: 0x58, 0x149a: 0x59, 0x149b: 0x5a, 0x149c: 0x5b, 0x149d: 0x5c, 0x149e: 0x5d, 0x149f: 0x5e, - 0x14a0: 0x5f, 0x14a1: 0x60, 0x14a2: 0x61, 0x14a3: 0x62, 0x14a4: 0x63, 0x14a5: 0x64, 0x14a6: 0x65, 0x14a7: 0x66, - 0x14a8: 0x67, 0x14a9: 0x68, 0x14aa: 0x69, 0x14ac: 0x6a, 0x14ad: 0x6b, 0x14ae: 0x6c, 0x14af: 0x6d, - 0x14b0: 0x6e, 0x14b1: 0x6f, 0x14b3: 0x70, 0x14b4: 0x71, 0x14b5: 0x72, 0x14b6: 0x1fc, 0x14b7: 0x74, - 0x14b8: 0x75, 0x14b9: 0x26a, 0x14ba: 0x26b, 0x14bb: 0x26c, 0x14bc: 0x79, 0x14bd: 0x7a, 0x14be: 0x7b, 0x14bf: 0x7c, - // Block 0x53, offset 0x14c0 - 0x14c0: 0x7d, 0x14c1: 0x7e, 0x14c2: 0x7f, 0x14c3: 0x80, 0x14c4: 0x262, 0x14c5: 0x82, 0x14c6: 0x83, 0x14c7: 0x84, - 0x14c8: 0x85, 0x14c9: 0x86, 0x14ca: 0x87, 0x14cb: 0x88, 0x14cc: 0x89, 0x14cd: 0x8a, 0x14ce: 0x8b, 0x14cf: 0x8c, - 0x14d0: 0x8d, 0x14d1: 0x8e, 0x14d2: 0x26d, 0x14d3: 0x90, 0x14d4: 0x91, 0x14d5: 0x92, 0x14d6: 0x93, 0x14d7: 0x94, - 0x14d8: 0x95, 0x14d9: 0x96, 0x14da: 0x97, 0x14db: 0x98, 0x14dc: 0x99, 0x14dd: 0x9a, 0x14de: 0x9b, 0x14df: 0x9c, - 0x14e0: 0x9d, 0x14e1: 0x9e, 0x14e2: 0x9f, 0x14e3: 0xa0, 0x14e4: 0xa1, 0x14e5: 0xa2, 0x14e6: 0xa3, 0x14e7: 0xa4, - 0x14e8: 0xa5, 0x14e9: 0xa6, 0x14ea: 0xa7, 0x14eb: 0xa8, 0x14ec: 0xa9, 0x14ed: 0xaa, - 0x14f0: 0xab, 0x14f1: 0xac, 0x14f2: 0xad, 0x14f3: 0xae, 0x14f4: 0xaf, 0x14f5: 0xb0, 0x14f6: 0xb1, 0x14f7: 0xb2, - 0x14f8: 0xb3, 0x14fa: 0xb4, 0x14fb: 0xb5, 0x14fc: 0xb6, 0x14fd: 0xb7, 0x14fe: 0xb8, 0x14ff: 0xb9, - // Block 0x54, offset 0x1500 - 0x1500: 0xba, 0x1501: 0xbb, 0x1502: 0xbc, 0x1503: 0xbd, 0x1504: 0xbe, 0x1505: 0xbf, 0x1506: 0xc0, 0x1507: 0xc1, - 0x1508: 0xc2, 0x1509: 0xc3, 0x150a: 0xc4, 0x150b: 0xc5, 0x150c: 0xc6, 0x150d: 0xc7, 0x150e: 0x26e, 0x150f: 0x24b, - // Block 0x55, offset 0x1540 - 0x1540: 0x18b, 0x1541: 0x18c, 0x1542: 0x18d, 0x1543: 0x18e, 0x1544: 0x26f, 0x1545: 0x24d, 0x1546: 0x191, 0x1547: 0x192, - 0x1548: 0x193, 0x1549: 0x194, 0x154c: 0x195, 0x154d: 0x196, 0x154e: 0x197, 0x154f: 0x198, - 0x1550: 0x199, 0x1551: 0x19a, 0x1552: 0x19b, 0x1553: 0x19c, 0x1554: 0x19d, 0x1555: 0x19e, 0x1557: 0x19f, - 0x1558: 0x1a0, 0x1559: 0x1a1, 0x155a: 0x1a2, 0x155b: 0x1a3, 0x155c: 0x1a4, 0x155d: 0x1a5, - // Block 0x56, offset 0x1580 - 0x1590: 0x09, 0x1591: 0x0a, 0x1592: 0x0b, 0x1593: 0x0c, 0x1596: 0x0d, - 0x159b: 0x0e, 0x159d: 0x0f, 0x159e: 0x10, 0x159f: 0x53, - 0x15af: 0x12, - // Block 0x57, offset 0x15c0 - 0x15c2: 0x01, 0x15c3: 0x265, 0x15c4: 0x266, 0x15c5: 0x267, 0x15c6: 0x05, 0x15c7: 0x268, - 0x15c8: 0x269, 0x15c9: 0x08, 0x15ca: 0x09, 0x15cb: 0x0a, 0x15cc: 0x0b, 0x15cd: 0x0c, 0x15ce: 0x0d, 0x15cf: 0x0e, - 0x15d0: 0x0f, 0x15d1: 0x10, 0x15d2: 0x11, 0x15d3: 0x12, 0x15d4: 0x13, 0x15d5: 0x14, 0x15d6: 0x15, 0x15d7: 0x16, - 0x15d8: 0x17, 0x15d9: 0x18, 0x15da: 0x19, 0x15db: 0x1a, 0x15dc: 0x1b, 0x15dd: 0x1c, 0x15de: 0x1d, 0x15df: 0x1e, - 0x15e0: 0x01, 0x15e1: 0x50, 0x15e2: 0x51, 0x15e3: 0x52, 0x15e4: 0x05, - 0x15ea: 0x06, 0x15ed: 0x07, 0x15ef: 0x08, - 0x15f0: 0x54, 0x15f3: 0x15, - // Block 0x58, offset 0x1600 - 0x1620: 0x1f, 0x1621: 0x20, 0x1622: 0x21, 0x1623: 0x22, 0x1624: 0x23, 0x1625: 0x24, 0x1626: 0x25, 0x1627: 0x26, - 0x1628: 0x27, 0x1629: 0x28, 0x162a: 0x272, 0x162b: 0x2a, 0x162c: 0x2b, 0x162d: 0x2c, 0x162e: 0x2d, 0x162f: 0x2e, - 0x1630: 0x2f, 0x1631: 0x30, 0x1632: 0x31, 0x1633: 0x32, 0x1634: 0x33, 0x1635: 0x34, 0x1636: 0x35, 0x1637: 0x36, - 0x1638: 0x37, 0x1639: 0x38, 0x163a: 0x39, 0x163b: 0x3a, 0x163c: 0x3b, 0x163d: 0x3c, 0x163e: 0x3d, 0x163f: 0x3e, - // Block 0x59, offset 0x1640 - 0x1642: 0x01, 0x1643: 0x02, 0x1644: 0x03, 0x1645: 0x04, 0x1646: 0x05, 0x1647: 0x06, - 0x1648: 0x07, 0x1649: 0x08, 0x164a: 0x09, 0x164b: 0x0a, 0x164c: 0x0b, 0x164d: 0x0c, 0x164e: 0x0d, 0x164f: 0x0e, - 0x1650: 0x0f, 0x1651: 0x10, 0x1652: 0x11, 0x1653: 0x12, 0x1654: 0x13, 0x1655: 0x14, 0x1656: 0x15, 0x1657: 0x16, - 0x1658: 0x17, 0x1659: 0x18, 0x165a: 0x19, 0x165b: 0x1a, 0x165c: 0x1b, 0x165d: 0x1c, 0x165e: 0x1d, 0x165f: 0x1e, - 0x1660: 0x56, 0x1661: 0x02, 0x1662: 0x03, 0x1663: 0x04, 0x1664: 0x05, - 0x166a: 0x06, 0x166d: 0x07, 0x166f: 0x08, - 0x1670: 0x13, 0x1673: 0x15, - // Block 0x5a, offset 0x1680 - 0x1682: 0x01, 0x1683: 0x02, 0x1684: 0x03, 0x1685: 0x04, 0x1686: 0x275, 0x1687: 0x06, - 0x1688: 0x07, 0x1689: 0x276, 0x168a: 0x277, 0x168b: 0x0a, 0x168c: 0x0b, 0x168d: 0x0c, 0x168e: 0x0d, 0x168f: 0x0e, - 0x1690: 0x0f, 0x1691: 0x10, 0x1692: 0x11, 0x1693: 0x12, 0x1694: 0x13, 0x1695: 0x14, 0x1696: 0x15, 0x1697: 0x16, - 0x1698: 0x17, 0x1699: 0x18, 0x169a: 0x19, 0x169b: 0x1a, 0x169c: 0x1b, 0x169d: 0x1c, 0x169e: 0x1d, 0x169f: 0x1e, - 0x16a0: 0x01, 0x16a1: 0x02, 0x16a2: 0x03, 0x16a3: 0x04, 0x16a4: 0x05, - 0x16aa: 0x06, 0x16ad: 0x07, 0x16af: 0x08, - 0x16b0: 0x13, 0x16b3: 0x15, - // Block 0x5b, offset 0x16c0 - 0x16c0: 0x3f, 0x16c1: 0x40, 0x16c2: 0x41, 0x16c3: 0x42, 0x16c4: 0x43, 0x16c5: 0x44, 0x16c6: 0x45, 0x16c7: 0x46, - 0x16c8: 0x47, 0x16c9: 0x48, 0x16ca: 0x49, 0x16cb: 0x4a, 0x16cc: 0x4b, 0x16cd: 0x4c, 0x16ce: 0x4d, 0x16cf: 0x4e, - 0x16d0: 0x4f, 0x16d1: 0x50, 0x16d2: 0x51, 0x16d3: 0x52, 0x16d4: 0x53, 0x16d5: 0x54, 0x16d6: 0x55, 0x16d7: 0x56, - 0x16d8: 0x57, 0x16d9: 0x58, 0x16da: 0x59, 0x16db: 0x5a, 0x16dc: 0x5b, 0x16dd: 0x5c, 0x16de: 0x5d, 0x16df: 0x5e, - 0x16e0: 0x5f, 0x16e1: 0x60, 0x16e2: 0x61, 0x16e3: 0x62, 0x16e4: 0x63, 0x16e5: 0x64, 0x16e6: 0x65, 0x16e7: 0x66, - 0x16e8: 0x67, 0x16e9: 0x68, 0x16ea: 0x69, 0x16ec: 0x6a, 0x16ed: 0x6b, 0x16ee: 0x6c, 0x16ef: 0x6d, - 0x16f0: 0x6e, 0x16f1: 0x6f, 0x16f3: 0x70, 0x16f4: 0x71, 0x16f5: 0x72, 0x16f6: 0x73, 0x16f7: 0x74, - 0x16f8: 0x281, 0x16f9: 0x282, 0x16fa: 0x283, 0x16fb: 0x284, 0x16fc: 0x79, 0x16fd: 0x7a, 0x16fe: 0x7b, 0x16ff: 0x7c, - // Block 0x5c, offset 0x1700 - 0x1700: 0x7d, 0x1701: 0x7e, 0x1702: 0x7f, 0x1703: 0x80, 0x1704: 0x285, 0x1705: 0x1bf, 0x1706: 0x83, 0x1707: 0x84, - 0x1708: 0x85, 0x1709: 0x86, 0x170a: 0x87, 0x170b: 0x88, 0x170c: 0x89, 0x170d: 0x8a, 0x170e: 0x8b, 0x170f: 0x8c, - 0x1710: 0x8d, 0x1711: 0x8e, 0x1712: 0x286, 0x1713: 0x90, 0x1714: 0x91, 0x1715: 0x92, 0x1716: 0x93, 0x1717: 0x94, - 0x1718: 0x95, 0x1719: 0x96, 0x171a: 0x97, 0x171b: 0x98, 0x171c: 0x99, 0x171d: 0x9a, 0x171e: 0x9b, 0x171f: 0x9c, - 0x1720: 0x9d, 0x1721: 0x9e, 0x1722: 0x9f, 0x1723: 0xa0, 0x1724: 0xa1, 0x1725: 0xa2, 0x1726: 0xa3, 0x1727: 0xa4, - 0x1728: 0xa5, 0x1729: 0xa6, 0x172a: 0xa7, 0x172b: 0xa8, 0x172c: 0xa9, 0x172d: 0xaa, - 0x1730: 0xab, 0x1731: 0xac, 0x1732: 0xad, 0x1733: 0xae, 0x1734: 0xaf, 0x1735: 0xb0, 0x1736: 0xb1, 0x1737: 0xb2, - 0x1738: 0xb3, 0x173a: 0xb4, 0x173b: 0xb5, 0x173c: 0xb6, 0x173d: 0xb7, 0x173e: 0xb8, 0x173f: 0xb9, - // Block 0x5d, offset 0x1740 - 0x1740: 0xba, 0x1741: 0xbb, 0x1742: 0xbc, 0x1743: 0xbd, 0x1744: 0xbe, 0x1745: 0xbf, 0x1746: 0xc0, 0x1747: 0xc1, - 0x1748: 0xc2, 0x1749: 0xc3, 0x174a: 0xc4, 0x174b: 0x1c1, 0x174c: 0xc6, 0x174d: 0x287, 0x174e: 0x288, 0x174f: 0x289, - // Block 0x5e, offset 0x1780 - 0x17a4: 0xfb, 0x17a5: 0xfc, 0x17a6: 0xfd, 0x17a7: 0xfe, - 0x17a8: 0xff, 0x17a9: 0x100, 0x17aa: 0x101, 0x17ab: 0x102, 0x17ac: 0x28a, 0x17ad: 0x104, 0x17ae: 0x105, 0x17af: 0x106, - 0x17b0: 0x107, 0x17b1: 0x108, 0x17b2: 0x109, 0x17b3: 0x10a, 0x17b4: 0x10b, 0x17b5: 0x10c, 0x17b6: 0x10d, 0x17b7: 0x10e, - 0x17b8: 0x10f, 0x17b9: 0x110, 0x17ba: 0x111, 0x17bb: 0x112, 0x17bc: 0x113, 0x17bd: 0x114, 0x17be: 0x115, 0x17bf: 0x116, - // Block 0x5f, offset 0x17c0 - 0x17c0: 0x18b, 0x17c1: 0x18c, 0x17c2: 0x18d, 0x17c3: 0x18e, 0x17c4: 0x28b, 0x17c5: 0x28c, 0x17c6: 0x191, 0x17c7: 0x192, - 0x17c8: 0x193, 0x17c9: 0x194, 0x17cc: 0x195, 0x17cd: 0x196, 0x17ce: 0x197, 0x17cf: 0x198, - 0x17d0: 0x199, 0x17d1: 0x19a, 0x17d2: 0x19b, 0x17d3: 0x19c, 0x17d4: 0x19d, 0x17d5: 0x19e, 0x17d7: 0x19f, - 0x17d8: 0x1a0, 0x17d9: 0x1a1, 0x17da: 0x1a2, 0x17db: 0x1a3, 0x17dc: 0x1a4, 0x17dd: 0x1a5, - // Block 0x60, offset 0x1800 - 0x1810: 0x09, 0x1811: 0x0a, 0x1812: 0x0b, 0x1813: 0x0c, 0x1816: 0x0d, - 0x181b: 0x0e, 0x181d: 0x0f, 0x181e: 0x10, 0x181f: 0x5d, - 0x182f: 0x12, - // Block 0x61, offset 0x1840 - 0x1842: 0x01, 0x1843: 0x27a, 0x1844: 0x27b, 0x1845: 0x27c, 0x1846: 0x27d, 0x1847: 0x27e, - 0x1848: 0x27f, 0x1849: 0x08, 0x184a: 0x280, 0x184b: 0x0a, 0x184c: 0x0b, 0x184d: 0x0c, 0x184e: 0x0d, 0x184f: 0x0e, - 0x1850: 0x0f, 0x1851: 0x10, 0x1852: 0x11, 0x1853: 0x12, 0x1854: 0x13, 0x1855: 0x14, 0x1856: 0x15, 0x1857: 0x16, - 0x1858: 0x17, 0x1859: 0x18, 0x185a: 0x19, 0x185b: 0x1a, 0x185c: 0x1b, 0x185d: 0x1c, 0x185e: 0x1d, 0x185f: 0x1e, - 0x1860: 0x01, 0x1861: 0x59, 0x1862: 0x5a, 0x1863: 0x5b, 0x1864: 0x05, - 0x186a: 0x06, 0x186d: 0x07, 0x186f: 0x5c, - 0x1870: 0x5e, 0x1873: 0x15, - // Block 0x62, offset 0x1880 - 0x1882: 0x01, 0x1883: 0x02, 0x1884: 0x03, 0x1885: 0x04, 0x1886: 0x05, 0x1887: 0x06, - 0x1888: 0x07, 0x1889: 0x08, 0x188a: 0x09, 0x188b: 0x0a, 0x188c: 0x0b, 0x188d: 0x0c, 0x188e: 0x0d, 0x188f: 0x0e, - 0x1890: 0x0f, 0x1891: 0x10, 0x1892: 0x11, 0x1893: 0x12, 0x1894: 0x13, 0x1895: 0x14, 0x1896: 0x15, 0x1897: 0x28d, - 0x1898: 0x17, 0x1899: 0x18, 0x189a: 0x19, 0x189b: 0x1a, 0x189c: 0x1b, 0x189d: 0x1c, 0x189e: 0x1d, 0x189f: 0x1e, - 0x18a0: 0x01, 0x18a1: 0x02, 0x18a2: 0x03, 0x18a3: 0x04, 0x18a4: 0x05, - 0x18aa: 0x06, 0x18ad: 0x07, 0x18af: 0x08, - 0x18b0: 0x13, 0x18b3: 0x15, - // Block 0x63, offset 0x18c0 - 0x18e0: 0x1f, 0x18e1: 0x20, 0x18e2: 0x21, 0x18e3: 0x22, 0x18e4: 0x28e, 0x18e5: 0x24, 0x18e6: 0x25, 0x18e7: 0x26, - 0x18e8: 0x27, 0x18e9: 0x28, 0x18ea: 0x29, 0x18eb: 0x2a, 0x18ec: 0x2b, 0x18ed: 0x2c, 0x18ee: 0x2d, 0x18ef: 0x2e, - 0x18f0: 0x2f, 0x18f1: 0x30, 0x18f2: 0x31, 0x18f3: 0x32, 0x18f4: 0x33, 0x18f5: 0x34, 0x18f6: 0x35, 0x18f7: 0x36, - 0x18f8: 0x37, 0x18f9: 0x38, 0x18fa: 0x39, 0x18fb: 0x3a, 0x18fc: 0x3b, 0x18fd: 0x3c, 0x18fe: 0x3d, 0x18ff: 0x3e, - // Block 0x64, offset 0x1900 - 0x1902: 0x01, 0x1903: 0x02, 0x1904: 0x03, 0x1905: 0x04, 0x1906: 0x05, 0x1907: 0x06, - 0x1908: 0x07, 0x1909: 0x08, 0x190a: 0x09, 0x190b: 0x0a, 0x190c: 0x0b, 0x190d: 0x0c, 0x190e: 0x0d, 0x190f: 0x0e, - 0x1910: 0x0f, 0x1911: 0x10, 0x1912: 0x11, 0x1913: 0x12, 0x1914: 0x13, 0x1915: 0x14, 0x1916: 0x15, 0x1917: 0x16, - 0x1918: 0x17, 0x1919: 0x18, 0x191a: 0x19, 0x191b: 0x1a, 0x191c: 0x1b, 0x191d: 0x1c, 0x191e: 0x1d, 0x191f: 0x1e, - 0x1920: 0x61, 0x1921: 0x02, 0x1922: 0x03, 0x1923: 0x04, 0x1924: 0x05, - 0x192a: 0x06, 0x192d: 0x07, 0x192f: 0x08, - 0x1930: 0x13, 0x1933: 0x15, - // Block 0x65, offset 0x1940 - 0x1940: 0x3f, 0x1941: 0x40, 0x1942: 0x41, 0x1943: 0x42, 0x1944: 0x43, 0x1945: 0x44, 0x1946: 0x45, 0x1947: 0x46, - 0x1948: 0x47, 0x1949: 0x48, 0x194a: 0x49, 0x194b: 0x4a, 0x194c: 0x4b, 0x194d: 0x4c, 0x194e: 0x4d, 0x194f: 0x4e, - 0x1950: 0x4f, 0x1951: 0x50, 0x1952: 0x51, 0x1953: 0x52, 0x1954: 0x53, 0x1955: 0x54, 0x1956: 0x55, 0x1957: 0x56, - 0x1958: 0x57, 0x1959: 0x58, 0x195a: 0x59, 0x195b: 0x5a, 0x195c: 0x5b, 0x195d: 0x5c, 0x195e: 0x5d, 0x195f: 0x5e, - 0x1960: 0x5f, 0x1961: 0x60, 0x1962: 0x61, 0x1963: 0x62, 0x1964: 0x63, 0x1965: 0x64, 0x1966: 0x65, 0x1967: 0x66, - 0x1968: 0x67, 0x1969: 0x68, 0x196a: 0x69, 0x196c: 0x6a, 0x196d: 0x6b, 0x196e: 0x6c, 0x196f: 0x6d, - 0x1970: 0x6e, 0x1971: 0x6f, 0x1973: 0x70, 0x1974: 0x71, 0x1975: 0x72, 0x1976: 0x73, 0x1977: 0x74, - 0x1978: 0x294, 0x1979: 0x1f2, 0x197a: 0x77, 0x197b: 0x78, 0x197c: 0x79, 0x197d: 0x7a, 0x197e: 0x7b, 0x197f: 0x7c, - // Block 0x66, offset 0x1980 - 0x1982: 0x01, 0x1983: 0x02, 0x1984: 0x291, 0x1985: 0x292, 0x1986: 0x05, 0x1987: 0x293, - 0x1988: 0x07, 0x1989: 0x08, 0x198a: 0x09, 0x198b: 0x0a, 0x198c: 0x0b, 0x198d: 0x0c, 0x198e: 0x0d, 0x198f: 0x0e, - 0x1990: 0x0f, 0x1991: 0x10, 0x1992: 0x11, 0x1993: 0x12, 0x1994: 0x13, 0x1995: 0x14, 0x1996: 0x15, 0x1997: 0x16, - 0x1998: 0x17, 0x1999: 0x18, 0x199a: 0x19, 0x199b: 0x1a, 0x199c: 0x1b, 0x199d: 0x1c, 0x199e: 0x1d, 0x199f: 0x1e, - 0x19a0: 0x01, 0x19a1: 0x63, 0x19a2: 0x03, 0x19a3: 0x04, 0x19a4: 0x05, - 0x19aa: 0x06, 0x19ad: 0x07, 0x19af: 0x08, - 0x19b0: 0x13, 0x19b3: 0x15, - // Block 0x67, offset 0x19c0 - 0x19c0: 0x3f, 0x19c1: 0x40, 0x19c2: 0x41, 0x19c3: 0x42, 0x19c4: 0x43, 0x19c5: 0x44, 0x19c6: 0x45, 0x19c7: 0x46, - 0x19c8: 0x47, 0x19c9: 0x48, 0x19ca: 0x49, 0x19cb: 0x4a, 0x19cc: 0x4b, 0x19cd: 0x4c, 0x19ce: 0x4d, 0x19cf: 0x4e, - 0x19d0: 0x4f, 0x19d1: 0x50, 0x19d2: 0x51, 0x19d3: 0x52, 0x19d4: 0x53, 0x19d5: 0x54, 0x19d6: 0x55, 0x19d7: 0x56, - 0x19d8: 0x57, 0x19d9: 0x58, 0x19da: 0x59, 0x19db: 0x5a, 0x19dc: 0x5b, 0x19dd: 0x5c, 0x19de: 0x5d, 0x19df: 0x5e, - 0x19e0: 0x5f, 0x19e1: 0x60, 0x19e2: 0x61, 0x19e3: 0x62, 0x19e4: 0x63, 0x19e5: 0x64, 0x19e6: 0x65, 0x19e7: 0x66, - 0x19e8: 0x67, 0x19e9: 0x68, 0x19ea: 0x69, 0x19ec: 0x6a, 0x19ed: 0x6b, 0x19ee: 0x6c, 0x19ef: 0x6d, - 0x19f0: 0x6e, 0x19f1: 0x6f, 0x19f3: 0x70, 0x19f4: 0x71, 0x19f5: 0x72, 0x19f6: 0x73, 0x19f7: 0x74, - 0x19f8: 0x75, 0x19f9: 0x1df, 0x19fa: 0x77, 0x19fb: 0x78, 0x19fc: 0x79, 0x19fd: 0x7a, 0x19fe: 0x7b, 0x19ff: 0x7c, - // Block 0x68, offset 0x1a00 - 0x1a02: 0x01, 0x1a03: 0x297, 0x1a04: 0x03, 0x1a05: 0x298, 0x1a06: 0x05, 0x1a07: 0x299, - 0x1a08: 0x29a, 0x1a09: 0x08, 0x1a0a: 0x09, 0x1a0b: 0x0a, 0x1a0c: 0x0b, 0x1a0d: 0x0c, 0x1a0e: 0x0d, 0x1a0f: 0x0e, - 0x1a10: 0x0f, 0x1a11: 0x10, 0x1a12: 0x11, 0x1a13: 0x12, 0x1a14: 0x13, 0x1a15: 0x14, 0x1a16: 0x15, 0x1a17: 0x16, - 0x1a18: 0x17, 0x1a19: 0x18, 0x1a1a: 0x19, 0x1a1b: 0x1a, 0x1a1c: 0x1b, 0x1a1d: 0x1c, 0x1a1e: 0x1d, 0x1a1f: 0x1e, - 0x1a20: 0x01, 0x1a21: 0x65, 0x1a22: 0x03, 0x1a23: 0x04, 0x1a24: 0x05, - 0x1a2a: 0x06, 0x1a2d: 0x07, 0x1a2f: 0x08, - 0x1a30: 0x13, 0x1a33: 0x15, - // Block 0x69, offset 0x1a40 - 0x1a42: 0x01, 0x1a43: 0x02, 0x1a44: 0x03, 0x1a45: 0x04, 0x1a46: 0x05, 0x1a47: 0x06, - 0x1a48: 0x07, 0x1a49: 0x08, 0x1a4a: 0x09, 0x1a4b: 0x0a, 0x1a4c: 0x0b, 0x1a4d: 0x0c, 0x1a4e: 0x0d, 0x1a4f: 0x0e, - 0x1a50: 0x0f, 0x1a51: 0x10, 0x1a52: 0x11, 0x1a53: 0x12, 0x1a54: 0x29b, 0x1a55: 0x14, 0x1a56: 0x29c, 0x1a57: 0x16, - 0x1a58: 0x17, 0x1a59: 0x18, 0x1a5a: 0x19, 0x1a5b: 0x1a, 0x1a5c: 0x1b, 0x1a5d: 0x1c, 0x1a5e: 0x1d, 0x1a5f: 0x1e, - 0x1a60: 0x01, 0x1a61: 0x02, 0x1a62: 0x03, 0x1a63: 0x04, 0x1a64: 0x05, - 0x1a6a: 0x06, 0x1a6d: 0x07, 0x1a6f: 0x08, - 0x1a70: 0x13, 0x1a73: 0x15, - // Block 0x6a, offset 0x1a80 - 0x1a80: 0x3f, 0x1a81: 0x40, 0x1a82: 0x41, 0x1a83: 0x42, 0x1a84: 0x43, 0x1a85: 0x44, 0x1a86: 0x45, 0x1a87: 0x46, - 0x1a88: 0x47, 0x1a89: 0x48, 0x1a8a: 0x49, 0x1a8b: 0x4a, 0x1a8c: 0x4b, 0x1a8d: 0x4c, 0x1a8e: 0x4d, 0x1a8f: 0x4e, - 0x1a90: 0x4f, 0x1a91: 0x50, 0x1a92: 0x51, 0x1a93: 0x52, 0x1a94: 0x53, 0x1a95: 0x54, 0x1a96: 0x55, 0x1a97: 0x56, - 0x1a98: 0x57, 0x1a99: 0x58, 0x1a9a: 0x59, 0x1a9b: 0x5a, 0x1a9c: 0x5b, 0x1a9d: 0x5c, 0x1a9e: 0x5d, 0x1a9f: 0x5e, - 0x1aa0: 0x5f, 0x1aa1: 0x60, 0x1aa2: 0x61, 0x1aa3: 0x62, 0x1aa4: 0x63, 0x1aa5: 0x64, 0x1aa6: 0x65, 0x1aa7: 0x66, - 0x1aa8: 0x67, 0x1aa9: 0x68, 0x1aaa: 0x69, 0x1aac: 0x6a, 0x1aad: 0x6b, 0x1aae: 0x6c, 0x1aaf: 0x6d, - 0x1ab0: 0x6e, 0x1ab1: 0x6f, 0x1ab3: 0x70, 0x1ab4: 0x71, 0x1ab5: 0x72, 0x1ab6: 0x73, 0x1ab7: 0x74, - 0x1ab8: 0x75, 0x1ab9: 0x29f, 0x1aba: 0x77, 0x1abb: 0x2a0, 0x1abc: 0x79, 0x1abd: 0x7a, 0x1abe: 0x7b, 0x1abf: 0x7c, - // Block 0x6b, offset 0x1ac0 - 0x1ac2: 0x01, 0x1ac3: 0x02, 0x1ac4: 0x03, 0x1ac5: 0x04, 0x1ac6: 0x05, 0x1ac7: 0x06, - 0x1ac8: 0x07, 0x1ac9: 0x08, 0x1aca: 0x09, 0x1acb: 0x0a, 0x1acc: 0x0b, 0x1acd: 0x0c, 0x1ace: 0x0d, 0x1acf: 0x0e, - 0x1ad0: 0x0f, 0x1ad1: 0x10, 0x1ad2: 0x11, 0x1ad3: 0x12, 0x1ad4: 0x13, 0x1ad5: 0x14, 0x1ad6: 0x15, 0x1ad7: 0x16, - 0x1ad8: 0x17, 0x1ad9: 0x18, 0x1ada: 0x19, 0x1adb: 0x1a, 0x1adc: 0x1b, 0x1add: 0x1c, 0x1ade: 0x1d, 0x1adf: 0x1e, - 0x1ae0: 0x01, 0x1ae1: 0x68, 0x1ae2: 0x03, 0x1ae3: 0x04, 0x1ae4: 0x05, - 0x1aea: 0x06, 0x1aed: 0x07, 0x1aef: 0x08, - 0x1af0: 0x13, 0x1af3: 0x15, - // Block 0x6c, offset 0x1b00 - 0x1b00: 0x3f, 0x1b01: 0x40, 0x1b02: 0x41, 0x1b03: 0x42, 0x1b04: 0x43, 0x1b05: 0x44, 0x1b06: 0x45, 0x1b07: 0x46, - 0x1b08: 0x47, 0x1b09: 0x48, 0x1b0a: 0x49, 0x1b0b: 0x4a, 0x1b0c: 0x4b, 0x1b0d: 0x4c, 0x1b0e: 0x4d, 0x1b0f: 0x4e, - 0x1b10: 0x4f, 0x1b11: 0x50, 0x1b12: 0x51, 0x1b13: 0x52, 0x1b14: 0x53, 0x1b15: 0x54, 0x1b16: 0x55, 0x1b17: 0x56, - 0x1b18: 0x57, 0x1b19: 0x58, 0x1b1a: 0x59, 0x1b1b: 0x5a, 0x1b1c: 0x5b, 0x1b1d: 0x5c, 0x1b1e: 0x5d, 0x1b1f: 0x5e, - 0x1b20: 0x5f, 0x1b21: 0x60, 0x1b22: 0x61, 0x1b23: 0x62, 0x1b24: 0x63, 0x1b25: 0x64, 0x1b26: 0x65, 0x1b27: 0x66, - 0x1b28: 0x67, 0x1b29: 0x68, 0x1b2a: 0x69, 0x1b2c: 0x6a, 0x1b2d: 0x6b, 0x1b2e: 0x6c, 0x1b2f: 0x6d, - 0x1b30: 0x6e, 0x1b31: 0x6f, 0x1b33: 0x70, 0x1b34: 0x71, 0x1b35: 0x72, 0x1b36: 0x1fc, 0x1b37: 0x74, - 0x1b38: 0x2a7, 0x1b39: 0x2a8, 0x1b3a: 0x2a9, 0x1b3b: 0x2aa, 0x1b3c: 0x79, 0x1b3d: 0x7a, 0x1b3e: 0x7b, 0x1b3f: 0x7c, - // Block 0x6d, offset 0x1b40 - 0x1b42: 0x01, 0x1b43: 0x2a3, 0x1b44: 0x2a4, 0x1b45: 0x04, 0x1b46: 0x05, 0x1b47: 0x2a5, - 0x1b48: 0x2a6, 0x1b49: 0x08, 0x1b4a: 0x09, 0x1b4b: 0x0a, 0x1b4c: 0x0b, 0x1b4d: 0x0c, 0x1b4e: 0x0d, 0x1b4f: 0x0e, - 0x1b50: 0x0f, 0x1b51: 0x10, 0x1b52: 0x11, 0x1b53: 0x12, 0x1b54: 0x13, 0x1b55: 0x14, 0x1b56: 0x15, 0x1b57: 0x16, - 0x1b58: 0x17, 0x1b59: 0x18, 0x1b5a: 0x19, 0x1b5b: 0x1a, 0x1b5c: 0x1b, 0x1b5d: 0x1c, 0x1b5e: 0x1d, 0x1b5f: 0x1e, - 0x1b60: 0x01, 0x1b61: 0x6a, 0x1b62: 0x30, 0x1b63: 0x04, 0x1b64: 0x05, - 0x1b6a: 0x06, 0x1b6d: 0x07, 0x1b6f: 0x08, - 0x1b70: 0x13, 0x1b73: 0x15, - // Block 0x6e, offset 0x1b80 - 0x1b80: 0x2ab, 0x1b81: 0x2ac, 0x1b82: 0x2ad, 0x1b83: 0x2ae, 0x1b84: 0x2af, 0x1b85: 0x2b0, 0x1b86: 0xc0, 0x1b87: 0x2b1, - 0x1b88: 0x2b2, 0x1b89: 0x2b3, 0x1b8a: 0xc4, 0x1b8b: 0x2b4, 0x1b8c: 0xc6, 0x1b8d: 0x2b5, 0x1b8e: 0xc8, 0x1b8f: 0x2b6, - // Block 0x6f, offset 0x1bc0 - 0x1bf7: 0xca, - 0x1bf8: 0x2b7, 0x1bf9: 0x2b8, 0x1bfa: 0x2b9, 0x1bfb: 0x2ba, 0x1bfc: 0x2bb, 0x1bfd: 0x2bc, 0x1bfe: 0x2bd, 0x1bff: 0x2be, - // Block 0x70, offset 0x1c00 - 0x1c00: 0x2bf, 0x1c01: 0x2c0, 0x1c02: 0x2c1, 0x1c03: 0x2c2, 0x1c04: 0x2c3, 0x1c05: 0x2c4, 0x1c06: 0x2c5, 0x1c07: 0x2c6, - 0x1c08: 0x2c7, 0x1c09: 0x2c8, 0x1c0a: 0x2c9, 0x1c0b: 0x2ca, 0x1c0c: 0x2cb, 0x1c0d: 0x2cc, 0x1c0e: 0x2cd, 0x1c0f: 0x2ce, - 0x1c10: 0x2cf, 0x1c11: 0x2d0, 0x1c12: 0x2d1, 0x1c13: 0x2d2, 0x1c14: 0x2d3, 0x1c15: 0x2d4, 0x1c16: 0x2d5, 0x1c17: 0x2d6, - 0x1c18: 0x2d7, 0x1c19: 0x2d8, 0x1c1a: 0x2d9, 0x1c1b: 0x2da, 0x1c1c: 0x2db, 0x1c1d: 0x2dc, 0x1c1e: 0x2dd, 0x1c1f: 0x2de, - 0x1c20: 0x2df, 0x1c21: 0x2e0, 0x1c22: 0x2e1, 0x1c23: 0x2e2, 0x1c24: 0x2e3, 0x1c25: 0x2e4, 0x1c26: 0x2e5, 0x1c27: 0x2e6, - 0x1c28: 0x2e7, 0x1c29: 0x2e8, 0x1c2a: 0x2e9, 0x1c2b: 0x2ea, 0x1c2c: 0x2eb, 0x1c2d: 0x2ec, 0x1c2e: 0x2ed, 0x1c2f: 0x2ee, - 0x1c30: 0x2ef, 0x1c31: 0x2f0, 0x1c32: 0x2f1, 0x1c33: 0x2f2, 0x1c34: 0x2f3, 0x1c35: 0x2f4, 0x1c36: 0x2f5, 0x1c37: 0x2f6, - 0x1c38: 0x2f7, 0x1c39: 0x2f8, 0x1c3a: 0x2f9, 0x1c3b: 0x2fa, 0x1c3c: 0x2fb, 0x1c3d: 0x2fc, 0x1c3e: 0x2fd, 0x1c3f: 0x2fe, - // Block 0x71, offset 0x1c40 - 0x1c40: 0x2ff, 0x1c41: 0x300, 0x1c42: 0x301, 0x1c43: 0x302, 0x1c44: 0x303, 0x1c45: 0x304, 0x1c46: 0x305, 0x1c47: 0x306, - 0x1c48: 0x307, 0x1c49: 0x308, 0x1c4a: 0x309, 0x1c4b: 0x30a, 0x1c4c: 0x30b, 0x1c4d: 0x30c, 0x1c4e: 0x30d, 0x1c4f: 0x30e, - 0x1c50: 0x30f, 0x1c51: 0x310, 0x1c52: 0x311, 0x1c53: 0x312, 0x1c54: 0x313, 0x1c55: 0x314, 0x1c56: 0x315, 0x1c57: 0x316, - 0x1c58: 0x317, 0x1c59: 0x318, 0x1c5a: 0x319, 0x1c5b: 0x31a, 0x1c5c: 0x31b, 0x1c5d: 0x31c, 0x1c5e: 0x31d, 0x1c5f: 0x31e, - 0x1c60: 0x31f, 0x1c61: 0x320, 0x1c62: 0x321, 0x1c63: 0x322, 0x1c64: 0x323, 0x1c65: 0x324, 0x1c66: 0x325, 0x1c67: 0x326, - 0x1c68: 0x327, 0x1c69: 0x328, 0x1c6a: 0x329, 0x1c6b: 0x32a, 0x1c6c: 0x32b, 0x1c6d: 0x32c, 0x1c6e: 0x32d, 0x1c6f: 0x32e, - 0x1c70: 0x32f, 0x1c71: 0x330, 0x1c72: 0x331, 0x1c73: 0x332, 0x1c74: 0x333, 0x1c75: 0x334, 0x1c76: 0x335, 0x1c77: 0x336, - 0x1c78: 0x337, 0x1c79: 0x338, 0x1c7a: 0x339, 0x1c7b: 0x33a, 0x1c7c: 0x33b, 0x1c7d: 0x33c, 0x1c7e: 0x33d, 0x1c7f: 0x33e, - // Block 0x72, offset 0x1c80 - 0x1c80: 0x33f, 0x1c81: 0x340, 0x1c82: 0x341, 0x1c83: 0x342, 0x1c84: 0x343, 0x1c85: 0x344, 0x1c86: 0x345, 0x1c87: 0x346, - 0x1c88: 0x347, 0x1c89: 0x348, 0x1c8a: 0x349, 0x1c8b: 0x34a, 0x1c8c: 0x34b, 0x1c8d: 0x34c, 0x1c8e: 0x34d, 0x1c8f: 0x34e, - 0x1c90: 0x34f, 0x1c91: 0x350, 0x1c92: 0x351, 0x1c93: 0x352, 0x1c94: 0x353, 0x1c95: 0x354, 0x1c96: 0x355, 0x1c97: 0x356, - 0x1c98: 0x357, 0x1c99: 0x358, 0x1c9a: 0x359, 0x1c9b: 0x35a, 0x1c9c: 0x35b, 0x1c9d: 0x35c, 0x1c9e: 0x35d, 0x1c9f: 0x35e, - 0x1ca0: 0x35f, 0x1ca1: 0x360, 0x1ca2: 0x361, 0x1ca3: 0x362, 0x1ca4: 0x363, 0x1ca5: 0x364, 0x1ca6: 0x365, 0x1ca7: 0x366, - 0x1ca8: 0x367, 0x1ca9: 0x368, 0x1caa: 0x369, 0x1cab: 0x36a, 0x1cac: 0x36b, 0x1cad: 0x36c, 0x1cae: 0x36d, 0x1caf: 0x36e, - 0x1cb0: 0x36f, 0x1cb1: 0x370, 0x1cb2: 0x371, 0x1cb3: 0x372, 0x1cb4: 0x373, 0x1cb5: 0x374, 0x1cb6: 0x375, 0x1cb7: 0x376, - 0x1cb8: 0x377, 0x1cb9: 0x378, 0x1cba: 0x379, 0x1cbc: 0x37a, 0x1cbd: 0x37b, 0x1cbe: 0x37c, 0x1cbf: 0x37d, - // Block 0x73, offset 0x1cc0 - 0x1cc0: 0x37e, 0x1cc1: 0x37f, 0x1cc2: 0x380, 0x1cc3: 0x381, 0x1cc4: 0x382, 0x1cc5: 0x383, 0x1cc6: 0x384, 0x1cc7: 0x385, - 0x1cc8: 0x386, 0x1cc9: 0x387, 0x1cca: 0x388, 0x1ccb: 0x389, 0x1ccc: 0x38a, 0x1ccd: 0x38b, 0x1cce: 0x38c, 0x1ccf: 0x38d, - 0x1cd0: 0x38e, 0x1cd1: 0x38f, 0x1cd2: 0x390, 0x1cd3: 0x391, 0x1cd4: 0x392, 0x1cd5: 0x393, 0x1cd6: 0x394, 0x1cd7: 0x395, - 0x1cd8: 0x396, 0x1cd9: 0x397, 0x1cda: 0x398, 0x1cdb: 0x399, 0x1cdc: 0x39a, 0x1cdd: 0x39b, 0x1cde: 0x39c, 0x1cdf: 0x39d, - 0x1ce0: 0x39e, 0x1ce1: 0x39f, 0x1ce2: 0x3a0, 0x1ce3: 0x3a1, 0x1ce4: 0x3a2, 0x1ce5: 0x3a3, 0x1ce6: 0x3a4, 0x1ce7: 0x3a5, - 0x1ce8: 0x3a6, 0x1ce9: 0x3a7, 0x1cea: 0x3a8, 0x1ceb: 0x3a9, 0x1cec: 0x3aa, 0x1ced: 0x3ab, 0x1cee: 0x3ac, - 0x1cf0: 0x3ad, 0x1cf1: 0x3ae, 0x1cf2: 0x3af, 0x1cf3: 0x3b0, 0x1cf4: 0x3b1, 0x1cf5: 0x3b2, 0x1cf6: 0x3b3, 0x1cf7: 0x3b4, - 0x1cf8: 0x3b5, 0x1cf9: 0x3b6, 0x1cfa: 0x3b7, 0x1cfb: 0x3b8, 0x1cfc: 0x3b9, 0x1cfd: 0x3ba, 0x1cfe: 0x3bb, 0x1cff: 0x3bc, - // Block 0x74, offset 0x1d00 - 0x1d00: 0x3bd, 0x1d01: 0x3be, 0x1d02: 0x3bf, 0x1d03: 0x3c0, 0x1d04: 0x3c1, 0x1d05: 0x3c2, 0x1d06: 0x3c3, 0x1d07: 0x3c4, - 0x1d08: 0x3c5, 0x1d09: 0x3c6, 0x1d0a: 0x3c7, 0x1d0b: 0x3c8, 0x1d0c: 0x3c9, 0x1d0d: 0x3ca, 0x1d0e: 0x3cb, 0x1d0f: 0x3cc, - 0x1d10: 0x3cd, 0x1d11: 0x3ce, 0x1d12: 0x3cf, 0x1d15: 0x3d0, 0x1d16: 0x3d1, 0x1d17: 0x3d2, - 0x1d18: 0x3d3, 0x1d19: 0x3d4, 0x1d1a: 0x3d5, 0x1d1b: 0x3d6, 0x1d1c: 0x3d7, 0x1d1d: 0x3d8, 0x1d1e: 0x3d9, 0x1d1f: 0x3da, - 0x1d20: 0x3db, 0x1d21: 0x3dc, 0x1d22: 0x3dd, 0x1d23: 0x3de, 0x1d24: 0x3df, 0x1d25: 0x3e0, 0x1d26: 0x3e1, 0x1d27: 0x3e2, - 0x1d28: 0x3e3, 0x1d29: 0x3e4, 0x1d2a: 0x3e5, 0x1d2b: 0x3e6, 0x1d2c: 0x3e7, 0x1d2d: 0x3e8, 0x1d2e: 0x3e9, 0x1d2f: 0x3ea, - 0x1d30: 0x3eb, 0x1d31: 0x3ec, 0x1d33: 0x3ed, 0x1d34: 0x3ee, 0x1d35: 0x3ef, 0x1d36: 0x3f0, 0x1d37: 0x3f1, - 0x1d38: 0x3f2, 0x1d39: 0x3f3, 0x1d3a: 0x3f4, 0x1d3b: 0x3f5, 0x1d3c: 0x3f6, 0x1d3d: 0x3f7, 0x1d3e: 0x3f8, - // Block 0x75, offset 0x1d40 - 0x1d64: 0x3f9, 0x1d65: 0x3fa, 0x1d66: 0x3fb, 0x1d67: 0x3fc, - 0x1d68: 0x3fd, 0x1d69: 0x3fe, 0x1d6a: 0x3ff, 0x1d6b: 0x400, 0x1d6c: 0x103, 0x1d6d: 0x104, 0x1d6e: 0x105, 0x1d6f: 0x106, - 0x1d70: 0x107, 0x1d71: 0x108, 0x1d72: 0x109, 0x1d73: 0x10a, 0x1d74: 0x10b, 0x1d75: 0x10c, 0x1d76: 0x10d, 0x1d77: 0x10e, - 0x1d78: 0x10f, 0x1d79: 0x110, 0x1d7a: 0x111, 0x1d7b: 0x112, 0x1d7c: 0x401, 0x1d7d: 0x402, 0x1d7e: 0x403, 0x1d7f: 0x404, - // Block 0x76, offset 0x1d80 - 0x1d80: 0x18b, 0x1d81: 0x18c, 0x1d82: 0x18d, 0x1d83: 0x18e, 0x1d84: 0x18f, 0x1d85: 0x190, 0x1d86: 0x191, 0x1d87: 0x192, - 0x1d88: 0x193, 0x1d89: 0x405, 0x1d8c: 0x195, 0x1d8d: 0x196, 0x1d8e: 0x197, 0x1d8f: 0x198, - 0x1d90: 0x199, 0x1d91: 0x19a, 0x1d92: 0x19b, 0x1d93: 0x19c, 0x1d94: 0x19d, 0x1d95: 0x19e, 0x1d97: 0x19f, - 0x1d98: 0x1a0, 0x1d99: 0x1a1, 0x1d9a: 0x1a2, 0x1d9b: 0x1a3, 0x1d9c: 0x1a4, 0x1d9d: 0x1a5, - // Block 0x77, offset 0x1dc0 - 0x1de0: 0x406, 0x1de1: 0x407, 0x1de2: 0x408, 0x1de3: 0x409, 0x1de4: 0x40a, 0x1de5: 0x40b, 0x1de6: 0x40c, 0x1de7: 0x40d, - 0x1de8: 0x40e, - // Block 0x78, offset 0x1e00 - 0x1e10: 0x09, 0x1e11: 0x0a, 0x1e12: 0x0b, 0x1e13: 0x0c, 0x1e16: 0x0d, - 0x1e1b: 0x0e, 0x1e1d: 0x0f, 0x1e1e: 0x10, 0x1e1f: 0x74, - 0x1e2f: 0x75, - // Block 0x79, offset 0x1e40 - 0x1e42: 0x01, 0x1e43: 0x02, 0x1e44: 0x03, 0x1e45: 0x04, 0x1e46: 0x05, 0x1e47: 0x06, - 0x1e48: 0x07, 0x1e49: 0x08, 0x1e4a: 0x09, 0x1e4b: 0x0a, 0x1e4c: 0x0b, 0x1e4d: 0x0c, 0x1e4e: 0x0d, 0x1e4f: 0x0e, - 0x1e50: 0x0f, 0x1e51: 0x10, 0x1e52: 0x11, 0x1e53: 0x12, 0x1e54: 0x13, 0x1e55: 0x14, 0x1e56: 0x15, 0x1e57: 0x16, - 0x1e58: 0x17, 0x1e59: 0x18, 0x1e5a: 0x19, 0x1e5b: 0x1a, 0x1e5c: 0x1b, 0x1e5d: 0x1c, 0x1e5e: 0x1d, 0x1e5f: 0x1e, - 0x1e60: 0x01, 0x1e61: 0x02, 0x1e62: 0x03, 0x1e63: 0x6c, 0x1e64: 0x6d, 0x1e65: 0x6e, 0x1e66: 0x6f, 0x1e67: 0x70, - 0x1e68: 0x71, 0x1e69: 0x72, 0x1e6a: 0x06, 0x1e6d: 0x07, 0x1e6f: 0x73, - 0x1e70: 0x76, 0x1e73: 0x15, - // Block 0x7a, offset 0x1e80 - 0x1e82: 0x01, 0x1e83: 0x02, 0x1e84: 0x03, 0x1e85: 0x04, 0x1e86: 0x05, 0x1e87: 0x06, - 0x1e88: 0x07, 0x1e89: 0x08, 0x1e8a: 0x09, 0x1e8b: 0x0a, 0x1e8c: 0x0b, 0x1e8d: 0x0c, 0x1e8e: 0x0d, 0x1e8f: 0x0e, - 0x1e90: 0x40f, 0x1e91: 0x410, 0x1e92: 0x411, 0x1e93: 0x12, 0x1e94: 0x13, 0x1e95: 0x14, 0x1e96: 0x15, 0x1e97: 0x16, - 0x1e98: 0x17, 0x1e99: 0x18, 0x1e9a: 0x19, 0x1e9b: 0x1a, 0x1e9c: 0x1b, 0x1e9d: 0x1c, 0x1e9e: 0x1d, 0x1e9f: 0x1e, - 0x1ea0: 0x01, 0x1ea1: 0x02, 0x1ea2: 0x03, 0x1ea3: 0x04, 0x1ea4: 0x05, - 0x1eaa: 0x06, 0x1ead: 0x07, 0x1eaf: 0x08, - 0x1eb0: 0x13, 0x1eb3: 0x15, - // Block 0x7b, offset 0x1ec0 - 0x1ec2: 0x01, 0x1ec3: 0x1f7, 0x1ec4: 0x414, 0x1ec5: 0x1f9, 0x1ec6: 0x05, 0x1ec7: 0x1fa, - 0x1ec8: 0x1fb, 0x1ec9: 0x08, 0x1eca: 0x09, 0x1ecb: 0x0a, 0x1ecc: 0x0b, 0x1ecd: 0x0c, 0x1ece: 0x0d, 0x1ecf: 0x0e, - 0x1ed0: 0x0f, 0x1ed1: 0x10, 0x1ed2: 0x11, 0x1ed3: 0x12, 0x1ed4: 0x13, 0x1ed5: 0x14, 0x1ed6: 0x15, 0x1ed7: 0x16, - 0x1ed8: 0x17, 0x1ed9: 0x18, 0x1eda: 0x19, 0x1edb: 0x1a, 0x1edc: 0x1b, 0x1edd: 0x1c, 0x1ede: 0x1d, 0x1edf: 0x1e, - 0x1ee0: 0x01, 0x1ee1: 0x2f, 0x1ee2: 0x30, 0x1ee3: 0x04, 0x1ee4: 0x05, - 0x1eea: 0x06, 0x1eed: 0x07, 0x1eef: 0x08, - 0x1ef0: 0x13, 0x1ef3: 0x15, - // Block 0x7c, offset 0x1f00 - 0x1f00: 0x3f, 0x1f01: 0x40, 0x1f02: 0x41, 0x1f03: 0x42, 0x1f04: 0x43, 0x1f05: 0x44, 0x1f06: 0x45, 0x1f07: 0x46, - 0x1f08: 0x47, 0x1f09: 0x48, 0x1f0a: 0x49, 0x1f0b: 0x4a, 0x1f0c: 0x4b, 0x1f0d: 0x4c, 0x1f0e: 0x4d, 0x1f0f: 0x4e, - 0x1f10: 0x4f, 0x1f11: 0x50, 0x1f12: 0x51, 0x1f13: 0x52, 0x1f14: 0x53, 0x1f15: 0x54, 0x1f16: 0x55, 0x1f17: 0x56, - 0x1f18: 0x57, 0x1f19: 0x58, 0x1f1a: 0x59, 0x1f1b: 0x5a, 0x1f1c: 0x5b, 0x1f1d: 0x5c, 0x1f1e: 0x415, 0x1f1f: 0x416, - 0x1f20: 0x5f, 0x1f21: 0x60, 0x1f22: 0x61, 0x1f23: 0x62, 0x1f24: 0x63, 0x1f25: 0x64, 0x1f26: 0x65, 0x1f27: 0x66, - 0x1f28: 0x67, 0x1f29: 0x68, 0x1f2a: 0x69, 0x1f2c: 0x6a, 0x1f2d: 0x6b, 0x1f2e: 0x6c, 0x1f2f: 0x6d, - 0x1f30: 0x6e, 0x1f31: 0x6f, 0x1f33: 0x70, 0x1f34: 0x71, 0x1f35: 0x72, 0x1f36: 0x73, 0x1f37: 0x74, - 0x1f38: 0x75, 0x1f39: 0x76, 0x1f3a: 0x77, 0x1f3b: 0x78, 0x1f3c: 0x79, 0x1f3d: 0x7a, 0x1f3e: 0x7b, 0x1f3f: 0x7c, - // Block 0x7d, offset 0x1f40 - 0x1f42: 0x01, 0x1f43: 0x02, 0x1f44: 0x03, 0x1f45: 0x04, 0x1f46: 0x05, 0x1f47: 0x06, - 0x1f48: 0x07, 0x1f49: 0x08, 0x1f4a: 0x09, 0x1f4b: 0x0a, 0x1f4c: 0x0b, 0x1f4d: 0x0c, 0x1f4e: 0x0d, 0x1f4f: 0x0e, - 0x1f50: 0x0f, 0x1f51: 0x10, 0x1f52: 0x11, 0x1f53: 0x12, 0x1f54: 0x13, 0x1f55: 0x14, 0x1f56: 0x15, 0x1f57: 0x16, - 0x1f58: 0x17, 0x1f59: 0x18, 0x1f5a: 0x19, 0x1f5b: 0x1a, 0x1f5c: 0x1b, 0x1f5d: 0x1c, 0x1f5e: 0x1d, 0x1f5f: 0x1e, - 0x1f60: 0x01, 0x1f61: 0x7a, 0x1f62: 0x03, 0x1f63: 0x04, 0x1f64: 0x05, - 0x1f6a: 0x06, 0x1f6d: 0x07, 0x1f6f: 0x08, - 0x1f70: 0x13, 0x1f73: 0x15, - // Block 0x7e, offset 0x1f80 - 0x1fa0: 0x1f, 0x1fa1: 0x20, 0x1fa2: 0x21, 0x1fa3: 0x22, 0x1fa4: 0x23, 0x1fa5: 0x24, 0x1fa6: 0x25, 0x1fa7: 0x26, - 0x1fa8: 0x27, 0x1fa9: 0x28, 0x1faa: 0x29, 0x1fab: 0x2a, 0x1fac: 0x2b, 0x1fad: 0x2c, 0x1fae: 0x2d, 0x1faf: 0x2e, - 0x1fb0: 0x2f, 0x1fb1: 0x30, 0x1fb2: 0x417, 0x1fb3: 0x418, 0x1fb4: 0x33, 0x1fb5: 0x34, 0x1fb6: 0x35, 0x1fb7: 0x36, - 0x1fb8: 0x37, 0x1fb9: 0x38, 0x1fba: 0x39, 0x1fbb: 0x3a, 0x1fbc: 0x3b, 0x1fbd: 0x3c, 0x1fbe: 0x3d, 0x1fbf: 0x3e, - // Block 0x7f, offset 0x1fc0 - 0x1fc2: 0x01, 0x1fc3: 0x02, 0x1fc4: 0x03, 0x1fc5: 0x04, 0x1fc6: 0x05, 0x1fc7: 0x06, - 0x1fc8: 0x07, 0x1fc9: 0x08, 0x1fca: 0x09, 0x1fcb: 0x0a, 0x1fcc: 0x0b, 0x1fcd: 0x0c, 0x1fce: 0x0d, 0x1fcf: 0x0e, - 0x1fd0: 0x0f, 0x1fd1: 0x10, 0x1fd2: 0x11, 0x1fd3: 0x12, 0x1fd4: 0x13, 0x1fd5: 0x14, 0x1fd6: 0x15, 0x1fd7: 0x16, - 0x1fd8: 0x17, 0x1fd9: 0x18, 0x1fda: 0x19, 0x1fdb: 0x1a, 0x1fdc: 0x1b, 0x1fdd: 0x1c, 0x1fde: 0x1d, 0x1fdf: 0x1e, - 0x1fe0: 0x7c, 0x1fe1: 0x02, 0x1fe2: 0x03, 0x1fe3: 0x04, 0x1fe4: 0x05, - 0x1fea: 0x06, 0x1fed: 0x07, 0x1fef: 0x08, - 0x1ff0: 0x13, 0x1ff3: 0x15, - // Block 0x80, offset 0x2000 - 0x2000: 0xba, 0x2001: 0xbb, 0x2002: 0xbc, 0x2003: 0xbd, 0x2004: 0xbe, 0x2005: 0xbf, 0x2006: 0xc0, 0x2007: 0xc1, - 0x2008: 0x419, 0x2009: 0x2b3, 0x200a: 0xc4, 0x200b: 0x2b4, 0x200c: 0xc6, 0x200d: 0x2b5, 0x200e: 0xc8, 0x200f: 0x2b6, - // Block 0x81, offset 0x2040 - 0x2077: 0xca, - 0x2078: 0x41a, 0x2079: 0x41b, 0x207a: 0x41c, 0x207b: 0x41d, 0x207c: 0x41e, 0x207d: 0x41f, 0x207e: 0x420, 0x207f: 0x421, - // Block 0x82, offset 0x2080 - 0x2080: 0x422, 0x2081: 0x423, 0x2082: 0x424, 0x2083: 0x425, 0x2084: 0x426, 0x2085: 0x427, 0x2086: 0x428, 0x2087: 0x429, - 0x2088: 0x42a, 0x2089: 0x42b, 0x208a: 0x42c, 0x208b: 0x42d, 0x208c: 0x42e, 0x208d: 0x42f, 0x208e: 0x430, 0x208f: 0x431, - 0x2090: 0x432, 0x2091: 0x433, 0x2092: 0x434, 0x2093: 0x435, 0x2094: 0x436, 0x2095: 0x437, 0x2096: 0x438, 0x2097: 0x439, - 0x2098: 0x43a, 0x2099: 0x43b, 0x209a: 0x43c, 0x209b: 0x43d, 0x209c: 0x43e, 0x209d: 0x43f, 0x209e: 0x440, 0x209f: 0x441, - 0x20a0: 0x442, 0x20a1: 0x443, 0x20a2: 0x444, 0x20a3: 0x445, 0x20a4: 0x446, 0x20a5: 0x447, 0x20a6: 0x448, 0x20a7: 0x449, - 0x20a8: 0x44a, 0x20a9: 0x44b, 0x20aa: 0x44c, 0x20ab: 0x44d, 0x20ac: 0x44e, 0x20ad: 0x44f, 0x20ae: 0x450, 0x20af: 0x451, - 0x20b0: 0x452, 0x20b1: 0x453, 0x20b2: 0x454, 0x20b3: 0x455, 0x20b4: 0x456, 0x20b5: 0x457, 0x20b6: 0x458, 0x20b7: 0x459, - 0x20b8: 0x45a, 0x20b9: 0x45b, 0x20ba: 0x45c, 0x20bb: 0x45d, 0x20bc: 0x45e, 0x20bd: 0x45f, 0x20be: 0x460, 0x20bf: 0x461, - // Block 0x83, offset 0x20c0 - 0x20c0: 0x462, 0x20c1: 0x463, 0x20c2: 0x464, 0x20c3: 0x465, 0x20c4: 0x466, 0x20c5: 0x467, 0x20c6: 0x468, 0x20c7: 0x469, - 0x20c8: 0x46a, 0x20c9: 0x46b, 0x20ca: 0x46c, 0x20cb: 0x46d, 0x20cc: 0x46e, 0x20cd: 0x46f, 0x20ce: 0x470, 0x20cf: 0x471, - 0x20d0: 0x472, 0x20d1: 0x473, 0x20d2: 0x474, 0x20d3: 0x475, 0x20d4: 0x476, 0x20d5: 0x477, 0x20d6: 0x478, 0x20d7: 0x479, - 0x20d8: 0x47a, 0x20d9: 0x47b, 0x20da: 0x47c, 0x20db: 0x47d, 0x20dc: 0x47e, 0x20dd: 0x47f, 0x20de: 0x480, 0x20df: 0x481, - 0x20e0: 0x482, 0x20e1: 0x483, 0x20e2: 0x484, 0x20e3: 0x485, 0x20e4: 0x486, 0x20e5: 0x487, 0x20e6: 0x488, 0x20e7: 0x489, - 0x20e8: 0x48a, 0x20e9: 0x48b, 0x20ea: 0x48c, 0x20eb: 0x48d, 0x20ec: 0x48e, 0x20ed: 0x48f, 0x20ee: 0x490, 0x20ef: 0x491, - 0x20f0: 0x492, 0x20f1: 0x493, 0x20f2: 0x494, 0x20f3: 0x495, 0x20f4: 0x496, 0x20f5: 0x497, 0x20f6: 0x498, 0x20f7: 0x499, - 0x20f8: 0x49a, 0x20f9: 0x49b, 0x20fa: 0x49c, 0x20fb: 0x49d, 0x20fc: 0x49e, 0x20fd: 0x49f, 0x20fe: 0x4a0, 0x20ff: 0x4a1, - // Block 0x84, offset 0x2100 - 0x2100: 0x4a2, 0x2101: 0x4a3, 0x2102: 0x4a4, 0x2103: 0x4a5, 0x2104: 0x4a6, 0x2105: 0x4a7, 0x2106: 0x4a8, 0x2107: 0x4a9, - 0x2108: 0x4aa, 0x2109: 0x4ab, 0x210a: 0x4ac, 0x210b: 0x4ad, 0x210c: 0x4ae, 0x210d: 0x4af, 0x210e: 0x4b0, 0x210f: 0x4b1, - 0x2110: 0x4b2, 0x2111: 0x4b3, 0x2112: 0x4b4, 0x2113: 0x4b5, 0x2114: 0x4b6, 0x2115: 0x4b7, 0x2116: 0x4b8, 0x2117: 0x4b9, - 0x2118: 0x4ba, 0x2119: 0x4bb, 0x211a: 0x4bc, 0x211b: 0x4bd, 0x211c: 0x4be, 0x211d: 0x4bf, 0x211e: 0x4c0, 0x211f: 0x4c1, - 0x2120: 0x4c2, 0x2121: 0x4c3, 0x2122: 0x4c4, 0x2123: 0x4c5, 0x2124: 0x4c6, 0x2125: 0x4c7, 0x2126: 0x4c8, 0x2127: 0x4c9, - 0x2128: 0x4ca, 0x2129: 0x4cb, 0x212a: 0x4cc, 0x212b: 0x4cd, 0x212c: 0x4ce, 0x212d: 0x4cf, 0x212e: 0x4d0, 0x212f: 0x4d1, - 0x2130: 0x4d2, 0x2131: 0x4d3, 0x2132: 0x4d4, 0x2133: 0x4d5, 0x2134: 0x4d6, 0x2135: 0x4d7, 0x2136: 0x4d8, 0x2137: 0x4d9, - 0x2138: 0x4da, 0x2139: 0x4db, 0x213a: 0x4dc, 0x213c: 0x4dd, 0x213d: 0x4de, 0x213e: 0x4df, 0x213f: 0x4e0, - // Block 0x85, offset 0x2140 - 0x2140: 0x4e1, 0x2141: 0x4e2, 0x2142: 0x4e3, 0x2143: 0x4e4, 0x2144: 0x4e5, 0x2145: 0x4e6, 0x2146: 0x4e7, 0x2147: 0x4e8, - 0x2148: 0x4e9, 0x2149: 0x4ea, 0x214a: 0x4eb, 0x214b: 0x4ec, 0x214c: 0x4ed, 0x214d: 0x4ee, 0x214e: 0x4ef, 0x214f: 0x4f0, - 0x2150: 0x4f1, 0x2151: 0x4f2, 0x2152: 0x4f3, 0x2153: 0x4f4, 0x2154: 0x4f5, 0x2155: 0x4f6, 0x2156: 0x4f7, 0x2157: 0x4f8, - 0x2158: 0x4f9, 0x2159: 0x4fa, 0x215a: 0x4fb, 0x215b: 0x4fc, 0x215c: 0x4fd, 0x215d: 0x4fe, 0x215e: 0x4ff, 0x215f: 0x500, - 0x2160: 0x501, 0x2161: 0x502, 0x2162: 0x503, 0x2163: 0x504, 0x2164: 0x505, 0x2165: 0x506, 0x2166: 0x507, 0x2167: 0x508, - 0x2168: 0x509, 0x2169: 0x50a, 0x216a: 0x50b, 0x216b: 0x50c, 0x216c: 0x50d, 0x216d: 0x50e, 0x216e: 0x50f, - 0x2170: 0x510, 0x2171: 0x511, 0x2172: 0x512, 0x2173: 0x513, 0x2174: 0x514, 0x2175: 0x515, 0x2176: 0x516, 0x2177: 0x517, - 0x2178: 0x518, 0x2179: 0x519, 0x217a: 0x51a, 0x217b: 0x51b, 0x217c: 0x51c, 0x217d: 0x51d, 0x217e: 0x51e, 0x217f: 0x51f, - // Block 0x86, offset 0x2180 - 0x2180: 0x520, 0x2181: 0x521, 0x2182: 0x522, 0x2183: 0x523, 0x2184: 0x524, 0x2185: 0x525, 0x2186: 0x526, 0x2187: 0x527, - 0x2188: 0x528, 0x2189: 0x529, 0x218a: 0x52a, 0x218b: 0x52b, 0x218c: 0x52c, 0x218d: 0x52d, 0x218e: 0x52e, 0x218f: 0x52f, - 0x2190: 0x530, 0x2191: 0x531, 0x2195: 0x532, 0x2196: 0x533, 0x2197: 0x534, - 0x2198: 0x535, 0x2199: 0x536, 0x219a: 0x537, 0x219b: 0x538, 0x219c: 0x539, 0x219d: 0x53a, 0x219e: 0x53b, 0x219f: 0x53c, - 0x21a0: 0x53d, 0x21a1: 0x53e, 0x21a2: 0x53f, 0x21a3: 0x540, 0x21a4: 0x541, 0x21a5: 0x542, 0x21a6: 0x543, 0x21a7: 0x544, - 0x21a8: 0x545, 0x21a9: 0x546, 0x21aa: 0x547, 0x21ab: 0x548, 0x21ac: 0x549, 0x21ad: 0x54a, 0x21ae: 0x54b, 0x21af: 0x54c, - 0x21b0: 0x54d, 0x21b1: 0x54e, 0x21b3: 0x54f, 0x21b4: 0x550, 0x21b5: 0x551, 0x21b6: 0x552, 0x21b7: 0x553, - 0x21b8: 0x554, 0x21b9: 0x555, 0x21ba: 0x556, 0x21bb: 0x557, 0x21bc: 0x558, 0x21bd: 0x559, 0x21be: 0x55a, - // Block 0x87, offset 0x21c0 - 0x21e4: 0x55b, 0x21e5: 0x55c, 0x21e6: 0x55d, 0x21e7: 0x55e, - 0x21e8: 0x55f, 0x21e9: 0x560, 0x21ea: 0x561, 0x21eb: 0x562, 0x21ec: 0x103, 0x21ed: 0x104, 0x21ee: 0x105, 0x21ef: 0x106, - 0x21f0: 0x107, 0x21f1: 0x108, 0x21f2: 0x109, 0x21f3: 0x10a, 0x21f4: 0x10b, 0x21f5: 0x10c, 0x21f6: 0x10d, 0x21f7: 0x10e, - 0x21f8: 0x10f, 0x21f9: 0x110, 0x21fa: 0x111, 0x21fb: 0x112, 0x21fc: 0x113, 0x21fd: 0x114, 0x21fe: 0x115, 0x21ff: 0x116, - // Block 0x88, offset 0x2200 - 0x2200: 0x18b, 0x2201: 0x18c, 0x2202: 0x18d, 0x2203: 0x18e, 0x2204: 0x18f, 0x2205: 0x190, 0x2206: 0x191, 0x2207: 0x192, - 0x2208: 0x193, 0x2209: 0x563, 0x220c: 0x195, 0x220d: 0x196, 0x220e: 0x197, 0x220f: 0x198, - 0x2210: 0x199, 0x2211: 0x19a, 0x2212: 0x19b, 0x2213: 0x19c, 0x2214: 0x19d, 0x2215: 0x19e, 0x2217: 0x19f, - 0x2218: 0x1a0, 0x2219: 0x1a1, 0x221a: 0x1a2, 0x221b: 0x1a3, 0x221c: 0x1a4, 0x221d: 0x1a5, - // Block 0x89, offset 0x2240 - 0x2260: 0x564, 0x2261: 0x565, 0x2262: 0x566, 0x2263: 0x567, 0x2264: 0x568, 0x2265: 0x569, 0x2266: 0x56a, 0x2267: 0x56b, - 0x2268: 0x56c, - // Block 0x8a, offset 0x2280 - 0x2290: 0x09, 0x2291: 0x0a, 0x2292: 0x0b, 0x2293: 0x0c, 0x2296: 0x0d, - 0x229b: 0x0e, 0x229d: 0x0f, 0x229e: 0x10, 0x229f: 0x86, - 0x22af: 0x87, - // Block 0x8b, offset 0x22c0 - 0x22c2: 0x01, 0x22c3: 0x02, 0x22c4: 0x03, 0x22c5: 0x04, 0x22c6: 0x05, 0x22c7: 0x06, - 0x22c8: 0x07, 0x22c9: 0x08, 0x22ca: 0x09, 0x22cb: 0x0a, 0x22cc: 0x0b, 0x22cd: 0x0c, 0x22ce: 0x0d, 0x22cf: 0x0e, - 0x22d0: 0x0f, 0x22d1: 0x10, 0x22d2: 0x11, 0x22d3: 0x12, 0x22d4: 0x13, 0x22d5: 0x14, 0x22d6: 0x15, 0x22d7: 0x16, - 0x22d8: 0x17, 0x22d9: 0x18, 0x22da: 0x19, 0x22db: 0x1a, 0x22dc: 0x1b, 0x22dd: 0x1c, 0x22de: 0x1d, 0x22df: 0x1e, - 0x22e0: 0x01, 0x22e1: 0x02, 0x22e2: 0x03, 0x22e3: 0x7e, 0x22e4: 0x7f, 0x22e5: 0x80, 0x22e6: 0x81, 0x22e7: 0x82, - 0x22e8: 0x83, 0x22e9: 0x84, 0x22ea: 0x06, 0x22ed: 0x07, 0x22ef: 0x85, - 0x22f0: 0x88, 0x22f3: 0x15, - // Block 0x8c, offset 0x2300 - 0x2320: 0x1f, 0x2321: 0x20, 0x2322: 0x21, 0x2323: 0x22, 0x2324: 0x56d, 0x2325: 0x24, 0x2326: 0x25, 0x2327: 0x26, - 0x2328: 0x27, 0x2329: 0x28, 0x232a: 0x29, 0x232b: 0x2a, 0x232c: 0x2b, 0x232d: 0x2c, 0x232e: 0x2d, 0x232f: 0x2e, - 0x2330: 0x2f, 0x2331: 0x30, 0x2332: 0x31, 0x2333: 0x32, 0x2334: 0x33, 0x2335: 0x34, 0x2336: 0x35, 0x2337: 0x36, - 0x2338: 0x37, 0x2339: 0x38, 0x233a: 0x39, 0x233b: 0x3a, 0x233c: 0x3b, 0x233d: 0x3c, 0x233e: 0x3d, 0x233f: 0x3e, - // Block 0x8d, offset 0x2340 - 0x2342: 0x01, 0x2343: 0x02, 0x2344: 0x03, 0x2345: 0x04, 0x2346: 0x05, 0x2347: 0x06, - 0x2348: 0x07, 0x2349: 0x08, 0x234a: 0x09, 0x234b: 0x0a, 0x234c: 0x0b, 0x234d: 0x0c, 0x234e: 0x0d, 0x234f: 0x0e, - 0x2350: 0x0f, 0x2351: 0x10, 0x2352: 0x11, 0x2353: 0x12, 0x2354: 0x13, 0x2355: 0x14, 0x2356: 0x15, 0x2357: 0x16, - 0x2358: 0x17, 0x2359: 0x18, 0x235a: 0x19, 0x235b: 0x1a, 0x235c: 0x1b, 0x235d: 0x1c, 0x235e: 0x1d, 0x235f: 0x1e, - 0x2360: 0x8a, 0x2361: 0x02, 0x2362: 0x03, 0x2363: 0x04, 0x2364: 0x05, - 0x236a: 0x06, 0x236d: 0x07, 0x236f: 0x08, - 0x2370: 0x13, 0x2373: 0x15, - // Block 0x8e, offset 0x2380 - 0x2382: 0x01, 0x2383: 0x02, 0x2384: 0x03, 0x2385: 0x04, 0x2386: 0x570, 0x2387: 0x06, - 0x2388: 0x07, 0x2389: 0x571, 0x238a: 0x09, 0x238b: 0x0a, 0x238c: 0x0b, 0x238d: 0x0c, 0x238e: 0x0d, 0x238f: 0x0e, - 0x2390: 0x0f, 0x2391: 0x10, 0x2392: 0x11, 0x2393: 0x12, 0x2394: 0x13, 0x2395: 0x14, 0x2396: 0x15, 0x2397: 0x16, - 0x2398: 0x17, 0x2399: 0x18, 0x239a: 0x19, 0x239b: 0x1a, 0x239c: 0x1b, 0x239d: 0x1c, 0x239e: 0x1d, 0x239f: 0x1e, - 0x23a0: 0x01, 0x23a1: 0x02, 0x23a2: 0x03, 0x23a3: 0x04, 0x23a4: 0x05, - 0x23aa: 0x06, 0x23ad: 0x07, 0x23af: 0x08, - 0x23b0: 0x13, 0x23b3: 0x15, - // Block 0x8f, offset 0x23c0 - 0x23c0: 0x3f, 0x23c1: 0x40, 0x23c2: 0x41, 0x23c3: 0x42, 0x23c4: 0x43, 0x23c5: 0x44, 0x23c6: 0x45, 0x23c7: 0x46, - 0x23c8: 0x47, 0x23c9: 0x48, 0x23ca: 0x49, 0x23cb: 0x4a, 0x23cc: 0x4b, 0x23cd: 0x4c, 0x23ce: 0x4d, 0x23cf: 0x4e, - 0x23d0: 0x4f, 0x23d1: 0x50, 0x23d2: 0x51, 0x23d3: 0x52, 0x23d4: 0x53, 0x23d5: 0x54, 0x23d6: 0x55, 0x23d7: 0x56, - 0x23d8: 0x57, 0x23d9: 0x58, 0x23da: 0x59, 0x23db: 0x5a, 0x23dc: 0x5b, 0x23dd: 0x5c, 0x23de: 0x5d, 0x23df: 0x5e, - 0x23e0: 0x5f, 0x23e1: 0x60, 0x23e2: 0x61, 0x23e3: 0x62, 0x23e4: 0x63, 0x23e5: 0x64, 0x23e6: 0x65, 0x23e7: 0x66, - 0x23e8: 0x67, 0x23e9: 0x68, 0x23ea: 0x69, 0x23ec: 0x6a, 0x23ed: 0x6b, 0x23ee: 0x6c, 0x23ef: 0x6d, - 0x23f0: 0x6e, 0x23f1: 0x6f, 0x23f3: 0x70, 0x23f4: 0x71, 0x23f5: 0x72, 0x23f6: 0x73, 0x23f7: 0x74, - 0x23f8: 0x75, 0x23f9: 0x57a, 0x23fa: 0x57b, 0x23fb: 0x57c, 0x23fc: 0x79, 0x23fd: 0x7a, 0x23fe: 0x7b, 0x23ff: 0x7c, - // Block 0x90, offset 0x2400 - 0x2400: 0x7d, 0x2401: 0x7e, 0x2402: 0x7f, 0x2403: 0x80, 0x2404: 0x81, 0x2405: 0x82, 0x2406: 0x83, 0x2407: 0x84, - 0x2408: 0x85, 0x2409: 0x86, 0x240a: 0x87, 0x240b: 0x88, 0x240c: 0x89, 0x240d: 0x8a, 0x240e: 0x8b, 0x240f: 0x8c, - 0x2410: 0x8d, 0x2411: 0x8e, 0x2412: 0x57d, 0x2413: 0x90, 0x2414: 0x91, 0x2415: 0x92, 0x2416: 0x93, 0x2417: 0x94, - 0x2418: 0x95, 0x2419: 0x96, 0x241a: 0x97, 0x241b: 0x98, 0x241c: 0x99, 0x241d: 0x9a, 0x241e: 0x9b, 0x241f: 0x9c, - 0x2420: 0x9d, 0x2421: 0x9e, 0x2422: 0x9f, 0x2423: 0xa0, 0x2424: 0xa1, 0x2425: 0xa2, 0x2426: 0xa3, 0x2427: 0xa4, - 0x2428: 0xa5, 0x2429: 0xa6, 0x242a: 0xa7, 0x242b: 0xa8, 0x242c: 0xa9, 0x242d: 0xaa, - 0x2430: 0xab, 0x2431: 0xac, 0x2432: 0xad, 0x2433: 0xae, 0x2434: 0xaf, 0x2435: 0xb0, 0x2436: 0xb1, 0x2437: 0xb2, - 0x2438: 0xb3, 0x243a: 0xb4, 0x243b: 0xb5, 0x243c: 0xb6, 0x243d: 0xb7, 0x243e: 0xb8, 0x243f: 0xb9, - // Block 0x91, offset 0x2440 - 0x2440: 0xba, 0x2441: 0xbb, 0x2442: 0xbc, 0x2443: 0xbd, 0x2444: 0xbe, 0x2445: 0xbf, 0x2446: 0xc0, 0x2447: 0xc1, - 0x2448: 0xc2, 0x2449: 0xc3, 0x244a: 0xc4, 0x244b: 0xc5, 0x244c: 0xc6, 0x244d: 0xc7, 0x244e: 0xc8, 0x244f: 0x57e, - // Block 0x92, offset 0x2480 - 0x2480: 0x18b, 0x2481: 0x18c, 0x2482: 0x18d, 0x2483: 0x18e, 0x2484: 0x57f, 0x2485: 0x190, 0x2486: 0x191, 0x2487: 0x192, - 0x2488: 0x193, 0x2489: 0x194, 0x248c: 0x195, 0x248d: 0x196, 0x248e: 0x197, 0x248f: 0x198, - 0x2490: 0x199, 0x2491: 0x19a, 0x2492: 0x19b, 0x2493: 0x19c, 0x2494: 0x19d, 0x2495: 0x19e, 0x2497: 0x19f, - 0x2498: 0x1a0, 0x2499: 0x1a1, 0x249a: 0x1a2, 0x249b: 0x1a3, 0x249c: 0x1a4, 0x249d: 0x1a5, - // Block 0x93, offset 0x24c0 - 0x24d0: 0x09, 0x24d1: 0x0a, 0x24d2: 0x0b, 0x24d3: 0x0c, 0x24d6: 0x0d, - 0x24db: 0x0e, 0x24dd: 0x0f, 0x24de: 0x10, 0x24df: 0x90, - 0x24ef: 0x12, - // Block 0x94, offset 0x2500 - 0x2502: 0x01, 0x2503: 0x574, 0x2504: 0x575, 0x2505: 0x576, 0x2506: 0x05, 0x2507: 0x577, - 0x2508: 0x578, 0x2509: 0x08, 0x250a: 0x09, 0x250b: 0x0a, 0x250c: 0x579, 0x250d: 0x0c, 0x250e: 0x0d, 0x250f: 0x0e, - 0x2510: 0x0f, 0x2511: 0x10, 0x2512: 0x11, 0x2513: 0x12, 0x2514: 0x13, 0x2515: 0x14, 0x2516: 0x15, 0x2517: 0x16, - 0x2518: 0x17, 0x2519: 0x18, 0x251a: 0x19, 0x251b: 0x1a, 0x251c: 0x1b, 0x251d: 0x1c, 0x251e: 0x1d, 0x251f: 0x1e, - 0x2520: 0x01, 0x2521: 0x8d, 0x2522: 0x8e, 0x2523: 0x8f, 0x2524: 0x05, - 0x252a: 0x06, 0x252d: 0x07, 0x252f: 0x08, - 0x2530: 0x91, 0x2533: 0x15, - // Block 0x95, offset 0x2540 - 0x2540: 0x3f, 0x2541: 0x40, 0x2542: 0x41, 0x2543: 0x42, 0x2544: 0x43, 0x2545: 0x44, 0x2546: 0x45, 0x2547: 0x46, - 0x2548: 0x47, 0x2549: 0x48, 0x254a: 0x49, 0x254b: 0x4a, 0x254c: 0x4b, 0x254d: 0x4c, 0x254e: 0x4d, 0x254f: 0x4e, - 0x2550: 0x4f, 0x2551: 0x50, 0x2552: 0x51, 0x2553: 0x52, 0x2554: 0x53, 0x2555: 0x54, 0x2556: 0x55, 0x2557: 0x56, - 0x2558: 0x57, 0x2559: 0x58, 0x255a: 0x59, 0x255b: 0x5a, 0x255c: 0x5b, 0x255d: 0x5c, 0x255e: 0x5d, 0x255f: 0x5e, - 0x2560: 0x5f, 0x2561: 0x60, 0x2562: 0x61, 0x2563: 0x62, 0x2564: 0x63, 0x2565: 0x64, 0x2566: 0x65, 0x2567: 0x66, - 0x2568: 0x67, 0x2569: 0x68, 0x256a: 0x69, 0x256c: 0x6a, 0x256d: 0x6b, 0x256e: 0x6c, 0x256f: 0x6d, - 0x2570: 0x6e, 0x2571: 0x6f, 0x2573: 0x70, 0x2574: 0x71, 0x2575: 0x72, 0x2576: 0x73, 0x2577: 0x74, - 0x2578: 0x75, 0x2579: 0x584, 0x257a: 0x77, 0x257b: 0x78, 0x257c: 0x79, 0x257d: 0x7a, 0x257e: 0x7b, 0x257f: 0x7c, - // Block 0x96, offset 0x2580 - 0x2582: 0x01, 0x2583: 0x02, 0x2584: 0x582, 0x2585: 0x583, 0x2586: 0x05, 0x2587: 0x06, - 0x2588: 0x07, 0x2589: 0x08, 0x258a: 0x09, 0x258b: 0x0a, 0x258c: 0x0b, 0x258d: 0x0c, 0x258e: 0x0d, 0x258f: 0x0e, - 0x2590: 0x0f, 0x2591: 0x10, 0x2592: 0x11, 0x2593: 0x12, 0x2594: 0x13, 0x2595: 0x14, 0x2596: 0x15, 0x2597: 0x16, - 0x2598: 0x17, 0x2599: 0x18, 0x259a: 0x19, 0x259b: 0x1a, 0x259c: 0x1b, 0x259d: 0x1c, 0x259e: 0x1d, 0x259f: 0x1e, - 0x25a0: 0x01, 0x25a1: 0x93, 0x25a2: 0x03, 0x25a3: 0x04, 0x25a4: 0x05, - 0x25aa: 0x06, 0x25ad: 0x07, 0x25af: 0x08, - 0x25b0: 0x13, 0x25b3: 0x15, - // Block 0x97, offset 0x25c0 - 0x25e0: 0x1f, 0x25e1: 0x20, 0x25e2: 0x21, 0x25e3: 0x22, 0x25e4: 0x23, 0x25e5: 0x24, 0x25e6: 0x25, 0x25e7: 0x26, - 0x25e8: 0x27, 0x25e9: 0x28, 0x25ea: 0x29, 0x25eb: 0x2a, 0x25ec: 0x2b, 0x25ed: 0x2c, 0x25ee: 0x2d, 0x25ef: 0x2e, - 0x25f0: 0x2f, 0x25f1: 0x30, 0x25f2: 0x31, 0x25f3: 0x32, 0x25f4: 0x585, 0x25f5: 0x586, 0x25f6: 0x35, 0x25f7: 0x36, - 0x25f8: 0x37, 0x25f9: 0x38, 0x25fa: 0x39, 0x25fb: 0x3a, 0x25fc: 0x3b, 0x25fd: 0x3c, 0x25fe: 0x3d, 0x25ff: 0x3e, - // Block 0x98, offset 0x2600 - 0x2602: 0x01, 0x2603: 0x02, 0x2604: 0x03, 0x2605: 0x04, 0x2606: 0x05, 0x2607: 0x06, - 0x2608: 0x07, 0x2609: 0x08, 0x260a: 0x09, 0x260b: 0x0a, 0x260c: 0x0b, 0x260d: 0x0c, 0x260e: 0x0d, 0x260f: 0x0e, - 0x2610: 0x0f, 0x2611: 0x10, 0x2612: 0x11, 0x2613: 0x12, 0x2614: 0x13, 0x2615: 0x14, 0x2616: 0x15, 0x2617: 0x16, - 0x2618: 0x17, 0x2619: 0x18, 0x261a: 0x19, 0x261b: 0x1a, 0x261c: 0x1b, 0x261d: 0x1c, 0x261e: 0x1d, 0x261f: 0x1e, - 0x2620: 0x95, 0x2621: 0x02, 0x2622: 0x03, 0x2623: 0x04, 0x2624: 0x05, - 0x262a: 0x06, 0x262d: 0x07, 0x262f: 0x08, - 0x2630: 0x13, 0x2633: 0x15, - // Block 0x99, offset 0x2640 - 0x2660: 0x1f, 0x2661: 0x20, 0x2662: 0x21, 0x2663: 0x22, 0x2664: 0x587, 0x2665: 0x24, 0x2666: 0x25, 0x2667: 0x26, - 0x2668: 0x27, 0x2669: 0x28, 0x266a: 0x29, 0x266b: 0x2a, 0x266c: 0x2b, 0x266d: 0x2c, 0x266e: 0x2d, 0x266f: 0x2e, - 0x2670: 0x2f, 0x2671: 0x30, 0x2672: 0x31, 0x2673: 0x32, 0x2674: 0x33, 0x2675: 0x34, 0x2676: 0x35, 0x2677: 0x36, - 0x2678: 0x37, 0x2679: 0x38, 0x267a: 0x39, 0x267b: 0x3a, 0x267c: 0x3b, 0x267d: 0x3c, 0x267e: 0x3d, 0x267f: 0x3e, - // Block 0x9a, offset 0x2680 - 0x2682: 0x01, 0x2683: 0x02, 0x2684: 0x03, 0x2685: 0x04, 0x2686: 0x05, 0x2687: 0x06, - 0x2688: 0x07, 0x2689: 0x08, 0x268a: 0x09, 0x268b: 0x0a, 0x268c: 0x0b, 0x268d: 0x0c, 0x268e: 0x0d, 0x268f: 0x0e, - 0x2690: 0x0f, 0x2691: 0x10, 0x2692: 0x11, 0x2693: 0x12, 0x2694: 0x13, 0x2695: 0x14, 0x2696: 0x15, 0x2697: 0x16, - 0x2698: 0x17, 0x2699: 0x18, 0x269a: 0x19, 0x269b: 0x1a, 0x269c: 0x1b, 0x269d: 0x1c, 0x269e: 0x1d, 0x269f: 0x1e, - 0x26a0: 0x97, 0x26a1: 0x02, 0x26a2: 0x03, 0x26a3: 0x04, 0x26a4: 0x05, - 0x26aa: 0x06, 0x26ad: 0x07, 0x26af: 0x08, - 0x26b0: 0x13, 0x26b3: 0x15, - // Block 0x9b, offset 0x26c0 - 0x26c0: 0x7d, 0x26c1: 0x7e, 0x26c2: 0x7f, 0x26c3: 0x80, 0x26c4: 0x58c, 0x26c5: 0x82, 0x26c6: 0x83, 0x26c7: 0x84, - 0x26c8: 0x85, 0x26c9: 0x86, 0x26ca: 0x87, 0x26cb: 0x88, 0x26cc: 0x89, 0x26cd: 0x8a, 0x26ce: 0x8b, 0x26cf: 0x8c, - 0x26d0: 0x8d, 0x26d1: 0x8e, 0x26d2: 0x8f, 0x26d3: 0x90, 0x26d4: 0x91, 0x26d5: 0x92, 0x26d6: 0x93, 0x26d7: 0x94, - 0x26d8: 0x95, 0x26d9: 0x96, 0x26da: 0x97, 0x26db: 0x98, 0x26dc: 0x99, 0x26dd: 0x9a, 0x26de: 0x9b, 0x26df: 0x9c, - 0x26e0: 0x9d, 0x26e1: 0x9e, 0x26e2: 0x9f, 0x26e3: 0xa0, 0x26e4: 0xa1, 0x26e5: 0xa2, 0x26e6: 0xa3, 0x26e7: 0xa4, - 0x26e8: 0xa5, 0x26e9: 0xa6, 0x26ea: 0xa7, 0x26eb: 0xa8, 0x26ec: 0xa9, 0x26ed: 0xaa, - 0x26f0: 0xab, 0x26f1: 0xac, 0x26f2: 0xad, 0x26f3: 0xae, 0x26f4: 0xaf, 0x26f5: 0xb0, 0x26f6: 0xb1, 0x26f7: 0xb2, - 0x26f8: 0xb3, 0x26fa: 0xb4, 0x26fb: 0xb5, 0x26fc: 0xb6, 0x26fd: 0xb7, 0x26fe: 0xb8, 0x26ff: 0xb9, - // Block 0x9c, offset 0x2700 - 0x2700: 0xcb, 0x2701: 0xcc, 0x2702: 0xcd, 0x2703: 0xce, 0x2704: 0xcf, 0x2705: 0xd0, 0x2706: 0xd1, 0x2707: 0xd2, - 0x2708: 0xd3, 0x2709: 0xd4, 0x270a: 0xd5, 0x270b: 0xd6, 0x270c: 0xd7, 0x270d: 0xd8, 0x270e: 0xd9, 0x270f: 0xda, - 0x2710: 0xdb, 0x2711: 0xdc, 0x2712: 0xdd, 0x2713: 0xde, 0x2714: 0xdf, 0x2715: 0xe0, 0x2716: 0xe1, 0x2717: 0xe2, - 0x2718: 0xe3, 0x2719: 0xe4, 0x271a: 0xe5, 0x271b: 0xe6, 0x271c: 0xe7, 0x271d: 0xe8, 0x271e: 0xe9, 0x271f: 0x58d, - 0x2720: 0xeb, 0x2721: 0xec, 0x2722: 0xed, 0x2723: 0xee, 0x2724: 0xef, 0x2725: 0xf0, 0x2726: 0xf1, 0x2727: 0xf2, - 0x2728: 0xf3, 0x2729: 0xf4, 0x272a: 0xf5, 0x272b: 0xf6, 0x272c: 0xf7, 0x272f: 0xf8, - // Block 0x9d, offset 0x2740 - 0x2742: 0x01, 0x2743: 0x02, 0x2744: 0x58a, 0x2745: 0x58b, 0x2746: 0x05, 0x2747: 0x06, - 0x2748: 0x07, 0x2749: 0x08, 0x274a: 0x09, 0x274b: 0x0a, 0x274c: 0x0b, 0x274d: 0x0c, 0x274e: 0x0d, 0x274f: 0x0e, - 0x2750: 0x0f, 0x2751: 0x10, 0x2752: 0x11, 0x2753: 0x12, 0x2754: 0x13, 0x2755: 0x14, 0x2756: 0x15, 0x2757: 0x16, - 0x2758: 0x17, 0x2759: 0x18, 0x275a: 0x19, 0x275b: 0x1a, 0x275c: 0x1b, 0x275d: 0x1c, 0x275e: 0x1d, 0x275f: 0x1e, - 0x2760: 0x01, 0x2761: 0x02, 0x2762: 0x99, 0x2763: 0x04, 0x2764: 0x05, - 0x276a: 0x9a, 0x276d: 0x07, 0x276f: 0x08, - 0x2770: 0x13, 0x2773: 0x15, - // Block 0x9e, offset 0x2780 - 0x2780: 0x58e, 0x2781: 0x58f, 0x2782: 0x590, 0x2783: 0x42, 0x2784: 0x43, 0x2785: 0x44, 0x2786: 0x45, 0x2787: 0x46, - 0x2788: 0x47, 0x2789: 0x48, 0x278a: 0x49, 0x278b: 0x4a, 0x278c: 0x4b, 0x278d: 0x4c, 0x278e: 0x4d, 0x278f: 0x4e, - 0x2790: 0x4f, 0x2791: 0x50, 0x2792: 0x51, 0x2793: 0x52, 0x2794: 0x53, 0x2795: 0x54, 0x2796: 0x55, 0x2797: 0x56, - 0x2798: 0x57, 0x2799: 0x58, 0x279a: 0x59, 0x279b: 0x5a, 0x279c: 0x5b, 0x279d: 0x5c, 0x279e: 0x5d, 0x279f: 0x5e, - 0x27a0: 0x5f, 0x27a1: 0x60, 0x27a2: 0x61, 0x27a3: 0x62, 0x27a4: 0x63, 0x27a5: 0x64, 0x27a6: 0x65, 0x27a7: 0x66, - 0x27a8: 0x67, 0x27a9: 0x68, 0x27aa: 0x69, 0x27ac: 0x6a, 0x27ad: 0x6b, 0x27ae: 0x6c, 0x27af: 0x6d, - 0x27b0: 0x6e, 0x27b1: 0x6f, 0x27b3: 0x70, 0x27b4: 0x71, 0x27b5: 0x72, 0x27b6: 0x73, 0x27b7: 0x74, - 0x27b8: 0x75, 0x27b9: 0x76, 0x27ba: 0x77, 0x27bb: 0x78, 0x27bc: 0x79, 0x27bd: 0x7a, 0x27be: 0x7b, 0x27bf: 0x7c, - // Block 0x9f, offset 0x27c0 - 0x27c2: 0x01, 0x27c3: 0x02, 0x27c4: 0x03, 0x27c5: 0x04, 0x27c6: 0x05, 0x27c7: 0x06, - 0x27c8: 0x07, 0x27c9: 0x08, 0x27ca: 0x09, 0x27cb: 0x0a, 0x27cc: 0x0b, 0x27cd: 0x0c, 0x27ce: 0x0d, 0x27cf: 0x0e, - 0x27d0: 0x0f, 0x27d1: 0x10, 0x27d2: 0x11, 0x27d3: 0x12, 0x27d4: 0x13, 0x27d5: 0x14, 0x27d6: 0x15, 0x27d7: 0x16, - 0x27d8: 0x17, 0x27d9: 0x18, 0x27da: 0x19, 0x27db: 0x1a, 0x27dc: 0x1b, 0x27dd: 0x1c, 0x27de: 0x1d, 0x27df: 0x1e, - 0x27e0: 0x01, 0x27e1: 0x9c, 0x27e2: 0x03, 0x27e3: 0x04, 0x27e4: 0x05, - 0x27ea: 0x06, 0x27ed: 0x07, 0x27ef: 0x08, - 0x27f0: 0x13, 0x27f3: 0x15, - // Block 0xa0, offset 0x2800 - 0x2800: 0x3f, 0x2801: 0x40, 0x2802: 0x41, 0x2803: 0x42, 0x2804: 0x43, 0x2805: 0x44, 0x2806: 0x45, 0x2807: 0x46, - 0x2808: 0x47, 0x2809: 0x48, 0x280a: 0x49, 0x280b: 0x4a, 0x280c: 0x4b, 0x280d: 0x4c, 0x280e: 0x4d, 0x280f: 0x4e, - 0x2810: 0x4f, 0x2811: 0x50, 0x2812: 0x51, 0x2813: 0x52, 0x2814: 0x53, 0x2815: 0x54, 0x2816: 0x55, 0x2817: 0x56, - 0x2818: 0x57, 0x2819: 0x58, 0x281a: 0x59, 0x281b: 0x5a, 0x281c: 0x5b, 0x281d: 0x5c, 0x281e: 0x5d, 0x281f: 0x5e, - 0x2820: 0x5f, 0x2821: 0x60, 0x2822: 0x61, 0x2823: 0x62, 0x2824: 0x63, 0x2825: 0x64, 0x2826: 0x65, 0x2827: 0x66, - 0x2828: 0x67, 0x2829: 0x68, 0x282a: 0x69, 0x282c: 0x6a, 0x282d: 0x6b, 0x282e: 0x6c, 0x282f: 0x6d, - 0x2830: 0x6e, 0x2831: 0x6f, 0x2833: 0x70, 0x2834: 0x71, 0x2835: 0x72, 0x2836: 0x73, 0x2837: 0x74, - 0x2838: 0x75, 0x2839: 0x1f2, 0x283a: 0x597, 0x283b: 0x598, 0x283c: 0x79, 0x283d: 0x7a, 0x283e: 0x7b, 0x283f: 0x7c, - // Block 0xa1, offset 0x2840 - 0x2842: 0x01, 0x2843: 0x595, 0x2844: 0x03, 0x2845: 0x596, 0x2846: 0x05, 0x2847: 0x06, - 0x2848: 0x07, 0x2849: 0x08, 0x284a: 0x09, 0x284b: 0x0a, 0x284c: 0x0b, 0x284d: 0x0c, 0x284e: 0x0d, 0x284f: 0x0e, - 0x2850: 0x0f, 0x2851: 0x10, 0x2852: 0x11, 0x2853: 0x12, 0x2854: 0x13, 0x2855: 0x14, 0x2856: 0x15, 0x2857: 0x16, - 0x2858: 0x17, 0x2859: 0x18, 0x285a: 0x19, 0x285b: 0x1a, 0x285c: 0x1b, 0x285d: 0x1c, 0x285e: 0x1d, 0x285f: 0x1e, - 0x2860: 0x01, 0x2861: 0x9e, 0x2862: 0x03, 0x2863: 0x04, 0x2864: 0x05, - 0x286a: 0x06, 0x286d: 0x07, 0x286f: 0x08, - 0x2870: 0x13, 0x2873: 0x15, - // Block 0xa2, offset 0x2880 - 0x28a0: 0x1f, 0x28a1: 0x20, 0x28a2: 0x21, 0x28a3: 0x22, 0x28a4: 0x23, 0x28a5: 0x24, 0x28a6: 0x25, 0x28a7: 0x26, - 0x28a8: 0x27, 0x28a9: 0x28, 0x28aa: 0x29, 0x28ab: 0x2a, 0x28ac: 0x59b, 0x28ad: 0x59c, 0x28ae: 0x2d, 0x28af: 0x2e, - 0x28b0: 0x2f, 0x28b1: 0x30, 0x28b2: 0x31, 0x28b3: 0x32, 0x28b4: 0x33, 0x28b5: 0x34, 0x28b6: 0x35, 0x28b7: 0x36, - 0x28b8: 0x37, 0x28b9: 0x38, 0x28ba: 0x39, 0x28bb: 0x3a, 0x28bc: 0x3b, 0x28bd: 0x3c, 0x28be: 0x3d, 0x28bf: 0x3e, - // Block 0xa3, offset 0x28c0 - 0x28c2: 0x01, 0x28c3: 0x02, 0x28c4: 0x03, 0x28c5: 0x04, 0x28c6: 0x05, 0x28c7: 0x06, - 0x28c8: 0x07, 0x28c9: 0x08, 0x28ca: 0x09, 0x28cb: 0x0a, 0x28cc: 0x0b, 0x28cd: 0x0c, 0x28ce: 0x0d, 0x28cf: 0x0e, - 0x28d0: 0x0f, 0x28d1: 0x10, 0x28d2: 0x11, 0x28d3: 0x12, 0x28d4: 0x13, 0x28d5: 0x14, 0x28d6: 0x15, 0x28d7: 0x16, - 0x28d8: 0x17, 0x28d9: 0x18, 0x28da: 0x19, 0x28db: 0x1a, 0x28dc: 0x1b, 0x28dd: 0x1c, 0x28de: 0x1d, 0x28df: 0x1e, - 0x28e0: 0xa0, 0x28e1: 0x02, 0x28e2: 0x03, 0x28e3: 0x04, 0x28e4: 0x05, - 0x28ea: 0x06, 0x28ed: 0x07, 0x28ef: 0x08, - 0x28f0: 0x13, 0x28f3: 0x15, - // Block 0xa4, offset 0x2900 - 0x2920: 0x1f, 0x2921: 0x20, 0x2922: 0x21, 0x2923: 0x22, 0x2924: 0x23, 0x2925: 0x24, 0x2926: 0x25, 0x2927: 0x26, - 0x2928: 0x59d, 0x2929: 0x59e, 0x292a: 0x29, 0x292b: 0x2a, 0x292c: 0x2b, 0x292d: 0x2c, 0x292e: 0x2d, 0x292f: 0x2e, - 0x2930: 0x2f, 0x2931: 0x30, 0x2932: 0x31, 0x2933: 0x32, 0x2934: 0x33, 0x2935: 0x34, 0x2936: 0x35, 0x2937: 0x36, - 0x2938: 0x37, 0x2939: 0x38, 0x293a: 0x39, 0x293b: 0x3a, 0x293c: 0x3b, 0x293d: 0x3c, 0x293e: 0x3d, 0x293f: 0x3e, - // Block 0xa5, offset 0x2940 - 0x2942: 0x01, 0x2943: 0x02, 0x2944: 0x03, 0x2945: 0x04, 0x2946: 0x05, 0x2947: 0x06, - 0x2948: 0x07, 0x2949: 0x08, 0x294a: 0x09, 0x294b: 0x0a, 0x294c: 0x0b, 0x294d: 0x0c, 0x294e: 0x0d, 0x294f: 0x0e, - 0x2950: 0x0f, 0x2951: 0x10, 0x2952: 0x11, 0x2953: 0x12, 0x2954: 0x13, 0x2955: 0x14, 0x2956: 0x15, 0x2957: 0x16, - 0x2958: 0x17, 0x2959: 0x18, 0x295a: 0x19, 0x295b: 0x1a, 0x295c: 0x1b, 0x295d: 0x1c, 0x295e: 0x1d, 0x295f: 0x1e, - 0x2960: 0xa2, 0x2961: 0x02, 0x2962: 0x03, 0x2963: 0x04, 0x2964: 0x05, - 0x296a: 0x06, 0x296d: 0x07, 0x296f: 0x08, - 0x2970: 0x13, 0x2973: 0x15, - // Block 0xa6, offset 0x2980 - 0x2980: 0x3f, 0x2981: 0x40, 0x2982: 0x41, 0x2983: 0x42, 0x2984: 0x43, 0x2985: 0x44, 0x2986: 0x45, 0x2987: 0x46, - 0x2988: 0x47, 0x2989: 0x48, 0x298a: 0x49, 0x298b: 0x4a, 0x298c: 0x4b, 0x298d: 0x4c, 0x298e: 0x4d, 0x298f: 0x4e, - 0x2990: 0x4f, 0x2991: 0x50, 0x2992: 0x51, 0x2993: 0x52, 0x2994: 0x53, 0x2995: 0x54, 0x2996: 0x55, 0x2997: 0x56, - 0x2998: 0x57, 0x2999: 0x58, 0x299a: 0x59, 0x299b: 0x5a, 0x299c: 0x5b, 0x299d: 0x5c, 0x299e: 0x5d, 0x299f: 0x5e, - 0x29a0: 0x5f, 0x29a1: 0x60, 0x29a2: 0x61, 0x29a3: 0x62, 0x29a4: 0x63, 0x29a5: 0x64, 0x29a6: 0x65, 0x29a7: 0x66, - 0x29a8: 0x67, 0x29a9: 0x68, 0x29aa: 0x69, 0x29ac: 0x6a, 0x29ad: 0x6b, 0x29ae: 0x6c, 0x29af: 0x6d, - 0x29b0: 0x6e, 0x29b1: 0x6f, 0x29b3: 0x70, 0x29b4: 0x71, 0x29b5: 0x72, 0x29b6: 0x73, 0x29b7: 0x74, - 0x29b8: 0x5a4, 0x29b9: 0x5a5, 0x29ba: 0x77, 0x29bb: 0x5a6, 0x29bc: 0x79, 0x29bd: 0x7a, 0x29be: 0x7b, 0x29bf: 0x7c, - // Block 0xa7, offset 0x29c0 - 0x29c2: 0x01, 0x29c3: 0x5a1, 0x29c4: 0x5a2, 0x29c5: 0x5a3, 0x29c6: 0x05, 0x29c7: 0x06, - 0x29c8: 0x07, 0x29c9: 0x08, 0x29ca: 0x09, 0x29cb: 0x0a, 0x29cc: 0x0b, 0x29cd: 0x0c, 0x29ce: 0x0d, 0x29cf: 0x0e, - 0x29d0: 0x0f, 0x29d1: 0x10, 0x29d2: 0x11, 0x29d3: 0x12, 0x29d4: 0x13, 0x29d5: 0x14, 0x29d6: 0x15, 0x29d7: 0x16, - 0x29d8: 0x17, 0x29d9: 0x18, 0x29da: 0x19, 0x29db: 0x1a, 0x29dc: 0x1b, 0x29dd: 0x1c, 0x29de: 0x1d, 0x29df: 0x1e, - 0x29e0: 0x01, 0x29e1: 0xa4, 0x29e2: 0x03, 0x29e3: 0x04, 0x29e4: 0x05, - 0x29ea: 0x06, 0x29ed: 0x07, 0x29ef: 0x08, - 0x29f0: 0x13, 0x29f3: 0x15, - // Block 0xa8, offset 0x2a00 - 0x2a00: 0x5ab, 0x2a01: 0x7e, 0x2a02: 0x7f, 0x2a03: 0x80, 0x2a04: 0x81, 0x2a05: 0x82, 0x2a06: 0x83, 0x2a07: 0x84, - 0x2a08: 0x85, 0x2a09: 0x86, 0x2a0a: 0x87, 0x2a0b: 0x88, 0x2a0c: 0x89, 0x2a0d: 0x8a, 0x2a0e: 0x8b, 0x2a0f: 0x8c, - 0x2a10: 0x8d, 0x2a11: 0x8e, 0x2a12: 0x8f, 0x2a13: 0x90, 0x2a14: 0x91, 0x2a15: 0x92, 0x2a16: 0x93, 0x2a17: 0x94, - 0x2a18: 0x95, 0x2a19: 0x96, 0x2a1a: 0x97, 0x2a1b: 0x98, 0x2a1c: 0x99, 0x2a1d: 0x9a, 0x2a1e: 0x9b, 0x2a1f: 0x9c, - 0x2a20: 0x9d, 0x2a21: 0x9e, 0x2a22: 0x9f, 0x2a23: 0xa0, 0x2a24: 0xa1, 0x2a25: 0xa2, 0x2a26: 0xa3, 0x2a27: 0xa4, - 0x2a28: 0xa5, 0x2a29: 0xa6, 0x2a2a: 0xa7, 0x2a2b: 0xa8, 0x2a2c: 0xa9, 0x2a2d: 0xaa, - 0x2a30: 0xab, 0x2a31: 0xac, 0x2a32: 0xad, 0x2a33: 0xae, 0x2a34: 0xaf, 0x2a35: 0xb0, 0x2a36: 0xb1, 0x2a37: 0xb2, - 0x2a38: 0xb3, 0x2a3a: 0xb4, 0x2a3b: 0xb5, 0x2a3c: 0xb6, 0x2a3d: 0xb7, 0x2a3e: 0xb8, 0x2a3f: 0xb9, - // Block 0xa9, offset 0x2a40 - 0x2a64: 0xfb, 0x2a65: 0xfc, 0x2a66: 0xfd, 0x2a67: 0xfe, - 0x2a68: 0xff, 0x2a69: 0x100, 0x2a6a: 0x101, 0x2a6b: 0x102, 0x2a6c: 0x103, 0x2a6d: 0x104, 0x2a6e: 0x252, 0x2a6f: 0x5ac, - 0x2a70: 0x253, 0x2a71: 0x5ad, 0x2a72: 0x5ae, 0x2a73: 0x5af, 0x2a74: 0x5b0, 0x2a75: 0x10c, 0x2a76: 0x10d, 0x2a77: 0x10e, - 0x2a78: 0x10f, 0x2a79: 0x110, 0x2a7a: 0x111, 0x2a7b: 0x112, 0x2a7c: 0x113, 0x2a7d: 0x114, 0x2a7e: 0x115, 0x2a7f: 0x116, - // Block 0xaa, offset 0x2a80 - 0x2a82: 0x01, 0x2a83: 0x02, 0x2a84: 0x03, 0x2a85: 0x04, 0x2a86: 0x05, 0x2a87: 0x06, - 0x2a88: 0x07, 0x2a89: 0x08, 0x2a8a: 0x09, 0x2a8b: 0x0a, 0x2a8c: 0x0b, 0x2a8d: 0x0c, 0x2a8e: 0x0d, 0x2a8f: 0x0e, - 0x2a90: 0x0f, 0x2a91: 0x10, 0x2a92: 0x11, 0x2a93: 0x12, 0x2a94: 0x13, 0x2a95: 0x14, 0x2a96: 0x15, 0x2a97: 0x16, - 0x2a98: 0x5a7, 0x2a99: 0x5a8, 0x2a9a: 0x5a9, 0x2a9b: 0x5aa, 0x2a9c: 0x1b, 0x2a9d: 0x1c, 0x2a9e: 0x1d, 0x2a9f: 0x1e, - 0x2aa0: 0x01, 0x2aa1: 0x02, 0x2aa2: 0xa6, 0x2aa3: 0x04, 0x2aa4: 0x05, - 0x2aaa: 0x06, 0x2aad: 0x07, 0x2aaf: 0xa7, - 0x2ab0: 0x13, 0x2ab3: 0x15, - // Block 0xab, offset 0x2ac0 - 0x2ac0: 0x3f, 0x2ac1: 0x40, 0x2ac2: 0x41, 0x2ac3: 0x42, 0x2ac4: 0x43, 0x2ac5: 0x44, 0x2ac6: 0x45, 0x2ac7: 0x46, - 0x2ac8: 0x47, 0x2ac9: 0x48, 0x2aca: 0x49, 0x2acb: 0x4a, 0x2acc: 0x4b, 0x2acd: 0x4c, 0x2ace: 0x4d, 0x2acf: 0x4e, - 0x2ad0: 0x4f, 0x2ad1: 0x50, 0x2ad2: 0x51, 0x2ad3: 0x52, 0x2ad4: 0x53, 0x2ad5: 0x54, 0x2ad6: 0x55, 0x2ad7: 0x56, - 0x2ad8: 0x57, 0x2ad9: 0x58, 0x2ada: 0x59, 0x2adb: 0x5a, 0x2adc: 0x5b, 0x2add: 0x5c, 0x2ade: 0x5d, 0x2adf: 0x5e, - 0x2ae0: 0x5f, 0x2ae1: 0x60, 0x2ae2: 0x61, 0x2ae3: 0x62, 0x2ae4: 0x63, 0x2ae5: 0x64, 0x2ae6: 0x65, 0x2ae7: 0x66, - 0x2ae8: 0x67, 0x2ae9: 0x68, 0x2aea: 0x69, 0x2aec: 0x6a, 0x2aed: 0x6b, 0x2aee: 0x6c, 0x2aef: 0x6d, - 0x2af0: 0x6e, 0x2af1: 0x6f, 0x2af3: 0x70, 0x2af4: 0x71, 0x2af5: 0x72, 0x2af6: 0x73, 0x2af7: 0x74, - 0x2af8: 0x75, 0x2af9: 0x76, 0x2afa: 0x5b7, 0x2afb: 0x78, 0x2afc: 0x79, 0x2afd: 0x7a, 0x2afe: 0x7b, 0x2aff: 0x7c, - // Block 0xac, offset 0x2b00 - 0x2b02: 0x01, 0x2b03: 0x5b3, 0x2b04: 0x5b4, 0x2b05: 0x5b5, 0x2b06: 0x05, 0x2b07: 0x06, - 0x2b08: 0x5b6, 0x2b09: 0x08, 0x2b0a: 0x09, 0x2b0b: 0x0a, 0x2b0c: 0x0b, 0x2b0d: 0x0c, 0x2b0e: 0x0d, 0x2b0f: 0x0e, - 0x2b10: 0x0f, 0x2b11: 0x10, 0x2b12: 0x11, 0x2b13: 0x12, 0x2b14: 0x13, 0x2b15: 0x14, 0x2b16: 0x15, 0x2b17: 0x16, - 0x2b18: 0x17, 0x2b19: 0x18, 0x2b1a: 0x19, 0x2b1b: 0x1a, 0x2b1c: 0x1b, 0x2b1d: 0x1c, 0x2b1e: 0x1d, 0x2b1f: 0x1e, - 0x2b20: 0x01, 0x2b21: 0xa9, 0x2b22: 0x03, 0x2b23: 0x04, 0x2b24: 0x05, - 0x2b2a: 0x06, 0x2b2d: 0x07, 0x2b2f: 0x08, - 0x2b30: 0x13, 0x2b33: 0x15, - // Block 0xad, offset 0x2b40 - 0x2b40: 0x3f, 0x2b41: 0x40, 0x2b42: 0x41, 0x2b43: 0x42, 0x2b44: 0x43, 0x2b45: 0x44, 0x2b46: 0x45, 0x2b47: 0x46, - 0x2b48: 0x47, 0x2b49: 0x48, 0x2b4a: 0x49, 0x2b4b: 0x4a, 0x2b4c: 0x4b, 0x2b4d: 0x4c, 0x2b4e: 0x4d, 0x2b4f: 0x4e, - 0x2b50: 0x4f, 0x2b51: 0x50, 0x2b52: 0x51, 0x2b53: 0x52, 0x2b54: 0x53, 0x2b55: 0x54, 0x2b56: 0x55, 0x2b57: 0x56, - 0x2b58: 0x57, 0x2b59: 0x58, 0x2b5a: 0x59, 0x2b5b: 0x5a, 0x2b5c: 0x5b, 0x2b5d: 0x5c, 0x2b5e: 0x5d, 0x2b5f: 0x5e, - 0x2b60: 0x5f, 0x2b61: 0x60, 0x2b62: 0x61, 0x2b63: 0x62, 0x2b64: 0x63, 0x2b65: 0x64, 0x2b66: 0x65, 0x2b67: 0x66, - 0x2b68: 0x67, 0x2b69: 0x68, 0x2b6a: 0x69, 0x2b6c: 0x6a, 0x2b6d: 0x6b, 0x2b6e: 0x6c, 0x2b6f: 0x6d, - 0x2b70: 0x6e, 0x2b71: 0x6f, 0x2b73: 0x70, 0x2b74: 0x71, 0x2b75: 0x72, 0x2b76: 0x1fc, 0x2b77: 0x74, - 0x2b78: 0x75, 0x2b79: 0x5c1, 0x2b7a: 0x5c2, 0x2b7b: 0x5c3, 0x2b7c: 0x79, 0x2b7d: 0x7a, 0x2b7e: 0x7b, 0x2b7f: 0x7c, - // Block 0xae, offset 0x2b80 - 0x2b82: 0x01, 0x2b83: 0x5ba, 0x2b84: 0x5bb, 0x2b85: 0x5bc, 0x2b86: 0x5bd, 0x2b87: 0x5be, - 0x2b88: 0x5bf, 0x2b89: 0x08, 0x2b8a: 0x5c0, 0x2b8b: 0x0a, 0x2b8c: 0x0b, 0x2b8d: 0x0c, 0x2b8e: 0x0d, 0x2b8f: 0x0e, - 0x2b90: 0x0f, 0x2b91: 0x10, 0x2b92: 0x11, 0x2b93: 0x12, 0x2b94: 0x13, 0x2b95: 0x14, 0x2b96: 0x15, 0x2b97: 0x16, - 0x2b98: 0x17, 0x2b99: 0x18, 0x2b9a: 0x19, 0x2b9b: 0x1a, 0x2b9c: 0x1b, 0x2b9d: 0x1c, 0x2b9e: 0x1d, 0x2b9f: 0x1e, - 0x2ba0: 0x01, 0x2ba1: 0xab, 0x2ba2: 0x4e, 0x2ba3: 0x04, 0x2ba4: 0x05, - 0x2baa: 0x06, 0x2bad: 0x07, 0x2baf: 0x08, - 0x2bb0: 0x13, 0x2bb3: 0x15, - // Block 0xaf, offset 0x2bc0 - 0x2be0: 0x1f, 0x2be1: 0x20, 0x2be2: 0x21, 0x2be3: 0x22, 0x2be4: 0x23, 0x2be5: 0x24, 0x2be6: 0x25, 0x2be7: 0x26, - 0x2be8: 0x27, 0x2be9: 0x28, 0x2bea: 0x29, 0x2beb: 0x2a, 0x2bec: 0x2b, 0x2bed: 0x2c, 0x2bee: 0x2d, 0x2bef: 0x2e, - 0x2bf0: 0x2f, 0x2bf1: 0x30, 0x2bf2: 0x31, 0x2bf3: 0x32, 0x2bf4: 0x33, 0x2bf5: 0x34, 0x2bf6: 0x5c4, 0x2bf7: 0x36, - 0x2bf8: 0x37, 0x2bf9: 0x38, 0x2bfa: 0x39, 0x2bfb: 0x3a, 0x2bfc: 0x3b, 0x2bfd: 0x3c, 0x2bfe: 0x3d, 0x2bff: 0x3e, - // Block 0xb0, offset 0x2c00 - 0x2c02: 0x01, 0x2c03: 0x02, 0x2c04: 0x03, 0x2c05: 0x04, 0x2c06: 0x05, 0x2c07: 0x06, - 0x2c08: 0x07, 0x2c09: 0x08, 0x2c0a: 0x09, 0x2c0b: 0x0a, 0x2c0c: 0x0b, 0x2c0d: 0x0c, 0x2c0e: 0x0d, 0x2c0f: 0x0e, - 0x2c10: 0x0f, 0x2c11: 0x10, 0x2c12: 0x11, 0x2c13: 0x12, 0x2c14: 0x13, 0x2c15: 0x14, 0x2c16: 0x15, 0x2c17: 0x16, - 0x2c18: 0x17, 0x2c19: 0x18, 0x2c1a: 0x19, 0x2c1b: 0x1a, 0x2c1c: 0x1b, 0x2c1d: 0x1c, 0x2c1e: 0x1d, 0x2c1f: 0x1e, - 0x2c20: 0xad, 0x2c21: 0x02, 0x2c22: 0x03, 0x2c23: 0x04, 0x2c24: 0x05, - 0x2c2a: 0x06, 0x2c2d: 0x07, 0x2c2f: 0x08, - 0x2c30: 0x13, 0x2c33: 0x15, - // Block 0xb1, offset 0x2c40 - 0x2c40: 0x3f, 0x2c41: 0x40, 0x2c42: 0x41, 0x2c43: 0x42, 0x2c44: 0x43, 0x2c45: 0x44, 0x2c46: 0x45, 0x2c47: 0x46, - 0x2c48: 0x47, 0x2c49: 0x48, 0x2c4a: 0x49, 0x2c4b: 0x4a, 0x2c4c: 0x4b, 0x2c4d: 0x4c, 0x2c4e: 0x4d, 0x2c4f: 0x4e, - 0x2c50: 0x4f, 0x2c51: 0x50, 0x2c52: 0x51, 0x2c53: 0x52, 0x2c54: 0x53, 0x2c55: 0x54, 0x2c56: 0x55, 0x2c57: 0x56, - 0x2c58: 0x57, 0x2c59: 0x58, 0x2c5a: 0x59, 0x2c5b: 0x5a, 0x2c5c: 0x5b, 0x2c5d: 0x5c, 0x2c5e: 0x5d, 0x2c5f: 0x5e, - 0x2c60: 0x5f, 0x2c61: 0x60, 0x2c62: 0x61, 0x2c63: 0x62, 0x2c64: 0x63, 0x2c65: 0x64, 0x2c66: 0x65, 0x2c67: 0x66, - 0x2c68: 0x67, 0x2c69: 0x68, 0x2c6a: 0x69, 0x2c6c: 0x6a, 0x2c6d: 0x6b, 0x2c6e: 0x6c, 0x2c6f: 0x6d, - 0x2c70: 0x6e, 0x2c71: 0x6f, 0x2c73: 0x70, 0x2c74: 0x71, 0x2c75: 0x72, 0x2c76: 0x73, 0x2c77: 0x74, - 0x2c78: 0x75, 0x2c79: 0x1f2, 0x2c7a: 0x77, 0x2c7b: 0x5c9, 0x2c7c: 0x79, 0x2c7d: 0x7a, 0x2c7e: 0x7b, 0x2c7f: 0x7c, - // Block 0xb2, offset 0x2c80 - 0x2c82: 0x01, 0x2c83: 0x5c7, 0x2c84: 0x1f0, 0x2c85: 0x1f1, 0x2c86: 0x05, 0x2c87: 0x5c8, - 0x2c88: 0x07, 0x2c89: 0x08, 0x2c8a: 0x09, 0x2c8b: 0x0a, 0x2c8c: 0x0b, 0x2c8d: 0x0c, 0x2c8e: 0x0d, 0x2c8f: 0x0e, - 0x2c90: 0x0f, 0x2c91: 0x10, 0x2c92: 0x11, 0x2c93: 0x12, 0x2c94: 0x13, 0x2c95: 0x14, 0x2c96: 0x15, 0x2c97: 0x16, - 0x2c98: 0x17, 0x2c99: 0x18, 0x2c9a: 0x19, 0x2c9b: 0x1a, 0x2c9c: 0x1b, 0x2c9d: 0x1c, 0x2c9e: 0x1d, 0x2c9f: 0x1e, - 0x2ca0: 0x01, 0x2ca1: 0xaf, 0x2ca2: 0x03, 0x2ca3: 0x04, 0x2ca4: 0x05, - 0x2caa: 0x06, 0x2cad: 0x07, 0x2caf: 0x08, - 0x2cb0: 0x13, 0x2cb3: 0x15, - // Block 0xb3, offset 0x2cc0 - 0x2cc2: 0x01, 0x2cc3: 0x02, 0x2cc4: 0x5cc, 0x2cc5: 0x292, 0x2cc6: 0x05, 0x2cc7: 0x06, - 0x2cc8: 0x07, 0x2cc9: 0x08, 0x2cca: 0x09, 0x2ccb: 0x0a, 0x2ccc: 0x0b, 0x2ccd: 0x0c, 0x2cce: 0x0d, 0x2ccf: 0x0e, - 0x2cd0: 0x0f, 0x2cd1: 0x10, 0x2cd2: 0x11, 0x2cd3: 0x12, 0x2cd4: 0x13, 0x2cd5: 0x14, 0x2cd6: 0x15, 0x2cd7: 0x16, - 0x2cd8: 0x17, 0x2cd9: 0x18, 0x2cda: 0x19, 0x2cdb: 0x1a, 0x2cdc: 0x1b, 0x2cdd: 0x1c, 0x2cde: 0x1d, 0x2cdf: 0x1e, - 0x2ce0: 0x01, 0x2ce1: 0x63, 0x2ce2: 0x03, 0x2ce3: 0x04, 0x2ce4: 0x05, - 0x2cea: 0x06, 0x2ced: 0x07, 0x2cef: 0x08, - 0x2cf0: 0x13, 0x2cf3: 0x15, - // Block 0xb4, offset 0x2d00 - 0x2d00: 0x3f, 0x2d01: 0x40, 0x2d02: 0x41, 0x2d03: 0x42, 0x2d04: 0x43, 0x2d05: 0x44, 0x2d06: 0x45, 0x2d07: 0x46, - 0x2d08: 0x47, 0x2d09: 0x48, 0x2d0a: 0x49, 0x2d0b: 0x4a, 0x2d0c: 0x4b, 0x2d0d: 0x4c, 0x2d0e: 0x4d, 0x2d0f: 0x4e, - 0x2d10: 0x4f, 0x2d11: 0x50, 0x2d12: 0x51, 0x2d13: 0x52, 0x2d14: 0x53, 0x2d15: 0x54, 0x2d16: 0x55, 0x2d17: 0x56, - 0x2d18: 0x57, 0x2d19: 0x58, 0x2d1a: 0x59, 0x2d1b: 0x5a, 0x2d1c: 0x5b, 0x2d1d: 0x5c, 0x2d1e: 0x5d, 0x2d1f: 0x5e, - 0x2d20: 0x5f, 0x2d21: 0x60, 0x2d22: 0x61, 0x2d23: 0x62, 0x2d24: 0x63, 0x2d25: 0x64, 0x2d26: 0x65, 0x2d27: 0x66, - 0x2d28: 0x67, 0x2d29: 0x68, 0x2d2a: 0x69, 0x2d2c: 0x6a, 0x2d2d: 0x6b, 0x2d2e: 0x6c, 0x2d2f: 0x6d, - 0x2d30: 0x6e, 0x2d31: 0x6f, 0x2d33: 0x70, 0x2d34: 0x71, 0x2d35: 0x72, 0x2d36: 0x73, 0x2d37: 0x74, - 0x2d38: 0x5d0, 0x2d39: 0x76, 0x2d3a: 0x77, 0x2d3b: 0x78, 0x2d3c: 0x79, 0x2d3d: 0x7a, 0x2d3e: 0x7b, 0x2d3f: 0x7c, - // Block 0xb5, offset 0x2d40 - 0x2d42: 0x01, 0x2d43: 0x5cf, 0x2d44: 0x03, 0x2d45: 0x04, 0x2d46: 0x05, 0x2d47: 0x06, - 0x2d48: 0x07, 0x2d49: 0x08, 0x2d4a: 0x09, 0x2d4b: 0x0a, 0x2d4c: 0x0b, 0x2d4d: 0x0c, 0x2d4e: 0x0d, 0x2d4f: 0x0e, - 0x2d50: 0x0f, 0x2d51: 0x10, 0x2d52: 0x11, 0x2d53: 0x12, 0x2d54: 0x13, 0x2d55: 0x14, 0x2d56: 0x15, 0x2d57: 0x16, - 0x2d58: 0x17, 0x2d59: 0x18, 0x2d5a: 0x19, 0x2d5b: 0x1a, 0x2d5c: 0x1b, 0x2d5d: 0x1c, 0x2d5e: 0x1d, 0x2d5f: 0x1e, - 0x2d60: 0x01, 0x2d61: 0xb2, 0x2d62: 0x03, 0x2d63: 0x04, 0x2d64: 0x05, - 0x2d6a: 0x06, 0x2d6d: 0x07, 0x2d6f: 0x08, - 0x2d70: 0x13, 0x2d73: 0x15, - // Block 0xb6, offset 0x2d80 - 0x2d80: 0x3f, 0x2d81: 0x40, 0x2d82: 0x41, 0x2d83: 0x42, 0x2d84: 0x43, 0x2d85: 0x44, 0x2d86: 0x45, 0x2d87: 0x46, - 0x2d88: 0x47, 0x2d89: 0x48, 0x2d8a: 0x49, 0x2d8b: 0x4a, 0x2d8c: 0x4b, 0x2d8d: 0x4c, 0x2d8e: 0x4d, 0x2d8f: 0x4e, - 0x2d90: 0x4f, 0x2d91: 0x50, 0x2d92: 0x51, 0x2d93: 0x52, 0x2d94: 0x53, 0x2d95: 0x54, 0x2d96: 0x55, 0x2d97: 0x56, - 0x2d98: 0x57, 0x2d99: 0x58, 0x2d9a: 0x59, 0x2d9b: 0x5a, 0x2d9c: 0x5b, 0x2d9d: 0x5c, 0x2d9e: 0x5d, 0x2d9f: 0x5e, - 0x2da0: 0x5f, 0x2da1: 0x60, 0x2da2: 0x61, 0x2da3: 0x62, 0x2da4: 0x63, 0x2da5: 0x64, 0x2da6: 0x65, 0x2da7: 0x66, - 0x2da8: 0x67, 0x2da9: 0x68, 0x2daa: 0x69, 0x2dac: 0x6a, 0x2dad: 0x6b, 0x2dae: 0x6c, 0x2daf: 0x6d, - 0x2db0: 0x6e, 0x2db1: 0x6f, 0x2db3: 0x70, 0x2db4: 0x71, 0x2db5: 0x72, 0x2db6: 0x1fc, 0x2db7: 0x74, - 0x2db8: 0x75, 0x2db9: 0x261, 0x2dba: 0x77, 0x2dbb: 0x5d6, 0x2dbc: 0x79, 0x2dbd: 0x7a, 0x2dbe: 0x7b, 0x2dbf: 0x7c, - // Block 0xb7, offset 0x2dc0 - 0x2dc2: 0x01, 0x2dc3: 0x5d3, 0x2dc4: 0x5d4, 0x2dc5: 0x5d5, 0x2dc6: 0x05, 0x2dc7: 0x268, - 0x2dc8: 0x25f, 0x2dc9: 0x08, 0x2dca: 0x09, 0x2dcb: 0x0a, 0x2dcc: 0x0b, 0x2dcd: 0x0c, 0x2dce: 0x0d, 0x2dcf: 0x0e, - 0x2dd0: 0x0f, 0x2dd1: 0x10, 0x2dd2: 0x11, 0x2dd3: 0x12, 0x2dd4: 0x13, 0x2dd5: 0x14, 0x2dd6: 0x15, 0x2dd7: 0x16, - 0x2dd8: 0x17, 0x2dd9: 0x18, 0x2dda: 0x19, 0x2ddb: 0x1a, 0x2ddc: 0x1b, 0x2ddd: 0x1c, 0x2dde: 0x1d, 0x2ddf: 0x1e, - 0x2de0: 0x01, 0x2de1: 0xb4, 0x2de2: 0x4e, 0x2de3: 0x04, 0x2de4: 0x05, - 0x2dea: 0x06, 0x2ded: 0x07, 0x2def: 0x08, - 0x2df0: 0x13, 0x2df3: 0x15, - // Block 0xb8, offset 0x2e00 - 0x2e00: 0x3f, 0x2e01: 0x40, 0x2e02: 0x41, 0x2e03: 0x42, 0x2e04: 0x43, 0x2e05: 0x44, 0x2e06: 0x45, 0x2e07: 0x46, - 0x2e08: 0x47, 0x2e09: 0x48, 0x2e0a: 0x49, 0x2e0b: 0x4a, 0x2e0c: 0x4b, 0x2e0d: 0x4c, 0x2e0e: 0x4d, 0x2e0f: 0x4e, - 0x2e10: 0x4f, 0x2e11: 0x50, 0x2e12: 0x51, 0x2e13: 0x52, 0x2e14: 0x53, 0x2e15: 0x54, 0x2e16: 0x55, 0x2e17: 0x56, - 0x2e18: 0x57, 0x2e19: 0x58, 0x2e1a: 0x59, 0x2e1b: 0x5a, 0x2e1c: 0x5b, 0x2e1d: 0x5c, 0x2e1e: 0x5d, 0x2e1f: 0x5e, - 0x2e20: 0x5f, 0x2e21: 0x60, 0x2e22: 0x61, 0x2e23: 0x62, 0x2e24: 0x63, 0x2e25: 0x64, 0x2e26: 0x65, 0x2e27: 0x66, - 0x2e28: 0x67, 0x2e29: 0x68, 0x2e2a: 0x69, 0x2e2c: 0x6a, 0x2e2d: 0x6b, 0x2e2e: 0x6c, 0x2e2f: 0x6d, - 0x2e30: 0x6e, 0x2e31: 0x6f, 0x2e33: 0x70, 0x2e34: 0x71, 0x2e35: 0x72, 0x2e36: 0x1fc, 0x2e37: 0x74, - 0x2e38: 0x75, 0x2e39: 0x5da, 0x2e3a: 0x26b, 0x2e3b: 0x5d6, 0x2e3c: 0x79, 0x2e3d: 0x7a, 0x2e3e: 0x7b, 0x2e3f: 0x7c, - // Block 0xb9, offset 0x2e40 - 0x2e42: 0x01, 0x2e43: 0x5d3, 0x2e44: 0x5d4, 0x2e45: 0x5d9, 0x2e46: 0x05, 0x2e47: 0x268, - 0x2e48: 0x25f, 0x2e49: 0x08, 0x2e4a: 0x09, 0x2e4b: 0x0a, 0x2e4c: 0x0b, 0x2e4d: 0x0c, 0x2e4e: 0x0d, 0x2e4f: 0x0e, - 0x2e50: 0x0f, 0x2e51: 0x10, 0x2e52: 0x11, 0x2e53: 0x12, 0x2e54: 0x13, 0x2e55: 0x14, 0x2e56: 0x15, 0x2e57: 0x16, - 0x2e58: 0x17, 0x2e59: 0x18, 0x2e5a: 0x19, 0x2e5b: 0x1a, 0x2e5c: 0x1b, 0x2e5d: 0x1c, 0x2e5e: 0x1d, 0x2e5f: 0x1e, - 0x2e60: 0x01, 0x2e61: 0xb6, 0x2e62: 0x51, 0x2e63: 0x52, 0x2e64: 0x05, - 0x2e6a: 0x06, 0x2e6d: 0x07, 0x2e6f: 0x08, - 0x2e70: 0x54, 0x2e73: 0x15, - // Block 0xba, offset 0x2e80 - 0x2ea0: 0x1f, 0x2ea1: 0x20, 0x2ea2: 0x21, 0x2ea3: 0x22, 0x2ea4: 0x23, 0x2ea5: 0x24, 0x2ea6: 0x25, 0x2ea7: 0x26, - 0x2ea8: 0x27, 0x2ea9: 0x28, 0x2eaa: 0x29, 0x2eab: 0x2a, 0x2eac: 0x2b, 0x2ead: 0x2c, 0x2eae: 0x5db, 0x2eaf: 0x2e, - 0x2eb0: 0x2f, 0x2eb1: 0x30, 0x2eb2: 0x31, 0x2eb3: 0x32, 0x2eb4: 0x33, 0x2eb5: 0x34, 0x2eb6: 0x35, 0x2eb7: 0x36, - 0x2eb8: 0x37, 0x2eb9: 0x38, 0x2eba: 0x39, 0x2ebb: 0x3a, 0x2ebc: 0x3b, 0x2ebd: 0x3c, 0x2ebe: 0x3d, 0x2ebf: 0x3e, - // Block 0xbb, offset 0x2ec0 - 0x2ec2: 0x01, 0x2ec3: 0x02, 0x2ec4: 0x03, 0x2ec5: 0x04, 0x2ec6: 0x05, 0x2ec7: 0x06, - 0x2ec8: 0x07, 0x2ec9: 0x08, 0x2eca: 0x09, 0x2ecb: 0x0a, 0x2ecc: 0x0b, 0x2ecd: 0x0c, 0x2ece: 0x0d, 0x2ecf: 0x0e, - 0x2ed0: 0x0f, 0x2ed1: 0x10, 0x2ed2: 0x11, 0x2ed3: 0x12, 0x2ed4: 0x13, 0x2ed5: 0x14, 0x2ed6: 0x15, 0x2ed7: 0x16, - 0x2ed8: 0x17, 0x2ed9: 0x18, 0x2eda: 0x19, 0x2edb: 0x1a, 0x2edc: 0x1b, 0x2edd: 0x1c, 0x2ede: 0x1d, 0x2edf: 0x1e, - 0x2ee0: 0xb8, 0x2ee1: 0x02, 0x2ee2: 0x03, 0x2ee3: 0x04, 0x2ee4: 0x05, - 0x2eea: 0x06, 0x2eed: 0x07, 0x2eef: 0x08, - 0x2ef0: 0x13, 0x2ef3: 0x15, - // Block 0xbc, offset 0x2f00 - 0x2f20: 0x1f, 0x2f21: 0x20, 0x2f22: 0x21, 0x2f23: 0x22, 0x2f24: 0x23, 0x2f25: 0x24, 0x2f26: 0x25, 0x2f27: 0x26, - 0x2f28: 0x27, 0x2f29: 0x28, 0x2f2a: 0x29, 0x2f2b: 0x2a, 0x2f2c: 0x2b, 0x2f2d: 0x2c, 0x2f2e: 0x2d, 0x2f2f: 0x2e, - 0x2f30: 0x5dc, 0x2f31: 0x30, 0x2f32: 0x31, 0x2f33: 0x32, 0x2f34: 0x33, 0x2f35: 0x34, 0x2f36: 0x35, 0x2f37: 0x36, - 0x2f38: 0x37, 0x2f39: 0x38, 0x2f3a: 0x39, 0x2f3b: 0x3a, 0x2f3c: 0x3b, 0x2f3d: 0x3c, 0x2f3e: 0x3d, 0x2f3f: 0x3e, - // Block 0xbd, offset 0x2f40 - 0x2f42: 0x01, 0x2f43: 0x02, 0x2f44: 0x03, 0x2f45: 0x04, 0x2f46: 0x05, 0x2f47: 0x06, - 0x2f48: 0x07, 0x2f49: 0x08, 0x2f4a: 0x09, 0x2f4b: 0x0a, 0x2f4c: 0x0b, 0x2f4d: 0x0c, 0x2f4e: 0x0d, 0x2f4f: 0x0e, - 0x2f50: 0x0f, 0x2f51: 0x10, 0x2f52: 0x11, 0x2f53: 0x12, 0x2f54: 0x13, 0x2f55: 0x14, 0x2f56: 0x15, 0x2f57: 0x16, - 0x2f58: 0x17, 0x2f59: 0x18, 0x2f5a: 0x19, 0x2f5b: 0x1a, 0x2f5c: 0x1b, 0x2f5d: 0x1c, 0x2f5e: 0x1d, 0x2f5f: 0x1e, - 0x2f60: 0xba, 0x2f61: 0x02, 0x2f62: 0x03, 0x2f63: 0x04, 0x2f64: 0x05, - 0x2f6a: 0x06, 0x2f6d: 0x07, 0x2f6f: 0x08, - 0x2f70: 0x13, 0x2f73: 0x15, - // Block 0xbe, offset 0x2f80 - 0x2fa0: 0x1f, 0x2fa1: 0x20, 0x2fa2: 0x21, 0x2fa3: 0x22, 0x2fa4: 0x23, 0x2fa5: 0x24, 0x2fa6: 0x25, 0x2fa7: 0x26, - 0x2fa8: 0x27, 0x2fa9: 0x28, 0x2faa: 0x29, 0x2fab: 0x2a, 0x2fac: 0x2b, 0x2fad: 0x2c, 0x2fae: 0x2d, 0x2faf: 0x2e, - 0x2fb0: 0x2f, 0x2fb1: 0x30, 0x2fb2: 0x31, 0x2fb3: 0x32, 0x2fb4: 0x33, 0x2fb5: 0x34, 0x2fb6: 0x35, 0x2fb7: 0x36, - 0x2fb8: 0x5dd, 0x2fb9: 0x5de, 0x2fba: 0x39, 0x2fbb: 0x3a, 0x2fbc: 0x3b, 0x2fbd: 0x3c, 0x2fbe: 0x3d, 0x2fbf: 0x3e, - // Block 0xbf, offset 0x2fc0 - 0x2fc2: 0x01, 0x2fc3: 0x02, 0x2fc4: 0x03, 0x2fc5: 0x04, 0x2fc6: 0x05, 0x2fc7: 0x06, - 0x2fc8: 0x07, 0x2fc9: 0x08, 0x2fca: 0x09, 0x2fcb: 0x0a, 0x2fcc: 0x0b, 0x2fcd: 0x0c, 0x2fce: 0x0d, 0x2fcf: 0x0e, - 0x2fd0: 0x0f, 0x2fd1: 0x10, 0x2fd2: 0x11, 0x2fd3: 0x12, 0x2fd4: 0x13, 0x2fd5: 0x14, 0x2fd6: 0x15, 0x2fd7: 0x16, - 0x2fd8: 0x17, 0x2fd9: 0x18, 0x2fda: 0x19, 0x2fdb: 0x1a, 0x2fdc: 0x1b, 0x2fdd: 0x1c, 0x2fde: 0x1d, 0x2fdf: 0x1e, - 0x2fe0: 0xbc, 0x2fe1: 0x02, 0x2fe2: 0x03, 0x2fe3: 0x04, 0x2fe4: 0x05, - 0x2fea: 0x06, 0x2fed: 0x07, 0x2fef: 0x08, - 0x2ff0: 0x13, 0x2ff3: 0x15, - // Block 0xc0, offset 0x3000 - 0x3000: 0x3f, 0x3001: 0x40, 0x3002: 0x41, 0x3003: 0x42, 0x3004: 0x43, 0x3005: 0x44, 0x3006: 0x45, 0x3007: 0x46, - 0x3008: 0x47, 0x3009: 0x48, 0x300a: 0x49, 0x300b: 0x4a, 0x300c: 0x4b, 0x300d: 0x4c, 0x300e: 0x4d, 0x300f: 0x4e, - 0x3010: 0x4f, 0x3011: 0x50, 0x3012: 0x51, 0x3013: 0x52, 0x3014: 0x53, 0x3015: 0x54, 0x3016: 0x55, 0x3017: 0x56, - 0x3018: 0x57, 0x3019: 0x58, 0x301a: 0x59, 0x301b: 0x5a, 0x301c: 0x5b, 0x301d: 0x5c, 0x301e: 0x5d, 0x301f: 0x5e, - 0x3020: 0x5f, 0x3021: 0x60, 0x3022: 0x61, 0x3023: 0x62, 0x3024: 0x63, 0x3025: 0x64, 0x3026: 0x65, 0x3027: 0x66, - 0x3028: 0x67, 0x3029: 0x68, 0x302a: 0x69, 0x302c: 0x6a, 0x302d: 0x6b, 0x302e: 0x6c, 0x302f: 0x6d, - 0x3030: 0x6e, 0x3031: 0x6f, 0x3033: 0x70, 0x3034: 0x71, 0x3035: 0x72, 0x3036: 0x73, 0x3037: 0x74, - 0x3038: 0x5e7, 0x3039: 0x5e8, 0x303a: 0x5e9, 0x303b: 0x5ea, 0x303c: 0x79, 0x303d: 0x7a, 0x303e: 0x7b, 0x303f: 0x7c, - // Block 0xc1, offset 0x3040 - 0x3042: 0x01, 0x3043: 0x5e1, 0x3044: 0x5e2, 0x3045: 0x5e3, 0x3046: 0x05, 0x3047: 0x5e4, - 0x3048: 0x5e5, 0x3049: 0x08, 0x304a: 0x5e6, 0x304b: 0x0a, 0x304c: 0x0b, 0x304d: 0x0c, 0x304e: 0x0d, 0x304f: 0x0e, - 0x3050: 0x0f, 0x3051: 0x10, 0x3052: 0x11, 0x3053: 0x12, 0x3054: 0x13, 0x3055: 0x14, 0x3056: 0x15, 0x3057: 0x16, - 0x3058: 0x17, 0x3059: 0x18, 0x305a: 0x19, 0x305b: 0x1a, 0x305c: 0x1b, 0x305d: 0x1c, 0x305e: 0x1d, 0x305f: 0x1e, - 0x3060: 0x01, 0x3061: 0xbe, 0x3062: 0x03, 0x3063: 0x04, 0x3064: 0x05, - 0x306a: 0x06, 0x306d: 0x07, 0x306f: 0x08, - 0x3070: 0x13, 0x3073: 0x15, - // Block 0xc2, offset 0x3080 - 0x3080: 0x3f, 0x3081: 0x40, 0x3082: 0x41, 0x3083: 0x42, 0x3084: 0x43, 0x3085: 0x44, 0x3086: 0x45, 0x3087: 0x46, - 0x3088: 0x47, 0x3089: 0x48, 0x308a: 0x49, 0x308b: 0x4a, 0x308c: 0x4b, 0x308d: 0x4c, 0x308e: 0x4d, 0x308f: 0x4e, - 0x3090: 0x4f, 0x3091: 0x50, 0x3092: 0x51, 0x3093: 0x52, 0x3094: 0x53, 0x3095: 0x54, 0x3096: 0x55, 0x3097: 0x56, - 0x3098: 0x57, 0x3099: 0x58, 0x309a: 0x59, 0x309b: 0x5a, 0x309c: 0x5b, 0x309d: 0x5c, 0x309e: 0x5d, 0x309f: 0x5e, - 0x30a0: 0x5f, 0x30a1: 0x60, 0x30a2: 0x61, 0x30a3: 0x62, 0x30a4: 0x63, 0x30a5: 0x64, 0x30a6: 0x65, 0x30a7: 0x66, - 0x30a8: 0x67, 0x30a9: 0x68, 0x30aa: 0x69, 0x30ac: 0x6a, 0x30ad: 0x6b, 0x30ae: 0x6c, 0x30af: 0x6d, - 0x30b0: 0x6e, 0x30b1: 0x6f, 0x30b3: 0x70, 0x30b4: 0x71, 0x30b5: 0x72, 0x30b6: 0x73, 0x30b7: 0x74, - 0x30b8: 0x1de, 0x30b9: 0x1df, 0x30ba: 0x77, 0x30bb: 0x1e1, 0x30bc: 0x79, 0x30bd: 0x7a, 0x30be: 0x7b, 0x30bf: 0x7c, - // Block 0xc3, offset 0x30c0 - 0x30c0: 0x7d, 0x30c1: 0x7e, 0x30c2: 0x7f, 0x30c3: 0x80, 0x30c4: 0x81, 0x30c5: 0x5ed, 0x30c6: 0x83, 0x30c7: 0x84, - 0x30c8: 0x85, 0x30c9: 0x86, 0x30ca: 0x87, 0x30cb: 0x88, 0x30cc: 0x89, 0x30cd: 0x8a, 0x30ce: 0x8b, 0x30cf: 0x8c, - 0x30d0: 0x8d, 0x30d1: 0x8e, 0x30d2: 0x8f, 0x30d3: 0x90, 0x30d4: 0x91, 0x30d5: 0x92, 0x30d6: 0x93, 0x30d7: 0x94, - 0x30d8: 0x95, 0x30d9: 0x96, 0x30da: 0x97, 0x30db: 0x98, 0x30dc: 0x99, 0x30dd: 0x9a, 0x30de: 0x9b, 0x30df: 0x9c, - 0x30e0: 0x9d, 0x30e1: 0x9e, 0x30e2: 0x9f, 0x30e3: 0xa0, 0x30e4: 0xa1, 0x30e5: 0xa2, 0x30e6: 0xa3, 0x30e7: 0xa4, - 0x30e8: 0xa5, 0x30e9: 0xa6, 0x30ea: 0xa7, 0x30eb: 0xa8, 0x30ec: 0xa9, 0x30ed: 0xaa, - 0x30f0: 0xab, 0x30f1: 0xac, 0x30f2: 0xad, 0x30f3: 0xae, 0x30f4: 0xaf, 0x30f5: 0xb0, 0x30f6: 0xb1, 0x30f7: 0xb2, - 0x30f8: 0xb3, 0x30fa: 0xb4, 0x30fb: 0xb5, 0x30fc: 0xb6, 0x30fd: 0xb7, 0x30fe: 0xb8, 0x30ff: 0xb9, - // Block 0xc4, offset 0x3100 - 0x3100: 0xba, 0x3101: 0xbb, 0x3102: 0xbc, 0x3103: 0xbd, 0x3104: 0xbe, 0x3105: 0xbf, 0x3106: 0xc0, 0x3107: 0xc1, - 0x3108: 0xc2, 0x3109: 0xc3, 0x310a: 0xc4, 0x310b: 0xc5, 0x310c: 0xc6, 0x310d: 0x1e4, 0x310e: 0xc8, 0x310f: 0xc9, - // Block 0xc5, offset 0x3140 - 0x3140: 0x18b, 0x3141: 0x18c, 0x3142: 0x18d, 0x3143: 0x18e, 0x3144: 0x5ee, 0x3145: 0x190, 0x3146: 0x191, 0x3147: 0x192, - 0x3148: 0x193, 0x3149: 0x194, 0x314c: 0x195, 0x314d: 0x196, 0x314e: 0x197, 0x314f: 0x198, - 0x3150: 0x199, 0x3151: 0x19a, 0x3152: 0x19b, 0x3153: 0x19c, 0x3154: 0x19d, 0x3155: 0x19e, 0x3157: 0x19f, - 0x3158: 0x1a0, 0x3159: 0x1a1, 0x315a: 0x1a2, 0x315b: 0x1a3, 0x315c: 0x1a4, 0x315d: 0x1a5, - // Block 0xc6, offset 0x3180 - 0x3190: 0x09, 0x3191: 0x0a, 0x3192: 0x0b, 0x3193: 0x0c, 0x3196: 0x0d, - 0x319b: 0x0e, 0x319d: 0x0f, 0x319e: 0x10, 0x319f: 0xc3, - 0x31af: 0x12, - // Block 0xc7, offset 0x31c0 - 0x31c2: 0x01, 0x31c3: 0x1d7, 0x31c4: 0x1d8, 0x31c5: 0x1d9, 0x31c6: 0x05, 0x31c7: 0x1db, - 0x31c8: 0x1dc, 0x31c9: 0x08, 0x31ca: 0x09, 0x31cb: 0x0a, 0x31cc: 0x0b, 0x31cd: 0x0c, 0x31ce: 0x0d, 0x31cf: 0x0e, - 0x31d0: 0x0f, 0x31d1: 0x10, 0x31d2: 0x11, 0x31d3: 0x12, 0x31d4: 0x13, 0x31d5: 0x14, 0x31d6: 0x15, 0x31d7: 0x16, - 0x31d8: 0x17, 0x31d9: 0x18, 0x31da: 0x19, 0x31db: 0x1a, 0x31dc: 0x1b, 0x31dd: 0x1c, 0x31de: 0x1d, 0x31df: 0x1e, - 0x31e0: 0x01, 0x31e1: 0xc0, 0x31e2: 0xc1, 0x31e3: 0xc2, 0x31e4: 0x05, - 0x31ea: 0x06, 0x31ed: 0x07, 0x31ef: 0x08, - 0x31f0: 0xc4, 0x31f3: 0x15, - // Block 0xc8, offset 0x3200 - 0x3202: 0x01, 0x3203: 0x02, 0x3204: 0x03, 0x3205: 0x04, 0x3206: 0x05, 0x3207: 0x06, - 0x3208: 0x07, 0x3209: 0x08, 0x320a: 0x09, 0x320b: 0x0a, 0x320c: 0x0b, 0x320d: 0x0c, 0x320e: 0x0d, 0x320f: 0x0e, - 0x3210: 0x0f, 0x3211: 0x10, 0x3212: 0x5ef, 0x3213: 0x12, 0x3214: 0x13, 0x3215: 0x14, 0x3216: 0x15, 0x3217: 0x16, - 0x3218: 0x17, 0x3219: 0x18, 0x321a: 0x19, 0x321b: 0x1a, 0x321c: 0x1b, 0x321d: 0x1c, 0x321e: 0x1d, 0x321f: 0x1e, - 0x3220: 0x01, 0x3221: 0x02, 0x3222: 0x03, 0x3223: 0x04, 0x3224: 0x05, - 0x322a: 0x06, 0x322d: 0x07, 0x322f: 0x08, - 0x3230: 0x13, 0x3233: 0x15, - // Block 0xc9, offset 0x3240 - 0x3264: 0xfb, 0x3265: 0xfc, 0x3266: 0xfd, 0x3267: 0xfe, - 0x3268: 0xff, 0x3269: 0x100, 0x326a: 0x101, 0x326b: 0x102, 0x326c: 0x103, 0x326d: 0x104, 0x326e: 0x252, 0x326f: 0x106, - 0x3270: 0x5f4, 0x3271: 0x5f5, 0x3272: 0x5f6, 0x3273: 0x5f7, 0x3274: 0x5f8, 0x3275: 0x10c, 0x3276: 0x10d, 0x3277: 0x10e, - 0x3278: 0x10f, 0x3279: 0x110, 0x327a: 0x111, 0x327b: 0x5f9, 0x327c: 0x113, 0x327d: 0x114, 0x327e: 0x115, 0x327f: 0x116, - // Block 0xca, offset 0x3280 - 0x3282: 0x01, 0x3283: 0x02, 0x3284: 0x03, 0x3285: 0x04, 0x3286: 0x05, 0x3287: 0x06, - 0x3288: 0x07, 0x3289: 0x08, 0x328a: 0x09, 0x328b: 0x0a, 0x328c: 0x0b, 0x328d: 0x0c, 0x328e: 0x0d, 0x328f: 0x0e, - 0x3290: 0x0f, 0x3291: 0x10, 0x3292: 0x11, 0x3293: 0x12, 0x3294: 0x13, 0x3295: 0x14, 0x3296: 0x15, 0x3297: 0x16, - 0x3298: 0x5f0, 0x3299: 0x5f1, 0x329a: 0x5f2, 0x329b: 0x5f3, 0x329c: 0x1b, 0x329d: 0x1c, 0x329e: 0x1d, 0x329f: 0x1e, - 0x32a0: 0x01, 0x32a1: 0x02, 0x32a2: 0x03, 0x32a3: 0x04, 0x32a4: 0x05, - 0x32aa: 0x06, 0x32ad: 0x07, 0x32af: 0xc7, - 0x32b0: 0x13, 0x32b3: 0x15, - // Block 0xcb, offset 0x32c0 - 0x32c0: 0x3f, 0x32c1: 0x40, 0x32c2: 0x41, 0x32c3: 0x42, 0x32c4: 0x43, 0x32c5: 0x44, 0x32c6: 0x45, 0x32c7: 0x46, - 0x32c8: 0x47, 0x32c9: 0x48, 0x32ca: 0x49, 0x32cb: 0x4a, 0x32cc: 0x4b, 0x32cd: 0x4c, 0x32ce: 0x4d, 0x32cf: 0x4e, - 0x32d0: 0x4f, 0x32d1: 0x50, 0x32d2: 0x51, 0x32d3: 0x52, 0x32d4: 0x53, 0x32d5: 0x54, 0x32d6: 0x55, 0x32d7: 0x56, - 0x32d8: 0x57, 0x32d9: 0x58, 0x32da: 0x59, 0x32db: 0x5a, 0x32dc: 0x5b, 0x32dd: 0x5c, 0x32de: 0x5d, 0x32df: 0x5e, - 0x32e0: 0x5f, 0x32e1: 0x60, 0x32e2: 0x61, 0x32e3: 0x62, 0x32e4: 0x63, 0x32e5: 0x64, 0x32e6: 0x65, 0x32e7: 0x66, - 0x32e8: 0x67, 0x32e9: 0x68, 0x32ea: 0x69, 0x32ec: 0x6a, 0x32ed: 0x6b, 0x32ee: 0x6c, 0x32ef: 0x6d, - 0x32f0: 0x6e, 0x32f1: 0x6f, 0x32f3: 0x70, 0x32f4: 0x71, 0x32f5: 0x72, 0x32f6: 0x73, 0x32f7: 0x74, - 0x32f8: 0x606, 0x32f9: 0x607, 0x32fa: 0x608, 0x32fb: 0x609, 0x32fc: 0x60a, 0x32fd: 0x60b, 0x32fe: 0x60c, 0x32ff: 0x60d, - // Block 0xcc, offset 0x3300 - 0x3302: 0x01, 0x3303: 0x5fc, 0x3304: 0x5fd, 0x3305: 0x5fe, 0x3306: 0x5ff, 0x3307: 0x600, - 0x3308: 0x601, 0x3309: 0x08, 0x330a: 0x09, 0x330b: 0x0a, 0x330c: 0x602, 0x330d: 0x603, 0x330e: 0x604, 0x330f: 0x605, - 0x3310: 0x0f, 0x3311: 0x10, 0x3312: 0x11, 0x3313: 0x12, 0x3314: 0x13, 0x3315: 0x14, 0x3316: 0x15, 0x3317: 0x16, - 0x3318: 0x17, 0x3319: 0x18, 0x331a: 0x19, 0x331b: 0x1a, 0x331c: 0x1b, 0x331d: 0x1c, 0x331e: 0x1d, 0x331f: 0x1e, - 0x3320: 0x01, 0x3321: 0xc9, 0x3322: 0x03, 0x3323: 0x04, 0x3324: 0x05, - 0x332a: 0x06, 0x332d: 0x07, 0x332f: 0x08, - 0x3330: 0x13, 0x3333: 0x15, - // Block 0xcd, offset 0x3340 - 0x3342: 0x01, 0x3343: 0x610, 0x3344: 0x03, 0x3345: 0x04, 0x3346: 0x05, 0x3347: 0x06, - 0x3348: 0x07, 0x3349: 0x08, 0x334a: 0x09, 0x334b: 0x0a, 0x334c: 0x0b, 0x334d: 0x0c, 0x334e: 0x0d, 0x334f: 0x0e, - 0x3350: 0x0f, 0x3351: 0x10, 0x3352: 0x11, 0x3353: 0x12, 0x3354: 0x13, 0x3355: 0x14, 0x3356: 0x15, 0x3357: 0x16, - 0x3358: 0x17, 0x3359: 0x18, 0x335a: 0x19, 0x335b: 0x1a, 0x335c: 0x1b, 0x335d: 0x1c, 0x335e: 0x1d, 0x335f: 0x1e, - 0x3360: 0x01, 0x3361: 0x02, 0x3362: 0x03, 0x3363: 0x04, 0x3364: 0x05, - 0x336a: 0x06, 0x336d: 0x07, 0x336f: 0x08, - 0x3370: 0x13, 0x3373: 0x15, - // Block 0xce, offset 0x3380 - 0x3380: 0x3f, 0x3381: 0x40, 0x3382: 0x41, 0x3383: 0x42, 0x3384: 0x43, 0x3385: 0x44, 0x3386: 0x45, 0x3387: 0x46, - 0x3388: 0x47, 0x3389: 0x48, 0x338a: 0x49, 0x338b: 0x4a, 0x338c: 0x4b, 0x338d: 0x4c, 0x338e: 0x4d, 0x338f: 0x4e, - 0x3390: 0x4f, 0x3391: 0x50, 0x3392: 0x51, 0x3393: 0x52, 0x3394: 0x53, 0x3395: 0x54, 0x3396: 0x55, 0x3397: 0x56, - 0x3398: 0x57, 0x3399: 0x58, 0x339a: 0x59, 0x339b: 0x5a, 0x339c: 0x5b, 0x339d: 0x5c, 0x339e: 0x5d, 0x339f: 0x5e, - 0x33a0: 0x5f, 0x33a1: 0x60, 0x33a2: 0x61, 0x33a3: 0x62, 0x33a4: 0x63, 0x33a5: 0x64, 0x33a6: 0x65, 0x33a7: 0x66, - 0x33a8: 0x67, 0x33a9: 0x68, 0x33aa: 0x69, 0x33ac: 0x6a, 0x33ad: 0x6b, 0x33ae: 0x6c, 0x33af: 0x6d, - 0x33b0: 0x6e, 0x33b1: 0x6f, 0x33b3: 0x70, 0x33b4: 0x71, 0x33b5: 0x72, 0x33b6: 0x73, 0x33b7: 0x74, - 0x33b8: 0x75, 0x33b9: 0x613, 0x33ba: 0x614, 0x33bb: 0x615, 0x33bc: 0x79, 0x33bd: 0x7a, 0x33be: 0x7b, 0x33bf: 0x7c, - // Block 0xcf, offset 0x33c0 - 0x33c2: 0x01, 0x33c3: 0x02, 0x33c4: 0x03, 0x33c5: 0x04, 0x33c6: 0x05, 0x33c7: 0x06, - 0x33c8: 0x07, 0x33c9: 0x08, 0x33ca: 0x09, 0x33cb: 0x0a, 0x33cc: 0x0b, 0x33cd: 0x0c, 0x33ce: 0x0d, 0x33cf: 0x0e, - 0x33d0: 0x0f, 0x33d1: 0x10, 0x33d2: 0x11, 0x33d3: 0x12, 0x33d4: 0x13, 0x33d5: 0x14, 0x33d6: 0x15, 0x33d7: 0x16, - 0x33d8: 0x17, 0x33d9: 0x18, 0x33da: 0x19, 0x33db: 0x1a, 0x33dc: 0x1b, 0x33dd: 0x1c, 0x33de: 0x1d, 0x33df: 0x1e, - 0x33e0: 0x01, 0x33e1: 0xcc, 0x33e2: 0x03, 0x33e3: 0x04, 0x33e4: 0x05, - 0x33ea: 0x06, 0x33ed: 0x07, 0x33ef: 0x08, - 0x33f0: 0x13, 0x33f3: 0x15, - // Block 0xd0, offset 0x3400 - 0x3400: 0x3f, 0x3401: 0x40, 0x3402: 0x41, 0x3403: 0x42, 0x3404: 0x43, 0x3405: 0x44, 0x3406: 0x45, 0x3407: 0x46, - 0x3408: 0x47, 0x3409: 0x48, 0x340a: 0x49, 0x340b: 0x4a, 0x340c: 0x4b, 0x340d: 0x4c, 0x340e: 0x4d, 0x340f: 0x4e, - 0x3410: 0x4f, 0x3411: 0x50, 0x3412: 0x51, 0x3413: 0x52, 0x3414: 0x53, 0x3415: 0x54, 0x3416: 0x55, 0x3417: 0x56, - 0x3418: 0x57, 0x3419: 0x58, 0x341a: 0x59, 0x341b: 0x5a, 0x341c: 0x5b, 0x341d: 0x5c, 0x341e: 0x5d, 0x341f: 0x5e, - 0x3420: 0x5f, 0x3421: 0x60, 0x3422: 0x61, 0x3423: 0x62, 0x3424: 0x63, 0x3425: 0x64, 0x3426: 0x65, 0x3427: 0x66, - 0x3428: 0x67, 0x3429: 0x68, 0x342a: 0x69, 0x342c: 0x6a, 0x342d: 0x6b, 0x342e: 0x6c, 0x342f: 0x6d, - 0x3430: 0x6e, 0x3431: 0x6f, 0x3433: 0x70, 0x3434: 0x71, 0x3435: 0x72, 0x3436: 0x73, 0x3437: 0x74, - 0x3438: 0x61d, 0x3439: 0x61e, 0x343a: 0x61f, 0x343b: 0x620, 0x343c: 0x79, 0x343d: 0x7a, 0x343e: 0x7b, 0x343f: 0x7c, - // Block 0xd1, offset 0x3440 - 0x3440: 0x7d, 0x3441: 0x7e, 0x3442: 0x7f, 0x3443: 0x80, 0x3444: 0x81, 0x3445: 0x82, 0x3446: 0x83, 0x3447: 0x84, - 0x3448: 0x85, 0x3449: 0x86, 0x344a: 0x87, 0x344b: 0x88, 0x344c: 0x89, 0x344d: 0x8a, 0x344e: 0x8b, 0x344f: 0x8c, - 0x3450: 0x8d, 0x3451: 0x8e, 0x3452: 0x8f, 0x3453: 0x90, 0x3454: 0x91, 0x3455: 0x92, 0x3456: 0x93, 0x3457: 0x94, - 0x3458: 0x95, 0x3459: 0x96, 0x345a: 0x97, 0x345b: 0x98, 0x345c: 0x99, 0x345d: 0x9a, 0x345e: 0x9b, 0x345f: 0x9c, - 0x3460: 0x9d, 0x3461: 0x9e, 0x3462: 0x9f, 0x3463: 0xa0, 0x3464: 0xa1, 0x3465: 0xa2, 0x3466: 0xa3, 0x3467: 0xa4, - 0x3468: 0xa5, 0x3469: 0xa6, 0x346a: 0xa7, 0x346b: 0xa8, 0x346c: 0xa9, 0x346d: 0xaa, - 0x3470: 0xab, 0x3471: 0xac, 0x3472: 0xad, 0x3473: 0xae, 0x3474: 0xaf, 0x3475: 0xb0, 0x3476: 0xb1, 0x3477: 0xb2, - 0x3478: 0xb3, 0x347a: 0x621, 0x347b: 0x622, 0x347c: 0x623, 0x347d: 0x624, 0x347e: 0x625, 0x347f: 0x626, - // Block 0xd2, offset 0x3480 - 0x3480: 0x627, 0x3481: 0xbb, 0x3482: 0xbc, 0x3483: 0xbd, 0x3484: 0xbe, 0x3485: 0xbf, 0x3486: 0x628, 0x3487: 0xc1, - 0x3488: 0x629, 0x3489: 0x62a, 0x348a: 0x62b, 0x348b: 0x62c, 0x348c: 0xc6, 0x348d: 0x62d, 0x348e: 0xc8, 0x348f: 0x62e, - 0x3490: 0x62f, 0x3491: 0x630, 0x3492: 0x631, 0x3493: 0x632, 0x3494: 0x633, 0x3495: 0x634, 0x3496: 0x635, 0x3497: 0x636, - 0x3498: 0x637, 0x3499: 0x638, 0x349a: 0x639, 0x349b: 0x63a, 0x349c: 0x63b, 0x349d: 0x63c, 0x349e: 0x63d, 0x349f: 0x63e, - 0x34a0: 0x63f, 0x34a1: 0x640, 0x34a2: 0x641, 0x34a3: 0x642, 0x34a4: 0x643, 0x34a5: 0x644, 0x34a6: 0x645, 0x34a7: 0x646, - 0x34a8: 0x647, 0x34a9: 0x648, 0x34aa: 0x649, 0x34ab: 0x64a, 0x34ac: 0x64b, 0x34ad: 0x64c, 0x34ae: 0x64d, 0x34af: 0x64e, - 0x34b0: 0x64f, 0x34b1: 0x650, 0x34b2: 0x651, 0x34b3: 0x652, 0x34b4: 0x653, 0x34b5: 0x654, 0x34b6: 0x655, 0x34b7: 0x656, - 0x34b8: 0x657, 0x34b9: 0x658, 0x34ba: 0x659, 0x34bb: 0x65a, 0x34bc: 0x65b, 0x34bd: 0x65c, 0x34be: 0x65d, 0x34bf: 0x65e, - // Block 0xd3, offset 0x34c0 - 0x34c0: 0x65f, 0x34c1: 0x660, 0x34c2: 0x661, 0x34c3: 0x662, 0x34c4: 0x663, 0x34c5: 0x664, 0x34c6: 0x665, 0x34c7: 0x666, - 0x34c8: 0x667, 0x34c9: 0x668, 0x34ca: 0x669, 0x34cb: 0x66a, 0x34cc: 0x66b, 0x34cd: 0x66c, 0x34ce: 0x66d, 0x34cf: 0x66e, - 0x34d0: 0x66f, 0x34d1: 0x670, 0x34d2: 0x671, 0x34d3: 0x672, 0x34d4: 0x673, 0x34d5: 0x674, 0x34d6: 0x675, 0x34d7: 0x676, - 0x34d8: 0x677, 0x34d9: 0x678, 0x34da: 0x679, 0x34db: 0x67a, 0x34dc: 0x67b, 0x34dd: 0x67c, 0x34de: 0x67d, 0x34df: 0x67e, - 0x34e0: 0x67f, 0x34e1: 0x680, 0x34e2: 0x681, 0x34e3: 0x682, 0x34e4: 0x683, 0x34e5: 0x684, 0x34e6: 0x685, 0x34e7: 0x686, - 0x34e8: 0x687, 0x34e9: 0x688, 0x34ea: 0x689, 0x34eb: 0x68a, 0x34ec: 0x68b, 0x34ed: 0x68c, 0x34ee: 0x68d, 0x34ef: 0x68e, - 0x34f0: 0x68f, 0x34f1: 0x690, 0x34f2: 0x691, 0x34f3: 0x692, 0x34f4: 0x693, 0x34f5: 0x694, 0x34f6: 0x695, 0x34f7: 0xca, - 0x34f8: 0x696, 0x34f9: 0x697, 0x34fa: 0x698, 0x34fb: 0x699, 0x34fc: 0x69a, 0x34fd: 0x69b, 0x34fe: 0x69c, 0x34ff: 0x69d, - // Block 0xd4, offset 0x3500 - 0x3500: 0x69e, 0x3501: 0x69f, 0x3502: 0x6a0, 0x3503: 0x6a1, 0x3504: 0x6a2, 0x3505: 0x6a3, 0x3506: 0x6a4, 0x3507: 0x6a5, - 0x3508: 0x6a6, 0x3509: 0x6a7, 0x350a: 0x6a8, 0x350b: 0x6a9, 0x350c: 0x6aa, 0x350d: 0x6ab, 0x350e: 0x6ac, 0x350f: 0x6ad, - 0x3510: 0x6ae, 0x3511: 0x6af, 0x3512: 0x6b0, 0x3513: 0x6b1, 0x3514: 0x6b2, 0x3515: 0x6b3, 0x3516: 0x6b4, 0x3517: 0x6b5, - 0x3518: 0x6b6, 0x3519: 0x6b7, 0x351a: 0x6b8, 0x351b: 0x6b9, 0x351c: 0x6ba, 0x351d: 0x6bb, 0x351e: 0x6bc, 0x351f: 0x6bd, - 0x3520: 0x6be, 0x3521: 0x6bf, 0x3522: 0x6c0, 0x3523: 0x6c1, 0x3524: 0x6c2, 0x3525: 0x6c3, 0x3526: 0x6c4, 0x3527: 0x6c5, - 0x3528: 0x6c6, 0x3529: 0x6c7, 0x352a: 0x6c8, 0x352b: 0x6c9, 0x352c: 0x6ca, 0x352d: 0x6cb, 0x352e: 0x6cc, 0x352f: 0x6cd, - 0x3530: 0x6ce, 0x3531: 0x6cf, 0x3532: 0x6d0, 0x3533: 0x6d1, 0x3534: 0x6d2, 0x3535: 0x6d3, 0x3536: 0x6d4, 0x3537: 0x6d5, - 0x3538: 0x6d6, 0x3539: 0x6d7, 0x353a: 0x6d8, 0x353b: 0x6d9, 0x353c: 0x6da, 0x353d: 0x6db, 0x353e: 0x6dc, 0x353f: 0x6dd, - // Block 0xd5, offset 0x3540 - 0x3540: 0x6de, 0x3541: 0x6df, 0x3542: 0x6e0, 0x3543: 0x6e1, 0x3544: 0x6e2, 0x3545: 0x6e3, 0x3546: 0x6e4, 0x3547: 0x6e5, - 0x3548: 0x6e6, 0x3549: 0x6e7, 0x354a: 0x6e8, 0x354b: 0x6e9, 0x354c: 0x6ea, 0x354d: 0x6eb, 0x354e: 0x6ec, 0x354f: 0x6ed, - 0x3550: 0x6ee, 0x3551: 0x6ef, 0x3552: 0x6f0, 0x3553: 0x6f1, 0x3554: 0x6f2, 0x3555: 0x6f3, 0x3556: 0x6f4, 0x3557: 0x6f5, - 0x3558: 0x6f6, 0x3559: 0x6f7, 0x355a: 0x6f8, 0x355b: 0x6f9, 0x355c: 0x6fa, 0x355d: 0x6fb, 0x355e: 0x6fc, 0x355f: 0x6fd, - 0x3560: 0x6fe, 0x3561: 0x6ff, 0x3562: 0x700, 0x3563: 0x701, 0x3564: 0x702, 0x3565: 0x703, 0x3566: 0x704, 0x3567: 0x705, - 0x3568: 0x706, 0x3569: 0x707, 0x356a: 0x708, 0x356b: 0x709, 0x356c: 0x70a, 0x356d: 0x70b, 0x356e: 0x70c, 0x356f: 0x70d, - 0x3570: 0x70e, 0x3571: 0x70f, 0x3572: 0x710, 0x3573: 0x711, 0x3574: 0x712, 0x3575: 0x713, 0x3576: 0x714, 0x3577: 0x715, - 0x3578: 0x716, 0x3579: 0x717, 0x357a: 0x718, 0x357b: 0x719, 0x357c: 0x71a, 0x357d: 0x71b, 0x357e: 0x71c, 0x357f: 0x71d, - // Block 0xd6, offset 0x3580 - 0x3580: 0x71e, 0x3581: 0x71f, 0x3582: 0x720, 0x3583: 0x721, 0x3584: 0x722, 0x3585: 0x723, 0x3586: 0x724, 0x3587: 0x725, - 0x3588: 0x726, 0x3589: 0x727, 0x358a: 0x728, 0x358b: 0x729, 0x358c: 0x72a, 0x358d: 0x72b, 0x358e: 0x72c, 0x358f: 0x72d, - 0x3590: 0x72e, 0x3591: 0x72f, 0x3592: 0x730, 0x3593: 0x731, 0x3594: 0x732, 0x3595: 0x733, 0x3596: 0x734, 0x3597: 0x735, - 0x3598: 0x736, 0x3599: 0x737, 0x359a: 0x738, 0x359b: 0x739, 0x359c: 0x73a, 0x359d: 0x73b, 0x359e: 0x73c, 0x359f: 0x73d, - 0x35a0: 0x73e, 0x35a1: 0x73f, 0x35a2: 0x740, 0x35a3: 0x741, 0x35a4: 0x742, 0x35a5: 0x743, 0x35a6: 0x744, 0x35a7: 0x745, - 0x35a8: 0x746, 0x35a9: 0x747, 0x35aa: 0x748, 0x35ab: 0x749, 0x35ac: 0x74a, 0x35ad: 0x74b, 0x35ae: 0x74c, 0x35af: 0x74d, - 0x35b0: 0x74e, 0x35b1: 0x74f, 0x35b2: 0x750, 0x35b3: 0x751, 0x35b4: 0x752, 0x35b5: 0x753, 0x35b6: 0x754, 0x35b7: 0x755, - 0x35b8: 0x756, 0x35b9: 0x757, 0x35ba: 0x758, 0x35bb: 0x759, 0x35bc: 0x75a, 0x35bd: 0x75b, 0x35be: 0x75c, 0x35bf: 0x75d, - // Block 0xd7, offset 0x35c0 - 0x35c0: 0x75e, 0x35c1: 0x75f, 0x35c2: 0x760, 0x35c3: 0x761, 0x35c4: 0x762, 0x35c5: 0x763, 0x35c6: 0x764, 0x35c7: 0x765, - 0x35c8: 0x766, 0x35c9: 0x767, 0x35ca: 0x768, 0x35cb: 0x769, 0x35cc: 0x76a, 0x35cd: 0x76b, 0x35ce: 0x76c, 0x35cf: 0x76d, - 0x35d0: 0x76e, 0x35d1: 0x76f, 0x35d2: 0x770, 0x35d3: 0x771, 0x35d4: 0x772, 0x35d5: 0x773, 0x35d6: 0x774, 0x35d7: 0x775, - 0x35d8: 0x776, 0x35d9: 0x777, 0x35da: 0x778, 0x35db: 0x779, 0x35dc: 0x77a, 0x35dd: 0x77b, 0x35de: 0x77c, 0x35df: 0x77d, - 0x35e0: 0x77e, 0x35e1: 0x77f, 0x35e2: 0x780, 0x35e3: 0x781, 0x35e4: 0x782, 0x35e5: 0x783, 0x35e6: 0x784, 0x35e7: 0x785, - 0x35e8: 0x786, 0x35e9: 0x787, 0x35ea: 0x788, 0x35eb: 0x789, 0x35ec: 0x78a, 0x35ed: 0x78b, 0x35ee: 0x78c, 0x35ef: 0x78d, - 0x35f0: 0x78e, 0x35f1: 0x78f, 0x35f2: 0x790, 0x35f3: 0x791, 0x35f4: 0x792, 0x35f5: 0x793, 0x35f6: 0x794, 0x35f7: 0x795, - 0x35f8: 0x796, 0x35f9: 0x797, 0x35fa: 0x798, 0x35fb: 0x799, 0x35fc: 0x79a, 0x35fd: 0x79b, 0x35fe: 0x79c, 0x35ff: 0x79d, - // Block 0xd8, offset 0x3600 - 0x3600: 0x79e, 0x3601: 0x79f, 0x3602: 0x7a0, 0x3603: 0x7a1, 0x3604: 0x7a2, 0x3605: 0x7a3, 0x3606: 0x7a4, 0x3607: 0x7a5, - 0x3608: 0x7a6, 0x3609: 0x7a7, 0x360a: 0x7a8, 0x360b: 0x7a9, 0x360c: 0x7aa, 0x360d: 0x7ab, 0x360e: 0x7ac, 0x360f: 0x7ad, - 0x3610: 0x7ae, 0x3611: 0x7af, 0x3612: 0x7b0, 0x3613: 0x7b1, 0x3614: 0x7b2, 0x3615: 0x7b3, 0x3616: 0x7b4, 0x3617: 0x7b5, - 0x3618: 0x7b6, 0x3619: 0x7b7, 0x361a: 0x7b8, 0x361b: 0x7b9, 0x361c: 0x7ba, 0x361d: 0x7bb, 0x361e: 0x7bc, 0x361f: 0x7bd, - 0x3620: 0x7be, 0x3621: 0x7bf, 0x3622: 0x7c0, 0x3623: 0x7c1, 0x3624: 0x7c2, 0x3625: 0x7c3, 0x3626: 0x7c4, 0x3627: 0x7c5, - 0x3628: 0x7c6, 0x3629: 0x7c7, 0x362a: 0x7c8, 0x362b: 0x7c9, 0x362c: 0x7ca, 0x362d: 0x7cb, 0x362e: 0x7cc, 0x362f: 0x7cd, - 0x3630: 0x7ce, 0x3631: 0x7cf, 0x3632: 0x7d0, 0x3633: 0x7d1, 0x3634: 0x7d2, 0x3635: 0x7d3, 0x3636: 0x7d4, 0x3637: 0x7d5, - 0x3638: 0x7d6, 0x3639: 0x7d7, 0x363a: 0x7d8, 0x363b: 0x7d9, 0x363c: 0x7da, 0x363d: 0x7db, 0x363e: 0x7dc, 0x363f: 0x7dd, - // Block 0xd9, offset 0x3640 - 0x3664: 0x7de, 0x3665: 0x7df, 0x3666: 0x7e0, 0x3667: 0x7e1, - 0x3668: 0x7e2, 0x3669: 0x7e3, 0x366a: 0x7e4, 0x366b: 0x7e5, 0x366c: 0x103, 0x366d: 0x104, 0x366e: 0x105, 0x366f: 0x106, - 0x3670: 0x107, 0x3671: 0x108, 0x3672: 0x109, 0x3673: 0x10a, 0x3674: 0x10b, 0x3675: 0x10c, 0x3676: 0x10d, 0x3677: 0x10e, - 0x3678: 0x10f, 0x3679: 0x110, 0x367a: 0x111, 0x367b: 0x112, 0x367c: 0x113, 0x367d: 0x114, 0x367e: 0x115, 0x367f: 0x116, - // Block 0xda, offset 0x3680 - 0x3680: 0x18b, 0x3681: 0x18c, 0x3682: 0x18d, 0x3683: 0x18e, 0x3684: 0x18f, 0x3685: 0x190, 0x3686: 0x191, 0x3687: 0x192, - 0x3688: 0x7e6, 0x3689: 0x7e7, 0x368c: 0x195, 0x368d: 0x196, 0x368e: 0x197, 0x368f: 0x198, - 0x3690: 0x199, 0x3691: 0x19a, 0x3692: 0x19b, 0x3693: 0x19c, 0x3694: 0x19d, 0x3695: 0x19e, 0x3697: 0x19f, - 0x3698: 0x1a0, 0x3699: 0x1a1, 0x369a: 0x1a2, 0x369b: 0x1a3, 0x369c: 0x1a4, 0x369d: 0x1a5, - // Block 0xdb, offset 0x36c0 - 0x36c0: 0x7e8, 0x36c1: 0x7e9, 0x36c2: 0x7ea, 0x36c3: 0x7eb, 0x36c4: 0x7ec, 0x36c5: 0x7ed, 0x36c6: 0x7ee, 0x36c7: 0x7ef, - 0x36c8: 0x7f0, 0x36c9: 0x7f1, 0x36ca: 0x7f2, 0x36cb: 0x7f3, 0x36cc: 0x7f4, 0x36cd: 0x7f5, 0x36ce: 0x7f6, 0x36cf: 0x7f7, - 0x36d0: 0x7f8, 0x36d1: 0x7f9, 0x36d2: 0x7fa, 0x36d3: 0x7fb, 0x36d4: 0x7fc, 0x36d5: 0x7fd, 0x36d6: 0x7fe, 0x36d7: 0x7ff, - 0x36d8: 0x800, 0x36d9: 0x801, 0x36da: 0x802, 0x36db: 0x803, 0x36dc: 0x804, 0x36dd: 0x805, 0x36de: 0x806, 0x36df: 0x807, - 0x36e0: 0x808, 0x36e1: 0x809, 0x36e2: 0x80a, 0x36e3: 0x80b, 0x36e4: 0x80c, 0x36e5: 0x80d, 0x36e6: 0x80e, 0x36e7: 0x80f, - 0x36e8: 0x810, 0x36e9: 0x811, 0x36ea: 0x812, 0x36eb: 0x813, 0x36ec: 0x814, 0x36ed: 0x815, 0x36ee: 0x816, 0x36ef: 0x817, - 0x36f0: 0x818, 0x36f1: 0x819, 0x36f2: 0x81a, 0x36f3: 0x81b, 0x36f4: 0x81c, 0x36f5: 0x81d, 0x36f6: 0x81e, 0x36f7: 0x81f, - 0x36f8: 0x820, 0x36f9: 0x821, 0x36fa: 0x822, 0x36fb: 0x823, 0x36fc: 0x824, 0x36fd: 0x825, 0x36fe: 0x826, 0x36ff: 0x827, - // Block 0xdc, offset 0x3700 - 0x3700: 0x828, 0x3701: 0x829, 0x3702: 0x82a, 0x3703: 0x82b, 0x3704: 0x82c, 0x3705: 0x82d, 0x3706: 0x82e, 0x3707: 0x82f, - 0x3708: 0x830, 0x3709: 0x831, 0x370a: 0x832, 0x370b: 0x833, 0x370c: 0x834, 0x370d: 0x835, 0x370e: 0x836, 0x370f: 0x837, - 0x3710: 0x838, 0x3711: 0x839, 0x3712: 0x83a, 0x3713: 0x83b, 0x3714: 0x83c, 0x3715: 0x83d, 0x3716: 0x83e, 0x3717: 0x83f, - 0x3718: 0x840, 0x3719: 0x841, 0x371a: 0x842, 0x371b: 0x843, 0x371c: 0x844, 0x371d: 0x845, 0x371e: 0x846, 0x371f: 0x847, - 0x3720: 0x848, 0x3721: 0x849, 0x3722: 0x84a, 0x3723: 0x84b, 0x3724: 0x84c, 0x3725: 0x84d, 0x3726: 0x84e, 0x3727: 0x84f, - 0x3728: 0x850, 0x3729: 0x851, 0x372a: 0x852, 0x372b: 0x853, 0x372c: 0x854, 0x372d: 0x855, 0x372e: 0x856, 0x372f: 0x857, - 0x3730: 0x858, 0x3731: 0x859, 0x3732: 0x85a, 0x3733: 0x85b, 0x3734: 0x85c, 0x3735: 0x85d, 0x3736: 0x85e, 0x3737: 0x85f, - 0x3738: 0x860, 0x3739: 0x861, 0x373a: 0x862, 0x373b: 0x863, 0x373c: 0x864, 0x373d: 0x865, 0x373e: 0x866, 0x373f: 0x867, - // Block 0xdd, offset 0x3740 - 0x3740: 0x868, 0x3741: 0x869, 0x3742: 0x86a, 0x3743: 0x86b, 0x3744: 0x86c, 0x3745: 0x86d, 0x3746: 0x86e, 0x3747: 0x86f, - 0x3748: 0x870, 0x3749: 0x871, 0x374a: 0x872, 0x374b: 0x873, 0x374c: 0x874, 0x374d: 0x875, 0x374e: 0x876, 0x374f: 0x877, - 0x3750: 0x878, 0x3751: 0x879, 0x3752: 0x87a, 0x3753: 0x87b, 0x3754: 0x87c, 0x3755: 0x87d, 0x3756: 0x87e, 0x3757: 0x87f, - 0x3758: 0x880, 0x3759: 0x881, 0x375a: 0x882, 0x375b: 0x883, 0x375c: 0x884, 0x375d: 0x885, 0x375e: 0x886, 0x375f: 0x887, - 0x3760: 0x888, 0x3761: 0x889, 0x3762: 0x88a, 0x3763: 0x88b, 0x3764: 0x88c, 0x3765: 0x88d, 0x3766: 0x88e, 0x3767: 0x88f, - 0x3768: 0x890, 0x3769: 0x891, 0x376a: 0x892, 0x376b: 0x893, 0x376c: 0x894, 0x376d: 0x895, 0x376e: 0x896, 0x376f: 0x897, - 0x3770: 0x898, 0x3771: 0x899, 0x3772: 0x89a, 0x3773: 0x89b, 0x3774: 0x89c, 0x3775: 0x89d, 0x3776: 0x89e, 0x3777: 0x89f, - 0x3778: 0x8a0, 0x3779: 0x8a1, 0x377a: 0x8a2, 0x377b: 0x8a3, 0x377c: 0x8a4, 0x377d: 0x8a5, 0x377e: 0x8a6, 0x377f: 0x8a7, - // Block 0xde, offset 0x3780 - 0x3780: 0x8a8, 0x3781: 0x8a9, 0x3782: 0x8aa, 0x3783: 0x8ab, 0x3784: 0x8ac, 0x3785: 0x8ad, 0x3786: 0x8ae, 0x3787: 0x8af, - 0x3788: 0x8b0, 0x3789: 0x8b1, 0x378a: 0x8b2, 0x378b: 0x8b3, 0x378c: 0x8b4, 0x378d: 0x8b5, 0x378e: 0x8b6, 0x378f: 0x8b7, - 0x3790: 0x8b8, 0x3791: 0x8b9, 0x3792: 0x8ba, 0x3793: 0x8bb, 0x3794: 0x8bc, 0x3795: 0x8bd, 0x3796: 0x8be, 0x3797: 0x8bf, - 0x3798: 0x8c0, 0x3799: 0x8c1, 0x379a: 0x8c2, 0x379b: 0x8c3, 0x379c: 0x8c4, 0x379d: 0x8c5, 0x379e: 0x8c6, 0x379f: 0x8c7, - 0x37a0: 0x8c8, 0x37a1: 0x8c9, 0x37a2: 0x8ca, 0x37a3: 0x8cb, 0x37a4: 0x8cc, 0x37a5: 0x8cd, 0x37a6: 0x8ce, 0x37a7: 0x8cf, - 0x37a8: 0x8d0, 0x37a9: 0x8d1, 0x37aa: 0x8d2, 0x37ab: 0x8d3, 0x37ac: 0x8d4, 0x37ad: 0x8d5, 0x37ae: 0x8d6, 0x37af: 0x8d7, - 0x37b0: 0x8d8, 0x37b1: 0x8d9, 0x37b2: 0x8da, 0x37b3: 0x8db, 0x37b4: 0x8dc, 0x37b5: 0x8dd, 0x37b6: 0x8de, 0x37b7: 0x8df, - 0x37b8: 0x8e0, 0x37b9: 0x8e1, 0x37ba: 0x8e2, 0x37bb: 0x8e3, 0x37bc: 0x8e4, 0x37bd: 0x8e5, 0x37be: 0x8e6, 0x37bf: 0x8e7, - // Block 0xdf, offset 0x37c0 - 0x37c0: 0x8e8, 0x37c1: 0x8e9, 0x37c2: 0x8ea, 0x37c3: 0x8eb, 0x37c4: 0x8ec, 0x37c5: 0x8ed, 0x37c6: 0x8ee, 0x37c7: 0x8ef, - 0x37c8: 0x8f0, 0x37c9: 0x8f1, 0x37ca: 0x8f2, 0x37cb: 0x8f3, 0x37cc: 0x8f4, 0x37cd: 0x8f5, 0x37ce: 0x8f6, 0x37cf: 0x8f7, - 0x37d0: 0x8f8, 0x37d1: 0x8f9, 0x37d2: 0x8fa, 0x37d3: 0x8fb, 0x37d4: 0x8fc, 0x37d5: 0x8fd, 0x37d6: 0x8fe, 0x37d7: 0x8ff, - 0x37d8: 0x900, 0x37d9: 0x901, 0x37da: 0x902, 0x37db: 0x903, 0x37dc: 0x904, 0x37dd: 0x905, 0x37de: 0x906, 0x37df: 0x907, - 0x37e0: 0x908, 0x37e1: 0x909, 0x37e2: 0x90a, 0x37e3: 0x90b, 0x37e4: 0x90c, 0x37e5: 0x90d, 0x37e6: 0x90e, 0x37e7: 0x90f, - 0x37e8: 0x910, 0x37e9: 0x911, 0x37ea: 0x912, 0x37eb: 0x913, 0x37ec: 0x914, 0x37ed: 0x915, 0x37ee: 0x916, 0x37ef: 0x917, - 0x37f0: 0x918, 0x37f1: 0x919, 0x37f2: 0x91a, 0x37f3: 0x91b, 0x37f4: 0x91c, 0x37f5: 0x91d, 0x37f6: 0x91e, 0x37f7: 0x91f, - 0x37f8: 0x920, 0x37f9: 0x921, 0x37fa: 0x922, 0x37fb: 0x923, 0x37fc: 0x924, 0x37fd: 0x925, 0x37fe: 0x926, 0x37ff: 0x927, - // Block 0xe0, offset 0x3800 - 0x3800: 0x928, 0x3801: 0x929, 0x3802: 0x92a, 0x3803: 0x92b, 0x3804: 0x92c, 0x3805: 0x92d, 0x3806: 0x92e, 0x3807: 0x92f, - 0x3808: 0x930, 0x3809: 0x931, 0x380a: 0x932, 0x380b: 0x933, 0x380c: 0x934, 0x380d: 0x935, 0x380e: 0x936, 0x380f: 0x937, - 0x3810: 0x938, 0x3811: 0x939, 0x3812: 0x93a, 0x3813: 0x93b, 0x3814: 0x93c, 0x3815: 0x93d, 0x3816: 0x93e, 0x3817: 0x93f, - 0x3818: 0x940, 0x3819: 0x941, 0x381a: 0x942, 0x381b: 0x943, 0x381c: 0x944, 0x381d: 0x945, 0x381e: 0x946, 0x381f: 0x947, - 0x3820: 0x948, 0x3821: 0x949, 0x3822: 0x94a, 0x3823: 0x94b, 0x3824: 0x94c, 0x3825: 0x94d, 0x3826: 0x94e, 0x3827: 0x94f, - 0x3828: 0x950, 0x3829: 0x951, 0x382a: 0x952, 0x382b: 0x953, 0x382c: 0x954, 0x382d: 0x955, 0x382e: 0x956, 0x382f: 0x957, - 0x3830: 0x958, 0x3831: 0x959, 0x3832: 0x95a, 0x3833: 0x95b, 0x3834: 0x95c, 0x3835: 0x95d, 0x3836: 0x95e, 0x3837: 0x95f, - 0x3838: 0x960, 0x3839: 0x961, 0x383a: 0x962, 0x383b: 0x963, 0x383c: 0x964, 0x383d: 0x965, 0x383e: 0x966, 0x383f: 0x967, - // Block 0xe1, offset 0x3840 - 0x3840: 0x968, 0x3841: 0x969, 0x3842: 0x96a, 0x3843: 0x96b, 0x3844: 0x96c, 0x3845: 0x96d, 0x3846: 0x96e, 0x3847: 0x96f, - 0x3848: 0x970, 0x3849: 0x971, 0x384a: 0x972, 0x384b: 0x973, 0x384c: 0x974, 0x384d: 0x975, 0x384e: 0x976, 0x384f: 0x977, - 0x3850: 0x978, 0x3851: 0x979, 0x3852: 0x97a, 0x3853: 0x97b, 0x3854: 0x97c, 0x3855: 0x97d, 0x3856: 0x97e, 0x3857: 0x97f, - 0x3858: 0x980, 0x3859: 0x981, 0x385a: 0x982, 0x385b: 0x983, 0x385c: 0x984, 0x385d: 0x985, 0x385e: 0x986, 0x385f: 0x987, - 0x3860: 0x988, 0x3861: 0x989, 0x3862: 0x98a, 0x3863: 0x98b, 0x3864: 0x98c, 0x3865: 0x98d, 0x3866: 0x98e, 0x3867: 0x98f, - 0x3868: 0x990, 0x3869: 0x991, 0x386a: 0x992, 0x386b: 0x993, 0x386c: 0x994, 0x386d: 0x995, 0x386e: 0x996, 0x386f: 0x997, - 0x3870: 0x998, 0x3871: 0x999, 0x3872: 0x99a, 0x3873: 0x99b, 0x3874: 0x99c, 0x3875: 0x99d, 0x3876: 0x99e, 0x3877: 0x99f, - 0x3878: 0x9a0, 0x3879: 0x9a1, 0x387a: 0x9a2, 0x387b: 0x9a3, 0x387c: 0x9a4, 0x387d: 0x9a5, 0x387e: 0x9a6, 0x387f: 0x9a7, - // Block 0xe2, offset 0x3880 - 0x3880: 0x9a8, 0x3881: 0x9a9, 0x3882: 0x9aa, 0x3883: 0x9ab, 0x3884: 0x9ac, 0x3885: 0x9ad, 0x3886: 0x9ae, 0x3887: 0x9af, - 0x3888: 0x9b0, 0x3889: 0x9b1, 0x388a: 0x9b2, 0x388b: 0x9b3, 0x388c: 0x9b4, 0x388d: 0x9b5, 0x388e: 0x9b6, 0x388f: 0x9b7, - 0x3890: 0x9b8, 0x3891: 0x9b9, 0x3892: 0x9ba, 0x3893: 0x9bb, 0x3894: 0x9bc, 0x3895: 0x9bd, 0x3896: 0x9be, 0x3897: 0x9bf, - 0x3898: 0x9c0, 0x3899: 0x9c1, 0x389a: 0x9c2, 0x389b: 0x9c3, 0x389c: 0x9c4, 0x389d: 0x9c5, 0x389e: 0x9c6, 0x389f: 0x9c7, - 0x38a0: 0x9c8, 0x38a1: 0x9c9, 0x38a2: 0x9ca, 0x38a3: 0x9cb, 0x38a4: 0x9cc, 0x38a5: 0x9cd, 0x38a6: 0x9ce, 0x38a7: 0x9cf, - 0x38a8: 0x9d0, 0x38a9: 0x9d1, 0x38aa: 0x9d2, 0x38ab: 0x9d3, 0x38ac: 0x9d4, 0x38ad: 0x9d5, 0x38ae: 0x9d6, 0x38af: 0x9d7, - 0x38b0: 0x9d8, 0x38b1: 0x9d9, 0x38b2: 0x9da, 0x38b3: 0x9db, 0x38b4: 0x9dc, 0x38b5: 0x9dd, 0x38b6: 0x9de, 0x38b7: 0x9df, - 0x38b8: 0x9e0, 0x38b9: 0x9e1, 0x38ba: 0x9e2, 0x38bb: 0x9e3, 0x38bc: 0x9e4, 0x38bd: 0x9e5, 0x38be: 0x9e6, 0x38bf: 0x9e7, - // Block 0xe3, offset 0x38c0 - 0x38c0: 0x9e8, 0x38c1: 0x9e9, 0x38c2: 0x9ea, 0x38c3: 0x9eb, 0x38c4: 0x9ec, 0x38c5: 0x9ed, 0x38c6: 0x9ee, 0x38c7: 0x9ef, - 0x38c8: 0x9f0, 0x38c9: 0x9f1, 0x38ca: 0x9f2, 0x38cb: 0x9f3, 0x38cc: 0x9f4, 0x38cd: 0x9f5, 0x38ce: 0x9f6, 0x38cf: 0x9f7, - 0x38d0: 0x9f8, 0x38d1: 0x9f9, 0x38d2: 0x9fa, 0x38d3: 0x9fb, 0x38d4: 0x9fc, 0x38d5: 0x9fd, 0x38d6: 0x9fe, 0x38d7: 0x9ff, - 0x38d8: 0xa00, 0x38d9: 0xa01, 0x38da: 0xa02, 0x38db: 0xa03, 0x38dc: 0xa04, 0x38dd: 0xa05, 0x38de: 0xa06, 0x38df: 0xa07, - 0x38e0: 0xa08, 0x38e1: 0xa09, 0x38e2: 0xa0a, 0x38e3: 0xa0b, 0x38e4: 0xa0c, 0x38e5: 0xa0d, 0x38e6: 0xa0e, 0x38e7: 0xa0f, - 0x38e8: 0xa10, 0x38e9: 0xa11, 0x38ea: 0xa12, 0x38eb: 0xa13, 0x38ec: 0xa14, 0x38ed: 0xa15, 0x38ee: 0xa16, 0x38ef: 0xa17, - 0x38f0: 0xa18, 0x38f1: 0xa19, 0x38f2: 0xa1a, 0x38f3: 0xa1b, 0x38f4: 0xa1c, 0x38f5: 0xa1d, 0x38f6: 0xa1e, 0x38f7: 0xa1f, - 0x38f8: 0xa20, 0x38f9: 0xa21, 0x38fa: 0xa22, 0x38fb: 0xa23, 0x38fc: 0xa24, 0x38fd: 0xa25, 0x38fe: 0xa26, 0x38ff: 0xa27, - // Block 0xe4, offset 0x3900 - 0x3900: 0xa28, 0x3901: 0xa29, 0x3902: 0xa2a, 0x3903: 0xa2b, 0x3904: 0xa2c, 0x3905: 0xa2d, 0x3906: 0xa2e, 0x3907: 0xa2f, - 0x3908: 0xa30, 0x3909: 0xa31, 0x390a: 0xa32, 0x390b: 0xa33, 0x390c: 0xa34, 0x390d: 0xa35, 0x390e: 0xa36, 0x390f: 0xa37, - 0x3910: 0xa38, 0x3911: 0xa39, 0x3912: 0xa3a, 0x3913: 0xa3b, 0x3914: 0xa3c, 0x3915: 0xa3d, 0x3916: 0xa3e, 0x3917: 0xa3f, - 0x3918: 0xa40, 0x3919: 0xa41, 0x391a: 0xa42, 0x391b: 0xa43, 0x391c: 0xa44, 0x391d: 0xa45, 0x391e: 0xa46, 0x391f: 0xa47, - 0x3920: 0xa48, 0x3921: 0xa49, 0x3922: 0xa4a, 0x3923: 0xa4b, 0x3924: 0xa4c, 0x3925: 0xa4d, 0x3926: 0xa4e, 0x3927: 0xa4f, - 0x3928: 0xa50, 0x3929: 0xa51, 0x392a: 0xa52, 0x392b: 0xa53, 0x392c: 0xa54, 0x392d: 0xa55, 0x392e: 0xa56, 0x392f: 0xa57, - 0x3930: 0xa58, 0x3931: 0xa59, 0x3932: 0xa5a, 0x3933: 0xa5b, 0x3934: 0xa5c, 0x3935: 0xa5d, 0x3936: 0xa5e, 0x3937: 0xa5f, - 0x3938: 0xa60, 0x3939: 0xa61, 0x393a: 0xa62, 0x393b: 0xa63, 0x393c: 0xa64, 0x393d: 0xa65, 0x393e: 0xa66, 0x393f: 0xa67, - // Block 0xe5, offset 0x3940 - 0x3940: 0xa68, 0x3941: 0xa69, 0x3942: 0xa6a, 0x3943: 0xa6b, 0x3944: 0xa6c, 0x3945: 0xa6d, 0x3946: 0xa6e, 0x3947: 0xa6f, - 0x3948: 0xa70, 0x3949: 0xa71, 0x394a: 0xa72, 0x394b: 0xa73, 0x394c: 0xa74, 0x394d: 0xa75, 0x394e: 0xa76, 0x394f: 0xa77, - 0x3950: 0xa78, 0x3951: 0xa79, 0x3952: 0xa7a, 0x3953: 0xa7b, 0x3954: 0xa7c, 0x3955: 0xa7d, 0x3956: 0xa7e, 0x3957: 0xa7f, - 0x3958: 0xa80, 0x3959: 0xa81, 0x395a: 0xa82, 0x395b: 0xa83, 0x395e: 0xa84, - 0x3961: 0xa85, 0x3962: 0xa86, - 0x3968: 0xa87, 0x396a: 0xa88, - 0x397a: 0xa89, 0x397b: 0xa8a, 0x397e: 0xa8b, - // Block 0xe6, offset 0x3980 - 0x3981: 0xa8c, 0x3982: 0xa8d, 0x3983: 0xa8e, 0x3984: 0xa8f, - 0x3988: 0xa90, 0x398b: 0xa91, 0x398c: 0xa92, 0x398d: 0xa93, 0x398f: 0xa94, - 0x3990: 0xa95, 0x3992: 0xa96, 0x3993: 0xa97, 0x3994: 0xa98, 0x3997: 0xa99, - 0x3998: 0xa9a, 0x399a: 0xa9b, 0x399b: 0xa9c, - // Block 0xe7, offset 0x39c0 - 0x39e0: 0xa9d, 0x39e1: 0xa9e, 0x39e2: 0xa9f, 0x39e3: 0xaa0, 0x39e4: 0xaa1, 0x39e5: 0xaa2, 0x39e6: 0xaa3, 0x39e7: 0xaa4, - 0x39e8: 0xaa5, - // Block 0xe8, offset 0x3a00 - 0x3a10: 0x09, 0x3a11: 0x0a, 0x3a12: 0x0b, 0x3a13: 0x0c, 0x3a16: 0x0d, - 0x3a1b: 0x0e, 0x3a1d: 0x0f, 0x3a1e: 0x10, 0x3a1f: 0xd8, - 0x3a20: 0xd9, 0x3a21: 0xda, 0x3a22: 0xdb, 0x3a23: 0xdc, 0x3a24: 0xdd, 0x3a25: 0xde, 0x3a26: 0xdf, 0x3a27: 0xe0, - 0x3a28: 0xe1, 0x3a29: 0xe2, 0x3a2a: 0xe3, 0x3a2b: 0xe4, 0x3a2f: 0xe5, - // Block 0xe9, offset 0x3a40 - 0x3a42: 0x01, 0x3a43: 0x618, 0x3a44: 0x619, 0x3a45: 0x61a, 0x3a46: 0x05, 0x3a47: 0x61b, - 0x3a48: 0x61c, 0x3a49: 0x08, 0x3a4a: 0x09, 0x3a4b: 0x0a, 0x3a4c: 0x0b, 0x3a4d: 0x0c, 0x3a4e: 0x0d, 0x3a4f: 0x0e, - 0x3a50: 0x0f, 0x3a51: 0x10, 0x3a52: 0x11, 0x3a53: 0x12, 0x3a54: 0x13, 0x3a55: 0x14, 0x3a56: 0x15, 0x3a57: 0x16, - 0x3a58: 0x17, 0x3a59: 0x18, 0x3a5a: 0x19, 0x3a5b: 0x1a, 0x3a5c: 0x1b, 0x3a5d: 0x1c, 0x3a5e: 0x1d, 0x3a5f: 0x1e, - 0x3a60: 0x01, 0x3a61: 0xce, 0x3a62: 0xcf, 0x3a63: 0xd0, 0x3a64: 0xd1, 0x3a65: 0xd2, 0x3a66: 0xd3, 0x3a67: 0xd4, - 0x3a68: 0xd5, 0x3a69: 0xd6, 0x3a6a: 0x06, 0x3a6d: 0x07, 0x3a6f: 0xd7, - 0x3a70: 0xe6, 0x3a73: 0x15, - // Block 0xea, offset 0x3a80 - 0x3a80: 0x7d, 0x3a81: 0x7e, 0x3a82: 0x7f, 0x3a83: 0x80, 0x3a84: 0x81, 0x3a85: 0x82, 0x3a86: 0x83, 0x3a87: 0x84, - 0x3a88: 0x85, 0x3a89: 0x86, 0x3a8a: 0x87, 0x3a8b: 0x88, 0x3a8c: 0x89, 0x3a8d: 0x8a, 0x3a8e: 0x8b, 0x3a8f: 0x8c, - 0x3a90: 0x8d, 0x3a91: 0x8e, 0x3a92: 0x8f, 0x3a93: 0x90, 0x3a94: 0x91, 0x3a95: 0x92, 0x3a96: 0x93, 0x3a97: 0x94, - 0x3a98: 0x95, 0x3a99: 0x96, 0x3a9a: 0x97, 0x3a9b: 0x98, 0x3a9c: 0x99, 0x3a9d: 0x9a, 0x3a9e: 0x9b, 0x3a9f: 0x9c, - 0x3aa0: 0x9d, 0x3aa1: 0x9e, 0x3aa2: 0x9f, 0x3aa3: 0xa0, 0x3aa4: 0xa1, 0x3aa5: 0xa2, 0x3aa6: 0xa3, 0x3aa7: 0xa4, - 0x3aa8: 0xa5, 0x3aa9: 0xa6, 0x3aaa: 0xa7, 0x3aab: 0xa8, 0x3aac: 0xa9, 0x3aad: 0xaa, - 0x3ab0: 0xab, 0x3ab1: 0xac, 0x3ab2: 0xad, 0x3ab3: 0xae, 0x3ab4: 0xaf, 0x3ab5: 0xb0, 0x3ab6: 0xb1, 0x3ab7: 0xb2, - 0x3ab8: 0xb3, 0x3aba: 0xaa6, 0x3abb: 0xaa7, 0x3abc: 0xaa8, 0x3abd: 0xaa9, 0x3abe: 0xaaa, 0x3abf: 0xaab, - // Block 0xeb, offset 0x3ac0 - 0x3ac0: 0xaac, 0x3ac1: 0xbb, 0x3ac2: 0xbc, 0x3ac3: 0xbd, 0x3ac4: 0xbe, 0x3ac5: 0xbf, 0x3ac6: 0xaad, 0x3ac7: 0xc1, - 0x3ac8: 0xaae, 0x3ac9: 0xaaf, 0x3aca: 0xab0, 0x3acb: 0xab1, 0x3acc: 0xc6, 0x3acd: 0xab2, 0x3ace: 0xc8, 0x3acf: 0xab3, - 0x3ad0: 0xab4, 0x3ad1: 0xab5, 0x3ad2: 0xab6, 0x3ad3: 0xab7, 0x3ad4: 0xab8, 0x3ad5: 0xab9, 0x3ad6: 0xaba, 0x3ad7: 0xabb, - 0x3ad8: 0xabc, 0x3ad9: 0xabd, 0x3ada: 0xabe, 0x3adb: 0xabf, 0x3adc: 0xac0, 0x3add: 0xac1, 0x3ade: 0xac2, 0x3adf: 0xac3, - 0x3ae0: 0xac4, 0x3ae1: 0xac5, 0x3ae2: 0xac6, 0x3ae3: 0xac7, 0x3ae4: 0xac8, 0x3ae5: 0xac9, 0x3ae6: 0xaca, 0x3ae7: 0xacb, - 0x3ae8: 0xacc, 0x3ae9: 0xacd, 0x3aea: 0xace, 0x3aeb: 0xacf, 0x3aec: 0xad0, 0x3aed: 0xad1, 0x3aee: 0xad2, 0x3aef: 0xad3, - 0x3af0: 0xad4, 0x3af1: 0xad5, 0x3af2: 0xad6, 0x3af3: 0xad7, 0x3af4: 0xad8, 0x3af5: 0xad9, 0x3af6: 0xada, 0x3af7: 0xadb, - 0x3af8: 0xadc, 0x3af9: 0xadd, 0x3afa: 0xade, 0x3afb: 0xadf, 0x3afc: 0xae0, 0x3afd: 0xae1, 0x3afe: 0xae2, 0x3aff: 0xae3, - // Block 0xec, offset 0x3b00 - 0x3b00: 0xae4, 0x3b01: 0xae5, 0x3b02: 0xae6, 0x3b03: 0xae7, 0x3b04: 0xae8, 0x3b05: 0xae9, 0x3b06: 0xaea, 0x3b07: 0xaeb, - 0x3b08: 0xaec, 0x3b09: 0xaed, 0x3b0a: 0xaee, 0x3b0b: 0xaef, 0x3b0c: 0xaf0, 0x3b0d: 0xaf1, 0x3b0e: 0xaf2, 0x3b0f: 0xaf3, - 0x3b10: 0xaf4, 0x3b11: 0xaf5, 0x3b12: 0xaf6, 0x3b13: 0xaf7, 0x3b14: 0xaf8, 0x3b15: 0xaf9, 0x3b16: 0xafa, 0x3b17: 0xafb, - 0x3b18: 0xafc, 0x3b19: 0xafd, 0x3b1a: 0xafe, 0x3b1b: 0xaff, 0x3b1c: 0xb00, 0x3b1d: 0xb01, 0x3b1e: 0xb02, 0x3b1f: 0xb03, - 0x3b20: 0xb04, 0x3b21: 0xb05, 0x3b22: 0xb06, 0x3b23: 0xb07, 0x3b24: 0xb08, 0x3b25: 0xb09, 0x3b26: 0xb0a, 0x3b27: 0xb0b, - 0x3b28: 0xb0c, 0x3b29: 0xb0d, 0x3b2a: 0xb0e, 0x3b2b: 0xb0f, 0x3b2c: 0xb10, 0x3b2d: 0xb11, 0x3b2e: 0xb12, 0x3b2f: 0xb13, - 0x3b30: 0xb14, 0x3b31: 0xb15, 0x3b32: 0xb16, 0x3b33: 0xb17, 0x3b34: 0xb18, 0x3b35: 0xb19, 0x3b36: 0xb1a, 0x3b37: 0xca, - 0x3b38: 0xb1b, 0x3b39: 0xb1c, 0x3b3a: 0xb1d, 0x3b3b: 0xb1e, 0x3b3c: 0xb1f, 0x3b3d: 0xb20, 0x3b3e: 0xb21, 0x3b3f: 0xb22, - // Block 0xed, offset 0x3b40 - 0x3b40: 0xb23, 0x3b41: 0xb24, 0x3b42: 0xb25, 0x3b43: 0xb26, 0x3b44: 0xb27, 0x3b45: 0xb28, 0x3b46: 0xb29, 0x3b47: 0xb2a, - 0x3b48: 0xb2b, 0x3b49: 0xb2c, 0x3b4a: 0xb2d, 0x3b4b: 0xb2e, 0x3b4c: 0xb2f, 0x3b4d: 0xb30, 0x3b4e: 0xb31, 0x3b4f: 0xb32, - 0x3b50: 0xb33, 0x3b51: 0xb34, 0x3b52: 0xb35, 0x3b53: 0xb36, 0x3b54: 0xb37, 0x3b55: 0xb38, 0x3b56: 0xb39, 0x3b57: 0xb3a, - 0x3b58: 0xb3b, 0x3b59: 0xb3c, 0x3b5a: 0xb3d, 0x3b5b: 0xb3e, 0x3b5c: 0xb3f, 0x3b5d: 0xb40, 0x3b5e: 0xb41, 0x3b5f: 0xb42, - 0x3b60: 0xb43, 0x3b61: 0xb44, 0x3b62: 0xb45, 0x3b63: 0xb46, 0x3b64: 0xb47, 0x3b65: 0xb48, 0x3b66: 0xb49, 0x3b67: 0xb4a, - 0x3b68: 0xb4b, 0x3b69: 0xb4c, 0x3b6a: 0xb4d, 0x3b6b: 0xb4e, 0x3b6c: 0xb4f, 0x3b6d: 0xb50, 0x3b6e: 0xb51, 0x3b6f: 0xb52, - 0x3b70: 0xb53, 0x3b71: 0xb54, 0x3b72: 0xb55, 0x3b73: 0xb56, 0x3b74: 0xb57, 0x3b75: 0xb58, 0x3b76: 0xb59, 0x3b77: 0xb5a, - 0x3b78: 0xb5b, 0x3b79: 0xb5c, 0x3b7a: 0xb5d, 0x3b7b: 0xb5e, 0x3b7c: 0xb5f, 0x3b7d: 0xb60, 0x3b7e: 0xb61, 0x3b7f: 0xb62, - // Block 0xee, offset 0x3b80 - 0x3b80: 0xb63, 0x3b81: 0xb64, 0x3b82: 0xb65, 0x3b83: 0xb66, 0x3b84: 0xb67, 0x3b85: 0xb68, 0x3b86: 0xb69, 0x3b87: 0xb6a, - 0x3b88: 0xb6b, 0x3b89: 0xb6c, 0x3b8a: 0xb6d, 0x3b8b: 0xb6e, 0x3b8c: 0xb6f, 0x3b8d: 0xb70, 0x3b8e: 0xb71, 0x3b8f: 0xb72, - 0x3b90: 0xb73, 0x3b91: 0xb74, 0x3b92: 0xb75, 0x3b93: 0xb76, 0x3b94: 0xb77, 0x3b95: 0xb78, 0x3b96: 0xb79, 0x3b97: 0xb7a, - 0x3b98: 0xb7b, 0x3b99: 0xb7c, 0x3b9a: 0xb7d, 0x3b9b: 0xb7e, 0x3b9c: 0xb7f, 0x3b9d: 0xb80, 0x3b9e: 0xb81, 0x3b9f: 0xb82, - 0x3ba0: 0xb83, 0x3ba1: 0xb84, 0x3ba2: 0xb85, 0x3ba3: 0xb86, 0x3ba4: 0xb87, 0x3ba5: 0xb88, 0x3ba6: 0xb89, 0x3ba7: 0xb8a, - 0x3ba8: 0xb8b, 0x3ba9: 0xb8c, 0x3baa: 0xb8d, 0x3bab: 0xb8e, 0x3bac: 0xb8f, 0x3bad: 0xb90, 0x3bae: 0xb91, 0x3baf: 0xb92, - 0x3bb0: 0xb93, 0x3bb1: 0xb94, 0x3bb2: 0xb95, 0x3bb3: 0xb96, 0x3bb4: 0xb97, 0x3bb5: 0xb98, 0x3bb6: 0xb99, 0x3bb7: 0xb9a, - 0x3bb8: 0xb9b, 0x3bb9: 0xb9c, 0x3bba: 0xb9d, 0x3bbb: 0xb9e, 0x3bbc: 0xb9f, 0x3bbd: 0xba0, 0x3bbe: 0xba1, 0x3bbf: 0xba2, - // Block 0xef, offset 0x3bc0 - 0x3bc0: 0xba3, 0x3bc1: 0xba4, 0x3bc2: 0xba5, 0x3bc3: 0xba6, 0x3bc4: 0xba7, 0x3bc5: 0xba8, 0x3bc6: 0xba9, 0x3bc7: 0xbaa, - 0x3bc8: 0xbab, 0x3bc9: 0xbac, 0x3bca: 0xbad, 0x3bcb: 0xbae, 0x3bcc: 0xbaf, 0x3bcd: 0xbb0, 0x3bce: 0xbb1, 0x3bcf: 0xbb2, - 0x3bd0: 0xbb3, 0x3bd1: 0xbb4, 0x3bd2: 0xbb5, 0x3bd3: 0xbb6, 0x3bd4: 0xbb7, 0x3bd5: 0xbb8, 0x3bd6: 0xbb9, 0x3bd7: 0xbba, - 0x3bd8: 0xbbb, 0x3bd9: 0xbbc, 0x3bda: 0xbbd, 0x3bdb: 0xbbe, 0x3bdc: 0xbbf, 0x3bdd: 0xbc0, 0x3bde: 0xbc1, 0x3bdf: 0xbc2, - 0x3be0: 0xbc3, 0x3be1: 0xbc4, 0x3be2: 0xbc5, 0x3be3: 0xbc6, 0x3be4: 0xbc7, 0x3be5: 0xbc8, 0x3be6: 0xbc9, 0x3be7: 0xbca, - 0x3be8: 0xbcb, 0x3be9: 0xbcc, 0x3bea: 0xbcd, 0x3beb: 0xbce, 0x3bec: 0xbcf, 0x3bed: 0xbd0, 0x3bee: 0xbd1, 0x3bef: 0xbd2, - 0x3bf0: 0xbd3, 0x3bf1: 0xbd4, 0x3bf2: 0xbd5, 0x3bf3: 0xbd6, 0x3bf4: 0xbd7, 0x3bf5: 0xbd8, 0x3bf6: 0xbd9, 0x3bf7: 0xbda, - 0x3bf8: 0xbdb, 0x3bf9: 0xbdc, 0x3bfa: 0xbdd, 0x3bfb: 0xbde, 0x3bfc: 0xbdf, 0x3bfd: 0xbe0, 0x3bfe: 0xbe1, 0x3bff: 0xbe2, - // Block 0xf0, offset 0x3c00 - 0x3c00: 0xbe3, 0x3c01: 0xbe4, 0x3c02: 0xbe5, 0x3c03: 0xbe6, 0x3c04: 0xbe7, 0x3c05: 0xbe8, 0x3c06: 0xbe9, 0x3c07: 0xbea, - 0x3c08: 0xbeb, 0x3c09: 0xbec, 0x3c0a: 0xbed, 0x3c0b: 0xbee, 0x3c0c: 0xbef, 0x3c0d: 0xbf0, 0x3c0e: 0xbf1, 0x3c0f: 0xbf2, - 0x3c10: 0xbf3, 0x3c11: 0xbf4, 0x3c12: 0xbf5, 0x3c13: 0xbf6, 0x3c14: 0xbf7, 0x3c15: 0xbf8, 0x3c16: 0xbf9, 0x3c17: 0xbfa, - 0x3c18: 0xbfb, 0x3c19: 0xbfc, 0x3c1a: 0xbfd, 0x3c1b: 0xbfe, 0x3c1c: 0xbff, 0x3c1d: 0xc00, 0x3c1e: 0xc01, 0x3c1f: 0xc02, - 0x3c20: 0xc03, 0x3c21: 0xc04, 0x3c22: 0xc05, 0x3c23: 0xc06, 0x3c24: 0xc07, 0x3c25: 0xc08, 0x3c26: 0xc09, 0x3c27: 0xc0a, - 0x3c28: 0xc0b, 0x3c29: 0xc0c, 0x3c2a: 0xc0d, 0x3c2b: 0xc0e, 0x3c2c: 0xc0f, 0x3c2d: 0xc10, 0x3c2e: 0xc11, 0x3c2f: 0xc12, - 0x3c30: 0xc13, 0x3c31: 0xc14, 0x3c32: 0xc15, 0x3c33: 0xc16, 0x3c34: 0xc17, 0x3c35: 0xc18, 0x3c36: 0xc19, 0x3c37: 0xc1a, - 0x3c38: 0xc1b, 0x3c39: 0xc1c, 0x3c3a: 0xc1d, 0x3c3b: 0xc1e, 0x3c3c: 0xc1f, 0x3c3d: 0xc20, 0x3c3e: 0xc21, 0x3c3f: 0xc22, - // Block 0xf1, offset 0x3c40 - 0x3c40: 0xc23, 0x3c41: 0xc24, 0x3c42: 0xc25, 0x3c43: 0xc26, 0x3c44: 0xc27, 0x3c45: 0xc28, 0x3c46: 0xc29, 0x3c47: 0xc2a, - 0x3c48: 0xc2b, 0x3c49: 0xc2c, 0x3c4a: 0xc2d, 0x3c4b: 0xc2e, 0x3c4c: 0xc2f, 0x3c4d: 0xc30, 0x3c4e: 0xc31, 0x3c4f: 0xc32, - 0x3c50: 0xc33, 0x3c51: 0xc34, 0x3c52: 0xc35, 0x3c53: 0xc36, 0x3c54: 0xc37, 0x3c55: 0xc38, 0x3c56: 0xc39, 0x3c57: 0xc3a, - 0x3c58: 0xc3b, 0x3c59: 0xc3c, 0x3c5a: 0xc3d, 0x3c5b: 0xc3e, 0x3c5c: 0xc3f, 0x3c5d: 0xc40, 0x3c5e: 0xc41, 0x3c5f: 0xc42, - 0x3c60: 0xc43, 0x3c61: 0xc44, 0x3c62: 0xc45, 0x3c63: 0xc46, 0x3c64: 0xc47, 0x3c65: 0xc48, 0x3c66: 0xc49, 0x3c67: 0xc4a, - 0x3c68: 0xc4b, 0x3c69: 0xc4c, 0x3c6a: 0xc4d, 0x3c6b: 0xc4e, 0x3c6c: 0xc4f, 0x3c6d: 0xc50, 0x3c6e: 0xc51, 0x3c6f: 0xc52, - 0x3c70: 0xc53, 0x3c71: 0xc54, 0x3c72: 0xc55, 0x3c73: 0xc56, 0x3c74: 0xc57, 0x3c75: 0xc58, 0x3c76: 0xc59, 0x3c77: 0xc5a, - 0x3c78: 0xc5b, 0x3c79: 0xc5c, 0x3c7a: 0xc5d, 0x3c7b: 0xc5e, 0x3c7c: 0xc5f, 0x3c7d: 0xc60, 0x3c7e: 0xc61, 0x3c7f: 0xc62, - // Block 0xf2, offset 0x3c80 - 0x3ca4: 0xc63, 0x3ca5: 0xc64, 0x3ca6: 0xc65, 0x3ca7: 0xc66, - 0x3ca8: 0xc67, 0x3ca9: 0xc68, 0x3caa: 0xc69, 0x3cab: 0xc6a, 0x3cac: 0x103, 0x3cad: 0x104, 0x3cae: 0x105, 0x3caf: 0x106, - 0x3cb0: 0x107, 0x3cb1: 0x108, 0x3cb2: 0x109, 0x3cb3: 0x10a, 0x3cb4: 0x10b, 0x3cb5: 0x10c, 0x3cb6: 0x10d, 0x3cb7: 0x10e, - 0x3cb8: 0x10f, 0x3cb9: 0x110, 0x3cba: 0x111, 0x3cbb: 0x112, 0x3cbc: 0x113, 0x3cbd: 0x114, 0x3cbe: 0x115, 0x3cbf: 0x116, - // Block 0xf3, offset 0x3cc0 - 0x3cc0: 0x18b, 0x3cc1: 0x18c, 0x3cc2: 0x18d, 0x3cc3: 0x18e, 0x3cc4: 0x18f, 0x3cc5: 0x190, 0x3cc6: 0x191, 0x3cc7: 0x192, - 0x3cc8: 0xc6b, 0x3cc9: 0xc6c, 0x3ccc: 0x195, 0x3ccd: 0x196, 0x3cce: 0x197, 0x3ccf: 0x198, - 0x3cd0: 0x199, 0x3cd1: 0x19a, 0x3cd2: 0x19b, 0x3cd3: 0x19c, 0x3cd4: 0x19d, 0x3cd5: 0x19e, 0x3cd7: 0x19f, - 0x3cd8: 0x1a0, 0x3cd9: 0x1a1, 0x3cda: 0x1a2, 0x3cdb: 0x1a3, 0x3cdc: 0x1a4, 0x3cdd: 0x1a5, - // Block 0xf4, offset 0x3d00 - 0x3d00: 0xc6d, 0x3d01: 0xc6e, 0x3d02: 0xc6f, 0x3d03: 0xc70, 0x3d04: 0xc71, 0x3d05: 0xc72, 0x3d06: 0xc73, 0x3d07: 0xc74, - 0x3d08: 0xc75, 0x3d09: 0xc76, 0x3d0a: 0xc77, 0x3d0b: 0xc78, 0x3d0c: 0xc79, 0x3d0d: 0xc7a, 0x3d0e: 0xc7b, 0x3d0f: 0xc7c, - 0x3d10: 0xc7d, 0x3d11: 0xc7e, 0x3d12: 0xc7f, 0x3d13: 0xc80, 0x3d14: 0xc81, 0x3d15: 0xc82, 0x3d16: 0xc83, 0x3d17: 0xc84, - 0x3d18: 0xc85, 0x3d19: 0xc86, 0x3d1a: 0xc87, 0x3d1b: 0xc88, 0x3d1c: 0xc89, 0x3d1d: 0xc8a, 0x3d1e: 0xc8b, 0x3d1f: 0xc8c, - 0x3d20: 0xc8d, 0x3d21: 0xc8e, 0x3d22: 0xc8f, 0x3d23: 0xc90, 0x3d24: 0xc91, 0x3d25: 0xc92, 0x3d26: 0xc93, 0x3d27: 0xc94, - 0x3d28: 0xc95, 0x3d29: 0xc96, 0x3d2a: 0xc97, 0x3d2b: 0xc98, 0x3d2c: 0xc99, 0x3d2d: 0xc9a, 0x3d2e: 0xc9b, 0x3d2f: 0xc9c, - 0x3d30: 0xc9d, 0x3d31: 0xc9e, 0x3d32: 0xc9f, 0x3d33: 0xca0, 0x3d34: 0xca1, 0x3d35: 0xca2, 0x3d36: 0xca3, 0x3d37: 0xca4, - 0x3d38: 0xca5, 0x3d39: 0xca6, 0x3d3a: 0xca7, 0x3d3b: 0xca8, 0x3d3c: 0xca9, 0x3d3d: 0xcaa, 0x3d3e: 0xcab, 0x3d3f: 0xcac, - // Block 0xf5, offset 0x3d40 - 0x3d40: 0xcad, 0x3d41: 0xcae, 0x3d42: 0xcaf, 0x3d43: 0xcb0, 0x3d44: 0xcb1, 0x3d45: 0xcb2, 0x3d46: 0xcb3, 0x3d47: 0xcb4, - 0x3d48: 0xcb5, 0x3d49: 0xcb6, 0x3d4a: 0xcb7, 0x3d4b: 0xcb8, 0x3d4c: 0xcb9, 0x3d4d: 0xcba, 0x3d4e: 0xcbb, 0x3d4f: 0xcbc, - 0x3d50: 0xcbd, 0x3d51: 0xcbe, 0x3d52: 0xcbf, 0x3d53: 0xcc0, 0x3d54: 0xcc1, 0x3d55: 0xcc2, 0x3d56: 0xcc3, 0x3d57: 0xcc4, - 0x3d58: 0xcc5, 0x3d59: 0xcc6, 0x3d5a: 0xcc7, 0x3d5b: 0xcc8, 0x3d5c: 0xcc9, 0x3d5d: 0xcca, 0x3d5e: 0xccb, 0x3d5f: 0xccc, - 0x3d60: 0xccd, 0x3d61: 0xcce, 0x3d62: 0xccf, 0x3d63: 0xcd0, 0x3d64: 0xcd1, 0x3d65: 0xcd2, 0x3d66: 0xcd3, 0x3d67: 0xcd4, - 0x3d68: 0xcd5, 0x3d69: 0xcd6, 0x3d6a: 0xcd7, 0x3d6b: 0xcd8, 0x3d6c: 0xcd9, 0x3d6d: 0xcda, 0x3d6e: 0xcdb, 0x3d6f: 0xcdc, - 0x3d70: 0xcdd, 0x3d71: 0xcde, 0x3d72: 0xcdf, 0x3d73: 0xce0, 0x3d74: 0xce1, 0x3d75: 0xce2, 0x3d76: 0xce3, 0x3d77: 0xce4, - 0x3d78: 0xce5, 0x3d79: 0xce6, 0x3d7a: 0xce7, 0x3d7b: 0xce8, 0x3d7c: 0xce9, 0x3d7d: 0xcea, 0x3d7e: 0xceb, 0x3d7f: 0xcec, - // Block 0xf6, offset 0x3d80 - 0x3d80: 0xced, 0x3d81: 0xcee, 0x3d82: 0xcef, 0x3d83: 0xcf0, 0x3d84: 0xcf1, 0x3d85: 0xcf2, 0x3d86: 0xcf3, 0x3d87: 0xcf4, - 0x3d88: 0xcf5, 0x3d89: 0xcf6, 0x3d8a: 0xcf7, 0x3d8b: 0xcf8, 0x3d8c: 0xcf9, 0x3d8d: 0xcfa, 0x3d8e: 0xcfb, 0x3d8f: 0xcfc, - 0x3d90: 0xcfd, 0x3d91: 0xcfe, 0x3d92: 0xcff, 0x3d93: 0xd00, 0x3d94: 0xd01, 0x3d95: 0xd02, 0x3d96: 0xd03, 0x3d97: 0xd04, - 0x3d98: 0xd05, 0x3d99: 0xd06, 0x3d9a: 0xd07, 0x3d9b: 0xd08, 0x3d9c: 0xd09, 0x3d9d: 0xd0a, 0x3d9e: 0xd0b, 0x3d9f: 0xd0c, - 0x3da0: 0xd0d, 0x3da1: 0xd0e, 0x3da2: 0xd0f, 0x3da3: 0xd10, 0x3da4: 0xd11, 0x3da5: 0xd12, 0x3da6: 0xd13, 0x3da7: 0xd14, - 0x3da8: 0xd15, 0x3da9: 0xd16, 0x3daa: 0xd17, 0x3dab: 0xd18, 0x3dac: 0xd19, 0x3dad: 0xd1a, 0x3dae: 0xd1b, 0x3daf: 0xd1c, - 0x3db0: 0xd1d, 0x3db1: 0xd1e, 0x3db2: 0xd1f, 0x3db3: 0xd20, 0x3db4: 0xd21, 0x3db5: 0xd22, 0x3db6: 0xd23, 0x3db7: 0xd24, - 0x3db8: 0xd25, 0x3db9: 0xd26, 0x3dba: 0xd27, 0x3dbb: 0xd28, 0x3dbc: 0xd29, 0x3dbd: 0xd2a, 0x3dbe: 0xd2b, 0x3dbf: 0xd2c, - // Block 0xf7, offset 0x3dc0 - 0x3dc0: 0xd2d, 0x3dc1: 0xd2e, 0x3dc2: 0xd2f, 0x3dc3: 0xd30, 0x3dc4: 0xd31, 0x3dc5: 0xd32, 0x3dc6: 0xd33, 0x3dc7: 0xd34, - 0x3dc8: 0xd35, 0x3dc9: 0xd36, 0x3dca: 0xd37, 0x3dcb: 0xd38, 0x3dcc: 0xd39, 0x3dcd: 0xd3a, 0x3dce: 0xd3b, 0x3dcf: 0xd3c, - 0x3dd0: 0xd3d, 0x3dd1: 0xd3e, 0x3dd2: 0xd3f, 0x3dd3: 0xd40, 0x3dd4: 0xd41, 0x3dd5: 0xd42, 0x3dd6: 0xd43, 0x3dd7: 0xd44, - 0x3dd8: 0xd45, 0x3dd9: 0xd46, 0x3dda: 0xd47, 0x3ddb: 0xd48, 0x3ddc: 0xd49, 0x3ddd: 0xd4a, 0x3dde: 0xd4b, 0x3ddf: 0xd4c, - 0x3de0: 0xd4d, 0x3de1: 0xd4e, 0x3de2: 0xd4f, 0x3de3: 0xd50, 0x3de4: 0xd51, 0x3de5: 0xd52, 0x3de6: 0xd53, 0x3de7: 0xd54, - 0x3de8: 0xd55, 0x3de9: 0xd56, 0x3dea: 0xd57, 0x3deb: 0xd58, 0x3dec: 0xd59, 0x3ded: 0xd5a, 0x3dee: 0xd5b, 0x3def: 0xd5c, - 0x3df0: 0xd5d, 0x3df1: 0xd5e, 0x3df2: 0xd5f, 0x3df3: 0xd60, 0x3df4: 0xd61, 0x3df5: 0xd62, 0x3df6: 0xd63, 0x3df7: 0xd64, - 0x3df8: 0xd65, 0x3df9: 0xd66, 0x3dfa: 0xd67, 0x3dfb: 0xd68, 0x3dfc: 0xd69, 0x3dfd: 0xd6a, 0x3dfe: 0xd6b, 0x3dff: 0xd6c, - // Block 0xf8, offset 0x3e00 - 0x3e00: 0xd6d, 0x3e01: 0xd6e, 0x3e02: 0xd6f, 0x3e03: 0xd70, 0x3e04: 0xd71, 0x3e05: 0xd72, 0x3e06: 0xd73, 0x3e07: 0xd74, - 0x3e08: 0xd75, 0x3e09: 0xd76, 0x3e0a: 0xd77, 0x3e0b: 0xd78, 0x3e0c: 0xd79, 0x3e0d: 0xd7a, 0x3e0e: 0xd7b, 0x3e0f: 0xd7c, - 0x3e10: 0xd7d, 0x3e11: 0xd7e, 0x3e12: 0xd7f, 0x3e13: 0xd80, 0x3e14: 0xd81, 0x3e15: 0xd82, 0x3e16: 0xd83, 0x3e17: 0xd84, - 0x3e18: 0xd85, 0x3e19: 0xd86, 0x3e1a: 0xd87, 0x3e1b: 0xd88, 0x3e1c: 0xd89, 0x3e1d: 0xd8a, 0x3e1e: 0xd8b, 0x3e1f: 0xd8c, - 0x3e20: 0xd8d, 0x3e21: 0xd8e, 0x3e22: 0xd8f, 0x3e23: 0xd90, 0x3e24: 0xd91, 0x3e25: 0xd92, 0x3e26: 0xd93, 0x3e27: 0xd94, - 0x3e28: 0xd95, 0x3e29: 0xd96, 0x3e2a: 0xd97, 0x3e2b: 0xd98, 0x3e2c: 0xd99, 0x3e2d: 0xd9a, 0x3e2e: 0xd9b, 0x3e2f: 0xd9c, - 0x3e30: 0xd9d, 0x3e31: 0xd9e, 0x3e32: 0xd9f, 0x3e33: 0xda0, 0x3e34: 0xda1, 0x3e35: 0xda2, 0x3e36: 0xda3, 0x3e37: 0xda4, - 0x3e38: 0xda5, 0x3e39: 0xda6, 0x3e3a: 0xda7, 0x3e3b: 0xda8, 0x3e3c: 0xda9, 0x3e3d: 0xdaa, 0x3e3e: 0xdab, 0x3e3f: 0xdac, - // Block 0xf9, offset 0x3e40 - 0x3e40: 0xdad, 0x3e41: 0xdae, 0x3e42: 0xdaf, 0x3e43: 0xdb0, 0x3e44: 0xdb1, 0x3e45: 0xdb2, 0x3e46: 0xdb3, 0x3e47: 0xdb4, - 0x3e48: 0xdb5, 0x3e49: 0xdb6, 0x3e4a: 0xdb7, 0x3e4b: 0xdb8, 0x3e4c: 0xdb9, 0x3e4d: 0xdba, 0x3e4e: 0xdbb, 0x3e4f: 0xdbc, - 0x3e50: 0xdbd, 0x3e51: 0xdbe, 0x3e52: 0xdbf, 0x3e53: 0xdc0, 0x3e54: 0xdc1, 0x3e55: 0xdc2, 0x3e56: 0xdc3, 0x3e57: 0xdc4, - 0x3e58: 0xdc5, 0x3e59: 0xdc6, 0x3e5a: 0xdc7, 0x3e5b: 0xdc8, 0x3e5c: 0xdc9, 0x3e5d: 0xdca, 0x3e5e: 0xdcb, 0x3e5f: 0xdcc, - 0x3e60: 0xdcd, 0x3e61: 0xdce, 0x3e62: 0xdcf, 0x3e63: 0xdd0, 0x3e64: 0xdd1, 0x3e65: 0xdd2, 0x3e66: 0xdd3, 0x3e67: 0xdd4, - 0x3e68: 0xdd5, 0x3e69: 0xdd6, 0x3e6a: 0xdd7, 0x3e6b: 0xdd8, 0x3e6c: 0xdd9, 0x3e6d: 0xdda, 0x3e6e: 0xddb, 0x3e6f: 0xddc, - 0x3e70: 0xddd, 0x3e71: 0xdde, 0x3e72: 0xddf, 0x3e73: 0xde0, 0x3e74: 0xde1, 0x3e75: 0xde2, 0x3e76: 0xde3, 0x3e77: 0xde4, - 0x3e78: 0xde5, 0x3e79: 0xde6, 0x3e7a: 0xde7, 0x3e7b: 0xde8, 0x3e7c: 0xde9, 0x3e7d: 0xdea, 0x3e7e: 0xdeb, 0x3e7f: 0xdec, - // Block 0xfa, offset 0x3e80 - 0x3e80: 0xded, 0x3e81: 0xdee, 0x3e82: 0xdef, 0x3e83: 0xdf0, 0x3e84: 0xdf1, 0x3e85: 0xdf2, 0x3e86: 0xdf3, 0x3e87: 0xdf4, - 0x3e88: 0xdf5, 0x3e89: 0xdf6, 0x3e8a: 0xdf7, 0x3e8b: 0xdf8, 0x3e8c: 0xdf9, 0x3e8d: 0xdfa, 0x3e8e: 0xdfb, 0x3e8f: 0xdfc, - 0x3e90: 0xdfd, 0x3e91: 0xdfe, 0x3e92: 0xdff, 0x3e93: 0xe00, 0x3e94: 0xe01, 0x3e95: 0xe02, 0x3e96: 0xe03, 0x3e97: 0xe04, - 0x3e98: 0xe05, 0x3e99: 0xe06, 0x3e9a: 0xe07, 0x3e9b: 0xe08, 0x3e9c: 0xe09, 0x3e9d: 0xe0a, 0x3e9e: 0xe0b, 0x3e9f: 0xe0c, - 0x3ea0: 0xe0d, 0x3ea1: 0xe0e, 0x3ea2: 0xe0f, 0x3ea3: 0xe10, 0x3ea4: 0xe11, 0x3ea5: 0xe12, 0x3ea6: 0xe13, 0x3ea7: 0xe14, - 0x3ea8: 0xe15, 0x3ea9: 0xe16, 0x3eaa: 0xe17, 0x3eab: 0xe18, 0x3eac: 0xe19, 0x3ead: 0xe1a, 0x3eae: 0xe1b, 0x3eaf: 0xe1c, - 0x3eb0: 0xe1d, 0x3eb1: 0xe1e, 0x3eb2: 0xe1f, 0x3eb3: 0xe20, 0x3eb4: 0xe21, 0x3eb5: 0xe22, 0x3eb6: 0xe23, 0x3eb7: 0xe24, - 0x3eb8: 0xe25, 0x3eb9: 0xe26, 0x3eba: 0xe27, 0x3ebb: 0xe28, 0x3ebc: 0xe29, 0x3ebd: 0xe2a, 0x3ebe: 0xe2b, 0x3ebf: 0xe2c, - // Block 0xfb, offset 0x3ec0 - 0x3ec0: 0xe2d, 0x3ec1: 0xe2e, 0x3ec2: 0xe2f, 0x3ec3: 0xe30, 0x3ec4: 0xe31, 0x3ec5: 0xe32, 0x3ec6: 0xe33, 0x3ec7: 0xe34, - 0x3ec8: 0xe35, 0x3ec9: 0xe36, 0x3eca: 0xe37, 0x3ecb: 0xe38, 0x3ecc: 0xe39, 0x3ecd: 0xe3a, 0x3ece: 0xe3b, 0x3ecf: 0xe3c, - 0x3ed0: 0xe3d, 0x3ed1: 0xe3e, 0x3ed2: 0xe3f, 0x3ed3: 0xe40, 0x3ed4: 0xe41, 0x3ed5: 0xe42, 0x3ed6: 0xe43, 0x3ed7: 0xe44, - 0x3ed8: 0xe45, 0x3ed9: 0xe46, 0x3eda: 0xe47, 0x3edb: 0xe48, 0x3edc: 0xe49, 0x3edd: 0xe4a, 0x3ede: 0xe4b, 0x3edf: 0xe4c, - 0x3ee0: 0xe4d, 0x3ee1: 0xe4e, 0x3ee2: 0xe4f, 0x3ee3: 0xe50, 0x3ee4: 0xe51, 0x3ee5: 0xe52, 0x3ee6: 0xe53, 0x3ee7: 0xe54, - 0x3ee8: 0xe55, 0x3ee9: 0xe56, 0x3eea: 0xe57, 0x3eeb: 0xe58, 0x3eec: 0xe59, 0x3eed: 0xe5a, 0x3eee: 0xe5b, 0x3eef: 0xe5c, - 0x3ef0: 0xe5d, 0x3ef1: 0xe5e, 0x3ef2: 0xe5f, 0x3ef3: 0xe60, 0x3ef4: 0xe61, 0x3ef5: 0xe62, 0x3ef6: 0xe63, 0x3ef7: 0xe64, - 0x3ef8: 0xe65, 0x3ef9: 0xe66, 0x3efa: 0xe67, 0x3efb: 0xe68, 0x3efc: 0xe69, 0x3efd: 0xe6a, 0x3efe: 0xe6b, 0x3eff: 0xe6c, - // Block 0xfc, offset 0x3f00 - 0x3f00: 0xe6d, 0x3f01: 0xe6e, 0x3f02: 0xe6f, 0x3f03: 0xe70, 0x3f04: 0xe71, 0x3f05: 0xe72, 0x3f06: 0xe73, 0x3f07: 0xe74, - 0x3f08: 0xe75, 0x3f09: 0xe76, 0x3f0a: 0xe77, 0x3f0b: 0xe78, 0x3f0c: 0xe79, 0x3f0d: 0xe7a, 0x3f0e: 0xe7b, 0x3f0f: 0xe7c, - 0x3f10: 0xe7d, 0x3f11: 0xe7e, 0x3f12: 0xe7f, 0x3f13: 0xe80, 0x3f14: 0xe81, 0x3f15: 0xe82, 0x3f16: 0xe83, 0x3f17: 0xe84, - 0x3f18: 0xe85, 0x3f19: 0xe86, 0x3f1a: 0xe87, 0x3f1b: 0xe88, 0x3f1c: 0xe89, 0x3f1d: 0xe8a, 0x3f1e: 0xe8b, 0x3f1f: 0xe8c, - 0x3f20: 0xe8d, 0x3f21: 0xe8e, 0x3f22: 0xe8f, 0x3f23: 0xe90, 0x3f24: 0xe91, 0x3f25: 0xe92, 0x3f26: 0xe93, 0x3f27: 0xe94, - 0x3f28: 0xe95, 0x3f29: 0xe96, 0x3f2a: 0xe97, 0x3f2b: 0xe98, 0x3f2c: 0xe99, 0x3f2d: 0xe9a, 0x3f2e: 0xe9b, 0x3f2f: 0xe9c, - 0x3f30: 0xe9d, 0x3f31: 0xe9e, 0x3f32: 0xe9f, 0x3f33: 0xea0, 0x3f34: 0xea1, 0x3f35: 0xea2, 0x3f36: 0xea3, 0x3f37: 0xea4, - 0x3f38: 0xea5, 0x3f39: 0xea6, 0x3f3a: 0xea7, 0x3f3b: 0xea8, 0x3f3c: 0xea9, 0x3f3d: 0xeaa, 0x3f3e: 0xeab, 0x3f3f: 0xeac, - // Block 0xfd, offset 0x3f40 - 0x3f40: 0xead, 0x3f41: 0xeae, 0x3f42: 0xeaf, 0x3f43: 0xeb0, 0x3f44: 0xeb1, 0x3f45: 0xeb2, 0x3f46: 0xeb3, 0x3f47: 0xeb4, - 0x3f48: 0xeb5, 0x3f49: 0xeb6, 0x3f4a: 0xeb7, 0x3f4b: 0xeb8, 0x3f4c: 0xeb9, 0x3f4d: 0xeba, 0x3f4e: 0xebb, 0x3f4f: 0xebc, - 0x3f50: 0xebd, 0x3f51: 0xebe, 0x3f52: 0xebf, 0x3f53: 0xec0, 0x3f54: 0xec1, 0x3f55: 0xec2, 0x3f56: 0xec3, 0x3f57: 0xec4, - 0x3f58: 0xec5, 0x3f59: 0xec6, 0x3f5a: 0xec7, 0x3f5b: 0xec8, 0x3f5c: 0xec9, 0x3f5d: 0xeca, 0x3f5e: 0xecb, 0x3f5f: 0xecc, - 0x3f60: 0xecd, 0x3f61: 0xece, 0x3f62: 0xecf, 0x3f63: 0xed0, 0x3f64: 0xed1, 0x3f65: 0xed2, 0x3f66: 0xed3, 0x3f67: 0xed4, - 0x3f68: 0xed5, 0x3f69: 0xed6, 0x3f6a: 0xed7, 0x3f6b: 0xed8, 0x3f6c: 0xed9, 0x3f6d: 0xeda, 0x3f6e: 0xedb, 0x3f6f: 0xedc, - 0x3f70: 0xedd, 0x3f71: 0xede, 0x3f72: 0xedf, 0x3f73: 0xee0, 0x3f74: 0xee1, 0x3f75: 0xee2, 0x3f76: 0xee3, 0x3f77: 0xee4, - 0x3f78: 0xee5, 0x3f79: 0xee6, 0x3f7a: 0xee7, 0x3f7b: 0xee8, 0x3f7c: 0xee9, 0x3f7d: 0xeea, 0x3f7e: 0xeeb, 0x3f7f: 0xeec, - // Block 0xfe, offset 0x3f80 - 0x3f80: 0xeed, 0x3f81: 0xeee, 0x3f82: 0xeef, 0x3f83: 0xef0, 0x3f84: 0xef1, 0x3f85: 0xef2, 0x3f86: 0xef3, 0x3f87: 0xef4, - 0x3f88: 0xef5, 0x3f89: 0xef6, 0x3f8a: 0xef7, 0x3f8b: 0xef8, 0x3f8c: 0xef9, 0x3f8d: 0xefa, 0x3f8e: 0xefb, 0x3f8f: 0xefc, - 0x3f90: 0xefd, 0x3f91: 0xefe, 0x3f92: 0xeff, 0x3f93: 0xf00, 0x3f94: 0xf01, 0x3f95: 0xf02, 0x3f96: 0xf03, 0x3f97: 0xf04, - 0x3f98: 0xf05, 0x3f99: 0xf06, 0x3f9a: 0xf07, 0x3f9b: 0xf08, 0x3f9c: 0xf09, 0x3f9d: 0xf0a, 0x3f9e: 0xf0b, 0x3f9f: 0xf0c, - 0x3fa0: 0xf0d, 0x3fa1: 0xf0e, 0x3fa2: 0xf0f, 0x3fa3: 0xf10, 0x3fa4: 0xf11, 0x3fa5: 0xf12, 0x3fa6: 0xf13, 0x3fa7: 0xf14, - 0x3fa8: 0xf15, 0x3fa9: 0xf16, 0x3faa: 0xf17, 0x3fab: 0xf18, 0x3fac: 0xf19, 0x3fad: 0xf1a, 0x3fae: 0xf1b, 0x3faf: 0xf1c, - 0x3fb0: 0xf1d, 0x3fb1: 0xf1e, 0x3fb2: 0xf1f, 0x3fb3: 0xf20, 0x3fb4: 0xf21, 0x3fb5: 0xf22, 0x3fb6: 0xf23, 0x3fb7: 0xf24, - 0x3fb8: 0xf25, 0x3fb9: 0xf26, 0x3fba: 0xf27, 0x3fbb: 0xf28, 0x3fbc: 0xf29, 0x3fbd: 0xf2a, 0x3fbe: 0xf2b, 0x3fbf: 0xf2c, - // Block 0xff, offset 0x3fc0 - 0x3fc0: 0xf2d, 0x3fc1: 0xf2e, 0x3fc2: 0xf2f, 0x3fc3: 0xf30, 0x3fc4: 0xf31, 0x3fc5: 0xf32, 0x3fc6: 0xf33, 0x3fc7: 0xf34, - 0x3fc8: 0xf35, 0x3fc9: 0xf36, 0x3fca: 0xf37, 0x3fcb: 0xf38, 0x3fcc: 0xf39, 0x3fcd: 0xf3a, 0x3fce: 0xf3b, 0x3fcf: 0xf3c, - 0x3fd0: 0xf3d, 0x3fd1: 0xf3e, 0x3fd2: 0xf3f, 0x3fd3: 0xf40, 0x3fd4: 0xf41, 0x3fd5: 0xf42, 0x3fd6: 0xf43, 0x3fd7: 0xf44, - 0x3fd8: 0xf45, 0x3fd9: 0xf46, 0x3fda: 0xf47, 0x3fdb: 0xf48, 0x3fdc: 0xf49, 0x3fdd: 0xf4a, 0x3fde: 0xf4b, 0x3fdf: 0xf4c, - 0x3fe0: 0xf4d, - // Block 0x100, offset 0x4000 - 0x4020: 0xf4e, 0x4021: 0xf4f, 0x4022: 0xf50, 0x4023: 0xf51, 0x4024: 0xf52, 0x4025: 0xf53, 0x4026: 0xf54, 0x4027: 0xf55, - 0x4028: 0xf56, - // Block 0x101, offset 0x4040 - 0x4050: 0x09, 0x4051: 0x0a, 0x4052: 0x0b, 0x4053: 0x0c, 0x4056: 0x0d, - 0x405b: 0x0e, 0x405d: 0x0f, 0x405e: 0x10, 0x405f: 0xf1, - 0x4060: 0xf2, 0x4061: 0xf3, 0x4062: 0xf4, 0x4063: 0xf5, 0x4064: 0xf6, 0x4065: 0xf7, 0x4066: 0xf8, 0x4067: 0xf9, - 0x4068: 0xfa, 0x4069: 0xfb, 0x406a: 0xfc, 0x406b: 0xfd, 0x406f: 0xfe, - // Block 0x102, offset 0x4080 - 0x4082: 0x01, 0x4083: 0x618, 0x4084: 0x619, 0x4085: 0x61a, 0x4086: 0x05, 0x4087: 0x61b, - 0x4088: 0x61c, 0x4089: 0x08, 0x408a: 0x09, 0x408b: 0x0a, 0x408c: 0x0b, 0x408d: 0x0c, 0x408e: 0x0d, 0x408f: 0x0e, - 0x4090: 0x0f, 0x4091: 0x10, 0x4092: 0x11, 0x4093: 0x12, 0x4094: 0x13, 0x4095: 0x14, 0x4096: 0x15, 0x4097: 0x16, - 0x4098: 0x17, 0x4099: 0x18, 0x409a: 0x19, 0x409b: 0x1a, 0x409c: 0x1b, 0x409d: 0x1c, 0x409e: 0x1d, 0x409f: 0x1e, - 0x40a0: 0x01, 0x40a1: 0xce, 0x40a2: 0xe8, 0x40a3: 0xe9, 0x40a4: 0xea, 0x40a5: 0xeb, 0x40a6: 0xec, 0x40a7: 0xed, - 0x40a8: 0xee, 0x40a9: 0xef, 0x40aa: 0x06, 0x40ad: 0x07, 0x40af: 0xf0, - 0x40b0: 0xff, 0x40b3: 0x15, -} - -// mainCTEntries: 2529 entries, 10116 bytes -var mainCTEntries = [2529]struct{ L, H, N, I uint8 }{ - {0xCE, 0x1, 1, 255}, - {0xC2, 0x0, 1, 255}, - {0xB7, 0xB7, 0, 1}, - {0x87, 0x87, 0, 2}, - {0xCC, 0x0, 2, 255}, - {0x88, 0x88, 0, 2}, - {0x86, 0x86, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x88, 0x88, 0, 1}, - {0xCD, 0x1, 1, 255}, - {0xCC, 0x0, 1, 255}, - {0x81, 0x81, 0, 1}, - {0x81, 0x81, 0, 2}, - {0xCC, 0x0, 1, 255}, - {0x86, 0x86, 0, 1}, - {0xCC, 0x0, 3, 255}, - {0x8B, 0x8B, 0, 3}, - {0x88, 0x88, 0, 2}, - {0x86, 0x86, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x8F, 0x8F, 0, 1}, - {0xD9, 0x0, 1, 255}, - {0x93, 0x95, 0, 1}, - {0xD9, 0x0, 1, 255}, - {0x94, 0x94, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xA7, 0x1, 1, 255}, - {0xA6, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0x97, 0x97, 0, 2}, - {0xE0, 0x0, 2, 255}, - {0xAD, 0x1, 1, 255}, - {0xAC, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0x96, 0x97, 0, 2}, - {0xE0, 0x0, 1, 255}, - {0xAF, 0x0, 1, 255}, - {0x97, 0x97, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xAF, 0x1, 1, 255}, - {0xAE, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0x97, 0x97, 0, 2}, - {0xE0, 0x0, 1, 255}, - {0xAE, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB1, 0x0, 1, 255}, - {0x96, 0x96, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB3, 0x0, 1, 255}, - {0x95, 0x95, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB3, 0x0, 2, 255}, - {0x95, 0x96, 0, 3}, - {0x82, 0x0, 1, 2}, - {0xE0, 0x0, 1, 255}, - {0xB3, 0x0, 1, 255}, - {0x95, 0x95, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xB5, 0x1, 1, 255}, - {0xB4, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0x97, 0x97, 0, 2}, - {0xE0, 0x0, 1, 255}, - {0xB4, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB7, 0x0, 3, 255}, - {0x9F, 0x9F, 0, 4}, - {0x8F, 0x0, 1, 3}, - {0x8A, 0x8A, 0, 2}, - {0xE0, 0x0, 1, 255}, - {0xB7, 0x0, 1, 255}, - {0x8A, 0x8A, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB7, 0x0, 1, 255}, - {0x8A, 0x8A, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB8, 0x0, 1, 255}, - {0x81, 0xAE, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB8, 0x0, 1, 255}, - {0xB2, 0xB2, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xBB, 0xC, 1, 255}, - {0xBA, 0x0, 12, 255}, - {0xAD, 0xAE, 0, 26}, - {0xAA, 0xAB, 0, 24}, - {0xA7, 0xA7, 0, 23}, - {0xA5, 0xA5, 0, 22}, - {0xA1, 0xA3, 0, 19}, - {0x99, 0x9F, 0, 12}, - {0x94, 0x97, 0, 8}, - {0x8D, 0x8D, 0, 7}, - {0x8A, 0x8A, 0, 6}, - {0x87, 0x88, 0, 4}, - {0x84, 0x84, 0, 3}, - {0x81, 0x82, 0, 1}, - {0x9C, 0x9F, 0, 28}, - {0xE0, 0x0, 1, 255}, - {0xBA, 0x0, 1, 255}, - {0xB2, 0xB2, 0, 1}, - {0xEA, 0x0, 1, 255}, - {0xAA, 0x0, 1, 255}, - {0x80, 0xAF, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x7, 1, 255}, - {0xBD, 0x0, 1, 255}, - {0xB1, 0x0, 1, 255}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x2, 1, 255}, - {0xBD, 0x0, 2, 255}, - {0xB4, 0xB4, 0, 2}, - {0xB2, 0xB2, 0, 1}, - {0x80, 0x80, 0, 3}, - {0x80, 0x81, 0, 4}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x2, 1, 255}, - {0xBD, 0x0, 2, 255}, - {0xB4, 0xB4, 0, 2}, - {0xB2, 0xB2, 0, 1}, - {0x80, 0x80, 0, 3}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xAE, 0xAE, 0, 1}, - {0xF0, 0x0, 1, 255}, - {0x91, 0x0, 1, 255}, - {0x84, 0x0, 1, 255}, - {0xA7, 0xA7, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0xAC, 0x0, 1, 255}, - {0xB5, 0xB5, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xA7, 0x0, 1, 255}, - {0x8D, 0x0, 1, 255}, - {0xE2, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0x8D, 0x8D, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xA7, 0x0, 1, 255}, - {0x8D, 0x0, 1, 255}, - {0xE0, 0x0, 1, 255}, - {0xA6, 0x0, 1, 255}, - {0xB7, 0xB7, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0xA7, 0xA7, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x87, 0x87, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x68, 0x68, 0, 3}, - {0x48, 0x48, 0, 2}, - {0x8C, 0x8C, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x8C, 0x8C, 0, 1}, - {0x68, 0x68, 0, 1}, - {0x68, 0x68, 0, 2}, - {0x48, 0x48, 0, 1}, - {0x64, 0x64, 0, 1}, - {0x64, 0x64, 0, 2}, - {0x44, 0x44, 0, 1}, - {0x66, 0x66, 0, 1}, - {0x66, 0x66, 0, 2}, - {0x46, 0x46, 0, 1}, - {0x67, 0x67, 0, 1}, - {0x67, 0x67, 0, 2}, - {0x47, 0x47, 0, 1}, - {0xCE, 0x1, 1, 255}, - {0xC2, 0x0, 1, 255}, - {0x6C, 0x6C, 0, 3}, - {0xB7, 0xB7, 0, 1}, - {0x87, 0x87, 0, 2}, - {0xCE, 0x1, 1, 255}, - {0xC2, 0x0, 1, 255}, - {0x6C, 0x6C, 0, 4}, - {0x4C, 0x4C, 0, 3}, - {0xB7, 0xB7, 0, 1}, - {0x87, 0x87, 0, 2}, - {0xCC, 0x0, 2, 255}, - {0x8B, 0x8B, 0, 2}, - {0x88, 0x88, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x61, 0x61, 0, 3}, - {0x8A, 0x8A, 0, 2}, - {0x88, 0x88, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x61, 0x61, 0, 4}, - {0x41, 0x41, 0, 3}, - {0x8A, 0x8A, 0, 2}, - {0x88, 0x88, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0xA8, 0xA8, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xBE, 0x0, 1, 255}, - {0x90, 0x91, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 6, 255}, - {0x98, 0x42, 1, 255}, - {0x96, 0x31, 1, 255}, - {0x94, 0x1B, 1, 255}, - {0x84, 0x11, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x80, 0x80, 0, 73}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0xD, 1, 255}, - {0xBD, 0x0, 13, 255}, - {0xBC, 0xBC, 0, 20}, - {0xBA, 0xBA, 0, 19}, - {0xB4, 0xB4, 0, 18}, - {0xA6, 0xA6, 0, 17}, - {0xA2, 0xA3, 0, 15}, - {0xA0, 0xA0, 0, 14}, - {0x9D, 0x9D, 0, 13}, - {0x96, 0x96, 0, 12}, - {0x91, 0x91, 0, 11}, - {0x8C, 0x8C, 0, 10}, - {0x8A, 0x8A, 0, 9}, - {0x84, 0x84, 0, 8}, - {0x82, 0x82, 0, 7}, - {0xB1, 0xB2, 0, 21}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 8, 255}, - {0xBC, 0xBC, 0, 30}, - {0xB4, 0xB4, 0, 29}, - {0xA2, 0xA2, 0, 28}, - {0x93, 0x93, 0, 27}, - {0x8C, 0x8C, 0, 26}, - {0x8A, 0x8A, 0, 25}, - {0x84, 0x84, 0, 24}, - {0x82, 0x82, 0, 23}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x12, 1, 255}, - {0xBD, 0x0, 11, 255}, - {0xBC, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 41}, - {0xB4, 0xB4, 0, 40}, - {0xA6, 0xA6, 0, 39}, - {0xA2, 0xA3, 0, 37}, - {0xA0, 0xA0, 0, 36}, - {0x91, 0x91, 0, 35}, - {0x8C, 0x8C, 0, 34}, - {0x8A, 0x8A, 0, 33}, - {0x84, 0x84, 0, 32}, - {0x82, 0x82, 0, 31}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 5, 255}, - {0xA2, 0xA2, 0, 5}, - {0x93, 0x93, 0, 4}, - {0x91, 0x91, 0, 3}, - {0x84, 0x84, 0, 2}, - {0x82, 0x82, 0, 1}, - {0xB1, 0xB2, 0, 42}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0xD, 1, 255}, - {0xBD, 0x0, 13, 255}, - {0xBC, 0xBC, 0, 57}, - {0xBA, 0xBA, 0, 56}, - {0xB4, 0xB4, 0, 55}, - {0xA6, 0xA6, 0, 54}, - {0xA2, 0xA3, 0, 52}, - {0xA0, 0xA0, 0, 51}, - {0x96, 0x96, 0, 50}, - {0x93, 0x93, 0, 49}, - {0x91, 0x91, 0, 48}, - {0x8C, 0x8C, 0, 47}, - {0x8A, 0x8A, 0, 46}, - {0x84, 0x84, 0, 45}, - {0x82, 0x82, 0, 44}, - {0xB1, 0xB2, 0, 58}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x10, 1, 255}, - {0xBD, 0x0, 13, 255}, - {0xBC, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 71}, - {0xB4, 0xB4, 0, 70}, - {0xB2, 0xB2, 0, 69}, - {0xA6, 0xA6, 0, 68}, - {0xA2, 0xA2, 0, 67}, - {0xA0, 0xA0, 0, 66}, - {0x9D, 0x9D, 0, 65}, - {0x93, 0x93, 0, 64}, - {0x8C, 0x8C, 0, 63}, - {0x8A, 0x8A, 0, 62}, - {0x84, 0x84, 0, 61}, - {0x82, 0x82, 0, 60}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 1, 255}, - {0x91, 0x91, 0, 6}, - {0xB1, 0xB1, 0, 72}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 11, 255}, - {0xA6, 0x2E, 1, 255}, - {0xA4, 0xA4, 0, 72}, - {0xA3, 0x29, 1, 255}, - {0xA2, 0x1C, 1, 255}, - {0x9E, 0x9F, 0, 70}, - {0x99, 0x99, 0, 69}, - {0x91, 0xF, 1, 255}, - {0x8F, 0x8F, 0, 68}, - {0x85, 0x85, 0, 67}, - {0x82, 0x0, 1, 255}, - {0x80, 0x80, 0, 66}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0xB, 1, 255}, - {0xBD, 0x0, 11, 255}, - {0xBE, 0xBE, 0, 11}, - {0xBC, 0xBC, 0, 10}, - {0xBA, 0xBA, 0, 9}, - {0xA2, 0xA2, 0, 8}, - {0xA0, 0xA0, 0, 7}, - {0x9D, 0x9D, 0, 6}, - {0x98, 0x98, 0, 5}, - {0x91, 0x91, 0, 4}, - {0x8C, 0x8C, 0, 3}, - {0x8A, 0x8A, 0, 2}, - {0x82, 0x82, 0, 1}, - {0xB1, 0xB3, 0, 12}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 11, 255}, - {0xBE, 0xBE, 0, 26}, - {0xBC, 0xBC, 0, 25}, - {0xBA, 0xBA, 0, 24}, - {0xB4, 0xB4, 0, 23}, - {0xA6, 0xA6, 0, 22}, - {0xA2, 0xA3, 0, 20}, - {0xA0, 0xA0, 0, 19}, - {0x98, 0x98, 0, 18}, - {0x8C, 0x8C, 0, 17}, - {0x8A, 0x8A, 0, 16}, - {0x82, 0x82, 0, 15}, - {0xE0, 0x0, 1, 255}, - {0xBE, 0x0, 11, 255}, - {0xB3, 0xB3, 0, 37}, - {0xAB, 0xAB, 0, 36}, - {0xA9, 0xA9, 0, 35}, - {0xA3, 0xA3, 0, 34}, - {0xA1, 0xA1, 0, 33}, - {0x9F, 0x9F, 0, 32}, - {0x99, 0x99, 0, 31}, - {0x97, 0x97, 0, 30}, - {0x94, 0x94, 0, 29}, - {0x92, 0x92, 0, 28}, - {0x90, 0x90, 0, 27}, - {0xE0, 0x0, 1, 255}, - {0xBE, 0x0, 3, 255}, - {0xA1, 0xA1, 0, 40}, - {0x9F, 0x9F, 0, 39}, - {0x95, 0x95, 0, 38}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0xD, 10, 255}, - {0xBD, 0x0, 13, 255}, - {0xBE, 0xBE, 0, 54}, - {0xBC, 0xBC, 0, 53}, - {0xBA, 0xBA, 0, 52}, - {0xB4, 0xB4, 0, 51}, - {0xB2, 0xB2, 0, 50}, - {0xA2, 0xA3, 0, 48}, - {0x98, 0x98, 0, 47}, - {0x96, 0x96, 0, 46}, - {0x91, 0x91, 0, 45}, - {0x8C, 0x8C, 0, 44}, - {0x8A, 0x8A, 0, 43}, - {0x84, 0x84, 0, 42}, - {0x82, 0x82, 0, 41}, - {0xB2, 0xB3, 0, 64}, - {0xAD, 0xAD, 0, 63}, - {0xA9, 0xA9, 0, 62}, - {0xA3, 0xA3, 0, 61}, - {0xA1, 0xA1, 0, 60}, - {0x9F, 0x9F, 0, 59}, - {0x99, 0x99, 0, 58}, - {0x94, 0x94, 0, 57}, - {0x92, 0x92, 0, 56}, - {0x90, 0x90, 0, 55}, - {0xE0, 0x0, 1, 255}, - {0xBE, 0x0, 11, 255}, - {0xAB, 0xAB, 0, 12}, - {0xA8, 0xA9, 0, 10}, - {0xA6, 0xA6, 0, 9}, - {0xA3, 0xA3, 0, 8}, - {0xA1, 0xA1, 0, 7}, - {0x9F, 0x9F, 0, 6}, - {0x99, 0x99, 0, 5}, - {0x97, 0x97, 0, 4}, - {0x94, 0x94, 0, 3}, - {0x92, 0x92, 0, 2}, - {0x90, 0x90, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xBE, 0x0, 9, 255}, - {0xB7, 0xB7, 0, 10}, - {0xA6, 0xA6, 0, 9}, - {0xA4, 0xA4, 0, 8}, - {0xA1, 0xA1, 0, 7}, - {0x9F, 0x9F, 0, 6}, - {0x97, 0x97, 0, 5}, - {0x94, 0x95, 0, 3}, - {0x92, 0x92, 0, 2}, - {0x90, 0x90, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 9, 255}, - {0x9A, 0x9B, 0, 45}, - {0x93, 0x1D, 1, 255}, - {0x91, 0x11, 1, 255}, - {0x90, 0x90, 0, 44}, - {0x89, 0x89, 0, 43}, - {0x86, 0x87, 0, 41}, - {0x84, 0x8, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x81, 0x81, 0, 40}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x4, 1, 255}, - {0xBD, 0x0, 4, 255}, - {0xBC, 0xBC, 0, 5}, - {0xBA, 0xBA, 0, 4}, - {0xB4, 0xB4, 0, 3}, - {0xA2, 0xA3, 0, 1}, - {0xB1, 0xB2, 0, 6}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 7, 255}, - {0xBC, 0xBC, 0, 15}, - {0xA2, 0xA3, 0, 13}, - {0xA0, 0xA0, 0, 12}, - {0x93, 0x93, 0, 11}, - {0x8C, 0x8C, 0, 10}, - {0x8A, 0x8A, 0, 9}, - {0x82, 0x82, 0, 8}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 10, 255}, - {0xBC, 0xBC, 0, 25}, - {0xBA, 0xBA, 0, 24}, - {0xB4, 0xB4, 0, 23}, - {0xA2, 0xA2, 0, 22}, - {0xA0, 0xA0, 0, 21}, - {0x93, 0x93, 0, 20}, - {0x8C, 0x8C, 0, 19}, - {0x8A, 0x8A, 0, 18}, - {0x84, 0x84, 0, 17}, - {0x82, 0x82, 0, 16}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 13, 255}, - {0xBE, 0xBE, 0, 39}, - {0xBC, 0xBC, 0, 38}, - {0xBA, 0xBA, 0, 37}, - {0xB4, 0xB4, 0, 36}, - {0xA2, 0xA3, 0, 34}, - {0xA0, 0xA0, 0, 33}, - {0x98, 0x98, 0, 32}, - {0x96, 0x96, 0, 31}, - {0x93, 0x93, 0, 30}, - {0x8C, 0x8C, 0, 29}, - {0x8A, 0x8A, 0, 28}, - {0x84, 0x84, 0, 27}, - {0x82, 0x82, 0, 26}, - {0xE0, 0x0, 1, 255}, - {0xBE, 0x0, 9, 255}, - {0xA8, 0xA9, 0, 10}, - {0xA6, 0xA6, 0, 9}, - {0xA3, 0xA4, 0, 7}, - {0xA1, 0xA1, 0, 6}, - {0x9F, 0x9F, 0, 5}, - {0x99, 0x99, 0, 4}, - {0x94, 0x94, 0, 3}, - {0x92, 0x92, 0, 2}, - {0x90, 0x90, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 8, 255}, - {0x9A, 0x9B, 0, 62}, - {0x96, 0x29, 1, 255}, - {0x95, 0x95, 0, 61}, - {0x91, 0x14, 1, 255}, - {0x90, 0x90, 0, 60}, - {0x86, 0x87, 0, 58}, - {0x82, 0x0, 1, 255}, - {0x81, 0x81, 0, 57}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x10, 1, 255}, - {0xBD, 0x0, 16, 255}, - {0xBE, 0xBE, 0, 17}, - {0xBC, 0xBC, 0, 16}, - {0xBA, 0xBA, 0, 15}, - {0xB4, 0xB4, 0, 14}, - {0xB2, 0xB2, 0, 13}, - {0xA6, 0xA6, 0, 12}, - {0xA2, 0xA3, 0, 10}, - {0xA0, 0xA0, 0, 9}, - {0x98, 0x98, 0, 8}, - {0x96, 0x96, 0, 7}, - {0x93, 0x93, 0, 6}, - {0x91, 0x91, 0, 5}, - {0x8C, 0x8C, 0, 4}, - {0x8A, 0x8A, 0, 3}, - {0x84, 0x84, 0, 2}, - {0x82, 0x82, 0, 1}, - {0xB1, 0xB2, 0, 18}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x11, 1, 255}, - {0xBD, 0x0, 17, 255}, - {0xBE, 0xBE, 0, 37}, - {0xBC, 0xBC, 0, 36}, - {0xBA, 0xBA, 0, 35}, - {0xB4, 0xB4, 0, 34}, - {0xB2, 0xB2, 0, 33}, - {0xA6, 0xA6, 0, 32}, - {0xA2, 0xA3, 0, 30}, - {0xA0, 0xA0, 0, 29}, - {0x9D, 0x9D, 0, 28}, - {0x98, 0x98, 0, 27}, - {0x96, 0x96, 0, 26}, - {0x93, 0x93, 0, 25}, - {0x91, 0x91, 0, 24}, - {0x8C, 0x8C, 0, 23}, - {0x8A, 0x8A, 0, 22}, - {0x84, 0x84, 0, 21}, - {0x82, 0x82, 0, 20}, - {0xB2, 0xB2, 0, 38}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0xF, 1, 255}, - {0xBD, 0x0, 15, 255}, - {0xBE, 0xBE, 0, 54}, - {0xBC, 0xBC, 0, 53}, - {0xBA, 0xBA, 0, 52}, - {0xB4, 0xB4, 0, 51}, - {0xB2, 0xB2, 0, 50}, - {0xA2, 0xA3, 0, 48}, - {0xA0, 0xA0, 0, 47}, - {0x98, 0x98, 0, 46}, - {0x96, 0x96, 0, 45}, - {0x93, 0x93, 0, 44}, - {0x91, 0x91, 0, 43}, - {0x8C, 0x8C, 0, 42}, - {0x8A, 0x8A, 0, 41}, - {0x84, 0x84, 0, 40}, - {0x82, 0x82, 0, 39}, - {0xB1, 0xB2, 0, 55}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 10, 255}, - {0xA6, 0x20, 1, 255}, - {0xA4, 0xA4, 0, 52}, - {0xA1, 0xA1, 0, 51}, - {0x9E, 0x9F, 0, 49}, - {0x99, 0x99, 0, 48}, - {0x93, 0x11, 1, 255}, - {0x91, 0x0, 1, 255}, - {0x8F, 0x8F, 0, 47}, - {0x89, 0x89, 0, 46}, - {0x85, 0x85, 0, 45}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 15, 255}, - {0xBE, 0xBE, 0, 16}, - {0xBC, 0xBC, 0, 15}, - {0xBA, 0xBA, 0, 14}, - {0xB4, 0xB4, 0, 13}, - {0xB2, 0xB2, 0, 12}, - {0xA6, 0xA6, 0, 11}, - {0xA2, 0xA3, 0, 9}, - {0xA0, 0xA0, 0, 8}, - {0x98, 0x98, 0, 7}, - {0x96, 0x96, 0, 6}, - {0x93, 0x93, 0, 5}, - {0x8C, 0x8C, 0, 4}, - {0x8A, 0x8A, 0, 3}, - {0x84, 0x84, 0, 2}, - {0x82, 0x82, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 13, 255}, - {0xBE, 0xBE, 0, 29}, - {0xBC, 0xBC, 0, 28}, - {0xB4, 0xB4, 0, 27}, - {0xA6, 0xA6, 0, 26}, - {0xA0, 0xA0, 0, 25}, - {0x9D, 0x9D, 0, 24}, - {0x98, 0x98, 0, 23}, - {0x93, 0x93, 0, 22}, - {0x91, 0x91, 0, 21}, - {0x8C, 0x8C, 0, 20}, - {0x8A, 0x8A, 0, 19}, - {0x84, 0x84, 0, 18}, - {0x82, 0x82, 0, 17}, - {0xE0, 0x0, 1, 255}, - {0xBD, 0x0, 14, 255}, - {0xBC, 0xBC, 0, 44}, - {0xBA, 0xBA, 0, 43}, - {0xB4, 0xB4, 0, 42}, - {0xB2, 0xB2, 0, 41}, - {0xA6, 0xA6, 0, 40}, - {0xA2, 0xA3, 0, 38}, - {0xA0, 0xA0, 0, 37}, - {0x96, 0x96, 0, 36}, - {0x93, 0x93, 0, 35}, - {0x91, 0x91, 0, 34}, - {0x8C, 0x8C, 0, 33}, - {0x8A, 0x8A, 0, 32}, - {0x84, 0x84, 0, 31}, - {0x82, 0x82, 0, 30}, - {0xE0, 0x0, 1, 255}, - {0xBE, 0x0, 1, 255}, - {0x99, 0x99, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xBE, 0x0, 1, 255}, - {0xA4, 0xA5, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x9, 1, 255}, - {0xBD, 0x0, 3, 255}, - {0xB5, 0xB5, 0, 6}, - {0xB3, 0xB3, 0, 5}, - {0xB1, 0x0, 1, 4}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x2, 1, 255}, - {0xBD, 0x0, 2, 255}, - {0xB4, 0xB4, 0, 2}, - {0xB2, 0xB2, 0, 1}, - {0x80, 0x80, 0, 3}, - {0x80, 0x81, 0, 7}, - {0x7A, 0x7A, 0, 1}, - {0x7A, 0x7A, 0, 2}, - {0x5A, 0x5A, 0, 1}, - {0x62, 0x62, 0, 1}, - {0x62, 0x62, 0, 2}, - {0x42, 0x42, 0, 1}, - {0x70, 0x70, 0, 1}, - {0x70, 0x70, 0, 2}, - {0x50, 0x50, 0, 1}, - {0x79, 0x79, 0, 1}, - {0x79, 0x79, 0, 2}, - {0x59, 0x59, 0, 1}, - {0x73, 0x73, 0, 1}, - {0x73, 0x73, 0, 2}, - {0x53, 0x53, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x82, 0x82, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x83, 0x83, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x88, 0x88, 0, 2}, - {0x83, 0x83, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x8A, 0x8A, 0, 2}, - {0x88, 0x88, 0, 1}, - {0xCC, 0x0, 3, 255}, - {0x8B, 0x8B, 0, 3}, - {0x88, 0x88, 0, 2}, - {0x83, 0x83, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x67, 0x67, 0, 2}, - {0x83, 0x83, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x67, 0x67, 0, 3}, - {0x47, 0x47, 0, 2}, - {0x83, 0x83, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x8C, 0x8C, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xC5, 0x2, 1, 255}, - {0x7A, 0x0, 1, 255}, - {0xCC, 0x0, 1, 255}, - {0x8C, 0x8C, 0, 1}, - {0xBE, 0xBE, 0, 2}, - {0xC5, 0x4, 1, 255}, - {0x7A, 0x2, 1, 255}, - {0x5A, 0x0, 1, 255}, - {0xCC, 0x0, 1, 255}, - {0x8C, 0x8C, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x8C, 0x8C, 0, 2}, - {0xBD, 0xBE, 0, 3}, - {0xCE, 0x1, 1, 255}, - {0xC2, 0x0, 1, 255}, - {0x6A, 0x6A, 0, 3}, - {0xB7, 0xB7, 0, 1}, - {0x87, 0x87, 0, 2}, - {0xCE, 0x1, 1, 255}, - {0xC2, 0x0, 1, 255}, - {0x6A, 0x6A, 0, 4}, - {0x4A, 0x4A, 0, 3}, - {0xB7, 0xB7, 0, 1}, - {0x87, 0x87, 0, 2}, - {0x6A, 0x6A, 0, 1}, - {0x6A, 0x6A, 0, 2}, - {0x4A, 0x4A, 0, 1}, - {0x73, 0x73, 0, 2}, - {0x63, 0x0, 1, 255}, - {0x73, 0x73, 0, 1}, - {0x73, 0x73, 0, 4}, - {0x63, 0x1, 1, 255}, - {0x53, 0x53, 0, 3}, - {0x43, 0x0, 1, 255}, - {0x53, 0x53, 0, 1}, - {0x73, 0x73, 0, 2}, - {0x7A, 0x2, 1, 4}, - {0x64, 0x0, 1, 255}, - {0x7A, 0x0, 1, 2}, - {0x73, 0x73, 0, 1}, - {0x73, 0x73, 0, 3}, - {0x7A, 0x5, 1, 8}, - {0x64, 0x3, 1, 255}, - {0x5A, 0x2, 1, 7}, - {0x44, 0x0, 1, 255}, - {0x5A, 0x0, 1, 3}, - {0x53, 0x53, 0, 1}, - {0x53, 0x53, 0, 4}, - {0x7A, 0x0, 1, 5}, - {0x73, 0x73, 0, 2}, - {0x73, 0x73, 0, 6}, - {0x79, 0x79, 0, 2}, - {0x67, 0x0, 1, 255}, - {0x79, 0x79, 0, 1}, - {0x79, 0x79, 0, 4}, - {0x67, 0x1, 1, 255}, - {0x59, 0x59, 0, 3}, - {0x47, 0x0, 1, 255}, - {0x59, 0x59, 0, 1}, - {0x79, 0x79, 0, 2}, - {0xCE, 0x2, 1, 255}, - {0xC2, 0x1, 1, 255}, - {0x79, 0x79, 0, 4}, - {0x6C, 0x0, 1, 255}, - {0x79, 0x79, 0, 1}, - {0xB7, 0xB7, 0, 2}, - {0x87, 0x87, 0, 3}, - {0xCE, 0x3, 1, 255}, - {0xC2, 0x2, 1, 255}, - {0x79, 0x79, 0, 6}, - {0x6C, 0x1, 1, 255}, - {0x59, 0x59, 0, 5}, - {0x4C, 0x0, 1, 255}, - {0x59, 0x59, 0, 1}, - {0x79, 0x79, 0, 2}, - {0xB7, 0xB7, 0, 3}, - {0x87, 0x87, 0, 4}, - {0x79, 0x79, 0, 2}, - {0x6E, 0x0, 1, 255}, - {0x79, 0x79, 0, 1}, - {0x79, 0x79, 0, 4}, - {0x6E, 0x1, 1, 255}, - {0x59, 0x59, 0, 3}, - {0x4E, 0x0, 1, 255}, - {0x59, 0x59, 0, 1}, - {0x79, 0x79, 0, 2}, - {0x7A, 0x7A, 0, 2}, - {0x73, 0x0, 1, 255}, - {0x7A, 0x7A, 0, 1}, - {0x7A, 0x7A, 0, 4}, - {0x73, 0x1, 1, 255}, - {0x5A, 0x5A, 0, 3}, - {0x53, 0x0, 1, 255}, - {0x5A, 0x5A, 0, 1}, - {0x7A, 0x7A, 0, 2}, - {0x79, 0x79, 0, 2}, - {0x74, 0x0, 1, 255}, - {0x79, 0x79, 0, 1}, - {0x79, 0x79, 0, 4}, - {0x74, 0x1, 1, 255}, - {0x59, 0x59, 0, 3}, - {0x54, 0x0, 1, 255}, - {0x59, 0x59, 0, 1}, - {0x79, 0x79, 0, 2}, - {0x7A, 0x0, 1, 255}, - {0x73, 0x73, 0, 2}, - {0x73, 0x73, 0, 1}, - {0x7A, 0x1, 1, 255}, - {0x73, 0x73, 0, 4}, - {0x5A, 0x0, 1, 255}, - {0x53, 0x53, 0, 3}, - {0x53, 0x53, 0, 1}, - {0x73, 0x73, 0, 2}, - {0xD6, 0x0, 1, 255}, - {0x82, 0x82, 0, 1}, - {0x77, 0x77, 0, 3}, - {0x68, 0x68, 0, 2}, - {0x62, 0x62, 0, 1}, - {0x77, 0x77, 0, 6}, - {0x68, 0x68, 0, 5}, - {0x62, 0x62, 0, 4}, - {0x57, 0x57, 0, 3}, - {0x48, 0x48, 0, 2}, - {0x42, 0x42, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0xA3, 0xA3, 0, 1}, - {0x77, 0x77, 0, 2}, - {0x70, 0x70, 0, 1}, - {0x77, 0x77, 0, 4}, - {0x70, 0x70, 0, 3}, - {0x57, 0x57, 0, 2}, - {0x50, 0x50, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x79, 0x79, 0, 3}, - {0x77, 0x77, 0, 2}, - {0x87, 0x87, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x79, 0x79, 0, 5}, - {0x77, 0x77, 0, 4}, - {0x59, 0x59, 0, 3}, - {0x57, 0x57, 0, 2}, - {0x87, 0x87, 0, 1}, - {0xCC, 0x0, 3, 255}, - {0x8A, 0x8A, 0, 3}, - {0x88, 0x88, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x81, 0x81, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x88, 0x88, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x1, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x9D, 0x9D, 0, 1}, - {0xBC, 0xBC, 0, 2}, - {0xE3, 0x0, 1, 255}, - {0x83, 0x0, 1, 255}, - {0xBC, 0xBD, 0, 1}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x7, 1, 255}, - {0x82, 0x0, 2, 255}, - {0x9D, 0x9D, 0, 3}, - {0x99, 0x0, 1, 255}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x1, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x9D, 0x9D, 0, 1}, - {0xBC, 0xBC, 0, 2}, - {0xBC, 0xBC, 0, 4}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x4, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x0, 1, 255}, - {0xE3, 0x0, 1, 255}, - {0x83, 0x0, 1, 255}, - {0xBC, 0xBD, 0, 1}, - {0xBC, 0xBD, 0, 3}, - {0xE3, 0x0, 2, 255}, - {0x83, 0xE, 1, 255}, - {0x82, 0x0, 3, 255}, - {0x9E, 0x9E, 0, 6}, - {0x9D, 0x8, 1, 5}, - {0x99, 0x0, 1, 255}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x4, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x9D, 0x0, 1, 2}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 1}, - {0xBC, 0xBC, 0, 3}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 4}, - {0xBC, 0xBC, 0, 7}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x8, 2, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x0, 1, 255}, - {0xE3, 0x0, 1, 255}, - {0x83, 0x0, 2, 255}, - {0xBD, 0x0, 1, 3}, - {0xBC, 0xBD, 0, 2}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 1}, - {0xBD, 0x0, 1, 6}, - {0xBC, 0xBE, 0, 5}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 4}, - {0xE3, 0x0, 1, 255}, - {0x83, 0x0, 2, 255}, - {0xBD, 0x0, 1, 3}, - {0xBC, 0xBE, 0, 2}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 1}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x1, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x9D, 0x9E, 0, 1}, - {0xBC, 0xBC, 0, 3}, - {0xE3, 0x0, 1, 255}, - {0x83, 0x0, 1, 255}, - {0xBC, 0xBE, 0, 1}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x17, 1, 255}, - {0x82, 0x0, 4, 255}, - {0x9E, 0x9E, 0, 9}, - {0x9D, 0x10, 1, 8}, - {0x9A, 0x8, 1, 255}, - {0x99, 0x0, 1, 255}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x4, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x9D, 0x0, 1, 3}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 1}, - {0xBC, 0xBC, 0, 4}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x4, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x9D, 0x0, 1, 5}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 2}, - {0xBC, 0xBC, 0, 6}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 7}, - {0xBC, 0xBC, 0, 10}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x10, 2, 255}, - {0x82, 0x0, 2, 255}, - {0x9A, 0x7, 1, 255}, - {0x99, 0x0, 1, 255}, - {0xE3, 0x0, 1, 255}, - {0x83, 0x0, 2, 255}, - {0xBD, 0x0, 1, 4}, - {0xBC, 0xBD, 0, 3}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 1}, - {0xE3, 0x0, 1, 255}, - {0x83, 0x0, 2, 255}, - {0xBD, 0x0, 1, 6}, - {0xBC, 0xBD, 0, 5}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 2}, - {0xBD, 0x0, 1, 9}, - {0xBC, 0xBE, 0, 8}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 7}, - {0xE3, 0x0, 2, 255}, - {0x83, 0x5, 1, 255}, - {0x82, 0x0, 2, 255}, - {0x9E, 0x9E, 0, 3}, - {0x9D, 0x0, 1, 2}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x99, 0x99, 0, 1}, - {0xBC, 0xBC, 0, 4}, - {0xE3, 0x0, 1, 255}, - {0x82, 0x0, 1, 255}, - {0x9D, 0x9D, 0, 1}, - {0xE3, 0x0, 1, 255}, - {0x83, 0x0, 1, 255}, - {0xBD, 0xBD, 0, 1}, - {0x27, 0x27, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x9F, 0x0, 1, 255}, - {0x8C, 0x8C, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x9F, 0x0, 1, 255}, - {0x86, 0x87, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x9F, 0x0, 1, 255}, - {0x86, 0x86, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x9F, 0x0, 1, 255}, - {0x87, 0x87, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xA5, 0x0, 1, 255}, - {0x8D, 0x0, 1, 255}, - {0xE0, 0x0, 1, 255}, - {0xA4, 0x0, 1, 255}, - {0xB7, 0xB7, 0, 1}, - {0x76, 0x76, 0, 8}, - {0x70, 0x70, 0, 7}, - {0x66, 0x66, 0, 6}, - {0x62, 0x62, 0, 5}, - {0x56, 0x56, 0, 4}, - {0x50, 0x50, 0, 3}, - {0x46, 0x46, 0, 2}, - {0x42, 0x42, 0, 1}, - {0x79, 0x7A, 0, 17}, - {0x73, 0x74, 0, 15}, - {0x6B, 0x6B, 0, 14}, - {0x67, 0x2, 2, 13}, - {0x64, 0x64, 0, 12}, - {0x59, 0x5A, 0, 10}, - {0x53, 0x54, 0, 8}, - {0x4B, 0x4B, 0, 7}, - {0x47, 0x0, 2, 6}, - {0x44, 0x44, 0, 5}, - {0x62, 0x62, 0, 2}, - {0x42, 0x42, 0, 1}, - {0x62, 0x62, 0, 4}, - {0x42, 0x42, 0, 3}, - {0x79, 0x7A, 0, 16}, - {0x73, 0x74, 0, 14}, - {0x6B, 0x6B, 0, 13}, - {0x67, 0x1, 2, 12}, - {0x64, 0x64, 0, 11}, - {0x59, 0x5A, 0, 9}, - {0x53, 0x54, 0, 7}, - {0x4B, 0x4B, 0, 6}, - {0x47, 0x0, 1, 5}, - {0x44, 0x44, 0, 4}, - {0x42, 0x42, 0, 1}, - {0x62, 0x62, 0, 3}, - {0x42, 0x42, 0, 2}, - {0xCC, 0x0, 2, 255}, - {0x83, 0x83, 0, 3}, - {0x80, 0x81, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0xA8, 0xA8, 0, 2}, - {0x87, 0x87, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0xA8, 0xA8, 0, 2}, - {0x84, 0x84, 0, 1}, - {0xCE, 0x2, 1, 255}, - {0xCC, 0x1, 1, 255}, - {0xC2, 0x0, 1, 255}, - {0xB7, 0xB7, 0, 1}, - {0xA7, 0xA7, 0, 2}, - {0x87, 0x87, 0, 3}, - {0xE0, 0x0, 1, 255}, - {0xB5, 0x0, 1, 255}, - {0x8D, 0x0, 1, 255}, - {0xE2, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0x8D, 0x8D, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB5, 0x0, 1, 255}, - {0x8D, 0x0, 1, 255}, - {0xE2, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0x8D, 0x0, 1, 255}, - {0x20, 0x20, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB5, 0x0, 1, 255}, - {0x8D, 0x8D, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xA5, 0x0, 1, 255}, - {0x8D, 0x0, 1, 255}, - {0xE0, 0x0, 1, 255}, - {0xA4, 0x0, 1, 255}, - {0x9E, 0x9E, 0, 1}, - {0xCC, 0x1, 1, 255}, - {0xC4, 0x0, 1, 255}, - {0xA6, 0xA7, 0, 1}, - {0x87, 0x87, 0, 3}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 2, 255}, - {0xBA, 0xBA, 0, 3}, - {0xB9, 0x0, 1, 2}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0x99, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0x84, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB8, 0xB8, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 2, 255}, - {0xBA, 0x0, 1, 3}, - {0xB9, 0xBA, 0, 2}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xAF, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0x95, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 3, 255}, - {0xBA, 0xBA, 0, 4}, - {0xB9, 0x9, 1, 3}, - {0x80, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBB, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xAC, 0xAC, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0x98, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 2}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0x84, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB8, 0xB8, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 2, 255}, - {0xBA, 0xBA, 0, 3}, - {0xB9, 0x0, 1, 2}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0x99, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xAE, 0xAE, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 2, 255}, - {0xAF, 0x0, 1, 255}, - {0xAE, 0xAE, 0, 2}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB6, 0xB6, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 31, 255}, - {0xB1, 0x5A, 1, 255}, - {0x9F, 0x57, 1, 255}, - {0x9E, 0x54, 1, 255}, - {0x9C, 0x51, 1, 255}, - {0x9B, 0x4E, 1, 255}, - {0x9A, 0x4B, 1, 255}, - {0x99, 0x48, 1, 255}, - {0x98, 0x45, 1, 255}, - {0x97, 0x42, 1, 255}, - {0x96, 0x3F, 1, 255}, - {0x95, 0x3C, 1, 255}, - {0x94, 0x39, 1, 255}, - {0x93, 0x36, 1, 255}, - {0x92, 0x33, 1, 255}, - {0x91, 0x30, 1, 255}, - {0x90, 0x2D, 1, 255}, - {0x8F, 0x2A, 1, 255}, - {0x8E, 0x27, 1, 255}, - {0x8D, 0x24, 1, 255}, - {0x8C, 0x21, 1, 255}, - {0x8B, 0x1E, 1, 255}, - {0x8A, 0x1B, 1, 255}, - {0x89, 0x18, 1, 255}, - {0x87, 0x15, 1, 255}, - {0x86, 0x12, 1, 255}, - {0x85, 0xF, 1, 255}, - {0x84, 0xC, 1, 255}, - {0x83, 0x9, 1, 255}, - {0x82, 0x6, 1, 255}, - {0x81, 0x3, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 61}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 63}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 65}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 67}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 69}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 71}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 73}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 75}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 77}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 79}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 81}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 83}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 85}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 87}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 89}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 91}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 93}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 95}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 97}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 99}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 101}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 103}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 105}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 107}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 109}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 111}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 113}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 115}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 117}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 119}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xAC, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 30, 255}, - {0x9F, 0x57, 1, 255}, - {0x9E, 0x54, 1, 255}, - {0x9C, 0x51, 1, 255}, - {0x9B, 0x4E, 1, 255}, - {0x9A, 0x4B, 1, 255}, - {0x99, 0x48, 1, 255}, - {0x98, 0x45, 1, 255}, - {0x97, 0x42, 1, 255}, - {0x96, 0x3F, 1, 255}, - {0x95, 0x3C, 1, 255}, - {0x94, 0x39, 1, 255}, - {0x93, 0x36, 1, 255}, - {0x92, 0x33, 1, 255}, - {0x91, 0x30, 1, 255}, - {0x90, 0x2D, 1, 255}, - {0x8F, 0x2A, 1, 255}, - {0x8E, 0x27, 1, 255}, - {0x8D, 0x24, 1, 255}, - {0x8C, 0x21, 1, 255}, - {0x8B, 0x1E, 1, 255}, - {0x8A, 0x1B, 1, 255}, - {0x89, 0x18, 1, 255}, - {0x87, 0x15, 1, 255}, - {0x86, 0x12, 1, 255}, - {0x85, 0xF, 1, 255}, - {0x84, 0xC, 1, 255}, - {0x83, 0x9, 1, 255}, - {0x82, 0x6, 1, 255}, - {0x81, 0x3, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 3}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 5}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 7}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 9}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 11}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 13}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 15}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 17}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 19}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 21}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 23}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 25}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 27}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 29}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 31}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 33}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 35}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 37}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 39}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 41}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 43}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 45}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 47}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 49}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 51}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 53}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 55}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 57}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 59}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 36, 255}, - {0xAC, 0xF7, 1, 197}, - {0xAB, 0x69, 1, 196}, - {0xA1, 0x66, 1, 255}, - {0xA0, 0x63, 1, 255}, - {0x9F, 0x60, 1, 255}, - {0x9E, 0x5D, 1, 255}, - {0x9D, 0x5A, 1, 255}, - {0x9C, 0x57, 1, 255}, - {0x9B, 0x54, 1, 255}, - {0x9A, 0x51, 1, 255}, - {0x99, 0x4E, 1, 255}, - {0x98, 0x4B, 1, 255}, - {0x97, 0x48, 1, 255}, - {0x96, 0x45, 1, 255}, - {0x95, 0x42, 1, 255}, - {0x94, 0x3F, 1, 255}, - {0x93, 0x3C, 1, 255}, - {0x92, 0x39, 1, 255}, - {0x91, 0x36, 1, 255}, - {0x90, 0x33, 1, 255}, - {0x8F, 0x30, 1, 255}, - {0x8E, 0x2D, 1, 255}, - {0x8D, 0x2A, 1, 255}, - {0x8C, 0x27, 1, 255}, - {0x8B, 0x24, 1, 255}, - {0x8A, 0x21, 1, 255}, - {0x89, 0x1E, 1, 255}, - {0x88, 0x1B, 1, 255}, - {0x87, 0x18, 1, 255}, - {0x86, 0x15, 1, 255}, - {0x85, 0x12, 1, 255}, - {0x84, 0xC, 1, 255}, - {0x83, 0x9, 1, 255}, - {0x82, 0x6, 1, 255}, - {0x81, 0x3, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 131}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 133}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 135}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 137}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0x0, 1, 139}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xB9, 0, 4}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 140}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 142}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 144}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 146}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 147}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 149}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 151}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 153}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 155}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 157}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 159}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 161}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 163}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 165}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 167}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 169}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 171}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 173}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 175}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 177}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 179}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 181}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 183}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 185}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 187}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 188}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 190}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 192}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 193}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 35, 255}, - {0xBA, 0xBA, 0, 194}, - {0xA1, 0x66, 1, 255}, - {0xA0, 0x63, 1, 255}, - {0x9F, 0x60, 1, 255}, - {0x9E, 0x5D, 1, 255}, - {0x9D, 0x5A, 1, 255}, - {0x9C, 0x57, 1, 255}, - {0x9B, 0x54, 1, 255}, - {0x9A, 0x51, 1, 255}, - {0x99, 0x4E, 1, 255}, - {0x98, 0x4B, 1, 255}, - {0x97, 0x48, 1, 255}, - {0x96, 0x45, 1, 255}, - {0x95, 0x42, 1, 255}, - {0x94, 0x3F, 1, 255}, - {0x93, 0x3C, 1, 255}, - {0x92, 0x39, 1, 255}, - {0x91, 0x36, 1, 255}, - {0x90, 0x33, 1, 255}, - {0x8F, 0x30, 1, 255}, - {0x8E, 0x2D, 1, 255}, - {0x8D, 0x2A, 1, 255}, - {0x8C, 0x27, 1, 255}, - {0x8B, 0x24, 1, 255}, - {0x8A, 0x21, 1, 255}, - {0x89, 0x1E, 1, 255}, - {0x88, 0x1B, 1, 255}, - {0x87, 0x18, 1, 255}, - {0x86, 0x15, 1, 255}, - {0x85, 0x12, 1, 255}, - {0x84, 0xC, 1, 255}, - {0x83, 0x9, 1, 255}, - {0x82, 0x6, 1, 255}, - {0x81, 0x3, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 5}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 7}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 9}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 11}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0x0, 1, 13}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xB9, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 14}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 16}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 18}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 20}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 21}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 23}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 25}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 27}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 29}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 31}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 33}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 35}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 37}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 39}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 41}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 43}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 45}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 47}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 49}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 51}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 53}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 55}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 57}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 59}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 61}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 62}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 64}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 66}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 67}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 35, 255}, - {0xBA, 0xBA, 0, 195}, - {0xA1, 0x6A, 1, 255}, - {0xA0, 0x67, 1, 255}, - {0x9F, 0x64, 1, 255}, - {0x9E, 0x61, 1, 255}, - {0x9D, 0x5E, 1, 255}, - {0x9C, 0x5B, 1, 255}, - {0x9B, 0x58, 1, 255}, - {0x9A, 0x55, 1, 255}, - {0x99, 0x52, 1, 255}, - {0x98, 0x4F, 1, 255}, - {0x97, 0x4C, 1, 255}, - {0x96, 0x49, 1, 255}, - {0x95, 0x46, 1, 255}, - {0x94, 0x43, 1, 255}, - {0x93, 0x40, 1, 255}, - {0x92, 0x3D, 1, 255}, - {0x91, 0x3A, 1, 255}, - {0x90, 0x37, 1, 255}, - {0x8F, 0x34, 1, 255}, - {0x8E, 0x31, 1, 255}, - {0x8D, 0x2E, 1, 255}, - {0x8C, 0x2B, 1, 255}, - {0x8B, 0x28, 1, 255}, - {0x8A, 0x25, 1, 255}, - {0x89, 0x22, 1, 255}, - {0x88, 0x1F, 1, 255}, - {0x87, 0x1C, 1, 255}, - {0x86, 0x19, 1, 255}, - {0x85, 0x16, 1, 255}, - {0x84, 0x10, 1, 255}, - {0x83, 0xD, 1, 255}, - {0x82, 0xA, 1, 255}, - {0x81, 0x7, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 2, 255}, - {0xBA, 0x0, 1, 69}, - {0xB9, 0xBA, 0, 68}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBB, 0xBB, 0, 2}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 70}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 72}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 74}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0x0, 1, 76}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xB9, 0, 3}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 77}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 79}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 81}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 83}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 84}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 86}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 88}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 90}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 92}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 94}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 96}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 98}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 100}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 102}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 104}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 106}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 108}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 110}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 112}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 114}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 116}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 118}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 120}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 122}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 124}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 125}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 127}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 129}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 130}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 36, 255}, - {0xB6, 0xFE, 1, 134}, - {0xAF, 0x71, 1, 133}, - {0xA1, 0x6E, 1, 255}, - {0xA0, 0x6B, 1, 255}, - {0x9F, 0x68, 1, 255}, - {0x9E, 0x65, 1, 255}, - {0x9D, 0x62, 1, 255}, - {0x9C, 0x5F, 1, 255}, - {0x9B, 0x5C, 1, 255}, - {0x9A, 0x59, 1, 255}, - {0x99, 0x4E, 1, 255}, - {0x98, 0x4B, 1, 255}, - {0x97, 0x48, 1, 255}, - {0x96, 0x45, 1, 255}, - {0x95, 0x42, 1, 255}, - {0x94, 0x3F, 1, 255}, - {0x93, 0x3C, 1, 255}, - {0x92, 0x39, 1, 255}, - {0x91, 0x36, 1, 255}, - {0x90, 0x33, 1, 255}, - {0x8F, 0x30, 1, 255}, - {0x8E, 0x2D, 1, 255}, - {0x8D, 0x2A, 1, 255}, - {0x8C, 0x27, 1, 255}, - {0x8B, 0x24, 1, 255}, - {0x8A, 0x21, 1, 255}, - {0x89, 0x1E, 1, 255}, - {0x88, 0x1B, 1, 255}, - {0x87, 0x18, 1, 255}, - {0x86, 0x15, 1, 255}, - {0x85, 0x12, 1, 255}, - {0x84, 0xC, 1, 255}, - {0x83, 0x9, 1, 255}, - {0x82, 0x6, 1, 255}, - {0x81, 0x3, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 68}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 70}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 72}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 74}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0x0, 1, 76}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xB9, 0, 2}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 77}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 79}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 81}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 83}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 84}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 86}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 88}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 90}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 92}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 94}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 96}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 98}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 100}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 102}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 104}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 106}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 108}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 110}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 112}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 114}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 3, 255}, - {0xBA, 0x3, 1, 117}, - {0xB9, 0xBA, 0, 116}, - {0xB7, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 3}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB8, 0xB8, 0, 4}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 118}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 120}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 122}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 124}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 125}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 127}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 129}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 130}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 34, 255}, - {0xA1, 0x66, 1, 255}, - {0xA0, 0x63, 1, 255}, - {0x9F, 0x60, 1, 255}, - {0x9E, 0x5D, 1, 255}, - {0x9D, 0x5A, 1, 255}, - {0x9C, 0x57, 1, 255}, - {0x9B, 0x54, 1, 255}, - {0x9A, 0x51, 1, 255}, - {0x99, 0x4E, 1, 255}, - {0x98, 0x4B, 1, 255}, - {0x97, 0x48, 1, 255}, - {0x96, 0x45, 1, 255}, - {0x95, 0x42, 1, 255}, - {0x94, 0x3F, 1, 255}, - {0x93, 0x3C, 1, 255}, - {0x92, 0x39, 1, 255}, - {0x91, 0x36, 1, 255}, - {0x90, 0x33, 1, 255}, - {0x8F, 0x30, 1, 255}, - {0x8E, 0x2D, 1, 255}, - {0x8D, 0x2A, 1, 255}, - {0x8C, 0x27, 1, 255}, - {0x8B, 0x24, 1, 255}, - {0x8A, 0x21, 1, 255}, - {0x89, 0x1E, 1, 255}, - {0x88, 0x1B, 1, 255}, - {0x87, 0x18, 1, 255}, - {0x86, 0x15, 1, 255}, - {0x85, 0x12, 1, 255}, - {0x84, 0xC, 1, 255}, - {0x83, 0x9, 1, 255}, - {0x82, 0x6, 1, 255}, - {0x81, 0x3, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 5}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 7}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 9}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 11}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0x0, 1, 13}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xB9, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 14}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 16}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 18}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 20}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 21}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 23}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 25}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 27}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 29}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 31}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 33}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 35}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 37}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 39}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 41}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 43}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 45}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 47}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 49}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 51}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 53}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 55}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 57}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 59}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 61}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 62}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 64}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 66}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 67}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB7, 0xB8, 0, 131}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 34, 255}, - {0xA1, 0x66, 1, 255}, - {0xA0, 0x63, 1, 255}, - {0x9F, 0x60, 1, 255}, - {0x9E, 0x5D, 1, 255}, - {0x9D, 0x5A, 1, 255}, - {0x9C, 0x57, 1, 255}, - {0x9B, 0x54, 1, 255}, - {0x9A, 0x51, 1, 255}, - {0x99, 0x4E, 1, 255}, - {0x98, 0x4B, 1, 255}, - {0x97, 0x48, 1, 255}, - {0x96, 0x45, 1, 255}, - {0x95, 0x42, 1, 255}, - {0x94, 0x3F, 1, 255}, - {0x93, 0x3C, 1, 255}, - {0x92, 0x39, 1, 255}, - {0x91, 0x36, 1, 255}, - {0x90, 0x33, 1, 255}, - {0x8F, 0x30, 1, 255}, - {0x8E, 0x2D, 1, 255}, - {0x8D, 0x2A, 1, 255}, - {0x8C, 0x27, 1, 255}, - {0x8B, 0x24, 1, 255}, - {0x8A, 0x21, 1, 255}, - {0x89, 0x1E, 1, 255}, - {0x88, 0x1B, 1, 255}, - {0x87, 0x18, 1, 255}, - {0x86, 0x15, 1, 255}, - {0x85, 0x12, 1, 255}, - {0x84, 0xC, 1, 255}, - {0x83, 0x9, 1, 255}, - {0x82, 0x6, 1, 255}, - {0x81, 0x3, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 2}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 4}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 6}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 8}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0x0, 1, 10}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xB9, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 11}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 13}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 15}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 17}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 18}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 20}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 22}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 24}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 26}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 28}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 30}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 32}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 34}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 36}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 38}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 40}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 42}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 44}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 46}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 48}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 50}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 52}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 54}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 56}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 58}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 59}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 61}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 63}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 64}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 35, 255}, - {0xB6, 0x71, 1, 69}, - {0xA1, 0x6E, 1, 255}, - {0xA0, 0x6B, 1, 255}, - {0x9F, 0x68, 1, 255}, - {0x9E, 0x65, 1, 255}, - {0x9D, 0x62, 1, 255}, - {0x9C, 0x5F, 1, 255}, - {0x9B, 0x5C, 1, 255}, - {0x9A, 0x59, 1, 255}, - {0x99, 0x4E, 1, 255}, - {0x98, 0x4B, 1, 255}, - {0x97, 0x48, 1, 255}, - {0x96, 0x45, 1, 255}, - {0x95, 0x42, 1, 255}, - {0x94, 0x3F, 1, 255}, - {0x93, 0x3C, 1, 255}, - {0x92, 0x39, 1, 255}, - {0x91, 0x36, 1, 255}, - {0x90, 0x33, 1, 255}, - {0x8F, 0x30, 1, 255}, - {0x8E, 0x2D, 1, 255}, - {0x8D, 0x2A, 1, 255}, - {0x8C, 0x27, 1, 255}, - {0x8B, 0x24, 1, 255}, - {0x8A, 0x21, 1, 255}, - {0x89, 0x1E, 1, 255}, - {0x88, 0x1B, 1, 255}, - {0x87, 0x18, 1, 255}, - {0x86, 0x15, 1, 255}, - {0x85, 0x12, 1, 255}, - {0x84, 0xC, 1, 255}, - {0x83, 0x9, 1, 255}, - {0x82, 0x6, 1, 255}, - {0x81, 0x3, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 4}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 6}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 8}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 10}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0x0, 1, 12}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xB9, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 13}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 15}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 17}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 19}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 20}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 22}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 24}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 26}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 28}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 30}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 32}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 34}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 36}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 38}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 40}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 42}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 44}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 46}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 48}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 50}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 3, 255}, - {0xBA, 0x3, 1, 53}, - {0xB9, 0xBA, 0, 52}, - {0xB7, 0x0, 1, 255}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 2}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB8, 0xB8, 0, 3}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 54}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 56}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 58}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 60}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 61}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xBA, 0, 63}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 65}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 66}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB7, 0xB8, 0, 67}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB8, 0xB8, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0x0, 1, 2}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xB9, 0xB9, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBA, 0xBA, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 2, 255}, - {0xBE, 0xBE, 0, 3}, - {0xBD, 0x0, 1, 2}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xAD, 0x0, 1, 255}, - {0x8D, 0x0, 1, 255}, - {0xE0, 0x0, 1, 255}, - {0xAC, 0x0, 1, 255}, - {0xB7, 0xB7, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x87, 0x87, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x86, 0x86, 0, 2}, - {0x82, 0x82, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0xA6, 0xA7, 0, 1}, - {0xCC, 0x0, 4, 255}, - {0x8A, 0x8A, 0, 5}, - {0x87, 0x88, 0, 3}, - {0x83, 0x83, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x83, 0x83, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xCC, 0x0, 4, 255}, - {0xA8, 0xA8, 0, 5}, - {0x8B, 0x8B, 0, 4}, - {0x88, 0x88, 0, 3}, - {0x82, 0x83, 0, 1}, - {0x72, 0x72, 0, 1}, - {0x72, 0x72, 0, 2}, - {0x52, 0x52, 0, 1}, - {0xCC, 0x0, 3, 255}, - {0x8B, 0x8B, 0, 3}, - {0x88, 0x88, 0, 2}, - {0x82, 0x82, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xAF, 0x0, 1, 255}, - {0x8D, 0x0, 1, 3}, - {0xE0, 0x0, 1, 255}, - {0xAE, 0x0, 1, 255}, - {0xB7, 0x0, 1, 2}, - {0xE0, 0x0, 1, 255}, - {0xAF, 0x0, 1, 255}, - {0x8D, 0x8D, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xAF, 0x0, 1, 255}, - {0x8D, 0x8D, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xB9, 0x1, 1, 255}, - {0xB8, 0x0, 1, 255}, - {0xB2, 0xB2, 0, 1}, - {0x85, 0x85, 0, 2}, - {0xCC, 0x0, 2, 255}, - {0x84, 0x84, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xDA, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0xDA, 0x1, 1, 255}, - {0xD9, 0x0, 1, 255}, - {0x94, 0x94, 0, 1}, - {0xBE, 0xBE, 0, 2}, - {0xCC, 0x0, 2, 255}, - {0x9B, 0x9B, 0, 2}, - {0x82, 0x82, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x9B, 0x9B, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x61, 0x61, 0, 2}, - {0x88, 0x0, 1, 255}, - {0x61, 0x0, 1, 255}, - {0xCC, 0x0, 1, 255}, - {0x88, 0x88, 0, 1}, - {0xC3, 0x0, 1, 255}, - {0xA4, 0xA4, 0, 1}, - {0x65, 0x65, 0, 1}, - {0x69, 0x69, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x6F, 0x6F, 0, 2}, - {0x88, 0x0, 1, 255}, - {0x6F, 0x0, 1, 255}, - {0xCC, 0x0, 1, 255}, - {0x88, 0x88, 0, 1}, - {0xC3, 0x0, 1, 255}, - {0xB6, 0xB6, 0, 1}, - {0x63, 0x0, 1, 255}, - {0x68, 0x68, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x75, 0x75, 0, 2}, - {0x88, 0x0, 1, 255}, - {0x75, 0x0, 1, 255}, - {0xCC, 0x0, 1, 255}, - {0x88, 0x88, 0, 1}, - {0xC3, 0x0, 1, 255}, - {0xBC, 0xBC, 0, 1}, - {0xCC, 0x0, 3, 255}, - {0x8C, 0x8C, 0, 4}, - {0x84, 0x84, 0, 3}, - {0x80, 0x81, 0, 1}, - {0xCC, 0x0, 4, 255}, - {0x8C, 0x8C, 0, 8}, - {0x84, 0x84, 0, 7}, - {0x82, 0x0, 1, 255}, - {0x80, 0x81, 0, 5}, - {0xCC, 0x0, 3, 255}, - {0x8C, 0x8C, 0, 4}, - {0x84, 0x84, 0, 3}, - {0x80, 0x81, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x8C, 0x8C, 0, 2}, - {0x84, 0x84, 0, 1}, - {0xCC, 0x0, 4, 255}, - {0x8C, 0x8C, 0, 9}, - {0x88, 0x0, 1, 8}, - {0x84, 0x84, 0, 7}, - {0x80, 0x81, 0, 5}, - {0xCC, 0x0, 3, 255}, - {0x8C, 0x8C, 0, 4}, - {0x84, 0x84, 0, 3}, - {0x80, 0x81, 0, 1}, -} - -// Total size of mainTable is 1253028 bytes diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/Makefile b/vendor/golang.org/x/text/collate/tools/colcmp/Makefile deleted file mode 100644 index 1cf782263..000000000 --- a/vendor/golang.org/x/text/collate/tools/colcmp/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright 2012 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -chars: - go run ../../maketables.go -tables=chars -package=main > chars.go - gofmt -w -s chars.go diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/chars.go b/vendor/golang.org/x/text/collate/tools/colcmp/chars.go deleted file mode 100644 index 9f3b9d77f..000000000 --- a/vendor/golang.org/x/text/collate/tools/colcmp/chars.go +++ /dev/null @@ -1,1156 +0,0 @@ -// Generated by running -// maketables -root=http://unicode.org/Public/UCA/6.2.0/CollationAuxiliary.zip -cldr=http://www.unicode.org/Public/cldr/23/core.zip -// DO NOT EDIT -// TODO: implement more compact representation for sparse blocks. - -package main - -type exemplarType int - -const ( - exCharacters exemplarType = iota - exContractions - exPunctuation - exAuxiliary - exCurrency - exIndex - exN -) - -var exemplarCharacters = map[string][exN]string{ - "aa": { - 0: "a b t s e c k x i d q r f g o l m n u w h y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "j p v z", - 5: "A B T S E C K X I D Q R F G O L M N U W H Y", - }, - "af": { - 0: "a á â b c d e é è ê ë f g h i î ï j k l m n o ô ö p q r s t u û v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á à â ä ã æ ç é è ê ë í ì î ï ó ò ô ö ú ù û ü ý", - }, - "agq": { - 0: "a à â ǎ ā b c d e è ê ě ē ɛ ɛ̀ ɛ̂ ɛ̌ ɛ̄ f g h i ì î ǐ ī ɨ ɨ̀ ɨ̂ ɨ̌ ɨ̄ k l m n ŋ o ò ô ǒ ō ɔ ɔ̀ ɔ̂ ɔ̌ ɔ̄ p s t u ù û ǔ ū ʉ ʉ̀ ʉ̂ ʉ̌ ʉ̄ v w y z ʔ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q r x", - 5: "A B C D E Ɛ F G H I Ɨ K L M N Ŋ O Ɔ P S T U Ʉ V W Y Z ʔ", - }, - "ak": { - 0: "a b d e ɛ f g h i k l m n o ɔ p r s t u w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c j q v z", - 5: "A B C D E Ɛ F G H I J K L M N O Ɔ P Q R S T U V W X Y Z", - }, - "am": { - 0: "፟ ሀ ሀ ሁ ሂ ሃ ሄ ህ ሆ ለ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ሠ ሡ ሢ ሣ ሤ ሥ ሦ ሧ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቈ ቊ ቊ ቋ ቌ ቍ በ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኈ ኊ ኊ ኋ ኌ ኍ ነ ነ ኑ ኒ ና ኔ ን ኖ ኗ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ከ ኩ ኪ ካ ኬ ክ ኮ ኰ ኲ ኲ ኳ ኴ ኵ ኸ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ወ ወ ዉ ዊ ዋ ዌ ው ዎ ዐ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ዯ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ጀ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ገ ጉ ጊ ጋ ጌ ግ ጎ ጐ ጒ ጒ ጓ ጔ ጕ ጠ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ጰ ጱ ጲ ጳ ጴ ጵ ጶ ጷ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፀ ፁ ፂ ፃ ፄ ፅ ፆ ፇ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ ፘ ፙ ፚ", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "ar": { - 0: "ً ٌ ٍ َ ُ ِ ّ ْ ٰ ء آ أ ؤ إ ئ ا ب ت ة ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي ى", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d \u200e \u200f ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ پ چ ژ ڜ ڢ ڤ ڥ ٯ ڧ ڨ ک گ ی", - 5: "ا ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي", - }, - "as": { - 0: "অ আ ই ঈ উ ঊ ঋ এ ঐ ও ঔ ং ঁ ঃ ক ক্ষ খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ড় ড় ঢ ঢ় ঢ় ণ ত থ দ ধ ন প ফ ব ভ ম য য় ৰ ল ৱ শ ষ স হ া ি ী ু ূ ৃ ে ৈ ো ৌ ্", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d ৲", - }, - "asa": { - 0: "a b c d e f g h i j k l m n o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", - }, - "ast": { - 0: "a á b c d e é f g h ḥ i í l ḷ m n ñ o ó p q r s t u ú ü v x y z", - 2: "- ‐ – — , ; : ! ¡ ? ¿ . … ' ‘ ’ \" “ ” « » ( ) [ ] § @ * / \\ & # † ‡ ′ ″", - 3: "ª à ă â å ä ã ā æ ç è ĕ ê ë ē ì ĭ î ï ī j k º ò ŏ ô ö ø ō œ ù ŭ û ū w ÿ", - 5: "A B C D E F G H I L M N Ñ O P Q R S T U V X Y Z", - }, - "az": { - 0: "a b c ç d e ə f g ğ h x ı i İ j k q l m n o ö p r s ş t u ü v y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "w", - }, - "az-Cyrl": { - 0: "а ә б в г ғ д е ж з и й ј к ҝ л м н о ө п р с т у ү ф х һ ч ҹ ш ы", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "ц щ ъ ь э ю я", - }, - "bas": { - 0: "a á à â ǎ ā a᷆ a᷇ b ɓ c d e é è ê ě ē e᷆ e᷇ ɛ ɛ́ ɛ̀ ɛ̂ ɛ̌ ɛ̄ ɛ᷆ ɛ᷇ f g h i í ì î ǐ ī i᷆ i᷇ j k l m n ń ǹ ŋ o ó ò ô ǒ ō o᷆ o᷇ ɔ ɔ́ ɔ̀ ɔ̂ ɔ̌ ɔ̄ ɔ᷆ ɔ᷇ p r s t u ú ù û ǔ ū u᷆ u᷇ v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B Ɓ C D E Ɛ F G H I J K L M N Ŋ O Ɔ P R S T U V W Y Z", - }, - "be": { - 0: "а б в г д дж дз е ё ж з і й к л м н о п р с т у ў ф х ц ч ш ы ь э ю я", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "bem": { - 0: "a b c e f g i j k l m n o p s sh t u w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "d h q r v x z", - 5: "A B C E F G I J K L M N O P S SH T U W Y", - }, - "bez": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "x", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W Y Z", - }, - "bg": { - 0: "а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ь ю я", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "а̀ ѐ ё ѝ о̀ у̀ ъ̀ ы ѣ э ю̀ я̀ ѫ", - }, - "bm": { - 0: "a b c d e ɛ f g h i j k l m n ɲ ŋ o ɔ p r s t u w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q v x", - 5: "A B C D E Ɛ F G H I J K L M N Ɲ Ŋ O Ɔ P R S T U W Y Z", - }, - "bn": { - 0: "় ৺ অ আ ই ঈ উ ঊ ঋ ৠ ঌ ৡ এ ঐ ও ঔ ং ঃ ঁ ক ক্ষ খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ড় ঢ ঢ় ণ ত ৎ থ দ ধ ন প ফ ব ভ ম য য় র ল শ ষ স হ ঽ া ি ী ু ূ ৃ ৄ ৢ ৣ ে ৈ ো ৌ ্ ৗ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৰ ৱ", - }, - "bn-IN": { - 0: "় ৺ অ আ ই ঈ উ ঊ ঋ ৠ ঌ ৡ এ ঐ ও ঔ ং ঃ ঁ ক ক্ষ খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ড় ঢ ঢ় ণ ত ৎ থ দ ধ ন প ফ ব ভ ম য য় র ল শ ষ স হ ঽ া ি ী ু ূ ৃ ৄ ৢ ৣ ে ৈ ো ৌ ্ ৗ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৰ ৱ", - }, - "bo": { - 0: "ཾ ཿ ཀ ཀྵ ྐ ྐྵ ཁ ྑ ག གྷ ྒ ྒྷ ང ྔ ཅ ྕ ཆ ྖ ཇ ྗ ཉ ྙ ཊ ྚ ཋ ྛ ཌ ཌྷ ྜ ྜྷ ཎ ྞ ཏ ྟ ཐ ྠ ད དྷ ྡ ྡྷ ན ྣ པ ྤ ཕ ྥ བ བྷ ྦ ྦྷ མ ྨ ཙ ྩ ཚ ྪ ཛ ཛྷ ྫ ྫྷ ཝ ྭ ྺ ཞ ྮ ཟ ྯ འ ྰ ཡ ྱ ྻ ར ཪ ྲ ྼ ལ ླ ཤ ྴ ཥ ྵ ས ྶ ཧ ྷ ཨ ྸ ི ཱི ྀ ཱྀ ུ ཱུ ྲྀ ཷ ླྀ ཹ ཹ ེ ཻ ོ ཽ ྄", - 3: "ༀ", - }, - "br": { - 0: "a b ch cʼh d e ê f g h i j k l m n ñ o p r s t u ù v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á à ă â å ä ã ā æ c ç é è ĕ ë ē í ì ĭ î ï ī ó ò ŏ ô ö ø ō œ q ú ŭ û ü ū ÿ", - 5: "A B C D E F G H I J K L M N O P R S T U V W X Y Z", - }, - "brx": { - 0: "़ ँ ं अ आ इ ई उ ऊ ऍ ए ऐ ऑ ओ औ क ख ग घ च छ ज झ ञ ट ठ ड ड़ ढ ण त थ द ध न प फ ब भ म य र ल ळ व श ष स ह ा ि ी ु ू ृ ॅ े ै ॉ ो ौ ्", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d", - 5: "अ आ इ ई उ ऊ ऍ ए ऐ ऑ ओ औ क ख ग घ च छ ज झ ञ ट ठ ड ड़ ढ ण त थ द ध न प फ ब भ म य र ल ळ व श ष स ह", - }, - "bs": { - 0: "a b c č ć d dž đ e f g h i j k l lj m n nj o p r s š t u v z ž", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q w x y", - }, - "bs-Cyrl": { - 0: "а б в г д ђ е ж з и ј к л љ м н њ о п р с т ћ у ф х ц ч џ ш", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "byn": { - 0: "፟ ሀ ሀ ሁ ሂ ሃ ሄ ህ ሆ ለ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ረ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቈ ቊ ቊ ቋ ቌ ቍ ቐ ቐ ቑ ቒ ቓ ቔ ቕ ቖ ቘ ቚ ቚ ቛ ቜ ቝ በ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኈ ኊ ኊ ኋ ኌ ኍ ነ ነ ኑ ኒ ና ኔ ን ኖ ኗ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ከ ኩ ኪ ካ ኬ ክ ኮ ኰ ኲ ኲ ኳ ኴ ኵ ኸ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ዀ ዂ ዂ ዃ ዄ ዅ ወ ወ ዉ ዊ ዋ ዌ ው ዎ ዐ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ደ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ጀ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ገ ጉ ጊ ጋ ጌ ግ ጎ ጐ ጒ ጒ ጓ ጔ ጕ ጘ ጘ ጙ ጚ ጛ ጜ ጝ ጞ ጟ ⶓ ⶓ ⶔ ⶕ ⶖ ጠ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ጸ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፈ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "ca": { - 0: "a à b c ç d e é è f g h i í ï j k l ŀ m n o ó ò p q r s t u ú ü v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á ă â å ä ã ā æ ĕ ê ë ē ì ĭ î ī ñ º ŏ ô ö ø ō œ ù ŭ û ū ÿ", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "cgg": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "chr": { - 0: "Ꭰ Ꭱ Ꭲ Ꭳ Ꭴ Ꭵ Ꭶ Ꭷ Ꭸ Ꭹ Ꭺ Ꭻ Ꭼ Ꭽ Ꭾ Ꭿ Ꮀ Ꮁ Ꮂ Ꮃ Ꮄ Ꮅ Ꮆ Ꮇ Ꮈ Ꮉ Ꮊ Ꮋ Ꮌ Ꮍ Ꮎ Ꮏ Ꮐ Ꮑ Ꮒ Ꮓ Ꮔ Ꮕ Ꮖ Ꮗ Ꮘ Ꮙ Ꮚ Ꮛ Ꮜ Ꮝ Ꮞ Ꮟ Ꮠ Ꮡ Ꮢ Ꮣ Ꮤ Ꮥ Ꮦ Ꮧ Ꮨ Ꮩ Ꮪ Ꮫ Ꮬ Ꮭ Ꮮ Ꮯ Ꮰ Ꮱ Ꮲ Ꮳ Ꮴ Ꮵ Ꮶ Ꮷ Ꮸ Ꮹ Ꮺ Ꮻ Ꮼ Ꮽ Ꮾ Ꮿ Ᏸ Ᏹ Ᏺ Ᏻ Ᏼ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "Ꭰ Ꭶ Ꭽ Ꮃ Ꮉ Ꮎ Ꮖ Ꮜ Ꮣ Ꮬ Ꮳ Ꮹ Ꮿ", - }, - "cs": { - 0: "a á b c č d ď e é ě f g h ch i í j k l m n ň o ó p q r ř s š t ť u ú ů v w x y ý z ž", - 2: "- ‐ – , ; : ! ? . … ‘ ‚ “ „ ( ) [ ] § @ * / &", - 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ľ ł ñ ó ò ŏ ô ö ø ō œ ŕ ú ù ŭ û ü ū ÿ", - }, - "cy": { - 0: "a á à â ä b c ch d dd e é è ê ë f ff g ng h i í ì î ï j l ll m n o ó ò ô ö p ph r rh s t th u ú ù û ü w ẃ ẁ ŵ ẅ y ý ỳ ŷ ÿ", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", - 3: "k q v x z", - 5: "A B C CH D DD E F FF G NG H I J L LL M N O P PH R RH S T TH U W Y", - }, - "da": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z æ ø å", - 2: "- ‐ – , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ′ ″", - 3: "á à â ç é è ê ë í î ï ñ ó ô ú ù û ÿ ü æ ä ø ö œ å", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Æ Ø Å", - }, - "dav": { - 0: "a b c d e f g h i j k l m n o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", - }, - "de": { - 0: "a ä b c d e f g h i j k l m n o ö p q r s ß t u ü v w x y z", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ‚ \" “ „ « » ( ) [ ] { } § @ * / & #", - 3: "á à ă â å ã ā æ ç é è ĕ ê ë ē ğ í ì ĭ î ï İ ī ı ñ ó ò ŏ ô ø ō œ ş ú ù ŭ û ū ÿ", - 5: "A B C D E F G H I J K L M N O P Q R S Sch* St* T U V W X Y Z", - }, - "dje": { - 0: "a ã b c d e ẽ f g h i j k l m n ɲ ŋ o õ p q r s š t u w x y z ž", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "v", - 5: "A B C D E F G H I J K L M N Ɲ Ŋ O P Q R S T U W X Y Z", - }, - "dua": { - 0: "a á b ɓ c d ɗ e é ɛ ɛ́ f g i í j k l m n ny ŋ o ó ɔ ɔ́ p r s t u ú ū w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "h q v x z", - 5: "A B Ɓ C D Ɗ E Ɛ F G I J K L M N Ŋ O Ɔ P S T U W Y", - }, - "dyo": { - 0: "a á b c d e é f g h i í j k l m n ñ ŋ o ó p q r s t u ú v w x y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "z", - 5: "A B C D E F G H I J K L M N Ñ Ŋ O P Q R S T U V W X Y", - }, - "dz": { - 0: "ཀ ྐ ཁ ྑ ག ྒ ང ྔ ཅ ཆ ཇ ྗ ཉ ྙ ཏ ྟ ཐ ྠ ད ྡ ན ྣ པ ྤ ཕ ྥ བ ྦ མ ྨ ཙ ྩ ཚ ྪ ཛ ྫ ཝ ྭ ཞ ཟ འ ཡ ྱ ར ྲ ལ ླ ཤ ྵ ས ྶ ཧ ྷ ཨ ི ུ ེ ོ", - 2: "- ‐ – — , ; : ༔ ! ? . … ' ‘ ’ \" “ ” ( ) [ ] ༼ ༽ § @ * / & # † ‡ ༄ ༅ ༆ ༈ ༉ ༊ ࿐ ࿑ ༌ ། ༎ ༏ ༐ ༑ ༒ ࿒ ࿓ ࿔ ༴ ༶ ྾ ྿", - 3: "ཾ ཊ ྚ ཋ ྛ ཌ ྜ ཎ ྞ ྺ ྻ ྼ ཥ ྀ ཻ ཽ ྄", - }, - "ebu": { - 0: "a b c d e f g h i ĩ j k l m n o p q r s t u ũ v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I Ĩ J K L M N O P Q R S T U Ũ V W X Y Z", - }, - "ee": { - 0: "a á à ã b d ɖ e é è ẽ ɛ ɛ́ ɛ̀ ɛ̃ f ƒ g ɣ h x i í ì ĩ k l m n ŋ o ó ò õ ɔ ɔ́ ɔ̀ ɔ̃ p r s t u ú ù ũ v ʋ w y z", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] { } § @ * / & # † ‡ ′ ″", - 3: "ă â å ä ā æ c ç ĕ ê ë ĭ î ï j ñ ŏ ô ö ø œ q ŭ û ü ÿ", - 5: "A B D Ɖ E Ɛ F Ƒ G Ɣ H X I K L M N Ŋ O Ɔ P R S T U V Ʋ W Y Z", - }, - "el": { - 0: "α ά β γ δ ε έ ζ η ή θ ι ί ϊ ΐ κ λ μ ν ξ ο ό π ρ σ ς τ υ ύ ϋ ΰ φ χ ψ ω ώ", - 2: "- ‐ – — , ; : ! . … \" ( ) [ ] § @ * / \\ &", - 3: "ἀ ἄ ἂ ἆ ἁ ἅ ἃ ἇ ὰ ᾶ ἐ ἔ ἒ ἑ ἕ ἓ ὲ ἠ ἤ ἢ ἦ ἡ ἥ ἣ ἧ ὴ ῆ ἰ ἴ ἲ ἶ ἱ ἵ ἳ ἷ ὶ ῖ ῒ ῗ ὄ ὂ ὃ ὸ ὐ ὔ ὒ ὖ ὑ ὕ ὓ ὗ ὺ ῦ ῢ ῧ ὤ ὢ ὦ ὥ ὣ ὧ ὼ ῶ", - 5: "Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω", - }, - "en": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", - 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ú ù ŭ û ü ū ÿ", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "en-Dsrt": { - 0: "𐐨 𐐩 𐐪 𐐫 𐐬 𐐭 𐐮 𐐯 𐐰 𐐱 𐐲 𐐳 𐐴 𐐵 𐐶 𐐷 𐐸 𐐹 𐐺 𐐻 𐐼 𐐽 𐐾 𐐿 𐑀 𐑁 𐑂 𐑃 𐑄 𐑅 𐑆 𐑇 𐑈 𐑉 𐑊 𐑋 𐑌 𐑍 𐑎 𐑏", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", - }, - "en-GB": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", - 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ú ù ŭ û ü ū ÿ", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "en-ZA": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "eo": { - 0: "a b c ĉ d e f g ĝ h ĥ i j ĵ k l m n o p r s ŝ t u ŭ v z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q w x y", - 5: "A B C Ĉ D E F G Ĝ H Ĥ I J Ĵ K L M N O P R S Ŝ T U Ŭ V Z", - }, - "es": { - 0: "a á b c d e é f g h i í j k l m n ñ o ó p q r s t u ú ü v w x y z", - 2: "- ‐ – — , ; : ! ¡ ? ¿ . … ' ‘ ’ \" “ ” « » ( ) [ ] § @ * / \\ & # † ‡ ′ ″", - 3: "ª à ă â å ä ã ā æ ç è ĕ ê ë ē ì ĭ î ï ī º ò ŏ ô ö ø ō œ ù ŭ û ū ÿ", - 5: "A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z", - }, - "et": { - 0: "a b c d e f g h i j k l m n o p q r s š z ž t u v w õ ä ö ü x y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á à â å ā æ ç é è ê ë ē í ì î ï ī ñ ó ò ŏ ô ø ō œ ú ù û ū", - 5: "A B C D E F G H I J K L M N O P Q R S Š Z Ž T U V Õ Ä Ö Ü X Y", - }, - "eu": { - 0: "a b c ç d e f g h i j k l m n ñ o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ú ù ŭ û ü ū ÿ", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "ewo": { - 0: "a á à â ǎ b d dz e é è ê ě ə ə́ ə̀ ə̂ ə̌ ɛ ɛ́ ɛ̀ ɛ̂ ɛ̌ f g h i í ì î ǐ k kp l m n ń ǹ ng nk ŋ o ó ò ô ǒ ɔ ɔ́ ɔ̀ ɔ̂ ɔ̌ p r s t ts u ú ù û ǔ v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c j q x", - 5: "A B D E Ə Ɛ F G H I K L M N Ŋ O Ɔ P R S T U V W Y Z", - }, - "fa": { - 0: "ً ٍ ٌ ّ ٔ آ ا ء أ ؤ ئ ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ة ی", - 2: "- ‐ ، ٫ ٬ ؛ : ! ؟ . … « » ( ) [ ] * / \\", - 3: "\u200c \u200d \u200e \u200f َ ِ ُ ْ ٖ ٰ ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ إ ك ى ي", - 5: "آ ا ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ی", - }, - "fa-AF": { - 0: "ً ٍ ٌ ّ ٔ آ ا ء أ ؤ ئ ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ة ی", - 2: "- ‐ ، ٫ ٬ ؛ : ! ؟ . … « » ( ) [ ] * / \\", - 3: "ٖ ٰ \u200c \u200d ټ ځ څ ډ ړ ږ ښ ګ ڼ ي", - 5: "آ ا ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ی", - }, - "ff": { - 0: "a b ɓ c d ɗ e f g h i j k l m n ñ ŋ o p r s t u w y ƴ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q v x z", - 5: "A B Ɓ C D Ɗ E F G H I J K L M N Ñ Ŋ O P R S T U W Y Ƴ", - }, - "fi": { - 0: "a b c d e f g h i j k l m n o p q r s š t u v w x y z ž å ä ö", - 3: "á à â ã č ç đ é è ê ë ǧ ǥ ȟ í î ï ǩ ń ñ ŋ ô õ œ ř ß ŧ ú ù û ÿ ü ʒ ǯ æ ø", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Å Ä Ö", - }, - "fil": { - 0: "a b c d e f g h i j k l m n ñ ng o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á à â é è ê í ì î ó ò ô ú ù û", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "fo": { - 0: "a á b d ð e f g h i í j k l m n o ó p r s t u ú v x y ý æ ø", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c q w z", - }, - "fr": { - 0: "a à â æ b c ç d e é è ê ë f g h i î ï j k l m n o ô œ p q r s t u ù û ü v w x y ÿ z", - 2: "- ‐ – — , ; : ! ? . … ’ \" “ ” « » ( ) [ ] § @ * / & # † ‡", - 3: "á å ä ã ā ē í ì ī ñ ó ò ö ø ú ǔ", - }, - "fur": { - 0: "a à â b c ç d e è ê f g h i ì î j k l m n o ò ô p q r s t u ù û v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "å č é ë ğ ï ñ ó š ü", - }, - "ga": { - 0: "a á b c d e é f g h i í l m n o ó p r s t u ú", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "å ḃ ċ ḋ ḟ ġ j k ṁ ṗ q ṡ ṫ v w x y z", - }, - "gd": { - 0: "a à b c d e è f g h i ì l m n o ò p r s t u ù", - 3: "á ċ ḋ é ḟ ġ j k ṁ ó ṗ q ṡ ṫ v w x y z", - 5: "A B C D E F G H I L M N O P R S T U", - }, - "gl": { - 0: "a á b c d e é f g h i í j k l m n ñ o ó p q r s t u ú ü v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z", - }, - "gsw": { - 0: "a ä b c d e f g h i j k l m n o ö p q r s t u ü v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á à ă â å ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ø ō œ ú ù ŭ û ū ÿ", - }, - "gu": { - 0: "઼ ૐ ં ઁ ઃ અ આ ઇ ઈ ઉ ઊ ઋ ૠ ઍ એ ઐ ઑ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ વ શ ષ સ હ ળ ઽ ા િ ી ુ ૂ ૃ ૄ ૅ ે ૈ ૉ ો ૌ ્", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d ૰", - 5: "અ આ ઇ ઈ ઉ ઊ ઋ એ ઐ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ વ શ ષ સ હ ળ", - }, - "guz": { - 0: "a b c d e f g h i j k l m n o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", - }, - "gv": { - 0: "a b c ç d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "ha": { - 0: "a b ɓ c d ɗ e f g h i j k ƙ l m n o r s sh t ts u w y ʼy z ʼ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á à â é è ê í ì î ó ò ô p q r̃ ú ù û v x ƴ", - }, - "haw": { - 0: "a ā e ē i ī o ō u ū h k l m n p w ʻ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "b c d f g j q r s t v x y z", - }, - "he": { - 0: "א ב ג ד ה ו ז ח ט י כ ך ל מ ם נ ן ס ע פ ף צ ץ ק ר ש ת", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "ֽ ׄ \u200e \u200f ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֻ ׂ ׁ ּ ֿ ־ ׳ ״", - 5: "א ב ג ד ה ו ז ח ט י כ ל מ נ ס ע פ צ ק ר ש ת", - }, - "hi": { - 0: "़ ॐ ं ँ ः अ आ इ ई उ ऊ ऋ ऌ ऍ ए ऐ ऑ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल ळ व श ष स ह ऽ ा ि ी ु ू ृ ॄ ॅ े ै ॉ ो ौ ्", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d", - }, - "hr": { - 0: "a b c č ć d dž đ e f g h i j k l lj m n nj o p r s š t u v z ž", - 2: "‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] @ * / ′ ″", - 3: "q w x y", - 5: "A B C Č Ć D DŽ Đ E F G H I J K L LJ M N NJ O P Q R S Š T U V W X Y Z Ž", - }, - "hu": { - 0: "a á b c cs ccs d dz ddz dzs ddzs e é f g gy ggy h i í j k l ly lly m n ny nny o ó ö ő p r s sz ssz t ty tty u ú ü ű v z zs zzs", - 2: "- – , ; : ! ? . … ' ’ \" ” „ « » ( ) [ ] { } 〈 〉 § @ * / & # ⸓ ~", - 3: "à ă â å ä ã ā æ ç è ĕ ê ë ē ì ĭ î ï ī ñ ò ŏ ô ø ō œ q ù ŭ û ū w x y ÿ", - 5: "A Á B C CS D DZ DZS E É F G GY H I Í J K L LY M N NY O Ó Ö Ő P Q R S SZ T TY U Ú Ü Ű V W X Y Z ZS", - }, - "hy": { - 0: "ա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն շ ո չ պ ջ ռ ս վ տ ր ց ւ փ ք և օ ֆ", - 2: "֊ ՝ ՜ ՞ « » ՚ ՛ ՟", - }, - "ia": { - 0: "a b c ch d e f g h i j k l m n o p ph q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "id": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "‐ – — , ; : ! ? . … ' ‘ ’ “ ” ( ) [ ] /", - 3: "å q x z", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "ig": { - 0: "a b ch d e ẹ f g gb gh gw h i ị j k kp kw l m n ṅ nw ny o ọ p r s sh t u ụ v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "ii": { - 0: "ꀀ ꀀ ꀁ ꀂ ꀃ ꀄ ꀅ ꀆ ꀇ ꀈ ꀉ ꀊ ꀋ ꀌ ꀍ ꀎ ꀏ ꀐ ꀑ ꀒ ꀓ ꀔ ꀕ ꀖ ꀗ ꀘ ꀙ ꀚ ꀛ ꀜ ꀝ ꀞ ꀟ ꀠ ꀡ ꀢ ꀣ ꀤ ꀥ ꀦ ꀧ ꀨ ꀩ ꀪ ꀫ ꀬ ꀭ ꀮ ꀯ ꀰ ꀱ ꀲ ꀳ ꀴ ꀵ ꀶ ꀷ ꀸ ꀹ ꀺ ꀻ ꀼ ꀽ ꀾ ꀿ ꁀ ꁁ ꁂ ꁃ ꁄ ꁅ ꁆ ꁇ ꁈ ꁉ ꁊ ꁋ ꁌ ꁍ ꁎ ꁏ ꁐ ꁑ ꁒ ꁓ ꁔ ꁕ ꁖ ꁗ ꁘ ꁙ ꁚ ꁛ ꁜ ꁝ ꁞ ꁟ ꁠ ꁡ ꁢ ꁣ ꁤ ꁥ ꁦ ꁧ ꁨ ꁩ ꁪ ꁫ ꁬ ꁭ ꁮ ꁯ ꁰ ꁱ ꁲ ꁳ ꁴ ꁵ ꁶ ꁷ ꁸ ꁹ ꁺ ꁻ ꁼ ꁽ ꁾ ꁿ ꂀ ꂁ ꂂ ꂃ ꂄ ꂅ ꂆ ꂇ ꂈ ꂉ ꂊ ꂋ ꂌ ꂍ ꂎ ꂏ ꂐ ꂑ ꂒ ꂓ ꂔ ꂕ ꂖ ꂗ ꂘ ꂙ ꂚ ꂛ ꂜ ꂝ ꂞ ꂟ ꂠ ꂡ ꂢ ꂣ ꂤ ꂥ ꂦ ꂧ ꂨ ꂩ ꂪ ꂫ ꂬ ꂭ ꂮ ꂯ ꂰ ꂱ ꂲ ꂳ ꂴ ꂵ ꂶ ꂷ ꂸ ꂹ ꂺ ꂻ ꂼ ꂽ ꂾ ꂿ ꃀ ꃁ ꃂ ꃃ ꃄ ꃅ ꃆ ꃇ ꃈ ꃉ ꃊ ꃋ ꃌ ꃍ ꃎ ꃏ ꃐ ꃑ ꃒ ꃓ ꃔ ꃕ ꃖ ꃗ ꃘ ꃙ ꃚ ꃛ ꃜ ꃝ ꃞ ꃟ ꃠ ꃡ ꃢ ꃣ ꃤ ꃥ ꃦ ꃧ ꃨ ꃩ ꃪ ꃫ ꃬ ꃭ ꃮ ꃯ ꃰ ꃱ ꃲ ꃳ ꃴ ꃵ ꃶ ꃷ ꃸ ꃹ ꃺ ꃻ ꃼ ꃽ ꃾ ꃿ ꄀ ꄁ ꄂ ꄃ ꄄ ꄅ ꄆ ꄇ ꄈ ꄉ ꄊ ꄋ ꄌ ꄍ ꄎ ꄏ ꄐ ꄑ ꄒ ꄓ ꄔ ꄕ ꄖ ꄗ ꄘ ꄙ ꄚ ꄛ ꄜ ꄝ ꄞ ꄟ ꄠ ꄡ ꄢ ꄣ ꄤ ꄥ ꄦ ꄧ ꄨ ꄩ ꄪ ꄫ ꄬ ꄭ ꄮ ꄯ ꄰ ꄱ ꄲ ꄳ ꄴ ꄵ ꄶ ꄷ ꄸ ꄹ ꄺ ꄻ ꄼ ꄽ ꄾ ꄿ ꅀ ꅁ ꅂ ꅃ ꅄ ꅅ ꅆ ꅇ ꅈ ꅉ ꅊ ꅋ ꅌ ꅍ ꅎ ꅏ ꅐ ꅑ ꅒ ꅓ ꅔ ꅕ ꅖ ꅗ ꅘ ꅙ ꅚ ꅛ ꅜ ꅝ ꅞ ꅟ ꅠ ꅡ ꅢ ꅣ ꅤ ꅥ ꅦ ꅧ ꅨ ꅩ ꅪ ꅫ ꅬ ꅭ ꅮ ꅯ ꅰ ꅱ ꅲ ꅳ ꅴ ꅵ ꅶ ꅷ ꅸ ꅹ ꅺ ꅻ ꅼ ꅽ ꅾ ꅿ ꆀ ꆁ ꆂ ꆃ ꆄ ꆅ ꆆ ꆇ ꆈ ꆉ ꆊ ꆋ ꆌ ꆍ ꆎ ꆏ ꆐ ꆑ ꆒ ꆓ ꆔ ꆕ ꆖ ꆗ ꆘ ꆙ ꆚ ꆛ ꆜ ꆝ ꆞ ꆟ ꆠ ꆡ ꆢ ꆣ ꆤ ꆥ ꆦ ꆧ ꆨ ꆩ ꆪ ꆫ ꆬ ꆭ ꆮ ꆯ ꆰ ꆱ ꆲ ꆳ ꆴ ꆵ ꆶ ꆷ ꆸ ꆹ ꆺ ꆻ ꆼ ꆽ ꆾ ꆿ ꇀ ꇁ ꇂ ꇃ ꇄ ꇅ ꇆ ꇇ ꇈ ꇉ ꇊ ꇋ ꇌ ꇍ ꇎ ꇏ ꇐ ꇑ ꇒ ꇓ ꇔ ꇕ ꇖ ꇗ ꇘ ꇙ ꇚ ꇛ ꇜ ꇝ ꇞ ꇟ ꇠ ꇡ ꇢ ꇣ ꇤ ꇥ ꇦ ꇧ ꇨ ꇩ ꇪ ꇫ ꇬ ꇭ ꇮ ꇯ ꇰ ꇱ ꇲ ꇳ ꇴ ꇵ ꇶ ꇷ ꇸ ꇹ ꇺ ꇻ ꇼ ꇽ ꇾ ꇿ ꈀ ꈁ ꈂ ꈃ ꈄ ꈅ ꈆ ꈇ ꈈ ꈉ ꈊ ꈋ ꈌ ꈍ ꈎ ꈏ ꈐ ꈑ ꈒ ꈓ ꈔ ꈕ ꈖ ꈗ ꈘ ꈙ ꈚ ꈛ ꈜ ꈝ ꈞ ꈟ ꈠ ꈡ ꈢ ꈣ ꈤ ꈥ ꈦ ꈧ ꈨ ꈩ ꈪ ꈫ ꈬ ꈭ ꈮ ꈯ ꈰ ꈱ ꈲ ꈳ ꈴ ꈵ ꈶ ꈷ ꈸ ꈹ ꈺ ꈻ ꈼ ꈽ ꈾ ꈿ ꉀ ꉁ ꉂ ꉃ ꉄ ꉅ ꉆ ꉇ ꉈ ꉉ ꉊ ꉋ ꉌ ꉍ ꉎ ꉏ ꉐ ꉑ ꉒ ꉓ ꉔ ꉕ ꉖ ꉗ ꉘ ꉙ ꉚ ꉛ ꉜ ꉝ ꉞ ꉟ ꉠ ꉡ ꉢ ꉣ ꉤ ꉥ ꉦ ꉧ ꉨ ꉩ ꉪ ꉫ ꉬ ꉭ ꉮ ꉯ ꉰ ꉱ ꉲ ꉳ ꉴ ꉵ ꉶ ꉷ ꉸ ꉹ ꉺ ꉻ ꉼ ꉽ ꉾ ꉿ ꊀ ꊁ ꊂ ꊃ ꊄ ꊅ ꊆ ꊇ ꊈ ꊉ ꊊ ꊋ ꊌ ꊍ ꊎ ꊏ ꊐ ꊑ ꊒ ꊓ ꊔ ꊕ ꊖ ꊗ ꊘ ꊙ ꊚ ꊛ ꊜ ꊝ ꊞ ꊟ ꊠ ꊡ ꊢ ꊣ ꊤ ꊥ ꊦ ꊧ ꊨ ꊩ ꊪ ꊫ ꊬ ꊭ ꊮ ꊯ ꊰ ꊱ ꊲ ꊳ ꊴ ꊵ ꊶ ꊷ ꊸ ꊹ ꊺ ꊻ ꊼ ꊽ ꊾ ꊿ ꋀ ꋁ ꋂ ꋃ ꋄ ꋅ ꋆ ꋇ ꋈ ꋉ ꋊ ꋋ ꋌ ꋍ ꋎ ꋏ ꋐ ꋑ ꋒ ꋓ ꋔ ꋕ ꋖ ꋗ ꋘ ꋙ ꋚ ꋛ ꋜ ꋝ ꋞ ꋟ ꋠ ꋡ ꋢ ꋣ ꋤ ꋥ ꋦ ꋧ ꋨ ꋩ ꋪ ꋫ ꋬ ꋭ ꋮ ꋯ ꋰ ꋱ ꋲ ꋳ ꋴ ꋵ ꋶ ꋷ ꋸ ꋹ ꋺ ꋻ ꋼ ꋽ ꋾ ꋿ ꌀ ꌁ ꌂ ꌃ ꌄ ꌅ ꌆ ꌇ ꌈ ꌉ ꌊ ꌋ ꌌ ꌍ ꌎ ꌏ ꌐ ꌑ ꌒ ꌓ ꌔ ꌕ ꌖ ꌗ ꌘ ꌙ ꌚ ꌛ ꌜ ꌝ ꌞ ꌟ ꌠ ꌡ ꌢ ꌣ ꌤ ꌥ ꌦ ꌧ ꌨ ꌩ ꌪ ꌫ ꌬ ꌭ ꌮ ꌯ ꌰ ꌱ ꌲ ꌳ ꌴ ꌵ ꌶ ꌷ ꌸ ꌹ ꌺ ꌻ ꌼ ꌽ ꌾ ꌿ ꍀ ꍁ ꍂ ꍃ ꍄ ꍅ ꍆ ꍇ ꍈ ꍉ ꍊ ꍋ ꍌ ꍍ ꍎ ꍏ ꍐ ꍑ ꍒ ꍓ ꍔ ꍕ ꍖ ꍗ ꍘ ꍙ ꍚ ꍛ ꍜ ꍝ ꍞ ꍟ ꍠ ꍡ ꍢ ꍣ ꍤ ꍥ ꍦ ꍧ ꍨ ꍩ ꍪ ꍫ ꍬ ꍭ ꍮ ꍯ ꍰ ꍱ ꍲ ꍳ ꍴ ꍵ ꍶ ꍷ ꍸ ꍹ ꍺ ꍻ ꍼ ꍽ ꍾ ꍿ ꎀ ꎁ ꎂ ꎃ ꎄ ꎅ ꎆ ꎇ ꎈ ꎉ ꎊ ꎋ ꎌ ꎍ ꎎ ꎏ ꎐ ꎑ ꎒ ꎓ ꎔ ꎕ ꎖ ꎗ ꎘ ꎙ ꎚ ꎛ ꎜ ꎝ ꎞ ꎟ ꎠ ꎡ ꎢ ꎣ ꎤ ꎥ ꎦ ꎧ ꎨ ꎩ ꎪ ꎫ ꎬ ꎭ ꎮ ꎯ ꎰ ꎱ ꎲ ꎳ ꎴ ꎵ ꎶ ꎷ ꎸ ꎹ ꎺ ꎻ ꎼ ꎽ ꎾ ꎿ ꏀ ꏁ ꏂ ꏃ ꏄ ꏅ ꏆ ꏇ ꏈ ꏉ ꏊ ꏋ ꏌ ꏍ ꏎ ꏏ ꏐ ꏑ ꏒ ꏓ ꏔ ꏕ ꏖ ꏗ ꏘ ꏙ ꏚ ꏛ ꏜ ꏝ ꏞ ꏟ ꏠ ꏡ ꏢ ꏣ ꏤ ꏥ ꏦ ꏧ ꏨ ꏩ ꏪ ꏫ ꏬ ꏭ ꏮ ꏯ ꏰ ꏱ ꏲ ꏳ ꏴ ꏵ ꏶ ꏷ ꏸ ꏹ ꏺ ꏻ ꏼ ꏽ ꏾ ꏿ ꐀ ꐁ ꐂ ꐃ ꐄ ꐅ ꐆ ꐇ ꐈ ꐉ ꐊ ꐋ ꐌ ꐍ ꐎ ꐏ ꐐ ꐑ ꐒ ꐓ ꐔ ꐕ ꐖ ꐗ ꐘ ꐙ ꐚ ꐛ ꐜ ꐝ ꐞ ꐟ ꐠ ꐡ ꐢ ꐣ ꐤ ꐥ ꐦ ꐧ ꐨ ꐩ ꐪ ꐫ ꐬ ꐭ ꐮ ꐯ ꐰ ꐱ ꐲ ꐳ ꐴ ꐵ ꐶ ꐷ ꐸ ꐹ ꐺ ꐻ ꐼ ꐽ ꐾ ꐿ ꑀ ꑁ ꑂ ꑃ ꑄ ꑅ ꑆ ꑇ ꑈ ꑉ ꑊ ꑋ ꑌ ꑍ ꑎ ꑏ ꑐ ꑑ ꑒ ꑓ ꑔ ꑕ ꑖ ꑗ ꑘ ꑙ ꑚ ꑛ ꑜ ꑝ ꑞ ꑟ ꑠ ꑡ ꑢ ꑣ ꑤ ꑥ ꑦ ꑧ ꑨ ꑩ ꑪ ꑫ ꑬ ꑭ ꑮ ꑯ ꑰ ꑱ ꑲ ꑳ ꑴ ꑵ ꑶ ꑷ ꑸ ꑹ ꑺ ꑻ ꑼ ꑽ ꑾ ꑿ ꒀ ꒁ ꒂ ꒃ ꒄ ꒅ ꒆ ꒇ ꒈ ꒉ ꒊ ꒋ ꒌ", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "is": { - 0: "a á b d ð e é f g h i í j k l m n o ó p r s t u ú v y ý þ æ ö", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c q w x z", - }, - "it": { - 0: "a à b c d e é è f g h i ì j k l m n o ó ò p q r s t u ù v w x y z", - 2: "- — , ; : ! ? . … “ ” ( ) [ ] { } @ /", - 3: "á â å ä ã æ ç ê ë í î ï ñ ô ö õ ø œ ß ú û ü ÿ", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "ja": { - 0: "々 ゞ ー ゝ ヽ ヾ ぁ ァ あ ア ぃ ィ い イ ぅ ゥ う ウ ヴ ぇ ェ え エ ぉ ォ お オ ヵ か カ が ガ き キ ぎ ギ く ク ぐ グ ヶ け ケ げ ゲ こ コ ご ゴ さ サ ざ ザ し シ じ ジ す ス ず ズ せ セ ぜ ゼ そ ソ ぞ ゾ た タ だ ダ ち チ ぢ ヂ っ ッ つ ツ づ ヅ て テ で デ と ト ど ド な ナ に ニ ぬ ヌ ね ネ の ノ は ハ ば バ ぱ パ ひ ヒ び ビ ぴ ピ ふ フ ぶ ブ ぷ プ へ ヘ べ ベ ぺ ペ ほ ホ ぼ ボ ぽ ポ ま マ み ミ む ム め メ も モ ゃ ャ や ヤ ゅ ュ ゆ ユ ょ ョ よ ヨ ら ラ り リ る ル れ レ ろ ロ ゎ ヮ わ ワ ゐ ヰ ゑ ヱ を ヲ ん ン 一 丁 七 万 万 丈 三 上 下 不 与 丑 且 世 丘 丙 両 並 中 丸 丹 主 久 乏 乗 乙 九 乱 乳 乾 亀 了 予 争 事 二 互 五 井 亜 亡 交 亥 亨 享 享 京 亭 人 仁 今 介 仏 仕 他 付 仙 代 代 令 以 仮 仰 仲 件 任 企 伊 伏 伏 伐 休 会 伝 伯 伴 伸 伺 似 但 位 位 低 住 佐 体 何 余 作 佳 併 使 例 侍 供 依 価 侮 侯 侵 便 係 促 俊 俗 保 信 修 俳 俵 俸 俺 倉 個 倍 倒 候 借 倣 値 倫 倹 偉 偏 停 健 側 側 偵 偶 偽 傍 傑 傘 備 催 債 傷 傾 働 像 僕 僚 僧 儀 億 儒 償 優 元 元 兄 充 兆 先 光 克 免 兎 児 党 入 全 八 八 公 六 共 兵 具 典 兼 内 円 冊 再 冒 冗 写 冠 冬 冷 准 凍 凝 凡 処 凶 凸 凸 凹 出 刀 刃 分 分 切 刈 刊 刑 列 初 判 別 利 到 制 制 刷 券 刺 刻 則 削 前 剖 剛 剣 剤 副 剰 割 創 劇 力 功 加 劣 助 努 励 労 効 劾 勅 勇 勉 動 勘 務 勝 募 勢 勤 勧 勲 勺 匁 包 化 北 匠 匹 匹 区 医 匿 十 千 升 午 半 卑 卑 卒 卓 協 南 単 博 占 卯 卯 印 危 即 即 却 卵 卸 厄 厘 厚 原 厳 去 参 又 及 及 友 双 反 収 叔 取 受 叙 口 口 古 句 叫 召 可 台 史 右 号 司 各 合 吉 同 同 名 后 吏 吐 向 君 吟 否 含 吸 吹 呈 呈 呉 告 周 味 呼 命 和 咲 哀 品 員 哲 唆 唇 唐 唯 唱 商 問 啓 善 喚 喜 喝 喪 喫 営 嗣 嘆 嘉 嘱 器 噴 嚇 囚 四 回 因 団 困 囲 図 固 国 圏 園 土 圧 在 地 坂 均 坊 坑 坪 垂 型 垣 埋 城 域 執 培 基 埼 堀 堂 堅 堕 堤 堪 報 場 塀 塁 塊 塑 塔 塗 塚 塩 塾 境 墓 増 墜 墨 墳 墾 壁 壇 壊 壌 士 壬 壮 声 声 壱 売 変 夏 夕 外 多 夜 夢 大 天 天 太 夫 央 失 奇 奇 奈 奉 奏 契 奔 奥 奨 奪 奮 女 奴 好 如 如 妃 妄 妊 妙 妥 妨 妹 妻 姉 始 姓 委 姫 姻 姿 威 娘 娠 娯 婆 婚 婦 婿 媒 嫁 嫌 嫡 嬢 子 孔 字 存 孝 季 孤 学 孫 宅 宇 宇 守 安 完 宗 宗 官 宙 定 宜 宝 実 客 客 宣 室 宮 宰 害 害 宴 宵 家 容 宿 寂 寄 寄 寅 密 富 寒 寛 寝 察 寡 寧 審 寮 寸 寺 対 寿 封 専 射 将 尉 尉 尊 尋 導 小 少 尚 就 尺 尼 尼 尽 尾 尿 局 居 屈 届 屋 展 属 層 履 屯 山 岐 岡 岩 岬 岳 岸 峠 峡 峰 島 崇 崎 崩 川 州 巡 巣 工 工 左 巧 巨 差 己 巳 巻 市 布 帆 希 帝 帥 師 席 帯 帰 帳 常 帽 幅 幕 幣 干 干 平 年 幸 幹 幻 幻 幼 幽 幾 庁 広 床 序 底 店 庚 府 度 座 庫 庭 庶 庶 康 庸 廃 廉 廊 延 廷 建 弁 弊 式 弐 弓 弓 弔 引 弘 弟 弦 弧 弱 張 強 弾 当 形 彩 彫 彰 影 役 彼 往 征 径 待 律 後 徐 徒 従 得 御 復 循 微 徳 徴 徹 心 必 忌 忍 志 志 忘 忙 応 忠 快 念 怒 怖 思 怠 急 性 怪 恋 恐 恒 恥 恨 恩 恭 息 恵 悔 悟 悠 患 悦 悩 悪 悲 悼 情 惑 惜 惨 惰 想 愁 愉 意 愚 愛 感 慈 態 慌 慎 慕 慢 慣 慨 慮 慰 慶 憂 憎 憤 憩 憲 憶 憾 懇 懐 懲 懸 戊 戌 成 成 我 戒 戦 戯 戸 戻 房 所 扇 扉 手 才 打 払 扱 扶 批 承 技 抄 把 抑 投 抗 折 抜 択 披 抱 抵 抹 押 抽 担 拍 拐 拒 拓 拘 拙 招 拝 拠 拡 括 拷 拾 持 指 挑 挙 挟 振 挿 捕 捜 捨 据 掃 授 掌 排 掘 掛 採 探 接 控 推 措 掲 描 提 揚 換 握 揮 援 揺 損 搬 搭 携 搾 摂 摘 摩 撃 撤 撮 撲 擁 操 擦 擬 支 改 攻 放 政 故 敏 救 敗 教 敢 散 敬 数 整 敵 敷 文 斉 斎 斗 料 斜 斤 斥 断 新 方 施 旅 旋 族 旗 既 日 旧 旧 旨 早 旬 昆 昇 昌 明 易 昔 星 映 春 昨 昭 是 昼 時 晩 普 景 晴 晶 暁 暇 暑 暖 暗 暦 暫 暮 暴 曇 曜 曲 更 書 曹 替 最 月 有 服 朕 朗 望 朝 期 木 未 未 末 本 札 朱 朴 机 朽 杉 材 村 束 条 来 杯 東 松 板 析 林 枚 果 枝 枠 枢 枯 架 柄 某 染 柔 柱 柳 査 栄 栓 校 株 核 根 格 栽 桃 案 桑 桜 桟 梅 械 棄 棋 棒 棚 棟 森 棺 植 検 業 極 楼 楽 概 構 様 槽 標 模 権 横 樹 橋 機 欄 欠 次 欧 欲 欺 款 歌 歓 止 正 武 歩 歯 歳 歴 死 殉 殉 殊 残 殖 殴 段 殺 殻 殿 母 毎 毒 比 毛 氏 民 気 水 氷 永 汁 求 汎 汗 汚 江 池 決 汽 沈 沖 没 沢 河 沸 油 治 沼 沿 況 泉 泊 泌 法 泡 泡 波 泣 泥 注 泰 泳 洋 洗 洞 津 洪 活 派 流 浄 浅 浜 浦 浪 浮 浴 海 浸 消 涙 涯 液 涼 淑 淡 深 混 添 清 渇 渇 済 渉 渋 渓 減 渡 渦 温 測 港 湖 湯 湾 湾 湿 満 源 準 溝 溶 滅 滋 滑 滝 滞 滴 漁 漂 漆 漏 演 漠 漢 漫 漬 漸 潔 潜 潟 潤 潮 澄 激 濁 濃 濫 濯 瀬 火 灯 灰 災 炉 炊 炎 炭 点 為 烈 無 焦 然 焼 煙 照 煩 煮 熟 熱 燃 燥 爆 爵 父 片 版 牙 牛 牧 物 牲 特 犠 犬 犯 状 狂 狩 独 狭 猛 猟 猪 猫 献 猶 猿 獄 獣 獲 玄 率 玉 王 珍 珠 班 現 球 理 琴 環 璽 瓶 甘 甚 生 産 用 田 田 由 甲 申 男 町 画 界 畑 畔 留 畜 畝 略 番 異 畳 疎 疑 疫 疲 疾 病 症 痘 痛 痢 痴 療 癒 癖 癸 発 登 白 百 的 皆 皇 皮 皿 盆 益 盗 盛 盟 監 盤 目 盲 直 相 盾 省 看 県 真 眠 眺 眼 着 睡 督 瞬 矛 矢 知 短 矯 石 砂 研 砕 砲 破 硝 硫 硬 碁 碑 確 磁 磨 礁 礎 示 礼 社 祈 祉 祖 祚 祝 神 祥 票 祭 禁 禄 禅 禍 禍 禎 福 秀 私 秋 科 秒 秘 租 秩 称 移 程 税 稚 種 稲 稼 稿 穀 穂 積 穏 穫 穴 究 空 突 窃 窒 窓 窮 窯 立 竜 章 童 端 競 竹 笑 笛 符 第 筆 等 筋 筒 答 策 箇 算 管 箱 節 範 築 篤 簡 簿 籍 米 粉 粋 粒 粗 粘 粛 粧 精 糖 糧 糸 系 糾 紀 約 紅 紋 納 純 紙 紙 級 紛 素 素 紡 索 紫 累 細 紳 紹 紺 終 組 経 結 絞 絡 給 統 絵 絶 絹 継 続 維 綱 網 綿 緊 総 緑 緒 線 締 編 緩 緯 練 縁 縄 縛 縦 縫 縮 績 繁 繊 織 繕 繭 繰 缶 罪 置 罰 署 罷 羅 羊 美 群 義 羽 翁 翌 習 翻 翼 老 考 者 耐 耕 耗 耳 聖 聞 聴 職 肉 肌 肖 肝 肢 肥 肩 肪 肯 育 肺 胃 胆 背 胎 胞 胴 胸 能 脂 脅 脈 脚 脱 脳 脹 腐 腕 腰 腸 腹 膚 膜 膨 臓 臣 臨 自 臭 至 致 興 舌 舎 舗 舞 舟 航 般 舶 船 艇 艦 良 色 芋 芝 花 芳 芸 芽 苗 若 苦 英 茂 茎 茶 草 荒 荘 荷 菊 菌 菓 菜 華 落 葉 著 葬 蒸 蓄 蔵 薄 薦 薪 薪 薫 薬 藤 藩 藻 虎 虐 虚 虜 虞 虫 蚊 蚕 蛇 蛍 蛮 融 血 衆 行 術 街 衛 衝 衡 衣 表 衰 衷 袋 被 裁 裂 装 裏 裕 補 裸 製 複 褐 褒 襟 襲 西 要 覆 覇 見 規 視 覚 覧 親 観 角 解 触 言 訂 計 討 訓 託 記 訟 訪 設 許 訳 訴 診 証 詐 詔 評 詞 詠 試 詩 詰 詰 話 該 詳 誇 誉 誌 認 誓 誕 誘 語 誠 誤 説 読 誰 課 調 談 請 論 諭 諮 諸 諾 謀 謁 謄 謙 講 謝 謡 謹 識 譜 警 議 譲 護 谷 豆 豊 豚 象 豪 貝 貞 負 負 財 貢 貧 貧 貨 販 貫 責 貯 貴 買 貸 費 貿 賀 賃 賄 資 賊 賓 賛 賜 賞 賠 賢 賦 質 購 贈 赤 赦 走 赴 起 超 越 趣 足 距 跡 路 跳 践 踊 踏 躍 身 車 軌 軍 軒 軟 転 軸 軽 較 載 輝 輩 輪 輸 轄 辛 辞 辰 辰 辱 農 辺 込 迅 迎 近 返 迫 迭 述 迷 追 退 送 逃 逆 透 逐 逓 途 通 逝 速 造 連 逮 週 進 逸 遂 遅 遇 遊 運 遍 過 道 道 達 違 遠 遣 適 遭 遮 遵 遷 選 遺 避 還 邦 邪 邸 郊 郎 郡 部 郭 郵 郷 都 酉 酌 配 酒 酔 酢 酪 酬 酵 酷 酸 醜 醸 釈 里 里 重 野 量 金 針 釣 鈍 鈴 鉄 鉛 鉢 鉱 銀 銃 銅 銑 銘 銭 鋭 鋳 鋼 錘 錠 錬 錯 録 鍛 鎖 鎮 鏡 鐘 鑑 長 門 閉 開 閏 閑 間 関 閣 閥 閲 闘 阪 防 阻 附 降 限 陛 院 院 陣 除 陥 陪 陰 陳 陵 陶 陸 険 陽 隅 隆 隊 階 随 隔 際 障 隠 隣 隷 隻 雄 雄 雅 集 雇 雉 雌 雑 離 難 雨 雪 雰 雲 零 雷 電 需 震 霊 霜 霧 露 青 静 非 面 革 靴 韓 音 韻 響 頂 頃 項 順 預 預 頑 頒 領 頭 頻 頼 題 額 顔 顕 願 類 顧 風 飛 食 飢 飯 飲 飼 飼 飽 飾 養 餓 館 首 香 馬 駄 駄 駅 駆 駐 騎 騒 験 騰 驚 骨 髄 高 髪 鬼 魂 魅 魔 魚 鮮 鯨 鳥 鳴 鶏 鹿 麗 麦 麻 黄 黒 黙 鼓 鼠 鼻 齢", - 2: "‾ _ _ - - ‐ — ― 〜 ・ ・ , , 、 、 ; ; : : ! ! ? ? . . ‥ … 。 。 ' \ ‘ ’ \" " “ ” ( ( ) ) [ [ ] ] { { } } 〈 〉 《 》 「 「 」 」 『 』 【 】 〔 〕 ‖ § ¶ @ @ * * / / \\ & & # # % % ‰ † ‡ ′ ″ 〃 ※", - 3: "兌 拼 楔 錄 鳯", - }, - "jgo": { - 0: "a á â ǎ b c d ɛ ɛ́ ɛ̀ ɛ̂ ɛ̌ ɛ̄ f g h i í î ǐ j k l m ḿ m̀ m̄ n ń ǹ n̄ ŋ ŋ́ ŋ̀ ŋ̄ ɔ ɔ́ ɔ̂ ɔ̌ p pf s sh t ts u ú û ǔ ʉ ʉ́ ʉ̂ ʉ̌ ʉ̈ v w ẅ y z ꞌ", - 2: "- , ; : ! ? . ‹ › « »", - 3: "e o q r x", - 5: "A B C D Ɛ F G H I J K L M N Ŋ Ɔ P Pf S Sh T Ts U Ʉ Ʉ̈ V W Ẅ Y Z Ꞌ", - }, - "jmc": { - 0: "a b c d e f g h i j k l m n o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", - }, - "ka": { - 0: "ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ", - 2: "- ‐ – — , ; : ! ? . … ჻ ' ‘ ‚ “ „ « » ( ) [ ] { } § @ * / & # † ‡ ′ ″ №", - 3: "ჱ ჲ ჳ ჴ ჵ ჶ ჷ ჸ ჹ ჺ ⴀ ⴁ ⴂ ⴃ ⴄ ⴅ ⴆ ⴡ ⴇ ⴈ ⴉ ⴊ ⴋ ⴌ ⴢ ⴍ ⴎ ⴏ ⴐ ⴑ ⴒ ⴣ ⴓ ⴔ ⴕ ⴖ ⴗ ⴘ ⴙ ⴚ ⴛ ⴜ ⴝ ⴞ ⴤ ⴟ ⴠ ⴥ", - 5: "ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ", - }, - "kab": { - 0: "a b c č d ḍ e ɛ f g ǧ ɣ h ḥ i j k l m n p q r ṛ s ṣ t ṭ u w x y z ẓ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "o v", - 5: "A B C Č D Ḍ E Ɛ F G Ǧ Ɣ H Ḥ I J K L M N P Q R Ṛ S Ṣ T Ṭ U W X Y Z Ẓ", - }, - "kam": { - 0: "a b c d e f g h i ĩ j k l m n o p q r s t u ũ v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "kde": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "kea": { - 0: "a b d dj e f g i j k l lh m n nh o p r s t tx u v x z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á à ă â å ä ã ā æ c ç é è ĕ ê ë ē h í ì ĭ î ï ī ñ ó ò ŏ ô ö õ ø ō œ q ú ù ŭ û ü ū w y ÿ", - 5: "A B D E F G H I J K L M N O P R S T U V X Z", - }, - "khq": { - 0: "a ã b c d e ẽ f g h i j k l m n ɲ ŋ o õ p q r s š t u w x y z ž", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "v", - 5: "A à B C D E Ẽ F G H I J K L M N Ɲ Ŋ O Õ P Q R S Š T U W X Y Z Ž", - }, - "ki": { - 0: "a b c d e g h i ĩ j k m n o r t u ũ w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "f l p q s v x z", - 5: "A B C D E G H I J K M N O R T U W Y", - }, - "kk": { - 0: "а ә б в г ғ д е ё ж з и й к қ л м н ң о ө п р с т у ұ ү ф х һ ц ч ш щ ъ ы і ь э ю я", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "А Ә Б В Г Ғ Д Е Ё Ж З И Й К Қ Л М Н Ң О Ө П Р С Т У Ұ Ү Ф Х Һ Ц Ч Ш Щ Ъ Ы І Ь Э Ю Я", - }, - "kkj": { - 0: "a á à â a̧ b ɓ c d ɗ ɗy e é è ê ɛ ɛ́ ɛ̀ ɛ̂ ɛ̧ f g gb gw h i í ì î i̧ j k kp kw l m mb n nd nj ny ŋ ŋg ŋgb ŋgw o ó ò ô ɔ ɔ́ ɔ̀ ɔ̂ ɔ̧ p r s t u ú ù û u̧ v w y", - 2: ", : ! ? . … ‘ ‹ › “ ” « » ( ) *", - 3: "q x z", - 5: "A B Ɓ C D Ɗ Ɗy E Ɛ F G Gb Gw H I I̧ J K Kp Kw L M Mb N Nd Nj Ny Ŋ Ŋg Ŋgb Ŋgw O Ɔ Ɔ̧ P R S T U U̧ V W Y", - }, - "kl": { - 0: "a á â ã b c d e é ê f g h i í î ĩ j k l m n o ô p q ĸ r s t u ú û ũ v w x y z æ ø å", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "kln": { - 0: "a b c d e g h i j k l m n o p r s t u w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "f q v x z", - 5: "A B C D E G H I J K L M N O P R S T U W Y", - }, - "km": { - 0: "៌ ៎ ៏ ៑ ័ ៈ ់ ៉ ៊ ៍ ក ខ គ ឃ ង ច ឆ ជ ឈ ញ ដ ឋ ឌ ឍ ណ ត ថ ទ ធ ន ប ផ ព ភ ម យ រ ឫ ឬ ល ឭ ឮ វ ស ហ ឡ អ ឲ ឪ អា ឥ ឦ ឧ ឧក ឩ ឯ ឰ ឱ ឳ ា ិ ី ឹ ឺ ុ ូ ួ ើ ឿ ៀ េ ែ ៃ ោ ៅ ំ ះ ្", - 2: "- , ៖ ! ? . ។ ៕ ‘ ’ \" “ ” ( ) [ ] { } ៙ ៚", - 3: "឴ ឵ \u200b ឝ ឞ", - }, - "kn": { - 0: "಼ ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯ ಅ ಆ ಇ ಈ ಉ ಊ ಋ ೠ ಌ ೡ ಎ ಏ ಐ ಒ ಓ ಔ ಂ ಃ ಕ ಖ ಗ ಘ ಙ ಚ ಛ ಜ ಝ ಞ ಟ ಠ ಡ ಢ ಣ ತ ಥ ದ ಧ ನ ಪ ಫ ಬ ಭ ಮ ಯ ರ ಱ ಲ ವ ಶ ಷ ಸ ಹ ಳ ೞ ಽ ಾ ಿ ೀ ು ೂ ೃ ೄ ೆ ೇ ೈ ೊ ೋ ೌ ್ ೕ ೖ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d", - }, - "ko": { - 0: "가 가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 검 겁 겂 것 겄 겅 겆 겇 겈 겉 겊 겋 게 겍 겎 겏 겐 겑 겒 겓 겔 겕 겖 겗 겘 겙 겚 겛 겜 겝 겞 겟 겠 겡 겢 겣 겤 겥 겦 겧 겨 격 겪 겫 견 겭 겮 겯 결 겱 겲 겳 겴 겵 겶 겷 겸 겹 겺 겻 겼 경 겾 겿 곀 곁 곂 곃 계 곅 곆 곇 곈 곉 곊 곋 곌 곍 곎 곏 곐 곑 곒 곓 곔 곕 곖 곗 곘 곙 곚 곛 곜 곝 곞 곟 고 곡 곢 곣 곤 곥 곦 곧 골 곩 곪 곫 곬 곭 곮 곯 곰 곱 곲 곳 곴 공 곶 곷 곸 곹 곺 곻 과 곽 곾 곿 관 괁 괂 괃 괄 괅 괆 괇 괈 괉 괊 괋 괌 괍 괎 괏 괐 광 괒 괓 괔 괕 괖 괗 괘 괙 괚 괛 괜 괝 괞 괟 괠 괡 괢 괣 괤 괥 괦 괧 괨 괩 괪 괫 괬 괭 괮 괯 괰 괱 괲 괳 괴 괵 괶 괷 괸 괹 괺 괻 괼 괽 괾 괿 굀 굁 굂 굃 굄 굅 굆 굇 굈 굉 굊 굋 굌 굍 굎 굏 교 굑 굒 굓 굔 굕 굖 굗 굘 굙 굚 굛 굜 굝 굞 굟 굠 굡 굢 굣 굤 굥 굦 굧 굨 굩 굪 굫 구 국 굮 굯 군 굱 굲 굳 굴 굵 굶 굷 굸 굹 굺 굻 굼 굽 굾 굿 궀 궁 궂 궃 궄 궅 궆 궇 궈 궉 궊 궋 권 궍 궎 궏 궐 궑 궒 궓 궔 궕 궖 궗 궘 궙 궚 궛 궜 궝 궞 궟 궠 궡 궢 궣 궤 궥 궦 궧 궨 궩 궪 궫 궬 궭 궮 궯 궰 궱 궲 궳 궴 궵 궶 궷 궸 궹 궺 궻 궼 궽 궾 궿 귀 귁 귂 귃 귄 귅 귆 귇 귈 귉 귊 귋 귌 귍 귎 귏 귐 귑 귒 귓 귔 귕 귖 귗 귘 귙 귚 귛 규 귝 귞 귟 균 귡 귢 귣 귤 귥 귦 귧 귨 귩 귪 귫 귬 귭 귮 귯 귰 귱 귲 귳 귴 귵 귶 귷 그 극 귺 귻 근 귽 귾 귿 글 긁 긂 긃 긄 긅 긆 긇 금 급 긊 긋 긌 긍 긎 긏 긐 긑 긒 긓 긔 긕 긖 긗 긘 긙 긚 긛 긜 긝 긞 긟 긠 긡 긢 긣 긤 긥 긦 긧 긨 긩 긪 긫 긬 긭 긮 긯 기 긱 긲 긳 긴 긵 긶 긷 길 긹 긺 긻 긼 긽 긾 긿 김 깁 깂 깃 깄 깅 깆 깇 깈 깉 깊 깋 까 깍 깎 깏 깐 깑 깒 깓 깔 깕 깖 깗 깘 깙 깚 깛 깜 깝 깞 깟 깠 깡 깢 깣 깤 깥 깦 깧 깨 깩 깪 깫 깬 깭 깮 깯 깰 깱 깲 깳 깴 깵 깶 깷 깸 깹 깺 깻 깼 깽 깾 깿 꺀 꺁 꺂 꺃 꺄 꺅 꺆 꺇 꺈 꺉 꺊 꺋 꺌 꺍 꺎 꺏 꺐 꺑 꺒 꺓 꺔 꺕 꺖 꺗 꺘 꺙 꺚 꺛 꺜 꺝 꺞 꺟 꺠 꺡 꺢 꺣 꺤 꺥 꺦 꺧 꺨 꺩 꺪 꺫 꺬 꺭 꺮 꺯 꺰 꺱 꺲 꺳 꺴 꺵 꺶 꺷 꺸 꺹 꺺 꺻 꺼 꺽 꺾 꺿 껀 껁 껂 껃 껄 껅 껆 껇 껈 껉 껊 껋 껌 껍 껎 껏 껐 껑 껒 껓 껔 껕 껖 껗 께 껙 껚 껛 껜 껝 껞 껟 껠 껡 껢 껣 껤 껥 껦 껧 껨 껩 껪 껫 껬 껭 껮 껯 껰 껱 껲 껳 껴 껵 껶 껷 껸 껹 껺 껻 껼 껽 껾 껿 꼀 꼁 꼂 꼃 꼄 꼅 꼆 꼇 꼈 꼉 꼊 꼋 꼌 꼍 꼎 꼏 꼐 꼑 꼒 꼓 꼔 꼕 꼖 꼗 꼘 꼙 꼚 꼛 꼜 꼝 꼞 꼟 꼠 꼡 꼢 꼣 꼤 꼥 꼦 꼧 꼨 꼩 꼪 꼫 꼬 꼭 꼮 꼯 꼰 꼱 꼲 꼳 꼴 꼵 꼶 꼷 꼸 꼹 꼺 꼻 꼼 꼽 꼾 꼿 꽀 꽁 꽂 꽃 꽄 꽅 꽆 꽇 꽈 꽉 꽊 꽋 꽌 꽍 꽎 꽏 꽐 꽑 꽒 꽓 꽔 꽕 꽖 꽗 꽘 꽙 꽚 꽛 꽜 꽝 꽞 꽟 꽠 꽡 꽢 꽣 꽤 꽥 꽦 꽧 꽨 꽩 꽪 꽫 꽬 꽭 꽮 꽯 꽰 꽱 꽲 꽳 꽴 꽵 꽶 꽷 꽸 꽹 꽺 꽻 꽼 꽽 꽾 꽿 꾀 꾁 꾂 꾃 꾄 꾅 꾆 꾇 꾈 꾉 꾊 꾋 꾌 꾍 꾎 꾏 꾐 꾑 꾒 꾓 꾔 꾕 꾖 꾗 꾘 꾙 꾚 꾛 꾜 꾝 꾞 꾟 꾠 꾡 꾢 꾣 꾤 꾥 꾦 꾧 꾨 꾩 꾪 꾫 꾬 꾭 꾮 꾯 꾰 꾱 꾲 꾳 꾴 꾵 꾶 꾷 꾸 꾹 꾺 꾻 꾼 꾽 꾾 꾿 꿀 꿁 꿂 꿃 꿄 꿅 꿆 꿇 꿈 꿉 꿊 꿋 꿌 꿍 꿎 꿏 꿐 꿑 꿒 꿓 꿔 꿕 꿖 꿗 꿘 꿙 꿚 꿛 꿜 꿝 꿞 꿟 꿠 꿡 꿢 꿣 꿤 꿥 꿦 꿧 꿨 꿩 꿪 꿫 꿬 꿭 꿮 꿯 꿰 꿱 꿲 꿳 꿴 꿵 꿶 꿷 꿸 꿹 꿺 꿻 꿼 꿽 꿾 꿿 뀀 뀁 뀂 뀃 뀄 뀅 뀆 뀇 뀈 뀉 뀊 뀋 뀌 뀍 뀎 뀏 뀐 뀑 뀒 뀓 뀔 뀕 뀖 뀗 뀘 뀙 뀚 뀛 뀜 뀝 뀞 뀟 뀠 뀡 뀢 뀣 뀤 뀥 뀦 뀧 뀨 뀩 뀪 뀫 뀬 뀭 뀮 뀯 뀰 뀱 뀲 뀳 뀴 뀵 뀶 뀷 뀸 뀹 뀺 뀻 뀼 뀽 뀾 뀿 끀 끁 끂 끃 끄 끅 끆 끇 끈 끉 끊 끋 끌 끍 끎 끏 끐 끑 끒 끓 끔 끕 끖 끗 끘 끙 끚 끛 끜 끝 끞 끟 끠 끡 끢 끣 끤 끥 끦 끧 끨 끩 끪 끫 끬 끭 끮 끯 끰 끱 끲 끳 끴 끵 끶 끷 끸 끹 끺 끻 끼 끽 끾 끿 낀 낁 낂 낃 낄 낅 낆 낇 낈 낉 낊 낋 낌 낍 낎 낏 낐 낑 낒 낓 낔 낕 낖 낗 나 낙 낚 낛 난 낝 낞 낟 날 낡 낢 낣 낤 낥 낦 낧 남 납 낪 낫 났 낭 낮 낯 낰 낱 낲 낳 내 낵 낶 낷 낸 낹 낺 낻 낼 낽 낾 낿 냀 냁 냂 냃 냄 냅 냆 냇 냈 냉 냊 냋 냌 냍 냎 냏 냐 냑 냒 냓 냔 냕 냖 냗 냘 냙 냚 냛 냜 냝 냞 냟 냠 냡 냢 냣 냤 냥 냦 냧 냨 냩 냪 냫 냬 냭 냮 냯 냰 냱 냲 냳 냴 냵 냶 냷 냸 냹 냺 냻 냼 냽 냾 냿 넀 넁 넂 넃 넄 넅 넆 넇 너 넉 넊 넋 넌 넍 넎 넏 널 넑 넒 넓 넔 넕 넖 넗 넘 넙 넚 넛 넜 넝 넞 넟 넠 넡 넢 넣 네 넥 넦 넧 넨 넩 넪 넫 넬 넭 넮 넯 넰 넱 넲 넳 넴 넵 넶 넷 넸 넹 넺 넻 넼 넽 넾 넿 녀 녁 녂 녃 년 녅 녆 녇 녈 녉 녊 녋 녌 녍 녎 녏 념 녑 녒 녓 녔 녕 녖 녗 녘 녙 녚 녛 녜 녝 녞 녟 녠 녡 녢 녣 녤 녥 녦 녧 녨 녩 녪 녫 녬 녭 녮 녯 녰 녱 녲 녳 녴 녵 녶 녷 노 녹 녺 녻 논 녽 녾 녿 놀 놁 놂 놃 놄 놅 놆 놇 놈 놉 놊 놋 놌 농 놎 놏 놐 놑 높 놓 놔 놕 놖 놗 놘 놙 놚 놛 놜 놝 놞 놟 놠 놡 놢 놣 놤 놥 놦 놧 놨 놩 놪 놫 놬 놭 놮 놯 놰 놱 놲 놳 놴 놵 놶 놷 놸 놹 놺 놻 놼 놽 놾 놿 뇀 뇁 뇂 뇃 뇄 뇅 뇆 뇇 뇈 뇉 뇊 뇋 뇌 뇍 뇎 뇏 뇐 뇑 뇒 뇓 뇔 뇕 뇖 뇗 뇘 뇙 뇚 뇛 뇜 뇝 뇞 뇟 뇠 뇡 뇢 뇣 뇤 뇥 뇦 뇧 뇨 뇩 뇪 뇫 뇬 뇭 뇮 뇯 뇰 뇱 뇲 뇳 뇴 뇵 뇶 뇷 뇸 뇹 뇺 뇻 뇼 뇽 뇾 뇿 눀 눁 눂 눃 누 눅 눆 눇 눈 눉 눊 눋 눌 눍 눎 눏 눐 눑 눒 눓 눔 눕 눖 눗 눘 눙 눚 눛 눜 눝 눞 눟 눠 눡 눢 눣 눤 눥 눦 눧 눨 눩 눪 눫 눬 눭 눮 눯 눰 눱 눲 눳 눴 눵 눶 눷 눸 눹 눺 눻 눼 눽 눾 눿 뉀 뉁 뉂 뉃 뉄 뉅 뉆 뉇 뉈 뉉 뉊 뉋 뉌 뉍 뉎 뉏 뉐 뉑 뉒 뉓 뉔 뉕 뉖 뉗 뉘 뉙 뉚 뉛 뉜 뉝 뉞 뉟 뉠 뉡 뉢 뉣 뉤 뉥 뉦 뉧 뉨 뉩 뉪 뉫 뉬 뉭 뉮 뉯 뉰 뉱 뉲 뉳 뉴 뉵 뉶 뉷 뉸 뉹 뉺 뉻 뉼 뉽 뉾 뉿 늀 늁 늂 늃 늄 늅 늆 늇 늈 늉 늊 늋 늌 늍 늎 늏 느 늑 늒 늓 는 늕 늖 늗 늘 늙 늚 늛 늜 늝 늞 늟 늠 늡 늢 늣 늤 능 늦 늧 늨 늩 늪 늫 늬 늭 늮 늯 늰 늱 늲 늳 늴 늵 늶 늷 늸 늹 늺 늻 늼 늽 늾 늿 닀 닁 닂 닃 닄 닅 닆 닇 니 닉 닊 닋 닌 닍 닎 닏 닐 닑 닒 닓 닔 닕 닖 닗 님 닙 닚 닛 닜 닝 닞 닟 닠 닡 닢 닣 다 닥 닦 닧 단 닩 닪 닫 달 닭 닮 닯 닰 닱 닲 닳 담 답 닶 닷 닸 당 닺 닻 닼 닽 닾 닿 대 댁 댂 댃 댄 댅 댆 댇 댈 댉 댊 댋 댌 댍 댎 댏 댐 댑 댒 댓 댔 댕 댖 댗 댘 댙 댚 댛 댜 댝 댞 댟 댠 댡 댢 댣 댤 댥 댦 댧 댨 댩 댪 댫 댬 댭 댮 댯 댰 댱 댲 댳 댴 댵 댶 댷 댸 댹 댺 댻 댼 댽 댾 댿 덀 덁 덂 덃 덄 덅 덆 덇 덈 덉 덊 덋 덌 덍 덎 덏 덐 덑 덒 덓 더 덕 덖 덗 던 덙 덚 덛 덜 덝 덞 덟 덠 덡 덢 덣 덤 덥 덦 덧 덨 덩 덪 덫 덬 덭 덮 덯 데 덱 덲 덳 덴 덵 덶 덷 델 덹 덺 덻 덼 덽 덾 덿 뎀 뎁 뎂 뎃 뎄 뎅 뎆 뎇 뎈 뎉 뎊 뎋 뎌 뎍 뎎 뎏 뎐 뎑 뎒 뎓 뎔 뎕 뎖 뎗 뎘 뎙 뎚 뎛 뎜 뎝 뎞 뎟 뎠 뎡 뎢 뎣 뎤 뎥 뎦 뎧 뎨 뎩 뎪 뎫 뎬 뎭 뎮 뎯 뎰 뎱 뎲 뎳 뎴 뎵 뎶 뎷 뎸 뎹 뎺 뎻 뎼 뎽 뎾 뎿 돀 돁 돂 돃 도 독 돆 돇 돈 돉 돊 돋 돌 돍 돎 돏 돐 돑 돒 돓 돔 돕 돖 돗 돘 동 돚 돛 돜 돝 돞 돟 돠 돡 돢 돣 돤 돥 돦 돧 돨 돩 돪 돫 돬 돭 돮 돯 돰 돱 돲 돳 돴 돵 돶 돷 돸 돹 돺 돻 돼 돽 돾 돿 됀 됁 됂 됃 됄 됅 됆 됇 됈 됉 됊 됋 됌 됍 됎 됏 됐 됑 됒 됓 됔 됕 됖 됗 되 됙 됚 됛 된 됝 됞 됟 될 됡 됢 됣 됤 됥 됦 됧 됨 됩 됪 됫 됬 됭 됮 됯 됰 됱 됲 됳 됴 됵 됶 됷 됸 됹 됺 됻 됼 됽 됾 됿 둀 둁 둂 둃 둄 둅 둆 둇 둈 둉 둊 둋 둌 둍 둎 둏 두 둑 둒 둓 둔 둕 둖 둗 둘 둙 둚 둛 둜 둝 둞 둟 둠 둡 둢 둣 둤 둥 둦 둧 둨 둩 둪 둫 둬 둭 둮 둯 둰 둱 둲 둳 둴 둵 둶 둷 둸 둹 둺 둻 둼 둽 둾 둿 뒀 뒁 뒂 뒃 뒄 뒅 뒆 뒇 뒈 뒉 뒊 뒋 뒌 뒍 뒎 뒏 뒐 뒑 뒒 뒓 뒔 뒕 뒖 뒗 뒘 뒙 뒚 뒛 뒜 뒝 뒞 뒟 뒠 뒡 뒢 뒣 뒤 뒥 뒦 뒧 뒨 뒩 뒪 뒫 뒬 뒭 뒮 뒯 뒰 뒱 뒲 뒳 뒴 뒵 뒶 뒷 뒸 뒹 뒺 뒻 뒼 뒽 뒾 뒿 듀 듁 듂 듃 듄 듅 듆 듇 듈 듉 듊 듋 듌 듍 듎 듏 듐 듑 듒 듓 듔 듕 듖 듗 듘 듙 듚 듛 드 득 듞 듟 든 듡 듢 듣 들 듥 듦 듧 듨 듩 듪 듫 듬 듭 듮 듯 듰 등 듲 듳 듴 듵 듶 듷 듸 듹 듺 듻 듼 듽 듾 듿 딀 딁 딂 딃 딄 딅 딆 딇 딈 딉 딊 딋 딌 딍 딎 딏 딐 딑 딒 딓 디 딕 딖 딗 딘 딙 딚 딛 딜 딝 딞 딟 딠 딡 딢 딣 딤 딥 딦 딧 딨 딩 딪 딫 딬 딭 딮 딯 따 딱 딲 딳 딴 딵 딶 딷 딸 딹 딺 딻 딼 딽 딾 딿 땀 땁 땂 땃 땄 땅 땆 땇 땈 땉 땊 땋 때 땍 땎 땏 땐 땑 땒 땓 땔 땕 땖 땗 땘 땙 땚 땛 땜 땝 땞 땟 땠 땡 땢 땣 땤 땥 땦 땧 땨 땩 땪 땫 땬 땭 땮 땯 땰 땱 땲 땳 땴 땵 땶 땷 땸 땹 땺 땻 땼 땽 땾 땿 떀 떁 떂 떃 떄 떅 떆 떇 떈 떉 떊 떋 떌 떍 떎 떏 떐 떑 떒 떓 떔 떕 떖 떗 떘 떙 떚 떛 떜 떝 떞 떟 떠 떡 떢 떣 떤 떥 떦 떧 떨 떩 떪 떫 떬 떭 떮 떯 떰 떱 떲 떳 떴 떵 떶 떷 떸 떹 떺 떻 떼 떽 떾 떿 뗀 뗁 뗂 뗃 뗄 뗅 뗆 뗇 뗈 뗉 뗊 뗋 뗌 뗍 뗎 뗏 뗐 뗑 뗒 뗓 뗔 뗕 뗖 뗗 뗘 뗙 뗚 뗛 뗜 뗝 뗞 뗟 뗠 뗡 뗢 뗣 뗤 뗥 뗦 뗧 뗨 뗩 뗪 뗫 뗬 뗭 뗮 뗯 뗰 뗱 뗲 뗳 뗴 뗵 뗶 뗷 뗸 뗹 뗺 뗻 뗼 뗽 뗾 뗿 똀 똁 똂 똃 똄 똅 똆 똇 똈 똉 똊 똋 똌 똍 똎 똏 또 똑 똒 똓 똔 똕 똖 똗 똘 똙 똚 똛 똜 똝 똞 똟 똠 똡 똢 똣 똤 똥 똦 똧 똨 똩 똪 똫 똬 똭 똮 똯 똰 똱 똲 똳 똴 똵 똶 똷 똸 똹 똺 똻 똼 똽 똾 똿 뙀 뙁 뙂 뙃 뙄 뙅 뙆 뙇 뙈 뙉 뙊 뙋 뙌 뙍 뙎 뙏 뙐 뙑 뙒 뙓 뙔 뙕 뙖 뙗 뙘 뙙 뙚 뙛 뙜 뙝 뙞 뙟 뙠 뙡 뙢 뙣 뙤 뙥 뙦 뙧 뙨 뙩 뙪 뙫 뙬 뙭 뙮 뙯 뙰 뙱 뙲 뙳 뙴 뙵 뙶 뙷 뙸 뙹 뙺 뙻 뙼 뙽 뙾 뙿 뚀 뚁 뚂 뚃 뚄 뚅 뚆 뚇 뚈 뚉 뚊 뚋 뚌 뚍 뚎 뚏 뚐 뚑 뚒 뚓 뚔 뚕 뚖 뚗 뚘 뚙 뚚 뚛 뚜 뚝 뚞 뚟 뚠 뚡 뚢 뚣 뚤 뚥 뚦 뚧 뚨 뚩 뚪 뚫 뚬 뚭 뚮 뚯 뚰 뚱 뚲 뚳 뚴 뚵 뚶 뚷 뚸 뚹 뚺 뚻 뚼 뚽 뚾 뚿 뛀 뛁 뛂 뛃 뛄 뛅 뛆 뛇 뛈 뛉 뛊 뛋 뛌 뛍 뛎 뛏 뛐 뛑 뛒 뛓 뛔 뛕 뛖 뛗 뛘 뛙 뛚 뛛 뛜 뛝 뛞 뛟 뛠 뛡 뛢 뛣 뛤 뛥 뛦 뛧 뛨 뛩 뛪 뛫 뛬 뛭 뛮 뛯 뛰 뛱 뛲 뛳 뛴 뛵 뛶 뛷 뛸 뛹 뛺 뛻 뛼 뛽 뛾 뛿 뜀 뜁 뜂 뜃 뜄 뜅 뜆 뜇 뜈 뜉 뜊 뜋 뜌 뜍 뜎 뜏 뜐 뜑 뜒 뜓 뜔 뜕 뜖 뜗 뜘 뜙 뜚 뜛 뜜 뜝 뜞 뜟 뜠 뜡 뜢 뜣 뜤 뜥 뜦 뜧 뜨 뜩 뜪 뜫 뜬 뜭 뜮 뜯 뜰 뜱 뜲 뜳 뜴 뜵 뜶 뜷 뜸 뜹 뜺 뜻 뜼 뜽 뜾 뜿 띀 띁 띂 띃 띄 띅 띆 띇 띈 띉 띊 띋 띌 띍 띎 띏 띐 띑 띒 띓 띔 띕 띖 띗 띘 띙 띚 띛 띜 띝 띞 띟 띠 띡 띢 띣 띤 띥 띦 띧 띨 띩 띪 띫 띬 띭 띮 띯 띰 띱 띲 띳 띴 띵 띶 띷 띸 띹 띺 띻 라 락 띾 띿 란 랁 랂 랃 랄 랅 랆 랇 랈 랉 랊 랋 람 랍 랎 랏 랐 랑 랒 랓 랔 랕 랖 랗 래 랙 랚 랛 랜 랝 랞 랟 랠 랡 랢 랣 랤 랥 랦 랧 램 랩 랪 랫 랬 랭 랮 랯 랰 랱 랲 랳 랴 략 랶 랷 랸 랹 랺 랻 랼 랽 랾 랿 럀 럁 럂 럃 럄 럅 럆 럇 럈 량 럊 럋 럌 럍 럎 럏 럐 럑 럒 럓 럔 럕 럖 럗 럘 럙 럚 럛 럜 럝 럞 럟 럠 럡 럢 럣 럤 럥 럦 럧 럨 럩 럪 럫 러 럭 럮 럯 런 럱 럲 럳 럴 럵 럶 럷 럸 럹 럺 럻 럼 럽 럾 럿 렀 렁 렂 렃 렄 렅 렆 렇 레 렉 렊 렋 렌 렍 렎 렏 렐 렑 렒 렓 렔 렕 렖 렗 렘 렙 렚 렛 렜 렝 렞 렟 렠 렡 렢 렣 려 력 렦 렧 련 렩 렪 렫 렬 렭 렮 렯 렰 렱 렲 렳 렴 렵 렶 렷 렸 령 렺 렻 렼 렽 렾 렿 례 롁 롂 롃 롄 롅 롆 롇 롈 롉 롊 롋 롌 롍 롎 롏 롐 롑 롒 롓 롔 롕 롖 롗 롘 롙 롚 롛 로 록 롞 롟 론 롡 롢 롣 롤 롥 롦 롧 롨 롩 롪 롫 롬 롭 롮 롯 롰 롱 롲 롳 롴 롵 롶 롷 롸 롹 롺 롻 롼 롽 롾 롿 뢀 뢁 뢂 뢃 뢄 뢅 뢆 뢇 뢈 뢉 뢊 뢋 뢌 뢍 뢎 뢏 뢐 뢑 뢒 뢓 뢔 뢕 뢖 뢗 뢘 뢙 뢚 뢛 뢜 뢝 뢞 뢟 뢠 뢡 뢢 뢣 뢤 뢥 뢦 뢧 뢨 뢩 뢪 뢫 뢬 뢭 뢮 뢯 뢰 뢱 뢲 뢳 뢴 뢵 뢶 뢷 뢸 뢹 뢺 뢻 뢼 뢽 뢾 뢿 룀 룁 룂 룃 룄 룅 룆 룇 룈 룉 룊 룋 료 룍 룎 룏 룐 룑 룒 룓 룔 룕 룖 룗 룘 룙 룚 룛 룜 룝 룞 룟 룠 룡 룢 룣 룤 룥 룦 룧 루 룩 룪 룫 룬 룭 룮 룯 룰 룱 룲 룳 룴 룵 룶 룷 룸 룹 룺 룻 룼 룽 룾 룿 뤀 뤁 뤂 뤃 뤄 뤅 뤆 뤇 뤈 뤉 뤊 뤋 뤌 뤍 뤎 뤏 뤐 뤑 뤒 뤓 뤔 뤕 뤖 뤗 뤘 뤙 뤚 뤛 뤜 뤝 뤞 뤟 뤠 뤡 뤢 뤣 뤤 뤥 뤦 뤧 뤨 뤩 뤪 뤫 뤬 뤭 뤮 뤯 뤰 뤱 뤲 뤳 뤴 뤵 뤶 뤷 뤸 뤹 뤺 뤻 뤼 뤽 뤾 뤿 륀 륁 륂 륃 륄 륅 륆 륇 륈 륉 륊 륋 륌 륍 륎 륏 륐 륑 륒 륓 륔 륕 륖 륗 류 륙 륚 륛 륜 륝 륞 륟 률 륡 륢 륣 륤 륥 륦 륧 륨 륩 륪 륫 륬 륭 륮 륯 륰 륱 륲 륳 르 륵 륶 륷 른 륹 륺 륻 를 륽 륾 륿 릀 릁 릂 릃 름 릅 릆 릇 릈 릉 릊 릋 릌 릍 릎 릏 릐 릑 릒 릓 릔 릕 릖 릗 릘 릙 릚 릛 릜 릝 릞 릟 릠 릡 릢 릣 릤 릥 릦 릧 릨 릩 릪 릫 리 릭 릮 릯 린 릱 릲 릳 릴 릵 릶 릷 릸 릹 릺 릻 림 립 릾 릿 맀 링 맂 맃 맄 맅 맆 맇 마 막 맊 맋 만 맍 많 맏 말 맑 맒 맓 맔 맕 맖 맗 맘 맙 맚 맛 맜 망 맞 맟 맠 맡 맢 맣 매 맥 맦 맧 맨 맩 맪 맫 맬 맭 맮 맯 맰 맱 맲 맳 맴 맵 맶 맷 맸 맹 맺 맻 맼 맽 맾 맿 먀 먁 먂 먃 먄 먅 먆 먇 먈 먉 먊 먋 먌 먍 먎 먏 먐 먑 먒 먓 먔 먕 먖 먗 먘 먙 먚 먛 먜 먝 먞 먟 먠 먡 먢 먣 먤 먥 먦 먧 먨 먩 먪 먫 먬 먭 먮 먯 먰 먱 먲 먳 먴 먵 먶 먷 머 먹 먺 먻 먼 먽 먾 먿 멀 멁 멂 멃 멄 멅 멆 멇 멈 멉 멊 멋 멌 멍 멎 멏 멐 멑 멒 멓 메 멕 멖 멗 멘 멙 멚 멛 멜 멝 멞 멟 멠 멡 멢 멣 멤 멥 멦 멧 멨 멩 멪 멫 멬 멭 멮 멯 며 멱 멲 멳 면 멵 멶 멷 멸 멹 멺 멻 멼 멽 멾 멿 몀 몁 몂 몃 몄 명 몆 몇 몈 몉 몊 몋 몌 몍 몎 몏 몐 몑 몒 몓 몔 몕 몖 몗 몘 몙 몚 몛 몜 몝 몞 몟 몠 몡 몢 몣 몤 몥 몦 몧 모 목 몪 몫 몬 몭 몮 몯 몰 몱 몲 몳 몴 몵 몶 몷 몸 몹 몺 못 몼 몽 몾 몿 뫀 뫁 뫂 뫃 뫄 뫅 뫆 뫇 뫈 뫉 뫊 뫋 뫌 뫍 뫎 뫏 뫐 뫑 뫒 뫓 뫔 뫕 뫖 뫗 뫘 뫙 뫚 뫛 뫜 뫝 뫞 뫟 뫠 뫡 뫢 뫣 뫤 뫥 뫦 뫧 뫨 뫩 뫪 뫫 뫬 뫭 뫮 뫯 뫰 뫱 뫲 뫳 뫴 뫵 뫶 뫷 뫸 뫹 뫺 뫻 뫼 뫽 뫾 뫿 묀 묁 묂 묃 묄 묅 묆 묇 묈 묉 묊 묋 묌 묍 묎 묏 묐 묑 묒 묓 묔 묕 묖 묗 묘 묙 묚 묛 묜 묝 묞 묟 묠 묡 묢 묣 묤 묥 묦 묧 묨 묩 묪 묫 묬 묭 묮 묯 묰 묱 묲 묳 무 묵 묶 묷 문 묹 묺 묻 물 묽 묾 묿 뭀 뭁 뭂 뭃 뭄 뭅 뭆 뭇 뭈 뭉 뭊 뭋 뭌 뭍 뭎 뭏 뭐 뭑 뭒 뭓 뭔 뭕 뭖 뭗 뭘 뭙 뭚 뭛 뭜 뭝 뭞 뭟 뭠 뭡 뭢 뭣 뭤 뭥 뭦 뭧 뭨 뭩 뭪 뭫 뭬 뭭 뭮 뭯 뭰 뭱 뭲 뭳 뭴 뭵 뭶 뭷 뭸 뭹 뭺 뭻 뭼 뭽 뭾 뭿 뮀 뮁 뮂 뮃 뮄 뮅 뮆 뮇 뮈 뮉 뮊 뮋 뮌 뮍 뮎 뮏 뮐 뮑 뮒 뮓 뮔 뮕 뮖 뮗 뮘 뮙 뮚 뮛 뮜 뮝 뮞 뮟 뮠 뮡 뮢 뮣 뮤 뮥 뮦 뮧 뮨 뮩 뮪 뮫 뮬 뮭 뮮 뮯 뮰 뮱 뮲 뮳 뮴 뮵 뮶 뮷 뮸 뮹 뮺 뮻 뮼 뮽 뮾 뮿 므 믁 믂 믃 믄 믅 믆 믇 믈 믉 믊 믋 믌 믍 믎 믏 믐 믑 믒 믓 믔 믕 믖 믗 믘 믙 믚 믛 믜 믝 믞 믟 믠 믡 믢 믣 믤 믥 믦 믧 믨 믩 믪 믫 믬 믭 믮 믯 믰 믱 믲 믳 믴 믵 믶 믷 미 믹 믺 믻 민 믽 믾 믿 밀 밁 밂 밃 밄 밅 밆 밇 밈 밉 밊 밋 밌 밍 밎 및 밐 밑 밒 밓 바 박 밖 밗 반 밙 밚 받 발 밝 밞 밟 밠 밡 밢 밣 밤 밥 밦 밧 밨 방 밪 밫 밬 밭 밮 밯 배 백 밲 밳 밴 밵 밶 밷 밸 밹 밺 밻 밼 밽 밾 밿 뱀 뱁 뱂 뱃 뱄 뱅 뱆 뱇 뱈 뱉 뱊 뱋 뱌 뱍 뱎 뱏 뱐 뱑 뱒 뱓 뱔 뱕 뱖 뱗 뱘 뱙 뱚 뱛 뱜 뱝 뱞 뱟 뱠 뱡 뱢 뱣 뱤 뱥 뱦 뱧 뱨 뱩 뱪 뱫 뱬 뱭 뱮 뱯 뱰 뱱 뱲 뱳 뱴 뱵 뱶 뱷 뱸 뱹 뱺 뱻 뱼 뱽 뱾 뱿 벀 벁 벂 벃 버 벅 벆 벇 번 벉 벊 벋 벌 벍 벎 벏 벐 벑 벒 벓 범 법 벖 벗 벘 벙 벚 벛 벜 벝 벞 벟 베 벡 벢 벣 벤 벥 벦 벧 벨 벩 벪 벫 벬 벭 벮 벯 벰 벱 벲 벳 벴 벵 벶 벷 벸 벹 벺 벻 벼 벽 벾 벿 변 볁 볂 볃 별 볅 볆 볇 볈 볉 볊 볋 볌 볍 볎 볏 볐 병 볒 볓 볔 볕 볖 볗 볘 볙 볚 볛 볜 볝 볞 볟 볠 볡 볢 볣 볤 볥 볦 볧 볨 볩 볪 볫 볬 볭 볮 볯 볰 볱 볲 볳 보 복 볶 볷 본 볹 볺 볻 볼 볽 볾 볿 봀 봁 봂 봃 봄 봅 봆 봇 봈 봉 봊 봋 봌 봍 봎 봏 봐 봑 봒 봓 봔 봕 봖 봗 봘 봙 봚 봛 봜 봝 봞 봟 봠 봡 봢 봣 봤 봥 봦 봧 봨 봩 봪 봫 봬 봭 봮 봯 봰 봱 봲 봳 봴 봵 봶 봷 봸 봹 봺 봻 봼 봽 봾 봿 뵀 뵁 뵂 뵃 뵄 뵅 뵆 뵇 뵈 뵉 뵊 뵋 뵌 뵍 뵎 뵏 뵐 뵑 뵒 뵓 뵔 뵕 뵖 뵗 뵘 뵙 뵚 뵛 뵜 뵝 뵞 뵟 뵠 뵡 뵢 뵣 뵤 뵥 뵦 뵧 뵨 뵩 뵪 뵫 뵬 뵭 뵮 뵯 뵰 뵱 뵲 뵳 뵴 뵵 뵶 뵷 뵸 뵹 뵺 뵻 뵼 뵽 뵾 뵿 부 북 붂 붃 분 붅 붆 붇 불 붉 붊 붋 붌 붍 붎 붏 붐 붑 붒 붓 붔 붕 붖 붗 붘 붙 붚 붛 붜 붝 붞 붟 붠 붡 붢 붣 붤 붥 붦 붧 붨 붩 붪 붫 붬 붭 붮 붯 붰 붱 붲 붳 붴 붵 붶 붷 붸 붹 붺 붻 붼 붽 붾 붿 뷀 뷁 뷂 뷃 뷄 뷅 뷆 뷇 뷈 뷉 뷊 뷋 뷌 뷍 뷎 뷏 뷐 뷑 뷒 뷓 뷔 뷕 뷖 뷗 뷘 뷙 뷚 뷛 뷜 뷝 뷞 뷟 뷠 뷡 뷢 뷣 뷤 뷥 뷦 뷧 뷨 뷩 뷪 뷫 뷬 뷭 뷮 뷯 뷰 뷱 뷲 뷳 뷴 뷵 뷶 뷷 뷸 뷹 뷺 뷻 뷼 뷽 뷾 뷿 븀 븁 븂 븃 븄 븅 븆 븇 븈 븉 븊 븋 브 븍 븎 븏 븐 븑 븒 븓 블 븕 븖 븗 븘 븙 븚 븛 븜 븝 븞 븟 븠 븡 븢 븣 븤 븥 븦 븧 븨 븩 븪 븫 븬 븭 븮 븯 븰 븱 븲 븳 븴 븵 븶 븷 븸 븹 븺 븻 븼 븽 븾 븿 빀 빁 빂 빃 비 빅 빆 빇 빈 빉 빊 빋 빌 빍 빎 빏 빐 빑 빒 빓 빔 빕 빖 빗 빘 빙 빚 빛 빜 빝 빞 빟 빠 빡 빢 빣 빤 빥 빦 빧 빨 빩 빪 빫 빬 빭 빮 빯 빰 빱 빲 빳 빴 빵 빶 빷 빸 빹 빺 빻 빼 빽 빾 빿 뺀 뺁 뺂 뺃 뺄 뺅 뺆 뺇 뺈 뺉 뺊 뺋 뺌 뺍 뺎 뺏 뺐 뺑 뺒 뺓 뺔 뺕 뺖 뺗 뺘 뺙 뺚 뺛 뺜 뺝 뺞 뺟 뺠 뺡 뺢 뺣 뺤 뺥 뺦 뺧 뺨 뺩 뺪 뺫 뺬 뺭 뺮 뺯 뺰 뺱 뺲 뺳 뺴 뺵 뺶 뺷 뺸 뺹 뺺 뺻 뺼 뺽 뺾 뺿 뻀 뻁 뻂 뻃 뻄 뻅 뻆 뻇 뻈 뻉 뻊 뻋 뻌 뻍 뻎 뻏 뻐 뻑 뻒 뻓 뻔 뻕 뻖 뻗 뻘 뻙 뻚 뻛 뻜 뻝 뻞 뻟 뻠 뻡 뻢 뻣 뻤 뻥 뻦 뻧 뻨 뻩 뻪 뻫 뻬 뻭 뻮 뻯 뻰 뻱 뻲 뻳 뻴 뻵 뻶 뻷 뻸 뻹 뻺 뻻 뻼 뻽 뻾 뻿 뼀 뼁 뼂 뼃 뼄 뼅 뼆 뼇 뼈 뼉 뼊 뼋 뼌 뼍 뼎 뼏 뼐 뼑 뼒 뼓 뼔 뼕 뼖 뼗 뼘 뼙 뼚 뼛 뼜 뼝 뼞 뼟 뼠 뼡 뼢 뼣 뼤 뼥 뼦 뼧 뼨 뼩 뼪 뼫 뼬 뼭 뼮 뼯 뼰 뼱 뼲 뼳 뼴 뼵 뼶 뼷 뼸 뼹 뼺 뼻 뼼 뼽 뼾 뼿 뽀 뽁 뽂 뽃 뽄 뽅 뽆 뽇 뽈 뽉 뽊 뽋 뽌 뽍 뽎 뽏 뽐 뽑 뽒 뽓 뽔 뽕 뽖 뽗 뽘 뽙 뽚 뽛 뽜 뽝 뽞 뽟 뽠 뽡 뽢 뽣 뽤 뽥 뽦 뽧 뽨 뽩 뽪 뽫 뽬 뽭 뽮 뽯 뽰 뽱 뽲 뽳 뽴 뽵 뽶 뽷 뽸 뽹 뽺 뽻 뽼 뽽 뽾 뽿 뾀 뾁 뾂 뾃 뾄 뾅 뾆 뾇 뾈 뾉 뾊 뾋 뾌 뾍 뾎 뾏 뾐 뾑 뾒 뾓 뾔 뾕 뾖 뾗 뾘 뾙 뾚 뾛 뾜 뾝 뾞 뾟 뾠 뾡 뾢 뾣 뾤 뾥 뾦 뾧 뾨 뾩 뾪 뾫 뾬 뾭 뾮 뾯 뾰 뾱 뾲 뾳 뾴 뾵 뾶 뾷 뾸 뾹 뾺 뾻 뾼 뾽 뾾 뾿 뿀 뿁 뿂 뿃 뿄 뿅 뿆 뿇 뿈 뿉 뿊 뿋 뿌 뿍 뿎 뿏 뿐 뿑 뿒 뿓 뿔 뿕 뿖 뿗 뿘 뿙 뿚 뿛 뿜 뿝 뿞 뿟 뿠 뿡 뿢 뿣 뿤 뿥 뿦 뿧 뿨 뿩 뿪 뿫 뿬 뿭 뿮 뿯 뿰 뿱 뿲 뿳 뿴 뿵 뿶 뿷 뿸 뿹 뿺 뿻 뿼 뿽 뿾 뿿 쀀 쀁 쀂 쀃 쀄 쀅 쀆 쀇 쀈 쀉 쀊 쀋 쀌 쀍 쀎 쀏 쀐 쀑 쀒 쀓 쀔 쀕 쀖 쀗 쀘 쀙 쀚 쀛 쀜 쀝 쀞 쀟 쀠 쀡 쀢 쀣 쀤 쀥 쀦 쀧 쀨 쀩 쀪 쀫 쀬 쀭 쀮 쀯 쀰 쀱 쀲 쀳 쀴 쀵 쀶 쀷 쀸 쀹 쀺 쀻 쀼 쀽 쀾 쀿 쁀 쁁 쁂 쁃 쁄 쁅 쁆 쁇 쁈 쁉 쁊 쁋 쁌 쁍 쁎 쁏 쁐 쁑 쁒 쁓 쁔 쁕 쁖 쁗 쁘 쁙 쁚 쁛 쁜 쁝 쁞 쁟 쁠 쁡 쁢 쁣 쁤 쁥 쁦 쁧 쁨 쁩 쁪 쁫 쁬 쁭 쁮 쁯 쁰 쁱 쁲 쁳 쁴 쁵 쁶 쁷 쁸 쁹 쁺 쁻 쁼 쁽 쁾 쁿 삀 삁 삂 삃 삄 삅 삆 삇 삈 삉 삊 삋 삌 삍 삎 삏 삐 삑 삒 삓 삔 삕 삖 삗 삘 삙 삚 삛 삜 삝 삞 삟 삠 삡 삢 삣 삤 삥 삦 삧 삨 삩 삪 삫 사 삭 삮 삯 산 삱 삲 삳 살 삵 삶 삷 삸 삹 삺 삻 삼 삽 삾 삿 샀 상 샂 샃 샄 샅 샆 샇 새 색 샊 샋 샌 샍 샎 샏 샐 샑 샒 샓 샔 샕 샖 샗 샘 샙 샚 샛 샜 생 샞 샟 샠 샡 샢 샣 샤 샥 샦 샧 샨 샩 샪 샫 샬 샭 샮 샯 샰 샱 샲 샳 샴 샵 샶 샷 샸 샹 샺 샻 샼 샽 샾 샿 섀 섁 섂 섃 섄 섅 섆 섇 섈 섉 섊 섋 섌 섍 섎 섏 섐 섑 섒 섓 섔 섕 섖 섗 섘 섙 섚 섛 서 석 섞 섟 선 섡 섢 섣 설 섥 섦 섧 섨 섩 섪 섫 섬 섭 섮 섯 섰 성 섲 섳 섴 섵 섶 섷 세 섹 섺 섻 센 섽 섾 섿 셀 셁 셂 셃 셄 셅 셆 셇 셈 셉 셊 셋 셌 셍 셎 셏 셐 셑 셒 셓 셔 셕 셖 셗 션 셙 셚 셛 셜 셝 셞 셟 셠 셡 셢 셣 셤 셥 셦 셧 셨 셩 셪 셫 셬 셭 셮 셯 셰 셱 셲 셳 셴 셵 셶 셷 셸 셹 셺 셻 셼 셽 셾 셿 솀 솁 솂 솃 솄 솅 솆 솇 솈 솉 솊 솋 소 속 솎 솏 손 솑 솒 솓 솔 솕 솖 솗 솘 솙 솚 솛 솜 솝 솞 솟 솠 송 솢 솣 솤 솥 솦 솧 솨 솩 솪 솫 솬 솭 솮 솯 솰 솱 솲 솳 솴 솵 솶 솷 솸 솹 솺 솻 솼 솽 솾 솿 쇀 쇁 쇂 쇃 쇄 쇅 쇆 쇇 쇈 쇉 쇊 쇋 쇌 쇍 쇎 쇏 쇐 쇑 쇒 쇓 쇔 쇕 쇖 쇗 쇘 쇙 쇚 쇛 쇜 쇝 쇞 쇟 쇠 쇡 쇢 쇣 쇤 쇥 쇦 쇧 쇨 쇩 쇪 쇫 쇬 쇭 쇮 쇯 쇰 쇱 쇲 쇳 쇴 쇵 쇶 쇷 쇸 쇹 쇺 쇻 쇼 쇽 쇾 쇿 숀 숁 숂 숃 숄 숅 숆 숇 숈 숉 숊 숋 숌 숍 숎 숏 숐 숑 숒 숓 숔 숕 숖 숗 수 숙 숚 숛 순 숝 숞 숟 술 숡 숢 숣 숤 숥 숦 숧 숨 숩 숪 숫 숬 숭 숮 숯 숰 숱 숲 숳 숴 숵 숶 숷 숸 숹 숺 숻 숼 숽 숾 숿 쉀 쉁 쉂 쉃 쉄 쉅 쉆 쉇 쉈 쉉 쉊 쉋 쉌 쉍 쉎 쉏 쉐 쉑 쉒 쉓 쉔 쉕 쉖 쉗 쉘 쉙 쉚 쉛 쉜 쉝 쉞 쉟 쉠 쉡 쉢 쉣 쉤 쉥 쉦 쉧 쉨 쉩 쉪 쉫 쉬 쉭 쉮 쉯 쉰 쉱 쉲 쉳 쉴 쉵 쉶 쉷 쉸 쉹 쉺 쉻 쉼 쉽 쉾 쉿 슀 슁 슂 슃 슄 슅 슆 슇 슈 슉 슊 슋 슌 슍 슎 슏 슐 슑 슒 슓 슔 슕 슖 슗 슘 슙 슚 슛 슜 슝 슞 슟 슠 슡 슢 슣 스 슥 슦 슧 슨 슩 슪 슫 슬 슭 슮 슯 슰 슱 슲 슳 슴 습 슶 슷 슸 승 슺 슻 슼 슽 슾 슿 싀 싁 싂 싃 싄 싅 싆 싇 싈 싉 싊 싋 싌 싍 싎 싏 싐 싑 싒 싓 싔 싕 싖 싗 싘 싙 싚 싛 시 식 싞 싟 신 싡 싢 싣 실 싥 싦 싧 싨 싩 싪 싫 심 십 싮 싯 싰 싱 싲 싳 싴 싵 싶 싷 싸 싹 싺 싻 싼 싽 싾 싿 쌀 쌁 쌂 쌃 쌄 쌅 쌆 쌇 쌈 쌉 쌊 쌋 쌌 쌍 쌎 쌏 쌐 쌑 쌒 쌓 쌔 쌕 쌖 쌗 쌘 쌙 쌚 쌛 쌜 쌝 쌞 쌟 쌠 쌡 쌢 쌣 쌤 쌥 쌦 쌧 쌨 쌩 쌪 쌫 쌬 쌭 쌮 쌯 쌰 쌱 쌲 쌳 쌴 쌵 쌶 쌷 쌸 쌹 쌺 쌻 쌼 쌽 쌾 쌿 썀 썁 썂 썃 썄 썅 썆 썇 썈 썉 썊 썋 썌 썍 썎 썏 썐 썑 썒 썓 썔 썕 썖 썗 썘 썙 썚 썛 썜 썝 썞 썟 썠 썡 썢 썣 썤 썥 썦 썧 써 썩 썪 썫 썬 썭 썮 썯 썰 썱 썲 썳 썴 썵 썶 썷 썸 썹 썺 썻 썼 썽 썾 썿 쎀 쎁 쎂 쎃 쎄 쎅 쎆 쎇 쎈 쎉 쎊 쎋 쎌 쎍 쎎 쎏 쎐 쎑 쎒 쎓 쎔 쎕 쎖 쎗 쎘 쎙 쎚 쎛 쎜 쎝 쎞 쎟 쎠 쎡 쎢 쎣 쎤 쎥 쎦 쎧 쎨 쎩 쎪 쎫 쎬 쎭 쎮 쎯 쎰 쎱 쎲 쎳 쎴 쎵 쎶 쎷 쎸 쎹 쎺 쎻 쎼 쎽 쎾 쎿 쏀 쏁 쏂 쏃 쏄 쏅 쏆 쏇 쏈 쏉 쏊 쏋 쏌 쏍 쏎 쏏 쏐 쏑 쏒 쏓 쏔 쏕 쏖 쏗 쏘 쏙 쏚 쏛 쏜 쏝 쏞 쏟 쏠 쏡 쏢 쏣 쏤 쏥 쏦 쏧 쏨 쏩 쏪 쏫 쏬 쏭 쏮 쏯 쏰 쏱 쏲 쏳 쏴 쏵 쏶 쏷 쏸 쏹 쏺 쏻 쏼 쏽 쏾 쏿 쐀 쐁 쐂 쐃 쐄 쐅 쐆 쐇 쐈 쐉 쐊 쐋 쐌 쐍 쐎 쐏 쐐 쐑 쐒 쐓 쐔 쐕 쐖 쐗 쐘 쐙 쐚 쐛 쐜 쐝 쐞 쐟 쐠 쐡 쐢 쐣 쐤 쐥 쐦 쐧 쐨 쐩 쐪 쐫 쐬 쐭 쐮 쐯 쐰 쐱 쐲 쐳 쐴 쐵 쐶 쐷 쐸 쐹 쐺 쐻 쐼 쐽 쐾 쐿 쑀 쑁 쑂 쑃 쑄 쑅 쑆 쑇 쑈 쑉 쑊 쑋 쑌 쑍 쑎 쑏 쑐 쑑 쑒 쑓 쑔 쑕 쑖 쑗 쑘 쑙 쑚 쑛 쑜 쑝 쑞 쑟 쑠 쑡 쑢 쑣 쑤 쑥 쑦 쑧 쑨 쑩 쑪 쑫 쑬 쑭 쑮 쑯 쑰 쑱 쑲 쑳 쑴 쑵 쑶 쑷 쑸 쑹 쑺 쑻 쑼 쑽 쑾 쑿 쒀 쒁 쒂 쒃 쒄 쒅 쒆 쒇 쒈 쒉 쒊 쒋 쒌 쒍 쒎 쒏 쒐 쒑 쒒 쒓 쒔 쒕 쒖 쒗 쒘 쒙 쒚 쒛 쒜 쒝 쒞 쒟 쒠 쒡 쒢 쒣 쒤 쒥 쒦 쒧 쒨 쒩 쒪 쒫 쒬 쒭 쒮 쒯 쒰 쒱 쒲 쒳 쒴 쒵 쒶 쒷 쒸 쒹 쒺 쒻 쒼 쒽 쒾 쒿 쓀 쓁 쓂 쓃 쓄 쓅 쓆 쓇 쓈 쓉 쓊 쓋 쓌 쓍 쓎 쓏 쓐 쓑 쓒 쓓 쓔 쓕 쓖 쓗 쓘 쓙 쓚 쓛 쓜 쓝 쓞 쓟 쓠 쓡 쓢 쓣 쓤 쓥 쓦 쓧 쓨 쓩 쓪 쓫 쓬 쓭 쓮 쓯 쓰 쓱 쓲 쓳 쓴 쓵 쓶 쓷 쓸 쓹 쓺 쓻 쓼 쓽 쓾 쓿 씀 씁 씂 씃 씄 씅 씆 씇 씈 씉 씊 씋 씌 씍 씎 씏 씐 씑 씒 씓 씔 씕 씖 씗 씘 씙 씚 씛 씜 씝 씞 씟 씠 씡 씢 씣 씤 씥 씦 씧 씨 씩 씪 씫 씬 씭 씮 씯 씰 씱 씲 씳 씴 씵 씶 씷 씸 씹 씺 씻 씼 씽 씾 씿 앀 앁 앂 앃 아 악 앆 앇 안 앉 않 앋 알 앍 앎 앏 앐 앑 앒 앓 암 압 앖 앗 았 앙 앚 앛 앜 앝 앞 앟 애 액 앢 앣 앤 앥 앦 앧 앨 앩 앪 앫 앬 앭 앮 앯 앰 앱 앲 앳 앴 앵 앶 앷 앸 앹 앺 앻 야 약 앾 앿 얀 얁 얂 얃 얄 얅 얆 얇 얈 얉 얊 얋 얌 얍 얎 얏 얐 양 얒 얓 얔 얕 얖 얗 얘 얙 얚 얛 얜 얝 얞 얟 얠 얡 얢 얣 얤 얥 얦 얧 얨 얩 얪 얫 얬 얭 얮 얯 얰 얱 얲 얳 어 억 얶 얷 언 얹 얺 얻 얼 얽 얾 얿 엀 엁 엂 엃 엄 업 없 엇 었 엉 엊 엋 엌 엍 엎 엏 에 엑 엒 엓 엔 엕 엖 엗 엘 엙 엚 엛 엜 엝 엞 엟 엠 엡 엢 엣 엤 엥 엦 엧 엨 엩 엪 엫 여 역 엮 엯 연 엱 엲 엳 열 엵 엶 엷 엸 엹 엺 엻 염 엽 엾 엿 였 영 옂 옃 옄 옅 옆 옇 예 옉 옊 옋 옌 옍 옎 옏 옐 옑 옒 옓 옔 옕 옖 옗 옘 옙 옚 옛 옜 옝 옞 옟 옠 옡 옢 옣 오 옥 옦 옧 온 옩 옪 옫 올 옭 옮 옯 옰 옱 옲 옳 옴 옵 옶 옷 옸 옹 옺 옻 옼 옽 옾 옿 와 왁 왂 왃 완 왅 왆 왇 왈 왉 왊 왋 왌 왍 왎 왏 왐 왑 왒 왓 왔 왕 왖 왗 왘 왙 왚 왛 왜 왝 왞 왟 왠 왡 왢 왣 왤 왥 왦 왧 왨 왩 왪 왫 왬 왭 왮 왯 왰 왱 왲 왳 왴 왵 왶 왷 외 왹 왺 왻 왼 왽 왾 왿 욀 욁 욂 욃 욄 욅 욆 욇 욈 욉 욊 욋 욌 욍 욎 욏 욐 욑 욒 욓 요 욕 욖 욗 욘 욙 욚 욛 욜 욝 욞 욟 욠 욡 욢 욣 욤 욥 욦 욧 욨 용 욪 욫 욬 욭 욮 욯 우 욱 욲 욳 운 욵 욶 욷 울 욹 욺 욻 욼 욽 욾 욿 움 웁 웂 웃 웄 웅 웆 웇 웈 웉 웊 웋 워 웍 웎 웏 원 웑 웒 웓 월 웕 웖 웗 웘 웙 웚 웛 웜 웝 웞 웟 웠 웡 웢 웣 웤 웥 웦 웧 웨 웩 웪 웫 웬 웭 웮 웯 웰 웱 웲 웳 웴 웵 웶 웷 웸 웹 웺 웻 웼 웽 웾 웿 윀 윁 윂 윃 위 윅 윆 윇 윈 윉 윊 윋 윌 윍 윎 윏 윐 윑 윒 윓 윔 윕 윖 윗 윘 윙 윚 윛 윜 윝 윞 윟 유 육 윢 윣 윤 윥 윦 윧 율 윩 윪 윫 윬 윭 윮 윯 윰 윱 윲 윳 윴 융 윶 윷 윸 윹 윺 윻 으 윽 윾 윿 은 읁 읂 읃 을 읅 읆 읇 읈 읉 읊 읋 음 읍 읎 읏 읐 응 읒 읓 읔 읕 읖 읗 의 읙 읚 읛 읜 읝 읞 읟 읠 읡 읢 읣 읤 읥 읦 읧 읨 읩 읪 읫 읬 읭 읮 읯 읰 읱 읲 읳 이 익 읶 읷 인 읹 읺 읻 일 읽 읾 읿 잀 잁 잂 잃 임 입 잆 잇 있 잉 잊 잋 잌 잍 잎 잏 자 작 잒 잓 잔 잕 잖 잗 잘 잙 잚 잛 잜 잝 잞 잟 잠 잡 잢 잣 잤 장 잦 잧 잨 잩 잪 잫 재 잭 잮 잯 잰 잱 잲 잳 잴 잵 잶 잷 잸 잹 잺 잻 잼 잽 잾 잿 쟀 쟁 쟂 쟃 쟄 쟅 쟆 쟇 쟈 쟉 쟊 쟋 쟌 쟍 쟎 쟏 쟐 쟑 쟒 쟓 쟔 쟕 쟖 쟗 쟘 쟙 쟚 쟛 쟜 쟝 쟞 쟟 쟠 쟡 쟢 쟣 쟤 쟥 쟦 쟧 쟨 쟩 쟪 쟫 쟬 쟭 쟮 쟯 쟰 쟱 쟲 쟳 쟴 쟵 쟶 쟷 쟸 쟹 쟺 쟻 쟼 쟽 쟾 쟿 저 적 젂 젃 전 젅 젆 젇 절 젉 젊 젋 젌 젍 젎 젏 점 접 젒 젓 젔 정 젖 젗 젘 젙 젚 젛 제 젝 젞 젟 젠 젡 젢 젣 젤 젥 젦 젧 젨 젩 젪 젫 젬 젭 젮 젯 젰 젱 젲 젳 젴 젵 젶 젷 져 젹 젺 젻 젼 젽 젾 젿 졀 졁 졂 졃 졄 졅 졆 졇 졈 졉 졊 졋 졌 졍 졎 졏 졐 졑 졒 졓 졔 졕 졖 졗 졘 졙 졚 졛 졜 졝 졞 졟 졠 졡 졢 졣 졤 졥 졦 졧 졨 졩 졪 졫 졬 졭 졮 졯 조 족 졲 졳 존 졵 졶 졷 졸 졹 졺 졻 졼 졽 졾 졿 좀 좁 좂 좃 좄 종 좆 좇 좈 좉 좊 좋 좌 좍 좎 좏 좐 좑 좒 좓 좔 좕 좖 좗 좘 좙 좚 좛 좜 좝 좞 좟 좠 좡 좢 좣 좤 좥 좦 좧 좨 좩 좪 좫 좬 좭 좮 좯 좰 좱 좲 좳 좴 좵 좶 좷 좸 좹 좺 좻 좼 좽 좾 좿 죀 죁 죂 죃 죄 죅 죆 죇 죈 죉 죊 죋 죌 죍 죎 죏 죐 죑 죒 죓 죔 죕 죖 죗 죘 죙 죚 죛 죜 죝 죞 죟 죠 죡 죢 죣 죤 죥 죦 죧 죨 죩 죪 죫 죬 죭 죮 죯 죰 죱 죲 죳 죴 죵 죶 죷 죸 죹 죺 죻 주 죽 죾 죿 준 줁 줂 줃 줄 줅 줆 줇 줈 줉 줊 줋 줌 줍 줎 줏 줐 중 줒 줓 줔 줕 줖 줗 줘 줙 줚 줛 줜 줝 줞 줟 줠 줡 줢 줣 줤 줥 줦 줧 줨 줩 줪 줫 줬 줭 줮 줯 줰 줱 줲 줳 줴 줵 줶 줷 줸 줹 줺 줻 줼 줽 줾 줿 쥀 쥁 쥂 쥃 쥄 쥅 쥆 쥇 쥈 쥉 쥊 쥋 쥌 쥍 쥎 쥏 쥐 쥑 쥒 쥓 쥔 쥕 쥖 쥗 쥘 쥙 쥚 쥛 쥜 쥝 쥞 쥟 쥠 쥡 쥢 쥣 쥤 쥥 쥦 쥧 쥨 쥩 쥪 쥫 쥬 쥭 쥮 쥯 쥰 쥱 쥲 쥳 쥴 쥵 쥶 쥷 쥸 쥹 쥺 쥻 쥼 쥽 쥾 쥿 즀 즁 즂 즃 즄 즅 즆 즇 즈 즉 즊 즋 즌 즍 즎 즏 즐 즑 즒 즓 즔 즕 즖 즗 즘 즙 즚 즛 즜 증 즞 즟 즠 즡 즢 즣 즤 즥 즦 즧 즨 즩 즪 즫 즬 즭 즮 즯 즰 즱 즲 즳 즴 즵 즶 즷 즸 즹 즺 즻 즼 즽 즾 즿 지 직 짂 짃 진 짅 짆 짇 질 짉 짊 짋 짌 짍 짎 짏 짐 집 짒 짓 짔 징 짖 짗 짘 짙 짚 짛 짜 짝 짞 짟 짠 짡 짢 짣 짤 짥 짦 짧 짨 짩 짪 짫 짬 짭 짮 짯 짰 짱 짲 짳 짴 짵 짶 짷 째 짹 짺 짻 짼 짽 짾 짿 쨀 쨁 쨂 쨃 쨄 쨅 쨆 쨇 쨈 쨉 쨊 쨋 쨌 쨍 쨎 쨏 쨐 쨑 쨒 쨓 쨔 쨕 쨖 쨗 쨘 쨙 쨚 쨛 쨜 쨝 쨞 쨟 쨠 쨡 쨢 쨣 쨤 쨥 쨦 쨧 쨨 쨩 쨪 쨫 쨬 쨭 쨮 쨯 쨰 쨱 쨲 쨳 쨴 쨵 쨶 쨷 쨸 쨹 쨺 쨻 쨼 쨽 쨾 쨿 쩀 쩁 쩂 쩃 쩄 쩅 쩆 쩇 쩈 쩉 쩊 쩋 쩌 쩍 쩎 쩏 쩐 쩑 쩒 쩓 쩔 쩕 쩖 쩗 쩘 쩙 쩚 쩛 쩜 쩝 쩞 쩟 쩠 쩡 쩢 쩣 쩤 쩥 쩦 쩧 쩨 쩩 쩪 쩫 쩬 쩭 쩮 쩯 쩰 쩱 쩲 쩳 쩴 쩵 쩶 쩷 쩸 쩹 쩺 쩻 쩼 쩽 쩾 쩿 쪀 쪁 쪂 쪃 쪄 쪅 쪆 쪇 쪈 쪉 쪊 쪋 쪌 쪍 쪎 쪏 쪐 쪑 쪒 쪓 쪔 쪕 쪖 쪗 쪘 쪙 쪚 쪛 쪜 쪝 쪞 쪟 쪠 쪡 쪢 쪣 쪤 쪥 쪦 쪧 쪨 쪩 쪪 쪫 쪬 쪭 쪮 쪯 쪰 쪱 쪲 쪳 쪴 쪵 쪶 쪷 쪸 쪹 쪺 쪻 쪼 쪽 쪾 쪿 쫀 쫁 쫂 쫃 쫄 쫅 쫆 쫇 쫈 쫉 쫊 쫋 쫌 쫍 쫎 쫏 쫐 쫑 쫒 쫓 쫔 쫕 쫖 쫗 쫘 쫙 쫚 쫛 쫜 쫝 쫞 쫟 쫠 쫡 쫢 쫣 쫤 쫥 쫦 쫧 쫨 쫩 쫪 쫫 쫬 쫭 쫮 쫯 쫰 쫱 쫲 쫳 쫴 쫵 쫶 쫷 쫸 쫹 쫺 쫻 쫼 쫽 쫾 쫿 쬀 쬁 쬂 쬃 쬄 쬅 쬆 쬇 쬈 쬉 쬊 쬋 쬌 쬍 쬎 쬏 쬐 쬑 쬒 쬓 쬔 쬕 쬖 쬗 쬘 쬙 쬚 쬛 쬜 쬝 쬞 쬟 쬠 쬡 쬢 쬣 쬤 쬥 쬦 쬧 쬨 쬩 쬪 쬫 쬬 쬭 쬮 쬯 쬰 쬱 쬲 쬳 쬴 쬵 쬶 쬷 쬸 쬹 쬺 쬻 쬼 쬽 쬾 쬿 쭀 쭁 쭂 쭃 쭄 쭅 쭆 쭇 쭈 쭉 쭊 쭋 쭌 쭍 쭎 쭏 쭐 쭑 쭒 쭓 쭔 쭕 쭖 쭗 쭘 쭙 쭚 쭛 쭜 쭝 쭞 쭟 쭠 쭡 쭢 쭣 쭤 쭥 쭦 쭧 쭨 쭩 쭪 쭫 쭬 쭭 쭮 쭯 쭰 쭱 쭲 쭳 쭴 쭵 쭶 쭷 쭸 쭹 쭺 쭻 쭼 쭽 쭾 쭿 쮀 쮁 쮂 쮃 쮄 쮅 쮆 쮇 쮈 쮉 쮊 쮋 쮌 쮍 쮎 쮏 쮐 쮑 쮒 쮓 쮔 쮕 쮖 쮗 쮘 쮙 쮚 쮛 쮜 쮝 쮞 쮟 쮠 쮡 쮢 쮣 쮤 쮥 쮦 쮧 쮨 쮩 쮪 쮫 쮬 쮭 쮮 쮯 쮰 쮱 쮲 쮳 쮴 쮵 쮶 쮷 쮸 쮹 쮺 쮻 쮼 쮽 쮾 쮿 쯀 쯁 쯂 쯃 쯄 쯅 쯆 쯇 쯈 쯉 쯊 쯋 쯌 쯍 쯎 쯏 쯐 쯑 쯒 쯓 쯔 쯕 쯖 쯗 쯘 쯙 쯚 쯛 쯜 쯝 쯞 쯟 쯠 쯡 쯢 쯣 쯤 쯥 쯦 쯧 쯨 쯩 쯪 쯫 쯬 쯭 쯮 쯯 쯰 쯱 쯲 쯳 쯴 쯵 쯶 쯷 쯸 쯹 쯺 쯻 쯼 쯽 쯾 쯿 찀 찁 찂 찃 찄 찅 찆 찇 찈 찉 찊 찋 찌 찍 찎 찏 찐 찑 찒 찓 찔 찕 찖 찗 찘 찙 찚 찛 찜 찝 찞 찟 찠 찡 찢 찣 찤 찥 찦 찧 차 착 찪 찫 찬 찭 찮 찯 찰 찱 찲 찳 찴 찵 찶 찷 참 찹 찺 찻 찼 창 찾 찿 챀 챁 챂 챃 채 책 챆 챇 챈 챉 챊 챋 챌 챍 챎 챏 챐 챑 챒 챓 챔 챕 챖 챗 챘 챙 챚 챛 챜 챝 챞 챟 챠 챡 챢 챣 챤 챥 챦 챧 챨 챩 챪 챫 챬 챭 챮 챯 챰 챱 챲 챳 챴 챵 챶 챷 챸 챹 챺 챻 챼 챽 챾 챿 첀 첁 첂 첃 첄 첅 첆 첇 첈 첉 첊 첋 첌 첍 첎 첏 첐 첑 첒 첓 첔 첕 첖 첗 처 척 첚 첛 천 첝 첞 첟 철 첡 첢 첣 첤 첥 첦 첧 첨 첩 첪 첫 첬 청 첮 첯 첰 첱 첲 첳 체 첵 첶 첷 첸 첹 첺 첻 첼 첽 첾 첿 쳀 쳁 쳂 쳃 쳄 쳅 쳆 쳇 쳈 쳉 쳊 쳋 쳌 쳍 쳎 쳏 쳐 쳑 쳒 쳓 쳔 쳕 쳖 쳗 쳘 쳙 쳚 쳛 쳜 쳝 쳞 쳟 쳠 쳡 쳢 쳣 쳤 쳥 쳦 쳧 쳨 쳩 쳪 쳫 쳬 쳭 쳮 쳯 쳰 쳱 쳲 쳳 쳴 쳵 쳶 쳷 쳸 쳹 쳺 쳻 쳼 쳽 쳾 쳿 촀 촁 촂 촃 촄 촅 촆 촇 초 촉 촊 촋 촌 촍 촎 촏 촐 촑 촒 촓 촔 촕 촖 촗 촘 촙 촚 촛 촜 총 촞 촟 촠 촡 촢 촣 촤 촥 촦 촧 촨 촩 촪 촫 촬 촭 촮 촯 촰 촱 촲 촳 촴 촵 촶 촷 촸 촹 촺 촻 촼 촽 촾 촿 쵀 쵁 쵂 쵃 쵄 쵅 쵆 쵇 쵈 쵉 쵊 쵋 쵌 쵍 쵎 쵏 쵐 쵑 쵒 쵓 쵔 쵕 쵖 쵗 쵘 쵙 쵚 쵛 최 쵝 쵞 쵟 쵠 쵡 쵢 쵣 쵤 쵥 쵦 쵧 쵨 쵩 쵪 쵫 쵬 쵭 쵮 쵯 쵰 쵱 쵲 쵳 쵴 쵵 쵶 쵷 쵸 쵹 쵺 쵻 쵼 쵽 쵾 쵿 춀 춁 춂 춃 춄 춅 춆 춇 춈 춉 춊 춋 춌 춍 춎 춏 춐 춑 춒 춓 추 축 춖 춗 춘 춙 춚 춛 출 춝 춞 춟 춠 춡 춢 춣 춤 춥 춦 춧 춨 충 춪 춫 춬 춭 춮 춯 춰 춱 춲 춳 춴 춵 춶 춷 춸 춹 춺 춻 춼 춽 춾 춿 췀 췁 췂 췃 췄 췅 췆 췇 췈 췉 췊 췋 췌 췍 췎 췏 췐 췑 췒 췓 췔 췕 췖 췗 췘 췙 췚 췛 췜 췝 췞 췟 췠 췡 췢 췣 췤 췥 췦 췧 취 췩 췪 췫 췬 췭 췮 췯 췰 췱 췲 췳 췴 췵 췶 췷 췸 췹 췺 췻 췼 췽 췾 췿 츀 츁 츂 츃 츄 츅 츆 츇 츈 츉 츊 츋 츌 츍 츎 츏 츐 츑 츒 츓 츔 츕 츖 츗 츘 츙 츚 츛 츜 츝 츞 츟 츠 측 츢 츣 츤 츥 츦 츧 츨 츩 츪 츫 츬 츭 츮 츯 츰 츱 츲 츳 츴 층 츶 츷 츸 츹 츺 츻 츼 츽 츾 츿 칀 칁 칂 칃 칄 칅 칆 칇 칈 칉 칊 칋 칌 칍 칎 칏 칐 칑 칒 칓 칔 칕 칖 칗 치 칙 칚 칛 친 칝 칞 칟 칠 칡 칢 칣 칤 칥 칦 칧 침 칩 칪 칫 칬 칭 칮 칯 칰 칱 칲 칳 카 칵 칶 칷 칸 칹 칺 칻 칼 칽 칾 칿 캀 캁 캂 캃 캄 캅 캆 캇 캈 캉 캊 캋 캌 캍 캎 캏 캐 캑 캒 캓 캔 캕 캖 캗 캘 캙 캚 캛 캜 캝 캞 캟 캠 캡 캢 캣 캤 캥 캦 캧 캨 캩 캪 캫 캬 캭 캮 캯 캰 캱 캲 캳 캴 캵 캶 캷 캸 캹 캺 캻 캼 캽 캾 캿 컀 컁 컂 컃 컄 컅 컆 컇 컈 컉 컊 컋 컌 컍 컎 컏 컐 컑 컒 컓 컔 컕 컖 컗 컘 컙 컚 컛 컜 컝 컞 컟 컠 컡 컢 컣 커 컥 컦 컧 컨 컩 컪 컫 컬 컭 컮 컯 컰 컱 컲 컳 컴 컵 컶 컷 컸 컹 컺 컻 컼 컽 컾 컿 케 켁 켂 켃 켄 켅 켆 켇 켈 켉 켊 켋 켌 켍 켎 켏 켐 켑 켒 켓 켔 켕 켖 켗 켘 켙 켚 켛 켜 켝 켞 켟 켠 켡 켢 켣 켤 켥 켦 켧 켨 켩 켪 켫 켬 켭 켮 켯 켰 켱 켲 켳 켴 켵 켶 켷 켸 켹 켺 켻 켼 켽 켾 켿 콀 콁 콂 콃 콄 콅 콆 콇 콈 콉 콊 콋 콌 콍 콎 콏 콐 콑 콒 콓 코 콕 콖 콗 콘 콙 콚 콛 콜 콝 콞 콟 콠 콡 콢 콣 콤 콥 콦 콧 콨 콩 콪 콫 콬 콭 콮 콯 콰 콱 콲 콳 콴 콵 콶 콷 콸 콹 콺 콻 콼 콽 콾 콿 쾀 쾁 쾂 쾃 쾄 쾅 쾆 쾇 쾈 쾉 쾊 쾋 쾌 쾍 쾎 쾏 쾐 쾑 쾒 쾓 쾔 쾕 쾖 쾗 쾘 쾙 쾚 쾛 쾜 쾝 쾞 쾟 쾠 쾡 쾢 쾣 쾤 쾥 쾦 쾧 쾨 쾩 쾪 쾫 쾬 쾭 쾮 쾯 쾰 쾱 쾲 쾳 쾴 쾵 쾶 쾷 쾸 쾹 쾺 쾻 쾼 쾽 쾾 쾿 쿀 쿁 쿂 쿃 쿄 쿅 쿆 쿇 쿈 쿉 쿊 쿋 쿌 쿍 쿎 쿏 쿐 쿑 쿒 쿓 쿔 쿕 쿖 쿗 쿘 쿙 쿚 쿛 쿜 쿝 쿞 쿟 쿠 쿡 쿢 쿣 쿤 쿥 쿦 쿧 쿨 쿩 쿪 쿫 쿬 쿭 쿮 쿯 쿰 쿱 쿲 쿳 쿴 쿵 쿶 쿷 쿸 쿹 쿺 쿻 쿼 쿽 쿾 쿿 퀀 퀁 퀂 퀃 퀄 퀅 퀆 퀇 퀈 퀉 퀊 퀋 퀌 퀍 퀎 퀏 퀐 퀑 퀒 퀓 퀔 퀕 퀖 퀗 퀘 퀙 퀚 퀛 퀜 퀝 퀞 퀟 퀠 퀡 퀢 퀣 퀤 퀥 퀦 퀧 퀨 퀩 퀪 퀫 퀬 퀭 퀮 퀯 퀰 퀱 퀲 퀳 퀴 퀵 퀶 퀷 퀸 퀹 퀺 퀻 퀼 퀽 퀾 퀿 큀 큁 큂 큃 큄 큅 큆 큇 큈 큉 큊 큋 큌 큍 큎 큏 큐 큑 큒 큓 큔 큕 큖 큗 큘 큙 큚 큛 큜 큝 큞 큟 큠 큡 큢 큣 큤 큥 큦 큧 큨 큩 큪 큫 크 큭 큮 큯 큰 큱 큲 큳 클 큵 큶 큷 큸 큹 큺 큻 큼 큽 큾 큿 킀 킁 킂 킃 킄 킅 킆 킇 킈 킉 킊 킋 킌 킍 킎 킏 킐 킑 킒 킓 킔 킕 킖 킗 킘 킙 킚 킛 킜 킝 킞 킟 킠 킡 킢 킣 키 킥 킦 킧 킨 킩 킪 킫 킬 킭 킮 킯 킰 킱 킲 킳 킴 킵 킶 킷 킸 킹 킺 킻 킼 킽 킾 킿 타 탁 탂 탃 탄 탅 탆 탇 탈 탉 탊 탋 탌 탍 탎 탏 탐 탑 탒 탓 탔 탕 탖 탗 탘 탙 탚 탛 태 택 탞 탟 탠 탡 탢 탣 탤 탥 탦 탧 탨 탩 탪 탫 탬 탭 탮 탯 탰 탱 탲 탳 탴 탵 탶 탷 탸 탹 탺 탻 탼 탽 탾 탿 턀 턁 턂 턃 턄 턅 턆 턇 턈 턉 턊 턋 턌 턍 턎 턏 턐 턑 턒 턓 턔 턕 턖 턗 턘 턙 턚 턛 턜 턝 턞 턟 턠 턡 턢 턣 턤 턥 턦 턧 턨 턩 턪 턫 턬 턭 턮 턯 터 턱 턲 턳 턴 턵 턶 턷 털 턹 턺 턻 턼 턽 턾 턿 텀 텁 텂 텃 텄 텅 텆 텇 텈 텉 텊 텋 테 텍 텎 텏 텐 텑 텒 텓 텔 텕 텖 텗 텘 텙 텚 텛 템 텝 텞 텟 텠 텡 텢 텣 텤 텥 텦 텧 텨 텩 텪 텫 텬 텭 텮 텯 텰 텱 텲 텳 텴 텵 텶 텷 텸 텹 텺 텻 텼 텽 텾 텿 톀 톁 톂 톃 톄 톅 톆 톇 톈 톉 톊 톋 톌 톍 톎 톏 톐 톑 톒 톓 톔 톕 톖 톗 톘 톙 톚 톛 톜 톝 톞 톟 토 톡 톢 톣 톤 톥 톦 톧 톨 톩 톪 톫 톬 톭 톮 톯 톰 톱 톲 톳 톴 통 톶 톷 톸 톹 톺 톻 톼 톽 톾 톿 퇀 퇁 퇂 퇃 퇄 퇅 퇆 퇇 퇈 퇉 퇊 퇋 퇌 퇍 퇎 퇏 퇐 퇑 퇒 퇓 퇔 퇕 퇖 퇗 퇘 퇙 퇚 퇛 퇜 퇝 퇞 퇟 퇠 퇡 퇢 퇣 퇤 퇥 퇦 퇧 퇨 퇩 퇪 퇫 퇬 퇭 퇮 퇯 퇰 퇱 퇲 퇳 퇴 퇵 퇶 퇷 퇸 퇹 퇺 퇻 퇼 퇽 퇾 퇿 툀 툁 툂 툃 툄 툅 툆 툇 툈 툉 툊 툋 툌 툍 툎 툏 툐 툑 툒 툓 툔 툕 툖 툗 툘 툙 툚 툛 툜 툝 툞 툟 툠 툡 툢 툣 툤 툥 툦 툧 툨 툩 툪 툫 투 툭 툮 툯 툰 툱 툲 툳 툴 툵 툶 툷 툸 툹 툺 툻 툼 툽 툾 툿 퉀 퉁 퉂 퉃 퉄 퉅 퉆 퉇 퉈 퉉 퉊 퉋 퉌 퉍 퉎 퉏 퉐 퉑 퉒 퉓 퉔 퉕 퉖 퉗 퉘 퉙 퉚 퉛 퉜 퉝 퉞 퉟 퉠 퉡 퉢 퉣 퉤 퉥 퉦 퉧 퉨 퉩 퉪 퉫 퉬 퉭 퉮 퉯 퉰 퉱 퉲 퉳 퉴 퉵 퉶 퉷 퉸 퉹 퉺 퉻 퉼 퉽 퉾 퉿 튀 튁 튂 튃 튄 튅 튆 튇 튈 튉 튊 튋 튌 튍 튎 튏 튐 튑 튒 튓 튔 튕 튖 튗 튘 튙 튚 튛 튜 튝 튞 튟 튠 튡 튢 튣 튤 튥 튦 튧 튨 튩 튪 튫 튬 튭 튮 튯 튰 튱 튲 튳 튴 튵 튶 튷 트 특 튺 튻 튼 튽 튾 튿 틀 틁 틂 틃 틄 틅 틆 틇 틈 틉 틊 틋 틌 틍 틎 틏 틐 틑 틒 틓 틔 틕 틖 틗 틘 틙 틚 틛 틜 틝 틞 틟 틠 틡 틢 틣 틤 틥 틦 틧 틨 틩 틪 틫 틬 틭 틮 틯 티 틱 틲 틳 틴 틵 틶 틷 틸 틹 틺 틻 틼 틽 틾 틿 팀 팁 팂 팃 팄 팅 팆 팇 팈 팉 팊 팋 파 팍 팎 팏 판 팑 팒 팓 팔 팕 팖 팗 팘 팙 팚 팛 팜 팝 팞 팟 팠 팡 팢 팣 팤 팥 팦 팧 패 팩 팪 팫 팬 팭 팮 팯 팰 팱 팲 팳 팴 팵 팶 팷 팸 팹 팺 팻 팼 팽 팾 팿 퍀 퍁 퍂 퍃 퍄 퍅 퍆 퍇 퍈 퍉 퍊 퍋 퍌 퍍 퍎 퍏 퍐 퍑 퍒 퍓 퍔 퍕 퍖 퍗 퍘 퍙 퍚 퍛 퍜 퍝 퍞 퍟 퍠 퍡 퍢 퍣 퍤 퍥 퍦 퍧 퍨 퍩 퍪 퍫 퍬 퍭 퍮 퍯 퍰 퍱 퍲 퍳 퍴 퍵 퍶 퍷 퍸 퍹 퍺 퍻 퍼 퍽 퍾 퍿 펀 펁 펂 펃 펄 펅 펆 펇 펈 펉 펊 펋 펌 펍 펎 펏 펐 펑 펒 펓 펔 펕 펖 펗 페 펙 펚 펛 펜 펝 펞 펟 펠 펡 펢 펣 펤 펥 펦 펧 펨 펩 펪 펫 펬 펭 펮 펯 펰 펱 펲 펳 펴 펵 펶 펷 편 펹 펺 펻 펼 펽 펾 펿 폀 폁 폂 폃 폄 폅 폆 폇 폈 평 폊 폋 폌 폍 폎 폏 폐 폑 폒 폓 폔 폕 폖 폗 폘 폙 폚 폛 폜 폝 폞 폟 폠 폡 폢 폣 폤 폥 폦 폧 폨 폩 폪 폫 포 폭 폮 폯 폰 폱 폲 폳 폴 폵 폶 폷 폸 폹 폺 폻 폼 폽 폾 폿 퐀 퐁 퐂 퐃 퐄 퐅 퐆 퐇 퐈 퐉 퐊 퐋 퐌 퐍 퐎 퐏 퐐 퐑 퐒 퐓 퐔 퐕 퐖 퐗 퐘 퐙 퐚 퐛 퐜 퐝 퐞 퐟 퐠 퐡 퐢 퐣 퐤 퐥 퐦 퐧 퐨 퐩 퐪 퐫 퐬 퐭 퐮 퐯 퐰 퐱 퐲 퐳 퐴 퐵 퐶 퐷 퐸 퐹 퐺 퐻 퐼 퐽 퐾 퐿 푀 푁 푂 푃 푄 푅 푆 푇 푈 푉 푊 푋 푌 푍 푎 푏 푐 푑 푒 푓 푔 푕 푖 푗 푘 푙 푚 푛 표 푝 푞 푟 푠 푡 푢 푣 푤 푥 푦 푧 푨 푩 푪 푫 푬 푭 푮 푯 푰 푱 푲 푳 푴 푵 푶 푷 푸 푹 푺 푻 푼 푽 푾 푿 풀 풁 풂 풃 풄 풅 풆 풇 품 풉 풊 풋 풌 풍 풎 풏 풐 풑 풒 풓 풔 풕 풖 풗 풘 풙 풚 풛 풜 풝 풞 풟 풠 풡 풢 풣 풤 풥 풦 풧 풨 풩 풪 풫 풬 풭 풮 풯 풰 풱 풲 풳 풴 풵 풶 풷 풸 풹 풺 풻 풼 풽 풾 풿 퓀 퓁 퓂 퓃 퓄 퓅 퓆 퓇 퓈 퓉 퓊 퓋 퓌 퓍 퓎 퓏 퓐 퓑 퓒 퓓 퓔 퓕 퓖 퓗 퓘 퓙 퓚 퓛 퓜 퓝 퓞 퓟 퓠 퓡 퓢 퓣 퓤 퓥 퓦 퓧 퓨 퓩 퓪 퓫 퓬 퓭 퓮 퓯 퓰 퓱 퓲 퓳 퓴 퓵 퓶 퓷 퓸 퓹 퓺 퓻 퓼 퓽 퓾 퓿 픀 픁 픂 픃 프 픅 픆 픇 픈 픉 픊 픋 플 픍 픎 픏 픐 픑 픒 픓 픔 픕 픖 픗 픘 픙 픚 픛 픜 픝 픞 픟 픠 픡 픢 픣 픤 픥 픦 픧 픨 픩 픪 픫 픬 픭 픮 픯 픰 픱 픲 픳 픴 픵 픶 픷 픸 픹 픺 픻 피 픽 픾 픿 핀 핁 핂 핃 필 핅 핆 핇 핈 핉 핊 핋 핌 핍 핎 핏 핐 핑 핒 핓 핔 핕 핖 핗 하 학 핚 핛 한 핝 핞 핟 할 핡 핢 핣 핤 핥 핦 핧 함 합 핪 핫 핬 항 핮 핯 핰 핱 핲 핳 해 핵 핶 핷 핸 핹 핺 핻 핼 핽 핾 핿 햀 햁 햂 햃 햄 햅 햆 햇 했 행 햊 햋 햌 햍 햎 햏 햐 햑 햒 햓 햔 햕 햖 햗 햘 햙 햚 햛 햜 햝 햞 햟 햠 햡 햢 햣 햤 향 햦 햧 햨 햩 햪 햫 햬 햭 햮 햯 햰 햱 햲 햳 햴 햵 햶 햷 햸 햹 햺 햻 햼 햽 햾 햿 헀 헁 헂 헃 헄 헅 헆 헇 허 헉 헊 헋 헌 헍 헎 헏 헐 헑 헒 헓 헔 헕 헖 헗 험 헙 헚 헛 헜 헝 헞 헟 헠 헡 헢 헣 헤 헥 헦 헧 헨 헩 헪 헫 헬 헭 헮 헯 헰 헱 헲 헳 헴 헵 헶 헷 헸 헹 헺 헻 헼 헽 헾 헿 혀 혁 혂 혃 현 혅 혆 혇 혈 혉 혊 혋 혌 혍 혎 혏 혐 협 혒 혓 혔 형 혖 혗 혘 혙 혚 혛 혜 혝 혞 혟 혠 혡 혢 혣 혤 혥 혦 혧 혨 혩 혪 혫 혬 혭 혮 혯 혰 혱 혲 혳 혴 혵 혶 혷 호 혹 혺 혻 혼 혽 혾 혿 홀 홁 홂 홃 홄 홅 홆 홇 홈 홉 홊 홋 홌 홍 홎 홏 홐 홑 홒 홓 화 확 홖 홗 환 홙 홚 홛 활 홝 홞 홟 홠 홡 홢 홣 홤 홥 홦 홧 홨 황 홪 홫 홬 홭 홮 홯 홰 홱 홲 홳 홴 홵 홶 홷 홸 홹 홺 홻 홼 홽 홾 홿 횀 횁 횂 횃 횄 횅 횆 횇 횈 횉 횊 횋 회 획 횎 횏 횐 횑 횒 횓 횔 횕 횖 횗 횘 횙 횚 횛 횜 횝 횞 횟 횠 횡 횢 횣 횤 횥 횦 횧 효 횩 횪 횫 횬 횭 횮 횯 횰 횱 횲 횳 횴 횵 횶 횷 횸 횹 횺 횻 횼 횽 횾 횿 훀 훁 훂 훃 후 훅 훆 훇 훈 훉 훊 훋 훌 훍 훎 훏 훐 훑 훒 훓 훔 훕 훖 훗 훘 훙 훚 훛 훜 훝 훞 훟 훠 훡 훢 훣 훤 훥 훦 훧 훨 훩 훪 훫 훬 훭 훮 훯 훰 훱 훲 훳 훴 훵 훶 훷 훸 훹 훺 훻 훼 훽 훾 훿 휀 휁 휂 휃 휄 휅 휆 휇 휈 휉 휊 휋 휌 휍 휎 휏 휐 휑 휒 휓 휔 휕 휖 휗 휘 휙 휚 휛 휜 휝 휞 휟 휠 휡 휢 휣 휤 휥 휦 휧 휨 휩 휪 휫 휬 휭 휮 휯 휰 휱 휲 휳 휴 휵 휶 휷 휸 휹 휺 휻 휼 휽 휾 휿 흀 흁 흂 흃 흄 흅 흆 흇 흈 흉 흊 흋 흌 흍 흎 흏 흐 흑 흒 흓 흔 흕 흖 흗 흘 흙 흚 흛 흜 흝 흞 흟 흠 흡 흢 흣 흤 흥 흦 흧 흨 흩 흪 흫 희 흭 흮 흯 흰 흱 흲 흳 흴 흵 흶 흷 흸 흹 흺 흻 흼 흽 흾 흿 힀 힁 힂 힃 힄 힅 힆 힇 히 힉 힊 힋 힌 힍 힎 힏 힐 힑 힒 힓 힔 힕 힖 힗 힘 힙 힚 힛 힜 힝 힞 힟 힠 힡 힢 힣", - 2: "‾ _ _ - - ‐ — ― 〜 ・ , , 、 ; ; : : ! ! ¡ ? ? ¿ . . ‥ … 。 · ' ‘ ’ \" " “ ” ( ( ) ) [ [ ] ] { { } } 〈 〉 《 》 「 」 『 』 【 】 〔 〕 § ¶ @ @ * * / / \\ \ & & # # % % ‰ † ‡ ′ ″ 〃 ※", - 3: "ᄀ ᄀ ᄁ ᄂ ᄃ ᄄ ᄅ ᄆ ᄇ ᄈ ᄉ ᄊ ᄋ ᄌ ᄍ ᄎ ᄏ ᄐ ᄑ ᄒ ᅡ ᅡ ᅢ ᅣ ᅤ ᅥ ᅦ ᅧ ᅨ ᅩ ᅪ ᅫ ᅬ ᅭ ᅮ ᅯ ᅰ ᅱ ᅲ ᅳ ᅴ ᅵ ᆨ ᆨ ᆩ ᆪ ᆫ ᆬ ᆭ ᆮ ᆯ ᆰ ᆱ ᆲ ᆳ ᆴ ᆵ ᆶ ᆷ ᆸ ᆹ ᆺ ᆻ ᆼ ᆽ ᆾ ᆿ ᇀ ᇁ ᇂ 丘 串 乃 久 乖 九 乞 乫 乾 亂 亘 交 京 仇 今 介 件 价 企 伋 伎 伽 佳 佶 侃 來 侊 供 係 俓 俱 個 倞 倦 倨 假 偈 健 傀 傑 傾 僅 僑 價 儆 儉 儺 光 克 兢 內 公 共 其 具 兼 冀 冠 凱 刊 刮 券 刻 剋 剛 劇 劍 劒 功 加 劤 劫 勁 勍 勘 勤 勸 勻 勾 匡 匣 區 南 卦 却 卵 卷 卿 厥 去 及 口 句 叩 叫 可 各 吉 君 告 呱 呵 咎 咬 哥 哭 啓 喀 喇 喝 喫 喬 嗜 嘉 嘔 器 囊 困 固 圈 國 圭 圻 均 坎 坑 坤 坰 坵 垢 基 埼 堀 堅 堈 堪 堺 塊 塏 境 墾 壙 壞 夔 奇 奈 奎 契 奸 妓 妗 姑 姜 姦 娘 娜 嫁 嬌 孔 季 孤 宏 官 客 宮 家 寄 寇 寡 寬 尻 局 居 屆 屈 岐 岡 岬 崎 崑 崗 嵌 嵐 嶇 嶠 工 巧 巨 己 巾 干 幹 幾 庚 庫 康 廊 廐 廓 廣 建 弓 强 彊 徑 忌 急 怪 怯 恐 恝 恪 恭 悸 愆 感 愧 愷 愾 慊 慣 慤 慨 慶 慷 憩 憬 憾 懃 懇 懦 懶 懼 戈 戒 戟 戡 扱 技 抉 拉 拏 拐 拒 拘 括 拮 拱 拳 拷 拿 捏 据 捲 捺 掘 掛 控 揀 揆 揭 擊 擎 擒 據 擧 攪 攷 改 攻 故 敎 救 敢 敬 敲 斛 斤 旗 旣 昆 昑 景 晷 暇 暖 暠 暻 曠 曲 更 曷 朗 朞 期 机 杆 杞 杰 枏 果 枯 架 枸 柑 柩 柬 柯 校 根 格 桀 桂 桔 桿 梏 梗 械 梱 棄 棋 棍 棘 棨 棺 楗 楠 極 槁 構 槐 槨 槪 槻 槿 樂 橄 橋 橘 機 檄 檎 檢 櫃 欄 權 欺 款 歌 歐 歸 殼 毆 毬 氣 求 江 汨 汲 決 汽 沂 沽 洛 洸 浪 涇 淃 淇 減 渠 渴 湳 溝 溪 滑 滾 漑 潔 潰 澗 激 濫 灌 灸 炅 炚 炬 烙 烱 煖 爛 牽 犬 狂 狗 狡 狼 獗 玖 玘 珂 珏 珖 珙 珞 珪 球 琦 琨 琪 琯 琴 瑾 璂 璟 璣 璥 瓊 瓘 瓜 甄 甘 甲 男 畇 界 畸 畺 畿 疆 疥 疳 痂 痙 痼 癎 癩 癸 皆 皎 皐 盖 監 看 眷 睾 瞰 瞼 瞿 矜 矩 矯 硅 硬 碁 碣 磎 磬 磯 磵 祁 祇 祈 祛 祺 禁 禽 科 稈 稼 稽 稿 穀 究 穹 空 窘 窟 窮 窺 竅 竟 竭 競 竿 筋 筐 筠 箇 箕 箝 管 簡 粳 糠 系 糾 紀 納 紘 級 紺 絅 結 絞 給 絳 絹 絿 經 綱 綺 緊 繫 繭 繼 缺 罐 罫 羅 羈 羌 羔 群 羹 翹 考 耆 耉 耕 耭 耿 肌 肝 股 肩 肯 肱 胛 胱 脚 脛 腔 腱 膈 膏 膠 臘 臼 舅 舊 舡 艮 艱 芎 芥 芩 芹 苛 苟 苦 苽 茄 莖 菅 菊 菌 菓 菫 菰 落 葛 葵 蓋 蕎 蕨 薑 藁 藍 藿 蘭 蘿 虔 蚣 蛟 蝎 螺 蠟 蠱 街 衢 衲 衾 衿 袈 袞 袴 裙 裸 褐 襁 襟 襤 見 規 覡 覲 覺 觀 角 計 記 訣 訶 詭 誇 誡 誥 課 諫 諾 謙 講 謳 謹 譏 警 譴 谷 谿 豈 貢 貫 貴 賈 購 赳 起 跏 距 跨 踞 蹇 蹶 躬 軀 車 軌 軍 軻 較 輕 轎 轟 辜 近 迦 迲 适 逑 逕 逵 過 遣 遽 邏 那 邯 邱 郊 郎 郡 郭 酪 醵 金 鈐 鈞 鉀 鉅 鉗 鉤 銶 鋸 鋼 錡 錤 錦 錮 鍋 鍵 鎌 鎧 鏡 鑑 鑒 鑛 開 間 閘 閣 閨 闕 關 降 階 隔 隙 雇 難 鞏 鞠 鞨 鞫 頃 頸 顆 顧 飢 餃 館 饉 饋 饑 駒 駕 駱 騎 騏 騫 驅 驕 驚 驥 骨 高 鬼 魁 鮫 鯤 鯨 鱇 鳩 鵑 鵠 鷄 鷗 鸞 麒 麴 黔 鼓 龕 龜", - 5: "ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ", - }, - "kok": { - 0: "़ ० १ २ ३ ४ ५ ६ ७ ८ ९ ॐ ं ँ ः अ आ इ ई उ ऊ ऋ ऌ ऍ ए ऐ ऑ ओ औ क क़ ख ख़ ग ग़ घ ङ च छ ज ज़ झ ञ ट ठ ड ड़ ढ ढ़ ण त थ द ध न प फ फ़ ब भ म य य़ र ल व श ष स ह ळ ऽ ा ि ी ु ू ृ ॄ ॅ े ै ॉ ो ौ ्", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d", - }, - "ks": { - 0: "۪ ۭ َ ُ ِ ٔ ٕ ٖ ٗ ٚ ٛ ء آ أ ٲ ؤ ا ٮ ب پ ت ث ٹ ج چ ح خ د ذ ڈ ر ز ڑ ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن ں ھ ہ و ۄ ی ۍ ے", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "ksb": { - 0: "a b c d e f g h i j k l m n o p s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q r x", - 5: "A B C D E F G H I J K L M N O P S T U V W Y Z", - }, - "ksf": { - 0: "a á b c d e é ǝ ǝ́ ɛ ɛ́ f g h i í j k l m n ŋ o ó ɔ ɔ́ p r s t u ú v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B C D E Ǝ Ɛ F G H I J K L M N Ŋ O Ɔ P R S T U V W Y Z", - }, - "ksh": { - 0: "a å ä æ b c d e ë ė f g h i j k l m n o ö œ p q r s ß t u ů ü v w x y z", - 2: "_ ‐ – — ⸗ , ; : ! ? . … ' ‘ ‚ \" “ „ ( ) [ ] { } § @ * / & # % † ‡ ° < = > ~ $", - 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē ğ í ì ĭ î ï ī ij ı ł ñ ó ò ŏ ô ö ø ō œ ú ù ŭ û ü ū ÿ", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "kw": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "ky": { - 0: "а б г д е ё ж з и й к л м н ӊ о ө п р с т у ү х ч ш ъ ы э ю я", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "в ф ц щ ь", - }, - "lag": { - 0: "a á b c d e é f g h i í ɨ j k l m n o ó p q r s t u ú ʉ v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I Ɨ J K L M N O P Q R S T U Ʉ V W X Y Z", - }, - "lg": { - 0: "a b c d e f g i j k l m n ny ŋ o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "h q x", - 5: "A B C D E F G I J K L M N Ŋ O P R S T U V W Y Z", - }, - "ln": { - 0: "a á â ǎ b c d e é ê ě ɛ ɛ́ ɛ̂ ɛ̌ f g gb h i í î ǐ k l m mb mp n nd ng nk ns nt ny nz o ó ô ǒ ɔ ɔ́ ɔ̂ ɔ̌ p r s t u ú v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "j q x", - 5: "A B C D E Ɛ F G Gb H I K L M Mb Mp N Nd Ng Nk Ns Nt Ny Nz O Ɔ P R S T U V W Y Z", - }, - "lo": { - 0: "່ ້ ໊ ໋ ໌ ໍ ໆ ກ ຂ ຄ ງ ຈ ສ ຊ ຍ ດ ຕ ຖ ທ ນ ບ ປ ຜ ຝ ພ ຟ ມ ຢ ຣ ລ ວ ຫ ໜ ໝ ອ ຮ ຯ ະ ັ າ ຳ ິ ີ ຶ ື ຸ ູ ົ ຼ ຽ ເ ແ ໂ ໃ ໄ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200b ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙", - }, - "lt": { - 0: "a ą b c č d e ę ė f g h i į y j k l m n o p r s š t u ų ū v z ž", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á à ã ą́ ą̃ é è ẽ ę́ ę̃ ė́ ė̃ i̇́ í i̇̀ ì i̇̃ ĩ į́ į̇́ į̃ į̇̃ j̃ j̇̃ l̃ m̃ ñ ó ò õ q r̃ ú ù ũ ų́ ų̃ ū́ ū̃ w x", - 5: "A Ą B C Č D E Ę Ė F G H I Į Y J K L M N O P R S Š T U Ų Ū V Z Ž", - }, - "lu": { - 0: "a á à b c d e é è ɛ ɛ́ ɛ̀ f h i í ì j k l m n ng ny o ó ò ɔ ɔ́ ɔ̀ p ph q s shi t u ú ù v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "g r x", - 5: "A B C D E F H I J K L M N O P Q S T U V W Y Z", - }, - "luo": { - 0: "a b c d e f g h i j k l m n o p r s t u v w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x z", - 5: "A B C D E F G H I J K L M N O P R S T U V W Y", - }, - "luy": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "lv": { - 0: "a ā b c č d e ē f g ģ h i ī j k ķ l ļ m n ņ o p r s š t u ū v z ž", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ ‚ \" “ ” „ ( ) [ ] § @ * / & # † ‡ ′ ″", - 3: "q w x y", - 5: "A B C Č D E F G Ģ H I J K Ķ L Ļ M N Ņ O P Q R S Š T U V W X Y Z Ž", - }, - "mas": { - 0: "a á à â ā b c d e é è ê ē ɛ g h i í ì î ī ɨ j k l m n ny ŋ o ó ò ô ō ɔ p r rr s sh t u ú ù û ū ʉ ʉ́ w wu y yi", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "f q v x z", - 5: "A B C D E Ɛ G H I Ɨ J K L M N Ŋ O Ɔ P R S T U Ʉ W Y", - }, - "mer": { - 0: "a b c d e f g h i ĩ j k l m n o p q r s t u ũ v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "mfe": { - 0: "a b c d e f g h i j k l m n o p r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P R S T U V W X Y Z", - }, - "mg": { - 0: "a à â b d e é è ê ë f g h i ì î ï j k l m n ñ o ô p r s t v y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c q u w x", - 5: "A B D E F G H I J K L M N O P R S T V Y Z", - }, - "mgh": { - 0: "a b c d e f g h i j k l m n o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", - }, - "mgo": { - 0: "a à b ch d e è ə ə̀ f g gh i ì j k m n ŋ o ò ɔ ɔ̀ p r s t u ù w y z ʼ", - 2: ", ; : ! ? . ' ‘ ’ \" “ ”", - 3: "c h l q v x", - 5: "A B CH D E Ə F G GH I J K M N Ŋ O Ɔ P R S T U W Y Z ʼ", - }, - "mk": { - 0: "а б в г д ѓ е ж з ѕ и ј к л љ м н њ о п р с т ќ у ф х ц ч џ ш", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "ѐ ѝ", - 5: "А Б В Г Д Ѓ Е Ж З Ѕ И Ј К Л Љ М Н Њ О П Р С Т Ќ У Ф Х Ц Ч Џ Ш", - }, - "ml": { - 0: "\u200c \u200d ഃ അ ആ ഇ ഈ ഉ ഊ ഋ ൠ ഌ ൡ എ ഏ ഐ ഒ ഓ ഔ ക ൿ ഖ ഗ ഘ ങ ച ഛ ജ ഝ ഞ ട ഠ ഡ ഢ ണ ൺ ത ഥ ദ ധ ന ൻ പ ഫ ബ ഭ മ ം യ ര ർ ല ൽ വ ശ ഷ സ ഹ ള ൾ ഴ റ ാ ി ീ ു ൂ ൃ െ േ ൈ ൊ ോ ൗ ൌ ്", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d", - }, - "mn": { - 0: "а б в г д е ё ж з и й к л м н о ө п р с т у ү ф х ц ч ш щ ъ ы ь э ю я", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", - 3: "ә җ ӊ һ", - }, - "mr": { - 0: "़ ० १ २ ३ ४ ५ ६ ७ ८ ९ ॐ ं ँ ः अ आ इ ई उ ऊ ऋ ऌ ऍ ए ऐ ऑ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल व श ष स ह ळ ऽ ा ि ी ु ू ृ ॄ ॅ े ै ॉ ो ौ ्", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d", - 5: "\u200d ॐ ं ः अ आ इ ई उ ऊ ऋ ऌ ए ऐ ऑ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल व श ष स ह ळ ऽ ॅ ्", - }, - "ms": { - 0: "a ai au b c d dz e f g h i j k kh l m n ng ngg ny o p q r s sy t ts u ua v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "mt": { - 0: "a à b ċ d e è f ġ g għ h ħ i ì j k l m n o ò p q r s t u ù v w x ż z", - 2: "- , ; : ! ? . ' ‘ ’ \" “ ” ( ) [ ] { }", - 3: "c y", - }, - "mua": { - 0: "a ã b ɓ c d ɗ e ë ǝ f g h i ĩ j k l m n ŋ o õ p r s t u v ṽ w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B Ɓ C D Ɗ E Ǝ F G H I J K L M N Ŋ O P R S T U V W Y Z", - }, - "my": { - 0: "က ခ ဂ ဃ င စ ဆ ဇ ဈ ဉ ည ဋ ဌ ဍ ဎ ဏ တ ထ ဒ ဓ န ပ ဖ ဗ ဘ မ ယ ရ လ ဝ သ ဟ ဠ အ ဣ ဤ ဥ ဦ ဧ ဩ ဪ ာ ါ ိ ီ ု ူ ေ ဲ ံ ဿ ျ ြ ွ ှ ္ ် ့ း", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "ၐ ၑ ဨ ဢ ၒ ၓ ၔ ၕ ၖ ၗ ၘ ၙ", - }, - "naq": { - 0: "a â b c d e f g h i î k m n o ô p q r s t u û w x y z ǀ ǁ ǂ ǃ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "j l v", - 5: "A B C D E F G H I K M N O P Q R S T U W X Y Z", - }, - "nb": { - 0: "a à b c d e é f g h i j k l m n o ó ò ô p q r s t u v w x y z æ ø å", - 2: "- – , ; : ! ? . ' \" « » ( ) [ ] { } § @ * / \\", - 3: "á ǎ ã č ç đ è ê í ń ñ ŋ š ŧ ü ž ä ö", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Æ Ø Å", - }, - "nd": { - 0: "a b c d e f g h i j k l m n o p q s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "r", - 5: "A B C D E F G H I J K L M N O P Q S T U V W X Y Z", - }, - "ne": { - 0: "़ ँ ं ः ॐ अ आ इ ई उ ऊ ऋ ऌ ऍ ए ऐ ऑ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल ळ व श ष स ह ऽ ा ि ी ु ू ृ ॄ ॅ े ै ॉ ो ौ ्", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d", - }, - "nl": { - 0: "a á ä b c d e é ë f g h i í ï ij j k l m n o ó ö p q r s t u ú ü v w x y z", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", - 3: "à â å ã æ ç è ê î ñ ô ø œ ù û ÿ", - }, - "nmg": { - 0: "a á ă â ä ā b ɓ c d e é ĕ ê ē ǝ ǝ́ ǝ̆ ǝ̂ ǝ̄ ɛ ɛ́ ɛ̆ ɛ̂ ɛ̄ f g h i í ĭ î ï ī j k l m n ń ŋ o ó ŏ ô ö ō ɔ ɔ́ ɔ̆ ɔ̂ ɔ̄ p r ŕ s t u ú ŭ û ū v w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x z", - 5: "A B Ɓ C D E Ǝ Ɛ F G H I J K L M N Ŋ O Ɔ P R S T U V W Y", - }, - "nn": { - 0: "a à b c d e é f g h i j k l m n o ó ò ô p q r s t u v w x y z æ ø å", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á ǎ č ç đ è ê ń ñ ŋ š ŧ ü ž ä ö", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Æ Ø Å", - }, - "nnh": { - 0: "a á à â ǎ b c d e é è ê ě ɛ ɛ́ ɛ̀ ɛ̂ ɛ̌ f g h i í ì j k l m n ŋ o ó ò ô ǒ ɔ ɔ́ ɔ̀ ɔ̂ ɔ̌ p pf s sh t ts u ú ù û ǔ ʉ ʉ́ ʉ̀ ʉ̂ ʉ̌ v w ẅ y ÿ z ʼ", - 2: ", ; : ! ? . ' ‘ ’ « »", - 3: "q r x", - 5: "A B C D E Ɛ F G H I J K L M N Ŋ O Ɔ P Pf R S Sh T Ts U Ʉ V W Ẅ Y Ÿ Z ʼ", - }, - "nr": { - 0: "a b c d e f g h i j k l m n o p q s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "r", - }, - "nso": { - 0: "a b d e ê f g h i j k l m n o ô p r s š t u w x y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c q v z", - }, - "nus": { - 0: "a ä a̱ b c d e ë e̱ ɛ ɛ̈ ɛ̱ ɛ̱̈ f g ɣ h i ï i̱ j k l m n ŋ o ö o̱ ɔ ɔ̈ ɔ̱ p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E Ɛ F G Ɣ H I J K L M N Ŋ O Ɔ P Q R S T U V W X Y Z", - }, - "nyn": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "om": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "or": { - 0: "଼ ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଏ ଐ ଓ ଔ ଁ ଂ ଃ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ ଡ଼ ଢ ଢ଼ ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯ ୟ ର ଲ ଳ ଵ ୱ ଶ ଷ ସ ହ ା ି ୀ ୁ ୂ ୃ େ ୈ ୋ ୌ ୍", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d", - }, - "os": { - 0: "а ӕ б в г гъ д дж дз е ё ж з и й к къ л м н о п пъ р с т тъ у ф х хъ ц цъ ч чъ ш щ ъ ы ь э ю я", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ‚ \" “ „ « » ( ) [ ] { } § @ * / & #", - 5: "А Ӕ Б В Г Гъ Д Дж Дз Е Ё Ж З И Й К Къ Л М Н О П Пъ Р С Т Тъ У Ф Х Хъ Ц Цъ Ч Чъ Ш Щ Ы Э Ю Я", - }, - "pa": { - 0: "ੱ ੰ ਼ ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੴ ੳ ਉ ਊ ਓ ਅ ਆ ਐ ਔ ੲ ਇ ਈ ਏ ਸ ਸ਼ ਹ ਕ ਖ ਖ਼ ਗ ਗ਼ ਘ ਙ ਚ ਛ ਜ ਜ਼ ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ ਫ਼ ਬ ਭ ਮ ਯ ਰ ਲ ਵ ੜ ੍ ਾ ਿ ੀ ੁ ੂ ੇ ੈ ੋ ੌ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d ਃ ਂ ਁ ਲ਼", - }, - "pa-Arab": { - 0: "ُ ء آ ؤ ئ ا ب پ ت ث ٹ ج چ ح خ د ذ ڈ ر ز ڑ ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن ں ه ھ ہ و ی ے", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "أ ٻ ة ٺ ټ ٽ", - }, - "pl": { - 0: "a ą b c ć d e ę f g h i j k l ł m n ń o ó p r s ś t u w y z ź ż", - 2: "- ‐ – — , ; : ! ? . … ' \" ” „ « » ( ) [ ] { } § @ * / & # % † ‡ ′ ″ ° ~", - 3: "à â å ä æ ç é è ê ë î ï ô ö œ q ß ù û ü v x ÿ", - }, - "ps": { - 0: "َ ِ ُ ً ٍ ٌ ّ ْ ٔ ٰ آ ا أ ء ب پ ت ټ ث ج ځ چ څ ح خ د ډ ذ ر ړ ز ژ ږ س ش ښ ص ض ط ظ ع غ ف ق ک ګ ل م ن ڼ ه ة و ؤ ی ي ې ۍ ئ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d", - }, - "pt": { - 0: "a á à â ã b c ç d e é ê f g h i í j k l m n o ó ò ô õ p q r s t u ú v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "ª ă å ä ā æ è ĕ ë ē ì ĭ î ï ī ñ º ŏ ö ø ō œ ù ŭ û ü ū ÿ", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "rm": { - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "rn": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "ro": { - 0: "a ă â b c d e f g h i î j k l m n o p r s ș t ț u v x z", - 2: "- ‐ – — , ; : ! ? . … ' ‘ \" “ ” „ « » ( ) [ ] @ * /", - 3: "á à å ä ç é è ê ë ñ ö q ş ţ ü w y", - 5: "A Ă Â B C D E F G H I Î J K L M N O P Q R S Ș T Ț U V W X Y Z", - }, - "rof": { - 0: "a b c d e f g h i j k l m n o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", - }, - "und": { - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "ru": { - 0: "а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ‚ \" “ „ « » ( ) [ ] { } § @ * / & #", - 3: "а́ е́ и́ о́ у́ ы́ э́ ю́ я́", - 5: "А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я", - }, - "rw": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "rwk": { - 0: "a b c d e f g h i j k l m n o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", - }, - "sah": { - 0: "а б г ҕ д дь и й к л м н нь ҥ о ө п р с т у ү х һ ч ы э", - 3: "в е ё ж з ф ц ш щ ъ ь ю я", - 5: "А Б Г Ҕ Д Дь И Й К Л М Н Нь Ҥ О Ө П Р С Т У Ү Х Һ Ч Ы Э", - }, - "saq": { - 0: "a b c d e g h i j k l m n o p r s t u v w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "f q x z", - 5: "A B C D E G H I J K L M N O P R S T U V W Y", - }, - "sbp": { - 0: "a b c d e f g h i j k l m n o p s t u v w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q r x z", - 5: "A B C D E F G H I J K L M N O P S T U V W Y", - }, - "se": { - 0: "a á b c č d đ e f g h i j k l m n ŋ o p r s š t ŧ u v z ž", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "à å ä ã æ ç é è í ń ñ ó ò ö ø q ú ü w x y", - }, - "seh": { - 0: "a á à â ã b c ç d e é ê f g h i í j k l m n o ó ò ô õ p q r s t u ú v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "ses": { - 0: "a ã b c d e ẽ f g h i j k l m n ɲ ŋ o õ p q r s š t u w x y z ž", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "v", - 5: "A à B C D E Ẽ F G H I J K L M N Ɲ Ŋ O Õ P Q R S Š T U W X Y Z Ž", - }, - "sg": { - 0: "a â ä b d e ê ë f g h i î ï j k l m n o ô ö p r s t u ù û ü v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c q x", - 5: "A B D E F G H I J K L M N O P R S T U V W Y Z", - }, - "shi": { - 0: "ⴰ ⴱ ⴳ ⴳⵯ ⴷ ⴹ ⴻ ⴼ ⴽ ⴽⵯ ⵀ ⵃ ⵄ ⵅ ⵇ ⵉ ⵊ ⵍ ⵎ ⵏ ⵓ ⵔ ⵕ ⵖ ⵙ ⵚ ⵛ ⵜ ⵟ ⵡ ⵢ ⵣ ⵥ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "ⴰ ⴱ ⴳ ⴷ ⴹ ⴻ ⴼ ⴽ ⵀ ⵃ ⵄ ⵅ ⵇ ⵉ ⵊ ⵍ ⵎ ⵏ ⵓ ⵔ ⵕ ⵖ ⵙ ⵚ ⵛ ⵜ ⵟ ⵡ ⵢ ⵣ ⵥ", - }, - "shi-Latn": { - 0: "a b c d ḍ e ɛ f g gʷ ɣ h ḥ i j k kʷ l m n q r ṛ s ṣ t ṭ u w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "o p v", - 5: "A B C D Ḍ E Ɛ F G Gʷ Ɣ H Ḥ I J K Kʷ L M N Q R Ṛ S Ṣ T Ṭ U W X Y Z", - }, - "si": { - 0: "අ ආ ඇ ඈ ඉ ඊ උ ඌ ඍ එ ඒ ඓ ඔ ඕ ඖ ං ඃ ක ඛ ග ඝ ඞ ඟ ච ඡ ජ ඣ ඥ ඤ ට ඨ ඩ ඪ ණ ඬ ත ථ ද ධ න ඳ ප ඵ බ භ ම ඹ ය ර ල ව ශ ෂ ස හ ළ ෆ ා ැ ෑ ි ී ු ූ ෘ ෲ ෟ ෙ ේ ෛ ො ෝ ෞ ්", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200b \u200c \u200d ඎ ඏ ඐ ඦ ෳ", - 5: "අ ආ ඇ ඈ ඉ ඊ උ ඌ ඍ එ ඒ ඓ ඔ ඕ ඖ ක ඛ ග ඝ ඞ ඟ ච ඡ ජ ඣ ඥ ඤ ට ඨ ඩ ඪ ණ ඬ ත ථ ද ධ න ඳ ප ඵ බ භ ම ඹ ය ර ල ව ශ ෂ ස හ ළ ෆ", - }, - "sk": { - 0: "a á ä b c č d ď e é f g h ch i í j k l ĺ ľ m n ň o ó ô p q r ŕ s š t ť u ú v w x y ý z ž", - 2: "- ‐ – , ; : ! ? . … ‘ ‚ “ „ ( ) [ ] § @ * / &", - }, - "sl": { - 0: "a b c č d e f g h i j k l m n o p r s š t u v z ž", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á à ă â å ä ā æ ç ć đ é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ q ú ù ŭ û ü ū w x y ÿ", - 5: "A B C Č Ć D Đ E F G H I J K L M N O P Q R S Š T U V W X Y Z Ž", - }, - "sn": { - 0: "a b c d e f g h i j k l m n o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", - }, - "so": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "sq": { - 0: "a b c ç d dh e ë f g gj h i j k l ll m n nj o p q r rr s sh t th u v x xh y z zh", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "w", - }, - "sr": { - 0: "а б в г д ђ е ж з и ј к л љ м н њ о п р с т ћ у ф х ц ч џ ш", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "ё й щ ъ ы ь э ю я", - }, - "sr-Latn": { - 0: "a b c č ć d dž đ e f g h i j k l lj m n nj o p r s š t u v z ž", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "å q w x y", - }, - "ss": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "ssy": { - 0: "a b t s e c k x i d q r f g o l m n u w h y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "j p v z", - 5: "A B T S E C K X I D Q R F G O L M N U W H Y", - }, - "st": { - 0: "a b d e f g h i j k l m n o p q r s t u w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c v x z", - }, - "sv": { - 0: "a à b c d e é f g h i j k l m n o p q r s t u v w x y z å ä ö", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", - 3: "á â ã ā ç ë í î ï ī ñ ó ú ÿ ü æ ø", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Å Ä Ö", - }, - "sv-FI": { - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", - 3: "ã ç ë í ñ ó š ÿ ü ž", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Å Ä Ö", - }, - "sw": { - 0: "a b ch d e f g h i j k l m n o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c q x", - }, - "swc": { - 0: "a b c d e f g h i j k l m n o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", - }, - "ta": { - 0: "அ ஆ இ ஈ உ ஊ எ ஏ ஐ ஒ ஓ ஔ ஃ க ங ச ஞ ட ண த ந ப ம ய ர ல வ ழ ள ற ன ஜ ஷ ஸ ஹ ா ி ீ ு ூ ெ ே ை ொ ோ ௌ ்", - 3: "\u200c \u200d", - }, - "te": { - 0: "అ ఆ ఇ ఈ ఉ ఊ ఋ ౠ ఌ ౡ ఎ ఏ ఐ ఒ ఓ ఔ ఁ ం ః క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల వ శ ష స హ ళ ా ి ీ ు ూ ృ ౄ ె ే ై ొ ో ౌ ్ ౕ ౖ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯", - 5: "అ ఆ ఇ ఈ ఉ ఊ ఋ ౠ ఎ ఏ ఐ ఒ ఓ ఔ క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల వ శ ష స హ ళ", - }, - "teo": { - 0: "a b c d e g h i j k l m n o p r s t u v w x y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "f q z", - 5: "A B C D E G H I J K L M N O P R S T U V W X Y", - }, - "tg": { - 0: "а б в г ғ д е ё ж з и ӣ й к қ л м н о п р с т у ӯ ф х ҳ ч ҷ ш ъ э ю я", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "ц щ ы ь", - }, - "th": { - 0: "ฯ ๆ ๎ ์ ็ ่ ้ ๊ ๋ ก ข ฃ ค ฅ ฆ ง จ ฉ ช ซ ฌ ญ ฎ ฏ ฐ ฑ ฒ ณ ด ต ถ ท ธ น บ ป ผ ฝ พ ฟ ภ ม ย ร ฤ ล ฦ ว ศ ษ ส ห ฬ อ ฮ ํ ะ ั า ๅ ำ ิ ี ึ ื ุ ู เ แ โ ใ ไ ฺ", - 2: "! \" # ' ( ) * , - . / : @ [ \\ ] ‐ – — ‘ ’ “ ” … ′ ″", - 3: "\u200b", - }, - "ti": { - 0: "፟ ሀ ሀ ሁ ሂ ሃ ሄ ህ ሆ ለ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ሠ ሡ ሢ ሣ ሤ ሥ ሦ ሧ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቈ ቊ ቊ ቋ ቌ ቍ ቐ ቐ ቑ ቒ ቓ ቔ ቕ ቖ ቘ ቚ ቚ ቛ ቜ ቝ በ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኈ ኊ ኊ ኋ ኌ ኍ ነ ነ ኑ ኒ ና ኔ ን ኖ ኗ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ከ ኩ ኪ ካ ኬ ክ ኮ ኰ ኲ ኲ ኳ ኴ ኵ ኸ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ዀ ዂ ዂ ዃ ዄ ዅ ወ ወ ዉ ዊ ዋ ዌ ው ዎ ዐ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ደ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ጀ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ገ ጉ ጊ ጋ ጌ ግ ጎ ጐ ጒ ጒ ጓ ጔ ጕ ጠ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ጰ ጱ ጲ ጳ ጴ ጵ ጶ ጷ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፀ ፁ ፂ ፃ ፄ ፅ ፆ ፇ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "᎐ ᎐ ᎑ ᎒ ᎓ ᎔ ᎕ ᎖ ᎗ ᎘ ᎙ ሇ ⶀ ᎀ ᎀ ᎁ ᎂ ᎃ ⶁ ⶁ ⶂ ⶃ ⶄ ቇ ᎄ ᎄ ᎅ ᎆ ᎇ ⶅ ⶅ ⶆ ⶇ ኇ ⶈ ⶈ ⶉ ⶊ ኯ ዏ ⶋ ዯ ⶌ ዸ ዸ ዹ ዺ ዻ ዼ ዽ ዾ ዿ ⶍ ⶎ ጏ ጘ ጘ ጙ ጚ ጛ ጜ ጝ ጞ ጟ ⶓ ⶓ ⶔ ⶕ ⶖ ⶏ ⶏ ⶐ ⶑ ፇ ᎈ ᎈ ᎉ ᎊ ᎋ ᎌ ᎍ ᎎ ᎏ ⶒ ፘ ፘ ፙ ፚ ⶠ ⶠ ⶡ ⶢ ⶣ ⶤ ⶥ ⶦ ⶨ ⶨ ⶩ ⶪ ⶫ ⶬ ⶭ ⶮ ⶰ ⶰ ⶱ ⶲ ⶳ ⶴ ⶵ ⶶ ⶸ ⶸ ⶹ ⶺ ⶻ ⶼ ⶽ ⶾ ⷀ ⷀ ⷁ ⷂ ⷃ ⷄ ⷅ ⷆ ⷈ ⷈ ⷉ ⷊ ⷋ ⷌ ⷍ ⷎ ⷐ ⷐ ⷑ ⷒ ⷓ ⷔ ⷕ ⷖ ⷘ ⷘ ⷙ ⷚ ⷛ ⷜ ⷝ ⷞ", - 5: "ሀ ለ ሐ መ ሠ ረ ሰ ሸ ቀ ቈ ቐ ቘ በ ቨ ተ ቸ ኀ ኈ ነ ኘ አ ከ ኰ ኸ ዀ ወ ዐ ዘ ዠ የ ደ ጀ ገ ጐ ጠ ጨ ጰ ጸ ፀ ፈ ፐ", - }, - "ti-ER": { - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "tig": { - 0: "፟ ፡ ፣ ፣ ፤ ፥ ፦ ፧ ። ፠ ፨ ᎐ ᎐ ᎑ ᎒ ᎓ ᎔ ᎕ ᎖ ᎗ ᎘ ᎙ ፲ ፲ ፳ ፴ ፵ ፶ ፷ ፸ ፹ ፺ ፻ ፼ ፩ ፩ ፪ ፫ ፬ ፭ ፮ ፯ ፰ ፱ ሀ ሀ ሁ ሂ ሃ ሄ ህ ሆ ሇ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ⶀ ሐ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ᎀ ᎀ ᎁ ᎂ ᎃ ⶁ ሠ ሠ ሡ ሢ ሣ ሤ ሥ ሦ ሧ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ⶂ ሰ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ⶃ ሸ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ⶄ ቀ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቇ ቈ ቊ ቊ ቋ ቌ ቍ ቐ ቐ ቑ ቒ ቓ ቔ ቕ ቖ ቘ ቚ ቚ ቛ ቜ ቝ በ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ᎄ ᎄ ᎅ ᎆ ᎇ ⶅ ቨ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ⶆ ቸ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ⶇ ኀ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኇ ኈ ኊ ኊ ኋ ኌ ኍ ነ ነ ኑ ኒ ና ኔ ን ኖ ኗ ⶈ ኘ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ ⶉ አ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ⶊ ከ ከ ኩ ኪ ካ ኬ ክ ኮ ኯ ኰ ኲ ኲ ኳ ኴ ኵ ኸ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ዀ ዂ ዂ ዃ ዄ ዅ ወ ወ ዉ ዊ ዋ ዌ ው ዎ ዏ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ⶋ ዠ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ዯ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ⶌ ዸ ዸ ዹ ዺ ዻ ዼ ዽ ዾ ዿ ⶍ ጀ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ⶎ ገ ገ ጉ ጊ ጋ ጌ ግ ጎ ጏ ጐ ጒ ጒ ጓ ጔ ጕ ጘ ጘ ጙ ጚ ጛ ጜ ጝ ጞ ጟ ⶓ ⶓ ⶔ ⶕ ⶖ ጠ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ⶏ ጨ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ⶐ ጰ ጰ ጱ ጲ ጳ ጴ ጵ ጶ ጷ ⶑ ጸ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፀ ፁ ፂ ፃ ፄ ፅ ፆ ፇ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ᎈ ᎈ ᎉ ᎊ ᎋ ፐ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ ᎌ ᎌ ᎍ ᎎ ᎏ ⶒ ፘ ፘ ፙ ፚ ⶠ ⶠ ⶡ ⶢ ⶣ ⶤ ⶥ ⶦ ⶨ ⶨ ⶩ ⶪ ⶫ ⶬ ⶭ ⶮ ⶰ ⶰ ⶱ ⶲ ⶳ ⶴ ⶵ ⶶ ⶸ ⶸ ⶹ ⶺ ⶻ ⶼ ⶽ ⶾ ⷀ ⷀ ⷁ ⷂ ⷃ ⷄ ⷅ ⷆ ⷈ ⷈ ⷉ ⷊ ⷋ ⷌ ⷍ ⷎ ⷐ ⷐ ⷑ ⷒ ⷓ ⷔ ⷕ ⷖ ⷘ ⷘ ⷙ ⷚ ⷛ ⷜ ⷝ ⷞ", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "tn": { - 0: "a b d e ê f g h i j k l m n o ô p r s t u w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c q v x z", - }, - "to": { - 0: "a á ā e é ē f h i í ī k l m n ng o ó ō p s t u ú ū v ʻ", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "à ă â å ä æ b c ç d è ĕ ê ë g ì ĭ î ï j ñ ò ŏ ô ö ø œ q r ù ŭ û ü w x y ÿ z", - 5: "A E F H I K L M N NG O P S T U V ʻ", - }, - "tr": { - 0: "a b c ç d e f g ğ h ı i İ j k l m n o ö p r s ş t u ü v y z", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", - 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ø ō œ ö q ß ú ù ŭ û ū ü w x ÿ", - 5: "A B C Ç D E F G H I İ J K L M N O Ö P Q R S Ş T U Ü V W X Y Z", - }, - "ts": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "twq": { - 0: "a ã b c d e ẽ f g h i j k l m n ɲ ŋ o õ p q r s š t u w x y z ž", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "v", - }, - "tzm": { - 0: "a b c d ḍ e ɛ f g gʷ ɣ h ḥ i j k kʷ l m n q r ṛ s ṣ t ṭ u w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "o p v", - 5: "A B C D Ḍ E Ɛ F G Ɣ H Ḥ I J K L M N Q R Ṛ S Ṣ T Ṭ U W X Y Z", - }, - "uk": { - 0: "ʼ а б в г ґ д е є ж з и і ї й к л м н о п р с т у ф х ц ч ш щ ь ю я", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "ё ъ ы э", - 5: "А Б В Г Ґ Д Е Є Ж З И І Ї Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ю Я", - }, - "ur": { - 0: "ا أ آ ب پ ت ٹ ث ج چ ح خ د ڈ ذ ر ڑ ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن ں و ؤ ہ ۂ ھ ء ی ئ ے ة ه", - 2: "، ؍ ٫ ٬ ؛ : ؟ . ۔ ( ) [ ]", - 3: "\u0600 \u0601 \u0602 \u0603 \u200c \u200d \u200e \u200f ْ َ ِ ُ ٰ ٖ ٗ ً ٍ ٌ ٔ ّ ٘ ۃ ٻ ٺ ټ ٽ ي", - 5: "ا ب پ ت ٹ ث ج چ ح خ د ڈ ذ ر ڑ ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ہ ھ ء ی ے", - }, - "uz": { - 0: "а б в г ғ д е ё ж з и й к қ л м н о п р с т у ў ф х ҳ ч ш ъ э ю я", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "ц щ ы ь", - }, - "uz-Arab": { - 0: "ً ٌ ٍ َ ُ ِ ّ ْ ٔ ٰ ء آ أ ؤ ئ ا ب پ ة ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن ه و ۇ ۉ ی", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "\u200c \u200d ټ ځ څ ډ ړ ږ ښ ګ ڼ ي ۍ ې", - }, - "uz-Latn": { - 0: "a aʼ b ch d e eʼ f g gʻ h i iʼ j k l m n o oʻ p q r s sh t u uʼ v x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c w", - 5: "A B CH D E F G Gʻ H I J K L M N O Oʻ P Q R S SH T U V X Y Z", - }, - "vai": { - 0: "꘠ ꘠ ꘡ ꘢ ꘣ ꘤ ꘥ ꘦ ꘧ ꘨ ꘩ ꔀ ꔀ ꔁ ꔂ ꔃ ꔄ ꔅ ꔆ ꔇ ꔈ ꔉ ꔊ ꔋ ꔌ ꘓ ꔍ ꔍ ꔎ ꔏ ꔐ ꔑ ꔒ ꔓ ꔔ ꔕ ꔖ ꔗ ꔘ ꔙ ꔚ ꔛ ꔜ ꔝ ꔞ ꘔ ꔟ ꔟ ꔠ ꔡ ꔢ ꔣ ꔤ ꔥ ꔦ ꔧ ꔨ ꔩ ꔪ ꔫ ꔬ ꔭ ꔮ ꔯ ꔰ ꔱ ꔲ ꔳ ꘕ ꔴ ꔴ ꔵ ꔶ ꔷ ꔸ ꔹ ꔺ ꔻ ꔼ ꔽ ꔾ ꔿ ꕀ ꕁ ꕂ ꕃ ꕄ ꕅ ꕆ ꕇ ꘖ ꕈ ꕈ ꕉ ꕊ ꕋ ꕌ ꕍ ꕎ ꕏ ꕐ ꕑ ꕒ ꘗ ꕓ ꕓ ꕔ ꕕ ꕖ ꕗ ꕘ ꘐ ꘘ ꕙ ꕚ ꘙ ꕛ ꕛ ꕜ ꕝ ꕞ ꕟ ꕠ ꘚ ꕡ ꕡ ꕢ ꕣ ꕤ ꕥ ꕦ ꕧ ꕨ ꕩ ꕪ ꘑ ꕫ ꕫ ꕬ ꕭ ꕮ ꘪ ꕯ ꕯ ꕰ ꕱ ꕲ ꕳ ꕴ ꕵ ꕶ ꕷ ꕸ ꕹ ꕺ ꕻ ꕼ ꕽ ꕾ ꕿ ꖀ ꖁ ꖂ ꖃ ꖄ ꖅ ꘛ ꖆ ꖇ ꘒ ꖈ ꖈ ꖉ ꖊ ꖋ ꖌ ꖍ ꖎ ꖏ ꖐ ꖑ ꖒ ꖓ ꖔ ꖕ ꖖ ꖗ ꖘ ꖙ ꖚ ꖛ ꖜ ꖝ ꖞ ꖟ ꖠ ꖡ ꖢ ꖣ ꖤ ꖥ ꖦ ꖧ ꖨ ꖩ ꖪ ꖫ ꖬ ꖭ ꖮ ꖯ ꖰ ꖱ ꖲ ꖳ ꖴ ꘜ ꖵ ꖵ ꖶ ꖷ ꖸ ꖹ ꖺ ꖻ ꖼ ꖽ ꖾ ꖿ ꗀ ꗁ ꗂ ꗃ ꗄ ꗅ ꗆ ꗇ ꗈ ꗉ ꗊ ꗋ ꘝ ꗌ ꗌ ꗍ ꗎ ꗏ ꗐ ꗑ ꘫ ꘞ ꗒ ꗒ ꗓ ꗔ ꗕ ꗖ ꗗ ꗘ ꘟ ꗙ ꗙ ꗚ ꗛ ꗜ ꗝ ꗞ ꗟ ꗠ ꗡ ꗢ ꗣ ꗤ ꗥ ꗦ ꗧ ꗨ ꗩ ꗪ ꗫ ꗬ ꗭ ꗮ ꗯ ꗰ ꗱ ꗲ ꗳ ꗴ ꗵ ꗶ ꗷ ꗸ ꗹ ꗺ ꗻ ꗼ ꗽ ꗾ ꗿ ꘀ ꘁ ꘂ ꘃ ꘄ ꘅ ꘆ ꘇ ꘈ ꘉ ꘊ ꘋ ꘌ", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "vai-Latn": { - 0: "a á ã b ɓ c d ɗ e é ẽ ɛ ɛ́ ɛ̃ f g h i í ĩ j k l m n ŋ o ó õ ɔ ɔ́ ɔ̃ p q r s t u ú ũ v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B Ɓ C D Ɗ E Ɛ F G H I J K L M N Ŋ O Ɔ P Q R S T U V W X Y Z", - }, - "ve": { - 0: "a b d ḓ e f g h i k l ḽ m n ṅ ṋ o p r s t ṱ u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "vi": { - 0: "a à ả ã á ạ ă ằ ẳ ẵ ắ ặ â ầ ẩ ẫ ấ ậ b c d đ e è ẻ ẽ é ẹ ê ề ể ễ ế ệ f g h i ì ỉ ĩ í ị j k l m n o ò ỏ õ ó ọ ô ồ ổ ỗ ố ộ ơ ờ ở ỡ ớ ợ p q r s t u ù ủ ũ ú ụ ư ừ ử ữ ứ ự v w x y ỳ ỷ ỹ ý ỵ z", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "vo": { - 0: "a ä b c d e f g h i j k l m n o ö p q r s š t u ü v x y z", - 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” « » ( ) [ ] { } § @ * / & #", - 3: "q w", - 5: "A Ä B C D E F G H I J K L M N O Ö P R S T U Ü V X Y Z", - }, - "vun": { - 0: "a b c d e f g h i j k l m n o p r s t u v w y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "q x", - 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", - }, - "wae": { - 0: "a á ä ã b c č d e é f g h i í j k l m n o ó ö õ p q r s š t u ú ü ũ v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "à ă â å ā æ ç è ĕ ê ë ē ì ĭ î ï ī ñ ò ŏ ô ø ō œ ß ù ŭ û ū ÿ", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "wal": { - 0: "፟ ᎐ ᎐ ᎑ ᎒ ᎓ ᎔ ᎕ ᎖ ᎗ ᎘ ᎙ ሀ ሀ ሁ ሂ ሃ ሄ ህ ሆ ሇ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ⶀ ሐ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ᎀ ᎀ ᎁ ᎂ ᎃ ⶁ ሠ ሠ ሡ ሢ ሣ ሤ ሥ ሦ ሧ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ⶂ ሰ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ⶃ ሸ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ⶄ ቀ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቇ ቈ ቊ ቊ ቋ ቌ ቍ ቐ ቐ ቑ ቒ ቓ ቔ ቕ ቖ ቘ ቚ ቚ ቛ ቜ ቝ በ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ᎄ ᎄ ᎅ ᎆ ᎇ ⶅ ቨ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ⶆ ቸ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ⶇ ኀ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኇ ኈ ኊ ኊ ኋ ኌ ኍ ነ ነ ኑ ኒ ና ኔ ን ኖ ኗ ⶈ ኘ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ ⶉ አ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ⶊ ከ ከ ኩ ኪ ካ ኬ ክ ኮ ኯ ኰ ኲ ኲ ኳ ኴ ኵ ኸ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ዀ ዂ ዂ ዃ ዄ ዅ ወ ወ ዉ ዊ ዋ ዌ ው ዎ ዏ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ⶋ ዠ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ዯ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ⶌ ዸ ዸ ዹ ዺ ዻ ዼ ዽ ዾ ዿ ⶍ ጀ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ⶎ ገ ገ ጉ ጊ ጋ ጌ ግ ጎ ጏ ጐ ጒ ጒ ጓ ጔ ጕ ጘ ጘ ጙ ጚ ጛ ጜ ጝ ጞ ጟ ⶓ ⶓ ⶔ ⶕ ⶖ ጠ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ⶏ ጨ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ⶐ ጰ ጰ ጱ ጲ ጳ ጴ ጵ ጶ ጷ ⶑ ጸ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፀ ፁ ፂ ፃ ፄ ፅ ፆ ፇ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ᎈ ᎈ ᎉ ᎊ ᎋ ፐ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ ᎌ ᎌ ᎍ ᎎ ᎏ ⶒ ፘ ፘ ፙ ፚ ⶠ ⶠ ⶡ ⶢ ⶣ ⶤ ⶥ ⶦ ⶨ ⶨ ⶩ ⶪ ⶫ ⶬ ⶭ ⶮ ⶰ ⶰ ⶱ ⶲ ⶳ ⶴ ⶵ ⶶ ⶸ ⶸ ⶹ ⶺ ⶻ ⶼ ⶽ ⶾ ⷀ ⷀ ⷁ ⷂ ⷃ ⷄ ⷅ ⷆ ⷈ ⷈ ⷉ ⷊ ⷋ ⷌ ⷍ ⷎ ⷐ ⷐ ⷑ ⷒ ⷓ ⷔ ⷕ ⷖ ⷘ ⷘ ⷙ ⷚ ⷛ ⷜ ⷝ ⷞ", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "xh": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - }, - "xog": { - 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "yav": { - 0: "a á à â ǎ ā b c d e é è ɛ ɛ́ ɛ̀ f h i í ì î ī k l m mb n ny ŋ ŋg o ó ò ô ǒ ō ɔ ɔ́ ɔ̀ p s t u ú ù û ǔ ū v w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "g j q r x z", - 5: "A B C D E Ɛ F H I K L M N Ŋ O Ɔ P S T U V W Y", - }, - "yo": { - 0: "a á à b d e é è ẹ ẹ́ ẹ̀ f g gb h i í ì j k l m n o ó ò ọ ọ́ ọ̀ p r s ṣ t u ú ù w y", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "c q v x z", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "zh": { - 0: "一 丁 七 万 万 丈 三 上 下 丌 不 与 丑 专 且 世 丘 丘 丙 业 东 丝 丢 两 严 丧 个 中 丰 串 临 丸 丸 丹 为 主 丽 举 乃 久 么 义 之 之 乌 乍 乎 乏 乐 乔 乖 乘 乙 九 也 也 习 乡 书 买 乱 乾 了 予 争 事 二 于 亏 云 互 五 井 亚 些 亡 交 交 亥 亦 产 亨 享 京 亮 亲 人 亿 亿 什 仁 仅 仇 今 介 仍 从 仔 他 付 仙 代 代 令 以 仪 们 仰 仲 件 价 任 份 仿 企 伊 伍 伏 伏 伐 休 众 众 优 伙 会 伟 传 伤 伦 伯 估 伴 伸 似 伽 但 位 位 低 住 佐 佑 体 何 余 佛 作 你 佤 佩 佳 使 例 供 依 侠 侦 侦 侧 侨 侬 侯 侵 便 促 俄 俊 俗 保 信 俩 修 俱 俾 倍 倒 候 倚 借 倦 值 倾 假 偌 偏 做 停 健 偶 偷 储 催 傲 傻 像 僧 儒 儿 允 元 元 兄 充 先 光 克 免 兑 兔 党 入 全 八 八 公 六 兮 兰 共 关 关 兴 兵 其 具 典 兹 养 养 兼 兽 内 冈 册 再 冒 写 军 农 冠 冬 冰 冲 决 况 冷 准 凌 减 凝 几 凡 凤 凭 凯 凰 出 击 函 刀 分 切 刊 刑 划 列 列 刘 则 刚 创 初 判 利 别 到 制 制 刷 券 刺 刻 剂 前 剑 剧 剩 剪 副 割 力 劝 劝 办 功 加 务 劣 动 动 助 努 劫 励 励 劲 劳 势 勇 勉 勋 勒 勤 勾 勿 包 匆 匈 化 北 匙 匹 匹 区 医 十 千 升 午 半 华 协 卒 卓 单 单 卖 南 博 占 占 卡 卢 卫 卯 卯 印 危 即 却 卷 厂 厄 厄 厅 历 厉 压 压 厌 厍 厚 原 去 县 参 又 又 叉 及 友 双 反 发 叔 取 取 受 变 叙 口 口 古 句 另 只 只 叫 召 叭 可 台 史 右 叶 叶 号 司 叹 吃 各 合 合 吉 吊 同 同 名 后 吐 向 吓 吗 君 吝 吟 否 吧 含 听 启 吵 吸 吹 吻 吾 呀 呆 呈 告 呐 员 呜 呢 呦 周 味 呵 呼 命 和 咖 咦 咦 咧 咨 咪 咬 咯 咱 哀 品 哇 哇 哈 哉 响 哎 哟 哥 哦 哩 哪 哭 哲 唉 唐 唤 唬 售 唯 唱 唷 商 啊 啡 啥 啦 啪 喀 喂 善 喇 喊 喏 喔 喜 喝 喵 喷 喻 嗒 嗨 嗯 嘉 嘛 嘴 嘻 嘿 器 四 回 因 团 园 困 围 固 国 图 圆 圈 土 圣 在 圭 地 圳 场 圾 址 均 坎 坐 坑 块 坚 坚 坛 坜 坡 坤 坦 坪 垂 垃 型 垒 埃 埋 城 埔 域 培 基 堂 堆 堕 堡 堪 塑 塔 塞 填 境 增 墨 壁 壤 士 壬 壮 声 处 备 复 夏 夕 外 多 夜 够 夥 大 天 天 太 夫 央 失 头 夷 夷 夸 夹 夺 奇 奇 奈 奉 奋 奏 契 奔 奖 套 奥 女 奴 奶 她 好 如 妇 妈 妖 妙 妥 妨 妮 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娄 娘 娜 娟 娱 婆 婚 媒 嫁 嫌 嫩 子 孔 孕 字 字 存 孙 孜 孝 孟 季 孤 学 孩 宁 它 宇 宇 守 安 宋 完 宏 宗 宗 官 宙 定 宛 宜 宝 实 审 审 客 宣 室 宪 害 宴 家 容 宽 宽 宾 宿 寂 寄 寄 寅 密 寇 富 寒 寝 寝 寞 察 寡 寨 寸 对 寻 导 寿 封 射 将 尊 小 少 尔 尖 尘 尚 尝 尤 就 尺 尼 尼 尽 尾 局 局 屁 层 居 屋 屏 展 属 屠 山 岁 岂 岗 岘 岚 岛 岳 岸 峡 峰 崇 崩 崴 川 州 巡 工 工 左 巧 巨 巫 差 己 己 已 巳 巴 巷 币 币 市 布 帅 师 希 帐 帕 帖 帝 带 席 帮 常 帽 幅 幕 干 干 平 年 并 幸 幻 幻 幼 幽 广 庆 床 序 库 库 应 底 店 庙 庚 府 庞 废 度 座 庭 康 庸 廉 廖 延 廷 建 开 异 异 弃 弄 弊 式 引 弗 弘 弟 张 弥 弦 弯 弱 弹 强 归 当 录 彝 形 彩 彬 彭 彰 影 彷 役 彻 彼 往 征 径 待 很 律 後 徐 徒 得 循 微 徵 德 心 必 忆 忌 忍 志 志 忘 忙 忠 忧 快 念 忽 怀 态 怎 怒 怕 怖 思 怡 急 性 怨 怪 总 恋 恐 恢 恨 恩 恭 息 恰 恶 恼 悄 悉 悔 悟 悠 患 您 悲 情 惑 惜 惠 惧 惨 惯 想 惹 愁 愈 愉 意 愚 感 愧 慈 慎 慕 慢 慧 慰 憾 懂 懒 戈 戊 戌 戏 戏 成 我 戒 或 战 截 戴 户 房 房 所 扁 扇 手 才 扎 扑 打 托 扣 执 扩 扫 扫 扬 扭 扮 扯 批 找 找 承 技 抄 把 抑 抓 投 抗 折 抢 护 报 披 抬 抱 抵 抹 抽 担 拆 拉 拍 拒 拔 拖 拘 招 拜 拟 拥 拦 拨 择 括 拳 拷 拼 拾 拿 持 指 按 挑 挖 挝 挡 挤 挥 挪 振 挺 捉 捐 捕 损 捡 换 据 捷 授 掉 掌 排 探 接 控 控 推 掩 措 掸 描 提 插 握 援 搜 搞 搬 搭 摄 摆 摊 摔 摘 摩 摸 撒 撞 播 操 擎 擦 支 收 改 攻 放 政 故 效 敌 敏 救 教 敝 敢 散 敦 敬 数 敲 整 文 斋 斐 斗 料 斜 斥 断 斯 新 方 於 施 旁 旅 旋 族 旗 无 既 日 日 旦 旧 旨 早 旭 时 旺 昂 昆 昌 明 昏 易 星 映 春 昨 昭 是 显 晃 晋 晒 晓 晚 晨 普 景 晴 晶 智 暂 暑 暖 暗 暮 暴 曰 曲 更 曹 曼 曾 曾 替 最 月 有 朋 服 朗 望 朝 期 木 未 未 末 本 札 术 朱 朵 机 杀 杂 权 杉 李 材 村 杜 束 条 来 杨 杯 杰 松 板 极 构 析 林 果 枝 枢 枪 枫 架 柏 某 染 柔 查 柬 柯 柳 柴 标 栋 栏 树 校 样 样 核 根 格 桃 框 案 桌 桑 档 桥 梁 梅 梦 梯 械 梵 检 棉 棋 棒 棚 森 椅 植 椰 楚 楼 概 榜 模 樱 檀 欠 欠 次 欢 欣 欧 欲 欺 款 歉 歌 止 止 正 此 步 武 歪 死 殊 残 段 毅 母 每 毒 比 毕 毛 毫 氏 民 气 氛 水 永 求 汇 汉 汗 汝 江 江 池 污 汤 汪 汶 汽 沃 沈 沉 沙 沟 没 沧 河 油 治 沿 泉 泊 法 泛 泡 泡 波 泣 泥 注 泰 泳 泽 洋 洗 洛 洞 津 洪 洲 活 洽 派 流 浅 测 济 浏 浑 浓 浙 浦 浩 浪 浮 浴 海 涅 消 涉 涛 涨 涯 液 涵 淋 淑 淘 淡 深 混 添 清 渐 渡 渣 温 港 渴 游 湖 湾 源 溜 溪 滋 滑 满 滥 滨 滴 漂 漏 演 漠 漫 潘 潜 潮 澎 澳 激 灌 火 灭 灯 灰 灵 灿 炉 炎 炮 炸 点 烂 烈 烤 烦 烧 热 焦 然 煌 煞 照 煮 熊 熟 燃 燕 爆 爪 爬 爱 爵 爵 父 爷 爸 爽 片 版 牌 牙 牛 牡 牢 牧 物 牲 牵 特 牺 犯 状 犹 狂 狐 狗 狠 独 狮 狱 狼 猛 猜 猪 献 猴 玄 率 玉 王 玛 玩 玫 环 现 玲 玻 珀 珊 珍 珠 班 球 理 琊 琪 琳 琴 琼 瑙 瑜 瑞 瑟 瑰 瑶 璃 瓜 瓦 瓶 甘 甚 甜 生 用 田 田 由 甲 申 电 男 甸 画 畅 界 留 略 番 疆 疏 疑 疗 疯 疲 疼 疾 病 痕 痛 痴 癸 登 白 百 的 皆 皇 皮 盈 益 监 盒 盖 盘 盛 盟 目 直 相 盼 盾 省 眉 看 真 眠 眼 着 睛 睡 督 瞧 矛 矣 知 短 石 矶 码 砂 砍 研 破 础 硕 硬 确 碍 碎 碗 碟 碧 碰 磁 磅 磨 示 礼 社 祖 祚 祝 神 祥 票 祯 祸 禁 禅 福 离 秀 私 秋 种 科 秒 秘 租 秤 秦 秩 积 称 移 稀 程 稍 税 稣 稳 稿 穆 究 穷 穹 空 穿 突 窗 窝 立 站 竞 竞 竟 章 童 端 竹 笑 笔 笛 符 笨 第 等 筋 筑 答 策 筹 签 简 算 管 箭 箱 篇 篮 簿 籍 米 类 粉 粒 粗 粤 粹 精 糊 糕 糖 糟 系 素 索 紧 紫 累 繁 红 约 级 纪 纯 纲 纳 纵 纷 纸 纽 线 练 组 细 细 织 终 绍 经 结 绕 绘 给 络 绝 统 继 绩 绪 续 维 绵 综 绿 缅 缓 编 缘 缠 缩 缴 缶 缸 缺 罐 网 罕 罗 罚 罢 罪 置 署 羊 美 羞 群 羯 羽 翁 翅 翔 翘 翠 翰 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 职 联 聘 聚 聪 肉 肖 肚 股 肤 肥 肩 肯 育 胁 胆 背 胎 胖 胜 胞 胡 胶 胸 能 脆 脑 脱 脸 腊 腐 腓 腰 腹 腾 腿 臂 臣 自 臭 至 致 舌 舍 舒 舞 舟 航 般 舰 船 良 色 艺 艾 节 芒 芝 芦 芬 芭 花 芳 苍 苏 苗 若 苦 英 茂 范 茨 茫 茶 草 荐 荒 荣 药 荷 莉 莎 莪 莫 莱 莲 获 菜 菩 菲 萄 萍 萤 营 萧 萨 落 著 葛 葡 蒂 蒋 蒙 蓉 蓝 蓬 蔑 蔡 薄 薪 藉 藏 藤 虎 虑 虫 虹 虽 虾 蚁 蛇 蛋 蛙 蛮 蜂 蜜 蝶 融 蟹 蠢 血 行 街 衡 衣 补 表 袋 被 袭 裁 裂 装 裕 裤 西 要 覆 见 观 规 视 览 觉 角 解 言 誉 誓 警 计 订 认 讨 让 训 训 议 讯 记 讲 讷 许 论 设 访 证 评 识 诉 词 译 试 诗 诚 话 诞 询 该 详 语 误 说 请 诸 诺 读 课 谁 调 谅 谈 谊 谋 谓 谜 谢 谨 谱 谷 豆 象 豪 貌 贝 贝 贞 负 贡 贡 财 责 贤 败 货 货 质 贩 贪 购 贯 贱 贴 贵 贸 贸 费 贺 贼 贾 资 赋 赌 赏 赐 赔 赖 赚 赛 赞 赠 赢 赤 赫 走 赵 起 趁 超 越 趋 趣 足 跃 跌 跑 距 跟 路 跳 踏 踢 踩 身 躲 车 轨 轩 转 轮 轮 软 轰 轻 载 较 辅 辆 辈 辉 辑 输 辛 辞 辨 辩 辰 辱 边 达 迁 迅 过 迈 迎 运 近 返 还 这 进 进 远 违 连 迟 迦 迪 迫 述 迷 追 退 退 送 适 逃 逆 选 逊 透 逐 递 途 通 逛 逝 速 造 逢 逸 逻 逼 遇 遍 道 遗 遭 遮 遵 避 邀 邓 那 邦 邪 邮 邱 邻 郎 郑 部 郭 都 鄂 酉 酋 配 酒 酷 酸 醉 醒 采 释 里 里 重 野 量 金 针 钓 钟 钢 钦 钱 钻 铁 铃 铜 铢 铭 银 铺 链 销 锁 锅 锋 错 锡 锦 键 锺 镇 镜 镭 长 门 闪 闭 问 闰 闲 间 闷 闹 闻 阁 阅 阐 阔 队 阮 防 防 阳 阴 阵 阶 阻 阿 陀 附 附 际 陆 陈 降 限 院 除 险 陪 陵 陵 陶 陷 隆 随 隐 隔 障 难 雄 雄 雅 集 雉 雨 雪 雯 雳 零 雷 雾 需 震 霍 霖 露 霸 霹 青 靖 静 非 靠 面 革 靼 鞋 鞑 韦 韩 音 页 顶 项 项 顺 须 顽 顽 顾 顿 预 领 颇 频 颗 题 额 风 飘 飙 飞 食 餐 饭 饮 饰 饱 饼 馆 首 香 馨 马 驱 驶 驻 驾 验 骑 骗 骚 骤 骨 高 鬼 魂 魅 魔 鱼 鲁 鲜 鸟 鸡 鸣 鸭 鸿 鹅 鹤 鹰 鹿 麦 麻 黄 黎 黑 默 鼓 鼠 鼻 齐 齿 龄 龙 龟", - 2: "﹉ ﹉ ﹊ ﹋ ﹌ _ _ ﹍ ﹍ ﹎ ﹏ ︳ ︴ - - ﹣ ‐ – — ︱ ― , , ﹐ 、 ﹑ ; ; ﹔ : : ﹕ ! ! ﹗ ? ? ﹖ . . ﹒ ‥ ︰ … 。 · ' ‘ ’ \" " “ ” 〝 〞 ( ( ﹙ ︵ ) ) ﹚ ︶ [ [ ] ] { { ﹛ ︷ } } ﹜ ︸ 〈 ︿ 〉 ﹀ 《 ︽ 》 ︾ 「 ﹁ 」 ﹂ 『 ﹃ 』 ﹄ 【 ︻ 】 ︼ 〔 ﹝ ︹ 〕 ﹞ ︺ 〖 〗 ‖ § @ @ ﹫ * * ﹡ / / \\ \ ﹨ & & ﹠ # # ﹟ % % ﹪ ‰ ′ ″ ‵ 〃 ※", - 3: "侣 傣 卑 厘 吕 堤 奎 巽 撤 楔 楠 滕 瑚 甫 盲 禄 粟 脚 钯 铂 锑 镑 魁", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "zh-Hans-MO": { - 0: "一 丁 七 万 万 丈 三 上 下 丌 不 与 丑 专 且 世 丘 丘 丙 业 东 丝 丢 两 严 丧 个 中 丰 串 临 丸 丸 丹 为 主 丽 举 乃 久 么 义 之 之 乌 乍 乎 乏 乐 乔 乖 乘 乙 九 也 也 习 乡 书 买 乱 乾 了 予 争 事 二 于 亏 云 互 五 井 亚 些 亡 交 交 亥 亦 产 亨 享 京 亮 亲 人 亿 亿 什 仁 仅 仇 今 介 仍 从 仔 他 付 仙 代 代 令 以 仪 们 仰 仲 件 价 任 份 仿 企 伊 伍 伏 伏 伐 休 众 众 优 伙 会 伟 传 伤 伦 伯 估 伴 伸 似 伽 但 位 位 低 住 佐 佑 体 何 余 佛 作 你 佤 佩 佳 使 例 供 依 侠 侦 侦 侧 侨 侬 侯 侵 便 促 俄 俊 俗 保 信 俩 修 俱 俾 倍 倒 候 倚 借 倦 值 倾 假 偌 偏 做 停 健 偶 偷 储 催 傲 傻 像 僧 儒 儿 允 元 元 兄 充 先 光 克 免 兑 兔 党 入 全 八 八 公 六 兮 兰 共 关 关 兴 兵 其 具 典 兹 养 养 兼 兽 内 冈 册 再 冒 写 军 农 冠 冬 冰 冲 决 况 冷 准 凌 减 凝 几 凡 凤 凭 凯 凰 出 击 函 刀 分 切 刊 刑 划 列 列 刘 则 刚 创 初 判 利 别 到 制 制 刷 券 刺 刻 剂 前 剑 剧 剩 剪 副 割 力 劝 劝 办 功 加 务 劣 动 动 助 努 劫 励 励 劲 劳 势 勇 勉 勋 勒 勤 勾 勿 包 匆 匈 化 北 匙 匹 匹 区 医 十 千 升 午 半 华 协 卒 卓 单 单 卖 南 博 占 占 卡 卢 卫 卯 卯 印 危 即 却 卷 厂 厄 厄 厅 历 厉 压 压 厌 厍 厚 原 去 县 参 又 又 叉 及 友 双 反 发 叔 取 取 受 变 叙 口 口 古 句 另 只 只 叫 召 叭 可 台 史 右 叶 叶 号 司 叹 吃 各 合 合 吉 吊 同 同 名 后 吐 向 吓 吗 君 吝 吟 否 吧 含 听 启 吵 吸 吹 吻 吾 呀 呆 呈 告 呐 员 呜 呢 呦 周 味 呵 呼 命 和 咖 咦 咦 咧 咨 咪 咬 咯 咱 哀 品 哇 哇 哈 哉 响 哎 哟 哥 哦 哩 哪 哭 哲 唉 唐 唤 唬 售 唯 唱 唷 商 啊 啡 啥 啦 啪 喀 喂 善 喇 喊 喏 喔 喜 喝 喵 喷 喻 嗒 嗨 嗯 嘉 嘛 嘴 嘻 嘿 器 四 回 因 团 园 困 围 固 国 图 圆 圈 土 圣 在 圭 地 圳 场 圾 址 均 坎 坐 坑 块 坚 坚 坛 坜 坡 坤 坦 坪 垂 垃 型 垒 埃 埋 城 埔 域 培 基 堂 堆 堕 堡 堪 塑 塔 塞 填 境 增 墨 壁 壤 士 壬 壮 声 处 备 复 夏 夕 外 多 夜 够 夥 大 天 天 太 夫 央 失 头 夷 夷 夸 夹 夺 奇 奇 奈 奉 奋 奏 契 奔 奖 套 奥 女 奴 奶 她 好 如 妇 妈 妖 妙 妥 妨 妮 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娄 娘 娜 娟 娱 婆 婚 媒 嫁 嫌 嫩 子 孔 孕 字 字 存 孙 孜 孝 孟 季 孤 学 孩 宁 它 宇 宇 守 安 宋 完 宏 宗 宗 官 宙 定 宛 宜 宝 实 审 审 客 宣 室 宪 害 宴 家 容 宽 宽 宾 宿 寂 寄 寄 寅 密 寇 富 寒 寝 寝 寞 察 寡 寨 寸 对 寻 导 寿 封 射 将 尊 小 少 尔 尖 尘 尚 尝 尤 就 尺 尼 尼 尽 尾 局 局 屁 层 居 屋 屏 展 属 屠 山 岁 岂 岗 岘 岚 岛 岳 岸 峡 峰 崇 崩 崴 川 州 巡 工 工 左 巧 巨 巫 差 己 己 已 巳 巴 巷 币 币 市 布 帅 师 希 帐 帕 帖 帝 带 席 帮 常 帽 幅 幕 干 干 平 年 并 幸 幻 幻 幼 幽 广 庆 床 序 库 库 应 底 店 庙 庚 府 庞 废 度 座 庭 康 庸 廉 廖 延 廷 建 开 异 异 弃 弄 弊 式 引 弗 弘 弟 张 弥 弦 弯 弱 弹 强 归 当 录 彝 形 彩 彬 彭 彰 影 彷 役 彻 彼 往 征 径 待 很 律 後 徐 徒 得 循 微 徵 德 心 必 忆 忌 忍 志 志 忘 忙 忠 忧 快 念 忽 怀 态 怎 怒 怕 怖 思 怡 急 性 怨 怪 总 恋 恐 恢 恨 恩 恭 息 恰 恶 恼 悄 悉 悔 悟 悠 患 您 悲 情 惑 惜 惠 惧 惨 惯 想 惹 愁 愈 愉 意 愚 感 愧 慈 慎 慕 慢 慧 慰 憾 懂 懒 戈 戊 戌 戏 戏 成 我 戒 或 战 截 戴 户 房 房 所 扁 扇 手 才 扎 扑 打 托 扣 执 扩 扫 扫 扬 扭 扮 扯 批 找 找 承 技 抄 把 抑 抓 投 抗 折 抢 护 报 披 抬 抱 抵 抹 抽 担 拆 拉 拍 拒 拔 拖 拘 招 拜 拟 拥 拦 拨 择 括 拳 拷 拼 拾 拿 持 指 按 挑 挖 挝 挡 挤 挥 挪 振 挺 捉 捐 捕 损 捡 换 据 捷 授 掉 掌 排 探 接 控 控 推 掩 措 掸 描 提 插 握 援 搜 搞 搬 搭 摄 摆 摊 摔 摘 摩 摸 撒 撞 播 操 擎 擦 支 收 改 攻 放 政 故 效 敌 敏 救 教 敝 敢 散 敦 敬 数 敲 整 文 斋 斐 斗 料 斜 斥 断 斯 新 方 於 施 旁 旅 旋 族 旗 无 既 日 日 旦 旧 旨 早 旭 时 旺 昂 昆 昌 明 昏 易 星 映 春 昨 昭 是 显 晃 晋 晒 晓 晚 晨 普 景 晴 晶 智 暂 暑 暖 暗 暮 暴 曰 曲 更 曹 曼 曾 曾 替 最 月 有 朋 服 朗 望 朝 期 木 未 未 末 本 札 术 朱 朵 机 杀 杂 权 杉 李 材 村 杜 束 条 来 杨 杯 杰 松 板 极 构 析 林 果 枝 枢 枪 枫 架 柏 某 染 柔 查 柬 柯 柳 柴 标 栋 栏 树 校 样 样 核 根 格 桃 框 案 桌 桑 档 桥 梁 梅 梦 梯 械 梵 检 棉 棋 棒 棚 森 椅 植 椰 楚 楼 概 榜 模 樱 檀 欠 欠 次 欢 欣 欧 欲 欺 款 歉 歌 止 止 正 此 步 武 歪 死 殊 残 段 毅 母 每 毒 比 毕 毛 毫 氏 民 气 氛 水 永 求 汇 汉 汗 汝 江 江 池 污 汤 汪 汶 汽 沃 沈 沉 沙 沟 没 沧 河 油 治 沿 泉 泊 法 泛 泡 泡 波 泣 泥 注 泰 泳 泽 洋 洗 洛 洞 津 洪 洲 活 洽 派 流 浅 测 济 浏 浑 浓 浙 浦 浩 浪 浮 浴 海 涅 消 涉 涛 涨 涯 液 涵 淋 淑 淘 淡 深 混 添 清 渐 渡 渣 温 港 渴 游 湖 湾 源 溜 溪 滋 滑 满 滥 滨 滴 漂 漏 演 漠 漫 潘 潜 潮 澎 澳 激 灌 火 灭 灯 灰 灵 灿 炉 炎 炮 炸 点 烂 烈 烤 烦 烧 热 焦 然 煌 煞 照 煮 熊 熟 燃 燕 爆 爪 爬 爱 爵 爵 父 爷 爸 爽 片 版 牌 牙 牛 牡 牢 牧 物 牲 牵 特 牺 犯 状 犹 狂 狐 狗 狠 独 狮 狱 狼 猛 猜 猪 献 猴 玄 率 玉 王 玛 玩 玫 环 现 玲 玻 珀 珊 珍 珠 班 球 理 琊 琪 琳 琴 琼 瑙 瑜 瑞 瑟 瑰 瑶 璃 瓜 瓦 瓶 甘 甚 甜 生 用 田 田 由 甲 申 电 男 甸 画 畅 界 留 略 番 疆 疏 疑 疗 疯 疲 疼 疾 病 痕 痛 痴 癸 登 白 百 的 皆 皇 皮 盈 益 监 盒 盖 盘 盛 盟 目 直 相 盼 盾 省 眉 看 真 眠 眼 着 睛 睡 督 瞧 矛 矣 知 短 石 矶 码 砂 砍 研 破 础 硕 硬 确 碍 碎 碗 碟 碧 碰 磁 磅 磨 示 礼 社 祖 祚 祝 神 祥 票 祯 祸 禁 禅 福 离 秀 私 秋 种 科 秒 秘 租 秤 秦 秩 积 称 移 稀 程 稍 税 稣 稳 稿 穆 究 穷 穹 空 穿 突 窗 窝 立 站 竞 竞 竟 章 童 端 竹 笑 笔 笛 符 笨 第 等 筋 筑 答 策 筹 签 简 算 管 箭 箱 篇 篮 簿 籍 米 类 粉 粒 粗 粤 粹 精 糊 糕 糖 糟 系 素 索 紧 紫 累 繁 红 约 级 纪 纯 纲 纳 纵 纷 纸 纽 线 练 组 细 细 织 终 绍 经 结 绕 绘 给 络 绝 统 继 绩 绪 续 维 绵 综 绿 缅 缓 编 缘 缠 缩 缴 缶 缸 缺 罐 网 罕 罗 罚 罢 罪 置 署 羊 美 羞 群 羯 羽 翁 翅 翔 翘 翠 翰 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 职 联 聘 聚 聪 肉 肖 肚 股 肤 肥 肩 肯 育 胁 胆 背 胎 胖 胜 胞 胡 胶 胸 能 脆 脑 脱 脸 腊 腐 腓 腰 腹 腾 腿 臂 臣 自 臭 至 致 舌 舍 舒 舞 舟 航 般 舰 船 良 色 艺 艾 节 芒 芝 芦 芬 芭 花 芳 苍 苏 苗 若 苦 英 茂 范 茨 茫 茶 草 荐 荒 荣 药 荷 莉 莎 莪 莫 莱 莲 获 菜 菩 菲 萄 萍 萤 营 萧 萨 落 著 葛 葡 蒂 蒋 蒙 蓉 蓝 蓬 蔑 蔡 薄 薪 藉 藏 藤 虎 虑 虫 虹 虽 虾 蚁 蛇 蛋 蛙 蛮 蜂 蜜 蝶 融 蟹 蠢 血 行 街 衡 衣 补 表 袋 被 袭 裁 裂 装 裕 裤 西 要 覆 见 观 规 视 览 觉 角 解 言 誉 誓 警 计 订 认 讨 让 训 训 议 讯 记 讲 讷 许 论 设 访 证 评 识 诉 词 译 试 诗 诚 话 诞 询 该 详 语 误 说 请 诸 诺 读 课 谁 调 谅 谈 谊 谋 谓 谜 谢 谨 谱 谷 豆 象 豪 貌 贝 贝 贞 负 贡 贡 财 责 贤 败 货 货 质 贩 贪 购 贯 贱 贴 贵 贸 贸 费 贺 贼 贾 资 赋 赌 赏 赐 赔 赖 赚 赛 赞 赠 赢 赤 赫 走 赵 起 趁 超 越 趋 趣 足 跃 跌 跑 距 跟 路 跳 踏 踢 踩 身 躲 车 轨 轩 转 轮 轮 软 轰 轻 载 较 辅 辆 辈 辉 辑 输 辛 辞 辨 辩 辰 辱 边 达 迁 迅 过 迈 迎 运 近 返 还 这 进 进 远 违 连 迟 迦 迪 迫 述 迷 追 退 退 送 适 逃 逆 选 逊 透 逐 递 途 通 逛 逝 速 造 逢 逸 逻 逼 遇 遍 道 遗 遭 遮 遵 避 邀 邓 那 邦 邪 邮 邱 邻 郎 郑 部 郭 都 鄂 酉 酋 配 酒 酷 酸 醉 醒 采 释 里 里 重 野 量 金 针 钓 钟 钢 钦 钱 钻 铁 铃 铜 铢 铭 银 铺 链 销 锁 锅 锋 错 锡 锦 键 锺 镇 镜 镭 长 门 闪 闭 问 闰 闲 间 闷 闹 闻 阁 阅 阐 阔 队 阮 防 防 阳 阴 阵 阶 阻 阿 陀 附 附 际 陆 陈 降 限 院 除 险 陪 陵 陵 陶 陷 隆 随 隐 隔 障 难 雄 雄 雅 集 雉 雨 雪 雯 雳 零 雷 雾 需 震 霍 霖 露 霸 霹 青 靖 静 非 靠 面 革 靼 鞋 鞑 韦 韩 音 页 顶 项 项 顺 须 顽 顽 顾 顿 预 领 颇 频 颗 题 额 风 飘 飙 飞 食 餐 饭 饮 饰 饱 饼 馆 首 香 馨 马 驱 驶 驻 驾 验 骑 骗 骚 骤 骨 高 鬼 魂 魅 魔 鱼 鲁 鲜 鸟 鸡 鸣 鸭 鸿 鹅 鹤 鹰 鹿 麦 麻 黄 黎 黑 默 鼓 鼠 鼻 齐 齿 龄 龙 龟", - 3: "侣 傣 卑 厘 吕 堤 奎 巽 撤 楔 楠 滕 瑚 甫 盲 禄 粟 脚 钯 铂 锑 镑 魁", - 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", - }, - "zh-Hant": { - 0: "一 丁 七 丈 丈 三 上 下 丌 不 丑 且 世 丘 丙 丟 並 中 串 丸 丹 主 乃 久 么 之 乎 乏 乖 乘 乙 九 也 乾 亂 了 予 事 二 于 云 互 五 井 些 亞 亡 交 交 亥 亦 亨 享 京 亮 人 什 仁 仇 今 介 仍 仔 他 付 仙 代 代 令 以 仰 仲 件 任 份 企 伊 伍 伐 休 伙 伯 估 伴 伸 似 伽 但 佈 佉 位 位 低 住 佔 何 余 佛 作 你 佩 佳 使 來 例 供 依 侯 侵 便 係 係 促 俄 俊 俗 保 俠 信 修 俱 俾 個 倍 們 倒 候 倚 借 倫 值 假 偉 偏 做 停 健 側 側 偵 偶 偷 傑 備 傢 傣 傲 傳 傷 傻 傾 僅 像 僑 僧 價 儀 億 儒 儘 優 允 元 元 兄 充 兇 兇 先 光 克 免 兒 兔 入 內 內 全 兩 八 八 公 六 兮 共 兵 兵 其 具 典 兼 冊 再 冒 冠 冬 冰 冷 准 凌 凝 凡 凰 凱 出 函 刀 分 切 刊 列 初 判 別 利 刪 到 制 刷 刺 刻 則 剌 前 剛 剩 剪 副 割 創 劃 劇 劉 劍 力 功 加 助 助 努 劫 勁 勇 勉 勒 動 務 勝 勞 勢 勤 勵 勸 勿 包 匈 化 北 匹 區 十 千 升 午 半 卒 卒 卓 協 南 博 卜 卡 卯 卯 印 危 即 卷 卻 厄 厘 厚 原 厭 厲 去 參 又 及 友 反 叔 取 受 口 口 古 句 另 只 只 叫 召 叭 可 台 史 右 司 吃 各 合 合 吉 吊 同 同 名 后 吐 吐 向 吒 君 吝 吝 吞 吟 吠 否 吧 含 吳 吵 吸 吹 吾 呀 呂 呆 告 呢 周 味 呵 呼 命 和 咖 咦 咧 咪 咬 咱 哀 品 哇 哇 哈 哉 哎 員 哥 哦 哩 哪 哭 哲 唉 唐 唔 唬 售 唯 唱 唷 唸 商 啊 問 啟 啡 啥 啦 啪 喀 喂 善 喇 喊 喔 喜 喝 喬 單 喵 嗎 嗚 嗨 嗯 嘆 嘉 嘗 嘛 嘴 嘻 嘿 器 噴 嚇 嚴 囉 四 回 因 困 固 圈 國 圍 園 圓 圖 團 圜 土 在 圭 地 圾 址 均 坎 坐 坡 坤 坦 坪 垂 垃 型 埃 城 埔 域 執 培 基 堂 堅 堆 堡 堪 報 場 塊 塔 塗 塞 填 塵 境 增 墨 墮 壁 壇 壓 壘 壞 壢 士 壬 壯 壽 夏 夕 外 多 夜 夠 夢 夥 大 天 天 太 夫 央 失 夷 夸 夾 奇 奇 奈 奉 奎 奏 契 奔 套 奧 奪 奮 女 奴 奶 她 好 如 妙 妝 妥 妨 妮 妳 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娘 娛 婁 婆 婚 婦 媒 媽 嫌 嫩 子 孔 字 存 孝 孟 季 孤 孩 孫 學 它 宅 宇 宇 守 安 宋 完 宏 宗 宗 官 宙 定 宛 宜 客 客 宣 室 宮 害 家 容 宿 寂 寄 寄 寅 密 富 寒 寞 察 寢 實 實 寧 寨 審 寫 寬 寮 寵 寶 封 射 將 專 尊 尋 對 對 導 小 少 尖 尚 尤 就 尺 尼 尾 局 屁 居 屆 屋 屏 展 屠 層 屬 山 岡 岩 岸 峰 島 峽 崇 崙 崴 嵐 嶺 川 州 巡 工 工 左 巧 巨 巫 差 己 己 已 巳 巴 巷 市 布 希 帕 帖 帛 帝 帥 師 席 帳 帶 常 帽 幅 幕 幣 幫 干 干 平 年 幸 幹 幻 幻 幼 幽 幾 庇 床 序 底 店 庚 府 度 座 庫 庭 康 庸 廉 廖 廠 廢 廣 廳 延 廷 建 弄 式 引 弗 弘 弟 弦 弱 張 強 彈 彊 彌 彎 彝 彞 形 彥 彩 彬 彭 彰 影 役 彼 往 征 待 很 律 後 徐 徐 徑 徒 得 從 復 微 徵 德 徹 心 必 忌 忍 志 志 忘 忙 忠 快 念 忽 怎 怒 怕 怖 思 怡 急 性 怨 怪 恆 恐 恢 恥 恨 恩 恭 息 恰 悅 悉 悔 悟 悠 您 悲 悶 情 惑 惜 惠 惡 惱 想 惹 愁 愈 愉 意 愚 愛 感 慈 態 慕 慘 慢 慣 慧 慮 慰 慶 慾 憂 憐 憑 憲 憶 憾 懂 應 懶 懷 懼 戀 戈 戊 戌 成 成 我 戒 或 截 戰 戲 戴 戶 房 房 所 扁 扇 手 才 扎 打 托 扣 扥 扭 扯 批 找 找 承 技 抄 把 抓 投 抗 折 披 抬 抱 抵 抹 抽 拆 拉 拋 拍 拏 拒 拔 拖 招 拜 括 拳 拼 拾 拿 持 指 按 挑 挖 挪 振 挺 捐 捕 捨 捲 捷 掃 授 掉 掌 排 掛 採 探 接 控 推 措 描 提 插 揚 換 握 揮 援 損 搖 搜 搞 搬 搭 搶 摘 摩 摸 撐 撒 撞 撣 撥 播 撾 撿 擁 擇 擊 擋 操 擎 擔 據 擠 擦 擬 擴 擺 擾 攝 支 收 改 攻 放 政 故 效 敍 敏 救 敗 敗 敘 教 敝 敢 散 敦 敬 整 敵 數 文 斐 斗 料 斯 新 斷 方 於 施 旁 旅 旋 族 旗 既 日 旦 早 旭 旺 昂 昆 昇 昌 明 昏 易 星 映 春 昨 昭 是 時 晉 晒 晚 晨 普 景 晴 晶 智 暑 暖 暗 暫 暴 曆 曉 曰 曲 更 書 曼 曾 曾 替 最 會 月 有 朋 服 朗 望 朝 期 木 未 未 末 本 札 朱 朵 杉 李 材 村 杜 束 杯 杯 杰 東 松 板 析 林 果 枝 架 柏 某 染 柔 查 柬 柯 柳 柴 校 核 根 格 桃 案 桌 桑 梁 梅 條 梨 梯 械 梵 棄 棉 棋 棒 棚 森 椅 植 椰 楊 楓 楚 業 極 概 榜 榮 構 槍 樂 樓 標 樞 模 樣 樹 橋 機 橫 檀 檔 檢 欄 權 次 欣 欲 欺 欽 款 歉 歌 歐 歡 歡 止 正 此 步 武 歲 歷 歸 死 殊 殘 段 殺 殼 毀 毅 母 每 毒 比 毛 毫 氏 民 氣 水 永 求 汗 汝 江 江 池 污 汪 汶 決 汽 沃 沈 沉 沒 沖 沙 河 油 治 沿 況 泉 泊 法 泡 波 泥 注 泰 泳 洋 洗 洛 洞 洩 洪 洲 活 洽 派 流 浦 浩 浪 浮 海 涇 涇 消 涉 涯 液 涵 涼 淑 淚 淡 淨 深 混 淺 清 減 渡 測 港 游 湖 湯 源 準 溝 溪 溫 滄 滅 滋 滑 滴 滾 滿 漂 漏 演 漠 漢 漫 漲 漸 潔 潘 潛 潮 澤 澳 激 濃 濟 濤 濫 濱 瀏 灌 灣 火 灰 災 炎 炮 炸 為 烈 烏 烤 無 焦 然 煙 煞 照 煩 熊 熟 熱 燃 燈 燒 營 爆 爐 爛 爪 爬 爭 爵 父 爸 爺 爽 爾 牆 牆 片 版 牌 牙 牛 牠 牧 物 牲 特 牽 犧 犯 狀 狂 狐 狗 狠 狼 猛 猜 猴 猶 獄 獅 獎 獨 獲 獸 獻 玄 率 玉 王 玩 玫 玲 玻 珊 珍 珠 珥 班 現 球 理 琉 琪 琴 瑙 瑜 瑞 瑟 瑤 瑪 瑰 環 瓜 瓦 瓶 甘 甚 甜 生 產 用 田 田 由 甲 申 男 甸 界 留 畢 略 番 畫 異 當 疆 疏 疑 疼 病 痕 痛 痴 瘋 療 癡 癸 登 登 發 白 百 的 皆 皇 皮 盃 益 盛 盜 盟 盡 監 盤 盧 目 盲 直 相 盼 盾 省 眉 看 真 眠 眼 眾 睛 睡 督 瞧 瞭 矛 矣 知 短 石 砂 砍 研 砲 破 硬 碎 碗 碟 碧 碩 碰 確 碼 磁 磨 磯 礎 礙 示 社 祕 祖 祚 祛 祝 神 祥 票 祿 禁 禍 禍 禎 福 禪 禮 秀 私 秋 科 秒 秘 租 秤 秦 移 稅 程 稍 種 稱 稿 穆 穌 積 穩 究 穹 空 穿 突 窗 窩 窮 窶 立 站 竟 章 童 端 競 竹 笑 笛 符 笨 第 筆 等 筋 答 策 简 算 管 箭 箱 節 範 篇 築 簡 簫 簽 簿 籃 籌 籍 籤 米 粉 粗 粵 精 糊 糕 糟 系 糾 紀 約 紅 納 紐 純 紙 紙 級 紛 素 索 紫 累 細 紹 終 組 結 絕 絡 給 統 絲 經 綜 綠 維 綱 網 緊 緒 線 緣 編 緩 緬 緯 練 縛 縣 縮 縱 總 績 繁 繆 織 繞 繪 繳 繼 續 缸 缺 罕 罪 置 罰 署 罵 罷 羅 羊 美 羞 群 義 羽 翁 習 翔 翰 翹 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 聖 聚 聞 聯 聰 聲 職 聽 肉 肚 股 肥 肩 肯 育 背 胎 胖 胞 胡 胸 能 脆 脫 腓 腔 腦 腰 腳 腿 膽 臉 臘 臣 臥 臨 自 臭 至 致 臺 與 與 興 舉 舊 舌 舍 舒 舞 舟 航 般 船 艦 良 色 艾 芝 芬 花 芳 若 苦 英 茅 茫 茲 茶 草 荒 荷 荼 莉 莊 莎 莫 菜 菩 華 菲 萄 萊 萬 落 葉 著 葛 葡 蒂 蒙 蒲 蒼 蓋 蓮 蔕 蔡 蔣 蕭 薄 薦 薩 薪 藉 藍 藏 藝 藤 藥 蘆 蘇 蘭 虎 處 虛 號 虧 蛇 蛋 蛙 蜂 蜜 蝶 融 螢 蟲 蟹 蠍 蠻 血 行 術 街 衛 衝 衡 衣 表 袋 被 裁 裂 裕 補 裝 裡 製 複 褲 西 要 覆 見 規 視 親 覺 覽 觀 角 解 觸 言 訂 計 訊 討 訓 託 記 訥 訪 設 許 訴 註 証 評 詞 詢 試 詩 話 話 該 詳 誇 誌 認 誓 誕 語 誠 誤 說 誰 課 誼 調 談 請 諒 論 諸 諺 諾 謀 謂 講 謝 證 識 譜 警 譯 議 護 譽 讀 變 讓 讚 谷 豆 豈 豐 象 豪 豬 貌 貓 貝 貞 負 負 財 貢 貨 貪 貪 貫 責 貴 買 費 貼 賀 資 賈 賓 賜 賞 賢 賢 賣 賤 賦 質 賭 賴 賺 購 賽 贈 贊 贏 赤 赫 走 起 超 越 趕 趙 趣 趨 足 跌 跎 跑 距 跟 跡 路 跳 踏 踢 蹟 蹤 躍 身 躲 車 軌 軍 軒 軟 較 載 輔 輕 輛 輝 輩 輪 輯 輸 轉 轟 辛 辦 辨 辭 辯 辯 辰 辱 農 迅 迎 近 返 迦 迪 迫 述 迴 迷 追 退 送 逃 逆 透 逐 途 這 這 通 逛 逝 速 造 逢 連 週 進 逸 逼 遇 遊 運 遍 過 道 道 達 違 遙 遜 遠 適 遭 遮 遲 遷 選 遺 避 避 邀 邁 還 邊 邏 那 邦 邪 邱 郎 部 郭 郵 都 鄂 鄉 鄭 鄰 酉 配 酒 酷 酸 醉 醒 醜 醫 采 釋 釋 里 重 野 量 金 針 釣 鈴 鉢 銀 銅 銖 銘 銳 銷 鋒 鋼 錄 錢 錦 錫 錯 鍋 鍵 鍾 鎊 鎖 鎮 鏡 鐘 鐵 鑑 長 門 閃 閉 開 閏 閒 間 閣 閱 闆 闊 闍 闐 關 闡 防 阻 阿 陀 附 降 限 院 院 陣 除 陪 陰 陳 陵 陵 陶 陷 陸 陽 隆 隊 階 隔 際 障 隨 險 隱 隻 雄 雄 雅 集 雉 雖 雙 雜 雞 離 難 雨 雪 雲 零 雷 電 需 震 霍 霧 露 霸 霹 靂 靈 青 靖 靜 非 靠 面 革 靼 鞋 韃 韋 韓 音 韻 響 頁 頂 項 順 須 預 頑 頓 頗 領 頞 頭 頻 顆 題 額 顏 願 類 顧 顯 風 飄 飛 食 飯 飲 飽 飾 餅 養 餐 餘 館 首 香 馬 駐 駕 駛 騎 騙 騷 驅 驗 驚 骨 體 高 髮 鬆 鬥 鬧 鬱 鬼 魁 魂 魅 魔 魚 魯 鮮 鳥 鳳 鳴 鴻 鵝 鷹 鹿 麗 麥 麵 麻 麼 黃 黎 黑 默 點 黨 鼓 鼠 鼻 齊 齋 齒 齡 龍 龜", - 2: "‾ ﹉ ﹉ ﹊ ﹋ ﹌ _ _ ﹍ ﹍ ﹎ ﹏ ︳ ︴ - - ﹣ ‐ – ︲ — ﹘ ︱ , , ﹐ 、 ﹑ ; ; ﹔ : : ﹕ ! ! ﹗ ? ? ﹖ . . ﹒ ‥ ︰ … 。 · ' ‘ ’ \" " “ ” 〝 〞 ( ( ﹙ ︵ ) ) ﹚ ︶ [ [ ] ] { { ﹛ ︷ } } ﹜ ︸ 〈 ︿ 〉 ﹀ 《 ︽ 》 ︾ 「 ﹁ 」 ﹂ 『 ﹃ 』 ﹄ 【 ︻ 】 ︼ 〔 ﹝ ︹ 〕 ﹞ ︺ § @ @ ﹫ * * ﹡ / / \\ \ ﹨ & & ﹠ # # ﹟ % % ﹪ ‰ † ‡ ‧ ′ ″ ‵ 〃 ※", - 3: "伏 侶 兌 兹 别 勳 卑 占 叶 堤 墎 奥 孜 峇 巽 彝 楔 渾 燦 狄 琳 瑚 甫 礁 芒 苗 茨 蚩 蜀 隴", - 5: "一 丁 丈 不 且 丞 並 串 乘 乾 亂 亭 傀 僎 僵 儐 償 儳 儷 儻 叢 嚴 囌 囑 廳", - }, - "zh-Hant-HK": { - 0: "一 丁 七 丈 丈 三 上 下 丌 不 丑 且 世 丘 丙 丟 並 中 串 丸 丹 主 乃 久 么 之 乎 乏 乖 乘 乙 九 也 乾 亂 了 予 事 二 于 云 互 五 井 些 亞 亡 交 交 亥 亦 亨 享 京 亮 人 什 仁 仇 今 介 仍 仔 他 付 仙 代 代 令 以 仰 仲 件 任 份 企 伊 伍 伐 休 伙 伯 估 伴 伸 似 伽 但 佈 佉 位 位 低 住 佔 何 余 佛 作 你 佩 佳 使 來 例 供 依 侯 侵 便 係 係 促 俄 俊 俗 保 俠 信 修 俱 俾 個 倍 們 倒 候 倚 借 倫 值 假 偉 偏 做 停 健 側 側 偵 偶 偷 傑 備 傢 傣 傲 傳 傷 傻 傾 僅 像 僑 僧 價 儀 億 儒 儘 優 允 元 元 兄 充 兇 兇 先 光 克 免 兒 兔 入 內 內 全 兩 八 八 公 六 兮 共 兵 兵 其 具 典 兼 冊 再 冒 冠 冬 冰 冷 准 凌 凝 凡 凰 凱 出 函 刀 分 切 刊 列 初 判 別 利 刪 到 制 刷 刺 刻 則 剌 前 剛 剩 剪 副 割 創 劃 劇 劉 劍 力 功 加 助 助 努 劫 勁 勇 勉 勒 動 務 勝 勞 勢 勤 勵 勸 勿 包 匈 化 北 匹 區 十 千 升 午 半 卒 卒 卓 協 南 博 卜 卡 卯 卯 印 危 即 卷 卻 厄 厘 厚 原 厭 厲 去 參 又 及 友 反 叔 取 受 口 口 古 句 另 只 只 叫 召 叭 可 台 史 右 司 吃 各 合 合 吉 吊 同 同 名 后 吐 吐 向 吒 君 吝 吝 吞 吟 吠 否 吧 含 吳 吵 吸 吹 吾 呀 呂 呆 告 呢 周 味 呵 呼 命 和 咖 咦 咧 咪 咬 咱 哀 品 哇 哇 哈 哉 哎 員 哥 哦 哩 哪 哭 哲 唉 唐 唔 唬 售 唯 唱 唷 唸 商 啊 問 啟 啡 啥 啦 啪 喀 喂 善 喇 喊 喔 喜 喝 喬 單 喵 嗎 嗚 嗨 嗯 嘆 嘉 嘗 嘛 嘴 嘻 嘿 器 噴 嚇 嚴 囉 四 回 因 困 固 圈 國 圍 園 圓 圖 團 圜 土 在 圭 地 圾 址 均 坎 坐 坡 坤 坦 坪 垂 垃 型 埃 城 埔 域 執 培 基 堂 堅 堆 堡 堪 報 場 塊 塔 塗 塞 填 塵 境 增 墨 墮 壁 壇 壓 壘 壞 壢 士 壬 壯 壽 夏 夕 外 多 夜 夠 夢 夥 大 天 天 太 夫 央 失 夷 夸 夾 奇 奇 奈 奉 奎 奏 契 奔 套 奧 奪 奮 女 奴 奶 她 好 如 妙 妝 妥 妨 妮 妳 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娘 娛 婁 婆 婚 婦 媒 媽 嫌 嫩 子 孔 字 存 孝 孟 季 孤 孩 孫 學 它 宅 宇 宇 守 安 宋 完 宏 宗 宗 官 宙 定 宛 宜 客 客 宣 室 宮 害 家 容 宿 寂 寄 寄 寅 密 富 寒 寞 察 寢 實 實 寧 寨 審 寫 寬 寮 寵 寶 封 射 將 專 尊 尋 對 對 導 小 少 尖 尚 尤 就 尺 尼 尾 局 屁 居 屆 屋 屏 展 屠 層 屬 山 岡 岩 岸 峰 島 峽 崇 崙 崴 嵐 嶺 川 州 巡 工 工 左 巧 巨 巫 差 己 己 已 巳 巴 巷 市 布 希 帕 帖 帛 帝 帥 師 席 帳 帶 常 帽 幅 幕 幣 幫 干 干 平 年 幸 幹 幻 幻 幼 幽 幾 庇 床 序 底 店 庚 府 度 座 庫 庭 康 庸 廉 廖 廠 廢 廣 廳 延 廷 建 弄 式 引 弗 弘 弟 弦 弱 張 強 彈 彊 彌 彎 彝 彞 形 彥 彩 彬 彭 彰 影 役 彼 往 征 待 很 律 後 徐 徐 徑 徒 得 從 復 微 徵 德 徹 心 必 忌 忍 志 志 忘 忙 忠 快 念 忽 怎 怒 怕 怖 思 怡 急 性 怨 怪 恆 恐 恢 恥 恨 恩 恭 息 恰 悅 悉 悔 悟 悠 您 悲 悶 情 惑 惜 惠 惡 惱 想 惹 愁 愈 愉 意 愚 愛 感 慈 態 慕 慘 慢 慣 慧 慮 慰 慶 慾 憂 憐 憑 憲 憶 憾 懂 應 懶 懷 懼 戀 戈 戊 戌 成 成 我 戒 或 截 戰 戲 戴 戶 房 房 所 扁 扇 手 才 扎 打 托 扣 扥 扭 扯 批 找 找 承 技 抄 把 抓 投 抗 折 披 抬 抱 抵 抹 抽 拆 拉 拋 拍 拏 拒 拔 拖 招 拜 括 拳 拼 拾 拿 持 指 按 挑 挖 挪 振 挺 捐 捕 捨 捲 捷 掃 授 掉 掌 排 掛 採 探 接 控 推 措 描 提 插 揚 換 握 揮 援 損 搖 搜 搞 搬 搭 搶 摘 摩 摸 撐 撒 撞 撣 撥 播 撾 撿 擁 擇 擊 擋 操 擎 擔 據 擠 擦 擬 擴 擺 擾 攝 支 收 改 攻 放 政 故 效 敍 敏 救 敗 敗 敘 教 敝 敢 散 敦 敬 整 敵 數 文 斐 斗 料 斯 新 斷 方 於 施 旁 旅 旋 族 旗 既 日 旦 早 旭 旺 昂 昆 昇 昌 明 昏 易 星 映 春 昨 昭 是 時 晉 晒 晚 晨 普 景 晴 晶 智 暑 暖 暗 暫 暴 曆 曉 曰 曲 更 書 曼 曾 曾 替 最 會 月 有 朋 服 朗 望 朝 期 木 未 未 末 本 札 朱 朵 杉 李 材 村 杜 束 杯 杯 杰 東 松 板 析 林 果 枝 架 柏 某 染 柔 查 柬 柯 柳 柴 校 核 根 格 桃 案 桌 桑 梁 梅 條 梨 梯 械 梵 棄 棉 棋 棒 棚 森 椅 植 椰 楊 楓 楚 業 極 概 榜 榮 構 槍 樂 樓 標 樞 模 樣 樹 橋 機 橫 檀 檔 檢 欄 權 次 欣 欲 欺 欽 款 歉 歌 歐 歡 歡 止 正 此 步 武 歲 歷 歸 死 殊 殘 段 殺 殼 毀 毅 母 每 毒 比 毛 毫 氏 民 氣 水 永 求 汗 汝 江 江 池 污 汪 汶 決 汽 沃 沈 沉 沒 沖 沙 河 油 治 沿 況 泉 泊 法 泡 波 泥 注 泰 泳 洋 洗 洛 洞 洩 洪 洲 活 洽 派 流 浦 浩 浪 浮 海 涇 涇 消 涉 涯 液 涵 涼 淑 淚 淡 淨 深 混 淺 清 減 渡 測 港 游 湖 湯 源 準 溝 溪 溫 滄 滅 滋 滑 滴 滾 滿 漂 漏 演 漠 漢 漫 漲 漸 潔 潘 潛 潮 澤 澳 激 濃 濟 濤 濫 濱 瀏 灌 灣 火 灰 災 炎 炮 炸 為 烈 烏 烤 無 焦 然 煙 煞 照 煩 熊 熟 熱 燃 燈 燒 營 爆 爐 爛 爪 爬 爭 爵 父 爸 爺 爽 爾 牆 牆 片 版 牌 牙 牛 牠 牧 物 牲 特 牽 犧 犯 狀 狂 狐 狗 狠 狼 猛 猜 猴 猶 獄 獅 獎 獨 獲 獸 獻 玄 率 玉 王 玩 玫 玲 玻 珊 珍 珠 珥 班 現 球 理 琉 琪 琴 瑙 瑜 瑞 瑟 瑤 瑪 瑰 環 瓜 瓦 瓶 甘 甚 甜 生 產 用 田 田 由 甲 申 男 甸 界 留 畢 略 番 畫 異 當 疆 疏 疑 疼 病 痕 痛 痴 瘋 療 癡 癸 登 登 發 白 百 的 皆 皇 皮 盃 益 盛 盜 盟 盡 監 盤 盧 目 盲 直 相 盼 盾 省 眉 看 真 眠 眼 眾 睛 睡 督 瞧 瞭 矛 矣 知 短 石 砂 砍 研 砲 破 硬 碎 碗 碟 碧 碩 碰 確 碼 磁 磨 磯 礎 礙 示 社 祕 祖 祚 祛 祝 神 祥 票 祿 禁 禍 禍 禎 福 禪 禮 秀 私 秋 科 秒 秘 租 秤 秦 移 稅 程 稍 種 稱 稿 穆 穌 積 穩 究 穹 空 穿 突 窗 窩 窮 窶 立 站 竟 章 童 端 競 竹 笑 笛 符 笨 第 筆 等 筋 答 策 简 算 管 箭 箱 節 範 篇 築 簡 簫 簽 簿 籃 籌 籍 籤 米 粉 粗 粵 精 糊 糕 糟 系 糾 紀 約 紅 納 紐 純 紙 紙 級 紛 素 索 紫 累 細 紹 終 組 結 絕 絡 給 統 絲 經 綜 綠 維 綱 網 緊 緒 線 緣 編 緩 緬 緯 練 縛 縣 縮 縱 總 績 繁 繆 織 繞 繪 繳 繼 續 缸 缺 罕 罪 置 罰 署 罵 罷 羅 羊 美 羞 群 義 羽 翁 習 翔 翰 翹 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 聖 聚 聞 聯 聰 聲 職 聽 肉 肚 股 肥 肩 肯 育 背 胎 胖 胞 胡 胸 能 脆 脫 腓 腔 腦 腰 腳 腿 膽 臉 臘 臣 臥 臨 自 臭 至 致 臺 與 與 興 舉 舊 舌 舍 舒 舞 舟 航 般 船 艦 良 色 艾 芝 芬 花 芳 若 苦 英 茅 茫 茲 茶 草 荒 荷 荼 莉 莊 莎 莫 菜 菩 華 菲 萄 萊 萬 落 葉 著 葛 葡 蒂 蒙 蒲 蒼 蓋 蓮 蔕 蔡 蔣 蕭 薄 薦 薩 薪 藉 藍 藏 藝 藤 藥 蘆 蘇 蘭 虎 處 虛 號 虧 蛇 蛋 蛙 蜂 蜜 蝶 融 螢 蟲 蟹 蠍 蠻 血 行 術 街 衛 衝 衡 衣 表 袋 被 裁 裂 裕 補 裝 裡 製 複 褲 西 要 覆 見 規 視 親 覺 覽 觀 角 解 觸 言 訂 計 訊 討 訓 託 記 訥 訪 設 許 訴 註 証 評 詞 詢 試 詩 話 話 該 詳 誇 誌 認 誓 誕 語 誠 誤 說 誰 課 誼 調 談 請 諒 論 諸 諺 諾 謀 謂 講 謝 證 識 譜 警 譯 議 護 譽 讀 變 讓 讚 谷 豆 豈 豐 象 豪 豬 貌 貓 貝 貞 負 負 財 貢 貨 貪 貪 貫 責 貴 買 費 貼 賀 資 賈 賓 賜 賞 賢 賢 賣 賤 賦 質 賭 賴 賺 購 賽 贈 贊 贏 赤 赫 走 起 超 越 趕 趙 趣 趨 足 跌 跎 跑 距 跟 跡 路 跳 踏 踢 蹟 蹤 躍 身 躲 車 軌 軍 軒 軟 較 載 輔 輕 輛 輝 輩 輪 輯 輸 轉 轟 辛 辦 辨 辭 辯 辯 辰 辱 農 迅 迎 近 返 迦 迪 迫 述 迴 迷 追 退 送 逃 逆 透 逐 途 這 這 通 逛 逝 速 造 逢 連 週 進 逸 逼 遇 遊 運 遍 過 道 道 達 違 遙 遜 遠 適 遭 遮 遲 遷 選 遺 避 避 邀 邁 還 邊 邏 那 邦 邪 邱 郎 部 郭 郵 都 鄂 鄉 鄭 鄰 酉 配 酒 酷 酸 醉 醒 醜 醫 采 釋 釋 里 重 野 量 金 針 釣 鈴 鉢 銀 銅 銖 銘 銳 銷 鋒 鋼 錄 錢 錦 錫 錯 鍋 鍵 鍾 鎊 鎖 鎮 鏡 鐘 鐵 鑑 長 門 閃 閉 開 閏 閒 間 閣 閱 闆 闊 闍 闐 關 闡 防 阻 阿 陀 附 降 限 院 院 陣 除 陪 陰 陳 陵 陵 陶 陷 陸 陽 隆 隊 階 隔 際 障 隨 險 隱 隻 雄 雄 雅 集 雉 雖 雙 雜 雞 離 難 雨 雪 雲 零 雷 電 需 震 霍 霧 露 霸 霹 靂 靈 青 靖 靜 非 靠 面 革 靼 鞋 韃 韋 韓 音 韻 響 頁 頂 項 順 須 預 頑 頓 頗 領 頞 頭 頻 顆 題 額 顏 願 類 顧 顯 風 飄 飛 食 飯 飲 飽 飾 餅 養 餐 餘 館 首 香 馬 駐 駕 駛 騎 騙 騷 驅 驗 驚 骨 體 高 髮 鬆 鬥 鬧 鬱 鬼 魁 魂 魅 魔 魚 魯 鮮 鳥 鳳 鳴 鴻 鵝 鷹 鹿 麗 麥 麵 麻 麼 黃 黎 黑 默 點 黨 鼓 鼠 鼻 齊 齋 齒 齡 龍 龜", - 2: "‾ ﹉ ﹉ ﹊ ﹋ ﹌ _ _ ﹍ ﹍ ﹎ ﹏ ︳ ︴ - - ﹣ ‐ – ︲ — ﹘ ︱ , , ﹐ 、 ﹑ ; ; ﹔ : : ﹕ ! ! ﹗ ? ? ﹖ . . ﹒ ‥ ︰ … 。 · ' ‘ ’ \" " “ ” 〝 〞 ( ( ﹙ ︵ ) ) ﹚ ︶ [ [ ] ] { { ﹛ ︷ } } ﹜ ︸ 〈 ︿ 〉 ﹀ 《 ︽ 》 ︾ 「 ﹁ 」 ﹂ 『 ﹃ 』 ﹄ 【 ︻ 】 ︼ 〔 ﹝ ︹ 〕 ﹞ ︺ § @ @ ﹫ * * ﹡ / / \\ \ ﹨ & & ﹠ # # ﹟ % % ﹪ ‰ † ‡ ‧ ′ ″ ‵ 〃 ※", - 3: "伏 侶 兌 兹 别 勳 卑 占 叶 堤 墎 奥 孜 峇 巽 彝 楔 渾 燦 狄 琳 瑚 甫 礁 芒 苗 茨 蚩 蜀 隴", - 5: "一 丁 丈 不 且 丞 並 串 乘 乾 亂 亭 傀 僎 僵 儐 償 儳 儷 儻 叢 嚴 囌 囑 廳", - }, - "zu": { - 0: "a b bh c ch d dl dy e f g gc gq gx h hh hl i j k kh kl kp l m n nc ngc ngq ngx nhl nk nkc nkq nkx nq ntsh nx ny o p ph q qh r rh s sh t th tl ts tsh u v w x xh y z", - 2: "- , ; : ! ? . ( ) [ ] { }", - 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ú ù ŭ û ü ū ÿ", - }, -} diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/col.go b/vendor/golang.org/x/text/collate/tools/colcmp/col.go deleted file mode 100644 index dc22d2eef..000000000 --- a/vendor/golang.org/x/text/collate/tools/colcmp/col.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "log" - "unicode/utf16" - - "golang.org/x/text/collate" - "golang.org/x/text/language" -) - -// Input holds an input string in both UTF-8 and UTF-16 format. -type Input struct { - index int // used for restoring to original random order - UTF8 []byte - UTF16 []uint16 - key []byte // used for sorting -} - -func (i Input) String() string { - return string(i.UTF8) -} - -func makeInput(s8 []byte, s16 []uint16) Input { - return Input{UTF8: s8, UTF16: s16} -} - -func makeInputString(s string) Input { - return Input{ - UTF8: []byte(s), - UTF16: utf16.Encode([]rune(s)), - } -} - -// Collator is an interface for architecture-specific implementations of collation. -type Collator interface { - // Key generates a sort key for the given input. Implemenations - // may return nil if a collator does not support sort keys. - Key(s Input) []byte - - // Compare returns -1 if a < b, 1 if a > b and 0 if a == b. - Compare(a, b Input) int -} - -// CollatorFactory creates a Collator for a given language tag. -type CollatorFactory struct { - name string - makeFn func(tag string) (Collator, error) - description string -} - -var collators = []CollatorFactory{} - -// AddFactory registers f as a factory for an implementation of Collator. -func AddFactory(f CollatorFactory) { - collators = append(collators, f) -} - -func getCollator(name, locale string) Collator { - for _, f := range collators { - if f.name == name { - col, err := f.makeFn(locale) - if err != nil { - log.Fatal(err) - } - return col - } - } - log.Fatalf("collator of type %q not found", name) - return nil -} - -// goCollator is an implemention of Collator using go's own collator. -type goCollator struct { - c *collate.Collator - buf collate.Buffer -} - -func init() { - AddFactory(CollatorFactory{"go", newGoCollator, "Go's native collator implementation."}) -} - -func newGoCollator(loc string) (Collator, error) { - c := &goCollator{c: collate.New(language.Make(loc))} - return c, nil -} - -func (c *goCollator) Key(b Input) []byte { - return c.c.Key(&c.buf, b.UTF8) -} - -func (c *goCollator) Compare(a, b Input) int { - return c.c.Compare(a.UTF8, b.UTF8) -} diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/colcmp.go b/vendor/golang.org/x/text/collate/tools/colcmp/colcmp.go deleted file mode 100644 index ebd6012dd..000000000 --- a/vendor/golang.org/x/text/collate/tools/colcmp/colcmp.go +++ /dev/null @@ -1,529 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main // import "golang.org/x/text/collate/tools/colcmp" - -import ( - "bytes" - "flag" - "fmt" - "io" - "log" - "os" - "runtime/pprof" - "sort" - "strconv" - "strings" - "text/template" - "time" - - "golang.org/x/text/unicode/norm" -) - -var ( - doNorm = flag.Bool("norm", false, "normalize input strings") - cases = flag.Bool("case", false, "generate case variants") - verbose = flag.Bool("verbose", false, "print results") - debug = flag.Bool("debug", false, "output debug information") - locales = flag.String("locale", "en_US", "the locale to use. May be a comma-separated list for some commands.") - col = flag.String("col", "go", "collator to test") - gold = flag.String("gold", "go", "collator used as the gold standard") - usecmp = flag.Bool("usecmp", false, - `use comparison instead of sort keys when sorting. Must be "test", "gold" or "both"`) - cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") - exclude = flag.String("exclude", "", "exclude errors that contain any of the characters") - limit = flag.Int("limit", 5000000, "maximum number of samples to generate for one run") -) - -func failOnError(err error) { - if err != nil { - log.Panic(err) - } -} - -// Test holds test data for testing a locale-collator pair. -// Test also provides functionality that is commonly used by the various commands. -type Test struct { - ctxt *Context - Name string - Locale string - ColName string - - Col Collator - UseCompare bool - - Input []Input - Duration time.Duration - - start time.Time - msg string - count int -} - -func (t *Test) clear() { - t.Col = nil - t.Input = nil -} - -const ( - msgGeneratingInput = "generating input" - msgGeneratingKeys = "generating keys" - msgSorting = "sorting" -) - -var lastLen = 0 - -func (t *Test) SetStatus(msg string) { - if *debug || *verbose { - fmt.Printf("%s: %s...\n", t.Name, msg) - } else if t.ctxt.out != nil { - fmt.Fprint(t.ctxt.out, strings.Repeat(" ", lastLen)) - fmt.Fprint(t.ctxt.out, strings.Repeat("\b", lastLen)) - fmt.Fprint(t.ctxt.out, msg, "...") - lastLen = len(msg) + 3 - fmt.Fprint(t.ctxt.out, strings.Repeat("\b", lastLen)) - } -} - -// Start is used by commands to signal the start of an operation. -func (t *Test) Start(msg string) { - t.SetStatus(msg) - t.count = 0 - t.msg = msg - t.start = time.Now() -} - -// Stop is used by commands to signal the end of an operation. -func (t *Test) Stop() (time.Duration, int) { - d := time.Now().Sub(t.start) - t.Duration += d - if *debug || *verbose { - fmt.Printf("%s: %s done. (%.3fs /%dK ops)\n", t.Name, t.msg, d.Seconds(), t.count/1000) - } - return d, t.count -} - -// generateKeys generates sort keys for all the inputs. -func (t *Test) generateKeys() { - for i, s := range t.Input { - b := t.Col.Key(s) - t.Input[i].key = b - if *debug { - fmt.Printf("%s (%X): %X\n", string(s.UTF8), s.UTF16, b) - } - } -} - -// Sort sorts the inputs. It generates sort keys if this is required by the -// chosen sort method. -func (t *Test) Sort() (tkey, tsort time.Duration, nkey, nsort int) { - if *cpuprofile != "" { - f, err := os.Create(*cpuprofile) - failOnError(err) - pprof.StartCPUProfile(f) - defer pprof.StopCPUProfile() - } - if t.UseCompare || t.Col.Key(t.Input[0]) == nil { - t.Start(msgSorting) - sort.Sort(&testCompare{*t}) - tsort, nsort = t.Stop() - } else { - t.Start(msgGeneratingKeys) - t.generateKeys() - t.count = len(t.Input) - tkey, nkey = t.Stop() - t.Start(msgSorting) - sort.Sort(t) - tsort, nsort = t.Stop() - } - return -} - -func (t *Test) Swap(a, b int) { - t.Input[a], t.Input[b] = t.Input[b], t.Input[a] -} - -func (t *Test) Less(a, b int) bool { - t.count++ - return bytes.Compare(t.Input[a].key, t.Input[b].key) == -1 -} - -func (t Test) Len() int { - return len(t.Input) -} - -type testCompare struct { - Test -} - -func (t *testCompare) Less(a, b int) bool { - t.count++ - return t.Col.Compare(t.Input[a], t.Input[b]) == -1 -} - -type testRestore struct { - Test -} - -func (t *testRestore) Less(a, b int) bool { - return t.Input[a].index < t.Input[b].index -} - -// GenerateInput generates input phrases for the locale tested by t. -func (t *Test) GenerateInput() { - t.Input = nil - if t.ctxt.lastLocale != t.Locale { - gen := phraseGenerator{} - gen.init(t.Locale) - t.SetStatus(msgGeneratingInput) - t.ctxt.lastInput = nil // allow the previous value to be garbage collected. - t.Input = gen.generate(*doNorm) - t.ctxt.lastInput = t.Input - t.ctxt.lastLocale = t.Locale - } else { - t.Input = t.ctxt.lastInput - for i := range t.Input { - t.Input[i].key = nil - } - sort.Sort(&testRestore{*t}) - } -} - -// Context holds all tests and settings translated from command line options. -type Context struct { - test []*Test - last *Test - - lastLocale string - lastInput []Input - - out io.Writer -} - -func (ts *Context) Printf(format string, a ...interface{}) { - ts.assertBuf() - fmt.Fprintf(ts.out, format, a...) -} - -func (ts *Context) Print(a ...interface{}) { - ts.assertBuf() - fmt.Fprint(ts.out, a...) -} - -// assertBuf sets up an io.Writer for output, if it doesn't already exist. -// In debug and verbose mode, output is buffered so that the regular output -// will not interfere with the additional output. Otherwise, output is -// written directly to stdout for a more responsive feel. -func (ts *Context) assertBuf() { - if ts.out != nil { - return - } - if *debug || *verbose { - ts.out = &bytes.Buffer{} - } else { - ts.out = os.Stdout - } -} - -// flush flushes the contents of ts.out to stdout, if it is not stdout already. -func (ts *Context) flush() { - if ts.out != nil { - if _, ok := ts.out.(io.ReadCloser); !ok { - io.Copy(os.Stdout, ts.out.(io.Reader)) - } - } -} - -// parseTests creates all tests from command lines and returns -// a Context to hold them. -func parseTests() *Context { - ctxt := &Context{} - colls := strings.Split(*col, ",") - for _, loc := range strings.Split(*locales, ",") { - loc = strings.TrimSpace(loc) - for _, name := range colls { - name = strings.TrimSpace(name) - col := getCollator(name, loc) - ctxt.test = append(ctxt.test, &Test{ - ctxt: ctxt, - Locale: loc, - ColName: name, - UseCompare: *usecmp, - Col: col, - }) - } - } - return ctxt -} - -func (c *Context) Len() int { - return len(c.test) -} - -func (c *Context) Test(i int) *Test { - if c.last != nil { - c.last.clear() - } - c.last = c.test[i] - return c.last -} - -func parseInput(args []string) []Input { - input := []Input{} - for _, s := range args { - rs := []rune{} - for len(s) > 0 { - var r rune - r, _, s, _ = strconv.UnquoteChar(s, '\'') - rs = append(rs, r) - } - s = string(rs) - if *doNorm { - s = norm.NFD.String(s) - } - input = append(input, makeInputString(s)) - } - return input -} - -// A Command is an implementation of a colcmp command. -type Command struct { - Run func(cmd *Context, args []string) - Usage string - Short string - Long string -} - -func (cmd Command) Name() string { - return strings.SplitN(cmd.Usage, " ", 2)[0] -} - -var commands = []*Command{ - cmdSort, - cmdBench, - cmdRegress, -} - -const sortHelp = ` -Sort sorts a given list of strings. Strings are separated by whitespace. -` - -var cmdSort = &Command{ - Run: runSort, - Usage: "sort <string>*", - Short: "sort a given list of strings", - Long: sortHelp, -} - -func runSort(ctxt *Context, args []string) { - input := parseInput(args) - if len(input) == 0 { - log.Fatalf("Nothing to sort.") - } - if ctxt.Len() > 1 { - ctxt.Print("COLL LOCALE RESULT\n") - } - for i := 0; i < ctxt.Len(); i++ { - t := ctxt.Test(i) - t.Input = append(t.Input, input...) - t.Sort() - if ctxt.Len() > 1 { - ctxt.Printf("%-5s %-5s ", t.ColName, t.Locale) - } - for _, s := range t.Input { - ctxt.Print(string(s.UTF8), " ") - } - ctxt.Print("\n") - } -} - -const benchHelp = ` -Bench runs a benchmark for the given list of collator implementations. -If no collator implementations are given, the go collator will be used. -` - -var cmdBench = &Command{ - Run: runBench, - Usage: "bench", - Short: "benchmark a given list of collator implementations", - Long: benchHelp, -} - -func runBench(ctxt *Context, args []string) { - ctxt.Printf("%-7s %-5s %-6s %-24s %-24s %-5s %s\n", "LOCALE", "COLL", "N", "KEYS", "SORT", "AVGLN", "TOTAL") - for i := 0; i < ctxt.Len(); i++ { - t := ctxt.Test(i) - ctxt.Printf("%-7s %-5s ", t.Locale, t.ColName) - t.GenerateInput() - ctxt.Printf("%-6s ", fmt.Sprintf("%dK", t.Len()/1000)) - tkey, tsort, nkey, nsort := t.Sort() - p := func(dur time.Duration, n int) { - s := "" - if dur > 0 { - s = fmt.Sprintf("%6.3fs ", dur.Seconds()) - if n > 0 { - s += fmt.Sprintf("%15s", fmt.Sprintf("(%4.2f ns/op)", float64(dur)/float64(n))) - } - } - ctxt.Printf("%-24s ", s) - } - p(tkey, nkey) - p(tsort, nsort) - - total := 0 - for _, s := range t.Input { - total += len(s.key) - } - ctxt.Printf("%-5d ", total/t.Len()) - ctxt.Printf("%6.3fs\n", t.Duration.Seconds()) - if *debug { - for _, s := range t.Input { - fmt.Print(string(s.UTF8), " ") - } - fmt.Println() - } - } -} - -const regressHelp = ` -Regress runs a monkey test by comparing the results of randomly generated tests -between two implementations of a collator. The user may optionally pass a list -of strings to regress against instead of the default test set. -` - -var cmdRegress = &Command{ - Run: runRegress, - Usage: "regress -gold=<col> -test=<col> [string]*", - Short: "run a monkey test between two collators", - Long: regressHelp, -} - -const failedKeyCompare = ` -%s:%d: incorrect comparison result for input: - a: %q (%.4X) - key: %s - b: %q (%.4X) - key: %s - Compare(a, b) = %d; want %d. - - gold keys: - a: %s - b: %s -` - -const failedCompare = ` -%s:%d: incorrect comparison result for input: - a: %q (%.4X) - b: %q (%.4X) - Compare(a, b) = %d; want %d. -` - -func keyStr(b []byte) string { - buf := &bytes.Buffer{} - for _, v := range b { - fmt.Fprintf(buf, "%.2X ", v) - } - return buf.String() -} - -func runRegress(ctxt *Context, args []string) { - input := parseInput(args) - for i := 0; i < ctxt.Len(); i++ { - t := ctxt.Test(i) - if len(input) > 0 { - t.Input = append(t.Input, input...) - } else { - t.GenerateInput() - } - t.Sort() - count := 0 - gold := getCollator(*gold, t.Locale) - for i := 1; i < len(t.Input); i++ { - ia := t.Input[i-1] - ib := t.Input[i] - if bytes.IndexAny(ib.UTF8, *exclude) != -1 { - i++ - continue - } - if bytes.IndexAny(ia.UTF8, *exclude) != -1 { - continue - } - goldCmp := gold.Compare(ia, ib) - if cmp := bytes.Compare(ia.key, ib.key); cmp != goldCmp { - count++ - a := string(ia.UTF8) - b := string(ib.UTF8) - fmt.Printf(failedKeyCompare, t.Locale, i-1, a, []rune(a), keyStr(ia.key), b, []rune(b), keyStr(ib.key), cmp, goldCmp, keyStr(gold.Key(ia)), keyStr(gold.Key(ib))) - } else if cmp := t.Col.Compare(ia, ib); cmp != goldCmp { - count++ - a := string(ia.UTF8) - b := string(ib.UTF8) - fmt.Printf(failedCompare, t.Locale, i-1, a, []rune(a), b, []rune(b), cmp, goldCmp) - } - } - if count > 0 { - ctxt.Printf("Found %d inconsistencies in %d entries.\n", count, t.Len()-1) - } - } -} - -const helpTemplate = ` -colcmp is a tool for testing and benchmarking collation - -Usage: colcmp command [arguments] - -The commands are: -{{range .}} - {{.Name | printf "%-11s"}} {{.Short}}{{end}} - -Use "col help [topic]" for more information about that topic. -` - -const detailedHelpTemplate = ` -Usage: colcmp {{.Usage}} - -{{.Long | trim}} -` - -func runHelp(args []string) { - t := template.New("help") - t.Funcs(template.FuncMap{"trim": strings.TrimSpace}) - if len(args) < 1 { - template.Must(t.Parse(helpTemplate)) - failOnError(t.Execute(os.Stderr, &commands)) - } else { - for _, cmd := range commands { - if cmd.Name() == args[0] { - template.Must(t.Parse(detailedHelpTemplate)) - failOnError(t.Execute(os.Stderr, cmd)) - os.Exit(0) - } - } - log.Fatalf("Unknown command %q. Run 'colcmp help'.", args[0]) - } - os.Exit(0) -} - -func main() { - flag.Parse() - log.SetFlags(0) - - ctxt := parseTests() - - if flag.NArg() < 1 { - runHelp(nil) - } - args := flag.Args()[1:] - if flag.Arg(0) == "help" { - runHelp(args) - } - for _, cmd := range commands { - if cmd.Name() == flag.Arg(0) { - cmd.Run(ctxt, args) - ctxt.flush() - return - } - } - runHelp(flag.Args()) -} diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/darwin.go b/vendor/golang.org/x/text/collate/tools/colcmp/darwin.go deleted file mode 100644 index c2c31d5cb..000000000 --- a/vendor/golang.org/x/text/collate/tools/colcmp/darwin.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin - -package main - -/* -#cgo LDFLAGS: -framework CoreFoundation -#include <CoreFoundation/CFBase.h> -#include <CoreFoundation/CoreFoundation.h> -*/ -import "C" -import ( - "unsafe" -) - -func init() { - AddFactory(CollatorFactory{"osx", newOSX16Collator, - "OS X/Darwin collator, using native strings."}) - AddFactory(CollatorFactory{"osx8", newOSX8Collator, - "OS X/Darwin collator for UTF-8."}) -} - -func osxUInt8P(s []byte) *C.UInt8 { - return (*C.UInt8)(unsafe.Pointer(&s[0])) -} - -func osxCharP(s []uint16) *C.UniChar { - return (*C.UniChar)(unsafe.Pointer(&s[0])) -} - -// osxCollator implements an Collator based on OS X's CoreFoundation. -type osxCollator struct { - loc C.CFLocaleRef - opt C.CFStringCompareFlags -} - -func (c *osxCollator) init(locale string) { - l := C.CFStringCreateWithBytes( - nil, - osxUInt8P([]byte(locale)), - C.CFIndex(len(locale)), - C.kCFStringEncodingUTF8, - C.Boolean(0), - ) - c.loc = C.CFLocaleCreate(nil, l) -} - -func newOSX8Collator(locale string) (Collator, error) { - c := &osx8Collator{} - c.init(locale) - return c, nil -} - -func newOSX16Collator(locale string) (Collator, error) { - c := &osx16Collator{} - c.init(locale) - return c, nil -} - -func (c osxCollator) Key(s Input) []byte { - return nil // sort keys not supported by OS X CoreFoundation -} - -type osx8Collator struct { - osxCollator -} - -type osx16Collator struct { - osxCollator -} - -func (c osx16Collator) Compare(a, b Input) int { - sa := C.CFStringCreateWithCharactersNoCopy( - nil, - osxCharP(a.UTF16), - C.CFIndex(len(a.UTF16)), - nil, - ) - sb := C.CFStringCreateWithCharactersNoCopy( - nil, - osxCharP(b.UTF16), - C.CFIndex(len(b.UTF16)), - nil, - ) - _range := C.CFRangeMake(0, C.CFStringGetLength(sa)) - return int(C.CFStringCompareWithOptionsAndLocale(sa, sb, _range, c.opt, c.loc)) -} - -func (c osx8Collator) Compare(a, b Input) int { - sa := C.CFStringCreateWithBytesNoCopy( - nil, - osxUInt8P(a.UTF8), - C.CFIndex(len(a.UTF8)), - C.kCFStringEncodingUTF8, - C.Boolean(0), - nil, - ) - sb := C.CFStringCreateWithBytesNoCopy( - nil, - osxUInt8P(b.UTF8), - C.CFIndex(len(b.UTF8)), - C.kCFStringEncodingUTF8, - C.Boolean(0), - nil, - ) - _range := C.CFRangeMake(0, C.CFStringGetLength(sa)) - return int(C.CFStringCompareWithOptionsAndLocale(sa, sb, _range, c.opt, c.loc)) -} diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/gen.go b/vendor/golang.org/x/text/collate/tools/colcmp/gen.go deleted file mode 100644 index 795be132e..000000000 --- a/vendor/golang.org/x/text/collate/tools/colcmp/gen.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "math" - "math/rand" - "strings" - "unicode" - "unicode/utf16" - "unicode/utf8" - - "golang.org/x/text/language" - "golang.org/x/text/unicode/norm" -) - -// TODO: replace with functionality in language package. -// parent computes the parent language for the given language. -// It returns false if the parent is already root. -func parent(locale string) (parent string, ok bool) { - if locale == "und" { - return "", false - } - if i := strings.LastIndex(locale, "-"); i != -1 { - return locale[:i], true - } - return "und", true -} - -// rewriter is used to both unique strings and create variants of strings -// to add to the test set. -type rewriter struct { - seen map[string]bool - addCases bool -} - -func newRewriter() *rewriter { - return &rewriter{ - seen: make(map[string]bool), - } -} - -func (r *rewriter) insert(a []string, s string) []string { - if !r.seen[s] { - r.seen[s] = true - a = append(a, s) - } - return a -} - -// rewrite takes a sequence of strings in, adds variants of the these strings -// based on options and removes duplicates. -func (r *rewriter) rewrite(ss []string) []string { - ns := []string{} - for _, s := range ss { - ns = r.insert(ns, s) - if r.addCases { - rs := []rune(s) - rn := rs[0] - for c := unicode.SimpleFold(rn); c != rn; c = unicode.SimpleFold(c) { - rs[0] = c - ns = r.insert(ns, string(rs)) - } - } - } - return ns -} - -// exemplarySet holds a parsed set of characters from the exemplarCharacters table. -type exemplarySet struct { - typ exemplarType - set []string - charIndex int // cumulative total of phrases, including this set -} - -type phraseGenerator struct { - sets [exN]exemplarySet - n int -} - -func (g *phraseGenerator) init(id string) { - ec := exemplarCharacters - loc := language.Make(id).String() - // get sets for locale or parent locale if the set is not defined. - for i := range g.sets { - for p, ok := loc, true; ok; p, ok = parent(p) { - if set, ok := ec[p]; ok && set[i] != "" { - g.sets[i].set = strings.Split(set[i], " ") - break - } - } - } - r := newRewriter() - r.addCases = *cases - for i := range g.sets { - g.sets[i].set = r.rewrite(g.sets[i].set) - } - // compute indexes - for i, set := range g.sets { - g.n += len(set.set) - g.sets[i].charIndex = g.n - } -} - -// phrase returns the ith phrase, where i < g.n. -func (g *phraseGenerator) phrase(i int) string { - for _, set := range g.sets { - if i < set.charIndex { - return set.set[i-(set.charIndex-len(set.set))] - } - } - panic("index out of range") -} - -// generate generates inputs by combining all pairs of examplar strings. -// If doNorm is true, all input strings are normalized to NFC. -// TODO: allow other variations, statistical models, and random -// trailing sequences. -func (g *phraseGenerator) generate(doNorm bool) []Input { - const ( - M = 1024 * 1024 - buf8Size = 30 * M - buf16Size = 10 * M - ) - // TODO: use a better way to limit the input size. - if sq := int(math.Sqrt(float64(*limit))); g.n > sq { - g.n = sq - } - size := g.n * g.n - a := make([]Input, 0, size) - buf8 := make([]byte, 0, buf8Size) - buf16 := make([]uint16, 0, buf16Size) - - addInput := func(str string) { - buf8 = buf8[len(buf8):] - buf16 = buf16[len(buf16):] - if len(str) > cap(buf8) { - buf8 = make([]byte, 0, buf8Size) - } - if len(str) > cap(buf16) { - buf16 = make([]uint16, 0, buf16Size) - } - if doNorm { - buf8 = norm.NFD.AppendString(buf8, str) - } else { - buf8 = append(buf8, str...) - } - buf16 = appendUTF16(buf16, buf8) - a = append(a, makeInput(buf8, buf16)) - } - for i := 0; i < g.n; i++ { - p1 := g.phrase(i) - addInput(p1) - for j := 0; j < g.n; j++ { - p2 := g.phrase(j) - addInput(p1 + p2) - } - } - // permutate - rnd := rand.New(rand.NewSource(int64(rand.Int()))) - for i := range a { - j := i + rnd.Intn(len(a)-i) - a[i], a[j] = a[j], a[i] - a[i].index = i // allow restoring this order if input is used multiple times. - } - return a -} - -func appendUTF16(buf []uint16, s []byte) []uint16 { - for len(s) > 0 { - r, sz := utf8.DecodeRune(s) - s = s[sz:] - r1, r2 := utf16.EncodeRune(r) - if r1 != 0xFFFD { - buf = append(buf, uint16(r1), uint16(r2)) - } else { - buf = append(buf, uint16(r)) - } - } - return buf -} diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/icu.go b/vendor/golang.org/x/text/collate/tools/colcmp/icu.go deleted file mode 100644 index 76de40427..000000000 --- a/vendor/golang.org/x/text/collate/tools/colcmp/icu.go +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build icu - -package main - -/* -#cgo LDFLAGS: -licui18n -licuuc -#include <stdlib.h> -#include <unicode/ucol.h> -#include <unicode/uiter.h> -#include <unicode/utypes.h> -*/ -import "C" -import ( - "fmt" - "log" - "unicode/utf16" - "unicode/utf8" - "unsafe" -) - -func init() { - AddFactory(CollatorFactory{"icu", newUTF16, - "Main ICU collator, using native strings."}) - AddFactory(CollatorFactory{"icu8", newUTF8iter, - "ICU collator using ICU iterators to process UTF8."}) - AddFactory(CollatorFactory{"icu16", newUTF8conv, - "ICU collation by first converting UTF8 to UTF16."}) -} - -func icuCharP(s []byte) *C.char { - return (*C.char)(unsafe.Pointer(&s[0])) -} - -func icuUInt8P(s []byte) *C.uint8_t { - return (*C.uint8_t)(unsafe.Pointer(&s[0])) -} - -func icuUCharP(s []uint16) *C.UChar { - return (*C.UChar)(unsafe.Pointer(&s[0])) -} -func icuULen(s []uint16) C.int32_t { - return C.int32_t(len(s)) -} -func icuSLen(s []byte) C.int32_t { - return C.int32_t(len(s)) -} - -// icuCollator implements a Collator based on ICU. -type icuCollator struct { - loc *C.char - col *C.UCollator - keyBuf []byte -} - -const growBufSize = 10 * 1024 * 1024 - -func (c *icuCollator) init(locale string) error { - err := C.UErrorCode(0) - c.loc = C.CString(locale) - c.col = C.ucol_open(c.loc, &err) - if err > 0 { - return fmt.Errorf("failed opening collator for %q", locale) - } else if err < 0 { - loc := C.ucol_getLocaleByType(c.col, 0, &err) - fmt, ok := map[int]string{ - -127: "warning: using default collator: %s", - -128: "warning: using fallback collator: %s", - }[int(err)] - if ok { - log.Printf(fmt, C.GoString(loc)) - } - } - c.keyBuf = make([]byte, 0, growBufSize) - return nil -} - -func (c *icuCollator) buf() (*C.uint8_t, C.int32_t) { - if len(c.keyBuf) == cap(c.keyBuf) { - c.keyBuf = make([]byte, 0, growBufSize) - } - b := c.keyBuf[len(c.keyBuf):cap(c.keyBuf)] - return icuUInt8P(b), icuSLen(b) -} - -func (c *icuCollator) extendBuf(n C.int32_t) []byte { - end := len(c.keyBuf) + int(n) - if end > cap(c.keyBuf) { - if len(c.keyBuf) == 0 { - log.Fatalf("icuCollator: max string size exceeded: %v > %v", n, growBufSize) - } - c.keyBuf = make([]byte, 0, growBufSize) - return nil - } - b := c.keyBuf[len(c.keyBuf):end] - c.keyBuf = c.keyBuf[:end] - return b -} - -func (c *icuCollator) Close() error { - C.ucol_close(c.col) - C.free(unsafe.Pointer(c.loc)) - return nil -} - -// icuUTF16 implements the Collator interface. -type icuUTF16 struct { - icuCollator -} - -func newUTF16(locale string) (Collator, error) { - c := &icuUTF16{} - return c, c.init(locale) -} - -func (c *icuUTF16) Compare(a, b Input) int { - return int(C.ucol_strcoll(c.col, icuUCharP(a.UTF16), icuULen(a.UTF16), icuUCharP(b.UTF16), icuULen(b.UTF16))) -} - -func (c *icuUTF16) Key(s Input) []byte { - bp, bn := c.buf() - n := C.ucol_getSortKey(c.col, icuUCharP(s.UTF16), icuULen(s.UTF16), bp, bn) - if b := c.extendBuf(n); b != nil { - return b - } - return c.Key(s) -} - -// icuUTF8iter implements the Collator interface -// This implementation wraps the UTF8 string in an iterator -// which is passed to the collator. -type icuUTF8iter struct { - icuCollator - a, b C.UCharIterator -} - -func newUTF8iter(locale string) (Collator, error) { - c := &icuUTF8iter{} - return c, c.init(locale) -} - -func (c *icuUTF8iter) Compare(a, b Input) int { - err := C.UErrorCode(0) - C.uiter_setUTF8(&c.a, icuCharP(a.UTF8), icuSLen(a.UTF8)) - C.uiter_setUTF8(&c.b, icuCharP(b.UTF8), icuSLen(b.UTF8)) - return int(C.ucol_strcollIter(c.col, &c.a, &c.b, &err)) -} - -func (c *icuUTF8iter) Key(s Input) []byte { - err := C.UErrorCode(0) - state := [2]C.uint32_t{} - C.uiter_setUTF8(&c.a, icuCharP(s.UTF8), icuSLen(s.UTF8)) - bp, bn := c.buf() - n := C.ucol_nextSortKeyPart(c.col, &c.a, &(state[0]), bp, bn, &err) - if n >= bn { - // Force failure. - if c.extendBuf(n+1) != nil { - log.Fatal("expected extension to fail") - } - return c.Key(s) - } - return c.extendBuf(n) -} - -// icuUTF8conv implements the Collator interface. -// This implementation first converts the give UTF8 string -// to UTF16 and then calls the main ICU collation function. -type icuUTF8conv struct { - icuCollator -} - -func newUTF8conv(locale string) (Collator, error) { - c := &icuUTF8conv{} - return c, c.init(locale) -} - -func (c *icuUTF8conv) Compare(sa, sb Input) int { - a := encodeUTF16(sa.UTF8) - b := encodeUTF16(sb.UTF8) - return int(C.ucol_strcoll(c.col, icuUCharP(a), icuULen(a), icuUCharP(b), icuULen(b))) -} - -func (c *icuUTF8conv) Key(s Input) []byte { - a := encodeUTF16(s.UTF8) - bp, bn := c.buf() - n := C.ucol_getSortKey(c.col, icuUCharP(a), icuULen(a), bp, bn) - if b := c.extendBuf(n); b != nil { - return b - } - return c.Key(s) -} - -func encodeUTF16(b []byte) []uint16 { - a := []uint16{} - for len(b) > 0 { - r, sz := utf8.DecodeRune(b) - b = b[sz:] - r1, r2 := utf16.EncodeRune(r) - if r1 != 0xFFFD { - a = append(a, uint16(r1), uint16(r2)) - } else { - a = append(a, uint16(r)) - } - } - return a -} diff --git a/vendor/golang.org/x/text/currency/common.go b/vendor/golang.org/x/text/currency/common.go deleted file mode 100644 index 250cb8c66..000000000 --- a/vendor/golang.org/x/text/currency/common.go +++ /dev/null @@ -1,66 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package currency - -import ( - "time" - - "golang.org/x/text/language" -) - -// This file contains code common to gen.go and the package code. - -const ( - cashShift = 3 - roundMask = 0x7 - - nonTenderBit = 0x8000 -) - -// currencyInfo contains information about a currency. -// bits 0..2: index into roundings for standard rounding -// bits 3..5: index into roundings for cash rounding -type currencyInfo byte - -// roundingType defines the scale (number of fractional decimals) and increments -// in terms of units of size 10^-scale. For example, for scale == 2 and -// increment == 1, the currency is rounded to units of 0.01. -type roundingType struct { - scale, increment uint8 -} - -// roundings contains rounding data for currencies. This struct is -// created by hand as it is very unlikely to change much. -var roundings = [...]roundingType{ - {2, 1}, // default - {0, 1}, - {1, 1}, - {3, 1}, - {4, 1}, - {2, 5}, // cash rounding alternative -} - -// regionToCode returns a 16-bit region code. Only two-letter codes are -// supported. (Three-letter codes are not needed.) -func regionToCode(r language.Region) uint16 { - if s := r.String(); len(s) == 2 { - return uint16(s[0])<<8 | uint16(s[1]) - } - return 0 -} - -func toDate(t time.Time) uint32 { - y := t.Year() - if y == 1 { - return 0 - } - date := uint32(y) << 4 - date |= uint32(t.Month()) - date <<= 5 - date |= uint32(t.Day()) - return date -} - -func fromDate(date uint32) time.Time { - return time.Date(int(date>>9), time.Month((date>>5)&0xf), int(date&0x1f), 0, 0, 0, 0, time.UTC) -} diff --git a/vendor/golang.org/x/text/currency/currency.go b/vendor/golang.org/x/text/currency/currency.go deleted file mode 100644 index 598ddeff4..000000000 --- a/vendor/golang.org/x/text/currency/currency.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go gen_common.go -output tables.go - -// Package currency contains currency-related functionality. -// -// NOTE: the formatting functionality is currently under development and may -// change without notice. -package currency // import "golang.org/x/text/currency" - -import ( - "errors" - "sort" - - "golang.org/x/text/internal/tag" - "golang.org/x/text/language" -) - -// TODO: -// - language-specific currency names. -// - currency formatting. -// - currency information per region -// - register currency code (there are no private use area) - -// TODO: remove Currency type from package language. - -// Kind determines the rounding and rendering properties of a currency value. -type Kind struct { - rounding rounding - // TODO: formatting type: standard, accounting. See CLDR. -} - -type rounding byte - -const ( - standard rounding = iota - cash -) - -var ( - // Standard defines standard rounding and formatting for currencies. - Standard Kind = Kind{rounding: standard} - - // Cash defines rounding and formatting standards for cash transactions. - Cash Kind = Kind{rounding: cash} - - // Accounting defines rounding and formatting standards for accounting. - Accounting Kind = Kind{rounding: standard} -) - -// Rounding reports the rounding characteristics for the given currency, where -// scale is the number of fractional decimals and increment is the number of -// units in terms of 10^(-scale) to which to round to. -func (k Kind) Rounding(cur Unit) (scale, increment int) { - info := currency.Elem(int(cur.index))[3] - switch k.rounding { - case standard: - info &= roundMask - case cash: - info >>= cashShift - } - return int(roundings[info].scale), int(roundings[info].increment) -} - -// Unit is an ISO 4217 currency designator. -type Unit struct { - index uint16 -} - -// String returns the ISO code of u. -func (u Unit) String() string { - if u.index == 0 { - return "XXX" - } - return currency.Elem(int(u.index))[:3] -} - -// Amount creates an Amount for the given currency unit and amount. -func (u Unit) Amount(amount interface{}) Amount { - // TODO: verify amount is a supported number type - return Amount{amount: amount, currency: u} -} - -var ( - errSyntax = errors.New("currency: tag is not well-formed") - errValue = errors.New("currency: tag is not a recognized currency") -) - -// ParseISO parses a 3-letter ISO 4217 currency code. It returns an error if s -// is not well-formed or not a recognized currency code. -func ParseISO(s string) (Unit, error) { - var buf [4]byte // Take one byte more to detect oversize keys. - key := buf[:copy(buf[:], s)] - if !tag.FixCase("XXX", key) { - return Unit{}, errSyntax - } - if i := currency.Index(key); i >= 0 { - if i == xxx { - return Unit{}, nil - } - return Unit{uint16(i)}, nil - } - return Unit{}, errValue -} - -// MustParseISO is like ParseISO, but panics if the given currency unit -// cannot be parsed. It simplifies safe initialization of Unit values. -func MustParseISO(s string) Unit { - c, err := ParseISO(s) - if err != nil { - panic(err) - } - return c -} - -// FromRegion reports the currency unit that is currently legal tender in the -// given region according to CLDR. It will return false if region currently does -// not have a legal tender. -func FromRegion(r language.Region) (currency Unit, ok bool) { - x := regionToCode(r) - i := sort.Search(len(regionToCurrency), func(i int) bool { - return regionToCurrency[i].region >= x - }) - if i < len(regionToCurrency) && regionToCurrency[i].region == x { - return Unit{regionToCurrency[i].code}, true - } - return Unit{}, false -} - -// FromTag reports the most likely currency for the given tag. It considers the -// currency defined in the -u extension and infers the region if necessary. -func FromTag(t language.Tag) (Unit, language.Confidence) { - if cur := t.TypeForKey("cu"); len(cur) == 3 { - c, _ := ParseISO(cur) - return c, language.Exact - } - r, conf := t.Region() - if cur, ok := FromRegion(r); ok { - return cur, conf - } - return Unit{}, language.No -} - -var ( - // Undefined and testing. - XXX Unit = Unit{} - XTS Unit = Unit{xts} - - // G10 currencies https://en.wikipedia.org/wiki/G10_currencies. - USD Unit = Unit{usd} - EUR Unit = Unit{eur} - JPY Unit = Unit{jpy} - GBP Unit = Unit{gbp} - CHF Unit = Unit{chf} - AUD Unit = Unit{aud} - NZD Unit = Unit{nzd} - CAD Unit = Unit{cad} - SEK Unit = Unit{sek} - NOK Unit = Unit{nok} - - // Additional common currencies as defined by CLDR. - BRL Unit = Unit{brl} - CNY Unit = Unit{cny} - DKK Unit = Unit{dkk} - INR Unit = Unit{inr} - RUB Unit = Unit{rub} - HKD Unit = Unit{hkd} - IDR Unit = Unit{idr} - KRW Unit = Unit{krw} - MXN Unit = Unit{mxn} - PLN Unit = Unit{pln} - SAR Unit = Unit{sar} - THB Unit = Unit{thb} - TRY Unit = Unit{try} - TWD Unit = Unit{twd} - ZAR Unit = Unit{zar} - - // Precious metals. - XAG Unit = Unit{xag} - XAU Unit = Unit{xau} - XPT Unit = Unit{xpt} - XPD Unit = Unit{xpd} -) diff --git a/vendor/golang.org/x/text/currency/currency_test.go b/vendor/golang.org/x/text/currency/currency_test.go deleted file mode 100644 index 566a1678a..000000000 --- a/vendor/golang.org/x/text/currency/currency_test.go +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package currency - -import ( - "fmt" - "testing" - - "golang.org/x/text/internal/testtext" - "golang.org/x/text/language" -) - -var ( - cup = MustParseISO("CUP") - czk = MustParseISO("CZK") - xcd = MustParseISO("XCD") - zwr = MustParseISO("ZWR") -) - -func TestParseISO(t *testing.T) { - testCases := []struct { - in string - out Unit - ok bool - }{ - {"USD", USD, true}, - {"xxx", XXX, true}, - {"xts", XTS, true}, - {"XX", XXX, false}, - {"XXXX", XXX, false}, - {"", XXX, false}, // not well-formed - {"UUU", XXX, false}, // unknown - {"\u22A9", XXX, false}, // non-ASCII, printable - - {"aaa", XXX, false}, - {"zzz", XXX, false}, - {"000", XXX, false}, - {"999", XXX, false}, - {"---", XXX, false}, - {"\x00\x00\x00", XXX, false}, - {"\xff\xff\xff", XXX, false}, - } - for i, tc := range testCases { - if x, err := ParseISO(tc.in); x != tc.out || err == nil != tc.ok { - t.Errorf("%d:%s: was %s, %v; want %s, %v", i, tc.in, x, err == nil, tc.out, tc.ok) - } - } -} - -func TestFromRegion(t *testing.T) { - testCases := []struct { - region string - currency Unit - ok bool - }{ - {"NL", EUR, true}, - {"BE", EUR, true}, - {"AG", xcd, true}, - {"CH", CHF, true}, - {"CU", cup, true}, // first of multiple - {"DG", USD, true}, // does not have M49 code - {"150", XXX, false}, // implicit false - {"CP", XXX, false}, // explicit false in CLDR - {"CS", XXX, false}, // all expired - {"ZZ", XXX, false}, // none match - } - for _, tc := range testCases { - cur, ok := FromRegion(language.MustParseRegion(tc.region)) - if cur != tc.currency || ok != tc.ok { - t.Errorf("%s: got %v, %v; want %v, %v", tc.region, cur, ok, tc.currency, tc.ok) - } - } -} - -func TestFromTag(t *testing.T) { - testCases := []struct { - tag string - currency Unit - conf language.Confidence - }{ - {"nl", EUR, language.Low}, // nl also spoken outside Euro land. - {"nl-BE", EUR, language.Exact}, // region is known - {"pt", BRL, language.Low}, - {"en", USD, language.Low}, - {"en-u-cu-eur", EUR, language.Exact}, - {"tlh", XXX, language.No}, // Klingon has no country. - {"es-419", XXX, language.No}, - {"und", USD, language.Low}, - } - for _, tc := range testCases { - cur, conf := FromTag(language.MustParse(tc.tag)) - if cur != tc.currency || conf != tc.conf { - t.Errorf("%s: got %v, %v; want %v, %v", tc.tag, cur, conf, tc.currency, tc.conf) - } - } -} - -func TestTable(t *testing.T) { - for i := 4; i < len(currency); i += 4 { - if a, b := currency[i-4:i-1], currency[i:i+3]; a >= b { - t.Errorf("currency unordered at element %d: %s >= %s", i, a, b) - } - } - // First currency has index 1, last is numCurrencies. - if c := currency.Elem(1)[:3]; c != "ADP" { - t.Errorf("first was %c; want ADP", c) - } - if c := currency.Elem(numCurrencies)[:3]; c != "ZWR" { - t.Errorf("last was %c; want ZWR", c) - } -} - -func TestKindRounding(t *testing.T) { - testCases := []struct { - kind Kind - cur Unit - scale int - inc int - }{ - {Standard, USD, 2, 1}, - {Standard, CHF, 2, 1}, - {Cash, CHF, 2, 5}, - {Standard, TWD, 2, 1}, - {Cash, TWD, 0, 1}, - {Standard, czk, 2, 1}, - {Cash, czk, 0, 1}, - {Standard, zwr, 2, 1}, - {Cash, zwr, 0, 1}, - {Standard, KRW, 0, 1}, - {Cash, KRW, 0, 1}, // Cash defaults to standard. - } - for i, tc := range testCases { - if scale, inc := tc.kind.Rounding(tc.cur); scale != tc.scale && inc != tc.inc { - t.Errorf("%d: got %d, %d; want %d, %d", i, scale, inc, tc.scale, tc.inc) - } - } -} - -const body = `package main -import ( - "fmt" - "golang.org/x/text/currency" -) -func main() { - %s -} -` - -func TestLinking(t *testing.T) { - base := getSize(t, `fmt.Print(currency.CLDRVersion)`) - symbols := getSize(t, `fmt.Print(currency.Symbol(currency.USD))`) - if d := symbols - base; d < 2*1024 { - t.Errorf("size(symbols)-size(base) was %d; want > 2K", d) - } -} - -func getSize(t *testing.T, main string) int { - size, err := testtext.CodeSize(fmt.Sprintf(body, main)) - if err != nil { - t.Skipf("skipping link size test; binary size could not be determined: %v", err) - } - return size -} - -func BenchmarkString(b *testing.B) { - for i := 0; i < b.N; i++ { - USD.String() - } -} diff --git a/vendor/golang.org/x/text/currency/example_test.go b/vendor/golang.org/x/text/currency/example_test.go deleted file mode 100644 index f7984aa73..000000000 --- a/vendor/golang.org/x/text/currency/example_test.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package currency_test - -import ( - "fmt" - "time" - - "golang.org/x/text/currency" -) - -func ExampleQuery() { - t1799, _ := time.Parse("2006-01-02", "1799-01-01") - for it := currency.Query(currency.Date(t1799)); it.Next(); { - from := "" - if t, ok := it.From(); ok { - from = t.Format("2006-01-01") - } - fmt.Printf("%v is used in %v since: %v\n", it.Unit(), it.Region(), from) - } - // Output: - // GBP is used in GB since: 1694-07-07 - // GIP is used in GI since: 1713-01-01 - // USD is used in US since: 1792-01-01 -} diff --git a/vendor/golang.org/x/text/currency/format.go b/vendor/golang.org/x/text/currency/format.go deleted file mode 100644 index 97ce2d944..000000000 --- a/vendor/golang.org/x/text/currency/format.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package currency - -import ( - "fmt" - "io" - "sort" - - "golang.org/x/text/internal" - "golang.org/x/text/internal/format" - "golang.org/x/text/language" -) - -// Amount is an amount-currency unit pair. -type Amount struct { - amount interface{} // Change to decimal(64|128). - currency Unit -} - -// Currency reports the currency unit of this amount. -func (a Amount) Currency() Unit { return a.currency } - -// TODO: based on decimal type, but may make sense to customize a bit. -// func (a Amount) Decimal() -// func (a Amount) Int() (int64, error) -// func (a Amount) Fraction() (int64, error) -// func (a Amount) Rat() *big.Rat -// func (a Amount) Float() (float64, error) -// func (a Amount) Scale() uint -// func (a Amount) Precision() uint -// func (a Amount) Sign() int -// -// Add/Sub/Div/Mul/Round. - -var space = []byte(" ") - -// Format implements fmt.Formatter. It accepts format.State for -// language-specific rendering. -func (a Amount) Format(s fmt.State, verb rune) { - v := formattedValue{ - currency: a.currency, - amount: a.amount, - format: defaultFormat, - } - v.Format(s, verb) -} - -// formattedValue is currency amount or unit that implements language-sensitive -// formatting. -type formattedValue struct { - currency Unit - amount interface{} // Amount, Unit, or number. - format *options -} - -// Format implements fmt.Formatter. It accepts format.State for -// language-specific rendering. -func (v formattedValue) Format(s fmt.State, verb rune) { - var lang int - if state, ok := s.(format.State); ok { - lang, _ = language.CompactIndex(state.Language()) - } - - // Get the options. Use DefaultFormat if not present. - opt := v.format - if opt == nil { - opt = defaultFormat - } - cur := v.currency - if cur.index == 0 { - cur = opt.currency - } - - // TODO: use pattern. - io.WriteString(s, opt.symbol(lang, cur)) - if v.amount != nil { - s.Write(space) - - // TODO: apply currency-specific rounding - scale, _ := opt.kind.Rounding(cur) - if _, ok := s.Precision(); !ok { - fmt.Fprintf(s, "%.*f", scale, v.amount) - } else { - fmt.Fprint(s, v.amount) - } - } -} - -// Formatter decorates a given number, Unit or Amount with formatting options. -type Formatter func(amount interface{}) formattedValue - -// func (f Formatter) Options(opts ...Option) Formatter - -// TODO: call this a Formatter or FormatFunc? - -var dummy = USD.Amount(0) - -// adjust creates a new Formatter based on the adjustments of fn on f. -func (f Formatter) adjust(fn func(*options)) Formatter { - var o options = *(f(dummy).format) - fn(&o) - return o.format -} - -// Default creates a new Formatter that defaults to currency unit c if a numeric -// value is passed that is not associated with a currency. -func (f Formatter) Default(currency Unit) Formatter { - return f.adjust(func(o *options) { o.currency = currency }) -} - -// Kind sets the kind of the underlying currency unit. -func (f Formatter) Kind(k Kind) Formatter { - return f.adjust(func(o *options) { o.kind = k }) -} - -var defaultFormat *options = ISO(dummy).format - -var ( - // Uses Narrow symbols. Overrides Symbol, if present. - NarrowSymbol Formatter = Formatter(formNarrow) - - // Use Symbols instead of ISO codes, when available. - Symbol Formatter = Formatter(formSymbol) - - // Use ISO code as symbol. - ISO Formatter = Formatter(formISO) - - // TODO: - // // Use full name as symbol. - // Name Formatter -) - -// options configures rendering and rounding options for an Amount. -type options struct { - currency Unit - kind Kind - - symbol func(compactIndex int, c Unit) string -} - -func (o *options) format(amount interface{}) formattedValue { - v := formattedValue{format: o} - switch x := amount.(type) { - case Amount: - v.amount = x.amount - v.currency = x.currency - case *Amount: - v.amount = x.amount - v.currency = x.currency - case Unit: - v.currency = x - case *Unit: - v.currency = *x - default: - if o.currency.index == 0 { - panic("cannot format number without a currency being set") - } - // TODO: Must be a number. - v.amount = x - v.currency = o.currency - } - return v -} - -var ( - optISO = options{symbol: lookupISO} - optSymbol = options{symbol: lookupSymbol} - optNarrow = options{symbol: lookupNarrow} -) - -// These need to be functions, rather than curried methods, as curried methods -// are evaluated at init time, causing tables to be included unconditionally. -func formISO(x interface{}) formattedValue { return optISO.format(x) } -func formSymbol(x interface{}) formattedValue { return optSymbol.format(x) } -func formNarrow(x interface{}) formattedValue { return optNarrow.format(x) } - -func lookupISO(x int, c Unit) string { return c.String() } -func lookupSymbol(x int, c Unit) string { return normalSymbol.lookup(x, c) } -func lookupNarrow(x int, c Unit) string { return narrowSymbol.lookup(x, c) } - -type symbolIndex struct { - index []uint16 // position corresponds with compact index of language. - data []curToIndex -} - -var ( - normalSymbol = symbolIndex{normalLangIndex, normalSymIndex} - narrowSymbol = symbolIndex{narrowLangIndex, narrowSymIndex} -) - -func (x *symbolIndex) lookup(lang int, c Unit) string { - for { - index := x.data[x.index[lang]:x.index[lang+1]] - i := sort.Search(len(index), func(i int) bool { - return index[i].cur >= c.index - }) - if i < len(index) && index[i].cur == c.index { - x := index[i].idx - start := x + 1 - end := start + uint16(symbols[x]) - if start == end { - return c.String() - } - return symbols[start:end] - } - if lang == 0 { - break - } - lang = int(internal.Parent[lang]) - } - return c.String() -} diff --git a/vendor/golang.org/x/text/currency/format_test.go b/vendor/golang.org/x/text/currency/format_test.go deleted file mode 100644 index 0aa0d58af..000000000 --- a/vendor/golang.org/x/text/currency/format_test.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package currency - -import ( - "testing" - - "golang.org/x/text/language" - "golang.org/x/text/message" -) - -var ( - en = language.English - fr = language.French - en_US = language.AmericanEnglish - en_GB = language.BritishEnglish - en_AU = language.MustParse("en-AU") - und = language.Und -) - -func TestFormatting(t *testing.T) { - testCases := []struct { - tag language.Tag - value interface{} - format Formatter - want string - }{ - 0: {en, USD.Amount(0.1), nil, "USD 0.10"}, - 1: {en, XPT.Amount(1.0), Symbol, "XPT 1.00"}, - - 2: {en, USD.Amount(2.0), ISO, "USD 2.00"}, - 3: {und, USD.Amount(3.0), Symbol, "US$ 3.00"}, - 4: {en, USD.Amount(4.0), Symbol, "$ 4.00"}, - - 5: {en, USD.Amount(5.20), NarrowSymbol, "$ 5.20"}, - 6: {en, AUD.Amount(6.20), Symbol, "A$ 6.20"}, - - 7: {en_AU, AUD.Amount(7.20), Symbol, "$ 7.20"}, - 8: {en_GB, USD.Amount(8.20), Symbol, "US$ 8.20"}, - - 9: {en, 9.0, Symbol.Default(EUR), "€ 9.00"}, - 10: {en, 10.123, Symbol.Default(KRW), "₩ 10"}, - 11: {fr, 11.52, Symbol.Default(TWD), "TWD 11.52"}, - 12: {en, 12.123, Symbol.Default(czk), "CZK 12.12"}, - 13: {en, 13.123, Symbol.Default(czk).Kind(Cash), "CZK 13"}, - 14: {en, 14.12345, ISO.Default(MustParseISO("CLF")), "CLF 14.1235"}, - 15: {en, USD.Amount(15.00), ISO.Default(TWD), "USD 15.00"}, - 16: {en, KRW.Amount(16.00), ISO.Kind(Cash), "KRW 16"}, - - // TODO: support integers as well. - - 17: {en, USD, nil, "USD"}, - 18: {en, USD, ISO, "USD"}, - 19: {en, USD, Symbol, "$"}, - 20: {en_GB, USD, Symbol, "US$"}, - 21: {en_AU, USD, NarrowSymbol, "$"}, - } - for i, tc := range testCases { - p := message.NewPrinter(tc.tag) - v := tc.value - if tc.format != nil { - v = tc.format(v) - } - if got := p.Sprint(v); got != tc.want { - t.Errorf("%d: got %q; want %q", i, got, tc.want) - } - } -} diff --git a/vendor/golang.org/x/text/currency/gen.go b/vendor/golang.org/x/text/currency/gen.go deleted file mode 100644 index 0952d4140..000000000 --- a/vendor/golang.org/x/text/currency/gen.go +++ /dev/null @@ -1,400 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Generator for currency-related data. - -package main - -import ( - "flag" - "fmt" - "log" - "os" - "sort" - "strconv" - "strings" - "time" - - "golang.org/x/text/internal" - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/tag" - "golang.org/x/text/language" - "golang.org/x/text/unicode/cldr" -) - -var ( - test = flag.Bool("test", false, - "test existing tables; can be used to compare web data with package data.") - outputFile = flag.String("output", "tables.go", "output file") - - draft = flag.String("draft", - "contributed", - `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) -) - -func main() { - gen.Init() - - gen.Repackage("gen_common.go", "common.go", "currency") - - // Read the CLDR zip file. - r := gen.OpenCLDRCoreZip() - defer r.Close() - - d := &cldr.Decoder{} - d.SetDirFilter("supplemental", "main") - d.SetSectionFilter("numbers") - data, err := d.DecodeZip(r) - if err != nil { - log.Fatalf("DecodeZip: %v", err) - } - - w := gen.NewCodeWriter() - defer w.WriteGoFile(*outputFile, "currency") - - fmt.Fprintln(w, `import "golang.org/x/text/internal/tag"`) - - gen.WriteCLDRVersion(w) - b := &builder{} - b.genCurrencies(w, data.Supplemental()) - b.genSymbols(w, data) -} - -var constants = []string{ - // Undefined and testing. - "XXX", "XTS", - // G11 currencies https://en.wikipedia.org/wiki/G10_currencies. - "USD", "EUR", "JPY", "GBP", "CHF", "AUD", "NZD", "CAD", "SEK", "NOK", "DKK", - // Precious metals. - "XAG", "XAU", "XPT", "XPD", - - // Additional common currencies as defined by CLDR. - "BRL", "CNY", "INR", "RUB", "HKD", "IDR", "KRW", "MXN", "PLN", "SAR", - "THB", "TRY", "TWD", "ZAR", -} - -type builder struct { - currencies tag.Index - numCurrencies int -} - -func (b *builder) genCurrencies(w *gen.CodeWriter, data *cldr.SupplementalData) { - // 3-letter ISO currency codes - // Start with dummy to let index start at 1. - currencies := []string{"\x00\x00\x00\x00"} - - // currency codes - for _, reg := range data.CurrencyData.Region { - for _, cur := range reg.Currency { - currencies = append(currencies, cur.Iso4217) - } - } - // Not included in the list for some reasons: - currencies = append(currencies, "MVP") - - sort.Strings(currencies) - // Unique the elements. - k := 0 - for i := 1; i < len(currencies); i++ { - if currencies[k] != currencies[i] { - currencies[k+1] = currencies[i] - k++ - } - } - currencies = currencies[:k+1] - - // Close with dummy for simpler and faster searching. - currencies = append(currencies, "\xff\xff\xff\xff") - - // Write currency values. - fmt.Fprintln(w, "const (") - for _, c := range constants { - index := sort.SearchStrings(currencies, c) - fmt.Fprintf(w, "\t%s = %d\n", strings.ToLower(c), index) - } - fmt.Fprint(w, ")") - - // Compute currency-related data that we merge into the table. - for _, info := range data.CurrencyData.Fractions[0].Info { - if info.Iso4217 == "DEFAULT" { - continue - } - standard := getRoundingIndex(info.Digits, info.Rounding, 0) - cash := getRoundingIndex(info.CashDigits, info.CashRounding, standard) - - index := sort.SearchStrings(currencies, info.Iso4217) - currencies[index] += mkCurrencyInfo(standard, cash) - } - - // Set default values for entries that weren't touched. - for i, c := range currencies { - if len(c) == 3 { - currencies[i] += mkCurrencyInfo(0, 0) - } - } - - b.currencies = tag.Index(strings.Join(currencies, "")) - w.WriteComment(` - currency holds an alphabetically sorted list of canonical 3-letter currency - identifiers. Each identifier is followed by a byte of type currencyInfo, - defined in gen_common.go.`) - w.WriteConst("currency", b.currencies) - - // Hack alert: gofmt indents a trailing comment after an indented string. - // Ensure that the next thing written is not a comment. - b.numCurrencies = (len(b.currencies) / 4) - 2 - w.WriteConst("numCurrencies", b.numCurrencies) - - // Create a table that maps regions to currencies. - regionToCurrency := []toCurrency{} - - for _, reg := range data.CurrencyData.Region { - if len(reg.Iso3166) != 2 { - log.Fatalf("Unexpected group %q in region data", reg.Iso3166) - } - if len(reg.Currency) == 0 { - continue - } - cur := reg.Currency[0] - if cur.To != "" || cur.Tender == "false" { - continue - } - regionToCurrency = append(regionToCurrency, toCurrency{ - region: regionToCode(language.MustParseRegion(reg.Iso3166)), - code: uint16(b.currencies.Index([]byte(cur.Iso4217))), - }) - } - sort.Sort(byRegion(regionToCurrency)) - - w.WriteType(toCurrency{}) - w.WriteVar("regionToCurrency", regionToCurrency) - - // Create a table that maps regions to currencies. - regionData := []regionInfo{} - - for _, reg := range data.CurrencyData.Region { - if len(reg.Iso3166) != 2 { - log.Fatalf("Unexpected group %q in region data", reg.Iso3166) - } - for _, cur := range reg.Currency { - from, _ := time.Parse("2006-01-02", cur.From) - to, _ := time.Parse("2006-01-02", cur.To) - code := uint16(b.currencies.Index([]byte(cur.Iso4217))) - if cur.Tender == "false" { - code |= nonTenderBit - } - regionData = append(regionData, regionInfo{ - region: regionToCode(language.MustParseRegion(reg.Iso3166)), - code: code, - from: toDate(from), - to: toDate(to), - }) - } - } - sort.Stable(byRegionCode(regionData)) - - w.WriteType(regionInfo{}) - w.WriteVar("regionData", regionData) -} - -type regionInfo struct { - region uint16 - code uint16 // 0x8000 not legal tender - from uint32 - to uint32 -} - -type byRegionCode []regionInfo - -func (a byRegionCode) Len() int { return len(a) } -func (a byRegionCode) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byRegionCode) Less(i, j int) bool { return a[i].region < a[j].region } - -type toCurrency struct { - region uint16 - code uint16 -} - -type byRegion []toCurrency - -func (a byRegion) Len() int { return len(a) } -func (a byRegion) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byRegion) Less(i, j int) bool { return a[i].region < a[j].region } - -func mkCurrencyInfo(standard, cash int) string { - return string([]byte{byte(cash<<cashShift | standard)}) -} - -func getRoundingIndex(digits, rounding string, defIndex int) int { - round := roundings[defIndex] // default - - if digits != "" { - round.scale = parseUint8(digits) - } - if rounding != "" && rounding != "0" { // 0 means 1 here in CLDR - round.increment = parseUint8(rounding) - } - - // Will panic if the entry doesn't exist: - for i, r := range roundings { - if r == round { - return i - } - } - log.Fatalf("Rounding entry %#v does not exist.", round) - panic("unreachable") -} - -// genSymbols generates the symbols used for currencies. Most symbols are -// defined in root and there is only very small variation per language. -// The following rules apply: -// - A symbol can be requested as normal or narrow. -// - If a symbol is not defined for a currency, it defaults to its ISO code. -func (b *builder) genSymbols(w *gen.CodeWriter, data *cldr.CLDR) { - d, err := cldr.ParseDraft(*draft) - if err != nil { - log.Fatalf("filter: %v", err) - } - - const ( - normal = iota - narrow - numTypes - ) - // language -> currency -> type -> symbol - var symbols [language.NumCompactTags][][numTypes]*string - - // Collect symbol information per language. - for _, lang := range data.Locales() { - ldml := data.RawLDML(lang) - if ldml.Numbers == nil || ldml.Numbers.Currencies == nil { - continue - } - - langIndex, ok := language.CompactIndex(language.MustParse(lang)) - if !ok { - log.Fatalf("No compact index for language %s", lang) - } - - symbols[langIndex] = make([][numTypes]*string, b.numCurrencies+1) - - for _, c := range ldml.Numbers.Currencies.Currency { - syms := cldr.MakeSlice(&c.Symbol) - syms.SelectDraft(d) - - for _, sym := range c.Symbol { - v := sym.Data() - if v == c.Type { - // We define "" to mean the ISO symbol. - v = "" - } - cur := b.currencies.Index([]byte(c.Type)) - // XXX gets reassigned to 0 in the package's code. - if c.Type == "XXX" { - cur = 0 - } - if cur == -1 { - fmt.Println("Unsupported:", c.Type) - continue - } - - switch sym.Alt { - case "": - symbols[langIndex][cur][normal] = &v - case "narrow": - symbols[langIndex][cur][narrow] = &v - } - } - } - } - - // Remove values identical to the parent. - for langIndex, data := range symbols { - for curIndex, curs := range data { - for typ, sym := range curs { - if sym == nil { - continue - } - for p := uint16(langIndex); p != 0; { - p = internal.Parent[p] - x := symbols[p] - if x == nil { - continue - } - if v := x[curIndex][typ]; v != nil || p == 0 { - // Value is equal to the default value root value is undefined. - parentSym := "" - if v != nil { - parentSym = *v - } - if parentSym == *sym { - // Value is the same as parent. - data[curIndex][typ] = nil - } - break - } - } - } - } - } - - // Create symbol index. - symbolData := []byte{0} - symbolLookup := map[string]uint16{"": 0} // 0 means default, so block that value. - for _, data := range symbols { - for _, curs := range data { - for _, sym := range curs { - if sym == nil { - continue - } - if _, ok := symbolLookup[*sym]; !ok { - symbolLookup[*sym] = uint16(len(symbolData)) - symbolData = append(symbolData, byte(len(*sym))) - symbolData = append(symbolData, *sym...) - } - } - } - } - w.WriteComment(` - symbols holds symbol data of the form <n> <str>, where n is the length of - the symbol string str.`) - w.WriteConst("symbols", string(symbolData)) - - // Create index from language to currency lookup to symbol. - type curToIndex struct{ cur, idx uint16 } - w.WriteType(curToIndex{}) - - prefix := []string{"normal", "narrow"} - // Create data for regular and narrow symbol data. - for typ := normal; typ <= narrow; typ++ { - - indexes := []curToIndex{} // maps currency to symbol index - languages := []uint16{} - - for _, data := range symbols { - languages = append(languages, uint16(len(indexes))) - for curIndex, curs := range data { - - if sym := curs[typ]; sym != nil { - indexes = append(indexes, curToIndex{uint16(curIndex), symbolLookup[*sym]}) - } - } - } - languages = append(languages, uint16(len(indexes))) - - w.WriteVar(prefix[typ]+"LangIndex", languages) - w.WriteVar(prefix[typ]+"SymIndex", indexes) - } -} -func parseUint8(str string) uint8 { - x, err := strconv.ParseUint(str, 10, 8) - if err != nil { - // Show line number of where this function was called. - log.New(os.Stderr, "", log.Lshortfile).Output(2, err.Error()) - os.Exit(1) - } - return uint8(x) -} diff --git a/vendor/golang.org/x/text/currency/gen_common.go b/vendor/golang.org/x/text/currency/gen_common.go deleted file mode 100644 index e6748da37..000000000 --- a/vendor/golang.org/x/text/currency/gen_common.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "time" - - "golang.org/x/text/language" -) - -// This file contains code common to gen.go and the package code. - -const ( - cashShift = 3 - roundMask = 0x7 - - nonTenderBit = 0x8000 -) - -// currencyInfo contains information about a currency. -// bits 0..2: index into roundings for standard rounding -// bits 3..5: index into roundings for cash rounding -type currencyInfo byte - -// roundingType defines the scale (number of fractional decimals) and increments -// in terms of units of size 10^-scale. For example, for scale == 2 and -// increment == 1, the currency is rounded to units of 0.01. -type roundingType struct { - scale, increment uint8 -} - -// roundings contains rounding data for currencies. This struct is -// created by hand as it is very unlikely to change much. -var roundings = [...]roundingType{ - {2, 1}, // default - {0, 1}, - {1, 1}, - {3, 1}, - {4, 1}, - {2, 5}, // cash rounding alternative -} - -// regionToCode returns a 16-bit region code. Only two-letter codes are -// supported. (Three-letter codes are not needed.) -func regionToCode(r language.Region) uint16 { - if s := r.String(); len(s) == 2 { - return uint16(s[0])<<8 | uint16(s[1]) - } - return 0 -} - -func toDate(t time.Time) uint32 { - y := t.Year() - if y == 1 { - return 0 - } - date := uint32(y) << 4 - date |= uint32(t.Month()) - date <<= 5 - date |= uint32(t.Day()) - return date -} - -func fromDate(date uint32) time.Time { - return time.Date(int(date>>9), time.Month((date>>5)&0xf), int(date&0x1f), 0, 0, 0, 0, time.UTC) -} diff --git a/vendor/golang.org/x/text/currency/query.go b/vendor/golang.org/x/text/currency/query.go deleted file mode 100644 index 7bf9430a6..000000000 --- a/vendor/golang.org/x/text/currency/query.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package currency - -import ( - "sort" - "time" - - "golang.org/x/text/language" -) - -// QueryIter represents a set of Units. The default set includes all Units that -// are currently in use as legal tender in any Region. -type QueryIter interface { - // Next returns true if there is a next element available. - // It must be called before any of the other methods are called. - Next() bool - - // Unit returns the unit of the current iteration. - Unit() Unit - - // Region returns the Region for the current iteration. - Region() language.Region - - // From returns the date from which the unit was used in the region. - // It returns false if this date is unknown. - From() (time.Time, bool) - - // To returns the date up till which the unit was used in the region. - // It returns false if this date is unknown or if the unit is still in use. - To() (time.Time, bool) - - // IsTender reports whether the unit is a legal tender in the region during - // the specified date range. - IsTender() bool -} - -// Query represents a set of Units. The default set includes all Units that are -// currently in use as legal tender in any Region. -func Query(options ...QueryOption) QueryIter { - it := &iter{ - end: len(regionData), - date: 0xFFFFFFFF, - } - for _, fn := range options { - fn(it) - } - return it -} - -// NonTender returns a new query that also includes matching Units that are not -// legal tender. -var NonTender QueryOption = nonTender - -func nonTender(i *iter) { - i.nonTender = true -} - -// Historical selects the units for all dates. -var Historical QueryOption = historical - -func historical(i *iter) { - i.date = hist -} - -// A QueryOption can be used to change the set of unit information returned by -// a query. -type QueryOption func(*iter) - -// Date queries the units that were in use at the given point in history. -func Date(t time.Time) QueryOption { - d := toDate(t) - return func(i *iter) { - i.date = d - } -} - -// Region limits the query to only return entries for the given region. -func Region(r language.Region) QueryOption { - p, end := len(regionData), len(regionData) - x := regionToCode(r) - i := sort.Search(len(regionData), func(i int) bool { - return regionData[i].region >= x - }) - if i < len(regionData) && regionData[i].region == x { - p = i - for i++; i < len(regionData) && regionData[i].region == x; i++ { - } - end = i - } - return func(i *iter) { - i.p, i.end = p, end - } -} - -const ( - hist = 0x00 - now = 0xFFFFFFFF -) - -type iter struct { - *regionInfo - p, end int - date uint32 - nonTender bool -} - -func (i *iter) Next() bool { - for ; i.p < i.end; i.p++ { - i.regionInfo = ®ionData[i.p] - if !i.nonTender && !i.IsTender() { - continue - } - if i.date == hist || (i.from <= i.date && (i.to == 0 || i.date <= i.to)) { - i.p++ - return true - } - } - return false -} - -func (r *regionInfo) Region() language.Region { - // TODO: this could be much faster. - var buf [2]byte - buf[0] = uint8(r.region >> 8) - buf[1] = uint8(r.region) - return language.MustParseRegion(string(buf[:])) -} - -func (r *regionInfo) Unit() Unit { - return Unit{r.code &^ nonTenderBit} -} - -func (r *regionInfo) IsTender() bool { - return r.code&nonTenderBit == 0 -} - -func (r *regionInfo) From() (time.Time, bool) { - if r.from == 0 { - return time.Time{}, false - } - return fromDate(r.from), true -} - -func (r *regionInfo) To() (time.Time, bool) { - if r.to == 0 { - return time.Time{}, false - } - return fromDate(r.to), true -} diff --git a/vendor/golang.org/x/text/currency/query_test.go b/vendor/golang.org/x/text/currency/query_test.go deleted file mode 100644 index 6caea9dbb..000000000 --- a/vendor/golang.org/x/text/currency/query_test.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package currency - -import ( - "testing" - "time" - - "golang.org/x/text/language" -) - -func TestQuery(t *testing.T) { - r := func(region string) language.Region { - return language.MustParseRegion(region) - } - t1800, _ := time.Parse("2006-01-02", "1800-01-01") - type result struct { - region language.Region - unit Unit - isTender bool - from, to string - } - testCases := []struct { - name string - opts []QueryOption - results []result - }{{ - name: "XA", - opts: []QueryOption{Region(r("XA"))}, - results: []result{}, - }, { - name: "AC", - opts: []QueryOption{Region(r("AC"))}, - results: []result{ - {r("AC"), MustParseISO("SHP"), true, "1976-01-01", ""}, - }, - }, { - name: "US", - opts: []QueryOption{Region(r("US"))}, - results: []result{ - {r("US"), MustParseISO("USD"), true, "1792-01-01", ""}, - }, - }, { - name: "US-hist", - opts: []QueryOption{Region(r("US")), Historical}, - results: []result{ - {r("US"), MustParseISO("USD"), true, "1792-01-01", ""}, - }, - }, { - name: "US-non-tender", - opts: []QueryOption{Region(r("US")), NonTender}, - results: []result{ - {r("US"), MustParseISO("USD"), true, "1792-01-01", ""}, - {r("US"), MustParseISO("USN"), false, "", ""}, - }, - }, { - name: "US-historical+non-tender", - opts: []QueryOption{Region(r("US")), Historical, NonTender}, - results: []result{ - {r("US"), MustParseISO("USD"), true, "1792-01-01", ""}, - {r("US"), MustParseISO("USN"), false, "", ""}, - {r("US"), MustParseISO("USS"), false, "", "2014-03-01"}, - }, - }, { - name: "1800", - opts: []QueryOption{Date(t1800)}, - results: []result{ - {r("CH"), MustParseISO("CHF"), true, "1799-03-17", ""}, - {r("GB"), MustParseISO("GBP"), true, "1694-07-27", ""}, - {r("GI"), MustParseISO("GIP"), true, "1713-01-01", ""}, - // The date for IE and PR seem wrong, so these may be updated at - // some point causing the tests to fail. - {r("IE"), MustParseISO("GBP"), true, "1800-01-01", "1922-01-01"}, - {r("PR"), MustParseISO("ESP"), true, "1800-01-01", "1898-12-10"}, - {r("US"), MustParseISO("USD"), true, "1792-01-01", ""}, - }, - }} - for _, tc := range testCases { - n := 0 - for it := Query(tc.opts...); it.Next(); n++ { - if n < len(tc.results) { - got := result{ - it.Region(), - it.Unit(), - it.IsTender(), - getTime(it.From()), - getTime(it.To()), - } - if got != tc.results[n] { - t.Errorf("%s:%d: got %v; want %v", tc.name, n, got, tc.results[n]) - } - } - } - if n != len(tc.results) { - t.Errorf("%s: unexpected number of results: got %d; want %d", tc.name, n, len(tc.results)) - } - } -} - -func getTime(t time.Time, ok bool) string { - if !ok { - return "" - } - return t.Format("2006-01-02") -} diff --git a/vendor/golang.org/x/text/currency/tables.go b/vendor/golang.org/x/text/currency/tables.go deleted file mode 100644 index bb3cb70ba..000000000 --- a/vendor/golang.org/x/text/currency/tables.go +++ /dev/null @@ -1,2574 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package currency - -import "golang.org/x/text/internal/tag" - -// CLDRVersion is the CLDR version from which the tables in this package are derived. -const CLDRVersion = "31" - -const ( - xxx = 283 - xts = 281 - usd = 250 - eur = 93 - jpy = 132 - gbp = 98 - chf = 61 - aud = 19 - nzd = 191 - cad = 58 - sek = 218 - nok = 189 - dkk = 81 - xag = 264 - xau = 265 - xpt = 278 - xpd = 276 - brl = 46 - cny = 67 - inr = 124 - rub = 209 - hkd = 113 - idr = 119 - krw = 140 - mxn = 177 - pln = 200 - sar = 212 - thb = 233 - try = 242 - twd = 244 - zar = 291 -) - -// currency holds an alphabetically sorted list of canonical 3-letter currency -// identifiers. Each identifier is followed by a byte of type currencyInfo, -// defined in gen_common.go. -const currency tag.Index = "" + // Size: 1200 bytes - "\x00\x00\x00\x00ADP\x09AED\x00AFA\x00AFN\x09ALK\x00ALL\x09AMD\x09ANG\x00" + - "AOA\x00AOK\x00AON\x00AOR\x00ARA\x00ARL\x00ARM\x00ARP\x00ARS\x00ATS\x00AU" + - "D\x00AWG\x00AZM\x00AZN\x00BAD\x00BAM\x00BAN\x00BBD\x00BDT\x00BEC\x00BEF" + - "\x00BEL\x00BGL\x00BGM\x00BGN\x00BGO\x00BHD\x1bBIF\x09BMD\x00BND\x00BOB" + - "\x00BOL\x00BOP\x00BOV\x00BRB\x00BRC\x00BRE\x00BRL\x00BRN\x00BRR\x00BRZ" + - "\x00BSD\x00BTN\x00BUK\x00BWP\x00BYB\x00BYN\x00BYR\x09BZD\x00CAD(CDF\x00C" + - "HE\x00CHF(CHW\x00CLE\x00CLF$CLP\x09CNX\x00CNY\x00COP\x09COU\x00CRC\x08CS" + - "D\x00CSK\x00CUC\x00CUP\x00CVE\x00CYP\x00CZK\x08DDM\x00DEM\x00DJF\x09DKK" + - "\x00DOP\x00DZD\x00ECS\x00ECV\x00EEK\x00EGP\x00ERN\x00ESA\x00ESB\x00ESP" + - "\x09ETB\x00EUR\x00FIM\x00FJD\x00FKP\x00FRF\x00GBP\x00GEK\x00GEL\x00GHC" + - "\x00GHS\x00GIP\x00GMD\x00GNF\x09GNS\x00GQE\x00GRD\x00GTQ\x00GWE\x00GWP" + - "\x00GYD\x09HKD\x00HNL\x00HRD\x00HRK\x00HTG\x00HUF\x08IDR\x09IEP\x00ILP" + - "\x00ILR\x00ILS\x00INR\x00IQD\x09IRR\x09ISJ\x00ISK\x09ITL\x09JMD\x00JOD" + - "\x1bJPY\x09KES\x00KGS\x00KHR\x00KMF\x09KPW\x09KRH\x00KRO\x00KRW\x09KWD" + - "\x1bKYD\x00KZT\x00LAK\x09LBP\x09LKR\x00LRD\x00LSL\x00LTL\x00LTT\x00LUC" + - "\x00LUF\x09LUL\x00LVL\x00LVR\x00LYD\x1bMAD\x00MAF\x00MCF\x00MDC\x00MDL" + - "\x00MGA\x09MGF\x09MKD\x00MKN\x00MLF\x00MMK\x09MNT\x09MOP\x00MRO\x09MTL" + - "\x00MTP\x00MUR\x09MVP\x00MVR\x00MWK\x00MXN\x00MXP\x00MXV\x00MYR\x00MZE" + - "\x00MZM\x00MZN\x00NAD\x00NGN\x00NIC\x00NIO\x00NLG\x00NOK\x00NPR\x00NZD" + - "\x00OMR\x1bPAB\x00PEI\x00PEN\x00PES\x00PGK\x00PHP\x00PKR\x09PLN\x00PLZ" + - "\x00PTE\x00PYG\x09QAR\x00RHD\x00ROL\x00RON\x00RSD\x09RUB\x00RUR\x00RWF" + - "\x09SAR\x00SBD\x00SCR\x00SDD\x00SDG\x00SDP\x00SEK\x00SGD\x00SHP\x00SIT" + - "\x00SKK\x00SLL\x09SOS\x09SRD\x00SRG\x00SSP\x00STD\x09SUR\x00SVC\x00SYP" + - "\x09SZL\x00THB\x00TJR\x00TJS\x00TMM\x09TMT\x00TND\x1bTOP\x00TPE\x00TRL" + - "\x09TRY\x00TTD\x00TWD\x08TZS\x09UAH\x00UAK\x00UGS\x00UGX\x09USD\x00USN" + - "\x00USS\x00UYI\x09UYP\x00UYU\x00UZS\x09VEB\x00VEF\x00VND\x09VNN\x00VUV" + - "\x09WST\x00XAF\x09XAG\x00XAU\x00XBA\x00XBB\x00XBC\x00XBD\x00XCD\x00XDR" + - "\x00XEU\x00XFO\x00XFU\x00XOF\x09XPD\x00XPF\x09XPT\x00XRE\x00XSU\x00XTS" + - "\x00XUA\x00XXX\x00YDD\x00YER\x09YUD\x00YUM\x00YUN\x00YUR\x00ZAL\x00ZAR" + - "\x00ZMK\x09ZMW\x00ZRN\x00ZRZ\x00ZWD\x09ZWL\x00ZWR\x00\xff\xff\xff\xff" - -const numCurrencies = 298 - -type toCurrency struct { - region uint16 - code uint16 -} - -var regionToCurrency = []toCurrency{ // 255 elements - 0: {region: 0x4143, code: 0xdc}, - 1: {region: 0x4144, code: 0x5d}, - 2: {region: 0x4145, code: 0x2}, - 3: {region: 0x4146, code: 0x4}, - 4: {region: 0x4147, code: 0x10e}, - 5: {region: 0x4149, code: 0x10e}, - 6: {region: 0x414c, code: 0x6}, - 7: {region: 0x414d, code: 0x7}, - 8: {region: 0x414f, code: 0x9}, - 9: {region: 0x4152, code: 0x11}, - 10: {region: 0x4153, code: 0xfa}, - 11: {region: 0x4154, code: 0x5d}, - 12: {region: 0x4155, code: 0x13}, - 13: {region: 0x4157, code: 0x14}, - 14: {region: 0x4158, code: 0x5d}, - 15: {region: 0x415a, code: 0x16}, - 16: {region: 0x4241, code: 0x18}, - 17: {region: 0x4242, code: 0x1a}, - 18: {region: 0x4244, code: 0x1b}, - 19: {region: 0x4245, code: 0x5d}, - 20: {region: 0x4246, code: 0x113}, - 21: {region: 0x4247, code: 0x21}, - 22: {region: 0x4248, code: 0x23}, - 23: {region: 0x4249, code: 0x24}, - 24: {region: 0x424a, code: 0x113}, - 25: {region: 0x424c, code: 0x5d}, - 26: {region: 0x424d, code: 0x25}, - 27: {region: 0x424e, code: 0x26}, - 28: {region: 0x424f, code: 0x27}, - 29: {region: 0x4251, code: 0xfa}, - 30: {region: 0x4252, code: 0x2e}, - 31: {region: 0x4253, code: 0x32}, - 32: {region: 0x4254, code: 0x33}, - 33: {region: 0x4256, code: 0xbd}, - 34: {region: 0x4257, code: 0x35}, - 35: {region: 0x4259, code: 0x37}, - 36: {region: 0x425a, code: 0x39}, - 37: {region: 0x4341, code: 0x3a}, - 38: {region: 0x4343, code: 0x13}, - 39: {region: 0x4344, code: 0x3b}, - 40: {region: 0x4346, code: 0x107}, - 41: {region: 0x4347, code: 0x107}, - 42: {region: 0x4348, code: 0x3d}, - 43: {region: 0x4349, code: 0x113}, - 44: {region: 0x434b, code: 0xbf}, - 45: {region: 0x434c, code: 0x41}, - 46: {region: 0x434d, code: 0x107}, - 47: {region: 0x434e, code: 0x43}, - 48: {region: 0x434f, code: 0x44}, - 49: {region: 0x4352, code: 0x46}, - 50: {region: 0x4355, code: 0x4a}, - 51: {region: 0x4356, code: 0x4b}, - 52: {region: 0x4357, code: 0x8}, - 53: {region: 0x4358, code: 0x13}, - 54: {region: 0x4359, code: 0x5d}, - 55: {region: 0x435a, code: 0x4d}, - 56: {region: 0x4445, code: 0x5d}, - 57: {region: 0x4447, code: 0xfa}, - 58: {region: 0x444a, code: 0x50}, - 59: {region: 0x444b, code: 0x51}, - 60: {region: 0x444d, code: 0x10e}, - 61: {region: 0x444f, code: 0x52}, - 62: {region: 0x445a, code: 0x53}, - 63: {region: 0x4541, code: 0x5d}, - 64: {region: 0x4543, code: 0xfa}, - 65: {region: 0x4545, code: 0x5d}, - 66: {region: 0x4547, code: 0x57}, - 67: {region: 0x4548, code: 0x9d}, - 68: {region: 0x4552, code: 0x58}, - 69: {region: 0x4553, code: 0x5d}, - 70: {region: 0x4554, code: 0x5c}, - 71: {region: 0x4555, code: 0x5d}, - 72: {region: 0x4649, code: 0x5d}, - 73: {region: 0x464a, code: 0x5f}, - 74: {region: 0x464b, code: 0x60}, - 75: {region: 0x464d, code: 0xfa}, - 76: {region: 0x464f, code: 0x51}, - 77: {region: 0x4652, code: 0x5d}, - 78: {region: 0x4741, code: 0x107}, - 79: {region: 0x4742, code: 0x62}, - 80: {region: 0x4744, code: 0x10e}, - 81: {region: 0x4745, code: 0x64}, - 82: {region: 0x4746, code: 0x5d}, - 83: {region: 0x4747, code: 0x62}, - 84: {region: 0x4748, code: 0x66}, - 85: {region: 0x4749, code: 0x67}, - 86: {region: 0x474c, code: 0x51}, - 87: {region: 0x474d, code: 0x68}, - 88: {region: 0x474e, code: 0x69}, - 89: {region: 0x4750, code: 0x5d}, - 90: {region: 0x4751, code: 0x107}, - 91: {region: 0x4752, code: 0x5d}, - 92: {region: 0x4753, code: 0x62}, - 93: {region: 0x4754, code: 0x6d}, - 94: {region: 0x4755, code: 0xfa}, - 95: {region: 0x4757, code: 0x113}, - 96: {region: 0x4759, code: 0x70}, - 97: {region: 0x484b, code: 0x71}, - 98: {region: 0x484d, code: 0x13}, - 99: {region: 0x484e, code: 0x72}, - 100: {region: 0x4852, code: 0x74}, - 101: {region: 0x4854, code: 0x75}, - 102: {region: 0x4855, code: 0x76}, - 103: {region: 0x4943, code: 0x5d}, - 104: {region: 0x4944, code: 0x77}, - 105: {region: 0x4945, code: 0x5d}, - 106: {region: 0x494c, code: 0x7b}, - 107: {region: 0x494d, code: 0x62}, - 108: {region: 0x494e, code: 0x7c}, - 109: {region: 0x494f, code: 0xfa}, - 110: {region: 0x4951, code: 0x7d}, - 111: {region: 0x4952, code: 0x7e}, - 112: {region: 0x4953, code: 0x80}, - 113: {region: 0x4954, code: 0x5d}, - 114: {region: 0x4a45, code: 0x62}, - 115: {region: 0x4a4d, code: 0x82}, - 116: {region: 0x4a4f, code: 0x83}, - 117: {region: 0x4a50, code: 0x84}, - 118: {region: 0x4b45, code: 0x85}, - 119: {region: 0x4b47, code: 0x86}, - 120: {region: 0x4b48, code: 0x87}, - 121: {region: 0x4b49, code: 0x13}, - 122: {region: 0x4b4d, code: 0x88}, - 123: {region: 0x4b4e, code: 0x10e}, - 124: {region: 0x4b50, code: 0x89}, - 125: {region: 0x4b52, code: 0x8c}, - 126: {region: 0x4b57, code: 0x8d}, - 127: {region: 0x4b59, code: 0x8e}, - 128: {region: 0x4b5a, code: 0x8f}, - 129: {region: 0x4c41, code: 0x90}, - 130: {region: 0x4c42, code: 0x91}, - 131: {region: 0x4c43, code: 0x10e}, - 132: {region: 0x4c49, code: 0x3d}, - 133: {region: 0x4c4b, code: 0x92}, - 134: {region: 0x4c52, code: 0x93}, - 135: {region: 0x4c53, code: 0x123}, - 136: {region: 0x4c54, code: 0x5d}, - 137: {region: 0x4c55, code: 0x5d}, - 138: {region: 0x4c56, code: 0x5d}, - 139: {region: 0x4c59, code: 0x9c}, - 140: {region: 0x4d41, code: 0x9d}, - 141: {region: 0x4d43, code: 0x5d}, - 142: {region: 0x4d44, code: 0xa1}, - 143: {region: 0x4d45, code: 0x5d}, - 144: {region: 0x4d46, code: 0x5d}, - 145: {region: 0x4d47, code: 0xa2}, - 146: {region: 0x4d48, code: 0xfa}, - 147: {region: 0x4d4b, code: 0xa4}, - 148: {region: 0x4d4c, code: 0x113}, - 149: {region: 0x4d4d, code: 0xa7}, - 150: {region: 0x4d4e, code: 0xa8}, - 151: {region: 0x4d4f, code: 0xa9}, - 152: {region: 0x4d50, code: 0xfa}, - 153: {region: 0x4d51, code: 0x5d}, - 154: {region: 0x4d52, code: 0xaa}, - 155: {region: 0x4d53, code: 0x10e}, - 156: {region: 0x4d54, code: 0x5d}, - 157: {region: 0x4d55, code: 0xad}, - 158: {region: 0x4d56, code: 0xaf}, - 159: {region: 0x4d57, code: 0xb0}, - 160: {region: 0x4d58, code: 0xb1}, - 161: {region: 0x4d59, code: 0xb4}, - 162: {region: 0x4d5a, code: 0xb7}, - 163: {region: 0x4e41, code: 0xb8}, - 164: {region: 0x4e43, code: 0x115}, - 165: {region: 0x4e45, code: 0x113}, - 166: {region: 0x4e46, code: 0x13}, - 167: {region: 0x4e47, code: 0xb9}, - 168: {region: 0x4e49, code: 0xbb}, - 169: {region: 0x4e4c, code: 0x5d}, - 170: {region: 0x4e4f, code: 0xbd}, - 171: {region: 0x4e50, code: 0xbe}, - 172: {region: 0x4e52, code: 0x13}, - 173: {region: 0x4e55, code: 0xbf}, - 174: {region: 0x4e5a, code: 0xbf}, - 175: {region: 0x4f4d, code: 0xc0}, - 176: {region: 0x5041, code: 0xc1}, - 177: {region: 0x5045, code: 0xc3}, - 178: {region: 0x5046, code: 0x115}, - 179: {region: 0x5047, code: 0xc5}, - 180: {region: 0x5048, code: 0xc6}, - 181: {region: 0x504b, code: 0xc7}, - 182: {region: 0x504c, code: 0xc8}, - 183: {region: 0x504d, code: 0x5d}, - 184: {region: 0x504e, code: 0xbf}, - 185: {region: 0x5052, code: 0xfa}, - 186: {region: 0x5053, code: 0x7b}, - 187: {region: 0x5054, code: 0x5d}, - 188: {region: 0x5057, code: 0xfa}, - 189: {region: 0x5059, code: 0xcb}, - 190: {region: 0x5141, code: 0xcc}, - 191: {region: 0x5245, code: 0x5d}, - 192: {region: 0x524f, code: 0xcf}, - 193: {region: 0x5253, code: 0xd0}, - 194: {region: 0x5255, code: 0xd1}, - 195: {region: 0x5257, code: 0xd3}, - 196: {region: 0x5341, code: 0xd4}, - 197: {region: 0x5342, code: 0xd5}, - 198: {region: 0x5343, code: 0xd6}, - 199: {region: 0x5344, code: 0xd8}, - 200: {region: 0x5345, code: 0xda}, - 201: {region: 0x5347, code: 0xdb}, - 202: {region: 0x5348, code: 0xdc}, - 203: {region: 0x5349, code: 0x5d}, - 204: {region: 0x534a, code: 0xbd}, - 205: {region: 0x534b, code: 0x5d}, - 206: {region: 0x534c, code: 0xdf}, - 207: {region: 0x534d, code: 0x5d}, - 208: {region: 0x534e, code: 0x113}, - 209: {region: 0x534f, code: 0xe0}, - 210: {region: 0x5352, code: 0xe1}, - 211: {region: 0x5353, code: 0xe3}, - 212: {region: 0x5354, code: 0xe4}, - 213: {region: 0x5356, code: 0xfa}, - 214: {region: 0x5358, code: 0x8}, - 215: {region: 0x5359, code: 0xe7}, - 216: {region: 0x535a, code: 0xe8}, - 217: {region: 0x5441, code: 0x62}, - 218: {region: 0x5443, code: 0xfa}, - 219: {region: 0x5444, code: 0x107}, - 220: {region: 0x5446, code: 0x5d}, - 221: {region: 0x5447, code: 0x113}, - 222: {region: 0x5448, code: 0xe9}, - 223: {region: 0x544a, code: 0xeb}, - 224: {region: 0x544b, code: 0xbf}, - 225: {region: 0x544c, code: 0xfa}, - 226: {region: 0x544d, code: 0xed}, - 227: {region: 0x544e, code: 0xee}, - 228: {region: 0x544f, code: 0xef}, - 229: {region: 0x5452, code: 0xf2}, - 230: {region: 0x5454, code: 0xf3}, - 231: {region: 0x5456, code: 0x13}, - 232: {region: 0x5457, code: 0xf4}, - 233: {region: 0x545a, code: 0xf5}, - 234: {region: 0x5541, code: 0xf6}, - 235: {region: 0x5547, code: 0xf9}, - 236: {region: 0x554d, code: 0xfa}, - 237: {region: 0x5553, code: 0xfa}, - 238: {region: 0x5559, code: 0xff}, - 239: {region: 0x555a, code: 0x100}, - 240: {region: 0x5641, code: 0x5d}, - 241: {region: 0x5643, code: 0x10e}, - 242: {region: 0x5645, code: 0x102}, - 243: {region: 0x5647, code: 0xfa}, - 244: {region: 0x5649, code: 0xfa}, - 245: {region: 0x564e, code: 0x103}, - 246: {region: 0x5655, code: 0x105}, - 247: {region: 0x5746, code: 0x115}, - 248: {region: 0x5753, code: 0x106}, - 249: {region: 0x584b, code: 0x5d}, - 250: {region: 0x5945, code: 0x11d}, - 251: {region: 0x5954, code: 0x5d}, - 252: {region: 0x5a41, code: 0x123}, - 253: {region: 0x5a4d, code: 0x125}, - 254: {region: 0x5a57, code: 0xfa}, -} // Size: 1044 bytes - -type regionInfo struct { - region uint16 - code uint16 - from uint32 - to uint32 -} - -var regionData = []regionInfo{ // 493 elements - 0: {region: 0x4143, code: 0xdc, from: 0xf7021, to: 0x0}, - 1: {region: 0x4144, code: 0x5d, from: 0xf9e21, to: 0x0}, - 2: {region: 0x4144, code: 0x5b, from: 0xea221, to: 0xfa45c}, - 3: {region: 0x4144, code: 0x61, from: 0xf5021, to: 0xfa451}, - 4: {region: 0x4144, code: 0x1, from: 0xf2021, to: 0xfa39f}, - 5: {region: 0x4145, code: 0x2, from: 0xf6ab3, to: 0x0}, - 6: {region: 0x4146, code: 0x4, from: 0xfa547, to: 0x0}, - 7: {region: 0x4146, code: 0x3, from: 0xf0e6e, to: 0xfa59f}, - 8: {region: 0x4147, code: 0x10e, from: 0xf5b46, to: 0x0}, - 9: {region: 0x4149, code: 0x10e, from: 0xf5b46, to: 0x0}, - 10: {region: 0x414c, code: 0x6, from: 0xf5b10, to: 0x0}, - 11: {region: 0x414c, code: 0x5, from: 0xf3561, to: 0xf5b10}, - 12: {region: 0x414d, code: 0x7, from: 0xf9376, to: 0x0}, - 13: {region: 0x414d, code: 0xd2, from: 0xf8f99, to: 0xf9376}, - 14: {region: 0x414d, code: 0xe5, from: 0xf5221, to: 0xf8f99}, - 15: {region: 0x414f, code: 0x9, from: 0xf9f8d, to: 0x0}, - 16: {region: 0x414f, code: 0xc, from: 0xf96e1, to: 0xfa041}, - 17: {region: 0x414f, code: 0xb, from: 0xf8d39, to: 0xfa041}, - 18: {region: 0x414f, code: 0xa, from: 0xf7228, to: 0xf8e61}, - 19: {region: 0x4151, code: 0x811b, from: 0x0, to: 0x0}, - 20: {region: 0x4152, code: 0x11, from: 0xf9021, to: 0x0}, - 21: {region: 0x4152, code: 0xd, from: 0xf82ce, to: 0xf9021}, - 22: {region: 0x4152, code: 0x10, from: 0xf7ec1, to: 0xf82ce}, - 23: {region: 0x4152, code: 0xe, from: 0xf6421, to: 0xf7ec1}, - 24: {region: 0x4152, code: 0xf, from: 0xeb365, to: 0xf6421}, - 25: {region: 0x4153, code: 0xfa, from: 0xee0f0, to: 0x0}, - 26: {region: 0x4154, code: 0x5d, from: 0xf9e21, to: 0x0}, - 27: {region: 0x4154, code: 0x12, from: 0xf3784, to: 0xfa45c}, - 28: {region: 0x4155, code: 0x13, from: 0xf5c4e, to: 0x0}, - 29: {region: 0x4157, code: 0x14, from: 0xf8421, to: 0x0}, - 30: {region: 0x4157, code: 0x8, from: 0xf28aa, to: 0xf8421}, - 31: {region: 0x4158, code: 0x5d, from: 0xf9e21, to: 0x0}, - 32: {region: 0x415a, code: 0x16, from: 0xfac21, to: 0x0}, - 33: {region: 0x415a, code: 0x15, from: 0xf9376, to: 0xfad9f}, - 34: {region: 0x415a, code: 0xd2, from: 0xf8f99, to: 0xf9421}, - 35: {region: 0x415a, code: 0xe5, from: 0xf5221, to: 0xf8f99}, - 36: {region: 0x4241, code: 0x18, from: 0xf9621, to: 0x0}, - 37: {region: 0x4241, code: 0x19, from: 0xf950f, to: 0xf9ae1}, - 38: {region: 0x4241, code: 0x17, from: 0xf90e1, to: 0xf950f}, - 39: {region: 0x4241, code: 0x121, from: 0xf90e1, to: 0xf9341}, - 40: {region: 0x4241, code: 0x120, from: 0xf8c21, to: 0xf90e1}, - 41: {region: 0x4241, code: 0x11e, from: 0xf5c21, to: 0xf8c21}, - 42: {region: 0x4242, code: 0x1a, from: 0xf6b83, to: 0x0}, - 43: {region: 0x4242, code: 0x10e, from: 0xf5b46, to: 0xf6b83}, - 44: {region: 0x4244, code: 0x1b, from: 0xf6821, to: 0x0}, - 45: {region: 0x4244, code: 0xc7, from: 0xf3881, to: 0xf6821}, - 46: {region: 0x4244, code: 0x7c, from: 0xe5711, to: 0xf3881}, - 47: {region: 0x4245, code: 0x5d, from: 0xf9e21, to: 0x0}, - 48: {region: 0x4245, code: 0x1d, from: 0xe4e47, to: 0xfa45c}, - 49: {region: 0x4245, code: 0xbc, from: 0xe318f, to: 0xe4e47}, - 50: {region: 0x4245, code: 0x801e, from: 0xf6421, to: 0xf8c65}, - 51: {region: 0x4245, code: 0x801c, from: 0xf6421, to: 0xf8c65}, - 52: {region: 0x4246, code: 0x113, from: 0xf8104, to: 0x0}, - 53: {region: 0x4247, code: 0x21, from: 0xf9ee5, to: 0x0}, - 54: {region: 0x4247, code: 0x1f, from: 0xf5421, to: 0xf9ee5}, - 55: {region: 0x4247, code: 0x20, from: 0xf40ac, to: 0xf5421}, - 56: {region: 0x4247, code: 0x22, from: 0xeaee8, to: 0xf40ac}, - 57: {region: 0x4248, code: 0x23, from: 0xf5b50, to: 0x0}, - 58: {region: 0x4249, code: 0x24, from: 0xf58b3, to: 0x0}, - 59: {region: 0x424a, code: 0x113, from: 0xf6f7e, to: 0x0}, - 60: {region: 0x424c, code: 0x5d, from: 0xf9e21, to: 0x0}, - 61: {region: 0x424c, code: 0x61, from: 0xf5021, to: 0xfa451}, - 62: {region: 0x424d, code: 0x25, from: 0xf6446, to: 0x0}, - 63: {region: 0x424e, code: 0x26, from: 0xf5ecc, to: 0x0}, - 64: {region: 0x424e, code: 0xb4, from: 0xf5730, to: 0xf5ecc}, - 65: {region: 0x424f, code: 0x27, from: 0xf8621, to: 0x0}, - 66: {region: 0x424f, code: 0x29, from: 0xf5621, to: 0xf859f}, - 67: {region: 0x424f, code: 0x28, from: 0xe8ed7, to: 0xf5621}, - 68: {region: 0x424f, code: 0x802a, from: 0x0, to: 0x0}, - 69: {region: 0x4251, code: 0xfa, from: 0xfb621, to: 0x0}, - 70: {region: 0x4251, code: 0x8, from: 0xfb54a, to: 0xfb621}, - 71: {region: 0x4252, code: 0x2e, from: 0xf94e1, to: 0x0}, - 72: {region: 0x4252, code: 0x30, from: 0xf9301, to: 0xf94e1}, - 73: {region: 0x4252, code: 0x2d, from: 0xf8c70, to: 0xf9301}, - 74: {region: 0x4252, code: 0x2f, from: 0xf8a2f, to: 0xf8c70}, - 75: {region: 0x4252, code: 0x2c, from: 0xf845c, to: 0xf8a2f}, - 76: {region: 0x4252, code: 0x2b, from: 0xf5e4d, to: 0xf845c}, - 77: {region: 0x4252, code: 0x31, from: 0xf2d61, to: 0xf5e4d}, - 78: {region: 0x4253, code: 0x32, from: 0xf5cb9, to: 0x0}, - 79: {region: 0x4254, code: 0x33, from: 0xf6c90, to: 0x0}, - 80: {region: 0x4254, code: 0x7c, from: 0xee621, to: 0x0}, - 81: {region: 0x4255, code: 0x34, from: 0xf40e1, to: 0xf8ad2}, - 82: {region: 0x4256, code: 0xbd, from: 0xee2c7, to: 0x0}, - 83: {region: 0x4257, code: 0x35, from: 0xf7117, to: 0x0}, - 84: {region: 0x4257, code: 0x123, from: 0xf524e, to: 0xf7117}, - 85: {region: 0x4259, code: 0x37, from: 0xfc0e1, to: 0x0}, - 86: {region: 0x4259, code: 0x38, from: 0xfa021, to: 0xfc221}, - 87: {region: 0x4259, code: 0x36, from: 0xf9501, to: 0xfa19f}, - 88: {region: 0x4259, code: 0xd2, from: 0xf8f99, to: 0xf9568}, - 89: {region: 0x4259, code: 0xe5, from: 0xf5221, to: 0xf8f99}, - 90: {region: 0x425a, code: 0x39, from: 0xf6c21, to: 0x0}, - 91: {region: 0x4341, code: 0x3a, from: 0xe8421, to: 0x0}, - 92: {region: 0x4343, code: 0x13, from: 0xf5c4e, to: 0x0}, - 93: {region: 0x4344, code: 0x3b, from: 0xf9ce1, to: 0x0}, - 94: {region: 0x4344, code: 0x126, from: 0xf9361, to: 0xf9ce1}, - 95: {region: 0x4344, code: 0x127, from: 0xf675b, to: 0xf9361}, - 96: {region: 0x4346, code: 0x107, from: 0xf9221, to: 0x0}, - 97: {region: 0x4347, code: 0x107, from: 0xf9221, to: 0x0}, - 98: {region: 0x4348, code: 0x3d, from: 0xe0e71, to: 0x0}, - 99: {region: 0x4348, code: 0x803c, from: 0x0, to: 0x0}, - 100: {region: 0x4348, code: 0x803e, from: 0x0, to: 0x0}, - 101: {region: 0x4349, code: 0x113, from: 0xf4d84, to: 0x0}, - 102: {region: 0x434b, code: 0xbf, from: 0xf5eea, to: 0x0}, - 103: {region: 0x434c, code: 0x41, from: 0xf6f3d, to: 0x0}, - 104: {region: 0x434c, code: 0x3f, from: 0xf5021, to: 0xf6f3d}, - 105: {region: 0x434c, code: 0x8040, from: 0x0, to: 0x0}, - 106: {region: 0x434d, code: 0x107, from: 0xf6a81, to: 0x0}, - 107: {region: 0x434e, code: 0x43, from: 0xf4261, to: 0x0}, - 108: {region: 0x434e, code: 0x8042, from: 0xf7621, to: 0xf9d9f}, - 109: {region: 0x434f, code: 0x44, from: 0xee221, to: 0x0}, - 110: {region: 0x434f, code: 0x8045, from: 0x0, to: 0x0}, - 111: {region: 0x4350, code: 0x811b, from: 0x0, to: 0x0}, - 112: {region: 0x4352, code: 0x46, from: 0xed15a, to: 0x0}, - 113: {region: 0x4353, code: 0x47, from: 0xfa4af, to: 0xfacc3}, - 114: {region: 0x4353, code: 0x5d, from: 0xfa644, to: 0xfacc3}, - 115: {region: 0x4353, code: 0x11f, from: 0xf9438, to: 0xfa4af}, - 116: {region: 0x4355, code: 0x4a, from: 0xe8621, to: 0x0}, - 117: {region: 0x4355, code: 0x49, from: 0xf9421, to: 0x0}, - 118: {region: 0x4355, code: 0xfa, from: 0xed621, to: 0xf4e21}, - 119: {region: 0x4356, code: 0x4b, from: 0xef421, to: 0x0}, - 120: {region: 0x4356, code: 0xca, from: 0xeeeb6, to: 0xf6ee5}, - 121: {region: 0x4357, code: 0x8, from: 0xfb54a, to: 0x0}, - 122: {region: 0x4358, code: 0x13, from: 0xf5c4e, to: 0x0}, - 123: {region: 0x4359, code: 0x5d, from: 0xfb021, to: 0x0}, - 124: {region: 0x4359, code: 0x4c, from: 0xef52a, to: 0xfb03f}, - 125: {region: 0x435a, code: 0x4d, from: 0xf9221, to: 0x0}, - 126: {region: 0x435a, code: 0x48, from: 0xf42c1, to: 0xf9261}, - 127: {region: 0x4444, code: 0x4e, from: 0xf38f4, to: 0xf8d42}, - 128: {region: 0x4445, code: 0x5d, from: 0xf9e21, to: 0x0}, - 129: {region: 0x4445, code: 0x4f, from: 0xf38d4, to: 0xfa45c}, - 130: {region: 0x4447, code: 0xfa, from: 0xf5b68, to: 0x0}, - 131: {region: 0x444a, code: 0x50, from: 0xf72db, to: 0x0}, - 132: {region: 0x444b, code: 0x51, from: 0xea2bb, to: 0x0}, - 133: {region: 0x444d, code: 0x10e, from: 0xf5b46, to: 0x0}, - 134: {region: 0x444f, code: 0x52, from: 0xf3741, to: 0x0}, - 135: {region: 0x444f, code: 0xfa, from: 0xee2d5, to: 0xf3741}, - 136: {region: 0x445a, code: 0x53, from: 0xf5881, to: 0x0}, - 137: {region: 0x4541, code: 0x5d, from: 0xf9e21, to: 0x0}, - 138: {region: 0x4543, code: 0xfa, from: 0xfa142, to: 0x0}, - 139: {region: 0x4543, code: 0x54, from: 0xeb881, to: 0xfa142}, - 140: {region: 0x4543, code: 0x8055, from: 0xf92b7, to: 0xfa029}, - 141: {region: 0x4545, code: 0x5d, from: 0xfb621, to: 0x0}, - 142: {region: 0x4545, code: 0x56, from: 0xf90d5, to: 0xfb59f}, - 143: {region: 0x4545, code: 0xe5, from: 0xf5221, to: 0xf90d4}, - 144: {region: 0x4547, code: 0x57, from: 0xebb6e, to: 0x0}, - 145: {region: 0x4548, code: 0x9d, from: 0xf705a, to: 0x0}, - 146: {region: 0x4552, code: 0x58, from: 0xf9b68, to: 0x0}, - 147: {region: 0x4552, code: 0x5c, from: 0xf92b8, to: 0xf9b68}, - 148: {region: 0x4553, code: 0x5d, from: 0xf9e21, to: 0x0}, - 149: {region: 0x4553, code: 0x5b, from: 0xe9953, to: 0xfa45c}, - 150: {region: 0x4553, code: 0x8059, from: 0xf7421, to: 0xf7b9f}, - 151: {region: 0x4553, code: 0x805a, from: 0xf6e21, to: 0xf959f}, - 152: {region: 0x4554, code: 0x5c, from: 0xf712f, to: 0x0}, - 153: {region: 0x4555, code: 0x5d, from: 0xf9e21, to: 0x0}, - 154: {region: 0x4555, code: 0x8110, from: 0xf7621, to: 0xf9d9f}, - 155: {region: 0x4649, code: 0x5d, from: 0xf9e21, to: 0x0}, - 156: {region: 0x4649, code: 0x5e, from: 0xf5621, to: 0xfa45c}, - 157: {region: 0x464a, code: 0x5f, from: 0xf622d, to: 0x0}, - 158: {region: 0x464b, code: 0x60, from: 0xeda21, to: 0x0}, - 159: {region: 0x464d, code: 0xfa, from: 0xf3021, to: 0x0}, - 160: {region: 0x464d, code: 0x84, from: 0xef543, to: 0xf3021}, - 161: {region: 0x464f, code: 0x51, from: 0xf3821, to: 0x0}, - 162: {region: 0x4652, code: 0x5d, from: 0xf9e21, to: 0x0}, - 163: {region: 0x4652, code: 0x61, from: 0xf5021, to: 0xfa451}, - 164: {region: 0x4741, code: 0x107, from: 0xf9221, to: 0x0}, - 165: {region: 0x4742, code: 0x62, from: 0xd3cfb, to: 0x0}, - 166: {region: 0x4744, code: 0x10e, from: 0xf5e5b, to: 0x0}, - 167: {region: 0x4745, code: 0x64, from: 0xf9737, to: 0x0}, - 168: {region: 0x4745, code: 0x63, from: 0xf9285, to: 0xf9739}, - 169: {region: 0x4745, code: 0xd2, from: 0xf8f99, to: 0xf92cb}, - 170: {region: 0x4745, code: 0xe5, from: 0xf5221, to: 0xf8f99}, - 171: {region: 0x4746, code: 0x5d, from: 0xf9e21, to: 0x0}, - 172: {region: 0x4746, code: 0x61, from: 0xf5021, to: 0xfa451}, - 173: {region: 0x4747, code: 0x62, from: 0xe4c21, to: 0x0}, - 174: {region: 0x4748, code: 0x66, from: 0xfaee3, to: 0x0}, - 175: {region: 0x4748, code: 0x65, from: 0xf7669, to: 0xfaf9f}, - 176: {region: 0x4749, code: 0x67, from: 0xd6221, to: 0x0}, - 177: {region: 0x474c, code: 0x51, from: 0xea2bb, to: 0x0}, - 178: {region: 0x474d, code: 0x68, from: 0xf66e1, to: 0x0}, - 179: {region: 0x474e, code: 0x69, from: 0xf8426, to: 0x0}, - 180: {region: 0x474e, code: 0x6a, from: 0xf6942, to: 0xf8426}, - 181: {region: 0x4750, code: 0x5d, from: 0xf9e21, to: 0x0}, - 182: {region: 0x4750, code: 0x61, from: 0xf5021, to: 0xfa451}, - 183: {region: 0x4751, code: 0x107, from: 0xf9221, to: 0x0}, - 184: {region: 0x4751, code: 0x6b, from: 0xf6ee7, to: 0xf84c1}, - 185: {region: 0x4752, code: 0x5d, from: 0xfa221, to: 0x0}, - 186: {region: 0x4752, code: 0x6c, from: 0xf44a1, to: 0xfa45c}, - 187: {region: 0x4753, code: 0x62, from: 0xee821, to: 0x0}, - 188: {region: 0x4754, code: 0x6d, from: 0xf0abb, to: 0x0}, - 189: {region: 0x4755, code: 0xfa, from: 0xf3115, to: 0x0}, - 190: {region: 0x4757, code: 0x113, from: 0xf9a7f, to: 0x0}, - 191: {region: 0x4757, code: 0x6f, from: 0xf705c, to: 0xf9a7f}, - 192: {region: 0x4757, code: 0x6e, from: 0xef421, to: 0xf705c}, - 193: {region: 0x4759, code: 0x70, from: 0xf5cba, to: 0x0}, - 194: {region: 0x484b, code: 0x71, from: 0xece42, to: 0x0}, - 195: {region: 0x484d, code: 0x13, from: 0xf5e50, to: 0x0}, - 196: {region: 0x484e, code: 0x72, from: 0xf0c83, to: 0x0}, - 197: {region: 0x4852, code: 0x74, from: 0xf94be, to: 0x0}, - 198: {region: 0x4852, code: 0x73, from: 0xf8f97, to: 0xf9621}, - 199: {region: 0x4852, code: 0x120, from: 0xf8c21, to: 0xf8f97}, - 200: {region: 0x4852, code: 0x11e, from: 0xf5c21, to: 0xf8c21}, - 201: {region: 0x4854, code: 0x75, from: 0xea11a, to: 0x0}, - 202: {region: 0x4854, code: 0xfa, from: 0xef621, to: 0x0}, - 203: {region: 0x4855, code: 0x76, from: 0xf34f7, to: 0x0}, - 204: {region: 0x4943, code: 0x5d, from: 0xf9e21, to: 0x0}, - 205: {region: 0x4944, code: 0x77, from: 0xf5b8d, to: 0x0}, - 206: {region: 0x4945, code: 0x5d, from: 0xf9e21, to: 0x0}, - 207: {region: 0x4945, code: 0x78, from: 0xf0421, to: 0xfa449}, - 208: {region: 0x4945, code: 0x62, from: 0xe1021, to: 0xf0421}, - 209: {region: 0x494c, code: 0x7b, from: 0xf8324, to: 0x0}, - 210: {region: 0x494c, code: 0x7a, from: 0xf7856, to: 0xf8324}, - 211: {region: 0x494c, code: 0x79, from: 0xf3910, to: 0xf7856}, - 212: {region: 0x494d, code: 0x62, from: 0xe6023, to: 0x0}, - 213: {region: 0x494e, code: 0x7c, from: 0xe5711, to: 0x0}, - 214: {region: 0x494f, code: 0xfa, from: 0xf5b68, to: 0x0}, - 215: {region: 0x4951, code: 0x7d, from: 0xf1693, to: 0x0}, - 216: {region: 0x4951, code: 0x57, from: 0xf016b, to: 0xf1693}, - 217: {region: 0x4951, code: 0x7c, from: 0xf016b, to: 0xf1693}, - 218: {region: 0x4952, code: 0x7e, from: 0xf18ad, to: 0x0}, - 219: {region: 0x4953, code: 0x80, from: 0xf7a21, to: 0x0}, - 220: {region: 0x4953, code: 0x7f, from: 0xefd81, to: 0xf7a21}, - 221: {region: 0x4953, code: 0x51, from: 0xea2bb, to: 0xefd81}, - 222: {region: 0x4954, code: 0x5d, from: 0xf9e21, to: 0x0}, - 223: {region: 0x4954, code: 0x81, from: 0xe8d18, to: 0xfa45c}, - 224: {region: 0x4a45, code: 0x62, from: 0xe5a21, to: 0x0}, - 225: {region: 0x4a4d, code: 0x82, from: 0xf6328, to: 0x0}, - 226: {region: 0x4a4f, code: 0x83, from: 0xf3ce1, to: 0x0}, - 227: {region: 0x4a50, code: 0x84, from: 0xe9ec1, to: 0x0}, - 228: {region: 0x4b45, code: 0x85, from: 0xf5d2e, to: 0x0}, - 229: {region: 0x4b47, code: 0x86, from: 0xf92aa, to: 0x0}, - 230: {region: 0x4b47, code: 0xd2, from: 0xf8f99, to: 0xf92aa}, - 231: {region: 0x4b47, code: 0xe5, from: 0xf5221, to: 0xf8f99}, - 232: {region: 0x4b48, code: 0x87, from: 0xf7874, to: 0x0}, - 233: {region: 0x4b49, code: 0x13, from: 0xf5c4e, to: 0x0}, - 234: {region: 0x4b4d, code: 0x88, from: 0xf6ee6, to: 0x0}, - 235: {region: 0x4b4e, code: 0x10e, from: 0xf5b46, to: 0x0}, - 236: {region: 0x4b50, code: 0x89, from: 0xf4e91, to: 0x0}, - 237: {region: 0x4b52, code: 0x8c, from: 0xf54ca, to: 0x0}, - 238: {region: 0x4b52, code: 0x8a, from: 0xf424f, to: 0xf54ca}, - 239: {region: 0x4b52, code: 0x8b, from: 0xf330f, to: 0xf424f}, - 240: {region: 0x4b57, code: 0x8d, from: 0xf5281, to: 0x0}, - 241: {region: 0x4b59, code: 0x8e, from: 0xf6621, to: 0x0}, - 242: {region: 0x4b59, code: 0x82, from: 0xf6328, to: 0xf6621}, - 243: {region: 0x4b5a, code: 0x8f, from: 0xf9365, to: 0x0}, - 244: {region: 0x4c41, code: 0x90, from: 0xf778a, to: 0x0}, - 245: {region: 0x4c42, code: 0x91, from: 0xf3842, to: 0x0}, - 246: {region: 0x4c43, code: 0x10e, from: 0xf5b46, to: 0x0}, - 247: {region: 0x4c49, code: 0x3d, from: 0xf0241, to: 0x0}, - 248: {region: 0x4c4b, code: 0x92, from: 0xf74b6, to: 0x0}, - 249: {region: 0x4c52, code: 0x93, from: 0xf3021, to: 0x0}, - 250: {region: 0x4c53, code: 0x123, from: 0xf524e, to: 0x0}, - 251: {region: 0x4c53, code: 0x94, from: 0xf7836, to: 0x0}, - 252: {region: 0x4c54, code: 0x5d, from: 0xfbe21, to: 0x0}, - 253: {region: 0x4c54, code: 0x95, from: 0xf92d9, to: 0xfbd9f}, - 254: {region: 0x4c54, code: 0x96, from: 0xf9141, to: 0xf92d9}, - 255: {region: 0x4c54, code: 0xe5, from: 0xf5221, to: 0xf9141}, - 256: {region: 0x4c55, code: 0x5d, from: 0xf9e21, to: 0x0}, - 257: {region: 0x4c55, code: 0x98, from: 0xf3124, to: 0xfa45c}, - 258: {region: 0x4c55, code: 0x8097, from: 0xf6421, to: 0xf8c65}, - 259: {region: 0x4c55, code: 0x8099, from: 0xf6421, to: 0xf8c65}, - 260: {region: 0x4c56, code: 0x5d, from: 0xfbc21, to: 0x0}, - 261: {region: 0x4c56, code: 0x9a, from: 0xf92dc, to: 0xfbb9f}, - 262: {region: 0x4c56, code: 0x9b, from: 0xf90a7, to: 0xf9351}, - 263: {region: 0x4c56, code: 0xe5, from: 0xf5221, to: 0xf90f4}, - 264: {region: 0x4c59, code: 0x9c, from: 0xf6721, to: 0x0}, - 265: {region: 0x4d41, code: 0x9d, from: 0xf4f51, to: 0x0}, - 266: {region: 0x4d41, code: 0x9e, from: 0xeb221, to: 0xf4f51}, - 267: {region: 0x4d43, code: 0x5d, from: 0xf9e21, to: 0x0}, - 268: {region: 0x4d43, code: 0x61, from: 0xf5021, to: 0xfa451}, - 269: {region: 0x4d43, code: 0x9f, from: 0xf5021, to: 0xfa451}, - 270: {region: 0x4d44, code: 0xa1, from: 0xf937d, to: 0x0}, - 271: {region: 0x4d44, code: 0xa0, from: 0xf90c1, to: 0xf937d}, - 272: {region: 0x4d45, code: 0x5d, from: 0xfa421, to: 0x0}, - 273: {region: 0x4d45, code: 0x4f, from: 0xf9f42, to: 0xfa4af}, - 274: {region: 0x4d45, code: 0x11f, from: 0xf9438, to: 0xfa4af}, - 275: {region: 0x4d46, code: 0x5d, from: 0xf9e21, to: 0x0}, - 276: {region: 0x4d46, code: 0x61, from: 0xf5021, to: 0xfa451}, - 277: {region: 0x4d47, code: 0xa2, from: 0xf7f61, to: 0x0}, - 278: {region: 0x4d47, code: 0xa3, from: 0xf56e1, to: 0xfa99f}, - 279: {region: 0x4d48, code: 0xfa, from: 0xf3021, to: 0x0}, - 280: {region: 0x4d4b, code: 0xa4, from: 0xf92b4, to: 0x0}, - 281: {region: 0x4d4b, code: 0xa5, from: 0xf909a, to: 0xf92b4}, - 282: {region: 0x4d4c, code: 0x113, from: 0xf80c1, to: 0x0}, - 283: {region: 0x4d4c, code: 0xa6, from: 0xf54e2, to: 0xf811f}, - 284: {region: 0x4d4c, code: 0x113, from: 0xf4d78, to: 0xf54e2}, - 285: {region: 0x4d4d, code: 0xa7, from: 0xf8ad2, to: 0x0}, - 286: {region: 0x4d4d, code: 0x34, from: 0xf40e1, to: 0xf8ad2}, - 287: {region: 0x4d4e, code: 0xa8, from: 0xef661, to: 0x0}, - 288: {region: 0x4d4f, code: 0xa9, from: 0xeda21, to: 0x0}, - 289: {region: 0x4d50, code: 0xfa, from: 0xf3021, to: 0x0}, - 290: {region: 0x4d51, code: 0x5d, from: 0xf9e21, to: 0x0}, - 291: {region: 0x4d51, code: 0x61, from: 0xf5021, to: 0xfa451}, - 292: {region: 0x4d52, code: 0xaa, from: 0xf6add, to: 0x0}, - 293: {region: 0x4d52, code: 0x113, from: 0xf4d7c, to: 0xf6add}, - 294: {region: 0x4d53, code: 0x10e, from: 0xf5e5b, to: 0x0}, - 295: {region: 0x4d54, code: 0x5d, from: 0xfb021, to: 0x0}, - 296: {region: 0x4d54, code: 0xab, from: 0xf60c7, to: 0xfb03f}, - 297: {region: 0x4d54, code: 0xac, from: 0xef50d, to: 0xf60c7}, - 298: {region: 0x4d55, code: 0xad, from: 0xf1c81, to: 0x0}, - 299: {region: 0x4d56, code: 0xaf, from: 0xf7ae1, to: 0x0}, - 300: {region: 0x4d57, code: 0xb0, from: 0xf664f, to: 0x0}, - 301: {region: 0x4d58, code: 0xb1, from: 0xf9221, to: 0x0}, - 302: {region: 0x4d58, code: 0xb2, from: 0xe3c21, to: 0xf919f}, - 303: {region: 0x4d58, code: 0x80b3, from: 0x0, to: 0x0}, - 304: {region: 0x4d59, code: 0xb4, from: 0xf5730, to: 0x0}, - 305: {region: 0x4d5a, code: 0xb7, from: 0xface1, to: 0x0}, - 306: {region: 0x4d5a, code: 0xb6, from: 0xf78d0, to: 0xfad9f}, - 307: {region: 0x4d5a, code: 0xb5, from: 0xf6ed9, to: 0xf78d0}, - 308: {region: 0x4e41, code: 0xb8, from: 0xf9221, to: 0x0}, - 309: {region: 0x4e41, code: 0x123, from: 0xf524e, to: 0x0}, - 310: {region: 0x4e43, code: 0x115, from: 0xf8221, to: 0x0}, - 311: {region: 0x4e45, code: 0x113, from: 0xf4d93, to: 0x0}, - 312: {region: 0x4e46, code: 0x13, from: 0xf5c4e, to: 0x0}, - 313: {region: 0x4e47, code: 0xb9, from: 0xf6a21, to: 0x0}, - 314: {region: 0x4e49, code: 0xbb, from: 0xf8e9e, to: 0x0}, - 315: {region: 0x4e49, code: 0xba, from: 0xf884f, to: 0xf8e9e}, - 316: {region: 0x4e4c, code: 0x5d, from: 0xf9e21, to: 0x0}, - 317: {region: 0x4e4c, code: 0xbc, from: 0xe2a21, to: 0xfa45c}, - 318: {region: 0x4e4f, code: 0xbd, from: 0xee2c7, to: 0x0}, - 319: {region: 0x4e4f, code: 0xda, from: 0xea2bb, to: 0xee2c7}, - 320: {region: 0x4e50, code: 0xbe, from: 0xf1a21, to: 0x0}, - 321: {region: 0x4e50, code: 0x7c, from: 0xe9c21, to: 0xf5d51}, - 322: {region: 0x4e52, code: 0x13, from: 0xf5c4e, to: 0x0}, - 323: {region: 0x4e55, code: 0xbf, from: 0xf5eea, to: 0x0}, - 324: {region: 0x4e5a, code: 0xbf, from: 0xf5eea, to: 0x0}, - 325: {region: 0x4f4d, code: 0xc0, from: 0xf696b, to: 0x0}, - 326: {region: 0x5041, code: 0xc1, from: 0xedf64, to: 0x0}, - 327: {region: 0x5041, code: 0xfa, from: 0xedf72, to: 0x0}, - 328: {region: 0x5045, code: 0xc3, from: 0xf8ee1, to: 0x0}, - 329: {region: 0x5045, code: 0xc2, from: 0xf8241, to: 0xf8ee1}, - 330: {region: 0x5045, code: 0xc4, from: 0xe8e4e, to: 0xf8241}, - 331: {region: 0x5046, code: 0x115, from: 0xf339a, to: 0x0}, - 332: {region: 0x5047, code: 0xc5, from: 0xf6f30, to: 0x0}, - 333: {region: 0x5047, code: 0x13, from: 0xf5c4e, to: 0xf6f30}, - 334: {region: 0x5048, code: 0xc6, from: 0xf34e4, to: 0x0}, - 335: {region: 0x504b, code: 0xc7, from: 0xf3881, to: 0x0}, - 336: {region: 0x504b, code: 0x7c, from: 0xe5711, to: 0xf370f}, - 337: {region: 0x504c, code: 0xc8, from: 0xf9621, to: 0x0}, - 338: {region: 0x504c, code: 0xc9, from: 0xf3d5c, to: 0xf959f}, - 339: {region: 0x504d, code: 0x5d, from: 0xf9e21, to: 0x0}, - 340: {region: 0x504d, code: 0x61, from: 0xf6995, to: 0xfa451}, - 341: {region: 0x504e, code: 0xbf, from: 0xf622d, to: 0x0}, - 342: {region: 0x5052, code: 0xfa, from: 0xed58a, to: 0x0}, - 343: {region: 0x5052, code: 0x5b, from: 0xe1021, to: 0xed58a}, - 344: {region: 0x5053, code: 0x7b, from: 0xf8324, to: 0x0}, - 345: {region: 0x5053, code: 0x83, from: 0xf984c, to: 0x0}, - 346: {region: 0x5053, code: 0x79, from: 0xf5ec1, to: 0xf7856}, - 347: {region: 0x5053, code: 0x83, from: 0xf3ce1, to: 0xf5ec1}, - 348: {region: 0x5054, code: 0x5d, from: 0xf9e21, to: 0x0}, - 349: {region: 0x5054, code: 0xca, from: 0xeeeb6, to: 0xfa45c}, - 350: {region: 0x5057, code: 0xfa, from: 0xf3021, to: 0x0}, - 351: {region: 0x5059, code: 0xcb, from: 0xf2f61, to: 0x0}, - 352: {region: 0x5141, code: 0xcc, from: 0xf6ab3, to: 0x0}, - 353: {region: 0x5245, code: 0x5d, from: 0xf9e21, to: 0x0}, - 354: {region: 0x5245, code: 0x61, from: 0xf6e21, to: 0xfa451}, - 355: {region: 0x524f, code: 0xcf, from: 0xfaae1, to: 0x0}, - 356: {region: 0x524f, code: 0xce, from: 0xf403c, to: 0xfad9f}, - 357: {region: 0x5253, code: 0xd0, from: 0xfad59, to: 0x0}, - 358: {region: 0x5253, code: 0x47, from: 0xfa4af, to: 0xfad59}, - 359: {region: 0x5253, code: 0x11f, from: 0xf9438, to: 0xfa4af}, - 360: {region: 0x5255, code: 0xd1, from: 0xf9e21, to: 0x0}, - 361: {region: 0x5255, code: 0xd2, from: 0xf8f99, to: 0xf9d9f}, - 362: {region: 0x5257, code: 0xd3, from: 0xf58b3, to: 0x0}, - 363: {region: 0x5341, code: 0xd4, from: 0xf4156, to: 0x0}, - 364: {region: 0x5342, code: 0xd5, from: 0xf7358, to: 0x0}, - 365: {region: 0x5342, code: 0x13, from: 0xf5c4e, to: 0xf74de}, - 366: {region: 0x5343, code: 0xd6, from: 0xedf61, to: 0x0}, - 367: {region: 0x5344, code: 0xd8, from: 0xfae2a, to: 0x0}, - 368: {region: 0x5344, code: 0xd7, from: 0xf90c8, to: 0xfaede}, - 369: {region: 0x5344, code: 0xd9, from: 0xf4a88, to: 0xf9cc1}, - 370: {region: 0x5344, code: 0x57, from: 0xec233, to: 0xf4c21}, - 371: {region: 0x5344, code: 0x62, from: 0xec233, to: 0xf4c21}, - 372: {region: 0x5345, code: 0xda, from: 0xea2bb, to: 0x0}, - 373: {region: 0x5347, code: 0xdb, from: 0xf5ecc, to: 0x0}, - 374: {region: 0x5347, code: 0xb4, from: 0xf5730, to: 0xf5ecc}, - 375: {region: 0x5348, code: 0xdc, from: 0xefa4f, to: 0x0}, - 376: {region: 0x5349, code: 0x5d, from: 0xfae21, to: 0x0}, - 377: {region: 0x5349, code: 0xdd, from: 0xf9147, to: 0xfae2e}, - 378: {region: 0x534a, code: 0xbd, from: 0xee2c7, to: 0x0}, - 379: {region: 0x534b, code: 0x5d, from: 0xfb221, to: 0x0}, - 380: {region: 0x534b, code: 0xde, from: 0xf919f, to: 0xfb221}, - 381: {region: 0x534b, code: 0x48, from: 0xf42c1, to: 0xf919f}, - 382: {region: 0x534c, code: 0xdf, from: 0xf5904, to: 0x0}, - 383: {region: 0x534c, code: 0x62, from: 0xe217e, to: 0xf5c44}, - 384: {region: 0x534d, code: 0x5d, from: 0xf9e21, to: 0x0}, - 385: {region: 0x534d, code: 0x81, from: 0xe9397, to: 0xfa25c}, - 386: {region: 0x534e, code: 0x113, from: 0xf4e84, to: 0x0}, - 387: {region: 0x534f, code: 0xe0, from: 0xf50e1, to: 0x0}, - 388: {region: 0x5352, code: 0xe1, from: 0xfa821, to: 0x0}, - 389: {region: 0x5352, code: 0xe2, from: 0xf28aa, to: 0xfa79f}, - 390: {region: 0x5352, code: 0xbc, from: 0xe2f74, to: 0xf28aa}, - 391: {region: 0x5353, code: 0xe3, from: 0xfb6f2, to: 0x0}, - 392: {region: 0x5353, code: 0xd8, from: 0xfae2a, to: 0xfb721}, - 393: {region: 0x5354, code: 0xe4, from: 0xf7328, to: 0x0}, - 394: {region: 0x5355, code: 0xe5, from: 0xf5221, to: 0xf8f99}, - 395: {region: 0x5356, code: 0xfa, from: 0xfa221, to: 0x0}, - 396: {region: 0x5356, code: 0xe6, from: 0xeff6b, to: 0xfa221}, - 397: {region: 0x5358, code: 0x8, from: 0xfb54a, to: 0x0}, - 398: {region: 0x5359, code: 0xe7, from: 0xf3821, to: 0x0}, - 399: {region: 0x535a, code: 0xe8, from: 0xf6d26, to: 0x0}, - 400: {region: 0x5441, code: 0x62, from: 0xf242c, to: 0x0}, - 401: {region: 0x5443, code: 0xfa, from: 0xf6328, to: 0x0}, - 402: {region: 0x5444, code: 0x107, from: 0xf9221, to: 0x0}, - 403: {region: 0x5446, code: 0x5d, from: 0xf9e21, to: 0x0}, - 404: {region: 0x5446, code: 0x61, from: 0xf4e21, to: 0xfa451}, - 405: {region: 0x5447, code: 0x113, from: 0xf4d7c, to: 0x0}, - 406: {region: 0x5448, code: 0xe9, from: 0xf108f, to: 0x0}, - 407: {region: 0x544a, code: 0xeb, from: 0xfa15a, to: 0x0}, - 408: {region: 0x544a, code: 0xea, from: 0xf96aa, to: 0xfa159}, - 409: {region: 0x544a, code: 0xd2, from: 0xf8f99, to: 0xf96aa}, - 410: {region: 0x544b, code: 0xbf, from: 0xf5eea, to: 0x0}, - 411: {region: 0x544c, code: 0xfa, from: 0xf9f54, to: 0x0}, - 412: {region: 0x544c, code: 0xf0, from: 0xf4e22, to: 0xfa4b4}, - 413: {region: 0x544c, code: 0x77, from: 0xf6f87, to: 0xfa4b4}, - 414: {region: 0x544d, code: 0xed, from: 0xfb221, to: 0x0}, - 415: {region: 0x544d, code: 0xec, from: 0xf9361, to: 0xfb221}, - 416: {region: 0x544d, code: 0xd2, from: 0xf8f99, to: 0xf9361}, - 417: {region: 0x544d, code: 0xe5, from: 0xf5221, to: 0xf8f99}, - 418: {region: 0x544e, code: 0xee, from: 0xf4d61, to: 0x0}, - 419: {region: 0x544f, code: 0xef, from: 0xf5c4e, to: 0x0}, - 420: {region: 0x5450, code: 0xf0, from: 0xf4e22, to: 0xfa4b4}, - 421: {region: 0x5450, code: 0x77, from: 0xf6f87, to: 0xfa4b4}, - 422: {region: 0x5452, code: 0xf2, from: 0xfaa21, to: 0x0}, - 423: {region: 0x5452, code: 0xf1, from: 0xf0561, to: 0xfab9f}, - 424: {region: 0x5454, code: 0xf3, from: 0xf5821, to: 0x0}, - 425: {region: 0x5456, code: 0x13, from: 0xf5c4e, to: 0x0}, - 426: {region: 0x5457, code: 0xf4, from: 0xf3acf, to: 0x0}, - 427: {region: 0x545a, code: 0xf5, from: 0xf5cce, to: 0x0}, - 428: {region: 0x5541, code: 0xf6, from: 0xf9922, to: 0x0}, - 429: {region: 0x5541, code: 0xf7, from: 0xf916d, to: 0xf9351}, - 430: {region: 0x5541, code: 0xd2, from: 0xf8f99, to: 0xf916d}, - 431: {region: 0x5541, code: 0xe5, from: 0xf5221, to: 0xf8f99}, - 432: {region: 0x5547, code: 0xf9, from: 0xf86af, to: 0x0}, - 433: {region: 0x5547, code: 0xf8, from: 0xf5d0f, to: 0xf86af}, - 434: {region: 0x554d, code: 0xfa, from: 0xf3021, to: 0x0}, - 435: {region: 0x5553, code: 0xfa, from: 0xe0021, to: 0x0}, - 436: {region: 0x5553, code: 0x80fb, from: 0x0, to: 0x0}, - 437: {region: 0x5553, code: 0x80fc, from: 0x0, to: 0xfbc61}, - 438: {region: 0x5559, code: 0xff, from: 0xf9261, to: 0x0}, - 439: {region: 0x5559, code: 0xfe, from: 0xf6ee1, to: 0xf9261}, - 440: {region: 0x5559, code: 0x80fd, from: 0x0, to: 0x0}, - 441: {region: 0x555a, code: 0x100, from: 0xf94e1, to: 0x0}, - 442: {region: 0x5641, code: 0x5d, from: 0xf9e21, to: 0x0}, - 443: {region: 0x5641, code: 0x81, from: 0xe9d53, to: 0xfa45c}, - 444: {region: 0x5643, code: 0x10e, from: 0xf5b46, to: 0x0}, - 445: {region: 0x5645, code: 0x102, from: 0xfb021, to: 0x0}, - 446: {region: 0x5645, code: 0x101, from: 0xe9eab, to: 0xfb0de}, - 447: {region: 0x5647, code: 0xfa, from: 0xe5221, to: 0x0}, - 448: {region: 0x5647, code: 0x62, from: 0xe5221, to: 0xf4e21}, - 449: {region: 0x5649, code: 0xfa, from: 0xe5a21, to: 0x0}, - 450: {region: 0x564e, code: 0x103, from: 0xf832e, to: 0x0}, - 451: {region: 0x564e, code: 0x104, from: 0xf74a3, to: 0xf832e}, - 452: {region: 0x5655, code: 0x105, from: 0xf7a21, to: 0x0}, - 453: {region: 0x5746, code: 0x115, from: 0xf52fe, to: 0x0}, - 454: {region: 0x5753, code: 0x106, from: 0xf5eea, to: 0x0}, - 455: {region: 0x584b, code: 0x5d, from: 0xfa421, to: 0x0}, - 456: {region: 0x584b, code: 0x4f, from: 0xf9f21, to: 0xfa469}, - 457: {region: 0x584b, code: 0x11f, from: 0xf9438, to: 0xf9f3e}, - 458: {region: 0x5944, code: 0x11c, from: 0xf5a81, to: 0xf9821}, - 459: {region: 0x5945, code: 0x11d, from: 0xf8cb6, to: 0x0}, - 460: {region: 0x5954, code: 0x5d, from: 0xf9e21, to: 0x0}, - 461: {region: 0x5954, code: 0x61, from: 0xf7057, to: 0xfa451}, - 462: {region: 0x5954, code: 0x88, from: 0xf6e21, to: 0xf7057}, - 463: {region: 0x5955, code: 0x11f, from: 0xf9438, to: 0xfa4af}, - 464: {region: 0x5955, code: 0x120, from: 0xf8c21, to: 0xf90f8}, - 465: {region: 0x5955, code: 0x11e, from: 0xf5c21, to: 0xf8c21}, - 466: {region: 0x5a41, code: 0x123, from: 0xf524e, to: 0x0}, - 467: {region: 0x5a41, code: 0x8122, from: 0xf8321, to: 0xf966d}, - 468: {region: 0x5a4d, code: 0x125, from: 0xfba21, to: 0x0}, - 469: {region: 0x5a4d, code: 0x124, from: 0xf6030, to: 0xfba21}, - 470: {region: 0x5a52, code: 0x126, from: 0xf9361, to: 0xf9cff}, - 471: {region: 0x5a52, code: 0x127, from: 0xf675b, to: 0xf9361}, - 472: {region: 0x5a57, code: 0xfa, from: 0xfb28c, to: 0x0}, - 473: {region: 0x5a57, code: 0x129, from: 0xfb242, to: 0xfb28c}, - 474: {region: 0x5a57, code: 0x12a, from: 0xfb101, to: 0xfb242}, - 475: {region: 0x5a57, code: 0x128, from: 0xf7892, to: 0xfb101}, - 476: {region: 0x5a57, code: 0xcd, from: 0xf6451, to: 0xf7892}, - 477: {region: 0x5a5a, code: 0x8108, from: 0x0, to: 0x0}, - 478: {region: 0x5a5a, code: 0x8109, from: 0x0, to: 0x0}, - 479: {region: 0x5a5a, code: 0x810a, from: 0x0, to: 0x0}, - 480: {region: 0x5a5a, code: 0x810b, from: 0x0, to: 0x0}, - 481: {region: 0x5a5a, code: 0x810c, from: 0x0, to: 0x0}, - 482: {region: 0x5a5a, code: 0x810d, from: 0x0, to: 0x0}, - 483: {region: 0x5a5a, code: 0x810f, from: 0x0, to: 0x0}, - 484: {region: 0x5a5a, code: 0x8111, from: 0xf1421, to: 0xfa681}, - 485: {region: 0x5a5a, code: 0x8112, from: 0x0, to: 0xfbb7e}, - 486: {region: 0x5a5a, code: 0x8114, from: 0x0, to: 0x0}, - 487: {region: 0x5a5a, code: 0x8116, from: 0x0, to: 0x0}, - 488: {region: 0x5a5a, code: 0x8117, from: 0x0, to: 0xf9f7e}, - 489: {region: 0x5a5a, code: 0x8118, from: 0x0, to: 0x0}, - 490: {region: 0x5a5a, code: 0x8119, from: 0x0, to: 0x0}, - 491: {region: 0x5a5a, code: 0x811a, from: 0x0, to: 0x0}, - 492: {region: 0x5a5a, code: 0x811b, from: 0x0, to: 0x0}, -} // Size: 5940 bytes - -// symbols holds symbol data of the form <n> <str>, where n is the length of -// the symbol string str. -const symbols string = "" + // Size: 1396 bytes - "\x00\x02Kz\x01$\x02A$\x02KM\x03৳\x02Bs\x02R$\x01P\x03р.\x03CA$\x04CN¥" + - "\x02¥\x03₡\x03Kč\x02kr\x03E£\x03₧\x03€\x02£\x03₾\x02FG\x01Q\x03HK$\x01L" + - "\x02kn\x02Ft\x02Rp\x03₪\x03₹\x04JP¥\x03៛\x02CF\x03₩\x03₸\x03₭\x03L£\x02R" + - "s\x02Lt\x02Ls\x02Ar\x01K\x03₮\x03MX$\x02RM\x03₦\x02C$\x03NZ$\x03₱\x03zł" + - "\x03₲\x03lei\x03₽\x02RF\x02Db\x03฿\x02T$\x03₺\x03NT$\x03₴\x03US$\x03₫" + - "\x04FCFA\x03EC$\x03CFA\x04CFPF\x01R\x02ZK\x05GH₵\x03AU$\x06ብር\x03***\x09" + - "د.إ.\u200f\x03AR$\x03BB$\x09د.ب.\u200f\x03BM$\x03BN$\x03BS$\x03BZ$\x03C" + - "L$\x03CO$\x03CU$\x03DO$\x09د.ج.\u200f\x09ج.م.\u200f\x03FJ$\x04UK£\x03GY$" + - "\x09د.ع.\u200f\x06ر.إ.\x03JM$\x09د.أ.\u200f\x0cف.ج.ق.\u200f\x09د.ك." + - "\u200f\x03KY$\x09ل.ل.\u200f\x09د.ل.\u200f\x09د.م.\u200f\x09أ.م.\u200f" + - "\x09ر.ع.\u200f\x09ر.ق.\u200f\x09ر.س.\u200f\x03SB$\x09د.س.\u200f\x06ج.س." + - "\x03SR$\x09ل.س.\u200f\x09د.ت.\u200f\x03TT$\x03UY$\x09ر.ي.\u200f\x03Fdj" + - "\x03Nfk\x01S\x04GB£\x03TSh\x03₼\x03ley\x03S£\x04Bds$\x03BD$\x02B$\x02Br" + - "\x04CUC$\x03$MN\x03RD$\x04FK£\x02G$\x04Íkr\x02J$\x03CI$\x02L$\x02N$\x07р" + - "уб.\x03SI$\x02S$\x02$U\x05лв.\x06щ.д.\x02$A\x03$CA\x04£ E\x05£ RU\x04$ " + - "HK\x03£L\x04$ ZN\x03$ T\x04$ SU\x04din.\x04КМ\x04Кч\x04зл\x07дин.\x04Тл" + - "\x01F\x03USh\x04Kčs\x03ECU\x02TK\x03kr.\x03Ksh\x03öS\x03BGK\x03BGJ\x04Cu" + - "b$\x02DM\x04Fl£\x04F.G.\x02FC\x04F.Rw\x03Nu.\x05KR₩\x05TH฿\x06Δρχ\x02Tk" + - "\x02$b\x02Kr\x02Gs\x03CFP\x03FBu\x01D\x04MOP$\x02MK\x02SR\x02Le\x04NAf." + - "\x01E\x02VT\x03WS$\x03BsF\x02Af\x03Naf\x02$a\x04Afl.\x02TL\x03B/.\x02S/" + - "\x03Gs.\x03Bs.\x02؋\x04¥CN\x03$HK\x08ریال\x03$MX\x03$NZ\x03$EC\x02UM\x02" + - "mk\x03$AR\x03$AU\x02FB\x03$BM\x03$BN\x03$BS\x03$BZ\x03$CL\x03$CO\x04£CY" + - "\x03£E\x03$FJ\x04£FK\x04£GB\x04£GI\x04£IE\x04£IL\x05₤IT\x04£LB\x04£MT" + - "\x03$NA\x02$C\x03$RH\x02FR\x03$SB\x03$SG\x03$SR\x03$TT\x03$US\x03$UY\x04" + - "FCFP\x02Kw\x05$\u00a0AU\x05$\u00a0HK\x05$\u00a0NZ\x05$\u00a0SG\x05$" + - "\u00a0US\x02DA\x01G\x02LS\x02DT\x02$R\x06руб\x07રૂ.\x0a\u200eCN¥\u200e" + - "\x06ל״י\x02֏\x03NKr\x03元\x03¥\x03\u200b\x02LE\x02Kn\x06сом\x02zl\x02rb" + - "\x03MTn\x06ден\x04кр\x03NAf\x03Afl\x0cनेरू\x06रू\x02ر\x04Esc.\x06\u200bP" + - "TE\x04XXXX\x03ლ\x06ТМТ\x03Dkr\x03Skr\x03Nkr\x07රු.\x0fසිෆ්එ\x03NIS\x05Le" + - "kë\x03den\x02r.\x03BR$\x03Ekr\x04EG£\x04IE£\x03Ikr\x03Rs.\x04AUD$\x04NZD" + - "$\x07крб.\x05soʻm\x06сўм\x03₩\x03ILS\x02P.\x03Zł" - -type curToIndex struct { - cur uint16 - idx uint16 -} - -var normalLangIndex = []uint16{ // 755 elements - // Entry 0 - 3F - 0x0000, 0x0014, 0x0014, 0x0014, 0x0017, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0019, 0x0019, 0x001c, 0x001c, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0035, 0x0035, 0x0035, 0x0035, 0x0036, 0x0036, 0x0036, - 0x0036, 0x0036, 0x0036, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, - 0x0037, 0x0037, 0x0037, 0x0037, 0x0038, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003b, 0x003b, 0x003e, - 0x003e, 0x0040, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, - 0x0048, 0x0048, 0x0049, 0x0049, 0x004a, 0x004a, 0x005b, 0x005b, - // Entry 40 - 7F - 0x005b, 0x005b, 0x005b, 0x005d, 0x005d, 0x005d, 0x005e, 0x005e, - 0x005f, 0x006d, 0x006d, 0x006d, 0x006d, 0x007e, 0x0084, 0x0084, - 0x0084, 0x0084, 0x008d, 0x008d, 0x008d, 0x008e, 0x008e, 0x008f, - 0x008f, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, - 0x0098, 0x0098, 0x0099, 0x0099, 0x009b, 0x009b, 0x009f, 0x009f, - 0x009f, 0x00a0, 0x00a0, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, - 0x00a8, 0x00a9, 0x00aa, 0x00aa, 0x00aa, 0x00af, 0x00af, 0x00af, - 0x00af, 0x00af, 0x00af, 0x00af, 0x00b5, 0x00b5, 0x00b6, 0x00b6, - // Entry 80 - BF - 0x00b9, 0x00b9, 0x00b9, 0x00bc, 0x00bc, 0x00bc, 0x00be, 0x00c0, - 0x00c0, 0x00c1, 0x00c2, 0x00c2, 0x00c2, 0x00d7, 0x00d8, 0x00d8, - 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00df, - 0x00e0, 0x00e0, 0x00e1, 0x00e1, 0x00e1, 0x00e1, 0x00e2, 0x00e3, - 0x00e4, 0x00e4, 0x00e5, 0x00e7, 0x00e7, 0x00e7, 0x00e8, 0x00e8, - 0x00e9, 0x00eb, 0x00ec, 0x00ec, 0x00ed, 0x00ed, 0x00ed, 0x00ed, - 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, - 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f6, 0x00f7, 0x00f7, - // Entry C0 - FF - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, - 0x00ff, 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, - 0x0106, 0x0106, 0x0107, 0x0108, 0x0109, 0x0109, 0x010a, 0x010b, - 0x010d, 0x010d, 0x010e, 0x0110, 0x0111, 0x0112, 0x0112, 0x0113, - 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x0118, 0x0118, 0x0119, - 0x0119, 0x0119, 0x011a, 0x011b, 0x011c, 0x011d, 0x011d, 0x011d, - 0x011d, 0x012f, 0x0134, 0x0136, 0x0137, 0x0138, 0x0139, 0x013b, - 0x013d, 0x013e, 0x0140, 0x0142, 0x0142, 0x0143, 0x0143, 0x0144, - // Entry 100 - 13F - 0x0145, 0x0146, 0x0146, 0x014f, 0x0150, 0x0151, 0x0152, 0x0153, - 0x0154, 0x0155, 0x0156, 0x0158, 0x015a, 0x015b, 0x0160, 0x0160, - 0x0162, 0x0162, 0x0162, 0x0162, 0x016d, 0x016d, 0x016d, 0x016d, - 0x016d, 0x016e, 0x016f, 0x016f, 0x0180, 0x0180, 0x0184, 0x0184, - 0x0185, 0x0186, 0x0186, 0x01ac, 0x01ac, 0x01ac, 0x01ad, 0x01ad, - 0x01ad, 0x01ce, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, - 0x01d0, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d2, 0x01d2, 0x01d2, - 0x01d3, 0x01d4, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d7, 0x01d7, - // Entry 140 - 17F - 0x01d7, 0x01d8, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x01da, 0x01db, 0x01db, 0x01dc, 0x01dc, 0x01dc, 0x01dd, 0x01de, - 0x01de, 0x01de, 0x01de, 0x01de, 0x01e4, 0x01e4, 0x01e7, 0x01e7, - 0x01e9, 0x01e9, 0x01f0, 0x01f0, 0x01f3, 0x01f3, 0x01f3, 0x01f3, - 0x01f4, 0x01f4, 0x01f4, 0x01f5, 0x01f5, 0x01f5, 0x01f5, 0x01f6, - 0x01f7, 0x01f7, 0x01f7, 0x01f8, 0x01f8, 0x01fd, 0x01fd, 0x01ff, - 0x01ff, 0x0211, 0x0212, 0x0212, 0x0217, 0x0217, 0x0229, 0x0229, - 0x022c, 0x022c, 0x0230, 0x0230, 0x0231, 0x0231, 0x0232, 0x0232, - // Entry 180 - 1BF - 0x023e, 0x023e, 0x0245, 0x0245, 0x0245, 0x0245, 0x0245, 0x0245, - 0x0248, 0x0248, 0x0248, 0x0248, 0x0248, 0x0249, 0x0249, 0x0249, - 0x0253, 0x0253, 0x0254, 0x0254, 0x0254, 0x0255, 0x0255, 0x0255, - 0x0256, 0x0256, 0x0259, 0x0259, 0x0259, 0x0259, 0x025a, 0x025a, - 0x025e, 0x025e, 0x025e, 0x025e, 0x025f, 0x025f, 0x0260, 0x0260, - 0x0263, 0x0263, 0x0265, 0x0265, 0x0266, 0x0266, 0x0266, 0x0266, - 0x0266, 0x0266, 0x0266, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, - 0x0267, 0x0267, 0x0267, 0x0267, 0x0276, 0x0276, 0x0277, 0x0277, - // Entry 1C0 - 1FF - 0x027c, 0x027c, 0x027d, 0x027d, 0x027e, 0x027e, 0x027f, 0x0280, - 0x0280, 0x0280, 0x0280, 0x0282, 0x0282, 0x0282, 0x0282, 0x0282, - 0x0295, 0x0295, 0x0296, 0x0296, 0x0297, 0x0297, 0x0298, 0x0298, - 0x029d, 0x029d, 0x029e, 0x029e, 0x029f, 0x02a0, 0x02a0, 0x02a1, - 0x02a1, 0x02a2, 0x02a2, 0x02a3, 0x02a3, 0x02a3, 0x02a3, 0x02af, - 0x02af, 0x02b2, 0x02b2, 0x02b5, 0x02b5, 0x02b7, 0x02b7, 0x02bb, - 0x02bc, 0x02bc, 0x02bd, 0x02bd, 0x02bd, 0x02bd, 0x02bd, 0x02c4, - 0x02c4, 0x02c5, 0x02c5, 0x02c5, 0x02c6, 0x02c6, 0x02d8, 0x02d8, - // Entry 200 - 23F - 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02da, 0x02da, - 0x02da, 0x02e0, 0x02e1, 0x02e1, 0x02e2, 0x02e3, 0x02e3, 0x02e4, - 0x02e5, 0x02e5, 0x02e5, 0x02e6, 0x02e6, 0x02e6, 0x02e6, 0x02e6, - 0x02e6, 0x02e6, 0x02e6, 0x02e8, 0x02e8, 0x02e8, 0x02e9, 0x02e9, - 0x02ea, 0x02ea, 0x02eb, 0x02eb, 0x02eb, 0x02ed, 0x02ed, 0x02ef, - 0x02f0, 0x02f1, 0x02f1, 0x02f1, 0x02f1, 0x02f1, 0x0300, 0x0300, - 0x0300, 0x0300, 0x0301, 0x0301, 0x0304, 0x0305, 0x0305, 0x0305, - 0x0307, 0x0307, 0x0307, 0x0308, 0x0309, 0x030a, 0x030b, 0x030c, - // Entry 240 - 27F - 0x030c, 0x030d, 0x030f, 0x0311, 0x0311, 0x0311, 0x0311, 0x0312, - 0x0312, 0x0323, 0x0324, 0x0324, 0x0325, 0x0325, 0x032d, 0x032f, - 0x0330, 0x0331, 0x0332, 0x0332, 0x0332, 0x0333, 0x0333, 0x0334, - 0x0334, 0x0335, 0x0335, 0x0336, 0x0336, 0x0337, 0x0337, 0x0337, - 0x033b, 0x033b, 0x033b, 0x033d, 0x033e, 0x033e, 0x033e, 0x033e, - 0x033e, 0x033e, 0x033e, 0x033e, 0x033e, 0x033e, 0x033e, 0x0341, - 0x0341, 0x034f, 0x034f, 0x0353, 0x0353, 0x0353, 0x0353, 0x0353, - 0x0353, 0x0353, 0x0353, 0x0353, 0x0353, 0x0354, 0x0355, 0x0356, - // Entry 280 - 2BF - 0x0357, 0x0357, 0x0359, 0x0359, 0x035a, 0x035a, 0x0360, 0x0360, - 0x0360, 0x0360, 0x0360, 0x0360, 0x0366, 0x0366, 0x0366, 0x0366, - 0x0366, 0x0366, 0x0366, 0x0366, 0x037e, 0x037e, 0x037e, 0x037e, - 0x0381, 0x0382, 0x0382, 0x0382, 0x0383, 0x0383, 0x0386, 0x0386, - 0x0387, 0x0389, 0x038c, 0x038e, 0x038e, 0x038f, 0x0390, 0x0390, - 0x0392, 0x0392, 0x0393, 0x0394, 0x0394, 0x0394, 0x0396, 0x0396, - 0x0396, 0x0399, 0x0399, 0x039e, 0x039e, 0x039e, 0x039e, 0x039e, - 0x039e, 0x039e, 0x039e, 0x03a0, 0x03a0, 0x03b3, 0x03b3, 0x03b6, - // Entry 2C0 - 2FF - 0x03b7, 0x03b7, 0x03b8, 0x03b9, 0x03b9, 0x03bb, 0x03bb, 0x03bb, - 0x03bb, 0x03bc, 0x03bd, 0x03bd, 0x03bd, 0x03bd, 0x03bd, 0x03bf, - 0x03bf, 0x03bf, 0x03bf, 0x03c0, 0x03c0, 0x03c0, 0x03c2, 0x03c2, - 0x03c2, 0x03c2, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, - 0x03c4, 0x03c4, 0x03c4, 0x03c7, 0x03c7, 0x03c7, 0x03c7, 0x03cb, - 0x03cb, 0x03cb, 0x03cc, 0x03ce, 0x03d0, 0x03d4, 0x03d6, 0x03d7, - 0x03d7, 0x03d9, 0x03d9, -} // Size: 1534 bytes - -var normalSymIndex = []curToIndex{ // 985 elements - 0: {cur: 0x13, idx: 0x6}, - 1: {cur: 0x2e, idx: 0x13}, - 2: {cur: 0x3a, idx: 0x1c}, - 3: {cur: 0x43, idx: 0x20}, - 4: {cur: 0x5d, idx: 0x3b}, - 5: {cur: 0x62, idx: 0x3f}, - 6: {cur: 0x71, idx: 0x4b}, - 7: {cur: 0x7b, idx: 0x5a}, - 8: {cur: 0x7c, idx: 0x5e}, - 9: {cur: 0x84, idx: 0x62}, - 10: {cur: 0x8c, idx: 0x6e}, - 11: {cur: 0xb1, idx: 0x90}, - 12: {cur: 0xbf, idx: 0x9e}, - 13: {cur: 0xf4, idx: 0xc7}, - 14: {cur: 0xfa, idx: 0xcf}, - 15: {cur: 0x103, idx: 0xd3}, - 16: {cur: 0x107, idx: 0xd7}, - 17: {cur: 0x10e, idx: 0xdc}, - 18: {cur: 0x113, idx: 0xe0}, - 19: {cur: 0x115, idx: 0xe4}, - 20: {cur: 0xb1, idx: 0x0}, - 21: {cur: 0xe9, idx: 0xbc}, - 22: {cur: 0x123, idx: 0xe9}, - 23: {cur: 0xb8, idx: 0x4}, - 24: {cur: 0x66, idx: 0xee}, - 25: {cur: 0x13, idx: 0xf4}, - 26: {cur: 0x5c, idx: 0xf8}, - 27: {cur: 0xe9, idx: 0xbc}, - 28: {cur: 0x0, idx: 0xff}, - 29: {cur: 0x2, idx: 0x103}, - 30: {cur: 0x13, idx: 0xf4}, - 31: {cur: 0x23, idx: 0x115}, - 32: {cur: 0x53, idx: 0x13f}, - 33: {cur: 0x57, idx: 0x149}, - 34: {cur: 0x7d, idx: 0x160}, - 35: {cur: 0x7e, idx: 0x16a}, - 36: {cur: 0x83, idx: 0x175}, - 37: {cur: 0x88, idx: 0x17f}, - 38: {cur: 0x8d, idx: 0x18c}, - 39: {cur: 0x91, idx: 0x19a}, - 40: {cur: 0x9c, idx: 0x1a4}, - 41: {cur: 0x9d, idx: 0x1ae}, - 42: {cur: 0xaa, idx: 0x1b8}, - 43: {cur: 0xc0, idx: 0x1c2}, - 44: {cur: 0xcc, idx: 0x1cc}, - 45: {cur: 0xd4, idx: 0x1d6}, - 46: {cur: 0xd7, idx: 0x1e4}, - 47: {cur: 0xd8, idx: 0x1ee}, - 48: {cur: 0xe7, idx: 0x1f9}, - 49: {cur: 0xe9, idx: 0xbc}, - 50: {cur: 0xee, idx: 0x203}, - 51: {cur: 0x11d, idx: 0x215}, - 52: {cur: 0x50, idx: 0x21f}, - 53: {cur: 0x58, idx: 0x223}, - 54: {cur: 0xd8, idx: 0x0}, - 55: {cur: 0xe0, idx: 0x227}, - 56: {cur: 0x62, idx: 0x229}, - 57: {cur: 0xe3, idx: 0x3f}, - 58: {cur: 0xf5, idx: 0x22e}, - 59: {cur: 0x84, idx: 0x25}, - 60: {cur: 0xe9, idx: 0xbc}, - 61: {cur: 0xfa, idx: 0x4}, - 62: {cur: 0x16, idx: 0x232}, - 63: {cur: 0xe9, idx: 0xbc}, - 64: {cur: 0x16, idx: 0x232}, - 65: {cur: 0x2e, idx: 0x0}, - 66: {cur: 0x37, idx: 0x24a}, - 67: {cur: 0x3a, idx: 0x0}, - 68: {cur: 0x84, idx: 0x25}, - 69: {cur: 0xbf, idx: 0x0}, - 70: {cur: 0xd1, idx: 0xb2}, - 71: {cur: 0xfa, idx: 0x4}, - 72: {cur: 0x125, idx: 0x8a}, - 73: {cur: 0xf5, idx: 0x22e}, - 74: {cur: 0x13, idx: 0x0}, - 75: {cur: 0x21, idx: 0x286}, - 76: {cur: 0x2e, idx: 0x0}, - 77: {cur: 0x3a, idx: 0x0}, - 78: {cur: 0x43, idx: 0x0}, - 79: {cur: 0x62, idx: 0x0}, - 80: {cur: 0x71, idx: 0x0}, - 81: {cur: 0x7b, idx: 0x0}, - 82: {cur: 0x7c, idx: 0x0}, - 83: {cur: 0x84, idx: 0x0}, - 84: {cur: 0x8c, idx: 0x0}, - 85: {cur: 0xb1, idx: 0x0}, - 86: {cur: 0xbf, idx: 0x0}, - 87: {cur: 0xf4, idx: 0x0}, - 88: {cur: 0xfa, idx: 0x28c}, - 89: {cur: 0x103, idx: 0x0}, - 90: {cur: 0x10e, idx: 0x0}, - 91: {cur: 0x1b, idx: 0xc}, - 92: {cur: 0xe9, idx: 0xbc}, - 93: {cur: 0x43, idx: 0x25}, - 94: {cur: 0x43, idx: 0x20}, - 95: {cur: 0x13, idx: 0x293}, - 96: {cur: 0x2e, idx: 0x0}, - 97: {cur: 0x3a, idx: 0x296}, - 98: {cur: 0x43, idx: 0x0}, - 99: {cur: 0x62, idx: 0x29f}, - 100: {cur: 0x71, idx: 0x2a5}, - 101: {cur: 0x7b, idx: 0x0}, - 102: {cur: 0x84, idx: 0x0}, - 103: {cur: 0x8c, idx: 0x0}, - 104: {cur: 0xbf, idx: 0x2ae}, - 105: {cur: 0xf4, idx: 0x0}, - 106: {cur: 0xfa, idx: 0x2b7}, - 107: {cur: 0x103, idx: 0x0}, - 108: {cur: 0x10e, idx: 0x0}, - 109: {cur: 0x13, idx: 0x0}, - 110: {cur: 0x18, idx: 0x9}, - 111: {cur: 0x2e, idx: 0x0}, - 112: {cur: 0x3a, idx: 0x0}, - 113: {cur: 0x43, idx: 0x0}, - 114: {cur: 0x62, idx: 0x0}, - 115: {cur: 0x71, idx: 0x0}, - 116: {cur: 0x74, idx: 0x51}, - 117: {cur: 0x7b, idx: 0x0}, - 118: {cur: 0x84, idx: 0x25}, - 119: {cur: 0xb1, idx: 0x0}, - 120: {cur: 0xbf, idx: 0x0}, - 121: {cur: 0xd0, idx: 0x2bc}, - 122: {cur: 0xe9, idx: 0xbc}, - 123: {cur: 0xfa, idx: 0x0}, - 124: {cur: 0x10e, idx: 0x0}, - 125: {cur: 0x115, idx: 0x0}, - 126: {cur: 0x18, idx: 0x2c1}, - 127: {cur: 0x4d, idx: 0x2c6}, - 128: {cur: 0x84, idx: 0x25}, - 129: {cur: 0xc8, idx: 0x2cb}, - 130: {cur: 0xd0, idx: 0x2d0}, - 131: {cur: 0xf2, idx: 0x2d8}, - 132: {cur: 0x13, idx: 0xf4}, - 133: {cur: 0x2e, idx: 0x0}, - 134: {cur: 0x3a, idx: 0x0}, - 135: {cur: 0x43, idx: 0x25}, - 136: {cur: 0x5b, idx: 0x37}, - 137: {cur: 0xb1, idx: 0x0}, - 138: {cur: 0xe9, idx: 0xbc}, - 139: {cur: 0xfa, idx: 0x0}, - 140: {cur: 0x10e, idx: 0x0}, - 141: {cur: 0x61, idx: 0x2dd}, - 142: {cur: 0xd1, idx: 0xb2}, - 143: {cur: 0xf9, idx: 0x2df}, - 144: {cur: 0xfa, idx: 0x4}, - 145: {cur: 0x13, idx: 0xf4}, - 146: {cur: 0x48, idx: 0x2e3}, - 147: {cur: 0x4d, idx: 0x2c}, - 148: {cur: 0x7b, idx: 0x0}, - 149: {cur: 0x7c, idx: 0x0}, - 150: {cur: 0x103, idx: 0x0}, - 151: {cur: 0x110, idx: 0x2e8}, - 152: {cur: 0xd1, idx: 0xb2}, - 153: {cur: 0x8c, idx: 0x0}, - 154: {cur: 0xe9, idx: 0xbc}, - 155: {cur: 0x13, idx: 0xf4}, - 156: {cur: 0x51, idx: 0x2ef}, - 157: {cur: 0xe9, idx: 0xbc}, - 158: {cur: 0xfa, idx: 0x4}, - 159: {cur: 0x85, idx: 0x2f3}, - 160: {cur: 0x12, idx: 0x2f7}, - 161: {cur: 0x13, idx: 0xf4}, - 162: {cur: 0x20, idx: 0x2fb}, - 163: {cur: 0x22, idx: 0x2ff}, - 164: {cur: 0x4f, idx: 0x308}, - 165: {cur: 0x84, idx: 0x25}, - 166: {cur: 0xe9, idx: 0xbc}, - 167: {cur: 0xfa, idx: 0x4}, - 168: {cur: 0x5d, idx: 0x0}, - 169: {cur: 0x98, idx: 0x2dd}, - 170: {cur: 0x13, idx: 0x0}, - 171: {cur: 0x84, idx: 0x25}, - 172: {cur: 0xc8, idx: 0xa6}, - 173: {cur: 0xe9, idx: 0xbc}, - 174: {cur: 0xfa, idx: 0x4}, - 175: {cur: 0x13, idx: 0xf4}, - 176: {cur: 0x33, idx: 0x31d}, - 177: {cur: 0x7b, idx: 0x0}, - 178: {cur: 0x8c, idx: 0x321}, - 179: {cur: 0xe9, idx: 0x327}, - 180: {cur: 0x107, idx: 0x0}, - 181: {cur: 0x85, idx: 0x2f3}, - 182: {cur: 0x13, idx: 0xf4}, - 183: {cur: 0x66, idx: 0xee}, - 184: {cur: 0xe9, idx: 0xbc}, - 185: {cur: 0x6c, idx: 0x32d}, - 186: {cur: 0xe9, idx: 0xbc}, - 187: {cur: 0xfa, idx: 0x4}, - 188: {cur: 0x84, idx: 0x25}, - 189: {cur: 0xfa, idx: 0x4}, - 190: {cur: 0x84, idx: 0x62}, - 191: {cur: 0xfa, idx: 0xcf}, - 192: {cur: 0x10e, idx: 0x4}, - 193: {cur: 0x10e, idx: 0x4}, - 194: {cur: 0x13, idx: 0x4}, - 195: {cur: 0x2e, idx: 0x0}, - 196: {cur: 0x3a, idx: 0x0}, - 197: {cur: 0x43, idx: 0x0}, - 198: {cur: 0x5d, idx: 0x0}, - 199: {cur: 0x62, idx: 0x0}, - 200: {cur: 0x71, idx: 0x0}, - 201: {cur: 0x7b, idx: 0x0}, - 202: {cur: 0x7c, idx: 0x0}, - 203: {cur: 0x84, idx: 0x0}, - 204: {cur: 0x8c, idx: 0x0}, - 205: {cur: 0xb1, idx: 0x0}, - 206: {cur: 0xbf, idx: 0x0}, - 207: {cur: 0xd6, idx: 0x7e}, - 208: {cur: 0xf4, idx: 0x0}, - 209: {cur: 0xfa, idx: 0x0}, - 210: {cur: 0x103, idx: 0x0}, - 211: {cur: 0x107, idx: 0x0}, - 212: {cur: 0x10e, idx: 0x0}, - 213: {cur: 0x113, idx: 0x0}, - 214: {cur: 0x115, idx: 0x340}, - 215: {cur: 0x1a, idx: 0x4}, - 216: {cur: 0x24, idx: 0x344}, - 217: {cur: 0x25, idx: 0x4}, - 218: {cur: 0x32, idx: 0x4}, - 219: {cur: 0x35, idx: 0x16}, - 220: {cur: 0x39, idx: 0x4}, - 221: {cur: 0x3a, idx: 0x4}, - 222: {cur: 0x13, idx: 0x4}, - 223: {cur: 0xbf, idx: 0x4}, - 224: {cur: 0x13, idx: 0x4}, - 225: {cur: 0x51, idx: 0x2ef}, - 226: {cur: 0x10e, idx: 0x4}, - 227: {cur: 0x58, idx: 0x223}, - 228: {cur: 0x5f, idx: 0x4}, - 229: {cur: 0x60, idx: 0x3f}, - 230: {cur: 0x62, idx: 0x229}, - 231: {cur: 0x10e, idx: 0x4}, - 232: {cur: 0x66, idx: 0xee}, - 233: {cur: 0x62, idx: 0x229}, - 234: {cur: 0x67, idx: 0x3f}, - 235: {cur: 0x68, idx: 0x348}, - 236: {cur: 0x70, idx: 0x4}, - 237: {cur: 0x82, idx: 0x4}, - 238: {cur: 0x85, idx: 0x2f3}, - 239: {cur: 0x13, idx: 0x4}, - 240: {cur: 0x10e, idx: 0x4}, - 241: {cur: 0x8e, idx: 0x4}, - 242: {cur: 0x10e, idx: 0x4}, - 243: {cur: 0x93, idx: 0x4}, - 244: {cur: 0x123, idx: 0xe9}, - 245: {cur: 0xa2, idx: 0x87}, - 246: {cur: 0xa9, idx: 0x34a}, - 247: {cur: 0x10e, idx: 0x4}, - 248: {cur: 0x62, idx: 0x229}, - 249: {cur: 0xad, idx: 0x7e}, - 250: {cur: 0xb0, idx: 0x34f}, - 251: {cur: 0xb4, idx: 0x94}, - 252: {cur: 0xb8, idx: 0x4}, - 253: {cur: 0x13, idx: 0x4}, - 254: {cur: 0xb9, idx: 0x97}, - 255: {cur: 0x13, idx: 0x4}, - 256: {cur: 0xbf, idx: 0x4}, - 257: {cur: 0xbf, idx: 0x4}, - 258: {cur: 0xc5, idx: 0x8a}, - 259: {cur: 0xc6, idx: 0xa2}, - 260: {cur: 0xc7, idx: 0x7e}, - 261: {cur: 0xbf, idx: 0x4}, - 262: {cur: 0xd3, idx: 0xb6}, - 263: {cur: 0xd5, idx: 0x4}, - 264: {cur: 0xd6, idx: 0x352}, - 265: {cur: 0xda, idx: 0x30}, - 266: {cur: 0xdb, idx: 0x4}, - 267: {cur: 0x62, idx: 0x229}, - 268: {cur: 0xdc, idx: 0x3f}, - 269: {cur: 0xdf, idx: 0x355}, - 270: {cur: 0x62, idx: 0x229}, - 271: {cur: 0xe3, idx: 0x3f}, - 272: {cur: 0x8, idx: 0x358}, - 273: {cur: 0xe8, idx: 0x35d}, - 274: {cur: 0xbf, idx: 0x4}, - 275: {cur: 0xef, idx: 0xc0}, - 276: {cur: 0xf3, idx: 0x4}, - 277: {cur: 0x13, idx: 0x4}, - 278: {cur: 0xf5, idx: 0x22e}, - 279: {cur: 0xf9, idx: 0x2df}, - 280: {cur: 0x10e, idx: 0x4}, - 281: {cur: 0x105, idx: 0x35f}, - 282: {cur: 0x106, idx: 0x362}, - 283: {cur: 0x123, idx: 0xe9}, - 284: {cur: 0x125, idx: 0x8a}, - 285: {cur: 0x13, idx: 0x0}, - 286: {cur: 0x2e, idx: 0x0}, - 287: {cur: 0x43, idx: 0x0}, - 288: {cur: 0x5b, idx: 0x37}, - 289: {cur: 0x62, idx: 0x0}, - 290: {cur: 0x71, idx: 0x0}, - 291: {cur: 0x7b, idx: 0x0}, - 292: {cur: 0x7c, idx: 0x0}, - 293: {cur: 0x84, idx: 0x0}, - 294: {cur: 0x8c, idx: 0x0}, - 295: {cur: 0xb1, idx: 0x0}, - 296: {cur: 0xbf, idx: 0x0}, - 297: {cur: 0xe9, idx: 0xbc}, - 298: {cur: 0xf4, idx: 0x0}, - 299: {cur: 0xfa, idx: 0x4}, - 300: {cur: 0x107, idx: 0x0}, - 301: {cur: 0x10e, idx: 0x0}, - 302: {cur: 0x113, idx: 0x0}, - 303: {cur: 0x3a, idx: 0x0}, - 304: {cur: 0x5d, idx: 0x0}, - 305: {cur: 0xe9, idx: 0x0}, - 306: {cur: 0xfa, idx: 0x0}, - 307: {cur: 0x103, idx: 0x0}, - 308: {cur: 0x11, idx: 0x4}, - 309: {cur: 0xfa, idx: 0xcf}, - 310: {cur: 0x27, idx: 0x10}, - 311: {cur: 0x2e, idx: 0x13}, - 312: {cur: 0x39, idx: 0x4}, - 313: {cur: 0x41, idx: 0x4}, - 314: {cur: 0xfa, idx: 0xcf}, - 315: {cur: 0x44, idx: 0x4}, - 316: {cur: 0xfa, idx: 0xcf}, - 317: {cur: 0x46, idx: 0x28}, - 318: {cur: 0x4a, idx: 0x4}, - 319: {cur: 0xfa, idx: 0xcf}, - 320: {cur: 0x52, idx: 0x256}, - 321: {cur: 0xfa, idx: 0xcf}, - 322: {cur: 0xfa, idx: 0x4}, - 323: {cur: 0x107, idx: 0xd7}, - 324: {cur: 0x6d, idx: 0x49}, - 325: {cur: 0x72, idx: 0x4f}, - 326: {cur: 0x4, idx: 0x36a}, - 327: {cur: 0x8, idx: 0x36d}, - 328: {cur: 0x9, idx: 0x1}, - 329: {cur: 0x11, idx: 0x371}, - 330: {cur: 0x13, idx: 0xf4}, - 331: {cur: 0x14, idx: 0x374}, - 332: {cur: 0x43, idx: 0x20}, - 333: {cur: 0xb1, idx: 0x4}, - 334: {cur: 0x115, idx: 0x0}, - 335: {cur: 0xbb, idx: 0x9b}, - 336: {cur: 0xc1, idx: 0x37c}, - 337: {cur: 0xc3, idx: 0x380}, - 338: {cur: 0xc6, idx: 0xa2}, - 339: {cur: 0xfa, idx: 0x4}, - 340: {cur: 0xcb, idx: 0x383}, - 341: {cur: 0xfa, idx: 0x4}, - 342: {cur: 0x84, idx: 0x25}, - 343: {cur: 0xfa, idx: 0x4}, - 344: {cur: 0xfa, idx: 0xcf}, - 345: {cur: 0xff, idx: 0x4}, - 346: {cur: 0x102, idx: 0x387}, - 347: {cur: 0x13, idx: 0xf4}, - 348: {cur: 0x56, idx: 0x30}, - 349: {cur: 0x84, idx: 0x25}, - 350: {cur: 0xe9, idx: 0xbc}, - 351: {cur: 0xfa, idx: 0x4}, - 352: {cur: 0x5b, idx: 0x37}, - 353: {cur: 0xe9, idx: 0xbc}, - 354: {cur: 0x4, idx: 0x38b}, - 355: {cur: 0x3a, idx: 0x296}, - 356: {cur: 0x43, idx: 0x38e}, - 357: {cur: 0x71, idx: 0x393}, - 358: {cur: 0x7e, idx: 0x397}, - 359: {cur: 0x84, idx: 0x25}, - 360: {cur: 0xb1, idx: 0x3a0}, - 361: {cur: 0xbf, idx: 0x3a4}, - 362: {cur: 0xe9, idx: 0xbc}, - 363: {cur: 0xfa, idx: 0x4}, - 364: {cur: 0x10e, idx: 0x3a8}, - 365: {cur: 0x69, idx: 0x46}, - 366: {cur: 0xaa, idx: 0x3ac}, - 367: {cur: 0x13, idx: 0x0}, - 368: {cur: 0x2e, idx: 0x0}, - 369: {cur: 0x3a, idx: 0x0}, - 370: {cur: 0x43, idx: 0x0}, - 371: {cur: 0x5e, idx: 0x3af}, - 372: {cur: 0x71, idx: 0x0}, - 373: {cur: 0x7b, idx: 0x0}, - 374: {cur: 0x7c, idx: 0x0}, - 375: {cur: 0x84, idx: 0x25}, - 376: {cur: 0x8c, idx: 0x0}, - 377: {cur: 0xb1, idx: 0x0}, - 378: {cur: 0xbf, idx: 0x0}, - 379: {cur: 0xf4, idx: 0x0}, - 380: {cur: 0xfa, idx: 0x4}, - 381: {cur: 0x103, idx: 0x0}, - 382: {cur: 0x10e, idx: 0x0}, - 383: {cur: 0x115, idx: 0x0}, - 384: {cur: 0x84, idx: 0x25}, - 385: {cur: 0xc6, idx: 0xa2}, - 386: {cur: 0xe9, idx: 0xbc}, - 387: {cur: 0xfa, idx: 0x4}, - 388: {cur: 0x51, idx: 0x30}, - 389: {cur: 0x51, idx: 0x2ef}, - 390: {cur: 0x11, idx: 0x3b2}, - 391: {cur: 0x13, idx: 0x3b6}, - 392: {cur: 0x1d, idx: 0x3ba}, - 393: {cur: 0x25, idx: 0x3bd}, - 394: {cur: 0x26, idx: 0x3c1}, - 395: {cur: 0x32, idx: 0x3c5}, - 396: {cur: 0x39, idx: 0x3c9}, - 397: {cur: 0x3a, idx: 0x296}, - 398: {cur: 0x41, idx: 0x3cd}, - 399: {cur: 0x43, idx: 0x0}, - 400: {cur: 0x44, idx: 0x3d1}, - 401: {cur: 0x4c, idx: 0x3d5}, - 402: {cur: 0x5f, idx: 0x3de}, - 403: {cur: 0x60, idx: 0x3e2}, - 404: {cur: 0x61, idx: 0x2dd}, - 405: {cur: 0x62, idx: 0x3e7}, - 406: {cur: 0x67, idx: 0x3ec}, - 407: {cur: 0x71, idx: 0x0}, - 408: {cur: 0x78, idx: 0x3f1}, - 409: {cur: 0x79, idx: 0x3f6}, - 410: {cur: 0x81, idx: 0x3fb}, - 411: {cur: 0x84, idx: 0x0}, - 412: {cur: 0x91, idx: 0x401}, - 413: {cur: 0xac, idx: 0x406}, - 414: {cur: 0xb1, idx: 0x3a0}, - 415: {cur: 0xb8, idx: 0x40b}, - 416: {cur: 0xbf, idx: 0x3a4}, - 417: {cur: 0xcd, idx: 0x412}, - 418: {cur: 0xd5, idx: 0x419}, - 419: {cur: 0xdb, idx: 0x41d}, - 420: {cur: 0xe1, idx: 0x421}, - 421: {cur: 0xf3, idx: 0x425}, - 422: {cur: 0xf4, idx: 0x0}, - 423: {cur: 0xfa, idx: 0x429}, - 424: {cur: 0xff, idx: 0x42d}, - 425: {cur: 0x106, idx: 0x362}, - 426: {cur: 0x10e, idx: 0x0}, - 427: {cur: 0x115, idx: 0x431}, - 428: {cur: 0x24, idx: 0x344}, - 429: {cur: 0x11, idx: 0x0}, - 430: {cur: 0x13, idx: 0x439}, - 431: {cur: 0x25, idx: 0x0}, - 432: {cur: 0x26, idx: 0x0}, - 433: {cur: 0x32, idx: 0x0}, - 434: {cur: 0x39, idx: 0x0}, - 435: {cur: 0x3a, idx: 0x4}, - 436: {cur: 0x41, idx: 0x0}, - 437: {cur: 0x43, idx: 0x20}, - 438: {cur: 0x44, idx: 0x0}, - 439: {cur: 0x5f, idx: 0x0}, - 440: {cur: 0x60, idx: 0x0}, - 441: {cur: 0x62, idx: 0x3f}, - 442: {cur: 0x67, idx: 0x0}, - 443: {cur: 0x71, idx: 0x43f}, - 444: {cur: 0x7b, idx: 0x0}, - 445: {cur: 0x7c, idx: 0x0}, - 446: {cur: 0x84, idx: 0x25}, - 447: {cur: 0x8c, idx: 0x0}, - 448: {cur: 0x91, idx: 0x0}, - 449: {cur: 0xb1, idx: 0x0}, - 450: {cur: 0xb8, idx: 0x0}, - 451: {cur: 0xbf, idx: 0x445}, - 452: {cur: 0xd5, idx: 0x0}, - 453: {cur: 0xdb, idx: 0x44b}, - 454: {cur: 0xe1, idx: 0x0}, - 455: {cur: 0xf3, idx: 0x0}, - 456: {cur: 0xfa, idx: 0x451}, - 457: {cur: 0xff, idx: 0x0}, - 458: {cur: 0x103, idx: 0x0}, - 459: {cur: 0x107, idx: 0x0}, - 460: {cur: 0x113, idx: 0x0}, - 461: {cur: 0x115, idx: 0x0}, - 462: {cur: 0x3b, idx: 0x315}, - 463: {cur: 0x50, idx: 0x21f}, - 464: {cur: 0x53, idx: 0x457}, - 465: {cur: 0x69, idx: 0x46}, - 466: {cur: 0x75, idx: 0x45a}, - 467: {cur: 0x88, idx: 0x6b}, - 468: {cur: 0x61, idx: 0x0}, - 469: {cur: 0x98, idx: 0x2dd}, - 470: {cur: 0xa2, idx: 0x87}, - 471: {cur: 0xaa, idx: 0x3ac}, - 472: {cur: 0xad, idx: 0x7e}, - 473: {cur: 0xd3, idx: 0xb6}, - 474: {cur: 0xd6, idx: 0x352}, - 475: {cur: 0xe7, idx: 0x45c}, - 476: {cur: 0xee, idx: 0x45f}, - 477: {cur: 0x105, idx: 0x35f}, - 478: {cur: 0x13, idx: 0xf4}, - 479: {cur: 0x3a, idx: 0x9b}, - 480: {cur: 0x5f, idx: 0x153}, - 481: {cur: 0xd5, idx: 0x27c}, - 482: {cur: 0xe9, idx: 0xbc}, - 483: {cur: 0x115, idx: 0x0}, - 484: {cur: 0x84, idx: 0x25}, - 485: {cur: 0xe9, idx: 0xbc}, - 486: {cur: 0xfa, idx: 0x4}, - 487: {cur: 0xe9, idx: 0xbc}, - 488: {cur: 0xfa, idx: 0x4}, - 489: {cur: 0x13, idx: 0x293}, - 490: {cur: 0x2e, idx: 0x462}, - 491: {cur: 0x3a, idx: 0x296}, - 492: {cur: 0x5b, idx: 0x37}, - 493: {cur: 0xb1, idx: 0x3a0}, - 494: {cur: 0xe9, idx: 0xbc}, - 495: {cur: 0xfa, idx: 0x4}, - 496: {cur: 0x12, idx: 0x2f7}, - 497: {cur: 0x84, idx: 0x25}, - 498: {cur: 0xfa, idx: 0x4}, - 499: {cur: 0xe9, idx: 0xbc}, - 500: {cur: 0x85, idx: 0x2f3}, - 501: {cur: 0xb9, idx: 0x97}, - 502: {cur: 0x66, idx: 0xee}, - 503: {cur: 0xfa, idx: 0x4}, - 504: {cur: 0x43, idx: 0x474}, - 505: {cur: 0x79, idx: 0x47f}, - 506: {cur: 0x84, idx: 0x25}, - 507: {cur: 0xe9, idx: 0xbc}, - 508: {cur: 0xfa, idx: 0x4}, - 509: {cur: 0xe9, idx: 0xbc}, - 510: {cur: 0xfa, idx: 0x4}, - 511: {cur: 0x13, idx: 0x0}, - 512: {cur: 0x2e, idx: 0x0}, - 513: {cur: 0x3a, idx: 0x0}, - 514: {cur: 0x43, idx: 0x0}, - 515: {cur: 0x5d, idx: 0x0}, - 516: {cur: 0x62, idx: 0x0}, - 517: {cur: 0x71, idx: 0x0}, - 518: {cur: 0x7b, idx: 0x0}, - 519: {cur: 0x7c, idx: 0x0}, - 520: {cur: 0x84, idx: 0x0}, - 521: {cur: 0x8c, idx: 0x0}, - 522: {cur: 0xb1, idx: 0x0}, - 523: {cur: 0xbf, idx: 0x0}, - 524: {cur: 0xf4, idx: 0x0}, - 525: {cur: 0xfa, idx: 0x0}, - 526: {cur: 0x103, idx: 0x0}, - 527: {cur: 0x10e, idx: 0x0}, - 528: {cur: 0x115, idx: 0x0}, - 529: {cur: 0x18, idx: 0x9}, - 530: {cur: 0x13, idx: 0x0}, - 531: {cur: 0x84, idx: 0x25}, - 532: {cur: 0xc8, idx: 0xa6}, - 533: {cur: 0xe9, idx: 0xbc}, - 534: {cur: 0xfa, idx: 0x4}, - 535: {cur: 0x13, idx: 0x0}, - 536: {cur: 0x2e, idx: 0x0}, - 537: {cur: 0x3a, idx: 0x0}, - 538: {cur: 0x43, idx: 0x0}, - 539: {cur: 0x5d, idx: 0x0}, - 540: {cur: 0x62, idx: 0x0}, - 541: {cur: 0x71, idx: 0x0}, - 542: {cur: 0x76, idx: 0x54}, - 543: {cur: 0x7b, idx: 0x0}, - 544: {cur: 0x7c, idx: 0x0}, - 545: {cur: 0x84, idx: 0x25}, - 546: {cur: 0x8c, idx: 0x0}, - 547: {cur: 0xb1, idx: 0x0}, - 548: {cur: 0xbf, idx: 0x0}, - 549: {cur: 0xf4, idx: 0x0}, - 550: {cur: 0xfa, idx: 0x0}, - 551: {cur: 0x103, idx: 0x0}, - 552: {cur: 0x10e, idx: 0x0}, - 553: {cur: 0x7, idx: 0x486}, - 554: {cur: 0xe9, idx: 0xbc}, - 555: {cur: 0xfa, idx: 0x4}, - 556: {cur: 0x13, idx: 0xf4}, - 557: {cur: 0x77, idx: 0x57}, - 558: {cur: 0x7c, idx: 0x7e}, - 559: {cur: 0xe9, idx: 0xbc}, - 560: {cur: 0xb9, idx: 0x97}, - 561: {cur: 0x43, idx: 0x25}, - 562: {cur: 0x13, idx: 0x0}, - 563: {cur: 0x2e, idx: 0x0}, - 564: {cur: 0x3a, idx: 0x0}, - 565: {cur: 0x5d, idx: 0x0}, - 566: {cur: 0x62, idx: 0x0}, - 567: {cur: 0x7c, idx: 0x0}, - 568: {cur: 0x8c, idx: 0x0}, - 569: {cur: 0xb1, idx: 0x0}, - 570: {cur: 0xbf, idx: 0x0}, - 571: {cur: 0xf4, idx: 0x0}, - 572: {cur: 0xfa, idx: 0x0}, - 573: {cur: 0x103, idx: 0x0}, - 574: {cur: 0x2e, idx: 0x0}, - 575: {cur: 0x71, idx: 0x0}, - 576: {cur: 0x84, idx: 0x0}, - 577: {cur: 0x8c, idx: 0x0}, - 578: {cur: 0xb1, idx: 0x0}, - 579: {cur: 0xe9, idx: 0xbc}, - 580: {cur: 0xf4, idx: 0x0}, - 581: {cur: 0x43, idx: 0x48d}, - 582: {cur: 0x84, idx: 0x491}, - 583: {cur: 0xfa, idx: 0x4}, - 584: {cur: 0xf5, idx: 0x22e}, - 585: {cur: 0x13, idx: 0x0}, - 586: {cur: 0x43, idx: 0x0}, - 587: {cur: 0x64, idx: 0x42}, - 588: {cur: 0x71, idx: 0x0}, - 589: {cur: 0x7b, idx: 0x0}, - 590: {cur: 0x7c, idx: 0x0}, - 591: {cur: 0x84, idx: 0x0}, - 592: {cur: 0x8c, idx: 0x0}, - 593: {cur: 0xbf, idx: 0x0}, - 594: {cur: 0x103, idx: 0x0}, - 595: {cur: 0x53, idx: 0x457}, - 596: {cur: 0x85, idx: 0x2f3}, - 597: {cur: 0xf5, idx: 0x22e}, - 598: {cur: 0x13, idx: 0xf4}, - 599: {cur: 0x4b, idx: 0x495}, - 600: {cur: 0xe9, idx: 0xbc}, - 601: {cur: 0x85, idx: 0x2f3}, - 602: {cur: 0x8f, idx: 0x72}, - 603: {cur: 0xd1, idx: 0xb2}, - 604: {cur: 0xe9, idx: 0xbc}, - 605: {cur: 0xfa, idx: 0x4}, - 606: {cur: 0x51, idx: 0x2ef}, - 607: {cur: 0x85, idx: 0x2f3}, - 608: {cur: 0x87, idx: 0x67}, - 609: {cur: 0xe9, idx: 0xbc}, - 610: {cur: 0xfa, idx: 0x4}, - 611: {cur: 0xe9, idx: 0xbc}, - 612: {cur: 0xfa, idx: 0x4}, - 613: {cur: 0x13, idx: 0xf4}, - 614: {cur: 0xf5, idx: 0x22e}, - 615: {cur: 0x13, idx: 0x0}, - 616: {cur: 0x2e, idx: 0x0}, - 617: {cur: 0x3a, idx: 0x0}, - 618: {cur: 0x62, idx: 0x0}, - 619: {cur: 0x71, idx: 0x0}, - 620: {cur: 0x7b, idx: 0x0}, - 621: {cur: 0x7c, idx: 0x0}, - 622: {cur: 0x86, idx: 0x49f}, - 623: {cur: 0x8c, idx: 0x0}, - 624: {cur: 0xb1, idx: 0x0}, - 625: {cur: 0xbf, idx: 0x0}, - 626: {cur: 0xe9, idx: 0xbc}, - 627: {cur: 0xf4, idx: 0x0}, - 628: {cur: 0xfa, idx: 0x0}, - 629: {cur: 0x10e, idx: 0x0}, - 630: {cur: 0xf5, idx: 0x22e}, - 631: {cur: 0x12, idx: 0x2f7}, - 632: {cur: 0x13, idx: 0xf4}, - 633: {cur: 0x84, idx: 0x25}, - 634: {cur: 0xe9, idx: 0xbc}, - 635: {cur: 0xfa, idx: 0x4}, - 636: {cur: 0xf9, idx: 0x2df}, - 637: {cur: 0xfa, idx: 0x4}, - 638: {cur: 0x3b, idx: 0x315}, - 639: {cur: 0x9, idx: 0x1}, - 640: {cur: 0x90, idx: 0x76}, - 641: {cur: 0xe9, idx: 0xbc}, - 642: {cur: 0x13, idx: 0x0}, - 643: {cur: 0x2e, idx: 0x0}, - 644: {cur: 0x3a, idx: 0x0}, - 645: {cur: 0x43, idx: 0x0}, - 646: {cur: 0x62, idx: 0x0}, - 647: {cur: 0x71, idx: 0x0}, - 648: {cur: 0x7b, idx: 0x0}, - 649: {cur: 0x7c, idx: 0x0}, - 650: {cur: 0x84, idx: 0x0}, - 651: {cur: 0x8c, idx: 0x0}, - 652: {cur: 0xb1, idx: 0x0}, - 653: {cur: 0xbf, idx: 0x0}, - 654: {cur: 0xf4, idx: 0x0}, - 655: {cur: 0xfa, idx: 0x0}, - 656: {cur: 0x103, idx: 0x0}, - 657: {cur: 0x107, idx: 0x0}, - 658: {cur: 0x10e, idx: 0x0}, - 659: {cur: 0x113, idx: 0x0}, - 660: {cur: 0x115, idx: 0x0}, - 661: {cur: 0x3b, idx: 0x315}, - 662: {cur: 0x85, idx: 0x2f3}, - 663: {cur: 0x85, idx: 0x2f3}, - 664: {cur: 0x13, idx: 0xf4}, - 665: {cur: 0x84, idx: 0x25}, - 666: {cur: 0x9a, idx: 0x84}, - 667: {cur: 0xe9, idx: 0xbc}, - 668: {cur: 0xfa, idx: 0x4}, - 669: {cur: 0x85, idx: 0x2f3}, - 670: {cur: 0xf5, idx: 0x22e}, - 671: {cur: 0x85, idx: 0x2f3}, - 672: {cur: 0xad, idx: 0x7e}, - 673: {cur: 0xa2, idx: 0x87}, - 674: {cur: 0xb7, idx: 0x4ac}, - 675: {cur: 0x13, idx: 0x0}, - 676: {cur: 0x43, idx: 0x0}, - 677: {cur: 0x62, idx: 0x0}, - 678: {cur: 0x71, idx: 0x0}, - 679: {cur: 0x7b, idx: 0x0}, - 680: {cur: 0x7c, idx: 0x0}, - 681: {cur: 0x84, idx: 0x0}, - 682: {cur: 0x8c, idx: 0x0}, - 683: {cur: 0xa4, idx: 0x4b0}, - 684: {cur: 0xbf, idx: 0x0}, - 685: {cur: 0xf4, idx: 0x0}, - 686: {cur: 0x103, idx: 0x0}, - 687: {cur: 0x84, idx: 0x25}, - 688: {cur: 0xe9, idx: 0xbc}, - 689: {cur: 0xfa, idx: 0x4}, - 690: {cur: 0xa8, idx: 0x8c}, - 691: {cur: 0xe9, idx: 0xbc}, - 692: {cur: 0xfa, idx: 0x4}, - 693: {cur: 0xe9, idx: 0xbc}, - 694: {cur: 0xfa, idx: 0x4}, - 695: {cur: 0x3a, idx: 0x0}, - 696: {cur: 0xb1, idx: 0x0}, - 697: {cur: 0xb4, idx: 0x94}, - 698: {cur: 0xfa, idx: 0x0}, - 699: {cur: 0x26, idx: 0x4}, - 700: {cur: 0xdb, idx: 0x4}, - 701: {cur: 0x8, idx: 0x4bc}, - 702: {cur: 0x14, idx: 0x4c0}, - 703: {cur: 0x75, idx: 0x45a}, - 704: {cur: 0xa7, idx: 0x8a}, - 705: {cur: 0xc1, idx: 0x37c}, - 706: {cur: 0xe9, idx: 0xbc}, - 707: {cur: 0xf3, idx: 0x20d}, - 708: {cur: 0xfa, idx: 0x4}, - 709: {cur: 0xb8, idx: 0x4}, - 710: {cur: 0x13, idx: 0x0}, - 711: {cur: 0x2e, idx: 0x0}, - 712: {cur: 0x3a, idx: 0x0}, - 713: {cur: 0x43, idx: 0x0}, - 714: {cur: 0x71, idx: 0x0}, - 715: {cur: 0x7b, idx: 0x0}, - 716: {cur: 0x7c, idx: 0x0}, - 717: {cur: 0x84, idx: 0x0}, - 718: {cur: 0x8c, idx: 0x0}, - 719: {cur: 0xb1, idx: 0x0}, - 720: {cur: 0xbd, idx: 0x30}, - 721: {cur: 0xbf, idx: 0x0}, - 722: {cur: 0xf4, idx: 0x0}, - 723: {cur: 0xfa, idx: 0x0}, - 724: {cur: 0x103, idx: 0x0}, - 725: {cur: 0x107, idx: 0x0}, - 726: {cur: 0x10e, idx: 0x0}, - 727: {cur: 0x115, idx: 0x0}, - 728: {cur: 0xbe, idx: 0x4c4}, - 729: {cur: 0xe9, idx: 0xbc}, - 730: {cur: 0x13, idx: 0xf4}, - 731: {cur: 0x3a, idx: 0x9b}, - 732: {cur: 0x5f, idx: 0x153}, - 733: {cur: 0xd5, idx: 0x27c}, - 734: {cur: 0xe9, idx: 0xbc}, - 735: {cur: 0x115, idx: 0x0}, - 736: {cur: 0x14, idx: 0x374}, - 737: {cur: 0xfa, idx: 0x4}, - 738: {cur: 0x8, idx: 0x358}, - 739: {cur: 0xe1, idx: 0x4}, - 740: {cur: 0x8, idx: 0x358}, - 741: {cur: 0xbd, idx: 0x30}, - 742: {cur: 0x62, idx: 0x229}, - 743: {cur: 0xe3, idx: 0x3f}, - 744: {cur: 0xf9, idx: 0x2df}, - 745: {cur: 0x5c, idx: 0x24a}, - 746: {cur: 0x85, idx: 0x2f3}, - 747: {cur: 0x64, idx: 0x42}, - 748: {cur: 0xfa, idx: 0x4}, - 749: {cur: 0x64, idx: 0x0}, - 750: {cur: 0xd1, idx: 0xb2}, - 751: {cur: 0xe9, idx: 0xbc}, - 752: {cur: 0xc7, idx: 0x4d8}, - 753: {cur: 0x13, idx: 0x0}, - 754: {cur: 0x3a, idx: 0x0}, - 755: {cur: 0x43, idx: 0x0}, - 756: {cur: 0x62, idx: 0x0}, - 757: {cur: 0x71, idx: 0x0}, - 758: {cur: 0x7b, idx: 0x0}, - 759: {cur: 0x7c, idx: 0x0}, - 760: {cur: 0x84, idx: 0x0}, - 761: {cur: 0x8c, idx: 0x0}, - 762: {cur: 0xb1, idx: 0x0}, - 763: {cur: 0xbf, idx: 0x0}, - 764: {cur: 0xc8, idx: 0xa6}, - 765: {cur: 0xf4, idx: 0x0}, - 766: {cur: 0xfa, idx: 0x0}, - 767: {cur: 0x103, idx: 0x0}, - 768: {cur: 0x4, idx: 0x38b}, - 769: {cur: 0x13, idx: 0xf4}, - 770: {cur: 0xca, idx: 0x4db}, - 771: {cur: 0xe9, idx: 0xbc}, - 772: {cur: 0x9, idx: 0x1}, - 773: {cur: 0x4b, idx: 0x495}, - 774: {cur: 0xca, idx: 0x4e0}, - 775: {cur: 0x98, idx: 0x2dd}, - 776: {cur: 0xa9, idx: 0x34a}, - 777: {cur: 0xb7, idx: 0x4ac}, - 778: {cur: 0xca, idx: 0x495}, - 779: {cur: 0xe4, idx: 0xb9}, - 780: {cur: 0xc3, idx: 0x380}, - 781: {cur: 0x27, idx: 0x10}, - 782: {cur: 0xc3, idx: 0x0}, - 783: {cur: 0xc3, idx: 0x0}, - 784: {cur: 0xfa, idx: 0x4}, - 785: {cur: 0x24, idx: 0x344}, - 786: {cur: 0x13, idx: 0x0}, - 787: {cur: 0x2e, idx: 0x0}, - 788: {cur: 0x3a, idx: 0x0}, - 789: {cur: 0x43, idx: 0x0}, - 790: {cur: 0x5d, idx: 0x0}, - 791: {cur: 0x62, idx: 0x0}, - 792: {cur: 0x71, idx: 0x0}, - 793: {cur: 0x7b, idx: 0x0}, - 794: {cur: 0x7c, idx: 0x0}, - 795: {cur: 0x84, idx: 0x0}, - 796: {cur: 0x8c, idx: 0x0}, - 797: {cur: 0xb1, idx: 0x0}, - 798: {cur: 0xbf, idx: 0x0}, - 799: {cur: 0xf4, idx: 0x0}, - 800: {cur: 0xfa, idx: 0x0}, - 801: {cur: 0x103, idx: 0x0}, - 802: {cur: 0x10e, idx: 0x0}, - 803: {cur: 0xa1, idx: 0x4f}, - 804: {cur: 0xf5, idx: 0x22e}, - 805: {cur: 0x0, idx: 0x4e7}, - 806: {cur: 0x84, idx: 0x25}, - 807: {cur: 0xd1, idx: 0xb2}, - 808: {cur: 0xd2, idx: 0x18}, - 809: {cur: 0xe9, idx: 0xbc}, - 810: {cur: 0xed, idx: 0x4f0}, - 811: {cur: 0xf6, idx: 0xcb}, - 812: {cur: 0xfa, idx: 0x4}, - 813: {cur: 0x37, idx: 0x24a}, - 814: {cur: 0xd2, idx: 0x0}, - 815: {cur: 0x86, idx: 0x49f}, - 816: {cur: 0x8f, idx: 0x72}, - 817: {cur: 0xa1, idx: 0x4f}, - 818: {cur: 0xd3, idx: 0xb6}, - 819: {cur: 0xf5, idx: 0x22e}, - 820: {cur: 0xd1, idx: 0xb2}, - 821: {cur: 0x85, idx: 0x2f3}, - 822: {cur: 0xf5, idx: 0x22e}, - 823: {cur: 0x51, idx: 0x4f7}, - 824: {cur: 0xbd, idx: 0x30}, - 825: {cur: 0xda, idx: 0x4fb}, - 826: {cur: 0xe9, idx: 0xbc}, - 827: {cur: 0xbd, idx: 0x4ff}, - 828: {cur: 0xda, idx: 0x30}, - 829: {cur: 0xb7, idx: 0x4ac}, - 830: {cur: 0x92, idx: 0x503}, - 831: {cur: 0xe9, idx: 0xbc}, - 832: {cur: 0x113, idx: 0x50b}, - 833: {cur: 0x13, idx: 0x0}, - 834: {cur: 0x2e, idx: 0x0}, - 835: {cur: 0x3a, idx: 0x0}, - 836: {cur: 0x43, idx: 0x0}, - 837: {cur: 0x62, idx: 0x0}, - 838: {cur: 0x71, idx: 0x0}, - 839: {cur: 0x7b, idx: 0x51b}, - 840: {cur: 0x7c, idx: 0x0}, - 841: {cur: 0x84, idx: 0x0}, - 842: {cur: 0x8c, idx: 0x0}, - 843: {cur: 0xbf, idx: 0x0}, - 844: {cur: 0xf4, idx: 0x0}, - 845: {cur: 0xfa, idx: 0x0}, - 846: {cur: 0x103, idx: 0x0}, - 847: {cur: 0x3a, idx: 0x0}, - 848: {cur: 0x84, idx: 0x25}, - 849: {cur: 0xe9, idx: 0xbc}, - 850: {cur: 0xfa, idx: 0x4}, - 851: {cur: 0xe0, idx: 0x227}, - 852: {cur: 0x50, idx: 0x21f}, - 853: {cur: 0x5c, idx: 0x24a}, - 854: {cur: 0x85, idx: 0x2f3}, - 855: {cur: 0x6, idx: 0x51f}, - 856: {cur: 0xe9, idx: 0xbc}, - 857: {cur: 0xa4, idx: 0x525}, - 858: {cur: 0x13, idx: 0x0}, - 859: {cur: 0x18, idx: 0x2c1}, - 860: {cur: 0x84, idx: 0x25}, - 861: {cur: 0x8c, idx: 0x0}, - 862: {cur: 0xbf, idx: 0x0}, - 863: {cur: 0x103, idx: 0x0}, - 864: {cur: 0x13, idx: 0x0}, - 865: {cur: 0x18, idx: 0x9}, - 866: {cur: 0x84, idx: 0x25}, - 867: {cur: 0x8c, idx: 0x0}, - 868: {cur: 0xbf, idx: 0x0}, - 869: {cur: 0x103, idx: 0x0}, - 870: {cur: 0x13, idx: 0x0}, - 871: {cur: 0x1a, idx: 0x23e}, - 872: {cur: 0x25, idx: 0x11f}, - 873: {cur: 0x2e, idx: 0x52c}, - 874: {cur: 0x32, idx: 0x127}, - 875: {cur: 0x39, idx: 0x12b}, - 876: {cur: 0x43, idx: 0x0}, - 877: {cur: 0x51, idx: 0x4f7}, - 878: {cur: 0x52, idx: 0x256}, - 879: {cur: 0x56, idx: 0x530}, - 880: {cur: 0x57, idx: 0x534}, - 881: {cur: 0x62, idx: 0x0}, - 882: {cur: 0x71, idx: 0x0}, - 883: {cur: 0x78, idx: 0x539}, - 884: {cur: 0x7c, idx: 0x0}, - 885: {cur: 0x80, idx: 0x53e}, - 886: {cur: 0x82, idx: 0x171}, - 887: {cur: 0x84, idx: 0x0}, - 888: {cur: 0x8c, idx: 0x0}, - 889: {cur: 0xbd, idx: 0x4ff}, - 890: {cur: 0xbf, idx: 0x0}, - 891: {cur: 0xda, idx: 0x30}, - 892: {cur: 0xf4, idx: 0x0}, - 893: {cur: 0x103, idx: 0x0}, - 894: {cur: 0x85, idx: 0x2f3}, - 895: {cur: 0xe9, idx: 0xbc}, - 896: {cur: 0xf5, idx: 0x22e}, - 897: {cur: 0x3b, idx: 0x315}, - 898: {cur: 0xf9, idx: 0x2df}, - 899: {cur: 0x84, idx: 0x25}, - 900: {cur: 0xe9, idx: 0xbc}, - 901: {cur: 0xfa, idx: 0x4}, - 902: {cur: 0x92, idx: 0x542}, - 903: {cur: 0xb4, idx: 0x94}, - 904: {cur: 0xdb, idx: 0x280}, - 905: {cur: 0xb4, idx: 0x94}, - 906: {cur: 0xdb, idx: 0x4}, - 907: {cur: 0xfa, idx: 0xcf}, - 908: {cur: 0xe9, idx: 0xbc}, - 909: {cur: 0xfa, idx: 0x4}, - 910: {cur: 0xf9, idx: 0x2df}, - 911: {cur: 0x85, idx: 0x2f3}, - 912: {cur: 0x13, idx: 0xf4}, - 913: {cur: 0x84, idx: 0x25}, - 914: {cur: 0x5c, idx: 0x24a}, - 915: {cur: 0x58, idx: 0x223}, - 916: {cur: 0x5d, idx: 0x0}, - 917: {cur: 0x62, idx: 0x0}, - 918: {cur: 0x13, idx: 0x546}, - 919: {cur: 0xbf, idx: 0x54b}, - 920: {cur: 0xef, idx: 0xc0}, - 921: {cur: 0x13, idx: 0xf4}, - 922: {cur: 0x84, idx: 0x25}, - 923: {cur: 0xe9, idx: 0xbc}, - 924: {cur: 0xf2, idx: 0xc3}, - 925: {cur: 0xfa, idx: 0x4}, - 926: {cur: 0x43, idx: 0x491}, - 927: {cur: 0xfa, idx: 0x4}, - 928: {cur: 0x13, idx: 0x0}, - 929: {cur: 0x2e, idx: 0x0}, - 930: {cur: 0x3a, idx: 0x0}, - 931: {cur: 0x43, idx: 0x0}, - 932: {cur: 0x5d, idx: 0x0}, - 933: {cur: 0x62, idx: 0x0}, - 934: {cur: 0x71, idx: 0x0}, - 935: {cur: 0x7b, idx: 0x0}, - 936: {cur: 0x7c, idx: 0x0}, - 937: {cur: 0x84, idx: 0x25}, - 938: {cur: 0x8c, idx: 0x0}, - 939: {cur: 0xb1, idx: 0x0}, - 940: {cur: 0xbf, idx: 0x0}, - 941: {cur: 0xf4, idx: 0x0}, - 942: {cur: 0xf6, idx: 0xcb}, - 943: {cur: 0xf7, idx: 0x550}, - 944: {cur: 0xfa, idx: 0x0}, - 945: {cur: 0x103, idx: 0x0}, - 946: {cur: 0x10e, idx: 0x0}, - 947: {cur: 0xc7, idx: 0x7e}, - 948: {cur: 0xe9, idx: 0xbc}, - 949: {cur: 0xfa, idx: 0x4}, - 950: {cur: 0xc7, idx: 0x0}, - 951: {cur: 0x100, idx: 0x558}, - 952: {cur: 0x4, idx: 0x38b}, - 953: {cur: 0xe9, idx: 0xbc}, - 954: {cur: 0x100, idx: 0x55e}, - 955: {cur: 0x93, idx: 0x4}, - 956: {cur: 0x93, idx: 0x4}, - 957: {cur: 0x13, idx: 0xf4}, - 958: {cur: 0xe9, idx: 0xbc}, - 959: {cur: 0xf5, idx: 0x22e}, - 960: {cur: 0x84, idx: 0x25}, - 961: {cur: 0xfa, idx: 0x4}, - 962: {cur: 0xf9, idx: 0x2df}, - 963: {cur: 0xb9, idx: 0x97}, - 964: {cur: 0x13, idx: 0xf4}, - 965: {cur: 0x84, idx: 0x25}, - 966: {cur: 0x8c, idx: 0x565}, - 967: {cur: 0x13, idx: 0xf4}, - 968: {cur: 0x43, idx: 0x491}, - 969: {cur: 0x7a, idx: 0x569}, - 970: {cur: 0x8c, idx: 0x565}, - 971: {cur: 0x43, idx: 0x20}, - 972: {cur: 0x43, idx: 0x20}, - 973: {cur: 0xa9, idx: 0x34a}, - 974: {cur: 0x43, idx: 0x20}, - 975: {cur: 0xdb, idx: 0x4}, - 976: {cur: 0x13, idx: 0xf4}, - 977: {cur: 0x84, idx: 0x25}, - 978: {cur: 0x8c, idx: 0x565}, - 979: {cur: 0xf4, idx: 0x4}, - 980: {cur: 0x8c, idx: 0x6e}, - 981: {cur: 0xf4, idx: 0xc7}, - 982: {cur: 0xa9, idx: 0x34a}, - 983: {cur: 0xe9, idx: 0xbc}, - 984: {cur: 0x123, idx: 0xe9}, -} // Size: 3964 bytes - -var narrowLangIndex = []uint16{ // 755 elements - // Entry 0 - 3F - 0x0000, 0x0062, 0x0062, 0x0062, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0064, 0x0064, 0x0080, 0x0080, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x008a, - 0x008a, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, - 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00d6, 0x00d6, - // Entry 40 - 7F - 0x00d6, 0x00d6, 0x00d6, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, - 0x00d7, 0x00da, 0x00da, 0x00da, 0x00da, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, - 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00e4, 0x00e4, 0x00ea, 0x00ea, - 0x00ea, 0x00ea, 0x00ea, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, - 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, - 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, - // Entry 80 - BF - 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, - 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - // Entry C0 - FF - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fe, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, - 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, - // Entry 100 - 13F - 0x0100, 0x0100, 0x0100, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0106, 0x0106, 0x0107, 0x0108, 0x0108, - 0x0109, 0x0109, 0x0109, 0x0109, 0x0109, 0x0109, 0x0109, 0x0109, - 0x0109, 0x0109, 0x0109, 0x0109, 0x0165, 0x0165, 0x0166, 0x0166, - 0x0166, 0x0166, 0x0166, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, - 0x016e, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, - 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, - 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, - // Entry 140 - 17F - 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, - 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, - 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0173, 0x0173, - 0x0174, 0x0174, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, - 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, - 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, 0x017b, 0x017b, 0x017c, - 0x017c, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017e, 0x017e, - 0x017f, 0x017f, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - // Entry 180 - 1BF - 0x0181, 0x0181, 0x0186, 0x0186, 0x0186, 0x0186, 0x0186, 0x0186, - 0x0188, 0x0188, 0x0188, 0x0188, 0x0188, 0x0188, 0x0188, 0x0188, - 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, - 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, - 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, - 0x018b, 0x018b, 0x018c, 0x018c, 0x018e, 0x018e, 0x018e, 0x018e, - 0x018e, 0x018e, 0x018e, 0x018e, 0x018e, 0x018e, 0x018e, 0x018e, - 0x018e, 0x018e, 0x018e, 0x018e, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 1C0 - 1FF - 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, - 0x019a, 0x019a, 0x019a, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a8, - 0x01a8, 0x01a9, 0x01a9, 0x01ab, 0x01ab, 0x01ac, 0x01ac, 0x01ad, - 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01af, - 0x01af, 0x01af, 0x01af, 0x01af, 0x01af, 0x01af, 0x01b1, 0x01b1, - // Entry 200 - 23F - 0x01b1, 0x01b1, 0x01b1, 0x01b1, 0x01b1, 0x01b1, 0x01b2, 0x01b2, - 0x01b2, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, - 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, - 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, - 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, - 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b5, 0x01b5, - 0x01b5, 0x01b5, 0x01b5, 0x01b5, 0x01b7, 0x01b7, 0x01b7, 0x01b7, - 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, - // Entry 240 - 27F - 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, 0x01b7, - 0x01b7, 0x01b8, 0x01b8, 0x01b8, 0x01b8, 0x01b8, 0x01bb, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01be, - 0x01be, 0x01bf, 0x01bf, 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c0, - 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c0, - // Entry 280 - 2BF - 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c2, 0x01c2, - 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c5, 0x01c5, 0x01c5, 0x01c5, - 0x01c5, 0x01c5, 0x01c5, 0x01c5, 0x01c8, 0x01c8, 0x01c8, 0x01c8, - 0x01c9, 0x01c9, 0x01c9, 0x01c9, 0x01c9, 0x01c9, 0x01ca, 0x01ca, - 0x01ca, 0x01ca, 0x01ca, 0x01cb, 0x01cb, 0x01cb, 0x01cb, 0x01cb, - 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, - 0x01cc, 0x01cc, 0x01cc, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, - 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01cf, 0x01cf, 0x01d0, - // Entry 2C0 - 2FF - 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, - 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d1, - 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, - 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, - 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d3, - 0x01d3, 0x01d3, 0x01d3, 0x01d3, 0x01d3, 0x01d4, 0x01d4, 0x01d4, - 0x01d4, 0x01dc, 0x01dc, -} // Size: 1534 bytes - -var narrowSymIndex = []curToIndex{ // 476 elements - 0: {cur: 0x9, idx: 0x1}, - 1: {cur: 0x11, idx: 0x4}, - 2: {cur: 0x13, idx: 0x4}, - 3: {cur: 0x18, idx: 0x9}, - 4: {cur: 0x1a, idx: 0x4}, - 5: {cur: 0x1b, idx: 0xc}, - 6: {cur: 0x25, idx: 0x4}, - 7: {cur: 0x26, idx: 0x4}, - 8: {cur: 0x27, idx: 0x10}, - 9: {cur: 0x2e, idx: 0x13}, - 10: {cur: 0x32, idx: 0x4}, - 11: {cur: 0x35, idx: 0x16}, - 12: {cur: 0x37, idx: 0x18}, - 13: {cur: 0x39, idx: 0x4}, - 14: {cur: 0x3a, idx: 0x4}, - 15: {cur: 0x41, idx: 0x4}, - 16: {cur: 0x43, idx: 0x25}, - 17: {cur: 0x44, idx: 0x4}, - 18: {cur: 0x46, idx: 0x28}, - 19: {cur: 0x49, idx: 0x4}, - 20: {cur: 0x4a, idx: 0x4}, - 21: {cur: 0x4d, idx: 0x2c}, - 22: {cur: 0x51, idx: 0x30}, - 23: {cur: 0x52, idx: 0x4}, - 24: {cur: 0x57, idx: 0x33}, - 25: {cur: 0x5b, idx: 0x37}, - 26: {cur: 0x5d, idx: 0x3b}, - 27: {cur: 0x5f, idx: 0x4}, - 28: {cur: 0x60, idx: 0x3f}, - 29: {cur: 0x62, idx: 0x3f}, - 30: {cur: 0x64, idx: 0x42}, - 31: {cur: 0x67, idx: 0x3f}, - 32: {cur: 0x69, idx: 0x46}, - 33: {cur: 0x6d, idx: 0x49}, - 34: {cur: 0x70, idx: 0x4}, - 35: {cur: 0x71, idx: 0x4}, - 36: {cur: 0x72, idx: 0x4f}, - 37: {cur: 0x74, idx: 0x51}, - 38: {cur: 0x76, idx: 0x54}, - 39: {cur: 0x77, idx: 0x57}, - 40: {cur: 0x7b, idx: 0x5a}, - 41: {cur: 0x7c, idx: 0x5e}, - 42: {cur: 0x80, idx: 0x30}, - 43: {cur: 0x82, idx: 0x4}, - 44: {cur: 0x84, idx: 0x25}, - 45: {cur: 0x87, idx: 0x67}, - 46: {cur: 0x88, idx: 0x6b}, - 47: {cur: 0x89, idx: 0x6e}, - 48: {cur: 0x8c, idx: 0x6e}, - 49: {cur: 0x8e, idx: 0x4}, - 50: {cur: 0x8f, idx: 0x72}, - 51: {cur: 0x90, idx: 0x76}, - 52: {cur: 0x91, idx: 0x7a}, - 53: {cur: 0x92, idx: 0x7e}, - 54: {cur: 0x93, idx: 0x4}, - 55: {cur: 0x95, idx: 0x81}, - 56: {cur: 0x9a, idx: 0x84}, - 57: {cur: 0xa2, idx: 0x87}, - 58: {cur: 0xa7, idx: 0x8a}, - 59: {cur: 0xa8, idx: 0x8c}, - 60: {cur: 0xad, idx: 0x7e}, - 61: {cur: 0xb1, idx: 0x4}, - 62: {cur: 0xb4, idx: 0x94}, - 63: {cur: 0xb8, idx: 0x4}, - 64: {cur: 0xb9, idx: 0x97}, - 65: {cur: 0xbb, idx: 0x9b}, - 66: {cur: 0xbd, idx: 0x30}, - 67: {cur: 0xbe, idx: 0x7e}, - 68: {cur: 0xbf, idx: 0x4}, - 69: {cur: 0xc6, idx: 0xa2}, - 70: {cur: 0xc7, idx: 0x7e}, - 71: {cur: 0xc8, idx: 0xa6}, - 72: {cur: 0xcb, idx: 0xaa}, - 73: {cur: 0xcf, idx: 0xae}, - 74: {cur: 0xd1, idx: 0xb2}, - 75: {cur: 0xd2, idx: 0x18}, - 76: {cur: 0xd3, idx: 0xb6}, - 77: {cur: 0xd5, idx: 0x4}, - 78: {cur: 0xda, idx: 0x30}, - 79: {cur: 0xdb, idx: 0x4}, - 80: {cur: 0xdc, idx: 0x3f}, - 81: {cur: 0xe1, idx: 0x4}, - 82: {cur: 0xe3, idx: 0x3f}, - 83: {cur: 0xe4, idx: 0xb9}, - 84: {cur: 0xe7, idx: 0x3f}, - 85: {cur: 0xe9, idx: 0xbc}, - 86: {cur: 0xef, idx: 0xc0}, - 87: {cur: 0xf2, idx: 0xc3}, - 88: {cur: 0xf3, idx: 0x4}, - 89: {cur: 0xf4, idx: 0x4}, - 90: {cur: 0xf6, idx: 0xcb}, - 91: {cur: 0xfa, idx: 0x4}, - 92: {cur: 0xff, idx: 0x4}, - 93: {cur: 0x102, idx: 0x10}, - 94: {cur: 0x103, idx: 0xd3}, - 95: {cur: 0x10e, idx: 0x4}, - 96: {cur: 0x123, idx: 0xe9}, - 97: {cur: 0x125, idx: 0xeb}, - 98: {cur: 0xf4, idx: 0xc7}, - 99: {cur: 0xf4, idx: 0xc7}, - 100: {cur: 0x11, idx: 0x10d}, - 101: {cur: 0x13, idx: 0xf4}, - 102: {cur: 0x1a, idx: 0x111}, - 103: {cur: 0x25, idx: 0x11f}, - 104: {cur: 0x26, idx: 0x123}, - 105: {cur: 0x32, idx: 0x127}, - 106: {cur: 0x39, idx: 0x12b}, - 107: {cur: 0x3a, idx: 0x1c}, - 108: {cur: 0x41, idx: 0x12f}, - 109: {cur: 0x43, idx: 0x20}, - 110: {cur: 0x44, idx: 0x133}, - 111: {cur: 0x4a, idx: 0x137}, - 112: {cur: 0x52, idx: 0x13b}, - 113: {cur: 0x5f, idx: 0x153}, - 114: {cur: 0x62, idx: 0x157}, - 115: {cur: 0x70, idx: 0x15c}, - 116: {cur: 0x71, idx: 0x4b}, - 117: {cur: 0x82, idx: 0x171}, - 118: {cur: 0x84, idx: 0x62}, - 119: {cur: 0x8e, idx: 0x196}, - 120: {cur: 0xb1, idx: 0x90}, - 121: {cur: 0xbf, idx: 0x9e}, - 122: {cur: 0xd5, idx: 0x1e0}, - 123: {cur: 0xe1, idx: 0x1f5}, - 124: {cur: 0xf3, idx: 0x20d}, - 125: {cur: 0xf4, idx: 0xc7}, - 126: {cur: 0xfa, idx: 0xcf}, - 127: {cur: 0xff, idx: 0x211}, - 128: {cur: 0x26, idx: 0x4}, - 129: {cur: 0x37, idx: 0x0}, - 130: {cur: 0x51, idx: 0x0}, - 131: {cur: 0x74, idx: 0x0}, - 132: {cur: 0x80, idx: 0x0}, - 133: {cur: 0xbd, idx: 0x0}, - 134: {cur: 0xc8, idx: 0x0}, - 135: {cur: 0xd2, idx: 0x0}, - 136: {cur: 0xda, idx: 0x0}, - 137: {cur: 0xf4, idx: 0xc7}, - 138: {cur: 0xcf, idx: 0x236}, - 139: {cur: 0xe7, idx: 0x23a}, - 140: {cur: 0xf4, idx: 0xc7}, - 141: {cur: 0x13, idx: 0x6}, - 142: {cur: 0x1a, idx: 0x23e}, - 143: {cur: 0x25, idx: 0x243}, - 144: {cur: 0x32, idx: 0x247}, - 145: {cur: 0x37, idx: 0x24a}, - 146: {cur: 0x39, idx: 0x12b}, - 147: {cur: 0x3a, idx: 0x1c}, - 148: {cur: 0x49, idx: 0x24d}, - 149: {cur: 0x4a, idx: 0x252}, - 150: {cur: 0x52, idx: 0x256}, - 151: {cur: 0x5f, idx: 0x153}, - 152: {cur: 0x60, idx: 0x25a}, - 153: {cur: 0x70, idx: 0x25f}, - 154: {cur: 0x80, idx: 0x262}, - 155: {cur: 0x82, idx: 0x267}, - 156: {cur: 0x8e, idx: 0x26a}, - 157: {cur: 0x93, idx: 0x26e}, - 158: {cur: 0xb1, idx: 0x90}, - 159: {cur: 0xb8, idx: 0x271}, - 160: {cur: 0xbf, idx: 0x9e}, - 161: {cur: 0xd1, idx: 0x274}, - 162: {cur: 0xd5, idx: 0x27c}, - 163: {cur: 0xdb, idx: 0x280}, - 164: {cur: 0xf3, idx: 0x20d}, - 165: {cur: 0xff, idx: 0x283}, - 166: {cur: 0x10e, idx: 0xdc}, - 167: {cur: 0x11, idx: 0x0}, - 168: {cur: 0x13, idx: 0x0}, - 169: {cur: 0x1a, idx: 0x0}, - 170: {cur: 0x1b, idx: 0x0}, - 171: {cur: 0x25, idx: 0x0}, - 172: {cur: 0x26, idx: 0x0}, - 173: {cur: 0x2e, idx: 0x0}, - 174: {cur: 0x32, idx: 0x0}, - 175: {cur: 0x37, idx: 0x0}, - 176: {cur: 0x39, idx: 0x0}, - 177: {cur: 0x3a, idx: 0x0}, - 178: {cur: 0x41, idx: 0x0}, - 179: {cur: 0x43, idx: 0x0}, - 180: {cur: 0x44, idx: 0x0}, - 181: {cur: 0x46, idx: 0x0}, - 182: {cur: 0x4a, idx: 0x0}, - 183: {cur: 0x52, idx: 0x0}, - 184: {cur: 0x5f, idx: 0x0}, - 185: {cur: 0x67, idx: 0x0}, - 186: {cur: 0x70, idx: 0x0}, - 187: {cur: 0x71, idx: 0x0}, - 188: {cur: 0x7b, idx: 0x0}, - 189: {cur: 0x7c, idx: 0x0}, - 190: {cur: 0x82, idx: 0x0}, - 191: {cur: 0x87, idx: 0x0}, - 192: {cur: 0x8c, idx: 0x0}, - 193: {cur: 0x8e, idx: 0x0}, - 194: {cur: 0x8f, idx: 0x0}, - 195: {cur: 0x90, idx: 0x0}, - 196: {cur: 0x93, idx: 0x0}, - 197: {cur: 0xa8, idx: 0x0}, - 198: {cur: 0xb1, idx: 0x0}, - 199: {cur: 0xb8, idx: 0x0}, - 200: {cur: 0xb9, idx: 0x0}, - 201: {cur: 0xbf, idx: 0x0}, - 202: {cur: 0xc6, idx: 0x0}, - 203: {cur: 0xcb, idx: 0x0}, - 204: {cur: 0xd5, idx: 0x0}, - 205: {cur: 0xdb, idx: 0x0}, - 206: {cur: 0xe1, idx: 0x0}, - 207: {cur: 0xe3, idx: 0x0}, - 208: {cur: 0xf2, idx: 0x0}, - 209: {cur: 0xf3, idx: 0x0}, - 210: {cur: 0xf4, idx: 0x0}, - 211: {cur: 0xf6, idx: 0x0}, - 212: {cur: 0xff, idx: 0x0}, - 213: {cur: 0x103, idx: 0x0}, - 214: {cur: 0xf4, idx: 0xc7}, - 215: {cur: 0x57, idx: 0x29a}, - 216: {cur: 0x91, idx: 0x2aa}, - 217: {cur: 0xef, idx: 0x2b3}, - 218: {cur: 0xf4, idx: 0xc7}, - 219: {cur: 0x102, idx: 0x0}, - 220: {cur: 0xcf, idx: 0x4f}, - 221: {cur: 0xf4, idx: 0xc7}, - 222: {cur: 0x1b, idx: 0x2ec}, - 223: {cur: 0x35, idx: 0x0}, - 224: {cur: 0x71, idx: 0x4b}, - 225: {cur: 0xf4, idx: 0xc7}, - 226: {cur: 0x123, idx: 0x0}, - 227: {cur: 0x125, idx: 0x0}, - 228: {cur: 0x51, idx: 0x2ef}, - 229: {cur: 0x80, idx: 0x2ef}, - 230: {cur: 0xbd, idx: 0x2ef}, - 231: {cur: 0xcf, idx: 0x4f}, - 232: {cur: 0xda, idx: 0x2ef}, - 233: {cur: 0xf4, idx: 0xc7}, - 234: {cur: 0x49, idx: 0x303}, - 235: {cur: 0x60, idx: 0x30b}, - 236: {cur: 0x69, idx: 0x310}, - 237: {cur: 0x88, idx: 0x315}, - 238: {cur: 0xcf, idx: 0x4f}, - 239: {cur: 0xd3, idx: 0x318}, - 240: {cur: 0xe7, idx: 0x0}, - 241: {cur: 0xf4, idx: 0xc7}, - 242: {cur: 0x125, idx: 0x8a}, - 243: {cur: 0x1b, idx: 0x334}, - 244: {cur: 0x27, idx: 0x337}, - 245: {cur: 0x4a, idx: 0xa2}, - 246: {cur: 0x57, idx: 0x3f}, - 247: {cur: 0x80, idx: 0x33a}, - 248: {cur: 0xcb, idx: 0x33d}, - 249: {cur: 0xda, idx: 0x33a}, - 250: {cur: 0xff, idx: 0x283}, - 251: {cur: 0x57, idx: 0x0}, - 252: {cur: 0xcf, idx: 0x4f}, - 253: {cur: 0xf4, idx: 0xc7}, - 254: {cur: 0x57, idx: 0x33}, - 255: {cur: 0x102, idx: 0x366}, - 256: {cur: 0x11, idx: 0x371}, - 257: {cur: 0x37, idx: 0x24a}, - 258: {cur: 0x52, idx: 0x256}, - 259: {cur: 0xcf, idx: 0xae}, - 260: {cur: 0xf2, idx: 0x379}, - 261: {cur: 0xcf, idx: 0xae}, - 262: {cur: 0x102, idx: 0x387}, - 263: {cur: 0xf4, idx: 0xc7}, - 264: {cur: 0xf4, idx: 0xc7}, - 265: {cur: 0x9, idx: 0x0}, - 266: {cur: 0x11, idx: 0x0}, - 267: {cur: 0x13, idx: 0x0}, - 268: {cur: 0x1a, idx: 0x0}, - 269: {cur: 0x1b, idx: 0x0}, - 270: {cur: 0x25, idx: 0x0}, - 271: {cur: 0x26, idx: 0x0}, - 272: {cur: 0x27, idx: 0x0}, - 273: {cur: 0x2e, idx: 0x0}, - 274: {cur: 0x32, idx: 0x0}, - 275: {cur: 0x35, idx: 0x0}, - 276: {cur: 0x37, idx: 0x0}, - 277: {cur: 0x39, idx: 0x0}, - 278: {cur: 0x3a, idx: 0x0}, - 279: {cur: 0x41, idx: 0x0}, - 280: {cur: 0x43, idx: 0x0}, - 281: {cur: 0x44, idx: 0x0}, - 282: {cur: 0x46, idx: 0x0}, - 283: {cur: 0x49, idx: 0x0}, - 284: {cur: 0x4a, idx: 0x0}, - 285: {cur: 0x4d, idx: 0x0}, - 286: {cur: 0x51, idx: 0x0}, - 287: {cur: 0x52, idx: 0x0}, - 288: {cur: 0x57, idx: 0x0}, - 289: {cur: 0x5b, idx: 0x0}, - 290: {cur: 0x5f, idx: 0x0}, - 291: {cur: 0x60, idx: 0x0}, - 292: {cur: 0x64, idx: 0x0}, - 293: {cur: 0x67, idx: 0x0}, - 294: {cur: 0x69, idx: 0x0}, - 295: {cur: 0x6d, idx: 0x0}, - 296: {cur: 0x70, idx: 0x0}, - 297: {cur: 0x71, idx: 0x0}, - 298: {cur: 0x72, idx: 0x0}, - 299: {cur: 0x74, idx: 0x0}, - 300: {cur: 0x76, idx: 0x0}, - 301: {cur: 0x77, idx: 0x0}, - 302: {cur: 0x7b, idx: 0x0}, - 303: {cur: 0x7c, idx: 0x0}, - 304: {cur: 0x80, idx: 0x0}, - 305: {cur: 0x82, idx: 0x0}, - 306: {cur: 0x87, idx: 0x0}, - 307: {cur: 0x88, idx: 0x0}, - 308: {cur: 0x89, idx: 0x0}, - 309: {cur: 0x8c, idx: 0x0}, - 310: {cur: 0x8e, idx: 0x0}, - 311: {cur: 0x8f, idx: 0x0}, - 312: {cur: 0x90, idx: 0x0}, - 313: {cur: 0x91, idx: 0x0}, - 314: {cur: 0x92, idx: 0x0}, - 315: {cur: 0x93, idx: 0x0}, - 316: {cur: 0x95, idx: 0x0}, - 317: {cur: 0x9a, idx: 0x0}, - 318: {cur: 0xa2, idx: 0x0}, - 319: {cur: 0xa7, idx: 0x0}, - 320: {cur: 0xa8, idx: 0x0}, - 321: {cur: 0xad, idx: 0x0}, - 322: {cur: 0xb1, idx: 0x0}, - 323: {cur: 0xb4, idx: 0x0}, - 324: {cur: 0xb8, idx: 0x0}, - 325: {cur: 0xb9, idx: 0x0}, - 326: {cur: 0xbb, idx: 0x0}, - 327: {cur: 0xbd, idx: 0x0}, - 328: {cur: 0xbe, idx: 0x0}, - 329: {cur: 0xbf, idx: 0x0}, - 330: {cur: 0xc6, idx: 0x0}, - 331: {cur: 0xc7, idx: 0x0}, - 332: {cur: 0xc8, idx: 0x0}, - 333: {cur: 0xcb, idx: 0x0}, - 334: {cur: 0xcf, idx: 0x0}, - 335: {cur: 0xd2, idx: 0x0}, - 336: {cur: 0xd3, idx: 0x0}, - 337: {cur: 0xd5, idx: 0x0}, - 338: {cur: 0xda, idx: 0x0}, - 339: {cur: 0xdb, idx: 0x0}, - 340: {cur: 0xdc, idx: 0x0}, - 341: {cur: 0xe1, idx: 0x0}, - 342: {cur: 0xe3, idx: 0x0}, - 343: {cur: 0xe4, idx: 0x0}, - 344: {cur: 0xe7, idx: 0x0}, - 345: {cur: 0xe9, idx: 0x0}, - 346: {cur: 0xef, idx: 0x0}, - 347: {cur: 0xf2, idx: 0x0}, - 348: {cur: 0xf3, idx: 0x0}, - 349: {cur: 0xf4, idx: 0x0}, - 350: {cur: 0xf6, idx: 0x0}, - 351: {cur: 0xff, idx: 0x0}, - 352: {cur: 0x102, idx: 0x0}, - 353: {cur: 0x103, idx: 0x0}, - 354: {cur: 0x10e, idx: 0x0}, - 355: {cur: 0x123, idx: 0x0}, - 356: {cur: 0x125, idx: 0x0}, - 357: {cur: 0xf4, idx: 0xc7}, - 358: {cur: 0x57, idx: 0x3da}, - 359: {cur: 0x88, idx: 0x315}, - 360: {cur: 0x91, idx: 0x2aa}, - 361: {cur: 0xbb, idx: 0x40f}, - 362: {cur: 0xcf, idx: 0x4f}, - 363: {cur: 0xd3, idx: 0x416}, - 364: {cur: 0xf4, idx: 0xc7}, - 365: {cur: 0x125, idx: 0x436}, - 366: {cur: 0x64, idx: 0x0}, - 367: {cur: 0x88, idx: 0x6b}, - 368: {cur: 0xbb, idx: 0x9b}, - 369: {cur: 0x125, idx: 0xeb}, - 370: {cur: 0xf4, idx: 0xc7}, - 371: {cur: 0xf4, idx: 0xc7}, - 372: {cur: 0x2e, idx: 0x462}, - 373: {cur: 0x88, idx: 0x315}, - 374: {cur: 0xd1, idx: 0x465}, - 375: {cur: 0xf4, idx: 0xc7}, - 376: {cur: 0xad, idx: 0x46c}, - 377: {cur: 0xf4, idx: 0xc7}, - 378: {cur: 0xf4, idx: 0xc7}, - 379: {cur: 0xf4, idx: 0xc7}, - 380: {cur: 0xf4, idx: 0xc7}, - 381: {cur: 0xf4, idx: 0xc7}, - 382: {cur: 0xf4, idx: 0xc7}, - 383: {cur: 0xf4, idx: 0xc7}, - 384: {cur: 0xf4, idx: 0xc7}, - 385: {cur: 0x37, idx: 0x24a}, - 386: {cur: 0x57, idx: 0x3da}, - 387: {cur: 0xbd, idx: 0x489}, - 388: {cur: 0xcf, idx: 0x4f}, - 389: {cur: 0xf4, idx: 0xc7}, - 390: {cur: 0x43, idx: 0x491}, - 391: {cur: 0x84, idx: 0x491}, - 392: {cur: 0xf4, idx: 0xc7}, - 393: {cur: 0xf4, idx: 0xc7}, - 394: {cur: 0xf4, idx: 0xc7}, - 395: {cur: 0xf4, idx: 0xc7}, - 396: {cur: 0xcf, idx: 0x4f}, - 397: {cur: 0xf4, idx: 0xc7}, - 398: {cur: 0x25, idx: 0x243}, - 399: {cur: 0x32, idx: 0x247}, - 400: {cur: 0x39, idx: 0x12b}, - 401: {cur: 0x3a, idx: 0x9b}, - 402: {cur: 0x52, idx: 0x256}, - 403: {cur: 0x57, idx: 0x499}, - 404: {cur: 0x71, idx: 0x4b}, - 405: {cur: 0x74, idx: 0x49c}, - 406: {cur: 0x82, idx: 0x267}, - 407: {cur: 0xf3, idx: 0x20d}, - 408: {cur: 0xf4, idx: 0xc7}, - 409: {cur: 0xf4, idx: 0xc7}, - 410: {cur: 0xf4, idx: 0xc7}, - 411: {cur: 0x1b, idx: 0x0}, - 412: {cur: 0x37, idx: 0x24a}, - 413: {cur: 0x7b, idx: 0x0}, - 414: {cur: 0x7c, idx: 0x0}, - 415: {cur: 0x87, idx: 0x0}, - 416: {cur: 0x90, idx: 0x0}, - 417: {cur: 0xa8, idx: 0x0}, - 418: {cur: 0xc8, idx: 0x4a6}, - 419: {cur: 0xcb, idx: 0x33d}, - 420: {cur: 0xd1, idx: 0x4a9}, - 421: {cur: 0x103, idx: 0x0}, - 422: {cur: 0xf4, idx: 0xc7}, - 423: {cur: 0xf4, idx: 0xc7}, - 424: {cur: 0xf4, idx: 0xc7}, - 425: {cur: 0xda, idx: 0x4b7}, - 426: {cur: 0xf4, idx: 0xc7}, - 427: {cur: 0xf4, idx: 0xc7}, - 428: {cur: 0xf4, idx: 0xc7}, - 429: {cur: 0x1a, idx: 0x23e}, - 430: {cur: 0x32, idx: 0x247}, - 431: {cur: 0xcf, idx: 0x4f}, - 432: {cur: 0xf4, idx: 0xc7}, - 433: {cur: 0xbe, idx: 0x4d1}, - 434: {cur: 0xf4, idx: 0xc7}, - 435: {cur: 0xf4, idx: 0xc7}, - 436: {cur: 0xf4, idx: 0xc7}, - 437: {cur: 0xcf, idx: 0x4f}, - 438: {cur: 0xf4, idx: 0xc7}, - 439: {cur: 0xf4, idx: 0xc7}, - 440: {cur: 0x64, idx: 0x4ec}, - 441: {cur: 0xcf, idx: 0x4f}, - 442: {cur: 0xf4, idx: 0xc7}, - 443: {cur: 0x37, idx: 0x24a}, - 444: {cur: 0x92, idx: 0x503}, - 445: {cur: 0xf4, idx: 0xc7}, - 446: {cur: 0xf4, idx: 0xc7}, - 447: {cur: 0xf4, idx: 0xc7}, - 448: {cur: 0x64, idx: 0x4ec}, - 449: {cur: 0xf4, idx: 0xc7}, - 450: {cur: 0x37, idx: 0x529}, - 451: {cur: 0x64, idx: 0x4ec}, - 452: {cur: 0xf4, idx: 0xc7}, - 453: {cur: 0x5b, idx: 0x0}, - 454: {cur: 0xcf, idx: 0x4f}, - 455: {cur: 0xf4, idx: 0xc7}, - 456: {cur: 0xf4, idx: 0xc7}, - 457: {cur: 0xf4, idx: 0xc7}, - 458: {cur: 0xf4, idx: 0xc7}, - 459: {cur: 0xf4, idx: 0xc7}, - 460: {cur: 0xcf, idx: 0x4f}, - 461: {cur: 0xf4, idx: 0xc7}, - 462: {cur: 0xf4, idx: 0xc7}, - 463: {cur: 0xf4, idx: 0xc7}, - 464: {cur: 0xf4, idx: 0xc7}, - 465: {cur: 0xcf, idx: 0x4f}, - 466: {cur: 0xf4, idx: 0xc7}, - 467: {cur: 0xcf, idx: 0x4f}, - 468: {cur: 0x37, idx: 0x56d}, - 469: {cur: 0x51, idx: 0x33a}, - 470: {cur: 0x74, idx: 0x49c}, - 471: {cur: 0x80, idx: 0x33a}, - 472: {cur: 0xbd, idx: 0x33a}, - 473: {cur: 0xc8, idx: 0x570}, - 474: {cur: 0xda, idx: 0x33a}, - 475: {cur: 0xf4, idx: 0xc7}, -} // Size: 1928 bytes - -// Total table size 18540 bytes (18KiB); checksum: 4D90180A diff --git a/vendor/golang.org/x/text/currency/tables_test.go b/vendor/golang.org/x/text/currency/tables_test.go deleted file mode 100644 index 779f5001d..000000000 --- a/vendor/golang.org/x/text/currency/tables_test.go +++ /dev/null @@ -1,93 +0,0 @@ -package currency - -import ( - "flag" - "strings" - "testing" - "time" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/testtext" - "golang.org/x/text/language" - "golang.org/x/text/message" - "golang.org/x/text/unicode/cldr" -) - -var draft = flag.String("draft", - "contributed", - `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) - -func TestTables(t *testing.T) { - testtext.SkipIfNotLong(t) - - // Read the CLDR zip file. - r := gen.OpenCLDRCoreZip() - defer r.Close() - - d := &cldr.Decoder{} - d.SetDirFilter("supplemental", "main") - d.SetSectionFilter("numbers") - data, err := d.DecodeZip(r) - if err != nil { - t.Fatalf("DecodeZip: %v", err) - } - - dr, err := cldr.ParseDraft(*draft) - if err != nil { - t.Fatalf("filter: %v", err) - } - - for _, lang := range data.Locales() { - p := message.NewPrinter(language.MustParse(lang)) - - ldml := data.RawLDML(lang) - if ldml.Numbers == nil || ldml.Numbers.Currencies == nil { - continue - } - for _, c := range ldml.Numbers.Currencies.Currency { - syms := cldr.MakeSlice(&c.Symbol) - syms.SelectDraft(dr) - - for _, sym := range c.Symbol { - cur, err := ParseISO(c.Type) - if err != nil { - continue - } - formatter := Symbol - switch sym.Alt { - case "": - case "narrow": - formatter = NarrowSymbol - default: - continue - } - want := sym.Data() - if got := p.Sprint(formatter(cur)); got != want { - t.Errorf("%s:%sSymbol(%s) = %s; want %s", lang, strings.Title(sym.Alt), c.Type, got, want) - } - } - } - } - - for _, reg := range data.Supplemental().CurrencyData.Region { - i := 0 - for ; regionData[i].Region().String() != reg.Iso3166; i++ { - } - it := Query(Historical, NonTender, Region(language.MustParseRegion(reg.Iso3166))) - for _, cur := range reg.Currency { - from, _ := time.Parse("2006-01-02", cur.From) - to, _ := time.Parse("2006-01-02", cur.To) - - it.Next() - for j, r := range []QueryIter{&iter{regionInfo: ®ionData[i]}, it} { - if got, _ := r.From(); from != got { - t.Errorf("%d:%s:%s:from: got %v; want %v", j, reg.Iso3166, cur.Iso4217, got, from) - } - if got, _ := r.To(); to != got { - t.Errorf("%d:%s:%s:to: got %v; want %v", j, reg.Iso3166, cur.Iso4217, got, to) - } - } - i++ - } - } -} diff --git a/vendor/golang.org/x/text/encoding/ianaindex/example_test.go b/vendor/golang.org/x/text/encoding/ianaindex/example_test.go deleted file mode 100644 index e2a3a7ef6..000000000 --- a/vendor/golang.org/x/text/encoding/ianaindex/example_test.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ianaindex_test - -import ( - "fmt" - - "golang.org/x/text/encoding/charmap" - "golang.org/x/text/encoding/ianaindex" -) - -func ExampleIndex() { - fmt.Println(ianaindex.MIME.Name(charmap.ISO8859_7)) - fmt.Println(ianaindex.IANA.Name(charmap.ISO8859_7)) - fmt.Println(ianaindex.MIB.Name(charmap.ISO8859_7)) - - e, _ := ianaindex.IANA.Encoding("cp437") - fmt.Println(ianaindex.IANA.Name(e)) - - // Output: - // ISO-8859-7 <nil> - // ISO_8859-7:1987 <nil> - // ISOLatinGreek <nil> - // IBM437 <nil> -} diff --git a/vendor/golang.org/x/text/encoding/ianaindex/gen.go b/vendor/golang.org/x/text/encoding/ianaindex/gen.go deleted file mode 100644 index 1b61b820d..000000000 --- a/vendor/golang.org/x/text/encoding/ianaindex/gen.go +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "encoding/xml" - "fmt" - "io" - "log" - "sort" - "strconv" - "strings" - - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/internal/gen" -) - -type registry struct { - XMLName xml.Name `xml:"registry"` - Updated string `xml:"updated"` - Registry []struct { - ID string `xml:"id,attr"` - Record []struct { - Name string `xml:"name"` - Xref []struct { - Type string `xml:"type,attr"` - Data string `xml:"data,attr"` - } `xml:"xref"` - Desc struct { - Data string `xml:",innerxml"` - } `xml:"description,"` - MIB string `xml:"value"` - Alias []string `xml:"alias"` - MIME string `xml:"preferred_alias"` - } `xml:"record"` - } `xml:"registry"` -} - -func main() { - r := gen.OpenIANAFile("assignments/character-sets/character-sets.xml") - reg := ®istry{} - if err := xml.NewDecoder(r).Decode(®); err != nil && err != io.EOF { - log.Fatalf("Error decoding charset registry: %v", err) - } - if len(reg.Registry) == 0 || reg.Registry[0].ID != "character-sets-1" { - log.Fatalf("Unexpected ID %s", reg.Registry[0].ID) - } - - x := &indexInfo{} - - for _, rec := range reg.Registry[0].Record { - mib := identifier.MIB(parseInt(rec.MIB)) - x.addEntry(mib, rec.Name) - for _, a := range rec.Alias { - a = strings.Split(a, " ")[0] // strip comments. - x.addAlias(a, mib) - // MIB name aliases are prefixed with a "cs" (character set) in the - // registry to identify them as display names and to ensure that - // the name starts with a lowercase letter in case it is used as - // an identifier. We remove it to be left with a nice clean name. - if strings.HasPrefix(a, "cs") { - x.setName(2, a[2:]) - } - } - if rec.MIME != "" { - x.addAlias(rec.MIME, mib) - x.setName(1, rec.MIME) - } - } - - w := gen.NewCodeWriter() - - fmt.Fprintln(w, `import "golang.org/x/text/encoding/internal/identifier"`) - - writeIndex(w, x) - - w.WriteGoFile("tables.go", "ianaindex") -} - -type alias struct { - name string - mib identifier.MIB -} - -type indexInfo struct { - // compacted index from code to MIB - codeToMIB []identifier.MIB - alias []alias - names [][3]string -} - -func (ii *indexInfo) Len() int { - return len(ii.codeToMIB) -} - -func (ii *indexInfo) Less(a, b int) bool { - return ii.codeToMIB[a] < ii.codeToMIB[b] -} - -func (ii *indexInfo) Swap(a, b int) { - ii.codeToMIB[a], ii.codeToMIB[b] = ii.codeToMIB[b], ii.codeToMIB[a] - // Co-sort the names. - ii.names[a], ii.names[b] = ii.names[b], ii.names[a] -} - -func (ii *indexInfo) setName(i int, name string) { - ii.names[len(ii.names)-1][i] = name -} - -func (ii *indexInfo) addEntry(mib identifier.MIB, name string) { - ii.names = append(ii.names, [3]string{name, name, name}) - ii.addAlias(name, mib) - ii.codeToMIB = append(ii.codeToMIB, mib) -} - -func (ii *indexInfo) addAlias(name string, mib identifier.MIB) { - // Don't add duplicates for the same mib. Adding duplicate aliases for - // different MIBs will cause the compiler to barf on an invalid map: great!. - for i := len(ii.alias) - 1; i >= 0 && ii.alias[i].mib == mib; i-- { - if ii.alias[i].name == name { - return - } - } - ii.alias = append(ii.alias, alias{name, mib}) - lower := strings.ToLower(name) - if lower != name { - ii.addAlias(lower, mib) - } -} - -const maxMIMENameLen = '0' - 1 // officially 40, but we leave some buffer. - -func writeIndex(w *gen.CodeWriter, x *indexInfo) { - sort.Stable(x) - - // Write constants. - fmt.Fprintln(w, "const (") - for i, m := range x.codeToMIB { - if i == 0 { - fmt.Fprintf(w, "enc%d = iota\n", m) - } else { - fmt.Fprintf(w, "enc%d\n", m) - } - } - fmt.Fprintln(w, "numIANA") - fmt.Fprintln(w, ")") - - w.WriteVar("ianaToMIB", x.codeToMIB) - - var ianaNames, mibNames []string - for _, names := range x.names { - n := names[0] - if names[0] != names[1] { - // MIME names are mostly identical to IANA names. We share the - // tables by setting the first byte of the string to an index into - // the string itself (< maxMIMENameLen) to the IANA name. The MIME - // name immediately follows the index. - x := len(names[1]) + 1 - if x > maxMIMENameLen { - log.Fatalf("MIME name length (%d) > %d", x, maxMIMENameLen) - } - n = string(x) + names[1] + names[0] - } - ianaNames = append(ianaNames, n) - mibNames = append(mibNames, names[2]) - } - - w.WriteVar("ianaNames", ianaNames) - w.WriteVar("mibNames", mibNames) - - w.WriteComment(` - TODO: Instead of using a map, we could use binary search strings doing - on-the fly lower-casing per character. This allows to always avoid - allocation and will be considerably more compact.`) - fmt.Fprintln(w, "var ianaAliases = map[string]int{") - for _, a := range x.alias { - fmt.Fprintf(w, "%q: enc%d,\n", a.name, a.mib) - } - fmt.Fprintln(w, "}") -} - -func parseInt(s string) int { - x, err := strconv.ParseInt(s, 10, 64) - if err != nil { - log.Fatalf("Could not parse integer: %v", err) - } - return int(x) -} diff --git a/vendor/golang.org/x/text/encoding/ianaindex/ianaindex.go b/vendor/golang.org/x/text/encoding/ianaindex/ianaindex.go deleted file mode 100644 index 49b30704a..000000000 --- a/vendor/golang.org/x/text/encoding/ianaindex/ianaindex.go +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go - -// Package ianaindex maps names to Encodings as specified by the IANA registry. -// This includes both the MIME and IANA names. -// -// See http://www.iana.org/assignments/character-sets/character-sets.xhtml for -// more details. -package ianaindex - -import ( - "errors" - "sort" - "strings" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/charmap" - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/encoding/japanese" - "golang.org/x/text/encoding/korean" - "golang.org/x/text/encoding/simplifiedchinese" - "golang.org/x/text/encoding/traditionalchinese" - "golang.org/x/text/encoding/unicode" -) - -// TODO: remove the "Status... incomplete" in the package doc comment. -// TODO: allow users to specify their own aliases? -// TODO: allow users to specify their own indexes? -// TODO: allow canonicalizing names - -// NOTE: only use these top-level variables if we can get the linker to drop -// the indexes when they are not used. Make them a function or perhaps only -// support MIME otherwise. - -var ( - // MIME is an index to map MIME names. - MIME *Index = mime - - // IANA is an index that supports all names and aliases using IANA names as - // the canonical identifier. - IANA *Index = iana - - // MIB is an index that associates the MIB display name with an Encoding. - MIB *Index = mib - - mime = &Index{mimeName, ianaToMIB, ianaAliases, encodings[:]} - iana = &Index{ianaName, ianaToMIB, ianaAliases, encodings[:]} - mib = &Index{mibName, ianaToMIB, ianaAliases, encodings[:]} -) - -// Index maps names registered by IANA to Encodings. -// Currently different Indexes only differ in the names they return for -// encodings. In the future they may also differ in supported aliases. -type Index struct { - names func(i int) string - toMIB []identifier.MIB // Sorted slice of supported MIBs - alias map[string]int - enc []encoding.Encoding -} - -var ( - errInvalidName = errors.New("ianaindex: invalid encoding name") - errUnknown = errors.New("ianaindex: unknown Encoding") - errUnsupported = errors.New("ianaindex: unsupported Encoding") -) - -// Encoding returns an Encoding for IANA-registered names. Matching is -// case-insensitive. -func (x *Index) Encoding(name string) (encoding.Encoding, error) { - name = strings.TrimSpace(name) - // First try without lowercasing (possibly creating an allocation). - i, ok := x.alias[name] - if !ok { - i, ok = x.alias[strings.ToLower(name)] - if !ok { - return nil, errInvalidName - } - } - return x.enc[i], nil -} - -// Name reports the canonical name of the given Encoding. It will return an -// error if the e is not associated with a known encoding scheme. -func (x *Index) Name(e encoding.Encoding) (string, error) { - id, ok := e.(identifier.Interface) - if !ok { - return "", errUnknown - } - mib, _ := id.ID() - if mib == 0 { - return "", errUnknown - } - v := findMIB(x.toMIB, mib) - if v == -1 { - return "", errUnsupported - } - return x.names(v), nil -} - -// TODO: the coverage of this index is rather spotty. Allowing users to set -// encodings would allow: -// - users to increase coverage -// - allow a partially loaded set of encodings in case the user doesn't need to -// them all. -// - write an OS-specific wrapper for supported encodings and set them. -// The exact definition of Set depends a bit on if and how we want to let users -// write their own Encoding implementations. Also, it is not possible yet to -// only partially load the encodings without doing some refactoring. Until this -// is solved, we might as well not support Set. -// // Set sets the e to be used for the encoding scheme identified by name. Only -// // canonical names may be used. An empty name assigns e to its internally -// // associated encoding scheme. -// func (x *Index) Set(name string, e encoding.Encoding) error { -// panic("TODO: implement") -// } - -func findMIB(x []identifier.MIB, mib identifier.MIB) int { - i := sort.Search(len(x), func(i int) bool { return x[i] >= mib }) - if i < len(x) && x[i] == mib { - return i - } - return -1 -} - -const maxMIMENameLen = '0' - 1 // officially 40, but we leave some buffer. - -func mimeName(x int) string { - n := ianaNames[x] - // See gen.go for a description of the encoding. - if n[0] <= maxMIMENameLen { - return n[1:n[0]] - } - return n -} - -func ianaName(x int) string { - n := ianaNames[x] - // See gen.go for a description of the encoding. - if n[0] <= maxMIMENameLen { - return n[n[0]:] - } - return n -} - -func mibName(x int) string { - return mibNames[x] -} - -var encodings = [numIANA]encoding.Encoding{ - enc106: unicode.UTF8, - enc1015: unicode.UTF16(unicode.BigEndian, unicode.UseBOM), - enc1013: unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), - enc1014: unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), - enc2028: charmap.CodePage037, - enc2011: charmap.CodePage437, - enc2009: charmap.CodePage850, - enc2010: charmap.CodePage852, - enc2046: charmap.CodePage855, - enc2089: charmap.CodePage858, - enc2048: charmap.CodePage860, - enc2013: charmap.CodePage862, - enc2050: charmap.CodePage863, - enc2052: charmap.CodePage865, - enc2086: charmap.CodePage866, - enc2102: charmap.CodePage1047, - enc2091: charmap.CodePage1140, - enc4: charmap.ISO8859_1, - enc5: charmap.ISO8859_2, - enc6: charmap.ISO8859_3, - enc7: charmap.ISO8859_4, - enc8: charmap.ISO8859_5, - enc9: charmap.ISO8859_6, - enc81: charmap.ISO8859_6E, - enc82: charmap.ISO8859_6I, - enc10: charmap.ISO8859_7, - enc11: charmap.ISO8859_8, - enc84: charmap.ISO8859_8E, - enc85: charmap.ISO8859_8I, - enc12: charmap.ISO8859_9, - enc13: charmap.ISO8859_10, - enc109: charmap.ISO8859_13, - enc110: charmap.ISO8859_14, - enc111: charmap.ISO8859_15, - enc112: charmap.ISO8859_16, - enc2084: charmap.KOI8R, - enc2088: charmap.KOI8U, - enc2027: charmap.Macintosh, - enc2109: charmap.Windows874, - enc2250: charmap.Windows1250, - enc2251: charmap.Windows1251, - enc2252: charmap.Windows1252, - enc2253: charmap.Windows1253, - enc2254: charmap.Windows1254, - enc2255: charmap.Windows1255, - enc2256: charmap.Windows1256, - enc2257: charmap.Windows1257, - enc2258: charmap.Windows1258, - enc18: japanese.EUCJP, - enc39: japanese.ISO2022JP, - enc17: japanese.ShiftJIS, - enc38: korean.EUCKR, - enc114: simplifiedchinese.GB18030, - enc113: simplifiedchinese.GBK, - enc2085: simplifiedchinese.HZGB2312, - enc2026: traditionalchinese.Big5, -} diff --git a/vendor/golang.org/x/text/encoding/ianaindex/ianaindex_test.go b/vendor/golang.org/x/text/encoding/ianaindex/ianaindex_test.go deleted file mode 100644 index 20a2131f4..000000000 --- a/vendor/golang.org/x/text/encoding/ianaindex/ianaindex_test.go +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ianaindex - -import ( - "testing" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/charmap" - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/encoding/japanese" - "golang.org/x/text/encoding/korean" - "golang.org/x/text/encoding/simplifiedchinese" - "golang.org/x/text/encoding/traditionalchinese" - "golang.org/x/text/encoding/unicode" -) - -var All = [][]encoding.Encoding{ - unicode.All, - charmap.All, - japanese.All, - korean.All, - simplifiedchinese.All, - traditionalchinese.All, -} - -// TestAllIANA tests whether an Encoding supported in x/text is defined by IANA but -// not supported by this package. -func TestAllIANA(t *testing.T) { - for _, ea := range All { - for _, e := range ea { - mib, _ := e.(identifier.Interface).ID() - if x := findMIB(ianaToMIB, mib); x != -1 && encodings[x] == nil { - t.Errorf("supported MIB %v (%v) not in index", mib, e) - } - } - } -} - -// TestNotSupported reports the encodings in IANA, but not by x/text. -func TestNotSupported(t *testing.T) { - mibs := map[identifier.MIB]bool{} - for _, ea := range All { - for _, e := range ea { - mib, _ := e.(identifier.Interface).ID() - mibs[mib] = true - } - } - - // Many encodings in the IANA index will likely not be suppored by the - // Go encodings. That is fine. - // TODO: consider wheter we should add this test. - // for code, mib := range ianaToMIB { - // t.Run(fmt.Sprint("IANA:", mib), func(t *testing.T) { - // if !mibs[mib] { - // t.Skipf("IANA encoding %s (MIB %v) not supported", - // ianaNames[code], mib) - // } - // }) - // } -} - -func TestEncoding(t *testing.T) { - testCases := []struct { - index *Index - name string - canonical string - err error - }{ - {MIME, "utf-8", "UTF-8", nil}, - {MIME, " utf-8 ", "UTF-8", nil}, - {MIME, " l5 ", "ISO-8859-9", nil}, - {MIME, "latin5 ", "ISO-8859-9", nil}, - {MIME, "LATIN5 ", "ISO-8859-9", nil}, - {MIME, "latin 5", "", errInvalidName}, - {MIME, "latin-5", "", errInvalidName}, - - {IANA, "utf-8", "UTF-8", nil}, - {IANA, " utf-8 ", "UTF-8", nil}, - {IANA, " l5 ", "ISO_8859-9:1989", nil}, - {IANA, "latin5 ", "ISO_8859-9:1989", nil}, - {IANA, "LATIN5 ", "ISO_8859-9:1989", nil}, - {IANA, "latin 5", "", errInvalidName}, - {IANA, "latin-5", "", errInvalidName}, - - {MIB, "utf-8", "UTF8", nil}, - {MIB, " utf-8 ", "UTF8", nil}, - {MIB, " l5 ", "ISOLatin5", nil}, - {MIB, "latin5 ", "ISOLatin5", nil}, - {MIB, "LATIN5 ", "ISOLatin5", nil}, - {MIB, "latin 5", "", errInvalidName}, - {MIB, "latin-5", "", errInvalidName}, - } - for i, tc := range testCases { - enc, err := tc.index.Encoding(tc.name) - if err != tc.err { - t.Errorf("%d: error was %v; want %v", i, err, tc.err) - } - if err != nil { - continue - } - if got, err := tc.index.Name(enc); got != tc.canonical { - t.Errorf("%d: Name(Encoding(%q)) = %q; want %q (%v)", i, tc.name, got, tc.canonical, err) - } - } -} - -func TestTables(t *testing.T) { - for i, x := range []*Index{MIME, IANA} { - for name, index := range x.alias { - got, err := x.Encoding(name) - if err != nil { - t.Errorf("%d%s:err: unexpected error %v", i, name, err) - } - if want := x.enc[index]; got != want { - t.Errorf("%d%s:encoding: got %v; want %v", i, name, got, want) - } - if got != nil { - mib, _ := got.(identifier.Interface).ID() - if i := findMIB(x.toMIB, mib); i != index { - t.Errorf("%d%s:mib: got %d; want %d", i, name, i, index) - } - } - } - } -} - -type unsupported struct { - encoding.Encoding -} - -func (unsupported) ID() (identifier.MIB, string) { return 9999, "" } - -func TestName(t *testing.T) { - testCases := []struct { - desc string - enc encoding.Encoding - f func(e encoding.Encoding) (string, error) - name string - err error - }{{ - "defined encoding", - charmap.ISO8859_2, - MIME.Name, - "ISO-8859-2", - nil, - }, { - "defined Unicode encoding", - unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), - IANA.Name, - "UTF-16BE", - nil, - }, { - "another defined Unicode encoding", - unicode.UTF16(unicode.BigEndian, unicode.UseBOM), - MIME.Name, - "UTF-16", - nil, - }, { - "unknown Unicode encoding", - unicode.UTF16(unicode.BigEndian, unicode.ExpectBOM), - MIME.Name, - "", - errUnknown, - }, { - "undefined encoding", - unsupported{}, - MIME.Name, - "", - errUnsupported, - }, { - "undefined other encoding in HTML standard", - charmap.CodePage437, - IANA.Name, - "IBM437", - nil, - }, { - "unknown encoding", - encoding.Nop, - IANA.Name, - "", - errUnknown, - }} - for i, tc := range testCases { - name, err := tc.f(tc.enc) - if name != tc.name || err != tc.err { - t.Errorf("%d:%s: got %q, %v; want %q, %v", i, tc.desc, name, err, tc.name, tc.err) - } - } -} diff --git a/vendor/golang.org/x/text/encoding/ianaindex/tables.go b/vendor/golang.org/x/text/encoding/ianaindex/tables.go deleted file mode 100644 index 98a1d77ca..000000000 --- a/vendor/golang.org/x/text/encoding/ianaindex/tables.go +++ /dev/null @@ -1,2348 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package ianaindex - -import "golang.org/x/text/encoding/internal/identifier" - -const ( - enc3 = iota - enc4 - enc5 - enc6 - enc7 - enc8 - enc9 - enc10 - enc11 - enc12 - enc13 - enc14 - enc15 - enc16 - enc17 - enc18 - enc19 - enc20 - enc21 - enc22 - enc23 - enc24 - enc25 - enc26 - enc27 - enc28 - enc29 - enc30 - enc31 - enc32 - enc33 - enc34 - enc35 - enc36 - enc37 - enc38 - enc39 - enc40 - enc41 - enc42 - enc43 - enc44 - enc45 - enc46 - enc47 - enc48 - enc49 - enc50 - enc51 - enc52 - enc53 - enc54 - enc55 - enc56 - enc57 - enc58 - enc59 - enc60 - enc61 - enc62 - enc63 - enc64 - enc65 - enc66 - enc67 - enc68 - enc69 - enc70 - enc71 - enc72 - enc73 - enc74 - enc75 - enc76 - enc77 - enc78 - enc79 - enc80 - enc81 - enc82 - enc83 - enc84 - enc85 - enc86 - enc87 - enc88 - enc89 - enc90 - enc91 - enc92 - enc93 - enc94 - enc95 - enc96 - enc97 - enc98 - enc99 - enc100 - enc101 - enc102 - enc103 - enc104 - enc105 - enc106 - enc109 - enc110 - enc111 - enc112 - enc113 - enc114 - enc115 - enc116 - enc117 - enc118 - enc119 - enc1000 - enc1001 - enc1002 - enc1003 - enc1004 - enc1005 - enc1006 - enc1007 - enc1008 - enc1009 - enc1010 - enc1011 - enc1012 - enc1013 - enc1014 - enc1015 - enc1016 - enc1017 - enc1018 - enc1019 - enc1020 - enc2000 - enc2001 - enc2002 - enc2003 - enc2004 - enc2005 - enc2006 - enc2007 - enc2008 - enc2009 - enc2010 - enc2011 - enc2012 - enc2013 - enc2014 - enc2015 - enc2016 - enc2017 - enc2018 - enc2019 - enc2020 - enc2021 - enc2022 - enc2023 - enc2024 - enc2025 - enc2026 - enc2027 - enc2028 - enc2029 - enc2030 - enc2031 - enc2032 - enc2033 - enc2034 - enc2035 - enc2036 - enc2037 - enc2038 - enc2039 - enc2040 - enc2041 - enc2042 - enc2043 - enc2044 - enc2045 - enc2046 - enc2047 - enc2048 - enc2049 - enc2050 - enc2051 - enc2052 - enc2053 - enc2054 - enc2055 - enc2056 - enc2057 - enc2058 - enc2059 - enc2060 - enc2061 - enc2062 - enc2063 - enc2064 - enc2065 - enc2066 - enc2067 - enc2068 - enc2069 - enc2070 - enc2071 - enc2072 - enc2073 - enc2074 - enc2075 - enc2076 - enc2077 - enc2078 - enc2079 - enc2080 - enc2081 - enc2082 - enc2083 - enc2084 - enc2085 - enc2086 - enc2087 - enc2088 - enc2089 - enc2090 - enc2091 - enc2092 - enc2093 - enc2094 - enc2095 - enc2096 - enc2097 - enc2098 - enc2099 - enc2100 - enc2101 - enc2102 - enc2103 - enc2104 - enc2105 - enc2106 - enc2107 - enc2108 - enc2109 - enc2250 - enc2251 - enc2252 - enc2253 - enc2254 - enc2255 - enc2256 - enc2257 - enc2258 - enc2259 - enc2260 - numIANA -) - -var ianaToMIB = []identifier.MIB{ // 257 elements - // Entry 0 - 3F - 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, - 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, - 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, - 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, - 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, - 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, - 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, - 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, - // Entry 40 - 7F - 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, - 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, - 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, - 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, - 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, - 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, - 0x0075, 0x0076, 0x0077, 0x03e8, 0x03e9, 0x03ea, 0x03eb, 0x03ec, - 0x03ed, 0x03ee, 0x03ef, 0x03f0, 0x03f1, 0x03f2, 0x03f3, 0x03f4, - // Entry 80 - BF - 0x03f5, 0x03f6, 0x03f7, 0x03f8, 0x03f9, 0x03fa, 0x03fb, 0x03fc, - 0x07d0, 0x07d1, 0x07d2, 0x07d3, 0x07d4, 0x07d5, 0x07d6, 0x07d7, - 0x07d8, 0x07d9, 0x07da, 0x07db, 0x07dc, 0x07dd, 0x07de, 0x07df, - 0x07e0, 0x07e1, 0x07e2, 0x07e3, 0x07e4, 0x07e5, 0x07e6, 0x07e7, - 0x07e8, 0x07e9, 0x07ea, 0x07eb, 0x07ec, 0x07ed, 0x07ee, 0x07ef, - 0x07f0, 0x07f1, 0x07f2, 0x07f3, 0x07f4, 0x07f5, 0x07f6, 0x07f7, - 0x07f8, 0x07f9, 0x07fa, 0x07fb, 0x07fc, 0x07fd, 0x07fe, 0x07ff, - 0x0800, 0x0801, 0x0802, 0x0803, 0x0804, 0x0805, 0x0806, 0x0807, - // Entry C0 - FF - 0x0808, 0x0809, 0x080a, 0x080b, 0x080c, 0x080d, 0x080e, 0x080f, - 0x0810, 0x0811, 0x0812, 0x0813, 0x0814, 0x0815, 0x0816, 0x0817, - 0x0818, 0x0819, 0x081a, 0x081b, 0x081c, 0x081d, 0x081e, 0x081f, - 0x0820, 0x0821, 0x0822, 0x0823, 0x0824, 0x0825, 0x0826, 0x0827, - 0x0828, 0x0829, 0x082a, 0x082b, 0x082c, 0x082d, 0x082e, 0x082f, - 0x0830, 0x0831, 0x0832, 0x0833, 0x0834, 0x0835, 0x0836, 0x0837, - 0x0838, 0x0839, 0x083a, 0x083b, 0x083c, 0x083d, 0x08ca, 0x08cb, - 0x08cc, 0x08cd, 0x08ce, 0x08cf, 0x08d0, 0x08d1, 0x08d2, 0x08d3, - // Entry 100 - 13F - 0x08d4, -} // Size: 538 bytes - -var ianaNames = []string{ // 257 elements - "US-ASCII", - "\vISO-8859-1ISO_8859-1:1987", - "\vISO-8859-2ISO_8859-2:1987", - "\vISO-8859-3ISO_8859-3:1988", - "\vISO-8859-4ISO_8859-4:1988", - "\vISO-8859-5ISO_8859-5:1988", - "\vISO-8859-6ISO_8859-6:1987", - "\vISO-8859-7ISO_8859-7:1987", - "\vISO-8859-8ISO_8859-8:1988", - "\vISO-8859-9ISO_8859-9:1989", - "ISO-8859-10", - "ISO_6937-2-add", - "JIS_X0201", - "JIS_Encoding", - "Shift_JIS", - "\x07EUC-JPExtended_UNIX_Code_Packed_Format_for_Japanese", - "Extended_UNIX_Code_Fixed_Width_for_Japanese", - "BS_4730", - "SEN_850200_C", - "IT", - "ES", - "DIN_66003", - "NS_4551-1", - "NF_Z_62-010", - "ISO-10646-UTF-1", - "ISO_646.basic:1983", - "INVARIANT", - "ISO_646.irv:1983", - "NATS-SEFI", - "NATS-SEFI-ADD", - "NATS-DANO", - "NATS-DANO-ADD", - "SEN_850200_B", - "KS_C_5601-1987", - "ISO-2022-KR", - "EUC-KR", - "ISO-2022-JP", - "ISO-2022-JP-2", - "JIS_C6220-1969-jp", - "JIS_C6220-1969-ro", - "PT", - "greek7-old", - "latin-greek", - "NF_Z_62-010_(1973)", - "Latin-greek-1", - "ISO_5427", - "JIS_C6226-1978", - "BS_viewdata", - "INIS", - "INIS-8", - "INIS-cyrillic", - "ISO_5427:1981", - "ISO_5428:1980", - "GB_1988-80", - "GB_2312-80", - "NS_4551-2", - "videotex-suppl", - "PT2", - "ES2", - "MSZ_7795.3", - "JIS_C6226-1983", - "greek7", - "ASMO_449", - "iso-ir-90", - "JIS_C6229-1984-a", - "JIS_C6229-1984-b", - "JIS_C6229-1984-b-add", - "JIS_C6229-1984-hand", - "JIS_C6229-1984-hand-add", - "JIS_C6229-1984-kana", - "ISO_2033-1983", - "ANSI_X3.110-1983", - "T.61-7bit", - "T.61-8bit", - "ECMA-cyrillic", - "CSA_Z243.4-1985-1", - "CSA_Z243.4-1985-2", - "CSA_Z243.4-1985-gr", - "\rISO-8859-6-EISO_8859-6-E", - "\rISO-8859-6-IISO_8859-6-I", - "T.101-G2", - "\rISO-8859-8-EISO_8859-8-E", - "\rISO-8859-8-IISO_8859-8-I", - "CSN_369103", - "JUS_I.B1.002", - "IEC_P27-1", - "JUS_I.B1.003-serb", - "JUS_I.B1.003-mac", - "greek-ccitt", - "NC_NC00-10:81", - "ISO_6937-2-25", - "GOST_19768-74", - "ISO_8859-supp", - "ISO_10367-box", - "latin-lap", - "JIS_X0212-1990", - "DS_2089", - "us-dk", - "dk-us", - "KSC5636", - "UNICODE-1-1-UTF-7", - "ISO-2022-CN", - "ISO-2022-CN-EXT", - "UTF-8", - "ISO-8859-13", - "ISO-8859-14", - "ISO-8859-15", - "ISO-8859-16", - "GBK", - "GB18030", - "OSD_EBCDIC_DF04_15", - "OSD_EBCDIC_DF03_IRV", - "OSD_EBCDIC_DF04_1", - "ISO-11548-1", - "KZ-1048", - "ISO-10646-UCS-2", - "ISO-10646-UCS-4", - "ISO-10646-UCS-Basic", - "ISO-10646-Unicode-Latin1", - "ISO-10646-J-1", - "ISO-Unicode-IBM-1261", - "ISO-Unicode-IBM-1268", - "ISO-Unicode-IBM-1276", - "ISO-Unicode-IBM-1264", - "ISO-Unicode-IBM-1265", - "UNICODE-1-1", - "SCSU", - "UTF-7", - "UTF-16BE", - "UTF-16LE", - "UTF-16", - "CESU-8", - "UTF-32", - "UTF-32BE", - "UTF-32LE", - "BOCU-1", - "ISO-8859-1-Windows-3.0-Latin-1", - "ISO-8859-1-Windows-3.1-Latin-1", - "ISO-8859-2-Windows-Latin-2", - "ISO-8859-9-Windows-Latin-5", - "hp-roman8", - "Adobe-Standard-Encoding", - "Ventura-US", - "Ventura-International", - "DEC-MCS", - "IBM850", - "IBM852", - "IBM437", - "PC8-Danish-Norwegian", - "IBM862", - "PC8-Turkish", - "IBM-Symbols", - "IBM-Thai", - "HP-Legal", - "HP-Pi-font", - "HP-Math8", - "Adobe-Symbol-Encoding", - "HP-DeskTop", - "Ventura-Math", - "Microsoft-Publishing", - "Windows-31J", - "GB2312", - "Big5", - "macintosh", - "IBM037", - "IBM038", - "IBM273", - "IBM274", - "IBM275", - "IBM277", - "IBM278", - "IBM280", - "IBM281", - "IBM284", - "IBM285", - "IBM290", - "IBM297", - "IBM420", - "IBM423", - "IBM424", - "IBM500", - "IBM851", - "IBM855", - "IBM857", - "IBM860", - "IBM861", - "IBM863", - "IBM864", - "IBM865", - "IBM868", - "IBM869", - "IBM870", - "IBM871", - "IBM880", - "IBM891", - "IBM903", - "IBM904", - "IBM905", - "IBM918", - "IBM1026", - "EBCDIC-AT-DE", - "EBCDIC-AT-DE-A", - "EBCDIC-CA-FR", - "EBCDIC-DK-NO", - "EBCDIC-DK-NO-A", - "EBCDIC-FI-SE", - "EBCDIC-FI-SE-A", - "EBCDIC-FR", - "EBCDIC-IT", - "EBCDIC-PT", - "EBCDIC-ES", - "EBCDIC-ES-A", - "EBCDIC-ES-S", - "EBCDIC-UK", - "EBCDIC-US", - "UNKNOWN-8BIT", - "MNEMONIC", - "MNEM", - "VISCII", - "VIQR", - "KOI8-R", - "HZ-GB-2312", - "IBM866", - "IBM775", - "KOI8-U", - "IBM00858", - "IBM00924", - "IBM01140", - "IBM01141", - "IBM01142", - "IBM01143", - "IBM01144", - "IBM01145", - "IBM01146", - "IBM01147", - "IBM01148", - "IBM01149", - "Big5-HKSCS", - "IBM1047", - "PTCP154", - "Amiga-1251", - "KOI7-switched", - "BRF", - "TSCII", - "CP51932", - "windows-874", - "windows-1250", - "windows-1251", - "windows-1252", - "windows-1253", - "windows-1254", - "windows-1255", - "windows-1256", - "windows-1257", - "windows-1258", - "TIS-620", - "CP50220", -} // Size: 7088 bytes - -var mibNames = []string{ // 257 elements - "ASCII", - "ISOLatin1", - "ISOLatin2", - "ISOLatin3", - "ISOLatin4", - "ISOLatinCyrillic", - "ISOLatinArabic", - "ISOLatinGreek", - "ISOLatinHebrew", - "ISOLatin5", - "ISOLatin6", - "ISOTextComm", - "HalfWidthKatakana", - "JISEncoding", - "ShiftJIS", - "EUCPkdFmtJapanese", - "EUCFixWidJapanese", - "ISO4UnitedKingdom", - "ISO11SwedishForNames", - "ISO15Italian", - "ISO17Spanish", - "ISO21German", - "ISO60Norwegian1", - "ISO69French", - "ISO10646UTF1", - "ISO646basic1983", - "INVARIANT", - "ISO2IntlRefVersion", - "NATSSEFI", - "NATSSEFIADD", - "NATSDANO", - "NATSDANOADD", - "ISO10Swedish", - "KSC56011987", - "ISO2022KR", - "EUCKR", - "ISO2022JP", - "ISO2022JP2", - "ISO13JISC6220jp", - "ISO14JISC6220ro", - "ISO16Portuguese", - "ISO18Greek7Old", - "ISO19LatinGreek", - "ISO25French", - "ISO27LatinGreek1", - "ISO5427Cyrillic", - "ISO42JISC62261978", - "ISO47BSViewdata", - "ISO49INIS", - "ISO50INIS8", - "ISO51INISCyrillic", - "ISO54271981", - "ISO5428Greek", - "ISO57GB1988", - "ISO58GB231280", - "ISO61Norwegian2", - "ISO70VideotexSupp1", - "ISO84Portuguese2", - "ISO85Spanish2", - "ISO86Hungarian", - "ISO87JISX0208", - "ISO88Greek7", - "ISO89ASMO449", - "ISO90", - "ISO91JISC62291984a", - "ISO92JISC62991984b", - "ISO93JIS62291984badd", - "ISO94JIS62291984hand", - "ISO95JIS62291984handadd", - "ISO96JISC62291984kana", - "ISO2033", - "ISO99NAPLPS", - "ISO102T617bit", - "ISO103T618bit", - "ISO111ECMACyrillic", - "ISO121Canadian1", - "ISO122Canadian2", - "ISO123CSAZ24341985gr", - "ISO88596E", - "ISO88596I", - "ISO128T101G2", - "ISO88598E", - "ISO88598I", - "ISO139CSN369103", - "ISO141JUSIB1002", - "ISO143IECP271", - "ISO146Serbian", - "ISO147Macedonian", - "ISO150GreekCCITT", - "ISO151Cuba", - "ISO6937Add", - "ISO153GOST1976874", - "ISO8859Supp", - "ISO10367Box", - "ISO158Lap", - "ISO159JISX02121990", - "ISO646Danish", - "USDK", - "DKUS", - "KSC5636", - "Unicode11UTF7", - "ISO2022CN", - "ISO2022CNEXT", - "UTF8", - "ISO885913", - "ISO885914", - "ISO885915", - "ISO885916", - "GBK", - "GB18030", - "OSDEBCDICDF0415", - "OSDEBCDICDF03IRV", - "OSDEBCDICDF041", - "ISO115481", - "KZ1048", - "Unicode", - "UCS4", - "UnicodeASCII", - "UnicodeLatin1", - "UnicodeJapanese", - "UnicodeIBM1261", - "UnicodeIBM1268", - "UnicodeIBM1276", - "UnicodeIBM1264", - "UnicodeIBM1265", - "Unicode11", - "SCSU", - "UTF7", - "UTF16BE", - "UTF16LE", - "UTF16", - "CESU-8", - "UTF32", - "UTF32BE", - "UTF32LE", - "BOCU-1", - "Windows30Latin1", - "Windows31Latin1", - "Windows31Latin2", - "Windows31Latin5", - "HPRoman8", - "AdobeStandardEncoding", - "VenturaUS", - "VenturaInternational", - "DECMCS", - "PC850Multilingual", - "PCp852", - "PC8CodePage437", - "PC8DanishNorwegian", - "PC862LatinHebrew", - "PC8Turkish", - "IBMSymbols", - "IBMThai", - "HPLegal", - "HPPiFont", - "HPMath8", - "HPPSMath", - "HPDesktop", - "VenturaMath", - "MicrosoftPublishing", - "Windows31J", - "GB2312", - "Big5", - "Macintosh", - "IBM037", - "IBM038", - "IBM273", - "IBM274", - "IBM275", - "IBM277", - "IBM278", - "IBM280", - "IBM281", - "IBM284", - "IBM285", - "IBM290", - "IBM297", - "IBM420", - "IBM423", - "IBM424", - "IBM500", - "IBM851", - "IBM855", - "IBM857", - "IBM860", - "IBM861", - "IBM863", - "IBM864", - "IBM865", - "IBM868", - "IBM869", - "IBM870", - "IBM871", - "IBM880", - "IBM891", - "IBM903", - "IBBM904", - "IBM905", - "IBM918", - "IBM1026", - "IBMEBCDICATDE", - "EBCDICATDEA", - "EBCDICCAFR", - "EBCDICDKNO", - "EBCDICDKNOA", - "EBCDICFISE", - "EBCDICFISEA", - "EBCDICFR", - "EBCDICIT", - "EBCDICPT", - "EBCDICES", - "EBCDICESA", - "EBCDICESS", - "EBCDICUK", - "EBCDICUS", - "Unknown8BiT", - "Mnemonic", - "Mnem", - "VISCII", - "VIQR", - "KOI8R", - "HZ-GB-2312", - "IBM866", - "PC775Baltic", - "KOI8U", - "IBM00858", - "IBM00924", - "IBM01140", - "IBM01141", - "IBM01142", - "IBM01143", - "IBM01144", - "IBM01145", - "IBM01146", - "IBM01147", - "IBM01148", - "IBM01149", - "Big5HKSCS", - "IBM1047", - "PTCP154", - "Amiga1251\n(Aliases", - "KOI7switched", - "BRF", - "TSCII", - "CP51932", - "windows874", - "windows1250", - "windows1251", - "windows1252", - "windows1253", - "windows1254", - "windows1255", - "windows1256", - "windows1257", - "windows1258", - "TIS620", - "CP50220", -} // Size: 6776 bytes - -// TODO: Instead of using a map, we could use binary search strings doing -// on-the fly lower-casing per character. This allows to always avoid -// allocation and will be considerably more compact. -var ianaAliases = map[string]int{ - "US-ASCII": enc3, - "us-ascii": enc3, - "iso-ir-6": enc3, - "ANSI_X3.4-1968": enc3, - "ansi_x3.4-1968": enc3, - "ANSI_X3.4-1986": enc3, - "ansi_x3.4-1986": enc3, - "ISO_646.irv:1991": enc3, - "iso_646.irv:1991": enc3, - "ISO646-US": enc3, - "iso646-us": enc3, - "us": enc3, - "IBM367": enc3, - "ibm367": enc3, - "cp367": enc3, - "csASCII": enc3, - "csascii": enc3, - "ISO_8859-1:1987": enc4, - "iso_8859-1:1987": enc4, - "iso-ir-100": enc4, - "ISO_8859-1": enc4, - "iso_8859-1": enc4, - "ISO-8859-1": enc4, - "iso-8859-1": enc4, - "latin1": enc4, - "l1": enc4, - "IBM819": enc4, - "ibm819": enc4, - "CP819": enc4, - "cp819": enc4, - "csISOLatin1": enc4, - "csisolatin1": enc4, - "ISO_8859-2:1987": enc5, - "iso_8859-2:1987": enc5, - "iso-ir-101": enc5, - "ISO_8859-2": enc5, - "iso_8859-2": enc5, - "ISO-8859-2": enc5, - "iso-8859-2": enc5, - "latin2": enc5, - "l2": enc5, - "csISOLatin2": enc5, - "csisolatin2": enc5, - "ISO_8859-3:1988": enc6, - "iso_8859-3:1988": enc6, - "iso-ir-109": enc6, - "ISO_8859-3": enc6, - "iso_8859-3": enc6, - "ISO-8859-3": enc6, - "iso-8859-3": enc6, - "latin3": enc6, - "l3": enc6, - "csISOLatin3": enc6, - "csisolatin3": enc6, - "ISO_8859-4:1988": enc7, - "iso_8859-4:1988": enc7, - "iso-ir-110": enc7, - "ISO_8859-4": enc7, - "iso_8859-4": enc7, - "ISO-8859-4": enc7, - "iso-8859-4": enc7, - "latin4": enc7, - "l4": enc7, - "csISOLatin4": enc7, - "csisolatin4": enc7, - "ISO_8859-5:1988": enc8, - "iso_8859-5:1988": enc8, - "iso-ir-144": enc8, - "ISO_8859-5": enc8, - "iso_8859-5": enc8, - "ISO-8859-5": enc8, - "iso-8859-5": enc8, - "cyrillic": enc8, - "csISOLatinCyrillic": enc8, - "csisolatincyrillic": enc8, - "ISO_8859-6:1987": enc9, - "iso_8859-6:1987": enc9, - "iso-ir-127": enc9, - "ISO_8859-6": enc9, - "iso_8859-6": enc9, - "ISO-8859-6": enc9, - "iso-8859-6": enc9, - "ECMA-114": enc9, - "ecma-114": enc9, - "ASMO-708": enc9, - "asmo-708": enc9, - "arabic": enc9, - "csISOLatinArabic": enc9, - "csisolatinarabic": enc9, - "ISO_8859-7:1987": enc10, - "iso_8859-7:1987": enc10, - "iso-ir-126": enc10, - "ISO_8859-7": enc10, - "iso_8859-7": enc10, - "ISO-8859-7": enc10, - "iso-8859-7": enc10, - "ELOT_928": enc10, - "elot_928": enc10, - "ECMA-118": enc10, - "ecma-118": enc10, - "greek": enc10, - "greek8": enc10, - "csISOLatinGreek": enc10, - "csisolatingreek": enc10, - "ISO_8859-8:1988": enc11, - "iso_8859-8:1988": enc11, - "iso-ir-138": enc11, - "ISO_8859-8": enc11, - "iso_8859-8": enc11, - "ISO-8859-8": enc11, - "iso-8859-8": enc11, - "hebrew": enc11, - "csISOLatinHebrew": enc11, - "csisolatinhebrew": enc11, - "ISO_8859-9:1989": enc12, - "iso_8859-9:1989": enc12, - "iso-ir-148": enc12, - "ISO_8859-9": enc12, - "iso_8859-9": enc12, - "ISO-8859-9": enc12, - "iso-8859-9": enc12, - "latin5": enc12, - "l5": enc12, - "csISOLatin5": enc12, - "csisolatin5": enc12, - "ISO-8859-10": enc13, - "iso-8859-10": enc13, - "iso-ir-157": enc13, - "l6": enc13, - "ISO_8859-10:1992": enc13, - "iso_8859-10:1992": enc13, - "csISOLatin6": enc13, - "csisolatin6": enc13, - "latin6": enc13, - "ISO_6937-2-add": enc14, - "iso_6937-2-add": enc14, - "iso-ir-142": enc14, - "csISOTextComm": enc14, - "csisotextcomm": enc14, - "JIS_X0201": enc15, - "jis_x0201": enc15, - "X0201": enc15, - "x0201": enc15, - "csHalfWidthKatakana": enc15, - "cshalfwidthkatakana": enc15, - "JIS_Encoding": enc16, - "jis_encoding": enc16, - "csJISEncoding": enc16, - "csjisencoding": enc16, - "Shift_JIS": enc17, - "shift_jis": enc17, - "MS_Kanji": enc17, - "ms_kanji": enc17, - "csShiftJIS": enc17, - "csshiftjis": enc17, - "Extended_UNIX_Code_Packed_Format_for_Japanese": enc18, - "extended_unix_code_packed_format_for_japanese": enc18, - "csEUCPkdFmtJapanese": enc18, - "cseucpkdfmtjapanese": enc18, - "EUC-JP": enc18, - "euc-jp": enc18, - "Extended_UNIX_Code_Fixed_Width_for_Japanese": enc19, - "extended_unix_code_fixed_width_for_japanese": enc19, - "csEUCFixWidJapanese": enc19, - "cseucfixwidjapanese": enc19, - "BS_4730": enc20, - "bs_4730": enc20, - "iso-ir-4": enc20, - "ISO646-GB": enc20, - "iso646-gb": enc20, - "gb": enc20, - "uk": enc20, - "csISO4UnitedKingdom": enc20, - "csiso4unitedkingdom": enc20, - "SEN_850200_C": enc21, - "sen_850200_c": enc21, - "iso-ir-11": enc21, - "ISO646-SE2": enc21, - "iso646-se2": enc21, - "se2": enc21, - "csISO11SwedishForNames": enc21, - "csiso11swedishfornames": enc21, - "IT": enc22, - "it": enc22, - "iso-ir-15": enc22, - "ISO646-IT": enc22, - "iso646-it": enc22, - "csISO15Italian": enc22, - "csiso15italian": enc22, - "ES": enc23, - "es": enc23, - "iso-ir-17": enc23, - "ISO646-ES": enc23, - "iso646-es": enc23, - "csISO17Spanish": enc23, - "csiso17spanish": enc23, - "DIN_66003": enc24, - "din_66003": enc24, - "iso-ir-21": enc24, - "de": enc24, - "ISO646-DE": enc24, - "iso646-de": enc24, - "csISO21German": enc24, - "csiso21german": enc24, - "NS_4551-1": enc25, - "ns_4551-1": enc25, - "iso-ir-60": enc25, - "ISO646-NO": enc25, - "iso646-no": enc25, - "no": enc25, - "csISO60DanishNorwegian": enc25, - "csiso60danishnorwegian": enc25, - "csISO60Norwegian1": enc25, - "csiso60norwegian1": enc25, - "NF_Z_62-010": enc26, - "nf_z_62-010": enc26, - "iso-ir-69": enc26, - "ISO646-FR": enc26, - "iso646-fr": enc26, - "fr": enc26, - "csISO69French": enc26, - "csiso69french": enc26, - "ISO-10646-UTF-1": enc27, - "iso-10646-utf-1": enc27, - "csISO10646UTF1": enc27, - "csiso10646utf1": enc27, - "ISO_646.basic:1983": enc28, - "iso_646.basic:1983": enc28, - "ref": enc28, - "csISO646basic1983": enc28, - "csiso646basic1983": enc28, - "INVARIANT": enc29, - "invariant": enc29, - "csINVARIANT": enc29, - "csinvariant": enc29, - "ISO_646.irv:1983": enc30, - "iso_646.irv:1983": enc30, - "iso-ir-2": enc30, - "irv": enc30, - "csISO2IntlRefVersion": enc30, - "csiso2intlrefversion": enc30, - "NATS-SEFI": enc31, - "nats-sefi": enc31, - "iso-ir-8-1": enc31, - "csNATSSEFI": enc31, - "csnatssefi": enc31, - "NATS-SEFI-ADD": enc32, - "nats-sefi-add": enc32, - "iso-ir-8-2": enc32, - "csNATSSEFIADD": enc32, - "csnatssefiadd": enc32, - "NATS-DANO": enc33, - "nats-dano": enc33, - "iso-ir-9-1": enc33, - "csNATSDANO": enc33, - "csnatsdano": enc33, - "NATS-DANO-ADD": enc34, - "nats-dano-add": enc34, - "iso-ir-9-2": enc34, - "csNATSDANOADD": enc34, - "csnatsdanoadd": enc34, - "SEN_850200_B": enc35, - "sen_850200_b": enc35, - "iso-ir-10": enc35, - "FI": enc35, - "fi": enc35, - "ISO646-FI": enc35, - "iso646-fi": enc35, - "ISO646-SE": enc35, - "iso646-se": enc35, - "se": enc35, - "csISO10Swedish": enc35, - "csiso10swedish": enc35, - "KS_C_5601-1987": enc36, - "ks_c_5601-1987": enc36, - "iso-ir-149": enc36, - "KS_C_5601-1989": enc36, - "ks_c_5601-1989": enc36, - "KSC_5601": enc36, - "ksc_5601": enc36, - "korean": enc36, - "csKSC56011987": enc36, - "csksc56011987": enc36, - "ISO-2022-KR": enc37, - "iso-2022-kr": enc37, - "csISO2022KR": enc37, - "csiso2022kr": enc37, - "EUC-KR": enc38, - "euc-kr": enc38, - "csEUCKR": enc38, - "cseuckr": enc38, - "ISO-2022-JP": enc39, - "iso-2022-jp": enc39, - "csISO2022JP": enc39, - "csiso2022jp": enc39, - "ISO-2022-JP-2": enc40, - "iso-2022-jp-2": enc40, - "csISO2022JP2": enc40, - "csiso2022jp2": enc40, - "JIS_C6220-1969-jp": enc41, - "jis_c6220-1969-jp": enc41, - "JIS_C6220-1969": enc41, - "jis_c6220-1969": enc41, - "iso-ir-13": enc41, - "katakana": enc41, - "x0201-7": enc41, - "csISO13JISC6220jp": enc41, - "csiso13jisc6220jp": enc41, - "JIS_C6220-1969-ro": enc42, - "jis_c6220-1969-ro": enc42, - "iso-ir-14": enc42, - "jp": enc42, - "ISO646-JP": enc42, - "iso646-jp": enc42, - "csISO14JISC6220ro": enc42, - "csiso14jisc6220ro": enc42, - "PT": enc43, - "pt": enc43, - "iso-ir-16": enc43, - "ISO646-PT": enc43, - "iso646-pt": enc43, - "csISO16Portuguese": enc43, - "csiso16portuguese": enc43, - "greek7-old": enc44, - "iso-ir-18": enc44, - "csISO18Greek7Old": enc44, - "csiso18greek7old": enc44, - "latin-greek": enc45, - "iso-ir-19": enc45, - "csISO19LatinGreek": enc45, - "csiso19latingreek": enc45, - "NF_Z_62-010_(1973)": enc46, - "nf_z_62-010_(1973)": enc46, - "iso-ir-25": enc46, - "ISO646-FR1": enc46, - "iso646-fr1": enc46, - "csISO25French": enc46, - "csiso25french": enc46, - "Latin-greek-1": enc47, - "latin-greek-1": enc47, - "iso-ir-27": enc47, - "csISO27LatinGreek1": enc47, - "csiso27latingreek1": enc47, - "ISO_5427": enc48, - "iso_5427": enc48, - "iso-ir-37": enc48, - "csISO5427Cyrillic": enc48, - "csiso5427cyrillic": enc48, - "JIS_C6226-1978": enc49, - "jis_c6226-1978": enc49, - "iso-ir-42": enc49, - "csISO42JISC62261978": enc49, - "csiso42jisc62261978": enc49, - "BS_viewdata": enc50, - "bs_viewdata": enc50, - "iso-ir-47": enc50, - "csISO47BSViewdata": enc50, - "csiso47bsviewdata": enc50, - "INIS": enc51, - "inis": enc51, - "iso-ir-49": enc51, - "csISO49INIS": enc51, - "csiso49inis": enc51, - "INIS-8": enc52, - "inis-8": enc52, - "iso-ir-50": enc52, - "csISO50INIS8": enc52, - "csiso50inis8": enc52, - "INIS-cyrillic": enc53, - "inis-cyrillic": enc53, - "iso-ir-51": enc53, - "csISO51INISCyrillic": enc53, - "csiso51iniscyrillic": enc53, - "ISO_5427:1981": enc54, - "iso_5427:1981": enc54, - "iso-ir-54": enc54, - "ISO5427Cyrillic1981": enc54, - "iso5427cyrillic1981": enc54, - "csISO54271981": enc54, - "csiso54271981": enc54, - "ISO_5428:1980": enc55, - "iso_5428:1980": enc55, - "iso-ir-55": enc55, - "csISO5428Greek": enc55, - "csiso5428greek": enc55, - "GB_1988-80": enc56, - "gb_1988-80": enc56, - "iso-ir-57": enc56, - "cn": enc56, - "ISO646-CN": enc56, - "iso646-cn": enc56, - "csISO57GB1988": enc56, - "csiso57gb1988": enc56, - "GB_2312-80": enc57, - "gb_2312-80": enc57, - "iso-ir-58": enc57, - "chinese": enc57, - "csISO58GB231280": enc57, - "csiso58gb231280": enc57, - "NS_4551-2": enc58, - "ns_4551-2": enc58, - "ISO646-NO2": enc58, - "iso646-no2": enc58, - "iso-ir-61": enc58, - "no2": enc58, - "csISO61Norwegian2": enc58, - "csiso61norwegian2": enc58, - "videotex-suppl": enc59, - "iso-ir-70": enc59, - "csISO70VideotexSupp1": enc59, - "csiso70videotexsupp1": enc59, - "PT2": enc60, - "pt2": enc60, - "iso-ir-84": enc60, - "ISO646-PT2": enc60, - "iso646-pt2": enc60, - "csISO84Portuguese2": enc60, - "csiso84portuguese2": enc60, - "ES2": enc61, - "es2": enc61, - "iso-ir-85": enc61, - "ISO646-ES2": enc61, - "iso646-es2": enc61, - "csISO85Spanish2": enc61, - "csiso85spanish2": enc61, - "MSZ_7795.3": enc62, - "msz_7795.3": enc62, - "iso-ir-86": enc62, - "ISO646-HU": enc62, - "iso646-hu": enc62, - "hu": enc62, - "csISO86Hungarian": enc62, - "csiso86hungarian": enc62, - "JIS_C6226-1983": enc63, - "jis_c6226-1983": enc63, - "iso-ir-87": enc63, - "x0208": enc63, - "JIS_X0208-1983": enc63, - "jis_x0208-1983": enc63, - "csISO87JISX0208": enc63, - "csiso87jisx0208": enc63, - "greek7": enc64, - "iso-ir-88": enc64, - "csISO88Greek7": enc64, - "csiso88greek7": enc64, - "ASMO_449": enc65, - "asmo_449": enc65, - "ISO_9036": enc65, - "iso_9036": enc65, - "arabic7": enc65, - "iso-ir-89": enc65, - "csISO89ASMO449": enc65, - "csiso89asmo449": enc65, - "iso-ir-90": enc66, - "csISO90": enc66, - "csiso90": enc66, - "JIS_C6229-1984-a": enc67, - "jis_c6229-1984-a": enc67, - "iso-ir-91": enc67, - "jp-ocr-a": enc67, - "csISO91JISC62291984a": enc67, - "csiso91jisc62291984a": enc67, - "JIS_C6229-1984-b": enc68, - "jis_c6229-1984-b": enc68, - "iso-ir-92": enc68, - "ISO646-JP-OCR-B": enc68, - "iso646-jp-ocr-b": enc68, - "jp-ocr-b": enc68, - "csISO92JISC62991984b": enc68, - "csiso92jisc62991984b": enc68, - "JIS_C6229-1984-b-add": enc69, - "jis_c6229-1984-b-add": enc69, - "iso-ir-93": enc69, - "jp-ocr-b-add": enc69, - "csISO93JIS62291984badd": enc69, - "csiso93jis62291984badd": enc69, - "JIS_C6229-1984-hand": enc70, - "jis_c6229-1984-hand": enc70, - "iso-ir-94": enc70, - "jp-ocr-hand": enc70, - "csISO94JIS62291984hand": enc70, - "csiso94jis62291984hand": enc70, - "JIS_C6229-1984-hand-add": enc71, - "jis_c6229-1984-hand-add": enc71, - "iso-ir-95": enc71, - "jp-ocr-hand-add": enc71, - "csISO95JIS62291984handadd": enc71, - "csiso95jis62291984handadd": enc71, - "JIS_C6229-1984-kana": enc72, - "jis_c6229-1984-kana": enc72, - "iso-ir-96": enc72, - "csISO96JISC62291984kana": enc72, - "csiso96jisc62291984kana": enc72, - "ISO_2033-1983": enc73, - "iso_2033-1983": enc73, - "iso-ir-98": enc73, - "e13b": enc73, - "csISO2033": enc73, - "csiso2033": enc73, - "ANSI_X3.110-1983": enc74, - "ansi_x3.110-1983": enc74, - "iso-ir-99": enc74, - "CSA_T500-1983": enc74, - "csa_t500-1983": enc74, - "NAPLPS": enc74, - "naplps": enc74, - "csISO99NAPLPS": enc74, - "csiso99naplps": enc74, - "T.61-7bit": enc75, - "t.61-7bit": enc75, - "iso-ir-102": enc75, - "csISO102T617bit": enc75, - "csiso102t617bit": enc75, - "T.61-8bit": enc76, - "t.61-8bit": enc76, - "T.61": enc76, - "t.61": enc76, - "iso-ir-103": enc76, - "csISO103T618bit": enc76, - "csiso103t618bit": enc76, - "ECMA-cyrillic": enc77, - "ecma-cyrillic": enc77, - "iso-ir-111": enc77, - "KOI8-E": enc77, - "koi8-e": enc77, - "csISO111ECMACyrillic": enc77, - "csiso111ecmacyrillic": enc77, - "CSA_Z243.4-1985-1": enc78, - "csa_z243.4-1985-1": enc78, - "iso-ir-121": enc78, - "ISO646-CA": enc78, - "iso646-ca": enc78, - "csa7-1": enc78, - "csa71": enc78, - "ca": enc78, - "csISO121Canadian1": enc78, - "csiso121canadian1": enc78, - "CSA_Z243.4-1985-2": enc79, - "csa_z243.4-1985-2": enc79, - "iso-ir-122": enc79, - "ISO646-CA2": enc79, - "iso646-ca2": enc79, - "csa7-2": enc79, - "csa72": enc79, - "csISO122Canadian2": enc79, - "csiso122canadian2": enc79, - "CSA_Z243.4-1985-gr": enc80, - "csa_z243.4-1985-gr": enc80, - "iso-ir-123": enc80, - "csISO123CSAZ24341985gr": enc80, - "csiso123csaz24341985gr": enc80, - "ISO_8859-6-E": enc81, - "iso_8859-6-e": enc81, - "csISO88596E": enc81, - "csiso88596e": enc81, - "ISO-8859-6-E": enc81, - "iso-8859-6-e": enc81, - "ISO_8859-6-I": enc82, - "iso_8859-6-i": enc82, - "csISO88596I": enc82, - "csiso88596i": enc82, - "ISO-8859-6-I": enc82, - "iso-8859-6-i": enc82, - "T.101-G2": enc83, - "t.101-g2": enc83, - "iso-ir-128": enc83, - "csISO128T101G2": enc83, - "csiso128t101g2": enc83, - "ISO_8859-8-E": enc84, - "iso_8859-8-e": enc84, - "csISO88598E": enc84, - "csiso88598e": enc84, - "ISO-8859-8-E": enc84, - "iso-8859-8-e": enc84, - "ISO_8859-8-I": enc85, - "iso_8859-8-i": enc85, - "csISO88598I": enc85, - "csiso88598i": enc85, - "ISO-8859-8-I": enc85, - "iso-8859-8-i": enc85, - "CSN_369103": enc86, - "csn_369103": enc86, - "iso-ir-139": enc86, - "csISO139CSN369103": enc86, - "csiso139csn369103": enc86, - "JUS_I.B1.002": enc87, - "jus_i.b1.002": enc87, - "iso-ir-141": enc87, - "ISO646-YU": enc87, - "iso646-yu": enc87, - "js": enc87, - "yu": enc87, - "csISO141JUSIB1002": enc87, - "csiso141jusib1002": enc87, - "IEC_P27-1": enc88, - "iec_p27-1": enc88, - "iso-ir-143": enc88, - "csISO143IECP271": enc88, - "csiso143iecp271": enc88, - "JUS_I.B1.003-serb": enc89, - "jus_i.b1.003-serb": enc89, - "iso-ir-146": enc89, - "serbian": enc89, - "csISO146Serbian": enc89, - "csiso146serbian": enc89, - "JUS_I.B1.003-mac": enc90, - "jus_i.b1.003-mac": enc90, - "macedonian": enc90, - "iso-ir-147": enc90, - "csISO147Macedonian": enc90, - "csiso147macedonian": enc90, - "greek-ccitt": enc91, - "iso-ir-150": enc91, - "csISO150": enc91, - "csiso150": enc91, - "csISO150GreekCCITT": enc91, - "csiso150greekccitt": enc91, - "NC_NC00-10:81": enc92, - "nc_nc00-10:81": enc92, - "cuba": enc92, - "iso-ir-151": enc92, - "ISO646-CU": enc92, - "iso646-cu": enc92, - "csISO151Cuba": enc92, - "csiso151cuba": enc92, - "ISO_6937-2-25": enc93, - "iso_6937-2-25": enc93, - "iso-ir-152": enc93, - "csISO6937Add": enc93, - "csiso6937add": enc93, - "GOST_19768-74": enc94, - "gost_19768-74": enc94, - "ST_SEV_358-88": enc94, - "st_sev_358-88": enc94, - "iso-ir-153": enc94, - "csISO153GOST1976874": enc94, - "csiso153gost1976874": enc94, - "ISO_8859-supp": enc95, - "iso_8859-supp": enc95, - "iso-ir-154": enc95, - "latin1-2-5": enc95, - "csISO8859Supp": enc95, - "csiso8859supp": enc95, - "ISO_10367-box": enc96, - "iso_10367-box": enc96, - "iso-ir-155": enc96, - "csISO10367Box": enc96, - "csiso10367box": enc96, - "latin-lap": enc97, - "lap": enc97, - "iso-ir-158": enc97, - "csISO158Lap": enc97, - "csiso158lap": enc97, - "JIS_X0212-1990": enc98, - "jis_x0212-1990": enc98, - "x0212": enc98, - "iso-ir-159": enc98, - "csISO159JISX02121990": enc98, - "csiso159jisx02121990": enc98, - "DS_2089": enc99, - "ds_2089": enc99, - "DS2089": enc99, - "ds2089": enc99, - "ISO646-DK": enc99, - "iso646-dk": enc99, - "dk": enc99, - "csISO646Danish": enc99, - "csiso646danish": enc99, - "us-dk": enc100, - "csUSDK": enc100, - "csusdk": enc100, - "dk-us": enc101, - "csDKUS": enc101, - "csdkus": enc101, - "KSC5636": enc102, - "ksc5636": enc102, - "ISO646-KR": enc102, - "iso646-kr": enc102, - "csKSC5636": enc102, - "csksc5636": enc102, - "UNICODE-1-1-UTF-7": enc103, - "unicode-1-1-utf-7": enc103, - "csUnicode11UTF7": enc103, - "csunicode11utf7": enc103, - "ISO-2022-CN": enc104, - "iso-2022-cn": enc104, - "csISO2022CN": enc104, - "csiso2022cn": enc104, - "ISO-2022-CN-EXT": enc105, - "iso-2022-cn-ext": enc105, - "csISO2022CNEXT": enc105, - "csiso2022cnext": enc105, - "UTF-8": enc106, - "utf-8": enc106, - "csUTF8": enc106, - "csutf8": enc106, - "ISO-8859-13": enc109, - "iso-8859-13": enc109, - "csISO885913": enc109, - "csiso885913": enc109, - "ISO-8859-14": enc110, - "iso-8859-14": enc110, - "iso-ir-199": enc110, - "ISO_8859-14:1998": enc110, - "iso_8859-14:1998": enc110, - "ISO_8859-14": enc110, - "iso_8859-14": enc110, - "latin8": enc110, - "iso-celtic": enc110, - "l8": enc110, - "csISO885914": enc110, - "csiso885914": enc110, - "ISO-8859-15": enc111, - "iso-8859-15": enc111, - "ISO_8859-15": enc111, - "iso_8859-15": enc111, - "Latin-9": enc111, - "latin-9": enc111, - "csISO885915": enc111, - "csiso885915": enc111, - "ISO-8859-16": enc112, - "iso-8859-16": enc112, - "iso-ir-226": enc112, - "ISO_8859-16:2001": enc112, - "iso_8859-16:2001": enc112, - "ISO_8859-16": enc112, - "iso_8859-16": enc112, - "latin10": enc112, - "l10": enc112, - "csISO885916": enc112, - "csiso885916": enc112, - "GBK": enc113, - "gbk": enc113, - "CP936": enc113, - "cp936": enc113, - "MS936": enc113, - "ms936": enc113, - "windows-936": enc113, - "csGBK": enc113, - "csgbk": enc113, - "GB18030": enc114, - "gb18030": enc114, - "csGB18030": enc114, - "csgb18030": enc114, - "OSD_EBCDIC_DF04_15": enc115, - "osd_ebcdic_df04_15": enc115, - "csOSDEBCDICDF0415": enc115, - "csosdebcdicdf0415": enc115, - "OSD_EBCDIC_DF03_IRV": enc116, - "osd_ebcdic_df03_irv": enc116, - "csOSDEBCDICDF03IRV": enc116, - "csosdebcdicdf03irv": enc116, - "OSD_EBCDIC_DF04_1": enc117, - "osd_ebcdic_df04_1": enc117, - "csOSDEBCDICDF041": enc117, - "csosdebcdicdf041": enc117, - "ISO-11548-1": enc118, - "iso-11548-1": enc118, - "ISO_11548-1": enc118, - "iso_11548-1": enc118, - "ISO_TR_11548-1": enc118, - "iso_tr_11548-1": enc118, - "csISO115481": enc118, - "csiso115481": enc118, - "KZ-1048": enc119, - "kz-1048": enc119, - "STRK1048-2002": enc119, - "strk1048-2002": enc119, - "RK1048": enc119, - "rk1048": enc119, - "csKZ1048": enc119, - "cskz1048": enc119, - "ISO-10646-UCS-2": enc1000, - "iso-10646-ucs-2": enc1000, - "csUnicode": enc1000, - "csunicode": enc1000, - "ISO-10646-UCS-4": enc1001, - "iso-10646-ucs-4": enc1001, - "csUCS4": enc1001, - "csucs4": enc1001, - "ISO-10646-UCS-Basic": enc1002, - "iso-10646-ucs-basic": enc1002, - "csUnicodeASCII": enc1002, - "csunicodeascii": enc1002, - "ISO-10646-Unicode-Latin1": enc1003, - "iso-10646-unicode-latin1": enc1003, - "csUnicodeLatin1": enc1003, - "csunicodelatin1": enc1003, - "ISO-10646": enc1003, - "iso-10646": enc1003, - "ISO-10646-J-1": enc1004, - "iso-10646-j-1": enc1004, - "csUnicodeJapanese": enc1004, - "csunicodejapanese": enc1004, - "ISO-Unicode-IBM-1261": enc1005, - "iso-unicode-ibm-1261": enc1005, - "csUnicodeIBM1261": enc1005, - "csunicodeibm1261": enc1005, - "ISO-Unicode-IBM-1268": enc1006, - "iso-unicode-ibm-1268": enc1006, - "csUnicodeIBM1268": enc1006, - "csunicodeibm1268": enc1006, - "ISO-Unicode-IBM-1276": enc1007, - "iso-unicode-ibm-1276": enc1007, - "csUnicodeIBM1276": enc1007, - "csunicodeibm1276": enc1007, - "ISO-Unicode-IBM-1264": enc1008, - "iso-unicode-ibm-1264": enc1008, - "csUnicodeIBM1264": enc1008, - "csunicodeibm1264": enc1008, - "ISO-Unicode-IBM-1265": enc1009, - "iso-unicode-ibm-1265": enc1009, - "csUnicodeIBM1265": enc1009, - "csunicodeibm1265": enc1009, - "UNICODE-1-1": enc1010, - "unicode-1-1": enc1010, - "csUnicode11": enc1010, - "csunicode11": enc1010, - "SCSU": enc1011, - "scsu": enc1011, - "csSCSU": enc1011, - "csscsu": enc1011, - "UTF-7": enc1012, - "utf-7": enc1012, - "csUTF7": enc1012, - "csutf7": enc1012, - "UTF-16BE": enc1013, - "utf-16be": enc1013, - "csUTF16BE": enc1013, - "csutf16be": enc1013, - "UTF-16LE": enc1014, - "utf-16le": enc1014, - "csUTF16LE": enc1014, - "csutf16le": enc1014, - "UTF-16": enc1015, - "utf-16": enc1015, - "csUTF16": enc1015, - "csutf16": enc1015, - "CESU-8": enc1016, - "cesu-8": enc1016, - "csCESU8": enc1016, - "cscesu8": enc1016, - "csCESU-8": enc1016, - "cscesu-8": enc1016, - "UTF-32": enc1017, - "utf-32": enc1017, - "csUTF32": enc1017, - "csutf32": enc1017, - "UTF-32BE": enc1018, - "utf-32be": enc1018, - "csUTF32BE": enc1018, - "csutf32be": enc1018, - "UTF-32LE": enc1019, - "utf-32le": enc1019, - "csUTF32LE": enc1019, - "csutf32le": enc1019, - "BOCU-1": enc1020, - "bocu-1": enc1020, - "csBOCU1": enc1020, - "csbocu1": enc1020, - "csBOCU-1": enc1020, - "csbocu-1": enc1020, - "ISO-8859-1-Windows-3.0-Latin-1": enc2000, - "iso-8859-1-windows-3.0-latin-1": enc2000, - "csWindows30Latin1": enc2000, - "cswindows30latin1": enc2000, - "ISO-8859-1-Windows-3.1-Latin-1": enc2001, - "iso-8859-1-windows-3.1-latin-1": enc2001, - "csWindows31Latin1": enc2001, - "cswindows31latin1": enc2001, - "ISO-8859-2-Windows-Latin-2": enc2002, - "iso-8859-2-windows-latin-2": enc2002, - "csWindows31Latin2": enc2002, - "cswindows31latin2": enc2002, - "ISO-8859-9-Windows-Latin-5": enc2003, - "iso-8859-9-windows-latin-5": enc2003, - "csWindows31Latin5": enc2003, - "cswindows31latin5": enc2003, - "hp-roman8": enc2004, - "roman8": enc2004, - "r8": enc2004, - "csHPRoman8": enc2004, - "cshproman8": enc2004, - "Adobe-Standard-Encoding": enc2005, - "adobe-standard-encoding": enc2005, - "csAdobeStandardEncoding": enc2005, - "csadobestandardencoding": enc2005, - "Ventura-US": enc2006, - "ventura-us": enc2006, - "csVenturaUS": enc2006, - "csventuraus": enc2006, - "Ventura-International": enc2007, - "ventura-international": enc2007, - "csVenturaInternational": enc2007, - "csventurainternational": enc2007, - "DEC-MCS": enc2008, - "dec-mcs": enc2008, - "dec": enc2008, - "csDECMCS": enc2008, - "csdecmcs": enc2008, - "IBM850": enc2009, - "ibm850": enc2009, - "cp850": enc2009, - "850": enc2009, - "csPC850Multilingual": enc2009, - "cspc850multilingual": enc2009, - "PC8-Danish-Norwegian": enc2012, - "pc8-danish-norwegian": enc2012, - "csPC8DanishNorwegian": enc2012, - "cspc8danishnorwegian": enc2012, - "IBM862": enc2013, - "ibm862": enc2013, - "cp862": enc2013, - "862": enc2013, - "csPC862LatinHebrew": enc2013, - "cspc862latinhebrew": enc2013, - "PC8-Turkish": enc2014, - "pc8-turkish": enc2014, - "csPC8Turkish": enc2014, - "cspc8turkish": enc2014, - "IBM-Symbols": enc2015, - "ibm-symbols": enc2015, - "csIBMSymbols": enc2015, - "csibmsymbols": enc2015, - "IBM-Thai": enc2016, - "ibm-thai": enc2016, - "csIBMThai": enc2016, - "csibmthai": enc2016, - "HP-Legal": enc2017, - "hp-legal": enc2017, - "csHPLegal": enc2017, - "cshplegal": enc2017, - "HP-Pi-font": enc2018, - "hp-pi-font": enc2018, - "csHPPiFont": enc2018, - "cshppifont": enc2018, - "HP-Math8": enc2019, - "hp-math8": enc2019, - "csHPMath8": enc2019, - "cshpmath8": enc2019, - "Adobe-Symbol-Encoding": enc2020, - "adobe-symbol-encoding": enc2020, - "csHPPSMath": enc2020, - "cshppsmath": enc2020, - "HP-DeskTop": enc2021, - "hp-desktop": enc2021, - "csHPDesktop": enc2021, - "cshpdesktop": enc2021, - "Ventura-Math": enc2022, - "ventura-math": enc2022, - "csVenturaMath": enc2022, - "csventuramath": enc2022, - "Microsoft-Publishing": enc2023, - "microsoft-publishing": enc2023, - "csMicrosoftPublishing": enc2023, - "csmicrosoftpublishing": enc2023, - "Windows-31J": enc2024, - "windows-31j": enc2024, - "csWindows31J": enc2024, - "cswindows31j": enc2024, - "GB2312": enc2025, - "gb2312": enc2025, - "csGB2312": enc2025, - "csgb2312": enc2025, - "Big5": enc2026, - "big5": enc2026, - "csBig5": enc2026, - "csbig5": enc2026, - "macintosh": enc2027, - "mac": enc2027, - "csMacintosh": enc2027, - "csmacintosh": enc2027, - "IBM037": enc2028, - "ibm037": enc2028, - "cp037": enc2028, - "ebcdic-cp-us": enc2028, - "ebcdic-cp-ca": enc2028, - "ebcdic-cp-wt": enc2028, - "ebcdic-cp-nl": enc2028, - "csIBM037": enc2028, - "csibm037": enc2028, - "IBM038": enc2029, - "ibm038": enc2029, - "EBCDIC-INT": enc2029, - "ebcdic-int": enc2029, - "cp038": enc2029, - "csIBM038": enc2029, - "csibm038": enc2029, - "IBM273": enc2030, - "ibm273": enc2030, - "CP273": enc2030, - "cp273": enc2030, - "csIBM273": enc2030, - "csibm273": enc2030, - "IBM274": enc2031, - "ibm274": enc2031, - "EBCDIC-BE": enc2031, - "ebcdic-be": enc2031, - "CP274": enc2031, - "cp274": enc2031, - "csIBM274": enc2031, - "csibm274": enc2031, - "IBM275": enc2032, - "ibm275": enc2032, - "EBCDIC-BR": enc2032, - "ebcdic-br": enc2032, - "cp275": enc2032, - "csIBM275": enc2032, - "csibm275": enc2032, - "IBM277": enc2033, - "ibm277": enc2033, - "EBCDIC-CP-DK": enc2033, - "ebcdic-cp-dk": enc2033, - "EBCDIC-CP-NO": enc2033, - "ebcdic-cp-no": enc2033, - "csIBM277": enc2033, - "csibm277": enc2033, - "IBM278": enc2034, - "ibm278": enc2034, - "CP278": enc2034, - "cp278": enc2034, - "ebcdic-cp-fi": enc2034, - "ebcdic-cp-se": enc2034, - "csIBM278": enc2034, - "csibm278": enc2034, - "IBM280": enc2035, - "ibm280": enc2035, - "CP280": enc2035, - "cp280": enc2035, - "ebcdic-cp-it": enc2035, - "csIBM280": enc2035, - "csibm280": enc2035, - "IBM281": enc2036, - "ibm281": enc2036, - "EBCDIC-JP-E": enc2036, - "ebcdic-jp-e": enc2036, - "cp281": enc2036, - "csIBM281": enc2036, - "csibm281": enc2036, - "IBM284": enc2037, - "ibm284": enc2037, - "CP284": enc2037, - "cp284": enc2037, - "ebcdic-cp-es": enc2037, - "csIBM284": enc2037, - "csibm284": enc2037, - "IBM285": enc2038, - "ibm285": enc2038, - "CP285": enc2038, - "cp285": enc2038, - "ebcdic-cp-gb": enc2038, - "csIBM285": enc2038, - "csibm285": enc2038, - "IBM290": enc2039, - "ibm290": enc2039, - "cp290": enc2039, - "EBCDIC-JP-kana": enc2039, - "ebcdic-jp-kana": enc2039, - "csIBM290": enc2039, - "csibm290": enc2039, - "IBM297": enc2040, - "ibm297": enc2040, - "cp297": enc2040, - "ebcdic-cp-fr": enc2040, - "csIBM297": enc2040, - "csibm297": enc2040, - "IBM420": enc2041, - "ibm420": enc2041, - "cp420": enc2041, - "ebcdic-cp-ar1": enc2041, - "csIBM420": enc2041, - "csibm420": enc2041, - "IBM423": enc2042, - "ibm423": enc2042, - "cp423": enc2042, - "ebcdic-cp-gr": enc2042, - "csIBM423": enc2042, - "csibm423": enc2042, - "IBM424": enc2043, - "ibm424": enc2043, - "cp424": enc2043, - "ebcdic-cp-he": enc2043, - "csIBM424": enc2043, - "csibm424": enc2043, - "IBM437": enc2011, - "ibm437": enc2011, - "cp437": enc2011, - "437": enc2011, - "csPC8CodePage437": enc2011, - "cspc8codepage437": enc2011, - "IBM500": enc2044, - "ibm500": enc2044, - "CP500": enc2044, - "cp500": enc2044, - "ebcdic-cp-be": enc2044, - "ebcdic-cp-ch": enc2044, - "csIBM500": enc2044, - "csibm500": enc2044, - "IBM851": enc2045, - "ibm851": enc2045, - "cp851": enc2045, - "851": enc2045, - "csIBM851": enc2045, - "csibm851": enc2045, - "IBM852": enc2010, - "ibm852": enc2010, - "cp852": enc2010, - "852": enc2010, - "csPCp852": enc2010, - "cspcp852": enc2010, - "IBM855": enc2046, - "ibm855": enc2046, - "cp855": enc2046, - "855": enc2046, - "csIBM855": enc2046, - "csibm855": enc2046, - "IBM857": enc2047, - "ibm857": enc2047, - "cp857": enc2047, - "857": enc2047, - "csIBM857": enc2047, - "csibm857": enc2047, - "IBM860": enc2048, - "ibm860": enc2048, - "cp860": enc2048, - "860": enc2048, - "csIBM860": enc2048, - "csibm860": enc2048, - "IBM861": enc2049, - "ibm861": enc2049, - "cp861": enc2049, - "861": enc2049, - "cp-is": enc2049, - "csIBM861": enc2049, - "csibm861": enc2049, - "IBM863": enc2050, - "ibm863": enc2050, - "cp863": enc2050, - "863": enc2050, - "csIBM863": enc2050, - "csibm863": enc2050, - "IBM864": enc2051, - "ibm864": enc2051, - "cp864": enc2051, - "csIBM864": enc2051, - "csibm864": enc2051, - "IBM865": enc2052, - "ibm865": enc2052, - "cp865": enc2052, - "865": enc2052, - "csIBM865": enc2052, - "csibm865": enc2052, - "IBM868": enc2053, - "ibm868": enc2053, - "CP868": enc2053, - "cp868": enc2053, - "cp-ar": enc2053, - "csIBM868": enc2053, - "csibm868": enc2053, - "IBM869": enc2054, - "ibm869": enc2054, - "cp869": enc2054, - "869": enc2054, - "cp-gr": enc2054, - "csIBM869": enc2054, - "csibm869": enc2054, - "IBM870": enc2055, - "ibm870": enc2055, - "CP870": enc2055, - "cp870": enc2055, - "ebcdic-cp-roece": enc2055, - "ebcdic-cp-yu": enc2055, - "csIBM870": enc2055, - "csibm870": enc2055, - "IBM871": enc2056, - "ibm871": enc2056, - "CP871": enc2056, - "cp871": enc2056, - "ebcdic-cp-is": enc2056, - "csIBM871": enc2056, - "csibm871": enc2056, - "IBM880": enc2057, - "ibm880": enc2057, - "cp880": enc2057, - "EBCDIC-Cyrillic": enc2057, - "ebcdic-cyrillic": enc2057, - "csIBM880": enc2057, - "csibm880": enc2057, - "IBM891": enc2058, - "ibm891": enc2058, - "cp891": enc2058, - "csIBM891": enc2058, - "csibm891": enc2058, - "IBM903": enc2059, - "ibm903": enc2059, - "cp903": enc2059, - "csIBM903": enc2059, - "csibm903": enc2059, - "IBM904": enc2060, - "ibm904": enc2060, - "cp904": enc2060, - "904": enc2060, - "csIBBM904": enc2060, - "csibbm904": enc2060, - "IBM905": enc2061, - "ibm905": enc2061, - "CP905": enc2061, - "cp905": enc2061, - "ebcdic-cp-tr": enc2061, - "csIBM905": enc2061, - "csibm905": enc2061, - "IBM918": enc2062, - "ibm918": enc2062, - "CP918": enc2062, - "cp918": enc2062, - "ebcdic-cp-ar2": enc2062, - "csIBM918": enc2062, - "csibm918": enc2062, - "IBM1026": enc2063, - "ibm1026": enc2063, - "CP1026": enc2063, - "cp1026": enc2063, - "csIBM1026": enc2063, - "csibm1026": enc2063, - "EBCDIC-AT-DE": enc2064, - "ebcdic-at-de": enc2064, - "csIBMEBCDICATDE": enc2064, - "csibmebcdicatde": enc2064, - "EBCDIC-AT-DE-A": enc2065, - "ebcdic-at-de-a": enc2065, - "csEBCDICATDEA": enc2065, - "csebcdicatdea": enc2065, - "EBCDIC-CA-FR": enc2066, - "ebcdic-ca-fr": enc2066, - "csEBCDICCAFR": enc2066, - "csebcdiccafr": enc2066, - "EBCDIC-DK-NO": enc2067, - "ebcdic-dk-no": enc2067, - "csEBCDICDKNO": enc2067, - "csebcdicdkno": enc2067, - "EBCDIC-DK-NO-A": enc2068, - "ebcdic-dk-no-a": enc2068, - "csEBCDICDKNOA": enc2068, - "csebcdicdknoa": enc2068, - "EBCDIC-FI-SE": enc2069, - "ebcdic-fi-se": enc2069, - "csEBCDICFISE": enc2069, - "csebcdicfise": enc2069, - "EBCDIC-FI-SE-A": enc2070, - "ebcdic-fi-se-a": enc2070, - "csEBCDICFISEA": enc2070, - "csebcdicfisea": enc2070, - "EBCDIC-FR": enc2071, - "ebcdic-fr": enc2071, - "csEBCDICFR": enc2071, - "csebcdicfr": enc2071, - "EBCDIC-IT": enc2072, - "ebcdic-it": enc2072, - "csEBCDICIT": enc2072, - "csebcdicit": enc2072, - "EBCDIC-PT": enc2073, - "ebcdic-pt": enc2073, - "csEBCDICPT": enc2073, - "csebcdicpt": enc2073, - "EBCDIC-ES": enc2074, - "ebcdic-es": enc2074, - "csEBCDICES": enc2074, - "csebcdices": enc2074, - "EBCDIC-ES-A": enc2075, - "ebcdic-es-a": enc2075, - "csEBCDICESA": enc2075, - "csebcdicesa": enc2075, - "EBCDIC-ES-S": enc2076, - "ebcdic-es-s": enc2076, - "csEBCDICESS": enc2076, - "csebcdicess": enc2076, - "EBCDIC-UK": enc2077, - "ebcdic-uk": enc2077, - "csEBCDICUK": enc2077, - "csebcdicuk": enc2077, - "EBCDIC-US": enc2078, - "ebcdic-us": enc2078, - "csEBCDICUS": enc2078, - "csebcdicus": enc2078, - "UNKNOWN-8BIT": enc2079, - "unknown-8bit": enc2079, - "csUnknown8BiT": enc2079, - "csunknown8bit": enc2079, - "MNEMONIC": enc2080, - "mnemonic": enc2080, - "csMnemonic": enc2080, - "csmnemonic": enc2080, - "MNEM": enc2081, - "mnem": enc2081, - "csMnem": enc2081, - "csmnem": enc2081, - "VISCII": enc2082, - "viscii": enc2082, - "csVISCII": enc2082, - "csviscii": enc2082, - "VIQR": enc2083, - "viqr": enc2083, - "csVIQR": enc2083, - "csviqr": enc2083, - "KOI8-R": enc2084, - "koi8-r": enc2084, - "csKOI8R": enc2084, - "cskoi8r": enc2084, - "HZ-GB-2312": enc2085, - "hz-gb-2312": enc2085, - "IBM866": enc2086, - "ibm866": enc2086, - "cp866": enc2086, - "866": enc2086, - "csIBM866": enc2086, - "csibm866": enc2086, - "IBM775": enc2087, - "ibm775": enc2087, - "cp775": enc2087, - "csPC775Baltic": enc2087, - "cspc775baltic": enc2087, - "KOI8-U": enc2088, - "koi8-u": enc2088, - "csKOI8U": enc2088, - "cskoi8u": enc2088, - "IBM00858": enc2089, - "ibm00858": enc2089, - "CCSID00858": enc2089, - "ccsid00858": enc2089, - "CP00858": enc2089, - "cp00858": enc2089, - "PC-Multilingual-850+euro": enc2089, - "pc-multilingual-850+euro": enc2089, - "csIBM00858": enc2089, - "csibm00858": enc2089, - "IBM00924": enc2090, - "ibm00924": enc2090, - "CCSID00924": enc2090, - "ccsid00924": enc2090, - "CP00924": enc2090, - "cp00924": enc2090, - "ebcdic-Latin9--euro": enc2090, - "ebcdic-latin9--euro": enc2090, - "csIBM00924": enc2090, - "csibm00924": enc2090, - "IBM01140": enc2091, - "ibm01140": enc2091, - "CCSID01140": enc2091, - "ccsid01140": enc2091, - "CP01140": enc2091, - "cp01140": enc2091, - "ebcdic-us-37+euro": enc2091, - "csIBM01140": enc2091, - "csibm01140": enc2091, - "IBM01141": enc2092, - "ibm01141": enc2092, - "CCSID01141": enc2092, - "ccsid01141": enc2092, - "CP01141": enc2092, - "cp01141": enc2092, - "ebcdic-de-273+euro": enc2092, - "csIBM01141": enc2092, - "csibm01141": enc2092, - "IBM01142": enc2093, - "ibm01142": enc2093, - "CCSID01142": enc2093, - "ccsid01142": enc2093, - "CP01142": enc2093, - "cp01142": enc2093, - "ebcdic-dk-277+euro": enc2093, - "ebcdic-no-277+euro": enc2093, - "csIBM01142": enc2093, - "csibm01142": enc2093, - "IBM01143": enc2094, - "ibm01143": enc2094, - "CCSID01143": enc2094, - "ccsid01143": enc2094, - "CP01143": enc2094, - "cp01143": enc2094, - "ebcdic-fi-278+euro": enc2094, - "ebcdic-se-278+euro": enc2094, - "csIBM01143": enc2094, - "csibm01143": enc2094, - "IBM01144": enc2095, - "ibm01144": enc2095, - "CCSID01144": enc2095, - "ccsid01144": enc2095, - "CP01144": enc2095, - "cp01144": enc2095, - "ebcdic-it-280+euro": enc2095, - "csIBM01144": enc2095, - "csibm01144": enc2095, - "IBM01145": enc2096, - "ibm01145": enc2096, - "CCSID01145": enc2096, - "ccsid01145": enc2096, - "CP01145": enc2096, - "cp01145": enc2096, - "ebcdic-es-284+euro": enc2096, - "csIBM01145": enc2096, - "csibm01145": enc2096, - "IBM01146": enc2097, - "ibm01146": enc2097, - "CCSID01146": enc2097, - "ccsid01146": enc2097, - "CP01146": enc2097, - "cp01146": enc2097, - "ebcdic-gb-285+euro": enc2097, - "csIBM01146": enc2097, - "csibm01146": enc2097, - "IBM01147": enc2098, - "ibm01147": enc2098, - "CCSID01147": enc2098, - "ccsid01147": enc2098, - "CP01147": enc2098, - "cp01147": enc2098, - "ebcdic-fr-297+euro": enc2098, - "csIBM01147": enc2098, - "csibm01147": enc2098, - "IBM01148": enc2099, - "ibm01148": enc2099, - "CCSID01148": enc2099, - "ccsid01148": enc2099, - "CP01148": enc2099, - "cp01148": enc2099, - "ebcdic-international-500+euro": enc2099, - "csIBM01148": enc2099, - "csibm01148": enc2099, - "IBM01149": enc2100, - "ibm01149": enc2100, - "CCSID01149": enc2100, - "ccsid01149": enc2100, - "CP01149": enc2100, - "cp01149": enc2100, - "ebcdic-is-871+euro": enc2100, - "csIBM01149": enc2100, - "csibm01149": enc2100, - "Big5-HKSCS": enc2101, - "big5-hkscs": enc2101, - "csBig5HKSCS": enc2101, - "csbig5hkscs": enc2101, - "IBM1047": enc2102, - "ibm1047": enc2102, - "IBM-1047": enc2102, - "ibm-1047": enc2102, - "csIBM1047": enc2102, - "csibm1047": enc2102, - "PTCP154": enc2103, - "ptcp154": enc2103, - "csPTCP154": enc2103, - "csptcp154": enc2103, - "PT154": enc2103, - "pt154": enc2103, - "CP154": enc2103, - "cp154": enc2103, - "Cyrillic-Asian": enc2103, - "cyrillic-asian": enc2103, - "Amiga-1251": enc2104, - "amiga-1251": enc2104, - "Ami1251": enc2104, - "ami1251": enc2104, - "Amiga1251": enc2104, - "amiga1251": enc2104, - "Ami-1251": enc2104, - "ami-1251": enc2104, - "csAmiga1251\n(Aliases": enc2104, - "csamiga1251\n(aliases": enc2104, - "KOI7-switched": enc2105, - "koi7-switched": enc2105, - "csKOI7switched": enc2105, - "cskoi7switched": enc2105, - "BRF": enc2106, - "brf": enc2106, - "csBRF": enc2106, - "csbrf": enc2106, - "TSCII": enc2107, - "tscii": enc2107, - "csTSCII": enc2107, - "cstscii": enc2107, - "CP51932": enc2108, - "cp51932": enc2108, - "csCP51932": enc2108, - "cscp51932": enc2108, - "windows-874": enc2109, - "cswindows874": enc2109, - "windows-1250": enc2250, - "cswindows1250": enc2250, - "windows-1251": enc2251, - "cswindows1251": enc2251, - "windows-1252": enc2252, - "cswindows1252": enc2252, - "windows-1253": enc2253, - "cswindows1253": enc2253, - "windows-1254": enc2254, - "cswindows1254": enc2254, - "windows-1255": enc2255, - "cswindows1255": enc2255, - "windows-1256": enc2256, - "cswindows1256": enc2256, - "windows-1257": enc2257, - "cswindows1257": enc2257, - "windows-1258": enc2258, - "cswindows1258": enc2258, - "TIS-620": enc2259, - "tis-620": enc2259, - "csTIS620": enc2259, - "cstis620": enc2259, - "ISO-8859-11": enc2259, - "iso-8859-11": enc2259, - "CP50220": enc2260, - "cp50220": enc2260, - "csCP50220": enc2260, - "cscp50220": enc2260, -} - -// Total table size 14402 bytes (14KiB); checksum: CEBAA10C diff --git a/vendor/golang.org/x/text/encoding/internal/enctest/enctest.go b/vendor/golang.org/x/text/encoding/internal/enctest/enctest.go deleted file mode 100644 index 0cccae044..000000000 --- a/vendor/golang.org/x/text/encoding/internal/enctest/enctest.go +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package enctest - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "strings" - "testing" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/transform" -) - -// Encoder or Decoder -type Transcoder interface { - transform.Transformer - Bytes([]byte) ([]byte, error) - String(string) (string, error) -} - -func TestEncoding(t *testing.T, e encoding.Encoding, encoded, utf8, prefix, suffix string) { - for _, direction := range []string{"Decode", "Encode"} { - t.Run(fmt.Sprintf("%v/%s", e, direction), func(t *testing.T) { - - var coder Transcoder - var want, src, wPrefix, sPrefix, wSuffix, sSuffix string - if direction == "Decode" { - coder, want, src = e.NewDecoder(), utf8, encoded - wPrefix, sPrefix, wSuffix, sSuffix = "", prefix, "", suffix - } else { - coder, want, src = e.NewEncoder(), encoded, utf8 - wPrefix, sPrefix, wSuffix, sSuffix = prefix, "", suffix, "" - } - - dst := make([]byte, len(wPrefix)+len(want)+len(wSuffix)) - nDst, nSrc, err := coder.Transform(dst, []byte(sPrefix+src+sSuffix), true) - if err != nil { - t.Fatal(err) - } - if nDst != len(wPrefix)+len(want)+len(wSuffix) { - t.Fatalf("nDst got %d, want %d", - nDst, len(wPrefix)+len(want)+len(wSuffix)) - } - if nSrc != len(sPrefix)+len(src)+len(sSuffix) { - t.Fatalf("nSrc got %d, want %d", - nSrc, len(sPrefix)+len(src)+len(sSuffix)) - } - if got := string(dst); got != wPrefix+want+wSuffix { - t.Fatalf("\ngot %q\nwant %q", got, wPrefix+want+wSuffix) - } - - for _, n := range []int{0, 1, 2, 10, 123, 4567} { - input := sPrefix + strings.Repeat(src, n) + sSuffix - g, err := coder.String(input) - if err != nil { - t.Fatalf("Bytes: n=%d: %v", n, err) - } - if len(g) == 0 && len(input) == 0 { - // If the input is empty then the output can be empty, - // regardless of whatever wPrefix is. - continue - } - got1, want1 := string(g), wPrefix+strings.Repeat(want, n)+wSuffix - if got1 != want1 { - t.Fatalf("ReadAll: n=%d\ngot %q\nwant %q", - n, trim(got1), trim(want1)) - } - } - }) - } -} - -func TestFile(t *testing.T, e encoding.Encoding) { - for _, dir := range []string{"Decode", "Encode"} { - t.Run(fmt.Sprintf("%s/%s", e, dir), func(t *testing.T) { - dst, src, transformer, err := load(dir, e) - if err != nil { - t.Fatalf("load: %v", err) - } - buf, err := transformer.Bytes(src) - if err != nil { - t.Fatalf("transform: %v", err) - } - if !bytes.Equal(buf, dst) { - t.Error("transformed bytes did not match golden file") - } - }) - } -} - -func Benchmark(b *testing.B, enc encoding.Encoding) { - for _, direction := range []string{"Decode", "Encode"} { - b.Run(fmt.Sprintf("%s/%s", enc, direction), func(b *testing.B) { - _, src, transformer, err := load(direction, enc) - if err != nil { - b.Fatal(err) - } - b.SetBytes(int64(len(src))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - r := transform.NewReader(bytes.NewReader(src), transformer) - io.Copy(ioutil.Discard, r) - } - }) - } -} - -// testdataFiles are files in testdata/*.txt. -var testdataFiles = []struct { - mib identifier.MIB - basename, ext string -}{ - {identifier.Windows1252, "candide", "windows-1252"}, - {identifier.EUCPkdFmtJapanese, "rashomon", "euc-jp"}, - {identifier.ISO2022JP, "rashomon", "iso-2022-jp"}, - {identifier.ShiftJIS, "rashomon", "shift-jis"}, - {identifier.EUCKR, "unsu-joh-eun-nal", "euc-kr"}, - {identifier.GBK, "sunzi-bingfa-simplified", "gbk"}, - {identifier.HZGB2312, "sunzi-bingfa-gb-levels-1-and-2", "hz-gb2312"}, - {identifier.Big5, "sunzi-bingfa-traditional", "big5"}, - {identifier.UTF16LE, "candide", "utf-16le"}, - {identifier.UTF8, "candide", "utf-8"}, - {identifier.UTF32BE, "candide", "utf-32be"}, - - // GB18030 is a superset of GBK and is nominally a Simplified Chinese - // encoding, but it can also represent the entire Basic Multilingual - // Plane, including codepoints like 'â' that aren't encodable by GBK. - // GB18030 on Simplified Chinese should perform similarly to GBK on - // Simplified Chinese. GB18030 on "candide" is more interesting. - {identifier.GB18030, "candide", "gb18030"}, -} - -func load(direction string, enc encoding.Encoding) ([]byte, []byte, Transcoder, error) { - basename, ext, count := "", "", 0 - for _, tf := range testdataFiles { - if mib, _ := enc.(identifier.Interface).ID(); tf.mib == mib { - basename, ext = tf.basename, tf.ext - count++ - } - } - if count != 1 { - if count == 0 { - return nil, nil, nil, fmt.Errorf("no testdataFiles for %s", enc) - } - return nil, nil, nil, fmt.Errorf("too many testdataFiles for %s", enc) - } - dstFile := fmt.Sprintf("../testdata/%s-%s.txt", basename, ext) - srcFile := fmt.Sprintf("../testdata/%s-utf-8.txt", basename) - var coder Transcoder = encoding.ReplaceUnsupported(enc.NewEncoder()) - if direction == "Decode" { - dstFile, srcFile = srcFile, dstFile - coder = enc.NewDecoder() - } - dst, err := ioutil.ReadFile(dstFile) - if err != nil { - if dst, err = ioutil.ReadFile("../" + dstFile); err != nil { - return nil, nil, nil, err - } - } - src, err := ioutil.ReadFile(srcFile) - if err != nil { - if src, err = ioutil.ReadFile("../" + srcFile); err != nil { - return nil, nil, nil, err - } - } - return dst, src, coder, nil -} - -func trim(s string) string { - if len(s) < 120 { - return s - } - return s[:50] + "..." + s[len(s)-50:] -} diff --git a/vendor/golang.org/x/text/encoding/testdata/candide-gb18030.txt b/vendor/golang.org/x/text/encoding/testdata/candide-gb18030.txt deleted file mode 100644 index bd7a57227..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/candide-gb18030.txt +++ /dev/null @@ -1,510 +0,0 @@ -This file was derived from -http://www.gutenberg.org/cache/epub/4650/pg4650.txt --------- - - CANDIDE, - - ou - - L'OPTIMISME, - - TRADUIT DE L'ALLEMAND - - DE M. LE DOCTEUR RALPH, - - AVEC LES ADDITIONS - - QU'ON A TROUV07ES DANS LA POCHE DU DOCTEUR, LORSQU'IL MOURUT - - 08 MINDEN, L'AN DE GR00CE 1759 - - 1759 - - - -CHAPITRE I. - -Comment Candide fut lev dans un beau ch09teau, et comment il fut -chass d'icelui. - -Il y avait en Vestphalie, dans le ch09teau de M. le baron de -Thunder-ten-tronckh, un jeune gar04on qui la nature avait donn -les moeurs les plus douces. Sa physionomie annon04ait son 09me. -Il avait le jugement assez droit, avec l'esprit le plus simple; -c'est, je crois, pour cette raison qu'on le nommait Candide. Les -anciens domestiques de la maison soup04onnaient qu'il tait fils -de la soeur de monsieur le baron et d'un bon et honnte -gentilhomme du voisinage, que cette demoiselle ne voulut jamais -pouser parce qu'il n'avait pu prouver que soixante et onze -quartiers, et que le reste de son arbre gnalogique avait t -perdu par l'injure du temps. - -Monsieur le baron tait un des plus puissants seigneurs de la -Westphalie, car son ch09teau avait une porte et des fentres. Sa -grande salle mme tait orne d'une tapisserie. Tous les chiens -de ses basses-cours composaient une meute dans le besoin; ses -palefreniers taient ses piqueurs; le vicaire du village tait -son grand-aum00nier. Ils l'appelaient tous monseigneur, et ils -riaient quand il fesait des contes. - -Madame la baronne, qui pesait environ trois cent cinquante -livres, s'attirait par l une trs grande considration, et -fesait les honneurs de la maison avec une dignit qui la rendait -encore plus respectable. Sa fille Cungonde, 09ge de dix-sept -ans, tait haute en couleur, fra06che, grasse, apptissante. Le -fils du baron paraissait en tout digne de son pre. Le -prcepteur Pangloss[1] tait l'oracle de la maison, et le petit -Candide coutait ses le04ons avec toute la bonne foi de son 09ge et -de son caractre. - - [1] De _pan_, tout, et _glossa_, langue. B. - - -Pangloss enseignait la mtaphysico-thologo-cosmolonigologie. Il -prouvait admirablement qu'il n'y a point d'effet sans cause, et -que, dans ce meilleur des mondes possibles, le ch09teau de -monseigneur le baron tait le plus beau des ch09teaux, et madame -la meilleure des baronnes possibles. - -Il est dmontr, disait-il, que les choses ne peuvent tre -autrement; car tout tant fait pour une fin, tout est -ncessairement pour la meilleure fin. Remarquez bien que les nez -ont t faits pour porter des lunettes; aussi avons-nous des -lunettes[2]. Les jambes sont visiblement institues pour tre -chausses, et nous avons des chausses. Les pierres ont t -formes pour tre tailles et pour en faire des ch09teaux; aussi -monseigneur a un trs beau ch09teau: le plus grand baron de la -province doit tre le mieux log; et les cochons tant faits pour -tre mangs, nous mangeons du porc toute l'anne: par consquent, -ceux qui ont avanc que tout est bien ont dit une sottise; il -fallait dire que tout est au mieux. - - [2] Voyez tome XXVII, page 528; et dans les _Mlanges_, anne - 1738, le chapitre XI de la troisime partie des _07lments de la - philosophie de Newton_; et anne 1768, le chapitre X des - _Singularits de la nature_. B. - - -Candide coutait attentivement, et croyait innocemment; car il -trouvait mademoiselle Cungonde extrmement belle, quoiqu'il ne -pr06t jamais la hardiesse de le lui dire. Il concluait qu'aprs -le bonheur d'tre n baron de Thunder-ten-tronckh, le second -degr de bonheur tait d'tre mademoiselle Cungonde; le -troisime, de la voir tous les jours; et le quatrime, d'entendre -ma06tre Pangloss, le plus grand philosophe de la province, et par -consquent de toute la terre. - -Un jour Cungonde, en se promenant auprs du ch09teau, dans le -petit bois qu'on appelait parc, vit entre des broussailles le -docteur Pangloss qui donnait une le04on de physique exprimentale - la femme de chambre de sa mre, petite brune trs jolie et trs -docile. Comme mademoiselle Cungonde avait beaucoup de -disposition pour les sciences, elle observa, sans souffler, les -expriences ritres dont elle fut tmoin; elle vit clairement -la raison suffisante du docteur, les effets et les causes, et -s'en retourna tout agite, toute pensive, toute remplie du dsir -d'tre savante, songeant qu'elle pourrait bien tre la raison -suffisante du jeune Candide, qui pouvait aussi tre la sienne. - -Elle rencontra Candide en revenant au ch09teau, et rougit: Candide -rougit aussi . Elle lui dit bonjour d'une voix entrecoupe; et -Candide lui parla sans savoir ce qu'il disait. Le lendemain, -aprs le d06ner, comme on sortait de table, Cungonde et Candide -se trouvrent derrire un paravent; Cungonde laissa tomber son -mouchoir, Candide le ramassa; elle lui prit innocemment la main; -le jeune homme baisa innocemment la main de la jeune demoiselle -avec une vivacit, une sensibilit, une gr09ce toute particulire; -leurs bouches se rencontrrent, leurs yeux s'enflammrent, leurs -genoux tremblrent, leurs mains s'garrent. M. le baron de -Thunder-ten-tronckh passa auprs du paravent, et voyant cette -cause et cet effet, chassa Candide du ch09teau grands coups de -pied dans le derrire. Cungonde s'vanouit: elle fut soufflete -par madame la baronne ds qu'elle fut revenue elle-mme; et -tout fut constern dans le plus beau et le plus agrable des -ch09teaux possibles. - - - -CHAPITRE II - -Ce que devint Candide parmi les Bulgares. - - -Candide, chass du paradis terrestre, marcha longtemps sans -savoir o, pleurant, levant les yeux au ciel, les tournant -souvent vers le plus beau des ch09teaux qui renfermait la plus -belle des baronnettes; il se coucha sans souper au milieu des -champs entre deux sillons; la neige tombait gros flocons. -Candide, tout transi, se tra06na le lendemain vers la ville -voisine, qui s'appelle _Valdberghoff-trarbk-dikdorff_, n'ayant -point d'argent, mourant de faim et de lassitude. Il s'arrta -tristement la porte d'un cabaret. Deux hommes habills de bleu -le remarqurent: Camarade, dit l'un, voil un jeune homme trs -bien fait, et qui a la taille requise; ils s'avancrent vers -Candide et le prirent d06ner trs civilement.--Messieurs, leur -dit Candide avec une modestie charmante, vous me faites beaucoup -d'honneur, mais je n'ai pas de quoi payer mon cot.--Ah! -monsieur, lui dit un des bleus, les personnes de votre figure et -de votre mrite ne paient jamais rien: n'avez-vous pas cinq pieds -cinq pouces de haut?--Oui, messieurs, c'est ma taille, dit-il en -fesant la rvrence.--Ah! monsieur, mettez-vous table; non -seulement nous vous dfraierons, mais nous ne souffrirons jamais -qu'un homme comme vous manque d'argent; les hommes ne sont faits -que pour se secourir les uns les autres.--Vous avez raison, dit -Candide; c'est ce que M. Pangloss m'a toujours dit, et je vois -bien que tout est au mieux. On le prie d'accepter quelques cus, -il les prend et veut faire son billet; on n'en veut point, on se -met table. N'aimez-vous pas tendrement?....--Oh! oui, -rpond-il, j'aime tendrement mademoiselle Cungonde.--Non, dit -l'un de ces messieurs, nous vous demandons si vous n'aimez pas -tendrement le roi des Bulgares?--Point du tout, dit-il, car je ne -l'ai jamais vu.--Comment! c'est le plus charmant des rois, et il -faut boire sa sant.--Oh! trs volontiers, messieurs. Et il -boit. C'en est assez, lui dit-on, vous voil l'appui, le -soutien, le dfenseur, le hros des Bulgares; votre fortune est -faite, et votre gloire est assure. On lui met sur-le-champ les -fers aux pieds, et on le mne au rgiment. On le fait tourner -droite, gauche, hausser la baguette, remettre la baguette, -coucher en joue, tirer, doubler le pas, et on lui donne trente -coups de b09ton; le lendemain, il fait l'exercice un peu moins -mal, et il ne re04oit que vingt coups; le surlendemain, on ne lui -en donne que dix, et il est regard par ses camarades comme un -prodige. - -Candide, tout stupfait, ne dmlait pas encore trop bien comment -il tait un hros. Il s'avisa un beau jour de printemps de -s'aller promener, marchant tout droit devant lui, croyant que -c'tait un privilge de l'espce humaine, comme de l'espce -animale, de se servir de ses jambes son plaisir. Il n'eut pas -fait deux lieues que voil quatre autres hros de six pieds qui -l'atteignent, qui le lient, qui le mnent dans un cachot. On lui -demanda juridiquement ce qu'il aimait le mieux d'tre fustig -trente-six fois par tout le rgiment, ou de recevoir -la-fois -douze balles de plomb dans la cervelle. Il eut beau dire que les -volonts sont libres, et qu'il ne voulait ni l'un ni l'autre, il -fallut faire un choix; il se dtermina, en vertu du don de Dieu -qu'on nomme _libert_, passer trente-six fois par les -baguettes; il essuya deux promenades. Le rgiment tait compos -de deux mille hommes; cela lui composa quatre mille coups de -baguette, qui, depuis la nuque du cou jusqu'au cul, lui -dcouvrirent les muscles et les nerfs. Comme on allait procder - la troisime course, Candide, n'en pouvant plus, demanda en -gr09ce qu'on voul04t bien avoir la bont de lui casser la tte; il -obtint cette faveur; on lui bande les yeux; on le fait mettre -genoux. Le roi des Bulgares passe dans ce moment, s'informe du -crime du patient; et comme ce roi avait un grand gnie, il -comprit, par tout ce qu'il apprit de Candide, que c'tait un -jeune mtaphysicien fort ignorant des choses de ce monde, et il -lui accorda sa gr09ce avec une clmence qui sera loue dans tous -les journaux et dans tous les sicles. Un brave chirurgien -gurit Candide en trois semaines avec les mollients enseigns -par Dioscoride. Il avait dj un peu de peau et pouvait marcher, -quand le roi des Bulgares livra bataille au roi des Abares. - - - -CHAPITRE III. - -Comment Candide se sauva d'entre les Bulgares, et ce qu'il -devint. - - -Rien n'tait si beau, si leste, si brillant, si bien ordonn que -les deux armes. Les trompettes, les fifres, les hautbois, les -tambours, les canons; formaient une harmonie telle qu'il n'y en -eut jamais en enfer. Les canons renversrent d'abord peu prs -six mille hommes de chaque c00t; ensuite la mousqueterie 00ta du -meilleur des mondes environ neuf dix mille coquins qui en -infectaient la surface. La ba07onnette fut aussi la raison -suffisante de la mort de quelques milliers d'hommes. Le tout -pouvait bien se monter une trentaine de mille 09mes. Candide, -qui tremblait comme un philosophe, se cacha du mieux qu'il put -pendant cette boucherie hro07que. - -Enfin, tandis que les deux rois fesaient chanter des _Te Deum_, -chacun dans son camp, il prit le parti d'aller raisonner ailleurs -des effets et des causes. Il passa par-dessus des tas de morts -et de mourants, et gagna d'abord un village voisin; il tait en -cendres: c'tait un village abare que les Bulgares avaient br04l, -selon les lois du droit public. Ici des vieillards cribls de -coups regardaient mourir leurs femmes gorges, qui tenaient -leurs enfants leurs mamelles sanglantes; l des filles -ventres aprs avoir assouvi les besoins naturels de quelques -hros, rendaient les derniers soupirs; d'autres demi br04les -criaient qu'on achev09t de leur donner la mort. Des cervelles -taient rpandues sur la terre c00t de bras et de jambes -coups. - -Candide s'enfuit au plus vite dans un autre village: il -appartenait des Bulgares, et les hros abares l'avaient trait -de mme. Candide, toujours marchant sur des membres palpitants -ou travers des ruines, arriva enfin hors du th09tre de la -guerre, portant quelques petites provisions dans son bissac, et -n'oubliant jamais mademoiselle Cungonde. Ses provisions lui -manqurent quand il fut en Hollande; mais ayant entendu dire que -tout le monde tait riche dans ce pays-l, et qu'on y tait -chrtien, il ne douta pas qu'on ne le trait09t aussi bien qu'il -l'avait t dans le ch09teau de M. le baron, avant qu'il en e04t -t chass pour les beaux yeux de mademoiselle Cungonde. - -Il demanda l'aum00ne plusieurs graves personnages, qui lui -rpondirent tous que, s'il continuait faire ce mtier, on -l'enfermerait dans une maison de correction pour lui apprendre -vivre. - -Il s'adressa ensuite un homme qui venait de parler tout seul -une heure de suite sur la charit dans une grande assemble. Cet -orateur le regardant de travers lui dit: Que venez-vous faire -ici? y tes-vous pour la bonne cause? Il n'y a point d'effet sans -cause, rpondit modestement Candide; tout est encha06n -ncessairement et arrang pour le mieux. Il a fallu que je fusse -chass d'auprs de mademoiselle Cungonde, que j'aie pass par -les baguettes, et il faut que je demande mon pain, jusqu' ce que -je puisse en gagner; tout cela ne pouvait tre autrement. Mon -ami, lui dit l'orateur, croyez-vous que le pape soit -l'antechrist? Je ne l'avais pas encore entendu dire, rpondit -Candide: mais qu'il le soit, ou qu'il ne le soit pas, je manque -de pain. Tu ne mrites pas d'en manger, dit l'autre: va, coquin, -va, misrable, ne m'approche de ta vie. La femme de l'orateur -ayant mis la tte la fentre, et avisant un homme qui doutait -que le pape f04t antechrist, lui rpandit sur le chef un -plein..... O ciel! quel excs se porte le zle de la religion -dans les dames! - -Un homme qui n'avait point t baptis, un bon anabaptiste, nomm -Jacques, vit la manire cruelle et ignominieuse dont on traitait -ainsi un de ses frres, un tre deux pieds sans plumes, qui -avait une 09me; il l'amena chez lui, le nettoya, lui donna du pain -et de la bire, lui fit prsent de deux florins, et voulut mme -lui apprendre travailler dans ses manufactures aux toffes de -Perse qu'on fabrique en Hollande. Candide se prosternant presque -devant lui, s'criait: Ma06tre Pangloss me l'avait bien dit que -tout est au mieux dans ce monde, car je suis infiniment plus -touch de votre extrme gnrosit que de la duret de ce -monsieur manteau noir, et de madame son pouse. - -Le lendemain, en se promenant, il rencontra un gueux tout couvert -de pustules, les yeux morts, le bout du nez rong, la bouche de -travers, les dents noires, et parlant de la gorge, tourment -d'une toux violente, et crachant une dent chaque effort. - - - -CHAPITRE IV. - -Comment Candide rencontra son ancien ma06tre de philosophie, le -docteur Pangloss, et ce qui en advint. - - -Candide, plus mu encore de compassion que d'horreur, donna cet -pouvantable gueux les deux florins qu'il avait re04us de son -honnte anabaptiste Jacques. Le fant00me le regarda fixement, -versa des larmes, et sauta son cou. Candide effray recule. -Hlas! dit le misrable l'autre misrable, ne reconnaissez-vous -plus votre cher Pangloss? Qu'entends-je? vous, mon cher ma06tre! -vous, dans cet tat horrible! quel malheur vous est-il donc -arriv? pourquoi n'tes-vous plus dans le plus beau des ch09teaux? -qu'est devenue mademoiselle Cungonde, la perle des filles, le -chef-d'oeuvre de la nature? Je n'en peux plus, dit Pangloss. -Aussit00t Candide le mena dans l'table de l'anabaptiste, o il -lui fit manger un peu de pain; et quand Pangloss fut refait: Eh -bien! lui dit-il, Cungonde? Elle est morte, reprit l'autre. -Candide s'vanouit ce mot: son ami rappela ses sens avec un peu -de mauvais vinaigre qui se trouva par hasard dans l'table. -Candide rouvre les yeux. Cungonde est morte! Ah! meilleur des -mondes, o tes-vous? Mais de quelle maladie est-elle morte? ne -serait-ce point de m'avoir vu chasser du beau ch09teau de monsieur -son pre grands coups de pied? Non, dit Pangloss, elle a t -ventre par des soldats bulgares, aprs avoir t viole autant -qu'on peut l'tre; ils ont cass la tte monsieur le baron qui -voulait la dfendre; madame la baronne a t coupe en morceaux; -mon pauvre pupille trait prcisment comme sa soeur; et quant au -ch09teau, il n'est pas rest pierre sur pierre, pas une grange, -pas un mouton, pas un canard, pas un arbre; mais nous avons t -bien vengs, car les Abares en ont fait autant dans une baronnie -voisine qui appartenait un seigneur bulgare. - -A ce discours, Candide s'vanouit encore; mais revenu soi, et -ayant dit tout ce qu'il devait dire, il s'enquit de la cause et -de l'effet, et de la raison suffisante qui avait mis Pangloss -dans un si piteux tat. Hlas! dit l'autre, c'est l'amour: -l'amour, le consolateur du genre humain, le conservateur de -l'univers, l'09me de tous les tres sensibles, le tendre amour. -Hlas! dit Candide, je l'ai connu cet amour, ce souverain des -coeurs, cette 09me de notre 09me; il ne m'a jamais valu qu'un -baiser et vingt coups de pied au cul. Comment cette belle cause -a-t-elle pu produire en vous un effet si abominable? - -Pangloss rpondit en ces termes: O mon cher Candide! vous avez -connu Paquette, cette jolie suivante de notre auguste baronne: -j'ai go04t dans ses bras les dlices du paradis, qui ont produit -ces tourments d'enfer dont vous me voyez dvor; elle en tait -infecte, elle en est peut-tre morte. Paquette tenait ce -prsent d'un cordelier trs savant qui avait remont la source, -car il l'avait eu d'une vieille comtesse, qui l'avait re04u d'un -capitaine de cavalerie, qui le devait une marquise, qui le -tenait d'un page, qui l'avait re04u d'un jsuite, qui, tant -novice, l'avait eu en droite ligne d'un des compagnons de -Christophe Colomb. Pour moi, je ne le donnerai personne, car -je me meurs. - -O Pangloss! s'cria Candide, voil une trange gnalogie! -n'est-ce pas le diable qui en fut la souche? Point du tout, -rpliqua ce grand homme; c'tait une chose indispensable dans le -meilleur des mondes, un ingrdient ncessaire; car si Colomb -n'avait pas attrap dans une 06le de l'Amrique cette maladie[1] -qui empoisonne la source de la gnration, qui souvent mme -empche la gnration, et qui est videmment l'oppos du grand -but de la nature, nous n'aurions ni le chocolat ni la cochenille; -il faut encore observer que jusqu'aujourd'hui, dans notre -continent, cette maladie nous est particulire, comme la -controverse. Les Turcs, les Indiens, les Persans, les Chinois, -les Siamois, les Japonais, ne la connaissent pas encore; mais il -y a une raison suffisante pour qu'ils la connaissent leur tour -dans quelques sicles. En attendant elle a fait un merveilleux -progrs parmi nous, et surtout dans ces grandes armes composes -d'honntes stipendiaires bien levs, qui dcident du destin des -tats; on peut assurer que, quand trente mille hommes combattent -en bataille range contre des troupes gales en nombre, il y a -environ vingt mille vrols de chaque c00t. - - [1] Voyez tome XXXI, page 7. B. - - -Voil qui est admirable, dit Candide; mais il faut vous faire -gurir. Et comment le puis-je? dit Pangloss; je n'ai pas le sou, -mon ami, et dans toute l'tendue de ce globe on ne peut ni se -faire saigner, ni prendre un lavement sans payer, ou sans qu'il y -ait quelqu'un qui paie pour nous. - -Ce dernier discours dtermina Candide; il alla se jeter aux pieds -de son charitable anabaptiste Jacques, et lui fit une peinture si -touchante de l'tat o son ami tait rduit, que le bon-homme -n'hsita pas recueillir le docteur Pangloss; il le fit gurir -ses dpens. Pangloss, dans la cure, ne perdit qu'un oeil et une -oreille. Il crivait bien, et savait parfaitement -l'arithmtique. L'anabaptiste Jacques en fit son teneur de -livres. Au bout de deux mois, tant oblig d'aller Lisbonne -pour les affaires de son commerce, il mena dans son vaisseau ses -deux philosophes. Pangloss lui expliqua comment tout tait on ne -peut mieux. Jacques n'tait pas de cet avis. Il faut bien, -disait-il, que les hommes aient un peu corrompu la nature, car -ils ne sont point ns loups, et ils sont devenus loups. Dieu ne -leur a donn ni canons de vingt-quatre, ni ba07onnettes, et ils se -sont fait des ba07onnettes et des canons pour se dtruire. Je -pourrais mettre en ligne de compte les banqueroutes, et la -justice qui s'empare des biens des banqueroutiers pour en -frustrer les cranciers. Tout cela tait indispensable, -rpliquait le docteur borgne, et les malheurs particuliers font -le bien gnral; de sorte que plus il y a de malheurs -particuliers, et plus tout est bien. Tandis qu'il raisonnait, -l'air s'obscurcit, les vents soufflrent des quatre coins du -monde, et le vaisseau fut assailli de la plus horrible tempte, -la vue du port de Lisbonne. - - -CHAPITRE V. - -Tempte, naufrage, tremblement de terre, et ce qui advint du -docteur Pangloss, de Candide, et de l'anabaptiste Jacques. - -La moiti des passagers affaiblis, expirants de ces angoisses -inconcevables que le roulis d'un vaisseau porte dans les nerfs et -dans toutes les humeurs du corps agites en sens contraires, -n'avait pas mme la force de s'inquiter du danger. L'autre -moiti jetait des cris et fesait des prires; les voiles taient -dchires, les m09ts briss, le vaisseau entr'ouvert. Travaillait -qui pouvait, personne ne s'entendait, personne ne commandait. -L'anabaptiste aidait un peu la manoeuvre; il tait sur le -tillac; un matelot furieux le frappe rudement et l'tend sur les -planches; mais du coup qu'il lui donna, il eut lui-mme une si -violente secousse, qu'il tomba hors du vaisseau, la tte la -premire. Il restait suspendu et accroch une partie de m09t -rompu. Le bon Jacques court son secours, l'aide remonter, et -de l'effort qu'il fait, il est prcipit dans la mer la vue du -matelot, qui le laissa prir sans daigner seulement le regarder. -Candide approche, voit son bienfaiteur qui repara06t un moment, et -qui est englouti pour jamais. Il veut se jeter aprs lui dans la -mer: le philosophe Pangloss l'en empche, en lui prouvant que la -rade de Lisbonne avait t forme exprs pour que cet anabaptiste -s'y noy09t. Tandis qu'il le prouvait _ priori_, le vaisseau -s'entr'ouvre, tout prit la rserve de Pangloss, de Candide, et -de ce brutal de matelot qui avait noy le vertueux anabaptiste; -le coquin nagea heureusement jusqu'au rivage, o Pangloss et -Candide furent ports sur une planche. - -Quand ils furent revenus un peu eux, ils marchrent vers -Lisbonne; il leur restait quelque argent, avec lequel ils -espraient se sauver de la faim aprs avoir chapp la tempte. - -A peine ont-ils mis le pied dans la ville, en pleurant la mort de -leur bienfaiteur, qu'ils sentent la terre trembler sous leurs -pas[1]; la mer s'lve en bouillonnant dans le port, et brise les -vaisseaux qui sont l'ancre. Des tourbillons de flammes et de -cendres couvrent les rues et les places publiques; les maisons -s'croulent, les toits sont renverss sur les fondements, et les -fondements se dispersent; trente mille habitants de tout 09ge et -de tout sexe sont crass sous des ruines. Le matelot disait en -sifflant et en jurant: il y aura quelque chose gagner ici. -Quelle peut tre la raison suffisante de ce phnomne? disait -Pangloss. Voici le dernier jour du monde! s'criait Candide. -Le matelot court incontinent au milieu des dbris, affronte la -mort pour trouver de l'argent, en trouve, s'en empare, s'enivre, -et ayant cuv son vin, achte les faveurs de la premire fille de -bonne volont qu'il rencontre sur les ruines des maisons -dtruites, et au milieu des mourants et des morts. Pangloss le -tirait cependant par la manche: Mon ami, lui disait-il, cela -n'est pas bien, vous manquez la raison universelle, vous prenez -mal votre temps. Tte et sang, rpondit l'autre, je suis matelot -et n Batavia; j'ai march quatre fois sur le crucifix dans -quatre voyages au Japon[2]; tu as bien trouv ton homme avec ta -raison universelle! - - - [1] Le tremblement de terre de Lisbonne est du 1er novembre 1755. - B. - - [2] Voyez tome XVIII, page 470. B. - - -Quelques clats de pierre avaient bless Candide; il tait tendu -dans la rue et couvert de dbris. Il disait Pangloss: Hlas! -procure-moi un peu de vin et d'huile; je me meurs. Ce -tremblement de terre n'est pas une chose nouvelle, rpondit -Pangloss; la ville de Lima prouva les mmes secousses en -Amrique l'anne passe; mmes causes, mmes effets; il y a -certainement une tra06ne de soufre sous terre depuis Lima jusqu' -Lisbonne. Rien n'est plus probable, dit Candide; mais, pour -Dieu, un peu d'huile et de vin. Comment probable? rpliqua le -philosophe, je soutiens que la chose est dmontre. Candide -perdit connaissance, et Pangloss lui apporta un peu d'eau d'une -fontaine voisine. - -Le lendemain, ayant trouv quelques provisions de bouche en se -glissant travers des dcombres, ils rparrent un peu leurs -forces. Ensuite ils travaillrent comme les autres soulager -les habitants chapps la mort. Quelques citoyens, secourus -par eux, leur donnrent un aussi bon d06ner qu'on le pouvait dans -un tel dsastre: il est vrai que le repas tait triste; les -convives arrosaient leur pain de leurs larmes; mais Pangloss les -consola, en les assurant que les choses ne pouvaient tre -autrement: Car, dit-il, tout ceci est ce qu'il y a de mieux; car -s'il y a un volcan Lisbonne, il ne pouvait tre ailleurs; car -il est impossible que les choses ne soient pas o elles sont, car -tout est bien. - -Un petit homme noir, familier de l'inquisition, lequel tait -c00t de lui, prit poliment la parole et dit: Apparemment que -monsieur ne croit pas au pch originel; car si tout est au -mieux, il n'y a donc eu ni chute ni punition. - -Je demande trs humblement pardon votre excellence, rpondit -Pangloss encore plus poliment, car la chute de l'homme et la -maldiction entraient ncessairement dans le meilleur des mondes -possibles. Monsieur ne croit donc pas la libert? dit le -familier. Votre excellence m'excusera, dit Pangloss; la libert -peut subsister avec la ncessit absolue; car il tait ncessaire -que nous fussions libres; car enfin la volont dtermine...... -Pangloss tait au milieu de sa phrase, quand Je familier fit un -signe de tte son estafier qui lui servait boire du vin de -Porto ou d'Oporto. diff --git a/vendor/golang.org/x/text/encoding/testdata/candide-utf-16le.txt b/vendor/golang.org/x/text/encoding/testdata/candide-utf-16le.txt deleted file mode 100644 index 820608bf134d0a5a027252eb8436b33f2a71b402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51932 zcmb{5%aUcsmEQRn=Tjs{m?&8)wMtT}2W6-POqFHe9i-Z<tPKVvE=($sfN-HmKAlXn zev7i26oUh5QWKdb?Z5qx1>fgHB#5H5!4Mhe?7iKWul22OUEI%!cW-`q^Wx^qo5wdF zuYX_Oe6)W1Z#VBB?|iskeX-vC_4@b2<Bl(GKD+t!=FxiQtM%XKH~;bGFV=tm?fCEe zH=o>mz25!k=GDyy$CIDje1F~l#d`lQZl13(pReaWTEBm^p8R^<^A|V&_U7N+{MF6B zUcY_5?wVKMU!(kH{r~9Z$<=?4)_aft%>SO=ym|A(o40PBt^eP?`B!VCKYy%b_-w7> z&mHBRn>TKLbo1kzcb7arSpWZQ{rq#JdiUn1Yh7>M{Cth^?$V64J-#veo9pL0>(vkL z*8MM&v~hm0ENC=izP03iy5@L$&Gpmu+Pv?q75wd=rOP*Oez8V+dN=yd*1uN4IyCa5 zWvQQ?bo-MvCw=|!xbN}0=cnt{&(|3L?;6F^Zyl@j+dJ#G$4f5K{_UOQKR@m`%m1&A zJAbss`PogQKU+^eUfMG5PuKtNp635{%>DP{xn~Eu-d;Z&n+3?5CjZkK^M5RfX!0*_ z{{2Gz|M{KAf8Ffoaah-S-&`xF!=D~AJzMtc3cvmI@XfE51W%VYzFI#0V*StKKR!J7 z@y+eQ0KZ=UK3-ScgBiYF|2{r^`u+9$<HL{t@$hu7t@fk!%KMkI;FB5q(eV^s`SNb` zH`eUW*OM>T7%%SRe0DtX+x67@i*?>#?;97RJYKf`Xg!N{ez~r^T-QE2=H7C~URY*J zXB}1;lDp%B^*kmss;iHdzJ7VEGRAvytnJm}p0Doidw%m@)*V)wE`GJ1@|%%AIY#@Z zyYc>Ez4Kp>6+K=uzQ10*T0g&9?|gCGeO}jx$1|^%J|3-mt?u!%(PzilUmUOI-Otzc zua9>;^Yx*(FAv{*yzpxlTKVm|<Ha#1JJ1h3zFPlT>p!jE)907R>&Ht=5CI|S{VZFW z`qi52lXcHVP8R&==67rC4-f4alV&{q(UQ!%-&ntWxnvSOSg_IdD#-ciy6*k|Yt8@s z?ukaCU1(w>vB~J4uixp=`_LxNJYKJ@Y1TvUZ``e|8Lb@dXXTf;|Na^QUy$|Dy64pz zo7O@-O<On2y*O-|g~C&|ZRDBXzh5s&!vecE8Vw{{9&x)y9Epm$=0A^XBnY$K-iHfv z8L{_U;Tg+$;fG5H<FR49_kVee@apCdhwdI7c71iM?d8JGc&_>Q_^;PHH2Y%B`u=e* zD_BLg*)|{_>D<kmNAvD8%Gc{1dBNkGU#*cwV~-Z<v#F=7^YeA}i^IB?+IqFtb4I4z z!QIgD^?^B0k7P9WVr37k8Ae(?P5f@n^ys+LOss0=@YP*2N^9V;tZyY*VJz+W57z&# ze6m);hjG$p>(yZ8lEc`XpMQSLnT}g={zA{Ztuec9W?sV6vG@<x_<srmXKaN6l4F+b zeKg2gU*2iSRaSVhq{nHb@Lp?%^hY=U`55Is`^xL+e>8K=zGuq~W3oH_(_VTX89!dH zLuk6sLopn@@^(?nb7UW^eY!BsQ^l|CS>|9D?~hOT-5sCbt-t&h2V#PEmt3(d`_q8c z<ip!TY05R8M~7ZLS$BFiy%h(ol9W9U|FeFwmMN3Wnv6I8Y&;l#wU{xxm>X8y@$s62 zjt0AX&E7T3$Y+h=Ik}A19KT*y*zLtJ78&w*?8Mp_e~&8<AM0)#JX!aBy|n(%-^h{< zMUqy-Yd>HA;e@jmzWPSX!)ceu!!x0RJk~CXoJX*#knnh2dAaU~n{-VBgC=%}1-1vh ze`q|k#NnGkVSiZe#Ttj~dsO<Rxyc;L4fs(pDea3OukJXexy5!hREReImj|PXVMenu zQg1epLkw2T^7~_st$WsKZTR`ag>j=8&3Z?FkFK;bn4UQBke|yx$TRldF@5BbGhzuc z%M#gwuF_@LglX3wE&Yk9Jdw<sfzk#2K415}zkG>w+uNra4X;lRZQQPTt&erB@gLXg z@ouA&>^I93;s5hv_B_kIXI_v!j`xu-U5Zj^#QnVN{hL27=~S%VN&ES`*J0bZXC|FB zytAI7{}4PLwvjg0PS=+h!%(;+Bo8NtYS^Iz&;S0=YC3B^G4XcE-1=LMN{AjlS?j|` zU*7!vsz3gpHNsgZGB#FHqo?y&Hmja7VeNTm_pu=zu=ZtkWd^pllEL_JlV{74c+W=J zteic^JFT}&`{OkltW5++6L8>ua!eLAS}HnO)mPu>YwF<9!&}GG?;Za4>gK(}+9Sta z?RzH;zJGTY329bNlpX%&E>b_br*-n-`Qf_J$Y?lg>@1$<)E~cGTKw#=9rPDxzFc0~ zd;HM*lX;9BSXj)M9BF35ekuc&&gU>;%*B({WG|O4<y=)^kXAGbk23p@4`%Tia*JLx zEq3ND*`nw}hdataCzhdy;<xCOO<|#!z`|Y?L$O@amaB!l>rBHlkM5q|dLA$6nX?C8 z;-6HTpY*S+XUlat+i$*M*%;IMtO?hv#;(_A^jXuE0jeKfW%(W}!i^l%^S5`a6BBL^ z32@%9$CE>&w4L6I_QoeW-*2{jiQkqzXMI%xR#pe`SicW8WDa@KnVZsIPk+3g!U0(< zi%!JAf<>kAs#(*c^?rO+E((`>*7I1e*J`8ZeLp>(mXD?ZHR=az_E`Q}EA;TYwO%Yj za_bS%W-VixR<m=~Gg?(P#;G3t^2pfo1DK83j4wk}i%t#C60mal^xxn7o5jqV(MeFv z1dm?DYowKlY`+*w$%o7qBY(Zt({rS69ox=OF|u|a>{tu`A6ap8E7%A=KWY3+iRGR0 zYPKZvrG7<4k>=BHk*yp(ewY;`*Iq|9%~oc*ly3Kbesg7$*E0maWe>AY&b4{q(*OVC zx@+R!bY^ybR&6kOBEK)14I{IiyeO%$E1i#JX5>0JU$30TJ1WcDV=ZaI?6fOR<lph| zLtg2=(cGicJmR|eb-PAl`)&2P^3h>E&rik5cF))A@#WSg*B7N(i*6>DB^|kL?>v&H z>AYKeE8~?sWl&PRNIQISe0F9V<~aNHJc$eGad?NXlw)H)90pPFSLHa2<+%{_`q_#F z+amF^nlYc%o&0P?%=%)a<&lqX{_pkQFIIQ$*`Z%rDOdTc<>~+7WX&BP$FA?KYX5f0 zn}yiA%w+4i-3vY7|6`5CejzgN<b|;~DW0vX8;2nr?l8#j?_|wpm?K<<ulH7m{pFHm z7$z)abyYbX$Xe)DjQQ;D)r|3Y^}s(``$KdhyJCkByjN03{NMe_Rg8}}>wBy7$&ch; z^i;1AmM_<O?!UfwFHif^IjhP_uL5@43maW*zN}aI+a*O9Bo}Xj^WAqp$I-CJLYQ{< zx_KT;$%EKuchv4zK{RQf?2Ehp$H>Jy<~cILwbA^$Gd!_ghWN)d!o(T!(_isceE4EX z0})j|TeBe`-yIJs4m?{=$4k5zJC0VGU*#0P*7YVWY^by*7kuNyQds37M*Z$R`}~3~ z<D(DP%IO$m8#~XqmLew2p87|dpZ_H`VsrC9I_z}mb8K_=%6hKyi})@}<cGgHaH7Ao zJ*aijDvZK^zTCJnb(r;2r=AQXXYcs#x-#@!WA04&9M$go`S$V<Q^m34n-M2+!xH9a z>&u8RS{RlecA<yKBx2m3uV-O(vYGon(Twh5Z`{Pg@(hdv>)3oSXl{A_WqePA?jIZQ z6)Oo3u#%^QX=|FE!1TM!6sJBv*qK(mmsKuv7QN&$uCn<mqdm912sP|@$hGBmA7=KH z#^)v)vTGIhXnWV1)<9R-<n!ebkThIU*YVMfo>Vs0Ym3unq$19z%a8Y}str{_^(km{ zYtU@&9_b*mE*IOjw>QX{YkZa#Fz3{{PuDvm%fG}c%gjedljXrCWV9~xv9ZiaoMij# zJh@cf!b)Era<MGNpB;tiPk*-73XNYJJWmt5ZWb}WUOCCf$Ev>gCXTBQ&i2@2+x5CV z<YB4FkF$IDnt5keS6x#)si!=#p(?^Nc$zlYZ!ABxtX=^<wDvFWr1ehz#FqKcB}%Q6 zrRZn(40>hGxwbn8qqjQF@t4)|yF6YjA9gf`e2Qgg!F*>1fj0hI%)Y+bO7Yy}J5~F) z#}k<9lJl)rl#WreA&toAhF9W(t=+*%8YJ(oMt3yHtIk^1Zx0g>Y5BbOe3`wFiVQE- zzs<e#imCKmyPlhl=t?CU&%V9%!aivqs;!kL(*NbGF<N)p0cNAkvkx(A5h2FQerkrx zQFZ;<yz6nc9EAMk8Cym<hWGhvS|;s|66f8YVyv2qq(#E<dnlUddcT`Fv&89H?d-=@ z%6!P0=`K9rt7LOG36uYw;~rYBr;Weljq0PFBjqQa|KqxbLs*%_!+YbGDzn{bEw9+U zbx+-omcy~vx-WLp4jcUXj>EI6kyZDyjrbmmPpqSbG)t2Y%^1_v@yTOF4rAg)tEonJ z%0b_XMw1?{*m!cL@Y$Yn<7K_U?zUL9LEVx2c{v@|waWrdB!vF6ububE_3-k|?>Z(6 zlDC=8<9h!(+lPQTO))W2{=lC_K#WHxbB(>?It+u;uJ4e?{o@@jFIiGvCbm6aqj@r` zjt*qxI9tY(MPl?2!v1G==vg=+9Uac|YU3(?yI-CX@z`!Mg!@m;83i-**t`{5UY-zn zJ=6G6arup<sZZ8C@{6P$|NH;rL{O+7EI*W2#unQvNE`oQA{Ap^g)yo#<;bx$ymW6@ zy_(*;amu@9_DdgzxBGeR<0FsTIXxW>`}rLfWxC>l6Q7rTiLRf0KPG#~%USvMz-wJ4 zh{W<cI!<<SnE@5c$-rip-SzRF%MLoJ${nxc@65pNu~K=iTz2GmvheqZ_5Ydq$3OIf z+lMRubrz&k1^0EcYo^I3$9i$ezAkH#xy>F-dX@2ARv|E7_9^bo4oDIDb?5z_tx?3T zi9h~j)oL=)@fs&-T5l_lg@eCY>wbCXH~f9(ynOZ&gSW>_FgKVlf9AJE3?t>kp5&)` ziMkAC#{8cg_jcxGXUX!Rb9DXe=6@ahLZdNEUSw47OrEyav)PAd!90Y&{D!5h`J7|& z$xc0-_efwUHoUgzwm4nqRp(QPEIFB3EToFk1ur8YDJ={}9vu;J;@FINiTm@OLpesA zoIj6V&lw6Hl@;@=^uX$6z-7N=4~3Z7$s-u14N`}sVR27pwR#e*K#pQh(%m$Qt!It= z4)WDge9P10SrB#~UE32$z{)&<op*+!qfuRuRs6insMI;za`em_((a@6`*dZ<ZtSsC z=QQRFOQXNH`nhW24-X4D+b%D_%AFR4=?~Uv(I@MU7wca&(HF<{`nR2C8{WrrW-kWF zQ$0_6-pNZ?t+n%BSeQMkPuFk7hu&oY(E!(eecTy8KU?zBSflF}$_wjA$zu5DRDDH= zL1Q^(mY-9F&)2gd(cI1O)*2yP>@10m`F0tJ9<q0mG%j;`KCMDmd_ea*QcqpbwK}7; zGMT<}3vwXuWyhCCgexOGXIWdW@(2-wmsR<UM$>sZ9Tdb)ewJO2SCYAVU{U4?Q`VTK zW1;7#)odJIV}0zHHuR<@4+|MQXIB7w1u<D@-ZuRHLf@0Mf54leVX`n<G6Ou--FPS- z+|N8^r|j0gA~eJ<@fQj68y0AX6PmV8W5nUe$v3L7*`>;pR3wZO>5=_9i-18U*BT7b zJ>Thl3}3!bJ=EC~_@s+B7ZSg>)@&tlNLolEm(^p~X}$8^G`3G3kSrFhTEQ9{*>o^$ zX>Z!@MBE8g)@)7ZyX=HkpR`&(MbMDRLhS*2$2{)E4}4?J#@cs!a*Ue(J@4K*jb=no zeYoDm?-=L5uIqIPWS4sd?FxT&^Vf&wezfF|aoO}fp7zP@EO+T8^qa3fS);sMuSmX6 zriJd<Mn>e52eefm?QFZp>)D5_N2(&>r3QG+u6}u^Jk;F0wbNdnO@eY%I@lO?-lB70 zG$(37&Lu+kb5OwZd4OoZO7qO61v`N}Y<lJ;o-tMZmV-ZZqR<T2F~Z6ql<a#fueL<3 zai42Qf^b%JnRrS!`DgO)v3Z42XD<0eIF}vrv0of(cTWuRyY<_-tF^Ik&3@K!#t}Rg zh5cKd_Txhf`xF~Ah-a*94b$y0e~2?*OdgNWC=WWbJ`OR*&NFC|&+YsOT7GjE=YF)b zkPi4xo;WsnzSb}&?=Vqgzr6dGTsVn;>hR<ZqfKMMqM9q2Wh~Vm=Q9p5PJP7U&{s#~ zfz8;!D8-qc-uVT6bRR3@!e+Ykl;Zgh58bv4aOqdWEI6OM<Q_lz>!qdsgNGj-oXc<7 z2Z!kCb?V=fF#@T6b()PW?vEU|;Lht#$wNJ+@c6@HwP(~#w!mVnKD<Z%`^>g|d;4M% z@W=Y?tSZ8uc_U69-Nofl_wc$PfS(k}jBm{A`YSH}@o`t)Ty;OV-K*SMm8ZesL{T=U zfnw=pO!@V)P+EJs=7@vL^S$-_*)x-Nsub7SBaWjcKed8Zv^)Ce(-$GLJ+xvY460Q6 zY3AEIc?LzerYfH`sylS8%ImHFz7@mr+iSF$y*VdqeY&)fzih9E1JTro(?6UD#(TWK z@erq!bEaF>!bD8knkq6`dp<1|U(8=b+Iv5kTpX-UdL1UPrulcaQMQh$VX8HC-bF>Q zPi9^|7pIC=`zicK6LOc^^?sTh_A6f+{^+hJM`Un56(ZD*6Dx}L)y-J7uEt~|^cfGu zP3cBYuvNsvq_7h(Omis@xhJ{}m+R7$5&pxn!TzLLT7b7tmYmbkBt>~o_UAWcB`O^` z92rN4!+G9GYp=Uku7&+*C27K2(JEOW!zkGwulQ^<JtT$I#k%)(l_lb$^p!+B2=<!2 zIzG<(;P`ALT~FqaoiJK8SbGq8%vrDSZAX$^GRUHI*|L0C2O)NbXz@jzyk#!pC8hP+ zjfTsKlu&7IJs`|N4<z4mhBTVFFKy^)^!)bGaUZUCtt%7ndGz@V@8qV%e$qjQvoE?@ zw9gj&6t`hktCQV~canE<H#$+-^I$Wn=k+(P^B%ex1~<B@-TwPv+4bb^?C&2AOs2Dm z!*pTpaLD>jV4Zgww`5Q;naAz=T_m9EY`8fm?|QaoBbA83GVycwPAw<8uoLZsud<@> zHytEb@Su^(THK$0^5{W-T8%@Dan{fF;pRGb`G#@#Ijo+}-uyr}`g+C5TJ`+<!%DM? zux{`F_v=|6=<~s(gV6kT>-BX{*~M`}KTqhXv;;}v$(aEDKVuBWiqG^6amB|lF8Wpr zdhTp1na5;};bXIZ<Hx?!@oVhyiE}LTUT2EPi6`R~vTU4enRye74y#WOZ8DCylPAy~ z+rYM2<W6yZQayZa;z3s3yAq+1Kf;Vyco`XtU(L-1SVNA{=Pd0b&L`w1uJCOuCfOV7 zDi5IREDw(ppR6=(UY--MV^E*Ox!QVct@xvr@yZoxs!y`e=5WjAfo8alc=W~7M(6yU ztXU0y{$Y&|8Be|$-O4@VbFUa-ywAMjtuiS+TJO-1Yeh4oL+9+2oRKyt+dM#*anRt& zI>Z4IPQF$Tuqq~P+Sl;hIa54qKmIdDr#xdUUPaESqW9~KRT^W#d;ss<ucrn-u){K9 zO;*oC@vca!)5Y`Ozl&$D)_wJqaW>ucGY?I-Z>=ZjY3lunP&-b%w`8(@<I8yK5cBoC zmkca>j_Kcqq0#tt&Qc6*T{JC@>OhBr$;d>G{9vM57Jp|+A)mj@z%D;O78j~Do$Q+~ z7d<pO?M>hG+@+vzI16!;Z=XjaB|L04I*;YfvV_*6w!fdRdA=SNiRRPKgY#GG>R@*E zO!G86@#P&Cl!vxQ4q209KuA*fgl9ewOJxl?kx}|w9q%gJovZL|e_%dE@$|3)J505n z*G{Z1YC0WnE&90dlKzVRBK4dEojgkRUHo~v^n(XGMPVgH4T!EAxZ~>7dG0dXnL}|} zpUIw61$k{KAAkMd3%loB<h+ZQ%qlYal4qG?G+UN+osEBW>|N|``=j;r2kU9RX(m`I z)|9!{Mfu{?BN>drNm-;Bi-faF2$ikFm2(cvE<5X2S;+0`6ikoko#Pqagrls9)vqi1 zvyZ!LxYr8GqbDZOzTC+g=d&~JfmN9e)P<MOi#w*;tUDCq@~ZA^mXVQF246AaJ|QsQ zZ-C245~DU&`BSm{ejIC#P!ad^nOX9(Ro1?b$MMC7a<)fDH-n66shn<~WNlv;meZ7Z z$~t7obUZV&Njbx0T*<TbA3Cf#{k8JJkBoyB)CkkJXm@k`p)Tn2_58?-18(m)c54Sp zVtV6<lzndNjEb@Y(R8pndAFDp$0p@Q(mb>A9WM+M#qK{}I^m(T!&}k{9+TCpxyRE< zHMYC78Vwm`^G_=(Yho+f-ujp|(1qM!XMXWx9g*xNW7wxb#8fdR&BtM_<JlUeIR?p? z`B$giz^PHQvsZC?dfVI=I?3MY1T3p}372t38l4_jNPgJItxQ~CS&VbJgV_Azg~JqY z9(R@#RW-i;tjBl#ekb^16EpI4GOHE%Ls{F{<eH~8{x@RFjEnNs?DB3>K3d;96=I4j z`DYrfPdXW+aeJqkr?)b9K^kP_v-|G7W1H{c={_M6Z)^{t&pd-A=ktc4<(+kn#X_t) z6$;2u9y;2vgV#51T)sbhWc3rz*JS*<1FrC(^R;4{XaV7(%<wtPW{u4j(^+-5tE8P= z{IWt3!F^ggPo3QSvcsE)`q{~oOFgKdMlQH^U-|8q7yH-kK3N;yt1cbC5)Il_XG2xa zIa51leZ&3L`J3<md983h<48lYHf!c@FpDiFBV#X~nPxm0s>MVxF7(jF)Yj~6gm`_J zrs~_f^;+!SwJtf*^(ycVdBtKQ^!sSO2tD6vu`QbPb+7bxc+%*9nBjjOlHtm52piQa zd{!P*#p8Z_BFiJSzRJUA#V_@y!Wg}$@$=5qSc=SbYFYYhvynF(vV&gIHEV9~jB(O; zmP)G=3*#O9V=cw=n0aI|Q{PawbL04Ta@RPSUK*{Fp~L^>DCIk5m2q8vPO+ROS@}SS zq^G)>^bv>9*>nU{5Urk{6me;nUB`O)zwtIor*rZ@58O;o@a;9m`7`pf#=%#1jITDQ z6*b(mzx#$X$$>lkZtkq^&iB?g92xDc^;0)Xy(xoqx5|c&cK$GXjr4*caWJo<$H@cm zWSMMdh&_MV<vU}QmC3_GRf92Pk%WZ%d~2@;vtE&dC(uM_e0C>IdlfvREY#U6ckv8Q z_6kZm72$PUKx+8~yLI2N47q7A{_eV-untyCW1X7`(_Xzq{;n=)pQU=NetY^mM@2Sc zgOF6zce3N5?6(eiQL*v&NvycYoD;jQBl*sb1}Cz<|Gn<NJ#av?^=bAPUX!10>TrZR z+TsQFDeMG{J>=h8-?TAIECxG$Vr9_dNx5Bj(*RCsr-Byfy4-s6X#DSKD6-D*lMmE= zH=<632&Drz5q+4NPq5&OTD~yjxQ3y#e2jITM^=bYLa(_xUuh3*JZ^R@)a8Rb{yoq5 z<~y;~9PO?d=lqEenKHfSD{xFVw7D%)XV_guB5Rs&nd}r=D8J@<-`y*ZmqqjFVm+@P zjqEv$U?0tuqC%4B^Lj0V$=~r|*qzv^TR`58F_xHm^*me5S_F=Pbv1p1L;Bm6_S${J zBRebL$6@fTB`baMsB`zy+~aqHf7-_wINT0j_AFy)>=@L_TG#XSeP`!hMRk+s&J1$y z-EU+=ds*_+yE%(vFjOus;+HE|8BG5rzb6X~kk^bcjyu!+H9KGtsIv=USDHU<^waJc zq1S8y8?9;hWa9=}RWoDpcE0N&jBd%q%Ct58z&UB3r7pE#zADzKY^`xuVR;u_WuNgZ z-YD*mEY|sQt=7yv!}9#6^(NQkwjs<+>fQ2?{KD!mP1RDo;JW<}+~S!yvF~Vt*Km^G z!H@0`T=iWjRw!R$g;~wDce;btNgp2T_wjuhAoMr$pkSi3%nMWSps}6r*LmYudptd} zURDNlOlItAjA6HjPu4tMtN7Ws$~K)*<92RspXZ%kE{~gRV)9%%e!RZHxQ>8lNrhvK zL^8OWlhftg;dx>cR^lURRV7xQ8iN$s8}+h#&CX?NXaB+=WfZ<w*WSuMe52Xspj$Gl zy>1VyvKx>8<&wlZaVmQh`6tg!uE|)e?977Q#qY{&^P?E?Tn+4OyQlN^vp4c`a@?+e zH*+*HDUCUOkZ}9(r=qMtR2l^B`LctbdcAS1*~%&*(yQu(iQ3jXeE=2K^j-7D?ET#l zsq64;S*NE%owc&M9Bsa(k~T5kuqxY3+^^q>70AX1d3dp=TrO6yZc%M8UIcNUY7zQG z^<lEH>r@$2Kgf05hfnmBpeEVc`47e6Pv0UObw0$C?W)E}B*lTlwr4ww5LP|@<Jr+M z8R8}1EAY@K+gs`MY|YkbKa$$jtFtv#OcrR5zx!gN@PW0ha%@oS+Vy4lr`a;2(Mgyr zc0nx!ZLh{vb_E};pRIJhL&Q8id!Bh>N3lJG^8IW7n9+6@+;~+PMH{*6)bLN&Z;(%) za<EV}oWqtomkk|Bb{&bPvkXanR_-TjU1m-v*Jr#pR-EaOdH?mg7Z?5EkOF754-=+w zP9DfNR4#KWW>;25$dc1jilfRip;W%NtF*~~%k1K&(0=I|o)llK-0nCnj;~zi0r-Af zxVytp_WI+JT1Md~4+&-Y-X62er5KL0R07v5M4~ugc5Yg^71OPJUDm+oS)p^3?e9Zg zJRd5IKAG_J!3Kf6&$_=$e8sbSKI}z8lJ9x)hTZ49-tjzFtS{CYT8%96JhoAjY9ehG z!VqS_O{6*Rfnv{CDH+?1aX;^738S)Wr|UZH(eB%}sS)zPeD=DB1idlf&TYrC-(Mp; z5grSw#oE`s^qrXh(jTp5P6u6k(rCQ6X!RlhY{Na@E|TzG-96FWdVNOX@y*{I_fE`a zvohhlu8sqp#JHm&BVp94>hMd(YrnZZGbXDaKF^*LRg!*WHda}$)y+L4<#~03uB`1! zF?4JkTMZ_%z`KXsjduS0%6ZK(1uQh4j>VjDq}3gtv$vJeT$b8>Rz0eDpS@)in6@*L z?jAYlUZtbDWhHA#dKq{1(XjSA$2<4G%Z8;dk)wXvS!WWE-H5XvUG(lfWA5)TC*QD9 zS^VTsuaAM9+97l3dmTPMK5{OR={_>eJ6;i{^7AymBOx87D}8S=>FUA~2AK2wS^Y=H zy%_1`&G**ttvcymu2)Wn`n($y#069Dm?eDvZe8!UER)XoyH3(4>;HWFGFvsGcksZM zYi>E;&zF2vV{`73BytF`YrGK7NMSX8zg<7EHP-Yk(cy`<vPW?-omS<}T|Cx(_DRer z3jN(0<@p_B$GdDCw&5e>&u95!Akm~=&>&-Ws9~#aOMOmjrVZoy7v3h%8*IeX?GChp z^h*D<X7{T4EBU%-b1Y8xL|yLl3BEd8c{C)Ydm2d3{350!pK)2aj=d;e?1?$!ZyE_} zzgxeBPUD3K&+DG|tq8rJJ*VsA`51H9=(2MgmQ+Qp_&kOV967PW?SanpnzptE`cyK0 zS7{p|@0}AZ#nI_xhz!X%%oD2@zvy<dJa)?Ja<Gl=u~SH~lLJxH$)kNyP?ZF^ebP9~ zlG*o6W7WKkU8W{Aj;_d@aI_8xx~{MD?8_W%dvAS0$kzuP=AuI~<oUA?JXg0}RRgj# zQiN9=|AY1W9}m62%a4yyFF)56TU`3^u64_gCzm-_`D9{a8smGD-JSJa{vsEv6Trgq zUsfr@t74#e7-(mv6E-1c>c^QGqRaot4JVVo;6uOv;qaX~Nh5mczQUvD(qdl77Y5~Y zJe7%&Np5eG<er{71Ij`VJGFKkC8yZ<4d?C~9xcCtiSu7#sYChB8Y#a_OP-^R#`DbZ zyS0pW(~mpyeDa^a8^*d~pSoh9`kWWaSL)2kxsq6J$*O%~Gmpd<?6dm@w9;OV`Qwvz z;NT(7z%O`*#8m{{ORnxc=M1ciYm?`4UXocW8Aj72N;|O(M6qR<X)W3IlS5Y7ko#MI zHN1Q4mUga{4Z6<%MHaoW=I-gZiHFrWpZSK3N75p-^}YWM-m2o#TUHlUANm_&zxbwa zJ!e;2)irB8Wbx@wl5C&Of~P;OwRvKYe}8ut#>bxU@a^A$xV67)6xl$$2lq5c@>%Vr z{GK1*<`d3s_Vmu&v!mB`M61cBce4Gso%6aYYHlN+V;GMmWBsyS|B!9+T5KUx$V&$C z=I@=$ICWVGoZ~VL|I>N~R+B!9*azYV^Y@@$m+`1?&N)u;;+-{WbtReq`Cx$YJ2QT= zo|%(z7}TeRVhIc(pD${~b$K)I$Pdn*)S0F7cX}H<v4PJlK3@M_+L6ur1h%{#!;+|z zyLGGncD-vhnIx@D#%4|TD~!qQ#iPB~a{oS7E(dD9w2L>ZjL)B=EyvC(=ZFyliAC3O zQKk8lHGexrQ$6bOh+3{ruZJ8(iOIH%clJ2>^ZD+bjfBc_4ZW<{?GVAMw`eS+zq}jO zUk{sDG^4Ts)_$^{b6@CxzUF0PqxqyisY8F?*e_<4y~|IHaM{6<S%hP3;<uQ7d+l_U z!@4_Yba%Obv*w)h_(|BEb=d0j6eGWTzb00%XPi9z%-rW)UsiFot`USfr660QyZ$;* zvbc|5oOg83eTEP~bHfF*esc_(uknNP-aPbI=3yW6zUL(W#B-x<P0QuZ{1lr^XXN2p z$u~8X59~~NGI4qqhcUrq2CZrIfMGGVYNAL7d7iR+biG3QE<5Lcbw}%?zP&K8KlKm6 zleMR<P)d7G*9ba`Vsx1g&A+|wPcws=$v28m=93c-kDQr;-mm$oyjblddr&{H#YBa? zH_3<X>U3eU>I@Ymj7;_5-#ns><@vf+u9Ze7o1*hhfMTU`icUl5b>lx8=7r^VB6L}q z+1P`vWD$6|Gk~wh$U|$N@tTcR$uXJS@cFeBhELK>``GN*_qvDyFgq32d53s1=6sTk z!{mL2Vd)>NRi&BGJxn)#p(`wtkeQ53PuA~)kBtkXi3WY&$W-k<AMMF=N1~bfHVgbI zZ)X|VM;Tl3!@Fg&o8>OqZTu$o-!(#?L6^19UyTZFdw(OQWa;x~g{K=}Ek9h6mH)qv zVd!>i0$%WieD?ah%SKXGDXRNUEis2IA1q1E-#=$;$e-^3fb!8)v+Vr%_Rw&#nup1< z*l{Z3Jc7sJE;xY2=~$TEN?m`x=A?T$ME-W!@4MEsyI8lg5k?t*ns{rJVF?;?M!kMv zduF64{?zN5dH0BA7+brf%x<l_Y&RUj8a?=2+xS7c-w{WB#m<A^sva_0b=?wqJ1tBG z*PPRJ!vtBdEZ{y{(<M2IeLEVnYWabV-Eb?GVFgx^LnH@}E2B179v(h>*I4u9R6m1n zF-F#Tz8;f^7lZ4|t89-MaoqLTRx^M9b1W8X#OI_Bp>gu~!R}#{Z`hS8*EJje9zJ~Y z4nwhHHXT$>WJ{+aa%kN=JnKKBhW<h!Nk!E&+ZR>HP-ZzO6_bi1;z51N$@MOMw3_P8 zb$<+pCHkBOTeZsX76+|%Dy~cILd0ZhF_`$+4p7z9xl=zpb?z|CnrA-*|Lh*7C(N;N zIVZD<if|lT#|Eq>BQ<LC&sAtXe^YDO%UtCzMTCj(5bb_C%bp{tSbVPMsypsyKO(#* zVQ(zvSw6z1RgI8{V~ew|tAoz@3tc#iI^H?`T%7a8`VO+$8^bu>aepkxhUC$+IPZ%W z!}#Q@L)-F+{n`5a&+~gWY86F6SSE>;swJu>d-jdH9`x8M`_s#K*Koe~CUctlCZx84 zd|^&KVC2>a>ksSh65-^jr<m5*Bds|1k*CCsGqNZ0A9|Z^SXprEX{UYuI`psye35qg z@3VG%G+mbK&U_3o-=g)arD2f=0>x694jGG_^xS7_T`yw~)AdxYzq4cJp9~_dvNmyj zvb@V~l6B82WH=L%wwI|Meaq%K;}XA$Q%)DiU3oBn6n%F+non%6Wchqc?~hku`)XV@ z;zNJI@p^A|W+6GPvA}dNbh_=Au`Ee;Wq*m0@2zWF%CdKVmF|p_A1}$uMAOfpWVGeP zWS^lcHu8wgBC*aH30O;aNpz*FbDZ$^yX@=Z0Qyl0IoWl)e%}lO16I7xzm9LoXgU+# z9eKOhit&mH<d0Ezt|ikL3(DBGPV>3RJ<K{g%QC0<U}EFer2EsX+Ctx#WUjMfIm#d` zti+Aj(s`ObCuJu_UPa=K$nGCToP6@hH@Re1FP4V&YYT>zDz7q4j8?W4BNc06IOria zOJ--Q=GU{=T7)PM7|oue2A>FtSyEgthQ%{J=~#}$+l*db7H{ncDUPIn{*;Dg7CV0= z>8DFJ+Od+et*=KTmEPnYk=^AYtPty&BLuq=FR{8=FUOucx3rVJxPsg2GR0um&ptY2 z-WGweI0JUeAUA6N^hz-Q?b1Ni{aIEshqY=Go{2@X0K4$Ly^3@m=ENcyPk!5ud3M<H z(iSht5=n24asyX&B=#AW{$d*)JzaPC#E0|LgWJ3>M3-q5(VDe5IlXOmi8W}RU+hzq zX&`jXxuJa2&vL|aNUX_U^oB?SM_BT5H}Sf6MXS6U63=$0X;Rf`+Iw)~o4=_DNBW_= z0@*csb;zvI9%k`j;~=X{-|6g8@x98~YRENNI=oL#swyd}uqDrZe_e$Hk|wua*FGtU zxgPp#kSEMZUw$`VY|9R8zop+iZfz>V?ZGUO$H7pX5u#`~k1#grZjTv^j;$U#k(abF zO7ZrLv9x~1I<%TswwK*}9~ODexvlm6aoNwmaRZ-ub4h!<q}n^)^f)n+|FaLBe029W zu=nQ&v12`%GV(z;Yn&N!&*zHz&8pdH&d{EDW#@2dXrCHrzCRomvx<=Oy79`ihSw+V zh-Q6)q)NOwXo5#uO`VI$w+Bt~xca1{J8QvwbLzkvFh<?>PSe0eJ6-G}>n@)j)L|Q| z2nk&c%X1dXGeun8h~kS{Hd&y^7-etgznE2ww|bg7pGWlUd|CwmsUza3jhCJGOism8 z>`Px(`g)X{wJ=(TP>~&9%Vp1JO~^l85xUqjV(qC?_6f9j+F3gBcUK-X{A|e=R{1VD z;oX%VuYd7s9&x^c)vXQNct(xXGe2AJRKIj(k7jodR*HPhbVk25*(Izp*tyAg>e+6W z)jA75TAf|q9CNTA6q3QHWvln=Uh>34tX{2d<$1~LB*OaE+mkVD-*Z0P5r)p6d&Wt= z;VnHC^WHuri-D{zEW!280Ig{EVPZur+9%Ei=W6b<I+13wwGgD@*!W__yu9Al#D_EU z!6_~5xX^2O#C*L9gX8_)(-~+-dhhlcNA~|>*}gS)LWlRcwmVg~hi>fFg^gh$*|feO z4vBf<nPNpg7F&{_d`E8=MzXz`^ZmN4>~{8bIx!pTiGkIz=7J;ooBVx8N3y2@HBH>_ ziART&RXSys^K7h$d5s#jnrWnOW{4!Q8SD><CcU!$EIFS;BRT0hjgJT1gRSv^yU$hg zc_n@SIVPp=i8kW;RDfjs=d~i=kE=?RU;O>eU#`C!{%wDQ*k1r973|4nAFsa}9NPcp zZk$KQ_ji+;AB~l*5c0)Ma?;j5cZ;7~eY)O_tyup)3*;-=dRJ)q51aQnxnlQxqv6}f z$k~!-g)us}3Os+_`yNStd`PnMMzT!4Iu-3OS7Q~UaphF%cyjj?&mK5lNd|Eis!0a< z-YcF?_9nm7#~8fFsvGsiP>ed?(pc=n?9*wjpVpnK!)EKgSO+JHEL%qt8M3zOw^1ON z*Pq#N`k=pEGMJS$&n!7L(BOgY<WI&Pj-E^*JU%_H(!~DcFwL+RYx44to%V2-n1xaA z<0voUYjJ<MEsN5;OjQoxbkua3;yV&fjLCc2ogMUg&YW1{e7^Vkv<sh!muJU#cCTqa zJ;<G*GyXE~i>1x5(%i#Y;bV|fuGDVi$Qt&hKFl8F+0~Kc$v(w8jD}I39GQQ)M_IKq zi6p^xA%WKUHuT6{Cg<nXGuodzW5u7cN!~Ns_+*VY{%e+YJ;%<)nEBR*Yag|yov%%d zPn)i7J?nsMj1D&SLX#;=Wtl#YHEW!l>)FB)?RF-0*Vq&9%-1OVWM7AS-_n<lY;T+H zcj)@%!ZK7(1ro!)vzX$$q0QW)!)SF-5z9<w14ZW5<zvgy>zm64;o+R!yE_lTZ@kbN zNl7ODj-~1(RB4g6=m-}O^Um>HNMj8-&3OMr!S|Qco6&ddnl)@DpI*}-DdvLGje>b9 z3)D&C>AcH|JI^qlfB#!uMkm);gL9rl)Be`6b@L~)Zwb@Ou>EK&<Q2b13zNa%u=JeG zW!3w00We&&7><Rft)nUsoFp$8*~2QGX3vdLt9M_cJz2l^J=<qyF#2U)6mz$>Vn?y4 zmD@#Cz0^<73o+#I8q`ep#(c)lGqV*WK}B5X8vdbgNO7uQ`_??apM=uc*}HryeZIBE zrQhbPuE7v=1~;r?M%P)Fq~g-<d7X2vCwDe4&m&h)i3Zo-!}PG+d|*pIyg-t2!iPs1 zZkf9-rQAMMl#^kT5MKHDAnWXZQ%%W-@z!Ln@km~smCQL97xBCr-zDw*g&8P-H|y9I zg9lx^_6+J(?kurg(oV#do6HIavuwKGyFVN2mKSU-ScA-n24tZ|o=9ap9DaL9-nnAW zr=xf8*5DpB8;rzw`7n&;K@*uKFL<aQ*E7Yt>-dNhea{RXpS2YV>N(BnNHP~k&fSAq zw{L>un_>H0ft|ZTFOTdxTf$#^3_B;7lYqmmQ+@ZuwLG1Oxa?*m&tA(Oar2?o@%ORr zXq{ctYZ6U%IVjCbW39Rq<>agiLv?-RCSnA=lVeaCKXg9G+S@Td|0URsu{eFa0kgAt zDC`^J$U-Z7rCIoX#F_4HRVwL4M=X<8!`Idm*6obzbc=Zt@38OOj54I2bIyw|&OTW- zow2VYZ#niur}XEH{=4_)!s2wr3bT)qX8OLgoz2Xwq}-=!%7?0I=+(;AgVnHbKz1?d zPoK|EW0!gUw!rA~yXH%2<DJ95%Wim<C}5=VH`zlgk70JEQr<H>Cm+DHP#nsV$I6Z6 zeY>F|?_?oR1zmo2k|dkE{~V2F-4F{mp>VR-`*_2E<JUVQ8ZW>!eP49Zgx*PJ)bY^d zohLe7A$m^bC61E%iz6;unSGFUI*n8Gu*Sx1g)jsC<(&Mt&hTZH?D^?)^IhEAw_Jvx zbjsW5E<D{Het`w1hm@|ZG;S$}7MILktxn>sT|F4DY}=RPw;m|9TRb__zDrd-J>2=` zuJkv%NxdSY8R!H{*Z-1vibC!=bJeHEnR9dZ89bf%eTQ7cSm(U9albfNaL#?qIh}Xc z98--{30wQ#y(ngm9mpZBv387$UnW<3<8B4!gB&A$+Y@ZBu4Iw9pWl63Rb$k-clL}X z*Hll0ipD&jf8W*RXq(;Uv>!aHtK(n!wfoCtjfJ&jo7o!L%NcbC;`TVu-UyAzE1+?A zPGY*L&(qN5{3;JjPaA4`b|;1T$Fs+~WWAShaB7dqSNp8H_3*i}{O)<OM*PDe+3uXz zSHQaZgW<(G_$e#NlKjq^{A!{vR>1T;vDgHcdD=A&J)3p*NmsAyV$;?5N`Cq5kUd7o zKgMGIc1jwgk2K3>ys{l3JPi%IlQKIi#X~>yBYUJ%n+zYgT19%@vx(c-pDbp`56+t6 z8?ChrBvx{-wbThL3c8E*Jl>qp(J7*d)Ms5!CE%&CYq?TqJ7hJTZYW9(bB{;x+GOsX zb9R9B&L}rW{5kmcOsvAzc24;~+11RHU(Ppkq!V%J><4)ZO?<LO?A!?^zW+&v&W(;m z!(O}@4)D*;6GuD6qAk6d%8dI|;Pz@(59!+uvu3_$7T4?e@*vsCt|5N4<R9NWBUUb% zzwwxQ#MxUkWUEfrY>yrN<qf2A`f)UW|FermeW?2o|B||lFcxWbbTu=Qflu?$YIf@m zf&5WK2$B7~&J?X<B0|*<#Lf3ji&$ik^UPYe)@CLVn}$hnzgMaP?t7<I+P^&_UOImF zc;cZ-AY`4_CjR(lTE6Ff?B-{G3#I$7S*n@C#g3RzM30jNZ4WSm@$)J1n$_E@D-*bH zD<h@ZhqKk;gR&Y?9-eg0=DAC6-Dp4CCC#zStdv}OF7PRGJ*;~>=skh?^9bl+Cpmsx zpP%_@z2iyu_t3FkX9hiM<#na+<2NR})Cg2z+w76|SpzNO7uU`#&k7Sg%iw>q?(yDy zC!psp$29u6KXlo@V%zjZcD!o@`d3H(^6uLp@*<;Pe;Ev}++EF`eb8)Dn-|NJCuKuf z#(0Ps=*-yWW?RuXdv+H@B$ItWaS<;YaWobO$xSEo8w`cmc++2dKXa40R3o&jqiv5+ zZUapl?O1Ksp6UC|b%*FI1IGhcdOoX}=4fUxIXf$4Vx_J?m|Ubzv9()`aYuXZ<$0|^ zOf4ews&fZ#x(Jui!HD!%7Gq9YGU8~habs<EnjPY)YKwd2MXiNR%iz@V?V7UsNC+9` z(W}*0V9Qw-oTz=Rx2$^Bch-vgr+!N(G%z)QtF%LgYfj_q)+>IMuWZ(;9+o*x7x1lP zl;Jv`McI<kRm|lx;^H6A_ik*S{_z%%3*nP9wWBb0>nY53e!dlCX&GJD^o^^hL;Ynf zH8GgxtUeu=3zmJDlg4IrEG{-=`4C!mw*NB0CBw{<b<(VI7;h^4&`4f=MPpvx6~<@} z{&@(zgf}>;`V52kWza9L79YtQDz*)FH2TMbDYC*ukA2lVJ|%y)e*09gIx8JCliM6@ zlNV3#^POXi>)6wZhQ+Li4g773Fp|Z?hpWX1Eai$k$6Dt+13%*b!*BfyL+Xpz3<Jp? zcc!Up{Nl(We{vuy=7@>P#q`JW<UBH#+}Zm>pOK*nGv|4BJ;l`ddx6ehp4Wc=RDT)E zFAlVkF9ha6=N;@hXXc8ErW(QQ-&?PSHR?Hxo-gAh?tR!gRd2B)YkE!ZSvK3W`xWM@ zYm+gg-G0L{e5ekW{L!<qj+}9G@XqyUygW1ZOP{Ko>(~}9&i9*(CwHYd<Ee6pxib5d zI!2RE?(b96?RDy9a6kJrt)u8YYY6k=1ZIxS)537L43ZpErOG3=ms*?CkMvUH6G7wi z&c#FW)XhfPwg{J#%?#I^{cqdjn(fXzIo5LKqi?e-d*y5F$kLm^y&8Lt@88eY$XU-M zU&4TVWoq+@VO3wFMe<LE#`k}4Xbi4smSv_&Is4X=L({IBfd`*YRrB-qJSX0}lm2C= zWoxqs<<lBFgSlh@nIA+AH}Cvoj};17*e7YM=H=a7!!N8LD;mwcd)J#E4a>z;m1I;e z@E6gdY9;T$S%Y;QNC?Kpvl?^Mj~d*!LuqAyv&I)IWKi!P9i;t<8}gR7@(PG_Z}=0n zn&FH@8iz#u1@Cf+$x7-H?h$B-_sLpG8vgbv(7(U=H|s1}(GJgD+N>BDUyx4x5-s*l zvnM78w!$h^GI!_0_WRzt@A@=bT-nMer<;gAUQfsERLncqSv`x^Cy2NI@_0g})QMap zr`x|=XX5^9{fDP9`kajOds=z@3A<mc^L74%7dWTg$2b3WjrgzcI@mMXqvKm#b`8M> z;yiyj?>dxq&)VqpTrtcpLnpj1<IJvOZV!xwS-;~mT9AFfx49?M)?0{Qibwev#waFW zvB_kMn$HfuI&(mNd(A^Q<otQbx{11g*v;R?#bjddWnI_2?K6#M?sML_&06z4$iN~K z7n1PldX4|g@?9{rKLxV+icH2nXE)GOt+x5+nkVk(8l+9%yK)-s!Y$8-hI4<!6M5=% zgjr3Fm6c{Mihg8uZ>~}5`%P9BTXjCdI^to-nX{U8nvMH>Nl>?-7<Ha=e|ECm{+tmy z>CO|Yl<8}G>gbOZ^!KnJIkGNZXm`?ky&}oAXV00>P9vqM^Jf9<s9yVi82IVZY#GX> zb;U3<rEUH3yowJG)8F?jGh?$no$St-zje&<_3`dChUaq$?6^_v_mDkEm9=iIT}#y` ziNe^+HCu5ZbnvJ9XP`(pafzJrNqVs6jSYx9BYU%@?|Z=6?8agvC+47^vZ<=1(N~$P zE)*RVMInPMamzI~SV2{9-HW;eq`I%i`F6wktQ+61j@!5^r!afjGd7>Rn+2xkBVpfX za{kT$Yt6GK_Fgh|R$({e(++Kh<T?a&nVny)EBw^yW)>TLOkJNpOeWJPjV2yILy;-0 z@itdOfDEDUIITLk)RlFX9jBj8+)b|Y_8~Q$^Reko71<}wV72r3$rHy8A7Kh>h@E6L zc`t?&|M<n+`%rysmAhwUZN`WnC$kN6KUp(f+Ciox_i(zI4d82YqFiYDJUTkG@tfnG z(F|>~-m8mMro|YLefJL2hX-$2Q@-P@3i}!lgM=BFDqa>{AFX-aMb9tSzal7~kdM&Y zuB*rE`dgu9-X3ZOcgNfH@@FRFK$aPbE=HQq9l<Gl(JjQlw)x`$l5Tw%okt9s=Za_9 zWIoq!mf^trUGqlV5<rBf^Z(IU^6-aU-CVBN9h;TBDh8i5&GObTT>~fB2a&_0G>pUN zI~dt#*D1UEf}^Vb#}eKdTc0D{=tm_Ku4qKugm*RX<=r8mI@4Wr0O!}SiiUdf{z}iQ zWJ&jJ`<&-*gjs`(g2rfizTe`z>6zU&N(OoD3c#}2S;c*<K>E?a*6PSH6<=KZ^Fs&X zhKOWs=juUbrKfE~l|DUV&wMYYmC?W|ABl;LL=sPtE$?}`Ufr%4##`hF^XZwfW6{TR zxIKC3%$$RwJfO^p51C=&S&<LU-drQlRJrDUHd*Sv;Hq$gNhYr}=FD8Z1<B@%BgLY2 z#Xed0d8%`OX`B@>#(ljT#k_-5s~n8Ab0^NmgwNM+@JuSB@jl*UrM)8q^V{e;YyRDF z2fJW}qHD3F9n?-Am04|_q^D-iA9zTtNDkj4KRDBgD1-RZ8MbHZ*{}i)?kw-prgSm- zE9RV6ym5BMW*LmTr>k(gwD)3-GdgL0>o~KljMo~<0HFJvAD?S6GSkx8!$T@>D<30U z(e2W+C%*q+Y4T6uY}<T%d&geL_qnC^@TP-0(LzRX>6PDKl2sXhoBc?yQ^>Ma7<9x6 zlRN%+y`G(Xnkt?_=%qxmT}UO72=c-DIWdq|?fye{J!>C&d6Qhf*d(*q3_AXCyY3s- zI6v<_)~l<MZ;1V@W5+V4P5&de`&-T64Mz28iicKMe27cQSI3YIcyATc{#y(@?^;`z zOc#G_?&Q~DTKwl1zW)K&<XJc>@14JAa&6^0sdSD7+C8YZKO^rGL$Fk2;1BJeTJO%E vFwErrWat~7;y_Q!rPH+0NnfqhTvlJ5@Y%XT|K5LNecuk|hTG4MF3$f4@wXAd diff --git a/vendor/golang.org/x/text/encoding/testdata/candide-utf-32be.txt b/vendor/golang.org/x/text/encoding/testdata/candide-utf-32be.txt deleted file mode 100644 index c540e2015cccb39d50d2a3343fb9a77c857a037d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103864 zcmc%RPp@y+k>2+n=T($OoE)B{o!CyCfk9mfX$n+}-C`>S48ypw9lCGY|Lw%_s|zyo zyEx!PI(HyXG%-9$eSrN17B+t8lIpgdL1C{|tLmwzo?3gKA4zrp!5{p=H-GR4fAEjj z{(S9Ut<Bp1zGnXyYyW6%*8Z=x_iM%c!(BW3muq7G&uh;=YcQPsv$cP+_TQ|j^RF-a z=llFyYya(K@U!P#f4lZ?*2JsxPuKppYYo@AIQZ>h{ev|;J=K%T@2MtCIDG%Z+TU3F z>udkr8lM>0_cOI{`M1|oKc9b(iDC0!+1_ovFV_Be?I&wrUeBNI^J(q>FJ7~?vwya0 zv-q#g<*Tjv+1fAGzFzxgjXpoWp1-`-|FyJI|4-M<%dGxv4Ilnl<HN-|?qaQ(Gu-)_ z_kT%EPd@5;FJ>(+)?(=E9_j-}ed%+qXFZs~AFVyD{g>oDi_g^k)f!It&05^e-d>Cz zShMid6OF|^;`%4+*Jt-j?5x4_Y}RnZ;qmX+aH+PM;;S>e#xD$dr7hj$&YC=!t&6$q zPiHYO#h8iOCwIL%pEWa%uUIu;KI(tg|ChD@=gRFp)W4qeXMOUf?-!SU_F0_u|FVYX z|GQ?s>GOxX{+nxmeeHi*`_IjP7W4P9xA?>hck|V!nRgHMR!@A-YiG_s+x<Ve>>us( zpRWDuwONDtevR)RuKoG-6gO-BX8)VD;$L_D7i-S_eYc-Ax#9e)%O?-+to3(V3_ssL zSo8PzyEXVQJ8!mp)fWG$UU0{4)=u8Es1|(u*vZ}fkuOe7IC%1%dVYDG%|8F{HBXqd z@Dv|kIQ8$nwpZ8rKVQ?k9JS;*ukS~CiW4(y_47zO=kkj^zsV<tnW+CS*XSD8a_RQX z8lKIvGdZ8H=|vs6?N2;B|Bp2o^%mBw@57q>d~yDEeR2Esu1|h1yPvgxvDS?2^(My} zA8Y)?;1o9hqj~AAI`UuFXpm;zYwwb{c*E}O9&65gI22PIzV4f|=e4=)m;1!izPsYS ziE~%t>4{JGXLc<Qe^wj~`Nh#>)?jsR?=Hd87cP4Lat;4klmAG!dKP1z`Z7N_;o(wU zIBGL7|88y8=+fPZ=hJmoZSgdlHFZB*<AX&f`Q^^8Pi~K9Ax}J>ox}T|*YvN}SwjzT z(yQ266L)flTO3?EcMoUR%^e;K2Zmm8f^p8L`;O1)KYMKE`e9+E{kzL2j^65cs&D3V z*;o7I!+{QP<lrsGnZ5H_>rOXsel^9$JG@z6HLdZ7Z+&vU_urn5H2w8jI^Y81<W|qs zr<-&2X6<!NOnJqh|E#N~{@>yoC%v8XJ>&HhPw{a)<Ifqs^<7pYj_~yZL+`UDuR8W; zyzg&k;y<pz5~IIwueCG&bSh5|&31OJzS`El39#kVU-Jm}Y0qY@S*UCO)_ahCX&1IU zTAg~S6<%C$6XTg?A9nqI4W?(9`hQ(J-&1|S^ghm-GdcEgo?X|^{chpJC+E>O6JGjR z_wC>lf7Y%>J$C2t_wOFmXl})L)^~IFo#oeWnDx}mo#UcLGdr=$<D0c}4)XZr!Yig( z&UF?a`|7*9<@38YW}+`oacaqRruRD+F^{yCkB_I`>5ZFu=RH1WJbR{IbH&5`F`tv? znP1QD7c4qFuc^s?zE<zf^ngd0v+GmOx4r}QqhA>6&Kev%t<zi`dwgJvIeqpp_!vwW zFpKlVQylG`pS+8!=Ipszu=M@Eu89{17Z=|Z=i=Zxe_ES0@0T+=&zih+vv)54yR|eI zua{Y~esmAgM=f!9z*Q%l*|l?f>w2n3e;b_B;NzOO?t_@;wYlt<`^1F?bQ5PUH{98^ zJbqfR__;@Fc;<WEwVLAT7SH;CEv9&N+~IrgVbA~$4on`NeAZ__-|Su;SYl@_zU`Y$ z`S>`a!M$hr<#pHXS!bW`8fJBID<?mFnx(U}fuVjH-8D#8elg-_4Nn+x=c`X^T;qqA zUd8&&IBO?=ed7i%40otIBQLGa-d@+=j5<GiIcv<uHplausIM^N76&=r5!iIZ&pKYS zYdXNNE>=Dh?@p)LoiFZs$CF05&)TE+z>MLkWhTE{yX*42zPaqnec}LnuC+T3gANR@ zc<Rgk)DOSzR5)tKHGSpcEEh(aKJ9ugA1rIJ@zOgj`S5zgp;<YHPw!a^$GYzgKH*fa z_bL9p5A}(!v*$H@*w5GCbjS59Zr0Mvy7y5JX_5x@9)Eo0r28YT>EAs%apmeMAH1`t za_d{4V(^KBp3c7YsvmJ`!cLF)tI@rI&BTj^XI)Lb@j06{*e`3d=1!!Iy&Q4BS*s6s zC|t44ZgzdnO}x6!U)RcsTeGMKJvr0wr|t^A^*_7rcRem~?{3HW<S1YNv*ylN<0&>y zvul2OtEI15yXym2Zts<~9`rkF&6MB%tW6KtX{cWLH0Uf%i=RC+Ls<CKW9RnWU%B|e z_8z3&^RDNzU+&YnJ>78-SM2Qi-CDitO}}ZCwomJuweQxPi_^ob71LS`zxO|1!&e;6 z%^x4SI13kEy~wwowSIr$$5+kt6O)Ew>dTsD;rF*p?cc7+feoja^X}so_s-?&gT)uu zV(TlO=N!J;IJLU}^8Vt=oqf^}XX{7bG=6o}(3j`Ewtc#t`tX@&8qTiocUye^*81um zI8)!ZqPzH3f8xZvuF)ADU%E7#S>M-ddT}4<PZKrM^zZKa57++Q+N{BZQ~&iV@3S?z z>7zD({hardAI7Y`^__US&gGwV!qZb{X>Y#o)?n)?ozL3oa?a%5Pj}CA*6QQeyKW|( z$-RHe@ICS4eD>|0g@tP|-W7g5&DzOb&2pUeJt#Ll=<umLv%&kE70&nj1&7UL_xtdZ z^;i4v@7he@>c_qr-u1{I-?`!+-9dOKRvLC^-Dfz@YjfF;uYLSIzwfTgg#)+wn*mOI zcy!NZ*YU7+hutfEilc+?+xhR}X>NAD%i^5N;e+L=Rx!on0{@J|CvK--KL1^hFW09A z9dI*ud9-tP@4eZ(KkCBkp18Ac;5$n%{mfc_lRw+FJh8KeFW>p!!uWB)L#&u^)D{ol z`@pO_rwNX7tY@t|t*7Sqbe)x}|2Xn>uHGX&F|$^$^^^wZw-ko>_%t&d?`QQbmcc!> z<%?UjW_@~eZ@l-kP!DfBX01B<JnO>~tByN@ll{s6tb+^O?uqzWdtFo48LZ}U=IYJ9 zIn1u%y~PzbF`w$q@0q774o-FTh)eTpPWs2e*{tQqnV+5gThChh#p#g_X;;h-ndS3h z<HWvPQ-9Xfg;PK3)A*d7Gjrg7TAMX-dXfA7T8sPqTEj2)yzjGqXVtY&ckdy*^Q>OQ z>C>6H_V><t+&^AxT*c`XH}Unr-z>`Q-#PUD%AYHzZ&WpCU=6qY*|qP(sRLhgIq$gj z*^@jv@}(F2d)+i~rZ4fh;N00ci!`|RIvf9pmzm)2yd1pvn^%3PH)|*N=gY_cr)%j9 z6PNQ2^xsk4Z8gN|XV%U*`)cdWUYvLsbf6R8eLl3AwfkJcd89!;eBr5MJ!|*(60dWX z;>%H^JN5pG<74`rHGX$E{?5ERdTI82vv$_j^Y_*E8|kmD`OW;iHkW<1Pd$bEVb^$= zci+d(JmZ$O_~P%(Q%>{g&YZIlV=o?ty(isX*G?{J-yNGh|F|aJ48-caZw20BVY3tO zY4@`xC+?4Qg>j#Oyi;%cw`#`!QyS|_-(vMqFF4QIU1NRV?5SV(SByLwpMB2me~514 zVCokaGh=tGQ?Ez3&gnR7=X+I8{BLRZ-Jan90}r$FH}zBRiT?GRMl_SJhqr!1z@9bu zaa9*b|7?-&-S@c6o;Bx3T>sXdi|M{w)5yMi$cL9&aMh>Btf|N6tbS(K>17Q|jJ{zP z+j|GE@BQprE-ZTJan?RwYq_+VwUaYF#XD;TvuiQ1@OLkoi@31ENkd%Zq+5M;4o9w@ za1ZCaJAB38?;IT-^`nO{;|t?yZPwJn<($hsM_+fo^prDeaiOFB_;3x^`qcNc-N#9N zy*uyTz;h07*3wQa?&8nCed(nqI*5mN&aC)9U;nJtPdcmT?s&q3q0X$8TMzf%#5lt( zJa<?vet5HXuSr8O<=`u}I`HH;XJYxBcjx%rHGOwi?3rFp{OX<e{V&rS+-Cpi9eLh! zeArxe{+;Ff)tcV?Gp2s}ouf~FxashBcFp8`d6`+yT6e|WF8;6Y`me41k8A1VES>3~ z2U^o}*61asy?=-C^R?Htv=m<*ap%A12v3Y0SZDu#xO@M*<o|vRulQGY*5}Uo=S5ih zYIf(m=s<&6(?>nWkzb#3=m-N>Pv7)Y*R&Jc{R%JaQ;&bYaq7GtIQo@aTzRv;IGsAE zsYiUA<0#kjJiGIlJ^$l1e*gDFYRXaH93IX2(M)Dzo5kPQ^<Q-s@akC~XRmnua!s#z zx;x&RbfLR5z0mYi8qS`>(35yL-3xV|*XFVxUwd4#ce_pxeASKj>{@;IkEXEI5Ffv} z_WaBo@Ua%-+sW7c>g;KKbDfE`R;T;v{lC|NC!gUXKI}Vwa~A^#?ySL}v;Nhsp5Ac1 z*M!TLCiZH>F&FjWG3!}-w+0W-*ERF)PKGn<6aR15;_-3U_0coEX3zZXxYtX^zSnVU z|Jml$GYohz^zXgW|8Lit!G~Szx4!Fh)~82j)_srUcW>a*Bwgk@<F`IFvZfLISqlT6 z_~*5`?8|+Mw>QtUv<~O}u3^>3*}t=T^{vBC|0f^XhO0Lm@WW@;@S~*}HLv=j>Fe68 z!BJ0Mc(dzs?%(WQjqXTiaz0;!4;ya#6Hnjw|DFBWOZuN$siEg;xsx#CoqyK%eOk!D zQJ<&gFy7Lr`&1qK?rMDXaQ5+T_i3ai&S@G>?|FH8Y(6JGo@TEuZJ*X=EgWkYdb0K{ zD4$MzaQSe;dDg1i{=@o;k;flLbz#g}dDh+4_q&e!r})yi`ysxyUevUwLz?$~cQ$+W z^_qI_7+vwf8(;RcHftwO?~wi3zg)Os;V^4r-En=K*lKi!=d8Uo197nBm<KF;-D|mV zv`$w!xX7cy`3~sobuGQ+!7KOV!Pgwqc-E&E_}2N=V(^~V)MbCR27lH*tc53*?}yy) zv&XRXp%#o&qwco2_iLW@W^ZoAdl%r$n!cS`)63kxTdTiv<0769ei(GYN#AN%%Qv$) z^j+aAuUWX$^r=VqaKcLW6VI7Adg2|w?n-rWNsHz*>ucU|!OwYf;%928i$i^u(_Y{3 z<l>TcbZy>W?>gNcy>qkY>7kx|nE11})Ej*M?n8Wjy}nb=dY$#t&5Y0gu36o1JpDEi z`?{tFoX$Ij13uNH!OPmL@j0{h&!6z*mOr~bId$*kh-nt_Ib)j%46*KVbA8(Ntl=#e zN4%TI>^khbc4FY1??&&fe&EC>>{;JE?|v8LrP1@Q<*;{aW^~uZo(}bFFAk30)rJ@5 z>>5`6yzbilYX0HO`rtnLol6tA&f%Dcd}~_HS~&F=ALn9m<4g1E&-#ji*ZUCv-X%|U zVc_Ck+gm$(TAQ^;{i~%1an9AK&+?q<53coG&-!#vS-fDBn@^tp)p+!N@ZWjQ`e2z$ z`dH_a6CWC<8y#oOx%zS7!;_Z9c)~pI3LfWgk2}WwJ4tIXG{O@<wPDtmI{Gheb}g<P zeZ=3HJ)UU`mrp!?@L<oH-o>_tgHtixou?}X2f1lyT^(zA=b8Pi-SgDI2fp|)s}q*K zoqu-4;6H2W1i!n)=N#^=ooDfI<~^kepZTd(-FuF+S?k*dA0PQ<`9pH!YNl{#AwTT< z3~;K3+}?c}d|bmZ%-OYAef930Gp;W&-4Xq(EvMMob$^f28c!C_`}YI~7<x%x--CLC zJ!_9R!<Fms93`@hUx{;;@s%f+J}-tAglKDy)T={&8{!P%^xeW&r+GraC`bCdUd zeHW`XKJk3swcgoJ*Y0y@_Ts%q&9!@h&#Zl_SLfBW4zoKA8;)nQt<PDXy5IMk6@Iz! zdr!~zum8^QDXw&QD}VMZUi3^;emZ)xM>^8g+?sRuA<ph{+J3m!;&GWZ@!pmD9iyQ< zxc*+vT3R<F`(`KK9ecgv&c7ex_5Ue-X3y`vz<a-jt266aqmQ+@TF>?5J9*b5j=0WR z?}eWA26xudEo^6apZb5b`*7r?NAI3*BMx$Lds@>spI-1ee<Ox5>xc2%HF<Ew%Ad6~ zhTq>*{^n|px4k^P<6%8(akTE--H1cA%&5CymhO3VP7EBw{?uIck6XIQ!4al9=5_uK z*MGRx6VK>+#?J2JYJJ`p{h!|fnBB=A+9Pe!Q4igX*)=>pm<Ju3+3dPm=tcix>enoN zbL{n_uTy*V<mugc8qBVnm9;#vusu(H^@)?5GtZi4uxG7%X`k-aI50eMhNTv>c2+!0 z9A+&(Vc<f8lf#GI!)SKavz9Jr9e(=4hk4GR8vi+X&SKxSuBW&77LRZ9#7{r^t!Mqi z>ORtQ*6#f~*ORAsarSh6U3*%awR>JQ>0m8~W}Z0w5Df3RJN4aK^PXLI&(*YUR_D9M zuZBEv)jZ$T`#lh+9=@}N@BJN7tMhskE6<sJ)s)wLbavLwpLV#(z1Q!*8}s+~PECI& zs?|T^nN4@}_pRkF&^pX|t|l$(PYt@@{QK6K&5@6**>pE%*Y)+fYh1*<rQ7qK&1FB| zXZv(?hGQ7bg1`4e&)=;5<2Cx?(wVxSuXVSawRaYtIrrZ#X4l<6y)gCXdaBWPjc(3o zO-*Ok<*OmLcT;^_x-aHrKWk#}>Ax`+>#TQ1Y`y54AHKSHz?<tC?wQ-!{hvqUBbJUZ z@4dgf{ON1%={(oE{=@OU$2Xp0U)DU`k2DH5Jz;cz>6yQp`sc?(-~4ku)q+>fd7sKx zm&rfx|MTwWGCk`FR`<C(6VB|JI-gxJeP89oUky6+TOMDWPF`lBR&#?{e)B3`3_ftu zLC^Y`wcbq}`R%(KF!*Ne(Yu9rvGUJ5e*V7wAwA$D?!5nc4F6@<bL~$(yrVdOyq@CE z-yQnbw`Urq+g-=*k-lgu4jyjJb#|Rr#qp)LwYz4IfA@-hu;|G@YxZ&ZzI=JT1LkQD z^UUj>sj25ry<2_faixnK=Kh_ye9vp}PIKS?Xzh!&uh+g@`)2J=*M7P-YkaIcIeMP8 z?nnE$n?DY;O&fXo<rC+;_}R4{oST!o;C$B7Mi2HsUZXufEz7~-QJ<fx`?NW;_7B$X z-@(`G498}Da#XiI;&$G(-UVm;?W?KBxS#cB{dzM`TIn%dIXG0$6NWfzGs@TB7domv zYcT)gS{z`hMLRu;3s24BiaEb^&S$N&I6eC912YZvij$gh?=`}K-@A^N9#3xdTFm*) ziCaGT;l_8?SO2(m{^%X=o)*)*zS}&t^iq$#lf4_=V;sck!#B&CuX`Xa-Z;XWwL3?B z$5Gtb&z+|@IO=qt)K^=rxa+I$EgmpujbE&_p3}PiVLKCN-95}#ydLV;nb___@4A}Z zi_Xq|^nKR7zYFly*Hc>0uET)YZ1Am5b<^h5fxrIJOpf<4P1KT$OInNJpS73kDW@5z zF>CHXwbM5Jp7%_@@78eO*9YwSdD``?#X*17^;ECi`Yp%)?4j7-u3s&AvxZ-Bt>eOf z-d+A#d+VJG)A^}A9KG_>(ph|AI*<4Lof7xi8f<s0dxmR#XV?BWh`(AB$4|rFA-$WA z@4x!}_WFF+r;g&}_~!;^&BNYWu9))GjJH1GdH=nycf9LeY;%NLUOeehO!(#?-yIOA z&thiRaO7Fz=bX;+X3g1IvshY*rE@b8r%ss9yPnIw+@~D-b2d1!k8AQ_>f4&XncJ(4 zm*?5T%kF0_PS)uLqg?)U!xILdcTC;hQ#tj0_VAO-FSqYScLT4u>2KEh-2hh~__5cu zV$y2XC(gOrYS5wm>^ffR;A`K#|IKlpHvKb3--<I&ezl)=J=Y#jdfBV(j-^#`=ldw; zWo_1qv;MGFANW|$+9SRAo3}n_qxW=^+pNwzDkn~2;+-aXnYH)V6W7*at<Sl{F`Z8w zoSfhP7B)xE-bebt#@XF^G@Dt!IGF0ybF-3bKKM1K+4b3{e&X!D!x8^hy_Y?kHF&>W zQ=|H`>-!A&@P~<OTFL3I!;ts9_W5N$-=`QoF?sgxN4++;dg#pD>$`b=pC+_UOMGXo zyQr=`zP^KLi5L91&93FTpYZUMV_lE1;;mlaRamnozIyk2%3qv&Z4Vnyb;B~pG;p8r zafSnvmsW9!r(UYj`#0;8*WDDur;hr?r;D@hy}I}Ke#6s8Y`Usp|GHK`_j~chp6TaD zYkE9$@lfkgf9{B$<8r?r&3ZPbKI-fKP32EFxaVAGV&5IT>mFt`W@EbtdX*=C*32K@ zZ`YbvXP)AlbN;um=tNieFy)rhotX7CQ!&n+iJdj~;r-g9yAp0W{oOe4P4CygTa3@w z;;OfFseXI+02es!)U1h#A05Tg;jP%-3+MQSea@hF78m{g?KK?PFV^_gZ0<A&3toJh z6JN3FdUuLXPZ;!^H9l)N?o{_G3|yUw!>PF0b(+(_ov9AIbAB+ZXI`&sX5iVq6Q54c zyH<;RvDSMxyJq-zzaME3cX2r3&a6Lm2VVAk*3#sB|N7gBXSMaMK3w{zU3E_l$`dDN z)*jtMdeeoTw0XZqb2aR%ea>0E;=+DZj}OkQiGziYTGdnQUT4<#);mapzPauiJauNR z?>~NN!f(!M-~EsDs5h9^sRvs1w*hD0D`#TOu$eWNw0Xp<vqu_*H;YN9v{pmjsX^R) zE7BLYSrglN>$ISoxb&Z0-+8BPT<_<2iNOn&T4JBqKELc&`;1pO@@OyK`!Q?s`SB4a zhYn9`vvz(L^#5*6yqL~BVKxW7KKdT<r^|iDKi@O_XYK2?YM8bD@xrfO+?Vde?3xz! z>khZpUpes=TYvc2&zijWbw|@h?~i`#-}^XugbNdg_IfkFS<{CaV)*<sTRP0Hf3Zeu z>+XTId)GaRv;NYA*6A%)ZE<pD?c@#j+^5&;`eES3M>9I$D`&1}{n^KhuRFqTU;o{~ z?y&RoeZx^azq)3b2F*Zy7H)U%jFr<pEdNn$oaO0D9G-fewG$5)^=M#j)t+6yta-|P zzjppjdEWh8_Q(5dM(Tz0slQkF!E7$g5?3=%udwRDZw$3h`+WE87i;&ww|X@by!5Y6 z*sp78R81J-%pk2k?D|n}v;H5-S*$+v+jqsj`7{G{S@-1Ku5rf?-*4BNT{v{WoBi=| z9)EFq!d36^^%L&wIxOqnujYa$KK2Zjy?i?IRSVDbF28S%_<YraO%r*1^;Vpxdb9Qj zN8Y2^^mpLAV|xF6=5@|NpUrA^9shX#czyblV@7)F{)#z&7k|C`u<*xe)?mW0=1WKG z^cB-A&D&bd&dsjcvuk&^yQG%&c?ZO%uUPwL!e4*1$L)DdUFL4$D4xNtpC9dd*6=YO zXRzuO=XjZs{dqs+d5`g-BYf-dXV>=`oHJ4@P1LDwdeNY7v$~!8zBQZXH|u*@^Ms4X zxsKE8`cHj+vHSB|qz262tev{5r+?3|@WfmE*-JX}vEuYlEDm$oPxo1GXYXg9&d(fk zZD#n)8ZPREMT0mv^S-5bvs7=^?sv96i+}W9=Zo{pg#{Zo_1zn$cX8o~!O4tqRIeF} zbEdC*{Hzbx*EM&eI2hJx{3y?y<(Ywca%Sy*N5Aho(ck;}@6M<X4=?!YIKxRVoqMY7 z?7ZXp=5ro@Yra`~tKPSJMo%?isQakatlv!3W@$we@#p>e#qPUTu*JfjweEMkPOQ)O zTs%DM^BW=0U6{3E<feg~-VZUjs@s1{kc)#jGn4zYHfwzGp~K1D*{rGWy*_7A4d-gp zf}ZM#mn$Cj^V(c?*QXkNujI$a6Q}g9zIwCvvPJ_v@rf-TZau#2de-oZclw@j?s?}l zV$Q2ad*`#}8)FR<KXLf76H~5zniP|N_U!k?)ieHSbM_KfHR&~LAJ&RJx#2>uxOk=+ zP0P_Mj&j3qKkIY9Xz@eu)%i|T2iN91yT&bE{ONk{U2Sz|4Hk~pIDfY$PaiP){+!%f zJ1^g?^g|o|r?pwL7jOOOzB>DC4F~UDdYO-0&-l>*_N?iFpKsRG$GQ6Y(|5eoiIY4% z&f3WjcD2&+*Xs+nob#U{Vfa>7*WE7eyl-j#NKah#p(dU<{19!M(OmIyhtYkZL3rZc zx;yut#OcXQzE3y!dZ_QTqs99*dw8#Fv)0|`x0f4+J>BFrJ8|~iHSx2SzT#N@cTe=L zmV8>(6JBDU*Tk@QYigvs-m6#t`hx?%UhA7rEj`}vdHLu4N)Nn0u9=zo>V}<8^@}r% z`qo!H%c)O!v*vw<R~}!vr)Dta(?L8gv!)mRJFoN=^XPZZ^ZK2!FW17;$7gHsdT03T zXYItr9dBp+v-V*v{q@S%jI5ir9_k5(UY(_5Ir=?0;mPELAEvt9G1$dC?Ru^=T;<WY zzl-sh_0cl^)_k}$H@r{38gznt;^0UV@zqx|ocsTFW%lfRzx6HNEMC{XZ^mh$UUS32 z@0;GG*>$>FJBP0a8p9B;F5j%tNFQ|7BmA^I`%3%tpN;!{YUwu()u<khxK!)J#5ta= z>0AHSv-T)QyfgPzUG=)poxQAY*6j7C?^&Z0Uh;5t?y27M+FbVKKE>I~O>25~hhV{h zL4*5uY1S8idHwc<tET?>J>z}eqgg*a@E0%dWo_1qQy(Av(~~cr`NMZ7Uaxq#`Qtg4 zPrdl+Grr==iGwr!<431B;f0g)Z`Znep3a`uX6?kWhf^=s)&70*+zIc)z2>Y>4>&rj z7kb&xns>;#C%x!|@AKMR_KSTMkE8r_NXy;>an+n%ySL)aMvgPjbkMt8Pq}K(+WBr5 zOK-V2%o^VI)wVAG)YZ8&HE?OxxWN3lCa?Q5yLP|D(#)BBbA4Si|1&<`@IPOZBfdJY zy4TI1_esrJgC|B!>sdQ{5T`Z{u<x2Zt#8)Cux>Wi^_H&ZyB3F+jl*AE+FIYa>m6=& z{JR-_&zkR&Jo$02-;+z<B^dgUH)~?#)3dy|%=+SvFaGMDwVroBmwkDi**Eue?fa<~ zy~U_a*L33R-qqjP6CKi!UoYJQbBe#`c{aNjuNEHF6Zf<>YwE={4)?pSR=nb&7ufoO zABI@_S#u6cEdN~3`#Fs6VjSZq77h*iJ7CYsnd3}+82o4L^SdL?JJUbcR7Vbd>esAZ z*Yw8++dUGmC*0%eygs`#;^pEoYw*r>^Xja+KiN1n?8WQ<oX?r3rafLP4F4NpI>G54 z#z#-i<NmViS?gOtgLIJNOdr<unI@mFPpmq>&vytnSaS7;BRze0^z2NH>WF(ZuP~g; z>v!brn%>U&<EBS_q?z+(Sv;)gwYlu8eTuV}OTV|ik7AtTtslBr&zd_}T|BJS5>JEb z&#^waclT(Qeq#H3dftIkufAt;aFSyU8^2k5i(B#CKYRUj7v#RhD@=9ti_@&t=MS0t z)0I<weDj3^yI!hs_G-S)!)TWB`Dg9qYX4!)8NBj*&-8!hSgRE$Yd$=isrjDxz7O;h zla4rcPhj9!FZ7KIocp=hw{qb+SI0LL=6Sc@?Y=vyPTKIvoi#nH$*l3N-uXV^rq|}8 zCJkQJX03ed?vOh0@bdKg^5k*q22UK0PiwP=KTf!+3#0nQI5RtW_0;=ESMvzt><iy? z4=ZdO%i*)0wQA_wHv;GH*7T9K=Y2YLzW;swPn#1T-$%WLKf6}59A|3H8s71dR}EON zYqM4#*7XU)9#{FaPVYz9@IJ12;&uN%(?D$;#K5P&^{l0deHi@xt=Ah|Gf+SL`kD3J zxvPbH_aV*2S?g!k`rjeLK7R|`vCEH>9^&6UjX#dXzwEj@z=sd)>OJpzF8gYq<-riw zESgiif4pZf^y7Z%wYtT)+x+${?CvQp#WsUkpMKP?FL8Q%TAMXF-lOJ76Y=VoGrLv? zNBzThF6U9qtUtbLiAyj0X3l3nYcS(^VxGO+b)-k{xf)^Nsn1#KeHF{6k6Gh?UE_;i zn%J8~y~eBWVzr8|SNvuT4>@?m>FneDR#a;?7Drh3I?lQ?*6-HNeqeMSr)qRh)HmnX zHJs$v$Lu=I^!#B>UcNBQ<;=&^?-cKydjwA%PdUxtyi@5R#tg)C-|DHDdOGiQzl-?P z=&aaT->Egu@SDAyG_tN1KF!=y?|id{7fcpc_4sEEht}P<@78znaNf6%f7b5$@~i#2 z);oariPK!;mJaS-9AI?+VCi$#;tVt0^j|EW`O81GbsvgRN4{G4_Z$4w@`u!!&Ar!A zUtfMNq(wZQ*Eg5_**<Zw_qU<m)0bbqy8_QSuAb(@2N#BZ`JB^AjPvfryIt#5tiGIi z%Ae~Q7di52B`%FU#hWQCXL9OocFiAu-1+YMysoeN?2N&x7xk-|uiD~z-{A1;{r>Ix z$@;|VK@2X|=~C~{>zm8I+$S#f_2CI89p$O(F1@VH8qL!V51jdCtvc47!R%aY*v`A3 zkNzH{yB@k1^6j72=+Jwm22SeFn!dzZpR=`(W19bvzvImePk8FhntN=mCr{dmJ?rz= z|MzkEVq?P;s|P&IO~0qP<A1a!=j%1|{ATS>*M7P-Ykb*>A(!?vX6n$d**M2LP4$&- zvum8v*IKL|o8#<S{AX(?c0D;yqaQklr_GTEFP`p2Jh}^N;tQW%@y3n6K2JTw(am{$ zXV+rky{?@zu0HN^X3gB>rbT?un6qaX;vdDqq7`g83~t=t%DMCJ8$bhV`Ak2vmS%X+ zKppF5l6Gd>-wZr(b8p}j|GewD?5o4ir&l@MxxNkj>7ZtP-Ff&eqBl=C)qE@7-w-_U zhEGqmVZ2pG|6=9otsEF?zLht7<{rwUZ90qZH}m;h3bt5W^dU#xSyRiNf7a?Fy~8e7 zO#0C*-T0gB`9AQ&=kxn-*5aUl>ojxrVGY-lv%Y4nymPHjete(T=CZH$$zSeUdWmno zczS2Ullz<7dAjwj!L_-;;h(ja>)E~2<E+_>gA1Pqp7ia$>)rmYui12;#hm^1-pu;- z+8mpS*v@{pYkj<~bzhw89~WHJZ_cx8T=Z(KHXh={pEb(SBaG@+GYov?>%U&^Jv)ap zYxSp|eH?JUpVdp>Ul`qExpKt7cYkK><$A)x<NIboW0>_WC;jH;w~v#4i|y{hq8n|T z70Wkkr}oW9Px9r+m-D<fm%0DW?A=f6|FD)0X`lv^KWi}QQf+zm>N5Oh?c{`uIA>z2 z(cMmG*u{v);jG;pXZ<IBvsNcwXKXXjgS>N(&#b{v+c~oq53?AUzEf|#XLo(m3@1IO zo4&p0`TC8bX8g@04s@6`Ji@H!QzKl(y<AWAoR<SzjD2}@R_Ba6wY%#Q)_0rZ%pR}j zwYluwKH<WI1wYKEUF*LYIGeST8(jUHL;TXE_exClXV>*=O<Oa94TH`&dUl34F0*#( z3SUjnzLB$Q{ME2l7d8yOz6JH<j#PVgt)@6VG<&(}qn`EIqjP&^J!>@S&cx4|nZ{>! zjrZ#szxe;K7B}%`g$MiTn%cd4*6E^l+?pe;X6?kYr!(x%oA;?td~hvJ-SX6`kGmet zBEKAXvsSGz{rAgn*2K)(Pp&mCX4ik;)PFjvZ7oKPS%b@OAGRk=i;*J+t~sZjK4>y) z{LP4_eCcKF9EKR@a%W9_cgdOfa_ZaDS$f6`w^N^DP7Hm@*AE@;8p=1D=7U!nIIE9) zUV6Y6FV^#UZ7%zApSal9yBLP+tmVh?^R=^%xbWw8W{(>jakEygwK>rVZawM$QBSk} z;?oN*ean5?^{k!w-|k+Vr&#M*!=rijF5|&JYifwM?zc%Zg8@&SS#z$BX74Gt-)r`1 z{JQHj;kTYOSaNy~+T(+lJq`cX+N_x^{%_&^KK%7V1J7#BuD|cQ^5czBM{o2v^P4x{ z`8Tz`>RVkk|I->A{XDJF0fu<~-lw_t>CyhwpO0?1wN|5;YP;8Ba8ScM==!`imwmZU zK4-HA_pIIB;1dIf>03?lX#s~%Ts2>h^RT-E_~M6W81mIR^_Hg|Txaf4J>K6LF)(Hg zPw{H-Rip2WTqdS7eAUKHjx}E~PrIJA?v8r)_{8lIS3SSQr#!sm)?b`n);DW!<?BIS zy@)F|49~Fj<h*^{#q>@)e_5Ng<`x#7`o7oEBdy$-dV)>IQ^VQ4+UD-;H)~<@pWhqj zv&Jumb#J<xv%Y)3?q4(Oy`XD#tYPBU{SXhQnEIaeHSc21y?DLfe+%(Ht<9P~(&SV3 z`QAqy<l{_tIQH@MOcR=l>AZQu`D{(k`fV<-!g<;CtX0!}g2ngfJ63M*vzp@7h-Y_s z)|X~@;OlJG#QS#852m?(w}#`a#m72*npx-J!Azgx;alrR9G<YB*XFXH?6ZFO@Cm2; ztakNj)_sSi#-pCqdR;RYG5F~R|Fa&vvnO@L&l>!=z_XsUm+Oh^@7BbrHEXA4%?@6( zh9Q2|&e#vT7e}k}9csqsJyQ!F9i6jxYx3)pCMUjl^H*PtZ;8Ie#YaBhtkI1Y_HpmM z7oQetRJS-eYRq+JFXz-StY!=2+cmiT7QxNA{+#2~JiANv<NWO9W%sj|266lG`tX6P zp1gR8d0Lw_xalI+K8#1-o7r<%W_QPQ27~_2^zMmo{Hv8to!h^z(V$*t*Y3&3>j}eM zn9DwO7wQjgck08jrbT_Kfd`+vu5Wv@jjvdGikY=Io*4LbuTQPTH&6OlH^Z|IEd9rK zcKx#EdFs{o;_Tth#~Hrr=%cx&i@IW%m}WJ*ZdUyr?vB%??^}JVtIn+9*q!<A+QWx8 zYjL!u0}lFiKVgWAlXYC_Rb4gYowMn?F9+_qk0%W0^3&e_JXc$t-dSg2`P3^`A92X% zS={W}`yrQ~iFdc^DK7el?VXWN2f6x?Umd(>%^l|J&Q`-&zI3*SSxoxCww^WbkeWEW zu9-!Bg!8<<x$Kww{LAX5u3Gr$JHBc+v)}BxJHub!o$H++w^@S)*Sc?gIe3b7_D5^_ z63b2;as7^oQ<}{c+yCDB<P^Sot?|<1tXadUAHMn!PXoElJ>K{^pS5OK&-q{XOuRnS zC|51}zGKDXQqS(=Trr*Zed>R=^!c9S@v`=`Hfv(5Qy<;ibnd@<J>sX|c;Q(LzOZ3b zi%<Po<Bz94PQCOrYw@qQxA>h{@Wa&?PVm&W?;AF|<~LXPOw6qHp2wf>tX&^^SC3w> z`rcM+*7v%muIH>hn%T)YE#rwpJj<`YpYPf88vlubzZ|{y-aqYn*7)N|w@0(DKk=sq z*8ZJ@9KGLri@O?WTHk%|>5bQ{#ku+7efHbGw|4*d<>sR!->mh1=j;8_2W)X_Rd06v zZVes{aD3|<sZaLhn*3Qi>*y6mb9FARJD~<XzgrU*=a*g28ePPT>kif{oze!s?y~ub z=?sQ_@y%R4{Nxt@wCh>xKGVoP4)*$mMVIDQkItRJ<Lmx-_72CZ8e*&Kj5cu8oHh3* z&TyQ;rV0M`)p^<VtoggpS$z0msb@|1*R?SD#m1$Y`o#sW`hs6PoYvKhPjkn&zPnd) zW=(#1Vyf$`yJVdXIMx$i{Lj4RqL$cM(}O*|W=&0TEWGB}e)jBTjRyTj^6dQiI=jCE z%~1_K6wlB2XDvPX;-;UpdD-=>rI~fVN$HmM{N1Pe>pjqudgnbkb=ALf9BI@nXV<vU zRsCj)s~A4<dXHbcaV)0ZXMJbgw|dSmPmUV+S(`WP_}0_w`eqHjvrpYO?>p?`PELI4 z*CTy>cX3cdPi8)sz1t@rZRkL&u$v=o&R)`p&l(?f?N9#cee&ZAzxmqZJ8O8VN0(WX zn@0V!_n)j!OgzG&8K3`q+|Sqen|=6?zAO4x!)!eN_S&rVyXfPt(*n+0*l)eFw3#(? z=pBzMzq(@d)ZF6m<@#tcYjS+U;uUUnaTjyyE}ka(?wi-SS}^2T)8P@9r}fX8IlZn` zPu@A7*}eOw$7T*U?VRCqa&-UV5LUVUzL(z|;|?e6*>$-1_kR6$*J|Ocx7K3HPXpTN zkN*)*{%YeZmc`vWpw6tN&s*;eeDz?8@tfy)Z7%zApUoUTfA^N3$(yylnXv3XthJWY zozf?NGfpFZ7I)gaGwRCKi#~s|CT`Z6kF{RJ=Cd~|{Z%v0@iKGR&4YHm7vVguZ`L05 z7r!(VhbJEQe)8)<@3`PmFa4Ir0VikX%!-RkXR~K&!?JER^1CCCc*_@Gk7-ATe9qI5 z-@YEy<cp74tErdj(dK1s*1G4`o#Q|Ux$%Jyr<pakxnkl$qxWl`eDdk~srNJvw30h( z<yx!VyX|`|29I?7c&*imub8yXPc!GR<vy>?Wk26%_e<~c#jBH+_@%+@+B{Ak&S?ur zO&Hw~d3<5%*<Nh_Z1btVN#|^4bJVKWX78ELd|<~<Pw~Sm4aDQ(UB^efT)g}H^0Qrs zd(P#=JLe*Q*5cJ3hJ5wXDBRA{OB{XaHrE<A9L1)i{p(tHq`b55cY9vX&8&B+-wS3f zrv7KwX>O+c`km_;@4L?N(qG))!ntet7N(k~meu&M{&M0EvwF_Vy<TV6;pj)~^V(eY z%|7FNa)bT4*8ONk%{9#S>d{PnIJ0*0^KEbjuU?u9>{+8VjQ49e@i+Ts)}0HZdsYAS z=$sDsc$~!GU4QEJTNuZ%?|Q^d?+iCH?_H8RYp3>lfX|PM+TzX`e6{;x`YnbhdxZHH z>&K<{NpAC@8(w<n_nq<7OFEw#%=+O~U(Cm~@MhO9Yo2FZJmD7Kte&oT+^Y${{%L>b zgg2~N^Ig*0U4wJR;^^Evrw&Z|TI;{~G{nDk_t!I@p8EG(v+I+inC7g{?vPsb3tu13 zW=-7dTDA0dzw@+cX0z*)WA)U=&3QWM4{q^l!he2Xvp)8V>j_spT=_p*o6BCV=c%2T zSrhL!sr>VIpB|je8cy9y+T@R?7=QERpT6^*;eWq2Yuzb6oWH%EYUq~^a>d)@GHYSC zFQ#{j|3_=`*`KY+pS2%)|HSuA=sSa>zGp2hnoa)KE5=h?zcs~+5s#nqr?pvY?$+l& zFWSFf!^QJ0tY#6OcpCPOsYQpMt-&$l^A6xsZtrpZ&|1!{!Lx?14|8sYvun8a`sx13 z@1A&uE8o0Nu6$vOg@ar9=G@%~r~T|1pZYk$vOm`}Xs-@zakF;L;JmNZ_Y~({Rpad4 zS^AwgAJ-qJdU#pitW`sN|Nh$@!AGp~YI@=w=h?Mb+R8ugeLR{ky!w80kK-G^?+(0v z<HJyEu4nH>b@9T_xjWz;gXdc?Yw?5=KfY?px26>{)Bd)d@wmd6wev2V_4&n#q0##_ zIb!Hgo!NCWu*OHMwf9WUIpeo@xDR6So;5YykJmMGQ%~*A&zi0A?GC`hg$8iqe%`UO z2Qw85L!M`~%*P#UPWmqf?yTt<=Xl2#H}&mj?d5vH=9hQgC%8<!^I3x-PXFg!7SkTL zVsO{Ly?dk<Up&fj&Yxzq7E1^D?5vT_`v3Ymg9)$xdSBdaI5^K*eB22+bSt)8&*J}R z*YeY&-s14QXLH%ReV*sAixYG5Yd)~~^{XyUYKOx=YsHHZe{!Znb($fJa?d;RwEkIx zK^t24oyS*QPr3b$|M}(r?d5NNvwQl-_1j&mRZnWnTKCo3xw>-VTD@6c@9H@Ny`3@l z-f>m)d{@#b4b*c!YxuwubKX03#L+J9v=KLJ^3-vj-sve$E^TJ*!&-T;)KN2BYdG#> zYtOWD7I(9!8w~m8efF%jZ}jWhti{c`?}_+xZn$~h@_*cQwP)962@elXxy=<%dDT1T zG3!6;<4u?RdWgq~apt7CK2Oc{u6A=v>zDP-npm~cPMp1(v&OFn7;>API9z7!<Pjbp zoKqiMx(l;wT9^}GbAtQ4rVsYj8sDtZ#Tut-Ru4b^lb`*psT)S$1U2I(4p&b-g#lB| zSxbL0w5|{F&g9RUKC0_J*sJZ?w^~j;r(u}l+&?*RoztOyXV-cVr!VK$X~P%)(>Lqy z-^ra^Xn;$#9_7pRjk$Bi3D&IX8RvfQz)Pdvi<4J+ow&V|&8nXDug`Qo^?AgXZ`R6h zuKDe8>rSh8;@CGATH~rVJ*~r=U01`pb89`Pt2NB}hn<#i&wJ?1d(q54+ck~TcXoZ| zcc*BgAGmm^7tgcy*&DsnH0|&G-D}rx*s~ZfYn~^@{rjeFzf00ZAJ1!gJ?-7@{f78r z?d!EK*S=Z%)3u+j%^KgY*3Nu+u<3c%bk^s*{`5hw`k7tR0#Ci^1y+5g)2z>3>C8S% zIWWU;hKKXtuIaZLv+J|Ad*<(veDi}}o%0NK_oz8{SLEQJjySVZZ`SA-PxtYx@z&jk z1!vZpCw}&4k8t(U9Za+5_1)(hhr9muq*vT<$7|MJ*XYPMYt?Q>Z)w`OT)1k(WcoN~ zSbz14pLfqp#Hmr8bd9svu=K9Zti4>%bTk)w=m#G;u;?Zy-K>2V=@1_?6Kn6;dtXdi z;c}1h-ifOZy{lDDz3bPR*jd9PZv6PqS~~oC*SLgJZ83alqUUr}mwjC8p3bh-;`h|M zCym6Y4eyNq+3v;AHvak+_q;ZjeYMXt?4M)Qf%Ut!z7w<Sw6v~Ax~pTaKkHfRH>f$l z4=3!W_34{_&gJ7)ep>O(n%d69h2;#+tiiz9Ivm>b$(yy8>*+l0XV<+4;!kbf?Ora< z_|Q3Cvuic`X5%H+Z;02mS>qD}A9nhwp?BYKvGs=6kJe_bdi7MUGyOMn`PII^6EAx< zYjWM)_iJeqw^`p0!F$>`v9!>Wbr|XAjHwepJ&E_b=kqo5?!9(KhezME;`Cpg*|l2U z6`1_9_Vt>YYP*m6RRccjziIx-uJum~`QqWXrnz`LKV1HD<0D^8deH8Em+t(;;P>0L zv!5UBzIWi%By4=@OU+r+Kfc`y^S2h4uWt!`m|2{6L)}?BzY8?ui>rNo=sB(LI>^BX zKlN#+UU+&)AKdke>&XqKKGOR9_KS-r9N4pFcINnTP2D)C|A^zGJN8IlykX7SqZ~Rq z*8^Q<4Nmp#yQAOjI&Q`L9_o`0_0@e$!`ZVi^#WVJ>cy=&6=$D5aK!25?C0I?VZfrd zccs~c^R&KMlZUf49pIV8iC0c{vv0nb;+#FL&EeB~8o`xkZt!S<6F;u{SJ!^ls%fo8 z9Q9;PZ+Yc(r+&7+FuFVT*0WZRa{KLYpMQPe;2x?qYhSOa4U49D=|S)8c}>q>tijJ8 z#_!e_mKlXroqNyqVdnK9XV%1)uMQtRbTxBzoS)x=+5NqS_;8B%qzMe%;alU7Hv0aL zYqKUsZM}Qyop08<EA`!dPD7YxC|2I1IXOFd<A$Re;`?tCu&UELCr*s~S^K^jioqF| zu)1UX)pgdt<NWEaeM9w6Z@h3(_eX29cGm?Tad5m7)?%L4X6=W(!`*rH<uY~WdNwzE zx|^9^)D%~(`lG9Lyk^%hyCZ2*{PUja`TOoN9^Fgt`TI56;L}}6>zDP-n(s!v#QoG9 zrhGWF22&jFvxXy|o)|2>@XeZhKF_(H_VDtF?YoT6ti5$d>2TgrT;z+dXWYW(vsX`? z^|xzjJG<@<*HfIG(L!t*R>PToVLG2Rchg>e{@w>qzO(OU{<?m3oS)y3=iUF1x!?Jn zy{U2PfB$!KYRqLn<XsROUU#W`qb{HGAFa*W7i)BB&nI3Cz442q8Kz}3rX>xkLBI3t zY4@{cK7A)Y?m8awKVLJqX2{n&{qtSFU&Doe*21^$Zs2=zb%v8%eouLD#Lo4Ei3<*I zVc>OY7dO4i(LWq(acZd(?)eV8lkl9&7c*;TPk8sONf+^H&u1312K&6%ClBXvi*<K# z#4lg@->t8ioac95xZ|x(T6Qnep_thi{r+YRceQ8j<$Cs>tJl4OJ8O8sfej=7$%j7< z{LST$cO8fBpL4P4{q?S^i-$WRM;%rk&dyl;<;~jb8az+Edzy{7W~*=ha&ea5EbFKK zJn>M^nOHSCH$$2@$2%<eCvSeW)S-X*{EzO`*~?rpf4<MSoISw60Wa%%r9toGXS;3& zvuj*%ERRnQ;y$jy>W=g~Mtw1H4^Ql@xg+X3XE@H99DZxD;WvYq_05|1EKK?8#j*Lo zDv$PXos~Dcu4nl)NZ;lp$635jerAlf-&E@K9^AF)Th^VhkJpL!h$GBmahWwW@$sCs z`}@XUPQ1jW8Gdq{!PKjNjxakK6sPvAb??Q|r~W$Q7xU+9`Z;ySQ@lFPPu|^eeDQJK zT}Y$u=Ug#n=d5#nIq+MH(HmZBcPIIpV{?~x*07gH2b_GLAAMh+)<0|YYz@adp$<;f zN<Y3?OTS|D&!2|!#T4gEZ2j236&tU6O}Y5No;BYe`0v;F?VZWj`&;?5XWb8&dhC7r zzS?qWT1`(Jyca(tw|MVK+B937oOg$2*ZRT@&$JiQJMKKc8FV-GuLdldh?_Ne?dc^) ze%$K~w^{p(HSyK>V%O(8ex8Lp8<U>hpZh<viP1;;TjN-K-<h+&`}|KH)e~ROG)N~t zJ$Q=2b=G=^`0ep<Z@N2lz^UGxi;d^Yu4gT7*6N5CN8{>=NmtzM=_>|q_u+ZhxU(<T zX3bpUOdHth@OMAt^EJzNyN0WNIiBH&{cP=ZjZVdeclKHT)r;$=?rt&XozwHIy<ATm z)Ke?oYSCB!IQeIixTSmjwD*j6zEiX2tY5Y0K5OYw|7XwDsE_!a`DvIw)w$!Oxw?8$ z8$WBBz$xbJKYp|4a`AWWed=$ve&bf|tnZ#%UHw?&nEvj_Tzh=NFGjo=wc>g9I_nqn zNJrnbaKwGR7T&kJ)|c7g!pt4_V)$kauahTCe($Pv+{E?o6kjhtEa%T_bJ-v5(|I#d z=SSCBvzIe#X%7cJ|NUN=XY+yeDEIukBj3Nf((j3Xk9pejxnk13_mCcH(XT$#6^Ex9 zv!)+=YnnTkTMx5qzZ1lqe}}~UkoxdoHUGCbh&%gLPYv_yI{`;eXI;8}w}u;xSv&8y zdcFU0ozp{X`;WU8SI_x9#ib=KzRzd=$))=BC=Zu#XV>r7?sI%zpWc6;d-v|bss?WL z9j6cLixbYYQeW(>op%LJ_kdrXK4$F^=V}xyj$Ubf&a9ehh>NFqeaAyh9PV?j20m#! zyZ+SN)xt&mssEYN-za*}XV&DUnK`AIGkT^)J#|;Q-*D2g?;wosvwq#7GhaO%XYJG- zCT=)=yVg9?3#M;e9MW|zzg&3yv!-U;U|8e(yf&A;+b7-h-aDoKSv!vBEcC<=k6F)} zI@QIKp9XxNufgzql&iP+TGI$O{qXDWoGlDoXN`8<#q^QWx!C@eS=XOfxU+_%zS5&v z<gZWven(I2>ow=<n3)*)aN~jV>zbaNiPaPQc$~e^(7yb1htrIl_1`;wvFo|c!ncRx zTMkR^teJOw<KQXgM{Be8NJ}~V;{0z4^bWszdTMrQ()%Ds5B2f1>shPM^Njz)8eCe^ zNdBzpxqE;MPU?m`yRH{&XK<XK_eLHZ^YVmyV)VYsIs3z-ztcE+&tc&>Yw*PXr!{zH zK5ICM!>5^g!fUUldgAhR-`c~0nJ(#fo;L$`4OW<P@f4f>%_si#iu<g=NCWw4@4We+ zJ@CU2C$GEOj82}klk2SCuX1Khtvi=TcQSlAo%i1@+)@5C>s$>Q_O}2BdZzX4I$qXd z^+iiM)w}h{-7K7mm!HPphwq#&a%YX^d^F_qt^9bcad$RrdZ!VeIR59gx$OJiL2>2j z<Lu8_cgvi+2YSO*Eje+fv3cUmKWp;i=Ufhr>1N%mVOalWt^47L&;1>r_1*9683#K~ zX_Zd#)dQTD>xmPLSyT7CziD8W-FLBZS5N+2PZ~In_sK`k^qIB0Ue5UC$*~U`e&=bb zr)GyU6NBfh-8F*oDQ;=?>y3Mh<JrIaP;dIRrf)o(_pA?RF=<jiYS!zgc;7L@ss1d^ z%bI8RuN*q5t=6f@577&Tp3_->_1Yb~&v7<}HsZcrgYl`}{;D&X#s9GOx~3=nr^{Ql z<0D5Oxb|-7*V;SKT|D1`S-<&xinqGmA!~TEMk{lGeR7=L!{noxczLt-NZ;<3e#M;c z#HoFKcoti(KHshRZPYy!Ll6Am^t)+xEtVfoPxs2->*uw(?CX6x(>u&r>)WHZbT_a1 zJ9~wlA5U1$i-Gxm4c4r^Tu)r(IoHEIuex-SFHZj_4?L^gx;|j)Qx5yZ+N|jp9)9MQ zHsaZj*5+EfFRyDjsILdPvqoEMIQn+hoZ{{->dTorFKe@gWBS;uVTNfHw|c`<48Nzk z@pcAZ?2p#;Dh_u(J;DBbO&?*>ACB``gV$O8ICo#pv-5j2SB`qteh=wQy;+k7!&)6$ zILD)V+JAGN^>r8Z12Y_a<jv&^$NAHmo@qxLeW?p0u5mc~r`xHw8ncEMeD|q4)o(8O zbX7-fxa!37KG*t$r~mYoqrY@^hPQKmd)RmF#q$?4yKXi#h%bEp&hXOftie!6jaid} zUwk@yTHmbIlXbk)?sa|j5cjlz=RD2Tt1meC$T_vuTRg>zo3(dqIO?a_(B{1Bav%MT zz29?jII`w12G?18q;VSHE9SRrX=|UR*8J|s7i+YItBzi}kKv?EeDce~6PD+x@!#G3 zAFlnqHT{Q~Rxsr2iB|lyY{uqNo$%*~>8`}h*}XrU_}v5jHS6@$kGj=-+V!m6xyDOP zv%?FP{8`h-$Lr}#zh{5W@a$VMyFPpRefhzz_MNLUd^^{7zctbaUnchK11EQa9_G?) z;K7+S7<914J1yZj)4Mw_CJxn|^__jod4I(<Pn?>Ab6lL^Fl&4`$}8ub;Tgw2Yih!^ zZVqs*J>wK#HO^eMX07-z(oZam>iAaBA^+^!-yArnF6D<y%Xs2NNB!_Q>+V_4TC*?b z!}`*yvr{YQ=?TMJoV%Cu@O@gFHD~zJ;?z_=o#Lv`_=|N0$GZOb!WGNU$Kvijsz*al z_2G05FYfViW({Z7+*i4{@yS<DZ*c8@vljQ06YTT7nBB+aQI9a>oHJ=w&+DJdzS?Iz z`Mz1hM?P+H;-TId`{nNSeQII<shqDb4EW;c@qIb(HpU&Gk63+KS4aPMZoj-@;M47% zGwZwO{A_*V`>v>Ef7Y7a^EY=GVrGqA>NvmW;wp##ejl98TIb<(5Bl5Q9gL40YaD3c z-+j$me9ZCW3eQ>jah>(yAijS`UX1uS*K_)GPiAAz_c>1W^;gm8WwGHmtFtB@^^lJS zkG>0W!ynGMkE18v-aq<RkN<gXF8k>|>0wVB99XkE>o@1>hB+HA*R$`g+QsXq8fGrv z?0T2eH$3tFJGcJLMl4<W`=_V+bgs4-*sx|zy|fhjv^HyM$BRF$`HJuS?7e!lgwZ}u zIH)P-JU_X;-p+b2@a_)6J>$9q{oTM(9rkez*R!5{K03g37B4=0Jn41j`P;`|{OtO5 zt(lmWJ^Zxn-pQLay^GNoUs|YtYD)7t&QH!_?`JfC3j=>oIekacWY$;DYE)B>c-Fl2 zNrPFd559YEa??*N%(Sa7dCt0jG)p&r-+COKGx500+Ia`eKs_~>xN6X#{p|XTl|%1) zT|Aw^a8GF%*Xo8}PqQ)2Espiv`;o?-!-cO_eRp<pRx2IwujbRPXRRKr&u{<PyL%{3 z?m74T^@{VXy)~2Wb2xbGBi?BMgH~p!zw@rl?w$Q^O+ER~YxuIc?EGglzF)23e*bSf zFw&<v{hjq?U+y}s%m5#{7yCDNt^Qp0<7*!u&uY_9&o67UR$u(~FlmvFYSAP;>BeV{ zaKy(=9Gr6B?OLqabe6uo!*IpOYX)(g_4Rk<e6P)rUVP;gC%5~hZ#s#4z5Jb@di`|I z;@taz7t<g9o!9fM&n#fW#N+d|4{LJz_gM8^{?~h!Cb+@Vi+q+Y;mrEf|7<Ot___!6 zfAZo>AG4u@Uie_m8Z18C#mpMs@x)t<_-Z%{*IN9nsf{0v^UH%lpW>SRtdGw5PaWK= z{3l;{`SorMJHF2KGHduc*Y~4)G3ytjKRN1$@9w0>iK%AyieE47XV<v!Thjx!dy2=S zdsKZn>Dx^EKAc?AeXe-;XKwGYIp_(8S%XCf@%-skJbq%^%RhU`pSE$dmpf~G@xz%9 zw|x40Uc-a=E|lAykS8bHaGdkO=-tH6dAf;tUF+^S>u$r;`>d&J%@=O<d+*drJF(U* z3^n8a;aZ<{=ZeL#|IH?S>PtNsbg1@RzVp88wZA?3k*^LO=eKt*Uwt|gqo#Oy>cw$( z{j)VOYBXOxiF;a`HG4VM`qvMvS@TZC$G-cLE^1qg!3$0^D@HBnba38XIr}cRoKr8H z+|}1BUqA7M^&i(}O`TI$aor8)XFfh*(A=4t_3kWvPTgkx_{7r;s`>e@AN>y0xBm3t zT&*-w2hUlfrM0tJd%2$YsYfsTtntT#S&Nyqlbe2Ulc$cnW;46~dQCmtzFm_mUVZlH zJvs63cLN4|{dJGy^|C%Xz{R5;aTMP@!o}J1+FbU1JfE&OSoIS=zI?Nme(71BnmCDx zhZuOY?VfZG%u%26W{qa&O!(}}E0&K2;^P1xN9O$O`^(Ee`=k;6^5pn?qc7{~xQq61 zaI3$Q3ti+r%GbLyHO{}K-JSd2Hof3YkMiQ<o{N87lh2=i_ddVcvoP?6^;iA2&0?g3 z_5H5W!5o@lJ=)7V-xK$MuYUDHzh-#9uV3t${8{V!VBeg=bKcr{e?#bon>w(YV_MP& z&+x>mV-|9}hhk?9e%d-`dcl3xUasd?`>bA^)kqJ$yB}(u+JuMatl>uM^ZuMViK%Dn z`yAYHHE7U%lh2R$)7q@zs<w4;xT?>mhBaT@?zPT$z!_6RUh~W6NrSkb^P-FU9w+?8 zdv*qw?|E%5`+A>oG&B8_D|RlQTCnZmxF>MM^Y>oCnzct7(xLm}sSezHuh$v|%>3fy z&h=EkyI_4{n1kH>c%J?KZ1?c-i?i5zRmWX@i;JG+7vC&qecg|Ei!)z*?z(@uzV1%< z^z6g^uMeD_)|!2I@U7MR{93~lJ8Nfu_Rh{;AN@|Kudv0dUr#vN&l)Y#*}j>3SD3k( zhd6n&h68MCIM%S8_m0LNo^yV^>s5Xn<*PrJuX_?#b@}9-Jy^f4g#%L@4s!V806)BY zeR21i-3N0|JGh^!^}OeE*-!SV&Z%pC(g4@a=rU_G@>DxM^~i4x(>hK0ij7;`#dUAR z`7Y4F9qUf1$#<XGS<4+3_aD}(<vdO0TmL?Ki>JdQ?R$^(+RW;y9)BNBvp8|JzGHn# z%kEzHT0Rc&tYN*brJ*>y)AM=PbJ@@KS>JbD@idlOkKVa>hhJS!Gnh4ZNuK#Om)UiF zTK7)(9yc>*-NovrEv)W|dN`WD9?O^W=pBQpA2a^2*1IDQSA6QF8vL^c)3@7sd|{>O z?7H4g&hpbG|D!lq-`87MYKC>6*&Oxs>E4PzdyTW_tlhPygR|GQc=6rqKd)~t`(~f# z9Qe~S-T7eB8!kNSxz_rp4Zr^Mc4{ZbJ&5nquJssK@y_Hozk8i>XJgdD8BaXaqEou4 z<=p<f$Lh|S`1pt0T-*`0`TZ?Cv5Uc14173v<AQ@cdwI^wF;ARmB}f0&o?YWyo)|vd zU)StC;l-_g2JTMIo~c#e>B66;IN7IncZ*MLe60QZI#0Dc&l=ySkG_6ieV(p5=Ug6f z)RX@3ww^UP`fh*M@p;eYvTydOCwiXub#|Xdz7?kyY0j6v@)<0Cwe`?UVRR;c*5vZz zkE4BeMvV1|HM{SAh_yd|Kd71CGhN&>CigdMuxW&E8a2=I>m6q?<;<?}f{h!Da$uN) zp4|yC&cl8*)B2f>(@Pq`WO(wyoi%-&vvyW&xiA@ivsQg;esR{1?o+>Y^~+$G&B>D< zc=fmA<F4~P?RwT;)|!3w^oP6LSxYZ#T<E3deI~QMuhwwUD?VvUUwF@J>SgbC{YPtG ztbM)q<=QuEf4cV5wORYs+L`D4`}$H(Kl(5WeC@wolUx6Ka2DRFA>H_4J?fRux%@D~ z<uAuQw4b%^Yct1*zBK2%*TSDxVrU7gy3W*{HQK?FugAYw6W^VS*LlZiUk<<eofm)h z(b;SqeBXrfJ!$9Zj^GGS{rJwVf3_w@A8Db6xaYO*#aFu)H*3A4@WOq)&f+A0*3_0) z-`35XR>kr6y|ISf?BjiE(7zvW21ib_3NtRVXU)8`;&CyTYB;Zdz4ODB-@6l5-<^1t zHye9uX>UHxt?`BBzVKIjc8#++I#YMns#9DX^&n0RongX0=L=69ta^`2duO=GHG}+o zu)6Pe9B1`W&2sNGd>?V`9ky1lcs%PRt)1(u81>DI4(h$Gotj&xnVk0Jhbu-te3<a8 z!+P4ap2eAkm~#elXYIV(_ImqxJz>on9pqcnwi$JY_|JQatC~2e-#xO|Z#v^UYo~7K ztm%Y<xaYOG?5lm&6TQ<xte!vhZhzQwadPy8Q(Dx+skPc-@|8R5qlLY*@57>VSm*B$ zx&3y%-#7E3wfgt7bgV8O-3c1#MT{A_w=mS_i}Ta2XYGznzwg%QQs2H0@#ll%dB>Rb zo%c)(Qxn(TkCQK4^Xxs8@0=fpbN1g{epqK6J+SnUM~Cz7&F=fg;Bn@QuNN`Z#~m-) zGXA-(#o&MT)Vljj|G!F&-g~oQ`o!msPb+<YwbnZ#PP`d<>JJy3aJQ~6=lplvSs%?{ zS*KC+e7XG1K+MULhH9j{+1hva)s#DHuWLBP#d_9ol`nVJ#KX{U{qV(sX5pXQ<5l0{ z@vDyax;l8pyZ`P}-Ptp-_~1&DbeUcA!=WV%bv<cVE&JAR&8+^5l|O55_0LZOwd-At z-hDV?(xU$L#y@Ln;A-7nvxmvodxW1nb>@1C<FkizzAx{0|Fkx1XC6-S&fdfMeEm3n zyq;ob&AGnX;|^2r-eqgGaTAlyXT0^<9}LDH&$oKT6+UjgOS5a=SAO$;r04maIqT6z zPu0bnZ`Rb(zi0eAZ`SHL!$<Gu-<9Xx&t+fkQ?7kEc)(UquJx?(<K)?0rsH`()GS^; zJsE5|SkvTnZPs3{=Y4+g<;#PIN4=`oT7UgL(tCCIVZc56{c88+niEcXn6;m+#ko0) z)$gpGcOzc>FKeFSPCR@0_dNcmwOOOR_eNbkp1r;7e%922qo?p`!sje3dwx2cIMs0O zo5bLpJ=E|09Tpom*ww-n?ySMplk-`lJ8U!7yI4L?G5oWJBW(K1pEa0#*7~hS`<FG( zGsgR4#^PoTracYh!&1|^Jbj;i)HiOkCMK-vIKz*@n>GFDL!Zt)XRVmCr}`B4?V7W* zFFE#jSHIrHrfX-jKK10l!^ysxTR*SS;N6;YIL>h>Zg%ZVFU^cTX67A*|Fkx1bao~` zK6vxNo;B~2b9sFCyHk&8b=SV0aKX#o^S5i&q*3*HAMRSkSv`4lxYu%qf4Fg`C!O`B zmUBJL8eaM9;luiH?5>H0`@A-neYsDV_H;~#YBzu9@Z#-R9W|PfZ@HXVgNtVzyK6K$ zW8~8zt>E_m#|ws9v!;gG!%GJ^`tGdQuh$1xty4GgXYJ2+FQ>U#;{osE+N1k+#@~CC zhkvu^Zz%jUZQgN(kp^<D&-dV5f3;`L@%$SBKRo%>6<gicYwbB}=eJhR{9$<Z?|E=K z=c>p0b2e-Dp6CXn+Bo6piMJ;l=Qx^)wH$ZB-fa4B7;@FL|87m}^V(eY%|5F^uP~j* z4IV$e=X%!fTXPeymiWKF_Odo>#XHA~4%T9x)@Dte@XvX42c5lN^NyT7^Xpe#xOk^G z96mAC5!ZQK@q1m1SN@mv%^GfMTZ<8k7hHRFtY_`Ke_!uj9)91h!BM-O;&kSG>N{V& zS~$|-%<Ue{`rRAc`u5?W{;ZujeedAGjbj>gAIxjk;GFX*?!0sK5eq9_(g-IxcscXz zpSfVe@%+Af@1Jw@f7Z}HeNWEtW-VNEP*;sv>+d5TxW%dY_MMequOD_TUQD&zJDB{l z28(8CRo$oc%^IHlZ>7KQo`}aweLa8bj?A9>R-OHv+}(Axn?rYb)~BEH?5*XhJ!^95 ztxtY>r{D9gabth7Cbu~EZPw@^U!7U|6whYSy-^Qlxp9MoS97y}S@X>2ex>`JL-$|3 z`tkj)zPimlF3#}K>sM<q?cG`0%3<pF&*Rmd_0b@1u=uJ6N4@uJa;n`ulPCY&&+f&; z=$^&9zMaQkpR*Q^6N}GTeCtzPYg)gqsRdJ<v+B*R#qqTkXI|B>=kq(HuDDq{e{Y%( zpEI@Po_}BY;r@S(-9L+GS8~Sj+^?b(ZPIG2#eM;@WY`rWJTkU0Y&4NzaN>8|Y~-Fm zk(13_AGlvQT>7^?L2=KizfV0?_jdOL65e4cH;m1**s#yqURFHMy10g0O}<}N(mn6F z{r-N>v%-hJy3Kp`+zyESc7<IXyv&OHblutFOHMZT-W$(PD{7oEbhD!WYLx5gvdJTE zR^-lZ9?g)wJ!3B~oaeV<_TJ2JanHr>9SFa?=Pcv0+F@+}{&2<0Tc4iwQ2Zmj+4V)@ zl)k&3U<^C`tf-?`*s7gRc<J?xM;y8TW#zjS{~e&-b#W($aGZ7Y`MSc-F85x{p6k`Q z?}_^7eA_QPsB`l1XjkF__H(9Bd!H3{JUOciubO%+Ha_A3ZuRramk#EBt~XzPv%;?) zs`;|ISy2N&a_GxD-0YtBJeT~qPq^fo6?vK;|MpNmQoa1!<5`;><)fzkAZPBAo8s&N zY;17ShqD^&VZv4Rb6)D6wfNxf)SdP3{=L(%ho|~%a<%XHZx-c0cQ)Ou9}eVfwkLmj zSED^{M)exT`g~g7SxFzhW~PR7de7>$A18OcFLZogZ?Sr2o0WS_vo3eDY~JCOGt7^; z$HCX;n)Q`aE@yS))r{!t#W@_!1_x*V?&X4AE`8SP?Ah;S=GS{5#=YF|%t{<M^J#|8 zbbnp>ZKZmiZ2EsMww`?lil>YJYM5U;1S6mOOv81@-5o#Xjtf1i$M(E3mweb~INEO* z=y0b-n9do&ByTqUYV;nk*@g2v63?@G{`Xk=&nxY!8pZVQIr73aEB$TH?~GwP-)a8m zogKIKL4P=jgO@$eiuuax2?KlY4-DcxpI7w!%L)wq)Fb6=pV{mA%XMytXYXRvbf$M! z1HSfSuDe|En-Bl^s`j~$FsFw}|F2h!{O0dxZ~fl?y8&>7Ngw+Dc<IF8N)K^*-?d*a z8@%y1dp@}eum0ua3v=At5BZz->{*PvvmWBAT;E(ac9{OKqHh@FRpaby_Wr}AgFzlX z<$K<<-ao9w=X>vtS|{%IKwdSnJF}&iKi%vZ&a+p3`19nOEv)*T75CQ_-@bZgds>+l zdD|!UIE1Ah)#0c2c;;I#cIxbLE?fCvJAY2GhtpYpvr$8geLDLOYr0vx+Hd90w|Sp2 z&hW!qExJcBxIKSY;fDh;^)8R^k>@!tbFFXu&k9WO>n^t%;=&-0SnsHJ@;(Q(o2|L= zk6ZO{lKsvx-&xT=zxaSbt#q?zx#|D=627xiPCVGD`q4u^@X(9Ru8(-=n{4LQm_1it zuKRnDji3JN)m@#F7ryLrhwIKs_ugN=bm4W@WA9J<R^H~qui3#sKP$NA>#Rn7dh*K_ zpC=v|*!3Zg9^}pEtn(;dY%$M!o=e{QZu5&z{mTJ!Se)z8j9{@(o^Zl*VxGO9@0+{) ze4OK7Y<n+PKlgv$b2FJei;K^Am#?|-fdNi@@elL2*O`B@^+3m0&#>4{IOM3``e+XQ zK3VVOZ2w`(_w2L%7uWw=<7LmY5)S8+b9qi4<c3pkz5o3A$tw?W{(HFeB(5I9goiN8 zGb{Clk7DTE#qpO9hUb;J<UjWLWhFm){_f8FKdtD;w?DjUyspSu@6EPY*vv{iPUyo{ zp3kdOZ&uW5SDfkUGkkKY=Z=RHD~vGB%FFfqmwl?w-xE*f;@saYFoctBR;mkcyI<~h zq`dVc&bJvpdFr9Q_|1wQ>RE1jeLIWm``*7xobRn%`u=+u+J%1hnVWjyfm^*<`Dw-d zoa0~i{>PQ`--_^84F7W7-?Ld8Up?VL3_Nki*1pW1{Va9IH;ETD#JS^TR+^#y<>wR6 zXHGT0_Wk>2edSAL&jbhGt>9o*KCFbT{@h{4K{Krf_4&<;`JJ)O@RRhXk6QI5cfHA( zzo!|THJT6H)tEhtlOsOEeAXA^zZ3V*mptziCv%DSDBY<)cZKh-D{9$282X07NgqG6 z=l@#a|K~%V_B<>0@zYAXOZQJJF#h8TEOW^n8+^a4-~$G;`Jdz7?%GMa#jX~N+0J>u zVjgjN@+J<ip84RrxtzNpH&J(1epnI5Up?{F?b}2L->is}w_4Rm4_~?TjtBXwQE&A- zYtu_Sxyw;r+?W}AyTd<wSZ8(4aOjs0-0Gck`t#oFg?~QxeqPo#D<4<FZV$x56Oa8K z@~73QU0>|qtmxnD;1Q=Ey}0Z1+ZFrB2Ft9l<Iq_wKe|~t`^ATtd{5r^`FY~oCYB#; ze46X$>puHD--*uQymM%0<k6cs)Qh-t*UAImTl1omM|?SE&-`I$Q@dDPe7bbA&v@eJ zj@!QF;?m1^-yvMY$J3r?1qL%zhrhUX1P1+nT!De@t$m1Fx%tgXb2@9%pR@e1cQe9S zabbb$#GhThIGR0+{c=4|eO#RH5?y-FSrMZzeSW_p9}Mclc7DHR@9LWqJmLudct7W* zMz%P5gcnXZ&G*FkwD(zg6sNA=TZprniLag>V4jup-w5@qrWn17Q=h+{=+*ReZy)db zM=xIN?<;pc&UwStOyLzL|E!!gXF9pVclwqS*YLnx%!lg^J500kc_m((ry0Ji;Gq~f zyvw}@@$kI5x#ZvXsb0L$^OKKGj<|vk_tl;~)9FPGwO~BIA5VLqmGd2R|6zr%TG`^E zS=V!XluONcS6k0NuG9y7`8umHE8_G-H!JGt^R4eIJKuT_8-3pbd7oG4h@Rkr`>kDj zkE{Mob~avLuPb73uD53WY0tAl52OD1>4P6V9A@X4jc>fzA@^Cy4=?(SNByzQO0|no zBOKnlx4zkY&;7xno^S(~{OZ*!|2v;*@DmGHbEs!A;<Gm|n5rRO9`W#y^74}-UYyJE z@$ma?&nK_(LWeiGXGLCo6ZK(}kA7CZW*=eTf8Wz$+4b+6Q;*evL%)1x#jf(H_tTDR zdB}&AV)W!3@6PADNdL4lD{%JrA${C=>RoNP;dot{m2;QWI`8p{zv6q}*x;|{eA|gx zTi-i1+spc@Cw^kx_1<jbh)rK-KQDWqmHJ|bOAa{iSkAk?+ebXYC`K&5xKtk>#qtr0 z3-#Rp_j=Y#e7763cK+;ivm$5ru%7!v*L$G$^U7TEulvLUy?ijLDc`KzG2i)tJ0Cb6 z;XnE5+bMt8<3v6<ssl&1mp#vQZ|}s5F=M`Z)%!iK?-xI_sYmyApc=2MYp>XGP3ZG^ z+4HPa+qrL^`mmoI|FU;I!6)Xe_d(5Y>8-zuo6XbeW(5X$;!|EVJ=yer?$hj@Kf8Y? zDi0j##m|cOtane{N3)cReO5lLR9k&L%u4TRescf5;;wEr<HFDBYR{g-=d7RR?VVIJ zu4d12)5#qNC&u<!&ROB#JjIDQ_pQGd)hGt${ASN^=pih0^}^Tv?13+Rvyp37;843f z&U5L+z))TB{q9t5HZyM@aM1U(?^m_dkdxq(zPfUYt$z9O$bVMC4ijHGT;BUFrn+)f zyLX?hUg*M6%*RWoPT%h^=MzTvI|p?9tNpa+S*cIwGu|BraikvTPF^0(Sj?>S?Fg%S z+2o0<M>`$9=I~`>oXvnupD@99>f<%6?eGtmzxX&XGcy$b?RCaQc6#`$F?-gR`krEE z#a(awXC)u!c=BHJmw#5yzv<l1{m}zodDZs4YDeVOw?1&7?t8iAz{jk37utt%WqVoM ztbABeU+(k!)!gFe>?hl7%%hpc&wZ9+^i)0^)w@37c+`I}bH$u<V8dm2*a*G8sxy0T zPU^a6<L{0uKRe&sXa0QDkP9#M4TnC<$?tC~v%*)+d)@Mt=V^UrrP;LyZ|$m_;;Y}! z{BS+5%?^?OTv20I;N&AtAH~-{P6?k`5m(RW`{nocPb=-S-r|Mdtekt#-Y(18OvLCT zES~D|i4U>x6yr=cE3YehfTbL>=a&_|<MRJj`0$;TJ1*~#*y`a(4`;siOkMgof-?@; z;Fy*6K_30E#i?g8=Xa{_+4pM~f94Q#&gQIp@}g&caTvGa_1SF1hX+UDy!WghIcCLK z4rkb2S9*7xXGPt(`)$wiRSO4iz3a33a602g9<|~LRzBUsQorid<M}%vy}GjkhaG(D z`y5~TnU!)mi<8H>e!~`rrw?w})4?ph8qa%%oBXs=j`q_0^d~;u>{%Y%`kl3zcyHAb zbAI>S<&`7O&V7<MJhSJQ70-T#R4Z(rc-6l%PTOfU(m(BaR^WVHQL{SduIv5dN`2ZD z`S|Ls{^~(~HhIG&w;28BUp;!9-+2h1d}_-#EBxJ^+2R!s)jMaw-!47+Zi<Qba_hO- z(%~mg)Z~Be$?U!Un+J@1PCY*}kWU`AILtrZ?tIMp!oW|Cc!W=$St&+c`fPZQzql!0 z%sKZk;h-6XQQmWR>7Q5TlArfkF1GqV>%$&i9Ka=pZ*zdLJbY#a7QKi2WzVysNBYiT zR6}k#Usw9~&gNLHIMVNXKP%5(e_ekVn|D2Ve$D$g>xX;0dB*gPgkNt@E3<OP{&98e zIDPBA>>K{I95r*b;fN!gyPJJ;^<)p{>=~B+&TDRGZ8**1zWdFdZC2!|7LMgmU#)tQ zgI{|s2fta72R8O{&z>LE&rdEj@NoXDp1q5OrTNg=m+tY>-n#RF2?qU?pY2f}>Z>KU zIOkb8dF<OyS3Ujedsgg;^En^8Rz5a$o*#(*-`lNOpK8RPdi3siajtGWsGAK=_gTS- zIA`y=?=`;Y*!VrI%u2Ii!;d_(^3zKB-g}q%$8osfl289?;>&wQSKbq|xGyX5JbQjw z@f6=|+{M%Jg}d7H?QngmJ1aPYse3%|w*&I9h5u#GvtrlOW^3nW&#=e6cy_(bN_{nZ a@nYq6p6gjWf8VZuTQRS@|MTkp;r{`yJrThG diff --git a/vendor/golang.org/x/text/encoding/testdata/candide-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/candide-utf-8.txt deleted file mode 100644 index a4fd62993..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/candide-utf-8.txt +++ /dev/null @@ -1,510 +0,0 @@ -This file was derived from -http://www.gutenberg.org/cache/epub/4650/pg4650.txt --------- - - CANDIDE, - - ou - - L'OPTIMISME, - - TRADUIT DE L'ALLEMAND - - DE M. LE DOCTEUR RALPH, - - AVEC LES ADDITIONS - - QU'ON A TROUVÉES DANS LA POCHE DU DOCTEUR, LORSQU'IL MOURUT - - À MINDEN, L'AN DE GRÂCE 1759 - - 1759 - - - -CHAPITRE I. - -Comment Candide fut élevé dans un beau château, et comment il fut -chassé d'icelui. - -Il y avait en Vestphalie, dans le château de M. le baron de -Thunder-ten-tronckh, un jeune garçon à qui la nature avait donné -les moeurs les plus douces. Sa physionomie annonçait son âme. -Il avait le jugement assez droit, avec l'esprit le plus simple; -c'est, je crois, pour cette raison qu'on le nommait Candide. Les -anciens domestiques de la maison soupçonnaient qu'il était fils -de la soeur de monsieur le baron et d'un bon et honnête -gentilhomme du voisinage, que cette demoiselle ne voulut jamais -épouser parce qu'il n'avait pu prouver que soixante et onze -quartiers, et que le reste de son arbre généalogique avait été -perdu par l'injure du temps. - -Monsieur le baron était un des plus puissants seigneurs de la -Westphalie, car son château avait une porte et des fenêtres. Sa -grande salle même était ornée d'une tapisserie. Tous les chiens -de ses basses-cours composaient une meute dans le besoin; ses -palefreniers étaient ses piqueurs; le vicaire du village était -son grand-aumônier. Ils l'appelaient tous monseigneur, et ils -riaient quand il fesait des contes. - -Madame la baronne, qui pesait environ trois cent cinquante -livres, s'attirait par là une très grande considération, et -fesait les honneurs de la maison avec une dignité qui la rendait -encore plus respectable. Sa fille Cunégonde, âgée de dix-sept -ans, était haute en couleur, fraîche, grasse, appétissante. Le -fils du baron paraissait en tout digne de son père. Le -précepteur Pangloss[1] était l'oracle de la maison, et le petit -Candide écoutait ses leçons avec toute la bonne foi de son âge et -de son caractère. - - [1] De _pan_, tout, et _glossa_, langue. B. - - -Pangloss enseignait la métaphysico-théologo-cosmolonigologie. Il -prouvait admirablement qu'il n'y a point d'effet sans cause, et -que, dans ce meilleur des mondes possibles, le château de -monseigneur le baron était le plus beau des châteaux, et madame -la meilleure des baronnes possibles. - -Il est démontré, disait-il, que les choses ne peuvent être -autrement; car tout étant fait pour une fin, tout est -nécessairement pour la meilleure fin. Remarquez bien que les nez -ont été faits pour porter des lunettes; aussi avons-nous des -lunettes[2]. Les jambes sont visiblement instituées pour être -chaussées, et nous avons des chausses. Les pierres ont été -formées pour être taillées et pour en faire des châteaux; aussi -monseigneur a un très beau château: le plus grand baron de la -province doit être le mieux logé; et les cochons étant faits pour -être mangés, nous mangeons du porc toute l'année: par conséquent, -ceux qui ont avancé que tout est bien ont dit une sottise; il -fallait dire que tout est au mieux. - - [2] Voyez tome XXVII, page 528; et dans les _Mélanges_, année - 1738, le chapitre XI de la troisième partie des _Éléments de la - philosophie de Newton_; et année 1768, le chapitre X des - _Singularités de la nature_. B. - - -Candide écoutait attentivement, et croyait innocemment; car il -trouvait mademoiselle Cunégonde extrêmement belle, quoiqu'il ne -prît jamais la hardiesse de le lui dire. Il concluait qu'après -le bonheur d'être né baron de Thunder-ten-tronckh, le second -degré de bonheur était d'être mademoiselle Cunégonde; le -troisième, de la voir tous les jours; et le quatrième, d'entendre -maître Pangloss, le plus grand philosophe de la province, et par -conséquent de toute la terre. - -Un jour Cunégonde, en se promenant auprès du château, dans le -petit bois qu'on appelait parc, vit entre des broussailles le -docteur Pangloss qui donnait une leçon de physique expérimentale -à la femme de chambre de sa mère, petite brune très jolie et très -docile. Comme mademoiselle Cunégonde avait beaucoup de -disposition pour les sciences, elle observa, sans souffler, les -expériences réitérées dont elle fut témoin; elle vit clairement -la raison suffisante du docteur, les effets et les causes, et -s'en retourna tout agitée, toute pensive, toute remplie du désir -d'être savante, songeant qu'elle pourrait bien être la raison -suffisante du jeune Candide, qui pouvait aussi être la sienne. - -Elle rencontra Candide en revenant au château, et rougit: Candide -rougit aussi . Elle lui dit bonjour d'une voix entrecoupée; et -Candide lui parla sans savoir ce qu'il disait. Le lendemain, -après le dîner, comme on sortait de table, Cunégonde et Candide -se trouvèrent derrière un paravent; Cunégonde laissa tomber son -mouchoir, Candide le ramassa; elle lui prit innocemment la main; -le jeune homme baisa innocemment la main de la jeune demoiselle -avec une vivacité, une sensibilité, une grâce toute particulière; -leurs bouches se rencontrèrent, leurs yeux s'enflammèrent, leurs -genoux tremblèrent, leurs mains s'égarèrent. M. le baron de -Thunder-ten-tronckh passa auprès du paravent, et voyant cette -cause et cet effet, chassa Candide du château à grands coups de -pied dans le derrière. Cunégonde s'évanouit: elle fut souffletée -par madame la baronne dès qu'elle fut revenue à elle-même; et -tout fut consterné dans le plus beau et le plus agréable des -châteaux possibles. - - - -CHAPITRE II - -Ce que devint Candide parmi les Bulgares. - - -Candide, chassé du paradis terrestre, marcha longtemps sans -savoir où, pleurant, levant les yeux au ciel, les tournant -souvent vers le plus beau des châteaux qui renfermait la plus -belle des baronnettes; il se coucha sans souper au milieu des -champs entre deux sillons; la neige tombait à gros flocons. -Candide, tout transi, se traîna le lendemain vers la ville -voisine, qui s'appelle _Valdberghoff-trarbk-dikdorff_, n'ayant -point d'argent, mourant de faim et de lassitude. Il s'arrêta -tristement à la porte d'un cabaret. Deux hommes habillés de bleu -le remarquèrent: Camarade, dit l'un, voilà un jeune homme très -bien fait, et qui a la taille requise; ils s'avancèrent vers -Candide et le prièrent à dîner très civilement.--Messieurs, leur -dit Candide avec une modestie charmante, vous me faites beaucoup -d'honneur, mais je n'ai pas de quoi payer mon écot.--Ah! -monsieur, lui dit un des bleus, les personnes de votre figure et -de votre mérite ne paient jamais rien: n'avez-vous pas cinq pieds -cinq pouces de haut?--Oui, messieurs, c'est ma taille, dit-il en -fesant la révérence.--Ah! monsieur, mettez-vous à table; non -seulement nous vous défraierons, mais nous ne souffrirons jamais -qu'un homme comme vous manque d'argent; les hommes ne sont faits -que pour se secourir les uns les autres.--Vous avez raison, dit -Candide; c'est ce que M. Pangloss m'a toujours dit, et je vois -bien que tout est au mieux. On le prie d'accepter quelques écus, -il les prend et veut faire son billet; on n'en veut point, on se -met à table. N'aimez-vous pas tendrement?....--Oh! oui, -répond-il, j'aime tendrement mademoiselle Cunégonde.--Non, dit -l'un de ces messieurs, nous vous demandons si vous n'aimez pas -tendrement le roi des Bulgares?--Point du tout, dit-il, car je ne -l'ai jamais vu.--Comment! c'est le plus charmant des rois, et il -faut boire à sa santé.--Oh! très volontiers, messieurs. Et il -boit. C'en est assez, lui dit-on, vous voilà l'appui, le -soutien, le défenseur, le héros des Bulgares; votre fortune est -faite, et votre gloire est assurée. On lui met sur-le-champ les -fers aux pieds, et on le mène au régiment. On le fait tourner à -droite, à gauche, hausser la baguette, remettre la baguette, -coucher en joue, tirer, doubler le pas, et on lui donne trente -coups de bâton; le lendemain, il fait l'exercice un peu moins -mal, et il ne reçoit que vingt coups; le surlendemain, on ne lui -en donne que dix, et il est regardé par ses camarades comme un -prodige. - -Candide, tout stupéfait, ne démêlait pas encore trop bien comment -il était un héros. Il s'avisa un beau jour de printemps de -s'aller promener, marchant tout droit devant lui, croyant que -c'était un privilège de l'espèce humaine, comme de l'espèce -animale, de se servir de ses jambes à son plaisir. Il n'eut pas -fait deux lieues que voilà quatre autres héros de six pieds qui -l'atteignent, qui le lient, qui le mènent dans un cachot. On lui -demanda juridiquement ce qu'il aimait le mieux d'être fustigé -trente-six fois par tout le régiment, ou de recevoir à-la-fois -douze balles de plomb dans la cervelle. Il eut beau dire que les -volontés sont libres, et qu'il ne voulait ni l'un ni l'autre, il -fallut faire un choix; il se détermina, en vertu du don de Dieu -qu'on nomme _liberté_, à passer trente-six fois par les -baguettes; il essuya deux promenades. Le régiment était composé -de deux mille hommes; cela lui composa quatre mille coups de -baguette, qui, depuis la nuque du cou jusqu'au cul, lui -découvrirent les muscles et les nerfs. Comme on allait procéder -à la troisième course, Candide, n'en pouvant plus, demanda en -grâce qu'on voulût bien avoir la bonté de lui casser la tête; il -obtint cette faveur; on lui bande les yeux; on le fait mettre à -genoux. Le roi des Bulgares passe dans ce moment, s'informe du -crime du patient; et comme ce roi avait un grand génie, il -comprit, par tout ce qu'il apprit de Candide, que c'était un -jeune métaphysicien fort ignorant des choses de ce monde, et il -lui accorda sa grâce avec une clémence qui sera louée dans tous -les journaux et dans tous les siècles. Un brave chirurgien -guérit Candide en trois semaines avec les émollients enseignés -par Dioscoride. Il avait déjà un peu de peau et pouvait marcher, -quand le roi des Bulgares livra bataille au roi des Abares. - - - -CHAPITRE III. - -Comment Candide se sauva d'entre les Bulgares, et ce qu'il -devint. - - -Rien n'était si beau, si leste, si brillant, si bien ordonné que -les deux armées. Les trompettes, les fifres, les hautbois, les -tambours, les canons; formaient une harmonie telle qu'il n'y en -eut jamais en enfer. Les canons renversèrent d'abord à peu près -six mille hommes de chaque côté; ensuite la mousqueterie ôta du -meilleur des mondes environ neuf à dix mille coquins qui en -infectaient la surface. La baïonnette fut aussi la raison -suffisante de la mort de quelques milliers d'hommes. Le tout -pouvait bien se monter à une trentaine de mille âmes. Candide, -qui tremblait comme un philosophe, se cacha du mieux qu'il put -pendant cette boucherie héroïque. - -Enfin, tandis que les deux rois fesaient chanter des _Te Deum_, -chacun dans son camp, il prit le parti d'aller raisonner ailleurs -des effets et des causes. Il passa par-dessus des tas de morts -et de mourants, et gagna d'abord un village voisin; il était en -cendres: c'était un village abare que les Bulgares avaient brûlé, -selon les lois du droit public. Ici des vieillards criblés de -coups regardaient mourir leurs femmes égorgées, qui tenaient -leurs enfants à leurs mamelles sanglantes; là des filles -éventrées après avoir assouvi les besoins naturels de quelques -héros, rendaient les derniers soupirs; d'autres à demi brûlées -criaient qu'on achevât de leur donner la mort. Des cervelles -étaient répandues sur la terre à côté de bras et de jambes -coupés. - -Candide s'enfuit au plus vite dans un autre village: il -appartenait à des Bulgares, et les héros abares l'avaient traité -de même. Candide, toujours marchant sur des membres palpitants -ou à travers des ruines, arriva enfin hors du théâtre de la -guerre, portant quelques petites provisions dans son bissac, et -n'oubliant jamais mademoiselle Cunégonde. Ses provisions lui -manquèrent quand il fut en Hollande; mais ayant entendu dire que -tout le monde était riche dans ce pays-là, et qu'on y était -chrétien, il ne douta pas qu'on ne le traitât aussi bien qu'il -l'avait été dans le château de M. le baron, avant qu'il en eût -été chassé pour les beaux yeux de mademoiselle Cunégonde. - -Il demanda l'aumône à plusieurs graves personnages, qui lui -répondirent tous que, s'il continuait à faire ce métier, on -l'enfermerait dans une maison de correction pour lui apprendre à -vivre. - -Il s'adressa ensuite à un homme qui venait de parler tout seul -une heure de suite sur la charité dans une grande assemblée. Cet -orateur le regardant de travers lui dit: Que venez-vous faire -ici? y êtes-vous pour la bonne cause? Il n'y a point d'effet sans -cause, répondit modestement Candide; tout est enchaîné -nécessairement et arrangé pour le mieux. Il a fallu que je fusse -chassé d'auprès de mademoiselle Cunégonde, que j'aie passé par -les baguettes, et il faut que je demande mon pain, jusqu'à ce que -je puisse en gagner; tout cela ne pouvait être autrement. Mon -ami, lui dit l'orateur, croyez-vous que le pape soit -l'antechrist? Je ne l'avais pas encore entendu dire, répondit -Candide: mais qu'il le soit, ou qu'il ne le soit pas, je manque -de pain. Tu ne mérites pas d'en manger, dit l'autre: va, coquin, -va, misérable, ne m'approche de ta vie. La femme de l'orateur -ayant mis la tête à la fenêtre, et avisant un homme qui doutait -que le pape fût antechrist, lui répandit sur le chef un -plein..... O ciel! à quel excès se porte le zèle de la religion -dans les dames! - -Un homme qui n'avait point été baptisé, un bon anabaptiste, nommé -Jacques, vit la manière cruelle et ignominieuse dont on traitait -ainsi un de ses frères, un être à deux pieds sans plumes, qui -avait une âme; il l'amena chez lui, le nettoya, lui donna du pain -et de la bière, lui fit présent de deux florins, et voulut même -lui apprendre à travailler dans ses manufactures aux étoffes de -Perse qu'on fabrique en Hollande. Candide se prosternant presque -devant lui, s'écriait: Maître Pangloss me l'avait bien dit que -tout est au mieux dans ce monde, car je suis infiniment plus -touché de votre extrême générosité que de la dureté de ce -monsieur à manteau noir, et de madame son épouse. - -Le lendemain, en se promenant, il rencontra un gueux tout couvert -de pustules, les yeux morts, le bout du nez rongé, la bouche de -travers, les dents noires, et parlant de la gorge, tourmenté -d'une toux violente, et crachant une dent à chaque effort. - - - -CHAPITRE IV. - -Comment Candide rencontra son ancien maître de philosophie, le -docteur Pangloss, et ce qui en advint. - - -Candide, plus ému encore de compassion que d'horreur, donna à cet -épouvantable gueux les deux florins qu'il avait reçus de son -honnête anabaptiste Jacques. Le fantôme le regarda fixement, -versa des larmes, et sauta à son cou. Candide effrayé recule. -Hélas! dit le misérable à l'autre misérable, ne reconnaissez-vous -plus votre cher Pangloss? Qu'entends-je? vous, mon cher maître! -vous, dans cet état horrible! quel malheur vous est-il donc -arrivé? pourquoi n'êtes-vous plus dans le plus beau des châteaux? -qu'est devenue mademoiselle Cunégonde, la perle des filles, le -chef-d'oeuvre de la nature? Je n'en peux plus, dit Pangloss. -Aussitôt Candide le mena dans l'étable de l'anabaptiste, où il -lui fit manger un peu de pain; et quand Pangloss fut refait: Eh -bien! lui dit-il, Cunégonde? Elle est morte, reprit l'autre. -Candide s'évanouit à ce mot: son ami rappela ses sens avec un peu -de mauvais vinaigre qui se trouva par hasard dans l'étable. -Candide rouvre les yeux. Cunégonde est morte! Ah! meilleur des -mondes, où êtes-vous? Mais de quelle maladie est-elle morte? ne -serait-ce point de m'avoir vu chasser du beau château de monsieur -son père à grands coups de pied? Non, dit Pangloss, elle a été -éventrée par des soldats bulgares, après avoir été violée autant -qu'on peut l'être; ils ont cassé la tête à monsieur le baron qui -voulait la défendre; madame la baronne a été coupée en morceaux; -mon pauvre pupille traité précisément comme sa soeur; et quant au -château, il n'est pas resté pierre sur pierre, pas une grange, -pas un mouton, pas un canard, pas un arbre; mais nous avons été -bien vengés, car les Abares en ont fait autant dans une baronnie -voisine qui appartenait à un seigneur bulgare. - -A ce discours, Candide s'évanouit encore; mais revenu à soi, et -ayant dit tout ce qu'il devait dire, il s'enquit de la cause et -de l'effet, et de la raison suffisante qui avait mis Pangloss -dans un si piteux état. Hélas! dit l'autre, c'est l'amour: -l'amour, le consolateur du genre humain, le conservateur de -l'univers, l'âme de tous les êtres sensibles, le tendre amour. -Hélas! dit Candide, je l'ai connu cet amour, ce souverain des -coeurs, cette âme de notre âme; il ne m'a jamais valu qu'un -baiser et vingt coups de pied au cul. Comment cette belle cause -a-t-elle pu produire en vous un effet si abominable? - -Pangloss répondit en ces termes: O mon cher Candide! vous avez -connu Paquette, cette jolie suivante de notre auguste baronne: -j'ai goûté dans ses bras les délices du paradis, qui ont produit -ces tourments d'enfer dont vous me voyez dévoré; elle en était -infectée, elle en est peut-être morte. Paquette tenait ce -présent d'un cordelier très savant qui avait remonté à la source, -car il l'avait eu d'une vieille comtesse, qui l'avait reçu d'un -capitaine de cavalerie, qui le devait à une marquise, qui le -tenait d'un page, qui l'avait reçu d'un jésuite, qui, étant -novice, l'avait eu en droite ligne d'un des compagnons de -Christophe Colomb. Pour moi, je ne le donnerai à personne, car -je me meurs. - -O Pangloss! s'écria Candide, voilà une étrange généalogie! -n'est-ce pas le diable qui en fut la souche? Point du tout, -répliqua ce grand homme; c'était une chose indispensable dans le -meilleur des mondes, un ingrédient nécessaire; car si Colomb -n'avait pas attrapé dans une île de l'Amérique cette maladie[1] -qui empoisonne la source de la génération, qui souvent même -empêche la génération, et qui est évidemment l'opposé du grand -but de la nature, nous n'aurions ni le chocolat ni la cochenille; -il faut encore observer que jusqu'aujourd'hui, dans notre -continent, cette maladie nous est particulière, comme la -controverse. Les Turcs, les Indiens, les Persans, les Chinois, -les Siamois, les Japonais, ne la connaissent pas encore; mais il -y a une raison suffisante pour qu'ils la connaissent à leur tour -dans quelques siècles. En attendant elle a fait un merveilleux -progrès parmi nous, et surtout dans ces grandes armées composées -d'honnêtes stipendiaires bien élevés, qui décident du destin des -états; on peut assurer que, quand trente mille hommes combattent -en bataille rangée contre des troupes égales en nombre, il y a -environ vingt mille vérolés de chaque côté. - - [1] Voyez tome XXXI, page 7. B. - - -Voilà qui est admirable, dit Candide; mais il faut vous faire -guérir. Et comment le puis-je? dit Pangloss; je n'ai pas le sou, -mon ami, et dans toute l'étendue de ce globe on ne peut ni se -faire saigner, ni prendre un lavement sans payer, ou sans qu'il y -ait quelqu'un qui paie pour nous. - -Ce dernier discours détermina Candide; il alla se jeter aux pieds -de son charitable anabaptiste Jacques, et lui fit une peinture si -touchante de l'état où son ami était réduit, que le bon-homme -n'hésita pas à recueillir le docteur Pangloss; il le fit guérir à -ses dépens. Pangloss, dans la cure, ne perdit qu'un oeil et une -oreille. Il écrivait bien, et savait parfaitement -l'arithmétique. L'anabaptiste Jacques en fit son teneur de -livres. Au bout de deux mois, étant obligé d'aller à Lisbonne -pour les affaires de son commerce, il mena dans son vaisseau ses -deux philosophes. Pangloss lui expliqua comment tout était on ne -peut mieux. Jacques n'était pas de cet avis. Il faut bien, -disait-il, que les hommes aient un peu corrompu la nature, car -ils ne sont point nés loups, et ils sont devenus loups. Dieu ne -leur a donné ni canons de vingt-quatre, ni baïonnettes, et ils se -sont fait des baïonnettes et des canons pour se détruire. Je -pourrais mettre en ligne de compte les banqueroutes, et la -justice qui s'empare des biens des banqueroutiers pour en -frustrer les créanciers. Tout cela était indispensable, -répliquait le docteur borgne, et les malheurs particuliers font -le bien général; de sorte que plus il y a de malheurs -particuliers, et plus tout est bien. Tandis qu'il raisonnait, -l'air s'obscurcit, les vents soufflèrent des quatre coins du -monde, et le vaisseau fut assailli de la plus horrible tempête, à -la vue du port de Lisbonne. - - -CHAPITRE V. - -Tempête, naufrage, tremblement de terre, et ce qui advint du -docteur Pangloss, de Candide, et de l'anabaptiste Jacques. - -La moitié des passagers affaiblis, expirants de ces angoisses -inconcevables que le roulis d'un vaisseau porte dans les nerfs et -dans toutes les humeurs du corps agitées en sens contraires, -n'avait pas même la force de s'inquiéter du danger. L'autre -moitié jetait des cris et fesait des prières; les voiles étaient -déchirées, les mâts brisés, le vaisseau entr'ouvert. Travaillait -qui pouvait, personne ne s'entendait, personne ne commandait. -L'anabaptiste aidait un peu à la manoeuvre; il était sur le -tillac; un matelot furieux le frappe rudement et l'étend sur les -planches; mais du coup qu'il lui donna, il eut lui-même une si -violente secousse, qu'il tomba hors du vaisseau, la tête la -première. Il restait suspendu et accroché à une partie de mât -rompu. Le bon Jacques court à son secours, l'aide à remonter, et -de l'effort qu'il fait, il est précipité dans la mer à la vue du -matelot, qui le laissa périr sans daigner seulement le regarder. -Candide approche, voit son bienfaiteur qui reparaît un moment, et -qui est englouti pour jamais. Il veut se jeter après lui dans la -mer: le philosophe Pangloss l'en empêche, en lui prouvant que la -rade de Lisbonne avait été formée exprès pour que cet anabaptiste -s'y noyât. Tandis qu'il le prouvait _à priori_, le vaisseau -s'entr'ouvre, tout périt à la réserve de Pangloss, de Candide, et -de ce brutal de matelot qui avait noyé le vertueux anabaptiste; -le coquin nagea heureusement jusqu'au rivage, où Pangloss et -Candide furent portés sur une planche. - -Quand ils furent revenus un peu à eux, ils marchèrent vers -Lisbonne; il leur restait quelque argent, avec lequel ils -espéraient se sauver de la faim après avoir échappé à la tempête. - -A peine ont-ils mis le pied dans la ville, en pleurant la mort de -leur bienfaiteur, qu'ils sentent la terre trembler sous leurs -pas[1]; la mer s'élève en bouillonnant dans le port, et brise les -vaisseaux qui sont à l'ancre. Des tourbillons de flammes et de -cendres couvrent les rues et les places publiques; les maisons -s'écroulent, les toits sont renversés sur les fondements, et les -fondements se dispersent; trente mille habitants de tout âge et -de tout sexe sont écrasés sous des ruines. Le matelot disait en -sifflant et en jurant: il y aura quelque chose à gagner ici. -Quelle peut être la raison suffisante de ce phénomène? disait -Pangloss. Voici le dernier jour du monde! s'écriait Candide. -Le matelot court incontinent au milieu des débris, affronte la -mort pour trouver de l'argent, en trouve, s'en empare, s'enivre, -et ayant cuvé son vin, achète les faveurs de la première fille de -bonne volonté qu'il rencontre sur les ruines des maisons -détruites, et au milieu des mourants et des morts. Pangloss le -tirait cependant par la manche: Mon ami, lui disait-il, cela -n'est pas bien, vous manquez à la raison universelle, vous prenez -mal votre temps. Tête et sang, répondit l'autre, je suis matelot -et né à Batavia; j'ai marché quatre fois sur le crucifix dans -quatre voyages au Japon[2]; tu as bien trouvé ton homme avec ta -raison universelle! - - - [1] Le tremblement de terre de Lisbonne est du 1er novembre 1755. - B. - - [2] Voyez tome XVIII, page 470. B. - - -Quelques éclats de pierre avaient blessé Candide; il était étendu -dans la rue et couvert de débris. Il disait à Pangloss: Hélas! -procure-moi un peu de vin et d'huile; je me meurs. Ce -tremblement de terre n'est pas une chose nouvelle, répondit -Pangloss; la ville de Lima éprouva les mêmes secousses en -Amérique l'année passée; mêmes causes, mêmes effets; il y a -certainement une traînée de soufre sous terre depuis Lima jusqu'à -Lisbonne. Rien n'est plus probable, dit Candide; mais, pour -Dieu, un peu d'huile et de vin. Comment probable? répliqua le -philosophe, je soutiens que la chose est démontrée. Candide -perdit connaissance, et Pangloss lui apporta un peu d'eau d'une -fontaine voisine. - -Le lendemain, ayant trouvé quelques provisions de bouche en se -glissant à travers des décombres, ils réparèrent un peu leurs -forces. Ensuite ils travaillèrent comme les autres à soulager -les habitants échappés à la mort. Quelques citoyens, secourus -par eux, leur donnèrent un aussi bon dîner qu'on le pouvait dans -un tel désastre: il est vrai que le repas était triste; les -convives arrosaient leur pain de leurs larmes; mais Pangloss les -consola, en les assurant que les choses ne pouvaient être -autrement: Car, dit-il, tout ceci est ce qu'il y a de mieux; car -s'il y a un volcan à Lisbonne, il ne pouvait être ailleurs; car -il est impossible que les choses ne soient pas où elles sont, car -tout est bien. - -Un petit homme noir, familier de l'inquisition, lequel était à -côté de lui, prit poliment la parole et dit: Apparemment que -monsieur ne croit pas au péché originel; car si tout est au -mieux, il n'y a donc eu ni chute ni punition. - -Je demande très humblement pardon à votre excellence, répondit -Pangloss encore plus poliment, car la chute de l'homme et la -malédiction entraient nécessairement dans le meilleur des mondes -possibles. Monsieur ne croit donc pas à la liberté? dit le -familier. Votre excellence m'excusera, dit Pangloss; la liberté -peut subsister avec la nécessité absolue; car il était nécessaire -que nous fussions libres; car enfin la volonté déterminée...... -Pangloss était au milieu de sa phrase, quand Je familier fit un -signe de tête à son estafier qui lui servait à boire du vin de -Porto ou d'Oporto. diff --git a/vendor/golang.org/x/text/encoding/testdata/candide-windows-1252.txt b/vendor/golang.org/x/text/encoding/testdata/candide-windows-1252.txt deleted file mode 100644 index 1f8f9eaaf..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/candide-windows-1252.txt +++ /dev/null @@ -1,510 +0,0 @@ -This file was derived from -http://www.gutenberg.org/cache/epub/4650/pg4650.txt --------- - - CANDIDE, - - ou - - L'OPTIMISME, - - TRADUIT DE L'ALLEMAND - - DE M. LE DOCTEUR RALPH, - - AVEC LES ADDITIONS - - QU'ON A TROUVES DANS LA POCHE DU DOCTEUR, LORSQU'IL MOURUT - - MINDEN, L'AN DE GRCE 1759 - - 1759 - - - -CHAPITRE I. - -Comment Candide fut lev dans un beau chteau, et comment il fut -chass d'icelui. - -Il y avait en Vestphalie, dans le chteau de M. le baron de -Thunder-ten-tronckh, un jeune garon qui la nature avait donn -les moeurs les plus douces. Sa physionomie annonait son me. -Il avait le jugement assez droit, avec l'esprit le plus simple; -c'est, je crois, pour cette raison qu'on le nommait Candide. Les -anciens domestiques de la maison souponnaient qu'il tait fils -de la soeur de monsieur le baron et d'un bon et honnte -gentilhomme du voisinage, que cette demoiselle ne voulut jamais -pouser parce qu'il n'avait pu prouver que soixante et onze -quartiers, et que le reste de son arbre gnalogique avait t -perdu par l'injure du temps. - -Monsieur le baron tait un des plus puissants seigneurs de la -Westphalie, car son chteau avait une porte et des fentres. Sa -grande salle mme tait orne d'une tapisserie. Tous les chiens -de ses basses-cours composaient une meute dans le besoin; ses -palefreniers taient ses piqueurs; le vicaire du village tait -son grand-aumnier. Ils l'appelaient tous monseigneur, et ils -riaient quand il fesait des contes. - -Madame la baronne, qui pesait environ trois cent cinquante -livres, s'attirait par l une trs grande considration, et -fesait les honneurs de la maison avec une dignit qui la rendait -encore plus respectable. Sa fille Cungonde, ge de dix-sept -ans, tait haute en couleur, frache, grasse, apptissante. Le -fils du baron paraissait en tout digne de son pre. Le -prcepteur Pangloss[1] tait l'oracle de la maison, et le petit -Candide coutait ses leons avec toute la bonne foi de son ge et -de son caractre. - - [1] De _pan_, tout, et _glossa_, langue. B. - - -Pangloss enseignait la mtaphysico-thologo-cosmolonigologie. Il -prouvait admirablement qu'il n'y a point d'effet sans cause, et -que, dans ce meilleur des mondes possibles, le chteau de -monseigneur le baron tait le plus beau des chteaux, et madame -la meilleure des baronnes possibles. - -Il est dmontr, disait-il, que les choses ne peuvent tre -autrement; car tout tant fait pour une fin, tout est -ncessairement pour la meilleure fin. Remarquez bien que les nez -ont t faits pour porter des lunettes; aussi avons-nous des -lunettes[2]. Les jambes sont visiblement institues pour tre -chausses, et nous avons des chausses. Les pierres ont t -formes pour tre tailles et pour en faire des chteaux; aussi -monseigneur a un trs beau chteau: le plus grand baron de la -province doit tre le mieux log; et les cochons tant faits pour -tre mangs, nous mangeons du porc toute l'anne: par consquent, -ceux qui ont avanc que tout est bien ont dit une sottise; il -fallait dire que tout est au mieux. - - [2] Voyez tome XXVII, page 528; et dans les _Mlanges_, anne - 1738, le chapitre XI de la troisime partie des _lments de la - philosophie de Newton_; et anne 1768, le chapitre X des - _Singularits de la nature_. B. - - -Candide coutait attentivement, et croyait innocemment; car il -trouvait mademoiselle Cungonde extrmement belle, quoiqu'il ne -prt jamais la hardiesse de le lui dire. Il concluait qu'aprs -le bonheur d'tre n baron de Thunder-ten-tronckh, le second -degr de bonheur tait d'tre mademoiselle Cungonde; le -troisime, de la voir tous les jours; et le quatrime, d'entendre -matre Pangloss, le plus grand philosophe de la province, et par -consquent de toute la terre. - -Un jour Cungonde, en se promenant auprs du chteau, dans le -petit bois qu'on appelait parc, vit entre des broussailles le -docteur Pangloss qui donnait une leon de physique exprimentale - la femme de chambre de sa mre, petite brune trs jolie et trs -docile. Comme mademoiselle Cungonde avait beaucoup de -disposition pour les sciences, elle observa, sans souffler, les -expriences ritres dont elle fut tmoin; elle vit clairement -la raison suffisante du docteur, les effets et les causes, et -s'en retourna tout agite, toute pensive, toute remplie du dsir -d'tre savante, songeant qu'elle pourrait bien tre la raison -suffisante du jeune Candide, qui pouvait aussi tre la sienne. - -Elle rencontra Candide en revenant au chteau, et rougit: Candide -rougit aussi . Elle lui dit bonjour d'une voix entrecoupe; et -Candide lui parla sans savoir ce qu'il disait. Le lendemain, -aprs le dner, comme on sortait de table, Cungonde et Candide -se trouvrent derrire un paravent; Cungonde laissa tomber son -mouchoir, Candide le ramassa; elle lui prit innocemment la main; -le jeune homme baisa innocemment la main de la jeune demoiselle -avec une vivacit, une sensibilit, une grce toute particulire; -leurs bouches se rencontrrent, leurs yeux s'enflammrent, leurs -genoux tremblrent, leurs mains s'garrent. M. le baron de -Thunder-ten-tronckh passa auprs du paravent, et voyant cette -cause et cet effet, chassa Candide du chteau grands coups de -pied dans le derrire. Cungonde s'vanouit: elle fut soufflete -par madame la baronne ds qu'elle fut revenue elle-mme; et -tout fut constern dans le plus beau et le plus agrable des -chteaux possibles. - - - -CHAPITRE II - -Ce que devint Candide parmi les Bulgares. - - -Candide, chass du paradis terrestre, marcha longtemps sans -savoir o, pleurant, levant les yeux au ciel, les tournant -souvent vers le plus beau des chteaux qui renfermait la plus -belle des baronnettes; il se coucha sans souper au milieu des -champs entre deux sillons; la neige tombait gros flocons. -Candide, tout transi, se trana le lendemain vers la ville -voisine, qui s'appelle _Valdberghoff-trarbk-dikdorff_, n'ayant -point d'argent, mourant de faim et de lassitude. Il s'arrta -tristement la porte d'un cabaret. Deux hommes habills de bleu -le remarqurent: Camarade, dit l'un, voil un jeune homme trs -bien fait, et qui a la taille requise; ils s'avancrent vers -Candide et le prirent dner trs civilement.--Messieurs, leur -dit Candide avec une modestie charmante, vous me faites beaucoup -d'honneur, mais je n'ai pas de quoi payer mon cot.--Ah! -monsieur, lui dit un des bleus, les personnes de votre figure et -de votre mrite ne paient jamais rien: n'avez-vous pas cinq pieds -cinq pouces de haut?--Oui, messieurs, c'est ma taille, dit-il en -fesant la rvrence.--Ah! monsieur, mettez-vous table; non -seulement nous vous dfraierons, mais nous ne souffrirons jamais -qu'un homme comme vous manque d'argent; les hommes ne sont faits -que pour se secourir les uns les autres.--Vous avez raison, dit -Candide; c'est ce que M. Pangloss m'a toujours dit, et je vois -bien que tout est au mieux. On le prie d'accepter quelques cus, -il les prend et veut faire son billet; on n'en veut point, on se -met table. N'aimez-vous pas tendrement?....--Oh! oui, -rpond-il, j'aime tendrement mademoiselle Cungonde.--Non, dit -l'un de ces messieurs, nous vous demandons si vous n'aimez pas -tendrement le roi des Bulgares?--Point du tout, dit-il, car je ne -l'ai jamais vu.--Comment! c'est le plus charmant des rois, et il -faut boire sa sant.--Oh! trs volontiers, messieurs. Et il -boit. C'en est assez, lui dit-on, vous voil l'appui, le -soutien, le dfenseur, le hros des Bulgares; votre fortune est -faite, et votre gloire est assure. On lui met sur-le-champ les -fers aux pieds, et on le mne au rgiment. On le fait tourner -droite, gauche, hausser la baguette, remettre la baguette, -coucher en joue, tirer, doubler le pas, et on lui donne trente -coups de bton; le lendemain, il fait l'exercice un peu moins -mal, et il ne reoit que vingt coups; le surlendemain, on ne lui -en donne que dix, et il est regard par ses camarades comme un -prodige. - -Candide, tout stupfait, ne dmlait pas encore trop bien comment -il tait un hros. Il s'avisa un beau jour de printemps de -s'aller promener, marchant tout droit devant lui, croyant que -c'tait un privilge de l'espce humaine, comme de l'espce -animale, de se servir de ses jambes son plaisir. Il n'eut pas -fait deux lieues que voil quatre autres hros de six pieds qui -l'atteignent, qui le lient, qui le mnent dans un cachot. On lui -demanda juridiquement ce qu'il aimait le mieux d'tre fustig -trente-six fois par tout le rgiment, ou de recevoir -la-fois -douze balles de plomb dans la cervelle. Il eut beau dire que les -volonts sont libres, et qu'il ne voulait ni l'un ni l'autre, il -fallut faire un choix; il se dtermina, en vertu du don de Dieu -qu'on nomme _libert_, passer trente-six fois par les -baguettes; il essuya deux promenades. Le rgiment tait compos -de deux mille hommes; cela lui composa quatre mille coups de -baguette, qui, depuis la nuque du cou jusqu'au cul, lui -dcouvrirent les muscles et les nerfs. Comme on allait procder - la troisime course, Candide, n'en pouvant plus, demanda en -grce qu'on voult bien avoir la bont de lui casser la tte; il -obtint cette faveur; on lui bande les yeux; on le fait mettre -genoux. Le roi des Bulgares passe dans ce moment, s'informe du -crime du patient; et comme ce roi avait un grand gnie, il -comprit, par tout ce qu'il apprit de Candide, que c'tait un -jeune mtaphysicien fort ignorant des choses de ce monde, et il -lui accorda sa grce avec une clmence qui sera loue dans tous -les journaux et dans tous les sicles. Un brave chirurgien -gurit Candide en trois semaines avec les mollients enseigns -par Dioscoride. Il avait dj un peu de peau et pouvait marcher, -quand le roi des Bulgares livra bataille au roi des Abares. - - - -CHAPITRE III. - -Comment Candide se sauva d'entre les Bulgares, et ce qu'il -devint. - - -Rien n'tait si beau, si leste, si brillant, si bien ordonn que -les deux armes. Les trompettes, les fifres, les hautbois, les -tambours, les canons; formaient une harmonie telle qu'il n'y en -eut jamais en enfer. Les canons renversrent d'abord peu prs -six mille hommes de chaque ct; ensuite la mousqueterie ta du -meilleur des mondes environ neuf dix mille coquins qui en -infectaient la surface. La baonnette fut aussi la raison -suffisante de la mort de quelques milliers d'hommes. Le tout -pouvait bien se monter une trentaine de mille mes. Candide, -qui tremblait comme un philosophe, se cacha du mieux qu'il put -pendant cette boucherie hroque. - -Enfin, tandis que les deux rois fesaient chanter des _Te Deum_, -chacun dans son camp, il prit le parti d'aller raisonner ailleurs -des effets et des causes. Il passa par-dessus des tas de morts -et de mourants, et gagna d'abord un village voisin; il tait en -cendres: c'tait un village abare que les Bulgares avaient brl, -selon les lois du droit public. Ici des vieillards cribls de -coups regardaient mourir leurs femmes gorges, qui tenaient -leurs enfants leurs mamelles sanglantes; l des filles -ventres aprs avoir assouvi les besoins naturels de quelques -hros, rendaient les derniers soupirs; d'autres demi brles -criaient qu'on achevt de leur donner la mort. Des cervelles -taient rpandues sur la terre ct de bras et de jambes -coups. - -Candide s'enfuit au plus vite dans un autre village: il -appartenait des Bulgares, et les hros abares l'avaient trait -de mme. Candide, toujours marchant sur des membres palpitants -ou travers des ruines, arriva enfin hors du thtre de la -guerre, portant quelques petites provisions dans son bissac, et -n'oubliant jamais mademoiselle Cungonde. Ses provisions lui -manqurent quand il fut en Hollande; mais ayant entendu dire que -tout le monde tait riche dans ce pays-l, et qu'on y tait -chrtien, il ne douta pas qu'on ne le traitt aussi bien qu'il -l'avait t dans le chteau de M. le baron, avant qu'il en et -t chass pour les beaux yeux de mademoiselle Cungonde. - -Il demanda l'aumne plusieurs graves personnages, qui lui -rpondirent tous que, s'il continuait faire ce mtier, on -l'enfermerait dans une maison de correction pour lui apprendre -vivre. - -Il s'adressa ensuite un homme qui venait de parler tout seul -une heure de suite sur la charit dans une grande assemble. Cet -orateur le regardant de travers lui dit: Que venez-vous faire -ici? y tes-vous pour la bonne cause? Il n'y a point d'effet sans -cause, rpondit modestement Candide; tout est enchan -ncessairement et arrang pour le mieux. Il a fallu que je fusse -chass d'auprs de mademoiselle Cungonde, que j'aie pass par -les baguettes, et il faut que je demande mon pain, jusqu' ce que -je puisse en gagner; tout cela ne pouvait tre autrement. Mon -ami, lui dit l'orateur, croyez-vous que le pape soit -l'antechrist? Je ne l'avais pas encore entendu dire, rpondit -Candide: mais qu'il le soit, ou qu'il ne le soit pas, je manque -de pain. Tu ne mrites pas d'en manger, dit l'autre: va, coquin, -va, misrable, ne m'approche de ta vie. La femme de l'orateur -ayant mis la tte la fentre, et avisant un homme qui doutait -que le pape ft antechrist, lui rpandit sur le chef un -plein..... O ciel! quel excs se porte le zle de la religion -dans les dames! - -Un homme qui n'avait point t baptis, un bon anabaptiste, nomm -Jacques, vit la manire cruelle et ignominieuse dont on traitait -ainsi un de ses frres, un tre deux pieds sans plumes, qui -avait une me; il l'amena chez lui, le nettoya, lui donna du pain -et de la bire, lui fit prsent de deux florins, et voulut mme -lui apprendre travailler dans ses manufactures aux toffes de -Perse qu'on fabrique en Hollande. Candide se prosternant presque -devant lui, s'criait: Matre Pangloss me l'avait bien dit que -tout est au mieux dans ce monde, car je suis infiniment plus -touch de votre extrme gnrosit que de la duret de ce -monsieur manteau noir, et de madame son pouse. - -Le lendemain, en se promenant, il rencontra un gueux tout couvert -de pustules, les yeux morts, le bout du nez rong, la bouche de -travers, les dents noires, et parlant de la gorge, tourment -d'une toux violente, et crachant une dent chaque effort. - - - -CHAPITRE IV. - -Comment Candide rencontra son ancien matre de philosophie, le -docteur Pangloss, et ce qui en advint. - - -Candide, plus mu encore de compassion que d'horreur, donna cet -pouvantable gueux les deux florins qu'il avait reus de son -honnte anabaptiste Jacques. Le fantme le regarda fixement, -versa des larmes, et sauta son cou. Candide effray recule. -Hlas! dit le misrable l'autre misrable, ne reconnaissez-vous -plus votre cher Pangloss? Qu'entends-je? vous, mon cher matre! -vous, dans cet tat horrible! quel malheur vous est-il donc -arriv? pourquoi n'tes-vous plus dans le plus beau des chteaux? -qu'est devenue mademoiselle Cungonde, la perle des filles, le -chef-d'oeuvre de la nature? Je n'en peux plus, dit Pangloss. -Aussitt Candide le mena dans l'table de l'anabaptiste, o il -lui fit manger un peu de pain; et quand Pangloss fut refait: Eh -bien! lui dit-il, Cungonde? Elle est morte, reprit l'autre. -Candide s'vanouit ce mot: son ami rappela ses sens avec un peu -de mauvais vinaigre qui se trouva par hasard dans l'table. -Candide rouvre les yeux. Cungonde est morte! Ah! meilleur des -mondes, o tes-vous? Mais de quelle maladie est-elle morte? ne -serait-ce point de m'avoir vu chasser du beau chteau de monsieur -son pre grands coups de pied? Non, dit Pangloss, elle a t -ventre par des soldats bulgares, aprs avoir t viole autant -qu'on peut l'tre; ils ont cass la tte monsieur le baron qui -voulait la dfendre; madame la baronne a t coupe en morceaux; -mon pauvre pupille trait prcisment comme sa soeur; et quant au -chteau, il n'est pas rest pierre sur pierre, pas une grange, -pas un mouton, pas un canard, pas un arbre; mais nous avons t -bien vengs, car les Abares en ont fait autant dans une baronnie -voisine qui appartenait un seigneur bulgare. - -A ce discours, Candide s'vanouit encore; mais revenu soi, et -ayant dit tout ce qu'il devait dire, il s'enquit de la cause et -de l'effet, et de la raison suffisante qui avait mis Pangloss -dans un si piteux tat. Hlas! dit l'autre, c'est l'amour: -l'amour, le consolateur du genre humain, le conservateur de -l'univers, l'me de tous les tres sensibles, le tendre amour. -Hlas! dit Candide, je l'ai connu cet amour, ce souverain des -coeurs, cette me de notre me; il ne m'a jamais valu qu'un -baiser et vingt coups de pied au cul. Comment cette belle cause -a-t-elle pu produire en vous un effet si abominable? - -Pangloss rpondit en ces termes: O mon cher Candide! vous avez -connu Paquette, cette jolie suivante de notre auguste baronne: -j'ai got dans ses bras les dlices du paradis, qui ont produit -ces tourments d'enfer dont vous me voyez dvor; elle en tait -infecte, elle en est peut-tre morte. Paquette tenait ce -prsent d'un cordelier trs savant qui avait remont la source, -car il l'avait eu d'une vieille comtesse, qui l'avait reu d'un -capitaine de cavalerie, qui le devait une marquise, qui le -tenait d'un page, qui l'avait reu d'un jsuite, qui, tant -novice, l'avait eu en droite ligne d'un des compagnons de -Christophe Colomb. Pour moi, je ne le donnerai personne, car -je me meurs. - -O Pangloss! s'cria Candide, voil une trange gnalogie! -n'est-ce pas le diable qui en fut la souche? Point du tout, -rpliqua ce grand homme; c'tait une chose indispensable dans le -meilleur des mondes, un ingrdient ncessaire; car si Colomb -n'avait pas attrap dans une le de l'Amrique cette maladie[1] -qui empoisonne la source de la gnration, qui souvent mme -empche la gnration, et qui est videmment l'oppos du grand -but de la nature, nous n'aurions ni le chocolat ni la cochenille; -il faut encore observer que jusqu'aujourd'hui, dans notre -continent, cette maladie nous est particulire, comme la -controverse. Les Turcs, les Indiens, les Persans, les Chinois, -les Siamois, les Japonais, ne la connaissent pas encore; mais il -y a une raison suffisante pour qu'ils la connaissent leur tour -dans quelques sicles. En attendant elle a fait un merveilleux -progrs parmi nous, et surtout dans ces grandes armes composes -d'honntes stipendiaires bien levs, qui dcident du destin des -tats; on peut assurer que, quand trente mille hommes combattent -en bataille range contre des troupes gales en nombre, il y a -environ vingt mille vrols de chaque ct. - - [1] Voyez tome XXXI, page 7. B. - - -Voil qui est admirable, dit Candide; mais il faut vous faire -gurir. Et comment le puis-je? dit Pangloss; je n'ai pas le sou, -mon ami, et dans toute l'tendue de ce globe on ne peut ni se -faire saigner, ni prendre un lavement sans payer, ou sans qu'il y -ait quelqu'un qui paie pour nous. - -Ce dernier discours dtermina Candide; il alla se jeter aux pieds -de son charitable anabaptiste Jacques, et lui fit une peinture si -touchante de l'tat o son ami tait rduit, que le bon-homme -n'hsita pas recueillir le docteur Pangloss; il le fit gurir -ses dpens. Pangloss, dans la cure, ne perdit qu'un oeil et une -oreille. Il crivait bien, et savait parfaitement -l'arithmtique. L'anabaptiste Jacques en fit son teneur de -livres. Au bout de deux mois, tant oblig d'aller Lisbonne -pour les affaires de son commerce, il mena dans son vaisseau ses -deux philosophes. Pangloss lui expliqua comment tout tait on ne -peut mieux. Jacques n'tait pas de cet avis. Il faut bien, -disait-il, que les hommes aient un peu corrompu la nature, car -ils ne sont point ns loups, et ils sont devenus loups. Dieu ne -leur a donn ni canons de vingt-quatre, ni baonnettes, et ils se -sont fait des baonnettes et des canons pour se dtruire. Je -pourrais mettre en ligne de compte les banqueroutes, et la -justice qui s'empare des biens des banqueroutiers pour en -frustrer les cranciers. Tout cela tait indispensable, -rpliquait le docteur borgne, et les malheurs particuliers font -le bien gnral; de sorte que plus il y a de malheurs -particuliers, et plus tout est bien. Tandis qu'il raisonnait, -l'air s'obscurcit, les vents soufflrent des quatre coins du -monde, et le vaisseau fut assailli de la plus horrible tempte, -la vue du port de Lisbonne. - - -CHAPITRE V. - -Tempte, naufrage, tremblement de terre, et ce qui advint du -docteur Pangloss, de Candide, et de l'anabaptiste Jacques. - -La moiti des passagers affaiblis, expirants de ces angoisses -inconcevables que le roulis d'un vaisseau porte dans les nerfs et -dans toutes les humeurs du corps agites en sens contraires, -n'avait pas mme la force de s'inquiter du danger. L'autre -moiti jetait des cris et fesait des prires; les voiles taient -dchires, les mts briss, le vaisseau entr'ouvert. Travaillait -qui pouvait, personne ne s'entendait, personne ne commandait. -L'anabaptiste aidait un peu la manoeuvre; il tait sur le -tillac; un matelot furieux le frappe rudement et l'tend sur les -planches; mais du coup qu'il lui donna, il eut lui-mme une si -violente secousse, qu'il tomba hors du vaisseau, la tte la -premire. Il restait suspendu et accroch une partie de mt -rompu. Le bon Jacques court son secours, l'aide remonter, et -de l'effort qu'il fait, il est prcipit dans la mer la vue du -matelot, qui le laissa prir sans daigner seulement le regarder. -Candide approche, voit son bienfaiteur qui reparat un moment, et -qui est englouti pour jamais. Il veut se jeter aprs lui dans la -mer: le philosophe Pangloss l'en empche, en lui prouvant que la -rade de Lisbonne avait t forme exprs pour que cet anabaptiste -s'y noyt. Tandis qu'il le prouvait _ priori_, le vaisseau -s'entr'ouvre, tout prit la rserve de Pangloss, de Candide, et -de ce brutal de matelot qui avait noy le vertueux anabaptiste; -le coquin nagea heureusement jusqu'au rivage, o Pangloss et -Candide furent ports sur une planche. - -Quand ils furent revenus un peu eux, ils marchrent vers -Lisbonne; il leur restait quelque argent, avec lequel ils -espraient se sauver de la faim aprs avoir chapp la tempte. - -A peine ont-ils mis le pied dans la ville, en pleurant la mort de -leur bienfaiteur, qu'ils sentent la terre trembler sous leurs -pas[1]; la mer s'lve en bouillonnant dans le port, et brise les -vaisseaux qui sont l'ancre. Des tourbillons de flammes et de -cendres couvrent les rues et les places publiques; les maisons -s'croulent, les toits sont renverss sur les fondements, et les -fondements se dispersent; trente mille habitants de tout ge et -de tout sexe sont crass sous des ruines. Le matelot disait en -sifflant et en jurant: il y aura quelque chose gagner ici. -Quelle peut tre la raison suffisante de ce phnomne? disait -Pangloss. Voici le dernier jour du monde! s'criait Candide. -Le matelot court incontinent au milieu des dbris, affronte la -mort pour trouver de l'argent, en trouve, s'en empare, s'enivre, -et ayant cuv son vin, achte les faveurs de la premire fille de -bonne volont qu'il rencontre sur les ruines des maisons -dtruites, et au milieu des mourants et des morts. Pangloss le -tirait cependant par la manche: Mon ami, lui disait-il, cela -n'est pas bien, vous manquez la raison universelle, vous prenez -mal votre temps. Tte et sang, rpondit l'autre, je suis matelot -et n Batavia; j'ai march quatre fois sur le crucifix dans -quatre voyages au Japon[2]; tu as bien trouv ton homme avec ta -raison universelle! - - - [1] Le tremblement de terre de Lisbonne est du 1er novembre 1755. - B. - - [2] Voyez tome XVIII, page 470. B. - - -Quelques clats de pierre avaient bless Candide; il tait tendu -dans la rue et couvert de dbris. Il disait Pangloss: Hlas! -procure-moi un peu de vin et d'huile; je me meurs. Ce -tremblement de terre n'est pas une chose nouvelle, rpondit -Pangloss; la ville de Lima prouva les mmes secousses en -Amrique l'anne passe; mmes causes, mmes effets; il y a -certainement une trane de soufre sous terre depuis Lima jusqu' -Lisbonne. Rien n'est plus probable, dit Candide; mais, pour -Dieu, un peu d'huile et de vin. Comment probable? rpliqua le -philosophe, je soutiens que la chose est dmontre. Candide -perdit connaissance, et Pangloss lui apporta un peu d'eau d'une -fontaine voisine. - -Le lendemain, ayant trouv quelques provisions de bouche en se -glissant travers des dcombres, ils rparrent un peu leurs -forces. Ensuite ils travaillrent comme les autres soulager -les habitants chapps la mort. Quelques citoyens, secourus -par eux, leur donnrent un aussi bon dner qu'on le pouvait dans -un tel dsastre: il est vrai que le repas tait triste; les -convives arrosaient leur pain de leurs larmes; mais Pangloss les -consola, en les assurant que les choses ne pouvaient tre -autrement: Car, dit-il, tout ceci est ce qu'il y a de mieux; car -s'il y a un volcan Lisbonne, il ne pouvait tre ailleurs; car -il est impossible que les choses ne soient pas o elles sont, car -tout est bien. - -Un petit homme noir, familier de l'inquisition, lequel tait -ct de lui, prit poliment la parole et dit: Apparemment que -monsieur ne croit pas au pch originel; car si tout est au -mieux, il n'y a donc eu ni chute ni punition. - -Je demande trs humblement pardon votre excellence, rpondit -Pangloss encore plus poliment, car la chute de l'homme et la -maldiction entraient ncessairement dans le meilleur des mondes -possibles. Monsieur ne croit donc pas la libert? dit le -familier. Votre excellence m'excusera, dit Pangloss; la libert -peut subsister avec la ncessit absolue; car il tait ncessaire -que nous fussions libres; car enfin la volont dtermine...... -Pangloss tait au milieu de sa phrase, quand Je familier fit un -signe de tte son estafier qui lui servait boire du vin de -Porto ou d'Oporto. diff --git a/vendor/golang.org/x/text/encoding/testdata/rashomon-euc-jp.txt b/vendor/golang.org/x/text/encoding/testdata/rashomon-euc-jp.txt deleted file mode 100644 index 7b03a9906..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/rashomon-euc-jp.txt +++ /dev/null @@ -1,178 +0,0 @@ -This file was derived from -http://www.gutenberg.org/cache/epub/1982/pg1982.txt --------- - - -ζǷ - -λǤ롣ͤβͤβDZߤԤäƤ -βˤϡˤγï⤤ʤ꡹ðɤ礭ʱˡ꤮ -ꤹɤȤޤäƤ롣礬ϩˤʾϡˤγˤ⡢ -򤹤Խޤ汨˹Ҥ⤦󻰿ͤϤꤽʤΤǤ롣줬ˤγ -ï⤤ʤ -ΤȱȡǯԤˤϡϿ̤ȤȤлȤȤ -ĤŤƵäΤӤϰ̤Ǥʤ쵭ˤȡʩ -ʩǺդơðĤꡢʤϤˤĤꤷڤϩФ -Ĥ߽ŤͤƿŤʤˤäƤȱȤǤ롣椬λǤ뤫顢 -νʤɤϡïΤƤƸܤߤԤʤäȤιӤ̤Ƥ -褤ˤơìʤˤࡣͤࡣȤȤޤˤϡ -ʤͤ򡢤ػäơΤƤƹԤȱ褿ǡ -ʤʤȡïǤⵤ̣򰭤äơζؤ­֤ߤ򤷤ʤˤʤ -ƤޤäΤǤ롣 -褫餫󽸤ޤä褿ָȡȤ -ؤơ⤤ʤӡˤΤޤƤʤ顢ӤޤäƤ롣 -ζͼƤǤʤˤϡ줬ޤ褦ˤϤä긫 -ϡξˤͤߤΤǤ롣⺣ϡ¤ -챩⸫ʤͣ꡹줫äƤܤĹ -Ϥʤξˡʵʤˤ򤯤ӤĤƤΤ롣 -ϼʤʤΰ־ʤ餷βʤˤοơˤ˽ -褿礭⮡ʤˤӡˤ򵤤ˤʤ顢ܤꡢΤդΤįƤΤ -롣 -ԤϤäֲͤߤԤäƤפȽ񤤤ͤϡ -Ǥ̤ɤ褦ȱƤϤʤդʤ顢ͤβȤصĤȦǤ -롣꤬μͤϡ͸˲ˤФ줿ˤ񤤤褦ˡԤ -Įϰ̤ʤ餺ƤβͤǯȤƤͤˤФ -줿Τ⡢οξ;Ȥ˳ʤʤ顢ֲͤߤԤäƤ -ȱ⡢ֱˤդꤳ줿ͤԤ꤬ʤơˤƤפ -ŬǤ롣ξ塢ζͤ⾯ʤ餺ʿīβͤ -Sentimentalisme˱ƶʤˤιﲼ꤫դФϡ̤˾ -뤱ʤǡͤϡƤ⺹뤷ɤˤ -ȤơФɤˤʤʤ򡢤ɤˤ褦ȤơȤȤʤ -򤿤ɤʤ顢äϩˤդ뱫βʹȤʤʹƤ -ĤĤǡ󤯤顢äȱ򤢤ĤƤ롣ͼǤϼ˶ -㤯ơ夲ȡβФˤĤФᰡʤ餫ˤˡŤ -Ť٤Ƥ롣 -ɤˤʤʤ򡢤ɤˤ٤ˤϡʤǤʤȤޡˤϤʤ -ǤСϡʤĤˤβƻФڤξǡʤˡˤ򤹤 -Ǥ롣ơξػäơΤ褦˼ΤƤƤޤФ -Ǥ롣ФʤȤСͤιͤϡ٤Ʊƻˤȶˡä -ζɽذ夷Ρ֤СפϡĤǤäƤ⡢ɡ֤Сפ -äͤϡʤФʤȤꤷʤ⡢Ρ֤СפΤ -Ĥ٤ˡθĤͤˤʤ곰˻ʤפȱ -ѶŪ˹ꤹΡͦФˤΤǤ롣 -ͤ礭ʤˤ򤷤ơ줫顢絷Ω夬äͼ䤨Τ -Ԥϡ⤦вߤδǤ롣Ȥδ֤ͼǤȶ˱θ -ʤ᤭̤롣ðɤˤȤޤäƤ꤮ꤹ⡢⤦ɤعԤäƤޤ - -ͤϡ¤ʤ顢δΡʤߡˤ˽Ťͤβθ⤯ -Τޤ򸫤ޤ路δΤʤܤˤΤʤճڤˤͤ줽 -ʽ꤬СǤȤ⤫⡢ȻפäǤ롣ȡ -ξϰؾ롢ιǷðɤäҤˤĤʤ顢ͤˤ -Ƥ⡢ɤͤФǤ롣ͤϡǹˤʤҤŤˤ -ʤ褦˵Ĥʤ顢Ϥ­򡢤Ҥΰֲʤؤ -ߤ -줫顢ʬθǤ롣ϰξؽФ롢ιҤʤˡ -ˤǭΤ褦˿Ȥ¤ơ©򻦤ʤ顢ƻҤ򱮤äƤϰξ夫 -餵Фθˡˤαˤ̤餷Ƥ롣ûʤҤˤˡ -֤ǿä⮤ΤˤǤ롣ͤϡϤᤫ顢ξˤԤϡͤФ -ȹäƤ줬ҤʾäƸȡǤïФȤܤơ -⤽βФ¶躡ưƤ餷ϡä -򤫤ŷ΢ˡʤǤäΤǡˤΤ줿ΤǤ -롣αˡξǡФȤ⤷Ƥ뤫ϡɤͣμԤǤϤ - -ͤϡܼʤˤΤ褦­̤ǡäȵޤҤ򡢰־ʤ -礦褦ˤƾĤ᤿Τʿˤʤ顢 -ؽФơ붲롢ϰƸ -ȡϰˤϡʹ̤ꡢĤλӳʤˤ̵¤˴Ƥ -뤬ФθεڤϰϤפä궹ΤǡϴĤȤ狼ʤͣ -ܤʤ顢ΤΤϡλӳȡʪ夿ӳȤȱ -롣ˤϽˤޤäƤ餷ơλӳϳ줬 -ʤĤơˡƤʹ֤ȱ¤ڤԤͤ¤äͷ -褦ˡ򳫤ꡢФꤷơξˤäƤ -⡢ȤȤι⤯ʤäƤʬˡܤꤷФθ򤦤ơ㤯ʤä -ʬαƤذŤʤ顢ʵפ˰ʤˤǡۤäƤ -ͤϡλӳ।˻פ鷺ɡäʤäˡ -μϡνִ֤ˤϡ⤦ɡ椦˺Ƥ붯ؼʤۤȤ -ɤȤȤˤˤ̳ФåäƤޤäǤ롣 -ͤδϡλϤơ¶ӳäƤʤޤäƤ˿ʹ -򸫤ȩʤҤϤˤʪؤ㤤餻ȱƬΡΤ褦 -Ϸ̤Ǥ롣Ϸ̤ϡμ˲ФȤ⤷Ҥäơλӳΰ -δ褦įƤȱӤĹ򸫤ȡ¿ʬλӳǤ -ͤϡϻʬζݤȻʬι񿴤ȤươûϸƵۡʤˤ򤹤Τ -˺Ƥ쵭εԤθڤСƬȡʤȤˤӤפ褦˴ -ΤǤ롣ȡϷ̤ϡҤ򡢾Ĥδ֤ޤơ줫顢ޤį -Ƥӳμξ򤫤ȡ١οƤλҤ͡ʤߡˤȤ褦 -ˡĹȱӤܤȴϤ᤿ȱϼ˽äȴ餷 -ȱӤܤȴΤ˽äƲͤοϡݤľäƹԤ -ơƱˡϷ̤ФϤư褿 -䡢Ϸ̤ФȱäƤϡ뤫Τʤǫʤषˡ -밭Фȿʬ˶褿ΤǤ롣λïβͤˡ -äβǤˤͤƤʤˡˤ򤹤뤫ͤˤʤ뤫ȱ -򡢲ƻФ顢餯ͤϡ̤ʤǤ -ۤɡˤΰ࿴ϡϷ̤ξޤҤΤ褦ˡ褯dz -ƤΤǤ롣 -ͤˤϡϷ̤ͤȱӤȴ狼ʤääơŪ -ˤϡβҤŤƤ褤ΤʤäͤˤȤäƤϡ -ˡξǡͤȱӤȴȱǴ˵ -餶밭Ǥäͤϡäʬͤˤʤ뵤Ǥʤϡ -˺ƤΤǤ롣 -ǡͤϡξ­ϤơʤꡢҤӾ夬ä -ʤҤŤˤ˼򤫤ʤ顢ԤϷ̤ߤäϷ̤ -äΤϡʤ -Ϸ̤ϡܲͤ򸫤ȡޤ׸ʤߡˤˤǤƤ줿褦ˡӾ夬 - -֤Τ졢ɤعԤ -ͤϡϷ̤ӳˤĤޤŤʤ顢Ƥդᤤƨ褦ȤԼɤǡ -ͤäϷ̤ϡǤⲼͤĤΤƹԤȤ롣ͤԤ -ޤȤơɤͤϻӳǡá̵ΤޤޡĤ߹ä -ϡϤᤫ顢狼äƤ롣ͤϤȤȤϷ̤ӤĤǡ̵ -ؤͤݤ١ܡʤȤˤεӤΤ褦ʡФӤǤ롣 -ֲ򤷤Ƥ򤷤Ƥ̤ȡ衣 -ͤϡϷ̤Ĥȡʤꡢξʧäơ򤤹ݡʤϤ͡ˤο -δؤĤĤɤ⡢Ϸ̤ۤäƤ롣ξʤʤդ碌ơ -©ڤʤ顢򡢴夬ޤ֤γؽФˤʤơΤ褦 -˼ٹʤ夦͡ˤۤäƤ롣򸫤ȡͤϻϤˤϷ̤ -ʬΰջ֤˻ۤƤȱռơΰռϡ -ޤǤϤdzƤο򲿻ʤġˤδ֤ˤޤƤޤä˻Ĥ -ΤϡͣŻ򤷤ơ줬Ρ¤餫դ­Ȥ -ФǤ롣ǡͤϡϷ̤򡢸ʤ顢Ƥä -ָʤϸȡʤӤˤģͤʤɤǤϤʤβ̤꤫ -ιμԤ餪򤫤ơɤ褦ȱ褦ʻϤʤͣʬ -ξǡ򤷤ƤΤʤäФΤ -ȡϷ̤ϡ򡢰礭ơäȤβͤδ򸫼ä -ޤ֤֤ʤäĻΤ褦ʡԤǸΤǤ롣줫顢Ⲥǡء -ɡȰĤˤʤä򲿤ʪǤǤ褦ư٤ǡäʩ -ưƤΤ롣λι顢ʤ餹ˤƤ褦ä -ͤμä褿 -֤ȱȴƤʡνȱȴƤʡʤĤˤˤ褦Ȼפ -㡣 -ͤϡϷ̤¸ʿޤʤΤ˼˾Ƽ˾Ʊˡ -ΤȰ줷ˡؤϤä褿ȡεʤˤ -ؤ̤ΤǤϷ̤ϡҼˡޤӳƬåʤȡˤäĹȴ -Ӥäʤꡢ걡ʤҤˤΤĤ֤䤯褦ǡʤ顢ʻ򱾤 - -ͤȱӤȴȱϡΤ̡ͤ -¿ϡΰ̤ʻ򡢤Ƥ⤤ʹ֤ФǤ롣ˡʬȱȴ -ʤɤϡؤФꤺĤڤäƴΤ򡢴ʤۤˤȱäơ -ӡʤϤˤοؤ˹Ԥä¤ˤäƻʤʤäʤ顢Ǥ -˹ԤäƤ⤷ʤ⡢ν봳ϡ̣褤ȱΤǡ -Ӥ礫äƤΤǤ롣ʬϡνΤȤ -פʤʤСʤˡˤ򤹤ΤǡʤǤ롣 -顢ʬΤƤⰭȤϻפʤϤꤷʤС -򤹤ΤǡʤǤ롣ơλʤ򡢤褯 -ΤäƤνϡʬΤƤΤˤʤȻפǤ -롣Ϸ̤ϡΤʰ̣λ򱾤ä -ͤϡˤơ򺸤μǤʤ顢Ȥơ -äʹƤμǤϡ֤ˤǿ礭⮡ʤˤӡˤ -ˤʤ顢ʹƤΤǤ롣ǷʹƤˡͤοˤϡ -ͦޤ褿ϡäβǤˤ˷礱ƤͦǤ롣 -ơäξؾʤˤäơϷ̤ᤨͦȤϡ -ȿФưȤͦǤ롣ͤϡ򤹤뤫ͤˤʤ뤫¤ʤ -ФǤϤʤλΤˤο鱾Сʤɤȱϡء -ʤռγɤФƤ -֤äȡ -Ϸ̤äȡͤޡʤˤ褦ǰ򲡤ơ­ -ؽФȡ԰դˡμ⮤ΥơϷ̤ζ߾ʤ꤬ߡˤĤߤʤ顢 -ä -֤ǤϡʤʤҤϤˤ򤷤褦Ⱥޤʡʤ⤽ʤС -ΤʤΤ -ͤϡФ䤯Ϸ̤ʪȤä줫顢­ˤߤĤȤϷ -̤򡢼ӤӳξؽݤҤθޤǤϡϤ˸ФǤ롣 -ͤϡȤäɰȩʪ來ˤơޤ֤˵ޤҤ -ꤿ -á褦ݤƤϷ̤ӳ椫顢Τ򵯤Τϡ -줫֤ʤλǤ롣Ϸ̤ϡĤ֤䤯褦ʡ᤯褦ΩƤʤ顢 -ޤdzƤФθ򤿤ˡҤθޤǡäƹԤäơ顢 -ûȱݡʤޡˤˤơβˤϡͣƶʤ -Ȥˤ뤬ФǤ롣 -ͤϡˡơԤĮضƯ˵ޤǤ diff --git a/vendor/golang.org/x/text/encoding/testdata/rashomon-iso-2022-jp.txt b/vendor/golang.org/x/text/encoding/testdata/rashomon-iso-2022-jp.txt deleted file mode 100644 index 0bc24bc1b..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/rashomon-iso-2022-jp.txt +++ /dev/null @@ -1,178 +0,0 @@ -This file was derived from -http://www.gutenberg.org/cache/epub/1982/pg1982.txt --------- -$BMe@8Lg(B - -$B3)@nN6G72p(B - -$B!!0?F|$NJkJ}$N;v$G$"$k!#0l?M$N2<?M$,!"Me@8Lg$N2<$G1+$d$_$rBT$C$F$$$?!#!!9-$$Lg(B -$B$N2<$K$O!"$3$NCK$N30$KC/$b$$$J$$!#$?$@!"=j!9C0EI$NGm$2$?!"Bg$-$J1_Cl$K!"$-$j$.(B -$B$j$9$,0lI$$H$^$C$F$$$k!#Me@8Lg$,!"<k?}BgO)$K$"$k0J>e$O!"$3$NCK$N30$K$b!"1+$d$_(B -$B$r$9$k;T=w3^$dYf1(K9;R$,!"$b$&Fs;0?M$O$"$j$=$&$J$b$N$G$"$k!#$=$l$,!"$3$NCK$N30(B -$B$KC/$b$$$J$$!#(B -$B!!2?8N$+$H1>$&$H!"$3$NFs;0G/!"5~ET$K$O!"CO?L$H$+DTIw$H$+2P;v$H$+q@q<$H$+1>$&:R(B -$B$$$,$D$E$$$F5/$3$C$?!#$=$3$GMlCf$N$5$S$lJ}$O0lDL$j$G$J$$!#5l5-$K$h$k$H!"J)A|$d(B -$BJ)6q$rBG:U$$$F!"$=$NC0$,$D$$$?$j!"6b6d$NGs!J$O$/!K$,$D$$$?$j$7$?LZ$r!"O)$P$?$K(B -$B$D$_=E$M$F?E$NNA!J$7$m!K$KGd$C$F$$$?$H1>$&$3$H$G$"$k!#MlCf$,$=$N;OKv$G$"$k$+$i!"(B -$BMe@8Lg$N=$M}$J$I$O!"85$h$jC/$b<N$F$F8\$_$k<T$,$J$+$C$?!#$9$k$H$=$N9S$l2L$F$?$N(B -$B$r$h$$;v$K$7$F!"8QC,!J$3$j!K$,@3$`!#Ep?M$,@3$`!#$H$&$H$&$7$^$$$K$O!"0z<h$j<j$N(B -$B$J$$;`?M$r!"$3$NLg$X;}$C$FMh$F!"<N$F$F9T$/$H1>$&=,47$5$(=PMh$?!#$=$3$G!"F|$NL\(B -$B$,8+$($J$/$J$k$H!"C/$G$b5$L#$r0-$,$C$F!"$3$NLg$N6a=j$X$OB-$V$_$r$7$J$$;v$K$J$C(B -$B$F$7$^$C$?$N$G$"$k!#(B -$B!!$=$NBe$jKtrm$,2?=h$+$i$+!"$?$/$5$s=8$^$C$FMh$?!#Ck4V8+$k$H!"$=$Nrm$,2?1)$H$J(B -$B$/NX$rIA$$$F!"9b$$rvHx!J$7$S!K$N$^$o$j$rSF$-$J$,$i!"Ht$S$^$o$C$F$$$k!#<l$KLg$N(B -$B>e$N6u$,!"M<>F$1$G$"$+$/$J$k;~$K$O!"$=$l$,8UKc$r$^$$$?$h$&$K$O$C$-$j8+$($?!#rm(B -$B$O!"L^O@!"Lg$N>e$K$"$k;`?M$NFy$r!"Bo$_$KMh$k$N$G$"$k!#!<!<L`$b:#F|$O!"9o8B$,CY(B -$B$$$;$$$+!"0l1)$b8+$($J$$!#M#!"=j!9!"Jx$l$+$+$C$?!"$=$&$7$F$=$NJx$lL\$KD9$$Ap$N(B -$B$O$($?@PCJ$N>e$K!"rm$NJ5!J$/$=!K$,!"E@!9$HGr$/$3$S$j$D$$$F$$$k$N$,8+$($k!#2<?M(B -$B$O<7CJ$"$k@PCJ$N0lHV>e$NCJ$K@v$$$6$i$7$?:0$N2(!J$"$*!K$N?,$r?x$($F!"1&$NKK$K=P(B -$BMh$?!"Bg$-$JLLb.!J$K$-$S!K$r5$$K$7$J$,$i!"$\$s$d$j!"1+$N$U$k$N$rD/$a$F$$$k$N$G(B -$B$"$k!#(B -$B!!:n<T$O$5$C$-!"!V2<?M$,1+$d$_$rBT$C$F$$$?!W$H=q$$$?!#$7$+$7!"2<?M$O!"1+$,$d$s(B -$B$G$b3JJL$I$&$7$h$&$H1>$&Ev$F$O$J$$!#$U$@$s$J$i!"L^O@!"<g?M$N2H$X5"$k2D$-H&$G$"(B -$B$k!#=j$,$=$N<g?M$+$i$O!";M8^F|A0$K2K$r=P$5$l$?!#A0$K$b=q$$$?$h$&$K!"Ev;~5~ET$N(B -$BD.$O0lDL$j$J$i$:?jHy$7$F$$$?!#:#$3$N2<?M$,!"1JG/!";H$o$l$F$$$?<g?M$+$i2K$r=P$5(B -$B$l$?$N$b!"$3$N?jHy$N>.$5$JM>GH$K30$J$i$J$$!#$@$+$i!"!V2<?M$,1+$d$_$rBT$C$F$$$?!W(B -$B$H1>$&$h$j$b!"!V1+$K$U$j$3$a$i$l$?2<?M$,!"9T$-=j$,$J$/$F!"ESJ}$K$/$l$F$$$?!W$H(B -$B1>$&J}$,!"E,Ev$G$"$k!#$=$N>e!":#F|$N6uLOMM$b>/$J$+$i$:$3$NJ?0BD+$N2<?M$N(B -Sentimentalisme$B$K1F6A$7$?!#?=!J$5$k!K$N9o2<$,$j$+$i$U$j=P$7$?1+$O!"L$$@$K>e(B -$B$,$k$1$7$-$,$J$$!#$=$3$G!"2<?M$O!"2?$rA<$$$F$b:9Ev$?$jL@F|$NJk$7$r$I$&$K$+$7$h(B -$B$&$H$7$F!<!<1>$o$P$I$&$K$b$J$i$J$$;v$r!"$I$&$K$+$7$h$&$H$7$F!"$H$j$H$a$b$J$$9M(B -$B$($r$?$I$j$J$,$i!"$5$C$-$+$i<k?}BgO)$K$U$k1+$N2;$rJ9$/$H$b$J$/J9$$$F$$$?!#(B -$B!!1+$OMe@8Lg$r$D$D$s$G!"1s$/$+$i!"$6$"$C$H1>$&2;$r$"$D$a$F$/$k!#M<0G$O<!Bh$K6u(B -$B$rDc$/$7$F!"8+>e$2$k$H!"Lg$N20:,$,!"<P$a$K$D$-=P$7$?a0!J$$$i$+!K$N@h$K!"=E$?$/(B -$B$&$90E$$1@$r;Y$($F$$$k!#(B -$B!!$I$&$K$b$J$i$J$$;v$r!"$I$&$K$+$9$k0Y$K$O!"<jCJ$rA*$s$G$$$kn#!J$$$H$^!K$O$J$$!#(B -$BA*$s$G$$$l$P!"C[CO!J$D$$$8!K$N2<$+!"F;$P$?$NEZ$N>e$G!"q@;`!J$&$($8$K!K$r$9$k$P(B -$B$+$j$G$"$k!#$=$&$7$F!"$3$NLg$N>e$X;}$C$FMh$F!"8$$N$h$&$K<N$F$i$l$F$7$^$&$P$+$j(B -$B$G$"$k!#A*$P$J$$$H$9$l$P!<!<2<?M$N9M$($O!"2?EY$bF1$8F;$rDcWK$7$?MH6g$K!"$d$C$H(B -$B$3$N6I=j$X0)Ce$7$?!#$7$+$7$3$N!V$9$l$P!W$O!"$$$D$b$G$?$C$F$b!"7k6I!V$9$l$P!W$G(B -$B$"$C$?!#2<?M$O!"<jCJ$rA*$P$J$$$H$$$&;v$r9NDj$7$J$,$i$b!"$3$N!V$9$l$P!W$N$+$?$r(B -$B$D$1$k0Y$K!"EvA3!"$3$N8e$KMh$k2D$-!VEp?M$K$J$k$h$j30$K;EJ}$,$J$$!W$H1>$&;v$r!"(B -$B@Q6KE*$K9NDj$9$k$@$1$N!"M&5$$,=P$:$K$$$?$N$G$"$k!#(B -$B!!2<?M$OBg$-$JSj!J$/$5$a!K$r$7$F!"$=$l$+$i!"Bg57$=$&$KN)>e$,$C$?!#M<Nd$($N$9$k(B -$B5~ET$O!"$b$&2P23$,M_$7$$Dx$N4($5$G$"$k!#Iw$OLg$NCl$HCl$H$N4V$r!"M<0G$H6&$K1sN8(B -$B$J$/!"?a$-$L$1$k!#C0EI$NCl$K$H$^$C$F$$$?$-$j$.$j$9$b!"$b$&$I$3$+$X9T$C$F$7$^$C(B -$B$?!#(B -$B!!2<?M$O!"pt$r$A$B$a$J$,$i!";3?a$N4@jN!J$+$6$_!K$K=E$M$?!":0$N2($N8*$r9b$/$7$F(B -$BLg$N$^$o$j$r8+$^$o$7$?!#1+Iw$N45$N$J$$!"?ML\$K$+$+$kW|$N$J$$!"0lHU3Z$K$M$i$l$=(B -$B$&$J=j$,$"$l$P!"$=$3$G$H$b$+$/$b!"Lk$rL@$+$=$&$H;W$C$?$+$i$G$"$k!#$9$k$H!"9,Lg(B -$B$N>e$NO0$X>e$k!"I}$N9-$$!"G7$bC0$rEI$C$?Dt;R$,4c$K$D$$$?!#>e$J$i!"?M$,$$$?$K$7(B -$B$F$b!"$I$&$;;`?M$P$+$j$G$"$k!#2<?M$O!"$=$3$G9x$K$5$2$?@;JA!J$R$8$j$E$+!K$NB@Ea(B -$B$,>dAv$i$J$$$h$&$K5$$r$D$1$J$,$i!"ONApMz$r$O$$$?B-$r!"$=$NDt;R$N0lHV2<$NCJ$X$U(B -$B$_$+$1$?!#(B -$B!!$=$l$+$i!"2?J,$+$N8e$G$"$k!#Me@8Lg$NO0$N>e$X=P$k!"I}$N9-$$Dt;R$NCfCJ$K!"0l?M(B -$B$NCK$,!"G-$N$h$&$K?H$r$A$B$a$F!"B)$r;&$7$J$,$i!">e$NMF;R$r1.$C$F$$$?!#O0$N>e$+(B -$B$i$5$92P$N8w$,!"$+$9$+$K!"$=$NCK$N1&$NKK$r$L$i$7$F$$$k!#C;$$r$!J$R$2!K$NCf$K!"(B -$B@V$/G?$r;}$C$?LLb.$N$"$kKK$G$"$k!#2<?M$O!";O$a$+$i!"$3$N>e$K$$$k<T$O!";`?M$P$+(B -$B$j$@$H9b$r3g$C$F$$$?!#$=$l$,!"Dt;R$rFs;0CJ>e$C$F8+$k$H!">e$G$OC/$+2P$r$H$\$7$F!"(B -$B$7$+$b$=$N2P$rB6=h:!=h$HF0$+$7$F$$$k$i$7$$!#$3$l$O!"$=$NBy$C$?!"2+$$$m$$8w$,!"(B -$B6y!9$KCXia$NAc$r$+$1$?E70fN"$K!"$f$l$J$,$i1G$C$?$N$G!"$9$0$K$=$l$HCN$l$?$N$G$"(B -$B$k!#$3$N1+$NLk$K!"$3$NMe@8Lg$N>e$G!"2P$r$H$b$7$F$$$k$+$i$O!"$I$&$;M#$N<T$G$O$J(B -$B$$!#(B -$B!!2<?M$O!"5\<i!J$d$b$j!K$N$h$&$KB-2;$r$L$9$s$G!"$d$C$H5^$JDt;R$r!"0lHV>e$NCJ$^(B -$B$GGg$&$h$&$K$7$F>e$j$D$a$?!#$=$&$7$FBN$r=PMh$k$@$1!"J?$K$7$J$,$i!"pt$r=PMh$k$@(B -$B$1!"A0$X=P$7$F!"62$k62$k!"O0$NFb$rGA$$$F8+$?!#(B -$B!!8+$k$H!"O0$NFb$K$O!"1=$KJ9$$$?DL$j!"4v$D$+$N;S3<!J$7$,$$!K$,!"L5B$:n$K4~$F$F(B -$B$"$k$,!"2P$N8w$N5Z$VHO0O$,!";W$C$?$h$j69$$$N$G!"?t$O4v$D$H$b$o$+$i$J$$!#M#!"$*(B -$B$\$m$2$J$,$i!"CN$l$k$N$O!"$=$NCf$KMg$N;S3<$H!"CeJ*$rCe$?;S3<$H$,$"$k$H1>$&;v$G(B -$B$"$k!#L^O@!"Cf$K$O=w$bCK$b$^$8$C$F$$$k$i$7$$!#$=$&$7$F!"$=$N;S3<$O3'!"$=$l$,!"(B -$B>(!J$+$D$F!K!"@8$-$F$$$??M4V$@$H1>$&;v<B$5$(5?$o$l$kDx!"EZ$rYT$M$FB$$C$??M7A$N(B -$B$h$&$K!"8}$r3+$$$?$j!"<j$r1d$P$7$?$j$7$F!"$4$m$4$m>2$N>e$K$3$m$,$C$F$$$?!#$7$+(B -$B$b!"8*$H$+6;$H$+$N9b$/$J$C$F$$$kItJ,$K!"$\$s$d$j$7$?2P$N8w$r$&$1$F!"Dc$/$J$C$F(B -$B$$$kItJ,$N1F$r0lAX0E$/$7$J$,$i!"1J5W$K0"!J$*$7!K$NG!$/L[$C$F$$$?!#(B -$B!!2<?M$O!"$=$l$i$N;S3<$NIe`%$7$?=-5$$K;W$o$:!"I!$r1f$C$?!J$*$*$C$?!K!#$7$+$7!"(B -$B$=$N<j$O!"<!$N=V4V$K$O!"$b$&I!$r1f$&;v$rK:$l$F$$$?!#0?$k6/$$46>p$,KX<=!J$[$H$s(B -$B$I$3$H$4$H$/!K$3$NCK$NSL3P$rC%$C$F$7$^$C$?$+$i$G$"$k!#(B -$B!!2<?M$N4c$O!"$=$N;~!"$O$8$a$F!"B6;S3<$NCf$Km-$C$F$$$k!J$&$:$/$^$C$F$$$k!K?M4V(B -$B$r8+$?!#[XH)?'!J$R$O$@$$$m!K$NCeJ*$rCx$?!"GX$NDc$$!"Ai$;$?!"GrH1F,$N!"1n$N$h$&(B -$B$JO7GL$G$"$k!#$=$NO7GL$O!"1&$N<j$K2P$r$H$b$7$?>>$NLZJR$r;}$C$F!"$=$N;S3<$N0l$D(B -$B$N4i$rGA$-$3$`$h$&$KD/$a$F$$$?!#H1$NLS$ND9$$=j$r8+$k$H!"B?J,=w$N;S3<$G$"$m$&!#(B -$B!!2<?M$O!"O;J,$N62I]$H;MJ,$N9%4q?4$H$KF0$+$5$l$F!";C;~$O8F5[!J$$$-!K$r$9$k$N$5(B -$B$(K:$l$F$$$?!#5l5-$N5-<T$N8l$r<Z$j$l$P!"!VF,?H!J$H$&$7$s!K$NLS$bB@$k!W$h$&$K46(B -$B$8$?$N$G$"$k!#$9$k$H!"O7GL$O!">>$NLZJR$r!">2HD$N4V$KA^$7$F!"$=$l$+$i!":#$^$GD/(B -$B$a$F$$$?;S3<$N<s$KN><j$r$+$1$k$H!"CzEY!"1n$N?F$,1n$N;R$NiM!J$7$i$_!K$r$H$k$h$&(B -$B$K!"$=$ND9$$H1$NLS$r0lK\$:$DH4$-$O$8$a$?!#H1$O<j$K=>$C$FH4$1$k$i$7$$!#(B -$B!!$=$NH1$NLS$,!"0lK\$:$DH4$1$k$N$K=>$C$F2<?M$N?4$+$i$O!"62I]$,>/$7$:$D>C$($F9T$C(B -$B$?!#$=$&$7$F!"$=$l$HF1;~$K!"$=$NO7GL$KBP$9$k$O$2$7$$A~0-$,!">/$7$:$DF0$$$FMh$?!#(B -$B$$$d!"$3$NO7GL$KBP$9$k$H1>$C$F$O!"8lJ@$,$"$k$+$bCN$l$J$$!#G+!J$`$7$m!K!"$"$i$f(B -$B$k0-$KBP$9$kH?46$,!"0lJ,Kh$K6/$5$rA}$7$FMh$?$N$G$"$k!#$3$N;~!"C/$+$,$3$N2<?M$K!"(B -$B$5$C$-Lg$N2<$G$3$NCK$,9M$($F$$$?!"q@;`!J$&$($8$K!K$r$9$k$+Ep?M$K$J$k$+$H1>$&Ld(B -$BBj$r!"2~$a$F;}=P$7$?$i!"62$i$/2<?M$O!"2?$NL$N}$b$J$/!"q@;`$rA*$s$@;v$G$"$m$&!#(B -$B$=$l$[$I!"$3$NCK$N0-$rA~$`?4$O!"O7GL$N>2$KA^$7$?>>$NLZJR$N$h$&$K!"@*$h$/G3$(>e(B -$B$,$j$@$7$F$$$?$N$G$"$k!#(B -$B!!2<?M$K$O!"L^O@!"2?8NO7GL$,;`?M$NH1$NLS$rH4$/$+$o$+$i$J$+$C$?!#=>$C$F!"9gM}E*(B -$B$K$O!"$=$l$rA10-$N2?$l$KJR$E$1$F$h$$$+CN$i$J$+$C$?!#$7$+$72<?M$K$H$C$F$O!"$3$N(B -$B1+$NLk$K!"$3$NMe@8Lg$N>e$G!";`?M$NH1$NLS$rH4$/$H1>$&;v$,!"$=$l$@$1$G4{$K5v$92D(B -$B$i$6$k0-$G$"$C$?!#L^O@!!2<?M$O!!$5$C$-Kx<+J,$,!"Ep?M$K$J$k5$$G$$$?;v$J$>$O!!$H(B -$B$&$KK:$l$F$$$k$N$G$"$k!#(B -$B!!$=$3$G!"2<?M$O!"N>B-$KNO$rF~$l$F!"$$$+$J$j!"Dt;R$+$i>e$XHt$S>e$,$C$?!!$=$&$7(B -$B$F@;JA!J$R$8$j$E$+!K$NB@Ea$K<j$r$+$1$J$,$i!"Bg8T$KO7GL$NA0$XJb$_$h$C$?!#O7GL$,(B -$B6C$$$?$N$O!!1>$&Kx$b$J$$!#(B -$B!!O7GL$O!"0lL\2<?M$r8+$k$H!"$^$k$GW8!J$$$7$f$_!K$K$G$bCF$+$l$?$h$&$K!!Ht$S>e$,$C(B -$B$?!#(B -$B!!!V$*$N$l!"$I$3$X9T$/!#!W(B -$B!!2<?M$O!"O7GL$,;S3<$K$D$^$E$-$J$,$i!"92$F$U$?$a$$$FF($2$h$&$H$9$k9T<j$r:I$$$G!"(B -$B$3$&GM$C$?!#O7GL$O!"$=$l$G$b2<?M$r$D$-$N$1$F9T$3$&$H$9$k!#2<?M$OKt!"$=$l$r9T$+(B -$B$9$^$$$H$7$F!"2!$7$b$I$9!#Fs?M$O;S3<$NCf$G!";C!"L58@$N$^$^!"$D$+$_9g$C$?!#$7$+(B -$B$7>!Ii$O!"$O$8$a$+$i!"$o$+$C$F$$$k!#2<?M$O$H$&$H$&!"O7GL$NOS$r$D$+$s$G!"L5M}$K(B -$B$=$3$X$M$8E]$7$?!#CzEY!"7\!J$H$j!K$N5S$N$h$&$J!"9|$HHi$P$+$j$NOS$G$"$k!#(B -$B!!!V2?$r$7$F$$$?!#$5$"2?$r$7$F$$$?!#1>$(!#1>$o$L$H!!$3$l$@$>$h!#!W(B -$B!!2<?M$O!"O7GL$r$D$-J|$9$H!"$$$-$J$j!"B@Ea$N>d$rJ'$C$F!"Gr$$9]!J$O$,$M!K$N?'$r(B -$B$=$N4c$NA0$X$D$-$D$1$?!#$1$l$I$b!"O7GL$OL[$C$F$$$k!#N><j$r$o$J$o$J$U$k$o$;$F!"(B -$B8*$GB)$r@Z$j$J$,$i!"4c$r!"4c5e$,$^$V$?$N30$X=P$=$&$K$J$kDx!"8+3+$$$F!"0"$N$h$&(B -$B$K<9Y9!J$7$e$&$M!K$/L[$C$F$$$k!#$3$l$r8+$k$H!"2<?M$O;O$a$FL@Gr$K$3$NO7GL$N@8;`(B -$B$,!"A4A3!"<+J,$N0U;V$K;YG[$5$l$F$$$k$H1>$&;v$r0U<1$7$?!#$=$&$7$F!"$3$N0U<1$O!"(B -$B:#$^$G$O$2$7$/G3$($F$$$?A~0-$N?4$r2?;~!J$$$D!K$N4V$K$+Nd$^$7$F$7$^$C$?!#8e$K;D$C(B -$B$?$N$O!"M#!"0?;E;v$r$7$F!"$=$l$,1_K~$K@.="$7$?;~$N!"0B$i$+$JF@0U$HK~B-$H$,$"$k(B -$B$P$+$j$G$"$k!#$=$3$G!"2<?M$O!"O7GL$r!"8+2<$2$J$,$i!">/$7@<$r=@$2$F$3$&1>$C$?!#(B -$B!!!V8J$O8!Hs0c;H!J$1$S$$$7!K$ND#$NLr?M$J$I$G$O$J$$!#:#$7J}$3$NLg$N2<$rDL$j$+$+$C(B -$B$?N9$N<T$@!#$@$+$i$*A0$KFl$r$+$1$F!"$I$&$7$h$&$H1>$&$h$&$J;v$O$J$$!#M#:#;~J,!"(B -$B$3$NLg$N>e$G!"2?$r$7$F$$$?$N$@$+!"$=$l$r8J$KOC$5$($9$l$P$$$$$N$@!#!W(B -$B!!$9$k$H!"O7GL$O!"8+3+$$$?4c$r!"0lAXBg$-$/$7$F!"$8$C$H$=$N2<?M$N4i$r8+<i$C$?!#(B -$B$^$V$?$N@V$/$J$C$?!"Fy?)D;$N$h$&$J!"1T$$4c$G8+$?$N$G$"$k!#$=$l$+$i!"b2$G!"KX!"(B -$BI!$H0l$D$K$J$C$??0$r2?$+J*$G$b3z$s$G$$$k$h$&$KF0$+$7$?!#:Y$$9"$G!"@m$C$?9"J)$N(B -$BF0$$$F$$$k$N$,8+$($k!#$=$N;~!"$=$N9"$+$i!"rm!J$+$i$9!K$NSF$/$h$&$J@<$,!"SC$.SC(B -$B$.!"2<?M$N<*$XEA$o$C$FMh$?!#(B -$B!!!V$3$NH1$rH4$$$F$J!"$3$N=w$NH1$rH4$$$F$J!"r#!J$+$D$i!K$K$7$h$&$H;W$&$?$N(B -$B$8$c!#!W(B -$B!!2<?M$O!"O7GL$NEz$,B830!"J?K^$J$N$K<:K>$7$?!#$=$&$7$F<:K>$9$k$HF1;~$K!"KtA0$N(B -$BA~0-$,!"Nd$JInJN$H0l$7$g$K!"?4$NCf$X$O$$$C$FMh$?!#$9$k$H!!$=$N5$?'!J$1$7$-!K$,!"(B -$B@hJ}$X$bDL$8$?$N$G$"$m$&!#O7GL$O!"JR<j$K!"$^$@;S3<$NF,$+$iC%!J$H!K$C$?D9$$H4$1(B -$BLS$r;}$C$?$J$j!"j1!J$R$-!K$N$D$V$d$/$h$&$J@<$G!"8}$4$b$j$J$,$i!"$3$s$J;v$r1>$C(B -$B$?!#(B -$B!!@.Dx!";`?M$NH1$NLS$rH4$/$H1>$&;v$O!"0-$$;v$+$MCN$l$L!#$7$+$7!"$3$&1>$&;`?M$N(B -$BB?$/$O!"3'!!$=$N0L$J;v$r!"$5$l$F$b$$$$?M4V$P$+$j$G$"$k!#8=$K!"<+J,$,:#!"H1$rH4(B -$B$$$?=w$J$I$O!"<X$r;M@#$P$+$j$:$D$K@Z$C$F43$7$?$N$r!"435{!J$[$7$&$*!K$@$H1>$C$F!"(B -$BB@EaBS!J$?$A$O$-!K$N?X$XGd$j$K9T$C$?!#1VIB$K$+$+$C$F;`$J$J$+$C$?$J$i!":#$G$bGd(B -$B$j$K9T$C$F$$$?$+$b$7$l$J$$!#$7$+$b!"$3$N=w$NGd$k435{$O!"L#$,$h$$$H1>$&$N$G!"B@(B -$BEaBS$?$A$,!"7g$+$5$::ZNA$KGc$C$F$$$?$N$G$"$k!#<+J,$O!"$3$N=w$N$7$?;v$,0-$$$H$O(B -$B;W$o$J$$!#$7$J$1$l$P!"q@;`!J$($&$8$K!K$r$9$k$N$G!";EJ}$,$J$/$7$?;v$@$+$i$G$"$k!#(B -$B$@$+$i!"Kt:#!"<+J,$N$7$F$$$?;v$b0-$$;v$H$O;W$o$J$$!#$3$l$b$d$O$j$7$J$1$l$P!"q@(B -$B;`$r$9$k$N$G!";EJ}$,$J$/$9$k;v$@$+$i$G$"$k!#$=$&$7$F!"$=$N;EJ}$,$J$$;v$r!"$h$/(B -$BCN$C$F$$$?$3$N=w$O!"<+J,$N$9$k;v$r5v$7$F$/$l$k$N$K$A$,$$$J$$$H;W$&$+$i$G$"(B -$B$k!#!<!<O7GL$O!"BgBN$3$s$J0UL#$N;v$r1>$C$?!#(B -$B!!2<?M$O!"B@Ea$r>d$K$*$5$a$F!"$=$NB@Ea$NJA$r:8$N<j$G$*$5$($J$,$i!"NdA3$H$7$F!"(B -$B$3$NOC$rJ9$$$F$$$?!#L^O@!"!!1&$N<j$G$O!"@V$/KK$KG?$r;}$?Bg$-$JLLb.!J$K$-$S!K$r(B -$B5$$K$7$J$,$i!"J9$$$F$$$k$N$G$"$k!#$7$+$7!"G7$rJ9$$$F$$$kCf$K!"2<?M$N?4$K$O!"0?(B -$BM&5$$,@8$^$l$FMh$?!#$=$l$O!!$5$C$-!"Lg$N2<$G$3$NCK$K7g$1$F$$$?M&5$$G$"$k!#$=$&(B -$B$7$F!"Kt$5$C$-!"$3$NLg$N>e$X>e!J$"$,!K$C$F!"$=$NO7GL$rJa$($?;~$NM&5$$H$O!"A4A3!"(B -$BH?BP$JJ}8~$KF0$3$&$H$9$kM&5$$G$"$k!#2<?M$O!"q@;`$r$9$k$+Ep?M$K$J$k$+$KLB$o$J$+$C(B -$B$?$P$+$j$G$O$J$$!#$=$N;~$N$3$NCK$N?4$b$A$+$i1>$($P!"q@;`$J$I$H1>$&;v$O!"KX!"9M(B -$B$($k;v$5$(=PMh$J$$Dx!"0U<1$N30$KDI$$=P$5$l$F$$$?!#(B -$B!!!V$-$C$H!"$=$&$+!#!W(B -$B!!O7GL$NOC$,40$k$H!"2<?M$OS^!J$"$6$1!K$k$h$&$J@<$GG0$r2!$7$?!#$=$&$7$F!"0lB-A0(B -$B$X=P$k$H!"IT0U$K!"1&$N<j$rLLb.$+$iN%$7$F!"O7GL$N6_>e!J$($j$,$_!K$r$D$+$_$J$,$i!"(B -$B$3$&1>$C$?!#(B -$B!!!V$G$O!"8J$,0zGm!J$R$O$.!K$r$7$h$&$H:($`$^$$$J!#8J$b$=$&$7$J$1$l$P!"q@;`$r$9(B -$B$kBN$J$N$@!#!W(B -$B!!2<?M$O!"$9$P$d$/!"O7GL$NCeJ*$rGm$.$H$C$?!#$=$l$+$i!"B-$K$7$,$_$D$3$&$H$9$kO7(B -$BGL$r!"<j9S$/;S3<$N>e$X=3E]$7$?!#Dt;R$N8}$^$G$O!"6O$K8^Jb$r?t$($k$P$+$j$G$"$k!#(B -$B2<?M$O!"Gm$.$H$C$?I0H)?'$NCeJ*$r$o$-$K$+$+$($F!"$^$?$?$/4V$K5^$JDt;R$rLk$NDl$X(B -$B$+$12<$j$?!#(B -$B!!;C!";`$s$@$h$&$KE]$l$F$$$?O7GL$,!";S3<$NCf$+$i!"$=$NMg$NBN$r5/$3$7$?$N$O!"$=(B -$B$l$+$i4V$b$J$/$N;v$G$"$k!#O7GL$O!"$D$V$d$/$h$&$J!"$&$a$/$h$&$J@<$rN)$F$J$,$i!"(B -$B$^$@G3$($F$$$k2P$N8w$r$?$h$j$K!"Dt;R$N8}$^$G!"Gg$C$F9T$C$?!#$=$&$7$F!"$=$3$+$i!"(B -$BC;$$GrH1$rE]!J$5$+$5$^!K$K$7$F!"Lg$N2<$rGA$-$3$s$@!#30$K$O!"M#!"9uF6!9!J$3$/$H(B -$B$&$H$&!K$?$kLk$,$"$k$P$+$j$G$"$k!#(B -$B!!2<?M$O!"4{$K!"1+$rKA$7$F!"5~ET$ND.$X6/Ep$rF/$-$K5^$$$G$$$?!#(B diff --git a/vendor/golang.org/x/text/encoding/testdata/rashomon-shift-jis.txt b/vendor/golang.org/x/text/encoding/testdata/rashomon-shift-jis.txt deleted file mode 100644 index 7a54b957f..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/rashomon-shift-jis.txt +++ /dev/null @@ -1,178 +0,0 @@ -This file was derived from -http://www.gutenberg.org/cache/epub/1982/pg1982.txt --------- - - -H열V - -@̎̕łBl̉lẢʼnJ݂҂ĂB@L -̉ɂ́A̒j̊OɒNȂBAXOh̔A傫ȉ~ɁA肬 -肷CƂ܂ĂB傪A鐝Hɂȏ́A̒j̊OɂAJ -s}❆GXqAOl͂肻Ȃ̂łBꂪA̒j̊O -ɒNȂB -@̂Ɖ]ƁA̓ONAsɂ́AnkƂҕƂΎƂ_[Ƃ] -‚ÂċNBŗ̂т͈ʂłȂBLɂƁA -ōӂāA̒O‚A̔i͂j‚肵؂AH΂ -‚ݏd˂Đd̗ijɔĂƉ]ƂłB̎nł邩A -̏CȂǂ́AN̂ĂČڂ݂҂ȂBƂ̍rʂĂ -悢ɂāAϒKijށBlށBƂƂ܂ɂ́A -ȂlA̖֎ėāÂĂčsƉ]KoBŁA̖ -ȂȂƁANłCāA̖̋ߏւ͑Ԃ݂ȂɂȂ -Ă܂̂łB -@̑薔낪炩AW܂ėBԌƁA낪HƂ -ւ`āAiсĵ܂eȂAт܂ĂBɖ -̋󂪁A[ĂłȂ鎞ɂ́AꂪӖ܂悤ɂ͂茩B -́Aܘ_Ȁɂ鎀l̓A݂ɗ̂łB[[ނ́Ax -AHȂBBAXAꂩAĂ̕ڂɒ -͂ΒȉɁA̕ijA_XƔт‚Ă̂Bl -͎iΒïԏ̒iɐ􂢂炵̉ij̐K𐘂āAE̖jɏo -A傫ȖᬁiɂсjCɂȂAڂAĴӂ̂𒭂߂Ă̂ -B -@҂͂AulJ݂҂ĂvƏBAĺAJ -łiʂǂ悤Ɖ]Ă͂ȂBӂȂAܘ_Al̉Ƃ֋A‚ł -B̎ĺAlܓOɉɂoꂽBOɂ悤ɁAs -͈ʂȂ炸ĂB̉lAiNAgĂlɂo -ꂽ̂A̐̏ȗ]gɊOȂȂBAulJ݂҂Ăv -Ɖ]AuJɂӂ肱߂ꂽlAsȂāArɂĂv -]AKłB̏A̋͗lȂ炸̉̕l -SentimentalismeɉeB\ij̍肩ӂoJ́Aɏ -邯ȂBŁAĺA[Ă薾̕邵ǂɂ -Ƃā[[]΂ǂɂȂȂAǂɂ悤ƂāAƂƂ߂Ȃl -ǂȂA鐝HɂӂJ̉𕷂ƂȂĂB -@J͗‚‚ŁAAƉ]‚߂ĂB[ł͎ɋ -ႭāAグƁẢA΂߂ɂ‚oOi炩j̐ɁAd -Â_xĂB -@ǂɂȂȂAǂɂׂɂ́AiIł硁iƂ܁j͂ȂB -Ił΁Azni‚j̉A΂̓y̏ŁA_iɁj -łBāȀ̖֎ėāÂ悤Ɏ̂ĂĂ܂΂ -łBI΂ȂƂ΁[[l̍ĺAxjgɁA -̋ǏֈB́u΁v́A‚łĂAǁu΁v -BĺAiI΂ȂƂm肵ȂÁu΁v̂ -‚ׂɁARǍɗ‚ulɂȂOɎdȂvƉ]A -ϋɓIɍm肷邾́AECoɂ̂łB -@l͑傫Ți߁jāAꂩAVɗオB[₦̂ -śAΉ~̊łB͖̒ƒƂ̊ԂA[łƋɉ -ȂAʂBOh̒ɂƂ܂Ă肬肷Aǂ֍sĂ܂ -B -@ĺA߂ȂAR̊́i݁jɏd˂Ả̌ -̂܂܂킵BJ̊̂ȂAlڂɂ霜̂ȂAӊyɂ˂ꂻ -ȏ΁AłƂA𖾂ƎvłBƁAK -̘̏O֏A̍LAVOhqɂ‚BȂAlɂ -ĂAǂl΂łBĺAōɂiЂÂj̑ -⑖Ȃ悤ɋC‚ȂAm͂A̒q̈ԉ̒iւ -݂B -@ꂩǍłB̘Ȍ֏oA̍Lq̒iɁAl -̒jAL̂悤ɐg߂āAEȂA̗eqMĂBȌォ -炳΂̌AɁA̒j̉E̖jʂ炵ĂBZ颁iЂj̒ɁA -Ԃ^ᬂ̂jłBĺAn߂Ȁɂ҂́Al΂ -肾ƍĂBꂪAqOiČƁAł͒N΂ƂڂāA -̉΂𑴏ƓĂ炵B́ȂA낢A -Xɒw偂̑V䗠ɁAȂf̂ŁAɂƒmꂽ̂ł -B̉J̖ɁȀ̗ŁA΂ƂĂ邩́AǂB̎҂ł͂ -B -@ĺA{iĵ悤ɑʂŁAƋ}ȒqAԏ̒i -Ŕ悤ɂď‚߂Bđ̂o邾AɂȂAo邾 -AO֏oāA鋰AO̓`ČB -@ƁAO̓ɂ́A\ɕʂA‚̎r[ijAɊĂ -邪A΂̌̋yԔ͈͂Av苷̂ŁA͊‚Ƃ킩ȂBBA -ڂ낰ȂAm̂́A̒ɗ̎r[ƁA𒅂r[ƂƉ] -Bܘ_Aɂ͏j܂Ă炵BāA̎r[͊FAꂪA -i‚ājAĂlԂƉ]^Ays˂đl` -悤ɁAJA΂肵āA낲돰̏ɂ낪ĂB -AƂƂ̍ȂĂ镔ɁAڂ肵΂̌āAႭȂ -镔̉ewÂȂAivɈij̔@قĂB -@ĺA̎r[̕ࣂLCɎv킸A@ijBA -̎́ȀuԂɂ́A@YĂB鋭wiقƂ -ǂƂƂj̒j̚koDĂ܂łB -@l̊́A̎A͂߂āAr[̒LĂi܂Ăjl -BwFiЂ͂j̒𒘂Aw̒ႢAÁÂ悤 -ȘVkłB̘VḱAE̎ɉ΂Ƃ̖ؕЂāA̎r[̈ -̊`ނ悤ɒ߂ĂB̖т̒ƁA̎r[ł낤B -@ĺAZ̋|Ǝl̍DSƂɓāAb͌ċziĵ -YĂBL̋L҂̌؂΁AugiƂj̖тv悤Ɋ -̂łBƁAVḱA̖ؕЂA‚̊Ԃɑ}āAꂩA܂Œ -߂Ăr[̎ɗƁAxA̐e̎qli݁jƂ悤 -ɁA̖̒т{”͂߂B͎ɏ]Ĕ炵B -@̖̔тA{”̂ɏ]ĉl̐ŚA|čs -BāAƓɁA̘Vkɑ΂͂A“ėB -A̘Vkɑ΂Ɖ]ẮAꕾ邩mȂBJiނjA -鈫ɑ΂锽Aꕪɋ𑝂ė̂łB̎AN̉lɁA -̉ł̒jlĂA_iɁj邩lɂȂ邩Ɖ] -A߂ĎoA炭ĺA̖ȂA_I񂾎ł낤B -قǁA̒j̈𑞂ސŚAVk̏ɑ}̖ؕЂ̂悤ɁA悭R -肾Ă̂łB -@lɂ́Aܘ_A̘Vkl̖̔т𔲂킩ȂB]āAI -ɂ́AP̉ɕЂÂĂ悢mȂBlɂƂẮA -J̖ɁȀ̗ŁAl̖̔т𔲂Ɖ]AꂾŊɋ -炴鈫łBܘ_@ĺ@AlɂȂCłȂ́@ -ɖYĂ̂łB -@ŁAĺAɗ͂āAȂAq֔яオ@ -ĐiЂÂj̑ɎȂA҂ɘVk̑O݂֕BVk -̂́@]ȂB -@VḱAډlƁA܂ŜWi݁jɂłeꂽ悤Ɂ@яオ -B -@ûAǂ֍sBv -@ĺAVkr[ɂ‚܂ÂȂAQĂӂ߂ē悤ƂsǂŁA -lBVḱAłl‚̂čsƂBl͖As -܂ƂāAǂBl͎r[̒ŁAbÂ܂܁A‚ݍB -́A͂߂A킩ĂBl͂ƂƂAVk̘r‚ŁA -ւ˂|BxA{iƂj̋r̂悤ȁAƔ΂̘rłB -@uĂBĂB]B]ʂƁ@ꂾBv -@ĺAVk‚ƁAȂȀ𕥂āA|i͂ˁj̐F -̊̑Oւ‚‚BǂAVk͖قĂBȂȂӂ킹āA -ő؂ȂAAዅ܂Ԃ̊O֏oɂȂAJāÂ悤 -ɎXiイˁjقĂBƁAl͎n߂Ėɂ̘Vk̐ -ASRÄӎuɎxzĂƉ]ӎBāÄӎ́A -܂ł͂RĂ̐Sij̊Ԃɂ܂Ă܂BɎc -̂́ABAdāAꂪ~ɐÁA炩ȓӂƖƂ -΂łBŁAĺAVkAȂA_Ă]B -@uȂ͌giтj̖̒lȂǂł͂ȂB̖̉ʂ肩 -̎҂B炨OɓāAǂ悤Ɖ]悤Ȏ͂ȂBBA -̖̏ŁAĂ̂AȂɘb΂̂Bv -@ƁAVḱAJAw傫āAƂ̉l̊B -܂Ԃ̐ԂȂAĤ悤ȁAsŌ̂łBꂩAᰂŁAwA -@ƈ‚ɂȂOłł悤ɓBׂAŁAA -Ă̂B̎A̍AAi炷j̚e悤ȐAbb -Al̎֓`ėB -@u̔𔲂ĂȁȀ̔𔲂ĂȁA顁i‚jɂ悤Ǝv -Bv -@ĺAVk̓OA}Ȃ̂Ɏ]BĎ]ƓɁAO -Aȕ̂ƈꂵɁAS̒ւ͂ėBƁ@̋CFijA -ւʂ̂ł낤BVḱAЎɁA܂r[̓DiƁj -тȂA寁iЂĵ‚Ԃ₭悤ȐŁAȂAȎ] -B -@Al̖̔т𔲂Ɖ]́A˒mʁBA]l -́AF@̈ʂȎAĂlԂ΂łBɁAA -Ȃǂ́Aւl΂肸‚ɐ؂Ċ̂AiقjƉ]āA -сi͂j̐w֔ɍsBuaɂĎȂȂȂAł -ɍsĂȂBȀ̔銱́A悢Ɖ]̂ŁA -тAؗɔĂ̂łB́Ȁ̂Ƃ -vȂBȂ΁A_iɁĵŁAdȂłB -AÂĂƂ͎vȂB͂肵Ȃ΁A_ -̂ŁAdȂ鎖łBāA̎dȂA悭 -mĂ̏́Â鎖Ă̂ɂȂƎvł -B[[VḱÂȈӖ̎]B -@ĺAɂ߂āȂ̎̕łȂARƂāA -̘b𕷂ĂBܘ_A@E̎ł́AԂjɔ^傫Ȗᬁiɂсj -CɂȂAĂ̂łBAV𕷂Ă钆ɁAl̐Sɂ́A -EC܂ėB́@Ảł̒jɌĂECłB -āAȀ̖֏ijāA̘Vk߂̗ECƂ́ASRA -΂ȕɓƂECłBĺA_邩lɂȂ邩ɖȂ -΂ł͂ȂB̎̂̒j̐S]΁A_ȂǂƉ]́AwAl -鎖oȂAӎ̊OɒǂoĂB -@uƁABv -@Vk̘bƁAl͚}ij悤ȐŔOBāAꑫO -֏oƁAsӂɁAE̎ᬂ痣āAVk̋ݏi肪݁j‚݂ȂA -]B -@uł́AȂiЂ͂j悤ƍނ܂ȁBȂȂ΁A_ -̂Ȃ̂Bv -@ĺA΂₭AVk̒𔍂ƂBꂩAɂ݂‚ƂV -kArr[̏֏R|Bq̌܂ł́A͂Ɍܕ𐔂΂łB -ĺAƂOF̒킫ɂāA܂Ԃɋ}Ȓq̒ -肽B -@bA񂾂悤ɓ|ĂVkAr[̒Ȃ̗̂N̂́A -ꂩԂȂ̎łBVḱA‚Ԃ₭悤ȁA߂悤Ȑ𗧂ĂȂA -܂RĂ΂̌ɁAq̌܂ŁAčsBāAA -Z|i܁jɂāẢ`񂾁BOɂ́ABAXi -Ƃj邪΂łB -@ĺAɁAJ`āAs̒֋𓭂ɋ}łB diff --git a/vendor/golang.org/x/text/encoding/testdata/rashomon-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/rashomon-utf-8.txt deleted file mode 100644 index a89032832..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/rashomon-utf-8.txt +++ /dev/null @@ -1,178 +0,0 @@ -This file was derived from -http://www.gutenberg.org/cache/epub/1982/pg1982.txt --------- -羅生門 - -芥川龍之介 - - 或日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。 広い門 -の下には、この男の外に誰もいない。ただ、所々丹塗の剥げた、大きな円柱に、きりぎ -りすが一匹とまっている。羅生門が、朱雀大路にある以上は、この男の外にも、雨やみ -をする市女笠や揉烏帽子が、もう二三人はありそうなものである。それが、この男の外 -に誰もいない。 - 何故かと云うと、この二三年、京都には、地震とか辻風とか火事とか饑饉とか云う災 -いがつづいて起こった。そこで洛中のさびれ方は一通りでない。旧記によると、仏像や -仏具を打砕いて、その丹がついたり、金銀の箔(はく)がついたりした木を、路ばたに -つみ重ねて薪の料(しろ)に売っていたと云うことである。洛中がその始末であるから、 -羅生門の修理などは、元より誰も捨てて顧みる者がなかった。するとその荒れ果てたの -をよい事にして、狐狸(こり)が棲む。盗人が棲む。とうとうしまいには、引取り手の -ない死人を、この門へ持って来て、捨てて行くと云う習慣さえ出来た。そこで、日の目 -が見えなくなると、誰でも気味を悪がって、この門の近所へは足ぶみをしない事になっ -てしまったのである。 - その代り又鴉が何処からか、たくさん集まって来た。昼間見ると、その鴉が何羽とな -く輪を描いて、高い鴟尾(しび)のまわりを啼きながら、飛びまわっている。殊に門の -上の空が、夕焼けであかくなる時には、それが胡麻をまいたようにはっきり見えた。鴉 -は、勿論、門の上にある死人の肉を、啄みに来るのである。ーー尤も今日は、刻限が遅 -いせいか、一羽も見えない。唯、所々、崩れかかった、そうしてその崩れ目に長い草の -はえた石段の上に、鴉の糞(くそ)が、点々と白くこびりついているのが見える。下人 -は七段ある石段の一番上の段に洗いざらした紺の襖(あお)の尻を据えて、右の頬に出 -来た、大きな面皰(にきび)を気にしながら、ぼんやり、雨のふるのを眺めているので -ある。 - 作者はさっき、「下人が雨やみを待っていた」と書いた。しかし、下人は、雨がやん -でも格別どうしようと云う当てはない。ふだんなら、勿論、主人の家へ帰る可き筈であ -る。所がその主人からは、四五日前に暇を出された。前にも書いたように、当時京都の -町は一通りならず衰微していた。今この下人が、永年、使われていた主人から暇を出さ -れたのも、この衰微の小さな余波に外ならない。だから、「下人が雨やみを待っていた」 -と云うよりも、「雨にふりこめられた下人が、行き所がなくて、途方にくれていた」と -云う方が、適当である。その上、今日の空模様も少なからずこの平安朝の下人の -Sentimentalismeに影響した。申(さる)の刻下がりからふり出した雨は、未だに上 -がるけしきがない。そこで、下人は、何を措いても差当たり明日の暮しをどうにかしよ -うとしてーー云わばどうにもならない事を、どうにかしようとして、とりとめもない考 -えをたどりながら、さっきから朱雀大路にふる雨の音を聞くともなく聞いていた。 - 雨は羅生門をつつんで、遠くから、ざあっと云う音をあつめてくる。夕闇は次第に空 -を低くして、見上げると、門の屋根が、斜めにつき出した甍(いらか)の先に、重たく -うす暗い雲を支えている。 - どうにもならない事を、どうにかする為には、手段を選んでいる遑(いとま)はない。 -選んでいれば、築地(ついじ)の下か、道ばたの土の上で、饑死(うえじに)をするば -かりである。そうして、この門の上へ持って来て、犬のように捨てられてしまうばかり -である。選ばないとすればーー下人の考えは、何度も同じ道を低徊した揚句に、やっと -この局所へ逢着した。しかしこの「すれば」は、いつもでたっても、結局「すれば」で -あった。下人は、手段を選ばないという事を肯定しながらも、この「すれば」のかたを -つける為に、当然、この後に来る可き「盗人になるより外に仕方がない」と云う事を、 -積極的に肯定するだけの、勇気が出ずにいたのである。 - 下人は大きな嚏(くさめ)をして、それから、大儀そうに立上がった。夕冷えのする -京都は、もう火桶が欲しい程の寒さである。風は門の柱と柱との間を、夕闇と共に遠慮 -なく、吹きぬける。丹塗の柱にとまっていたきりぎりすも、もうどこかへ行ってしまっ -た。 - 下人は、頸をちぢめながら、山吹の汗衫(かざみ)に重ねた、紺の襖の肩を高くして -門のまわりを見まわした。雨風の患のない、人目にかかる惧のない、一晩楽にねられそ -うな所があれば、そこでともかくも、夜を明かそうと思ったからである。すると、幸門 -の上の楼へ上る、幅の広い、之も丹を塗った梯子が眼についた。上なら、人がいたにし -ても、どうせ死人ばかりである。下人は、そこで腰にさげた聖柄(ひじりづか)の太刀 -が鞘走らないように気をつけながら、藁草履をはいた足を、その梯子の一番下の段へふ -みかけた。 - それから、何分かの後である。羅生門の楼の上へ出る、幅の広い梯子の中段に、一人 -の男が、猫のように身をちぢめて、息を殺しながら、上の容子を窺っていた。楼の上か -らさす火の光が、かすかに、その男の右の頬をぬらしている。短い鬚(ひげ)の中に、 -赤く膿を持った面皰のある頬である。下人は、始めから、この上にいる者は、死人ばか -りだと高を括っていた。それが、梯子を二三段上って見ると、上では誰か火をとぼして、 -しかもその火を其処此処と動かしているらしい。これは、その濁った、黄いろい光が、 -隅々に蜘蛛の巣をかけた天井裏に、ゆれながら映ったので、すぐにそれと知れたのであ -る。この雨の夜に、この羅生門の上で、火をともしているからは、どうせ唯の者ではな -い。 - 下人は、宮守(やもり)のように足音をぬすんで、やっと急な梯子を、一番上の段ま -で這うようにして上りつめた。そうして体を出来るだけ、平にしながら、頸を出来るだ -け、前へ出して、恐る恐る、楼の内を覗いて見た。 - 見ると、楼の内には、噂に聞いた通り、幾つかの屍骸(しがい)が、無造作に棄てて -あるが、火の光の及ぶ範囲が、思ったより狭いので、数は幾つともわからない。唯、お -ぼろげながら、知れるのは、その中に裸の屍骸と、着物を着た屍骸とがあると云う事で -ある。勿論、中には女も男もまじっているらしい。そうして、その屍骸は皆、それが、 -嘗(かつて)、生きていた人間だと云う事実さえ疑われる程、土を捏ねて造った人形の -ように、口を開いたり、手を延ばしたりして、ごろごろ床の上にころがっていた。しか -も、肩とか胸とかの高くなっている部分に、ぼんやりした火の光をうけて、低くなって -いる部分の影を一層暗くしながら、永久に唖(おし)の如く黙っていた。 - 下人は、それらの屍骸の腐爛した臭気に思わず、鼻を掩った(おおった)。しかし、 -その手は、次の瞬間には、もう鼻を掩う事を忘れていた。或る強い感情が殆悉(ほとん -どことごとく)この男の嗅覚を奪ってしまったからである。 - 下人の眼は、その時、はじめて、其屍骸の中に蹲っている(うずくまっている)人間 -を見た。檜肌色(ひはだいろ)の着物を著た、背の低い、痩せた、白髪頭の、猿のよう -な老婆である。その老婆は、右の手に火をともした松の木片を持って、その屍骸の一つ -の顔を覗きこむように眺めていた。髪の毛の長い所を見ると、多分女の屍骸であろう。 - 下人は、六分の恐怖と四分の好奇心とに動かされて、暫時は呼吸(いき)をするのさ -え忘れていた。旧記の記者の語を借りれば、「頭身(とうしん)の毛も太る」ように感 -じたのである。すると、老婆は、松の木片を、床板の間に挿して、それから、今まで眺 -めていた屍骸の首に両手をかけると、丁度、猿の親が猿の子の虱(しらみ)をとるよう -に、その長い髪の毛を一本ずつ抜きはじめた。髪は手に従って抜けるらしい。 - その髪の毛が、一本ずつ抜けるのに従って下人の心からは、恐怖が少しずつ消えて行っ -た。そうして、それと同時に、その老婆に対するはげしい憎悪が、少しずつ動いて来た。 -いや、この老婆に対すると云っては、語弊があるかも知れない。寧(むしろ)、あらゆ -る悪に対する反感が、一分毎に強さを増して来たのである。この時、誰かがこの下人に、 -さっき門の下でこの男が考えていた、饑死(うえじに)をするか盗人になるかと云う問 -題を、改めて持出したら、恐らく下人は、何の未練もなく、饑死を選んだ事であろう。 -それほど、この男の悪を憎む心は、老婆の床に挿した松の木片のように、勢よく燃え上 -がりだしていたのである。 - 下人には、勿論、何故老婆が死人の髪の毛を抜くかわからなかった。従って、合理的 -には、それを善悪の何れに片づけてよいか知らなかった。しかし下人にとっては、この -雨の夜に、この羅生門の上で、死人の髪の毛を抜くと云う事が、それだけで既に許す可 -らざる悪であった。勿論 下人は さっき迄自分が、盗人になる気でいた事なぞは と -うに忘れているのである。 - そこで、下人は、両足に力を入れて、いかなり、梯子から上へ飛び上がった そうし -て聖柄(ひじりづか)の太刀に手をかけながら、大股に老婆の前へ歩みよった。老婆が -驚いたのは 云う迄もない。 - 老婆は、一目下人を見ると、まるで弩(いしゆみ)にでも弾かれたように 飛び上がっ -た。 - 「おのれ、どこへ行く。」 - 下人は、老婆が屍骸につまづきながら、慌てふためいて逃げようとする行手を塞いで、 -こう罵った。老婆は、それでも下人をつきのけて行こうとする。下人は又、それを行か -すまいとして、押しもどす。二人は屍骸の中で、暫、無言のまま、つかみ合った。しか -し勝負は、はじめから、わかっている。下人はとうとう、老婆の腕をつかんで、無理に -そこへねじ倒した。丁度、鶏(とり)の脚のような、骨と皮ばかりの腕である。 - 「何をしていた。さあ何をしていた。云え。云わぬと これだぞよ。」 - 下人は、老婆をつき放すと、いきなり、太刀の鞘を払って、白い鋼(はがね)の色を -その眼の前へつきつけた。けれども、老婆は黙っている。両手をわなわなふるわせて、 -肩で息を切りながら、眼を、眼球がまぶたの外へ出そうになる程、見開いて、唖のよう -に執拗(しゅうね)く黙っている。これを見ると、下人は始めて明白にこの老婆の生死 -が、全然、自分の意志に支配されていると云う事を意識した。そうして、この意識は、 -今まではげしく燃えていた憎悪の心を何時(いつ)の間にか冷ましてしまった。後に残っ -たのは、唯、或仕事をして、それが円満に成就した時の、安らかな得意と満足とがある -ばかりである。そこで、下人は、老婆を、見下げながら、少し声を柔げてこう云った。 - 「己は検非違使(けびいし)の庁の役人などではない。今し方この門の下を通りかかっ -た旅の者だ。だからお前に縄をかけて、どうしようと云うような事はない。唯今時分、 -この門の上で、何をしていたのだか、それを己に話さえすればいいのだ。」 - すると、老婆は、見開いた眼を、一層大きくして、じっとその下人の顔を見守った。 -まぶたの赤くなった、肉食鳥のような、鋭い眼で見たのである。それから、皺で、殆、 -鼻と一つになった唇を何か物でも噛んでいるように動かした。細い喉で、尖った喉仏の -動いているのが見える。その時、その喉から、鴉(からす)の啼くような声が、喘ぎ喘 -ぎ、下人の耳へ伝わって来た。 - 「この髪を抜いてな、この女の髪を抜いてな、鬘(かつら)にしようと思うたの -じゃ。」 - 下人は、老婆の答が存外、平凡なのに失望した。そうして失望すると同時に、又前の -憎悪が、冷な侮蔑と一しょに、心の中へはいって来た。すると その気色(けしき)が、 -先方へも通じたのであろう。老婆は、片手に、まだ屍骸の頭から奪(と)った長い抜け -毛を持ったなり、蟇(ひき)のつぶやくような声で、口ごもりながら、こんな事を云っ -た。 - 成程、死人の髪の毛を抜くと云う事は、悪い事かね知れぬ。しかし、こう云う死人の -多くは、皆 その位な事を、されてもいい人間ばかりである。現に、自分が今、髪を抜 -いた女などは、蛇を四寸ばかりずつに切って干したのを、干魚(ほしうお)だと云って、 -太刀帯(たちはき)の陣へ売りに行った。疫病にかかって死ななかったなら、今でも売 -りに行っていたかもしれない。しかも、この女の売る干魚は、味がよいと云うので、太 -刀帯たちが、欠かさず菜料に買っていたのである。自分は、この女のした事が悪いとは -思わない。しなければ、饑死(えうじに)をするので、仕方がなくした事だからである。 -だから、又今、自分のしていた事も悪い事とは思わない。これもやはりしなければ、饑 -死をするので、仕方がなくする事だからである。そうして、その仕方がない事を、よく -知っていたこの女は、自分のする事を許してくれるのにちがいないと思うからであ -る。ーー老婆は、大体こんな意味の事を云った。 - 下人は、太刀を鞘におさめて、その太刀の柄を左の手でおさえながら、冷然として、 -この話を聞いていた。勿論、 右の手では、赤く頬に膿を持た大きな面皰(にきび)を -気にしながら、聞いているのである。しかし、之を聞いている中に、下人の心には、或 -勇気が生まれて来た。それは さっき、門の下でこの男に欠けていた勇気である。そう -して、又さっき、この門の上へ上(あが)って、その老婆を捕えた時の勇気とは、全然、 -反対な方向に動こうとする勇気である。下人は、饑死をするか盗人になるかに迷わなかっ -たばかりではない。その時のこの男の心もちから云えば、饑死などと云う事は、殆、考 -える事さえ出来ない程、意識の外に追い出されていた。 - 「きっと、そうか。」 - 老婆の話が完ると、下人は嘲(あざけ)るような声で念を押した。そうして、一足前 -へ出ると、不意に、右の手を面皰から離して、老婆の襟上(えりがみ)をつかみながら、 -こう云った。 - 「では、己が引剥(ひはぎ)をしようと恨むまいな。己もそうしなければ、饑死をす -る体なのだ。」 - 下人は、すばやく、老婆の着物を剥ぎとった。それから、足にしがみつこうとする老 -婆を、手荒く屍骸の上へ蹴倒した。梯子の口までは、僅に五歩を数えるばかりである。 -下人は、剥ぎとった桧肌色の着物をわきにかかえて、またたく間に急な梯子を夜の底へ -かけ下りた。 - 暫、死んだように倒れていた老婆が、屍骸の中から、その裸の体を起こしたのは、そ -れから間もなくの事である。老婆は、つぶやくような、うめくような声を立てながら、 -まだ燃えている火の光をたよりに、梯子の口まで、這って行った。そうして、そこから、 -短い白髪を倒(さかさま)にして、門の下を覗きこんだ。外には、唯、黒洞々(こくと -うとう)たる夜があるばかりである。 - 下人は、既に、雨を冒して、京都の町へ強盗を働きに急いでいた。 diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-hz-gb2312.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-hz-gb2312.txt deleted file mode 100644 index 5a142ce38..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-hz-gb2312.txt +++ /dev/null @@ -1,107 +0,0 @@ -This file was derived from -http://www.gutenberg.org/files/23864/23864-0.txt -after converting from Traditional Chinese to Simplified Chinese. --------- -~{J<<F5ZR;~} - -~{KoWST;#:1xU_#,9zV.4sJB#,K@IzV.5X#,4fMvV.5@#,2;?I2;2lR2!#~} - -~{9J>-V.RTNeJB#,P#V.RT<F#,6xKwFdGi#:R;T;5@#,6~T;Ll#,H}T;5X#,KDT;=+#,NeT;7(!#~} - -~{5@U_#,AnCqSkIOM,Rb#,?ISkV.K@#,?ISkV.Iz#,6x2;N7N#R2#;LlU_#,RuQt!":.Jn!"J1VFR2#;5XU_#,T6=|!"OURW!"9cOA!"K@IzR2#;=+U_#,VG!"PE!"HJ!"SB!"QOR2#;7(U_#,GzVF!"9Y5@!"VwSCR2!#724KNeU_#,=+D*2;NE#,V*V.U_J$#,2;V*U_2;J$!#~} - -~{9JP#V.RT<F#,6xKwFdGi#,T;#:VwJkSP5@#?=+JkSPD\#?Ll5XJk5C#?7(AnJkPP#?1x~}?~{JkG?#?J?WdJkA7#?IM7#JkCw#?NaRT4KV*J$8:RS!#~} - -~{=+L}Na<F#,SCV.1XJ$#,AtV.#;=+2;L}Na<F#,SCV.1X0\#,H%V.!#~} - -~{<F@{RTL}#,DK~}?~{V.JF#,RTWtFdMb!#JFU_#,Rr@{6xVFH(R2!#~} - -~{1xU_#,9n5@R2!#9JD\6xJ>V.2;D\#,SC6xJ>V.2;SC#,=|6xJ>V.T6#,T66xJ>V.=|!#@{6xSUV.#,BR6xH!V.#,J56x18V.#,G?6x1\V.#,E-6xDSV.#,106x=>V.#,X}6x@MV.#,GW6x@kV.#,9%FdN^18#,3vFd2;Rb!#4K1x<RV.J$#,2;?IOH4+R2!#~} - -~{7rN4U=6xCmKcJ$U_#,5CKc6`R2#;N4U=6xCmKc2;J$U_#,5CKcIYR2!#6`KcJ$#,IYKc2;J$#,6x?vN^Kc:u#!NaRT4K9[V.#,J$8:<{RS!#~} - -~{WwU=5Z6~~} - -~{KoWST;#:72SC1xV.7(#,3[35G'~}?~{#,8o35G'3K#,4x<WJ.Mr#,G'@o@!A8!#TrDZMbV.7Q#,1v?MV.SC#,=:FaV.2D#,35<WV.7n#,HU7QG'=p#,H;:sJ.MrV.J&>YRS!#~} - -~{FdSCU=R2#,9sJ$#,>CTr6[1x4lHq#,9%3GTrA&G|#,>C1)J&Tr9zSC2;Wc!#7r6[1x4lHq#,G|A&~}?~{;u#,TrVn:n3KFd1W6xFp#,KdSPVGU_#,2;D\IFFd:sRS!#9J1xNEW>KY#,N46CGIV.>CR2!#7r1x>C6x9z@{U_#,N4V.SPR2!#9J2;>!V*SC1xV.:&U_#,Tr2;D\>!V*SC1xV.@{R2!#~} - -~{IFSC1xU_#,R[2;TY<.#,A82;H}TX#,H!SCl69z#,RrA8l65P#,9J>|J3?IWcR2!#9zV.F6l6J&U_T6Jd#,T6JdTr0YPUF6#;=|l6J&U_9sBt#,9sBtTr0YPU=_#,2F=_Tr<1l6GpR[!#A&G|2F~}?~{#,VPT-DZPil6<R#,0YPUV.7Q#,J.H%FdF_#;9+<RV.7Q#,FF>|0UBm#,<WkPJ8es#,j*~}?~{C,~}?~{#,GpE#4s35#,J.H%FdAy!#~} - -~{9JVG=+NqJ3l65P#,J35PR;VS#,51Na6~J.VS#;]=8QR;J/#,51Na6~J.J/!#9JI15PU_#,E-R2#;H!5PV.@{U_#,;uR2!#9J35U=#,5C35J.3KRTIO#,IMFdOH5CU_#,6x8|Fdl:Fl!#35TS6x3KV.#,WdIF6xQxV.#,JGN=J$5P6xRfG?!#~} - -~{9J1x9sJ$#,2;9s>C!#9JV*1xV.=+#,CqV.K>C|!#9z<R02N#V.VwR2!#~} - -~{D19%5ZH}~} - -~{KoWST;#:72SC1xV.7(#,H+9z~}?~{IO#,FF9z4NV.#;H+>|~}?~{IO#,FF>|4NV.#;H+BC~}?~{IO#,FFBC4NV.#;H+Wd~}?~{IO#,FFWd4NV.#;H+Ni~}?~{IO#,FFNi4NV.!#JG9J0YU=0YJ$#,7GIFV.IFU_R2#;2;U=6xG|HKV.1x#,IFV.IFU_R2!#~} - -~{9JIO1x7%D1#,Fd4N7%=;#,Fd4N7%1x#,FdOB9%3G!#9%3GV.7(#,~}?~{2;5CRQ!#P^~}???~{#,>_FwP5#,H}TB6x:s3I#;>`~}?~{#,SVH}TB6x:sRQ!#=+2;J$Fd7^#,6xRO8=V.#,I1J?H}7VV.R;#,6x3G2;0NU_#,4K9%V.TVR2!#~} - -~{9JIFSC1xU_#,G|HKV.1x#,6x7GU=R2#,0NHKV.3G6x7G9%R2#,;YHKV.9z6x7G>CR2#,1XRTH+Uyl6LlOB#,9J1x2;6Y6x@{?IH+#,4KD19%V.7(R2!#~} - -~{9JSC1xV.7(#,J.TrN'V.#,NeTr9%V.#,16Tr7VV.#,5PTrD\U=V.#,IYTrD\LSV.#,2;HtTrD\1\V.!#9JP!5PV.<a#,4s5PV.G\R2!#~} - -~{7r=+U_#,9zV.8(R2!#8(V\Tr9z1XG?#,8(O6Tr9z1XHu!#9J>}V.KyRT;<l6>|U_H}#:2;V*>|V.2;?IRT=x6xN=V.=x#,2;V*>|V.2;?IRTMK6xN=V.MK#,JGN=wc>|#;2;V*H}>|V.JB#,6xM,H}>|V.U~#,Tr>|J?;sRS#;2;V*H}>|V.H(#,6xM,H}>|V.HN#,Tr>|J?RIRS!#H}>|<H;sGRRI#,TrVn:nV.DQVARS!#JGN=BR>|R}J$!#~} - -~{9JV*J$SPNe#:V*?IRTU=Sk2;?IRTU=U_#,J$!#J6~}?~{9QV.SCU_#,J$!#IOOBM,S{U_#,J$!#RTS]4}2;S]U_#,J$!#=+D\6x>}2;SyU_#,J$!#4KNeU_#,V*J$V.5@R2!#~} - -~{9JT;#:V*<:V*1K#,0YU=2;~}?~{#;2;V*1K6xV*<:#,R;J$R;8:#;2;V*1K2;V*<:#,C?U=1X0\!#~} - -~{>|PN5ZKD~} - -~{KoWST;#:NtV.IFU=U_#,OH~}?~{2;?IJ$#,RT4}5PV.?IJ$!#2;?IJ$TZ<:#,?IJ$TZ5P!#9JIFU=U_#,D\~}?~{2;?IJ$#,2;D\J95P1X?IJ$!#9JT;#:J$?IV*#,6x2;?I~}?~{!#~} - -~{2;?IJ$U_#,JXR2#;?IJ$U_#,9%R2!#JXTr2;Wc#,9%TrSP~}?~{!#IFJXU_#,2Xl6>E5XV.OB#,IF9%U_#,6/l6>ELlV.IO#,9JD\WT1#6xH+J$R2!#~} - -~{<{J$2;9}~}?~{HKV.KyV*#,7GIFV.IFU_R2#;U=J$6xLlOBT;IF#,7GIFV.IFU_R2!#9J>YGo:A2;~}?~{6`A&#,<{HUTB2;~}?~{CwD?#,NE@Wv*2;~}?~{4O6z!#9EV.IFU=U_#,J$l6RWJ$U_R2!#9JIFU=U_V.J$R2#,N^VGC{#,N^SB9&#,9JFdU=J$2;_/!#2;_/U_#,FdKy4k1XJ$#,J$RQ0\U_R2!#9JIFU=U_#,OHA"l62;0\V.5X#,6x2;J'5PV.0\R2!#JG9JJ$1xOHJ$#,6x:sGsU=#,0\1xOHU=6x:sGsJ$!#IFSC1xU_#,P^5@6x1#7(#,9JD\~}?~{J$0\V.U~!#~} - -~{1x7(#:R;T;6H#,6~T;A?#,H}T;J}#,KDT;3F#,NeT;J$!#5XIz6H#,6HIzA?#,A?IzJ}#,J}Iz3F#,3FIzJ$!#9JJ$1xHtRT~}?~{3F~}?~{#,0\1xHtRT~}?~{3F~}?~{!#J$U_V.U=#,Ht>v;}K.l6G'XpV.~}?~{U_#,PNR2!#~} - -~{1xJF5ZNe~} - -~{KoWST;#:72VN~}?~{HgVN9Q#,7VJ}JGR2#;67~}?~{Hg679Q#,PNC{JGR2#;H}>|V.~}?~{#,?IJ91XJ\5P6xN^0\U_#,FfU}JGR2#;1xV.Ky<S#,HgRT~}?~{M6BQU_#,PiJ5JGR2!#~} - -~{72U=U_#,RTU}:O#,RTFfJ$!#9JIF3vFfU_#,N^GnHgLl5X#,2;=_Hg=-:#!#VU6x84J<#,HUTBJGR2!#K@6x~}?~{Iz#,KDJ1JGR2!#Iy2;9}Ne#,NeIyV.1d#,2;?IJ$L}R2#;I+2;9}Ne#,NeI+V.1d#,2;?IJ$9[R2#;N62;9}Ne#,NeN6V.1d#,2;?IJ$3"R2#;U=JF#,2;9}FfU}#,FfU}V.1d#,2;?IJ$GnR2!#FfU}O`Iz#,HgQ-;7V.N^6K#,JlD\GnV.TU#?~} - -~{<$K.V.<2#,VAl6F/J/U_#,JFR2#;~}?~{DqV.<2#,VAl6;YU[U_#,=ZR2!#JG9JIFU=U_#,FdJFOU#,Fd=Z6L!#JFHgUEes#,=ZHg7";z!#~} - -~{7W7W~}??~{#,67BR6x2;?IBRR2#;;k;kcgcg#,PNT26x2;?I0\R2!#BRIzl6VN#,GSIzl6SB#,HuIzl6G?!#VNBR#,J}R2#;SBGS#,JFR2#;G?Hu#,PNR2!#9JIF6/5PU_#,PNV.#,5P1X4SV.#;ShV.#,5P1XH!V.!#RT@{6/V.#,RTWd4}V.!#~} - -~{9JIFU=U_#,GsV.l6JF#,2;Tpl6HK#;9JD\TqHK6xHNJF!#HNJFU_#,FdU=HKR2#,HgW*D>J/!#D>J/V.PT#,02Tr>2#,N#Tr6/#,7=TrV9#,T2TrPP!#9JIFU=HKV.JF#,HgW*T2J/l6G'XpV.I=U_#,JFR2!#~} - -~{PiJ55ZAy~} - -~{KoWST;#:72OH4&U=5X6x4}5PU_X}#,:s4&U=5X6xGwU=U_@M!#~} - -~{9JIFU=U_#,VBHK6x2;VBl6HK!#D\J95PHKWTVAU_#,@{V.R2#;D\J95PHK2;5CVAU_#,:&V.R2!#9J5PX}D\@MV.#,1%D\<"V.#,02D\6/V.!#3vFdKy1XGw#,GwFdKy2;Rb!#PPG'@o6x2;@MU_#,PPl6N^HKV.5XR2#;9%6x1XH!U_#,9%FdKy2;JXR2!#JX6x1X9LU_#,JXFdKy2;9%R2!#~} - -~{9JIF9%U_#,5P2;V*FdKyJX#;IFJXU_#,5P2;V*FdKy9%!#N":uN":u#,VAl6N^PN#;Iq:uIq:u#,VAl6N^Iy#,9JD\~}?~{5PV.K>C|!#=x6x2;?ISyU_#,3eFdPiR2#;MK6x2;?IW7U_#,KY6x2;?I<0R2!#9JNRS{U=#,5PKd8_@]In95#,2;5C2;SkNRU=U_#,9%FdKy1X>HR2#;NR2;S{U=#,Kd;-5X6xJXV.#,5P2;5CSkNRU=U_#,9TFdKyV.R2!#9JPNHK6xNRN^PN#,TrNRW(6x5P7V!#NRW(~}?~{R;#,5P7V~}?~{J.#,JGRTJ.9%FdR;R2!#TrNR~}?~{5P9Q#,D\RT~}?~{;w9QU_#,TrNaV.KySkU=U_T<RS!#NaKySkU=V.5X2;?IV*#,2;?IV*Tr5PKy18U_6`#,5PKy18U_6`#,TrNaKySkU=U_9QRS!#9J18G0Tr:s9Q#,18:sTrG09Q#,18WsTrSR9Q#,18SRTrWs9Q#,N^Ky2;18#,TrN^Ky2;9Q!#9QU_#,18HKU_R2#;~}?~{U_#,J9HK18<:U_R2!#9JV*U=V.5X#,V*U=V.HU#,Tr?IG'@o6x;aU=#;2;V*U=V.5X#,2;V*U=HU#,TrWs2;D\>HSR#,SR2;D\>HWs#,G02;D\>H:s#,:s2;D\>HG0#,6x?vT6U_J}J.@o#,=|U_J}@o:u#!RTNa6HV.#,T=HKV.1xKd6`#,R`^IRfl6J$TU#!9JT;#:J$?I~}?~{R2!#5PKd~}?~{#,?IJ9N^67!#9J2_V.6xV*5CJ'V.<F#,:rV.6xV*6/>2V.@m#,PNV.6xV*K@IzV.5X#,=GV.6xV*SP~}?~{2;WcV.4&!#9JPN1xV.<+#,VAl6N^PN!#N^PNTrIn<d2;D\?z#,VGU_2;D\D1!#RrPN6x4kJ$l6~}?~{#,~}?~{2;D\V*!#HK=TV*NRKyRTJ$V.PN#,6xD*V*NaKyRTVFJ$V.PN!#9JFdU=J$2;~}?~{#,6xS&PNl6N^Gn!#7r1xPNOsK.#,K.V.PP1\8_6xGwOB#,1xV.PN1\J56x;wPi#;K.Rr5X6xVFAw#,1xRr5P6xVFJ$!#9J1xN^3#JF#,K.N^3#PN!#D\Rr5P1d;/6xH!J$U_#,N=V.Iq!#9JNePPN^3#J$#,KDJ1N^3#N;#,HUSP6L3$#,TBSPK@Iz!#~} - -~{>|Uy5ZF_~} - -~{KoWST;#:~} ~{72SC1xV.7(#,=+J\C|l6>}#,:O>|>[~}?~{#,=;:M6xIa#,D*DQl6>|Uy!#>|UyV.DQU_#,RTSX~}?~{V1#,RT;<~}?~{@{!#9JSXFdM>#,6xSUV.RT@{#,:sHK7"#,OHHKVA#,4KV*SXV1V.<FU_R2!#>|Uy~}?~{@{#,>|Uy~}?~{N#!#>Y>|6xUy@{Tr2;<0#,N/>|6xUy@{Tr~}?~{VX>h!#JG9J~}?~{<W6xGw#,HUR92;4&#,165@<fPP#,0Y~}?~{6xUy@{#,TrG\H}=+>|#,>"U_OH#,F#U_:s#,Fd7(J.R;6xVA#;NeJ.@o6xUy@{#,TrujIO=+>|#,Fd7(0kVA#;H}J.@o6xUy@{#,TrH}7VV.6~VA!#JG9J>|N^~}?~{VXTrMv#,N^A8J3TrMv#,N^N/;}TrMv!#9J2;V*Vn:nV.D1U_#,2;D\T%=;#;2;V*I=AV!"OUWh!">ZTsV.PNU_#,2;D\PP>|#;2;SCOg5<U_#,2;D\5C5X@{!#9J1xRTU)A"#,RT@{6/#,RT7V:M~}?~{1dU_R2!#9JFd<2Hg7g#,FdPlHgAV#,GVBSHg;p#,2;6/HgI=#,DQV*HgRu#,6/Hg@WUp!#BSOg7V~}?~{#,@*5X7V@{#,P|H(6x6/!#OHV*SXV1V.<FU_J$#,4K>|UyV.7(R2!#!6>|U~!7T;#:!0QT2;O`NE#,9J~}?~{V.=p9D#;JS2;O`<{#,9J~}?~{V.l:Fl!#!17r=p9Dl:FlU_#,KyRTR;CqV.6zD?R2!#Cq<HW(R;#,TrSBU_2;5C6@=x#,GSU_2;5C6@MK#,4KSC~}?~{V.7(R2!#9JR9U=6`=p9D#,VgU=6`l:Fl#,KyRT1dHKV.6zD?R2!#H}>|?I6aFx#,=+>|?I6aPD!#JG9J3/FxHq#,VgFx6h#,D:Fx9i!#IFSC1xU_#,1\FdHqFx#,;wFd6h9i#,4KVNFxU_R2!#RTVN4}BR#,RT>24};)#,4KVNPDU_R2!#RT=|4}T6#,RTX}4}@M#,RT1%4}<"#,4KVNA&U_R2!#N^Q{U}U}V.Fl#,N^;wLCLCV.3B#,4KVN1dU_R2!#9JSC1xV.7(#,8_AjNpOr#,13GpNpDf#,Qp11Np4S#,HqWdNp9%#,6|1xNpJ3#,9iJ&Np6t#,N'J&RE~}?~{#,Gn?\NpFH#,4KSC1xV.7(R2!#~} - -~{>E1d5Z0K~} - -~{KoWST;#:~} ~{72SC1xV.7(#,=+J\C|l6>}#,:O>|>[:O!#7:5XN^Ia#,ai5X:O=;#,>x5XN^At#,N'5XTrD1#,K@5XTrU=#,M>SPKy2;SI#,>|SPKy2;;w#,3GSPKy2;9%#,5XSPKy2;Uy#,>}C|SPKy2;J\!#9J=+M(l6>E1dV.@{U_#,V*SC1xRS#;=+2;M(>E1dV.@{#,KdV*5XPN#,2;D\5C5XV.@{RS#;VN1x2;V*>E1dV.Ju#,KdV*Ne@{#,2;D\5CHKV.SCRS!#JG9JVGU_V.BG#,1XTSl6@{:&#,TSl6@{6xNq?IPER2#,TSl6:&6x;<?I=bR2!#JG9JG|Vn:nU_RT:&#,R[Vn:nU_RTR5#,GwVn:nU_RT@{!#9JSC1xV.7(#,N^JQFd2;@4#,JQNaSPRT4}V.#;N^JQFd2;9%#,JQNaSPKy2;?I9%R2!#9J=+SPNeN##,1XK@?II1#,1XIz?IB2#,7^KY?INj#,A.=`?IHh#,0.Cq?I73!#724KNeU_#,=+V.9}R2#,SC1xV.TVR2!#82>|I1=+#,1XRTNeN##,2;?I2;2lR2!#~} - -~{PP>|5Z>E~} - -~{KoWST;#:724&>|O`5P#,>xI=R@~}?~{#,JSIz4&8_#,U=B!N^5G#,4K4&I=V.>|R2!#>xK.1XT6K.#,?M>xK.6x@4#,NpS-V.l6K.DZ#,An0k6I6x;wV.@{#,S{U=U_#,N^8=l6K.6xS-?M#,JSIz4&8_#,N^S-K.Aw#,4K4&K.IOV.>|R2!#>x3bTs#,N(X=H%N^At#,Ht=;>|l63bTsV.VP#,1XR@K.2]6x13~}?~{Jw#,4K4&3bTsV.>|R2!#F=B=4&RW#,SR138_#,G0K@:sIz#,4K4&F=B=V.>|R2!#724KKD>|V.@{#,;F5[V.KyRTJ$KD5[R2!#72>|:C8_6x6qOB#,9sQt6x<zRu#,QxIz6x4&J5#,>|N^0Y<2#,JGN=1XJ$!#GpAj5L7@#,1X4&FdQt6xSR13V.#,4K1xV.@{#,5XV.VzR2!#IOSjK.AwVA#,S{IfU_#,4}Fd6(R2!#725XSP>x='!"Ll>.!"Ll@N!"LlB^!"LlO]!"LlO6#,1XX=H%V.#,Np=|R2!#NaT6V.#,5P=|V.#;NaS-V.#,5P13V.!#>|ETSPOUWh!"dj>.!"]s]g!"P!AV!"~}??~{U_#,1X=w82KwV.#,4K7|~}?~{V.Ky4&R2!#5P=|6x>2U_#,JQFdOUR2#;T66xLtU=U_#,S{HKV.=xR2#;FdKy>SRWU_#,@{R2#;~}?~{Jw6/U_#,@4R2#;~}?~{2]6`UOU_#,RIR2#;DqFpU_#,7|R2#;J^:'U_#,82R2#;3>8_6xHqU_#,35@4R2#;106x9cU_#,M=@4R2#;I"6xLu4oU_#,iT~}?~{R2#;IY6xMy@4U_#,S*>|R2#;4G106x18U_#,=xR2#;4GG?6x=xG}U_#,MKR2#;Ga35OH3v>SFd2`U_#,3BR2#;N^T<6xGk:MU_#,D1R2#;1<W_6x3B1xU_#,FZR2#;0k=x0kMKU_#,SUR2#;UH6xA"U_#,<"R2#;<36xOHR{U_#,?JR2#;<{@{6x2;=xU_#,@MR2#;Dq</U_#,PiR2#;R9:tU_#,?VR2#;>|HEU_#,=+2;VXR2#;l:Fl6/U_#,BRR2#;@tE-U_#,>kR2#;I1BmHbJ3U_#,>|N^A8R2#;P|~}?~{2;75FdIaU_#,Gn?\R2#;W;W;tbtb#,PlSkHKQTU_#,J'~}?~{R2#;J}IMU_#,>=R2#;J}7#U_#,@'R2#;OH1)6x:sN7Fd~}?~{U_#,2;>+V.VAR2#;@4N/P;U_#,S{P]O"R2!#1xE-6xO`S-#,>C6x2;:O#,SV2;O`H%#,1X=w2lV.!#1x7G9sRf6`R2#,N)N^Nd=x#,WcRT2"A&AO5PH!HK6xRQ!#7rN)N^BG6xRW5PU_#,1XG\l6HK!#WdN4GW6x7#V.#,Tr2;7~#,2;7~TrDQSC!#WdRQGW8=6x7#2;PP#,Tr2;?ISC!#9J:OV.RTND#,FkV.RTNd#,JGN=1XH!!#AnKXPPRT=LFdCq#,TrCq7~#;AnKX2;PPRT=LFdCq#,TrCq2;7~!#AnKXPPU_#,Sk~}?~{O`5CR2!#~} - -~{5XPN5ZJ.~} - -~{KoWST;#:5XPNSPM(U_!"SP~}?~{U_!"SPV'U_!"SP0/U_!"SPOUU_!"SPT6U_!#NR?IRTMy#,1K?IRT@4#,T;M(!#M(PNU_#,OH>S8_Qt#,@{A85@#,RTU=Tr@{!#?IRTMy#,DQRT75#,T;~}?~{!#~}?~{PNU_#,5PN^18#,3v6xJ$V.#,5PHtSP18#,3v6x2;J$#,DQRT75#,2;@{!#NR3v6x2;@{#,1K3v6x2;@{#,T;V'!#V'PNU_#,5PKd@{NR#,NRN^3vR2#,R}6xH%V.#,An5P0k3v6x;wV.@{!#0/PNU_#,NROH>SV.#,1XS/V.RT4}5P!#Ht5POH>SV.#,S/6xNp4S#,2;S/6x4SV.!#OUPNU_#,NROH>SV.#,1X>S8_QtRT4}5P#;Ht5POH>SV.#,R}6xH%V.#,Np4SR2!#T6PNU_#,JF>yDQRTLtU=#,U=6x2;@{!#724KAyU_#,5XV.5@R2#,=+V.VAHN#,2;?I2;2lR2!#721xSPW_U_!"SP3[U_!"SPO]U_!"SP1@U_!"SPBRU_!"SP11U_!#724KAyU_#,7GLl5XV.TV#,=+V.9}R2!#7rJF>y#,RTR;;wJ.#,T;W_#;WdG?@tHu#,T;3[#;@tG?WdHu#,T;O]#;4s@tE-6x2;7~#,Sv5P~}?~{6xWTU=#,=+2;V*FdD\#,T;1@#;=+Hu2;QO#,=L5@2;Cw#,@tWdN^3##,3B1xW]:a#,T;BR#;=+2;D\AO5P#,RTIY:O~}?~{#,RTHu;wG?#,1xN^Q!7f#,T;11!#724KAyU_#,0\V.5@R2#,=+V.VAHN#,2;?I2;2lR2!#7r5XPNU_#,1xV.VzR2!#AO5PVFJ$#,<FOU0/T6=|#,IO=+V.5@R2!#V*4K6xSCU=U_1XJ$#,2;V*4K6xSCU=U_1X0\!#9JU=5@1XJ$#,VwT;N^U=#,1XU=?IR2#;U=5@2;J$#,VwT;1XU=#,N^U=?IR2!#9J=x2;GsC{#,MK2;1\Wo#,N(CqJG1##,6x@{l6Vw#,9zV.1&R2!#JSWdHgS$6y#,9J?IRTSkV.80InO*#;JSWdHg0.WS#,9J?ISkV.>cK@!#:q6x2;D\J9#,0.6x2;D\An#,BR6x2;D\VN#,F)Ht=>WS#,2;?ISCR2!#V*NaWdV.?IRT;w#,6x2;V*5PV.2;?I;w#,J$V.0kR2#;V*5PV.?I;w#,6x2;V*NaWdV.2;?IRT;w#,J$V.0kR2#;V*5PV.?I;w#,V*NaWdV.?IRT;w#,6x2;V*5XPNV.2;?IRTU=#,J$V.0kR2!#9JV*1xU_#,6/6x2;CT#,>Y6x2;Gn!#9JT;#:V*1KV*<:#,J$DK2;4y#;V*LlV*5X#,J$DK?IH+!#~} - -~{>E5X5ZJ.R;~} - -~{KoWST;#:SC1xV.7(#,SPI"5X#,SPGa5X#,SPUy5X#,SP=;5X#,SPai5X#,SPVX5X#,SP7:5X#,SPN'5X#,SPK@5X!#Vn:nWTU=Fd5XU_#,~}?~{I"5X#;HkHKV.5X2;InU_#,~}?~{Ga5X#;NR5CR`@{#,1K5CR`@{U_#,~}?~{Uy5X#;NR?IRTMy#,1K?IRT@4U_#,~}?~{=;5X#;Vn:nV.5XH}Jt#,OHVA6x5CLlOB~}?~{U_#,~}?~{ai5X#;HkHKV.5XIn#,133GRX6`U_#,~}?~{VX5X#;I=AV!"OUWh!">ZTs#,72DQPPV.5@U_#,~}?~{7:5X#;KySIHkU_0/#,Ky4S9iU_SX#,1K9Q?IRT;wNaV.~}?~{U_#,~}?~{N'5X#;<2U=Tr4f#,2;<2U=TrMvU_#,~}?~{K@5X!#JG9JI"5XTrN^U=#,Ga5XTrN^V9#,Uy5XTrN^9%#,=;5XTrN^>x#,ai5XTr:O=;#,VX5XTrBS#,7:5XTrPP#,N'5XTrD1#,K@5XTrU=!#9EV.IFSC1xU_#,D\J95PHKG0:s2;O`<0#,~}?~{9Q2;O`JQ#,9s<z2;O`>H#,IOOB2;O`JU#,Wd@k6x2;</#,1x:O6x2;Fk!#:Ol6@{6x6/#,2;:Ol6@{6xV9!#8RNJ5P~}?~{6xU{=+@4#,4}V.Ht:NT;#:OH6aFdKy0.TrL}RS!#1xV.GiVwKY#,3KHKV.2;<0!#SI2;S]V.5@#,9%FdKy2;=dR2!#72~}?~{?MV.5@#,InHkTrW(!#VwHK2;?K#,BSl6HDR0#,H}>|WcJ3!#=wQx6xNp@M#,2"Fx;}A&#,TK1x<FD1#,~}?~{2;?I2b!#M6V.N^KyMy#,K@GR2;11!#K@QI2;5C#,J?HK>!A&!#1xJ?IuO]Tr2;>e#,N^KyMyTr9L#,InHkTr>P#,2;5CRQTr67!#JG9JFd1x2;P^6x=d#,2;Gs6x5C#,2;T<6xGW#,2;An6xPE#,={OiH%RI#,VAK@N^KyV.!#NaJ?N^~}?~{2F#,7G6q;uR2#;N^~}?~{C|#,7G6qJYR2!#An7"V.HU#,J?WdWxU_LiU4=s#,YHNTU_Li=;RC#,M6V.N^KyMy#,Vn!"~}?~{V.SBR2!#9JIFSC1xU_#,F)HgBJH;!#BJH;U_#,3#I=V.I_R2!#;wFdJWTrN2VA#,;wFdN2TrJWVA#,;wFdVPTrJWN2>cVA!#8RNJ1x?IJ9HgBJH;:u#?T;?I!#7rNbHKSkT=HKO`6qR2#,51FdM,V[6x<C6xSv7g#,FdO`>HR2HgWsSRJV!#JG9J7=BmBqBV#,N4WcJQR2#;FkSBHgR;#,U~V.5@R2#;8UHa=T5C#,5XV.@mR2!#9JIFSC1xU_#,P/JVHtJ9R;HK#,2;5CRQR2!#=+>|V.JB#,>2RTSD#,U}RTVN#,D\S^J?WdV.6zD?#,J9V.N^V*#;RWFdJB#,8oFdD1#,J9HKN^J6#;RWFd>S#,SXFdM>#,J9Cq2;5CBG!#K'SkV.FZ#,Hg5G8_6xH%FdL]#;K'SkV.InHkVn:nV.5X#,6x7"Fd;z!#HtG}H:Qr#,G}6xMy#,G}6x@4#,D*V*KyV.!#>[H}>|V.~}?~{#,M6V.l6OU#,4KN==+>|V.JBR2!#>E5XV.1d#,G|IlV.A&#,HKGiV.@m#,2;?I2;2lR2!#72~}?~{?MV.5@#,InTrW(#,G3TrI"!#H%9zT=>36xJ&U_#,>x5XR2#;KD39U_#,ai5XR2#;HkInU_#,VX5XR2#;HkG3U_#,Ga5XR2#;139LG00/U_#,N'5XR2#;N^KyMyU_#,K@5XR2!#JG9JI"5XNa=+R;FdV>#,Ga5XNa=+J9V.Jt#,Uy5XNa=+GwFd:s#,=;5XNa=+=wFdJX#,=;5XNa=+9LFd=a#,ai5XNa=+=wFdJQ#,VX5XNa=+<LFdJ3#,7:5XNa=+=xFdM>#,N'5XNa=+H{Fd~}?~{#,K@5XNa=+J>V.RT2;;n!#9J1xV.Gi#:N'TrSy#,2;5CRQTr67#,9}Tr4S!#JG9J2;V*Vn:nV.D1U_#,2;D\T$=;#;2;V*I=AV!"OUWh!">ZTsV.PNU_#,2;D\PP>|#;2;SCOg5<#,2;D\5C5X@{!#KDNeU_#,R;2;V*#,7G0TMuV.1xR2!#7r0TMuV.1x#,7%4s9z#,TrFd~}?~{2;5C>[#;M~<Sl65P#,TrFd=;2;5C:O!#JG9J2;UyLlOBV.=;#,2;QxLlOBV.H(#,PE<:V.K=#,M~<Sl65P#,TrFd3G?I0N#,Fd9z?IcD!#J)N^7(V.IM#,P|N^U~V.An!#78H}>|V.~}?~{#,HtJ9R;HK!#78V.RTJB#,Np8fRTQT#;78V.RT:&#,Np8fRT@{!#M6V.Mv5XH;:s4f#,O]V.K@5XH;:sIz!#7r~}?~{O]l6:&#,H;:sD\~}?~{J$0\!#9J~}?~{1xV.JB#,TZK3Oj5PV.Rb#,2"5PR;Or#,G'@oI1=+#,JGN=GID\3IJB!#JG9JU~>YV.HU#,RD9XU[7{#,N^M(FdJ9#,@wl6@HCmV.IO#,RTVoFdJB!#5PHK?*~}?~{#,1XX=HkV.#,OHFdKy0.#,N"SkV.FZ#,<yD+Kf5P#,RT>vU=JB!#JG9JJ<Hg4&E.#,5PHK?*;'#;:sHgMQMC#,5P2;<0>\!#~} - -~{;p9%5ZJ.6~~} - -~{KoWST;#:72;p9%SPNe#:R;T;;pHK#,6~T;;p;}#,H}T;;p~}?~{#,KDT;;p?b#,NeT;;p6S!#PP;p1XSPRr#,Rr1XKX>_!#7";pSPJ1#,Fp;pSPHU!#J1U_#,LlV.ToR2!#HUU_#,TBTZ;~!"1Z!"Rm!"~}?~{R2!#724KKDK^U_#,7gFpV.HUR2!#72;p9%#,1XRrNe;pV.1d6xS&V.#:;p7"l6DZ#,TrTgS&V.l6Mb#;;p7"6xFd1x>2U_#,4}6xNp9%#,<+Fd;pA&#,?I4S6x4SV.#,2;?I4STrIO!#;p?I7"l6Mb#,N^4}l6DZ#,RTJ17"V.#,;p7"IO7g#,N^9%OB7g#,Vg7g>C#,R97gV9!#72>|1XV*Ne;pV.1d#,RTJ}JXV.!#9JRT;pWt9%U_Cw#,RTK.Wt9%U_G?!#K.?IRT>x#,2;?IRT6a!#7rU=J$9%H!6x2;6hFd9&U_PW#,C|T;!07QAt!1!#9JT;#:CwVwBGV.#,A<=+6hV.#,7G@{2;6/#,7G5C2;SC#,7GN#2;U=!#Vw2;?IRTE-6xPKJ&#,=+2;?IRT~}?~{6x9%U=!#:Ol6@{6x6/#,2;:Ol6@{6xIO!#E-?IRT84O2#,~}?~{?IRT84K5#,Mv9z2;?IRT844f#,K@U_2;?IRT84Iz!#9JCwVwIwV.#,A<=+>/V.!#4K029zH+>|V.5@R2!#~} - -~{SC<d5ZJ.H}~} - -~{KoWST;#:~} ~{72PKJ&J.Mr#,3vUwG'@o#,0YPUV.7Q#,9+<RV.7n#,HU7QG'=p#,DZMbI'6/#,5!l65@B7#,2;5C2YJBU_#,F_J.Mr<R!#O`JXJ}Dj#,RTUyR;HUV.J$#,6x0.>tB;0Y=p#,2;V*5PV.GiU_#,2;HJV.VAR2#,7GCqV.=+R2#,7GVwV.WtR2#,7GJ$V.VwR2!#9JCw>}OM=+KyRT6/6xJ$HK#,3I9&3vl6~}?~{U_#,OHV*R2!#OHV*U_#,2;?IH!l69mIq#,2;?IOsl6JB#,2;?IQil66H#,1XH!l6HK#,V*5PV.GiU_R2!#9JSC<dSPNe#:SPRr<d#,SPDZ<d#,SP74<d#,SPK@<d#,SPIz<d!#Ne<d>cFp#,D*V*Fd5@#,JGN=Iq<M#,HK>}V.1&R2!#Og<dU_#,RrFdOgHK6xSCV.#;DZ<dU_#,RrFd9YHK6xSCV.#;74<dU_#,RrFd5P<d6xSCV.#;K@<dU_#,~}??~{JBl6Mb#,AnNaNEV*V.6x4+l65P<dR2#;Iz<dU_#,741(R2!#9JH}>|V.JB#,D*GWl6<d#,IMD*:ql6<d#,JBD*C\l6<d#,7GJ%OM2;D\SC<d#,7GHJRe2;D\J9<d#,7GN"Cn2;D\5C<dV.J5!#N"TUN"TU#!N^Ky2;SC<dR2!#<dJBN47"6xOHNEU_#,<dSkKy8fU_<fK@!#72>|V.KyS{;w#,3GV.KyS{9%#,HKV.KyS{I1#,1XOHV*FdJX=+!"WsSR!"~}?~{U_!"CEU_!"IaHKV.PUC{#,AnNa<d1XKwV*V.!#5P<dV.@4<dNRU_#,Rr6x@{V.#,5<6xIaV.#,9J74<d?I5C6xSCR2#;RrJG6xV*V.#,9JOg<d!"DZ<d?I5C6xJ9R2#;RrJG6xV*V.#,9JK@<d~}??~{JB#,?IJ98f5P#;RrJG6xV*V.#,9JIz<d?IJ9HgFZ!#Ne<dV.JB#,Vw1XV*V.#,V*V.1XTZl674<d#,9J74<d2;?I2;:qR2!#NtRsV.PKR2#,RAV?TZOD#;V\V.PKR2#,B@Q@TZRs!#9JCw>}OM=+#,D\RTIOVG~}?~{<dU_#,1X3I4s9&!#4K1xV.R*#,H}>|V.KyJQ6x6/R2!#~} diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-utf-8.txt deleted file mode 100644 index e15fe5c19..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-utf-8.txt +++ /dev/null @@ -1,107 +0,0 @@ -This file was derived from -http://www.gutenberg.org/files/23864/23864-0.txt -after converting from Traditional Chinese to Simplified Chinese. --------- -始计第一 - -孙子曰:兵者,国之大事,死生之地,存亡之道,不可不察也。 - -故经之以五事,校之以计,而索其情:一曰道,二曰天,三曰地,四曰将,五曰法。 - -道者,令民与上同意,可与之死,可与之生,而不畏危也;天者,阴阳、寒暑、时制也;地者,远近、险易、广狭、死生也;将者,智、信、仁、勇、严也;法者,曲制、官道、主用也。凡此五者,将莫不闻,知之者胜,不知者不胜。 - -故校之以计,而索其情,曰:主孰有道?将孰有能?天地孰得?法令孰行?兵?孰强?士卒孰练?赏罚孰明?吾以此知胜负矣。 - -将听吾计,用之必胜,留之;将不听吾计,用之必败,去之。 - -计利以听,乃?之势,以佐其外。势者,因利而制权也。 - -兵者,诡道也。故能而示之不能,用而示之不用,近而示之远,远而示之近。利而诱之,乱而取之,实而备之,强而避之,怒而挠之,卑而骄之,佚而劳之,亲而离之,攻其无备,出其不意。此兵家之胜,不可先传也。 - -夫未战而庙算胜者,得算多也;未战而庙算不胜者,得算少也。多算胜,少算不胜,而况无算乎!吾以此观之,胜负见矣。 - -作战第二 - -孙子曰:凡用兵之法,驰车千?,革车千乘,带甲十万,千里馈粮。则内外之费,宾客之用,胶漆之材,车甲之奉,日费千金,然后十万之师举矣。 - -其用战也,贵胜,久则钝兵挫锐,攻城则力屈,久暴师则国用不足。夫钝兵挫锐,屈力?货,则诸侯乘其弊而起,虽有智者,不能善其后矣。故兵闻拙速,未睹巧之久也。夫兵久而国利者,未之有也。故不尽知用兵之害者,则不能尽知用兵之利也。 - -善用兵者,役不再籍,粮不三载,取用於国,因粮於敌,故军食可足也。国之贫於师者远输,远输则百姓贫;近於师者贵卖,贵卖则百姓竭,财竭则急於丘役。力屈财?,中原内虚於家,百姓之费,十去其七;公家之费,破军罢马,甲胄矢弩,戟?矛?,丘牛大车,十去其六。 - -故智将务食於敌,食敌一钟,当吾二十钟;萁秆一石,当吾二十石。故杀敌者,怒也;取敌之利者,货也。故车战,得车十乘以上,赏其先得者,而更其旌旗。车杂而乘之,卒善而养之,是谓胜敌而益强。 - -故兵贵胜,不贵久。故知兵之将,民之司命。国家安危之主也。 - -谋攻第三 - -孙子曰:凡用兵之法,全国?上,破国次之;全军?上,破军次之;全旅?上,破旅次之;全卒?上,破卒次之;全伍?上,破伍次之。是故百战百胜,非善之善者也;不战而屈人之兵,善之善者也。 - -故上兵伐谋,其次伐交,其次伐兵,其下攻城。攻城之法,?不得已。修???,具器械,三月而后成;距?,又三月而后已。将不胜其忿,而蚁附之,杀士三分之一,而城不拔者,此攻之灾也。 - -故善用兵者,屈人之兵,而非战也,拔人之城而非攻也,毁人之国而非久也,必以全争於天下,故兵不顿而利可全,此谋攻之法也。 - -故用兵之法,十则围之,五则攻之,倍则分之,敌则能战之,少则能逃之,不若则能避之。故小敌之坚,大敌之擒也。 - -夫将者,国之辅也。辅周则国必强,辅隙则国必弱。故君之所以患於军者三:不知军之不可以进而谓之进,不知军之不可以退而谓之退,是谓縻军;不知三军之事,而同三军之政,则军士惑矣;不知三军之权,而同三军之任,则军士疑矣。三军既惑且疑,则诸侯之难至矣。是谓乱军引胜。 - -故知胜有五:知可以战与不可以战者,胜。识?寡之用者,胜。上下同欲者,胜。以虞待不虞者,胜。将能而君不御者,胜。此五者,知胜之道也。 - -故曰:知己知彼,百战不?;不知彼而知己,一胜一负;不知彼不知己,每战必败。 - -军形第四 - -孙子曰:昔之善战者,先?不可胜,以待敌之可胜。不可胜在己,可胜在敌。故善战者,能?不可胜,不能使敌必可胜。故曰:胜可知,而不可?。 - -不可胜者,守也;可胜者,攻也。守则不足,攻则有?。善守者,藏於九地之下,善攻者,动於九天之上,故能自保而全胜也。 - -见胜不过?人之所知,非善之善者也;战胜而天下曰善,非善之善者也。故举秋毫不?多力,见日月不?明目,闻雷霆不?聪耳。古之善战者,胜於易胜者也。故善战者之胜也,无智名,无勇功,故其战胜不忒。不忒者,其所措必胜,胜已败者也。故善战者,先立於不败之地,而不失敌之败也。是故胜兵先胜,而后求战,败兵先战而后求胜。善用兵者,修道而保法,故能?胜败之政。 - -兵法:一曰度,二曰量,三曰数,四曰称,五曰胜。地生度,度生量,量生数,数生称,称生胜。故胜兵若以?称?,败兵若以?称?。胜者之战,若决积水於千仞之?者,形也。 - -兵势第五 - -孙子曰:凡治?如治寡,分数是也;斗?如斗寡,形名是也;三军之?,可使必受敌而无败者,奇正是也;兵之所加,如以?投卵者,虚实是也。 - -凡战者,以正合,以奇胜。故善出奇者,无穷如天地,不竭如江海。终而复始,日月是也。死而?生,四时是也。声不过五,五声之变,不可胜听也;色不过五,五色之变,不可胜观也;味不过五,五味之变,不可胜尝也;战势,不过奇正,奇正之变,不可胜穷也。奇正相生,如循环之无端,熟能穷之哉? - -激水之疾,至於漂石者,势也;?鸟之疾,至於毁折者,节也。是故善战者,其势险,其节短。势如张弩,节如发机。 - -纷纷??,斗乱而不可乱也;浑浑沌沌,形圆而不可败也。乱生於治,怯生於勇,弱生於强。治乱,数也;勇怯,势也;强弱,形也。故善动敌者,形之,敌必从之;予之,敌必取之。以利动之,以卒待之。 - -故善战者,求之於势,不责於人;故能择人而任势。任势者,其战人也,如转木石。木石之性,安则静,危则动,方则止,圆则行。故善战人之势,如转圆石於千仞之山者,势也。 - -虚实第六 - -孙子曰:凡先处战地而待敌者佚,后处战地而趋战者劳。 - -故善战者,致人而不致於人。能使敌人自至者,利之也;能使敌人不得至者,害之也。故敌佚能劳之,饱能饥之,安能动之。出其所必趋,趋其所不意。行千里而不劳者,行於无人之地也;攻而必取者,攻其所不守也。守而必固者,守其所不攻也。 - -故善攻者,敌不知其所守;善守者,敌不知其所攻。微乎微乎,至於无形;神乎神乎,至於无声,故能?敌之司命。进而不可御者,冲其虚也;退而不可追者,速而不可及也。故我欲战,敌虽高垒深沟,不得不与我战者,攻其所必救也;我不欲战,虽画地而守之,敌不得与我战者,乖其所之也。故形人而我无形,则我专而敌分。我专?一,敌分?十,是以十攻其一也。则我?敌寡,能以?击寡者,则吾之所与战者约矣。吾所与战之地不可知,不可知则敌所备者多,敌所备者多,则吾所与战者寡矣。故备前则后寡,备后则前寡,备左则右寡,备右则左寡,无所不备,则无所不寡。寡者,备人者也;?者,使人备己者也。故知战之地,知战之日,则可千里而会战;不知战之地,不知战日,则左不能救右,右不能救左,前不能救后,后不能救前,而况远者数十里,近者数里乎!以吾度之,越人之兵虽多,亦奚益於胜哉!故曰:胜可?也。敌虽?,可使无斗。故策之而知得失之计,候之而知动静之理,形之而知死生之地,角之而知有?不足之处。故形兵之极,至於无形。无形则深间不能窥,智者不能谋。因形而措胜於?,?不能知。人皆知我所以胜之形,而莫知吾所以制胜之形。故其战胜不?,而应形於无穷。夫兵形象水,水之行避高而趋下,兵之形避实而击虚;水因地而制流,兵因敌而制胜。故兵无常势,水无常形。能因敌变化而取胜者,谓之神。故五行无常胜,四时无常位,日有短长,月有死生。 - -军争第七 - -孙子曰: 凡用兵之法,将受命於君,合军聚?,交和而舍,莫难於军争。军争之难者,以迂?直,以患?利。故迂其途,而诱之以利,后人发,先人至,此知迂直之计者也。军争?利,军争?危。举军而争利则不及,委军而争利则?重捐。是故?甲而趋,日夜不处,倍道兼行,百?而争利,则擒三将军,劲者先,疲者后,其法十一而至;五十里而争利,则蹶上将军,其法半至;三十里而争利,则三分之二至。是故军无?重则亡,无粮食则亡,无委积则亡。故不知诸侯之谋者,不能豫交;不知山林、险阻、沮泽之形者,不能行军;不用乡导者,不能得地利。故兵以诈立,以利动,以分和?变者也。故其疾如风,其徐如林,侵掠如火,不动如山,难知如阴,动如雷震。掠乡分?,廓地分利,悬权而动。先知迂直之计者胜,此军争之法也。《军政》曰:“言不相闻,故?之金鼓;视不相见,故?之旌旗。”夫金鼓旌旗者,所以一民之耳目也。民既专一,则勇者不得独进,怯者不得独退,此用?之法也。故夜战多金鼓,昼战多旌旗,所以变人之耳目也。三军可夺气,将军可夺心。是故朝气锐,昼气惰,暮气归。善用兵者,避其锐气,击其惰归,此治气者也。以治待乱,以静待哗,此治心者也。以近待远,以佚待劳,以饱待饥,此治力者也。无邀正正之旗,无击堂堂之陈,此治变者也。故用兵之法,高陵勿向,背丘勿逆,佯北勿从,锐卒勿攻,饵兵勿食,归师勿遏,围师遗?,穷寇勿迫,此用兵之法也。 - -九变第八 - -孙子曰: 凡用兵之法,将受命於君,合军聚合。泛地无舍,衢地合交,绝地无留,围地则谋,死地则战,途有所不由,军有所不击,城有所不攻,地有所不争,君命有所不受。故将通於九变之利者,知用兵矣;将不通九变之利,虽知地形,不能得地之利矣;治兵不知九变之术,虽知五利,不能得人之用矣。是故智者之虑,必杂於利害,杂於利而务可信也,杂於害而患可解也。是故屈诸侯者以害,役诸侯者以业,趋诸侯者以利。故用兵之法,无恃其不来,恃吾有以待之;无恃其不攻,恃吾有所不可攻也。故将有五危,必死可杀,必生可虏,忿速可侮,廉洁可辱,爱民可烦。凡此五者,将之过也,用兵之灾也。覆军杀将,必以五危,不可不察也。 - -行军第九 - -孙子曰:凡处军相敌,绝山依?,视生处高,战隆无登,此处山之军也。绝水必远水,客绝水而来,勿迎之於水内,令半渡而击之利,欲战者,无附於水而迎客,视生处高,无迎水流,此处水上之军也。绝斥泽,唯亟去无留,若交军於斥泽之中,必依水草而背?树,此处斥泽之军也。平陆处易,右背高,前死后生,此处平陆之军也。凡此四军之利,黄帝之所以胜四帝也。凡军好高而恶下,贵阳而贱阴,养生而处实,军无百疾,是谓必胜。丘陵堤防,必处其阳而右背之,此兵之利,地之助也。上雨水流至,欲涉者,待其定也。凡地有绝涧、天井、天牢、天罗、天陷、天隙,必亟去之,勿近也。吾远之,敌近之;吾迎之,敌背之。军旁有险阻、潢井、蒹葭、小林、??者,必谨覆索之,此伏?之所处也。敌近而静者,恃其险也;远而挑战者,欲人之进也;其所居易者,利也;?树动者,来也;?草多障者,疑也;鸟起者,伏也;兽骇者,覆也;尘高而锐者,车来也;卑而广者,徒来也;散而条达者,樵?也;少而往来者,营军也;辞卑而备者,进也;辞强而进驱者,退也;轻车先出居其侧者,陈也;无约而请和者,谋也;奔走而陈兵者,期也;半进半退者,诱也;杖而立者,饥也;汲而先饮者,渴也;见利而不进者,劳也;鸟集者,虚也;夜呼者,恐也;军扰者,将不重也;旌旗动者,乱也;吏怒者,倦也;杀马肉食者,军无粮也;悬?不返其舍者,穷寇也;谆谆翕翕,徐与人言者,失?也;数赏者,窘也;数罚者,困也;先暴而后畏其?者,不精之至也;来委谢者,欲休息也。兵怒而相迎,久而不合,又不相去,必谨察之。兵非贵益多也,惟无武进,足以并力料敌取人而已。夫惟无虑而易敌者,必擒於人。卒未亲而罚之,则不服,不服则难用。卒已亲附而罚不行,则不可用。故合之以文,齐之以武,是谓必取。令素行以教其民,则民服;令素不行以教其民,则民不服。令素行者,与?相得也。 - -地形第十 - -孙子曰:地形有通者、有?者、有支者、有隘者、有险者、有远者。我可以往,彼可以来,曰通。通形者,先居高阳,利粮道,以战则利。可以往,难以返,曰?。?形者,敌无备,出而胜之,敌若有备,出而不胜,难以返,不利。我出而不利,彼出而不利,曰支。支形者,敌虽利我,我无出也,引而去之,令敌半出而击之利。隘形者,我先居之,必盈之以待敌。若敌先居之,盈而勿从,不盈而从之。险形者,我先居之,必居高阳以待敌;若敌先居之,引而去之,勿从也。远形者,势均难以挑战,战而不利。凡此六者,地之道也,将之至任,不可不察也。凡兵有走者、有驰者、有陷者、有崩者、有乱者、有北者。凡此六者,非天地之灾,将之过也。夫势均,以一击十,曰走;卒强吏弱,曰驰;吏强卒弱,曰陷;大吏怒而不服,遇敌?而自战,将不知其能,曰崩;将弱不严,教道不明,吏卒无常,陈兵纵横,曰乱;将不能料敌,以少合?,以弱击强,兵无选锋,曰北。凡此六者,败之道也,将之至任,不可不察也。夫地形者,兵之助也。料敌制胜,计险隘远近,上将之道也。知此而用战者必胜,不知此而用战者必败。故战道必胜,主曰无战,必战可也;战道不胜,主曰必战,无战可也。故进不求名,退不避罪,唯民是保,而利於主,国之宝也。视卒如婴儿,故可以与之赴深溪;视卒如爱子,故可与之俱死。厚而不能使,爱而不能令,乱而不能治,譬若骄子,不可用也。知吾卒之可以击,而不知敌之不可击,胜之半也;知敌之可击,而不知吾卒之不可以击,胜之半也;知敌之可击,知吾卒之可以击,而不知地形之不可以战,胜之半也。故知兵者,动而不迷,举而不穷。故曰:知彼知己,胜乃不殆;知天知地,胜乃可全。 - -九地第十一 - -孙子曰:用兵之法,有散地,有轻地,有争地,有交地,有衢地,有重地,有泛地,有围地,有死地。诸侯自战其地者,?散地;入人之地不深者,?轻地;我得亦利,彼得亦利者,?争地;我可以往,彼可以来者,?交地;诸侯之地三属,先至而得天下?者,?衢地;入人之地深,背城邑多者,?重地;山林、险阻、沮泽,凡难行之道者,?泛地;所由入者隘,所从归者迂,彼寡可以击吾之?者,?围地;疾战则存,不疾战则亡者,?死地。是故散地则无战,轻地则无止,争地则无攻,交地则无绝,衢地则合交,重地则掠,泛地则行,围地则谋,死地则战。古之善用兵者,能使敌人前后不相及,?寡不相恃,贵贱不相救,上下不相收,卒离而不集,兵合而不齐。合於利而动,不合於利而止。敢问敌?而整将来,待之若何曰:先夺其所爱则听矣。兵之情主速,乘人之不及。由不虞之道,攻其所不戒也。凡?客之道,深入则专。主人不克,掠於饶野,三军足食。谨养而勿劳,并气积力,运兵计谋,?不可测。投之无所往,死且不北。死焉不得,士人尽力。兵士甚陷则不惧,无所往则固,深入则拘,不得已则斗。是故其兵不修而戒,不求而得,不约而亲,不令而信,禁祥去疑,至死无所之。吾士无?财,非恶货也;无?命,非恶寿也。令发之日,士卒坐者涕沾襟,偃卧者涕交颐,投之无所往,诸、?之勇也。故善用兵者,譬如率然。率然者,常山之蛇也。击其首则尾至,击其尾则首至,击其中则首尾俱至。敢问兵可使如率然乎?曰可。夫吴人与越人相恶也,当其同舟而济而遇风,其相救也如左右手。是故方马埋轮,未足恃也;齐勇如一,政之道也;刚柔皆得,地之理也。故善用兵者,携手若使一人,不得已也。将军之事,静以幽,正以治,能愚士卒之耳目,使之无知;易其事,革其谋,使人无识;易其居,迂其途,使民不得虑。帅与之期,如登高而去其梯;帅与之深入诸侯之地,而发其机。若驱群羊,驱而往,驱而来,莫知所之。聚三军之?,投之於险,此谓将军之事也。九地之变,屈伸之力,人情之理,不可不察也。凡?客之道,深则专,浅则散。去国越境而师者,绝地也;四彻者,衢地也;入深者,重地也;入浅者,轻地也;背固前隘者,围地也;无所往者,死地也。是故散地吾将一其志,轻地吾将使之属,争地吾将趋其后,交地吾将谨其守,交地吾将固其结,衢地吾将谨其恃,重地吾将继其食,泛地吾将进其途,围地吾将塞其?,死地吾将示之以不活。故兵之情:围则御,不得已则斗,过则从。是故不知诸侯之谋者,不能预交;不知山林、险阻、沮泽之形者,不能行军;不用乡导,不能得地利。四五者,一不知,非霸王之兵也。夫霸王之兵,伐大国,则其?不得聚;威加於敌,则其交不得合。是故不争天下之交,不养天下之权,信己之私,威加於敌,则其城可拔,其国可隳。施无法之赏,悬无政之令。犯三军之?,若使一人。犯之以事,勿告以言;犯之以害,勿告以利。投之亡地然后存,陷之死地然后生。夫?陷於害,然后能?胜败。故?兵之事,在顺详敌之意,并敌一向,千里杀将,是谓巧能成事。是故政举之日,夷关折符,无通其使,厉於廊庙之上,以诛其事。敌人开?,必亟入之,先其所爱,微与之期,践墨随敌,以决战事。是故始如处女,敌人开户;后如脱兔,敌不及拒。 - -火攻第十二 - -孙子曰:凡火攻有五:一曰火人,二曰火积,三曰火?,四曰火库,五曰火队。行火必有因,因必素具。发火有时,起火有日。时者,天之燥也。日者,月在箕、壁、翼、?也。凡此四宿者,风起之日也。凡火攻,必因五火之变而应之:火发於内,则早应之於外;火发而其兵静者,待而勿攻,极其火力,可从而从之,不可从则上。火可发於外,无待於内,以时发之,火发上风,无攻下风,昼风久,夜风止。凡军必知五火之变,以数守之。故以火佐攻者明,以水佐攻者强。水可以绝,不可以夺。夫战胜攻取而不惰其功者凶,命曰“费留”。故曰:明主虑之,良将惰之,非利不动,非得不用,非危不战。主不可以怒而兴师,将不可以?而攻战。合於利而动,不合於利而上。怒可以复喜,?可以复说,亡国不可以复存,死者不可以复生。故明主慎之,良将警之。此安国全军之道也。 - -用间第十三 - -孙子曰: 凡兴师十万,出征千里,百姓之费,公家之奉,日费千金,内外骚动,怠於道路,不得操事者,七十万家。相守数年,以争一日之胜,而爱爵禄百金,不知敌之情者,不仁之至也,非民之将也,非主之佐也,非胜之主也。故明君贤将所以动而胜人,成功出於?者,先知也。先知者,不可取於鬼神,不可象於事,不可验於度,必取於人,知敌之情者也。故用间有五:有因间,有内间,有反间,有死间,有生间。五间俱起,莫知其道,是谓神纪,人君之宝也。乡间者,因其乡人而用之;内间者,因其官人而用之;反间者,因其敌间而用之;死间者,??事於外,令吾闻知之而传於敌间也;生间者,反报也。故三军之事,莫亲於间,赏莫厚於间,事莫密於间,非圣贤不能用间,非仁义不能使间,非微妙不能得间之实。微哉微哉!无所不用间也。间事未发而先闻者,间与所告者兼死。凡军之所欲击,城之所欲攻,人之所欲杀,必先知其守将、左右、?者、门者、舍人之姓名,令吾间必索知之。敌间之来间我者,因而利之,导而舍之,故反间可得而用也;因是而知之,故乡间、内间可得而使也;因是而知之,故死间??事,可使告敌;因是而知之,故生间可使如期。五间之事,主必知之,知之必在於反间,故反间不可不厚也。昔殷之兴也,伊挚在夏;周之兴也,吕牙在殷。故明君贤将,能以上智?间者,必成大功。此兵之要,三军之所恃而动也。 diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-gbk.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-gbk.txt deleted file mode 100644 index ef38e4b64..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-gbk.txt +++ /dev/null @@ -1,107 +0,0 @@ -This file was derived from -http://www.gutenberg.org/files/23864/23864-0.txt -after converting from Traditional Chinese to Simplified Chinese. --------- -ʼƵһ - -Իߣ֮£֮أ֮ɲҲ - -ʾ֮£У֮Լƣ飺һԻԻ죬ԻأԻԻ - -ߣͬ⣬֮֮ηΣҲߣʱҲߣԶסҲߣǡšʡ¡ҲߣơٵҲߣĪţ֪֮ʤ֪߲ʤ - -У֮Լƣ飬ԻеܣãУǿʿͷԴ֪ʤӡ - -ƣ֮ʤ֮ƣ֮ذܣȥ֮ - -˞֮ƣ⡣ߣȨҲ - -ߣҲܶʾ֮ܣöʾ֮ãʾ֮ԶԶʾ֮֮Ҷȡ֮ʵ֮ǿ֮ŭ֮֮֮׶֮ޱ䲻⡣˱֮ʤȴҲ - -δսʤߣҲδս㲻ʤߣҲʤ㲻ʤԴ˹֮ʤӡ - -սڶ - -Իñ֮۳ǧ񆣬ﳵǧˣʮǧ֮ѣ֮ã֮ģ֮շǧȻʮ֮ʦӡ - -սҲʤ۱񣬹ñʦò㡣۱׶ߣӡʱ׾٣δ֮Ҳöߣδ֮Ҳʲ֪ñ֮ߣܾ֪ñ֮Ҳ - -ñߣ۲ټأȡ춹춵УʾʳҲ֮ƶʦԶ䣬Զƶʦ߹սߣƽۡƚԭ춼ң֮ѣʮȥߣ֮ѣƾʸꪘJìţ󳵣ʮȥ - -ǽʳ춵УʳһӣʮӣݽһʯʮʯɱߣŭҲȡ֮ߣҲʳսóʮϣȵߣ졣Ӷ֮ƶ֮νʤжǿ - -ʱʤá֪֮֮˾ҰΣ֮Ҳ - -ı - -Իñ֮ȫϣƹ֮ȫϣƾ֮ȫÞϣô֮ȫϣ֮ȫϣ֮ǹʰսʤ֮Ҳս֮֮Ҳ - -ϱıηη¹ǡ֮鲻ѡޙMݜе¶ɣ鞣¶ѡʤޣϸ֮ɱʿ֮һDzߣ˹֮Ҳ - -ñߣ֮սҲ֮ǶǹҲ֮ǾҲȫ£ʱٶȫı֮Ҳ - -ñ֮ʮΧ֮֮֮սܱ֮֮֮С֮ᣬ֮Ҳ - -ߣ֮Ҳǿ϶ʾ֮Ի춾֪֮Խν֪֮֮˶ν֮ˣν֪֮£֮ͬʿӣ֪֮Ȩ֮ͬΣʿӡȻɣ֮ӡνҾʤ - -֪ʤ壺֪ս벻սߣʤʶ֮ߣʤͬߣʤݴߣʤܶߣʤߣ֪ʤ֮Ҳ - -Ի֪֪ˣսO֪˶֪һʤһ֪˲֪ÿսذܡ - -ε - -Ի֮սߣȞ鲻ʤԴ֮ʤʤڼʤڵСսߣܞ鲻ʤʹбؿʤԻʤ֪ɞ顣 - -ʤߣҲʤߣҲ㣬Nߣ춾ŵ֮£ƹߣ춾֮ϣԱȫʤҲ - -ʤ֪֮֮ҲսʤԻƣ֮Ҳʾ²Ŀ϶֮սߣʤʤҲս֮ʤҲ¹սʤ߯߯ߣʤʤѰҲսߣ춲֮أʧ֮Ҳǹʤʤսܱսʤñߣ޵ܞʤ֮ - -һԻȣԻԻԻƣԻʤȣƣʤʤ愳㏣ܱ㏳愡ʤ֮սˮǧ֮GߣҲ - -Ƶ - -ԻαιѣҲ綷ѣҲ֮ʹܵжްߣҲ֮ӣԴVͶߣʵҲ - -սߣϣʤƳߣأ罭նʼҲʱҲ壬֮䣬ʤҲɫ壬ɫ֮䣬ʤҲζ壬ζ֮䣬ʤҲսƣ֮䣬ʤҲѭ֮޶ˣ֮գ - -ˮ֮ƯʯߣҲv֮춻ߣҲǹսߣգڶ̡󣬽緢 - -׷׼ҶҲ磬ԲɰҲΣ£ǿңҲӣҲǿҲƶߣ֮бش֮֮бȡ֮֮֮ - -սߣ֮ƣˣ˶ơߣսҲתľʯľʯ֮ԣ򾲣Σ򶯣ֹԲСս֮ƣתԲʯǧ֮ɽߣҲ - -ʵ - -Իȴսضսضս͡ - -սߣ˶ˡʹߣ֮Ҳʹ˲ߣ֮Ҳʵܼ֮֮֮ܶ⡣ǧߣ֮ҲȡߣҲضعߣҲ - -ƹߣв֪أߣв֪΢΢Σܞ֮˾ߣҲ˶׷ߣٶɼҲսòսߣؾҲҲս仭ض֮вսߣ֮Ҳ˶Σרз֡רһз֞ʮʮһҲұйѣԱߣ֮սԼӡս֮ز֪֪߶࣬߶࣬ս߹ӡʱǰѣǰѣҹѣѣѡߣҲߣʹ˱Ҳ֪ս֮أ֪ս֮գǧս֪ս֮أ֪սգܾңҲܾǰܾȺ󣬺ܾǰԶʮ֮Խ֮࣬ʤգԻʤɞҲ䱊ʹ޶ʲ֪֮ʧ֮ƣ֪֪֮֮֮֮أ֪֮N֮α֮Ρ䲻߲ܿıζʤ춱֪˽֪ʤ֮ΣĪ֪ʤ֮ΡսʤͣӦˮˮ֮бܸ߶£֮αʵ飻ˮضжʤʱ޳ƣˮ޳Ρб仯ȡʤߣν֮񡣹޳ʤʱ޳λж̳ - - - -Ի ñ֮춾Ͼ۱ͶᣬĪ춾֮ߣ؞ֱԻ;֮˷ֱ֪֮ҲΣپ򲻼ίwؾ衣ǹʒԼ׶ҹУeȣƣߺ䷨ʮһʮϽ䷨ʮ֮ǹʾwʳίʲ֪֮ıߣԥ֪ɽ֡衢֮ߣо絼ߣܵõʱթԷֺ͞Ҳ伲磬֣𣬲ɽֱ֪طȨֱ֪֮ʤ˾֮ҲԻԲţʞ֮ģӲʞ֮졣ߣһ֮ĿҲרһ߲ö߲öˣñ֮Ҳҹսģս죬Ա֮ĿҲɶɶġǹʳ裬ĺ顣ñߣ飬ҲδңԾҲԽԶͣԱҲ֮죬޻֮£αҲñ֮򣬱棬ӣ𹥣ʳʦΧʦIȣñ֮Ҳ - -űڰ - -Ի ñ֮춾ϾۺϡᣬغϽΧıս;ɣܡʽͨ춾ű֮ߣ֪ñӣͨű֪֮Σܵõ֮ӣα֪ű֪֮֮ܵӡǹ֮ǣҲ춺ɽҲǹԺҵñ֮䲻Դ֮䲻ɹҲʽΣɱ²ٿ꣬裬ɷߣ֮Ҳñ֮ҲɱΣɲҲ - -оھ - -ԻУɽYߣս¡޵ǣ˴ɽ֮ҲˮԶˮ;ˮӭ֮ˮڣɶ֮սߣ޸ˮӭͣߣӭˮ˴ˮ֮ҲΨؽȥ춳֮Уˮݶ˴֮Ҳƽ½ףұߣǰ˴ƽ½֮Ҳľ֮Ƶ֮ʤĵҲø߶£ʵްټνʤ̷شұ֮˱֮֮Ҳˮߣ䶨Ҳо쾮Ρޡݡ϶ؽȥ֮ҲԶ֮н֮ӭ֮б֮衢꾮硢С֡[Cߣؽ֮˷֮ҲнߣҲԶսߣ֮ҲߣҲߣҲݶߣҲߣҲ޺ߣҲ߶ߣҲߣͽҲɢߣԒҲٶߣӪҲDZߣҲǿߣҲᳵȳߣҲԼߣıҲ߶±ߣҲߣҲȶߣҲߣҲߣҲߣҲҹߣҲߣҲ춯ߣҲŭߣҲɱʳߣҲIߣҲ׻׻⣬ߣʧҲߣҲߣҲȱη䱊ߣ֮ҲίлߣϢҲŭӭöϣֲȥؽ֮ǹҲΩԲϵȡ˶ѡΩǶ׵ߣˡδ׶֮򲻷á׸У򲻿áʺ֮ģ֮䣬νȡԽزԽ񲻷ߣ뱊Ҳ - -εʮ - -ԻͨߡВߡ֧ߡаߡߡԶߡҿ˿ԻͨͨߣȾӸսԷԻ졣ߣޱʤ֮бʤԷҳ˳Ի֧֧ߣң޳Ҳȥ֮а֮ߣȾ֮ӯ֮ԴСȾ֮ӯӣӯ֮ߣȾ֮ؾӸԴУȾ֮ȥ֮ҲԶߣƾսսߣ֮Ҳ֮ΣɲҲߡгߡߡбߡߡбߡߣ֣֮֮ҲƾһʮԻߣǿԻۣǿԻݣŭБս֪ܣԻϣ̵޳±ݺᣬԻңϵУٺϱǿѡ棬Իߣ֮Ҳ֮ΣɲҲߣ֮ҲϵʤհԶϽ֮Ҳ֪˶ս߱ʤ֪˶ս߱ذܡսʤԻսսҲսʤԻսսҲʽ˲ΨDZ֮ҲӤʿ֮Ϫ簮ӣʿ֮ʹҶΣƩӣҲ֪֮Ի֪֮ɻʤ֮Ҳ֪֮ɻ֪֮Իʤ֮Ҳ֪֮ɻ֪֮Ի֪֮սʤ֮Ҳ֪ߣԣٶԻ֪֪ʤ˲֪֪أʤ˿ȫ - -ŵصʮһ - -Իñ֮ɢأأأнأأصأзأΧأءսߣɢأ֮زߣأҵ˵ߣأҿ˿ߣ齻أ֮±ߣأ֮ضߣصأɽ֡衢󣬷֮ߣ鷺أ߰ӹأ˹ѿԻ֮ߣΧأս棬սߣءǹɢսֹ޹޾ϽصӣУΧıս֮ñߣʹǰ༰Ѳѣȣ²գ϶롣ֹʵб֮Իȶӡ֮٣֮ɲ֮Ҳ֮ר˲ˣҰʳͣ˱ı鲻ɲ⡣Ͷ֮Ҳɲãʿ˾ʿ򲻾壬̣У򶷡ǹ޶䣬ãԼףţȥɣ֮ʿNƣǶҲNǶҲ֮գʿմ齻ãͶ֮֮ҲñߣƩȻȻߣɽ֮ҲβββʱʹȻԻɡԽҲͬ۶ö磬Ҳ֡ǹʷ֣δҲһ֮ҲԵã֮ҲñߣЯʹһˣҲ֮£ģΣʿ֮Ŀʹ֪֮£ıʹʶӣ;ʹ񲻵ǡ˧֮ڣǸ߶ȥݣ˧֮֮أȺĪ֪֮֮Ͷ֮գν֮Ҳŵ֮䣬֮֮ɲҲ֮רdzɢȥԽʦߣҲijߣҲߣصҲdzߣҲǰߣΧҲߣҲǹɢὫһ־Ὣʹ֮Ὣ󣬽ὫأὫᣬὫѣصὫʳὫ;ΧὫIὫʾ֮Բʱ֮飺Χ򶷣ӡǹʲ֪֮ıߣԤ֪ɽ֡衢֮ߣо絼ܵõߣһ֪ǰ֮Ҳ֮䱊þۣ춵У佻úϡǹʲ֮֮Ȩż֮˽춵УǿɰΣġʩ޷֮֮ͣ֮ʹһˡ֮£ԣ֮ԺͶ֮Ȼ棬֮Ȼ춺Ȼܞʤܡʞ֮£˳֮⣬һǧɱνܳ¡ǹ֮գĹ۷ͨʹ֮ϣ¡˿Hؽ֮΢֮ڣīУԾս¡ǹʼ紦Ů˿ãвܡ - -𹥵ʮ - -Ի壺һԻˣԻԻwԻ⣬Իӡлؾߡʱաʱߣ֮ҲߣڻڡFҲߣ֮Ҳ𹥣֮Ӧ֮ڣӦ֮⣻𷢶ߣ𹥣ɴӶ֮ɴϡɷ⣬޴ڣʱ֮Ϸ磬޹·磬ãҹֹ֪֮䣬֮ԻˮǿˮԾԶᡣսʤȡ书ףԻԻ֮֮ǵòãΣսŭʦԑCսϡŭԸϲCԸ˵Ը棬߲Ը֮֮˰ȫ֮Ҳ - -üʮ - -Ի ʦʮ򣬳ǧ֮ѣ֮շǧɧ춵·òߣʮҡ꣬һ֮ʤ»ٽ𣬲֪֮ߣ֮Ҳ֮Ҳ֮Ҳʤ֮ҲͽԶʤˣɹ춱ߣ֪Ҳ֪ߣȡ춹񣬲£춶ȣȡˣ֪֮Ҳü壺䣬ڼ䣬з䣬䣬䡣Ī֪νͣ˾֮Ҳߣ˶֮ڼߣ˶֮ߣм֮ߣN⣬֪֮춵мҲߣҲ֮£Ī춼䣬Ī춼䣬Ī춼䣬ʥͲü䣬岻ʹ䣬΢ܵü֮ʵ΢΢գüҲδߣ߼֮֮֮ɱ֪ؽҡ]ߡߡ֪֮֮м֮ߣ֮֮ʷɵöҲǶ֪֮䡢ڼɵöʹҲǶ֪֮N£ʹУǶ֪֮ʹڡ֮£֪֪֮֮춷䣬ʷ䲻ɲҲ֮Ҳֿģ֮Ҳ󡣹ͽǞߣسɴ󹦡˱֮Ҫ֮ѶҲ diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-utf-8.txt deleted file mode 100644 index 375e1adb1..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-utf-8.txt +++ /dev/null @@ -1,107 +0,0 @@ -This file was derived from -http://www.gutenberg.org/files/23864/23864-0.txt -after converting from Traditional Chinese to Simplified Chinese. --------- -始计第一 - -孙子曰:兵者,国之大事,死生之地,存亡之道,不可不察也。 - -故经之以五事,校之以计,而索其情:一曰道,二曰天,三曰地,四曰将,五曰法。 - -道者,令民与上同意,可与之死,可与之生,而不畏危也;天者,阴阳、寒暑、时制也;地者,远近、险易、广狭、死生也;将者,智、信、仁、勇、严也;法者,曲制、官道、主用也。凡此五者,将莫不闻,知之者胜,不知者不胜。 - -故校之以计,而索其情,曰:主孰有道?将孰有能?天地孰得?法令孰行?兵眾孰强?士卒孰练?赏罚孰明?吾以此知胜负矣。 - -将听吾计,用之必胜,留之;将不听吾计,用之必败,去之。 - -计利以听,乃為之势,以佐其外。势者,因利而制权也。 - -兵者,诡道也。故能而示之不能,用而示之不用,近而示之远,远而示之近。利而诱之,乱而取之,实而备之,强而避之,怒而挠之,卑而骄之,佚而劳之,亲而离之,攻其无备,出其不意。此兵家之胜,不可先传也。 - -夫未战而庙算胜者,得算多也;未战而庙算不胜者,得算少也。多算胜,少算不胜,而况无算乎!吾以此观之,胜负见矣。 - -作战第二 - -孙子曰:凡用兵之法,驰车千駟,革车千乘,带甲十万,千里馈粮。则内外之费,宾客之用,胶漆之材,车甲之奉,日费千金,然后十万之师举矣。 - -其用战也,贵胜,久则钝兵挫锐,攻城则力屈,久暴师则国用不足。夫钝兵挫锐,屈力殫货,则诸侯乘其弊而起,虽有智者,不能善其后矣。故兵闻拙速,未睹巧之久也。夫兵久而国利者,未之有也。故不尽知用兵之害者,则不能尽知用兵之利也。 - -善用兵者,役不再籍,粮不三载,取用於国,因粮於敌,故军食可足也。国之贫於师者远输,远输则百姓贫;近於师者贵卖,贵卖则百姓竭,财竭则急於丘役。力屈财殫,中原内虚於家,百姓之费,十去其七;公家之费,破军罢马,甲胄矢弩,戟楯矛櫓,丘牛大车,十去其六。 - -故智将务食於敌,食敌一钟,当吾二十钟;萁秆一石,当吾二十石。故杀敌者,怒也;取敌之利者,货也。故车战,得车十乘以上,赏其先得者,而更其旌旗。车杂而乘之,卒善而养之,是谓胜敌而益强。 - -故兵贵胜,不贵久。故知兵之将,民之司命。国家安危之主也。 - -谋攻第三 - -孙子曰:凡用兵之法,全国為上,破国次之;全军為上,破军次之;全旅為上,破旅次之;全卒為上,破卒次之;全伍為上,破伍次之。是故百战百胜,非善之善者也;不战而屈人之兵,善之善者也。 - -故上兵伐谋,其次伐交,其次伐兵,其下攻城。攻城之法,為不得已。修櫓轒轀,具器械,三月而后成;距闉,又三月而后已。将不胜其忿,而蚁附之,杀士三分之一,而城不拔者,此攻之灾也。 - -故善用兵者,屈人之兵,而非战也,拔人之城而非攻也,毁人之国而非久也,必以全争於天下,故兵不顿而利可全,此谋攻之法也。 - -故用兵之法,十则围之,五则攻之,倍则分之,敌则能战之,少则能逃之,不若则能避之。故小敌之坚,大敌之擒也。 - -夫将者,国之辅也。辅周则国必强,辅隙则国必弱。故君之所以患於军者三:不知军之不可以进而谓之进,不知军之不可以退而谓之退,是谓縻军;不知三军之事,而同三军之政,则军士惑矣;不知三军之权,而同三军之任,则军士疑矣。三军既惑且疑,则诸侯之难至矣。是谓乱军引胜。 - -故知胜有五:知可以战与不可以战者,胜。识眾寡之用者,胜。上下同欲者,胜。以虞待不虞者,胜。将能而君不御者,胜。此五者,知胜之道也。 - -故曰:知己知彼,百战不貽;不知彼而知己,一胜一负;不知彼不知己,每战必败。 - -军形第四 - -孙子曰:昔之善战者,先為不可胜,以待敌之可胜。不可胜在己,可胜在敌。故善战者,能為不可胜,不能使敌必可胜。故曰:胜可知,而不可為。 - -不可胜者,守也;可胜者,攻也。守则不足,攻则有餘。善守者,藏於九地之下,善攻者,动於九天之上,故能自保而全胜也。 - -见胜不过眾人之所知,非善之善者也;战胜而天下曰善,非善之善者也。故举秋毫不為多力,见日月不為明目,闻雷霆不為聪耳。古之善战者,胜於易胜者也。故善战者之胜也,无智名,无勇功,故其战胜不忒。不忒者,其所措必胜,胜已败者也。故善战者,先立於不败之地,而不失敌之败也。是故胜兵先胜,而后求战,败兵先战而后求胜。善用兵者,修道而保法,故能為胜败之政。 - -兵法:一曰度,二曰量,三曰数,四曰称,五曰胜。地生度,度生量,量生数,数生称,称生胜。故胜兵若以鎰称銖,败兵若以銖称鎰。胜者之战,若决积水於千仞之谿者,形也。 - -兵势第五 - -孙子曰:凡治眾如治寡,分数是也;斗眾如斗寡,形名是也;三军之眾,可使必受敌而无败者,奇正是也;兵之所加,如以碫投卵者,虚实是也。 - -凡战者,以正合,以奇胜。故善出奇者,无穷如天地,不竭如江海。终而复始,日月是也。死而復生,四时是也。声不过五,五声之变,不可胜听也;色不过五,五色之变,不可胜观也;味不过五,五味之变,不可胜尝也;战势,不过奇正,奇正之变,不可胜穷也。奇正相生,如循环之无端,熟能穷之哉? - -激水之疾,至於漂石者,势也;鷙鸟之疾,至於毁折者,节也。是故善战者,其势险,其节短。势如张弩,节如发机。 - -纷纷紜紜,斗乱而不可乱也;浑浑沌沌,形圆而不可败也。乱生於治,怯生於勇,弱生於强。治乱,数也;勇怯,势也;强弱,形也。故善动敌者,形之,敌必从之;予之,敌必取之。以利动之,以卒待之。 - -故善战者,求之於势,不责於人;故能择人而任势。任势者,其战人也,如转木石。木石之性,安则静,危则动,方则止,圆则行。故善战人之势,如转圆石於千仞之山者,势也。 - -虚实第六 - -孙子曰:凡先处战地而待敌者佚,后处战地而趋战者劳。 - -故善战者,致人而不致於人。能使敌人自至者,利之也;能使敌人不得至者,害之也。故敌佚能劳之,饱能饥之,安能动之。出其所必趋,趋其所不意。行千里而不劳者,行於无人之地也;攻而必取者,攻其所不守也。守而必固者,守其所不攻也。 - -故善攻者,敌不知其所守;善守者,敌不知其所攻。微乎微乎,至於无形;神乎神乎,至於无声,故能為敌之司命。进而不可御者,冲其虚也;退而不可追者,速而不可及也。故我欲战,敌虽高垒深沟,不得不与我战者,攻其所必救也;我不欲战,虽画地而守之,敌不得与我战者,乖其所之也。故形人而我无形,则我专而敌分。我专為一,敌分為十,是以十攻其一也。则我眾敌寡,能以眾击寡者,则吾之所与战者约矣。吾所与战之地不可知,不可知则敌所备者多,敌所备者多,则吾所与战者寡矣。故备前则后寡,备后则前寡,备左则右寡,备右则左寡,无所不备,则无所不寡。寡者,备人者也;眾者,使人备己者也。故知战之地,知战之日,则可千里而会战;不知战之地,不知战日,则左不能救右,右不能救左,前不能救后,后不能救前,而况远者数十里,近者数里乎!以吾度之,越人之兵虽多,亦奚益於胜哉!故曰:胜可為也。敌虽眾,可使无斗。故策之而知得失之计,候之而知动静之理,形之而知死生之地,角之而知有餘不足之处。故形兵之极,至於无形。无形则深间不能窥,智者不能谋。因形而措胜於眾,眾不能知。人皆知我所以胜之形,而莫知吾所以制胜之形。故其战胜不復,而应形於无穷。夫兵形象水,水之行避高而趋下,兵之形避实而击虚;水因地而制流,兵因敌而制胜。故兵无常势,水无常形。能因敌变化而取胜者,谓之神。故五行无常胜,四时无常位,日有短长,月有死生。 - -军争第七 - -孙子曰: 凡用兵之法,将受命於君,合军聚眾,交和而舍,莫难於军争。军争之难者,以迂為直,以患為利。故迂其途,而诱之以利,后人发,先人至,此知迂直之计者也。军争為利,军争為危。举军而争利则不及,委军而争利则輜重捐。是故捲甲而趋,日夜不处,倍道兼行,百裡而争利,则擒三将军,劲者先,疲者后,其法十一而至;五十里而争利,则蹶上将军,其法半至;三十里而争利,则三分之二至。是故军无輜重则亡,无粮食则亡,无委积则亡。故不知诸侯之谋者,不能豫交;不知山林、险阻、沮泽之形者,不能行军;不用乡导者,不能得地利。故兵以诈立,以利动,以分和為变者也。故其疾如风,其徐如林,侵掠如火,不动如山,难知如阴,动如雷震。掠乡分眾,廓地分利,悬权而动。先知迂直之计者胜,此军争之法也。《军政》曰:“言不相闻,故為之金鼓;视不相见,故為之旌旗。”夫金鼓旌旗者,所以一民之耳目也。民既专一,则勇者不得独进,怯者不得独退,此用眾之法也。故夜战多金鼓,昼战多旌旗,所以变人之耳目也。三军可夺气,将军可夺心。是故朝气锐,昼气惰,暮气归。善用兵者,避其锐气,击其惰归,此治气者也。以治待乱,以静待哗,此治心者也。以近待远,以佚待劳,以饱待饥,此治力者也。无邀正正之旗,无击堂堂之陈,此治变者也。故用兵之法,高陵勿向,背丘勿逆,佯北勿从,锐卒勿攻,饵兵勿食,归师勿遏,围师遗闕,穷寇勿迫,此用兵之法也。 - -九变第八 - -孙子曰: 凡用兵之法,将受命於君,合军聚合。泛地无舍,衢地合交,绝地无留,围地则谋,死地则战,途有所不由,军有所不击,城有所不攻,地有所不争,君命有所不受。故将通於九变之利者,知用兵矣;将不通九变之利,虽知地形,不能得地之利矣;治兵不知九变之术,虽知五利,不能得人之用矣。是故智者之虑,必杂於利害,杂於利而务可信也,杂於害而患可解也。是故屈诸侯者以害,役诸侯者以业,趋诸侯者以利。故用兵之法,无恃其不来,恃吾有以待之;无恃其不攻,恃吾有所不可攻也。故将有五危,必死可杀,必生可虏,忿速可侮,廉洁可辱,爱民可烦。凡此五者,将之过也,用兵之灾也。覆军杀将,必以五危,不可不察也。 - -行军第九 - -孙子曰:凡处军相敌,绝山依穀,视生处高,战隆无登,此处山之军也。绝水必远水,客绝水而来,勿迎之於水内,令半渡而击之利,欲战者,无附於水而迎客,视生处高,无迎水流,此处水上之军也。绝斥泽,唯亟去无留,若交军於斥泽之中,必依水草而背眾树,此处斥泽之军也。平陆处易,右背高,前死后生,此处平陆之军也。凡此四军之利,黄帝之所以胜四帝也。凡军好高而恶下,贵阳而贱阴,养生而处实,军无百疾,是谓必胜。丘陵堤防,必处其阳而右背之,此兵之利,地之助也。上雨水流至,欲涉者,待其定也。凡地有绝涧、天井、天牢、天罗、天陷、天隙,必亟去之,勿近也。吾远之,敌近之;吾迎之,敌背之。军旁有险阻、潢井、蒹葭、小林、蘙薈者,必谨覆索之,此伏姦之所处也。敌近而静者,恃其险也;远而挑战者,欲人之进也;其所居易者,利也;眾树动者,来也;眾草多障者,疑也;鸟起者,伏也;兽骇者,覆也;尘高而锐者,车来也;卑而广者,徒来也;散而条达者,樵採也;少而往来者,营军也;辞卑而备者,进也;辞强而进驱者,退也;轻车先出居其侧者,陈也;无约而请和者,谋也;奔走而陈兵者,期也;半进半退者,诱也;杖而立者,饥也;汲而先饮者,渴也;见利而不进者,劳也;鸟集者,虚也;夜呼者,恐也;军扰者,将不重也;旌旗动者,乱也;吏怒者,倦也;杀马肉食者,军无粮也;悬甀不返其舍者,穷寇也;谆谆翕翕,徐与人言者,失眾也;数赏者,窘也;数罚者,困也;先暴而后畏其眾者,不精之至也;来委谢者,欲休息也。兵怒而相迎,久而不合,又不相去,必谨察之。兵非贵益多也,惟无武进,足以并力料敌取人而已。夫惟无虑而易敌者,必擒於人。卒未亲而罚之,则不服,不服则难用。卒已亲附而罚不行,则不可用。故合之以文,齐之以武,是谓必取。令素行以教其民,则民服;令素不行以教其民,则民不服。令素行者,与眾相得也。 - -地形第十 - -孙子曰:地形有通者、有掛者、有支者、有隘者、有险者、有远者。我可以往,彼可以来,曰通。通形者,先居高阳,利粮道,以战则利。可以往,难以返,曰掛。掛形者,敌无备,出而胜之,敌若有备,出而不胜,难以返,不利。我出而不利,彼出而不利,曰支。支形者,敌虽利我,我无出也,引而去之,令敌半出而击之利。隘形者,我先居之,必盈之以待敌。若敌先居之,盈而勿从,不盈而从之。险形者,我先居之,必居高阳以待敌;若敌先居之,引而去之,勿从也。远形者,势均难以挑战,战而不利。凡此六者,地之道也,将之至任,不可不察也。凡兵有走者、有驰者、有陷者、有崩者、有乱者、有北者。凡此六者,非天地之灾,将之过也。夫势均,以一击十,曰走;卒强吏弱,曰驰;吏强卒弱,曰陷;大吏怒而不服,遇敌懟而自战,将不知其能,曰崩;将弱不严,教道不明,吏卒无常,陈兵纵横,曰乱;将不能料敌,以少合眾,以弱击强,兵无选锋,曰北。凡此六者,败之道也,将之至任,不可不察也。夫地形者,兵之助也。料敌制胜,计险隘远近,上将之道也。知此而用战者必胜,不知此而用战者必败。故战道必胜,主曰无战,必战可也;战道不胜,主曰必战,无战可也。故进不求名,退不避罪,唯民是保,而利於主,国之宝也。视卒如婴儿,故可以与之赴深溪;视卒如爱子,故可与之俱死。厚而不能使,爱而不能令,乱而不能治,譬若骄子,不可用也。知吾卒之可以击,而不知敌之不可击,胜之半也;知敌之可击,而不知吾卒之不可以击,胜之半也;知敌之可击,知吾卒之可以击,而不知地形之不可以战,胜之半也。故知兵者,动而不迷,举而不穷。故曰:知彼知己,胜乃不殆;知天知地,胜乃可全。 - -九地第十一 - -孙子曰:用兵之法,有散地,有轻地,有争地,有交地,有衢地,有重地,有泛地,有围地,有死地。诸侯自战其地者,為散地;入人之地不深者,為轻地;我得亦利,彼得亦利者,為争地;我可以往,彼可以来者,為交地;诸侯之地三属,先至而得天下眾者,為衢地;入人之地深,背城邑多者,為重地;山林、险阻、沮泽,凡难行之道者,為泛地;所由入者隘,所从归者迂,彼寡可以击吾之眾者,為围地;疾战则存,不疾战则亡者,為死地。是故散地则无战,轻地则无止,争地则无攻,交地则无绝,衢地则合交,重地则掠,泛地则行,围地则谋,死地则战。古之善用兵者,能使敌人前后不相及,眾寡不相恃,贵贱不相救,上下不相收,卒离而不集,兵合而不齐。合於利而动,不合於利而止。敢问敌眾而整将来,待之若何曰:先夺其所爱则听矣。兵之情主速,乘人之不及。由不虞之道,攻其所不戒也。凡為客之道,深入则专。主人不克,掠於饶野,三军足食。谨养而勿劳,并气积力,运兵计谋,為不可测。投之无所往,死且不北。死焉不得,士人尽力。兵士甚陷则不惧,无所往则固,深入则拘,不得已则斗。是故其兵不修而戒,不求而得,不约而亲,不令而信,禁祥去疑,至死无所之。吾士无餘财,非恶货也;无餘命,非恶寿也。令发之日,士卒坐者涕沾襟,偃卧者涕交颐,投之无所往,诸、劌之勇也。故善用兵者,譬如率然。率然者,常山之蛇也。击其首则尾至,击其尾则首至,击其中则首尾俱至。敢问兵可使如率然乎?曰可。夫吴人与越人相恶也,当其同舟而济而遇风,其相救也如左右手。是故方马埋轮,未足恃也;齐勇如一,政之道也;刚柔皆得,地之理也。故善用兵者,携手若使一人,不得已也。将军之事,静以幽,正以治,能愚士卒之耳目,使之无知;易其事,革其谋,使人无识;易其居,迂其途,使民不得虑。帅与之期,如登高而去其梯;帅与之深入诸侯之地,而发其机。若驱群羊,驱而往,驱而来,莫知所之。聚三军之眾,投之於险,此谓将军之事也。九地之变,屈伸之力,人情之理,不可不察也。凡為客之道,深则专,浅则散。去国越境而师者,绝地也;四彻者,衢地也;入深者,重地也;入浅者,轻地也;背固前隘者,围地也;无所往者,死地也。是故散地吾将一其志,轻地吾将使之属,争地吾将趋其后,交地吾将谨其守,交地吾将固其结,衢地吾将谨其恃,重地吾将继其食,泛地吾将进其途,围地吾将塞其闕,死地吾将示之以不活。故兵之情:围则御,不得已则斗,过则从。是故不知诸侯之谋者,不能预交;不知山林、险阻、沮泽之形者,不能行军;不用乡导,不能得地利。四五者,一不知,非霸王之兵也。夫霸王之兵,伐大国,则其眾不得聚;威加於敌,则其交不得合。是故不争天下之交,不养天下之权,信己之私,威加於敌,则其城可拔,其国可隳。施无法之赏,悬无政之令。犯三军之眾,若使一人。犯之以事,勿告以言;犯之以害,勿告以利。投之亡地然后存,陷之死地然后生。夫眾陷於害,然后能為胜败。故為兵之事,在顺详敌之意,并敌一向,千里杀将,是谓巧能成事。是故政举之日,夷关折符,无通其使,厉於廊庙之上,以诛其事。敌人开闔,必亟入之,先其所爱,微与之期,践墨随敌,以决战事。是故始如处女,敌人开户;后如脱兔,敌不及拒。 - -火攻第十二 - -孙子曰:凡火攻有五:一曰火人,二曰火积,三曰火輜,四曰火库,五曰火队。行火必有因,因必素具。发火有时,起火有日。时者,天之燥也。日者,月在箕、壁、翼、軫也。凡此四宿者,风起之日也。凡火攻,必因五火之变而应之:火发於内,则早应之於外;火发而其兵静者,待而勿攻,极其火力,可从而从之,不可从则上。火可发於外,无待於内,以时发之,火发上风,无攻下风,昼风久,夜风止。凡军必知五火之变,以数守之。故以火佐攻者明,以水佐攻者强。水可以绝,不可以夺。夫战胜攻取而不惰其功者凶,命曰“费留”。故曰:明主虑之,良将惰之,非利不动,非得不用,非危不战。主不可以怒而兴师,将不可以慍而攻战。合於利而动,不合於利而上。怒可以复喜,慍可以复说,亡国不可以复存,死者不可以复生。故明主慎之,良将警之。此安国全军之道也。 - -用间第十三 - -孙子曰: 凡兴师十万,出征千里,百姓之费,公家之奉,日费千金,内外骚动,怠於道路,不得操事者,七十万家。相守数年,以争一日之胜,而爱爵禄百金,不知敌之情者,不仁之至也,非民之将也,非主之佐也,非胜之主也。故明君贤将所以动而胜人,成功出於眾者,先知也。先知者,不可取於鬼神,不可象於事,不可验於度,必取於人,知敌之情者也。故用间有五:有因间,有内间,有反间,有死间,有生间。五间俱起,莫知其道,是谓神纪,人君之宝也。乡间者,因其乡人而用之;内间者,因其官人而用之;反间者,因其敌间而用之;死间者,為誑事於外,令吾闻知之而传於敌间也;生间者,反报也。故三军之事,莫亲於间,赏莫厚於间,事莫密於间,非圣贤不能用间,非仁义不能使间,非微妙不能得间之实。微哉微哉!无所不用间也。间事未发而先闻者,间与所告者兼死。凡军之所欲击,城之所欲攻,人之所欲杀,必先知其守将、左右、謁者、门者、舍人之姓名,令吾间必索知之。敌间之来间我者,因而利之,导而舍之,故反间可得而用也;因是而知之,故乡间、内间可得而使也;因是而知之,故死间為誑事,可使告敌;因是而知之,故生间可使如期。五间之事,主必知之,知之必在於反间,故反间不可不厚也。昔殷之兴也,伊挚在夏;周之兴也,吕牙在殷。故明君贤将,能以上智為间者,必成大功。此兵之要,三军之所恃而动也。 diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-big5.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-big5.txt deleted file mode 100644 index 1918c8fa9..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-big5.txt +++ /dev/null @@ -1,106 +0,0 @@ -This file was derived from -http://www.gutenberg.org/files/23864/23864-0.txt --------- -lpĤ@ - -]lGL̡AꤧjơAͤaAs`DAi]C - -GgHơAդHpAӯ䱡G@DAGѡATaA|NAkC - -D̡AOPWPNAiPAiP͡AӤȦM]FѪ̡ABHBɨ]Fa̡ABIBsUBͤ]FN̡ABHBBiBY]Fk̡ABxDBDΤ]CZ̡ANDA̳ӡA̤ӡC - -GդHpAӯ䱡AGDEDHNEHѦaEoHkOEHLEjHhEmH@EH^HӭtoC - -Nť^pAΤӡAdFNť^pAΤѡAhC - -pQHťADաAH~Cժ̡A]QӨv]C - -L̡A޹D]CGӥܤAΦӥܤΡAӥܤAӥܤCQӻAæӨAӳƤAjפAӼAźAHӳҤA˦ALơAX䤣NCLaӡAiǤ]C - -ҥԦӼqӪ̡Aoh]FԦӼq⤣Ӫ̡Ao֤]ChӡAֺ⤣ӡAӪpLGI^H[AӭtoC - -@ԲĤG - -]lGZΧLkAdoAdAaҤQUAdX³Ch~OAȤΡAAҤ^AOdAMQUv|oC - -ξԤ]AQӡA[hwLUA𫰫hO}A[ɮvhΤCҶwLUA}OfAhѫJӰ_A̡AൽoCGLDtA@[]CҧL[ӰQ̡A]CGɪΧL`̡AhɪΧLQ]C - -ΧL̡AФAyA³TAΩA]³ġAGxi]Cꤧhv̻AhʩmhFv̶QAQhʩmܡA]ܫhCСCO}]A줺aAʩmOAQhCFaOA}x}AҭHکAurACjAQh䤻C - -GNȭġAĤ@A^GQFmz@ۡA^GQۡCGĪ̡A]FĤQ̡Af]CGԡAoQHWAo̡AӧܺXCӭA򵽦ӾiAO׳ӼĦӯqjC - -GLQӡAQ[CGLNAqRCawMD]C - -ѧĤT - -]lGZΧLkAꬰWA}ꦸFxWA}xFȬWA}ȦF򬰤WA}򦸤FWA}COGʾԦʳӡAD̤]FԦө}HLA̤]C - -GWLѡA䦸A䦸LAU𫰡C𫰤kAowCrVA㾹ATӫᦨFZASTӫwCNӨAƪAhT@Aӫު̡A𤧨a]C - -GΧL̡A}HLAӫDԤ]AޤHӫD]AHӫD[]AHѤUAGLyӧQiAѧ𤧪k]C - -GΧLkAQh򤧡Ah𤧡AhAīhԤA֫hkAYhפCGpĤAjĤ]C - -ұN̡Aꤧ]CPhꥲjAثhꥲzCGgҥHwx̤TGxiHiӿפiAxiHhӿפhAOݭxFTxơAӦPTxFAhxhboFTxvAӦPTxAhxhèoCTxJbBáAhѫJܨoCO׶íx޳ӡC - -GӦGiHԻPiHԪ̡AӡCѲ褧Ϊ̡AӡCWUP̡AӡCHݤ̡AӡCNӧgs̡AӡC̡AӤD]C - -GGvAʾԤMFӪvA@Ӥ@tFvACԥѡC - -xβĥ| - -]lGԪ̡AiӡAHݼĤiӡCiӦbvAiӦbġCGԪ̡AରiӡAϼĥiӡCGGӥiAӤiC - -iӪ̡Au]FiӪ̡A]CuhAhlCu̡AéEaUA̡AʩEѤWAG۫OӥӤ]C - -ӤLHҪAD̤]FԳӦӤѤU굽AD̤]CG|@hOA뤣ءADp^oաCjԪ̡AөӪ̤]CGԪ̤Ӥ]ALWALi\AGԳӤ֡C̡֪AұӡAӤwѪ̤]CGԪ̡Aߩ󤣱ѤaAӤĤѤ]COGӧLӡAӫDԡAѧLԦӫDӡCΧL̡A׹DӫOkAGରӱѤFC - -LkG@סAGqATơA|١AӡCaͫסAץͶqAqͼơAƥͺ١A٥ͳӡCGӧLYHٻˡAѧLYH˺CӪ̤ԡAYMndQƪ̡AΤ]C - -LղĤ - -]lGZvpvAƬO]FpAΦWO]FTxAiϥĦӵLѪ̡A_O]FLҥ[ApHZ̡AO]C - -ZԪ̡AHXAH_ӡCGX_̡ALapѦaAܦpCצӽƩlAO]CӴ_͡A|ɬO]CnLAnܡAiť]F⤣LA⤧ܡAi[]FLAܡAiӹ]FԶաAL_A_ܡAiӽa]C_ۥ͡Ap`LݡAavH - -EeAܩ}̡۪Aդ]FeAܩ󷴧̡A`]COGԪ̡AIA`uCզpiA`poC - -ɯɯƯơAæӤiä]FPPAζӤiѤ]CåͩvAĥͩiAzͩjCváAƤ]FiġAդ]FjzAΤ]CGʼĪ̡AΤAĥqFAĥCHQʤAHݤC - -GԪ̡ADաAdHFGܤHӥաCժ̡AԤH]ApۡCۤʡAwhRAMhʡAhAhCGԤHաAp۩dQs̡Aդ]C - -Ĥ - -]lGZBԦaӫݼĪ̧HABԦa;Ԫ̳ҡC - -GԪ̡APHӤPHCϼĤHۦܪ̡AQ]FϼĤHoܪ̡A`]CGħHҤAȤAwʤCXҥ͡AͨҤNCdӤҪ̡ALHa]Fӥ̡AҤu]CuӥT̡AuҤ]C - -G̡AĤҦuFu̡AĤҧCLGLGAܩLΡFGGAܩLnAGରĤqRCiӤim̡AR]FhӤil̡AtӤiΤ]CGڱԡAS`AoPھԪ̡AҥϤ]FڤԡAeaӦuAĤoPھԪ̡AĨҤ]CGΤHӧڵLΡAhڱMӼĤCڱM@AĤQAOHQ@]ChڲĹAH̡Ah^һPԪ̬oC^һPԤaiAihĩҳƪ̦hAĩҳƪ̦hAh^һPԪ̹oCGƫehAƫheAƥhkAƥkhALҤơAhLҤC̡AƤH̤]F̡AϤHƤv̤]CGԤaAԤAhidӷ|ԡFԤaAԤAhϥkAkϥAeϫAᤣϫeAӪp̼ƤQءA̼إGIH^פAVHLhAOqӫvIGGӥi]CAiϵLCGӪopAԤӪRzAΤӪͤaAӪlBCGΧLAܩLΡCLΫh`sA̤ѡC]Φӱө󲳡AાCHҪکҥHӤΡAӲ^ҥHӤΡCGԳӤ_AΩLaCҧLζHAװͤUAL׹F]aӨyAL]ĦӨӡCGLL`աAL`ΡC]ܤƦӨӪ̡AפCGL`ӡA|ɵL`A馳uA릳͡C - -xĤC - -]lG ZΧLkANRgAXxEAMӪ١AxCx̡AHAHwQCG~AӻHQAHoAHܡAp̤]CxQAxMC|xӪQhΡAexӪQhCOGҦ͡A]BADݦAʸ̦ӪQAhTNxAl̥Ah̫AkQ@ӦܡFQئӪQAhݤWNxAkbܡFTQئӪQAhTGܡCOGxLh`AL³h`ALenh`CGѫJѪ̡AݥFsLBIBqAΪ̡AxFζmɪ̡AoaQCGLHBߡAHQʡAHMܪ̤]CGepA}pLAIpAʦpsApAʦpp_CmAaQAavӰʡCp̳ӡAxk]CmxFnGۻDAGFۨAGܺXCҪܺX̡AҥH@եؤ]CJM@Ahi̤oWiAĪ̤oWhAβk]CG]ԦhA޾ԦhܺXAҥHܤHեؤ]CTxiܮANxiܤߡCOG®UAޮkAǮkCΧL̡AרUAkkAv̤]CHvݶáAHRݼMAvߪ̤]CHݻAHHݳҡAHȡAvO̤]CLܥXAL󤧳Avܪ̤]CGΧLkAŦVAICŰfA˥_űqAUŧALŭAkvŹKAvAaFŭAΧLk]C - -EܲĤK - -]lG ZΧLkANRgAXxEXCxaL١AaXAaLdAahѡAahԡA~ҤѡAxҤAҤAaҤAgRҤCGNqEܤQ̡AΧLoFNqEܤQAaΡAoaQoFvLEܤNAQAoHΨoCOG̤{AQ`AQӰȥiH]A`ӱwiѤ]COG}ѫJ̥H`AнѫJ̥H~AͽѫJ̥HQCGΧLkAL䤣ӡA^HݤFL䤣A^Ҥi]CGNMAiAͥiAtiVAGidARiСCZ̡ANL]AΧLa]CЭxNAHMAi]C - -xĤE - -]lGZBxۼġAs̽\AͳBAԶLnABsx]CAȵӨӡAŪ蠟AObQAԪ̡ALӪȡAͳBALyABWx]CAA߫EhLdAYx󥸿AA̤ӭIABAx]CBAkIAe͡ABx]CZ|xQAҤҥHӥ|Ҥ]CZxnӴcUAQӽ⳱AiͦӳBAxLʯeAOץӡCCAB䶧ӥkIALQAaU]CWByܡAA̡Aݨw]CZaBѤBѨcBùBѳBѻءAEhAŪ]C^AĪ񤧡F^蠟AĭICxǦIBCB㶸BpLBP̡AЯAҳB]CĪR̡AI]FӬDԪ̡AHi]Fҩ~̡AQ]Fʪ̡AӤ]Fh٪̡Aä]F_̡A]F~b̡AФ]FаӾU̡AӤ]FӼs̡A{Ӥ]FӱF̡AĤ]F֦өӪ̡Ax]Fӳƪ̡Ai]FjӶiX̡Ah]FX~䰼̡A]FLӽЩM̡AѤ]FbӳL̡A]Fbibh̡A]Fӥߪ̡AȤ]FVӥ̡A]FQӤi̡AҤ]F̡A]F]I̡A]FxZ̡AN]FܺXʪ̡Aä]FO̡A¤]F׭̡AxL³]Faդ٪̡AaF]FνεA}PH̡A]Fƽ̡A~]Fƻ@̡Ax]FɦӫȨ䲳̡A뤧ܤ]Fөeª̡A𮧤]CLӬ۪A[ӤXASۥhAԹCLDQqh]ALZiAHäOƼĨHӤwCұL{өĪ̡AHC򥼿˦ӻ@AhAAAhΡCw˪ӻ@AhiΡCGXHAHZAOץCOHШAhAFOHШAhACO̡AP۱o]C - -aβĤQ - -]lGaΦq̡B̡B̡Bi̡BI̡B̡CڥiHAiHӡAqCqΪ̡A~AQ³DAHԫhQCiHAHA걾CΪ̡AĵLơAXӳӤAĭYơAXӤӡAHAQCڥXӤQAXӤQACΪ̡AQڡAڵLX]AަӥhAOĥbXQCiΪ̡Aڥ~AդHݼġCYĥ~AզӤűqAզӱqCIΪ̡Aڥ~A~HݼġFYĥ~AަӥhAűq]CΪ̡AէHDԡAԦӤQCZ̡AaD]ANܥAi]CZL̡B̡B̡BY̡Bê̡B_̡CZ̡ADѦaaANL]CҶէAH@QAꨫFjOzA깣FOjzA곴FjOӤAAJȦӦ۾ԡANAYFNzYAйDAOL`ALaAáFNƼġAH֦XAHzjALLWA_CZ̡AѤD]ANܥAi]CҦaΪ̡ALU]CƼĨӡApIiAWND]CӥξԪ̥ӡAӥξԪ̥ѡCGԹDӡADLԡAԥi]FԹDӡADꥲԡALԥi]CGiDWAh׸oAߥOOAӧQDAꤧ_]CpAGiHPu`ˡFpRlAGiPѦCpӤϡARӤOAæӤvAĴYźlAiΤ]C^򤧥iHAӤĤiAӤb]FĤiAӤ^򤧤iHAӤb]FĤiA^򤧥iHAӤaΤiHԡAӤb]CGL̡AʦӤgA|ӤaCGGvAӤDpFѪaAӤDiC - -EaĤQ@ - -]lGΧLkAaAaAaAaAaAaAxaAaAaCѫJ۾Ԩa̡AaFJHa`̡AaFڱoQAoQ̡AaFڥiHAiHӪ̡AaFѫJaTݡAܦӱoѤU̡AaFJHa`AIh̡AaFsLBIBqAAZ椧D̡AxaFҥѤJ̹iAұqk̨AiH^̡AaFeԫhsAeԫh`̡AaCOGahLԡAahLAahLAahLAahXAahAxahAahѡAahԡCjΧL̡AϼĤHeᤣۤΡA褣۫AQ⤣۱ϡAWUۦAӤALXӤCXQӰʡAXQӤCݼIJӾNӡAݤYGܨҷRhťoCLDtAHΡCѤDAҤ٤]CZȤDA`JhMCDHJAdzATxCԾiӤųҡAînOABLpѡAiC뤧LҩAB_CjoAhHɤOCLhƳhߡALҩhTA`JhAowhCOGLצӧ١ADӱoAӿˡAOӫHATháAܦLҤC^hLl]ADcf]FLlRADcؤ]COoAh򧤪̮g̡Aת̮[A뤧LҩAѡB󤧫i]CGΧL̡AĴpvMCvM̡A`sD]C䭺hܡAhܡA䤤hѦܡCݧLiϦpvMGHiCҧdHPVH۴c]AP٦ӹJA۱Ϥ]pkCOG谨IA]Fip@AFD]FXұoAaz]CGΧL̡AYϤ@HAow]CNxơARHաAHvAMh򤧦եءAϤLFơAѡAϤHLѡF~A~Aϥo{CӻPApnӥhFӻP`JѫJaAӵoCYXsϡAXөAXӨӡAҤCETxA뤧IAױNxƤ]CEaܡA}OAHzAi]CZȤDA`hMALhChVҦӮv̡Aa]F|̡Aa]FJ`̡Aa]FJL̡Aa]FITei̡Aa]FLҩ̡Aa]COGa^N@ӡAa^NϤݡAa^NͨAa^NԨuAa^NT䵲Aa^NԨAa^N~䭹Axa^Ni~Aa^NAa^NܤHCGLGhmAowhALhqCOGѫJѪ̡AwFsLBIBqAΪ̡AxFζmɡAoaQC|̡A@ADQL]CQLAjAh䲳oEF¥[ġAh椣oXCOGѤUAiѤUvAHvpA¥[ġAh䫰iޡAioCILkAaLFOCǤTxAYϤ@HCǤHơAŧiHFǤH`AŧiHQC뤧`aMsAaM͡CҲ`AMରӱѡCGLơAbԼĤNAüĤ@VAdNAOץনơCOGF|AišALqϡAFYqWAHݨơCĤH}AEJAҷRALPAHġAHMԨơCOGlpBkAĤH}FpߡAĤΩڡC - -ĤQG - -]lGZ𦳤G@HAGnATA|wAC]A]CoɡA_Cɪ̡AѤ]C̡AbߡBBlBH]CZ|J̡A_]CZA]ܦGo󤺡Ah~FoӨLR̡AݦӤŧAOAiqӱqAiqhWCio~ALݩ󤺡AHɵoAoWALUAޭ[A]CZxܡAHƦuCGH̩AH̱jCiHAiHܡCҾԳӧӤk\̤ARꡧOdCGGD{A}NkADQʡADoΡADMԡCDiHӿvANiHYӧԡCXQӰʡAXQӤWCiHƳߡAYiHƻA`ꤣiHƦsA̤iHƥ͡CGDVA}NĵCwxD]C - -ζĤQT - -]lG ZvQUAXdAʩmOAa^AOdA~̰ʡADAoިƪ̡ACQUaCۦuƦ~AH@餧ӡAӷRSʪAĤ̡Aܤ]ADN]ADD]ADӤD]CGgNҥHʦӳӤHA\X󲳪̡A]C̡Ai󰭯AiHơAiסAHAĤ̤]CGζG]AA϶AAͶCѰ_ADAOׯAHg_]Cm̡A]mHӥΤF̡A]xHӥΤF϶̡A]ĶӥΤF̡AƩ~AO^DӶǩĶ]FͶ̡Aϳ]CGTxơA˩󶡡Ap󶡡AƲK󶡡ADt夣ζADq϶ADLoCLvLvILҤζ]CƥoӥD̡APҧi̭ݦCZxұAұAHұAuNBkB̡֪B̡B٤HmWAO^CĶӶڪ̡A]ӧQAɦӪ٤AG϶ioӥΤ]F]OӪAGmBioӨϤ]F]OӪAGơAiϧiġF]OӪAGͶiϦpCơADAb϶AG϶ip]C蠟]A켰bLFP]AfbCGgNAHW̡Aj\CLnATxҫӰʤ]C diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-utf-8.txt deleted file mode 100644 index 5797b374a..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-utf-8.txt +++ /dev/null @@ -1,106 +0,0 @@ -This file was derived from -http://www.gutenberg.org/files/23864/23864-0.txt --------- -始計第一 - -孫子曰:兵者,國之大事,死生之地,存亡之道,不可不察也。 - -故經之以五事,校之以計,而索其情:一曰道,二曰天,三曰地,四曰將,五曰法。 - -道者,令民與上同意,可與之死,可與之生,而不畏危也;天者,陰陽、寒暑、時制也;地者,遠近、險易、廣狹、死生也;將者,智、信、仁、勇、嚴也;法者,曲制、官道、主用也。凡此五者,將莫不聞,知之者勝,不知者不勝。 - -故校之以計,而索其情,曰:主孰有道?將孰有能?天地孰得?法令孰行?兵眾孰強?士卒孰練?賞罰孰明?吾以此知勝負矣。 - -將聽吾計,用之必勝,留之;將不聽吾計,用之必敗,去之。 - -計利以聽,乃為之勢,以佐其外。勢者,因利而制權也。 - -兵者,詭道也。故能而示之不能,用而示之不用,近而示之遠,遠而示之近。利而誘之,亂而取之,實而備之,強而避之,怒而撓之,卑而驕之,佚而勞之,親而離之,攻其無備,出其不意。此兵家之勝,不可先傳也。 - -夫未戰而廟算勝者,得算多也;未戰而廟算不勝者,得算少也。多算勝,少算不勝,而況無算乎!吾以此觀之,勝負見矣。 - -作戰第二 - -孫子曰:凡用兵之法,馳車千駟,革車千乘,帶甲十萬,千里饋糧。則內外之費,賓客之用,膠漆之材,車甲之奉,日費千金,然後十萬之師舉矣。 - -其用戰也,貴勝,久則鈍兵挫銳,攻城則力屈,久暴師則國用不足。夫鈍兵挫銳,屈力殫貨,則諸侯乘其弊而起,雖有智者,不能善其後矣。故兵聞拙速,未睹巧之久也。夫兵久而國利者,未之有也。故不盡知用兵之害者,則不能盡知用兵之利也。 - -善用兵者,役不再籍,糧不三載,取用於國,因糧於敵,故軍食可足也。國之貧於師者遠輸,遠輸則百姓貧;近於師者貴賣,貴賣則百姓竭,財竭則急於丘役。力屈財殫,中原內虛於家,百姓之費,十去其七;公家之費,破軍罷馬,甲胄矢弩,戟楯矛櫓,丘牛大車,十去其六。 - -故智將務食於敵,食敵一鍾,當吾二十鍾;萁稈一石,當吾二十石。故殺敵者,怒也;取敵之利者,貨也。故車戰,得車十乘以上,賞其先得者,而更其旌旗。車雜而乘之,卒善而養之,是謂勝敵而益強。 - -故兵貴勝,不貴久。故知兵之將,民之司命。國家安危之主也。 - -謀攻第三 - -孫子曰:凡用兵之法,全國為上,破國次之;全軍為上,破軍次之;全旅為上,破旅次之;全卒為上,破卒次之;全伍為上,破伍次之。是故百戰百勝,非善之善者也;不戰而屈人之兵,善之善者也。 - -故上兵伐謀,其次伐交,其次伐兵,其下攻城。攻城之法,為不得已。修櫓轒轀,具器械,三月而後成;距闉,又三月而後已。將不勝其忿,而蟻附之,殺士三分之一,而城不拔者,此攻之災也。 - -故善用兵者,屈人之兵,而非戰也,拔人之城而非攻也,毀人之國而非久也,必以全爭於天下,故兵不頓而利可全,此謀攻之法也。 - -故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 - -夫將者,國之輔也。輔周則國必強,輔隙則國必弱。故君之所以患於軍者三:不知軍之不可以進而謂之進,不知軍之不可以退而謂之退,是謂縻軍;不知三軍之事,而同三軍之政,則軍士惑矣;不知三軍之權,而同三軍之任,則軍士疑矣。三軍既惑且疑,則諸侯之難至矣。是謂亂軍引勝。 - -故知勝有五:知可以戰與不可以戰者,勝。識眾寡之用者,勝。上下同欲者,勝。以虞待不虞者,勝。將能而君不御者,勝。此五者,知勝之道也。 - -故曰:知己知彼,百戰不貽;不知彼而知己,一勝一負;不知彼不知己,每戰必敗。 - -軍形第四 - -孫子曰:昔之善戰者,先為不可勝,以待敵之可勝。不可勝在己,可勝在敵。故善戰者,能為不可勝,不能使敵必可勝。故曰:勝可知,而不可為。 - -不可勝者,守也;可勝者,攻也。守則不足,攻則有餘。善守者,藏於九地之下,善攻者,動於九天之上,故能自保而全勝也。 - -見勝不過眾人之所知,非善之善者也;戰勝而天下曰善,非善之善者也。故舉秋毫不為多力,見日月不為明目,聞雷霆不為聰耳。古之善戰者,勝於易勝者也。故善戰者之勝也,無智名,無勇功,故其戰勝不忒。不忒者,其所措必勝,勝已敗者也。故善戰者,先立於不敗之地,而不失敵之敗也。是故勝兵先勝,而後求戰,敗兵先戰而後求勝。善用兵者,修道而保法,故能為勝敗之政。 - -兵法:一曰度,二曰量,三曰數,四曰稱,五曰勝。地生度,度生量,量生數,數生稱,稱生勝。故勝兵若以鎰稱銖,敗兵若以銖稱鎰。勝者之戰,若決積水於千仞之谿者,形也。 - -兵勢第五 - -孫子曰:凡治眾如治寡,分數是也;鬥眾如鬥寡,形名是也;三軍之眾,可使必受敵而無敗者,奇正是也;兵之所加,如以碫投卵者,虛實是也。 - -凡戰者,以正合,以奇勝。故善出奇者,無窮如天地,不竭如江海。終而複始,日月是也。死而復生,四時是也。聲不過五,五聲之變,不可勝聽也;色不過五,五色之變,不可勝觀也;味不過五,五味之變,不可勝嘗也;戰勢,不過奇正,奇正之變,不可勝窮也。奇正相生,如循環之無端,熟能窮之哉? - -激水之疾,至於漂石者,勢也;鷙鳥之疾,至於毀折者,節也。是故善戰者,其勢險,其節短。勢如張弩,節如發機。 - -紛紛紜紜,鬥亂而不可亂也;渾渾沌沌,形圓而不可敗也。亂生於治,怯生於勇,弱生於強。治亂,數也;勇怯,勢也;強弱,形也。故善動敵者,形之,敵必從之;予之,敵必取之。以利動之,以卒待之。 - -故善戰者,求之於勢,不責於人;故能擇人而任勢。任勢者,其戰人也,如轉木石。木石之性,安則靜,危則動,方則止,圓則行。故善戰人之勢,如轉圓石於千仞之山者,勢也。 - -虛實第六 - -孫子曰:凡先處戰地而待敵者佚,後處戰地而趨戰者勞。 - -故善戰者,致人而不致於人。能使敵人自至者,利之也;能使敵人不得至者,害之也。故敵佚能勞之,飽能饑之,安能動之。出其所必趨,趨其所不意。行千里而不勞者,行於無人之地也;攻而必取者,攻其所不守也。守而必固者,守其所不攻也。 - -故善攻者,敵不知其所守;善守者,敵不知其所攻。微乎微乎,至於無形;神乎神乎,至於無聲,故能為敵之司命。進而不可禦者,沖其虛也;退而不可追者,速而不可及也。故我欲戰,敵雖高壘深溝,不得不與我戰者,攻其所必救也;我不欲戰,雖畫地而守之,敵不得與我戰者,乖其所之也。故形人而我無形,則我專而敵分。我專為一,敵分為十,是以十攻其一也。則我眾敵寡,能以眾擊寡者,則吾之所與戰者約矣。吾所與戰之地不可知,不可知則敵所備者多,敵所備者多,則吾所與戰者寡矣。故備前則後寡,備後則前寡,備左則右寡,備右則左寡,無所不備,則無所不寡。寡者,備人者也;眾者,使人備己者也。故知戰之地,知戰之日,則可千里而會戰;不知戰之地,不知戰日,則左不能救右,右不能救左,前不能救後,後不能救前,而況遠者數十裏,近者數裏乎!以吾度之,越人之兵雖多,亦奚益於勝哉!故曰:勝可為也。敵雖眾,可使無鬥。故策之而知得失之計,候之而知動靜之理,形之而知死生之地,角之而知有餘不足之處。故形兵之極,至於無形。無形則深間不能窺,智者不能謀。因形而措勝於眾,眾不能知。人皆知我所以勝之形,而莫知吾所以制勝之形。故其戰勝不復,而應形於無窮。夫兵形象水,水之行避高而趨下,兵之形避實而擊虛;水因地而制流,兵因敵而制勝。故兵無常勢,水無常形。能因敵變化而取勝者,謂之神。故五行無常勝,四時無常位,日有短長,月有死生。 - -軍爭第七 - -孫子曰: 凡用兵之法,將受命於君,合軍聚眾,交和而舍,莫難於軍爭。軍爭之難者,以迂為直,以患為利。故迂其途,而誘之以利,後人發,先人至,此知迂直之計者也。軍爭為利,軍爭為危。舉軍而爭利則不及,委軍而爭利則輜重捐。是故捲甲而趨,日夜不處,倍道兼行,百裡而爭利,則擒三將軍,勁者先,疲者後,其法十一而至;五十裏而爭利,則蹶上將軍,其法半至;三十裏而爭利,則三分之二至。是故軍無輜重則亡,無糧食則亡,無委積則亡。故不知諸侯之謀者,不能豫交;不知山林、險阻、沮澤之形者,不能行軍;不用鄉導者,不能得地利。故兵以詐立,以利動,以分和為變者也。故其疾如風,其徐如林,侵掠如火,不動如山,難知如陰,動如雷震。掠鄉分眾,廓地分利,懸權而動。先知迂直之計者勝,此軍爭之法也。《軍政》曰:“言不相聞,故為之金鼓;視不相見,故為之旌旗。”夫金鼓旌旗者,所以一民之耳目也。民既專一,則勇者不得獨進,怯者不得獨退,此用眾之法也。故夜戰多金鼓,晝戰多旌旗,所以變人之耳目也。三軍可奪氣,將軍可奪心。是故朝氣銳,晝氣惰,暮氣歸。善用兵者,避其銳氣,擊其惰歸,此治氣者也。以治待亂,以靜待嘩,此治心者也。以近待遠,以佚待勞,以飽待饑,此治力者也。無邀正正之旗,無擊堂堂之陳,此治變者也。故用兵之法,高陵勿向,背丘勿逆,佯北勿從,銳卒勿攻,餌兵勿食,歸師勿遏,圍師遺闕,窮寇勿迫,此用兵之法也。 - -九變第八 - -孫子曰: 凡用兵之法,將受命於君,合軍聚合。泛地無舍,衢地合交,絕地無留,圍地則謀,死地則戰,途有所不由,軍有所不擊,城有所不攻,地有所不爭,君命有所不受。故將通於九變之利者,知用兵矣;將不通九變之利,雖知地形,不能得地之利矣;治兵不知九變之術,雖知五利,不能得人之用矣。是故智者之慮,必雜於利害,雜於利而務可信也,雜於害而患可解也。是故屈諸侯者以害,役諸侯者以業,趨諸侯者以利。故用兵之法,無恃其不來,恃吾有以待之;無恃其不攻,恃吾有所不可攻也。故將有五危,必死可殺,必生可虜,忿速可侮,廉潔可辱,愛民可煩。凡此五者,將之過也,用兵之災也。覆軍殺將,必以五危,不可不察也。 - -行軍第九 - -孫子曰:凡處軍相敵,絕山依穀,視生處高,戰隆無登,此處山之軍也。絕水必遠水,客絕水而來,勿迎之於水內,令半渡而擊之利,欲戰者,無附於水而迎客,視生處高,無迎水流,此處水上之軍也。絕斥澤,唯亟去無留,若交軍於斥澤之中,必依水草而背眾樹,此處斥澤之軍也。平陸處易,右背高,前死後生,此處平陸之軍也。凡此四軍之利,黃帝之所以勝四帝也。凡軍好高而惡下,貴陽而賤陰,養生而處實,軍無百疾,是謂必勝。丘陵堤防,必處其陽而右背之,此兵之利,地之助也。上雨水流至,欲涉者,待其定也。凡地有絕澗、天井、天牢、天羅、天陷、天隙,必亟去之,勿近也。吾遠之,敵近之;吾迎之,敵背之。軍旁有險阻、潢井、蒹葭、小林、蘙薈者,必謹覆索之,此伏姦之所處也。敵近而靜者,恃其險也;遠而挑戰者,欲人之進也;其所居易者,利也;眾樹動者,來也;眾草多障者,疑也;鳥起者,伏也;獸駭者,覆也;塵高而銳者,車來也;卑而廣者,徒來也;散而條達者,樵採也;少而往來者,營軍也;辭卑而備者,進也;辭強而進驅者,退也;輕車先出居其側者,陳也;無約而請和者,謀也;奔走而陳兵者,期也;半進半退者,誘也;杖而立者,饑也;汲而先飲者,渴也;見利而不進者,勞也;鳥集者,虛也;夜呼者,恐也;軍擾者,將不重也;旌旗動者,亂也;吏怒者,倦也;殺馬肉食者,軍無糧也;懸甀不返其舍者,窮寇也;諄諄翕翕,徐與人言者,失眾也;數賞者,窘也;數罰者,困也;先暴而後畏其眾者,不精之至也;來委謝者,欲休息也。兵怒而相迎,久而不合,又不相去,必謹察之。兵非貴益多也,惟無武進,足以並力料敵取人而已。夫惟無慮而易敵者,必擒於人。卒未親而罰之,則不服,不服則難用。卒已親附而罰不行,則不可用。故合之以文,齊之以武,是謂必取。令素行以教其民,則民服;令素不行以教其民,則民不服。令素行者,與眾相得也。 - -地形第十 - -孫子曰:地形有通者、有掛者、有支者、有隘者、有險者、有遠者。我可以往,彼可以來,曰通。通形者,先居高陽,利糧道,以戰則利。可以往,難以返,曰掛。掛形者,敵無備,出而勝之,敵若有備,出而不勝,難以返,不利。我出而不利,彼出而不利,曰支。支形者,敵雖利我,我無出也,引而去之,令敵半出而擊之利。隘形者,我先居之,必盈之以待敵。若敵先居之,盈而勿從,不盈而從之。險形者,我先居之,必居高陽以待敵;若敵先居之,引而去之,勿從也。遠形者,勢均難以挑戰,戰而不利。凡此六者,地之道也,將之至任,不可不察也。凡兵有走者、有馳者、有陷者、有崩者、有亂者、有北者。凡此六者,非天地之災,將之過也。夫勢均,以一擊十,曰走;卒強吏弱,曰馳;吏強卒弱,曰陷;大吏怒而不服,遇敵懟而自戰,將不知其能,曰崩;將弱不嚴,教道不明,吏卒無常,陳兵縱橫,曰亂;將不能料敵,以少合眾,以弱擊強,兵無選鋒,曰北。凡此六者,敗之道也,將之至任,不可不察也。夫地形者,兵之助也。料敵制勝,計險隘遠近,上將之道也。知此而用戰者必勝,不知此而用戰者必敗。故戰道必勝,主曰無戰,必戰可也;戰道不勝,主曰必戰,無戰可也。故進不求名,退不避罪,唯民是保,而利於主,國之寶也。視卒如嬰兒,故可以與之赴深溪;視卒如愛子,故可與之俱死。厚而不能使,愛而不能令,亂而不能治,譬若驕子,不可用也。知吾卒之可以擊,而不知敵之不可擊,勝之半也;知敵之可擊,而不知吾卒之不可以擊,勝之半也;知敵之可擊,知吾卒之可以擊,而不知地形之不可以戰,勝之半也。故知兵者,動而不迷,舉而不窮。故曰:知彼知己,勝乃不殆;知天知地,勝乃可全。 - -九地第十一 - -孫子曰:用兵之法,有散地,有輕地,有爭地,有交地,有衢地,有重地,有泛地,有圍地,有死地。諸侯自戰其地者,為散地;入人之地不深者,為輕地;我得亦利,彼得亦利者,為爭地;我可以往,彼可以來者,為交地;諸侯之地三屬,先至而得天下眾者,為衢地;入人之地深,背城邑多者,為重地;山林、險阻、沮澤,凡難行之道者,為泛地;所由入者隘,所從歸者迂,彼寡可以擊吾之眾者,為圍地;疾戰則存,不疾戰則亡者,為死地。是故散地則無戰,輕地則無止,爭地則無攻,交地則無絕,衢地則合交,重地則掠,泛地則行,圍地則謀,死地則戰。古之善用兵者,能使敵人前後不相及,眾寡不相恃,貴賤不相救,上下不相收,卒離而不集,兵合而不齊。合於利而動,不合於利而止。敢問敵眾而整將來,待之若何曰:先奪其所愛則聽矣。兵之情主速,乘人之不及。由不虞之道,攻其所不戒也。凡為客之道,深入則專。主人不克,掠於饒野,三軍足食。謹養而勿勞,並氣積力,運兵計謀,為不可測。投之無所往,死且不北。死焉不得,士人盡力。兵士甚陷則不懼,無所往則固,深入則拘,不得已則鬥。是故其兵不修而戒,不求而得,不約而親,不令而信,禁祥去疑,至死無所之。吾士無餘財,非惡貨也;無餘命,非惡壽也。令發之日,士卒坐者涕沾襟,偃臥者涕交頤,投之無所往,諸、劌之勇也。故善用兵者,譬如率然。率然者,常山之蛇也。擊其首則尾至,擊其尾則首至,擊其中則首尾俱至。敢問兵可使如率然乎?曰可。夫吳人與越人相惡也,當其同舟而濟而遇風,其相救也如左右手。是故方馬埋輪,未足恃也;齊勇如一,政之道也;剛柔皆得,地之理也。故善用兵者,攜手若使一人,不得已也。將軍之事,靜以幽,正以治,能愚士卒之耳目,使之無知;易其事,革其謀,使人無識;易其居,迂其途,使民不得慮。帥與之期,如登高而去其梯;帥與之深入諸侯之地,而發其機。若驅群羊,驅而往,驅而來,莫知所之。聚三軍之眾,投之於險,此謂將軍之事也。九地之變,屈伸之力,人情之理,不可不察也。凡為客之道,深則專,淺則散。去國越境而師者,絕地也;四徹者,衢地也;入深者,重地也;入淺者,輕地也;背固前隘者,圍地也;無所往者,死地也。是故散地吾將一其志,輕地吾將使之屬,爭地吾將趨其後,交地吾將謹其守,交地吾將固其結,衢地吾將謹其恃,重地吾將繼其食,泛地吾將進其途,圍地吾將塞其闕,死地吾將示之以不活。故兵之情:圍則禦,不得已則鬥,過則從。是故不知諸侯之謀者,不能預交;不知山林、險阻、沮澤之形者,不能行軍;不用鄉導,不能得地利。四五者,一不知,非霸王之兵也。夫霸王之兵,伐大國,則其眾不得聚;威加於敵,則其交不得合。是故不爭天下之交,不養天下之權,信己之私,威加於敵,則其城可拔,其國可隳。施無法之賞,懸無政之令。犯三軍之眾,若使一人。犯之以事,勿告以言;犯之以害,勿告以利。投之亡地然後存,陷之死地然後生。夫眾陷於害,然後能為勝敗。故為兵之事,在順詳敵之意,並敵一向,千里殺將,是謂巧能成事。是故政舉之日,夷關折符,無通其使,厲於廊廟之上,以誅其事。敵人開闔,必亟入之,先其所愛,微與之期,踐墨隨敵,以決戰事。是故始如處女,敵人開戶;後如脫兔,敵不及拒。 - -火攻第十二 - -孫子曰:凡火攻有五:一曰火人,二曰火積,三曰火輜,四曰火庫,五曰火隊。行火必有因,因必素具。發火有時,起火有日。時者,天之燥也。日者,月在箕、壁、翼、軫也。凡此四宿者,風起之日也。凡火攻,必因五火之變而應之:火發於內,則早應之於外;火發而其兵靜者,待而勿攻,極其火力,可從而從之,不可從則上。火可發於外,無待於內,以時發之,火發上風,無攻下風,晝風久,夜風止。凡軍必知五火之變,以數守之。故以火佐攻者明,以水佐攻者強。水可以絕,不可以奪。夫戰勝攻取而不惰其功者凶,命曰“費留”。故曰:明主慮之,良將惰之,非利不動,非得不用,非危不戰。主不可以怒而興師,將不可以慍而攻戰。合於利而動,不合於利而上。怒可以複喜,慍可以複說,亡國不可以複存,死者不可以複生。故明主慎之,良將警之。此安國全軍之道也。 - -用間第十三 - -孫子曰: 凡興師十萬,出征千里,百姓之費,公家之奉,日費千金,內外騷動,怠於道路,不得操事者,七十萬家。相守數年,以爭一日之勝,而愛爵祿百金,不知敵之情者,不仁之至也,非民之將也,非主之佐也,非勝之主也。故明君賢將所以動而勝人,成功出於眾者,先知也。先知者,不可取於鬼神,不可象於事,不可驗於度,必取於人,知敵之情者也。故用間有五:有因間,有內間,有反間,有死間,有生間。五間俱起,莫知其道,是謂神紀,人君之寶也。鄉間者,因其鄉人而用之;內間者,因其官人而用之;反間者,因其敵間而用之;死間者,為誑事於外,令吾聞知之而傳於敵間也;生間者,反報也。故三軍之事,莫親於間,賞莫厚於間,事莫密於間,非聖賢不能用間,非仁義不能使間,非微妙不能得間之實。微哉微哉!無所不用間也。間事未發而先聞者,間與所告者兼死。凡軍之所欲擊,城之所欲攻,人之所欲殺,必先知其守將、左右、謁者、門者、舍人之姓名,令吾間必索知之。敵間之來間我者,因而利之,導而舍之,故反間可得而用也;因是而知之,故鄉間、內間可得而使也;因是而知之,故死間為誑事,可使告敵;因是而知之,故生間可使如期。五間之事,主必知之,知之必在於反間,故反間不可不厚也。昔殷之興也,伊摯在夏;周之興也,呂牙在殷。故明君賢將,能以上智為間者,必成大功。此兵之要,三軍之所恃而動也。 diff --git a/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-euc-kr.txt b/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-euc-kr.txt deleted file mode 100644 index c9ba04c4c..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-euc-kr.txt +++ /dev/null @@ -1,175 +0,0 @@ -This file was derived from -http://www.ibrary.co.kr/index.php/book-list/short-stories/34-short-stories-korean/150-2008-04-20-13-22-32 --------- -[Ұ] - ̷ ΰ ϰ Ѵ. 츮 ִ ̶ 巯 . ϱ ̷ , ¦ 츮 ķ ̷ 츮 տ 𸥴. յ 鿡Դ ڽ ü ٽ δٴ ׷ ⵵ ִ... - -ٽ о . Ĺ ô Ͽ , . 21⸦ 츮鿡 ׷ ƿ ο ó ̴. ׷ ׷? ̷ 𸣰 ְ, ƴ ̴. 쿬 ̴. Ƴ ڴϴ ÷ ... Ƣ ڰ, ׷ ִ. - -[۰ Ұ] - (, 1900-1943) : Ҽ. ѱ Ҽ Ʋ ۰̴. (). ȣ (޻). 1920 ݱ⿡ Ұ üҼ <ó> < ϴ ȸ>, () ٷ <B簨 극> < > 1920 ߹ Ŀ <ǾƳ> <> <> <> ¿ ɰ Ĺ Ȳ ν ε巯 ǰ ǥߴ. < > ̷ 迭 ϴ ǰ̴. 1930 Ŀ ǽİ а ٰ Ҽ ߽ <ž> <ġ()> <ȭ> Ҽ ǥߴ. - -ħϰ 帰 ǰ ϴ ƴ ٰ . - -̳̾߸ ҹ ȿ η°Ų 븩 ϴ ÷Դ ģ ̾. ȿ(ű⵵ ƴ) ô Ŵ 帰 ࿩ մ ϰ 忡 ϸ ϳϳ ִٰ ħ 纹̸ б() ¿ ֱ Ǿ. - -ù , ° - ħ ٶ ׸ ġ ̾. ׾߸ Ⱥپ 浵 ÷ ¥ ȭ Ǭ, Ǵ ټ Ǭ ϰ չٴڿ 긱 ŭ ⻼. ̳ ̶ Ƚ ̶ ׿ 󸶳 . ܵ ְŴϿ ׺ٵ δ Ƴ ׸ ̴. - - Ƴ ħ 𷰰Ÿ Ѿ. 䵵 ⸦ Դٽ ϴ ̴ ø . ¿ ٵ ƴϷε ״ ̶ 𿡰 ־ ̸ ٿ ڲ ´ٴ ڱ () Ͽ. ǻ翡 ݵ , Ͼ ε ° . ̴뵵 ԰ ü ̴. - -׶ ÷  ǿ ¥ ־ ÷ ϸ õ(۰) . ϰ ұ ʾ ä ΰ Ѽ ָԵ Ȥ Ұ ó ϴϸ ׳ , 谡 бٰ ȩ߰ Ͽ. ׶ ÷ ȭ , - -, , պ , Ծ , Ծ , ¼ ̾! ٷ !ϰ ÷ δ ķ. ȩ ٷǸ ̽ . ÷ ÿﵵ ߲߲Ͽ. - - ȯڰ ׷ Դ ʾҴ. ð ʹٰ . - -̷ ! 䵵 Դ , ó԰ ϰ., ߴ ĺҰǸ, ִ ÿġ ʾҴ. - - ִ. δ 翡 ä ( ) ִ. - Ƚ տ ÷ ǬǬϿ. ׷ װɷ ġ ʾҴ. 帣 ̸ ⸧ָӴϰ ָ , б Ƴ . ڿ <η°!> ϰ θ Ҹ . ڱ⸦ ҷ б л ÷ ־. л ¥¥, 빮 󸶿?, . - -Ƹ б 翡 ִ ̷ ̿Ͽ Ϸ ̸. ϿǸ , ְ ؼ 𸣴ٰ ħ ÷ پ̸. ׷ θ ä ؼ , <> 纹ϸ ̷ ÷ Ѿ . - -빮 Դϱ.ϰ ÷ Ͽ. ״ ߿ 嵵 öŸ Ⱑ Ⱦϱ? ó , ° ׸ Ͽϱ? ƴϴ, ƴϴ. ̻ϰԵ ¹ տ ̴.׸ Ƴ Ź б. - ׼ θ 󱼿 ޸ ũ ְϴ , ƿ. п پ־. ̷ µ, Ҹ ߾Ÿ ɱ׷ɱ׷ Ͽ. - -׶ ÷ , д, , Ҹ ϳ. ºٵ ɾ Կ 츱 ˾.ϰ, ½ پϱ ȯڴ , ׷, ׷ Ϳ.ϰ, Ҹ ڸ . - - , ޸ ŭ , Ƴ ÷ տ Ͽ. ׷ 빮 󸶶 ̿?ϰ л η°Ų ٶ󺸸 ȥ㸻, õ ְ, ̵簡., ߾Ÿ. - - ݽÿ. ̿ Ҿ ÷ Կ . θ û ׼ . Ѳ ̷ ݾ ҷ 󸶸ΰ! ׷ Ⱑ ڿ 縣 Ҵ.  ;. ִ ģ ͺٵ ĥ Ͽ. - - ʹ ѵ. ̷ ϸ л Ͽ. - -ƴϿýô. ռ ġ ⼭ űⰡ ÿ Ѵ´ϴ. ̷ ּž.ϰ ۺ 󱼿 귶. - -׷ ޶ ̴ .  մ ׷ ʵ ԰ ìⷯ . - - л ¿ ÷ ٸ ̻ϰ ŻϿ. ѴٴϺ Ͽ.  ٴϺ ġ ij <Ʈ> ̲ Ͽ. ̲⵵ Ͽ. - - ٸ ſ. ڱ ٴٸ ̴. コ . < ƿ. ̷ µ!> ̷ Ϳ ȴ. ׸  ϴ ڱ⸦ 븮 Ͽ. ׷ ϰ  ʹ. ϰ Ҹ ʹ. ̸, ġڱ.ϰ ź θ¢ Ϳ Դ. ÷ η°Ÿ ä Ѻǿ . - -, .ϰ, ÷ Ǵٽ Ͽ. ־ ÷ ٽñ Ͽ. ٸ ߸ ڱ Ӹ ٽɰ . - - ְ ¦ տ 翡, Ǵ ¾ ܰŸ ƴϰ, Դ. γ ⻼. ڽ ۿ ȵǴ  մԿ 㸮 , ȳ ٳɽÿ. ƴ. - -׷ η°Ÿ аŸ ߿ ư ޹̾. 뵿 Ͽ 帥 ľ ָ âڿ, 帣 ʿ  ѱⰡ ھƳ ϸ ̶ 󸶳 ο . ߱ ϳ . ¸ ˼۱׷ ڸ Ͼ Ҵ. - - ! η°Ÿ аŸ Ƹ . ̷ , ҹ̸ ! - -״ ȱ ̳ ϴ ԰ɰŷȴ. ׷ Ӹ ο Ƴ װ <̷ ƴ϶ ó ⸦ ٸ մ ¿ ɴ > ̾. ϰԵ ϱ ׷ ѹ Ϸ. ڱ⸦ ٸ ִٰ ⸦ ص Ǿ. ׷ٰ η°Ų տ . - -׷ ״ غ ̶ ٷ 忡 , ٴϴ ƴ η°Ÿ ڱ ó ϱ Ͽ. 󸶸 ԰, ̳ Ǵ Դ. ߿ մ ϴ ÷ Ӹ θ Ű <> θ , л . ״ ٽ ٰ. - -ƾ, η° ƴ Ÿöÿ? - - л ſ Ȱ Լ ٹ ä ÷ ŵ鶰 ʾҴ. ÷ ϴ ؿ Ǹ, ƾ, ֵ麸 ΰ Ŵ 帮ϴ. Ű.ϰ, ߱߱ϰԵ ִ Ϻ ¦ . - - ̷, ġʰ. Ҹ ° Ƽ. ÷ ÿ ϰ . - - Դ. ÷ Ÿ ̸ 븮 ־. ׷ () Ʋ ʾҴ. ϰ ư ̱ Ͽ Ÿ ϳ ־. ϰ ū ִ° Ƹ պ ȿ ũ Ͽ 忡 з ġ. ÷ . - -η°Ÿ Ÿöÿ. - -ѵ °̸ ϴٰ λ絿 ¿ֱ Ͽ. η°Ű ſ ̻ϰԵ ׸ η°Ű ٽñ ſǸ ̹ ´. ڲ տ Ÿ ٶ . ̳ ٸ ¢ ٴ ۿ . - - η°ű ذ , ϸŭ ȲϿ. 帮 ϴ ħħϰ Ȳȥ ϴ. â ձ ٴ޾Ƽ ״ ο Ҵ. Ϳü ϰ ׷. ׷ ׷ Ƚɿ ƴϿ, ڱ⸦ ģ ƴ ˰ ڵ ηϴ ̴. - -״ ࿡ ٴġ ð ̶ ø ŷȴ. () ̸ Ͽٴ ϰ ;. ״ θθ Ǿ. ġ ڱ - ϰ ޷ ٸ δ ٰ, ٰ ϴ Ͽ. - -׷ ħ 氡 ģ ġ̰ ´. ۿ 󱼿 ȫ , ΰ Ŀݰ Ŵ, 븣 ¦ а, ִ ιؿ ġ ̸ Ųٷ ٿ ÷ dzäϰ ־. - - ÷, ڳ  ϼ׷. ״ . - -׶׺ ̸ ÿ θ¢. Ҹ ϰ ϽϿ. ÷ ģ  ݰ . ڱ⸦ ̳ ⵵ Ͽ. - -ڳ״ ϼ׷. ڳ׵ ̰ ƺ.ϰ, ÷ 켭 . - -д, ٰ . ׷ , ڳ ޸ ° ?  ̸ . - - ϰ ߶Ͽ. ߾ ̴ ܶѲ Թ , 迡 ʺƴ ̸ ̸ ̸ ̸ Ͼ 붱 ϰ þ Źڿ ÷ ڱ ߵ . ̸ ű ִ ̸ ׸ ѵ ÿġ ʾҴ. ϵ ̴ з 붱 ̱⵵ ϰ ߾ ׸ ûϿ. - -ָ âڴ ĸ ڲڲ ̶̶ Ͽ. İ κο ̲ٸ ׸ ׳ Ű Ҵ. ° ׸ ޾Ƶ . ġ̿ ̶ ϰ âڿ ȭϿ. ̴. - - ÷ Ǯ Ͽ. 迡  ҷŸ ξ Ͽ. - -ġ Ǿ ÷ , ״ٴ, 츮 ܾ Ծ, ϼ. ǽ״. - -Ƶ ̳, ׸ ϳ. . Ҵ. - -׷ 󸶸 ΰ? - - , ! ̷ Ⱥξ , Ծ . ̰ µ. - -, ߱, ׸μ. - -̳, ̰ ԰ ,  Ծ.ϰ ġ ͸ ä ̴ θ¢. ׸ ״ ټ ߴ밡Է ޷, ̳, , ʾ. ߴ ƴ. ߴ밡 ġ ϴ Ͽ. ġ ˾ƺ ȭ , ̸ , ̳ ˰.ڸ 㸮 ĩĩ ϴ ¥ ߴ밡 տ ½ . ǰ Ǭ ߱׶ ϸ . - - , . ̷ ϸ Ϻ ݴ´. ÷ ߿ ó Ǵ ũ ٺٰ ҽÿ ϴ ʹ ٴ ҽġ , ! , , ٸٱ .ϰ ġ ִֿ ޾, ! ø !ϸ鼭, Ǯ ģ. ¾ ٽ ̴ Ǭ Ÿ ´´ٴ ¸ϰ . - - ξ ܸ Ҵ. ÷ Լ Ƶ̰ ſ ٵ, ξ, ξ., ƴ. - - ԰ ÷ ġ ġ ´. Ҹ  Ǵ ִ ÷Է . ̴ , ġ, 콺 ̾߱ ϳ ұ. ° 忡 ʾҰڳ. - -׷. - -ٰ Ⱑ Ƶ׷. ׷ 忡 ϸ մ ϳ ¿ ø ʾҳ. ű ħ ̽ л̽ - ٴϿ ư ִ - <> θ ° ְ. ٽ η° Ÿöÿ ϰ հ ϱ Ź Ѹġ ȴ Ƽϸ < ̷ !> Ҹ߸ Ҳ Ҹ, ! - - ÷ ϰԵ Ҳ Ҹ . Ͻÿ . - - , ¼, < !> ̱ Ҹ óŵ , . - - Ҹ . ׷ Ҹ ÷ ½½ Ͽ. - -ġ ̾ ̸ ٶ󺸸, ݹ ϴ ΰ. - - ÷ ڸ 鿩ø, 츮 ׾ٳ. - -, ״ٴ, ? - -̳ . . - - ģ , . - - , ׾, ... ü ij Դٴ, ̾, ̾.ϰ ÷ Ҹ . - -ġ 󱼷, , ϳ ϳ. ׷ , .ϰ ƴ. - -ġ Ѹġ ÷ ۽۽ ̱׷ ´. - -ױ ׾.ϰ ǰ . - -ױ ׾, Ƹ ִܴ. . ӾҴ.ϰ  ջ ġ ´. - - ƴ ΰ. ָճװ δ´ µ.ϰ, ġ̵ Ҿ ÷ ư Ͽ. - - ׾, ׾뵵׷. - - ÷ ȱ Ȯְ Ҹ Ҹ ־ ־. ġ ä ܾ ԰ Դ. ǿ . - - ÷ ߿ 簡 ٴ޾Ҵ. ̶ ص ̿, ü ƴ϶ Ȱ Ҷ ε ޿ ̴. ÷ ֱ⸦ ʾҴ 빮 鿩 װ ϴ ù () - dz찡 ٴ ٸ . - -Ÿ ħ Ҹ . ׸Ÿ Ҹ . ٸ ħ ߸ - ߸ٴϺ ħ ϰ ұϰ ϴ ϴ Ҹ,  Ҹ ̴. û() Ҹ ̿, ܶܶ ϰ Ѿ Ҹ ٴ ͵ Ҵ 𸣸. - -Ȥ ÷ ұ ħ ߴ 𸥴. ׷ 빮 ڸ , , µ ͺ ʾ, .̶ ģ ϴ. ̾߸ ؿ ù Ѿƹ 强() ̴. - -Ͽ ÷ 湮 Ĭ . ϴ ߱ - ڸ ؿ , Ϳ ˳ ܳ, ʳ, ߱Ⱑ ÷ ڸ 񷶴. - -ȿ  ѱ ̵ û ִ ȣ ƴ. - -̷ , ־õ() ̾! ͵ Ͼ . Ҹ Բ ߱ ٸ á. ׷ ߱濡 ä̴ ƴϰ ɰ ־. ̶ Ҹ Ҹ Ͽ. ̰ . 뵵 ׷ ٿ, ٴ ǥ ̴. Ҹ Կ ƴϰ ġ ӿ Ͽ. ٰ ٰ . - -߷ Ƴ Ӹ ޷ ׾߸ ġ ȯ Ӹ , , , ! پ, ! - - - -, ̰ , ƹ . - - -̳, ׾ ̳, . - - - -. , ׾. - -̷ٰ â , ġ ˾ƺڸ, ! ! ٶ ϰ õ , .ϴ ޾. ׷ þ. ÷ ĥ 󱼿 ߾ŷȴ. - - ٳҴµ ϴ, ϴ... ϰԵ ! ϸ... diff --git a/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-utf-8.txt deleted file mode 100644 index e10a3d46b..000000000 --- a/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-utf-8.txt +++ /dev/null @@ -1,175 +0,0 @@ -This file was derived from -http://www.ibrary.co.kr/index.php/book-list/short-stories/34-short-stories-korean/150-2008-04-20-13-22-32 --------- -[소개] -잔인한 운명은 이렇게 인간을 조롱하곤 한다. 우리가 평소 마음 속 저 깊은 곳에 움켜쥐고 있던 자존심 따위는 어느 한 순간 전혀 무용지물이란 것이 드러나고 만다. 하기야 이렇게 삶의 한 순간, 눈 깜짝할 새에 우리를 후려 갈기고 지나가는 그 진실이 미래의 어느날에는 또 남김없이 우리 눈 앞에 펼쳐질지도 모른다. 죽음을 앞둔 사람들에게는 자신의 삶 전체가 한 순간에 다시 보인다는 그런 얘기도 있던데... - -다시 읽어보니 끔찍한 생각도 든다. 식민지 시대의 암울한 삶, 그 끈끈한 냄새를 피할 수 없다. 21세기를 사는 우리들에겐 그런 냄새는 아예 인연이 없는 것처럼 느껴질 수도 있을 것이다. 그러나 과연 그럴까? 이런 냄새를 모르고 평생 사는 사람도 있겠지만, 전혀 관련이 없는 것은 아닐 것이다. 그저 우연일 뿐이다. 아내를 박대하는 김 첨지의 모습... 요새 같으면 간이 배 밖으로 튀어나온 남자겠지만, 그래도 그 애정은 더 진한 것일 수도 있다. - -[작가 소개] -현 진 건(玄鎭健, 1900-1943) : 소설가. 한국 사실주의 단편소설의 기틀을 다진 작가이다. 본관은 연주(延州). 아호는 빙허(憑虛). 1920년대 전반기에는 자전적 요소가 강한 개인적 체험소설인 <빈처> <술 권하는 사회>, 성(性)의 문제와 애정문제를 다룬 <B사감과 러브레터> <새빨간 웃음> 등이 있으며 1920년대 중반 이후에는 <피아노> <우편국에서> <불> <고향> 등 세태에의 관심과 식민지 상황하의 현실인식이 두드러진 작품을 많이 발표했다. <운수 좋은 날>도 이러한 계열에 속하는 작품이다. 1930년대 이후에는 역사의식과 예언주의적 문학관에 근거한 역사소설 중심의 <무영탑> <흑치상지(黑齒常之)> <선화공주> 등 장편소설을 발표했다. - -새침하게 흐린 품이 눈이 올 듯하더니 눈은 아니 오고 얼다가 만 비가 추적추적 내리었다. - -이날이야말로 동소문 안에서 인력거꾼 노릇을 하는 김 첨지에게는 오래간만에도 닥친 운수 좋은 날이었다. 문안에(거기도 문밖은 아니지만) 들어간답시는 앞집 마나님을 전찻길까지 모셔다 드린 것을 비롯으로 행여나 손님이 있을까 하고 정류장에서 어정어정하며 내리는 사람 하나하나에게 거의 비는 듯한 눈결을 보내고 있다가 마침내 교원인 듯한 양복장이를 동광학교(東光學校)까지 태워다 주기로 되었다. - -첫번에 삼십 전, 둘째 번에 오십 전 - 아침 댓바람에 그리 흔치 않은 일이었다. 그야말로 재수가 옴붙어서 근 열흘 동안 돈 구경도 못한 김 첨지는 십 전짜리 백통화 서 푼, 또는 다섯 푼이 찰깍하고 손바닥에 떨어질 제 거의 눈물을 흘릴 만큼 기뻤었다. 더구나 이날 이때에 이 팔십 전이라는 돈이 그에게 얼마나 유용한지 몰랐다. 컬컬한 목에 모주 한 잔도 적실 수 있거니와 그보다도 앓는 아내에게 설렁탕 한 그릇도 사다줄 수 있음이다. - -그의 아내가 기침으로 쿨럭거리기는 벌써 달포가 넘었다. 조밥도 굶기를 먹다시피 하는 형편이니 물론 약 한 첩 써 본 일이 없다. 구태여 쓰려면 못 쓸 바도 아니로되 그는 병이란 놈에게 약을 주어 보내면 재미를 붙여서 자꾸 온다는 자기의 신조(信條)에 어디까지 충실하였다. 따라서 의사에게 보인 적이 없으니 무슨 병인지는 알 수 없으되 반듯이 누워 가지고, 일어나기는 새로 모로도 못 눕는걸 보면 중증은 중증인 듯. 병이 이대도록 심해지기는 열흘 전에 조밥을 먹고 체한 때문이다. - -그때도 김 첨지가 오래간만에 돈을 얻어서 좁쌀 한 되와 십 전짜리 나무 한 단을 사다 주었더니 김 첨지의 말에 의지하면 그 오라질 년이 천방지축(天方地軸)으로 남비에 대고 끓였다. 마음은 급하고 불길은 달지 않아 채 익지도 않은 것을 그 오라질 년이 숟가락은 고만두고 손으로 움켜서 두 뺨에 주먹덩이 같은 혹이 불거지도록 누가 빼앗을 듯이 처박질 하더니만 그날 저녁부터 가슴이 땅긴다, 배가 켕긴다고 눈을 홉뜨고 지랄병을 하였다. 그때 김 첨지는 열화와 같이 성을 내며, - -“에이, 오라질 년, 조롱복은 할 수가 없어, 못 먹어 병, 먹어서 병, 어쩌란 말이야! 왜 눈을 바루 뜨지 못해!”하고 김 첨지는 앓는 이의 뺨을 한 번 후려갈겼다. 홉뜬 눈은 조금 바루어졌건만 이슬이 맺히었다. 김 첨지의 눈시울도 뜨끈뜨끈하였다. - -이 환자가 그러고도 먹는 데는 물리지 않았다. 사흘 전부터 설렁탕 국물이 마시고 싶다고 남편을 졸랐다. - -“이런 오라질 년! 조밥도 못 먹는 년이 설렁탕은, 또 처먹고 지랄병을 하게.”라고, 야단을 쳐보았건만, 못 사주는 마음이 시원치는 않았다. - -인제 설렁탕을 사줄 수도 있다. 앓는 어미 곁에서 배고파 보채는 개똥이(세 살먹이)에게 죽을 사줄 수도 있다. - 팔십 전을 손에 쥔 김 첨지의 마음은 푼푼하였다. 그러나 그의 행운은 그걸로 그치지 않았다. 땀과 빗물이 섞여 흐르는 목덜미를 기름주머니가 다 된 왜목 수건으로 닦으며, 그 학교 문을 돌아나올 때였다. 뒤에서 <인력거!> 하고 부르는 소리가 난다. 자기를 불러 멈춘 사람이 그 학교 학생인 줄 김 첨지는 한 번 보고 짐작할 수 있었다. 그 학생은 다짜고짜로, “남대문 정거장까지 얼마요?”라고, 물었다. - -아마도 그 학교 기숙사에 있는 이로 동기방학을 이용하여 귀향하려 함이리라. 오늘 가기로 작정은 하였건만 비는 오고, 짐은 있고 해서 어찌할 줄 모르다가 마침 김 첨지를 보고 뛰어나왔음이리라. 그렇지 않으면 왜 구두를 채 신지 못해서 질질 끌고, 비록 <고구라> 양복일망정 노박이로 비를 맞으며 김첨지를 뒤쫓아 나왔으랴. - -“남대문 정거장까지 말씀입니까.”하고 김 첨지는 잠깐 주저하였다. 그는 이 우중에 우장도 없이 그 먼 곳을 철벅거리고 가기가 싫었음일까? 처음 것, 둘째 것으로 그만 만족하였음일까? 아니다, 결코 아니다. 이상하게도 꼬리를 맞물고 덤비는 이 행운 앞에 조금 겁이 났음이다.그리고 집을 나올 제 아내의 부탁이 마음에 켕기었다. - 앞집 마나님한테서 부르러 왔을 제 병인은 그 뼈만 남은 얼굴에 유일의 생물 같은 유달리 크고 움폭한 눈에 애걸하는 빛을 띠우며, “오늘은 나가지 말아요. 제발 덕분에 집에 붙어있어요. 내가 이렇게 아픈데……”라고, 모기 소리같이 중얼거리고 숨을 걸그렁걸그렁 하였다. - -그때에 김 첨지는 대수롭지 않은 듯이, “압다, 젠장맞을 년, 별 빌어먹을 소리를 다 하네. 맞붙들고 앉았으면 누가 먹여 살릴 줄 알아.”하고, 훌쩍 뛰어나오려니까 환자는 붙잡을 듯이 팔을 내저으며, “나가지 말라도 그래, 그러면 일찌기 들어와요.”하고, 목메인 소리가 뒤를 따랐다. - -정거장까지 가잔 말을 들은 순간에 경련적으로 떠는 손, 유달리 큼직한 눈, 울 듯한 아내의 얼굴이 김 첨지의 눈앞에 어른어른하였다. “그래 남대문 정거장까지 얼마란 말이요?”하고 학생은 초조한 듯이 인력거꾼의 얼굴을 바라보며 혼잣말같이, “인천 차가 열 한 점에 있고, 그 다음에는 새로 두 점이든가.”라고, 중얼거린다. - -“일 원 오십 전만 줍시요.” 이 말이 저도 모를 사이에 불쑥 김 첨지의 입에서 떨어졌다. 제 입으로 부르고도 스스로 그 엄청난 돈 액수에 놀래었다. 한꺼번에 이런 금액을 불러라도 본 지가 그 얼마만인가! 그러자 그 돈 벌 용기가 병자에 대한 염려를 사르고 말았다. 설마 오늘 내로 어떠랴 싶었다. 무슨 일이 있더라도 제일 제이의 행운을 곱친 것보다도 오히려 갑절이 많은 이 행운을 놓칠 수 없다 하였다. - -“일 원 오십 전은 너무 과한데.” 이런 말을 하며 학생은 고개를 기웃하였다. - -“아니올시다. 잇수로 치면 여기서 거기가 시오리가 넘는답니다. 또 이런 진 날에 좀더 주셔야지요.”하고 빙글빙글 웃는 차부의 얼굴에는 숨길 수 없는 기쁨이 넘쳐 흘렀다. - -“그러면 달라는 대로 줄 터이니 빨리 가요.” 관대한 어린 손님은 그런 말을 남기고 총총히 옷도 입고 짐도 챙기러 갈 데로 갔다. - -그 학생을 태우고 나선 김 첨지의 다리는 이상하게 거뿐하였다. 달음질을 한다느니보다 거의 나는 듯하였다. 바퀴도 어떻게 속히 도는지 군다느니보다 마치 얼음을 지쳐나가는 <스케이트> 모양으로 미끄러져 가는 듯하였다. 얼은 땅에 비가 내려 미끄럽기도 하였지만. - -이윽고 끄는 이의 다리는 무거워졌다. 자기 집 가까이 다다른 까닭이다. 새삼스러운 염려가 그의 가슴을 눌렀다. <오늘은 나가지 말아요. 내가 이렇게 아픈데!> 이런 말이 잉잉 그의 귀에 울렸다. 그리고 병자의 움쑥 들어간 눈이 원망하는 듯이 자기를 노리는 듯하였다. 그러자 엉엉하고 우는 개똥이의 곡성을 들은 듯싶다. 딸국딸국 하고 숨 모으는 소리도 나는 듯싶다.“왜 이리우, 기차 놓치겠구먼.”하고 탄 이의 초조한 부르짖음이 간신히 그의 귀에 들어왔다. 언뜻 깨달으니 김 첨지는 인력거를 쥔 채 길 한복판에 엉거주춤 멈춰있지 않은가. - -“예, 예.”하고, 김 첨지는 또다시 달음질하였다. 집이 차차 멀어갈수록 김 첨지의 걸음에는 다시금 신이 나기 시작하였다. 다리를 재게 놀려야만 쉴새없이 자기의 머리에 떠오르는 모든 근심과 걱정을 잊을 듯이. - -정거장까지 끌어다주고 그 깜짝 놀란 일 원 오십 전을 정말 제 손에 쥠에, 제 말마따나 십 리나 되는 길을 비를 맞아 가며 질퍽거리고 온 생각은 아니하고, 거저나 얻은 듯이 고마왔다. 졸부나 된 듯이 기뻤다. 제자식 뻘밖에 안되는 어린 손님에게 몇 번 허리를 굽히며, “안녕히 다녀옵시요.”라고 깍듯이 재우쳤다. - -그러나 빈 인력거를 털털거리며 이 우중에 돌아갈 일이 꿈밖이었다. 노동으로 하여 흐른 땀이 식어지자 굶주린 창자에서, 물 흐르는 옷에서 어슬어슬 한기가 솟아나기 비롯하매 일 원 오십 전이란 돈이 얼마나 괜찮고 괴로운 것인 줄 절절히 느끼었다. 정거장을 떠나는 그의 발길은 힘 하나 없었다. 온몸이 옹송그려지며 당장 그 자리에 엎어져 못 일어날 것 같았다. - -“젠장맞을 것! 이 비를 맞으며 빈 인력거를 털털거리고 돌아를 간담. 이런 빌어먹을, 제 할미를 붙을 비가 왜 남의 상판을 딱딱 때려!” - -그는 몹시 홧증을 내며 누구에게 반항이나 하는 듯이 게걸거렸다. 그럴 즈음에 그의 머리엔 또 새로운 광명이 비쳤나니 그것은 <이러구 갈 게 아니라 이 근처를 빙빙 돌며 차 오기를 기다리면 또 손님을 태우게 될는지도 몰라>란 생각이었다. 오늘 운수가 괴상하게도 좋으니까 그런 요행이 또한번 없으리라고 누가 보증하랴. 꼬리를 굴리는 행운이 꼭 자기를 기다리고 있다고 내기를 해도 좋을 만한 믿음을 얻게 되었다. 그렇다고 정거장 인력거꾼의 등살이 무서우니 정거장 앞에 섰을 수는 없었다. - -그래 그는 이전에도 여러 번 해본 일이라 바로 정거장 앞 전차 정류장에서 조금 떨어지게, 사람 다니는 길과 전찻길 틈에 인력거를 세워놓고 자기는 그 근처를 빙빙 돌며 형세를 관망하기로 하였다. 얼마만에 기차는 왔고, 수십 명이나 되는 손이 정류장으로 쏟아져 나왔다. 그 중에서 손님을 물색하는 김 첨지의 눈엔 양머리에 뒤축 높은 구두를 신고 <망토>까지 두른 기생 퇴물인 듯, 난봉 여학생인 듯한 여편네의 모양이 띄었다. 그는 슬근슬근 그 여자의 곁으로 다가들었다. - -“아씨, 인력거 아니 타시랍시요?” - -그 여학생인지 뭔지가 한참은 매우 탯갈을 빼며 입술을 꼭 다문 채 김 첨지를 거들떠보지도 않았다. 김 첨지는 구걸하는 거지나 무엇같이 연해연방 그의 기색을 살피며, “아씨, 정거장 애들보담 아주 싸게 모셔다 드리겠읍니다. 댁이 어디신가요.”하고, 추근추근하게도 그 여자의 들고 있는 일본식 버들고리짝에 제 손을 대었다. - -“왜 이래, 남 귀치않게.” 소리를 벽력같이 지르고는 돌아선다. 김 첨지는 어랍시요 하고 물러섰다. - -전차는 왔다. 김 첨지는 원망스럽게 전차 타는 이를 노리고 있었다. 그러나 그의 예감(豫感)은 틀리지 않았다. 전차가 빡빡하게 사람을 싣고 움직이기 시작하였을 때 타고 남은 손 하나이 있었다. 굉장하게 큰 가방을 들고 있는걸 보면 아마 붐비는 차 안에 짐이 크다 하여 차장에게 밀려내려온 눈치였다. 김 첨지는 대어섰다. - -“인력거를 타시랍시요.” - -한동안 값으로 승강이를 하다가 육십 전에 인사동까지 태워다주기로 하였다. 인력거가 무거워지매 그의 몸은 이상하게도 가벼워졌고 그리고 또 인력거가 가벼워지니 몸은 다시금 무거워졌건만 이번에는 마음조차 초조해 온다. 집의 광경이 자꾸 눈앞에 어른거리어 인제 요행을 바랄 여유도 없었다. 나무 등걸이나 무엇 같고 제 것 같지도 않은 다리를 연해 꾸짖으며 갈팡질팡 뛰는 수밖에 없었다. - -저놈의 인력거군이 저렇게 술이 취해가지고 이 진 땅에 어찌 가노, 라고 길 가는 사람이 걱정을 하리만큼 그의 걸음은 황급하였다. 흐리고 비오는 하늘은 어둠침침하게 벌써 황혼에 가까운 듯하다. 창경원 앞까지 다달아서야 그는 턱에 닿은 숨을 돌리고 걸음도 늦추잡았다. 한 걸음 두 걸음 집이 가까와올수록 그의 마음조차 괴상하게 누그러웠다. 그런데 이 누그러움은 안심에서 오는 게 아니요, 자기를 덮친 무서운 불행을 빈틈없이 알게 될 때가 박두한 것을 두려워하는 마음에서 오는 것이다. - -그는 불행에 다닥치기 전 시간을 얼마쯤이라도 늘리려고 버르적거렸다. 기적(奇蹟)에 가까운 벌이를 하였다는 기쁨을 할 수 있으면 오래 지니고 싶었다. 그는 두리번두리번 사면을 살피었다. 그 모양은 마치 자기 집 - 곧 불행을 향하고 달려가는 제 다리를 제 힘으로는 도저히 어찌할 수 없으니 누구든지 나를 좀 잡아 다고, 구해 다고 하는 듯하였다. - -그럴 즈음에 마침 길가 선술집에서 그의 친구 치삼이가 나온다. 그의 우글우글 살찐 얼굴에 주홍이 돋는 듯, 온 턱과 뺨을 시커멓게 구레나룻이 덮였거늘, 노르탱탱한 얼굴이 바짝 말라서 여기저기 고랑이 패고, 수염도 있대야 턱밑에만 마치 솔잎 송이를 거꾸로 붙여놓은 듯한 김 첨지의 풍채하고는 기이한 대상을 짓고 있었다. - -“여보게 김 첨지, 자네 문안 들어갔다 오는 모양일세그려. 돈 많이 벌었을 테니 한 잔 빨리게.” - -뚱뚱보는 말라깽이를 보든 맡에 부르짖었다. 그 목소리는 몸짓과 딴판으로 연하고 싹싹하였다. 김 첨지는 이 친구를 만난 게 어떻게 반가운지 몰랐다. 자기를 살려준 은인이나 무엇같이 고맙기도 하였다. - -“자네는 벌써 한잔 한 모양일세그려. 자네도 오늘 재미가 좋아보이.”하고, 김 첨지는 얼굴을 펴서 웃었다. - -“압다, 재미 안 좋다고 술 못 먹을 낸가. 그런데 여보게, 자네 왼몸이 어째 물독에 빠진 새앙쥐 같은가? 어서 이리 들어와 말리게.” - -선술집은 훈훈하고 뜨뜻하였다. 추어탕을 끓이는 솥뚜껑을 열 적마다 뭉게뭉게 떠오르는 흰 김, 석쇠에서 뻐지짓뻐지짓 구워지는 너비아니 구이며 제육이며 간이며 콩팥이며 북어며 빈대떡……이 너저분하게 늘어놓인 안주 탁자에 김 첨지는 갑자기 속이 쓰려서 견딜 수 없었다. 마음대로 할 양이면 거기 있는 모든 먹음 먹이를 모조리 깡그리 집어삼켜도 시원치 않았다. 하되 배고픈 이는 위선 분량 많은 빈대떡 두 개를 쪼이기도 하고 추어탕을 한 그릇 청하였다. - -주린 창자는 음식맛을 보더니 더욱더욱 비어지며 자꾸자꾸 들이라들이라 하였다. 순식간에 두부와 미꾸리 든 국 한 그릇을 그냥 물같이 들이키고 말았다. 세째 그릇을 받아들었을 제 데우던 막걸이 곱배기 두 잔이 더웠다. 치삼이와 같이 마시자 원원히 비었던 속이라 찌르르하고 창자에 퍼지며 얼굴이 화끈하였다. 눌러 곱배기 한 잔을 또 마셨다. - -김 첨지의 눈은 벌써 개개 풀리기 시작하였다. 석쇠에 얹힌 떡 두 개를 숭덩숭덩 썰어서 볼을 불룩거리며 또 곱배기 두 잔을 부어라 하였다. - -치삼은 의아한 듯이 김 첨지를 보며, “여보게 또 붓다니, 벌써 우리가 넉 잔씩 먹었네, 돈이 사십 전일세.”라고 주의시켰다. - -“아따 이놈아, 사십 전이 그리 끔찍하냐. 오늘 내가 돈을 막 벌었어. 참 오늘 운수가 좋았느니.” - -“그래 얼마를 벌었단 말인가?” - -“삼십 원을 벌었어, 삼십 원을! 이런 젠장맞을 술을 왜 안부어……괜찮다 괜찮다, 막 먹어도 상관이 없어. 오늘 돈 산더미같이 벌었는데.” - -“어, 이 사람 취했군, 그만두세.” - -“이놈아, 이걸 먹고 취할 내냐, 어서 더 먹어.”하고는 치삼의 귀를 잡아채며 취한 이는 부르짖었다. 그리고 술을 붓는 열 다섯 살 됨직한 중대가리에게로 달려들며, “이놈, 오라질 놈, 왜 술을 붓지 않어.”라고 야단을 쳤다. 중대가리는 히히 웃고 치삼을 보며 문의하는 듯이 눈짓을 하였다. 주정꾼이 눈치를 알아보고 화를 버럭내며, “에미를 붙을 이 오라질 놈들 같으니, 이놈 내가 돈이 없을 줄 알고.”하자마자 허리춤을 훔칫훔칫 하더니 일 원짜리 한 장을 꺼내어 중대가리 앞에 펄쩍 집어던졌다. 그 사품에 몇 푼 은전이 잘그랑 하며 떨어진다. - -“여보게 돈 떨어졌네, 왜 돈을 막 끼얹나.” 이런 말을 하며 일변 돈을 줍는다. 김 첨지는 취한 중에도 돈의 거처를 살피는 듯이 눈을 크게 떠서 땅을 내려다보다가 불시에 제 하는 짓이 너무 더럽다는 듯이 고개를 소스라치자 더욱 성을 내며, “봐라 봐! 이 더러운 놈들아, 내가 돈이 없나, 다리뼉다구를 꺾어놓을 놈들 같으니.”하고 치삼의 주워주는 돈을 받아, “이 원수엣 돈! 이 육시를 할 돈!”하면서, 풀매질을 친다. 벽에 맞아 떨어진 돈은 다시 술 끓이는 양푼에 떨어지며 정당한 매를 맞는다는 듯이 쨍하고 울었다. - -곱배기 두 잔은 또 부어질 겨를도 없이 말려가고 말았다. 김 첨지는 입술과 수염에 붙은 술을 빨아들이고 나서 매우 만족한 듯이 그 솔잎 송이 수염을 쓰다듬으며, “또 부어, 또 부어.”라고, 외쳤다. - -또 한 잔 먹고 나서 김 첨지는 치삼의 어깨를 치며 문득 껄껄 웃는다. 그 웃음 소리가 어떻게 컸는지 술집에 있는 이의 눈은 모두 김 첨지에게로 몰리었다. 웃는 이는 더욱 웃으며, “여보게 치삼이, 내 우스운 이야기 하나 할까. 오늘 손을 태고 정거장에까지 가지 않았겠나.” - -“그래서.” - -“갔다가 그저 오기가 안 됐데그려. 그래 전차 정류장에서 어름어름하며 손님 하나를 태울 궁리를 하지 않았나. 거기 마침 마나님이신지 여학생님이신지 - 요새야 어디 논다니와 아가씨를 구별할 수가 있던가 - <망토>를 두르고 비를 맞고 서 있겠지. 슬근슬근 가까이 가서 인력거 타시랍시요 하고 손가방을 받으랴니까 내 손을 탁 뿌리치고 홱 돌아서더니만 <왜 남을 이렇게 귀찮게 굴어!> 그 소리야말로 꾀꼬리 소리지, 허허!” - -김 첨지는 교묘하게도 정말 꾀꼬리 같은 소리를 내었다. 모든 사람은 일시에 웃었다. - -“빌어먹을 깍쟁이 같은 년, 누가 저를 어쩌나, <왜 남을 귀찮게 굴어!> 어이구 소리가 처신도 없지, 허허.” - -웃음 소리들은 높아졌다. 그러나 그 웃음 소리들이 사라지기 전에 김 첨지는 훌쩍훌쩍 울기 시작하였다. - -치삼은 어이없이 주정뱅이를 바라보며, “금방 웃고 지랄을 하더니 우는 건 또 무슨 일인가.” - -김 첨지는 연해 코를 들여마시며, “우리 마누라가 죽었다네.” - -“뭐, 마누라가 죽다니, 언제?” - -“이놈아 언제는. 오늘이지.” - -“엑기 미친 놈, 거짓말 말아.” - -“거짓말은 왜, 참말로 죽었어, 참말로... 마누라 시체를 집어 뻐들쳐놓고 내가 술을 먹다니, 내가 죽일 놈이야, 죽일 놈이야.”하고 김 첨지는 엉엉 소리를 내어 운다. - -치삼은 흥이 조금 깨어지는 얼굴로, “원 이 사람이, 참말을 하나 거짓말을 하나. 그러면 집으로 가세, 가.”하고 우는 이의 팔을 잡아당기었다. - -치삼의 끄는 손을 뿌리치더니 김 첨지는 눈물이 글썽글썽한 눈으로 싱그레 웃는다. - -“죽기는 누가 죽어.”하고 득의가 양양. - -“죽기는 왜 죽어, 생때같이 살아만 있단다. 그 오라질 년이 밥을 죽이지. 인제 나한테 속았다.”하고 어린애 모양으로 손뼉을 치며 웃는다. - -“이 사람이 정말 미쳤단 말인가. 나도 아주먼네가 앓는단 말은 들었는데.”하고, 치삼이도 어느 불안을 느끼는 듯이 김 첨지에게 또 돌아가라고 권하였다. - -“안 죽었어, 안 죽었대도그래.” - -김 첨지는 홧증을 내며 확신있게 소리를 질렀으되 그 소리엔 안 죽은 것을 믿으려고 애쓰는 가락이 있었다. 기어이 일 원어치를 채워서 곱배기 한 잔씩 더 먹고 나왔다. 궂은 비는 의연히 추적추적 내린다. - -김 첨지는 취중에도 설렁탕을 사가지고 집에 다달았다. 집이라 해도 물론 셋집이요, 또 집 전체를 세든 게 아니라 안과 뚝떨어진 행랑방 한 간을 빌려 든 것인데 물을 길어대고 한 달에 일 원씩 내는 터이다. 만일 김 첨지가 주기를 띠지 않았던들 한 발을 대문에 들여놓았을 제 그곳을 지배하는 무시무시한 정적(靜寂) - 폭풍우가 지나간 뒤의 바다 같은 정적에 다리가 떨렸으리라. - -쿨룩거리는 기침 소리도 들을 수 없다. 그르렁거리는 숨소리조차 들을 수 없다. 다만 이 무덤같은 침묵을 깨뜨리는 - 깨뜨린다느니보다 한층 더 침묵을 깊게 하고 불길하게 하는 빡빡하는 그윽한 소리, 어린애의 젖 빠는 소리가 날 뿐이다. 만일 청각(聽覺)이 예민한 이 같으면 그 빡빡 소리는 빨 따름이요, 꿀떡꿀떡 하고 젖 넘어가는 소리가 없으니 빈 젖을 빤다는 것도 짐작할는지 모르리라. - -혹은 김 첨지도 이 불길한 침묵을 짐작했는지도 모른다. 그렇지 않으면 대문에 들어서자마자 전에 없이, “이 난장 맞을 년, 남편이 들어오는데 나와보지도 않아, 이 오라질 년.”이라고 고함을 친 게 수상하다. 이 고함이야말로 제 몸을 엄습해오는 무시무시한 증을 쫓아버리려는 허장성세(虛張聲勢)인 까닭이다. - -하여간 김 첨지는 방문을 왈칵 열었다. 구역을 나게 하는 추기 - 떨어진 삿자리 밑에서 나온 먼지내, 빨지 않은 기저귀에서 나는 똥내와 오줌내, 가지각색 때가 케케히 앉은 옷내, 병인의 땀 썩은 내가 섞인 추기가 무딘 김 첨지의 코를 찔렀다. - -방안에 들어서며 설렁탕을 한구석에 놓을 사이도 없이 주정군은 목청을 있는 대로 다 내어 호통을 쳤다. - -“이런 오라질 년, 주야장천(晝夜長川) 누워만 있으면 제일이야! 남편이 와도 일어나지를 못해.”라는 소리와 함께 발길로 누운 이의 다리를 몹시 찼다. 그러나 발길에 채이는 건 사람의 살이 아니고 나무등걸과 같은 느낌이 있었다. 이때에 빽빽 소리가 응아 소리로 변하였다. 개똥이가 물었던 젖을 빼어놓고 운다. 운대도 온 얼굴을 찡그려 붙여서, 운다는 표정을 할 뿐이다. 응아 소리도 입에서 나는 게 아니고 마치 뱃속에서 나는 듯하였다. 울다가 울다가 목도 잠겼고 또 울 기운조차 시진한 것 같다. - -발로 차도 그 보람이 없는 걸 보자 남편은 아내의 머리맡으로 달려들어 그야말로 까치집 같은 환자의 머리를 꺼들어 흔들며, “이 년아, 말을 해, 말을! 입이 붙었어, 이 오라질 년!” - -“…” - -“으응, 이것 봐, 아무 말이 없네.” -“…” - -“이년아, 죽었단 말이냐, 왜 말이 없어.” - -“…” - -“으응. 또 대답이 없네, 정말 죽었나버이.” - -이러다가 누운 이의 흰 창을 덮은, 위로 치뜬 눈을 알아보자마자, “이 눈깔! 이 눈깔! 왜 나를 바라보지 못하고 천정만 보느냐, 응.”하는 말 끝엔 목이 메었다. 그러자 산 사람의 눈에서 떨어진 닭의 똥 같은 눈물이 죽은 이의 뻣뻣한 얼굴을 어룽어룽 적시었다. 문득 김 첨지는 미칠 듯이 제 얼굴을 죽은 이의 얼굴에 한테 비비대며 중얼거렸다. - -“설렁탕을 사다놓았는데 왜 먹지를 못하니, 왜 먹지를 못하니... 괴상하게도 오늘은! 운수가 좋더니만... ” diff --git a/vendor/golang.org/x/text/encoding/unicode/utf32/utf32.go b/vendor/golang.org/x/text/encoding/unicode/utf32/utf32.go deleted file mode 100644 index 48b215217..000000000 --- a/vendor/golang.org/x/text/encoding/unicode/utf32/utf32.go +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package utf32 provides the UTF-32 Unicode encoding. -// -// Please note that support for UTF-32 is discouraged as it is a rare and -// inefficient encoding, unfit for use as an interchange format. For use -// on the web, the W3C strongly discourages its use -// (https://www.w3.org/TR/html5/document-metadata.html#charset) -// while WHATWG directly prohibits supporting it -// (https://html.spec.whatwg.org/multipage/syntax.html#character-encodings). -package utf32 // import "golang.org/x/text/encoding/unicode/utf32" - -import ( - "errors" - "unicode/utf8" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/transform" -) - -// All lists a configuration for each IANA-defined UTF-32 variant. -var All = []encoding.Encoding{ - UTF32(BigEndian, UseBOM), - UTF32(BigEndian, IgnoreBOM), - UTF32(LittleEndian, IgnoreBOM), -} - -// ErrMissingBOM means that decoding UTF-32 input with ExpectBOM did not -// find a starting byte order mark. -var ErrMissingBOM = errors.New("encoding: missing byte order mark") - -// UTF32 returns a UTF-32 Encoding for the given default endianness and -// byte order mark (BOM) policy. -// -// When decoding from UTF-32 to UTF-8, if the BOMPolicy is IgnoreBOM then -// neither BOMs U+FEFF nor ill-formed code units 0xFFFE0000 in the input -// stream will affect the endianness used for decoding. Instead BOMs will -// be output as their standard UTF-8 encoding "\xef\xbb\xbf" while -// 0xFFFE0000 code units will be output as "\xef\xbf\xbd", the standard -// UTF-8 encoding for the Unicode replacement character. If the BOMPolicy -// is UseBOM or ExpectBOM a starting BOM is not written to the UTF-8 -// output. Instead, it overrides the default endianness e for the remainder -// of the transformation. Any subsequent BOMs U+FEFF or ill-formed code -// units 0xFFFE0000 will not affect the endianness used, and will instead -// be output as their standard UTF-8 (replacement) encodings. For UseBOM, -// if there is no starting BOM, it will proceed with the default -// Endianness. For ExpectBOM, in that case, the transformation will return -// early with an ErrMissingBOM error. -// -// When encoding from UTF-8 to UTF-32, a BOM will be inserted at the start -// of the output if the BOMPolicy is UseBOM or ExpectBOM. Otherwise, a BOM -// will not be inserted. The UTF-8 input does not need to contain a BOM. -// -// There is no concept of a 'native' endianness. If the UTF-32 data is -// produced and consumed in a greater context that implies a certain -// endianness, use IgnoreBOM. Otherwise, use ExpectBOM and always produce -// and consume a BOM. -// -// In the language of http://www.unicode.org/faq/utf_bom.html#bom10, -// IgnoreBOM corresponds to "Where the precise type of the data stream is -// known... the BOM should not be used" and ExpectBOM corresponds to "A -// particular protocol... may require use of the BOM". -func UTF32(e Endianness, b BOMPolicy) encoding.Encoding { - return utf32Encoding{config{e, b}, mibValue[e][b&bomMask]} -} - -// mibValue maps Endianness and BOMPolicy settings to MIB constants for UTF-32. -// Note that some configurations map to the same MIB identifier. -var mibValue = map[Endianness][numBOMValues]identifier.MIB{ - BigEndian: [numBOMValues]identifier.MIB{ - IgnoreBOM: identifier.UTF32BE, - UseBOM: identifier.UTF32, - }, - LittleEndian: [numBOMValues]identifier.MIB{ - IgnoreBOM: identifier.UTF32LE, - UseBOM: identifier.UTF32, - }, - // ExpectBOM is not widely used and has no valid MIB identifier. -} - -// BOMPolicy is a UTF-32 encodings's byte order mark policy. -type BOMPolicy uint8 - -const ( - writeBOM BOMPolicy = 0x01 - acceptBOM BOMPolicy = 0x02 - requireBOM BOMPolicy = 0x04 - bomMask BOMPolicy = 0x07 - - // HACK: numBOMValues == 8 triggers a bug in the 1.4 compiler (cannot have a - // map of an array of length 8 of a type that is also used as a key or value - // in another map). See golang.org/issue/11354. - // TODO: consider changing this value back to 8 if the use of 1.4.* has - // been minimized. - numBOMValues = 8 + 1 - - // IgnoreBOM means to ignore any byte order marks. - IgnoreBOM BOMPolicy = 0 - // Unicode-compliant interpretation for UTF-32BE/LE. - - // UseBOM means that the UTF-32 form may start with a byte order mark, - // which will be used to override the default encoding. - UseBOM BOMPolicy = writeBOM | acceptBOM - // Unicode-compliant interpretation for UTF-32. - - // ExpectBOM means that the UTF-32 form must start with a byte order mark, - // which will be used to override the default encoding. - ExpectBOM BOMPolicy = writeBOM | acceptBOM | requireBOM - // Consistent with BOMPolicy definition in golang.org/x/text/encoding/unicode -) - -// Endianness is a UTF-32 encoding's default endianness. -type Endianness bool - -const ( - // BigEndian is UTF-32BE. - BigEndian Endianness = false - // LittleEndian is UTF-32LE. - LittleEndian Endianness = true -) - -type config struct { - endianness Endianness - bomPolicy BOMPolicy -} - -type utf32Encoding struct { - config - mib identifier.MIB -} - -func (u utf32Encoding) NewDecoder() *encoding.Decoder { - return &encoding.Decoder{Transformer: &utf32Decoder{ - initial: u.config, - current: u.config, - }} -} - -func (u utf32Encoding) NewEncoder() *encoding.Encoder { - return &encoding.Encoder{Transformer: &utf32Encoder{ - endianness: u.endianness, - initialBOMPolicy: u.bomPolicy, - currentBOMPolicy: u.bomPolicy, - }} -} - -func (u utf32Encoding) ID() (mib identifier.MIB, other string) { - return u.mib, "" -} - -func (u utf32Encoding) String() string { - e, b := "B", "" - if u.endianness == LittleEndian { - e = "L" - } - switch u.bomPolicy { - case ExpectBOM: - b = "Expect" - case UseBOM: - b = "Use" - case IgnoreBOM: - b = "Ignore" - } - return "UTF-32" + e + "E (" + b + " BOM)" -} - -type utf32Decoder struct { - initial config - current config -} - -func (u *utf32Decoder) Reset() { - u.current = u.initial -} - -func (u *utf32Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - if len(src) == 0 { - if atEOF && u.current.bomPolicy&requireBOM != 0 { - return 0, 0, ErrMissingBOM - } - return 0, 0, nil - } - if u.current.bomPolicy&acceptBOM != 0 { - if len(src) < 4 { - return 0, 0, transform.ErrShortSrc - } - switch { - case src[0] == 0x00 && src[1] == 0x00 && src[2] == 0xfe && src[3] == 0xff: - u.current.endianness = BigEndian - nSrc = 4 - case src[0] == 0xff && src[1] == 0xfe && src[2] == 0x00 && src[3] == 0x00: - u.current.endianness = LittleEndian - nSrc = 4 - default: - if u.current.bomPolicy&requireBOM != 0 { - return 0, 0, ErrMissingBOM - } - } - u.current.bomPolicy = IgnoreBOM - } - - var r rune - var dSize, sSize int - for nSrc < len(src) { - if nSrc+3 < len(src) { - x := uint32(src[nSrc+0])<<24 | uint32(src[nSrc+1])<<16 | - uint32(src[nSrc+2])<<8 | uint32(src[nSrc+3]) - if u.current.endianness == LittleEndian { - x = x>>24 | (x >> 8 & 0x0000FF00) | (x << 8 & 0x00FF0000) | x<<24 - } - r, sSize = rune(x), 4 - if dSize = utf8.RuneLen(r); dSize < 0 { - r, dSize = utf8.RuneError, 3 - } - } else if atEOF { - // 1..3 trailing bytes. - r, dSize, sSize = utf8.RuneError, 3, len(src)-nSrc - } else { - err = transform.ErrShortSrc - break - } - if nDst+dSize > len(dst) { - err = transform.ErrShortDst - break - } - nDst += utf8.EncodeRune(dst[nDst:], r) - nSrc += sSize - } - return nDst, nSrc, err -} - -type utf32Encoder struct { - endianness Endianness - initialBOMPolicy BOMPolicy - currentBOMPolicy BOMPolicy -} - -func (u *utf32Encoder) Reset() { - u.currentBOMPolicy = u.initialBOMPolicy -} - -func (u *utf32Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - if u.currentBOMPolicy&writeBOM != 0 { - if len(dst) < 4 { - return 0, 0, transform.ErrShortDst - } - dst[0], dst[1], dst[2], dst[3] = 0x00, 0x00, 0xfe, 0xff - u.currentBOMPolicy = IgnoreBOM - nDst = 4 - } - - r, size := rune(0), 0 - for nSrc < len(src) { - r = rune(src[nSrc]) - - // Decode a 1-byte rune. - if r < utf8.RuneSelf { - size = 1 - - } else { - // Decode a multi-byte rune. - r, size = utf8.DecodeRune(src[nSrc:]) - if size == 1 { - // All valid runes of size 1 (those below utf8.RuneSelf) were - // handled above. We have invalid UTF-8 or we haven't seen the - // full character yet. - if !atEOF && !utf8.FullRune(src[nSrc:]) { - err = transform.ErrShortSrc - break - } - } - } - - if nDst+4 > len(dst) { - err = transform.ErrShortDst - break - } - - dst[nDst+0] = uint8(r >> 24) - dst[nDst+1] = uint8(r >> 16) - dst[nDst+2] = uint8(r >> 8) - dst[nDst+3] = uint8(r) - nDst += 4 - nSrc += size - } - - if u.endianness == LittleEndian { - for i := 0; i < nDst; i += 4 { - dst[i], dst[i+1], dst[i+2], dst[i+3] = dst[i+3], dst[i+2], dst[i+1], dst[i] - } - } - return nDst, nSrc, err -} diff --git a/vendor/golang.org/x/text/encoding/unicode/utf32/utf32_test.go b/vendor/golang.org/x/text/encoding/unicode/utf32/utf32_test.go deleted file mode 100644 index cd6158e5e..000000000 --- a/vendor/golang.org/x/text/encoding/unicode/utf32/utf32_test.go +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package utf32 - -import ( - "testing" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/internal/enctest" - "golang.org/x/text/transform" -) - -var ( - utf32LEIB = UTF32(LittleEndian, IgnoreBOM) // UTF-32LE (atypical interpretation) - utf32LEUB = UTF32(LittleEndian, UseBOM) // UTF-32, LE - // utf32LEEB = UTF32(LittleEndian, ExpectBOM) // UTF-32, LE, Expect - covered in encoding_test.go - utf32BEIB = UTF32(BigEndian, IgnoreBOM) // UTF-32BE (atypical interpretation) - utf32BEUB = UTF32(BigEndian, UseBOM) // UTF-32 default - utf32BEEB = UTF32(BigEndian, ExpectBOM) // UTF-32 Expect -) - -func TestBasics(t *testing.T) { - testCases := []struct { - e encoding.Encoding - encPrefix string - encSuffix string - encoded string - utf8 string - }{{ - e: utf32BEIB, - encoded: "\x00\x00\x00\x57\x00\x00\x00\xe4\x00\x01\xd5\x65", - utf8: "\x57\u00e4\U0001d565", - }, { - e: UTF32(BigEndian, ExpectBOM), - encPrefix: "\x00\x00\xfe\xff", - encoded: "\x00\x00\x00\x57\x00\x00\x00\xe4\x00\x01\xd5\x65", - utf8: "\x57\u00e4\U0001d565", - }, { - e: UTF32(LittleEndian, IgnoreBOM), - encoded: "\x57\x00\x00\x00\xe4\x00\x00\x00\x65\xd5\x01\x00", - utf8: "\x57\u00e4\U0001d565", - }, { - e: UTF32(LittleEndian, ExpectBOM), - encPrefix: "\xff\xfe\x00\x00", - encoded: "\x57\x00\x00\x00\xe4\x00\x00\x00\x65\xd5\x01\x00", - utf8: "\x57\u00e4\U0001d565", - }} - - for _, tc := range testCases { - enctest.TestEncoding(t, tc.e, tc.encoded, tc.utf8, tc.encPrefix, tc.encSuffix) - } -} - -func TestFiles(t *testing.T) { enctest.TestFile(t, utf32BEIB) } - -func BenchmarkEncoding(b *testing.B) { enctest.Benchmark(b, utf32BEIB) } - -func TestUTF32(t *testing.T) { - testCases := []struct { - desc string - src string - notEOF bool // the inverse of atEOF - sizeDst int - want string - nSrc int - err error - t transform.Transformer - }{{ - desc: "utf-32 IgnoreBOM dec: empty string", - t: utf32BEIB.NewDecoder(), - }, { - desc: "utf-32 UseBOM dec: empty string", - t: utf32BEUB.NewDecoder(), - }, { - desc: "utf-32 ExpectBOM dec: empty string", - err: ErrMissingBOM, - t: utf32BEEB.NewDecoder(), - }, { - desc: "utf-32be dec: Doesn't interpret U+FEFF as BOM", - src: "\x00\x00\xFE\xFF\x00\x01\x23\x45\x00\x00\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61", - sizeDst: 100, - want: "\uFEFF\U00012345=Ra", - nSrc: 20, - t: utf32BEIB.NewDecoder(), - }, { - desc: "utf-32be dec: Interprets little endian U+FEFF as invalid", - src: "\xFF\xFE\x00\x00\x00\x01\x23\x45\x00\x00\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61", - sizeDst: 100, - want: "\uFFFD\U00012345=Ra", - nSrc: 20, - t: utf32BEIB.NewDecoder(), - }, { - desc: "utf-32le dec: Doesn't interpret U+FEFF as BOM", - src: "\xFF\xFE\x00\x00\x45\x23\x01\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61\x00\x00\x00", - sizeDst: 100, - want: "\uFEFF\U00012345=Ra", - nSrc: 20, - t: utf32LEIB.NewDecoder(), - }, { - desc: "utf-32le dec: Interprets big endian U+FEFF as invalid", - src: "\x00\x00\xFE\xFF\x45\x23\x01\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61\x00\x00\x00", - sizeDst: 100, - want: "\uFFFD\U00012345=Ra", - nSrc: 20, - t: utf32LEIB.NewDecoder(), - }, { - desc: "utf-32 enc: Writes big-endian BOM", - src: "\U00012345=Ra", - sizeDst: 100, - want: "\x00\x00\xFE\xFF\x00\x01\x23\x45\x00\x00\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61", - nSrc: 7, - t: utf32BEUB.NewEncoder(), - }, { - desc: "utf-32 enc: Writes little-endian BOM", - src: "\U00012345=Ra", - sizeDst: 100, - want: "\xFF\xFE\x00\x00\x45\x23\x01\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61\x00\x00\x00", - nSrc: 7, - t: utf32LEUB.NewEncoder(), - }, { - desc: "utf-32 dec: Interprets text using big-endian default when BOM not present", - src: "\x00\x01\x23\x45\x00\x00\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61", - sizeDst: 100, - want: "\U00012345=Ra", - nSrc: 16, - t: utf32BEUB.NewDecoder(), - }, { - desc: "utf-32 dec: Interprets text using little-endian default when BOM not present", - src: "\x45\x23\x01\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61\x00\x00\x00", - sizeDst: 100, - want: "\U00012345=Ra", - nSrc: 16, - t: utf32LEUB.NewDecoder(), - }, { - desc: "utf-32 dec: BOM determines encoding BE", - src: "\x00\x00\xFE\xFF\x00\x01\x23\x45\x00\x00\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61", - sizeDst: 100, - want: "\U00012345=Ra", - nSrc: 20, - t: utf32BEUB.NewDecoder(), - }, { - desc: "utf-32 dec: BOM determines encoding LE", - src: "\xFF\xFE\x00\x00\x45\x23\x01\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61\x00\x00\x00", - sizeDst: 100, - want: "\U00012345=Ra", - nSrc: 20, - t: utf32LEUB.NewDecoder(), - }, { - desc: "utf-32 dec: BOM determines encoding LE, change default", - src: "\xFF\xFE\x00\x00\x45\x23\x01\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61\x00\x00\x00", - sizeDst: 100, - want: "\U00012345=Ra", - nSrc: 20, - t: utf32BEUB.NewDecoder(), - }, { - desc: "utf-32 dec: BOM determines encoding BE, change default", - src: "\x00\x00\xFE\xFF\x00\x01\x23\x45\x00\x00\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61", - sizeDst: 100, - want: "\U00012345=Ra", - nSrc: 20, - t: utf32LEUB.NewDecoder(), - }, { - desc: "utf-32 dec: Don't change big-endian byte order mid-stream", - src: "\x00\x01\x23\x45\x00\x00\x00\x3D\xFF\xFE\x00\x00\x00\x00\xFE\xFF\x00\x00\x00\x52\x00\x00\x00\x61", - sizeDst: 100, - want: "\U00012345=\uFFFD\uFEFFRa", - nSrc: 24, - t: utf32BEUB.NewDecoder(), - }, { - desc: "utf-32 dec: Don't change little-endian byte order mid-stream", - src: "\x45\x23\x01\x00\x3D\x00\x00\x00\x00\x00\xFE\xFF\xFF\xFE\x00\x00\x52\x00\x00\x00\x61\x00\x00\x00", - sizeDst: 100, - want: "\U00012345=\uFFFD\uFEFFRa", - nSrc: 24, - t: utf32LEUB.NewDecoder(), - }, { - desc: "utf-32 dec: Fail on missing BOM when required", - src: "\x00\x01\x23\x45\x00\x00\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61", - sizeDst: 100, - want: "", - nSrc: 0, - err: ErrMissingBOM, - t: utf32BEEB.NewDecoder(), - }, { - desc: "utf-32 enc: Short dst", - src: "\U00012345=Ra", - sizeDst: 15, - want: "\x00\x01\x23\x45\x00\x00\x00\x3D\x00\x00\x00\x52", - nSrc: 6, - err: transform.ErrShortDst, - t: utf32BEIB.NewEncoder(), - }, { - desc: "utf-32 enc: Short src", - src: "\U00012345=Ra\xC2", - notEOF: true, - sizeDst: 100, - want: "\x00\x01\x23\x45\x00\x00\x00\x3D\x00\x00\x00\x52\x00\x00\x00\x61", - nSrc: 7, - err: transform.ErrShortSrc, - t: utf32BEIB.NewEncoder(), - }, { - desc: "utf-32 enc: Invalid input", - src: "\x80\xC1\xC2\x7F\xC2", - sizeDst: 100, - want: "\x00\x00\xFF\xFD\x00\x00\xFF\xFD\x00\x00\xFF\xFD\x00\x00\x00\x7F\x00\x00\xFF\xFD", - nSrc: 5, - t: utf32BEIB.NewEncoder(), - }, { - desc: "utf-32 dec: Short dst", - src: "\x00\x00\x00\x41", - sizeDst: 0, - want: "", - nSrc: 0, - err: transform.ErrShortDst, - t: utf32BEIB.NewDecoder(), - }, { - desc: "utf-32 dec: Short src", - src: "\x00\x00\x00", - notEOF: true, - sizeDst: 4, - want: "", - nSrc: 0, - err: transform.ErrShortSrc, - t: utf32BEIB.NewDecoder(), - }, { - desc: "utf-32 dec: Invalid input", - src: "\x00\x00\xD8\x00\x00\x00\xDF\xFF\x00\x11\x00\x00\x00\x00\x00", - sizeDst: 100, - want: "\uFFFD\uFFFD\uFFFD\uFFFD", - nSrc: 15, - t: utf32BEIB.NewDecoder(), - }} - for i, tc := range testCases { - b := make([]byte, tc.sizeDst) - nDst, nSrc, err := tc.t.Transform(b, []byte(tc.src), !tc.notEOF) - if err != tc.err { - t.Errorf("%d:%s: error was %v; want %v", i, tc.desc, err, tc.err) - } - if got := string(b[:nDst]); got != tc.want { - t.Errorf("%d:%s: result was %q: want %q", i, tc.desc, got, tc.want) - } - if nSrc != tc.nSrc { - t.Errorf("%d:%s: nSrc was %d; want %d", i, tc.desc, nSrc, tc.nSrc) - } - } -} diff --git a/vendor/golang.org/x/text/feature/plural/common.go b/vendor/golang.org/x/text/feature/plural/common.go deleted file mode 100644 index fdcb373fd..000000000 --- a/vendor/golang.org/x/text/feature/plural/common.go +++ /dev/null @@ -1,70 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package plural - -// Form defines a plural form. -// -// Not all languages support all forms. Also, the meaning of each form varies -// per language. It is important to note that the name of a form does not -// necessarily correspond one-to-one with the set of numbers. For instance, -// for Croation, One matches not only 1, but also 11, 21, etc. -// -// Each language must at least support the form "other". -type Form byte - -const ( - Other Form = iota - Zero - One - Two - Few - Many -) - -var countMap = map[string]Form{ - "other": Other, - "zero": Zero, - "one": One, - "two": Two, - "few": Few, - "many": Many, -} - -type pluralCheck struct { - // category: - // 3..7: opID - // 0..2: category - cat byte - setID byte -} - -// opID identifies the type of operand in the plural rule, being i, n or f. -// (v, w, and t are treated as filters in our implementation.) -type opID byte - -const ( - opMod opID = 0x1 // is '%' used? - opNotEqual opID = 0x2 // using "!=" to compare - opI opID = 0 << 2 // integers after taking the absolute value - opN opID = 1 << 2 // full number (must be integer) - opF opID = 2 << 2 // fraction - opV opID = 3 << 2 // number of visible digits - opW opID = 4 << 2 // number of visible digits without trailing zeros - opBretonM opID = 5 << 2 // hard-wired rule for Breton - opItalian800 opID = 6 << 2 // hard-wired rule for Italian - opAzerbaijan00s opID = 7 << 2 // hard-wired rule for Azerbaijan -) -const ( - // Use this plural form to indicate the next rule needs to match as well. - // The last condition in the list will have the correct plural form. - andNext = 0x7 - formMask = 0x7 - - opShift = 3 - - // numN indicates the maximum integer, or maximum mod value, for which we - // have inclusion masks. - numN = 100 - // The common denominator of the modulo that is taken. - maxMod = 100 -) diff --git a/vendor/golang.org/x/text/feature/plural/data_test.go b/vendor/golang.org/x/text/feature/plural/data_test.go deleted file mode 100644 index 8cffbbe9e..000000000 --- a/vendor/golang.org/x/text/feature/plural/data_test.go +++ /dev/null @@ -1,190 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package plural - -type pluralTest struct { - locales string - form int - integer []string - decimal []string -} - -var ordinalTests = []pluralTest{ // 59 elements - 0: {locales: "af am ar bg bs ce cs da de dsb el es et eu fa fi fy gl gsw he hr hsb id in is iw ja km kn ko ky lt lv ml mn my nb nl pa pl prg pt root ru sh si sk sl sr sw ta te th tr ur uz yue zh zu", form: 0, integer: []string{"0~15", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 1: {locales: "sv", form: 2, integer: []string{"1", "2", "21", "22", "31", "32", "41", "42", "51", "52", "61", "62", "71", "72", "81", "82", "101", "1001"}, decimal: []string(nil)}, - 2: {locales: "sv", form: 0, integer: []string{"0", "3~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 3: {locales: "fil fr ga hy lo mo ms ro tl vi", form: 2, integer: []string{"1"}, decimal: []string(nil)}, - 4: {locales: "fil fr ga hy lo mo ms ro tl vi", form: 0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 5: {locales: "hu", form: 2, integer: []string{"1", "5"}, decimal: []string(nil)}, - 6: {locales: "hu", form: 0, integer: []string{"0", "2~4", "6~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 7: {locales: "ne", form: 2, integer: []string{"1~4"}, decimal: []string(nil)}, - 8: {locales: "ne", form: 0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 9: {locales: "be", form: 4, integer: []string{"2", "3", "22", "23", "32", "33", "42", "43", "52", "53", "62", "63", "72", "73", "82", "83", "102", "1002"}, decimal: []string(nil)}, - 10: {locales: "be", form: 0, integer: []string{"0", "1", "4~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 11: {locales: "uk", form: 4, integer: []string{"3", "23", "33", "43", "53", "63", "73", "83", "103", "1003"}, decimal: []string(nil)}, - 12: {locales: "uk", form: 0, integer: []string{"0~2", "4~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 13: {locales: "kk", form: 5, integer: []string{"6", "9", "10", "16", "19", "20", "26", "29", "30", "36", "39", "40", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 14: {locales: "kk", form: 0, integer: []string{"0~5", "7", "8", "11~15", "17", "18", "21", "101", "1001"}, decimal: []string(nil)}, - 15: {locales: "it", form: 5, integer: []string{"8", "11", "80", "800"}, decimal: []string(nil)}, - 16: {locales: "it", form: 0, integer: []string{"0~7", "9", "10", "12~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 17: {locales: "ka", form: 2, integer: []string{"1"}, decimal: []string(nil)}, - 18: {locales: "ka", form: 5, integer: []string{"0", "2~16", "102", "1002"}, decimal: []string(nil)}, - 19: {locales: "ka", form: 0, integer: []string{"21~36", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 20: {locales: "sq", form: 2, integer: []string{"1"}, decimal: []string(nil)}, - 21: {locales: "sq", form: 5, integer: []string{"4", "24", "34", "44", "54", "64", "74", "84", "104", "1004"}, decimal: []string(nil)}, - 22: {locales: "sq", form: 0, integer: []string{"0", "2", "3", "5~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 23: {locales: "en", form: 2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string(nil)}, - 24: {locales: "en", form: 3, integer: []string{"2", "22", "32", "42", "52", "62", "72", "82", "102", "1002"}, decimal: []string(nil)}, - 25: {locales: "en", form: 4, integer: []string{"3", "23", "33", "43", "53", "63", "73", "83", "103", "1003"}, decimal: []string(nil)}, - 26: {locales: "en", form: 0, integer: []string{"0", "4~18", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 27: {locales: "mr", form: 2, integer: []string{"1"}, decimal: []string(nil)}, - 28: {locales: "mr", form: 3, integer: []string{"2", "3"}, decimal: []string(nil)}, - 29: {locales: "mr", form: 4, integer: []string{"4"}, decimal: []string(nil)}, - 30: {locales: "mr", form: 0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 31: {locales: "ca", form: 2, integer: []string{"1", "3"}, decimal: []string(nil)}, - 32: {locales: "ca", form: 3, integer: []string{"2"}, decimal: []string(nil)}, - 33: {locales: "ca", form: 4, integer: []string{"4"}, decimal: []string(nil)}, - 34: {locales: "ca", form: 0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 35: {locales: "mk", form: 2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string(nil)}, - 36: {locales: "mk", form: 3, integer: []string{"2", "22", "32", "42", "52", "62", "72", "82", "102", "1002"}, decimal: []string(nil)}, - 37: {locales: "mk", form: 5, integer: []string{"7", "8", "27", "28", "37", "38", "47", "48", "57", "58", "67", "68", "77", "78", "87", "88", "107", "1007"}, decimal: []string(nil)}, - 38: {locales: "mk", form: 0, integer: []string{"0", "3~6", "9~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 39: {locales: "az", form: 2, integer: []string{"1", "2", "5", "7", "8", "11", "12", "15", "17", "18", "20~22", "25", "101", "1001"}, decimal: []string(nil)}, - 40: {locales: "az", form: 4, integer: []string{"3", "4", "13", "14", "23", "24", "33", "34", "43", "44", "53", "54", "63", "64", "73", "74", "100", "1003"}, decimal: []string(nil)}, - 41: {locales: "az", form: 5, integer: []string{"0", "6", "16", "26", "36", "40", "46", "56", "106", "1006"}, decimal: []string(nil)}, - 42: {locales: "az", form: 0, integer: []string{"9", "10", "19", "29", "30", "39", "49", "59", "69", "79", "109", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 43: {locales: "gu hi", form: 2, integer: []string{"1"}, decimal: []string(nil)}, - 44: {locales: "gu hi", form: 3, integer: []string{"2", "3"}, decimal: []string(nil)}, - 45: {locales: "gu hi", form: 4, integer: []string{"4"}, decimal: []string(nil)}, - 46: {locales: "gu hi", form: 5, integer: []string{"6"}, decimal: []string(nil)}, - 47: {locales: "gu hi", form: 0, integer: []string{"0", "5", "7~20", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 48: {locales: "as bn", form: 2, integer: []string{"1", "5", "7~10"}, decimal: []string(nil)}, - 49: {locales: "as bn", form: 3, integer: []string{"2", "3"}, decimal: []string(nil)}, - 50: {locales: "as bn", form: 4, integer: []string{"4"}, decimal: []string(nil)}, - 51: {locales: "as bn", form: 5, integer: []string{"6"}, decimal: []string(nil)}, - 52: {locales: "as bn", form: 0, integer: []string{"0", "11~25", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 53: {locales: "cy", form: 1, integer: []string{"0", "7~9"}, decimal: []string(nil)}, - 54: {locales: "cy", form: 2, integer: []string{"1"}, decimal: []string(nil)}, - 55: {locales: "cy", form: 3, integer: []string{"2"}, decimal: []string(nil)}, - 56: {locales: "cy", form: 4, integer: []string{"3", "4"}, decimal: []string(nil)}, - 57: {locales: "cy", form: 5, integer: []string{"5", "6"}, decimal: []string(nil)}, - 58: {locales: "cy", form: 0, integer: []string{"10~25", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, -} // Size: 4272 bytes - -var cardinalTests = []pluralTest{ // 113 elements - 0: {locales: "bm bo dz id ig ii in ja jbo jv jw kde kea km ko lkt lo ms my nqo root sah ses sg th to vi wo yo yue zh", form: 0, integer: []string{"0~15", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 1: {locales: "am as bn fa gu hi kn mr zu", form: 2, integer: []string{"0", "1"}, decimal: []string{"0.0~1.0", "0.00~0.04"}}, - 2: {locales: "am as bn fa gu hi kn mr zu", form: 0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"1.1~2.6", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 3: {locales: "ff fr hy kab", form: 2, integer: []string{"0", "1"}, decimal: []string{"0.0~1.5"}}, - 4: {locales: "ff fr hy kab", form: 0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"2.0~3.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 5: {locales: "pt", form: 2, integer: []string{"0", "1"}, decimal: []string{"0.0~1.5"}}, - 6: {locales: "pt", form: 0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"2.0~3.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 7: {locales: "ast ca de en et fi fy gl it ji nl sv sw ur yi", form: 2, integer: []string{"1"}, decimal: []string(nil)}, - 8: {locales: "ast ca de en et fi fy gl it ji nl sv sw ur yi", form: 0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 9: {locales: "si", form: 2, integer: []string{"0", "1"}, decimal: []string{"0.0", "0.1", "1.0", "0.00", "0.01", "1.00", "0.000", "0.001", "1.000", "0.0000", "0.0001", "1.0000"}}, - 10: {locales: "si", form: 0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.2~0.9", "1.1~1.8", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 11: {locales: "ak bh guw ln mg nso pa ti wa", form: 2, integer: []string{"0", "1"}, decimal: []string{"0.0", "1.0", "0.00", "1.00", "0.000", "1.000", "0.0000", "1.0000"}}, - 12: {locales: "ak bh guw ln mg nso pa ti wa", form: 0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 13: {locales: "tzm", form: 2, integer: []string{"0", "1", "11~24"}, decimal: []string{"0.0", "1.0", "11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "17.0", "18.0", "19.0", "20.0", "21.0", "22.0", "23.0", "24.0"}}, - 14: {locales: "tzm", form: 0, integer: []string{"2~10", "100~106", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 15: {locales: "af asa az bem bez bg brx ce cgg chr ckb dv ee el eo es eu fo fur gsw ha haw hu jgo jmc ka kaj kcg kk kkj kl ks ksb ku ky lb lg mas mgo ml mn nah nb nd ne nn nnh no nr ny nyn om or os pap ps rm rof rwk saq sdh seh sn so sq ss ssy st syr ta te teo tig tk tn tr ts ug uz ve vo vun wae xh xog", form: 2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, - 16: {locales: "af asa az bem bez bg brx ce cgg chr ckb dv ee el eo es eu fo fur gsw ha haw hu jgo jmc ka kaj kcg kk kkj kl ks ksb ku ky lb lg mas mgo ml mn nah nb nd ne nn nnh no nr ny nyn om or os pap ps rm rof rwk saq sdh seh sn so sq ss ssy st syr ta te teo tig tk tn tr ts ug uz ve vo vun wae xh xog", form: 0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~0.9", "1.1~1.6", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 17: {locales: "da", form: 2, integer: []string{"1"}, decimal: []string{"0.1~1.6"}}, - 18: {locales: "da", form: 0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "2.0~3.4", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 19: {locales: "is", form: 2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string{"0.1~1.6", "10.1", "100.1", "1000.1"}}, - 20: {locales: "is", form: 0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 21: {locales: "mk", form: 2, integer: []string{"1", "11", "21", "31", "41", "51", "61", "71", "101", "1001"}, decimal: []string{"0.1", "1.1", "2.1", "3.1", "4.1", "5.1", "6.1", "7.1", "10.1", "100.1", "1000.1"}}, - 22: {locales: "mk", form: 0, integer: []string{"0", "2~10", "12~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "0.2~1.0", "1.2~1.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 23: {locales: "fil tl", form: 2, integer: []string{"0~3", "5", "7", "8", "10~13", "15", "17", "18", "20", "21", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~0.3", "0.5", "0.7", "0.8", "1.0~1.3", "1.5", "1.7", "1.8", "2.0", "2.1", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 24: {locales: "fil tl", form: 0, integer: []string{"4", "6", "9", "14", "16", "19", "24", "26", "104", "1004"}, decimal: []string{"0.4", "0.6", "0.9", "1.4", "1.6", "1.9", "2.4", "2.6", "10.4", "100.4", "1000.4"}}, - 25: {locales: "lv prg", form: 1, integer: []string{"0", "10~20", "30", "40", "50", "60", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 26: {locales: "lv prg", form: 2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string{"0.1", "1.0", "1.1", "2.1", "3.1", "4.1", "5.1", "6.1", "7.1", "10.1", "100.1", "1000.1"}}, - 27: {locales: "lv prg", form: 0, integer: []string{"2~9", "22~29", "102", "1002"}, decimal: []string{"0.2~0.9", "1.2~1.9", "10.2", "100.2", "1000.2"}}, - 28: {locales: "lag", form: 1, integer: []string{"0"}, decimal: []string{"0.0", "0.00", "0.000", "0.0000"}}, - 29: {locales: "lag", form: 2, integer: []string{"1"}, decimal: []string{"0.1~1.6"}}, - 30: {locales: "lag", form: 0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"2.0~3.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 31: {locales: "ksh", form: 1, integer: []string{"0"}, decimal: []string{"0.0", "0.00", "0.000", "0.0000"}}, - 32: {locales: "ksh", form: 2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, - 33: {locales: "ksh", form: 0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 34: {locales: "iu kw naq se sma smi smj smn sms", form: 2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, - 35: {locales: "iu kw naq se sma smi smj smn sms", form: 3, integer: []string{"2"}, decimal: []string{"2.0", "2.00", "2.000", "2.0000"}}, - 36: {locales: "iu kw naq se sma smi smj smn sms", form: 0, integer: []string{"0", "3~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~0.9", "1.1~1.6", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 37: {locales: "shi", form: 2, integer: []string{"0", "1"}, decimal: []string{"0.0~1.0", "0.00~0.04"}}, - 38: {locales: "shi", form: 4, integer: []string{"2~10"}, decimal: []string{"2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "2.00", "3.00", "4.00", "5.00", "6.00", "7.00", "8.00"}}, - 39: {locales: "shi", form: 0, integer: []string{"11~26", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"1.1~1.9", "2.1~2.7", "10.1", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 40: {locales: "mo ro", form: 2, integer: []string{"1"}, decimal: []string(nil)}, - 41: {locales: "mo ro", form: 4, integer: []string{"0", "2~16", "101", "1001"}, decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 42: {locales: "mo ro", form: 0, integer: []string{"20~35", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 43: {locales: "bs hr sh sr", form: 2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string{"0.1", "1.1", "2.1", "3.1", "4.1", "5.1", "6.1", "7.1", "10.1", "100.1", "1000.1"}}, - 44: {locales: "bs hr sh sr", form: 4, integer: []string{"2~4", "22~24", "32~34", "42~44", "52~54", "62", "102", "1002"}, decimal: []string{"0.2~0.4", "1.2~1.4", "2.2~2.4", "3.2~3.4", "4.2~4.4", "5.2", "10.2", "100.2", "1000.2"}}, - 45: {locales: "bs hr sh sr", form: 0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "0.5~1.0", "1.5~2.0", "2.5~2.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 46: {locales: "gd", form: 2, integer: []string{"1", "11"}, decimal: []string{"1.0", "11.0", "1.00", "11.00", "1.000", "11.000", "1.0000"}}, - 47: {locales: "gd", form: 3, integer: []string{"2", "12"}, decimal: []string{"2.0", "12.0", "2.00", "12.00", "2.000", "12.000", "2.0000"}}, - 48: {locales: "gd", form: 4, integer: []string{"3~10", "13~19"}, decimal: []string{"3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "13.0", "14.0", "15.0", "16.0", "17.0", "18.0", "19.0", "3.00"}}, - 49: {locales: "gd", form: 0, integer: []string{"0", "20~34", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~0.9", "1.1~1.6", "10.1", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 50: {locales: "sl", form: 2, integer: []string{"1", "101", "201", "301", "401", "501", "601", "701", "1001"}, decimal: []string(nil)}, - 51: {locales: "sl", form: 3, integer: []string{"2", "102", "202", "302", "402", "502", "602", "702", "1002"}, decimal: []string(nil)}, - 52: {locales: "sl", form: 4, integer: []string{"3", "4", "103", "104", "203", "204", "303", "304", "403", "404", "503", "504", "603", "604", "703", "704", "1003"}, decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 53: {locales: "sl", form: 0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 54: {locales: "dsb hsb", form: 2, integer: []string{"1", "101", "201", "301", "401", "501", "601", "701", "1001"}, decimal: []string{"0.1", "1.1", "2.1", "3.1", "4.1", "5.1", "6.1", "7.1", "10.1", "100.1", "1000.1"}}, - 55: {locales: "dsb hsb", form: 3, integer: []string{"2", "102", "202", "302", "402", "502", "602", "702", "1002"}, decimal: []string{"0.2", "1.2", "2.2", "3.2", "4.2", "5.2", "6.2", "7.2", "10.2", "100.2", "1000.2"}}, - 56: {locales: "dsb hsb", form: 4, integer: []string{"3", "4", "103", "104", "203", "204", "303", "304", "403", "404", "503", "504", "603", "604", "703", "704", "1003"}, decimal: []string{"0.3", "0.4", "1.3", "1.4", "2.3", "2.4", "3.3", "3.4", "4.3", "4.4", "5.3", "5.4", "6.3", "6.4", "7.3", "7.4", "10.3", "100.3", "1000.3"}}, - 57: {locales: "dsb hsb", form: 0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "0.5~1.0", "1.5~2.0", "2.5~2.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 58: {locales: "he iw", form: 2, integer: []string{"1"}, decimal: []string(nil)}, - 59: {locales: "he iw", form: 3, integer: []string{"2"}, decimal: []string(nil)}, - 60: {locales: "he iw", form: 5, integer: []string{"20", "30", "40", "50", "60", "70", "80", "90", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 61: {locales: "he iw", form: 0, integer: []string{"0", "3~17", "101", "1001"}, decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 62: {locales: "cs sk", form: 2, integer: []string{"1"}, decimal: []string(nil)}, - 63: {locales: "cs sk", form: 4, integer: []string{"2~4"}, decimal: []string(nil)}, - 64: {locales: "cs sk", form: 5, integer: []string(nil), decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 65: {locales: "cs sk", form: 0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 66: {locales: "pl", form: 2, integer: []string{"1"}, decimal: []string(nil)}, - 67: {locales: "pl", form: 4, integer: []string{"2~4", "22~24", "32~34", "42~44", "52~54", "62", "102", "1002"}, decimal: []string(nil)}, - 68: {locales: "pl", form: 5, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 69: {locales: "pl", form: 0, integer: []string(nil), decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 70: {locales: "be", form: 2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string{"1.0", "21.0", "31.0", "41.0", "51.0", "61.0", "71.0", "81.0", "101.0", "1001.0"}}, - 71: {locales: "be", form: 4, integer: []string{"2~4", "22~24", "32~34", "42~44", "52~54", "62", "102", "1002"}, decimal: []string{"2.0", "3.0", "4.0", "22.0", "23.0", "24.0", "32.0", "33.0", "102.0", "1002.0"}}, - 72: {locales: "be", form: 5, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "11.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 73: {locales: "be", form: 0, integer: []string(nil), decimal: []string{"0.1~0.9", "1.1~1.7", "10.1", "100.1", "1000.1"}}, - 74: {locales: "lt", form: 2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string{"1.0", "21.0", "31.0", "41.0", "51.0", "61.0", "71.0", "81.0", "101.0", "1001.0"}}, - 75: {locales: "lt", form: 4, integer: []string{"2~9", "22~29", "102", "1002"}, decimal: []string{"2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0", "22.0", "102.0", "1002.0"}}, - 76: {locales: "lt", form: 5, integer: []string(nil), decimal: []string{"0.1~0.9", "1.1~1.7", "10.1", "100.1", "1000.1"}}, - 77: {locales: "lt", form: 0, integer: []string{"0", "10~20", "30", "40", "50", "60", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 78: {locales: "mt", form: 2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, - 79: {locales: "mt", form: 4, integer: []string{"0", "2~10", "102~107", "1002"}, decimal: []string{"0.0", "2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "10.0", "102.0", "1002.0"}}, - 80: {locales: "mt", form: 5, integer: []string{"11~19", "111~117", "1011"}, decimal: []string{"11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "17.0", "18.0", "111.0", "1011.0"}}, - 81: {locales: "mt", form: 0, integer: []string{"20~35", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.1", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 82: {locales: "ru uk", form: 2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string(nil)}, - 83: {locales: "ru uk", form: 4, integer: []string{"2~4", "22~24", "32~34", "42~44", "52~54", "62", "102", "1002"}, decimal: []string(nil)}, - 84: {locales: "ru uk", form: 5, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 85: {locales: "ru uk", form: 0, integer: []string(nil), decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 86: {locales: "br", form: 2, integer: []string{"1", "21", "31", "41", "51", "61", "81", "101", "1001"}, decimal: []string{"1.0", "21.0", "31.0", "41.0", "51.0", "61.0", "81.0", "101.0", "1001.0"}}, - 87: {locales: "br", form: 3, integer: []string{"2", "22", "32", "42", "52", "62", "82", "102", "1002"}, decimal: []string{"2.0", "22.0", "32.0", "42.0", "52.0", "62.0", "82.0", "102.0", "1002.0"}}, - 88: {locales: "br", form: 4, integer: []string{"3", "4", "9", "23", "24", "29", "33", "34", "39", "43", "44", "49", "103", "1003"}, decimal: []string{"3.0", "4.0", "9.0", "23.0", "24.0", "29.0", "33.0", "34.0", "103.0", "1003.0"}}, - 89: {locales: "br", form: 5, integer: []string{"1000000"}, decimal: []string{"1000000.0", "1000000.00", "1000000.000"}}, - 90: {locales: "br", form: 0, integer: []string{"0", "5~8", "10~20", "100", "1000", "10000", "100000"}, decimal: []string{"0.0~0.9", "1.1~1.6", "10.0", "100.0", "1000.0", "10000.0", "100000.0"}}, - 91: {locales: "ga", form: 2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, - 92: {locales: "ga", form: 3, integer: []string{"2"}, decimal: []string{"2.0", "2.00", "2.000", "2.0000"}}, - 93: {locales: "ga", form: 4, integer: []string{"3~6"}, decimal: []string{"3.0", "4.0", "5.0", "6.0", "3.00", "4.00", "5.00", "6.00", "3.000", "4.000", "5.000", "6.000", "3.0000", "4.0000", "5.0000", "6.0000"}}, - 94: {locales: "ga", form: 5, integer: []string{"7~10"}, decimal: []string{"7.0", "8.0", "9.0", "10.0", "7.00", "8.00", "9.00", "10.00", "7.000", "8.000", "9.000", "10.000", "7.0000", "8.0000", "9.0000", "10.0000"}}, - 95: {locales: "ga", form: 0, integer: []string{"0", "11~25", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~0.9", "1.1~1.6", "10.1", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 96: {locales: "gv", form: 2, integer: []string{"1", "11", "21", "31", "41", "51", "61", "71", "101", "1001"}, decimal: []string(nil)}, - 97: {locales: "gv", form: 3, integer: []string{"2", "12", "22", "32", "42", "52", "62", "72", "102", "1002"}, decimal: []string(nil)}, - 98: {locales: "gv", form: 4, integer: []string{"0", "20", "40", "60", "80", "100", "120", "140", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, - 99: {locales: "gv", form: 5, integer: []string(nil), decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 100: {locales: "gv", form: 0, integer: []string{"3~10", "13~19", "23", "103", "1003"}, decimal: []string(nil)}, - 101: {locales: "ar ars", form: 1, integer: []string{"0"}, decimal: []string{"0.0", "0.00", "0.000", "0.0000"}}, - 102: {locales: "ar ars", form: 2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, - 103: {locales: "ar ars", form: 3, integer: []string{"2"}, decimal: []string{"2.0", "2.00", "2.000", "2.0000"}}, - 104: {locales: "ar ars", form: 4, integer: []string{"3~10", "103~110", "1003"}, decimal: []string{"3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "103.0", "1003.0"}}, - 105: {locales: "ar ars", form: 5, integer: []string{"11~26", "111", "1011"}, decimal: []string{"11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "17.0", "18.0", "111.0", "1011.0"}}, - 106: {locales: "ar ars", form: 0, integer: []string{"100~102", "200~202", "300~302", "400~402", "500~502", "600", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.1", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, - 107: {locales: "cy", form: 1, integer: []string{"0"}, decimal: []string{"0.0", "0.00", "0.000", "0.0000"}}, - 108: {locales: "cy", form: 2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, - 109: {locales: "cy", form: 3, integer: []string{"2"}, decimal: []string{"2.0", "2.00", "2.000", "2.0000"}}, - 110: {locales: "cy", form: 4, integer: []string{"3"}, decimal: []string{"3.0", "3.00", "3.000", "3.0000"}}, - 111: {locales: "cy", form: 5, integer: []string{"6"}, decimal: []string{"6.0", "6.00", "6.000", "6.0000"}}, - 112: {locales: "cy", form: 0, integer: []string{"4", "5", "7~20", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, -} // Size: 8160 bytes - -// Total table size 12432 bytes (12KiB); checksum: 166DAB71 diff --git a/vendor/golang.org/x/text/feature/plural/example_test.go b/vendor/golang.org/x/text/feature/plural/example_test.go deleted file mode 100644 index c75408c0e..000000000 --- a/vendor/golang.org/x/text/feature/plural/example_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package plural_test - -import ( - "golang.org/x/text/feature/plural" - "golang.org/x/text/language" - "golang.org/x/text/message" -) - -func ExampleSelect() { - // Manually set some translations. This is typically done programmatically. - message.Set(language.English, "%d files remaining", - plural.Selectf(1, "%d", - "=0", "done!", - plural.One, "one file remaining", - plural.Other, "%[1]d files remaining", - )) - message.Set(language.Dutch, "%d files remaining", - plural.Selectf(1, "%d", - "=0", "klaar!", - // One can also use a string instead of a Kind - "one", "nog één bestand te gaan", - "other", "nog %[1]d bestanden te gaan", - )) - - p := message.NewPrinter(language.English) - p.Printf("%d files remaining", 5) - p.Println() - p.Printf("%d files remaining", 1) - p.Println() - - p = message.NewPrinter(language.Dutch) - p.Printf("%d files remaining", 1) - p.Println() - p.Printf("%d files remaining", 0) - p.Println() - - // Output: - // 5 files remaining - // one file remaining - // nog één bestand te gaan - // klaar! -} diff --git a/vendor/golang.org/x/text/feature/plural/gen.go b/vendor/golang.org/x/text/feature/plural/gen.go deleted file mode 100644 index a0de986a2..000000000 --- a/vendor/golang.org/x/text/feature/plural/gen.go +++ /dev/null @@ -1,513 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This file generates data for the CLDR plural rules, as defined in -// http://unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules -// -// We assume a slightly simplified grammar: -// -// condition = and_condition ('or' and_condition)* samples -// and_condition = relation ('and' relation)* -// relation = expr ('=' | '!=') range_list -// expr = operand ('%' '10' '0'* )? -// operand = 'n' | 'i' | 'f' | 't' | 'v' | 'w' -// range_list = (range | value) (',' range_list)* -// range = value'..'value -// value = digit+ -// digit = 0|1|2|3|4|5|6|7|8|9 -// -// samples = ('@integer' sampleList)? -// ('@decimal' sampleList)? -// sampleList = sampleRange (',' sampleRange)* (',' ('…'|'...'))? -// sampleRange = decimalValue ('~' decimalValue)? -// decimalValue = value ('.' value)? -// -// Symbol Value -// 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. -// -// The algorithm for which the data is generated is based on the following -// observations -// -// - the number of different sets of numbers which the plural rules use to -// test inclusion is limited, -// - most numbers that are tested on are < 100 -// -// This allows us to define a bitmap for each number < 100 where a bit i -// indicates whether this number is included in some defined set i. -// The function matchPlural in plural.go defines how we can subsequently use -// this data to determine inclusion. -// -// There are a few languages for which this doesn't work. For one Italian and -// Azerbaijan, which both test against numbers > 100 for ordinals and Breton, -// which considers whether numbers are multiples of hundreds. The model here -// could be extended to handle Italian and Azerbaijan fairly easily (by -// considering the numbers 100, 200, 300, ..., 800, 900 in addition to the first -// 100), but for now it seems easier to just hard-code these cases. - -import ( - "bufio" - "bytes" - "flag" - "fmt" - "log" - "strconv" - "strings" - - "golang.org/x/text/internal" - "golang.org/x/text/internal/gen" - "golang.org/x/text/language" - "golang.org/x/text/unicode/cldr" -) - -var ( - test = flag.Bool("test", false, - "test existing tables; can be used to compare web data with package data.") - outputFile = flag.String("output", "tables.go", "output file") - outputTestFile = flag.String("testoutput", "data_test.go", "output file") - - draft = flag.String("draft", - "contributed", - `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) -) - -func main() { - gen.Init() - - const pkg = "plural" - - gen.Repackage("gen_common.go", "common.go", pkg) - // Read the CLDR zip file. - r := gen.OpenCLDRCoreZip() - defer r.Close() - - d := &cldr.Decoder{} - d.SetDirFilter("supplemental", "main") - d.SetSectionFilter("numbers", "plurals") - data, err := d.DecodeZip(r) - if err != nil { - log.Fatalf("DecodeZip: %v", err) - } - - w := gen.NewCodeWriter() - defer w.WriteGoFile(*outputFile, pkg) - - gen.WriteCLDRVersion(w) - - genPlurals(w, data) - - w = gen.NewCodeWriter() - defer w.WriteGoFile(*outputTestFile, pkg) - - genPluralsTests(w, data) -} - -type pluralTest struct { - locales string // space-separated list of locales for this test - form int // Use int instead of Form to simplify generation. - integer []string // Entries of the form \d+ or \d+~\d+ - decimal []string // Entries of the form \f+ or \f+ +~\f+, where f is \d+\.\d+ -} - -func genPluralsTests(w *gen.CodeWriter, data *cldr.CLDR) { - w.WriteType(pluralTest{}) - - for _, plurals := range data.Supplemental().Plurals { - if plurals.Type == "" { - // The empty type is reserved for plural ranges. - continue - } - tests := []pluralTest{} - - for _, pRules := range plurals.PluralRules { - for _, rule := range pRules.PluralRule { - test := pluralTest{ - locales: pRules.Locales, - form: int(countMap[rule.Count]), - } - scan := bufio.NewScanner(strings.NewReader(rule.Data())) - scan.Split(splitTokens) - var p *[]string - for scan.Scan() { - switch t := scan.Text(); t { - case "@integer": - p = &test.integer - case "@decimal": - p = &test.decimal - case ",", "…": - default: - if p != nil { - *p = append(*p, t) - } - } - } - tests = append(tests, test) - } - } - w.WriteVar(plurals.Type+"Tests", tests) - } -} - -func genPlurals(w *gen.CodeWriter, data *cldr.CLDR) { - for _, plurals := range data.Supplemental().Plurals { - if plurals.Type == "" { - continue - } - // Initialize setMap and inclusionMasks. They are already populated with - // a few entries to serve as an example and to assign nice numbers to - // common cases. - - // setMap contains sets of numbers represented by boolean arrays where - // a true value for element i means that the number i is included. - setMap := map[[numN]bool]int{ - // The above init func adds an entry for including all numbers. - [numN]bool{1: true}: 1, // fix {1} to a nice value - [numN]bool{2: true}: 2, // fix {2} to a nice value - [numN]bool{0: true}: 3, // fix {0} to a nice value - } - - // inclusionMasks contains bit masks for every number under numN to - // indicate in which set the number is included. Bit 1 << x will be set - // if it is included in set x. - inclusionMasks := [numN]uint64{ - // Note: these entries are not complete: more bits will be set along the way. - 0: 1 << 3, - 1: 1 << 1, - 2: 1 << 2, - } - - // Create set {0..99}. We will assign this set the identifier 0. - var all [numN]bool - for i := range all { - // Mark number i as being included in the set (which has identifier 0). - inclusionMasks[i] |= 1 << 0 - // Mark number i as included in the set. - all[i] = true - } - // Register the identifier for the set. - setMap[all] = 0 - - rules := []pluralCheck{} - index := []byte{0} - langMap := map[int]byte{0: 0} // From compact language index to index - - for _, pRules := range plurals.PluralRules { - // Parse the rules. - var conds []orCondition - for _, rule := range pRules.PluralRule { - form := countMap[rule.Count] - conds = parsePluralCondition(conds, rule.Data(), form) - } - // Encode the rules. - for _, c := range conds { - // If an or condition only has filters, we create an entry for - // this filter and the set that contains all values. - empty := true - for _, b := range c.used { - empty = empty && !b - } - if empty { - rules = append(rules, pluralCheck{ - cat: byte(opMod<<opShift) | byte(c.form), - setID: 0, // all values - }) - continue - } - // We have some entries with values. - for i, set := range c.set { - if !c.used[i] { - continue - } - index, ok := setMap[set] - if !ok { - index = len(setMap) - setMap[set] = index - for i := range inclusionMasks { - if set[i] { - inclusionMasks[i] |= 1 << uint64(index) - } - } - } - rules = append(rules, pluralCheck{ - cat: byte(i<<opShift | andNext), - setID: byte(index), - }) - } - // Now set the last entry to the plural form the rule matches. - rules[len(rules)-1].cat &^= formMask - rules[len(rules)-1].cat |= byte(c.form) - } - // Point the relevant locales to the created entries. - for _, loc := range strings.Split(pRules.Locales, " ") { - if strings.TrimSpace(loc) == "" { - continue - } - lang, ok := language.CompactIndex(language.MustParse(loc)) - if !ok { - log.Printf("No compact index for locale %q", loc) - } - langMap[lang] = byte(len(index) - 1) - } - index = append(index, byte(len(rules))) - } - w.WriteVar(plurals.Type+"Rules", rules) - w.WriteVar(plurals.Type+"Index", index) - // Expand the values. - langToIndex := make([]byte, language.NumCompactTags) - for i := range langToIndex { - for p := i; ; p = int(internal.Parent[p]) { - if x, ok := langMap[p]; ok { - langToIndex[i] = x - break - } - } - } - w.WriteVar(plurals.Type+"LangToIndex", langToIndex) - // Need to convert array to slice because of golang.org/issue/7651. - // This will allow tables to be dropped when unused. This is especially - // relevant for the ordinal data, which I suspect won't be used as much. - w.WriteVar(plurals.Type+"InclusionMasks", inclusionMasks[:]) - - if len(rules) > 0xFF { - log.Fatalf("Too many entries for rules: %#x", len(rules)) - } - if len(index) > 0xFF { - log.Fatalf("Too many entries for index: %#x", len(index)) - } - if len(setMap) > 64 { // maximum number of bits. - log.Fatalf("Too many entries for setMap: %d", len(setMap)) - } - w.WriteComment( - "Slots used for %s: %X of 0xFF rules; %X of 0xFF indexes; %d of 64 sets", - plurals.Type, len(rules), len(index), len(setMap)) - // Prevent comment from attaching to the next entry. - fmt.Fprint(w, "\n\n") - } -} - -type orCondition struct { - original string // for debugging - - form Form - used [32]bool - set [32][numN]bool -} - -func (o *orCondition) add(op opID, mod int, v []int) (ok bool) { - ok = true - for _, x := range v { - if x >= maxMod { - ok = false - break - } - } - for i := 0; i < numN; i++ { - m := i - if mod != 0 { - m = i % mod - } - if !intIn(m, v) { - o.set[op][i] = false - } - } - if ok { - o.used[op] = true - } - return ok -} - -func intIn(x int, a []int) bool { - for _, y := range a { - if x == y { - return true - } - } - return false -} - -var operandIndex = map[string]opID{ - "i": opI, - "n": opN, - "f": opF, - "v": opV, - "w": opW, -} - -// parsePluralCondition parses the condition of a single pluralRule and appends -// the resulting or conditions to conds. -// -// Example rules: -// // Category "one" in English: only allow 1 with no visible fraction -// i = 1 and v = 0 @integer 1 -// -// // Category "few" in Czech: all numbers with visible fractions -// v != 0 @decimal ... -// -// // Category "zero" in Latvian: all multiples of 10 or the numbers 11-19 or -// // numbers with a fraction 11..19 and no trailing zeros. -// n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19 @integer ... -// -// @integer and @decimal are followed by examples and are not relevant for the -// rule itself. The are used here to signal the termination of the rule. -func parsePluralCondition(conds []orCondition, s string, f Form) []orCondition { - scan := bufio.NewScanner(strings.NewReader(s)) - scan.Split(splitTokens) - for { - cond := orCondition{original: s, form: f} - // Set all numbers to be allowed for all number classes and restrict - // from here on. - for i := range cond.set { - for j := range cond.set[i] { - cond.set[i][j] = true - } - } - andLoop: - for { - var token string - scan.Scan() // Must exist. - switch class := scan.Text(); class { - case "t": - class = "w" // equal to w for t == 0 - fallthrough - case "n", "i", "f", "v", "w": - op := scanToken(scan) - opCode := operandIndex[class] - mod := 0 - if op == "%" { - opCode |= opMod - - switch v := scanUint(scan); v { - case 10, 100: - mod = v - case 1000: - // A more general solution would be to allow checking - // against multiples of 100 and include entries for the - // numbers 100..900 in the inclusion masks. At the - // moment this would only help Azerbaijan and Italian. - - // Italian doesn't use '%', so this must be Azerbaijan. - cond.used[opAzerbaijan00s] = true - return append(conds, cond) - - case 1000000: - cond.used[opBretonM] = true - return append(conds, cond) - - default: - log.Fatalf("Modulo value not supported %d", v) - } - op = scanToken(scan) - } - if op != "=" && op != "!=" { - log.Fatalf("Unexpected op %q", op) - } - if op == "!=" { - opCode |= opNotEqual - } - a := []int{} - v := scanUint(scan) - if class == "w" && v != 0 { - log.Fatalf("Must compare against zero for operand type %q", class) - } - token = scanToken(scan) - for { - switch token { - case "..": - end := scanUint(scan) - for ; v <= end; v++ { - a = append(a, v) - } - token = scanToken(scan) - default: // ",", "or", "and", "@..." - a = append(a, v) - } - if token != "," { - break - } - v = scanUint(scan) - token = scanToken(scan) - } - if !cond.add(opCode, mod, a) { - // Detected large numbers. As we ruled out Azerbaijan, this - // must be the many rule for Italian ordinals. - cond.set[opItalian800] = cond.set[opN] - cond.used[opItalian800] = true - } - - case "@integer", "@decimal": // "other" entry: tests only. - return conds - default: - log.Fatalf("Unexpected operand class %q (%s)", class, s) - } - switch token { - case "or": - conds = append(conds, cond) - break andLoop - case "@integer", "@decimal": // examples - // There is always an example in practice, so we always terminate here. - if err := scan.Err(); err != nil { - log.Fatal(err) - } - return append(conds, cond) - case "and": - // keep accumulating - default: - log.Fatalf("Unexpected token %q", token) - } - } - } -} - -func scanToken(scan *bufio.Scanner) string { - scan.Scan() - return scan.Text() -} - -func scanUint(scan *bufio.Scanner) int { - scan.Scan() - val, err := strconv.ParseUint(scan.Text(), 10, 32) - if err != nil { - log.Fatal(err) - } - return int(val) -} - -// splitTokens can be used with bufio.Scanner to tokenize CLDR plural rules. -func splitTokens(data []byte, atEOF bool) (advance int, token []byte, err error) { - condTokens := [][]byte{ - []byte(".."), - []byte(","), - []byte("!="), - []byte("="), - } - advance, token, err = bufio.ScanWords(data, atEOF) - for _, t := range condTokens { - if len(t) >= len(token) { - continue - } - switch p := bytes.Index(token, t); { - case p == -1: - case p == 0: - advance = len(t) - token = token[:len(t)] - return advance - len(token) + len(t), token[:len(t)], err - case p < advance: - // Don't split when "=" overlaps "!=". - if t[0] == '=' && token[p-1] == '!' { - continue - } - advance = p - token = token[:p] - } - } - return advance, token, err -} diff --git a/vendor/golang.org/x/text/feature/plural/gen_common.go b/vendor/golang.org/x/text/feature/plural/gen_common.go deleted file mode 100644 index 24aa41505..000000000 --- a/vendor/golang.org/x/text/feature/plural/gen_common.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// Form defines a plural form. -// -// Not all languages support all forms. Also, the meaning of each form varies -// per language. It is important to note that the name of a form does not -// necessarily correspond one-to-one with the set of numbers. For instance, -// for Croation, One matches not only 1, but also 11, 21, etc. -// -// Each language must at least support the form "other". -type Form byte - -const ( - Other Form = iota - Zero - One - Two - Few - Many -) - -var countMap = map[string]Form{ - "other": Other, - "zero": Zero, - "one": One, - "two": Two, - "few": Few, - "many": Many, -} - -type pluralCheck struct { - // category: - // 3..7: opID - // 0..2: category - cat byte - setID byte -} - -// opID identifies the type of operand in the plural rule, being i, n or f. -// (v, w, and t are treated as filters in our implementation.) -type opID byte - -const ( - opMod opID = 0x1 // is '%' used? - opNotEqual opID = 0x2 // using "!=" to compare - opI opID = 0 << 2 // integers after taking the absolute value - opN opID = 1 << 2 // full number (must be integer) - opF opID = 2 << 2 // fraction - opV opID = 3 << 2 // number of visible digits - opW opID = 4 << 2 // number of visible digits without trailing zeros - opBretonM opID = 5 << 2 // hard-wired rule for Breton - opItalian800 opID = 6 << 2 // hard-wired rule for Italian - opAzerbaijan00s opID = 7 << 2 // hard-wired rule for Azerbaijan -) -const ( - // Use this plural form to indicate the next rule needs to match as well. - // The last condition in the list will have the correct plural form. - andNext = 0x7 - formMask = 0x7 - - opShift = 3 - - // numN indicates the maximum integer, or maximum mod value, for which we - // have inclusion masks. - numN = 100 - // The common denominator of the modulo that is taken. - maxMod = 100 -) diff --git a/vendor/golang.org/x/text/feature/plural/message.go b/vendor/golang.org/x/text/feature/plural/message.go deleted file mode 100755 index 22f5a26d2..000000000 --- a/vendor/golang.org/x/text/feature/plural/message.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package plural - -import ( - "fmt" - "io/ioutil" - "reflect" - "strconv" - - "golang.org/x/text/internal/catmsg" - "golang.org/x/text/internal/number" - "golang.org/x/text/language" - "golang.org/x/text/message/catalog" -) - -// Interface is used for types that can determine their own plural form. -type Interface interface { - // PluralForm reports the plural form for the given language of the - // underlying value. It also returns the integer value. If the integer value - // is larger than fits in n, PluralForm may return a value modulo - // 10,000,000. - PluralForm(t language.Tag, scale int) (f Form, n int) -} - -// Selectf returns the first case for which its selector is a match for the -// arg-th substitution argument to a formatting call, formatting it as indicated -// by format. -// -// The cases argument are pairs of selectors and messages. Selectors are of type -// string or Form. Messages are of type string or catalog.Message. A selector -// matches an argument if: -// - it is "other" or Other -// - it matches the plural form of the argument: "zero", "one", "two", "few", -// or "many", or the equivalent Form -// - it is of the form "=x" where x is an integer that matches the value of -// the argument. -// - it is of the form "<x" where x is an integer that is larger than the -// argument. -// -// The format argument determines the formatting parameters for which to -// determine the plural form. This is especially relevant for non-integer -// values. -// -// The format string may be "", in which case a best-effort attempt is made to -// find a reasonable representation on which to base the plural form. Examples -// of format strings are: -// - %.2f decimal with scale 2 -// - %.2e scientific notation with precision 3 (scale + 1) -// - %d integer -func Selectf(arg int, format string, cases ...interface{}) catalog.Message { - var p parser - // Intercept the formatting parameters of format by doing a dummy print. - fmt.Fprintf(ioutil.Discard, format, &p) - m := &message{arg, kindDefault, 0, cases} - switch p.verb { - case 'g': - m.kind = kindPrecision - m.scale = p.scale - case 'f': - m.kind = kindScale - m.scale = p.scale - case 'e': - m.kind = kindScientific - m.scale = p.scale - case 'd': - m.kind = kindScale - m.scale = 0 - default: - // TODO: do we need to handle errors? - } - return m -} - -type parser struct { - verb rune - scale int -} - -func (p *parser) Format(s fmt.State, verb rune) { - p.verb = verb - p.scale = -1 - if prec, ok := s.Precision(); ok { - p.scale = prec - } -} - -type message struct { - arg int - kind int - scale int - cases []interface{} -} - -const ( - // Start with non-ASCII to allow skipping values. - kindDefault = 0x80 + iota - kindScale // verb f, number of fraction digits follows - kindScientific // verb e, number of fraction digits follows - kindPrecision // verb g, number of significant digits follows -) - -var handle = catmsg.Register("golang.org/x/text/feature/plural:plural", execute) - -func (m *message) Compile(e *catmsg.Encoder) error { - e.EncodeMessageType(handle) - - e.EncodeUint(uint64(m.arg)) - - e.EncodeUint(uint64(m.kind)) - if m.kind > kindDefault { - e.EncodeUint(uint64(m.scale)) - } - - forms := validForms(cardinal, e.Language()) - - for i := 0; i < len(m.cases); { - if err := compileSelector(e, forms, m.cases[i]); err != nil { - return err - } - if i++; i >= len(m.cases) { - return fmt.Errorf("plural: no message defined for selector %v", m.cases[i-1]) - } - var msg catalog.Message - switch x := m.cases[i].(type) { - case string: - msg = catalog.String(x) - case catalog.Message: - msg = x - default: - return fmt.Errorf("plural: message of type %T; must be string or catalog.Message", x) - } - if err := e.EncodeMessage(msg); err != nil { - return err - } - i++ - } - return nil -} - -func compileSelector(e *catmsg.Encoder, valid []Form, selector interface{}) error { - form := Other - switch x := selector.(type) { - case string: - if x == "" { - return fmt.Errorf("plural: empty selector") - } - if c := x[0]; c == '=' || c == '<' { - val, err := strconv.ParseUint(x[1:], 10, 16) - if err != nil { - return fmt.Errorf("plural: invalid number in selector %q: %v", selector, err) - } - e.EncodeUint(uint64(c)) - e.EncodeUint(val) - return nil - } - var ok bool - form, ok = countMap[x] - if !ok { - return fmt.Errorf("plural: invalid plural form %q", selector) - } - case Form: - form = x - default: - return fmt.Errorf("plural: selector of type %T; want string or Form", selector) - } - - ok := false - for _, f := range valid { - if f == form { - ok = true - break - } - } - if !ok { - return fmt.Errorf("plural: form %q not supported for language %q", selector, e.Language()) - } - e.EncodeUint(uint64(form)) - return nil -} - -func execute(d *catmsg.Decoder) bool { - lang := d.Language() - argN := int(d.DecodeUint()) - kind := int(d.DecodeUint()) - scale := -1 // default - if kind > kindDefault { - scale = int(d.DecodeUint()) - } - form := Other - n := -1 - if arg := d.Arg(argN); arg == nil { - // Default to Other. - } else if x, ok := arg.(Interface); ok { - // This covers lists and formatters from the number package. - form, n = x.PluralForm(lang, scale) - } else { - var f number.Formatter - switch kind { - case kindScale: - f.InitDecimal(lang) - f.SetScale(scale) - case kindScientific: - f.InitScientific(lang) - f.SetScale(scale) - case kindPrecision: - f.InitDecimal(lang) - f.SetPrecision(scale) - case kindDefault: - // sensible default - f.InitDecimal(lang) - if k := reflect.TypeOf(arg).Kind(); reflect.Int <= k && k <= reflect.Uintptr { - f.SetScale(0) - } else { - f.SetScale(2) - } - } - var dec number.Decimal // TODO: buffer in Printer - dec.Convert(f.RoundingContext, arg) - v := number.FormatDigits(&dec, f.RoundingContext) - if !v.NaN && !v.Inf { - form, n = cardinal.matchDisplayDigits(d.Language(), &v) - } - } - for !d.Done() { - f := d.DecodeUint() - if (f == '=' && n == int(d.DecodeUint())) || - (f == '<' && 0 <= n && n < int(d.DecodeUint())) || - form == Form(f) || - Other == Form(f) { - return d.ExecuteMessage() - } - d.SkipMessage() - } - return false -} diff --git a/vendor/golang.org/x/text/feature/plural/message_test.go b/vendor/golang.org/x/text/feature/plural/message_test.go deleted file mode 100644 index 1a89bd547..000000000 --- a/vendor/golang.org/x/text/feature/plural/message_test.go +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package plural - -import ( - "fmt" - "strings" - "testing" - - "golang.org/x/text/internal/catmsg" - "golang.org/x/text/language" - "golang.org/x/text/message/catalog" -) - -func TestSelect(t *testing.T) { - lang := language.English - type test struct { - arg interface{} - result string - err string - } - testCases := []struct { - desc string - msg catalog.Message - err string - tests []test - }{{ - desc: "basic", - msg: Selectf(1, "%d", "one", "foo", "other", "bar"), - tests: []test{ - {arg: 0, result: "bar"}, - {arg: 1, result: "foo"}, - {arg: 2, result: "bar"}, - {arg: opposite(1), result: "bar"}, - {arg: opposite(2), result: "foo"}, - {arg: "unknown", result: "bar"}, // other - }, - }, { - desc: "comparisons", - msg: Selectf(1, "%d", - "=0", "zero", - "=1", "one", - "one", "cannot match", // never matches - "<5", "<5", // never matches - "=5", "=5", - Other, "other"), - tests: []test{ - {arg: 0, result: "zero"}, - {arg: 1, result: "one"}, - {arg: 2, result: "<5"}, - {arg: 4, result: "<5"}, - {arg: 5, result: "=5"}, - {arg: 6, result: "other"}, - {arg: "unknown", result: "other"}, - }, - }, { - desc: "fractions", - msg: Selectf(1, "%.2f", "one", "foo", "other", "bar"), - tests: []test{ - // fractions are always plural in english - {arg: 0, result: "bar"}, - {arg: 1, result: "bar"}, - }, - }, { - desc: "decimal without fractions", - msg: Selectf(1, "%.of", "one", "foo", "other", "bar"), - tests: []test{ - // fractions are always plural in english - {arg: 0, result: "bar"}, - {arg: 1, result: "foo"}, - }, - }, { - desc: "scientific", - msg: Selectf(1, "%.0e", "one", "foo", "other", "bar"), - tests: []test{ - {arg: 0, result: "bar"}, - {arg: 1, result: "foo"}, - }, - }, { - desc: "variable", - msg: Selectf(1, "%.1g", "one", "foo", "other", "bar"), - tests: []test{ - // fractions are always plural in english - {arg: 0, result: "bar"}, - {arg: 1, result: "foo"}, - {arg: 2, result: "bar"}, - }, - }, { - desc: "default", - msg: Selectf(1, "", "one", "foo", "other", "bar"), - tests: []test{ - {arg: 0, result: "bar"}, - {arg: 1, result: "foo"}, - {arg: 2, result: "bar"}, - {arg: 1.0, result: "bar"}, - }, - }, { - desc: "nested", - msg: Selectf(1, "", "other", Selectf(2, "", "one", "foo", "other", "bar")), - tests: []test{ - {arg: 0, result: "bar"}, - {arg: 1, result: "foo"}, - {arg: 2, result: "bar"}, - }, - }, { - desc: "arg unavailable", - msg: Selectf(100, "%.2f", "one", "foo", "other", "bar"), - tests: []test{{arg: 1, result: "bar"}}, - }, { - desc: "no match", - msg: Selectf(1, "%.2f", "one", "foo"), - tests: []test{{arg: 0, result: "bar", err: catmsg.ErrNoMatch.Error()}}, - }, { - desc: "error invalid form", - err: `invalid plural form "excessive"`, - msg: Selectf(1, "%d", "excessive", "foo"), - }, { - desc: "error form not used by language", - err: `form "many" not supported for language "en"`, - msg: Selectf(1, "%d", "many", "foo"), - }, { - desc: "error invalid selector", - err: `selector of type int; want string or Form`, - msg: Selectf(1, "%d", 1, "foo"), - }, { - desc: "error missing message", - err: `no message defined for selector one`, - msg: Selectf(1, "%d", "one"), - }, { - desc: "error invalid number", - err: `invalid number in selector "<1.00"`, - msg: Selectf(1, "%d", "<1.00"), - }, { - desc: "error empty selector", - err: `empty selector`, - msg: Selectf(1, "%d", "", "foo"), - }, { - desc: "error invalid message", - err: `message of type int; must be string or catalog.Message`, - msg: Selectf(1, "%d", "one", 3), - }, { - desc: "nested error", - err: `empty selector`, - msg: Selectf(1, "", "other", Selectf(2, "", "")), - }} - for _, tc := range testCases { - t.Run(tc.desc, func(t *testing.T) { - data, err := catmsg.Compile(lang, nil, tc.msg) - chkError(t, err, tc.err) - for _, tx := range tc.tests { - t.Run(fmt.Sprint(tx.arg), func(t *testing.T) { - r := renderer{arg: tx.arg} - d := catmsg.NewDecoder(lang, &r, nil) - err := d.Execute(data) - chkError(t, err, tx.err) - if r.result != tx.result { - t.Errorf("got %q; want %q", r.result, tx.result) - } - }) - } - }) - } -} - -func chkError(t *testing.T, got error, want string) { - if (got == nil && want != "") || - (got != nil && (want == "" || !strings.Contains(got.Error(), want))) { - t.Fatalf("got %v; want %v", got, want) - } - if got != nil { - t.SkipNow() - } -} - -type renderer struct { - arg interface{} - result string -} - -func (r *renderer) Render(s string) { r.result += s } -func (r *renderer) Arg(i int) interface{} { - if i > 10 { // Allow testing "arg unavailable" path - return nil - } - return r.arg -} - -type opposite int - -func (o opposite) PluralForm(lang language.Tag, scale int) (Form, int) { - if o == 1 { - return Other, 1 - } - return One, int(o) -} diff --git a/vendor/golang.org/x/text/feature/plural/plural.go b/vendor/golang.org/x/text/feature/plural/plural.go deleted file mode 100644 index 61faf187d..000000000 --- a/vendor/golang.org/x/text/feature/plural/plural.go +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go gen_common.go - -// Package plural provides utilities for handling linguistic plurals in text. -// -// The definitions in this package are based on the plural rule handling defined -// in CLDR. See -// http://unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules for -// details. -package plural - -import ( - "golang.org/x/text/internal/number" - "golang.org/x/text/language" -) - -// Rules defines the plural rules for all languages for a certain plural type. -// -// -// This package is UNDER CONSTRUCTION and its API may change. -type Rules struct { - rules []pluralCheck - index []byte - langToIndex []byte - inclusionMasks []uint64 -} - -var ( - // Cardinal defines the plural rules for numbers indicating quantities. - Cardinal *Rules = cardinal - - // Ordinal defines the plural rules for numbers indicating position - // (first, second, etc.). - Ordinal *Rules = ordinal - - ordinal = &Rules{ - ordinalRules, - ordinalIndex, - ordinalLangToIndex, - ordinalInclusionMasks[:], - } - - cardinal = &Rules{ - cardinalRules, - cardinalIndex, - cardinalLangToIndex, - cardinalInclusionMasks[:], - } -) - -// getIntApprox converts the digits in slice digits[start:end] to an integer -// according to the following rules: -// - Let i be asInt(digits[start:end]), where out-of-range digits are assumed -// to be zero. -// - Result n is big if i / 10^nMod > 1. -// - Otherwise the result is i % 10^nMod. -// -// For example, if digits is {1, 2, 3} and start:end is 0:5, then the result -// for various values of nMod is: -// - when nMod == 2, n == big -// - when nMod == 3, n == big -// - when nMod == 4, n == big -// - when nMod == 5, n == 12300 -// - when nMod == 6, n == 12300 -// - when nMod == 7, n == 12300 -func getIntApprox(digits []byte, start, end, nMod, big int) (n int) { - // Leading 0 digits just result in 0. - p := start - if p < 0 { - p = 0 - } - // Range only over the part for which we have digits. - mid := end - if mid >= len(digits) { - mid = len(digits) - } - // Check digits more significant that nMod. - if q := end - nMod; q > 0 { - if q > mid { - q = mid - } - for ; p < q; p++ { - if digits[p] != 0 { - return big - } - } - } - for ; p < mid; p++ { - n = 10*n + int(digits[p]) - } - // Multiply for trailing zeros. - for ; p < end; p++ { - n *= 10 - } - return n -} - -// MatchDigits computes the plural form for the given language and the given -// decimal floating point digits. The digits are stored in big-endian order and -// are of value byte(0) - byte(9). The floating point position is indicated by -// exp and the number of visible decimals is scale. All leading and trailing -// zeros may be omitted from digits. -// -// The following table contains examples of possible arguments to represent -// the given numbers. -// decimal digits exp scale -// 123 []byte{1, 2, 3} 3 0 -// 123.4 []byte{1, 2, 3, 4} 3 1 -// 123.40 []byte{1, 2, 3, 4} 3 2 -// 100000 []byte{1} 6 0 -// 100000.00 []byte{1} 6 3 -func (p *Rules) MatchDigits(t language.Tag, digits []byte, exp, scale int) Form { - index, _ := language.CompactIndex(t) - - // Differentiate up to including mod 1000000 for the integer part. - n := getIntApprox(digits, 0, exp, 6, 1000000) - - // Differentiate up to including mod 100 for the fractional part. - f := getIntApprox(digits, exp, exp+scale, 2, 100) - - return matchPlural(p, index, n, f, scale) -} - -func (p *Rules) matchDisplayDigits(t language.Tag, d *number.Digits) (Form, int) { - n := getIntApprox(d.Digits, 0, int(d.Exp), 6, 1000000) - return p.MatchDigits(t, d.Digits, int(d.Exp), d.NumFracDigits()), n -} - -func validForms(p *Rules, t language.Tag) (forms []Form) { - index, _ := language.CompactIndex(t) - offset := p.langToIndex[index] - rules := p.rules[p.index[offset]:p.index[offset+1]] - - forms = append(forms, Other) - last := Other - for _, r := range rules { - if cat := Form(r.cat & formMask); cat != andNext && last != cat { - forms = append(forms, cat) - last = cat - } - } - return forms -} - -func (p *Rules) matchComponents(t language.Tag, n, f, scale int) Form { - index, _ := language.CompactIndex(t) - return matchPlural(p, index, n, f, scale) -} - -// MatchPlural returns the plural form for the given language and plural -// operands (as defined in -// http://unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules): -// where -// n absolute value of the source number (integer and decimals) -// input -// 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 (f = t * 10^(v-w)) -// t visible fractional digits in n, without trailing zeros. -// -// If any of the operand values is too large to fit in an int, it is okay to -// pass the value modulo 10,000,000. -func (p *Rules) MatchPlural(lang language.Tag, i, v, w, f, t int) Form { - index, _ := language.CompactIndex(lang) - return matchPlural(p, index, i, f, v) -} - -func matchPlural(p *Rules, index int, n, f, v int) Form { - nMask := p.inclusionMasks[n%maxMod] - // Compute the fMask inline in the rules below, as it is relatively rare. - // fMask := p.inclusionMasks[f%maxMod] - vMask := p.inclusionMasks[v%maxMod] - - // Do the matching - offset := p.langToIndex[index] - rules := p.rules[p.index[offset]:p.index[offset+1]] - for i := 0; i < len(rules); i++ { - rule := rules[i] - setBit := uint64(1 << rule.setID) - var skip bool - switch op := opID(rule.cat >> opShift); op { - case opI: // i = x - skip = n >= numN || nMask&setBit == 0 - - case opI | opNotEqual: // i != x - skip = n < numN && nMask&setBit != 0 - - case opI | opMod: // i % m = x - skip = nMask&setBit == 0 - - case opI | opMod | opNotEqual: // i % m != x - skip = nMask&setBit != 0 - - case opN: // n = x - skip = f != 0 || n >= numN || nMask&setBit == 0 - - case opN | opNotEqual: // n != x - skip = f == 0 && n < numN && nMask&setBit != 0 - - case opN | opMod: // n % m = x - skip = f != 0 || nMask&setBit == 0 - - case opN | opMod | opNotEqual: // n % m != x - skip = f == 0 && nMask&setBit != 0 - - case opF: // f = x - skip = f >= numN || p.inclusionMasks[f%maxMod]&setBit == 0 - - case opF | opNotEqual: // f != x - skip = f < numN && p.inclusionMasks[f%maxMod]&setBit != 0 - - case opF | opMod: // f % m = x - skip = p.inclusionMasks[f%maxMod]&setBit == 0 - - case opF | opMod | opNotEqual: // f % m != x - skip = p.inclusionMasks[f%maxMod]&setBit != 0 - - case opV: // v = x - skip = v < numN && vMask&setBit == 0 - - case opV | opNotEqual: // v != x - skip = v < numN && vMask&setBit != 0 - - case opW: // w == 0 - skip = f != 0 - - case opW | opNotEqual: // w != 0 - skip = f == 0 - - // Hard-wired rules that cannot be handled by our algorithm. - - case opBretonM: - skip = f != 0 || n == 0 || n%1000000 != 0 - - case opAzerbaijan00s: - // 100,200,300,400,500,600,700,800,900 - skip = n == 0 || n >= 1000 || n%100 != 0 - - case opItalian800: - skip = (f != 0 || n >= numN || nMask&setBit == 0) && n != 800 - } - if skip { - // advance over AND entries. - for ; i < len(rules) && rules[i].cat&formMask == andNext; i++ { - } - continue - } - // return if we have a final entry. - if cat := rule.cat & formMask; cat != andNext { - return Form(cat) - } - } - return Other -} diff --git a/vendor/golang.org/x/text/feature/plural/plural_test.go b/vendor/golang.org/x/text/feature/plural/plural_test.go deleted file mode 100644 index b3cf4c449..000000000 --- a/vendor/golang.org/x/text/feature/plural/plural_test.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package plural - -import ( - "fmt" - "reflect" - "strconv" - "strings" - "testing" - - "golang.org/x/text/language" -) - -func TestGetIntApprox(t *testing.T) { - const big = 1234567890 - testCases := []struct { - digits string - start int - end int - nMod int - want int - }{ - {"123", 0, 1, 1, 1}, - {"123", 0, 2, 1, big}, - {"123", 0, 2, 2, 12}, - {"123", 3, 4, 2, 0}, - {"12345", 3, 4, 2, 4}, - {"40", 0, 1, 2, 4}, - {"1", 0, 7, 2, big}, - - {"123", 0, 5, 2, big}, - {"123", 0, 5, 3, big}, - {"123", 0, 5, 4, big}, - {"123", 0, 5, 5, 12300}, - {"123", 0, 5, 6, 12300}, - {"123", 0, 5, 7, 12300}, - - // Translation of examples in MatchDigits. - // Integer parts - {"123", 0, 3, 3, 123}, // 123 - {"1234", 0, 3, 3, 123}, // 123.4 - {"1", 0, 6, 8, 100000}, // 100000 - - // Fraction parts - {"123", 3, 3, 3, 0}, // 123 - {"1234", 3, 4, 3, 4}, // 123.4 - {"1234", 3, 5, 3, 40}, // 123.40 - {"1", 6, 8, 8, 0}, // 100000.00 - } - for _, tc := range testCases { - t.Run(fmt.Sprintf("%s:%d:%d/%d", tc.digits, tc.start, tc.end, tc.nMod), func(t *testing.T) { - got := getIntApprox(mkDigits(tc.digits), tc.start, tc.end, tc.nMod, big) - if got != tc.want { - t.Errorf("got %d; want %d", got, tc.want) - } - }) - } -} - -func mkDigits(s string) []byte { - b := []byte(s) - for i := range b { - b[i] -= '0' - } - return b -} - -func TestValidForms(t *testing.T) { - testCases := []struct { - tag language.Tag - want []Form - }{ - {language.AmericanEnglish, []Form{Other, One}}, - {language.Portuguese, []Form{Other, One}}, - {language.Latvian, []Form{Other, Zero, One}}, - {language.Arabic, []Form{Other, Zero, One, Two, Few, Many}}, - {language.Russian, []Form{Other, One, Few, Many}}, - } - for _, tc := range testCases { - got := validForms(cardinal, tc.tag) - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("validForms(%v): got %v; want %v", tc.tag, got, tc.want) - } - } -} - -func TestOrdinal(t *testing.T) { - testPlurals(t, Ordinal, ordinalTests) -} - -func TestCardinal(t *testing.T) { - testPlurals(t, Cardinal, cardinalTests) -} - -func testPlurals(t *testing.T, p *Rules, testCases []pluralTest) { - for _, tc := range testCases { - for _, loc := range strings.Split(tc.locales, " ") { - tag := language.MustParse(loc) - // Test integers - for _, s := range tc.integer { - a := strings.Split(s, "~") - from := parseUint(t, a[0]) - to := from - if len(a) > 1 { - to = parseUint(t, a[1]) - } - for n := from; n <= to; n++ { - t.Run(fmt.Sprintf("%s/int(%d)", loc, n), func(t *testing.T) { - if f := p.matchComponents(tag, n, 0, 0); f != Form(tc.form) { - t.Errorf("matchComponents: got %v; want %v", f, Form(tc.form)) - } - digits := []byte(fmt.Sprint(n)) - for i := range digits { - digits[i] -= '0' - } - if f := p.MatchDigits(tag, digits, len(digits), 0); f != Form(tc.form) { - t.Errorf("MatchDigits: got %v; want %v", f, Form(tc.form)) - } - }) - } - } - // Test decimals - for _, s := range tc.decimal { - a := strings.Split(s, "~") - from, scale := parseFixedPoint(t, a[0]) - to := from - if len(a) > 1 { - var toScale int - if to, toScale = parseFixedPoint(t, a[1]); toScale != scale { - t.Fatalf("%s:%s: non-matching scales %d versus %d", loc, s, scale, toScale) - } - } - m := 1 - for i := 0; i < scale; i++ { - m *= 10 - } - for n := from; n <= to; n++ { - num := fmt.Sprintf("%[1]d.%0[3]*[2]d", n/m, n%m, scale) - name := fmt.Sprintf("%s:dec(%s)", loc, num) - t.Run(name, func(t *testing.T) { - ff := n % m - tt := ff - w := scale - for tt > 0 && tt%10 == 0 { - w-- - tt /= 10 - } - if f := p.MatchPlural(tag, n/m, scale, w, ff, tt); f != Form(tc.form) { - t.Errorf("MatchPlural: got %v; want %v", f, Form(tc.form)) - } - if f := p.matchComponents(tag, n/m, n%m, scale); f != Form(tc.form) { - t.Errorf("matchComponents: got %v; want %v", f, Form(tc.form)) - } - exp := strings.IndexByte(num, '.') - digits := []byte(strings.Replace(num, ".", "", 1)) - for i := range digits { - digits[i] -= '0' - } - if f := p.MatchDigits(tag, digits, exp, scale); f != Form(tc.form) { - t.Errorf("MatchDigits: got %v; want %v", f, Form(tc.form)) - } - }) - } - } - } - } -} - -func parseUint(t *testing.T, s string) int { - val, err := strconv.ParseUint(s, 10, 32) - if err != nil { - t.Fatal(err) - } - return int(val) -} - -func parseFixedPoint(t *testing.T, s string) (val, scale int) { - p := strings.Index(s, ".") - s = strings.Replace(s, ".", "", 1) - v, err := strconv.ParseUint(s, 10, 32) - if err != nil { - t.Fatal(err) - } - return int(v), len(s) - p -} - -func BenchmarkPluralSimpleCases(b *testing.B) { - p := Cardinal - en, _ := language.CompactIndex(language.English) - zh, _ := language.CompactIndex(language.Chinese) - for i := 0; i < b.N; i++ { - matchPlural(p, en, 0, 0, 0) // 0 - matchPlural(p, en, 1, 0, 0) // 1 - matchPlural(p, en, 2, 12, 3) // 2.120 - matchPlural(p, zh, 0, 0, 0) // 0 - matchPlural(p, zh, 1, 0, 0) // 1 - matchPlural(p, zh, 2, 12, 3) // 2.120 - } -} - -func BenchmarkPluralComplexCases(b *testing.B) { - p := Cardinal - ar, _ := language.CompactIndex(language.Arabic) - lv, _ := language.CompactIndex(language.Latvian) - for i := 0; i < b.N; i++ { - matchPlural(p, lv, 0, 19, 2) // 0.19 - matchPlural(p, lv, 11, 0, 3) // 11.000 - matchPlural(p, lv, 100, 123, 4) // 0.1230 - matchPlural(p, ar, 0, 0, 0) // 0 - matchPlural(p, ar, 110, 0, 0) // 110 - matchPlural(p, ar, 99, 99, 2) // 99.99 - } -} diff --git a/vendor/golang.org/x/text/feature/plural/tables.go b/vendor/golang.org/x/text/feature/plural/tables.go deleted file mode 100644 index cdbc93a17..000000000 --- a/vendor/golang.org/x/text/feature/plural/tables.go +++ /dev/null @@ -1,540 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package plural - -// CLDRVersion is the CLDR version from which the tables in this package are derived. -const CLDRVersion = "31" - -var ordinalRules = []pluralCheck{ // 58 elements - 0: {cat: 0x2f, setID: 0x4}, - 1: {cat: 0x3a, setID: 0x5}, - 2: {cat: 0x22, setID: 0x1}, - 3: {cat: 0x22, setID: 0x6}, - 4: {cat: 0x22, setID: 0x7}, - 5: {cat: 0x2f, setID: 0x8}, - 6: {cat: 0x3c, setID: 0x9}, - 7: {cat: 0x2f, setID: 0xa}, - 8: {cat: 0x3c, setID: 0xb}, - 9: {cat: 0x2d, setID: 0xc}, - 10: {cat: 0x2d, setID: 0xd}, - 11: {cat: 0x2f, setID: 0xe}, - 12: {cat: 0x35, setID: 0x3}, - 13: {cat: 0xc5, setID: 0xf}, - 14: {cat: 0x2, setID: 0x1}, - 15: {cat: 0x5, setID: 0x3}, - 16: {cat: 0xd, setID: 0x10}, - 17: {cat: 0x22, setID: 0x1}, - 18: {cat: 0x2f, setID: 0x11}, - 19: {cat: 0x3d, setID: 0x12}, - 20: {cat: 0x2f, setID: 0x13}, - 21: {cat: 0x3a, setID: 0x14}, - 22: {cat: 0x2f, setID: 0x15}, - 23: {cat: 0x3b, setID: 0x16}, - 24: {cat: 0x2f, setID: 0xa}, - 25: {cat: 0x3c, setID: 0xb}, - 26: {cat: 0x22, setID: 0x1}, - 27: {cat: 0x23, setID: 0x17}, - 28: {cat: 0x24, setID: 0x18}, - 29: {cat: 0x22, setID: 0x19}, - 30: {cat: 0x23, setID: 0x2}, - 31: {cat: 0x24, setID: 0x18}, - 32: {cat: 0xf, setID: 0x13}, - 33: {cat: 0x1a, setID: 0x14}, - 34: {cat: 0xf, setID: 0x15}, - 35: {cat: 0x1b, setID: 0x16}, - 36: {cat: 0xf, setID: 0x1a}, - 37: {cat: 0x1d, setID: 0x1b}, - 38: {cat: 0xa, setID: 0x1c}, - 39: {cat: 0xa, setID: 0x1d}, - 40: {cat: 0xc, setID: 0x1e}, - 41: {cat: 0xe4, setID: 0x0}, - 42: {cat: 0x5, setID: 0x3}, - 43: {cat: 0xd, setID: 0xc}, - 44: {cat: 0xd, setID: 0x1f}, - 45: {cat: 0x22, setID: 0x1}, - 46: {cat: 0x23, setID: 0x17}, - 47: {cat: 0x24, setID: 0x18}, - 48: {cat: 0x25, setID: 0x20}, - 49: {cat: 0x22, setID: 0x21}, - 50: {cat: 0x23, setID: 0x17}, - 51: {cat: 0x24, setID: 0x18}, - 52: {cat: 0x25, setID: 0x20}, - 53: {cat: 0x21, setID: 0x22}, - 54: {cat: 0x22, setID: 0x1}, - 55: {cat: 0x23, setID: 0x2}, - 56: {cat: 0x24, setID: 0x23}, - 57: {cat: 0x25, setID: 0x24}, -} // Size: 140 bytes - -var ordinalIndex = []uint8{ // 20 elements - 0x00, 0x00, 0x02, 0x03, 0x04, 0x05, 0x07, 0x09, - 0x0d, 0x0e, 0x11, 0x14, 0x1a, 0x1d, 0x20, 0x26, - 0x2d, 0x31, 0x35, 0x3a, -} // Size: 44 bytes - -var ordinalLangToIndex = []uint8{ // 754 elements - // Entry 0 - 3F - 0x00, 0x0d, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x05, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 40 - 7F - 0x00, 0x00, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x12, 0x12, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 80 - BF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - // Entry C0 - FF - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 100 - 13F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 140 - 17F - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 180 - 1BF - 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 1C0 - 1FF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 200 - 23F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 240 - 27F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 280 - 2BF - 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, - // Entry 2C0 - 2FF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, -} // Size: 778 bytes - -var ordinalInclusionMasks = []uint64{ // 100 elements - // Entry 0 - 1F - 0x0000000400004009, 0x00000002120800d3, 0x0000000010a10195, 0x0000000842810581, - 0x0000000841030081, 0x0000001210010041, 0x0000001100011001, 0x0000000614010001, - 0x0000000614018001, 0x0000000600012001, 0x0000000200014001, 0x0000000010198031, - 0x0000000010610331, 0x0000000040010f01, 0x0000000040070001, 0x0000000010010001, - 0x0000000000011001, 0x000000001c010001, 0x000000001c010001, 0x0000000000012001, - 0x0000000020014001, 0x0000000010080011, 0x0000000010200111, 0x0000000040000501, - 0x0000000040020001, 0x0000000010000001, 0x0000000000001001, 0x0000000014000001, - 0x0000000014000001, 0x0000000000002001, 0x0000000000004001, 0x0000000010080011, - // Entry 20 - 3F - 0x0000000010200111, 0x0000000040000501, 0x0000000040020001, 0x0000000010000001, - 0x0000000000001001, 0x0000000014000001, 0x0000000014000001, 0x0000000000002001, - 0x0000000080014001, 0x0000000010080011, 0x0000000010200111, 0x0000000040000501, - 0x0000000040020001, 0x0000000010000001, 0x0000000000001001, 0x0000000014000001, - 0x0000000014000001, 0x0000000000002001, 0x0000000020004001, 0x0000000010080011, - 0x0000000010200111, 0x0000000040000501, 0x0000000040020001, 0x0000000010000001, - 0x0000000000001001, 0x0000000014000001, 0x0000000014000001, 0x0000000000002001, - 0x0000000080014001, 0x0000000010080011, 0x0000000010200111, 0x0000000040000501, - // Entry 40 - 5F - 0x0000000040020001, 0x0000000010000001, 0x0000000000001001, 0x0000000014000001, - 0x0000000014000001, 0x0000000000002001, 0x0000000020004001, 0x0000000010080011, - 0x0000000010200111, 0x0000000040000501, 0x0000000040020001, 0x0000000010000001, - 0x0000000000001001, 0x0000000014000001, 0x0000000014000001, 0x0000000000002001, - 0x000000002001c001, 0x0000000010080011, 0x0000000010200111, 0x0000000040000501, - 0x0000000040020001, 0x0000000010000001, 0x0000000000001001, 0x0000000014000001, - 0x0000000014000001, 0x0000000000002001, 0x0000000080004001, 0x0000000010080011, - 0x0000000010200111, 0x0000000040000501, 0x0000000040020001, 0x0000000010000001, - // Entry 60 - 7F - 0x0000000000001001, 0x0000000014000001, 0x0000000014000001, 0x0000000000002001, -} // Size: 824 bytes - -// Slots used for ordinal: 3A of 0xFF rules; 14 of 0xFF indexes; 37 of 64 sets - -var cardinalRules = []pluralCheck{ // 166 elements - 0: {cat: 0x2, setID: 0x3}, - 1: {cat: 0x22, setID: 0x1}, - 2: {cat: 0x2, setID: 0x4}, - 3: {cat: 0x2, setID: 0x4}, - 4: {cat: 0x7, setID: 0x1}, - 5: {cat: 0x62, setID: 0x3}, - 6: {cat: 0x22, setID: 0x4}, - 7: {cat: 0x7, setID: 0x3}, - 8: {cat: 0x42, setID: 0x1}, - 9: {cat: 0x22, setID: 0x4}, - 10: {cat: 0x22, setID: 0x4}, - 11: {cat: 0x22, setID: 0x5}, - 12: {cat: 0x22, setID: 0x1}, - 13: {cat: 0x22, setID: 0x1}, - 14: {cat: 0x7, setID: 0x4}, - 15: {cat: 0x92, setID: 0x3}, - 16: {cat: 0xf, setID: 0x6}, - 17: {cat: 0x1f, setID: 0x7}, - 18: {cat: 0x82, setID: 0x3}, - 19: {cat: 0x92, setID: 0x3}, - 20: {cat: 0xf, setID: 0x6}, - 21: {cat: 0x62, setID: 0x3}, - 22: {cat: 0x4a, setID: 0x6}, - 23: {cat: 0x7, setID: 0x8}, - 24: {cat: 0x62, setID: 0x3}, - 25: {cat: 0x1f, setID: 0x9}, - 26: {cat: 0x62, setID: 0x3}, - 27: {cat: 0x5f, setID: 0x9}, - 28: {cat: 0x72, setID: 0x3}, - 29: {cat: 0x29, setID: 0xa}, - 30: {cat: 0x29, setID: 0xb}, - 31: {cat: 0x4f, setID: 0xb}, - 32: {cat: 0x61, setID: 0x2}, - 33: {cat: 0x2f, setID: 0x6}, - 34: {cat: 0x3a, setID: 0x7}, - 35: {cat: 0x4f, setID: 0x6}, - 36: {cat: 0x5f, setID: 0x7}, - 37: {cat: 0x62, setID: 0x2}, - 38: {cat: 0x4f, setID: 0x6}, - 39: {cat: 0x72, setID: 0x2}, - 40: {cat: 0x21, setID: 0x3}, - 41: {cat: 0x7, setID: 0x4}, - 42: {cat: 0x32, setID: 0x3}, - 43: {cat: 0x21, setID: 0x3}, - 44: {cat: 0x22, setID: 0x1}, - 45: {cat: 0x22, setID: 0x1}, - 46: {cat: 0x23, setID: 0x2}, - 47: {cat: 0x2, setID: 0x3}, - 48: {cat: 0x22, setID: 0x1}, - 49: {cat: 0x24, setID: 0xc}, - 50: {cat: 0x7, setID: 0x1}, - 51: {cat: 0x62, setID: 0x3}, - 52: {cat: 0x74, setID: 0x3}, - 53: {cat: 0x24, setID: 0x3}, - 54: {cat: 0x2f, setID: 0xd}, - 55: {cat: 0x34, setID: 0x1}, - 56: {cat: 0xf, setID: 0x6}, - 57: {cat: 0x1f, setID: 0x7}, - 58: {cat: 0x62, setID: 0x3}, - 59: {cat: 0x4f, setID: 0x6}, - 60: {cat: 0x5a, setID: 0x7}, - 61: {cat: 0xf, setID: 0xe}, - 62: {cat: 0x1f, setID: 0xf}, - 63: {cat: 0x64, setID: 0x3}, - 64: {cat: 0x4f, setID: 0xe}, - 65: {cat: 0x5c, setID: 0xf}, - 66: {cat: 0x22, setID: 0x10}, - 67: {cat: 0x23, setID: 0x11}, - 68: {cat: 0x24, setID: 0x12}, - 69: {cat: 0xf, setID: 0x1}, - 70: {cat: 0x62, setID: 0x3}, - 71: {cat: 0xf, setID: 0x2}, - 72: {cat: 0x63, setID: 0x3}, - 73: {cat: 0xf, setID: 0x13}, - 74: {cat: 0x64, setID: 0x3}, - 75: {cat: 0x74, setID: 0x3}, - 76: {cat: 0xf, setID: 0x1}, - 77: {cat: 0x62, setID: 0x3}, - 78: {cat: 0x4a, setID: 0x1}, - 79: {cat: 0xf, setID: 0x2}, - 80: {cat: 0x63, setID: 0x3}, - 81: {cat: 0x4b, setID: 0x2}, - 82: {cat: 0xf, setID: 0x13}, - 83: {cat: 0x64, setID: 0x3}, - 84: {cat: 0x4c, setID: 0x13}, - 85: {cat: 0x7, setID: 0x1}, - 86: {cat: 0x62, setID: 0x3}, - 87: {cat: 0x7, setID: 0x2}, - 88: {cat: 0x63, setID: 0x3}, - 89: {cat: 0x2f, setID: 0xa}, - 90: {cat: 0x37, setID: 0x14}, - 91: {cat: 0x65, setID: 0x3}, - 92: {cat: 0x7, setID: 0x1}, - 93: {cat: 0x62, setID: 0x3}, - 94: {cat: 0x7, setID: 0x15}, - 95: {cat: 0x64, setID: 0x3}, - 96: {cat: 0x75, setID: 0x3}, - 97: {cat: 0x7, setID: 0x1}, - 98: {cat: 0x62, setID: 0x3}, - 99: {cat: 0xf, setID: 0xe}, - 100: {cat: 0x1f, setID: 0xf}, - 101: {cat: 0x64, setID: 0x3}, - 102: {cat: 0xf, setID: 0x16}, - 103: {cat: 0x17, setID: 0x1}, - 104: {cat: 0x65, setID: 0x3}, - 105: {cat: 0xf, setID: 0x17}, - 106: {cat: 0x65, setID: 0x3}, - 107: {cat: 0xf, setID: 0xf}, - 108: {cat: 0x65, setID: 0x3}, - 109: {cat: 0x2f, setID: 0x6}, - 110: {cat: 0x3a, setID: 0x7}, - 111: {cat: 0x2f, setID: 0xe}, - 112: {cat: 0x3c, setID: 0xf}, - 113: {cat: 0x2d, setID: 0xa}, - 114: {cat: 0x2d, setID: 0x17}, - 115: {cat: 0x2d, setID: 0x18}, - 116: {cat: 0x2f, setID: 0x6}, - 117: {cat: 0x3a, setID: 0xb}, - 118: {cat: 0x2f, setID: 0x19}, - 119: {cat: 0x3c, setID: 0xb}, - 120: {cat: 0x55, setID: 0x3}, - 121: {cat: 0x22, setID: 0x1}, - 122: {cat: 0x24, setID: 0x3}, - 123: {cat: 0x2c, setID: 0xc}, - 124: {cat: 0x2d, setID: 0xb}, - 125: {cat: 0xf, setID: 0x6}, - 126: {cat: 0x1f, setID: 0x7}, - 127: {cat: 0x62, setID: 0x3}, - 128: {cat: 0xf, setID: 0xe}, - 129: {cat: 0x1f, setID: 0xf}, - 130: {cat: 0x64, setID: 0x3}, - 131: {cat: 0xf, setID: 0xa}, - 132: {cat: 0x65, setID: 0x3}, - 133: {cat: 0xf, setID: 0x17}, - 134: {cat: 0x65, setID: 0x3}, - 135: {cat: 0xf, setID: 0x18}, - 136: {cat: 0x65, setID: 0x3}, - 137: {cat: 0x2f, setID: 0x6}, - 138: {cat: 0x3a, setID: 0x1a}, - 139: {cat: 0x2f, setID: 0x1b}, - 140: {cat: 0x3b, setID: 0x1c}, - 141: {cat: 0x2f, setID: 0x1d}, - 142: {cat: 0x3c, setID: 0x1e}, - 143: {cat: 0x37, setID: 0x3}, - 144: {cat: 0xa5, setID: 0x0}, - 145: {cat: 0x22, setID: 0x1}, - 146: {cat: 0x23, setID: 0x2}, - 147: {cat: 0x24, setID: 0x1f}, - 148: {cat: 0x25, setID: 0x20}, - 149: {cat: 0xf, setID: 0x6}, - 150: {cat: 0x62, setID: 0x3}, - 151: {cat: 0xf, setID: 0x1b}, - 152: {cat: 0x63, setID: 0x3}, - 153: {cat: 0xf, setID: 0x21}, - 154: {cat: 0x64, setID: 0x3}, - 155: {cat: 0x75, setID: 0x3}, - 156: {cat: 0x21, setID: 0x3}, - 157: {cat: 0x22, setID: 0x1}, - 158: {cat: 0x23, setID: 0x2}, - 159: {cat: 0x2c, setID: 0x22}, - 160: {cat: 0x2d, setID: 0x5}, - 161: {cat: 0x21, setID: 0x3}, - 162: {cat: 0x22, setID: 0x1}, - 163: {cat: 0x23, setID: 0x2}, - 164: {cat: 0x24, setID: 0x23}, - 165: {cat: 0x25, setID: 0x24}, -} // Size: 356 bytes - -var cardinalIndex = []uint8{ // 36 elements - 0x00, 0x00, 0x02, 0x03, 0x04, 0x06, 0x09, 0x0a, - 0x0c, 0x0d, 0x10, 0x14, 0x17, 0x1d, 0x28, 0x2b, - 0x2d, 0x2f, 0x32, 0x38, 0x42, 0x45, 0x4c, 0x55, - 0x5c, 0x61, 0x6d, 0x74, 0x79, 0x7d, 0x89, 0x91, - 0x95, 0x9c, 0xa1, 0xa6, -} // Size: 60 bytes - -var cardinalLangToIndex = []uint8{ // 754 elements - // Entry 0 - 3F - 0x00, 0x04, 0x04, 0x08, 0x08, 0x08, 0x00, 0x00, - 0x06, 0x06, 0x01, 0x01, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x01, 0x01, 0x08, 0x08, 0x04, 0x04, - 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x1a, - 0x1a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, - // Entry 40 - 7F - 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x1e, 0x1e, 0x08, 0x08, 0x13, 0x00, 0x00, 0x13, - 0x13, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x18, - 0x18, 0x00, 0x00, 0x22, 0x22, 0x09, 0x09, 0x09, - 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x00, 0x00, 0x16, 0x16, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - // Entry 80 - BF - 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - // Entry C0 - FF - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - // Entry 100 - 13F - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x08, - 0x08, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x04, 0x04, 0x0c, 0x0c, 0x08, - 0x08, 0x08, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 140 - 17F - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x08, 0x08, 0x04, 0x04, 0x1f, 0x1f, 0x14, - 0x14, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x01, - 0x01, 0x06, 0x00, 0x00, 0x20, 0x20, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x17, 0x17, 0x01, 0x01, - 0x13, 0x13, 0x13, 0x16, 0x16, 0x08, 0x08, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, - // Entry 180 - 1BF - 0x0a, 0x04, 0x04, 0x04, 0x04, 0x04, 0x10, 0x00, - 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, - 0x08, 0x02, 0x02, 0x08, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x0f, 0x0f, - 0x08, 0x10, 0x10, 0x08, 0x08, 0x0e, 0x0e, 0x08, - // Entry 1C0 - 1FF - 0x08, 0x08, 0x08, 0x00, 0x00, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, - 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, - 0x0d, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x06, 0x00, 0x00, 0x08, 0x08, 0x0b, 0x0b, - 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x10, 0x10, 0x08, 0x08, 0x08, - // Entry 200 - 23F - 0x08, 0x08, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, - 0x08, 0x06, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, - 0x00, 0x00, 0x06, 0x06, 0x08, 0x19, 0x19, 0x0d, - 0x0d, 0x08, 0x08, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - // Entry 240 - 27F - 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, - 0x12, 0x12, 0x12, 0x08, 0x08, 0x1d, 0x1d, 0x1d, - 0x1d, 0x1d, 0x1d, 0x1d, 0x00, 0x00, 0x08, 0x08, - 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x10, - 0x10, 0x10, 0x10, 0x08, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x11, 0x11, 0x05, 0x05, - 0x18, 0x18, 0x15, 0x15, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - // Entry 280 - 2BF - 0x08, 0x08, 0x08, 0x08, 0x08, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, - 0x00, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x08, - 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, - 0x07, 0x07, 0x08, 0x08, 0x1d, 0x1d, 0x04, 0x04, - // Entry 2C0 - 2FF - 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x08, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x00, - 0x08, 0x08, 0x08, 0x00, 0x00, 0x04, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, -} // Size: 778 bytes - -var cardinalInclusionMasks = []uint64{ // 100 elements - // Entry 0 - 1F - 0x0000000200500419, 0x0000000000512153, 0x000000000a327105, 0x0000000ca23c7101, - 0x00000004a23c7201, 0x0000000482943001, 0x0000001482943201, 0x0000000502943001, - 0x0000000502943001, 0x0000000522943201, 0x0000000540543401, 0x00000000454128e1, - 0x000000005b02e821, 0x000000006304e821, 0x000000006304ea21, 0x0000000042842821, - 0x0000000042842a21, 0x0000000042842821, 0x0000000042842821, 0x0000000062842a21, - 0x0000000200400421, 0x0000000000400061, 0x000000000a004021, 0x0000000022004021, - 0x0000000022004221, 0x0000000002800021, 0x0000000002800221, 0x0000000002800021, - 0x0000000002800021, 0x0000000022800221, 0x0000000000400421, 0x0000000000400061, - // Entry 20 - 3F - 0x000000000a004021, 0x0000000022004021, 0x0000000022004221, 0x0000000002800021, - 0x0000000002800221, 0x0000000002800021, 0x0000000002800021, 0x0000000022800221, - 0x0000000200400421, 0x0000000000400061, 0x000000000a004021, 0x0000000022004021, - 0x0000000022004221, 0x0000000002800021, 0x0000000002800221, 0x0000000002800021, - 0x0000000002800021, 0x0000000022800221, 0x0000000000400421, 0x0000000000400061, - 0x000000000a004021, 0x0000000022004021, 0x0000000022004221, 0x0000000002800021, - 0x0000000002800221, 0x0000000002800021, 0x0000000002800021, 0x0000000022800221, - 0x0000000200400421, 0x0000000000400061, 0x000000000a004021, 0x0000000022004021, - // Entry 40 - 5F - 0x0000000022004221, 0x0000000002800021, 0x0000000002800221, 0x0000000002800021, - 0x0000000002800021, 0x0000000022800221, 0x0000000040400421, 0x0000000044400061, - 0x000000005a004021, 0x0000000062004021, 0x0000000062004221, 0x0000000042800021, - 0x0000000042800221, 0x0000000042800021, 0x0000000042800021, 0x0000000062800221, - 0x0000000200400421, 0x0000000000400061, 0x000000000a004021, 0x0000000022004021, - 0x0000000022004221, 0x0000000002800021, 0x0000000002800221, 0x0000000002800021, - 0x0000000002800021, 0x0000000022800221, 0x0000000040400421, 0x0000000044400061, - 0x000000005a004021, 0x0000000062004021, 0x0000000062004221, 0x0000000042800021, - // Entry 60 - 7F - 0x0000000042800221, 0x0000000042800021, 0x0000000042800021, 0x0000000062800221, -} // Size: 824 bytes - -// Slots used for cardinal: A6 of 0xFF rules; 24 of 0xFF indexes; 37 of 64 sets - -// Total table size 3804 bytes (3KiB); checksum: FFC009FC diff --git a/vendor/golang.org/x/text/internal/catmsg/catmsg.go b/vendor/golang.org/x/text/internal/catmsg/catmsg.go deleted file mode 100644 index f8abf3704..000000000 --- a/vendor/golang.org/x/text/internal/catmsg/catmsg.go +++ /dev/null @@ -1,366 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package catmsg contains support types for package x/text/message/catalog. -// -// This package contains the low-level implementations of Message used by the -// catalog package and provides primitives for other packages to implement their -// own. For instance, the plural package provides functionality for selecting -// translation strings based on the plural category of substitution arguments. -// -// -// Encoding and Decoding -// -// Catalogs store Messages encoded as a single string. Compiling a message into -// a string both results in compacter representation and speeds up evaluation. -// -// A Message must implement a Compile method to convert its arbitrary -// representation to a string. The Compile method takes an Encoder which -// facilitates serializing the message. Encoders also provide more context of -// the messages's creation (such as for which language the message is intended), -// which may not be known at the time of the creation of the message. -// -// Each message type must also have an accompanying decoder registered to decode -// the message. This decoder takes a Decoder argument which provides the -// counterparts for the decoding. -// -// -// Renderers -// -// A Decoder must be initialized with a Renderer implementation. These -// implementations must be provided by packages that use Catalogs, typically -// formatting packages such as x/text/message. A typical user will not need to -// worry about this type; it is only relevant to packages that do string -// formatting and want to use the catalog package to handle localized strings. -// -// A package that uses catalogs for selecting strings receives selection results -// as sequence of substrings passed to the Renderer. The following snippet shows -// how to express the above example using the message package. -// -// message.Set(language.English, "You are %d minute(s) late.", -// catalog.Var("minutes", plural.Select(1, "one", "minute")), -// catalog.String("You are %[1]d ${minutes} late.")) -// -// p := message.NewPrinter(language.English) -// p.Printf("You are %d minute(s) late.", 5) // always 5 minutes late. -// -// To evaluate the Printf, package message wraps the arguments in a Renderer -// that is passed to the catalog for message decoding. The call sequence that -// results from evaluating the above message, assuming the person is rather -// tardy, is: -// -// Render("You are %[1]d ") -// Arg(1) -// Render("minutes") -// Render(" late.") -// -// The calls to Arg is caused by the plural.Select execution, which evaluates -// the argument to determine whether the singular or plural message form should -// be selected. The calls to Render reports the partial results to the message -// package for further evaluation. -package catmsg - -import ( - "errors" - "fmt" - "strconv" - "strings" - "sync" - - "golang.org/x/text/language" -) - -// A Handle refers to a registered message type. -type Handle int - -// First is used as a Handle to EncodeMessageType, followed by a series of calls -// to EncodeMessage, to implement selecting the first matching Message. -// -// TODO: this can be removed once we either can use type aliases or if the -// internals of this package are merged with the catalog package. -var First Handle = msgFirst - -// A Handler decodes and evaluates data compiled by a Message and sends the -// result to the Decoder. The output may depend on the value of the substitution -// arguments, accessible by the Decoder's Arg method. The Handler returns false -// if there is no translation for the given substitution arguments. -type Handler func(d *Decoder) bool - -// Register records the existence of a message type and returns a Handle that -// can be used in the Encoder's EncodeMessageType method to create such -// messages. The prefix of the name should be the package path followed by -// an optional disambiguating string. -// Register will panic if a handle for the same name was already registered. -func Register(name string, handler Handler) Handle { - mutex.Lock() - defer mutex.Unlock() - - if _, ok := names[name]; ok { - panic(fmt.Errorf("catmsg: handler for %q already exists", name)) - } - h := Handle(len(handlers)) - names[name] = h - handlers = append(handlers, handler) - return h -} - -// These handlers require fixed positions in the handlers slice. -const ( - msgVars Handle = iota - msgFirst - msgRaw - msgString - numFixed -) - -const prefix = "golang.org/x/text/internal/catmsg." - -var ( - mutex sync.Mutex - names = map[string]Handle{ - prefix + "Vars": msgVars, - prefix + "First": msgFirst, - prefix + "Raw": msgRaw, - prefix + "String": msgString, - } - handlers = make([]Handler, numFixed) -) - -func init() { - // This handler is a message type wrapper that initializes a decoder - // with a variable block. This message type, if present, is always at the - // start of an encoded message. - handlers[msgVars] = func(d *Decoder) bool { - blockSize := int(d.DecodeUint()) - d.vars = d.data[:blockSize] - d.data = d.data[blockSize:] - return d.executeMessage() - } - - // First takes the first message in a sequence that results in a match for - // the given substitution arguments. - handlers[msgFirst] = func(d *Decoder) bool { - for !d.Done() { - if d.ExecuteMessage() { - return true - } - } - return false - } - - handlers[msgRaw] = func(d *Decoder) bool { - d.Render(d.data) - return true - } - - // A String message alternates between a string constant and a variable - // substitution. - handlers[msgString] = func(d *Decoder) bool { - for !d.Done() { - if str := d.DecodeString(); str != "" { - d.Render(str) - } - if d.Done() { - break - } - d.ExecuteSubstitution() - } - return true - } -} - -var ( - // ErrIncomplete indicates a compiled message does not define translations - // for all possible argument values. If this message is returned, evaluating - // a message may result in the ErrNoMatch error. - ErrIncomplete = errors.New("catmsg: incomplete message; may not give result for all inputs") - - // ErrNoMatch indicates no translation message matched the given input - // parameters when evaluating a message. - ErrNoMatch = errors.New("catmsg: no translation for inputs") -) - -// A Message holds a collection of translations for the same phrase that may -// vary based on the values of substitution arguments. -type Message interface { - // Compile encodes the format string(s) of the message as a string for later - // evaluation. - // - // The first call Compile makes on the encoder must be EncodeMessageType. - // The handle passed to this call may either be a handle returned by - // Register to encode a single custom message, or HandleFirst followed by - // a sequence of calls to EncodeMessage. - // - // Compile must return ErrIncomplete if it is possible for evaluation to - // not match any translation for a given set of formatting parameters. - // For example, selecting a translation based on plural form may not yield - // a match if the form "Other" is not one of the selectors. - // - // Compile may return any other application-specific error. For backwards - // compatibility with package like fmt, which often do not do sanity - // checking of format strings ahead of time, Compile should still make an - // effort to have some sensible fallback in case of an error. - Compile(e *Encoder) error -} - -// Compile converts a Message to a data string that can be stored in a Catalog. -// The resulting string can subsequently be decoded by passing to the Execute -// method of a Decoder. -func Compile(tag language.Tag, macros Dictionary, m Message) (data string, err error) { - // TODO: pass macros so they can be used for validation. - v := &Encoder{inBody: true} // encoder for variables - v.root = v - e := &Encoder{root: v, parent: v, tag: tag} // encoder for messages - err = m.Compile(e) - // This package serves te message package, which in turn is meant to be a - // drop-in replacement for fmt. With the fmt package, format strings are - // evaluated lazily and errors are handled by substituting strings in the - // result, rather then returning an error. Dealing with multiple languages - // makes it more important to check errors ahead of time. We chose to be - // consistent and compatible and allow graceful degradation in case of - // errors. - buf := e.buf[stripPrefix(e.buf):] - if len(v.buf) > 0 { - // Prepend variable block. - b := make([]byte, 1+maxVarintBytes+len(v.buf)+len(buf)) - b[0] = byte(msgVars) - b = b[:1+encodeUint(b[1:], uint64(len(v.buf)))] - b = append(b, v.buf...) - b = append(b, buf...) - buf = b - } - if err == nil { - err = v.err - } - return string(buf), err -} - -// Var defines a message that can be substituted for a placeholder of the same -// name. If an expression does not result in a string after evaluation, Name is -// used as the substitution. For example: -// Var{ -// Name: "minutes", -// Message: plural.Select(1, "one", "minute"), -// } -// will resolve to minute for singular and minutes for plural forms. -type Var struct { - Name string - Message Message -} - -var errIsVar = errors.New("catmsg: variable used as message") - -// Compile implements Message. -// -// Note that this method merely registers a variable; it does not create an -// encoded message. -func (v *Var) Compile(e *Encoder) error { - if err := e.addVar(v.Name, v.Message); err != nil { - return err - } - // Using a Var by itself is an error. If it is in a sequence followed by - // other messages referring to it, this error will be ignored. - return errIsVar -} - -// Raw is a message consisting of a single format string that is passed as is -// to the Renderer. -// -// Note that a Renderer may still do its own variable substitution. -type Raw string - -// Compile implements Message. -func (r Raw) Compile(e *Encoder) (err error) { - e.EncodeMessageType(msgRaw) - // Special case: raw strings don't have a size encoding and so don't use - // EncodeString. - e.buf = append(e.buf, r...) - return nil -} - -// String is a message consisting of a single format string which contains -// placeholders that may be substituted with variables. -// -// Variable substitutions are marked with placeholders and a variable name of -// the form ${name}. Any other substitutions such as Go templates or -// printf-style substitutions are left to be done by the Renderer. -// -// When evaluation a string interpolation, a Renderer will receive separate -// calls for each placeholder and interstitial string. For example, for the -// message: "%[1]v ${invites} %[2]v to ${their} party." The sequence of calls -// is: -// d.Render("%[1]v ") -// d.Arg(1) -// d.Render(resultOfInvites) -// d.Render(" %[2]v to ") -// d.Arg(2) -// d.Render(resultOfTheir) -// d.Render(" party.") -// where the messages for "invites" and "their" both use a plural.Select -// referring to the first argument. -// -// Strings may also invoke macros. Macros are essentially variables that can be -// reused. Macros may, for instance, be used to make selections between -// different conjugations of a verb. See the catalog package description for an -// overview of macros. -type String string - -// Compile implements Message. It parses the placeholder formats and returns -// any error. -func (s String) Compile(e *Encoder) (err error) { - msg := string(s) - const subStart = "${" - hasHeader := false - p := 0 - b := []byte{} - for { - i := strings.Index(msg[p:], subStart) - if i == -1 { - break - } - b = append(b, msg[p:p+i]...) - p += i + len(subStart) - if i = strings.IndexByte(msg[p:], '}'); i == -1 { - b = append(b, "$!(MISSINGBRACE)"...) - err = fmt.Errorf("catmsg: missing '}'") - p = len(msg) - break - } - name := strings.TrimSpace(msg[p : p+i]) - if q := strings.IndexByte(name, '('); q == -1 { - if !hasHeader { - hasHeader = true - e.EncodeMessageType(msgString) - } - e.EncodeString(string(b)) - e.EncodeSubstitution(name) - b = b[:0] - } else if j := strings.IndexByte(name[q:], ')'); j == -1 { - // TODO: what should the error be? - b = append(b, "$!(MISSINGPAREN)"...) - err = fmt.Errorf("catmsg: missing ')'") - } else if x, sErr := strconv.ParseUint(strings.TrimSpace(name[q+1:q+j]), 10, 32); sErr != nil { - // TODO: handle more than one argument - b = append(b, "$!(BADNUM)"...) - err = fmt.Errorf("catmsg: invalid number %q", strings.TrimSpace(name[q+1:q+j])) - } else { - if !hasHeader { - hasHeader = true - e.EncodeMessageType(msgString) - } - e.EncodeString(string(b)) - e.EncodeSubstitution(name[:q], int(x)) - b = b[:0] - } - p += i + 1 - } - b = append(b, msg[p:]...) - if !hasHeader { - // Simplify string to a raw string. - Raw(string(b)).Compile(e) - } else if len(b) > 0 { - e.EncodeString(string(b)) - } - return err -} diff --git a/vendor/golang.org/x/text/internal/catmsg/catmsg_test.go b/vendor/golang.org/x/text/internal/catmsg/catmsg_test.go deleted file mode 100644 index df913a1de..000000000 --- a/vendor/golang.org/x/text/internal/catmsg/catmsg_test.go +++ /dev/null @@ -1,316 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package catmsg - -import ( - "errors" - "strings" - "testing" - - "golang.org/x/text/language" -) - -type renderer struct { - args []int - result string -} - -func (r *renderer) Arg(i int) interface{} { - if i >= len(r.args) { - return nil - } - return r.args[i] -} - -func (r *renderer) Render(s string) { - if r.result != "" { - r.result += "|" - } - r.result += s -} - -func TestCodec(t *testing.T) { - type test struct { - args []int - out string - decErr string - } - single := func(out, err string) []test { return []test{{out: out, decErr: err}} } - testCases := []struct { - desc string - m Message - enc string - encErr string - tests []test - }{{ - desc: "unused variable", - m: &Var{"name", String("foo")}, - encErr: errIsVar.Error(), - tests: single("", ""), - }, { - desc: "empty", - m: empty{}, - tests: single("", ""), - }, { - desc: "sequence with empty", - m: seq{empty{}}, - tests: single("", ""), - }, { - desc: "raw string", - m: Raw("foo"), - tests: single("foo", ""), - }, { - desc: "raw string no sub", - m: Raw("${foo}"), - enc: "\x02${foo}", - tests: single("${foo}", ""), - }, { - desc: "simple string", - m: String("foo"), - tests: single("foo", ""), - }, { - desc: "missing var", - m: String("foo${bar}"), - enc: "\x03\x03foo\x02\x03bar", - encErr: `unknown var "bar"`, - tests: single("foo|bar", ""), - }, { - desc: "empty var", - m: seq{ - &Var{"bar", seq{}}, - String("foo${bar}"), - }, - enc: "\x00\x05\x04\x02bar\x03\x03foo\x00\x00", - // TODO: recognize that it is cheaper to substitute bar. - tests: single("foo|bar", ""), - }, { - desc: "var after value", - m: seq{ - String("foo${bar}"), - &Var{"bar", String("baz")}, - }, - encErr: errIsVar.Error(), - tests: single("foo|bar", ""), - }, { - desc: "substitution", - m: seq{ - &Var{"bar", String("baz")}, - String("foo${bar}"), - }, - tests: single("foo|baz", ""), - }, { - desc: "shadowed variable", - m: seq{ - &Var{"bar", String("baz")}, - seq{ - &Var{"bar", String("BAZ")}, - String("foo${bar}"), - }, - }, - tests: single("foo|BAZ", ""), - }, { - desc: "nested value", - m: nestedLang{nestedLang{empty{}}}, - tests: single("nl|nl", ""), - }, { - desc: "not shadowed variable", - m: seq{ - &Var{"bar", String("baz")}, - seq{ - String("foo${bar}"), - &Var{"bar", String("BAZ")}, - }, - }, - encErr: errIsVar.Error(), - tests: single("foo|baz", ""), - }, { - desc: "duplicate variable", - m: seq{ - &Var{"bar", String("baz")}, - &Var{"bar", String("BAZ")}, - String("${bar}"), - }, - encErr: "catmsg: duplicate variable \"bar\"", - tests: single("baz", ""), - }, { - desc: "complete incomplete variable", - m: seq{ - &Var{"bar", incomplete{}}, - String("${bar}"), - }, - enc: "\x00\t\b\x01\x01\x04\x04\x02bar\x03\x00\x00\x00", - // TODO: recognize that it is cheaper to substitute bar. - tests: single("bar", ""), - }, { - desc: "incomplete sequence", - m: seq{ - incomplete{}, - incomplete{}, - }, - encErr: ErrIncomplete.Error(), - tests: single("", ErrNoMatch.Error()), - }, { - desc: "compile error variable", - m: seq{ - &Var{"bar", errorCompileMsg{}}, - String("${bar}"), - }, - encErr: errCompileTest.Error(), - tests: single("bar", ""), - }, { - desc: "compile error message", - m: errorCompileMsg{}, - encErr: errCompileTest.Error(), - tests: single("", ""), - }, { - desc: "compile error sequence", - m: seq{ - errorCompileMsg{}, - errorCompileMsg{}, - }, - encErr: errCompileTest.Error(), - tests: single("", ""), - }, { - desc: "macro", - m: String("${exists(1)}"), - tests: single("you betya!", ""), - }, { - desc: "macro incomplete", - m: String("${incomplete(1)}"), - enc: "\x03\x00\x01\nincomplete\x01", - tests: single("incomplete", ""), - }, { - desc: "macro undefined at end", - m: String("${undefined(1)}"), - enc: "\x03\x00\x01\tundefined\x01", - tests: single("undefined", "catmsg: undefined macro \"undefined\""), - }, { - desc: "macro undefined with more text following", - m: String("${undefined(1)}."), - enc: "\x03\x00\x01\tundefined\x01\x01.", - tests: single("undefined|.", "catmsg: undefined macro \"undefined\""), - }, { - desc: "macro missing paren", - m: String("${missing(1}"), - encErr: "catmsg: missing ')'", - tests: single("$!(MISSINGPAREN)", ""), - }, { - desc: "macro bad num", - m: String("aa${bad(a)}"), - encErr: "catmsg: invalid number \"a\"", - tests: single("aa$!(BADNUM)", ""), - }, { - desc: "var missing brace", - m: String("a${missing"), - encErr: "catmsg: missing '}'", - tests: single("a$!(MISSINGBRACE)", ""), - }} - r := &renderer{} - dec := NewDecoder(language.Und, r, macros) - for _, tc := range testCases { - t.Run(tc.desc, func(t *testing.T) { - // Use a language other than Und so that we can test - // passing the language to nested values. - data, err := Compile(language.Dutch, macros, tc.m) - if failErr(err, tc.encErr) { - t.Errorf("encoding error: got %+q; want %+q", err, tc.encErr) - } - if tc.enc != "" && data != tc.enc { - t.Errorf("encoding: got %+q; want %+q", data, tc.enc) - } - for _, st := range tc.tests { - t.Run("", func(t *testing.T) { - *r = renderer{args: st.args} - if err = dec.Execute(data); failErr(err, st.decErr) { - t.Errorf("decoding error: got %+q; want %+q", err, st.decErr) - } - if r.result != st.out { - t.Errorf("decode: got %+q; want %+q", r.result, st.out) - } - }) - } - }) - } -} - -func failErr(got error, want string) bool { - if got == nil { - return want != "" - } - return want == "" || !strings.Contains(got.Error(), want) -} - -type seq []Message - -func (s seq) Compile(e *Encoder) (err error) { - err = ErrIncomplete - e.EncodeMessageType(First) - for _, m := range s { - // Pass only the last error, but allow erroneous or complete messages - // here to allow testing different scenarios. - err = e.EncodeMessage(m) - } - return err -} - -type empty struct{} - -func (empty) Compile(e *Encoder) (err error) { return nil } - -var msgIncomplete = Register( - "golang.org/x/text/internal/catmsg.incomplete", - func(d *Decoder) bool { return false }) - -type incomplete struct{} - -func (incomplete) Compile(e *Encoder) (err error) { - e.EncodeMessageType(msgIncomplete) - return ErrIncomplete -} - -var msgNested = Register( - "golang.org/x/text/internal/catmsg.nested", - func(d *Decoder) bool { - d.Render(d.DecodeString()) - d.ExecuteMessage() - return true - }) - -type nestedLang struct{ Message } - -func (n nestedLang) Compile(e *Encoder) (err error) { - e.EncodeMessageType(msgNested) - e.EncodeString(e.Language().String()) - e.EncodeMessage(n.Message) - return nil -} - -type errorCompileMsg struct{} - -var errCompileTest = errors.New("catmsg: compile error test") - -func (errorCompileMsg) Compile(e *Encoder) (err error) { - return errCompileTest -} - -type dictionary struct{} - -var ( - macros = dictionary{} - dictMessages = map[string]string{ - "exists": compile(String("you betya!")), - "incomplete": compile(incomplete{}), - } -) - -func (d dictionary) Lookup(key string) (data string, ok bool) { - data, ok = dictMessages[key] - return -} - -func compile(m Message) (data string) { - data, _ = Compile(language.Und, macros, m) - return data -} diff --git a/vendor/golang.org/x/text/internal/catmsg/codec.go b/vendor/golang.org/x/text/internal/catmsg/codec.go deleted file mode 100755 index ab587f856..000000000 --- a/vendor/golang.org/x/text/internal/catmsg/codec.go +++ /dev/null @@ -1,407 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package catmsg - -import ( - "errors" - "fmt" - - "golang.org/x/text/language" -) - -// A Renderer renders a Message. -type Renderer interface { - // Render renders the given string. The given string may be interpreted as a - // format string, such as the one used by the fmt package or a template. - Render(s string) - - // Arg returns the i-th argument passed to format a message. This method - // should return nil if there is no such argument. Messages need access to - // arguments to allow selecting a message based on linguistic features of - // those arguments. - Arg(i int) interface{} -} - -// A Dictionary specifies a source of messages, including variables or macros. -type Dictionary interface { - // Lookup returns the message for the given key. It returns false for ok if - // such a message could not be found. - Lookup(key string) (data string, ok bool) - - // TODO: consider returning an interface, instead of a string. This will - // allow implementations to do their own message type decoding. -} - -// An Encoder serializes a Message to a string. -type Encoder struct { - // The root encoder is used for storing encoded variables. - root *Encoder - // The parent encoder provides the surrounding scopes for resolving variable - // names. - parent *Encoder - - tag language.Tag - - // buf holds the encoded message so far. After a message completes encoding, - // the contents of buf, prefixed by the encoded length, are flushed to the - // parent buffer. - buf []byte - - // vars is the lookup table of variables in the current scope. - vars []keyVal - - err error - inBody bool // if false next call must be EncodeMessageType -} - -type keyVal struct { - key string - offset int -} - -// Language reports the language for which the encoded message will be stored -// in the Catalog. -func (e *Encoder) Language() language.Tag { return e.tag } - -func (e *Encoder) setError(err error) { - if e.root.err == nil { - e.root.err = err - } -} - -// EncodeUint encodes x. -func (e *Encoder) EncodeUint(x uint64) { - e.checkInBody() - var buf [maxVarintBytes]byte - n := encodeUint(buf[:], x) - e.buf = append(e.buf, buf[:n]...) -} - -// EncodeString encodes s. -func (e *Encoder) EncodeString(s string) { - e.checkInBody() - e.EncodeUint(uint64(len(s))) - e.buf = append(e.buf, s...) -} - -// EncodeMessageType marks the current message to be of type h. -// -// It must be the first call of a Message's Compile method. -func (e *Encoder) EncodeMessageType(h Handle) { - if e.inBody { - panic("catmsg: EncodeMessageType not the first method called") - } - e.inBody = true - e.EncodeUint(uint64(h)) -} - -// EncodeMessage serializes the given message inline at the current position. -func (e *Encoder) EncodeMessage(m Message) error { - e = &Encoder{root: e.root, parent: e, tag: e.tag} - err := m.Compile(e) - if _, ok := m.(*Var); !ok { - e.flushTo(e.parent) - } - return err -} - -func (e *Encoder) checkInBody() { - if !e.inBody { - panic("catmsg: expected prior call to EncodeMessageType") - } -} - -// stripPrefix indicates the number of prefix bytes that must be stripped to -// turn a single-element sequence into a message that is just this single member -// without its size prefix. If the message can be stripped, b[1:n] contains the -// size prefix. -func stripPrefix(b []byte) (n int) { - if len(b) > 0 && Handle(b[0]) == msgFirst { - x, n, _ := decodeUint(b[1:]) - if 1+n+int(x) == len(b) { - return 1 + n - } - } - return 0 -} - -func (e *Encoder) flushTo(dst *Encoder) { - data := e.buf - p := stripPrefix(data) - if p > 0 { - data = data[1:] - } else { - // Prefix the size. - dst.EncodeUint(uint64(len(data))) - } - dst.buf = append(dst.buf, data...) -} - -func (e *Encoder) addVar(key string, m Message) error { - for _, v := range e.parent.vars { - if v.key == key { - err := fmt.Errorf("catmsg: duplicate variable %q", key) - e.setError(err) - return err - } - } - scope := e.parent - // If a variable message is Incomplete, and does not evaluate to a message - // during execution, we fall back to the variable name. We encode this by - // appending the variable name if the message reports it's incomplete. - - err := m.Compile(e) - if err != ErrIncomplete { - e.setError(err) - } - switch { - case len(e.buf) == 1 && Handle(e.buf[0]) == msgFirst: // empty sequence - e.buf = e.buf[:0] - e.inBody = false - fallthrough - case len(e.buf) == 0: - // Empty message. - if err := String(key).Compile(e); err != nil { - e.setError(err) - } - case err == ErrIncomplete: - if Handle(e.buf[0]) != msgFirst { - seq := &Encoder{root: e.root, parent: e} - seq.EncodeMessageType(First) - e.flushTo(seq) - e = seq - } - // e contains a sequence; append the fallback string. - e.EncodeMessage(String(key)) - } - - // Flush result to variable heap. - offset := len(e.root.buf) - e.flushTo(e.root) - e.buf = e.buf[:0] - - // Record variable offset in current scope. - scope.vars = append(scope.vars, keyVal{key: key, offset: offset}) - return err -} - -const ( - substituteVar = iota - substituteMacro - substituteError -) - -// EncodeSubstitution inserts a resolved reference to a variable or macro. -// -// This call must be matched with a call to ExecuteSubstitution at decoding -// time. -func (e *Encoder) EncodeSubstitution(name string, arguments ...int) { - if arity := len(arguments); arity > 0 { - // TODO: also resolve macros. - e.EncodeUint(substituteMacro) - e.EncodeString(name) - for _, a := range arguments { - e.EncodeUint(uint64(a)) - } - return - } - for scope := e; scope != nil; scope = scope.parent { - for _, v := range scope.vars { - if v.key != name { - continue - } - e.EncodeUint(substituteVar) // TODO: support arity > 0 - e.EncodeUint(uint64(v.offset)) - return - } - } - // TODO: refer to dictionary-wide scoped variables. - e.EncodeUint(substituteError) - e.EncodeString(name) - e.setError(fmt.Errorf("catmsg: unknown var %q", name)) -} - -// A Decoder deserializes and evaluates messages that are encoded by an encoder. -type Decoder struct { - tag language.Tag - dst Renderer - macros Dictionary - - err error - vars string - data string - - macroArg int // TODO: allow more than one argument -} - -// NewDecoder returns a new Decoder. -// -// Decoders are designed to be reused for multiple invocations of Execute. -// Only one goroutine may call Execute concurrently. -func NewDecoder(tag language.Tag, r Renderer, macros Dictionary) *Decoder { - return &Decoder{ - tag: tag, - dst: r, - macros: macros, - } -} - -func (d *Decoder) setError(err error) { - if d.err == nil { - d.err = err - } -} - -// Language returns the language in which the message is being rendered. -// -// The destination language may be a child language of the language used for -// encoding. For instance, a decoding language of "pt-PT"" is consistent with an -// encoding language of "pt". -func (d *Decoder) Language() language.Tag { return d.tag } - -// Done reports whether there are more bytes to process in this message. -func (d *Decoder) Done() bool { return len(d.data) == 0 } - -// Render implements Renderer. -func (d *Decoder) Render(s string) { d.dst.Render(s) } - -// Arg implements Renderer. -// -// During evaluation of macros, the argument positions may be mapped to -// arguments that differ from the original call. -func (d *Decoder) Arg(i int) interface{} { - if d.macroArg != 0 { - if i != 1 { - panic("catmsg: only macros with single argument supported") - } - i = d.macroArg - } - return d.dst.Arg(i) -} - -// DecodeUint decodes a number that was encoded with EncodeUint and advances the -// position. -func (d *Decoder) DecodeUint() uint64 { - x, n, err := decodeUintString(d.data) - d.data = d.data[n:] - if err != nil { - d.setError(err) - } - return x -} - -// DecodeString decodes a string that was encoded with EncodeString and advances -// the position. -func (d *Decoder) DecodeString() string { - size := d.DecodeUint() - s := d.data[:size] - d.data = d.data[size:] - return s -} - -// SkipMessage skips the message at the current location and advances the -// position. -func (d *Decoder) SkipMessage() { - n := int(d.DecodeUint()) - d.data = d.data[n:] -} - -// Execute decodes and evaluates msg. -// -// Only one goroutine may call execute. -func (d *Decoder) Execute(msg string) error { - d.err = nil - if !d.execute(msg) { - return ErrNoMatch - } - return d.err -} - -func (d *Decoder) execute(msg string) bool { - saved := d.data - d.data = msg - ok := d.executeMessage() - d.data = saved - return ok -} - -// executeMessageFromData is like execute, but also decodes a leading message -// size and clips the given string accordingly. -// -// It reports the number of bytes consumed and whether a message was selected. -func (d *Decoder) executeMessageFromData(s string) (n int, ok bool) { - saved := d.data - d.data = s - size := int(d.DecodeUint()) - n = len(s) - len(d.data) - // Sanitize the setting. This allows skipping a size argument for - // RawString and method Done. - d.data = d.data[:size] - ok = d.executeMessage() - n += size - len(d.data) - d.data = saved - return n, ok -} - -var errUnknownHandler = errors.New("catmsg: string contains unsupported handler") - -// executeMessage reads the handle id, initializes the decoder and executes the -// message. It is assumed that all of d.data[d.p:] is the single message. -func (d *Decoder) executeMessage() bool { - if d.Done() { - // We interpret no data as a valid empty message. - return true - } - handle := d.DecodeUint() - - var fn Handler - mutex.Lock() - if int(handle) < len(handlers) { - fn = handlers[handle] - } - mutex.Unlock() - if fn == nil { - d.setError(errUnknownHandler) - d.execute(fmt.Sprintf("\x02$!(UNKNOWNMSGHANDLER=%#x)", handle)) - return true - } - return fn(d) -} - -// ExecuteMessage decodes and executes the message at the current position. -func (d *Decoder) ExecuteMessage() bool { - n, ok := d.executeMessageFromData(d.data) - d.data = d.data[n:] - return ok -} - -// ExecuteSubstitution executes the message corresponding to the substitution -// as encoded by EncodeSubstitution. -func (d *Decoder) ExecuteSubstitution() { - switch x := d.DecodeUint(); x { - case substituteVar: - offset := d.DecodeUint() - d.executeMessageFromData(d.vars[offset:]) - case substituteMacro: - name := d.DecodeString() - data, ok := d.macros.Lookup(name) - old := d.macroArg - // TODO: support macros of arity other than 1. - d.macroArg = int(d.DecodeUint()) - switch { - case !ok: - // TODO: detect this at creation time. - d.setError(fmt.Errorf("catmsg: undefined macro %q", name)) - fallthrough - case !d.execute(data): - d.dst.Render(name) // fall back to macro name. - } - d.macroArg = old - case substituteError: - d.dst.Render(d.DecodeString()) - default: - panic("catmsg: unreachable") - } -} diff --git a/vendor/golang.org/x/text/internal/catmsg/varint.go b/vendor/golang.org/x/text/internal/catmsg/varint.go deleted file mode 100644 index a2cee2cf5..000000000 --- a/vendor/golang.org/x/text/internal/catmsg/varint.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package catmsg - -// This file implements varint encoding analogous to the one in encoding/binary. -// We need a string version of this function, so we add that here and then add -// the rest for consistency. - -import "errors" - -var ( - errIllegalVarint = errors.New("catmsg: illegal varint") - errVarintTooLarge = errors.New("catmsg: varint too large for uint64") -) - -const maxVarintBytes = 10 // maximum length of a varint - -// encodeUint encodes x as a variable-sized integer into buf and returns the -// number of bytes written. buf must be at least maxVarintBytes long -func encodeUint(buf []byte, x uint64) (n int) { - for ; x > 127; n++ { - buf[n] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - buf[n] = uint8(x) - n++ - return n -} - -func decodeUintString(s string) (x uint64, size int, err error) { - i := 0 - for shift := uint(0); shift < 64; shift += 7 { - if i >= len(s) { - return 0, i, errIllegalVarint - } - b := uint64(s[i]) - i++ - x |= (b & 0x7F) << shift - if b&0x80 == 0 { - return x, i, nil - } - } - return 0, i, errVarintTooLarge -} - -func decodeUint(b []byte) (x uint64, size int, err error) { - i := 0 - for shift := uint(0); shift < 64; shift += 7 { - if i >= len(b) { - return 0, i, errIllegalVarint - } - c := uint64(b[i]) - i++ - x |= (c & 0x7F) << shift - if c&0x80 == 0 { - return x, i, nil - } - } - return 0, i, errVarintTooLarge -} diff --git a/vendor/golang.org/x/text/internal/catmsg/varint_test.go b/vendor/golang.org/x/text/internal/catmsg/varint_test.go deleted file mode 100644 index 04d881d41..000000000 --- a/vendor/golang.org/x/text/internal/catmsg/varint_test.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package catmsg - -import ( - "fmt" - "testing" -) - -func TestEncodeUint(t *testing.T) { - testCases := []struct { - x uint64 - enc string - }{ - {0, "\x00"}, - {1, "\x01"}, - {2, "\x02"}, - {0x7f, "\x7f"}, - {0x80, "\x80\x01"}, - {1 << 14, "\x80\x80\x01"}, - {0xffffffff, "\xff\xff\xff\xff\x0f"}, - {0xffffffffffffffff, "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01"}, - } - for _, tc := range testCases { - buf := [maxVarintBytes]byte{} - got := string(buf[:encodeUint(buf[:], tc.x)]) - if got != tc.enc { - t.Errorf("EncodeUint(%#x) = %q; want %q", tc.x, got, tc.enc) - } - } -} - -func TestDecodeUint(t *testing.T) { - testCases := []struct { - x uint64 - size int - enc string - err error - }{{ - x: 0, - size: 0, - enc: "", - err: errIllegalVarint, - }, { - x: 0, - size: 1, - enc: "\x80", - err: errIllegalVarint, - }, { - x: 0, - size: 3, - enc: "\x80\x80\x80", - err: errIllegalVarint, - }, { - x: 0, - size: 1, - enc: "\x00", - }, { - x: 1, - size: 1, - enc: "\x01", - }, { - x: 2, - size: 1, - enc: "\x02", - }, { - x: 0x7f, - size: 1, - enc: "\x7f", - }, { - x: 0x80, - size: 2, - enc: "\x80\x01", - }, { - x: 1 << 14, - size: 3, - enc: "\x80\x80\x01", - }, { - x: 0xffffffff, - size: 5, - enc: "\xff\xff\xff\xff\x0f", - }, { - x: 0xffffffffffffffff, - size: 10, - enc: "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01", - }, { - x: 0xffffffffffffffff, - size: 10, - enc: "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00", - }, { - x: 0, - size: 10, - enc: "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01", - err: errVarintTooLarge, - }} - forms := []struct { - name string - decode func(s string) (x uint64, size int, err error) - }{ - {"decode", func(s string) (x uint64, size int, err error) { - return decodeUint([]byte(s)) - }}, - {"decodeString", decodeUintString}, - } - for _, f := range forms { - for _, tc := range testCases { - t.Run(fmt.Sprintf("%s:%q", f.name, tc.enc), func(t *testing.T) { - x, size, err := f.decode(tc.enc) - if err != tc.err { - t.Errorf("err = %q; want %q", err, tc.err) - } - if size != tc.size { - t.Errorf("size = %d; want %d", size, tc.size) - } - if x != tc.x { - t.Errorf("decode = %#x; want %#x", x, tc.x) - } - }) - } - } -} diff --git a/vendor/golang.org/x/text/internal/colltab/collate_test.go b/vendor/golang.org/x/text/internal/colltab/collate_test.go deleted file mode 100644 index 580c85c22..000000000 --- a/vendor/golang.org/x/text/internal/colltab/collate_test.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab_test - -// This file contains tests which need to import package collate, which causes -// an import cycle when done within package colltab itself. - -import ( - "bytes" - "testing" - "unicode" - - "golang.org/x/text/collate" - "golang.org/x/text/language" - "golang.org/x/text/unicode/rangetable" -) - -// assigned is used to only test runes that are inside the scope of the Unicode -// version used to generation the collation table. -var assigned = rangetable.Assigned(collate.UnicodeVersion) - -func TestNonDigits(t *testing.T) { - c := collate.New(language.English, collate.Loose, collate.Numeric) - - // Verify that all non-digit numbers sort outside of the number range. - for r, hi := rune(unicode.N.R16[0].Lo), rune(unicode.N.R32[0].Hi); r <= hi; r++ { - if unicode.In(r, unicode.Nd) || !unicode.In(r, assigned) { - continue - } - if a := string(r); c.CompareString(a, "0") != -1 && c.CompareString(a, "999999") != 1 { - t.Errorf("%+q non-digit number is collated as digit", a) - } - } -} - -func TestNumericCompare(t *testing.T) { - c := collate.New(language.English, collate.Loose, collate.Numeric) - - // Iterate over all digits. - for _, r16 := range unicode.Nd.R16 { - testDigitCompare(t, c, rune(r16.Lo), rune(r16.Hi)) - } - for _, r32 := range unicode.Nd.R32 { - testDigitCompare(t, c, rune(r32.Lo), rune(r32.Hi)) - } -} - -func testDigitCompare(t *testing.T, c *collate.Collator, zero, nine rune) { - if !unicode.In(zero, assigned) { - return - } - n := int(nine - zero + 1) - if n%10 != 0 { - t.Fatalf("len([%+q, %+q]) = %d; want a multiple of 10", zero, nine, n) - } - for _, tt := range []struct { - prefix string - b [11]string - }{ - { - prefix: "", - b: [11]string{ - "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", - }, - }, - { - prefix: "1", - b: [11]string{ - "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", - }, - }, - { - prefix: "0", - b: [11]string{ - "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", - }, - }, - { - prefix: "00", - b: [11]string{ - "000", "001", "002", "003", "004", "005", "006", "007", "008", "009", "010", - }, - }, - { - prefix: "9", - b: [11]string{ - "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "100", - }, - }, - } { - for k := 0; k <= n; k++ { - i := k % 10 - a := tt.prefix + string(zero+rune(i)) - for j, b := range tt.b { - want := 0 - switch { - case i < j: - want = -1 - case i > j: - want = 1 - } - got := c.CompareString(a, b) - if got != want { - t.Errorf("Compare(%+q, %+q) = %d; want %d", a, b, got, want) - return - } - } - } - } -} - -func BenchmarkNumericWeighter(b *testing.B) { - c := collate.New(language.English, collate.Numeric) - input := bytes.Repeat([]byte("Testing, testing 123..."), 100) - b.SetBytes(int64(2 * len(input))) - for i := 0; i < b.N; i++ { - c.Compare(input, input) - } -} diff --git a/vendor/golang.org/x/text/internal/colltab/collelem.go b/vendor/golang.org/x/text/internal/colltab/collelem.go deleted file mode 100644 index 28555897b..000000000 --- a/vendor/golang.org/x/text/internal/colltab/collelem.go +++ /dev/null @@ -1,371 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab - -import ( - "fmt" - "unicode" -) - -// Level identifies the collation comparison level. -// The primary level corresponds to the basic sorting of text. -// The secondary level corresponds to accents and related linguistic elements. -// The tertiary level corresponds to casing and related concepts. -// The quaternary level is derived from the other levels by the -// various algorithms for handling variable elements. -type Level int - -const ( - Primary Level = iota - Secondary - Tertiary - Quaternary - Identity - - NumLevels -) - -const ( - defaultSecondary = 0x20 - defaultTertiary = 0x2 - maxTertiary = 0x1F - MaxQuaternary = 0x1FFFFF // 21 bits. -) - -// Elem is a representation of a collation element. This API provides ways to encode -// and decode Elems. Implementations of collation tables may use values greater -// or equal to PrivateUse for their own purposes. However, these should never be -// returned by AppendNext. -type Elem uint32 - -const ( - maxCE Elem = 0xAFFFFFFF - PrivateUse = minContract - minContract = 0xC0000000 - maxContract = 0xDFFFFFFF - minExpand = 0xE0000000 - maxExpand = 0xEFFFFFFF - minDecomp = 0xF0000000 -) - -type ceType int - -const ( - ceNormal ceType = iota // ceNormal includes implicits (ce == 0) - ceContractionIndex // rune can be a start of a contraction - ceExpansionIndex // rune expands into a sequence of collation elements - ceDecompose // rune expands using NFKC decomposition -) - -func (ce Elem) ctype() ceType { - if ce <= maxCE { - return ceNormal - } - if ce <= maxContract { - return ceContractionIndex - } else { - if ce <= maxExpand { - return ceExpansionIndex - } - return ceDecompose - } - panic("should not reach here") - return ceType(-1) -} - -// For normal collation elements, we assume that a collation element either has -// a primary or non-default secondary value, not both. -// Collation elements with a primary value are of the form -// 01pppppp pppppppp ppppppp0 ssssssss -// - p* is primary collation value -// - s* is the secondary collation value -// 00pppppp pppppppp ppppppps sssttttt, where -// - p* is primary collation value -// - s* offset of secondary from default value. -// - t* is the tertiary collation value -// 100ttttt cccccccc pppppppp pppppppp -// - t* is the tertiar collation value -// - c* is the canonical combining class -// - p* is the primary collation value -// Collation elements with a secondary value are of the form -// 1010cccc ccccssss ssssssss tttttttt, where -// - c* is the canonical combining class -// - s* is the secondary collation value -// - t* is the tertiary collation value -// 11qqqqqq qqqqqqqq qqqqqqq0 00000000 -// - q* quaternary value -const ( - ceTypeMask = 0xC0000000 - ceTypeMaskExt = 0xE0000000 - ceIgnoreMask = 0xF00FFFFF - ceType1 = 0x40000000 - ceType2 = 0x00000000 - ceType3or4 = 0x80000000 - ceType4 = 0xA0000000 - ceTypeQ = 0xC0000000 - Ignore = ceType4 - firstNonPrimary = 0x80000000 - lastSpecialPrimary = 0xA0000000 - secondaryMask = 0x80000000 - hasTertiaryMask = 0x40000000 - primaryValueMask = 0x3FFFFE00 - maxPrimaryBits = 21 - compactPrimaryBits = 16 - maxSecondaryBits = 12 - maxTertiaryBits = 8 - maxCCCBits = 8 - maxSecondaryCompactBits = 8 - maxSecondaryDiffBits = 4 - maxTertiaryCompactBits = 5 - primaryShift = 9 - compactSecondaryShift = 5 - minCompactSecondary = defaultSecondary - 4 -) - -func makeImplicitCE(primary int) Elem { - return ceType1 | Elem(primary<<primaryShift) | defaultSecondary -} - -// MakeElem returns an Elem for the given values. It will return an error -// if the given combination of values is invalid. -func MakeElem(primary, secondary, tertiary int, ccc uint8) (Elem, error) { - if w := primary; w >= 1<<maxPrimaryBits || w < 0 { - return 0, fmt.Errorf("makeCE: primary weight out of bounds: %x >= %x", w, 1<<maxPrimaryBits) - } - if w := secondary; w >= 1<<maxSecondaryBits || w < 0 { - return 0, fmt.Errorf("makeCE: secondary weight out of bounds: %x >= %x", w, 1<<maxSecondaryBits) - } - if w := tertiary; w >= 1<<maxTertiaryBits || w < 0 { - return 0, fmt.Errorf("makeCE: tertiary weight out of bounds: %x >= %x", w, 1<<maxTertiaryBits) - } - ce := Elem(0) - if primary != 0 { - if ccc != 0 { - if primary >= 1<<compactPrimaryBits { - return 0, fmt.Errorf("makeCE: primary weight with non-zero CCC out of bounds: %x >= %x", primary, 1<<compactPrimaryBits) - } - if secondary != defaultSecondary { - return 0, fmt.Errorf("makeCE: cannot combine non-default secondary value (%x) with non-zero CCC (%x)", secondary, ccc) - } - ce = Elem(tertiary << (compactPrimaryBits + maxCCCBits)) - ce |= Elem(ccc) << compactPrimaryBits - ce |= Elem(primary) - ce |= ceType3or4 - } else if tertiary == defaultTertiary { - if secondary >= 1<<maxSecondaryCompactBits { - return 0, fmt.Errorf("makeCE: secondary weight with non-zero primary out of bounds: %x >= %x", secondary, 1<<maxSecondaryCompactBits) - } - ce = Elem(primary<<(maxSecondaryCompactBits+1) + secondary) - ce |= ceType1 - } else { - d := secondary - defaultSecondary + maxSecondaryDiffBits - if d >= 1<<maxSecondaryDiffBits || d < 0 { - return 0, fmt.Errorf("makeCE: secondary weight diff out of bounds: %x < 0 || %x > %x", d, d, 1<<maxSecondaryDiffBits) - } - if tertiary >= 1<<maxTertiaryCompactBits { - return 0, fmt.Errorf("makeCE: tertiary weight with non-zero primary out of bounds: %x > %x", tertiary, 1<<maxTertiaryCompactBits) - } - ce = Elem(primary<<maxSecondaryDiffBits + d) - ce = ce<<maxTertiaryCompactBits + Elem(tertiary) - } - } else { - ce = Elem(secondary<<maxTertiaryBits + tertiary) - ce += Elem(ccc) << (maxSecondaryBits + maxTertiaryBits) - ce |= ceType4 - } - return ce, nil -} - -// MakeQuaternary returns an Elem with the given quaternary value. -func MakeQuaternary(v int) Elem { - return ceTypeQ | Elem(v<<primaryShift) -} - -// Mask sets weights for any level smaller than l to 0. -// The resulting Elem can be used to test for equality with -// other Elems to which the same mask has been applied. -func (ce Elem) Mask(l Level) uint32 { - return 0 -} - -// CCC returns the canonical combining class associated with the underlying character, -// if applicable, or 0 otherwise. -func (ce Elem) CCC() uint8 { - if ce&ceType3or4 != 0 { - if ce&ceType4 == ceType3or4 { - return uint8(ce >> 16) - } - return uint8(ce >> 20) - } - return 0 -} - -// Primary returns the primary collation weight for ce. -func (ce Elem) Primary() int { - if ce >= firstNonPrimary { - if ce > lastSpecialPrimary { - return 0 - } - return int(uint16(ce)) - } - return int(ce&primaryValueMask) >> primaryShift -} - -// Secondary returns the secondary collation weight for ce. -func (ce Elem) Secondary() int { - switch ce & ceTypeMask { - case ceType1: - return int(uint8(ce)) - case ceType2: - return minCompactSecondary + int((ce>>compactSecondaryShift)&0xF) - case ceType3or4: - if ce < ceType4 { - return defaultSecondary - } - return int(ce>>8) & 0xFFF - case ceTypeQ: - return 0 - } - panic("should not reach here") -} - -// Tertiary returns the tertiary collation weight for ce. -func (ce Elem) Tertiary() uint8 { - if ce&hasTertiaryMask == 0 { - if ce&ceType3or4 == 0 { - return uint8(ce & 0x1F) - } - if ce&ceType4 == ceType4 { - return uint8(ce) - } - return uint8(ce>>24) & 0x1F // type 2 - } else if ce&ceTypeMask == ceType1 { - return defaultTertiary - } - // ce is a quaternary value. - return 0 -} - -func (ce Elem) updateTertiary(t uint8) Elem { - if ce&ceTypeMask == ceType1 { - // convert to type 4 - nce := ce & primaryValueMask - nce |= Elem(uint8(ce)-minCompactSecondary) << compactSecondaryShift - ce = nce - } else if ce&ceTypeMaskExt == ceType3or4 { - ce &= ^Elem(maxTertiary << 24) - return ce | (Elem(t) << 24) - } else { - // type 2 or 4 - ce &= ^Elem(maxTertiary) - } - return ce | Elem(t) -} - -// Quaternary returns the quaternary value if explicitly specified, -// 0 if ce == Ignore, or MaxQuaternary otherwise. -// Quaternary values are used only for shifted variants. -func (ce Elem) Quaternary() int { - if ce&ceTypeMask == ceTypeQ { - return int(ce&primaryValueMask) >> primaryShift - } else if ce&ceIgnoreMask == Ignore { - return 0 - } - return MaxQuaternary -} - -// Weight returns the collation weight for the given level. -func (ce Elem) Weight(l Level) int { - switch l { - case Primary: - return ce.Primary() - case Secondary: - return ce.Secondary() - case Tertiary: - return int(ce.Tertiary()) - case Quaternary: - return ce.Quaternary() - } - return 0 // return 0 (ignore) for undefined levels. -} - -// For contractions, collation elements are of the form -// 110bbbbb bbbbbbbb iiiiiiii iiiinnnn, where -// - n* is the size of the first node in the contraction trie. -// - i* is the index of the first node in the contraction trie. -// - b* is the offset into the contraction collation element table. -// See contract.go for details on the contraction trie. -const ( - maxNBits = 4 - maxTrieIndexBits = 12 - maxContractOffsetBits = 13 -) - -func splitContractIndex(ce Elem) (index, n, offset int) { - n = int(ce & (1<<maxNBits - 1)) - ce >>= maxNBits - index = int(ce & (1<<maxTrieIndexBits - 1)) - ce >>= maxTrieIndexBits - offset = int(ce & (1<<maxContractOffsetBits - 1)) - return -} - -// For expansions, Elems are of the form 11100000 00000000 bbbbbbbb bbbbbbbb, -// where b* is the index into the expansion sequence table. -const maxExpandIndexBits = 16 - -func splitExpandIndex(ce Elem) (index int) { - return int(uint16(ce)) -} - -// Some runes can be expanded using NFKD decomposition. Instead of storing the full -// sequence of collation elements, we decompose the rune and lookup the collation -// elements for each rune in the decomposition and modify the tertiary weights. -// The Elem, in this case, is of the form 11110000 00000000 wwwwwwww vvvvvvvv, where -// - v* is the replacement tertiary weight for the first rune, -// - w* is the replacement tertiary weight for the second rune, -// Tertiary weights of subsequent runes should be replaced with maxTertiary. -// See http://www.unicode.org/reports/tr10/#Compatibility_Decompositions for more details. -func splitDecompose(ce Elem) (t1, t2 uint8) { - return uint8(ce), uint8(ce >> 8) -} - -const ( - // These constants were taken from http://www.unicode.org/versions/Unicode6.0.0/ch12.pdf. - minUnified rune = 0x4E00 - maxUnified = 0x9FFF - minCompatibility = 0xF900 - maxCompatibility = 0xFAFF - minRare = 0x3400 - maxRare = 0x4DBF -) -const ( - commonUnifiedOffset = 0x10000 - rareUnifiedOffset = 0x20000 // largest rune in common is U+FAFF - otherOffset = 0x50000 // largest rune in rare is U+2FA1D - illegalOffset = otherOffset + int(unicode.MaxRune) - maxPrimary = illegalOffset + 1 -) - -// implicitPrimary returns the primary weight for the a rune -// for which there is no entry for the rune in the collation table. -// We take a different approach from the one specified in -// http://unicode.org/reports/tr10/#Implicit_Weights, -// but preserve the resulting relative ordering of the runes. -func implicitPrimary(r rune) int { - if unicode.Is(unicode.Ideographic, r) { - if r >= minUnified && r <= maxUnified { - // The most common case for CJK. - return int(r) + commonUnifiedOffset - } - if r >= minCompatibility && r <= maxCompatibility { - // This will typically not hit. The DUCET explicitly specifies mappings - // for all characters that do not decompose. - return int(r) + commonUnifiedOffset - } - return int(r) + rareUnifiedOffset - } - return int(r) + otherOffset -} diff --git a/vendor/golang.org/x/text/internal/colltab/collelem_test.go b/vendor/golang.org/x/text/internal/colltab/collelem_test.go deleted file mode 100644 index f131ecc32..000000000 --- a/vendor/golang.org/x/text/internal/colltab/collelem_test.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab - -import ( - "fmt" - "testing" - "unicode" -) - -func (e Elem) String() string { - q := "" - if v := e.Quaternary(); v == MaxQuaternary { - q = "max" - } else { - q = fmt.Sprint(v) - } - return fmt.Sprintf("[%d, %d, %d, %s]", - e.Primary(), - e.Secondary(), - e.Tertiary(), - q) -} - -type ceTest struct { - f func(inout []int) (Elem, ceType) - arg []int -} - -func makeCE(weights []int) Elem { - ce, _ := MakeElem(weights[0], weights[1], weights[2], uint8(weights[3])) - return ce -} - -var defaultValues = []int{0, defaultSecondary, defaultTertiary, 0} - -func e(w ...int) Elem { - return makeCE(append(w, defaultValues[len(w):]...)) -} - -func makeContractIndex(index, n, offset int) Elem { - const ( - contractID = 0xC0000000 - maxNBits = 4 - maxTrieIndexBits = 12 - maxContractOffsetBits = 13 - ) - ce := Elem(contractID) - ce += Elem(offset << (maxNBits + maxTrieIndexBits)) - ce += Elem(index << maxNBits) - ce += Elem(n) - return ce -} - -func makeExpandIndex(index int) Elem { - const expandID = 0xE0000000 - return expandID + Elem(index) -} - -func makeDecompose(t1, t2 int) Elem { - const decompID = 0xF0000000 - return Elem(t2<<8+t1) + decompID -} - -func normalCE(inout []int) (ce Elem, t ceType) { - ce = makeCE(inout) - inout[0] = ce.Primary() - inout[1] = ce.Secondary() - inout[2] = int(ce.Tertiary()) - inout[3] = int(ce.CCC()) - return ce, ceNormal -} - -func expandCE(inout []int) (ce Elem, t ceType) { - ce = makeExpandIndex(inout[0]) - inout[0] = splitExpandIndex(ce) - return ce, ceExpansionIndex -} - -func contractCE(inout []int) (ce Elem, t ceType) { - ce = makeContractIndex(inout[0], inout[1], inout[2]) - i, n, o := splitContractIndex(ce) - inout[0], inout[1], inout[2] = i, n, o - return ce, ceContractionIndex -} - -func decompCE(inout []int) (ce Elem, t ceType) { - ce = makeDecompose(inout[0], inout[1]) - t1, t2 := splitDecompose(ce) - inout[0], inout[1] = int(t1), int(t2) - return ce, ceDecompose -} - -var ceTests = []ceTest{ - {normalCE, []int{0, 0, 0, 0}}, - {normalCE, []int{0, 30, 3, 0}}, - {normalCE, []int{0, 30, 3, 0xFF}}, - {normalCE, []int{100, defaultSecondary, defaultTertiary, 0}}, - {normalCE, []int{100, defaultSecondary, defaultTertiary, 0xFF}}, - {normalCE, []int{100, defaultSecondary, 3, 0}}, - {normalCE, []int{0x123, defaultSecondary, 8, 0xFF}}, - - {contractCE, []int{0, 0, 0}}, - {contractCE, []int{1, 1, 1}}, - {contractCE, []int{1, (1 << maxNBits) - 1, 1}}, - {contractCE, []int{(1 << maxTrieIndexBits) - 1, 1, 1}}, - {contractCE, []int{1, 1, (1 << maxContractOffsetBits) - 1}}, - - {expandCE, []int{0}}, - {expandCE, []int{5}}, - {expandCE, []int{(1 << maxExpandIndexBits) - 1}}, - - {decompCE, []int{0, 0}}, - {decompCE, []int{1, 1}}, - {decompCE, []int{0x1F, 0x1F}}, -} - -func TestColElem(t *testing.T) { - for i, tt := range ceTests { - inout := make([]int, len(tt.arg)) - copy(inout, tt.arg) - ce, typ := tt.f(inout) - if ce.ctype() != typ { - t.Errorf("%d: type is %d; want %d (ColElem: %X)", i, ce.ctype(), typ, ce) - } - for j, a := range tt.arg { - if inout[j] != a { - t.Errorf("%d: argument %d is %X; want %X (ColElem: %X)", i, j, inout[j], a, ce) - } - } - } -} - -type implicitTest struct { - r rune - p int -} - -var implicitTests = []implicitTest{ - {0x33FF, 0x533FF}, - {0x3400, 0x23400}, - {0x4DC0, 0x54DC0}, - {0x4DFF, 0x54DFF}, - {0x4E00, 0x14E00}, - {0x9FCB, 0x19FCB}, - {0xA000, 0x5A000}, - {0xF8FF, 0x5F8FF}, - {0xF900, 0x1F900}, - {0xFA23, 0x1FA23}, - {0xFAD9, 0x1FAD9}, - {0xFB00, 0x5FB00}, - {0x20000, 0x40000}, - {0x2B81C, 0x4B81C}, - {unicode.MaxRune, 0x15FFFF}, // maximum primary value -} - -func TestImplicit(t *testing.T) { - for _, tt := range implicitTests { - if p := implicitPrimary(tt.r); p != tt.p { - t.Errorf("%U: was %X; want %X", tt.r, p, tt.p) - } - } -} - -func TestUpdateTertiary(t *testing.T) { - tests := []struct { - in, out Elem - t uint8 - }{ - {0x4000FE20, 0x0000FE8A, 0x0A}, - {0x4000FE21, 0x0000FEAA, 0x0A}, - {0x0000FE8B, 0x0000FE83, 0x03}, - {0x82FF0188, 0x9BFF0188, 0x1B}, - {0xAFF0CC02, 0xAFF0CC1B, 0x1B}, - } - for i, tt := range tests { - if out := tt.in.updateTertiary(tt.t); out != tt.out { - t.Errorf("%d: was %X; want %X", i, out, tt.out) - } - } -} diff --git a/vendor/golang.org/x/text/internal/colltab/colltab.go b/vendor/golang.org/x/text/internal/colltab/colltab.go deleted file mode 100644 index 02f22477e..000000000 --- a/vendor/golang.org/x/text/internal/colltab/colltab.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package colltab contains functionality related to collation tables. -// It is only to be used by the collate and search packages. -package colltab // import "golang.org/x/text/internal/colltab" - -import ( - "sort" - - "golang.org/x/text/language" -) - -// MatchLang finds the index of t in tags, using a matching algorithm used for -// collation and search. tags[0] must be language.Und, the remaining tags should -// be sorted alphabetically. -// -// Language matching for collation and search is different from the matching -// defined by language.Matcher: the (inferred) base language must be an exact -// match for the relevant fields. For example, "gsw" should not match "de". -// Also the parent relation is different, as a parent may have a different -// script. So usually the parent of zh-Hant is und, whereas for MatchLang it is -// zh. -func MatchLang(t language.Tag, tags []language.Tag) int { - // Canonicalize the values, including collapsing macro languages. - t, _ = language.All.Canonicalize(t) - - base, conf := t.Base() - // Estimate the base language, but only use high-confidence values. - if conf < language.High { - // The root locale supports "search" and "standard". We assume that any - // implementation will only use one of both. - return 0 - } - - // Maximize base and script and normalize the tag. - if _, s, r := t.Raw(); (r != language.Region{}) { - p, _ := language.Raw.Compose(base, s, r) - // Taking the parent forces the script to be maximized. - p = p.Parent() - // Add back region and extensions. - t, _ = language.Raw.Compose(p, r, t.Extensions()) - } else { - // Set the maximized base language. - t, _ = language.Raw.Compose(base, s, t.Extensions()) - } - - // Find start index of the language tag. - start := 1 + sort.Search(len(tags)-1, func(i int) bool { - b, _, _ := tags[i+1].Raw() - return base.String() <= b.String() - }) - if start < len(tags) { - if b, _, _ := tags[start].Raw(); b != base { - return 0 - } - } - - // Besides the base language, script and region, only the collation type and - // the custom variant defined in the 'u' extension are used to distinguish a - // locale. - // Strip all variants and extensions and add back the custom variant. - tdef, _ := language.Raw.Compose(t.Raw()) - tdef, _ = tdef.SetTypeForKey("va", t.TypeForKey("va")) - - // First search for a specialized collation type, if present. - try := []language.Tag{tdef} - if co := t.TypeForKey("co"); co != "" { - tco, _ := tdef.SetTypeForKey("co", co) - try = []language.Tag{tco, tdef} - } - - for _, tx := range try { - for ; tx != language.Und; tx = parent(tx) { - for i, t := range tags[start:] { - if b, _, _ := t.Raw(); b != base { - break - } - if tx == t { - return start + i - } - } - } - } - return 0 -} - -// parent computes the structural parent. This means inheritance may change -// script. So, unlike the CLDR parent, parent(zh-Hant) == zh. -func parent(t language.Tag) language.Tag { - if t.TypeForKey("va") != "" { - t, _ = t.SetTypeForKey("va", "") - return t - } - result := language.Und - if b, s, r := t.Raw(); (r != language.Region{}) { - result, _ = language.Raw.Compose(b, s, t.Extensions()) - } else if (s != language.Script{}) { - result, _ = language.Raw.Compose(b, t.Extensions()) - } else if (b != language.Base{}) { - result, _ = language.Raw.Compose(t.Extensions()) - } - return result -} diff --git a/vendor/golang.org/x/text/internal/colltab/colltab_test.go b/vendor/golang.org/x/text/internal/colltab/colltab_test.go deleted file mode 100644 index c403ac346..000000000 --- a/vendor/golang.org/x/text/internal/colltab/colltab_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package colltab - -import ( - "testing" - - "golang.org/x/text/language" -) - -func TestMatchLang(t *testing.T) { - tags := []language.Tag{ - 0: language.Und, - 1: language.MustParse("bs"), - 2: language.German, - 3: language.English, - 4: language.AmericanEnglish, - 5: language.MustParse("en-US-u-va-posix"), - 6: language.Portuguese, - 7: language.Serbian, - 8: language.MustParse("sr-Latn"), - 9: language.Chinese, - 10: language.MustParse("zh-u-co-stroke"), - 11: language.MustParse("zh-Hant-u-co-pinyin"), - 12: language.TraditionalChinese, - } - for i, tc := range []struct { - x int - t language.Tag - }{ - {0, language.Und}, - {0, language.Persian}, // Default to first element when no match. - {3, language.English}, - {4, language.AmericanEnglish}, - {5, language.MustParse("en-US-u-va-posix")}, // Ext. variant match. - {4, language.MustParse("en-US-u-va-noposix")}, // Ext. variant mismatch. - {3, language.MustParse("en-UK-u-va-noposix")}, // Ext. variant mismatch. - {7, language.Serbian}, - {0, language.Croatian}, // Don't match to close language! - {0, language.MustParse("gsw")}, // Don't match to close language! - {1, language.MustParse("bs-Cyrl")}, // Odd, but correct. - {1, language.MustParse("bs-Latn")}, // Estimated script drops. - {8, language.MustParse("sr-Latn")}, - {9, language.Chinese}, - {9, language.SimplifiedChinese}, - {12, language.TraditionalChinese}, - {11, language.MustParse("zh-Hant-u-co-pinyin")}, - // TODO: should this be 12? Either inherited value (10) or default is - // fine in this case, though. Other locales are not affected. - {10, language.MustParse("zh-Hant-u-co-stroke")}, - // There is no "phonebk" sorting order for zh-Hant, so use default. - {12, language.MustParse("zh-Hant-u-co-phonebk")}, - {10, language.MustParse("zh-u-co-stroke")}, - {12, language.MustParse("und-TW")}, // Infer script and language. - {12, language.MustParse("und-HK")}, // Infer script and language. - {6, language.MustParse("und-BR")}, // Infer script and language. - {6, language.MustParse("und-PT")}, // Infer script and language. - {2, language.MustParse("und-Latn-DE")}, // Infer language. - {0, language.MustParse("und-Jpan-BR")}, // Infers "ja", so no match. - {0, language.MustParse("zu")}, // No match past index. - } { - if x := MatchLang(tc.t, tags); x != tc.x { - t.Errorf("%d: MatchLang(%q, tags) = %d; want %d", i, tc.t, x, tc.x) - } - } -} diff --git a/vendor/golang.org/x/text/internal/colltab/contract.go b/vendor/golang.org/x/text/internal/colltab/contract.go deleted file mode 100644 index 25649d4f5..000000000 --- a/vendor/golang.org/x/text/internal/colltab/contract.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab - -import "unicode/utf8" - -// For a description of ContractTrieSet, see text/collate/build/contract.go. - -type ContractTrieSet []struct{ L, H, N, I uint8 } - -// ctScanner is used to match a trie to an input sequence. -// A contraction may match a non-contiguous sequence of bytes in an input string. -// For example, if there is a contraction for <a, combining_ring>, it should match -// the sequence <a, combining_cedilla, combining_ring>, as combining_cedilla does -// not block combining_ring. -// ctScanner does not automatically skip over non-blocking non-starters, but rather -// retains the state of the last match and leaves it up to the user to continue -// the match at the appropriate points. -type ctScanner struct { - states ContractTrieSet - s []byte - n int - index int - pindex int - done bool -} - -type ctScannerString struct { - states ContractTrieSet - s string - n int - index int - pindex int - done bool -} - -func (t ContractTrieSet) scanner(index, n int, b []byte) ctScanner { - return ctScanner{s: b, states: t[index:], n: n} -} - -func (t ContractTrieSet) scannerString(index, n int, str string) ctScannerString { - return ctScannerString{s: str, states: t[index:], n: n} -} - -// result returns the offset i and bytes consumed p so far. If no suffix -// matched, i and p will be 0. -func (s *ctScanner) result() (i, p int) { - return s.index, s.pindex -} - -func (s *ctScannerString) result() (i, p int) { - return s.index, s.pindex -} - -const ( - final = 0 - noIndex = 0xFF -) - -// scan matches the longest suffix at the current location in the input -// and returns the number of bytes consumed. -func (s *ctScanner) scan(p int) int { - pr := p // the p at the rune start - str := s.s - states, n := s.states, s.n - for i := 0; i < n && p < len(str); { - e := states[i] - c := str[p] - // TODO: a significant number of contractions are of a form that - // cannot match discontiguous UTF-8 in a normalized string. We could let - // a negative value of e.n mean that we can set s.done = true and avoid - // the need for additional matches. - if c >= e.L { - if e.L == c { - p++ - if e.I != noIndex { - s.index = int(e.I) - s.pindex = p - } - if e.N != final { - i, states, n = 0, states[int(e.H)+n:], int(e.N) - if p >= len(str) || utf8.RuneStart(str[p]) { - s.states, s.n, pr = states, n, p - } - } else { - s.done = true - return p - } - continue - } else if e.N == final && c <= e.H { - p++ - s.done = true - s.index = int(c-e.L) + int(e.I) - s.pindex = p - return p - } - } - i++ - } - return pr -} - -// scan is a verbatim copy of ctScanner.scan. -func (s *ctScannerString) scan(p int) int { - pr := p // the p at the rune start - str := s.s - states, n := s.states, s.n - for i := 0; i < n && p < len(str); { - e := states[i] - c := str[p] - // TODO: a significant number of contractions are of a form that - // cannot match discontiguous UTF-8 in a normalized string. We could let - // a negative value of e.n mean that we can set s.done = true and avoid - // the need for additional matches. - if c >= e.L { - if e.L == c { - p++ - if e.I != noIndex { - s.index = int(e.I) - s.pindex = p - } - if e.N != final { - i, states, n = 0, states[int(e.H)+n:], int(e.N) - if p >= len(str) || utf8.RuneStart(str[p]) { - s.states, s.n, pr = states, n, p - } - } else { - s.done = true - return p - } - continue - } else if e.N == final && c <= e.H { - p++ - s.done = true - s.index = int(c-e.L) + int(e.I) - s.pindex = p - return p - } - } - i++ - } - return pr -} diff --git a/vendor/golang.org/x/text/internal/colltab/contract_test.go b/vendor/golang.org/x/text/internal/colltab/contract_test.go deleted file mode 100644 index ce2871dd4..000000000 --- a/vendor/golang.org/x/text/internal/colltab/contract_test.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab - -import ( - "testing" -) - -type lookupStrings struct { - str string - offset int - n int // bytes consumed from input -} - -type LookupTest struct { - lookup []lookupStrings - n int - tries ContractTrieSet -} - -var lookupTests = []LookupTest{{ - []lookupStrings{ - {"abc", 1, 3}, - {"a", 0, 0}, - {"b", 0, 0}, - {"c", 0, 0}, - {"d", 0, 0}, - }, - 1, - ContractTrieSet{ - {'a', 0, 1, 0xFF}, - {'b', 0, 1, 0xFF}, - {'c', 'c', 0, 1}, - }, -}, { - []lookupStrings{ - {"abc", 1, 3}, - {"abd", 2, 3}, - {"abe", 3, 3}, - {"a", 0, 0}, - {"ab", 0, 0}, - {"d", 0, 0}, - {"f", 0, 0}, - }, - 1, - ContractTrieSet{ - {'a', 0, 1, 0xFF}, - {'b', 0, 1, 0xFF}, - {'c', 'e', 0, 1}, - }, -}, { - []lookupStrings{ - {"abc", 1, 3}, - {"ab", 2, 2}, - {"a", 3, 1}, - {"abcd", 1, 3}, - {"abe", 2, 2}, - }, - 1, - ContractTrieSet{ - {'a', 0, 1, 3}, - {'b', 0, 1, 2}, - {'c', 'c', 0, 1}, - }, -}, { - []lookupStrings{ - {"abc", 1, 3}, - {"abd", 2, 3}, - {"ab", 3, 2}, - {"ac", 4, 2}, - {"a", 5, 1}, - {"b", 6, 1}, - {"ba", 6, 1}, - }, - 2, - ContractTrieSet{ - {'b', 'b', 0, 6}, - {'a', 0, 2, 5}, - {'c', 'c', 0, 4}, - {'b', 0, 1, 3}, - {'c', 'd', 0, 1}, - }, -}, { - []lookupStrings{ - {"bcde", 2, 4}, - {"bc", 7, 2}, - {"ab", 6, 2}, - {"bcd", 5, 3}, - {"abcd", 1, 4}, - {"abc", 4, 3}, - {"bcdf", 3, 4}, - }, - 2, - ContractTrieSet{ - {'b', 3, 1, 0xFF}, - {'a', 0, 1, 0xFF}, - {'b', 0, 1, 6}, - {'c', 0, 1, 4}, - {'d', 'd', 0, 1}, - {'c', 0, 1, 7}, - {'d', 0, 1, 5}, - {'e', 'f', 0, 2}, - }, -}} - -func lookup(c *ContractTrieSet, nnode int, s []uint8) (i, n int) { - scan := c.scanner(0, nnode, s) - scan.scan(0) - return scan.result() -} - -func TestLookupContraction(t *testing.T) { - for i, tt := range lookupTests { - cts := ContractTrieSet(tt.tries) - for j, lu := range tt.lookup { - str := lu.str - for _, s := range []string{str, str + "X"} { - const msg = `%d:%d: %s of "%s" %v; want %v` - offset, n := lookup(&cts, tt.n, []byte(s)) - if offset != lu.offset { - t.Errorf(msg, i, j, "offset", s, offset, lu.offset) - } - if n != lu.n { - t.Errorf(msg, i, j, "bytes consumed", s, n, len(str)) - } - } - } - } -} diff --git a/vendor/golang.org/x/text/internal/colltab/iter.go b/vendor/golang.org/x/text/internal/colltab/iter.go deleted file mode 100644 index c1b1ba81e..000000000 --- a/vendor/golang.org/x/text/internal/colltab/iter.go +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab - -// An Iter incrementally converts chunks of the input text to collation -// elements, while ensuring that the collation elements are in normalized order -// (that is, they are in the order as if the input text were normalized first). -type Iter struct { - Weighter Weighter - Elems []Elem - // N is the number of elements in Elems that will not be reordered on - // subsequent iterations, N <= len(Elems). - N int - - bytes []byte - str string - // Because the Elems buffer may contain collation elements that are needed - // for look-ahead, we need two positions in the text (bytes or str): one for - // the end position in the text for the current iteration and one for the - // start of the next call to appendNext. - pEnd int // end position in text corresponding to N. - pNext int // pEnd <= pNext. -} - -// Reset sets the position in the current input text to p and discards any -// results obtained so far. -func (i *Iter) Reset(p int) { - i.Elems = i.Elems[:0] - i.N = 0 - i.pEnd = p - i.pNext = p -} - -// Len returns the length of the input text. -func (i *Iter) Len() int { - if i.bytes != nil { - return len(i.bytes) - } - return len(i.str) -} - -// Discard removes the collation elements up to N. -func (i *Iter) Discard() { - // TODO: change this such that only modifiers following starters will have - // to be copied. - i.Elems = i.Elems[:copy(i.Elems, i.Elems[i.N:])] - i.N = 0 -} - -// End returns the end position of the input text for which Next has returned -// results. -func (i *Iter) End() int { - return i.pEnd -} - -// SetInput resets i to input s. -func (i *Iter) SetInput(s []byte) { - i.bytes = s - i.str = "" - i.Reset(0) -} - -// SetInputString resets i to input s. -func (i *Iter) SetInputString(s string) { - i.str = s - i.bytes = nil - i.Reset(0) -} - -func (i *Iter) done() bool { - return i.pNext >= len(i.str) && i.pNext >= len(i.bytes) -} - -func (i *Iter) appendNext() bool { - if i.done() { - return false - } - var sz int - if i.bytes == nil { - i.Elems, sz = i.Weighter.AppendNextString(i.Elems, i.str[i.pNext:]) - } else { - i.Elems, sz = i.Weighter.AppendNext(i.Elems, i.bytes[i.pNext:]) - } - if sz == 0 { - sz = 1 - } - i.pNext += sz - return true -} - -// Next appends Elems to the internal array. On each iteration, it will either -// add starters or modifiers. In the majority of cases, an Elem with a primary -// value > 0 will have a CCC of 0. The CCC values of collation elements are also -// used to detect if the input string was not normalized and to adjust the -// result accordingly. -func (i *Iter) Next() bool { - if i.N == len(i.Elems) && !i.appendNext() { - return false - } - - // Check if the current segment starts with a starter. - prevCCC := i.Elems[len(i.Elems)-1].CCC() - if prevCCC == 0 { - i.N = len(i.Elems) - i.pEnd = i.pNext - return true - } else if i.Elems[i.N].CCC() == 0 { - // set i.N to only cover part of i.Elems for which prevCCC == 0 and - // use rest for the next call to next. - for i.N++; i.N < len(i.Elems) && i.Elems[i.N].CCC() == 0; i.N++ { - } - i.pEnd = i.pNext - return true - } - - // The current (partial) segment starts with modifiers. We need to collect - // all successive modifiers to ensure that they are normalized. - for { - p := len(i.Elems) - i.pEnd = i.pNext - if !i.appendNext() { - break - } - - if ccc := i.Elems[p].CCC(); ccc == 0 || len(i.Elems)-i.N > maxCombiningCharacters { - // Leave the starter for the next iteration. This ensures that we - // do not return sequences of collation elements that cross two - // segments. - // - // TODO: handle large number of combining characters by fully - // normalizing the input segment before iteration. This ensures - // results are consistent across the text repo. - i.N = p - return true - } else if ccc < prevCCC { - i.doNorm(p, ccc) // should be rare, never occurs for NFD and FCC. - } else { - prevCCC = ccc - } - } - - done := len(i.Elems) != i.N - i.N = len(i.Elems) - return done -} - -// nextNoNorm is the same as next, but does not "normalize" the collation -// elements. -func (i *Iter) nextNoNorm() bool { - // TODO: remove this function. Using this instead of next does not seem - // to improve performance in any significant way. We retain this until - // later for evaluation purposes. - if i.done() { - return false - } - i.appendNext() - i.N = len(i.Elems) - return true -} - -const maxCombiningCharacters = 30 - -// doNorm reorders the collation elements in i.Elems. -// It assumes that blocks of collation elements added with appendNext -// either start and end with the same CCC or start with CCC == 0. -// This allows for a single insertion point for the entire block. -// The correctness of this assumption is verified in builder.go. -func (i *Iter) doNorm(p int, ccc uint8) { - n := len(i.Elems) - k := p - for p--; p > i.N && ccc < i.Elems[p-1].CCC(); p-- { - } - i.Elems = append(i.Elems, i.Elems[p:k]...) - copy(i.Elems[p:], i.Elems[k:]) - i.Elems = i.Elems[:n] -} diff --git a/vendor/golang.org/x/text/internal/colltab/iter_test.go b/vendor/golang.org/x/text/internal/colltab/iter_test.go deleted file mode 100644 index 5783534c7..000000000 --- a/vendor/golang.org/x/text/internal/colltab/iter_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab - -import ( - "testing" -) - -func TestDoNorm(t *testing.T) { - const div = -1 // The insertion point of the next block. - tests := []struct { - in, out []int - }{{ - in: []int{4, div, 3}, - out: []int{3, 4}, - }, { - in: []int{4, div, 3, 3, 3}, - out: []int{3, 3, 3, 4}, - }, { - in: []int{0, 4, div, 3}, - out: []int{0, 3, 4}, - }, { - in: []int{0, 0, 4, 5, div, 3, 3}, - out: []int{0, 0, 3, 3, 4, 5}, - }, { - in: []int{0, 0, 1, 4, 5, div, 3, 3}, - out: []int{0, 0, 1, 3, 3, 4, 5}, - }, { - in: []int{0, 0, 1, 4, 5, div, 4, 4}, - out: []int{0, 0, 1, 4, 4, 4, 5}, - }, - } - for j, tt := range tests { - i := Iter{} - var w, p int - for k, cc := range tt.in { - - if cc == div { - w = 100 - p = k - continue - } - i.Elems = append(i.Elems, makeCE([]int{w, defaultSecondary, 2, cc})) - } - i.doNorm(p, i.Elems[p].CCC()) - if len(i.Elems) != len(tt.out) { - t.Errorf("%d: length was %d; want %d", j, len(i.Elems), len(tt.out)) - } - prevCCC := uint8(0) - for k, ce := range i.Elems { - if int(ce.CCC()) != tt.out[k] { - t.Errorf("%d:%d: unexpected CCC. Was %d; want %d", j, k, ce.CCC(), tt.out[k]) - } - if k > 0 && ce.CCC() == prevCCC && i.Elems[k-1].Primary() > ce.Primary() { - t.Errorf("%d:%d: normalization crossed across CCC boundary.", j, k) - } - } - } - - // Combining rune overflow is tested in search/pattern_test.go. -} diff --git a/vendor/golang.org/x/text/internal/colltab/numeric.go b/vendor/golang.org/x/text/internal/colltab/numeric.go deleted file mode 100644 index 38c255cb4..000000000 --- a/vendor/golang.org/x/text/internal/colltab/numeric.go +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab - -import ( - "unicode" - "unicode/utf8" -) - -// NewNumericWeighter wraps w to replace individual digits to sort based on their -// numeric value. -// -// Weighter w must have a free primary weight after the primary weight for 9. -// If this is not the case, numeric value will sort at the same primary level -// as the first primary sorting after 9. -func NewNumericWeighter(w Weighter) Weighter { - getElem := func(s string) Elem { - elems, _ := w.AppendNextString(nil, s) - return elems[0] - } - nine := getElem("9") - - // Numbers should order before zero, but the DUCET has no room for this. - // TODO: move before zero once we use fractional collation elements. - ns, _ := MakeElem(nine.Primary()+1, nine.Secondary(), int(nine.Tertiary()), 0) - - return &numericWeighter{ - Weighter: w, - - // We assume that w sorts digits of different kinds in order of numeric - // value and that the tertiary weight order is preserved. - // - // TODO: evaluate whether it is worth basing the ranges on the Elem - // encoding itself once the move to fractional weights is complete. - zero: getElem("0"), - zeroSpecialLo: getElem("0"), // U+FF10 FULLWIDTH DIGIT ZERO - zeroSpecialHi: getElem("₀"), // U+2080 SUBSCRIPT ZERO - nine: nine, - nineSpecialHi: getElem("₉"), // U+2089 SUBSCRIPT NINE - numberStart: ns, - } -} - -// A numericWeighter translates a stream of digits into a stream of weights -// representing the numeric value. -type numericWeighter struct { - Weighter - - // The Elems below all demarcate boundaries of specific ranges. With the - // current element encoding digits are in two ranges: normal (default - // tertiary value) and special. For most languages, digits have collation - // elements in the normal range. - // - // Note: the range tests are very specific for the element encoding used by - // this implementation. The tests in collate_test.go are designed to fail - // if this code is not updated when an encoding has changed. - - zero Elem // normal digit zero - zeroSpecialLo Elem // special digit zero, low tertiary value - zeroSpecialHi Elem // special digit zero, high tertiary value - nine Elem // normal digit nine - nineSpecialHi Elem // special digit nine - numberStart Elem -} - -// AppendNext calls the namesake of the underlying weigher, but replaces single -// digits with weights representing their value. -func (nw *numericWeighter) AppendNext(buf []Elem, s []byte) (ce []Elem, n int) { - ce, n = nw.Weighter.AppendNext(buf, s) - nc := numberConverter{ - elems: buf, - w: nw, - b: s, - } - isZero, ok := nc.checkNextDigit(ce) - if !ok { - return ce, n - } - // ce might have been grown already, so take it instead of buf. - nc.init(ce, len(buf), isZero) - for n < len(s) { - ce, sz := nw.Weighter.AppendNext(nc.elems, s[n:]) - nc.b = s - n += sz - if !nc.update(ce) { - break - } - } - return nc.result(), n -} - -// AppendNextString calls the namesake of the underlying weigher, but replaces -// single digits with weights representing their value. -func (nw *numericWeighter) AppendNextString(buf []Elem, s string) (ce []Elem, n int) { - ce, n = nw.Weighter.AppendNextString(buf, s) - nc := numberConverter{ - elems: buf, - w: nw, - s: s, - } - isZero, ok := nc.checkNextDigit(ce) - if !ok { - return ce, n - } - nc.init(ce, len(buf), isZero) - for n < len(s) { - ce, sz := nw.Weighter.AppendNextString(nc.elems, s[n:]) - nc.s = s - n += sz - if !nc.update(ce) { - break - } - } - return nc.result(), n -} - -type numberConverter struct { - w *numericWeighter - - elems []Elem - nDigits int - lenIndex int - - s string // set if the input was of type string - b []byte // set if the input was of type []byte -} - -// init completes initialization of a numberConverter and prepares it for adding -// more digits. elems is assumed to have a digit starting at oldLen. -func (nc *numberConverter) init(elems []Elem, oldLen int, isZero bool) { - // Insert a marker indicating the start of a number and and a placeholder - // for the number of digits. - if isZero { - elems = append(elems[:oldLen], nc.w.numberStart, 0) - } else { - elems = append(elems, 0, 0) - copy(elems[oldLen+2:], elems[oldLen:]) - elems[oldLen] = nc.w.numberStart - elems[oldLen+1] = 0 - - nc.nDigits = 1 - } - nc.elems = elems - nc.lenIndex = oldLen + 1 -} - -// checkNextDigit reports whether bufNew adds a single digit relative to the old -// buffer. If it does, it also reports whether this digit is zero. -func (nc *numberConverter) checkNextDigit(bufNew []Elem) (isZero, ok bool) { - if len(nc.elems) >= len(bufNew) { - return false, false - } - e := bufNew[len(nc.elems)] - if e < nc.w.zeroSpecialLo || nc.w.nine < e { - // Not a number. - return false, false - } - if e < nc.w.zero { - if e > nc.w.nineSpecialHi { - // Not a number. - return false, false - } - if !nc.isDigit() { - return false, false - } - isZero = e <= nc.w.zeroSpecialHi - } else { - // This is the common case if we encounter a digit. - isZero = e == nc.w.zero - } - // Test the remaining added collation elements have a zero primary value. - if n := len(bufNew) - len(nc.elems); n > 1 { - for i := len(nc.elems) + 1; i < len(bufNew); i++ { - if bufNew[i].Primary() != 0 { - return false, false - } - } - // In some rare cases, collation elements will encode runes in - // unicode.No as a digit. For example Ethiopic digits (U+1369 - U+1371) - // are not in Nd. Also some digits that clearly belong in unicode.No, - // like U+0C78 TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR, have - // collation elements indistinguishable from normal digits. - // Unfortunately, this means we need to make this check for nearly all - // non-Latin digits. - // - // TODO: check the performance impact and find something better if it is - // an issue. - if !nc.isDigit() { - return false, false - } - } - return isZero, true -} - -func (nc *numberConverter) isDigit() bool { - if nc.b != nil { - r, _ := utf8.DecodeRune(nc.b) - return unicode.In(r, unicode.Nd) - } - r, _ := utf8.DecodeRuneInString(nc.s) - return unicode.In(r, unicode.Nd) -} - -// We currently support a maximum of about 2M digits (the number of primary -// values). Such numbers will compare correctly against small numbers, but their -// comparison against other large numbers is undefined. -// -// TODO: define a proper fallback, such as comparing large numbers textually or -// actually allowing numbers of unlimited length. -// -// TODO: cap this to a lower number (like 100) and maybe allow a larger number -// in an option? -const maxDigits = 1<<maxPrimaryBits - 1 - -func (nc *numberConverter) update(elems []Elem) bool { - isZero, ok := nc.checkNextDigit(elems) - if nc.nDigits == 0 && isZero { - return true - } - nc.elems = elems - if !ok { - return false - } - nc.nDigits++ - return nc.nDigits < maxDigits -} - -// result fills in the length element for the digit sequence and returns the -// completed collation elements. -func (nc *numberConverter) result() []Elem { - e, _ := MakeElem(nc.nDigits, defaultSecondary, defaultTertiary, 0) - nc.elems[nc.lenIndex] = e - return nc.elems -} diff --git a/vendor/golang.org/x/text/internal/colltab/numeric_test.go b/vendor/golang.org/x/text/internal/colltab/numeric_test.go deleted file mode 100644 index e9406ae3f..000000000 --- a/vendor/golang.org/x/text/internal/colltab/numeric_test.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab - -import ( - "reflect" - "strings" - "testing" - - "golang.org/x/text/internal/testtext" -) - -const ( - digSec = defaultSecondary - digTert = defaultTertiary -) - -var tPlus3 = e(0, 50, digTert+3) - -// numWeighter is a testWeighter used for testing numericWeighter. -var numWeighter = testWeighter{ - "0": p(100), - "0": []Elem{e(100, digSec, digTert+1)}, // U+FF10 FULLWIDTH DIGIT ZERO - "₀": []Elem{e(100, digSec, digTert+5)}, // U+2080 SUBSCRIPT ZERO - - "1": p(101), - // Allow non-primary collation elements to be inserted. - "١": append(p(101), tPlus3), // U+0661 ARABIC-INDIC DIGIT ONE - // Allow varying tertiary weight if the number is Nd. - "1": []Elem{e(101, digSec, digTert+1)}, // U+FF11 FULLWIDTH DIGIT ONE - "2": p(102), - // Allow non-primary collation elements to be inserted. - "٢": append(p(102), tPlus3), // U+0662 ARABIC-INDIC DIGIT TWO - // Varying tertiary weights should be ignored. - "2": []Elem{e(102, digSec, digTert+3)}, // U+FF12 FULLWIDTH DIGIT TWO - "3": p(103), - "4": p(104), - "5": p(105), - "6": p(106), - "7": p(107), - // Weights must be strictly monotonically increasing, but do not need to be - // consecutive. - "8": p(118), - "9": p(119), - // Allow non-primary collation elements to be inserted. - "٩": append(p(119), tPlus3), // U+0669 ARABIC-INDIC DIGIT NINE - // Varying tertiary weights should be ignored. - "9": []Elem{e(119, digSec, digTert+1)}, // U+FF19 FULLWIDTH DIGIT NINE - "₉": []Elem{e(119, digSec, digTert+5)}, // U+2089 SUBSCRIPT NINE - - "a": p(5), - "b": p(6), - "c": p(8, 2), - - "klm": p(99), - - "nop": p(121), - - "x": p(200), - "y": p(201), -} - -func p(w ...int) (elems []Elem) { - for _, x := range w { - e, _ := MakeElem(x, digSec, digTert, 0) - elems = append(elems, e) - } - return elems -} - -func TestNumericAppendNext(t *testing.T) { - for _, tt := range []struct { - in string - w []Elem - }{ - {"a", p(5)}, - {"klm", p(99)}, - {"aa", p(5, 5)}, - {"1", p(120, 1, 101)}, - {"0", p(120, 0)}, - {"01", p(120, 1, 101)}, - {"0001", p(120, 1, 101)}, - {"10", p(120, 2, 101, 100)}, - {"99", p(120, 2, 119, 119)}, - {"9999", p(120, 4, 119, 119, 119, 119)}, - {"1a", p(120, 1, 101, 5)}, - {"0b", p(120, 0, 6)}, - {"01c", p(120, 1, 101, 8, 2)}, - {"10x", p(120, 2, 101, 100, 200)}, - {"99y", p(120, 2, 119, 119, 201)}, - {"9999nop", p(120, 4, 119, 119, 119, 119, 121)}, - - // Allow follow-up collation elements if they have a zero non-primary. - {"١٢٩", []Elem{e(120), e(3), e(101), tPlus3, e(102), tPlus3, e(119), tPlus3}}, - { - "129", - []Elem{ - e(120), e(3), - e(101, digSec, digTert+1), - e(102, digSec, digTert+3), - e(119, digSec, digTert+1), - }, - }, - - // Ensure AppendNext* adds to the given buffer. - {"a10", p(5, 120, 2, 101, 100)}, - } { - nw := NewNumericWeighter(numWeighter) - - b := []byte(tt.in) - got := []Elem(nil) - for n, sz := 0, 0; n < len(b); { - got, sz = nw.AppendNext(got, b[n:]) - n += sz - } - if !reflect.DeepEqual(got, tt.w) { - t.Errorf("AppendNext(%q) =\n%v; want\n%v", tt.in, got, tt.w) - } - - got = nil - for n, sz := 0, 0; n < len(tt.in); { - got, sz = nw.AppendNextString(got, tt.in[n:]) - n += sz - } - if !reflect.DeepEqual(got, tt.w) { - t.Errorf("AppendNextString(%q) =\n%v; want\n%v", tt.in, got, tt.w) - } - } -} - -func TestNumericOverflow(t *testing.T) { - manyDigits := strings.Repeat("9", maxDigits+1) + "a" - - nw := NewNumericWeighter(numWeighter) - - got, n := nw.AppendNextString(nil, manyDigits) - - if n != maxDigits { - t.Errorf("n: got %d; want %d", n, maxDigits) - } - - if got[1].Primary() != maxDigits { - t.Errorf("primary(e[1]): got %d; want %d", n, maxDigits) - } -} - -func TestNumericWeighterAlloc(t *testing.T) { - buf := make([]Elem, 100) - w := NewNumericWeighter(numWeighter) - s := "1234567890a" - - nNormal := testtext.AllocsPerRun(3, func() { numWeighter.AppendNextString(buf, s) }) - nNumeric := testtext.AllocsPerRun(3, func() { w.AppendNextString(buf, s) }) - if n := nNumeric - nNormal; n > 0 { - t.Errorf("got %f; want 0", n) - } -} diff --git a/vendor/golang.org/x/text/internal/colltab/table.go b/vendor/golang.org/x/text/internal/colltab/table.go deleted file mode 100644 index e26e36da9..000000000 --- a/vendor/golang.org/x/text/internal/colltab/table.go +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab - -import ( - "unicode/utf8" - - "golang.org/x/text/unicode/norm" -) - -// Table holds all collation data for a given collation ordering. -type Table struct { - Index Trie // main trie - - // expansion info - ExpandElem []uint32 - - // contraction info - ContractTries ContractTrieSet - ContractElem []uint32 - MaxContractLen int - VariableTop uint32 -} - -func (t *Table) AppendNext(w []Elem, b []byte) (res []Elem, n int) { - return t.appendNext(w, source{bytes: b}) -} - -func (t *Table) AppendNextString(w []Elem, s string) (res []Elem, n int) { - return t.appendNext(w, source{str: s}) -} - -func (t *Table) Start(p int, b []byte) int { - // TODO: implement - panic("not implemented") -} - -func (t *Table) StartString(p int, s string) int { - // TODO: implement - panic("not implemented") -} - -func (t *Table) Domain() []string { - // TODO: implement - panic("not implemented") -} - -func (t *Table) Top() uint32 { - return t.VariableTop -} - -type source struct { - str string - bytes []byte -} - -func (src *source) lookup(t *Table) (ce Elem, sz int) { - if src.bytes == nil { - return t.Index.lookupString(src.str) - } - return t.Index.lookup(src.bytes) -} - -func (src *source) tail(sz int) { - if src.bytes == nil { - src.str = src.str[sz:] - } else { - src.bytes = src.bytes[sz:] - } -} - -func (src *source) nfd(buf []byte, end int) []byte { - if src.bytes == nil { - return norm.NFD.AppendString(buf[:0], src.str[:end]) - } - return norm.NFD.Append(buf[:0], src.bytes[:end]...) -} - -func (src *source) rune() (r rune, sz int) { - if src.bytes == nil { - return utf8.DecodeRuneInString(src.str) - } - return utf8.DecodeRune(src.bytes) -} - -func (src *source) properties(f norm.Form) norm.Properties { - if src.bytes == nil { - return f.PropertiesString(src.str) - } - return f.Properties(src.bytes) -} - -// appendNext appends the weights corresponding to the next rune or -// contraction in s. If a contraction is matched to a discontinuous -// sequence of runes, the weights for the interstitial runes are -// appended as well. It returns a new slice that includes the appended -// weights and the number of bytes consumed from s. -func (t *Table) appendNext(w []Elem, src source) (res []Elem, n int) { - ce, sz := src.lookup(t) - tp := ce.ctype() - if tp == ceNormal { - if ce == 0 { - r, _ := src.rune() - const ( - hangulSize = 3 - firstHangul = 0xAC00 - lastHangul = 0xD7A3 - ) - if r >= firstHangul && r <= lastHangul { - // TODO: performance can be considerably improved here. - n = sz - var buf [16]byte // Used for decomposing Hangul. - for b := src.nfd(buf[:0], hangulSize); len(b) > 0; b = b[sz:] { - ce, sz = t.Index.lookup(b) - w = append(w, ce) - } - return w, n - } - ce = makeImplicitCE(implicitPrimary(r)) - } - w = append(w, ce) - } else if tp == ceExpansionIndex { - w = t.appendExpansion(w, ce) - } else if tp == ceContractionIndex { - n := 0 - src.tail(sz) - if src.bytes == nil { - w, n = t.matchContractionString(w, ce, src.str) - } else { - w, n = t.matchContraction(w, ce, src.bytes) - } - sz += n - } else if tp == ceDecompose { - // Decompose using NFKD and replace tertiary weights. - t1, t2 := splitDecompose(ce) - i := len(w) - nfkd := src.properties(norm.NFKD).Decomposition() - for p := 0; len(nfkd) > 0; nfkd = nfkd[p:] { - w, p = t.appendNext(w, source{bytes: nfkd}) - } - w[i] = w[i].updateTertiary(t1) - if i++; i < len(w) { - w[i] = w[i].updateTertiary(t2) - for i++; i < len(w); i++ { - w[i] = w[i].updateTertiary(maxTertiary) - } - } - } - return w, sz -} - -func (t *Table) appendExpansion(w []Elem, ce Elem) []Elem { - i := splitExpandIndex(ce) - n := int(t.ExpandElem[i]) - i++ - for _, ce := range t.ExpandElem[i : i+n] { - w = append(w, Elem(ce)) - } - return w -} - -func (t *Table) matchContraction(w []Elem, ce Elem, suffix []byte) ([]Elem, int) { - index, n, offset := splitContractIndex(ce) - - scan := t.ContractTries.scanner(index, n, suffix) - buf := [norm.MaxSegmentSize]byte{} - bufp := 0 - p := scan.scan(0) - - if !scan.done && p < len(suffix) && suffix[p] >= utf8.RuneSelf { - // By now we should have filtered most cases. - p0 := p - bufn := 0 - rune := norm.NFD.Properties(suffix[p:]) - p += rune.Size() - if rune.LeadCCC() != 0 { - prevCC := rune.TrailCCC() - // A gap may only occur in the last normalization segment. - // This also ensures that len(scan.s) < norm.MaxSegmentSize. - if end := norm.NFD.FirstBoundary(suffix[p:]); end != -1 { - scan.s = suffix[:p+end] - } - for p < len(suffix) && !scan.done && suffix[p] >= utf8.RuneSelf { - rune = norm.NFD.Properties(suffix[p:]) - if ccc := rune.LeadCCC(); ccc == 0 || prevCC >= ccc { - break - } - prevCC = rune.TrailCCC() - if pp := scan.scan(p); pp != p { - // Copy the interstitial runes for later processing. - bufn += copy(buf[bufn:], suffix[p0:p]) - if scan.pindex == pp { - bufp = bufn - } - p, p0 = pp, pp - } else { - p += rune.Size() - } - } - } - } - // Append weights for the matched contraction, which may be an expansion. - i, n := scan.result() - ce = Elem(t.ContractElem[i+offset]) - if ce.ctype() == ceNormal { - w = append(w, ce) - } else { - w = t.appendExpansion(w, ce) - } - // Append weights for the runes in the segment not part of the contraction. - for b, p := buf[:bufp], 0; len(b) > 0; b = b[p:] { - w, p = t.appendNext(w, source{bytes: b}) - } - return w, n -} - -// TODO: unify the two implementations. This is best done after first simplifying -// the algorithm taking into account the inclusion of both NFC and NFD forms -// in the table. -func (t *Table) matchContractionString(w []Elem, ce Elem, suffix string) ([]Elem, int) { - index, n, offset := splitContractIndex(ce) - - scan := t.ContractTries.scannerString(index, n, suffix) - buf := [norm.MaxSegmentSize]byte{} - bufp := 0 - p := scan.scan(0) - - if !scan.done && p < len(suffix) && suffix[p] >= utf8.RuneSelf { - // By now we should have filtered most cases. - p0 := p - bufn := 0 - rune := norm.NFD.PropertiesString(suffix[p:]) - p += rune.Size() - if rune.LeadCCC() != 0 { - prevCC := rune.TrailCCC() - // A gap may only occur in the last normalization segment. - // This also ensures that len(scan.s) < norm.MaxSegmentSize. - if end := norm.NFD.FirstBoundaryInString(suffix[p:]); end != -1 { - scan.s = suffix[:p+end] - } - for p < len(suffix) && !scan.done && suffix[p] >= utf8.RuneSelf { - rune = norm.NFD.PropertiesString(suffix[p:]) - if ccc := rune.LeadCCC(); ccc == 0 || prevCC >= ccc { - break - } - prevCC = rune.TrailCCC() - if pp := scan.scan(p); pp != p { - // Copy the interstitial runes for later processing. - bufn += copy(buf[bufn:], suffix[p0:p]) - if scan.pindex == pp { - bufp = bufn - } - p, p0 = pp, pp - } else { - p += rune.Size() - } - } - } - } - // Append weights for the matched contraction, which may be an expansion. - i, n := scan.result() - ce = Elem(t.ContractElem[i+offset]) - if ce.ctype() == ceNormal { - w = append(w, ce) - } else { - w = t.appendExpansion(w, ce) - } - // Append weights for the runes in the segment not part of the contraction. - for b, p := buf[:bufp], 0; len(b) > 0; b = b[p:] { - w, p = t.appendNext(w, source{bytes: b}) - } - return w, n -} diff --git a/vendor/golang.org/x/text/internal/colltab/trie.go b/vendor/golang.org/x/text/internal/colltab/trie.go deleted file mode 100644 index a0eaa0d23..000000000 --- a/vendor/golang.org/x/text/internal/colltab/trie.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// The trie in this file is used to associate the first full character in an -// UTF-8 string to a collation element. All but the last byte in a UTF-8 byte -// sequence are used to lookup offsets in the index table to be used for the -// next byte. The last byte is used to index into a table of collation elements. -// For a full description, see go.text/collate/build/trie.go. - -package colltab - -const blockSize = 64 - -type Trie struct { - Index0 []uint16 // index for first byte (0xC0-0xFF) - Values0 []uint32 // index for first byte (0x00-0x7F) - Index []uint16 - Values []uint32 -} - -const ( - t1 = 0x00 // 0000 0000 - tx = 0x80 // 1000 0000 - t2 = 0xC0 // 1100 0000 - t3 = 0xE0 // 1110 0000 - t4 = 0xF0 // 1111 0000 - t5 = 0xF8 // 1111 1000 - t6 = 0xFC // 1111 1100 - te = 0xFE // 1111 1110 -) - -func (t *Trie) lookupValue(n uint16, b byte) Elem { - return Elem(t.Values[int(n)<<6+int(b)]) -} - -// lookup returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *Trie) lookup(s []byte) (v Elem, sz int) { - c0 := s[0] - switch { - case c0 < tx: - return Elem(t.Values0[c0]), 1 - case c0 < t2: - return 0, 1 - case c0 < t3: - if len(s) < 2 { - return 0, 0 - } - i := t.Index0[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - return t.lookupValue(i, c1), 2 - case c0 < t4: - if len(s) < 3 { - return 0, 0 - } - i := t.Index0[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - o := int(i)<<6 + int(c1) - i = t.Index[o] - c2 := s[2] - if c2 < tx || t2 <= c2 { - return 0, 2 - } - return t.lookupValue(i, c2), 3 - case c0 < t5: - if len(s) < 4 { - return 0, 0 - } - i := t.Index0[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - o := int(i)<<6 + int(c1) - i = t.Index[o] - c2 := s[2] - if c2 < tx || t2 <= c2 { - return 0, 2 - } - o = int(i)<<6 + int(c2) - i = t.Index[o] - c3 := s[3] - if c3 < tx || t2 <= c3 { - return 0, 3 - } - return t.lookupValue(i, c3), 4 - } - // Illegal rune - return 0, 1 -} - -// The body of lookupString is a verbatim copy of that of lookup. -func (t *Trie) lookupString(s string) (v Elem, sz int) { - c0 := s[0] - switch { - case c0 < tx: - return Elem(t.Values0[c0]), 1 - case c0 < t2: - return 0, 1 - case c0 < t3: - if len(s) < 2 { - return 0, 0 - } - i := t.Index0[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - return t.lookupValue(i, c1), 2 - case c0 < t4: - if len(s) < 3 { - return 0, 0 - } - i := t.Index0[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - o := int(i)<<6 + int(c1) - i = t.Index[o] - c2 := s[2] - if c2 < tx || t2 <= c2 { - return 0, 2 - } - return t.lookupValue(i, c2), 3 - case c0 < t5: - if len(s) < 4 { - return 0, 0 - } - i := t.Index0[c0] - c1 := s[1] - if c1 < tx || t2 <= c1 { - return 0, 1 - } - o := int(i)<<6 + int(c1) - i = t.Index[o] - c2 := s[2] - if c2 < tx || t2 <= c2 { - return 0, 2 - } - o = int(i)<<6 + int(c2) - i = t.Index[o] - c3 := s[3] - if c3 < tx || t2 <= c3 { - return 0, 3 - } - return t.lookupValue(i, c3), 4 - } - // Illegal rune - return 0, 1 -} diff --git a/vendor/golang.org/x/text/internal/colltab/trie_test.go b/vendor/golang.org/x/text/internal/colltab/trie_test.go deleted file mode 100644 index b056a811e..000000000 --- a/vendor/golang.org/x/text/internal/colltab/trie_test.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab - -import ( - "testing" -) - -// We take the smallest, largest and an arbitrary value for each -// of the UTF-8 sequence lengths. -var testRunes = []rune{ - 0x01, 0x0C, 0x7F, // 1-byte sequences - 0x80, 0x100, 0x7FF, // 2-byte sequences - 0x800, 0x999, 0xFFFF, // 3-byte sequences - 0x10000, 0x10101, 0x10FFFF, // 4-byte sequences - 0x200, 0x201, 0x202, 0x210, 0x215, // five entries in one sparse block -} - -// Test cases for illegal runes. -type trietest struct { - size int - bytes []byte -} - -var tests = []trietest{ - // illegal runes - {1, []byte{0x80}}, - {1, []byte{0xFF}}, - {1, []byte{t2, tx - 1}}, - {1, []byte{t2, t2}}, - {2, []byte{t3, tx, tx - 1}}, - {2, []byte{t3, tx, t2}}, - {1, []byte{t3, tx - 1, tx}}, - {3, []byte{t4, tx, tx, tx - 1}}, - {3, []byte{t4, tx, tx, t2}}, - {1, []byte{t4, t2, tx, tx - 1}}, - {2, []byte{t4, tx, t2, tx - 1}}, - - // short runes - {0, []byte{t2}}, - {0, []byte{t3, tx}}, - {0, []byte{t4, tx, tx}}, - - // we only support UTF-8 up to utf8.UTFMax bytes (4 bytes) - {1, []byte{t5, tx, tx, tx, tx}}, - {1, []byte{t6, tx, tx, tx, tx, tx}}, -} - -func TestLookupTrie(t *testing.T) { - for i, r := range testRunes { - b := []byte(string(r)) - v, sz := testTrie.lookup(b) - if int(v) != i { - t.Errorf("lookup(%U): found value %#x, expected %#x", r, v, i) - } - if sz != len(b) { - t.Errorf("lookup(%U): found size %d, expected %d", r, sz, len(b)) - } - } - for i, tt := range tests { - v, sz := testTrie.lookup(tt.bytes) - if int(v) != 0 { - t.Errorf("lookup of illegal rune, case %d: found value %#x, expected 0", i, v) - } - if sz != tt.size { - t.Errorf("lookup of illegal rune, case %d: found size %d, expected %d", i, sz, tt.size) - } - } -} - -// test data is taken from exp/collate/locale/build/trie_test.go -var testValues = [832]uint32{ - 0x000c: 0x00000001, - 0x007f: 0x00000002, - 0x00c0: 0x00000003, - 0x0100: 0x00000004, - 0x0140: 0x0000000c, 0x0141: 0x0000000d, 0x0142: 0x0000000e, - 0x0150: 0x0000000f, - 0x0155: 0x00000010, - 0x01bf: 0x00000005, - 0x01c0: 0x00000006, - 0x0219: 0x00000007, - 0x027f: 0x00000008, - 0x0280: 0x00000009, - 0x02c1: 0x0000000a, - 0x033f: 0x0000000b, -} - -var testLookup = [640]uint16{ - 0x0e0: 0x05, 0x0e6: 0x06, - 0x13f: 0x07, - 0x140: 0x08, 0x144: 0x09, - 0x190: 0x03, - 0x1ff: 0x0a, - 0x20f: 0x05, - 0x242: 0x01, 0x244: 0x02, - 0x248: 0x03, - 0x25f: 0x04, - 0x260: 0x01, - 0x26f: 0x02, - 0x270: 0x04, 0x274: 0x06, -} - -var testTrie = Trie{testLookup[6*blockSize:], testValues[:], testLookup[:], testValues[:]} diff --git a/vendor/golang.org/x/text/internal/colltab/weighter.go b/vendor/golang.org/x/text/internal/colltab/weighter.go deleted file mode 100644 index f1ec45fb5..000000000 --- a/vendor/golang.org/x/text/internal/colltab/weighter.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab // import "golang.org/x/text/internal/colltab" - -// A Weighter can be used as a source for Collator and Searcher. -type Weighter interface { - // Start finds the start of the segment that includes position p. - Start(p int, b []byte) int - - // StartString finds the start of the segment that includes position p. - StartString(p int, s string) int - - // AppendNext appends Elems to buf corresponding to the longest match - // of a single character or contraction from the start of s. - // It returns the new buf and the number of bytes consumed. - AppendNext(buf []Elem, s []byte) (ce []Elem, n int) - - // AppendNextString appends Elems to buf corresponding to the longest match - // of a single character or contraction from the start of s. - // It returns the new buf and the number of bytes consumed. - AppendNextString(buf []Elem, s string) (ce []Elem, n int) - - // Domain returns a slice of all single characters and contractions for which - // collation elements are defined in this table. - Domain() []string - - // Top returns the highest variable primary value. - Top() uint32 -} diff --git a/vendor/golang.org/x/text/internal/colltab/weighter_test.go b/vendor/golang.org/x/text/internal/colltab/weighter_test.go deleted file mode 100644 index b5f8487b3..000000000 --- a/vendor/golang.org/x/text/internal/colltab/weighter_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package colltab - -// testWeighter is a simple Weighter that returns weights from a user-defined map. -type testWeighter map[string][]Elem - -func (t testWeighter) Start(int, []byte) int { return 0 } -func (t testWeighter) StartString(int, string) int { return 0 } -func (t testWeighter) Domain() []string { return nil } -func (t testWeighter) Top() uint32 { return 0 } - -// maxContractBytes is the maximum length of any key in the map. -const maxContractBytes = 10 - -func (t testWeighter) AppendNext(buf []Elem, s []byte) ([]Elem, int) { - n := len(s) - if n > maxContractBytes { - n = maxContractBytes - } - for i := n; i > 0; i-- { - if e, ok := t[string(s[:i])]; ok { - return append(buf, e...), i - } - } - panic("incomplete testWeighter: could not find " + string(s)) -} - -func (t testWeighter) AppendNextString(buf []Elem, s string) ([]Elem, int) { - n := len(s) - if n > maxContractBytes { - n = maxContractBytes - } - for i := n; i > 0; i-- { - if e, ok := t[s[:i]]; ok { - return append(buf, e...), i - } - } - panic("incomplete testWeighter: could not find " + s) -} diff --git a/vendor/golang.org/x/text/internal/export/README b/vendor/golang.org/x/text/internal/export/README deleted file mode 100644 index 350b93d39..000000000 --- a/vendor/golang.org/x/text/internal/export/README +++ /dev/null @@ -1,4 +0,0 @@ -The export directory contains packages that are generated using the x/text -infrastructure, but live elsewhere. -At some point we can expose some of the infrastructure, but for now this -is not done. diff --git a/vendor/golang.org/x/text/internal/export/idna/common_test.go b/vendor/golang.org/x/text/internal/export/idna/common_test.go deleted file mode 100644 index 0b07c12d7..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/common_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package idna - -// This file contains code that is common between the generation code and the -// package's test code. - -import ( - "log" - - "golang.org/x/text/internal/ucd" -) - -func catFromEntry(p *ucd.Parser) (cat category) { - r := p.Rune(0) - switch s := p.String(1); s { - case "valid": - cat = valid - case "disallowed": - cat = disallowed - case "disallowed_STD3_valid": - cat = disallowedSTD3Valid - case "disallowed_STD3_mapped": - cat = disallowedSTD3Mapped - case "mapped": - cat = mapped - case "deviation": - cat = deviation - case "ignored": - cat = ignored - default: - log.Fatalf("%U: Unknown category %q", r, s) - } - if s := p.String(3); s != "" { - if cat != valid { - log.Fatalf(`%U: %s defined for %q; want "valid"`, r, s, p.String(1)) - } - switch s { - case "NV8": - cat = validNV8 - case "XV8": - cat = validXV8 - default: - log.Fatalf("%U: Unexpected exception %q", r, s) - } - } - return cat -} - -var joinType = map[string]info{ - "L": joiningL, - "D": joiningD, - "T": joiningT, - "R": joiningR, -} diff --git a/vendor/golang.org/x/text/internal/export/idna/example_test.go b/vendor/golang.org/x/text/internal/export/idna/example_test.go deleted file mode 100644 index 6e6b8727c..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/example_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package idna_test - -import ( - "fmt" - - "golang.org/x/text/internal/export/idna" -) - -func ExampleProfile() { - // Raw Punycode has no restrictions and does no mappings. - fmt.Println(idna.ToASCII("")) - fmt.Println(idna.ToASCII("*.faß.com")) - fmt.Println(idna.Punycode.ToASCII("*.faß.com")) - - // Rewrite IDN for lookup. This (currently) uses transitional mappings to - // find a balance between IDNA2003 and IDNA2008 compatibility. - fmt.Println(idna.Lookup.ToASCII("")) - fmt.Println(idna.Lookup.ToASCII("www.faß.com")) - - // Convert an IDN to ASCII for registration purposes. This changes the - // encoding, but reports an error if the input was illformed. - fmt.Println(idna.Registration.ToASCII("")) - fmt.Println(idna.Registration.ToASCII("www.faß.com")) - - // Output: - // <nil> - // *.xn--fa-hia.com <nil> - // *.xn--fa-hia.com <nil> - // <nil> - // www.fass.com <nil> - // idna: invalid label "" - // www.xn--fa-hia.com <nil> -} - -func ExampleNew() { - var p *idna.Profile - - // Raw Punycode has no restrictions and does no mappings. - p = idna.New() - fmt.Println(p.ToASCII("*.faß.com")) - - // Do mappings. Note that star is not allowed in a DNS lookup. - p = idna.New( - idna.MapForLookup(), - idna.Transitional(true)) // Map ß -> ss - fmt.Println(p.ToASCII("*.faß.com")) - - // Lookup for registration. Also does not allow '*'. - p = idna.New(idna.ValidateForRegistration()) - fmt.Println(p.ToUnicode("*.faß.com")) - - // Set up a profile maps for lookup, but allows wild cards. - p = idna.New( - idna.MapForLookup(), - idna.Transitional(true), // Map ß -> ss - idna.StrictDomainName(false)) // Set more permissive ASCII rules. - fmt.Println(p.ToASCII("*.faß.com")) - - // Output: - // *.xn--fa-hia.com <nil> - // *.fass.com idna: disallowed rune U+002A - // *.faß.com idna: disallowed rune U+002A - // *.fass.com <nil> -} diff --git a/vendor/golang.org/x/text/internal/export/idna/gen.go b/vendor/golang.org/x/text/internal/export/idna/gen.go deleted file mode 100644 index 27a5e1c43..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/gen.go +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// This program generates the trie for idna operations. The Unicode casing -// algorithm requires the lookup of various properties and mappings for each -// rune. The table generated by this generator combines several of the most -// frequently used of these into a single trie so that they can be accessed -// with a single lookup. -package main - -import ( - "fmt" - "io" - "log" - "unicode" - "unicode/utf8" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" - "golang.org/x/text/internal/ucd" -) - -func main() { - gen.Init() - genTables() - gen.Repackage("gen_trieval.go", "trieval.go", "idna") - gen.Repackage("gen_common.go", "common_test.go", "idna") -} - -var runes = map[rune]info{} - -func genTables() { - t := triegen.NewTrie("idna") - - ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - - const cccVirama = 9 - if p.Int(ucd.CanonicalCombiningClass) == cccVirama { - runes[p.Rune(0)] = viramaModifier - } - switch { - case unicode.In(r, unicode.Mark): - runes[r] |= modifier - } - }) - - ucd.Parse(gen.OpenUCDFile("extracted/DerivedJoiningType.txt"), func(p *ucd.Parser) { - switch v := p.String(1); v { - case "L", "D", "T", "R": - runes[p.Rune(0)] |= joinType[v] << joinShift - } - }) - - ucd.Parse(gen.OpenUnicodeFile("idna", "", "IdnaMappingTable.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - - // The mappings table explicitly defines surrogates as invalid. - if !utf8.ValidRune(r) { - return - } - - cat := catFromEntry(p) - isMapped := cat == mapped || cat == disallowedSTD3Mapped || cat == deviation - if !isMapped { - // Only include additional category information for non-mapped - // runes. The additional information is only used after mapping and - // the bits would clash with mapping information. - // TODO: it would be possible to inline this data and avoid - // additional lookups. This is quite tedious, though, so let's first - // see if we need this. - cat |= category(runes[r]) - } - - s := string(p.Runes(2)) - if s != "" && !isMapped { - log.Fatalf("%U: Mapping with non-mapping category %d", r, cat) - } - t.Insert(r, uint64(makeEntry(r, s))+uint64(cat)) - }) - - w := gen.NewCodeWriter() - defer w.WriteGoFile("tables.go", "idna") - - gen.WriteUnicodeVersion(w) - - w.WriteVar("mappings", string(mappings)) - w.WriteVar("xorData", string(xorData)) - - sz, err := t.Gen(w, triegen.Compact(&normCompacter{})) - if err != nil { - log.Fatal(err) - } - w.Size += sz -} - -var ( - // mappings contains replacement strings for mapped runes, each prefixed - // with a byte containing the length of the following string. - mappings = []byte{} - mapCache = map[string]int{} - - // xorData is like mappings, except that it contains XOR data. - // We split these two tables so that we don't get an overflow. - xorData = []byte{} - xorCache = map[string]int{} -) - -// makeEntry creates a trie entry. -func makeEntry(r rune, mapped string) info { - orig := string(r) - - if len(orig) != len(mapped) { - // Store the mapped value as is in the mappings table. - index := len(mappings) - if x, ok := mapCache[mapped]; ok { - index = x - } else { - mapCache[mapped] = index - mappings = append(mappings, byte(len(mapped))) - mappings = append(mappings, mapped...) - } - return info(index) << indexShift - } - - // Create per-byte XOR mask. - var b []byte - for i := 0; i < len(orig); i++ { - b = append(b, orig[i]^mapped[i]) - } - - // Remove leading 0 bytes, but keep at least one byte. - for ; len(b) > 1 && b[0] == 0; b = b[1:] { - } - - if len(b) == 1 { - return xorBit | inlineXOR | info(b[0])<<indexShift - } - mapped = string(b) - - // Store the mapped value as is in the mappings table. - index := len(xorData) - if x, ok := xorCache[mapped]; ok { - index = x - } else { - xorCache[mapped] = index - xorData = append(xorData, byte(len(mapped))) - xorData = append(xorData, mapped...) - } - return xorBit | info(index)<<indexShift -} - -// The following code implements a triegen.Compacter that was originally -// designed for normalization. The IDNA table has some similarities with the -// norm table. Using this compacter, together with the XOR pattern approach, -// reduces the table size by roughly 100K. It can probably be compressed further -// by also including elements of the compacter used by cases, but for now it is -// good enough. - -const maxSparseEntries = 16 - -type normCompacter struct { - sparseBlocks [][]uint64 - sparseOffset []uint16 - sparseCount int -} - -func mostFrequentStride(a []uint64) int { - counts := make(map[int]int) - var v int - for _, x := range a { - if stride := int(x) - v; v != 0 && stride >= 0 { - counts[stride]++ - } - v = int(x) - } - var maxs, maxc int - for stride, cnt := range counts { - if cnt > maxc || (cnt == maxc && stride < maxs) { - maxs, maxc = stride, cnt - } - } - return maxs -} - -func countSparseEntries(a []uint64) int { - stride := mostFrequentStride(a) - var v, count int - for _, tv := range a { - if int(tv)-v != stride { - if tv != 0 { - count++ - } - } - v = int(tv) - } - return count -} - -func (c *normCompacter) Size(v []uint64) (sz int, ok bool) { - if n := countSparseEntries(v); n <= maxSparseEntries { - return (n+1)*4 + 2, true - } - return 0, false -} - -func (c *normCompacter) Store(v []uint64) uint32 { - h := uint32(len(c.sparseOffset)) - c.sparseBlocks = append(c.sparseBlocks, v) - c.sparseOffset = append(c.sparseOffset, uint16(c.sparseCount)) - c.sparseCount += countSparseEntries(v) + 1 - return h -} - -func (c *normCompacter) Handler() string { - return "idnaSparse.lookup" -} - -func (c *normCompacter) Print(w io.Writer) (retErr error) { - p := func(f string, x ...interface{}) { - if _, err := fmt.Fprintf(w, f, x...); retErr == nil && err != nil { - retErr = err - } - } - - ls := len(c.sparseBlocks) - p("// idnaSparseOffset: %d entries, %d bytes\n", ls, ls*2) - p("var idnaSparseOffset = %#v\n\n", c.sparseOffset) - - ns := c.sparseCount - p("// idnaSparseValues: %d entries, %d bytes\n", ns, ns*4) - p("var idnaSparseValues = [%d]valueRange {", ns) - for i, b := range c.sparseBlocks { - p("\n// Block %#x, offset %#x", i, c.sparseOffset[i]) - var v int - stride := mostFrequentStride(b) - n := countSparseEntries(b) - p("\n{value:%#04x,lo:%#02x},", stride, uint8(n)) - for i, nv := range b { - if int(nv)-v != stride { - if v != 0 { - p(",hi:%#02x},", 0x80+i-1) - } - if nv != 0 { - p("\n{value:%#04x,lo:%#02x", nv, 0x80+i) - } - } - v = int(nv) - } - if v != 0 { - p(",hi:%#02x},", 0x80+len(b)-1) - } - } - p("\n}\n\n") - return -} diff --git a/vendor/golang.org/x/text/internal/export/idna/gen_common.go b/vendor/golang.org/x/text/internal/export/idna/gen_common.go deleted file mode 100644 index 360a02b8e..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/gen_common.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This file contains code that is common between the generation code and the -// package's test code. - -import ( - "log" - - "golang.org/x/text/internal/ucd" -) - -func catFromEntry(p *ucd.Parser) (cat category) { - r := p.Rune(0) - switch s := p.String(1); s { - case "valid": - cat = valid - case "disallowed": - cat = disallowed - case "disallowed_STD3_valid": - cat = disallowedSTD3Valid - case "disallowed_STD3_mapped": - cat = disallowedSTD3Mapped - case "mapped": - cat = mapped - case "deviation": - cat = deviation - case "ignored": - cat = ignored - default: - log.Fatalf("%U: Unknown category %q", r, s) - } - if s := p.String(3); s != "" { - if cat != valid { - log.Fatalf(`%U: %s defined for %q; want "valid"`, r, s, p.String(1)) - } - switch s { - case "NV8": - cat = validNV8 - case "XV8": - cat = validXV8 - default: - log.Fatalf("%U: Unexpected exception %q", r, s) - } - } - return cat -} - -var joinType = map[string]info{ - "L": joiningL, - "D": joiningD, - "T": joiningT, - "R": joiningR, -} diff --git a/vendor/golang.org/x/text/internal/export/idna/gen_test.go b/vendor/golang.org/x/text/internal/export/idna/gen_test.go deleted file mode 100644 index 60602ecf5..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/gen_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package idna - -import ( - "testing" - "unicode" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/testtext" - "golang.org/x/text/internal/ucd" -) - -func TestTables(t *testing.T) { - testtext.SkipIfNotLong(t) - - lookup := func(r rune) info { - v, _ := trie.lookupString(string(r)) - return info(v) - } - - ucd.Parse(gen.OpenUnicodeFile("idna", "", "IdnaMappingTable.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - x := lookup(r) - if got, want := x.category(), catFromEntry(p); got != want { - t.Errorf("%U:category: got %x; want %x", r, got, want) - } - - mapped := false - switch p.String(1) { - case "mapped", "disallowed_STD3_mapped", "deviation": - mapped = true - } - if x.isMapped() != mapped { - t.Errorf("%U:isMapped: got %v; want %v", r, x.isMapped(), mapped) - } - if !mapped { - return - } - want := string(p.Runes(2)) - got := string(x.appendMapping(nil, string(r))) - if got != want { - t.Errorf("%U:mapping: got %+q; want %+q", r, got, want) - } - - if x.isMapped() { - return - } - wantMark := unicode.In(r, unicode.Mark) - gotMark := x.isModifier() - if gotMark != wantMark { - t.Errorf("IsMark(%U) = %v; want %v", r, gotMark, wantMark) - } - }) - - ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - x := lookup(r) - got := x.isViramaModifier() - - const cccVirama = 9 - want := p.Int(ucd.CanonicalCombiningClass) == cccVirama - if got != want { - t.Errorf("IsVirama(%U) = %v; want %v", r, got, want) - } - }) - - ucd.Parse(gen.OpenUCDFile("extracted/DerivedJoiningType.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - x := lookup(r) - if x.isMapped() { - return - } - got := x.joinType() - want := joinType[p.String(1)] - if got != want { - t.Errorf("JoinType(%U) = %x; want %x", r, got, want) - } - }) -} diff --git a/vendor/golang.org/x/text/internal/export/idna/gen_trieval.go b/vendor/golang.org/x/text/internal/export/idna/gen_trieval.go deleted file mode 100644 index 3a3229649..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/gen_trieval.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This file contains definitions for interpreting the trie value of the idna -// trie generated by "go run gen*.go". It is shared by both the generator -// program and the resultant package. Sharing is achieved by the generator -// copying gen_trieval.go to trieval.go and changing what's above this comment. - -// info holds information from the IDNA mapping table for a single rune. It is -// the value returned by a trie lookup. In most cases, all information fits in -// a 16-bit value. For mappings, this value may contain an index into a slice -// with the mapped string. Such mappings can consist of the actual mapped value -// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the -// input rune. This technique is used by the cases packages and reduces the -// table size significantly. -// -// The per-rune values have the following format: -// -// if mapped { -// if inlinedXOR { -// 15..13 inline XOR marker -// 12..11 unused -// 10..3 inline XOR mask -// } else { -// 15..3 index into xor or mapping table -// } -// } else { -// 15..13 unused -// 12 modifier (including virama) -// 11 virama modifier -// 10..8 joining type -// 7..3 category type -// } -// 2 use xor pattern -// 1..0 mapped category -// -// See the definitions below for a more detailed description of the various -// bits. -type info uint16 - -const ( - catSmallMask = 0x3 - catBigMask = 0xF8 - indexShift = 3 - xorBit = 0x4 // interpret the index as an xor pattern - inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined. - - joinShift = 8 - joinMask = 0x07 - - viramaModifier = 0x0800 - modifier = 0x1000 -) - -// A category corresponds to a category defined in the IDNA mapping table. -type category uint16 - -const ( - unknown category = 0 // not defined currently in unicode. - mapped category = 1 - disallowedSTD3Mapped category = 2 - deviation category = 3 -) - -const ( - valid category = 0x08 - validNV8 category = 0x18 - validXV8 category = 0x28 - disallowed category = 0x40 - disallowedSTD3Valid category = 0x80 - ignored category = 0xC0 -) - -// join types and additional rune information -const ( - joiningL = (iota + 1) - joiningD - joiningT - joiningR - - //the following types are derived during processing - joinZWJ - joinZWNJ - joinVirama - numJoinTypes -) - -func (c info) isMapped() bool { - return c&0x3 != 0 -} - -func (c info) category() category { - small := c & catSmallMask - if small != 0 { - return category(small) - } - return category(c & catBigMask) -} - -func (c info) joinType() info { - if c.isMapped() { - return 0 - } - return (c >> joinShift) & joinMask -} - -func (c info) isModifier() bool { - return c&(modifier|catSmallMask) == modifier -} - -func (c info) isViramaModifier() bool { - return c&(viramaModifier|catSmallMask) == viramaModifier -} diff --git a/vendor/golang.org/x/text/internal/export/idna/idna.go b/vendor/golang.org/x/text/internal/export/idna/idna.go deleted file mode 100644 index 1d775fa20..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/idna.go +++ /dev/null @@ -1,680 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go gen_trieval.go gen_common.go - -// Package idna implements IDNA2008 using the compatibility processing -// defined by UTS (Unicode Technical Standard) #46, which defines a standard to -// deal with the transition from IDNA2003. -// -// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC -// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894. -// UTS #46 is defined in http://www.unicode.org/reports/tr46. -// See http://unicode.org/cldr/utility/idna.jsp for a visualization of the -// differences between these two standards. -package idna // import "golang.org/x/text/internal/export/idna" - -import ( - "fmt" - "strings" - "unicode/utf8" - - "golang.org/x/text/secure/bidirule" - "golang.org/x/text/unicode/norm" -) - -// NOTE: Unlike common practice in Go APIs, the functions will return a -// sanitized domain name in case of errors. Browsers sometimes use a partially -// evaluated string as lookup. -// TODO: the current error handling is, in my opinion, the least opinionated. -// Other strategies are also viable, though: -// Option 1) Return an empty string in case of error, but allow the user to -// specify explicitly which errors to ignore. -// Option 2) Return the partially evaluated string if it is itself a valid -// string, otherwise return the empty string in case of error. -// Option 3) Option 1 and 2. -// Option 4) Always return an empty string for now and implement Option 1 as -// needed, and document that the return string may not be empty in case of -// error in the future. -// I think Option 1 is best, but it is quite opinionated. - -// ToASCII is a wrapper for Punycode.ToASCII. -func ToASCII(s string) (string, error) { - return Punycode.process(s, true) -} - -// ToUnicode is a wrapper for Punycode.ToUnicode. -func ToUnicode(s string) (string, error) { - return Punycode.process(s, false) -} - -// An Option configures a Profile at creation time. -type Option func(*options) - -// Transitional sets a Profile to use the Transitional mapping as defined in UTS -// #46. This will cause, for example, "ß" to be mapped to "ss". Using the -// transitional mapping provides a compromise between IDNA2003 and IDNA2008 -// compatibility. It is used by most browsers when resolving domain names. This -// option is only meaningful if combined with MapForLookup. -func Transitional(transitional bool) Option { - return func(o *options) { o.transitional = true } -} - -// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts -// are longer than allowed by the RFC. -func VerifyDNSLength(verify bool) Option { - return func(o *options) { o.verifyDNSLength = verify } -} - -// RemoveLeadingDots removes leading label separators. Leading runes that map to -// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well. -// -// This is the behavior suggested by the UTS #46 and is adopted by some -// browsers. -func RemoveLeadingDots(remove bool) Option { - return func(o *options) { o.removeLeadingDots = remove } -} - -// ValidateLabels sets whether to check the mandatory label validation criteria -// as defined in Section 5.4 of RFC 5891. This includes testing for correct use -// of hyphens ('-'), normalization, validity of runes, and the context rules. -func ValidateLabels(enable bool) Option { - return func(o *options) { - // Don't override existing mappings, but set one that at least checks - // normalization if it is not set. - if o.mapping == nil && enable { - o.mapping = normalize - } - o.trie = trie - o.validateLabels = enable - o.fromPuny = validateFromPunycode - } -} - -// StrictDomainName limits the set of permissible ASCII characters to those -// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the -// hyphen). This is set by default for MapForLookup and ValidateForRegistration. -// -// This option is useful, for instance, for browsers that allow characters -// outside this range, for example a '_' (U+005F LOW LINE). See -// http://www.rfc-editor.org/std/std3.txt for more details This option -// corresponds to the UseSTD3ASCIIRules option in UTS #46. -func StrictDomainName(use bool) Option { - return func(o *options) { - o.trie = trie - o.useSTD3Rules = use - o.fromPuny = validateFromPunycode - } -} - -// NOTE: the following options pull in tables. The tables should not be linked -// in as long as the options are not used. - -// BidiRule enables the Bidi rule as defined in RFC 5893. Any application -// that relies on proper validation of labels should include this rule. -func BidiRule() Option { - return func(o *options) { o.bidirule = bidirule.ValidString } -} - -// ValidateForRegistration sets validation options to verify that a given IDN is -// properly formatted for registration as defined by Section 4 of RFC 5891. -func ValidateForRegistration() Option { - return func(o *options) { - o.mapping = validateRegistration - StrictDomainName(true)(o) - ValidateLabels(true)(o) - VerifyDNSLength(true)(o) - BidiRule()(o) - } -} - -// MapForLookup sets validation and mapping options such that a given IDN is -// transformed for domain name lookup according to the requirements set out in -// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894, -// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option -// to add this check. -// -// The mappings include normalization and mapping case, width and other -// compatibility mappings. -func MapForLookup() Option { - return func(o *options) { - o.mapping = validateAndMap - StrictDomainName(true)(o) - ValidateLabels(true)(o) - RemoveLeadingDots(true)(o) - } -} - -type options struct { - transitional bool - useSTD3Rules bool - validateLabels bool - verifyDNSLength bool - removeLeadingDots bool - - trie *idnaTrie - - // fromPuny calls validation rules when converting A-labels to U-labels. - fromPuny func(p *Profile, s string) error - - // mapping implements a validation and mapping step as defined in RFC 5895 - // or UTS 46, tailored to, for example, domain registration or lookup. - mapping func(p *Profile, s string) (string, error) - - // bidirule, if specified, checks whether s conforms to the Bidi Rule - // defined in RFC 5893. - bidirule func(s string) bool -} - -// A Profile defines the configuration of a IDNA mapper. -type Profile struct { - options -} - -func apply(o *options, opts []Option) { - for _, f := range opts { - f(o) - } -} - -// New creates a new Profile. -// -// With no options, the returned Profile is the most permissive and equals the -// Punycode Profile. Options can be passed to further restrict the Profile. The -// MapForLookup and ValidateForRegistration options set a collection of options, -// for lookup and registration purposes respectively, which can be tailored by -// adding more fine-grained options, where later options override earlier -// options. -func New(o ...Option) *Profile { - p := &Profile{} - apply(&p.options, o) - return p -} - -// ToASCII converts a domain or domain label to its ASCII form. For example, -// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and -// ToASCII("golang") is "golang". If an error is encountered it will return -// an error and a (partially) processed result. -func (p *Profile) ToASCII(s string) (string, error) { - return p.process(s, true) -} - -// ToUnicode converts a domain or domain label to its Unicode form. For example, -// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and -// ToUnicode("golang") is "golang". If an error is encountered it will return -// an error and a (partially) processed result. -func (p *Profile) ToUnicode(s string) (string, error) { - pp := *p - pp.transitional = false - return pp.process(s, false) -} - -// String reports a string with a description of the profile for debugging -// purposes. The string format may change with different versions. -func (p *Profile) String() string { - s := "" - if p.transitional { - s = "Transitional" - } else { - s = "NonTransitional" - } - if p.useSTD3Rules { - s += ":UseSTD3Rules" - } - if p.validateLabels { - s += ":ValidateLabels" - } - if p.verifyDNSLength { - s += ":VerifyDNSLength" - } - return s -} - -var ( - // Punycode is a Profile that does raw punycode processing with a minimum - // of validation. - Punycode *Profile = punycode - - // Lookup is the recommended profile for looking up domain names, according - // to Section 5 of RFC 5891. The exact configuration of this profile may - // change over time. - Lookup *Profile = lookup - - // Display is the recommended profile for displaying domain names. - // The configuration of this profile may change over time. - Display *Profile = display - - // Registration is the recommended profile for checking whether a given - // IDN is valid for registration, according to Section 4 of RFC 5891. - Registration *Profile = registration - - punycode = &Profile{} - lookup = &Profile{options{ - transitional: true, - useSTD3Rules: true, - validateLabels: true, - removeLeadingDots: true, - trie: trie, - fromPuny: validateFromPunycode, - mapping: validateAndMap, - bidirule: bidirule.ValidString, - }} - display = &Profile{options{ - useSTD3Rules: true, - validateLabels: true, - removeLeadingDots: true, - trie: trie, - fromPuny: validateFromPunycode, - mapping: validateAndMap, - bidirule: bidirule.ValidString, - }} - registration = &Profile{options{ - useSTD3Rules: true, - validateLabels: true, - verifyDNSLength: true, - trie: trie, - fromPuny: validateFromPunycode, - mapping: validateRegistration, - bidirule: bidirule.ValidString, - }} - - // TODO: profiles - // Register: recommended for approving domain names: don't do any mappings - // but rather reject on invalid input. Bundle or block deviation characters. -) - -type labelError struct{ label, code_ string } - -func (e labelError) code() string { return e.code_ } -func (e labelError) Error() string { - return fmt.Sprintf("idna: invalid label %q", e.label) -} - -type runeError rune - -func (e runeError) code() string { return "P1" } -func (e runeError) Error() string { - return fmt.Sprintf("idna: disallowed rune %U", e) -} - -// process implements the algorithm described in section 4 of UTS #46, -// see http://www.unicode.org/reports/tr46. -func (p *Profile) process(s string, toASCII bool) (string, error) { - var err error - if p.mapping != nil { - s, err = p.mapping(p, s) - } - // Remove leading empty labels. - if p.removeLeadingDots { - for ; len(s) > 0 && s[0] == '.'; s = s[1:] { - } - } - // It seems like we should only create this error on ToASCII, but the - // UTS 46 conformance tests suggests we should always check this. - if err == nil && p.verifyDNSLength && s == "" { - err = &labelError{s, "A4"} - } - labels := labelIter{orig: s} - for ; !labels.done(); labels.next() { - label := labels.label() - if label == "" { - // Empty labels are not okay. The label iterator skips the last - // label if it is empty. - if err == nil && p.verifyDNSLength { - err = &labelError{s, "A4"} - } - continue - } - if strings.HasPrefix(label, acePrefix) { - u, err2 := decode(label[len(acePrefix):]) - if err2 != nil { - if err == nil { - err = err2 - } - // Spec says keep the old label. - continue - } - labels.set(u) - if err == nil && p.validateLabels { - err = p.fromPuny(p, u) - } - if err == nil { - // This should be called on NonTransitional, according to the - // spec, but that currently does not have any effect. Use the - // original profile to preserve options. - err = p.validateLabel(u) - } - } else if err == nil { - err = p.validateLabel(label) - } - } - if toASCII { - for labels.reset(); !labels.done(); labels.next() { - label := labels.label() - if !ascii(label) { - a, err2 := encode(acePrefix, label) - if err == nil { - err = err2 - } - label = a - labels.set(a) - } - n := len(label) - if p.verifyDNSLength && err == nil && (n == 0 || n > 63) { - err = &labelError{label, "A4"} - } - } - } - s = labels.result() - if toASCII && p.verifyDNSLength && err == nil { - // Compute the length of the domain name minus the root label and its dot. - n := len(s) - if n > 0 && s[n-1] == '.' { - n-- - } - if len(s) < 1 || n > 253 { - err = &labelError{s, "A4"} - } - } - return s, err -} - -func normalize(p *Profile, s string) (string, error) { - return norm.NFC.String(s), nil -} - -func validateRegistration(p *Profile, s string) (string, error) { - if !norm.NFC.IsNormalString(s) { - return s, &labelError{s, "V1"} - } - for i := 0; i < len(s); { - v, sz := trie.lookupString(s[i:]) - // Copy bytes not copied so far. - switch p.simplify(info(v).category()) { - // TODO: handle the NV8 defined in the Unicode idna data set to allow - // for strict conformance to IDNA2008. - case valid, deviation: - case disallowed, mapped, unknown, ignored: - r, _ := utf8.DecodeRuneInString(s[i:]) - return s, runeError(r) - } - i += sz - } - return s, nil -} - -func validateAndMap(p *Profile, s string) (string, error) { - var ( - err error - b []byte - k int - ) - for i := 0; i < len(s); { - v, sz := trie.lookupString(s[i:]) - start := i - i += sz - // Copy bytes not copied so far. - switch p.simplify(info(v).category()) { - case valid: - continue - case disallowed: - if err == nil { - r, _ := utf8.DecodeRuneInString(s[start:]) - err = runeError(r) - } - continue - case mapped, deviation: - b = append(b, s[k:start]...) - b = info(v).appendMapping(b, s[start:i]) - case ignored: - b = append(b, s[k:start]...) - // drop the rune - case unknown: - b = append(b, s[k:start]...) - b = append(b, "\ufffd"...) - } - k = i - } - if k == 0 { - // No changes so far. - s = norm.NFC.String(s) - } else { - b = append(b, s[k:]...) - if norm.NFC.QuickSpan(b) != len(b) { - b = norm.NFC.Bytes(b) - } - // TODO: the punycode converters require strings as input. - s = string(b) - } - return s, err -} - -// A labelIter allows iterating over domain name labels. -type labelIter struct { - orig string - slice []string - curStart int - curEnd int - i int -} - -func (l *labelIter) reset() { - l.curStart = 0 - l.curEnd = 0 - l.i = 0 -} - -func (l *labelIter) done() bool { - return l.curStart >= len(l.orig) -} - -func (l *labelIter) result() string { - if l.slice != nil { - return strings.Join(l.slice, ".") - } - return l.orig -} - -func (l *labelIter) label() string { - if l.slice != nil { - return l.slice[l.i] - } - p := strings.IndexByte(l.orig[l.curStart:], '.') - l.curEnd = l.curStart + p - if p == -1 { - l.curEnd = len(l.orig) - } - return l.orig[l.curStart:l.curEnd] -} - -// next sets the value to the next label. It skips the last label if it is empty. -func (l *labelIter) next() { - l.i++ - if l.slice != nil { - if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" { - l.curStart = len(l.orig) - } - } else { - l.curStart = l.curEnd + 1 - if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' { - l.curStart = len(l.orig) - } - } -} - -func (l *labelIter) set(s string) { - if l.slice == nil { - l.slice = strings.Split(l.orig, ".") - } - l.slice[l.i] = s -} - -// acePrefix is the ASCII Compatible Encoding prefix. -const acePrefix = "xn--" - -func (p *Profile) simplify(cat category) category { - switch cat { - case disallowedSTD3Mapped: - if p.useSTD3Rules { - cat = disallowed - } else { - cat = mapped - } - case disallowedSTD3Valid: - if p.useSTD3Rules { - cat = disallowed - } else { - cat = valid - } - case deviation: - if !p.transitional { - cat = valid - } - case validNV8, validXV8: - // TODO: handle V2008 - cat = valid - } - return cat -} - -func validateFromPunycode(p *Profile, s string) error { - if !norm.NFC.IsNormalString(s) { - return &labelError{s, "V1"} - } - for i := 0; i < len(s); { - v, sz := trie.lookupString(s[i:]) - if c := p.simplify(info(v).category()); c != valid && c != deviation { - return &labelError{s, "V6"} - } - i += sz - } - return nil -} - -const ( - zwnj = "\u200c" - zwj = "\u200d" -) - -type joinState int8 - -const ( - stateStart joinState = iota - stateVirama - stateBefore - stateBeforeVirama - stateAfter - stateFAIL -) - -var joinStates = [][numJoinTypes]joinState{ - stateStart: { - joiningL: stateBefore, - joiningD: stateBefore, - joinZWNJ: stateFAIL, - joinZWJ: stateFAIL, - joinVirama: stateVirama, - }, - stateVirama: { - joiningL: stateBefore, - joiningD: stateBefore, - }, - stateBefore: { - joiningL: stateBefore, - joiningD: stateBefore, - joiningT: stateBefore, - joinZWNJ: stateAfter, - joinZWJ: stateFAIL, - joinVirama: stateBeforeVirama, - }, - stateBeforeVirama: { - joiningL: stateBefore, - joiningD: stateBefore, - joiningT: stateBefore, - }, - stateAfter: { - joiningL: stateFAIL, - joiningD: stateBefore, - joiningT: stateAfter, - joiningR: stateStart, - joinZWNJ: stateFAIL, - joinZWJ: stateFAIL, - joinVirama: stateAfter, // no-op as we can't accept joiners here - }, - stateFAIL: { - 0: stateFAIL, - joiningL: stateFAIL, - joiningD: stateFAIL, - joiningT: stateFAIL, - joiningR: stateFAIL, - joinZWNJ: stateFAIL, - joinZWJ: stateFAIL, - joinVirama: stateFAIL, - }, -} - -// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are -// already implicitly satisfied by the overall implementation. -func (p *Profile) validateLabel(s string) error { - if s == "" { - if p.verifyDNSLength { - return &labelError{s, "A4"} - } - return nil - } - if p.bidirule != nil && !p.bidirule(s) { - return &labelError{s, "B"} - } - if !p.validateLabels { - return nil - } - trie := p.trie // p.validateLabels is only set if trie is set. - if len(s) > 4 && s[2] == '-' && s[3] == '-' { - return &labelError{s, "V2"} - } - if s[0] == '-' || s[len(s)-1] == '-' { - return &labelError{s, "V3"} - } - // TODO: merge the use of this in the trie. - v, sz := trie.lookupString(s) - x := info(v) - if x.isModifier() { - return &labelError{s, "V5"} - } - // Quickly return in the absence of zero-width (non) joiners. - if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 { - return nil - } - st := stateStart - for i := 0; ; { - jt := x.joinType() - if s[i:i+sz] == zwj { - jt = joinZWJ - } else if s[i:i+sz] == zwnj { - jt = joinZWNJ - } - st = joinStates[st][jt] - if x.isViramaModifier() { - st = joinStates[st][joinVirama] - } - if i += sz; i == len(s) { - break - } - v, sz = trie.lookupString(s[i:]) - x = info(v) - } - if st == stateFAIL || st == stateAfter { - return &labelError{s, "C"} - } - return nil -} - -func ascii(s string) bool { - for i := 0; i < len(s); i++ { - if s[i] >= utf8.RuneSelf { - return false - } - } - return true -} diff --git a/vendor/golang.org/x/text/internal/export/idna/idna_test.go b/vendor/golang.org/x/text/internal/export/idna/idna_test.go deleted file mode 100644 index 82ead035a..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/idna_test.go +++ /dev/null @@ -1,299 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package idna - -import ( - "fmt" - "strconv" - "strings" - "testing" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/testtext" - "golang.org/x/text/internal/ucd" -) - -func TestAllocToUnicode(t *testing.T) { - avg := testtext.AllocsPerRun(1000, func() { - ToUnicode("www.golang.org") - }) - if avg > 0 { - t.Errorf("got %f; want 0", avg) - } -} - -func TestAllocToASCII(t *testing.T) { - avg := testtext.AllocsPerRun(1000, func() { - ToASCII("www.golang.org") - }) - if avg > 0 { - t.Errorf("got %f; want 0", avg) - } -} - -func TestProfiles(t *testing.T) { - testCases := []struct { - name string - want, got *Profile - }{ - {"Punycode", punycode, New()}, - {"Registration", registration, New(ValidateForRegistration())}, - {"Registration", registration, New( - ValidateForRegistration(), - VerifyDNSLength(true), - BidiRule(), - )}, - {"Lookup", lookup, New(MapForLookup(), BidiRule(), Transitional(true))}, - {"Display", display, New(MapForLookup(), BidiRule())}, - } - for _, tc := range testCases { - // Functions are not comparable, but the printed version will include - // their pointers. - got := fmt.Sprintf("%#v", tc.got) - want := fmt.Sprintf("%#v", tc.want) - if got != want { - t.Errorf("%s: \ngot %#v,\nwant %#v", tc.name, got, want) - } - } -} - -// doTest performs a single test f(input) and verifies that the output matches -// out and that the returned error is expected. The errors string contains -// all allowed error codes as categorized in -// http://www.unicode.org/Public/idna/9.0.0/IdnaTest.txt: -// P: Processing -// V: Validity -// A: to ASCII -// B: Bidi -// C: Context J -func doTest(t *testing.T, f func(string) (string, error), name, input, want, errors string) { - errors = strings.Trim(errors, "[]") - test := "ok" - if errors != "" { - test = "err:" + errors - } - // Replace some of the escape sequences to make it easier to single out - // tests on the command name. - in := strings.Trim(strconv.QuoteToASCII(input), `"`) - in = strings.Replace(in, `\u`, "#", -1) - in = strings.Replace(in, `\U`, "#", -1) - name = fmt.Sprintf("%s/%s/%s", name, in, test) - - testtext.Run(t, name, func(t *testing.T) { - got, err := f(input) - - if err != nil { - code := err.(interface { - code() string - }).code() - if strings.Index(errors, code) == -1 { - t.Errorf("error %q not in set of expected errors {%v}", code, errors) - } - } else if errors != "" { - t.Errorf("no errors; want error in {%v}", errors) - } - - if want != "" && got != want { - t.Errorf(`string: got %+q; want %+q`, got, want) - } - }) -} - -// TestLabelErrors tests strings returned in case of error. All results should -// be identical to the reference implementation and can be verified at -// http://unicode.org/cldr/utility/idna.jsp. The reference implementation, -// however, seems to not display Bidi and ContextJ errors. -// -// In some cases the behavior of browsers is added as a comment. In all cases, -// whenever a resolve search returns an error here, Chrome will treat the input -// string as a search string (including those for Bidi and Context J errors), -// unless noted otherwise. -func TestLabelErrors(t *testing.T) { - encode := func(s string) string { s, _ = encode(acePrefix, s); return s } - type kind struct { - name string - f func(string) (string, error) - } - punyA := kind{"PunycodeA", punycode.ToASCII} - resolve := kind{"ResolveA", Lookup.ToASCII} - display := kind{"ToUnicode", Display.ToUnicode} - p := New(VerifyDNSLength(true), MapForLookup(), BidiRule()) - lengthU := kind{"CheckLengthU", p.ToUnicode} - lengthA := kind{"CheckLengthA", p.ToASCII} - p = New(MapForLookup(), StrictDomainName(false)) - std3 := kind{"STD3", p.ToASCII} - - testCases := []struct { - kind - input string - want string - wantErr string - }{ - {lengthU, "", "", "A4"}, // From UTS 46 conformance test. - {lengthA, "", "", "A4"}, - - {lengthU, "xn--", "", "A4"}, - {lengthU, "foo.xn--", "foo.", "A4"}, // TODO: is dropping xn-- correct? - {lengthU, "xn--.foo", ".foo", "A4"}, - {lengthU, "foo.xn--.bar", "foo..bar", "A4"}, - - {display, "xn--", "", ""}, - {display, "foo.xn--", "foo.", ""}, // TODO: is dropping xn-- correct? - {display, "xn--.foo", ".foo", ""}, - {display, "foo.xn--.bar", "foo..bar", ""}, - - {lengthA, "a..b", "a..b", "A4"}, - {punyA, ".b", ".b", ""}, - // For backwards compatibility, the Punycode profile does not map runes. - {punyA, "\u3002b", "xn--b-83t", ""}, - {punyA, "..b", "..b", ""}, - // Only strip leading empty labels for certain profiles. Stripping - // leading empty labels here but not for "empty" punycode above seems - // inconsistent, but seems to be applied by both the conformance test - // and Chrome. So we turn it off by default, support it as an option, - // and enable it in profiles where it seems commonplace. - {lengthA, ".b", "b", ""}, - {lengthA, "\u3002b", "b", ""}, - {lengthA, "..b", "b", ""}, - {lengthA, "b..", "b..", ""}, - - {resolve, "a..b", "a..b", ""}, - {resolve, ".b", "b", ""}, - {resolve, "\u3002b", "b", ""}, - {resolve, "..b", "b", ""}, - {resolve, "b..", "b..", ""}, - - // Raw punycode - {punyA, "", "", ""}, - {punyA, "*.foo.com", "*.foo.com", ""}, - {punyA, "Foo.com", "Foo.com", ""}, - - // STD3 rules - {display, "*.foo.com", "*.foo.com", "P1"}, - {std3, "*.foo.com", "*.foo.com", ""}, - - // Don't map U+2490 (DIGIT NINE FULL STOP). This is the behavior of - // Chrome, Safari, and IE. Firefox will first map ⒐ to 9. and return - // lab9.be. - {resolve, "lab⒐be", "xn--labbe-zh9b", "P1"}, // encode("lab⒐be") - {display, "lab⒐be", "lab⒐be", "P1"}, - - {resolve, "plan⒐faß.de", "xn--planfass-c31e.de", "P1"}, // encode("plan⒐fass") + ".de" - {display, "Plan⒐faß.de", "plan⒐faß.de", "P1"}, - - // Chrome 54.0 recognizes the error and treats this input verbatim as a - // search string. - // Safari 10.0 (non-conform spec) decomposes "⒈" and computes the - // punycode on the result using transitional mapping. - // Firefox 49.0.1 goes haywire on this string and prints a bunch of what - // seems to be nested punycode encodings. - {resolve, "日本⒈co.ßßß.de", "xn--co-wuw5954azlb.ssssss.de", "P1"}, - {display, "日本⒈co.ßßß.de", "日本⒈co.ßßß.de", "P1"}, - - {resolve, "a\u200Cb", "ab", ""}, - {display, "a\u200Cb", "a\u200Cb", "C"}, - - {resolve, encode("a\u200Cb"), encode("a\u200Cb"), "C"}, - {display, "a\u200Cb", "a\u200Cb", "C"}, - - {resolve, "grﻋﺮﺑﻲ.de", "xn--gr-gtd9a1b0g.de", "B"}, - { - // Notice how the string gets transformed, even with an error. - // Chrome will use the original string if it finds an error, so not - // the transformed one. - display, - "gr\ufecb\ufeae\ufe91\ufef2.de", - "gr\u0639\u0631\u0628\u064a.de", - "B", - }, - - {resolve, "\u0671.\u03c3\u07dc", "xn--qib.xn--4xa21s", "B"}, // ٱ.σߜ - {display, "\u0671.\u03c3\u07dc", "\u0671.\u03c3\u07dc", "B"}, - - // normalize input - {resolve, "a\u0323\u0322", "xn--jta191l", ""}, // ạ̢ - {display, "a\u0323\u0322", "\u1ea1\u0322", ""}, - - // Non-normalized strings are not normalized when they originate from - // punycode. Despite the error, Chrome, Safari and Firefox will attempt - // to look up the input punycode. - {resolve, encode("a\u0323\u0322") + ".com", "xn--a-tdbc.com", "V1"}, - {display, encode("a\u0323\u0322") + ".com", "a\u0323\u0322.com", "V1"}, - } - - for _, tc := range testCases { - doTest(t, tc.f, tc.name, tc.input, tc.want, tc.wantErr) - } -} - -func TestConformance(t *testing.T) { - testtext.SkipIfNotLong(t) - - r := gen.OpenUnicodeFile("idna", "", "IdnaTest.txt") - defer r.Close() - - section := "main" - started := false - p := ucd.New(r, ucd.CommentHandler(func(s string) { - if started { - section = strings.ToLower(strings.Split(s, " ")[0]) - } - })) - transitional := New(Transitional(true), VerifyDNSLength(true), BidiRule(), MapForLookup()) - nonTransitional := New(VerifyDNSLength(true), BidiRule(), MapForLookup()) - for p.Next() { - started = true - - // What to test - profiles := []*Profile{} - switch p.String(0) { - case "T": - profiles = append(profiles, transitional) - case "N": - profiles = append(profiles, nonTransitional) - case "B": - profiles = append(profiles, transitional) - profiles = append(profiles, nonTransitional) - } - - src := unescape(p.String(1)) - - wantToUnicode := unescape(p.String(2)) - if wantToUnicode == "" { - wantToUnicode = src - } - wantToASCII := unescape(p.String(3)) - if wantToASCII == "" { - wantToASCII = wantToUnicode - } - wantErrToUnicode := "" - if strings.HasPrefix(wantToUnicode, "[") { - wantErrToUnicode = wantToUnicode - wantToUnicode = "" - } - wantErrToASCII := "" - if strings.HasPrefix(wantToASCII, "[") { - wantErrToASCII = wantToASCII - wantToASCII = "" - } - - // TODO: also do IDNA tests. - // invalidInIDNA2008 := p.String(4) == "NV8" - - for _, p := range profiles { - name := fmt.Sprintf("%s:%s", section, p) - doTest(t, p.ToUnicode, name+":ToUnicode", src, wantToUnicode, wantErrToUnicode) - doTest(t, p.ToASCII, name+":ToASCII", src, wantToASCII, wantErrToASCII) - } - } -} - -func unescape(s string) string { - s, err := strconv.Unquote(`"` + s + `"`) - if err != nil { - panic(err) - } - return s -} diff --git a/vendor/golang.org/x/text/internal/export/idna/punycode.go b/vendor/golang.org/x/text/internal/export/idna/punycode.go deleted file mode 100644 index f0cbd487b..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/punycode.go +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package idna - -// This file implements the Punycode algorithm from RFC 3492. - -import ( - "math" - "strings" - "unicode/utf8" -) - -// These parameter values are specified in section 5. -// -// All computation is done with int32s, so that overflow behavior is identical -// regardless of whether int is 32-bit or 64-bit. -const ( - base int32 = 36 - damp int32 = 700 - initialBias int32 = 72 - initialN int32 = 128 - skew int32 = 38 - tmax int32 = 26 - tmin int32 = 1 -) - -func punyError(s string) error { return &labelError{s, "A3"} } - -// decode decodes a string as specified in section 6.2. -func decode(encoded string) (string, error) { - if encoded == "" { - return "", nil - } - pos := 1 + strings.LastIndex(encoded, "-") - if pos == 1 { - return "", punyError(encoded) - } - if pos == len(encoded) { - return encoded[:len(encoded)-1], nil - } - output := make([]rune, 0, len(encoded)) - if pos != 0 { - for _, r := range encoded[:pos-1] { - output = append(output, r) - } - } - i, n, bias := int32(0), initialN, initialBias - for pos < len(encoded) { - oldI, w := i, int32(1) - for k := base; ; k += base { - if pos == len(encoded) { - return "", punyError(encoded) - } - digit, ok := decodeDigit(encoded[pos]) - if !ok { - return "", punyError(encoded) - } - pos++ - i += digit * w - if i < 0 { - return "", punyError(encoded) - } - t := k - bias - if t < tmin { - t = tmin - } else if t > tmax { - t = tmax - } - if digit < t { - break - } - w *= base - t - if w >= math.MaxInt32/base { - return "", punyError(encoded) - } - } - x := int32(len(output) + 1) - bias = adapt(i-oldI, x, oldI == 0) - n += i / x - i %= x - if n > utf8.MaxRune || len(output) >= 1024 { - return "", punyError(encoded) - } - output = append(output, 0) - copy(output[i+1:], output[i:]) - output[i] = n - i++ - } - return string(output), nil -} - -// encode encodes a string as specified in section 6.3 and prepends prefix to -// the result. -// -// The "while h < length(input)" line in the specification becomes "for -// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes. -func encode(prefix, s string) (string, error) { - output := make([]byte, len(prefix), len(prefix)+1+2*len(s)) - copy(output, prefix) - delta, n, bias := int32(0), initialN, initialBias - b, remaining := int32(0), int32(0) - for _, r := range s { - if r < 0x80 { - b++ - output = append(output, byte(r)) - } else { - remaining++ - } - } - h := b - if b > 0 { - output = append(output, '-') - } - for remaining != 0 { - m := int32(0x7fffffff) - for _, r := range s { - if m > r && r >= n { - m = r - } - } - delta += (m - n) * (h + 1) - if delta < 0 { - return "", punyError(s) - } - n = m - for _, r := range s { - if r < n { - delta++ - if delta < 0 { - return "", punyError(s) - } - continue - } - if r > n { - continue - } - q := delta - for k := base; ; k += base { - t := k - bias - if t < tmin { - t = tmin - } else if t > tmax { - t = tmax - } - if q < t { - break - } - output = append(output, encodeDigit(t+(q-t)%(base-t))) - q = (q - t) / (base - t) - } - output = append(output, encodeDigit(q)) - bias = adapt(delta, h+1, h == b) - delta = 0 - h++ - remaining-- - } - delta++ - n++ - } - return string(output), nil -} - -func decodeDigit(x byte) (digit int32, ok bool) { - switch { - case '0' <= x && x <= '9': - return int32(x - ('0' - 26)), true - case 'A' <= x && x <= 'Z': - return int32(x - 'A'), true - case 'a' <= x && x <= 'z': - return int32(x - 'a'), true - } - return 0, false -} - -func encodeDigit(digit int32) byte { - switch { - case 0 <= digit && digit < 26: - return byte(digit + 'a') - case 26 <= digit && digit < 36: - return byte(digit + ('0' - 26)) - } - panic("idna: internal error in punycode encoding") -} - -// adapt is the bias adaptation function specified in section 6.1. -func adapt(delta, numPoints int32, firstTime bool) int32 { - if firstTime { - delta /= damp - } else { - delta /= 2 - } - delta += delta / numPoints - k := int32(0) - for delta > ((base-tmin)*tmax)/2 { - delta /= base - tmin - k += base - } - return k + (base-tmin+1)*delta/(delta+skew) -} diff --git a/vendor/golang.org/x/text/internal/export/idna/punycode_test.go b/vendor/golang.org/x/text/internal/export/idna/punycode_test.go deleted file mode 100644 index 2d99239ec..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/punycode_test.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package idna - -import ( - "strings" - "testing" -) - -var punycodeTestCases = [...]struct { - s, encoded string -}{ - {"", ""}, - {"-", "--"}, - {"-a", "-a-"}, - {"-a-", "-a--"}, - {"a", "a-"}, - {"a-", "a--"}, - {"a-b", "a-b-"}, - {"books", "books-"}, - {"bücher", "bcher-kva"}, - {"Hello世界", "Hello-ck1hg65u"}, - {"ü", "tda"}, - {"üý", "tdac"}, - - // The test cases below come from RFC 3492 section 7.1 with Errata 3026. - { - // (A) Arabic (Egyptian). - "\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644" + - "\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F", - "egbpdaj6bu4bxfgehfvwxn", - }, - { - // (B) Chinese (simplified). - "\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2D\u6587", - "ihqwcrb4cv8a8dqg056pqjye", - }, - { - // (C) Chinese (traditional). - "\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587", - "ihqwctvzc91f659drss3x8bo0yb", - }, - { - // (D) Czech. - "\u0050\u0072\u006F\u010D\u0070\u0072\u006F\u0073\u0074" + - "\u011B\u006E\u0065\u006D\u006C\u0075\u0076\u00ED\u010D" + - "\u0065\u0073\u006B\u0079", - "Proprostnemluvesky-uyb24dma41a", - }, - { - // (E) Hebrew. - "\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8" + - "\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2" + - "\u05D1\u05E8\u05D9\u05EA", - "4dbcagdahymbxekheh6e0a7fei0b", - }, - { - // (F) Hindi (Devanagari). - "\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D" + - "\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939" + - "\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947" + - "\u0939\u0948\u0902", - "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", - }, - { - // (G) Japanese (kanji and hiragana). - "\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092" + - "\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B", - "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", - }, - { - // (H) Korean (Hangul syllables). - "\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774" + - "\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74" + - "\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C", - "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5j" + - "psd879ccm6fea98c", - }, - { - // (I) Russian (Cyrillic). - "\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E" + - "\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440" + - "\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A" + - "\u0438", - "b1abfaaepdrnnbgefbadotcwatmq2g4l", - }, - { - // (J) Spanish. - "\u0050\u006F\u0072\u0071\u0075\u00E9\u006E\u006F\u0070" + - "\u0075\u0065\u0064\u0065\u006E\u0073\u0069\u006D\u0070" + - "\u006C\u0065\u006D\u0065\u006E\u0074\u0065\u0068\u0061" + - "\u0062\u006C\u0061\u0072\u0065\u006E\u0045\u0073\u0070" + - "\u0061\u00F1\u006F\u006C", - "PorqunopuedensimplementehablarenEspaol-fmd56a", - }, - { - // (K) Vietnamese. - "\u0054\u1EA1\u0069\u0073\u0061\u006F\u0068\u1ECD\u006B" + - "\u0068\u00F4\u006E\u0067\u0074\u0068\u1EC3\u0063\u0068" + - "\u1EC9\u006E\u00F3\u0069\u0074\u0069\u1EBF\u006E\u0067" + - "\u0056\u0069\u1EC7\u0074", - "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", - }, - { - // (L) 3<nen>B<gumi><kinpachi><sensei>. - "\u0033\u5E74\u0042\u7D44\u91D1\u516B\u5148\u751F", - "3B-ww4c5e180e575a65lsy2b", - }, - { - // (M) <amuro><namie>-with-SUPER-MONKEYS. - "\u5B89\u5BA4\u5948\u7F8E\u6075\u002D\u0077\u0069\u0074" + - "\u0068\u002D\u0053\u0055\u0050\u0045\u0052\u002D\u004D" + - "\u004F\u004E\u004B\u0045\u0059\u0053", - "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", - }, - { - // (N) Hello-Another-Way-<sorezore><no><basho>. - "\u0048\u0065\u006C\u006C\u006F\u002D\u0041\u006E\u006F" + - "\u0074\u0068\u0065\u0072\u002D\u0057\u0061\u0079\u002D" + - "\u305D\u308C\u305E\u308C\u306E\u5834\u6240", - "Hello-Another-Way--fc4qua05auwb3674vfr0b", - }, - { - // (O) <hitotsu><yane><no><shita>2. - "\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B\u0032", - "2-u9tlzr9756bt3uc0v", - }, - { - // (P) Maji<de>Koi<suru>5<byou><mae> - "\u004D\u0061\u006A\u0069\u3067\u004B\u006F\u0069\u3059" + - "\u308B\u0035\u79D2\u524D", - "MajiKoi5-783gue6qz075azm5e", - }, - { - // (Q) <pafii>de<runba> - "\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", - "de-jg4avhby1noc0d", - }, - { - // (R) <sono><supiido><de> - "\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067", - "d9juau41awczczp", - }, - { - // (S) -> $1.00 <- - "\u002D\u003E\u0020\u0024\u0031\u002E\u0030\u0030\u0020" + - "\u003C\u002D", - "-> $1.00 <--", - }, -} - -func TestPunycode(t *testing.T) { - for _, tc := range punycodeTestCases { - if got, err := decode(tc.encoded); err != nil { - t.Errorf("decode(%q): %v", tc.encoded, err) - } else if got != tc.s { - t.Errorf("decode(%q): got %q, want %q", tc.encoded, got, tc.s) - } - - if got, err := encode("", tc.s); err != nil { - t.Errorf(`encode("", %q): %v`, tc.s, err) - } else if got != tc.encoded { - t.Errorf(`encode("", %q): got %q, want %q`, tc.s, got, tc.encoded) - } - } -} - -var punycodeErrorTestCases = [...]string{ - "decode -", // A sole '-' is invalid. - "decode foo\x00bar", // '\x00' is not in [0-9A-Za-z]. - "decode foo#bar", // '#' is not in [0-9A-Za-z]. - "decode foo\u00A3bar", // '\u00A3' is not in [0-9A-Za-z]. - "decode 9", // "9a" decodes to codepoint \u00A3; "9" is truncated. - "decode 99999a", // "99999a" decodes to codepoint \U0048A3C1, which is > \U0010FFFF. - "decode 9999999999a", // "9999999999a" overflows the int32 calculation. - - "encode " + strings.Repeat("x", 65536) + "\uff00", // int32 overflow. -} - -func TestPunycodeErrors(t *testing.T) { - for _, tc := range punycodeErrorTestCases { - var err error - switch { - case strings.HasPrefix(tc, "decode "): - _, err = decode(tc[7:]) - case strings.HasPrefix(tc, "encode "): - _, err = encode("", tc[7:]) - } - if err == nil { - if len(tc) > 256 { - tc = tc[:100] + "..." + tc[len(tc)-100:] - } - t.Errorf("no error for %s", tc) - } - } -} diff --git a/vendor/golang.org/x/text/internal/export/idna/tables.go b/vendor/golang.org/x/text/internal/export/idna/tables.go deleted file mode 100644 index d2819345f..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/tables.go +++ /dev/null @@ -1,4477 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package idna - -// UnicodeVersion is the Unicode version from which the tables in this package are derived. -const UnicodeVersion = "9.0.0" - -var mappings string = "" + // Size: 8176 bytes - "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" + - "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" + - "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" + - "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" + - "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" + - "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" + - "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" + - "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" + - "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" + - "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" + - "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" + - "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" + - "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" + - "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" + - "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" + - "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" + - "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" + - "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" + - "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" + - "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" + - "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" + - "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" + - "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" + - "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" + - "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" + - "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" + - ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" + - "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" + - "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" + - "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" + - "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" + - "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" + - "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" + - "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" + - "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" + - "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" + - "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" + - "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" + - "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" + - "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" + - "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" + - "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" + - "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" + - "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" + - "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" + - "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" + - "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" + - "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" + - "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" + - "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" + - "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" + - "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" + - "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" + - "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" + - "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" + - "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" + - "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" + - "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" + - "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" + - "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" + - "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" + - "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" + - "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" + - "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" + - "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" + - "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" + - "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" + - "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" + - "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" + - "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" + - "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" + - "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" + - "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" + - " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" + - "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" + - "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" + - "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" + - "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" + - "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" + - "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" + - "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" + - "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" + - "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" + - "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" + - "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" + - "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" + - "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" + - "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" + - "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" + - "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" + - "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" + - "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" + - "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" + - "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" + - "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" + - "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" + - "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" + - "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" + - "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" + - "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" + - "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" + - "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" + - "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" + - "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" + - "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" + - "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" + - "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" + - "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" + - "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" + - "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" + - "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" + - "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" + - "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" + - "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" + - "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" + - "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" + - "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" + - "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" + - "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" + - "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" + - "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" + - "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" + - "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" + - "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" + - "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" + - "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" + - "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" + - "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" + - "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" + - "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" + - "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" + - "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" + - "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" + - "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" + - "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" + - "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" + - "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻" - -var xorData string = "" + // Size: 4855 bytes - "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + - "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" + - "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" + - "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" + - "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" + - "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" + - "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" + - "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" + - "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" + - "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" + - "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" + - "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" + - "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" + - "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" + - "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" + - "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" + - "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" + - "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" + - "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" + - "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" + - "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" + - "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" + - "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" + - "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" + - "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" + - "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" + - "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" + - "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" + - "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" + - "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" + - "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" + - "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" + - "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" + - "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" + - "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" + - "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" + - "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " + - "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" + - "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" + - "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" + - "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" + - "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" + - ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" + - "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" + - "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" + - "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" + - "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" + - "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" + - "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" + - "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" + - "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" + - "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" + - "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" + - "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" + - "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" + - "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" + - "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" + - "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" + - "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" + - "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" + - "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" + - "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" + - "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" + - "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" + - "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" + - "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" + - "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" + - "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" + - "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" + - "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" + - "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" + - "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" + - "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" + - "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" + - "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" + - "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" + - "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" + - "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" + - "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" + - "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" + - "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" + - "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" + - "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" + - "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" + - "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" + - "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" + - "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" + - "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" + - "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," + - "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" + - "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" + - "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" + - "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" + - ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" + - "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" + - "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" + - "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" + - "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" + - "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" + - "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" + - "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" + - "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" + - "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" + - "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" + - "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" + - "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" + - "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" + - "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" + - "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" + - "\x08\x1a\x0a\x03\x07</\x03\x07:+\x03\x07\x07*\x03\x06&\x1c\x03\x09\x0c" + - "\x16\x03\x09\x10\x0e\x03\x08'\x0f\x03\x08+\x09\x03\x074%\x03\x06!3\x03" + - "\x06\x03+\x03\x0b\x1e\x19\x03\x0a))\x03\x09\x08\x19\x03\x08,\x05\x03\x07" + - "<2\x03\x06\x1c>\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" + - "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" + - "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" + - "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" + - "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" + - "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" + - "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" + - "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" + - "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" + - "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" + - "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" + - "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" + - "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" + - "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" + - "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" + - "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" + - "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" + - "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." + - "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + - "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + - "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + - "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + - "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + - "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + - "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + - "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + - "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + - "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + - "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + - "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + - "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + - "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + - "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + - "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + - "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + - "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + - "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + - "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + - "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + - "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + - "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + - "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + - "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + - "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + - "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + - "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + - "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + - "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + - "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + - "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + - "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + - "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + - "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + - "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + - "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + - "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + - "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + - "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + - "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + - "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + - "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + - "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + - "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + - "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + - "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + - "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + - "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + - "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + - "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + - "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + - "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + - "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + - "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + - "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + - "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + - "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + - "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + - "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + - "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + - "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + - "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + - "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + - "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + - "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + - "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + - "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + - "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + - "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + - "\x04\x03\x0c?\x05\x03\x0c<?\x03\x0c=\x00\x03\x0c=\x06\x03\x0c=\x05\x03" + - "\x0c=\x0c\x03\x0c=\x0f\x03\x0c=\x0d\x03\x0c=\x0b\x03\x0c=\x07\x03\x0c=" + - "\x19\x03\x0c=\x15\x03\x0c=\x11\x03\x0c=1\x03\x0c=3\x03\x0c=0\x03\x0c=>" + - "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + - "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + - "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + - "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + - "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + - "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" + - "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" + - "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" + - "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" + - "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" + - "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" + - "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" + - "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" + - "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" + - "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" + - "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" + - "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" + - "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" + - "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" + - "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" + - "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" + - "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" + - "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" + - "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" + - "\x05\x22\x05\x03\x050\x1d" - -// lookup returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return idnaValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = idnaIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = idnaIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = idnaIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *idnaTrie) lookupUnsafe(s []byte) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return idnaValues[c0] - } - i := idnaIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = idnaIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = idnaIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// lookupString returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *idnaTrie) lookupString(s string) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return idnaValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = idnaIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := idnaIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = idnaIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = idnaIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return idnaValues[c0] - } - i := idnaIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = idnaIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = idnaIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// idnaTrie. Total size: 28496 bytes (27.83 KiB). Checksum: 43288b883596640e. -type idnaTrie struct{} - -func newIdnaTrie(i int) *idnaTrie { - return &idnaTrie{} -} - -// lookupValue determines the type of block n and looks up the value for b. -func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 { - switch { - case n < 123: - return uint16(idnaValues[n<<6+uint32(b)]) - default: - n -= 123 - return uint16(idnaSparse.lookup(n, b)) - } -} - -// idnaValues: 125 blocks, 8000 entries, 16000 bytes -// The third block is the zero block. -var idnaValues = [8000]uint16{ - // Block 0x0, offset 0x0 - 0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080, - 0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080, - 0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080, - 0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080, - 0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080, - 0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080, - 0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080, - 0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080, - 0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008, - 0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080, - 0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080, - // Block 0x1, offset 0x40 - 0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105, - 0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105, - 0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105, - 0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105, - 0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080, - 0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008, - 0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008, - 0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008, - 0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008, - 0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080, - 0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, - 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, - 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, - 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, - 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, - 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, - 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018, - 0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a, - 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005, - 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018, - 0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018, - // Block 0x4, offset 0x100 - 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, - 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, - 0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008, - 0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008, - 0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008, - 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, - 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, - 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, - 0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, - 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, - 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199, - // Block 0x5, offset 0x140 - 0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, - 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008, - 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, - 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, - 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, - 0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008, - 0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008, - 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, - 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, - 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, - 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9, - // Block 0x6, offset 0x180 - 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, - 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, - 0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d, - 0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d, - 0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155, - 0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008, - 0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d, - 0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd, - 0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d, - 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, - 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9, - 0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, - 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, - 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, - 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, - 0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008, - 0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008, - 0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008, - 0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008, - 0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008, - 0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008, - // Block 0x8, offset 0x200 - 0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008, - 0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008, - 0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008, - 0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008, - 0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008, - 0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008, - 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, - 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, - 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, - 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d, - 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008, - // Block 0x9, offset 0x240 - 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, - 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, - 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, - 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, - 0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a, - 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369, - 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, - 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, - 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, - 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, - 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, - // Block 0xa, offset 0x280 - 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x1308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, - 0x286: 0x1308, 0x287: 0x1308, 0x288: 0x1308, 0x289: 0x1308, 0x28a: 0x1308, 0x28b: 0x1308, - 0x28c: 0x1308, 0x28d: 0x1308, 0x28e: 0x1308, 0x28f: 0x13c0, 0x290: 0x1308, 0x291: 0x1308, - 0x292: 0x1308, 0x293: 0x1308, 0x294: 0x1308, 0x295: 0x1308, 0x296: 0x1308, 0x297: 0x1308, - 0x298: 0x1308, 0x299: 0x1308, 0x29a: 0x1308, 0x29b: 0x1308, 0x29c: 0x1308, 0x29d: 0x1308, - 0x29e: 0x1308, 0x29f: 0x1308, 0x2a0: 0x1308, 0x2a1: 0x1308, 0x2a2: 0x1308, 0x2a3: 0x1308, - 0x2a4: 0x1308, 0x2a5: 0x1308, 0x2a6: 0x1308, 0x2a7: 0x1308, 0x2a8: 0x1308, 0x2a9: 0x1308, - 0x2aa: 0x1308, 0x2ab: 0x1308, 0x2ac: 0x1308, 0x2ad: 0x1308, 0x2ae: 0x1308, 0x2af: 0x1308, - 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, - 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008, - 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, - 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, - 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, - 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, - 0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105, - 0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d, - 0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d, - 0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008, - 0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008, - 0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008, - 0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008, - // Block 0xc, offset 0x300 - 0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008, - 0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008, - 0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd, - 0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008, - 0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008, - 0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008, - 0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008, - 0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008, - 0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd, - 0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008, - 0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d, - // Block 0xd, offset 0x340 - 0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008, - 0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008, - 0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008, - 0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008, - 0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008, - 0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008, - 0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008, - 0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008, - 0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008, - 0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008, - 0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008, - // Block 0xe, offset 0x380 - 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x1308, 0x384: 0x1308, 0x385: 0x1308, - 0x386: 0x1308, 0x387: 0x1308, 0x388: 0x1318, 0x389: 0x1318, 0x38a: 0xe00d, 0x38b: 0x0008, - 0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008, - 0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008, - 0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008, - 0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008, - 0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008, - 0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008, - 0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008, - 0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008, - 0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d, - 0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d, - 0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008, - 0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008, - 0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008, - 0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008, - 0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008, - 0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008, - 0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008, - 0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008, - 0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008, - // Block 0x10, offset 0x400 - 0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008, - 0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008, - 0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008, - 0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008, - 0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008, - 0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008, - 0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008, - 0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008, - 0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5, - 0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5, - 0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5, - // Block 0x11, offset 0x440 - 0x440: 0x0040, 0x441: 0x0040, 0x442: 0x0040, 0x443: 0x0040, 0x444: 0x0040, 0x445: 0x0040, - 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0018, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0018, - 0x44c: 0x0018, 0x44d: 0x0018, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x1308, 0x451: 0x1308, - 0x452: 0x1308, 0x453: 0x1308, 0x454: 0x1308, 0x455: 0x1308, 0x456: 0x1308, 0x457: 0x1308, - 0x458: 0x1308, 0x459: 0x1308, 0x45a: 0x1308, 0x45b: 0x0018, 0x45c: 0x0340, 0x45d: 0x0040, - 0x45e: 0x0018, 0x45f: 0x0018, 0x460: 0x0208, 0x461: 0x0008, 0x462: 0x0408, 0x463: 0x0408, - 0x464: 0x0408, 0x465: 0x0408, 0x466: 0x0208, 0x467: 0x0408, 0x468: 0x0208, 0x469: 0x0408, - 0x46a: 0x0208, 0x46b: 0x0208, 0x46c: 0x0208, 0x46d: 0x0208, 0x46e: 0x0208, 0x46f: 0x0408, - 0x470: 0x0408, 0x471: 0x0408, 0x472: 0x0408, 0x473: 0x0208, 0x474: 0x0208, 0x475: 0x0208, - 0x476: 0x0208, 0x477: 0x0208, 0x478: 0x0208, 0x479: 0x0208, 0x47a: 0x0208, 0x47b: 0x0208, - 0x47c: 0x0208, 0x47d: 0x0208, 0x47e: 0x0208, 0x47f: 0x0208, - // Block 0x12, offset 0x480 - 0x480: 0x0408, 0x481: 0x0208, 0x482: 0x0208, 0x483: 0x0408, 0x484: 0x0408, 0x485: 0x0408, - 0x486: 0x0408, 0x487: 0x0408, 0x488: 0x0408, 0x489: 0x0408, 0x48a: 0x0408, 0x48b: 0x0408, - 0x48c: 0x0208, 0x48d: 0x0408, 0x48e: 0x0208, 0x48f: 0x0408, 0x490: 0x0208, 0x491: 0x0208, - 0x492: 0x0408, 0x493: 0x0408, 0x494: 0x0018, 0x495: 0x0408, 0x496: 0x1308, 0x497: 0x1308, - 0x498: 0x1308, 0x499: 0x1308, 0x49a: 0x1308, 0x49b: 0x1308, 0x49c: 0x1308, 0x49d: 0x0040, - 0x49e: 0x0018, 0x49f: 0x1308, 0x4a0: 0x1308, 0x4a1: 0x1308, 0x4a2: 0x1308, 0x4a3: 0x1308, - 0x4a4: 0x1308, 0x4a5: 0x0008, 0x4a6: 0x0008, 0x4a7: 0x1308, 0x4a8: 0x1308, 0x4a9: 0x0018, - 0x4aa: 0x1308, 0x4ab: 0x1308, 0x4ac: 0x1308, 0x4ad: 0x1308, 0x4ae: 0x0408, 0x4af: 0x0408, - 0x4b0: 0x0008, 0x4b1: 0x0008, 0x4b2: 0x0008, 0x4b3: 0x0008, 0x4b4: 0x0008, 0x4b5: 0x0008, - 0x4b6: 0x0008, 0x4b7: 0x0008, 0x4b8: 0x0008, 0x4b9: 0x0008, 0x4ba: 0x0208, 0x4bb: 0x0208, - 0x4bc: 0x0208, 0x4bd: 0x0008, 0x4be: 0x0008, 0x4bf: 0x0208, - // Block 0x13, offset 0x4c0 - 0x4c0: 0x0018, 0x4c1: 0x0018, 0x4c2: 0x0018, 0x4c3: 0x0018, 0x4c4: 0x0018, 0x4c5: 0x0018, - 0x4c6: 0x0018, 0x4c7: 0x0018, 0x4c8: 0x0018, 0x4c9: 0x0018, 0x4ca: 0x0018, 0x4cb: 0x0018, - 0x4cc: 0x0018, 0x4cd: 0x0018, 0x4ce: 0x0040, 0x4cf: 0x0340, 0x4d0: 0x0408, 0x4d1: 0x1308, - 0x4d2: 0x0208, 0x4d3: 0x0208, 0x4d4: 0x0208, 0x4d5: 0x0408, 0x4d6: 0x0408, 0x4d7: 0x0408, - 0x4d8: 0x0408, 0x4d9: 0x0408, 0x4da: 0x0208, 0x4db: 0x0208, 0x4dc: 0x0208, 0x4dd: 0x0208, - 0x4de: 0x0408, 0x4df: 0x0208, 0x4e0: 0x0208, 0x4e1: 0x0208, 0x4e2: 0x0208, 0x4e3: 0x0208, - 0x4e4: 0x0208, 0x4e5: 0x0208, 0x4e6: 0x0208, 0x4e7: 0x0208, 0x4e8: 0x0408, 0x4e9: 0x0208, - 0x4ea: 0x0408, 0x4eb: 0x0208, 0x4ec: 0x0408, 0x4ed: 0x0208, 0x4ee: 0x0208, 0x4ef: 0x0408, - 0x4f0: 0x1308, 0x4f1: 0x1308, 0x4f2: 0x1308, 0x4f3: 0x1308, 0x4f4: 0x1308, 0x4f5: 0x1308, - 0x4f6: 0x1308, 0x4f7: 0x1308, 0x4f8: 0x1308, 0x4f9: 0x1308, 0x4fa: 0x1308, 0x4fb: 0x1308, - 0x4fc: 0x1308, 0x4fd: 0x1308, 0x4fe: 0x1308, 0x4ff: 0x1308, - // Block 0x14, offset 0x500 - 0x500: 0x1008, 0x501: 0x1308, 0x502: 0x1308, 0x503: 0x1308, 0x504: 0x1308, 0x505: 0x1308, - 0x506: 0x1308, 0x507: 0x1308, 0x508: 0x1308, 0x509: 0x1008, 0x50a: 0x1008, 0x50b: 0x1008, - 0x50c: 0x1008, 0x50d: 0x1b08, 0x50e: 0x1008, 0x50f: 0x1008, 0x510: 0x0008, 0x511: 0x1308, - 0x512: 0x1308, 0x513: 0x1308, 0x514: 0x1308, 0x515: 0x1308, 0x516: 0x1308, 0x517: 0x1308, - 0x518: 0x04c9, 0x519: 0x0501, 0x51a: 0x0539, 0x51b: 0x0571, 0x51c: 0x05a9, 0x51d: 0x05e1, - 0x51e: 0x0619, 0x51f: 0x0651, 0x520: 0x0008, 0x521: 0x0008, 0x522: 0x1308, 0x523: 0x1308, - 0x524: 0x0018, 0x525: 0x0018, 0x526: 0x0008, 0x527: 0x0008, 0x528: 0x0008, 0x529: 0x0008, - 0x52a: 0x0008, 0x52b: 0x0008, 0x52c: 0x0008, 0x52d: 0x0008, 0x52e: 0x0008, 0x52f: 0x0008, - 0x530: 0x0018, 0x531: 0x0008, 0x532: 0x0008, 0x533: 0x0008, 0x534: 0x0008, 0x535: 0x0008, - 0x536: 0x0008, 0x537: 0x0008, 0x538: 0x0008, 0x539: 0x0008, 0x53a: 0x0008, 0x53b: 0x0008, - 0x53c: 0x0008, 0x53d: 0x0008, 0x53e: 0x0008, 0x53f: 0x0008, - // Block 0x15, offset 0x540 - 0x540: 0x0008, 0x541: 0x1308, 0x542: 0x1008, 0x543: 0x1008, 0x544: 0x0040, 0x545: 0x0008, - 0x546: 0x0008, 0x547: 0x0008, 0x548: 0x0008, 0x549: 0x0008, 0x54a: 0x0008, 0x54b: 0x0008, - 0x54c: 0x0008, 0x54d: 0x0040, 0x54e: 0x0040, 0x54f: 0x0008, 0x550: 0x0008, 0x551: 0x0040, - 0x552: 0x0040, 0x553: 0x0008, 0x554: 0x0008, 0x555: 0x0008, 0x556: 0x0008, 0x557: 0x0008, - 0x558: 0x0008, 0x559: 0x0008, 0x55a: 0x0008, 0x55b: 0x0008, 0x55c: 0x0008, 0x55d: 0x0008, - 0x55e: 0x0008, 0x55f: 0x0008, 0x560: 0x0008, 0x561: 0x0008, 0x562: 0x0008, 0x563: 0x0008, - 0x564: 0x0008, 0x565: 0x0008, 0x566: 0x0008, 0x567: 0x0008, 0x568: 0x0008, 0x569: 0x0040, - 0x56a: 0x0008, 0x56b: 0x0008, 0x56c: 0x0008, 0x56d: 0x0008, 0x56e: 0x0008, 0x56f: 0x0008, - 0x570: 0x0008, 0x571: 0x0040, 0x572: 0x0008, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040, - 0x576: 0x0008, 0x577: 0x0008, 0x578: 0x0008, 0x579: 0x0008, 0x57a: 0x0040, 0x57b: 0x0040, - 0x57c: 0x1308, 0x57d: 0x0008, 0x57e: 0x1008, 0x57f: 0x1008, - // Block 0x16, offset 0x580 - 0x580: 0x1008, 0x581: 0x1308, 0x582: 0x1308, 0x583: 0x1308, 0x584: 0x1308, 0x585: 0x0040, - 0x586: 0x0040, 0x587: 0x1008, 0x588: 0x1008, 0x589: 0x0040, 0x58a: 0x0040, 0x58b: 0x1008, - 0x58c: 0x1008, 0x58d: 0x1b08, 0x58e: 0x0008, 0x58f: 0x0040, 0x590: 0x0040, 0x591: 0x0040, - 0x592: 0x0040, 0x593: 0x0040, 0x594: 0x0040, 0x595: 0x0040, 0x596: 0x0040, 0x597: 0x1008, - 0x598: 0x0040, 0x599: 0x0040, 0x59a: 0x0040, 0x59b: 0x0040, 0x59c: 0x0689, 0x59d: 0x06c1, - 0x59e: 0x0040, 0x59f: 0x06f9, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x1308, 0x5a3: 0x1308, - 0x5a4: 0x0040, 0x5a5: 0x0040, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008, - 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, - 0x5b0: 0x0008, 0x5b1: 0x0008, 0x5b2: 0x0018, 0x5b3: 0x0018, 0x5b4: 0x0018, 0x5b5: 0x0018, - 0x5b6: 0x0018, 0x5b7: 0x0018, 0x5b8: 0x0018, 0x5b9: 0x0018, 0x5ba: 0x0018, 0x5bb: 0x0018, - 0x5bc: 0x0040, 0x5bd: 0x0040, 0x5be: 0x0040, 0x5bf: 0x0040, - // Block 0x17, offset 0x5c0 - 0x5c0: 0x0040, 0x5c1: 0x1308, 0x5c2: 0x1308, 0x5c3: 0x1008, 0x5c4: 0x0040, 0x5c5: 0x0008, - 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0040, - 0x5cc: 0x0040, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040, - 0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008, - 0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008, - 0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008, - 0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040, - 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, - 0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0731, 0x5f4: 0x0040, 0x5f5: 0x0008, - 0x5f6: 0x0769, 0x5f7: 0x0040, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040, - 0x5fc: 0x1308, 0x5fd: 0x0040, 0x5fe: 0x1008, 0x5ff: 0x1008, - // Block 0x18, offset 0x600 - 0x600: 0x1008, 0x601: 0x1308, 0x602: 0x1308, 0x603: 0x0040, 0x604: 0x0040, 0x605: 0x0040, - 0x606: 0x0040, 0x607: 0x1308, 0x608: 0x1308, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x1308, - 0x60c: 0x1308, 0x60d: 0x1b08, 0x60e: 0x0040, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x1308, - 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x0040, - 0x618: 0x0040, 0x619: 0x07a1, 0x61a: 0x07d9, 0x61b: 0x0811, 0x61c: 0x0008, 0x61d: 0x0040, - 0x61e: 0x0849, 0x61f: 0x0040, 0x620: 0x0040, 0x621: 0x0040, 0x622: 0x0040, 0x623: 0x0040, - 0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008, - 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, - 0x630: 0x1308, 0x631: 0x1308, 0x632: 0x0008, 0x633: 0x0008, 0x634: 0x0008, 0x635: 0x1308, - 0x636: 0x0040, 0x637: 0x0040, 0x638: 0x0040, 0x639: 0x0040, 0x63a: 0x0040, 0x63b: 0x0040, - 0x63c: 0x0040, 0x63d: 0x0040, 0x63e: 0x0040, 0x63f: 0x0040, - // Block 0x19, offset 0x640 - 0x640: 0x0040, 0x641: 0x1308, 0x642: 0x1308, 0x643: 0x1008, 0x644: 0x0040, 0x645: 0x0008, - 0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0008, - 0x64c: 0x0008, 0x64d: 0x0008, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0008, - 0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008, - 0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008, - 0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008, - 0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040, - 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, - 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0008, 0x674: 0x0040, 0x675: 0x0008, - 0x676: 0x0008, 0x677: 0x0008, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, - 0x67c: 0x1308, 0x67d: 0x0008, 0x67e: 0x1008, 0x67f: 0x1008, - // Block 0x1a, offset 0x680 - 0x680: 0x1008, 0x681: 0x1308, 0x682: 0x1308, 0x683: 0x1308, 0x684: 0x1308, 0x685: 0x1308, - 0x686: 0x0040, 0x687: 0x1308, 0x688: 0x1308, 0x689: 0x1008, 0x68a: 0x0040, 0x68b: 0x1008, - 0x68c: 0x1008, 0x68d: 0x1b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0008, 0x691: 0x0040, - 0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040, - 0x698: 0x0040, 0x699: 0x0040, 0x69a: 0x0040, 0x69b: 0x0040, 0x69c: 0x0040, 0x69d: 0x0040, - 0x69e: 0x0040, 0x69f: 0x0040, 0x6a0: 0x0008, 0x6a1: 0x0008, 0x6a2: 0x1308, 0x6a3: 0x1308, - 0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008, - 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, - 0x6b0: 0x0018, 0x6b1: 0x0018, 0x6b2: 0x0040, 0x6b3: 0x0040, 0x6b4: 0x0040, 0x6b5: 0x0040, - 0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0008, 0x6ba: 0x0040, 0x6bb: 0x0040, - 0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040, - // Block 0x1b, offset 0x6c0 - 0x6c0: 0x0040, 0x6c1: 0x1308, 0x6c2: 0x1008, 0x6c3: 0x1008, 0x6c4: 0x0040, 0x6c5: 0x0008, - 0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008, - 0x6cc: 0x0008, 0x6cd: 0x0040, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0040, - 0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008, - 0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008, - 0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008, - 0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040, - 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, - 0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008, - 0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040, - 0x6fc: 0x1308, 0x6fd: 0x0008, 0x6fe: 0x1008, 0x6ff: 0x1308, - // Block 0x1c, offset 0x700 - 0x700: 0x1008, 0x701: 0x1308, 0x702: 0x1308, 0x703: 0x1308, 0x704: 0x1308, 0x705: 0x0040, - 0x706: 0x0040, 0x707: 0x1008, 0x708: 0x1008, 0x709: 0x0040, 0x70a: 0x0040, 0x70b: 0x1008, - 0x70c: 0x1008, 0x70d: 0x1b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0040, 0x711: 0x0040, - 0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x1308, 0x717: 0x1008, - 0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0881, 0x71d: 0x08b9, - 0x71e: 0x0040, 0x71f: 0x0008, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x1308, 0x723: 0x1308, - 0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008, - 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, - 0x730: 0x0018, 0x731: 0x0008, 0x732: 0x0018, 0x733: 0x0018, 0x734: 0x0018, 0x735: 0x0018, - 0x736: 0x0018, 0x737: 0x0018, 0x738: 0x0040, 0x739: 0x0040, 0x73a: 0x0040, 0x73b: 0x0040, - 0x73c: 0x0040, 0x73d: 0x0040, 0x73e: 0x0040, 0x73f: 0x0040, - // Block 0x1d, offset 0x740 - 0x740: 0x0040, 0x741: 0x0040, 0x742: 0x1308, 0x743: 0x0008, 0x744: 0x0040, 0x745: 0x0008, - 0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0040, - 0x74c: 0x0040, 0x74d: 0x0040, 0x74e: 0x0008, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040, - 0x752: 0x0008, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0040, 0x757: 0x0040, - 0x758: 0x0040, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0040, 0x75c: 0x0008, 0x75d: 0x0040, - 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0040, 0x761: 0x0040, 0x762: 0x0040, 0x763: 0x0008, - 0x764: 0x0008, 0x765: 0x0040, 0x766: 0x0040, 0x767: 0x0040, 0x768: 0x0008, 0x769: 0x0008, - 0x76a: 0x0008, 0x76b: 0x0040, 0x76c: 0x0040, 0x76d: 0x0040, 0x76e: 0x0008, 0x76f: 0x0008, - 0x770: 0x0008, 0x771: 0x0008, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0008, 0x775: 0x0008, - 0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040, - 0x77c: 0x0040, 0x77d: 0x0040, 0x77e: 0x1008, 0x77f: 0x1008, - // Block 0x1e, offset 0x780 - 0x780: 0x1308, 0x781: 0x1008, 0x782: 0x1008, 0x783: 0x1008, 0x784: 0x1008, 0x785: 0x0040, - 0x786: 0x1308, 0x787: 0x1308, 0x788: 0x1308, 0x789: 0x0040, 0x78a: 0x1308, 0x78b: 0x1308, - 0x78c: 0x1308, 0x78d: 0x1b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040, - 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x1308, 0x796: 0x1308, 0x797: 0x0040, - 0x798: 0x0008, 0x799: 0x0008, 0x79a: 0x0008, 0x79b: 0x0040, 0x79c: 0x0040, 0x79d: 0x0040, - 0x79e: 0x0040, 0x79f: 0x0040, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x1308, 0x7a3: 0x1308, - 0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008, - 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, - 0x7b0: 0x0040, 0x7b1: 0x0040, 0x7b2: 0x0040, 0x7b3: 0x0040, 0x7b4: 0x0040, 0x7b5: 0x0040, - 0x7b6: 0x0040, 0x7b7: 0x0040, 0x7b8: 0x0018, 0x7b9: 0x0018, 0x7ba: 0x0018, 0x7bb: 0x0018, - 0x7bc: 0x0018, 0x7bd: 0x0018, 0x7be: 0x0018, 0x7bf: 0x0018, - // Block 0x1f, offset 0x7c0 - 0x7c0: 0x0008, 0x7c1: 0x1308, 0x7c2: 0x1008, 0x7c3: 0x1008, 0x7c4: 0x0040, 0x7c5: 0x0008, - 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0008, - 0x7cc: 0x0008, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040, - 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0008, 0x7d7: 0x0008, - 0x7d8: 0x0008, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0008, 0x7dc: 0x0008, 0x7dd: 0x0008, - 0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0008, 0x7e1: 0x0008, 0x7e2: 0x0008, 0x7e3: 0x0008, - 0x7e4: 0x0008, 0x7e5: 0x0008, 0x7e6: 0x0008, 0x7e7: 0x0008, 0x7e8: 0x0008, 0x7e9: 0x0040, - 0x7ea: 0x0008, 0x7eb: 0x0008, 0x7ec: 0x0008, 0x7ed: 0x0008, 0x7ee: 0x0008, 0x7ef: 0x0008, - 0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0040, 0x7f5: 0x0008, - 0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040, - 0x7fc: 0x1308, 0x7fd: 0x0008, 0x7fe: 0x1008, 0x7ff: 0x1308, - // Block 0x20, offset 0x800 - 0x800: 0x1008, 0x801: 0x1008, 0x802: 0x1008, 0x803: 0x1008, 0x804: 0x1008, 0x805: 0x0040, - 0x806: 0x1308, 0x807: 0x1008, 0x808: 0x1008, 0x809: 0x0040, 0x80a: 0x1008, 0x80b: 0x1008, - 0x80c: 0x1308, 0x80d: 0x1b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040, - 0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x1008, 0x816: 0x1008, 0x817: 0x0040, - 0x818: 0x0040, 0x819: 0x0040, 0x81a: 0x0040, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040, - 0x81e: 0x0008, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x1308, 0x823: 0x1308, - 0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008, - 0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008, - 0x830: 0x0040, 0x831: 0x0008, 0x832: 0x0008, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040, - 0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0040, 0x839: 0x0040, 0x83a: 0x0040, 0x83b: 0x0040, - 0x83c: 0x0040, 0x83d: 0x0040, 0x83e: 0x0040, 0x83f: 0x0040, - // Block 0x21, offset 0x840 - 0x840: 0x1008, 0x841: 0x1308, 0x842: 0x1308, 0x843: 0x1308, 0x844: 0x1308, 0x845: 0x0040, - 0x846: 0x1008, 0x847: 0x1008, 0x848: 0x1008, 0x849: 0x0040, 0x84a: 0x1008, 0x84b: 0x1008, - 0x84c: 0x1008, 0x84d: 0x1b08, 0x84e: 0x0008, 0x84f: 0x0018, 0x850: 0x0040, 0x851: 0x0040, - 0x852: 0x0040, 0x853: 0x0040, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x1008, - 0x858: 0x0018, 0x859: 0x0018, 0x85a: 0x0018, 0x85b: 0x0018, 0x85c: 0x0018, 0x85d: 0x0018, - 0x85e: 0x0018, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x1308, 0x863: 0x1308, - 0x864: 0x0040, 0x865: 0x0040, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0008, - 0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008, - 0x870: 0x0018, 0x871: 0x0018, 0x872: 0x0018, 0x873: 0x0018, 0x874: 0x0018, 0x875: 0x0018, - 0x876: 0x0018, 0x877: 0x0018, 0x878: 0x0018, 0x879: 0x0018, 0x87a: 0x0008, 0x87b: 0x0008, - 0x87c: 0x0008, 0x87d: 0x0008, 0x87e: 0x0008, 0x87f: 0x0008, - // Block 0x22, offset 0x880 - 0x880: 0x0040, 0x881: 0x0008, 0x882: 0x0008, 0x883: 0x0040, 0x884: 0x0008, 0x885: 0x0040, - 0x886: 0x0040, 0x887: 0x0008, 0x888: 0x0008, 0x889: 0x0040, 0x88a: 0x0008, 0x88b: 0x0040, - 0x88c: 0x0040, 0x88d: 0x0008, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040, - 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0008, 0x895: 0x0008, 0x896: 0x0008, 0x897: 0x0008, - 0x898: 0x0040, 0x899: 0x0008, 0x89a: 0x0008, 0x89b: 0x0008, 0x89c: 0x0008, 0x89d: 0x0008, - 0x89e: 0x0008, 0x89f: 0x0008, 0x8a0: 0x0040, 0x8a1: 0x0008, 0x8a2: 0x0008, 0x8a3: 0x0008, - 0x8a4: 0x0040, 0x8a5: 0x0008, 0x8a6: 0x0040, 0x8a7: 0x0008, 0x8a8: 0x0040, 0x8a9: 0x0040, - 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0040, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, - 0x8b0: 0x0008, 0x8b1: 0x1308, 0x8b2: 0x0008, 0x8b3: 0x0929, 0x8b4: 0x1308, 0x8b5: 0x1308, - 0x8b6: 0x1308, 0x8b7: 0x1308, 0x8b8: 0x1308, 0x8b9: 0x1308, 0x8ba: 0x0040, 0x8bb: 0x1308, - 0x8bc: 0x1308, 0x8bd: 0x0008, 0x8be: 0x0040, 0x8bf: 0x0040, - // Block 0x23, offset 0x8c0 - 0x8c0: 0x0008, 0x8c1: 0x0008, 0x8c2: 0x0008, 0x8c3: 0x09d1, 0x8c4: 0x0008, 0x8c5: 0x0008, - 0x8c6: 0x0008, 0x8c7: 0x0008, 0x8c8: 0x0040, 0x8c9: 0x0008, 0x8ca: 0x0008, 0x8cb: 0x0008, - 0x8cc: 0x0008, 0x8cd: 0x0a09, 0x8ce: 0x0008, 0x8cf: 0x0008, 0x8d0: 0x0008, 0x8d1: 0x0008, - 0x8d2: 0x0a41, 0x8d3: 0x0008, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x0a79, - 0x8d8: 0x0008, 0x8d9: 0x0008, 0x8da: 0x0008, 0x8db: 0x0008, 0x8dc: 0x0ab1, 0x8dd: 0x0008, - 0x8de: 0x0008, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x0008, 0x8e3: 0x0008, - 0x8e4: 0x0008, 0x8e5: 0x0008, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0ae9, - 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0040, 0x8ee: 0x0040, 0x8ef: 0x0040, - 0x8f0: 0x0040, 0x8f1: 0x1308, 0x8f2: 0x1308, 0x8f3: 0x0b21, 0x8f4: 0x1308, 0x8f5: 0x0b59, - 0x8f6: 0x0b91, 0x8f7: 0x0bc9, 0x8f8: 0x0c19, 0x8f9: 0x0c51, 0x8fa: 0x1308, 0x8fb: 0x1308, - 0x8fc: 0x1308, 0x8fd: 0x1308, 0x8fe: 0x1308, 0x8ff: 0x1008, - // Block 0x24, offset 0x900 - 0x900: 0x1308, 0x901: 0x0ca1, 0x902: 0x1308, 0x903: 0x1308, 0x904: 0x1b08, 0x905: 0x0018, - 0x906: 0x1308, 0x907: 0x1308, 0x908: 0x0008, 0x909: 0x0008, 0x90a: 0x0008, 0x90b: 0x0008, - 0x90c: 0x0008, 0x90d: 0x1308, 0x90e: 0x1308, 0x90f: 0x1308, 0x910: 0x1308, 0x911: 0x1308, - 0x912: 0x1308, 0x913: 0x0cd9, 0x914: 0x1308, 0x915: 0x1308, 0x916: 0x1308, 0x917: 0x1308, - 0x918: 0x0040, 0x919: 0x1308, 0x91a: 0x1308, 0x91b: 0x1308, 0x91c: 0x1308, 0x91d: 0x0d11, - 0x91e: 0x1308, 0x91f: 0x1308, 0x920: 0x1308, 0x921: 0x1308, 0x922: 0x0d49, 0x923: 0x1308, - 0x924: 0x1308, 0x925: 0x1308, 0x926: 0x1308, 0x927: 0x0d81, 0x928: 0x1308, 0x929: 0x1308, - 0x92a: 0x1308, 0x92b: 0x1308, 0x92c: 0x0db9, 0x92d: 0x1308, 0x92e: 0x1308, 0x92f: 0x1308, - 0x930: 0x1308, 0x931: 0x1308, 0x932: 0x1308, 0x933: 0x1308, 0x934: 0x1308, 0x935: 0x1308, - 0x936: 0x1308, 0x937: 0x1308, 0x938: 0x1308, 0x939: 0x0df1, 0x93a: 0x1308, 0x93b: 0x1308, - 0x93c: 0x1308, 0x93d: 0x0040, 0x93e: 0x0018, 0x93f: 0x0018, - // Block 0x25, offset 0x940 - 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x0008, 0x944: 0x0008, 0x945: 0x0008, - 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0008, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, - 0x94c: 0x0008, 0x94d: 0x0008, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, - 0x952: 0x0008, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0008, - 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0008, 0x95d: 0x0008, - 0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008, - 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0008, - 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0039, 0x96d: 0x0ed1, 0x96e: 0x0ee9, 0x96f: 0x0008, - 0x970: 0x0ef9, 0x971: 0x0f09, 0x972: 0x0f19, 0x973: 0x0f31, 0x974: 0x0249, 0x975: 0x0f41, - 0x976: 0x0259, 0x977: 0x0f51, 0x978: 0x0359, 0x979: 0x0f61, 0x97a: 0x0f71, 0x97b: 0x0008, - 0x97c: 0x00d9, 0x97d: 0x0f81, 0x97e: 0x0f99, 0x97f: 0x0269, - // Block 0x26, offset 0x980 - 0x980: 0x0fa9, 0x981: 0x0fb9, 0x982: 0x0279, 0x983: 0x0039, 0x984: 0x0fc9, 0x985: 0x0fe1, - 0x986: 0x059d, 0x987: 0x0ee9, 0x988: 0x0ef9, 0x989: 0x0f09, 0x98a: 0x0ff9, 0x98b: 0x1011, - 0x98c: 0x1029, 0x98d: 0x0f31, 0x98e: 0x0008, 0x98f: 0x0f51, 0x990: 0x0f61, 0x991: 0x1041, - 0x992: 0x00d9, 0x993: 0x1059, 0x994: 0x05b5, 0x995: 0x05b5, 0x996: 0x0f99, 0x997: 0x0fa9, - 0x998: 0x0fb9, 0x999: 0x059d, 0x99a: 0x1071, 0x99b: 0x1089, 0x99c: 0x05cd, 0x99d: 0x1099, - 0x99e: 0x10b1, 0x99f: 0x10c9, 0x9a0: 0x10e1, 0x9a1: 0x10f9, 0x9a2: 0x0f41, 0x9a3: 0x0269, - 0x9a4: 0x0fb9, 0x9a5: 0x1089, 0x9a6: 0x1099, 0x9a7: 0x10b1, 0x9a8: 0x1111, 0x9a9: 0x10e1, - 0x9aa: 0x10f9, 0x9ab: 0x0008, 0x9ac: 0x0008, 0x9ad: 0x0008, 0x9ae: 0x0008, 0x9af: 0x0008, - 0x9b0: 0x0008, 0x9b1: 0x0008, 0x9b2: 0x0008, 0x9b3: 0x0008, 0x9b4: 0x0008, 0x9b5: 0x0008, - 0x9b6: 0x0008, 0x9b7: 0x0008, 0x9b8: 0x1129, 0x9b9: 0x0008, 0x9ba: 0x0008, 0x9bb: 0x0008, - 0x9bc: 0x0008, 0x9bd: 0x0008, 0x9be: 0x0008, 0x9bf: 0x0008, - // Block 0x27, offset 0x9c0 - 0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008, - 0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008, - 0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008, - 0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008, - 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x1141, 0x9dc: 0x1159, 0x9dd: 0x1169, - 0x9de: 0x1181, 0x9df: 0x1029, 0x9e0: 0x1199, 0x9e1: 0x11a9, 0x9e2: 0x11c1, 0x9e3: 0x11d9, - 0x9e4: 0x11f1, 0x9e5: 0x1209, 0x9e6: 0x1221, 0x9e7: 0x05e5, 0x9e8: 0x1239, 0x9e9: 0x1251, - 0x9ea: 0xe17d, 0x9eb: 0x1269, 0x9ec: 0x1281, 0x9ed: 0x1299, 0x9ee: 0x12b1, 0x9ef: 0x12c9, - 0x9f0: 0x12e1, 0x9f1: 0x12f9, 0x9f2: 0x1311, 0x9f3: 0x1329, 0x9f4: 0x1341, 0x9f5: 0x1359, - 0x9f6: 0x1371, 0x9f7: 0x1389, 0x9f8: 0x05fd, 0x9f9: 0x13a1, 0x9fa: 0x13b9, 0x9fb: 0x13d1, - 0x9fc: 0x13e1, 0x9fd: 0x13f9, 0x9fe: 0x1411, 0x9ff: 0x1429, - // Block 0x28, offset 0xa00 - 0xa00: 0xe00d, 0xa01: 0x0008, 0xa02: 0xe00d, 0xa03: 0x0008, 0xa04: 0xe00d, 0xa05: 0x0008, - 0xa06: 0xe00d, 0xa07: 0x0008, 0xa08: 0xe00d, 0xa09: 0x0008, 0xa0a: 0xe00d, 0xa0b: 0x0008, - 0xa0c: 0xe00d, 0xa0d: 0x0008, 0xa0e: 0xe00d, 0xa0f: 0x0008, 0xa10: 0xe00d, 0xa11: 0x0008, - 0xa12: 0xe00d, 0xa13: 0x0008, 0xa14: 0xe00d, 0xa15: 0x0008, 0xa16: 0xe00d, 0xa17: 0x0008, - 0xa18: 0xe00d, 0xa19: 0x0008, 0xa1a: 0xe00d, 0xa1b: 0x0008, 0xa1c: 0xe00d, 0xa1d: 0x0008, - 0xa1e: 0xe00d, 0xa1f: 0x0008, 0xa20: 0xe00d, 0xa21: 0x0008, 0xa22: 0xe00d, 0xa23: 0x0008, - 0xa24: 0xe00d, 0xa25: 0x0008, 0xa26: 0xe00d, 0xa27: 0x0008, 0xa28: 0xe00d, 0xa29: 0x0008, - 0xa2a: 0xe00d, 0xa2b: 0x0008, 0xa2c: 0xe00d, 0xa2d: 0x0008, 0xa2e: 0xe00d, 0xa2f: 0x0008, - 0xa30: 0xe00d, 0xa31: 0x0008, 0xa32: 0xe00d, 0xa33: 0x0008, 0xa34: 0xe00d, 0xa35: 0x0008, - 0xa36: 0xe00d, 0xa37: 0x0008, 0xa38: 0xe00d, 0xa39: 0x0008, 0xa3a: 0xe00d, 0xa3b: 0x0008, - 0xa3c: 0xe00d, 0xa3d: 0x0008, 0xa3e: 0xe00d, 0xa3f: 0x0008, - // Block 0x29, offset 0xa40 - 0xa40: 0xe00d, 0xa41: 0x0008, 0xa42: 0xe00d, 0xa43: 0x0008, 0xa44: 0xe00d, 0xa45: 0x0008, - 0xa46: 0xe00d, 0xa47: 0x0008, 0xa48: 0xe00d, 0xa49: 0x0008, 0xa4a: 0xe00d, 0xa4b: 0x0008, - 0xa4c: 0xe00d, 0xa4d: 0x0008, 0xa4e: 0xe00d, 0xa4f: 0x0008, 0xa50: 0xe00d, 0xa51: 0x0008, - 0xa52: 0xe00d, 0xa53: 0x0008, 0xa54: 0xe00d, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008, - 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0615, 0xa5b: 0x0635, 0xa5c: 0x0008, 0xa5d: 0x0008, - 0xa5e: 0x1441, 0xa5f: 0x0008, 0xa60: 0xe00d, 0xa61: 0x0008, 0xa62: 0xe00d, 0xa63: 0x0008, - 0xa64: 0xe00d, 0xa65: 0x0008, 0xa66: 0xe00d, 0xa67: 0x0008, 0xa68: 0xe00d, 0xa69: 0x0008, - 0xa6a: 0xe00d, 0xa6b: 0x0008, 0xa6c: 0xe00d, 0xa6d: 0x0008, 0xa6e: 0xe00d, 0xa6f: 0x0008, - 0xa70: 0xe00d, 0xa71: 0x0008, 0xa72: 0xe00d, 0xa73: 0x0008, 0xa74: 0xe00d, 0xa75: 0x0008, - 0xa76: 0xe00d, 0xa77: 0x0008, 0xa78: 0xe00d, 0xa79: 0x0008, 0xa7a: 0xe00d, 0xa7b: 0x0008, - 0xa7c: 0xe00d, 0xa7d: 0x0008, 0xa7e: 0xe00d, 0xa7f: 0x0008, - // Block 0x2a, offset 0xa80 - 0xa80: 0x0008, 0xa81: 0x0008, 0xa82: 0x0008, 0xa83: 0x0008, 0xa84: 0x0008, 0xa85: 0x0008, - 0xa86: 0x0040, 0xa87: 0x0040, 0xa88: 0xe045, 0xa89: 0xe045, 0xa8a: 0xe045, 0xa8b: 0xe045, - 0xa8c: 0xe045, 0xa8d: 0xe045, 0xa8e: 0x0040, 0xa8f: 0x0040, 0xa90: 0x0008, 0xa91: 0x0008, - 0xa92: 0x0008, 0xa93: 0x0008, 0xa94: 0x0008, 0xa95: 0x0008, 0xa96: 0x0008, 0xa97: 0x0008, - 0xa98: 0x0040, 0xa99: 0xe045, 0xa9a: 0x0040, 0xa9b: 0xe045, 0xa9c: 0x0040, 0xa9d: 0xe045, - 0xa9e: 0x0040, 0xa9f: 0xe045, 0xaa0: 0x0008, 0xaa1: 0x0008, 0xaa2: 0x0008, 0xaa3: 0x0008, - 0xaa4: 0x0008, 0xaa5: 0x0008, 0xaa6: 0x0008, 0xaa7: 0x0008, 0xaa8: 0xe045, 0xaa9: 0xe045, - 0xaaa: 0xe045, 0xaab: 0xe045, 0xaac: 0xe045, 0xaad: 0xe045, 0xaae: 0xe045, 0xaaf: 0xe045, - 0xab0: 0x0008, 0xab1: 0x1459, 0xab2: 0x0008, 0xab3: 0x1471, 0xab4: 0x0008, 0xab5: 0x1489, - 0xab6: 0x0008, 0xab7: 0x14a1, 0xab8: 0x0008, 0xab9: 0x14b9, 0xaba: 0x0008, 0xabb: 0x14d1, - 0xabc: 0x0008, 0xabd: 0x14e9, 0xabe: 0x0040, 0xabf: 0x0040, - // Block 0x2b, offset 0xac0 - 0xac0: 0x1501, 0xac1: 0x1531, 0xac2: 0x1561, 0xac3: 0x1591, 0xac4: 0x15c1, 0xac5: 0x15f1, - 0xac6: 0x1621, 0xac7: 0x1651, 0xac8: 0x1501, 0xac9: 0x1531, 0xaca: 0x1561, 0xacb: 0x1591, - 0xacc: 0x15c1, 0xacd: 0x15f1, 0xace: 0x1621, 0xacf: 0x1651, 0xad0: 0x1681, 0xad1: 0x16b1, - 0xad2: 0x16e1, 0xad3: 0x1711, 0xad4: 0x1741, 0xad5: 0x1771, 0xad6: 0x17a1, 0xad7: 0x17d1, - 0xad8: 0x1681, 0xad9: 0x16b1, 0xada: 0x16e1, 0xadb: 0x1711, 0xadc: 0x1741, 0xadd: 0x1771, - 0xade: 0x17a1, 0xadf: 0x17d1, 0xae0: 0x1801, 0xae1: 0x1831, 0xae2: 0x1861, 0xae3: 0x1891, - 0xae4: 0x18c1, 0xae5: 0x18f1, 0xae6: 0x1921, 0xae7: 0x1951, 0xae8: 0x1801, 0xae9: 0x1831, - 0xaea: 0x1861, 0xaeb: 0x1891, 0xaec: 0x18c1, 0xaed: 0x18f1, 0xaee: 0x1921, 0xaef: 0x1951, - 0xaf0: 0x0008, 0xaf1: 0x0008, 0xaf2: 0x1981, 0xaf3: 0x19b1, 0xaf4: 0x19d9, 0xaf5: 0x0040, - 0xaf6: 0x0008, 0xaf7: 0x1a01, 0xaf8: 0xe045, 0xaf9: 0xe045, 0xafa: 0x064d, 0xafb: 0x1459, - 0xafc: 0x19b1, 0xafd: 0x0666, 0xafe: 0x1a31, 0xaff: 0x0686, - // Block 0x2c, offset 0xb00 - 0xb00: 0x06a6, 0xb01: 0x1a4a, 0xb02: 0x1a79, 0xb03: 0x1aa9, 0xb04: 0x1ad1, 0xb05: 0x0040, - 0xb06: 0x0008, 0xb07: 0x1af9, 0xb08: 0x06c5, 0xb09: 0x1471, 0xb0a: 0x06dd, 0xb0b: 0x1489, - 0xb0c: 0x1aa9, 0xb0d: 0x1b2a, 0xb0e: 0x1b5a, 0xb0f: 0x1b8a, 0xb10: 0x0008, 0xb11: 0x0008, - 0xb12: 0x0008, 0xb13: 0x1bb9, 0xb14: 0x0040, 0xb15: 0x0040, 0xb16: 0x0008, 0xb17: 0x0008, - 0xb18: 0xe045, 0xb19: 0xe045, 0xb1a: 0x06f5, 0xb1b: 0x14a1, 0xb1c: 0x0040, 0xb1d: 0x1bd2, - 0xb1e: 0x1c02, 0xb1f: 0x1c32, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x1c61, - 0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045, - 0xb2a: 0x070d, 0xb2b: 0x14d1, 0xb2c: 0xe04d, 0xb2d: 0x1c7a, 0xb2e: 0x03d2, 0xb2f: 0x1caa, - 0xb30: 0x0040, 0xb31: 0x0040, 0xb32: 0x1cb9, 0xb33: 0x1ce9, 0xb34: 0x1d11, 0xb35: 0x0040, - 0xb36: 0x0008, 0xb37: 0x1d39, 0xb38: 0x0725, 0xb39: 0x14b9, 0xb3a: 0x0515, 0xb3b: 0x14e9, - 0xb3c: 0x1ce9, 0xb3d: 0x073e, 0xb3e: 0x075e, 0xb3f: 0x0040, - // Block 0x2d, offset 0xb40 - 0xb40: 0x000a, 0xb41: 0x000a, 0xb42: 0x000a, 0xb43: 0x000a, 0xb44: 0x000a, 0xb45: 0x000a, - 0xb46: 0x000a, 0xb47: 0x000a, 0xb48: 0x000a, 0xb49: 0x000a, 0xb4a: 0x000a, 0xb4b: 0x03c0, - 0xb4c: 0x0003, 0xb4d: 0x0003, 0xb4e: 0x0340, 0xb4f: 0x0340, 0xb50: 0x0018, 0xb51: 0xe00d, - 0xb52: 0x0018, 0xb53: 0x0018, 0xb54: 0x0018, 0xb55: 0x0018, 0xb56: 0x0018, 0xb57: 0x077e, - 0xb58: 0x0018, 0xb59: 0x0018, 0xb5a: 0x0018, 0xb5b: 0x0018, 0xb5c: 0x0018, 0xb5d: 0x0018, - 0xb5e: 0x0018, 0xb5f: 0x0018, 0xb60: 0x0018, 0xb61: 0x0018, 0xb62: 0x0018, 0xb63: 0x0018, - 0xb64: 0x0040, 0xb65: 0x0040, 0xb66: 0x0040, 0xb67: 0x0018, 0xb68: 0x0040, 0xb69: 0x0040, - 0xb6a: 0x0340, 0xb6b: 0x0340, 0xb6c: 0x0340, 0xb6d: 0x0340, 0xb6e: 0x0340, 0xb6f: 0x000a, - 0xb70: 0x0018, 0xb71: 0x0018, 0xb72: 0x0018, 0xb73: 0x1d69, 0xb74: 0x1da1, 0xb75: 0x0018, - 0xb76: 0x1df1, 0xb77: 0x1e29, 0xb78: 0x0018, 0xb79: 0x0018, 0xb7a: 0x0018, 0xb7b: 0x0018, - 0xb7c: 0x1e7a, 0xb7d: 0x0018, 0xb7e: 0x079e, 0xb7f: 0x0018, - // Block 0x2e, offset 0xb80 - 0xb80: 0x0018, 0xb81: 0x0018, 0xb82: 0x0018, 0xb83: 0x0018, 0xb84: 0x0018, 0xb85: 0x0018, - 0xb86: 0x0018, 0xb87: 0x1e92, 0xb88: 0x1eaa, 0xb89: 0x1ec2, 0xb8a: 0x0018, 0xb8b: 0x0018, - 0xb8c: 0x0018, 0xb8d: 0x0018, 0xb8e: 0x0018, 0xb8f: 0x0018, 0xb90: 0x0018, 0xb91: 0x0018, - 0xb92: 0x0018, 0xb93: 0x0018, 0xb94: 0x0018, 0xb95: 0x0018, 0xb96: 0x0018, 0xb97: 0x1ed9, - 0xb98: 0x0018, 0xb99: 0x0018, 0xb9a: 0x0018, 0xb9b: 0x0018, 0xb9c: 0x0018, 0xb9d: 0x0018, - 0xb9e: 0x0018, 0xb9f: 0x000a, 0xba0: 0x03c0, 0xba1: 0x0340, 0xba2: 0x0340, 0xba3: 0x0340, - 0xba4: 0x03c0, 0xba5: 0x0040, 0xba6: 0x0040, 0xba7: 0x0040, 0xba8: 0x0040, 0xba9: 0x0040, - 0xbaa: 0x0340, 0xbab: 0x0340, 0xbac: 0x0340, 0xbad: 0x0340, 0xbae: 0x0340, 0xbaf: 0x0340, - 0xbb0: 0x1f41, 0xbb1: 0x0f41, 0xbb2: 0x0040, 0xbb3: 0x0040, 0xbb4: 0x1f51, 0xbb5: 0x1f61, - 0xbb6: 0x1f71, 0xbb7: 0x1f81, 0xbb8: 0x1f91, 0xbb9: 0x1fa1, 0xbba: 0x1fb2, 0xbbb: 0x07bd, - 0xbbc: 0x1fc2, 0xbbd: 0x1fd2, 0xbbe: 0x1fe2, 0xbbf: 0x0f71, - // Block 0x2f, offset 0xbc0 - 0xbc0: 0x1f41, 0xbc1: 0x00c9, 0xbc2: 0x0069, 0xbc3: 0x0079, 0xbc4: 0x1f51, 0xbc5: 0x1f61, - 0xbc6: 0x1f71, 0xbc7: 0x1f81, 0xbc8: 0x1f91, 0xbc9: 0x1fa1, 0xbca: 0x1fb2, 0xbcb: 0x07d5, - 0xbcc: 0x1fc2, 0xbcd: 0x1fd2, 0xbce: 0x1fe2, 0xbcf: 0x0040, 0xbd0: 0x0039, 0xbd1: 0x0f09, - 0xbd2: 0x00d9, 0xbd3: 0x0369, 0xbd4: 0x0ff9, 0xbd5: 0x0249, 0xbd6: 0x0f51, 0xbd7: 0x0359, - 0xbd8: 0x0f61, 0xbd9: 0x0f71, 0xbda: 0x0f99, 0xbdb: 0x01d9, 0xbdc: 0x0fa9, 0xbdd: 0x0040, - 0xbde: 0x0040, 0xbdf: 0x0040, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018, - 0xbe4: 0x0018, 0xbe5: 0x0018, 0xbe6: 0x0018, 0xbe7: 0x0018, 0xbe8: 0x1ff1, 0xbe9: 0x0018, - 0xbea: 0x0018, 0xbeb: 0x0018, 0xbec: 0x0018, 0xbed: 0x0018, 0xbee: 0x0018, 0xbef: 0x0018, - 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x0018, 0xbf4: 0x0018, 0xbf5: 0x0018, - 0xbf6: 0x0018, 0xbf7: 0x0018, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, - 0xbfc: 0x0018, 0xbfd: 0x0018, 0xbfe: 0x0018, 0xbff: 0x0040, - // Block 0x30, offset 0xc00 - 0xc00: 0x07ee, 0xc01: 0x080e, 0xc02: 0x1159, 0xc03: 0x082d, 0xc04: 0x0018, 0xc05: 0x084e, - 0xc06: 0x086e, 0xc07: 0x1011, 0xc08: 0x0018, 0xc09: 0x088d, 0xc0a: 0x0f31, 0xc0b: 0x0249, - 0xc0c: 0x0249, 0xc0d: 0x0249, 0xc0e: 0x0249, 0xc0f: 0x2009, 0xc10: 0x0f41, 0xc11: 0x0f41, - 0xc12: 0x0359, 0xc13: 0x0359, 0xc14: 0x0018, 0xc15: 0x0f71, 0xc16: 0x2021, 0xc17: 0x0018, - 0xc18: 0x0018, 0xc19: 0x0f99, 0xc1a: 0x2039, 0xc1b: 0x0269, 0xc1c: 0x0269, 0xc1d: 0x0269, - 0xc1e: 0x0018, 0xc1f: 0x0018, 0xc20: 0x2049, 0xc21: 0x08ad, 0xc22: 0x2061, 0xc23: 0x0018, - 0xc24: 0x13d1, 0xc25: 0x0018, 0xc26: 0x2079, 0xc27: 0x0018, 0xc28: 0x13d1, 0xc29: 0x0018, - 0xc2a: 0x0f51, 0xc2b: 0x2091, 0xc2c: 0x0ee9, 0xc2d: 0x1159, 0xc2e: 0x0018, 0xc2f: 0x0f09, - 0xc30: 0x0f09, 0xc31: 0x1199, 0xc32: 0x0040, 0xc33: 0x0f61, 0xc34: 0x00d9, 0xc35: 0x20a9, - 0xc36: 0x20c1, 0xc37: 0x20d9, 0xc38: 0x20f1, 0xc39: 0x0f41, 0xc3a: 0x0018, 0xc3b: 0x08cd, - 0xc3c: 0x2109, 0xc3d: 0x10b1, 0xc3e: 0x10b1, 0xc3f: 0x2109, - // Block 0x31, offset 0xc40 - 0xc40: 0x08ed, 0xc41: 0x0018, 0xc42: 0x0018, 0xc43: 0x0018, 0xc44: 0x0018, 0xc45: 0x0ef9, - 0xc46: 0x0ef9, 0xc47: 0x0f09, 0xc48: 0x0f41, 0xc49: 0x0259, 0xc4a: 0x0018, 0xc4b: 0x0018, - 0xc4c: 0x0018, 0xc4d: 0x0018, 0xc4e: 0x0008, 0xc4f: 0x0018, 0xc50: 0x2121, 0xc51: 0x2151, - 0xc52: 0x2181, 0xc53: 0x21b9, 0xc54: 0x21e9, 0xc55: 0x2219, 0xc56: 0x2249, 0xc57: 0x2279, - 0xc58: 0x22a9, 0xc59: 0x22d9, 0xc5a: 0x2309, 0xc5b: 0x2339, 0xc5c: 0x2369, 0xc5d: 0x2399, - 0xc5e: 0x23c9, 0xc5f: 0x23f9, 0xc60: 0x0f41, 0xc61: 0x2421, 0xc62: 0x0905, 0xc63: 0x2439, - 0xc64: 0x1089, 0xc65: 0x2451, 0xc66: 0x0925, 0xc67: 0x2469, 0xc68: 0x2491, 0xc69: 0x0369, - 0xc6a: 0x24a9, 0xc6b: 0x0945, 0xc6c: 0x0359, 0xc6d: 0x1159, 0xc6e: 0x0ef9, 0xc6f: 0x0f61, - 0xc70: 0x0f41, 0xc71: 0x2421, 0xc72: 0x0965, 0xc73: 0x2439, 0xc74: 0x1089, 0xc75: 0x2451, - 0xc76: 0x0985, 0xc77: 0x2469, 0xc78: 0x2491, 0xc79: 0x0369, 0xc7a: 0x24a9, 0xc7b: 0x09a5, - 0xc7c: 0x0359, 0xc7d: 0x1159, 0xc7e: 0x0ef9, 0xc7f: 0x0f61, - // Block 0x32, offset 0xc80 - 0xc80: 0x0018, 0xc81: 0x0018, 0xc82: 0x0018, 0xc83: 0x0018, 0xc84: 0x0018, 0xc85: 0x0018, - 0xc86: 0x0018, 0xc87: 0x0018, 0xc88: 0x0018, 0xc89: 0x0018, 0xc8a: 0x0018, 0xc8b: 0x0040, - 0xc8c: 0x0040, 0xc8d: 0x0040, 0xc8e: 0x0040, 0xc8f: 0x0040, 0xc90: 0x0040, 0xc91: 0x0040, - 0xc92: 0x0040, 0xc93: 0x0040, 0xc94: 0x0040, 0xc95: 0x0040, 0xc96: 0x0040, 0xc97: 0x0040, - 0xc98: 0x0040, 0xc99: 0x0040, 0xc9a: 0x0040, 0xc9b: 0x0040, 0xc9c: 0x0040, 0xc9d: 0x0040, - 0xc9e: 0x0040, 0xc9f: 0x0040, 0xca0: 0x00c9, 0xca1: 0x0069, 0xca2: 0x0079, 0xca3: 0x1f51, - 0xca4: 0x1f61, 0xca5: 0x1f71, 0xca6: 0x1f81, 0xca7: 0x1f91, 0xca8: 0x1fa1, 0xca9: 0x2601, - 0xcaa: 0x2619, 0xcab: 0x2631, 0xcac: 0x2649, 0xcad: 0x2661, 0xcae: 0x2679, 0xcaf: 0x2691, - 0xcb0: 0x26a9, 0xcb1: 0x26c1, 0xcb2: 0x26d9, 0xcb3: 0x26f1, 0xcb4: 0x0a06, 0xcb5: 0x0a26, - 0xcb6: 0x0a46, 0xcb7: 0x0a66, 0xcb8: 0x0a86, 0xcb9: 0x0aa6, 0xcba: 0x0ac6, 0xcbb: 0x0ae6, - 0xcbc: 0x0b06, 0xcbd: 0x270a, 0xcbe: 0x2732, 0xcbf: 0x275a, - // Block 0x33, offset 0xcc0 - 0xcc0: 0x2782, 0xcc1: 0x27aa, 0xcc2: 0x27d2, 0xcc3: 0x27fa, 0xcc4: 0x2822, 0xcc5: 0x284a, - 0xcc6: 0x2872, 0xcc7: 0x289a, 0xcc8: 0x0040, 0xcc9: 0x0040, 0xcca: 0x0040, 0xccb: 0x0040, - 0xccc: 0x0040, 0xccd: 0x0040, 0xcce: 0x0040, 0xccf: 0x0040, 0xcd0: 0x0040, 0xcd1: 0x0040, - 0xcd2: 0x0040, 0xcd3: 0x0040, 0xcd4: 0x0040, 0xcd5: 0x0040, 0xcd6: 0x0040, 0xcd7: 0x0040, - 0xcd8: 0x0040, 0xcd9: 0x0040, 0xcda: 0x0040, 0xcdb: 0x0040, 0xcdc: 0x0b26, 0xcdd: 0x0b46, - 0xcde: 0x0b66, 0xcdf: 0x0b86, 0xce0: 0x0ba6, 0xce1: 0x0bc6, 0xce2: 0x0be6, 0xce3: 0x0c06, - 0xce4: 0x0c26, 0xce5: 0x0c46, 0xce6: 0x0c66, 0xce7: 0x0c86, 0xce8: 0x0ca6, 0xce9: 0x0cc6, - 0xcea: 0x0ce6, 0xceb: 0x0d06, 0xcec: 0x0d26, 0xced: 0x0d46, 0xcee: 0x0d66, 0xcef: 0x0d86, - 0xcf0: 0x0da6, 0xcf1: 0x0dc6, 0xcf2: 0x0de6, 0xcf3: 0x0e06, 0xcf4: 0x0e26, 0xcf5: 0x0e46, - 0xcf6: 0x0039, 0xcf7: 0x0ee9, 0xcf8: 0x1159, 0xcf9: 0x0ef9, 0xcfa: 0x0f09, 0xcfb: 0x1199, - 0xcfc: 0x0f31, 0xcfd: 0x0249, 0xcfe: 0x0f41, 0xcff: 0x0259, - // Block 0x34, offset 0xd00 - 0xd00: 0x0f51, 0xd01: 0x0359, 0xd02: 0x0f61, 0xd03: 0x0f71, 0xd04: 0x00d9, 0xd05: 0x0f99, - 0xd06: 0x2039, 0xd07: 0x0269, 0xd08: 0x01d9, 0xd09: 0x0fa9, 0xd0a: 0x0fb9, 0xd0b: 0x1089, - 0xd0c: 0x0279, 0xd0d: 0x0369, 0xd0e: 0x0289, 0xd0f: 0x13d1, 0xd10: 0x0039, 0xd11: 0x0ee9, - 0xd12: 0x1159, 0xd13: 0x0ef9, 0xd14: 0x0f09, 0xd15: 0x1199, 0xd16: 0x0f31, 0xd17: 0x0249, - 0xd18: 0x0f41, 0xd19: 0x0259, 0xd1a: 0x0f51, 0xd1b: 0x0359, 0xd1c: 0x0f61, 0xd1d: 0x0f71, - 0xd1e: 0x00d9, 0xd1f: 0x0f99, 0xd20: 0x2039, 0xd21: 0x0269, 0xd22: 0x01d9, 0xd23: 0x0fa9, - 0xd24: 0x0fb9, 0xd25: 0x1089, 0xd26: 0x0279, 0xd27: 0x0369, 0xd28: 0x0289, 0xd29: 0x13d1, - 0xd2a: 0x1f41, 0xd2b: 0x0018, 0xd2c: 0x0018, 0xd2d: 0x0018, 0xd2e: 0x0018, 0xd2f: 0x0018, - 0xd30: 0x0018, 0xd31: 0x0018, 0xd32: 0x0018, 0xd33: 0x0018, 0xd34: 0x0018, 0xd35: 0x0018, - 0xd36: 0x0018, 0xd37: 0x0018, 0xd38: 0x0018, 0xd39: 0x0018, 0xd3a: 0x0018, 0xd3b: 0x0018, - 0xd3c: 0x0018, 0xd3d: 0x0018, 0xd3e: 0x0018, 0xd3f: 0x0018, - // Block 0x35, offset 0xd40 - 0xd40: 0x0008, 0xd41: 0x0008, 0xd42: 0x0008, 0xd43: 0x0008, 0xd44: 0x0008, 0xd45: 0x0008, - 0xd46: 0x0008, 0xd47: 0x0008, 0xd48: 0x0008, 0xd49: 0x0008, 0xd4a: 0x0008, 0xd4b: 0x0008, - 0xd4c: 0x0008, 0xd4d: 0x0008, 0xd4e: 0x0008, 0xd4f: 0x0008, 0xd50: 0x0008, 0xd51: 0x0008, - 0xd52: 0x0008, 0xd53: 0x0008, 0xd54: 0x0008, 0xd55: 0x0008, 0xd56: 0x0008, 0xd57: 0x0008, - 0xd58: 0x0008, 0xd59: 0x0008, 0xd5a: 0x0008, 0xd5b: 0x0008, 0xd5c: 0x0008, 0xd5d: 0x0008, - 0xd5e: 0x0008, 0xd5f: 0x0040, 0xd60: 0xe00d, 0xd61: 0x0008, 0xd62: 0x2971, 0xd63: 0x0ebd, - 0xd64: 0x2989, 0xd65: 0x0008, 0xd66: 0x0008, 0xd67: 0xe07d, 0xd68: 0x0008, 0xd69: 0xe01d, - 0xd6a: 0x0008, 0xd6b: 0xe03d, 0xd6c: 0x0008, 0xd6d: 0x0fe1, 0xd6e: 0x1281, 0xd6f: 0x0fc9, - 0xd70: 0x1141, 0xd71: 0x0008, 0xd72: 0xe00d, 0xd73: 0x0008, 0xd74: 0x0008, 0xd75: 0xe01d, - 0xd76: 0x0008, 0xd77: 0x0008, 0xd78: 0x0008, 0xd79: 0x0008, 0xd7a: 0x0008, 0xd7b: 0x0008, - 0xd7c: 0x0259, 0xd7d: 0x1089, 0xd7e: 0x29a1, 0xd7f: 0x29b9, - // Block 0x36, offset 0xd80 - 0xd80: 0xe00d, 0xd81: 0x0008, 0xd82: 0xe00d, 0xd83: 0x0008, 0xd84: 0xe00d, 0xd85: 0x0008, - 0xd86: 0xe00d, 0xd87: 0x0008, 0xd88: 0xe00d, 0xd89: 0x0008, 0xd8a: 0xe00d, 0xd8b: 0x0008, - 0xd8c: 0xe00d, 0xd8d: 0x0008, 0xd8e: 0xe00d, 0xd8f: 0x0008, 0xd90: 0xe00d, 0xd91: 0x0008, - 0xd92: 0xe00d, 0xd93: 0x0008, 0xd94: 0xe00d, 0xd95: 0x0008, 0xd96: 0xe00d, 0xd97: 0x0008, - 0xd98: 0xe00d, 0xd99: 0x0008, 0xd9a: 0xe00d, 0xd9b: 0x0008, 0xd9c: 0xe00d, 0xd9d: 0x0008, - 0xd9e: 0xe00d, 0xd9f: 0x0008, 0xda0: 0xe00d, 0xda1: 0x0008, 0xda2: 0xe00d, 0xda3: 0x0008, - 0xda4: 0x0008, 0xda5: 0x0018, 0xda6: 0x0018, 0xda7: 0x0018, 0xda8: 0x0018, 0xda9: 0x0018, - 0xdaa: 0x0018, 0xdab: 0xe03d, 0xdac: 0x0008, 0xdad: 0xe01d, 0xdae: 0x0008, 0xdaf: 0x1308, - 0xdb0: 0x1308, 0xdb1: 0x1308, 0xdb2: 0xe00d, 0xdb3: 0x0008, 0xdb4: 0x0040, 0xdb5: 0x0040, - 0xdb6: 0x0040, 0xdb7: 0x0040, 0xdb8: 0x0040, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018, - 0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018, - // Block 0x37, offset 0xdc0 - 0xdc0: 0x26fd, 0xdc1: 0x271d, 0xdc2: 0x273d, 0xdc3: 0x275d, 0xdc4: 0x277d, 0xdc5: 0x279d, - 0xdc6: 0x27bd, 0xdc7: 0x27dd, 0xdc8: 0x27fd, 0xdc9: 0x281d, 0xdca: 0x283d, 0xdcb: 0x285d, - 0xdcc: 0x287d, 0xdcd: 0x289d, 0xdce: 0x28bd, 0xdcf: 0x28dd, 0xdd0: 0x28fd, 0xdd1: 0x291d, - 0xdd2: 0x293d, 0xdd3: 0x295d, 0xdd4: 0x297d, 0xdd5: 0x299d, 0xdd6: 0x0040, 0xdd7: 0x0040, - 0xdd8: 0x0040, 0xdd9: 0x0040, 0xdda: 0x0040, 0xddb: 0x0040, 0xddc: 0x0040, 0xddd: 0x0040, - 0xdde: 0x0040, 0xddf: 0x0040, 0xde0: 0x0040, 0xde1: 0x0040, 0xde2: 0x0040, 0xde3: 0x0040, - 0xde4: 0x0040, 0xde5: 0x0040, 0xde6: 0x0040, 0xde7: 0x0040, 0xde8: 0x0040, 0xde9: 0x0040, - 0xdea: 0x0040, 0xdeb: 0x0040, 0xdec: 0x0040, 0xded: 0x0040, 0xdee: 0x0040, 0xdef: 0x0040, - 0xdf0: 0x0040, 0xdf1: 0x0040, 0xdf2: 0x0040, 0xdf3: 0x0040, 0xdf4: 0x0040, 0xdf5: 0x0040, - 0xdf6: 0x0040, 0xdf7: 0x0040, 0xdf8: 0x0040, 0xdf9: 0x0040, 0xdfa: 0x0040, 0xdfb: 0x0040, - 0xdfc: 0x0040, 0xdfd: 0x0040, 0xdfe: 0x0040, 0xdff: 0x0040, - // Block 0x38, offset 0xe00 - 0xe00: 0x000a, 0xe01: 0x0018, 0xe02: 0x29d1, 0xe03: 0x0018, 0xe04: 0x0018, 0xe05: 0x0008, - 0xe06: 0x0008, 0xe07: 0x0008, 0xe08: 0x0018, 0xe09: 0x0018, 0xe0a: 0x0018, 0xe0b: 0x0018, - 0xe0c: 0x0018, 0xe0d: 0x0018, 0xe0e: 0x0018, 0xe0f: 0x0018, 0xe10: 0x0018, 0xe11: 0x0018, - 0xe12: 0x0018, 0xe13: 0x0018, 0xe14: 0x0018, 0xe15: 0x0018, 0xe16: 0x0018, 0xe17: 0x0018, - 0xe18: 0x0018, 0xe19: 0x0018, 0xe1a: 0x0018, 0xe1b: 0x0018, 0xe1c: 0x0018, 0xe1d: 0x0018, - 0xe1e: 0x0018, 0xe1f: 0x0018, 0xe20: 0x0018, 0xe21: 0x0018, 0xe22: 0x0018, 0xe23: 0x0018, - 0xe24: 0x0018, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018, - 0xe2a: 0x1308, 0xe2b: 0x1308, 0xe2c: 0x1308, 0xe2d: 0x1308, 0xe2e: 0x1018, 0xe2f: 0x1018, - 0xe30: 0x0018, 0xe31: 0x0018, 0xe32: 0x0018, 0xe33: 0x0018, 0xe34: 0x0018, 0xe35: 0x0018, - 0xe36: 0xe125, 0xe37: 0x0018, 0xe38: 0x29bd, 0xe39: 0x29dd, 0xe3a: 0x29fd, 0xe3b: 0x0018, - 0xe3c: 0x0008, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018, - // Block 0x39, offset 0xe40 - 0xe40: 0x2b3d, 0xe41: 0x2b5d, 0xe42: 0x2b7d, 0xe43: 0x2b9d, 0xe44: 0x2bbd, 0xe45: 0x2bdd, - 0xe46: 0x2bdd, 0xe47: 0x2bdd, 0xe48: 0x2bfd, 0xe49: 0x2bfd, 0xe4a: 0x2bfd, 0xe4b: 0x2bfd, - 0xe4c: 0x2c1d, 0xe4d: 0x2c1d, 0xe4e: 0x2c1d, 0xe4f: 0x2c3d, 0xe50: 0x2c5d, 0xe51: 0x2c5d, - 0xe52: 0x2a7d, 0xe53: 0x2a7d, 0xe54: 0x2c5d, 0xe55: 0x2c5d, 0xe56: 0x2c7d, 0xe57: 0x2c7d, - 0xe58: 0x2c5d, 0xe59: 0x2c5d, 0xe5a: 0x2a7d, 0xe5b: 0x2a7d, 0xe5c: 0x2c5d, 0xe5d: 0x2c5d, - 0xe5e: 0x2c3d, 0xe5f: 0x2c3d, 0xe60: 0x2c9d, 0xe61: 0x2c9d, 0xe62: 0x2cbd, 0xe63: 0x2cbd, - 0xe64: 0x0040, 0xe65: 0x2cdd, 0xe66: 0x2cfd, 0xe67: 0x2d1d, 0xe68: 0x2d1d, 0xe69: 0x2d3d, - 0xe6a: 0x2d5d, 0xe6b: 0x2d7d, 0xe6c: 0x2d9d, 0xe6d: 0x2dbd, 0xe6e: 0x2ddd, 0xe6f: 0x2dfd, - 0xe70: 0x2e1d, 0xe71: 0x2e3d, 0xe72: 0x2e3d, 0xe73: 0x2e5d, 0xe74: 0x2e7d, 0xe75: 0x2e7d, - 0xe76: 0x2e9d, 0xe77: 0x2ebd, 0xe78: 0x2e5d, 0xe79: 0x2edd, 0xe7a: 0x2efd, 0xe7b: 0x2edd, - 0xe7c: 0x2e5d, 0xe7d: 0x2f1d, 0xe7e: 0x2f3d, 0xe7f: 0x2f5d, - // Block 0x3a, offset 0xe80 - 0xe80: 0x2f7d, 0xe81: 0x2f9d, 0xe82: 0x2cfd, 0xe83: 0x2cdd, 0xe84: 0x2fbd, 0xe85: 0x2fdd, - 0xe86: 0x2ffd, 0xe87: 0x301d, 0xe88: 0x303d, 0xe89: 0x305d, 0xe8a: 0x307d, 0xe8b: 0x309d, - 0xe8c: 0x30bd, 0xe8d: 0x30dd, 0xe8e: 0x30fd, 0xe8f: 0x0040, 0xe90: 0x0018, 0xe91: 0x0018, - 0xe92: 0x311d, 0xe93: 0x313d, 0xe94: 0x315d, 0xe95: 0x317d, 0xe96: 0x319d, 0xe97: 0x31bd, - 0xe98: 0x31dd, 0xe99: 0x31fd, 0xe9a: 0x321d, 0xe9b: 0x323d, 0xe9c: 0x315d, 0xe9d: 0x325d, - 0xe9e: 0x327d, 0xe9f: 0x329d, 0xea0: 0x0008, 0xea1: 0x0008, 0xea2: 0x0008, 0xea3: 0x0008, - 0xea4: 0x0008, 0xea5: 0x0008, 0xea6: 0x0008, 0xea7: 0x0008, 0xea8: 0x0008, 0xea9: 0x0008, - 0xeaa: 0x0008, 0xeab: 0x0008, 0xeac: 0x0008, 0xead: 0x0008, 0xeae: 0x0008, 0xeaf: 0x0008, - 0xeb0: 0x0008, 0xeb1: 0x0008, 0xeb2: 0x0008, 0xeb3: 0x0008, 0xeb4: 0x0008, 0xeb5: 0x0008, - 0xeb6: 0x0008, 0xeb7: 0x0008, 0xeb8: 0x0008, 0xeb9: 0x0008, 0xeba: 0x0008, 0xebb: 0x0040, - 0xebc: 0x0040, 0xebd: 0x0040, 0xebe: 0x0040, 0xebf: 0x0040, - // Block 0x3b, offset 0xec0 - 0xec0: 0x36a2, 0xec1: 0x36d2, 0xec2: 0x3702, 0xec3: 0x3732, 0xec4: 0x32bd, 0xec5: 0x32dd, - 0xec6: 0x32fd, 0xec7: 0x331d, 0xec8: 0x0018, 0xec9: 0x0018, 0xeca: 0x0018, 0xecb: 0x0018, - 0xecc: 0x0018, 0xecd: 0x0018, 0xece: 0x0018, 0xecf: 0x0018, 0xed0: 0x333d, 0xed1: 0x3761, - 0xed2: 0x3779, 0xed3: 0x3791, 0xed4: 0x37a9, 0xed5: 0x37c1, 0xed6: 0x37d9, 0xed7: 0x37f1, - 0xed8: 0x3809, 0xed9: 0x3821, 0xeda: 0x3839, 0xedb: 0x3851, 0xedc: 0x3869, 0xedd: 0x3881, - 0xede: 0x3899, 0xedf: 0x38b1, 0xee0: 0x335d, 0xee1: 0x337d, 0xee2: 0x339d, 0xee3: 0x33bd, - 0xee4: 0x33dd, 0xee5: 0x33dd, 0xee6: 0x33fd, 0xee7: 0x341d, 0xee8: 0x343d, 0xee9: 0x345d, - 0xeea: 0x347d, 0xeeb: 0x349d, 0xeec: 0x34bd, 0xeed: 0x34dd, 0xeee: 0x34fd, 0xeef: 0x351d, - 0xef0: 0x353d, 0xef1: 0x355d, 0xef2: 0x357d, 0xef3: 0x359d, 0xef4: 0x35bd, 0xef5: 0x35dd, - 0xef6: 0x35fd, 0xef7: 0x361d, 0xef8: 0x363d, 0xef9: 0x365d, 0xefa: 0x367d, 0xefb: 0x369d, - 0xefc: 0x38c9, 0xefd: 0x3901, 0xefe: 0x36bd, 0xeff: 0x0018, - // Block 0x3c, offset 0xf00 - 0xf00: 0x36dd, 0xf01: 0x36fd, 0xf02: 0x371d, 0xf03: 0x373d, 0xf04: 0x375d, 0xf05: 0x377d, - 0xf06: 0x379d, 0xf07: 0x37bd, 0xf08: 0x37dd, 0xf09: 0x37fd, 0xf0a: 0x381d, 0xf0b: 0x383d, - 0xf0c: 0x385d, 0xf0d: 0x387d, 0xf0e: 0x389d, 0xf0f: 0x38bd, 0xf10: 0x38dd, 0xf11: 0x38fd, - 0xf12: 0x391d, 0xf13: 0x393d, 0xf14: 0x395d, 0xf15: 0x397d, 0xf16: 0x399d, 0xf17: 0x39bd, - 0xf18: 0x39dd, 0xf19: 0x39fd, 0xf1a: 0x3a1d, 0xf1b: 0x3a3d, 0xf1c: 0x3a5d, 0xf1d: 0x3a7d, - 0xf1e: 0x3a9d, 0xf1f: 0x3abd, 0xf20: 0x3add, 0xf21: 0x3afd, 0xf22: 0x3b1d, 0xf23: 0x3b3d, - 0xf24: 0x3b5d, 0xf25: 0x3b7d, 0xf26: 0x127d, 0xf27: 0x3b9d, 0xf28: 0x3bbd, 0xf29: 0x3bdd, - 0xf2a: 0x3bfd, 0xf2b: 0x3c1d, 0xf2c: 0x3c3d, 0xf2d: 0x3c5d, 0xf2e: 0x239d, 0xf2f: 0x3c7d, - 0xf30: 0x3c9d, 0xf31: 0x3939, 0xf32: 0x3951, 0xf33: 0x3969, 0xf34: 0x3981, 0xf35: 0x3999, - 0xf36: 0x39b1, 0xf37: 0x39c9, 0xf38: 0x39e1, 0xf39: 0x39f9, 0xf3a: 0x3a11, 0xf3b: 0x3a29, - 0xf3c: 0x3a41, 0xf3d: 0x3a59, 0xf3e: 0x3a71, 0xf3f: 0x3a89, - // Block 0x3d, offset 0xf40 - 0xf40: 0x3aa1, 0xf41: 0x3ac9, 0xf42: 0x3af1, 0xf43: 0x3b19, 0xf44: 0x3b41, 0xf45: 0x3b69, - 0xf46: 0x3b91, 0xf47: 0x3bb9, 0xf48: 0x3be1, 0xf49: 0x3c09, 0xf4a: 0x3c39, 0xf4b: 0x3c69, - 0xf4c: 0x3c99, 0xf4d: 0x3cbd, 0xf4e: 0x3cb1, 0xf4f: 0x3cdd, 0xf50: 0x3cfd, 0xf51: 0x3d15, - 0xf52: 0x3d2d, 0xf53: 0x3d45, 0xf54: 0x3d5d, 0xf55: 0x3d5d, 0xf56: 0x3d45, 0xf57: 0x3d75, - 0xf58: 0x07bd, 0xf59: 0x3d8d, 0xf5a: 0x3da5, 0xf5b: 0x3dbd, 0xf5c: 0x3dd5, 0xf5d: 0x3ded, - 0xf5e: 0x3e05, 0xf5f: 0x3e1d, 0xf60: 0x3e35, 0xf61: 0x3e4d, 0xf62: 0x3e65, 0xf63: 0x3e7d, - 0xf64: 0x3e95, 0xf65: 0x3e95, 0xf66: 0x3ead, 0xf67: 0x3ead, 0xf68: 0x3ec5, 0xf69: 0x3ec5, - 0xf6a: 0x3edd, 0xf6b: 0x3ef5, 0xf6c: 0x3f0d, 0xf6d: 0x3f25, 0xf6e: 0x3f3d, 0xf6f: 0x3f3d, - 0xf70: 0x3f55, 0xf71: 0x3f55, 0xf72: 0x3f55, 0xf73: 0x3f6d, 0xf74: 0x3f85, 0xf75: 0x3f9d, - 0xf76: 0x3fb5, 0xf77: 0x3f9d, 0xf78: 0x3fcd, 0xf79: 0x3fe5, 0xf7a: 0x3f6d, 0xf7b: 0x3ffd, - 0xf7c: 0x4015, 0xf7d: 0x4015, 0xf7e: 0x4015, 0xf7f: 0x0040, - // Block 0x3e, offset 0xf80 - 0xf80: 0x3cc9, 0xf81: 0x3d31, 0xf82: 0x3d99, 0xf83: 0x3e01, 0xf84: 0x3e51, 0xf85: 0x3eb9, - 0xf86: 0x3f09, 0xf87: 0x3f59, 0xf88: 0x3fd9, 0xf89: 0x4041, 0xf8a: 0x4091, 0xf8b: 0x40e1, - 0xf8c: 0x4131, 0xf8d: 0x4199, 0xf8e: 0x4201, 0xf8f: 0x4251, 0xf90: 0x42a1, 0xf91: 0x42d9, - 0xf92: 0x4329, 0xf93: 0x4391, 0xf94: 0x43f9, 0xf95: 0x4431, 0xf96: 0x44b1, 0xf97: 0x4549, - 0xf98: 0x45c9, 0xf99: 0x4619, 0xf9a: 0x4699, 0xf9b: 0x4719, 0xf9c: 0x4781, 0xf9d: 0x47d1, - 0xf9e: 0x4821, 0xf9f: 0x4871, 0xfa0: 0x48d9, 0xfa1: 0x4959, 0xfa2: 0x49c1, 0xfa3: 0x4a11, - 0xfa4: 0x4a61, 0xfa5: 0x4ab1, 0xfa6: 0x4ae9, 0xfa7: 0x4b21, 0xfa8: 0x4b59, 0xfa9: 0x4b91, - 0xfaa: 0x4be1, 0xfab: 0x4c31, 0xfac: 0x4cb1, 0xfad: 0x4d01, 0xfae: 0x4d69, 0xfaf: 0x4de9, - 0xfb0: 0x4e39, 0xfb1: 0x4e71, 0xfb2: 0x4ea9, 0xfb3: 0x4f29, 0xfb4: 0x4f91, 0xfb5: 0x5011, - 0xfb6: 0x5061, 0xfb7: 0x50e1, 0xfb8: 0x5119, 0xfb9: 0x5169, 0xfba: 0x51b9, 0xfbb: 0x5209, - 0xfbc: 0x5259, 0xfbd: 0x52a9, 0xfbe: 0x5311, 0xfbf: 0x5361, - // Block 0x3f, offset 0xfc0 - 0xfc0: 0x5399, 0xfc1: 0x53e9, 0xfc2: 0x5439, 0xfc3: 0x5489, 0xfc4: 0x54f1, 0xfc5: 0x5541, - 0xfc6: 0x5591, 0xfc7: 0x55e1, 0xfc8: 0x5661, 0xfc9: 0x56c9, 0xfca: 0x5701, 0xfcb: 0x5781, - 0xfcc: 0x57b9, 0xfcd: 0x5821, 0xfce: 0x5889, 0xfcf: 0x58d9, 0xfd0: 0x5929, 0xfd1: 0x5979, - 0xfd2: 0x59e1, 0xfd3: 0x5a19, 0xfd4: 0x5a69, 0xfd5: 0x5ad1, 0xfd6: 0x5b09, 0xfd7: 0x5b89, - 0xfd8: 0x5bd9, 0xfd9: 0x5c01, 0xfda: 0x5c29, 0xfdb: 0x5c51, 0xfdc: 0x5c79, 0xfdd: 0x5ca1, - 0xfde: 0x5cc9, 0xfdf: 0x5cf1, 0xfe0: 0x5d19, 0xfe1: 0x5d41, 0xfe2: 0x5d69, 0xfe3: 0x5d99, - 0xfe4: 0x5dc9, 0xfe5: 0x5df9, 0xfe6: 0x5e29, 0xfe7: 0x5e59, 0xfe8: 0x5e89, 0xfe9: 0x5eb9, - 0xfea: 0x5ee9, 0xfeb: 0x5f19, 0xfec: 0x5f49, 0xfed: 0x5f79, 0xfee: 0x5fa9, 0xfef: 0x5fd9, - 0xff0: 0x6009, 0xff1: 0x402d, 0xff2: 0x6039, 0xff3: 0x6051, 0xff4: 0x404d, 0xff5: 0x6069, - 0xff6: 0x6081, 0xff7: 0x6099, 0xff8: 0x406d, 0xff9: 0x406d, 0xffa: 0x60b1, 0xffb: 0x60c9, - 0xffc: 0x6101, 0xffd: 0x6139, 0xffe: 0x6171, 0xfff: 0x61a9, - // Block 0x40, offset 0x1000 - 0x1000: 0x6211, 0x1001: 0x6229, 0x1002: 0x408d, 0x1003: 0x6241, 0x1004: 0x6259, 0x1005: 0x6271, - 0x1006: 0x6289, 0x1007: 0x62a1, 0x1008: 0x40ad, 0x1009: 0x62b9, 0x100a: 0x62e1, 0x100b: 0x62f9, - 0x100c: 0x40cd, 0x100d: 0x40cd, 0x100e: 0x6311, 0x100f: 0x6329, 0x1010: 0x6341, 0x1011: 0x40ed, - 0x1012: 0x410d, 0x1013: 0x412d, 0x1014: 0x414d, 0x1015: 0x416d, 0x1016: 0x6359, 0x1017: 0x6371, - 0x1018: 0x6389, 0x1019: 0x63a1, 0x101a: 0x63b9, 0x101b: 0x418d, 0x101c: 0x63d1, 0x101d: 0x63e9, - 0x101e: 0x6401, 0x101f: 0x41ad, 0x1020: 0x41cd, 0x1021: 0x6419, 0x1022: 0x41ed, 0x1023: 0x420d, - 0x1024: 0x422d, 0x1025: 0x6431, 0x1026: 0x424d, 0x1027: 0x6449, 0x1028: 0x6479, 0x1029: 0x6211, - 0x102a: 0x426d, 0x102b: 0x428d, 0x102c: 0x42ad, 0x102d: 0x42cd, 0x102e: 0x64b1, 0x102f: 0x64f1, - 0x1030: 0x6539, 0x1031: 0x6551, 0x1032: 0x42ed, 0x1033: 0x6569, 0x1034: 0x6581, 0x1035: 0x6599, - 0x1036: 0x430d, 0x1037: 0x65b1, 0x1038: 0x65c9, 0x1039: 0x65b1, 0x103a: 0x65e1, 0x103b: 0x65f9, - 0x103c: 0x432d, 0x103d: 0x6611, 0x103e: 0x6629, 0x103f: 0x6611, - // Block 0x41, offset 0x1040 - 0x1040: 0x434d, 0x1041: 0x436d, 0x1042: 0x0040, 0x1043: 0x6641, 0x1044: 0x6659, 0x1045: 0x6671, - 0x1046: 0x6689, 0x1047: 0x0040, 0x1048: 0x66c1, 0x1049: 0x66d9, 0x104a: 0x66f1, 0x104b: 0x6709, - 0x104c: 0x6721, 0x104d: 0x6739, 0x104e: 0x6401, 0x104f: 0x6751, 0x1050: 0x6769, 0x1051: 0x6781, - 0x1052: 0x438d, 0x1053: 0x6799, 0x1054: 0x6289, 0x1055: 0x43ad, 0x1056: 0x43cd, 0x1057: 0x67b1, - 0x1058: 0x0040, 0x1059: 0x43ed, 0x105a: 0x67c9, 0x105b: 0x67e1, 0x105c: 0x67f9, 0x105d: 0x6811, - 0x105e: 0x6829, 0x105f: 0x6859, 0x1060: 0x6889, 0x1061: 0x68b1, 0x1062: 0x68d9, 0x1063: 0x6901, - 0x1064: 0x6929, 0x1065: 0x6951, 0x1066: 0x6979, 0x1067: 0x69a1, 0x1068: 0x69c9, 0x1069: 0x69f1, - 0x106a: 0x6a21, 0x106b: 0x6a51, 0x106c: 0x6a81, 0x106d: 0x6ab1, 0x106e: 0x6ae1, 0x106f: 0x6b11, - 0x1070: 0x6b41, 0x1071: 0x6b71, 0x1072: 0x6ba1, 0x1073: 0x6bd1, 0x1074: 0x6c01, 0x1075: 0x6c31, - 0x1076: 0x6c61, 0x1077: 0x6c91, 0x1078: 0x6cc1, 0x1079: 0x6cf1, 0x107a: 0x6d21, 0x107b: 0x6d51, - 0x107c: 0x6d81, 0x107d: 0x6db1, 0x107e: 0x6de1, 0x107f: 0x440d, - // Block 0x42, offset 0x1080 - 0x1080: 0xe00d, 0x1081: 0x0008, 0x1082: 0xe00d, 0x1083: 0x0008, 0x1084: 0xe00d, 0x1085: 0x0008, - 0x1086: 0xe00d, 0x1087: 0x0008, 0x1088: 0xe00d, 0x1089: 0x0008, 0x108a: 0xe00d, 0x108b: 0x0008, - 0x108c: 0xe00d, 0x108d: 0x0008, 0x108e: 0xe00d, 0x108f: 0x0008, 0x1090: 0xe00d, 0x1091: 0x0008, - 0x1092: 0xe00d, 0x1093: 0x0008, 0x1094: 0xe00d, 0x1095: 0x0008, 0x1096: 0xe00d, 0x1097: 0x0008, - 0x1098: 0xe00d, 0x1099: 0x0008, 0x109a: 0xe00d, 0x109b: 0x0008, 0x109c: 0xe00d, 0x109d: 0x0008, - 0x109e: 0xe00d, 0x109f: 0x0008, 0x10a0: 0xe00d, 0x10a1: 0x0008, 0x10a2: 0xe00d, 0x10a3: 0x0008, - 0x10a4: 0xe00d, 0x10a5: 0x0008, 0x10a6: 0xe00d, 0x10a7: 0x0008, 0x10a8: 0xe00d, 0x10a9: 0x0008, - 0x10aa: 0xe00d, 0x10ab: 0x0008, 0x10ac: 0xe00d, 0x10ad: 0x0008, 0x10ae: 0x0008, 0x10af: 0x1308, - 0x10b0: 0x1318, 0x10b1: 0x1318, 0x10b2: 0x1318, 0x10b3: 0x0018, 0x10b4: 0x1308, 0x10b5: 0x1308, - 0x10b6: 0x1308, 0x10b7: 0x1308, 0x10b8: 0x1308, 0x10b9: 0x1308, 0x10ba: 0x1308, 0x10bb: 0x1308, - 0x10bc: 0x1308, 0x10bd: 0x1308, 0x10be: 0x0018, 0x10bf: 0x0008, - // Block 0x43, offset 0x10c0 - 0x10c0: 0xe00d, 0x10c1: 0x0008, 0x10c2: 0xe00d, 0x10c3: 0x0008, 0x10c4: 0xe00d, 0x10c5: 0x0008, - 0x10c6: 0xe00d, 0x10c7: 0x0008, 0x10c8: 0xe00d, 0x10c9: 0x0008, 0x10ca: 0xe00d, 0x10cb: 0x0008, - 0x10cc: 0xe00d, 0x10cd: 0x0008, 0x10ce: 0xe00d, 0x10cf: 0x0008, 0x10d0: 0xe00d, 0x10d1: 0x0008, - 0x10d2: 0xe00d, 0x10d3: 0x0008, 0x10d4: 0xe00d, 0x10d5: 0x0008, 0x10d6: 0xe00d, 0x10d7: 0x0008, - 0x10d8: 0xe00d, 0x10d9: 0x0008, 0x10da: 0xe00d, 0x10db: 0x0008, 0x10dc: 0x0ea1, 0x10dd: 0x6e11, - 0x10de: 0x1308, 0x10df: 0x1308, 0x10e0: 0x0008, 0x10e1: 0x0008, 0x10e2: 0x0008, 0x10e3: 0x0008, - 0x10e4: 0x0008, 0x10e5: 0x0008, 0x10e6: 0x0008, 0x10e7: 0x0008, 0x10e8: 0x0008, 0x10e9: 0x0008, - 0x10ea: 0x0008, 0x10eb: 0x0008, 0x10ec: 0x0008, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x0008, - 0x10f0: 0x0008, 0x10f1: 0x0008, 0x10f2: 0x0008, 0x10f3: 0x0008, 0x10f4: 0x0008, 0x10f5: 0x0008, - 0x10f6: 0x0008, 0x10f7: 0x0008, 0x10f8: 0x0008, 0x10f9: 0x0008, 0x10fa: 0x0008, 0x10fb: 0x0008, - 0x10fc: 0x0008, 0x10fd: 0x0008, 0x10fe: 0x0008, 0x10ff: 0x0008, - // Block 0x44, offset 0x1100 - 0x1100: 0x0018, 0x1101: 0x0018, 0x1102: 0x0018, 0x1103: 0x0018, 0x1104: 0x0018, 0x1105: 0x0018, - 0x1106: 0x0018, 0x1107: 0x0018, 0x1108: 0x0018, 0x1109: 0x0018, 0x110a: 0x0018, 0x110b: 0x0018, - 0x110c: 0x0018, 0x110d: 0x0018, 0x110e: 0x0018, 0x110f: 0x0018, 0x1110: 0x0018, 0x1111: 0x0018, - 0x1112: 0x0018, 0x1113: 0x0018, 0x1114: 0x0018, 0x1115: 0x0018, 0x1116: 0x0018, 0x1117: 0x0008, - 0x1118: 0x0008, 0x1119: 0x0008, 0x111a: 0x0008, 0x111b: 0x0008, 0x111c: 0x0008, 0x111d: 0x0008, - 0x111e: 0x0008, 0x111f: 0x0008, 0x1120: 0x0018, 0x1121: 0x0018, 0x1122: 0xe00d, 0x1123: 0x0008, - 0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008, - 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0xe00d, 0x112f: 0x0008, - 0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0xe00d, 0x1133: 0x0008, 0x1134: 0xe00d, 0x1135: 0x0008, - 0x1136: 0xe00d, 0x1137: 0x0008, 0x1138: 0xe00d, 0x1139: 0x0008, 0x113a: 0xe00d, 0x113b: 0x0008, - 0x113c: 0xe00d, 0x113d: 0x0008, 0x113e: 0xe00d, 0x113f: 0x0008, - // Block 0x45, offset 0x1140 - 0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008, - 0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008, - 0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008, - 0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008, - 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0xe00d, 0x115d: 0x0008, - 0x115e: 0xe00d, 0x115f: 0x0008, 0x1160: 0xe00d, 0x1161: 0x0008, 0x1162: 0xe00d, 0x1163: 0x0008, - 0x1164: 0xe00d, 0x1165: 0x0008, 0x1166: 0xe00d, 0x1167: 0x0008, 0x1168: 0xe00d, 0x1169: 0x0008, - 0x116a: 0xe00d, 0x116b: 0x0008, 0x116c: 0xe00d, 0x116d: 0x0008, 0x116e: 0xe00d, 0x116f: 0x0008, - 0x1170: 0xe0fd, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, - 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0xe01d, 0x117a: 0x0008, 0x117b: 0xe03d, - 0x117c: 0x0008, 0x117d: 0x442d, 0x117e: 0xe00d, 0x117f: 0x0008, - // Block 0x46, offset 0x1180 - 0x1180: 0xe00d, 0x1181: 0x0008, 0x1182: 0xe00d, 0x1183: 0x0008, 0x1184: 0xe00d, 0x1185: 0x0008, - 0x1186: 0xe00d, 0x1187: 0x0008, 0x1188: 0x0008, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0xe03d, - 0x118c: 0x0008, 0x118d: 0x11d9, 0x118e: 0x0008, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008, - 0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0x0008, 0x1195: 0x0008, 0x1196: 0xe00d, 0x1197: 0x0008, - 0x1198: 0xe00d, 0x1199: 0x0008, 0x119a: 0xe00d, 0x119b: 0x0008, 0x119c: 0xe00d, 0x119d: 0x0008, - 0x119e: 0xe00d, 0x119f: 0x0008, 0x11a0: 0xe00d, 0x11a1: 0x0008, 0x11a2: 0xe00d, 0x11a3: 0x0008, - 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, - 0x11aa: 0x6e29, 0x11ab: 0x1029, 0x11ac: 0x11c1, 0x11ad: 0x6e41, 0x11ae: 0x1221, 0x11af: 0x0040, - 0x11b0: 0x6e59, 0x11b1: 0x6e71, 0x11b2: 0x1239, 0x11b3: 0x444d, 0x11b4: 0xe00d, 0x11b5: 0x0008, - 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0x0040, 0x11b9: 0x0040, 0x11ba: 0x0040, 0x11bb: 0x0040, - 0x11bc: 0x0040, 0x11bd: 0x0040, 0x11be: 0x0040, 0x11bf: 0x0040, - // Block 0x47, offset 0x11c0 - 0x11c0: 0x64d5, 0x11c1: 0x64f5, 0x11c2: 0x6515, 0x11c3: 0x6535, 0x11c4: 0x6555, 0x11c5: 0x6575, - 0x11c6: 0x6595, 0x11c7: 0x65b5, 0x11c8: 0x65d5, 0x11c9: 0x65f5, 0x11ca: 0x6615, 0x11cb: 0x6635, - 0x11cc: 0x6655, 0x11cd: 0x6675, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0x6695, 0x11d1: 0x0008, - 0x11d2: 0x66b5, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x66d5, 0x11d6: 0x66f5, 0x11d7: 0x6715, - 0x11d8: 0x6735, 0x11d9: 0x6755, 0x11da: 0x6775, 0x11db: 0x6795, 0x11dc: 0x67b5, 0x11dd: 0x67d5, - 0x11de: 0x67f5, 0x11df: 0x0008, 0x11e0: 0x6815, 0x11e1: 0x0008, 0x11e2: 0x6835, 0x11e3: 0x0008, - 0x11e4: 0x0008, 0x11e5: 0x6855, 0x11e6: 0x6875, 0x11e7: 0x0008, 0x11e8: 0x0008, 0x11e9: 0x0008, - 0x11ea: 0x6895, 0x11eb: 0x68b5, 0x11ec: 0x68d5, 0x11ed: 0x68f5, 0x11ee: 0x6915, 0x11ef: 0x6935, - 0x11f0: 0x6955, 0x11f1: 0x6975, 0x11f2: 0x6995, 0x11f3: 0x69b5, 0x11f4: 0x69d5, 0x11f5: 0x69f5, - 0x11f6: 0x6a15, 0x11f7: 0x6a35, 0x11f8: 0x6a55, 0x11f9: 0x6a75, 0x11fa: 0x6a95, 0x11fb: 0x6ab5, - 0x11fc: 0x6ad5, 0x11fd: 0x6af5, 0x11fe: 0x6b15, 0x11ff: 0x6b35, - // Block 0x48, offset 0x1200 - 0x1200: 0x7a95, 0x1201: 0x7ab5, 0x1202: 0x7ad5, 0x1203: 0x7af5, 0x1204: 0x7b15, 0x1205: 0x7b35, - 0x1206: 0x7b55, 0x1207: 0x7b75, 0x1208: 0x7b95, 0x1209: 0x7bb5, 0x120a: 0x7bd5, 0x120b: 0x7bf5, - 0x120c: 0x7c15, 0x120d: 0x7c35, 0x120e: 0x7c55, 0x120f: 0x6ec9, 0x1210: 0x6ef1, 0x1211: 0x6f19, - 0x1212: 0x7c75, 0x1213: 0x7c95, 0x1214: 0x7cb5, 0x1215: 0x6f41, 0x1216: 0x6f69, 0x1217: 0x6f91, - 0x1218: 0x7cd5, 0x1219: 0x7cf5, 0x121a: 0x0040, 0x121b: 0x0040, 0x121c: 0x0040, 0x121d: 0x0040, - 0x121e: 0x0040, 0x121f: 0x0040, 0x1220: 0x0040, 0x1221: 0x0040, 0x1222: 0x0040, 0x1223: 0x0040, - 0x1224: 0x0040, 0x1225: 0x0040, 0x1226: 0x0040, 0x1227: 0x0040, 0x1228: 0x0040, 0x1229: 0x0040, - 0x122a: 0x0040, 0x122b: 0x0040, 0x122c: 0x0040, 0x122d: 0x0040, 0x122e: 0x0040, 0x122f: 0x0040, - 0x1230: 0x0040, 0x1231: 0x0040, 0x1232: 0x0040, 0x1233: 0x0040, 0x1234: 0x0040, 0x1235: 0x0040, - 0x1236: 0x0040, 0x1237: 0x0040, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040, - 0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040, - // Block 0x49, offset 0x1240 - 0x1240: 0x6fb9, 0x1241: 0x6fd1, 0x1242: 0x6fe9, 0x1243: 0x7d15, 0x1244: 0x7d35, 0x1245: 0x7001, - 0x1246: 0x7001, 0x1247: 0x0040, 0x1248: 0x0040, 0x1249: 0x0040, 0x124a: 0x0040, 0x124b: 0x0040, - 0x124c: 0x0040, 0x124d: 0x0040, 0x124e: 0x0040, 0x124f: 0x0040, 0x1250: 0x0040, 0x1251: 0x0040, - 0x1252: 0x0040, 0x1253: 0x7019, 0x1254: 0x7041, 0x1255: 0x7069, 0x1256: 0x7091, 0x1257: 0x70b9, - 0x1258: 0x0040, 0x1259: 0x0040, 0x125a: 0x0040, 0x125b: 0x0040, 0x125c: 0x0040, 0x125d: 0x70e1, - 0x125e: 0x1308, 0x125f: 0x7109, 0x1260: 0x7131, 0x1261: 0x20a9, 0x1262: 0x20f1, 0x1263: 0x7149, - 0x1264: 0x7161, 0x1265: 0x7179, 0x1266: 0x7191, 0x1267: 0x71a9, 0x1268: 0x71c1, 0x1269: 0x1fb2, - 0x126a: 0x71d9, 0x126b: 0x7201, 0x126c: 0x7229, 0x126d: 0x7261, 0x126e: 0x7299, 0x126f: 0x72c1, - 0x1270: 0x72e9, 0x1271: 0x7311, 0x1272: 0x7339, 0x1273: 0x7361, 0x1274: 0x7389, 0x1275: 0x73b1, - 0x1276: 0x73d9, 0x1277: 0x0040, 0x1278: 0x7401, 0x1279: 0x7429, 0x127a: 0x7451, 0x127b: 0x7479, - 0x127c: 0x74a1, 0x127d: 0x0040, 0x127e: 0x74c9, 0x127f: 0x0040, - // Block 0x4a, offset 0x1280 - 0x1280: 0x74f1, 0x1281: 0x7519, 0x1282: 0x0040, 0x1283: 0x7541, 0x1284: 0x7569, 0x1285: 0x0040, - 0x1286: 0x7591, 0x1287: 0x75b9, 0x1288: 0x75e1, 0x1289: 0x7609, 0x128a: 0x7631, 0x128b: 0x7659, - 0x128c: 0x7681, 0x128d: 0x76a9, 0x128e: 0x76d1, 0x128f: 0x76f9, 0x1290: 0x7721, 0x1291: 0x7721, - 0x1292: 0x7739, 0x1293: 0x7739, 0x1294: 0x7739, 0x1295: 0x7739, 0x1296: 0x7751, 0x1297: 0x7751, - 0x1298: 0x7751, 0x1299: 0x7751, 0x129a: 0x7769, 0x129b: 0x7769, 0x129c: 0x7769, 0x129d: 0x7769, - 0x129e: 0x7781, 0x129f: 0x7781, 0x12a0: 0x7781, 0x12a1: 0x7781, 0x12a2: 0x7799, 0x12a3: 0x7799, - 0x12a4: 0x7799, 0x12a5: 0x7799, 0x12a6: 0x77b1, 0x12a7: 0x77b1, 0x12a8: 0x77b1, 0x12a9: 0x77b1, - 0x12aa: 0x77c9, 0x12ab: 0x77c9, 0x12ac: 0x77c9, 0x12ad: 0x77c9, 0x12ae: 0x77e1, 0x12af: 0x77e1, - 0x12b0: 0x77e1, 0x12b1: 0x77e1, 0x12b2: 0x77f9, 0x12b3: 0x77f9, 0x12b4: 0x77f9, 0x12b5: 0x77f9, - 0x12b6: 0x7811, 0x12b7: 0x7811, 0x12b8: 0x7811, 0x12b9: 0x7811, 0x12ba: 0x7829, 0x12bb: 0x7829, - 0x12bc: 0x7829, 0x12bd: 0x7829, 0x12be: 0x7841, 0x12bf: 0x7841, - // Block 0x4b, offset 0x12c0 - 0x12c0: 0x7841, 0x12c1: 0x7841, 0x12c2: 0x7859, 0x12c3: 0x7859, 0x12c4: 0x7871, 0x12c5: 0x7871, - 0x12c6: 0x7889, 0x12c7: 0x7889, 0x12c8: 0x78a1, 0x12c9: 0x78a1, 0x12ca: 0x78b9, 0x12cb: 0x78b9, - 0x12cc: 0x78d1, 0x12cd: 0x78d1, 0x12ce: 0x78e9, 0x12cf: 0x78e9, 0x12d0: 0x78e9, 0x12d1: 0x78e9, - 0x12d2: 0x7901, 0x12d3: 0x7901, 0x12d4: 0x7901, 0x12d5: 0x7901, 0x12d6: 0x7919, 0x12d7: 0x7919, - 0x12d8: 0x7919, 0x12d9: 0x7919, 0x12da: 0x7931, 0x12db: 0x7931, 0x12dc: 0x7931, 0x12dd: 0x7931, - 0x12de: 0x7949, 0x12df: 0x7949, 0x12e0: 0x7961, 0x12e1: 0x7961, 0x12e2: 0x7961, 0x12e3: 0x7961, - 0x12e4: 0x7979, 0x12e5: 0x7979, 0x12e6: 0x7991, 0x12e7: 0x7991, 0x12e8: 0x7991, 0x12e9: 0x7991, - 0x12ea: 0x79a9, 0x12eb: 0x79a9, 0x12ec: 0x79a9, 0x12ed: 0x79a9, 0x12ee: 0x79c1, 0x12ef: 0x79c1, - 0x12f0: 0x79d9, 0x12f1: 0x79d9, 0x12f2: 0x0018, 0x12f3: 0x0018, 0x12f4: 0x0018, 0x12f5: 0x0018, - 0x12f6: 0x0018, 0x12f7: 0x0018, 0x12f8: 0x0018, 0x12f9: 0x0018, 0x12fa: 0x0018, 0x12fb: 0x0018, - 0x12fc: 0x0018, 0x12fd: 0x0018, 0x12fe: 0x0018, 0x12ff: 0x0018, - // Block 0x4c, offset 0x1300 - 0x1300: 0x0018, 0x1301: 0x0018, 0x1302: 0x0040, 0x1303: 0x0040, 0x1304: 0x0040, 0x1305: 0x0040, - 0x1306: 0x0040, 0x1307: 0x0040, 0x1308: 0x0040, 0x1309: 0x0040, 0x130a: 0x0040, 0x130b: 0x0040, - 0x130c: 0x0040, 0x130d: 0x0040, 0x130e: 0x0040, 0x130f: 0x0040, 0x1310: 0x0040, 0x1311: 0x0040, - 0x1312: 0x0040, 0x1313: 0x79f1, 0x1314: 0x79f1, 0x1315: 0x79f1, 0x1316: 0x79f1, 0x1317: 0x7a09, - 0x1318: 0x7a09, 0x1319: 0x7a21, 0x131a: 0x7a21, 0x131b: 0x7a39, 0x131c: 0x7a39, 0x131d: 0x0479, - 0x131e: 0x7a51, 0x131f: 0x7a51, 0x1320: 0x7a69, 0x1321: 0x7a69, 0x1322: 0x7a81, 0x1323: 0x7a81, - 0x1324: 0x7a99, 0x1325: 0x7a99, 0x1326: 0x7a99, 0x1327: 0x7a99, 0x1328: 0x7ab1, 0x1329: 0x7ab1, - 0x132a: 0x7ac9, 0x132b: 0x7ac9, 0x132c: 0x7af1, 0x132d: 0x7af1, 0x132e: 0x7b19, 0x132f: 0x7b19, - 0x1330: 0x7b41, 0x1331: 0x7b41, 0x1332: 0x7b69, 0x1333: 0x7b69, 0x1334: 0x7b91, 0x1335: 0x7b91, - 0x1336: 0x7bb9, 0x1337: 0x7bb9, 0x1338: 0x7bb9, 0x1339: 0x7be1, 0x133a: 0x7be1, 0x133b: 0x7be1, - 0x133c: 0x7c09, 0x133d: 0x7c09, 0x133e: 0x7c09, 0x133f: 0x7c09, - // Block 0x4d, offset 0x1340 - 0x1340: 0x85f9, 0x1341: 0x8621, 0x1342: 0x8649, 0x1343: 0x8671, 0x1344: 0x8699, 0x1345: 0x86c1, - 0x1346: 0x86e9, 0x1347: 0x8711, 0x1348: 0x8739, 0x1349: 0x8761, 0x134a: 0x8789, 0x134b: 0x87b1, - 0x134c: 0x87d9, 0x134d: 0x8801, 0x134e: 0x8829, 0x134f: 0x8851, 0x1350: 0x8879, 0x1351: 0x88a1, - 0x1352: 0x88c9, 0x1353: 0x88f1, 0x1354: 0x8919, 0x1355: 0x8941, 0x1356: 0x8969, 0x1357: 0x8991, - 0x1358: 0x89b9, 0x1359: 0x89e1, 0x135a: 0x8a09, 0x135b: 0x8a31, 0x135c: 0x8a59, 0x135d: 0x8a81, - 0x135e: 0x8aaa, 0x135f: 0x8ada, 0x1360: 0x8b0a, 0x1361: 0x8b3a, 0x1362: 0x8b6a, 0x1363: 0x8b9a, - 0x1364: 0x8bc9, 0x1365: 0x8bf1, 0x1366: 0x7c71, 0x1367: 0x8c19, 0x1368: 0x7be1, 0x1369: 0x7c99, - 0x136a: 0x8c41, 0x136b: 0x8c69, 0x136c: 0x7d39, 0x136d: 0x8c91, 0x136e: 0x7d61, 0x136f: 0x7d89, - 0x1370: 0x8cb9, 0x1371: 0x8ce1, 0x1372: 0x7e29, 0x1373: 0x8d09, 0x1374: 0x7e51, 0x1375: 0x7e79, - 0x1376: 0x8d31, 0x1377: 0x8d59, 0x1378: 0x7ec9, 0x1379: 0x8d81, 0x137a: 0x7ef1, 0x137b: 0x7f19, - 0x137c: 0x83a1, 0x137d: 0x83c9, 0x137e: 0x8441, 0x137f: 0x8469, - // Block 0x4e, offset 0x1380 - 0x1380: 0x8491, 0x1381: 0x8531, 0x1382: 0x8559, 0x1383: 0x8581, 0x1384: 0x85a9, 0x1385: 0x8649, - 0x1386: 0x8671, 0x1387: 0x8699, 0x1388: 0x8da9, 0x1389: 0x8739, 0x138a: 0x8dd1, 0x138b: 0x8df9, - 0x138c: 0x8829, 0x138d: 0x8e21, 0x138e: 0x8851, 0x138f: 0x8879, 0x1390: 0x8a81, 0x1391: 0x8e49, - 0x1392: 0x8e71, 0x1393: 0x89b9, 0x1394: 0x8e99, 0x1395: 0x89e1, 0x1396: 0x8a09, 0x1397: 0x7c21, - 0x1398: 0x7c49, 0x1399: 0x8ec1, 0x139a: 0x7c71, 0x139b: 0x8ee9, 0x139c: 0x7cc1, 0x139d: 0x7ce9, - 0x139e: 0x7d11, 0x139f: 0x7d39, 0x13a0: 0x8f11, 0x13a1: 0x7db1, 0x13a2: 0x7dd9, 0x13a3: 0x7e01, - 0x13a4: 0x7e29, 0x13a5: 0x8f39, 0x13a6: 0x7ec9, 0x13a7: 0x7f41, 0x13a8: 0x7f69, 0x13a9: 0x7f91, - 0x13aa: 0x7fb9, 0x13ab: 0x7fe1, 0x13ac: 0x8031, 0x13ad: 0x8059, 0x13ae: 0x8081, 0x13af: 0x80a9, - 0x13b0: 0x80d1, 0x13b1: 0x80f9, 0x13b2: 0x8f61, 0x13b3: 0x8121, 0x13b4: 0x8149, 0x13b5: 0x8171, - 0x13b6: 0x8199, 0x13b7: 0x81c1, 0x13b8: 0x81e9, 0x13b9: 0x8239, 0x13ba: 0x8261, 0x13bb: 0x8289, - 0x13bc: 0x82b1, 0x13bd: 0x82d9, 0x13be: 0x8301, 0x13bf: 0x8329, - // Block 0x4f, offset 0x13c0 - 0x13c0: 0x8351, 0x13c1: 0x8379, 0x13c2: 0x83f1, 0x13c3: 0x8419, 0x13c4: 0x84b9, 0x13c5: 0x84e1, - 0x13c6: 0x8509, 0x13c7: 0x8531, 0x13c8: 0x8559, 0x13c9: 0x85d1, 0x13ca: 0x85f9, 0x13cb: 0x8621, - 0x13cc: 0x8649, 0x13cd: 0x8f89, 0x13ce: 0x86c1, 0x13cf: 0x86e9, 0x13d0: 0x8711, 0x13d1: 0x8739, - 0x13d2: 0x87b1, 0x13d3: 0x87d9, 0x13d4: 0x8801, 0x13d5: 0x8829, 0x13d6: 0x8fb1, 0x13d7: 0x88a1, - 0x13d8: 0x88c9, 0x13d9: 0x8fd9, 0x13da: 0x8941, 0x13db: 0x8969, 0x13dc: 0x8991, 0x13dd: 0x89b9, - 0x13de: 0x9001, 0x13df: 0x7c71, 0x13e0: 0x8ee9, 0x13e1: 0x7d39, 0x13e2: 0x8f11, 0x13e3: 0x7e29, - 0x13e4: 0x8f39, 0x13e5: 0x7ec9, 0x13e6: 0x9029, 0x13e7: 0x80d1, 0x13e8: 0x9051, 0x13e9: 0x9079, - 0x13ea: 0x90a1, 0x13eb: 0x8531, 0x13ec: 0x8559, 0x13ed: 0x8649, 0x13ee: 0x8829, 0x13ef: 0x8fb1, - 0x13f0: 0x89b9, 0x13f1: 0x9001, 0x13f2: 0x90c9, 0x13f3: 0x9101, 0x13f4: 0x9139, 0x13f5: 0x9171, - 0x13f6: 0x9199, 0x13f7: 0x91c1, 0x13f8: 0x91e9, 0x13f9: 0x9211, 0x13fa: 0x9239, 0x13fb: 0x9261, - 0x13fc: 0x9289, 0x13fd: 0x92b1, 0x13fe: 0x92d9, 0x13ff: 0x9301, - // Block 0x50, offset 0x1400 - 0x1400: 0x9329, 0x1401: 0x9351, 0x1402: 0x9379, 0x1403: 0x93a1, 0x1404: 0x93c9, 0x1405: 0x93f1, - 0x1406: 0x9419, 0x1407: 0x9441, 0x1408: 0x9469, 0x1409: 0x9491, 0x140a: 0x94b9, 0x140b: 0x94e1, - 0x140c: 0x9079, 0x140d: 0x9509, 0x140e: 0x9531, 0x140f: 0x9559, 0x1410: 0x9581, 0x1411: 0x9171, - 0x1412: 0x9199, 0x1413: 0x91c1, 0x1414: 0x91e9, 0x1415: 0x9211, 0x1416: 0x9239, 0x1417: 0x9261, - 0x1418: 0x9289, 0x1419: 0x92b1, 0x141a: 0x92d9, 0x141b: 0x9301, 0x141c: 0x9329, 0x141d: 0x9351, - 0x141e: 0x9379, 0x141f: 0x93a1, 0x1420: 0x93c9, 0x1421: 0x93f1, 0x1422: 0x9419, 0x1423: 0x9441, - 0x1424: 0x9469, 0x1425: 0x9491, 0x1426: 0x94b9, 0x1427: 0x94e1, 0x1428: 0x9079, 0x1429: 0x9509, - 0x142a: 0x9531, 0x142b: 0x9559, 0x142c: 0x9581, 0x142d: 0x9491, 0x142e: 0x94b9, 0x142f: 0x94e1, - 0x1430: 0x9079, 0x1431: 0x9051, 0x1432: 0x90a1, 0x1433: 0x8211, 0x1434: 0x8059, 0x1435: 0x8081, - 0x1436: 0x80a9, 0x1437: 0x9491, 0x1438: 0x94b9, 0x1439: 0x94e1, 0x143a: 0x8211, 0x143b: 0x8239, - 0x143c: 0x95a9, 0x143d: 0x95a9, 0x143e: 0x0018, 0x143f: 0x0018, - // Block 0x51, offset 0x1440 - 0x1440: 0x0040, 0x1441: 0x0040, 0x1442: 0x0040, 0x1443: 0x0040, 0x1444: 0x0040, 0x1445: 0x0040, - 0x1446: 0x0040, 0x1447: 0x0040, 0x1448: 0x0040, 0x1449: 0x0040, 0x144a: 0x0040, 0x144b: 0x0040, - 0x144c: 0x0040, 0x144d: 0x0040, 0x144e: 0x0040, 0x144f: 0x0040, 0x1450: 0x95d1, 0x1451: 0x9609, - 0x1452: 0x9609, 0x1453: 0x9641, 0x1454: 0x9679, 0x1455: 0x96b1, 0x1456: 0x96e9, 0x1457: 0x9721, - 0x1458: 0x9759, 0x1459: 0x9759, 0x145a: 0x9791, 0x145b: 0x97c9, 0x145c: 0x9801, 0x145d: 0x9839, - 0x145e: 0x9871, 0x145f: 0x98a9, 0x1460: 0x98a9, 0x1461: 0x98e1, 0x1462: 0x9919, 0x1463: 0x9919, - 0x1464: 0x9951, 0x1465: 0x9951, 0x1466: 0x9989, 0x1467: 0x99c1, 0x1468: 0x99c1, 0x1469: 0x99f9, - 0x146a: 0x9a31, 0x146b: 0x9a31, 0x146c: 0x9a69, 0x146d: 0x9a69, 0x146e: 0x9aa1, 0x146f: 0x9ad9, - 0x1470: 0x9ad9, 0x1471: 0x9b11, 0x1472: 0x9b11, 0x1473: 0x9b49, 0x1474: 0x9b81, 0x1475: 0x9bb9, - 0x1476: 0x9bf1, 0x1477: 0x9bf1, 0x1478: 0x9c29, 0x1479: 0x9c61, 0x147a: 0x9c99, 0x147b: 0x9cd1, - 0x147c: 0x9d09, 0x147d: 0x9d09, 0x147e: 0x9d41, 0x147f: 0x9d79, - // Block 0x52, offset 0x1480 - 0x1480: 0xa949, 0x1481: 0xa981, 0x1482: 0xa9b9, 0x1483: 0xa8a1, 0x1484: 0x9bb9, 0x1485: 0x9989, - 0x1486: 0xa9f1, 0x1487: 0xaa29, 0x1488: 0x0040, 0x1489: 0x0040, 0x148a: 0x0040, 0x148b: 0x0040, - 0x148c: 0x0040, 0x148d: 0x0040, 0x148e: 0x0040, 0x148f: 0x0040, 0x1490: 0x0040, 0x1491: 0x0040, - 0x1492: 0x0040, 0x1493: 0x0040, 0x1494: 0x0040, 0x1495: 0x0040, 0x1496: 0x0040, 0x1497: 0x0040, - 0x1498: 0x0040, 0x1499: 0x0040, 0x149a: 0x0040, 0x149b: 0x0040, 0x149c: 0x0040, 0x149d: 0x0040, - 0x149e: 0x0040, 0x149f: 0x0040, 0x14a0: 0x0040, 0x14a1: 0x0040, 0x14a2: 0x0040, 0x14a3: 0x0040, - 0x14a4: 0x0040, 0x14a5: 0x0040, 0x14a6: 0x0040, 0x14a7: 0x0040, 0x14a8: 0x0040, 0x14a9: 0x0040, - 0x14aa: 0x0040, 0x14ab: 0x0040, 0x14ac: 0x0040, 0x14ad: 0x0040, 0x14ae: 0x0040, 0x14af: 0x0040, - 0x14b0: 0xaa61, 0x14b1: 0xaa99, 0x14b2: 0xaad1, 0x14b3: 0xab19, 0x14b4: 0xab61, 0x14b5: 0xaba9, - 0x14b6: 0xabf1, 0x14b7: 0xac39, 0x14b8: 0xac81, 0x14b9: 0xacc9, 0x14ba: 0xad02, 0x14bb: 0xae12, - 0x14bc: 0xae91, 0x14bd: 0x0018, 0x14be: 0x0040, 0x14bf: 0x0040, - // Block 0x53, offset 0x14c0 - 0x14c0: 0x13c0, 0x14c1: 0x13c0, 0x14c2: 0x13c0, 0x14c3: 0x13c0, 0x14c4: 0x13c0, 0x14c5: 0x13c0, - 0x14c6: 0x13c0, 0x14c7: 0x13c0, 0x14c8: 0x13c0, 0x14c9: 0x13c0, 0x14ca: 0x13c0, 0x14cb: 0x13c0, - 0x14cc: 0x13c0, 0x14cd: 0x13c0, 0x14ce: 0x13c0, 0x14cf: 0x13c0, 0x14d0: 0xaeda, 0x14d1: 0x7d55, - 0x14d2: 0x0040, 0x14d3: 0xaeea, 0x14d4: 0x03c2, 0x14d5: 0xaefa, 0x14d6: 0xaf0a, 0x14d7: 0x7d75, - 0x14d8: 0x7d95, 0x14d9: 0x0040, 0x14da: 0x0040, 0x14db: 0x0040, 0x14dc: 0x0040, 0x14dd: 0x0040, - 0x14de: 0x0040, 0x14df: 0x0040, 0x14e0: 0x1308, 0x14e1: 0x1308, 0x14e2: 0x1308, 0x14e3: 0x1308, - 0x14e4: 0x1308, 0x14e5: 0x1308, 0x14e6: 0x1308, 0x14e7: 0x1308, 0x14e8: 0x1308, 0x14e9: 0x1308, - 0x14ea: 0x1308, 0x14eb: 0x1308, 0x14ec: 0x1308, 0x14ed: 0x1308, 0x14ee: 0x1308, 0x14ef: 0x1308, - 0x14f0: 0x0040, 0x14f1: 0x7db5, 0x14f2: 0x7dd5, 0x14f3: 0xaf1a, 0x14f4: 0xaf1a, 0x14f5: 0x1fd2, - 0x14f6: 0x1fe2, 0x14f7: 0xaf2a, 0x14f8: 0xaf3a, 0x14f9: 0x7df5, 0x14fa: 0x7e15, 0x14fb: 0x7e35, - 0x14fc: 0x7df5, 0x14fd: 0x7e55, 0x14fe: 0x7e75, 0x14ff: 0x7e55, - // Block 0x54, offset 0x1500 - 0x1500: 0x7e95, 0x1501: 0x7eb5, 0x1502: 0x7ed5, 0x1503: 0x7eb5, 0x1504: 0x7ef5, 0x1505: 0x0018, - 0x1506: 0x0018, 0x1507: 0xaf4a, 0x1508: 0xaf5a, 0x1509: 0x7f16, 0x150a: 0x7f36, 0x150b: 0x7f56, - 0x150c: 0x7f76, 0x150d: 0xaf1a, 0x150e: 0xaf1a, 0x150f: 0xaf1a, 0x1510: 0xaeda, 0x1511: 0x7f95, - 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x03c2, 0x1515: 0xaeea, 0x1516: 0xaf0a, 0x1517: 0xaefa, - 0x1518: 0x7fb5, 0x1519: 0x1fd2, 0x151a: 0x1fe2, 0x151b: 0xaf2a, 0x151c: 0xaf3a, 0x151d: 0x7e95, - 0x151e: 0x7ef5, 0x151f: 0xaf6a, 0x1520: 0xaf7a, 0x1521: 0xaf8a, 0x1522: 0x1fb2, 0x1523: 0xaf99, - 0x1524: 0xafaa, 0x1525: 0xafba, 0x1526: 0x1fc2, 0x1527: 0x0040, 0x1528: 0xafca, 0x1529: 0xafda, - 0x152a: 0xafea, 0x152b: 0xaffa, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, - 0x1530: 0x7fd6, 0x1531: 0xb009, 0x1532: 0x7ff6, 0x1533: 0x0008, 0x1534: 0x8016, 0x1535: 0x0040, - 0x1536: 0x8036, 0x1537: 0xb031, 0x1538: 0x8056, 0x1539: 0xb059, 0x153a: 0x8076, 0x153b: 0xb081, - 0x153c: 0x8096, 0x153d: 0xb0a9, 0x153e: 0x80b6, 0x153f: 0xb0d1, - // Block 0x55, offset 0x1540 - 0x1540: 0xb0f9, 0x1541: 0xb111, 0x1542: 0xb111, 0x1543: 0xb129, 0x1544: 0xb129, 0x1545: 0xb141, - 0x1546: 0xb141, 0x1547: 0xb159, 0x1548: 0xb159, 0x1549: 0xb171, 0x154a: 0xb171, 0x154b: 0xb171, - 0x154c: 0xb171, 0x154d: 0xb189, 0x154e: 0xb189, 0x154f: 0xb1a1, 0x1550: 0xb1a1, 0x1551: 0xb1a1, - 0x1552: 0xb1a1, 0x1553: 0xb1b9, 0x1554: 0xb1b9, 0x1555: 0xb1d1, 0x1556: 0xb1d1, 0x1557: 0xb1d1, - 0x1558: 0xb1d1, 0x1559: 0xb1e9, 0x155a: 0xb1e9, 0x155b: 0xb1e9, 0x155c: 0xb1e9, 0x155d: 0xb201, - 0x155e: 0xb201, 0x155f: 0xb201, 0x1560: 0xb201, 0x1561: 0xb219, 0x1562: 0xb219, 0x1563: 0xb219, - 0x1564: 0xb219, 0x1565: 0xb231, 0x1566: 0xb231, 0x1567: 0xb231, 0x1568: 0xb231, 0x1569: 0xb249, - 0x156a: 0xb249, 0x156b: 0xb261, 0x156c: 0xb261, 0x156d: 0xb279, 0x156e: 0xb279, 0x156f: 0xb291, - 0x1570: 0xb291, 0x1571: 0xb2a9, 0x1572: 0xb2a9, 0x1573: 0xb2a9, 0x1574: 0xb2a9, 0x1575: 0xb2c1, - 0x1576: 0xb2c1, 0x1577: 0xb2c1, 0x1578: 0xb2c1, 0x1579: 0xb2d9, 0x157a: 0xb2d9, 0x157b: 0xb2d9, - 0x157c: 0xb2d9, 0x157d: 0xb2f1, 0x157e: 0xb2f1, 0x157f: 0xb2f1, - // Block 0x56, offset 0x1580 - 0x1580: 0xb2f1, 0x1581: 0xb309, 0x1582: 0xb309, 0x1583: 0xb309, 0x1584: 0xb309, 0x1585: 0xb321, - 0x1586: 0xb321, 0x1587: 0xb321, 0x1588: 0xb321, 0x1589: 0xb339, 0x158a: 0xb339, 0x158b: 0xb339, - 0x158c: 0xb339, 0x158d: 0xb351, 0x158e: 0xb351, 0x158f: 0xb351, 0x1590: 0xb351, 0x1591: 0xb369, - 0x1592: 0xb369, 0x1593: 0xb369, 0x1594: 0xb369, 0x1595: 0xb381, 0x1596: 0xb381, 0x1597: 0xb381, - 0x1598: 0xb381, 0x1599: 0xb399, 0x159a: 0xb399, 0x159b: 0xb399, 0x159c: 0xb399, 0x159d: 0xb3b1, - 0x159e: 0xb3b1, 0x159f: 0xb3b1, 0x15a0: 0xb3b1, 0x15a1: 0xb3c9, 0x15a2: 0xb3c9, 0x15a3: 0xb3c9, - 0x15a4: 0xb3c9, 0x15a5: 0xb3e1, 0x15a6: 0xb3e1, 0x15a7: 0xb3e1, 0x15a8: 0xb3e1, 0x15a9: 0xb3f9, - 0x15aa: 0xb3f9, 0x15ab: 0xb3f9, 0x15ac: 0xb3f9, 0x15ad: 0xb411, 0x15ae: 0xb411, 0x15af: 0x7ab1, - 0x15b0: 0x7ab1, 0x15b1: 0xb429, 0x15b2: 0xb429, 0x15b3: 0xb429, 0x15b4: 0xb429, 0x15b5: 0xb441, - 0x15b6: 0xb441, 0x15b7: 0xb469, 0x15b8: 0xb469, 0x15b9: 0xb491, 0x15ba: 0xb491, 0x15bb: 0xb4b9, - 0x15bc: 0xb4b9, 0x15bd: 0x0040, 0x15be: 0x0040, 0x15bf: 0x03c0, - // Block 0x57, offset 0x15c0 - 0x15c0: 0x0040, 0x15c1: 0xaefa, 0x15c2: 0xb4e2, 0x15c3: 0xaf6a, 0x15c4: 0xafda, 0x15c5: 0xafea, - 0x15c6: 0xaf7a, 0x15c7: 0xb4f2, 0x15c8: 0x1fd2, 0x15c9: 0x1fe2, 0x15ca: 0xaf8a, 0x15cb: 0x1fb2, - 0x15cc: 0xaeda, 0x15cd: 0xaf99, 0x15ce: 0x29d1, 0x15cf: 0xb502, 0x15d0: 0x1f41, 0x15d1: 0x00c9, - 0x15d2: 0x0069, 0x15d3: 0x0079, 0x15d4: 0x1f51, 0x15d5: 0x1f61, 0x15d6: 0x1f71, 0x15d7: 0x1f81, - 0x15d8: 0x1f91, 0x15d9: 0x1fa1, 0x15da: 0xaeea, 0x15db: 0x03c2, 0x15dc: 0xafaa, 0x15dd: 0x1fc2, - 0x15de: 0xafba, 0x15df: 0xaf0a, 0x15e0: 0xaffa, 0x15e1: 0x0039, 0x15e2: 0x0ee9, 0x15e3: 0x1159, - 0x15e4: 0x0ef9, 0x15e5: 0x0f09, 0x15e6: 0x1199, 0x15e7: 0x0f31, 0x15e8: 0x0249, 0x15e9: 0x0f41, - 0x15ea: 0x0259, 0x15eb: 0x0f51, 0x15ec: 0x0359, 0x15ed: 0x0f61, 0x15ee: 0x0f71, 0x15ef: 0x00d9, - 0x15f0: 0x0f99, 0x15f1: 0x2039, 0x15f2: 0x0269, 0x15f3: 0x01d9, 0x15f4: 0x0fa9, 0x15f5: 0x0fb9, - 0x15f6: 0x1089, 0x15f7: 0x0279, 0x15f8: 0x0369, 0x15f9: 0x0289, 0x15fa: 0x13d1, 0x15fb: 0xaf4a, - 0x15fc: 0xafca, 0x15fd: 0xaf5a, 0x15fe: 0xb512, 0x15ff: 0xaf1a, - // Block 0x58, offset 0x1600 - 0x1600: 0x1caa, 0x1601: 0x0039, 0x1602: 0x0ee9, 0x1603: 0x1159, 0x1604: 0x0ef9, 0x1605: 0x0f09, - 0x1606: 0x1199, 0x1607: 0x0f31, 0x1608: 0x0249, 0x1609: 0x0f41, 0x160a: 0x0259, 0x160b: 0x0f51, - 0x160c: 0x0359, 0x160d: 0x0f61, 0x160e: 0x0f71, 0x160f: 0x00d9, 0x1610: 0x0f99, 0x1611: 0x2039, - 0x1612: 0x0269, 0x1613: 0x01d9, 0x1614: 0x0fa9, 0x1615: 0x0fb9, 0x1616: 0x1089, 0x1617: 0x0279, - 0x1618: 0x0369, 0x1619: 0x0289, 0x161a: 0x13d1, 0x161b: 0xaf2a, 0x161c: 0xb522, 0x161d: 0xaf3a, - 0x161e: 0xb532, 0x161f: 0x80d5, 0x1620: 0x80f5, 0x1621: 0x29d1, 0x1622: 0x8115, 0x1623: 0x8115, - 0x1624: 0x8135, 0x1625: 0x8155, 0x1626: 0x8175, 0x1627: 0x8195, 0x1628: 0x81b5, 0x1629: 0x81d5, - 0x162a: 0x81f5, 0x162b: 0x8215, 0x162c: 0x8235, 0x162d: 0x8255, 0x162e: 0x8275, 0x162f: 0x8295, - 0x1630: 0x82b5, 0x1631: 0x82d5, 0x1632: 0x82f5, 0x1633: 0x8315, 0x1634: 0x8335, 0x1635: 0x8355, - 0x1636: 0x8375, 0x1637: 0x8395, 0x1638: 0x83b5, 0x1639: 0x83d5, 0x163a: 0x83f5, 0x163b: 0x8415, - 0x163c: 0x81b5, 0x163d: 0x8435, 0x163e: 0x8455, 0x163f: 0x8215, - // Block 0x59, offset 0x1640 - 0x1640: 0x8475, 0x1641: 0x8495, 0x1642: 0x84b5, 0x1643: 0x84d5, 0x1644: 0x84f5, 0x1645: 0x8515, - 0x1646: 0x8535, 0x1647: 0x8555, 0x1648: 0x84d5, 0x1649: 0x8575, 0x164a: 0x84d5, 0x164b: 0x8595, - 0x164c: 0x8595, 0x164d: 0x85b5, 0x164e: 0x85b5, 0x164f: 0x85d5, 0x1650: 0x8515, 0x1651: 0x85f5, - 0x1652: 0x8615, 0x1653: 0x85f5, 0x1654: 0x8635, 0x1655: 0x8615, 0x1656: 0x8655, 0x1657: 0x8655, - 0x1658: 0x8675, 0x1659: 0x8675, 0x165a: 0x8695, 0x165b: 0x8695, 0x165c: 0x8615, 0x165d: 0x8115, - 0x165e: 0x86b5, 0x165f: 0x86d5, 0x1660: 0x0040, 0x1661: 0x86f5, 0x1662: 0x8715, 0x1663: 0x8735, - 0x1664: 0x8755, 0x1665: 0x8735, 0x1666: 0x8775, 0x1667: 0x8795, 0x1668: 0x87b5, 0x1669: 0x87b5, - 0x166a: 0x87d5, 0x166b: 0x87d5, 0x166c: 0x87f5, 0x166d: 0x87f5, 0x166e: 0x87d5, 0x166f: 0x87d5, - 0x1670: 0x8815, 0x1671: 0x8835, 0x1672: 0x8855, 0x1673: 0x8875, 0x1674: 0x8895, 0x1675: 0x88b5, - 0x1676: 0x88b5, 0x1677: 0x88b5, 0x1678: 0x88d5, 0x1679: 0x88d5, 0x167a: 0x88d5, 0x167b: 0x88d5, - 0x167c: 0x87b5, 0x167d: 0x87b5, 0x167e: 0x87b5, 0x167f: 0x0040, - // Block 0x5a, offset 0x1680 - 0x1680: 0x0040, 0x1681: 0x0040, 0x1682: 0x8715, 0x1683: 0x86f5, 0x1684: 0x88f5, 0x1685: 0x86f5, - 0x1686: 0x8715, 0x1687: 0x86f5, 0x1688: 0x0040, 0x1689: 0x0040, 0x168a: 0x8915, 0x168b: 0x8715, - 0x168c: 0x8935, 0x168d: 0x88f5, 0x168e: 0x8935, 0x168f: 0x8715, 0x1690: 0x0040, 0x1691: 0x0040, - 0x1692: 0x8955, 0x1693: 0x8975, 0x1694: 0x8875, 0x1695: 0x8935, 0x1696: 0x88f5, 0x1697: 0x8935, - 0x1698: 0x0040, 0x1699: 0x0040, 0x169a: 0x8995, 0x169b: 0x89b5, 0x169c: 0x8995, 0x169d: 0x0040, - 0x169e: 0x0040, 0x169f: 0x0040, 0x16a0: 0xb541, 0x16a1: 0xb559, 0x16a2: 0xb571, 0x16a3: 0x89d6, - 0x16a4: 0xb589, 0x16a5: 0xb5a1, 0x16a6: 0x89f5, 0x16a7: 0x0040, 0x16a8: 0x8a15, 0x16a9: 0x8a35, - 0x16aa: 0x8a55, 0x16ab: 0x8a35, 0x16ac: 0x8a75, 0x16ad: 0x8a95, 0x16ae: 0x8ab5, 0x16af: 0x0040, - 0x16b0: 0x0040, 0x16b1: 0x0040, 0x16b2: 0x0040, 0x16b3: 0x0040, 0x16b4: 0x0040, 0x16b5: 0x0040, - 0x16b6: 0x0040, 0x16b7: 0x0040, 0x16b8: 0x0040, 0x16b9: 0x0340, 0x16ba: 0x0340, 0x16bb: 0x0340, - 0x16bc: 0x0040, 0x16bd: 0x0040, 0x16be: 0x0040, 0x16bf: 0x0040, - // Block 0x5b, offset 0x16c0 - 0x16c0: 0x0208, 0x16c1: 0x0208, 0x16c2: 0x0208, 0x16c3: 0x0208, 0x16c4: 0x0208, 0x16c5: 0x0408, - 0x16c6: 0x0008, 0x16c7: 0x0408, 0x16c8: 0x0018, 0x16c9: 0x0408, 0x16ca: 0x0408, 0x16cb: 0x0008, - 0x16cc: 0x0008, 0x16cd: 0x0108, 0x16ce: 0x0408, 0x16cf: 0x0408, 0x16d0: 0x0408, 0x16d1: 0x0408, - 0x16d2: 0x0408, 0x16d3: 0x0208, 0x16d4: 0x0208, 0x16d5: 0x0208, 0x16d6: 0x0208, 0x16d7: 0x0108, - 0x16d8: 0x0208, 0x16d9: 0x0208, 0x16da: 0x0208, 0x16db: 0x0208, 0x16dc: 0x0208, 0x16dd: 0x0408, - 0x16de: 0x0208, 0x16df: 0x0208, 0x16e0: 0x0208, 0x16e1: 0x0408, 0x16e2: 0x0008, 0x16e3: 0x0008, - 0x16e4: 0x0408, 0x16e5: 0x1308, 0x16e6: 0x1308, 0x16e7: 0x0040, 0x16e8: 0x0040, 0x16e9: 0x0040, - 0x16ea: 0x0040, 0x16eb: 0x0218, 0x16ec: 0x0218, 0x16ed: 0x0218, 0x16ee: 0x0218, 0x16ef: 0x0418, - 0x16f0: 0x0018, 0x16f1: 0x0018, 0x16f2: 0x0018, 0x16f3: 0x0018, 0x16f4: 0x0018, 0x16f5: 0x0018, - 0x16f6: 0x0018, 0x16f7: 0x0040, 0x16f8: 0x0040, 0x16f9: 0x0040, 0x16fa: 0x0040, 0x16fb: 0x0040, - 0x16fc: 0x0040, 0x16fd: 0x0040, 0x16fe: 0x0040, 0x16ff: 0x0040, - // Block 0x5c, offset 0x1700 - 0x1700: 0x0208, 0x1701: 0x0408, 0x1702: 0x0208, 0x1703: 0x0408, 0x1704: 0x0408, 0x1705: 0x0408, - 0x1706: 0x0208, 0x1707: 0x0208, 0x1708: 0x0208, 0x1709: 0x0408, 0x170a: 0x0208, 0x170b: 0x0208, - 0x170c: 0x0408, 0x170d: 0x0208, 0x170e: 0x0408, 0x170f: 0x0408, 0x1710: 0x0208, 0x1711: 0x0408, - 0x1712: 0x0040, 0x1713: 0x0040, 0x1714: 0x0040, 0x1715: 0x0040, 0x1716: 0x0040, 0x1717: 0x0040, - 0x1718: 0x0040, 0x1719: 0x0018, 0x171a: 0x0018, 0x171b: 0x0018, 0x171c: 0x0018, 0x171d: 0x0040, - 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0x0040, 0x1721: 0x0040, 0x1722: 0x0040, 0x1723: 0x0040, - 0x1724: 0x0040, 0x1725: 0x0040, 0x1726: 0x0040, 0x1727: 0x0040, 0x1728: 0x0040, 0x1729: 0x0418, - 0x172a: 0x0418, 0x172b: 0x0418, 0x172c: 0x0418, 0x172d: 0x0218, 0x172e: 0x0218, 0x172f: 0x0018, - 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, - 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0040, 0x173a: 0x0040, 0x173b: 0x0040, - 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, - // Block 0x5d, offset 0x1740 - 0x1740: 0x1308, 0x1741: 0x1308, 0x1742: 0x1008, 0x1743: 0x1008, 0x1744: 0x0040, 0x1745: 0x0008, - 0x1746: 0x0008, 0x1747: 0x0008, 0x1748: 0x0008, 0x1749: 0x0008, 0x174a: 0x0008, 0x174b: 0x0008, - 0x174c: 0x0008, 0x174d: 0x0040, 0x174e: 0x0040, 0x174f: 0x0008, 0x1750: 0x0008, 0x1751: 0x0040, - 0x1752: 0x0040, 0x1753: 0x0008, 0x1754: 0x0008, 0x1755: 0x0008, 0x1756: 0x0008, 0x1757: 0x0008, - 0x1758: 0x0008, 0x1759: 0x0008, 0x175a: 0x0008, 0x175b: 0x0008, 0x175c: 0x0008, 0x175d: 0x0008, - 0x175e: 0x0008, 0x175f: 0x0008, 0x1760: 0x0008, 0x1761: 0x0008, 0x1762: 0x0008, 0x1763: 0x0008, - 0x1764: 0x0008, 0x1765: 0x0008, 0x1766: 0x0008, 0x1767: 0x0008, 0x1768: 0x0008, 0x1769: 0x0040, - 0x176a: 0x0008, 0x176b: 0x0008, 0x176c: 0x0008, 0x176d: 0x0008, 0x176e: 0x0008, 0x176f: 0x0008, - 0x1770: 0x0008, 0x1771: 0x0040, 0x1772: 0x0008, 0x1773: 0x0008, 0x1774: 0x0040, 0x1775: 0x0008, - 0x1776: 0x0008, 0x1777: 0x0008, 0x1778: 0x0008, 0x1779: 0x0008, 0x177a: 0x0040, 0x177b: 0x0040, - 0x177c: 0x1308, 0x177d: 0x0008, 0x177e: 0x1008, 0x177f: 0x1008, - // Block 0x5e, offset 0x1780 - 0x1780: 0x1308, 0x1781: 0x1008, 0x1782: 0x1008, 0x1783: 0x1008, 0x1784: 0x1008, 0x1785: 0x0040, - 0x1786: 0x0040, 0x1787: 0x1008, 0x1788: 0x1008, 0x1789: 0x0040, 0x178a: 0x0040, 0x178b: 0x1008, - 0x178c: 0x1008, 0x178d: 0x1808, 0x178e: 0x0040, 0x178f: 0x0040, 0x1790: 0x0008, 0x1791: 0x0040, - 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x1008, - 0x1798: 0x0040, 0x1799: 0x0040, 0x179a: 0x0040, 0x179b: 0x0040, 0x179c: 0x0040, 0x179d: 0x0008, - 0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x1008, 0x17a3: 0x1008, - 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x1308, 0x17a7: 0x1308, 0x17a8: 0x1308, 0x17a9: 0x1308, - 0x17aa: 0x1308, 0x17ab: 0x1308, 0x17ac: 0x1308, 0x17ad: 0x0040, 0x17ae: 0x0040, 0x17af: 0x0040, - 0x17b0: 0x1308, 0x17b1: 0x1308, 0x17b2: 0x1308, 0x17b3: 0x1308, 0x17b4: 0x1308, 0x17b5: 0x0040, - 0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040, - 0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, - // Block 0x5f, offset 0x17c0 - 0x17c0: 0x0039, 0x17c1: 0x0ee9, 0x17c2: 0x1159, 0x17c3: 0x0ef9, 0x17c4: 0x0f09, 0x17c5: 0x1199, - 0x17c6: 0x0f31, 0x17c7: 0x0249, 0x17c8: 0x0f41, 0x17c9: 0x0259, 0x17ca: 0x0f51, 0x17cb: 0x0359, - 0x17cc: 0x0f61, 0x17cd: 0x0f71, 0x17ce: 0x00d9, 0x17cf: 0x0f99, 0x17d0: 0x2039, 0x17d1: 0x0269, - 0x17d2: 0x01d9, 0x17d3: 0x0fa9, 0x17d4: 0x0fb9, 0x17d5: 0x1089, 0x17d6: 0x0279, 0x17d7: 0x0369, - 0x17d8: 0x0289, 0x17d9: 0x13d1, 0x17da: 0x0039, 0x17db: 0x0ee9, 0x17dc: 0x1159, 0x17dd: 0x0ef9, - 0x17de: 0x0f09, 0x17df: 0x1199, 0x17e0: 0x0f31, 0x17e1: 0x0249, 0x17e2: 0x0f41, 0x17e3: 0x0259, - 0x17e4: 0x0f51, 0x17e5: 0x0359, 0x17e6: 0x0f61, 0x17e7: 0x0f71, 0x17e8: 0x00d9, 0x17e9: 0x0f99, - 0x17ea: 0x2039, 0x17eb: 0x0269, 0x17ec: 0x01d9, 0x17ed: 0x0fa9, 0x17ee: 0x0fb9, 0x17ef: 0x1089, - 0x17f0: 0x0279, 0x17f1: 0x0369, 0x17f2: 0x0289, 0x17f3: 0x13d1, 0x17f4: 0x0039, 0x17f5: 0x0ee9, - 0x17f6: 0x1159, 0x17f7: 0x0ef9, 0x17f8: 0x0f09, 0x17f9: 0x1199, 0x17fa: 0x0f31, 0x17fb: 0x0249, - 0x17fc: 0x0f41, 0x17fd: 0x0259, 0x17fe: 0x0f51, 0x17ff: 0x0359, - // Block 0x60, offset 0x1800 - 0x1800: 0x0f61, 0x1801: 0x0f71, 0x1802: 0x00d9, 0x1803: 0x0f99, 0x1804: 0x2039, 0x1805: 0x0269, - 0x1806: 0x01d9, 0x1807: 0x0fa9, 0x1808: 0x0fb9, 0x1809: 0x1089, 0x180a: 0x0279, 0x180b: 0x0369, - 0x180c: 0x0289, 0x180d: 0x13d1, 0x180e: 0x0039, 0x180f: 0x0ee9, 0x1810: 0x1159, 0x1811: 0x0ef9, - 0x1812: 0x0f09, 0x1813: 0x1199, 0x1814: 0x0f31, 0x1815: 0x0040, 0x1816: 0x0f41, 0x1817: 0x0259, - 0x1818: 0x0f51, 0x1819: 0x0359, 0x181a: 0x0f61, 0x181b: 0x0f71, 0x181c: 0x00d9, 0x181d: 0x0f99, - 0x181e: 0x2039, 0x181f: 0x0269, 0x1820: 0x01d9, 0x1821: 0x0fa9, 0x1822: 0x0fb9, 0x1823: 0x1089, - 0x1824: 0x0279, 0x1825: 0x0369, 0x1826: 0x0289, 0x1827: 0x13d1, 0x1828: 0x0039, 0x1829: 0x0ee9, - 0x182a: 0x1159, 0x182b: 0x0ef9, 0x182c: 0x0f09, 0x182d: 0x1199, 0x182e: 0x0f31, 0x182f: 0x0249, - 0x1830: 0x0f41, 0x1831: 0x0259, 0x1832: 0x0f51, 0x1833: 0x0359, 0x1834: 0x0f61, 0x1835: 0x0f71, - 0x1836: 0x00d9, 0x1837: 0x0f99, 0x1838: 0x2039, 0x1839: 0x0269, 0x183a: 0x01d9, 0x183b: 0x0fa9, - 0x183c: 0x0fb9, 0x183d: 0x1089, 0x183e: 0x0279, 0x183f: 0x0369, - // Block 0x61, offset 0x1840 - 0x1840: 0x0289, 0x1841: 0x13d1, 0x1842: 0x0039, 0x1843: 0x0ee9, 0x1844: 0x1159, 0x1845: 0x0ef9, - 0x1846: 0x0f09, 0x1847: 0x1199, 0x1848: 0x0f31, 0x1849: 0x0249, 0x184a: 0x0f41, 0x184b: 0x0259, - 0x184c: 0x0f51, 0x184d: 0x0359, 0x184e: 0x0f61, 0x184f: 0x0f71, 0x1850: 0x00d9, 0x1851: 0x0f99, - 0x1852: 0x2039, 0x1853: 0x0269, 0x1854: 0x01d9, 0x1855: 0x0fa9, 0x1856: 0x0fb9, 0x1857: 0x1089, - 0x1858: 0x0279, 0x1859: 0x0369, 0x185a: 0x0289, 0x185b: 0x13d1, 0x185c: 0x0039, 0x185d: 0x0040, - 0x185e: 0x1159, 0x185f: 0x0ef9, 0x1860: 0x0040, 0x1861: 0x0040, 0x1862: 0x0f31, 0x1863: 0x0040, - 0x1864: 0x0040, 0x1865: 0x0259, 0x1866: 0x0f51, 0x1867: 0x0040, 0x1868: 0x0040, 0x1869: 0x0f71, - 0x186a: 0x00d9, 0x186b: 0x0f99, 0x186c: 0x2039, 0x186d: 0x0040, 0x186e: 0x01d9, 0x186f: 0x0fa9, - 0x1870: 0x0fb9, 0x1871: 0x1089, 0x1872: 0x0279, 0x1873: 0x0369, 0x1874: 0x0289, 0x1875: 0x13d1, - 0x1876: 0x0039, 0x1877: 0x0ee9, 0x1878: 0x1159, 0x1879: 0x0ef9, 0x187a: 0x0040, 0x187b: 0x1199, - 0x187c: 0x0040, 0x187d: 0x0249, 0x187e: 0x0f41, 0x187f: 0x0259, - // Block 0x62, offset 0x1880 - 0x1880: 0x0f51, 0x1881: 0x0359, 0x1882: 0x0f61, 0x1883: 0x0f71, 0x1884: 0x0040, 0x1885: 0x0f99, - 0x1886: 0x2039, 0x1887: 0x0269, 0x1888: 0x01d9, 0x1889: 0x0fa9, 0x188a: 0x0fb9, 0x188b: 0x1089, - 0x188c: 0x0279, 0x188d: 0x0369, 0x188e: 0x0289, 0x188f: 0x13d1, 0x1890: 0x0039, 0x1891: 0x0ee9, - 0x1892: 0x1159, 0x1893: 0x0ef9, 0x1894: 0x0f09, 0x1895: 0x1199, 0x1896: 0x0f31, 0x1897: 0x0249, - 0x1898: 0x0f41, 0x1899: 0x0259, 0x189a: 0x0f51, 0x189b: 0x0359, 0x189c: 0x0f61, 0x189d: 0x0f71, - 0x189e: 0x00d9, 0x189f: 0x0f99, 0x18a0: 0x2039, 0x18a1: 0x0269, 0x18a2: 0x01d9, 0x18a3: 0x0fa9, - 0x18a4: 0x0fb9, 0x18a5: 0x1089, 0x18a6: 0x0279, 0x18a7: 0x0369, 0x18a8: 0x0289, 0x18a9: 0x13d1, - 0x18aa: 0x0039, 0x18ab: 0x0ee9, 0x18ac: 0x1159, 0x18ad: 0x0ef9, 0x18ae: 0x0f09, 0x18af: 0x1199, - 0x18b0: 0x0f31, 0x18b1: 0x0249, 0x18b2: 0x0f41, 0x18b3: 0x0259, 0x18b4: 0x0f51, 0x18b5: 0x0359, - 0x18b6: 0x0f61, 0x18b7: 0x0f71, 0x18b8: 0x00d9, 0x18b9: 0x0f99, 0x18ba: 0x2039, 0x18bb: 0x0269, - 0x18bc: 0x01d9, 0x18bd: 0x0fa9, 0x18be: 0x0fb9, 0x18bf: 0x1089, - // Block 0x63, offset 0x18c0 - 0x18c0: 0x0279, 0x18c1: 0x0369, 0x18c2: 0x0289, 0x18c3: 0x13d1, 0x18c4: 0x0039, 0x18c5: 0x0ee9, - 0x18c6: 0x0040, 0x18c7: 0x0ef9, 0x18c8: 0x0f09, 0x18c9: 0x1199, 0x18ca: 0x0f31, 0x18cb: 0x0040, - 0x18cc: 0x0040, 0x18cd: 0x0259, 0x18ce: 0x0f51, 0x18cf: 0x0359, 0x18d0: 0x0f61, 0x18d1: 0x0f71, - 0x18d2: 0x00d9, 0x18d3: 0x0f99, 0x18d4: 0x2039, 0x18d5: 0x0040, 0x18d6: 0x01d9, 0x18d7: 0x0fa9, - 0x18d8: 0x0fb9, 0x18d9: 0x1089, 0x18da: 0x0279, 0x18db: 0x0369, 0x18dc: 0x0289, 0x18dd: 0x0040, - 0x18de: 0x0039, 0x18df: 0x0ee9, 0x18e0: 0x1159, 0x18e1: 0x0ef9, 0x18e2: 0x0f09, 0x18e3: 0x1199, - 0x18e4: 0x0f31, 0x18e5: 0x0249, 0x18e6: 0x0f41, 0x18e7: 0x0259, 0x18e8: 0x0f51, 0x18e9: 0x0359, - 0x18ea: 0x0f61, 0x18eb: 0x0f71, 0x18ec: 0x00d9, 0x18ed: 0x0f99, 0x18ee: 0x2039, 0x18ef: 0x0269, - 0x18f0: 0x01d9, 0x18f1: 0x0fa9, 0x18f2: 0x0fb9, 0x18f3: 0x1089, 0x18f4: 0x0279, 0x18f5: 0x0369, - 0x18f6: 0x0289, 0x18f7: 0x13d1, 0x18f8: 0x0039, 0x18f9: 0x0ee9, 0x18fa: 0x0040, 0x18fb: 0x0ef9, - 0x18fc: 0x0f09, 0x18fd: 0x1199, 0x18fe: 0x0f31, 0x18ff: 0x0040, - // Block 0x64, offset 0x1900 - 0x1900: 0x0f41, 0x1901: 0x0259, 0x1902: 0x0f51, 0x1903: 0x0359, 0x1904: 0x0f61, 0x1905: 0x0040, - 0x1906: 0x00d9, 0x1907: 0x0040, 0x1908: 0x0040, 0x1909: 0x0040, 0x190a: 0x01d9, 0x190b: 0x0fa9, - 0x190c: 0x0fb9, 0x190d: 0x1089, 0x190e: 0x0279, 0x190f: 0x0369, 0x1910: 0x0289, 0x1911: 0x0040, - 0x1912: 0x0039, 0x1913: 0x0ee9, 0x1914: 0x1159, 0x1915: 0x0ef9, 0x1916: 0x0f09, 0x1917: 0x1199, - 0x1918: 0x0f31, 0x1919: 0x0249, 0x191a: 0x0f41, 0x191b: 0x0259, 0x191c: 0x0f51, 0x191d: 0x0359, - 0x191e: 0x0f61, 0x191f: 0x0f71, 0x1920: 0x00d9, 0x1921: 0x0f99, 0x1922: 0x2039, 0x1923: 0x0269, - 0x1924: 0x01d9, 0x1925: 0x0fa9, 0x1926: 0x0fb9, 0x1927: 0x1089, 0x1928: 0x0279, 0x1929: 0x0369, - 0x192a: 0x0289, 0x192b: 0x13d1, 0x192c: 0x0039, 0x192d: 0x0ee9, 0x192e: 0x1159, 0x192f: 0x0ef9, - 0x1930: 0x0f09, 0x1931: 0x1199, 0x1932: 0x0f31, 0x1933: 0x0249, 0x1934: 0x0f41, 0x1935: 0x0259, - 0x1936: 0x0f51, 0x1937: 0x0359, 0x1938: 0x0f61, 0x1939: 0x0f71, 0x193a: 0x00d9, 0x193b: 0x0f99, - 0x193c: 0x2039, 0x193d: 0x0269, 0x193e: 0x01d9, 0x193f: 0x0fa9, - // Block 0x65, offset 0x1940 - 0x1940: 0x0fb9, 0x1941: 0x1089, 0x1942: 0x0279, 0x1943: 0x0369, 0x1944: 0x0289, 0x1945: 0x13d1, - 0x1946: 0x0039, 0x1947: 0x0ee9, 0x1948: 0x1159, 0x1949: 0x0ef9, 0x194a: 0x0f09, 0x194b: 0x1199, - 0x194c: 0x0f31, 0x194d: 0x0249, 0x194e: 0x0f41, 0x194f: 0x0259, 0x1950: 0x0f51, 0x1951: 0x0359, - 0x1952: 0x0f61, 0x1953: 0x0f71, 0x1954: 0x00d9, 0x1955: 0x0f99, 0x1956: 0x2039, 0x1957: 0x0269, - 0x1958: 0x01d9, 0x1959: 0x0fa9, 0x195a: 0x0fb9, 0x195b: 0x1089, 0x195c: 0x0279, 0x195d: 0x0369, - 0x195e: 0x0289, 0x195f: 0x13d1, 0x1960: 0x0039, 0x1961: 0x0ee9, 0x1962: 0x1159, 0x1963: 0x0ef9, - 0x1964: 0x0f09, 0x1965: 0x1199, 0x1966: 0x0f31, 0x1967: 0x0249, 0x1968: 0x0f41, 0x1969: 0x0259, - 0x196a: 0x0f51, 0x196b: 0x0359, 0x196c: 0x0f61, 0x196d: 0x0f71, 0x196e: 0x00d9, 0x196f: 0x0f99, - 0x1970: 0x2039, 0x1971: 0x0269, 0x1972: 0x01d9, 0x1973: 0x0fa9, 0x1974: 0x0fb9, 0x1975: 0x1089, - 0x1976: 0x0279, 0x1977: 0x0369, 0x1978: 0x0289, 0x1979: 0x13d1, 0x197a: 0x0039, 0x197b: 0x0ee9, - 0x197c: 0x1159, 0x197d: 0x0ef9, 0x197e: 0x0f09, 0x197f: 0x1199, - // Block 0x66, offset 0x1980 - 0x1980: 0x0f31, 0x1981: 0x0249, 0x1982: 0x0f41, 0x1983: 0x0259, 0x1984: 0x0f51, 0x1985: 0x0359, - 0x1986: 0x0f61, 0x1987: 0x0f71, 0x1988: 0x00d9, 0x1989: 0x0f99, 0x198a: 0x2039, 0x198b: 0x0269, - 0x198c: 0x01d9, 0x198d: 0x0fa9, 0x198e: 0x0fb9, 0x198f: 0x1089, 0x1990: 0x0279, 0x1991: 0x0369, - 0x1992: 0x0289, 0x1993: 0x13d1, 0x1994: 0x0039, 0x1995: 0x0ee9, 0x1996: 0x1159, 0x1997: 0x0ef9, - 0x1998: 0x0f09, 0x1999: 0x1199, 0x199a: 0x0f31, 0x199b: 0x0249, 0x199c: 0x0f41, 0x199d: 0x0259, - 0x199e: 0x0f51, 0x199f: 0x0359, 0x19a0: 0x0f61, 0x19a1: 0x0f71, 0x19a2: 0x00d9, 0x19a3: 0x0f99, - 0x19a4: 0x2039, 0x19a5: 0x0269, 0x19a6: 0x01d9, 0x19a7: 0x0fa9, 0x19a8: 0x0fb9, 0x19a9: 0x1089, - 0x19aa: 0x0279, 0x19ab: 0x0369, 0x19ac: 0x0289, 0x19ad: 0x13d1, 0x19ae: 0x0039, 0x19af: 0x0ee9, - 0x19b0: 0x1159, 0x19b1: 0x0ef9, 0x19b2: 0x0f09, 0x19b3: 0x1199, 0x19b4: 0x0f31, 0x19b5: 0x0249, - 0x19b6: 0x0f41, 0x19b7: 0x0259, 0x19b8: 0x0f51, 0x19b9: 0x0359, 0x19ba: 0x0f61, 0x19bb: 0x0f71, - 0x19bc: 0x00d9, 0x19bd: 0x0f99, 0x19be: 0x2039, 0x19bf: 0x0269, - // Block 0x67, offset 0x19c0 - 0x19c0: 0x01d9, 0x19c1: 0x0fa9, 0x19c2: 0x0fb9, 0x19c3: 0x1089, 0x19c4: 0x0279, 0x19c5: 0x0369, - 0x19c6: 0x0289, 0x19c7: 0x13d1, 0x19c8: 0x0039, 0x19c9: 0x0ee9, 0x19ca: 0x1159, 0x19cb: 0x0ef9, - 0x19cc: 0x0f09, 0x19cd: 0x1199, 0x19ce: 0x0f31, 0x19cf: 0x0249, 0x19d0: 0x0f41, 0x19d1: 0x0259, - 0x19d2: 0x0f51, 0x19d3: 0x0359, 0x19d4: 0x0f61, 0x19d5: 0x0f71, 0x19d6: 0x00d9, 0x19d7: 0x0f99, - 0x19d8: 0x2039, 0x19d9: 0x0269, 0x19da: 0x01d9, 0x19db: 0x0fa9, 0x19dc: 0x0fb9, 0x19dd: 0x1089, - 0x19de: 0x0279, 0x19df: 0x0369, 0x19e0: 0x0289, 0x19e1: 0x13d1, 0x19e2: 0x0039, 0x19e3: 0x0ee9, - 0x19e4: 0x1159, 0x19e5: 0x0ef9, 0x19e6: 0x0f09, 0x19e7: 0x1199, 0x19e8: 0x0f31, 0x19e9: 0x0249, - 0x19ea: 0x0f41, 0x19eb: 0x0259, 0x19ec: 0x0f51, 0x19ed: 0x0359, 0x19ee: 0x0f61, 0x19ef: 0x0f71, - 0x19f0: 0x00d9, 0x19f1: 0x0f99, 0x19f2: 0x2039, 0x19f3: 0x0269, 0x19f4: 0x01d9, 0x19f5: 0x0fa9, - 0x19f6: 0x0fb9, 0x19f7: 0x1089, 0x19f8: 0x0279, 0x19f9: 0x0369, 0x19fa: 0x0289, 0x19fb: 0x13d1, - 0x19fc: 0x0039, 0x19fd: 0x0ee9, 0x19fe: 0x1159, 0x19ff: 0x0ef9, - // Block 0x68, offset 0x1a00 - 0x1a00: 0x0f09, 0x1a01: 0x1199, 0x1a02: 0x0f31, 0x1a03: 0x0249, 0x1a04: 0x0f41, 0x1a05: 0x0259, - 0x1a06: 0x0f51, 0x1a07: 0x0359, 0x1a08: 0x0f61, 0x1a09: 0x0f71, 0x1a0a: 0x00d9, 0x1a0b: 0x0f99, - 0x1a0c: 0x2039, 0x1a0d: 0x0269, 0x1a0e: 0x01d9, 0x1a0f: 0x0fa9, 0x1a10: 0x0fb9, 0x1a11: 0x1089, - 0x1a12: 0x0279, 0x1a13: 0x0369, 0x1a14: 0x0289, 0x1a15: 0x13d1, 0x1a16: 0x0039, 0x1a17: 0x0ee9, - 0x1a18: 0x1159, 0x1a19: 0x0ef9, 0x1a1a: 0x0f09, 0x1a1b: 0x1199, 0x1a1c: 0x0f31, 0x1a1d: 0x0249, - 0x1a1e: 0x0f41, 0x1a1f: 0x0259, 0x1a20: 0x0f51, 0x1a21: 0x0359, 0x1a22: 0x0f61, 0x1a23: 0x0f71, - 0x1a24: 0x00d9, 0x1a25: 0x0f99, 0x1a26: 0x2039, 0x1a27: 0x0269, 0x1a28: 0x01d9, 0x1a29: 0x0fa9, - 0x1a2a: 0x0fb9, 0x1a2b: 0x1089, 0x1a2c: 0x0279, 0x1a2d: 0x0369, 0x1a2e: 0x0289, 0x1a2f: 0x13d1, - 0x1a30: 0x0039, 0x1a31: 0x0ee9, 0x1a32: 0x1159, 0x1a33: 0x0ef9, 0x1a34: 0x0f09, 0x1a35: 0x1199, - 0x1a36: 0x0f31, 0x1a37: 0x0249, 0x1a38: 0x0f41, 0x1a39: 0x0259, 0x1a3a: 0x0f51, 0x1a3b: 0x0359, - 0x1a3c: 0x0f61, 0x1a3d: 0x0f71, 0x1a3e: 0x00d9, 0x1a3f: 0x0f99, - // Block 0x69, offset 0x1a40 - 0x1a40: 0x2039, 0x1a41: 0x0269, 0x1a42: 0x01d9, 0x1a43: 0x0fa9, 0x1a44: 0x0fb9, 0x1a45: 0x1089, - 0x1a46: 0x0279, 0x1a47: 0x0369, 0x1a48: 0x0289, 0x1a49: 0x13d1, 0x1a4a: 0x0039, 0x1a4b: 0x0ee9, - 0x1a4c: 0x1159, 0x1a4d: 0x0ef9, 0x1a4e: 0x0f09, 0x1a4f: 0x1199, 0x1a50: 0x0f31, 0x1a51: 0x0249, - 0x1a52: 0x0f41, 0x1a53: 0x0259, 0x1a54: 0x0f51, 0x1a55: 0x0359, 0x1a56: 0x0f61, 0x1a57: 0x0f71, - 0x1a58: 0x00d9, 0x1a59: 0x0f99, 0x1a5a: 0x2039, 0x1a5b: 0x0269, 0x1a5c: 0x01d9, 0x1a5d: 0x0fa9, - 0x1a5e: 0x0fb9, 0x1a5f: 0x1089, 0x1a60: 0x0279, 0x1a61: 0x0369, 0x1a62: 0x0289, 0x1a63: 0x13d1, - 0x1a64: 0xba81, 0x1a65: 0xba99, 0x1a66: 0x0040, 0x1a67: 0x0040, 0x1a68: 0xbab1, 0x1a69: 0x1099, - 0x1a6a: 0x10b1, 0x1a6b: 0x10c9, 0x1a6c: 0xbac9, 0x1a6d: 0xbae1, 0x1a6e: 0xbaf9, 0x1a6f: 0x1429, - 0x1a70: 0x1a31, 0x1a71: 0xbb11, 0x1a72: 0xbb29, 0x1a73: 0xbb41, 0x1a74: 0xbb59, 0x1a75: 0xbb71, - 0x1a76: 0xbb89, 0x1a77: 0x2109, 0x1a78: 0x1111, 0x1a79: 0x1429, 0x1a7a: 0xbba1, 0x1a7b: 0xbbb9, - 0x1a7c: 0xbbd1, 0x1a7d: 0x10e1, 0x1a7e: 0x10f9, 0x1a7f: 0xbbe9, - // Block 0x6a, offset 0x1a80 - 0x1a80: 0x2079, 0x1a81: 0xbc01, 0x1a82: 0xbab1, 0x1a83: 0x1099, 0x1a84: 0x10b1, 0x1a85: 0x10c9, - 0x1a86: 0xbac9, 0x1a87: 0xbae1, 0x1a88: 0xbaf9, 0x1a89: 0x1429, 0x1a8a: 0x1a31, 0x1a8b: 0xbb11, - 0x1a8c: 0xbb29, 0x1a8d: 0xbb41, 0x1a8e: 0xbb59, 0x1a8f: 0xbb71, 0x1a90: 0xbb89, 0x1a91: 0x2109, - 0x1a92: 0x1111, 0x1a93: 0xbba1, 0x1a94: 0xbba1, 0x1a95: 0xbbb9, 0x1a96: 0xbbd1, 0x1a97: 0x10e1, - 0x1a98: 0x10f9, 0x1a99: 0xbbe9, 0x1a9a: 0x2079, 0x1a9b: 0xbc21, 0x1a9c: 0xbac9, 0x1a9d: 0x1429, - 0x1a9e: 0xbb11, 0x1a9f: 0x10e1, 0x1aa0: 0x1111, 0x1aa1: 0x2109, 0x1aa2: 0xbab1, 0x1aa3: 0x1099, - 0x1aa4: 0x10b1, 0x1aa5: 0x10c9, 0x1aa6: 0xbac9, 0x1aa7: 0xbae1, 0x1aa8: 0xbaf9, 0x1aa9: 0x1429, - 0x1aaa: 0x1a31, 0x1aab: 0xbb11, 0x1aac: 0xbb29, 0x1aad: 0xbb41, 0x1aae: 0xbb59, 0x1aaf: 0xbb71, - 0x1ab0: 0xbb89, 0x1ab1: 0x2109, 0x1ab2: 0x1111, 0x1ab3: 0x1429, 0x1ab4: 0xbba1, 0x1ab5: 0xbbb9, - 0x1ab6: 0xbbd1, 0x1ab7: 0x10e1, 0x1ab8: 0x10f9, 0x1ab9: 0xbbe9, 0x1aba: 0x2079, 0x1abb: 0xbc01, - 0x1abc: 0xbab1, 0x1abd: 0x1099, 0x1abe: 0x10b1, 0x1abf: 0x10c9, - // Block 0x6b, offset 0x1ac0 - 0x1ac0: 0xbac9, 0x1ac1: 0xbae1, 0x1ac2: 0xbaf9, 0x1ac3: 0x1429, 0x1ac4: 0x1a31, 0x1ac5: 0xbb11, - 0x1ac6: 0xbb29, 0x1ac7: 0xbb41, 0x1ac8: 0xbb59, 0x1ac9: 0xbb71, 0x1aca: 0xbb89, 0x1acb: 0x2109, - 0x1acc: 0x1111, 0x1acd: 0xbba1, 0x1ace: 0xbba1, 0x1acf: 0xbbb9, 0x1ad0: 0xbbd1, 0x1ad1: 0x10e1, - 0x1ad2: 0x10f9, 0x1ad3: 0xbbe9, 0x1ad4: 0x2079, 0x1ad5: 0xbc21, 0x1ad6: 0xbac9, 0x1ad7: 0x1429, - 0x1ad8: 0xbb11, 0x1ad9: 0x10e1, 0x1ada: 0x1111, 0x1adb: 0x2109, 0x1adc: 0xbab1, 0x1add: 0x1099, - 0x1ade: 0x10b1, 0x1adf: 0x10c9, 0x1ae0: 0xbac9, 0x1ae1: 0xbae1, 0x1ae2: 0xbaf9, 0x1ae3: 0x1429, - 0x1ae4: 0x1a31, 0x1ae5: 0xbb11, 0x1ae6: 0xbb29, 0x1ae7: 0xbb41, 0x1ae8: 0xbb59, 0x1ae9: 0xbb71, - 0x1aea: 0xbb89, 0x1aeb: 0x2109, 0x1aec: 0x1111, 0x1aed: 0x1429, 0x1aee: 0xbba1, 0x1aef: 0xbbb9, - 0x1af0: 0xbbd1, 0x1af1: 0x10e1, 0x1af2: 0x10f9, 0x1af3: 0xbbe9, 0x1af4: 0x2079, 0x1af5: 0xbc01, - 0x1af6: 0xbab1, 0x1af7: 0x1099, 0x1af8: 0x10b1, 0x1af9: 0x10c9, 0x1afa: 0xbac9, 0x1afb: 0xbae1, - 0x1afc: 0xbaf9, 0x1afd: 0x1429, 0x1afe: 0x1a31, 0x1aff: 0xbb11, - // Block 0x6c, offset 0x1b00 - 0x1b00: 0xbb29, 0x1b01: 0xbb41, 0x1b02: 0xbb59, 0x1b03: 0xbb71, 0x1b04: 0xbb89, 0x1b05: 0x2109, - 0x1b06: 0x1111, 0x1b07: 0xbba1, 0x1b08: 0xbba1, 0x1b09: 0xbbb9, 0x1b0a: 0xbbd1, 0x1b0b: 0x10e1, - 0x1b0c: 0x10f9, 0x1b0d: 0xbbe9, 0x1b0e: 0x2079, 0x1b0f: 0xbc21, 0x1b10: 0xbac9, 0x1b11: 0x1429, - 0x1b12: 0xbb11, 0x1b13: 0x10e1, 0x1b14: 0x1111, 0x1b15: 0x2109, 0x1b16: 0xbab1, 0x1b17: 0x1099, - 0x1b18: 0x10b1, 0x1b19: 0x10c9, 0x1b1a: 0xbac9, 0x1b1b: 0xbae1, 0x1b1c: 0xbaf9, 0x1b1d: 0x1429, - 0x1b1e: 0x1a31, 0x1b1f: 0xbb11, 0x1b20: 0xbb29, 0x1b21: 0xbb41, 0x1b22: 0xbb59, 0x1b23: 0xbb71, - 0x1b24: 0xbb89, 0x1b25: 0x2109, 0x1b26: 0x1111, 0x1b27: 0x1429, 0x1b28: 0xbba1, 0x1b29: 0xbbb9, - 0x1b2a: 0xbbd1, 0x1b2b: 0x10e1, 0x1b2c: 0x10f9, 0x1b2d: 0xbbe9, 0x1b2e: 0x2079, 0x1b2f: 0xbc01, - 0x1b30: 0xbab1, 0x1b31: 0x1099, 0x1b32: 0x10b1, 0x1b33: 0x10c9, 0x1b34: 0xbac9, 0x1b35: 0xbae1, - 0x1b36: 0xbaf9, 0x1b37: 0x1429, 0x1b38: 0x1a31, 0x1b39: 0xbb11, 0x1b3a: 0xbb29, 0x1b3b: 0xbb41, - 0x1b3c: 0xbb59, 0x1b3d: 0xbb71, 0x1b3e: 0xbb89, 0x1b3f: 0x2109, - // Block 0x6d, offset 0x1b40 - 0x1b40: 0x1111, 0x1b41: 0xbba1, 0x1b42: 0xbba1, 0x1b43: 0xbbb9, 0x1b44: 0xbbd1, 0x1b45: 0x10e1, - 0x1b46: 0x10f9, 0x1b47: 0xbbe9, 0x1b48: 0x2079, 0x1b49: 0xbc21, 0x1b4a: 0xbac9, 0x1b4b: 0x1429, - 0x1b4c: 0xbb11, 0x1b4d: 0x10e1, 0x1b4e: 0x1111, 0x1b4f: 0x2109, 0x1b50: 0xbab1, 0x1b51: 0x1099, - 0x1b52: 0x10b1, 0x1b53: 0x10c9, 0x1b54: 0xbac9, 0x1b55: 0xbae1, 0x1b56: 0xbaf9, 0x1b57: 0x1429, - 0x1b58: 0x1a31, 0x1b59: 0xbb11, 0x1b5a: 0xbb29, 0x1b5b: 0xbb41, 0x1b5c: 0xbb59, 0x1b5d: 0xbb71, - 0x1b5e: 0xbb89, 0x1b5f: 0x2109, 0x1b60: 0x1111, 0x1b61: 0x1429, 0x1b62: 0xbba1, 0x1b63: 0xbbb9, - 0x1b64: 0xbbd1, 0x1b65: 0x10e1, 0x1b66: 0x10f9, 0x1b67: 0xbbe9, 0x1b68: 0x2079, 0x1b69: 0xbc01, - 0x1b6a: 0xbab1, 0x1b6b: 0x1099, 0x1b6c: 0x10b1, 0x1b6d: 0x10c9, 0x1b6e: 0xbac9, 0x1b6f: 0xbae1, - 0x1b70: 0xbaf9, 0x1b71: 0x1429, 0x1b72: 0x1a31, 0x1b73: 0xbb11, 0x1b74: 0xbb29, 0x1b75: 0xbb41, - 0x1b76: 0xbb59, 0x1b77: 0xbb71, 0x1b78: 0xbb89, 0x1b79: 0x2109, 0x1b7a: 0x1111, 0x1b7b: 0xbba1, - 0x1b7c: 0xbba1, 0x1b7d: 0xbbb9, 0x1b7e: 0xbbd1, 0x1b7f: 0x10e1, - // Block 0x6e, offset 0x1b80 - 0x1b80: 0x10f9, 0x1b81: 0xbbe9, 0x1b82: 0x2079, 0x1b83: 0xbc21, 0x1b84: 0xbac9, 0x1b85: 0x1429, - 0x1b86: 0xbb11, 0x1b87: 0x10e1, 0x1b88: 0x1111, 0x1b89: 0x2109, 0x1b8a: 0xbc41, 0x1b8b: 0xbc41, - 0x1b8c: 0x0040, 0x1b8d: 0x0040, 0x1b8e: 0x1f41, 0x1b8f: 0x00c9, 0x1b90: 0x0069, 0x1b91: 0x0079, - 0x1b92: 0x1f51, 0x1b93: 0x1f61, 0x1b94: 0x1f71, 0x1b95: 0x1f81, 0x1b96: 0x1f91, 0x1b97: 0x1fa1, - 0x1b98: 0x1f41, 0x1b99: 0x00c9, 0x1b9a: 0x0069, 0x1b9b: 0x0079, 0x1b9c: 0x1f51, 0x1b9d: 0x1f61, - 0x1b9e: 0x1f71, 0x1b9f: 0x1f81, 0x1ba0: 0x1f91, 0x1ba1: 0x1fa1, 0x1ba2: 0x1f41, 0x1ba3: 0x00c9, - 0x1ba4: 0x0069, 0x1ba5: 0x0079, 0x1ba6: 0x1f51, 0x1ba7: 0x1f61, 0x1ba8: 0x1f71, 0x1ba9: 0x1f81, - 0x1baa: 0x1f91, 0x1bab: 0x1fa1, 0x1bac: 0x1f41, 0x1bad: 0x00c9, 0x1bae: 0x0069, 0x1baf: 0x0079, - 0x1bb0: 0x1f51, 0x1bb1: 0x1f61, 0x1bb2: 0x1f71, 0x1bb3: 0x1f81, 0x1bb4: 0x1f91, 0x1bb5: 0x1fa1, - 0x1bb6: 0x1f41, 0x1bb7: 0x00c9, 0x1bb8: 0x0069, 0x1bb9: 0x0079, 0x1bba: 0x1f51, 0x1bbb: 0x1f61, - 0x1bbc: 0x1f71, 0x1bbd: 0x1f81, 0x1bbe: 0x1f91, 0x1bbf: 0x1fa1, - // Block 0x6f, offset 0x1bc0 - 0x1bc0: 0xe115, 0x1bc1: 0xe115, 0x1bc2: 0xe135, 0x1bc3: 0xe135, 0x1bc4: 0xe115, 0x1bc5: 0xe115, - 0x1bc6: 0xe175, 0x1bc7: 0xe175, 0x1bc8: 0xe115, 0x1bc9: 0xe115, 0x1bca: 0xe135, 0x1bcb: 0xe135, - 0x1bcc: 0xe115, 0x1bcd: 0xe115, 0x1bce: 0xe1f5, 0x1bcf: 0xe1f5, 0x1bd0: 0xe115, 0x1bd1: 0xe115, - 0x1bd2: 0xe135, 0x1bd3: 0xe135, 0x1bd4: 0xe115, 0x1bd5: 0xe115, 0x1bd6: 0xe175, 0x1bd7: 0xe175, - 0x1bd8: 0xe115, 0x1bd9: 0xe115, 0x1bda: 0xe135, 0x1bdb: 0xe135, 0x1bdc: 0xe115, 0x1bdd: 0xe115, - 0x1bde: 0x8b05, 0x1bdf: 0x8b05, 0x1be0: 0x04b5, 0x1be1: 0x04b5, 0x1be2: 0x0208, 0x1be3: 0x0208, - 0x1be4: 0x0208, 0x1be5: 0x0208, 0x1be6: 0x0208, 0x1be7: 0x0208, 0x1be8: 0x0208, 0x1be9: 0x0208, - 0x1bea: 0x0208, 0x1beb: 0x0208, 0x1bec: 0x0208, 0x1bed: 0x0208, 0x1bee: 0x0208, 0x1bef: 0x0208, - 0x1bf0: 0x0208, 0x1bf1: 0x0208, 0x1bf2: 0x0208, 0x1bf3: 0x0208, 0x1bf4: 0x0208, 0x1bf5: 0x0208, - 0x1bf6: 0x0208, 0x1bf7: 0x0208, 0x1bf8: 0x0208, 0x1bf9: 0x0208, 0x1bfa: 0x0208, 0x1bfb: 0x0208, - 0x1bfc: 0x0208, 0x1bfd: 0x0208, 0x1bfe: 0x0208, 0x1bff: 0x0208, - // Block 0x70, offset 0x1c00 - 0x1c00: 0xb189, 0x1c01: 0xb1a1, 0x1c02: 0xb201, 0x1c03: 0xb249, 0x1c04: 0x0040, 0x1c05: 0xb411, - 0x1c06: 0xb291, 0x1c07: 0xb219, 0x1c08: 0xb309, 0x1c09: 0xb429, 0x1c0a: 0xb399, 0x1c0b: 0xb3b1, - 0x1c0c: 0xb3c9, 0x1c0d: 0xb3e1, 0x1c0e: 0xb2a9, 0x1c0f: 0xb339, 0x1c10: 0xb369, 0x1c11: 0xb2d9, - 0x1c12: 0xb381, 0x1c13: 0xb279, 0x1c14: 0xb2c1, 0x1c15: 0xb1d1, 0x1c16: 0xb1e9, 0x1c17: 0xb231, - 0x1c18: 0xb261, 0x1c19: 0xb2f1, 0x1c1a: 0xb321, 0x1c1b: 0xb351, 0x1c1c: 0xbc59, 0x1c1d: 0x7949, - 0x1c1e: 0xbc71, 0x1c1f: 0xbc89, 0x1c20: 0x0040, 0x1c21: 0xb1a1, 0x1c22: 0xb201, 0x1c23: 0x0040, - 0x1c24: 0xb3f9, 0x1c25: 0x0040, 0x1c26: 0x0040, 0x1c27: 0xb219, 0x1c28: 0x0040, 0x1c29: 0xb429, - 0x1c2a: 0xb399, 0x1c2b: 0xb3b1, 0x1c2c: 0xb3c9, 0x1c2d: 0xb3e1, 0x1c2e: 0xb2a9, 0x1c2f: 0xb339, - 0x1c30: 0xb369, 0x1c31: 0xb2d9, 0x1c32: 0xb381, 0x1c33: 0x0040, 0x1c34: 0xb2c1, 0x1c35: 0xb1d1, - 0x1c36: 0xb1e9, 0x1c37: 0xb231, 0x1c38: 0x0040, 0x1c39: 0xb2f1, 0x1c3a: 0x0040, 0x1c3b: 0xb351, - 0x1c3c: 0x0040, 0x1c3d: 0x0040, 0x1c3e: 0x0040, 0x1c3f: 0x0040, - // Block 0x71, offset 0x1c40 - 0x1c40: 0x0040, 0x1c41: 0x0040, 0x1c42: 0xb201, 0x1c43: 0x0040, 0x1c44: 0x0040, 0x1c45: 0x0040, - 0x1c46: 0x0040, 0x1c47: 0xb219, 0x1c48: 0x0040, 0x1c49: 0xb429, 0x1c4a: 0x0040, 0x1c4b: 0xb3b1, - 0x1c4c: 0x0040, 0x1c4d: 0xb3e1, 0x1c4e: 0xb2a9, 0x1c4f: 0xb339, 0x1c50: 0x0040, 0x1c51: 0xb2d9, - 0x1c52: 0xb381, 0x1c53: 0x0040, 0x1c54: 0xb2c1, 0x1c55: 0x0040, 0x1c56: 0x0040, 0x1c57: 0xb231, - 0x1c58: 0x0040, 0x1c59: 0xb2f1, 0x1c5a: 0x0040, 0x1c5b: 0xb351, 0x1c5c: 0x0040, 0x1c5d: 0x7949, - 0x1c5e: 0x0040, 0x1c5f: 0xbc89, 0x1c60: 0x0040, 0x1c61: 0xb1a1, 0x1c62: 0xb201, 0x1c63: 0x0040, - 0x1c64: 0xb3f9, 0x1c65: 0x0040, 0x1c66: 0x0040, 0x1c67: 0xb219, 0x1c68: 0xb309, 0x1c69: 0xb429, - 0x1c6a: 0xb399, 0x1c6b: 0x0040, 0x1c6c: 0xb3c9, 0x1c6d: 0xb3e1, 0x1c6e: 0xb2a9, 0x1c6f: 0xb339, - 0x1c70: 0xb369, 0x1c71: 0xb2d9, 0x1c72: 0xb381, 0x1c73: 0x0040, 0x1c74: 0xb2c1, 0x1c75: 0xb1d1, - 0x1c76: 0xb1e9, 0x1c77: 0xb231, 0x1c78: 0x0040, 0x1c79: 0xb2f1, 0x1c7a: 0xb321, 0x1c7b: 0xb351, - 0x1c7c: 0xbc59, 0x1c7d: 0x0040, 0x1c7e: 0xbc71, 0x1c7f: 0x0040, - // Block 0x72, offset 0x1c80 - 0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0xb3f9, 0x1c85: 0xb411, - 0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0x0040, 0x1c8b: 0xb3b1, - 0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9, - 0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231, - 0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0x0040, 0x1c9d: 0x0040, - 0x1c9e: 0x0040, 0x1c9f: 0x0040, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0xb249, - 0x1ca4: 0x0040, 0x1ca5: 0xb411, 0x1ca6: 0xb291, 0x1ca7: 0xb219, 0x1ca8: 0xb309, 0x1ca9: 0xb429, - 0x1caa: 0x0040, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339, - 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0xb279, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1, - 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0xb261, 0x1cb9: 0xb2f1, 0x1cba: 0xb321, 0x1cbb: 0xb351, - 0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040, - // Block 0x73, offset 0x1cc0 - 0x1cc0: 0x0040, 0x1cc1: 0xbca2, 0x1cc2: 0xbcba, 0x1cc3: 0xbcd2, 0x1cc4: 0xbcea, 0x1cc5: 0xbd02, - 0x1cc6: 0xbd1a, 0x1cc7: 0xbd32, 0x1cc8: 0xbd4a, 0x1cc9: 0xbd62, 0x1cca: 0xbd7a, 0x1ccb: 0x0018, - 0x1ccc: 0x0018, 0x1ccd: 0x0040, 0x1cce: 0x0040, 0x1ccf: 0x0040, 0x1cd0: 0xbd92, 0x1cd1: 0xbdb2, - 0x1cd2: 0xbdd2, 0x1cd3: 0xbdf2, 0x1cd4: 0xbe12, 0x1cd5: 0xbe32, 0x1cd6: 0xbe52, 0x1cd7: 0xbe72, - 0x1cd8: 0xbe92, 0x1cd9: 0xbeb2, 0x1cda: 0xbed2, 0x1cdb: 0xbef2, 0x1cdc: 0xbf12, 0x1cdd: 0xbf32, - 0x1cde: 0xbf52, 0x1cdf: 0xbf72, 0x1ce0: 0xbf92, 0x1ce1: 0xbfb2, 0x1ce2: 0xbfd2, 0x1ce3: 0xbff2, - 0x1ce4: 0xc012, 0x1ce5: 0xc032, 0x1ce6: 0xc052, 0x1ce7: 0xc072, 0x1ce8: 0xc092, 0x1ce9: 0xc0b2, - 0x1cea: 0xc0d1, 0x1ceb: 0x1159, 0x1cec: 0x0269, 0x1ced: 0x6671, 0x1cee: 0xc111, 0x1cef: 0x0040, - 0x1cf0: 0x0039, 0x1cf1: 0x0ee9, 0x1cf2: 0x1159, 0x1cf3: 0x0ef9, 0x1cf4: 0x0f09, 0x1cf5: 0x1199, - 0x1cf6: 0x0f31, 0x1cf7: 0x0249, 0x1cf8: 0x0f41, 0x1cf9: 0x0259, 0x1cfa: 0x0f51, 0x1cfb: 0x0359, - 0x1cfc: 0x0f61, 0x1cfd: 0x0f71, 0x1cfe: 0x00d9, 0x1cff: 0x0f99, - // Block 0x74, offset 0x1d00 - 0x1d00: 0x2039, 0x1d01: 0x0269, 0x1d02: 0x01d9, 0x1d03: 0x0fa9, 0x1d04: 0x0fb9, 0x1d05: 0x1089, - 0x1d06: 0x0279, 0x1d07: 0x0369, 0x1d08: 0x0289, 0x1d09: 0x13d1, 0x1d0a: 0xc129, 0x1d0b: 0x65b1, - 0x1d0c: 0xc141, 0x1d0d: 0x1441, 0x1d0e: 0xc159, 0x1d0f: 0xc179, 0x1d10: 0x0018, 0x1d11: 0x0018, - 0x1d12: 0x0018, 0x1d13: 0x0018, 0x1d14: 0x0018, 0x1d15: 0x0018, 0x1d16: 0x0018, 0x1d17: 0x0018, - 0x1d18: 0x0018, 0x1d19: 0x0018, 0x1d1a: 0x0018, 0x1d1b: 0x0018, 0x1d1c: 0x0018, 0x1d1d: 0x0018, - 0x1d1e: 0x0018, 0x1d1f: 0x0018, 0x1d20: 0x0018, 0x1d21: 0x0018, 0x1d22: 0x0018, 0x1d23: 0x0018, - 0x1d24: 0x0018, 0x1d25: 0x0018, 0x1d26: 0x0018, 0x1d27: 0x0018, 0x1d28: 0x0018, 0x1d29: 0x0018, - 0x1d2a: 0xc191, 0x1d2b: 0xc1a9, 0x1d2c: 0x0040, 0x1d2d: 0x0040, 0x1d2e: 0x0040, 0x1d2f: 0x0040, - 0x1d30: 0x0018, 0x1d31: 0x0018, 0x1d32: 0x0018, 0x1d33: 0x0018, 0x1d34: 0x0018, 0x1d35: 0x0018, - 0x1d36: 0x0018, 0x1d37: 0x0018, 0x1d38: 0x0018, 0x1d39: 0x0018, 0x1d3a: 0x0018, 0x1d3b: 0x0018, - 0x1d3c: 0x0018, 0x1d3d: 0x0018, 0x1d3e: 0x0018, 0x1d3f: 0x0018, - // Block 0x75, offset 0x1d40 - 0x1d40: 0xc1d9, 0x1d41: 0xc211, 0x1d42: 0xc249, 0x1d43: 0x0040, 0x1d44: 0x0040, 0x1d45: 0x0040, - 0x1d46: 0x0040, 0x1d47: 0x0040, 0x1d48: 0x0040, 0x1d49: 0x0040, 0x1d4a: 0x0040, 0x1d4b: 0x0040, - 0x1d4c: 0x0040, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xc269, 0x1d51: 0xc289, - 0x1d52: 0xc2a9, 0x1d53: 0xc2c9, 0x1d54: 0xc2e9, 0x1d55: 0xc309, 0x1d56: 0xc329, 0x1d57: 0xc349, - 0x1d58: 0xc369, 0x1d59: 0xc389, 0x1d5a: 0xc3a9, 0x1d5b: 0xc3c9, 0x1d5c: 0xc3e9, 0x1d5d: 0xc409, - 0x1d5e: 0xc429, 0x1d5f: 0xc449, 0x1d60: 0xc469, 0x1d61: 0xc489, 0x1d62: 0xc4a9, 0x1d63: 0xc4c9, - 0x1d64: 0xc4e9, 0x1d65: 0xc509, 0x1d66: 0xc529, 0x1d67: 0xc549, 0x1d68: 0xc569, 0x1d69: 0xc589, - 0x1d6a: 0xc5a9, 0x1d6b: 0xc5c9, 0x1d6c: 0xc5e9, 0x1d6d: 0xc609, 0x1d6e: 0xc629, 0x1d6f: 0xc649, - 0x1d70: 0xc669, 0x1d71: 0xc689, 0x1d72: 0xc6a9, 0x1d73: 0xc6c9, 0x1d74: 0xc6e9, 0x1d75: 0xc709, - 0x1d76: 0xc729, 0x1d77: 0xc749, 0x1d78: 0xc769, 0x1d79: 0xc789, 0x1d7a: 0xc7a9, 0x1d7b: 0xc7c9, - 0x1d7c: 0x0040, 0x1d7d: 0x0040, 0x1d7e: 0x0040, 0x1d7f: 0x0040, - // Block 0x76, offset 0x1d80 - 0x1d80: 0xcaf9, 0x1d81: 0xcb19, 0x1d82: 0xcb39, 0x1d83: 0x8b1d, 0x1d84: 0xcb59, 0x1d85: 0xcb79, - 0x1d86: 0xcb99, 0x1d87: 0xcbb9, 0x1d88: 0xcbd9, 0x1d89: 0xcbf9, 0x1d8a: 0xcc19, 0x1d8b: 0xcc39, - 0x1d8c: 0xcc59, 0x1d8d: 0x8b3d, 0x1d8e: 0xcc79, 0x1d8f: 0xcc99, 0x1d90: 0xccb9, 0x1d91: 0xccd9, - 0x1d92: 0x8b5d, 0x1d93: 0xccf9, 0x1d94: 0xcd19, 0x1d95: 0xc429, 0x1d96: 0x8b7d, 0x1d97: 0xcd39, - 0x1d98: 0xcd59, 0x1d99: 0xcd79, 0x1d9a: 0xcd99, 0x1d9b: 0xcdb9, 0x1d9c: 0x8b9d, 0x1d9d: 0xcdd9, - 0x1d9e: 0xcdf9, 0x1d9f: 0xce19, 0x1da0: 0xce39, 0x1da1: 0xce59, 0x1da2: 0xc789, 0x1da3: 0xce79, - 0x1da4: 0xce99, 0x1da5: 0xceb9, 0x1da6: 0xced9, 0x1da7: 0xcef9, 0x1da8: 0xcf19, 0x1da9: 0xcf39, - 0x1daa: 0xcf59, 0x1dab: 0xcf79, 0x1dac: 0xcf99, 0x1dad: 0xcfb9, 0x1dae: 0xcfd9, 0x1daf: 0xcff9, - 0x1db0: 0xd019, 0x1db1: 0xd039, 0x1db2: 0xd039, 0x1db3: 0xd039, 0x1db4: 0x8bbd, 0x1db5: 0xd059, - 0x1db6: 0xd079, 0x1db7: 0xd099, 0x1db8: 0x8bdd, 0x1db9: 0xd0b9, 0x1dba: 0xd0d9, 0x1dbb: 0xd0f9, - 0x1dbc: 0xd119, 0x1dbd: 0xd139, 0x1dbe: 0xd159, 0x1dbf: 0xd179, - // Block 0x77, offset 0x1dc0 - 0x1dc0: 0xd199, 0x1dc1: 0xd1b9, 0x1dc2: 0xd1d9, 0x1dc3: 0xd1f9, 0x1dc4: 0xd219, 0x1dc5: 0xd239, - 0x1dc6: 0xd239, 0x1dc7: 0xd259, 0x1dc8: 0xd279, 0x1dc9: 0xd299, 0x1dca: 0xd2b9, 0x1dcb: 0xd2d9, - 0x1dcc: 0xd2f9, 0x1dcd: 0xd319, 0x1dce: 0xd339, 0x1dcf: 0xd359, 0x1dd0: 0xd379, 0x1dd1: 0xd399, - 0x1dd2: 0xd3b9, 0x1dd3: 0xd3d9, 0x1dd4: 0xd3f9, 0x1dd5: 0xd419, 0x1dd6: 0xd439, 0x1dd7: 0xd459, - 0x1dd8: 0xd479, 0x1dd9: 0x8bfd, 0x1dda: 0xd499, 0x1ddb: 0xd4b9, 0x1ddc: 0xd4d9, 0x1ddd: 0xc309, - 0x1dde: 0xd4f9, 0x1ddf: 0xd519, 0x1de0: 0x8c1d, 0x1de1: 0x8c3d, 0x1de2: 0xd539, 0x1de3: 0xd559, - 0x1de4: 0xd579, 0x1de5: 0xd599, 0x1de6: 0xd5b9, 0x1de7: 0xd5d9, 0x1de8: 0x0040, 0x1de9: 0xd5f9, - 0x1dea: 0xd619, 0x1deb: 0xd619, 0x1dec: 0x8c5d, 0x1ded: 0xd639, 0x1dee: 0xd659, 0x1def: 0xd679, - 0x1df0: 0xd699, 0x1df1: 0x8c7d, 0x1df2: 0xd6b9, 0x1df3: 0xd6d9, 0x1df4: 0x0040, 0x1df5: 0xd6f9, - 0x1df6: 0xd719, 0x1df7: 0xd739, 0x1df8: 0xd759, 0x1df9: 0xd779, 0x1dfa: 0xd799, 0x1dfb: 0x8c9d, - 0x1dfc: 0xd7b9, 0x1dfd: 0x8cbd, 0x1dfe: 0xd7d9, 0x1dff: 0xd7f9, - // Block 0x78, offset 0x1e00 - 0x1e00: 0xd819, 0x1e01: 0xd839, 0x1e02: 0xd859, 0x1e03: 0xd879, 0x1e04: 0xd899, 0x1e05: 0xd8b9, - 0x1e06: 0xd8d9, 0x1e07: 0xd8f9, 0x1e08: 0xd919, 0x1e09: 0x8cdd, 0x1e0a: 0xd939, 0x1e0b: 0xd959, - 0x1e0c: 0xd979, 0x1e0d: 0xd999, 0x1e0e: 0xd9b9, 0x1e0f: 0x8cfd, 0x1e10: 0xd9d9, 0x1e11: 0x8d1d, - 0x1e12: 0x8d3d, 0x1e13: 0xd9f9, 0x1e14: 0xda19, 0x1e15: 0xda19, 0x1e16: 0xda39, 0x1e17: 0x8d5d, - 0x1e18: 0x8d7d, 0x1e19: 0xda59, 0x1e1a: 0xda79, 0x1e1b: 0xda99, 0x1e1c: 0xdab9, 0x1e1d: 0xdad9, - 0x1e1e: 0xdaf9, 0x1e1f: 0xdb19, 0x1e20: 0xdb39, 0x1e21: 0xdb59, 0x1e22: 0xdb79, 0x1e23: 0xdb99, - 0x1e24: 0x8d9d, 0x1e25: 0xdbb9, 0x1e26: 0xdbd9, 0x1e27: 0xdbf9, 0x1e28: 0xdc19, 0x1e29: 0xdbf9, - 0x1e2a: 0xdc39, 0x1e2b: 0xdc59, 0x1e2c: 0xdc79, 0x1e2d: 0xdc99, 0x1e2e: 0xdcb9, 0x1e2f: 0xdcd9, - 0x1e30: 0xdcf9, 0x1e31: 0xdd19, 0x1e32: 0xdd39, 0x1e33: 0xdd59, 0x1e34: 0xdd79, 0x1e35: 0xdd99, - 0x1e36: 0xddb9, 0x1e37: 0xddd9, 0x1e38: 0x8dbd, 0x1e39: 0xddf9, 0x1e3a: 0xde19, 0x1e3b: 0xde39, - 0x1e3c: 0xde59, 0x1e3d: 0xde79, 0x1e3e: 0x8ddd, 0x1e3f: 0xde99, - // Block 0x79, offset 0x1e40 - 0x1e40: 0xe599, 0x1e41: 0xe5b9, 0x1e42: 0xe5d9, 0x1e43: 0xe5f9, 0x1e44: 0xe619, 0x1e45: 0xe639, - 0x1e46: 0x8efd, 0x1e47: 0xe659, 0x1e48: 0xe679, 0x1e49: 0xe699, 0x1e4a: 0xe6b9, 0x1e4b: 0xe6d9, - 0x1e4c: 0xe6f9, 0x1e4d: 0x8f1d, 0x1e4e: 0xe719, 0x1e4f: 0xe739, 0x1e50: 0x8f3d, 0x1e51: 0x8f5d, - 0x1e52: 0xe759, 0x1e53: 0xe779, 0x1e54: 0xe799, 0x1e55: 0xe7b9, 0x1e56: 0xe7d9, 0x1e57: 0xe7f9, - 0x1e58: 0xe819, 0x1e59: 0xe839, 0x1e5a: 0xe859, 0x1e5b: 0x8f7d, 0x1e5c: 0xe879, 0x1e5d: 0x8f9d, - 0x1e5e: 0xe899, 0x1e5f: 0x0040, 0x1e60: 0xe8b9, 0x1e61: 0xe8d9, 0x1e62: 0xe8f9, 0x1e63: 0x8fbd, - 0x1e64: 0xe919, 0x1e65: 0xe939, 0x1e66: 0x8fdd, 0x1e67: 0x8ffd, 0x1e68: 0xe959, 0x1e69: 0xe979, - 0x1e6a: 0xe999, 0x1e6b: 0xe9b9, 0x1e6c: 0xe9d9, 0x1e6d: 0xe9d9, 0x1e6e: 0xe9f9, 0x1e6f: 0xea19, - 0x1e70: 0xea39, 0x1e71: 0xea59, 0x1e72: 0xea79, 0x1e73: 0xea99, 0x1e74: 0xeab9, 0x1e75: 0x901d, - 0x1e76: 0xead9, 0x1e77: 0x903d, 0x1e78: 0xeaf9, 0x1e79: 0x905d, 0x1e7a: 0xeb19, 0x1e7b: 0x907d, - 0x1e7c: 0x909d, 0x1e7d: 0x90bd, 0x1e7e: 0xeb39, 0x1e7f: 0xeb59, - // Block 0x7a, offset 0x1e80 - 0x1e80: 0xeb79, 0x1e81: 0x90dd, 0x1e82: 0x90fd, 0x1e83: 0x911d, 0x1e84: 0x913d, 0x1e85: 0xeb99, - 0x1e86: 0xebb9, 0x1e87: 0xebb9, 0x1e88: 0xebd9, 0x1e89: 0xebf9, 0x1e8a: 0xec19, 0x1e8b: 0xec39, - 0x1e8c: 0xec59, 0x1e8d: 0x915d, 0x1e8e: 0xec79, 0x1e8f: 0xec99, 0x1e90: 0xecb9, 0x1e91: 0xecd9, - 0x1e92: 0x917d, 0x1e93: 0xecf9, 0x1e94: 0x919d, 0x1e95: 0x91bd, 0x1e96: 0xed19, 0x1e97: 0xed39, - 0x1e98: 0xed59, 0x1e99: 0xed79, 0x1e9a: 0xed99, 0x1e9b: 0xedb9, 0x1e9c: 0x91dd, 0x1e9d: 0x91fd, - 0x1e9e: 0x921d, 0x1e9f: 0x0040, 0x1ea0: 0xedd9, 0x1ea1: 0x923d, 0x1ea2: 0xedf9, 0x1ea3: 0xee19, - 0x1ea4: 0xee39, 0x1ea5: 0x925d, 0x1ea6: 0xee59, 0x1ea7: 0xee79, 0x1ea8: 0xee99, 0x1ea9: 0xeeb9, - 0x1eaa: 0xeed9, 0x1eab: 0x927d, 0x1eac: 0xeef9, 0x1ead: 0xef19, 0x1eae: 0xef39, 0x1eaf: 0xef59, - 0x1eb0: 0xef79, 0x1eb1: 0xef99, 0x1eb2: 0x929d, 0x1eb3: 0x92bd, 0x1eb4: 0xefb9, 0x1eb5: 0x92dd, - 0x1eb6: 0xefd9, 0x1eb7: 0x92fd, 0x1eb8: 0xeff9, 0x1eb9: 0xf019, 0x1eba: 0xf039, 0x1ebb: 0x931d, - 0x1ebc: 0x933d, 0x1ebd: 0xf059, 0x1ebe: 0x935d, 0x1ebf: 0xf079, - // Block 0x7b, offset 0x1ec0 - 0x1ec0: 0xf6b9, 0x1ec1: 0xf6d9, 0x1ec2: 0xf6f9, 0x1ec3: 0xf719, 0x1ec4: 0xf739, 0x1ec5: 0x951d, - 0x1ec6: 0xf759, 0x1ec7: 0xf779, 0x1ec8: 0xf799, 0x1ec9: 0xf7b9, 0x1eca: 0xf7d9, 0x1ecb: 0x953d, - 0x1ecc: 0x955d, 0x1ecd: 0xf7f9, 0x1ece: 0xf819, 0x1ecf: 0xf839, 0x1ed0: 0xf859, 0x1ed1: 0xf879, - 0x1ed2: 0xf899, 0x1ed3: 0x957d, 0x1ed4: 0xf8b9, 0x1ed5: 0xf8d9, 0x1ed6: 0xf8f9, 0x1ed7: 0xf919, - 0x1ed8: 0x959d, 0x1ed9: 0x95bd, 0x1eda: 0xf939, 0x1edb: 0xf959, 0x1edc: 0xf979, 0x1edd: 0x95dd, - 0x1ede: 0xf999, 0x1edf: 0xf9b9, 0x1ee0: 0x6815, 0x1ee1: 0x95fd, 0x1ee2: 0xf9d9, 0x1ee3: 0xf9f9, - 0x1ee4: 0xfa19, 0x1ee5: 0x961d, 0x1ee6: 0xfa39, 0x1ee7: 0xfa59, 0x1ee8: 0xfa79, 0x1ee9: 0xfa99, - 0x1eea: 0xfab9, 0x1eeb: 0xfad9, 0x1eec: 0xfaf9, 0x1eed: 0x963d, 0x1eee: 0xfb19, 0x1eef: 0xfb39, - 0x1ef0: 0xfb59, 0x1ef1: 0x965d, 0x1ef2: 0xfb79, 0x1ef3: 0xfb99, 0x1ef4: 0xfbb9, 0x1ef5: 0xfbd9, - 0x1ef6: 0x7b35, 0x1ef7: 0x967d, 0x1ef8: 0xfbf9, 0x1ef9: 0xfc19, 0x1efa: 0xfc39, 0x1efb: 0x969d, - 0x1efc: 0xfc59, 0x1efd: 0x96bd, 0x1efe: 0xfc79, 0x1eff: 0xfc79, - // Block 0x7c, offset 0x1f00 - 0x1f00: 0xfc99, 0x1f01: 0x96dd, 0x1f02: 0xfcb9, 0x1f03: 0xfcd9, 0x1f04: 0xfcf9, 0x1f05: 0xfd19, - 0x1f06: 0xfd39, 0x1f07: 0xfd59, 0x1f08: 0xfd79, 0x1f09: 0x96fd, 0x1f0a: 0xfd99, 0x1f0b: 0xfdb9, - 0x1f0c: 0xfdd9, 0x1f0d: 0xfdf9, 0x1f0e: 0xfe19, 0x1f0f: 0xfe39, 0x1f10: 0x971d, 0x1f11: 0xfe59, - 0x1f12: 0x973d, 0x1f13: 0x975d, 0x1f14: 0x977d, 0x1f15: 0xfe79, 0x1f16: 0xfe99, 0x1f17: 0xfeb9, - 0x1f18: 0xfed9, 0x1f19: 0xfef9, 0x1f1a: 0xff19, 0x1f1b: 0xff39, 0x1f1c: 0xff59, 0x1f1d: 0x979d, - 0x1f1e: 0x0040, 0x1f1f: 0x0040, 0x1f20: 0x0040, 0x1f21: 0x0040, 0x1f22: 0x0040, 0x1f23: 0x0040, - 0x1f24: 0x0040, 0x1f25: 0x0040, 0x1f26: 0x0040, 0x1f27: 0x0040, 0x1f28: 0x0040, 0x1f29: 0x0040, - 0x1f2a: 0x0040, 0x1f2b: 0x0040, 0x1f2c: 0x0040, 0x1f2d: 0x0040, 0x1f2e: 0x0040, 0x1f2f: 0x0040, - 0x1f30: 0x0040, 0x1f31: 0x0040, 0x1f32: 0x0040, 0x1f33: 0x0040, 0x1f34: 0x0040, 0x1f35: 0x0040, - 0x1f36: 0x0040, 0x1f37: 0x0040, 0x1f38: 0x0040, 0x1f39: 0x0040, 0x1f3a: 0x0040, 0x1f3b: 0x0040, - 0x1f3c: 0x0040, 0x1f3d: 0x0040, 0x1f3e: 0x0040, 0x1f3f: 0x0040, -} - -// idnaIndex: 35 blocks, 2240 entries, 4480 bytes -// Block 0 is the zero block. -var idnaIndex = [2240]uint16{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc2: 0x01, 0xc3: 0x7b, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, - 0xc8: 0x06, 0xc9: 0x7c, 0xca: 0x7d, 0xcb: 0x07, 0xcc: 0x7e, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, - 0xd0: 0x7f, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x80, 0xd6: 0x81, 0xd7: 0x82, - 0xd8: 0x0f, 0xd9: 0x83, 0xda: 0x84, 0xdb: 0x10, 0xdc: 0x11, 0xdd: 0x85, 0xde: 0x86, 0xdf: 0x87, - 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, - 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, - 0xf0: 0x1c, 0xf1: 0x1d, 0xf2: 0x1d, 0xf3: 0x1f, 0xf4: 0x20, - // Block 0x4, offset 0x100 - 0x120: 0x88, 0x121: 0x89, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x12, 0x126: 0x13, 0x127: 0x14, - 0x128: 0x15, 0x129: 0x16, 0x12a: 0x17, 0x12b: 0x18, 0x12c: 0x19, 0x12d: 0x1a, 0x12e: 0x1b, 0x12f: 0x8d, - 0x130: 0x8e, 0x131: 0x1c, 0x132: 0x1d, 0x133: 0x1e, 0x134: 0x8f, 0x135: 0x1f, 0x136: 0x90, 0x137: 0x91, - 0x138: 0x92, 0x139: 0x93, 0x13a: 0x20, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x21, 0x13e: 0x22, 0x13f: 0x96, - // Block 0x5, offset 0x140 - 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9b, 0x147: 0x9b, - 0x148: 0x9d, 0x149: 0x9e, 0x14a: 0x9f, 0x14b: 0xa0, 0x14c: 0xa1, 0x14d: 0xa2, 0x14e: 0xa3, 0x14f: 0xa4, - 0x150: 0xa5, 0x151: 0x9d, 0x152: 0x9d, 0x153: 0x9d, 0x154: 0x9d, 0x155: 0x9d, 0x156: 0x9d, 0x157: 0x9d, - 0x158: 0x9d, 0x159: 0xa6, 0x15a: 0xa7, 0x15b: 0xa8, 0x15c: 0xa9, 0x15d: 0xaa, 0x15e: 0xab, 0x15f: 0xac, - 0x160: 0xad, 0x161: 0xae, 0x162: 0xaf, 0x163: 0xb0, 0x164: 0xb1, 0x165: 0xb2, 0x166: 0xb3, 0x167: 0xb4, - 0x168: 0xb5, 0x169: 0xb6, 0x16a: 0xb7, 0x16b: 0xb8, 0x16c: 0xb9, 0x16d: 0xba, 0x16e: 0xbb, 0x16f: 0xbc, - 0x170: 0xbd, 0x171: 0xbe, 0x172: 0xbf, 0x173: 0xc0, 0x174: 0x23, 0x175: 0x24, 0x176: 0x25, 0x177: 0xc1, - 0x178: 0x26, 0x179: 0x26, 0x17a: 0x27, 0x17b: 0x26, 0x17c: 0xc2, 0x17d: 0x28, 0x17e: 0x29, 0x17f: 0x2a, - // Block 0x6, offset 0x180 - 0x180: 0x2b, 0x181: 0x2c, 0x182: 0x2d, 0x183: 0xc3, 0x184: 0x2e, 0x185: 0x2f, 0x186: 0xc4, 0x187: 0x9b, - 0x188: 0xc5, 0x189: 0xc6, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc7, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0xc8, - 0x190: 0xc9, 0x191: 0x30, 0x192: 0x31, 0x193: 0x32, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b, - 0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b, - 0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b, - 0x1a8: 0xca, 0x1a9: 0xcb, 0x1aa: 0x9b, 0x1ab: 0xcc, 0x1ac: 0x9b, 0x1ad: 0xcd, 0x1ae: 0xce, 0x1af: 0xcf, - 0x1b0: 0xd0, 0x1b1: 0x33, 0x1b2: 0x26, 0x1b3: 0x34, 0x1b4: 0xd1, 0x1b5: 0xd2, 0x1b6: 0xd3, 0x1b7: 0xd4, - 0x1b8: 0xd5, 0x1b9: 0xd6, 0x1ba: 0xd7, 0x1bb: 0xd8, 0x1bc: 0xd9, 0x1bd: 0xda, 0x1be: 0xdb, 0x1bf: 0x35, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x36, 0x1c1: 0xdc, 0x1c2: 0xdd, 0x1c3: 0xde, 0x1c4: 0xdf, 0x1c5: 0x37, 0x1c6: 0x38, 0x1c7: 0xe0, - 0x1c8: 0xe1, 0x1c9: 0x39, 0x1ca: 0x3a, 0x1cb: 0x3b, 0x1cc: 0x3c, 0x1cd: 0x3d, 0x1ce: 0x3e, 0x1cf: 0x3f, - 0x1d0: 0x9d, 0x1d1: 0x9d, 0x1d2: 0x9d, 0x1d3: 0x9d, 0x1d4: 0x9d, 0x1d5: 0x9d, 0x1d6: 0x9d, 0x1d7: 0x9d, - 0x1d8: 0x9d, 0x1d9: 0x9d, 0x1da: 0x9d, 0x1db: 0x9d, 0x1dc: 0x9d, 0x1dd: 0x9d, 0x1de: 0x9d, 0x1df: 0x9d, - 0x1e0: 0x9d, 0x1e1: 0x9d, 0x1e2: 0x9d, 0x1e3: 0x9d, 0x1e4: 0x9d, 0x1e5: 0x9d, 0x1e6: 0x9d, 0x1e7: 0x9d, - 0x1e8: 0x9d, 0x1e9: 0x9d, 0x1ea: 0x9d, 0x1eb: 0x9d, 0x1ec: 0x9d, 0x1ed: 0x9d, 0x1ee: 0x9d, 0x1ef: 0x9d, - 0x1f0: 0x9d, 0x1f1: 0x9d, 0x1f2: 0x9d, 0x1f3: 0x9d, 0x1f4: 0x9d, 0x1f5: 0x9d, 0x1f6: 0x9d, 0x1f7: 0x9d, - 0x1f8: 0x9d, 0x1f9: 0x9d, 0x1fa: 0x9d, 0x1fb: 0x9d, 0x1fc: 0x9d, 0x1fd: 0x9d, 0x1fe: 0x9d, 0x1ff: 0x9d, - // Block 0x8, offset 0x200 - 0x200: 0x9d, 0x201: 0x9d, 0x202: 0x9d, 0x203: 0x9d, 0x204: 0x9d, 0x205: 0x9d, 0x206: 0x9d, 0x207: 0x9d, - 0x208: 0x9d, 0x209: 0x9d, 0x20a: 0x9d, 0x20b: 0x9d, 0x20c: 0x9d, 0x20d: 0x9d, 0x20e: 0x9d, 0x20f: 0x9d, - 0x210: 0x9d, 0x211: 0x9d, 0x212: 0x9d, 0x213: 0x9d, 0x214: 0x9d, 0x215: 0x9d, 0x216: 0x9d, 0x217: 0x9d, - 0x218: 0x9d, 0x219: 0x9d, 0x21a: 0x9d, 0x21b: 0x9d, 0x21c: 0x9d, 0x21d: 0x9d, 0x21e: 0x9d, 0x21f: 0x9d, - 0x220: 0x9d, 0x221: 0x9d, 0x222: 0x9d, 0x223: 0x9d, 0x224: 0x9d, 0x225: 0x9d, 0x226: 0x9d, 0x227: 0x9d, - 0x228: 0x9d, 0x229: 0x9d, 0x22a: 0x9d, 0x22b: 0x9d, 0x22c: 0x9d, 0x22d: 0x9d, 0x22e: 0x9d, 0x22f: 0x9d, - 0x230: 0x9d, 0x231: 0x9d, 0x232: 0x9d, 0x233: 0x9d, 0x234: 0x9d, 0x235: 0x9d, 0x236: 0xb0, 0x237: 0x9b, - 0x238: 0x9d, 0x239: 0x9d, 0x23a: 0x9d, 0x23b: 0x9d, 0x23c: 0x9d, 0x23d: 0x9d, 0x23e: 0x9d, 0x23f: 0x9d, - // Block 0x9, offset 0x240 - 0x240: 0x9d, 0x241: 0x9d, 0x242: 0x9d, 0x243: 0x9d, 0x244: 0x9d, 0x245: 0x9d, 0x246: 0x9d, 0x247: 0x9d, - 0x248: 0x9d, 0x249: 0x9d, 0x24a: 0x9d, 0x24b: 0x9d, 0x24c: 0x9d, 0x24d: 0x9d, 0x24e: 0x9d, 0x24f: 0x9d, - 0x250: 0x9d, 0x251: 0x9d, 0x252: 0x9d, 0x253: 0x9d, 0x254: 0x9d, 0x255: 0x9d, 0x256: 0x9d, 0x257: 0x9d, - 0x258: 0x9d, 0x259: 0x9d, 0x25a: 0x9d, 0x25b: 0x9d, 0x25c: 0x9d, 0x25d: 0x9d, 0x25e: 0x9d, 0x25f: 0x9d, - 0x260: 0x9d, 0x261: 0x9d, 0x262: 0x9d, 0x263: 0x9d, 0x264: 0x9d, 0x265: 0x9d, 0x266: 0x9d, 0x267: 0x9d, - 0x268: 0x9d, 0x269: 0x9d, 0x26a: 0x9d, 0x26b: 0x9d, 0x26c: 0x9d, 0x26d: 0x9d, 0x26e: 0x9d, 0x26f: 0x9d, - 0x270: 0x9d, 0x271: 0x9d, 0x272: 0x9d, 0x273: 0x9d, 0x274: 0x9d, 0x275: 0x9d, 0x276: 0x9d, 0x277: 0x9d, - 0x278: 0x9d, 0x279: 0x9d, 0x27a: 0x9d, 0x27b: 0x9d, 0x27c: 0x9d, 0x27d: 0x9d, 0x27e: 0x9d, 0x27f: 0x9d, - // Block 0xa, offset 0x280 - 0x280: 0x9d, 0x281: 0x9d, 0x282: 0x9d, 0x283: 0x9d, 0x284: 0x9d, 0x285: 0x9d, 0x286: 0x9d, 0x287: 0x9d, - 0x288: 0x9d, 0x289: 0x9d, 0x28a: 0x9d, 0x28b: 0x9d, 0x28c: 0x9d, 0x28d: 0x9d, 0x28e: 0x9d, 0x28f: 0x9d, - 0x290: 0x9d, 0x291: 0x9d, 0x292: 0x9d, 0x293: 0x9d, 0x294: 0x9d, 0x295: 0x9d, 0x296: 0x9d, 0x297: 0x9d, - 0x298: 0x9d, 0x299: 0x9d, 0x29a: 0x9d, 0x29b: 0x9d, 0x29c: 0x9d, 0x29d: 0x9d, 0x29e: 0x9d, 0x29f: 0x9d, - 0x2a0: 0x9d, 0x2a1: 0x9d, 0x2a2: 0x9d, 0x2a3: 0x9d, 0x2a4: 0x9d, 0x2a5: 0x9d, 0x2a6: 0x9d, 0x2a7: 0x9d, - 0x2a8: 0x9d, 0x2a9: 0x9d, 0x2aa: 0x9d, 0x2ab: 0x9d, 0x2ac: 0x9d, 0x2ad: 0x9d, 0x2ae: 0x9d, 0x2af: 0x9d, - 0x2b0: 0x9d, 0x2b1: 0x9d, 0x2b2: 0x9d, 0x2b3: 0x9d, 0x2b4: 0x9d, 0x2b5: 0x9d, 0x2b6: 0x9d, 0x2b7: 0x9d, - 0x2b8: 0x9d, 0x2b9: 0x9d, 0x2ba: 0x9d, 0x2bb: 0x9d, 0x2bc: 0x9d, 0x2bd: 0x9d, 0x2be: 0x9d, 0x2bf: 0xe2, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x9d, 0x2c1: 0x9d, 0x2c2: 0x9d, 0x2c3: 0x9d, 0x2c4: 0x9d, 0x2c5: 0x9d, 0x2c6: 0x9d, 0x2c7: 0x9d, - 0x2c8: 0x9d, 0x2c9: 0x9d, 0x2ca: 0x9d, 0x2cb: 0x9d, 0x2cc: 0x9d, 0x2cd: 0x9d, 0x2ce: 0x9d, 0x2cf: 0x9d, - 0x2d0: 0x9d, 0x2d1: 0x9d, 0x2d2: 0xe3, 0x2d3: 0xe4, 0x2d4: 0x9d, 0x2d5: 0x9d, 0x2d6: 0x9d, 0x2d7: 0x9d, - 0x2d8: 0xe5, 0x2d9: 0x40, 0x2da: 0x41, 0x2db: 0xe6, 0x2dc: 0x42, 0x2dd: 0x43, 0x2de: 0x44, 0x2df: 0xe7, - 0x2e0: 0xe8, 0x2e1: 0xe9, 0x2e2: 0xea, 0x2e3: 0xeb, 0x2e4: 0xec, 0x2e5: 0xed, 0x2e6: 0xee, 0x2e7: 0xef, - 0x2e8: 0xf0, 0x2e9: 0xf1, 0x2ea: 0xf2, 0x2eb: 0xf3, 0x2ec: 0xf4, 0x2ed: 0xf5, 0x2ee: 0xf6, 0x2ef: 0xf7, - 0x2f0: 0x9d, 0x2f1: 0x9d, 0x2f2: 0x9d, 0x2f3: 0x9d, 0x2f4: 0x9d, 0x2f5: 0x9d, 0x2f6: 0x9d, 0x2f7: 0x9d, - 0x2f8: 0x9d, 0x2f9: 0x9d, 0x2fa: 0x9d, 0x2fb: 0x9d, 0x2fc: 0x9d, 0x2fd: 0x9d, 0x2fe: 0x9d, 0x2ff: 0x9d, - // Block 0xc, offset 0x300 - 0x300: 0x9d, 0x301: 0x9d, 0x302: 0x9d, 0x303: 0x9d, 0x304: 0x9d, 0x305: 0x9d, 0x306: 0x9d, 0x307: 0x9d, - 0x308: 0x9d, 0x309: 0x9d, 0x30a: 0x9d, 0x30b: 0x9d, 0x30c: 0x9d, 0x30d: 0x9d, 0x30e: 0x9d, 0x30f: 0x9d, - 0x310: 0x9d, 0x311: 0x9d, 0x312: 0x9d, 0x313: 0x9d, 0x314: 0x9d, 0x315: 0x9d, 0x316: 0x9d, 0x317: 0x9d, - 0x318: 0x9d, 0x319: 0x9d, 0x31a: 0x9d, 0x31b: 0x9d, 0x31c: 0x9d, 0x31d: 0x9d, 0x31e: 0xf8, 0x31f: 0xf9, - // Block 0xd, offset 0x340 - 0x340: 0xb8, 0x341: 0xb8, 0x342: 0xb8, 0x343: 0xb8, 0x344: 0xb8, 0x345: 0xb8, 0x346: 0xb8, 0x347: 0xb8, - 0x348: 0xb8, 0x349: 0xb8, 0x34a: 0xb8, 0x34b: 0xb8, 0x34c: 0xb8, 0x34d: 0xb8, 0x34e: 0xb8, 0x34f: 0xb8, - 0x350: 0xb8, 0x351: 0xb8, 0x352: 0xb8, 0x353: 0xb8, 0x354: 0xb8, 0x355: 0xb8, 0x356: 0xb8, 0x357: 0xb8, - 0x358: 0xb8, 0x359: 0xb8, 0x35a: 0xb8, 0x35b: 0xb8, 0x35c: 0xb8, 0x35d: 0xb8, 0x35e: 0xb8, 0x35f: 0xb8, - 0x360: 0xb8, 0x361: 0xb8, 0x362: 0xb8, 0x363: 0xb8, 0x364: 0xb8, 0x365: 0xb8, 0x366: 0xb8, 0x367: 0xb8, - 0x368: 0xb8, 0x369: 0xb8, 0x36a: 0xb8, 0x36b: 0xb8, 0x36c: 0xb8, 0x36d: 0xb8, 0x36e: 0xb8, 0x36f: 0xb8, - 0x370: 0xb8, 0x371: 0xb8, 0x372: 0xb8, 0x373: 0xb8, 0x374: 0xb8, 0x375: 0xb8, 0x376: 0xb8, 0x377: 0xb8, - 0x378: 0xb8, 0x379: 0xb8, 0x37a: 0xb8, 0x37b: 0xb8, 0x37c: 0xb8, 0x37d: 0xb8, 0x37e: 0xb8, 0x37f: 0xb8, - // Block 0xe, offset 0x380 - 0x380: 0xb8, 0x381: 0xb8, 0x382: 0xb8, 0x383: 0xb8, 0x384: 0xb8, 0x385: 0xb8, 0x386: 0xb8, 0x387: 0xb8, - 0x388: 0xb8, 0x389: 0xb8, 0x38a: 0xb8, 0x38b: 0xb8, 0x38c: 0xb8, 0x38d: 0xb8, 0x38e: 0xb8, 0x38f: 0xb8, - 0x390: 0xb8, 0x391: 0xb8, 0x392: 0xb8, 0x393: 0xb8, 0x394: 0xb8, 0x395: 0xb8, 0x396: 0xb8, 0x397: 0xb8, - 0x398: 0xb8, 0x399: 0xb8, 0x39a: 0xb8, 0x39b: 0xb8, 0x39c: 0xb8, 0x39d: 0xb8, 0x39e: 0xb8, 0x39f: 0xb8, - 0x3a0: 0xb8, 0x3a1: 0xb8, 0x3a2: 0xb8, 0x3a3: 0xb8, 0x3a4: 0xfa, 0x3a5: 0xfb, 0x3a6: 0xfc, 0x3a7: 0xfd, - 0x3a8: 0x45, 0x3a9: 0xfe, 0x3aa: 0xff, 0x3ab: 0x46, 0x3ac: 0x47, 0x3ad: 0x48, 0x3ae: 0x49, 0x3af: 0x4a, - 0x3b0: 0x100, 0x3b1: 0x4b, 0x3b2: 0x4c, 0x3b3: 0x4d, 0x3b4: 0x4e, 0x3b5: 0x4f, 0x3b6: 0x101, 0x3b7: 0x50, - 0x3b8: 0x51, 0x3b9: 0x52, 0x3ba: 0x53, 0x3bb: 0x54, 0x3bc: 0x55, 0x3bd: 0x56, 0x3be: 0x57, 0x3bf: 0x58, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x102, 0x3c1: 0x103, 0x3c2: 0x9d, 0x3c3: 0x104, 0x3c4: 0x105, 0x3c5: 0x9b, 0x3c6: 0x106, 0x3c7: 0x107, - 0x3c8: 0xb8, 0x3c9: 0xb8, 0x3ca: 0x108, 0x3cb: 0x109, 0x3cc: 0x10a, 0x3cd: 0x10b, 0x3ce: 0x10c, 0x3cf: 0x10d, - 0x3d0: 0x10e, 0x3d1: 0x9d, 0x3d2: 0x10f, 0x3d3: 0x110, 0x3d4: 0x111, 0x3d5: 0x112, 0x3d6: 0xb8, 0x3d7: 0xb8, - 0x3d8: 0x9d, 0x3d9: 0x9d, 0x3da: 0x9d, 0x3db: 0x9d, 0x3dc: 0x113, 0x3dd: 0x114, 0x3de: 0xb8, 0x3df: 0xb8, - 0x3e0: 0x115, 0x3e1: 0x116, 0x3e2: 0x117, 0x3e3: 0x118, 0x3e4: 0x119, 0x3e5: 0xb8, 0x3e6: 0x11a, 0x3e7: 0x11b, - 0x3e8: 0x11c, 0x3e9: 0x11d, 0x3ea: 0x11e, 0x3eb: 0x59, 0x3ec: 0x11f, 0x3ed: 0x120, 0x3ee: 0x5a, 0x3ef: 0xb8, - 0x3f0: 0x9d, 0x3f1: 0x121, 0x3f2: 0x122, 0x3f3: 0x123, 0x3f4: 0xb8, 0x3f5: 0xb8, 0x3f6: 0xb8, 0x3f7: 0xb8, - 0x3f8: 0xb8, 0x3f9: 0x124, 0x3fa: 0xb8, 0x3fb: 0xb8, 0x3fc: 0xb8, 0x3fd: 0xb8, 0x3fe: 0xb8, 0x3ff: 0xb8, - // Block 0x10, offset 0x400 - 0x400: 0x125, 0x401: 0x126, 0x402: 0x127, 0x403: 0x128, 0x404: 0x129, 0x405: 0x12a, 0x406: 0x12b, 0x407: 0x12c, - 0x408: 0x12d, 0x409: 0xb8, 0x40a: 0x12e, 0x40b: 0x12f, 0x40c: 0x5b, 0x40d: 0x5c, 0x40e: 0xb8, 0x40f: 0xb8, - 0x410: 0x130, 0x411: 0x131, 0x412: 0x132, 0x413: 0x133, 0x414: 0xb8, 0x415: 0xb8, 0x416: 0x134, 0x417: 0x135, - 0x418: 0x136, 0x419: 0x137, 0x41a: 0x138, 0x41b: 0x139, 0x41c: 0x13a, 0x41d: 0xb8, 0x41e: 0xb8, 0x41f: 0xb8, - 0x420: 0xb8, 0x421: 0xb8, 0x422: 0x13b, 0x423: 0x13c, 0x424: 0xb8, 0x425: 0xb8, 0x426: 0xb8, 0x427: 0xb8, - 0x428: 0xb8, 0x429: 0xb8, 0x42a: 0xb8, 0x42b: 0x13d, 0x42c: 0xb8, 0x42d: 0xb8, 0x42e: 0xb8, 0x42f: 0xb8, - 0x430: 0x13e, 0x431: 0x13f, 0x432: 0x140, 0x433: 0xb8, 0x434: 0xb8, 0x435: 0xb8, 0x436: 0xb8, 0x437: 0xb8, - 0x438: 0xb8, 0x439: 0xb8, 0x43a: 0xb8, 0x43b: 0xb8, 0x43c: 0xb8, 0x43d: 0xb8, 0x43e: 0xb8, 0x43f: 0xb8, - // Block 0x11, offset 0x440 - 0x440: 0x9d, 0x441: 0x9d, 0x442: 0x9d, 0x443: 0x9d, 0x444: 0x9d, 0x445: 0x9d, 0x446: 0x9d, 0x447: 0x9d, - 0x448: 0x9d, 0x449: 0x9d, 0x44a: 0x9d, 0x44b: 0x9d, 0x44c: 0x9d, 0x44d: 0x9d, 0x44e: 0x141, 0x44f: 0xb8, - 0x450: 0x9b, 0x451: 0x142, 0x452: 0x9d, 0x453: 0x9d, 0x454: 0x9d, 0x455: 0x143, 0x456: 0xb8, 0x457: 0xb8, - 0x458: 0xb8, 0x459: 0xb8, 0x45a: 0xb8, 0x45b: 0xb8, 0x45c: 0xb8, 0x45d: 0xb8, 0x45e: 0xb8, 0x45f: 0xb8, - 0x460: 0xb8, 0x461: 0xb8, 0x462: 0xb8, 0x463: 0xb8, 0x464: 0xb8, 0x465: 0xb8, 0x466: 0xb8, 0x467: 0xb8, - 0x468: 0xb8, 0x469: 0xb8, 0x46a: 0xb8, 0x46b: 0xb8, 0x46c: 0xb8, 0x46d: 0xb8, 0x46e: 0xb8, 0x46f: 0xb8, - 0x470: 0xb8, 0x471: 0xb8, 0x472: 0xb8, 0x473: 0xb8, 0x474: 0xb8, 0x475: 0xb8, 0x476: 0xb8, 0x477: 0xb8, - 0x478: 0xb8, 0x479: 0xb8, 0x47a: 0xb8, 0x47b: 0xb8, 0x47c: 0xb8, 0x47d: 0xb8, 0x47e: 0xb8, 0x47f: 0xb8, - // Block 0x12, offset 0x480 - 0x480: 0x9d, 0x481: 0x9d, 0x482: 0x9d, 0x483: 0x9d, 0x484: 0x9d, 0x485: 0x9d, 0x486: 0x9d, 0x487: 0x9d, - 0x488: 0x9d, 0x489: 0x9d, 0x48a: 0x9d, 0x48b: 0x9d, 0x48c: 0x9d, 0x48d: 0x9d, 0x48e: 0x9d, 0x48f: 0x9d, - 0x490: 0x144, 0x491: 0xb8, 0x492: 0xb8, 0x493: 0xb8, 0x494: 0xb8, 0x495: 0xb8, 0x496: 0xb8, 0x497: 0xb8, - 0x498: 0xb8, 0x499: 0xb8, 0x49a: 0xb8, 0x49b: 0xb8, 0x49c: 0xb8, 0x49d: 0xb8, 0x49e: 0xb8, 0x49f: 0xb8, - 0x4a0: 0xb8, 0x4a1: 0xb8, 0x4a2: 0xb8, 0x4a3: 0xb8, 0x4a4: 0xb8, 0x4a5: 0xb8, 0x4a6: 0xb8, 0x4a7: 0xb8, - 0x4a8: 0xb8, 0x4a9: 0xb8, 0x4aa: 0xb8, 0x4ab: 0xb8, 0x4ac: 0xb8, 0x4ad: 0xb8, 0x4ae: 0xb8, 0x4af: 0xb8, - 0x4b0: 0xb8, 0x4b1: 0xb8, 0x4b2: 0xb8, 0x4b3: 0xb8, 0x4b4: 0xb8, 0x4b5: 0xb8, 0x4b6: 0xb8, 0x4b7: 0xb8, - 0x4b8: 0xb8, 0x4b9: 0xb8, 0x4ba: 0xb8, 0x4bb: 0xb8, 0x4bc: 0xb8, 0x4bd: 0xb8, 0x4be: 0xb8, 0x4bf: 0xb8, - // Block 0x13, offset 0x4c0 - 0x4c0: 0xb8, 0x4c1: 0xb8, 0x4c2: 0xb8, 0x4c3: 0xb8, 0x4c4: 0xb8, 0x4c5: 0xb8, 0x4c6: 0xb8, 0x4c7: 0xb8, - 0x4c8: 0xb8, 0x4c9: 0xb8, 0x4ca: 0xb8, 0x4cb: 0xb8, 0x4cc: 0xb8, 0x4cd: 0xb8, 0x4ce: 0xb8, 0x4cf: 0xb8, - 0x4d0: 0x9d, 0x4d1: 0x9d, 0x4d2: 0x9d, 0x4d3: 0x9d, 0x4d4: 0x9d, 0x4d5: 0x9d, 0x4d6: 0x9d, 0x4d7: 0x9d, - 0x4d8: 0x9d, 0x4d9: 0x145, 0x4da: 0xb8, 0x4db: 0xb8, 0x4dc: 0xb8, 0x4dd: 0xb8, 0x4de: 0xb8, 0x4df: 0xb8, - 0x4e0: 0xb8, 0x4e1: 0xb8, 0x4e2: 0xb8, 0x4e3: 0xb8, 0x4e4: 0xb8, 0x4e5: 0xb8, 0x4e6: 0xb8, 0x4e7: 0xb8, - 0x4e8: 0xb8, 0x4e9: 0xb8, 0x4ea: 0xb8, 0x4eb: 0xb8, 0x4ec: 0xb8, 0x4ed: 0xb8, 0x4ee: 0xb8, 0x4ef: 0xb8, - 0x4f0: 0xb8, 0x4f1: 0xb8, 0x4f2: 0xb8, 0x4f3: 0xb8, 0x4f4: 0xb8, 0x4f5: 0xb8, 0x4f6: 0xb8, 0x4f7: 0xb8, - 0x4f8: 0xb8, 0x4f9: 0xb8, 0x4fa: 0xb8, 0x4fb: 0xb8, 0x4fc: 0xb8, 0x4fd: 0xb8, 0x4fe: 0xb8, 0x4ff: 0xb8, - // Block 0x14, offset 0x500 - 0x500: 0xb8, 0x501: 0xb8, 0x502: 0xb8, 0x503: 0xb8, 0x504: 0xb8, 0x505: 0xb8, 0x506: 0xb8, 0x507: 0xb8, - 0x508: 0xb8, 0x509: 0xb8, 0x50a: 0xb8, 0x50b: 0xb8, 0x50c: 0xb8, 0x50d: 0xb8, 0x50e: 0xb8, 0x50f: 0xb8, - 0x510: 0xb8, 0x511: 0xb8, 0x512: 0xb8, 0x513: 0xb8, 0x514: 0xb8, 0x515: 0xb8, 0x516: 0xb8, 0x517: 0xb8, - 0x518: 0xb8, 0x519: 0xb8, 0x51a: 0xb8, 0x51b: 0xb8, 0x51c: 0xb8, 0x51d: 0xb8, 0x51e: 0xb8, 0x51f: 0xb8, - 0x520: 0x9d, 0x521: 0x9d, 0x522: 0x9d, 0x523: 0x9d, 0x524: 0x9d, 0x525: 0x9d, 0x526: 0x9d, 0x527: 0x9d, - 0x528: 0x13d, 0x529: 0x146, 0x52a: 0xb8, 0x52b: 0x147, 0x52c: 0x148, 0x52d: 0x149, 0x52e: 0x14a, 0x52f: 0xb8, - 0x530: 0xb8, 0x531: 0xb8, 0x532: 0xb8, 0x533: 0xb8, 0x534: 0xb8, 0x535: 0xb8, 0x536: 0xb8, 0x537: 0xb8, - 0x538: 0xb8, 0x539: 0xb8, 0x53a: 0xb8, 0x53b: 0xb8, 0x53c: 0x9d, 0x53d: 0x14b, 0x53e: 0x14c, 0x53f: 0x14d, - // Block 0x15, offset 0x540 - 0x540: 0x9d, 0x541: 0x9d, 0x542: 0x9d, 0x543: 0x9d, 0x544: 0x9d, 0x545: 0x9d, 0x546: 0x9d, 0x547: 0x9d, - 0x548: 0x9d, 0x549: 0x9d, 0x54a: 0x9d, 0x54b: 0x9d, 0x54c: 0x9d, 0x54d: 0x9d, 0x54e: 0x9d, 0x54f: 0x9d, - 0x550: 0x9d, 0x551: 0x9d, 0x552: 0x9d, 0x553: 0x9d, 0x554: 0x9d, 0x555: 0x9d, 0x556: 0x9d, 0x557: 0x9d, - 0x558: 0x9d, 0x559: 0x9d, 0x55a: 0x9d, 0x55b: 0x9d, 0x55c: 0x9d, 0x55d: 0x9d, 0x55e: 0x9d, 0x55f: 0x14e, - 0x560: 0x9d, 0x561: 0x9d, 0x562: 0x9d, 0x563: 0x9d, 0x564: 0x9d, 0x565: 0x9d, 0x566: 0x9d, 0x567: 0x9d, - 0x568: 0x9d, 0x569: 0x9d, 0x56a: 0x9d, 0x56b: 0x14f, 0x56c: 0xb8, 0x56d: 0xb8, 0x56e: 0xb8, 0x56f: 0xb8, - 0x570: 0xb8, 0x571: 0xb8, 0x572: 0xb8, 0x573: 0xb8, 0x574: 0xb8, 0x575: 0xb8, 0x576: 0xb8, 0x577: 0xb8, - 0x578: 0xb8, 0x579: 0xb8, 0x57a: 0xb8, 0x57b: 0xb8, 0x57c: 0xb8, 0x57d: 0xb8, 0x57e: 0xb8, 0x57f: 0xb8, - // Block 0x16, offset 0x580 - 0x580: 0x150, 0x581: 0xb8, 0x582: 0xb8, 0x583: 0xb8, 0x584: 0xb8, 0x585: 0xb8, 0x586: 0xb8, 0x587: 0xb8, - 0x588: 0xb8, 0x589: 0xb8, 0x58a: 0xb8, 0x58b: 0xb8, 0x58c: 0xb8, 0x58d: 0xb8, 0x58e: 0xb8, 0x58f: 0xb8, - 0x590: 0xb8, 0x591: 0xb8, 0x592: 0xb8, 0x593: 0xb8, 0x594: 0xb8, 0x595: 0xb8, 0x596: 0xb8, 0x597: 0xb8, - 0x598: 0xb8, 0x599: 0xb8, 0x59a: 0xb8, 0x59b: 0xb8, 0x59c: 0xb8, 0x59d: 0xb8, 0x59e: 0xb8, 0x59f: 0xb8, - 0x5a0: 0xb8, 0x5a1: 0xb8, 0x5a2: 0xb8, 0x5a3: 0xb8, 0x5a4: 0xb8, 0x5a5: 0xb8, 0x5a6: 0xb8, 0x5a7: 0xb8, - 0x5a8: 0xb8, 0x5a9: 0xb8, 0x5aa: 0xb8, 0x5ab: 0xb8, 0x5ac: 0xb8, 0x5ad: 0xb8, 0x5ae: 0xb8, 0x5af: 0xb8, - 0x5b0: 0x9d, 0x5b1: 0x151, 0x5b2: 0x152, 0x5b3: 0xb8, 0x5b4: 0xb8, 0x5b5: 0xb8, 0x5b6: 0xb8, 0x5b7: 0xb8, - 0x5b8: 0xb8, 0x5b9: 0xb8, 0x5ba: 0xb8, 0x5bb: 0xb8, 0x5bc: 0xb8, 0x5bd: 0xb8, 0x5be: 0xb8, 0x5bf: 0xb8, - // Block 0x17, offset 0x5c0 - 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x153, 0x5c4: 0x154, 0x5c5: 0x155, 0x5c6: 0x156, 0x5c7: 0x157, - 0x5c8: 0x9b, 0x5c9: 0x158, 0x5ca: 0xb8, 0x5cb: 0xb8, 0x5cc: 0x9b, 0x5cd: 0x159, 0x5ce: 0xb8, 0x5cf: 0xb8, - 0x5d0: 0x5d, 0x5d1: 0x5e, 0x5d2: 0x5f, 0x5d3: 0x60, 0x5d4: 0x61, 0x5d5: 0x62, 0x5d6: 0x63, 0x5d7: 0x64, - 0x5d8: 0x65, 0x5d9: 0x66, 0x5da: 0x67, 0x5db: 0x68, 0x5dc: 0x69, 0x5dd: 0x6a, 0x5de: 0x6b, 0x5df: 0x6c, - 0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b, - 0x5e8: 0x15a, 0x5e9: 0x15b, 0x5ea: 0x15c, 0x5eb: 0xb8, 0x5ec: 0xb8, 0x5ed: 0xb8, 0x5ee: 0xb8, 0x5ef: 0xb8, - 0x5f0: 0xb8, 0x5f1: 0xb8, 0x5f2: 0xb8, 0x5f3: 0xb8, 0x5f4: 0xb8, 0x5f5: 0xb8, 0x5f6: 0xb8, 0x5f7: 0xb8, - 0x5f8: 0xb8, 0x5f9: 0xb8, 0x5fa: 0xb8, 0x5fb: 0xb8, 0x5fc: 0xb8, 0x5fd: 0xb8, 0x5fe: 0xb8, 0x5ff: 0xb8, - // Block 0x18, offset 0x600 - 0x600: 0x15d, 0x601: 0xb8, 0x602: 0xb8, 0x603: 0xb8, 0x604: 0xb8, 0x605: 0xb8, 0x606: 0xb8, 0x607: 0xb8, - 0x608: 0xb8, 0x609: 0xb8, 0x60a: 0xb8, 0x60b: 0xb8, 0x60c: 0xb8, 0x60d: 0xb8, 0x60e: 0xb8, 0x60f: 0xb8, - 0x610: 0xb8, 0x611: 0xb8, 0x612: 0xb8, 0x613: 0xb8, 0x614: 0xb8, 0x615: 0xb8, 0x616: 0xb8, 0x617: 0xb8, - 0x618: 0xb8, 0x619: 0xb8, 0x61a: 0xb8, 0x61b: 0xb8, 0x61c: 0xb8, 0x61d: 0xb8, 0x61e: 0xb8, 0x61f: 0xb8, - 0x620: 0x9d, 0x621: 0x9d, 0x622: 0x9d, 0x623: 0x15e, 0x624: 0x6d, 0x625: 0x15f, 0x626: 0xb8, 0x627: 0xb8, - 0x628: 0xb8, 0x629: 0xb8, 0x62a: 0xb8, 0x62b: 0xb8, 0x62c: 0xb8, 0x62d: 0xb8, 0x62e: 0xb8, 0x62f: 0xb8, - 0x630: 0xb8, 0x631: 0xb8, 0x632: 0xb8, 0x633: 0xb8, 0x634: 0xb8, 0x635: 0xb8, 0x636: 0xb8, 0x637: 0xb8, - 0x638: 0x6e, 0x639: 0x6f, 0x63a: 0x70, 0x63b: 0x160, 0x63c: 0xb8, 0x63d: 0xb8, 0x63e: 0xb8, 0x63f: 0xb8, - // Block 0x19, offset 0x640 - 0x640: 0x161, 0x641: 0x9b, 0x642: 0x162, 0x643: 0x163, 0x644: 0x71, 0x645: 0x72, 0x646: 0x164, 0x647: 0x165, - 0x648: 0x73, 0x649: 0x166, 0x64a: 0xb8, 0x64b: 0xb8, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b, - 0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b, - 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x167, 0x65c: 0x9b, 0x65d: 0x168, 0x65e: 0x9b, 0x65f: 0x169, - 0x660: 0x16a, 0x661: 0x16b, 0x662: 0x16c, 0x663: 0xb8, 0x664: 0x16d, 0x665: 0x16e, 0x666: 0x16f, 0x667: 0x170, - 0x668: 0xb8, 0x669: 0xb8, 0x66a: 0xb8, 0x66b: 0xb8, 0x66c: 0xb8, 0x66d: 0xb8, 0x66e: 0xb8, 0x66f: 0xb8, - 0x670: 0xb8, 0x671: 0xb8, 0x672: 0xb8, 0x673: 0xb8, 0x674: 0xb8, 0x675: 0xb8, 0x676: 0xb8, 0x677: 0xb8, - 0x678: 0xb8, 0x679: 0xb8, 0x67a: 0xb8, 0x67b: 0xb8, 0x67c: 0xb8, 0x67d: 0xb8, 0x67e: 0xb8, 0x67f: 0xb8, - // Block 0x1a, offset 0x680 - 0x680: 0x9d, 0x681: 0x9d, 0x682: 0x9d, 0x683: 0x9d, 0x684: 0x9d, 0x685: 0x9d, 0x686: 0x9d, 0x687: 0x9d, - 0x688: 0x9d, 0x689: 0x9d, 0x68a: 0x9d, 0x68b: 0x9d, 0x68c: 0x9d, 0x68d: 0x9d, 0x68e: 0x9d, 0x68f: 0x9d, - 0x690: 0x9d, 0x691: 0x9d, 0x692: 0x9d, 0x693: 0x9d, 0x694: 0x9d, 0x695: 0x9d, 0x696: 0x9d, 0x697: 0x9d, - 0x698: 0x9d, 0x699: 0x9d, 0x69a: 0x9d, 0x69b: 0x171, 0x69c: 0x9d, 0x69d: 0x9d, 0x69e: 0x9d, 0x69f: 0x9d, - 0x6a0: 0x9d, 0x6a1: 0x9d, 0x6a2: 0x9d, 0x6a3: 0x9d, 0x6a4: 0x9d, 0x6a5: 0x9d, 0x6a6: 0x9d, 0x6a7: 0x9d, - 0x6a8: 0x9d, 0x6a9: 0x9d, 0x6aa: 0x9d, 0x6ab: 0x9d, 0x6ac: 0x9d, 0x6ad: 0x9d, 0x6ae: 0x9d, 0x6af: 0x9d, - 0x6b0: 0x9d, 0x6b1: 0x9d, 0x6b2: 0x9d, 0x6b3: 0x9d, 0x6b4: 0x9d, 0x6b5: 0x9d, 0x6b6: 0x9d, 0x6b7: 0x9d, - 0x6b8: 0x9d, 0x6b9: 0x9d, 0x6ba: 0x9d, 0x6bb: 0x9d, 0x6bc: 0x9d, 0x6bd: 0x9d, 0x6be: 0x9d, 0x6bf: 0x9d, - // Block 0x1b, offset 0x6c0 - 0x6c0: 0x9d, 0x6c1: 0x9d, 0x6c2: 0x9d, 0x6c3: 0x9d, 0x6c4: 0x9d, 0x6c5: 0x9d, 0x6c6: 0x9d, 0x6c7: 0x9d, - 0x6c8: 0x9d, 0x6c9: 0x9d, 0x6ca: 0x9d, 0x6cb: 0x9d, 0x6cc: 0x9d, 0x6cd: 0x9d, 0x6ce: 0x9d, 0x6cf: 0x9d, - 0x6d0: 0x9d, 0x6d1: 0x9d, 0x6d2: 0x9d, 0x6d3: 0x9d, 0x6d4: 0x9d, 0x6d5: 0x9d, 0x6d6: 0x9d, 0x6d7: 0x9d, - 0x6d8: 0x9d, 0x6d9: 0x9d, 0x6da: 0x9d, 0x6db: 0x9d, 0x6dc: 0x172, 0x6dd: 0x9d, 0x6de: 0x9d, 0x6df: 0x9d, - 0x6e0: 0x173, 0x6e1: 0x9d, 0x6e2: 0x9d, 0x6e3: 0x9d, 0x6e4: 0x9d, 0x6e5: 0x9d, 0x6e6: 0x9d, 0x6e7: 0x9d, - 0x6e8: 0x9d, 0x6e9: 0x9d, 0x6ea: 0x9d, 0x6eb: 0x9d, 0x6ec: 0x9d, 0x6ed: 0x9d, 0x6ee: 0x9d, 0x6ef: 0x9d, - 0x6f0: 0x9d, 0x6f1: 0x9d, 0x6f2: 0x9d, 0x6f3: 0x9d, 0x6f4: 0x9d, 0x6f5: 0x9d, 0x6f6: 0x9d, 0x6f7: 0x9d, - 0x6f8: 0x9d, 0x6f9: 0x9d, 0x6fa: 0x9d, 0x6fb: 0x9d, 0x6fc: 0x9d, 0x6fd: 0x9d, 0x6fe: 0x9d, 0x6ff: 0x9d, - // Block 0x1c, offset 0x700 - 0x700: 0x9d, 0x701: 0x9d, 0x702: 0x9d, 0x703: 0x9d, 0x704: 0x9d, 0x705: 0x9d, 0x706: 0x9d, 0x707: 0x9d, - 0x708: 0x9d, 0x709: 0x9d, 0x70a: 0x9d, 0x70b: 0x9d, 0x70c: 0x9d, 0x70d: 0x9d, 0x70e: 0x9d, 0x70f: 0x9d, - 0x710: 0x9d, 0x711: 0x9d, 0x712: 0x9d, 0x713: 0x9d, 0x714: 0x9d, 0x715: 0x9d, 0x716: 0x9d, 0x717: 0x9d, - 0x718: 0x9d, 0x719: 0x9d, 0x71a: 0x9d, 0x71b: 0x9d, 0x71c: 0x9d, 0x71d: 0x9d, 0x71e: 0x9d, 0x71f: 0x9d, - 0x720: 0x9d, 0x721: 0x9d, 0x722: 0x9d, 0x723: 0x9d, 0x724: 0x9d, 0x725: 0x9d, 0x726: 0x9d, 0x727: 0x9d, - 0x728: 0x9d, 0x729: 0x9d, 0x72a: 0x9d, 0x72b: 0x9d, 0x72c: 0x9d, 0x72d: 0x9d, 0x72e: 0x9d, 0x72f: 0x9d, - 0x730: 0x9d, 0x731: 0x9d, 0x732: 0x9d, 0x733: 0x9d, 0x734: 0x9d, 0x735: 0x9d, 0x736: 0x9d, 0x737: 0x9d, - 0x738: 0x9d, 0x739: 0x9d, 0x73a: 0x174, 0x73b: 0xb8, 0x73c: 0xb8, 0x73d: 0xb8, 0x73e: 0xb8, 0x73f: 0xb8, - // Block 0x1d, offset 0x740 - 0x740: 0xb8, 0x741: 0xb8, 0x742: 0xb8, 0x743: 0xb8, 0x744: 0xb8, 0x745: 0xb8, 0x746: 0xb8, 0x747: 0xb8, - 0x748: 0xb8, 0x749: 0xb8, 0x74a: 0xb8, 0x74b: 0xb8, 0x74c: 0xb8, 0x74d: 0xb8, 0x74e: 0xb8, 0x74f: 0xb8, - 0x750: 0xb8, 0x751: 0xb8, 0x752: 0xb8, 0x753: 0xb8, 0x754: 0xb8, 0x755: 0xb8, 0x756: 0xb8, 0x757: 0xb8, - 0x758: 0xb8, 0x759: 0xb8, 0x75a: 0xb8, 0x75b: 0xb8, 0x75c: 0xb8, 0x75d: 0xb8, 0x75e: 0xb8, 0x75f: 0xb8, - 0x760: 0x74, 0x761: 0x75, 0x762: 0x76, 0x763: 0x175, 0x764: 0x77, 0x765: 0x78, 0x766: 0x176, 0x767: 0x79, - 0x768: 0x7a, 0x769: 0xb8, 0x76a: 0xb8, 0x76b: 0xb8, 0x76c: 0xb8, 0x76d: 0xb8, 0x76e: 0xb8, 0x76f: 0xb8, - 0x770: 0xb8, 0x771: 0xb8, 0x772: 0xb8, 0x773: 0xb8, 0x774: 0xb8, 0x775: 0xb8, 0x776: 0xb8, 0x777: 0xb8, - 0x778: 0xb8, 0x779: 0xb8, 0x77a: 0xb8, 0x77b: 0xb8, 0x77c: 0xb8, 0x77d: 0xb8, 0x77e: 0xb8, 0x77f: 0xb8, - // Block 0x1e, offset 0x780 - 0x790: 0x0d, 0x791: 0x0e, 0x792: 0x0f, 0x793: 0x10, 0x794: 0x11, 0x795: 0x0b, 0x796: 0x12, 0x797: 0x07, - 0x798: 0x13, 0x799: 0x0b, 0x79a: 0x0b, 0x79b: 0x14, 0x79c: 0x0b, 0x79d: 0x15, 0x79e: 0x16, 0x79f: 0x17, - 0x7a0: 0x07, 0x7a1: 0x07, 0x7a2: 0x07, 0x7a3: 0x07, 0x7a4: 0x07, 0x7a5: 0x07, 0x7a6: 0x07, 0x7a7: 0x07, - 0x7a8: 0x07, 0x7a9: 0x07, 0x7aa: 0x18, 0x7ab: 0x19, 0x7ac: 0x1a, 0x7ad: 0x0b, 0x7ae: 0x0b, 0x7af: 0x1b, - 0x7b0: 0x0b, 0x7b1: 0x0b, 0x7b2: 0x0b, 0x7b3: 0x0b, 0x7b4: 0x0b, 0x7b5: 0x0b, 0x7b6: 0x0b, 0x7b7: 0x0b, - 0x7b8: 0x0b, 0x7b9: 0x0b, 0x7ba: 0x0b, 0x7bb: 0x0b, 0x7bc: 0x0b, 0x7bd: 0x0b, 0x7be: 0x0b, 0x7bf: 0x0b, - // Block 0x1f, offset 0x7c0 - 0x7c0: 0x0b, 0x7c1: 0x0b, 0x7c2: 0x0b, 0x7c3: 0x0b, 0x7c4: 0x0b, 0x7c5: 0x0b, 0x7c6: 0x0b, 0x7c7: 0x0b, - 0x7c8: 0x0b, 0x7c9: 0x0b, 0x7ca: 0x0b, 0x7cb: 0x0b, 0x7cc: 0x0b, 0x7cd: 0x0b, 0x7ce: 0x0b, 0x7cf: 0x0b, - 0x7d0: 0x0b, 0x7d1: 0x0b, 0x7d2: 0x0b, 0x7d3: 0x0b, 0x7d4: 0x0b, 0x7d5: 0x0b, 0x7d6: 0x0b, 0x7d7: 0x0b, - 0x7d8: 0x0b, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x0b, 0x7dc: 0x0b, 0x7dd: 0x0b, 0x7de: 0x0b, 0x7df: 0x0b, - 0x7e0: 0x0b, 0x7e1: 0x0b, 0x7e2: 0x0b, 0x7e3: 0x0b, 0x7e4: 0x0b, 0x7e5: 0x0b, 0x7e6: 0x0b, 0x7e7: 0x0b, - 0x7e8: 0x0b, 0x7e9: 0x0b, 0x7ea: 0x0b, 0x7eb: 0x0b, 0x7ec: 0x0b, 0x7ed: 0x0b, 0x7ee: 0x0b, 0x7ef: 0x0b, - 0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b, - 0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b, - // Block 0x20, offset 0x800 - 0x800: 0x177, 0x801: 0x178, 0x802: 0xb8, 0x803: 0xb8, 0x804: 0x179, 0x805: 0x179, 0x806: 0x179, 0x807: 0x17a, - 0x808: 0xb8, 0x809: 0xb8, 0x80a: 0xb8, 0x80b: 0xb8, 0x80c: 0xb8, 0x80d: 0xb8, 0x80e: 0xb8, 0x80f: 0xb8, - 0x810: 0xb8, 0x811: 0xb8, 0x812: 0xb8, 0x813: 0xb8, 0x814: 0xb8, 0x815: 0xb8, 0x816: 0xb8, 0x817: 0xb8, - 0x818: 0xb8, 0x819: 0xb8, 0x81a: 0xb8, 0x81b: 0xb8, 0x81c: 0xb8, 0x81d: 0xb8, 0x81e: 0xb8, 0x81f: 0xb8, - 0x820: 0xb8, 0x821: 0xb8, 0x822: 0xb8, 0x823: 0xb8, 0x824: 0xb8, 0x825: 0xb8, 0x826: 0xb8, 0x827: 0xb8, - 0x828: 0xb8, 0x829: 0xb8, 0x82a: 0xb8, 0x82b: 0xb8, 0x82c: 0xb8, 0x82d: 0xb8, 0x82e: 0xb8, 0x82f: 0xb8, - 0x830: 0xb8, 0x831: 0xb8, 0x832: 0xb8, 0x833: 0xb8, 0x834: 0xb8, 0x835: 0xb8, 0x836: 0xb8, 0x837: 0xb8, - 0x838: 0xb8, 0x839: 0xb8, 0x83a: 0xb8, 0x83b: 0xb8, 0x83c: 0xb8, 0x83d: 0xb8, 0x83e: 0xb8, 0x83f: 0xb8, - // Block 0x21, offset 0x840 - 0x840: 0x0b, 0x841: 0x0b, 0x842: 0x0b, 0x843: 0x0b, 0x844: 0x0b, 0x845: 0x0b, 0x846: 0x0b, 0x847: 0x0b, - 0x848: 0x0b, 0x849: 0x0b, 0x84a: 0x0b, 0x84b: 0x0b, 0x84c: 0x0b, 0x84d: 0x0b, 0x84e: 0x0b, 0x84f: 0x0b, - 0x850: 0x0b, 0x851: 0x0b, 0x852: 0x0b, 0x853: 0x0b, 0x854: 0x0b, 0x855: 0x0b, 0x856: 0x0b, 0x857: 0x0b, - 0x858: 0x0b, 0x859: 0x0b, 0x85a: 0x0b, 0x85b: 0x0b, 0x85c: 0x0b, 0x85d: 0x0b, 0x85e: 0x0b, 0x85f: 0x0b, - 0x860: 0x1e, 0x861: 0x0b, 0x862: 0x0b, 0x863: 0x0b, 0x864: 0x0b, 0x865: 0x0b, 0x866: 0x0b, 0x867: 0x0b, - 0x868: 0x0b, 0x869: 0x0b, 0x86a: 0x0b, 0x86b: 0x0b, 0x86c: 0x0b, 0x86d: 0x0b, 0x86e: 0x0b, 0x86f: 0x0b, - 0x870: 0x0b, 0x871: 0x0b, 0x872: 0x0b, 0x873: 0x0b, 0x874: 0x0b, 0x875: 0x0b, 0x876: 0x0b, 0x877: 0x0b, - 0x878: 0x0b, 0x879: 0x0b, 0x87a: 0x0b, 0x87b: 0x0b, 0x87c: 0x0b, 0x87d: 0x0b, 0x87e: 0x0b, 0x87f: 0x0b, - // Block 0x22, offset 0x880 - 0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b, - 0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b, -} - -// idnaSparseOffset: 256 entries, 512 bytes -var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x5c, 0x60, 0x6f, 0x74, 0x7b, 0x87, 0x95, 0xa3, 0xa8, 0xb1, 0xc1, 0xcf, 0xdc, 0xe8, 0xf9, 0x103, 0x10a, 0x117, 0x128, 0x12f, 0x13a, 0x149, 0x157, 0x161, 0x163, 0x167, 0x169, 0x175, 0x180, 0x188, 0x18e, 0x194, 0x199, 0x19e, 0x1a1, 0x1a5, 0x1ab, 0x1b0, 0x1bc, 0x1c6, 0x1cc, 0x1dd, 0x1e7, 0x1ea, 0x1f2, 0x1f5, 0x202, 0x20a, 0x20e, 0x215, 0x21d, 0x22d, 0x239, 0x23b, 0x245, 0x251, 0x25d, 0x269, 0x271, 0x276, 0x280, 0x291, 0x295, 0x2a0, 0x2a4, 0x2ad, 0x2b5, 0x2bb, 0x2c0, 0x2c3, 0x2c6, 0x2ca, 0x2d0, 0x2d4, 0x2d8, 0x2de, 0x2e5, 0x2eb, 0x2f3, 0x2fa, 0x305, 0x30f, 0x313, 0x316, 0x31c, 0x320, 0x322, 0x325, 0x327, 0x32a, 0x334, 0x337, 0x346, 0x34a, 0x34f, 0x352, 0x356, 0x35b, 0x360, 0x366, 0x36c, 0x37b, 0x381, 0x385, 0x394, 0x399, 0x3a1, 0x3ab, 0x3b6, 0x3be, 0x3cf, 0x3d8, 0x3e8, 0x3f5, 0x3ff, 0x404, 0x411, 0x415, 0x41a, 0x41c, 0x420, 0x422, 0x426, 0x42f, 0x435, 0x439, 0x449, 0x453, 0x458, 0x45b, 0x461, 0x468, 0x46d, 0x471, 0x477, 0x47c, 0x485, 0x48a, 0x490, 0x497, 0x49e, 0x4a5, 0x4a9, 0x4ae, 0x4b1, 0x4b6, 0x4c2, 0x4c8, 0x4cd, 0x4d4, 0x4dc, 0x4e1, 0x4e5, 0x4f5, 0x4fc, 0x500, 0x504, 0x50b, 0x50e, 0x511, 0x515, 0x519, 0x51f, 0x528, 0x534, 0x53b, 0x544, 0x54c, 0x553, 0x561, 0x56e, 0x57b, 0x584, 0x588, 0x596, 0x59e, 0x5a9, 0x5b2, 0x5b8, 0x5c0, 0x5c9, 0x5d3, 0x5d6, 0x5e2, 0x5e5, 0x5ea, 0x5ed, 0x5f7, 0x600, 0x60c, 0x60f, 0x614, 0x617, 0x61a, 0x61d, 0x624, 0x62b, 0x62f, 0x63a, 0x63d, 0x643, 0x648, 0x64c, 0x64f, 0x652, 0x655, 0x65a, 0x664, 0x667, 0x66b, 0x67a, 0x686, 0x68a, 0x68f, 0x694, 0x698, 0x69d, 0x6a6, 0x6b1, 0x6b7, 0x6bf, 0x6c3, 0x6c7, 0x6cd, 0x6d3, 0x6d8, 0x6db, 0x6e9, 0x6f0, 0x6f3, 0x6f6, 0x6fa, 0x700, 0x705, 0x70f, 0x714, 0x717, 0x71a, 0x71d, 0x720, 0x724, 0x727, 0x737, 0x748, 0x74d, 0x74f, 0x751} - -// idnaSparseValues: 1876 entries, 7504 bytes -var idnaSparseValues = [1876]valueRange{ - // Block 0x0, offset 0x0 - {value: 0x0000, lo: 0x07}, - {value: 0xe105, lo: 0x80, hi: 0x96}, - {value: 0x0018, lo: 0x97, hi: 0x97}, - {value: 0xe105, lo: 0x98, hi: 0x9e}, - {value: 0x001f, lo: 0x9f, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xb7}, - {value: 0x0008, lo: 0xb8, hi: 0xbf}, - // Block 0x1, offset 0x8 - {value: 0x0000, lo: 0x10}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0xe01d, lo: 0x81, hi: 0x81}, - {value: 0x0008, lo: 0x82, hi: 0x82}, - {value: 0x0335, lo: 0x83, hi: 0x83}, - {value: 0x034d, lo: 0x84, hi: 0x84}, - {value: 0x0365, lo: 0x85, hi: 0x85}, - {value: 0xe00d, lo: 0x86, hi: 0x86}, - {value: 0x0008, lo: 0x87, hi: 0x87}, - {value: 0xe00d, lo: 0x88, hi: 0x88}, - {value: 0x0008, lo: 0x89, hi: 0x89}, - {value: 0xe00d, lo: 0x8a, hi: 0x8a}, - {value: 0x0008, lo: 0x8b, hi: 0x8b}, - {value: 0xe00d, lo: 0x8c, hi: 0x8c}, - {value: 0x0008, lo: 0x8d, hi: 0x8d}, - {value: 0xe00d, lo: 0x8e, hi: 0x8e}, - {value: 0x0008, lo: 0x8f, hi: 0xbf}, - // Block 0x2, offset 0x19 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x0249, lo: 0xb0, hi: 0xb0}, - {value: 0x037d, lo: 0xb1, hi: 0xb1}, - {value: 0x0259, lo: 0xb2, hi: 0xb2}, - {value: 0x0269, lo: 0xb3, hi: 0xb3}, - {value: 0x034d, lo: 0xb4, hi: 0xb4}, - {value: 0x0395, lo: 0xb5, hi: 0xb5}, - {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, - {value: 0x0279, lo: 0xb7, hi: 0xb7}, - {value: 0x0289, lo: 0xb8, hi: 0xb8}, - {value: 0x0008, lo: 0xb9, hi: 0xbf}, - // Block 0x3, offset 0x25 - {value: 0x0000, lo: 0x01}, - {value: 0x1308, lo: 0x80, hi: 0xbf}, - // Block 0x4, offset 0x27 - {value: 0x0000, lo: 0x04}, - {value: 0x03f5, lo: 0x80, hi: 0x8f}, - {value: 0xe105, lo: 0x90, hi: 0x9f}, - {value: 0x049d, lo: 0xa0, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x5, offset 0x2c - {value: 0x0000, lo: 0x07}, - {value: 0xe185, lo: 0x80, hi: 0x8f}, - {value: 0x0545, lo: 0x90, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x98}, - {value: 0x0008, lo: 0x99, hi: 0x99}, - {value: 0x0018, lo: 0x9a, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xa0}, - {value: 0x0008, lo: 0xa1, hi: 0xbf}, - // Block 0x6, offset 0x34 - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0401, lo: 0x87, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x88}, - {value: 0x0018, lo: 0x89, hi: 0x8a}, - {value: 0x0040, lo: 0x8b, hi: 0x8c}, - {value: 0x0018, lo: 0x8d, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0x90}, - {value: 0x1308, lo: 0x91, hi: 0xbd}, - {value: 0x0018, lo: 0xbe, hi: 0xbe}, - {value: 0x1308, lo: 0xbf, hi: 0xbf}, - // Block 0x7, offset 0x3f - {value: 0x0000, lo: 0x0b}, - {value: 0x0018, lo: 0x80, hi: 0x80}, - {value: 0x1308, lo: 0x81, hi: 0x82}, - {value: 0x0018, lo: 0x83, hi: 0x83}, - {value: 0x1308, lo: 0x84, hi: 0x85}, - {value: 0x0018, lo: 0x86, hi: 0x86}, - {value: 0x1308, lo: 0x87, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xaa}, - {value: 0x0040, lo: 0xab, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0x8, offset 0x4b - {value: 0x0000, lo: 0x10}, - {value: 0x0018, lo: 0x80, hi: 0x80}, - {value: 0x0208, lo: 0x81, hi: 0x87}, - {value: 0x0408, lo: 0x88, hi: 0x88}, - {value: 0x0208, lo: 0x89, hi: 0x8a}, - {value: 0x1308, lo: 0x8b, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa9}, - {value: 0x0018, lo: 0xaa, hi: 0xad}, - {value: 0x0208, lo: 0xae, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb0}, - {value: 0x0408, lo: 0xb1, hi: 0xb3}, - {value: 0x0008, lo: 0xb4, hi: 0xb4}, - {value: 0x0429, lo: 0xb5, hi: 0xb5}, - {value: 0x0451, lo: 0xb6, hi: 0xb6}, - {value: 0x0479, lo: 0xb7, hi: 0xb7}, - {value: 0x04a1, lo: 0xb8, hi: 0xb8}, - {value: 0x0208, lo: 0xb9, hi: 0xbf}, - // Block 0x9, offset 0x5c - {value: 0x0000, lo: 0x03}, - {value: 0x0208, lo: 0x80, hi: 0x87}, - {value: 0x0408, lo: 0x88, hi: 0x99}, - {value: 0x0208, lo: 0x9a, hi: 0xbf}, - // Block 0xa, offset 0x60 - {value: 0x0000, lo: 0x0e}, - {value: 0x1308, lo: 0x80, hi: 0x8a}, - {value: 0x0040, lo: 0x8b, hi: 0x8c}, - {value: 0x0408, lo: 0x8d, hi: 0x8d}, - {value: 0x0208, lo: 0x8e, hi: 0x98}, - {value: 0x0408, lo: 0x99, hi: 0x9b}, - {value: 0x0208, lo: 0x9c, hi: 0xaa}, - {value: 0x0408, lo: 0xab, hi: 0xac}, - {value: 0x0208, lo: 0xad, hi: 0xb0}, - {value: 0x0408, lo: 0xb1, hi: 0xb1}, - {value: 0x0208, lo: 0xb2, hi: 0xb2}, - {value: 0x0408, lo: 0xb3, hi: 0xb4}, - {value: 0x0208, lo: 0xb5, hi: 0xb7}, - {value: 0x0408, lo: 0xb8, hi: 0xb9}, - {value: 0x0208, lo: 0xba, hi: 0xbf}, - // Block 0xb, offset 0x6f - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xa5}, - {value: 0x1308, lo: 0xa6, hi: 0xb0}, - {value: 0x0008, lo: 0xb1, hi: 0xb1}, - {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0xc, offset 0x74 - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0208, lo: 0x8a, hi: 0xaa}, - {value: 0x1308, lo: 0xab, hi: 0xb3}, - {value: 0x0008, lo: 0xb4, hi: 0xb5}, - {value: 0x0018, lo: 0xb6, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0xd, offset 0x7b - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x1308, lo: 0x96, hi: 0x99}, - {value: 0x0008, lo: 0x9a, hi: 0x9a}, - {value: 0x1308, lo: 0x9b, hi: 0xa3}, - {value: 0x0008, lo: 0xa4, hi: 0xa4}, - {value: 0x1308, lo: 0xa5, hi: 0xa7}, - {value: 0x0008, lo: 0xa8, hi: 0xa8}, - {value: 0x1308, lo: 0xa9, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xe, offset 0x87 - {value: 0x0000, lo: 0x0d}, - {value: 0x0408, lo: 0x80, hi: 0x80}, - {value: 0x0208, lo: 0x81, hi: 0x85}, - {value: 0x0408, lo: 0x86, hi: 0x87}, - {value: 0x0208, lo: 0x88, hi: 0x88}, - {value: 0x0408, lo: 0x89, hi: 0x89}, - {value: 0x0208, lo: 0x8a, hi: 0x93}, - {value: 0x0408, lo: 0x94, hi: 0x94}, - {value: 0x0208, lo: 0x95, hi: 0x95}, - {value: 0x0008, lo: 0x96, hi: 0x98}, - {value: 0x1308, lo: 0x99, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0xbf}, - // Block 0xf, offset 0x95 - {value: 0x0000, lo: 0x0d}, - {value: 0x0040, lo: 0x80, hi: 0x9f}, - {value: 0x0208, lo: 0xa0, hi: 0xa9}, - {value: 0x0408, lo: 0xaa, hi: 0xac}, - {value: 0x0008, lo: 0xad, hi: 0xad}, - {value: 0x0408, lo: 0xae, hi: 0xae}, - {value: 0x0208, lo: 0xaf, hi: 0xb0}, - {value: 0x0408, lo: 0xb1, hi: 0xb2}, - {value: 0x0208, lo: 0xb3, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xb5}, - {value: 0x0208, lo: 0xb6, hi: 0xb8}, - {value: 0x0408, lo: 0xb9, hi: 0xb9}, - {value: 0x0208, lo: 0xba, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x10, offset 0xa3 - {value: 0x0000, lo: 0x04}, - {value: 0x0040, lo: 0x80, hi: 0x93}, - {value: 0x1308, lo: 0x94, hi: 0xa1}, - {value: 0x0040, lo: 0xa2, hi: 0xa2}, - {value: 0x1308, lo: 0xa3, hi: 0xbf}, - // Block 0x11, offset 0xa8 - {value: 0x0000, lo: 0x08}, - {value: 0x1308, lo: 0x80, hi: 0x82}, - {value: 0x1008, lo: 0x83, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0xb9}, - {value: 0x1308, lo: 0xba, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbb}, - {value: 0x1308, lo: 0xbc, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbf}, - // Block 0x12, offset 0xb1 - {value: 0x0000, lo: 0x0f}, - {value: 0x1308, lo: 0x80, hi: 0x80}, - {value: 0x1008, lo: 0x81, hi: 0x82}, - {value: 0x0040, lo: 0x83, hi: 0x85}, - {value: 0x1008, lo: 0x86, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x1008, lo: 0x8a, hi: 0x8c}, - {value: 0x1b08, lo: 0x8d, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x96}, - {value: 0x1008, lo: 0x97, hi: 0x97}, - {value: 0x0040, lo: 0x98, hi: 0xa5}, - {value: 0x0008, lo: 0xa6, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x13, offset 0xc1 - {value: 0x0000, lo: 0x0d}, - {value: 0x1308, lo: 0x80, hi: 0x80}, - {value: 0x1008, lo: 0x81, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0x8c}, - {value: 0x0040, lo: 0x8d, hi: 0x8d}, - {value: 0x0008, lo: 0x8e, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x91}, - {value: 0x0008, lo: 0x92, hi: 0xa8}, - {value: 0x0040, lo: 0xa9, hi: 0xa9}, - {value: 0x0008, lo: 0xaa, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbd}, - {value: 0x1308, lo: 0xbe, hi: 0xbf}, - // Block 0x14, offset 0xcf - {value: 0x0000, lo: 0x0c}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x1308, lo: 0x81, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0x8c}, - {value: 0x0040, lo: 0x8d, hi: 0x8d}, - {value: 0x0008, lo: 0x8e, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x91}, - {value: 0x0008, lo: 0x92, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbf}, - // Block 0x15, offset 0xdc - {value: 0x0000, lo: 0x0b}, - {value: 0x0040, lo: 0x80, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x99}, - {value: 0x0008, lo: 0x9a, hi: 0xb1}, - {value: 0x0040, lo: 0xb2, hi: 0xb2}, - {value: 0x0008, lo: 0xb3, hi: 0xbb}, - {value: 0x0040, lo: 0xbc, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x16, offset 0xe8 - {value: 0x0000, lo: 0x10}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x89}, - {value: 0x1b08, lo: 0x8a, hi: 0x8a}, - {value: 0x0040, lo: 0x8b, hi: 0x8e}, - {value: 0x1008, lo: 0x8f, hi: 0x91}, - {value: 0x1308, lo: 0x92, hi: 0x94}, - {value: 0x0040, lo: 0x95, hi: 0x95}, - {value: 0x1308, lo: 0x96, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x97}, - {value: 0x1008, lo: 0x98, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xa5}, - {value: 0x0008, lo: 0xa6, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xb1}, - {value: 0x1008, lo: 0xb2, hi: 0xb3}, - {value: 0x0018, lo: 0xb4, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0x17, offset 0xf9 - {value: 0x0000, lo: 0x09}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0xb0}, - {value: 0x1308, lo: 0xb1, hi: 0xb1}, - {value: 0x0008, lo: 0xb2, hi: 0xb2}, - {value: 0x08f1, lo: 0xb3, hi: 0xb3}, - {value: 0x1308, lo: 0xb4, hi: 0xb9}, - {value: 0x1b08, lo: 0xba, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbe}, - {value: 0x0018, lo: 0xbf, hi: 0xbf}, - // Block 0x18, offset 0x103 - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x1308, lo: 0x87, hi: 0x8e}, - {value: 0x0018, lo: 0x8f, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0018, lo: 0x9a, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0xbf}, - // Block 0x19, offset 0x10a - {value: 0x0000, lo: 0x0c}, - {value: 0x0008, lo: 0x80, hi: 0x84}, - {value: 0x0040, lo: 0x85, hi: 0x85}, - {value: 0x0008, lo: 0x86, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x87}, - {value: 0x1308, lo: 0x88, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9b}, - {value: 0x0961, lo: 0x9c, hi: 0x9c}, - {value: 0x0999, lo: 0x9d, hi: 0x9d}, - {value: 0x0008, lo: 0x9e, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0x1a, offset 0x117 - {value: 0x0000, lo: 0x10}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x8a}, - {value: 0x0008, lo: 0x8b, hi: 0x8b}, - {value: 0xe03d, lo: 0x8c, hi: 0x8c}, - {value: 0x0018, lo: 0x8d, hi: 0x97}, - {value: 0x1308, lo: 0x98, hi: 0x99}, - {value: 0x0018, lo: 0x9a, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa9}, - {value: 0x0018, lo: 0xaa, hi: 0xb4}, - {value: 0x1308, lo: 0xb5, hi: 0xb5}, - {value: 0x0018, lo: 0xb6, hi: 0xb6}, - {value: 0x1308, lo: 0xb7, hi: 0xb7}, - {value: 0x0018, lo: 0xb8, hi: 0xb8}, - {value: 0x1308, lo: 0xb9, hi: 0xb9}, - {value: 0x0018, lo: 0xba, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbf}, - // Block 0x1b, offset 0x128 - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x85}, - {value: 0x1308, lo: 0x86, hi: 0x86}, - {value: 0x0018, lo: 0x87, hi: 0x8c}, - {value: 0x0040, lo: 0x8d, hi: 0x8d}, - {value: 0x0018, lo: 0x8e, hi: 0x9a}, - {value: 0x0040, lo: 0x9b, hi: 0xbf}, - // Block 0x1c, offset 0x12f - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0xaa}, - {value: 0x1008, lo: 0xab, hi: 0xac}, - {value: 0x1308, lo: 0xad, hi: 0xb0}, - {value: 0x1008, lo: 0xb1, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb7}, - {value: 0x1008, lo: 0xb8, hi: 0xb8}, - {value: 0x1b08, lo: 0xb9, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbc}, - {value: 0x1308, lo: 0xbd, hi: 0xbe}, - {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0x1d, offset 0x13a - {value: 0x0000, lo: 0x0e}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0018, lo: 0x8a, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x95}, - {value: 0x1008, lo: 0x96, hi: 0x97}, - {value: 0x1308, lo: 0x98, hi: 0x99}, - {value: 0x0008, lo: 0x9a, hi: 0x9d}, - {value: 0x1308, lo: 0x9e, hi: 0xa0}, - {value: 0x0008, lo: 0xa1, hi: 0xa1}, - {value: 0x1008, lo: 0xa2, hi: 0xa4}, - {value: 0x0008, lo: 0xa5, hi: 0xa6}, - {value: 0x1008, lo: 0xa7, hi: 0xad}, - {value: 0x0008, lo: 0xae, hi: 0xb0}, - {value: 0x1308, lo: 0xb1, hi: 0xb4}, - {value: 0x0008, lo: 0xb5, hi: 0xbf}, - // Block 0x1e, offset 0x149 - {value: 0x0000, lo: 0x0d}, - {value: 0x0008, lo: 0x80, hi: 0x81}, - {value: 0x1308, lo: 0x82, hi: 0x82}, - {value: 0x1008, lo: 0x83, hi: 0x84}, - {value: 0x1308, lo: 0x85, hi: 0x86}, - {value: 0x1008, lo: 0x87, hi: 0x8c}, - {value: 0x1308, lo: 0x8d, hi: 0x8d}, - {value: 0x0008, lo: 0x8e, hi: 0x8e}, - {value: 0x1008, lo: 0x8f, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x1008, lo: 0x9a, hi: 0x9c}, - {value: 0x1308, lo: 0x9d, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0x1f, offset 0x157 - {value: 0x0000, lo: 0x09}, - {value: 0x0040, lo: 0x80, hi: 0x86}, - {value: 0x055d, lo: 0x87, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8c}, - {value: 0x055d, lo: 0x8d, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xba}, - {value: 0x0018, lo: 0xbb, hi: 0xbb}, - {value: 0xe105, lo: 0xbc, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbf}, - // Block 0x20, offset 0x161 - {value: 0x0000, lo: 0x01}, - {value: 0x0018, lo: 0x80, hi: 0xbf}, - // Block 0x21, offset 0x163 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0xa0}, - {value: 0x0018, lo: 0xa1, hi: 0xbf}, - // Block 0x22, offset 0x167 - {value: 0x0000, lo: 0x01}, - {value: 0x0008, lo: 0x80, hi: 0xbf}, - // Block 0x23, offset 0x169 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0008, lo: 0x8a, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0x98}, - {value: 0x0040, lo: 0x99, hi: 0x99}, - {value: 0x0008, lo: 0x9a, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x24, offset 0x175 - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0008, lo: 0x8a, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xb0}, - {value: 0x0040, lo: 0xb1, hi: 0xb1}, - {value: 0x0008, lo: 0xb2, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xb7}, - {value: 0x0008, lo: 0xb8, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x25, offset 0x180 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x0040, lo: 0x81, hi: 0x81}, - {value: 0x0008, lo: 0x82, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x87}, - {value: 0x0008, lo: 0x88, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0xbf}, - // Block 0x26, offset 0x188 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x91}, - {value: 0x0008, lo: 0x92, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0xbf}, - // Block 0x27, offset 0x18e - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x9a}, - {value: 0x0040, lo: 0x9b, hi: 0x9c}, - {value: 0x1308, lo: 0x9d, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x28, offset 0x194 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x29, offset 0x199 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xb7}, - {value: 0xe045, lo: 0xb8, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x2a, offset 0x19e - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0xbf}, - // Block 0x2b, offset 0x1a1 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xac}, - {value: 0x0018, lo: 0xad, hi: 0xae}, - {value: 0x0008, lo: 0xaf, hi: 0xbf}, - // Block 0x2c, offset 0x1a5 - {value: 0x0000, lo: 0x05}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0x9c}, - {value: 0x0040, lo: 0x9d, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x2d, offset 0x1ab - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xaa}, - {value: 0x0018, lo: 0xab, hi: 0xb0}, - {value: 0x0008, lo: 0xb1, hi: 0xb8}, - {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0x2e, offset 0x1b0 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x8c}, - {value: 0x0040, lo: 0x8d, hi: 0x8d}, - {value: 0x0008, lo: 0x8e, hi: 0x91}, - {value: 0x1308, lo: 0x92, hi: 0x93}, - {value: 0x1b08, lo: 0x94, hi: 0x94}, - {value: 0x0040, lo: 0x95, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb3}, - {value: 0x1b08, lo: 0xb4, hi: 0xb4}, - {value: 0x0018, lo: 0xb5, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x2f, offset 0x1bc - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x91}, - {value: 0x1308, lo: 0x92, hi: 0x93}, - {value: 0x0040, lo: 0x94, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xad}, - {value: 0x0008, lo: 0xae, hi: 0xb0}, - {value: 0x0040, lo: 0xb1, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xbf}, - // Block 0x30, offset 0x1c6 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0xb3}, - {value: 0x1340, lo: 0xb4, hi: 0xb5}, - {value: 0x1008, lo: 0xb6, hi: 0xb6}, - {value: 0x1308, lo: 0xb7, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbf}, - // Block 0x31, offset 0x1cc - {value: 0x0000, lo: 0x10}, - {value: 0x1008, lo: 0x80, hi: 0x85}, - {value: 0x1308, lo: 0x86, hi: 0x86}, - {value: 0x1008, lo: 0x87, hi: 0x88}, - {value: 0x1308, lo: 0x89, hi: 0x91}, - {value: 0x1b08, lo: 0x92, hi: 0x92}, - {value: 0x1308, lo: 0x93, hi: 0x93}, - {value: 0x0018, lo: 0x94, hi: 0x96}, - {value: 0x0008, lo: 0x97, hi: 0x97}, - {value: 0x0018, lo: 0x98, hi: 0x9b}, - {value: 0x0008, lo: 0x9c, hi: 0x9c}, - {value: 0x1308, lo: 0x9d, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa9}, - {value: 0x0040, lo: 0xaa, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x32, offset 0x1dd - {value: 0x0000, lo: 0x09}, - {value: 0x0018, lo: 0x80, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x86}, - {value: 0x0218, lo: 0x87, hi: 0x87}, - {value: 0x0018, lo: 0x88, hi: 0x8a}, - {value: 0x13c0, lo: 0x8b, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x0208, lo: 0xa0, hi: 0xbf}, - // Block 0x33, offset 0x1e7 - {value: 0x0000, lo: 0x02}, - {value: 0x0208, lo: 0x80, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0x34, offset 0x1ea - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0x84}, - {value: 0x1308, lo: 0x85, hi: 0x86}, - {value: 0x0208, lo: 0x87, hi: 0xa8}, - {value: 0x1308, lo: 0xa9, hi: 0xa9}, - {value: 0x0208, lo: 0xaa, hi: 0xaa}, - {value: 0x0040, lo: 0xab, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x35, offset 0x1f2 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0x36, offset 0x1f5 - {value: 0x0000, lo: 0x0c}, - {value: 0x0008, lo: 0x80, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x1308, lo: 0xa0, hi: 0xa2}, - {value: 0x1008, lo: 0xa3, hi: 0xa6}, - {value: 0x1308, lo: 0xa7, hi: 0xa8}, - {value: 0x1008, lo: 0xa9, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xaf}, - {value: 0x1008, lo: 0xb0, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb2}, - {value: 0x1008, lo: 0xb3, hi: 0xb8}, - {value: 0x1308, lo: 0xb9, hi: 0xbb}, - {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x37, offset 0x202 - {value: 0x0000, lo: 0x07}, - {value: 0x0018, lo: 0x80, hi: 0x80}, - {value: 0x0040, lo: 0x81, hi: 0x83}, - {value: 0x0018, lo: 0x84, hi: 0x85}, - {value: 0x0008, lo: 0x86, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0x38, offset 0x20a - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x39, offset 0x20e - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0040, lo: 0x8a, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0028, lo: 0x9a, hi: 0x9a}, - {value: 0x0040, lo: 0x9b, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0xbf}, - // Block 0x3a, offset 0x215 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0x96}, - {value: 0x1308, lo: 0x97, hi: 0x98}, - {value: 0x1008, lo: 0x99, hi: 0x9a}, - {value: 0x1308, lo: 0x9b, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x3b, offset 0x21d - {value: 0x0000, lo: 0x0f}, - {value: 0x0008, lo: 0x80, hi: 0x94}, - {value: 0x1008, lo: 0x95, hi: 0x95}, - {value: 0x1308, lo: 0x96, hi: 0x96}, - {value: 0x1008, lo: 0x97, hi: 0x97}, - {value: 0x1308, lo: 0x98, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x1b08, lo: 0xa0, hi: 0xa0}, - {value: 0x1008, lo: 0xa1, hi: 0xa1}, - {value: 0x1308, lo: 0xa2, hi: 0xa2}, - {value: 0x1008, lo: 0xa3, hi: 0xa4}, - {value: 0x1308, lo: 0xa5, hi: 0xac}, - {value: 0x1008, lo: 0xad, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbe}, - {value: 0x1308, lo: 0xbf, hi: 0xbf}, - // Block 0x3c, offset 0x22d - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0040, lo: 0x8a, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xa6}, - {value: 0x0008, lo: 0xa7, hi: 0xa7}, - {value: 0x0018, lo: 0xa8, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xbd}, - {value: 0x1318, lo: 0xbe, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x3d, offset 0x239 - {value: 0x0000, lo: 0x01}, - {value: 0x0040, lo: 0x80, hi: 0xbf}, - // Block 0x3e, offset 0x23b - {value: 0x0000, lo: 0x09}, - {value: 0x1308, lo: 0x80, hi: 0x83}, - {value: 0x1008, lo: 0x84, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0xb3}, - {value: 0x1308, lo: 0xb4, hi: 0xb4}, - {value: 0x1008, lo: 0xb5, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbb}, - {value: 0x1308, lo: 0xbc, hi: 0xbc}, - {value: 0x1008, lo: 0xbd, hi: 0xbf}, - // Block 0x3f, offset 0x245 - {value: 0x0000, lo: 0x0b}, - {value: 0x1008, lo: 0x80, hi: 0x81}, - {value: 0x1308, lo: 0x82, hi: 0x82}, - {value: 0x1008, lo: 0x83, hi: 0x83}, - {value: 0x1808, lo: 0x84, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0018, lo: 0x9a, hi: 0xaa}, - {value: 0x1308, lo: 0xab, hi: 0xb3}, - {value: 0x0018, lo: 0xb4, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x40, offset 0x251 - {value: 0x0000, lo: 0x0b}, - {value: 0x1308, lo: 0x80, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0xa0}, - {value: 0x1008, lo: 0xa1, hi: 0xa1}, - {value: 0x1308, lo: 0xa2, hi: 0xa5}, - {value: 0x1008, lo: 0xa6, hi: 0xa7}, - {value: 0x1308, lo: 0xa8, hi: 0xa9}, - {value: 0x1808, lo: 0xaa, hi: 0xaa}, - {value: 0x1b08, lo: 0xab, hi: 0xab}, - {value: 0x1308, lo: 0xac, hi: 0xad}, - {value: 0x0008, lo: 0xae, hi: 0xbf}, - // Block 0x41, offset 0x25d - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0xa5}, - {value: 0x1308, lo: 0xa6, hi: 0xa6}, - {value: 0x1008, lo: 0xa7, hi: 0xa7}, - {value: 0x1308, lo: 0xa8, hi: 0xa9}, - {value: 0x1008, lo: 0xaa, hi: 0xac}, - {value: 0x1308, lo: 0xad, hi: 0xad}, - {value: 0x1008, lo: 0xae, hi: 0xae}, - {value: 0x1308, lo: 0xaf, hi: 0xb1}, - {value: 0x1808, lo: 0xb2, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xbb}, - {value: 0x0018, lo: 0xbc, hi: 0xbf}, - // Block 0x42, offset 0x269 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0xa3}, - {value: 0x1008, lo: 0xa4, hi: 0xab}, - {value: 0x1308, lo: 0xac, hi: 0xb3}, - {value: 0x1008, lo: 0xb4, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xba}, - {value: 0x0018, lo: 0xbb, hi: 0xbf}, - // Block 0x43, offset 0x271 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0040, lo: 0x8a, hi: 0x8c}, - {value: 0x0008, lo: 0x8d, hi: 0xbd}, - {value: 0x0018, lo: 0xbe, hi: 0xbf}, - // Block 0x44, offset 0x276 - {value: 0x0000, lo: 0x09}, - {value: 0x0e29, lo: 0x80, hi: 0x80}, - {value: 0x0e41, lo: 0x81, hi: 0x81}, - {value: 0x0e59, lo: 0x82, hi: 0x82}, - {value: 0x0e71, lo: 0x83, hi: 0x83}, - {value: 0x0e89, lo: 0x84, hi: 0x85}, - {value: 0x0ea1, lo: 0x86, hi: 0x86}, - {value: 0x0eb9, lo: 0x87, hi: 0x87}, - {value: 0x057d, lo: 0x88, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0xbf}, - // Block 0x45, offset 0x280 - {value: 0x0000, lo: 0x10}, - {value: 0x0018, lo: 0x80, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x1308, lo: 0x90, hi: 0x92}, - {value: 0x0018, lo: 0x93, hi: 0x93}, - {value: 0x1308, lo: 0x94, hi: 0xa0}, - {value: 0x1008, lo: 0xa1, hi: 0xa1}, - {value: 0x1308, lo: 0xa2, hi: 0xa8}, - {value: 0x0008, lo: 0xa9, hi: 0xac}, - {value: 0x1308, lo: 0xad, hi: 0xad}, - {value: 0x0008, lo: 0xae, hi: 0xb1}, - {value: 0x1008, lo: 0xb2, hi: 0xb3}, - {value: 0x1308, lo: 0xb4, hi: 0xb4}, - {value: 0x0008, lo: 0xb5, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xb7}, - {value: 0x1308, lo: 0xb8, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x46, offset 0x291 - {value: 0x0000, lo: 0x03}, - {value: 0x1308, lo: 0x80, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xba}, - {value: 0x1308, lo: 0xbb, hi: 0xbf}, - // Block 0x47, offset 0x295 - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0x87}, - {value: 0xe045, lo: 0x88, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x97}, - {value: 0xe045, lo: 0x98, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa7}, - {value: 0xe045, lo: 0xa8, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb7}, - {value: 0xe045, lo: 0xb8, hi: 0xbf}, - // Block 0x48, offset 0x2a0 - {value: 0x0000, lo: 0x03}, - {value: 0x0040, lo: 0x80, hi: 0x8f}, - {value: 0x1318, lo: 0x90, hi: 0xb0}, - {value: 0x0040, lo: 0xb1, hi: 0xbf}, - // Block 0x49, offset 0x2a4 - {value: 0x0000, lo: 0x08}, - {value: 0x0018, lo: 0x80, hi: 0x82}, - {value: 0x0040, lo: 0x83, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0x84}, - {value: 0x0018, lo: 0x85, hi: 0x88}, - {value: 0x24c1, lo: 0x89, hi: 0x89}, - {value: 0x0018, lo: 0x8a, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0xbf}, - // Block 0x4a, offset 0x2ad - {value: 0x0000, lo: 0x07}, - {value: 0x0018, lo: 0x80, hi: 0xab}, - {value: 0x24f1, lo: 0xac, hi: 0xac}, - {value: 0x2529, lo: 0xad, hi: 0xad}, - {value: 0x0018, lo: 0xae, hi: 0xae}, - {value: 0x2579, lo: 0xaf, hi: 0xaf}, - {value: 0x25b1, lo: 0xb0, hi: 0xb0}, - {value: 0x0018, lo: 0xb1, hi: 0xbf}, - // Block 0x4b, offset 0x2b5 - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x9f}, - {value: 0x0080, lo: 0xa0, hi: 0xa0}, - {value: 0x0018, lo: 0xa1, hi: 0xad}, - {value: 0x0080, lo: 0xae, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0x4c, offset 0x2bb - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0xa8}, - {value: 0x09c5, lo: 0xa9, hi: 0xa9}, - {value: 0x09e5, lo: 0xaa, hi: 0xaa}, - {value: 0x0018, lo: 0xab, hi: 0xbf}, - // Block 0x4d, offset 0x2c0 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x4e, offset 0x2c3 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0xa6}, - {value: 0x0040, lo: 0xa7, hi: 0xbf}, - // Block 0x4f, offset 0x2c6 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0x8b}, - {value: 0x28c1, lo: 0x8c, hi: 0x8c}, - {value: 0x0018, lo: 0x8d, hi: 0xbf}, - // Block 0x50, offset 0x2ca - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0xb3}, - {value: 0x0e66, lo: 0xb4, hi: 0xb4}, - {value: 0x292a, lo: 0xb5, hi: 0xb5}, - {value: 0x0e86, lo: 0xb6, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xbf}, - // Block 0x51, offset 0x2d0 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0x9b}, - {value: 0x2941, lo: 0x9c, hi: 0x9c}, - {value: 0x0018, lo: 0x9d, hi: 0xbf}, - // Block 0x52, offset 0x2d4 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xb5}, - {value: 0x0018, lo: 0xb6, hi: 0xbf}, - // Block 0x53, offset 0x2d8 - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x97}, - {value: 0x0018, lo: 0x98, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbc}, - {value: 0x0018, lo: 0xbd, hi: 0xbf}, - // Block 0x54, offset 0x2de - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0018, lo: 0x8a, hi: 0x91}, - {value: 0x0040, lo: 0x92, hi: 0xab}, - {value: 0x0018, lo: 0xac, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0x55, offset 0x2e5 - {value: 0x0000, lo: 0x05}, - {value: 0xe185, lo: 0x80, hi: 0x8f}, - {value: 0x03f5, lo: 0x90, hi: 0x9f}, - {value: 0x0ea5, lo: 0xa0, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x56, offset 0x2eb - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0xa5}, - {value: 0x0040, lo: 0xa6, hi: 0xa6}, - {value: 0x0008, lo: 0xa7, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xac}, - {value: 0x0008, lo: 0xad, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x57, offset 0x2f3 - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xae}, - {value: 0xe075, lo: 0xaf, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb0}, - {value: 0x0040, lo: 0xb1, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0x58, offset 0x2fa - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa6}, - {value: 0x0040, lo: 0xa7, hi: 0xa7}, - {value: 0x0008, lo: 0xa8, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xb7}, - {value: 0x0008, lo: 0xb8, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x59, offset 0x305 - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x87}, - {value: 0x0008, lo: 0x88, hi: 0x8e}, - {value: 0x0040, lo: 0x8f, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x1308, lo: 0xa0, hi: 0xbf}, - // Block 0x5a, offset 0x30f - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xae}, - {value: 0x0008, lo: 0xaf, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0x5b, offset 0x313 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0x84}, - {value: 0x0040, lo: 0x85, hi: 0xbf}, - // Block 0x5c, offset 0x316 - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0x9e}, - {value: 0x0edd, lo: 0x9f, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xbf}, - // Block 0x5d, offset 0x31c - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xb2}, - {value: 0x0efd, lo: 0xb3, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xbf}, - // Block 0x5e, offset 0x320 - {value: 0x0020, lo: 0x01}, - {value: 0x0f1d, lo: 0x80, hi: 0xbf}, - // Block 0x5f, offset 0x322 - {value: 0x0020, lo: 0x02}, - {value: 0x171d, lo: 0x80, hi: 0x8f}, - {value: 0x18fd, lo: 0x90, hi: 0xbf}, - // Block 0x60, offset 0x325 - {value: 0x0020, lo: 0x01}, - {value: 0x1efd, lo: 0x80, hi: 0xbf}, - // Block 0x61, offset 0x327 - {value: 0x0000, lo: 0x02}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0xbf}, - // Block 0x62, offset 0x32a - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x98}, - {value: 0x1308, lo: 0x99, hi: 0x9a}, - {value: 0x29e2, lo: 0x9b, hi: 0x9b}, - {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, - {value: 0x0008, lo: 0x9d, hi: 0x9e}, - {value: 0x2a31, lo: 0x9f, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xa0}, - {value: 0x0008, lo: 0xa1, hi: 0xbf}, - // Block 0x63, offset 0x334 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xbe}, - {value: 0x2a69, lo: 0xbf, hi: 0xbf}, - // Block 0x64, offset 0x337 - {value: 0x0000, lo: 0x0e}, - {value: 0x0040, lo: 0x80, hi: 0x84}, - {value: 0x0008, lo: 0x85, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xb0}, - {value: 0x2a1d, lo: 0xb1, hi: 0xb1}, - {value: 0x2a3d, lo: 0xb2, hi: 0xb2}, - {value: 0x2a5d, lo: 0xb3, hi: 0xb3}, - {value: 0x2a7d, lo: 0xb4, hi: 0xb4}, - {value: 0x2a5d, lo: 0xb5, hi: 0xb5}, - {value: 0x2a9d, lo: 0xb6, hi: 0xb6}, - {value: 0x2abd, lo: 0xb7, hi: 0xb7}, - {value: 0x2add, lo: 0xb8, hi: 0xb9}, - {value: 0x2afd, lo: 0xba, hi: 0xbb}, - {value: 0x2b1d, lo: 0xbc, hi: 0xbd}, - {value: 0x2afd, lo: 0xbe, hi: 0xbf}, - // Block 0x65, offset 0x346 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xa3}, - {value: 0x0040, lo: 0xa4, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x66, offset 0x34a - {value: 0x0030, lo: 0x04}, - {value: 0x2aa2, lo: 0x80, hi: 0x9d}, - {value: 0x305a, lo: 0x9e, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x30a2, lo: 0xa0, hi: 0xbf}, - // Block 0x67, offset 0x34f - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0xbf}, - // Block 0x68, offset 0x352 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0x8c}, - {value: 0x0040, lo: 0x8d, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0xbf}, - // Block 0x69, offset 0x356 - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xbd}, - {value: 0x0018, lo: 0xbe, hi: 0xbf}, - // Block 0x6a, offset 0x35b - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x8c}, - {value: 0x0018, lo: 0x8d, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xbf}, - // Block 0x6b, offset 0x360 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0xa5}, - {value: 0x0018, lo: 0xa6, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb1}, - {value: 0x0018, lo: 0xb2, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0x6c, offset 0x366 - {value: 0x0000, lo: 0x05}, - {value: 0x0040, lo: 0x80, hi: 0xb6}, - {value: 0x0008, lo: 0xb7, hi: 0xb7}, - {value: 0x2009, lo: 0xb8, hi: 0xb8}, - {value: 0x6e89, lo: 0xb9, hi: 0xb9}, - {value: 0x0008, lo: 0xba, hi: 0xbf}, - // Block 0x6d, offset 0x36c - {value: 0x0000, lo: 0x0e}, - {value: 0x0008, lo: 0x80, hi: 0x81}, - {value: 0x1308, lo: 0x82, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0x85}, - {value: 0x1b08, lo: 0x86, hi: 0x86}, - {value: 0x0008, lo: 0x87, hi: 0x8a}, - {value: 0x1308, lo: 0x8b, hi: 0x8b}, - {value: 0x0008, lo: 0x8c, hi: 0xa2}, - {value: 0x1008, lo: 0xa3, hi: 0xa4}, - {value: 0x1308, lo: 0xa5, hi: 0xa6}, - {value: 0x1008, lo: 0xa7, hi: 0xa7}, - {value: 0x0018, lo: 0xa8, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x6e, offset 0x37b - {value: 0x0000, lo: 0x05}, - {value: 0x0208, lo: 0x80, hi: 0xb1}, - {value: 0x0108, lo: 0xb2, hi: 0xb2}, - {value: 0x0008, lo: 0xb3, hi: 0xb3}, - {value: 0x0018, lo: 0xb4, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0x6f, offset 0x381 - {value: 0x0000, lo: 0x03}, - {value: 0x1008, lo: 0x80, hi: 0x81}, - {value: 0x0008, lo: 0x82, hi: 0xb3}, - {value: 0x1008, lo: 0xb4, hi: 0xbf}, - // Block 0x70, offset 0x385 - {value: 0x0000, lo: 0x0e}, - {value: 0x1008, lo: 0x80, hi: 0x83}, - {value: 0x1b08, lo: 0x84, hi: 0x84}, - {value: 0x1308, lo: 0x85, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x8d}, - {value: 0x0018, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x1308, lo: 0xa0, hi: 0xb1}, - {value: 0x0008, lo: 0xb2, hi: 0xb7}, - {value: 0x0018, lo: 0xb8, hi: 0xba}, - {value: 0x0008, lo: 0xbb, hi: 0xbb}, - {value: 0x0018, lo: 0xbc, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x71, offset 0x394 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xa5}, - {value: 0x1308, lo: 0xa6, hi: 0xad}, - {value: 0x0018, lo: 0xae, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x72, offset 0x399 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x1308, lo: 0x87, hi: 0x91}, - {value: 0x1008, lo: 0x92, hi: 0x92}, - {value: 0x1808, lo: 0x93, hi: 0x93}, - {value: 0x0040, lo: 0x94, hi: 0x9e}, - {value: 0x0018, lo: 0x9f, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x73, offset 0x3a1 - {value: 0x0000, lo: 0x09}, - {value: 0x1308, lo: 0x80, hi: 0x82}, - {value: 0x1008, lo: 0x83, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xb3}, - {value: 0x1008, lo: 0xb4, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xb9}, - {value: 0x1008, lo: 0xba, hi: 0xbb}, - {value: 0x1308, lo: 0xbc, hi: 0xbc}, - {value: 0x1008, lo: 0xbd, hi: 0xbf}, - // Block 0x74, offset 0x3ab - {value: 0x0000, lo: 0x0a}, - {value: 0x1808, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8e}, - {value: 0x0008, lo: 0x8f, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa4}, - {value: 0x1308, lo: 0xa5, hi: 0xa5}, - {value: 0x0008, lo: 0xa6, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x75, offset 0x3b6 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0xa8}, - {value: 0x1308, lo: 0xa9, hi: 0xae}, - {value: 0x1008, lo: 0xaf, hi: 0xb0}, - {value: 0x1308, lo: 0xb1, hi: 0xb2}, - {value: 0x1008, lo: 0xb3, hi: 0xb4}, - {value: 0x1308, lo: 0xb5, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x76, offset 0x3be - {value: 0x0000, lo: 0x10}, - {value: 0x0008, lo: 0x80, hi: 0x82}, - {value: 0x1308, lo: 0x83, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0x8b}, - {value: 0x1308, lo: 0x8c, hi: 0x8c}, - {value: 0x1008, lo: 0x8d, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9b}, - {value: 0x0018, lo: 0x9c, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xb9}, - {value: 0x0008, lo: 0xba, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbb}, - {value: 0x1308, lo: 0xbc, hi: 0xbc}, - {value: 0x1008, lo: 0xbd, hi: 0xbd}, - {value: 0x0008, lo: 0xbe, hi: 0xbf}, - // Block 0x77, offset 0x3cf - {value: 0x0000, lo: 0x08}, - {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb0}, - {value: 0x0008, lo: 0xb1, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb4}, - {value: 0x0008, lo: 0xb5, hi: 0xb6}, - {value: 0x1308, lo: 0xb7, hi: 0xb8}, - {value: 0x0008, lo: 0xb9, hi: 0xbd}, - {value: 0x1308, lo: 0xbe, hi: 0xbf}, - // Block 0x78, offset 0x3d8 - {value: 0x0000, lo: 0x0f}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x1308, lo: 0x81, hi: 0x81}, - {value: 0x0008, lo: 0x82, hi: 0x82}, - {value: 0x0040, lo: 0x83, hi: 0x9a}, - {value: 0x0008, lo: 0x9b, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xaa}, - {value: 0x1008, lo: 0xab, hi: 0xab}, - {value: 0x1308, lo: 0xac, hi: 0xad}, - {value: 0x1008, lo: 0xae, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb1}, - {value: 0x0008, lo: 0xb2, hi: 0xb4}, - {value: 0x1008, lo: 0xb5, hi: 0xb5}, - {value: 0x1b08, lo: 0xb6, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x79, offset 0x3e8 - {value: 0x0000, lo: 0x0c}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x88}, - {value: 0x0008, lo: 0x89, hi: 0x8e}, - {value: 0x0040, lo: 0x8f, hi: 0x90}, - {value: 0x0008, lo: 0x91, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa6}, - {value: 0x0040, lo: 0xa7, hi: 0xa7}, - {value: 0x0008, lo: 0xa8, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x7a, offset 0x3f5 - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0x9b}, - {value: 0x4465, lo: 0x9c, hi: 0x9c}, - {value: 0x447d, lo: 0x9d, hi: 0x9d}, - {value: 0x2971, lo: 0x9e, hi: 0x9e}, - {value: 0xe06d, lo: 0x9f, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa5}, - {value: 0x0040, lo: 0xa6, hi: 0xaf}, - {value: 0x4495, lo: 0xb0, hi: 0xbf}, - // Block 0x7b, offset 0x3ff - {value: 0x0000, lo: 0x04}, - {value: 0x44b5, lo: 0x80, hi: 0x8f}, - {value: 0x44d5, lo: 0x90, hi: 0x9f}, - {value: 0x44f5, lo: 0xa0, hi: 0xaf}, - {value: 0x44d5, lo: 0xb0, hi: 0xbf}, - // Block 0x7c, offset 0x404 - {value: 0x0000, lo: 0x0c}, - {value: 0x0008, lo: 0x80, hi: 0xa2}, - {value: 0x1008, lo: 0xa3, hi: 0xa4}, - {value: 0x1308, lo: 0xa5, hi: 0xa5}, - {value: 0x1008, lo: 0xa6, hi: 0xa7}, - {value: 0x1308, lo: 0xa8, hi: 0xa8}, - {value: 0x1008, lo: 0xa9, hi: 0xaa}, - {value: 0x0018, lo: 0xab, hi: 0xab}, - {value: 0x1008, lo: 0xac, hi: 0xac}, - {value: 0x1b08, lo: 0xad, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x7d, offset 0x411 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xa3}, - {value: 0x0040, lo: 0xa4, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0x7e, offset 0x415 - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x8a}, - {value: 0x0018, lo: 0x8b, hi: 0xbb}, - {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x7f, offset 0x41a - {value: 0x0020, lo: 0x01}, - {value: 0x4515, lo: 0x80, hi: 0xbf}, - // Block 0x80, offset 0x41c - {value: 0x0020, lo: 0x03}, - {value: 0x4d15, lo: 0x80, hi: 0x94}, - {value: 0x4ad5, lo: 0x95, hi: 0x95}, - {value: 0x4fb5, lo: 0x96, hi: 0xbf}, - // Block 0x81, offset 0x420 - {value: 0x0020, lo: 0x01}, - {value: 0x54f5, lo: 0x80, hi: 0xbf}, - // Block 0x82, offset 0x422 - {value: 0x0020, lo: 0x03}, - {value: 0x5cf5, lo: 0x80, hi: 0x84}, - {value: 0x5655, lo: 0x85, hi: 0x85}, - {value: 0x5d95, lo: 0x86, hi: 0xbf}, - // Block 0x83, offset 0x426 - {value: 0x0020, lo: 0x08}, - {value: 0x6b55, lo: 0x80, hi: 0x8f}, - {value: 0x6d15, lo: 0x90, hi: 0x90}, - {value: 0x6d55, lo: 0x91, hi: 0xab}, - {value: 0x6ea1, lo: 0xac, hi: 0xac}, - {value: 0x70b5, lo: 0xad, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xaf}, - {value: 0x70d5, lo: 0xb0, hi: 0xbf}, - // Block 0x84, offset 0x42f - {value: 0x0020, lo: 0x05}, - {value: 0x72d5, lo: 0x80, hi: 0xad}, - {value: 0x6535, lo: 0xae, hi: 0xae}, - {value: 0x7895, lo: 0xaf, hi: 0xb5}, - {value: 0x6f55, lo: 0xb6, hi: 0xb6}, - {value: 0x7975, lo: 0xb7, hi: 0xbf}, - // Block 0x85, offset 0x435 - {value: 0x0028, lo: 0x03}, - {value: 0x7c21, lo: 0x80, hi: 0x82}, - {value: 0x7be1, lo: 0x83, hi: 0x83}, - {value: 0x7c99, lo: 0x84, hi: 0xbf}, - // Block 0x86, offset 0x439 - {value: 0x0038, lo: 0x0f}, - {value: 0x9db1, lo: 0x80, hi: 0x83}, - {value: 0x9e59, lo: 0x84, hi: 0x85}, - {value: 0x9e91, lo: 0x86, hi: 0x87}, - {value: 0x9ec9, lo: 0x88, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x91}, - {value: 0xa089, lo: 0x92, hi: 0x97}, - {value: 0xa1a1, lo: 0x98, hi: 0x9c}, - {value: 0xa281, lo: 0x9d, hi: 0xb3}, - {value: 0x9d41, lo: 0xb4, hi: 0xb4}, - {value: 0x9db1, lo: 0xb5, hi: 0xb5}, - {value: 0xa789, lo: 0xb6, hi: 0xbb}, - {value: 0xa869, lo: 0xbc, hi: 0xbc}, - {value: 0xa7f9, lo: 0xbd, hi: 0xbd}, - {value: 0xa8d9, lo: 0xbe, hi: 0xbf}, - // Block 0x87, offset 0x449 - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x8c}, - {value: 0x0008, lo: 0x8d, hi: 0xa6}, - {value: 0x0040, lo: 0xa7, hi: 0xa7}, - {value: 0x0008, lo: 0xa8, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbb}, - {value: 0x0008, lo: 0xbc, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbe}, - {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0x88, offset 0x453 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0xbf}, - // Block 0x89, offset 0x458 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x8a, offset 0x45b - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x82}, - {value: 0x0040, lo: 0x83, hi: 0x86}, - {value: 0x0018, lo: 0x87, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xbf}, - // Block 0x8b, offset 0x461 - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x8e}, - {value: 0x0040, lo: 0x8f, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xa0}, - {value: 0x0040, lo: 0xa1, hi: 0xbf}, - // Block 0x8c, offset 0x468 - {value: 0x0000, lo: 0x04}, - {value: 0x0040, lo: 0x80, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0xbc}, - {value: 0x1308, lo: 0xbd, hi: 0xbd}, - {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x8d, offset 0x46d - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0x9c}, - {value: 0x0040, lo: 0x9d, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x8e, offset 0x471 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x90}, - {value: 0x0040, lo: 0x91, hi: 0x9f}, - {value: 0x1308, lo: 0xa0, hi: 0xa0}, - {value: 0x0018, lo: 0xa1, hi: 0xbb}, - {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x8f, offset 0x477 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xa3}, - {value: 0x0040, lo: 0xa4, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x90, offset 0x47c - {value: 0x0000, lo: 0x08}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x81}, - {value: 0x0008, lo: 0x82, hi: 0x89}, - {value: 0x0018, lo: 0x8a, hi: 0x8a}, - {value: 0x0040, lo: 0x8b, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x91, offset 0x485 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9e}, - {value: 0x0018, lo: 0x9f, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x92, offset 0x48a - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x87}, - {value: 0x0008, lo: 0x88, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0xbf}, - // Block 0x93, offset 0x490 - {value: 0x0000, lo: 0x06}, - {value: 0xe145, lo: 0x80, hi: 0x87}, - {value: 0xe1c5, lo: 0x88, hi: 0x8f}, - {value: 0xe145, lo: 0x90, hi: 0x97}, - {value: 0x8ad5, lo: 0x98, hi: 0x9f}, - {value: 0x8aed, lo: 0xa0, hi: 0xa7}, - {value: 0x0008, lo: 0xa8, hi: 0xbf}, - // Block 0x94, offset 0x497 - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa9}, - {value: 0x0040, lo: 0xaa, hi: 0xaf}, - {value: 0x8aed, lo: 0xb0, hi: 0xb7}, - {value: 0x8ad5, lo: 0xb8, hi: 0xbf}, - // Block 0x95, offset 0x49e - {value: 0x0000, lo: 0x06}, - {value: 0xe145, lo: 0x80, hi: 0x87}, - {value: 0xe1c5, lo: 0x88, hi: 0x8f}, - {value: 0xe145, lo: 0x90, hi: 0x93}, - {value: 0x0040, lo: 0x94, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0xbb}, - {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x96, offset 0x4a5 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x97, offset 0x4a9 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xa3}, - {value: 0x0040, lo: 0xa4, hi: 0xae}, - {value: 0x0018, lo: 0xaf, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0x98, offset 0x4ae - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x99, offset 0x4b1 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xbf}, - // Block 0x9a, offset 0x4b6 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x87}, - {value: 0x0008, lo: 0x88, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0008, lo: 0x8a, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xb6}, - {value: 0x0008, lo: 0xb7, hi: 0xb8}, - {value: 0x0040, lo: 0xb9, hi: 0xbb}, - {value: 0x0008, lo: 0xbc, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbe}, - {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0x9b, offset 0x4c2 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x96}, - {value: 0x0018, lo: 0x97, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xbf}, - // Block 0x9c, offset 0x4c8 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0xa6}, - {value: 0x0018, lo: 0xa7, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0x9d, offset 0x4cd - {value: 0x0000, lo: 0x06}, - {value: 0x0040, lo: 0x80, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xb3}, - {value: 0x0008, lo: 0xb4, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xba}, - {value: 0x0018, lo: 0xbb, hi: 0xbf}, - // Block 0x9e, offset 0x4d4 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x0018, lo: 0x96, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0x9e}, - {value: 0x0018, lo: 0x9f, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbe}, - {value: 0x0018, lo: 0xbf, hi: 0xbf}, - // Block 0x9f, offset 0x4dc - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbb}, - {value: 0x0018, lo: 0xbc, hi: 0xbd}, - {value: 0x0008, lo: 0xbe, hi: 0xbf}, - // Block 0xa0, offset 0x4e1 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0x91}, - {value: 0x0018, lo: 0x92, hi: 0xbf}, - // Block 0xa1, offset 0x4e5 - {value: 0x0000, lo: 0x0f}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x1308, lo: 0x81, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x84}, - {value: 0x1308, lo: 0x85, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x8b}, - {value: 0x1308, lo: 0x8c, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x93}, - {value: 0x0040, lo: 0x94, hi: 0x94}, - {value: 0x0008, lo: 0x95, hi: 0x97}, - {value: 0x0040, lo: 0x98, hi: 0x98}, - {value: 0x0008, lo: 0x99, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xb7}, - {value: 0x1308, lo: 0xb8, hi: 0xba}, - {value: 0x0040, lo: 0xbb, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0xa2, offset 0x4f5 - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x98}, - {value: 0x0040, lo: 0x99, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbc}, - {value: 0x0018, lo: 0xbd, hi: 0xbf}, - // Block 0xa3, offset 0x4fc - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0x9c}, - {value: 0x0018, lo: 0x9d, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0xa4, offset 0x500 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xb8}, - {value: 0x0018, lo: 0xb9, hi: 0xbf}, - // Block 0xa5, offset 0x504 - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x95}, - {value: 0x0040, lo: 0x96, hi: 0x97}, - {value: 0x0018, lo: 0x98, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xb7}, - {value: 0x0018, lo: 0xb8, hi: 0xbf}, - // Block 0xa6, offset 0x50b - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0xbf}, - // Block 0xa7, offset 0x50e - {value: 0x0000, lo: 0x02}, - {value: 0x03dd, lo: 0x80, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xbf}, - // Block 0xa8, offset 0x511 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xb9}, - {value: 0x0018, lo: 0xba, hi: 0xbf}, - // Block 0xa9, offset 0x515 - {value: 0x0000, lo: 0x03}, - {value: 0x0040, lo: 0x80, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xaa, offset 0x519 - {value: 0x0000, lo: 0x05}, - {value: 0x1008, lo: 0x80, hi: 0x80}, - {value: 0x1308, lo: 0x81, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0xb7}, - {value: 0x1308, lo: 0xb8, hi: 0xbf}, - // Block 0xab, offset 0x51f - {value: 0x0000, lo: 0x08}, - {value: 0x1308, lo: 0x80, hi: 0x85}, - {value: 0x1b08, lo: 0x86, hi: 0x86}, - {value: 0x0018, lo: 0x87, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x91}, - {value: 0x0018, lo: 0x92, hi: 0xa5}, - {value: 0x0008, lo: 0xa6, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0xac, offset 0x528 - {value: 0x0000, lo: 0x0b}, - {value: 0x1308, lo: 0x80, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0xaf}, - {value: 0x1008, lo: 0xb0, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xb6}, - {value: 0x1008, lo: 0xb7, hi: 0xb8}, - {value: 0x1b08, lo: 0xb9, hi: 0xb9}, - {value: 0x1308, lo: 0xba, hi: 0xba}, - {value: 0x0018, lo: 0xbb, hi: 0xbc}, - {value: 0x0340, lo: 0xbd, hi: 0xbd}, - {value: 0x0018, lo: 0xbe, hi: 0xbf}, - // Block 0xad, offset 0x534 - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x81}, - {value: 0x0040, lo: 0x82, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xa8}, - {value: 0x0040, lo: 0xa9, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0xae, offset 0x53b - {value: 0x0000, lo: 0x08}, - {value: 0x1308, lo: 0x80, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0xa6}, - {value: 0x1308, lo: 0xa7, hi: 0xab}, - {value: 0x1008, lo: 0xac, hi: 0xac}, - {value: 0x1308, lo: 0xad, hi: 0xb2}, - {value: 0x1b08, lo: 0xb3, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xb5}, - {value: 0x0008, lo: 0xb6, hi: 0xbf}, - // Block 0xaf, offset 0x544 - {value: 0x0000, lo: 0x07}, - {value: 0x0018, lo: 0x80, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xb3}, - {value: 0x0018, lo: 0xb4, hi: 0xb5}, - {value: 0x0008, lo: 0xb6, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xb0, offset 0x54c - {value: 0x0000, lo: 0x06}, - {value: 0x1308, lo: 0x80, hi: 0x81}, - {value: 0x1008, lo: 0x82, hi: 0x82}, - {value: 0x0008, lo: 0x83, hi: 0xb2}, - {value: 0x1008, lo: 0xb3, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xbe}, - {value: 0x1008, lo: 0xbf, hi: 0xbf}, - // Block 0xb1, offset 0x553 - {value: 0x0000, lo: 0x0d}, - {value: 0x1808, lo: 0x80, hi: 0x80}, - {value: 0x0008, lo: 0x81, hi: 0x84}, - {value: 0x0018, lo: 0x85, hi: 0x89}, - {value: 0x1308, lo: 0x8a, hi: 0x8c}, - {value: 0x0018, lo: 0x8d, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0x9b}, - {value: 0x0008, lo: 0x9c, hi: 0x9c}, - {value: 0x0018, lo: 0x9d, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xa0}, - {value: 0x0018, lo: 0xa1, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0xb2, offset 0x561 - {value: 0x0000, lo: 0x0c}, - {value: 0x0008, lo: 0x80, hi: 0x91}, - {value: 0x0040, lo: 0x92, hi: 0x92}, - {value: 0x0008, lo: 0x93, hi: 0xab}, - {value: 0x1008, lo: 0xac, hi: 0xae}, - {value: 0x1308, lo: 0xaf, hi: 0xb1}, - {value: 0x1008, lo: 0xb2, hi: 0xb3}, - {value: 0x1308, lo: 0xb4, hi: 0xb4}, - {value: 0x1808, lo: 0xb5, hi: 0xb5}, - {value: 0x1308, lo: 0xb6, hi: 0xb7}, - {value: 0x0018, lo: 0xb8, hi: 0xbd}, - {value: 0x1308, lo: 0xbe, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xb3, offset 0x56e - {value: 0x0000, lo: 0x0c}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x87}, - {value: 0x0008, lo: 0x88, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0008, lo: 0x8a, hi: 0x8d}, - {value: 0x0040, lo: 0x8e, hi: 0x8e}, - {value: 0x0008, lo: 0x8f, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9e}, - {value: 0x0008, lo: 0x9f, hi: 0xa8}, - {value: 0x0018, lo: 0xa9, hi: 0xa9}, - {value: 0x0040, lo: 0xaa, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0xb4, offset 0x57b - {value: 0x0000, lo: 0x08}, - {value: 0x0008, lo: 0x80, hi: 0x9e}, - {value: 0x1308, lo: 0x9f, hi: 0x9f}, - {value: 0x1008, lo: 0xa0, hi: 0xa2}, - {value: 0x1308, lo: 0xa3, hi: 0xa9}, - {value: 0x1b08, lo: 0xaa, hi: 0xaa}, - {value: 0x0040, lo: 0xab, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb9}, - {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0xb5, offset 0x584 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xb4}, - {value: 0x1008, lo: 0xb5, hi: 0xb7}, - {value: 0x1308, lo: 0xb8, hi: 0xbf}, - // Block 0xb6, offset 0x588 - {value: 0x0000, lo: 0x0d}, - {value: 0x1008, lo: 0x80, hi: 0x81}, - {value: 0x1b08, lo: 0x82, hi: 0x82}, - {value: 0x1308, lo: 0x83, hi: 0x84}, - {value: 0x1008, lo: 0x85, hi: 0x85}, - {value: 0x1308, lo: 0x86, hi: 0x86}, - {value: 0x0008, lo: 0x87, hi: 0x8a}, - {value: 0x0018, lo: 0x8b, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0x9b}, - {value: 0x0040, lo: 0x9c, hi: 0x9c}, - {value: 0x0018, lo: 0x9d, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0xbf}, - // Block 0xb7, offset 0x596 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x1008, lo: 0xb0, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xb8}, - {value: 0x1008, lo: 0xb9, hi: 0xb9}, - {value: 0x1308, lo: 0xba, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbe}, - {value: 0x1308, lo: 0xbf, hi: 0xbf}, - // Block 0xb8, offset 0x59e - {value: 0x0000, lo: 0x0a}, - {value: 0x1308, lo: 0x80, hi: 0x80}, - {value: 0x1008, lo: 0x81, hi: 0x81}, - {value: 0x1b08, lo: 0x82, hi: 0x82}, - {value: 0x1308, lo: 0x83, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0x85}, - {value: 0x0018, lo: 0x86, hi: 0x86}, - {value: 0x0008, lo: 0x87, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xb9, offset 0x5a9 - {value: 0x0000, lo: 0x08}, - {value: 0x0008, lo: 0x80, hi: 0xae}, - {value: 0x1008, lo: 0xaf, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xb7}, - {value: 0x1008, lo: 0xb8, hi: 0xbb}, - {value: 0x1308, lo: 0xbc, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0xba, offset 0x5b2 - {value: 0x0000, lo: 0x05}, - {value: 0x1308, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x97}, - {value: 0x0008, lo: 0x98, hi: 0x9b}, - {value: 0x1308, lo: 0x9c, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0xbf}, - // Block 0xbb, offset 0x5b8 - {value: 0x0000, lo: 0x07}, - {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x1008, lo: 0xb0, hi: 0xb2}, - {value: 0x1308, lo: 0xb3, hi: 0xba}, - {value: 0x1008, lo: 0xbb, hi: 0xbc}, - {value: 0x1308, lo: 0xbd, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0xbc, offset 0x5c0 - {value: 0x0000, lo: 0x08}, - {value: 0x1308, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x83}, - {value: 0x0008, lo: 0x84, hi: 0x84}, - {value: 0x0040, lo: 0x85, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xbf}, - // Block 0xbd, offset 0x5c9 - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0xaa}, - {value: 0x1308, lo: 0xab, hi: 0xab}, - {value: 0x1008, lo: 0xac, hi: 0xac}, - {value: 0x1308, lo: 0xad, hi: 0xad}, - {value: 0x1008, lo: 0xae, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb5}, - {value: 0x1808, lo: 0xb6, hi: 0xb6}, - {value: 0x1308, lo: 0xb7, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0xbe, offset 0x5d3 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x89}, - {value: 0x0040, lo: 0x8a, hi: 0xbf}, - // Block 0xbf, offset 0x5d6 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9c}, - {value: 0x1308, lo: 0x9d, hi: 0x9f}, - {value: 0x1008, lo: 0xa0, hi: 0xa1}, - {value: 0x1308, lo: 0xa2, hi: 0xa5}, - {value: 0x1008, lo: 0xa6, hi: 0xa6}, - {value: 0x1308, lo: 0xa7, hi: 0xaa}, - {value: 0x1b08, lo: 0xab, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xb9}, - {value: 0x0018, lo: 0xba, hi: 0xbf}, - // Block 0xc0, offset 0x5e2 - {value: 0x0000, lo: 0x02}, - {value: 0x0040, lo: 0x80, hi: 0x9f}, - {value: 0x049d, lo: 0xa0, hi: 0xbf}, - // Block 0xc1, offset 0x5e5 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xa9}, - {value: 0x0018, lo: 0xaa, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xbe}, - {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0xc2, offset 0x5ea - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xb8}, - {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xc3, offset 0x5ed - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x89}, - {value: 0x0008, lo: 0x8a, hi: 0xae}, - {value: 0x1008, lo: 0xaf, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xb7}, - {value: 0x1308, lo: 0xb8, hi: 0xbd}, - {value: 0x1008, lo: 0xbe, hi: 0xbe}, - {value: 0x1b08, lo: 0xbf, hi: 0xbf}, - // Block 0xc4, offset 0x5f7 - {value: 0x0000, lo: 0x08}, - {value: 0x0008, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0018, lo: 0x9a, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb1}, - {value: 0x0008, lo: 0xb2, hi: 0xbf}, - // Block 0xc5, offset 0x600 - {value: 0x0000, lo: 0x0b}, - {value: 0x0008, lo: 0x80, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0x91}, - {value: 0x1308, lo: 0x92, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xa8}, - {value: 0x1008, lo: 0xa9, hi: 0xa9}, - {value: 0x1308, lo: 0xaa, hi: 0xb0}, - {value: 0x1008, lo: 0xb1, hi: 0xb1}, - {value: 0x1308, lo: 0xb2, hi: 0xb3}, - {value: 0x1008, lo: 0xb4, hi: 0xb4}, - {value: 0x1308, lo: 0xb5, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xc6, offset 0x60c - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xc7, offset 0x60f - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0xc8, offset 0x614 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x83}, - {value: 0x0040, lo: 0x84, hi: 0xbf}, - // Block 0xc9, offset 0x617 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xbf}, - // Block 0xca, offset 0x61a - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0xbf}, - // Block 0xcb, offset 0x61d - {value: 0x0000, lo: 0x06}, - {value: 0x0008, lo: 0x80, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa9}, - {value: 0x0040, lo: 0xaa, hi: 0xad}, - {value: 0x0018, lo: 0xae, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0xcc, offset 0x624 - {value: 0x0000, lo: 0x06}, - {value: 0x0040, lo: 0x80, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb4}, - {value: 0x0018, lo: 0xb5, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0xcd, offset 0x62b - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x1308, lo: 0xb0, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xbf}, - // Block 0xce, offset 0x62f - {value: 0x0000, lo: 0x0a}, - {value: 0x0008, lo: 0x80, hi: 0x83}, - {value: 0x0018, lo: 0x84, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9a}, - {value: 0x0018, lo: 0x9b, hi: 0xa1}, - {value: 0x0040, lo: 0xa2, hi: 0xa2}, - {value: 0x0008, lo: 0xa3, hi: 0xb7}, - {value: 0x0040, lo: 0xb8, hi: 0xbc}, - {value: 0x0008, lo: 0xbd, hi: 0xbf}, - // Block 0xcf, offset 0x63a - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0xbf}, - // Block 0xd0, offset 0x63d - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x84}, - {value: 0x0040, lo: 0x85, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x90}, - {value: 0x1008, lo: 0x91, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xd1, offset 0x643 - {value: 0x0000, lo: 0x04}, - {value: 0x0040, lo: 0x80, hi: 0x8e}, - {value: 0x1308, lo: 0x8f, hi: 0x92}, - {value: 0x0008, lo: 0x93, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0xd2, offset 0x648 - {value: 0x0000, lo: 0x03}, - {value: 0x0040, lo: 0x80, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xa0}, - {value: 0x0040, lo: 0xa1, hi: 0xbf}, - // Block 0xd3, offset 0x64c - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xbf}, - // Block 0xd4, offset 0x64f - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xb2}, - {value: 0x0040, lo: 0xb3, hi: 0xbf}, - // Block 0xd5, offset 0x652 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x81}, - {value: 0x0040, lo: 0x82, hi: 0xbf}, - // Block 0xd6, offset 0x655 - {value: 0x0000, lo: 0x04}, - {value: 0x0008, lo: 0x80, hi: 0xaa}, - {value: 0x0040, lo: 0xab, hi: 0xaf}, - {value: 0x0008, lo: 0xb0, hi: 0xbc}, - {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0xd7, offset 0x65a - {value: 0x0000, lo: 0x09}, - {value: 0x0008, lo: 0x80, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9b}, - {value: 0x0018, lo: 0x9c, hi: 0x9c}, - {value: 0x1308, lo: 0x9d, hi: 0x9e}, - {value: 0x0018, lo: 0x9f, hi: 0x9f}, - {value: 0x03c0, lo: 0xa0, hi: 0xa3}, - {value: 0x0040, lo: 0xa4, hi: 0xbf}, - // Block 0xd8, offset 0x664 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0xd9, offset 0x667 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xa6}, - {value: 0x0040, lo: 0xa7, hi: 0xa8}, - {value: 0x0018, lo: 0xa9, hi: 0xbf}, - // Block 0xda, offset 0x66b - {value: 0x0000, lo: 0x0e}, - {value: 0x0018, lo: 0x80, hi: 0x9d}, - {value: 0xb5b9, lo: 0x9e, hi: 0x9e}, - {value: 0xb601, lo: 0x9f, hi: 0x9f}, - {value: 0xb649, lo: 0xa0, hi: 0xa0}, - {value: 0xb6b1, lo: 0xa1, hi: 0xa1}, - {value: 0xb719, lo: 0xa2, hi: 0xa2}, - {value: 0xb781, lo: 0xa3, hi: 0xa3}, - {value: 0xb7e9, lo: 0xa4, hi: 0xa4}, - {value: 0x1018, lo: 0xa5, hi: 0xa6}, - {value: 0x1318, lo: 0xa7, hi: 0xa9}, - {value: 0x0018, lo: 0xaa, hi: 0xac}, - {value: 0x1018, lo: 0xad, hi: 0xb2}, - {value: 0x0340, lo: 0xb3, hi: 0xba}, - {value: 0x1318, lo: 0xbb, hi: 0xbf}, - // Block 0xdb, offset 0x67a - {value: 0x0000, lo: 0x0b}, - {value: 0x1318, lo: 0x80, hi: 0x82}, - {value: 0x0018, lo: 0x83, hi: 0x84}, - {value: 0x1318, lo: 0x85, hi: 0x8b}, - {value: 0x0018, lo: 0x8c, hi: 0xa9}, - {value: 0x1318, lo: 0xaa, hi: 0xad}, - {value: 0x0018, lo: 0xae, hi: 0xba}, - {value: 0xb851, lo: 0xbb, hi: 0xbb}, - {value: 0xb899, lo: 0xbc, hi: 0xbc}, - {value: 0xb8e1, lo: 0xbd, hi: 0xbd}, - {value: 0xb949, lo: 0xbe, hi: 0xbe}, - {value: 0xb9b1, lo: 0xbf, hi: 0xbf}, - // Block 0xdc, offset 0x686 - {value: 0x0000, lo: 0x03}, - {value: 0xba19, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0xa8}, - {value: 0x0040, lo: 0xa9, hi: 0xbf}, - // Block 0xdd, offset 0x68a - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x81}, - {value: 0x1318, lo: 0x82, hi: 0x84}, - {value: 0x0018, lo: 0x85, hi: 0x85}, - {value: 0x0040, lo: 0x86, hi: 0xbf}, - // Block 0xde, offset 0x68f - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xb1}, - {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0xdf, offset 0x694 - {value: 0x0000, lo: 0x03}, - {value: 0x1308, lo: 0x80, hi: 0xb6}, - {value: 0x0018, lo: 0xb7, hi: 0xba}, - {value: 0x1308, lo: 0xbb, hi: 0xbf}, - // Block 0xe0, offset 0x698 - {value: 0x0000, lo: 0x04}, - {value: 0x1308, lo: 0x80, hi: 0xac}, - {value: 0x0018, lo: 0xad, hi: 0xb4}, - {value: 0x1308, lo: 0xb5, hi: 0xb5}, - {value: 0x0018, lo: 0xb6, hi: 0xbf}, - // Block 0xe1, offset 0x69d - {value: 0x0000, lo: 0x08}, - {value: 0x0018, lo: 0x80, hi: 0x83}, - {value: 0x1308, lo: 0x84, hi: 0x84}, - {value: 0x0018, lo: 0x85, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x9a}, - {value: 0x1308, lo: 0x9b, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xa0}, - {value: 0x1308, lo: 0xa1, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0xe2, offset 0x6a6 - {value: 0x0000, lo: 0x0a}, - {value: 0x1308, lo: 0x80, hi: 0x86}, - {value: 0x0040, lo: 0x87, hi: 0x87}, - {value: 0x1308, lo: 0x88, hi: 0x98}, - {value: 0x0040, lo: 0x99, hi: 0x9a}, - {value: 0x1308, lo: 0x9b, hi: 0xa1}, - {value: 0x0040, lo: 0xa2, hi: 0xa2}, - {value: 0x1308, lo: 0xa3, hi: 0xa4}, - {value: 0x0040, lo: 0xa5, hi: 0xa5}, - {value: 0x1308, lo: 0xa6, hi: 0xaa}, - {value: 0x0040, lo: 0xab, hi: 0xbf}, - // Block 0xe3, offset 0x6b1 - {value: 0x0000, lo: 0x05}, - {value: 0x0008, lo: 0x80, hi: 0x84}, - {value: 0x0040, lo: 0x85, hi: 0x86}, - {value: 0x0018, lo: 0x87, hi: 0x8f}, - {value: 0x1308, lo: 0x90, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0xbf}, - // Block 0xe4, offset 0x6b7 - {value: 0x0000, lo: 0x07}, - {value: 0x0208, lo: 0x80, hi: 0x83}, - {value: 0x1308, lo: 0x84, hi: 0x8a}, - {value: 0x0040, lo: 0x8b, hi: 0x8f}, - {value: 0x0008, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9d}, - {value: 0x0018, lo: 0x9e, hi: 0x9f}, - {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0xe5, offset 0x6bf - {value: 0x0000, lo: 0x03}, - {value: 0x0040, lo: 0x80, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb1}, - {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0xe6, offset 0x6c3 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0xab}, - {value: 0x0040, lo: 0xac, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0xe7, offset 0x6c7 - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x93}, - {value: 0x0040, lo: 0x94, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xae}, - {value: 0x0040, lo: 0xaf, hi: 0xb0}, - {value: 0x0018, lo: 0xb1, hi: 0xbf}, - // Block 0xe8, offset 0x6cd - {value: 0x0000, lo: 0x05}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0018, lo: 0x81, hi: 0x8f}, - {value: 0x0040, lo: 0x90, hi: 0x90}, - {value: 0x0018, lo: 0x91, hi: 0xb5}, - {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0xe9, offset 0x6d3 - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x8f}, - {value: 0xc1c1, lo: 0x90, hi: 0x90}, - {value: 0x0018, lo: 0x91, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xbf}, - // Block 0xea, offset 0x6d8 - {value: 0x0000, lo: 0x02}, - {value: 0x0040, lo: 0x80, hi: 0xa5}, - {value: 0x0018, lo: 0xa6, hi: 0xbf}, - // Block 0xeb, offset 0x6db - {value: 0x0000, lo: 0x0d}, - {value: 0xc7e9, lo: 0x80, hi: 0x80}, - {value: 0xc839, lo: 0x81, hi: 0x81}, - {value: 0xc889, lo: 0x82, hi: 0x82}, - {value: 0xc8d9, lo: 0x83, hi: 0x83}, - {value: 0xc929, lo: 0x84, hi: 0x84}, - {value: 0xc979, lo: 0x85, hi: 0x85}, - {value: 0xc9c9, lo: 0x86, hi: 0x86}, - {value: 0xca19, lo: 0x87, hi: 0x87}, - {value: 0xca69, lo: 0x88, hi: 0x88}, - {value: 0x0040, lo: 0x89, hi: 0x8f}, - {value: 0xcab9, lo: 0x90, hi: 0x90}, - {value: 0xcad9, lo: 0x91, hi: 0x91}, - {value: 0x0040, lo: 0x92, hi: 0xbf}, - // Block 0xec, offset 0x6e9 - {value: 0x0000, lo: 0x06}, - {value: 0x0018, lo: 0x80, hi: 0x92}, - {value: 0x0040, lo: 0x93, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xac}, - {value: 0x0040, lo: 0xad, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb6}, - {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xed, offset 0x6f0 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0xb3}, - {value: 0x0040, lo: 0xb4, hi: 0xbf}, - // Block 0xee, offset 0x6f3 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0x94}, - {value: 0x0040, lo: 0x95, hi: 0xbf}, - // Block 0xef, offset 0x6f6 - {value: 0x0000, lo: 0x03}, - {value: 0x0018, lo: 0x80, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0xbf}, - // Block 0xf0, offset 0x6fa - {value: 0x0000, lo: 0x05}, - {value: 0x0018, lo: 0x80, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x99}, - {value: 0x0040, lo: 0x9a, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xbf}, - // Block 0xf1, offset 0x700 - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x87}, - {value: 0x0040, lo: 0x88, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0xad}, - {value: 0x0040, lo: 0xae, hi: 0xbf}, - // Block 0xf2, offset 0x705 - {value: 0x0000, lo: 0x09}, - {value: 0x0040, lo: 0x80, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x0018, lo: 0xa0, hi: 0xa7}, - {value: 0x0040, lo: 0xa8, hi: 0xaf}, - {value: 0x0018, lo: 0xb0, hi: 0xb0}, - {value: 0x0040, lo: 0xb1, hi: 0xb2}, - {value: 0x0018, lo: 0xb3, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xf3, offset 0x70f - {value: 0x0000, lo: 0x04}, - {value: 0x0018, lo: 0x80, hi: 0x8b}, - {value: 0x0040, lo: 0x8c, hi: 0x8f}, - {value: 0x0018, lo: 0x90, hi: 0x9e}, - {value: 0x0040, lo: 0x9f, hi: 0xbf}, - // Block 0xf4, offset 0x714 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0x91}, - {value: 0x0040, lo: 0x92, hi: 0xbf}, - // Block 0xf5, offset 0x717 - {value: 0x0000, lo: 0x02}, - {value: 0x0018, lo: 0x80, hi: 0x80}, - {value: 0x0040, lo: 0x81, hi: 0xbf}, - // Block 0xf6, offset 0x71a - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0x96}, - {value: 0x0040, lo: 0x97, hi: 0xbf}, - // Block 0xf7, offset 0x71d - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xb4}, - {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0xf8, offset 0x720 - {value: 0x0000, lo: 0x03}, - {value: 0x0008, lo: 0x80, hi: 0x9d}, - {value: 0x0040, lo: 0x9e, hi: 0x9f}, - {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0xf9, offset 0x724 - {value: 0x0000, lo: 0x02}, - {value: 0x0008, lo: 0x80, hi: 0xa1}, - {value: 0x0040, lo: 0xa2, hi: 0xbf}, - // Block 0xfa, offset 0x727 - {value: 0x0020, lo: 0x0f}, - {value: 0xdeb9, lo: 0x80, hi: 0x89}, - {value: 0x8dfd, lo: 0x8a, hi: 0x8a}, - {value: 0xdff9, lo: 0x8b, hi: 0x9c}, - {value: 0x8e1d, lo: 0x9d, hi: 0x9d}, - {value: 0xe239, lo: 0x9e, hi: 0xa2}, - {value: 0x8e3d, lo: 0xa3, hi: 0xa3}, - {value: 0xe2d9, lo: 0xa4, hi: 0xab}, - {value: 0x7ed5, lo: 0xac, hi: 0xac}, - {value: 0xe3d9, lo: 0xad, hi: 0xaf}, - {value: 0x8e5d, lo: 0xb0, hi: 0xb0}, - {value: 0xe439, lo: 0xb1, hi: 0xb6}, - {value: 0x8e7d, lo: 0xb7, hi: 0xb9}, - {value: 0xe4f9, lo: 0xba, hi: 0xba}, - {value: 0x8edd, lo: 0xbb, hi: 0xbb}, - {value: 0xe519, lo: 0xbc, hi: 0xbf}, - // Block 0xfb, offset 0x737 - {value: 0x0020, lo: 0x10}, - {value: 0x937d, lo: 0x80, hi: 0x80}, - {value: 0xf099, lo: 0x81, hi: 0x86}, - {value: 0x939d, lo: 0x87, hi: 0x8a}, - {value: 0xd9f9, lo: 0x8b, hi: 0x8b}, - {value: 0xf159, lo: 0x8c, hi: 0x96}, - {value: 0x941d, lo: 0x97, hi: 0x97}, - {value: 0xf2b9, lo: 0x98, hi: 0xa3}, - {value: 0x943d, lo: 0xa4, hi: 0xa6}, - {value: 0xf439, lo: 0xa7, hi: 0xaa}, - {value: 0x949d, lo: 0xab, hi: 0xab}, - {value: 0xf4b9, lo: 0xac, hi: 0xac}, - {value: 0x94bd, lo: 0xad, hi: 0xad}, - {value: 0xf4d9, lo: 0xae, hi: 0xaf}, - {value: 0x94dd, lo: 0xb0, hi: 0xb1}, - {value: 0xf519, lo: 0xb2, hi: 0xbe}, - {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xfc, offset 0x748 - {value: 0x0000, lo: 0x04}, - {value: 0x0040, lo: 0x80, hi: 0x80}, - {value: 0x0340, lo: 0x81, hi: 0x81}, - {value: 0x0040, lo: 0x82, hi: 0x9f}, - {value: 0x0340, lo: 0xa0, hi: 0xbf}, - // Block 0xfd, offset 0x74d - {value: 0x0000, lo: 0x01}, - {value: 0x0340, lo: 0x80, hi: 0xbf}, - // Block 0xfe, offset 0x74f - {value: 0x0000, lo: 0x01}, - {value: 0x13c0, lo: 0x80, hi: 0xbf}, - // Block 0xff, offset 0x751 - {value: 0x0000, lo: 0x02}, - {value: 0x13c0, lo: 0x80, hi: 0xaf}, - {value: 0x0040, lo: 0xb0, hi: 0xbf}, -} - -// Total table size 41559 bytes (40KiB); checksum: F4A1FA4E diff --git a/vendor/golang.org/x/text/internal/export/idna/trie.go b/vendor/golang.org/x/text/internal/export/idna/trie.go deleted file mode 100644 index d90996886..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/trie.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package idna - -// appendMapping appends the mapping for the respective rune. isMapped must be -// true. A mapping is a categorization of a rune as defined in UTS #46. -func (c info) appendMapping(b []byte, s string) []byte { - index := int(c >> indexShift) - if c&xorBit == 0 { - s := mappings[index:] - return append(b, s[1:s[0]+1]...) - } - b = append(b, s...) - if c&inlineXOR == inlineXOR { - // TODO: support and handle two-byte inline masks - b[len(b)-1] ^= byte(index) - } else { - for p := len(b) - int(xorData[index]); p < len(b); p++ { - index++ - b[p] ^= xorData[index] - } - } - return b -} - -// Sparse block handling code. - -type valueRange struct { - value uint16 // header: value:stride - lo, hi byte // header: lo:n -} - -type sparseBlocks struct { - values []valueRange - offset []uint16 -} - -var idnaSparse = sparseBlocks{ - values: idnaSparseValues[:], - offset: idnaSparseOffset[:], -} - -// Don't use newIdnaTrie to avoid unconditional linking in of the table. -var trie = &idnaTrie{} - -// lookup determines the type of block n and looks up the value for b. -// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block -// is a list of ranges with an accompanying value. Given a matching range r, -// the value for b is by r.value + (b - r.lo) * stride. -func (t *sparseBlocks) lookup(n uint32, b byte) uint16 { - offset := t.offset[n] - header := t.values[offset] - lo := offset + 1 - hi := lo + uint16(header.lo) - for lo < hi { - m := lo + (hi-lo)/2 - r := t.values[m] - if r.lo <= b && b <= r.hi { - return r.value + uint16(b-r.lo)*header.value - } - if b < r.lo { - hi = m - } else { - lo = m + 1 - } - } - return 0 -} diff --git a/vendor/golang.org/x/text/internal/export/idna/trieval.go b/vendor/golang.org/x/text/internal/export/idna/trieval.go deleted file mode 100644 index 63cb03b59..000000000 --- a/vendor/golang.org/x/text/internal/export/idna/trieval.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package idna - -// This file contains definitions for interpreting the trie value of the idna -// trie generated by "go run gen*.go". It is shared by both the generator -// program and the resultant package. Sharing is achieved by the generator -// copying gen_trieval.go to trieval.go and changing what's above this comment. - -// info holds information from the IDNA mapping table for a single rune. It is -// the value returned by a trie lookup. In most cases, all information fits in -// a 16-bit value. For mappings, this value may contain an index into a slice -// with the mapped string. Such mappings can consist of the actual mapped value -// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the -// input rune. This technique is used by the cases packages and reduces the -// table size significantly. -// -// The per-rune values have the following format: -// -// if mapped { -// if inlinedXOR { -// 15..13 inline XOR marker -// 12..11 unused -// 10..3 inline XOR mask -// } else { -// 15..3 index into xor or mapping table -// } -// } else { -// 15..13 unused -// 12 modifier (including virama) -// 11 virama modifier -// 10..8 joining type -// 7..3 category type -// } -// 2 use xor pattern -// 1..0 mapped category -// -// See the definitions below for a more detailed description of the various -// bits. -type info uint16 - -const ( - catSmallMask = 0x3 - catBigMask = 0xF8 - indexShift = 3 - xorBit = 0x4 // interpret the index as an xor pattern - inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined. - - joinShift = 8 - joinMask = 0x07 - - viramaModifier = 0x0800 - modifier = 0x1000 -) - -// A category corresponds to a category defined in the IDNA mapping table. -type category uint16 - -const ( - unknown category = 0 // not defined currently in unicode. - mapped category = 1 - disallowedSTD3Mapped category = 2 - deviation category = 3 -) - -const ( - valid category = 0x08 - validNV8 category = 0x18 - validXV8 category = 0x28 - disallowed category = 0x40 - disallowedSTD3Valid category = 0x80 - ignored category = 0xC0 -) - -// join types and additional rune information -const ( - joiningL = (iota + 1) - joiningD - joiningT - joiningR - - //the following types are derived during processing - joinZWJ - joinZWNJ - joinVirama - numJoinTypes -) - -func (c info) isMapped() bool { - return c&0x3 != 0 -} - -func (c info) category() category { - small := c & catSmallMask - if small != 0 { - return category(small) - } - return category(c & catBigMask) -} - -func (c info) joinType() info { - if c.isMapped() { - return 0 - } - return (c >> joinShift) & joinMask -} - -func (c info) isModifier() bool { - return c&(modifier|catSmallMask) == modifier -} - -func (c info) isViramaModifier() bool { - return c&(viramaModifier|catSmallMask) == viramaModifier -} diff --git a/vendor/golang.org/x/text/internal/format/format.go b/vendor/golang.org/x/text/internal/format/format.go deleted file mode 100644 index ee1c57a3c..000000000 --- a/vendor/golang.org/x/text/internal/format/format.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package format contains types for defining language-specific formatting of -// values. -// -// This package is internal now, but will eventually be exposed after the API -// settles. -package format // import "golang.org/x/text/internal/format" - -import ( - "fmt" - - "golang.org/x/text/language" -) - -// State represents the printer state passed to custom formatters. It provides -// access to the fmt.State interface and the sentence and language-related -// context. -type State interface { - fmt.State - - // Language reports the requested language in which to render a message. - Language() language.Tag - - // TODO: consider this and removing rune from the Format method in the - // Formatter interface. - // - // Verb returns the format variant to render, analogous to the types used - // in fmt. Use 'v' for the default or only variant. - // Verb() rune - - // TODO: more info: - // - sentence context such as linguistic features passed by the translator. -} - -// Formatter is analogous to fmt.Formatter. -type Formatter interface { - Format(state State, verb rune) -} diff --git a/vendor/golang.org/x/text/internal/number/common.go b/vendor/golang.org/x/text/internal/number/common.go deleted file mode 100644 index e428a728d..000000000 --- a/vendor/golang.org/x/text/internal/number/common.go +++ /dev/null @@ -1,40 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package number - -import "unicode/utf8" - -// A system identifies a CLDR numbering system. -type system byte - -type systemData struct { - id system - digitSize byte // number of UTF-8 bytes per digit - zero [utf8.UTFMax]byte // UTF-8 sequence of zero digit. -} - -// A SymbolType identifies a symbol of a specific kind. -type SymbolType int - -const ( - SymDecimal SymbolType = iota - SymGroup - SymList - SymPercentSign - SymPlusSign - SymMinusSign - SymExponential - SymSuperscriptingExponent - SymPerMille - SymInfinity - SymNan - SymTimeSeparator - - NumSymbolTypes -) - -type altSymData struct { - compactTag uint16 - system system - symIndex byte -} diff --git a/vendor/golang.org/x/text/internal/number/decimal.go b/vendor/golang.org/x/text/internal/number/decimal.go deleted file mode 100644 index 62074e7d7..000000000 --- a/vendor/golang.org/x/text/internal/number/decimal.go +++ /dev/null @@ -1,486 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate stringer -type RoundingMode - -package number - -import ( - "math" - "strconv" -) - -// RoundingMode determines how a number is rounded to the desired precision. -type RoundingMode byte - -const ( - ToNearestEven RoundingMode = iota // towards the nearest integer, or towards an even number if equidistant. - ToNearestZero // towards the nearest integer, or towards zero if equidistant. - ToNearestAway // towards the nearest integer, or away from zero if equidistant. - ToPositiveInf // towards infinity - ToNegativeInf // towards negative infinity - ToZero // towards zero - AwayFromZero // away from zero - numModes -) - -const maxIntDigits = 20 - -// A Decimal represents a floating point number in decimal format. -// Digits represents a number [0, 1.0), and the absolute value represented by -// Decimal is Digits * 10^Exp. Leading and trailing zeros may be omitted and Exp -// may point outside a valid position in Digits. -// -// Examples: -// Number Decimal -// 12345 Digits: [1, 2, 3, 4, 5], Exp: 5 -// 12.345 Digits: [1, 2, 3, 4, 5], Exp: 2 -// 12000 Digits: [1, 2], Exp: 5 -// 12000.00 Digits: [1, 2], Exp: 5 -// 0.00123 Digits: [1, 2, 3], Exp: -2 -// 0 Digits: [], Exp: 0 -type Decimal struct { - digits - - buf [maxIntDigits]byte -} - -type digits struct { - Digits []byte // mantissa digits, big-endian - Exp int32 // exponent - Neg bool - Inf bool // Takes precedence over Digits and Exp. - NaN bool // Takes precedence over Inf. -} - -// Digits represents a floating point number represented in digits of the -// base in which a number is to be displayed. It is similar to Decimal, but -// keeps track of trailing fraction zeros and the comma placement for -// engineering notation. Digits must have at least one digit. -// -// Examples: -// Number Decimal -// decimal -// 12345 Digits: [1, 2, 3, 4, 5], Exp: 5 End: 5 -// 12.345 Digits: [1, 2, 3, 4, 5], Exp: 2 End: 5 -// 12000 Digits: [1, 2], Exp: 5 End: 5 -// 12000.00 Digits: [1, 2], Exp: 5 End: 7 -// 0.00123 Digits: [1, 2, 3], Exp: -2 End: 3 -// 0 Digits: [], Exp: 0 End: 1 -// scientific (actual exp is Exp - Comma) -// 0e0 Digits: [0], Exp: 1, End: 1, Comma: 1 -// .0e0 Digits: [0], Exp: 0, End: 1, Comma: 0 -// 0.0e0 Digits: [0], Exp: 1, End: 2, Comma: 1 -// 1.23e4 Digits: [1, 2, 3], Exp: 5, End: 3, Comma: 1 -// .123e5 Digits: [1, 2, 3], Exp: 5, End: 3, Comma: 0 -// engineering -// 12.3e3 Digits: [1, 2, 3], Exp: 5, End: 3, Comma: 2 -type Digits struct { - digits - // End indicates the end position of the number. - End int32 // For decimals Exp <= End. For scientific len(Digits) <= End. - // Comma is used for the comma position for scientific (always 0 or 1) and - // engineering notation (always 0, 1, 2, or 3). - Comma uint8 - // IsScientific indicates whether this number is to be rendered as a - // scientific number. - IsScientific bool -} - -func (d *Digits) NumFracDigits() int { - if d.Exp >= d.End { - return 0 - } - return int(d.End - d.Exp) -} - -// normalize returns a new Decimal with leading and trailing zeros removed. -func (d *Decimal) normalize() (n Decimal) { - n = *d - b := n.Digits - // Strip leading zeros. Resulting number of digits is significant digits. - for len(b) > 0 && b[0] == 0 { - b = b[1:] - n.Exp-- - } - // Strip trailing zeros - for len(b) > 0 && b[len(b)-1] == 0 { - b = b[:len(b)-1] - } - if len(b) == 0 { - n.Exp = 0 - } - n.Digits = b - return n -} - -func (d *Decimal) clear() { - b := d.Digits - if b == nil { - b = d.buf[:0] - } - *d = Decimal{} - d.Digits = b[:0] -} - -func (x *Decimal) String() string { - if x.NaN { - return "NaN" - } - var buf []byte - if x.Neg { - buf = append(buf, '-') - } - if x.Inf { - buf = append(buf, "Inf"...) - return string(buf) - } - switch { - case len(x.Digits) == 0: - buf = append(buf, '0') - case x.Exp <= 0: - // 0.00ddd - buf = append(buf, "0."...) - buf = appendZeros(buf, -int(x.Exp)) - buf = appendDigits(buf, x.Digits) - - case /* 0 < */ int(x.Exp) < len(x.Digits): - // dd.ddd - buf = appendDigits(buf, x.Digits[:x.Exp]) - buf = append(buf, '.') - buf = appendDigits(buf, x.Digits[x.Exp:]) - - default: // len(x.Digits) <= x.Exp - // ddd00 - buf = appendDigits(buf, x.Digits) - buf = appendZeros(buf, int(x.Exp)-len(x.Digits)) - } - return string(buf) -} - -func appendDigits(buf []byte, digits []byte) []byte { - for _, c := range digits { - buf = append(buf, c+'0') - } - return buf -} - -// appendZeros appends n 0 digits to buf and returns buf. -func appendZeros(buf []byte, n int) []byte { - for ; n > 0; n-- { - buf = append(buf, '0') - } - return buf -} - -func (d *digits) round(mode RoundingMode, n int) { - if n >= len(d.Digits) { - return - } - // Make rounding decision: The result mantissa is truncated ("rounded down") - // by default. Decide if we need to increment, or "round up", the (unsigned) - // mantissa. - inc := false - switch mode { - case ToNegativeInf: - inc = d.Neg - case ToPositiveInf: - inc = !d.Neg - case ToZero: - // nothing to do - case AwayFromZero: - inc = true - case ToNearestEven: - inc = d.Digits[n] > 5 || d.Digits[n] == 5 && - (len(d.Digits) > n+1 || n == 0 || d.Digits[n-1]&1 != 0) - case ToNearestAway: - inc = d.Digits[n] >= 5 - case ToNearestZero: - inc = d.Digits[n] > 5 || d.Digits[n] == 5 && len(d.Digits) > n+1 - default: - panic("unreachable") - } - if inc { - d.roundUp(n) - } else { - d.roundDown(n) - } -} - -// roundFloat rounds a floating point number. -func (r RoundingMode) roundFloat(x float64) float64 { - // Make rounding decision: The result mantissa is truncated ("rounded down") - // by default. Decide if we need to increment, or "round up", the (unsigned) - // mantissa. - abs := x - if x < 0 { - abs = -x - } - i, f := math.Modf(abs) - if f == 0.0 { - return x - } - inc := false - switch r { - case ToNegativeInf: - inc = x < 0 - case ToPositiveInf: - inc = x >= 0 - case ToZero: - // nothing to do - case AwayFromZero: - inc = true - case ToNearestEven: - // TODO: check overflow - inc = f > 0.5 || f == 0.5 && int64(i)&1 != 0 - case ToNearestAway: - inc = f >= 0.5 - case ToNearestZero: - inc = f > 0.5 - default: - panic("unreachable") - } - if inc { - i += 1 - } - if abs != x { - i = -i - } - return i -} - -func (x *digits) roundUp(n int) { - if n < 0 || n >= len(x.Digits) { - return // nothing to do - } - // find first digit < 9 - for n > 0 && x.Digits[n-1] >= 9 { - n-- - } - - if n == 0 { - // all digits are 9s => round up to 1 and update exponent - x.Digits[0] = 1 // ok since len(x.Digits) > n - x.Digits = x.Digits[:1] - x.Exp++ - return - } - x.Digits[n-1]++ - x.Digits = x.Digits[:n] - // x already trimmed -} - -func (x *digits) roundDown(n int) { - if n < 0 || n >= len(x.Digits) { - return // nothing to do - } - x.Digits = x.Digits[:n] - trim(x) -} - -// trim cuts off any trailing zeros from x's mantissa; -// they are meaningless for the value of x. -func trim(x *digits) { - i := len(x.Digits) - for i > 0 && x.Digits[i-1] == 0 { - i-- - } - x.Digits = x.Digits[:i] - if i == 0 { - x.Exp = 0 - } -} - -// A Converter converts a number into decimals according to the given rounding -// criteria. -type Converter interface { - Convert(d *Decimal, r RoundingContext) -} - -const ( - signed = true - unsigned = false -) - -// Convert converts the given number to the decimal representation using the -// supplied RoundingContext. -func (d *Decimal) Convert(r RoundingContext, number interface{}) { - switch f := number.(type) { - case Converter: - d.clear() - f.Convert(d, r) - case float32: - d.ConvertFloat(r, float64(f), 32) - case float64: - d.ConvertFloat(r, f, 64) - case int: - d.ConvertInt(r, signed, uint64(f)) - case int8: - d.ConvertInt(r, signed, uint64(f)) - case int16: - d.ConvertInt(r, signed, uint64(f)) - case int32: - d.ConvertInt(r, signed, uint64(f)) - case int64: - d.ConvertInt(r, signed, uint64(f)) - case uint: - d.ConvertInt(r, unsigned, uint64(f)) - case uint8: - d.ConvertInt(r, unsigned, uint64(f)) - case uint16: - d.ConvertInt(r, unsigned, uint64(f)) - case uint32: - d.ConvertInt(r, unsigned, uint64(f)) - case uint64: - d.ConvertInt(r, unsigned, f) - - default: - d.NaN = true - // TODO: - // case string: if produced by strconv, allows for easy arbitrary pos. - // case reflect.Value: - // case big.Float - // case big.Int - // case big.Rat? - // catch underlyings using reflect or will this already be done by the - // message package? - } -} - -// ConvertInt converts an integer to decimals. -func (d *Decimal) ConvertInt(r RoundingContext, signed bool, x uint64) { - if r.Increment > 0 { - // TODO: if uint64 is too large, fall back to float64 - if signed { - d.ConvertFloat(r, float64(int64(x)), 64) - } else { - d.ConvertFloat(r, float64(x), 64) - } - return - } - d.clear() - if signed && int64(x) < 0 { - x = uint64(-int64(x)) - d.Neg = true - } - d.fillIntDigits(x) - d.Exp = int32(len(d.Digits)) -} - -// ConvertFloat converts a floating point number to decimals. -func (d *Decimal) ConvertFloat(r RoundingContext, x float64, size int) { - d.clear() - if math.IsNaN(x) { - d.NaN = true - return - } - // Simple case: decimal notation - if r.Increment > 0 { - scale := int(r.IncrementScale) - mult := 1.0 - if scale > len(scales) { - mult = math.Pow(10, float64(scale)) - } else { - mult = scales[scale] - } - // We multiply x instead of dividing inc as it gives less rounding - // issues. - x *= mult - x /= float64(r.Increment) - x = r.Mode.roundFloat(x) - x *= float64(r.Increment) - x /= mult - } - - abs := x - if x < 0 { - d.Neg = true - abs = -x - } - if math.IsInf(abs, 1) { - d.Inf = true - return - } - - // By default we get the exact decimal representation. - verb := byte('g') - prec := -1 - // Determine rounding, if possible. As the strconv API does not return the - // rounding accuracy (exact/rounded up|down), we can only round using - // ToNearestEven. - // Something like this would work: - // AppendDigits(dst []byte, x float64, base, size, prec int) (digits []byte, exp, accuracy int) - // - // TODO: At this point strconv's rounding is imprecise to the point that it - // is not useable for this purpose. - // See https://github.com/golang/go/issues/21714 - // if r.Mode == ToNearestEven { - // if n := r.RoundSignificantDigits(); n >= 0 { - // prec = n - // } else if n = r.RoundFractionDigits(); n >= 0 { - // prec = n - // verb = 'f' - // } - // } - - b := strconv.AppendFloat(d.Digits[:0], abs, verb, prec, size) - i := 0 - k := 0 - beforeDot := 1 - for i < len(b) { - if c := b[i]; '0' <= c && c <= '9' { - b[k] = c - '0' - k++ - d.Exp += int32(beforeDot) - } else if c == '.' { - beforeDot = 0 - d.Exp = int32(k) - } else { - break - } - i++ - } - d.Digits = b[:k] - if i != len(b) { - i += len("e") - pSign := i - exp := 0 - for i++; i < len(b); i++ { - exp *= 10 - exp += int(b[i] - '0') - } - if b[pSign] == '-' { - exp = -exp - } - d.Exp = int32(exp) + 1 - } -} - -func (d *Decimal) fillIntDigits(x uint64) { - if cap(d.Digits) < maxIntDigits { - d.Digits = d.buf[:] - } else { - d.Digits = d.buf[:maxIntDigits] - } - i := 0 - for ; x > 0; x /= 10 { - d.Digits[i] = byte(x % 10) - i++ - } - d.Digits = d.Digits[:i] - for p := 0; p < i; p++ { - i-- - d.Digits[p], d.Digits[i] = d.Digits[i], d.Digits[p] - } -} - -var scales [70]float64 - -func init() { - x := 1.0 - for i := range scales { - scales[i] = x - x *= 10 - } -} diff --git a/vendor/golang.org/x/text/internal/number/decimal_test.go b/vendor/golang.org/x/text/internal/number/decimal_test.go deleted file mode 100644 index 04aa8b2c8..000000000 --- a/vendor/golang.org/x/text/internal/number/decimal_test.go +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package number - -import ( - "fmt" - "math" - "strconv" - "strings" - "testing" -) - -func mkfloat(num string) float64 { - u, _ := strconv.ParseUint(num, 10, 32) - return float64(u) -} - -// mkdec creates a decimal from a string. All ASCII digits are converted to -// digits in the decimal. The dot is used to indicate the scale by which the -// digits are shifted. Numbers may have an additional exponent or be the special -// value NaN, Inf, or -Inf. -func mkdec(num string) (d Decimal) { - var r RoundingContext - d.Convert(r, dec(num)) - return -} - -type dec string - -func (s dec) Convert(d *Decimal, _ RoundingContext) { - num := string(s) - if num[0] == '-' { - d.Neg = true - num = num[1:] - } - switch num { - case "NaN": - d.NaN = true - return - case "Inf": - d.Inf = true - return - } - if p := strings.IndexAny(num, "eE"); p != -1 { - i64, err := strconv.ParseInt(num[p+1:], 10, 32) - if err != nil { - panic(err) - } - d.Exp = int32(i64) - num = num[:p] - } - if p := strings.IndexByte(num, '.'); p != -1 { - d.Exp += int32(p) - num = num[:p] + num[p+1:] - } else { - d.Exp += int32(len(num)) - } - d.Digits = []byte(num) - for i := range d.Digits { - d.Digits[i] -= '0' - } - *d = d.normalize() -} - -func byteNum(s string) []byte { - b := make([]byte, len(s)) - for i := 0; i < len(s); i++ { - if c := s[i]; '0' <= c && c <= '9' { - b[i] = s[i] - '0' - } else { - b[i] = s[i] - 'a' + 10 - } - } - return b -} - -func strNum(s string) string { - return string(byteNum(s)) -} - -func TestDecimalString(t *testing.T) { - for _, test := range []struct { - x Decimal - want string - }{ - {want: "0"}, - {Decimal{digits: digits{Digits: nil, Exp: 1000}}, "0"}, // exponent of 1000 is ignored - {Decimal{digits: digits{Digits: byteNum("12345"), Exp: 0}}, "0.12345"}, - {Decimal{digits: digits{Digits: byteNum("12345"), Exp: -3}}, "0.00012345"}, - {Decimal{digits: digits{Digits: byteNum("12345"), Exp: +3}}, "123.45"}, - {Decimal{digits: digits{Digits: byteNum("12345"), Exp: +10}}, "1234500000"}, - } { - if got := test.x.String(); got != test.want { - t.Errorf("%v == %q; want %q", test.x, got, test.want) - } - } -} - -func TestRounding(t *testing.T) { - testCases := []struct { - x string - n int - // modes is the result for modes. Signs are left out of the result. - // The results are stored in the following order: - // zero, negInf - // nearZero, nearEven, nearAway - // away, posInf - modes [numModes]string - }{ - {"0", 1, [numModes]string{ - "0", "0", - "0", "0", "0", - "0", "0"}}, - {"1", 1, [numModes]string{ - "1", "1", - "1", "1", "1", - "1", "1"}}, - {"5", 1, [numModes]string{ - "5", "5", - "5", "5", "5", - "5", "5"}}, - {"15", 1, [numModes]string{ - "10", "10", - "10", "20", "20", - "20", "20"}}, - {"45", 1, [numModes]string{ - "40", "40", - "40", "40", "50", - "50", "50"}}, - {"95", 1, [numModes]string{ - "90", "90", - "90", "100", "100", - "100", "100"}}, - - {"12344999", 4, [numModes]string{ - "12340000", "12340000", - "12340000", "12340000", "12340000", - "12350000", "12350000"}}, - {"12345000", 4, [numModes]string{ - "12340000", "12340000", - "12340000", "12340000", "12350000", - "12350000", "12350000"}}, - {"12345001", 4, [numModes]string{ - "12340000", "12340000", - "12350000", "12350000", "12350000", - "12350000", "12350000"}}, - {"12345100", 4, [numModes]string{ - "12340000", "12340000", - "12350000", "12350000", "12350000", - "12350000", "12350000"}}, - {"23454999", 4, [numModes]string{ - "23450000", "23450000", - "23450000", "23450000", "23450000", - "23460000", "23460000"}}, - {"23455000", 4, [numModes]string{ - "23450000", "23450000", - "23450000", "23460000", "23460000", - "23460000", "23460000"}}, - {"23455001", 4, [numModes]string{ - "23450000", "23450000", - "23460000", "23460000", "23460000", - "23460000", "23460000"}}, - {"23455100", 4, [numModes]string{ - "23450000", "23450000", - "23460000", "23460000", "23460000", - "23460000", "23460000"}}, - - {"99994999", 4, [numModes]string{ - "99990000", "99990000", - "99990000", "99990000", "99990000", - "100000000", "100000000"}}, - {"99995000", 4, [numModes]string{ - "99990000", "99990000", - "99990000", "100000000", "100000000", - "100000000", "100000000"}}, - {"99999999", 4, [numModes]string{ - "99990000", "99990000", - "100000000", "100000000", "100000000", - "100000000", "100000000"}}, - - {"12994999", 4, [numModes]string{ - "12990000", "12990000", - "12990000", "12990000", "12990000", - "13000000", "13000000"}}, - {"12995000", 4, [numModes]string{ - "12990000", "12990000", - "12990000", "13000000", "13000000", - "13000000", "13000000"}}, - {"12999999", 4, [numModes]string{ - "12990000", "12990000", - "13000000", "13000000", "13000000", - "13000000", "13000000"}}, - } - modes := []RoundingMode{ - ToZero, ToNegativeInf, - ToNearestZero, ToNearestEven, ToNearestAway, - AwayFromZero, ToPositiveInf, - } - for _, tc := range testCases { - // Create negative counterpart tests: the sign is reversed and - // ToPositiveInf and ToNegativeInf swapped. - negModes := tc.modes - negModes[1], negModes[6] = negModes[6], negModes[1] - for i, res := range negModes { - negModes[i] = "-" + res - } - for i, m := range modes { - t.Run(fmt.Sprintf("x:%s/n:%d/%s", tc.x, tc.n, m), func(t *testing.T) { - d := mkdec(tc.x) - d.round(m, tc.n) - if got := d.String(); got != tc.modes[i] { - t.Errorf("pos decimal: got %q; want %q", d.String(), tc.modes[i]) - } - - mult := math.Pow(10, float64(len(tc.x)-tc.n)) - f := mkfloat(tc.x) - f = m.roundFloat(f/mult) * mult - if got := fmt.Sprintf("%.0f", f); got != tc.modes[i] { - t.Errorf("pos float: got %q; want %q", got, tc.modes[i]) - } - - // Test the negative case. This is the same as the positive - // case, but with ToPositiveInf and ToNegativeInf swapped. - d = mkdec(tc.x) - d.Neg = true - d.round(m, tc.n) - if got, want := d.String(), negModes[i]; got != want { - t.Errorf("neg decimal: got %q; want %q", d.String(), want) - } - - f = -mkfloat(tc.x) - f = m.roundFloat(f/mult) * mult - if got := fmt.Sprintf("%.0f", f); got != negModes[i] { - t.Errorf("neg float: got %q; want %q", got, negModes[i]) - } - }) - } - } -} - -func TestConvert(t *testing.T) { - scale2 := RoundingContext{} - scale2.SetScale(2) - scale2away := RoundingContext{Mode: AwayFromZero} - scale2away.SetScale(2) - inc0_05 := RoundingContext{Increment: 5, IncrementScale: 2} - inc0_05.SetScale(2) - inc50 := RoundingContext{Increment: 50} - prec3 := RoundingContext{} - prec3.SetPrecision(3) - roundShift := RoundingContext{DigitShift: 2, MaxFractionDigits: 2} - testCases := []struct { - x interface{} - rc RoundingContext - out string - }{ - // TODO: uncommented tests can be restored when convert does its own - // rounding. - // {-0.001, scale2, "-0.00"}, // not normalized - // {0.1234, prec3, "0.123"}, - // {1234.0, prec3, "1230"}, - // {1.2345e10, prec3, "12300000000"}, - - {int8(-34), scale2, "-34"}, - {int16(-234), scale2, "-234"}, - {int32(-234), scale2, "-234"}, - {int64(-234), scale2, "-234"}, - {int(-234), scale2, "-234"}, - {uint8(234), scale2, "234"}, - {uint16(234), scale2, "234"}, - {uint32(234), scale2, "234"}, - {uint64(234), scale2, "234"}, - {uint(234), scale2, "234"}, - {-1e9, scale2, "-1000000000"}, - {0.234, scale2away, "0.234"}, // rounding postponed as not ToNearestEven - - {0.03, inc0_05, "0.05"}, - {0.025, inc0_05, "0"}, - {0.075, inc0_05, "0.1"}, - {325, inc50, "300"}, - {375, inc50, "400"}, - - // Here the scale is 2, but the digits get shifted left. As we use - // AppendFloat to do the rounding an exta 0 gets added. - {0.123, roundShift, "0.123"}, - - {converter(3), scale2, "100"}, - - {math.Inf(1), inc50, "Inf"}, - {math.Inf(-1), inc50, "-Inf"}, - {math.NaN(), inc50, "NaN"}, - {"clearly not a number", scale2, "NaN"}, - } - for _, tc := range testCases { - var d Decimal - t.Run(fmt.Sprintf("%T:%v-%v", tc.x, tc.x, tc.rc), func(t *testing.T) { - d.Convert(tc.rc, tc.x) - if got := d.String(); got != tc.out { - t.Errorf("got %q; want %q", got, tc.out) - } - }) - } -} - -type converter int - -func (c converter) Convert(d *Decimal, r RoundingContext) { - d.Digits = append(d.Digits, 1, 0, 0) - d.Exp = 3 -} diff --git a/vendor/golang.org/x/text/internal/number/format.go b/vendor/golang.org/x/text/internal/number/format.go deleted file mode 100755 index 0a5ffb548..000000000 --- a/vendor/golang.org/x/text/internal/number/format.go +++ /dev/null @@ -1,533 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package number - -import ( - "strconv" - "unicode/utf8" - - "golang.org/x/text/language" -) - -// TODO: -// - grouping of fractions -// - allow user-defined superscript notation (such as <sup>4</sup>) -// - same for non-breaking spaces, like   - -// Formatting proceeds along the following lines: -// 0) Compose rounding information from format and context. -// 1) Convert a number into a Decimal. -// 2) Sanitize Decimal by adding trailing zeros, removing leading digits, and -// (non-increment) rounding. The Decimal that results from this is suitable -// for determining the plural form. -// 3) Render the Decimal in the localized form. - -// Formatter contains all the information needed to render a number. -type Formatter struct { - Pattern - Info -} - -func (f *Formatter) init(t language.Tag, index []uint8) { - f.Info = InfoFromTag(t) - for ; ; t = t.Parent() { - if ci, ok := language.CompactIndex(t); ok { - f.Pattern = formats[index[ci]] - break - } - } -} - -// InitPattern initializes a Formatter for the given Pattern. -func (f *Formatter) InitPattern(t language.Tag, pat *Pattern) { - f.Info = InfoFromTag(t) - f.Pattern = *pat -} - -// InitDecimal initializes a Formatter using the default Pattern for the given -// language. -func (f *Formatter) InitDecimal(t language.Tag) { - f.init(t, tagToDecimal) -} - -// InitScientific initializes a Formatter using the default Pattern for the -// given language. -func (f *Formatter) InitScientific(t language.Tag) { - f.init(t, tagToScientific) - f.Pattern.MinFractionDigits = 0 - f.Pattern.MaxFractionDigits = -1 -} - -// InitEngineering initializes a Formatter using the default Pattern for the -// given language. -func (f *Formatter) InitEngineering(t language.Tag) { - f.init(t, tagToScientific) - f.Pattern.MinFractionDigits = 0 - f.Pattern.MaxFractionDigits = -1 - f.Pattern.MaxIntegerDigits = 3 - f.Pattern.MinIntegerDigits = 1 -} - -// InitPercent initializes a Formatter using the default Pattern for the given -// language. -func (f *Formatter) InitPercent(t language.Tag) { - f.init(t, tagToPercent) -} - -// InitPerMille initializes a Formatter using the default Pattern for the given -// language. -func (f *Formatter) InitPerMille(t language.Tag) { - f.init(t, tagToPercent) - f.Pattern.DigitShift = 3 -} - -func (f *Formatter) Append(dst []byte, x interface{}) []byte { - var d Decimal - r := f.RoundingContext - d.Convert(r, x) - return f.Render(dst, FormatDigits(&d, r)) -} - -func FormatDigits(d *Decimal, r RoundingContext) Digits { - if r.isScientific() { - return scientificVisibleDigits(r, d) - } - return decimalVisibleDigits(r, d) -} - -func (f *Formatter) Format(dst []byte, d *Decimal) []byte { - return f.Render(dst, FormatDigits(d, f.RoundingContext)) -} - -func (f *Formatter) Render(dst []byte, d Digits) []byte { - var result []byte - var postPrefix, preSuffix int - if d.IsScientific { - result, postPrefix, preSuffix = appendScientific(dst, f, &d) - } else { - result, postPrefix, preSuffix = appendDecimal(dst, f, &d) - } - if f.PadRune == 0 { - return result - } - width := int(f.FormatWidth) - if count := utf8.RuneCount(result); count < width { - insertPos := 0 - switch f.Flags & PadMask { - case PadAfterPrefix: - insertPos = postPrefix - case PadBeforeSuffix: - insertPos = preSuffix - case PadAfterSuffix: - insertPos = len(result) - } - num := width - count - pad := [utf8.UTFMax]byte{' '} - sz := 1 - if r := f.PadRune; r != 0 { - sz = utf8.EncodeRune(pad[:], r) - } - extra := sz * num - if n := len(result) + extra; n < cap(result) { - result = result[:n] - copy(result[insertPos+extra:], result[insertPos:]) - } else { - buf := make([]byte, n) - copy(buf, result[:insertPos]) - copy(buf[insertPos+extra:], result[insertPos:]) - result = buf - } - for ; num > 0; num-- { - insertPos += copy(result[insertPos:], pad[:sz]) - } - } - return result -} - -// decimalVisibleDigits converts d according to the RoundingContext. Note that -// the exponent may change as a result of this operation. -func decimalVisibleDigits(r RoundingContext, d *Decimal) Digits { - if d.NaN || d.Inf { - return Digits{digits: digits{Neg: d.Neg, NaN: d.NaN, Inf: d.Inf}} - } - n := Digits{digits: d.normalize().digits} - - exp := n.Exp - exp += int32(r.DigitShift) - - // Cap integer digits. Remove *most-significant* digits. - if r.MaxIntegerDigits > 0 { - if p := int(exp) - int(r.MaxIntegerDigits); p > 0 { - if p > len(n.Digits) { - p = len(n.Digits) - } - if n.Digits = n.Digits[p:]; len(n.Digits) == 0 { - exp = 0 - } else { - exp -= int32(p) - } - // Strip leading zeros. - for len(n.Digits) > 0 && n.Digits[0] == 0 { - n.Digits = n.Digits[1:] - exp-- - } - } - } - - // Rounding if not already done by Convert. - p := len(n.Digits) - if maxSig := int(r.MaxSignificantDigits); maxSig > 0 { - p = maxSig - } - if maxFrac := int(r.MaxFractionDigits); maxFrac >= 0 { - if cap := int(exp) + maxFrac; cap < p { - p = int(exp) + maxFrac - } - if p < 0 { - p = 0 - } - } - n.round(r.Mode, p) - - // set End (trailing zeros) - n.End = int32(len(n.Digits)) - if n.End == 0 { - exp = 0 - if r.MinFractionDigits > 0 { - n.End = int32(r.MinFractionDigits) - } - if p := int32(r.MinSignificantDigits) - 1; p > n.End { - n.End = p - } - } else { - if end := exp + int32(r.MinFractionDigits); end > n.End { - n.End = end - } - if n.End < int32(r.MinSignificantDigits) { - n.End = int32(r.MinSignificantDigits) - } - } - n.Exp = exp - return n -} - -// appendDecimal appends a formatted number to dst. It returns two possible -// insertion points for padding. -func appendDecimal(dst []byte, f *Formatter, n *Digits) (b []byte, postPre, preSuf int) { - if dst, ok := f.renderSpecial(dst, n); ok { - return dst, 0, len(dst) - } - digits := n.Digits - exp := n.Exp - - // Split in integer and fraction part. - var intDigits, fracDigits []byte - numInt := 0 - numFrac := int(n.End - n.Exp) - if exp > 0 { - numInt = int(exp) - if int(exp) >= len(digits) { // ddddd | ddddd00 - intDigits = digits - } else { // ddd.dd - intDigits = digits[:exp] - fracDigits = digits[exp:] - } - } else { - fracDigits = digits - } - - neg := n.Neg - affix, suffix := f.getAffixes(neg) - dst = appendAffix(dst, f, affix, neg) - savedLen := len(dst) - - minInt := int(f.MinIntegerDigits) - if minInt == 0 && f.MinSignificantDigits > 0 { - minInt = 1 - } - // add leading zeros - for i := minInt; i > numInt; i-- { - dst = f.AppendDigit(dst, 0) - if f.needsSep(i) { - dst = append(dst, f.Symbol(SymGroup)...) - } - } - i := 0 - for ; i < len(intDigits); i++ { - dst = f.AppendDigit(dst, intDigits[i]) - if f.needsSep(numInt - i) { - dst = append(dst, f.Symbol(SymGroup)...) - } - } - for ; i < numInt; i++ { - dst = f.AppendDigit(dst, 0) - if f.needsSep(numInt - i) { - dst = append(dst, f.Symbol(SymGroup)...) - } - } - - if numFrac > 0 || f.Flags&AlwaysDecimalSeparator != 0 { - dst = append(dst, f.Symbol(SymDecimal)...) - } - // Add trailing zeros - i = 0 - for n := -int(n.Exp); i < n; i++ { - dst = f.AppendDigit(dst, 0) - } - for _, d := range fracDigits { - i++ - dst = f.AppendDigit(dst, d) - } - for ; i < numFrac; i++ { - dst = f.AppendDigit(dst, 0) - } - return appendAffix(dst, f, suffix, neg), savedLen, len(dst) -} - -func scientificVisibleDigits(r RoundingContext, d *Decimal) Digits { - if d.NaN || d.Inf { - return Digits{digits: digits{Neg: d.Neg, NaN: d.NaN, Inf: d.Inf}} - } - n := Digits{digits: d.normalize().digits, IsScientific: true} - - // Normalize to have at least one digit. This simplifies engineering - // notation. - if len(n.Digits) == 0 { - n.Digits = append(n.Digits, 0) - n.Exp = 1 - } - - // Significant digits are transformed by the parser for scientific notation - // and do not need to be handled here. - maxInt, numInt := int(r.MaxIntegerDigits), int(r.MinIntegerDigits) - if numInt == 0 { - numInt = 1 - } - - // If a maximum number of integers is specified, the minimum must be 1 - // and the exponent is grouped by this number (e.g. for engineering) - if maxInt > numInt { - // Correct the exponent to reflect a single integer digit. - numInt = 1 - // engineering - // 0.01234 ([12345]e-1) -> 1.2345e-2 12.345e-3 - // 12345 ([12345]e+5) -> 1.2345e4 12.345e3 - d := int(n.Exp-1) % maxInt - if d < 0 { - d += maxInt - } - numInt += d - } - - p := len(n.Digits) - if maxSig := int(r.MaxSignificantDigits); maxSig > 0 { - p = maxSig - } - if maxFrac := int(r.MaxFractionDigits); maxFrac >= 0 && numInt+maxFrac < p { - p = numInt + maxFrac - } - n.round(r.Mode, p) - - n.Comma = uint8(numInt) - n.End = int32(len(n.Digits)) - if minSig := int32(r.MinFractionDigits) + int32(numInt); n.End < minSig { - n.End = minSig - } - return n -} - -// appendScientific appends a formatted number to dst. It returns two possible -// insertion points for padding. -func appendScientific(dst []byte, f *Formatter, n *Digits) (b []byte, postPre, preSuf int) { - if dst, ok := f.renderSpecial(dst, n); ok { - return dst, 0, 0 - } - digits := n.Digits - numInt := int(n.Comma) - numFrac := int(n.End) - int(n.Comma) - - var intDigits, fracDigits []byte - if numInt <= len(digits) { - intDigits = digits[:numInt] - fracDigits = digits[numInt:] - } else { - intDigits = digits - } - neg := n.Neg - affix, suffix := f.getAffixes(neg) - dst = appendAffix(dst, f, affix, neg) - savedLen := len(dst) - - i := 0 - for ; i < len(intDigits); i++ { - dst = f.AppendDigit(dst, intDigits[i]) - if f.needsSep(numInt - i) { - dst = append(dst, f.Symbol(SymGroup)...) - } - } - for ; i < numInt; i++ { - dst = f.AppendDigit(dst, 0) - if f.needsSep(numInt - i) { - dst = append(dst, f.Symbol(SymGroup)...) - } - } - - if numFrac > 0 || f.Flags&AlwaysDecimalSeparator != 0 { - dst = append(dst, f.Symbol(SymDecimal)...) - } - i = 0 - for ; i < len(fracDigits); i++ { - dst = f.AppendDigit(dst, fracDigits[i]) - } - for ; i < numFrac; i++ { - dst = f.AppendDigit(dst, 0) - } - - // exp - buf := [12]byte{} - // TODO: use exponential if superscripting is not available (no Latin - // numbers or no tags) and use exponential in all other cases. - exp := n.Exp - int32(n.Comma) - exponential := f.Symbol(SymExponential) - if exponential == "E" { - dst = append(dst, "\u202f"...) // NARROW NO-BREAK SPACE - dst = append(dst, f.Symbol(SymSuperscriptingExponent)...) - dst = append(dst, "\u202f"...) // NARROW NO-BREAK SPACE - dst = f.AppendDigit(dst, 1) - dst = f.AppendDigit(dst, 0) - switch { - case exp < 0: - dst = append(dst, superMinus...) - exp = -exp - case f.Flags&AlwaysExpSign != 0: - dst = append(dst, superPlus...) - } - b = strconv.AppendUint(buf[:0], uint64(exp), 10) - for i := len(b); i < int(f.MinExponentDigits); i++ { - dst = append(dst, superDigits[0]...) - } - for _, c := range b { - dst = append(dst, superDigits[c-'0']...) - } - } else { - dst = append(dst, exponential...) - switch { - case exp < 0: - dst = append(dst, f.Symbol(SymMinusSign)...) - exp = -exp - case f.Flags&AlwaysExpSign != 0: - dst = append(dst, f.Symbol(SymPlusSign)...) - } - b = strconv.AppendUint(buf[:0], uint64(exp), 10) - for i := len(b); i < int(f.MinExponentDigits); i++ { - dst = f.AppendDigit(dst, 0) - } - for _, c := range b { - dst = f.AppendDigit(dst, c-'0') - } - } - return appendAffix(dst, f, suffix, neg), savedLen, len(dst) -} - -const ( - superMinus = "\u207B" // SUPERSCRIPT HYPHEN-MINUS - superPlus = "\u207A" // SUPERSCRIPT PLUS SIGN -) - -var ( - // Note: the digits are not sequential!!! - superDigits = []string{ - "\u2070", // SUPERSCRIPT DIGIT ZERO - "\u00B9", // SUPERSCRIPT DIGIT ONE - "\u00B2", // SUPERSCRIPT DIGIT TWO - "\u00B3", // SUPERSCRIPT DIGIT THREE - "\u2074", // SUPERSCRIPT DIGIT FOUR - "\u2075", // SUPERSCRIPT DIGIT FIVE - "\u2076", // SUPERSCRIPT DIGIT SIX - "\u2077", // SUPERSCRIPT DIGIT SEVEN - "\u2078", // SUPERSCRIPT DIGIT EIGHT - "\u2079", // SUPERSCRIPT DIGIT NINE - } -) - -func (f *Formatter) getAffixes(neg bool) (affix, suffix string) { - str := f.Affix - if str != "" { - if f.NegOffset > 0 { - if neg { - str = str[f.NegOffset:] - } else { - str = str[:f.NegOffset] - } - } - sufStart := 1 + str[0] - affix = str[1:sufStart] - suffix = str[sufStart+1:] - } - // TODO: introduce a NeedNeg sign to indicate if the left pattern already - // has a sign marked? - if f.NegOffset == 0 && (neg || f.Flags&AlwaysSign != 0) { - affix = "-" + affix - } - return affix, suffix -} - -func (f *Formatter) renderSpecial(dst []byte, d *Digits) (b []byte, ok bool) { - if d.NaN { - return fmtNaN(dst, f), true - } - if d.Inf { - return fmtInfinite(dst, f, d), true - } - return dst, false -} - -func fmtNaN(dst []byte, f *Formatter) []byte { - return append(dst, f.Symbol(SymNan)...) -} - -func fmtInfinite(dst []byte, f *Formatter, d *Digits) []byte { - affix, suffix := f.getAffixes(d.Neg) - dst = appendAffix(dst, f, affix, d.Neg) - dst = append(dst, f.Symbol(SymInfinity)...) - dst = appendAffix(dst, f, suffix, d.Neg) - return dst -} - -func appendAffix(dst []byte, f *Formatter, affix string, neg bool) []byte { - quoting := false - escaping := false - for _, r := range affix { - switch { - case escaping: - // escaping occurs both inside and outside of quotes - dst = append(dst, string(r)...) - escaping = false - case r == '\\': - escaping = true - case r == '\'': - quoting = !quoting - case quoting: - dst = append(dst, string(r)...) - case r == '%': - if f.DigitShift == 3 { - dst = append(dst, f.Symbol(SymPerMille)...) - } else { - dst = append(dst, f.Symbol(SymPercentSign)...) - } - case r == '-' || r == '+': - if neg { - dst = append(dst, f.Symbol(SymMinusSign)...) - } else if f.Flags&ElideSign == 0 { - dst = append(dst, f.Symbol(SymPlusSign)...) - } else { - dst = append(dst, ' ') - } - default: - dst = append(dst, string(r)...) - } - } - return dst -} diff --git a/vendor/golang.org/x/text/internal/number/format_test.go b/vendor/golang.org/x/text/internal/number/format_test.go deleted file mode 100755 index 01a089430..000000000 --- a/vendor/golang.org/x/text/internal/number/format_test.go +++ /dev/null @@ -1,522 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package number - -import ( - "fmt" - "log" - "testing" - - "golang.org/x/text/language" -) - -func TestAppendDecimal(t *testing.T) { - type pairs map[string]string // alternates with decimal input and result - - testCases := []struct { - pattern string - // We want to be able to test some forms of patterns that cannot be - // represented as a string. - pat *Pattern - - test pairs - }{{ - pattern: "0", - test: pairs{ - "0": "0", - "1": "1", - "-1": "-1", - ".00": "0", - "10.": "10", - "12": "12", - "1.2": "1", - "NaN": "NaN", - "-Inf": "-∞", - }, - }, { - pattern: "+0;+0", - test: pairs{ - "0": "+0", - "1": "+1", - "-1": "-1", - ".00": "+0", - "10.": "+10", - "12": "+12", - "1.2": "+1", - "NaN": "NaN", - "-Inf": "-∞", - "Inf": "+∞", - }, - }, { - pattern: "0 +;0 +", - test: pairs{ - "0": "0 +", - "1": "1 +", - "-1": "1 -", - ".00": "0 +", - }, - }, { - pattern: "0;0-", - test: pairs{ - "-1": "1-", - "NaN": "NaN", - "-Inf": "∞-", - "Inf": "∞", - }, - }, { - pattern: "0000", - test: pairs{ - "0": "0000", - "1": "0001", - "12": "0012", - "12345": "12345", - }, - }, { - pattern: ".0", - test: pairs{ - "0": ".0", - "1": "1.0", - "1.2": "1.2", - "1.2345": "1.2", - }, - }, { - pattern: "#.0", - test: pairs{ - "0": ".0", - }, - }, { - pattern: "#.0#", - test: pairs{ - "0": ".0", - "1": "1.0", - }, - }, { - pattern: "0.0#", - test: pairs{ - "0": "0.0", - }, - }, { - pattern: "#0.###", - test: pairs{ - "0": "0", - "1": "1", - "1.2": "1.2", - "1.2345": "1.234", // rounding should have been done earlier - "1234.5": "1234.5", - "1234.567": "1234.567", - }, - }, { - pattern: "#0.######", - test: pairs{ - "0": "0", - "1234.5678": "1234.5678", - "0.123456789": "0.123457", - "NaN": "NaN", - "Inf": "∞", - }, - - // Test separators. - }, { - pattern: "#,#.00", - test: pairs{ - "100": "1,0,0.00", - }, - }, { - pattern: "#,0.##", - test: pairs{ - "10": "1,0", - }, - }, { - pattern: "#,0", - test: pairs{ - "10": "1,0", - }, - }, { - pattern: "#,##,#.00", - test: pairs{ - "1000": "1,00,0.00", - }, - }, { - pattern: "#,##0.###", - test: pairs{ - "0": "0", - "1234.5678": "1,234.568", - "0.123456789": "0.123", - }, - }, { - pattern: "#,##,##0.###", - test: pairs{ - "0": "0", - "123456789012": "1,23,45,67,89,012", - "0.123456789": "0.123", - }, - }, { - pattern: "0,00,000.###", - test: pairs{ - "0": "0,00,000", - "123456789012": "1,23,45,67,89,012", - "12.3456789": "0,00,012.346", - "0.123456789": "0,00,000.123", - }, - - // Support for ill-formed patterns. - }, { - pattern: "#", - test: pairs{ - ".00": "", // This is the behavior of fmt. - "0": "", // This is the behavior of fmt. - "1": "1", - "10.": "10", - }, - }, { - pattern: ".#", - test: pairs{ - "0": "", // This is the behavior of fmt. - "1": "1", - "1.2": "1.2", - "1.2345": "1.2", - }, - }, { - pattern: "#,#.##", - test: pairs{ - "10": "1,0", - }, - }, { - pattern: "#,#", - test: pairs{ - "10": "1,0", - }, - - // Special patterns - }, { - pattern: "#,max_int=2", - pat: &Pattern{ - RoundingContext: RoundingContext{ - MaxIntegerDigits: 2, - }, - }, - test: pairs{ - "2017": "17", - }, - }, { - pattern: "0,max_int=2", - pat: &Pattern{ - RoundingContext: RoundingContext{ - MaxIntegerDigits: 2, - MinIntegerDigits: 1, - }, - }, - test: pairs{ - "2000": "0", - "2001": "1", - "2017": "17", - }, - }, { - pattern: "00,max_int=2", - pat: &Pattern{ - RoundingContext: RoundingContext{ - MaxIntegerDigits: 2, - MinIntegerDigits: 2, - }, - }, - test: pairs{ - "2000": "00", - "2001": "01", - "2017": "17", - }, - }, { - pattern: "@@@@,max_int=2", - pat: &Pattern{ - RoundingContext: RoundingContext{ - MaxIntegerDigits: 2, - MinSignificantDigits: 4, - }, - }, - test: pairs{ - "2017": "17.00", - "2000": "0.000", - "2001": "1.000", - }, - - // Significant digits - }, { - pattern: "@@##", - test: pairs{ - "1": "1.0", - "0.1": "0.10", // leading zero does not count as significant digit - "123": "123", - "1234": "1234", - "12345": "12340", - }, - }, { - pattern: "@@@@", - test: pairs{ - "1": "1.000", - ".1": "0.1000", - ".001": "0.001000", - "123": "123.0", - "1234": "1234", - "12345": "12340", // rounding down - "NaN": "NaN", - "-Inf": "-∞", - }, - - // TODO: rounding - // {"@@@@": "23456": "23460"}, // rounding up - // TODO: padding - - // Scientific and Engineering notation - }, { - pattern: "#E0", - test: pairs{ - "0": "0\u202f×\u202f10⁰", - "1": "1\u202f×\u202f10⁰", - "123.456": "1\u202f×\u202f10²", - }, - }, { - pattern: "#E+0", - test: pairs{ - "0": "0\u202f×\u202f10⁺⁰", - "1000": "1\u202f×\u202f10⁺³", - "1E100": "1\u202f×\u202f10⁺¹⁰⁰", - "1E-100": "1\u202f×\u202f10⁻¹⁰⁰", - "NaN": "NaN", - "-Inf": "-∞", - }, - }, { - pattern: "##0E00", - test: pairs{ - "100": "100\u202f×\u202f10⁰⁰", - "12345": "12\u202f×\u202f10⁰³", - "123.456": "123\u202f×\u202f10⁰⁰", - }, - }, { - pattern: "##0.###E00", - test: pairs{ - "100": "100\u202f×\u202f10⁰⁰", - "12345": "12.345\u202f×\u202f10⁰³", - "123456": "123.456\u202f×\u202f10⁰³", - "123.456": "123.456\u202f×\u202f10⁰⁰", - "123.4567": "123.457\u202f×\u202f10⁰⁰", - }, - }, { - pattern: "##0.000E00", - test: pairs{ - "100": "100.000\u202f×\u202f10⁰⁰", - "12345": "12.345\u202f×\u202f10⁰³", - "123.456": "123.456\u202f×\u202f10⁰⁰", - "12.3456": "12.346\u202f×\u202f10⁰⁰", - }, - }, { - pattern: "@@E0", - test: pairs{ - "0": "0.0\u202f×\u202f10⁰", - "99": "9.9\u202f×\u202f10¹", - "0.99": "9.9\u202f×\u202f10⁻¹", - }, - }, { - pattern: "@###E00", - test: pairs{ - "0": "0\u202f×\u202f10⁰⁰", - "1": "1\u202f×\u202f10⁰⁰", - "11": "1.1\u202f×\u202f10⁰¹", - "111": "1.11\u202f×\u202f10⁰²", - "1111": "1.111\u202f×\u202f10⁰³", - "11111": "1.111\u202f×\u202f10⁰⁴", - "0.1": "1\u202f×\u202f10⁻⁰¹", - "0.11": "1.1\u202f×\u202f10⁻⁰¹", - "0.001": "1\u202f×\u202f10⁻⁰³", - }, - }, { - pattern: "*x##0", - test: pairs{ - "0": "xx0", - "10": "x10", - "100": "100", - "1000": "1000", - }, - }, { - pattern: "##0*x", - test: pairs{ - "0": "0xx", - "10": "10x", - "100": "100", - "1000": "1000", - }, - }, { - pattern: "* ###0.000", - test: pairs{ - "0": " 0.000", - "123": " 123.000", - "123.456": " 123.456", - "1234.567": "1234.567", - }, - }, { - pattern: "**0.0#######E00", - test: pairs{ - "0": "***0.0\u202f×\u202f10⁰⁰", - "10": "***1.0\u202f×\u202f10⁰¹", - "11": "***1.1\u202f×\u202f10⁰¹", - "111": "**1.11\u202f×\u202f10⁰²", - "1111": "*1.111\u202f×\u202f10⁰³", - "11111": "1.1111\u202f×\u202f10⁰⁴", - "11110": "*1.111\u202f×\u202f10⁰⁴", - "11100": "**1.11\u202f×\u202f10⁰⁴", - "11000": "***1.1\u202f×\u202f10⁰⁴", - "10000": "***1.0\u202f×\u202f10⁰⁴", - }, - }, { - pattern: "*xpre0suf", - test: pairs{ - "0": "pre0suf", - "10": "pre10suf", - }, - }, { - pattern: "*∞ pre ###0 suf", - test: pairs{ - "0": "∞∞∞ pre 0 suf", - "10": "∞∞ pre 10 suf", - "100": "∞ pre 100 suf", - "1000": " pre 1000 suf", - }, - }, { - pattern: "pre *∞###0 suf", - test: pairs{ - "0": "pre ∞∞∞0 suf", - "10": "pre ∞∞10 suf", - "100": "pre ∞100 suf", - "1000": "pre 1000 suf", - }, - }, { - pattern: "pre ###0*∞ suf", - test: pairs{ - "0": "pre 0∞∞∞ suf", - "10": "pre 10∞∞ suf", - "100": "pre 100∞ suf", - "1000": "pre 1000 suf", - }, - }, { - pattern: "pre ###0 suf *∞", - test: pairs{ - "0": "pre 0 suf ∞∞∞", - "10": "pre 10 suf ∞∞", - "100": "pre 100 suf ∞", - "1000": "pre 1000 suf ", - }, - }, { - // Take width of positive pattern. - pattern: "**###0;**-#####0x", - test: pairs{ - "0": "***0", - "-1": "*-1x", - }, - }, { - pattern: "0.00%", - test: pairs{ - "0.1": "10.00%", - }, - }, { - pattern: "0.##%", - test: pairs{ - "0.1": "10%", - "0.11": "11%", - "0.111": "11.1%", - "0.1111": "11.11%", - "0.11111": "11.11%", - }, - }, { - pattern: "‰ 0.0#", - test: pairs{ - "0.1": "‰ 100.0", - "0.11": "‰ 110.0", - "0.111": "‰ 111.0", - "0.1111": "‰ 111.1", - "0.11111": "‰ 111.11", - "0.111111": "‰ 111.11", - }, - }} - - // TODO: - // "#,##0.00¤", - // "#,##0.00 ¤;(#,##0.00 ¤)", - - for _, tc := range testCases { - pat := tc.pat - if pat == nil { - var err error - if pat, err = ParsePattern(tc.pattern); err != nil { - log.Fatal(err) - } - } - var f Formatter - f.InitPattern(language.English, pat) - for num, want := range tc.test { - buf := make([]byte, 100) - t.Run(tc.pattern+"/"+num, func(t *testing.T) { - var d Decimal - d.Convert(f.RoundingContext, dec(num)) - buf = f.Format(buf[:0], &d) - if got := string(buf); got != want { - t.Errorf("\n got %[1]q (%[1]s)\nwant %[2]q (%[2]s)", got, want) - } - }) - } - } -} - -func TestLocales(t *testing.T) { - testCases := []struct { - tag language.Tag - num string - want string - }{ - {language.Make("en"), "123456.78", "123,456.78"}, - {language.Make("de"), "123456.78", "123.456,78"}, - {language.Make("de-CH"), "123456.78", "123’456.78"}, - {language.Make("fr"), "123456.78", "123 456,78"}, - {language.Make("bn"), "123456.78", "১,২৩,৪৫৬.৭৮"}, - } - for _, tc := range testCases { - t.Run(fmt.Sprint(tc.tag, "/", tc.num), func(t *testing.T) { - var f Formatter - f.InitDecimal(tc.tag) - var d Decimal - d.Convert(f.RoundingContext, dec(tc.num)) - b := f.Format(nil, &d) - if got := string(b); got != tc.want { - t.Errorf("got %[1]q (%[1]s); want %[2]q (%[2]s)", got, tc.want) - } - }) - } -} - -func TestFormatters(t *testing.T) { - var f Formatter - testCases := []struct { - init func(t language.Tag) - num string - want string - }{ - {f.InitDecimal, "123456.78", "123,456.78"}, - {f.InitScientific, "123456.78", "1.23\u202f×\u202f10⁵"}, - {f.InitEngineering, "123456.78", "123.46\u202f×\u202f10³"}, - {f.InitEngineering, "1234", "1.23\u202f×\u202f10³"}, - - {f.InitPercent, "0.1234", "12.34%"}, - {f.InitPerMille, "0.1234", "123.40‰"}, - } - for i, tc := range testCases { - t.Run(fmt.Sprint(i, "/", tc.num), func(t *testing.T) { - tc.init(language.English) - f.SetScale(2) - var d Decimal - d.Convert(f.RoundingContext, dec(tc.num)) - b := f.Format(nil, &d) - if got := string(b); got != tc.want { - t.Errorf("got %[1]q (%[1]s); want %[2]q (%[2]s)", got, tc.want) - } - }) - } -} diff --git a/vendor/golang.org/x/text/internal/number/gen.go b/vendor/golang.org/x/text/internal/number/gen.go deleted file mode 100644 index 598c96c6f..000000000 --- a/vendor/golang.org/x/text/internal/number/gen.go +++ /dev/null @@ -1,458 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "flag" - "fmt" - "log" - "reflect" - "strings" - "unicode/utf8" - - "golang.org/x/text/internal" - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/number" - "golang.org/x/text/internal/stringset" - "golang.org/x/text/language" - "golang.org/x/text/unicode/cldr" -) - -var ( - test = flag.Bool("test", false, - "test existing tables; can be used to compare web data with package data.") - outputFile = flag.String("output", "tables.go", "output file") - outputTestFile = flag.String("testoutput", "data_test.go", "output file") - - draft = flag.String("draft", - "contributed", - `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) -) - -func main() { - gen.Init() - - const pkg = "number" - - gen.Repackage("gen_common.go", "common.go", pkg) - // Read the CLDR zip file. - r := gen.OpenCLDRCoreZip() - defer r.Close() - - d := &cldr.Decoder{} - d.SetDirFilter("supplemental", "main") - d.SetSectionFilter("numbers", "numberingSystem") - data, err := d.DecodeZip(r) - if err != nil { - log.Fatalf("DecodeZip: %v", err) - } - - w := gen.NewCodeWriter() - defer w.WriteGoFile(*outputFile, pkg) - - fmt.Fprintln(w, `import "golang.org/x/text/internal/stringset"`) - - gen.WriteCLDRVersion(w) - - genNumSystem(w, data) - genSymbols(w, data) - genFormats(w, data) -} - -var systemMap = map[string]system{"latn": 0} - -func getNumberSystem(str string) system { - ns, ok := systemMap[str] - if !ok { - log.Fatalf("No index for numbering system %q", str) - } - return ns -} - -func genNumSystem(w *gen.CodeWriter, data *cldr.CLDR) { - numSysData := []systemData{ - {digitSize: 1, zero: [4]byte{'0'}}, - } - - for _, ns := range data.Supplemental().NumberingSystems.NumberingSystem { - if len(ns.Digits) == 0 { - continue - } - switch ns.Id { - case "latn": - // hard-wired - continue - case "hanidec": - // non-consecutive digits: treat as "algorithmic" - continue - } - - zero, sz := utf8.DecodeRuneInString(ns.Digits) - if ns.Digits[sz-1]+9 > 0xBF { // 1011 1111: highest continuation byte - log.Fatalf("Last byte of zero value overflows for %s", ns.Id) - } - - i := rune(0) - for _, r := range ns.Digits { - // Verify that we can do simple math on the UTF-8 byte sequence - // of zero to get the digit. - if zero+i != r { - // Runes not consecutive. - log.Fatalf("Digit %d of %s (%U) is not offset correctly from zero value", i, ns.Id, r) - } - i++ - } - var x [utf8.UTFMax]byte - utf8.EncodeRune(x[:], zero) - id := system(len(numSysData)) - systemMap[ns.Id] = id - numSysData = append(numSysData, systemData{ - id: id, - digitSize: byte(sz), - zero: x, - }) - } - w.WriteVar("numSysData", numSysData) - - algoID := system(len(numSysData)) - fmt.Fprintln(w, "const (") - for _, ns := range data.Supplemental().NumberingSystems.NumberingSystem { - id, ok := systemMap[ns.Id] - if !ok { - id = algoID - systemMap[ns.Id] = id - algoID++ - } - fmt.Fprintf(w, "num%s = %#x\n", strings.Title(ns.Id), id) - } - fmt.Fprintln(w, "numNumberSystems") - fmt.Fprintln(w, ")") - - fmt.Fprintln(w, "var systemMap = map[string]system{") - for _, ns := range data.Supplemental().NumberingSystems.NumberingSystem { - fmt.Fprintf(w, "%q: num%s,\n", ns.Id, strings.Title(ns.Id)) - w.Size += len(ns.Id) + 16 + 1 // very coarse approximation - } - fmt.Fprintln(w, "}") -} - -func genSymbols(w *gen.CodeWriter, data *cldr.CLDR) { - d, err := cldr.ParseDraft(*draft) - if err != nil { - log.Fatalf("invalid draft level: %v", err) - } - - nNumberSystems := system(len(systemMap)) - - type symbols [NumSymbolTypes]string - - type key struct { - tag int // from language.CompactIndex - system system - } - symbolMap := map[key]*symbols{} - - defaults := map[int]system{} - - for _, lang := range data.Locales() { - ldml := data.RawLDML(lang) - if ldml.Numbers == nil { - continue - } - langIndex, ok := language.CompactIndex(language.MustParse(lang)) - if !ok { - log.Fatalf("No compact index for language %s", lang) - } - if d := ldml.Numbers.DefaultNumberingSystem; len(d) > 0 { - defaults[langIndex] = getNumberSystem(d[0].Data()) - } - - syms := cldr.MakeSlice(&ldml.Numbers.Symbols) - syms.SelectDraft(d) - - getFirst := func(name string, x interface{}) string { - v := reflect.ValueOf(x) - slice := cldr.MakeSlice(x) - slice.SelectAnyOf("alt", "", "alt") - if reflect.Indirect(v).Len() == 0 { - return "" - } else if reflect.Indirect(v).Len() > 1 { - log.Fatalf("%s: multiple values of %q within single symbol not supported.", lang, name) - } - return reflect.Indirect(v).Index(0).MethodByName("Data").Call(nil)[0].String() - } - - for _, sym := range ldml.Numbers.Symbols { - if sym.NumberSystem == "" { - // This is just linking the default of root to "latn". - continue - } - symbolMap[key{langIndex, getNumberSystem(sym.NumberSystem)}] = &symbols{ - SymDecimal: getFirst("decimal", &sym.Decimal), - SymGroup: getFirst("group", &sym.Group), - SymList: getFirst("list", &sym.List), - SymPercentSign: getFirst("percentSign", &sym.PercentSign), - SymPlusSign: getFirst("plusSign", &sym.PlusSign), - SymMinusSign: getFirst("minusSign", &sym.MinusSign), - SymExponential: getFirst("exponential", &sym.Exponential), - SymSuperscriptingExponent: getFirst("superscriptingExponent", &sym.SuperscriptingExponent), - SymPerMille: getFirst("perMille", &sym.PerMille), - SymInfinity: getFirst("infinity", &sym.Infinity), - SymNan: getFirst("nan", &sym.Nan), - SymTimeSeparator: getFirst("timeSeparator", &sym.TimeSeparator), - } - } - } - - // Expand all values. - for k, syms := range symbolMap { - for t := SymDecimal; t < NumSymbolTypes; t++ { - p := k.tag - for syms[t] == "" { - p = int(internal.Parent[p]) - if pSyms, ok := symbolMap[key{p, k.system}]; ok && (*pSyms)[t] != "" { - syms[t] = (*pSyms)[t] - break - } - if p == 0 /* und */ { - // Default to root, latn. - syms[t] = (*symbolMap[key{}])[t] - } - } - } - } - - // Unique the symbol sets and write the string data. - m := map[symbols]int{} - sb := stringset.NewBuilder() - - symIndex := [][NumSymbolTypes]byte{} - - for ns := system(0); ns < nNumberSystems; ns++ { - for _, l := range data.Locales() { - langIndex, _ := language.CompactIndex(language.MustParse(l)) - s := symbolMap[key{langIndex, ns}] - if s == nil { - continue - } - if _, ok := m[*s]; !ok { - m[*s] = len(symIndex) - sb.Add(s[:]...) - var x [NumSymbolTypes]byte - for i := SymDecimal; i < NumSymbolTypes; i++ { - x[i] = byte(sb.Index((*s)[i])) - } - symIndex = append(symIndex, x) - } - } - } - w.WriteVar("symIndex", symIndex) - w.WriteVar("symData", sb.Set()) - - // resolveSymbolIndex gets the index from the closest matching locale, - // including the locale itself. - resolveSymbolIndex := func(langIndex int, ns system) byte { - for { - if sym := symbolMap[key{langIndex, ns}]; sym != nil { - return byte(m[*sym]) - } - if langIndex == 0 { - return 0 // und, latn - } - langIndex = int(internal.Parent[langIndex]) - } - } - - // Create an index with the symbols for each locale for the latn numbering - // system. If this is not the default, or the only one, for a locale, we - // will overwrite the value later. - var langToDefaults [language.NumCompactTags]byte - for _, l := range data.Locales() { - langIndex, _ := language.CompactIndex(language.MustParse(l)) - langToDefaults[langIndex] = resolveSymbolIndex(langIndex, 0) - } - - // Delete redundant entries. - for _, l := range data.Locales() { - langIndex, _ := language.CompactIndex(language.MustParse(l)) - def := defaults[langIndex] - syms := symbolMap[key{langIndex, def}] - if syms == nil { - continue - } - for ns := system(0); ns < nNumberSystems; ns++ { - if ns == def { - continue - } - if altSyms, ok := symbolMap[key{langIndex, ns}]; ok && *altSyms == *syms { - delete(symbolMap, key{langIndex, ns}) - } - } - } - - // Create a sorted list of alternatives per language. This will only need to - // be referenced if a user specified an alternative numbering system. - var langToAlt []altSymData - for _, l := range data.Locales() { - langIndex, _ := language.CompactIndex(language.MustParse(l)) - start := len(langToAlt) - if start > 0x7F { - log.Fatal("Number of alternative assignments > 0x7F") - } - // Create the entry for the default value. - def := defaults[langIndex] - langToAlt = append(langToAlt, altSymData{ - compactTag: uint16(langIndex), - system: def, - symIndex: resolveSymbolIndex(langIndex, def), - }) - - for ns := system(0); ns < nNumberSystems; ns++ { - if def == ns { - continue - } - if sym := symbolMap[key{langIndex, ns}]; sym != nil { - langToAlt = append(langToAlt, altSymData{ - compactTag: uint16(langIndex), - system: ns, - symIndex: resolveSymbolIndex(langIndex, ns), - }) - } - } - if def == 0 && len(langToAlt) == start+1 { - // No additional data: erase the entry. - langToAlt = langToAlt[:start] - } else { - // Overwrite the entry in langToDefaults. - langToDefaults[langIndex] = 0x80 | byte(start) - } - } - w.WriteComment(` -langToDefaults maps a compact language index to the default numbering system -and default symbol set`) - w.WriteVar("langToDefaults", langToDefaults) - - w.WriteComment(` -langToAlt is a list of numbering system and symbol set pairs, sorted and -marked by compact language index.`) - w.WriteVar("langToAlt", langToAlt) -} - -// genFormats generates the lookup table for decimal, scientific and percent -// patterns. -// -// CLDR allows for patterns to be different per language for different numbering -// systems. In practice the patterns are set to be consistent for a language -// independent of the numbering system. genFormats verifies that no language -// deviates from this. -func genFormats(w *gen.CodeWriter, data *cldr.CLDR) { - d, err := cldr.ParseDraft(*draft) - if err != nil { - log.Fatalf("invalid draft level: %v", err) - } - - // Fill the first slot with a dummy so we can identify unspecified tags. - formats := []number.Pattern{{}} - patterns := map[string]int{} - - // TODO: It would be possible to eliminate two of these slices by having - // another indirection and store a reference to the combination of patterns. - decimal := make([]byte, language.NumCompactTags) - scientific := make([]byte, language.NumCompactTags) - percent := make([]byte, language.NumCompactTags) - - for _, lang := range data.Locales() { - ldml := data.RawLDML(lang) - if ldml.Numbers == nil { - continue - } - langIndex, ok := language.CompactIndex(language.MustParse(lang)) - if !ok { - log.Fatalf("No compact index for language %s", lang) - } - type patternSlice []*struct { - cldr.Common - Numbers string `xml:"numbers,attr"` - Count string `xml:"count,attr"` - } - - add := func(name string, tags []byte, ps patternSlice) { - sl := cldr.MakeSlice(&ps) - sl.SelectDraft(d) - if len(ps) == 0 { - return - } - if len(ps) > 2 || len(ps) == 2 && ps[0] != ps[1] { - log.Fatalf("Inconsistent %d patterns for language %s", name, lang) - } - s := ps[0].Data() - - index, ok := patterns[s] - if !ok { - nf, err := number.ParsePattern(s) - if err != nil { - log.Fatal(err) - } - index = len(formats) - patterns[s] = index - formats = append(formats, *nf) - } - tags[langIndex] = byte(index) - } - - for _, df := range ldml.Numbers.DecimalFormats { - for _, l := range df.DecimalFormatLength { - if l.Type != "" { - continue - } - for _, f := range l.DecimalFormat { - add("decimal", decimal, f.Pattern) - } - } - } - for _, df := range ldml.Numbers.ScientificFormats { - for _, l := range df.ScientificFormatLength { - if l.Type != "" { - continue - } - for _, f := range l.ScientificFormat { - add("scientific", scientific, f.Pattern) - } - } - } - for _, df := range ldml.Numbers.PercentFormats { - for _, l := range df.PercentFormatLength { - if l.Type != "" { - continue - } - for _, f := range l.PercentFormat { - add("percent", percent, f.Pattern) - } - } - } - } - - // Complete the parent tag array to reflect inheritance. An index of 0 - // indicates an unspecified value. - for _, data := range [][]byte{decimal, scientific, percent} { - for i := range data { - p := uint16(i) - for ; data[p] == 0; p = internal.Parent[p] { - } - data[i] = data[p] - } - } - w.WriteVar("tagToDecimal", decimal) - w.WriteVar("tagToScientific", scientific) - w.WriteVar("tagToPercent", percent) - - value := strings.Replace(fmt.Sprintf("%#v", formats), "number.", "", -1) - // Break up the lines. This won't give ideal perfect formatting, but it is - // better than one huge line. - value = strings.Replace(value, ", ", ",\n", -1) - fmt.Fprintf(w, "var formats = %s\n", value) -} diff --git a/vendor/golang.org/x/text/internal/number/gen_common.go b/vendor/golang.org/x/text/internal/number/gen_common.go deleted file mode 100644 index c4b791ce9..000000000 --- a/vendor/golang.org/x/text/internal/number/gen_common.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import "unicode/utf8" - -// A system identifies a CLDR numbering system. -type system byte - -type systemData struct { - id system - digitSize byte // number of UTF-8 bytes per digit - zero [utf8.UTFMax]byte // UTF-8 sequence of zero digit. -} - -// A SymbolType identifies a symbol of a specific kind. -type SymbolType int - -const ( - SymDecimal SymbolType = iota - SymGroup - SymList - SymPercentSign - SymPlusSign - SymMinusSign - SymExponential - SymSuperscriptingExponent - SymPerMille - SymInfinity - SymNan - SymTimeSeparator - - NumSymbolTypes -) - -type altSymData struct { - compactTag uint16 - system system - symIndex byte -} diff --git a/vendor/golang.org/x/text/internal/number/number.go b/vendor/golang.org/x/text/internal/number/number.go deleted file mode 100644 index ea341c796..000000000 --- a/vendor/golang.org/x/text/internal/number/number.go +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go gen_common.go - -// Package number contains tools and data for formatting numbers. -package number - -import ( - "unicode/utf8" - - "golang.org/x/text/internal" - "golang.org/x/text/language" -) - -// Info holds number formatting configuration data. -type Info struct { - system systemData // numbering system information - symIndex byte // index to symbols -} - -// InfoFromLangID returns a Info for the given compact language identifier and -// numbering system identifier. If system is the empty string, the default -// numbering system will be taken for that language. -func InfoFromLangID(compactIndex int, numberSystem string) Info { - p := langToDefaults[compactIndex] - // Lookup the entry for the language. - pSymIndex := byte(0) // Default: Latin, default symbols - system, ok := systemMap[numberSystem] - if !ok { - // Take the value for the default numbering system. This is by far the - // most common case as an alternative numbering system is hardly used. - if p&0x80 == 0 { - pSymIndex = p - } else { - // Take the first entry from the alternatives list. - data := langToAlt[p&^0x80] - pSymIndex = data.symIndex - system = data.system - } - } else { - langIndex := compactIndex - ns := system - outerLoop: - for { - if p&0x80 == 0 { - if ns == 0 { - // The index directly points to the symbol data. - pSymIndex = p - break - } - // Move to the parent and retry. - langIndex = int(internal.Parent[langIndex]) - } - // The index points to a list of symbol data indexes. - for _, e := range langToAlt[p&^0x80:] { - if int(e.compactTag) != langIndex { - if langIndex == 0 { - // The CLDR root defines full symbol information for all - // numbering systems (even though mostly by means of - // aliases). This means that we will never fall back to - // the default of the language. Also, the loop is - // guaranteed to terminate as a consequence. - ns = numLatn - // Fall back to Latin and start from the original - // language. See - // http://unicode.org/reports/tr35/#Locale_Inheritance. - langIndex = compactIndex - } else { - // Fall back to parent. - langIndex = int(internal.Parent[langIndex]) - } - break - } - if e.system == ns { - pSymIndex = e.symIndex - break outerLoop - } - } - } - } - if int(system) >= len(numSysData) { // algorithmic - // Will generate ASCII digits in case the user inadvertently calls - // WriteDigit or Digit on it. - d := numSysData[0] - d.id = system - return Info{ - system: d, - symIndex: pSymIndex, - } - } - return Info{ - system: numSysData[system], - symIndex: pSymIndex, - } -} - -// InfoFromTag returns a Info for the given language tag. -func InfoFromTag(t language.Tag) Info { - for { - if index, ok := language.CompactIndex(t); ok { - return InfoFromLangID(index, t.TypeForKey("nu")) - } - t = t.Parent() - } -} - -// IsDecimal reports if the numbering system can convert decimal to native -// symbols one-to-one. -func (n Info) IsDecimal() bool { - return int(n.system.id) < len(numSysData) -} - -// WriteDigit writes the UTF-8 sequence for n corresponding to the given ASCII -// digit to dst and reports the number of bytes written. dst must be large -// enough to hold the rune (can be up to utf8.UTFMax bytes). -func (n Info) WriteDigit(dst []byte, asciiDigit rune) int { - copy(dst, n.system.zero[:n.system.digitSize]) - dst[n.system.digitSize-1] += byte(asciiDigit - '0') - return int(n.system.digitSize) -} - -// AppendDigit appends the UTF-8 sequence for n corresponding to the given digit -// to dst and reports the number of bytes written. dst must be large enough to -// hold the rune (can be up to utf8.UTFMax bytes). -func (n Info) AppendDigit(dst []byte, digit byte) []byte { - dst = append(dst, n.system.zero[:n.system.digitSize]...) - dst[len(dst)-1] += digit - return dst -} - -// Digit returns the digit for the numbering system for the corresponding ASCII -// value. For example, ni.Digit('3') could return '三'. Note that the argument -// is the rune constant '3', which equals 51, not the integer constant 3. -func (n Info) Digit(asciiDigit rune) rune { - var x [utf8.UTFMax]byte - n.WriteDigit(x[:], asciiDigit) - r, _ := utf8.DecodeRune(x[:]) - return r -} - -// Symbol returns the string for the given symbol type. -func (n Info) Symbol(t SymbolType) string { - return symData.Elem(int(symIndex[n.symIndex][t])) -} - -func formatForLang(t language.Tag, index []byte) *Pattern { - for ; ; t = t.Parent() { - if x, ok := language.CompactIndex(t); ok { - return &formats[index[x]] - } - } -} diff --git a/vendor/golang.org/x/text/internal/number/number_test.go b/vendor/golang.org/x/text/internal/number/number_test.go deleted file mode 100644 index 8717ead72..000000000 --- a/vendor/golang.org/x/text/internal/number/number_test.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package number - -import ( - "fmt" - "testing" - - "golang.org/x/text/internal/testtext" - "golang.org/x/text/language" -) - -func TestInfo(t *testing.T) { - testCases := []struct { - lang string - sym SymbolType - wantSym string - wantNine rune - }{ - {"und", SymDecimal, ".", '9'}, - {"de", SymGroup, ".", '9'}, - {"de-BE", SymGroup, ".", '9'}, // inherits from de (no number data in CLDR) - {"de-BE-oxendict", SymGroup, ".", '9'}, // inherits from de (no compact index) - - // U+096F DEVANAGARI DIGIT NINE ('९') - {"de-BE-u-nu-deva", SymGroup, ".", '\u096f'}, // miss -> latn -> de - {"de-Cyrl-BE", SymGroup, ",", '9'}, // inherits from root - {"de-CH", SymGroup, "’", '9'}, // overrides values in de - {"de-CH-oxendict", SymGroup, "’", '9'}, // inherits from de-CH (no compact index) - {"de-CH-u-nu-deva", SymGroup, "’", '\u096f'}, // miss -> latn -> de-CH - - {"pa", SymExponential, "E", '9'}, - - // "×۱۰^" -> U+00d7 U+06f1 U+06f0^" - // U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO - // U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE - // U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE - {"pa-u-nu-arabext", SymExponential, "\u00d7\u06f1\u06f0^", '\u06f9'}, - - // "གྲངས་མེད" - > U+0f42 U+0fb2 U+0f44 U+0f66 U+0f0b U+0f58 U+0f7a U+0f51 - // Examples: - // U+0F29 TIBETAN DIGIT NINE (༩) - {"dz", SymInfinity, "\u0f42\u0fb2\u0f44\u0f66\u0f0b\u0f58\u0f7a\u0f51", '\u0f29'}, // defaults to tibt - {"dz-u-nu-latn", SymInfinity, "∞", '9'}, // select alternative - {"dz-u-nu-tibt", SymInfinity, "\u0f42\u0fb2\u0f44\u0f66\u0f0b\u0f58\u0f7a\u0f51", '\u0f29'}, - {"en-u-nu-tibt", SymInfinity, "∞", '\u0f29'}, - - // algorithmic number systems fall back to ASCII if Digits is used. - {"en-u-nu-hanidec", SymPlusSign, "+", '9'}, - {"en-u-nu-roman", SymPlusSign, "+", '9'}, - } - for _, tc := range testCases { - t.Run(fmt.Sprintf("%s:%v", tc.lang, tc.sym), func(t *testing.T) { - info := InfoFromTag(language.MustParse(tc.lang)) - if got := info.Symbol(tc.sym); got != tc.wantSym { - t.Errorf("sym: got %q; want %q", got, tc.wantSym) - } - if got := info.Digit('9'); got != tc.wantNine { - t.Errorf("Digit(9): got %+q; want %+q", got, tc.wantNine) - } - var buf [4]byte - if got := string(buf[:info.WriteDigit(buf[:], '9')]); got != string(tc.wantNine) { - t.Errorf("WriteDigit(9): got %+q; want %+q", got, tc.wantNine) - } - if got := string(info.AppendDigit([]byte{}, 9)); got != string(tc.wantNine) { - t.Errorf("AppendDigit(9): got %+q; want %+q", got, tc.wantNine) - } - }) - } -} - -func TestFormats(t *testing.T) { - testCases := []struct { - lang string - pattern string - index []byte - }{ - {"en", "#,##0.###", tagToDecimal}, - {"de", "#,##0.###", tagToDecimal}, - {"de-CH", "#,##0.###", tagToDecimal}, - {"pa", "#,##,##0.###", tagToDecimal}, - {"pa-Arab", "#,##0.###", tagToDecimal}, // Does NOT inherit from pa! - {"mr", "#,##,##0.###", tagToDecimal}, - {"mr-IN", "#,##,##0.###", tagToDecimal}, // Inherits from mr. - {"nl", "#E0", tagToScientific}, - {"nl-MX", "#E0", tagToScientific}, // Inherits through Tag.Parent. - {"zgh", "#,##0 %", tagToPercent}, - } - for _, tc := range testCases { - testtext.Run(t, tc.lang, func(t *testing.T) { - got := formatForLang(language.MustParse(tc.lang), tc.index) - want, _ := ParsePattern(tc.pattern) - if *got != *want { - t.Errorf("\ngot %#v;\nwant %#v", got, want) - } - }) - } -} diff --git a/vendor/golang.org/x/text/internal/number/pattern.go b/vendor/golang.org/x/text/internal/number/pattern.go deleted file mode 100644 index b95ca40e8..000000000 --- a/vendor/golang.org/x/text/internal/number/pattern.go +++ /dev/null @@ -1,485 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package number - -import ( - "errors" - "unicode/utf8" -) - -// This file contains a parser for the CLDR number patterns as described in -// http://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns. -// -// The following BNF is derived from this standard. -// -// pattern := subpattern (';' subpattern)? -// subpattern := affix? number exponent? affix? -// number := decimal | sigDigits -// decimal := '#'* '0'* ('.' fraction)? | '#' | '0' -// fraction := '0'* '#'* -// sigDigits := '#'* '@' '@'* '#'* -// exponent := 'E' '+'? '0'* '0' -// padSpec := '*' \L -// -// Notes: -// - An affix pattern may contain any runes, but runes with special meaning -// should be escaped. -// - Sequences of digits, '#', and '@' in decimal and sigDigits may have -// interstitial commas. - -// TODO: replace special characters in affixes (-, +, ¤) with control codes. - -// Pattern holds information for formatting numbers. It is designed to hold -// information from CLDR number patterns. -// -// This pattern is precompiled for all patterns for all languages. Even though -// the number of patterns is not very large, we want to keep this small. -// -// This type is only intended for internal use. -type Pattern struct { - RoundingContext - - Affix string // includes prefix and suffix. First byte is prefix length. - Offset uint16 // Offset into Affix for prefix and suffix - NegOffset uint16 // Offset into Affix for negative prefix and suffix or 0. - PadRune rune - FormatWidth uint16 - - GroupingSize [2]uint8 - Flags PatternFlag -} - -// A RoundingContext indicates how a number should be converted to digits. -// It contains all information needed to determine the "visible digits" as -// required by the pluralization rules. -type RoundingContext struct { - // TODO: unify these two fields so that there is a more unambiguous meaning - // of how precision is handled. - MaxSignificantDigits int16 // -1 is unlimited - MaxFractionDigits int16 // -1 is unlimited - - Increment uint32 - IncrementScale uint8 // May differ from printed scale. - - Mode RoundingMode - - DigitShift uint8 // Number of decimals to shift. Used for % and ‰. - - // Number of digits. - MinIntegerDigits uint8 - - MaxIntegerDigits uint8 - MinFractionDigits uint8 - MinSignificantDigits uint8 - - MinExponentDigits uint8 -} - -// RoundSignificantDigits returns the number of significant digits an -// implementation of Convert may round to or n < 0 if there is no maximum or -// a maximum is not recommended. -func (r *RoundingContext) RoundSignificantDigits() (n int) { - if r.MaxFractionDigits == 0 && r.MaxSignificantDigits > 0 { - return int(r.MaxSignificantDigits) - } else if r.isScientific() && r.MaxIntegerDigits == 1 { - if r.MaxSignificantDigits == 0 || - int(r.MaxFractionDigits+1) == int(r.MaxSignificantDigits) { - // Note: don't add DigitShift: it is only used for decimals. - return int(r.MaxFractionDigits) + 1 - } - } - return -1 -} - -// RoundFractionDigits returns the number of fraction digits an implementation -// of Convert may round to or n < 0 if there is no maximum or a maximum is not -// recommended. -func (r *RoundingContext) RoundFractionDigits() (n int) { - if r.MinExponentDigits == 0 && - r.MaxSignificantDigits == 0 && - r.MaxFractionDigits >= 0 { - return int(r.MaxFractionDigits) + int(r.DigitShift) - } - return -1 -} - -// SetScale fixes the RoundingContext to a fixed number of fraction digits. -func (r *RoundingContext) SetScale(scale int) { - r.MinFractionDigits = uint8(scale) - r.MaxFractionDigits = int16(scale) -} - -func (r *RoundingContext) SetPrecision(prec int) { - r.MaxSignificantDigits = int16(prec) -} - -func (r *RoundingContext) isScientific() bool { - return r.MinExponentDigits > 0 -} - -func (f *Pattern) needsSep(pos int) bool { - p := pos - 1 - size := int(f.GroupingSize[0]) - if size == 0 || p == 0 { - return false - } - if p == size { - return true - } - if p -= size; p < 0 { - return false - } - // TODO: make second groupingsize the same as first if 0 so that we can - // avoid this check. - if x := int(f.GroupingSize[1]); x != 0 { - size = x - } - return p%size == 0 -} - -// A PatternFlag is a bit mask for the flag field of a Pattern. -type PatternFlag uint8 - -const ( - AlwaysSign PatternFlag = 1 << iota - ElideSign // Use space instead of plus sign. AlwaysSign must be true. - AlwaysExpSign - AlwaysDecimalSeparator - ParenthesisForNegative // Common pattern. Saves space. - - PadAfterNumber - PadAfterAffix - - PadBeforePrefix = 0 // Default - PadAfterPrefix = PadAfterAffix - PadBeforeSuffix = PadAfterNumber - PadAfterSuffix = PadAfterNumber | PadAfterAffix - PadMask = PadAfterNumber | PadAfterAffix -) - -type parser struct { - *Pattern - - leadingSharps int - - pos int - err error - doNotTerminate bool - groupingCount uint - hasGroup bool - buf []byte -} - -func (p *parser) setError(err error) { - if p.err == nil { - p.err = err - } -} - -func (p *parser) updateGrouping() { - if p.hasGroup && - 0 < p.groupingCount && p.groupingCount < 255 { - p.GroupingSize[1] = p.GroupingSize[0] - p.GroupingSize[0] = uint8(p.groupingCount) - } - p.groupingCount = 0 - p.hasGroup = true -} - -var ( - // TODO: more sensible and localizeable error messages. - errMultiplePadSpecifiers = errors.New("format: pattern has multiple pad specifiers") - errInvalidPadSpecifier = errors.New("format: invalid pad specifier") - errInvalidQuote = errors.New("format: invalid quote") - errAffixTooLarge = errors.New("format: prefix or suffix exceeds maximum UTF-8 length of 256 bytes") - errDuplicatePercentSign = errors.New("format: duplicate percent sign") - errDuplicatePermilleSign = errors.New("format: duplicate permille sign") - errUnexpectedEnd = errors.New("format: unexpected end of pattern") -) - -// ParsePattern extracts formatting information from a CLDR number pattern. -// -// See http://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns. -func ParsePattern(s string) (f *Pattern, err error) { - p := parser{Pattern: &Pattern{}} - - s = p.parseSubPattern(s) - - if s != "" { - // Parse negative sub pattern. - if s[0] != ';' { - p.setError(errors.New("format: error parsing first sub pattern")) - return nil, p.err - } - neg := parser{Pattern: &Pattern{}} // just for extracting the affixes. - s = neg.parseSubPattern(s[len(";"):]) - p.NegOffset = uint16(len(p.buf)) - p.buf = append(p.buf, neg.buf...) - } - if s != "" { - p.setError(errors.New("format: spurious characters at end of pattern")) - } - if p.err != nil { - return nil, p.err - } - if affix := string(p.buf); affix == "\x00\x00" || affix == "\x00\x00\x00\x00" { - // No prefix or suffixes. - p.NegOffset = 0 - } else { - p.Affix = affix - } - if p.Increment == 0 { - p.IncrementScale = 0 - } - return p.Pattern, nil -} - -func (p *parser) parseSubPattern(s string) string { - s = p.parsePad(s, PadBeforePrefix) - s = p.parseAffix(s) - s = p.parsePad(s, PadAfterPrefix) - - s = p.parse(p.number, s) - p.updateGrouping() - - s = p.parsePad(s, PadBeforeSuffix) - s = p.parseAffix(s) - s = p.parsePad(s, PadAfterSuffix) - return s -} - -func (p *parser) parsePad(s string, f PatternFlag) (tail string) { - if len(s) >= 2 && s[0] == '*' { - r, sz := utf8.DecodeRuneInString(s[1:]) - if p.PadRune != 0 { - p.err = errMultiplePadSpecifiers - } else { - p.Flags |= f - p.PadRune = r - } - return s[1+sz:] - } - return s -} - -func (p *parser) parseAffix(s string) string { - x := len(p.buf) - p.buf = append(p.buf, 0) // placeholder for affix length - - s = p.parse(p.affix, s) - - n := len(p.buf) - x - 1 - if n > 0xFF { - p.setError(errAffixTooLarge) - } - p.buf[x] = uint8(n) - return s -} - -// state implements a state transition. It returns the new state. A state -// function may set an error on the parser or may simply return on an incorrect -// token and let the next phase fail. -type state func(r rune) state - -// parse repeatedly applies a state function on the given string until a -// termination condition is reached. -func (p *parser) parse(fn state, s string) (tail string) { - for i, r := range s { - p.doNotTerminate = false - if fn = fn(r); fn == nil || p.err != nil { - return s[i:] - } - p.FormatWidth++ - } - if p.doNotTerminate { - p.setError(errUnexpectedEnd) - } - return "" -} - -func (p *parser) affix(r rune) state { - switch r { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - '#', '@', '.', '*', ',', ';': - return nil - case '\'': - p.FormatWidth-- - return p.escapeFirst - case '%': - if p.DigitShift != 0 { - p.setError(errDuplicatePercentSign) - } - p.DigitShift = 2 - case '\u2030': // ‰ Per mille - if p.DigitShift != 0 { - p.setError(errDuplicatePermilleSign) - } - p.DigitShift = 3 - // TODO: handle currency somehow: ¤, ¤¤, ¤¤¤, ¤¤¤¤ - } - p.buf = append(p.buf, string(r)...) - return p.affix -} - -func (p *parser) escapeFirst(r rune) state { - switch r { - case '\'': - p.buf = append(p.buf, "\\'"...) - return p.affix - default: - p.buf = append(p.buf, '\'') - p.buf = append(p.buf, string(r)...) - } - return p.escape -} - -func (p *parser) escape(r rune) state { - switch r { - case '\'': - p.FormatWidth-- - p.buf = append(p.buf, '\'') - return p.affix - default: - p.buf = append(p.buf, string(r)...) - } - return p.escape -} - -// number parses a number. The BNF says the integer part should always have -// a '0', but that does not appear to be the case according to the rest of the -// documentation. We will allow having only '#' numbers. -func (p *parser) number(r rune) state { - switch r { - case '#': - p.groupingCount++ - p.leadingSharps++ - case '@': - p.groupingCount++ - p.leadingSharps = 0 - p.MaxFractionDigits = -1 - return p.sigDigits(r) - case ',': - if p.leadingSharps == 0 { // no leading commas - return nil - } - p.updateGrouping() - case 'E': - p.MaxIntegerDigits = uint8(p.leadingSharps) - return p.exponent - case '.': // allow ".##" etc. - p.updateGrouping() - return p.fraction - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - return p.integer(r) - default: - return nil - } - return p.number -} - -func (p *parser) integer(r rune) state { - if !('0' <= r && r <= '9') { - var next state - switch r { - case 'E': - if p.leadingSharps > 0 { - p.MaxIntegerDigits = uint8(p.leadingSharps) + p.MinIntegerDigits - } - next = p.exponent - case '.': - next = p.fraction - case ',': - next = p.integer - } - p.updateGrouping() - return next - } - p.Increment = p.Increment*10 + uint32(r-'0') - p.groupingCount++ - p.MinIntegerDigits++ - return p.integer -} - -func (p *parser) sigDigits(r rune) state { - switch r { - case '@': - p.groupingCount++ - p.MaxSignificantDigits++ - p.MinSignificantDigits++ - case '#': - return p.sigDigitsFinal(r) - case 'E': - p.updateGrouping() - return p.normalizeSigDigitsWithExponent() - default: - p.updateGrouping() - return nil - } - return p.sigDigits -} - -func (p *parser) sigDigitsFinal(r rune) state { - switch r { - case '#': - p.groupingCount++ - p.MaxSignificantDigits++ - case 'E': - p.updateGrouping() - return p.normalizeSigDigitsWithExponent() - default: - p.updateGrouping() - return nil - } - return p.sigDigitsFinal -} - -func (p *parser) normalizeSigDigitsWithExponent() state { - p.MinIntegerDigits, p.MaxIntegerDigits = 1, 1 - p.MinFractionDigits = p.MinSignificantDigits - 1 - p.MaxFractionDigits = p.MaxSignificantDigits - 1 - p.MinSignificantDigits, p.MaxSignificantDigits = 0, 0 - return p.exponent -} - -func (p *parser) fraction(r rune) state { - switch r { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - p.Increment = p.Increment*10 + uint32(r-'0') - p.IncrementScale++ - p.MinFractionDigits++ - p.MaxFractionDigits++ - case '#': - p.MaxFractionDigits++ - case 'E': - if p.leadingSharps > 0 { - p.MaxIntegerDigits = uint8(p.leadingSharps) + p.MinIntegerDigits - } - return p.exponent - default: - return nil - } - return p.fraction -} - -func (p *parser) exponent(r rune) state { - switch r { - case '+': - // Set mode and check it wasn't already set. - if p.Flags&AlwaysExpSign != 0 || p.MinExponentDigits > 0 { - break - } - p.Flags |= AlwaysExpSign - p.doNotTerminate = true - return p.exponent - case '0': - p.MinExponentDigits++ - return p.exponent - } - // termination condition - if p.MinExponentDigits == 0 { - p.setError(errors.New("format: need at least one digit")) - } - return nil -} diff --git a/vendor/golang.org/x/text/internal/number/pattern_test.go b/vendor/golang.org/x/text/internal/number/pattern_test.go deleted file mode 100644 index a7517d004..000000000 --- a/vendor/golang.org/x/text/internal/number/pattern_test.go +++ /dev/null @@ -1,438 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package number - -import ( - "reflect" - "testing" - "unsafe" -) - -var testCases = []struct { - pat string - want *Pattern -}{{ - "#", - &Pattern{ - FormatWidth: 1, - // TODO: Should MinIntegerDigits be 1? - }, -}, { - "0", - &Pattern{ - FormatWidth: 1, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - }, - }, -}, { - "+0", - &Pattern{ - Affix: "\x01+\x00", - FormatWidth: 2, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - }, - }, -}, { - "0+", - &Pattern{ - Affix: "\x00\x01+", - FormatWidth: 2, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - }, - }, -}, { - "0000", - &Pattern{ - FormatWidth: 4, - RoundingContext: RoundingContext{ - MinIntegerDigits: 4, - }, - }, -}, { - ".#", - &Pattern{ - FormatWidth: 2, - RoundingContext: RoundingContext{ - MaxFractionDigits: 1, - }, - }, -}, { - "#0.###", - &Pattern{ - FormatWidth: 6, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MaxFractionDigits: 3, - }, - }, -}, { - "#0.######", - &Pattern{ - FormatWidth: 9, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MaxFractionDigits: 6, - }, - }, -}, { - "#,0", - &Pattern{ - FormatWidth: 3, - GroupingSize: [2]uint8{1, 0}, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - }, - }, -}, { - "#,0.00", - &Pattern{ - FormatWidth: 6, - GroupingSize: [2]uint8{1, 0}, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MinFractionDigits: 2, - MaxFractionDigits: 2, - }, - }, -}, { - "#,##0.###", - &Pattern{ - FormatWidth: 9, - GroupingSize: [2]uint8{3, 0}, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MaxFractionDigits: 3, - }, - }, -}, { - "#,##,##0.###", - &Pattern{ - FormatWidth: 12, - GroupingSize: [2]uint8{3, 2}, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MaxFractionDigits: 3, - }, - }, -}, { - // Ignore additional separators. - "#,####,##,##0.###", - &Pattern{ - FormatWidth: 17, - GroupingSize: [2]uint8{3, 2}, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MaxFractionDigits: 3, - }, - }, -}, { - "#E0", - &Pattern{ - FormatWidth: 3, - RoundingContext: RoundingContext{ - MaxIntegerDigits: 1, - MinExponentDigits: 1, - }, - }, -}, { - // At least one exponent digit is required. As long as this is true, one can - // determine that scientific rendering is needed if MinExponentDigits > 0. - "#E#", - nil, -}, { - "0E0", - &Pattern{ - FormatWidth: 3, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MinExponentDigits: 1, - }, - }, -}, { - "##0.###E00", - &Pattern{ - FormatWidth: 10, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MaxIntegerDigits: 3, - MaxFractionDigits: 3, - MinExponentDigits: 2, - }, - }, -}, { - "##00.0#E0", - &Pattern{ - FormatWidth: 9, - RoundingContext: RoundingContext{ - MinIntegerDigits: 2, - MaxIntegerDigits: 4, - MinFractionDigits: 1, - MaxFractionDigits: 2, - MinExponentDigits: 1, - }, - }, -}, { - "#00.0E+0", - &Pattern{ - FormatWidth: 8, - Flags: AlwaysExpSign, - RoundingContext: RoundingContext{ - MinIntegerDigits: 2, - MaxIntegerDigits: 3, - MinFractionDigits: 1, - MaxFractionDigits: 1, - MinExponentDigits: 1, - }, - }, -}, { - "0.0E++0", - nil, -}, { - "#0E+", - nil, -}, { - // significant digits - "@", - &Pattern{ - FormatWidth: 1, - RoundingContext: RoundingContext{ - MinSignificantDigits: 1, - MaxSignificantDigits: 1, - MaxFractionDigits: -1, - }, - }, -}, { - // significant digits - "@@@@", - &Pattern{ - FormatWidth: 4, - RoundingContext: RoundingContext{ - MinSignificantDigits: 4, - MaxSignificantDigits: 4, - MaxFractionDigits: -1, - }, - }, -}, { - "@###", - &Pattern{ - FormatWidth: 4, - RoundingContext: RoundingContext{ - MinSignificantDigits: 1, - MaxSignificantDigits: 4, - MaxFractionDigits: -1, - }, - }, -}, { - // Exponents in significant digits mode gets normalized. - "@@E0", - &Pattern{ - FormatWidth: 4, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MaxIntegerDigits: 1, - MinFractionDigits: 1, - MaxFractionDigits: 1, - MinExponentDigits: 1, - }, - }, -}, { - "@###E00", - &Pattern{ - FormatWidth: 7, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MaxIntegerDigits: 1, - MinFractionDigits: 0, - MaxFractionDigits: 3, - MinExponentDigits: 2, - }, - }, -}, { - // The significant digits mode does not allow fractions. - "@###.#E0", - nil, -}, { - //alternative negative pattern - "#0.###;(#0.###)", - &Pattern{ - Affix: "\x00\x00\x01(\x01)", - NegOffset: 2, - FormatWidth: 6, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MaxFractionDigits: 3, - }, - }, -}, { - // Rounding increment - "1.05", - &Pattern{ - FormatWidth: 4, - RoundingContext: RoundingContext{ - Increment: 105, - IncrementScale: 2, - MinIntegerDigits: 1, - MinFractionDigits: 2, - MaxFractionDigits: 2, - }, - }, -}, { - // Rounding increment with grouping - "1,05", - &Pattern{ - FormatWidth: 4, - GroupingSize: [2]uint8{2, 0}, - RoundingContext: RoundingContext{ - Increment: 105, - IncrementScale: 0, - MinIntegerDigits: 3, - MinFractionDigits: 0, - MaxFractionDigits: 0, - }, - }, -}, { - "0.0%", - &Pattern{ - Affix: "\x00\x01%", - FormatWidth: 4, - RoundingContext: RoundingContext{ - DigitShift: 2, - MinIntegerDigits: 1, - MinFractionDigits: 1, - MaxFractionDigits: 1, - }, - }, -}, { - "0.0‰", - &Pattern{ - Affix: "\x00\x03‰", - FormatWidth: 4, - RoundingContext: RoundingContext{ - DigitShift: 3, - MinIntegerDigits: 1, - MinFractionDigits: 1, - MaxFractionDigits: 1, - }, - }, -}, { - "#,##0.00¤", - &Pattern{ - Affix: "\x00\x02¤", - FormatWidth: 9, - GroupingSize: [2]uint8{3, 0}, - RoundingContext: RoundingContext{ - MinIntegerDigits: 1, - MinFractionDigits: 2, - MaxFractionDigits: 2, - }, - }, -}, { - "#,##0.00 ¤;(#,##0.00 ¤)", - &Pattern{Affix: "\x00\x04\u00a0¤\x01(\x05\u00a0¤)", - NegOffset: 6, - FormatWidth: 10, - GroupingSize: [2]uint8{3, 0}, - RoundingContext: RoundingContext{ - DigitShift: 0, - MinIntegerDigits: 1, - MinFractionDigits: 2, - MaxFractionDigits: 2, - }, - }, -}, { - // padding - "*x#", - &Pattern{ - PadRune: 'x', - FormatWidth: 1, - }, -}, { - // padding - "#*x", - &Pattern{ - PadRune: 'x', - FormatWidth: 1, - Flags: PadBeforeSuffix, - }, -}, { - "*xpre#suf", - &Pattern{ - Affix: "\x03pre\x03suf", - PadRune: 'x', - FormatWidth: 7, - }, -}, { - "pre*x#suf", - &Pattern{ - Affix: "\x03pre\x03suf", - PadRune: 'x', - FormatWidth: 7, - Flags: PadAfterPrefix, - }, -}, { - "pre#*xsuf", - &Pattern{ - Affix: "\x03pre\x03suf", - PadRune: 'x', - FormatWidth: 7, - Flags: PadBeforeSuffix, - }, -}, { - "pre#suf*x", - &Pattern{ - Affix: "\x03pre\x03suf", - PadRune: 'x', - FormatWidth: 7, - Flags: PadAfterSuffix, - }, -}, { - `* #0 o''clock`, - &Pattern{Affix: "\x00\x09 o\\'clock", - FormatWidth: 10, - PadRune: 32, - RoundingContext: RoundingContext{ - MinIntegerDigits: 0x1, - }, - }, -}, { - `'123'* #0'456'`, - &Pattern{Affix: "\x05'123'\x05'456'", - FormatWidth: 8, - PadRune: 32, - RoundingContext: RoundingContext{ - MinIntegerDigits: 0x1, - }, - Flags: PadAfterPrefix}, -}, { - // no duplicate padding - "*xpre#suf*x", nil, -}, { - // no duplicate padding - "*xpre#suf*x", nil, -}} - -func TestParsePattern(t *testing.T) { - for i, tc := range testCases { - t.Run(tc.pat, func(t *testing.T) { - f, err := ParsePattern(tc.pat) - if !reflect.DeepEqual(f, tc.want) { - t.Errorf("%d:%s:\ngot %#v;\nwant %#v", i, tc.pat, f, tc.want) - } - if got, want := err != nil, tc.want == nil; got != want { - t.Errorf("%d:%s:error: got %v; want %v", i, tc.pat, err, want) - } - }) - } -} - -func TestPatternSize(t *testing.T) { - if sz := unsafe.Sizeof(Pattern{}); sz > 56 { - t.Errorf("got %d; want <= 56", sz) - } - -} diff --git a/vendor/golang.org/x/text/internal/number/roundingmode_string.go b/vendor/golang.org/x/text/internal/number/roundingmode_string.go deleted file mode 100644 index f264ea549..000000000 --- a/vendor/golang.org/x/text/internal/number/roundingmode_string.go +++ /dev/null @@ -1,16 +0,0 @@ -// Code generated by "stringer -type RoundingMode"; DO NOT EDIT. - -package number - -import "fmt" - -const _RoundingMode_name = "ToNearestEvenToNearestZeroToNearestAwayToPositiveInfToNegativeInfToZeroAwayFromZeronumModes" - -var _RoundingMode_index = [...]uint8{0, 13, 26, 39, 52, 65, 71, 83, 91} - -func (i RoundingMode) String() string { - if i >= RoundingMode(len(_RoundingMode_index)-1) { - return fmt.Sprintf("RoundingMode(%d)", i) - } - return _RoundingMode_name[_RoundingMode_index[i]:_RoundingMode_index[i+1]] -} diff --git a/vendor/golang.org/x/text/internal/number/tables.go b/vendor/golang.org/x/text/internal/number/tables.go deleted file mode 100644 index 2cf16f592..000000000 --- a/vendor/golang.org/x/text/internal/number/tables.go +++ /dev/null @@ -1,1138 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package number - -import "golang.org/x/text/internal/stringset" - -// CLDRVersion is the CLDR version from which the tables in this package are derived. -const CLDRVersion = "31" - -var numSysData = []systemData{ // 58 elements - 0: {id: 0x0, digitSize: 0x1, zero: [4]uint8{0x30, 0x0, 0x0, 0x0}}, - 1: {id: 0x1, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9e, 0xa5, 0x90}}, - 2: {id: 0x2, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x9c, 0xb0}}, - 3: {id: 0x3, digitSize: 0x2, zero: [4]uint8{0xd9, 0xa0, 0x0, 0x0}}, - 4: {id: 0x4, digitSize: 0x2, zero: [4]uint8{0xdb, 0xb0, 0x0, 0x0}}, - 5: {id: 0x5, digitSize: 0x3, zero: [4]uint8{0xe1, 0xad, 0x90, 0x0}}, - 6: {id: 0x6, digitSize: 0x3, zero: [4]uint8{0xe0, 0xa7, 0xa6, 0x0}}, - 7: {id: 0x7, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0xb1, 0x90}}, - 8: {id: 0x8, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x81, 0xa6}}, - 9: {id: 0x9, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x84, 0xb6}}, - 10: {id: 0xa, digitSize: 0x3, zero: [4]uint8{0xea, 0xa9, 0x90, 0x0}}, - 11: {id: 0xb, digitSize: 0x3, zero: [4]uint8{0xe0, 0xa5, 0xa6, 0x0}}, - 12: {id: 0xc, digitSize: 0x3, zero: [4]uint8{0xef, 0xbc, 0x90, 0x0}}, - 13: {id: 0xd, digitSize: 0x3, zero: [4]uint8{0xe0, 0xab, 0xa6, 0x0}}, - 14: {id: 0xe, digitSize: 0x3, zero: [4]uint8{0xe0, 0xa9, 0xa6, 0x0}}, - 15: {id: 0xf, digitSize: 0x4, zero: [4]uint8{0xf0, 0x96, 0xad, 0x90}}, - 16: {id: 0x10, digitSize: 0x3, zero: [4]uint8{0xea, 0xa7, 0x90, 0x0}}, - 17: {id: 0x11, digitSize: 0x3, zero: [4]uint8{0xea, 0xa4, 0x80, 0x0}}, - 18: {id: 0x12, digitSize: 0x3, zero: [4]uint8{0xe1, 0x9f, 0xa0, 0x0}}, - 19: {id: 0x13, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb3, 0xa6, 0x0}}, - 20: {id: 0x14, digitSize: 0x3, zero: [4]uint8{0xe1, 0xaa, 0x80, 0x0}}, - 21: {id: 0x15, digitSize: 0x3, zero: [4]uint8{0xe1, 0xaa, 0x90, 0x0}}, - 22: {id: 0x16, digitSize: 0x3, zero: [4]uint8{0xe0, 0xbb, 0x90, 0x0}}, - 23: {id: 0x17, digitSize: 0x3, zero: [4]uint8{0xe1, 0xb1, 0x80, 0x0}}, - 24: {id: 0x18, digitSize: 0x3, zero: [4]uint8{0xe1, 0xa5, 0x86, 0x0}}, - 25: {id: 0x19, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0x8e}}, - 26: {id: 0x1a, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0x98}}, - 27: {id: 0x1b, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0xb6}}, - 28: {id: 0x1c, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0xac}}, - 29: {id: 0x1d, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0xa2}}, - 30: {id: 0x1e, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb5, 0xa6, 0x0}}, - 31: {id: 0x1f, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x99, 0x90}}, - 32: {id: 0x20, digitSize: 0x3, zero: [4]uint8{0xe1, 0xa0, 0x90, 0x0}}, - 33: {id: 0x21, digitSize: 0x4, zero: [4]uint8{0xf0, 0x96, 0xa9, 0xa0}}, - 34: {id: 0x22, digitSize: 0x3, zero: [4]uint8{0xea, 0xaf, 0xb0, 0x0}}, - 35: {id: 0x23, digitSize: 0x3, zero: [4]uint8{0xe1, 0x81, 0x80, 0x0}}, - 36: {id: 0x24, digitSize: 0x3, zero: [4]uint8{0xe1, 0x82, 0x90, 0x0}}, - 37: {id: 0x25, digitSize: 0x3, zero: [4]uint8{0xea, 0xa7, 0xb0, 0x0}}, - 38: {id: 0x26, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x91, 0x90}}, - 39: {id: 0x27, digitSize: 0x2, zero: [4]uint8{0xdf, 0x80, 0x0, 0x0}}, - 40: {id: 0x28, digitSize: 0x3, zero: [4]uint8{0xe1, 0xb1, 0x90, 0x0}}, - 41: {id: 0x29, digitSize: 0x3, zero: [4]uint8{0xe0, 0xad, 0xa6, 0x0}}, - 42: {id: 0x2a, digitSize: 0x4, zero: [4]uint8{0xf0, 0x90, 0x92, 0xa0}}, - 43: {id: 0x2b, digitSize: 0x3, zero: [4]uint8{0xea, 0xa3, 0x90, 0x0}}, - 44: {id: 0x2c, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x87, 0x90}}, - 45: {id: 0x2d, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x8b, 0xb0}}, - 46: {id: 0x2e, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb7, 0xa6, 0x0}}, - 47: {id: 0x2f, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x83, 0xb0}}, - 48: {id: 0x30, digitSize: 0x3, zero: [4]uint8{0xe1, 0xae, 0xb0, 0x0}}, - 49: {id: 0x31, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x9b, 0x80}}, - 50: {id: 0x32, digitSize: 0x3, zero: [4]uint8{0xe1, 0xa7, 0x90, 0x0}}, - 51: {id: 0x33, digitSize: 0x3, zero: [4]uint8{0xe0, 0xaf, 0xa6, 0x0}}, - 52: {id: 0x34, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb1, 0xa6, 0x0}}, - 53: {id: 0x35, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb9, 0x90, 0x0}}, - 54: {id: 0x36, digitSize: 0x3, zero: [4]uint8{0xe0, 0xbc, 0xa0, 0x0}}, - 55: {id: 0x37, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x93, 0x90}}, - 56: {id: 0x38, digitSize: 0x3, zero: [4]uint8{0xea, 0x98, 0xa0, 0x0}}, - 57: {id: 0x39, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0xa3, 0xa0}}, -} // Size: 372 bytes - -const ( - numAdlm = 0x1 - numAhom = 0x2 - numArab = 0x3 - numArabext = 0x4 - numArmn = 0x3a - numArmnlow = 0x3b - numBali = 0x5 - numBeng = 0x6 - numBhks = 0x7 - numBrah = 0x8 - numCakm = 0x9 - numCham = 0xa - numCyrl = 0x3c - numDeva = 0xb - numEthi = 0x3d - numFullwide = 0xc - numGeor = 0x3e - numGrek = 0x3f - numGreklow = 0x40 - numGujr = 0xd - numGuru = 0xe - numHanidays = 0x41 - numHanidec = 0x42 - numHans = 0x43 - numHansfin = 0x44 - numHant = 0x45 - numHantfin = 0x46 - numHebr = 0x47 - numHmng = 0xf - numJava = 0x10 - numJpan = 0x48 - numJpanfin = 0x49 - numKali = 0x11 - numKhmr = 0x12 - numKnda = 0x13 - numLana = 0x14 - numLanatham = 0x15 - numLaoo = 0x16 - numLatn = 0x0 - numLepc = 0x17 - numLimb = 0x18 - numMathbold = 0x19 - numMathdbl = 0x1a - numMathmono = 0x1b - numMathsanb = 0x1c - numMathsans = 0x1d - numMlym = 0x1e - numModi = 0x1f - numMong = 0x20 - numMroo = 0x21 - numMtei = 0x22 - numMymr = 0x23 - numMymrshan = 0x24 - numMymrtlng = 0x25 - numNewa = 0x26 - numNkoo = 0x27 - numOlck = 0x28 - numOrya = 0x29 - numOsma = 0x2a - numRoman = 0x4a - numRomanlow = 0x4b - numSaur = 0x2b - numShrd = 0x2c - numSind = 0x2d - numSinh = 0x2e - numSora = 0x2f - numSund = 0x30 - numTakr = 0x31 - numTalu = 0x32 - numTaml = 0x4c - numTamldec = 0x33 - numTelu = 0x34 - numThai = 0x35 - numTibt = 0x36 - numTirh = 0x37 - numVaii = 0x38 - numWara = 0x39 - numNumberSystems -) - -var systemMap = map[string]system{ - "adlm": numAdlm, - "ahom": numAhom, - "arab": numArab, - "arabext": numArabext, - "armn": numArmn, - "armnlow": numArmnlow, - "bali": numBali, - "beng": numBeng, - "bhks": numBhks, - "brah": numBrah, - "cakm": numCakm, - "cham": numCham, - "cyrl": numCyrl, - "deva": numDeva, - "ethi": numEthi, - "fullwide": numFullwide, - "geor": numGeor, - "grek": numGrek, - "greklow": numGreklow, - "gujr": numGujr, - "guru": numGuru, - "hanidays": numHanidays, - "hanidec": numHanidec, - "hans": numHans, - "hansfin": numHansfin, - "hant": numHant, - "hantfin": numHantfin, - "hebr": numHebr, - "hmng": numHmng, - "java": numJava, - "jpan": numJpan, - "jpanfin": numJpanfin, - "kali": numKali, - "khmr": numKhmr, - "knda": numKnda, - "lana": numLana, - "lanatham": numLanatham, - "laoo": numLaoo, - "latn": numLatn, - "lepc": numLepc, - "limb": numLimb, - "mathbold": numMathbold, - "mathdbl": numMathdbl, - "mathmono": numMathmono, - "mathsanb": numMathsanb, - "mathsans": numMathsans, - "mlym": numMlym, - "modi": numModi, - "mong": numMong, - "mroo": numMroo, - "mtei": numMtei, - "mymr": numMymr, - "mymrshan": numMymrshan, - "mymrtlng": numMymrtlng, - "newa": numNewa, - "nkoo": numNkoo, - "olck": numOlck, - "orya": numOrya, - "osma": numOsma, - "roman": numRoman, - "romanlow": numRomanlow, - "saur": numSaur, - "shrd": numShrd, - "sind": numSind, - "sinh": numSinh, - "sora": numSora, - "sund": numSund, - "takr": numTakr, - "talu": numTalu, - "taml": numTaml, - "tamldec": numTamldec, - "telu": numTelu, - "thai": numThai, - "tibt": numTibt, - "tirh": numTirh, - "vaii": numVaii, - "wara": numWara, -} - -var symIndex = [][12]uint8{ // 71 elements - 0: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 1: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 2: [12]uint8{0x0, 0x1, 0x2, 0xd, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0x10, 0xb}, - 3: [12]uint8{0x1, 0x0, 0x2, 0xd, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0x10, 0xb}, - 4: [12]uint8{0x0, 0x1, 0x2, 0x11, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0x10, 0xb}, - 5: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x12, 0xb}, - 6: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 7: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x13, 0x8, 0x9, 0xa, 0xb}, - 8: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x14, 0xb}, - 9: [12]uint8{0x0, 0x1, 0x2, 0x3, 0xe, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 10: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x0}, - 11: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x13, 0x8, 0x9, 0xa, 0xb}, - 12: [12]uint8{0x0, 0x15, 0x2, 0x3, 0x4, 0x5, 0x6, 0x13, 0x8, 0x9, 0xa, 0xb}, - 13: [12]uint8{0x0, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 14: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x16, 0xb}, - 15: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x17, 0x7, 0x8, 0x9, 0xa, 0xb}, - 16: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x17, 0x7, 0x8, 0x9, 0xa, 0xb}, - 17: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x0}, - 18: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x18, 0x7, 0x8, 0x9, 0xa, 0xb}, - 19: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x19, 0x1a, 0xa, 0xb}, - 20: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 21: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x18, 0x7, 0x8, 0x9, 0xa, 0xb}, - 22: [12]uint8{0x0, 0x1, 0x2, 0x3, 0xe, 0x1c, 0x6, 0x7, 0x8, 0x9, 0x1d, 0xb}, - 23: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0x1e, 0x0}, - 24: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 25: [12]uint8{0x0, 0x15, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 26: [12]uint8{0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 27: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x1f, 0xb}, - 28: [12]uint8{0x0, 0x15, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 29: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x20, 0xb}, - 30: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x21, 0xb}, - 31: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x1b, 0x18, 0x13, 0x8, 0x9, 0x22, 0xb}, - 32: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x18, 0x7, 0x8, 0x9, 0x22, 0xb}, - 33: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x23, 0xb}, - 34: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x24, 0xb}, - 35: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x25, 0xb}, - 36: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x26, 0xb}, - 37: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x27, 0xb}, - 38: [12]uint8{0x1, 0x0, 0x2, 0x3, 0xe, 0x1c, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 39: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x28, 0xb}, - 40: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x29, 0xb}, - 41: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x2a, 0x13, 0x8, 0x9, 0x22, 0xb}, - 42: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x0}, - 43: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x17, 0x7, 0x8, 0x9, 0xa, 0xb}, - 44: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x1b, 0x17, 0x7, 0x8, 0x9, 0xa, 0xb}, - 45: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2b, 0x0}, - 46: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2c, 0xb}, - 47: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2d, 0xb}, - 48: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x2e, 0x7, 0x8, 0x9, 0xa, 0xb}, - 49: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2f, 0xb}, - 50: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x30, 0xb}, - 51: [12]uint8{0x1, 0x15, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, - 52: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x31, 0xb}, - 53: [12]uint8{0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x7, 0x39, 0x9, 0xa, 0xb}, - 54: [12]uint8{0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x7, 0x39, 0x9, 0x3a, 0xb}, - 55: [12]uint8{0x32, 0x33, 0x34, 0x11, 0x36, 0x37, 0x38, 0x7, 0x39, 0x9, 0xa, 0xb}, - 56: [12]uint8{0x32, 0x33, 0x34, 0x11, 0x36, 0x3b, 0x38, 0x7, 0x39, 0x9, 0xa, 0xb}, - 57: [12]uint8{0x32, 0xc, 0x34, 0x35, 0x36, 0x3c, 0x38, 0x7, 0x39, 0x9, 0xa, 0x0}, - 58: [12]uint8{0x32, 0x33, 0x34, 0x35, 0x36, 0x3c, 0x38, 0x7, 0x3d, 0x9, 0x22, 0xb}, - 59: [12]uint8{0x32, 0x33, 0x34, 0x11, 0x3e, 0x3f, 0x40, 0x7, 0x39, 0x9, 0xa, 0x32}, - 60: [12]uint8{0x32, 0x33, 0x34, 0x41, 0xe, 0x1c, 0x40, 0x7, 0x39, 0x9, 0x1d, 0xb}, - 61: [12]uint8{0x32, 0x33, 0x34, 0x11, 0xe, 0x1c, 0x40, 0x7, 0x39, 0x9, 0xa, 0x32}, - 62: [12]uint8{0x1, 0xc, 0x34, 0x11, 0x3e, 0x42, 0x40, 0x7, 0x39, 0x9, 0xa, 0x0}, - 63: [12]uint8{0x32, 0x1, 0x34, 0x11, 0x4, 0x5, 0x40, 0x7, 0x39, 0x9, 0xa, 0x32}, - 64: [12]uint8{0x32, 0x33, 0x34, 0x11, 0x3e, 0x42, 0x40, 0x7, 0x39, 0x9, 0x22, 0xb}, - 65: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x3e, 0x3f, 0x40, 0x7, 0x8, 0x9, 0xa, 0x32}, - 66: [12]uint8{0x32, 0x33, 0x34, 0x11, 0x4, 0x5, 0x40, 0x7, 0x39, 0x9, 0x2f, 0x32}, - 67: [12]uint8{0x32, 0x33, 0x34, 0x11, 0x4, 0x5, 0x40, 0x7, 0x39, 0x9, 0x30, 0x32}, - 68: [12]uint8{0x0, 0x1, 0x43, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x26, 0xb}, - 69: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x44, 0xb}, - 70: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x45, 0x46, 0xb}, -} // Size: 876 bytes - -var symData = stringset.Set{ - Data: "" + // Size: 580 bytes - ".,;%+-E׉∞NaN:\u00a0\u200e%\u200e\u200e+\u200e-ليس\u00a0رقمًا٪ND·Терхьаш" + - "\u00a0дац’mnne×10^0/00INF−\u200e−ناعددepälukuՈչԹარ\u00a0არის\u00a0რიცხვი" + - "сан\u00a0емес¤¤¤сан\u00a0эмесບໍ່\u200bແມ່ນ\u200bໂຕ\u200bເລກNSဂဏန်းမဟုတ်" + - "သောННне\u00a0числочыыһыла\u00a0буотах·10^epilohosan\u00a0dälTFЕhaqiqiy" + - "\u00a0son\u00a0emasҳақиқий\u00a0сон\u00a0эмас非數值٫٬؛٪\u061c\u061c+\u061c-" + - "اس؉ليس\u00a0رقم\u200f−\u061c−؉\u200f\u200e+\u200e\u200e-\u200e×۱۰^" + - "\u200e٪\u200e−\u200e၊ཨང་མེན་གྲངས་མེདཨང་མད", - Index: []uint16{ // 72 elements - // Entry 0 - 3F - 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, - 0x0009, 0x000c, 0x000f, 0x0012, 0x0013, 0x0015, 0x001c, 0x0020, - 0x0024, 0x0036, 0x0038, 0x003a, 0x003c, 0x0052, 0x0055, 0x0058, - 0x0059, 0x005e, 0x0062, 0x0065, 0x0068, 0x006e, 0x0078, 0x0080, - 0x0086, 0x00ae, 0x00be, 0x00c4, 0x00d4, 0x0101, 0x0103, 0x012a, - 0x012e, 0x013e, 0x015a, 0x015f, 0x0166, 0x016f, 0x0171, 0x0173, - 0x0185, 0x01a5, 0x01ae, 0x01b0, 0x01b2, 0x01b4, 0x01b8, 0x01bb, - 0x01be, 0x01c2, 0x01c4, 0x01d2, 0x01d8, 0x01dd, 0x01e2, 0x01e9, - // Entry 40 - 7F - 0x01f0, 0x01f7, 0x01fc, 0x0205, 0x0208, 0x021d, 0x0235, 0x0244, - }, -} // Size: 764 bytes - -// langToDefaults maps a compact language index to the default numbering system -// and default symbol set -var langToDefaults = [754]uint8{ - // Entry 0 - 3F - 0x80, 0x06, 0x13, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x83, 0x02, 0x02, 0x02, - 0x02, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, - 0x02, 0x04, 0x02, 0x04, 0x02, 0x02, 0x02, 0x03, - 0x02, 0x00, 0x85, 0x00, 0x00, 0x00, 0x86, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, - // Entry 40 - 7F - 0x00, 0x00, 0x89, 0x00, 0x00, 0x8a, 0x00, 0x00, - 0x8c, 0x01, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x8e, 0x09, 0x09, 0x90, - 0x01, 0x01, 0x01, 0x93, 0x00, 0x0a, 0x0a, 0x0a, - 0x00, 0x00, 0x0b, 0x07, 0x0b, 0x0c, 0x0b, 0x0b, - 0x0c, 0x0b, 0x0d, 0x0d, 0x0b, 0x0b, 0x01, 0x01, - 0x00, 0x01, 0x01, 0x95, 0x00, 0x00, 0x00, 0x0e, - // Entry 80 - BF - 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x0b, 0x10, 0x00, 0x06, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry C0 - FF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x14, 0x14, - 0x06, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, - 0x01, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x00, - // Entry 100 - 13F - 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x00, 0x06, 0x06, 0x15, 0x15, 0x06, - 0x06, 0x01, 0x01, 0x97, 0x16, 0x16, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x17, 0x17, 0x00, 0x00, 0x18, - 0x18, 0x18, 0x9a, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x06, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry 140 - 17F - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x9d, - 0x00, 0x06, 0x06, 0x19, 0x19, 0x19, 0x19, 0xa0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1a, 0x00, 0x00, - 0x06, 0x06, 0x06, 0x0b, 0x0b, 0x01, 0x01, 0x1b, - 0x1b, 0x0a, 0x0a, 0xa2, 0x00, 0x00, 0x00, 0x06, - // Entry 180 - 1BF - 0x06, 0x06, 0x1c, 0x06, 0x06, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x1d, - 0x1d, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x0d, 0x0d, 0x00, 0x00, 0x1e, - 0x1e, 0x06, 0x06, 0x1f, 0x1f, 0x00, 0x00, 0x06, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa5, 0x1a, 0x00, 0x00, 0x01, 0x01, 0x20, 0x20, - 0x00, 0x00, 0x00, 0x21, 0x21, 0x00, 0x00, 0x06, - // Entry 1C0 - 1FF - 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x22, 0x22, 0xa7, 0x00, 0x00, 0x15, - 0x15, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x23, - 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0d, - 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0xaa, 0x24, - 0xac, 0x00, 0x00, 0x00, 0x00, 0xad, 0x14, 0x14, - // Entry 200 - 23F - 0x00, 0x00, 0x06, 0x06, 0x06, 0xb0, 0x00, 0x00, - 0xb1, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x01, 0x01, 0x14, 0x14, 0x06, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x25, 0x25, 0x25, 0xb4, - 0xb6, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x01, 0xb8, 0x26, 0x06, 0x01, 0x06, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry 240 - 27F - 0x00, 0x06, 0x00, 0x00, 0x19, 0x19, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x00, 0x00, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x06, 0x06, 0x00, 0x00, - 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, - 0x29, 0x29, 0x29, 0x06, 0x06, 0x0d, 0x0d, 0x06, - 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2a, 0x2a, - 0x2b, 0x2b, 0x2c, 0x2c, 0x00, 0x00, 0x00, 0x2d, - 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 280 - 2BF - 0x00, 0x01, 0x01, 0x01, 0x01, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x00, 0x00, 0x00, 0xba, 0x20, 0x20, 0x20, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x2e, 0x00, - 0x2f, 0x2f, 0x06, 0x06, 0x06, 0x00, 0x0d, 0x0d, - 0x01, 0x01, 0x00, 0x00, 0x30, 0x30, 0xbd, 0xbf, - // Entry 2C0 - 2FF - 0x1a, 0xc0, 0xc2, 0x26, 0xc4, 0x32, 0x31, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x34, 0x34, 0x01, 0x01, 0xc6, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x34, 0x34, 0x34, 0x34, - 0x00, 0x00, -} // Size: 754 bytes - -// langToAlt is a list of numbering system and symbol set pairs, sorted and -// marked by compact language index. -var langToAlt = []altSymData{ // 73 elements - 1: {compactTag: 0x0, system: 0x3, symIndex: 0x35}, - 2: {compactTag: 0x0, system: 0x4, symIndex: 0x3b}, - 3: {compactTag: 0xc, system: 0x3, symIndex: 0x36}, - 4: {compactTag: 0xc, system: 0x0, symIndex: 0x2}, - 5: {compactTag: 0x2a, system: 0x6, symIndex: 0x0}, - 6: {compactTag: 0x2e, system: 0x0, symIndex: 0x5}, - 7: {compactTag: 0x2e, system: 0x3, symIndex: 0x37}, - 8: {compactTag: 0x2e, system: 0x4, symIndex: 0x3b}, - 9: {compactTag: 0x42, system: 0x6, symIndex: 0x0}, - 10: {compactTag: 0x45, system: 0x0, symIndex: 0x0}, - 11: {compactTag: 0x45, system: 0x36, symIndex: 0x45}, - 12: {compactTag: 0x48, system: 0x0, symIndex: 0x1}, - 13: {compactTag: 0x48, system: 0x3, symIndex: 0x35}, - 14: {compactTag: 0x5c, system: 0x3, symIndex: 0x37}, - 15: {compactTag: 0x5c, system: 0x0, symIndex: 0x9}, - 16: {compactTag: 0x5f, system: 0x0, symIndex: 0x1}, - 17: {compactTag: 0x5f, system: 0x3, symIndex: 0x35}, - 18: {compactTag: 0x5f, system: 0x4, symIndex: 0x3b}, - 19: {compactTag: 0x63, system: 0x0, symIndex: 0x0}, - 20: {compactTag: 0x63, system: 0x3, symIndex: 0x35}, - 21: {compactTag: 0x7b, system: 0x36, symIndex: 0x46}, - 22: {compactTag: 0x7b, system: 0x0, symIndex: 0x0}, - 23: {compactTag: 0x113, system: 0x4, symIndex: 0x3c}, - 24: {compactTag: 0x113, system: 0x0, symIndex: 0x16}, - 25: {compactTag: 0x113, system: 0x3, symIndex: 0x37}, - 26: {compactTag: 0x122, system: 0x0, symIndex: 0x1}, - 27: {compactTag: 0x122, system: 0x3, symIndex: 0x38}, - 28: {compactTag: 0x122, system: 0x4, symIndex: 0x3d}, - 29: {compactTag: 0x157, system: 0x0, symIndex: 0x0}, - 30: {compactTag: 0x157, system: 0x3, symIndex: 0x37}, - 31: {compactTag: 0x157, system: 0x4, symIndex: 0x3b}, - 32: {compactTag: 0x15f, system: 0x0, symIndex: 0x0}, - 33: {compactTag: 0x15f, system: 0x3, symIndex: 0x35}, - 34: {compactTag: 0x17b, system: 0x0, symIndex: 0x0}, - 35: {compactTag: 0x17b, system: 0x3, symIndex: 0x35}, - 36: {compactTag: 0x17b, system: 0x4, symIndex: 0x3b}, - 37: {compactTag: 0x1b0, system: 0x4, symIndex: 0x3b}, - 38: {compactTag: 0x1b0, system: 0x0, symIndex: 0x1a}, - 39: {compactTag: 0x1cc, system: 0x4, symIndex: 0x3b}, - 40: {compactTag: 0x1cc, system: 0x0, symIndex: 0x0}, - 41: {compactTag: 0x1ec, system: 0xb, symIndex: 0x0}, - 42: {compactTag: 0x1f6, system: 0x23, symIndex: 0x44}, - 43: {compactTag: 0x1f6, system: 0x0, symIndex: 0x24}, - 44: {compactTag: 0x1f8, system: 0x4, symIndex: 0x3b}, - 45: {compactTag: 0x1fd, system: 0x0, symIndex: 0x14}, - 46: {compactTag: 0x1fd, system: 0x3, symIndex: 0x39}, - 47: {compactTag: 0x1fd, system: 0x4, symIndex: 0x3e}, - 48: {compactTag: 0x205, system: 0xb, symIndex: 0x0}, - 49: {compactTag: 0x208, system: 0x0, symIndex: 0x6}, - 50: {compactTag: 0x208, system: 0x3, symIndex: 0x35}, - 51: {compactTag: 0x208, system: 0x4, symIndex: 0x3b}, - 52: {compactTag: 0x227, system: 0x0, symIndex: 0x0}, - 53: {compactTag: 0x227, system: 0x4, symIndex: 0x3f}, - 54: {compactTag: 0x228, system: 0x4, symIndex: 0x3b}, - 55: {compactTag: 0x228, system: 0x0, symIndex: 0x1a}, - 56: {compactTag: 0x231, system: 0x4, symIndex: 0x3b}, - 57: {compactTag: 0x231, system: 0x0, symIndex: 0x26}, - 58: {compactTag: 0x293, system: 0x0, symIndex: 0x20}, - 59: {compactTag: 0x293, system: 0x3, symIndex: 0x3a}, - 60: {compactTag: 0x293, system: 0x4, symIndex: 0x40}, - 61: {compactTag: 0x2be, system: 0x0, symIndex: 0x1a}, - 62: {compactTag: 0x2be, system: 0x4, symIndex: 0x41}, - 63: {compactTag: 0x2bf, system: 0x4, symIndex: 0x41}, - 64: {compactTag: 0x2c1, system: 0x0, symIndex: 0x31}, - 65: {compactTag: 0x2c1, system: 0x4, symIndex: 0x42}, - 66: {compactTag: 0x2c2, system: 0x4, symIndex: 0x3b}, - 67: {compactTag: 0x2c2, system: 0x0, symIndex: 0x26}, - 68: {compactTag: 0x2c4, system: 0x0, symIndex: 0x32}, - 69: {compactTag: 0x2c4, system: 0x4, symIndex: 0x43}, - 70: {compactTag: 0x2e6, system: 0x0, symIndex: 0x0}, - 71: {compactTag: 0x2e6, system: 0x3, symIndex: 0x35}, - 72: {compactTag: 0x2e6, system: 0x4, symIndex: 0x3b}, -} // Size: 316 bytes - -var tagToDecimal = []uint8{ // 754 elements - // Entry 0 - 3F - 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry 40 - 7F - 0x01, 0x01, 0x05, 0x05, 0x05, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, 0x01, - // Entry 80 - BF - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry C0 - FF - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry 100 - 13F - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry 140 - 17F - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, - 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry 180 - 1BF - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, - 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry 1C0 - 1FF - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x05, 0x05, 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry 200 - 23F - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, 0x01, 0x05, - 0x01, 0x01, 0x05, 0x05, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry 240 - 27F - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry 280 - 2BF - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x05, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - // Entry 2C0 - 2FF - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, -} // Size: 778 bytes - -var tagToScientific = []uint8{ // 754 elements - // Entry 0 - 3F - 0x02, 0x02, 0x09, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 40 - 7F - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 80 - BF - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry C0 - FF - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 100 - 13F - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 140 - 17F - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0d, - 0x0d, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0d, 0x0d, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 180 - 1BF - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 1C0 - 1FF - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x0e, 0x0e, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x0d, 0x0d, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 200 - 23F - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0d, - 0x02, 0x02, 0x0d, 0x0d, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 240 - 27F - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0e, 0x0e, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 280 - 2BF - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - // Entry 2C0 - 2FF - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, -} // Size: 778 bytes - -var tagToPercent = []uint8{ // 754 elements - // Entry 0 - 3F - 0x04, 0x04, 0x0a, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, - 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - // Entry 40 - 7F - 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, - 0x03, 0x03, 0x06, 0x06, 0x03, 0x04, 0x04, 0x03, - 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, - 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, - 0x04, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x07, 0x07, 0x04, 0x04, 0x04, - // Entry 80 - BF - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x03, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x03, 0x04, 0x03, 0x04, 0x04, - 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - // Entry C0 - FF - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, - 0x03, 0x03, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, - // Entry 100 - 13F - 0x03, 0x03, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x0b, - 0x0b, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - // Entry 140 - 17F - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x06, - 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, - 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - // Entry 180 - 1BF - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, - 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, - 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, - // Entry 1C0 - 1FF - 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, - 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, - // Entry 200 - 23F - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, - 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - // Entry 240 - 27F - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, - 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x03, - 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - // Entry 280 - 2BF - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, - 0x04, 0x04, 0x0f, 0x0f, 0x0f, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, - // Entry 2C0 - 2FF - 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, -} // Size: 778 bytes - -var formats = []Pattern{Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x0, - MinIntegerDigits: 0x0, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x0, - GroupingSize: [2]uint8{0x0, - 0x0}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x3, - Mode: 0x0, - DigitShift: 0x0, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x9, - GroupingSize: [2]uint8{0x3, - 0x0}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x0, - MinIntegerDigits: 0x0, - MaxIntegerDigits: 0x1, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x1}, - Affix: "", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x3, - GroupingSize: [2]uint8{0x0, - 0x0}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x2, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "\x00\x03\u00a0%", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x7, - GroupingSize: [2]uint8{0x3, - 0x0}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x2, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "\x00\x01%", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x6, - GroupingSize: [2]uint8{0x3, - 0x0}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x3, - Mode: 0x0, - DigitShift: 0x0, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0xc, - GroupingSize: [2]uint8{0x3, - 0x2}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x2, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "\x00\x01%", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x9, - GroupingSize: [2]uint8{0x3, - 0x2}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x2, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "\x00\x03\u00a0%", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0xa, - GroupingSize: [2]uint8{0x3, - 0x2}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x6, - Mode: 0x0, - DigitShift: 0x0, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x9, - GroupingSize: [2]uint8{0x0, - 0x0}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x6, - Mode: 0x0, - DigitShift: 0x0, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x6, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x3}, - Affix: "", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0xd, - GroupingSize: [2]uint8{0x0, - 0x0}, - Flags: 0x4}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x2, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "\x00\x01%", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x3, - GroupingSize: [2]uint8{0x0, - 0x0}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x2, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "\x03%\u00a0\x00", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x7, - GroupingSize: [2]uint8{0x3, - 0x0}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x2, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "\x03%\u00a0\x00\x04%\u00a0-\x00", - Offset: 0x0, - NegOffset: 0x5, - PadRune: 0, - FormatWidth: 0x7, - GroupingSize: [2]uint8{0x3, - 0x0}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x0, - MinIntegerDigits: 0x0, - MaxIntegerDigits: 0x1, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x1}, - Affix: "\x01[\x01]", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x5, - GroupingSize: [2]uint8{0x0, - 0x0}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x0, - MinIntegerDigits: 0x0, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x1, - GroupingSize: [2]uint8{0x0, - 0x0}, - Flags: 0x0}, - Pattern{RoundingContext: RoundingContext{Increment: 0x0, - MaxSignificantDigits: 0, - MaxFractionDigits: 0x0, - Mode: 0x0, - DigitShift: 0x2, - MinIntegerDigits: 0x1, - MaxIntegerDigits: 0x0, - MinFractionDigits: 0x0, - MinSignificantDigits: 0x0, - MinExponentDigits: 0x0}, - Affix: "\x01%\x00", - Offset: 0x0, - NegOffset: 0x0, - PadRune: 0, - FormatWidth: 0x6, - GroupingSize: [2]uint8{0x3, - 0x0}, - Flags: 0x0}} - -// Total table size 7101 bytes (6KiB); checksum: 5190D0B3 diff --git a/vendor/golang.org/x/text/internal/number/tables_test.go b/vendor/golang.org/x/text/internal/number/tables_test.go deleted file mode 100644 index 054e23d26..000000000 --- a/vendor/golang.org/x/text/internal/number/tables_test.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package number - -import ( - "flag" - "log" - "reflect" - "testing" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/testtext" - "golang.org/x/text/language" - "golang.org/x/text/unicode/cldr" -) - -var draft = flag.String("draft", - "contributed", - `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) - -func TestNumberSystems(t *testing.T) { - testtext.SkipIfNotLong(t) - - r := gen.OpenCLDRCoreZip() - defer r.Close() - - d := &cldr.Decoder{} - d.SetDirFilter("supplemental") - d.SetSectionFilter("numberingSystem") - data, err := d.DecodeZip(r) - if err != nil { - t.Fatalf("DecodeZip: %v", err) - } - - for _, ns := range data.Supplemental().NumberingSystems.NumberingSystem { - n := systemMap[ns.Id] - if int(n) >= len(numSysData) { - continue - } - info := InfoFromLangID(0, ns.Id) - val := '0' - for _, rWant := range ns.Digits { - if rGot := info.Digit(val); rGot != rWant { - t.Errorf("%s:%d: got %U; want %U", ns.Id, val, rGot, rWant) - } - val++ - } - } -} - -func TestSymbols(t *testing.T) { - testtext.SkipIfNotLong(t) - - draft, err := cldr.ParseDraft(*draft) - if err != nil { - log.Fatalf("invalid draft level: %v", err) - } - - r := gen.OpenCLDRCoreZip() - defer r.Close() - - d := &cldr.Decoder{} - d.SetDirFilter("main") - d.SetSectionFilter("numbers") - data, err := d.DecodeZip(r) - if err != nil { - t.Fatalf("DecodeZip: %v", err) - } - - for _, lang := range data.Locales() { - ldml := data.RawLDML(lang) - if ldml.Numbers == nil { - continue - } - langIndex, ok := language.CompactIndex(language.MustParse(lang)) - if !ok { - t.Fatalf("No compact index for language %s", lang) - } - - syms := cldr.MakeSlice(&ldml.Numbers.Symbols) - syms.SelectDraft(draft) - - for _, sym := range ldml.Numbers.Symbols { - if sym.NumberSystem == "" { - continue - } - testCases := []struct { - name string - st SymbolType - x interface{} - }{ - {"Decimal", SymDecimal, sym.Decimal}, - {"Group", SymGroup, sym.Group}, - {"List", SymList, sym.List}, - {"PercentSign", SymPercentSign, sym.PercentSign}, - {"PlusSign", SymPlusSign, sym.PlusSign}, - {"MinusSign", SymMinusSign, sym.MinusSign}, - {"Exponential", SymExponential, sym.Exponential}, - {"SuperscriptingExponent", SymSuperscriptingExponent, sym.SuperscriptingExponent}, - {"PerMille", SymPerMille, sym.PerMille}, - {"Infinity", SymInfinity, sym.Infinity}, - {"NaN", SymNan, sym.Nan}, - {"TimeSeparator", SymTimeSeparator, sym.TimeSeparator}, - } - info := InfoFromLangID(langIndex, sym.NumberSystem) - for _, tc := range testCases { - // Extract the wanted value. - v := reflect.ValueOf(tc.x) - if v.Len() == 0 { - return - } - if v.Len() > 1 { - t.Fatalf("Multiple values of %q within single symbol not supported.", tc.name) - } - want := v.Index(0).MethodByName("Data").Call(nil)[0].String() - got := info.Symbol(tc.st) - if got != want { - t.Errorf("%s:%s:%s: got %q; want %q", lang, sym.NumberSystem, tc.name, got, want) - } - } - } - } -} diff --git a/vendor/golang.org/x/text/internal/stringset/set.go b/vendor/golang.org/x/text/internal/stringset/set.go deleted file mode 100644 index bb2fffbc7..000000000 --- a/vendor/golang.org/x/text/internal/stringset/set.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package stringset provides a way to represent a collection of strings -// compactly. -package stringset - -import "sort" - -// A Set holds a collection of strings that can be looked up by an index number. -type Set struct { - // These fields are exported to allow for code generation. - - Data string - Index []uint16 -} - -// Elem returns the string with index i. It panics if i is out of range. -func (s *Set) Elem(i int) string { - return s.Data[s.Index[i]:s.Index[i+1]] -} - -// Len returns the number of strings in the set. -func (s *Set) Len() int { - return len(s.Index) - 1 -} - -// Search returns the index of the given string or -1 if it is not in the set. -// The Set must have been created with strings in sorted order. -func Search(s *Set, str string) int { - // TODO: optimize this if it gets used a lot. - n := len(s.Index) - 1 - p := sort.Search(n, func(i int) bool { - return s.Elem(i) >= str - }) - if p == n || str != s.Elem(p) { - return -1 - } - return p -} - -// A Builder constructs Sets. -type Builder struct { - set Set - index map[string]int -} - -// NewBuilder returns a new and initialized Builder. -func NewBuilder() *Builder { - return &Builder{ - set: Set{ - Index: []uint16{0}, - }, - index: map[string]int{}, - } -} - -// Set creates the set created so far. -func (b *Builder) Set() Set { - return b.set -} - -// Index returns the index for the given string, which must have been added -// before. -func (b *Builder) Index(s string) int { - return b.index[s] -} - -// Add adds a string to the index. Strings that are added by a single Add will -// be stored together, unless they match an existing string. -func (b *Builder) Add(ss ...string) { - // First check if the string already exists. - for _, s := range ss { - if _, ok := b.index[s]; ok { - continue - } - b.index[s] = len(b.set.Index) - 1 - b.set.Data += s - x := len(b.set.Data) - if x > 0xFFFF { - panic("Index too > 0xFFFF") - } - b.set.Index = append(b.set.Index, uint16(x)) - } -} diff --git a/vendor/golang.org/x/text/internal/stringset/set_test.go b/vendor/golang.org/x/text/internal/stringset/set_test.go deleted file mode 100644 index 97b9e58be..000000000 --- a/vendor/golang.org/x/text/internal/stringset/set_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package stringset - -import "testing" - -func TestStringSet(t *testing.T) { - testCases := [][]string{ - {""}, - {"∫"}, - {"a", "b", "c"}, - {"", "a", "bb", "ccc"}, - {" ", "aaa", "bb", "c"}, - } - test := func(tc int, b *Builder) { - set := b.Set() - if set.Len() != len(testCases[tc]) { - t.Errorf("%d:Len() = %d; want %d", tc, set.Len(), len(testCases[tc])) - } - for i, s := range testCases[tc] { - if x := b.Index(s); x != i { - t.Errorf("%d:Index(%q) = %d; want %d", tc, s, x, i) - } - if p := Search(&set, s); p != i { - t.Errorf("%d:Search(%q) = %d; want %d", tc, s, p, i) - } - if set.Elem(i) != s { - t.Errorf("%d:Elem(%d) = %s; want %s", tc, i, set.Elem(i), s) - } - } - if p := Search(&set, "apple"); p != -1 { - t.Errorf(`%d:Search("apple") = %d; want -1`, tc, p) - } - } - for i, tc := range testCases { - b := NewBuilder() - for _, s := range tc { - b.Add(s) - } - b.Add(tc...) - test(i, b) - } - for i, tc := range testCases { - b := NewBuilder() - b.Add(tc...) - for _, s := range tc { - b.Add(s) - } - test(i, b) - } -} diff --git a/vendor/golang.org/x/text/internal/testtext/codesize.go b/vendor/golang.org/x/text/internal/testtext/codesize.go deleted file mode 100644 index 5fc5eaec7..000000000 --- a/vendor/golang.org/x/text/internal/testtext/codesize.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package testtext - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "runtime" -) - -// CodeSize builds the given code sample and returns the binary size or en error -// if an error occurred. The code sample typically will look like this: -// package main -// import "golang.org/x/text/somepackage" -// func main() { -// somepackage.Func() // reference Func to cause it to be linked in. -// } -// See dict_test.go in the display package for an example. -func CodeSize(s string) (int, error) { - // Write the file. - tmpdir, err := ioutil.TempDir(os.TempDir(), "testtext") - if err != nil { - return 0, fmt.Errorf("testtext: failed to create tmpdir: %v", err) - } - defer os.RemoveAll(tmpdir) - filename := filepath.Join(tmpdir, "main.go") - if err := ioutil.WriteFile(filename, []byte(s), 0644); err != nil { - return 0, fmt.Errorf("testtext: failed to write main.go: %v", err) - } - - // Build the binary. - w := &bytes.Buffer{} - cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), "build", "-o", "main") - cmd.Dir = tmpdir - cmd.Stderr = w - cmd.Stdout = w - if err := cmd.Run(); err != nil { - return 0, fmt.Errorf("testtext: failed to execute command: %v\nmain.go:\n%vErrors:%s", err, s, w) - } - - // Determine the size. - fi, err := os.Stat(filepath.Join(tmpdir, "main")) - if err != nil { - return 0, fmt.Errorf("testtext: failed to get file info: %v", err) - } - return int(fi.Size()), nil -} diff --git a/vendor/golang.org/x/text/internal/testtext/flag.go b/vendor/golang.org/x/text/internal/testtext/flag.go deleted file mode 100644 index 45b32b2ad..000000000 --- a/vendor/golang.org/x/text/internal/testtext/flag.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package testtext - -import ( - "flag" - "testing" - - "golang.org/x/text/internal/gen" -) - -var long = flag.Bool("long", false, - "run tests that require fetching data online") - -// SkipIfNotLong returns whether long tests should be performed. -func SkipIfNotLong(t *testing.T) { - if testing.Short() || !(gen.IsLocal() || *long) { - t.Skip("skipping test to prevent downloading; to run use -long or use -local or UNICODE_DIR to specify a local source") - } -} diff --git a/vendor/golang.org/x/text/internal/testtext/gc.go b/vendor/golang.org/x/text/internal/testtext/gc.go deleted file mode 100644 index a54e1bcbd..000000000 --- a/vendor/golang.org/x/text/internal/testtext/gc.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !gccgo - -package testtext - -import "testing" - -// AllocsPerRun wraps testing.AllocsPerRun. -func AllocsPerRun(runs int, f func()) (avg float64) { - return testing.AllocsPerRun(runs, f) -} diff --git a/vendor/golang.org/x/text/internal/testtext/gccgo.go b/vendor/golang.org/x/text/internal/testtext/gccgo.go deleted file mode 100644 index 30e98efff..000000000 --- a/vendor/golang.org/x/text/internal/testtext/gccgo.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build gccgo - -package testtext - -// AllocsPerRun always returns 0 for gccgo until gccgo implements escape -// analysis equal or better to that of gc. -func AllocsPerRun(runs int, f func()) (avg float64) { return 0 } diff --git a/vendor/golang.org/x/text/internal/testtext/go1_6.go b/vendor/golang.org/x/text/internal/testtext/go1_6.go deleted file mode 100644 index 7b2384738..000000000 --- a/vendor/golang.org/x/text/internal/testtext/go1_6.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.7 - -package testtext - -import "testing" - -func Run(t *testing.T, name string, fn func(t *testing.T)) bool { - t.Logf("Running %s...", name) - fn(t) - return t.Failed() -} - -// Bench runs the given benchmark function. This pre-1.7 implementation renders -// the measurement useless, but allows the code to be compiled at least. -func Bench(b *testing.B, name string, fn func(b *testing.B)) bool { - b.Logf("Running %s...", name) - fn(b) - return b.Failed() -} diff --git a/vendor/golang.org/x/text/internal/testtext/go1_7.go b/vendor/golang.org/x/text/internal/testtext/go1_7.go deleted file mode 100644 index 66f9cf787..000000000 --- a/vendor/golang.org/x/text/internal/testtext/go1_7.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7 - -package testtext - -import "testing" - -func Run(t *testing.T, name string, fn func(t *testing.T)) bool { - return t.Run(name, fn) -} - -func Bench(b *testing.B, name string, fn func(b *testing.B)) bool { - return b.Run(name, fn) -} diff --git a/vendor/golang.org/x/text/internal/testtext/text.go b/vendor/golang.org/x/text/internal/testtext/text.go deleted file mode 100644 index ce40d7e77..000000000 --- a/vendor/golang.org/x/text/internal/testtext/text.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package testtext contains test data that is of common use to the text -// repository. -package testtext // import "golang.org/x/text/internal/testtext" - -const ( - - // ASCII is an ASCII string containing all letters in the English alphabet. - ASCII = "The quick brown fox jumps over the lazy dog. " + - "The quick brown fox jumps over the lazy dog. " + - "The quick brown fox jumps over the lazy dog. " + - "The quick brown fox jumps over the lazy dog. " + - "The quick brown fox jumps over the lazy dog. " + - "The quick brown fox jumps over the lazy dog. " + - "The quick brown fox jumps over the lazy dog. " + - "The quick brown fox jumps over the lazy dog. " + - "The quick brown fox jumps over the lazy dog. " + - "The quick brown fox jumps over the lazy dog. " - - // Vietnamese is a snippet from http://creativecommons.org/licenses/by-sa/3.0/vn/ - Vietnamese = `Với các điều kiện sau: Ghi nhận công của tác giả. -Nếu bạn sử dụng, chuyển đổi, hoặc xây dựng dự án từ -nội dung được chia sẻ này, bạn phải áp dụng giấy phép này hoặc -một giấy phép khác có các điều khoản tương tự như giấy phép này -cho dự án của bạn. Hiểu rằng: Miễn — Bất kỳ các điều kiện nào -trên đây cũng có thể được miễn bỏ nếu bạn được sự cho phép của -người sở hữu bản quyền. Phạm vi công chúng — Khi tác phẩm hoặc -bất kỳ chương nào của tác phẩm đã trong vùng dành cho công -chúng theo quy định của pháp luật thì tình trạng của nó không -bị ảnh hưởng bởi giấy phép trong bất kỳ trường hợp nào.` - - // Russian is a snippet from http://creativecommons.org/licenses/by-sa/1.0/deed.ru - Russian = `При обязательном соблюдении следующих условий: -Attribution — Вы должны атрибутировать произведение (указывать -автора и источник) в порядке, предусмотренном автором или -лицензиаром (но только так, чтобы никоим образом не подразумевалось, -что они поддерживают вас или использование вами данного произведения). -Υπό τις ακόλουθες προϋποθέσεις:` - - // Greek is a snippet from http://creativecommons.org/licenses/by-sa/3.0/gr/ - Greek = `Αναφορά Δημιουργού — Θα πρέπει να κάνετε την αναφορά στο έργο με τον -τρόπο που έχει οριστεί από το δημιουργό ή το χορηγούντο την άδεια -(χωρίς όμως να εννοείται με οποιονδήποτε τρόπο ότι εγκρίνουν εσάς ή -τη χρήση του έργου από εσάς). Παρόμοια Διανομή — Εάν αλλοιώσετε, -τροποποιήσετε ή δημιουργήσετε περαιτέρω βασισμένοι στο έργο θα -μπορείτε να διανέμετε το έργο που θα προκύψει μόνο με την ίδια ή -παρόμοια άδεια.` - - // Arabic is a snippet from http://creativecommons.org/licenses/by-sa/3.0/deed.ar - Arabic = `بموجب الشروط التالية نسب المصنف — يجب عليك أن -تنسب العمل بالطريقة التي تحددها المؤلف أو المرخص (ولكن ليس بأي حال من -الأحوال أن توحي وتقترح بتحول أو استخدامك للعمل). -المشاركة على قدم المساواة — إذا كنت يعدل ، والتغيير ، أو الاستفادة -من هذا العمل ، قد ينتج عن توزيع العمل إلا في ظل تشابه او تطابق فى واحد -لهذا الترخيص.` - - // Hebrew is a snippet from http://creativecommons.org/licenses/by-sa/1.0/il/ - Hebrew = `בכפוף לתנאים הבאים: ייחוס — עליך לייחס את היצירה (לתת קרדיט) באופן -המצויין על-ידי היוצר או מעניק הרישיון (אך לא בשום אופן המרמז על כך -שהם תומכים בך או בשימוש שלך ביצירה). שיתוף זהה — אם תחליט/י לשנות, -לעבד או ליצור יצירה נגזרת בהסתמך על יצירה זו, תוכל/י להפיץ את יצירתך -החדשה רק תחת אותו הרישיון או רישיון דומה לרישיון זה.` - - TwoByteUTF8 = Russian + Greek + Arabic + Hebrew - - // Thai is a snippet from http://creativecommons.org/licenses/by-sa/3.0/th/ - Thai = `ภายใต้เงื่อนไข ดังต่อไปนี้ : แสดงที่มา — คุณต้องแสดงที่ -มาของงานดังกล่าว ตามรูปแบบที่ผู้สร้างสรรค์หรือผู้อนุญาตกำหนด (แต่ -ไม่ใช่ในลักษณะที่ว่า พวกเขาสนับสนุนคุณหรือสนับสนุนการที่ -คุณนำงานไปใช้) อนุญาตแบบเดียวกัน — หากคุณดัดแปลง เปลี่ยนรูป หรื -อต่อเติมงานนี้ คุณต้องใช้สัญญาอนุญาตแบบเดียวกันหรือแบบที่เหมื -อนกับสัญญาอนุญาตที่ใช้กับงานนี้เท่านั้น` - - ThreeByteUTF8 = Thai - - // Japanese is a snippet from http://creativecommons.org/licenses/by-sa/2.0/jp/ - Japanese = `あなたの従うべき条件は以下の通りです。 -表示 — あなたは原著作者のクレジットを表示しなければなりません。 -継承 — もしあなたがこの作品を改変、変形または加工した場合、 -あなたはその結果生じた作品をこの作品と同一の許諾条件の下でのみ -頒布することができます。` - - // Chinese is a snippet from http://creativecommons.org/licenses/by-sa/2.5/cn/ - Chinese = `您可以自由: 复制、发行、展览、表演、放映、 -广播或通过信息网络传播本作品 创作演绎作品 -对本作品进行商业性使用 惟须遵守下列条件: -署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。 -相同方式共享 — 如果您改变、转换本作品或者以本作品为基础进行创作, -您只能采用与本协议相同的许可协议发布基于本作品的演绎作品。` - - // Korean is a snippet from http://creativecommons.org/licenses/by-sa/2.0/kr/ - Korean = `다음과 같은 조건을 따라야 합니다: 저작자표시 -— 저작자나 이용허락자가 정한 방법으로 저작물의 -원저작자를 표시하여야 합니다(그러나 원저작자가 이용자나 이용자의 -이용을 보증하거나 추천한다는 의미로 표시해서는 안됩니다). -동일조건변경허락 — 이 저작물을 이용하여 만든 이차적 저작물에는 본 -라이선스와 동일한 라이선스를 적용해야 합니다.` - - CJK = Chinese + Japanese + Korean - - All = ASCII + Vietnamese + TwoByteUTF8 + ThreeByteUTF8 + CJK -) diff --git a/vendor/golang.org/x/text/language/display/dict.go b/vendor/golang.org/x/text/language/display/dict.go deleted file mode 100644 index 52c11a932..000000000 --- a/vendor/golang.org/x/text/language/display/dict.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package display - -// This file contains sets of data for specific languages. Users can use these -// to create smaller collections of supported languages and reduce total table -// size. - -// The variable names defined here correspond to those in package language. - -var ( - Afrikaans *Dictionary = &af // af - Amharic *Dictionary = &am // am - Arabic *Dictionary = &ar // ar - ModernStandardArabic *Dictionary = Arabic // ar-001 - Azerbaijani *Dictionary = &az // az - Bulgarian *Dictionary = &bg // bg - Bengali *Dictionary = &bn // bn - Catalan *Dictionary = &ca // ca - Czech *Dictionary = &cs // cs - Danish *Dictionary = &da // da - German *Dictionary = &de // de - Greek *Dictionary = &el // el - English *Dictionary = &en // en - AmericanEnglish *Dictionary = English // en-US - BritishEnglish *Dictionary = English // en-GB - Spanish *Dictionary = &es // es - EuropeanSpanish *Dictionary = Spanish // es-ES - LatinAmericanSpanish *Dictionary = Spanish // es-419 - Estonian *Dictionary = &et // et - Persian *Dictionary = &fa // fa - Finnish *Dictionary = &fi // fi - Filipino *Dictionary = &fil // fil - French *Dictionary = &fr // fr - Gujarati *Dictionary = &gu // gu - Hebrew *Dictionary = &he // he - Hindi *Dictionary = &hi // hi - Croatian *Dictionary = &hr // hr - Hungarian *Dictionary = &hu // hu - Armenian *Dictionary = &hy // hy - Indonesian *Dictionary = &id // id - Icelandic *Dictionary = &is // is - Italian *Dictionary = &it // it - Japanese *Dictionary = &ja // ja - Georgian *Dictionary = &ka // ka - Kazakh *Dictionary = &kk // kk - Khmer *Dictionary = &km // km - Kannada *Dictionary = &kn // kn - Korean *Dictionary = &ko // ko - Kirghiz *Dictionary = &ky // ky - Lao *Dictionary = &lo // lo - Lithuanian *Dictionary = < // lt - Latvian *Dictionary = &lv // lv - Macedonian *Dictionary = &mk // mk - Malayalam *Dictionary = &ml // ml - Mongolian *Dictionary = &mn // mn - Marathi *Dictionary = &mr // mr - Malay *Dictionary = &ms // ms - Burmese *Dictionary = &my // my - Nepali *Dictionary = &ne // ne - Dutch *Dictionary = &nl // nl - Norwegian *Dictionary = &no // no - Punjabi *Dictionary = &pa // pa - Polish *Dictionary = &pl // pl - Portuguese *Dictionary = &pt // pt - BrazilianPortuguese *Dictionary = Portuguese // pt-BR - EuropeanPortuguese *Dictionary = &ptPT // pt-PT - Romanian *Dictionary = &ro // ro - Russian *Dictionary = &ru // ru - Sinhala *Dictionary = &si // si - Slovak *Dictionary = &sk // sk - Slovenian *Dictionary = &sl // sl - Albanian *Dictionary = &sq // sq - Serbian *Dictionary = &sr // sr - SerbianLatin *Dictionary = &srLatn // sr - Swedish *Dictionary = &sv // sv - Swahili *Dictionary = &sw // sw - Tamil *Dictionary = &ta // ta - Telugu *Dictionary = &te // te - Thai *Dictionary = &th // th - Turkish *Dictionary = &tr // tr - Ukrainian *Dictionary = &uk // uk - Urdu *Dictionary = &ur // ur - Uzbek *Dictionary = &uz // uz - Vietnamese *Dictionary = &vi // vi - Chinese *Dictionary = &zh // zh - SimplifiedChinese *Dictionary = Chinese // zh-Hans - TraditionalChinese *Dictionary = &zhHant // zh-Hant - Zulu *Dictionary = &zu // zu -) diff --git a/vendor/golang.org/x/text/language/display/dict_test.go b/vendor/golang.org/x/text/language/display/dict_test.go deleted file mode 100644 index f0b1f7831..000000000 --- a/vendor/golang.org/x/text/language/display/dict_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package display - -import ( - "fmt" - "testing" - - "golang.org/x/text/internal/testtext" -) - -func TestLinking(t *testing.T) { - base := getSize(t, `display.Tags(language.English).Name(language.English)`) - compact := getSize(t, `display.English.Languages().Name(language.English)`) - - if d := base - compact; d < 1.5*1024*1024 { - t.Errorf("size(base)-size(compact) was %d; want > 1.5MB", base, compact) - } -} - -func getSize(t *testing.T, main string) int { - size, err := testtext.CodeSize(fmt.Sprintf(body, main)) - if err != nil { - t.Skipf("skipping link size test; binary size could not be determined: %v", err) - } - return size -} - -const body = `package main -import ( - "golang.org/x/text/language" - "golang.org/x/text/language/display" -) -func main() { - %s -} -` diff --git a/vendor/golang.org/x/text/language/display/display.go b/vendor/golang.org/x/text/language/display/display.go deleted file mode 100644 index 738afa496..000000000 --- a/vendor/golang.org/x/text/language/display/display.go +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run maketables.go -output tables.go - -// Package display provides display names for languages, scripts and regions in -// a requested language. -// -// The data is based on CLDR's localeDisplayNames. It includes the names of the -// draft level "contributed" or "approved". The resulting tables are quite -// large. The display package is designed so that users can reduce the linked-in -// table sizes by cherry picking the languages one wishes to support. There is a -// Dictionary defined for a selected set of common languages for this purpose. -package display // import "golang.org/x/text/language/display" - -import ( - "strings" - - "golang.org/x/text/language" -) - -/* -TODO: -All fairly low priority at the moment: - - Include alternative and variants as an option (using func options). - - Option for returning the empty string for undefined values. - - Support variants, currencies, time zones, option names and other data - provided in CLDR. - - Do various optimizations: - - Reduce size of offset tables. - - Consider compressing infrequently used languages and decompress on demand. -*/ - -// A Namer is used to get the name for a given value, such as a Tag, Language, -// Script or Region. -type Namer interface { - // Name returns a display string for the given value. A Namer returns an - // empty string for values it does not support. A Namer may support naming - // an unspecified value. For example, when getting the name for a region for - // a tag that does not have a defined Region, it may return the name for an - // unknown region. It is up to the user to filter calls to Name for values - // for which one does not want to have a name string. - Name(x interface{}) string -} - -var ( - // Supported lists the languages for which names are defined. - Supported language.Coverage - - // The set of all possible values for which names are defined. Note that not - // all Namer implementations will cover all the values of a given type. - // A Namer will return the empty string for unsupported values. - Values language.Coverage - - matcher language.Matcher -) - -func init() { - tags := make([]language.Tag, numSupported) - s := supported - for i := range tags { - p := strings.IndexByte(s, '|') - tags[i] = language.Raw.Make(s[:p]) - s = s[p+1:] - } - matcher = language.NewMatcher(tags) - Supported = language.NewCoverage(tags) - - Values = language.NewCoverage(langTagSet.Tags, supportedScripts, supportedRegions) -} - -// Languages returns a Namer for naming languages. It returns nil if there is no -// data for the given tag. The type passed to Name must be either language.Base -// or language.Tag. Note that the result may differ between passing a tag or its -// base language. For example, for English, passing "nl-BE" would return Flemish -// whereas passing "nl" returns "Dutch". -func Languages(t language.Tag) Namer { - if _, index, conf := matcher.Match(t); conf != language.No { - return languageNamer(index) - } - return nil -} - -type languageNamer int - -func (n languageNamer) name(i int) string { - return lookup(langHeaders[:], int(n), i) -} - -// Name implements the Namer interface for language names. -func (n languageNamer) Name(x interface{}) string { - return nameLanguage(n, x) -} - -// nonEmptyIndex walks up the parent chain until a non-empty header is found. -// It returns -1 if no index could be found. -func nonEmptyIndex(h []header, index int) int { - for ; index != -1 && h[index].data == ""; index = int(parents[index]) { - } - return index -} - -// Scripts returns a Namer for naming scripts. It returns nil if there is no -// data for the given tag. The type passed to Name must be either a -// language.Script or a language.Tag. It will not attempt to infer a script for -// tags with an unspecified script. -func Scripts(t language.Tag) Namer { - if _, index, conf := matcher.Match(t); conf != language.No { - if index = nonEmptyIndex(scriptHeaders[:], index); index != -1 { - return scriptNamer(index) - } - } - return nil -} - -type scriptNamer int - -func (n scriptNamer) name(i int) string { - return lookup(scriptHeaders[:], int(n), i) -} - -// Name implements the Namer interface for script names. -func (n scriptNamer) Name(x interface{}) string { - return nameScript(n, x) -} - -// Regions returns a Namer for naming regions. It returns nil if there is no -// data for the given tag. The type passed to Name must be either a -// language.Region or a language.Tag. It will not attempt to infer a region for -// tags with an unspecified region. -func Regions(t language.Tag) Namer { - if _, index, conf := matcher.Match(t); conf != language.No { - if index = nonEmptyIndex(regionHeaders[:], index); index != -1 { - return regionNamer(index) - } - } - return nil -} - -type regionNamer int - -func (n regionNamer) name(i int) string { - return lookup(regionHeaders[:], int(n), i) -} - -// Name implements the Namer interface for region names. -func (n regionNamer) Name(x interface{}) string { - return nameRegion(n, x) -} - -// Tags returns a Namer for giving a full description of a tag. The names of -// scripts and regions that are not already implied by the language name will -// in appended within parentheses. It returns nil if there is not data for the -// given tag. The type passed to Name must be a tag. -func Tags(t language.Tag) Namer { - if _, index, conf := matcher.Match(t); conf != language.No { - return tagNamer(index) - } - return nil -} - -type tagNamer int - -// Name implements the Namer interface for tag names. -func (n tagNamer) Name(x interface{}) string { - return nameTag(languageNamer(n), scriptNamer(n), regionNamer(n), x) -} - -// lookup finds the name for an entry in a global table, traversing the -// inheritance hierarchy if needed. -func lookup(table []header, dict, want int) string { - for dict != -1 { - if s := table[dict].name(want); s != "" { - return s - } - dict = int(parents[dict]) - } - return "" -} - -// A Dictionary holds a collection of Namers for a single language. One can -// reduce the amount of data linked in to a binary by only referencing -// Dictionaries for the languages one needs to support instead of using the -// generic Namer factories. -type Dictionary struct { - parent *Dictionary - lang header - script header - region header -} - -// Tags returns a Namer for giving a full description of a tag. The names of -// scripts and regions that are not already implied by the language name will -// in appended within parentheses. It returns nil if there is not data for the -// given tag. The type passed to Name must be a tag. -func (d *Dictionary) Tags() Namer { - return dictTags{d} -} - -type dictTags struct { - d *Dictionary -} - -// Name implements the Namer interface for tag names. -func (n dictTags) Name(x interface{}) string { - return nameTag(dictLanguages{n.d}, dictScripts{n.d}, dictRegions{n.d}, x) -} - -// Languages returns a Namer for naming languages. It returns nil if there is no -// data for the given tag. The type passed to Name must be either language.Base -// or language.Tag. Note that the result may differ between passing a tag or its -// base language. For example, for English, passing "nl-BE" would return Flemish -// whereas passing "nl" returns "Dutch". -func (d *Dictionary) Languages() Namer { - return dictLanguages{d} -} - -type dictLanguages struct { - d *Dictionary -} - -func (n dictLanguages) name(i int) string { - for d := n.d; d != nil; d = d.parent { - if s := d.lang.name(i); s != "" { - return s - } - } - return "" -} - -// Name implements the Namer interface for language names. -func (n dictLanguages) Name(x interface{}) string { - return nameLanguage(n, x) -} - -// Scripts returns a Namer for naming scripts. It returns nil if there is no -// data for the given tag. The type passed to Name must be either a -// language.Script or a language.Tag. It will not attempt to infer a script for -// tags with an unspecified script. -func (d *Dictionary) Scripts() Namer { - return dictScripts{d} -} - -type dictScripts struct { - d *Dictionary -} - -func (n dictScripts) name(i int) string { - for d := n.d; d != nil; d = d.parent { - if s := d.script.name(i); s != "" { - return s - } - } - return "" -} - -// Name implements the Namer interface for script names. -func (n dictScripts) Name(x interface{}) string { - return nameScript(n, x) -} - -// Regions returns a Namer for naming regions. It returns nil if there is no -// data for the given tag. The type passed to Name must be either a -// language.Region or a language.Tag. It will not attempt to infer a region for -// tags with an unspecified region. -func (d *Dictionary) Regions() Namer { - return dictRegions{d} -} - -type dictRegions struct { - d *Dictionary -} - -func (n dictRegions) name(i int) string { - for d := n.d; d != nil; d = d.parent { - if s := d.region.name(i); s != "" { - return s - } - } - return "" -} - -// Name implements the Namer interface for region names. -func (n dictRegions) Name(x interface{}) string { - return nameRegion(n, x) -} - -// A SelfNamer implements a Namer that returns the name of language in this same -// language. It provides a very compact mechanism to provide a comprehensive -// list of languages to users in their native language. -type SelfNamer struct { - // Supported defines the values supported by this Namer. - Supported language.Coverage -} - -var ( - // Self is a shared instance of a SelfNamer. - Self *SelfNamer = &self - - self = SelfNamer{language.NewCoverage(selfTagSet.Tags)} -) - -// Name returns the name of a given language tag in the language identified by -// this tag. It supports both the language.Base and language.Tag types. -func (n SelfNamer) Name(x interface{}) string { - t, _ := language.All.Compose(x) - base, scr, reg := t.Raw() - baseScript := language.Script{} - if (scr == language.Script{} && reg != language.Region{}) { - // For looking up in the self dictionary, we need to select the - // maximized script. This is even the case if the script isn't - // specified. - s1, _ := t.Script() - if baseScript = getScript(base); baseScript != s1 { - scr = s1 - } - } - - i, scr, reg := selfTagSet.index(base, scr, reg) - if i == -1 { - return "" - } - - // Only return the display name if the script matches the expected script. - if (scr != language.Script{}) { - if (baseScript == language.Script{}) { - baseScript = getScript(base) - } - if baseScript != scr { - return "" - } - } - - return selfHeaders[0].name(i) -} - -// getScript returns the maximized script for a base language. -func getScript(b language.Base) language.Script { - tag, _ := language.Raw.Compose(b) - scr, _ := tag.Script() - return scr -} diff --git a/vendor/golang.org/x/text/language/display/display_test.go b/vendor/golang.org/x/text/language/display/display_test.go deleted file mode 100644 index 38aa87591..000000000 --- a/vendor/golang.org/x/text/language/display/display_test.go +++ /dev/null @@ -1,651 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package display - -import ( - "fmt" - "reflect" - "testing" - "unicode" - - "golang.org/x/text/internal/testtext" - "golang.org/x/text/language" -) - -// TODO: test that tables are properly dropped by the linker for various use -// cases. - -var ( - firstLang2aa = language.MustParseBase("aa") - lastLang2zu = language.MustParseBase("zu") - firstLang3ace = language.MustParseBase("ace") - lastLang3zza = language.MustParseBase("zza") - firstTagAr001 = language.MustParse("ar-001") - lastTagZhHant = language.MustParse("zh-Hant") -) - -// TestValues tests that for all languages, regions, and scripts in Values, at -// least one language has a name defined for it by checking it exists in -// English, which is assumed to be the most comprehensive. It is also tested -// that a Namer returns "" for unsupported values. -func TestValues(t *testing.T) { - type testcase struct { - kind string - n Namer - } - // checkDefined checks that a value exists in a Namer. - checkDefined := func(x interface{}, namers []testcase) { - for _, n := range namers { - testtext.Run(t, fmt.Sprintf("%s.Name(%s)", n.kind, x), func(t *testing.T) { - if n.n.Name(x) == "" { - // As of version 28 there is no data for az-Arab in English, - // although there is useful data in other languages. - if x.(fmt.Stringer).String() == "az-Arab" { - return - } - t.Errorf("supported but no result") - } - }) - } - } - // checkUnsupported checks that a value does not exist in a Namer. - checkUnsupported := func(x interface{}, namers []testcase) { - for _, n := range namers { - if got := n.n.Name(x); got != "" { - t.Fatalf("%s.Name(%s): unsupported tag gave non-empty result: %q", n.kind, x, got) - } - } - } - - tags := map[language.Tag]bool{} - namers := []testcase{ - {"Languages(en)", Languages(language.English)}, - {"Tags(en)", Tags(language.English)}, - {"English.Languages()", English.Languages()}, - {"English.Tags()", English.Tags()}, - } - for _, tag := range Values.Tags() { - checkDefined(tag, namers) - tags[tag] = true - } - for _, base := range language.Supported.BaseLanguages() { - tag, _ := language.All.Compose(base) - if !tags[tag] { - checkUnsupported(tag, namers) - } - } - - regions := map[language.Region]bool{} - namers = []testcase{ - {"Regions(en)", Regions(language.English)}, - {"English.Regions()", English.Regions()}, - } - for _, r := range Values.Regions() { - checkDefined(r, namers) - regions[r] = true - } - for _, r := range language.Supported.Regions() { - if r = r.Canonicalize(); !regions[r] { - checkUnsupported(r, namers) - } - } - - scripts := map[language.Script]bool{} - namers = []testcase{ - {"Scripts(en)", Scripts(language.English)}, - {"English.Scripts()", English.Scripts()}, - } - for _, s := range Values.Scripts() { - checkDefined(s, namers) - scripts[s] = true - } - for _, s := range language.Supported.Scripts() { - // Canonicalize the script. - tag, _ := language.DeprecatedScript.Compose(s) - if _, s, _ = tag.Raw(); !scripts[s] { - checkUnsupported(s, namers) - } - } -} - -// TestSupported tests that we have at least some Namers for languages that we -// claim to support. To test the claims in the documentation, it also verifies -// that if a Namer is returned, it will have at least some data. -func TestSupported(t *testing.T) { - supportedTags := Supported.Tags() - if len(supportedTags) != numSupported { - t.Errorf("number of supported was %d; want %d", len(supportedTags), numSupported) - } - - namerFuncs := []struct { - kind string - fn func(language.Tag) Namer - }{ - {"Tags", Tags}, - {"Languages", Languages}, - {"Regions", Regions}, - {"Scripts", Scripts}, - } - - // Verify that we have at least one Namer for all tags we claim to support. - tags := make(map[language.Tag]bool) - for _, tag := range supportedTags { - // Test we have at least one Namer for this supported Tag. - found := false - for _, kind := range namerFuncs { - if defined(t, kind.kind, kind.fn(tag), tag) { - found = true - } - } - if !found { - t.Errorf("%s: supported, but no data available", tag) - } - if tags[tag] { - t.Errorf("%s: included in Supported.Tags more than once", tag) - } - tags[tag] = true - } - - // Verify that we have no Namers for tags we don't claim to support. - for _, base := range language.Supported.BaseLanguages() { - tag, _ := language.All.Compose(base) - // Skip tags that are supported after matching. - if _, _, conf := matcher.Match(tag); conf != language.No { - continue - } - // Test there are no Namers for this tag. - for _, kind := range namerFuncs { - if defined(t, kind.kind, kind.fn(tag), tag) { - t.Errorf("%[1]s(%[2]s) returns a Namer, but %[2]s is not in the set of supported Tags.", kind.kind, tag) - } - } - } -} - -// defined reports whether n is a proper Namer, which means it is non-nil and -// must have at least one non-empty value. -func defined(t *testing.T, kind string, n Namer, tag language.Tag) bool { - if n == nil { - return false - } - switch kind { - case "Tags": - for _, t := range Values.Tags() { - if n.Name(t) != "" { - return true - } - } - case "Languages": - for _, t := range Values.BaseLanguages() { - if n.Name(t) != "" { - return true - } - } - case "Regions": - for _, t := range Values.Regions() { - if n.Name(t) != "" { - return true - } - } - case "Scripts": - for _, t := range Values.Scripts() { - if n.Name(t) != "" { - return true - } - } - } - t.Errorf("%s(%s) returns non-nil Namer without content", kind, tag) - return false -} - -func TestCoverage(t *testing.T) { - en := language.English - tests := []struct { - n Namer - x interface{} - }{ - {Languages(en), Values.Tags()}, - {Scripts(en), Values.Scripts()}, - {Regions(en), Values.Regions()}, - } - for i, tt := range tests { - uniq := make(map[string]interface{}) - - v := reflect.ValueOf(tt.x) - for j := 0; j < v.Len(); j++ { - x := v.Index(j).Interface() - // As of version 28 there is no data for az-Arab in English, - // although there is useful data in other languages. - if x.(fmt.Stringer).String() == "az-Arab" { - continue - } - s := tt.n.Name(x) - if s == "" { - t.Errorf("%d:%d:%s: missing content", i, j, x) - } else if uniq[s] != nil { - t.Errorf("%d:%d:%s: identical return value %q for %v and %v", i, j, x, s, x, uniq[s]) - } - uniq[s] = x - } - } -} - -// TestUpdate tests whether dictionary entries for certain languages need to be -// updated. For some languages, some of the headers may be empty or they may be -// identical to the parent. This code detects if such entries need to be updated -// after a table update. -func TestUpdate(t *testing.T) { - tests := []struct { - d *Dictionary - tag string - }{ - {ModernStandardArabic, "ar-001"}, - {AmericanEnglish, "en-US"}, - {EuropeanSpanish, "es-ES"}, - {BrazilianPortuguese, "pt-BR"}, - {SimplifiedChinese, "zh-Hans"}, - } - - for _, tt := range tests { - _, i, _ := matcher.Match(language.MustParse(tt.tag)) - if !reflect.DeepEqual(tt.d.lang, langHeaders[i]) { - t.Errorf("%s: lang table update needed", tt.tag) - } - if !reflect.DeepEqual(tt.d.script, scriptHeaders[i]) { - t.Errorf("%s: script table update needed", tt.tag) - } - if !reflect.DeepEqual(tt.d.region, regionHeaders[i]) { - t.Errorf("%s: region table update needed", tt.tag) - } - } -} - -func TestIndex(t *testing.T) { - notIn := []string{"aa", "xx", "zz", "aaa", "xxx", "zzz", "Aaaa", "Xxxx", "Zzzz"} - tests := []tagIndex{ - { - "", - "", - "", - }, - { - "bb", - "", - "", - }, - { - "", - "bbb", - "", - }, - { - "", - "", - "Bbbb", - }, - { - "bb", - "bbb", - "Bbbb", - }, - { - "bbccddyy", - "bbbcccdddyyy", - "BbbbCcccDdddYyyy", - }, - } - for i, tt := range tests { - // Create the test set from the tagIndex. - cnt := 0 - for sz := 2; sz <= 4; sz++ { - a := tt[sz-2] - for j := 0; j < len(a); j += sz { - s := a[j : j+sz] - if idx := tt.index(s); idx != cnt { - t.Errorf("%d:%s: index was %d; want %d", i, s, idx, cnt) - } - cnt++ - } - } - if n := tt.len(); n != cnt { - t.Errorf("%d: len was %d; want %d", i, n, cnt) - } - for _, x := range notIn { - if idx := tt.index(x); idx != -1 { - t.Errorf("%d:%s: index was %d; want -1", i, x, idx) - } - } - } -} - -func TestTag(t *testing.T) { - tests := []struct { - dict string - tag string - name string - }{ - {"agq", "sr", ""}, // sr is in Value.Languages(), but is not supported by agq. - {"nl", "nl", "Nederlands"}, - // CLDR 30 dropped Vlaams as the word for nl-BE. It is still called - // Flemish in English, though. TODO: check if this is a CLDR bug. - // {"nl", "nl-BE", "Vlaams"}, - {"nl", "nl-BE", "Nederlands (België)"}, - {"nl", "vls", "West-Vlaams"}, - {"en", "nl-BE", "Flemish"}, - {"en", "en", "English"}, - {"en", "en-GB", "British English"}, - {"en", "en-US", "American English"}, // American English in CLDR 24+ - {"ru", "ru", "русский"}, - {"ru", "ru-RU", "русский (Россия)"}, - {"ru", "ru-Cyrl", "русский (кириллица)"}, - {"en", lastLang2zu.String(), "Zulu"}, - {"en", firstLang2aa.String(), "Afar"}, - {"en", lastLang3zza.String(), "Zaza"}, - {"en", firstLang3ace.String(), "Achinese"}, - {"en", firstTagAr001.String(), "Modern Standard Arabic"}, - {"en", lastTagZhHant.String(), "Traditional Chinese"}, - {"en", "aaa", ""}, - {"en", "zzj", ""}, - // If full tag doesn't match, try without script or region. - {"en", "aa-Hans", "Afar (Simplified Han)"}, - {"en", "af-Arab", "Afrikaans (Arabic)"}, - {"en", "zu-Cyrl", "Zulu (Cyrillic)"}, - {"en", "aa-GB", "Afar (United Kingdom)"}, - {"en", "af-NA", "Afrikaans (Namibia)"}, - {"en", "zu-BR", "Zulu (Brazil)"}, - // Correct inheritance and language selection. - {"zh", "zh-TW", "中文 (台湾)"}, - {"zh", "zh-Hant-TW", "繁体中文 (台湾)"}, - {"zh-Hant", "zh-TW", "中文 (台灣)"}, - {"zh-Hant", "zh-Hant-TW", "繁體中文 (台灣)"}, - // Some rather arbitrary interpretations for Serbian. This is arguably - // correct and consistent with the way zh-[Hant-]TW is handled. It will - // also give results more in line with the expectations if users - // explicitly use "sh". - {"sr-Latn", "sr-ME", "srpski (Crna Gora)"}, - {"sr-Latn", "sr-Latn-ME", "srpskohrvatski (Crna Gora)"}, - // Double script and region - {"nl", "en-Cyrl-BE", "Engels (Cyrillisch, België)"}, - // Canonical equivalents. - {"ro", "ro-MD", "moldovenească"}, - {"ro", "mo", "moldovenească"}, - } - for i, tt := range tests { - d := Tags(language.MustParse(tt.dict)) - if n := d.Name(language.Raw.MustParse(tt.tag)); n != tt.name { - // There are inconsistencies w.r.t. capitalization in the tests - // due to CLDR's update procedure which treats modern and other - // languages differently. - // See http://unicode.org/cldr/trac/ticket/8051. - // TODO: use language capitalization to sanitize the strings. - t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.tag, n, tt.name) - } - } -} - -func TestLanguage(t *testing.T) { - tests := []struct { - dict string - tag string - name string - }{ - {"agq", "sr", ""}, // sr is in Value.Languages(), but is not supported by agq. - // CLDR 30 dropped Vlaams as the word for nl-BE. It is still called - // Flemish in English, though. TODO: this is probably incorrect. - // West-Vlaams (vls) is not Vlaams. West-Vlaams could be considered its - // own language, whereas Vlaams is generally Dutch. So expect to have - // to change these tests back. - {"nl", "nl", "Nederlands"}, - {"nl", "vls", "West-Vlaams"}, - {"nl", "nl-BE", "Nederlands"}, - {"en", "pt", "Portuguese"}, - {"en", "pt-PT", "European Portuguese"}, - {"en", "pt-BR", "Brazilian Portuguese"}, - {"en", "en", "English"}, - {"en", "en-GB", "British English"}, - {"en", "en-US", "American English"}, // American English in CLDR 24+ - {"en", lastLang2zu.String(), "Zulu"}, - {"en", firstLang2aa.String(), "Afar"}, - {"en", lastLang3zza.String(), "Zaza"}, - {"en", firstLang3ace.String(), "Achinese"}, - {"en", firstTagAr001.String(), "Modern Standard Arabic"}, - {"en", lastTagZhHant.String(), "Traditional Chinese"}, - {"en", "aaa", ""}, - {"en", "zzj", ""}, - // If full tag doesn't match, try without script or region. - {"en", "aa-Hans", "Afar"}, - {"en", "af-Arab", "Afrikaans"}, - {"en", "zu-Cyrl", "Zulu"}, - {"en", "aa-GB", "Afar"}, - {"en", "af-NA", "Afrikaans"}, - {"en", "zu-BR", "Zulu"}, - {"agq", "zh-Hant", ""}, - // Canonical equivalents. - {"ro", "ro-MD", "moldovenească"}, - {"ro", "mo", "moldovenească"}, - {"en", "sh", "Serbo-Croatian"}, - {"en", "sr-Latn", "Serbo-Croatian"}, - {"en", "sr", "Serbian"}, - {"en", "sr-ME", "Serbian"}, - {"en", "sr-Latn-ME", "Serbo-Croatian"}, // See comments in TestTag. - } - for i, tt := range tests { - testtext.Run(t, tt.dict+"/"+tt.tag, func(t *testing.T) { - d := Languages(language.Raw.MustParse(tt.dict)) - if n := d.Name(language.Raw.MustParse(tt.tag)); n != tt.name { - t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.tag, n, tt.name) - } - if len(tt.tag) <= 3 { - if n := d.Name(language.MustParseBase(tt.tag)); n != tt.name { - t.Errorf("%d:%s:base(%s): was %q; want %q", i, tt.dict, tt.tag, n, tt.name) - } - } - }) - } -} - -func TestScript(t *testing.T) { - tests := []struct { - dict string - scr string - name string - }{ - {"nl", "Arab", "Arabisch"}, - {"en", "Arab", "Arabic"}, - {"en", "Zzzz", "Unknown Script"}, - {"zh-Hant", "Hang", "韓文字"}, - {"zh-Hant-HK", "Hang", "韓文字"}, - {"zh", "Arab", "阿拉伯文"}, - {"zh-Hans-HK", "Arab", "阿拉伯文"}, // same as zh - {"zh-Hant", "Arab", "阿拉伯文"}, - {"zh-Hant-HK", "Arab", "阿拉伯文"}, // same as zh - // Canonicalized form - {"en", "Qaai", "Inherited"}, // deprecated script, now is Zinh - {"en", "sh", "Unknown Script"}, // sh canonicalizes to sr-Latn - {"en", "en", "Unknown Script"}, - // Don't introduce scripts with canonicalization. - {"en", "sh", "Unknown Script"}, // sh canonicalizes to sr-Latn - } - for i, tt := range tests { - d := Scripts(language.MustParse(tt.dict)) - var x interface{} - if unicode.IsUpper(rune(tt.scr[0])) { - x = language.MustParseScript(tt.scr) - tag, _ := language.Raw.Compose(x) - if n := d.Name(tag); n != tt.name { - t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.scr, n, tt.name) - } - } else { - x = language.Raw.MustParse(tt.scr) - } - if n := d.Name(x); n != tt.name { - t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.scr, n, tt.name) - } - } -} - -func TestRegion(t *testing.T) { - tests := []struct { - dict string - reg string - name string - }{ - {"nl", "NL", "Nederland"}, - {"en", "US", "United States"}, - {"en", "ZZ", "Unknown Region"}, - {"en", "UM", "U.S. Outlying Islands"}, - {"en-GB", "UM", "U.S. Outlying Islands"}, - {"en-GB", "NL", "Netherlands"}, - // Canonical equivalents - {"en", "UK", "United Kingdom"}, - // No region - {"en", "pt", "Unknown Region"}, - {"en", "und", "Unknown Region"}, - // Don't introduce regions with canonicalization. - {"en", "mo", "Unknown Region"}, - } - for i, tt := range tests { - d := Regions(language.MustParse(tt.dict)) - var x interface{} - if unicode.IsUpper(rune(tt.reg[0])) { - // Region - x = language.MustParseRegion(tt.reg) - tag, _ := language.Raw.Compose(x) - if n := d.Name(tag); n != tt.name { - t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.reg, n, tt.name) - } - } else { - // Tag - x = language.Raw.MustParse(tt.reg) - } - if n := d.Name(x); n != tt.name { - t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.reg, n, tt.name) - } - } -} - -func TestSelf(t *testing.T) { - tests := []struct { - tag string - name string - }{ - {"nl", "Nederlands"}, - // CLDR 30 dropped Vlaams as the word for nl-BE. It is still called - // Flemish in English, though. TODO: check if this is a CLDR bug. - // {"nl-BE", "Vlaams"}, - {"nl-BE", "Nederlands"}, - {"en-GB", "British English"}, - {lastLang2zu.String(), "isiZulu"}, - {firstLang2aa.String(), ""}, // not defined - {lastLang3zza.String(), ""}, // not defined - {firstLang3ace.String(), ""}, // not defined - {firstTagAr001.String(), "العربية الرسمية الحديثة"}, - {"ar", "العربية"}, - {lastTagZhHant.String(), "繁體中文"}, - {"aaa", ""}, - {"zzj", ""}, - // Drop entries that are not in the requested script, even if there is - // an entry for the language. - {"aa-Hans", ""}, - {"af-Arab", ""}, - {"zu-Cyrl", ""}, - // Append the country name in the language of the matching language. - {"af-NA", "Afrikaans"}, - {"zh", "中文"}, - // zh-TW should match zh-Hant instead of zh! - {"zh-TW", "繁體中文"}, - {"zh-Hant", "繁體中文"}, - {"zh-Hans", "简体中文"}, - {"zh-Hant-TW", "繁體中文"}, - {"zh-Hans-TW", "简体中文"}, - // Take the entry for sr which has the matching script. - // TODO: Capitalization changed as of CLDR 26, but change seems - // arbitrary. Revisit capitalization with revision 27. See - // http://unicode.org/cldr/trac/ticket/8051. - {"sr", "српски"}, - // TODO: sr-ME should show up as Serbian or Montenegrin, not Serbo- - // Croatian. This is an artifact of the current algorithm, which is the - // way it is to have the preferred behavior for other languages such as - // Chinese. We can hardwire this case in the table generator or package - // code, but we first check if CLDR can be updated. - // {"sr-ME", "Srpski"}, // Is Srpskohrvatski - {"sr-Latn-ME", "srpskohrvatski"}, - {"sr-Cyrl-ME", "српски"}, - {"sr-NL", "српски"}, - // Canonical equivalents. - {"ro-MD", "moldovenească"}, - {"mo", "moldovenească"}, - // NOTE: kk is defined, but in Cyrillic script. For China, Arab is the - // dominant script. We do not have data for kk-Arab and we chose to not - // fall back in such cases. - {"kk-CN", ""}, - } - for i, tt := range tests { - d := Self - if n := d.Name(language.Raw.MustParse(tt.tag)); n != tt.name { - t.Errorf("%d:%s: was %q; want %q", i, tt.tag, n, tt.name) - } - } -} - -func TestDictionaryLang(t *testing.T) { - tests := []struct { - d *Dictionary - tag string - name string - }{ - {English, "en", "English"}, - {Portuguese, "af", "africâner"}, - {EuropeanPortuguese, "af", "africanês"}, - {English, "nl-BE", "Flemish"}, - } - for i, test := range tests { - tag := language.MustParse(test.tag) - if got := test.d.Tags().Name(tag); got != test.name { - t.Errorf("%d:%v: got %s; want %s", i, tag, got, test.name) - } - if base, _ := language.Compose(tag.Base()); base == tag { - if got := test.d.Languages().Name(base); got != test.name { - t.Errorf("%d:%v: got %s; want %s", i, tag, got, test.name) - } - } - } -} - -func TestDictionaryRegion(t *testing.T) { - tests := []struct { - d *Dictionary - region string - name string - }{ - {English, "FR", "France"}, - {Portuguese, "009", "Oceania"}, - {EuropeanPortuguese, "009", "Oceânia"}, - } - for i, test := range tests { - tag := language.MustParseRegion(test.region) - if got := test.d.Regions().Name(tag); got != test.name { - t.Errorf("%d:%v: got %s; want %s", i, tag, got, test.name) - } - } -} - -func TestDictionaryScript(t *testing.T) { - tests := []struct { - d *Dictionary - script string - name string - }{ - {English, "Cyrl", "Cyrillic"}, - {Portuguese, "Gujr", "gujerati"}, - {EuropeanPortuguese, "Gujr", "guzerate"}, - } - for i, test := range tests { - tag := language.MustParseScript(test.script) - if got := test.d.Scripts().Name(tag); got != test.name { - t.Errorf("%d:%v: got %s; want %s", i, tag, got, test.name) - } - } -} diff --git a/vendor/golang.org/x/text/language/display/examples_test.go b/vendor/golang.org/x/text/language/display/examples_test.go deleted file mode 100644 index f392f2109..000000000 --- a/vendor/golang.org/x/text/language/display/examples_test.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package display_test - -import ( - "fmt" - - "golang.org/x/text/language" - "golang.org/x/text/language/display" -) - -func ExampleNamer() { - supported := []string{ - "en-US", "en-GB", "ja", "zh", "zh-Hans", "zh-Hant", "pt", "pt-PT", "ko", "ar", "el", "ru", "uk", "pa", - } - - en := display.English.Languages() - - for _, s := range supported { - t := language.MustParse(s) - fmt.Printf("%-20s (%s)\n", en.Name(t), display.Self.Name(t)) - } - - // Output: - // American English (American English) - // British English (British English) - // Japanese (日本語) - // Chinese (中文) - // Simplified Chinese (简体中文) - // Traditional Chinese (繁體中文) - // Portuguese (português) - // European Portuguese (português europeu) - // Korean (한국어) - // Arabic (العربية) - // Greek (Ελληνικά) - // Russian (русский) - // Ukrainian (українська) - // Punjabi (ਪੰਜਾਬੀ) -} - -func ExampleTags() { - n := display.Tags(language.English) - fmt.Println(n.Name(language.Make("nl"))) - fmt.Println(n.Name(language.Make("nl-BE"))) - fmt.Println(n.Name(language.Make("nl-CW"))) - fmt.Println(n.Name(language.Make("nl-Arab"))) - fmt.Println(n.Name(language.Make("nl-Cyrl-RU"))) - - // Output: - // Dutch - // Flemish - // Dutch (Curaçao) - // Dutch (Arabic) - // Dutch (Cyrillic, Russia) -} - -// ExampleDictionary shows how to reduce the amount of data linked into your -// binary by only using the predefined Dictionary variables of the languages you -// wish to support. -func ExampleDictionary() { - tags := []language.Tag{ - language.English, - language.German, - language.Japanese, - language.Russian, - } - dicts := []*display.Dictionary{ - display.English, - display.German, - display.Japanese, - display.Russian, - } - - m := language.NewMatcher(tags) - - getDict := func(t language.Tag) *display.Dictionary { - _, i, confidence := m.Match(t) - // Skip this check if you want to support a fall-back language, which - // will be the first one passed to NewMatcher. - if confidence == language.No { - return nil - } - return dicts[i] - } - - // The matcher will match Swiss German to German. - n := getDict(language.Make("gsw")).Languages() - fmt.Println(n.Name(language.German)) - fmt.Println(n.Name(language.Make("de-CH"))) - fmt.Println(n.Name(language.Make("gsw"))) - - // Output: - // Deutsch - // Schweizer Hochdeutsch - // Schweizerdeutsch -} diff --git a/vendor/golang.org/x/text/language/display/lookup.go b/vendor/golang.org/x/text/language/display/lookup.go deleted file mode 100644 index e6dc0e016..000000000 --- a/vendor/golang.org/x/text/language/display/lookup.go +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package display - -// This file contains common lookup code that is shared between the various -// implementations of Namer and Dictionaries. - -import ( - "fmt" - "sort" - "strings" - - "golang.org/x/text/language" -) - -type namer interface { - // name gets the string for the given index. It should walk the - // inheritance chain if a value is not present in the base index. - name(idx int) string -} - -func nameLanguage(n namer, x interface{}) string { - t, _ := language.All.Compose(x) - for { - i, _, _ := langTagSet.index(t.Raw()) - if s := n.name(i); s != "" { - return s - } - if t = t.Parent(); t == language.Und { - return "" - } - } -} - -func nameScript(n namer, x interface{}) string { - t, _ := language.DeprecatedScript.Compose(x) - _, s, _ := t.Raw() - return n.name(scriptIndex.index(s.String())) -} - -func nameRegion(n namer, x interface{}) string { - t, _ := language.DeprecatedRegion.Compose(x) - _, _, r := t.Raw() - return n.name(regionIndex.index(r.String())) -} - -func nameTag(langN, scrN, regN namer, x interface{}) string { - t, ok := x.(language.Tag) - if !ok { - return "" - } - const form = language.All &^ language.SuppressScript - if c, err := form.Canonicalize(t); err == nil { - t = c - } - _, sRaw, rRaw := t.Raw() - i, scr, reg := langTagSet.index(t.Raw()) - for i != -1 { - if str := langN.name(i); str != "" { - if hasS, hasR := (scr != language.Script{}), (reg != language.Region{}); hasS || hasR { - ss, sr := "", "" - if hasS { - ss = scrN.name(scriptIndex.index(scr.String())) - } - if hasR { - sr = regN.name(regionIndex.index(reg.String())) - } - // TODO: use patterns in CLDR or at least confirm they are the - // same for all languages. - if ss != "" && sr != "" { - return fmt.Sprintf("%s (%s, %s)", str, ss, sr) - } - if ss != "" || sr != "" { - return fmt.Sprintf("%s (%s%s)", str, ss, sr) - } - } - return str - } - scr, reg = sRaw, rRaw - if t = t.Parent(); t == language.Und { - return "" - } - i, _, _ = langTagSet.index(t.Raw()) - } - return "" -} - -// header contains the data and indexes for a single namer. -// data contains a series of strings concatenated into one. index contains the -// offsets for a string in data. For example, consider a header that defines -// strings for the languages de, el, en, fi, and nl: -// -// header{ -// data: "GermanGreekEnglishDutch", -// index: []uint16{ 0, 6, 11, 18, 18, 23 }, -// } -// -// For a language with index i, the string is defined by -// data[index[i]:index[i+1]]. So the number of elements in index is always one -// greater than the number of languages for which header defines a value. -// A string for a language may be empty, which means the name is undefined. In -// the above example, the name for fi (Finnish) is undefined. -type header struct { - data string - index []uint16 -} - -// name looks up the name for a tag in the dictionary, given its index. -func (h *header) name(i int) string { - if 0 <= i && i < len(h.index)-1 { - return h.data[h.index[i]:h.index[i+1]] - } - return "" -} - -// tagSet is used to find the index of a language in a set of tags. -type tagSet struct { - single tagIndex - long []string -} - -var ( - langTagSet = tagSet{ - single: langIndex, - long: langTagsLong, - } - - // selfTagSet is used for indexing the language strings in their own - // language. - selfTagSet = tagSet{ - single: selfIndex, - long: selfTagsLong, - } - - zzzz = language.MustParseScript("Zzzz") - zz = language.MustParseRegion("ZZ") -) - -// index returns the index of the tag for the given base, script and region or -// its parent if the tag is not available. If the match is for a parent entry, -// the excess script and region are returned. -func (ts *tagSet) index(base language.Base, scr language.Script, reg language.Region) (int, language.Script, language.Region) { - lang := base.String() - index := -1 - if (scr != language.Script{} || reg != language.Region{}) { - if scr == zzzz { - scr = language.Script{} - } - if reg == zz { - reg = language.Region{} - } - - i := sort.SearchStrings(ts.long, lang) - // All entries have either a script or a region and not both. - scrStr, regStr := scr.String(), reg.String() - for ; i < len(ts.long) && strings.HasPrefix(ts.long[i], lang); i++ { - if s := ts.long[i][len(lang)+1:]; s == scrStr { - scr = language.Script{} - index = i + ts.single.len() - break - } else if s == regStr { - reg = language.Region{} - index = i + ts.single.len() - break - } - } - } - if index == -1 { - index = ts.single.index(lang) - } - return index, scr, reg -} - -func (ts *tagSet) Tags() []language.Tag { - tags := make([]language.Tag, 0, ts.single.len()+len(ts.long)) - ts.single.keys(func(s string) { - tags = append(tags, language.Raw.MustParse(s)) - }) - for _, s := range ts.long { - tags = append(tags, language.Raw.MustParse(s)) - } - return tags -} - -func supportedScripts() []language.Script { - scr := make([]language.Script, 0, scriptIndex.len()) - scriptIndex.keys(func(s string) { - scr = append(scr, language.MustParseScript(s)) - }) - return scr -} - -func supportedRegions() []language.Region { - reg := make([]language.Region, 0, regionIndex.len()) - regionIndex.keys(func(s string) { - reg = append(reg, language.MustParseRegion(s)) - }) - return reg -} - -// tagIndex holds a concatenated lists of subtags of length 2 to 4, one string -// for each length, which can be used in combination with binary search to get -// the index associated with a tag. -// For example, a tagIndex{ -// "arenesfrruzh", // 6 2-byte tags. -// "barwae", // 2 3-byte tags. -// "", -// } -// would mean that the 2-byte tag "fr" had an index of 3, and the 3-byte tag -// "wae" had an index of 7. -type tagIndex [3]string - -func (t *tagIndex) index(s string) int { - sz := len(s) - if sz < 2 || 4 < sz { - return -1 - } - a := t[sz-2] - index := sort.Search(len(a)/sz, func(i int) bool { - p := i * sz - return a[p:p+sz] >= s - }) - p := index * sz - if end := p + sz; end > len(a) || a[p:end] != s { - return -1 - } - // Add the number of tags for smaller sizes. - for i := 0; i < sz-2; i++ { - index += len(t[i]) / (i + 2) - } - return index -} - -// len returns the number of tags that are contained in the tagIndex. -func (t *tagIndex) len() (n int) { - for i, s := range t { - n += len(s) / (i + 2) - } - return n -} - -// keys calls f for each tag. -func (t *tagIndex) keys(f func(key string)) { - for i, s := range *t { - for ; s != ""; s = s[i+2:] { - f(s[:i+2]) - } - } -} diff --git a/vendor/golang.org/x/text/language/display/maketables.go b/vendor/golang.org/x/text/language/display/maketables.go deleted file mode 100644 index 3fcd9c87d..000000000 --- a/vendor/golang.org/x/text/language/display/maketables.go +++ /dev/null @@ -1,596 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// Generator for display name tables. - -package main - -import ( - "bytes" - "flag" - "fmt" - "log" - "reflect" - "sort" - "strings" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/language" - "golang.org/x/text/unicode/cldr" -) - -var ( - test = flag.Bool("test", false, - "test existing tables; can be used to compare web data with package data.") - outputFile = flag.String("output", "tables.go", "output file") - - stats = flag.Bool("stats", false, "prints statistics to stderr") - - short = flag.Bool("short", false, `Use "short" alternatives, when available.`) - draft = flag.String("draft", - "contributed", - `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) - pkg = flag.String("package", - "display", - "the name of the package in which the generated file is to be included") - - tags = newTagSet("tags", - []language.Tag{}, - "space-separated list of tags to include or empty for all") - dict = newTagSet("dict", - dictTags(), - "space-separated list or tags for which to include a Dictionary. "+ - `"" means the common list from go.text/language.`) -) - -func dictTags() (tag []language.Tag) { - // TODO: replace with language.Common.Tags() once supported. - const str = "af am ar ar-001 az bg bn ca cs da de el en en-US en-GB " + - "es es-ES es-419 et fa fi fil fr fr-CA gu he hi hr hu hy id is it ja " + - "ka kk km kn ko ky lo lt lv mk ml mn mr ms my ne nl no pa pl pt pt-BR " + - "pt-PT ro ru si sk sl sq sr sr-Latn sv sw ta te th tr uk ur uz vi " + - "zh zh-Hans zh-Hant zu" - - for _, s := range strings.Split(str, " ") { - tag = append(tag, language.MustParse(s)) - } - return tag -} - -func main() { - gen.Init() - - // Read the CLDR zip file. - r := gen.OpenCLDRCoreZip() - defer r.Close() - - d := &cldr.Decoder{} - d.SetDirFilter("main", "supplemental") - d.SetSectionFilter("localeDisplayNames") - data, err := d.DecodeZip(r) - if err != nil { - log.Fatalf("DecodeZip: %v", err) - } - - w := gen.NewCodeWriter() - defer w.WriteGoFile(*outputFile, "display") - - gen.WriteCLDRVersion(w) - - b := builder{ - w: w, - data: data, - group: make(map[string]*group), - } - b.generate() -} - -const tagForm = language.All - -// tagSet is used to parse command line flags of tags. It implements the -// flag.Value interface. -type tagSet map[language.Tag]bool - -func newTagSet(name string, tags []language.Tag, usage string) tagSet { - f := tagSet(make(map[language.Tag]bool)) - for _, t := range tags { - f[t] = true - } - flag.Var(f, name, usage) - return f -} - -// String implements the String method of the flag.Value interface. -func (f tagSet) String() string { - tags := []string{} - for t := range f { - tags = append(tags, t.String()) - } - sort.Strings(tags) - return strings.Join(tags, " ") -} - -// Set implements Set from the flag.Value interface. -func (f tagSet) Set(s string) error { - if s != "" { - for _, s := range strings.Split(s, " ") { - if s != "" { - tag, err := tagForm.Parse(s) - if err != nil { - return err - } - f[tag] = true - } - } - } - return nil -} - -func (f tagSet) contains(t language.Tag) bool { - if len(f) == 0 { - return true - } - return f[t] -} - -// builder is used to create all tables with display name information. -type builder struct { - w *gen.CodeWriter - - data *cldr.CLDR - - fromLocs []string - - // destination tags for the current locale. - toTags []string - toTagIndex map[string]int - - // list of supported tags - supported []language.Tag - - // key-value pairs per group - group map[string]*group - - // statistics - sizeIndex int // total size of all indexes of headers - sizeData int // total size of all data of headers - totalSize int -} - -type group struct { - // Maps from a given language to the Namer data for this language. - lang map[language.Tag]keyValues - headers []header - - toTags []string - threeStart int - fourPlusStart int -} - -// set sets the typ to the name for locale loc. -func (g *group) set(t language.Tag, typ, name string) { - kv := g.lang[t] - if kv == nil { - kv = make(keyValues) - g.lang[t] = kv - } - if kv[typ] == "" { - kv[typ] = name - } -} - -type keyValues map[string]string - -type header struct { - tag language.Tag - data string - index []uint16 -} - -var versionInfo = `// Version is deprecated. Use CLDRVersion. -const Version = %#v - -` - -var self = language.MustParse("mul") - -// generate builds and writes all tables. -func (b *builder) generate() { - fmt.Fprintf(b.w, versionInfo, cldr.Version) - - b.filter() - b.setData("lang", func(g *group, loc language.Tag, ldn *cldr.LocaleDisplayNames) { - if ldn.Languages != nil { - for _, v := range ldn.Languages.Language { - tag := tagForm.MustParse(v.Type) - if tags.contains(tag) { - g.set(loc, tag.String(), v.Data()) - } - } - } - }) - b.setData("script", func(g *group, loc language.Tag, ldn *cldr.LocaleDisplayNames) { - if ldn.Scripts != nil { - for _, v := range ldn.Scripts.Script { - code := language.MustParseScript(v.Type) - if code.IsPrivateUse() { // Qaaa..Qabx - // TODO: data currently appears to be very meager. - // Reconsider if we have data for English. - if loc == language.English { - log.Fatal("Consider including data for private use scripts.") - } - continue - } - g.set(loc, code.String(), v.Data()) - } - } - }) - b.setData("region", func(g *group, loc language.Tag, ldn *cldr.LocaleDisplayNames) { - if ldn.Territories != nil { - for _, v := range ldn.Territories.Territory { - g.set(loc, language.MustParseRegion(v.Type).String(), v.Data()) - } - } - }) - - b.makeSupported() - - b.writeParents() - - b.writeGroup("lang") - b.writeGroup("script") - b.writeGroup("region") - - b.w.WriteConst("numSupported", len(b.supported)) - buf := bytes.Buffer{} - for _, tag := range b.supported { - fmt.Fprint(&buf, tag.String(), "|") - } - b.w.WriteConst("supported", buf.String()) - - b.writeDictionaries() - - b.supported = []language.Tag{self} - - // Compute the names of locales in their own language. Some of these names - // may be specified in their parent locales. We iterate the maximum depth - // of the parent three times to match successive parents of tags until a - // possible match is found. - for i := 0; i < 4; i++ { - b.setData("self", func(g *group, tag language.Tag, ldn *cldr.LocaleDisplayNames) { - parent := tag - if b, s, r := tag.Raw(); i > 0 && (s != language.Script{} && r == language.Region{}) { - parent, _ = language.Raw.Compose(b) - } - if ldn.Languages != nil { - for _, v := range ldn.Languages.Language { - key := tagForm.MustParse(v.Type) - saved := key - if key == parent { - g.set(self, tag.String(), v.Data()) - } - for k := 0; k < i; k++ { - key = key.Parent() - } - if key == tag { - g.set(self, saved.String(), v.Data()) // set does not overwrite a value. - } - } - } - }) - } - - b.writeGroup("self") -} - -func (b *builder) setData(name string, f func(*group, language.Tag, *cldr.LocaleDisplayNames)) { - b.sizeIndex = 0 - b.sizeData = 0 - b.toTags = nil - b.fromLocs = nil - b.toTagIndex = make(map[string]int) - - g := b.group[name] - if g == nil { - g = &group{lang: make(map[language.Tag]keyValues)} - b.group[name] = g - } - for _, loc := range b.data.Locales() { - // We use RawLDML instead of LDML as we are managing our own inheritance - // in this implementation. - ldml := b.data.RawLDML(loc) - - // We do not support the POSIX variant (it is not a supported BCP 47 - // variant). This locale also doesn't happen to contain any data, so - // we'll skip it by checking for this. - tag, err := tagForm.Parse(loc) - if err != nil { - if ldml.LocaleDisplayNames != nil { - log.Fatalf("setData: %v", err) - } - continue - } - if ldml.LocaleDisplayNames != nil && tags.contains(tag) { - f(g, tag, ldml.LocaleDisplayNames) - } - } -} - -func (b *builder) filter() { - filter := func(s *cldr.Slice) { - if *short { - s.SelectOnePerGroup("alt", []string{"short", ""}) - } else { - s.SelectOnePerGroup("alt", []string{"stand-alone", ""}) - } - d, err := cldr.ParseDraft(*draft) - if err != nil { - log.Fatalf("filter: %v", err) - } - s.SelectDraft(d) - } - for _, loc := range b.data.Locales() { - if ldn := b.data.RawLDML(loc).LocaleDisplayNames; ldn != nil { - if ldn.Languages != nil { - s := cldr.MakeSlice(&ldn.Languages.Language) - if filter(&s); len(ldn.Languages.Language) == 0 { - ldn.Languages = nil - } - } - if ldn.Scripts != nil { - s := cldr.MakeSlice(&ldn.Scripts.Script) - if filter(&s); len(ldn.Scripts.Script) == 0 { - ldn.Scripts = nil - } - } - if ldn.Territories != nil { - s := cldr.MakeSlice(&ldn.Territories.Territory) - if filter(&s); len(ldn.Territories.Territory) == 0 { - ldn.Territories = nil - } - } - } - } -} - -// makeSupported creates a list of all supported locales. -func (b *builder) makeSupported() { - // tags across groups - for _, g := range b.group { - for t, _ := range g.lang { - b.supported = append(b.supported, t) - } - } - b.supported = b.supported[:unique(tagsSorter(b.supported))] - -} - -type tagsSorter []language.Tag - -func (a tagsSorter) Len() int { return len(a) } -func (a tagsSorter) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a tagsSorter) Less(i, j int) bool { return a[i].String() < a[j].String() } - -func (b *builder) writeGroup(name string) { - g := b.group[name] - - for _, kv := range g.lang { - for t, _ := range kv { - g.toTags = append(g.toTags, t) - } - } - g.toTags = g.toTags[:unique(tagsBySize(g.toTags))] - - // Allocate header per supported value. - g.headers = make([]header, len(b.supported)) - for i, sup := range b.supported { - kv, ok := g.lang[sup] - if !ok { - g.headers[i].tag = sup - continue - } - data := []byte{} - index := make([]uint16, len(g.toTags), len(g.toTags)+1) - for j, t := range g.toTags { - index[j] = uint16(len(data)) - data = append(data, kv[t]...) - } - index = append(index, uint16(len(data))) - - // Trim the tail of the index. - // TODO: indexes can be reduced in size quite a bit more. - n := len(index) - for ; n >= 2 && index[n-2] == index[n-1]; n-- { - } - index = index[:n] - - // Workaround for a bug in CLDR 26. - // See http://unicode.org/cldr/trac/ticket/8042. - if cldr.Version == "26" && sup.String() == "hsb" { - data = bytes.Replace(data, []byte{'"'}, nil, 1) - } - g.headers[i] = header{sup, string(data), index} - } - g.writeTable(b.w, name) -} - -type tagsBySize []string - -func (l tagsBySize) Len() int { return len(l) } -func (l tagsBySize) Swap(i, j int) { l[i], l[j] = l[j], l[i] } -func (l tagsBySize) Less(i, j int) bool { - a, b := l[i], l[j] - // Sort single-tag entries based on size first. Otherwise alphabetic. - if len(a) != len(b) && (len(a) <= 4 || len(b) <= 4) { - return len(a) < len(b) - } - return a < b -} - -// parentIndices returns slice a of len(tags) where tags[a[i]] is the parent -// of tags[i]. -func parentIndices(tags []language.Tag) []int16 { - index := make(map[language.Tag]int16) - for i, t := range tags { - index[t] = int16(i) - } - - // Construct default parents. - parents := make([]int16, len(tags)) - for i, t := range tags { - parents[i] = -1 - for t = t.Parent(); t != language.Und; t = t.Parent() { - if j, ok := index[t]; ok { - parents[i] = j - break - } - } - } - return parents -} - -func (b *builder) writeParents() { - parents := parentIndices(b.supported) - fmt.Fprintf(b.w, "var parents = ") - b.w.WriteArray(parents) -} - -// writeKeys writes keys to a special index used by the display package. -// tags are assumed to be sorted by length. -func writeKeys(w *gen.CodeWriter, name string, keys []string) { - w.Size += int(3 * reflect.TypeOf("").Size()) - w.WriteComment("Number of keys: %d", len(keys)) - fmt.Fprintf(w, "var (\n\t%sIndex = tagIndex{\n", name) - for i := 2; i <= 4; i++ { - sub := []string{} - for _, t := range keys { - if len(t) != i { - break - } - sub = append(sub, t) - } - s := strings.Join(sub, "") - w.WriteString(s) - fmt.Fprintf(w, ",\n") - keys = keys[len(sub):] - } - fmt.Fprintln(w, "\t}") - if len(keys) > 0 { - w.Size += int(reflect.TypeOf([]string{}).Size()) - fmt.Fprintf(w, "\t%sTagsLong = ", name) - w.WriteSlice(keys) - } - fmt.Fprintln(w, ")\n") -} - -// identifier creates an identifier from the given tag. -func identifier(t language.Tag) string { - return strings.Replace(t.String(), "-", "", -1) -} - -func (h *header) writeEntry(w *gen.CodeWriter, name string) { - if len(dict) > 0 && dict.contains(h.tag) { - fmt.Fprintf(w, "\t{ // %s\n", h.tag) - fmt.Fprintf(w, "\t\t%[1]s%[2]sStr,\n\t\t%[1]s%[2]sIdx,\n", identifier(h.tag), name) - fmt.Fprintln(w, "\t},") - } else if len(h.data) == 0 { - fmt.Fprintln(w, "\t\t{}, //", h.tag) - } else { - fmt.Fprintf(w, "\t{ // %s\n", h.tag) - w.WriteString(h.data) - fmt.Fprintln(w, ",") - w.WriteSlice(h.index) - fmt.Fprintln(w, ",\n\t},") - } -} - -// write the data for the given header as single entries. The size for this data -// was already accounted for in writeEntry. -func (h *header) writeSingle(w *gen.CodeWriter, name string) { - if len(dict) > 0 && dict.contains(h.tag) { - tag := identifier(h.tag) - w.WriteConst(tag+name+"Str", h.data) - - // Note that we create a slice instead of an array. If we use an array - // we need to refer to it as a[:] in other tables, which will cause the - // array to always be included by the linker. See Issue 7651. - w.WriteVar(tag+name+"Idx", h.index) - } -} - -// WriteTable writes an entry for a single Namer. -func (g *group) writeTable(w *gen.CodeWriter, name string) { - start := w.Size - writeKeys(w, name, g.toTags) - w.Size += len(g.headers) * int(reflect.ValueOf(g.headers[0]).Type().Size()) - - fmt.Fprintf(w, "var %sHeaders = [%d]header{\n", name, len(g.headers)) - - title := strings.Title(name) - for _, h := range g.headers { - h.writeEntry(w, title) - } - fmt.Fprintln(w, "}\n") - - for _, h := range g.headers { - h.writeSingle(w, title) - } - n := w.Size - start - fmt.Fprintf(w, "// Total size for %s: %d bytes (%d KB)\n\n", name, n, n/1000) -} - -func (b *builder) writeDictionaries() { - fmt.Fprintln(b.w, "// Dictionary entries of frequent languages") - fmt.Fprintln(b.w, "var (") - parents := parentIndices(b.supported) - - for i, t := range b.supported { - if dict.contains(t) { - ident := identifier(t) - fmt.Fprintf(b.w, "\t%s = Dictionary{ // %s\n", ident, t) - if p := parents[i]; p == -1 { - fmt.Fprintln(b.w, "\t\tnil,") - } else { - fmt.Fprintf(b.w, "\t\t&%s,\n", identifier(b.supported[p])) - } - fmt.Fprintf(b.w, "\t\theader{%[1]sLangStr, %[1]sLangIdx},\n", ident) - fmt.Fprintf(b.w, "\t\theader{%[1]sScriptStr, %[1]sScriptIdx},\n", ident) - fmt.Fprintf(b.w, "\t\theader{%[1]sRegionStr, %[1]sRegionIdx},\n", ident) - fmt.Fprintln(b.w, "\t}") - } - } - fmt.Fprintln(b.w, ")") - - var s string - var a []uint16 - sz := reflect.TypeOf(s).Size() - sz += reflect.TypeOf(a).Size() - sz *= 3 - sz += reflect.TypeOf(&a).Size() - n := int(sz) * len(dict) - fmt.Fprintf(b.w, "// Total size for %d entries: %d bytes (%d KB)\n\n", len(dict), n, n/1000) - - b.w.Size += n -} - -// unique sorts the given lists and removes duplicate entries by swapping them -// past position k, where k is the number of unique values. It returns k. -func unique(a sort.Interface) int { - if a.Len() == 0 { - return 0 - } - sort.Sort(a) - k := 1 - for i := 1; i < a.Len(); i++ { - if a.Less(k-1, i) { - if k != i { - a.Swap(k, i) - } - k++ - } - } - return k -} diff --git a/vendor/golang.org/x/text/language/display/tables.go b/vendor/golang.org/x/text/language/display/tables.go deleted file mode 100644 index 6493357ef..000000000 --- a/vendor/golang.org/x/text/language/display/tables.go +++ /dev/null @@ -1,50336 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package display - -// CLDRVersion is the CLDR version from which the tables in this package are derived. -const CLDRVersion = "31" - -// Version is deprecated. Use CLDRVersion. -const Version = "31" - -var parents = [252]int16{ - // Entry 0 - 3F - -1, -1, -1, -1, -1, 4, 4, 4, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 19, -1, 21, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 36, 36, 36, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, 48, 48, 48, -1, -1, 53, 54, - 54, 54, 54, 54, 54, 54, 54, 54, - // Entry 40 - 7F - 54, 54, 54, 54, 54, 54, 54, 54, - 54, -1, -1, -1, -1, 76, -1, -1, - -1, -1, -1, 82, 82, 82, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 124, -1, -1, - // Entry 80 - BF - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 178, -1, -1, -1, -1, - 183, -1, -1, 186, -1, -1, -1, -1, - // Entry C0 - FF - -1, -1, 193, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 207, 207, 207, -1, 211, 211, 211, -1, - 215, -1, 217, 217, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - 231, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 244, -1, -1, - -1, -1, 249, -1, -} - -// Number of keys: 612 -var ( - langIndex = tagIndex{ - "aaabaeafakamanarasavayazbabebgbibmbnbobrbscacechcocrcscucvcydadedvdzeeel" + - "eneoeseteufafffifjfofrfygagdglgngugvhahehihohrhthuhyhziaidieigiiikio" + - "isitiujajvkakgkikjkkklkmknkokrkskukvkwkylalblglilnloltlulvmgmhmimkml" + - "mnmrmsmtmynandnengnlnnnonrnvnyocojomorospapiplpsptqurmrnrorurwsascsd" + - "sesgsiskslsmsnsosqsrssstsusvswtatetgthtitktntotrtstttyugukuruzvevivo" + - "wawoxhyiyozazhzu", - "aceachadaadyaebafhagqainakkakzalealnaltanganparcarnaroarparqarsarwaryarz" + - "asaaseastavkawabalbanbarbasbaxbbcbbjbejbembewbezbfdbfqbgnbhobikbinbj" + - "nbkmblabpybqibrabrhbrxbssbuabugbumbynbyvcadcarcaycchcebcggchbchgchkc" + - "hmchnchochpchrchyckbcopcpscrhcrscsbdakdardavdeldendgrdindjedoidsbdtp" + - "duadumdyodyudzgebuefieglegyekaelxenmesuewoextfanfilfitfonfrcfrmfrofr" + - "pfrrfrsfurgaagaggangaygbagbzgezgilglkgmhgohgomgongorgotgrbgrcgswgucg" + - "urguzgwihaihakhawhifhilhithmnhsbhsnhupibaibbiloinhizhjamjbojgojmcjpr" + - "jrbjutkaakabkackajkamkawkbdkblkcgkdekeakenkfokgpkhakhokhqkhwkiukkjkl" + - "nkmbkoikokkoskpekrckrikrjkrlkruksbksfkshkumkutladlaglahlamlezlfnlijl" + - "ivlktlmolollozlrcltglualuilunluolusluylzhlzzmadmafmagmaimakmanmasmde" + - "mdfmdrmenmermfemgamghmgomicminmncmnimohmosmrjmuamulmusmwlmwrmwvmyemy" + - "vmznnannapnaqndsnewnianiunjonmgnnhnognonnovnqonsonusnwcnymnynnyonzio" + - "saotapagpalpampappaupcdpcmpdcpdtpeopflphnpmspntponprgproqucqugrajrap" + - "rarrgnrifrofromrtmruerugruprwksadsahsamsaqsassatsazsbasbpscnscosdcsd" + - "hseesehseiselsessgasgsshishnshusidslislysmasmjsmnsmssnksogsrnsrrssys" + - "tqsuksussuxswbsycsyrszltcytemteotertettigtivtkltkrtlhtlitlytmhtogtpi" + - "trutrvtsdtsittttumtvltwqtyvtzmudmugaumbundvaivecvepvlsvmfvotvrovunwa" + - "ewalwarwaswbpwuuxalxmfxogyaoyapyavybbyrlyuezapzblzeazenzghzunzxxzza", - "", - } - langTagsLong = []string{ // 23 elements - "ar-001", - "az-Arab", - "de-AT", - "de-CH", - "en-AU", - "en-CA", - "en-GB", - "en-US", - "es-419", - "es-ES", - "es-MX", - "fa-AF", - "fr-CA", - "fr-CH", - "nds-NL", - "nl-BE", - "pt-BR", - "pt-PT", - "ro-MD", - "sr-Latn", - "sw-CD", - "zh-Hans", - "zh-Hant", - } -) - -var langHeaders = [252]header{ - { // af - afLangStr, - afLangIdx, - }, - { // agq - "AkanÀmalìÀlabìBɛ̀làlusànBùugɨlìaBɨ̀ŋgalìChɛ̂Dzamɛ̀Gɨ̀lêʔKɨŋgeleSɨ̀kpanìs" + - "KpɛɛshìaKɨ̀fàlàŋsiKɨtsɔŋkaŋEndìHɔŋgalìaÈndònɛshìaEgbòÈtalìaDzàkpànêD" + - "zàbvànêKɨmɛ̀kùulîaMàlaeBùumɛsɛ̀Nɛ̀kpalìDɔ̂sKpuwndzabìKpɔlìsKpotùwgîi" + - "LùmanyìaLushìaLùwandàSòmalìSuedìsTamìTàeTʉʉkìsÙkɛlɛnìaUudùwVìyɛtnàmê" + - "YulùbaChàenêZulùAghem", - []uint16{ // 188 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000b, 0x000b, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0020, 0x002b, - 0x002b, 0x002b, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, - 0x0037, 0x0037, 0x0037, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, - 0x0045, 0x0045, 0x0045, 0x0045, 0x004f, 0x0058, 0x0058, 0x0064, - 0x0064, 0x0064, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x007e, - 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x008b, - 0x008b, 0x0090, 0x0090, 0x0090, 0x0090, 0x009b, 0x009b, 0x009b, - // Entry 40 - 7F - 0x009b, 0x00a9, 0x00a9, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00b6, 0x00b6, 0x00c1, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, - 0x00cc, 0x00cc, 0x00d4, 0x00d4, 0x00dc, 0x00dc, 0x00dc, 0x00dc, - 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, - 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, - 0x00dc, 0x00dc, 0x00dc, 0x00e2, 0x00e2, 0x00ee, 0x00ee, 0x00ee, - 0x00f9, 0x00f9, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, - 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x010a, 0x010a, 0x0112, - // Entry 80 - BF - 0x0112, 0x011d, 0x011d, 0x011d, 0x011d, 0x0127, 0x012e, 0x0137, - 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, - 0x0137, 0x0137, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - 0x0146, 0x0146, 0x014b, 0x014b, 0x014b, 0x014f, 0x014f, 0x014f, - 0x014f, 0x014f, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0164, - 0x016a, 0x016a, 0x016a, 0x0177, 0x0177, 0x0177, 0x0177, 0x0177, - 0x0177, 0x017e, 0x017e, 0x0186, 0x018b, 0x018b, 0x018b, 0x018b, - 0x018b, 0x018b, 0x018b, 0x0190, - }, - }, - { // ak - "AkanAmarikArabikBelarus kasaBɔlgeria kasaBengali kasaKyɛk kasaGyaamanGre" + - "ek kasaBorɔfoSpain kasaPɛɛhyia kasaFrɛnkyeHausaHindiHangri kasaIndon" + - "ihyia kasaIgboItaly kasaGyapan kasaGyabanis kasaKambodia kasaKorea k" + - "asaMalay kasaBɛɛmis kasaNɛpal kasaDɛɛkyePungyabi kasaPɔland kasaPɔɔt" + - "ugal kasaRomenia kasaRahyia kasaRewanda kasaSomalia kasaSweden kasaT" + - "amil kasaTaeland kasaTɛɛki kasaUkren kasaUrdu kasaViɛtnam kasaYoruba" + - "Kyaena kasaZulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000a, 0x000a, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x001c, 0x002a, - 0x002a, 0x002a, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, - 0x0036, 0x0036, 0x0036, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0051, 0x0058, 0x0058, 0x0062, - 0x0062, 0x0062, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0078, - 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x007d, - 0x007d, 0x0082, 0x0082, 0x0082, 0x0082, 0x008d, 0x008d, 0x008d, - // Entry 40 - 7F - 0x008d, 0x009c, 0x009c, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, - 0x00aa, 0x00aa, 0x00b5, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, - 0x00c2, 0x00c2, 0x00cf, 0x00cf, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00e3, 0x00e3, 0x00f0, 0x00f0, 0x00f0, - 0x00fb, 0x00fb, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, - 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0110, 0x0110, 0x011c, - // Entry 80 - BF - 0x011c, 0x012b, 0x012b, 0x012b, 0x012b, 0x0137, 0x0142, 0x014e, - 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, - 0x014e, 0x014e, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, - 0x0165, 0x0165, 0x016f, 0x016f, 0x016f, 0x017b, 0x017b, 0x017b, - 0x017b, 0x017b, 0x0187, 0x0187, 0x0187, 0x0187, 0x0187, 0x0191, - 0x019a, 0x019a, 0x019a, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01ad, 0x01ad, 0x01b8, 0x01bc, - }, - }, - { // am - amLangStr, - amLangIdx, - }, - { // ar - arLangStr, - arLangIdx, - }, - { // ar-EG - "الدنماركية", - []uint16{ // 32 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, - }, - }, - { // ar-LY - "الغورانيةاللاووالسواحيليةالتيغرينيةالمابودونجونيةصوربيا العلياسامي الجنو" + - "بيةالكرواتية الصربيةالسواحيلية الكونغولية", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - // Entry 40 - 7F - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - // Entry 80 - BF - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - // Entry C0 - FF - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - // Entry 100 - 13F - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - // Entry 140 - 17F - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - // Entry 180 - 1BF - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - // Entry 1C0 - 1FF - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - // Entry 200 - 23F - 0x007b, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - // Entry 240 - 27F - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x00b5, 0x00de, - }, - }, - { // ar-SA - "الغورانيةاللاووالأوريةالسواحيليةالتيغرينيةالمابودونجونيةصوربيا العلياسام" + - "ي الجنوبيةالكرواتية الصربيةالسواحيلية الكونغولية", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - // Entry 40 - 7F - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - // Entry 80 - BF - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - // Entry C0 - FF - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - // Entry 100 - 13F - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - // Entry 140 - 17F - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - // Entry 180 - 1BF - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - // Entry 1C0 - 1FF - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - // Entry 200 - 23F - 0x0089, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - // Entry 240 - 27F - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00c3, 0x00ec, - }, - }, - { // as - "অসমীয়া", - []uint16{ // 10 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0015, - }, - }, - { // asa - "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKichekiKijerumaniKigiri" + - "kiKiingeredhaKihithpaniaKiajemiKifaranthaKihauthaKihindiKihungariKii" + - "ndonethiaKiigboKiitaliaanoKijapaniKijavaKikambodiaKikoreaKimalesiaKi" + - "burmaKinepaliKiholandhiKipunjabiKipolandiKirenoKiromaniaKiruthiKinya" + - "randwaKithomaliKithwidiKitamilKitailandiKiturukiKiukraniaKiurduKivie" + - "tinamuKiyorubaKichinaKidhuluKipare", - []uint16{ // 206 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, - 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0042, 0x0042, 0x0042, 0x0042, 0x004a, 0x0055, 0x0055, 0x0060, - 0x0060, 0x0060, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0071, - 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0079, - 0x0079, 0x0080, 0x0080, 0x0080, 0x0080, 0x0089, 0x0089, 0x0089, - // Entry 40 - 7F - 0x0089, 0x0095, 0x0095, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, - 0x00a6, 0x00a6, 0x00ae, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, - 0x00b4, 0x00b4, 0x00be, 0x00be, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00ce, 0x00ce, 0x00d5, 0x00d5, 0x00d5, - 0x00dd, 0x00dd, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, - 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00f0, 0x00f0, 0x00f9, - // Entry 80 - BF - 0x00f9, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x0108, 0x010f, 0x011a, - 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, - 0x011a, 0x011a, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, - 0x012b, 0x012b, 0x0132, 0x0132, 0x0132, 0x013c, 0x013c, 0x013c, - 0x013c, 0x013c, 0x0144, 0x0144, 0x0144, 0x0144, 0x0144, 0x014d, - 0x0153, 0x0153, 0x0153, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, - 0x015e, 0x0166, 0x0166, 0x016d, 0x0174, 0x0174, 0x0174, 0x0174, - 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, - // Entry C0 - FF - 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, - 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x017a, - }, - }, - { // ast - "afarabkhazianuavestanínafrikaansakanamháricuaragonésárabeasamésaváricuay" + - "maraazerbaixanubashkirbielorrusubúlgarubislamabambarabengalíntibetan" + - "ubretónbosniucatalánchechenuchamorrocorsucreechecueslávicu eclesiást" + - "icuchuvashgalésdanésalemándivehidzongkhaewegrieguinglésesperantoespa" + - "ñolestoniuvascupersafulahfinlandésfixanuferoésfrancésfrisón occiden" + - "talirlandésgaélicu escocésgalleguguaraníguyaratímanésḥausahebréuhind" + - "ihiri motucroatahaitianuhúngaruarmeniuhererointerlinguaindonesiuinte" + - "rlingueigboyi de Sichuáninupiaqidoislandésitalianuinuktitutxaponésxa" + - "vanésxeorxanukongokikuyukuanyamakazaquistanínkalaallisutḥemercanarés" + - "coreanukanuricachemiréscurdukomicórnicukirguistanínllatínluxemburgué" + - "sgandalimburguéslingalalaosianulituanuluba-katangaletónmalgaxemarsha" + - "llésmaorímacedoniumalayalammongolmarathimalayumaltésbirmanunaurundeb" + - "ele del nortenepalésndonganeerlandésnoruegu Nynorsknoruegu Bokmålnde" + - "bele del surnavajonyanjaoccitanuojibwaoromooriyaoséticupunyabípalipo" + - "lacupashtuportuguésquechuaromancherundirumanurusukinyarwandasánscrit" + - "usardusindhisami del nortesangocingaléseslovacueslovenusamoanushonas" + - "omalínalbanuserbiuswatisotho del sursondanéssuecusuaḥilitamiltelugut" + - "axiquistaníntailandéstigrinyaturcomanutswanatonganuturcutsongatártar" + - "utahitianuuigurucraínurduuzbequistanínvendavietnamínvolapükvalónwolo" + - "fxhosayiddishyorubazhuangchinuzulúachinésacoliadangmeadygheárabe de " + - "Túnezafrihiliaghemainuacadianualabamaaleutgheg d’Albaniaaltai del su" + - "ringlés antiguuangikaaraméumapuchearaonaarapahoárabe d’Arxeliaarawak" + - "árabe de Marruecosárabe d’Exiptuasullingua de signos americanaastur" + - "ianukotavaawadhibaluchibalinésbávarubasaabamunbatak tobaghomalabejab" + - "embabetawibenabafutbadagabalochi occidentalbhojpuribikolbinibanjarko" + - "msiksikabishnupriyabakhtiaribrajbrahuibodoakooseburiatbuginésbulubli" + - "nmedumbacaddocaribecayugaatsamcebuanuchigachibchachagataichuukésmari" + - "xíriga chinookchoctawchipewyanucheroquicheyennekurdu centralcópticuc" + - "apiznonturcu de Crimeafrancés criollu seselwakashubianudakotadargwat" + - "aitadelawareslavedogribdinkazarmadogribaxu sorbiudusun centraldualan" + - "eerlandés mediujola-fonyidyuladazagaembúefikemilianuexipciu antiguue" + - "kajukelamitainglés mediuyupik centralewondoestremeñufangfilipínfinla" + - "ndés de Tornedalenfonfrancés cajunfrancés mediufrancés antiguuarpita" + - "nufrisón del nortefrisón orientalfriulianugagagauzchinu gangayogbaya" + - "dari zoroastrianugeezgilbertésgilakialtualemán mediualtualemán antig" + - "uugoan konkanigondigorontalogóticugrebogriegu antiguualemán de Suiza" + - "wayuufrafragusiigwichʼinhaidachinu hakkahawaianuhindi de Fijihiligay" + - "nonhititahmongaltu sorbiuchinu xianghupaibanibibioilokoingushingrian" + - "uinglés criollu xamaicanulojbanngombamachamexudeo-persaxudeo-árabeju" + - "tlandéskara-kalpakkabileñukachinjjukambakawikabardianukanembutyapmak" + - "ondecabuverdianukenyangkorokaingangkhasikhotanéskoyra chiinikhowarki" + - "rmanjkikakokalenjinkimbundukomi-permyakkonkanikosraeanukpellekaracha" + - "y-balkarkriokinaray-akarelianukurukhshambalabafiacolonianukumykkuten" + - "ailadinolangilahndalambalezghianulingua franca novaligurianulivonian" + - "ulakotalombardumongoloziluri del nortelatgalianuluba-lulualuisenolun" + - "daluomizoluyiachinu lliterariulazmadurésmafamagahimaithilimakasarman" + - "dingomasáimabamokshamandarmendemerumorisyenírlandés mediumakhuwa-mee" + - "ttometa’micmacminangkabaumanchúmanipurimohawkmossimari occidentalmun" + - "dangmúltiples llingüescreekmirandésmarwarimentawaimyeneerzyamazander" + - "anichinu min nannapolitanunamabaxu alemánnewariniasniueanuao nagakwa" + - "siongiemboonnogainoruegu antiguunovialn’kosotho del nortenuernewari " + - "clásicunyamwezinyankolenyoronzimaosageturcu otomanupangasinanpahlavi" + - "pampangapapiamentopalauanupícarunixerianu simplificáualemán de Penns" + - "ylvaniaplautdietschpersa antiguualemán palatinufeniciupiamontéspónti" + - "cupohnpeianuprusianuprovenzal antiguukʼicheʼquichua del altiplanu de" + - " Chimborazorajasthanínrapanuirarotonganuromañolrifianuromboromanírot" + - "umanurusynrovianaaromanianurwasandavéssakhaaraméu samaritanusamburus" + - "asaksantalisaurashtrangambaysangusicilianuscotssardu sassaréskurdu d" + - "el sursénecasenaseriselkupkoyraboro senniirlandés antiguusamogitianu" + - "tachelhitshanárabe chadianusidamobaxu silesianuselayaréssami del sur" + - "lule samiinari samiskolt samisoninkesogdianusranan tongoserersahofri" + - "són de Saterlandsukumasususumeriucomorianusiriacu clásicusiriacusile" + - "sianutulutimnetesoterenatetumtigretivtokelautsakhurklingontlingittal" + - "ixíntamashektonga nyasatok pisinturoyotarokotsakoniutsimshiantati mu" + - "sulmántumbukatuvalutasawaqtuvinianutamazight del Atles centraludmurt" + - "ugaríticuumbundurootvaivenecianuvepsiuflamencu occidentalfranconianu" + - " del Mainvóticuvorovunjowalserwolayttawaraywashowarlpirichinu wucalm" + - "ucomingrelianusogayaoyapésyangbenyembanheengatucantonészapotecasimbó" + - "licu Blisszeelandészenagatamazight estándar de Marruecoszuniensin co" + - "nteníu llingüísticuzazaárabe estándar modernualemán d’Austriaaltuale" + - "mán de Suizainglés d’Australiainglés de Canadáinglés de Gran Bretaña" + - "inglés d’Estaos Xuníosespañol d’América Llatinaespañol européuespaño" + - "l de Méxicufrancés de Canadáfrancés de Suizabaxu saxónflamencuportug" + - "ués del Brasilportugués européumoldavuserbo-croatasuaḥili del Conguc" + - "hinu simplificáuchinu tradicional", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000e, 0x0018, 0x0021, 0x0025, 0x002e, 0x0037, - 0x003d, 0x0044, 0x004c, 0x0052, 0x005d, 0x0064, 0x006e, 0x0076, - 0x007d, 0x0084, 0x008d, 0x0095, 0x009c, 0x00a2, 0x00aa, 0x00b2, - 0x00ba, 0x00bf, 0x00c3, 0x00c8, 0x00df, 0x00e6, 0x00ec, 0x00f2, - 0x00f9, 0x00ff, 0x0107, 0x010a, 0x0110, 0x0117, 0x0120, 0x0128, - 0x012f, 0x0134, 0x0139, 0x013e, 0x0148, 0x014e, 0x0155, 0x015d, - 0x016f, 0x0178, 0x0189, 0x0190, 0x0198, 0x01a1, 0x01a7, 0x01ae, - 0x01b5, 0x01ba, 0x01c3, 0x01c9, 0x01d1, 0x01d9, 0x01e0, 0x01e6, - // Entry 40 - 7F - 0x01f1, 0x01fa, 0x0205, 0x0209, 0x0217, 0x021e, 0x0221, 0x022a, - 0x0232, 0x023b, 0x0243, 0x024b, 0x0253, 0x0258, 0x025e, 0x0266, - 0x0274, 0x027f, 0x0286, 0x028e, 0x0295, 0x029b, 0x02a6, 0x02ab, - 0x02af, 0x02b7, 0x02c4, 0x02cb, 0x02d8, 0x02dd, 0x02e8, 0x02ef, - 0x02f7, 0x02fe, 0x030a, 0x0310, 0x0317, 0x0322, 0x0328, 0x0331, - 0x033a, 0x0340, 0x0347, 0x034d, 0x0354, 0x035b, 0x0360, 0x0371, - 0x0379, 0x037f, 0x038a, 0x0399, 0x03a8, 0x03b7, 0x03bd, 0x03c3, - 0x03cb, 0x03d1, 0x03d6, 0x03db, 0x03e3, 0x03eb, 0x03ef, 0x03f5, - // Entry 80 - BF - 0x03fb, 0x0405, 0x040c, 0x0414, 0x0419, 0x041f, 0x0423, 0x042e, - 0x0438, 0x043d, 0x0443, 0x0451, 0x0456, 0x045f, 0x0467, 0x046f, - 0x0476, 0x047b, 0x0483, 0x0489, 0x048f, 0x0494, 0x04a1, 0x04aa, - 0x04af, 0x04b8, 0x04bd, 0x04c3, 0x04d1, 0x04db, 0x04e3, 0x04ec, - 0x04f2, 0x04f9, 0x04fe, 0x0504, 0x050c, 0x0515, 0x051a, 0x0521, - 0x0525, 0x0533, 0x0538, 0x0542, 0x054a, 0x0550, 0x0555, 0x055a, - 0x0561, 0x0567, 0x056d, 0x0572, 0x0577, 0x057f, 0x0584, 0x058b, - 0x0591, 0x05a1, 0x05a9, 0x05ae, 0x05b2, 0x05ba, 0x05c1, 0x05c6, - // Entry C0 - FF - 0x05d6, 0x05e3, 0x05f2, 0x05f8, 0x05ff, 0x0606, 0x060c, 0x0613, - 0x0625, 0x0625, 0x062b, 0x063e, 0x064f, 0x0652, 0x066d, 0x0676, - 0x067c, 0x0682, 0x0689, 0x0691, 0x0698, 0x069d, 0x06a2, 0x06ac, - 0x06b3, 0x06b7, 0x06bc, 0x06c2, 0x06c6, 0x06cb, 0x06d1, 0x06e3, - 0x06eb, 0x06f0, 0x06f4, 0x06fa, 0x06fd, 0x0704, 0x070f, 0x0718, - 0x071c, 0x0722, 0x0726, 0x072c, 0x0732, 0x073a, 0x073e, 0x0742, - 0x0749, 0x074e, 0x0754, 0x075a, 0x075f, 0x0766, 0x076b, 0x0772, - 0x077a, 0x0782, 0x0786, 0x0795, 0x079c, 0x07a6, 0x07ae, 0x07b6, - // Entry 100 - 13F - 0x07c3, 0x07cb, 0x07d3, 0x07e2, 0x07fa, 0x0804, 0x080a, 0x0810, - 0x0815, 0x081d, 0x0822, 0x0828, 0x082d, 0x0832, 0x0837, 0x0842, - 0x084f, 0x0854, 0x0865, 0x086f, 0x0874, 0x087a, 0x087f, 0x0883, - 0x088b, 0x089a, 0x08a0, 0x08a7, 0x08b4, 0x08c1, 0x08c7, 0x08d1, - 0x08d5, 0x08dd, 0x08f5, 0x08f8, 0x0906, 0x0914, 0x0924, 0x092c, - 0x093d, 0x094d, 0x0956, 0x0958, 0x095e, 0x0967, 0x096b, 0x0970, - 0x0981, 0x0985, 0x098f, 0x0995, 0x09a6, 0x09b9, 0x09c5, 0x09ca, - 0x09d3, 0x09da, 0x09df, 0x09ed, 0x09fd, 0x0a02, 0x0a08, 0x0a0d, - // Entry 140 - 17F - 0x0a16, 0x0a1b, 0x0a26, 0x0a2e, 0x0a3b, 0x0a45, 0x0a4b, 0x0a50, - 0x0a5b, 0x0a66, 0x0a6a, 0x0a6e, 0x0a74, 0x0a79, 0x0a7f, 0x0a87, - 0x0aa0, 0x0aa6, 0x0aac, 0x0ab3, 0x0abe, 0x0aca, 0x0ad4, 0x0adf, - 0x0ae8, 0x0aee, 0x0af1, 0x0af6, 0x0afa, 0x0b04, 0x0b0b, 0x0b0f, - 0x0b16, 0x0b22, 0x0b29, 0x0b2d, 0x0b35, 0x0b3a, 0x0b43, 0x0b4f, - 0x0b55, 0x0b5e, 0x0b62, 0x0b6a, 0x0b72, 0x0b7e, 0x0b85, 0x0b8e, - 0x0b94, 0x0ba3, 0x0ba7, 0x0bb0, 0x0bb9, 0x0bbf, 0x0bc7, 0x0bcc, - 0x0bd5, 0x0bda, 0x0be1, 0x0be7, 0x0bec, 0x0bf2, 0x0bf7, 0x0c00, - // Entry 180 - 1BF - 0x0c12, 0x0c1b, 0x0c24, 0x0c2a, 0x0c32, 0x0c37, 0x0c3b, 0x0c49, - 0x0c53, 0x0c5d, 0x0c64, 0x0c69, 0x0c6c, 0x0c70, 0x0c75, 0x0c85, - 0x0c88, 0x0c90, 0x0c94, 0x0c9a, 0x0ca2, 0x0ca9, 0x0cb1, 0x0cb7, - 0x0cbb, 0x0cc1, 0x0cc7, 0x0ccc, 0x0cd0, 0x0cd8, 0x0ce8, 0x0cf6, - 0x0cfd, 0x0d03, 0x0d0e, 0x0d15, 0x0d1d, 0x0d23, 0x0d28, 0x0d37, - 0x0d3e, 0x0d52, 0x0d57, 0x0d60, 0x0d67, 0x0d6f, 0x0d74, 0x0d79, - 0x0d84, 0x0d91, 0x0d9b, 0x0d9f, 0x0dab, 0x0db1, 0x0db5, 0x0dbc, - 0x0dc3, 0x0dc9, 0x0dd2, 0x0dd7, 0x0de6, 0x0dec, 0x0df2, 0x0e01, - // Entry 1C0 - 1FF - 0x0e05, 0x0e14, 0x0e1c, 0x0e24, 0x0e29, 0x0e2e, 0x0e33, 0x0e40, - 0x0e4a, 0x0e51, 0x0e59, 0x0e63, 0x0e6b, 0x0e72, 0x0e88, 0x0e9f, - 0x0eab, 0x0eb8, 0x0ec8, 0x0ecf, 0x0ed9, 0x0ee1, 0x0eeb, 0x0ef3, - 0x0f04, 0x0f0d, 0x0f30, 0x0f3c, 0x0f43, 0x0f4e, 0x0f56, 0x0f5d, - 0x0f62, 0x0f69, 0x0f71, 0x0f76, 0x0f7d, 0x0f87, 0x0f8a, 0x0f93, - 0x0f98, 0x0faa, 0x0fb1, 0x0fb6, 0x0fbd, 0x0fc7, 0x0fce, 0x0fd3, - 0x0fdc, 0x0fe1, 0x0ff0, 0x0ffd, 0x1004, 0x1008, 0x100c, 0x1012, - 0x1021, 0x1032, 0x103d, 0x1046, 0x104a, 0x1059, 0x105f, 0x106d, - // Entry 200 - 23F - 0x1077, 0x1083, 0x108c, 0x1096, 0x10a0, 0x10a7, 0x10af, 0x10bb, - 0x10c0, 0x10c4, 0x10d8, 0x10de, 0x10e2, 0x10e9, 0x10f2, 0x1102, - 0x1109, 0x1112, 0x1116, 0x111b, 0x111f, 0x1125, 0x112a, 0x112f, - 0x1132, 0x1139, 0x1140, 0x1147, 0x114e, 0x1156, 0x115e, 0x1169, - 0x1172, 0x1178, 0x117e, 0x1186, 0x118f, 0x119d, 0x11a4, 0x11aa, - 0x11b1, 0x11ba, 0x11d5, 0x11db, 0x11e5, 0x11ec, 0x11f0, 0x11f3, - 0x11fc, 0x1202, 0x1215, 0x1229, 0x1230, 0x1234, 0x1239, 0x123f, - 0x1247, 0x124c, 0x1251, 0x1259, 0x1261, 0x1268, 0x1273, 0x1277, - // Entry 240 - 27F - 0x127a, 0x1280, 0x1287, 0x128c, 0x1295, 0x129e, 0x12a6, 0x12b6, - 0x12c0, 0x12c6, 0x12e6, 0x12ea, 0x1308, 0x130c, 0x1324, 0x1324, - 0x1337, 0x134b, 0x1360, 0x1372, 0x138a, 0x13a4, 0x13c1, 0x13d2, - 0x13e5, 0x13e5, 0x13f8, 0x1409, 0x1414, 0x141c, 0x1431, 0x1444, - 0x144b, 0x1457, 0x146a, 0x147c, 0x148d, - }, - }, - { // az - azLangStr, - azLangIdx, - }, - { // az-Cyrl - "афарабхазафрикаансаканамһарарагонәрәбассамаварајмараазәрбајҹанбашгырдбел" + - "арусбулгарбисламабамбарабенгалтибетбретонбосниаккаталанчеченчаморок" + - "орсикачехславјанчувашуелсданимаркаалманмалдивдзонгаевејунанинҝилисе" + - "сперантоиспанестонбаскфарсфулафинфиҹифарерфрансызгәрби фризирландшо" + - "тланд келтгалисијагуаранигуҹаратманксһаусаивритһиндхорватһаити крео" + - "лмаҹарермәниһерероинтерлингвеиндонезијаигбоидоисландиталјанинуктиту" + - "тјапонјаваҝүрҹүкикујукуанјамагазахкалааллисуткхмерканнадакорејакану" + - "рикәшмиркүрдкомикорнгырғызлатынлүксембурггандалимбурглингалалаослит" + - "валуба-катангалатышмалагасмаршалмаоримакедонмалајаламмонголмаратһим" + - "алајмалтабирманнаурушимали ндебеленепалндонгаһолланднүнорск норвечб" + - "окмал норвечҹәнуби ндебеленавајонјанҹаокситаноромоодијаосетинпәнҹаб" + - "полјакпуштупортугалкечуароманшрундирумынрускинјарвандасанскритсарди" + - "нсиндһишимали самисангосинһаласловаксловенсамоашонасомалиалбансербс" + - "ватисесотосунданисвечсуаһилитамилтелугутаҹиктајтигринтүркмәнсванато" + - "нгантүрксонгататартахитиујғурукрајнаурдуөзбәквендавјетнамволапүквал" + - "унволофхосаидишјорубачинзулуакинадангмеадуҝеагһемајнуалеутҹәнуби ал" + - "тајанҝикаарауканҹаарапаһоасуастуријаавадһибаллибасабембабенабхочпур" + - "ибинисиксикәбодобуҝинблинсебуанчигачукизмаричоктаучерокичејенсоранс" + - "ејшел креолудакотадаргватаитадогрибзармаашағы сорбдуаладиоладазагае" + - "мбуефикекаҹукевондофилиппинфонфриулгагезгилбертгоронталоИсвечрә алм" + - "анҹасыгусигвичинһавајһилигајнонмонгјухары сорбһупаибанибибиоилокоин" + - "гушлоғбаннгомбамачамкабилекачинжукамбакабарда-чәркәзтвимакондекабув" + - "ердианкорохазикојра чииникакокаленҹинкимбундуконканикпеллегарачај-б" + - "алкаркарелкурухшамбалабафиакөлнкумыксефардланҝиләзҝилакоталозишимал" + - "и лурилуба-лулуалундалуомизолујиамадуризмагаһимаитилимакасармасајмо" + - "кшамендемеруморисиенмахува-мееттометаʼмикмакминангкабанманипүримоһа" + - "вкмосимундангчохсајлы дилләркрикмирандерзјамазандараннеаполитаннама" + - "невариниаснијуанквасионҝиембоонногајнгошимали сотонуернјанколпангас" + - "инанпампангапапјаментопалајанниҝер креолпрусскичерапануираротонганр" + - "омбоароманруасандавесахасамбурусанталнгамбајсангусиҹилијаскотссенак" + - "ојраборо сеннитачелитшанҹәнуби самилуле самиинари самисколт самисон" + - "инкесранан тонгосаһосукумакоморсуријатимнетесотетумтигреклингонток " + - "писинтарокотумбукатувалутасавагтувинјанМәркәзи Атлас тамазиҹәсиудму" + - "ртумбундурутваивунјоваллесваламоварајкалмыксогајангбенјембакантонта" + - "мазизунидил мәзмуну јохдурзазамүасир стандарт әрәбАвстрија алманҹас" + - "ыИсвечрә јүксәк алманҹасыАвстралија инҝилисҹәсиКанада инҝилисҹәсиБр" + - "итанија инҝилисҹәсиАмерика инҝилисҹәсиЛатын Америкасы испанҹасыКаст" + - "илија испанҹасыМексика испанҹасыКанада франсызҹасыИсвечрә франсызҹа" + - "сыашағы саксонфламандБразилија португалҹасыПортугалија португалҹасы" + - "Конго суаһилиҹәсисадәләшмиш чинәнәнәви чин", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0008, 0x0012, 0x0012, 0x0024, 0x002c, 0x0036, 0x0042, - 0x004a, 0x0054, 0x005c, 0x0068, 0x007c, 0x008a, 0x0098, 0x00a4, - 0x00b2, 0x00c0, 0x00cc, 0x00d6, 0x00e2, 0x00f0, 0x00fe, 0x0108, - 0x0114, 0x0122, 0x0122, 0x0128, 0x0136, 0x0140, 0x0148, 0x015a, - 0x0164, 0x0170, 0x017c, 0x0182, 0x018c, 0x019a, 0x01ac, 0x01b6, - 0x01c0, 0x01c8, 0x01d0, 0x01d8, 0x01de, 0x01e6, 0x01f0, 0x01fe, - 0x0211, 0x021d, 0x0234, 0x0244, 0x0252, 0x0260, 0x026a, 0x0274, - 0x027e, 0x0286, 0x0286, 0x0292, 0x02a7, 0x02b1, 0x02bd, 0x02c9, - // Entry 40 - 7F - 0x02df, 0x02f3, 0x02f3, 0x02fb, 0x02fb, 0x02fb, 0x0301, 0x030d, - 0x031b, 0x032d, 0x0337, 0x033f, 0x0349, 0x0349, 0x0355, 0x0365, - 0x036f, 0x0385, 0x038f, 0x039d, 0x03a9, 0x03b5, 0x03c1, 0x03c9, - 0x03d1, 0x03d9, 0x03e5, 0x03ef, 0x0403, 0x040d, 0x041b, 0x0429, - 0x0431, 0x043b, 0x0452, 0x045c, 0x046a, 0x0476, 0x0480, 0x048e, - 0x04a0, 0x04ac, 0x04ba, 0x04c4, 0x04ce, 0x04da, 0x04e4, 0x04ff, - 0x0509, 0x0515, 0x0523, 0x053e, 0x0557, 0x0572, 0x057e, 0x058a, - 0x0598, 0x0598, 0x05a2, 0x05ac, 0x05b8, 0x05c4, 0x05c4, 0x05d0, - // Entry 80 - BF - 0x05da, 0x05ea, 0x05f4, 0x0600, 0x060a, 0x0614, 0x061a, 0x0630, - 0x0640, 0x064c, 0x0658, 0x066d, 0x0677, 0x0685, 0x0691, 0x069d, - 0x06a7, 0x06af, 0x06bb, 0x06c5, 0x06cd, 0x06d7, 0x06e3, 0x06ef, - 0x06f9, 0x0707, 0x0711, 0x071d, 0x0727, 0x072d, 0x0739, 0x0747, - 0x0751, 0x075d, 0x0765, 0x076f, 0x0779, 0x0785, 0x078f, 0x079d, - 0x07a5, 0x07af, 0x07b9, 0x07c7, 0x07d5, 0x07df, 0x07e9, 0x07f1, - 0x07f9, 0x0805, 0x0805, 0x080b, 0x0813, 0x081b, 0x081b, 0x0829, - 0x0833, 0x0833, 0x0833, 0x083d, 0x0845, 0x0845, 0x0845, 0x084f, - // Entry C0 - FF - 0x084f, 0x0866, 0x0866, 0x0872, 0x0872, 0x0884, 0x0884, 0x0892, - 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0898, 0x0898, 0x08a8, - 0x08a8, 0x08b4, 0x08b4, 0x08be, 0x08be, 0x08c6, 0x08c6, 0x08c6, - 0x08c6, 0x08c6, 0x08d0, 0x08d0, 0x08d8, 0x08d8, 0x08d8, 0x08d8, - 0x08e8, 0x08e8, 0x08f0, 0x08f0, 0x08f0, 0x08fe, 0x08fe, 0x08fe, - 0x08fe, 0x08fe, 0x0906, 0x0906, 0x0906, 0x0910, 0x0910, 0x0918, - 0x0918, 0x0918, 0x0918, 0x0918, 0x0918, 0x0924, 0x092c, 0x092c, - 0x092c, 0x0936, 0x093e, 0x093e, 0x094a, 0x094a, 0x0956, 0x0960, - // Entry 100 - 13F - 0x096a, 0x096a, 0x096a, 0x096a, 0x0983, 0x0983, 0x098f, 0x099b, - 0x09a5, 0x09a5, 0x09a5, 0x09b1, 0x09b1, 0x09bb, 0x09bb, 0x09ce, - 0x09ce, 0x09d8, 0x09d8, 0x09e2, 0x09e2, 0x09ee, 0x09f6, 0x09fe, - 0x09fe, 0x09fe, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a16, 0x0a16, - 0x0a16, 0x0a26, 0x0a26, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, - 0x0a2c, 0x0a2c, 0x0a36, 0x0a3a, 0x0a3a, 0x0a3a, 0x0a3a, 0x0a3a, - 0x0a3a, 0x0a40, 0x0a4e, 0x0a4e, 0x0a4e, 0x0a4e, 0x0a4e, 0x0a4e, - 0x0a60, 0x0a60, 0x0a60, 0x0a60, 0x0a81, 0x0a81, 0x0a81, 0x0a89, - // Entry 140 - 17F - 0x0a95, 0x0a95, 0x0a95, 0x0a9f, 0x0a9f, 0x0ab3, 0x0ab3, 0x0abb, - 0x0ad0, 0x0ad0, 0x0ad8, 0x0ae0, 0x0aec, 0x0af6, 0x0b00, 0x0b00, - 0x0b00, 0x0b0c, 0x0b18, 0x0b22, 0x0b22, 0x0b22, 0x0b22, 0x0b22, - 0x0b2e, 0x0b38, 0x0b3c, 0x0b46, 0x0b46, 0x0b61, 0x0b61, 0x0b67, - 0x0b75, 0x0b8b, 0x0b8b, 0x0b93, 0x0b93, 0x0b9b, 0x0b9b, 0x0bb0, - 0x0bb0, 0x0bb0, 0x0bb8, 0x0bc8, 0x0bd8, 0x0bd8, 0x0be6, 0x0be6, - 0x0bf2, 0x0c0d, 0x0c0d, 0x0c0d, 0x0c17, 0x0c21, 0x0c2f, 0x0c39, - 0x0c41, 0x0c4b, 0x0c4b, 0x0c57, 0x0c61, 0x0c61, 0x0c61, 0x0c6b, - // Entry 180 - 1BF - 0x0c6b, 0x0c6b, 0x0c6b, 0x0c77, 0x0c77, 0x0c77, 0x0c7f, 0x0c94, - 0x0c94, 0x0ca7, 0x0ca7, 0x0cb1, 0x0cb7, 0x0cbf, 0x0cc9, 0x0cc9, - 0x0cc9, 0x0cd7, 0x0cd7, 0x0ce3, 0x0cf1, 0x0cff, 0x0cff, 0x0d09, - 0x0d09, 0x0d13, 0x0d13, 0x0d1d, 0x0d25, 0x0d35, 0x0d35, 0x0d4e, - 0x0d58, 0x0d64, 0x0d7a, 0x0d7a, 0x0d8a, 0x0d96, 0x0d9e, 0x0d9e, - 0x0dac, 0x0dc9, 0x0dd1, 0x0ddd, 0x0ddd, 0x0ddd, 0x0ddd, 0x0de7, - 0x0dfb, 0x0dfb, 0x0e0f, 0x0e17, 0x0e17, 0x0e23, 0x0e2b, 0x0e37, - 0x0e37, 0x0e43, 0x0e55, 0x0e5f, 0x0e5f, 0x0e5f, 0x0e65, 0x0e7a, - // Entry 1C0 - 1FF - 0x0e82, 0x0e82, 0x0e82, 0x0e90, 0x0e90, 0x0e90, 0x0e90, 0x0e90, - 0x0ea4, 0x0ea4, 0x0eb4, 0x0ec8, 0x0ed6, 0x0ed6, 0x0eeb, 0x0eeb, - 0x0eeb, 0x0eeb, 0x0eeb, 0x0eeb, 0x0eeb, 0x0eeb, 0x0eeb, 0x0ef5, - 0x0ef5, 0x0efd, 0x0efd, 0x0efd, 0x0f0b, 0x0f1f, 0x0f1f, 0x0f1f, - 0x0f29, 0x0f29, 0x0f29, 0x0f29, 0x0f29, 0x0f35, 0x0f3b, 0x0f49, - 0x0f51, 0x0f51, 0x0f5f, 0x0f5f, 0x0f6b, 0x0f6b, 0x0f79, 0x0f83, - 0x0f93, 0x0f9d, 0x0f9d, 0x0f9d, 0x0f9d, 0x0fa5, 0x0fa5, 0x0fa5, - 0x0fc2, 0x0fc2, 0x0fc2, 0x0fd0, 0x0fd6, 0x0fd6, 0x0fd6, 0x0fd6, - // Entry 200 - 23F - 0x0fd6, 0x0feb, 0x0ffc, 0x100f, 0x1022, 0x1030, 0x1030, 0x1047, - 0x1047, 0x104f, 0x104f, 0x105b, 0x105b, 0x105b, 0x1065, 0x1065, - 0x1071, 0x1071, 0x1071, 0x107b, 0x1083, 0x1083, 0x108d, 0x1097, - 0x1097, 0x1097, 0x1097, 0x10a5, 0x10a5, 0x10a5, 0x10a5, 0x10a5, - 0x10b6, 0x10b6, 0x10c2, 0x10c2, 0x10c2, 0x10c2, 0x10d0, 0x10dc, - 0x10ea, 0x10fa, 0x1128, 0x1134, 0x1134, 0x1142, 0x1148, 0x114e, - 0x114e, 0x114e, 0x114e, 0x114e, 0x114e, 0x114e, 0x1158, 0x1164, - 0x1170, 0x117a, 0x117a, 0x117a, 0x117a, 0x1186, 0x1186, 0x118e, - // Entry 240 - 27F - 0x118e, 0x118e, 0x119c, 0x11a6, 0x11a6, 0x11b2, 0x11b2, 0x11b2, - 0x11b2, 0x11b2, 0x11be, 0x11c6, 0x11e8, 0x11f0, 0x1216, 0x1216, - 0x1239, 0x1267, 0x1292, 0x12b5, 0x12de, 0x1303, 0x1333, 0x1358, - 0x1379, 0x1379, 0x139c, 0x13c1, 0x13d8, 0x13e6, 0x1411, 0x1440, - 0x1440, 0x1440, 0x1461, 0x147c, 0x1491, - }, - }, - { // bas - "Hɔp u akanHɔp u amhārìkHɔp u arâbHɔp u bièlòrûsHɔp u bûlgârHɔp u bɛŋgàli" + - "Hɔp u cɛ̂kHɔp u jamânHɔp u gri ᷇kyàHɔp u ŋgisìHɔp u panyāHɔp u pɛrsì" + - "àHɔp u pulàsiHɔp u ɓausaHɔp u hindìHɔp u hɔŋgrìiHɔp u indònesìàHɔp " + - "u iɓòHɔp u italìàHɔp u yapànHɔp u yavàHɔp u kmɛ̂rHɔp u kɔrēàHɔp u ma" + - "kɛ᷆Hɔp u birmànHɔp u nepa᷆lHɔp u nlɛ̀ndiHɔp u pɛnjàbiHɔp u pɔlɔ̄nàHɔ" + - "p u pɔtɔ̄kìHɔp u rùmanìàHɔp u ruslàndHɔp u ruāndàHɔp u somàlîHɔp u s" + - "uɛ᷆dHɔp u tamu᷆lHɔp u tâyHɔp u tûrkHɔp u ukrǎnìàHɔp u urdùHɔp u vyɛ̄" + - "dnàmHɔp u yorūbàHɔp u kinàHɔp u zulùƁàsàa", - []uint16{ // 214 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000b, 0x001b, 0x001b, - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0039, 0x0048, - 0x0048, 0x0048, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0073, 0x0073, 0x0073, 0x0073, 0x0085, 0x0093, 0x0093, 0x00a0, - 0x00a0, 0x00a0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00be, - 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00cb, - 0x00cb, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00e9, 0x00e9, 0x00e9, - // Entry 40 - 7F - 0x00e9, 0x00fc, 0x00fc, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, - 0x0117, 0x0117, 0x0124, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, - 0x0130, 0x0130, 0x013e, 0x013e, 0x014d, 0x014d, 0x014d, 0x014d, - 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, - 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, - 0x014d, 0x014d, 0x014d, 0x015c, 0x015c, 0x016a, 0x016a, 0x016a, - 0x0179, 0x0179, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, - 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0199, 0x0199, 0x01ab, - // Entry 80 - BF - 0x01ab, 0x01bd, 0x01bd, 0x01bd, 0x01bd, 0x01ce, 0x01dd, 0x01ec, - 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, - 0x01ec, 0x01ec, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, - 0x020a, 0x020a, 0x0219, 0x0219, 0x0219, 0x0224, 0x0224, 0x0224, - 0x0224, 0x0224, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0241, - 0x024d, 0x024d, 0x024d, 0x025f, 0x025f, 0x025f, 0x025f, 0x025f, - 0x025f, 0x026e, 0x026e, 0x027a, 0x0286, 0x0286, 0x0286, 0x0286, - 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, - // Entry C0 - FF - 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, - 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, - 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x028e, - }, - }, - { // be - "афарскаяабхазскаяафрыкаансаканамхарскаяарагонскаяарабскаяасамскаяаварска" + - "яаймараазербайджанскаябашкірскаябеларускаябалгарскаябісламабамбараб" + - "енгальскаятыбецкаябрэтонскаябаснійскаякаталанскаячачэнскаячаморакар" + - "сіканскаячэшскаяцаркоўнаславянскаячувашскаявалійскаядацкаянямецкаям" + - "альдыўскаядзонг-кээвегрэчаскаяанглійскаяэсперантаіспанскаяэстонская" + - "баскскаяфарсіфулафінскаяфіджыйскаяфарэрскаяфранцузскаязаходняя фрыз" + - "скаяірландскаяшатландская гэльскаягалісійскаягуаранігуджарацімэнска" + - "яхаусаіўрытхіндзіхарвацкаягаіцянская крэольскаявенгерскаяармянскаяг" + - "ерэраінтэрлінгваінданезійскаяінтэрлінгвэігбасычуаньская йіідаісланд" + - "скаяітальянскаяінуктытутяпонскаяяванскаягрузінскаякікуйюкуаньямаказ" + - "ахскаягрэнландскаякхмерскаяканадакарэйскаяканурыкашмірскаякурдскаяк" + - "омікорнскаякіргізскаялацінскаялюксембургскаягандалімбургскаялінгала" + - "лаоскаялітоўскаялуба-катангалатышскаямалагасійскаямаршальскаямаарым" + - "акедонскаямалаяламмангольскаямаратхімалайскаямальтыйскаябірманскаян" + - "аурупаўночная ндэбеленепальскаяндонганідэрландскаянарвежская (нюнош" + - "к)нарвежская (букмол)паўднёвая ндэбеленаваханьянджааксітанскаяаджыб" + - "вааромаорыяасецінскаяпанджабіпольскаяпуштупартугальскаякечуарэтарам" + - "анскаярундзірумынскаярускаяруандасанскрытсардзінскаясіндхіпаўночнас" + - "аамскаясангасінгальскаяславацкаяславенскаясамоашонасамаліалбанскаяс" + - "ербскаясуаціпаўднёвая сотасундашведскаясуахілітамільскаятэлугутаджы" + - "кскаятайскаятыгрыньятуркменскаятсванатанганскаятурэцкаятсонгататарс" + - "каятаіціуйгурскаяукраінскаяурдуузбекскаявендав’етнамскаявалапюквало" + - "нскаявалофкосаідышёрубакітайскаязулуачэхадангмэадыгейскаяагемайнска" + - "яакадскаяалеуцкаяпаўднёваалтайскаястараанглійскаяангікаарамейскаяма" + - "пудунгунарапахаасуастурыйскаяавадхібалійскаябасаабембабеназаходняя " + - "белуджскаябхаджпурыэдаблэкфутбодабурацкаябугісбіленсебуаначыгачыбча" + - "чуукмарычоктачэрокішэйенцэнтральнакурдскаякопцкаясэсэльвадакотадарг" + - "інскаятаітадогрыбзарманіжнялужыцкаядуаладжола-фоньідазагаэмбуэфікст" + - "аражытнаегіпецкаяэкаджукэвондафіліпінскаяфонстарафранцузскаяфрыульс" + - "каягагагаузскаягеэзкірыбацігаранталастаражытнагрэчаскаяшвейцарская " + - "нямецкаягусіігуіч’інгавайскаяхілігайнонхмонгверхнялужыцкаяхупаібані" + - "бібіяілаканаінгушскаяложбаннгомбамачамбэкабільскаякачынскаядджукамб" + - "акабардзінскаят’япмакондэкабувердыянукоракхасікойра чыінікакокаленд" + - "жынкімбундукомі-пярмяцкаяканканікпелекарачай-балкарскаякарэльскаяку" + - "рухшамбалабафіякёльнскаякумыцкаяладыналангілезгінскаялакотамонгалоз" + - "іпаўночная лурылуба-касаілундалуомізолуйямадурскаямагахімайтхілімак" + - "асармандынгмаасаймакшанскаямендэмерумарысьенмакуўа-меетаметамікмакм" + - "інангкабаумейтэймохакмосімундангнекалькі моўмускогімірандыйскаяэрзя" + - "нскаямазандэранскаянеапалітанскаянаманіжненямецкаянеўарыніасніўэнгу" + - "мбанг’ембоннагайскаястаранарвежскаянкопаўночная сотануэрньянколепан" + - "гасінанпампангапап’яментупалаунігерыйскі піджынстараперсідскаяфінік" + - "ійскаяпрускаястараправансальскаякічэраджастханскаярапануіраратонгро" + - "мбаарумунскаяруасандаўэякуцкаясамбурусанталінгамбайсангусіцылійская" + - "шатландскаяпаўднёвакурдскаясенакайрабора сэністараірландскаяташэльх" + - "ітшанпаўднёвасаамскаялуле-саамскаяінары-саамскаяколта-саамскаясанін" + - "кесранан-тонгасахасукумашумерскаякаморскаясірыйскаятэмнэтэсотэтумты" + - "грэклінганток-пісінтарокатумбукатувалутасаўактувінскаяцэнтральнаатл" + - "аская тамазіхтудмурцкаяумбундукораньваівунджовальшскаяволайтаварайв" + - "арлпірыкалмыцкаясогаянгбэнйембакантонскі дыялект кітайскайсапатэкст" + - "андартная мараканская тамазіхтзуніняма моўнага матэрыялузазакісучас" + - "ная стандартная арабскаяаўстрыйская нямецкаяшвейцарская стандартная" + - " нямецкаяаўстралійская англійскаяканадская англійскаябрытанская англ" + - "ійскаяамерыканская англійскаялацінаамерыканская іспанскаяеўрапейска" + - "я іспанскаямексіканская іспанскаяканадская французскаяшвейцарская ф" + - "ранцузскаяніжнесаксонскаяфламандскаябразільская партугальскаяеўрапе" + - "йская партугальскаямалдаўская румынскаясербскахарвацкаякангалезская" + - " суахіліспрошчаная кітайскаятрадыцыйная кітайская", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0022, 0x0022, 0x0034, 0x003c, 0x004e, 0x0062, - 0x0072, 0x0082, 0x0092, 0x009e, 0x00bc, 0x00d0, 0x00e4, 0x00f8, - 0x0106, 0x0114, 0x012a, 0x013a, 0x014e, 0x0162, 0x0178, 0x018a, - 0x0196, 0x01ae, 0x01ae, 0x01bc, 0x01e0, 0x01f2, 0x0204, 0x0210, - 0x0220, 0x0236, 0x0245, 0x024b, 0x025d, 0x0271, 0x0283, 0x0295, - 0x02a7, 0x02b7, 0x02c1, 0x02c9, 0x02d7, 0x02eb, 0x02fd, 0x0313, - 0x0334, 0x0348, 0x036f, 0x0385, 0x0393, 0x03a5, 0x03b3, 0x03bd, - 0x03c7, 0x03d3, 0x03d3, 0x03e5, 0x040e, 0x0422, 0x0434, 0x0440, - // Entry 40 - 7F - 0x0456, 0x0470, 0x0486, 0x048e, 0x04a9, 0x04a9, 0x04af, 0x04c3, - 0x04d9, 0x04eb, 0x04fb, 0x050b, 0x051f, 0x051f, 0x052b, 0x053b, - 0x054d, 0x0565, 0x0577, 0x0583, 0x0595, 0x05a1, 0x05b5, 0x05c5, - 0x05cd, 0x05dd, 0x05f1, 0x0603, 0x061f, 0x0629, 0x063f, 0x064d, - 0x065b, 0x066d, 0x0684, 0x0696, 0x06b0, 0x06c6, 0x06d0, 0x06e6, - 0x06f6, 0x070c, 0x071a, 0x072c, 0x0742, 0x0756, 0x0760, 0x0781, - 0x0795, 0x07a1, 0x07bb, 0x07de, 0x0801, 0x0822, 0x082e, 0x083c, - 0x0852, 0x0860, 0x086a, 0x0872, 0x0886, 0x0896, 0x0896, 0x08a6, - // Entry 80 - BF - 0x08b0, 0x08ca, 0x08d4, 0x08ee, 0x08fa, 0x090c, 0x0918, 0x0924, - 0x0934, 0x094a, 0x0956, 0x0976, 0x0980, 0x0996, 0x09a8, 0x09bc, - 0x09c6, 0x09ce, 0x09da, 0x09ec, 0x09fc, 0x0a06, 0x0a21, 0x0a2b, - 0x0a3b, 0x0a49, 0x0a5d, 0x0a69, 0x0a7d, 0x0a8b, 0x0a9b, 0x0ab1, - 0x0abd, 0x0ad1, 0x0ae1, 0x0aed, 0x0aff, 0x0b09, 0x0b1b, 0x0b2f, - 0x0b37, 0x0b49, 0x0b53, 0x0b6a, 0x0b78, 0x0b8a, 0x0b94, 0x0b9c, - 0x0ba4, 0x0bae, 0x0bae, 0x0bc0, 0x0bc8, 0x0bd0, 0x0bd0, 0x0bde, - 0x0bf2, 0x0bf2, 0x0bf2, 0x0bfa, 0x0c08, 0x0c18, 0x0c18, 0x0c28, - // Entry C0 - FF - 0x0c28, 0x0c4a, 0x0c68, 0x0c74, 0x0c88, 0x0c9c, 0x0c9c, 0x0caa, - 0x0caa, 0x0caa, 0x0caa, 0x0caa, 0x0caa, 0x0cb0, 0x0cb0, 0x0cc6, - 0x0cc6, 0x0cd2, 0x0cd2, 0x0ce4, 0x0ce4, 0x0cee, 0x0cee, 0x0cee, - 0x0cee, 0x0cee, 0x0cf8, 0x0cf8, 0x0d00, 0x0d00, 0x0d00, 0x0d25, - 0x0d37, 0x0d37, 0x0d3d, 0x0d3d, 0x0d3d, 0x0d4b, 0x0d4b, 0x0d4b, - 0x0d4b, 0x0d4b, 0x0d53, 0x0d53, 0x0d63, 0x0d6d, 0x0d6d, 0x0d77, - 0x0d77, 0x0d77, 0x0d77, 0x0d77, 0x0d77, 0x0d85, 0x0d8d, 0x0d97, - 0x0d97, 0x0d9f, 0x0da7, 0x0da7, 0x0db1, 0x0db1, 0x0dbd, 0x0dc7, - // Entry 100 - 13F - 0x0deb, 0x0df9, 0x0df9, 0x0df9, 0x0e09, 0x0e09, 0x0e15, 0x0e29, - 0x0e33, 0x0e33, 0x0e33, 0x0e3f, 0x0e3f, 0x0e49, 0x0e49, 0x0e63, - 0x0e63, 0x0e6d, 0x0e6d, 0x0e82, 0x0e82, 0x0e8e, 0x0e96, 0x0e9e, - 0x0e9e, 0x0ec4, 0x0ed2, 0x0ed2, 0x0ed2, 0x0ed2, 0x0ede, 0x0ede, - 0x0ede, 0x0ef4, 0x0ef4, 0x0efa, 0x0efa, 0x0efa, 0x0f1a, 0x0f1a, - 0x0f1a, 0x0f1a, 0x0f2e, 0x0f32, 0x0f46, 0x0f46, 0x0f46, 0x0f46, - 0x0f46, 0x0f4e, 0x0f5e, 0x0f5e, 0x0f5e, 0x0f5e, 0x0f5e, 0x0f5e, - 0x0f70, 0x0f70, 0x0f70, 0x0f96, 0x0fbd, 0x0fbd, 0x0fbd, 0x0fc7, - // Entry 140 - 17F - 0x0fd6, 0x0fd6, 0x0fd6, 0x0fe8, 0x0fe8, 0x0ffc, 0x0ffc, 0x1006, - 0x1022, 0x1022, 0x102a, 0x1032, 0x103e, 0x104c, 0x105e, 0x105e, - 0x105e, 0x106a, 0x1076, 0x1084, 0x1084, 0x1084, 0x1084, 0x1084, - 0x1098, 0x10aa, 0x10b2, 0x10bc, 0x10bc, 0x10d6, 0x10d6, 0x10df, - 0x10ed, 0x1105, 0x1105, 0x110d, 0x110d, 0x1117, 0x1117, 0x112c, - 0x112c, 0x112c, 0x1134, 0x1146, 0x1156, 0x1171, 0x117f, 0x117f, - 0x1189, 0x11ac, 0x11ac, 0x11ac, 0x11c0, 0x11ca, 0x11d8, 0x11e2, - 0x11f4, 0x1204, 0x1204, 0x1210, 0x121a, 0x121a, 0x121a, 0x122e, - // Entry 180 - 1BF - 0x122e, 0x122e, 0x122e, 0x123a, 0x123a, 0x1244, 0x124c, 0x1267, - 0x1267, 0x127a, 0x127a, 0x1284, 0x128a, 0x1292, 0x129a, 0x129a, - 0x129a, 0x12ac, 0x12ac, 0x12b8, 0x12c8, 0x12d6, 0x12e4, 0x12f0, - 0x12f0, 0x1304, 0x1304, 0x130e, 0x1316, 0x1326, 0x1326, 0x133d, - 0x1345, 0x1351, 0x1367, 0x1367, 0x1373, 0x137d, 0x1385, 0x1385, - 0x1393, 0x13aa, 0x13b8, 0x13d0, 0x13d0, 0x13d0, 0x13d0, 0x13e2, - 0x13fe, 0x13fe, 0x141a, 0x1422, 0x143c, 0x1448, 0x1450, 0x1458, - 0x1458, 0x1464, 0x1475, 0x1487, 0x14a5, 0x14a5, 0x14ab, 0x14c6, - // Entry 1C0 - 1FF - 0x14ce, 0x14ce, 0x14ce, 0x14de, 0x14de, 0x14de, 0x14de, 0x14de, - 0x14f2, 0x14f2, 0x1502, 0x1517, 0x1521, 0x1521, 0x1542, 0x1542, - 0x1542, 0x1560, 0x1560, 0x1576, 0x1576, 0x1576, 0x1576, 0x1584, - 0x15aa, 0x15b2, 0x15b2, 0x15ce, 0x15dc, 0x15ec, 0x15ec, 0x15ec, - 0x15f6, 0x15f6, 0x15f6, 0x15f6, 0x15f6, 0x160a, 0x1610, 0x161e, - 0x162c, 0x162c, 0x163a, 0x163a, 0x1648, 0x1648, 0x1656, 0x1660, - 0x1676, 0x168c, 0x168c, 0x16ac, 0x16ac, 0x16b4, 0x16b4, 0x16b4, - 0x16cf, 0x16ed, 0x16ed, 0x16ff, 0x1705, 0x1705, 0x1705, 0x1705, - // Entry 200 - 23F - 0x1705, 0x1725, 0x173e, 0x1759, 0x1774, 0x1782, 0x1782, 0x1799, - 0x1799, 0x17a1, 0x17a1, 0x17ad, 0x17ad, 0x17bf, 0x17d1, 0x17d1, - 0x17e3, 0x17e3, 0x17e3, 0x17ed, 0x17f5, 0x17f5, 0x17ff, 0x1809, - 0x1809, 0x1809, 0x1809, 0x1817, 0x1817, 0x1817, 0x1817, 0x1817, - 0x1828, 0x1828, 0x1834, 0x1834, 0x1834, 0x1834, 0x1842, 0x184e, - 0x185c, 0x186e, 0x18a3, 0x18b5, 0x18b5, 0x18c3, 0x18cf, 0x18d5, - 0x18d5, 0x18d5, 0x18d5, 0x18d5, 0x18d5, 0x18d5, 0x18e1, 0x18f3, - 0x1901, 0x190b, 0x190b, 0x191b, 0x191b, 0x192d, 0x192d, 0x1935, - // Entry 240 - 27F - 0x1935, 0x1935, 0x1941, 0x194b, 0x194b, 0x197f, 0x198d, 0x198d, - 0x198d, 0x198d, 0x19cb, 0x19d3, 0x19fd, 0x1a09, 0x1a41, 0x1a41, - 0x1a68, 0x1aa6, 0x1ad5, 0x1afc, 0x1b25, 0x1b52, 0x1b89, 0x1bb2, - 0x1bdd, 0x1bdd, 0x1c06, 0x1c33, 0x1c51, 0x1c67, 0x1c98, 0x1cc9, - 0x1cf0, 0x1d10, 0x1d37, 0x1d5e, 0x1d87, - }, - }, - { // bem - "Ichi AkanIchi AmhariIchi ArabIchi BelarusIchi BulgarianiIchi BengaliIchi" + - " ChekiIchi JemaniIchi GrikiIchi SunguIchi SpanishiIchi PesiaIchi Fre" + - "nchiIchi HausaIchi HinduIchi HangarianIchi IndonesianiIchi IboIchi I" + - "talianiIchi JapanisiIchi JavanisiIchi KhmerIchi KorianiIchi Maleshan" + - "iIchi BurmaIchi NepaliIchi DachiIchi PunjabiIchi PolishiIchi Potogis" + - "iIchi RomanianiIchi RusianiIchi RwandaIchi SomaliaIchi SwideniIchi T" + - "amilIchi ThaiIchi TakishiIchi UkranianiIchi UruduIchi VietinamuIchi " + - "YorubaIchi ChainisiIchi ZuluIchibemba", - []uint16{ // 219 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0014, 0x0014, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0029, 0x0038, - 0x0038, 0x0038, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0063, 0x006d, 0x006d, 0x007a, - 0x007a, 0x007a, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x009a, - 0x009a, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00b2, 0x00b2, 0x00b2, - // Entry 40 - 7F - 0x00b2, 0x00c2, 0x00c2, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, - 0x00d7, 0x00d7, 0x00e4, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, - 0x00f1, 0x00f1, 0x00fb, 0x00fb, 0x0107, 0x0107, 0x0107, 0x0107, - 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, - 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, - 0x0107, 0x0107, 0x0107, 0x0115, 0x0115, 0x011f, 0x011f, 0x011f, - 0x012a, 0x012a, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0140, 0x0140, 0x014c, - // Entry 80 - BF - 0x014c, 0x0159, 0x0159, 0x0159, 0x0159, 0x0167, 0x0173, 0x017e, - 0x017e, 0x017e, 0x017e, 0x017e, 0x017e, 0x017e, 0x017e, 0x017e, - 0x017e, 0x017e, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, - 0x0196, 0x0196, 0x01a0, 0x01a0, 0x01a0, 0x01a9, 0x01a9, 0x01a9, - 0x01a9, 0x01a9, 0x01b5, 0x01b5, 0x01b5, 0x01b5, 0x01b5, 0x01c3, - 0x01cd, 0x01cd, 0x01cd, 0x01db, 0x01db, 0x01db, 0x01db, 0x01db, - 0x01db, 0x01e6, 0x01e6, 0x01f3, 0x01fc, 0x01fc, 0x01fc, 0x01fc, - 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, - // Entry C0 - FF - 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, - 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, - 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, - 0x01fc, 0x01fc, 0x0205, - }, - }, - { // bez - "HiakanHiamhariHiharabuHibelarusiHibulgariaHibanglaHichekiHijerumaniHigir" + - "ikiHiingerezaHihispaniaHiajemiHifaransaHihausaHihindiHihungariHiindo" + - "nesiaHiiboHiitalianoHijapaniHijavaHikambodiaHikoreaHimalesiaHiburmaH" + - "inepaliHiholanziHipunjabiHipolandiHilenoHilomaniaHilusiHinyarwandaHi" + - "somaliHiswidiHitamilHitailandHitulukiHiukraniaHiurduHivietinamuHiyor" + - "ubaHichinaHizuluHibena", - []uint16{ // 221 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0020, 0x002a, - 0x002a, 0x002a, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0055, 0x0055, 0x005f, - 0x005f, 0x005f, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x006f, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0076, - 0x0076, 0x007d, 0x007d, 0x007d, 0x007d, 0x0086, 0x0086, 0x0086, - // Entry 40 - 7F - 0x0086, 0x0091, 0x0091, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, - 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, - 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, - // Entry 80 - BF - 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, - 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, - 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, - 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0131, 0x0131, 0x0131, - 0x0131, 0x0131, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0142, - 0x0148, 0x0148, 0x0148, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, - 0x0153, 0x015b, 0x015b, 0x0162, 0x0168, 0x0168, 0x0168, 0x0168, - 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, - // Entry C0 - FF - 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, - 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, - 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, - 0x0168, 0x0168, 0x0168, 0x0168, 0x016e, - }, - }, - { // bg - bgLangStr, - bgLangIdx, - }, - { // bm - "akankanamarikikanlarabukanbiyelorisikanbuligarikanbamanakanbɛngalikancɛk" + - "ikanalimaɲikangɛrɛsikanangilɛkanesipaɲolkanperisanikantubabukanawusa" + - "kaninidikanoŋirikanƐndonezikanigibokanitalikanzapɔnekanjavanekankamb" + - "ojikankorekanmalɛzikanbirimanikannepalekanolandekanpɛnijabikanpolone" + - "kanpɔritigalikanrumanikanirisikanruwandakansomalikansuwɛdikantamulik" + - "antayikanturikikanukɛrɛnikanurudukanwiyɛtinamukanyorubakansiniwakanz" + - "ulukan", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0011, 0x0011, - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x0027, 0x0032, - 0x0032, 0x003b, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0064, 0x006e, 0x006e, 0x007a, - 0x007a, 0x007a, 0x0085, 0x0085, 0x0085, 0x0085, 0x0085, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x0096, - 0x0096, 0x009e, 0x009e, 0x009e, 0x009e, 0x00a7, 0x00a7, 0x00a7, - // Entry 40 - 7F - 0x00a7, 0x00b3, 0x00b3, 0x00bb, 0x00bb, 0x00bb, 0x00bb, 0x00bb, - 0x00c3, 0x00c3, 0x00cd, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, - 0x00d6, 0x00d6, 0x00e0, 0x00e0, 0x00e7, 0x00e7, 0x00e7, 0x00e7, - 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, - 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, - 0x00e7, 0x00e7, 0x00e7, 0x00f1, 0x00f1, 0x00fc, 0x00fc, 0x00fc, - 0x0105, 0x0105, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, - 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x011a, 0x011a, 0x0123, - // Entry 80 - BF - 0x0123, 0x0131, 0x0131, 0x0131, 0x0131, 0x013a, 0x0142, 0x014c, - 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, - 0x014c, 0x014c, 0x0155, 0x0155, 0x0155, 0x0155, 0x0155, 0x0155, - 0x015f, 0x015f, 0x0168, 0x0168, 0x0168, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0184, - 0x018c, 0x018c, 0x018c, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, - 0x019a, 0x01a3, 0x01a3, 0x01ac, 0x01b3, - }, - }, - { // bn - bnLangStr, - bnLangIdx, - }, - { // bn-IN - "কোলোনিয়ান", - []uint16{ // 377 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 100 - 13F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 140 - 17F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x001e, - }, - }, - { // bo - "བོད་སྐད་རྫོང་ཁདབྱིན་ཇིའི་སྐད།ཧིན་དིཉི་ཧོང་སྐད་ནེ་པ་ལིཨུ་རུ་སུ་སྐད་རྒྱ་སྐ" + - "ད་ཟ་ཟའ་སྐད།དབྱིན་ཇིའི་སྐད། (ཁེ་ན་ཌ་)དབྱིན་ཇིའི་སྐད། (དབྱིན་ལན་)དབྱ" + - "ིན་ཇིའི་སྐད། (ཨ་རི་)", - []uint16{ // 598 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x002a, 0x002a, 0x002a, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - // Entry 40 - 7F - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, - 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, - 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, - 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, - 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, - 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, - 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, - // Entry 80 - BF - 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - // Entry C0 - FF - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - // Entry 100 - 13F - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - // Entry 140 - 17F - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - // Entry 180 - 1BF - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - // Entry 1C0 - 1FF - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - // Entry 200 - 23F - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - // Entry 240 - 27F - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00f9, 0x00f9, 0x00f9, - 0x00f9, 0x00f9, 0x00f9, 0x013e, 0x0189, 0x01c8, - }, - }, - {}, // bo-IN - { // br - "afarabkhazegavestegafrikaansakanamharegaragonegarabegasamegavaraymaraaze" + - "rbaidjanegbachkirbelarusegbulgaregbislamabambarabengalitibetanegbrez" + - "honegbosnegkatalanegtchetchenegchamorrukorsegkritchekegslavoneg iliz" + - "tchouvatchkembraegdanegalamanegdivehidzongkhaewegresianegsaoznegespe" + - "rantegspagnolegestonegeuskaregpersegfinnegfidjiegfaeroeggallegfrizeg" + - " ar Cʼhornôgiwerzhonegskoseggalizegguaranigujaratimanaveghaousahebra" + - "eghindihiri motukroateghaitieghungaregarmenianeghererointerlinguaind" + - "onezeginterlingueigboyieg Sichuaninupiaqidoislandegitalianeginuktitu" + - "tjapanegjavanegjorjianegkongokikuyukwanyamakazakkhmerkanaregkoreaneg" + - "kanourikashmirikurdegkerneveuregkirgizlatinluksembourgeggandalimbour" + - "geglingalalaoseglituanegluba-katangalatviegmalgachegmarshallmaorimak" + - "edonegmalayalammongolegmarathimalaysegmaltegbirmanegnauruegndebele a" + - "n Norzhnepalegndonganederlandegnorvegeg nynorsknorvegeg bokmålndebel" + - "e ar Sunavacʼhonyanjaokitanegojibwaoriyaosetegpunjabipalipolonegpach" + - "toportugalegkechuaegromañchegrundiroumanegrusianegkinyarwandasanskri" + - "tegsardegsindhisámi an Norzhsangosinghalegslovakegslovenegsamoanshon" + - "asomalialbanegserbegswatisotho ar Susundanegsvedegswahilitamilegtelo" + - "ugoutadjikthaitigrignaturkmenegtswanatongaturkegtsongatatartahitiane" + - "gouigouregukrainegourdououzbekegvendavietnamegvolapükwallonegwolofxh" + - "osayiddishyoroubazhuangsinaegzoulouegachinegacoliadangmeadygeiegarab" + - "eg Tuniziaafrihiliaghemainouegakadegalabamaegaleouteggegegaltaieg ar" + - " Suhensaoznegangikaarameegaraoukanegaraonaarapahoarabeg Aljeriaarawa" + - "kegarabeg Marokoarabeg Egiptasuyezh sinoù Amerikaasturianegawadhibal" + - "outchibalinegbavariegbasaabedawiegbembabenabaloutchi ar Cʼhornôgbhoj" + - "puribikolbinibrajbrahwegbodoakoosebouriatbugiblincaddokaribegatsamce" + - "buanochibchamariegchoktawchipewyancherokeecheyennekurdeg soranikopte" + - "gturkeg Krimeakachoubegdakotadargwadelawaredogribdinkadogriizelsorab" + - "egnederlandeg krenndyulaembuefikhenegiptegekajukelamegkrennsaoznegew" + - "ondofangfilipinegfinneg traoñienn an Tornefongalleg cajunkrenncʼhall" + - "eghencʼhallegarpitanegfrizeg an Norzhfrizeg ar Reterfrioulaneggagaga" + - "ouzegsinaeg Gangayogbayagezeggilbertegkrennalamaneg uhelhenalamaneg " + - "uhelgorontalogoteggrebohencʼhresianegalamaneg Suishaidasinaeg Hakkah" + - "awaieghiligaynonhmonguhelsorabegsinaeg Xianhupaibanibibioingouchegkr" + - "eoleg Jamaikayuzev-persegyuzev-arabegkarakalpakkabilegkachinkambakab" + - "ardegkabuverdianukhasikhotanegkimbundukonkanikosraekpellekaratchay-b" + - "alkarkareliegkurukhkolunegkutenailadinolahndalambalezgilingua franca" + - " novaliguriegmongoloziluba-lulualuisenolundaluolushailuyiasinaeg len" + - "negelmagahimaithilimasaimokshamandarmendemorisegkrenniwerzhonegmanch" + - "oumanipurimohawkmarieg ar Cʼhornôgyezhoù liesmuskogimirandegerzasina" + - "eg Min Nannapolitanegalamaneg izelnewariniasniueaoegnogayhennorsegno" + - "vialsotho an Norzhnewari klaselnyamwezinyankolenyoroosageturkeg otom" + - "anpangasinanpahlavipampangapapiamentopalaupikardegalamaneg Pennsylva" + - "niahenbersegfenikianegpiemontegpontegpohnpeihenbruseghenbrovañsegkic" + - "huaeg Chimborazorajasthanirapanuirarotongaromagnolegromboromaniegaro" + - "umanegrwasandaweyakoutegarameeg ar Samaritanedsasaksantalisikiliegsk" + - "otegsasaresegheniwerzhonegtachelitegshanarabeg Tchadsidamosámi ar Su" + - "sámi Luleåsámi Inarisámi Skoltsoninkesogdiegserersumeregkomoregsirie" + - "g klaselsiriegsileziegtoulouegterenotetumtigreanegtivtokelauklingont" + - "inglittamachegnyasa tongatok pisinturoyoegtsimshiantumbukatuvalutouv" + - "atamazigteg Kreizatlasoudmourtegougaritegumbunduyezh dianavvaivenezi" + - "egvepsegflandrezeg ar c’hornôgvotyakegvoroegwalserwalamowaraywashosi" + - "naeg WukalmoukmegrelegyaoyapegkantonegzapotegBlisszelandegzenagatama" + - "cheg Maroko standartzunidiyezharabeg modernalamaneg Aostriaalamaneg " + - "uhel Suissaozneg Aostraliasaozneg Kanadasaozneg Breizh-Veursaozneg A" + - "merikaspagnoleg Amerika latinspagnoleg Europaspagnoleg Mecʼhikogalle" + - "g Kanadagalleg Suissaksoneg izelflandrezegportugaleg Brazilportugale" + - "g Europamoldovegserb-kroategswahili Kongosinaeg eeunaetsinaeg hengou" + - "nel", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000c, 0x0013, 0x001c, 0x0020, 0x0027, 0x002f, - 0x0035, 0x003b, 0x003f, 0x0045, 0x0052, 0x0059, 0x0062, 0x006a, - 0x0071, 0x0078, 0x007f, 0x0088, 0x0091, 0x0097, 0x00a0, 0x00ab, - 0x00b3, 0x00b9, 0x00bc, 0x00c3, 0x00d0, 0x00da, 0x00e2, 0x00e7, - 0x00ef, 0x00f5, 0x00fd, 0x0100, 0x0109, 0x0110, 0x011a, 0x0123, - 0x012a, 0x0132, 0x0138, 0x0138, 0x013e, 0x0145, 0x014c, 0x0152, - 0x0166, 0x0170, 0x0176, 0x017d, 0x0184, 0x018c, 0x0193, 0x0199, - 0x01a0, 0x01a5, 0x01ae, 0x01b5, 0x01bc, 0x01c4, 0x01ce, 0x01d4, - // Entry 40 - 7F - 0x01df, 0x01e8, 0x01f3, 0x01f7, 0x0203, 0x020a, 0x020d, 0x0215, - 0x021e, 0x0227, 0x022e, 0x0235, 0x023e, 0x0243, 0x0249, 0x0251, - 0x0256, 0x0256, 0x025b, 0x0262, 0x026a, 0x0271, 0x0279, 0x027f, - 0x027f, 0x028a, 0x0290, 0x0295, 0x02a2, 0x02a7, 0x02b1, 0x02b8, - 0x02be, 0x02c6, 0x02d2, 0x02d9, 0x02e2, 0x02ea, 0x02ef, 0x02f8, - 0x0301, 0x0309, 0x0310, 0x0318, 0x031e, 0x0326, 0x032d, 0x033d, - 0x0344, 0x034a, 0x0355, 0x0365, 0x0375, 0x0382, 0x038b, 0x0391, - 0x0399, 0x039f, 0x039f, 0x03a4, 0x03aa, 0x03b1, 0x03b5, 0x03bc, - // Entry 80 - BF - 0x03c2, 0x03cc, 0x03d4, 0x03de, 0x03e3, 0x03eb, 0x03f3, 0x03fe, - 0x0408, 0x040e, 0x0414, 0x0422, 0x0427, 0x0430, 0x0438, 0x0440, - 0x0446, 0x044b, 0x0451, 0x0458, 0x045e, 0x0463, 0x046e, 0x0476, - 0x047c, 0x0483, 0x048a, 0x0492, 0x0498, 0x049c, 0x04a4, 0x04ad, - 0x04b3, 0x04b8, 0x04be, 0x04c4, 0x04c9, 0x04d3, 0x04dc, 0x04e4, - 0x04ea, 0x04f2, 0x04f7, 0x0500, 0x0508, 0x0510, 0x0515, 0x051a, - 0x0521, 0x0528, 0x052e, 0x0534, 0x053c, 0x0543, 0x0548, 0x054f, - 0x0557, 0x0565, 0x056d, 0x0572, 0x0579, 0x057f, 0x0588, 0x0590, - // Entry C0 - FF - 0x0595, 0x05a2, 0x05ac, 0x05b2, 0x05b9, 0x05c3, 0x05c9, 0x05d0, - 0x05de, 0x05de, 0x05e6, 0x05f3, 0x05ff, 0x0602, 0x0615, 0x061f, - 0x061f, 0x0625, 0x062e, 0x0635, 0x063d, 0x0642, 0x0642, 0x0642, - 0x0642, 0x064a, 0x064f, 0x064f, 0x0653, 0x0653, 0x0653, 0x066a, - 0x0672, 0x0677, 0x067b, 0x067b, 0x067b, 0x067b, 0x067b, 0x067b, - 0x067f, 0x0686, 0x068a, 0x0690, 0x0697, 0x069b, 0x069b, 0x069f, - 0x069f, 0x06a4, 0x06ab, 0x06ab, 0x06b0, 0x06b7, 0x06b7, 0x06be, - 0x06be, 0x06be, 0x06c4, 0x06c4, 0x06cb, 0x06d4, 0x06dc, 0x06e4, - // Entry 100 - 13F - 0x06f1, 0x06f7, 0x06f7, 0x0704, 0x0704, 0x070d, 0x0713, 0x0719, - 0x0719, 0x0721, 0x0721, 0x0727, 0x072c, 0x072c, 0x0731, 0x073c, - 0x073c, 0x073c, 0x074d, 0x074d, 0x0752, 0x0752, 0x0756, 0x075a, - 0x075a, 0x0764, 0x076a, 0x0770, 0x077c, 0x077c, 0x0782, 0x0782, - 0x0786, 0x078f, 0x07a9, 0x07ac, 0x07b8, 0x07c6, 0x07d2, 0x07db, - 0x07ea, 0x07f9, 0x0803, 0x0805, 0x080e, 0x0818, 0x081c, 0x0821, - 0x0821, 0x0826, 0x082f, 0x082f, 0x0841, 0x0851, 0x0851, 0x0851, - 0x085a, 0x085f, 0x0864, 0x0873, 0x0880, 0x0880, 0x0880, 0x0880, - // Entry 140 - 17F - 0x0880, 0x0885, 0x0891, 0x0898, 0x0898, 0x08a2, 0x08a2, 0x08a7, - 0x08b2, 0x08bd, 0x08c1, 0x08c5, 0x08cb, 0x08cb, 0x08d4, 0x08d4, - 0x08e3, 0x08e3, 0x08e3, 0x08e3, 0x08ef, 0x08fb, 0x08fb, 0x0905, - 0x090c, 0x0912, 0x0912, 0x0917, 0x0917, 0x091f, 0x091f, 0x091f, - 0x091f, 0x092b, 0x092b, 0x092b, 0x092b, 0x0930, 0x0938, 0x0938, - 0x0938, 0x0938, 0x0938, 0x0938, 0x0940, 0x0940, 0x0947, 0x094d, - 0x0953, 0x0963, 0x0963, 0x0963, 0x096b, 0x0971, 0x0971, 0x0971, - 0x0978, 0x0978, 0x097f, 0x0985, 0x0985, 0x098b, 0x0990, 0x0995, - // Entry 180 - 1BF - 0x09a7, 0x09af, 0x09af, 0x09af, 0x09af, 0x09b4, 0x09b8, 0x09b8, - 0x09b8, 0x09c2, 0x09c9, 0x09ce, 0x09d1, 0x09d7, 0x09dc, 0x09eb, - 0x09eb, 0x09eb, 0x09eb, 0x09f1, 0x09f9, 0x09f9, 0x09f9, 0x09fe, - 0x09fe, 0x0a04, 0x0a0a, 0x0a0f, 0x0a0f, 0x0a16, 0x0a25, 0x0a25, - 0x0a25, 0x0a25, 0x0a25, 0x0a2c, 0x0a34, 0x0a3a, 0x0a3a, 0x0a4e, - 0x0a4e, 0x0a5a, 0x0a61, 0x0a69, 0x0a69, 0x0a69, 0x0a69, 0x0a6d, - 0x0a6d, 0x0a7b, 0x0a86, 0x0a86, 0x0a93, 0x0a99, 0x0a9d, 0x0aa1, - 0x0aa5, 0x0aa5, 0x0aa5, 0x0aaa, 0x0ab3, 0x0ab9, 0x0ab9, 0x0ac7, - // Entry 1C0 - 1FF - 0x0ac7, 0x0ad4, 0x0adc, 0x0ae4, 0x0ae9, 0x0ae9, 0x0aee, 0x0afb, - 0x0b05, 0x0b0c, 0x0b14, 0x0b1e, 0x0b23, 0x0b2b, 0x0b2b, 0x0b40, - 0x0b40, 0x0b49, 0x0b49, 0x0b53, 0x0b5c, 0x0b62, 0x0b69, 0x0b72, - 0x0b7f, 0x0b7f, 0x0b92, 0x0b9c, 0x0ba3, 0x0bac, 0x0bb6, 0x0bb6, - 0x0bbb, 0x0bc3, 0x0bc3, 0x0bc3, 0x0bc3, 0x0bcc, 0x0bcf, 0x0bd6, - 0x0bde, 0x0bf4, 0x0bf4, 0x0bf9, 0x0c00, 0x0c00, 0x0c00, 0x0c00, - 0x0c08, 0x0c0e, 0x0c17, 0x0c17, 0x0c17, 0x0c17, 0x0c17, 0x0c17, - 0x0c17, 0x0c24, 0x0c24, 0x0c2e, 0x0c32, 0x0c3e, 0x0c44, 0x0c44, - // Entry 200 - 23F - 0x0c44, 0x0c4f, 0x0c5b, 0x0c66, 0x0c71, 0x0c78, 0x0c7f, 0x0c7f, - 0x0c84, 0x0c84, 0x0c84, 0x0c84, 0x0c84, 0x0c8b, 0x0c92, 0x0c9f, - 0x0ca5, 0x0cad, 0x0cb5, 0x0cb5, 0x0cb5, 0x0cbb, 0x0cc0, 0x0cc9, - 0x0ccc, 0x0cd3, 0x0cd3, 0x0cda, 0x0ce1, 0x0ce1, 0x0ce9, 0x0cf4, - 0x0cfd, 0x0d05, 0x0d05, 0x0d05, 0x0d0e, 0x0d0e, 0x0d15, 0x0d1b, - 0x0d1b, 0x0d20, 0x0d35, 0x0d3f, 0x0d48, 0x0d4f, 0x0d5a, 0x0d5d, - 0x0d65, 0x0d6b, 0x0d84, 0x0d84, 0x0d8c, 0x0d92, 0x0d92, 0x0d98, - 0x0d9e, 0x0da3, 0x0da8, 0x0da8, 0x0db1, 0x0db8, 0x0dc0, 0x0dc0, - // Entry 240 - 27F - 0x0dc3, 0x0dc8, 0x0dc8, 0x0dc8, 0x0dc8, 0x0dd0, 0x0dd7, 0x0ddc, - 0x0de4, 0x0dea, 0x0e02, 0x0e06, 0x0e0c, 0x0e0c, 0x0e19, 0x0e19, - 0x0e29, 0x0e3b, 0x0e4c, 0x0e5a, 0x0e6d, 0x0e7c, 0x0e93, 0x0ea3, - 0x0eb6, 0x0eb6, 0x0ec3, 0x0ece, 0x0edb, 0x0ee5, 0x0ef6, 0x0f07, - 0x0f0f, 0x0f1b, 0x0f28, 0x0f36, 0x0f46, - }, - }, - { // brx - "अब्खाज़ियन्अवस्तन्अफ्रीकीअकनअम्हारिक्आर्गोनीअरबीअसामीअवारिक्आयमाराअज़रबै" + - "जानीबशख़िर्बैलोरूसियन्बल्गैरियन्बिस्लामाबांबाराबंगलातिब्बतीब्रटोंब" + - "ोस्नियाईकातालान्चेचेन्चामोरोकोर्सीकन्क्रीचेक्चर्च स्लाविक्चुवाश्वै" + - "ल्श्डैनीश्ज़र्मनदीवेहीभुटानीएवेग्रीकअंग्रेज़ीएस्पेरान्तोस्पैनिशऐस्" + - "टोनियन्बास्क्फार्सीफुलाह्फिनिश्फ़ीजीफिरोज़ीफ्रांसीसीपश्चीमी फ्रीज़" + - "ियन्आईरिशस्कॉट्स् गैलिक्गैलिशियन्गुआरानीगुजरातीमैंक्सहउसाहिब्रुहिं" + - "दीहीरी मोटुक्रोएशन्हाईशीयन्हंगैरीयन्अरमेनियन्हेरेरोईन्टरलिंग्वाइन्" + - "डोनेशियन्ईन्टरलिंग्वेईग्बोसीचुआन् यीइनुपियाक़्ईडोआईस्लैंडिक्ईटालिय" + - "न्इनूक्टीटूत्जापानीजावानीसजॉर्जियन्कॉंगोकिकुयुकुआनयामाक़ज़ाख़्कलाल" + - "ीसुतख्मेरकन्नड्कोरीयन्कनुरीकश्मिरीकुर्दीकोमीकौर्नवॉलीकिरग़ीज़्लैटी" + - "न्लुक्समबुर्गीगांडालींबुर्गीलिंगालालाओसीयन्लिथुआनियन्लुबा कटांगाला" + - "टवियन् (लैट्टीश)मालागासीमार्शलीमाओरीमैसेडोनियन्मलयालममोंगोलियनमराठ" + - "ीमलायमालटीज़्बर्मीनाऊरूउत्तर न्दबेलेनेपालीन्डोंगाडच्नॉर्वेजियन् नी" + - "नॉर्स्क्नोर्वेगी बोकमालदक्षिणी न्दबेलेनावाहोन्यानजाओक्सीतानओहीबवाओ" + - "रोमो (अफ़ान)उड़ियाओस्सेटीपंजाबीपालीपोलिशपख़्तुपुर्तगालीक्वेचुआरेह्" + - "टो-रोमान्सकिरून्दीरूमानीयन्रुसीकिन्यारुआण्डासंस्कृत्सार्दीनीसिंधीउ" + - "त्तरी सामीसांग्रोसींहालास्लोवाक्स्लोवेनियन्सामोअनशोनासोमालीआल्बेनि" + - "यन्सर्बियन्स्वाटिसुन्दानीस्वीडिशस्वाहिलीतमिळतेलुगुताजिक्थाईतिग्रीन" + - "्यातुर्कमेनत्स्वानाटॉंगातुर्कीसोंगाटाटर्टाहिटिउईग़ुरयूक्रेनियन्ऊर्" + - "दुउज़बेक्वेंडावियेतनामीवोलापोकवालुनवोलोफख़ोसायीद्दीशयोरूबाज़ुआंगची" + - "नीज़ुलूअचेहनीअकोलीअडांगमेअडीगेअफ्रीहीलीऐनूअकाडिनीअलुटपुरानी अंग्रे" + - "ज़ीअंगीकाअरामाईकअरापाहोअरावाकअवधीबलूचीबालिनीबास्क़्बेजाबेंबाभोजपुर" + - "ीबिकोल्बिनीसीकसीकाब्रजबड़ोबुरियातबुगीनीब्लीनकाद्दौकारीब्आत्समचेबुआ" + - "नोचीबचाचगताईचुकेसेमारीचीनूक् जार्गन्चौक्टोचिपेवियान्चीरोकीशायान्कॉ" + - "प्टीक्तुर्की क्रिमियाकाशुबियान्डकौटादर्गवादलावार्स्लेव्डोगरीब्डींग" + - "काडोगरीसोर्बियन्डुआलामध्य डचद्युआलाएफीक्प्राचीन मिस्रीएकाजुकएलामीम" + - "ध्य अंग्रेज़ीएवौंडोफाँग्फिलिपिनोफोनमध्य फ्रांसीसीपुरानी फ्रांसीसीउ" + - "त्तरी फ्रीज़ियन्पूर्वी फ्रीज़ियन्फ्रीउलीअन्गागायोग्बायागीज़्गीलबर्" + - "टीमध्य उच्चस्तरी जर्मनपुरानी उच्चस्तरी जर्मनगाँडीगोरंटालोगॉथिकग्रे" + - "बोप्राचीन यूनानीस्वीस जर्मनग्वीचलीनहईडाहवाईअनहीलीगैनोनहीत्तीह्मौंग" + - "ऊपरी सौर्बियनहूपाईबान्ईलोकोईंगुषलोजबानयहुदी फ़ारसीयहुदी अरबीकारा क" + - "लपककाबील्कचीन्जुकंबाकावीकबार्डी भाषात्याप्कोरोख़ासीख़ोतानीकींबुंडु" + - "कोंकणीकोस्राईयन्क्पेलेकराचय् बलकार्करेलियन्कुरुख़्कुमीक्कुतेनाईलाड" + - "़ीनोलाह्डांलांबालेज़गीयानमोंगोलोज़ीलुबा लुलुआलुईसेनोलुंडालुओलुशाईम" + - "ादुरीमघीमैथीलीमक्सरमांडींगोमसाईमोक्षामंदारमेंदेमध्य आईरीश भाषामीकम" + - "ाकमिनंगकाबाउमांचुमणीपुरीमोहोकमोस्सीक्रीकमीरांडीमारवाड़ीऐर्ज़ियानेआ" + - "पोलिटननीजी स्तरिय जर्मननेवारीनियासनियुइआननोगाईपुरानी नॉर्स्न्गकोपु" + - "रानी नेवारीन्यामवेज़ीन्यानकोलेन्यौरोन्ज़ीमाओसेजतुर्की ओटोमानपांगास" + - "ीननपहलवीपंपंगापापीआमेन्तोपालाऊपुरानी फ़ारसीफीनीसीपोहनपीपुरानी प्रो" + - "वाँसालराजस्थानीरापानुईरारोटोंगारुमानीआरोमानीसंडावेयकुट्समारीती आरा" + - "माईक़सासकसंतालीसीसीलीअनस्कॉटसेलकुपपुरानी आईरीशशानसीदामोपश्चीमी साम" + - "ीलुले सामीईनारी सामीस्कोल्ट् सामीसोनिंगकेसोगडीयनस्रनान् टॉंगोसेरेर" + - "सुकुमासुसुसुमेरिअनपारंपरीक सिरिआकसिरिआकतीमनेतेरेनोतेतुमटीग्रेटीव्ट" + - "ोकेलौक्लींगदनट्लिंगीततमाशेकन्यासा टॉंगातोक पिसीनत्सीमशीआन्टुँबुकाट" + - "ुवालुटुवीउड़मुर्तउगारितीउंबुंडुरुटवाईवोटीकवालामोवारयवाशोकालमीकयाओय" + - "ापीज़ज़ापोतेकब्लीस चिन्हज़ेनागाज़ुनीरिक्तज़ाज़ाजर्मन (ऑस्ट्रिया)उच" + - "्च स्तरिय स्वीस जर्मनअंग्रेज़ी (ऑस्ट्रेलिया का)अंग्रेज़ी (कनाडाई)अ" + - "ंग्रेजी (ब्रिटिश)अंग्रेज़ी (अमरिकी)लैटिन अमरिकी स्पैनिशईवेरियाई स्" + - "पैनिशफ्रांसीसी (कनाडाई)फ्रांसीसी (स्वीस)फ्लेमीमोल्डेवियन्सर्बो-क्र" + - "ोएशन्चीनी (सरलीकृत)चीनी (पारम्परिक)", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0021, 0x0036, 0x004b, 0x0054, 0x006f, 0x0084, - 0x0090, 0x009f, 0x00b4, 0x00c6, 0x00e4, 0x00f9, 0x011a, 0x0138, - 0x0150, 0x0165, 0x0174, 0x0189, 0x019b, 0x01b6, 0x01ce, 0x01e0, - 0x01f2, 0x020d, 0x0219, 0x0225, 0x024a, 0x025c, 0x026e, 0x0280, - 0x0292, 0x02a4, 0x02b6, 0x02bf, 0x02ce, 0x02e9, 0x030a, 0x031f, - 0x033d, 0x034f, 0x0361, 0x0373, 0x0385, 0x0394, 0x03a9, 0x03c4, - 0x03f8, 0x0407, 0x0432, 0x044d, 0x0462, 0x0477, 0x0489, 0x0495, - 0x04a7, 0x04b6, 0x04cf, 0x04e7, 0x04ff, 0x051a, 0x0535, 0x0547, - // Entry 40 - 7F - 0x056b, 0x058f, 0x05b3, 0x05c2, 0x05de, 0x05fc, 0x0605, 0x0626, - 0x063e, 0x065f, 0x0671, 0x0686, 0x06a1, 0x06b0, 0x06c2, 0x06da, - 0x06f2, 0x070a, 0x0719, 0x072b, 0x0740, 0x074f, 0x0764, 0x0776, - 0x0782, 0x079d, 0x07b8, 0x07ca, 0x07ee, 0x07fd, 0x0818, 0x082d, - 0x0845, 0x0863, 0x0882, 0x08b2, 0x08ca, 0x08df, 0x08ee, 0x090f, - 0x0921, 0x093c, 0x094b, 0x0957, 0x096f, 0x097e, 0x098d, 0x09b2, - 0x09c4, 0x09d9, 0x09e2, 0x0a22, 0x0a4d, 0x0a78, 0x0a8a, 0x0a9f, - 0x0ab7, 0x0ac9, 0x0aea, 0x0afc, 0x0b11, 0x0b23, 0x0b2f, 0x0b3e, - // Entry 80 - BF - 0x0b50, 0x0b6b, 0x0b80, 0x0ba8, 0x0bc0, 0x0bdb, 0x0be7, 0x0c0e, - 0x0c26, 0x0c3e, 0x0c4d, 0x0c6c, 0x0c81, 0x0c96, 0x0cae, 0x0ccf, - 0x0ce1, 0x0ced, 0x0cff, 0x0d1d, 0x0d35, 0x0d47, 0x0d47, 0x0d5f, - 0x0d74, 0x0d8c, 0x0d98, 0x0daa, 0x0dbc, 0x0dc5, 0x0de3, 0x0dfb, - 0x0e13, 0x0e22, 0x0e34, 0x0e43, 0x0e52, 0x0e64, 0x0e76, 0x0e97, - 0x0ea6, 0x0ebb, 0x0eca, 0x0ee5, 0x0efa, 0x0f09, 0x0f18, 0x0f27, - 0x0f3c, 0x0f4e, 0x0f60, 0x0f6c, 0x0f7b, 0x0f8d, 0x0f9c, 0x0fb1, - 0x0fc0, 0x0fc0, 0x0fdb, 0x0fdb, 0x0fe4, 0x0ff9, 0x0ff9, 0x1005, - // Entry C0 - FF - 0x1005, 0x1005, 0x1033, 0x1045, 0x105a, 0x105a, 0x105a, 0x106f, - 0x106f, 0x106f, 0x1081, 0x1081, 0x1081, 0x1081, 0x1081, 0x1081, - 0x1081, 0x108d, 0x109c, 0x10ae, 0x10ae, 0x10c3, 0x10c3, 0x10c3, - 0x10c3, 0x10cf, 0x10de, 0x10de, 0x10de, 0x10de, 0x10de, 0x10de, - 0x10f3, 0x1105, 0x1111, 0x1111, 0x1111, 0x1126, 0x1126, 0x1126, - 0x1132, 0x1132, 0x113e, 0x113e, 0x1153, 0x1165, 0x1165, 0x1174, - 0x1174, 0x1186, 0x1198, 0x1198, 0x11a7, 0x11bc, 0x11bc, 0x11cb, - 0x11da, 0x11ec, 0x11f8, 0x1220, 0x1232, 0x1250, 0x1262, 0x1274, - // Entry 100 - 13F - 0x1274, 0x128c, 0x128c, 0x12b7, 0x12b7, 0x12d5, 0x12e4, 0x12f6, - 0x12f6, 0x130b, 0x131d, 0x1332, 0x1344, 0x1344, 0x1353, 0x136e, - 0x136e, 0x137d, 0x1390, 0x1390, 0x13a5, 0x13a5, 0x13a5, 0x13b4, - 0x13b4, 0x13dc, 0x13ee, 0x13fd, 0x1425, 0x1425, 0x1437, 0x1437, - 0x1446, 0x145e, 0x145e, 0x1467, 0x1467, 0x148f, 0x14bd, 0x14bd, - 0x14ee, 0x151f, 0x153d, 0x1543, 0x1543, 0x1543, 0x154f, 0x1561, - 0x1561, 0x1570, 0x1588, 0x1588, 0x15c0, 0x15fe, 0x15fe, 0x160d, - 0x1625, 0x1634, 0x1646, 0x166e, 0x168d, 0x168d, 0x168d, 0x168d, - // Entry 140 - 17F - 0x16a5, 0x16b1, 0x16b1, 0x16c3, 0x16c3, 0x16de, 0x16f0, 0x1702, - 0x1727, 0x1727, 0x1733, 0x1742, 0x1742, 0x1751, 0x1760, 0x1760, - 0x1760, 0x1772, 0x1772, 0x1772, 0x1794, 0x17b0, 0x17b0, 0x17c9, - 0x17db, 0x17ea, 0x17f0, 0x17fc, 0x1808, 0x182a, 0x182a, 0x183c, - 0x183c, 0x183c, 0x183c, 0x1848, 0x1848, 0x1857, 0x186c, 0x186c, - 0x186c, 0x186c, 0x186c, 0x186c, 0x1884, 0x1884, 0x1896, 0x18b4, - 0x18c6, 0x18eb, 0x18eb, 0x18eb, 0x1903, 0x1918, 0x1918, 0x1918, - 0x1918, 0x192a, 0x193f, 0x1954, 0x1954, 0x1969, 0x1978, 0x1993, - // Entry 180 - 1BF - 0x1993, 0x1993, 0x1993, 0x1993, 0x1993, 0x19a2, 0x19b1, 0x19b1, - 0x19b1, 0x19cd, 0x19e2, 0x19f1, 0x19fa, 0x1a09, 0x1a09, 0x1a09, - 0x1a09, 0x1a1b, 0x1a1b, 0x1a24, 0x1a36, 0x1a45, 0x1a5d, 0x1a69, - 0x1a69, 0x1a7b, 0x1a8a, 0x1a99, 0x1a99, 0x1a99, 0x1ac2, 0x1ac2, - 0x1ac2, 0x1ad4, 0x1af2, 0x1b01, 0x1b16, 0x1b25, 0x1b37, 0x1b37, - 0x1b37, 0x1b37, 0x1b46, 0x1b5b, 0x1b73, 0x1b73, 0x1b73, 0x1b8b, - 0x1b8b, 0x1b8b, 0x1ba6, 0x1ba6, 0x1bd5, 0x1be7, 0x1bf6, 0x1c0b, - 0x1c0b, 0x1c0b, 0x1c0b, 0x1c1a, 0x1c3f, 0x1c3f, 0x1c4e, 0x1c4e, - // Entry 1C0 - 1FF - 0x1c4e, 0x1c73, 0x1c91, 0x1cac, 0x1cbe, 0x1cd3, 0x1cdf, 0x1d04, - 0x1d1f, 0x1d2e, 0x1d40, 0x1d61, 0x1d70, 0x1d70, 0x1d70, 0x1d70, - 0x1d70, 0x1d95, 0x1d95, 0x1da7, 0x1da7, 0x1da7, 0x1db9, 0x1db9, - 0x1dea, 0x1dea, 0x1dea, 0x1e05, 0x1e1a, 0x1e35, 0x1e35, 0x1e35, - 0x1e35, 0x1e47, 0x1e47, 0x1e47, 0x1e47, 0x1e5c, 0x1e5c, 0x1e6e, - 0x1e7d, 0x1eab, 0x1eab, 0x1eb7, 0x1ec9, 0x1ec9, 0x1ec9, 0x1ec9, - 0x1ee1, 0x1ef0, 0x1ef0, 0x1ef0, 0x1ef0, 0x1ef0, 0x1ef0, 0x1f02, - 0x1f02, 0x1f24, 0x1f24, 0x1f24, 0x1f2d, 0x1f2d, 0x1f3f, 0x1f3f, - // Entry 200 - 23F - 0x1f3f, 0x1f61, 0x1f7a, 0x1f96, 0x1fbb, 0x1fd3, 0x1fe8, 0x200d, - 0x201c, 0x201c, 0x201c, 0x202e, 0x203a, 0x2052, 0x2052, 0x207d, - 0x208f, 0x208f, 0x208f, 0x209e, 0x209e, 0x20b0, 0x20bf, 0x20d1, - 0x20dd, 0x20ef, 0x20ef, 0x2107, 0x211f, 0x211f, 0x2131, 0x2153, - 0x216c, 0x216c, 0x216c, 0x216c, 0x218a, 0x218a, 0x219f, 0x21b1, - 0x21b1, 0x21bd, 0x21bd, 0x21d5, 0x21ea, 0x21ff, 0x2208, 0x2211, - 0x2211, 0x2211, 0x2211, 0x2211, 0x2220, 0x2220, 0x2220, 0x2220, - 0x2232, 0x223e, 0x224a, 0x224a, 0x224a, 0x225c, 0x225c, 0x225c, - // Entry 240 - 27F - 0x2265, 0x2277, 0x2277, 0x2277, 0x2277, 0x2277, 0x228f, 0x22ae, - 0x22ae, 0x22c3, 0x22c3, 0x22d2, 0x22e1, 0x22f3, 0x22f3, 0x22f3, - 0x2320, 0x235f, 0x23a5, 0x23d5, 0x2405, 0x2435, 0x246d, 0x249b, - 0x249b, 0x249b, 0x24cb, 0x24f8, 0x24f8, 0x250a, 0x250a, 0x250a, - 0x252b, 0x2553, 0x2553, 0x2577, 0x25a1, - }, - }, - { // bs - "afarskiabhaskiavestanskiafrikansakanamharskiaragonskiarapskiasamskiavars" + - "kiajmaraazerbejdžanskibaškirskibjeloruskibugarskibislamabambarabenga" + - "lskitibetanskibretonskibosanskikatalonskičečenskičamorokorzikanskikr" + - "ičeškistaroslavenskičuvaškivelškidanskinjemačkidivehidžongaevegrčkie" + - "ngleskiesperantošpanskiestonskibaskijskiperzijskifulahfinskifidžijsk" + - "ifarskifrancuskizapadni frizijskiirskiškotski galskigalicijskigvaran" + - "igudžaratimankshausahebrejskihinduhiri motuhrvatskihaićanskimađarski" + - "armenskihererointerlingvaindonezijskiinterlingveigbosičuan jiinupiak" + - "idoislandskitalijanskiinuktitutjapanskijavanskigruzijskikongokikujuk" + - "uanjamakazačkikalalisutskikmerskikanadakorejskikanurikašmirskikurdsk" + - "ikomikornskikirgiškilatinskiluksemburškigandalimburškilingalalaoškil" + - "itvanskiluba-katangalatvijskimalagaškimaršalskimaorskimakedonskimala" + - "jalammongolskimaratimalajskimalteškiburmanskinaurusjeverni ndebelene" + - "palskindongaholandskinorveški (Nynorsk)norveški (Bokmal)južni ndebel" + - "enavahonjanjaoksitanskiojibvaoromoorijskiosetskipandžapskipalipoljsk" + - "ipaštuportugalskikečuareto-romanskirundirumunskiruskikinjarvandasans" + - "kritsardinijskisindisjeverni samisangosinhaleškislovačkislovenskisam" + - "oanskišonasomalskialbanskisrpskisvatijužni sotosundanskišvedskisvahi" + - "litamilskitelugutadžičkitajlandskitigrinjaturkmenskitsvanatonganskit" + - "urskitsongatatarskitahićanskiujgurskiukrajinskiurduuzbečkivendavijet" + - "namskivolapukvalunvolofhosajidišjorubanskizuangkineskizuluacehneskia" + - "koliadangmejskiadigejskiafrihiliaghemainuakadijskialeutskijužni alta" + - "istaroengleskiangikaaramejskimapuškiarapahoaravakasuasturijskiavadhi" + - "balučibalinezijskibasabamunskigomalabejabembabenabafutzapadni belučk" + - "ibojpuribikolbinikomsiksikabrajbodoakoskiburiatbugiškibulublinmedumb" + - "akadokaripskikajugaatsamcebuanočigačibčačagataičukeskimaričinukski ž" + - "argončoktavčipvijanskičirokičejenskicentralnokurdskikoptskikrimski t" + - "urskiseselva kreolski francuskikašubijanskidakotadargvataitadelavers" + - "lavedogribdinkazarmadogridonjolužičkosrpskidualasrednjovjekovni hola" + - "ndskijola-fonidiuladazagaembuefikstaroegipatskiekajukelamitskisrednj" + - "ovjekovni engleskievondofangfilipinofonsrednjovjekovni francuskistar" + - "ofrancuskisjeverni frizijskiistočnofrizijskifriulijskigagagauškigajo" + - "gbajastaroetiopskigilbertskisrednjovjekovni gornjonjemačkistaronjema" + - "čkigondigorontalogotskigrebostarogrčkinjemački (Švicarska)gusigviči" + - "nhaidahavajskihiligajnonhititehmonggornjolužičkosrpskihupaibanibibio" + - "ilokoingušetskilojbanngombamakamejudeo-perzijskijudeo-arapskikara-ka" + - "lpakkabilekačinkajukambakavikabardijskikanembutjapmakondezelenortski" + - "korokasikotanizijskikojra činikakokalenjinkimbundukomi-permskikonkan" + - "ikosrejskikpelekaračaj-balkarkriokarelijskikuruškišambalabafiakelnsk" + - "ikumikkutenailadinolangilandalambalezgijskilakotamongolozisjeverni l" + - "uriluba-lulualuisenolundaluomizoluhijamadureškimafamagahimaitilimaka" + - "sarmandingomasaimabamokšamandarmendemerumauricijski kreolskisrednjov" + - "jekovni irskimakuva-metometamikmakminangkabaumančumanipurimohavkmosi" + - "mundangviše jezikakriškimirandeškimarvarimjeneerzijamazanderanskinap" + - "olitanskinamadonjonjemačkinevariniasniueankvasiongiembonnogaistarono" + - "rdijskinkosjeverni sotonuerklasični nevarinjamvezinjankolenjoronzima" + - "osageosmanski turskipangasinskipahlavipampangapapiamentopalauanskini" + - "gerijski pidžinstaroperzijskifeničanskiponpejskipruskistaroprovansal" + - "skikičerajastanirapanuirarotonganromboromaniarumunskiruasandavejakut" + - "skisamaritanski aramejskisamburusasaksantalingambajsangusicilijanski" + - "škotskijužni kurdskisenekasenaselkupkojraboro senistaroirskitahelhi" + - "tšančadski arapskisidamojužni samilule samiinari samiskolt samisonin" + - "kesogdiensrananski tongoserersahosukumasususumerskikomorskiklasični " + - "sirijskisirijskitimnetesoterenotetumtigretivtokelauklingonskitlingit" + - "tamašeknjasa tongatok pisintarokotsimšiantumbukatuvalutasavaktuvinij" + - "skicentralnoatlaski tamazigtudmurtugaritskiumbundukorijenskivaivotsk" + - "ivunjovalservalamovarejvašovarlpirikalmiksogajaojapeškijangbenjembak" + - "antonskizapotečkiblis simbolizenagastandardni marokanski tamazigtzun" + - "ibez lingvističkog sadržajazazamoderni standardni arapskigornjonjema" + - "čki (Švicarska)donjosaksonskiflamanskimoldavskisrpskohrvatskikinesk" + - "i (pojednostavljeni)kineski (tradicionalni)", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0007, 0x000e, 0x0018, 0x0020, 0x0024, 0x002c, 0x0035, - 0x003c, 0x0043, 0x004a, 0x0050, 0x005f, 0x0069, 0x0073, 0x007b, - 0x0082, 0x0089, 0x0092, 0x009c, 0x00a5, 0x00ad, 0x00b7, 0x00c1, - 0x00c8, 0x00d3, 0x00d6, 0x00dd, 0x00eb, 0x00f4, 0x00fb, 0x0101, - 0x010a, 0x0110, 0x0117, 0x011a, 0x0120, 0x0128, 0x0131, 0x0139, - 0x0141, 0x014a, 0x0153, 0x0158, 0x015e, 0x0168, 0x016e, 0x0177, - 0x0188, 0x018d, 0x019c, 0x01a6, 0x01ad, 0x01b7, 0x01bc, 0x01c1, - 0x01ca, 0x01cf, 0x01d8, 0x01e0, 0x01ea, 0x01f3, 0x01fb, 0x0201, - // Entry 40 - 7F - 0x020c, 0x0218, 0x0223, 0x0227, 0x0231, 0x0238, 0x023b, 0x0244, - 0x024e, 0x0257, 0x025f, 0x0267, 0x0270, 0x0275, 0x027b, 0x0283, - 0x028b, 0x0297, 0x029e, 0x02a4, 0x02ac, 0x02b2, 0x02bc, 0x02c3, - 0x02c7, 0x02ce, 0x02d7, 0x02df, 0x02ec, 0x02f1, 0x02fb, 0x0302, - 0x0309, 0x0312, 0x031e, 0x0327, 0x0331, 0x033b, 0x0342, 0x034c, - 0x0355, 0x035e, 0x0364, 0x036c, 0x0375, 0x037e, 0x0383, 0x0393, - 0x039b, 0x03a1, 0x03aa, 0x03bd, 0x03cf, 0x03dd, 0x03e3, 0x03e9, - 0x03f3, 0x03f9, 0x03fe, 0x0405, 0x040c, 0x0417, 0x041b, 0x0422, - // Entry 80 - BF - 0x0428, 0x0433, 0x0439, 0x0446, 0x044b, 0x0453, 0x0458, 0x0463, - 0x046b, 0x0476, 0x047b, 0x0488, 0x048d, 0x0498, 0x04a1, 0x04aa, - 0x04b3, 0x04b8, 0x04c0, 0x04c8, 0x04ce, 0x04d3, 0x04de, 0x04e7, - 0x04ef, 0x04f6, 0x04fe, 0x0504, 0x050e, 0x0518, 0x0520, 0x052a, - 0x0530, 0x0539, 0x053f, 0x0545, 0x054d, 0x0558, 0x0560, 0x056a, - 0x056e, 0x0576, 0x057b, 0x0586, 0x058d, 0x0592, 0x0597, 0x059b, - 0x05a1, 0x05ab, 0x05b0, 0x05b7, 0x05bb, 0x05c4, 0x05c9, 0x05d4, - 0x05dd, 0x05dd, 0x05e5, 0x05ea, 0x05ee, 0x05f7, 0x05f7, 0x05ff, - // Entry C0 - FF - 0x05ff, 0x060b, 0x0618, 0x061e, 0x0627, 0x062f, 0x062f, 0x0636, - 0x0636, 0x0636, 0x063c, 0x063c, 0x063c, 0x063f, 0x063f, 0x0649, - 0x0649, 0x064f, 0x0656, 0x0662, 0x0662, 0x0666, 0x066e, 0x066e, - 0x0674, 0x0678, 0x067d, 0x067d, 0x0681, 0x0686, 0x0686, 0x0696, - 0x069d, 0x06a2, 0x06a6, 0x06a6, 0x06a9, 0x06b0, 0x06b0, 0x06b0, - 0x06b4, 0x06b4, 0x06b8, 0x06be, 0x06c4, 0x06cc, 0x06d0, 0x06d4, - 0x06db, 0x06df, 0x06e7, 0x06ed, 0x06f2, 0x06f9, 0x06fe, 0x0705, - 0x070d, 0x0715, 0x0719, 0x072a, 0x0731, 0x073d, 0x0744, 0x074d, - // Entry 100 - 13F - 0x075d, 0x0764, 0x0764, 0x0772, 0x078c, 0x0799, 0x079f, 0x07a5, - 0x07aa, 0x07b1, 0x07b6, 0x07bc, 0x07c1, 0x07c6, 0x07cb, 0x07df, - 0x07df, 0x07e4, 0x07fd, 0x0806, 0x080b, 0x0811, 0x0815, 0x0819, - 0x0819, 0x0827, 0x082d, 0x0836, 0x084e, 0x084e, 0x0854, 0x0854, - 0x0858, 0x0860, 0x0860, 0x0863, 0x0863, 0x087c, 0x088a, 0x088a, - 0x089c, 0x08ad, 0x08b7, 0x08b9, 0x08c2, 0x08c2, 0x08c6, 0x08cb, - 0x08cb, 0x08d8, 0x08e2, 0x08e2, 0x0901, 0x090f, 0x090f, 0x0914, - 0x091d, 0x0923, 0x0928, 0x0933, 0x0949, 0x0949, 0x0949, 0x094d, - // Entry 140 - 17F - 0x0954, 0x0959, 0x0959, 0x0961, 0x0961, 0x096b, 0x0971, 0x0976, - 0x098b, 0x098b, 0x098f, 0x0993, 0x0999, 0x099e, 0x09a9, 0x09a9, - 0x09a9, 0x09af, 0x09b5, 0x09bb, 0x09ca, 0x09d7, 0x09d7, 0x09e2, - 0x09e8, 0x09ee, 0x09f2, 0x09f7, 0x09fb, 0x0a06, 0x0a0d, 0x0a11, - 0x0a18, 0x0a23, 0x0a23, 0x0a27, 0x0a27, 0x0a2b, 0x0a37, 0x0a42, - 0x0a42, 0x0a42, 0x0a46, 0x0a4e, 0x0a56, 0x0a62, 0x0a69, 0x0a72, - 0x0a77, 0x0a86, 0x0a8a, 0x0a8a, 0x0a94, 0x0a9c, 0x0aa4, 0x0aa9, - 0x0ab0, 0x0ab5, 0x0abc, 0x0ac2, 0x0ac7, 0x0acc, 0x0ad1, 0x0ada, - // Entry 180 - 1BF - 0x0ada, 0x0ada, 0x0ada, 0x0ae0, 0x0ae0, 0x0ae5, 0x0ae9, 0x0af6, - 0x0af6, 0x0b00, 0x0b07, 0x0b0c, 0x0b0f, 0x0b13, 0x0b19, 0x0b19, - 0x0b19, 0x0b23, 0x0b27, 0x0b2d, 0x0b34, 0x0b3b, 0x0b43, 0x0b48, - 0x0b4c, 0x0b52, 0x0b58, 0x0b5d, 0x0b61, 0x0b75, 0x0b8a, 0x0b95, - 0x0b99, 0x0b9f, 0x0baa, 0x0bb0, 0x0bb8, 0x0bbe, 0x0bc2, 0x0bc2, - 0x0bc9, 0x0bd5, 0x0bdc, 0x0be7, 0x0bee, 0x0bee, 0x0bf3, 0x0bf9, - 0x0c06, 0x0c06, 0x0c12, 0x0c16, 0x0c24, 0x0c2a, 0x0c2e, 0x0c34, - 0x0c34, 0x0c3a, 0x0c42, 0x0c47, 0x0c55, 0x0c55, 0x0c58, 0x0c65, - // Entry 1C0 - 1FF - 0x0c69, 0x0c79, 0x0c81, 0x0c89, 0x0c8e, 0x0c93, 0x0c98, 0x0ca7, - 0x0cb2, 0x0cb9, 0x0cc1, 0x0ccb, 0x0cd5, 0x0cd5, 0x0ce7, 0x0ce7, - 0x0ce7, 0x0cf5, 0x0cf5, 0x0d00, 0x0d00, 0x0d00, 0x0d09, 0x0d0f, - 0x0d20, 0x0d25, 0x0d25, 0x0d2e, 0x0d35, 0x0d3f, 0x0d3f, 0x0d3f, - 0x0d44, 0x0d4a, 0x0d4a, 0x0d4a, 0x0d4a, 0x0d53, 0x0d56, 0x0d5d, - 0x0d65, 0x0d7b, 0x0d82, 0x0d87, 0x0d8e, 0x0d8e, 0x0d95, 0x0d9a, - 0x0da6, 0x0dae, 0x0dae, 0x0dbc, 0x0dc2, 0x0dc6, 0x0dc6, 0x0dcc, - 0x0dda, 0x0de4, 0x0de4, 0x0dec, 0x0df0, 0x0dff, 0x0e05, 0x0e05, - // Entry 200 - 23F - 0x0e05, 0x0e10, 0x0e19, 0x0e23, 0x0e2d, 0x0e34, 0x0e3b, 0x0e4a, - 0x0e4f, 0x0e53, 0x0e53, 0x0e59, 0x0e5d, 0x0e65, 0x0e6d, 0x0e7f, - 0x0e87, 0x0e87, 0x0e87, 0x0e8c, 0x0e90, 0x0e96, 0x0e9b, 0x0ea0, - 0x0ea3, 0x0eaa, 0x0eaa, 0x0eb4, 0x0ebb, 0x0ebb, 0x0ec3, 0x0ece, - 0x0ed7, 0x0ed7, 0x0edd, 0x0edd, 0x0ee6, 0x0ee6, 0x0eed, 0x0ef3, - 0x0efa, 0x0f04, 0x0f1d, 0x0f23, 0x0f2c, 0x0f33, 0x0f3d, 0x0f40, - 0x0f40, 0x0f40, 0x0f40, 0x0f40, 0x0f46, 0x0f46, 0x0f4b, 0x0f51, - 0x0f57, 0x0f5c, 0x0f61, 0x0f69, 0x0f69, 0x0f6f, 0x0f6f, 0x0f73, - // Entry 240 - 27F - 0x0f76, 0x0f7e, 0x0f85, 0x0f8a, 0x0f8a, 0x0f93, 0x0f9d, 0x0fa9, - 0x0fa9, 0x0faf, 0x0fcd, 0x0fd1, 0x0fed, 0x0ff1, 0x100b, 0x100b, - 0x100b, 0x1027, 0x1027, 0x1027, 0x1027, 0x1027, 0x1027, 0x1027, - 0x1027, 0x1027, 0x1027, 0x1027, 0x1035, 0x103e, 0x103e, 0x103e, - 0x1047, 0x1055, 0x1055, 0x106f, 0x1086, - }, - }, - { // bs-Cyrl - "афарскиабказијскиавестанскиафриканерскиаканамхарскиарагонежанскиарапскиа" + - "семијскиаварскиајмараазербејџанскибашкирбелорускибугарскибисламабам" + - "барабенгласкитибетанскибретонскибосанскикаталонскичеченскичаморокор" + - "зиканскикричешкистарословенскичувашкивелшкиданскинемачкидивехијскиџ" + - "онгаевегрчкиенглескиесперантошпанскиестонскибаскијскиперсијскифулах" + - "финскифиджијскифарскифранцускифризијскиирскишкотски галскигалскигва" + - "ранигуџаратиманксхаусахебрејскихиндихири мотухрватскихаитскимађарск" + - "ијерменскихерероинтерлингваиндонежанскимеђујезичкиигбосичуан јиунуп" + - "иакидоисландскииталијанскиинуктитутјапанскијаванскигрузијскиконгоки" + - "кујукуањамакозачкикалалисуткмерскиканадакорејскиканурикашмирскикурд" + - "скикомикорнишкикиргискилатинскилуксембуршкигандалимбургишлингалалао" + - "скилитванскилуба-катангалетонскималагасијскимаршалскимаорскимакедон" + - "скималајаламмонголскимаратималајскимелтешкибурманскинаурусеверни нд" + - "ебеленепалскиндонгахоландскинорвешки њорскнорвешки бокмалјужни ндеб" + - "еленавахоњањапровансалскиојибваоромооријскиосетскипанџабскипалипољс" + - "кипаштунскипортугалскиквенчарето-романскирундирумунскирускикинјаруа" + - "ндасанскритсардињаскисиндисеверни самисангосингалескисловачкисловен" + - "ачкисамоанскишонасомалскиалбанскисрпскисватисесотосунданскишведскис" + - "вахилитамилскителугутађиктајландскитигрињатуркменскитсванатонгатурс" + - "китсонгататарскитахићанскиујгурскиукрајинскиурдуузбечкивендавијетна" + - "мскиволапуквалунволофксхосајидишјорубажуангкинескизулуачинескиаколи" + - "адангмејскиадигејскиафрихилиаинуакадијскиаљутјужни алтаистароенглес" + - "киангикаармајскиароканијскиарапахоаравакастуријскиавадхибалучибалин" + - "езијскибасабејабембабојпурибиколбинисисикабрајбуриатбугинежанскибли" + - "нкадокарипскиатсамскицебуаночибчачагатаичукескимаричинукскичоктавск" + - "ичипвијанскичерокичејенскикоптскикримеански турскикашубијанскидакот" + - "адаргваделаверславскидогрибдинкадогриниски сорбијанскидуаласредњи х" + - "оландскиђулаефикскистароегипатскиекајукеламитскисредњи енглескиевон" + - "дофангтагалогфонсредњи францускистарофранцускисеверно-фризијскиисто" + - "чни фризијскифриулијскигагајогбајаџизгилбертшкисредњи високи немачк" + - "истаронемачкигондигоронталоготскигребостарогрчкишвајцарски немачкиг" + - "вич’инхаидахавајскихилигајнонхититехмонггорњи сорбијскихупаибанилок" + - "оингвишкилојбанјудео-персијскијудео-арапскикара-калпашкикабилекачин" + - "ђукамбакавикабардијскитјапкорокасикотанешкикимбундуконканикосреанск" + - "икпелекарачај-балкаркарелијскикурукхкумиккутенаиладиноландаламбалез" + - "гианмонголозилуба-лулуалуисенолундалуолушаимадурешкимагахимаитилима" + - "касармандингомасаимокшамандармендесредњи ирскимикмакминангкабауманч" + - "уманипуримахавскимосивише језикакришкимирандешкимарвариерзијанеапол" + - "итанскиниски немачкиневариниасниуеанногаистари норскин’косеверни со" + - "токласични неварињамвезињанколењоронзимаосагеотомански турскипангас" + - "инскипахлавипампангапапиаментопалауанскистароперсијскифеничанскипон" + - "пејскистаропровансалскирађастанирапануираротонганроманиароманијскис" + - "андавејакутсамаритански арамејскисасаксанталисицилијанскишкотскисел" + - "капстароирскишансидамојужни самилуле самиинари самисколтски језиксо" + - "нинкесоџијенскисранански тонгосерерсукумасусусумерскикоморскикласич" + - "ни сиријскисиријскитимнетеренотетумтигретивтокелауклингонскитлингит" + - "тамашекњаса тонгаток писинтсимшиантумбукатувалутувинијскиудмуртугар" + - "итскиумбундурутваивотскиваламоварајвашокалмикјаојапешкикантонскизап" + - "отечкиблисимболизенагазунибез лингвистичког садржајазазаАустријски " + - "немачкиШвајцарски високи немачкиАустралијски енглескиКанадски енгле" + - "скиБритански енглескиСАД енглескиЛатино-амерички шпанскиИберијски ш" + - "панскиКанадски францускиШвајцарски францускифламанскиБразилски порт" + - "угалскиИберијски португалскимолдавскисрпскохрватскикинески (поједно" + - "стављен)кинески (традиционални)", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000e, 0x0022, 0x0036, 0x004e, 0x0056, 0x0066, 0x0080, - 0x008e, 0x00a0, 0x00ae, 0x00ba, 0x00d4, 0x00e0, 0x00f2, 0x0102, - 0x0110, 0x011e, 0x0130, 0x0144, 0x0156, 0x0166, 0x017a, 0x018a, - 0x0196, 0x01ac, 0x01b2, 0x01bc, 0x01d8, 0x01e6, 0x01f2, 0x01fe, - 0x020c, 0x0220, 0x022a, 0x0230, 0x023a, 0x024a, 0x025c, 0x026a, - 0x027a, 0x028c, 0x029e, 0x02a8, 0x02b4, 0x02c6, 0x02d2, 0x02e4, - 0x02f6, 0x0300, 0x031b, 0x0327, 0x0335, 0x0345, 0x034f, 0x0359, - 0x036b, 0x0375, 0x0386, 0x0396, 0x03a4, 0x03b4, 0x03c6, 0x03d2, - // Entry 40 - 7F - 0x03e8, 0x0400, 0x0416, 0x041e, 0x042f, 0x043d, 0x0443, 0x0455, - 0x046b, 0x047d, 0x048d, 0x049d, 0x04af, 0x04b9, 0x04c5, 0x04d3, - 0x04e1, 0x04f3, 0x0501, 0x050d, 0x051d, 0x0529, 0x053b, 0x0549, - 0x0551, 0x0561, 0x0571, 0x0581, 0x0599, 0x05a3, 0x05b5, 0x05c3, - 0x05cf, 0x05e1, 0x05f8, 0x0608, 0x0620, 0x0632, 0x0640, 0x0654, - 0x0666, 0x0678, 0x0684, 0x0694, 0x06a4, 0x06b6, 0x06c0, 0x06dd, - 0x06ed, 0x06f9, 0x070b, 0x0726, 0x0743, 0x075c, 0x0768, 0x0770, - 0x0788, 0x0794, 0x079e, 0x07ac, 0x07ba, 0x07cc, 0x07d4, 0x07e0, - // Entry 80 - BF - 0x07f2, 0x0808, 0x0814, 0x082d, 0x0837, 0x0847, 0x0851, 0x0867, - 0x0877, 0x088b, 0x0895, 0x08ac, 0x08b6, 0x08ca, 0x08da, 0x08ee, - 0x0900, 0x0908, 0x0918, 0x0928, 0x0934, 0x093e, 0x094a, 0x095c, - 0x096a, 0x0978, 0x0988, 0x0994, 0x099e, 0x09b2, 0x09c0, 0x09d4, - 0x09e0, 0x09ea, 0x09f6, 0x0a02, 0x0a12, 0x0a26, 0x0a36, 0x0a4a, - 0x0a52, 0x0a60, 0x0a6a, 0x0a80, 0x0a8e, 0x0a98, 0x0aa2, 0x0aae, - 0x0ab8, 0x0ac4, 0x0ace, 0x0adc, 0x0ae4, 0x0af4, 0x0afe, 0x0b14, - 0x0b26, 0x0b26, 0x0b36, 0x0b36, 0x0b3e, 0x0b50, 0x0b50, 0x0b58, - // Entry C0 - FF - 0x0b58, 0x0b6d, 0x0b87, 0x0b93, 0x0ba3, 0x0bb9, 0x0bb9, 0x0bc7, - 0x0bc7, 0x0bc7, 0x0bd3, 0x0bd3, 0x0bd3, 0x0bd3, 0x0bd3, 0x0be7, - 0x0be7, 0x0bf3, 0x0bff, 0x0c17, 0x0c17, 0x0c1f, 0x0c1f, 0x0c1f, - 0x0c1f, 0x0c27, 0x0c31, 0x0c31, 0x0c31, 0x0c31, 0x0c31, 0x0c31, - 0x0c3f, 0x0c49, 0x0c51, 0x0c51, 0x0c51, 0x0c5d, 0x0c5d, 0x0c5d, - 0x0c65, 0x0c65, 0x0c65, 0x0c65, 0x0c71, 0x0c89, 0x0c89, 0x0c91, - 0x0c91, 0x0c99, 0x0ca9, 0x0ca9, 0x0cb9, 0x0cc7, 0x0cc7, 0x0cd1, - 0x0cdf, 0x0ced, 0x0cf5, 0x0d05, 0x0d17, 0x0d2d, 0x0d39, 0x0d49, - // Entry 100 - 13F - 0x0d49, 0x0d57, 0x0d57, 0x0d78, 0x0d78, 0x0d90, 0x0d9c, 0x0da8, - 0x0da8, 0x0db6, 0x0dc4, 0x0dd0, 0x0dda, 0x0dda, 0x0de4, 0x0e05, - 0x0e05, 0x0e0f, 0x0e2e, 0x0e2e, 0x0e36, 0x0e36, 0x0e36, 0x0e44, - 0x0e44, 0x0e60, 0x0e6c, 0x0e7e, 0x0e9b, 0x0e9b, 0x0ea7, 0x0ea7, - 0x0eaf, 0x0ebd, 0x0ebd, 0x0ec3, 0x0ec3, 0x0ee2, 0x0efe, 0x0efe, - 0x0f1f, 0x0f40, 0x0f54, 0x0f58, 0x0f58, 0x0f58, 0x0f60, 0x0f6a, - 0x0f6a, 0x0f70, 0x0f84, 0x0f84, 0x0fac, 0x0fc4, 0x0fc4, 0x0fce, - 0x0fe0, 0x0fec, 0x0ff6, 0x100a, 0x102d, 0x102d, 0x102d, 0x102d, - // Entry 140 - 17F - 0x103c, 0x1046, 0x1046, 0x1056, 0x1056, 0x106a, 0x1076, 0x1080, - 0x109d, 0x109d, 0x10a5, 0x10ad, 0x10ad, 0x10b7, 0x10c7, 0x10c7, - 0x10c7, 0x10d3, 0x10d3, 0x10d3, 0x10f0, 0x1109, 0x1109, 0x1122, - 0x112e, 0x1138, 0x113c, 0x1146, 0x114e, 0x1164, 0x1164, 0x116c, - 0x116c, 0x116c, 0x116c, 0x1174, 0x1174, 0x117c, 0x118e, 0x118e, - 0x118e, 0x118e, 0x118e, 0x118e, 0x119e, 0x119e, 0x11ac, 0x11c0, - 0x11ca, 0x11e5, 0x11e5, 0x11e5, 0x11f9, 0x1205, 0x1205, 0x1205, - 0x1205, 0x120f, 0x121d, 0x1229, 0x1229, 0x1233, 0x123d, 0x124b, - // Entry 180 - 1BF - 0x124b, 0x124b, 0x124b, 0x124b, 0x124b, 0x1255, 0x125d, 0x125d, - 0x125d, 0x1270, 0x127e, 0x1288, 0x128e, 0x1298, 0x1298, 0x1298, - 0x1298, 0x12aa, 0x12aa, 0x12b6, 0x12c4, 0x12d2, 0x12e2, 0x12ec, - 0x12ec, 0x12f6, 0x1302, 0x130c, 0x130c, 0x130c, 0x1323, 0x1323, - 0x1323, 0x132f, 0x1345, 0x134f, 0x135f, 0x136f, 0x1377, 0x1377, - 0x1377, 0x138c, 0x1398, 0x13ac, 0x13ba, 0x13ba, 0x13ba, 0x13c6, - 0x13c6, 0x13c6, 0x13e0, 0x13e0, 0x13f9, 0x1405, 0x140d, 0x1419, - 0x1419, 0x1419, 0x1419, 0x1423, 0x143a, 0x143a, 0x1443, 0x145a, - // Entry 1C0 - 1FF - 0x145a, 0x1477, 0x1485, 0x1493, 0x149b, 0x14a5, 0x14af, 0x14ce, - 0x14e4, 0x14f2, 0x1502, 0x1516, 0x152a, 0x152a, 0x152a, 0x152a, - 0x152a, 0x1546, 0x1546, 0x155a, 0x155a, 0x155a, 0x156c, 0x156c, - 0x158e, 0x158e, 0x158e, 0x15a0, 0x15ae, 0x15c2, 0x15c2, 0x15c2, - 0x15c2, 0x15ce, 0x15ce, 0x15ce, 0x15ce, 0x15e4, 0x15e4, 0x15f2, - 0x15fc, 0x1627, 0x1627, 0x1631, 0x163f, 0x163f, 0x163f, 0x163f, - 0x1657, 0x1665, 0x1665, 0x1665, 0x1665, 0x1665, 0x1665, 0x1671, - 0x1671, 0x1685, 0x1685, 0x1685, 0x168b, 0x168b, 0x1697, 0x1697, - // Entry 200 - 23F - 0x1697, 0x16aa, 0x16bb, 0x16ce, 0x16e9, 0x16f7, 0x170b, 0x1728, - 0x1732, 0x1732, 0x1732, 0x173e, 0x1746, 0x1756, 0x1766, 0x1787, - 0x1797, 0x1797, 0x1797, 0x17a1, 0x17a1, 0x17ad, 0x17b7, 0x17c1, - 0x17c7, 0x17d5, 0x17d5, 0x17e9, 0x17f7, 0x17f7, 0x1805, 0x1818, - 0x1829, 0x1829, 0x1829, 0x1829, 0x1839, 0x1839, 0x1847, 0x1853, - 0x1853, 0x1867, 0x1867, 0x1873, 0x1885, 0x1893, 0x1899, 0x189f, - 0x189f, 0x189f, 0x189f, 0x189f, 0x18ab, 0x18ab, 0x18ab, 0x18ab, - 0x18b7, 0x18c1, 0x18c9, 0x18c9, 0x18c9, 0x18d5, 0x18d5, 0x18d5, - // Entry 240 - 27F - 0x18db, 0x18e9, 0x18e9, 0x18e9, 0x18e9, 0x18fb, 0x190d, 0x1921, - 0x1921, 0x192d, 0x192d, 0x1935, 0x1967, 0x196f, 0x196f, 0x196f, - 0x1992, 0x19c2, 0x19eb, 0x1a0c, 0x1a2f, 0x1a46, 0x1a72, 0x1a93, - 0x1a93, 0x1a93, 0x1ab6, 0x1add, 0x1add, 0x1aef, 0x1b18, 0x1b41, - 0x1b53, 0x1b6f, 0x1b6f, 0x1b9c, 0x1bc7, - }, - }, - { // ca - caLangStr, - caLangIdx, - }, - { // ce - "абхазхойнафрикаансаканамхаройнӀаьрбийнассамийназербайджанийнбашкирийнбел" + - "орусийнболгарийнбамбарабенгалийнтибетхойнбретонийнбоснийнкаталонийн" + - "нохчийнкорсиканийнчехийнчувашийнваллийндатхойннемцойндзонг-кээвегре" + - "кийнингалсанэсперантоиспанхойнэстонийнбаскийнгӀажарийнфиннийнфиджиф" + - "арерийнфранцузийнмалхбузен-фризийнирландхойнгалисийнгуаранигуджарат" + - "имэнийнхаусажугтийнхиндихорватийнгаитийнвенгрийнэрмалойниндонезихой" + - "нигбосычуаньисландхойнитальянийнинуктитутяпонийняванийнгуьржийнкику" + - "йюказахийнгренландхойнкхмерийнканнадакорейнкашмирикурдийнкорнуоллий" + - "нгӀиргӀизойнлатинанлюксембургхойнгандалингалалаоссийнлитвахойнлуба-" + - "катангалатышийнмалагасийнмаоримакедонхойнмалаяламмонголийнмаратхима" + - "лайнмальтойнбирманийнкъилбаседа ндебелинепалхойнголландхойннорвегий" + - "н нюнорскнорвегийн букмолоромоорипанджабиполякийнпуштупортугалихойн" + - "кечуароманшийнрундирумынийноьрсийнкиньяруандасанскритсиндхикъилбасе" + - "да саамийнсангосингалхойнсловакийнсловенийншонасомалиалбанойнсербий" + - "нсунданхойншведийнсуахилитамилхойнтелугутаджикийнтайнтигриньятуркме" + - "нийнтонганийнтуркойнгӀезалойнуйгурийнукраинийнурдуузбекийнвьетнамхо" + - "йнволофкосайорубакитайнзулуагхӀемарауканхойнасубембабенамалхбузен-б" + - "елуджийнбодочигачерокиюккъерчу курдийнтаитазармасорбийндуаладьола-ф" + - "оньиэмбуфилиппинийнгагаузийншвейцарин немцойнгусиигавайнлакхара сер" + - "бийннгомбамачамекабилийнкамбамакондекабувердьянукойра чииникаленджи" + - "нкоми-пермякийнконканишамбалабафиалангилакотакъилбаседа лурилуо (Ке" + - "ни а, Танзани а)лухьямасаимерумаврикин креолийнмакуа-мееттометамоха" + - "укмундангмазандеранхойннамалахара германхойнквасионконуэрньянколеки" + - "черомборуандасамбурусангусенакойраборо сеннитахелхитсаамийн (къилба" + - ")луле-саамийнинари-саамийнскольт-саамийнтесотасавактамазигхтийнбоьвз" + - "уш боцу моттваивунджоварлпирисогамороккон стандартан тамазигхтийнме" + - "ттан чулацам боцушХӀинца болу стандартан Ӏаьрбийнавстрин немцойншве" + - "йцарин лакхара немцойнАвстралин ингалсанканадан ингалсанбританин ин" + - "галсанамерикан ингалсанлатинан американ испанхойневропан испанхойнм" + - "ексикан испанхойнканадан французийншвейцарин французийнлахара саксо" + - "нийнфламандийнбразилин португалихойневропан португалихойнмолдавийнс" + - "уахили (Конго)атта китайнламастан китайн", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0012, 0x0012, 0x0024, 0x002c, 0x003c, 0x003c, - 0x004c, 0x005c, 0x005c, 0x005c, 0x0078, 0x008a, 0x009e, 0x00b0, - 0x00b0, 0x00be, 0x00d0, 0x00e2, 0x00f4, 0x0102, 0x0116, 0x0124, - 0x0124, 0x013a, 0x013a, 0x0146, 0x0146, 0x0156, 0x0164, 0x0172, - 0x0180, 0x0180, 0x018f, 0x0195, 0x01a3, 0x01b3, 0x01c5, 0x01d7, - 0x01e7, 0x01f5, 0x0207, 0x0207, 0x0215, 0x021f, 0x022f, 0x0243, - 0x0264, 0x0278, 0x0278, 0x0288, 0x0296, 0x02a8, 0x02b4, 0x02be, - 0x02cc, 0x02d6, 0x02d6, 0x02e8, 0x02f6, 0x0306, 0x0316, 0x0316, - // Entry 40 - 7F - 0x0316, 0x032e, 0x032e, 0x0336, 0x0344, 0x0344, 0x0344, 0x0358, - 0x036c, 0x037e, 0x038c, 0x039a, 0x03aa, 0x03aa, 0x03b6, 0x03b6, - 0x03c6, 0x03de, 0x03ee, 0x03fc, 0x0408, 0x0408, 0x0416, 0x0424, - 0x0424, 0x043a, 0x0450, 0x045e, 0x047a, 0x0484, 0x0484, 0x0492, - 0x04a2, 0x04b4, 0x04cb, 0x04db, 0x04ef, 0x04ef, 0x04f9, 0x050f, - 0x051f, 0x0531, 0x053f, 0x054b, 0x055b, 0x056d, 0x056d, 0x0590, - 0x05a2, 0x05a2, 0x05b8, 0x05d9, 0x05f8, 0x05f8, 0x05f8, 0x05f8, - 0x05f8, 0x05f8, 0x0602, 0x0608, 0x0608, 0x0618, 0x0618, 0x0628, - // Entry 80 - BF - 0x0632, 0x064c, 0x0656, 0x0668, 0x0672, 0x0682, 0x0690, 0x06a6, - 0x06b6, 0x06b6, 0x06c2, 0x06e5, 0x06ef, 0x0703, 0x0715, 0x0727, - 0x0727, 0x072f, 0x073b, 0x074b, 0x0759, 0x0759, 0x0759, 0x076d, - 0x077b, 0x0789, 0x079b, 0x07a7, 0x07b9, 0x07c1, 0x07d1, 0x07e5, - 0x07e5, 0x07f7, 0x0805, 0x0805, 0x0817, 0x0817, 0x0827, 0x0839, - 0x0841, 0x0851, 0x0851, 0x0867, 0x0867, 0x0867, 0x0871, 0x0879, - 0x0879, 0x0885, 0x0885, 0x0891, 0x0899, 0x0899, 0x0899, 0x0899, - 0x0899, 0x0899, 0x0899, 0x08a5, 0x08a5, 0x08a5, 0x08a5, 0x08a5, - // Entry C0 - FF - 0x08a5, 0x08a5, 0x08a5, 0x08a5, 0x08a5, 0x08bb, 0x08bb, 0x08bb, - 0x08bb, 0x08bb, 0x08bb, 0x08bb, 0x08bb, 0x08c1, 0x08c1, 0x08c1, - 0x08c1, 0x08c1, 0x08c1, 0x08c1, 0x08c1, 0x08c1, 0x08c1, 0x08c1, - 0x08c1, 0x08c1, 0x08cb, 0x08cb, 0x08d3, 0x08d3, 0x08d3, 0x08f8, - 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, - 0x08f8, 0x08f8, 0x0900, 0x0900, 0x0900, 0x0900, 0x0900, 0x0900, - 0x0900, 0x0900, 0x0900, 0x0900, 0x0900, 0x0900, 0x0908, 0x0908, - 0x0908, 0x0908, 0x0908, 0x0908, 0x0908, 0x0908, 0x0914, 0x0914, - // Entry 100 - 13F - 0x0933, 0x0933, 0x0933, 0x0933, 0x0933, 0x0933, 0x0933, 0x0933, - 0x093d, 0x093d, 0x093d, 0x093d, 0x093d, 0x0947, 0x0947, 0x0955, - 0x0955, 0x095f, 0x095f, 0x0974, 0x0974, 0x0974, 0x097c, 0x097c, - 0x097c, 0x097c, 0x097c, 0x097c, 0x097c, 0x097c, 0x097c, 0x097c, - 0x097c, 0x0992, 0x0992, 0x0992, 0x0992, 0x0992, 0x0992, 0x0992, - 0x0992, 0x0992, 0x0992, 0x0992, 0x09a4, 0x09a4, 0x09a4, 0x09a4, - 0x09a4, 0x09a4, 0x09a4, 0x09a4, 0x09a4, 0x09a4, 0x09a4, 0x09a4, - 0x09a4, 0x09a4, 0x09a4, 0x09a4, 0x09c5, 0x09c5, 0x09c5, 0x09cf, - // Entry 140 - 17F - 0x09cf, 0x09cf, 0x09cf, 0x09db, 0x09db, 0x09db, 0x09db, 0x09db, - 0x09f8, 0x09f8, 0x09f8, 0x09f8, 0x09f8, 0x09f8, 0x09f8, 0x09f8, - 0x09f8, 0x09f8, 0x0a04, 0x0a10, 0x0a10, 0x0a10, 0x0a10, 0x0a10, - 0x0a20, 0x0a20, 0x0a20, 0x0a2a, 0x0a2a, 0x0a2a, 0x0a2a, 0x0a2a, - 0x0a38, 0x0a50, 0x0a50, 0x0a50, 0x0a50, 0x0a50, 0x0a50, 0x0a65, - 0x0a65, 0x0a65, 0x0a65, 0x0a77, 0x0a77, 0x0a92, 0x0aa0, 0x0aa0, - 0x0aa0, 0x0aa0, 0x0aa0, 0x0aa0, 0x0aa0, 0x0aa0, 0x0aae, 0x0ab8, - 0x0ab8, 0x0ab8, 0x0ab8, 0x0ab8, 0x0ac2, 0x0ac2, 0x0ac2, 0x0ac2, - // Entry 180 - 1BF - 0x0ac2, 0x0ac2, 0x0ac2, 0x0ace, 0x0ace, 0x0ace, 0x0ace, 0x0aeb, - 0x0aeb, 0x0aeb, 0x0aeb, 0x0aeb, 0x0b12, 0x0b12, 0x0b1c, 0x0b1c, - 0x0b1c, 0x0b1c, 0x0b1c, 0x0b1c, 0x0b1c, 0x0b1c, 0x0b1c, 0x0b26, - 0x0b26, 0x0b26, 0x0b26, 0x0b26, 0x0b2e, 0x0b4f, 0x0b4f, 0x0b66, - 0x0b6e, 0x0b6e, 0x0b6e, 0x0b6e, 0x0b6e, 0x0b7a, 0x0b7a, 0x0b7a, - 0x0b88, 0x0b88, 0x0b88, 0x0b88, 0x0b88, 0x0b88, 0x0b88, 0x0b88, - 0x0ba4, 0x0ba4, 0x0ba4, 0x0bac, 0x0bcd, 0x0bcd, 0x0bcd, 0x0bcd, - 0x0bcd, 0x0bd9, 0x0bd9, 0x0bd9, 0x0bd9, 0x0bd9, 0x0bdf, 0x0bdf, - // Entry 1C0 - 1FF - 0x0be7, 0x0be7, 0x0be7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, - 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, - 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, - 0x0bf7, 0x0bff, 0x0bff, 0x0bff, 0x0bff, 0x0bff, 0x0bff, 0x0bff, - 0x0c09, 0x0c09, 0x0c09, 0x0c09, 0x0c09, 0x0c09, 0x0c15, 0x0c15, - 0x0c15, 0x0c15, 0x0c23, 0x0c23, 0x0c23, 0x0c23, 0x0c23, 0x0c2d, - 0x0c2d, 0x0c2d, 0x0c2d, 0x0c2d, 0x0c2d, 0x0c35, 0x0c35, 0x0c35, - 0x0c52, 0x0c52, 0x0c52, 0x0c62, 0x0c62, 0x0c62, 0x0c62, 0x0c62, - // Entry 200 - 23F - 0x0c62, 0x0c7f, 0x0c96, 0x0caf, 0x0cca, 0x0cca, 0x0cca, 0x0cca, - 0x0cca, 0x0cca, 0x0cca, 0x0cca, 0x0cca, 0x0cca, 0x0cca, 0x0cca, - 0x0cca, 0x0cca, 0x0cca, 0x0cca, 0x0cd2, 0x0cd2, 0x0cd2, 0x0cd2, - 0x0cd2, 0x0cd2, 0x0cd2, 0x0cd2, 0x0cd2, 0x0cd2, 0x0cd2, 0x0cd2, - 0x0cd2, 0x0cd2, 0x0cd2, 0x0cd2, 0x0cd2, 0x0cd2, 0x0cd2, 0x0cd2, - 0x0ce0, 0x0ce0, 0x0cf8, 0x0cf8, 0x0cf8, 0x0cf8, 0x0d18, 0x0d1e, - 0x0d1e, 0x0d1e, 0x0d1e, 0x0d1e, 0x0d1e, 0x0d1e, 0x0d2a, 0x0d2a, - 0x0d2a, 0x0d2a, 0x0d2a, 0x0d3a, 0x0d3a, 0x0d3a, 0x0d3a, 0x0d42, - // Entry 240 - 27F - 0x0d42, 0x0d42, 0x0d42, 0x0d42, 0x0d42, 0x0d42, 0x0d42, 0x0d42, - 0x0d42, 0x0d42, 0x0d80, 0x0d80, 0x0da6, 0x0da6, 0x0de1, 0x0de1, - 0x0dfe, 0x0e2e, 0x0e51, 0x0e70, 0x0e91, 0x0eb2, 0x0ee4, 0x0f05, - 0x0f28, 0x0f28, 0x0f4b, 0x0f72, 0x0f91, 0x0fa5, 0x0fd0, 0x0ff9, - 0x100b, 0x100b, 0x1026, 0x103b, 0x1058, - }, - }, - { // cgg - "OrukaniOrumarikiOruharabuOruberarusiOruburugariyaOrubengariOruceekiOrugi" + - "rimaaniOruguriikiOrungyerezaOrusupaaniOrupaasiyaOrufaransaOruhausaOr" + - "uhindiOruhangareOruindoneziaOruiboOruyitareOrujapaaniOrujavaOrukambo" + - "diyaOrukoreyaOrumalesiyaOruburumaOrunepaliOrudaakiOrupungyabiOrupoor" + - "iOrupocugoOruromaniaOrurrashaOrunyarwandaOrusomaariOruswidiOrutamiri" + - "OrutailandiOrukurukiOrukurainiOru-UruduOruviyetinaamuOruyorubaOrucha" + - "inaOruzuruRukiga", - []uint16{ // 247 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0010, 0x0010, - 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0031, - 0x0031, 0x0031, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, - 0x004f, 0x004f, 0x004f, 0x004f, 0x0059, 0x0064, 0x0064, 0x006e, - 0x006e, 0x006e, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x008a, - 0x008a, 0x0092, 0x0092, 0x0092, 0x0092, 0x009c, 0x009c, 0x009c, - // Entry 40 - 7F - 0x009c, 0x00a8, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00b7, 0x00b7, 0x00c1, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00d4, 0x00d4, 0x00dd, 0x00dd, 0x00dd, 0x00dd, - 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, - 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, - 0x00dd, 0x00dd, 0x00dd, 0x00e8, 0x00e8, 0x00f1, 0x00f1, 0x00f1, - 0x00fa, 0x00fa, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, - 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x010d, 0x010d, 0x0115, - // Entry 80 - BF - 0x0115, 0x011e, 0x011e, 0x011e, 0x011e, 0x0128, 0x0131, 0x013d, - 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, - 0x013d, 0x013d, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, - 0x014f, 0x014f, 0x0158, 0x0158, 0x0158, 0x0163, 0x0163, 0x0163, - 0x0163, 0x0163, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x0176, - 0x017f, 0x017f, 0x017f, 0x018d, 0x018d, 0x018d, 0x018d, 0x018d, - 0x018d, 0x0196, 0x0196, 0x019f, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - // Entry C0 - FF - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01ac, - }, - }, - { // chr - "ᎠᏩᎳᎠᏆᏏᎠᏂᎠᎬᎿᎨᏍᏛᎠᎧᎾᎠᎹᎭᎵᎩᎠᏩᎪᏂᏏᎡᎳᏈᎠᏌᎻᏏᎠᏩᎵᎧᎠᏱᎹᎳᎠᏎᏆᏣᏂᏆᏍᎯᎩᎠᏇᎳᎷᏏᏊᎵᎨᎵᎠᏂᏈᏍᎳᎹᏆᎻᏆᎳᏇᏂ" + - "ᎦᎳᏘᏇᏔᏂᏇᏙᏂᏆᏍᏂᎠᏂᎨᏔᎳᏂᏤᏤᏂᏣᎼᎶᎪᎵᏍᎢᎧᏂᏤᎩᏧᏂᎳᏫᏍᏗ ᏍᎳᏫᎪᏧᏩᏏᏪᎵᏏᏕᏂᏍᏙᎢᏥᏗᏪᎯᏓᏐᏅᎧᎡᏪᎠᏂ" + - "ᎪᎢᎩᎵᏏᎡᏍᏇᎳᏂᏙᏍᏆᏂᎡᏍᏙᏂᎠᏂᏆᏍᎨᏇᏏᎠᏂᏊᎳᏂᏈᏂᏍᏫᏥᎠᏂᏇᎶᎡᏍᎦᎸᏥᏭᏕᎵᎬ ᏗᏜ ᏟᏏᎠᏂᎨᎵᎩᏍᎦᏗ ᎨᎵᎩ" + - "ᎦᎵᏏᎠᏂᏆᎳᏂᎫᏣᎳᏘᎹᎾᎧᏏᎭᎤᏌᎠᏂᏈᎷᎯᏂᏗᎧᎶᎡᏏᏂᎮᏏᎠᏂ ᏟᏲᎵᎲᏂᎦᎵᎠᏂᎮᎴᎶᎠᏰᏟ ᎦᏬᏂᎯᏍᏗᎢᏂᏙᏂᏏᎠᎢᎦ" + - "ᎪᏏᏧᏩᏂ ᏱᎢᏙᏧᏁᏍᏓᎸᎯᎢᎩᎬᏩᎵᏲᏥᎢᎢᏄᎦᏘᏚᏣᏩᏂᏏᏆᏌ ᏣᏩᏦᏥᎠᏂᎩᎫᏳᎫᏩᏂᎠᎹᎧᏌᎧᎧᎳᎵᏑᏘᎩᎻᎷᎧᎾᏓᎪᎵᎠ" + - "ᏂᎧᏄᎵᎧᏏᎻᎵᎫᏗᏏᎪᎻᏎᎷᎭᎩᎵᏣᎢᏍᎳᏘᏂᎸᎦᏏᎻᏋᎢᏍᎦᏂᏓᎴᎹᏊᎵᏏᎵᏂᎦᎳᎳᎣᎵᏚᏩᏂᎠᏂᎷᏆ-ᎧᏔᎦᎳᏘᏫᎠᏂᎹᎳᎦᏏ" + - "ᎹᏌᎵᏏᎹᏫᎹᏎᏙᏂᎠᎹᎳᏯᎳᎻᎹᏂᎪᎵᎠᏂᎹᎳᏘᎹᎴᎹᎵᏘᏍᏋᎻᏍᏃᎤᎷᏧᏴᏢ ᏂᏕᏇᎴᏁᏆᎵᎾᏙᎦᏛᏥᏃᎵᏪᏥᏂ ᎾᎵᏍᎩᏃᎵᏪ" + - "ᏥᏂ ᏉᎧᎹᎵᏧᎦᎾᏮ ᏂᏕᏇᎴᎾᏩᎰᏂᏯᏂᏣᎠᏏᏔᏂᎣᎶᎼᎣᏗᎠᎣᏎᏘᎧᏡᏂᏣᏈᏉᎵᏍᏆᏍᏙᏉᏧᎩᏍᎨᏧᏩᎠᏂᎶᎺᏂᎷᏂᏗᎶᎹᏂᎠ" + - "ᏂᏲᏅᎯᎩᏂᏯᏩᏂᏓᏍᏂᏍᎩᏗᏌᏗᏂᎠᏂᏏᏂᏗᏧᏴᏢ ᏗᏜ ᏌᎻᏌᏂᎪᏏᎾᎭᎳᏍᎶᏩᎩᏍᎶᏫᏂᎠᏂᏌᎼᏯᏂᏠᎾᏐᎹᎵᎠᎵᏇᏂᏎᏈᎠᏂ" + - "ᏍᏩᏘᏧᎦᎾᏮ ᏗᏜ ᏐᏠᏑᏂᏓᏂᏏᏍᏫᏗᏏᏍᏩᎯᎵᏔᎻᎵᏖᎷᎦᏔᏥᎩᏔᏱᏘᎩᎵᏂᎠᎠᏂᎬᎾᏧᏩᎾᏙᎾᎦᏂᎠᎬᎾᏦᎾᎦᏔᏔᏔᎯᏘᎠᏂ" + - "ᏫᎦᏳᎧᎴᏂᎠᏂᎤᎵᏚᎤᏍᏇᎩᏫᏂᏓᏫᎡᏘᎾᎻᏍᏬᎳᏊᎩᏩᎷᎾᏬᎶᏫᏠᏌᏱᏗᏍᏲᏄᏆᏓᎶᏂᎨᏑᎷᎠᏥᏂᏏᎠᏓᎾᎦᎺᎠᏗᎨᎠᎨᎹᎠᏱᏄ" + - "ᎠᎵᎤᏘᏧᎦᎾᏮ ᏗᏜ ᎠᎵᏔᎢᎠᎾᎩᎧᎹᏊᏤᎠᏩᏈᎰᎠᏑᎠᏍᏚᎵᎠᏂᎠᏩᏗᏆᎵᏁᏏᏆᏌᎠᏇᎹᏆᏇᎾᏉᏣᏊᎵᏈᏂᏏᎩᏏᎧᏉᏙᏈᎥᎩᏂ" + - "ᏍᏟᏂᎧᏳᎦᏎᏆᏃᏥᎦᏧᎨᏎᎹᎵᎠᏣᏓᏣᎳᎩᏣᏰᏂᎠᏰᏟ ᎫᏗᏏᏎᏎᎵᏩ ᏟᏲᎵ ᎠᏂᎦᎸᏓᎪᏔᏓᎳᏆᏔᎢᏔᎩᏟ ᎤᏄᎳᏥᏌᎹᎡᎳᏗ" + - " ᏐᏈᎠᏂᏚᎠᎳᏦᎳ-ᏬᏱᏓᏌᎦᎡᎻᏊᎡᏫᎩᎨᎧᏧᎧᎡᏬᏂᏙᎠᏈᎵᎩᏠᏂᏞᎤᎵᎠᏂᎦᎩᏏᎩᏇᏘᏏᎪᎶᏂᏔᏃᏍᏫᏏ ᎠᏂᏓᏥᎫᏏᏈᏥᏂᎭᏩ" + - "ᎼᎯᎵᎨᎾᏂᎭᎼᏂᎩᎦᎸᎳᏗᎨ ᏐᎵᏈᎠᏂᎠᏂᎱᏆᎢᏆᏂᎢᏈᏈᎣᎢᎶᎪᎢᏂᎫᏏᎶᏣᏆᏂᎾᎪᏆᎹᏣᎺᎧᏈᎴᎧᏥᏂᏥᏧᎧᎻᏆᎧᏆᏗᎠᏂᏔ" + - "ᏯᏆᎹᎪᏕᎧᏊᏪᏗᎠᏄᎪᎶᎧᏏᎪᏱᎳ ᏥᏂᎧᎪᎧᎴᏂᏥᏂᎩᎻᏊᏚᎧᏂᎧᏂᏇᎴᎧᎳᏣᏱ-ᏆᎵᎧᎵᎧᎴᎵᎠᏂᎫᎷᎩᏝᎻᏆᎸᏆᏫᎠᎪᎶᏂᎠ" + - "ᏂᎫᎻᎧᎳᏗᏃᎳᏂᎩᎴᏏᎦᏂᎳᎪᏓᎶᏏᏧᏴᏢ ᏗᏜ ᎷᎵᎷᏆ-ᎷᎷᎠᎷᎾᏓᎷᎣᎻᏐᎷᏱᎠᎹᏚᎴᏏᎹᎦᎯᎹᏟᎵᎹᎧᏌᎹᏌᏱᎼᎧᏌᎺᎾᏕ" + - "ᎺᎷᎼᎵᏏᎡᏂᎹᎫᏩ-ᎻᏙᎺᎳ’ᎻᎧᎹᎩᎻᎾᎧᏆᎤᎺᏂᏉᎵᎼᎭᎩᎼᏍᏏᎽᏂᏓᎩᏧᏈᏍᏗ ᏗᎦᏬᏂᎯᏍᏗᎠᎫᏌᎻᎳᏕᏏᎡᏏᏯᎹᏌᏕᎳᏂ" + - "ᏂᏯᏆᎵᏔᏂᎾᎹᏁᏩᎵᏂᎠᏏᏂᏳᏫᏯᏂᏆᏏᏲᎾᏥᏰᎹᏊᏂᏃᎦᏱᎾᎪᏧᏴᏢ ᏗᏜ ᏐᏠᏄᏪᎵᏂᏯᎾᎪᎴᏇᎦᏏᎠᏂᏆᎹᏆᎾᎦᏆᏈᏯᎺᎾᏙ" + - "ᏆᎳᎤᏩᏂᎾᎩᎵᎠᏂ ᏈᏥᏂᏡᏏᎠᏂᎩᏤᎳᏆᏄᏫᎳᎶᏙᎾᎦᏂᎶᎹᏉᎠᏬᎹᏂᎠᏂᏆᏌᏅᏓᏫᏌᎧᎾᏌᎹᏊᎷᏌᏂᏔᎵᎾᎦᎹᏇᏌᏁᎫᏏᏏᎵᎠ" + - "ᏂᏍᎦᏗᏏᏂᎦᏎᎾᎪᏱᎳᏈᎶ ᏎᏂᏔᏤᎵᎯᏘᏝᏂᏧᎦᎾᏮ ᏗᏜ ᏌᎻᎷᎴ ᏌᎻᎢᎾᎵ ᏌᎻᏍᎪᎵᏘ ᏌᎻᏐᏂᏂᎨᏏᎳᎾᏂ ᏙᏃᎪᏌᎰ" + - "ᏑᎫᎹᎪᎼᎵᎠᏂᏏᎵᎠᎩᏘᎹᏁᏖᏐᏖᏚᎼᏢᏓᏥᏟᎦᎾᏙᎩ ᏈᏏᏂᏔᎶᎪᏛᎹᏊᎧᏚᏩᎷᏔᏌᏩᎩᏚᏫᏂᎠᏂᎠᏰᏟ ᎡᎶᎯ ᏓᏟᎶᏍᏗᏓᏅ" + - "Ꭲ ᏔᎹᏏᏘᎤᏚᎷᏘᎤᎹᏊᏅᏚᎤᎾᏍᎦᎸᏩᏱᏭᎾᏦᏩᎵᏎᎵᏬᎳᏱᏔᏩᎴᎧᎳᎻᎧᏐᎦᏰᎾᎦᏇᏂᏰᎹᏋᎨᎾᏙᏂᏏᎠᏟᎶᏍᏗ ᎼᎶᎪ ᏔᎹ" + - "ᏏᏘᏑᏂᏝ ᎦᏬᏂᎯᏍᏗ ᎦᎸᏛᎢ ᏱᎩᏌᏌᎪᎯᏊ ᎢᎬᏥᎩ ᎠᏟᎶᏍᏗ ᎡᎳᏈᎠᏟᏯᏂ ᎠᏂᏓᏥᏍᏫᏏ ᎦᎸᎳᏗ ᎠᏂᏓᏥᎡᎳᏗᏜ" + - " ᎩᎵᏏᎨᎾᏓ ᎩᎵᏏᎩᎵᏏᏲ ᎩᎵᏏᎠᎹᏰᏟ ᎩᎵᏏᏔᏘᏂ ᎠᎹᏰᏟ ᏍᏆᏂᎠᏂᏍᏆᏂᏱ ᏍᏆᏂᏍᏆᏂᏱ ᏍᏆᏂᎨᎾᏓ ᎦᎸᏥᏍᏫᏏ " + - "ᎦᎸᏥᎡᎳᏗ ᏁᏛᎳᏂᏊᎵᏥᎥᎻ ᏛᏥᏆᏏᎵᎢ ᏉᏧᎦᎵᏉᏥᎦᎳ ᏉᏧᎦᎵᎹᎵᏙᏫᎠ ᏣᎹᏂᎠᏂᎧᏂᎪ ᏍᏩᎯᎵᎠᎯᏗᎨ ᏓᎶᏂᎨᎤ" + - "ᏦᏍᏗ ᏓᎶᏂᎨ", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0018, 0x0018, 0x002a, 0x0033, 0x0042, 0x0051, - 0x005a, 0x0066, 0x0072, 0x007e, 0x008d, 0x009c, 0x00a8, 0x00ba, - 0x00c6, 0x00d2, 0x00de, 0x00ea, 0x00f3, 0x0102, 0x010e, 0x0117, - 0x0120, 0x0132, 0x0132, 0x0138, 0x0157, 0x0160, 0x0169, 0x0172, - 0x017b, 0x0184, 0x0190, 0x0196, 0x01a2, 0x01ab, 0x01bd, 0x01c6, - 0x01d8, 0x01e1, 0x01ed, 0x01f6, 0x01ff, 0x020b, 0x0217, 0x0220, - 0x0240, 0x0249, 0x025c, 0x026b, 0x0274, 0x0280, 0x028c, 0x0295, - 0x02a1, 0x02aa, 0x02aa, 0x02b9, 0x02cf, 0x02e1, 0x02e1, 0x02ea, - // Entry 40 - 7F - 0x0306, 0x0318, 0x0318, 0x0321, 0x0331, 0x0331, 0x0337, 0x034f, - 0x0361, 0x0370, 0x037c, 0x0389, 0x0395, 0x0395, 0x039e, 0x03ad, - 0x03b6, 0x03c5, 0x03ce, 0x03d7, 0x03e3, 0x03ec, 0x03f8, 0x0401, - 0x0407, 0x0410, 0x041f, 0x0428, 0x043d, 0x0446, 0x0455, 0x0461, - 0x0467, 0x0479, 0x0489, 0x0498, 0x04a4, 0x04b0, 0x04b6, 0x04c5, - 0x04d4, 0x04e6, 0x04ef, 0x04f5, 0x0501, 0x050a, 0x0513, 0x0529, - 0x0532, 0x053b, 0x0541, 0x055d, 0x0579, 0x0592, 0x059b, 0x05a7, - 0x05b3, 0x05b3, 0x05bc, 0x05c5, 0x05d1, 0x05dd, 0x05dd, 0x05e6, - // Entry 80 - BF - 0x05ef, 0x05fb, 0x0604, 0x0613, 0x061c, 0x062b, 0x0634, 0x0646, - 0x0655, 0x0664, 0x066d, 0x0684, 0x068d, 0x0699, 0x06a5, 0x06b7, - 0x06c3, 0x06c9, 0x06d2, 0x06de, 0x06ea, 0x06f3, 0x070d, 0x071c, - 0x0728, 0x0734, 0x073d, 0x0746, 0x074f, 0x0755, 0x0764, 0x0770, - 0x0779, 0x0785, 0x078e, 0x0797, 0x079d, 0x07ac, 0x07b2, 0x07c4, - 0x07cd, 0x07d9, 0x07e2, 0x07f4, 0x0800, 0x0809, 0x0812, 0x0818, - 0x0821, 0x082a, 0x082a, 0x0836, 0x083c, 0x0848, 0x0848, 0x0857, - 0x0860, 0x0860, 0x0860, 0x0869, 0x0872, 0x0872, 0x0872, 0x087e, - // Entry C0 - FF - 0x087e, 0x089e, 0x089e, 0x08aa, 0x08aa, 0x08b3, 0x08b3, 0x08bf, - 0x08bf, 0x08bf, 0x08bf, 0x08bf, 0x08bf, 0x08c5, 0x08c5, 0x08d7, - 0x08d7, 0x08e0, 0x08e0, 0x08ec, 0x08ec, 0x08f5, 0x08f5, 0x08f5, - 0x08f5, 0x08f5, 0x08fe, 0x08fe, 0x0904, 0x0904, 0x0904, 0x0904, - 0x0910, 0x0910, 0x0916, 0x0916, 0x0916, 0x0922, 0x0922, 0x0922, - 0x0922, 0x0922, 0x0928, 0x0928, 0x0928, 0x0937, 0x0937, 0x093d, - 0x093d, 0x093d, 0x093d, 0x0946, 0x0946, 0x094f, 0x0955, 0x0955, - 0x0955, 0x095e, 0x0964, 0x0964, 0x096d, 0x096d, 0x0976, 0x097f, - // Entry 100 - 13F - 0x0992, 0x0992, 0x0992, 0x0992, 0x09b5, 0x09b5, 0x09be, 0x09c7, - 0x09d0, 0x09d0, 0x09d0, 0x09e3, 0x09e3, 0x09e9, 0x09e9, 0x09ff, - 0x09ff, 0x0a08, 0x0a08, 0x0a15, 0x0a15, 0x0a1e, 0x0a27, 0x0a30, - 0x0a30, 0x0a30, 0x0a3c, 0x0a3c, 0x0a3c, 0x0a3c, 0x0a48, 0x0a48, - 0x0a48, 0x0a54, 0x0a54, 0x0a5a, 0x0a5a, 0x0a5a, 0x0a5a, 0x0a5a, - 0x0a5a, 0x0a5a, 0x0a69, 0x0a6c, 0x0a6c, 0x0a6c, 0x0a6c, 0x0a6c, - 0x0a6c, 0x0a72, 0x0a7e, 0x0a7e, 0x0a7e, 0x0a7e, 0x0a7e, 0x0a7e, - 0x0a8d, 0x0a8d, 0x0a8d, 0x0a8d, 0x0aa3, 0x0aa3, 0x0aa3, 0x0aa9, - // Entry 140 - 17F - 0x0ab2, 0x0ab2, 0x0ab2, 0x0abb, 0x0abb, 0x0aca, 0x0aca, 0x0ad6, - 0x0af5, 0x0af5, 0x0b01, 0x0b0a, 0x0b16, 0x0b1f, 0x0b2b, 0x0b2b, - 0x0b2b, 0x0b37, 0x0b40, 0x0b49, 0x0b49, 0x0b49, 0x0b49, 0x0b49, - 0x0b52, 0x0b5b, 0x0b61, 0x0b6a, 0x0b6a, 0x0b79, 0x0b79, 0x0b82, - 0x0b8b, 0x0b9d, 0x0b9d, 0x0ba3, 0x0ba3, 0x0ba9, 0x0ba9, 0x0bb9, - 0x0bb9, 0x0bb9, 0x0bbf, 0x0bce, 0x0bda, 0x0bda, 0x0be6, 0x0be6, - 0x0bec, 0x0c05, 0x0c05, 0x0c05, 0x0c14, 0x0c1d, 0x0c29, 0x0c32, - 0x0c41, 0x0c4a, 0x0c4a, 0x0c53, 0x0c5c, 0x0c5c, 0x0c5c, 0x0c68, - // Entry 180 - 1BF - 0x0c68, 0x0c68, 0x0c68, 0x0c71, 0x0c71, 0x0c71, 0x0c77, 0x0c8e, - 0x0c8e, 0x0c9e, 0x0c9e, 0x0ca7, 0x0cad, 0x0cb3, 0x0cbc, 0x0cbc, - 0x0cbc, 0x0cc8, 0x0cc8, 0x0cd1, 0x0cda, 0x0ce3, 0x0ce3, 0x0cec, - 0x0cec, 0x0cf5, 0x0cf5, 0x0cfe, 0x0d04, 0x0d13, 0x0d13, 0x0d23, - 0x0d2c, 0x0d38, 0x0d47, 0x0d47, 0x0d53, 0x0d5c, 0x0d65, 0x0d65, - 0x0d71, 0x0d93, 0x0d9c, 0x0da8, 0x0da8, 0x0da8, 0x0da8, 0x0db1, - 0x0dc0, 0x0dc0, 0x0dd2, 0x0dd8, 0x0dd8, 0x0de1, 0x0dea, 0x0df9, - 0x0df9, 0x0e02, 0x0e14, 0x0e1d, 0x0e1d, 0x0e1d, 0x0e23, 0x0e3a, - // Entry 1C0 - 1FF - 0x0e43, 0x0e43, 0x0e43, 0x0e52, 0x0e52, 0x0e52, 0x0e52, 0x0e52, - 0x0e61, 0x0e61, 0x0e70, 0x0e82, 0x0e91, 0x0e91, 0x0eaa, 0x0eaa, - 0x0eaa, 0x0eaa, 0x0eaa, 0x0eaa, 0x0eaa, 0x0eaa, 0x0eaa, 0x0eb6, - 0x0eb6, 0x0ebc, 0x0ebc, 0x0ebc, 0x0ec8, 0x0eda, 0x0eda, 0x0eda, - 0x0ee3, 0x0ee3, 0x0ee3, 0x0ee3, 0x0ee3, 0x0ef5, 0x0ef8, 0x0f04, - 0x0f0d, 0x0f0d, 0x0f19, 0x0f19, 0x0f25, 0x0f25, 0x0f31, 0x0f3a, - 0x0f49, 0x0f52, 0x0f52, 0x0f52, 0x0f5b, 0x0f61, 0x0f61, 0x0f61, - 0x0f77, 0x0f77, 0x0f77, 0x0f86, 0x0f8c, 0x0f8c, 0x0f8c, 0x0f8c, - // Entry 200 - 23F - 0x0f8c, 0x0fa6, 0x0fb3, 0x0fc3, 0x0fd6, 0x0fe2, 0x0fe2, 0x0ff8, - 0x0ff8, 0x0ffe, 0x0ffe, 0x1007, 0x1007, 0x1007, 0x1016, 0x1016, - 0x1022, 0x1022, 0x1022, 0x102b, 0x1031, 0x1031, 0x103a, 0x1043, - 0x1043, 0x1043, 0x1043, 0x104c, 0x104c, 0x104c, 0x104c, 0x104c, - 0x105c, 0x105c, 0x1065, 0x1065, 0x1065, 0x1065, 0x1071, 0x107a, - 0x1086, 0x1095, 0x10ce, 0x10da, 0x10da, 0x10e9, 0x10f8, 0x10fe, - 0x10fe, 0x10fe, 0x10fe, 0x10fe, 0x10fe, 0x10fe, 0x1107, 0x1113, - 0x111f, 0x1125, 0x1125, 0x1125, 0x1125, 0x1131, 0x1131, 0x1137, - // Entry 240 - 27F - 0x1137, 0x1137, 0x1146, 0x114f, 0x114f, 0x115e, 0x115e, 0x115e, - 0x115e, 0x115e, 0x1184, 0x118a, 0x11b4, 0x11ba, 0x11ea, 0x11ea, - 0x1203, 0x1226, 0x123c, 0x124f, 0x1265, 0x127b, 0x129b, 0x12b7, - 0x12cd, 0x12cd, 0x12e0, 0x12f3, 0x1309, 0x131f, 0x1338, 0x1351, - 0x1370, 0x1370, 0x1386, 0x139f, 0x13b8, - }, - }, - { // ckb - "ئەمهەرینجیعەرەبیئاسامیئازەربایجانیبێلاڕووسیبۆلگاریبەنگلادێشیبرێتونیبۆسنی" + - "كاتالۆنیچەكیوێلزیدانماركیئاڵمانییۆنانیئینگلیزیئێسپیرانتۆئیسپانیئیست" + - "ۆنیباسکیفارسیفینلەندیفەرانسیفریسیی ڕۆژاوائیرلەندیگالیسیگووارانیگوجا" + - "راتیهیبرێهیندیكرواتیهەنگاری (مەجاری)ئەرمەنیئێەندونیزیئیسلەندیئیتالی" + - "ژاپۆنیجاڤانیگۆرجستانیکازاخیکوردیكرگیزیلاتینیلينگالالاویلیتوانیلێتۆن" + - "یماكێدۆنیمەنگۆلیماراتینیپالیهۆڵەندینۆروێژیئۆرییاپەنجابیپۆڵۆنیایی (ل" + - "ەهستانی)پەشتووپورتوگالیڕۆمانیڕووسیسانسکريتسيندیسینهەلیسلۆڤاكیسلۆڤێن" + - "یسۆمالیئاڵبانیسەربیسێسۆتۆسودانیسویدیتامیلیتەلۆگویتاجیکیتایلەندیتیگر" + - "ینیایتورکمانیتورکیئويخووریئۆكراینیئۆردووئوزبەکیڤیەتنامیچینیزولوکورد" + - "یی ناوەندیمازەندەرانیکوردیی باشووریسامی باشووریزمانی نەناسراوئازەرب" + - "ایجانی باشووریئینگلیزیی ئۆسترالیاییئینگلیزیی کەنەداییئینگلیزیی بریت" + - "انیاییئینگلیزیی ئەمەریکاییپورتوگاڵی برازیلپورتوگاڵی (پورتوگاڵ)", - []uint16{ // 608 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, 0x0014, - 0x0020, 0x002c, 0x002c, 0x002c, 0x0044, 0x0044, 0x0056, 0x0064, - 0x0064, 0x0064, 0x0078, 0x0078, 0x0086, 0x0090, 0x00a0, 0x00a0, - 0x00a0, 0x00a0, 0x00a0, 0x00a8, 0x00a8, 0x00a8, 0x00b2, 0x00c2, - 0x00d0, 0x00d0, 0x00d0, 0x00d0, 0x00dc, 0x00ec, 0x0100, 0x010e, - 0x011c, 0x0126, 0x0130, 0x0130, 0x0140, 0x0140, 0x0140, 0x014e, - 0x0167, 0x0177, 0x0177, 0x0183, 0x0193, 0x01a3, 0x01a3, 0x01a3, - 0x01ad, 0x01b7, 0x01b7, 0x01c3, 0x01c3, 0x01e0, 0x01ee, 0x01ee, - // Entry 40 - 7F - 0x01ee, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0212, - 0x021e, 0x021e, 0x022a, 0x0236, 0x0248, 0x0248, 0x0248, 0x0248, - 0x0254, 0x0254, 0x0254, 0x0254, 0x0254, 0x0254, 0x0254, 0x025e, - 0x025e, 0x025e, 0x026a, 0x0276, 0x0276, 0x0276, 0x0276, 0x0284, - 0x028c, 0x029a, 0x029a, 0x02a6, 0x02a6, 0x02a6, 0x02a6, 0x02b6, - 0x02b6, 0x02c4, 0x02d0, 0x02d0, 0x02d0, 0x02d0, 0x02d0, 0x02d0, - 0x02dc, 0x02dc, 0x02ea, 0x02ea, 0x02f8, 0x02f8, 0x02f8, 0x02f8, - 0x02f8, 0x02f8, 0x02f8, 0x0304, 0x0304, 0x0312, 0x0312, 0x0337, - // Entry 80 - BF - 0x0343, 0x0355, 0x0355, 0x0355, 0x0355, 0x0361, 0x036b, 0x036b, - 0x037b, 0x037b, 0x0385, 0x0385, 0x0385, 0x0393, 0x03a1, 0x03af, - 0x03af, 0x03af, 0x03bb, 0x03c9, 0x03d3, 0x03d3, 0x03df, 0x03eb, - 0x03f5, 0x03f5, 0x0401, 0x040f, 0x041b, 0x042b, 0x043d, 0x044d, - 0x044d, 0x044d, 0x0457, 0x0457, 0x0457, 0x0457, 0x0467, 0x0477, - 0x0483, 0x0491, 0x0491, 0x04a1, 0x04a1, 0x04a1, 0x04a1, 0x04a1, - 0x04a1, 0x04a1, 0x04a1, 0x04a9, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - // Entry C0 - FF - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - // Entry 100 - 13F - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - // Entry 140 - 17F - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - // Entry 180 - 1BF - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, 0x04cc, - 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, - 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, - // Entry 1C0 - 1FF - 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, - 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, - 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, - 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, - 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, - 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, - 0x04e2, 0x04e2, 0x04e2, 0x04fd, 0x04fd, 0x04fd, 0x04fd, 0x04fd, - 0x04fd, 0x04fd, 0x04fd, 0x04fd, 0x04fd, 0x04fd, 0x04fd, 0x04fd, - // Entry 200 - 23F - 0x04fd, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, - 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, - 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, - 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, - 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, - 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x0514, 0x052f, 0x052f, - 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, - 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, - // Entry 240 - 27F - 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, - 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x0556, - 0x0556, 0x0556, 0x057f, 0x05a2, 0x05c9, 0x05f0, 0x05f0, 0x05f0, - 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x05f0, 0x060f, 0x0634, - }, - }, - { // cs - csLangStr, - csLangIdx, - }, - { // cy - "AffaregAbchasegAfestanegAffricânegAcanegAmharegAragonegArabegAsamegAfare" + - "gAymaregAserbaijanegBashcortegBelarwsegBwlgaregBislamaBambaregBengal" + - "egTibetegLlydawegBosniegCatalanegTsietsienegTsiamorroCorsegCriTsiece" + - "gHen SlafonegTshwfashegCymraegDanegAlmaenegDifehiDzongkhaEweGroegSae" + - "snegEsperantoSbaenegEstonegBasgegPersegFfwlaFfinnegFfijïegFfaröegFfr" + - "angegFfriseg y GorllewinGwyddelegGaeleg yr AlbanGalisiegGuaraníGwjar" + - "atiManawegHawsaHebraegHindiCroategCreol HaitiHwngaregArmenegHereroIn" + - "terlinguaIndonesegInterlingueIgboNwoswInwpiacegIdoIslandegEidalegInw" + - "ctitwtJapaneegJafanaegGeorgegCongoKikuyuKuanyamaCasachegKalaallisutC" + - "hmeregKannadaCoreegCanwriCashmiregCwrdegComiCernywegCirgisegLladinLw" + - "csembwrgegGandaLimbwrgegLingalaLaoegLithwanegLuba-KatangaLatfiegMala" + - "gasegMarsialegMaoriMacedonegMalayalamMongolegMarathiMaleiegMaltegByr" + - "manegNawrŵegNdebele GogleddolNepalegNdongaIseldiregNorwyeg NynorskNo" + - "rwyeg BokmålNdebele DeheuolNafahoNianjaOcsitanegOjibwaOromoOriyaOset" + - "egPwnjabegPaliPwylegPashtoPortiwgeegQuechuaRománshRwndiRwmanegRwsegC" + - "iniarŵandegSansgritSardegSindhiSami GogleddolSangoSinhalegSlofacegSl" + - "ofenegSamöegShonaSomalegAlbanegSerbegSwatiSesotheg DeheuolSwndanegSw" + - "edegSwahiliTamilegTeluguTajicegThaiTigrinyaTwrcmenegTswanaTongegTyrc" + - "egTsongaegTataregTahitïegUighurWcreinegWrdwWsbecegFendegFietnamegFol" + - "apükWalwnegWoloffXhosaIddew-AlmaenegIorwbaTsieineegSwlwAcehnegAcoliA" + - "dangmegCircaseg GorllewinolArabeg TunisiaAffrihiliAghemegAinŵegAcade" + - "gAlabamäegAlewtegGhegeg AlbaniaAltäeg DeheuolHen SaesnegAngikaAramae" + - "gArawcanegAraonaegArapahoArabeg AlgeriaArawacegArabeg MorocoArabeg y" + - "r AifftAswIaith Arwyddion AmericaAstwrianegAwadhiBalwtsiBalïegBasâeg" + - "BamwmegBejäegBembegBenaBaffwtegBadagaBalochi GorllewinolBhojpuriBini" + - "ComegSiksikaBrahuiBodoAcwsegBwriategBugineseBwlwBlinCadoCaribegAtsam" + - "egCebuanoTsigaChuukeseMariegSioctoTsierocîCheyenneCwrdeg SoraniCopte" + - "gTyrceg y CrimeaFfrangeg Seselwa CreoleDacotaegDargwaTaitaDogribDinc" + - "aZarmaegDogriSorbeg IsafDiwalegIseldireg CanolJola-FonyiDazagaEmbwEf" + - "ikHen EifftegEkajukElamegSaesneg CanolEwondoExtremaduregFfilipinegFf" + - "inneg TornedalFonFfrangeg CajwnFfrangeg CanolHen FfrangegArpitanegFf" + - "riseg GogleddolFfriseg y DwyrainFfriwlegGaGagauzGaioGbaiaDareg y Zor" + - "oastriaidGeezGilbertegAlmaeneg Uchel CanolHen Almaeneg UchelGorontal" + - "oGothegHen RoegAlmaeneg y SwistirGusiiGwichʼinHaidaHawäiegHiligaynon" + - "HethegHmongegSorbeg UchafHupaIbanegIbibioIlocanegIngwsiegLojbanNgomb" + - "aMatsiameIddew-BersiegIddew-ArabegCara-CalpacegCabilegKachinJjuCamba" + - "Circaseg DwyreiniolTyapegMacondegCaboferdianegKoroCàsegKoyra ChiiniC" + - "howaregKakoKalenjinKimbunduKomi-PermyakConcaniKpelleKarachay-BalkarC" + - "arelegKurukhShambalaBaffiaCwlenegCwmicegIddew-SbaenegLangiLahndaLamb" + - "aLezghegLakotaLombardegMongoLoziLuri GogleddolLatgalegLuba-LuluaLwnd" + - "aLŵoLwshaiegLwyiaMadwregMagahiMaithiliMacasaregMandingoMasaiMocsiaMa" + - "ndaregMendegMêrwMorisyenGwyddeleg CanolMakhuwa-MeettoMetaMicmacegMin" + - "angkabauManshwManipwriMohocegMosiMari GorllewinolMundangMwy nag un i" + - "aithCreekMirandegMarwariErzyaMasanderaniNapliegNamaAlmaeneg IselNewa" + - "egNiasNiueanAo NagaKwasioNgiemboonNogaiHen NorsegN’KoSotho Gogleddol" + - "NŵeregHen NewariNiamweziNiancoleNioroNzimegOsagegTyrceg OtomanPangas" + - "inegPahlafiPampangaPapiamentoPalawanPicardegPidgin NigeriaAlmaeneg P" + - "ensylfaniaHen BersiegAlmaeneg PalatinPhoenicegPiedmontegPontegPohnpe" + - "ianegPrwsegHen BrofensalegK’iche’RajasthanegRapanŵiRaratongegRomboRo" + - "maniRotumanegAromanegRwaSandäwegSakhaAramaeg SamariaSambŵrwSasacegSa" + - "ntaliNgambeiegSangwSisilegSgotegSasareseg SardiniaCwrdeg DeheuolSene" + - "caSenaSeriSelcypegKoyraboro SenniHen WyddelegSamogitegTachelhitShanA" + - "rabeg ChadSidamoIs-silesiegSami DeheuolSami LwleSami InariSami Scolt" + - "SonincegSogdegSranan TongoSereregSahoFfriseg SaterlandSwcwmaSwsŵegSw" + - "meregComoregHen SyriegSyriegSilesiegTuluTimnegTesoTerenaTetumegTigre" + - "gTifegTocelawegTsakhuregKlingonLlingitTalyshegTamashecegTok PisinTar" + - "okoTsaconegTwmbwcaTwfalwegTasawaqTwfwniegTamaseit Canolbarth MorocoF" + - "otiacegWgaritegUmbunduY GwraiddFaiegFenisegFepsFflemeg GorllewinolFo" + - "tegFunjoWalseregWalamoWinarayegWashoWarlpiriCalmycegSogaIangbenIemba" + - "egCantoneegZapotecegBlisssymbolsZêlandegTamaseit SafonolZuniDim cynn" + - "wys ieithyddolZazäegArabeg Modern SafonolAserbaijaneg DeheuolAlmaene" + - "g AwstriaAlmaeneg Safonol y SwistirSaesneg AwstraliaSaesneg CanadaSa" + - "esneg PrydainSaesneg AmericaSbaeneg America LadinSbaeneg EwropSbaene" + - "g MecsicoFfrangeg CanadaFfrangeg y SwistirSacsoneg IselFflemegPortiw" + - "geeg BrasilPortiwgeeg EwropMoldofegSerbo-CroategSwahili’r CongoTsiei" + - "neeg SymledigTsieineeg Traddodiadol", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0007, 0x000f, 0x0018, 0x0023, 0x0029, 0x0030, 0x0038, - 0x003e, 0x0044, 0x004a, 0x0051, 0x005d, 0x0067, 0x0070, 0x0078, - 0x007f, 0x0087, 0x008f, 0x0096, 0x009e, 0x00a5, 0x00ae, 0x00b9, - 0x00c2, 0x00c8, 0x00cb, 0x00d2, 0x00de, 0x00e8, 0x00ef, 0x00f4, - 0x00fc, 0x0102, 0x010a, 0x010d, 0x0112, 0x0119, 0x0122, 0x0129, - 0x0130, 0x0136, 0x013c, 0x0141, 0x0148, 0x0150, 0x0158, 0x0160, - 0x0173, 0x017c, 0x018b, 0x0193, 0x019b, 0x01a3, 0x01aa, 0x01af, - 0x01b6, 0x01bb, 0x01bb, 0x01c2, 0x01cd, 0x01d5, 0x01dc, 0x01e2, - // Entry 40 - 7F - 0x01ed, 0x01f6, 0x0201, 0x0205, 0x020a, 0x0213, 0x0216, 0x021e, - 0x0225, 0x022e, 0x0236, 0x023e, 0x0245, 0x024a, 0x0250, 0x0258, - 0x0260, 0x026b, 0x0272, 0x0279, 0x027f, 0x0285, 0x028e, 0x0294, - 0x0298, 0x02a0, 0x02a8, 0x02ae, 0x02ba, 0x02bf, 0x02c8, 0x02cf, - 0x02d4, 0x02dd, 0x02e9, 0x02f0, 0x02f9, 0x0302, 0x0307, 0x0310, - 0x0319, 0x0321, 0x0328, 0x032f, 0x0335, 0x033d, 0x0345, 0x0356, - 0x035d, 0x0363, 0x036c, 0x037b, 0x038a, 0x0399, 0x039f, 0x03a5, - 0x03ae, 0x03b4, 0x03b9, 0x03be, 0x03c4, 0x03cc, 0x03d0, 0x03d6, - // Entry 80 - BF - 0x03dc, 0x03e6, 0x03ed, 0x03f5, 0x03fa, 0x0401, 0x0406, 0x0413, - 0x041b, 0x0421, 0x0427, 0x0435, 0x043a, 0x0442, 0x044a, 0x0452, - 0x0459, 0x045e, 0x0465, 0x046c, 0x0472, 0x0477, 0x0487, 0x048f, - 0x0495, 0x049c, 0x04a3, 0x04a9, 0x04b0, 0x04b4, 0x04bc, 0x04c5, - 0x04cb, 0x04d1, 0x04d7, 0x04df, 0x04e6, 0x04ef, 0x04f5, 0x04fd, - 0x0501, 0x0508, 0x050e, 0x0517, 0x051f, 0x0526, 0x052c, 0x0531, - 0x053f, 0x0545, 0x0545, 0x054e, 0x0552, 0x0559, 0x055e, 0x0566, - 0x057a, 0x0588, 0x0591, 0x0598, 0x059f, 0x05a5, 0x05af, 0x05b6, - // Entry C0 - FF - 0x05c4, 0x05d3, 0x05de, 0x05e4, 0x05eb, 0x05f4, 0x05fc, 0x0603, - 0x0611, 0x0611, 0x0619, 0x0626, 0x0635, 0x0638, 0x064f, 0x0659, - 0x0659, 0x065f, 0x0666, 0x066d, 0x066d, 0x0674, 0x067b, 0x067b, - 0x067b, 0x0682, 0x0688, 0x0688, 0x068c, 0x0694, 0x069a, 0x06ad, - 0x06b5, 0x06b5, 0x06b9, 0x06b9, 0x06be, 0x06c5, 0x06c5, 0x06c5, - 0x06c5, 0x06cb, 0x06cf, 0x06d5, 0x06dd, 0x06e5, 0x06e9, 0x06ed, - 0x06ed, 0x06f1, 0x06f8, 0x06f8, 0x06ff, 0x0706, 0x070b, 0x070b, - 0x070b, 0x0713, 0x0719, 0x0719, 0x071f, 0x071f, 0x0728, 0x0730, - // Entry 100 - 13F - 0x073d, 0x0743, 0x0743, 0x0752, 0x0769, 0x0769, 0x0771, 0x0777, - 0x077c, 0x077c, 0x077c, 0x0782, 0x0787, 0x078e, 0x0793, 0x079e, - 0x079e, 0x07a5, 0x07b4, 0x07be, 0x07be, 0x07c4, 0x07c8, 0x07cc, - 0x07cc, 0x07d7, 0x07dd, 0x07e3, 0x07f0, 0x07f0, 0x07f6, 0x0802, - 0x0802, 0x080c, 0x081c, 0x081f, 0x082d, 0x083b, 0x0847, 0x0850, - 0x0861, 0x0872, 0x087a, 0x087c, 0x0882, 0x0882, 0x0886, 0x088b, - 0x089f, 0x08a3, 0x08ac, 0x08ac, 0x08c0, 0x08d2, 0x08d2, 0x08d2, - 0x08db, 0x08e1, 0x08e1, 0x08e9, 0x08fb, 0x08fb, 0x08fb, 0x0900, - // Entry 140 - 17F - 0x0909, 0x090e, 0x090e, 0x0916, 0x0916, 0x0920, 0x0926, 0x092d, - 0x0939, 0x0939, 0x093d, 0x0943, 0x0949, 0x0951, 0x0959, 0x0959, - 0x0959, 0x095f, 0x0965, 0x096d, 0x097a, 0x0986, 0x0986, 0x0993, - 0x099a, 0x09a0, 0x09a3, 0x09a8, 0x09a8, 0x09bb, 0x09bb, 0x09c1, - 0x09c9, 0x09d6, 0x09d6, 0x09da, 0x09da, 0x09e0, 0x09e0, 0x09ec, - 0x09f4, 0x09f4, 0x09f8, 0x0a00, 0x0a08, 0x0a14, 0x0a1b, 0x0a1b, - 0x0a21, 0x0a30, 0x0a30, 0x0a30, 0x0a37, 0x0a3d, 0x0a45, 0x0a4b, - 0x0a52, 0x0a59, 0x0a59, 0x0a66, 0x0a6b, 0x0a71, 0x0a76, 0x0a7d, - // Entry 180 - 1BF - 0x0a7d, 0x0a7d, 0x0a7d, 0x0a83, 0x0a8c, 0x0a91, 0x0a95, 0x0aa3, - 0x0aab, 0x0ab5, 0x0ab5, 0x0aba, 0x0abe, 0x0ac6, 0x0acb, 0x0acb, - 0x0acb, 0x0ad2, 0x0ad2, 0x0ad8, 0x0ae0, 0x0ae9, 0x0af1, 0x0af6, - 0x0af6, 0x0afc, 0x0b04, 0x0b0a, 0x0b0f, 0x0b17, 0x0b26, 0x0b34, - 0x0b38, 0x0b40, 0x0b4b, 0x0b51, 0x0b59, 0x0b60, 0x0b64, 0x0b74, - 0x0b7b, 0x0b8b, 0x0b90, 0x0b98, 0x0b9f, 0x0b9f, 0x0b9f, 0x0ba4, - 0x0baf, 0x0baf, 0x0bb6, 0x0bba, 0x0bc7, 0x0bcd, 0x0bd1, 0x0bd7, - 0x0bde, 0x0be4, 0x0bed, 0x0bf2, 0x0bfc, 0x0bfc, 0x0c02, 0x0c11, - // Entry 1C0 - 1FF - 0x0c18, 0x0c22, 0x0c2a, 0x0c32, 0x0c37, 0x0c3d, 0x0c43, 0x0c50, - 0x0c5a, 0x0c61, 0x0c69, 0x0c73, 0x0c7a, 0x0c82, 0x0c90, 0x0ca4, - 0x0ca4, 0x0caf, 0x0cbf, 0x0cc8, 0x0cd2, 0x0cd8, 0x0ce3, 0x0ce9, - 0x0cf8, 0x0d03, 0x0d03, 0x0d0e, 0x0d16, 0x0d20, 0x0d20, 0x0d20, - 0x0d25, 0x0d2b, 0x0d34, 0x0d34, 0x0d34, 0x0d3c, 0x0d3f, 0x0d48, - 0x0d4d, 0x0d5c, 0x0d64, 0x0d6b, 0x0d72, 0x0d72, 0x0d7b, 0x0d80, - 0x0d87, 0x0d8d, 0x0d9f, 0x0dad, 0x0db3, 0x0db7, 0x0dbb, 0x0dc3, - 0x0dd2, 0x0dde, 0x0de7, 0x0df0, 0x0df4, 0x0dff, 0x0e05, 0x0e10, - // Entry 200 - 23F - 0x0e10, 0x0e1c, 0x0e25, 0x0e2f, 0x0e39, 0x0e41, 0x0e47, 0x0e53, - 0x0e5a, 0x0e5e, 0x0e6f, 0x0e75, 0x0e7c, 0x0e83, 0x0e8a, 0x0e94, - 0x0e9a, 0x0ea2, 0x0ea6, 0x0eac, 0x0eb0, 0x0eb6, 0x0ebd, 0x0ec3, - 0x0ec8, 0x0ed1, 0x0eda, 0x0ee1, 0x0ee8, 0x0ef0, 0x0efa, 0x0efa, - 0x0f03, 0x0f03, 0x0f09, 0x0f11, 0x0f11, 0x0f11, 0x0f18, 0x0f20, - 0x0f27, 0x0f2f, 0x0f49, 0x0f51, 0x0f59, 0x0f60, 0x0f69, 0x0f6e, - 0x0f75, 0x0f79, 0x0f8c, 0x0f8c, 0x0f91, 0x0f91, 0x0f96, 0x0f9e, - 0x0fa4, 0x0fad, 0x0fb2, 0x0fba, 0x0fba, 0x0fc2, 0x0fc2, 0x0fc6, - // Entry 240 - 27F - 0x0fc6, 0x0fc6, 0x0fcd, 0x0fd4, 0x0fd4, 0x0fdd, 0x0fe6, 0x0ff2, - 0x0ffb, 0x0ffb, 0x100b, 0x100f, 0x1025, 0x102c, 0x1041, 0x1055, - 0x1065, 0x107f, 0x1090, 0x109e, 0x10ad, 0x10bc, 0x10d1, 0x10de, - 0x10ed, 0x10ed, 0x10fc, 0x110e, 0x111b, 0x1122, 0x1133, 0x1143, - 0x114b, 0x1158, 0x1169, 0x117b, 0x1191, - }, - }, - { // da - daLangStr, - daLangIdx, - }, - { // dav - "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + - "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + - "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + - "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + - "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + - "rubaKichinaKizuluKitaita", - []uint16{ // 265 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, - 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, - 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, - 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, - // Entry 40 - 7F - 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, - 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, - 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, - // Entry 80 - BF - 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, - 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, - 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, - 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, - 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, - 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry C0 - FF - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 100 - 13F - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0170, - }, - }, - { // de - deLangStr, - deLangIdx, - }, - { // de-AT - "Hausakaribische SpracheChibcha-SpracheDelawarischFriulanischHawaiianisch" + - "Miao-SpracheMuskogee-SpracheNiueanischPangasinensischSchlesischmoder" + - "nes HocharabischSerbokroatisch", - []uint16{ // 610 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - // Entry 40 - 7F - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - // Entry 80 - BF - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - // Entry C0 - FF - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, - // Entry 100 - 13F - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, - 0x0026, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - // Entry 140 - 17F - 0x003c, 0x003c, 0x003c, 0x0048, 0x0048, 0x0048, 0x0048, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - // Entry 180 - 1BF - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0064, 0x0064, 0x0064, 0x0064, 0x0064, 0x0064, - 0x0064, 0x0064, 0x0064, 0x0064, 0x0064, 0x0064, 0x0064, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - // Entry 1C0 - 1FF - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - // Entry 200 - 23F - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - // Entry 240 - 27F - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x009c, 0x009c, - 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, - 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, - 0x009c, 0x00aa, - }, - }, - { // de-CH - "WeissrussischAceh-SpracheAcholi-SpracheBasaa-SpracheBikol-SpracheBini-Sp" + - "racheChibcha-SpracheDinka-SprachePangwe-SpracheGbaya-SpracheKimbundu" + - "-SpracheMuskogee-SpracheAltpreussisch", - []uint16{ // 472 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - // Entry 40 - 7F - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - // Entry 80 - BF - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x0019, 0x0027, 0x0027, - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, - // Entry C0 - FF - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0041, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - // Entry 100 - 13F - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0084, - 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, - 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, - // Entry 140 - 17F - 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, - 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, - 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, - 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, - 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, - 0x0084, 0x0084, 0x0084, 0x0084, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - // Entry 180 - 1BF - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, - 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, - 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, - // Entry 1C0 - 1FF - 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, - 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, - 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00b1, - }, - }, - { // de-LU - "Belarussisch", - []uint16{ // 15 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, - }, - }, - { // dje - "Akan senniAmhaarik senniLaaraw senniBelaruus senniBulagaari senniBengali" + - " senniCek senniAlmaŋ senniGrek senniInglisi senniEspaaɲe senniFarsi " + - "senniFransee senniHawsance senniInduu senniHungaari senniIndoneesi s" + - "enniIboo senniItaali senniJaponee senniJavanee senniKmeer senniKoree" + - " senniMaleezi senniBurme senniNeepal senniHolandee senniPunjaabi sen" + - "niiPolonee senniPortugee senniRumaani senniRuusi senniRwanda senniSo" + - "maali senniSuweede senniTamil senniTaailandu senniTurku senniUkreen " + - "senniUrdu senniVietnaam senniYorbance senniSinuwa senniZulu senniZar" + - "maciine", - []uint16{ // 270 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0018, 0x0018, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0032, 0x0041, - 0x0041, 0x0041, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, - 0x004e, 0x004e, 0x004e, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0063, 0x0063, 0x0063, 0x0063, 0x006d, 0x007a, 0x007a, 0x0088, - 0x0088, 0x0088, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x00a0, - 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00ae, - 0x00ae, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00c7, 0x00c7, 0x00c7, - // Entry 40 - 7F - 0x00c7, 0x00d6, 0x00d6, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00ec, 0x00ec, 0x00f9, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0111, 0x0111, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x0129, 0x0129, 0x0134, 0x0134, 0x0134, - 0x0140, 0x0140, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, - 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x015d, 0x015d, 0x016a, - // Entry 80 - BF - 0x016a, 0x0178, 0x0178, 0x0178, 0x0178, 0x0185, 0x0190, 0x019c, - 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, - 0x019c, 0x019c, 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, - 0x01b6, 0x01b6, 0x01c1, 0x01c1, 0x01c1, 0x01d0, 0x01d0, 0x01d0, - 0x01d0, 0x01d0, 0x01db, 0x01db, 0x01db, 0x01db, 0x01db, 0x01e7, - 0x01f1, 0x01f1, 0x01f1, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, - 0x01ff, 0x020d, 0x020d, 0x0219, 0x0223, 0x0223, 0x0223, 0x0223, - 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, - // Entry C0 - FF - 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, - 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, - 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, - 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, - 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, - 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, - 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, - 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, - // Entry 100 - 13F - 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, - 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x022d, - }, - }, - { // dsb - "afaršćinaabchazšćinaafrikansakanšćinaamharšćinaaragonšćinaarabšćinaasamš" + - "ćinaawaršćinaaymaršćinaazerbajdžanšćinabaškiršćinaběłorušćinabulgar" + - "šćinabislamšćinabambarabengalšćinatibetšćinabretonšćinabosnišćinaka" + - "tanlanšćinačamoršćinakorsišćinakričešćinawalizišćinadanšćinanimšćina" + - "divehidzongkhaewegrichišćinaengelšćinaesperantošpańšćinaestišćinabas" + - "kišćinapersišćinafinšćinafidžišćinaferejšćinafrancojšćinafrizišćinai" + - "ršćinašotišćinagalicišćinaguaranigudžaratšćinamanšćinahausahebrejšći" + - "nahindišćinachorwatšćinahaitišćinahungoršćinaarmeńšćinainterlinguain" + - "donešćinaigbosichuan yiinupiakidoislandšćinaitalšćinainuitšćinajapań" + - "šćinajavašćinageorgišćinakikuyukazachšćinagrönlandšćinakambodžanšći" + - "nakannadšćinakorejańšćinakašmiršćinakurdišćinakornišćinakirgišćinała" + - "tyńšćinaluxemburgšćinagandšćinalimburšćinalingalalaošćinalitawšćinal" + - "uba-katangaletišćinamalgašćinamaorišćinamakedońšćinamalajamšćinamong" + - "olšćinamaratišćinamalajšćinamaltašćinaburmašćinanaurušćinapódpołnocn" + - "e ndebelenepalšćinanižozemšćinanorwegske nynorsknorwegske bokmålnava" + - "hookcitanšćinaoromoorojišćinapandžabšćinapólšćinapaštunšćinaportugal" + - "šćinakečuaretoromańšćinakirundišćinarumunšćinarušćinakinjarwandasan" + - "skritsardinšćinasindšćinalapšćinasangosingalšćinasłowakšćinasłowjeńš" + - "ćinasamošćinašonšćinasomališćinaalbanšćinaserbišćinasiswatipódpołdn" + - "jowa sotšćina (Sesotho)sundanšćinašwedšćinaswahilišćinatamilšćinatel" + - "ugšćinatadžikišćinathailandšćinatigrinjaturkmeńšćinatswanatonganšćin" + - "aturkojšćinatsongatataršćinatahitišćinaujguršćinaukrainšćinaurdušćin" + - "ausbekšćinavietnamšćinavolapükwalonšćinawolofxhosajidišćinajorubšćin" + - "azhuangchinšćinazuluaghemanglosaksojšćinaarawkašćinapareasturšćinabe" + - "mbabenabodobugišćinachigachoctawšćinacherokeesoranitaitazarmadolnose" + - "rbšćinadualajola-fonyiembufilipinšćinagagauzšćinagotišćinašwicarska " + - "nimšćinagusiihawaiišćinagórnoserbšćinangombamachamekabylšćinakambama" + - "kondekapverdšćinakoyra chiinikalenjinkomi-permyakkonkanišambalabafia" + - "langilakotšćinaluoluhyamasaišćinamerumauriciska kreolšćinamakhuwa-me" + - "ettometa’mohawkšćinamundangkriknamadolnonimšćinakwasion’konuernyanko" + - "leprusčinakʼicheʼromborwasamburusangusicilianišćinasenakoyra sennita" + - "šelhitpódpołdnjowa samišćinalule-samišćinainari-samišćinaskolt-sami" + - "šćinasaterfrizišćinatesotasawaqcentralnoatlaski tamazightnjeznata r" + - "ěcvaivunjosogastandardny marokkański tamazightžedno rěcne wopśimjeś" + - "emoderna wusokoarabšćinaawstriska nimšćinašwicarska wusokonimšćinaaw" + - "stralska engelšćinakanadiska engelšćinabritiska engelšćinaameriska e" + - "ngelšćinałatyńskoamerikańska špańšćinaeuropejska špańšćinamexikańska" + - " špańšćinakanadiska francojšćinašwicarska francojšćinaflamšćinabrazi" + - "lska portugalšćinaeuropejska portugalšćinamoldawišćinaserbochorwatšć" + - "inakongojska swahilišćinachinšćina (zjadnorjona)chinšćina (tradicion" + - "alna)", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000b, 0x0018, 0x0018, 0x0020, 0x002b, 0x0037, 0x0044, - 0x004f, 0x005a, 0x0065, 0x0071, 0x0084, 0x0092, 0x00a1, 0x00ae, - 0x00bb, 0x00c2, 0x00cf, 0x00db, 0x00e8, 0x00f4, 0x0103, 0x0103, - 0x0110, 0x011c, 0x011f, 0x0129, 0x0129, 0x0129, 0x0136, 0x0140, - 0x014a, 0x0150, 0x0158, 0x015b, 0x0168, 0x0174, 0x017d, 0x018a, - 0x0195, 0x01a1, 0x01ad, 0x01ad, 0x01b7, 0x01c4, 0x01d0, 0x01de, - 0x01ea, 0x01f3, 0x01ff, 0x020c, 0x0213, 0x0223, 0x022d, 0x0232, - 0x023f, 0x024b, 0x024b, 0x0259, 0x0265, 0x0272, 0x027f, 0x027f, - // Entry 40 - 7F - 0x028a, 0x0297, 0x0297, 0x029b, 0x02a5, 0x02ac, 0x02af, 0x02bc, - 0x02c7, 0x02d3, 0x02e0, 0x02eb, 0x02f8, 0x02f8, 0x02fe, 0x02fe, - 0x030b, 0x031b, 0x032c, 0x0339, 0x0348, 0x0348, 0x0356, 0x0362, - 0x0362, 0x036e, 0x037a, 0x0388, 0x0398, 0x03a3, 0x03b0, 0x03b7, - 0x03c1, 0x03cd, 0x03d9, 0x03e4, 0x03f0, 0x03f0, 0x03fc, 0x040b, - 0x0419, 0x0426, 0x0433, 0x043f, 0x044b, 0x0457, 0x0463, 0x0478, - 0x0484, 0x0484, 0x0493, 0x04a4, 0x04b5, 0x04b5, 0x04bb, 0x04bb, - 0x04c9, 0x04c9, 0x04ce, 0x04da, 0x04da, 0x04e9, 0x04e9, 0x04f4, - // Entry 80 - BF - 0x0502, 0x0511, 0x0517, 0x0528, 0x0536, 0x0542, 0x054b, 0x0556, - 0x055e, 0x056b, 0x0576, 0x0580, 0x0585, 0x0592, 0x05a0, 0x05b0, - 0x05bb, 0x05c6, 0x05d3, 0x05df, 0x05eb, 0x05f2, 0x0615, 0x0622, - 0x062e, 0x063c, 0x0648, 0x0654, 0x0663, 0x0672, 0x067a, 0x0689, - 0x068f, 0x069c, 0x06a9, 0x06af, 0x06bb, 0x06c8, 0x06d4, 0x06e1, - 0x06ec, 0x06f8, 0x06f8, 0x0706, 0x070e, 0x071a, 0x071f, 0x0724, - 0x072f, 0x073b, 0x0741, 0x074c, 0x0750, 0x0750, 0x0750, 0x0750, - 0x0750, 0x0750, 0x0750, 0x0755, 0x0755, 0x0755, 0x0755, 0x0755, - // Entry C0 - FF - 0x0755, 0x0755, 0x0767, 0x0767, 0x0767, 0x0774, 0x0774, 0x0774, - 0x0774, 0x0774, 0x0774, 0x0774, 0x0774, 0x0778, 0x0778, 0x0784, - 0x0784, 0x0784, 0x0784, 0x0784, 0x0784, 0x0784, 0x0784, 0x0784, - 0x0784, 0x0784, 0x0789, 0x0789, 0x078d, 0x078d, 0x078d, 0x078d, - 0x078d, 0x078d, 0x078d, 0x078d, 0x078d, 0x078d, 0x078d, 0x078d, - 0x078d, 0x078d, 0x0791, 0x0791, 0x0791, 0x079c, 0x079c, 0x079c, - 0x079c, 0x079c, 0x079c, 0x079c, 0x079c, 0x079c, 0x07a1, 0x07a1, - 0x07a1, 0x07a1, 0x07a1, 0x07a1, 0x07af, 0x07af, 0x07b7, 0x07b7, - // Entry 100 - 13F - 0x07bd, 0x07bd, 0x07bd, 0x07bd, 0x07bd, 0x07bd, 0x07bd, 0x07bd, - 0x07c2, 0x07c2, 0x07c2, 0x07c2, 0x07c2, 0x07c7, 0x07c7, 0x07d7, - 0x07d7, 0x07dc, 0x07dc, 0x07e6, 0x07e6, 0x07e6, 0x07ea, 0x07ea, - 0x07ea, 0x07ea, 0x07ea, 0x07ea, 0x07ea, 0x07ea, 0x07ea, 0x07ea, - 0x07ea, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f8, - 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x0805, 0x0805, 0x0805, 0x0805, - 0x0805, 0x0805, 0x0805, 0x0805, 0x0805, 0x0805, 0x0805, 0x0805, - 0x0805, 0x0810, 0x0810, 0x0810, 0x0825, 0x0825, 0x0825, 0x082a, - // Entry 140 - 17F - 0x082a, 0x082a, 0x082a, 0x0837, 0x0837, 0x0837, 0x0837, 0x0837, - 0x0848, 0x0848, 0x0848, 0x0848, 0x0848, 0x0848, 0x0848, 0x0848, - 0x0848, 0x0848, 0x084e, 0x0855, 0x0855, 0x0855, 0x0855, 0x0855, - 0x0861, 0x0861, 0x0861, 0x0866, 0x0866, 0x0866, 0x0866, 0x0866, - 0x086d, 0x087b, 0x087b, 0x087b, 0x087b, 0x087b, 0x087b, 0x0887, - 0x0887, 0x0887, 0x0887, 0x088f, 0x088f, 0x089b, 0x08a2, 0x08a2, - 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08aa, 0x08af, - 0x08af, 0x08af, 0x08af, 0x08af, 0x08b4, 0x08b4, 0x08b4, 0x08b4, - // Entry 180 - 1BF - 0x08b4, 0x08b4, 0x08b4, 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08c0, - 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08c3, 0x08c3, 0x08c8, 0x08c8, - 0x08c8, 0x08c8, 0x08c8, 0x08c8, 0x08c8, 0x08c8, 0x08c8, 0x08d4, - 0x08d4, 0x08d4, 0x08d4, 0x08d4, 0x08d8, 0x08ef, 0x08ef, 0x08fd, - 0x0904, 0x0904, 0x0904, 0x0904, 0x0904, 0x0911, 0x0911, 0x0911, - 0x0918, 0x0918, 0x091c, 0x091c, 0x091c, 0x091c, 0x091c, 0x091c, - 0x091c, 0x091c, 0x091c, 0x0920, 0x092f, 0x092f, 0x092f, 0x092f, - 0x092f, 0x0935, 0x0935, 0x0935, 0x0935, 0x0935, 0x093b, 0x093b, - // Entry 1C0 - 1FF - 0x093f, 0x093f, 0x093f, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, - 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, - 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, 0x0950, - 0x0950, 0x0959, 0x0959, 0x0959, 0x0959, 0x0959, 0x0959, 0x0959, - 0x095e, 0x095e, 0x095e, 0x095e, 0x095e, 0x095e, 0x0961, 0x0961, - 0x0961, 0x0961, 0x0968, 0x0968, 0x0968, 0x0968, 0x0968, 0x096d, - 0x097d, 0x097d, 0x097d, 0x097d, 0x097d, 0x0981, 0x0981, 0x0981, - 0x098c, 0x098c, 0x098c, 0x0995, 0x0995, 0x0995, 0x0995, 0x0995, - // Entry 200 - 23F - 0x0995, 0x09af, 0x09bf, 0x09d0, 0x09e1, 0x09e1, 0x09e1, 0x09e1, - 0x09e1, 0x09e1, 0x09f2, 0x09f2, 0x09f2, 0x09f2, 0x09f2, 0x09f2, - 0x09f2, 0x09f2, 0x09f2, 0x09f2, 0x09f6, 0x09f6, 0x09f6, 0x09f6, - 0x09f6, 0x09f6, 0x09f6, 0x09f6, 0x09f6, 0x09f6, 0x09f6, 0x09f6, - 0x09f6, 0x09f6, 0x09f6, 0x09f6, 0x09f6, 0x09f6, 0x09f6, 0x09f6, - 0x09fd, 0x09fd, 0x0a17, 0x0a17, 0x0a17, 0x0a17, 0x0a24, 0x0a27, - 0x0a27, 0x0a27, 0x0a27, 0x0a27, 0x0a27, 0x0a27, 0x0a2c, 0x0a2c, - 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a30, - // Entry 240 - 27F - 0x0a30, 0x0a30, 0x0a30, 0x0a30, 0x0a30, 0x0a30, 0x0a30, 0x0a30, - 0x0a30, 0x0a30, 0x0a51, 0x0a51, 0x0a6b, 0x0a6b, 0x0a84, 0x0a84, - 0x0a98, 0x0ab3, 0x0aca, 0x0ae0, 0x0af5, 0x0b0a, 0x0b2e, 0x0b46, - 0x0b5f, 0x0b5f, 0x0b77, 0x0b90, 0x0b90, 0x0b9b, 0x0bb4, 0x0bce, - 0x0bdc, 0x0bef, 0x0c07, 0x0c20, 0x0c3b, - }, - }, - { // dua - "duálá", - []uint16{ // 274 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 100 - 13F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, - }, - }, - { // dyo - "akanamharikarabbelarusbulgaaribengalisekalmangreekangleespañolpersanfran" + - "sehausaenduongruaindoneesiigboitaliensaponeesavaneekmeerkoreemaleesi" + - "birmaninepaleesneerlandepenjabipoloneesportugeesrumeenrusruandasomal" + - "isueditamiltayturkiukrainurduvietnamyorubasinuasulujoola", - []uint16{ // 276 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000b, 0x000b, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x0016, 0x001e, - 0x001e, 0x001e, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x002d, 0x002d, 0x002d, 0x002d, 0x0032, 0x0037, 0x0037, 0x003f, - 0x003f, 0x003f, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x004b, - 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x0050, - 0x0050, 0x0054, 0x0054, 0x0054, 0x0054, 0x005a, 0x005a, 0x005a, - // Entry 40 - 7F - 0x005a, 0x0063, 0x0063, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, - 0x006e, 0x006e, 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, - 0x007c, 0x007c, 0x0081, 0x0081, 0x0086, 0x0086, 0x0086, 0x0086, - 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, - 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, - 0x0086, 0x0086, 0x0086, 0x008d, 0x008d, 0x0094, 0x0094, 0x0094, - 0x009c, 0x009c, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00ac, 0x00ac, 0x00b4, - // Entry 80 - BF - 0x00b4, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00c3, 0x00c6, 0x00cc, - 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, - 0x00cc, 0x00cc, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, - 0x00d7, 0x00d7, 0x00dc, 0x00dc, 0x00dc, 0x00df, 0x00df, 0x00df, - 0x00df, 0x00df, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00ea, - 0x00ee, 0x00ee, 0x00ee, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, - 0x00f5, 0x00fb, 0x00fb, 0x0100, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - // Entry C0 - FF - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - // Entry 100 - 13F - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0109, - }, - }, - { // dz - "ཨ་ཕར་ཁཨཱབ་ཁ་ཟི་ཡ་ཁཨཕ་རི་ཀཱནས་ཁཨམ་ཧ་རིཀ་ཁཨེ་ར་བིཀ་ཁཨ་ས་མིས་ཁཨ་ཛར་བྷའི་ཇཱན" + - "་ཁབེལ་ཨ་རུས་ཁབཱལ་གེ་རི་ཡཱན་ཁབངྒ་ལ་ཁབོད་ཁབྷོས་ནི་ཡཱན་ཁཀེ་ཊ་ལཱན་ཁཅེཀ" + - "་ཁཝེལཤ་ཁཌེ་ནིཤ་ཁཇཱར་མཱན་ཁདི་བེ་ཧི་ཁརྫོང་ཁགྲིཀ་ཁཨིང་ལིཤ་ཁཨེས་པ་རཱན་" + - "ཏོ་ཁཨིས་པེ་ནིཤ་ཁཨེས་ཊོ་ནི་ཡཱན་ཁབཱསཀ་ཁཔར་ཤི་ཡཱན་ཁཕི་ནིཤ་ཁཕི་ཇི་ཡཱན་" + - "ཁཕཱ་རོ་ཨིས་ཁཕྲནཅ་ཁནུབ་ཕྼི་སི་ཡན་ཁཨཱའི་རིཤ་ཁགལ་ཨིས་ཨི་ཡན་ཁགུ་ཝ་ར་ནི" + - "་ཁགུ་ཇ་ར་ཏི་ཁཧཝ་ས་ཁཧེ་བྲུ་ཁཧིན་དི་ཁཀྲོ་ཨེ་ཤི་ཡཱན་ཁཧེ་ཏི་ཡཱན་ཁཧཱང་ག" + - "ྷ་རི་ཡཱན་ཁཨར་མི་ནི་ཡཱན་ཁཨིན་ཌོ་ནེ་ཤི་ཡཱན་ཁཨིག་བོ་ཁཨ་ཡིས་ལེན་ཌིཀ་ཁཨ" + - "ི་ཊ་ལི་ཡཱན་ཁཇཱ་པཱ་ནིས་ཁཇཱ་བ་ནིས་ཁཇཽ་ཇི་ཡཱན་ཁཀ་ཛགས་ཁཁེ་མེར་ཁཀ་ན་ཌ་ཁ" + - "ཀོ་རི་ཡཱན་ཁཀཱཤ་མི་རི་ཁཀར་ཌིཤ་ཁཀིར་གིས་ཁལེ་ཊིན་ཁལག་ཛམ་བོརྒ་ཁལཱ་ཝོས་" + - "ཁལི་ཐུ་ཝེ་ནི་ཡཱན་ཁལཊ་བི་ཡཱན་ཁམ་ལ་ག་སི་ཁམ་ཨོ་རི་ཁམ་སེ་ཌོ་ནི་ཡཱན་ཁམ་" + - "ལ་ཡ་ལམ་ཁམ་ར་ཐི་ཁམ་ལེ་ཁམཱལ་ཊ་ཁབར་མིས་ཁནེ་པཱལི་ཁཌཆ་ཁནོར་ཝེ་ཇི་ཡཱན་ནོ" + - "རསཀ་ཁནོར་ཝེ་ཇི་ཡཱན་བོཀ་མཱལ་ཁཨོ་རི་ཡ་ཁཔཱན་ཇ་བི་ཁཔོ་ལིཤ་ཁཔཱཤ་ཏོ་ཁཔོར" + - "་ཅུ་གིས་ཁཀྭེ་ཆུ་ཨ་ཁརོ་མེ་ནིཤ་ཁརོ་མེ་ནི་ཡཱན་ཁཨུ་རུ་སུའི་ཁསཾསྐྲྀཏ་ཁས" + - "ིན་དཱི་ཁསིང་ཧ་ལ་ཁསུ་ལོ་བཱཀ་ཁསུ་ལོ་བི་ནི་ཡཱན་ཁསོ་མ་ལི་ཁཨཱལ་བེ་ནི་ཡཱ" + - "ན་ཁསཱར་བྷི་ཡཱན་ཁསཱུན་ད་ནིས་ཁསུའི་ཌིཤ་ཁསྭཱ་ཧི་ལི་ཁཏ་མིལ་ཁཏེ་ལུ་གུ་ཁ" + - "ཏ་ཇིཀ་ཁཐཱའི་ཁཏིག་རི་ཉ་ཁཊཱརཀ་མེན་ཁཊོང་གྷན་ཁཊཱར་ཀིཤ་ཁཊ་ཊར་ཁཝི་གུར་ཁཡ" + - "ུ་ཀེ་རེ་ནི་ཡཱན་ཁཨུར་དུ་ཁཨུས་བེཀ་ཁབེཊ་ནཱ་མིས་ཁཝོ་ལོཕ་ཁཞོ་ས་ཁཡོ་རུ་བ" + - "་ཁརྒྱ་མི་ཁཟུ་ལུ་ཁད་ཀོ་ཏ་ཁཕི་ལི་པི་ནོ་ཁསུ་ཡིས་ཇཱར་མཱན་ཁཧ་ཝ་ཡིའི་ཁཀ་" + - "ཆིན་ཁཀོ་རོ་ཁམན་ཇུ་ཁཤཱན་ཁཁ་ངོ་མ་ཤེསཔསྐད་རིག་ནང་དོན་མེདཔཨཱོས་ཊྲི་ཡཱན" + - "་ཇཱར་མཱན་ཁསུ་ཡིས་གི་མཐོ་སའི་ཇཱར་མཱན་ཁཨཱོས་ཊྲེ་ལི་ཡཱན་ཨིང་ལིཤ་ཁཀེ་ན" + - "་ཌི་ཡཱན་ཨིང་ལིཤ་ཁབྲི་ཊིཤ་ཨིང་ལིཤ་ཁཡུ་ཨེས་ཨིང་ལིཤ་ཁལེ་ཊིན་ཨ་མེ་རི་ཀ" + - "ཱན་གི་ཨིས་པེ་ནིཤ་ཁཡུ་རོབ་ཀྱི་ཨིས་པེ་ནིཤ་ཁཀེ་ན་ཌི་ཡཱན་ཕྲནཅ་ཁསུ་ཡིས་" + - "ཕྲནཅ་ཁཕྷེལེ་མིཤ་ཁབྲ་ཛི་ལི་ཡཱན་པོར་ཅུ་གིས་ཁཨི་བེ་རི་ཡཱན་པོར་ཅུ་གིས་" + - "ཁརྒྱ་མི་ཁ་འཇམ་སངམསྔ་དུས་ཀྱི་རྒྱ་མི་ཁ", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0012, 0x0036, 0x0036, 0x005a, 0x005a, 0x0078, 0x0078, - 0x0096, 0x00b1, 0x00b1, 0x00b1, 0x00de, 0x00de, 0x00ff, 0x012c, - 0x012c, 0x012c, 0x0141, 0x0150, 0x0150, 0x0177, 0x0195, 0x0195, - 0x0195, 0x0195, 0x0195, 0x01a4, 0x01a4, 0x01a4, 0x01b6, 0x01ce, - 0x01e9, 0x0207, 0x0219, 0x0219, 0x022b, 0x0246, 0x0270, 0x0294, - 0x02c1, 0x02d3, 0x02f4, 0x02f4, 0x030c, 0x032d, 0x034e, 0x0360, - 0x038d, 0x03ab, 0x03ab, 0x03d5, 0x03f6, 0x0417, 0x0417, 0x0429, - 0x0441, 0x0459, 0x0459, 0x0486, 0x04a7, 0x04d4, 0x04fe, 0x04fe, - // Entry 40 - 7F - 0x04fe, 0x0534, 0x0534, 0x054c, 0x054c, 0x054c, 0x054c, 0x0579, - 0x05a0, 0x05a0, 0x05c1, 0x05df, 0x0600, 0x0600, 0x0600, 0x0600, - 0x0615, 0x0615, 0x062d, 0x0642, 0x0663, 0x0663, 0x0684, 0x069c, - 0x069c, 0x069c, 0x06b7, 0x06cf, 0x06f3, 0x06f3, 0x06f3, 0x06f3, - 0x070b, 0x073e, 0x073e, 0x075f, 0x077d, 0x077d, 0x0798, 0x07c8, - 0x07e6, 0x07e6, 0x07fe, 0x0810, 0x0825, 0x083d, 0x083d, 0x083d, - 0x0858, 0x0858, 0x0864, 0x08a3, 0x08e8, 0x08e8, 0x08e8, 0x08e8, - 0x08e8, 0x08e8, 0x08e8, 0x0903, 0x0903, 0x0921, 0x0921, 0x0939, - // Entry 80 - BF - 0x0951, 0x0975, 0x0993, 0x09b4, 0x09b4, 0x09de, 0x0a02, 0x0a02, - 0x0a1d, 0x0a1d, 0x0a38, 0x0a38, 0x0a38, 0x0a53, 0x0a74, 0x0aa7, - 0x0aa7, 0x0aa7, 0x0ac2, 0x0aef, 0x0b16, 0x0b16, 0x0b16, 0x0b3a, - 0x0b58, 0x0b79, 0x0b8e, 0x0bac, 0x0bc1, 0x0bd3, 0x0bf1, 0x0c0f, - 0x0c0f, 0x0c2a, 0x0c45, 0x0c45, 0x0c57, 0x0c57, 0x0c6f, 0x0ca2, - 0x0cba, 0x0cd5, 0x0cd5, 0x0cf9, 0x0cf9, 0x0cf9, 0x0d11, 0x0d23, - 0x0d23, 0x0d3e, 0x0d3e, 0x0d56, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, - 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, - // Entry C0 - FF - 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, - 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, - 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, - 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, - 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, - 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, - 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, - 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, - // Entry 100 - 13F - 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d83, 0x0d83, - 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, - 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, - 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, - 0x0d83, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, - 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, - 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, - 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0dda, 0x0dda, 0x0dda, 0x0dda, - // Entry 140 - 17F - 0x0dda, 0x0dda, 0x0dda, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, - 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, - 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, - 0x0df8, 0x0e0d, 0x0e0d, 0x0e0d, 0x0e0d, 0x0e0d, 0x0e0d, 0x0e0d, - 0x0e0d, 0x0e0d, 0x0e0d, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, - 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, - 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, - 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, - // Entry 180 - 1BF - 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, - 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, - 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, - 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, - 0x0e22, 0x0e22, 0x0e22, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, - 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, - 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, - 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, - // Entry 1C0 - 1FF - 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, - 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, - 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, - 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, - 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, - 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, - 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, - 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e46, 0x0e46, 0x0e46, 0x0e46, - // Entry 200 - 23F - 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, - 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, - 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, - 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, - 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, - 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e67, 0x0e67, - 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, - 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, - // Entry 240 - 27F - 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, - 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, - 0x0ee2, 0x0f33, 0x0f7e, 0x0fbd, 0x0ff0, 0x1020, 0x1086, 0x10cb, - 0x10cb, 0x10cb, 0x1101, 0x1128, 0x1128, 0x1149, 0x1194, 0x11df, - 0x11df, 0x11df, 0x11df, 0x120f, 0x1248, - }, - }, - { // ebu - "KĩakanKĩamhariKĩarabuKĩmbelarusiKĩbulgariaKĩbanglaKĩchekiKĩnjeremaniKĩng" + - "rikiKĩthunguKĩhispaniaKĩanjemiKĩfaransaKĩhausaKĩhindĩKĩhungariKĩindo" + - "nesiaKĩigboKĩitalianoKĩnjapaniKĩjavaKĩkambodiaKĩkoreaKĩmalesiaKĩburm" + - "aKĩnepaliKĩholanziKĩpunjabiKĩpolandiKĩrenoKĩromaniaKĩrusiKĩnyarwanda" + - "KĩsomaliKĩswidiKĩtamilKĩtailandiKĩturukiKĩukraniaKĩurduKĩvietinamuKĩ" + - "yorubaKĩchinaKĩzuluKĩembu", - []uint16{ // 279 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0010, 0x0010, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0024, 0x002f, - 0x002f, 0x002f, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x004c, 0x004c, 0x004c, 0x004c, 0x0055, 0x005e, 0x005e, 0x0069, - 0x0069, 0x0069, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x007c, - 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x0084, - 0x0084, 0x008d, 0x008d, 0x008d, 0x008d, 0x0097, 0x0097, 0x0097, - // Entry 40 - 7F - 0x0097, 0x00a3, 0x00a3, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00b5, 0x00b5, 0x00bf, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00d1, 0x00d1, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00e3, 0x00e3, 0x00eb, 0x00eb, 0x00eb, - 0x00f4, 0x00f4, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, - 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x0108, 0x0108, 0x0112, - // Entry 80 - BF - 0x0112, 0x0119, 0x0119, 0x0119, 0x0119, 0x0123, 0x012a, 0x0136, - 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, - 0x0136, 0x0136, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - 0x0147, 0x0147, 0x014f, 0x014f, 0x014f, 0x015a, 0x015a, 0x015a, - 0x015a, 0x015a, 0x0163, 0x0163, 0x0163, 0x0163, 0x0163, 0x016d, - 0x0174, 0x0174, 0x0174, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0189, 0x0189, 0x0191, 0x0198, 0x0198, 0x0198, 0x0198, - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - // Entry C0 - FF - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - // Entry 100 - 13F - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x019f, - }, - }, - { // ee - "abkhaziagbeafrikaangbeblugbeamhariagbeArabiagbeassamegbeaymargbeazerbaij" + - "angbebelarusiagbebulgariagbebambaragbeBengaligbetibetagbebretongbebo" + - "sniagbekatalagbetsɛkgbewalesgbedenmarkgbeGermaniagbedivehgbedzongkha" + - "gbeEʋegbegrisigbeYevugbeesperantogbeSpanishgbeestoniagbebasqugbepers" + - "iagbefinlanɖgbefidzigbeFransegbeirelanɖgbegalatagbeguarangbegujarati" + - "hausagbehebrigbeHindigbekroatiagbehaitigbehungarigbearmeniagbeIndone" + - "siagbeigbogbeicelanɖgbeItaliagbeJapangbedzavangbegɔgiagbekazakhstang" + - "bekhmergbekannadagbeKoreagbekashmirgbekurdiagbekirghistangbelatinlak" + - "sembɔggbelingalalaogbelithuaniagbelatviagbemalagasegbemaorgbemakedon" + - "iagbemalayagbemongoliagbemarathiagbemalaygbemaltagbeburmagbedziehe n" + - "debelegbenepalgbeHollandgbenɔweigbe ninɔsknɔweigbe bokmålnyanjagbeor" + - "iyagbeossetiagbepundzabgbePolishgbepashtogbePortuguesegbekwetsuagber" + - "omanshgberundigberomaniagbeRussiagberuwandagbesanskrigbesindhgbedzie" + - "he samigbesangogbesinhalgbeslovakiagbesloveniagbesamoagbeshonagbesom" + - "aliagbealbaniagbeserbiagbeswatgbeanyiehe sothogbeswedengbeswahilitam" + - "ilgbetelegugbetadzikistangbeThailandgbetigrinyagbetɛkmengbetswanagbe" + - "tongagbeTurkishgbetsongagbetahitigbeuighurgbeukraingbeurdugbeuzbekis" + - "tangbevendagbevietnamgbewolofgbexhosagbeyorubagbeChinagbezulugbeaghe" + - "mgbeasagbebembagbebenagbebodogbeembugbeefigbefilipingbeswizerlanɖtɔw" + - "o ƒe germaniagbehawaigbecape verdegbelahndagbeluyiagbegbegbɔgblɔ sɔg" + - "bɔwodziehe sothogberombogberwagbesakagbekomorogbetetumgbetok pisigbe" + - "gbegbɔgblɔ manyawalsegbecantongbegbegbɔgblɔ manɔmeeGermaniagbe (Aust" + - "ria)Germaniagbe (Switzerland)Yevugbe (Australia)Yevugbe (Canada)Yevu" + - "gbe (Britain)Yevugbe (America)Spanishgbe (Latin America)Spanishgbe (" + - "Europe)Spanishgbe (Mexico)Fransegbe (Canada)Fransegbe (Switzerland)F" + - "lemishgbePortuguesegbe (Brazil)Portuguesegbe (Europe)serbo-croatiagb" + - "etsainagbeblema tsainagbe", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000b, 0x000b, 0x0016, 0x001c, 0x0026, 0x0026, - 0x002f, 0x0038, 0x0038, 0x0040, 0x004d, 0x004d, 0x0059, 0x0064, - 0x0064, 0x006e, 0x0078, 0x0081, 0x008a, 0x0093, 0x009c, 0x009c, - 0x009c, 0x009c, 0x009c, 0x00a4, 0x00a4, 0x00a4, 0x00ac, 0x00b6, - 0x00c1, 0x00c9, 0x00d4, 0x00db, 0x00e3, 0x00ea, 0x00f6, 0x0100, - 0x010a, 0x0112, 0x011b, 0x011b, 0x0126, 0x012e, 0x012e, 0x0137, - 0x0137, 0x0142, 0x0142, 0x014b, 0x0154, 0x015c, 0x015c, 0x0164, - 0x016c, 0x0174, 0x0174, 0x017e, 0x0186, 0x0190, 0x019a, 0x019a, - // Entry 40 - 7F - 0x019a, 0x01a6, 0x01a6, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01b8, - 0x01c1, 0x01c1, 0x01c9, 0x01d2, 0x01db, 0x01db, 0x01db, 0x01db, - 0x01e8, 0x01e8, 0x01f0, 0x01fa, 0x0202, 0x0202, 0x020c, 0x0215, - 0x0215, 0x0215, 0x0222, 0x0227, 0x0234, 0x0234, 0x0234, 0x023b, - 0x0241, 0x024d, 0x024d, 0x0256, 0x0261, 0x0261, 0x0268, 0x0274, - 0x027d, 0x0288, 0x0293, 0x029b, 0x02a3, 0x02ab, 0x02ab, 0x02bc, - 0x02c4, 0x02c4, 0x02ce, 0x02df, 0x02f0, 0x02f0, 0x02f0, 0x02f9, - 0x02f9, 0x02f9, 0x02f9, 0x0301, 0x030b, 0x0315, 0x0315, 0x031e, - // Entry 80 - BF - 0x0327, 0x0334, 0x033e, 0x0348, 0x0350, 0x035a, 0x0363, 0x036d, - 0x0377, 0x0377, 0x037f, 0x038d, 0x0395, 0x039e, 0x03a9, 0x03b4, - 0x03bc, 0x03c4, 0x03ce, 0x03d8, 0x03e1, 0x03e8, 0x03f8, 0x03f8, - 0x0401, 0x0408, 0x0410, 0x0419, 0x0427, 0x0432, 0x043d, 0x0447, - 0x0450, 0x0458, 0x0462, 0x046b, 0x046b, 0x0474, 0x047d, 0x0486, - 0x048d, 0x049a, 0x04a2, 0x04ac, 0x04ac, 0x04ac, 0x04b4, 0x04bc, - 0x04bc, 0x04c5, 0x04c5, 0x04cd, 0x04d4, 0x04d4, 0x04d4, 0x04d4, - 0x04d4, 0x04d4, 0x04d4, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, - // Entry C0 - FF - 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, - 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04e2, 0x04e2, 0x04e2, - 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, - 0x04e2, 0x04e2, 0x04ea, 0x04ea, 0x04f1, 0x04f1, 0x04f1, 0x04f1, - 0x04f1, 0x04f1, 0x04f1, 0x04f1, 0x04f1, 0x04f1, 0x04f1, 0x04f1, - 0x04f1, 0x04f1, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, - 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, - 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, - // Entry 100 - 13F - 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, - 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, - 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04ff, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, - 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, - 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, - 0x050f, 0x050f, 0x050f, 0x050f, 0x052f, 0x052f, 0x052f, 0x052f, - // Entry 140 - 17F - 0x052f, 0x052f, 0x052f, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, - 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, - 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, - 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, - 0x0537, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, - 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, - 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, - 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x054d, 0x054d, 0x054d, - // Entry 180 - 1BF - 0x054d, 0x054d, 0x054d, 0x054d, 0x054d, 0x054d, 0x054d, 0x054d, - 0x054d, 0x054d, 0x054d, 0x054d, 0x054d, 0x054d, 0x0555, 0x0555, - 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, - 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, - 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, - 0x0555, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, - 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, - 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x057a, - // Entry 1C0 - 1FF - 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, - 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, - 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, - 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, - 0x0582, 0x0582, 0x0582, 0x0582, 0x0582, 0x0582, 0x0588, 0x0588, - 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, - 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, - 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, - // Entry 200 - 23F - 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, - 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x0598, 0x0598, - 0x0598, 0x0598, 0x0598, 0x0598, 0x0598, 0x0598, 0x05a0, 0x05a0, - 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, - 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05ab, - 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05bd, 0x05bd, - 0x05bd, 0x05bd, 0x05bd, 0x05bd, 0x05bd, 0x05bd, 0x05bd, 0x05c5, - 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05c5, - // Entry 240 - 27F - 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05ce, 0x05ce, 0x05ce, - 0x05ce, 0x05ce, 0x05ce, 0x05ce, 0x05e3, 0x05e3, 0x05e3, 0x05e3, - 0x05f8, 0x0611, 0x0624, 0x0634, 0x0645, 0x0656, 0x0670, 0x0683, - 0x0696, 0x0696, 0x06a8, 0x06bf, 0x06bf, 0x06c9, 0x06df, 0x06f5, - 0x06f5, 0x0705, 0x0705, 0x070e, 0x071d, - }, - }, - { // el - elLangStr, - elLangIdx, - }, - { // en - enLangStr, - enLangIdx, - }, - { // en-AU - "United States EnglishMoldovan", - []uint16{ // 609 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 100 - 13F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 140 - 17F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 180 - 1BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 1C0 - 1FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 200 - 23F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 240 - 27F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x001d, - }, - }, - { // en-IN - "BengaliOriya", - []uint16{ // 124 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x000c, - }, - }, - { // en-NZ - "Māori", - []uint16{ // 103 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, - }, - }, - { // eo - "afaraabĥazaafrikansatwamharaarabaasamaajmaraazerbajĝanabaŝkirabelorusabu" + - "lgarabislamobengalatibetabretonabosniakatalunakorsikaĉeĥakimradanage" + - "rmanamahladzonkogrekaanglaesperantohispanaestonaeŭskapersafinnafiĝia" + - "feroafrancafrisairlandagaelagalegagvaraniaguĝaratahaŭsahebreahindakr" + - "oatahaitia kreolahungaraarmenainterlingvaoindoneziaokcidentaloeskima" + - "islandaitalainuitajapanajavakartvelakazaĥagronlandakmerakanarakoreak" + - "aŝmirakurdakirgizalatinoluksemburgalingalalaŭalitovalatvamalagasamao" + - "riamakedonamalajalamamongolamaratamalajamaltabirmanauranepalanederla" + - "ndanovnorvegadannorvegaokcitanaoromaorijopanĝabapolapaŝtoaportugalak" + - "eĉuaromanĉaburundarumanarusaruandasanskritosindasangoasinhalaslovaka" + - "slovenasamoaŝonasomalaalbanaserbasvaziasotasundasvedasvahilatamilate" + - "luguataĝikatajatigrajaturkmenacvanatongaaturkacongatataraujguraukrai" + - "naurduouzbekavjetnamavolapukovolofaksosajidajorubaĝuangaĉinazuluaibi" + - "bioefikafilipinahavajaklingonanekonata lingvonelingvaĵobrazilportuga" + - "laeŭropportugalaserbo-Kroataĉina simpligitaĉina tradicia", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0005, 0x000c, 0x000c, 0x0015, 0x0017, 0x001d, 0x001d, - 0x0022, 0x0027, 0x0027, 0x002d, 0x0039, 0x0041, 0x0049, 0x0050, - 0x0057, 0x0057, 0x005e, 0x0064, 0x006b, 0x0071, 0x0079, 0x0079, - 0x0079, 0x0080, 0x0080, 0x0086, 0x0086, 0x0086, 0x008b, 0x008f, - 0x0096, 0x009b, 0x00a1, 0x00a1, 0x00a6, 0x00ab, 0x00b4, 0x00bb, - 0x00c1, 0x00c7, 0x00cc, 0x00cc, 0x00d1, 0x00d7, 0x00dc, 0x00e2, - 0x00e7, 0x00ee, 0x00f3, 0x00f9, 0x0101, 0x010a, 0x010a, 0x0110, - 0x0116, 0x011b, 0x011b, 0x0121, 0x012e, 0x0135, 0x013b, 0x013b, - // Entry 40 - 7F - 0x0147, 0x0150, 0x015b, 0x015b, 0x015b, 0x0161, 0x0161, 0x0168, - 0x016d, 0x0173, 0x0179, 0x017d, 0x0185, 0x0185, 0x0185, 0x0185, - 0x018c, 0x0195, 0x019a, 0x01a0, 0x01a5, 0x01a5, 0x01ad, 0x01b2, - 0x01b2, 0x01b2, 0x01b9, 0x01bf, 0x01ca, 0x01ca, 0x01ca, 0x01d1, - 0x01d6, 0x01dc, 0x01dc, 0x01e1, 0x01e9, 0x01e9, 0x01ef, 0x01f7, - 0x0201, 0x0208, 0x020e, 0x0214, 0x0219, 0x021e, 0x0223, 0x0223, - 0x0229, 0x0229, 0x0233, 0x023d, 0x0247, 0x0247, 0x0247, 0x0247, - 0x024f, 0x024f, 0x0254, 0x0259, 0x0259, 0x0261, 0x0261, 0x0265, - // Entry 80 - BF - 0x026c, 0x0275, 0x027b, 0x0283, 0x028a, 0x0290, 0x0294, 0x029a, - 0x02a3, 0x02a3, 0x02a8, 0x02a8, 0x02ae, 0x02b5, 0x02bc, 0x02c3, - 0x02c8, 0x02cd, 0x02d3, 0x02d9, 0x02de, 0x02e4, 0x02e8, 0x02ed, - 0x02f2, 0x02f9, 0x02ff, 0x0306, 0x030d, 0x0311, 0x0318, 0x0320, - 0x0325, 0x032b, 0x0330, 0x0335, 0x033b, 0x033b, 0x0341, 0x0348, - 0x034d, 0x0353, 0x0353, 0x035b, 0x0363, 0x0363, 0x0369, 0x036e, - 0x0372, 0x0378, 0x037f, 0x0384, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - // Entry C0 - FF - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - // Entry 100 - 13F - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0394, - 0x0394, 0x0394, 0x0394, 0x0394, 0x0394, 0x0394, 0x0394, 0x0394, - 0x0394, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, - 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, - 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, - 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, - // Entry 140 - 17F - 0x039c, 0x039c, 0x039c, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - // Entry 180 - 1BF - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - // Entry 1C0 - 1FF - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - // Entry 200 - 23F - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, - 0x03a2, 0x03a2, 0x03a2, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, - 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, - 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03b9, 0x03b9, - 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, - 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, - // Entry 240 - 27F - 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, - 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03c4, 0x03c4, 0x03c4, 0x03c4, - 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, - 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03d3, 0x03e2, - 0x03e2, 0x03ee, 0x03ee, 0x03fe, 0x040c, - }, - }, - { // es - esLangStr, - esLangIdx, - }, - { // es-419 - es419LangStr, - es419LangIdx, - }, - { // es-AR - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-BO - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-CL - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-CO - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-CR - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-DO - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-EC - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-GT - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-HN - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-MX - "bashkireuskeralaopunyabíkiroundisiswatisuajiliwolofacehnésarapahobasabam" + - "unbhojpurineerlandés medievalinglés medievalfrancés medievalgan (Chi" + - "na)alemán de la alta edad mediagriego antiguokejia (China)xiang (Chi" + - "na)irlandés medievalmin nan (Chino)sotho septentrionalárabe chadiano" + - "tamazight marroquí estándarsuajili del Congo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - // Entry 40 - 7F - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0019, 0x0019, 0x0019, - // Entry 80 - BF - 0x0019, 0x0019, 0x0019, 0x0019, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0028, 0x0028, 0x0028, - 0x0028, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - // Entry C0 - FF - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x0043, - 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, - 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0047, 0x004c, 0x004c, - 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - // Entry 100 - 13F - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0068, 0x0068, 0x0068, 0x0068, 0x0068, 0x0068, - 0x0068, 0x0068, 0x0068, 0x0068, 0x0078, 0x0078, 0x0078, 0x0078, - 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x00b1, 0x00b1, 0x00b1, 0x00b1, - 0x00b1, 0x00b1, 0x00b1, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - // Entry 140 - 17F - 0x00bf, 0x00bf, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, - 0x00cc, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - // Entry 180 - 1BF - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00eb, 0x00eb, - 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, - 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, - 0x00eb, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, - 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x010d, - // Entry 1C0 - 1FF - 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, - 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, - 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, - 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, - 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, - 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, - 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, - 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x011c, 0x011c, 0x011c, - // Entry 200 - 23F - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - // Entry 240 - 27F - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, - 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, - 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, - 0x0139, 0x0139, 0x014a, - }, - }, - { // es-NI - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-PA - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-PE - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-PR - "siswatiwolofacehnésarapahobhojpurigriego antiguosotho septentrional", - []uint16{ // 448 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - // Entry 100 - 13F - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - // Entry 140 - 17F - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - // Entry 180 - 1BF - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0044, - }, - }, - { // es-PY - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // es-SV - "siswatiwolofacehnésarapahobhojpurigriego antiguosotho septentrional", - []uint16{ // 448 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - // Entry 100 - 13F - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - // Entry 140 - 17F - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - // Entry 180 - 1BF - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0044, - }, - }, - { // es-US - "kiroundisiswatisetchwanawolofacehnésarapahobasabamunbhojpuriburiatneerla" + - "ndés medievalinglés medievalfrancés medievalalemán de la alta edad m" + - "ediagriego antiguohakalto sorbiocriollo caboverdianolushaiirlandés m" + - "edievalnansotho septentrionalpcmárabe chadianowuuswahili del Congo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - // Entry C0 - FF - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x0030, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, - 0x003d, 0x003d, 0x003d, 0x003d, 0x0043, 0x0043, 0x0043, 0x0043, - 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, - 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, - // Entry 100 - 13F - 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, - 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, - 0x0043, 0x0043, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0067, 0x0067, 0x0067, 0x0067, - 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0078, 0x0078, 0x0078, - 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, - 0x0078, 0x0078, 0x0078, 0x0078, 0x0095, 0x0095, 0x0095, 0x0095, - 0x0095, 0x0095, 0x0095, 0x00a3, 0x00a3, 0x00a3, 0x00a3, 0x00a3, - // Entry 140 - 17F - 0x00a3, 0x00a3, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, - 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, - 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, - 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, - 0x00b1, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - // Entry 180 - 1BF - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00dd, 0x00dd, - 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, - 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, - 0x00dd, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00f3, - // Entry 1C0 - 1FF - 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, - 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f6, 0x00f6, - 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, - 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, - 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, - 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, - 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, - 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x0105, 0x0105, 0x0105, - // Entry 200 - 23F - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0108, 0x0108, 0x0108, 0x0108, - // Entry 240 - 27F - 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, - 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, - 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, - 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, - 0x0108, 0x0108, 0x0119, - }, - }, - { // es-VE - "euskeralaopunyabísiswatisuajilisetswanawolofacehnésarapahobhojpurigriego" + - " antiguosotho septentrionaltamazight marroquí estándarsuajili del Co" + - "ngo", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0012, - // Entry 80 - BF - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 100 - 13F - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 140 - 17F - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 180 - 1BF - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 200 - 23F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 240 - 27F - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0093, - }, - }, - { // et - etLangStr, - etLangIdx, - }, - { // eu - "afareraabkhazeraafrikaansaakaneraamhareraaragoieraarabieraassameraavarer" + - "aaimaraazerbaijanerabashkirrerabielorrusierabulgarierabislamabambare" + - "rabengaleratibeterabretoierabosnierakatalanatxetxenierachamorrerakor" + - "sikeratxekieraElizako eslavierachuvasheragaleseradanieraalemanadiveh" + - "ieradzongkhaeweeragrezieraingelesaesperantoaespainieraestonieraeuska" + - "rapersierafulafinlandierafijierafaroerafrantsesafrisieragaelikoaesko" + - "ziako gaelikoagalizieraguaranieragujarateramanxerahausahebreerahindi" + - "akroazieraHaitiko kreolerahungarieraarmenierahererainterlinguaindone" + - "sierainterlingueigboerasichuan yiaidoislandieraitalierainuiterajapon" + - "ierajaverageorgierakikongoakikuyuerakuanyamakazakherakalaallisuterak" + - "hemererakannaderakoreerakanurierakashmirerakurduerakomierakornubiera" + - "kirgizeralatinaluxenburgeraganderalimburgeralingalalaoseralituaniera" + - "luba-katangeraletonieramalagasyeramarshalleramaorieramazedonieramala" + - "yalameramongolieramaratheramalaysieramalteraburmatarranaurueraiparra" + - "ldeko ndebeleeranepalerandongeranederlanderanynorsk norvegierabokmal" + - "a (Norvegia)hegoaldeko ndebeleranavahoeranyanjaokzitanieraoromoeraor" + - "iyaosetierapunjaberapolonierapaxtueraportugesaquechueraerromantxerar" + - "undieraerrumanieraerrusierakinyaruandasanskritoasardinierasindhiaipa" + - "rraldeko samierasangoerasinhalaeslovakieraeslovenierasamoerashoneras" + - "omalieraalbanieraserbieraswatierahegoaldeko sothoerasundanerasuedier" + - "aswahilitamileratelugueratajikistanerathailandieratigriñeraturkmenie" + - "ratswaneratongeraturkieratsongeratatareratahitierauigurreraukrainera" + - "urduauzbekeravenderavietnameravolapükavalonierawoloferaxhoserayiddis" + - "hayoruberatxinerazulueraacehneraacholieraadangmeraadygheraaghemeraai" + - "nueraaleuterahegoaldeko altaieraangikeramaputxeaarapahoaasuaasturier" + - "aawadhierabalierabasaabemberabenerabhojpureraedoerasiksikerabodoerab" + - "uginerabilenacebuerachigerachuukeramarierachoctawtxerokieracheyenner" + - "asoraniaseselwa frantses-kreoleradakoteradargverataiteradogriberazar" + - "merabehe-sorabieradualerafonyi joleradazagaembuaefikeraakajukaewonde" + - "ratagalogafonafriulieragagagauzerage’ezgilberteragorontaloaalemana (" + - "Suitza)gusiieragwichʼinhawaiierahiligainonahmonggoi-sorabierahuperai" + - "baneraibibioerailokaneraingusheralojbanerangombamachamerakabilerajin" + - "gpoerakaijikamberakabardierakatabamakonderaCabo Verdeko kreolakoroak" + - "ashiakoyra chiinierakakoakalenjinerakimbunduakomi-permyakerakonkanie" + - "rakpelleakarachayera-balkarerakarelierakurukherashambalerabafierakol" + - "onierakumykeraladineralangieralezgieralakoteralozieraiparraldeko lur" + - "eratxiluberalunderaluoeramizoaluhyeramadureramagahieramaithileramaka" + - "sareramasaieramokxeramendeeramerueraMauritaniako kreoleramakhuwa-mee" + - "ttoerameteramikmakeraminangkabaueramanipureramohawkeramoreeramudange" + - "rahizkuntza anitzakcreeramiranderaerzieramazandaranderanapolieraname" + - "ranewareraniasaniuerakwasierangiembooneranogaieran’koerapedieranuere" + - "raankolerapangasinanerapampangerapapiamentoapalaueraNigeriako pidgin" + - "aprusierak’iche’rarapa nuirarotongeraromboeraaromaniarwaerasandaweas" + - "akherasamburuerasantalerangambayerasanguerasizilieraeskozierasenerak" + - "oyraboro senniatachelhitashanerahegoaldeko samieralule samierainari-" + - "samieraskolt samierasoninkerasrananerasahoasukumerakomoreeraasiriera" + - "temneatesoeratetumatigreaklingoneratok pisinatarokoatumbukeratuvalue" + - "ratasawaqatuveraMaroko erdialdeko tamazightaudmurteraumbundueraerroa" + - "vaieravunjoawalsererawelaytasamererakalmykerasogerajangbenerayembaka" + - "ntoneratamazight estandarrazuñiaez dago eduki linguistikorikzazakiaa" + - "rabiera moderno estandarraAustriako alemanaaleman garaia (Suitza)Aus" + - "traliako ingelesaKanadako ingelesaBritainia Handiko ingelesaAEBko in" + - "gelesaLatinoamerikako espainieraespainiera (Europa)Mexikoko espainie" + - "raKanadako frantsesaSuitzako frantsesabehe-saxoieraflandrieraBrasilg" + - "o portugesaportugesa (Europa)moldavieraserbokroazieraKongoko swahili" + - "atxinera soilduatxinera tradizionala", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0007, 0x0010, 0x0010, 0x001a, 0x0021, 0x0029, 0x0032, - 0x003a, 0x0042, 0x0049, 0x004f, 0x005c, 0x0067, 0x0074, 0x007e, - 0x0085, 0x008e, 0x0097, 0x009f, 0x00a8, 0x00b0, 0x00b8, 0x00c3, - 0x00cd, 0x00d6, 0x00d6, 0x00de, 0x00ef, 0x00f9, 0x0101, 0x0108, - 0x010f, 0x0118, 0x0120, 0x0126, 0x012e, 0x0136, 0x0140, 0x014a, - 0x0153, 0x015a, 0x0162, 0x0166, 0x0171, 0x0178, 0x017f, 0x0188, - 0x0190, 0x0198, 0x01aa, 0x01b3, 0x01bd, 0x01c7, 0x01ce, 0x01d3, - 0x01db, 0x01e1, 0x01e1, 0x01ea, 0x01fa, 0x0204, 0x020d, 0x0213, - // Entry 40 - 7F - 0x021e, 0x0229, 0x0234, 0x023b, 0x0246, 0x0246, 0x0249, 0x0253, - 0x025b, 0x0263, 0x026c, 0x0272, 0x027b, 0x0283, 0x028c, 0x0294, - 0x029d, 0x02ab, 0x02b4, 0x02bd, 0x02c4, 0x02cd, 0x02d7, 0x02df, - 0x02e6, 0x02f0, 0x02f9, 0x02ff, 0x030b, 0x0312, 0x031c, 0x0323, - 0x032a, 0x0334, 0x0342, 0x034b, 0x0356, 0x0361, 0x0369, 0x0374, - 0x0380, 0x038a, 0x0393, 0x039d, 0x03a4, 0x03ae, 0x03b6, 0x03cc, - 0x03d4, 0x03dc, 0x03e8, 0x03fa, 0x040c, 0x0420, 0x0429, 0x042f, - 0x043a, 0x043a, 0x0442, 0x0447, 0x044f, 0x0458, 0x0458, 0x0461, - // Entry 80 - BF - 0x0469, 0x0472, 0x047b, 0x0487, 0x048f, 0x049a, 0x04a3, 0x04ae, - 0x04b8, 0x04c2, 0x04c9, 0x04dc, 0x04e4, 0x04eb, 0x04f6, 0x0501, - 0x0508, 0x050f, 0x0518, 0x0521, 0x0529, 0x0531, 0x0544, 0x054d, - 0x0555, 0x055c, 0x0564, 0x056d, 0x057a, 0x0586, 0x0590, 0x059b, - 0x05a3, 0x05aa, 0x05b2, 0x05ba, 0x05c2, 0x05cb, 0x05d4, 0x05dd, - 0x05e2, 0x05ea, 0x05f1, 0x05fb, 0x0604, 0x060d, 0x0615, 0x061c, - 0x0624, 0x062c, 0x062c, 0x0633, 0x063a, 0x0642, 0x064b, 0x0654, - 0x065c, 0x065c, 0x065c, 0x0664, 0x066b, 0x066b, 0x066b, 0x0673, - // Entry C0 - FF - 0x0673, 0x0686, 0x0686, 0x068e, 0x068e, 0x0696, 0x0696, 0x069e, - 0x069e, 0x069e, 0x069e, 0x069e, 0x069e, 0x06a2, 0x06a2, 0x06ab, - 0x06ab, 0x06b4, 0x06b4, 0x06bb, 0x06bb, 0x06c0, 0x06c0, 0x06c0, - 0x06c0, 0x06c0, 0x06c7, 0x06c7, 0x06cd, 0x06cd, 0x06cd, 0x06cd, - 0x06d7, 0x06d7, 0x06dd, 0x06dd, 0x06dd, 0x06e6, 0x06e6, 0x06e6, - 0x06e6, 0x06e6, 0x06ed, 0x06ed, 0x06ed, 0x06f5, 0x06f5, 0x06fb, - 0x06fb, 0x06fb, 0x06fb, 0x06fb, 0x06fb, 0x0702, 0x0709, 0x0709, - 0x0709, 0x0711, 0x0718, 0x0718, 0x071f, 0x071f, 0x0729, 0x0733, - // Entry 100 - 13F - 0x073a, 0x073a, 0x073a, 0x073a, 0x0753, 0x0753, 0x075b, 0x0763, - 0x076a, 0x076a, 0x076a, 0x0773, 0x0773, 0x077a, 0x077a, 0x0788, - 0x0788, 0x078f, 0x078f, 0x079b, 0x079b, 0x07a1, 0x07a6, 0x07ad, - 0x07ad, 0x07ad, 0x07b4, 0x07b4, 0x07b4, 0x07b4, 0x07bc, 0x07bc, - 0x07bc, 0x07c4, 0x07c4, 0x07c8, 0x07c8, 0x07c8, 0x07c8, 0x07c8, - 0x07c8, 0x07c8, 0x07d1, 0x07d3, 0x07dc, 0x07dc, 0x07dc, 0x07dc, - 0x07dc, 0x07e3, 0x07ed, 0x07ed, 0x07ed, 0x07ed, 0x07ed, 0x07ed, - 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x0807, 0x0807, 0x0807, 0x080f, - // Entry 140 - 17F - 0x0818, 0x0818, 0x0818, 0x0821, 0x0821, 0x082c, 0x082c, 0x0831, - 0x083e, 0x083e, 0x0844, 0x084b, 0x0854, 0x085d, 0x0866, 0x0866, - 0x0866, 0x086f, 0x0875, 0x087e, 0x087e, 0x087e, 0x087e, 0x087e, - 0x0886, 0x088f, 0x0894, 0x089b, 0x089b, 0x08a5, 0x08a5, 0x08ab, - 0x08b4, 0x08c7, 0x08c7, 0x08cc, 0x08cc, 0x08d2, 0x08d2, 0x08e1, - 0x08e1, 0x08e1, 0x08e6, 0x08f1, 0x08fa, 0x0909, 0x0913, 0x0913, - 0x091a, 0x092f, 0x092f, 0x092f, 0x0938, 0x0941, 0x094b, 0x0952, - 0x095b, 0x0963, 0x0963, 0x096b, 0x0973, 0x0973, 0x0973, 0x097b, - // Entry 180 - 1BF - 0x097b, 0x097b, 0x097b, 0x0983, 0x0983, 0x0983, 0x098a, 0x099c, - 0x099c, 0x09a5, 0x09a5, 0x09ac, 0x09b2, 0x09b7, 0x09be, 0x09be, - 0x09be, 0x09c6, 0x09c6, 0x09cf, 0x09d9, 0x09e3, 0x09e3, 0x09eb, - 0x09eb, 0x09f2, 0x09f2, 0x09fa, 0x0a01, 0x0a16, 0x0a16, 0x0a27, - 0x0a2d, 0x0a36, 0x0a44, 0x0a44, 0x0a4e, 0x0a57, 0x0a5e, 0x0a5e, - 0x0a67, 0x0a78, 0x0a7e, 0x0a87, 0x0a87, 0x0a87, 0x0a87, 0x0a8e, - 0x0a9c, 0x0a9c, 0x0aa5, 0x0aab, 0x0aab, 0x0ab3, 0x0ab8, 0x0abe, - 0x0abe, 0x0ac6, 0x0ad2, 0x0ada, 0x0ada, 0x0ada, 0x0ae3, 0x0aea, - // Entry 1C0 - 1FF - 0x0af1, 0x0af1, 0x0af1, 0x0af9, 0x0af9, 0x0af9, 0x0af9, 0x0af9, - 0x0b06, 0x0b06, 0x0b10, 0x0b1b, 0x0b23, 0x0b23, 0x0b34, 0x0b34, - 0x0b34, 0x0b34, 0x0b34, 0x0b34, 0x0b34, 0x0b34, 0x0b34, 0x0b3c, - 0x0b3c, 0x0b49, 0x0b49, 0x0b49, 0x0b51, 0x0b5c, 0x0b5c, 0x0b5c, - 0x0b64, 0x0b64, 0x0b64, 0x0b64, 0x0b64, 0x0b6c, 0x0b72, 0x0b7a, - 0x0b81, 0x0b81, 0x0b8b, 0x0b8b, 0x0b94, 0x0b94, 0x0b9e, 0x0ba6, - 0x0baf, 0x0bb8, 0x0bb8, 0x0bb8, 0x0bb8, 0x0bbe, 0x0bbe, 0x0bbe, - 0x0bce, 0x0bce, 0x0bce, 0x0bd8, 0x0bdf, 0x0bdf, 0x0bdf, 0x0bdf, - // Entry 200 - 23F - 0x0bdf, 0x0bf1, 0x0bfd, 0x0c0a, 0x0c17, 0x0c20, 0x0c20, 0x0c29, - 0x0c29, 0x0c2e, 0x0c2e, 0x0c36, 0x0c36, 0x0c36, 0x0c3f, 0x0c3f, - 0x0c47, 0x0c47, 0x0c47, 0x0c4d, 0x0c54, 0x0c54, 0x0c5a, 0x0c60, - 0x0c60, 0x0c60, 0x0c60, 0x0c6a, 0x0c6a, 0x0c6a, 0x0c6a, 0x0c6a, - 0x0c74, 0x0c74, 0x0c7b, 0x0c7b, 0x0c7b, 0x0c7b, 0x0c84, 0x0c8d, - 0x0c95, 0x0c9b, 0x0cb7, 0x0cc0, 0x0cc0, 0x0cca, 0x0ccf, 0x0cd5, - 0x0cd5, 0x0cd5, 0x0cd5, 0x0cd5, 0x0cd5, 0x0cd5, 0x0cdb, 0x0ce4, - 0x0ceb, 0x0cf3, 0x0cf3, 0x0cf3, 0x0cf3, 0x0cfc, 0x0cfc, 0x0d02, - // Entry 240 - 27F - 0x0d02, 0x0d02, 0x0d0c, 0x0d11, 0x0d11, 0x0d1a, 0x0d1a, 0x0d1a, - 0x0d1a, 0x0d1a, 0x0d2e, 0x0d34, 0x0d50, 0x0d57, 0x0d72, 0x0d72, - 0x0d83, 0x0d99, 0x0dad, 0x0dbe, 0x0dd8, 0x0de6, 0x0e00, 0x0e13, - 0x0e26, 0x0e26, 0x0e38, 0x0e4a, 0x0e57, 0x0e61, 0x0e73, 0x0e85, - 0x0e8f, 0x0e9d, 0x0ead, 0x0ebc, 0x0ed0, - }, - }, - { // ewo - "Ǹkɔ́bɔ akánǸkɔ́bɔ amáriaǸkɔ́bɔ arábiaǸkɔ́bɔ belarúsianǸkɔ́bɔ buləgárianǸ" + - "kɔ́bɔ bɛngalíǸkɔ́bɔ tsɛ́gǸkɔ́bɔ ndzámanǸkɔ́bɔ gəlɛ́gǸkɔ́bɔ éngəlísǹk" + - "ɔ́bɔ kpənyáǹkɔ́bɔ fɛ́rəsianǸkɔ́bɔ fulɛnsíǸkɔ́bɔ aúsáǸkɔ́bɔ hindíǸkɔ" + - "́bɔ ungáríanǸkɔ́bɔ ɛndonésianǸkɔ́bɔ ibóǸkɔ́bɔ etáliɛnǸkɔ́bɔ hapɔ́nǸ" + - "kɔ́bɔ havanísǸkɔ́bɔ kəmɛ́rǸkɔ́bɔ koréanǸkɔ́bɔ malɛ́sianǸkɔ́bɔ birəmá" + - "nǹkɔ́bɔ nefálianǸkɔ́bɔ nɛrəlándíaǹkɔ́bɔ funəhábiaǹkɔ́bɔ fólisǹkɔ́bɔ " + - "fɔtugɛ́sńkɔ́bɔ románíaǹkɔ́bɔ rúsianǹkɔ́bɔ ruwandáǹkɔ́bɔ somáliaǹkɔ́b" + - "ɔ suwɛ́dǹkɔ́bɔ tamílǹkɔ́bɔ táilanǹkɔ́bɔ túrəkiǹkɔ́bɔ ukeléniaǹkɔ́bɔ" + - " urudúǹkɔ́bɔ hiɛdənámǹkɔ́bɔ yorúbaǸkɔ́bɔ tsainísǹkɔ́bɔ zulúewondo", - []uint16{ // 287 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0022, 0x0022, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x004a, 0x0061, - 0x0061, 0x0061, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x009a, 0x009a, 0x009a, 0x009a, 0x00ae, 0x00c3, 0x00c3, 0x00d6, - 0x00d6, 0x00d6, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0112, - 0x0112, 0x0123, 0x0123, 0x0123, 0x0123, 0x0138, 0x0138, 0x0138, - // Entry 40 - 7F - 0x0138, 0x014f, 0x014f, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, - 0x0172, 0x0172, 0x0185, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, - 0x0198, 0x0198, 0x01ac, 0x01ac, 0x01be, 0x01be, 0x01be, 0x01be, - 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, - 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, - 0x01be, 0x01be, 0x01be, 0x01d4, 0x01d4, 0x01e8, 0x01e8, 0x01e8, - 0x01fc, 0x01fc, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, - 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x022b, 0x022b, 0x023c, - // Entry 80 - BF - 0x023c, 0x0252, 0x0252, 0x0252, 0x0252, 0x0266, 0x0278, 0x028b, - 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, - 0x028b, 0x028b, 0x029e, 0x029e, 0x029e, 0x029e, 0x029e, 0x029e, - 0x02b1, 0x02b1, 0x02c2, 0x02c2, 0x02c2, 0x02d4, 0x02d4, 0x02d4, - 0x02d4, 0x02d4, 0x02e7, 0x02e7, 0x02e7, 0x02e7, 0x02e7, 0x02fb, - 0x030c, 0x030c, 0x030c, 0x0322, 0x0322, 0x0322, 0x0322, 0x0322, - 0x0322, 0x0334, 0x0334, 0x0347, 0x0357, 0x0357, 0x0357, 0x0357, - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - // Entry C0 - FF - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - // Entry 100 - 13F - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, - 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x035d, - }, - }, - { // fa - faLangStr, - faLangIdx, - }, - { // fa-AF - "افریکانساسامیآذربایجانیباشقیریمالدیویهسپانویفنلندیآیرلندیکروشیاییاندونیز" + - "یاییآیسلندیایتالویجاپانیکوریاییقرغزیمغلینیپالیهالندینارویژیپولندیپر" + - "تگالیالبانیاییسویدنیسواحلیتاجکیکردی سورانی", - []uint16{ // 257 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x001a, 0x001a, 0x001a, 0x002e, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x0058, - 0x0058, 0x0058, 0x0058, 0x0058, 0x0064, 0x0064, 0x0064, 0x0064, - 0x0064, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - // Entry 40 - 7F - 0x0082, 0x0098, 0x0098, 0x0098, 0x0098, 0x0098, 0x0098, 0x00a6, - 0x00b4, 0x00b4, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, - 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00ce, 0x00ce, 0x00ce, 0x00ce, - 0x00ce, 0x00ce, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00ec, 0x00ec, 0x00f8, 0x00f8, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0112, - // Entry 80 - BF - 0x0112, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, - 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, - 0x0120, 0x0120, 0x0120, 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, - 0x013e, 0x014a, 0x014a, 0x014a, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - // Entry C0 - FF - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - // Entry 100 - 13F - 0x0169, - }, - }, - { // ff - "AkaanAmarikAarabeereBelaruuseBulgariireBengaliCekkereDocceereGerkeEngele" + - "ereEspañolPerseerePulaarFarayseereHawsaŋkooreHinndiHongariireEndones" + - "iireIgibooreItaliyeereSaponeereSawaneereKemeereKoreereMalayeereBurme" + - "eseNepaaleereDacceerePunjabeerePoloneerePurtugeereRomaneereRiisRuwaa" + - "nndeereSomaliiSweedeereTamilTaayTurkeereUkereneereUrduWiyetnameereYo" + - "rrubaaSinuwaareSuluŋkoore", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x000b, 0x000b, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x001d, 0x0027, - 0x0027, 0x0027, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x003d, 0x003d, 0x003d, 0x003d, 0x0042, 0x004b, 0x004b, 0x0053, - 0x0053, 0x0053, 0x005b, 0x0061, 0x0061, 0x0061, 0x0061, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x0077, - 0x0077, 0x007d, 0x007d, 0x007d, 0x007d, 0x0087, 0x0087, 0x0087, - // Entry 40 - 7F - 0x0087, 0x0092, 0x0092, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x00a4, 0x00a4, 0x00ad, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, - 0x00b6, 0x00b6, 0x00bd, 0x00bd, 0x00c4, 0x00c4, 0x00c4, 0x00c4, - 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, - 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, - 0x00c4, 0x00c4, 0x00c4, 0x00cd, 0x00cd, 0x00d5, 0x00d5, 0x00d5, - 0x00df, 0x00df, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, - 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00f1, 0x00f1, 0x00fa, - // Entry 80 - BF - 0x00fa, 0x0104, 0x0104, 0x0104, 0x0104, 0x010d, 0x0111, 0x011d, - 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, - 0x011d, 0x011d, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, - 0x012d, 0x012d, 0x0132, 0x0132, 0x0132, 0x0136, 0x0136, 0x0136, - 0x0136, 0x0136, 0x013e, 0x013e, 0x013e, 0x013e, 0x013e, 0x0148, - 0x014c, 0x014c, 0x014c, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, - 0x0158, 0x0160, 0x0160, 0x0169, 0x0174, - }, - }, - { // fi - fiLangStr, - fiLangIdx, - }, - { // fil - filLangStr, - filLangIdx, - }, - { // fo - "afarabkhasisktafrikaansakanamharisktaragonisktarabisktassamesisktavarisk" + - "taymaraaserbajdsjansktbashkirhvitarussisktbulgarsktbislamabambaraben" + - "galskttibetsktbretonsktbosnisktkatalanitjetjensktchamorrokorsikanskt" + - "kekkisktkirkju slávisktchuvashwalisisktdanskttýsktdivehidzongkhaeweg" + - "riksktensktesperantospansktestisktbaskisktpersisktfulahfinsktfijimál" + - "føroysktfransktvestur frísisktírsktskotskt gælisktgalisisktguaranigu" + - "jaratimanxhausahebraiskthindikroatiskthaitisktungarsktarmensktherero" + - "interlinguaindonesisktinterlingueigbosichuan yiidoíslendsktitalsktin" + - "uktitutjapansktjavansktgeorgisktkikuyukuanyamakazakhkalaallisutkhmer" + - "kannadakoreansktkanurikashmirikurdisktkomicornisktkyrgyzlatínluksemb" + - "orgsktgandalimburgisktlingalalaosktlitavisktluba-katangalettisktmala" + - "gassisktmarshallesisktmaorimakedónsktmalayalammongolsktmarathimalaii" + - "sktmaltisktburmesisktnaurunorður ndebelenepalsktndongahálendsktnýnor" + - "sktnorskt bókmálsuður ndebelenavajonyanjaoccitansktoromooriyaossetis" + - "ktpunjabipólsktpashtoportugiskisktquechuaretoromansktrundirumensktru" + - "ssisktkinyarwandasanskritsardisktsindhinorður sámisktsangosingalesis" + - "ktslovakisktslovensktsámoisktshonasomalisktalbansktserbisktswatiskts" + - "esothosundanesisktsvensktswahilitamilskttelugutajiktailendskttigriny" + - "aturkmenskttswanatongansktturkiskttsongatatartahitisktuyghurukrainsk" + - "turduusbekisktvendavjetnamesisktvolapykkwalloonwolofxhosajiddisktyor" + - "ubakinesisktsuluachineseadangmeadygheaghemainualeutsuður altaiangika" + - "mapuchearapahoasuasturiansktawadhibalinesisktbasaabembabenavestur ba" + - "lochibhojpuribinisiksikabodobakossibuginesisktblincebuanochigachuuke" + - "semarichoctawcherokeecheyennemiðkurdisktseselwa creole fransktdakota" + - "dargwataitadogribsarmalágt sorbiandualajola-fonyidazagaembuefikekaju" + - "kewondofilipinisktfonfriulisktgagagauzgan kinesisktgeezkiribatisktgo" + - "rontalotýskt (Sveis)gusiigwich’inhakka kinesiskthawaiianskthiligayno" + - "nhmongovara sorbianxiang kinesiskthupaibanibibioilokoinguishlojbanng" + - "ombamachamekabylekachinjjukambakabardinskttyapmakondegrønhøvdaoyggja" + - "rsktkorokhasikoyra chiinikakokalenjinkimbundukomi-permyakkonkanikpel" + - "lekarachay-balkarkarelsktkurukhshambalabafiakølnsktkumykladinolangil" + - "ahndalezghianlakotalozinorður luriluba-lulualundaluomizoluyiamadures" + - "isktmagahimaithilimakasarmasaimokshamendemerumorisyenmakhuwa-meettom" + - "etaʼmicmacminangkabaumanupurimohawkmossimundangymisk málcreekmirande" + - "siskterzyamazanderanimin nan kinesisktnapolitansktnamalágt týsktnewa" + - "riniasniueankwasiongiemboonnogainʼkonorður sothonuernyankolepangasin" + - "anpampangapapiamentopalauannigeriskt pidginprusslansktkʼicheʼrapanui" + - "rarotongisktromboaromensktrwasandawesakhasamburusantalingambaysangus" + - "isilansktskotsktsuður kurdisktsenakoyraboro sennitachelhitshansuður " + - "sámisktlule sámisktinari samiskolt sámisktsoninkesranan tongosahosuk" + - "umakomorisktsyriactimnetesotetumtigreklingonskttok pisintarokotumbuk" + - "atuvalutasawaqtuvinianmiðatlasfjøll tamazightudmurtumbundurootvaivun" + - "jowalserwolayttawaraywarlpiriwu kinesisktkalmyksogayangbenyembakanto" + - "nesisktvanligt marokanskt tamazightzunieinki málsligt innihaldzazanú" + - "tíðar vanligt arabiskthøgt týskt (Sveis)lágt saksisktflamsktportugis" + - "kiskt (Brasilia)portugiskiskt (Evropa)moldavisktserbokroatisktkongo " + - "svahilieinkult kinesisktvanligt kinesiskt", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000e, 0x000e, 0x0017, 0x001b, 0x0024, 0x002e, - 0x0036, 0x0041, 0x0049, 0x004f, 0x005e, 0x0065, 0x0072, 0x007b, - 0x0082, 0x0089, 0x0092, 0x009a, 0x00a3, 0x00ab, 0x00b3, 0x00bd, - 0x00c5, 0x00d0, 0x00d0, 0x00d8, 0x00e8, 0x00ef, 0x00f8, 0x00fe, - 0x0104, 0x010a, 0x0112, 0x0115, 0x011c, 0x0121, 0x012a, 0x0131, - 0x0138, 0x0140, 0x0148, 0x014d, 0x0153, 0x015b, 0x0164, 0x016b, - 0x017b, 0x0181, 0x0191, 0x019a, 0x01a1, 0x01a9, 0x01ad, 0x01b2, - 0x01bb, 0x01c0, 0x01c0, 0x01c9, 0x01d1, 0x01d9, 0x01e1, 0x01e7, - // Entry 40 - 7F - 0x01f2, 0x01fd, 0x0208, 0x020c, 0x0216, 0x0216, 0x0219, 0x0223, - 0x022a, 0x0233, 0x023b, 0x0243, 0x024c, 0x024c, 0x0252, 0x025a, - 0x0260, 0x026b, 0x0270, 0x0277, 0x0280, 0x0286, 0x028e, 0x0296, - 0x029a, 0x02a2, 0x02a8, 0x02ae, 0x02bb, 0x02c0, 0x02cb, 0x02d2, - 0x02d8, 0x02e1, 0x02ed, 0x02f5, 0x0301, 0x030f, 0x0314, 0x031f, - 0x0328, 0x0331, 0x0338, 0x0341, 0x0349, 0x0353, 0x0358, 0x0367, - 0x036f, 0x0375, 0x037f, 0x0388, 0x0397, 0x03a5, 0x03ab, 0x03b1, - 0x03bb, 0x03bb, 0x03c0, 0x03c5, 0x03ce, 0x03d5, 0x03d5, 0x03dc, - // Entry 80 - BF - 0x03e2, 0x03ef, 0x03f6, 0x0402, 0x0407, 0x040f, 0x0417, 0x0422, - 0x042a, 0x0432, 0x0438, 0x0448, 0x044d, 0x0459, 0x0463, 0x046c, - 0x0475, 0x047a, 0x0483, 0x048b, 0x0493, 0x049b, 0x04a2, 0x04ae, - 0x04b5, 0x04bc, 0x04c4, 0x04ca, 0x04cf, 0x04d9, 0x04e1, 0x04eb, - 0x04f1, 0x04fa, 0x0502, 0x0508, 0x050d, 0x0516, 0x051c, 0x0525, - 0x0529, 0x0532, 0x0537, 0x0544, 0x054c, 0x0553, 0x0558, 0x055d, - 0x0565, 0x056b, 0x056b, 0x0574, 0x0578, 0x0580, 0x0580, 0x0587, - 0x058d, 0x058d, 0x058d, 0x0592, 0x0596, 0x0596, 0x0596, 0x059b, - // Entry C0 - FF - 0x059b, 0x05a7, 0x05a7, 0x05ad, 0x05ad, 0x05b4, 0x05b4, 0x05bb, - 0x05bb, 0x05bb, 0x05bb, 0x05bb, 0x05bb, 0x05be, 0x05be, 0x05c9, - 0x05c9, 0x05cf, 0x05cf, 0x05da, 0x05da, 0x05df, 0x05df, 0x05df, - 0x05df, 0x05df, 0x05e4, 0x05e4, 0x05e8, 0x05e8, 0x05e8, 0x05f6, - 0x05fe, 0x05fe, 0x0602, 0x0602, 0x0602, 0x0609, 0x0609, 0x0609, - 0x0609, 0x0609, 0x060d, 0x0614, 0x0614, 0x061f, 0x061f, 0x0623, - 0x0623, 0x0623, 0x0623, 0x0623, 0x0623, 0x062a, 0x062f, 0x062f, - 0x062f, 0x0637, 0x063b, 0x063b, 0x0642, 0x0642, 0x064a, 0x0652, - // Entry 100 - 13F - 0x065e, 0x065e, 0x065e, 0x065e, 0x0674, 0x0674, 0x067a, 0x0680, - 0x0685, 0x0685, 0x0685, 0x068b, 0x068b, 0x0690, 0x0690, 0x069d, - 0x069d, 0x06a2, 0x06a2, 0x06ac, 0x06ac, 0x06b2, 0x06b6, 0x06ba, - 0x06ba, 0x06ba, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c6, 0x06c6, - 0x06c6, 0x06d1, 0x06d1, 0x06d4, 0x06d4, 0x06d4, 0x06d4, 0x06d4, - 0x06d4, 0x06d4, 0x06dd, 0x06df, 0x06e5, 0x06f2, 0x06f2, 0x06f2, - 0x06f2, 0x06f6, 0x0701, 0x0701, 0x0701, 0x0701, 0x0701, 0x0701, - 0x070a, 0x070a, 0x070a, 0x070a, 0x0718, 0x0718, 0x0718, 0x071d, - // Entry 140 - 17F - 0x0727, 0x0727, 0x0736, 0x0741, 0x0741, 0x074b, 0x074b, 0x0750, - 0x075d, 0x076c, 0x0770, 0x0774, 0x077a, 0x077f, 0x0786, 0x0786, - 0x0786, 0x078c, 0x0792, 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, - 0x079f, 0x07a5, 0x07a8, 0x07ad, 0x07ad, 0x07b8, 0x07b8, 0x07bc, - 0x07c3, 0x07d8, 0x07d8, 0x07dc, 0x07dc, 0x07e1, 0x07e1, 0x07ed, - 0x07ed, 0x07ed, 0x07f1, 0x07f9, 0x0801, 0x080d, 0x0814, 0x0814, - 0x081a, 0x0829, 0x0829, 0x0829, 0x0831, 0x0837, 0x083f, 0x0844, - 0x084c, 0x0851, 0x0851, 0x0857, 0x085c, 0x0862, 0x0862, 0x086a, - // Entry 180 - 1BF - 0x086a, 0x086a, 0x086a, 0x0870, 0x0870, 0x0870, 0x0874, 0x0880, - 0x0880, 0x088a, 0x088a, 0x088f, 0x0892, 0x0896, 0x089b, 0x089b, - 0x089b, 0x08a6, 0x08a6, 0x08ac, 0x08b4, 0x08bb, 0x08bb, 0x08c0, - 0x08c0, 0x08c6, 0x08c6, 0x08cb, 0x08cf, 0x08d7, 0x08d7, 0x08e5, - 0x08eb, 0x08f1, 0x08fc, 0x08fc, 0x0904, 0x090a, 0x090f, 0x090f, - 0x0916, 0x0920, 0x0925, 0x0931, 0x0931, 0x0931, 0x0931, 0x0936, - 0x0941, 0x0952, 0x095e, 0x0962, 0x096e, 0x0974, 0x0978, 0x097e, - 0x097e, 0x0984, 0x098d, 0x0992, 0x0992, 0x0992, 0x0997, 0x09a4, - // Entry 1C0 - 1FF - 0x09a8, 0x09a8, 0x09a8, 0x09b0, 0x09b0, 0x09b0, 0x09b0, 0x09b0, - 0x09ba, 0x09ba, 0x09c2, 0x09cc, 0x09d3, 0x09d3, 0x09e3, 0x09e3, - 0x09e3, 0x09e3, 0x09e3, 0x09e3, 0x09e3, 0x09e3, 0x09e3, 0x09ee, - 0x09ee, 0x09f7, 0x09f7, 0x09f7, 0x09fe, 0x0a0a, 0x0a0a, 0x0a0a, - 0x0a0f, 0x0a0f, 0x0a0f, 0x0a0f, 0x0a0f, 0x0a18, 0x0a1b, 0x0a22, - 0x0a27, 0x0a27, 0x0a2e, 0x0a2e, 0x0a35, 0x0a35, 0x0a3c, 0x0a41, - 0x0a4b, 0x0a52, 0x0a52, 0x0a61, 0x0a61, 0x0a65, 0x0a65, 0x0a65, - 0x0a74, 0x0a74, 0x0a74, 0x0a7d, 0x0a81, 0x0a81, 0x0a81, 0x0a81, - // Entry 200 - 23F - 0x0a81, 0x0a90, 0x0a9d, 0x0aa7, 0x0ab5, 0x0abc, 0x0abc, 0x0ac8, - 0x0ac8, 0x0acc, 0x0acc, 0x0ad2, 0x0ad2, 0x0ad2, 0x0adb, 0x0adb, - 0x0ae1, 0x0ae1, 0x0ae1, 0x0ae6, 0x0aea, 0x0aea, 0x0aef, 0x0af4, - 0x0af4, 0x0af4, 0x0af4, 0x0afe, 0x0afe, 0x0afe, 0x0afe, 0x0afe, - 0x0b07, 0x0b07, 0x0b0d, 0x0b0d, 0x0b0d, 0x0b0d, 0x0b14, 0x0b1a, - 0x0b21, 0x0b29, 0x0b42, 0x0b48, 0x0b48, 0x0b4f, 0x0b53, 0x0b56, - 0x0b56, 0x0b56, 0x0b56, 0x0b56, 0x0b56, 0x0b56, 0x0b5b, 0x0b61, - 0x0b69, 0x0b6e, 0x0b6e, 0x0b76, 0x0b82, 0x0b88, 0x0b88, 0x0b8c, - // Entry 240 - 27F - 0x0b8c, 0x0b8c, 0x0b93, 0x0b98, 0x0b98, 0x0ba4, 0x0ba4, 0x0ba4, - 0x0ba4, 0x0ba4, 0x0bc0, 0x0bc4, 0x0bdc, 0x0be0, 0x0bfb, 0x0bfb, - 0x0bfb, 0x0c0f, 0x0c0f, 0x0c0f, 0x0c0f, 0x0c0f, 0x0c0f, 0x0c0f, - 0x0c0f, 0x0c0f, 0x0c0f, 0x0c0f, 0x0c1d, 0x0c24, 0x0c3c, 0x0c52, - 0x0c5c, 0x0c6a, 0x0c77, 0x0c88, 0x0c99, - }, - }, - { // fr - frLangStr, - frLangIdx, - }, - { // fr-BE - "gujaratisame du Nordfranco-provençalancien haut-allemandgotiqueaosame du" + - " Sudsame de Lulesame d’Inarisame skolt", - []uint16{ // 517 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - // Entry 40 - 7F - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - // Entry 80 - BF - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 100 - 13F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - // Entry 140 - 17F - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - // Entry 180 - 1BF - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - // Entry 1C0 - 1FF - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - // Entry 200 - 23F - 0x0042, 0x004d, 0x0059, 0x0067, 0x0071, - }, - }, - { // fr-CA - frCALangStr, - frCALangIdx, - }, - { // fr-CH - "goudjratiallemand de Pennsylvaniekurde méridional", - []uint16{ // 500 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - // Entry 40 - 7F - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - // Entry 80 - BF - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - // Entry C0 - FF - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - // Entry 100 - 13F - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - // Entry 140 - 17F - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - // Entry 180 - 1BF - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - // Entry 1C0 - 1FF - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0032, - }, - }, - { // fur - "afarabcazianavestanafrikaansamaricaragonêsarapassamêsavaraymaràazerbaija" + - "nibielorùsbulgarbengalêstibetanbretonbosniaccatalancecenchamorrocors" + - "creececsclâf de glesiegalêsdanêstodescgrêcinglêsesperantospagnûlesto" + - "nbascpersianfulahfinlandêsfizianfaroêsfrancêsfrisiangaelic irlandêsg" + - "aelic scozêsgalizianguaranìgujaratimanxebraichindicravuathaitianongj" + - "arêsarmenindonesianigboinupiaqidoislandêstalianinuktitutgjaponêsgjeo" + - "rgjiankazackalaallisutkhmerkannadacoreancurdcornualiêslatinlussembur" + - "ghêslimburghêslingalalaolituanletonmalagasymaorimacedonmalayalammong" + - "ulmarathimalêsmaltêsndebele setentrionâlnepalêsolandêsnorvegjês nyno" + - "rsknorvegjês bokmålnavajoocitanoriyaoseticpunjabipolacpashtoportughê" + - "squechuarumançromenrussanscritsardegnûlsindhisami setentrionâlsangos" + - "inalêsslovacslovensamoansomalalbanêsserpswatisotho meridionâlsundanê" + - "ssvedêsswahilitamiltelegutagicthaiturcmenturctartartahitianuigurucra" + - "inurduuzbecvendavietnamitevalonwolofxhosayiddishyorubacinêszuluvieri" + - " inglêsaramaicasturiancopticsclâfvieri egjizianfilipinvieri francêsf" + - "urlangoticvieri grêcladinlenghis multiplismirandêsnapoletanbas todes" + - "cvieri norvegjêssotho setentrionâlturc otomanpapiamentovieri persian" + - "vieri provenzâlsicilianscozêsvieri irlandêssumerictetumindeterminade" + - "todesc de Austriealt todesc de Svuizareinglês australianinglês canad" + - "êsinglês britanicingles merecanspagnûl de Americhe Latinespagnûl ib" + - "ericfrancês dal Canadefrancês de Svuizareflamantportughês brasilianp" + - "ortughês ibericmoldâfcinês semplificâtcinês tradizionâl", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000c, 0x0013, 0x001c, 0x001c, 0x0022, 0x002b, - 0x002f, 0x0037, 0x003b, 0x0042, 0x004d, 0x004d, 0x0056, 0x005c, - 0x005c, 0x005c, 0x0065, 0x006c, 0x0072, 0x0079, 0x0080, 0x0085, - 0x008d, 0x0091, 0x0095, 0x0098, 0x00a8, 0x00a8, 0x00ae, 0x00b4, - 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00bf, 0x00c6, 0x00cf, 0x00d7, - 0x00dc, 0x00e0, 0x00e7, 0x00ec, 0x00f6, 0x00fc, 0x0103, 0x010b, - 0x0112, 0x0122, 0x0130, 0x0138, 0x0140, 0x0148, 0x014c, 0x014c, - 0x0152, 0x0157, 0x0157, 0x015e, 0x0165, 0x016e, 0x0173, 0x0173, - // Entry 40 - 7F - 0x0173, 0x017d, 0x017d, 0x0181, 0x0181, 0x0188, 0x018b, 0x0194, - 0x019a, 0x01a3, 0x01ac, 0x01ac, 0x01b6, 0x01b6, 0x01b6, 0x01b6, - 0x01bb, 0x01c6, 0x01cb, 0x01d2, 0x01d8, 0x01d8, 0x01d8, 0x01dc, - 0x01dc, 0x01e7, 0x01e7, 0x01ec, 0x01fa, 0x01fa, 0x0205, 0x020c, - 0x020f, 0x0215, 0x0215, 0x021a, 0x0222, 0x0222, 0x0227, 0x022e, - 0x0237, 0x023d, 0x0244, 0x024a, 0x0251, 0x0251, 0x0251, 0x0266, - 0x026e, 0x026e, 0x0276, 0x0288, 0x029a, 0x029a, 0x02a0, 0x02a0, - 0x02a6, 0x02a6, 0x02a6, 0x02ab, 0x02b1, 0x02b8, 0x02b8, 0x02bd, - // Entry 80 - BF - 0x02c3, 0x02cd, 0x02d4, 0x02db, 0x02db, 0x02e0, 0x02e3, 0x02e3, - 0x02eb, 0x02f5, 0x02fb, 0x030d, 0x0312, 0x031a, 0x0320, 0x0326, - 0x032c, 0x032c, 0x0331, 0x0339, 0x033d, 0x0342, 0x0353, 0x035c, - 0x0363, 0x036a, 0x036f, 0x0375, 0x037a, 0x037e, 0x037e, 0x0385, - 0x0385, 0x0385, 0x0389, 0x0389, 0x038f, 0x0397, 0x039c, 0x03a2, - 0x03a6, 0x03ab, 0x03b0, 0x03ba, 0x03ba, 0x03bf, 0x03c4, 0x03c9, - 0x03d0, 0x03d6, 0x03d6, 0x03dc, 0x03e0, 0x03e0, 0x03e0, 0x03e0, - 0x03e0, 0x03e0, 0x03e0, 0x03e0, 0x03e0, 0x03e0, 0x03e0, 0x03e0, - // Entry C0 - FF - 0x03e0, 0x03e0, 0x03ed, 0x03ed, 0x03f4, 0x03f4, 0x03f4, 0x03f4, - 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03fc, - 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, - 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, - 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, - 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, - 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, - 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, - // Entry 100 - 13F - 0x03fc, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, - 0x0402, 0x0402, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, - 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, - 0x0408, 0x0416, 0x0416, 0x0416, 0x0416, 0x0416, 0x0416, 0x0416, - 0x0416, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x042b, 0x042b, - 0x042b, 0x042b, 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, - 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, - 0x0431, 0x0436, 0x0436, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, - // Entry 140 - 17F - 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, - 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, - 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, - 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, - 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, - 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, - 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, - 0x0441, 0x0441, 0x0441, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, - // Entry 180 - 1BF - 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, - 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, - 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, - 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, - 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, - 0x0446, 0x0457, 0x0457, 0x0460, 0x0460, 0x0460, 0x0460, 0x0460, - 0x0460, 0x0460, 0x0469, 0x0469, 0x0473, 0x0473, 0x0473, 0x0473, - 0x0473, 0x0473, 0x0473, 0x0473, 0x0483, 0x0483, 0x0483, 0x0496, - // Entry 1C0 - 1FF - 0x0496, 0x0496, 0x0496, 0x0496, 0x0496, 0x0496, 0x0496, 0x04a1, - 0x04a1, 0x04a1, 0x04a1, 0x04ab, 0x04ab, 0x04ab, 0x04ab, 0x04ab, - 0x04ab, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, - 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, - 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, - 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, - 0x04d0, 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04d7, - 0x04d7, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, - // Entry 200 - 23F - 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, - 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04ed, 0x04ed, 0x04ed, - 0x04ed, 0x04ed, 0x04ed, 0x04ed, 0x04ed, 0x04ed, 0x04f2, 0x04f2, - 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, - 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, - 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04ff, 0x04ff, - 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, - 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, - // Entry 240 - 27F - 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, - 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, - 0x0510, 0x0526, 0x0538, 0x0548, 0x0558, 0x0566, 0x0581, 0x0590, - 0x0590, 0x0590, 0x05a3, 0x05b7, 0x05b7, 0x05be, 0x05d2, 0x05e3, - 0x05ea, 0x05ea, 0x05ea, 0x05fd, 0x0610, - }, - }, - { // fy - "AfarAbchazyskAvestyskAfrikaanskAkanAmhaarskAragoneeskArabyskAssameeskAva" + - "ryskAymaraAzerbeidzjaanskBasjkierskWyt-RussyskBulgaarskBislamaBambar" + - "aBengaalskTibetaanskBretonskBosnyskKatalaanskTsjetsjeenskChamorroKor" + - "sikaanskCreeTsjechyskKerkslavyskTsjoevasjyskWelskDeenskDútskDivehiDz" + - "ongkhaEweGryksIngelskEsperantoSpaanskEstlânskBaskyskPerzyskFulahFins" + - "kFijyskFaeröerskFrânskWest-FryskIerskSchotsk GaelicGalisyskGuaraníGu" + - "jaratiManksHausaHebreeuwskHindiHiri MotuKroatyskHaïtiaanskHongaarskA" + - "rmeenskHereroInterlinguaYndonezyskInterlingueIgboSichuan YiInupiaqId" + - "oYslânsItaliaanskInuktitutJapansJavaanskGeorgyskKongoKikuyuKuanyamaK" + - "azachsGrienlânsKhmerKannadaKoreaanskKanuriKasjmiriKoerdyskKomiCornis" + - "hKirgizyskLatynLuxemburgsGandaLimburgsLingalaLaotiaanskLitouwsLuba-K" + - "atangaLetlânsMalagasyskMarshalleesMaoriMacedonyskMalayalamMongoolsMa" + - "rathiMaleisMalteesBirmeesNauruaanskNoard-NdbeleNepaleesNdongaNederlâ" + - "nskNoors - NynorskNoors - BokmålSûd-NdbeleNavajoNyanjaOccitaanskOjib" + - "waOromoOdiaOssetyskPunjabiPaliPoalskPasjtoePortugeeskQuechuaReto-Rom" + - "aanskKirundiRoemeenskRussyskKinyarwandaSanskrietSardinyskSindhiNoard" + - "-SamyskSangoSingaleesSlowaaksSloveenskSamoaanskShonaSomalyskAlbanees" + - "kServyskSwaziSûd-SothoSoendaneeskZweedsSwahiliTamilTeluguTadzjieksTh" + - "aisTigrinyaTurkmeensTswanaTongaanskTurksTsongaTataarsTahityskOeigoer" + - "sOekraïensUrduOezbeeksVendaVietnameesVolapükWaalsWolofXhosaJiddyskYo" + - "rubaZhuangSineeskZuluAtjeeskAkoliAdangmeAdygheAfrihiliAghemAinuAkkad" + - "yskAleutSûd-AltaïskâldingelskAngikaArameeskAraukaanskArapahoArawakAs" + - "uAsturyskAwadhiBaloetsjyskBalineeskBasaBamounGhomala’BejaBembaBenaBa" + - "futBhojpuriBikolBiniKomSiksikaBrajBodoAkooseBuriatBugineeskBuluBlinM" + - "edumbaKaddoKaribyskCayugaAtsamCebuanoChigaChibchaChagataiChuukeeskMa" + - "riChinook-jargonChoctawChipewyanCherokeeCheyenneSoranîKoptyskKrim-Ta" + - "taarskKasjoebyskDakotaDargwaTaitaDelawareSlaveDogribDinkaZarmaDogriN" + - "edersorbyskDualaMiddelnederlânskJola-FonyiDyulaDazagaEmbuEfikAldegyp" + - "tyskEkajukElamityskMiddelingelskEwondoFangFilipynskFonMiddelfrânskAl" + - "dfrânskNoard-FryskEast-FryskFriulyskGaGayoGbayaGeezGilberteeskMiddel" + - "heechdútskAlsheechdútskGondiGorontaloGothyskGreboAldgryksSwitsers Dú" + - "tskGusiiGwichʼinHaidaHawaïaanskHiligaynonHettityskHmongOppersorbyskH" + - "upaIbanIbibioIlokoIngoesjLojbanNgombaMachameJudeo-PerzyskJudeo-Araby" + - "skKarakalpaksKabyleKachinJjuKambaKawiKabardyskKanembuTyapMakondeKaap" + - "verdysk CreoolsKoroKhasiKhotaneeskKoyra ChiiniKakoKalenjinKimbunduKo" + - "nkaniKosraeaanskKpelleKarachay-BalkarKarelyskKurukhShambalaBafiaKöls" + - "chKoemuksKutenaiLadinoLangiLahndaLambaLezgyskLakotaMongoLoziLuba-Lul" + - "uaLuisenoLundaLuoLushaiLuyiaMadureesMafaMagahiMaithiliMakassaarsMand" + - "ingoMasaiMabaMokshaMandarMendeMeruMorisyenMiddeliersMakhuwa-MeettoMe" + - "ta’Mi’kmaqMinangkabauMantsjoeManipoeriMohawkMossiMundangMeardere tal" + - "enCreekMirandeesMarwariMyeneErzjaNapolitaanskNamaLaagduitsNewariNias" + - "NiueaanskNgumbaNgiemboonNogaiAldnoarskN’koNoard-SothoNuerKlassiek Ne" + - "wariNyamweziNyankoleNyoroNzimaOsageOttomaansk-TurksPangasinanPahlavi" + - "PampangaPapiamentsPalauaanskAldperzyskFoenisyskPohnpeiaanskAldproven" + - "çaalsRajasthaniRapanuiRarotonganRomboRomaniAromaniaanskRwaSandaweJa" + - "koetsSamaritaansk-ArameeskSamburuSasakSantaliNgambaySanguSiciliaansk" + - "SchotsSenecaSenaSelkupKoyraboro SenniAldyrskTashelhiytShanTsjadysk A" + - "rabyskSidamoSûd-SamyskLule SamiInari SamiSkolt SamiSoninkeSogdyskSra" + - "nantongoSererSahoSukumaSoesoeSoemeryskShimaoreKlassiek SyryskSyryskT" + - "imneTesoTerenoTetunTigreTivTokelausKlingonTlingitTamashekNyasa Tonga" + - "Tok PisinTarokoTsimshianToemboekaTuvaluaanskTasawaqTuvinyskTamazight" + - " (Sintraal-Marokko)OedmoertsOegarityskUmbunduRootVaiVotyskVunjoWalse" + - "rWalamoWarayWashoKalmykSogaYaoYapeesYangbenYembaKantoneeskZapotecBli" + - "ssymbolenZenagaStandert Marokkaanske TamazightZuniGjin linguïstyske " + - "ynhâldZazaModern standert ArabyskEastenryks DútskSwitsersk Heechdúts" + - "kAustralysk IngelskKanadeesk IngelskBritsk IngelskAmerikaansk Ingels" + - "kLatynsk-Amerikaansk SpaanskEuropeesk SpaanskMeksikaansk SpaanskKana" + - "deesk FrânskSwitserse FrânskVlaamsBrazyljaansk PortugeesEuropees Por" + - "tugeesMoldavyskServokroatyskCongo SwahiliFerienfâldich SineeskTradis" + - "joneel Sineesk", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000d, 0x0015, 0x001f, 0x0023, 0x002b, 0x0035, - 0x003c, 0x0045, 0x004c, 0x0052, 0x0061, 0x006b, 0x0076, 0x007f, - 0x0086, 0x008d, 0x0096, 0x00a0, 0x00a8, 0x00af, 0x00b9, 0x00c5, - 0x00cd, 0x00d8, 0x00dc, 0x00e5, 0x00f0, 0x00fc, 0x0101, 0x0107, - 0x010d, 0x0113, 0x011b, 0x011e, 0x0123, 0x012a, 0x0133, 0x013a, - 0x0143, 0x014a, 0x0151, 0x0156, 0x015b, 0x0161, 0x016b, 0x0172, - 0x017c, 0x0181, 0x018f, 0x0197, 0x019f, 0x01a7, 0x01ac, 0x01b1, - 0x01bb, 0x01c0, 0x01c9, 0x01d1, 0x01dc, 0x01e5, 0x01ed, 0x01f3, - // Entry 40 - 7F - 0x01fe, 0x0208, 0x0213, 0x0217, 0x0221, 0x0228, 0x022b, 0x0232, - 0x023c, 0x0245, 0x024b, 0x0253, 0x025b, 0x0260, 0x0266, 0x026e, - 0x0275, 0x027f, 0x0284, 0x028b, 0x0294, 0x029a, 0x02a2, 0x02aa, - 0x02ae, 0x02b5, 0x02be, 0x02c3, 0x02cd, 0x02d2, 0x02da, 0x02e1, - 0x02eb, 0x02f2, 0x02fe, 0x0306, 0x0310, 0x031b, 0x0320, 0x032a, - 0x0333, 0x033b, 0x0342, 0x0348, 0x034f, 0x0356, 0x0360, 0x036c, - 0x0374, 0x037a, 0x0385, 0x0394, 0x03a3, 0x03ae, 0x03b4, 0x03ba, - 0x03c4, 0x03ca, 0x03cf, 0x03d3, 0x03db, 0x03e2, 0x03e6, 0x03ec, - // Entry 80 - BF - 0x03f3, 0x03fd, 0x0404, 0x0411, 0x0418, 0x0421, 0x0428, 0x0433, - 0x043c, 0x0445, 0x044b, 0x0457, 0x045c, 0x0465, 0x046d, 0x0476, - 0x047f, 0x0484, 0x048c, 0x0495, 0x049c, 0x04a1, 0x04ab, 0x04b6, - 0x04bc, 0x04c3, 0x04c8, 0x04ce, 0x04d7, 0x04dc, 0x04e4, 0x04ed, - 0x04f3, 0x04fc, 0x0501, 0x0507, 0x050e, 0x0516, 0x051e, 0x0528, - 0x052c, 0x0534, 0x0539, 0x0543, 0x054b, 0x0550, 0x0555, 0x055a, - 0x0561, 0x0567, 0x056d, 0x0574, 0x0578, 0x057f, 0x0584, 0x058b, - 0x0591, 0x0591, 0x0599, 0x059e, 0x05a2, 0x05aa, 0x05aa, 0x05af, - // Entry C0 - FF - 0x05af, 0x05bc, 0x05c7, 0x05cd, 0x05d5, 0x05df, 0x05df, 0x05e6, - 0x05e6, 0x05e6, 0x05ec, 0x05ec, 0x05ec, 0x05ef, 0x05ef, 0x05f7, - 0x05f7, 0x05fd, 0x0608, 0x0611, 0x0611, 0x0615, 0x061b, 0x061b, - 0x0625, 0x0629, 0x062e, 0x062e, 0x0632, 0x0637, 0x0637, 0x0637, - 0x063f, 0x0644, 0x0648, 0x0648, 0x064b, 0x0652, 0x0652, 0x0652, - 0x0656, 0x0656, 0x065a, 0x0660, 0x0666, 0x066f, 0x0673, 0x0677, - 0x067e, 0x0683, 0x068b, 0x0691, 0x0696, 0x069d, 0x06a2, 0x06a9, - 0x06b1, 0x06ba, 0x06be, 0x06cc, 0x06d3, 0x06dc, 0x06e4, 0x06ec, - // Entry 100 - 13F - 0x06f3, 0x06fa, 0x06fa, 0x0707, 0x0707, 0x0711, 0x0717, 0x071d, - 0x0722, 0x072a, 0x072f, 0x0735, 0x073a, 0x073f, 0x0744, 0x0750, - 0x0750, 0x0755, 0x0766, 0x0770, 0x0775, 0x077b, 0x077f, 0x0783, - 0x0783, 0x078e, 0x0794, 0x079d, 0x07aa, 0x07aa, 0x07b0, 0x07b0, - 0x07b4, 0x07bd, 0x07bd, 0x07c0, 0x07c0, 0x07cd, 0x07d7, 0x07d7, - 0x07e2, 0x07ec, 0x07f4, 0x07f6, 0x07f6, 0x07f6, 0x07fa, 0x07ff, - 0x07ff, 0x0803, 0x080e, 0x080e, 0x081f, 0x082d, 0x082d, 0x0832, - 0x083b, 0x0842, 0x0847, 0x084f, 0x085e, 0x085e, 0x085e, 0x0863, - // Entry 140 - 17F - 0x086c, 0x0871, 0x0871, 0x087c, 0x087c, 0x0886, 0x088f, 0x0894, - 0x08a0, 0x08a0, 0x08a4, 0x08a8, 0x08ae, 0x08b3, 0x08ba, 0x08ba, - 0x08ba, 0x08c0, 0x08c6, 0x08cd, 0x08da, 0x08e7, 0x08e7, 0x08f2, - 0x08f8, 0x08fe, 0x0901, 0x0906, 0x090a, 0x0913, 0x091a, 0x091e, - 0x0925, 0x0938, 0x0938, 0x093c, 0x093c, 0x0941, 0x094b, 0x0957, - 0x0957, 0x0957, 0x095b, 0x0963, 0x096b, 0x096b, 0x0972, 0x097d, - 0x0983, 0x0992, 0x0992, 0x0992, 0x099a, 0x09a0, 0x09a8, 0x09ad, - 0x09b4, 0x09bb, 0x09c2, 0x09c8, 0x09cd, 0x09d3, 0x09d8, 0x09df, - // Entry 180 - 1BF - 0x09df, 0x09df, 0x09df, 0x09e5, 0x09e5, 0x09ea, 0x09ee, 0x09ee, - 0x09ee, 0x09f8, 0x09ff, 0x0a04, 0x0a07, 0x0a0d, 0x0a12, 0x0a12, - 0x0a12, 0x0a1a, 0x0a1e, 0x0a24, 0x0a2c, 0x0a36, 0x0a3e, 0x0a43, - 0x0a47, 0x0a4d, 0x0a53, 0x0a58, 0x0a5c, 0x0a64, 0x0a6e, 0x0a7c, - 0x0a83, 0x0a8c, 0x0a97, 0x0a9f, 0x0aa8, 0x0aae, 0x0ab3, 0x0ab3, - 0x0aba, 0x0ac8, 0x0acd, 0x0ad6, 0x0add, 0x0add, 0x0ae2, 0x0ae7, - 0x0ae7, 0x0ae7, 0x0af3, 0x0af7, 0x0b00, 0x0b06, 0x0b0a, 0x0b13, - 0x0b13, 0x0b19, 0x0b22, 0x0b27, 0x0b30, 0x0b30, 0x0b36, 0x0b41, - // Entry 1C0 - 1FF - 0x0b45, 0x0b54, 0x0b5c, 0x0b64, 0x0b69, 0x0b6e, 0x0b73, 0x0b83, - 0x0b8d, 0x0b94, 0x0b9c, 0x0ba6, 0x0bb0, 0x0bb0, 0x0bb0, 0x0bb0, - 0x0bb0, 0x0bba, 0x0bba, 0x0bc3, 0x0bc3, 0x0bc3, 0x0bcf, 0x0bcf, - 0x0bde, 0x0bde, 0x0bde, 0x0be8, 0x0bef, 0x0bf9, 0x0bf9, 0x0bf9, - 0x0bfe, 0x0c04, 0x0c04, 0x0c04, 0x0c04, 0x0c10, 0x0c13, 0x0c1a, - 0x0c21, 0x0c36, 0x0c3d, 0x0c42, 0x0c49, 0x0c49, 0x0c50, 0x0c55, - 0x0c60, 0x0c66, 0x0c66, 0x0c66, 0x0c6c, 0x0c70, 0x0c70, 0x0c76, - 0x0c85, 0x0c8c, 0x0c8c, 0x0c96, 0x0c9a, 0x0caa, 0x0cb0, 0x0cb0, - // Entry 200 - 23F - 0x0cb0, 0x0cbb, 0x0cc4, 0x0cce, 0x0cd8, 0x0cdf, 0x0ce6, 0x0cf1, - 0x0cf6, 0x0cfa, 0x0cfa, 0x0d00, 0x0d06, 0x0d0f, 0x0d17, 0x0d26, - 0x0d2c, 0x0d2c, 0x0d2c, 0x0d31, 0x0d35, 0x0d3b, 0x0d40, 0x0d45, - 0x0d48, 0x0d50, 0x0d50, 0x0d57, 0x0d5e, 0x0d5e, 0x0d66, 0x0d71, - 0x0d7a, 0x0d7a, 0x0d80, 0x0d80, 0x0d89, 0x0d89, 0x0d92, 0x0d9d, - 0x0da4, 0x0dac, 0x0dc8, 0x0dd1, 0x0ddb, 0x0de2, 0x0de6, 0x0de9, - 0x0de9, 0x0de9, 0x0de9, 0x0de9, 0x0def, 0x0def, 0x0df4, 0x0dfa, - 0x0e00, 0x0e05, 0x0e0a, 0x0e0a, 0x0e0a, 0x0e10, 0x0e10, 0x0e14, - // Entry 240 - 27F - 0x0e17, 0x0e1d, 0x0e24, 0x0e29, 0x0e29, 0x0e33, 0x0e3a, 0x0e46, - 0x0e46, 0x0e4c, 0x0e6b, 0x0e6f, 0x0e89, 0x0e8d, 0x0ea4, 0x0ea4, - 0x0eb5, 0x0eca, 0x0edc, 0x0eed, 0x0efb, 0x0f0e, 0x0f29, 0x0f3a, - 0x0f4d, 0x0f4d, 0x0f5e, 0x0f6f, 0x0f6f, 0x0f75, 0x0f8b, 0x0f9d, - 0x0fa6, 0x0fb3, 0x0fc0, 0x0fd6, 0x0fea, - }, - }, - { // ga - "AfáirisAbcáisisAivéistisAfracáinisAcáinisAmáirisAragóinisAraibisAsaimisA" + - "váirisAidhmirisAsarbaiseáinisBaiscírisBealarúisisBulgáirisBioslaimis" + - "BeangáilisTibéidisBriotáinisBoisnisCatalóinisSeisnisSeamóirisCorsaic" + - "isCraísSeicisSlavais na hEaglaiseSuvaisisBreatnaisDanmhairgisGearmái" + - "nisDivéihisSeoinicisGréigisBéarlaEsperantoSpáinnisEastóinisBascaisPe" + - "irsisFuláinisFionlainnisFidsisFaróisFraincisFreaslainnis IartharachG" + - "aeilgeGaeilge na hAlbanGailísisGuaráinisGúisearáitisManainnisHásaisE" + - "abhraisHiondúisMotúis HíríCróitisCriól HáítíochUngáirisAirméinisHeir" + - "éirisInterlinguaIndinéisisInterlingueÍogbóisIniúipiaicisIdoÍoslainn" + - "isIodáilisIonúitisSeapáinisIáivisSeoirsisCongóisCiocúisCuainiáimisCa" + - "saicisKalaallisutCiméirisCannadaisCóiréisCanúirisCaismírisCoirdisCoi" + - "misCoirnisCirgisisLaidinLucsambuirgisLugandaisLiongáilisLaoisisLiotu" + - "áinisLúba-CataingisLaitvisMalagáisisMairsillisMaoraisMacadóinisMail" + - "éalaimisMongóilisMaraitisMalaeisMáltaisBurmaisNárúisNdeibéilis an T" + - "uaiscirtNeipeailisNdongaisOllainnisNua-IoruaisIoruais BokmålNdeibéil" + - "is an DeiscirtNavachóisSiséivisOcsatáinisÓisibisOraimisOirísisOiséit" + - "isPuinseáibisPáilisPolainnisPaistisPortaingéilisCeatsuaisRómainisRúi" + - "ndisRómáinisRúisisCiniaruaindisSanscraitSairdínisSindisSáimis Thuaid" + - "hSangóisSiolóinisSlóvaicisSlóivéinisSamóisSeoinisSomáilisAlbáinisSei" + - "rbisSuaisisSeasóitisSundaisSualainnisSvahaílisTamailisTeileagúisTáid" + - "sícisTéalainnisTigrinisTuircméinisSuáinisTongaisTuircisSongaisTatair" + - "isTaihítisUigiúirisÚcráinisUrdúisÚisbéiceastáinisVeindisVítneaimisVo" + - "lapükVallúnaisVolaifisCóisisGiúdaisIarúibisSiuáingisSínisSúlúisAdaig" + - "éisAidhniúisAcáidisSean-BhéarlaAramaisMapúitsisAstúirisBailísBaváir" + - "isBeimbisBuiriáitisBuiginisSeabúáinisMairisSeiricisCoptaisCaisiúibis" + - "TaitaZarmaisSorbais ÍochtarachMeán-OllainnisSean-ÉigiptisMeán-Bhéarl" + - "aFilipínisMeán-FhraincisSean-FhraincisFreaslainnis an TuaiscirtFriúi" + - "lisAetóipisMeán-Ard-GhearmáinisSean-Ard-GhearmáinisSean-GhréigisGear" + - "máinis EilvéiseachUaúisHaicéisHaváisHiondúis FhidsíHilgeanóinisHitis" + - "MongaisSorbais UachtarachHúipisIbibisIongúisLojbanIútlainnisCara-Cha" + - "lpáisConcáinisCairéilisCurúicisLaidínisPuinseáibis IartharachLiogúir" + - "isLiovóinisLombairdisMeindisMeán-GhaeilgeManapúirisMóháicisMairis Ia" + - "rtharachIlteangachaMioraindéisMarmhairisGearmáinis ÍochtarachNíobhai" + - "sSean-LochlainnisSútúis an TuaiscirtSean-PheirsisPrúisisCuitséisRoma" + - "inisArómáinisSachaisAramais ShamárachSantáilisSicilisAlbainisSean-Gh" + - "aeilgeTachelhitSáimis LuleSogdánaisSuiméirisSiricisSiléisisKlingonUd" + - "mairtisTeanga AnaithnidVeinéisisPléimeannais IartharachCailmícisCant" + - "ainisSéalainnisZúinisGan ábhar teangeolaíochAraibis ChaighdeánachGea" + - "rmáinis OstarachArd-Ghearmáinis EilvéiseachBéarla AstrálachBéarla Ce" + - "anadachBéarla BriotanachBéarla MeiriceánachSpáinnis Mheiriceá Laidin" + - "ighSpáinnis EorpachSpáinnis MheicsiceachFraincis CheanadachFraincis " + - "EilvéiseachSacsainis ÍochtarachPléimeannaisPortaingéilis na Brasaíle" + - "Portaingéilis IbéarachMoldáivisSeirbea-ChróitisSvahaílis an ChongóSí" + - "nis ShimplitheSínis Thraidisiúnta", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0008, 0x0011, 0x001b, 0x0026, 0x002e, 0x0036, 0x0040, - 0x0047, 0x004e, 0x0056, 0x005f, 0x006e, 0x0078, 0x0084, 0x008e, - 0x0098, 0x0098, 0x00a3, 0x00ac, 0x00b7, 0x00be, 0x00c9, 0x00d0, - 0x00da, 0x00e3, 0x00e9, 0x00ef, 0x0103, 0x010b, 0x0114, 0x011f, - 0x012a, 0x0133, 0x013c, 0x013c, 0x0144, 0x014b, 0x0154, 0x015d, - 0x0167, 0x016e, 0x0175, 0x017e, 0x0189, 0x018f, 0x0196, 0x019e, - 0x01b5, 0x01bc, 0x01cd, 0x01d6, 0x01e0, 0x01ee, 0x01f7, 0x01fe, - 0x0206, 0x020f, 0x021d, 0x0225, 0x0237, 0x0240, 0x024a, 0x0254, - // Entry 40 - 7F - 0x025f, 0x026a, 0x0275, 0x027e, 0x027e, 0x028b, 0x028e, 0x0299, - 0x02a2, 0x02ab, 0x02b5, 0x02bc, 0x02c4, 0x02cc, 0x02d4, 0x02e0, - 0x02e8, 0x02f3, 0x02fc, 0x0305, 0x030e, 0x0317, 0x0321, 0x0328, - 0x032e, 0x0335, 0x033d, 0x0343, 0x0350, 0x0359, 0x0359, 0x0364, - 0x036b, 0x0376, 0x0385, 0x038c, 0x0397, 0x03a1, 0x03a8, 0x03b3, - 0x03c0, 0x03ca, 0x03d2, 0x03d9, 0x03e1, 0x03e8, 0x03f0, 0x0408, - 0x0412, 0x041a, 0x0423, 0x042e, 0x043d, 0x0454, 0x045e, 0x0467, - 0x0472, 0x047a, 0x0481, 0x0489, 0x0492, 0x049e, 0x04a5, 0x04ae, - // Entry 80 - BF - 0x04b5, 0x04c3, 0x04cc, 0x04d5, 0x04dd, 0x04e7, 0x04ee, 0x04fb, - 0x0504, 0x050e, 0x0514, 0x0523, 0x052b, 0x0535, 0x053f, 0x054b, - 0x0552, 0x0559, 0x0562, 0x056b, 0x0572, 0x0579, 0x0583, 0x058a, - 0x0594, 0x059e, 0x05a6, 0x05b1, 0x05bc, 0x05c7, 0x05cf, 0x05db, - 0x05e3, 0x05ea, 0x05f1, 0x05f8, 0x0600, 0x0609, 0x0613, 0x061d, - 0x0624, 0x0637, 0x063e, 0x0649, 0x0651, 0x065b, 0x0663, 0x066a, - 0x0672, 0x067b, 0x0685, 0x068b, 0x0693, 0x0693, 0x0693, 0x0693, - 0x069c, 0x069c, 0x069c, 0x069c, 0x06a6, 0x06ae, 0x06ae, 0x06ae, - // Entry C0 - FF - 0x06ae, 0x06ae, 0x06bb, 0x06bb, 0x06c2, 0x06cc, 0x06cc, 0x06cc, - 0x06cc, 0x06cc, 0x06cc, 0x06cc, 0x06cc, 0x06cc, 0x06cc, 0x06d5, - 0x06d5, 0x06d5, 0x06d5, 0x06dc, 0x06e5, 0x06e5, 0x06e5, 0x06e5, - 0x06e5, 0x06e5, 0x06ec, 0x06ec, 0x06ec, 0x06ec, 0x06ec, 0x06ec, - 0x06ec, 0x06ec, 0x06ec, 0x06ec, 0x06ec, 0x06ec, 0x06ec, 0x06ec, - 0x06ec, 0x06ec, 0x06ec, 0x06ec, 0x06f7, 0x06ff, 0x06ff, 0x06ff, - 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x070b, 0x070b, 0x070b, - 0x070b, 0x070b, 0x0711, 0x0711, 0x0711, 0x0711, 0x0719, 0x0719, - // Entry 100 - 13F - 0x0719, 0x0720, 0x0720, 0x0720, 0x0720, 0x072b, 0x072b, 0x072b, - 0x0730, 0x0730, 0x0730, 0x0730, 0x0730, 0x0737, 0x0737, 0x074a, - 0x074a, 0x074a, 0x0759, 0x0759, 0x0759, 0x0759, 0x0759, 0x0759, - 0x0759, 0x0767, 0x0767, 0x0767, 0x0775, 0x0775, 0x0775, 0x0775, - 0x0775, 0x077f, 0x077f, 0x077f, 0x077f, 0x078e, 0x079c, 0x079c, - 0x07b5, 0x07b5, 0x07be, 0x07be, 0x07be, 0x07be, 0x07be, 0x07be, - 0x07be, 0x07c7, 0x07c7, 0x07c7, 0x07dd, 0x07f2, 0x07f2, 0x07f2, - 0x07f2, 0x07f2, 0x07f2, 0x0800, 0x0818, 0x081e, 0x081e, 0x081e, - // Entry 140 - 17F - 0x081e, 0x081e, 0x0826, 0x082d, 0x083e, 0x084b, 0x0850, 0x0857, - 0x0869, 0x0869, 0x0870, 0x0870, 0x0876, 0x0876, 0x087e, 0x087e, - 0x087e, 0x0884, 0x0884, 0x0884, 0x0884, 0x0884, 0x088f, 0x089d, - 0x089d, 0x089d, 0x089d, 0x089d, 0x089d, 0x089d, 0x089d, 0x089d, - 0x089d, 0x089d, 0x089d, 0x089d, 0x089d, 0x089d, 0x089d, 0x089d, - 0x089d, 0x089d, 0x089d, 0x089d, 0x089d, 0x089d, 0x08a7, 0x08a7, - 0x08a7, 0x08a7, 0x08a7, 0x08a7, 0x08b1, 0x08ba, 0x08ba, 0x08ba, - 0x08ba, 0x08ba, 0x08ba, 0x08c3, 0x08c3, 0x08da, 0x08da, 0x08da, - // Entry 180 - 1BF - 0x08da, 0x08e4, 0x08ee, 0x08ee, 0x08f8, 0x08f8, 0x08f8, 0x08f8, - 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, - 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, - 0x08f8, 0x08f8, 0x08f8, 0x08ff, 0x08ff, 0x08ff, 0x090d, 0x090d, - 0x090d, 0x090d, 0x090d, 0x090d, 0x0918, 0x0922, 0x0922, 0x0933, - 0x0933, 0x093e, 0x093e, 0x094a, 0x0954, 0x0954, 0x0954, 0x0954, - 0x0954, 0x0954, 0x0954, 0x0954, 0x096b, 0x096b, 0x096b, 0x0974, - 0x0974, 0x0974, 0x0974, 0x0974, 0x0984, 0x0984, 0x0984, 0x0999, - // Entry 1C0 - 1FF - 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, - 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, - 0x0999, 0x09a6, 0x09a6, 0x09a6, 0x09a6, 0x09a6, 0x09a6, 0x09ae, - 0x09ae, 0x09b7, 0x09b7, 0x09b7, 0x09b7, 0x09b7, 0x09b7, 0x09b7, - 0x09b7, 0x09bf, 0x09bf, 0x09bf, 0x09bf, 0x09ca, 0x09ca, 0x09ca, - 0x09d1, 0x09e3, 0x09e3, 0x09e3, 0x09ed, 0x09ed, 0x09ed, 0x09ed, - 0x09f4, 0x09fc, 0x09fc, 0x09fc, 0x09fc, 0x09fc, 0x09fc, 0x09fc, - 0x09fc, 0x0a09, 0x0a09, 0x0a12, 0x0a12, 0x0a12, 0x0a12, 0x0a12, - // Entry 200 - 23F - 0x0a12, 0x0a12, 0x0a1e, 0x0a1e, 0x0a1e, 0x0a1e, 0x0a28, 0x0a28, - 0x0a28, 0x0a28, 0x0a28, 0x0a28, 0x0a28, 0x0a32, 0x0a32, 0x0a32, - 0x0a39, 0x0a42, 0x0a42, 0x0a42, 0x0a42, 0x0a42, 0x0a42, 0x0a42, - 0x0a42, 0x0a42, 0x0a42, 0x0a49, 0x0a49, 0x0a49, 0x0a49, 0x0a49, - 0x0a49, 0x0a49, 0x0a49, 0x0a49, 0x0a49, 0x0a49, 0x0a49, 0x0a49, - 0x0a49, 0x0a49, 0x0a49, 0x0a52, 0x0a52, 0x0a52, 0x0a62, 0x0a62, - 0x0a6c, 0x0a6c, 0x0a84, 0x0a84, 0x0a84, 0x0a84, 0x0a84, 0x0a84, - 0x0a84, 0x0a84, 0x0a84, 0x0a84, 0x0a84, 0x0a8e, 0x0a8e, 0x0a8e, - // Entry 240 - 27F - 0x0a8e, 0x0a8e, 0x0a8e, 0x0a8e, 0x0a8e, 0x0a97, 0x0a97, 0x0a97, - 0x0aa2, 0x0aa2, 0x0aa2, 0x0aa9, 0x0ac2, 0x0ac2, 0x0ad8, 0x0ad8, - 0x0aec, 0x0b09, 0x0b1b, 0x0b2c, 0x0b3e, 0x0b53, 0x0b71, 0x0b82, - 0x0b98, 0x0b98, 0x0bab, 0x0bc0, 0x0bd5, 0x0be2, 0x0bfd, 0x0c15, - 0x0c1f, 0x0c30, 0x0c45, 0x0c56, 0x0c6b, - }, - }, - { // gd - "AfarAbchasaisAvestanaisAfraganaisAkanAmtharaisAragonaisArabaisAsamaisAva" + - "raisAymaraAsarbaideànaisBashkirBealaruisisBulgaraisBislamaBambaraBan" + - "glaTibeitisBreatnaisBosnaisCatalanaisDeideanaisChamorroCorsaisCreeSe" + - "icisSlàbhais na h-EaglaiseChuvashCuimrisDanmhairgisGearmailtisDivehi" + - "DzongkhaEweGreugaisBeurlaEsperantoSpàinntisEastoinisBasgaisPeirsisFu" + - "lahFionnlannaisFìdisFàrothaisFraingisFrìoslannais ShiarachGaeilgeGài" + - "dhligGailìsisGuaraníGujaratiGaelgHausaEabhraHindisHiri MotuCròthaisi" + - "sCrìtheol HaidhtiUngairisAirmeinisHereroInterlinguaInnd-InnsisInterl" + - "ingueIgboYi SichuanInupiaqIdoInnis TìlisEadailtisInuktitutSeapanaisD" + - "eàbhanaisCairtbheilisKongoKikuyuKuanyamaCasachaisKalaallisutCmèarKan" + - "nadaCoirèanaisKanuriCaismirisCùrdaisKomiCòrnaisCìorgasaisLaideannLug" + - "samburgaisGandaCànan LimburgLingalaLàthoLiotuainisLuba-KatangaLaitbh" + - "eisMalagasaisMarshallaisMāoriMasadonaisMalayalamMongolaisMarathiMala" + - "idhisMaltaisBurmaisNabhruNdebele ThuathachNeapàlaisNdongaDuitsisNyno" + - "rsk na NirribhidhBokmål na NirribhidhNdebele DheasachNavajoNyanjaOgs" + - "atanaisOjibwaOromoOdiaOsseticPanjabiPaliPòlainnisPashtoPortagailisQu" + - "echuaRumainsKirundiRomàinisRuisisKinyarwandaSanskritSàrdaisSindhiSàm" + - "ais ThuathachSangoSinhalaSlòbhacaisSlòbhainisSamothaisShonaSomàilisA" + - "lbàinisSèirbisSwatiSesothoCànan SundaSuainisKiswahiliTaimilisTeluguT" + - "aidigisCànan nan TàidhTigrinyaTurcmanaisTswanaTongaTurcaisTsongaTata" + - "raisCànan TahitiÙigiuraisUcràinisÙrduUsbagaisVendaBhiet-NamaisVolapü" + - "kWalloonWolofXhosaIùdhaisYorubaZhuangSìnisZuluBasa AcèhAcoliAdangmeA" + - "dygheArabais ThuiniseachAfrihiliAghemAinuAcadaisAlabamaAleutaisAlbài" + - "nis GhegeachAltais DheasachSeann-BheurlaAngikaAramaisMapudungunAraon" + - "aArapahoArabais AildireachArawakArabais MhorocachArabais Èipheiteach" + - "AsuCainnt-shanais na h-AimeireagaAstùraisKotavaAwadhiBaluchìCànan Ba" + - "liBasaaBamunBatak TobaGhomalaBejaBembaBetawiBenaBafutBadagaBalochi S" + - "hiarachBhojpuriBikolBiniBanjarKomSiksikaBishnupriyaBakhtiariBrajBrah" + - "uiBodoAkooseBuriatCànan nam BugisBuluBlinMedumbaCaddoCaribCayugaAtsa" + - "mCebuanoChigaChibchaChagataiCànan ChuukMariChinuk WawaChoctawChipewy" + - "anCherokeeCheyenneCùrdais MheadhanachCoptaisCapiznonTurcais Chriomac" + - "hSeiseallaisCaisiubaisDakotaDargwaTaitaDelawareSlaveyDogribDinkaZarm" + - "aDogriSòrbais ÌochdarachDusun MheadhanachDualaMeadhan-DhuitsisJola-F" + - "onyiDyulaDazagaEmbuEfikÈipheitis ÀrsaidhEkajukElamaisMeadhan-Bheurla" + - "Yupik MheadhanachEwondoCànan na h-ExtremaduraFangFilipinisMeänkieliF" + - "onFraingis nan CajunMeadhan-FhraingisSeann-FhraingisArpitanFrìoslann" + - "ais ThuathachFrìoslannais EarachFriùilisGaGagauzGanGayoGbayaDari Zor" + - "oastrachGe’ezCiribeasaisGilakiMeadhan-Àrd-GearmailtisSeann-Àrd-Gearm" + - "ailtisKonkani GoaGondiGorontaloGotaisGreboGreugais ÀrsaidhGearmailti" + - "s EilbheiseachWayuuFrafraGusiiGwichʼinHaidaHakkaCànan Hawai’iHindis " + - "FhìditheachHiligaynonCànan HetHmongSòrbais UachdarachXiangHupaIbanIb" + - "ibioIlokoIngushBeurla Crìtheolach DiameugaLojbanNgombaMachamePeirsis" + - " IùdhachArabais IùdhachKara-KalpakKabyleKachinJjuKambaKawiCabardaisK" + - "anembuTyapMakondeKabuverdianuKenyangKoroKaingangKhasiCànan KhotanKoy" + - "ra ChiiniKhowarKirmanjkiKakoKalenjinKimbunduKomi-PermyakKonkaniKpell" + - "eKarachay-BalkarKrioKinaray-aCairealaisKurukhShambalaBafiaGearmailti" + - "s ChologneKumykKutenaiLadinoLangiLahndaLambaLeasgaisLingua Franca No" + - "vaLiogùraisLakhótaLombardaisMongoLoziLuri ThuathachLuba-LuluaLuiseño" + - "LundaLuoMizoLuyiaSìnis an LitreachaisLazCànan MadhuraMafaMagahiMaith" + - "iliMakasarMandingoMaasaiMabaMokshaMandarMendeMeruMorisyenMeadhan-Gha" + - "eilgeMakhuwa-MeettoMeta’Mi’kmaqMinangkabauManchuManipuriMohawkMossiM" + - "ari ShiarachMundangIomadh cànanCreekMiorandaisMarwariMentawaiMyeneEr" + - "zyaMazanderaniMin NanEadailtis NapoliNamaGearmailtis ÌochdarachNewar" + - "iNiasCànan NiueAo NagaKwasioNgiemboonNogaiSeann-LochlannaisNovialN’K" + - "oSesotho sa LeboaNuerNewari ChlasaigeachNyamweziNyankoleNyoroNzimaOs" + - "ageTurcais OtomanachPangasinanPahlaviPampangaPapiamentuPalabhaisPica" + - "rdBeurla NigèiriachGearmailtis PhennsylvaniaPlautdietschSeann-Pheirs" + - "isPhenicisPiedmonteseCànan PohnpeiPruisisSeann-PhrovençalK’iche’Quic" + - "hua Àrd-tìr ChimborazoRajasthaniRapa NuiCànan RarotongaRomagnolRombo" + - "RomanaisRusynRovianaAromanaisRwaSandaweSakhaAramais ShamaritanachSam" + - "buruSasakSantaliSaurashtraNgambaySanguSisilisAlbaisSassareseCùrdais " + - "DheasachSenecaSenaSeriSelkupKoyraboro SenniSeann-GhaeilgeTachelhitSh" + - "anArabais SeàdachSidamoSelayarSàmais DheasachSàmais LuleSàmais Inari" + - "Sàmais SkoltSoninkeSranan TongoSererSahoSukumaSusuCànan SumerComorai" + - "sSuraidheac ChlasaigeachSuraidheacTuluTimneTesoTerênaTetumTigreTivTo" + - "kelauTsakhurKlingonTlingitTalyshTamashekNyasa TongaTok PisinTuroyoTa" + - "rokoTsimshianTatiTumbukaTubhaluTasawaqCànan TuvaTamazight an Atlais " + - "MheadhanaichUdmurtUmbunduRootVaiVepsFlannrais SiarachVõroVunjoGearma" + - "iltis WallisWolayttaWarayWashoWarlpiriWuKalmykSogaYaoCànan YapYangbe" + - "nYembaNheengatuCantonaisZapotecComharran BlissCànan ZeelandZenagaTam" + - "azight Stannardach MorocoZuñiSusbaint nach eil ’na chànanZazakiNuadh" + - "-Arabais StannardachGearmailtis na h-OstaireÀrd-Ghearmailtis na h-Ei" + - "lbheiseBeurla AstràiliaBeurla ChanadaBeurla BhreatainnBeurla na h-Ai" + - "meireagaSpàinntis na h-Aimeireaga LaidinneachSpàinntis EòrpachSpàinn" + - "tis MheagsagachFraingis ChanadaFraingis EilbheiseachSagsannais Ìochd" + - "arachFlannraisPortagailis BhraisileachPortagailis EòrpachMoldobhaisS" + - "èirb-ChròthaisisKiswahili na CongoSìnis ShimplichteSìnis Thradaisea" + - "nta", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000d, 0x0017, 0x0021, 0x0025, 0x002e, 0x0037, - 0x003e, 0x0045, 0x004c, 0x0052, 0x0061, 0x0068, 0x0073, 0x007c, - 0x0083, 0x008a, 0x0090, 0x0098, 0x00a1, 0x00a8, 0x00b2, 0x00bc, - 0x00c4, 0x00cb, 0x00cf, 0x00d5, 0x00ec, 0x00f3, 0x00fa, 0x0105, - 0x0110, 0x0116, 0x011e, 0x0121, 0x0129, 0x012f, 0x0138, 0x0142, - 0x014b, 0x0152, 0x0159, 0x015e, 0x016a, 0x0170, 0x017a, 0x0182, - 0x0198, 0x019f, 0x01a8, 0x01b1, 0x01b9, 0x01c1, 0x01c6, 0x01cb, - 0x01d1, 0x01d7, 0x01e0, 0x01eb, 0x01fc, 0x0204, 0x020d, 0x0213, - // Entry 40 - 7F - 0x021e, 0x0229, 0x0234, 0x0238, 0x0242, 0x0249, 0x024c, 0x0258, - 0x0261, 0x026a, 0x0273, 0x027e, 0x028a, 0x028f, 0x0295, 0x029d, - 0x02a6, 0x02b1, 0x02b7, 0x02be, 0x02c9, 0x02cf, 0x02d8, 0x02e0, - 0x02e4, 0x02ec, 0x02f7, 0x02ff, 0x030c, 0x0311, 0x031f, 0x0326, - 0x032c, 0x0336, 0x0342, 0x034b, 0x0355, 0x0360, 0x0366, 0x0370, - 0x0379, 0x0382, 0x0389, 0x0392, 0x0399, 0x03a0, 0x03a6, 0x03b7, - 0x03c1, 0x03c7, 0x03ce, 0x03e3, 0x03f8, 0x0408, 0x040e, 0x0414, - 0x041e, 0x0424, 0x0429, 0x042d, 0x0434, 0x043b, 0x043f, 0x0449, - // Entry 80 - BF - 0x044f, 0x045a, 0x0461, 0x0468, 0x046f, 0x0478, 0x047e, 0x0489, - 0x0491, 0x0499, 0x049f, 0x04b0, 0x04b5, 0x04bc, 0x04c7, 0x04d2, - 0x04db, 0x04e0, 0x04e9, 0x04f2, 0x04fa, 0x04ff, 0x0506, 0x0512, - 0x0519, 0x0522, 0x052a, 0x0530, 0x0538, 0x0549, 0x0551, 0x055b, - 0x0561, 0x0566, 0x056d, 0x0573, 0x057b, 0x0588, 0x0592, 0x059b, - 0x05a0, 0x05a8, 0x05ad, 0x05b9, 0x05c1, 0x05c8, 0x05cd, 0x05d2, - 0x05da, 0x05e0, 0x05e6, 0x05ec, 0x05f0, 0x05fa, 0x05ff, 0x0606, - 0x060c, 0x061f, 0x0627, 0x062c, 0x0630, 0x0637, 0x063e, 0x0646, - // Entry C0 - FF - 0x0658, 0x0667, 0x0674, 0x067a, 0x0681, 0x068b, 0x0691, 0x0698, - 0x06aa, 0x06aa, 0x06b0, 0x06c1, 0x06d5, 0x06d8, 0x06f6, 0x06ff, - 0x0705, 0x070b, 0x0713, 0x071e, 0x071e, 0x0723, 0x0728, 0x0732, - 0x0739, 0x073d, 0x0742, 0x0748, 0x074c, 0x0751, 0x0757, 0x0767, - 0x076f, 0x0774, 0x0778, 0x077e, 0x0781, 0x0788, 0x0793, 0x079c, - 0x07a0, 0x07a6, 0x07aa, 0x07b0, 0x07b6, 0x07c6, 0x07ca, 0x07ce, - 0x07d5, 0x07da, 0x07df, 0x07e5, 0x07ea, 0x07f1, 0x07f6, 0x07fd, - 0x0805, 0x0811, 0x0815, 0x0820, 0x0827, 0x0830, 0x0838, 0x0840, - // Entry 100 - 13F - 0x0854, 0x085b, 0x0863, 0x0874, 0x087f, 0x0889, 0x088f, 0x0895, - 0x089a, 0x08a2, 0x08a8, 0x08ae, 0x08b3, 0x08b8, 0x08bd, 0x08d1, - 0x08e2, 0x08e7, 0x08f7, 0x0901, 0x0906, 0x090c, 0x0910, 0x0914, - 0x0914, 0x0927, 0x092d, 0x0934, 0x0943, 0x0954, 0x095a, 0x0971, - 0x0975, 0x097e, 0x0988, 0x098b, 0x099d, 0x09ae, 0x09bd, 0x09c4, - 0x09db, 0x09ef, 0x09f8, 0x09fa, 0x0a00, 0x0a03, 0x0a07, 0x0a0c, - 0x0a1c, 0x0a23, 0x0a2e, 0x0a34, 0x0a4c, 0x0a62, 0x0a6d, 0x0a72, - 0x0a7b, 0x0a81, 0x0a86, 0x0a97, 0x0aaf, 0x0ab4, 0x0aba, 0x0abf, - // Entry 140 - 17F - 0x0ac8, 0x0acd, 0x0ad2, 0x0ae2, 0x0af5, 0x0aff, 0x0b09, 0x0b0e, - 0x0b21, 0x0b26, 0x0b2a, 0x0b2e, 0x0b34, 0x0b39, 0x0b3f, 0x0b3f, - 0x0b5b, 0x0b61, 0x0b67, 0x0b6e, 0x0b7e, 0x0b8e, 0x0b8e, 0x0b99, - 0x0b9f, 0x0ba5, 0x0ba8, 0x0bad, 0x0bb1, 0x0bba, 0x0bc1, 0x0bc5, - 0x0bcc, 0x0bd8, 0x0bdf, 0x0be3, 0x0beb, 0x0bf0, 0x0bfd, 0x0c09, - 0x0c0f, 0x0c18, 0x0c1c, 0x0c24, 0x0c2c, 0x0c38, 0x0c3f, 0x0c3f, - 0x0c45, 0x0c54, 0x0c58, 0x0c61, 0x0c6b, 0x0c71, 0x0c79, 0x0c7e, - 0x0c92, 0x0c97, 0x0c9e, 0x0ca4, 0x0ca9, 0x0caf, 0x0cb4, 0x0cbc, - // Entry 180 - 1BF - 0x0cce, 0x0cd8, 0x0cd8, 0x0ce0, 0x0cea, 0x0cef, 0x0cf3, 0x0d01, - 0x0d01, 0x0d0b, 0x0d13, 0x0d18, 0x0d1b, 0x0d1f, 0x0d24, 0x0d39, - 0x0d3c, 0x0d4a, 0x0d4e, 0x0d54, 0x0d5c, 0x0d63, 0x0d6b, 0x0d71, - 0x0d75, 0x0d7b, 0x0d81, 0x0d86, 0x0d8a, 0x0d92, 0x0da2, 0x0db0, - 0x0db7, 0x0dc0, 0x0dcb, 0x0dd1, 0x0dd9, 0x0ddf, 0x0de4, 0x0df1, - 0x0df8, 0x0e05, 0x0e0a, 0x0e14, 0x0e1b, 0x0e23, 0x0e28, 0x0e2d, - 0x0e38, 0x0e3f, 0x0e4f, 0x0e53, 0x0e6a, 0x0e70, 0x0e74, 0x0e7f, - 0x0e86, 0x0e8c, 0x0e95, 0x0e9a, 0x0eab, 0x0eb1, 0x0eb7, 0x0ec7, - // Entry 1C0 - 1FF - 0x0ecb, 0x0ede, 0x0ee6, 0x0eee, 0x0ef3, 0x0ef8, 0x0efd, 0x0f0e, - 0x0f18, 0x0f1f, 0x0f27, 0x0f31, 0x0f3a, 0x0f40, 0x0f52, 0x0f6b, - 0x0f77, 0x0f85, 0x0f85, 0x0f8d, 0x0f98, 0x0f98, 0x0fa6, 0x0fad, - 0x0fbe, 0x0fc9, 0x0fe5, 0x0fef, 0x0ff7, 0x1007, 0x100f, 0x100f, - 0x1014, 0x101c, 0x101c, 0x1021, 0x1028, 0x1031, 0x1034, 0x103b, - 0x1040, 0x1055, 0x105c, 0x1061, 0x1068, 0x1072, 0x1079, 0x107e, - 0x1085, 0x108b, 0x1094, 0x10a5, 0x10ab, 0x10af, 0x10b3, 0x10b9, - 0x10c8, 0x10d6, 0x10d6, 0x10df, 0x10e3, 0x10f3, 0x10f9, 0x10f9, - // Entry 200 - 23F - 0x1100, 0x1110, 0x111c, 0x1129, 0x1136, 0x113d, 0x113d, 0x1149, - 0x114e, 0x1152, 0x1152, 0x1158, 0x115c, 0x1168, 0x1170, 0x1187, - 0x1191, 0x1191, 0x1195, 0x119a, 0x119e, 0x11a5, 0x11aa, 0x11af, - 0x11b2, 0x11b9, 0x11c0, 0x11c7, 0x11ce, 0x11d4, 0x11dc, 0x11e7, - 0x11f0, 0x11f6, 0x11fc, 0x11fc, 0x1205, 0x1209, 0x1210, 0x1217, - 0x121e, 0x1229, 0x1249, 0x124f, 0x124f, 0x1256, 0x125a, 0x125d, - 0x125d, 0x1261, 0x1272, 0x1272, 0x1272, 0x1277, 0x127c, 0x128e, - 0x1296, 0x129b, 0x12a0, 0x12a8, 0x12aa, 0x12b0, 0x12b0, 0x12b4, - // Entry 240 - 27F - 0x12b7, 0x12c1, 0x12c8, 0x12cd, 0x12d6, 0x12df, 0x12e6, 0x12f5, - 0x1303, 0x1309, 0x1325, 0x132a, 0x1349, 0x134f, 0x1368, 0x1368, - 0x1380, 0x13a0, 0x13b1, 0x13bf, 0x13d0, 0x13e6, 0x140c, 0x141f, - 0x1435, 0x1435, 0x1445, 0x145a, 0x1470, 0x1479, 0x1491, 0x14a5, - 0x14af, 0x14c2, 0x14d4, 0x14e6, 0x14fa, - }, - }, - { // gl - "afarabkhazoafricánerakánamáricoaragonésárabeasamésavaraimaráacerbaixanob" + - "askirbielorrusobúlgarobislamabambarobengalítibetanobretónbosníacocat" + - "alánchechenochamorrocorsochecoeslavo eclesiásticochuvashgalésdinamar" + - "quésalemándivehidzongkhaewegregoinglésesperantoespañolestonianoéusca" + - "ropersafulafinésfidxianoferoésfrancésfrisónirlandésgaélico escocésga" + - "legoguaraníguxaratímanxhausahebreohindicroatahaitianohúngaroarmenioh" + - "ererointerlinguaindonesioiboyi sichuanésidoislandésitalianoinuktitut" + - "xaponésxavanésxeorxianokongokikuyukuanyamacasacogroenlandés occident" + - "alkhmercanaréscoreanocanuricachemirkurdokomicórnicoquirguizlatínluxe" + - "mburguésgandalimburguéslingalalaosianolituanoluba-katangaletónmalgax" + - "emarshalésmaorímacedoniomalabarmongolmarathimalaiomaltésbirmanonauru" + - "ndebele do nortenepalíndongaholandésnoruegués nynorsknoruegués bokma" + - "lndebele do surnavajochewaoccitanooromooriyaosetiopanxabianopolacopa" + - "shtuportuguésquechuaromancherundiromanésrusoruandéssánscritosardosin" + - "dhisaami do nortesangocingaléseslovacoeslovenosamoanoshonasomalíalba" + - "nésserbioswatisesothosundanéssuecosuahilitámiltelugútaxicotailandést" + - "igriñaturcomántswanatonganésturcotsongatártarotahitianouigurucraínou" + - "rdúuzbecovendavietnamitavolapukvalónwólofxhosayiddishyorubachinészul" + - "úachinésacholíadangmeadigueoaghemainualeutianoaltai meridionalangik" + - "aarameomapuchearapahoeasuasturianoawadhibalinésbasaabembabenabaluchi" + - " occidentalbhojpuribinisiksikábodobuginésblincebuanokigachuukesemari" + - "choctawcheroquicheiénkurdo soraníseselwa (crioulo das Seixeles)dakot" + - "adargwataitadogribzarmabaixo sorabiodualajola-fonyidazagaembuefikexi" + - "pcio antigoekajukewondofilipinofonfriulianogagagauzge’ezkiribatianog" + - "orontalogrego antigoalemán suízogusiigwichʼinhawaianohiligaynonhmong" + - "alto sorbiohupaibanibibioilokoingushlojbanngombamachamekabilekachinj" + - "jukambacabardianotyapmakondecaboverdianokorokhasikoyra chiinikakokal" + - "enjinkimbundukomi permiokonkanikpellecarachaio-bálcaracareliokurukhs" + - "hambalabafiakölschkumykladinolangilezguilakotaloziluri do norteluba-" + - "lulualundaluomizoluyiamadurésmagahimaithilimakasarmasaimokshamendeme" + - "rucrioulo mauricianomakhuwa-meettometa’micmacminangkabaumanipurimoha" + - "wkmossimundangvarias linguascreekmirandéserzyamazandaranínapolitanon" + - "amabaixo alemánnewariniasniuanokwasiongiemboonnogain’kosesotho sa le" + - "boanuernyankolepangasinanpampangapapiamentopalauanopidgin nixerianop" + - "rusianoquichérapanuirarotonganoromboaromanésrwasandawesakhasamburusa" + - "ntalingambaysangusicilianoescocéskurdo meridionalsenakoyraboro senni" + - "tachelhitshansaami meridionalsaami de Lulesaami de Inarisaami de Sko" + - "ltsoninkesranan tongosahosukumacomorianosiríacotimnetesotetuntigrékl" + - "ingontok pisintarokotumbukatuvaluanotasawaqtuvanianotamazight do Mar" + - "rocos Centraludmurtoumbunduraízvaivunjowalserwolayttawaray-waraywalr" + - "piricalmucosogayangbenyembacantonéstamazight de Marrocos estándarzun" + - "isen contido lingüísticozazakiárabe estándar modernoalemán austríaco" + - "alto alemán suízoinglés australianoinglés canadianoinglés británicoi" + - "nglés dos Estados Unidosespañol latinoamericanocastelánespañol de Mé" + - "xicofrancés canadianofrancés suízobaixo saxónflamencoportugués brasi" + - "leiroportugués europeomoldavoserbocroatasuahili congoléschinés simpl" + - "ificadochinés tradicional", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000b, 0x000b, 0x0015, 0x001a, 0x0022, 0x002b, - 0x0031, 0x0038, 0x003c, 0x0043, 0x004e, 0x0054, 0x005e, 0x0066, - 0x006d, 0x0074, 0x007c, 0x0084, 0x008b, 0x0094, 0x009c, 0x00a4, - 0x00ac, 0x00b1, 0x00b1, 0x00b6, 0x00ca, 0x00d1, 0x00d7, 0x00e3, - 0x00ea, 0x00f0, 0x00f8, 0x00fb, 0x0100, 0x0107, 0x0110, 0x0118, - 0x0121, 0x0129, 0x012e, 0x0132, 0x0138, 0x0140, 0x0147, 0x014f, - 0x0156, 0x015f, 0x0170, 0x0176, 0x017e, 0x0187, 0x018b, 0x0190, - 0x0196, 0x019b, 0x019b, 0x01a1, 0x01a9, 0x01b1, 0x01b8, 0x01be, - // Entry 40 - 7F - 0x01c9, 0x01d2, 0x01d2, 0x01d5, 0x01e2, 0x01e2, 0x01e5, 0x01ee, - 0x01f6, 0x01ff, 0x0207, 0x020f, 0x0218, 0x021d, 0x0223, 0x022b, - 0x0231, 0x0248, 0x024d, 0x0255, 0x025c, 0x0262, 0x026a, 0x026f, - 0x0273, 0x027b, 0x0283, 0x0289, 0x0296, 0x029b, 0x02a6, 0x02ad, - 0x02b5, 0x02bc, 0x02c8, 0x02ce, 0x02d5, 0x02df, 0x02e5, 0x02ee, - 0x02f5, 0x02fb, 0x0302, 0x0308, 0x030f, 0x0316, 0x031b, 0x032b, - 0x0332, 0x0338, 0x0341, 0x0353, 0x0364, 0x0372, 0x0378, 0x037d, - 0x0385, 0x0385, 0x038a, 0x038f, 0x0395, 0x039f, 0x039f, 0x03a5, - // Entry 80 - BF - 0x03ab, 0x03b5, 0x03bc, 0x03c4, 0x03c9, 0x03d1, 0x03d5, 0x03dd, - 0x03e7, 0x03ec, 0x03f2, 0x0400, 0x0405, 0x040e, 0x0416, 0x041e, - 0x0425, 0x042a, 0x0431, 0x0439, 0x043f, 0x0444, 0x044b, 0x0454, - 0x0459, 0x0460, 0x0466, 0x046d, 0x0473, 0x047d, 0x0485, 0x048e, - 0x0494, 0x049d, 0x04a2, 0x04a8, 0x04b0, 0x04b9, 0x04be, 0x04c6, - 0x04cb, 0x04d1, 0x04d6, 0x04e0, 0x04e7, 0x04ed, 0x04f3, 0x04f8, - 0x04ff, 0x0505, 0x0505, 0x050c, 0x0511, 0x0519, 0x0520, 0x0527, - 0x052e, 0x052e, 0x052e, 0x0533, 0x0537, 0x0537, 0x0537, 0x0540, - // Entry C0 - FF - 0x0540, 0x0550, 0x0550, 0x0556, 0x055c, 0x0563, 0x0563, 0x056b, - 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056e, 0x056e, 0x0577, - 0x0577, 0x057d, 0x057d, 0x0585, 0x0585, 0x058a, 0x058a, 0x058a, - 0x058a, 0x058a, 0x058f, 0x058f, 0x0593, 0x0593, 0x0593, 0x05a5, - 0x05ad, 0x05ad, 0x05b1, 0x05b1, 0x05b1, 0x05b9, 0x05b9, 0x05b9, - 0x05b9, 0x05b9, 0x05bd, 0x05bd, 0x05bd, 0x05c5, 0x05c5, 0x05c9, - 0x05c9, 0x05c9, 0x05c9, 0x05c9, 0x05c9, 0x05d0, 0x05d4, 0x05d4, - 0x05d4, 0x05dc, 0x05e0, 0x05e0, 0x05e7, 0x05e7, 0x05ef, 0x05f6, - // Entry 100 - 13F - 0x0603, 0x0603, 0x0603, 0x0603, 0x0621, 0x0621, 0x0627, 0x062d, - 0x0632, 0x0632, 0x0632, 0x0638, 0x0638, 0x063d, 0x063d, 0x064a, - 0x064a, 0x064f, 0x064f, 0x0659, 0x0659, 0x065f, 0x0663, 0x0667, - 0x0667, 0x0675, 0x067b, 0x067b, 0x067b, 0x067b, 0x0681, 0x0681, - 0x0681, 0x0689, 0x0689, 0x068c, 0x068c, 0x068c, 0x068c, 0x068c, - 0x068c, 0x068c, 0x0695, 0x0697, 0x069d, 0x069d, 0x069d, 0x069d, - 0x069d, 0x06a4, 0x06af, 0x06af, 0x06af, 0x06af, 0x06af, 0x06af, - 0x06b8, 0x06b8, 0x06b8, 0x06c4, 0x06d2, 0x06d2, 0x06d2, 0x06d7, - // Entry 140 - 17F - 0x06e0, 0x06e0, 0x06e0, 0x06e8, 0x06e8, 0x06f2, 0x06f2, 0x06f7, - 0x0702, 0x0702, 0x0706, 0x070a, 0x0710, 0x0715, 0x071b, 0x071b, - 0x071b, 0x0721, 0x0727, 0x072e, 0x072e, 0x072e, 0x072e, 0x072e, - 0x0734, 0x073a, 0x073d, 0x0742, 0x0742, 0x074c, 0x074c, 0x0750, - 0x0757, 0x0763, 0x0763, 0x0767, 0x0767, 0x076c, 0x076c, 0x0778, - 0x0778, 0x0778, 0x077c, 0x0784, 0x078c, 0x0797, 0x079e, 0x079e, - 0x07a4, 0x07b6, 0x07b6, 0x07b6, 0x07bd, 0x07c3, 0x07cb, 0x07d0, - 0x07d7, 0x07dc, 0x07dc, 0x07e2, 0x07e7, 0x07e7, 0x07e7, 0x07ed, - // Entry 180 - 1BF - 0x07ed, 0x07ed, 0x07ed, 0x07f3, 0x07f3, 0x07f3, 0x07f7, 0x0804, - 0x0804, 0x080e, 0x080e, 0x0813, 0x0816, 0x081a, 0x081f, 0x081f, - 0x081f, 0x0827, 0x0827, 0x082d, 0x0835, 0x083c, 0x083c, 0x0841, - 0x0841, 0x0847, 0x0847, 0x084c, 0x0850, 0x0862, 0x0862, 0x0870, - 0x0877, 0x087d, 0x0888, 0x0888, 0x0890, 0x0896, 0x089b, 0x089b, - 0x08a2, 0x08b0, 0x08b5, 0x08be, 0x08be, 0x08be, 0x08be, 0x08c3, - 0x08cf, 0x08cf, 0x08d9, 0x08dd, 0x08ea, 0x08f0, 0x08f4, 0x08fa, - 0x08fa, 0x0900, 0x0909, 0x090e, 0x090e, 0x090e, 0x0914, 0x0924, - // Entry 1C0 - 1FF - 0x0928, 0x0928, 0x0928, 0x0930, 0x0930, 0x0930, 0x0930, 0x0930, - 0x093a, 0x093a, 0x0942, 0x094c, 0x0954, 0x0954, 0x0964, 0x0964, - 0x0964, 0x0964, 0x0964, 0x0964, 0x0964, 0x0964, 0x0964, 0x096c, - 0x096c, 0x0973, 0x0973, 0x0973, 0x097a, 0x0985, 0x0985, 0x0985, - 0x098a, 0x098a, 0x098a, 0x098a, 0x098a, 0x0993, 0x0996, 0x099d, - 0x09a2, 0x09a2, 0x09a9, 0x09a9, 0x09b0, 0x09b0, 0x09b7, 0x09bc, - 0x09c5, 0x09cd, 0x09cd, 0x09dd, 0x09dd, 0x09e1, 0x09e1, 0x09e1, - 0x09f0, 0x09f0, 0x09f0, 0x09f9, 0x09fd, 0x09fd, 0x09fd, 0x09fd, - // Entry 200 - 23F - 0x09fd, 0x0a0d, 0x0a1a, 0x0a28, 0x0a36, 0x0a3d, 0x0a3d, 0x0a49, - 0x0a49, 0x0a4d, 0x0a4d, 0x0a53, 0x0a53, 0x0a53, 0x0a5c, 0x0a5c, - 0x0a64, 0x0a64, 0x0a64, 0x0a69, 0x0a6d, 0x0a6d, 0x0a72, 0x0a78, - 0x0a78, 0x0a78, 0x0a78, 0x0a7f, 0x0a7f, 0x0a7f, 0x0a7f, 0x0a7f, - 0x0a88, 0x0a88, 0x0a8e, 0x0a8e, 0x0a8e, 0x0a8e, 0x0a95, 0x0a9e, - 0x0aa5, 0x0aae, 0x0acb, 0x0ad2, 0x0ad2, 0x0ad9, 0x0ade, 0x0ae1, - 0x0ae1, 0x0ae1, 0x0ae1, 0x0ae1, 0x0ae1, 0x0ae1, 0x0ae6, 0x0aec, - 0x0af4, 0x0aff, 0x0aff, 0x0b07, 0x0b07, 0x0b0e, 0x0b0e, 0x0b12, - // Entry 240 - 27F - 0x0b12, 0x0b12, 0x0b19, 0x0b1e, 0x0b1e, 0x0b27, 0x0b27, 0x0b27, - 0x0b27, 0x0b27, 0x0b46, 0x0b4a, 0x0b63, 0x0b69, 0x0b81, 0x0b81, - 0x0b93, 0x0ba6, 0x0bb9, 0x0bca, 0x0bdc, 0x0bf6, 0x0c0e, 0x0c17, - 0x0c2a, 0x0c2a, 0x0c3c, 0x0c4b, 0x0c57, 0x0c5f, 0x0c74, 0x0c86, - 0x0c8d, 0x0c98, 0x0ca9, 0x0cbd, 0x0cd0, - }, - }, - { // gsw - "AfarAbchasischAvestischAfrikaansAkanAmharischAragonesischArabischAssames" + - "ischAwarischAymaraAserbaidschanischBaschkirischWiissrussischBulgaari" + - "schBislamaBambaraBengalischTibeetischBrötoonischBosnischKatalaanisch" + - "TschetscheenischChamorroKorsischCreeTschechischChileslawischTschuwas" + - "chischWalisischTänischTüütschMalediivischDschongkhaEweGriechischÄngl" + - "ischEschperantoSchpanischEestnischBaskischPersischFulFinnischFidschi" + - "anischFäröischFranzösischFriesischIirischSchottisch-GäälischGalizisc" + - "hGuaraniGujaratiManx-GäälischHaussaHebräischHindiHiri-MotuKroazischH" + - "aitischUngarischArmenischHereroInterlinguaIndonesischInterlingueIgbo" + - "Sezuanischs YiInupiakIdoIisländischItaliänischInukitutJapanischJavan" + - "ischGeorgischKongolesischKikuyu-SchpraachKwanyamaKasachischGröönländ" + - "ischKambodschanischKannadaKoreaanischKanuri-SchpraachKaschmirischKur" + - "dischKomi-SchpraachKornischKirgiisischLatiinLuxemburgischGanda-Schpr" + - "aachLimburgischLingalaLaozischLitauischLubaLettischMadagassischMarsc" + - "hallesischMaoriMazedonischMalayalamMongolischMarathiMalaiischMaltesi" + - "schBirmanischNauruischNord-Ndebele-SchpraachNepalesischNdongaNiderlä" + - "ndischNorwegisch NynorskNorwegisch BokmålSüüd-Ndebele-SchpraachNavaj" + - "o-SchpraachChewa-SchpraachOkzitanischOjibwa-SchpraachOromoOrijaOssez" + - "ischPandschabischPaliPolnischPaschtuPortugiisischQuechuaRätoromanisc" + - "hRundi-SchpraachRumänischRussischRuandischSanschkritSardischSindhiNo" + - "rd-SamischSangoSinghalesischSlowakischSlowenischSamoanischSchhonaSom" + - "aliAlbanischSerbischSwaziSüüd-Sotho-SchpraachSundanesischSchwedischS" + - "uaheliTamilischTeluguTadschikischThailändischTigrinjaTurkmenischTswa" + - "na-SchpraachTongaischTürkischTsongaTatarischTahitischUigurischUkrain" + - "ischUrduUsbekischVenda-SchpraachVietnamesischVolapükWallonischWolofX" + - "hosaJiddischYorubaZhuangChineesischZuluAcehAcholiAdangmeAdygaiAfrihi" + - "liAinuAkkadischAleutischSüüd-AltaischAltänglischAngikaAramääischArau" + - "kanischArapahoArawakAschturianischAwadhiBelutschischBalinesischBasaa" + - "BedauyeBembaBhodschpuriBikolischBiniBlackfoot-SchpraachBraj-BhakhaBu" + - "rjatischBugineesischBlinCaddoKariibischAtsamCebuanoTschibtschaTschag" + - "ataischTrukesischTscheremissischChinookChoctawChipewyanCherokeeCheye" + - "nneKoptischKrimtatarischKaschubischTakotaTargiinischDelaware-Schpraa" + - "chSlaveyTogribTinkaTogriNidersorbischTualaMittelniderländischTiulaEf" + - "ikischAltägyptischEkajukElamischMittelänglischEwondoPangwe-Schpraach" + - "FilipinoFonMittelfranzösischAltfranzösischNordfriesischOschtfriesisc" + - "hFriulischGaGayoGbayaGeezGilbertesischMittelhochtüütschAlthochtüütsc" + - "hGondiMongondouGotischGreboAltgriechischSchwiizertüütschKutchinischH" + - "aidaHawaiianischHiligaynonischHethitischMiaoObersorbischHupaIbanisch" + - "IlokanoInguschischLojbanischJüüdisch-PersischJüüdisch-ArabischKaraka" + - "lpakischKabylischKachin-SchpraachJjuKambaKawiKabardinischTyapKoroKha" + - "sischSakischKimbundu-SchpraachKonkaniKosraeanischKpelle-SchpraachKar" + - "atschaiisch-BalkarischKarelischOraon-SchpraachKumükischKutenai-Schpr" + - "aachLadinoLahndanischLambanischLesgischMongoRotse-SchpraachLuba-Lulu" + - "aLuiseno-SchpraachLunda-SchpraachLuo-SchpraachLushai-SchpraachMadure" + - "sischKhottaMaithiliMakassarischManding-SchpraachMassai-SchpraachMoks" + - "chamordwinischMandaresischMende-SchpraachMittelirischMicmac-Schpraac" + - "hMinangkabau-SchpraachMandschurischMeithei-SchpraachMohawk-Schpraach" + - "Mossi-SchpraachMehrschpraachigMuskogee-SchpraachMirandesischMarwaris" + - "chErzyaNeapolitanischNidertüütschNewarischNias-SchpraachNiue-Schpraa" + - "chNogaischAltnordischN’KoNord-Sotho-SchpraachAlt-NewariNyamwezi-Schp" + - "raachNyankoleNyoroNzimaOsage-SchpraachOsmanischPangasinanischMittelp" + - "ersischPampanggan-SchpraachPapiamentoPalauAltpersischPhönikischPonap" + - "eanischAltprovenzalischRajasthaniOschterinsel-SchpraachRarotonganisc" + - "hZigüünerschpraachAromunischSandawe-SchpraachJakutischSamaritanischS" + - "asakSantaliSizilianischSchottischSelkupischAltirischSchan-SchpraachS" + - "idamoSüüd-SamischLule-SamischInari-SamischSkolt-SamischSoninke-Schpr" + - "aachSogdischSrananischSerer-SchpraachSukuma-SchpraachSusuSumerischAl" + - "tsyrischSyrischTemneTereno-SchpraachTetum-SchpraachTigreTiv-Schpraac" + - "hTokelauanischKlingonischTlingit-SchpraachTamaseqTsonga-SchpraachNeu" + - "melanesischTsimshian-SchpraachTumbuka-SchpraachElliceanischTuwinisch" + - "UdmurtischUgaritischMbundu-SchpraachRootVai-SchpraachWotischWalamo-S" + - "chpraachWarayWasho-SchpraachKalmückischYao-SchpraachYapesischZapotek" + - "ischBliss-SymboolZenagaZuni-SchpraachKän schpraachliche InhaltZazaÖs" + - "chtriichischs TüütschSchwiizer HochtüütschAuschtralischs ÄnglischKan" + - "adischs ÄnglischBritischs ÄnglischAmerikanischs ÄnglischLatiinamerik" + - "anischs SchpanischIbeerischs SchpanischKanadischs FranzösischSchwiiz" + - "er FranzösischFläämischBrasilianischs PortugiisischIberischs Portugi" + - "isischMoldawischSerbo-KroatischVeräifachts ChineesischTradizionells " + - "Chineesisch", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000e, 0x0017, 0x0020, 0x0024, 0x002d, 0x0039, - 0x0041, 0x004c, 0x0054, 0x005a, 0x006b, 0x0077, 0x0084, 0x008f, - 0x0096, 0x009d, 0x00a7, 0x00b1, 0x00bd, 0x00c5, 0x00d1, 0x00e1, - 0x00e9, 0x00f1, 0x00f5, 0x0100, 0x010d, 0x011b, 0x0124, 0x012c, - 0x0135, 0x0141, 0x014b, 0x014e, 0x0158, 0x0161, 0x016c, 0x0176, - 0x017f, 0x0187, 0x018f, 0x0192, 0x019a, 0x01a7, 0x01b1, 0x01bd, - 0x01c6, 0x01cd, 0x01e2, 0x01eb, 0x01f2, 0x01fa, 0x0209, 0x020f, - 0x0219, 0x021e, 0x0227, 0x0230, 0x0238, 0x0241, 0x024a, 0x0250, - // Entry 40 - 7F - 0x025b, 0x0266, 0x0271, 0x0275, 0x0283, 0x028a, 0x028d, 0x0299, - 0x02a5, 0x02ad, 0x02b6, 0x02bf, 0x02c8, 0x02d4, 0x02e4, 0x02ec, - 0x02f6, 0x0306, 0x0315, 0x031c, 0x0327, 0x0337, 0x0343, 0x034b, - 0x0359, 0x0361, 0x036c, 0x0372, 0x037f, 0x038e, 0x0399, 0x03a0, - 0x03a8, 0x03b1, 0x03b5, 0x03bd, 0x03c9, 0x03d8, 0x03dd, 0x03e8, - 0x03f1, 0x03fb, 0x0402, 0x040b, 0x0415, 0x041f, 0x0428, 0x043e, - 0x0449, 0x044f, 0x045d, 0x046f, 0x0481, 0x0499, 0x04a9, 0x04b8, - 0x04c3, 0x04d3, 0x04d8, 0x04dd, 0x04e6, 0x04f3, 0x04f7, 0x04ff, - // Entry 80 - BF - 0x0506, 0x0513, 0x051a, 0x0528, 0x0537, 0x0541, 0x0549, 0x0552, - 0x055c, 0x0564, 0x056a, 0x0576, 0x057b, 0x0588, 0x0592, 0x059c, - 0x05a6, 0x05ad, 0x05b3, 0x05bc, 0x05c4, 0x05c9, 0x05df, 0x05eb, - 0x05f5, 0x05fc, 0x0605, 0x060b, 0x0617, 0x0624, 0x062c, 0x0637, - 0x0647, 0x0650, 0x0659, 0x065f, 0x0668, 0x0671, 0x067a, 0x0684, - 0x0688, 0x0691, 0x06a0, 0x06ad, 0x06b5, 0x06bf, 0x06c4, 0x06c9, - 0x06d1, 0x06d7, 0x06dd, 0x06e8, 0x06ec, 0x06f0, 0x06f6, 0x06fd, - 0x0703, 0x0703, 0x070b, 0x070b, 0x070f, 0x0718, 0x0718, 0x0721, - // Entry C0 - FF - 0x0721, 0x0730, 0x073c, 0x0742, 0x074e, 0x0759, 0x0759, 0x0760, - 0x0760, 0x0760, 0x0766, 0x0766, 0x0766, 0x0766, 0x0766, 0x0774, - 0x0774, 0x077a, 0x0786, 0x0791, 0x0791, 0x0796, 0x0796, 0x0796, - 0x0796, 0x079d, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, - 0x07ad, 0x07b6, 0x07ba, 0x07ba, 0x07ba, 0x07cd, 0x07cd, 0x07cd, - 0x07d8, 0x07d8, 0x07d8, 0x07d8, 0x07e2, 0x07ee, 0x07ee, 0x07f2, - 0x07f2, 0x07f7, 0x0801, 0x0801, 0x0806, 0x080d, 0x080d, 0x0818, - 0x0825, 0x082f, 0x083e, 0x0845, 0x084c, 0x0855, 0x085d, 0x0865, - // Entry 100 - 13F - 0x0865, 0x086d, 0x086d, 0x087a, 0x087a, 0x0885, 0x088b, 0x0896, - 0x0896, 0x08a8, 0x08ae, 0x08b4, 0x08b9, 0x08b9, 0x08be, 0x08cb, - 0x08cb, 0x08d0, 0x08e4, 0x08e4, 0x08e9, 0x08e9, 0x08e9, 0x08f1, - 0x08f1, 0x08fe, 0x0904, 0x090c, 0x091b, 0x091b, 0x0921, 0x0921, - 0x0931, 0x0939, 0x0939, 0x093c, 0x093c, 0x094e, 0x095d, 0x095d, - 0x096a, 0x0978, 0x0981, 0x0983, 0x0983, 0x0983, 0x0987, 0x098c, - 0x098c, 0x0990, 0x099d, 0x099d, 0x09b0, 0x09c0, 0x09c0, 0x09c5, - 0x09ce, 0x09d5, 0x09da, 0x09e7, 0x09f9, 0x09f9, 0x09f9, 0x09f9, - // Entry 140 - 17F - 0x0a04, 0x0a09, 0x0a09, 0x0a15, 0x0a15, 0x0a23, 0x0a2d, 0x0a31, - 0x0a3d, 0x0a3d, 0x0a41, 0x0a49, 0x0a49, 0x0a50, 0x0a5b, 0x0a5b, - 0x0a5b, 0x0a65, 0x0a65, 0x0a65, 0x0a78, 0x0a8b, 0x0a8b, 0x0a99, - 0x0aa2, 0x0ab2, 0x0ab5, 0x0aba, 0x0abe, 0x0aca, 0x0aca, 0x0ace, - 0x0ace, 0x0ace, 0x0ace, 0x0ad2, 0x0ad2, 0x0ada, 0x0ae1, 0x0ae1, - 0x0ae1, 0x0ae1, 0x0ae1, 0x0ae1, 0x0af3, 0x0af3, 0x0afa, 0x0b06, - 0x0b16, 0x0b2f, 0x0b2f, 0x0b2f, 0x0b38, 0x0b47, 0x0b47, 0x0b47, - 0x0b47, 0x0b51, 0x0b62, 0x0b68, 0x0b68, 0x0b73, 0x0b7d, 0x0b85, - // Entry 180 - 1BF - 0x0b85, 0x0b85, 0x0b85, 0x0b85, 0x0b85, 0x0b8a, 0x0b99, 0x0b99, - 0x0b99, 0x0ba3, 0x0bb4, 0x0bc3, 0x0bd0, 0x0be0, 0x0be0, 0x0be0, - 0x0be0, 0x0beb, 0x0beb, 0x0bf1, 0x0bf9, 0x0c05, 0x0c16, 0x0c26, - 0x0c26, 0x0c38, 0x0c44, 0x0c53, 0x0c53, 0x0c53, 0x0c5f, 0x0c5f, - 0x0c5f, 0x0c6f, 0x0c84, 0x0c91, 0x0ca2, 0x0cb2, 0x0cc1, 0x0cc1, - 0x0cc1, 0x0cd0, 0x0ce2, 0x0cee, 0x0cf8, 0x0cf8, 0x0cf8, 0x0cfd, - 0x0cfd, 0x0cfd, 0x0d0b, 0x0d0b, 0x0d19, 0x0d22, 0x0d30, 0x0d3e, - 0x0d3e, 0x0d3e, 0x0d3e, 0x0d46, 0x0d51, 0x0d51, 0x0d57, 0x0d6b, - // Entry 1C0 - 1FF - 0x0d6b, 0x0d75, 0x0d87, 0x0d8f, 0x0d94, 0x0d99, 0x0da8, 0x0db1, - 0x0dbf, 0x0dcd, 0x0de1, 0x0deb, 0x0df0, 0x0df0, 0x0df0, 0x0df0, - 0x0df0, 0x0dfb, 0x0dfb, 0x0e06, 0x0e06, 0x0e06, 0x0e12, 0x0e12, - 0x0e22, 0x0e22, 0x0e22, 0x0e2c, 0x0e42, 0x0e50, 0x0e50, 0x0e50, - 0x0e50, 0x0e63, 0x0e63, 0x0e63, 0x0e63, 0x0e6d, 0x0e6d, 0x0e7e, - 0x0e87, 0x0e94, 0x0e94, 0x0e99, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, - 0x0eac, 0x0eb6, 0x0eb6, 0x0eb6, 0x0eb6, 0x0eb6, 0x0eb6, 0x0ec0, - 0x0ec0, 0x0ec9, 0x0ec9, 0x0ec9, 0x0ed8, 0x0ed8, 0x0ede, 0x0ede, - // Entry 200 - 23F - 0x0ede, 0x0eec, 0x0ef8, 0x0f05, 0x0f12, 0x0f23, 0x0f2b, 0x0f35, - 0x0f44, 0x0f44, 0x0f44, 0x0f54, 0x0f58, 0x0f61, 0x0f61, 0x0f6b, - 0x0f72, 0x0f72, 0x0f72, 0x0f77, 0x0f77, 0x0f87, 0x0f96, 0x0f9b, - 0x0fa8, 0x0fb5, 0x0fb5, 0x0fc0, 0x0fd1, 0x0fd1, 0x0fd8, 0x0fe8, - 0x0ff6, 0x0ff6, 0x0ff6, 0x0ff6, 0x1009, 0x1009, 0x101a, 0x1026, - 0x1026, 0x102f, 0x102f, 0x1039, 0x1043, 0x1053, 0x1057, 0x1064, - 0x1064, 0x1064, 0x1064, 0x1064, 0x106b, 0x106b, 0x106b, 0x106b, - 0x107b, 0x1080, 0x108f, 0x108f, 0x108f, 0x109b, 0x109b, 0x109b, - // Entry 240 - 27F - 0x10a8, 0x10b1, 0x10b1, 0x10b1, 0x10b1, 0x10b1, 0x10bc, 0x10c9, - 0x10c9, 0x10cf, 0x10cf, 0x10dd, 0x10f7, 0x10fb, 0x10fb, 0x10fb, - 0x1115, 0x112c, 0x1144, 0x1158, 0x116b, 0x1182, 0x11a0, 0x11b5, - 0x11b5, 0x11b5, 0x11cc, 0x11e2, 0x11e2, 0x11ed, 0x1209, 0x1220, - 0x122a, 0x1239, 0x1239, 0x1251, 0x126a, - }, - }, - { // gu - guLangStr, - guLangIdx, - }, - { // guz - "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + - "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + - "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + - "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + - "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + - "rubaKichinaKizuluEkegusii", - []uint16{ // 320 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, - 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, - 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, - 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, - // Entry 40 - 7F - 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, - 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, - 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, - // Entry 80 - BF - 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, - 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, - 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, - 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, - 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, - 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry C0 - FF - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 100 - 13F - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0171, - }, - }, - { // gv - "Gaelg", - []uint16{ // 55 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, - }, - }, - { // ha - "AkanAmharikLarabciBelarusanciBulgaranciBengaliHarshen CakJamusanciGirkan" + - "ciTuranciIspaniyanciParisanciFaransanciHausaHarshen HindiHarshen Hun" + - "gariHarshen IndunusiyaInyamuranciItaliyanciJapananciJabananciHarshen" + - " KimarHarshen KoreyaHarshen MalaiBurmanciNepaliHolanciPunjabiHarshen" + - " PolanHarshen PortugalRomaniyanciRashanciKiniyaruwandaSomaliHarshen " + - "SuwedanTamilThaiHarshen TurkiyyaHarshen YukurenHarshen UrduHarshen B" + - "iyetinamYarbanciHarshen SinHarshen Zulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000b, 0x000b, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x001d, 0x0027, - 0x0027, 0x0027, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0042, 0x0042, 0x0042, 0x0042, 0x004a, 0x0051, 0x0051, 0x005c, - 0x005c, 0x005c, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006f, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0074, - 0x0074, 0x0081, 0x0081, 0x0081, 0x0081, 0x0090, 0x0090, 0x0090, - // Entry 40 - 7F - 0x0090, 0x00a2, 0x00a2, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, - 0x00b7, 0x00b7, 0x00c0, 0x00c9, 0x00c9, 0x00c9, 0x00c9, 0x00c9, - 0x00c9, 0x00c9, 0x00d6, 0x00d6, 0x00e4, 0x00e4, 0x00e4, 0x00e4, - 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, - 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, - 0x00e4, 0x00e4, 0x00e4, 0x00f1, 0x00f1, 0x00f9, 0x00f9, 0x00f9, - 0x00ff, 0x00ff, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x010d, 0x010d, 0x011a, - // Entry 80 - BF - 0x011a, 0x012a, 0x012a, 0x012a, 0x012a, 0x0135, 0x013d, 0x014a, - 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, - 0x014a, 0x014a, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - 0x015f, 0x015f, 0x0164, 0x0164, 0x0164, 0x0168, 0x0168, 0x0168, - 0x0168, 0x0168, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0187, - 0x0193, 0x0193, 0x0193, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, - 0x01a4, 0x01ac, 0x01ac, 0x01b7, 0x01c3, - }, - }, - { // haw - "ʻAlapiaWaleKenemakaKelemāniaHelenePelekāniaPanioloPīkīPalaniʻAilikiHeber" + - "aʻĪkāliaKepanīKōleaLākinaMāoriHōlaniPukikīLūkiaKāmoaKuekeneTongaPola" + - "polaWiekanamaPākēKuikilani KelemāniaʻŌlelo HawaiʻiʻIke ʻole ‘ia a kū" + - "pono ʻole paha ka ʻōleloPelekāne Nū HōlaniPelekāne KanakāPelekānia P" + - "ekekānePelekānia ʻAmelikaPalani KanakāKuikilaniPukikī PalakilaPākē H" + - "oʻomaʻalahi ʻiaPākē Kuʻuna", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x000c, 0x0014, - 0x001e, 0x001e, 0x001e, 0x001e, 0x0024, 0x002e, 0x002e, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003b, 0x003b, 0x0041, - 0x0041, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - // Entry 40 - 7F - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x0059, 0x0059, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0066, 0x0066, 0x0066, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x0073, 0x0073, - 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, - 0x0073, 0x0073, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, - 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, - // Entry 80 - BF - 0x007a, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0099, 0x0099, 0x0099, 0x0099, 0x00a1, 0x00a1, 0x00a1, - 0x00a1, 0x00a1, 0x00a1, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - // Entry C0 - FF - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - // Entry 100 - 13F - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00c4, 0x00c4, 0x00c4, 0x00c4, - // Entry 140 - 17F - 0x00c4, 0x00c4, 0x00c4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - // Entry 180 - 1BF - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - // Entry 1C0 - 1FF - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - // Entry 200 - 23F - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x0107, 0x0107, - 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, - 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, - // Entry 240 - 27F - 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, - 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, - 0x0107, 0x0107, 0x011c, 0x012d, 0x0141, 0x0155, 0x0155, 0x0155, - 0x0155, 0x0155, 0x0163, 0x016c, 0x016c, 0x016c, 0x017c, 0x017c, - 0x017c, 0x017c, 0x017c, 0x0196, 0x01a4, - }, - }, - { // he - heLangStr, - heLangIdx, - }, - { // hi - hiLangStr, - hiLangIdx, - }, - { // hr - hrLangStr, - hrLangIdx, - }, - { // hsb - "afaršćinaabchazišćinaafrikaanšćinaakanšćinaamharšćinaaragonšćinaarabšćin" + - "aasamšćinaawaršćinaaymaršćinaazerbajdźanšćinabaškiršćinaběłorušćinab" + - "ołharšćinabislamšćinabambarabengalšćinatibetšćinabretonšćinabosnišći" + - "nakatalanšćinačamoršćinakorsišćinakričěšćinawalizišćinadanšćinaněmči" + - "nadivehidzongkhaewegrjekšćinajendźelšćinaesperantošpanišćinaestišćin" + - "abaskišćinapersišćinafinšćinafidźišćinafäröšćinafrancošćinafrizišćin" + - "airšćinašotiska gelšćinagalicišćinaguaranigujaratimanšćinahausahebre" + - "jšćinahindišćinachorwatšćinahaitišćinamadźaršćinaarmenšćinainterling" + - "uaindonešćinaigbosichuan yiinupiakidoislandšćinaitalšćinainuitšćinaj" + - "apanšćinajavašćinageorgišćinakikuyukazachšćinagröndlandšćinakhmeršći" + - "nakannadšćinakorejšćinakašmiršćinakurdišćinakornišćinakirgišćinałaćo" + - "nšćinaluxemburgšćinagandšćinalimburšćinalingalalaošćinalitawšćinalub" + - "a-katangaletišćinamalagassišćinamaoršćinamakedonšćinamalajamšćinamon" + - "golšćinamaratišćinamalajšćinamaltašćinaburmašćinanaurušćinasewjero-n" + - "debelenepalšćinanižozemšćinanorwegšćina (nynorsk)norwegšćina (bokmål" + - ")navahookcitanšćinaoromoorijšćinapandźabšćinapólšćinapaštunšćinaport" + - "ugalšćinakečuaretoromanšćinakirundišćinarumunšćinarušćinakinjarwanda" + - "sanskritsardinšćinasindhišćinasewjerosamišćinasangosinghalšćinasłowa" + - "kšćinasłowjenšćinasamoašćinašonašćinasomališćinaalbanšćinaserbišćina" + - "siswatijužnosotšćina (Sesotho)sundanezišćinašwedšćinasuahelšćinatami" + - "lšćinatelugutadźikšćinathailandšćinatigrinšćinaturkmenšćinatswanaton" + - "gašćinaturkowšćinatsongatataršćinatahitišćinaujguršćinaukrainšćinaur" + - "dušćinauzbekšćinavietnamšćinavolapükwalonšćinawolofxhosajidišćinajor" + - "ubašćinazhuangchinšćinazulušćinaaghemšćinaanglosakšćinaarawkanšćinap" + - "areasturšćinabembabenabodobuginezišćinachigachoctawšćinacherokeesora" + - "nitaitazarmadelnjoserbšćinadualajola-fonyiembufilipinšćinagagauzišći" + - "nagotšćinašwicarska němčinagusiihawaiišćinahornjoserbšćinangombamach" + - "amekabylšćinakambamakondekapverdšćinakoyra chiinikalenjinpermska kom" + - "išćinakonkanišambalabafialangilakotaluoluhyamasaišćinamerumauriciska" + - " kreolšćinamakhuwa-meettometa’mohawkšćinamundangkriknamadelnjoněmčin" + - "akwasion’konuernyankoleprušćinakʼicheʼromborwasamburusangusicilšćina" + - "senakoyra sennitašelhitjužnosamišćinalule-samišćinainari-samišćinask" + - "olt-samišćinasaterfrizišćinatesotasawaqtamazight (srjedźny Marokko)n" + - "jeznata rěčvaivunjosogatamazightžadyn rěčny wobsahmoderna wysokoarab" + - "šćinaawstriska němčinašwicarska wysokoněmčinaawstralska jendźelšćin" + - "akanadiska jendźelšćinabritiska jendźelšćinaameriska jendźelšćinałać" + - "onskoameriska španišćinaeuropska španišćinamexiska španišćinakanadis" + - "ka francošćinašwicarska francošćinaflamšćinabrazilska portugalšćinae" + - "uropska portugalšćinamoldawšćinaserbochorwatšćinakongoska suahelšćin" + - "achinšćina (zjednorjena)chinšćina (tradicionalna)", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000b, 0x0019, 0x0019, 0x0028, 0x0033, 0x003f, 0x004c, - 0x0057, 0x0062, 0x006d, 0x0079, 0x008c, 0x009a, 0x00a9, 0x00b7, - 0x00c4, 0x00cb, 0x00d8, 0x00e4, 0x00f1, 0x00fd, 0x010b, 0x010b, - 0x0118, 0x0124, 0x0127, 0x0132, 0x0132, 0x0132, 0x013f, 0x0149, - 0x0152, 0x0158, 0x0160, 0x0163, 0x016f, 0x017e, 0x0187, 0x0194, - 0x019f, 0x01ab, 0x01b7, 0x01b7, 0x01c1, 0x01ce, 0x01db, 0x01e8, - 0x01f4, 0x01fd, 0x0210, 0x021d, 0x0224, 0x022c, 0x0236, 0x023b, - 0x0248, 0x0254, 0x0254, 0x0262, 0x026e, 0x027c, 0x0288, 0x0288, - // Entry 40 - 7F - 0x0293, 0x02a0, 0x02a0, 0x02a4, 0x02ae, 0x02b5, 0x02b8, 0x02c5, - 0x02d0, 0x02dc, 0x02e8, 0x02f3, 0x0300, 0x0300, 0x0306, 0x0306, - 0x0313, 0x0324, 0x0330, 0x033d, 0x0349, 0x0349, 0x0357, 0x0363, - 0x0363, 0x036f, 0x037b, 0x0389, 0x0399, 0x03a4, 0x03b1, 0x03b8, - 0x03c2, 0x03ce, 0x03da, 0x03e5, 0x03f5, 0x03f5, 0x0400, 0x040e, - 0x041c, 0x0429, 0x0436, 0x0442, 0x044e, 0x045a, 0x0466, 0x0475, - 0x0481, 0x0481, 0x0490, 0x04a7, 0x04be, 0x04be, 0x04c4, 0x04c4, - 0x04d2, 0x04d2, 0x04d7, 0x04e2, 0x04e2, 0x04f1, 0x04f1, 0x04fc, - // Entry 80 - BF - 0x050a, 0x0519, 0x051f, 0x052f, 0x053d, 0x0549, 0x0552, 0x055d, - 0x0565, 0x0572, 0x057f, 0x0591, 0x0596, 0x05a4, 0x05b2, 0x05c1, - 0x05cd, 0x05d9, 0x05e6, 0x05f2, 0x05fe, 0x0605, 0x061f, 0x062f, - 0x063b, 0x0648, 0x0654, 0x065a, 0x0668, 0x0677, 0x0684, 0x0692, - 0x0698, 0x06a4, 0x06b1, 0x06b7, 0x06c3, 0x06d0, 0x06dc, 0x06e9, - 0x06f4, 0x0700, 0x0700, 0x070e, 0x0716, 0x0722, 0x0727, 0x072c, - 0x0737, 0x0744, 0x074a, 0x0755, 0x0760, 0x0760, 0x0760, 0x0760, - 0x0760, 0x0760, 0x0760, 0x076c, 0x076c, 0x076c, 0x076c, 0x076c, - // Entry C0 - FF - 0x076c, 0x076c, 0x077b, 0x077b, 0x077b, 0x0789, 0x0789, 0x0789, - 0x0789, 0x0789, 0x0789, 0x0789, 0x0789, 0x078d, 0x078d, 0x0799, - 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, - 0x0799, 0x0799, 0x079e, 0x079e, 0x07a2, 0x07a2, 0x07a2, 0x07a2, - 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, - 0x07a2, 0x07a2, 0x07a6, 0x07a6, 0x07a6, 0x07b5, 0x07b5, 0x07b5, - 0x07b5, 0x07b5, 0x07b5, 0x07b5, 0x07b5, 0x07b5, 0x07ba, 0x07ba, - 0x07ba, 0x07ba, 0x07ba, 0x07ba, 0x07c8, 0x07c8, 0x07d0, 0x07d0, - // Entry 100 - 13F - 0x07d6, 0x07d6, 0x07d6, 0x07d6, 0x07d6, 0x07d6, 0x07d6, 0x07d6, - 0x07db, 0x07db, 0x07db, 0x07db, 0x07db, 0x07e0, 0x07e0, 0x07f1, - 0x07f1, 0x07f6, 0x07f6, 0x0800, 0x0800, 0x0800, 0x0804, 0x0804, - 0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0804, - 0x0804, 0x0812, 0x0812, 0x0812, 0x0812, 0x0812, 0x0812, 0x0812, - 0x0812, 0x0812, 0x0812, 0x0812, 0x0820, 0x0820, 0x0820, 0x0820, - 0x0820, 0x0820, 0x0820, 0x0820, 0x0820, 0x0820, 0x0820, 0x0820, - 0x0820, 0x082a, 0x082a, 0x082a, 0x083e, 0x083e, 0x083e, 0x0843, - // Entry 140 - 17F - 0x0843, 0x0843, 0x0843, 0x0850, 0x0850, 0x0850, 0x0850, 0x0850, - 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, - 0x0861, 0x0861, 0x0867, 0x086e, 0x086e, 0x086e, 0x086e, 0x086e, - 0x087a, 0x087a, 0x087a, 0x087f, 0x087f, 0x087f, 0x087f, 0x087f, - 0x0886, 0x0894, 0x0894, 0x0894, 0x0894, 0x0894, 0x0894, 0x08a0, - 0x08a0, 0x08a0, 0x08a0, 0x08a8, 0x08a8, 0x08bb, 0x08c2, 0x08c2, - 0x08c2, 0x08c2, 0x08c2, 0x08c2, 0x08c2, 0x08c2, 0x08ca, 0x08cf, - 0x08cf, 0x08cf, 0x08cf, 0x08cf, 0x08d4, 0x08d4, 0x08d4, 0x08d4, - // Entry 180 - 1BF - 0x08d4, 0x08d4, 0x08d4, 0x08da, 0x08da, 0x08da, 0x08da, 0x08da, - 0x08da, 0x08da, 0x08da, 0x08da, 0x08dd, 0x08dd, 0x08e2, 0x08e2, - 0x08e2, 0x08e2, 0x08e2, 0x08e2, 0x08e2, 0x08e2, 0x08e2, 0x08ee, - 0x08ee, 0x08ee, 0x08ee, 0x08ee, 0x08f2, 0x0909, 0x0909, 0x0917, - 0x091e, 0x091e, 0x091e, 0x091e, 0x091e, 0x092b, 0x092b, 0x092b, - 0x0932, 0x0932, 0x0936, 0x0936, 0x0936, 0x0936, 0x0936, 0x0936, - 0x0936, 0x0936, 0x0936, 0x093a, 0x0949, 0x0949, 0x0949, 0x0949, - 0x0949, 0x094f, 0x094f, 0x094f, 0x094f, 0x094f, 0x0955, 0x0955, - // Entry 1C0 - 1FF - 0x0959, 0x0959, 0x0959, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, - 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, - 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, 0x096b, - 0x096b, 0x0974, 0x0974, 0x0974, 0x0974, 0x0974, 0x0974, 0x0974, - 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x097c, 0x097c, - 0x097c, 0x097c, 0x0983, 0x0983, 0x0983, 0x0983, 0x0983, 0x0988, - 0x0994, 0x0994, 0x0994, 0x0994, 0x0994, 0x0998, 0x0998, 0x0998, - 0x09a3, 0x09a3, 0x09a3, 0x09ac, 0x09ac, 0x09ac, 0x09ac, 0x09ac, - // Entry 200 - 23F - 0x09ac, 0x09bd, 0x09cd, 0x09de, 0x09ef, 0x09ef, 0x09ef, 0x09ef, - 0x09ef, 0x09ef, 0x0a00, 0x0a00, 0x0a00, 0x0a00, 0x0a00, 0x0a00, - 0x0a00, 0x0a00, 0x0a00, 0x0a00, 0x0a04, 0x0a04, 0x0a04, 0x0a04, - 0x0a04, 0x0a04, 0x0a04, 0x0a04, 0x0a04, 0x0a04, 0x0a04, 0x0a04, - 0x0a04, 0x0a04, 0x0a04, 0x0a04, 0x0a04, 0x0a04, 0x0a04, 0x0a04, - 0x0a0b, 0x0a0b, 0x0a28, 0x0a28, 0x0a28, 0x0a28, 0x0a36, 0x0a39, - 0x0a39, 0x0a39, 0x0a39, 0x0a39, 0x0a39, 0x0a39, 0x0a3e, 0x0a3e, - 0x0a3e, 0x0a3e, 0x0a3e, 0x0a3e, 0x0a3e, 0x0a3e, 0x0a3e, 0x0a42, - // Entry 240 - 27F - 0x0a42, 0x0a42, 0x0a42, 0x0a42, 0x0a42, 0x0a42, 0x0a42, 0x0a42, - 0x0a42, 0x0a42, 0x0a4b, 0x0a4b, 0x0a60, 0x0a60, 0x0a79, 0x0a79, - 0x0a8c, 0x0aa6, 0x0ac0, 0x0ad9, 0x0af1, 0x0b09, 0x0b29, 0x0b3f, - 0x0b54, 0x0b54, 0x0b6b, 0x0b83, 0x0b83, 0x0b8e, 0x0ba7, 0x0bbf, - 0x0bcc, 0x0bdf, 0x0bf5, 0x0c0e, 0x0c29, - }, - }, - { // hu - huLangStr, - huLangIdx, - }, - { // hy - hyLangStr, - hyLangIdx, - }, - { // id - idLangStr, - idLangIdx, - }, - { // ig - "AkanAmariikịArabiikịBelaruusuBọlụgarịaBengaliCheekịJamaanGiriikịOyiboPan" + - "yaPeshanFụrenchAwụsaHindiMagịyaIndonisiaIgboItaloJapaneseJavaKeme, E" + - "titiKoriaMaleyiMịanmaNepaliDọọchPunjabiPoliishiPotokiRumeniaRọshanRụ" + - "wandaSomaliSụwidiishiTamụlụTaịTọkiishiUkureenịUruduViyetịnaamụYoruba" + - "MandarịịnịZulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000e, 0x000e, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0021, 0x0030, - 0x0030, 0x0030, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, - 0x0037, 0x0037, 0x0037, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, - 0x0045, 0x0045, 0x0045, 0x0045, 0x004e, 0x0053, 0x0053, 0x0058, - 0x0058, 0x0058, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x0067, - 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x006e, - 0x006e, 0x0073, 0x0073, 0x0073, 0x0073, 0x007b, 0x007b, 0x007b, - // Entry 40 - 7F - 0x007b, 0x0084, 0x0084, 0x0088, 0x0088, 0x0088, 0x0088, 0x0088, - 0x008d, 0x008d, 0x0095, 0x0099, 0x0099, 0x0099, 0x0099, 0x0099, - 0x0099, 0x0099, 0x00a4, 0x00a4, 0x00a9, 0x00a9, 0x00a9, 0x00a9, - 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, - 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, - 0x00a9, 0x00a9, 0x00a9, 0x00af, 0x00af, 0x00b7, 0x00b7, 0x00b7, - 0x00bd, 0x00bd, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00cd, 0x00cd, 0x00d5, - // Entry 80 - BF - 0x00d5, 0x00db, 0x00db, 0x00db, 0x00db, 0x00e2, 0x00ea, 0x00f3, - 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, - 0x00f3, 0x00f3, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, - 0x0105, 0x0105, 0x010f, 0x010f, 0x010f, 0x0114, 0x0114, 0x0114, - 0x0114, 0x0114, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x0128, - 0x012d, 0x012d, 0x012d, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, - 0x013c, 0x0142, 0x0142, 0x0152, 0x0156, - }, - }, - { // ii - "ꄓꇩꉙꑱꇩꉙꑭꀠꑸꉙꃔꇩꉙꆈꌠꉙꑴꄊꆺꉙꏝꀪꉙꁍꄨꑸꉙꊉꇩꉙꍏꇩꉙꅉꀋꌠꅇꂷꀠꑟꁍꄨꑸꉙꈝꐯꍏꇩꉙꀎꋏꍏꇩꉙ", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0012, 0x0012, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0027, - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, - // Entry 40 - 7F - 0x0027, 0x0027, 0x0027, 0x0027, 0x0030, 0x0030, 0x0030, 0x0030, - 0x003c, 0x003c, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - // Entry 80 - BF - 0x0045, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - // Entry C0 - FF - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - // Entry 100 - 13F - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - // Entry 140 - 17F - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - // Entry 180 - 1BF - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - // Entry 1C0 - 1FF - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - // Entry 200 - 23F - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - // Entry 240 - 27F - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0084, 0x0084, - 0x0084, 0x0084, 0x0084, 0x0093, 0x00a2, - }, - }, - { // is - isLangStr, - isLangIdx, - }, - { // it - itLangStr, - itLangIdx, - }, - { // ja - jaLangStr, - jaLangIdx, - }, - { // jgo - "AlâbɛNjámanŊgɛlɛ̂kAŋgɛlúshiFɛlánciShinwâNdaꞌacú-pʉɔ yi pɛ́ ká kɛ́ jí", - []uint16{ // 559 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x000e, 0x000e, 0x000e, 0x000e, 0x0019, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - // Entry 40 - 7F - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - // Entry 80 - BF - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry C0 - FF - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry 100 - 13F - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - // Entry 140 - 17F - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - // Entry 180 - 1BF - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - // Entry 1C0 - 1FF - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - // Entry 200 - 23F - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x005c, - }, - }, - { // jmc - "KiakanyiKiamharyiKyiarabuKyibelarusiKyibulgaryiaKyibanglaKyicheckiKyijer" + - "umaniKyigirikiKyingerezaKyihispaniaKyiajemiKyifaransaKyihausaKyihind" + - "iKyihungariKyiindonesiaKyiigboKyiitalianoKyijapaniKyijavaKyikambodia" + - "KyikoreaKyimalesiaKyiburmaKyinepaliKyiholanziKyipunjabiKyipolandiKyi" + - "renoKyiromaniaKyirusiKyinyarwandaKyisomalyiKyiswidiKyitamilKyitailan" + - "diKyiturukyiKyiukraniaKyiurduKyivietinamuKyiyorubaKyichinaKyizuluKim" + - "achame", - []uint16{ // 340 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0011, 0x0011, - 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0030, - 0x0030, 0x0030, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x004d, 0x004d, 0x004d, 0x004d, 0x0056, 0x0060, 0x0060, 0x006b, - 0x006b, 0x006b, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x0085, - 0x0085, 0x008d, 0x008d, 0x008d, 0x008d, 0x0097, 0x0097, 0x0097, - // Entry 40 - 7F - 0x0097, 0x00a3, 0x00a3, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00b5, 0x00b5, 0x00be, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00d0, 0x00d0, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00e2, 0x00e2, 0x00ea, 0x00ea, 0x00ea, - 0x00f3, 0x00f3, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, - 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x0107, 0x0107, 0x0111, - // Entry 80 - BF - 0x0111, 0x0118, 0x0118, 0x0118, 0x0118, 0x0122, 0x0129, 0x0135, - 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, - 0x0135, 0x0135, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - 0x0147, 0x0147, 0x014f, 0x014f, 0x014f, 0x015a, 0x015a, 0x015a, - 0x015a, 0x015a, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x016e, - 0x0175, 0x0175, 0x0175, 0x0181, 0x0181, 0x0181, 0x0181, 0x0181, - 0x0181, 0x018a, 0x018a, 0x0192, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry C0 - FF - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 100 - 13F - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 140 - 17F - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x01a2, - }, - }, - { // ka - kaLangStr, - kaLangIdx, - }, - { // kab - "TakanitTamahrictTaɛrabtTabilarusitTabulgaritTabengalitTačikitTalmantTagr" + - "ikitTaglizitTaspenyulitTafarisitTafransistTahwasitTahenditTahungarit" + - "TandunisitTigbutTaṭalyanitTajapunitTajavanitTakemritTakuritTamalawit" + - "TaburmisitTanipalitTadučitTapunjabitTapulunitTapurtugalitTarumanitTa" + - "rusitTaruwanditTaṣumalitTaswiditTaṭamulitTaṭaylunditTaṭurkitTukranit" + - "TurdutTabyiṭnamitTayurubitTacinwat, TamundarintTazulutTaqbaylit", - []uint16{ // 345 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0010, 0x0010, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0023, 0x002d, - 0x002d, 0x002d, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, - 0x0037, 0x0037, 0x0037, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, - 0x0046, 0x0046, 0x0046, 0x0046, 0x004e, 0x0056, 0x0056, 0x0061, - 0x0061, 0x0061, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x0074, - 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x007c, - 0x007c, 0x0084, 0x0084, 0x0084, 0x0084, 0x008e, 0x008e, 0x008e, - // Entry 40 - 7F - 0x008e, 0x0098, 0x0098, 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, - 0x00aa, 0x00aa, 0x00b3, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, - 0x00bc, 0x00bc, 0x00c4, 0x00c4, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00d4, 0x00d4, 0x00de, 0x00de, 0x00de, - 0x00e7, 0x00e7, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, - 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00f9, 0x00f9, 0x0102, - // Entry 80 - BF - 0x0102, 0x010e, 0x010e, 0x010e, 0x010e, 0x0117, 0x011e, 0x0128, - 0x0128, 0x0128, 0x0128, 0x0128, 0x0128, 0x0128, 0x0128, 0x0128, - 0x0128, 0x0128, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, - 0x013b, 0x013b, 0x0146, 0x0146, 0x0146, 0x0153, 0x0153, 0x0153, - 0x0153, 0x0153, 0x015d, 0x015d, 0x015d, 0x015d, 0x015d, 0x0165, - 0x016b, 0x016b, 0x016b, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, - 0x0178, 0x0181, 0x0181, 0x0196, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - // Entry C0 - FF - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - // Entry 100 - 13F - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - // Entry 140 - 17F - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x01a6, - }, - }, - { // kam - "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + - "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + - "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + - "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + - "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + - "rubaKichinaKizuluKikamba", - []uint16{ // 348 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, - 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, - 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, - 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, - // Entry 40 - 7F - 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, - 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, - 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, - // Entry 80 - BF - 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, - 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, - 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, - 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, - 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, - 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry C0 - FF - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 100 - 13F - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 140 - 17F - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0170, - }, - }, - { // kde - "ChakanChamhaliChalabuChibelalusiChibulgaliaChibanglaChichechiChidyeluman" + - "iChigilichiChiingelezaChihispaniaChiajemiChifalansaChihausaChihindiC" + - "hihungaliChiiongonesiaChiigboChiitalianoChidyapaniChidyavaChikambodi" + - "aChikoleaChimalesiaChibulmaChinepaliChiholanziChipunjabiChipolandiCh" + - "ilenoChilomaniaChilusiChinyalwandaChisomaliChiswidiChitamilChitailan" + - "diChituluchiChiuklaniaChiulduChivietinamuChiyolubaChichinaChizuluChi" + - "makonde", - []uint16{ // 353 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0020, 0x002b, - 0x002b, 0x002b, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, - 0x0049, 0x0049, 0x0049, 0x0049, 0x0053, 0x005e, 0x005e, 0x0069, - 0x0069, 0x0069, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x0083, - 0x0083, 0x008b, 0x008b, 0x008b, 0x008b, 0x0095, 0x0095, 0x0095, - // Entry 40 - 7F - 0x0095, 0x00a2, 0x00a2, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, - 0x00b4, 0x00b4, 0x00be, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00d1, 0x00d1, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00e3, 0x00e3, 0x00eb, 0x00eb, 0x00eb, - 0x00f4, 0x00f4, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, - 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x0108, 0x0108, 0x0112, - // Entry 80 - BF - 0x0112, 0x0119, 0x0119, 0x0119, 0x0119, 0x0123, 0x012a, 0x0136, - 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, - 0x0136, 0x0136, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - 0x0147, 0x0147, 0x014f, 0x014f, 0x014f, 0x015a, 0x015a, 0x015a, - 0x015a, 0x015a, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x016e, - 0x0175, 0x0175, 0x0175, 0x0181, 0x0181, 0x0181, 0x0181, 0x0181, - 0x0181, 0x018a, 0x018a, 0x0192, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry C0 - FF - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 100 - 13F - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 140 - 17F - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x01a3, - }, - }, - { // kea - "abkáziuafrikanerakanamárikuárabiasamesaimaraazerbaijanubaxkirbielorusubú" + - "lgarubambarabengalitibetanubretãubosniukatalãutxetxenukórsikutxekutx" + - "uvaxigalesdinamarkesalimãudzonkaevegreguinglessperantuspanholstonian" + - "ubaskupersafinlandesfijianufaroesfransesfríziu osidentalirlandesgale" + - "guguaranigujaratimanksauzaebraikuindikroataaitianuúngaruarméniuindon" + - "éziuibonuosuislandesitalianuinuktitutjaponesjavanesjorjianukikuiuka" + - "zakgroenlandeskmerkanareskorianukaxmirakurdukórnikukirgizlatinluxemb" + - "urgeslugandalausianulituanesletãumalgaximaorimasedóniumalaialammarat" + - "imaláiumaltesbirmanesnepalesolandesnorueges nynorsknorueges bokmålor" + - "omoodíapandjabipulakupaxtopurtugeskexuaromanxirumenurusukiniaruandas" + - "ánskritusindisingalesslovakuslovéniusomalialbanessérviusundanessuek" + - "usuaílitamiltelugutadjikitailandestigriniaturkmenutonganesturkutatar" + - "uigurukranianuurduuzbekivietnamitauolofkozaiorubaxineszuluaghemarauk" + - "anuasubembabenabodoxigaxerokikurdu sentraltaitazarmasórbiu baxuduala" + - "jola-fonyiembufilipinugagauzalimãu suísugusiiavaianusórbiu altuñomba" + - "matxamekabilakambakabuverdianukoira txiinikalenjinkomi-permiakkonkan" + - "ibafiakuaziokitxekoiraboro seniinari samitamazait di Atlas Sentrallí" + - "ngua diskonxedusen kontiudu linguístikuárabi mudernualimãu austriaku" + - "altu alimãu suisuingles australianuingles kanadianuingles britanikui" + - "ngles merkanuspanhol latinu-merkanuspanhol europeuspanhol mexikanufr" + - "anses kanadianufranses suisuflamengupurtuges brazilerupurtuges europ" + - "eurumenu moldávikusuaíli kongolesxines simplifikaduxines tradisional", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0008, 0x0008, 0x0011, 0x0015, 0x001d, 0x001d, - 0x0023, 0x0029, 0x0029, 0x002f, 0x003a, 0x0040, 0x0049, 0x0051, - 0x0051, 0x0058, 0x005f, 0x0067, 0x006e, 0x0074, 0x007c, 0x0084, - 0x0084, 0x008c, 0x008c, 0x0091, 0x0091, 0x0098, 0x009d, 0x00a7, - 0x00ae, 0x00ae, 0x00b4, 0x00b7, 0x00bc, 0x00c2, 0x00ca, 0x00d1, - 0x00d9, 0x00de, 0x00e3, 0x00e3, 0x00ec, 0x00f3, 0x00f9, 0x0100, - 0x0111, 0x0119, 0x0119, 0x011f, 0x0126, 0x012e, 0x0133, 0x0137, - 0x013e, 0x0142, 0x0142, 0x0148, 0x014f, 0x0156, 0x015e, 0x015e, - // Entry 40 - 7F - 0x015e, 0x0168, 0x0168, 0x016b, 0x0170, 0x0170, 0x0170, 0x0178, - 0x0180, 0x0189, 0x0190, 0x0197, 0x019f, 0x019f, 0x01a5, 0x01a5, - 0x01aa, 0x01b5, 0x01b9, 0x01c0, 0x01c7, 0x01c7, 0x01ce, 0x01d3, - 0x01d3, 0x01db, 0x01e1, 0x01e6, 0x01f1, 0x01f8, 0x01f8, 0x01f8, - 0x0200, 0x0208, 0x0208, 0x020e, 0x0215, 0x0215, 0x021a, 0x0224, - 0x022d, 0x022d, 0x0233, 0x023a, 0x0240, 0x0248, 0x0248, 0x0248, - 0x024f, 0x024f, 0x0256, 0x0266, 0x0276, 0x0276, 0x0276, 0x0276, - 0x0276, 0x0276, 0x027b, 0x0280, 0x0280, 0x0288, 0x0288, 0x028e, - // Entry 80 - BF - 0x0293, 0x029b, 0x02a0, 0x02a7, 0x02a7, 0x02ad, 0x02b1, 0x02bc, - 0x02c6, 0x02c6, 0x02cb, 0x02cb, 0x02cb, 0x02d3, 0x02da, 0x02e3, - 0x02e3, 0x02e3, 0x02e9, 0x02f0, 0x02f7, 0x02f7, 0x02f7, 0x02ff, - 0x0304, 0x030b, 0x0310, 0x0316, 0x031d, 0x0326, 0x032e, 0x0336, - 0x0336, 0x033e, 0x0343, 0x0343, 0x0348, 0x0348, 0x034d, 0x0356, - 0x035a, 0x0360, 0x0360, 0x036a, 0x036a, 0x036a, 0x036f, 0x0373, - 0x0373, 0x0379, 0x0379, 0x037e, 0x0382, 0x0382, 0x0382, 0x0382, - 0x0382, 0x0382, 0x0382, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, - // Entry C0 - FF - 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x038f, 0x038f, 0x038f, - 0x038f, 0x038f, 0x038f, 0x038f, 0x038f, 0x0392, 0x0392, 0x0392, - 0x0392, 0x0392, 0x0392, 0x0392, 0x0392, 0x0392, 0x0392, 0x0392, - 0x0392, 0x0392, 0x0397, 0x0397, 0x039b, 0x039b, 0x039b, 0x039b, - 0x039b, 0x039b, 0x039b, 0x039b, 0x039b, 0x039b, 0x039b, 0x039b, - 0x039b, 0x039b, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, - 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x03a3, 0x03a3, - 0x03a3, 0x03a3, 0x03a3, 0x03a3, 0x03a3, 0x03a3, 0x03a9, 0x03a9, - // Entry 100 - 13F - 0x03b6, 0x03b6, 0x03b6, 0x03b6, 0x03b6, 0x03b6, 0x03b6, 0x03b6, - 0x03bb, 0x03bb, 0x03bb, 0x03bb, 0x03bb, 0x03c0, 0x03c0, 0x03cc, - 0x03cc, 0x03d1, 0x03d1, 0x03db, 0x03db, 0x03db, 0x03df, 0x03df, - 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, - 0x03df, 0x03e7, 0x03e7, 0x03e7, 0x03e7, 0x03e7, 0x03e7, 0x03e7, - 0x03e7, 0x03e7, 0x03e7, 0x03e7, 0x03ed, 0x03ed, 0x03ed, 0x03ed, - 0x03ed, 0x03ed, 0x03ed, 0x03ed, 0x03ed, 0x03ed, 0x03ed, 0x03ed, - 0x03ed, 0x03ed, 0x03ed, 0x03ed, 0x03fb, 0x03fb, 0x03fb, 0x0400, - // Entry 140 - 17F - 0x0400, 0x0400, 0x0400, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, - 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, 0x0413, - 0x0413, 0x0413, 0x0419, 0x0420, 0x0420, 0x0420, 0x0420, 0x0420, - 0x0426, 0x0426, 0x0426, 0x042b, 0x042b, 0x042b, 0x042b, 0x042b, - 0x042b, 0x0437, 0x0437, 0x0437, 0x0437, 0x0437, 0x0437, 0x0443, - 0x0443, 0x0443, 0x0443, 0x044b, 0x044b, 0x0457, 0x045e, 0x045e, - 0x045e, 0x045e, 0x045e, 0x045e, 0x045e, 0x045e, 0x045e, 0x0463, - 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, - // Entry 180 - 1BF - 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, - 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, - 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, - 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, - 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, - 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, - 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, 0x0463, - 0x0463, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, - // Entry 1C0 - 1FF - 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, - 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, - 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, 0x0469, - 0x0469, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, - 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, - 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, - 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, 0x046e, - 0x047c, 0x047c, 0x047c, 0x047c, 0x047c, 0x047c, 0x047c, 0x047c, - // Entry 200 - 23F - 0x047c, 0x047c, 0x047c, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x049f, 0x049f, 0x049f, 0x049f, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - // Entry 240 - 27F - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04ca, 0x04ca, 0x04d8, 0x04d8, - 0x04e9, 0x04fb, 0x050d, 0x051d, 0x052d, 0x053b, 0x0551, 0x0560, - 0x0570, 0x0570, 0x0581, 0x058e, 0x058e, 0x0596, 0x05a8, 0x05b8, - 0x05c9, 0x05c9, 0x05d9, 0x05eb, 0x05fc, - }, - }, - { // khq - "Akan senniAmhaarik senniLaaraw senniBelaruus senniBulagaari senniBengali" + - " senniCek senniAlmaŋ senniGrek senniInglisi senniEspaaɲe senniFarsi " + - "senniFransee senniHawsance senniInduu senniHungaari senniIndoneesi s" + - "enniIboo senniItaali senniJaponee senniJavanee senniKmeer senni, Gam" + - "e hereKoree senniMaleezi senniBurme senniNeepal senniHolandee senniP" + - "unjaabi senniiPolonee senniPortugee senniRumaani senniRuusi senniRwa" + - "nda senniSomaali senniSuweede senniTamil senniTaailandu senniTurku s" + - "enniUkreen senniUrdu senniVietnaam senniYorbance senniSinuwa senni, " + - "MandareŋJulu senniKoyra ciini", - []uint16{ // 360 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0018, 0x0018, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0032, 0x0041, - 0x0041, 0x0041, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, - 0x004e, 0x004e, 0x004e, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0063, 0x0063, 0x0063, 0x0063, 0x006d, 0x007a, 0x007a, 0x0088, - 0x0088, 0x0088, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x00a0, - 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00ae, - 0x00ae, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00c7, 0x00c7, 0x00c7, - // Entry 40 - 7F - 0x00c7, 0x00d6, 0x00d6, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00ec, 0x00ec, 0x00f9, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x011c, 0x011c, 0x0127, 0x0127, 0x0127, 0x0127, - 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, - 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, - 0x0127, 0x0127, 0x0127, 0x0134, 0x0134, 0x013f, 0x013f, 0x013f, - 0x014b, 0x014b, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, - 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0168, 0x0168, 0x0175, - // Entry 80 - BF - 0x0175, 0x0183, 0x0183, 0x0183, 0x0183, 0x0190, 0x019b, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, - 0x01c1, 0x01c1, 0x01cc, 0x01cc, 0x01cc, 0x01db, 0x01db, 0x01db, - 0x01db, 0x01db, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01f2, - 0x01fc, 0x01fc, 0x01fc, 0x020a, 0x020a, 0x020a, 0x020a, 0x020a, - 0x020a, 0x0218, 0x0218, 0x022f, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - // Entry C0 - FF - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - // Entry 100 - 13F - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - // Entry 140 - 17F - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0244, - }, - }, - { // ki - "KiakanKiamhariKĩarabuKibelarusiKibulgariaKibanglaKicheckiKĩnjeremaniKigi" + - "rikiGĩthungũKihispaniaKiajemiKĩbaranjaKihausaKĩhĩndĩKihungariKiindon" + - "esiaKiigboKĩtalianoKĩnjabaniKijavaGikuyuKikambodiaKikoreaKimalesiaKi" + - "burmaKinepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKĩraciaKinyar" + - "wandaKĩcumarĩKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietin" + - "amuKiyorubaKĩcainaKizulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0020, 0x002a, - 0x002a, 0x002a, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x0046, 0x0046, 0x0046, 0x0046, 0x004e, 0x0058, 0x0058, 0x0062, - 0x0062, 0x0062, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0073, - 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x007a, - 0x007a, 0x0084, 0x0084, 0x0084, 0x0084, 0x008d, 0x008d, 0x008d, - // Entry 40 - 7F - 0x008d, 0x0098, 0x0098, 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, - 0x00a8, 0x00a8, 0x00b2, 0x00b8, 0x00b8, 0x00b8, 0x00be, 0x00be, - 0x00be, 0x00be, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, 0x00cf, - 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, - 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, - 0x00cf, 0x00cf, 0x00cf, 0x00d8, 0x00d8, 0x00df, 0x00df, 0x00df, - 0x00e7, 0x00e7, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, - 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f9, 0x00f9, 0x0102, - // Entry 80 - BF - 0x0102, 0x0108, 0x0108, 0x0108, 0x0108, 0x0111, 0x0119, 0x0124, - 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, - 0x0124, 0x0124, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x0135, 0x0135, 0x013c, 0x013c, 0x013c, 0x0146, 0x0146, 0x0146, - 0x0146, 0x0146, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x0157, - 0x015d, 0x015d, 0x015d, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, - 0x0168, 0x0170, 0x0170, 0x0178, 0x017e, - }, - }, - { // kk - kkLangStr, - kkLangIdx, - }, - { // kkj - "yamannumbu buykakɔ", - []uint16{ // 363 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - // Entry 40 - 7F - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - // Entry 80 - BF - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - // Entry C0 - FF - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - // Entry 100 - 13F - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - // Entry 140 - 17F - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x0013, - }, - }, - { // kl - "kalaallisut", - []uint16{ // 82 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x000b, - }, - }, - { // kln - "kutitab Akakutitab Amariekkutitab Arabukkutitab Belarusakutitab Bulgaria" + - "kutitab Bengalikutitab Chekkutitab Chermanikutitab Greecekutitab Uin" + - "geresakutitab Espianikkutitab Persiakutitab Kifaransakutitab Hausaku" + - "titab Maindiikkutitab Hangarikutitab Indonesiakutitab Igbokutitab Ta" + - "lianekkutitap Japankutitap Javanesekutitab Kher nebo Kwenkutitab Kor" + - "eakutitab Malaykutitab Burmakutitab Nepalikutitab Boakutitab Punjabk" + - "utitap Polandkutitab Portugalkutitab Romaniekkutitab Russiakutitab K" + - "inyarwandakutitab Somaliekkutitab Swedenkutitab Tamilkutitab Thailan" + - "dkutitab Turkeykutitab Ukrainekutitab Urdukutitab Vietnamkutitab Yor" + - "ubakutitab Chinakutitab ZuluKalenjin", - []uint16{ // 364 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000b, 0x001a, 0x001a, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0038, 0x0048, - 0x0048, 0x0048, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0073, 0x0073, 0x0073, 0x0073, 0x0081, 0x0092, 0x0092, 0x00a2, - 0x00a2, 0x00a2, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00c1, - 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00ce, - 0x00ce, 0x00de, 0x00de, 0x00de, 0x00de, 0x00ed, 0x00ed, 0x00ed, - // Entry 40 - 7F - 0x00ed, 0x00fe, 0x00fe, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, - 0x011a, 0x011a, 0x0127, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, - 0x0137, 0x0137, 0x014d, 0x014d, 0x015a, 0x015a, 0x015a, 0x015a, - 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, - 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, - 0x015a, 0x015a, 0x015a, 0x0167, 0x0167, 0x0174, 0x0174, 0x0174, - 0x0182, 0x0182, 0x018d, 0x018d, 0x018d, 0x018d, 0x018d, 0x018d, - 0x018d, 0x018d, 0x018d, 0x018d, 0x018d, 0x019b, 0x019b, 0x01a9, - // Entry 80 - BF - 0x01a9, 0x01b9, 0x01b9, 0x01b9, 0x01b9, 0x01c9, 0x01d7, 0x01ea, - 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, - 0x01ea, 0x01ea, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, - 0x0208, 0x0208, 0x0215, 0x0215, 0x0215, 0x0225, 0x0225, 0x0225, - 0x0225, 0x0225, 0x0233, 0x0233, 0x0233, 0x0233, 0x0233, 0x0242, - 0x024e, 0x024e, 0x024e, 0x025d, 0x025d, 0x025d, 0x025d, 0x025d, - 0x025d, 0x026b, 0x026b, 0x0278, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - // Entry C0 - FF - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - // Entry 100 - 13F - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - // Entry 140 - 17F - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, - 0x0284, 0x0284, 0x0284, 0x028c, - }, - }, - { // km - kmLangStr, - kmLangIdx, - }, - { // kn - knLangStr, - knLangIdx, - }, - { // ko - koLangStr, - koLangIdx, - }, - {}, // ko-KP - { // kok - "अफारअबखेज़ियनअफ्रिकान्सत्विअमहारिक्अरेबिक्असामीऐमराअज़रबैजानीबष्किरबैलोर" + - "ुसियन्बल्गेरियनबिसलमाबंगालीतिबेतियनब्रेटनकटलानकोर्शियनज़ेक्वेळ्ष्ड" + - "ानिषजर्मनभूटानीग्रीक्आंग्लइस्परान्टोस्पानिषइस्टोनियन्बास्कपर्षियन्" + - "फिन्निष्फिजीफेरोस्फ्रेन्चफ्रिशियन्ऐरिषस्काटस् गेलिक्गेलीशियनगौरानी" + - "गुजरातीहौसाहेब्रुहिन्दीक्रोयेषियन्हंगेरियन्आर्मीनियन्इन्टरलिंग्वाइ" + - "न्डोनेषियनइन्टरलिंग्इनूपेयाक्आईस्लान्डिकइटालियनइन्युकट्टजापनीस्जाव" + - "नीस्जार्जियन्कज़ख्ग्रीनलान्डिककंबोडियनकन्नडाकोरियन्कश्मीरीकुर्दिषक" + - "िर्गिज़लाटिनलिंगालालाओतियन्लिथुआनियन्लाट्वियन् (लेट्टिष्)मलागसीमाओ" + - "रीमसीडोनियन्मळियाळममंगोलियन्मराठीमलयमालतीस्बर्मीज़्नौरोनेपाळीडच्नो" + - "र्वेजियनओसिटान्ओरोमो (अफान)ओरियापंजाबीपोलिषपाष्टो (पुष्टो)पोर्चुगी" + - "ज़्क्वेच्वारहटो-रोमान्स्किरुन्दीरोमानियन्रष्यन्किन्यार्वान्डासंस्क" + - "ृतसिंधीसांग्रोसिन्हलीस्स्लोवाकस्लोवेनियन्समोनशोनासोमाळीआल्बेनियन्स" + - "ेर्बियन्सिस्वातीसेसोथोसुंदनीसस्वीदीषस्वाहिलीतमिळतेलुगूतजिकथाईतिग्र" + - "िन्यातुर्कमनसेत्स्वानातोंगातुर्किषत्सोगातटारउधूरयुक्रेनियन्उर्दूउज" + - "़बेकवियत्नामीज़ओलापुकउलोफ़झ़ौसाइद्दिष्यूरुबाझ्हुन्गचीनीस्जुलूतगालो" + - "गकोंकणीमोल्डावियन्सेर्बो-क्रोयेषियन्", - []uint16{ // 610 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x0027, 0x0027, 0x0045, 0x0051, 0x0069, 0x0069, - 0x007e, 0x008d, 0x008d, 0x0099, 0x00b7, 0x00c9, 0x00ea, 0x0105, - 0x0117, 0x0117, 0x0129, 0x0141, 0x0153, 0x0153, 0x0162, 0x0162, - 0x0162, 0x017a, 0x017a, 0x0189, 0x0189, 0x0189, 0x019b, 0x01aa, - 0x01b9, 0x01b9, 0x01cb, 0x01cb, 0x01dd, 0x01ec, 0x020a, 0x021f, - 0x023d, 0x024c, 0x0264, 0x0264, 0x027c, 0x0288, 0x029a, 0x02af, - 0x02ca, 0x02d6, 0x02fe, 0x0316, 0x0328, 0x033d, 0x033d, 0x0349, - 0x035b, 0x036d, 0x036d, 0x038e, 0x038e, 0x03a9, 0x03c7, 0x03c7, - // Entry 40 - 7F - 0x03eb, 0x040c, 0x042a, 0x042a, 0x042a, 0x0445, 0x0445, 0x0466, - 0x047b, 0x0496, 0x04ab, 0x04c0, 0x04db, 0x04db, 0x04db, 0x04db, - 0x04ea, 0x050e, 0x0526, 0x0538, 0x054d, 0x054d, 0x0562, 0x0577, - 0x0577, 0x0577, 0x058f, 0x059e, 0x059e, 0x059e, 0x059e, 0x05b3, - 0x05cb, 0x05e9, 0x05e9, 0x061f, 0x0631, 0x0631, 0x0640, 0x065e, - 0x0673, 0x068e, 0x069d, 0x06a6, 0x06bb, 0x06d3, 0x06df, 0x06df, - 0x06f1, 0x06f1, 0x06fa, 0x06fa, 0x0718, 0x0718, 0x0718, 0x0718, - 0x072d, 0x072d, 0x074b, 0x075a, 0x075a, 0x076c, 0x076c, 0x077b, - // Entry 80 - BF - 0x07a2, 0x07c3, 0x07db, 0x0800, 0x0818, 0x0833, 0x0845, 0x086f, - 0x0884, 0x0884, 0x0893, 0x0893, 0x08a8, 0x08c3, 0x08d8, 0x08f9, - 0x0905, 0x0911, 0x0923, 0x0941, 0x095c, 0x0974, 0x0986, 0x099b, - 0x09b0, 0x09c8, 0x09d4, 0x09e6, 0x09f2, 0x09fb, 0x0a19, 0x0a2e, - 0x0a4c, 0x0a5b, 0x0a70, 0x0a82, 0x0a8e, 0x0a8e, 0x0a9a, 0x0abb, - 0x0aca, 0x0adc, 0x0adc, 0x0afd, 0x0b0f, 0x0b0f, 0x0b1e, 0x0b2d, - 0x0b42, 0x0b54, 0x0b69, 0x0b7b, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - // Entry C0 - FF - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - // Entry 100 - 13F - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, - 0x0b87, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, - 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, - 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, - 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, - // Entry 140 - 17F - 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, - 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, - 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, - 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, - 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, - 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - // Entry 180 - 1BF - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - // Entry 1C0 - 1FF - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - // Entry 200 - 23F - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - // Entry 240 - 27F - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, - 0x0bcc, 0x0c00, - }, - }, - { // ks - "اَفاراَبخازِیاناَویستَناَفریٖکانٛزاَکاناَمہاریاَراگونیعربیاسٲمۍاَوارِکای" + - "مارااَزَربیجانیبَشکیٖربیلَروٗشیَنبینابِسلامابَمبارابَنٛگٲلۍتِبتیبری" + - "ٹَنبوسنِیَنکَتلانچیچَنکَموروکارسِکَنکریچیٚکچٔرچ سلاوِکچُواشویٚلشڈین" + - "ِشجٔرمَندِویہیزونٛگکھاایٖویوٗنٲنیاَنٛگیٖزۍایٚسپَرینٹوسپینِشایٚسٹونی" + - "َنباسکفارسیفُلاہفِنِشفِجیَنفَروسفریٚنچمغربی فرِشیَناَیرِشسکوٹِش گیے" + - "لِکگیلِشِیَنگُوارَنیگُجرٲتیمینٛکسہاوساعبرٲنۍہِندیہِری موتوٗکروشِیَن" + - "ہیتِیاںہَنٛگیریَناَرمینیَنہیٚریٖرواِنٹَرلِنٛگوااِنڈونیشیااِنٹَر لِن" + - "ٛنگویےاِگبوسِچوان یٖیاِنُپِیاکاِڈوآیِسلینڈِکاِٹیلیَناِنُکتِتوٗجاپٲن" + - "ۍجَوَنیٖزجارجِیَنکونٛگوکِکُیوٗکُوانیاماکازَخکَلالِسُتخَمیرکَنَڑکوری" + - "َنکَنوٗریکٲشُرکُردِشکومیکورنِشکِرگِزلاتیٖنیلُکھزیمبورگِشگاندالِمبٔر" + - "گِشلِنگالالاولِتھوانِیَنلوُبا کَتَنٛگالَتوِیَنمَلاگَسیمارشَلیٖزماور" + - "یمیکَڈونیَنمٔلیالَممَنٛگولیمَرٲٹھۍمَلَےمَلتیٖسبٔمیٖزناورُشُمال ڈَبی" + - "لنیٚپٲلۍڈونٛگاڈَچناروییَن نَے نورسکناروییَن بوکمالجنوب ڈیٚبیلنَواجو" + - "نِیَنجااوکسیٖٹَناوجِبوااوٚرومواوٚرِیااوٚسیٚٹِکپَنجٲبۍپالیپالِشپَشتو" + - "ٗپُرتَگیٖزکُویشُوارومانشرُندیرومٲنیروٗسیکِنیاوِنداسَنسکرٕتسراڈیٖنیس" + - "ِندیشُمٲلی سَمیسَنگوسِنہالاسلووَکسلووینیَنسَمواَنشوناسومٲلیالبانِیَ" + - "نسٔربِیَنسواتیجنوبی ستھوسَنڈَنیٖزسویٖڈِشسواہِلیتَمِلتیلگوٗتاجِکتھاے" + - "ٹِگرِنیاتُرکمینسواناٹونٛگاتُرکِشژونٛگاتَتارتاہیشِیَنیوٗکرینیٲییاُرد" + - "وٗاُزبیکوینداوِیَتنَمیٖزوولَپُکوَلوٗنوولوفکھوسایِدِشیورُبازُہانٛگچی" + - "ٖنیزُلوٗاَچَےنیٖزاَکولیاَدَنٛگمیےاَدَیٖگیےاَفرِہِلیاینوٗاَکادِیَناَ" + - "لویتیجنوٗبی اَلتاییپرون اَنٛگریٖزیاَنٛگِکااَرَمیکایرو کونِیَناَراپا" + - "ہواَراوَکایسٹوٗریَناَوَدیبَلوٗچیبالِنیٖزباسابیجابیٚمبابوجپوٗریبِکول" + - "بِنیسِکسِکابرٛجبُرِیَتبَگنیٖزبٕلِنکاڈوکارِباتسَمسیباونوچیٖبچاچھَگتا" + - "ےچُکیٖزماریچِنوٗک جارگَنچوکتَوشیپویانچیٚروکیشییونکاپٹِککرٕمیٖن تُرک" + - "یکَشوٗبِیَنڈکوٹادَرگواڈیٚلوییَرسلیوڈاگرِبڈِنکاڈوگریبوٚنِم ساربِیَند" + - "ُوالاوَستی پُرتُگالیڈِیوٗلاایٚفِکقدیٖمی مِصریایٚکاجُکایٚلامایِٹوَسط" + - "ی اَنٛگریٖزۍایٚوونڈوفینٛگفِلِپیٖنوفونوسطی فریٚنچپرون فریٚنچشُمٲلی ف" + - "رِشیَنمشرِقی فرِشیَنفروٗلِیَنگاگیےیوگبایاگیٖزگِلبٔرٹیٖزوَسطی ہاے جٔ" + - "رمَنپرون ہاے جٔرمَنگوندیگورینٹیلوگوتھِکگرِبوقدیٖم یوٗنٲنیسٕوِس جٔرم" + - "َنگُوِچ اِنہَیداہوایِیَنہِلیٖگینَنہِتایِتہمونٛگہیٚرِم ساربِیَنہُپاا" + - "ِباناِلوکواِنٛگُشلوجبانجوڈیو فارسیجوڈیو عربیکارا کَلپَککَبایِلکاچِن" + - "جُوٗکامباکَویکَبارڈِیَنتَیَپکوروکھاسیکھوتَنیٖزکِمبُندوٗکونکَنیکوسری" + - "یَنکَپیلیکراچیے بَلکارکَریلِیَنکُرُکھکُمِککُتینَےلیڈِنولَہَندالَمبا" + - "لیزگِیَنمونٛگولوزیلوٗبا لوٗلُوالویِسینولُندالُوولُسہاےمَدُریٖزمَگاے" + - "میتَھلیمَکَسارمَندِنٛگومَساےموکشامَندَرمیندیےوَستی ایرِشمِکمیکمِنَن" + - "ٛگکَباومانٛچوٗمَنیپوٗریموہاکموسیواریاہ زبانکریٖکمِراندیٖزمارواڑیایٚ" + - "رزِیانیٖپالیٹَنبوٚنِم جٔرمَننیٚوارینِیاسنِیویَننوگاےپرون نارسیایٚن " + - "کوشمالی ستھوکلاسِکَل نیوارینِیَمویٚزینِیَنکولنِیورونَظیٖمااوٚسیجاوٹ" + - "ومَن تُرکِشپَنٛگاسِنَنپَہلَویپَمپَنٛگاپَپِیامیٚنٹوپَلااُواںپرون فار" + - "سیفونیٖشیَنپانپیٚیَنپرون پروویٚنچَلراجِستھٲنۍرَپانویرَروٹونٛگَنرومَ" + - "نیاَرومانیسَندَویےیاکُتسَمارِتَن اَرامیکسَسَکسَنتالیسِچِلِیَنسکاٹسس" + - "یٚلکُپپرون ایرِششانسِداموجنوٗبی سَمیلولیے سَمیاِناری سَمیسکولٹ سَمی" + - "سونِنکیےسوگڈِیَنسرٛانَن ٹونٛگوسیٚریرسُکُماسُسوٗسُمیریَنسیٖریٲییٹِمن" + - "یےٹیٚریٚنوٹیٹَمٹاےگریےتیٖوٹوکیٖلاوکِلِنگونٹِلِنگِتتاماشیکنیاسا ٹونٛ" + - "گاٹاک پِسِنژھِمشِیانتُمبُکاتُوالوٗتُویٖنیَناُدمُرتاُگارتِکیُمبُندوٗ" + - "روٗٹواےووتِکوالامووَریےواشوکالمِکیاویَپیٖززَپوتیٚکزیناگازوٗنیکانٛہہ" + - " تہِ لِسانیاتی مواد نہٕزازاآسٹرِیَن جٔرمَنسٕوِس ہاےجٔرمَنآسٹریلیَن ا" + - "َنٛگریٖزۍکینَڈِیٲیی اَنٛگریٖزۍبَرطانوی اَنٛگریٖزۍیوٗ ایٚس اَنٛگریٖز" + - "ۍلیٹٕن امریٖکی سپینِشلِبیریَن سپینِشکَنیڈیَن فریٚنچسٕوٕس فریٚنچفلیٚ" + - "مِشبرازیٖلی پُتَگیٖزلِبیریَن پُرتَگیٖزمولداوِیَنسیٚربو کروشِیَنسیٚو" + - "د چیٖنیرِوٲجی چیٖنی", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000a, 0x001e, 0x002e, 0x0044, 0x004e, 0x005c, 0x006c, - 0x0074, 0x007e, 0x008c, 0x0098, 0x00ae, 0x00bc, 0x00d2, 0x00da, - 0x00e8, 0x00f6, 0x0106, 0x0110, 0x011c, 0x012c, 0x0138, 0x0142, - 0x014e, 0x015e, 0x0164, 0x016c, 0x0181, 0x018b, 0x0195, 0x019f, - 0x01ab, 0x01b7, 0x01c7, 0x01cf, 0x01dd, 0x01ef, 0x0205, 0x0211, - 0x0225, 0x022d, 0x0237, 0x0241, 0x024b, 0x0257, 0x0261, 0x026d, - 0x0286, 0x0292, 0x02ab, 0x02bd, 0x02cd, 0x02db, 0x02e7, 0x02f1, - 0x02fd, 0x0307, 0x031a, 0x032a, 0x0338, 0x034c, 0x035e, 0x036e, - // Entry 40 - 7F - 0x0388, 0x039c, 0x03bb, 0x03c5, 0x03d8, 0x03ea, 0x03f2, 0x0406, - 0x0416, 0x042a, 0x0436, 0x0446, 0x0456, 0x0462, 0x0470, 0x0482, - 0x048c, 0x049e, 0x04a8, 0x04b2, 0x04be, 0x04cc, 0x04d6, 0x04e2, - 0x04ea, 0x04f6, 0x0502, 0x0510, 0x052a, 0x0534, 0x0546, 0x0554, - 0x055a, 0x0570, 0x058b, 0x059b, 0x05ab, 0x05bd, 0x05c7, 0x05db, - 0x05eb, 0x05fb, 0x0609, 0x0613, 0x0621, 0x062d, 0x0637, 0x064c, - 0x065a, 0x0666, 0x066c, 0x068e, 0x06ab, 0x06c0, 0x06cc, 0x06da, - 0x06ec, 0x06fa, 0x0708, 0x0716, 0x0728, 0x0736, 0x073e, 0x0748, - // Entry 80 - BF - 0x0754, 0x0766, 0x0776, 0x0782, 0x078c, 0x0798, 0x07a2, 0x07b6, - 0x07c6, 0x07d6, 0x07e0, 0x07f5, 0x07ff, 0x080d, 0x0819, 0x082b, - 0x0839, 0x0841, 0x084d, 0x085f, 0x086f, 0x0879, 0x088c, 0x089e, - 0x08ac, 0x08ba, 0x08c4, 0x08d0, 0x08da, 0x08e2, 0x08f2, 0x0900, - 0x090a, 0x0916, 0x0922, 0x092e, 0x0938, 0x094a, 0x094a, 0x0960, - 0x096c, 0x0978, 0x0982, 0x0998, 0x09a6, 0x09b2, 0x09bc, 0x09c6, - 0x09d0, 0x09dc, 0x09ea, 0x09f4, 0x09fe, 0x0a10, 0x0a1c, 0x0a30, - 0x0a42, 0x0a42, 0x0a54, 0x0a54, 0x0a5e, 0x0a70, 0x0a70, 0x0a7e, - // Entry C0 - FF - 0x0a7e, 0x0a99, 0x0ab6, 0x0ac6, 0x0ad4, 0x0aeb, 0x0aeb, 0x0afb, - 0x0afb, 0x0afb, 0x0b09, 0x0b09, 0x0b09, 0x0b09, 0x0b09, 0x0b1d, - 0x0b1d, 0x0b29, 0x0b37, 0x0b47, 0x0b47, 0x0b4f, 0x0b4f, 0x0b4f, - 0x0b4f, 0x0b57, 0x0b63, 0x0b63, 0x0b63, 0x0b63, 0x0b63, 0x0b63, - 0x0b73, 0x0b7d, 0x0b85, 0x0b85, 0x0b85, 0x0b93, 0x0b93, 0x0b93, - 0x0b9b, 0x0b9b, 0x0b9b, 0x0b9b, 0x0ba9, 0x0bb7, 0x0bb7, 0x0bc1, - 0x0bc1, 0x0bc9, 0x0bd3, 0x0bd3, 0x0bdd, 0x0beb, 0x0beb, 0x0bf7, - 0x0c05, 0x0c11, 0x0c19, 0x0c32, 0x0c3e, 0x0c4c, 0x0c5a, 0x0c64, - // Entry 100 - 13F - 0x0c64, 0x0c70, 0x0c70, 0x0c89, 0x0c89, 0x0c9d, 0x0ca7, 0x0cb3, - 0x0cb3, 0x0cc5, 0x0ccd, 0x0cd9, 0x0ce3, 0x0ce3, 0x0ced, 0x0d0a, - 0x0d0a, 0x0d16, 0x0d33, 0x0d33, 0x0d41, 0x0d41, 0x0d41, 0x0d4d, - 0x0d4d, 0x0d64, 0x0d74, 0x0d88, 0x0da7, 0x0da7, 0x0db7, 0x0db7, - 0x0dc1, 0x0dd3, 0x0dd3, 0x0dd9, 0x0dd9, 0x0dee, 0x0e03, 0x0e03, - 0x0e1e, 0x0e39, 0x0e4b, 0x0e4f, 0x0e4f, 0x0e4f, 0x0e59, 0x0e63, - 0x0e63, 0x0e6b, 0x0e7f, 0x0e7f, 0x0e9d, 0x0eb9, 0x0eb9, 0x0ec3, - 0x0ed5, 0x0ee1, 0x0eeb, 0x0f04, 0x0f1b, 0x0f1b, 0x0f1b, 0x0f1b, - // Entry 140 - 17F - 0x0f2c, 0x0f36, 0x0f36, 0x0f46, 0x0f46, 0x0f5a, 0x0f68, 0x0f74, - 0x0f91, 0x0f91, 0x0f99, 0x0fa3, 0x0fa3, 0x0faf, 0x0fbd, 0x0fbd, - 0x0fbd, 0x0fc9, 0x0fc9, 0x0fc9, 0x0fde, 0x0ff1, 0x0ff1, 0x1006, - 0x1014, 0x101e, 0x1026, 0x1030, 0x1038, 0x104c, 0x104c, 0x1056, - 0x1056, 0x1056, 0x1056, 0x105e, 0x105e, 0x1068, 0x107a, 0x107a, - 0x107a, 0x107a, 0x107a, 0x107a, 0x108c, 0x108c, 0x109a, 0x10aa, - 0x10b6, 0x10cf, 0x10cf, 0x10cf, 0x10e1, 0x10ed, 0x10ed, 0x10ed, - 0x10ed, 0x10f7, 0x1105, 0x1111, 0x1111, 0x111f, 0x1129, 0x1139, - // Entry 180 - 1BF - 0x1139, 0x1139, 0x1139, 0x1139, 0x1139, 0x1145, 0x114d, 0x114d, - 0x114d, 0x1166, 0x1176, 0x1180, 0x1188, 0x1194, 0x1194, 0x1194, - 0x1194, 0x11a4, 0x11a4, 0x11ae, 0x11bc, 0x11ca, 0x11dc, 0x11e6, - 0x11e6, 0x11f0, 0x11fc, 0x1208, 0x1208, 0x1208, 0x121d, 0x121d, - 0x121d, 0x1229, 0x1241, 0x124f, 0x1261, 0x126b, 0x1273, 0x1273, - 0x1273, 0x1288, 0x1292, 0x12a4, 0x12b2, 0x12b2, 0x12b2, 0x12c2, - 0x12c2, 0x12c2, 0x12d6, 0x12d6, 0x12ef, 0x12fd, 0x1307, 0x1315, - 0x1315, 0x1315, 0x1315, 0x131f, 0x1332, 0x1332, 0x133f, 0x1352, - // Entry 1C0 - 1FF - 0x1352, 0x136f, 0x1383, 0x1393, 0x139f, 0x13ad, 0x13b9, 0x13d4, - 0x13ea, 0x13f8, 0x140a, 0x1422, 0x1434, 0x1434, 0x1434, 0x1434, - 0x1434, 0x1447, 0x1447, 0x1459, 0x1459, 0x1459, 0x146b, 0x146b, - 0x1488, 0x1488, 0x1488, 0x149c, 0x14aa, 0x14c0, 0x14c0, 0x14c0, - 0x14c0, 0x14cc, 0x14cc, 0x14cc, 0x14cc, 0x14dc, 0x14dc, 0x14ec, - 0x14f6, 0x1517, 0x1517, 0x1521, 0x152f, 0x152f, 0x152f, 0x152f, - 0x1541, 0x154b, 0x154b, 0x154b, 0x154b, 0x154b, 0x154b, 0x1559, - 0x1559, 0x156c, 0x156c, 0x156c, 0x1572, 0x1572, 0x157e, 0x157e, - // Entry 200 - 23F - 0x157e, 0x1593, 0x15a6, 0x15bb, 0x15ce, 0x15de, 0x15ee, 0x1609, - 0x1615, 0x1615, 0x1615, 0x1621, 0x162b, 0x163b, 0x163b, 0x163b, - 0x164b, 0x164b, 0x164b, 0x1657, 0x1657, 0x1667, 0x1671, 0x167f, - 0x1687, 0x1697, 0x1697, 0x16a7, 0x16b7, 0x16b7, 0x16c5, 0x16dc, - 0x16ed, 0x16ed, 0x16ed, 0x16ed, 0x16ff, 0x16ff, 0x170d, 0x171b, - 0x171b, 0x172d, 0x172d, 0x173b, 0x174b, 0x175d, 0x1765, 0x176b, - 0x176b, 0x176b, 0x176b, 0x176b, 0x1775, 0x1775, 0x1775, 0x1775, - 0x1781, 0x178b, 0x1793, 0x1793, 0x1793, 0x179f, 0x179f, 0x179f, - // Entry 240 - 27F - 0x17a5, 0x17b1, 0x17b1, 0x17b1, 0x17b1, 0x17b1, 0x17c1, 0x17c1, - 0x17c1, 0x17cd, 0x17cd, 0x17d7, 0x180d, 0x1815, 0x1815, 0x1815, - 0x1832, 0x184f, 0x1876, 0x189f, 0x18c4, 0x18e8, 0x190e, 0x192b, - 0x192b, 0x192b, 0x1948, 0x195f, 0x195f, 0x196d, 0x198e, 0x19b1, - 0x19c5, 0x19e2, 0x19e2, 0x19f7, 0x1a0e, - }, - }, - { // ksb - "KiakanKiamhaliKialabuKibelaausiKibulgaliaKibanglaKicheckiKijeumaniKigiik" + - "iKiingeezaKihispaniaKiajemiKifalansaKihausaKihindiKihungaiKiindonesi" + - "aKiigboKiitalianoKijapaniKijavaKikambodiaKikoleaKimalesiaKibulmaKine" + - "paliKiholanziKipunjabiKipolandiKilenoKiomaniaKilusiKinyalwandaKisoma" + - "liKiswidiKitamilKitailandiKituukiKiuklaniaKiulduKivietinamuKiyolubaK" + - "ichinaKizuluKishambaa", - []uint16{ // 375 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, - 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0049, 0x0052, 0x0052, 0x005c, - 0x005c, 0x005c, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x006c, - 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x0073, - 0x0073, 0x007a, 0x007a, 0x007a, 0x007a, 0x0082, 0x0082, 0x0082, - // Entry 40 - 7F - 0x0082, 0x008d, 0x008d, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, - 0x009d, 0x009d, 0x00a5, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, - 0x00ab, 0x00ab, 0x00b5, 0x00b5, 0x00bc, 0x00bc, 0x00bc, 0x00bc, - 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, - 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, - 0x00bc, 0x00bc, 0x00bc, 0x00c5, 0x00c5, 0x00cc, 0x00cc, 0x00cc, - 0x00d4, 0x00d4, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, - 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00e6, 0x00e6, 0x00ef, - // Entry 80 - BF - 0x00ef, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00fd, 0x0103, 0x010e, - 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, - 0x010e, 0x010e, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, - 0x011d, 0x011d, 0x0124, 0x0124, 0x0124, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x013e, - 0x0144, 0x0144, 0x0144, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, - 0x014f, 0x0157, 0x0157, 0x015e, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - // Entry C0 - FF - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - // Entry 100 - 13F - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - // Entry 140 - 17F - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x016d, - }, - }, - { // ksf - "riakanriamarikriarabribɛlɔrísribulgaríribɛngáliricɛ́kridjɛrmanrigrɛ́krii" + - "ngɛrísrikpanyáripɛrsánripɛrɛsǝ́rikaksariíndíriɔngrɔáriindonɛsíriigbo" + - "riitalyɛ́nrijapɔ́ŋrijawanɛ́rikmɛrrikɔrɛɛ́rimalaíribirmánrinepalɛ́riɔ" + - "lándɛ́ripɛnjabíripɔlɔ́nripɔrtugɛ́rirɔmánrirísrirwandarisomalíriswɛ́d" + - "ǝritamúlritaíriturkriukrɛ́nriurdúriwyɛtnámriyúubaricinɔárizúlurikpa", - []uint16{ // 376 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0020, 0x002a, - 0x002a, 0x002a, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0050, 0x005b, 0x005b, 0x0064, - 0x0064, 0x0064, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x0082, - 0x0082, 0x008a, 0x008a, 0x008a, 0x008a, 0x0095, 0x0095, 0x0095, - // Entry 40 - 7F - 0x0095, 0x00a1, 0x00a1, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, - 0x00b3, 0x00b3, 0x00be, 0x00c9, 0x00c9, 0x00c9, 0x00c9, 0x00c9, - 0x00c9, 0x00c9, 0x00d0, 0x00d0, 0x00dc, 0x00dc, 0x00dc, 0x00dc, - 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, - 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, - 0x00dc, 0x00dc, 0x00dc, 0x00e4, 0x00e4, 0x00ed, 0x00ed, 0x00ed, - 0x00f8, 0x00f8, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0110, 0x0110, 0x011b, - // Entry 80 - BF - 0x011b, 0x0128, 0x0128, 0x0128, 0x0128, 0x0131, 0x0137, 0x013f, - 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - 0x013f, 0x013f, 0x0148, 0x0148, 0x0148, 0x0148, 0x0148, 0x0148, - 0x0153, 0x0153, 0x015b, 0x015b, 0x015b, 0x0161, 0x0161, 0x0161, - 0x0161, 0x0161, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0171, - 0x0178, 0x0178, 0x0178, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, - 0x0183, 0x018b, 0x018b, 0x0194, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - // Entry C0 - FF - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - // Entry 100 - 13F - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - // Entry 140 - 17F - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x01a0, - }, - }, - { // ksh - "AfahreschAbchahseschAvästahneschAfrikaansAkahneschAmhahreschArrajonehses" + - "chArahbeschAßamehseschAvahreschAimahreschAsserbaidschahneschBaschkih" + - "reschWiißrußeschBulljahreschBislahmeschBambaraBängjahleschTibehtesch" + - "BettohneschBoßneschKattalahneschTschätschehneschChamorruKorseschTsch" + - "äscheschKerscheßlahweschTschowascheschWallihseschDähneschDeutschDiv" + - "ehjeschButahneschEweJrihscheschÄngleschEsperantoSchpahneschÄßneschBa" + - "skeschPärseschFulfuldeFinneschFihdscheschFärröhreschFranzühseschWäßf" + - "rihseschIhreschJallihzeschJuwarahneschGutscharateschMangxHaußaHebräh" + - "jeschHinndiKrowateschHa’iihteschUnnjarreschArmehneschHerrehrode Inte" + - "rlinguaIndonehseschIgboIhdoIßlänndeschEtalljähneschInuktitutJapahnes" + - "chJavahneschJe’orjeschRekohjoOschivamboKassakkeschJröhnländeschKhmer" + - "KannadaKorrejaaneschKanuhreschKaschmihreschKurrdeschKohmeschKornesch" + - "KirjihseschLateijneschLuxemborjeschLuganndaLemburjeschLingjallaLahoo" + - "teschLittoueschKilubaLätteschMadajaßkeschMaschallehseschMa’ohreschMa" + - "zedohneschMallajalamMongjohleschMarrahteschMallaijeschMaltehseschBur" + - "mehseschNauruheschNood-NdebeleNepallehseschNdongjahneschHolländeschN" + - "eu NorrwehjeschNorrwehjesch BokmålNavvachoSchi-SchewaOriijaOßeetesch" + - "PanschaabeschPollneschPaschtuuneschPochtojeseschKättschowaRätoromaan" + - "eschK-RundeschRumäneschRußßeschKinja-RuandeschSanskritSinndiNood-Lap" + - "pländeschSangjoSingjaleeseschẞlovakeschẞloveeneschSammohaneschSchi-S" + - "chonaSomahleschAlbahneschSärbeschSi-SwateschSöd-SootoSindanehseschSc" + - "hwehdeschSuahehleschTamihleschTelluhjuTadschihkeschTailändeschTijren" + - "ejahneschTörkmehneschSe-ZwahneschTongjahneschTörkeschXi-Zongjahnesch" + - "TattahreschTahihteschUj’juhreschUkraineschUrdu/HindiUßbehkeschWendaV" + - "ijätnammehseschVolapükWalohneschWoloffIsi-KhohsaJiddeschJoruhbaSchin" + - "ehsesch (Mandarin)SuhluAschenehseschAdangmeschAdygehjschTonehsesch A" + - "rahbeschAfrehihleschAghehmeschAijnuAkahdeschAle’uhteschAhl ÄngleschA" + - "njikahneschArrappahoAljehresch ArahbeschMarokahnesch ArahbeschÄjipte" + - "sch ArahbeschPareAmärrekahnesche BlendeschprohchAstuhrejahneschAwahd" + - "eschBeluhtscheschBalinehseschBaireschBasaa-SchprohcheBembaBenaBhohds" + - "chpureschEdoBischnuprejahneschBrahjeschBrahuijeschBoddoBurejahteschB" + - "ujinehseschBilihneschZebuwahneschKihja-SchprohchTrukehseschMahreschT" + - "schoktohTschärrokehTschäjännZäntrahl-KurrdeschKopteschKaschuhbeschDa" + - "kohteschDarjihneschDawedahneschDohjribeschDjermaNiddersorbeschDu’ala" + - "MeddelnehderlängschJola-FonyischDassajahneschKîembuÄffikschEmilijahn" + - "eschAhl ÄjipteschEkajukeschMeddelängleschZäntrahl-JuppikEwonndoFilli" + - "pihneschFohneschFrijauhleschJahJi’is-Ahl-ÄttejohpeschJillbättehsesch" + - "JorontalohschSchwitzerdütschHauajahneschHiligaynonHmongBovversorrbes" + - "chHupaIbahneschIbibioIlokahneschEngjuscheschIngjrijahneschJamaikahne" + - "sch-ÄngleschLodschbahnNjombaJühdesch-PärseschJütteschKabyhleschKamba" + - " vun KehnijaKabadihneschChimakondeKapvärdeschKoro vun de Älfebeijnkö" + - "ßKhasiKojra TschihniKakoKaländjihneschKimbunduKon’kahneschKpäleKara" + - "tschaj-Balkahresch-TörkeschKarehleschKorocheschBafijahneschKölschKum" + - "ykeschLadihneschLangode Landa-SchproocheLesjeschLakotaSilohziNood-Lu" + - "hreschTschilubaSchilunndaLuoLuhjeschMokschahMeitei-ManipuhreschMunda" + - "ng-ongerscheidlijje Schprohche-KrihkMirandehseschÄrsjahneschNapollet" + - "ahneschNewahreschGyeleNjijembohnNojalNood-SohtoK’ische’KiromboArroma" + - "hneschJackuteschNjambaijKojraboro SenniTaschelhitteschLule-Läpplände" + - "schInahri LappländeschKommohreschSührejakkeschTetumschTigreKlingjohn" + - "eschTok PisinTasawaqTuvinijahneschTamasicht ussem meddlere AtlasUdmu" + - "chteschUmbundesch-onbikannte-Schprooch-WalserdütschWelahmoWaray-Wara" + - "yKalmükkeschJämmbahKanton-SchinehseschSuhñikein SchproochSahsajeschS" + - "chtandatt ArahbeschSödasserbaidschahneschDeutsch uß ÖhßterichDeutsch" + - " uß de SchweijzÄnglesch uß AußtrahlijeÄnglesch uß KanadaÄnglesch uß " + - "JruhßbrettannijeAmärrekahnesch ÄngleschSchpahnesch uß Latting-Ammärr" + - "ikaSchpahnesch en SchpahnejeSchpahnesch en MäxikohFranzühsesch uß Ka" + - "nadaFranzühsesch uß de SchweijzNehdersaksesch en de NederlängFlähmes" + - "chBrasilljaanesch PochtojeseschPochtojesesch uß PochtojallSärbokowat" + - "eschSchinehsesch (eijfache Schreff)Schinehsesch (tradizjonälle Schre" + - "ff)", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0014, 0x0021, 0x002a, 0x0033, 0x003d, 0x004b, - 0x0054, 0x0060, 0x0069, 0x0073, 0x0086, 0x0093, 0x00a0, 0x00ac, - 0x00b7, 0x00be, 0x00cb, 0x00d5, 0x00e0, 0x00e9, 0x00f6, 0x0107, - 0x010f, 0x0117, 0x0117, 0x0124, 0x0135, 0x0143, 0x014e, 0x0157, - 0x015e, 0x0168, 0x0172, 0x0175, 0x0180, 0x0189, 0x0192, 0x019d, - 0x01a6, 0x01ae, 0x01b7, 0x01bf, 0x01c7, 0x01d2, 0x01df, 0x01ec, - 0x01fa, 0x0201, 0x0201, 0x020c, 0x0218, 0x0226, 0x022b, 0x0231, - 0x023d, 0x0243, 0x0243, 0x024d, 0x025a, 0x0265, 0x026f, 0x0277, - // Entry 40 - 7F - 0x0285, 0x0291, 0x0291, 0x0295, 0x0295, 0x0295, 0x0299, 0x02a6, - 0x02b4, 0x02bd, 0x02c7, 0x02d1, 0x02dd, 0x02dd, 0x02e4, 0x02ee, - 0x02f9, 0x0308, 0x030d, 0x0314, 0x0321, 0x032b, 0x0338, 0x0341, - 0x0349, 0x0351, 0x035c, 0x0367, 0x0374, 0x037c, 0x0387, 0x0390, - 0x039a, 0x03a4, 0x03aa, 0x03b3, 0x03c0, 0x03cf, 0x03db, 0x03e7, - 0x03f1, 0x03fd, 0x0408, 0x0413, 0x041e, 0x0429, 0x0433, 0x043f, - 0x044c, 0x0459, 0x0465, 0x0475, 0x0489, 0x0489, 0x0491, 0x049c, - 0x049c, 0x049c, 0x049c, 0x04a2, 0x04ac, 0x04b9, 0x04b9, 0x04c2, - // Entry 80 - BF - 0x04cf, 0x04dc, 0x04e7, 0x04f6, 0x0500, 0x050a, 0x0514, 0x0523, - 0x052b, 0x052b, 0x0531, 0x0543, 0x0549, 0x0557, 0x0563, 0x0570, - 0x057c, 0x0587, 0x0591, 0x059b, 0x05a4, 0x05af, 0x05b9, 0x05c6, - 0x05d1, 0x05dc, 0x05e6, 0x05ee, 0x05fb, 0x0607, 0x0616, 0x0623, - 0x062f, 0x063b, 0x0644, 0x0653, 0x065e, 0x0668, 0x0675, 0x067f, - 0x0689, 0x0694, 0x0699, 0x06aa, 0x06b2, 0x06bc, 0x06c2, 0x06cc, - 0x06d4, 0x06db, 0x06db, 0x06f2, 0x06f7, 0x0704, 0x0704, 0x070e, - 0x0718, 0x072c, 0x0738, 0x0742, 0x0747, 0x0750, 0x0750, 0x075d, - // Entry C0 - FF - 0x075d, 0x075d, 0x076a, 0x0776, 0x0776, 0x0776, 0x0776, 0x077f, - 0x0793, 0x0793, 0x0793, 0x07a9, 0x07bd, 0x07c1, 0x07e1, 0x07f0, - 0x07f0, 0x07f9, 0x0806, 0x0812, 0x081a, 0x082a, 0x082a, 0x082a, - 0x082a, 0x082a, 0x082f, 0x082f, 0x0833, 0x0833, 0x0833, 0x0833, - 0x0842, 0x0842, 0x0845, 0x0845, 0x0845, 0x0845, 0x0857, 0x0857, - 0x0860, 0x086b, 0x0870, 0x0870, 0x087c, 0x0888, 0x0888, 0x0892, - 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x089e, 0x08ad, 0x08ad, - 0x08ad, 0x08b8, 0x08c0, 0x08c0, 0x08c9, 0x08c9, 0x08d5, 0x08e0, - // Entry 100 - 13F - 0x08f3, 0x08fb, 0x08fb, 0x08fb, 0x08fb, 0x0907, 0x0911, 0x091c, - 0x0928, 0x0928, 0x0928, 0x0933, 0x0933, 0x0939, 0x0939, 0x0947, - 0x0947, 0x094f, 0x0963, 0x0970, 0x0970, 0x097d, 0x0984, 0x098d, - 0x099a, 0x09a8, 0x09b2, 0x09b2, 0x09c1, 0x09d1, 0x09d8, 0x09d8, - 0x09d8, 0x09e5, 0x09e5, 0x09ed, 0x09ed, 0x09ed, 0x09ed, 0x09ed, - 0x09ed, 0x09ed, 0x09f9, 0x09fc, 0x09fc, 0x09fc, 0x09fc, 0x09fc, - 0x09fc, 0x0a15, 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, - 0x0a32, 0x0a32, 0x0a32, 0x0a32, 0x0a42, 0x0a42, 0x0a42, 0x0a42, - // Entry 140 - 17F - 0x0a42, 0x0a42, 0x0a42, 0x0a4e, 0x0a4e, 0x0a58, 0x0a58, 0x0a5d, - 0x0a6c, 0x0a6c, 0x0a70, 0x0a79, 0x0a7f, 0x0a8a, 0x0a96, 0x0aa4, - 0x0abb, 0x0ac5, 0x0acb, 0x0acb, 0x0ade, 0x0ade, 0x0ae7, 0x0ae7, - 0x0af1, 0x0af1, 0x0af1, 0x0b02, 0x0b02, 0x0b0e, 0x0b0e, 0x0b0e, - 0x0b18, 0x0b24, 0x0b24, 0x0b3f, 0x0b3f, 0x0b44, 0x0b44, 0x0b52, - 0x0b52, 0x0b52, 0x0b56, 0x0b65, 0x0b6d, 0x0b6d, 0x0b7b, 0x0b7b, - 0x0b81, 0x0ba1, 0x0ba1, 0x0ba1, 0x0bab, 0x0bb5, 0x0bb5, 0x0bc1, - 0x0bc8, 0x0bd1, 0x0bd1, 0x0bdb, 0x0be0, 0x0bf3, 0x0bf3, 0x0bfb, - // Entry 180 - 1BF - 0x0bfb, 0x0bfb, 0x0bfb, 0x0c01, 0x0c01, 0x0c01, 0x0c08, 0x0c15, - 0x0c15, 0x0c1e, 0x0c1e, 0x0c28, 0x0c2b, 0x0c2b, 0x0c33, 0x0c33, - 0x0c33, 0x0c33, 0x0c33, 0x0c33, 0x0c33, 0x0c33, 0x0c33, 0x0c33, - 0x0c33, 0x0c3b, 0x0c3b, 0x0c3b, 0x0c3b, 0x0c3b, 0x0c3b, 0x0c3b, - 0x0c3b, 0x0c3b, 0x0c3b, 0x0c3b, 0x0c4e, 0x0c4e, 0x0c4e, 0x0c4e, - 0x0c55, 0x0c72, 0x0c77, 0x0c84, 0x0c84, 0x0c84, 0x0c84, 0x0c90, - 0x0c90, 0x0c90, 0x0c9f, 0x0c9f, 0x0c9f, 0x0ca9, 0x0ca9, 0x0ca9, - 0x0ca9, 0x0cae, 0x0cb8, 0x0cbd, 0x0cbd, 0x0cbd, 0x0cbd, 0x0cc7, - // Entry 1C0 - 1FF - 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, - 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, - 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, 0x0cc7, - 0x0cc7, 0x0cd3, 0x0cd3, 0x0cd3, 0x0cd3, 0x0cd3, 0x0cd3, 0x0cd3, - 0x0cda, 0x0cda, 0x0cda, 0x0cda, 0x0cda, 0x0ce6, 0x0ce6, 0x0ce6, - 0x0cf0, 0x0cf0, 0x0cf0, 0x0cf0, 0x0cf0, 0x0cf0, 0x0cf8, 0x0cf8, - 0x0cf8, 0x0cf8, 0x0cf8, 0x0cf8, 0x0cf8, 0x0cf8, 0x0cf8, 0x0cf8, - 0x0d07, 0x0d07, 0x0d07, 0x0d16, 0x0d16, 0x0d16, 0x0d16, 0x0d16, - // Entry 200 - 23F - 0x0d16, 0x0d16, 0x0d29, 0x0d3d, 0x0d3d, 0x0d3d, 0x0d3d, 0x0d3d, - 0x0d3d, 0x0d3d, 0x0d3d, 0x0d3d, 0x0d3d, 0x0d3d, 0x0d48, 0x0d48, - 0x0d56, 0x0d56, 0x0d56, 0x0d56, 0x0d56, 0x0d56, 0x0d5e, 0x0d63, - 0x0d63, 0x0d63, 0x0d63, 0x0d70, 0x0d70, 0x0d70, 0x0d70, 0x0d70, - 0x0d79, 0x0d79, 0x0d79, 0x0d79, 0x0d79, 0x0d79, 0x0d79, 0x0d79, - 0x0d80, 0x0d8e, 0x0dac, 0x0db7, 0x0db7, 0x0dc1, 0x0dd7, 0x0dd7, - 0x0dd7, 0x0dd7, 0x0dd7, 0x0dd7, 0x0dd7, 0x0dd7, 0x0dd7, 0x0de4, - 0x0deb, 0x0df6, 0x0df6, 0x0df6, 0x0df6, 0x0e02, 0x0e02, 0x0e02, - // Entry 240 - 27F - 0x0e02, 0x0e02, 0x0e02, 0x0e0a, 0x0e0a, 0x0e1d, 0x0e1d, 0x0e1d, - 0x0e1d, 0x0e1d, 0x0e1d, 0x0e23, 0x0e31, 0x0e3b, 0x0e4f, 0x0e66, - 0x0e7d, 0x0e94, 0x0eae, 0x0ec2, 0x0ee1, 0x0efa, 0x0f1c, 0x0f35, - 0x0f4c, 0x0f4c, 0x0f64, 0x0f81, 0x0fa0, 0x0faa, 0x0fc7, 0x0fe3, - 0x0fe3, 0x0ff2, 0x0ff2, 0x1011, 0x1036, - }, - }, - { // kw - "kernewek", - []uint16{ // 90 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0008, - }, - }, - { // ky - kyLangStr, - kyLangIdx, - }, - { // lag - "KɨakáaniKɨmʉháariKɨaráabuKɨberalúusiKɨbulugáriaKɨbangálaKɨchéekiKɨjerʉmá" + - "aniKɨgiríkiKɨɨngeréesaKɨhispániaKɨajéemiKɨfaráansaKɨhaúusaKɨhíindiKɨ" + - "hungáriKɨɨndonésiaKiígiboKɨtaliáanoKɨjapáaniKɨjáavaKɨkambódiaKɨkoréa" + - "KɨmelésiaKɨbáamaKɨnepáaliKɨholáanziKɨpúnjabiKɨpólandiKɨréenoKɨromaní" + - "aKɨrúusiKɨnyarwáandaKɨsómáaliKɨswíidiKɨtamíiliKɨtáilandiKɨturúukiKɨu" + - "kɨraníaKɨúrduKɨvietináamuKɨyorúubaKɨchíinaKɨzúuluKɨlaangi", - []uint16{ // 381 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0016, 0x0016, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x002d, 0x003a, - 0x003a, 0x003a, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x005d, 0x005d, 0x005d, 0x005d, 0x0067, 0x0075, 0x0075, 0x0081, - 0x0081, 0x0081, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x0097, - 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x00a1, - 0x00a1, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00b6, 0x00b6, 0x00b6, - // Entry 40 - 7F - 0x00b6, 0x00c4, 0x00c4, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, - 0x00d8, 0x00d8, 0x00e3, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, - 0x00ec, 0x00ec, 0x00f8, 0x00f8, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0101, 0x010c, 0x010c, 0x0115, 0x0115, 0x0115, - 0x0120, 0x0120, 0x012c, 0x012c, 0x012c, 0x012c, 0x012c, 0x012c, - 0x012c, 0x012c, 0x012c, 0x012c, 0x012c, 0x0137, 0x0137, 0x0142, - // Entry 80 - BF - 0x0142, 0x014b, 0x014b, 0x014b, 0x014b, 0x0156, 0x015f, 0x016d, - 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, - 0x016d, 0x016d, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, - 0x0183, 0x0183, 0x018e, 0x018e, 0x018e, 0x019a, 0x019a, 0x019a, - 0x019a, 0x019a, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01b2, - 0x01ba, 0x01ba, 0x01ba, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, - 0x01c8, 0x01d3, 0x01d3, 0x01dd, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - // Entry C0 - FF - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - // Entry 100 - 13F - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - // Entry 140 - 17F - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01ef, - }, - }, - { // lb - "AfarAbchaseschAvesteschAfrikaansAkanAmhareschAragoneseschArabeschAssames" + - "eschAwareschAymaraAserbaidschaneschBaschkireschWäissrusseschBulgares" + - "chBislamaBambara-SproochBengaleschTibeteschBretoneschBosneschKatalan" + - "eschTschetscheneschChamorro-SproochKorseschCreeTschecheschKierchesla" + - "weschTschuwascheschWaliseschDäneschDäitschMaldiveschBhutaneschEwe-Sp" + - "roochGriicheschEngleschEsperantoSpueneschEstneschBaskeschPerseschFul" + - "FinneschFidschianeschFäröeschFranséischWestfrieseschIreschSchottesch" + - "t GälleschGalizeschGuaraniGujaratiManxHausaHebräeschHindiHiri-MotuKr" + - "oateschHaitianeschUngareschArmeneschHerero-SproochInterlinguaIndones" + - "eschInterlingueIgbo-SproochSichuan YiInupiakIdo-SproochIslänneschIta" + - "lieneschInukitutJapaneschJavaneschGeorgeschKongoleseschKikuyu-Sprooc" + - "hKwanyamaKasacheschGrönlänneschKambodschaneschKannadaKoreaneschKanur" + - "i-SproochKaschmireschKurdeschKomi-SproochKorneschKirgiseschLatäinLët" + - "zebuergeschGanda-SproochLimburgeschLingalaLaoteschLitaueschLuba-Kata" + - "ngaLetteschMalagassi-SproochMarschalleseschMaoriMazedoneschMalayalam" + - "MongoleschMarathiMalaieschMalteseschBirmaneschNaurueschNord-Ndebele-" + - "SproochNepaleseschNdongaHollänneschNorwegesch NynorskNorwegesch Bokm" + - "ålSüd-Ndebele-SproochNavajoNyanja-SproochOkzitaneschOjibwa-SproochO" + - "romoOrijaOsseteschPandschabeschPaliPolneschPaschtuPortugiseschQuechu" + - "aRätoromaneschRundi-SproochRumäneschRusseschRuandeschSanskritSardesc" + - "hSindhiNordsameschSangoSinghaleseschSlowakeschSloweneschSamoaneschSh" + - "onaSomaliAlbaneschSerbeschSwaziSüd-Sotho-SproochSundaneseschSchwedes" + - "chSuaheliTamileschTeluguTadschikeschThailänneschTigrinjaTurkmeneschT" + - "swana-SproochTongaeschTierkeschTsongaTatareschTahiteschUigureschUkra" + - "ineschUrduUsbekeschVenda-SproochVietnameseschVolapükWallouneschWolof" + - "XhosaJiddeschYorubaZhuangChineseschZuluAceh-SproochAcholi-SproochAda" + - "ngmeAdygéieschTunesescht ArabeschAfrihiliAghemAinu-SproochAkkadeschA" + - "labamaAleuteschGegeschSüd-AlaeschAlengleschAngikaAramäeschMapudungun" + - "AraonaArapaho-SproochAlgerescht ArabeschArawak-SproochMarokkanescht " + - "ArabeschEgyptescht ArabeschAsu (Tanzania)Amerikanesch ZeechesproochA" + - "sturianeschKotavaAwadhiBelutscheschBalineseschBaireschBasaa-SproochB" + - "amunBatak TobaGhomálá’BedauyeBemba-SproochBetawiBenaBafutBadagaBhods" + - "chpuriBikol-SproochBini-SproochBanjareseschKomBlackfoot-SproochBishn" + - "upriyaBachtiareschBraj-BhakhaBrahuiBodoAkooseBurjateschBugineseschBu" + - "luBlinMedumbaCaddoKaribeschCayugaAtsamCebuanoKigaChibcha-SproochTsch" + - "agataeschTrukeseschMariChinookChoctawChipewyanCherokeeCheyenneSorani" + - "KopteschCapiznonKrimtatareschKaschubeschDakota-SproochDargineschTait" + - "aDelaware-SproochSlaveDogribDinka-SproochZarmaDogriNiddersorbeschZen" + - "tral-DusunDualaMëttelhollänneschJola-FonyiDyula-SproochDazagaKiembuE" + - "fikEmilianeschEgypteschEkajukElameschMëttelengleschYup’ikEwondoExtre" + - "madureschPangwe-SproochFilipinoMeänkieliFon-SproochCajunMëttelfransé" + - "ischAlfranséischFrankoprovenzaleschNordfrieseschOstfrieseschFriulesc" + - "hGa-SproochGagauseschGan-ChineseschGayoGbaya-SproochZoroastrianescht" + - " DariGeezGilberteseschGilakiMëttelhéichdäitschAlhéichdäitschGoan-Kon" + - "kaniGondi-SproochMongondouGoteschGrebo-SproochAlgriicheschSchwäizerd" + - "äitschWayuuFarefareGusii-SproochKutchin-SproochHaida-SproochHakka-C" + - "hineseschHawaieschFidschi-HindiHiligaynon-SproochHethiteschMiao-Spro" + - "ochUewersorbeschXiang-ChineseschHupaIbanIbibioIlokano-SproochIngusch" + - "eschIschoreschJamaikanesch-KreoleschLojbanNgombaMachameJiddesch-Pers" + - "eschJiddesch-ArabeschJüteschKarakalpakeschKabyleschKachin-SproochJju" + - "KambaKawiKabardineschKanembuTyapMakondeKabuverdianuKenyangKoroKainga" + - "ngKhasi-SproochSakeschKoyra ChiiniKhowarKirmanjkiKakoKalenjinKimbund" + - "u-SproochKomi-PermiakKonkaniKosraeaneschKpelle-SproochKaratschaiesch" + - "-BalkareschKrioKinaray-aKareleschOraon-SproochShambalaBafiaKölschKum" + - "ükeschKutenai-SproochLadinoLangiLahndaLamba-SproochLesgeschLingua F" + - "ranca NovaLigureschLiveschLakota-SproochLombardeschMongoRotse-Sprooc" + - "hLettgalleschLuba-LuluaLuiseno-SproochLunda-SproochLuo-SproochLushai" + - "-SproochOlulujiaKlassescht ChineseschLasesch SproochMadureseschMafaK" + - "hottaMaithiliMakassareschManding-SproochMassai-SproochMabaMokshaMand" + - "areseschMende-SproochMeru-SproochMorisyenMëttelireschMakhuwa-MeettoM" + - "eta’Micmac-SproochMinangkabau-SproochMandschureschMeithei-SproochMoh" + - "awk-SproochMossi-SproochWest-MariMundangMéisproochegMuskogee-Sprooch" + - "MirandeseschMarwariMentawaiMyeneErsja-MordwineschMazandaraniMin-Nan-" + - "ChineseschNeapolitaneschNamaNidderdäitschNewariNias-SproochNiue-Spro" + - "ochAo NagaKwasioNgiemboonNogaiAlnordeschNovialN’KoNord-Sotho-Sprooch" + - "NuerAl-NewariNyamwezi-SproochNyankoleNyoroNzimaOsage-SproochOsmanesc" + - "hPangasinan-SproochMëttelperseschPampanggan-SproochPapiamentoPalauPi" + - "cardeschPennsylvaniadäitschPlattdäitschAlperseschPfälzesch DäitschPh" + - "önikeschPiemonteseschPonteschPonapeaneschPreiseschAlprovenzaleschQu" + - "iché-SproochKichwa (Chimborazo-Gebidder)RajasthaniOuschterinsel-Spro" + - "ochRarotonganeschRomagnolTarifitRomboRomaniRotumaneschRussineschRovi" + - "anaAromuneschRwaSandawe-SproochJakuteschSamaritaneschSamburuSasakSan" + - "taliSaurashtraNgambaySanguSizilianeschSchotteschSassareseschSenecaSe" + - "naSeriSelkupeschKoyra SenniAlireschSamogiteschTaschelhitSchan-Sprooc" + - "hTschadesch-ArabeschSidamoNidderschleseschSelayarSüdsameschLule-Lapp" + - "eschInari-LappeschSkolt-LappeschSoninke-SproochSogdeschSrananeschSer" + - "er-SproochSahoSaterfrieseschSukuma-SproochSusuSumereschKomoreschAlsy" + - "reschSyreschSchleseschTuluTemneTesoTereno-SproochTetum-SproochTigreT" + - "iv-SproochTokelauaneschTsachureschKlingoneschTlingit-SproochTaleschT" + - "amaseqTsonga-SproochNeimelaneseschTuroyoSeediqTsakoneschTsimshian-Sp" + - "roochTateschTumbuka-SproochElliceaneschTasawaqTuwineschMëttlert-Atla" + - "s-TamazightUdmurteschUgariteschMbundu-SproochRootVai-SproochVenezesc" + - "hWepseschWestflämeschMainfränkeschWoteschVoroVunjoWalliserdäitschWal" + - "amo-SproochWarayWasho-SproochWu-ChineseschKalmückeschMingrelesch Spr" + - "oochSogaYao-SproochYapeseschYangbenYembaNheengatuKantoneseschZapotek" + - "eschBliss-SymbolerSeelänneschZenagaMarokkanescht Standard-TamazightZ" + - "uni-SproochKeng SproochinhalterZazaModernt HéicharabeschÉisträichesc" + - "ht DäitschSchwäizer HéichdäitschAustralescht EngleschKanadescht Engl" + - "eschBritescht EngleschAmerikanescht EngleschLatäinamerikanescht Spue" + - "neschEuropäescht SpueneschMexikanescht SpueneschKanadescht Franséisc" + - "hSchwäizer FranséischFlämeschBrasilianescht PortugiseschEuropäescht " + - "PortugiseschMoldaweschSerbo-KroateschKongo-SwahiliChinesesch (verein" + - "facht)Chinesesch (traditionell)", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000e, 0x0017, 0x0020, 0x0024, 0x002d, 0x0039, - 0x0041, 0x004c, 0x0054, 0x005a, 0x006b, 0x0077, 0x0085, 0x008f, - 0x0096, 0x00a5, 0x00af, 0x00b8, 0x00c2, 0x00ca, 0x00d5, 0x00e4, - 0x00f4, 0x00fc, 0x0100, 0x010b, 0x011a, 0x0128, 0x0131, 0x0139, - 0x0141, 0x014b, 0x0155, 0x0160, 0x016a, 0x0172, 0x017b, 0x0184, - 0x018c, 0x0194, 0x019c, 0x019f, 0x01a7, 0x01b4, 0x01be, 0x01c9, - 0x01d6, 0x01dc, 0x01f1, 0x01fa, 0x0201, 0x0209, 0x020d, 0x0212, - 0x021c, 0x0221, 0x022a, 0x0233, 0x023e, 0x0247, 0x0250, 0x025e, - // Entry 40 - 7F - 0x0269, 0x0274, 0x027f, 0x028b, 0x0295, 0x029c, 0x02a7, 0x02b2, - 0x02bd, 0x02c5, 0x02ce, 0x02d7, 0x02e0, 0x02ec, 0x02fa, 0x0302, - 0x030c, 0x031a, 0x0329, 0x0330, 0x033a, 0x0348, 0x0354, 0x035c, - 0x0368, 0x0370, 0x037a, 0x0381, 0x0390, 0x039d, 0x03a8, 0x03af, - 0x03b7, 0x03c0, 0x03cc, 0x03d4, 0x03e5, 0x03f4, 0x03f9, 0x0404, - 0x040d, 0x0417, 0x041e, 0x0427, 0x0431, 0x043b, 0x0444, 0x0458, - 0x0463, 0x0469, 0x0475, 0x0487, 0x0499, 0x04ad, 0x04b3, 0x04c1, - 0x04cc, 0x04da, 0x04df, 0x04e4, 0x04ed, 0x04fa, 0x04fe, 0x0506, - // Entry 80 - BF - 0x050d, 0x0519, 0x0520, 0x052e, 0x053b, 0x0545, 0x054d, 0x0556, - 0x055e, 0x0566, 0x056c, 0x0577, 0x057c, 0x0589, 0x0593, 0x059d, - 0x05a7, 0x05ac, 0x05b2, 0x05bb, 0x05c3, 0x05c8, 0x05da, 0x05e6, - 0x05f0, 0x05f7, 0x0600, 0x0606, 0x0612, 0x061f, 0x0627, 0x0632, - 0x0640, 0x0649, 0x0652, 0x0658, 0x0661, 0x066a, 0x0673, 0x067d, - 0x0681, 0x068a, 0x0697, 0x06a4, 0x06ac, 0x06b7, 0x06bc, 0x06c1, - 0x06c9, 0x06cf, 0x06d5, 0x06df, 0x06e3, 0x06ef, 0x06fd, 0x0704, - 0x070f, 0x0722, 0x072a, 0x072f, 0x073b, 0x0744, 0x074b, 0x0754, - // Entry C0 - FF - 0x075b, 0x0767, 0x0771, 0x0777, 0x0781, 0x078b, 0x0791, 0x07a0, - 0x07b3, 0x07b3, 0x07c1, 0x07d7, 0x07ea, 0x07f8, 0x0812, 0x081e, - 0x0824, 0x082a, 0x0836, 0x0841, 0x0849, 0x0856, 0x085b, 0x0865, - 0x0871, 0x0878, 0x0885, 0x088b, 0x088f, 0x0894, 0x089a, 0x089a, - 0x08a5, 0x08b2, 0x08be, 0x08ca, 0x08cd, 0x08de, 0x08e9, 0x08f5, - 0x0900, 0x0906, 0x090a, 0x0910, 0x091a, 0x0925, 0x0929, 0x092d, - 0x0934, 0x0939, 0x0942, 0x0948, 0x094d, 0x0954, 0x0958, 0x0967, - 0x0974, 0x097e, 0x0982, 0x0989, 0x0990, 0x0999, 0x09a1, 0x09a9, - // Entry 100 - 13F - 0x09af, 0x09b7, 0x09bf, 0x09cc, 0x09cc, 0x09d7, 0x09e5, 0x09ef, - 0x09f4, 0x0a04, 0x0a09, 0x0a0f, 0x0a1c, 0x0a21, 0x0a26, 0x0a34, - 0x0a41, 0x0a46, 0x0a59, 0x0a63, 0x0a70, 0x0a76, 0x0a7c, 0x0a80, - 0x0a8b, 0x0a94, 0x0a9a, 0x0aa2, 0x0ab1, 0x0ab9, 0x0abf, 0x0acd, - 0x0adb, 0x0ae3, 0x0aed, 0x0af8, 0x0afd, 0x0b0f, 0x0b1c, 0x0b2f, - 0x0b3c, 0x0b48, 0x0b51, 0x0b5b, 0x0b65, 0x0b73, 0x0b77, 0x0b84, - 0x0b99, 0x0b9d, 0x0baa, 0x0bb0, 0x0bc5, 0x0bd5, 0x0be1, 0x0bee, - 0x0bf7, 0x0bfe, 0x0c0b, 0x0c17, 0x0c29, 0x0c2e, 0x0c36, 0x0c43, - // Entry 140 - 17F - 0x0c52, 0x0c5f, 0x0c6f, 0x0c78, 0x0c85, 0x0c97, 0x0ca1, 0x0cad, - 0x0cba, 0x0cca, 0x0cce, 0x0cd2, 0x0cd8, 0x0ce7, 0x0cf2, 0x0cfc, - 0x0d12, 0x0d18, 0x0d1e, 0x0d25, 0x0d36, 0x0d47, 0x0d4f, 0x0d5d, - 0x0d66, 0x0d74, 0x0d77, 0x0d7c, 0x0d80, 0x0d8c, 0x0d93, 0x0d97, - 0x0d9e, 0x0daa, 0x0db1, 0x0db5, 0x0dbd, 0x0dca, 0x0dd1, 0x0ddd, - 0x0de3, 0x0dec, 0x0df0, 0x0df8, 0x0e08, 0x0e14, 0x0e1b, 0x0e27, - 0x0e35, 0x0e4e, 0x0e52, 0x0e5b, 0x0e64, 0x0e71, 0x0e79, 0x0e7e, - 0x0e85, 0x0e8f, 0x0e9e, 0x0ea4, 0x0ea9, 0x0eaf, 0x0ebc, 0x0ec4, - // Entry 180 - 1BF - 0x0ed6, 0x0edf, 0x0ee6, 0x0ef4, 0x0eff, 0x0f04, 0x0f11, 0x0f11, - 0x0f1d, 0x0f27, 0x0f36, 0x0f43, 0x0f4e, 0x0f5c, 0x0f64, 0x0f79, - 0x0f88, 0x0f93, 0x0f97, 0x0f9d, 0x0fa5, 0x0fb1, 0x0fc0, 0x0fce, - 0x0fd2, 0x0fd8, 0x0fe4, 0x0ff1, 0x0ffd, 0x1005, 0x1012, 0x1020, - 0x1027, 0x1035, 0x1048, 0x1055, 0x1064, 0x1072, 0x107f, 0x1088, - 0x108f, 0x109c, 0x10ac, 0x10b8, 0x10bf, 0x10c7, 0x10cc, 0x10dd, - 0x10e8, 0x10fa, 0x1108, 0x110c, 0x111a, 0x1120, 0x112c, 0x1138, - 0x113f, 0x1145, 0x114e, 0x1153, 0x115d, 0x1163, 0x1169, 0x117b, - // Entry 1C0 - 1FF - 0x117f, 0x1188, 0x1198, 0x11a0, 0x11a5, 0x11aa, 0x11b7, 0x11c0, - 0x11d2, 0x11e1, 0x11f3, 0x11fd, 0x1202, 0x120c, 0x120c, 0x1220, - 0x122d, 0x1237, 0x124a, 0x1255, 0x1262, 0x126a, 0x1276, 0x127f, - 0x128e, 0x129d, 0x12b9, 0x12c3, 0x12d8, 0x12e6, 0x12ee, 0x12f5, - 0x12fa, 0x1300, 0x130b, 0x1315, 0x131c, 0x1326, 0x1329, 0x1338, - 0x1341, 0x134e, 0x1355, 0x135a, 0x1361, 0x136b, 0x1372, 0x1377, - 0x1383, 0x138d, 0x1399, 0x1399, 0x139f, 0x13a3, 0x13a7, 0x13b1, - 0x13bc, 0x13c4, 0x13cf, 0x13d9, 0x13e6, 0x13f9, 0x13ff, 0x140f, - // Entry 200 - 23F - 0x1416, 0x1421, 0x142e, 0x143c, 0x144a, 0x1459, 0x1461, 0x146b, - 0x1478, 0x147c, 0x148a, 0x1498, 0x149c, 0x14a5, 0x14ae, 0x14b7, - 0x14be, 0x14c8, 0x14cc, 0x14d1, 0x14d5, 0x14e3, 0x14f0, 0x14f5, - 0x1500, 0x150d, 0x1518, 0x1523, 0x1532, 0x1539, 0x1540, 0x154e, - 0x155c, 0x1562, 0x1568, 0x1572, 0x1583, 0x158a, 0x1599, 0x15a5, - 0x15ac, 0x15b5, 0x15ce, 0x15d8, 0x15e2, 0x15f0, 0x15f4, 0x15ff, - 0x1608, 0x1610, 0x161d, 0x162b, 0x1632, 0x1636, 0x163b, 0x164b, - 0x1659, 0x165e, 0x166b, 0x166b, 0x1678, 0x1684, 0x1697, 0x169b, - // Entry 240 - 27F - 0x16a6, 0x16af, 0x16b6, 0x16bb, 0x16c4, 0x16d0, 0x16db, 0x16e9, - 0x16f5, 0x16fb, 0x171b, 0x1727, 0x173b, 0x173f, 0x1755, 0x1755, - 0x176e, 0x1787, 0x179c, 0x17af, 0x17c1, 0x17d7, 0x17f5, 0x180b, - 0x1821, 0x1821, 0x1837, 0x184d, 0x184d, 0x1856, 0x1871, 0x188a, - 0x1894, 0x18a3, 0x18b0, 0x18c8, 0x18e1, - }, - }, - { // lg - "Lu-akaaniLu-amharikiLuwarabuLubelarusiLubulugariyaLubengaliLuceekeLudaak" + - "iLugereeki/LuyonaaniLungerezaLusipanyaLuperusiLufalansaLuhawuzaLuhin" + - "duLuhangareLuyindonezyaLuyiboLuyitaleLujapaniLunnajjavaLukmeLukoreya" + - "LugandaLumalayiLubbamaLunepaliLuholandiLupunjabiLupolandiLupotugiizi" + - "LulomaniyaLulasaLunarwandaLusomaliyaLuswideniLutamiiruLuttaayiLutake" + - "LuyukurayineLu-uruduLuvyetinaamuLuyorubaLucayinaLuzzulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0014, 0x0014, - 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x0026, 0x0032, - 0x0032, 0x0032, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0049, 0x0049, 0x0049, 0x0049, 0x005c, 0x0065, 0x0065, 0x006e, - 0x006e, 0x006e, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x007f, - 0x007f, 0x007f, 0x007f, 0x007f, 0x007f, 0x007f, 0x007f, 0x0087, - 0x0087, 0x008e, 0x008e, 0x008e, 0x008e, 0x0097, 0x0097, 0x0097, - // Entry 40 - 7F - 0x0097, 0x00a3, 0x00a3, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, - 0x00b1, 0x00b1, 0x00b9, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, - 0x00c3, 0x00c3, 0x00c8, 0x00c8, 0x00d0, 0x00d0, 0x00d0, 0x00d0, - 0x00d0, 0x00d0, 0x00d0, 0x00d0, 0x00d0, 0x00d7, 0x00d7, 0x00d7, - 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, - 0x00d7, 0x00d7, 0x00d7, 0x00df, 0x00df, 0x00e6, 0x00e6, 0x00e6, - 0x00ee, 0x00ee, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, - 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x0100, 0x0100, 0x0109, - // Entry 80 - BF - 0x0109, 0x0114, 0x0114, 0x0114, 0x0114, 0x011e, 0x0124, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, - 0x0141, 0x0141, 0x014a, 0x014a, 0x014a, 0x0152, 0x0152, 0x0152, - 0x0152, 0x0152, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0164, - 0x016c, 0x016c, 0x016c, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, - 0x0178, 0x0180, 0x0180, 0x0188, 0x018f, - }, - }, - { // lkt - "Abkhaz IyápiAvestan IyápiAfrikaans IyápiAmharic IyápiArab IyápiAssamese " + - "IyápiAvaric IyápiAzerbaijani IyápiBashkir IyápiBelarus IyápiBulgar I" + - "yápiBengali IyápiTibetan IyápiBosnia IyápiCatalan IyápiChechen Iyápi" + - "Maštíŋča Oyáte IyápiCzech IyápiChuvash IyápiWales IyápiDane IyápiIyá" + - "šiča IyápiGreece IyápiWašíčuiyapiEsperanto IyápiSpayóla IyápiEstoni" + - "a IyápiBasque IyápiPersian IyápiFinnish IyápiFiji IyápiFaroese Iyápi" + - "Wašíču Ikčéka IyápiIrish IyápiGalician IyápiGuarani IyápiGujarati Iy" + - "ápiHausa IyápiHebrew IyápiHindi IyápiCroatian IyápiHaiti IyápiHunga" + - "ry IyápiArmenia IyápiIndonesia IyápiIgbo IyápiIceland IyápiItalia Iy" + - "ápiKisúŋla IyápiJava IyápiGeoria IyápiKazakh IyápiKhmer IyápiKannad" + - "a IyápiKorea IyápiKashmir IyápiKurd IyápiKirghiz IyápiLatin IyápiLux" + - "embourg IyápiLao IyápiLithuania IyápiltLatvia IyápiMalagasy IyápiMao" + - "ri IyápiMacedonia IyápiMalayalam IyápiMarathi IyápiMalay IyápiMaltes" + - "e IyápiBurmese IyápiNepal IyápiDutch IyápiŠináglegleǧa IyápiȞaȟátȟuŋ" + - "waŋ IyápiOriya IyápiPunjabi IyápiPolish IyápiPashto IyápiPortuguese " + - "IyápiQuechua IyápiRomansh IyápiRomanian IyápiRussia IyápiSanskrit Iy" + - "ápiSindhi IyápiSinhala IyápiSlovak IyápiSlovenian IyápiSomali Iyápi" + - "Albanian IyápiSerbia IyápiSundanese IyápiSwedish IyápiSwahili IyápiT" + - "amil IyápiTelugu IyápiTajik IyápiThai IyápiTigrinya IyápiTurkmen Iyá" + - "piTongan IyápiTurkish IyápiTatar IyápiUyghur IyápiUkrain IyápiUrdu I" + - "yápiUzbek IyápiVietnamese IyápiWolof IyápiXhosa IyápiYoruba IyápiPȟe" + - "čhókaŋ Háŋska IyápiZulu IyápiAdyghe IyápiItóǧata Altai IyápiMaȟpíya" + - " Tȟó IyápiBaluchi IyápiBamun IyápiBeja IyápiBuriat IyápiMari IyápiCh" + - "erokee IyápiŠahíyela IyápiCoptic IyápiCrimean Turkish IyápiDakȟótiya" + - "piDargwa IyápiDogri IyápiFilipino IyápiGbaya IyápiHawaiian IyápiIngu" + - "sh IyápiKara-Kalpak IyápiKabardian IyápiLahnda IyápiLakȟólʼiyapiMizo" + - " IyápiNamipuri IyápiComonian IyápiTukté iyápi tȟaŋíŋ šniZaza IyápiŠa" + - "gláša WašíčuiyapiMílahaŋska WašíčuiyapiWiyóȟpeyata Spayóla IyápiSpay" + - "ólaȟča IyápiFlemish IyápiPȟečhókaŋ Háŋska Iyápi IkčékaPȟečhókaŋ Háŋ" + - "ska Iyápi Ȟče", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000d, 0x001b, 0x002b, 0x002b, 0x0039, 0x0039, - 0x0044, 0x0053, 0x0060, 0x0060, 0x0072, 0x0080, 0x008e, 0x009b, - 0x009b, 0x009b, 0x00a9, 0x00b7, 0x00b7, 0x00c4, 0x00d2, 0x00e0, - 0x00e0, 0x00e0, 0x00fa, 0x0106, 0x0106, 0x0114, 0x0120, 0x012b, - 0x013c, 0x013c, 0x013c, 0x013c, 0x0149, 0x0157, 0x0167, 0x0176, - 0x0184, 0x0191, 0x019f, 0x019f, 0x01ad, 0x01b8, 0x01c6, 0x01df, - 0x01df, 0x01eb, 0x01eb, 0x01fa, 0x0208, 0x0217, 0x0217, 0x0223, - 0x0230, 0x023c, 0x023c, 0x024b, 0x0257, 0x0265, 0x0273, 0x0273, - // Entry 40 - 7F - 0x0273, 0x0283, 0x0283, 0x028e, 0x028e, 0x028e, 0x028e, 0x029c, - 0x02a9, 0x02a9, 0x02b9, 0x02c4, 0x02d1, 0x02d1, 0x02d1, 0x02d1, - 0x02de, 0x02de, 0x02ea, 0x02f8, 0x0304, 0x0304, 0x0312, 0x031d, - 0x031d, 0x031d, 0x032b, 0x0337, 0x0348, 0x0348, 0x0348, 0x0348, - 0x0352, 0x0364, 0x0364, 0x0371, 0x0380, 0x0380, 0x038c, 0x039c, - 0x03ac, 0x03ac, 0x03ba, 0x03c6, 0x03d4, 0x03e2, 0x03e2, 0x03e2, - 0x03ee, 0x03ee, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x0410, 0x0410, - 0x0410, 0x0428, 0x0428, 0x0434, 0x0434, 0x0442, 0x0442, 0x044f, - // Entry 80 - BF - 0x045c, 0x046d, 0x047b, 0x0489, 0x0489, 0x0498, 0x04a5, 0x04a5, - 0x04b4, 0x04b4, 0x04c1, 0x04c1, 0x04c1, 0x04cf, 0x04dc, 0x04ec, - 0x04ec, 0x04ec, 0x04f9, 0x0508, 0x0515, 0x0515, 0x0515, 0x0525, - 0x0533, 0x0541, 0x054d, 0x055a, 0x0566, 0x0571, 0x0580, 0x058e, - 0x058e, 0x059b, 0x05a9, 0x05a9, 0x05b5, 0x05b5, 0x05c2, 0x05cf, - 0x05da, 0x05e6, 0x05e6, 0x05f7, 0x05f7, 0x05f7, 0x0603, 0x060f, - 0x060f, 0x061c, 0x061c, 0x0639, 0x0644, 0x0644, 0x0644, 0x0644, - 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, - // Entry C0 - FF - 0x0651, 0x0667, 0x0667, 0x0667, 0x0667, 0x0667, 0x0667, 0x067d, - 0x067d, 0x067d, 0x067d, 0x067d, 0x067d, 0x067d, 0x067d, 0x067d, - 0x067d, 0x067d, 0x068b, 0x068b, 0x068b, 0x068b, 0x0697, 0x0697, - 0x0697, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, - 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, - 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06af, 0x06af, 0x06af, 0x06af, - 0x06af, 0x06af, 0x06af, 0x06af, 0x06af, 0x06af, 0x06af, 0x06af, - 0x06af, 0x06af, 0x06ba, 0x06ba, 0x06ba, 0x06ba, 0x06c9, 0x06da, - // Entry 100 - 13F - 0x06da, 0x06e7, 0x06e7, 0x06fd, 0x06fd, 0x06fd, 0x070a, 0x0717, - 0x0717, 0x0717, 0x0717, 0x0717, 0x0717, 0x0717, 0x0723, 0x0723, - 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, - 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, - 0x0723, 0x0732, 0x0732, 0x0732, 0x0732, 0x0732, 0x0732, 0x0732, - 0x0732, 0x0732, 0x0732, 0x0732, 0x0732, 0x0732, 0x0732, 0x073e, - 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, - 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, - // Entry 140 - 17F - 0x073e, 0x073e, 0x073e, 0x074d, 0x074d, 0x074d, 0x074d, 0x074d, - 0x074d, 0x074d, 0x074d, 0x074d, 0x074d, 0x074d, 0x075a, 0x075a, - 0x075a, 0x075a, 0x075a, 0x075a, 0x075a, 0x075a, 0x075a, 0x076c, - 0x076c, 0x076c, 0x076c, 0x076c, 0x076c, 0x077c, 0x077c, 0x077c, - 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, - 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, - 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, - 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x0789, 0x0789, 0x0789, - // Entry 180 - 1BF - 0x0789, 0x0789, 0x0789, 0x0798, 0x0798, 0x0798, 0x0798, 0x0798, - 0x0798, 0x0798, 0x0798, 0x0798, 0x0798, 0x07a3, 0x07a3, 0x07a3, - 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, - 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, - 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - // Entry 1C0 - 1FF - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - // Entry 200 - 23F - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, - 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07c1, 0x07c1, - 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, - 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, - 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, - 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07de, 0x07de, - 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, - 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, - // Entry 240 - 27F - 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, - 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07e9, 0x07e9, 0x07e9, - 0x07e9, 0x07e9, 0x07e9, 0x07e9, 0x0802, 0x081d, 0x083a, 0x084e, - 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, 0x085c, 0x085c, 0x085c, - 0x085c, 0x085c, 0x085c, 0x0882, 0x08a5, - }, - }, - { // ln - "akanliamarikilialabolibyelorisílibiligalilibengalilitshekɛlialemáligelek" + - "ilingɛlɛ́salisipanyelipelésanɛlifalansɛ́hausalihindiliongililindonez" + - "iigbolitalianolizapɔlizavalikambodzalikoreyalingálalimalezilibilimál" + - "inepalɛlifalamálipendzabilipolonɛlipulutugɛ́siliromanilirisíkinyarwa" + - "ndalisomalilisuwedɛlitamulilitayelitilikilikrɛniliurduliviyetinámiyo" + - "rubalisinwazulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000d, 0x000d, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0020, 0x002a, - 0x002a, 0x002a, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x004c, 0x0059, 0x0059, 0x0062, - 0x0062, 0x0062, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x007a, - 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007f, - 0x007f, 0x0086, 0x0086, 0x0086, 0x0086, 0x008e, 0x008e, 0x008e, - // Entry 40 - 7F - 0x008e, 0x0097, 0x0097, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, - 0x00a4, 0x00a4, 0x00ab, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, - 0x00b1, 0x00b1, 0x00bb, 0x00bb, 0x00c3, 0x00c3, 0x00c3, 0x00c3, - 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00d3, 0x00d3, 0x00dc, 0x00dc, 0x00dc, - 0x00e5, 0x00e5, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, - 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00f8, 0x00f8, 0x0101, - // Entry 80 - BF - 0x0101, 0x0110, 0x0110, 0x0110, 0x0110, 0x0118, 0x011f, 0x012a, - 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, - 0x012a, 0x012a, 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, - 0x013b, 0x013b, 0x0143, 0x0143, 0x0143, 0x0149, 0x0149, 0x0149, - 0x0149, 0x0149, 0x0151, 0x0151, 0x0151, 0x0151, 0x0151, 0x0159, - 0x015f, 0x015f, 0x015f, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x0172, 0x0172, 0x0179, 0x017d, - }, - }, - { // lo - loLangStr, - loLangIdx, - }, - { // lrc - "آذأربایئجانیآفریکانسآکانأمھأریأرأڤیآسامیآذأربایئجانی ھارگەباشکیریبئلاروٙ" + - "سیبولغاریبامبارابأنگالیتأبأتیبئرئتونبوسنیاییکاتالانچئچئنیکوریسکانچو" + - "اشیڤئلزیدانمارکیآلمانیزوٙنگخائڤئیوٙنانیئینگیلیسیئسپئرانتوئسپانیاییئ" + - "ستونیاییباسکیفارسیفأنلاندیفیجیفاروٙسیفآرانسئ ئیفئریسی أفتونئشینئیرل" + - "أندیگالیسیگوٙآرانیگوجأراتیمانکسھائوساعئبریھئنیکوروڤاتیھاییتیمأجاریأ" + - "رمأنیأندونئزیاییئیگبوسی چوان ییئیسلأندیئیتالیاییئینوکتیتوٙتجاپوٙنیج" + - "اڤئ ییگورجیکیکیوٙقأزاقکالالیسوٙتخئمئرکانادکورئ ییکأشمیریکوردی کورما" + - "نجیکورنیشقئرقیزیلاتینلوٙکزامبوٙرگیگاندالینگالالاولیتوڤانیاییلوٙبا ک" + - "اتانگالاتوڤیاییمالاگاشیمائوریمأقدوٙنیمالایامموغولیمأراتیمالاییمالتی" + - "بئرمئ یینئدئبئلئ شومالینئپالیھولأندینورڤئجی نینورسکنورڤئجی بوٙکمالئ" + - "وروموٙئوریاپأنجابیلأھئستانیپأشتوٙپورتئغالیکوچوٙارومانشراندیرومانیای" + - "یروٙسیکینیاروآنداسانسکئریتسئندیسامی شومالیسانگوسینھالائسلوڤاکیئسلوڤ" + - "ئنیاییشوناسوٙمالیآلبانیسئربیسوٙدانیسوٙئدیسأڤاحیلیتامیلتئلئگوتاجیکیت" + - "ایلأندیتیگرینیاتورکأمأنیتوٙنگانتورکیتاتارئویغوٙرئوکراینیئوردوٙئوزبأ" + - "کیڤییئتنامیڤولوفخوٙسایوروباچینیزولوآقئمماپوٙچئآسوٙبیمابئنابألوٙچی أ" + - "قتوٙنئشینبودوچیگاچوروٙکیکوردی سوٙرانیتایتازارماسوربی ھاریدوٙالاجولا" + - " فوٙنییئمبوفیلیپینیگاگائوزآلمانی سوٙئیسیگوٙسیھاڤاییسوربی ڤارونئگوٙمب" + - "اماچامئکابیلئکامباماکوٙندئکاباردینوکی یورا چینیکالئجینکومی پئرمیاکک" + - "وٙنکانیشامبالابافیالانگیلاکوٙتالۊری شومالیلوٙلوٙئیاماساییمئروموٙریس" + - "یماخوڤا میتومئتاٛموٙھاڤکموٙندانگمازأندأرانیناماآلمانی ھاریکئڤاسیوٙن" + - "ئکوٙنیوٙئرنیان کوٙلئکیچیرومبورئڤاسامبوٙروٙسانگوٙکوردی ھارگەسئناکیار" + - "ابورو سئنیتاچئلھیتسامی ھارگەلۉلئ سامیئیناری سامیئسکولت سامیتئسوتاسا" + - "ڤاقتامازیغ مینجاییزوٙن نادیارڤایڤوٙنجوٙڤارلپیریسوٙگاتامازیغ مأراکئش" + - "یبی نئشوٙعروی مدرنآذأری ھارگەآلمانی ئوتریشیآلمانی سوٙییسیئینگیلیسی " + - "ئوستارالیاییئینگیلیسی کاناداییئینگیلیسی بئریتانیاییئینگیلیسی ئمریکا" + - "ییئسپانیایی ئمریکا لاتینئسپانیایی ئوروٙپائسپانیایی مئکزیکفآرانسئ ئی" + - " کانادافآرانسئ ئی سوٙییسآلمانی ھارگە جافئلاماندیپورتئغالی بئرئزیلپور" + - "تئغالی ئوروٙپاییرومانیایی مولداڤیسأڤاحیلی کونگوچینی سادە بیەچینی سو" + - "نأتی", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0018, 0x0018, 0x0028, 0x0030, 0x003c, 0x003c, - 0x0046, 0x0050, 0x0050, 0x0050, 0x0073, 0x0081, 0x0093, 0x00a1, - 0x00a1, 0x00af, 0x00bd, 0x00c9, 0x00d7, 0x00e7, 0x00f5, 0x0101, - 0x0101, 0x0111, 0x0111, 0x0111, 0x0111, 0x011b, 0x0125, 0x0135, - 0x0141, 0x0141, 0x014f, 0x0155, 0x0163, 0x0175, 0x0187, 0x0199, - 0x01ab, 0x01b5, 0x01bf, 0x01bf, 0x01cf, 0x01d7, 0x01e5, 0x01f8, - 0x0217, 0x0227, 0x0227, 0x0233, 0x0243, 0x0253, 0x025d, 0x0269, - 0x0273, 0x027b, 0x027b, 0x028b, 0x0297, 0x02a3, 0x02af, 0x02af, - // Entry 40 - 7F - 0x02af, 0x02c5, 0x02c5, 0x02cf, 0x02e1, 0x02e1, 0x02e1, 0x02f1, - 0x0303, 0x0319, 0x0327, 0x0334, 0x033e, 0x033e, 0x034a, 0x034a, - 0x0354, 0x0368, 0x0372, 0x037c, 0x0389, 0x0389, 0x0397, 0x03b2, - 0x03b2, 0x03be, 0x03cc, 0x03d6, 0x03f0, 0x03fa, 0x03fa, 0x0408, - 0x040e, 0x0424, 0x043d, 0x044f, 0x045f, 0x045f, 0x046b, 0x047b, - 0x0489, 0x0495, 0x04a1, 0x04ad, 0x04b7, 0x04c6, 0x04c6, 0x04e3, - 0x04ef, 0x04ef, 0x04fd, 0x051a, 0x0537, 0x0537, 0x0537, 0x0537, - 0x0537, 0x0537, 0x0545, 0x054f, 0x054f, 0x055d, 0x055d, 0x056f, - // Entry 80 - BF - 0x057b, 0x058d, 0x0599, 0x05a5, 0x05af, 0x05c1, 0x05cb, 0x05e1, - 0x05f3, 0x05f3, 0x05fd, 0x0612, 0x061c, 0x062a, 0x063a, 0x0650, - 0x0650, 0x0658, 0x0666, 0x0672, 0x067c, 0x067c, 0x067c, 0x068a, - 0x0696, 0x06a6, 0x06b0, 0x06bc, 0x06c8, 0x06d8, 0x06e8, 0x06fa, - 0x06fa, 0x0708, 0x0712, 0x0712, 0x071c, 0x071c, 0x072a, 0x073a, - 0x0746, 0x0754, 0x0754, 0x0766, 0x0766, 0x0766, 0x0770, 0x077a, - 0x077a, 0x0786, 0x0786, 0x078e, 0x0796, 0x0796, 0x0796, 0x0796, - 0x0796, 0x0796, 0x0796, 0x079e, 0x079e, 0x079e, 0x079e, 0x079e, - // Entry C0 - FF - 0x079e, 0x079e, 0x079e, 0x079e, 0x079e, 0x07ac, 0x07ac, 0x07ac, - 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07b4, 0x07b4, 0x07b4, - 0x07b4, 0x07b4, 0x07b4, 0x07b4, 0x07b4, 0x07b4, 0x07b4, 0x07b4, - 0x07b4, 0x07b4, 0x07bc, 0x07bc, 0x07c4, 0x07c4, 0x07c4, 0x07e7, - 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07e7, - 0x07e7, 0x07e7, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, - 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07f7, 0x07f7, - 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x0805, 0x0805, - // Entry 100 - 13F - 0x081e, 0x081e, 0x081e, 0x081e, 0x081e, 0x081e, 0x081e, 0x081e, - 0x0828, 0x0828, 0x0828, 0x0828, 0x0828, 0x0832, 0x0832, 0x0845, - 0x0845, 0x0851, 0x0851, 0x0866, 0x0866, 0x0866, 0x086e, 0x086e, - 0x086e, 0x086e, 0x086e, 0x086e, 0x086e, 0x086e, 0x086e, 0x086e, - 0x086e, 0x087e, 0x087e, 0x087e, 0x087e, 0x087e, 0x087e, 0x087e, - 0x087e, 0x087e, 0x087e, 0x087e, 0x088c, 0x088c, 0x088c, 0x088c, - 0x088c, 0x088c, 0x088c, 0x088c, 0x088c, 0x088c, 0x088c, 0x088c, - 0x088c, 0x088c, 0x088c, 0x088c, 0x08a7, 0x08a7, 0x08a7, 0x08b1, - // Entry 140 - 17F - 0x08b1, 0x08b1, 0x08b1, 0x08bd, 0x08bd, 0x08bd, 0x08bd, 0x08bd, - 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, - 0x08d0, 0x08d0, 0x08e0, 0x08ec, 0x08ec, 0x08ec, 0x08ec, 0x08ec, - 0x08f8, 0x08f8, 0x08f8, 0x0902, 0x0902, 0x0902, 0x0902, 0x0902, - 0x0912, 0x0924, 0x0924, 0x0924, 0x0924, 0x0924, 0x0924, 0x093a, - 0x093a, 0x093a, 0x093a, 0x0948, 0x0948, 0x095f, 0x096f, 0x096f, - 0x096f, 0x096f, 0x096f, 0x096f, 0x096f, 0x096f, 0x097d, 0x0987, - 0x0987, 0x0987, 0x0987, 0x0987, 0x0991, 0x0991, 0x0991, 0x0991, - // Entry 180 - 1BF - 0x0991, 0x0991, 0x0991, 0x099f, 0x099f, 0x099f, 0x099f, 0x09b4, - 0x09b4, 0x09b4, 0x09b4, 0x09b4, 0x09ba, 0x09ba, 0x09c6, 0x09c6, - 0x09c6, 0x09c6, 0x09c6, 0x09c6, 0x09c6, 0x09c6, 0x09c6, 0x09d2, - 0x09d2, 0x09d2, 0x09d2, 0x09d2, 0x09da, 0x09e8, 0x09e8, 0x09fd, - 0x0a07, 0x0a07, 0x0a07, 0x0a07, 0x0a07, 0x0a15, 0x0a15, 0x0a15, - 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, - 0x0a3b, 0x0a3b, 0x0a3b, 0x0a43, 0x0a58, 0x0a58, 0x0a58, 0x0a58, - 0x0a58, 0x0a68, 0x0a68, 0x0a68, 0x0a68, 0x0a68, 0x0a72, 0x0a72, - // Entry 1C0 - 1FF - 0x0a7e, 0x0a7e, 0x0a7e, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, - 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, - 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, - 0x0a91, 0x0a99, 0x0a99, 0x0a99, 0x0a99, 0x0a99, 0x0a99, 0x0a99, - 0x0aa3, 0x0aa3, 0x0aa3, 0x0aa3, 0x0aa3, 0x0aa3, 0x0aab, 0x0aab, - 0x0aab, 0x0aab, 0x0abd, 0x0abd, 0x0abd, 0x0abd, 0x0abd, 0x0ac9, - 0x0ac9, 0x0ac9, 0x0ac9, 0x0ade, 0x0ade, 0x0ae6, 0x0ae6, 0x0ae6, - 0x0b01, 0x0b01, 0x0b01, 0x0b11, 0x0b11, 0x0b11, 0x0b11, 0x0b11, - // Entry 200 - 23F - 0x0b11, 0x0b24, 0x0b35, 0x0b4a, 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, - 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, - 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, 0x0b67, 0x0b67, 0x0b67, 0x0b67, - 0x0b67, 0x0b67, 0x0b67, 0x0b67, 0x0b67, 0x0b67, 0x0b67, 0x0b67, - 0x0b67, 0x0b67, 0x0b67, 0x0b67, 0x0b67, 0x0b67, 0x0b67, 0x0b67, - 0x0b75, 0x0b75, 0x0b92, 0x0b92, 0x0b92, 0x0b92, 0x0ba7, 0x0bad, - 0x0bad, 0x0bad, 0x0bad, 0x0bad, 0x0bad, 0x0bad, 0x0bbb, 0x0bbb, - 0x0bbb, 0x0bbb, 0x0bbb, 0x0bcb, 0x0bcb, 0x0bcb, 0x0bcb, 0x0bd5, - // Entry 240 - 27F - 0x0bd5, 0x0bd5, 0x0bd5, 0x0bd5, 0x0bd5, 0x0bd5, 0x0bd5, 0x0bd5, - 0x0bd5, 0x0bd5, 0x0bf4, 0x0bf4, 0x0c03, 0x0c03, 0x0c14, 0x0c29, - 0x0c44, 0x0c5f, 0x0c8a, 0x0cad, 0x0cd6, 0x0cf9, 0x0d23, 0x0d44, - 0x0d63, 0x0d63, 0x0d83, 0x0da3, 0x0dbf, 0x0dd1, 0x0df2, 0x0e17, - 0x0e38, 0x0e38, 0x0e53, 0x0e6b, 0x0e80, - }, - }, - { // lt - ltLangStr, - ltLangIdx, - }, - { // lu - "LiakanLiamharikiArabiBelarusiBulegariBengaliTshekiLizelumaniGilikiLingel" + - "esaLihispaniaMpepajemiMfwàlànsaHausaHindiHongiliLindoneziaIgboLitali" + - "LiyapaniJavaLikoreyaTshilubaLimalezianepaliolandiLipunjabiMpoloniMpu" + - "tulugɛsiLiromaniLirisikinyarwandaLisomaliLisuwidiMtamuiliNtailandiNt" + - "ulukiNkraniUrduLiviyetinamuNyorubashinɛNzulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0010, 0x0010, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001d, 0x0025, - 0x0025, 0x0025, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x003c, 0x003c, 0x003c, 0x003c, 0x0042, 0x004b, 0x004b, 0x0055, - 0x0055, 0x0055, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x006e, - 0x006e, 0x0073, 0x0073, 0x0073, 0x0073, 0x007a, 0x007a, 0x007a, - // Entry 40 - 7F - 0x007a, 0x0084, 0x0084, 0x0088, 0x0088, 0x0088, 0x0088, 0x0088, - 0x008e, 0x008e, 0x0096, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, - 0x00b9, 0x00b9, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, - // Entry 80 - BF - 0x00cf, 0x00db, 0x00db, 0x00db, 0x00db, 0x00e3, 0x00e9, 0x00f4, - 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, - 0x00f4, 0x00f4, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, - 0x0104, 0x0104, 0x010c, 0x010c, 0x010c, 0x0115, 0x0115, 0x0115, - 0x0115, 0x0115, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x0122, - 0x0126, 0x0126, 0x0126, 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, - 0x0132, 0x0139, 0x0139, 0x013f, 0x0144, - }, - }, - { // luo - "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + - "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + - "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + - "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + - "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + - "rubaKichinaKizuluDholuo", - []uint16{ // 397 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, - 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, - 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, - 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, - // Entry 40 - 7F - 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, - 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, - 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, - // Entry 80 - BF - 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, - 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, - 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, - 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, - 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, - 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry C0 - FF - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 100 - 13F - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 140 - 17F - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 180 - 1BF - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x016f, - }, - }, - { // luy - "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + - "ikiLusunguKihispaniaKiajemiKifaransaKihausaLuhindiKihungariKiindones" + - "iaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaKin" + - "epaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKiso" + - "maliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyoru" + - "baKichinaKizuluLuluhia", - []uint16{ // 399 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, - 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0052, 0x0052, 0x005c, - 0x005c, 0x005c, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x006c, - 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x0073, - 0x0073, 0x007a, 0x007a, 0x007a, 0x007a, 0x0083, 0x0083, 0x0083, - // Entry 40 - 7F - 0x0083, 0x008e, 0x008e, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x009e, 0x009e, 0x00a6, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, - 0x00ac, 0x00ac, 0x00b6, 0x00b6, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00c6, 0x00c6, 0x00cd, 0x00cd, 0x00cd, - 0x00d5, 0x00d5, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00e7, 0x00e7, 0x00f0, - // Entry 80 - BF - 0x00f0, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00ff, 0x0105, 0x0110, - 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, - 0x0110, 0x0110, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, - 0x011f, 0x011f, 0x0126, 0x0126, 0x0126, 0x0130, 0x0130, 0x0130, - 0x0130, 0x0130, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0141, - 0x0147, 0x0147, 0x0147, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, - 0x0152, 0x015a, 0x015a, 0x0161, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - // Entry C0 - FF - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - // Entry 100 - 13F - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - // Entry 140 - 17F - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - // Entry 180 - 1BF - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x016e, - }, - }, - { // lv - lvLangStr, - lvLangIdx, - }, - { // mas - "nkʉtʉ́k ɔ́ɔ̄ lAkannkʉtʉ́k ɔ́ɔ̄ lAmharinkʉtʉ́k ɔ́ɔ̄ lmarabunkʉtʉ́k ɔ́ɔ̄ l" + - "Belarusinkʉtʉ́k ɔ́ɔ̄ lBulgarialnkʉtʉ́k ɔ́ɔ̄ lBengalinkʉtʉ́k ɔ́ɔ̄ lch" + - "ekinkʉtʉ́k ɔ́ɔ̄ ljerumaninkʉtʉ́k ɔ́ɔ̄ lgirikinkʉtʉ́k ɔ́ɔ̄ nkɨ́resank" + - "ʉtʉ́k ɔ́ɔ̄ lspaniankʉtʉ́k ɔ́ɔ̄ lpersiankʉtʉ́k ɔ́ɔ̄ faransankʉtʉ́k ɔ" + - "́ɔ̄ hausankʉtʉ́k ɔ́ɔ̄ lmoindinkʉtʉ́k ɔ́ɔ̄ lhungarinkʉtʉ́k ɔ́ɔ̄ Indo" + - "nesiankʉtʉ́k ɔ́ɔ̄ Igbonkʉtʉ́k ɔ́ɔ̄ ltaliannkʉtʉ́k ɔ́ɔ̄ japaninkʉtʉ́k" + - " ɔ́ɔ̄ ljanankʉtʉ́k ɔ́ɔ̄ lkambodiankʉtʉ́k ɔ́ɔ̄ lkoreankʉtʉ́k ɔ́ɔ̄ mal" + - "aynkʉtʉ́k ɔ́ɔ̄ lBurmankʉtʉ́k ɔ́ɔ̄ lnepalinkʉtʉ́k ɔ́ɔ̄ lduchinkʉtʉ́k " + - "ɔ́ɔ̄ lpunjabinkʉtʉ́k ɔ́ɔ̄ lpolandnkʉtʉ́k ɔ́ɔ̄ lportuguesenkʉtʉ́k ɔ́" + - "ɔ̄ lromaniankʉtʉ́k ɔ́ɔ̄ lrusinkʉtʉ́k ɔ́ɔ̄ lruwandankʉtʉ́k ɔ́ɔ̄ lchu" + - "marinkʉtʉ́k ɔ́ɔ̄ lswidinkʉtʉ́k ɔ́ɔ̄ ltamilnkʉtʉ́k ɔ́ɔ̄ ltainkʉtʉ́k ɔ" + - "́ɔ̄ lturukinkʉtʉ́k ɔ́ɔ̄ lkraniankʉtʉ́k ɔ́ɔ̄ lurdunkʉtʉ́k ɔ́ɔ̄ lviet" + - "inamunkʉtʉ́k ɔ́ɔ̄ lyorubankʉtʉ́k ɔ́ɔ̄ lchinankʉtʉ́k ɔ́ɔ̄ lzuluMaa", - []uint16{ // 408 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0019, 0x0034, 0x0034, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x006c, 0x0089, - 0x0089, 0x0089, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, - 0x00a6, 0x00a6, 0x00a6, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, - 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00f8, 0x0116, 0x0116, 0x0131, - 0x0131, 0x0131, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, 0x0167, - 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0180, - 0x0180, 0x019b, 0x019b, 0x019b, 0x019b, 0x01b7, 0x01b7, 0x01b7, - // Entry 40 - 7F - 0x01b7, 0x01d4, 0x01d4, 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, - 0x0207, 0x0207, 0x0221, 0x023a, 0x023a, 0x023a, 0x023a, 0x023a, - 0x023a, 0x023a, 0x0257, 0x0257, 0x0271, 0x0271, 0x0271, 0x0271, - 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, - 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, - 0x0271, 0x0271, 0x0271, 0x028a, 0x028a, 0x02a4, 0x02a4, 0x02a4, - 0x02bf, 0x02bf, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, - 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02f5, 0x02f5, 0x0310, - // Entry 80 - BF - 0x0310, 0x032f, 0x032f, 0x032f, 0x032f, 0x034b, 0x0364, 0x0380, - 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, - 0x0380, 0x0380, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, - 0x03b6, 0x03b6, 0x03d0, 0x03d0, 0x03d0, 0x03e8, 0x03e8, 0x03e8, - 0x03e8, 0x03e8, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x041e, - 0x0437, 0x0437, 0x0437, 0x0455, 0x0455, 0x0455, 0x0455, 0x0455, - 0x0455, 0x0470, 0x0470, 0x048a, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - // Entry C0 - FF - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - // Entry 100 - 13F - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - // Entry 140 - 17F - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - // Entry 180 - 1BF - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a6, - }, - }, - { // mer - "KĩakaniKĩamarĩkiKĩarabuKĩbelarusiKĩbulugĩriaKĩbangiraKĩchekiKĩnjamanĩKĩn" + - "girikiKĩngerethaKĩspĩniKĩpasiaKĩfuransiKĩhausaKĩhĩndiKĩhangarĩKĩindo" + - "nesiaKĩigboKĩitalĩKĩjapaniKĩjavaKĩkambodiaKĩkoreaKĩmalesiaKĩburmaKĩn" + - "epaliKĩholandiKĩpunjabuKĩpolandiKĩpochogoKĩromaniaKĩrashiaKĩrwandaKĩ" + - "somaliKĩswideniKĩtamiluKĩthailandiKĩtakĩKĩukirĩniKĩurduKĩvietinamuKĩ" + - "yorubaKĩchinaKĩzuluKĩmĩrũ", - []uint16{ // 413 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0013, 0x0013, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x0026, 0x0033, - 0x0033, 0x0033, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, - 0x003d, 0x003d, 0x003d, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0050, 0x0050, 0x0050, 0x0050, 0x005a, 0x0065, 0x0065, 0x006e, - 0x006e, 0x006e, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0088, - 0x0088, 0x0091, 0x0091, 0x0091, 0x0091, 0x009c, 0x009c, 0x009c, - // Entry 40 - 7F - 0x009c, 0x00a8, 0x00a8, 0x00af, 0x00af, 0x00af, 0x00af, 0x00af, - 0x00b8, 0x00b8, 0x00c1, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00d3, 0x00d3, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00e5, 0x00e5, 0x00ed, 0x00ed, 0x00ed, - 0x00f6, 0x00f6, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, - 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x010a, 0x010a, 0x0114, - // Entry 80 - BF - 0x0114, 0x011e, 0x011e, 0x011e, 0x011e, 0x0128, 0x0131, 0x013a, - 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, - 0x013a, 0x013a, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, - 0x014d, 0x014d, 0x0156, 0x0156, 0x0156, 0x0162, 0x0162, 0x0162, - 0x0162, 0x0162, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x0175, - 0x017c, 0x017c, 0x017c, 0x0188, 0x0188, 0x0188, 0x0188, 0x0188, - 0x0188, 0x0191, 0x0191, 0x0199, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - // Entry C0 - FF - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - // Entry 100 - 13F - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - // Entry 140 - 17F - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - // Entry 180 - 1BF - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, - 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a9, - }, - }, - { // mfe - "akanamarikarabbielorisbilgarbengalitchekalmangrekangleespagnolpersanfran" + - "sehaoussahindihongrwaindonezienigboitalienzaponezavanekhmer, santral" + - "koreenmalebirmannepaleolandepenjabipoloneportigerouminrisrwandasomal" + - "iswedwatamoulthaïtirkikrenienourdouvietnamienyorubasinwa, mandarinzo" + - "uloukreol morisien", - []uint16{ // 414 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000a, 0x000a, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x0016, 0x001c, - 0x001c, 0x001c, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x002d, 0x002d, 0x002d, 0x002d, 0x0031, 0x0036, 0x0036, 0x003e, - 0x003e, 0x003e, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x0051, - 0x0051, 0x0056, 0x0056, 0x0056, 0x0056, 0x005d, 0x005d, 0x005d, - // Entry 40 - 7F - 0x005d, 0x0067, 0x0067, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, - 0x0072, 0x0072, 0x0078, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, - 0x007e, 0x007e, 0x008c, 0x008c, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0096, 0x0096, 0x009c, 0x009c, 0x009c, - 0x00a2, 0x00a2, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, - 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00af, 0x00af, 0x00b5, - // Entry 80 - BF - 0x00b5, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00c2, 0x00c5, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, - 0x00d7, 0x00d7, 0x00dd, 0x00dd, 0x00dd, 0x00e2, 0x00e2, 0x00e2, - 0x00e2, 0x00e2, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00ee, - 0x00f4, 0x00f4, 0x00f4, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, - 0x00fe, 0x0104, 0x0104, 0x0113, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - // Entry C0 - FF - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - // Entry 100 - 13F - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - // Entry 140 - 17F - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - // Entry 180 - 1BF - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0127, - }, - }, - { // mg - "AkanAmharikaAraboBielorosyBiolgaraBengaliTsekyAlemaninaGrikaAnglisyEspan" + - "iolaPersaFrantsayhaoussahindihongroàIndonezianinaigboItalianinaJapon" + - "eyJavaneykhmerKoreaninaMalagasyMalayBirmanaNepaleHolandeyPenjabiPolo" + - "neyPortiogeyRomanianinaRosianinaRoandeSomalianinaSoisaTamoilaTaioane" + - "yTiorkaOkrainianinaOrdòVietnamianinaYôrobàSinoa, MandarinZolò", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000c, 0x000c, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001a, 0x0022, - 0x0022, 0x0022, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, - 0x0029, 0x0029, 0x0029, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x0037, 0x0037, 0x0037, 0x0037, 0x003c, 0x0043, 0x0043, 0x004c, - 0x004c, 0x004c, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0060, - 0x0060, 0x0065, 0x0065, 0x0065, 0x0065, 0x006d, 0x006d, 0x006d, - // Entry 40 - 7F - 0x006d, 0x007a, 0x007a, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, - 0x0088, 0x0088, 0x008f, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, - 0x0096, 0x0096, 0x009b, 0x009b, 0x00a4, 0x00a4, 0x00a4, 0x00a4, - 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, - 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00ac, 0x00ac, 0x00ac, 0x00ac, - 0x00ac, 0x00ac, 0x00ac, 0x00b1, 0x00b1, 0x00b8, 0x00b8, 0x00b8, - 0x00be, 0x00be, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00cd, 0x00cd, 0x00d4, - // Entry 80 - BF - 0x00d4, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00e8, 0x00f1, 0x00f7, - 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, - 0x00f7, 0x00f7, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, - 0x0107, 0x0107, 0x010e, 0x010e, 0x010e, 0x0116, 0x0116, 0x0116, - 0x0116, 0x0116, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x0128, - 0x012d, 0x012d, 0x012d, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, - 0x013a, 0x0142, 0x0142, 0x0151, 0x0156, - }, - }, - { // mgh - "IkanImhariIarabuIbelausiIbulgariaIbanglaIchekiIjerimaniIgirikiIngilishiI" + - "hispaniolaIajemiIfaransaIhausaIhindiIhungariIgboItalianoIjapaniIjava" + - "IkambodiaIkoreaImalesiaIburmaInepaliIholanziIpunjabiIpolandiNrenoIro" + - "maniaIrisiInyarandaIsomaliIswidiItamilItailandiIturukiIukranIhurduIv" + - "yetinamuIyorubaIchinaIzuluMakua", - []uint16{ // 416 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000a, 0x000a, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0018, 0x0021, - 0x0021, 0x0021, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x0037, 0x0037, 0x0037, 0x0037, 0x003e, 0x0047, 0x0047, 0x0052, - 0x0052, 0x0052, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0060, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0066, - 0x0066, 0x006c, 0x006c, 0x006c, 0x006c, 0x0074, 0x0074, 0x0074, - // Entry 40 - 7F - 0x0074, 0x0074, 0x0074, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, - 0x0080, 0x0080, 0x0087, 0x008c, 0x008c, 0x008c, 0x008c, 0x008c, - 0x008c, 0x008c, 0x0095, 0x0095, 0x009b, 0x009b, 0x009b, 0x009b, - 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, - 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, - 0x009b, 0x009b, 0x009b, 0x00a3, 0x00a3, 0x00a9, 0x00a9, 0x00a9, - 0x00b0, 0x00b0, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, - 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00c0, 0x00c0, 0x00c8, - // Entry 80 - BF - 0x00c8, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00d5, 0x00da, 0x00e3, - 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, - 0x00e3, 0x00e3, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, - 0x00f0, 0x00f0, 0x00f6, 0x00f6, 0x00f6, 0x00ff, 0x00ff, 0x00ff, - 0x00ff, 0x00ff, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x010c, - 0x0112, 0x0112, 0x0112, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x0123, 0x0123, 0x0129, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - // Entry C0 - FF - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - // Entry 100 - 13F - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - // Entry 140 - 17F - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - // Entry 180 - 1BF - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x0133, - }, - }, - { // mgo - "metaʼngam tisɔʼ", - []uint16{ // 559 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 100 - 13F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 140 - 17F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 180 - 1BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - // Entry 1C0 - 1FF - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - // Entry 200 - 23F - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0012, - }, - }, - { // mk - mkLangStr, - mkLangIdx, - }, - { // ml - mlLangStr, - mlLangIdx, - }, - { // mn - mnLangStr, - mnLangIdx, - }, - { // mr - mrLangStr, - mrLangIdx, - }, - { // ms - msLangStr, - msLangIdx, - }, - { // mt - "AfarAbkażjanAvestanAfrikansAkanAmharikuAragoniżGħarbiAssamiżAvarikAymara" + - "AżerbajġaniBashkirBelarussuBulgaruBislamaBambaraBengaliTibetjanBreto" + - "nBożnijakuKatalanChechenChamorroKorsikuCreeĊekSlaviku tal-KnisjaChuv" + - "ashWelshDaniżĠermaniżDivehiDzongkhaEweGriegIngliżEsperantoSpanjolEst" + - "onjanBaskPersjanFulahFinlandiżFiġjanFaroeseFranċiżFrisian tal-Punent" + - "IrlandiżGalliku SkoċċiżGaliċjanGuaraniGujaratiManxHausaEbrajkHindiHi" + - "ri MotuKroatCreole ta’ HaitiUngeriżArmenHereroInterlinguaIndoneżjanI" + - "nterlingueIgboSichuan YiInupjakIdoIżlandiżTaljanInuktitutĠappuniżĠav" + - "aniżĠorġjanKongoKikujuKuanyamaKażakKalallisutKhmerKannadaKoreanKanur" + - "iKashmiriKurdKomiKornikuKirgiżLatinLussemburgiżGandaLimburgishLingal" + - "janLaosjanLitwanLuba-KatangaLatvjanMalagasyMarshalljaniżMaoriMaċedon" + - "janMalayalamMongoljanMarathiMalayMaltiBurmiżNaurujanNdebeli tat-Tram" + - "untanaNepaliżNdongaOlandiżNinorsk NorveġiżBokmal NorveġiżNdebele tan" + - "-NofsinharNavajoNyanjaOċċitanOġibwaOromoOdiaOssettikuPunjabiPaliPoll" + - "akkPashtoPortugiżQuechuaRomanzRundiRumenRussuKinjarwandaSanskritSard" + - "injanSindhiSami tat-TramuntanaSangoSinhalaSlovakkSlovenSamoanShonaSo" + - "maliAlbaniżSerbSwatiSoto tan-NofsinharSundaniżŻvezjaSwahiliTamilTelu" + - "guTajikTajlandiżTigrinyaTurkmeniTswanaTonganTorkTsongaTatarTaħitjanU" + - "yghurUkrenUrduUzbekVendaVjetnamiżVolapukWalloonWolofXhosaYiddishYoru" + - "baZhuangĊiniżZuluAċiniżAkoliAdangmeAdygheAfriħiliAghemAjnuAkkadjenAl" + - "eutAltai tan-NofsinharIngliż AntikAngikaAramajkMapucheArapahoArawakA" + - "suAsturianAwadhiBaluċiBaliniżBasaBejaBembaBenaBhojpuriBikolBiniSiksi" + - "kaBrajBodoBurjatBugineseBlinKaddoKaribAtsamCebuanoChigaChibchaChagat" + - "aiĊukiżMariChinook JargonChoctawĊipewjanCherokeeCheyenneKurd Ċentral" + - "iKoptikuTork tal-KrimeaFranċiż tas-Seselwa CreoleKashubianDakotaDarg" + - "waTaitaDelawerjanSlavDogribDinkaZarmaDogriSorbjan KomuniDwalaOlandiż" + - " MedjevaliJola-FonyiDyulaDazagaEmbuEfikEġizzjan (Antik)EkajukElamitI" + - "ngliż MedjevaliEwondoFangFilippinFonFranċiż MedjevaliFranċiż AntikFr" + - "ijuljanGaGayoGbayaGeezGilbertjanĠermaniż Medjevali PulitĠermaniż Ant" + - "ik, PulitGondiGorontaloGotikuGreboGrieg, AntikĠermaniż tal-Iżvizzera" + - "GusiiGwiċinHaidaĦawajjanHiligaynonHittiteHmongSorbjan ta’ FuqHupaIba" + - "nIbibioIlokoIngushLojbanNgombaMachameLhudi-PersjanLhudi-GħarbiKara-K" + - "alpakKabuljanKachinJjuKambaKawiKabardianTyapMakondeCape VerdjanKoroK" + - "hasiKotaniżKoyra ChiiniKakoKalenjinKimbunduKonkaniKosrejanKpelleKara" + - "chay-BalkarKareljanKuruxShambalaBafiaKolonjanKumykKutenajLadinoLangi" + - "LahndaLambaLeżgjanLakotaMongoLożiLuri tat-TramuntanaLuba-LuluwaLuise" + - "noLundaLuoMizoLuyiaMaduriżMagahiMaithiliMakasarMandingoMasaiMokshaMa" + - "ndarMendeMeruMorisyenIrlandiż MedjevaliMakhuwa-MeettoMetàMicmacMinan" + - "gkabauManchuManipuriMohawkMossiMundangLingwi DiversiKriekMirandiżMar" + - "wariErzyaMazanderaniNaplitanNamaĠermaniż KomuniNewariNijasNiueanKwas" + - "ioNgiemboonNogaiNors AntikN’KoSoto tat-TramuntanaNuerNewari Klassiku" + - "NjamweżiNyankoleNyoroNzimaOsaġjanTork OttomanPangasinjanPahlaviPampa" + - "ngaPapiamentoPalawjanPidgin NiġerjanPersjan AntikFeniċjuPonpejanPrus" + - "suProvenzal AntikK’iche’RaġastaniRapanwiRarotonganiRomboRomaneskArom" + - "anjanRwaSandaweSakhaSamaritan AramajkSamburuSasakSantaliNgambaySangu" + - "SqalliSkoċċiżSenaSelkupKoyraboro SenniIrlandiż AntikTachelhitShanSid" + - "amoSami tan-NofsinharLule SamiInari SamiSkolt SamiSoninkeSogdienSran" + - "an TongoSererSahoSukumaSusuSumerjanKomorjanSirjanTimneTesoTerenoTetu" + - "mTigreTivTokelauKlingonTlingitTamashekNyasa TongaTok PisinTarokoTsim" + - "shianTumbukaTuvaluTasawaqTuvinjanTamazight tal-Atlas ĊentraliUdmurtU" + - "garitikuUmbunduRootVaiVotikVunjoWalserWalamoWarayWashoKalmykSogaYaoY" + - "apeseYangbenYembaKantoniżZapotecZenagaTamazight Standard tal-MarokkZ" + - "uniBla kontenut lingwistikuZazaGħarbi Standard ModernĠermaniż Awstri" + - "jakĠermaniż ŻvizzeruIngliż AwstraljanIngliż KanadiżIngliż Brittaniku" + - "Ingliż AmerikanSpanjol Latin AmerikanSpanjol EwropewSpanjol tal-Mess" + - "ikuFranċiż KanadiżFranċiż ŻvizzeruSassonu KomuniFjammingPortugiż tal" + - "-BrażilPortugiż EwropewMoldovanSerbo-KroatSwahili tar-Repubblika Dem" + - "okratika tal-KongoĊiniż SimplifikatĊiniż Tradizzjonali", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000d, 0x0014, 0x001c, 0x0020, 0x0028, 0x0031, - 0x0038, 0x0040, 0x0046, 0x004c, 0x0059, 0x0060, 0x0069, 0x0070, - 0x0077, 0x007e, 0x0085, 0x008d, 0x0093, 0x009d, 0x00a4, 0x00ab, - 0x00b3, 0x00ba, 0x00be, 0x00c2, 0x00d4, 0x00db, 0x00e0, 0x00e6, - 0x00f0, 0x00f6, 0x00fe, 0x0101, 0x0106, 0x010d, 0x0116, 0x011d, - 0x0125, 0x0129, 0x0130, 0x0135, 0x013f, 0x0146, 0x014d, 0x0156, - 0x0168, 0x0171, 0x0183, 0x018c, 0x0193, 0x019b, 0x019f, 0x01a4, - 0x01aa, 0x01af, 0x01b8, 0x01bd, 0x01cf, 0x01d7, 0x01dc, 0x01e2, - // Entry 40 - 7F - 0x01ed, 0x01f8, 0x0203, 0x0207, 0x0211, 0x0218, 0x021b, 0x0225, - 0x022b, 0x0234, 0x023e, 0x0247, 0x0250, 0x0255, 0x025b, 0x0263, - 0x0269, 0x0273, 0x0278, 0x027f, 0x0285, 0x028b, 0x0293, 0x0297, - 0x029b, 0x02a2, 0x02a9, 0x02ae, 0x02bb, 0x02c0, 0x02ca, 0x02d3, - 0x02da, 0x02e0, 0x02ec, 0x02f3, 0x02fb, 0x0309, 0x030e, 0x0319, - 0x0322, 0x032b, 0x0332, 0x0337, 0x033c, 0x0343, 0x034b, 0x0361, - 0x0369, 0x036f, 0x0377, 0x0389, 0x039a, 0x03af, 0x03b5, 0x03bb, - 0x03c4, 0x03cb, 0x03d0, 0x03d4, 0x03dd, 0x03e4, 0x03e8, 0x03ef, - // Entry 80 - BF - 0x03f5, 0x03fe, 0x0405, 0x040b, 0x0410, 0x0415, 0x041a, 0x0425, - 0x042d, 0x0436, 0x043c, 0x044f, 0x0454, 0x045b, 0x0462, 0x0468, - 0x046e, 0x0473, 0x0479, 0x0481, 0x0485, 0x048a, 0x049c, 0x04a5, - 0x04ac, 0x04b3, 0x04b8, 0x04be, 0x04c3, 0x04cd, 0x04d5, 0x04dd, - 0x04e3, 0x04e9, 0x04ed, 0x04f3, 0x04f8, 0x0501, 0x0507, 0x050c, - 0x0510, 0x0515, 0x051a, 0x0524, 0x052b, 0x0532, 0x0537, 0x053c, - 0x0543, 0x0549, 0x054f, 0x0556, 0x055a, 0x0562, 0x0567, 0x056e, - 0x0574, 0x0574, 0x057d, 0x0582, 0x0586, 0x058e, 0x058e, 0x0593, - // Entry C0 - FF - 0x0593, 0x05a6, 0x05b3, 0x05b9, 0x05c0, 0x05c7, 0x05c7, 0x05ce, - 0x05ce, 0x05ce, 0x05d4, 0x05d4, 0x05d4, 0x05d7, 0x05d7, 0x05df, - 0x05df, 0x05e5, 0x05ec, 0x05f4, 0x05f4, 0x05f8, 0x05f8, 0x05f8, - 0x05f8, 0x05fc, 0x0601, 0x0601, 0x0605, 0x0605, 0x0605, 0x0605, - 0x060d, 0x0612, 0x0616, 0x0616, 0x0616, 0x061d, 0x061d, 0x061d, - 0x0621, 0x0621, 0x0625, 0x0625, 0x062b, 0x0633, 0x0633, 0x0637, - 0x0637, 0x063c, 0x0641, 0x0641, 0x0646, 0x064d, 0x0652, 0x0659, - 0x0661, 0x0668, 0x066c, 0x067a, 0x0681, 0x068a, 0x0692, 0x069a, - // Entry 100 - 13F - 0x06a8, 0x06af, 0x06af, 0x06be, 0x06da, 0x06e3, 0x06e9, 0x06ef, - 0x06f4, 0x06fe, 0x0702, 0x0708, 0x070d, 0x0712, 0x0717, 0x0725, - 0x0725, 0x072a, 0x073c, 0x0746, 0x074b, 0x0751, 0x0755, 0x0759, - 0x0759, 0x076a, 0x0770, 0x0776, 0x0787, 0x0787, 0x078d, 0x078d, - 0x0791, 0x0799, 0x0799, 0x079c, 0x079c, 0x07af, 0x07be, 0x07be, - 0x07be, 0x07be, 0x07c7, 0x07c9, 0x07c9, 0x07c9, 0x07cd, 0x07d2, - 0x07d2, 0x07d6, 0x07e0, 0x07e0, 0x07fa, 0x0811, 0x0811, 0x0816, - 0x081f, 0x0825, 0x082a, 0x0836, 0x084f, 0x084f, 0x084f, 0x0854, - // Entry 140 - 17F - 0x085b, 0x0860, 0x0860, 0x0869, 0x0869, 0x0873, 0x087a, 0x087f, - 0x0890, 0x0890, 0x0894, 0x0898, 0x089e, 0x08a3, 0x08a9, 0x08a9, - 0x08a9, 0x08af, 0x08b5, 0x08bc, 0x08c9, 0x08d6, 0x08d6, 0x08e1, - 0x08e9, 0x08ef, 0x08f2, 0x08f7, 0x08fb, 0x0904, 0x0904, 0x0908, - 0x090f, 0x091b, 0x091b, 0x091f, 0x091f, 0x0924, 0x092c, 0x0938, - 0x0938, 0x0938, 0x093c, 0x0944, 0x094c, 0x094c, 0x0953, 0x095b, - 0x0961, 0x0970, 0x0970, 0x0970, 0x0978, 0x097d, 0x0985, 0x098a, - 0x0992, 0x0997, 0x099e, 0x09a4, 0x09a9, 0x09af, 0x09b4, 0x09bc, - // Entry 180 - 1BF - 0x09bc, 0x09bc, 0x09bc, 0x09c2, 0x09c2, 0x09c7, 0x09cc, 0x09df, - 0x09df, 0x09ea, 0x09f1, 0x09f6, 0x09f9, 0x09fd, 0x0a02, 0x0a02, - 0x0a02, 0x0a0a, 0x0a0a, 0x0a10, 0x0a18, 0x0a1f, 0x0a27, 0x0a2c, - 0x0a2c, 0x0a32, 0x0a38, 0x0a3d, 0x0a41, 0x0a49, 0x0a5c, 0x0a6a, - 0x0a6f, 0x0a75, 0x0a80, 0x0a86, 0x0a8e, 0x0a94, 0x0a99, 0x0a99, - 0x0aa0, 0x0aae, 0x0ab3, 0x0abc, 0x0ac3, 0x0ac3, 0x0ac3, 0x0ac8, - 0x0ad3, 0x0ad3, 0x0adb, 0x0adf, 0x0af0, 0x0af6, 0x0afb, 0x0b01, - 0x0b01, 0x0b07, 0x0b10, 0x0b15, 0x0b1f, 0x0b1f, 0x0b25, 0x0b38, - // Entry 1C0 - 1FF - 0x0b3c, 0x0b4b, 0x0b54, 0x0b5c, 0x0b61, 0x0b66, 0x0b6e, 0x0b7a, - 0x0b85, 0x0b8c, 0x0b94, 0x0b9e, 0x0ba6, 0x0ba6, 0x0bb6, 0x0bb6, - 0x0bb6, 0x0bc3, 0x0bc3, 0x0bcb, 0x0bcb, 0x0bcb, 0x0bd3, 0x0bd9, - 0x0be8, 0x0bf3, 0x0bf3, 0x0bfd, 0x0c04, 0x0c0f, 0x0c0f, 0x0c0f, - 0x0c14, 0x0c1c, 0x0c1c, 0x0c1c, 0x0c1c, 0x0c25, 0x0c28, 0x0c2f, - 0x0c34, 0x0c45, 0x0c4c, 0x0c51, 0x0c58, 0x0c58, 0x0c5f, 0x0c64, - 0x0c6a, 0x0c74, 0x0c74, 0x0c74, 0x0c74, 0x0c78, 0x0c78, 0x0c7e, - 0x0c8d, 0x0c9c, 0x0c9c, 0x0ca5, 0x0ca9, 0x0ca9, 0x0caf, 0x0caf, - // Entry 200 - 23F - 0x0caf, 0x0cc1, 0x0cca, 0x0cd4, 0x0cde, 0x0ce5, 0x0cec, 0x0cf8, - 0x0cfd, 0x0d01, 0x0d01, 0x0d07, 0x0d0b, 0x0d13, 0x0d1b, 0x0d1b, - 0x0d21, 0x0d21, 0x0d21, 0x0d26, 0x0d2a, 0x0d30, 0x0d35, 0x0d3a, - 0x0d3d, 0x0d44, 0x0d44, 0x0d4b, 0x0d52, 0x0d52, 0x0d5a, 0x0d65, - 0x0d6e, 0x0d6e, 0x0d74, 0x0d74, 0x0d7d, 0x0d7d, 0x0d84, 0x0d8a, - 0x0d91, 0x0d99, 0x0db6, 0x0dbc, 0x0dc5, 0x0dcc, 0x0dd0, 0x0dd3, - 0x0dd3, 0x0dd3, 0x0dd3, 0x0dd3, 0x0dd8, 0x0dd8, 0x0ddd, 0x0de3, - 0x0de9, 0x0dee, 0x0df3, 0x0df3, 0x0df3, 0x0df9, 0x0df9, 0x0dfd, - // Entry 240 - 27F - 0x0e00, 0x0e06, 0x0e0d, 0x0e12, 0x0e12, 0x0e1b, 0x0e22, 0x0e22, - 0x0e22, 0x0e28, 0x0e45, 0x0e49, 0x0e61, 0x0e65, 0x0e7c, 0x0e7c, - 0x0e90, 0x0ea4, 0x0eb6, 0x0ec6, 0x0ed8, 0x0ee8, 0x0efe, 0x0f0d, - 0x0f20, 0x0f20, 0x0f32, 0x0f45, 0x0f53, 0x0f5b, 0x0f70, 0x0f81, - 0x0f89, 0x0f94, 0x0fc0, 0x0fd3, 0x0fe8, - }, - }, - { // mua - "akaŋamharikarabiyabelarussiyabulgariabengaliasyekyagermaŋgrekzah Anglofo" + - "ŋEspaniyaPersiazah sǝr Franssǝhaussahindihungariyaindonesiyaigboita" + - "liyazah sǝr JapoŋjavaniyakmerkoreamalasiyabirmaniaNepaliyazah sǝr ma" + - " kasǝŋPǝnjabiPoloniyaZah sǝr PortugalRomaniyaRussiyaZah sǝr RwandaSo" + - "maliyaSwediaTamulthTurkUkrainiaUrduVietnamiyaYorubazah SyiŋZuluMUNDA" + - "Ŋ", - []uint16{ // 425 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x000c, 0x000c, - 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x001e, 0x0026, - 0x0026, 0x0026, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003f, 0x004c, 0x004c, 0x0054, - 0x0054, 0x0054, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x0071, - 0x0071, 0x0076, 0x0076, 0x0076, 0x0076, 0x007f, 0x007f, 0x007f, - // Entry 40 - 7F - 0x007f, 0x0089, 0x0089, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, - 0x0094, 0x0094, 0x00a3, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, - 0x00ab, 0x00ab, 0x00af, 0x00af, 0x00b4, 0x00b4, 0x00b4, 0x00b4, - 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, - 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, - 0x00b4, 0x00b4, 0x00b4, 0x00bc, 0x00bc, 0x00c4, 0x00c4, 0x00c4, - 0x00cc, 0x00cc, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, - 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00e7, 0x00e7, 0x00ef, - // Entry 80 - BF - 0x00ef, 0x0100, 0x0100, 0x0100, 0x0100, 0x0108, 0x010f, 0x011e, - 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, - 0x011e, 0x011e, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, - 0x012c, 0x012c, 0x0131, 0x0131, 0x0131, 0x0133, 0x0133, 0x0133, - 0x0133, 0x0133, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x013f, - 0x0143, 0x0143, 0x0143, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, - 0x014d, 0x0153, 0x0153, 0x015c, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - // Entry C0 - FF - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - // Entry 100 - 13F - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - // Entry 140 - 17F - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - // Entry 180 - 1BF - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, - 0x0167, - }, - }, - { // my - myLangStr, - myLangIdx, - }, - { // mzn - "آبخازیآفریکانسآکانامهریعربیآسامیآذری ِترکیباشقیریبلاروسیبلغاریبامباراییب" + - "نگالیتبتیبرِتونیبوسنیاییکاتالونیچچنیکورسیکانچکیچوواشیولزیدانمارکیآل" + - "مانیدزونگخااوه\u200cیییونانیانگلیسیاسپرانتوایسپانیولیاستونیاییباسکی" + - "فارسیفینیشفیجیاییفاروییفرانسویغربی فیریزیایریشگالیکگورانیگجراتیمانک" + - "سهوساعبریهندیکرواتیهائتیاییمجاریارمنیاندونزیاییایگبوسیچوئان ییایسلن" + - "دیایتالیاییانوکتیتوتجاپونیجاواییگرجیکیکویوقزاقیکالائلیسوتخمریکانّاد" + - "اکُره\u200cییکشمیریکوردیکورنیشقرقیزیلاتینلوکزامبورگیگاندالینگالالائ" + - "وییلتونیاییلوبا-کاتانگالاتویاییمالاگاسیمائوریمقدونیمالایالاممغولیما" + - "راتیمالاییمالتیبرمه\u200cییشمالی ندبلهنپالیهلندینروژی نینورسکنروژی " + - "بوکمالاورومواوریاپنجابیلهستونیپشتوپرتغالیقوئچوئارومانشروندیرومانیای" + - "یروسیکنیاروآنداییسانسکریتسندیشمالی سامیسانگوسینهالااسلواکیاسلوونیای" + - "یشوناسومالیاییآلبانیاییصربیسوندانسیسوئدیسواحیلیتامیلیتلوگوییتاجیکیت" + - "اییتیگرینیاییترکمونیتونگانیترکیتاتاریئوغوریاوکراینیاردوازبکیویتنامی" + - "وولفیخوسایوروباچینیزولوآقمماپوچهآسوبمباییبناییغربی بلوچیبدوییچیگاچر" + - "وکیاییمیونی کوردیتایتازارماییپایین صربیدوئالاییجولا-فونیامبوفیلیپین" + - "وگاگائوزیسوییس آلمانیگوسیهاواییاییبالایی صربینگومباماچامهقبایلیکامب" + - "اییماکوندهکیپ وُردیکویرا چیینیکالنجینکومی-پرمیاککونکانیشامبالابافیا" + - "ییلانگیلاکوتاشمالی لُریلوئولوییاماساییمِروییموریسینماخوئا-میتومِتاء" + - "موهاکموندانگمازرونیناماپایین آلمانیکوئاسیونئکونوئرنیانکولهکئیچه" + - "\u200cئیرومبوروآییسامبوروسانگووجنوبی کردیسِناییکویرابورا سنیتاچلهیتج" + - "نوبی سامیلوله سامیایناری سامیسکولت سامیتسوییتاساواقیمیونی اطلس تامز" + - "یقینشناسی\u200cیه زوونواییوونجوییوالرپیریسوگامراکش ِاستاندارد ِتاما" + - "زیقتیاین زوون بشناسی\u200cیه نیّهمدرن استاندارد عربیجنوبی آذری ترکی" + - "اتریش ِآلمانیسوییس ِآلمانیاسترالیای ِانگلیسیکانادای ِانگلیسیبریتیش " + - "انگلیسیامریکن انگلیسیجنوبی آمریکای ِایسپانیولیاروپای ِایسپانیولیمکز" + - "یک ِایسپانیولیکانادای ِفرانسویسوییس ِفرانسویپایین ساکسونیفلمیشبرزیل" + - " ِپرتغالیاروپای ِپرتغالیمولداویکنگو سواحیلیساده چینیسنتی چینی", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000c, 0x000c, 0x001c, 0x0024, 0x002e, 0x002e, - 0x0036, 0x0040, 0x0040, 0x0040, 0x0053, 0x0061, 0x006f, 0x007b, - 0x007b, 0x008d, 0x0099, 0x00a1, 0x00af, 0x00bf, 0x00cf, 0x00d7, - 0x00d7, 0x00e7, 0x00e7, 0x00ed, 0x00ed, 0x00f9, 0x0101, 0x0111, - 0x011d, 0x011d, 0x012b, 0x0138, 0x0144, 0x0152, 0x0162, 0x0176, - 0x0188, 0x0192, 0x019c, 0x019c, 0x01a6, 0x01b4, 0x01c0, 0x01ce, - 0x01e3, 0x01ed, 0x01ed, 0x01f7, 0x0203, 0x020f, 0x0219, 0x0221, - 0x0229, 0x0231, 0x0231, 0x023d, 0x024d, 0x0257, 0x0261, 0x0261, - // Entry 40 - 7F - 0x0261, 0x0275, 0x0275, 0x027f, 0x0292, 0x0292, 0x0292, 0x02a0, - 0x02b2, 0x02c4, 0x02d0, 0x02dc, 0x02e4, 0x02e4, 0x02f0, 0x02f0, - 0x02fa, 0x030e, 0x0316, 0x0324, 0x0333, 0x0333, 0x033f, 0x0349, - 0x0349, 0x0355, 0x0361, 0x036b, 0x0381, 0x038b, 0x038b, 0x0399, - 0x03a5, 0x03b5, 0x03cc, 0x03dc, 0x03ec, 0x03ec, 0x03f8, 0x0404, - 0x0416, 0x0420, 0x042c, 0x0438, 0x0442, 0x0451, 0x0451, 0x0466, - 0x0470, 0x0470, 0x047a, 0x0493, 0x04aa, 0x04aa, 0x04aa, 0x04aa, - 0x04aa, 0x04aa, 0x04b6, 0x04c0, 0x04c0, 0x04cc, 0x04cc, 0x04da, - // Entry 80 - BF - 0x04e2, 0x04f0, 0x04fe, 0x050a, 0x0514, 0x0526, 0x052e, 0x0546, - 0x0556, 0x0556, 0x055e, 0x0571, 0x057b, 0x0589, 0x0597, 0x05ab, - 0x05ab, 0x05b3, 0x05c5, 0x05d7, 0x05df, 0x05df, 0x05df, 0x05ef, - 0x05f9, 0x0607, 0x0613, 0x0621, 0x062d, 0x0635, 0x0649, 0x0657, - 0x0657, 0x0665, 0x066d, 0x066d, 0x0679, 0x0679, 0x0685, 0x0695, - 0x069d, 0x06a7, 0x06a7, 0x06b5, 0x06b5, 0x06b5, 0x06bf, 0x06c7, - 0x06c7, 0x06d3, 0x06d3, 0x06db, 0x06e3, 0x06e3, 0x06e3, 0x06e3, - 0x06e3, 0x06e3, 0x06e3, 0x06e9, 0x06e9, 0x06e9, 0x06e9, 0x06e9, - // Entry C0 - FF - 0x06e9, 0x06e9, 0x06e9, 0x06e9, 0x06e9, 0x06f5, 0x06f5, 0x06f5, - 0x06f5, 0x06f5, 0x06f5, 0x06f5, 0x06f5, 0x06fb, 0x06fb, 0x06fb, - 0x06fb, 0x06fb, 0x06fb, 0x06fb, 0x06fb, 0x06fb, 0x06fb, 0x06fb, - 0x06fb, 0x06fb, 0x0707, 0x0707, 0x0711, 0x0711, 0x0711, 0x0724, - 0x0724, 0x0724, 0x0724, 0x0724, 0x0724, 0x0724, 0x0724, 0x0724, - 0x0724, 0x0724, 0x072e, 0x072e, 0x072e, 0x072e, 0x072e, 0x072e, - 0x072e, 0x072e, 0x072e, 0x072e, 0x072e, 0x072e, 0x0736, 0x0736, - 0x0736, 0x0736, 0x0736, 0x0736, 0x0736, 0x0736, 0x0746, 0x0746, - // Entry 100 - 13F - 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, - 0x0765, 0x0765, 0x0765, 0x0765, 0x0765, 0x0773, 0x0773, 0x0786, - 0x0786, 0x0796, 0x0796, 0x07a7, 0x07a7, 0x07a7, 0x07af, 0x07af, - 0x07af, 0x07af, 0x07af, 0x07af, 0x07af, 0x07af, 0x07af, 0x07af, - 0x07af, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, - 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, - 0x07cf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, - 0x07cf, 0x07cf, 0x07cf, 0x07cf, 0x07e6, 0x07e6, 0x07e6, 0x07ee, - // Entry 140 - 17F - 0x07ee, 0x07ee, 0x07ee, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, - 0x0815, 0x0815, 0x0815, 0x0815, 0x0815, 0x0815, 0x0815, 0x0815, - 0x0815, 0x0815, 0x0821, 0x082d, 0x082d, 0x082d, 0x082d, 0x082d, - 0x0839, 0x0839, 0x0839, 0x0847, 0x0847, 0x0847, 0x0847, 0x0847, - 0x0855, 0x0866, 0x0866, 0x0866, 0x0866, 0x0866, 0x0866, 0x087b, - 0x087b, 0x087b, 0x087b, 0x0889, 0x0889, 0x089e, 0x08ac, 0x08ac, - 0x08ac, 0x08ac, 0x08ac, 0x08ac, 0x08ac, 0x08ac, 0x08ba, 0x08c8, - 0x08c8, 0x08c8, 0x08c8, 0x08c8, 0x08d2, 0x08d2, 0x08d2, 0x08d2, - // Entry 180 - 1BF - 0x08d2, 0x08d2, 0x08d2, 0x08de, 0x08de, 0x08de, 0x08de, 0x08f1, - 0x08f1, 0x08f1, 0x08f1, 0x08f1, 0x08f9, 0x08f9, 0x0903, 0x0903, - 0x0903, 0x0903, 0x0903, 0x0903, 0x0903, 0x0903, 0x0903, 0x090f, - 0x090f, 0x090f, 0x090f, 0x090f, 0x091b, 0x0929, 0x0929, 0x093e, - 0x0948, 0x0948, 0x0948, 0x0948, 0x0948, 0x0952, 0x0952, 0x0952, - 0x0960, 0x0960, 0x0960, 0x0960, 0x0960, 0x0960, 0x0960, 0x0960, - 0x096e, 0x096e, 0x096e, 0x0976, 0x098d, 0x098d, 0x098d, 0x098d, - 0x098d, 0x099b, 0x099b, 0x099b, 0x099b, 0x099b, 0x09a3, 0x09a3, - // Entry 1C0 - 1FF - 0x09ab, 0x09ab, 0x09ab, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, - 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, - 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, - 0x09bb, 0x09cc, 0x09cc, 0x09cc, 0x09cc, 0x09cc, 0x09cc, 0x09cc, - 0x09d6, 0x09d6, 0x09d6, 0x09d6, 0x09d6, 0x09d6, 0x09e0, 0x09e0, - 0x09e0, 0x09e0, 0x09ee, 0x09ee, 0x09ee, 0x09ee, 0x09ee, 0x09fa, - 0x09fa, 0x09fa, 0x09fa, 0x0a0d, 0x0a0d, 0x0a19, 0x0a19, 0x0a19, - 0x0a32, 0x0a32, 0x0a32, 0x0a40, 0x0a40, 0x0a40, 0x0a40, 0x0a40, - // Entry 200 - 23F - 0x0a40, 0x0a53, 0x0a64, 0x0a79, 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, - 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, - 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, 0x0a96, 0x0a96, 0x0a96, 0x0a96, - 0x0a96, 0x0a96, 0x0a96, 0x0a96, 0x0a96, 0x0a96, 0x0a96, 0x0a96, - 0x0a96, 0x0a96, 0x0a96, 0x0a96, 0x0a96, 0x0a96, 0x0a96, 0x0a96, - 0x0aa6, 0x0aa6, 0x0ac8, 0x0ac8, 0x0ac8, 0x0ac8, 0x0ae4, 0x0aec, - 0x0aec, 0x0aec, 0x0aec, 0x0aec, 0x0aec, 0x0aec, 0x0afa, 0x0afa, - 0x0afa, 0x0afa, 0x0afa, 0x0b0a, 0x0b0a, 0x0b0a, 0x0b0a, 0x0b12, - // Entry 240 - 27F - 0x0b12, 0x0b12, 0x0b12, 0x0b12, 0x0b12, 0x0b12, 0x0b12, 0x0b12, - 0x0b12, 0x0b12, 0x0b46, 0x0b46, 0x0b72, 0x0b72, 0x0b96, 0x0bb2, - 0x0bcb, 0x0be4, 0x0c07, 0x0c26, 0x0c41, 0x0c5c, 0x0c8c, 0x0caf, - 0x0cd0, 0x0cd0, 0x0cef, 0x0d0a, 0x0d23, 0x0d2d, 0x0d48, 0x0d65, - 0x0d73, 0x0d73, 0x0d8a, 0x0d9b, 0x0dac, - }, - }, - { // naq - "AkangowabAmharicgowabArabiǁî gowabBelarusanǁî gowabBulgariaǁî gowabBenga" + - "liǁî gowabCzechǁî gowabDuitsXriksEngelsSpaansPersiaǁî gowabFransHaus" + - "agowabHindigowabHungariaǁî gowabIndonesiaǁî gowabIgbogowabItaliansJa" + - "paneesJavaneseKhmerǁî gowab, CentralKoreaǁî gowabMalayǁî gowabBurmes" + - "ǁî gowabNepalǁî gowabHollandsPunjabigowabPoleǁî gowabPortugeesRoman" + - "iaǁî gowabRussiaǁî gowabRwandaǁî gowabSomaliǁî gowabSwedeǁî gowabTam" + - "ilǁî gowabThaiǁî gowabTurkeǁî gowabUkrainiaǁî gowabUrduǁî gowabVietn" + - "amǁî gowabYorubabChineesǁî gowab, MandarinniZulubKhoekhoegowab", - []uint16{ // 436 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0015, 0x0015, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0037, 0x0049, - 0x0049, 0x0049, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x006e, 0x006e, 0x006e, 0x006e, 0x0073, 0x0079, 0x0079, 0x007f, - 0x007f, 0x007f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x009e, - 0x009e, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00ba, 0x00ba, 0x00ba, - // Entry 40 - 7F - 0x00ba, 0x00cd, 0x00cd, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, - 0x00de, 0x00de, 0x00e6, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, - 0x00ee, 0x00ee, 0x0106, 0x0106, 0x0115, 0x0115, 0x0115, 0x0115, - 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, - 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, - 0x0115, 0x0115, 0x0115, 0x0124, 0x0124, 0x0134, 0x0134, 0x0134, - 0x0143, 0x0143, 0x014b, 0x014b, 0x014b, 0x014b, 0x014b, 0x014b, - 0x014b, 0x014b, 0x014b, 0x014b, 0x014b, 0x0157, 0x0157, 0x0165, - // Entry 80 - BF - 0x0165, 0x016e, 0x016e, 0x016e, 0x016e, 0x017f, 0x018f, 0x019f, - 0x019f, 0x019f, 0x019f, 0x019f, 0x019f, 0x019f, 0x019f, 0x019f, - 0x019f, 0x019f, 0x01af, 0x01af, 0x01af, 0x01af, 0x01af, 0x01af, - 0x01be, 0x01be, 0x01cd, 0x01cd, 0x01cd, 0x01db, 0x01db, 0x01db, - 0x01db, 0x01db, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01fc, - 0x020a, 0x020a, 0x020a, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, - 0x021b, 0x0222, 0x0222, 0x023f, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - // Entry C0 - FF - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - // Entry 100 - 13F - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - // Entry 140 - 17F - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - // Entry 180 - 1BF - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, - 0x0244, 0x0244, 0x0244, 0x0251, - }, - }, - { // nd - "isi-Akhaniisi-Amaharikhiisi-Alabhuisi-Bhelarashiyaniisi-Bulgariaisi-Bhen" + - "galiisi-Czechisi-Jalimaniisi-Gilikiisi-Ngisiisi-Sipeyiniisi-Pheshiya" + - "niisi-Fulentshiisi-Hausaisi-Hindiisi-Hangariisi-Indonesiaisi-Igboisi" + - "-Italianoisi-Japhaniisi-Javaisi-Khambodiyaisi-Koriyaisi-Malayiisi-Bu" + - "rmaisiNdebeleisi-Nepaliisi-Dutchisi-Phunjabiisi-Pholoshiisi-Potukezi" + - "isi-Romaniisi-Rashiyaisi-Ruwandaisi-Somaliisi-Swidishiisi-Thamilisi-" + - "Thayiisi-Thekishiisi-Ukrainisi-Uduisi-Vietnameseisi-Yorubhaisi-China" + - "isi-Zulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0018, 0x0018, - 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0034, 0x0040, - 0x0040, 0x0040, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, - 0x004c, 0x004c, 0x004c, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0061, 0x0061, 0x0061, 0x0061, 0x006b, 0x0074, 0x0074, 0x0080, - 0x0080, 0x0080, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x009b, - 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x00a4, - 0x00a4, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00b8, 0x00b8, 0x00b8, - // Entry 40 - 7F - 0x00b8, 0x00c5, 0x00c5, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, - 0x00d9, 0x00d9, 0x00e4, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, - 0x00ec, 0x00ec, 0x00fa, 0x00fa, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0104, 0x010e, 0x010e, 0x0117, 0x0117, 0x0121, - 0x012b, 0x012b, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0140, 0x0140, 0x014c, - // Entry 80 - BF - 0x014c, 0x0158, 0x0158, 0x0158, 0x0158, 0x0162, 0x016d, 0x0178, - 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, - 0x0178, 0x0178, 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, - 0x018e, 0x018e, 0x0198, 0x0198, 0x0198, 0x01a1, 0x01a1, 0x01a1, - 0x01a1, 0x01a1, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01b7, - 0x01be, 0x01be, 0x01be, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, - 0x01cc, 0x01d7, 0x01d7, 0x01e0, 0x01e8, - }, - }, - { // ne - neLangStr, - neLangIdx, - }, - { // nl - nlLangStr, - nlLangIdx, - }, - { // nmg - "Kiɛl akanKiɛl amariaKiɛl b’árabeKiɛl belarussieKiɛl bulgariaKiɛl bengali" + - "aKiɛl bó tchɛkJámanKiɛl bó grɛkNgɛ̄lɛ̄nPaŋáKiɛl pɛrsiaFalaKiɛl máwús" + - "áKiɛl b’indienKiɛl b’ɔ́ngroisKiɛl indonesieKiɛl ikboKiɛl italiaKiɛl" + - " bó japonɛ̌Kiɛl bó javanɛ̌Kiɛl bó mɛrKiɛl koréKiɛl Malɛ̌siāKiɛl birm" + - "aniaKiɛl nepalKiɛl bóllandaisKiɛl pɛndjabiKiɛl pɔlɔŋeKiɛl bó pɔ̄rtug" + - "ɛ̂Kiɛl bó rumɛ̂nKiɛl russiaKiɛl rwandāKiɛl somaliāKiɛl bó suedoisKi" + - "ɛl tamulKiɛl thaïKiɛl bó turkKiɛl b’ukrɛ̄nienKiɛl úrduKiɛl viɛtnamY" + - "orúbâKiɛl bó chinoisZulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0016, 0x0016, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0036, 0x0044, - 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0068, 0x0068, 0x0068, 0x0068, 0x0077, 0x0083, 0x0083, 0x0089, - 0x0089, 0x0089, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x00a9, - 0x00a9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00cd, 0x00cd, 0x00cd, - // Entry 40 - 7F - 0x00cd, 0x00dc, 0x00dc, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, - 0x00f2, 0x00f2, 0x0105, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, - 0x0118, 0x0118, 0x0126, 0x0126, 0x0131, 0x0131, 0x0131, 0x0131, - 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, - 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, - 0x0131, 0x0131, 0x0131, 0x0142, 0x0142, 0x0150, 0x0150, 0x0150, - 0x015b, 0x015b, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x017b, 0x017b, 0x018a, - // Entry 80 - BF - 0x018a, 0x01a1, 0x01a1, 0x01a1, 0x01a1, 0x01b3, 0x01bf, 0x01cc, - 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, - 0x01cc, 0x01cc, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01eb, 0x01eb, 0x01f6, 0x01f6, 0x01f6, 0x0201, 0x0201, 0x0201, - 0x0201, 0x0201, 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, 0x0224, - 0x022f, 0x022f, 0x022f, 0x023d, 0x023d, 0x023d, 0x023d, 0x023d, - 0x023d, 0x0245, 0x0245, 0x0256, 0x025a, - }, - }, - { // nn - "afarabkhasiskavestiskafrikaansakanamhariskaragonskarabiskassamesiskavari" + - "skaymaraaserbajdsjanskbasjkirskkviterussiskbulgarskbislamabambaraben" + - "galitibetanskbretonskbosniskkatalansktsjetsjenskchamorrokorsikanskcr" + - "eetsjekkiskkyrkjeslavisktsjuvanskwalisiskdansktyskdivehidzongkhaeweg" + - "reskengelskesperantospanskestiskbaskiskpersiskfulfuldefinskfijianskf" + - "ærøyskfranskvestfrisiskirskskotsk-gæliskgaliciskguaranigujaratimanx" + - "hausahebraiskhindihiri motukroatiskhaitiskungarskarmenskhererointerl" + - "inguaindonesiskinterlingueibosichuan-yiinupiakidoislandskitalienskin" + - "uittiskjapanskjavanesiskgeorgiskkikongokikuyukuanyamakasakhiskgrønla" + - "ndsk (kalaallisut)khmerkannadakoreanskkanurikasjmirikurdiskkomikorni" + - "skkirgisisklatinluxemburgskgandalimburgisklingalalaotisklitauiskluba" + - "-katangalatviskmadagassiskmarshallesiskmaorimakedonskmalayalammongol" + - "skmarathimalayiskmaltesiskburmesisknaurunord-ndebelenepalskndonganed" + - "erlandsknynorskbokmålsør-ndebelenavajonyanjaoksitanskojibwaoromoodia" + - "ossetiskpanjabipalipolskpashtoportugisiskquechuaretoromanskrundirume" + - "nskrussiskkinjarwandasanskritsardinsksindhinordsamisksangosingalesis" + - "kslovakiskslovensksamoanskshonasomalialbanskserbiskswatisørsothosund" + - "anesisksvenskswahilitamiltelugutadsjikiskthaitigrinjaturkmensktswana" + - "tongansktyrkisktsongatatarisktahitiskuiguriskukrainskurduusbekiskven" + - "davietnamesiskvolapykvallonskwolofxhosajiddiskjorubazhuangkinesiskzu" + - "luachinesiskacoliadangmeadygeiskafrihiliaghemainuakkadiskaleutisksør" + - "-altajgammalengelskangikaarameiskmapudungunarapahoarawakasu (Tanzani" + - "a)asturiskavadhibaluchibalinesiskbasabamunbejabembabena (Tanzania)bh" + - "ojpuribikolbinisiksikabrajbodobakossiburjatiskbuginesiskblincaddocar" + - "ibatsamcebuanokigachibchatsjagataiskchuukesiskmarichinookchoctawchip" + - "ewianskcherokeecheyennesoranikoptiskkrimtatariskseselwa (fransk-kreo" + - "lsk)kasjubiskdakotadargwataitadelawareslavejdogribdinkazarmadogrilåg" + - "sorbiskdualamellomnederlandskjola-fonyidyuladazagaembuefikgammalegyp" + - "tiskekajukelamitemellomengelskewondofangfilippinskfonmellomfranskgam" + - "malfransknordfrisiskaustfrisiskfriuliskgagayogbayageezgilbertesemell" + - "omhøgtyskgammalhøgtyskgondigorontalogotiskgrebogammalgresksveitserty" + - "skgusiigwichinhaidahawaiiskhiligaynonhettittiskhmonghøgsorbiskhupaib" + - "anibibioilokoingusjisklojbanngombamachamejødepersiskjødearabiskkarak" + - "alpakiskkabylekachinjjukambakawikabardisktyapmakondekabuverdianukoro" + - "khasikhotanesiskkoyra chiinikakokalenjinkimbundukonkanikosraeanskkpe" + - "llekarachay-balkarkarelskkurukhshambalabafiakølnskkumykkutenailadino" + - "langilahndalambalezghianlakotamongolozinord-luriskluba-lulualuisenol" + - "undaluolushaiolulujiamaduresiskmagahimaithilimakasarmandingomasaimok" + - "shamandarmendemerumorisyenmellomirskMakhuwa-Meettometa’micmacminangk" + - "abaumandsjumanipurimohawkmossimundangfleire språkcreekmirandesiskmar" + - "warierziamazanderaninapolitansknamalågtysknewariniasniuiskkwasiongie" + - "mboonnogaigammalnorskn’konordsothonuerklassisk newarisknyamwezinyank" + - "olenyoronzimaosageottomansk tyrkiskpangasinanpahlavipampangapapiamen" + - "topalauisknigeriansk pidgingammalpersiskfønikiskponapiskprøyssiskgam" + - "malprovençalskk’icherajasthanirapanuirarotonganskromboromaniarumensk" + - "rwasandawesakhasamaritansk arameisksamburusasaksantalingambaysangusi" + - "cilianskskotsksenaselkupiskKoyraboro Sennigammalirsktachelhitshansid" + - "amosørsamisklulesamiskenaresamiskskoltesamisksoninkesogdisksranan to" + - "ngoserersahosukumasususumeriskshimaoreklassisk syrisksyrisktemneteso" + - "terenotetumtigrétivitokelauklingontlingittamasjektonga (Nyasa)tok pi" + - "sintarokotsimshiantumbukatuvalutasawaqtuvinisksentral-tamazightudmur" + - "tugaritiskumbundurotvaivotiskvunjowalsertyskwolayttawaraywashokalmyk" + - "isksogayaoyapesiskyangbenyembakantonesiskzapotecblissymbolzenagastan" + - "dard marokkansk tamazightzuniutan språkleg innhaldzazamoderne standa" + - "rdarabiskbritisk engelsklågsaksiskflamskmoldaviskserbokroatiskforenk" + - "la kinesisktradisjonell kinesisk", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000d, 0x0015, 0x001e, 0x0022, 0x002a, 0x0032, - 0x0039, 0x0043, 0x004a, 0x0050, 0x005e, 0x0067, 0x0073, 0x007b, - 0x0082, 0x0089, 0x0090, 0x0099, 0x00a1, 0x00a8, 0x00b1, 0x00bc, - 0x00c4, 0x00ce, 0x00d2, 0x00db, 0x00e8, 0x00f1, 0x00f9, 0x00fe, - 0x0102, 0x0108, 0x0110, 0x0113, 0x0118, 0x011f, 0x0128, 0x012e, - 0x0134, 0x013b, 0x0142, 0x014a, 0x014f, 0x0157, 0x0160, 0x0166, - 0x0171, 0x0175, 0x0183, 0x018b, 0x0192, 0x019a, 0x019e, 0x01a3, - 0x01ab, 0x01b0, 0x01b9, 0x01c1, 0x01c8, 0x01cf, 0x01d6, 0x01dc, - // Entry 40 - 7F - 0x01e7, 0x01f1, 0x01fc, 0x01ff, 0x0209, 0x0210, 0x0213, 0x021b, - 0x0224, 0x022d, 0x0234, 0x023e, 0x0246, 0x024d, 0x0253, 0x025b, - 0x0264, 0x027d, 0x0282, 0x0289, 0x0291, 0x0297, 0x029f, 0x02a6, - 0x02aa, 0x02b1, 0x02ba, 0x02bf, 0x02ca, 0x02cf, 0x02d9, 0x02e0, - 0x02e7, 0x02ef, 0x02fb, 0x0302, 0x030d, 0x031a, 0x031f, 0x0328, - 0x0331, 0x0339, 0x0340, 0x0348, 0x0351, 0x035a, 0x035f, 0x036b, - 0x0372, 0x0378, 0x0383, 0x038a, 0x0391, 0x039d, 0x03a3, 0x03a9, - 0x03b2, 0x03b8, 0x03bd, 0x03c1, 0x03c9, 0x03d0, 0x03d4, 0x03d9, - // Entry 80 - BF - 0x03df, 0x03ea, 0x03f1, 0x03fc, 0x0401, 0x0408, 0x040f, 0x041a, - 0x0422, 0x042a, 0x0430, 0x043a, 0x043f, 0x044a, 0x0453, 0x045b, - 0x0463, 0x0468, 0x046e, 0x0475, 0x047c, 0x0481, 0x048a, 0x0495, - 0x049b, 0x04a2, 0x04a7, 0x04ad, 0x04b7, 0x04bb, 0x04c3, 0x04cc, - 0x04d2, 0x04da, 0x04e1, 0x04e7, 0x04ef, 0x04f7, 0x04ff, 0x0507, - 0x050b, 0x0513, 0x0518, 0x0524, 0x052b, 0x0533, 0x0538, 0x053d, - 0x0544, 0x054a, 0x0550, 0x0558, 0x055c, 0x0566, 0x056b, 0x0572, - 0x057a, 0x057a, 0x0582, 0x0587, 0x058b, 0x0593, 0x0593, 0x059b, - // Entry C0 - FF - 0x059b, 0x05a5, 0x05b2, 0x05b8, 0x05c0, 0x05ca, 0x05ca, 0x05d1, - 0x05d1, 0x05d1, 0x05d7, 0x05d7, 0x05d7, 0x05e5, 0x05e5, 0x05ed, - 0x05ed, 0x05f3, 0x05fa, 0x0604, 0x0604, 0x0608, 0x060d, 0x060d, - 0x060d, 0x0611, 0x0616, 0x0616, 0x0625, 0x0625, 0x0625, 0x0625, - 0x062d, 0x0632, 0x0636, 0x0636, 0x0636, 0x063d, 0x063d, 0x063d, - 0x0641, 0x0641, 0x0645, 0x064c, 0x0655, 0x065f, 0x065f, 0x0663, - 0x0663, 0x0668, 0x066d, 0x066d, 0x0672, 0x0679, 0x067d, 0x0684, - 0x068f, 0x0699, 0x069d, 0x06a4, 0x06ab, 0x06b6, 0x06be, 0x06c6, - // Entry 100 - 13F - 0x06cc, 0x06d3, 0x06d3, 0x06df, 0x06f7, 0x0700, 0x0706, 0x070c, - 0x0711, 0x0719, 0x071f, 0x0725, 0x072a, 0x072f, 0x0734, 0x073f, - 0x073f, 0x0744, 0x0755, 0x075f, 0x0764, 0x076a, 0x076e, 0x0772, - 0x0772, 0x0780, 0x0786, 0x078d, 0x079a, 0x079a, 0x07a0, 0x07a0, - 0x07a4, 0x07ae, 0x07ae, 0x07b1, 0x07b1, 0x07bd, 0x07c9, 0x07c9, - 0x07d4, 0x07df, 0x07e7, 0x07e9, 0x07e9, 0x07e9, 0x07ed, 0x07f2, - 0x07f2, 0x07f6, 0x0800, 0x0800, 0x080e, 0x081c, 0x081c, 0x0821, - 0x082a, 0x0830, 0x0835, 0x0840, 0x084c, 0x084c, 0x084c, 0x0851, - // Entry 140 - 17F - 0x0858, 0x085d, 0x085d, 0x0865, 0x0865, 0x086f, 0x0879, 0x087e, - 0x0889, 0x0889, 0x088d, 0x0891, 0x0897, 0x089c, 0x08a5, 0x08a5, - 0x08a5, 0x08ab, 0x08b1, 0x08b8, 0x08c4, 0x08d0, 0x08d0, 0x08dd, - 0x08e3, 0x08e9, 0x08ec, 0x08f1, 0x08f5, 0x08fe, 0x08fe, 0x0902, - 0x0909, 0x0915, 0x0915, 0x0919, 0x0919, 0x091e, 0x0929, 0x0935, - 0x0935, 0x0935, 0x0939, 0x0941, 0x0949, 0x0949, 0x0950, 0x095a, - 0x0960, 0x096f, 0x096f, 0x096f, 0x0976, 0x097c, 0x0984, 0x0989, - 0x0990, 0x0995, 0x099c, 0x09a2, 0x09a7, 0x09ad, 0x09b2, 0x09ba, - // Entry 180 - 1BF - 0x09ba, 0x09ba, 0x09ba, 0x09c0, 0x09c0, 0x09c5, 0x09c9, 0x09d4, - 0x09d4, 0x09de, 0x09e5, 0x09ea, 0x09ed, 0x09f3, 0x09fb, 0x09fb, - 0x09fb, 0x0a05, 0x0a05, 0x0a0b, 0x0a13, 0x0a1a, 0x0a22, 0x0a27, - 0x0a27, 0x0a2d, 0x0a33, 0x0a38, 0x0a3c, 0x0a44, 0x0a4e, 0x0a5c, - 0x0a63, 0x0a69, 0x0a74, 0x0a7b, 0x0a83, 0x0a89, 0x0a8e, 0x0a8e, - 0x0a95, 0x0aa2, 0x0aa7, 0x0ab2, 0x0ab9, 0x0ab9, 0x0ab9, 0x0abe, - 0x0ac9, 0x0ac9, 0x0ad4, 0x0ad8, 0x0ae0, 0x0ae6, 0x0aea, 0x0af0, - 0x0af0, 0x0af6, 0x0aff, 0x0b04, 0x0b0f, 0x0b0f, 0x0b15, 0x0b1e, - // Entry 1C0 - 1FF - 0x0b22, 0x0b33, 0x0b3b, 0x0b43, 0x0b48, 0x0b4d, 0x0b52, 0x0b63, - 0x0b6d, 0x0b74, 0x0b7c, 0x0b86, 0x0b8e, 0x0b8e, 0x0b9f, 0x0b9f, - 0x0b9f, 0x0bac, 0x0bac, 0x0bb5, 0x0bb5, 0x0bb5, 0x0bbd, 0x0bc7, - 0x0bd9, 0x0be1, 0x0be1, 0x0beb, 0x0bf2, 0x0bfe, 0x0bfe, 0x0bfe, - 0x0c03, 0x0c09, 0x0c09, 0x0c09, 0x0c09, 0x0c11, 0x0c14, 0x0c1b, - 0x0c20, 0x0c34, 0x0c3b, 0x0c40, 0x0c47, 0x0c47, 0x0c4e, 0x0c53, - 0x0c5d, 0x0c63, 0x0c63, 0x0c63, 0x0c63, 0x0c67, 0x0c67, 0x0c70, - 0x0c7f, 0x0c89, 0x0c89, 0x0c92, 0x0c96, 0x0c96, 0x0c9c, 0x0c9c, - // Entry 200 - 23F - 0x0c9c, 0x0ca6, 0x0cb0, 0x0cbb, 0x0cc7, 0x0cce, 0x0cd5, 0x0ce1, - 0x0ce6, 0x0cea, 0x0cea, 0x0cf0, 0x0cf4, 0x0cfc, 0x0d04, 0x0d13, - 0x0d19, 0x0d19, 0x0d19, 0x0d1e, 0x0d22, 0x0d28, 0x0d2d, 0x0d33, - 0x0d37, 0x0d3e, 0x0d3e, 0x0d45, 0x0d4c, 0x0d4c, 0x0d54, 0x0d61, - 0x0d6a, 0x0d6a, 0x0d70, 0x0d70, 0x0d79, 0x0d79, 0x0d80, 0x0d86, - 0x0d8d, 0x0d95, 0x0da6, 0x0dac, 0x0db5, 0x0dbc, 0x0dbf, 0x0dc2, - 0x0dc2, 0x0dc2, 0x0dc2, 0x0dc2, 0x0dc8, 0x0dc8, 0x0dcd, 0x0dd7, - 0x0ddf, 0x0de4, 0x0de9, 0x0de9, 0x0de9, 0x0df2, 0x0df2, 0x0df6, - // Entry 240 - 27F - 0x0df9, 0x0e01, 0x0e08, 0x0e0d, 0x0e0d, 0x0e18, 0x0e1f, 0x0e29, - 0x0e29, 0x0e2f, 0x0e4c, 0x0e50, 0x0e66, 0x0e6a, 0x0e81, 0x0e81, - 0x0e81, 0x0e81, 0x0e81, 0x0e81, 0x0e90, 0x0e90, 0x0e90, 0x0e90, - 0x0e90, 0x0e90, 0x0e90, 0x0e90, 0x0e9b, 0x0ea1, 0x0ea1, 0x0ea1, - 0x0eaa, 0x0eb7, 0x0eb7, 0x0ec8, 0x0edd, - }, - }, - { // nnh - "nzǎmɔ̂ɔnngilísèShwóŋò menkesaŋfelaŋséeShwóŋò pʉa mbasǎShwóŋò pamomShwóŋò" + - " pʉa nzsekàʼaShwóŋò pafudShwóŋò pʉ̀a njinikomShwóŋò pakɔsiShwóŋò mbu" + - "luShwóŋò ngáŋtÿɔʼShwóŋò pʉa YɔɔnmendiShwóŋò pʉa shÿó BɛgtùaShwóŋò ng" + - "iembɔɔnShwóŋò pʉa shÿó MbafìaShwóŋò Tsaŋ", - []uint16{ // 580 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0028, 0x0028, 0x0028, 0x0028, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - // Entry 40 - 7F - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - // Entry 80 - BF - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - // Entry C0 - FF - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0047, 0x0056, 0x0056, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x007e, 0x007e, 0x007e, - 0x007e, 0x007e, 0x007e, 0x007e, 0x0097, 0x0097, 0x0097, 0x0097, - 0x0097, 0x0097, 0x0097, 0x00a8, 0x00a8, 0x00a8, 0x00b7, 0x00b7, - 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, - 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, - // Entry 100 - 13F - 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, - 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, - 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, - 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00e8, 0x00e8, - 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, - 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, - 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, - 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, - // Entry 140 - 17F - 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, - 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, - 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, - 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, - 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, - 0x00e8, 0x00e8, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - // Entry 180 - 1BF - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - // Entry 1C0 - 1FF - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - // Entry 200 - 23F - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - // Entry 240 - 27F - 0x011b, 0x011b, 0x0138, 0x0147, - }, - }, - { // no - noLangStr, - noLangIdx, - }, - { // nus - "Thok aka̱niThok bunyniThok JalabniThok bäläruthaThok bälga̱a̱rianiThok b" + - "ängaliThok cikThok jarmaniThok girikniThok liŋli̱thniThok i̱thpaani" + - "aniThok perthianiThok pɔrɔthaniThok ɣowthaniThok ɣändiniThok ɣänga̱a" + - "̱riɛniThok indunithianiThok i̱gboniThok i̱talianiThok japanniThok j" + - "abanithniThok kameeriThok kurianiThok mayɛyniThok bormi̱thniThok nap" + - "alniThok da̱cThok puɔnjabaniThok pölicniThok puɔtigaliThok ji̱ römTh" + - "ok ra̱ciaaniThok ruaandaniThok thomaalianiThok i̱thwidicniThok tamil" + - "niThok tayniThok turkicniThok ukeraaniniThok udoniThok betnaamniThok" + - " yurubaniThok caynaThok dhuluniThok Nath", - []uint16{ // 449 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x0017, 0x0017, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0033, 0x0048, - 0x0048, 0x0048, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0075, 0x0086, 0x0086, 0x0098, - 0x0098, 0x0098, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00b6, - 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00c4, - 0x00c4, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00e9, 0x00e9, 0x00e9, - // Entry 40 - 7F - 0x00e9, 0x00fa, 0x00fa, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, - 0x0116, 0x0116, 0x0122, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, - 0x0131, 0x0131, 0x013d, 0x013d, 0x0149, 0x0149, 0x0149, 0x0149, - 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, - 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, - 0x0149, 0x0149, 0x0149, 0x0156, 0x0156, 0x0166, 0x0166, 0x0166, - 0x0172, 0x0172, 0x017c, 0x017c, 0x017c, 0x017c, 0x017c, 0x017c, - 0x017c, 0x017c, 0x017c, 0x017c, 0x017c, 0x018c, 0x018c, 0x0199, - // Entry 80 - BF - 0x0199, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01b6, 0x01c5, 0x01d3, - 0x01d3, 0x01d3, 0x01d3, 0x01d3, 0x01d3, 0x01d3, 0x01d3, 0x01d3, - 0x01d3, 0x01d3, 0x01e3, 0x01e3, 0x01e3, 0x01e3, 0x01e3, 0x01e3, - 0x01f4, 0x01f4, 0x0200, 0x0200, 0x0200, 0x020a, 0x020a, 0x020a, - 0x020a, 0x020a, 0x0217, 0x0217, 0x0217, 0x0217, 0x0217, 0x0226, - 0x0230, 0x0230, 0x0230, 0x023e, 0x023e, 0x023e, 0x023e, 0x023e, - 0x023e, 0x024b, 0x024b, 0x0255, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - // Entry C0 - FF - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - // Entry 100 - 13F - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - // Entry 140 - 17F - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - // Entry 180 - 1BF - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - // Entry 1C0 - 1FF - 0x026a, - }, - }, - { // nyn - "OrukaniOrumarikiOruharabuOruberarusiOruburugariyaOrubengariOruceekiOrugi" + - "rimaaniOruguriikiOrungyerezaOrusupaaniOrupaasiyaOrufaransaOruhausaOr" + - "uhindiOruhangareOruindoneziaOruiboOruyitareOrujapaaniOrujavaOrukambo" + - "diyaOrukoreyaOrumalesiyaOruburumaOrunepaliOrudaakiOrupungyabiOrupoor" + - "iOrupocugoOruromaniaOrurrashaOrunyarwandaOrusomaariOruswidiOrutamiri" + - "OrutailandiOrukurukiOrukurainiOru-UruduOruviyetinaamuOruyorubaOrucha" + - "inaOruzuruRunyankore", - []uint16{ // 452 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0010, 0x0010, - 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0031, - 0x0031, 0x0031, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, - 0x004f, 0x004f, 0x004f, 0x004f, 0x0059, 0x0064, 0x0064, 0x006e, - 0x006e, 0x006e, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x008a, - 0x008a, 0x0092, 0x0092, 0x0092, 0x0092, 0x009c, 0x009c, 0x009c, - // Entry 40 - 7F - 0x009c, 0x00a8, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00b7, 0x00b7, 0x00c1, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00d4, 0x00d4, 0x00dd, 0x00dd, 0x00dd, 0x00dd, - 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, - 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, - 0x00dd, 0x00dd, 0x00dd, 0x00e8, 0x00e8, 0x00f1, 0x00f1, 0x00f1, - 0x00fa, 0x00fa, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, - 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x010d, 0x010d, 0x0115, - // Entry 80 - BF - 0x0115, 0x011e, 0x011e, 0x011e, 0x011e, 0x0128, 0x0131, 0x013d, - 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, - 0x013d, 0x013d, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, - 0x014f, 0x014f, 0x0158, 0x0158, 0x0158, 0x0163, 0x0163, 0x0163, - 0x0163, 0x0163, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x0176, - 0x017f, 0x017f, 0x017f, 0x018d, 0x018d, 0x018d, 0x018d, 0x018d, - 0x018d, 0x0196, 0x0196, 0x019f, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - // Entry C0 - FF - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - // Entry 100 - 13F - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - // Entry 140 - 17F - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - // Entry 180 - 1BF - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - // Entry 1C0 - 1FF - 0x01a6, 0x01a6, 0x01a6, 0x01b0, - }, - }, - { // om - "AfrikootaAfaan SidaamaaArabiffaaAfaan AzerbaijaniAfaan BelarusiaAfaan Bu" + - "lgariyaAfaan BaangladeshiAfaan BosniyaaAfaan KatalaaAfaan CzechWelis" + - "hiffaaAfaan DeenmaarkAfaan JarmaniiAfaan GiriikiIngliffaAfaan Espera" + - "ntooAfaan IspeenAfaan IstooniyaAfaan BaskuuAfaan PersiaAfaan Fiilaan" + - "diAfaan FaroeseAfaan FaransaayiiAfaan FirisiyaaniAfaan AyirishiiScot" + - "s GaelicAfaan GalishiiAfaan GuaraniAfaan GujaratiAfaan HebrewAfaan H" + - "indiiAfaan CroatianAfaan HangaariInterlinguaAfaan IndoneziyaAyiislan" + - "diffaaAfaan XaaliyaaniAfaan JapaniiAfaan JavaAfaan GeorgianAfaan Kan" + - "nadaAfaan KoreaAfaan LaatiniAfaan LiituniyaaAfaan LativiyaaAfaan Mac" + - "edooniyaaMalayaalamiffaaAfaan MaratiiMalaayiffaaAfaan MaltesiiAfaan " + - "NepaliiAfaan DachiiAfaan NorwegianAfaan NorweyiiAfaan OccitOromooAfa" + - "an PunjabiiAfaan PolandiiAfaan PorchugaalAfaan RomaniyaaAfaan Rushiy" + - "aaAfaan SinhaleseAfaan SlovakAfaan IslovaniyaaAfaan AlbaniyaaAfaan S" + - "erbiyaAfaan SudaaniiAfaan SuwidiinSuwahiliiAfaan TamiliiAfaan Telugu" + - "Afaan TayiiAfaan TigireeLammii TurkiiAfaan TurkiiAfaan UkreeniiAfaan" + - " UrduAfaan UzbekAfaan VeetinamAfaan XhosaChineseAfaan ZuuluAfaan Fil" + - "ippiniiAfaan KilingonAfaan Portugali (Braazil)Afaan Protuguese", - []uint16{ // 608 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0009, 0x0017, 0x0017, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0031, 0x0031, 0x0040, 0x004f, - 0x004f, 0x004f, 0x0061, 0x0061, 0x0061, 0x006f, 0x007c, 0x007c, - 0x007c, 0x007c, 0x007c, 0x0087, 0x0087, 0x0087, 0x0092, 0x00a1, - 0x00af, 0x00af, 0x00af, 0x00af, 0x00bc, 0x00c4, 0x00d4, 0x00e0, - 0x00ef, 0x00fb, 0x0107, 0x0107, 0x0116, 0x0116, 0x0123, 0x0134, - 0x0145, 0x0154, 0x0160, 0x016e, 0x017b, 0x0189, 0x0189, 0x0189, - 0x0195, 0x01a1, 0x01a1, 0x01af, 0x01af, 0x01bd, 0x01bd, 0x01bd, - // Entry 40 - 7F - 0x01c8, 0x01d8, 0x01d8, 0x01d8, 0x01d8, 0x01d8, 0x01d8, 0x01e6, - 0x01f6, 0x01f6, 0x0203, 0x020d, 0x021b, 0x021b, 0x021b, 0x021b, - 0x021b, 0x021b, 0x021b, 0x0228, 0x0233, 0x0233, 0x0233, 0x0233, - 0x0233, 0x0233, 0x0233, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0250, 0x0250, 0x025f, 0x025f, 0x025f, 0x025f, 0x0271, - 0x0280, 0x0280, 0x028d, 0x0298, 0x02a6, 0x02a6, 0x02a6, 0x02a6, - 0x02b3, 0x02b3, 0x02bf, 0x02ce, 0x02dc, 0x02dc, 0x02dc, 0x02dc, - 0x02e7, 0x02e7, 0x02ed, 0x02ed, 0x02ed, 0x02fb, 0x02fb, 0x0309, - // Entry 80 - BF - 0x0309, 0x0319, 0x0319, 0x0319, 0x0319, 0x0328, 0x0336, 0x0336, - 0x0336, 0x0336, 0x0336, 0x0336, 0x0336, 0x0345, 0x0351, 0x0362, - 0x0362, 0x0362, 0x0362, 0x0371, 0x037e, 0x037e, 0x037e, 0x038c, - 0x039a, 0x03a3, 0x03b0, 0x03bc, 0x03bc, 0x03c7, 0x03d4, 0x03e1, - 0x03e1, 0x03e1, 0x03ed, 0x03ed, 0x03ed, 0x03ed, 0x03ed, 0x03fb, - 0x0405, 0x0410, 0x0410, 0x041e, 0x041e, 0x041e, 0x041e, 0x0429, - 0x0429, 0x0429, 0x0429, 0x0430, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - // Entry C0 - FF - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - // Entry 100 - 13F - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, - 0x043b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - // Entry 140 - 17F - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - // Entry 180 - 1BF - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - // Entry 1C0 - 1FF - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - // Entry 200 - 23F - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, - 0x044b, 0x044b, 0x044b, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, - 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, - 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, - 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, - 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, - // Entry 240 - 27F - 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, - 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, - 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, - 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0472, 0x0482, - }, - }, - { // or - "ଅଫାର୍ଆବ୍ଖାଜିଆନ୍ଅବେସ୍ତନଆଫ୍ରିକାନସ୍ଅକନ୍ଆମହାରକିଆର୍ଗୋନୀଆରବିକ୍ଆସାମୀଆଭାରିକ୍ଆୟମା" + - "ରାଆଜେରବାଇଜାନିବଶଖିର୍ବେଲାରୁଷିଆନ୍ବୁଲଗେରିଆନ୍ବିସଲାମାବାମ୍ବାରାବଙ୍ଗାଳୀତିବେ" + - "ତାନ୍ବ୍ରେଟନ୍କାଟଲାନ୍କାଟାଲାନ୍ଚେଚନ୍ଚାମୋରୋକୋର୍ସିକାନ୍କ୍ରୀଚେକ୍ଚର୍ଚ୍ଚ ସ୍ଲା" + - "ଭିକ୍ଚୁଭାଶ୍ୱେଲ୍ସଡାନ୍ନିସ୍ଜର୍ମାନ୍ଡିଭେହୀଭୂଟାନୀଇୱେଗ୍ରୀକ୍ଇଂରାଜୀଏସ୍ପାରେଣ୍" + - "ଟୋସ୍ପାନିସ୍ଏସ୍ତୋନିଆନ୍ବାସ୍କ୍ୱିପର୍ସିଆନ୍ଫୁଲାହଫିନ୍ନିସ୍ଫିଜିଫାରୋଏସେଫ୍ରେଞ୍" + - "ଚପଶ୍ଚିମ ଫ୍ରିସିୟନ୍ଇରିସ୍ସ୍କଟିସ୍ ଗାଏଲିକ୍ଗାଲସିଆନ୍ଗୁଆରାନୀଗୁଜୁରାଟୀମାଁକ୍ସ" + - "ହୌସାହେବ୍ର୍ୟୁହିନ୍ଦୀହିରି ମୋଟୁକ୍ରୋଆଟିଆନ୍ହୈତାୟିନ୍ହଙ୍ଗେରିଆନ୍ଆର୍ମେନିଆନ୍ହ" + - "େରେରୋଇର୍ଣ୍ଟଲିଙ୍ଗୁଆଇଣ୍ଡୋନେସିଆନ୍ଇର୍ଣ୍ଟରଲିଙ୍ଗୁଇଇଗ୍ବୋସିଚୁଆନ୍ ୟୀଇନୁପିୟା" + - "କ୍ଇଡୋଆଇସଲାଣ୍ଡିକ୍ଇଟାଲିଆନ୍ଇନକୀଟୁତ୍ଜାପାନୀଜ୍ଜାଭାନୀଜ୍ଜର୍ଜିଆନ୍କଙ୍ଗୋକୀକୁୟ" + - "ୁକ୍ୱାନ୍ୟାମ୍କାଜାକ୍ଗ୍ରୀନଲାଣ୍ଡିକ୍ଖ୍ମେର୍କନ୍ନଡକୋରିଆନ୍କନୁରୀକାଶ୍ମିରୀକୁର୍ଦ" + - "୍ଦିଶ୍କୋମିକୋର୍ନିସ୍କିରଗିଜ୍ଲାଟିନ୍ଲକ୍ସେମବର୍ଗିସ୍ଗନ୍ଦାଲିମ୍ବୁର୍ଗିସ୍ଲିଙ୍ଗା" + - "ଲାଲାଓଲିଥୁଆନିଆନ୍ଲ୍ୟୁବା-କାଟାଙ୍ଗାଲାଟଭିଆନ୍ମାଲାଗାସୀମାର୍ଶାଲୀଜ୍ମାଓରୀମାକଡୋ" + - "ନିଆନ୍ମାଲାୟଲମ୍ମଙ୍ଗୋଲିଆନ୍ମରାଠୀମାଲୟମାଲଟୀଜ୍ବର୍ମୀଜ୍ନାଉରୁଉତ୍ତର ନେଡବେଲେନେ" + - "ପାଳୀଡୋଙ୍ଗାଡଚ୍ନରୱେଜିଆନ୍ ନିୟୋର୍ସ୍କନରୱେଜିଆନ୍ ବୋକମଲ୍ଦକ୍ଷିଣ ନେଡବେଲେନାଭା" + - "ଜୋନିୟାଞ୍ଜଓସିଟାନ୍ଓଜିୱାଓରୋମୋଓଡ଼ିଆଓସେଟିକ୍ପଞ୍ଜାବୀପାଲିପୋଲିଶ୍ପାସ୍ତୋପର୍ତ୍" + - "ତୁଗ୍ରୀଜ୍କ୍ୱେଚୁଆରେହେଟୋ-ରୋମାନ୍ସରୁଣ୍ଡିରୋମାନିଆନ୍ରଷିଆନ୍କିନ୍ୟାରୱାଣ୍ଡାସଂସ" + - "୍କୃତସର୍ଦିନିଆନ୍ସିନ୍ଧୀଉତ୍ତର ସାମିସାଙ୍ଗୋସିଂହଳସ୍ଲୋଭାକ୍ସ୍ଲୋଭେନିଆନ୍ସାମୋଆନ" + - "୍ଶୋନାସୋମାଲିଆଆଲବାନିଆନ୍ସର୍ବିଆନ୍ସ୍ବାତୀସେସୋଥୋସୁଦାନୀଜ୍ସ୍ୱେଡିସ୍ସ୍ୱାହିଲ୍ତ" + - "ାମିଲ୍ତେଲୁଗୁତାଜିକ୍ଥାଇଟ୍ରିଗିନିଆତୁର୍କମେନ୍ସେସ୍ବାନାଟୋଙ୍ଗାତୁର୍କିସ୍ସୋଂଗାତ" + - "ାତାର୍ତାହିତିଆନ୍ୟୁଘୁର୍ୟୁକ୍ରାନିଆନ୍ଉର୍ଦ୍ଦୁଉଜବେକ୍ଭେଣ୍ଡାଭିଏତନାମିଜ୍ବୋଲାପୁ" + - "କୱାଲୁନ୍ୱୋଲଫ୍ଖୋସାୟିଡିସ୍ୟୋରୁବାଜୁଆଙ୍ଗଚାଇନୀଜ୍ଜୁଲୁଆଚାଇନୀଜ୍ଆକୋଲିଆଦାଙ୍ଗେମ" + - "୍ଅଦ୍ୟଘେଆଫ୍ରିହିଲିଆଇନୁଆକାଡିଆନ୍ଆଲେଇଟୁଦକ୍ଷିଣ ଆଲ୍ଟାଇପୁରୁଣା ଇଁରାଜୀଅଁଗୀକା" + - "ଆରାମାଇକ୍ଆରାଉକାନିଆନ୍ଆରାପାହୋଆରୱକଆଷ୍ଟୁରିଆନ୍ଆୱାଧିବାଲୁଚିବାଲିନୀଜ୍ବାସାବେଜ" + - "ାବେମ୍ବାଭୋଜପୁରୀବିକୋଲ୍ବିନିବିକ୍ସିକାବ୍ରାଜ୍ବୁରିଆଟ୍ବୁଗୀନୀଜ୍ବ୍ଲିନ୍କାଡୋକାର" + - "ିବ୍ଆତ୍ସମ୍ସୀବୁଆନୋଚିବ୍ଚାଛଗତାଇଚୁକୀସେମାରୀଚିନୁକ୍ ଜାରଗାଁନ୍ଚୋଟୱାଚିପେୱାନ୍ଚ" + - "େରୋକୀଚେଚେନାକପ୍ଟିକ୍କ୍ରୀମିନ୍ ତୁର୍କୀସ୍କାଶୁବିଆନ୍ଡାକୋଟାଡାରାଗ୍ୱାଡେଲାୱେର୍" + - "ସ୍ଲେଭ୍ଡୋଗ୍ରିବ୍ଦିଙ୍କାଡୋଗ୍ରୀନିଚଳା ସର୍ବିଆନ୍ଡୁଆନାମଧ୍ୟ ପର୍ତ୍ତୁଗାଲୀଡୁଆଲା" + - "ଏଫିକ୍ପ୍ରାଚୀନ୍ ମିଶିରିଏକାଜୁକ୍ଏଲାମାଇଟ୍ମଧ୍ୟ ଇଁରାଜୀଇୱୋଣ୍ଡୋଫାଙ୍ଗଫିଲିପିନୋ" + - "ଫନ୍ମଧ୍ୟ ଫ୍ରେଞ୍ଚପୁରୁଣା ଫ୍ରେଞ୍ଚଉତ୍ତର ଫ୍ରିସିୟାନ୍ପୂର୍ବ ଫ୍ରିସିୟାନ୍ଫ୍ରିୟ" + - "ୁଲୀୟାନ୍ଗାଗାୟୋଗବାୟାଗୀଜ୍ଜିବ୍ରାଟୀଜ୍ମିଡିଲ୍ ହାଇ ଜର୍ମାନ୍ପୁରୁଣା ହାଇ ଜର୍ମା" + - "ନ୍ଗୋଣ୍ଡିଗୋରୋଣ୍ଟାଲୋଗୋଥିକ୍ଗ୍ରେବୋପ୍ରାଚୀନ୍ ୟୁନାନୀସ୍ବିସ୍ ଜର୍ମାନ୍ସ୍ବିଚ୍ " + - "ଇନ୍ହାଇଡାହାୱାଇନ୍ହିଲିଗୈନନ୍ହିତୀତେହଁଙ୍ଗଉପର ସର୍ବିଆନ୍ହୁପାଇବାନ୍ଇଲୋକୋଇଁଙ୍ଗ" + - "ୁଶ୍ଲୋଜବାନ୍ଜୁଡେଓ-ପର୍ସିଆନ୍ଜୁଡେଓ-ଆରବୀକ୍କାରା-କଲ୍ପକ୍କବାଇଲ୍କଚିନ୍ଜ୍ଜୁକମ୍ବ" + - "ାକାୱିକାବାର୍ଡିଆନ୍ତ୍ୟାପ୍କୋରୋଖାସୀଖୋତାନୀଜ୍କିମ୍ବୁଣ୍ଡୁକୋନକାନୀକୋସରୈନ୍କୈପେ" + - "ଲେକରାଚୟ-ବଲ୍କାରକାରେଲିୟାନ୍କୁରୁଖକୁମୀକ୍କୁତେନାଉଲାଦିନୋଲାହାଣ୍ଡାଲାମ୍ବାଲେଜଗ" + - "ିୟାନ୍ମଙ୍ଗୋଲୋଜିଲୁବା-ଲୁଲୁଆଲୁଇସେନୋଲୁଣ୍ଡାଲୁଓଲୁସାଉମାଦୁରୀସ୍ମାଗାହୀମୈଥିଳୀମ" + - "କାସର୍ମାଣ୍ଡିଙ୍ଗୋମାସାଇମୋକ୍ଷମନ୍ଦାରମେଣ୍ଡେମଧ୍ୟ ଇରିଶ୍ମିକମୌକ୍ମିନାଙ୍ଗାବାଉମ" + - "ାଞ୍ଚୁମଣିପୁରୀମୋହୌକମୋସିବିବିଧ ଭାଷାମାନକ୍ରୀକ୍ମିରାଣ୍ଡିଜ୍ମାରୱାରୀଏର୍ଜୟାନୀପ" + - "ୋଲିଟାନ୍ଲୋ ଜର୍ମାନ୍ନେୱାରୀନୀୟାସ୍ନିୟୁଆନ୍ନୋଗାଇପୁରୁଣା ନର୍ସଏନ୍କୋଉତ୍ତରୀ ସୋ" + - "ଥୋପାରମ୍ପରିକ ନେୱାରୀନ୍ୟାମୱେଜୀନ୍ୟାନକୋଲ୍ନ୍ୟାରୋଞ୍ଜିମାୱୌସେଜ୍ଓଟ୍ଟୋମନ୍ ତୁର" + - "୍କିସ୍ପାଙ୍ଗାସିନିଆନ୍ପାହ୍ଲାଭିପାମ୍ପାଙ୍ଗାପାପିୟାମିଣ୍ଟୋପାଲାଉଆନ୍ପୁରୁଣା ପର୍" + - "ସିଆନ୍ଫୋନେସିଆନ୍ପୋହପିଏନ୍ପୁରୁଣା ପ୍ରେଭେନେସିଆଲ୍ରାଜସ୍ଥାନୀରାପାନୁଇରାରୋତୋଙ୍" + - "ଗନ୍ରୋମାନିଆରୋମାନିଆନ୍ସଣ୍ଡାୱେୟାକୁଟ୍ସାମୌରିଟନ୍ ଆରମାଇକ୍ସାସାକ୍ସାନ୍ତାଳିସିଶ" + - "ିଲିଆନ୍ସ୍କଟସ୍ସେଲ୍କପ୍ପୁରୁଣା ଇରିଶ୍ଶାନ୍ସିଦାମୋଦକ୍ଷିଣ ସାମିଲୁଲେ ସାମିଇନାରୀ" + - " ସାମିସ୍କୋଲ୍ଟ ସାମୀସୋନିଙ୍କେସୋଗଡିଏନ୍ଶାରାନା ଟୋଙ୍ଗୋଶେରେର୍ସୁକୁମାଶୁଶୁସୁମେରି" + - "ଆନ୍କ୍ଲାସିକାଲ୍ ସିରିକ୍ସିରିକ୍ତିମନେତେରେନୋତେତୁମ୍ଟାଇଗ୍ରେତୀଭ୍ଟୋକେଲାଉକ୍ଲିଙ" + - "୍ଗନ୍ତ୍ଲିଙ୍ଗିଟ୍ତାମାଶେକ୍ନ୍ୟାସା ଟୋଙ୍ଗୋଟୋକ୍ ପିସିନ୍ତିସିମିସିଆନ୍ଟୁମ୍ବୁକାତ" + - "ୁଭାଲୁତୁଭିନିଆନ୍ଉଦମୂର୍ତ୍ତୟୁଗୋରଟିକ୍ଉମ୍ବୁଣ୍ଡୁମୂଳଭାଇଭୋଟିକ୍ୱାଲମୋୱାରୈୱାସୋ" + - "କାଲ୍ମୀକ୍ୟାଓୟାପୀସ୍ଜାପୋଟେକ୍ବ୍ଲିସିମ୍ବଲସ୍ଜେନାଗାଜୁନୀକୌଣସି ଲିଙ୍ଗୁଇଷ୍ଟ ସା" + - "ମଗ୍ରୀ ନାହିଁଜାଜାଅଷ୍ଟ୍ରିଆନ୍ ଜର୍ମାନସ୍ବିସ୍ ହାଇ ଜର୍ମାନ୍ଅଷ୍ଟ୍ରେଲିଆନ୍ ଇଁର" + - "ାଜୀକାନାଡିଆନ୍ ଇଁରାଜୀବ୍ରିଟିଶ୍ ଇଁରାଜୀୟୁ.ଏସ୍. ଇଁରାଜୀଲାଟିନ୍ ଆମେରିକାନ୍ ସ" + - "୍ପାନିଶ୍ଲେବେରିଆନ୍ ସ୍ପାନିଶ୍କାନାଡିଆନ୍ ଫ୍ରେଞ୍ଚସ୍ବିସ୍ ଫ୍ରେଞ୍ଚ୍ଫ୍ଲେମିଶ୍ବ" + - "୍ରାଜିଲିଆନ୍ ପର୍ତ୍ତୁଗୀଜ୍ଲେବେରିଆନ୍ ପର୍ତ୍ତୁଗୀଜ୍ମୋଲଡୋଭିଆନ୍ସର୍ବୋ-କ୍ରୋଆଟି" + - "ଆନ୍ସରଳିକରଣ ଚାଇନୀଜ୍ପାରମ୍ପରିକ ଚାଇନୀଜ୍", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x002d, 0x0042, 0x0060, 0x006c, 0x0081, 0x0096, - 0x00a8, 0x00b7, 0x00cc, 0x00de, 0x00ff, 0x0111, 0x0132, 0x0150, - 0x0165, 0x017d, 0x0192, 0x01aa, 0x01bf, 0x01d4, 0x01ec, 0x01fb, - 0x020d, 0x022b, 0x0237, 0x0243, 0x026e, 0x0280, 0x028f, 0x02a7, - 0x02bc, 0x02ce, 0x02e0, 0x02e9, 0x02fb, 0x030d, 0x032e, 0x0346, - 0x0364, 0x037c, 0x0394, 0x03a3, 0x03bb, 0x03c7, 0x03dc, 0x03f1, - 0x041f, 0x042e, 0x0459, 0x0471, 0x0486, 0x049e, 0x04b0, 0x04bc, - 0x04d4, 0x04e6, 0x04ff, 0x051d, 0x0535, 0x0553, 0x0571, 0x0583, - // Entry 40 - 7F - 0x05aa, 0x05ce, 0x05f8, 0x0607, 0x0623, 0x063e, 0x0647, 0x0668, - 0x0680, 0x0698, 0x06b0, 0x06c8, 0x06e0, 0x06ef, 0x0701, 0x071f, - 0x0731, 0x0758, 0x076a, 0x0779, 0x078e, 0x079d, 0x07b5, 0x07d3, - 0x07df, 0x07f7, 0x080c, 0x081e, 0x0845, 0x0854, 0x0878, 0x0890, - 0x0899, 0x08b7, 0x08e2, 0x08fa, 0x0912, 0x0930, 0x093f, 0x095d, - 0x0975, 0x0993, 0x09a2, 0x09ae, 0x09c3, 0x09d8, 0x09e7, 0x0a0c, - 0x0a1e, 0x0a30, 0x0a39, 0x0a70, 0x0a9e, 0x0ac6, 0x0ad8, 0x0aed, - 0x0b02, 0x0b11, 0x0b20, 0x0b2f, 0x0b44, 0x0b59, 0x0b65, 0x0b77, - // Entry 80 - BF - 0x0b89, 0x0bb0, 0x0bc5, 0x0bed, 0x0bff, 0x0c1a, 0x0c2c, 0x0c53, - 0x0c68, 0x0c86, 0x0c98, 0x0cb4, 0x0cc6, 0x0cd5, 0x0ced, 0x0d0e, - 0x0d23, 0x0d2f, 0x0d44, 0x0d5f, 0x0d77, 0x0d89, 0x0d9b, 0x0db3, - 0x0dcb, 0x0de3, 0x0df5, 0x0e07, 0x0e19, 0x0e22, 0x0e3d, 0x0e58, - 0x0e70, 0x0e82, 0x0e9a, 0x0ea9, 0x0ebb, 0x0ed6, 0x0ee8, 0x0f09, - 0x0f1e, 0x0f30, 0x0f42, 0x0f60, 0x0f75, 0x0f87, 0x0f96, 0x0fa2, - 0x0fb4, 0x0fc6, 0x0fd8, 0x0fed, 0x0ff9, 0x1011, 0x1020, 0x103b, - 0x104d, 0x104d, 0x1068, 0x1068, 0x1074, 0x108c, 0x108c, 0x109e, - // Entry C0 - FF - 0x109e, 0x10c3, 0x10e8, 0x10fa, 0x1112, 0x1133, 0x1133, 0x1148, - 0x1148, 0x1148, 0x1154, 0x1154, 0x1154, 0x1154, 0x1154, 0x1172, - 0x1172, 0x1181, 0x1193, 0x11ab, 0x11ab, 0x11b7, 0x11b7, 0x11b7, - 0x11b7, 0x11c3, 0x11d5, 0x11d5, 0x11d5, 0x11d5, 0x11d5, 0x11d5, - 0x11ea, 0x11fc, 0x1208, 0x1208, 0x1208, 0x1220, 0x1220, 0x1220, - 0x1232, 0x1232, 0x1232, 0x1232, 0x1247, 0x125f, 0x125f, 0x1271, - 0x1271, 0x127d, 0x128f, 0x128f, 0x12a1, 0x12b6, 0x12b6, 0x12c8, - 0x12d7, 0x12e9, 0x12f5, 0x1320, 0x132f, 0x1347, 0x1359, 0x136b, - // Entry 100 - 13F - 0x136b, 0x1380, 0x1380, 0x13b1, 0x13b1, 0x13cc, 0x13de, 0x13f6, - 0x13f6, 0x140e, 0x1420, 0x1438, 0x144a, 0x144a, 0x145c, 0x1484, - 0x1484, 0x1493, 0x14c1, 0x14c1, 0x14d0, 0x14d0, 0x14d0, 0x14df, - 0x14df, 0x150a, 0x151f, 0x1537, 0x1556, 0x1556, 0x156b, 0x156b, - 0x157a, 0x1592, 0x1592, 0x159b, 0x159b, 0x15bd, 0x15e5, 0x15e5, - 0x1613, 0x1641, 0x1665, 0x166b, 0x166b, 0x166b, 0x1677, 0x1686, - 0x1686, 0x1692, 0x16b0, 0x16b0, 0x16e2, 0x1714, 0x1714, 0x1726, - 0x1744, 0x1756, 0x1768, 0x1793, 0x17bb, 0x17bb, 0x17bb, 0x17bb, - // Entry 140 - 17F - 0x17d7, 0x17e6, 0x17e6, 0x17fb, 0x17fb, 0x1816, 0x1828, 0x1837, - 0x1859, 0x1859, 0x1865, 0x1874, 0x1874, 0x1883, 0x189b, 0x189b, - 0x189b, 0x18b0, 0x18b0, 0x18b0, 0x18d8, 0x18fa, 0x18fa, 0x1919, - 0x192b, 0x193a, 0x1946, 0x1955, 0x1961, 0x1982, 0x1982, 0x1994, - 0x1994, 0x1994, 0x1994, 0x19a0, 0x19a0, 0x19ac, 0x19c4, 0x19c4, - 0x19c4, 0x19c4, 0x19c4, 0x19c4, 0x19e2, 0x19e2, 0x19f7, 0x1a0c, - 0x1a1e, 0x1a40, 0x1a40, 0x1a40, 0x1a5e, 0x1a6d, 0x1a6d, 0x1a6d, - 0x1a6d, 0x1a7f, 0x1a94, 0x1aa6, 0x1aa6, 0x1abe, 0x1ad0, 0x1aeb, - // Entry 180 - 1BF - 0x1aeb, 0x1aeb, 0x1aeb, 0x1aeb, 0x1aeb, 0x1afa, 0x1b06, 0x1b06, - 0x1b06, 0x1b22, 0x1b37, 0x1b49, 0x1b52, 0x1b61, 0x1b61, 0x1b61, - 0x1b61, 0x1b79, 0x1b79, 0x1b8b, 0x1b9d, 0x1baf, 0x1bcd, 0x1bdc, - 0x1bdc, 0x1beb, 0x1bfd, 0x1c0f, 0x1c0f, 0x1c0f, 0x1c2b, 0x1c2b, - 0x1c2b, 0x1c40, 0x1c61, 0x1c73, 0x1c88, 0x1c97, 0x1ca3, 0x1ca3, - 0x1ca3, 0x1cc8, 0x1cda, 0x1cf8, 0x1d0d, 0x1d0d, 0x1d0d, 0x1d1f, - 0x1d1f, 0x1d1f, 0x1d3d, 0x1d3d, 0x1d59, 0x1d6b, 0x1d7d, 0x1d92, - 0x1d92, 0x1d92, 0x1d92, 0x1da1, 0x1dc0, 0x1dc0, 0x1dcf, 0x1dee, - // Entry 1C0 - 1FF - 0x1dee, 0x1e1c, 0x1e37, 0x1e52, 0x1e64, 0x1e76, 0x1e88, 0x1eb9, - 0x1ee0, 0x1ef8, 0x1f16, 0x1f3a, 0x1f52, 0x1f52, 0x1f52, 0x1f52, - 0x1f52, 0x1f7d, 0x1f7d, 0x1f98, 0x1f98, 0x1f98, 0x1fb0, 0x1fb0, - 0x1fea, 0x1fea, 0x1fea, 0x2005, 0x201a, 0x203b, 0x203b, 0x203b, - 0x203b, 0x204d, 0x204d, 0x204d, 0x204d, 0x206b, 0x206b, 0x2080, - 0x2092, 0x20c3, 0x20c3, 0x20d5, 0x20ed, 0x20ed, 0x20ed, 0x20ed, - 0x2108, 0x211a, 0x211a, 0x211a, 0x211a, 0x211a, 0x211a, 0x212f, - 0x212f, 0x2151, 0x2151, 0x2151, 0x215d, 0x215d, 0x216f, 0x216f, - // Entry 200 - 23F - 0x216f, 0x218e, 0x21a7, 0x21c3, 0x21e5, 0x21fd, 0x2215, 0x223a, - 0x224c, 0x224c, 0x224c, 0x225e, 0x226a, 0x2285, 0x2285, 0x22b6, - 0x22c8, 0x22c8, 0x22c8, 0x22d7, 0x22d7, 0x22e9, 0x22fb, 0x2310, - 0x231c, 0x2331, 0x2331, 0x234c, 0x236a, 0x236a, 0x2382, 0x23a7, - 0x23c6, 0x23c6, 0x23c6, 0x23c6, 0x23e7, 0x23e7, 0x23ff, 0x2411, - 0x2411, 0x242c, 0x242c, 0x2447, 0x2462, 0x247d, 0x2486, 0x248f, - 0x248f, 0x248f, 0x248f, 0x248f, 0x24a1, 0x24a1, 0x24a1, 0x24a1, - 0x24b0, 0x24bc, 0x24c8, 0x24c8, 0x24c8, 0x24e0, 0x24e0, 0x24e0, - // Entry 240 - 27F - 0x24e9, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x2513, 0x2537, - 0x2537, 0x2549, 0x2549, 0x2555, 0x25a9, 0x25b5, 0x25b5, 0x25b5, - 0x25e6, 0x2618, 0x264f, 0x267d, 0x26a8, 0x26cc, 0x2713, 0x2747, - 0x2747, 0x2747, 0x2778, 0x27a3, 0x27a3, 0x27bb, 0x27fe, 0x283b, - 0x2859, 0x2887, 0x2887, 0x28b2, 0x28e3, - }, - }, - { // os - "абхазагавестӕафрикаансараббагавайрагтӕтӕйрагбашкирагболгайрагбосниагката" + - "лайнагцӕцӕйнагчехагчувашагданиагнемыцагбердзейнаганглисагесперантои" + - "спайнагестойнагбаскагперсайнагфиннагфиджифарерагфранцагирландиагуир" + - "агхорватагвенгериагсомихагиталиагяпойнаггуырдзиагкурдаглатинагмӕчъи" + - "дониронпортугалиагуырыссагкитайагадыгейаграгон англисагбурятагкопта" + - "грагон египтагфилиппинаграгон францаграгон бердзейнагмӕхъӕлонкӕсгон" + - "бӕлхъӕронхъуымыхъхъаглекъагцигайнагнӕзонгӕ ӕвзагавстралиаг немыцагш" + - "вйецариаг немыцагавстралиаг англисагканадӕйаг англисагбритайнаг анг" + - "лисагамерикаг англисаглатинаг америкаг англисагевропӕйаг англисагка" + - "надӕйаг францагшвейцариаг францагбразилиаг португалиагевропӕйаг пол" + - "тугалиагӕнцонгонд китайагтрадицион китайаг", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000e, 0x001a, 0x002c, 0x002c, 0x002c, 0x002c, - 0x003a, 0x003a, 0x0048, 0x0048, 0x0058, 0x0068, 0x0068, 0x007a, - 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x0088, 0x009c, 0x00ac, - 0x00ac, 0x00ac, 0x00ac, 0x00b6, 0x00b6, 0x00c4, 0x00c4, 0x00d0, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00f2, 0x0102, 0x0114, 0x0124, - 0x0134, 0x0140, 0x0152, 0x0152, 0x015e, 0x0168, 0x0176, 0x0184, - 0x0184, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, - 0x01a0, 0x01a0, 0x01a0, 0x01b0, 0x01b0, 0x01c2, 0x01d0, 0x01d0, - // Entry 40 - 7F - 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, - 0x01de, 0x01de, 0x01ec, 0x01ec, 0x01fe, 0x01fe, 0x01fe, 0x01fe, - 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x020a, - 0x020a, 0x020a, 0x020a, 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, - 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, 0x0228, - 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, - 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, - 0x0228, 0x0228, 0x0228, 0x0228, 0x0230, 0x0230, 0x0230, 0x0230, - // Entry 80 - BF - 0x0230, 0x0246, 0x0246, 0x0246, 0x0246, 0x0246, 0x0256, 0x0256, - 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, - 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, - 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, - 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, - 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, - 0x0256, 0x0256, 0x0256, 0x0264, 0x0264, 0x0264, 0x0264, 0x0264, - 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, - // Entry C0 - FF - 0x0274, 0x0274, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, - 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, - 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, - 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, - 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, - 0x028f, 0x028f, 0x028f, 0x028f, 0x029d, 0x029d, 0x029d, 0x029d, - 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, - 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, - // Entry 100 - 13F - 0x029d, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, - 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, - 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, - 0x02a9, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, - 0x02c2, 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02ef, 0x02ef, - 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, - 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, - 0x02ef, 0x02ef, 0x02ef, 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, - // Entry 140 - 17F - 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, - 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, 0x031e, 0x031e, - 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, - 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, 0x032a, 0x032a, 0x032a, - 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, - 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, - 0x032a, 0x033c, 0x033c, 0x033c, 0x033c, 0x033c, 0x033c, 0x033c, - 0x033c, 0x0354, 0x0354, 0x0354, 0x0354, 0x0354, 0x0354, 0x0360, - // Entry 180 - 1BF - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - // Entry 1C0 - 1FF - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, - 0x0360, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, - 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, - 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, - 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, - // Entry 200 - 23F - 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, - 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, - 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, - 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, - 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, - 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - // Entry 240 - 27F - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, - 0x03ac, 0x03cf, 0x03f4, 0x0417, 0x043a, 0x045b, 0x048b, 0x04ae, - 0x04ae, 0x04ae, 0x04cf, 0x04f2, 0x04f2, 0x04f2, 0x051b, 0x0544, - 0x0544, 0x0544, 0x0544, 0x0565, 0x0586, - }, - }, - { // pa - paLangStr, - paLangIdx, - }, - { // pa-Arab - "پنجابی", - []uint16{ // 126 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, - }, - }, - { // pl - plLangStr, - plLangIdx, - }, - { // prg - "prūsiskan", - []uint16{ // 472 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 100 - 13F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 140 - 17F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 180 - 1BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 1C0 - 1FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, - }, - }, - { // ps - "امهاريعربيآساميبېلاروسيبلغاريبوسنيالمانيیونانيانګریزيحبشيباسکيفارسيفینلن" + - "ډيفرانسويعبريهنديارمنيایټالويجاپانیکرديلاتینيملغاسيمقدونيمغوليملایا" + - "نېپاليهالېنډيپولنډيپښتوپورتګاليروسيسنسکریټالبانيسویډنیتاجکيترکمنيتا" + - "تارازبکيچینيبلوڅي", - []uint16{ // 211 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, - 0x0014, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x002e, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0050, 0x0050, 0x0050, 0x0050, 0x005c, 0x006a, 0x006a, 0x006a, - 0x0072, 0x007c, 0x0086, 0x0086, 0x0094, 0x0094, 0x0094, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00aa, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00bc, 0x00bc, - // Entry 40 - 7F - 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, - 0x00ca, 0x00ca, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, - 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, - 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00f6, 0x00f6, 0x00f6, 0x0102, - 0x0102, 0x010c, 0x010c, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, - 0x0122, 0x0122, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, - 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x013c, - // Entry 80 - BF - 0x0144, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, 0x015c, 0x015c, - 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, - 0x016a, 0x016a, 0x016a, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, - 0x0182, 0x0182, 0x0182, 0x0182, 0x018c, 0x018c, 0x018c, 0x0198, - 0x0198, 0x0198, 0x0198, 0x0198, 0x01a2, 0x01a2, 0x01a2, 0x01a2, - 0x01a2, 0x01ac, 0x01ac, 0x01ac, 0x01ac, 0x01ac, 0x01ac, 0x01ac, - 0x01ac, 0x01ac, 0x01ac, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, - 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, - // Entry C0 - FF - 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, - 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, - 0x01b4, 0x01b4, 0x01be, - }, - }, - { // pt - ptLangStr, - ptLangIdx, - }, - { // pt-PT - ptPTLangStr, - ptPTLangIdx, - }, - { // qu - "Afrikaans SimiAmarico SimiArabe SimiAsames SimiAzerbaiyano SimiBaskir Si" + - "miBielorruso SimiBulgaro SimiBangla SimiTibetano SimiBreton SimiBosn" + - "io SimiCatalan SimiCorso SimiCheco SimiGales SimiDanes SimiAleman Si" + - "miDivehi SimiGriego SimiIngles SimiEspañol SimiEstonio SimiEuskera S" + - "imiPersa SimiFulah SimiFines SimiFeroes SimiFrances SimiFrison SimiI" + - "rlandes SimiGaelico Escoces SimiGallego SimiGujarati SimiHausa SimiH" + - "ebreo SimiHindi SimiCroata SimiHaitiano Criollo SimiHungaro SimiArme" + - "nio SimiIndonesio SimiIgbo SimiYi SimiIslandes SimiItaliano SimiInuk" + - "titut SimiJapones SimiGeorgiano SimiKazajo SimiGroenlandes SimiKhmer" + - " SimiKannada SimiCoreano SimiKirghiz SimiLuxemburgues SimiLao SimiLi" + - "tuano SimiLeton SimiMaori SimiMacedonio SimiMalayalam SimiMongol Sim" + - "iMarathi SimiMalayo SimiMaltes SimiNepali SimiNeerlandes SimiNoruego" + - " SimiOccitano SimiOdia SimiPunyabi SimiPolaco SimiPashto SimiPortugu" + - "es SimiRunasimiRomanche SimiRumano SimiRuso SimiKinyarwanda SimiSans" + - "crito SimiSindhi SimiChincha Sami SimiCingales SimiEslovaco SimiEslo" + - "veno SimiAlbanes SimiSerbio SimiSueco SimiSuajili SimiTamil SimiTelu" + - "gu SimiTayiko SimiTailandes SimiTigriña SimiTurcomano SimiSetsuana S" + - "imiTurco SimiTartaro SimiUigur SimiUcraniano SimiUrdu SimiUzbeko Sim" + - "iVietnamita SimiWolof SimiIsixhosa SimiYoruba SimiChino SimiIsizulu " + - "SimiMapuche SimiCheroqui SimiChawpi Kurdo SimiBajo Sorbio SimiFilipi" + - "no SimiAlsaciano SimiHmong Daw SimiAlto Sorbio SimiKonkani SimiMohaw" + - "k SimiSesotho Sa Leboa SimiPapiamento SimiKʼicheʼ SimiSakha SimiQull" + - "a Sami SimiSami Lule SimiSami Inari SimiSami Skolt SimiSiriaco Simi", - []uint16{ // 529 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x000e, 0x001a, 0x001a, - 0x0024, 0x002f, 0x002f, 0x002f, 0x003f, 0x004a, 0x0059, 0x0065, - 0x0065, 0x0065, 0x0070, 0x007d, 0x0088, 0x0093, 0x009f, 0x009f, - 0x009f, 0x00a9, 0x00a9, 0x00b3, 0x00b3, 0x00b3, 0x00bd, 0x00c7, - 0x00d2, 0x00dd, 0x00dd, 0x00dd, 0x00e8, 0x00f3, 0x00f3, 0x0100, - 0x010c, 0x0118, 0x0122, 0x012c, 0x0136, 0x0136, 0x0141, 0x014d, - 0x0158, 0x0165, 0x0179, 0x0185, 0x0185, 0x0192, 0x0192, 0x019c, - 0x01a7, 0x01b1, 0x01b1, 0x01bc, 0x01d1, 0x01dd, 0x01e9, 0x01e9, - // Entry 40 - 7F - 0x01e9, 0x01f7, 0x01f7, 0x0200, 0x0207, 0x0207, 0x0207, 0x0214, - 0x0221, 0x022f, 0x023b, 0x023b, 0x0249, 0x0249, 0x0249, 0x0249, - 0x0254, 0x0264, 0x026e, 0x027a, 0x0286, 0x0286, 0x0286, 0x0286, - 0x0286, 0x0286, 0x0292, 0x0292, 0x02a3, 0x02a3, 0x02a3, 0x02a3, - 0x02ab, 0x02b7, 0x02b7, 0x02c1, 0x02c1, 0x02c1, 0x02cb, 0x02d9, - 0x02e7, 0x02f2, 0x02fe, 0x0309, 0x0314, 0x0314, 0x0314, 0x0314, - 0x031f, 0x031f, 0x032e, 0x032e, 0x033a, 0x033a, 0x033a, 0x033a, - 0x0347, 0x0347, 0x0347, 0x0350, 0x0350, 0x035c, 0x035c, 0x0367, - // Entry 80 - BF - 0x0372, 0x0380, 0x0388, 0x0395, 0x0395, 0x03a0, 0x03a9, 0x03b9, - 0x03c7, 0x03c7, 0x03d2, 0x03e3, 0x03e3, 0x03f0, 0x03fd, 0x040a, - 0x040a, 0x040a, 0x040a, 0x0416, 0x0421, 0x0421, 0x0421, 0x0421, - 0x042b, 0x0437, 0x0441, 0x044c, 0x0457, 0x0465, 0x0472, 0x0480, - 0x048d, 0x048d, 0x0497, 0x0497, 0x04a3, 0x04a3, 0x04ad, 0x04bb, - 0x04c4, 0x04cf, 0x04cf, 0x04de, 0x04de, 0x04de, 0x04e8, 0x04f5, - 0x04f5, 0x0500, 0x0500, 0x050a, 0x0516, 0x0516, 0x0516, 0x0516, - 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, - // Entry C0 - FF - 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, 0x0522, 0x0522, 0x0522, - 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, - 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, - 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, - 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, - 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, - 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, - 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x052f, 0x052f, - // Entry 100 - 13F - 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, - 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0550, - 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, - 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, - 0x0550, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, - 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, - 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, - 0x055d, 0x055d, 0x055d, 0x055d, 0x056b, 0x056b, 0x056b, 0x056b, - // Entry 140 - 17F - 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x0579, - 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, - 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, - 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, - 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, - 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0595, 0x0595, - 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, - 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, - // Entry 180 - 1BF - 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, - 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, - 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, - 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, - 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x05a0, 0x05a0, 0x05a0, - 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, - 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, - 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05b5, - // Entry 1C0 - 1FF - 0x05b5, 0x05b5, 0x05b5, 0x05b5, 0x05b5, 0x05b5, 0x05b5, 0x05b5, - 0x05b5, 0x05b5, 0x05b5, 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05c4, - 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05c4, - 0x05c4, 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, - 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, - 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, - 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, - 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, - // Entry 200 - 23F - 0x05dc, 0x05eb, 0x05f9, 0x0608, 0x0617, 0x0617, 0x0617, 0x0617, - 0x0617, 0x0617, 0x0617, 0x0617, 0x0617, 0x0617, 0x0617, 0x0617, - 0x0623, - }, - }, - { // rm - "afarabchasianavesticafrikaansakanamaricaragonaisarabassamiavaricaymaraas" + - "erbeidschanicbaschkirbielorussbulgarbislamabambarabengaltibetanbreto" + - "nbosniaccatalantschetschenchamorrocorscreetschecslav da baselgiatsch" + - "uvaschkimricdanaistudestgmaledivicdzongkhaewegrecenglaisesperantospa" + - "gnolestonbascpersianfulahfinlandaisfidschianferraisfranzosfrisirland" + - "aisgaelic scotgalicianguaranigujaratimanxhaussaebraichindihiri motuc" + - "roathaitianungaraisarmenhererointerlinguaindonaisinterlingueigbosich" + - "uan yiinupiakidoislandaistalianinuktitutgiapunaisjavanaisgeorgiankon" + - "gokikuyukuanyamacasacgrönlandaiscambodschankannadacoreankanurikashmi" + - "ricurdkomicornickirghislatinluxemburgaisgandalimburgaislingalalaotli" + - "tuanluba-katangalettonmalagassimarschallaismaorimacedonmalayalammong" + - "olicmarathimalaicmaltaisbirmannaurundebele dal nordnepalaisndongaoll" + - "andaisnorvegiais nynorsknorvegais bokmålndebele dal sidnavajonyanjao" + - "ccitanojibwaoromooriyaosseticpunjabipalipolacpaschtoportugaisquechua" + - "rumantschrundirumenrusskinyarwandasanscritsardsindhisami dal nordsan" + - "gosingalaisslovacslovensamoanshonasomalialbanaisserbswazisotho dal s" + - "idsundanaissvedaissuahilitamiltelugutadjiktailandaistigrinyaturkment" + - "swanatongatirctsongatatartahitianuiguricucranaisurduusbecvendavietna" + - "maisvolapukvallonwolofxhosajiddicyorubazhuangchinaiszuluacehacoliand" + - "angmeadygaiafrihiliainuaccadicaleuticaltaic dal sidenglais veglangik" + - "aarameicaraucanicarapahoarawakasturianawadhibelutschibalinaisbasaabe" + - "dschabembabhojpuribikolbinisiksikabrajburiatbugiblincaddocaribicatsa" + - "mcebuanochibchatschagataicchuukaismaripatuà chinookchoctawchipewyanc" + - "herokeecheyennecoptictirc crimeankaschubicdakotadargwadelawareslavey" + - "dogribdinkadogribass sorbdualaollandais mesaundiulaefikegipzian vegl" + - "ekajukelamiticenglais mesaunewondofangfilippinofonfranzos mesaunfran" + - "zos veglfris dal nordfris da l’ostfriulangagayogbayageezgilbertaistu" + - "destg mesaunvegl tudestg da scrittiragondigorontalogoticgrebogrec ve" + - "gltudestg svizzergwichʼinhaidahawaianhiligaynonettitichmongaut sorbh" + - "upaibanilocanoingushlojbangiudaic-persiangiudaic-arabkarakalpakkabyl" + - "ekachinjjukambakawikabardictyapkorokhasikhotanaiskimbundukonkanikosr" + - "aeankpellekarachay-balkarcareliankurukhkumukkutenailadinolahndalamba" + - "lezghianlomongoloziluba-lulualuisenolundaluolushaimaduraismagahimait" + - "hilimakassarmandingomasaimokshamandarmendeirlandais mesaunmicmacmina" + - "ngkabaumanchumanipurimohawkmossiplurilingcreekmirandaismarwarierzyan" + - "eapolitanbass tudestgnewariniasniuenogainordic vegln’kosotho dal nor" + - "dnewari classicnyamwezinyankolenyoronzimaosagetirc ottomanpangasinan" + - "pahlavipampangapapiamentopalaupersian veglfenizianponapeanprovenzal " + - "veglrajasthanirapanuirarotongaromaniaromunicsandawejakutarameic sama" + - "ritansasaksantalisicilianscotselkupirlandais veglshansidamosami dal " + - "sidsami lulesami inarisami skoltsoninkesogdiansranan tongoserersukum" + - "asususumericsiric classicsirictemneterenotetumtigretivtokelauklingon" + - "ictlingittamasheqlingua tsongatok pisintsimshiantumbukatuvalutuvinia" + - "nudmurtugariticmbundulinguas betg determinadasvaivoticwalamowaraywas" + - "hokalmukyaoyapaiszapotecsimbols da Blisszenagazuninagins cuntegns li" + - "nguisticszazatudestg austriacenglais australianenglais canadaisengla" + - "is britannicenglais americanspagnol latinamericanspagnol ibericfranz" + - "os canadaisfranzos svizzerflamportugais brasilianportugais iberianmo" + - "ldavserbo-croatchinais simplifitgàchinais tradiziunal", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000d, 0x0014, 0x001d, 0x0021, 0x0027, 0x0030, - 0x0034, 0x003a, 0x0040, 0x0046, 0x0055, 0x005d, 0x0066, 0x006c, - 0x0073, 0x007a, 0x0080, 0x0087, 0x008d, 0x0094, 0x009b, 0x00a6, - 0x00ae, 0x00b2, 0x00b6, 0x00bc, 0x00cc, 0x00d6, 0x00dc, 0x00e2, - 0x00e9, 0x00f2, 0x00fa, 0x00fd, 0x0101, 0x0108, 0x0111, 0x0118, - 0x011d, 0x0121, 0x0128, 0x012d, 0x0137, 0x0140, 0x0147, 0x014e, - 0x0152, 0x015b, 0x0166, 0x016e, 0x0175, 0x017d, 0x0181, 0x0187, - 0x018d, 0x0192, 0x019b, 0x01a0, 0x01a7, 0x01af, 0x01b4, 0x01ba, - // Entry 40 - 7F - 0x01c5, 0x01cd, 0x01d8, 0x01dc, 0x01e6, 0x01ed, 0x01f0, 0x01f9, - 0x01ff, 0x0208, 0x0211, 0x0219, 0x0221, 0x0226, 0x022c, 0x0234, - 0x0239, 0x0245, 0x0250, 0x0257, 0x025d, 0x0263, 0x026b, 0x026f, - 0x0273, 0x0279, 0x0280, 0x0285, 0x0291, 0x0296, 0x02a0, 0x02a7, - 0x02ab, 0x02b1, 0x02bd, 0x02c3, 0x02cc, 0x02d8, 0x02dd, 0x02e4, - 0x02ed, 0x02f5, 0x02fc, 0x0302, 0x0309, 0x030f, 0x0314, 0x0324, - 0x032c, 0x0332, 0x033b, 0x034d, 0x035e, 0x036d, 0x0373, 0x0379, - 0x0380, 0x0386, 0x038b, 0x0390, 0x0397, 0x039e, 0x03a2, 0x03a7, - // Entry 80 - BF - 0x03ae, 0x03b7, 0x03be, 0x03c7, 0x03cc, 0x03d1, 0x03d5, 0x03e0, - 0x03e8, 0x03ec, 0x03f2, 0x03ff, 0x0404, 0x040d, 0x0413, 0x0419, - 0x041f, 0x0424, 0x042a, 0x0432, 0x0436, 0x043b, 0x0448, 0x0451, - 0x0458, 0x045f, 0x0464, 0x046a, 0x0470, 0x047a, 0x0482, 0x0489, - 0x048f, 0x0494, 0x0498, 0x049e, 0x04a3, 0x04ab, 0x04b2, 0x04ba, - 0x04be, 0x04c3, 0x04c8, 0x04d2, 0x04d9, 0x04df, 0x04e4, 0x04e9, - 0x04ef, 0x04f5, 0x04fb, 0x0502, 0x0506, 0x050a, 0x050f, 0x0517, - 0x051d, 0x051d, 0x0525, 0x0525, 0x0529, 0x0530, 0x0530, 0x0537, - // Entry C0 - FF - 0x0537, 0x0545, 0x0551, 0x0557, 0x055e, 0x0567, 0x0567, 0x056e, - 0x056e, 0x056e, 0x0574, 0x0574, 0x0574, 0x0574, 0x0574, 0x057c, - 0x057c, 0x0582, 0x058b, 0x0593, 0x0593, 0x0598, 0x0598, 0x0598, - 0x0598, 0x059f, 0x05a4, 0x05a4, 0x05a4, 0x05a4, 0x05a4, 0x05a4, - 0x05ac, 0x05b1, 0x05b5, 0x05b5, 0x05b5, 0x05bc, 0x05bc, 0x05bc, - 0x05c0, 0x05c0, 0x05c0, 0x05c0, 0x05c6, 0x05ca, 0x05ca, 0x05ce, - 0x05ce, 0x05d3, 0x05da, 0x05da, 0x05df, 0x05e6, 0x05e6, 0x05ed, - 0x05f8, 0x0600, 0x0604, 0x0612, 0x0619, 0x0622, 0x062a, 0x0632, - // Entry 100 - 13F - 0x0632, 0x0638, 0x0638, 0x0644, 0x0644, 0x064d, 0x0653, 0x0659, - 0x0659, 0x0661, 0x0667, 0x066d, 0x0672, 0x0672, 0x0677, 0x0680, - 0x0680, 0x0685, 0x0695, 0x0695, 0x069a, 0x069a, 0x069a, 0x069e, - 0x069e, 0x06ab, 0x06b1, 0x06b9, 0x06c7, 0x06c7, 0x06cd, 0x06cd, - 0x06d1, 0x06da, 0x06da, 0x06dd, 0x06dd, 0x06eb, 0x06f7, 0x06f7, - 0x0704, 0x0713, 0x071a, 0x071c, 0x071c, 0x071c, 0x0720, 0x0725, - 0x0725, 0x0729, 0x0733, 0x0733, 0x0741, 0x075a, 0x075a, 0x075f, - 0x0768, 0x076d, 0x0772, 0x077b, 0x078a, 0x078a, 0x078a, 0x078a, - // Entry 140 - 17F - 0x0793, 0x0798, 0x0798, 0x079f, 0x079f, 0x07a9, 0x07b0, 0x07b5, - 0x07bd, 0x07bd, 0x07c1, 0x07c5, 0x07c5, 0x07cc, 0x07d2, 0x07d2, - 0x07d2, 0x07d8, 0x07d8, 0x07d8, 0x07e7, 0x07f3, 0x07f3, 0x07fd, - 0x0803, 0x0809, 0x080c, 0x0811, 0x0815, 0x081d, 0x081d, 0x0821, - 0x0821, 0x0821, 0x0821, 0x0825, 0x0825, 0x082a, 0x0833, 0x0833, - 0x0833, 0x0833, 0x0833, 0x0833, 0x083b, 0x083b, 0x0842, 0x084a, - 0x0850, 0x085f, 0x085f, 0x085f, 0x0867, 0x086d, 0x086d, 0x086d, - 0x086d, 0x0872, 0x0879, 0x087f, 0x087f, 0x0885, 0x088a, 0x0892, - // Entry 180 - 1BF - 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0899, 0x089d, 0x089d, - 0x089d, 0x08a7, 0x08ae, 0x08b3, 0x08b6, 0x08bc, 0x08bc, 0x08bc, - 0x08bc, 0x08c4, 0x08c4, 0x08ca, 0x08d2, 0x08da, 0x08e2, 0x08e7, - 0x08e7, 0x08ed, 0x08f3, 0x08f8, 0x08f8, 0x08f8, 0x0908, 0x0908, - 0x0908, 0x090e, 0x0919, 0x091f, 0x0927, 0x092d, 0x0932, 0x0932, - 0x0932, 0x093b, 0x0940, 0x0949, 0x0950, 0x0950, 0x0950, 0x0955, - 0x0955, 0x0955, 0x095f, 0x095f, 0x096b, 0x0971, 0x0975, 0x0979, - 0x0979, 0x0979, 0x0979, 0x097e, 0x0989, 0x0989, 0x098f, 0x099d, - // Entry 1C0 - 1FF - 0x099d, 0x09ab, 0x09b3, 0x09bb, 0x09c0, 0x09c5, 0x09ca, 0x09d6, - 0x09e0, 0x09e7, 0x09ef, 0x09f9, 0x09fe, 0x09fe, 0x09fe, 0x09fe, - 0x09fe, 0x0a0a, 0x0a0a, 0x0a12, 0x0a12, 0x0a12, 0x0a1a, 0x0a1a, - 0x0a28, 0x0a28, 0x0a28, 0x0a32, 0x0a39, 0x0a42, 0x0a42, 0x0a42, - 0x0a42, 0x0a48, 0x0a48, 0x0a48, 0x0a48, 0x0a50, 0x0a50, 0x0a57, - 0x0a5c, 0x0a6d, 0x0a6d, 0x0a72, 0x0a79, 0x0a79, 0x0a79, 0x0a79, - 0x0a81, 0x0a85, 0x0a85, 0x0a85, 0x0a85, 0x0a85, 0x0a85, 0x0a8b, - 0x0a8b, 0x0a99, 0x0a99, 0x0a99, 0x0a9d, 0x0a9d, 0x0aa3, 0x0aa3, - // Entry 200 - 23F - 0x0aa3, 0x0aaf, 0x0ab8, 0x0ac2, 0x0acc, 0x0ad3, 0x0ada, 0x0ae6, - 0x0aeb, 0x0aeb, 0x0aeb, 0x0af1, 0x0af5, 0x0afc, 0x0afc, 0x0b09, - 0x0b0e, 0x0b0e, 0x0b0e, 0x0b13, 0x0b13, 0x0b19, 0x0b1e, 0x0b23, - 0x0b26, 0x0b2d, 0x0b2d, 0x0b36, 0x0b3d, 0x0b3d, 0x0b45, 0x0b52, - 0x0b5b, 0x0b5b, 0x0b5b, 0x0b5b, 0x0b64, 0x0b64, 0x0b6b, 0x0b71, - 0x0b71, 0x0b79, 0x0b79, 0x0b7f, 0x0b87, 0x0b8d, 0x0ba6, 0x0ba9, - 0x0ba9, 0x0ba9, 0x0ba9, 0x0ba9, 0x0bae, 0x0bae, 0x0bae, 0x0bae, - 0x0bb4, 0x0bb9, 0x0bbe, 0x0bbe, 0x0bbe, 0x0bc4, 0x0bc4, 0x0bc4, - // Entry 240 - 27F - 0x0bc7, 0x0bcd, 0x0bcd, 0x0bcd, 0x0bcd, 0x0bcd, 0x0bd4, 0x0be4, - 0x0be4, 0x0bea, 0x0bea, 0x0bee, 0x0c09, 0x0c0d, 0x0c0d, 0x0c0d, - 0x0c1d, 0x0c1d, 0x0c2f, 0x0c3f, 0x0c50, 0x0c60, 0x0c75, 0x0c83, - 0x0c83, 0x0c83, 0x0c93, 0x0ca2, 0x0ca2, 0x0ca6, 0x0cb9, 0x0cca, - 0x0cd0, 0x0cdb, 0x0cdb, 0x0cef, 0x0d02, - }, - }, - { // rn - "IgikaniIkimuharikiIcarabuIkibelarusiyaIkinyabuligariyaIkibengaliIgicekeI" + - "kidageIkigerekiIcongerezaIcesipanyoloIgiperisiIgifaransaIgihawusaIgi" + - "hindiIkinyahongiriyaIkinyendoziyaIkiguboIgitaliyaniIkiyapaniIkinyeja" + - "vaIgikambodiyaIkinyakoreyaIkinyamaleziyaIkinyabirimaniyaIkinepaliIgi" + - "holandiIgipunjabiIkinyapolonyeIgiporutugariIkirundiIkinyarumaniyaIki" + - "rusiyaIkinyarwandaIgisomaliIgisuweduwaIgitamiliIkinyatayilandiIgitur" + - "ukiyaIkinyayukereniInyeyuruduIkinyaviyetinamuIkiyorubaIgishinwaIkizu" + - "lu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0012, 0x0012, - 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0026, 0x0036, - 0x0036, 0x0036, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - 0x004e, 0x004e, 0x004e, 0x004e, 0x0057, 0x0061, 0x0061, 0x006d, - 0x006d, 0x006d, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0089, - 0x0089, 0x0091, 0x0091, 0x0091, 0x0091, 0x00a0, 0x00a0, 0x00a0, - // Entry 40 - 7F - 0x00a0, 0x00ad, 0x00ad, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, - 0x00bf, 0x00bf, 0x00c8, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, - 0x00d2, 0x00d2, 0x00de, 0x00de, 0x00ea, 0x00ea, 0x00ea, 0x00ea, - 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, - 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, - 0x00ea, 0x00ea, 0x00ea, 0x00f8, 0x00f8, 0x0108, 0x0108, 0x0108, - 0x0111, 0x0111, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x0125, 0x0125, 0x0132, - // Entry 80 - BF - 0x0132, 0x013f, 0x013f, 0x013f, 0x0147, 0x0155, 0x015e, 0x016a, - 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, - 0x016a, 0x016a, 0x0173, 0x0173, 0x0173, 0x0173, 0x0173, 0x0173, - 0x017e, 0x017e, 0x0187, 0x0187, 0x0187, 0x0196, 0x0196, 0x0196, - 0x0196, 0x0196, 0x01a1, 0x01a1, 0x01a1, 0x01a1, 0x01a1, 0x01af, - 0x01b9, 0x01b9, 0x01b9, 0x01c9, 0x01c9, 0x01c9, 0x01c9, 0x01c9, - 0x01c9, 0x01d2, 0x01d2, 0x01db, 0x01e2, - }, - }, - { // ro - roLangStr, - roLangIdx, - }, - { // ro-MD - "wolayttaswahili (R. D. Congo)", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 100 - 13F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 140 - 17F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 180 - 1BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 1C0 - 1FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 200 - 23F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - // Entry 240 - 27F - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x001d, - }, - }, - { // rof - "KiakaniKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigi" + - "rikiKiingerezaKihispaniaKiajemiKyifaransaKihausaKihindiKihungariKiin" + - "donesiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKibur" + - "maKinepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwand" + - "aKisomaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuK" + - "iyorubaKichinaKizuluKihorombo", - []uint16{ // 481 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x000f, 0x000f, - 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0020, 0x002a, - 0x002a, 0x002a, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x0044, 0x0044, 0x0044, 0x0044, 0x004c, 0x0056, 0x0056, 0x0060, - 0x0060, 0x0060, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0071, - 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0078, - 0x0078, 0x007f, 0x007f, 0x007f, 0x007f, 0x0088, 0x0088, 0x0088, - // Entry 40 - 7F - 0x0088, 0x0093, 0x0093, 0x0099, 0x0099, 0x0099, 0x0099, 0x0099, - 0x00a3, 0x00a3, 0x00ab, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, - 0x00b1, 0x00b1, 0x00bb, 0x00bb, 0x00c2, 0x00c2, 0x00c2, 0x00c2, - 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, - 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, - 0x00c2, 0x00c2, 0x00c2, 0x00cb, 0x00cb, 0x00d2, 0x00d2, 0x00d2, - 0x00da, 0x00da, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, - 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00ec, 0x00ec, 0x00f5, - // Entry 80 - BF - 0x00f5, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x0104, 0x010a, 0x0115, - 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, - 0x0115, 0x0115, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, - 0x0124, 0x0124, 0x012b, 0x012b, 0x012b, 0x0135, 0x0135, 0x0135, - 0x0135, 0x0135, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x0146, - 0x014c, 0x014c, 0x014c, 0x0157, 0x0157, 0x0157, 0x0157, 0x0157, - 0x0157, 0x015f, 0x015f, 0x0166, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - // Entry C0 - FF - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - // Entry 100 - 13F - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - // Entry 140 - 17F - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - // Entry 180 - 1BF - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - // Entry 1C0 - 1FF - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, - 0x0175, - }, - }, - { // ru - ruLangStr, - ruLangIdx, - }, - {}, // ru-UA - { // rw - "IkinyafurikaneriInyetuwiInyamuharikiIcyarabuIcyasamiziInyazeribayijaniIk" + - "ibelarusiyaUrunyabuligariyaIkibengaliInyebiritoniInyebosiniyaIgikata" + - "laniIgicekeIkigaluwaIkidaninwaIkidageIkigerekiIcyongerezaIcyesiperan" + - "toIcyesipanyoloIcyesitoniyaIkibasikiInyeperisiIgifinilandeInyefaroyi" + - "ziIgifaransaIgifiriziyaniIkirilandiIkigaluwa cy’IgisweduwaIkigalisiy" + - "aInyaguwaraniInyegujaratiIgiheburayoIgihindiIgikorowasiyaIgihongiriy" + - "aIkinyarumeniyaUrurimi GahuzamiryangoIkinyendoziyaUruhuzandimiIgisil" + - "andeIgitaliyaniIkiyapaniInyejavaInyejeworujiyaIgikambodiyaIgikanadaI" + - "gikoreyaInyekuridishiInkerigiziIkilatiniIlingalaIkilawotiyaniIkilitu" + - "waniyaIkinyaletoviyaniIkimasedoniyaniIkimalayalamiIkimongoliIkimarat" + - "iIkimalayiIkimalitezeIkinepaliIkinerilandeInyenoruveji (Nyonorusiki)" + - "IkinoruvejiInyogusitaniInyoriyaIgipunjabiIgipoloneImpashitoIgiporutu" + - "galiIkinyarumaniyaIkirusiyaKinyarwandaIgisansikiriIgisindiInyesimpal" + - "ezeIgisilovakiIkinyasiloveniyaIgisomaliIcyalubaniyaIgiseribeInyeseso" + - "toInyesudaniIgisuweduwaIgiswahiliIgitamiliIgiteluguIgitayiInyatigiri" + - "nyaInyeturukimeniIgiturukiyaIkiwiguriIkinyayukereniInyeyuruduInyeyuz" + - "ubekiIkinyaviyetinamuInyehawusaInyeyidishiInyezuluIkinyafilipineInye" + - "kilingoniInyeporutigali (Brezili)Inyeporutigali (Igiporutigali)Inyes" + - "eribiya na Korowasiya", - []uint16{ // 610 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0018, 0x0024, 0x0024, - 0x002c, 0x0036, 0x0036, 0x0036, 0x0046, 0x0046, 0x0053, 0x0063, - 0x0063, 0x0063, 0x006d, 0x006d, 0x0079, 0x0085, 0x0090, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0097, 0x0097, 0x0097, 0x00a0, 0x00aa, - 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00ba, 0x00c5, 0x00d2, 0x00df, - 0x00eb, 0x00f4, 0x00fe, 0x00fe, 0x010a, 0x010a, 0x0116, 0x0120, - 0x012d, 0x0137, 0x0150, 0x015b, 0x0167, 0x0173, 0x0173, 0x0173, - 0x017e, 0x0186, 0x0186, 0x0193, 0x0193, 0x019f, 0x01ad, 0x01ad, - // Entry 40 - 7F - 0x01c3, 0x01d0, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01e6, - 0x01f1, 0x01f1, 0x01fa, 0x0202, 0x0210, 0x0210, 0x0210, 0x0210, - 0x0210, 0x0210, 0x021c, 0x0225, 0x022e, 0x022e, 0x022e, 0x023b, - 0x023b, 0x023b, 0x0245, 0x024e, 0x024e, 0x024e, 0x024e, 0x0256, - 0x0263, 0x0270, 0x0270, 0x0280, 0x0280, 0x0280, 0x0280, 0x028f, - 0x029c, 0x02a6, 0x02af, 0x02b8, 0x02c3, 0x02c3, 0x02c3, 0x02c3, - 0x02cc, 0x02cc, 0x02d8, 0x02f2, 0x02fd, 0x02fd, 0x02fd, 0x02fd, - 0x0309, 0x0309, 0x0309, 0x0311, 0x0311, 0x031b, 0x031b, 0x0324, - // Entry 80 - BF - 0x032d, 0x033a, 0x033a, 0x033a, 0x033a, 0x0348, 0x0351, 0x035c, - 0x0368, 0x0368, 0x0370, 0x0370, 0x0370, 0x037d, 0x0388, 0x0398, - 0x0398, 0x0398, 0x03a1, 0x03ad, 0x03b6, 0x03b6, 0x03c0, 0x03ca, - 0x03d5, 0x03df, 0x03e8, 0x03f1, 0x03f1, 0x03f8, 0x0405, 0x0413, - 0x0413, 0x0413, 0x041e, 0x041e, 0x041e, 0x041e, 0x0427, 0x0435, - 0x043f, 0x044b, 0x044b, 0x045b, 0x045b, 0x045b, 0x045b, 0x0465, - 0x0470, 0x0470, 0x0470, 0x0470, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - // Entry C0 - FF - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - // Entry 100 - 13F - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, - 0x0478, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - // Entry 140 - 17F - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - // Entry 180 - 1BF - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - // Entry 1C0 - 1FF - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - // Entry 200 - 23F - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, - 0x0486, 0x0486, 0x0486, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, - 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, - 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, - 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, - 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, - // Entry 240 - 27F - 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, - 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, - 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, - 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x04ab, 0x04c9, - 0x04c9, 0x04e3, - }, - }, - { // rwk - "KiakanyiKiamharyiKyiarabuKyibelarusiKyibulgaryiaKyibanglaKyicheckiKyijer" + - "umaniKyigirikiKyingerezaKyihispaniaKyiajemiKyifaransaKyihausaKyihind" + - "iKyihungariKyiindonesiaKyiigboKyiitalianoKyijapaniKyijavaKyikambodia" + - "KyikoreaKyimalesiaKyiburmaKyinepaliKyiholanziKyipunjabiKyipolandiKyi" + - "renoKyiromaniaKyirusiKyinyarwandaKyisomalyiKyiswidiKyitamilKyitailan" + - "diKyiturukyiKyiukraniaKyiurduKyivietinamuKyiyorubaKyichinaKyizuluKir" + - "uwa", - []uint16{ // 487 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0011, 0x0011, - 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0030, - 0x0030, 0x0030, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x004d, 0x004d, 0x004d, 0x004d, 0x0056, 0x0060, 0x0060, 0x006b, - 0x006b, 0x006b, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x0085, - 0x0085, 0x008d, 0x008d, 0x008d, 0x008d, 0x0097, 0x0097, 0x0097, - // Entry 40 - 7F - 0x0097, 0x00a3, 0x00a3, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00b5, 0x00b5, 0x00be, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00d0, 0x00d0, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00e2, 0x00e2, 0x00ea, 0x00ea, 0x00ea, - 0x00f3, 0x00f3, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, - 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x0107, 0x0107, 0x0111, - // Entry 80 - BF - 0x0111, 0x0118, 0x0118, 0x0118, 0x0118, 0x0122, 0x0129, 0x0135, - 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, - 0x0135, 0x0135, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - 0x0147, 0x0147, 0x014f, 0x014f, 0x014f, 0x015a, 0x015a, 0x015a, - 0x015a, 0x015a, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x016e, - 0x0175, 0x0175, 0x0175, 0x0181, 0x0181, 0x0181, 0x0181, 0x0181, - 0x0181, 0x018a, 0x018a, 0x0192, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry C0 - FF - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 100 - 13F - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 140 - 17F - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 180 - 1BF - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 1C0 - 1FF - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x019f, - }, - }, - { // sah - "АбхаастыыАппырыкааныстыыАмхаардыыАраабтыыАваардыыАдьырбайдьаанныыБөлөрүү" + - "стүүБулҕаардыыБенгаллыыТибиэттииБосныйалыыКаталаанныыЧэчиэннииЧиэхт" + - "ииДаатскайдыыНиэмэстииГириэктииАаҥыллыыЫспаанныыЭстиэнийэлииПиэрист" + - "ииПииннииБоронсуустууБэҥгиэрдииЭрмээннииЫтаалыйалыыДьоппуоннууКурус" + - "ууннууХаһаахтыыКэриэйдииКыргыстыыЛатыынныыМоҕуоллууМалаайдыыНьыпаал" + - "лыыПандьаабтыыПортугааллыыРумыынныыНууччалыыСловаактыыАлбаанныыТамы" + - "ллыыТөлүгүлүүТадьыыктыыТатаардыыУйгуурдууУкрайыыньыстыыҮзбиэктииКыт" + - "айдыыЗуулулууАлеуттууАстуурдууКиин куурдууПилипииннииНагаайдыысаха " + - "тыла", - []uint16{ // 489 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0012, 0x0012, 0x0030, 0x0030, 0x0042, 0x0042, - 0x0052, 0x0052, 0x0062, 0x0062, 0x0082, 0x0082, 0x0098, 0x00ac, - 0x00ac, 0x00ac, 0x00be, 0x00d0, 0x00d0, 0x00e4, 0x00fa, 0x010c, - 0x010c, 0x010c, 0x010c, 0x011a, 0x011a, 0x011a, 0x011a, 0x0130, - 0x0142, 0x0142, 0x0142, 0x0142, 0x0154, 0x0164, 0x0164, 0x0176, - 0x018e, 0x018e, 0x01a0, 0x01a0, 0x01ae, 0x01ae, 0x01ae, 0x01c6, - 0x01c6, 0x01c6, 0x01c6, 0x01c6, 0x01c6, 0x01c6, 0x01c6, 0x01c6, - 0x01c6, 0x01c6, 0x01c6, 0x01c6, 0x01c6, 0x01da, 0x01ec, 0x01ec, - // Entry 40 - 7F - 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, - 0x0202, 0x0202, 0x0218, 0x0218, 0x022e, 0x022e, 0x022e, 0x022e, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0252, 0x0252, 0x0252, 0x0252, - 0x0252, 0x0252, 0x0264, 0x0276, 0x0276, 0x0276, 0x0276, 0x0276, - 0x0276, 0x0276, 0x0276, 0x0276, 0x0276, 0x0276, 0x0276, 0x0276, - 0x0276, 0x0288, 0x0288, 0x029a, 0x029a, 0x029a, 0x029a, 0x029a, - 0x02ae, 0x02ae, 0x02ae, 0x02ae, 0x02ae, 0x02ae, 0x02ae, 0x02ae, - 0x02ae, 0x02ae, 0x02ae, 0x02ae, 0x02ae, 0x02c4, 0x02c4, 0x02c4, - // Entry 80 - BF - 0x02c4, 0x02dc, 0x02dc, 0x02dc, 0x02dc, 0x02ee, 0x0300, 0x0300, - 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0314, 0x0314, - 0x0314, 0x0314, 0x0314, 0x0326, 0x0326, 0x0326, 0x0326, 0x0326, - 0x0326, 0x0326, 0x0336, 0x0348, 0x035c, 0x035c, 0x035c, 0x035c, - 0x035c, 0x035c, 0x035c, 0x035c, 0x036e, 0x036e, 0x0380, 0x039c, - 0x039c, 0x03ae, 0x03ae, 0x03ae, 0x03ae, 0x03ae, 0x03ae, 0x03ae, - 0x03ae, 0x03ae, 0x03ae, 0x03be, 0x03ce, 0x03ce, 0x03ce, 0x03ce, - 0x03ce, 0x03ce, 0x03ce, 0x03ce, 0x03ce, 0x03ce, 0x03ce, 0x03de, - // Entry C0 - FF - 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, - 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03de, 0x03f0, - 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, - 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, - 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, - 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, - 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, - 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, 0x03f0, - // Entry 100 - 13F - 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, - 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, - 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, - 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, - 0x0407, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - // Entry 140 - 17F - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - // Entry 180 - 1BF - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x041d, 0x041d, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, - // Entry 1C0 - 1FF - 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, - 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, - 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, - 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, - 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, - 0x0440, - }, - }, - { // saq - "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + - "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + - "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + - "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + - "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + - "rubaKichinaKizuluKisampur", - []uint16{ // 491 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, - 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, - 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, - 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, - // Entry 40 - 7F - 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, - 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, - 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, - // Entry 80 - BF - 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, - 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, - 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, - 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, - 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, - 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry C0 - FF - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 100 - 13F - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 140 - 17F - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 180 - 1BF - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 1C0 - 1FF - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0171, - }, - }, - { // sbp - "IshiyakaniIshiyamuhaliIshiyalabuIshibelalusiIshibulugaliaIshibangilaIshi" + - "shekiIshijelumaniIshigilikiIshingelesaIshihisipaniyaIshiajemiIshifal" + - "ansaIshihawusaIshihindiIshihungaliIshihindonesiaIshihigiboIshihitali" + - "yanoIshijapaniIshijavaIshikambodiaIshikoleyaIshimalesiyaIshibulumaIs" + - "hinepaliIshiholansiIshipunjabiIshipolandiIshilenoIshilomaniyaIshilus" + - "iIshinyalwandaIshisomaliIshiswidiIshitamiliIshitayilandiIshitulukiIs" + - "hiyukilaniyaIshiwuludiIshivietinamuIshiyolubaIshishinaIshisuluIshisa" + - "ngu", - []uint16{ // 496 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0016, 0x0016, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x002c, 0x0039, - 0x0039, 0x0039, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x0044, 0x0044, 0x0044, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0063, 0x006e, 0x006e, 0x007c, - 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, 0x0085, 0x0085, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x009a, - 0x009a, 0x00a3, 0x00a3, 0x00a3, 0x00a3, 0x00ae, 0x00ae, 0x00ae, - // Entry 40 - 7F - 0x00ae, 0x00bc, 0x00bc, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00d4, 0x00d4, 0x00de, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, - 0x00e6, 0x00e6, 0x00f2, 0x00f2, 0x00fc, 0x00fc, 0x00fc, 0x00fc, - 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, - 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, - 0x00fc, 0x00fc, 0x00fc, 0x0108, 0x0108, 0x0112, 0x0112, 0x0112, - 0x011c, 0x011c, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, - 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0132, 0x0132, 0x013d, - // Entry 80 - BF - 0x013d, 0x0145, 0x0145, 0x0145, 0x0145, 0x0151, 0x0159, 0x0166, - 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, - 0x0166, 0x0166, 0x0170, 0x0170, 0x0170, 0x0170, 0x0170, 0x0170, - 0x0179, 0x0179, 0x0183, 0x0183, 0x0183, 0x0190, 0x0190, 0x0190, - 0x0190, 0x0190, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x01a8, - 0x01b2, 0x01b2, 0x01b2, 0x01bf, 0x01bf, 0x01bf, 0x01bf, 0x01bf, - 0x01bf, 0x01c9, 0x01c9, 0x01d2, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - // Entry C0 - FF - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - // Entry 100 - 13F - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - // Entry 140 - 17F - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - // Entry 180 - 1BF - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - // Entry 1C0 - 1FF - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01e3, - }, - }, - { // se - "afrikánsagiellaaragoniagiellaarábagiellavilges-ruoššagiellabulgáriagiell" + - "abengalgiellatibetagiellabretonagiellabosniagiellakatalánagiellacors" + - "icagiellačeahkagiellakymragielladánskkagielladuiskkagielladivehigiel" + - "ladzongkhagiellagreikkagiellaeaŋgalsgiellaspánskkagiellaesttegiellap" + - "ersijagiellasuomagiellafidjigiellafearagiellafránskkagiellaoarjifrii" + - "sagiellaiirragiellagujaratagiellamanksgiellahaussagiellahindigiellak" + - "roátiagiellahaitigiellaungárgiellaarmeenagiellaindonesiagiellaislánd" + - "dagiellaitáliagiellajapánagiellajavagiellageorgiagiellakazakgiellaka" + - "mbodiagiellakoreagiellakurdigiellakomigiellakornagiellaláhtengiellal" + - "uxemburggagiellalaogiellaliettuvagiellalátviagiellamaorigiellamakedo" + - "niagiellamongoliagiellamaltagiellaburmagiellanepaligiellahollánddagi" + - "ellaođđadárogiellagirjedárogiellaoksitánagiellapanjabigiellapolskkag" + - "iellaportugálagiellaromanšgiellaromániagiellaruoššagiellasardigiella" + - "davvisámegiellaslovákiagiellaslovenagiellasamoagiellaalbánagiellaser" + - "biagiellaruoŧagiellaŧaigielladurkagiellatahitigiellaukrainagiellaurd" + - "ugiellavietnamgiellavallonagiellakiinnágiellaacehgiellaboares eaŋgal" + - "asgiellaasturiagiellamarigiellafilippiinnagiellahawaiigiellagárjilgi" + - "ellamokšagiellaersagiellasisiliagiellaselkupagiellalullisámegiellaju" + - "levsámegiellaanárašgiellanuortalašgiellashimaorigiellaudmurtagiellad" + - "ovdameahttun giellakantongiellaserbokroatiagiellaálki kiinágiellaárb" + - "evirolaš kiinnágiella", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0010, 0x001e, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x003f, 0x004e, - 0x004e, 0x004e, 0x005a, 0x0066, 0x0073, 0x007f, 0x008e, 0x008e, - 0x008e, 0x009b, 0x009b, 0x00a8, 0x00a8, 0x00a8, 0x00b3, 0x00c1, - 0x00ce, 0x00da, 0x00e8, 0x00e8, 0x00f5, 0x0103, 0x0103, 0x0112, - 0x011d, 0x011d, 0x012a, 0x012a, 0x0135, 0x0140, 0x014b, 0x015a, - 0x016b, 0x0176, 0x0176, 0x0176, 0x0176, 0x0184, 0x018f, 0x019b, - 0x019b, 0x01a6, 0x01a6, 0x01b4, 0x01bf, 0x01cb, 0x01d8, 0x01d8, - // Entry 40 - 7F - 0x01d8, 0x01e7, 0x01e7, 0x01e7, 0x01e7, 0x01e7, 0x01e7, 0x01f6, - 0x0203, 0x0203, 0x0210, 0x021a, 0x0227, 0x0227, 0x0227, 0x0227, - 0x0232, 0x0232, 0x0240, 0x0240, 0x024b, 0x024b, 0x024b, 0x0256, - 0x0260, 0x026b, 0x026b, 0x0278, 0x0289, 0x0289, 0x0289, 0x0289, - 0x0292, 0x02a0, 0x02a0, 0x02ad, 0x02ad, 0x02ad, 0x02b8, 0x02c7, - 0x02c7, 0x02d5, 0x02d5, 0x02d5, 0x02e0, 0x02eb, 0x02eb, 0x02eb, - 0x02f7, 0x02f7, 0x0307, 0x0318, 0x0328, 0x0328, 0x0328, 0x0328, - 0x0337, 0x0337, 0x0337, 0x0337, 0x0337, 0x0344, 0x0344, 0x0351, - // Entry 80 - BF - 0x0351, 0x0361, 0x0361, 0x036e, 0x036e, 0x037c, 0x038a, 0x038a, - 0x038a, 0x0395, 0x0395, 0x03a5, 0x03a5, 0x03a5, 0x03b4, 0x03c1, - 0x03cc, 0x03cc, 0x03cc, 0x03d9, 0x03e5, 0x03e5, 0x03e5, 0x03e5, - 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03fb, 0x03fb, 0x03fb, - 0x03fb, 0x03fb, 0x0406, 0x0406, 0x0406, 0x0412, 0x0412, 0x041f, - 0x0429, 0x0429, 0x0429, 0x0436, 0x0436, 0x0443, 0x0443, 0x0443, - 0x0443, 0x0443, 0x0443, 0x0450, 0x0450, 0x045a, 0x045a, 0x045a, - 0x045a, 0x045a, 0x045a, 0x045a, 0x045a, 0x045a, 0x045a, 0x045a, - // Entry C0 - FF - 0x045a, 0x045a, 0x0470, 0x0470, 0x0470, 0x0470, 0x0470, 0x0470, - 0x0470, 0x0470, 0x0470, 0x0470, 0x0470, 0x0470, 0x0470, 0x047d, - 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, - 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, - 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, - 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, - 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, - 0x047d, 0x047d, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, - // Entry 100 - 13F - 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, - 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, - 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, - 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, - 0x0487, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, - 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, - 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, - 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, - // Entry 140 - 17F - 0x0498, 0x0498, 0x0498, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, - 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, - 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, - 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, - 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, - 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, - 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - // Entry 180 - 1BF - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, - 0x04b1, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, - 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, - 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04c7, - 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, - 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, - // Entry 1C0 - 1FF - 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, - 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, - 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, - 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, - 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, - 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, - 0x04d4, 0x04d4, 0x04d4, 0x04d4, 0x04d4, 0x04d4, 0x04d4, 0x04e1, - 0x04e1, 0x04e1, 0x04e1, 0x04e1, 0x04e1, 0x04e1, 0x04e1, 0x04e1, - // Entry 200 - 23F - 0x04e1, 0x04f1, 0x0501, 0x050f, 0x051f, 0x051f, 0x051f, 0x051f, - 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x052d, 0x052d, - 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, - 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, - 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, - 0x052d, 0x052d, 0x052d, 0x053a, 0x053a, 0x053a, 0x054e, 0x054e, - 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, - 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, - // Entry 240 - 27F - 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x055a, 0x055a, 0x055a, - 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, - 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, - 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, - 0x055a, 0x056c, 0x056c, 0x057e, 0x0599, - }, - }, - { // se-FI - "vilgesruoššagiellabengalagiellafižigiellaarmenagiellakazakhgiellakamboža" + - "giellanepalagiellapanjabagiellathaigiellavietnamagiellaačehgiellakom" + - "oragiellastandárda arábagiellanuortariikkalaš duiskkagiellašveicalaš" + - " duiskkagiellaaustrálialaš eaŋgalsgiellakanádalaš eaŋgalsgiellabriht" + - "talaš eaŋgalsgiellaamerihkálaš eaŋgalsgiellalatiinna-amerihkalaš spá" + - "nskkagiellaespánjalaš spánskkagiellameksikolaš spánskkagiellakanádal" + - "aš fránskkagiellašveicalaš fránskkagiellabelgialaš hollánddagiellabr" + - "asilialaš portugálagiellaportugálalaš portugálagiellamoldávialaš rom" + - "ániagiellaálkes kiinnágiella", - []uint16{ // 612 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x0038, 0x0038, - // Entry 40 - 7F - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, - 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x006b, 0x006b, 0x006b, - // Entry 80 - BF - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, - 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - // Entry C0 - FF - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - // Entry 100 - 13F - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - // Entry 140 - 17F - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - // Entry 180 - 1BF - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - // Entry 1C0 - 1FF - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - // Entry 200 - 23F - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, - 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - // Entry 240 - 27F - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x00b1, 0x00b1, - 0x00cf, 0x00e8, 0x0105, 0x011f, 0x0139, 0x0155, 0x017a, 0x0196, - 0x01b1, 0x01b1, 0x01cc, 0x01e7, 0x01e7, 0x0202, 0x021f, 0x023e, - 0x025a, 0x025a, 0x025a, 0x026e, - }, - }, - { // seh - "akanamáricoárabebielo-russobúlgarobengalitchecoalemãogregoinglêsespanhol" + - "persafrancêshausahindihúngaroindonésioiboitalianojaponêsjavanêscmerc" + - "oreanomalaiobirmanêsnepalêsholandêspanjabipolonêsportuguêsromenoruss" + - "okinyarwandasomalisuecotâmiltailandêsturcoucranianourduvietnamitaior" + - "ubáchinêszulusena", - []uint16{ // 502 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000c, 0x000c, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x001d, 0x0025, - 0x0025, 0x0025, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0039, 0x0039, 0x0039, 0x0039, 0x003e, 0x0045, 0x0045, 0x004d, - 0x004d, 0x004d, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005f, - 0x005f, 0x0064, 0x0064, 0x0064, 0x0064, 0x006c, 0x006c, 0x006c, - // Entry 40 - 7F - 0x006c, 0x0076, 0x0076, 0x0079, 0x0079, 0x0079, 0x0079, 0x0079, - 0x0081, 0x0081, 0x0089, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, - 0x0091, 0x0091, 0x0095, 0x0095, 0x009c, 0x009c, 0x009c, 0x009c, - 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, - 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, - 0x009c, 0x009c, 0x009c, 0x00a2, 0x00a2, 0x00ab, 0x00ab, 0x00ab, - 0x00b3, 0x00b3, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, - 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00c3, 0x00c3, 0x00cb, - // Entry 80 - BF - 0x00cb, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00db, 0x00e0, 0x00eb, - 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, - 0x00eb, 0x00eb, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, - 0x00f6, 0x00f6, 0x00fc, 0x00fc, 0x00fc, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x010b, 0x010b, 0x010b, 0x010b, 0x010b, 0x0114, - 0x0118, 0x0118, 0x0118, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, - 0x0122, 0x0129, 0x0129, 0x0130, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - // Entry C0 - FF - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - // Entry 100 - 13F - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - // Entry 140 - 17F - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - // Entry 180 - 1BF - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - // Entry 1C0 - 1FF - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0138, - }, - }, - { // ses - "Akan senniAmhaarik senniLaaraw senniBelaruus senniBulagaari senniBengali" + - " senniCek senniAlmaŋ senniGrek senniInglisi senniEspaaɲe senniFarsi " + - "senniFransee senniHawsance senniInduu senniHungaari senniIndoneesi s" + - "enniIboo senniItaali senniJaponee senniJavanee senniKmeer senniKoree" + - " senniMaleezi senniBurme senniNeepal senniHolandee senniPunjaabi sen" + - "niiPolonee senniPortugee senniRumaani senniRuusi senniRwanda senniSo" + - "maali senniSuweede senniTamil senniTaailandu senniTurku senniUkreen " + - "senniUrdu senniVietnaam senniYorbance senniSinuwa senni, MandareŋZul" + - "u senniKoyraboro senni", - []uint16{ // 505 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0018, 0x0018, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0032, 0x0041, - 0x0041, 0x0041, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, - 0x004e, 0x004e, 0x004e, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0063, 0x0063, 0x0063, 0x0063, 0x006d, 0x007a, 0x007a, 0x0088, - 0x0088, 0x0088, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x00a0, - 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00ae, - 0x00ae, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00c7, 0x00c7, 0x00c7, - // Entry 40 - 7F - 0x00c7, 0x00d6, 0x00d6, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00ec, 0x00ec, 0x00f9, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0111, 0x0111, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x011c, 0x0129, 0x0129, 0x0134, 0x0134, 0x0134, - 0x0140, 0x0140, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, - 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x015d, 0x015d, 0x016a, - // Entry 80 - BF - 0x016a, 0x0178, 0x0178, 0x0178, 0x0178, 0x0185, 0x0190, 0x019c, - 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, - 0x019c, 0x019c, 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, - 0x01b6, 0x01b6, 0x01c1, 0x01c1, 0x01c1, 0x01d0, 0x01d0, 0x01d0, - 0x01d0, 0x01d0, 0x01db, 0x01db, 0x01db, 0x01db, 0x01db, 0x01e7, - 0x01f1, 0x01f1, 0x01f1, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, - 0x01ff, 0x020d, 0x020d, 0x0224, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - // Entry C0 - FF - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - // Entry 100 - 13F - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - // Entry 140 - 17F - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - // Entry 180 - 1BF - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - // Entry 1C0 - 1FF - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x023d, - }, - }, - { // sg - "AkâanAmarîkiArâboBielörûsiBulugäriBengäliTyêkiZâmaniGerêkiAnglëeEspanyöl" + - "FarsîFarânziHaüsäHîndiHongruäaEnndonezïiÏgböÊnndeZaponëeZavanëeKmêre" + - "KoreyëenMalëeMiamära, BirimäniNepalëeHolandëePenzäbïPolonëePortugëe," + - " PûraRumëenRûsiRuandäaSängöSomalïiSueduäaTämûliThâiTûrûkuUkrêniÛrduV" + - "ietnämYorubaShinuäaZûlu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x001f, 0x0028, - 0x0028, 0x0028, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, - 0x0030, 0x0030, 0x0030, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, - 0x003d, 0x003d, 0x003d, 0x003d, 0x0044, 0x004b, 0x004b, 0x0054, - 0x0054, 0x0054, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0069, - 0x0069, 0x006f, 0x006f, 0x006f, 0x006f, 0x0078, 0x0078, 0x0078, - // Entry 40 - 7F - 0x0078, 0x0083, 0x0083, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x008f, 0x008f, 0x0097, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, - 0x009f, 0x009f, 0x00a5, 0x00a5, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00ae, 0x00b4, 0x00b4, 0x00c7, 0x00c7, 0x00c7, - 0x00cf, 0x00cf, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00e1, 0x00e1, 0x00e9, - // Entry 80 - BF - 0x00e9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x0100, 0x0105, 0x010d, - 0x010d, 0x010d, 0x010d, 0x010d, 0x0114, 0x0114, 0x0114, 0x0114, - 0x0114, 0x0114, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x0124, 0x0124, 0x012c, 0x012c, 0x012c, 0x0131, 0x0131, 0x0131, - 0x0131, 0x0131, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0140, - 0x0145, 0x0145, 0x0145, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, - 0x014d, 0x0153, 0x0153, 0x015b, 0x0160, - }, - }, - { // shi - "ⵜⴰⴽⴰⵏⵜⵜⴰⵎⵀⴰⵔⵉⵜⵜⴰⵄⵔⴰⴱⵜⵜⴰⴱⵉⵍⴰⵔⵓⵙⵜⵜⴰⴱⵍⵖⴰⵔⵉⵜⵜⴰⴱⵏⵖⴰⵍⵉⵜⵜⴰⵜⵛⵉⴽⵉⵜⵜⴰⵍⵉⵎⴰⵏⵜⵜⴰⴳⵔⵉⴳⵉ" + - "ⵜⵜⴰⵏⴳⵍⵉⵣⵜⵜⴰⵙⴱⵏⵢⵓⵍⵉⵜⵜⴰⴼⵓⵔⵙⵉⵜⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜⵜⴰⵀⴰⵡⵙⴰⵜⵜⴰⵀⵉⵏⴷⵉⵜⵜⴰⵀⵏⵖⴰⵔⵉⵜⵜⴰⵏⴷ" + - "ⵓⵏⵉⵙⵉⵜⵜⵉⴳⴱⵓⵜⵜⴰⵟⴰⵍⵢⴰⵏⵜⵜⴰⵊⴰⴱⴱⵓⵏⵉⵜⵜⴰⵊⴰⴼⴰⵏⵉⵜⵜⴰⵅⵎⵉⵔⵜⵜⴰⴽⵓⵔⵉⵜⵜⴰⵎⴰⵍⴰⵡⵉⵜⵜⴰⴱ" + - "ⵉⵔⵎⴰⵏⵉⵜⵜⴰⵏⵉⴱⴰⵍⵉⵜⵜⴰⵀⵓⵍⴰⵏⴷⵉⵜⵜⴰⴱⵏⵊⴰⴱⵉⵜⵜⴰⴱⵓⵍⵓⵏⵉⵜⵜⴰⴱⵕⵟⵇⵉⵣⵜⵜⴰⵔⵓⵎⴰⵏⵉⵜⵜⴰⵔⵓ" + - "ⵙⵉⵜⵜⴰⵔⵓⵡⴰⵏⴷⵉⵜⵜⴰⵙⵓⵎⴰⵍⵉⵜⵜⴰⵙⵡⵉⴷⵉⵜⵜⴰⵜⴰⵎⵉⵍⵜⵜⴰⵜⴰⵢⵍⴰⵏⴷⵉⵜⵜⴰⵜⵓⵔⴽⵉⵜⵜⵓⴽⵔⴰⵏⵉⵜⵜ" + - "ⵓⵔⴷⵓⵜⵜⴰⴼⵉⵜⵏⴰⵎⵉⵜⵜⴰⵢⵔⵓⴱⴰⵜⵜⴰⵛⵉⵏⵡⵉⵜⵜⴰⵣⵓⵍⵓⵜⵜⴰⵛⵍⵃⵉⵜ", - []uint16{ // 508 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x002a, 0x002a, - 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x005d, 0x0078, - 0x0078, 0x0078, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, - 0x0093, 0x0093, 0x0093, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, - 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00db, 0x00f3, 0x00f3, 0x0111, - 0x0111, 0x0111, 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, 0x0147, - 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x015f, - 0x015f, 0x0177, 0x0177, 0x0177, 0x0177, 0x0192, 0x0192, 0x0192, - // Entry 40 - 7F - 0x0192, 0x01b0, 0x01b0, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, - 0x01dd, 0x01dd, 0x01fb, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, - 0x0216, 0x0216, 0x022b, 0x022b, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x025b, 0x025b, 0x0279, 0x0279, 0x0279, - 0x0294, 0x0294, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, - 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02cd, 0x02cd, 0x02e8, - // Entry 80 - BF - 0x02e8, 0x0303, 0x0303, 0x0303, 0x0303, 0x031e, 0x0333, 0x0351, - 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, - 0x0351, 0x0351, 0x036c, 0x036c, 0x036c, 0x036c, 0x036c, 0x036c, - 0x0384, 0x0384, 0x039c, 0x039c, 0x039c, 0x03bd, 0x03bd, 0x03bd, - 0x03bd, 0x03bd, 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03ed, - 0x03ff, 0x03ff, 0x03ff, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x0435, 0x0435, 0x044d, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry C0 - FF - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry 100 - 13F - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry 140 - 17F - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry 180 - 1BF - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry 1C0 - 1FF - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0477, - }, - }, - { // shi-Latn - "TakantTamharitTaɛrabtTabilarustTablɣaritTabnɣalitTatcikitTalimantTagrigi" + - "tTangliztTasbnyulitTafursitTafransistTahawsatTahinditTahnɣaritTandun" + - "isitTigbutTaṭalyantTajabbunitTajavanitTaxmirtTakuritTamalawitTabirma" + - "nitTanibalitTahulanditTabnjabitTabulunitTabṛṭqiztTarumanitTarusitTar" + - "uwanditTasumalitTaswiditTatamiltTataylanditTaturkitTukranitTurdutTaf" + - "itnamitTayrubatTacinwitTazulutTashelḥiyt", - []uint16{ // 508 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0020, 0x002a, - 0x002a, 0x002a, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x0044, 0x0044, 0x0044, 0x0044, 0x004c, 0x0054, 0x0054, 0x005e, - 0x005e, 0x005e, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0078, - 0x0078, 0x0080, 0x0080, 0x0080, 0x0080, 0x008a, 0x008a, 0x008a, - // Entry 40 - 7F - 0x008a, 0x0094, 0x0094, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x00a5, 0x00a5, 0x00af, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, - 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00cf, 0x00cf, 0x00d9, 0x00d9, 0x00d9, - 0x00e2, 0x00e2, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, - 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00f5, 0x00f5, 0x00fe, - // Entry 80 - BF - 0x00fe, 0x010b, 0x010b, 0x010b, 0x010b, 0x0114, 0x011b, 0x0125, - 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, - 0x0125, 0x0125, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x0136, 0x0136, 0x013e, 0x013e, 0x013e, 0x0149, 0x0149, 0x0149, - 0x0149, 0x0149, 0x0151, 0x0151, 0x0151, 0x0151, 0x0151, 0x0159, - 0x015f, 0x015f, 0x015f, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0171, 0x0171, 0x0179, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - // Entry C0 - FF - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - // Entry 100 - 13F - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - // Entry 140 - 17F - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - // Entry 180 - 1BF - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - // Entry 1C0 - 1FF - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x018c, - }, - }, - { // si - siLangStr, - siLangIdx, - }, - { // sk - skLangStr, - skLangIdx, - }, - { // sl - slLangStr, - slLangIdx, - }, - { // smn - "afarabhasiakielâafrikaansakankielâamharakielâaragoniakielâarabiakielâass" + - "amkielâavarkielâaymarakielâazerbaidžankielâbaškirkielâvielgisruošâki" + - "elâbulgariakielâbislamabambarakielâbanglakielâtiibetkielâbretonkielâ" + - "bosniakielâkatalankielâtšetšenkielâchamorrokielâkorsikakielâtšeekiki" + - "elâkirkkoslaavitšuvaskielâkymrikielâtanskakielâsaksakielâdivehikielâ" + - "Dzongkhaewekielâkreikakielâeŋgâlâskielâesperantokielâespanjakielâees" + - "tikielâbaskikielâpersiakielâfulakielâsuomâkielâfidžikielâfäärikielâr" + - "anskakielâviestârfriisiiirikielâskottilâš gaelikielâgaliciakielâguar" + - "anikielâgudžaratikielâmankshausakielâhepreakielâhindikielâkroatiakie" + - "lâHaiti kreoliuŋgarkielâarmeniakielâhererokielâinterlinguaindonesiak" + - "ielâigbokielâidoislandkielâitaliakielâinuktitutjaapaankielâjaavakiel" + - "âgeorgiakielâkikujukielâkuanjamakazakkielâkalaallisutkhmerkielâkann" + - "adakoreakielâkanurikielâkashmirkielâkurdikielâkomikielâkornikielâkir" + - "giskielâläättinkielâluxemburgkielâlugandalimburgkielâlingalalaokielâ" + - "liettuakielâkatangalubalatviakielâmalagaskielâmarshallkielâmaorikiel" + - "âmakedoniakielâmalajammongoliakielâmarathikielâmalaijimaltakielâbur" + - "makielânaurukielâtave-nbedelenepalkielândongahollandkielâtárukielâ n" + - "ynorsktárukielâ bokmålmaadâ-nbedelenavajokielânjanžaoksitanoromokiel" + - "âorijaossetkielâpandžabipuolakielâpaštuportugalkielâquechuaretoroom" + - "aankielârundiromaniakielâruošâkielâruandakielâsanskritsardiniakielâs" + - "indhitavekielâsangosinhalaslovakiakielâsloveniakielâsamoakielâshonas" + - "omalikielâalbaniakielâserbiakielâswazikielâmaadâsothosundakielâruotâ" + - "kielâswahilikielâtamilkielâtelugutadžikkielâthaikielâtigrinyakielâtu" + - "rkmenkielâtswanakielâtongakielâtuurkikielâtsongakielâtatarkielâtahit" + - "ikielâuigurkielâukrainakielâurduuzbekkielâvendakielâvietnamkielâvola" + - "pükwalloonkielâwolofkielâxhosakielâjiddishyorubakielâmandarinkiinaki" + - "elâzulukielâatšehkielâadangmeadygeaghemainukielâaleutkielâmaadâaltai" + - "kielâangikamapudungunarapahokielâasukielâasturiakielâawadhikielâbali" + - "kielâbasaakielâbembakielâbenakielâbhožpurikielâbinikielâsiksikakielâ" + - "bodokielâbugikielâblinkielâcebuanokielâkigakielâchuukkielâmarikielâc" + - "hoctawkielâcherokeekielâcheyennekielâsorani kurdikielâSeychellij kre" + - "oliranskadakotakielâdargikielâtaitakielâdogribkielâzarmakielâvyeliso" + - "rbidualakielâjola-fonyidazakielâembukielâefikkielâekajukewondokielâf" + - "ilipinokielâfonkielâfriulikielâgakielâge’ezkiribatikielâgorontalokie" + - "lâtoovláš kreikakielâSveitsi saksakielâgusiikielâgwich’inkielâhawaij" + - "ikielâhiligainokielâhmongkielâpajesorbihupakielâibankielâibibiokielâ" + - "ilocanoinguškielâlojbanngombamachamekabylkielâkachinjjukambakielâkab" + - "ardikielâtyapmakondeKap Verde kreolikorokhasikoyra chiinikakokalenji" + - "kielâkimbundukonkanikpellekielâkarachai-balkarkielâkärjilkielâkurukh" + - "kielâshambalabafiakölnkielâkumykkielâladinokielâlangokielâlezgikielâ" + - "lakotakielâlozitavelurilulualubalundaluolusailuhyamadurakielâmagahim" + - "aithilimakasarmasaikielâmokšakielâmendekielâmerukielâmorisyenmakua-m" + - "eettometa’micmacminangkabaumanipurimohawkkielâmooreviestârmarimundan" + - "gmaŋgâ kielâmuskogeekielâmirandeskielâersäkielâmazandaraninapolikiel" + - "ânamanewariniaskielâniuekielâkwasiongiemboonnogaikielâtoovláš táruk" + - "ielân’kotavesothonuernyankolekielâpangasinankielâpampangakielâpapiam" + - "entupalaukielâNigeria pidgintoovláš preussikielâki’che’rapanuiraroto" + - "ngaromboroomaankielâaromaniakielârwasandawejakutkielâsamburukielâsan" + - "talikielângambaysangusisiliakielâskootikielâsenakoyraboro sennitašel" + - "hitshankielâmaadâsämikielâjuulevsämikielâanarâškielânuorttâlâškielâs" + - "oninkesranantongosahosukumakielâkomorikielâsyyriakielâtemnekielâates" + - "otetumtigrekielâklingonkielâtok pisintarokotumbukakielâtuvalukielâta" + - "sawaqtuvakielâKoskâatlas tamazightudmurtkielâumbunduruotâsvaikielâve" + - "psäkielâvunjowalliskielâwolaitakielâwaraykielâkalmukkielâsogayangben" + - "yembakantonkielâstandard tamazightzunikielâij kielâlâš siskáldâszaza" + - "kielâstandard arabiakielâNuorttâriijkâ saksakielâSveitsi pajesaksaki" + - "elâAustralia eŋgâlâskielâKanada eŋgâlâskielâBritannia eŋgâlâskielâAm" + - "erika eŋgâlâskielâLäättin-Amerika espanjakielâEspanja espanjakielâMe" + - "ksiko espanjakielâKanada ranskakielâSveitsi ranskakielâVuáládâhenâmi" + - "j saksakielâhollandkielâ (flaami)Brasilia portugalkielâPortugal port" + - "ugalkielâKongo swahilikielâoovtâkiärdánis kiinakielâärbivuáválâš kii" + - "nakielâ", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x0011, 0x0011, 0x001a, 0x0024, 0x0030, 0x003e, - 0x004a, 0x0055, 0x005f, 0x006b, 0x007d, 0x008a, 0x009e, 0x00ac, - 0x00b3, 0x00c0, 0x00cc, 0x00d8, 0x00e4, 0x00f0, 0x00fd, 0x010c, - 0x011a, 0x0127, 0x0127, 0x0134, 0x0140, 0x014d, 0x0158, 0x0164, - 0x016f, 0x017b, 0x0183, 0x018c, 0x0198, 0x01a8, 0x01b7, 0x01c4, - 0x01cf, 0x01da, 0x01e6, 0x01f0, 0x01fc, 0x0208, 0x0215, 0x0221, - 0x022f, 0x0239, 0x0250, 0x025d, 0x026a, 0x027a, 0x027f, 0x028a, - 0x0296, 0x02a1, 0x02a1, 0x02ae, 0x02ba, 0x02c6, 0x02d3, 0x02df, - // Entry 40 - 7F - 0x02ea, 0x02f9, 0x02f9, 0x0303, 0x0303, 0x0303, 0x0306, 0x0312, - 0x031e, 0x0327, 0x0334, 0x033f, 0x034c, 0x034c, 0x0358, 0x0360, - 0x036b, 0x0376, 0x0381, 0x0388, 0x0393, 0x039f, 0x03ac, 0x03b7, - 0x03c1, 0x03cc, 0x03d8, 0x03e7, 0x03f6, 0x03fd, 0x040a, 0x0411, - 0x041a, 0x0427, 0x0432, 0x043e, 0x044b, 0x0459, 0x0464, 0x0473, - 0x047a, 0x0488, 0x0495, 0x049c, 0x04a7, 0x04b2, 0x04bd, 0x04c9, - 0x04d4, 0x04da, 0x04e7, 0x04fa, 0x050d, 0x051b, 0x0527, 0x052e, - 0x0535, 0x0535, 0x0540, 0x0545, 0x0550, 0x0559, 0x0559, 0x0564, - // Entry 80 - BF - 0x056a, 0x0578, 0x057f, 0x0590, 0x0595, 0x05a2, 0x05af, 0x05bb, - 0x05c3, 0x05d1, 0x05d7, 0x05e1, 0x05e6, 0x05ed, 0x05fb, 0x0609, - 0x0614, 0x0619, 0x0625, 0x0632, 0x063e, 0x0649, 0x0654, 0x065f, - 0x066b, 0x0678, 0x0683, 0x0689, 0x0696, 0x06a0, 0x06ae, 0x06bb, - 0x06c7, 0x06d2, 0x06de, 0x06ea, 0x06f5, 0x0701, 0x070c, 0x0719, - 0x071d, 0x0728, 0x0733, 0x0740, 0x0748, 0x0755, 0x0760, 0x076b, - 0x0772, 0x077e, 0x077e, 0x0791, 0x079b, 0x07a7, 0x07a7, 0x07ae, - 0x07b3, 0x07b3, 0x07b3, 0x07b8, 0x07c2, 0x07c2, 0x07c2, 0x07cd, - // Entry C0 - FF - 0x07cd, 0x07de, 0x07de, 0x07e4, 0x07e4, 0x07ee, 0x07ee, 0x07fb, - 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x0804, 0x0804, 0x0811, - 0x0811, 0x081d, 0x081d, 0x0827, 0x0827, 0x0832, 0x0832, 0x0832, - 0x0832, 0x0832, 0x083d, 0x083d, 0x0847, 0x0847, 0x0847, 0x0847, - 0x0856, 0x0856, 0x0860, 0x0860, 0x0860, 0x086d, 0x086d, 0x086d, - 0x086d, 0x086d, 0x0877, 0x0877, 0x0877, 0x0881, 0x0881, 0x088b, - 0x088b, 0x088b, 0x088b, 0x088b, 0x088b, 0x0898, 0x08a2, 0x08a2, - 0x08a2, 0x08ad, 0x08b7, 0x08b7, 0x08c4, 0x08c4, 0x08d2, 0x08e0, - // Entry 100 - 13F - 0x08f2, 0x08f2, 0x08f2, 0x08f2, 0x0909, 0x0909, 0x0915, 0x0920, - 0x092b, 0x092b, 0x092b, 0x0937, 0x0937, 0x0942, 0x0942, 0x094c, - 0x094c, 0x0957, 0x0957, 0x0961, 0x0961, 0x096b, 0x0975, 0x097f, - 0x097f, 0x097f, 0x0985, 0x0985, 0x0985, 0x0985, 0x0991, 0x0991, - 0x0991, 0x099f, 0x099f, 0x09a8, 0x09a8, 0x09a8, 0x09a8, 0x09a8, - 0x09a8, 0x09a8, 0x09b4, 0x09bc, 0x09bc, 0x09bc, 0x09bc, 0x09bc, - 0x09bc, 0x09c3, 0x09d1, 0x09d1, 0x09d1, 0x09d1, 0x09d1, 0x09d1, - 0x09e0, 0x09e0, 0x09e0, 0x09f6, 0x0a09, 0x0a09, 0x0a09, 0x0a14, - // Entry 140 - 17F - 0x0a24, 0x0a24, 0x0a24, 0x0a31, 0x0a31, 0x0a40, 0x0a40, 0x0a4b, - 0x0a54, 0x0a54, 0x0a5e, 0x0a68, 0x0a74, 0x0a7b, 0x0a87, 0x0a87, - 0x0a87, 0x0a8d, 0x0a93, 0x0a9a, 0x0a9a, 0x0a9a, 0x0a9a, 0x0a9a, - 0x0aa5, 0x0aab, 0x0aae, 0x0ab9, 0x0ab9, 0x0ac6, 0x0ac6, 0x0aca, - 0x0ad1, 0x0ae1, 0x0ae1, 0x0ae5, 0x0ae5, 0x0aea, 0x0aea, 0x0af6, - 0x0af6, 0x0af6, 0x0afa, 0x0b07, 0x0b0f, 0x0b0f, 0x0b16, 0x0b16, - 0x0b22, 0x0b37, 0x0b37, 0x0b37, 0x0b44, 0x0b50, 0x0b58, 0x0b5d, - 0x0b68, 0x0b73, 0x0b73, 0x0b7f, 0x0b8a, 0x0b8a, 0x0b8a, 0x0b95, - // Entry 180 - 1BF - 0x0b95, 0x0b95, 0x0b95, 0x0ba1, 0x0ba1, 0x0ba1, 0x0ba5, 0x0bad, - 0x0bad, 0x0bb6, 0x0bb6, 0x0bbb, 0x0bbe, 0x0bc3, 0x0bc8, 0x0bc8, - 0x0bc8, 0x0bd4, 0x0bd4, 0x0bda, 0x0be2, 0x0be9, 0x0be9, 0x0bf4, - 0x0bf4, 0x0c00, 0x0c00, 0x0c0b, 0x0c15, 0x0c1d, 0x0c1d, 0x0c29, - 0x0c30, 0x0c36, 0x0c41, 0x0c41, 0x0c49, 0x0c55, 0x0c5a, 0x0c66, - 0x0c6d, 0x0c7b, 0x0c89, 0x0c97, 0x0c97, 0x0c97, 0x0c97, 0x0ca2, - 0x0cad, 0x0cad, 0x0cb9, 0x0cbd, 0x0cbd, 0x0cc3, 0x0ccd, 0x0cd7, - 0x0cd7, 0x0cdd, 0x0ce6, 0x0cf1, 0x0d06, 0x0d06, 0x0d0c, 0x0d15, - // Entry 1C0 - 1FF - 0x0d19, 0x0d19, 0x0d19, 0x0d27, 0x0d27, 0x0d27, 0x0d27, 0x0d27, - 0x0d37, 0x0d37, 0x0d45, 0x0d4f, 0x0d5a, 0x0d5a, 0x0d68, 0x0d68, - 0x0d68, 0x0d68, 0x0d68, 0x0d68, 0x0d68, 0x0d68, 0x0d68, 0x0d7f, - 0x0d7f, 0x0d8a, 0x0d8a, 0x0d8a, 0x0d91, 0x0d9a, 0x0d9a, 0x0d9a, - 0x0d9f, 0x0dac, 0x0dac, 0x0dac, 0x0dac, 0x0dba, 0x0dbd, 0x0dc4, - 0x0dcf, 0x0dcf, 0x0ddc, 0x0ddc, 0x0de9, 0x0de9, 0x0df0, 0x0df5, - 0x0e02, 0x0e0e, 0x0e0e, 0x0e0e, 0x0e0e, 0x0e12, 0x0e12, 0x0e12, - 0x0e21, 0x0e21, 0x0e21, 0x0e2a, 0x0e34, 0x0e34, 0x0e34, 0x0e34, - // Entry 200 - 23F - 0x0e34, 0x0e45, 0x0e56, 0x0e64, 0x0e77, 0x0e7e, 0x0e7e, 0x0e89, - 0x0e89, 0x0e8d, 0x0e8d, 0x0e99, 0x0e99, 0x0e99, 0x0ea5, 0x0ea5, - 0x0eb1, 0x0eb1, 0x0eb1, 0x0ebc, 0x0ec1, 0x0ec1, 0x0ec6, 0x0ed1, - 0x0ed1, 0x0ed1, 0x0ed1, 0x0ede, 0x0ede, 0x0ede, 0x0ede, 0x0ede, - 0x0ee7, 0x0ee7, 0x0eed, 0x0eed, 0x0eed, 0x0eed, 0x0efa, 0x0f06, - 0x0f0d, 0x0f17, 0x0f2c, 0x0f38, 0x0f38, 0x0f3f, 0x0f46, 0x0f4f, - 0x0f4f, 0x0f5b, 0x0f5b, 0x0f5b, 0x0f5b, 0x0f5b, 0x0f60, 0x0f6c, - 0x0f79, 0x0f84, 0x0f84, 0x0f84, 0x0f84, 0x0f90, 0x0f90, 0x0f94, - // Entry 240 - 27F - 0x0f94, 0x0f94, 0x0f9b, 0x0fa0, 0x0fa0, 0x0fac, 0x0fac, 0x0fac, - 0x0fac, 0x0fac, 0x0fbe, 0x0fc8, 0x0fe2, 0x0fec, 0x1001, 0x1001, - 0x101c, 0x1033, 0x104d, 0x1064, 0x107e, 0x1096, 0x10b5, 0x10ca, - 0x10df, 0x10df, 0x10f2, 0x1106, 0x1124, 0x113a, 0x1151, 0x1168, - 0x1168, 0x1168, 0x117b, 0x1198, 0x11b5, - }, - }, - { // sn - "chiAkanichiAmaricchiArabuchiBelarusichiBulgarianchiBengalichiCzechchiJer" + - "imanichiGreekChirunguchiSpanishchiPeshiyachiFurenchichiHausachiHindi" + - "chiHungarichiIndonesiachiIgbochiTarianachiJapanichiJavachiKhemachiKo" + - "riachiMalaychiBurmachiNepalichiDutchchiPunjabichiPolishchiPutukezich" + - "iRomanianchiRashiyachiRwandachiShonachiSomalichiSwedishchiTamilchiTh" + - "aichiTurkishchiUkreniachiUrduchiVietnamchiYorubachiChinesechiZulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0011, 0x0011, - 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0030, - 0x0030, 0x0030, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x004d, 0x004d, 0x004d, 0x004d, 0x0055, 0x005d, 0x005d, 0x0067, - 0x0067, 0x0067, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x007c, - 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x0084, - 0x0084, 0x008c, 0x008c, 0x008c, 0x008c, 0x0096, 0x0096, 0x0096, - // Entry 40 - 7F - 0x0096, 0x00a2, 0x00a2, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, - 0x00b3, 0x00b3, 0x00bc, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, - 0x00c3, 0x00c3, 0x00cb, 0x00cb, 0x00d3, 0x00d3, 0x00d3, 0x00d3, - 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, - 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, - 0x00d3, 0x00d3, 0x00d3, 0x00db, 0x00db, 0x00e3, 0x00e3, 0x00e3, - 0x00ec, 0x00ec, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, - 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00fe, 0x00fe, 0x0107, - // Entry 80 - BF - 0x0107, 0x0112, 0x0112, 0x0112, 0x0112, 0x011d, 0x0127, 0x0130, - 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, - 0x0130, 0x0138, 0x0141, 0x0141, 0x0141, 0x0141, 0x0141, 0x0141, - 0x014b, 0x014b, 0x0153, 0x0153, 0x0153, 0x015a, 0x015a, 0x015a, - 0x015a, 0x015a, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x016e, - 0x0175, 0x0175, 0x0175, 0x017f, 0x017f, 0x017f, 0x017f, 0x017f, - 0x017f, 0x0188, 0x0188, 0x0192, 0x0199, - }, - }, - { // so - "AkanAxmaariCarabiBeleruusiyaanBulgeeriyaanBangaaliJeegJarmalGiriikIngiri" + - "isiIsbaanishFaarisiFaransiisFiriisiyan GalbeedHawsaHindiHangariyaanI" + - "ndunuusiyaanIgboTalyaaniJabbaaniisJafaaniisKamboodhianKuuriyaanMalaa" + - "yBurmeseNebaaliHolandaysBunjaabiBoolishBoortaqiisRomankaRuushRwandaS" + - "oomaaliSwiidhisTamiilTaaylandaysTurkishYukreeniyaanUrduuFiitnaamaysY" + - "oruubaJayniisZuulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000b, 0x000b, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001e, 0x002a, - 0x002a, 0x002a, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, - 0x003c, 0x003c, 0x003c, 0x003c, 0x0042, 0x004b, 0x004b, 0x0054, - 0x0054, 0x0054, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x0064, - 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x007b, - 0x007b, 0x0080, 0x0080, 0x0080, 0x0080, 0x008b, 0x008b, 0x008b, - // Entry 40 - 7F - 0x008b, 0x0098, 0x0098, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, - 0x00a4, 0x00a4, 0x00ae, 0x00b7, 0x00b7, 0x00b7, 0x00b7, 0x00b7, - 0x00b7, 0x00b7, 0x00c2, 0x00c2, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00d1, 0x00d1, 0x00d8, 0x00d8, 0x00d8, - 0x00df, 0x00df, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, - 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00f0, 0x00f0, 0x00f7, - // Entry 80 - BF - 0x00f7, 0x0101, 0x0101, 0x0101, 0x0101, 0x0108, 0x010d, 0x0113, - 0x0113, 0x0113, 0x0113, 0x0113, 0x0113, 0x0113, 0x0113, 0x0113, - 0x0113, 0x0113, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x0123, 0x0123, 0x0129, 0x0129, 0x0129, 0x0134, 0x0134, 0x0134, - 0x0134, 0x0134, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x0147, - 0x014c, 0x014c, 0x014c, 0x0157, 0x0157, 0x0157, 0x0157, 0x0157, - 0x0157, 0x015e, 0x015e, 0x0165, 0x016a, - }, - }, - { // sq - sqLangStr, - sqLangIdx, - }, - { // sr - srLangStr, - srLangIdx, - }, - { // sr-Cyrl-BA - "бјелорускибамананканбанглахаићански креолскилаошкисинхалскиисикосаисизул" + - "умапудунгуншвајцарски немачкимохокн’којужни шилхацентралноатласки т" + - "амашекстандардни марокански тамашек", - []uint16{ // 587 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, 0x0014, - 0x0014, 0x0028, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0057, 0x0057, 0x0057, 0x0057, - // Entry 40 - 7F - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - // Entry 80 - BF - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0083, - 0x0083, 0x0083, 0x0083, 0x0083, 0x0091, 0x0091, 0x0091, 0x0091, - 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, - // Entry C0 - FF - 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - // Entry 100 - 13F - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - // Entry 140 - 17F - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - // Entry 180 - 1BF - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00d2, 0x00d2, 0x00d2, - 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, - 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, - 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00db, 0x00db, - // Entry 1C0 - 1FF - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, - // Entry 200 - 23F - 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, - 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, - 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, - 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, - 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, - 0x00f0, 0x00f0, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, - 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, - 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, - // Entry 240 - 27F - 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, - 0x011f, 0x011f, 0x0157, - }, - }, - { // sr-Cyrl-ME - "бјелорускибамананканбанглафулаххаићански креолскилаошкиисикосаисизулумап" + - "удунгунмохокн’којужни шилхацентралноатласки тамашекстандардни марок" + - "ански тамашек", - []uint16{ // 587 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, 0x0014, - 0x0014, 0x0028, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, - 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, - 0x003e, 0x003e, 0x003e, 0x003e, 0x0061, 0x0061, 0x0061, 0x0061, - // Entry 40 - 7F - 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, - 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, - 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, - 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, - // Entry 80 - BF - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - // Entry C0 - FF - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - // Entry 100 - 13F - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - // Entry 140 - 17F - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - // Entry 180 - 1BF - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x00a7, 0x00a7, 0x00a7, - 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, - 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, - 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00b0, 0x00b0, - // Entry 1C0 - 1FF - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - // Entry 200 - 23F - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, - 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, - 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, - // Entry 240 - 27F - 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, - 0x00f4, 0x00f4, 0x012c, - }, - }, - { // sr-Cyrl-XK - "бамананканбанглафулаххаићански креолскилаошкисинхалскиисикосаисизулушвај" + - "царски немачкимохокн’којужни шилхацентралноатласки тамашекстандардн" + - "и марокански тамашек", - []uint16{ // 587 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0014, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0020, 0x0020, 0x0020, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x004d, 0x004d, 0x004d, 0x004d, - // Entry 40 - 7F - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - // Entry 80 - BF - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x006b, 0x006b, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x0079, - 0x0079, 0x0079, 0x0079, 0x0079, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - // Entry C0 - FF - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - // Entry 100 - 13F - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - // Entry 140 - 17F - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - // Entry 180 - 1BF - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00b4, 0x00b4, 0x00b4, - 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, - 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, - 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00bd, 0x00bd, - // Entry 1C0 - 1FF - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, - // Entry 200 - 23F - 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, - 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, - 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, - 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, - 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, - 0x00d2, 0x00d2, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - // Entry 240 - 27F - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0139, - }, - }, - { // sr-Latn - srLatnLangStr, - srLatnLangIdx, - }, - { // sr-Latn-BA - "bjeloruskibamanankanbanglahaićanski kreolskilaoškisinhalskiisikosaisizul" + - "umapudungunšvajcarski nemačkimohokn’kojužni šilhacentralnoatlaski ta" + - "mašekstandardni marokanski tamašek", - []uint16{ // 587 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, - 0x000a, 0x0014, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001a, 0x002d, 0x002d, 0x002d, 0x002d, - // Entry 40 - 7F - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - // Entry 80 - BF - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x003d, 0x003d, 0x003d, - 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, - 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, - 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, - 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x004b, 0x004b, 0x004b, 0x004b, - 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, - // Entry C0 - FF - 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - // Entry 100 - 13F - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0069, 0x0069, 0x0069, 0x0069, - // Entry 140 - 17F - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - // Entry 180 - 1BF - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0074, 0x0074, - // Entry 1C0 - 1FF - 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, - 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, - 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, - 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, - 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, - 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, - 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, - 0x0074, 0x0074, 0x0074, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - // Entry 200 - 23F - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - // Entry 240 - 27F - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x00b8, - }, - }, - { // sr-Latn-ME - "bjeloruskibamanankanbanglafulahhaićanski kreolskilaoškiisikosaisizulumap" + - "udungunmohokn’kojužni šilhacentralnoatlaski tamašekstandardni maroka" + - "nski tamašek", - []uint16{ // 587 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, - 0x000a, 0x0014, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, - 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, - 0x001f, 0x001f, 0x001f, 0x001f, 0x0032, 0x0032, 0x0032, 0x0032, - // Entry 40 - 7F - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - // Entry 80 - BF - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0047, 0x0047, 0x0047, 0x0047, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - // Entry C0 - FF - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - // Entry 100 - 13F - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - // Entry 140 - 17F - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - // Entry 180 - 1BF - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x005c, 0x005c, - // Entry 1C0 - 1FF - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - // Entry 200 - 23F - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - // Entry 240 - 27F - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x00a0, - }, - }, - { // sr-Latn-XK - "bamanankanbanglafulahhaićanski kreolskilaoškisinhalskiisikosaisizulušvaj" + - "carski nemačkimohokn’kojužni šilhacentralnoatlaski tamašekstandardni" + - " marokanski tamašek", - []uint16{ // 587 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x000a, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0028, 0x0028, 0x0028, 0x0028, - // Entry 40 - 7F - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - // Entry 80 - BF - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x003f, - 0x003f, 0x003f, 0x003f, 0x003f, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - // Entry C0 - FF - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - // Entry 100 - 13F - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x005a, 0x005a, 0x005a, 0x005a, - // Entry 140 - 17F - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - // Entry 180 - 1BF - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005f, 0x005f, 0x005f, - 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, - 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, - 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x0065, 0x0065, - // Entry 1C0 - 1FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - // Entry 200 - 23F - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, - 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, - 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, - // Entry 240 - 27F - 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, - 0x008b, 0x008b, 0x00a9, - }, - }, - { // sv - svLangStr, - svLangIdx, - }, - { // sv-FI - "kirgiziska", - []uint16{ // 91 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x000a, - }, - }, - { // sw - swLangStr, - swLangIdx, - }, - { // sw-CD - "KiakanKiazabajaniKimanksiKikirigiziKilimburgiKimasedoniaKiyidiKiarabu ch" + - "a AljeriaKibuginiKigwichiinKihupaKiingushKilojbanKikachinKikoyra Chi" + - "iniKikakoKikomipermyakKikurukhKikumykKilambamakKimokshaKimikmakiKimo" + - "hokiKimossiKingiemboonKiinkoPijini ya NijeriaKikiicheKiarabu cha Cha" + - "diKitongo cha SrananKikomoroKisiriaKiudumurtiKirootKiwalserKiarabu c" + - "ha Dunia Kilichosanifishwa", - []uint16{ // 591 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0019, 0x0019, - 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, - // Entry 40 - 7F - 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, - 0x0019, 0x0019, 0x0023, 0x0023, 0x0023, 0x0023, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - // Entry 80 - BF - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, - 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, - // Entry C0 - FF - 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - // Entry 100 - 13F - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, - // Entry 140 - 17F - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0069, 0x0069, 0x0069, 0x0069, 0x0071, 0x0071, - 0x0071, 0x0079, 0x0079, 0x0079, 0x0079, 0x0079, 0x0079, 0x0079, - 0x0079, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x008f, - 0x008f, 0x008f, 0x0095, 0x0095, 0x0095, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00aa, 0x00aa, 0x00aa, - 0x00aa, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b8, 0x00b8, - // Entry 180 - 1BF - 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, - 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, - 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00bb, 0x00bb, 0x00bb, - 0x00bb, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, - 0x00c3, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00d4, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00ec, 0x00ec, - // Entry 1C0 - 1FF - 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, - 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00fd, 0x00fd, - 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, - 0x00fd, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, - 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0116, 0x0116, 0x0116, - // Entry 200 - 23F - 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0128, - 0x0128, 0x0128, 0x0128, 0x0128, 0x0128, 0x0128, 0x0130, 0x0130, - 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, - 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, - 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, - 0x0137, 0x0137, 0x0137, 0x0141, 0x0141, 0x0141, 0x0147, 0x0147, - 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x014f, - 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, - // Entry 240 - 27F - 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, - 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x0172, - }, - }, - { // sw-KE - "KitwiKiazabajaniKilimbugishKimasedoniaKiodiaKiwaloonainKiarabu cha Aljer" + - "iaKibuginiKikurdi cha KatiKisorbian cha ChiniKigiriki cha KaleKisorb" + - "ia cha JuuKingushiKilojbaniKikachinKikoyra ChiiniKikakoKikomipermyak" + - "KikurukhKilambaKimokshaKimicmacKimohokiKiingiemboonKiin’koPijini ya " + - "NijeriascoKikoyraboro SenniKiarabu cha ChadiKiscran TongoKicomoroKis" + - "yriaLugha ya Central Atlas TamazightKiudumurtiKirootKiwalserTamazigh" + - "t Sanifu ya MorokoKiarabu cha Sasa Kilichosanifishwa", - []uint16{ // 591 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - // Entry 40 - 7F - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x001b, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - // Entry 80 - BF - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0037, 0x0037, 0x0037, 0x0037, - // Entry C0 - FF - 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - // Entry 100 - 13F - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, - // Entry 140 - 17F - 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, - 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, 0x009e, 0x009e, - 0x009e, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, - 0x00a7, 0x00af, 0x00af, 0x00af, 0x00af, 0x00af, 0x00af, 0x00af, - 0x00af, 0x00af, 0x00af, 0x00af, 0x00af, 0x00af, 0x00af, 0x00bd, - 0x00bd, 0x00bd, 0x00c3, 0x00c3, 0x00c3, 0x00d0, 0x00d0, 0x00d0, - 0x00d0, 0x00d0, 0x00d0, 0x00d0, 0x00d0, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00df, 0x00df, - // Entry 180 - 1BF - 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, - 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, - 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, - 0x00df, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, - 0x00e7, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00f7, 0x00f7, 0x00f7, - 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, - 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, - 0x00f7, 0x00f7, 0x0103, 0x0103, 0x0103, 0x0103, 0x010c, 0x010c, - // Entry 1C0 - 1FF - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x011d, 0x011d, - 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, - 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, - 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, - 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, - 0x011d, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, - 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0142, 0x0142, 0x0142, - // Entry 200 - 23F - 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x014f, - 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x0157, 0x0157, - 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, - 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, - 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, - 0x015e, 0x015e, 0x017e, 0x0188, 0x0188, 0x0188, 0x018e, 0x018e, - 0x018e, 0x018e, 0x018e, 0x018e, 0x018e, 0x018e, 0x018e, 0x0196, - 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, - // Entry 240 - 27F - 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, - 0x0196, 0x0196, 0x01b0, 0x01b0, 0x01b0, 0x01b0, 0x01d2, - }, - }, - { // ta - taLangStr, - taLangIdx, - }, - { // te - teLangStr, - teLangIdx, - }, - { // teo - "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + - "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + - "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + - "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + - "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + - "rubaKichinaKizuluKiteso", - []uint16{ // 533 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, - 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, - 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, - 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, - // Entry 40 - 7F - 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, - 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, - 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, - // Entry 80 - BF - 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, - 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, - 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, - 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, - 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, - 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry C0 - FF - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 100 - 13F - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 140 - 17F - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 180 - 1BF - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 1C0 - 1FF - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - // Entry 200 - 23F - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, - 0x0169, 0x0169, 0x0169, 0x0169, 0x016f, - }, - }, - { // th - thLangStr, - thLangIdx, - }, - { // ti - "አፍሪቃንሰኛትዊአምሐረኛዓረበኛአዜርባይጃንኛቤላራሻኛቡልጋሪኛበንጋሊኛብሬቶንቦስኒያንካታላንቼክኛወልሽዴኒሽጀርመንግሪከኛእ" + - "ንግሊዝኛኤስፐራንቶስፓኒሽኤስቶኒአንባስክኛፐርሲያኛፊኒሽፋሮኛፈረንሳይኛፍሪሰኛአይሪሽእስኮትስ ጌልክኛጋለቪኛጓራ" + - "ኒጉጃራቲኛዕብራስጥሕንደኛክሮሽያንኛሀንጋሪኛኢንቴር ቋንቋእንዶኑሲኛአይስላንደኛጣሊያንኛጃፓንኛጃቫንኛጊዮርጊያኛ" + - "ካማደኛኮሪያኛኩርድሽኪሩጋዚላቲንኛሊቱአኒየንላቲቪያንማክዶኒኛማላያላምኛማራቲኛማላይኛማልቲስኛኔፖሊኛደችኖርዌይኛ" + - " (ናይ ኝኖርስክ)ኖርዌጂያንኦኪታንኛኦሪያፑንጃቢኛፖሊሽፓሽቶፖርቱጋሊኛሮማኒያንራሽኛስንሃልኛስሎቨክኛስቁቪኛአልቤኒ" + - "ኛሰርቢኛሰሴቶሱዳንኛስዊድንኛሰዋሂሊኛታሚልኛተሉጉኛታይኛትግርኛናይ ቱርኪ ሰብዓይ (ቱርካዊ)ቱርከኛዩክረኒኛኡር" + - "ዱኛኡዝበክኛቪትናምኛዞሳኛዪዲሽዙሉኛታጋሎገኛክሊንግኦንኛፖርቱጋልኛ (ናይ ብራዚል)ፖርቱጋልኛ (ናይ ፖርቱጋል)" + - "ሰርቦ- ክሮዊታን", - []uint16{ // 610 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0015, 0x001b, 0x002a, 0x002a, - 0x0036, 0x0036, 0x0036, 0x0036, 0x004e, 0x004e, 0x005d, 0x006c, - 0x006c, 0x006c, 0x007b, 0x007b, 0x0087, 0x0096, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00ab, 0x00ab, 0x00ab, 0x00b4, 0x00bd, - 0x00c9, 0x00c9, 0x00c9, 0x00c9, 0x00d5, 0x00e7, 0x00f9, 0x0105, - 0x0117, 0x0123, 0x0132, 0x0132, 0x013b, 0x013b, 0x0144, 0x0156, - 0x0162, 0x016e, 0x018a, 0x0196, 0x019f, 0x01ae, 0x01ae, 0x01ae, - 0x01bd, 0x01c9, 0x01c9, 0x01db, 0x01db, 0x01ea, 0x01ea, 0x01ea, - // Entry 40 - 7F - 0x0200, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0227, - 0x0236, 0x0236, 0x0242, 0x024e, 0x0260, 0x0260, 0x0260, 0x0260, - 0x0260, 0x0260, 0x0260, 0x026c, 0x0278, 0x0278, 0x0278, 0x0284, - 0x0284, 0x0284, 0x0290, 0x029c, 0x029c, 0x029c, 0x029c, 0x029c, - 0x029c, 0x02ae, 0x02ae, 0x02bd, 0x02bd, 0x02bd, 0x02bd, 0x02cc, - 0x02de, 0x02de, 0x02ea, 0x02f6, 0x0305, 0x0305, 0x0305, 0x0305, - 0x0311, 0x0311, 0x0317, 0x033f, 0x0351, 0x0351, 0x0351, 0x0351, - 0x0360, 0x0360, 0x0360, 0x0369, 0x0369, 0x0378, 0x0378, 0x0381, - // Entry 80 - BF - 0x038a, 0x039c, 0x039c, 0x039c, 0x039c, 0x03ab, 0x03b4, 0x03b4, - 0x03b4, 0x03b4, 0x03b4, 0x03b4, 0x03b4, 0x03c3, 0x03d2, 0x03de, - 0x03de, 0x03de, 0x03de, 0x03ed, 0x03f9, 0x03f9, 0x0402, 0x040e, - 0x041d, 0x042c, 0x0438, 0x0444, 0x0444, 0x044d, 0x0459, 0x0485, - 0x0485, 0x0485, 0x0491, 0x0491, 0x0491, 0x0491, 0x0491, 0x04a0, - 0x04ac, 0x04bb, 0x04bb, 0x04ca, 0x04ca, 0x04ca, 0x04ca, 0x04d3, - 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - // Entry C0 - FF - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - // Entry 100 - 13F - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, - 0x04e5, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - // Entry 140 - 17F - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - // Entry 180 - 1BF - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - // Entry 1C0 - 1FF - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - // Entry 200 - 23F - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, - 0x04f4, 0x04f4, 0x04f4, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, - 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, - 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, - 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, - 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, - // Entry 240 - 27F - 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, - 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, - 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, - 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0531, 0x055c, - 0x055c, 0x0576, - }, - }, - { // to - "lea fakaʻafālalea fakaʻapakasialea fakaʻavesitanilea fakaʻafilikanalea f" + - "akaʻakanilea fakaʻamelikilea fakaʻalakonilea fakaʻalepealea fakaʻasa" + - "mialea fakaʻavalikilea fakaʻaimalalea fakaʻasapaisanilea fakapasikil" + - "ilea fakapelalusilea fakapulukalialea fakapisilamalea fakapamipalale" + - "a fakapengikalilea fakatipetilea fakapeletonilea fakaposinialea faka" + - "katalanilea fakaseselea fakakamololea fakakōsikalea fakakelīlea faka" + - "sekilea fakasilavia-fakasiasilea fakasuvasalea fakauēlesilea fakaten" + - "imaʻakelea fakasiamanelea fakativehilea fakatisōngikalea fakaʻeuelea" + - " fakakalisilea fakapālangilea fakaʻesipulanitolea fakasipēnisilea fa" + - "kaʻesitōnialea fakapāsikilea fakapēsialea fakafulālea fakafinilanile" + - "a fakafisilea fakafaloelea fakafalanisēlea fakafilisia-hihifolea fak" + - "aʻaelanilea fakakaelikilea fakakalisialea fakakualanilea fakakutalat" + - "ilea fakamangikīlea fakahausalea fakahepelūlea fakahinitīlea fakahil" + - "i-motulea fakakuloisialea fakahaitilea fakahungakalialea fakaʻāmenia" + - "lea fakahelelolea fakavahaʻalealea fakaʻinitōnesialea fakavahaʻaling" + - "ikēlea fakaʻikipōlea fakasisiuani-īlea fakaʻinupiakilea fakaʻitolea " + - "fakaʻaisilanilea fakaʻītalilea fakaʻinuketitutilea fakasiapanilea fa" + - "kasavalea fakaseōsialea fakakongikōlea fakakikuiulea fakakuaniamalea" + - " fakakasakilea fakakalaʻalisutilea fakakamipōtialea fakakanatalea fa" + - "kakōlealea fakakanulilea fakakāsimilalea fakakulitīlea fakakomilea f" + - "akakoniualilea fakakīsisilea fakalatinalea fakalakisimipekilea fakak" + - "anitalea fakalimipūlikilea lingikalalea fakalaulea fakalituanialea f" + - "akalupa-katangalea fakalativialea fakamalakasilea fakamāsololea faka" + - "maulilea fakamasitōnialea fakaʻinitia-malāialamilea fakamongokōliale" + - "a fakamalatilea fakamaleilea fakamalitalea fakapemalea fakanaululea " + - "fakanetepele-tokelaulea fakanepalilea fakanetongikālea fakahōlanilea" + - " fakanoauē-ninosikilea fakanouaē-pokimalilea fakanetepele-tongalea f" + - "akanavaholea fakanianisalea fakaʻokitanelea fakaʻosipiuālea fakaʻolo" + - "molea faka-ʻotialea fakaʻosetikilea fakapūnusapilea fakapālilea faka" + - "polanilea fakapasitōlea fakapotukalilea fakakuetisalea fakalaito-lom" + - "ēnialea fakaluanitilea fakalōmenialea fakalūsialea fakakiniāuanital" + - "ea fakasanisukulitilea fakasaletīnialea fakasīnitilea fakasami-tokel" + - "aulea fakasangikōlea fakasingihalalea fakasolāvakilea fakasolovenial" + - "ea fakahaʻamoalea fakasionalea fakasomalilea fakaʻalapēnialea fakasē" + - "pialea fakasuatilea fakasoto-tongalea fakasunitālea fakasuētenilea f" + - "akasuahililea fakatamililea fakaʻinitia-telukulea fakatāsikilea faka" + - "tailanilea fakatikilinialea fakatēkimenilea fakatisuanalea fakatonga" + - "lea fakatoakelea fakatisongalea fakatatalelea fakatahitilea fakaʻuik" + - "ūlilea fakaʻūkalaʻinelea fakaʻūtūlea fakaʻusipekilea fakavenitālea " + - "fakavietinamilea fakavolapikilea fakaʻualonialea fakaʻuolofolea faka" + - "tōsalea fakaītisilea fakaʻiōlupalea fakasuangilea fakasiainalea faka" + - "sululea fakaʻatisēlea fakaʻakolilea fakaʻatangimēlea fakaʻatikēlea f" + - "akaʻalepea-tunīsialea fakaʻafilihililea fakaʻakihemilea fakaʻainulea" + - " fakaʻakatialea fakaʻalapamalea fakaʻaleutilea fakaʻalapēnia-kekilea" + - " fakaʻalitai-tongalea fakapālangi-motuʻalea fakaʻangikalea fakaʻalām" + - "itilea fakamapuselea fakaʻalaonalea fakaʻalapaholea fakaʻalepea-ʻais" + - "ilialea fakaʻalauakilea fakaʻalepea-molokolea fakaʻalepea-ʻisipitele" + - "a fakaʻasulea fakaʻilonga-ʻamelikalea fakaʻasitūlialea fakakotavalea" + - " fakaʻauatilea fakapalusilea fakapalilea fakapavālialea fakapasaʻale" + - "a fakapamunilea fakatōpe-pētekilea fakakomalalea fakapesalea fakapēm" + - "ipalea fakapetavilea fakapenalea fakapafutilea fakapatakalea fakapal" + - "usi-hihifolea fakaposipulilea fakapikolilea fakapinilea fakapanisali" + - "lea fakakomelea fakasikesikālea fakapisinupilialea fakapakitiālilea " + - "fakapalailea fakapalahuilea fakapōtolea fakaʻakōselea fakapuliatilea" + - " fakapukisilea fakapululea fakapilinilea fakametūmipalea fakakatolea" + - " fakakalipalea fakakaiukalea fakaʻatisamilea fakasepuanolea fakakika" + - "lea fakasīpisalea fakasakatāilea fakatūkelea fakamalīlea fakasinuki-" + - "takotelea fakasokitaulea fakasipeuianilea fakaselokīlea fakaseienele" + - "a fakakūtisi-lolotolea fakakopitikalea fakakapisenolea fakatoake-kil" + - "imealea fakaseselua-falanisēlea fakakasiupialea fakatakotalea fakata" + - "lakuālea fakataitalea fakatelaualelea fakasilavelea fakatōkelipilea " + - "fakatingikālea fakatisāmalea fakatokililea fakasōpia-hifolea fakatus" + - "uni-lolotolea fakatualalea fakahōlani-lotolotolea fakaiola-fonīlea f" + - "akatiulalea fakatasakalea fakaʻemipūlea fakaʻefikilea fakaʻemilialea" + - " fakaʻisipitemuʻalea fakaʻekaiukilea fakaʻelamitelea fakapālangi-lot" + - "olotolea fakaiūpiki-lolotolea fakaʻeuōnitolea fakaʻekisitematulalea " + - "fakafangilea fakafilipainilea fakafinilani-tōnetalelea fakafōngilea " + - "fakafalanisē-kasunilea fakafalanisē-lotolotolea fakafalanisē-motuʻal" + - "ea fakaʻāpitanolea fakafilisia-tokelaulea fakafilisia-hahakelea faka" + - "fulilānilea fakakālea fakakakausilea fakasiaina-kanilea fakakaiolea " + - "fakakapaialea fakateli-soloasitelialea fakasiʻisilea fakakilipasilea" + - " fakakilakilea fakasiamane-hake-lotolotolea fakasiamane-hake-motuʻal" + - "ea fakakonikanī-koanilea fakakonitīlea fakakolonitalolea fakakotikal" + - "ea fakakēpolea fakakalisimuʻalea fakasiamane-suisilanilea fakaʻuaiūl" + - "ea fakafalefalelea fakakusīlea fakaʻuīsinilea fakahaitalea fakasiain" + - "a-hakalea fakahauaiʻilea fakahinitī-fisilea fakahilikainonilea fakah" + - "ititelea fakamōngilea fakasōpia-hakelea fakasiaina-siangilea fakahup" + - "alea fakaʻipanilea fakaʻipipiolea fakaʻilokolea fakaʻingusilea fakaʻ" + - "ingilianilea fakapālangi-samaikalea fakalosipanilea fakanikōmipalea " + - "fakamasamelea fakaʻiuteo-pēsialea fakaʻiuteo-ʻalepealea fakaʻiutilan" + - "ilea fakakala-kalipakilea fakakapilelea fakakasinilea fakasisūlea fa" + - "kakamipalea fakakavilea fakakapālitialea fakakanēmipulea fakatiapile" + - "a fakamakōnitelea fakakapuvelitianulea fakakeniangilea fakakololea f" + - "akakaingangilea fakakāsilea fakakōtanilea fakakoila-sīnilea fakakoua" + - "lilea fakakilimanisikīlea fakakakolea fakakalenisinilea fakakimipūni" + - "tulea fakakomi-pelemiakilea fakakonikanīlea fakakosilaelea fakakepel" + - "elea fakakalate-palakililea fakakiliolea fakakinaraiālea fakakalelia" + - "lea fakakulukilea fakasiamipalalea fakapafialea fakakolongialea faka" + - "kumikilea fakakutenailea fakalatinolea fakalangilea fakalānitalea fa" + - "kalamipālea fakalesikialea fakakavakava-foʻoulea fakalikulialea faka" + - "livonialea fakalakotalea fakalomipātilea fakamongikōlea fakalosilea " + - "fakaluli-tokelaulea fakalatakalelea fakalupa-lulualea fakaluisenolea" + - " fakalunitālea fakaluolea fakamisolea fakaluīalea fakasiaina-faʻutoh" + - "ilea fakalasulea fakamatulalea fakamafalea fakamakahilea fakamaitili" + - "lea fakamakasalilea fakamanitīngikolea fakamasailea fakamapalea faka" + - "mokisiālea fakamanetalilea fakamenetīlea fakamelulea fakamolisienile" + - "a fakaʻaelani-lotolotolea fakamakūa-meʻetolea fakametālea fakamikema" + - "kilea fakaminangikapaulea fakamanisūlea fakamanipulilea fakamohaukil" + - "ea fakamosilea fakamali-hihifolea fakamunitangilea tuifiolea fakakil" + - "ekilea fakamilanitēsilea fakamaliwalilea fakamenitauailea fakamienel" + - "ea fakaʻelisialea fakamasanitelanilea fakasiaina-mininanilea fakanap" + - "oletanolea fakanamalea fakasiamane-hifolea fakaneualilea fakaniasile" + - "a fakaniuēlea fakaʻaonasalea fakakuasiolea fakangiemipōnilea fakanok" + - "ailea fakanoauē-motuʻalea fakanovialelea fakanikōlea fakasoto-tokela" + - "ulea fakanuelilea fakaneuali-motuʻalea fakaniamiuesilea fakanianikol" + - "elea fakaniololea fakanesimalea fakaʻosēselea fakatoake-ʻotomanilea " + - "fakapangasinanilea fakapālavilea fakapamipangalea fakapapiamēnitolea" + - " fakapalaulea fakapikātilea fakanaisilialea fakasiamane-penisilivani" + - "alea fakasiamane-lafalafalea fakapēsia-motuʻalea fakasiamane-palatin" + - "elea fakafoinikialea fakapiemonitelea fakaponitikilea fakaponapēlea " + - "fakapulūsialea fakapolovenisi-motuʻalea fakakīsēlea fakakuitisa-simi" + - "polasolea fakalasasitanilea fakalapanuilea fakalalotongalea fakaloma" + - "niololea fakalifilea fakalomipōlea fakalomanilea fakalotumalea fakal" + - "usinilea fakalovianalea fakaʻalomanialea fakaluālea fakasanitauelea " + - "fakasakalea fakasamalitani-ʻalāmitilea fakasamipululea fakasasakilea" + - " fakasanitalilea fakasaulasitilālea fakangāmipailea fakasangulea fak" + - "asisīlialea fakasikotilanilea fakasaletīnia-sasalesulea faka-tonga ‘" + - "o Ketesilea fakasenekalea fakasenalea fakaselilea fakaselikupilea fa" + - "kakoilapolo-senilea fakaʻaelani-motuʻalea fakasamositialea fakatasel" + - "ihitilea fakasianilea fakaʻalepea-sātilea fakasitamolea fakasilesia-" + - "hifolea fakaselaiālea fakasami-tongalea fakasami-lulelea fakasami-ʻi" + - "nalilea fakasami-sikolitalea fakasoninekēlea fakasokitianalea fakasu" + - "lanane-tongikōlea fakasēlēlelea fakasaholea fakafilisia-satēlanilea " + - "fakasukumalea fakasusūlea fakasumelialea fakakomololea fakasuliāiā-m" + - "uʻalea fakasuliāiālea fakasilesialea fakatululea fakatimenēlea fakat" + - "esolea fakatelenolea fakatetumulea fakatikilēlea fakativilea fakatok" + - "elaulea fakasākulilea fakakilingonilea fakatilingikītelea fakatalisi" + - "lea fakatamasiekilea fakaniasa-tongalea fakatoki-pisinilea fakatuloi" + - "olea fakatalokolea fakasakōnialea fakatisīmisianilea fakatati-mosele" + - "milea fakatumepukalea fakatūvalulea fakatasauakilea fakatuvīnialea f" + - "akatamasaiti-ʻatilasi-lolotolea fakaʻutimulitilea fakaʻūkalitilea fa" + - "kaʻumipūnitulea fakaʻilonga-tefitolea fakavailea fakavenēsialea faka" + - "vepisilea fakavelamingi-hihifolea fakafalanikoni-lolotolea fakavotik" + - "ilea fakavōlolea fakavūnisolea fakaʻualiselilea fakaʻuolaitalea faka" + - "ʻualailea fakaʻuasiōlea fakaʻuālipililea fakasiaina-uūlea fakakalim" + - "ikilea fakamingilelialea fakasokalea fakaʻiaolea fakaʻiapilea fakaʻi" + - "angipenilea fakaʻiēmipalea fakaneʻēngatūlea fakakuangitongilea fakas" + - "apotekilea fakaʻilonga-pilisilea fakasēlanilea fakasenakalea fakatam" + - "asaiti-molokolea fakasuniʻikai ha lealea fakasāsālea fakaʻalepea (mā" + - "mani)lea fakasiamane-ʻaositulialea fakasiamane-hake-suisilanilea fak" + - "apālangi-ʻaositelēlialea fakapālangi-kānatalea fakapilitānialea faka" + - "pālangi-ʻamelikalea fakasipēnisi lātini-ʻamelikalea fakasipēnisi-‘iu" + - "lopelea fakasipēnisi-mekisikoulea fakafalanisē-kānatalea fakafalanis" + - "ē-suisilanilea fakasakisoni-hifolea fakahōlani-pelesiumelea fakapot" + - "ukali-palāsililea fakapotukali-ʻiulopelea fakamolitāvialea fakakuloi" + - "sia-sēpialea fakasuahili-kongikōlea fakasiaina-fakafaingofualea faka" + - "siaina-tukufakaholo", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0022, 0x0035, 0x0048, 0x0057, 0x0068, 0x0079, - 0x0089, 0x0099, 0x00aa, 0x00ba, 0x00ce, 0x00de, 0x00ee, 0x00ff, - 0x010f, 0x011f, 0x0130, 0x013e, 0x014e, 0x015d, 0x016d, 0x0179, - 0x0187, 0x0196, 0x01a3, 0x01af, 0x01c8, 0x01d6, 0x01e5, 0x01f8, - 0x0207, 0x0215, 0x0227, 0x0234, 0x0242, 0x0252, 0x0267, 0x0278, - 0x028b, 0x029a, 0x02a8, 0x02b5, 0x02c5, 0x02d1, 0x02de, 0x02ef, - 0x0305, 0x0315, 0x0324, 0x0333, 0x0342, 0x0352, 0x0362, 0x036f, - 0x037e, 0x038d, 0x039e, 0x03ae, 0x03bb, 0x03cd, 0x03de, 0x03ec, - // Entry 40 - 7F - 0x03fe, 0x0413, 0x042a, 0x043a, 0x044d, 0x045f, 0x046c, 0x047e, - 0x048e, 0x04a3, 0x04b2, 0x04be, 0x04cd, 0x04dd, 0x04eb, 0x04fb, - 0x0509, 0x051e, 0x0530, 0x053e, 0x054c, 0x055a, 0x056b, 0x057a, - 0x0586, 0x0596, 0x05a5, 0x05b3, 0x05c7, 0x05d5, 0x05e8, 0x05f5, - 0x0600, 0x0610, 0x0624, 0x0633, 0x0643, 0x0652, 0x065f, 0x0671, - 0x068d, 0x06a0, 0x06ae, 0x06bb, 0x06c9, 0x06d5, 0x06e2, 0x06fa, - 0x0708, 0x071a, 0x0729, 0x0740, 0x0757, 0x076d, 0x077b, 0x078a, - 0x079b, 0x07ad, 0x07bc, 0x07cb, 0x07dc, 0x07ed, 0x07fa, 0x0808, - // Entry 80 - BF - 0x0817, 0x0827, 0x0836, 0x084c, 0x085b, 0x086b, 0x0879, 0x088d, - 0x08a1, 0x08b3, 0x08c2, 0x08d6, 0x08e6, 0x08f7, 0x0908, 0x0919, - 0x0929, 0x0936, 0x0944, 0x0957, 0x0965, 0x0972, 0x0984, 0x0993, - 0x09a3, 0x09b2, 0x09c0, 0x09d7, 0x09e6, 0x09f5, 0x0a06, 0x0a17, - 0x0a26, 0x0a33, 0x0a40, 0x0a4f, 0x0a5d, 0x0a6b, 0x0a7c, 0x0a91, - 0x0aa0, 0x0ab1, 0x0ac0, 0x0ad1, 0x0ae1, 0x0af2, 0x0b02, 0x0b0f, - 0x0b1d, 0x0b2e, 0x0b3c, 0x0b4a, 0x0b56, 0x0b66, 0x0b75, 0x0b88, - 0x0b98, 0x0bb1, 0x0bc4, 0x0bd5, 0x0be3, 0x0bf3, 0x0c04, 0x0c14, - // Entry C0 - FF - 0x0c2c, 0x0c42, 0x0c5a, 0x0c6a, 0x0c7c, 0x0c8a, 0x0c9a, 0x0cab, - 0x0cc5, 0x0cc5, 0x0cd6, 0x0ced, 0x0d07, 0x0d14, 0x0d2e, 0x0d41, - 0x0d4f, 0x0d5e, 0x0d6c, 0x0d78, 0x0d88, 0x0d97, 0x0da5, 0x0dba, - 0x0dc8, 0x0dd4, 0x0de3, 0x0df1, 0x0dfd, 0x0e0b, 0x0e19, 0x0e2e, - 0x0e3e, 0x0e4c, 0x0e58, 0x0e68, 0x0e74, 0x0e85, 0x0e98, 0x0eaa, - 0x0eb7, 0x0ec6, 0x0ed3, 0x0ee3, 0x0ef2, 0x0f00, 0x0f0c, 0x0f1a, - 0x0f2b, 0x0f37, 0x0f45, 0x0f53, 0x0f64, 0x0f73, 0x0f7f, 0x0f8e, - 0x0f9e, 0x0fab, 0x0fb8, 0x0fcd, 0x0fdc, 0x0fed, 0x0ffc, 0x100a, - // Entry 100 - 13F - 0x1020, 0x1030, 0x1040, 0x1055, 0x106e, 0x107e, 0x108c, 0x109c, - 0x10a9, 0x10b9, 0x10c7, 0x10d8, 0x10e8, 0x10f7, 0x1105, 0x1118, - 0x112d, 0x113a, 0x1152, 0x1164, 0x1171, 0x117f, 0x118f, 0x119e, - 0x11ae, 0x11c4, 0x11d5, 0x11e6, 0x11ff, 0x1215, 0x1227, 0x123e, - 0x124b, 0x125c, 0x1276, 0x1284, 0x129c, 0x12b6, 0x12cf, 0x12e1, - 0x12f8, 0x130e, 0x131f, 0x132a, 0x1339, 0x134c, 0x1358, 0x1366, - 0x137f, 0x138e, 0x139e, 0x13ac, 0x13c9, 0x13e5, 0x13fc, 0x140b, - 0x141d, 0x142b, 0x1438, 0x144b, 0x1464, 0x1473, 0x1483, 0x1490, - // Entry 140 - 17F - 0x14a1, 0x14ae, 0x14c1, 0x14d1, 0x14e5, 0x14f8, 0x1506, 0x1514, - 0x1527, 0x153c, 0x1548, 0x1557, 0x1567, 0x1576, 0x1586, 0x1599, - 0x15b1, 0x15c1, 0x15d2, 0x15e0, 0x15f6, 0x160e, 0x1620, 0x1635, - 0x1643, 0x1651, 0x165e, 0x166c, 0x1678, 0x168a, 0x169b, 0x16a8, - 0x16b9, 0x16ce, 0x16de, 0x16ea, 0x16fb, 0x1708, 0x1717, 0x172a, - 0x1738, 0x174d, 0x1759, 0x176b, 0x177e, 0x1794, 0x17a5, 0x17b4, - 0x17c2, 0x17d9, 0x17e6, 0x17f7, 0x1806, 0x1814, 0x1825, 0x1832, - 0x1842, 0x1850, 0x185f, 0x186d, 0x187a, 0x1889, 0x1898, 0x18a7, - // Entry 180 - 1BF - 0x18be, 0x18cd, 0x18dc, 0x18ea, 0x18fb, 0x190b, 0x1917, 0x192b, - 0x193b, 0x194d, 0x195c, 0x196b, 0x1976, 0x1982, 0x198f, 0x19a7, - 0x19b3, 0x19c1, 0x19cd, 0x19db, 0x19ea, 0x19fa, 0x1a0e, 0x1a1b, - 0x1a27, 0x1a37, 0x1a47, 0x1a56, 0x1a62, 0x1a73, 0x1a8c, 0x1aa2, - 0x1aaf, 0x1abf, 0x1ad3, 0x1ae2, 0x1af2, 0x1b01, 0x1b0d, 0x1b20, - 0x1b31, 0x1b3b, 0x1b49, 0x1b5c, 0x1b6c, 0x1b7d, 0x1b8a, 0x1b9a, - 0x1bae, 0x1bc5, 0x1bd7, 0x1be3, 0x1bf7, 0x1c05, 0x1c12, 0x1c1f, - 0x1c2f, 0x1c3d, 0x1c50, 0x1c5d, 0x1c73, 0x1c82, 0x1c8f, 0x1ca3, - // Entry 1C0 - 1FF - 0x1cb0, 0x1cc6, 0x1cd7, 0x1ce8, 0x1cf5, 0x1d03, 0x1d13, 0x1d2a, - 0x1d3d, 0x1d4c, 0x1d5d, 0x1d71, 0x1d7e, 0x1d8d, 0x1d9d, 0x1dba, - 0x1dd2, 0x1de8, 0x1e00, 0x1e10, 0x1e21, 0x1e31, 0x1e40, 0x1e50, - 0x1e6a, 0x1e78, 0x1e92, 0x1ea4, 0x1eb3, 0x1ec4, 0x1ed5, 0x1ee1, - 0x1ef0, 0x1efe, 0x1f0c, 0x1f1a, 0x1f29, 0x1f3b, 0x1f47, 0x1f57, - 0x1f63, 0x1f80, 0x1f90, 0x1f9e, 0x1fae, 0x1fc2, 0x1fd3, 0x1fe0, - 0x1ff0, 0x2002, 0x201d, 0x2037, 0x2045, 0x2051, 0x205d, 0x206d, - 0x2083, 0x209b, 0x20ac, 0x20be, 0x20cb, 0x20e1, 0x20ef, 0x2103, - // Entry 200 - 23F - 0x2112, 0x2124, 0x2135, 0x2149, 0x215e, 0x216f, 0x2180, 0x2199, - 0x21a9, 0x21b5, 0x21ce, 0x21dc, 0x21e9, 0x21f8, 0x2206, 0x221d, - 0x222e, 0x223d, 0x2249, 0x2258, 0x2264, 0x2272, 0x2280, 0x228f, - 0x229b, 0x22aa, 0x22b9, 0x22ca, 0x22de, 0x22ec, 0x22fd, 0x2310, - 0x2323, 0x2331, 0x233f, 0x234f, 0x2363, 0x2378, 0x2388, 0x2397, - 0x23a7, 0x23b7, 0x23d9, 0x23ec, 0x23fe, 0x2412, 0x2429, 0x2434, - 0x2444, 0x2452, 0x246a, 0x2483, 0x2491, 0x249e, 0x24ad, 0x24bf, - 0x24d0, 0x24df, 0x24ef, 0x2502, 0x2514, 0x2524, 0x2536, 0x2542, - // Entry 240 - 27F - 0x254f, 0x255d, 0x2570, 0x2581, 0x2595, 0x25a8, 0x25b8, 0x25cf, - 0x25de, 0x25ec, 0x2604, 0x2610, 0x261d, 0x262b, 0x2645, 0x2645, - 0x2660, 0x267e, 0x269d, 0x26b5, 0x26c7, 0x26e1, 0x2704, 0x271f, - 0x273a, 0x273a, 0x2753, 0x276e, 0x2783, 0x279c, 0x27b6, 0x27cf, - 0x27e1, 0x27f8, 0x2810, 0x282c, 0x2847, - }, - }, - { // tr - trLangStr, - trLangIdx, - }, - { // twq - "Akan senniAmhaarik senniLaaraw senniBelaruus senniBulagaari senniBengali" + - " senniCek senniAlmaŋ senniGrek senniInglisi senniEspaaɲe senniFarsi " + - "senniFransee senniHawsance senniInduu senniHungaari senniIndoneesi s" + - "enniIboo senniItaali senniJaponee senniJavanee senniKmeer senni, Gam" + - "e hereKoree senniMaleezi senniBurme senniNeepal senniHolandee senniP" + - "unjaabi senniiPolonee senniPortugee senniRumaani senniRuusi senniRwa" + - "nda senniSomaali senniSuweede senniTamil senniTaailandu senniTurku s" + - "enniUkreen senniUrdu senniVietnaam senniYorbance senniSinuwa senni, " + - "MandareŋZulu senniTasawaq senni", - []uint16{ // 553 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0018, 0x0018, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0032, 0x0041, - 0x0041, 0x0041, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, - 0x004e, 0x004e, 0x004e, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0063, 0x0063, 0x0063, 0x0063, 0x006d, 0x007a, 0x007a, 0x0088, - 0x0088, 0x0088, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x00a0, - 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00ae, - 0x00ae, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00c7, 0x00c7, 0x00c7, - // Entry 40 - 7F - 0x00c7, 0x00d6, 0x00d6, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, - 0x00ec, 0x00ec, 0x00f9, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x011c, 0x011c, 0x0127, 0x0127, 0x0127, 0x0127, - 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, - 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, - 0x0127, 0x0127, 0x0127, 0x0134, 0x0134, 0x013f, 0x013f, 0x013f, - 0x014b, 0x014b, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, - 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0168, 0x0168, 0x0175, - // Entry 80 - BF - 0x0175, 0x0183, 0x0183, 0x0183, 0x0183, 0x0190, 0x019b, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, - 0x01c1, 0x01c1, 0x01cc, 0x01cc, 0x01cc, 0x01db, 0x01db, 0x01db, - 0x01db, 0x01db, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01f2, - 0x01fc, 0x01fc, 0x01fc, 0x020a, 0x020a, 0x020a, 0x020a, 0x020a, - 0x020a, 0x0218, 0x0218, 0x022f, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - // Entry C0 - FF - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - // Entry 100 - 13F - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - // Entry 140 - 17F - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - // Entry 180 - 1BF - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - // Entry 1C0 - 1FF - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - // Entry 200 - 23F - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0246, - }, - }, - { // tzm - "TakanitTamharitTaεrabtTabilarusitTabelɣaritTabinɣalitTačiktTalmanitTayun" + - "anitTanglizttasbelyunitTafarisitTafṛansistTahawsatTahinditTahenɣarit" + - "TindunisitTigbutTaṭalyantTajappunitTajavanitTaxmert ,TalammastTakuri" + - "tTamalizitTaburmanitTanippalitTahulanḍitTabenjabitTappulunitTaburtuɣ" + - "alitTaṛumanitTarusitTarwanditTaṣumalitTaswiditTatamiltTaṭaytTaturkit" + - "TukranitTurdutTaviṭnamitTayurubatTacinwit,MandarintazulutTamaziɣt n " + - "laṭlaṣ", - []uint16{ // 555 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x000f, 0x000f, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0022, 0x002d, - 0x002d, 0x002d, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0050, 0x0058, 0x0058, 0x0063, - 0x0063, 0x0063, 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x0078, - 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0080, - 0x0080, 0x0088, 0x0088, 0x0088, 0x0088, 0x0093, 0x0093, 0x0093, - // Entry 40 - 7F - 0x0093, 0x009d, 0x009d, 0x00a3, 0x00a3, 0x00a3, 0x00a3, 0x00a3, - 0x00ae, 0x00ae, 0x00b8, 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00c1, - 0x00c1, 0x00c1, 0x00d3, 0x00d3, 0x00da, 0x00da, 0x00da, 0x00da, - 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, - 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, - 0x00da, 0x00da, 0x00da, 0x00e3, 0x00e3, 0x00ed, 0x00ed, 0x00ed, - 0x00f7, 0x00f7, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, - 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x010d, 0x010d, 0x0117, - // Entry 80 - BF - 0x0117, 0x0124, 0x0124, 0x0124, 0x0124, 0x012f, 0x0136, 0x013f, - 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - 0x013f, 0x013f, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, - 0x0152, 0x0152, 0x015a, 0x015a, 0x015a, 0x0162, 0x0162, 0x0162, - 0x0162, 0x0162, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x0172, - 0x0178, 0x0178, 0x0178, 0x0184, 0x0184, 0x0184, 0x0184, 0x0184, - 0x0184, 0x018d, 0x018d, 0x019e, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - // Entry C0 - FF - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - // Entry 100 - 13F - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - // Entry 140 - 17F - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - // Entry 180 - 1BF - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - // Entry 1C0 - 1FF - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - // Entry 200 - 23F - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01bb, - }, - }, - { // ug - "ئافارچەئابخازچەئاۋېستاچەئافرىكانچەئاكانچەئامھارچەئاراگونچەئەرەبچەئاسامچە" + - "ئاۋارچەئايماراچەئەزەربەيجانچەباشقىرتچەبېلارۇسچەبۇلغارچەبىسلاماچەبام" + - "باراچەبېنگالچەتىبەتچەبىرېتونچەبوسىنچەكاتالانچەچېچىنچەچامورروچەكورسۇ" + - "چەكرىچەچېخچەقەدىمكى سلاۋيانچەچۇۋاشچەۋېلشچەدانىشچەگېرمانچەدىۋېخچەزوڭ" + - "خاچەئېۋېچەگىرېكچەئىنگلىزچەئېسپرانتوچەئىسپانچەئېستونچەباسكىچەپارسچەف" + - "ۇلاھچەفىنچەفىجىچەفائېروچەفىرانسۇزچەغەربىي فىرسچەئىرېلاندچەشوتلاندىي" + - "ە گايلچىسىگالىچەگۇئارانىچەگۇجاراتچەمانچەخائۇساچەئىبرانىيچەھىندىچەھى" + - "رى موتۇچەكىرودىچەھايتىچەۋېنگىرچەئەرمېنچەخېرېروچەئارىلىق تىلھىندونېز" + - "چەئىنتىرلىڭچەئىگبوچەيىچە (سىچۈەن)ئىنۇپىكچەئىدوچەئىسلاندچەئىتالىيانچ" + - "ەئىنۇكتىتۇتچەياپونچەياۋاچەگىرۇزچەكونگوچەكىكۇيۇچەكىۋانياماچەقازاقچەگ" + - "ىرېنلاندچەكىمېرچەكانناداچەكورېيەچەكانۇرچەكەشمىرچەكۇردچەكومىچەكورنىش" + - "چەقىرغىزچەلاتىنچەلىيۇكسېمبۇرگچەگانداچەلىمبۇرگچەلىنگالاچەلائوسچەلىتۋ" + - "انىچەلۇبا-كاتانگاچەلاتچەمالاگاسچەمارشالچەماۋرىچەماكېدونچەمالايالامچ" + - "ەموڭغۇلچەماراتىچەمالايچەمالتاچەبىرماچەناۋرۇچەشىمالى ندەبەلەچەنېپالچ" + - "ەندونگاچەگوللاندچەيېڭى نورۋېگچەنورۋىگىيە بوكمالچەجەنۇبى ندەبەلەچەنا" + - "ۋاخوچەنىيانجاچەئوكسىتچەئوجىبۋاچەئوروموچەئودىياچەئوسسېتچەچەپەنجابچەپ" + - "الىچەپولەكچەپۇشتۇچەپورتۇگالچەكېچىۋاچەرومانسچەرۇندىچەرومىنچەرۇسچەكېن" + - "ىيەرىۋانداچەسانسكرىتچەساردىنىيەچەسىندىچەشىمالىي سامىچەسانگوچەسىنگال" + - "چەسىلوۋاكچەسىلوۋېنچەساموئاچەشوناچەسومالىچەئالبانچەسېربچەسىۋاتىچەسوت" + - "وچەسۇنداچەشىۋېدچەسىۋاھىلچەتامىلچەتېلۇگۇچەتاجىكچەتايلاندچەتىگرىنياچە" + - "تۈركمەنچەسىۋاناچەتونگانچەتۈركچەسونگاچەتاتارچەتاختىچەئۇيغۇرچەئۇكرائى" + - "نچەئوردۇچەئۆزبېكچەۋېنداچەۋىيېتنامچەۋولاپۇكچەۋاللۇنچەۋولوفچەخوساچەيى" + - "ددىشچەيورۇباچەجۇاڭچەخەنزۇچەزۇلۇچەئاتجېچەئاچولىچەئاداڭمېچەئادىگېيچەئ" + - "افرىخىلىچەئاگەمچەئاينۇچەئاككادچەئالېيۇتچەجەنۇبى ئالتاي تىللىرىقەدىم" + - "كى ئىنگلىزچەئانگىكاچەئارامۇچەماپۇدۇنگۇنچەئاراپاخوچەئاراۋاكچەئاسۇچەئ" + - "استۇرىيەچەئاۋادىچەبېلۇجىچەبالىچەباساچەبامۇنچەگومالاچەبېجاچەبېمباچەب" + - "ېناچەبافۇتچەبوجپۇرىچەبىكولچەبىنىچەكومچەسىكسىكاچەبىراجچەبودوچەئاكۇسچ" + - "ەبۇرىياتچەبۇگىچەبۇلۇچەبىلىنچەمېدۇمباچەكاددوچەكارىبچەكايۇگاچەئاتسامچ" + - "ەسېبۇچەچىگاچەچىبچاچەچاغاتايچەچۇكچەمارىچەچىنۇك-ژارگونچەچوكتاۋچەچىپېۋ" + - "يانچەچېروكىچەچېيېنچەمەركىزىي كۇردچەكوپتىكچەقىرىم تۈركچەكاسزۇبىچەداك" + - "وتاچەدارگىۋاچەتايتاچەدېلاۋارېچەسلاۋچەدوگرىبچەدىنكاچەزارماچەدوگرىچەت" + - "ۆۋەن سوربچەدۇئالاچەئوتتۇرا گوللاندىيەچەجولاچەدىيۇلاچەدازاگاچەئېمبۇچ" + - "ەئېفىكچەقەدىمكى مىسىرچەئېكاجۇكچەئېلامىتچەئوتتۇرا ئەسىر ئىنگلىزچەئېۋ" + - "وندوچەفاڭچەفىلىپپىنچەفونچەئوتتۇرا ئەسىر فىرانسۇزچەقەدىمكى فىرانسۇزچ" + - "ەشىمالى فىرىزيەچەشەرقى فىرىزيەچەفىرىئۇلىچەگاچەگايوچەگىباياچەگىزچەگى" + - "لبېرتچەئوتتۇرا ئەسىر ئېگىزلىك گېرمانچەقەدىمكى ئېگىزلىك گېرمانچەگوند" + - "ىچەگورونتالوچەگوتچەگرېبوچەقەدىمكى گىرېكچەگېرمانچە شىۋىتسارىيەگۇسىچە" + - "گىۋىچىنچەھەيدەچەھاۋايچەخىلىگاينونچەخىتتىتچەمۆڭچەئۈستۈن سوربچەخۇپاچە" + - "ئىبانچەئىبىبىئوچەئىلوكانوچەئىنگۇشچەلوجبانچەنگومباچەماچامچەئىبرانى پ" + - "ارسچەئىبرانى ئەرەبچەقارا-قالپاقچەكابىلېچەكاچىنچەجۇچەكامباچەكاۋىچەكا" + - "باردەيچەكانېمبۇچەتياپچەماكوندېچەكابۇۋېردىيانچەكوروچەكاسىچەخوتەنچەكو" + - "يرا چىنىچەكاكوچەكالېنجىنچەكىمبۇندۇچەكونكانچەكوسرايېچەكىپەللېچەقاراچ" + - "اي-بالقارچەكارەلچەكۇرۇخچەشامبالاچەبافىياچەكولىشچەقۇمۇقچەكۇتەنايچەلا" + - "دىنوچەلانگىچەلانداچەلامباچەلېزگىنچەمونگوچەلوزىچەلۇبا-لۇئاچەلۇيسېنگو" + - "چەلۇنداچەلۇئوچەمىزوچەلۇياچەمادۇرېسچەمافاچەماگاخىچەمايتىلىچەماكاسارچ" + - "ەماندىنگوچەماسايچەماباچەموكشاچەماندارچەمېندېچەمېرۇچەمورىسيېنچەئوتتۇ" + - "را ئەسىر ئىرېلاندچەماكۇۋاچەمېتاچە’مىكماكچەمىناڭكابائۇچەمانجۇچەمانىپ" + - "ۇرچەموخاۋكچەموسسىچەمۇنداڭچەكۆپ تىللاركىرىكچەمىراندېسچەمارۋارىچەميېن" + - "ېچەئېرزاچەناپولىچەناماچەتۆۋەن گېرمانچەنېۋارىچەنىئاسچەنيۇئېچەكۋاسىيو" + - "چەنگېمبۇنچەنوغايچەقەدىمكى نورۋېگچەنىكوچەشىمالىي سوتوچەمۇئېرچەنېۋارچ" + - "ەنيامۋېزىچەنىيانكولېچەنىئوروچەنىزەماچەئوساگېلارچەئوسمان تۈركچەپانگا" + - "سىنانچەپەھلەۋىچەپامپانگاچەپاپىيامېنتوچەپالاۋچەقەدىمكى پارىسچەفىنىكى" + - "يەچەپوناپېئانچەقەدىمكى پروۋېنچالچەراجاستانچەراپانىيچەرومبوچەسىگانچە" + - "ئارومانچەرىۋاچەسانداۋېچەساخاچەسامارىتانچەسامبۇرۇچەساساكچەسانتالچەنگ" + - "امبايچەسانگۇچەسىتسىلىيەچەشوتلاندىيەچەسېكنېكاچەسېناچەسېلكاپچەشەرقىي " + - "سوڭخايچەقەدىمكى ئىرېلاندچەشىلخاچەشانچەچاد ئەرەبچەسىداموچەجەنۇبىي سا" + - "مىچەلۇلې سامىچەئىنارى سامىچەسكولت سامىچەسونىنكەچەسوغدىچەسىرانان-توڭ" + - "وچەسېرېرچەساخوچەسۇكۇماچەسۇسۇچەسۈمەرچەكومورىچەقەدىمىي سۇرىيەچەسۇرىيە" + - "چەتېمنېچەتېسوچەتېرېناچەتېتۇمچەتىگرېچەتىۋچەتوكېلاۋچەكىلىنگونچەتىلىنگ" + - "ىتچەتاماشېكچەنياسا توڭانچەتوك-پىسىنچەتوروكوچەسىمشيانچەتۇمبۇكاچەتۇۋا" + - "لۇچەشىمالىي سوڭخايچەتوۋاچەمەركىزىي ئاتلاس تامازايتچەئۇدمۇرتچەئۇگارى" + - "تىكچەئۇمبۇندۇچەغول تىلۋايچەۋوتېچەۋۇنجوچەۋالسېرچەۋولايتاچەۋارايچەۋاش" + - "وچەقالماقچەسوگاچەياۋچەياپچەياڭبەنچەيېمباچەگۇاڭدوڭچەزاپوتېكچەبىلىس ب" + - "ەلگىلىرىزېناگاچەئۆلچەملىك ماراكەش تامازىتچەزۇنىچەتىل مەزمۇنى يوقزاز" + - "اچەھازىرقى زامان ئۆلچەملىك ئەرەبچەئاۋستىرىيە گېرمانچەشىۋىتسارىيە ئې" + - "گىزلىك گېرمانچەئاۋسترالىيە ئىنگلىزچەكانادا ئىنگلىزچەئەنگلىيە ئىنگلى" + - "زچەئامېرىكا ئىنگلىزچەلاتىن ئامېرىكا ئىسپانچەياۋروپا ئىسپانچەمېكسىكا" + - " ئىسپانچەكانادا فىرانسۇزچەشىۋىتسارىيە فىرانسۇزچەبىرازىلىيە پورتۇگالچ" + - "ەياۋروپا پورتۇگالچەسېرب-كرودىيەچەكونگو سىۋالىچەئاددىي خەنچەمۇرەككەپ" + - " خەنچە", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000e, 0x001e, 0x0030, 0x0044, 0x0052, 0x0062, 0x0074, - 0x0082, 0x0090, 0x009e, 0x00b0, 0x00ca, 0x00dc, 0x00ee, 0x00fe, - 0x0110, 0x0122, 0x0132, 0x0140, 0x0152, 0x0160, 0x0172, 0x0180, - 0x0192, 0x01a0, 0x01aa, 0x01b4, 0x01d5, 0x01e3, 0x01ef, 0x01fd, - 0x020d, 0x021b, 0x0229, 0x0235, 0x0243, 0x0255, 0x026b, 0x027b, - 0x028b, 0x0299, 0x02a5, 0x02b3, 0x02bd, 0x02c9, 0x02d9, 0x02ed, - 0x0306, 0x031a, 0x033f, 0x034b, 0x035f, 0x0371, 0x037b, 0x038b, - 0x039f, 0x03ad, 0x03c2, 0x03d2, 0x03e0, 0x03f0, 0x0400, 0x0410, - // Entry 40 - 7F - 0x0425, 0x0439, 0x044f, 0x045d, 0x0474, 0x0486, 0x0492, 0x04a4, - 0x04ba, 0x04d2, 0x04e0, 0x04ec, 0x04fa, 0x0508, 0x0518, 0x052e, - 0x053c, 0x0552, 0x0560, 0x0572, 0x0582, 0x0590, 0x05a0, 0x05ac, - 0x05b8, 0x05c8, 0x05d8, 0x05e6, 0x0602, 0x0610, 0x0622, 0x0634, - 0x0642, 0x0654, 0x066f, 0x0679, 0x068b, 0x069b, 0x06a9, 0x06bb, - 0x06d1, 0x06e1, 0x06f1, 0x06ff, 0x070d, 0x071b, 0x0729, 0x0748, - 0x0756, 0x0766, 0x0778, 0x0791, 0x07b4, 0x07d3, 0x07e3, 0x07f5, - 0x0805, 0x0817, 0x0827, 0x0837, 0x084b, 0x085b, 0x0867, 0x0875, - // Entry 80 - BF - 0x0883, 0x0897, 0x08a7, 0x08b7, 0x08c5, 0x08d3, 0x08dd, 0x08fb, - 0x090f, 0x0925, 0x0933, 0x094e, 0x095c, 0x096c, 0x097e, 0x0990, - 0x09a0, 0x09ac, 0x09bc, 0x09cc, 0x09d8, 0x09e8, 0x09f4, 0x0a02, - 0x0a10, 0x0a22, 0x0a30, 0x0a40, 0x0a4e, 0x0a60, 0x0a74, 0x0a86, - 0x0a96, 0x0aa6, 0x0ab2, 0x0ac0, 0x0ace, 0x0adc, 0x0aec, 0x0b00, - 0x0b0e, 0x0b1e, 0x0b2c, 0x0b40, 0x0b52, 0x0b62, 0x0b70, 0x0b7c, - 0x0b8c, 0x0b9c, 0x0ba8, 0x0bb6, 0x0bc2, 0x0bd0, 0x0be0, 0x0bf2, - 0x0c04, 0x0c04, 0x0c1a, 0x0c28, 0x0c36, 0x0c46, 0x0c46, 0x0c58, - // Entry C0 - FF - 0x0c58, 0x0c80, 0x0ca1, 0x0cb3, 0x0cc3, 0x0cdb, 0x0cdb, 0x0cef, - 0x0cef, 0x0cef, 0x0d01, 0x0d01, 0x0d01, 0x0d0d, 0x0d0d, 0x0d23, - 0x0d23, 0x0d33, 0x0d43, 0x0d4f, 0x0d4f, 0x0d5b, 0x0d69, 0x0d69, - 0x0d79, 0x0d85, 0x0d93, 0x0d93, 0x0d9f, 0x0dad, 0x0dad, 0x0dad, - 0x0dbf, 0x0dcd, 0x0dd9, 0x0dd9, 0x0de3, 0x0df5, 0x0df5, 0x0df5, - 0x0e03, 0x0e03, 0x0e0f, 0x0e1d, 0x0e2f, 0x0e3b, 0x0e47, 0x0e55, - 0x0e67, 0x0e75, 0x0e83, 0x0e93, 0x0ea3, 0x0eaf, 0x0ebb, 0x0ec9, - 0x0edb, 0x0ee5, 0x0ef1, 0x0f0c, 0x0f1c, 0x0f30, 0x0f40, 0x0f4e, - // Entry 100 - 13F - 0x0f6b, 0x0f7b, 0x0f7b, 0x0f92, 0x0f92, 0x0fa4, 0x0fb4, 0x0fc6, - 0x0fd4, 0x0fe8, 0x0ff4, 0x1004, 0x1012, 0x1020, 0x102e, 0x1045, - 0x1045, 0x1055, 0x107c, 0x1088, 0x1098, 0x10a8, 0x10b6, 0x10c4, - 0x10c4, 0x10e1, 0x10f3, 0x1105, 0x1131, 0x1131, 0x1143, 0x1143, - 0x114d, 0x1161, 0x1161, 0x116b, 0x116b, 0x1199, 0x11bc, 0x11bc, - 0x11db, 0x11f8, 0x120c, 0x1214, 0x1214, 0x1214, 0x1220, 0x1230, - 0x1230, 0x123a, 0x124c, 0x124c, 0x1287, 0x12b7, 0x12b7, 0x12c5, - 0x12db, 0x12e5, 0x12f3, 0x1310, 0x1337, 0x1337, 0x1337, 0x1343, - // Entry 140 - 17F - 0x1355, 0x1363, 0x1363, 0x1371, 0x1371, 0x1389, 0x1399, 0x13a3, - 0x13bc, 0x13bc, 0x13c8, 0x13d6, 0x13ea, 0x13fe, 0x140e, 0x140e, - 0x140e, 0x141e, 0x142e, 0x143c, 0x1457, 0x1474, 0x1474, 0x148d, - 0x149d, 0x14ab, 0x14b3, 0x14c1, 0x14cd, 0x14e1, 0x14f3, 0x14ff, - 0x1511, 0x152d, 0x152d, 0x1539, 0x1539, 0x1545, 0x1553, 0x156a, - 0x156a, 0x156a, 0x1576, 0x158a, 0x159e, 0x159e, 0x15ae, 0x15c0, - 0x15d2, 0x15f1, 0x15f1, 0x15f1, 0x15ff, 0x160d, 0x161f, 0x162f, - 0x163d, 0x164b, 0x165d, 0x166d, 0x167b, 0x1689, 0x1697, 0x16a7, - // Entry 180 - 1BF - 0x16a7, 0x16a7, 0x16a7, 0x16a7, 0x16a7, 0x16b5, 0x16c1, 0x16c1, - 0x16c1, 0x16d6, 0x16ea, 0x16f8, 0x1704, 0x1710, 0x171c, 0x171c, - 0x171c, 0x172e, 0x173a, 0x174a, 0x175c, 0x176e, 0x1782, 0x1790, - 0x179c, 0x17aa, 0x17ba, 0x17c8, 0x17d4, 0x17e8, 0x1816, 0x1826, - 0x1835, 0x1845, 0x185f, 0x186d, 0x187f, 0x188f, 0x189d, 0x189d, - 0x18ad, 0x18c0, 0x18ce, 0x18e2, 0x18f4, 0x18f4, 0x1902, 0x1910, - 0x1910, 0x1910, 0x1920, 0x192c, 0x1947, 0x1957, 0x1965, 0x1973, - 0x1973, 0x1985, 0x1997, 0x19a5, 0x19c4, 0x19c4, 0x19d0, 0x19eb, - // Entry 1C0 - 1FF - 0x19f9, 0x1a07, 0x1a1b, 0x1a31, 0x1a41, 0x1a51, 0x1a67, 0x1a80, - 0x1a98, 0x1aaa, 0x1abe, 0x1ad8, 0x1ae6, 0x1ae6, 0x1ae6, 0x1ae6, - 0x1ae6, 0x1b03, 0x1b03, 0x1b17, 0x1b17, 0x1b17, 0x1b2d, 0x1b2d, - 0x1b52, 0x1b52, 0x1b52, 0x1b66, 0x1b78, 0x1b78, 0x1b78, 0x1b78, - 0x1b86, 0x1b94, 0x1b94, 0x1b94, 0x1b94, 0x1ba6, 0x1bb2, 0x1bc4, - 0x1bd0, 0x1be6, 0x1bf8, 0x1c06, 0x1c16, 0x1c16, 0x1c28, 0x1c36, - 0x1c4c, 0x1c64, 0x1c64, 0x1c64, 0x1c76, 0x1c82, 0x1c82, 0x1c92, - 0x1caf, 0x1cd2, 0x1cd2, 0x1ce0, 0x1cea, 0x1cff, 0x1d0f, 0x1d0f, - // Entry 200 - 23F - 0x1d0f, 0x1d2a, 0x1d3f, 0x1d58, 0x1d6f, 0x1d81, 0x1d8f, 0x1daa, - 0x1db8, 0x1dc4, 0x1dc4, 0x1dd4, 0x1de0, 0x1dee, 0x1dfe, 0x1e1d, - 0x1e2d, 0x1e2d, 0x1e2d, 0x1e3b, 0x1e47, 0x1e57, 0x1e65, 0x1e73, - 0x1e7d, 0x1e8f, 0x1e8f, 0x1ea3, 0x1eb7, 0x1eb7, 0x1ec9, 0x1ee2, - 0x1ef7, 0x1ef7, 0x1f07, 0x1f07, 0x1f19, 0x1f19, 0x1f2b, 0x1f3b, - 0x1f5a, 0x1f66, 0x1f98, 0x1faa, 0x1fc0, 0x1fd4, 0x1fe1, 0x1feb, - 0x1feb, 0x1feb, 0x1feb, 0x1feb, 0x1ff7, 0x1ff7, 0x2005, 0x2015, - 0x2027, 0x2035, 0x2041, 0x2041, 0x2041, 0x2051, 0x2051, 0x205d, - // Entry 240 - 27F - 0x2067, 0x2071, 0x2081, 0x208f, 0x208f, 0x20a1, 0x20b3, 0x20d0, - 0x20d0, 0x20e0, 0x2114, 0x2120, 0x213c, 0x2148, 0x2183, 0x2183, - 0x21a8, 0x21e0, 0x2209, 0x2228, 0x224b, 0x226e, 0x229a, 0x22b9, - 0x22d8, 0x22d8, 0x22f9, 0x2324, 0x2324, 0x2324, 0x234d, 0x2370, - 0x2370, 0x238b, 0x23a6, 0x23bd, 0x23d8, - }, - }, - { // uk - ukLangStr, - ukLangIdx, - }, - { // ur - urLangStr, - urLangIdx, - }, - { // ur-IN - "افریقیکروشینجاوانیزجارجيائىکلالیسٹکنڑکرداودھیسورانی کردیزرمہمگہیمسائیمعی" + - "اری مراقشی تمازیقیجدید معیاری عربیآسان چینی", - []uint16{ // 612 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - // Entry 40 - 7F - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0026, 0x0036, 0x0036, 0x0036, 0x0036, - 0x0036, 0x0044, 0x0044, 0x004a, 0x004a, 0x004a, 0x004a, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - // Entry 80 - BF - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - // Entry C0 - FF - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - // Entry 100 - 13F - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - // Entry 140 - 17F - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - // Entry 180 - 1BF - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x007f, 0x007f, 0x007f, 0x007f, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - // Entry 1C0 - 1FF - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - // Entry 200 - 23F - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - // Entry 240 - 27F - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00cf, 0x00cf, - 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, - 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, - 0x00cf, 0x00cf, 0x00cf, 0x00e0, - }, - }, - { // uz - uzLangStr, - uzLangIdx, - }, - { // uz-Arab - "دریپشتواوزبیک", - []uint16{ // 170 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - // Entry 40 - 7F - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - // Entry 80 - BF - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x001a, - }, - }, - { // uz-Cyrl - "афарчаабхазчаафрикаансаканчаамхарчаарагонарабчаассомчааварчааймараозарба" + - "йжончабошқирдчабеларусчаболгарчабисламабамбарчабенгалчатибетчабрето" + - "нчабоснийчакаталончачечен тиличаморрокорсиканчачехчаславянча (черко" + - "в)чуваш тилиуэлсчадатчанемисчадивехидзонгкаэвечагрекчаинглизчаэспер" + - "антоиспанчаэстончабаскчафорсийфулаҳфинчафижичафарерчафранцузчағарби" + - "й фризчаирландчашотландча гаеликгалицийчагуаранигужаротчамэнчахауса" + - "ибронийҳиндихорватчагаитянчавенгерчаарманчагерероинтерлингваиндонез" + - "чаигбоидоисландчаиталянчаинуктитутяпончаяванчагрузинчакикуюқозоқчаг" + - "ренландчахмерчаканнадакорейсчаканурикашмирчакурдчакорнчақирғизчалот" + - "инчалюксембургчагандачалингалчалаосчалитвачалуба-катангалатишчамала" + - "гасийчамаршалл тилимаоримакедончамалаяламмўғулчамаратхималай тилмал" + - "тачабирманчашимолий ндебеленепалчаголландчанорвегча нюнорскнорвегча" + - " бокмалжанубий ндебелчачеваокситанчаоромоодияпанжобчаполякчапуштупор" + - "тугалчакечуароманшчарундируминчарусчакиняруандасанскритсиндҳишимоли" + - "й саамчасангосингалчасловакчасловенчашонасомаличаалбанчасербчасвати" + - "сунданчашведчасуахилитамилчателугутожикчатайчатигринячатуркманчатон" + - "ганчатуркчататарчауйғурчаукраинчаурдуўзбекчавендаветнамчаволапюквол" + - "офчахосаиддишйорубахитойчазулуачинадангмэадигейагемчаайнуалеутангик" + - "амапудунгунарапахоасучаастурийчаавадхибаличабасаабембабеначабхожпур" + - "ибинибодочабугийчаблинчасебуанчачигачачуукчамаричоктавчачерокишайен" + - "нсорани-курдчадакотчадаргинчатаитачадогрибзармақуйи-сорбчадуалачади" + - "ола-фогнидазагаэмбучаэфикэкажукэвондончафилипинчафонфриулчагагеэзги" + - "лбертчагоронталонемисча (Швейцария)гусиигвичингавайчахилигайнонхмон" + - "гчаюқори сорбчахупа тилиибан тилиибибоилокоингушчангомбамачаме тили" + - "кабилчакажикамбачамакондечакабувердианукойра-чииникакокаленжинчакон" + - "канчашамбалабафиячакёлнчалангичалакотачалакотачашимолий лурилушайлу" + - "ҳямасайчамокша тилимендемеручаморисьенмахува-миттометамикмакминангк" + - "абауманипурчамогавкмоссимундангбир нечта тилкрикчамирандесэрзянчама" + - "зандераннаманиуэчаквасионгиембуннконуэрчанянколепапияментокичэромбо" + - "чааруминруанда тилисахасамбуручасанталисангучасенакойраборо-сеннита" + - "шелхитжанубий саамчалуле-саамчаинари-саамчасколт-саамчасаҳочакоморч" + - "асуриячатесотигретасавакмарказий атлас тамазигхтномаълум тилваивунж" + - "овалсерчаволяттасогаянгбенкантончатамазигхтТил таркиби йўқстандарт " + - "арабчаинглизча (Британия)инглизча (Америка)фламандчаконго-суахилисо" + - "ддалаштирилган хитойчаанъанавий хитойча", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x001a, 0x001a, 0x002c, 0x0038, 0x0046, 0x0052, - 0x005e, 0x006c, 0x0078, 0x0084, 0x009c, 0x00ae, 0x00c0, 0x00d0, - 0x00de, 0x00ee, 0x00fe, 0x010c, 0x011c, 0x012c, 0x013e, 0x0151, - 0x015f, 0x0173, 0x0173, 0x017d, 0x019c, 0x01af, 0x01bb, 0x01c5, - 0x01d3, 0x01df, 0x01ed, 0x01f7, 0x0203, 0x0213, 0x0225, 0x0233, - 0x0241, 0x024d, 0x0259, 0x0263, 0x026d, 0x0279, 0x0287, 0x0299, - 0x02b2, 0x02c2, 0x02e1, 0x02f3, 0x0301, 0x0313, 0x031d, 0x0327, - 0x0335, 0x033f, 0x033f, 0x034f, 0x035f, 0x036f, 0x037d, 0x0389, - // Entry 40 - 7F - 0x039f, 0x03b1, 0x03b1, 0x03b9, 0x03b9, 0x03b9, 0x03bf, 0x03cf, - 0x03df, 0x03f1, 0x03fd, 0x0409, 0x0419, 0x0419, 0x0423, 0x0423, - 0x0431, 0x0445, 0x0451, 0x045f, 0x046f, 0x047b, 0x048b, 0x0497, - 0x0497, 0x04a3, 0x04b3, 0x04c1, 0x04d9, 0x04e7, 0x04e7, 0x04f7, - 0x0503, 0x0511, 0x0528, 0x0536, 0x054c, 0x0563, 0x056d, 0x057f, - 0x058f, 0x059d, 0x05ab, 0x05bc, 0x05ca, 0x05da, 0x05da, 0x05f7, - 0x0605, 0x0605, 0x0617, 0x0636, 0x0653, 0x0672, 0x0672, 0x067a, - 0x068c, 0x068c, 0x0696, 0x069e, 0x069e, 0x06ae, 0x06ae, 0x06bc, - // Entry 80 - BF - 0x06c6, 0x06da, 0x06e4, 0x06f4, 0x06fe, 0x070c, 0x0716, 0x072a, - 0x073a, 0x073a, 0x0746, 0x0761, 0x076b, 0x077b, 0x078b, 0x079b, - 0x079b, 0x07a3, 0x07b3, 0x07c1, 0x07cd, 0x07d7, 0x07d7, 0x07e7, - 0x07f3, 0x0801, 0x080f, 0x081b, 0x0829, 0x0833, 0x0845, 0x0857, - 0x0857, 0x0867, 0x0873, 0x0873, 0x0881, 0x0881, 0x088f, 0x089f, - 0x08a7, 0x08b5, 0x08bf, 0x08cf, 0x08dd, 0x08dd, 0x08eb, 0x08f3, - 0x08fd, 0x0909, 0x0909, 0x0917, 0x091f, 0x0927, 0x0927, 0x0935, - 0x0941, 0x0941, 0x0941, 0x094d, 0x0955, 0x0955, 0x0955, 0x095f, - // Entry C0 - FF - 0x095f, 0x095f, 0x095f, 0x096b, 0x096b, 0x097f, 0x097f, 0x098d, - 0x098d, 0x098d, 0x098d, 0x098d, 0x098d, 0x0997, 0x0997, 0x09a9, - 0x09a9, 0x09b5, 0x09b5, 0x09c1, 0x09c1, 0x09cb, 0x09cb, 0x09cb, - 0x09cb, 0x09cb, 0x09d5, 0x09d5, 0x09e1, 0x09e1, 0x09e1, 0x09e1, - 0x09f1, 0x09f1, 0x09f9, 0x09f9, 0x09f9, 0x09f9, 0x09f9, 0x09f9, - 0x09f9, 0x09f9, 0x0a05, 0x0a05, 0x0a05, 0x0a13, 0x0a13, 0x0a1f, - 0x0a1f, 0x0a1f, 0x0a1f, 0x0a1f, 0x0a1f, 0x0a2f, 0x0a3b, 0x0a3b, - 0x0a3b, 0x0a47, 0x0a4f, 0x0a4f, 0x0a5f, 0x0a5f, 0x0a6b, 0x0a77, - // Entry 100 - 13F - 0x0a90, 0x0a90, 0x0a90, 0x0a90, 0x0a90, 0x0a90, 0x0a9e, 0x0aae, - 0x0abc, 0x0abc, 0x0abc, 0x0ac8, 0x0ac8, 0x0ad2, 0x0ad2, 0x0ae7, - 0x0ae7, 0x0af5, 0x0af5, 0x0b0a, 0x0b0a, 0x0b16, 0x0b22, 0x0b2a, - 0x0b2a, 0x0b2a, 0x0b36, 0x0b36, 0x0b36, 0x0b36, 0x0b48, 0x0b48, - 0x0b48, 0x0b5a, 0x0b5a, 0x0b60, 0x0b60, 0x0b60, 0x0b60, 0x0b60, - 0x0b60, 0x0b60, 0x0b6e, 0x0b72, 0x0b72, 0x0b72, 0x0b72, 0x0b72, - 0x0b72, 0x0b7a, 0x0b8c, 0x0b8c, 0x0b8c, 0x0b8c, 0x0b8c, 0x0b8c, - 0x0b9e, 0x0b9e, 0x0b9e, 0x0b9e, 0x0bc1, 0x0bc1, 0x0bc1, 0x0bcb, - // Entry 140 - 17F - 0x0bd7, 0x0bd7, 0x0bd7, 0x0be5, 0x0be5, 0x0bf9, 0x0bf9, 0x0c07, - 0x0c1e, 0x0c1e, 0x0c2f, 0x0c40, 0x0c4a, 0x0c54, 0x0c62, 0x0c62, - 0x0c62, 0x0c62, 0x0c6e, 0x0c83, 0x0c83, 0x0c83, 0x0c83, 0x0c83, - 0x0c91, 0x0c91, 0x0c99, 0x0ca7, 0x0ca7, 0x0ca7, 0x0ca7, 0x0ca7, - 0x0cb9, 0x0cd1, 0x0cd1, 0x0cd1, 0x0cd1, 0x0cd1, 0x0cd1, 0x0ce6, - 0x0ce6, 0x0ce6, 0x0cee, 0x0d02, 0x0d02, 0x0d02, 0x0d12, 0x0d12, - 0x0d12, 0x0d12, 0x0d12, 0x0d12, 0x0d12, 0x0d12, 0x0d20, 0x0d2e, - 0x0d3a, 0x0d3a, 0x0d3a, 0x0d3a, 0x0d48, 0x0d48, 0x0d48, 0x0d48, - // Entry 180 - 1BF - 0x0d48, 0x0d48, 0x0d48, 0x0d68, 0x0d68, 0x0d68, 0x0d68, 0x0d7f, - 0x0d7f, 0x0d7f, 0x0d7f, 0x0d7f, 0x0d7f, 0x0d89, 0x0d91, 0x0d91, - 0x0d91, 0x0d91, 0x0d91, 0x0d91, 0x0d91, 0x0d91, 0x0d91, 0x0d9f, - 0x0d9f, 0x0db2, 0x0db2, 0x0dbc, 0x0dc8, 0x0dd8, 0x0dd8, 0x0def, - 0x0df7, 0x0e03, 0x0e19, 0x0e19, 0x0e2b, 0x0e37, 0x0e41, 0x0e41, - 0x0e4f, 0x0e67, 0x0e73, 0x0e83, 0x0e83, 0x0e83, 0x0e83, 0x0e91, - 0x0ea5, 0x0ea5, 0x0ea5, 0x0ead, 0x0ead, 0x0ead, 0x0ead, 0x0eb9, - 0x0eb9, 0x0ec5, 0x0ed5, 0x0ed5, 0x0ed5, 0x0ed5, 0x0edb, 0x0edb, - // Entry 1C0 - 1FF - 0x0ee7, 0x0ee7, 0x0ee7, 0x0ef5, 0x0ef5, 0x0ef5, 0x0ef5, 0x0ef5, - 0x0ef5, 0x0ef5, 0x0ef5, 0x0f09, 0x0f09, 0x0f09, 0x0f09, 0x0f09, - 0x0f09, 0x0f09, 0x0f09, 0x0f09, 0x0f09, 0x0f09, 0x0f09, 0x0f09, - 0x0f09, 0x0f11, 0x0f11, 0x0f11, 0x0f11, 0x0f11, 0x0f11, 0x0f11, - 0x0f1f, 0x0f1f, 0x0f1f, 0x0f1f, 0x0f1f, 0x0f2b, 0x0f40, 0x0f40, - 0x0f48, 0x0f48, 0x0f5a, 0x0f5a, 0x0f68, 0x0f68, 0x0f68, 0x0f76, - 0x0f76, 0x0f76, 0x0f76, 0x0f76, 0x0f76, 0x0f7e, 0x0f7e, 0x0f7e, - 0x0f9b, 0x0f9b, 0x0f9b, 0x0fab, 0x0fab, 0x0fab, 0x0fab, 0x0fab, - // Entry 200 - 23F - 0x0fab, 0x0fc6, 0x0fdb, 0x0ff2, 0x1009, 0x1009, 0x1009, 0x1009, - 0x1009, 0x1015, 0x1015, 0x1015, 0x1015, 0x1015, 0x1023, 0x1023, - 0x1031, 0x1031, 0x1031, 0x1031, 0x1039, 0x1039, 0x1039, 0x1043, - 0x1043, 0x1043, 0x1043, 0x1043, 0x1043, 0x1043, 0x1043, 0x1043, - 0x1043, 0x1043, 0x1043, 0x1043, 0x1043, 0x1043, 0x1043, 0x1043, - 0x1051, 0x1051, 0x107f, 0x107f, 0x107f, 0x107f, 0x1096, 0x109c, - 0x109c, 0x109c, 0x109c, 0x109c, 0x109c, 0x109c, 0x10a6, 0x10b6, - 0x10c4, 0x10c4, 0x10c4, 0x10c4, 0x10c4, 0x10c4, 0x10c4, 0x10cc, - // Entry 240 - 27F - 0x10cc, 0x10cc, 0x10d8, 0x10d8, 0x10d8, 0x10e8, 0x10e8, 0x10e8, - 0x10e8, 0x10e8, 0x10fa, 0x10fa, 0x1116, 0x1116, 0x1133, 0x1133, - 0x1133, 0x1133, 0x1133, 0x1133, 0x1156, 0x1177, 0x1177, 0x1177, - 0x1177, 0x1177, 0x1177, 0x1177, 0x1177, 0x1189, 0x1189, 0x1189, - 0x1189, 0x1189, 0x11a2, 0x11d1, 0x11f2, - }, - }, - { // vai - "ꕉꕪꘋꕉꕆꕌꔸꕞꕌꖝꔆꕞꖩꔻꗂꔠꗸꘋꗩꕭꔷꗿꗡꕧꕮꔧꗥꗷꘋꕶꕱꕐꘊꔧꗨꗡꔻꘂꘋꗱꘋꔻꕌꖙꕢꔦꔺꖽꔟꗸꘋꔤꖆꕇꔻꘂꘋꔤꕼꔤꕚꔷꘂꘋꕧꕐꕇꔧꕧꕙꕇꔧ" + - "ꕃꘈꗢꖏꔸꘂꘋꕮꔒꔀꗩꕆꔻꕇꕐꔷꗍꔿꖛꕨꔬꗁꔒꔻꕶꕿꕃꔤꖄꕆꕇꘂꘋꗐꖺꔻꘂꘋꕟꖙꕡꖇꕮꔷꖬꔨꗵꘋꕚꕆꔷꕚꔤꗋꕃꖳꖴꔓꕇꘂꘋꖺꖦꔲꕩꕯ" + - "ꕆꔧꖎꖄꕑꕦꕇꔧꖮꖨꕙꔤ", - []uint16{ // 560 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0015, 0x0015, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x002a, 0x0036, - 0x0036, 0x0036, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, - 0x003f, 0x003f, 0x003f, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x004e, 0x004e, 0x004e, 0x004e, 0x0057, 0x005d, 0x005d, 0x0066, - 0x0066, 0x0066, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x007e, - 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x0087, - 0x0087, 0x008d, 0x008d, 0x008d, 0x008d, 0x0099, 0x0099, 0x0099, - // Entry 40 - 7F - 0x0099, 0x00ab, 0x00ab, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, - 0x00c0, 0x00c0, 0x00cc, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00e1, 0x00e1, 0x00ed, 0x00ed, 0x00ed, 0x00ed, - 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, - 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, - 0x00ed, 0x00ed, 0x00ed, 0x00f6, 0x00f6, 0x00ff, 0x00ff, 0x00ff, - 0x0108, 0x0108, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, - 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x0117, 0x0117, 0x0120, - // Entry 80 - BF - 0x0120, 0x012c, 0x012c, 0x012c, 0x012c, 0x013b, 0x014a, 0x0153, - 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, - 0x0153, 0x0153, 0x015c, 0x015c, 0x015c, 0x015c, 0x015c, 0x015c, - 0x0168, 0x0168, 0x0171, 0x0171, 0x0171, 0x0177, 0x0177, 0x0177, - 0x0177, 0x0177, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x018f, - 0x0195, 0x0195, 0x0195, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, - 0x01a4, 0x01ad, 0x01ad, 0x01b6, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - // Entry C0 - FF - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - // Entry 100 - 13F - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - // Entry 140 - 17F - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - // Entry 180 - 1BF - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - // Entry 1C0 - 1FF - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - // Entry 200 - 23F - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01c2, - }, - }, - { // vai-Latn - "AkaŋAmiháriLahabuBhelarusaŋBhɔgerɛŋBhɛŋgáliChɛJamáĩHɛlɛŋPooPanyɛĩPɛɛsiyɛ" + - "ŋFɛŋsiHawusaHíiŋdiHɔŋgérɛŋÍndonisiyɛŋÍgboItáliyɛŋJapaníĩJavaníĩKimɛ" + - "ɛ̃ tɛKoríyɛŋMaléeeBhɛmísiNipaliDɔchiPuŋjabhiPɔ́lésiPotokíiRomíniyɛŋ" + - "RɔshiyɛŋRawundaSomáliSúwídɛŋTamíliTáiTɔ́kiYukureniyɛŋƆduViyamíĩYórób" + - "haChaniĩZúluVai", - []uint16{ // 560 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x000d, 0x000d, - 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x001e, 0x0029, - 0x0029, 0x0029, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x003f, 0x003f, 0x003f, 0x003f, 0x0047, 0x004a, 0x004a, 0x0052, - 0x0052, 0x0052, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006b, - 0x006b, 0x0073, 0x0073, 0x0073, 0x0073, 0x0080, 0x0080, 0x0080, - // Entry 40 - 7F - 0x0080, 0x008e, 0x008e, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, - 0x009e, 0x009e, 0x00a7, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00bd, 0x00bd, 0x00c7, 0x00c7, 0x00c7, 0x00c7, - 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, - 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, - 0x00c7, 0x00c7, 0x00c7, 0x00ce, 0x00ce, 0x00d7, 0x00d7, 0x00d7, - 0x00dd, 0x00dd, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, - 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00ec, 0x00ec, 0x00f6, - // Entry 80 - BF - 0x00f6, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x010a, 0x0115, 0x011c, - 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, - 0x011c, 0x011c, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, - 0x012e, 0x012e, 0x0135, 0x0135, 0x0135, 0x0139, 0x0139, 0x0139, - 0x0139, 0x0139, 0x0140, 0x0140, 0x0140, 0x0140, 0x0140, 0x014d, - 0x0151, 0x0151, 0x0151, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, - 0x015a, 0x0163, 0x0163, 0x016a, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - // Entry C0 - FF - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - // Entry 100 - 13F - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - // Entry 140 - 17F - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - // Entry 180 - 1BF - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - // Entry 1C0 - 1FF - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - // Entry 200 - 23F - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, - 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x0172, - }, - }, - { // vi - viLangStr, - viLangIdx, - }, - { // vun - "KiakanyiKiamharyiKyiarabuKyibelarusiKyibulgaryiaKyibanglaKyicheckiKyijer" + - "umaniKyigirikiKyingerezaKyihispaniaKyiajemiKyifaransaKyihausaKyihind" + - "iKyihungariKyiindonesiaKyiigboKyiitalianoKyijapaniKyijavaKyikambodia" + - "KyikoreaKyimalesiaKyiburmaKyinepaliKyiholanziKyipunjabiKyipolandiKyi" + - "renoKyiromaniaKyirusiKyinyarwandaKyisomalyiKyiswidiKyitamilKyitailan" + - "diKyiturukyiKyiukraniaKyiurduKyivietinamuKyiyorubaKyichinaKyizuluKyi" + - "vunjo", - []uint16{ // 567 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0011, 0x0011, - 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0030, - 0x0030, 0x0030, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x004d, 0x004d, 0x004d, 0x004d, 0x0056, 0x0060, 0x0060, 0x006b, - 0x006b, 0x006b, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x0085, - 0x0085, 0x008d, 0x008d, 0x008d, 0x008d, 0x0097, 0x0097, 0x0097, - // Entry 40 - 7F - 0x0097, 0x00a3, 0x00a3, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, - 0x00b5, 0x00b5, 0x00be, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00d0, 0x00d0, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00e2, 0x00e2, 0x00ea, 0x00ea, 0x00ea, - 0x00f3, 0x00f3, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, - 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x0107, 0x0107, 0x0111, - // Entry 80 - BF - 0x0111, 0x0118, 0x0118, 0x0118, 0x0118, 0x0122, 0x0129, 0x0135, - 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, - 0x0135, 0x0135, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - 0x0147, 0x0147, 0x014f, 0x014f, 0x014f, 0x015a, 0x015a, 0x015a, - 0x015a, 0x015a, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x016e, - 0x0175, 0x0175, 0x0175, 0x0181, 0x0181, 0x0181, 0x0181, 0x0181, - 0x0181, 0x018a, 0x018a, 0x0192, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry C0 - FF - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 100 - 13F - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 140 - 17F - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 180 - 1BF - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 1C0 - 1FF - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 200 - 23F - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x01a1, - }, - }, - { // wae - "AbčasišAfrikánsAmharišArabišAssamesišAymaraSerbaidšanišWísrussišBulgariš" + - "BengališTibetišBosnišKatalanišTšečišWalisišDänišTitšMalediwišButaniš" + - "GričišEnglišSchpanišEstnišBaskišPersišFinišFidšianišWälšIrišGalizišG" + - "uaraniGujaratiHausaHebräišHindiKroatišHaitianišUngarišArmenišIndones" + - "išIgboIisländišItalienišJapanišGeorgišKazačišKambodšanišKannadaKorea" + - "nišKašmirišKurdišKirgisišLatinišLuxemburgišLingalaLaotišLitauišLetti" + - "šMalagásiMaoriMazedonišMalayalamMongolišMarathiMalaíšMaltesišBurmes" + - "išNordndebeleNepalesišHoländišNorwegiš NynorskNorwegiš BokmålNyanjaO" + - "riyaOsétišPandšabišPolnišPaštuPortugisišQuečuaRätromanišRundiRumäniš" + - "RusišRuandišSanskritSindhiNordsamišSangoSingalesišSlowakišSlowenišSa" + - "moanišShonaSomališAlbanišSerbišSwaziSüdsothoSundanesišSchwedišSuahel" + - "išTamilišTeluguTadšikišThailändišTigrinjaTurkmenišTswanaTongaTürkišT" + - "songaTaitišUigurišUkrainišUrduUsbekišVendaVietnamesišWolofXhosaYorub" + - "aChinesišZuluEfikFilipinišHawaíanišNordsothoJakutišTetumNiwmelanesiš" + - "Unbekannti SchpračWalserÖštričišes TitšSchwizer HočtitšAuštrališes E" + - "nglišKanadišes EnglišBritišes EnglišAmerikanišes EnglišLatiamerikani" + - "šes SchpanišIberišes SchpanišKanadišes WälšSchwizer WälšFlämišBrasi" + - "lianišes PortugisišIberišes PortugisišVereifačts ChinesišTraditionel" + - "ls Chinesiš", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0009, 0x0009, 0x0012, 0x0012, 0x001a, 0x001a, - 0x0021, 0x002b, 0x002b, 0x0031, 0x003f, 0x003f, 0x004a, 0x0053, - 0x0053, 0x0053, 0x005c, 0x0064, 0x0064, 0x006b, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x007e, 0x007e, 0x007e, 0x0086, 0x008d, - 0x0092, 0x009c, 0x00a4, 0x00a4, 0x00ac, 0x00b3, 0x00b3, 0x00bc, - 0x00c3, 0x00ca, 0x00d1, 0x00d1, 0x00d7, 0x00e2, 0x00e2, 0x00e8, - 0x00e8, 0x00ed, 0x00ed, 0x00f5, 0x00fc, 0x0104, 0x0104, 0x0109, - 0x0112, 0x0117, 0x0117, 0x011f, 0x0129, 0x0131, 0x0139, 0x0139, - // Entry 40 - 7F - 0x0139, 0x0143, 0x0143, 0x0147, 0x0147, 0x0147, 0x0147, 0x0152, - 0x015c, 0x015c, 0x0164, 0x0164, 0x016c, 0x016c, 0x016c, 0x016c, - 0x0175, 0x0175, 0x0182, 0x0189, 0x0192, 0x0192, 0x019c, 0x01a3, - 0x01a3, 0x01a3, 0x01ac, 0x01b4, 0x01c0, 0x01c0, 0x01c0, 0x01c7, - 0x01ce, 0x01d6, 0x01d6, 0x01dd, 0x01e6, 0x01e6, 0x01eb, 0x01f5, - 0x01fe, 0x0207, 0x020e, 0x0216, 0x021f, 0x0228, 0x0228, 0x0233, - 0x023d, 0x023d, 0x0247, 0x0258, 0x0269, 0x0269, 0x0269, 0x026f, - 0x026f, 0x026f, 0x026f, 0x0274, 0x027c, 0x0287, 0x0287, 0x028e, - // Entry 80 - BF - 0x0294, 0x029f, 0x02a6, 0x02b2, 0x02b7, 0x02c0, 0x02c6, 0x02ce, - 0x02d6, 0x02d6, 0x02dc, 0x02e6, 0x02eb, 0x02f6, 0x02ff, 0x0308, - 0x0311, 0x0316, 0x031e, 0x0326, 0x032d, 0x0332, 0x033b, 0x0346, - 0x034f, 0x0358, 0x0360, 0x0366, 0x0370, 0x037c, 0x0384, 0x038e, - 0x0394, 0x0399, 0x03a1, 0x03a7, 0x03a7, 0x03ae, 0x03b6, 0x03bf, - 0x03c3, 0x03cb, 0x03d0, 0x03dc, 0x03dc, 0x03dc, 0x03e1, 0x03e6, - 0x03e6, 0x03ec, 0x03ec, 0x03f5, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - // Entry C0 - FF - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - // Entry 100 - 13F - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03fd, - 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, - 0x03fd, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, - 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, - 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, - 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, - // Entry 140 - 17F - 0x0407, 0x0407, 0x0407, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - // Entry 180 - 1BF - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, - 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x041b, - // Entry 1C0 - 1FF - 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, - 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, - 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, - 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, - 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, - 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, - 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, - 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, - // Entry 200 - 23F - 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, - 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, - 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0428, 0x0428, - 0x0428, 0x0428, 0x0428, 0x0428, 0x0428, 0x0428, 0x0428, 0x0428, - 0x0435, 0x0435, 0x0435, 0x0435, 0x0435, 0x0435, 0x0435, 0x0435, - 0x0435, 0x0435, 0x0435, 0x0435, 0x0435, 0x0435, 0x0448, 0x0448, - 0x0448, 0x0448, 0x0448, 0x0448, 0x0448, 0x0448, 0x0448, 0x044e, - 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, - // Entry 240 - 27F - 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, - 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, - 0x0462, 0x0474, 0x0489, 0x049b, 0x04ac, 0x04c1, 0x04dc, 0x04ef, - 0x04ef, 0x04ef, 0x0500, 0x050f, 0x050f, 0x0517, 0x0531, 0x0546, - 0x0546, 0x0546, 0x0546, 0x055b, 0x0572, - }, - }, - { // xog - "OluakaaniOluamharikiOluwarabuOlubelarusiOlubulugariyaOlubengaliOluceekeO" + - "ludaakiOluyonaaniOlungerezaOlusipanyaOluperusiOlufalansaOluhawuzaOlu" + - "hinduOluhangareOluyindonezyaOluyiboOluyitaleOlujapaniOlunnajjavaOluk" + - "meOlukoreyaOlumalayiOlubbamaOlunepaliOluholandiOlupunjabiOlupolandiO" + - "lupotugiiziOlulomaniyaOlulasaOlunarwandaOlusomaliyaOluswideniOlutami" + - "iruOluttaayiOlutakeOluyukurayineOlu-uruduOluvyetinaamuOluyorubaOluca" + - "yinaOluzzuluOlusoga", - []uint16{ // 576 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0014, 0x0014, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0028, 0x0035, - 0x0035, 0x0035, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, - 0x003f, 0x003f, 0x003f, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - 0x004f, 0x004f, 0x004f, 0x004f, 0x0059, 0x0063, 0x0063, 0x006d, - 0x006d, 0x006d, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0089, - 0x0089, 0x0091, 0x0091, 0x0091, 0x0091, 0x009b, 0x009b, 0x009b, - // Entry 40 - 7F - 0x009b, 0x00a8, 0x00a8, 0x00af, 0x00af, 0x00af, 0x00af, 0x00af, - 0x00b8, 0x00b8, 0x00c1, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, - 0x00cc, 0x00cc, 0x00d2, 0x00d2, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00e4, 0x00e4, 0x00ec, 0x00ec, 0x00ec, - 0x00f5, 0x00f5, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, - 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x0109, 0x0109, 0x0113, - // Entry 80 - BF - 0x0113, 0x011f, 0x011f, 0x011f, 0x011f, 0x012a, 0x0131, 0x013c, - 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, - 0x013c, 0x013c, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, - 0x0151, 0x0151, 0x015b, 0x015b, 0x015b, 0x0164, 0x0164, 0x0164, - 0x0164, 0x0164, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x0178, - 0x0181, 0x0181, 0x0181, 0x018e, 0x018e, 0x018e, 0x018e, 0x018e, - 0x018e, 0x0197, 0x0197, 0x01a0, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - // Entry C0 - FF - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - // Entry 100 - 13F - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - // Entry 140 - 17F - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - // Entry 180 - 1BF - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - // Entry 1C0 - 1FF - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - // Entry 200 - 23F - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01af, - }, - }, - { // yav - "akánɛamalíképakaspielúsebulgálɛpengálɛ́ɛcɛ́kɛ́ɛŋndiámanyavánɛíŋgilísénu" + - "ɛspanyɔ́lɛnupɛ́lisɛfeleŋsípakasíndíɔ́ŋgɛíndonísiɛíboitáliɛndiámanyá" + - "vanɛkímɛɛkolíemáliɛbímanɛnunipálɛnilándɛnupunsapíɛ́nupolonɛ́ɛnupɔlit" + - "ukɛ́ɛnulumɛ́ŋɛnulúsenuluándɛ́ɛnusomalíɛnusuetuanutámulenutáyɛnutúluk" + - "enukeleniɛ́ŋɛnulutúnufiɛtnamíɛŋnuyolúpasinúɛnusulúnuasue", - []uint16{ // 579 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x000f, 0x000f, - 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x001e, 0x0027, - 0x0027, 0x0027, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x004a, 0x004a, 0x004a, 0x004a, 0x0052, 0x005e, 0x005e, 0x006e, - 0x006e, 0x006e, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x0083, - 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, 0x0088, - 0x0088, 0x008e, 0x008e, 0x008e, 0x008e, 0x0097, 0x0097, 0x0097, - // Entry 40 - 7F - 0x0097, 0x00a3, 0x00a3, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, - 0x00af, 0x00af, 0x00b7, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00bf, 0x00bf, 0x00c7, 0x00c7, 0x00cd, 0x00cd, 0x00cd, 0x00cd, - 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, - 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, - 0x00cd, 0x00cd, 0x00cd, 0x00d4, 0x00d4, 0x00dc, 0x00dc, 0x00dc, - 0x00e6, 0x00e6, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, - 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00fd, 0x00fd, 0x010a, - // Entry 80 - BF - 0x010a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0127, 0x012e, 0x013c, - 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, - 0x013c, 0x013c, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, - 0x014f, 0x014f, 0x0158, 0x0158, 0x0158, 0x0160, 0x0160, 0x0160, - 0x0160, 0x0160, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0179, - 0x0180, 0x0180, 0x0180, 0x0190, 0x0190, 0x0190, 0x0190, 0x0190, - 0x0190, 0x0199, 0x0199, 0x01a0, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - // Entry C0 - FF - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - // Entry 100 - 13F - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - // Entry 140 - 17F - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - // Entry 180 - 1BF - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - // Entry 1C0 - 1FF - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - // Entry 200 - 23F - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - // Entry 240 - 27F - 0x01a7, 0x01a7, 0x01ad, - }, - }, - { // yi - "אַפֿאַראַפֿריקאַנסאַמהאַרישאַראַגאנישאַראַבישאַסאַמישאַזערביידזשאַנישבעל" + - "אַרוסישבולגאַרישבענגאַלישטיבעטישברעטאנישבאסנישקאַטאַלאנישטשעכישקלוי" + - "סטער־סלאַווישוועלשישדענישדײַטשגריכישענגלישעספּעראַנטאשפּאַנישעסטישב" + - "אַסקישפּערסישפֿינישפֿידזשיפֿאַראישפֿראַנצויזישמערב־פֿריזישאירישסקאט" + - "יש געלישגאַלישישמאַנקסהאַוסאַהעברעאישהינדיקראאַטישאונגערישאַרמענישא" + - "ינדאנעזישאידאאיסלאַנדישאיטאַליענישיאַפּאַנישיאַוואַנעזישגרוזינישקאַ" + - "זאַכישכמערקאַנאַדאַקארעאישקורדישקארנישקירגיזישלאטיינישלוקסעמבורגישל" + - "אַאליטווישלעטישמאַארישמאַקעדאנישמאַלאַיאַלאַםמאנגאלישמאַלטעזישבירמא" + - "ַנישנעפּאַלישהאלענדישנײַ־נארוועגישנארוועגישאקסיטאַנישאסעטישפּוילישפ" + - "ּאַשטאָפּארטוגעזישרומענישרוסישסאַנסקריטסאַרדישסינדהינארדסאַמישסינהא" + - "ַלישסלאוואַקישסלאווענישסאַמאאַניששאנאַסאמאַלישאַלבאַנישסערביששוועדי" + - "שסוואַהילישטאַמילטורקמענישטאָטערישאוקראַאינישאורדואוזבעקישוויעטנאַמ" + - "עזישוואלאַפּוקייִדישכינעזישזולואַקאַדישאַלט ענגלישאַראַמישבאַלינעזי" + - "שבײַערישסעבואַנישקרים־טערקישקאַשובישאונטער־סארבישזשאלא־פֿאנימיטל ענ" + - "גלישפֿיליפּינאאַלט־פֿראַנצויזישדרום־פֿריזישמזרח־פֿריזישמיטל הויכדוי" + - "טשאַלט־ הויכדויטשגאטישאוראַלט־גריכישפידזשי הינדיאייבער־סארבישלאזשבא" + - "ָןיידיש־פערסישלאַדינאליווישמיזאנאַפּאליטַנישנידערדײַטשאַלט פּערסישפ" + - "ּרייסישרוסינישסיציליאַנישסקאטסאַלט־אירישאונטער שלעזישslyסומערישקאמא" + - "ריששלעזישטיגרעאומבאַוואוסטע שפּראַךמערב פֿלעמישפֿלעמישסערבא־קראאַטי" + - "שקאנגא־סוואַהיליש", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x000e, 0x000e, 0x000e, 0x0024, 0x0024, 0x0036, 0x004a, - 0x005a, 0x006a, 0x006a, 0x006a, 0x008a, 0x008a, 0x009e, 0x00b0, - 0x00b0, 0x00b0, 0x00c2, 0x00d0, 0x00e0, 0x00ec, 0x0102, 0x0102, - 0x0102, 0x0102, 0x0102, 0x010e, 0x0130, 0x0130, 0x013e, 0x0148, - 0x0152, 0x0152, 0x0152, 0x0152, 0x015e, 0x016a, 0x0180, 0x0190, - 0x019a, 0x01a8, 0x01b6, 0x01b6, 0x01c2, 0x01d0, 0x01e0, 0x01f8, - 0x0210, 0x021a, 0x0231, 0x0241, 0x0241, 0x0241, 0x024d, 0x025b, - 0x026b, 0x0275, 0x0275, 0x0285, 0x0285, 0x0295, 0x02a5, 0x02a5, - // Entry 40 - 7F - 0x02a5, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02c1, 0x02d5, - 0x02eb, 0x02eb, 0x02ff, 0x0317, 0x0327, 0x0327, 0x0327, 0x0327, - 0x0339, 0x0339, 0x0341, 0x0353, 0x0361, 0x0361, 0x0361, 0x036d, - 0x036d, 0x0379, 0x0389, 0x0399, 0x03b1, 0x03b1, 0x03b1, 0x03b1, - 0x03b9, 0x03c7, 0x03c7, 0x03d1, 0x03d1, 0x03d1, 0x03df, 0x03f3, - 0x040d, 0x041d, 0x041d, 0x041d, 0x042f, 0x0441, 0x0441, 0x0441, - 0x0453, 0x0453, 0x0463, 0x047d, 0x048f, 0x048f, 0x048f, 0x048f, - 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04af, 0x04af, 0x04af, 0x04bd, - // Entry 80 - BF - 0x04cd, 0x04e3, 0x04e3, 0x04e3, 0x04e3, 0x04f1, 0x04fb, 0x04fb, - 0x050d, 0x051b, 0x0527, 0x053b, 0x053b, 0x054d, 0x0561, 0x0573, - 0x0587, 0x0591, 0x05a1, 0x05b3, 0x05bf, 0x05bf, 0x05bf, 0x05bf, - 0x05cd, 0x05e1, 0x05ed, 0x05ed, 0x05ed, 0x05ed, 0x05ed, 0x05ff, - 0x05ff, 0x05ff, 0x05ff, 0x05ff, 0x060f, 0x060f, 0x060f, 0x0625, - 0x062f, 0x063f, 0x063f, 0x0659, 0x066d, 0x066d, 0x066d, 0x066d, - 0x0679, 0x0679, 0x0679, 0x0687, 0x068f, 0x068f, 0x068f, 0x068f, - 0x068f, 0x068f, 0x068f, 0x068f, 0x068f, 0x069f, 0x069f, 0x069f, - // Entry C0 - FF - 0x069f, 0x069f, 0x06b4, 0x06b4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, - 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, - 0x06c4, 0x06c4, 0x06c4, 0x06d8, 0x06e6, 0x06e6, 0x06e6, 0x06e6, - 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, - 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, - 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, - 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06f8, 0x06f8, 0x06f8, - 0x06f8, 0x06f8, 0x06f8, 0x06f8, 0x06f8, 0x06f8, 0x06f8, 0x06f8, - // Entry 100 - 13F - 0x06f8, 0x06f8, 0x06f8, 0x070e, 0x070e, 0x071e, 0x071e, 0x071e, - 0x071e, 0x071e, 0x071e, 0x071e, 0x071e, 0x071e, 0x071e, 0x0738, - 0x0738, 0x0738, 0x0738, 0x074e, 0x074e, 0x074e, 0x074e, 0x074e, - 0x074e, 0x074e, 0x074e, 0x074e, 0x0763, 0x0763, 0x0763, 0x0763, - 0x0763, 0x0777, 0x0777, 0x0777, 0x0777, 0x0777, 0x0799, 0x0799, - 0x07b1, 0x07c9, 0x07c9, 0x07c9, 0x07c9, 0x07c9, 0x07c9, 0x07c9, - 0x07c9, 0x07c9, 0x07c9, 0x07c9, 0x07e4, 0x0801, 0x0801, 0x0801, - 0x0801, 0x080b, 0x080b, 0x0827, 0x0827, 0x0827, 0x0827, 0x0827, - // Entry 140 - 17F - 0x0827, 0x0827, 0x0827, 0x0827, 0x083e, 0x083e, 0x083e, 0x083e, - 0x0858, 0x0858, 0x0858, 0x0858, 0x0858, 0x0858, 0x0858, 0x0858, - 0x0858, 0x0868, 0x0868, 0x0868, 0x0880, 0x0880, 0x0880, 0x0880, - 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, - 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, - 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, - 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, - 0x0880, 0x0880, 0x0880, 0x088e, 0x088e, 0x088e, 0x088e, 0x088e, - // Entry 180 - 1BF - 0x088e, 0x088e, 0x089a, 0x089a, 0x089a, 0x089a, 0x089a, 0x089a, - 0x089a, 0x089a, 0x089a, 0x089a, 0x089a, 0x08a2, 0x08a2, 0x08a2, - 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, - 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, - 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, - 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, - 0x08a2, 0x08a2, 0x08bc, 0x08bc, 0x08d0, 0x08d0, 0x08d0, 0x08d0, - 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, - // Entry 1C0 - 1FF - 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, - 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, - 0x08d0, 0x08e7, 0x08e7, 0x08e7, 0x08e7, 0x08e7, 0x08e7, 0x08f7, - 0x08f7, 0x08f7, 0x08f7, 0x08f7, 0x08f7, 0x08f7, 0x08f7, 0x08f7, - 0x08f7, 0x08f7, 0x08f7, 0x0905, 0x0905, 0x0905, 0x0905, 0x0905, - 0x0905, 0x0905, 0x0905, 0x0905, 0x0905, 0x0905, 0x0905, 0x0905, - 0x091b, 0x0925, 0x0925, 0x0925, 0x0925, 0x0925, 0x0925, 0x0925, - 0x0925, 0x0939, 0x0939, 0x0939, 0x0939, 0x0939, 0x0939, 0x0952, - // Entry 200 - 23F - 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, - 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0963, 0x0971, 0x0971, - 0x0971, 0x097d, 0x097d, 0x097d, 0x097d, 0x097d, 0x097d, 0x0987, - 0x0987, 0x0987, 0x0987, 0x0987, 0x0987, 0x0987, 0x0987, 0x0987, - 0x0987, 0x0987, 0x0987, 0x0987, 0x0987, 0x0987, 0x0987, 0x0987, - 0x0987, 0x0987, 0x0987, 0x0987, 0x0987, 0x0987, 0x09b0, 0x09b0, - 0x09b0, 0x09b0, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, - 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, - // Entry 240 - 27F - 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, - 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, - 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, - 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09c7, 0x09d5, 0x09d5, 0x09d5, - 0x09d5, 0x09f1, 0x0a11, - }, - }, - { // yo - "Èdè AfrikaniÈdè AkaniÈdè AmarikiÈdè ArabikiTi AssamÈdè AzerbaijaniÈdè Be" + - "larusiÈdè BugariaÈdè BengaliÈdè BretoniÈdè BosniaÈdè CatalaÈdè seeki" + - "Èdè WelshiÈdè Ilẹ̀ DenmarkÈdè Ilẹ̀ GemaniÈdè GirikiÈdè Gẹ̀ẹ́sìÈdè E" + - "sperantoÈdè SipanisiÈdè EstoniaÈdè BaskiÈdè PasiaÈdè FinisiÈdè Faroe" + - "siÈdè FaranséÈdè FrisiaÈdè IrelandÈdè Gaelik ti Ilu ScotlandÈdè Gali" + - "ciaÈdè GuaraniÈdè GujaratiÈdè HausaÈdè HeberuÈdè HindiÈdè KroatiaÈdè" + - " HungariaÈdè Ile ArmeniaÈdè pipoÈdè IndonasiaIru ÈdèÈdè IboÈdè Icela" + - "ndicÈdè ItalianiÈdè JapanisiÈdè JavanasiÈdè GeorgiaÈdè kameriÈdè Kan" + - "nadaÈdè KoriaÈdè LatiniÈdè LithuaniaÈdè LatvianuÈdè MacedoniaÈdè mar" + - "athiÈdè MalayaÈdè MaltaÈdè BumiisiÈdè NepaliÈdè DukiÈdè NorwayÈdè Oc" + - "citaniÈdè PunjabiÈdè Ilẹ̀ PolandiÈdè PọtugiÈdè RomaniaÈdè ̣RọọsiaÈdè" + - " RuwandaÈdè awon ara IndoÈdè SindhiÈdè SinhaleseÈdè SlovakiÈdè Slove" + - "niaÈdè ara SomaliaÈdè AlbaniaÈdè SerbiaÈdè SesotoÈdè SudaniÈdè Suwid" + - "iisiÈdè SwahiliÈdè TamiliÈdè TeluguÈdè TaiÈdè TigrinyaÈdè TurkmenÈdè" + - " TọọkisiÈdè UkaniaÈdè UduÈdè UzbekÈdè JetinamuÈdè XhosaÈdè YiddishiÈ" + - "dè YorùbáÈdè MandariÈdè ṢuluÈdè TagalogiÈdè KlingoniÈdè Serbo-Croati" + - "ani", - []uint16{ // 610 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x0019, 0x0026, 0x0026, - 0x0033, 0x003b, 0x003b, 0x003b, 0x004c, 0x004c, 0x005a, 0x0067, - 0x0067, 0x0067, 0x0074, 0x0074, 0x0081, 0x008d, 0x0099, 0x0099, - 0x0099, 0x0099, 0x0099, 0x00a4, 0x00a4, 0x00a4, 0x00b0, 0x00c5, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00e5, 0x00f9, 0x0108, 0x0116, - 0x0123, 0x012e, 0x0139, 0x0139, 0x0145, 0x0145, 0x0152, 0x0160, - 0x016c, 0x0179, 0x0195, 0x01a2, 0x01af, 0x01bd, 0x01bd, 0x01c8, - 0x01d4, 0x01df, 0x01df, 0x01ec, 0x01ec, 0x01fa, 0x020b, 0x020b, - // Entry 40 - 7F - 0x0215, 0x0224, 0x022d, 0x0236, 0x0236, 0x0236, 0x0236, 0x0245, - 0x0253, 0x0253, 0x0261, 0x026f, 0x027c, 0x027c, 0x027c, 0x027c, - 0x027c, 0x027c, 0x0288, 0x0295, 0x02a0, 0x02a0, 0x02a0, 0x02a0, - 0x02a0, 0x02a0, 0x02a0, 0x02ac, 0x02ac, 0x02ac, 0x02ac, 0x02ac, - 0x02ac, 0x02bb, 0x02bb, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02d8, - 0x02d8, 0x02d8, 0x02e5, 0x02f1, 0x02fc, 0x0309, 0x0309, 0x0309, - 0x0315, 0x0315, 0x031f, 0x031f, 0x032b, 0x032b, 0x032b, 0x032b, - 0x0339, 0x0339, 0x0339, 0x0339, 0x0339, 0x0346, 0x0346, 0x035b, - // Entry 80 - BF - 0x035b, 0x0369, 0x0369, 0x0369, 0x0369, 0x0376, 0x0388, 0x0395, - 0x03a8, 0x03a8, 0x03b4, 0x03b4, 0x03b4, 0x03c3, 0x03d0, 0x03de, - 0x03de, 0x03de, 0x03ef, 0x03fc, 0x0408, 0x0408, 0x0414, 0x0420, - 0x042f, 0x043c, 0x0448, 0x0454, 0x0454, 0x045d, 0x046b, 0x0478, - 0x0478, 0x0478, 0x0489, 0x0489, 0x0489, 0x0489, 0x0489, 0x0495, - 0x049e, 0x04a9, 0x04a9, 0x04b7, 0x04b7, 0x04b7, 0x04b7, 0x04c2, - 0x04d0, 0x04de, 0x04de, 0x04eb, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - // Entry C0 - FF - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - // Entry 100 - 13F - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, - 0x04f7, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - // Entry 140 - 17F - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - // Entry 180 - 1BF - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - // Entry 1C0 - 1FF - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - // Entry 200 - 23F - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, - 0x0505, 0x0505, 0x0505, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, - 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, - 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, - 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, - 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, - // Entry 240 - 27F - 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, - 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, - 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, - 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, - 0x0513, 0x0528, - }, - }, - { // yo-BJ - "Èdè Ilɛ̀ DenmarkÈdè Ilɛ̀ GemaniÈdè Gɛ̀ɛ́sìÈdè Ilɛ̀ PolandiÈdè PɔtugiÈdè " + - "̣RɔɔsiaÈdè TɔɔkisiÈdè Shulu", - []uint16{ // 181 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - // Entry 40 - 7F - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x004d, - // Entry 80 - BF - 0x004d, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x006a, 0x006a, - 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, - 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, - 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, - 0x006a, 0x006a, 0x0079, 0x0079, 0x0079, 0x0079, 0x0079, 0x0079, - 0x0079, 0x0079, 0x0079, 0x0079, 0x0079, 0x0079, 0x0079, 0x0079, - 0x0079, 0x0079, 0x0079, 0x0079, 0x0084, - }, - }, - { // yue - "阿法文阿布哈茲文阿緯斯陀文南非荷蘭文阿坎文阿姆哈拉文阿拉貢文阿拉伯文阿薩姆文阿瓦爾文艾馬拉文亞塞拜然文巴什客爾文白俄羅斯文保加利亞文比斯拉馬文班" + - "巴拉文孟加拉文藏文布列塔尼文波士尼亞文加泰羅尼亞文車臣文查莫洛文科西嘉文克裡文捷克文宗教斯拉夫文楚瓦什文威爾斯文丹麥文德文迪維西文宗" + - "卡文埃維文希臘文英文世界文西班牙文愛沙尼亞文巴斯克文波斯文富拉文芬蘭文斐濟文法羅文法文西弗里西亞文愛爾蘭文蘇格蘭蓋爾文加利西亞文瓜拉" + - "尼文古吉拉特文曼島文豪撒文希伯來文北印度文西里莫圖土文克羅埃西亞文海地文匈牙利文亞美尼亞文赫雷羅文國際文印尼文國際文(E)伊布文四川" + - "彝文依奴皮維克文伊多文冰島文義大利文因紐特文日文爪哇文喬治亞文剛果文吉庫尤文廣亞馬文哈薩克文格陵蘭文高棉文坎那達文韓文卡努裡文喀什米" + - "爾文庫爾德文科米文康瓦耳文吉爾吉斯文拉丁文盧森堡文干達文林堡文林加拉文寮文立陶宛文魯巴加丹加文拉脫維亞文馬拉加什文馬紹爾文毛利文馬其" + - "頓文馬來亞拉姆文蒙古文馬拉地文馬來文馬爾他文緬甸文諾魯文北地畢列文尼泊爾文恩東加文荷蘭文耐諾斯克挪威文巴克摩挪威文南地畢列文納瓦霍文" + - "尼揚賈文奧克西坦文奧杰布瓦文奧羅莫文歐利亞文奧塞提文旁遮普文巴利文波蘭文普什圖文葡萄牙文蓋楚瓦文羅曼斯文隆迪文羅馬尼亞文俄文盧安達文" + - "梵文撒丁文信德文北方薩米文桑戈文僧伽羅文斯洛伐克文斯洛維尼亞文薩摩亞文塞內加爾文索馬利文阿爾巴尼亞文塞爾維亞文斯瓦特文塞索托文巽他文" + - "瑞典文史瓦希里文坦米爾文泰盧固文塔吉克文泰文提格利尼亞文土庫曼文突尼西亞文東加文土耳其文特松加文韃靼文大溪地文維吾爾文烏克蘭文烏都文" + - "烏茲別克文溫達文越南文沃拉普克文瓦隆文沃洛夫文科薩文意第緒文約魯巴文壯文中文祖魯文亞齊文阿僑利文阿當莫文阿迪各文突尼斯阿拉伯文阿弗里" + - "希利文亞罕文阿伊努文阿卡德文阿拉巴馬文阿留申文蓋格阿爾巴尼亞文南阿爾泰文古英文昂加文阿拉米文馬普切文阿拉奧納文阿拉帕霍文阿爾及利亞阿" + - "拉伯文阿拉瓦克文摩洛哥阿拉伯文埃及阿拉伯文阿蘇文美國手語阿斯圖里亞文科塔瓦文阿瓦文俾路支文峇里文巴伐利亞文巴薩文巴姆穆文巴塔克托巴文" + - "戈馬拉文貝扎文別姆巴文貝塔維文貝納文富特文巴達加文西俾路支文博傑普爾文比科爾文比尼文班亞爾文康姆文錫克錫卡文比什奴普萊利亞文巴赫蒂亞" + - "里文布拉杰文布拉維文博多文阿庫色文布里阿特文布吉斯文布魯文比林文梅敦巴文卡多文加勒比文卡尤加文阿燦文宿霧文奇加文奇布查文查加文處奇斯" + - "文馬里文契奴克文喬克托文奇佩瓦揚文柴羅基文沙伊安文索拉尼庫爾德文科普特文卡皮茲文克里米亞半島的土耳其文;克里米亞半島的塔塔爾文法語克" + - "里奧爾混合語卡舒布文達科他文達爾格瓦文台塔文德拉瓦文斯拉夫多格里布文丁卡文扎爾馬文多格來文下索布文中部杜順文杜亞拉文中古荷蘭文朱拉文" + - "迪尤拉文達薩文恩布文埃菲克文埃米利安文古埃及文艾卡朱克文埃蘭文中古英文中尤皮克文依汪都文埃斯特雷馬杜拉文芳族文菲律賓文托爾訥芬蘭文豐" + - "文卡真法文中古法文古法文法蘭克-普羅旺斯文北弗里西亞文東弗里西亞文弗留利文加族文加告茲文贛語加約文葛巴亞文索羅亞斯德教達里文吉茲文吉" + - "爾伯特群島文吉拉基文中古高地德文古高地日耳曼文孔卡尼文岡德文科隆達羅文哥德文格列博文古希臘文德文(瑞士)瓦尤文弗拉弗拉文古西文圭契文" + - "海達文客家話夏威夷文斐濟印地文希利蓋農文赫梯文孟文上索布文湘語胡帕文伊班文伊比比奧文伊洛闊文印古什文英格裏亞文牙買加克裏奧爾英文邏輯" + - "文恩格姆巴文馬恰美文猶太教-波斯文猶太阿拉伯文日德蘭文卡拉卡爾帕克文卡比爾文卡琴文卡捷文卡姆巴文卡威文卡巴爾達文卡念布文卡塔布文馬孔" + - "德文卡布威爾第文肯揚文科羅文坎剛文卡西文和闐文西桑海文科瓦文北紮紮其文卡庫文卡倫金文金邦杜文科米-彼爾米亞克文貢根文科斯雷恩文克佩列" + - "文卡拉柴-包爾卡爾文塞拉利昂克裏奧爾文基那來阿文卡累利阿文庫魯科文尚巴拉文巴菲亞文科隆文庫密克文庫特奈文拉迪諾文朗吉文拉亨達文蘭巴文" + - "列茲干文新共同語言利古里亞文利伏尼亞文拉科塔文倫巴底文芒戈文洛齊文北盧爾文拉特加萊文魯巴魯魯亞文路易塞諾文盧恩達文盧奧文盧晒文盧雅文" + - "文言文拉茲文馬都拉文馬法文馬加伊文邁蒂利文望加錫文曼丁哥文馬賽文馬巴文莫克沙文曼達文門德文梅魯文克里奧文(模里西斯)中古愛爾蘭文馬夸" + - "文美塔文米克馬克文米南卡堡文滿族文曼尼普裡文莫霍克文莫西文西馬裏文蒙當文多種語言克里克文米蘭德斯文馬爾尼裡文明打威文姆耶內文厄爾茲亞" + - "文馬贊德蘭文閩南語拿波里文納馬文低地德文尼瓦爾文尼亞斯文紐埃文阿沃那加文夸西奧文恩甘澎文諾蓋文古諾爾斯文諾維亞文曼德文字 (N’Ko" + - ")北索托文努埃爾文古尼瓦爾文尼揚韋齊文尼揚科萊文尼奧囉文尼茲馬文歐塞奇文鄂圖曼土耳其文潘加辛文巴列維文潘帕嘉文帕皮阿門托文帛琉文庇卡底文" + - "尼日利亞皮欽語賓夕法尼亞德文門諾低地德文古波斯文普法爾茨德文腓尼基文皮埃蒙特文旁狄希臘文波那貝文普魯士文古普羅旺斯文基切文欽博拉索海" + - "蘭蓋丘亞文拉賈斯坦諸文復活島文拉羅通加文羅馬格諾里文里菲亞諾文蘭博文吉普賽文羅圖馬島文盧森尼亞文羅維阿納文羅馬尼亞語系羅瓦文桑達韋文" + - "雅庫特文薩瑪利亞阿拉姆文薩布魯文撒撒克文散塔利文索拉什特拉文甘拜文桑古文西西里文蘇格蘭文薩丁尼亞-薩薩里文南庫爾德文塞訥卡文賽納文瑟" + - "里文瑟爾卡普文東桑海文古愛爾蘭文薩莫吉希亞文希爾哈文撣文阿拉伯文(查德)希達摩文下西利西亞文塞拉亞文南薩米文魯勒薩米文伊納裡薩米文斯" + - "科特薩米文索尼基文索格底亞納文蘇拉南東墎文塞雷爾文薩霍文沙特菲士蘭文蘇庫馬文蘇蘇文蘇美文葛摩文古敘利亞文敘利亞文西利西亞文圖盧文提姆" + - "文特索文泰雷諾文泰頓文蒂格雷文提夫文托克勞文查庫爾文克林貢文特林基特文塔里什文塔馬奇克文東加文(尼亞薩)托比辛文圖羅尤文太魯閣文特薩" + - "克尼恩文欽西安文穆斯林塔特文圖姆布卡文吐瓦魯文北桑海文土凡文塔馬齊格特文沃蒂艾克文烏加列文姆本杜文根語言瓦伊文威尼斯文維普森文西佛蘭" + - "德文美茵-法蘭克尼亞文沃提克文佛羅文溫舊文瓦瑟文瓦拉莫文瓦瑞文瓦紹文沃皮瑞文吳語卡爾梅克文明格列爾文索加文瑤文雅浦文洋卞文耶姆巴文奈" + - "恩加圖文粵語薩波特克文布列斯符號西蘭文澤納加文標準摩洛哥塔馬塞特文祖尼文無語言內容扎扎文現代標準阿拉伯文高地德文(瑞士)低地薩克遜文" + - "佛蘭芒文摩爾多瓦文塞爾維亞克羅埃西亞文史瓦希里文(剛果)簡體中文繁體中文", - []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0018, 0x0027, 0x0036, 0x003f, 0x004e, 0x005a, - 0x0066, 0x0072, 0x007e, 0x008a, 0x0099, 0x00a8, 0x00b7, 0x00c6, - 0x00d5, 0x00e1, 0x00ed, 0x00f3, 0x0102, 0x0111, 0x0123, 0x012c, - 0x0138, 0x0144, 0x014d, 0x0156, 0x0168, 0x0174, 0x0180, 0x0189, - 0x018f, 0x019b, 0x01a4, 0x01ad, 0x01b6, 0x01bc, 0x01c5, 0x01d1, - 0x01e0, 0x01ec, 0x01f5, 0x01fe, 0x0207, 0x0210, 0x0219, 0x021f, - 0x0231, 0x023d, 0x024f, 0x025e, 0x026a, 0x0279, 0x0282, 0x028b, - 0x0297, 0x02a3, 0x02b5, 0x02c7, 0x02d0, 0x02dc, 0x02eb, 0x02f7, - // Entry 40 - 7F - 0x0300, 0x0309, 0x0319, 0x0322, 0x032e, 0x0340, 0x0349, 0x0352, - 0x035e, 0x036a, 0x0370, 0x0379, 0x0385, 0x038e, 0x039a, 0x03a6, - 0x03b2, 0x03be, 0x03c7, 0x03d3, 0x03d9, 0x03e5, 0x03f4, 0x0400, - 0x0409, 0x0415, 0x0424, 0x042d, 0x0439, 0x0442, 0x044b, 0x0457, - 0x045d, 0x0469, 0x047b, 0x048a, 0x0499, 0x04a5, 0x04ae, 0x04ba, - 0x04cc, 0x04d5, 0x04e1, 0x04ea, 0x04f6, 0x04ff, 0x0508, 0x0517, - 0x0523, 0x052f, 0x0538, 0x054d, 0x055f, 0x056e, 0x057a, 0x0586, - 0x0595, 0x05a4, 0x05b0, 0x05bc, 0x05c8, 0x05d4, 0x05dd, 0x05e6, - // Entry 80 - BF - 0x05f2, 0x05fe, 0x060a, 0x0616, 0x061f, 0x062e, 0x0634, 0x0640, - 0x0646, 0x064f, 0x0658, 0x0667, 0x0670, 0x067c, 0x068b, 0x069d, - 0x06a9, 0x06b8, 0x06c4, 0x06d6, 0x06e5, 0x06f1, 0x06fd, 0x0706, - 0x070f, 0x071e, 0x072a, 0x0736, 0x0742, 0x0748, 0x075a, 0x0766, - 0x0775, 0x077e, 0x078a, 0x0796, 0x079f, 0x07ab, 0x07b7, 0x07c3, - 0x07cc, 0x07db, 0x07e4, 0x07ed, 0x07fc, 0x0805, 0x0811, 0x081a, - 0x0826, 0x0832, 0x0838, 0x083e, 0x0847, 0x0850, 0x085c, 0x0868, - 0x0874, 0x0889, 0x089b, 0x08a4, 0x08b0, 0x08bc, 0x08cb, 0x08d7, - // Entry C0 - FF - 0x08ef, 0x08fe, 0x0907, 0x0910, 0x091c, 0x0928, 0x0937, 0x0946, - 0x0961, 0x0961, 0x0970, 0x0985, 0x0997, 0x09a0, 0x09ac, 0x09be, - 0x09ca, 0x09d3, 0x09df, 0x09e8, 0x09f7, 0x0a00, 0x0a0c, 0x0a1e, - 0x0a2a, 0x0a33, 0x0a3f, 0x0a4b, 0x0a54, 0x0a5d, 0x0a69, 0x0a78, - 0x0a87, 0x0a93, 0x0a9c, 0x0aa8, 0x0ab1, 0x0ac0, 0x0ad8, 0x0aea, - 0x0af6, 0x0b02, 0x0b0b, 0x0b17, 0x0b26, 0x0b32, 0x0b3b, 0x0b44, - 0x0b50, 0x0b59, 0x0b65, 0x0b71, 0x0b7a, 0x0b83, 0x0b8c, 0x0b98, - 0x0ba1, 0x0bad, 0x0bb6, 0x0bc2, 0x0bce, 0x0bdd, 0x0be9, 0x0bf5, - // Entry 100 - 13F - 0x0c0a, 0x0c16, 0x0c22, 0x0c67, 0x0c82, 0x0c8e, 0x0c9a, 0x0ca9, - 0x0cb2, 0x0cbe, 0x0cc7, 0x0cd6, 0x0cdf, 0x0ceb, 0x0cf7, 0x0d03, - 0x0d12, 0x0d1e, 0x0d2d, 0x0d36, 0x0d42, 0x0d4b, 0x0d54, 0x0d60, - 0x0d6f, 0x0d7b, 0x0d8a, 0x0d93, 0x0d9f, 0x0dae, 0x0dba, 0x0dd2, - 0x0ddb, 0x0de7, 0x0df9, 0x0dff, 0x0e0b, 0x0e17, 0x0e20, 0x0e39, - 0x0e4b, 0x0e5d, 0x0e69, 0x0e72, 0x0e7e, 0x0e84, 0x0e8d, 0x0e99, - 0x0eb4, 0x0ebd, 0x0ed2, 0x0ede, 0x0ef0, 0x0f05, 0x0f11, 0x0f1a, - 0x0f29, 0x0f32, 0x0f3e, 0x0f4a, 0x0f5c, 0x0f65, 0x0f74, 0x0f7d, - // Entry 140 - 17F - 0x0f86, 0x0f8f, 0x0f98, 0x0fa4, 0x0fb3, 0x0fc2, 0x0fcb, 0x0fd1, - 0x0fdd, 0x0fe3, 0x0fec, 0x0ff5, 0x1004, 0x1010, 0x101c, 0x102b, - 0x1046, 0x104f, 0x105e, 0x106a, 0x107d, 0x108f, 0x109b, 0x10b0, - 0x10bc, 0x10c5, 0x10ce, 0x10da, 0x10e3, 0x10f2, 0x10fe, 0x110a, - 0x1116, 0x1128, 0x1131, 0x113a, 0x1143, 0x114c, 0x1155, 0x1161, - 0x116a, 0x1179, 0x1182, 0x118e, 0x119a, 0x11b3, 0x11bc, 0x11cb, - 0x11d7, 0x11f0, 0x120b, 0x121a, 0x1229, 0x1235, 0x1241, 0x124d, - 0x1256, 0x1262, 0x126e, 0x127a, 0x1283, 0x128f, 0x1298, 0x12a4, - // Entry 180 - 1BF - 0x12b3, 0x12c2, 0x12d1, 0x12dd, 0x12e9, 0x12f2, 0x12fb, 0x1307, - 0x1316, 0x1328, 0x1337, 0x1343, 0x134c, 0x1355, 0x135e, 0x1367, - 0x1370, 0x137c, 0x1385, 0x1391, 0x139d, 0x13a9, 0x13b5, 0x13be, - 0x13c7, 0x13d3, 0x13dc, 0x13e5, 0x13ee, 0x140c, 0x141e, 0x1427, - 0x1430, 0x143f, 0x144e, 0x1457, 0x1466, 0x1472, 0x147b, 0x1487, - 0x1490, 0x149c, 0x14a8, 0x14b7, 0x14c6, 0x14d2, 0x14de, 0x14ed, - 0x14fc, 0x1505, 0x1511, 0x151a, 0x1526, 0x1532, 0x153e, 0x1547, - 0x1556, 0x1562, 0x156e, 0x1577, 0x1586, 0x1592, 0x15a7, 0x15b3, - // Entry 1C0 - 1FF - 0x15bf, 0x15ce, 0x15dd, 0x15ec, 0x15f8, 0x1604, 0x1610, 0x1625, - 0x1631, 0x163d, 0x1649, 0x165b, 0x1664, 0x1670, 0x1685, 0x169a, - 0x16ac, 0x16b8, 0x16ca, 0x16d6, 0x16e5, 0x16f4, 0x1700, 0x170c, - 0x171e, 0x1727, 0x1745, 0x1757, 0x1763, 0x1772, 0x1784, 0x1793, - 0x179c, 0x17a8, 0x17b7, 0x17c6, 0x17d5, 0x17e7, 0x17f0, 0x17fc, - 0x1808, 0x1820, 0x182c, 0x1838, 0x1844, 0x1856, 0x185f, 0x1868, - 0x1874, 0x1880, 0x1899, 0x18a8, 0x18b4, 0x18bd, 0x18c6, 0x18d5, - 0x18e1, 0x18f0, 0x1902, 0x190e, 0x1914, 0x192c, 0x1938, 0x194a, - // Entry 200 - 23F - 0x1956, 0x1962, 0x1971, 0x1983, 0x1995, 0x19a1, 0x19b3, 0x19c5, - 0x19d1, 0x19da, 0x19ec, 0x19f8, 0x1a01, 0x1a0a, 0x1a13, 0x1a22, - 0x1a2e, 0x1a3d, 0x1a46, 0x1a4f, 0x1a58, 0x1a64, 0x1a6d, 0x1a79, - 0x1a82, 0x1a8e, 0x1a9a, 0x1aa6, 0x1ab5, 0x1ac1, 0x1ad0, 0x1ae8, - 0x1af4, 0x1b00, 0x1b0c, 0x1b1e, 0x1b2a, 0x1b3c, 0x1b4b, 0x1b57, - 0x1b63, 0x1b6c, 0x1b7e, 0x1b8d, 0x1b99, 0x1ba5, 0x1bae, 0x1bb7, - 0x1bc3, 0x1bcf, 0x1bde, 0x1bf7, 0x1c03, 0x1c0c, 0x1c15, 0x1c1e, - 0x1c2a, 0x1c33, 0x1c3c, 0x1c48, 0x1c4e, 0x1c5d, 0x1c6c, 0x1c75, - // Entry 240 - 27F - 0x1c7b, 0x1c84, 0x1c8d, 0x1c99, 0x1ca8, 0x1cae, 0x1cbd, 0x1ccc, - 0x1cd5, 0x1ce1, 0x1cff, 0x1d08, 0x1d17, 0x1d20, 0x1d38, 0x1d38, - 0x1d38, 0x1d50, 0x1d50, 0x1d50, 0x1d50, 0x1d50, 0x1d50, 0x1d50, - 0x1d50, 0x1d50, 0x1d50, 0x1d50, 0x1d62, 0x1d6e, 0x1d6e, 0x1d6e, - 0x1d7d, 0x1d9b, 0x1db6, 0x1dc2, 0x1dce, - }, - }, - { // zgh - "ⵜⴰⴽⴰⵏⵜⵜⴰⵎⵀⴰⵔⵉⵜⵜⴰⵄⵔⴰⴱⵜⵜⴰⴱⵉⵍⴰⵔⵓⵙⵜⵜⴰⴱⵍⵖⴰⵔⵉⵜⵜⴰⴱⵏⵖⴰⵍⵉⵜⵜⴰⵜⵛⵉⴽⵉⵜⵜⴰⵍⵉⵎⴰⵏⵜⵜⴰⴳⵔⵉⴳⵉ" + - "ⵜⵜⴰⵏⴳⵍⵉⵣⵜⵜⴰⵙⴱⵏⵢⵓⵍⵉⵜⵜⴰⴼⵓⵔⵙⵉⵜⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜⵜⴰⵀⴰⵡⵙⴰⵜⵜⴰⵀⵉⵏⴷⵉⵜⵜⴰⵀⵏⵖⴰⵔⵉⵜⵜⴰⵏⴷ" + - "ⵓⵏⵉⵙⵉⵜⵜⵉⴳⴱⵓⵜⵜⴰⵟⴰⵍⵢⴰⵏⵜⵜⴰⵊⴰⴱⴱⵓⵏⵉⵜⵜⴰⵊⴰⴱⴰⵏⵉⵜⵜⴰⵅⵎⵉⵔⵜⵜⴰⴽⵓⵔⵉⵜⵜⴰⵎⴰⵍⴰⵡⵉⵜⵜⴰⴱ" + - "ⵉⵔⵎⴰⵏⵉⵜⵜⴰⵏⵉⴱⴰⵍⵉⵜⵜⴰⵀⵓⵍⴰⵏⴷⵉⵜⵜⴰⴱⵏⵊⴰⴱⵉⵜⵜⴰⴱⵓⵍⵓⵏⵉⵜⵜⴰⴱⵕⵟⵇⵉⵣⵜⵜⴰⵔⵓⵎⴰⵏⵉⵜⵜⴰⵔⵓ" + - "ⵙⵉⵜⵜⴰⵔⵓⵡⴰⵏⴷⵉⵜⵜⴰⵙⵓⵎⴰⵍⵉⵜⵜⴰⵙⵡⵉⴷⵉⵜⵜⴰⵜⴰⵎⵉⵍⵜⵜⴰⵜⴰⵢⵍⴰⵏⴷⵉⵜⵜⴰⵜⵓⵔⴽⵉⵜⵜⵓⴽⵔⴰⵏⵉⵜⵜ" + - "ⵓⵔⴷⵓⵜⵜⴰⴱⵉⵜⵏⴰⵎⵉⵜⵜⴰⵢⵔⵓⴱⴰⵜⵜⴰⵛⵉⵏⵡⵉⵜⵜⴰⵣⵓⵍⵓⵜⵜⴰⵎⴰⵣⵉⵖⵜ", - []uint16{ // 587 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x002a, 0x002a, - 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x005d, 0x0078, - 0x0078, 0x0078, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, - 0x0093, 0x0093, 0x0093, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, - 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00db, 0x00f3, 0x00f3, 0x0111, - 0x0111, 0x0111, 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, 0x0147, - 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x015f, - 0x015f, 0x0177, 0x0177, 0x0177, 0x0177, 0x0192, 0x0192, 0x0192, - // Entry 40 - 7F - 0x0192, 0x01b0, 0x01b0, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, - 0x01dd, 0x01dd, 0x01fb, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, - 0x0216, 0x0216, 0x022b, 0x022b, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x025b, 0x025b, 0x0279, 0x0279, 0x0279, - 0x0294, 0x0294, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, - 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02cd, 0x02cd, 0x02e8, - // Entry 80 - BF - 0x02e8, 0x0303, 0x0303, 0x0303, 0x0303, 0x031e, 0x0333, 0x0351, - 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, - 0x0351, 0x0351, 0x036c, 0x036c, 0x036c, 0x036c, 0x036c, 0x036c, - 0x0384, 0x0384, 0x039c, 0x039c, 0x039c, 0x03bd, 0x03bd, 0x03bd, - 0x03bd, 0x03bd, 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03ed, - 0x03ff, 0x03ff, 0x03ff, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, - 0x041d, 0x0435, 0x0435, 0x044d, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry C0 - FF - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry 100 - 13F - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry 140 - 17F - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry 180 - 1BF - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry 1C0 - 1FF - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry 200 - 23F - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - // Entry 240 - 27F - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, - 0x0462, 0x0462, 0x047a, - }, - }, - { // zh - zhLangStr, - zhLangIdx, - }, - { // zh-Hant - zhHantLangStr, - zhHantLangIdx, - }, - { // zh-Hant-HK - "阿法爾文阿塞拜疆文巴什基爾文布里多尼文波斯尼亞文加泰隆尼亞文世界語加里西亞文印度文克羅地亞文意大利文格魯吉亞文坎納達文老撾文馬拉加斯文馬拉雅拉姆" + - "文馬耳他文奧里雅文盧旺達文信德語斯洛文尼亞文修納文索馬里文泰米爾文湯加文烏爾都文克里米亞韃靼文塞舌爾克里奧爾法文斯拉夫文吉爾伯特文瑞" + - "士德文苗語猶太波斯文扎扎其文克裡奧爾文盧歐文毛里裘斯克里奧爾文西非書面語言(N’ko)尼日利亞皮欽文阿羅馬尼亞語瓦爾皮里文廣東話摩洛" + - "哥標準塔馬齊格特文南阿塞拜疆文奧地利德文瑞士德語澳洲英文加拿大英文英國英文美國英文拉丁美洲西班牙文歐洲西班牙文墨西哥西班牙文加拿大法" + - "文瑞士法文荷蘭低地德文比利時荷蘭文巴西葡萄牙語歐洲葡萄牙文摩爾多瓦羅馬尼亞文剛果史瓦希里文", - []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x000c, 0x001b, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x0039, 0x0048, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, - 0x0063, 0x0063, 0x0063, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x007b, 0x007b, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, - // Entry 40 - 7F - 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, - 0x0096, 0x0096, 0x0096, 0x0096, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, - 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, - 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00c9, 0x00c9, 0x00c9, 0x00c9, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00e7, 0x00e7, 0x00e7, 0x00e7, - 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, - 0x00e7, 0x00e7, 0x00e7, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, - // Entry 80 - BF - 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00ff, - 0x00ff, 0x00ff, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x011a, - 0x011a, 0x0123, 0x012f, 0x012f, 0x012f, 0x012f, 0x012f, 0x012f, - 0x012f, 0x012f, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, - 0x013b, 0x0144, 0x0144, 0x0144, 0x0144, 0x0144, 0x0144, 0x0144, - 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - // Entry C0 - FF - 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, - // Entry 100 - 13F - 0x0150, 0x0150, 0x0150, 0x0165, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, - 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, - 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, - 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, - 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, - 0x018c, 0x018c, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, - 0x019b, 0x019b, 0x019b, 0x019b, 0x01a7, 0x01a7, 0x01a7, 0x01a7, - // Entry 140 - 17F - 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01ad, - 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, - 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, - 0x01bc, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, - 0x01c8, 0x01c8, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, - 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, - // Entry 180 - 1BF - 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, - 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01e0, 0x01e0, 0x01e0, 0x01e0, - 0x01e0, 0x01e0, 0x01e0, 0x01e0, 0x01e0, 0x01e0, 0x01e0, 0x01e0, - 0x01e0, 0x01e0, 0x01e0, 0x01e0, 0x01e0, 0x01fb, 0x01fb, 0x01fb, - 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, - 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, - 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, - 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x0219, 0x0219, - // Entry 1C0 - 1FF - 0x0219, 0x0219, 0x0219, 0x0219, 0x0219, 0x0219, 0x0219, 0x0219, - 0x0219, 0x0219, 0x0219, 0x0219, 0x0219, 0x0219, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - // Entry 200 - 23F - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, - 0x0240, 0x0240, 0x0240, 0x024f, 0x024f, 0x024f, 0x024f, 0x024f, - // Entry 240 - 27F - 0x024f, 0x024f, 0x024f, 0x024f, 0x024f, 0x0258, 0x0258, 0x0258, - 0x0258, 0x0258, 0x0279, 0x0279, 0x0279, 0x0279, 0x0279, 0x028b, - 0x029a, 0x02a6, 0x02b2, 0x02c1, 0x02cd, 0x02d9, 0x02f1, 0x0303, - 0x0318, 0x0318, 0x0327, 0x0333, 0x0345, 0x0357, 0x0369, 0x037b, - 0x0396, 0x0396, 0x03ab, - }, - }, - { // zu - zuLangStr, - zuLangIdx, - }, -} - -const afLangStr string = "" + // Size: 3015 bytes - "AfarAbkasiesAfrikaansAkanAmhariesAragoneesArabiesAssameesAvariesAymaraAz" + - "erbeidjansBaskirBelo-RussiesBulgaarsBislamaBambaraBengaalsTibettaansBret" + - "onsBosniesKatalaansTsjetsjenChamorroKorsikaansTsjeggiesKerkslawiesChuvas" + - "hWalliesDeensDuitsDivehiDzongkhaEweGrieksEngelsEsperantoSpaansEstniesBas" + - "kiesPersiesFulahFinsFidjiaansFaroeesFransWes-FriesIersSkotse GalliesGali" + - "siesGuaraniGoedjaratiManxHausaHebreeusHindiKroatiesHaïtiaansHongaarsArme" + - "ensHereroInterlinguaIndonesiesInterlingueIgboSichuan YiIdoYslandsItaliaa" + - "nsInnuïtiesJapanneesJavaansGeorgiesKongoleesKikuyuKuanyamaKazaksKalaalli" + - "sutKhmerKannadaKoreaansKanuriKasjmirsKoerdiesKomiKorniesKirgisiesLatynLu" + - "xemburgsGandaLimburgsLingaalsLaoLitausLuba-KatangaLettiesMalgassiesMarsh" + - "alleesMaoriMasedoniesMalabaarsMongoolsMarathiMaleisMalteesBirmaansNauruN" + - "oord-NdebeleNepaleesNdongaNederlandsNoorweegse NynorskNoorse BokmålSuid-" + - "NdebeleNavajoNyanjaOksitaansOromoOriyaOssetiesPandjabiPoolsPasjtoPortuge" + - "esQuechuaReto-RomaansRundiRoemeensRussiesRwandeesSanskritSardiniesSindhi" + - "Noord-SamiSangoSinhalaSlowaaksSloweensSamoaansShonaSomaliesAlbaneesSerwi" + - "esSwaziSuid-SothoSundaneesSweedsSwahiliTamilTeloegoeTadzjieksThaiTigriny" + - "aTurkmeensTswanaTongaansTurksTsongaTataarsTahitiesUighurOekraïensOerdoeO" + - "ezbeeksVendaViëtnameesVolapükWalloonWolofXhosaJiddisjYorubaSjineesZoeloe" + - "AsjineesAkoliAdangmeAdygheAghemAinuAleutSuid-AltaiAngikaArameesMapucheAr" + - "apahoAsuAsturiesAwadhiBalineesBasaaBembaBenaWes-BalochiBhojpuriBiniSiksi" + - "kaBodoBugineesBlinCebuanoSjigaChuukeesMariChoctawCherokeesCheyenneesSora" + - "ni KoerdiesKoptiesSeselwa FranskreoolsDakotaansDakotaTaitaDogribZarmaLae" + - " SorbiesDualaJola-FonyiDazagaEmbuEfikAntieke EgiptiesEkajukEwondoFilippy" + - "nsFonFriuliaansGaaGagauzGeezGilberteesGorontaloGotiesAntieke GrieksSwits" + - "erse DuitsGusiiGwichʼinHawaiiesHiligaynonHetitiesHmongHoog-SorbiesHupaIb" + - "aneesIbibioIlokoIngushLojbanNgombaMachameKabyleKachinJjuKambaKabardiaans" + - "TyapMakondeKabuverdianuKoroKhasiKoyra ChiiniKakoKalenjinKimbunduKomi-Per" + - "myaksKonkaniKpelleesKarachay-BalkarKareliesKurukhShambalaBafiaKeulsKumyk" + - "LadinoLangiLezghiesLakotaLoziNoord-LuriLuba-LuluaLundaLuoMizoLuyiaMadure" + - "esMagahiMaithiliMakasarMasaiMokshaMendeMeruMorisjenMakhuwa-MeettoMeta’Mi" + - "cmacMinangkabausManipuriMohawkMossiMundangVeelvuldige taleKreekMirandees" + - "ErzyaMasanderaniNeapolitaansNamaLae DuitsNewariNiasNiueanKwasioNgiemboon" + - "NogaiN’KoNoord-SothoNuerNyankolePangasinanPampangaPapiamentoPalauaansNig" + - "eriese PidginFenisiesPruisiesK’iche’RapanuiRarotongaansRomboAromaniesRwa" + - "SandaweesSakhaansSamburuSantaliesNgambaySanguSisiliaansSkotsSuid-Koerdie" + - "sSenaKoyraboro SenniTachelhitShanSuid-SamiLule SamiInari SamiSkolt SamiS" + - "oninkeSranan TongoSahoSukumaComoraansSirieseTimneTesoTetoemTigreKlingonT" + - "ok PisinTarokoToemboekaTuvaluTasawaqTuvineesSentraal Atlas TamazightUdmu" + - "rtUmbunduRootVaiVunjoWalserWolayttaWarayWarlpiriKalmykSogaYangbenYembaKa" + - "ntoneesStandaard Marokkaanse TamazightZuniGeen linguistiese inhoudZazaMo" + - "derne Standaard ArabiesSwitserse hoog-DuitsSpaans (Suid-Amerika)Nedersak" + - "siesVlaamsMoldawiesSerwo-KroatiesSwahili (Kongo)" - -var afLangIdx = []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000c, 0x000c, 0x0015, 0x0019, 0x0021, 0x002a, - 0x0031, 0x0039, 0x0040, 0x0046, 0x0052, 0x0058, 0x0064, 0x006c, - 0x0073, 0x007a, 0x0082, 0x008c, 0x0093, 0x009a, 0x00a3, 0x00ac, - 0x00b4, 0x00be, 0x00be, 0x00c7, 0x00d2, 0x00d9, 0x00e0, 0x00e5, - 0x00ea, 0x00f0, 0x00f8, 0x00fb, 0x0101, 0x0107, 0x0110, 0x0116, - 0x011d, 0x0124, 0x012b, 0x0130, 0x0134, 0x013d, 0x0144, 0x0149, - 0x0152, 0x0156, 0x0164, 0x016c, 0x0173, 0x017d, 0x0181, 0x0186, - 0x018e, 0x0193, 0x0193, 0x019b, 0x01a5, 0x01ad, 0x01b4, 0x01ba, - // Entry 40 - 7F - 0x01c5, 0x01cf, 0x01da, 0x01de, 0x01e8, 0x01e8, 0x01eb, 0x01f2, - 0x01fb, 0x0205, 0x020e, 0x0215, 0x021d, 0x0226, 0x022c, 0x0234, - 0x023a, 0x0245, 0x024a, 0x0251, 0x0259, 0x025f, 0x0267, 0x026f, - 0x0273, 0x027a, 0x0283, 0x0288, 0x0292, 0x0297, 0x029f, 0x02a7, - 0x02aa, 0x02b0, 0x02bc, 0x02c3, 0x02cd, 0x02d8, 0x02dd, 0x02e7, - 0x02f0, 0x02f8, 0x02ff, 0x0305, 0x030c, 0x0314, 0x0319, 0x0326, - 0x032e, 0x0334, 0x033e, 0x0350, 0x035e, 0x036a, 0x0370, 0x0376, - 0x037f, 0x037f, 0x0384, 0x0389, 0x0391, 0x0399, 0x0399, 0x039e, - // Entry 80 - BF - 0x03a4, 0x03ad, 0x03b4, 0x03c0, 0x03c5, 0x03cd, 0x03d4, 0x03dc, - 0x03e4, 0x03ed, 0x03f3, 0x03fd, 0x0402, 0x0409, 0x0411, 0x0419, - 0x0421, 0x0426, 0x042e, 0x0436, 0x043d, 0x0442, 0x044c, 0x0455, - 0x045b, 0x0462, 0x0467, 0x046f, 0x0478, 0x047c, 0x0484, 0x048d, - 0x0493, 0x049b, 0x04a0, 0x04a6, 0x04ad, 0x04b5, 0x04bb, 0x04c5, - 0x04cb, 0x04d3, 0x04d8, 0x04e3, 0x04eb, 0x04f2, 0x04f7, 0x04fc, - 0x0503, 0x0509, 0x0509, 0x0510, 0x0516, 0x051e, 0x0523, 0x052a, - 0x0530, 0x0530, 0x0530, 0x0535, 0x0539, 0x0539, 0x0539, 0x053e, - // Entry C0 - FF - 0x053e, 0x0548, 0x0548, 0x054e, 0x0555, 0x055c, 0x055c, 0x0563, - 0x0563, 0x0563, 0x0563, 0x0563, 0x0563, 0x0566, 0x0566, 0x056e, - 0x056e, 0x0574, 0x0574, 0x057c, 0x057c, 0x0581, 0x0581, 0x0581, - 0x0581, 0x0581, 0x0586, 0x0586, 0x058a, 0x058a, 0x058a, 0x0595, - 0x059d, 0x059d, 0x05a1, 0x05a1, 0x05a1, 0x05a8, 0x05a8, 0x05a8, - 0x05a8, 0x05a8, 0x05ac, 0x05ac, 0x05ac, 0x05b4, 0x05b4, 0x05b8, - 0x05b8, 0x05b8, 0x05b8, 0x05b8, 0x05b8, 0x05bf, 0x05c4, 0x05c4, - 0x05c4, 0x05cc, 0x05d0, 0x05d0, 0x05d7, 0x05d7, 0x05e0, 0x05ea, - // Entry 100 - 13F - 0x05f9, 0x0600, 0x0600, 0x0600, 0x0614, 0x0614, 0x061d, 0x0623, - 0x0628, 0x0628, 0x0628, 0x062e, 0x062e, 0x0633, 0x0633, 0x063e, - 0x063e, 0x0643, 0x0643, 0x064d, 0x064d, 0x0653, 0x0657, 0x065b, - 0x065b, 0x066b, 0x0671, 0x0671, 0x0671, 0x0671, 0x0677, 0x0677, - 0x0677, 0x0680, 0x0680, 0x0683, 0x0683, 0x0683, 0x0683, 0x0683, - 0x0683, 0x0683, 0x068d, 0x0690, 0x0696, 0x0696, 0x0696, 0x0696, - 0x0696, 0x069a, 0x06a4, 0x06a4, 0x06a4, 0x06a4, 0x06a4, 0x06a4, - 0x06ad, 0x06b3, 0x06b3, 0x06c1, 0x06d0, 0x06d0, 0x06d0, 0x06d5, - // Entry 140 - 17F - 0x06de, 0x06de, 0x06de, 0x06e6, 0x06e6, 0x06f0, 0x06f8, 0x06fd, - 0x0709, 0x0709, 0x070d, 0x0714, 0x071a, 0x071f, 0x0725, 0x0725, - 0x0725, 0x072b, 0x0731, 0x0738, 0x0738, 0x0738, 0x0738, 0x0738, - 0x073e, 0x0744, 0x0747, 0x074c, 0x074c, 0x0757, 0x0757, 0x075b, - 0x0762, 0x076e, 0x076e, 0x0772, 0x0772, 0x0777, 0x0777, 0x0783, - 0x0783, 0x0783, 0x0787, 0x078f, 0x0797, 0x07a4, 0x07ab, 0x07ab, - 0x07b3, 0x07c2, 0x07c2, 0x07c2, 0x07ca, 0x07d0, 0x07d8, 0x07dd, - 0x07e2, 0x07e7, 0x07e7, 0x07ed, 0x07f2, 0x07f2, 0x07f2, 0x07fa, - // Entry 180 - 1BF - 0x07fa, 0x07fa, 0x07fa, 0x0800, 0x0800, 0x0800, 0x0804, 0x080e, - 0x080e, 0x0818, 0x0818, 0x081d, 0x0820, 0x0824, 0x0829, 0x0829, - 0x0829, 0x0831, 0x0831, 0x0837, 0x083f, 0x0846, 0x0846, 0x084b, - 0x084b, 0x0851, 0x0851, 0x0856, 0x085a, 0x0862, 0x0862, 0x0870, - 0x0877, 0x087d, 0x0889, 0x0889, 0x0891, 0x0897, 0x089c, 0x089c, - 0x08a3, 0x08b3, 0x08b8, 0x08c1, 0x08c1, 0x08c1, 0x08c1, 0x08c6, - 0x08d1, 0x08d1, 0x08dd, 0x08e1, 0x08ea, 0x08f0, 0x08f4, 0x08fa, - 0x08fa, 0x0900, 0x0909, 0x090e, 0x090e, 0x090e, 0x0914, 0x091f, - // Entry 1C0 - 1FF - 0x0923, 0x0923, 0x0923, 0x092b, 0x092b, 0x092b, 0x092b, 0x092b, - 0x0935, 0x0935, 0x093d, 0x0947, 0x0950, 0x0950, 0x0960, 0x0960, - 0x0960, 0x0960, 0x0960, 0x0968, 0x0968, 0x0968, 0x0968, 0x0970, - 0x0970, 0x097b, 0x097b, 0x097b, 0x0982, 0x098e, 0x098e, 0x098e, - 0x0993, 0x0993, 0x0993, 0x0993, 0x0993, 0x099c, 0x099f, 0x09a8, - 0x09b0, 0x09b0, 0x09b7, 0x09b7, 0x09c0, 0x09c0, 0x09c7, 0x09cc, - 0x09d6, 0x09db, 0x09db, 0x09e8, 0x09e8, 0x09ec, 0x09ec, 0x09ec, - 0x09fb, 0x09fb, 0x09fb, 0x0a04, 0x0a08, 0x0a08, 0x0a08, 0x0a08, - // Entry 200 - 23F - 0x0a08, 0x0a11, 0x0a1a, 0x0a24, 0x0a2e, 0x0a35, 0x0a35, 0x0a41, - 0x0a41, 0x0a45, 0x0a45, 0x0a4b, 0x0a4b, 0x0a4b, 0x0a54, 0x0a54, - 0x0a5b, 0x0a5b, 0x0a5b, 0x0a60, 0x0a64, 0x0a64, 0x0a6a, 0x0a6f, - 0x0a6f, 0x0a6f, 0x0a6f, 0x0a76, 0x0a76, 0x0a76, 0x0a76, 0x0a76, - 0x0a7f, 0x0a7f, 0x0a85, 0x0a85, 0x0a85, 0x0a85, 0x0a8e, 0x0a94, - 0x0a9b, 0x0aa3, 0x0abb, 0x0ac1, 0x0ac1, 0x0ac8, 0x0acc, 0x0acf, - 0x0acf, 0x0acf, 0x0acf, 0x0acf, 0x0acf, 0x0acf, 0x0ad4, 0x0ada, - 0x0ae2, 0x0ae7, 0x0ae7, 0x0aef, 0x0aef, 0x0af5, 0x0af5, 0x0af9, - // Entry 240 - 27F - 0x0af9, 0x0af9, 0x0b00, 0x0b05, 0x0b05, 0x0b0e, 0x0b0e, 0x0b0e, - 0x0b0e, 0x0b0e, 0x0b2d, 0x0b31, 0x0b49, 0x0b4d, 0x0b66, 0x0b66, - 0x0b66, 0x0b7a, 0x0b7a, 0x0b7a, 0x0b7a, 0x0b7a, 0x0b8f, 0x0b8f, - 0x0b8f, 0x0b8f, 0x0b8f, 0x0b8f, 0x0b9b, 0x0ba1, 0x0ba1, 0x0ba1, - 0x0baa, 0x0bb8, 0x0bc7, -} // Size: 1246 bytes - -const amLangStr string = "" + // Size: 6791 bytes - "አፋርኛአብሐዚኛአቬስታንአፍሪካንኛአካንኛአማርኛአራጎንስዓረብኛአሳሜዛዊአቫሪክአያማርኛአዘርባጃንኛባስኪርኛቤላራሻኛቡልጋሪ" + - "ኛቢስላምኛባምባርኛቤንጋሊኛቲቤታንኛብሬቶንኛቦስኒያንኛካታላንኛችችንቻሞሮኮርሲካኛክሪቼክኛቸርች ስላቪክቹቫሽወልሽዴኒሽ" + - "ጀርመንዲቬህድዞንግኻኛኢዊግሪክኛእንግሊዝኛኤስፐራንቶስፓንሽኛኢስቶኒያንኛባስክኛፐርሺያኛፉላህፊኒሽፊጂኛፋሮኛፈረንሳይኛ" + - "የምዕራብ ፍሪስኛአይሪሽየስኮቲሽ ጌልክኛጋሊሺያጓራኒኛጉጃርቲኛማንክስኛሃውሳኛዕብራስጥሒንዱኛክሮሽያንኛሃይትኛሀንጋሪኛ" + - "አርመናዊሄሬሮኢንቴርሊንጓኢንዶኔዥኛእንተርሊንግወኢግቦኛሲቹንዪኛእኑፒያቅኛኢዶአይስላንድኛጣሊያንኛእኑክቲቱትኛጃፓንኛጃ" + - "ቫንኛጆርጂያንኮንጎኛኪኩዩኩንያማካዛክኛካላሊሱትኛክህመርኛካናዳኛኮሪያኛካኑሪካሽሚርኛኩርድሽኛኮሚኮርኒሽኪርጊዝኛላቲንኛ" + - "ሉክዘምበርገርኛጋንዳኛሊምቡርጊሽሊንጋላኛላኦስኛሉቴንያንኛሉባ ካታንጋላትቪያንማላጋስኛማርሻሌዝኛማኦሪኛማሴዶንኛማላያላ" + - "ምኛሞንጎላዊኛማራቲኛማላይኛማልቲስኛቡርማኛናኡሩሰሜን ንዴብሌኔፓሊኛንዶንጋደችየኖርዌይ ናይኖርስክየኖርዌይ ቦክማልደቡ" + - "ብ ንደቤሌናቫጆንያንጃኦኪታንኛኦሮሞኛኦዲያኛኦሴቲክፑንጃብኛፖሊሽኛፓሽቶኛፖርቹጋልኛኵቿኛሮማንሽሩንዲኛሮማኒያንራሽያኛኪ" + - "ንያርዋንድኛሳንስክሪትኛሳርዲንያንኛሲንድሂኛሰሜናዊ ሳሚሳንጎኛሲንሃልኛስሎቫክኛስሎቪኛሳሞአኛሾናኛሱማልኛአልባንያንኛሰ" + - "ርቢኛስዋቲኛደቡባዊ ሶቶሱዳንኛስዊድንኛስዋሂሊኛታሚልኛተሉጉኛታጂኪኛታይኛትግርኛቱርክሜንኛጽዋናዊኛቶንጋኛቱርክኛጾንጋኛ" + - "ታታርኛታሂታንኛኡዊግሁርኛዩክሬንኛኡርዱኛኡዝቤክኛቬንዳቪየትናምኛቮላፑክኛዋሎንዎሎፍኛዞሳኛይዲሽኛዮሩባዊኛዡዋንግኛቻይን" + - "ኛዙሉኛአቻይንኛአኮሊኛአዳንግሜአድይግሄአፍሪሂሊአገምአይኑአካዲያንአላባማአልዩትደቡባዊ አልታይአንጊካአራማይክማፑቼአራ" + - "ኦናአራፓሆየአልጄሪያ ዓረብኛአራዋክአሱየአሜሪካ የምልክት ቋንቋአውስትሪያንአዋድሂባሉቺባሊኔስባቫሪያንባሳባሙንባታካ " + - "ቶባቤጃቤምባቤታዊቤናባፉትባዳጋየምዕራብ ባሎቺቦጁሪቢኮልቢኒባንጃርሲክሲካቢሹንፑሪያባክህቲያሪብራጅብራሁዪቦዶአኮስቡሪያ" + - "ትቡጊኔዝቡሉብሊንካዶካሪብካዩጋአትሳምካቡዋኖቺጋኛቺብቻቻጋታይቹክስማሪቺኑክ ጃርጎንቾክታዋቺፔውያንቼሮኬኛችዬኔየሶራኒ " + - "ኩርድኛኮፕቲክካፒዝኖንክሪሚያን ተርኪሽሰሰላዊ ክሬኦሊ ፈረንሳይኛዳኮታዳርግዋታይታኛዳላዌርዶግሪብዲንካዛርማኛዶግሪየታ" + - "ችኛው ሰርቢያንኛሴንተራል ዱሰንዱዋላኛጆላ ፎንያኛድዩላዳዛጋኢቦኛኤፊክየጥንታዊ ግብጽኛኤካጁክሴንተራል ዩፒክኤዎንዶፊ" + - "ሊፒንኛፎንካጁን ፍሬንችአርፒታንፍሩሊያንጋጋጉዝኛጋን ቻይንኛግዕዝኛጅልበርትስጎሮንታሎየጥንታዊ ግሪክየስዊዝ ጀርመንጉ" + - "ስሊኛግዊቺንሃካ ቻይንኛሃዊያኛሂሊጋይኖንህሞንግየላይኛው ሶርቢያንኛዢያንግ ቻይንኛሁፓኢባንኢቢቦኢሎኮኢንጉሽሎጅባንንጎ" + - "ባኛማቻሜኛካብይልካቺንካጅካምባካባርዲያንታያፕማኮንዴካቡቨርዲያኑኮሮክሃሲኮይራ ቺኒካኮካለንጂንኪምቡንዱኮሚ ፔርምያክኮ" + - "ንካኒክፔሌካራቻይ-ባልካርካረሊኛኩሩክሻምባላባፊያኮሎኝያንኩማይክላዲኖላንጊሌዝጊያንላኮታሎዚኛሰሜናዊ ሉሪሉባ-ሉሏሉንዳ" + - "ሉኦሚዞሉዪያማዱረስማጋሂማይተሊማካሳርማሳይሞክሻሜንዴሜሩሞሪሲየኛማኩዋ ሜቶሜታሚክማክሚናንግካባኡማኒፑሪሞሃውክሞሲሙንዳ" + - "ንግባለብዙ ቋንቋዎችክሪክሚራንዴዝኛኤርዝያማዛንደራኒሚን ኛን ቻይንኛኒአፖሊታንናማየታችኛው ጀርመንነዋሪኒአስኒዩአንኛ" + - "ኦ ናጋክዋሲዮኒጊምቡንኖጋይንኮሰሜናዊ ሶቶኑዌርክላሲክ ኔዋሪኒያንኮልኛፓንጋሲናንኛፓምፓንጋፓፒአሜንቶፓላኡአንየናይጄሪ" + - "ያ ፒጂንፐሩሳንኛኪቼቺምቦራዞ ሃይላንድ ኩቹዋራፓኑኢራሮቶንጋሮምቦአሮማንያንርዋሳንዳዌሳክሃሳምቡሩሳንታሊንጋምባይሳንጉ" + - "ሲሲሊያንኛስኮትስደቡባዊ ኩርዲሽሴናኮይራቦሮ ሴኒታቼልሂትሻንቻዲያን ዓረብኛሲዳምኛደቡባዊ ሳሚሉሌ ሳሚኢናሪ ሳሚስኮል" + - "ት ሳሚሶኒንኬስራናን ቶንጎሳሆኛሱኩማኮሞሪያንክላሲክ ኔይራሲሪያክቲምኔቴሶቴተምትግረክሊንጎንኛቶክ ፒሲንታሮኮቱምቡካቱ" + - "ቫሉታሳዋቅቱቪንያንኛመካከለኛ አትላስ ታማዚግትኡድሙርትኡምቡንዱሩትቫይቩንጆዋልሰርወላይትኛዋራይዋርልፒሪዉ ቻይንኛካል" + - "ማይክሶጋያንግቤንኛየምባካንቶኒዝብሊስይምቦልስመደበኛ የሞሮኮ ታማዚግትዙኒቋንቋዊ ይዘት አይደለምዛዛዘመናዊ መደበኛ " + - "ዓረብኛየኦስትሪያ ጀርመንየስዊዝ ከፍተኛ ጀርመንኛየአውስትራሊያ እንግሊዝኛየካናዳ እንግሊዝኛየብሪቲሽ እንግሊዝኛየአ" + - "ሜሪካ እንግሊዝኛየላቲን አሜሪካ ስፓኒሽየአውሮፓ ስፓንሽኛየሜክሲኮ ስፓንሽኛየካናዳ ፈረንሳይኛየስዊዝ ፈረንሳይኛየታ" + - "ችኛው ሳክሰንፍሌሚሽየብራዚል ፖርቹጋልኛየአውሮፓ ፖርቹጋልኛሞልዳቪያንኛሰርቦ-ክሮኤሽያኛኮንጎ ስዋሂሊቀለል ያለ ቻይ" + - "ንኛባህላዊ ቻይንኛ" - -var amLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x001b, 0x002a, 0x003c, 0x0048, 0x0054, 0x0063, - 0x006f, 0x007e, 0x008a, 0x0099, 0x00ae, 0x00bd, 0x00cc, 0x00db, - 0x00ea, 0x00f9, 0x0108, 0x0117, 0x0126, 0x0138, 0x0147, 0x0150, - 0x0159, 0x0168, 0x016e, 0x0177, 0x018d, 0x0196, 0x019f, 0x01a8, - 0x01b4, 0x01bd, 0x01cf, 0x01d5, 0x01e1, 0x01f3, 0x0205, 0x0214, - 0x0229, 0x0235, 0x0244, 0x024d, 0x0256, 0x025f, 0x0268, 0x027a, - 0x0296, 0x02a2, 0x02be, 0x02ca, 0x02d6, 0x02e5, 0x02f4, 0x0300, - 0x030f, 0x031b, 0x031b, 0x032d, 0x0339, 0x0348, 0x0357, 0x0360, - // Entry 40 - 7F - 0x0375, 0x0387, 0x039f, 0x03ab, 0x03ba, 0x03cc, 0x03d2, 0x03e7, - 0x03f6, 0x040b, 0x0417, 0x0423, 0x0432, 0x043e, 0x0447, 0x0453, - 0x045f, 0x0471, 0x0480, 0x048c, 0x0498, 0x04a1, 0x04b0, 0x04bf, - 0x04c5, 0x04d1, 0x04e0, 0x04ec, 0x0507, 0x0513, 0x0525, 0x0534, - 0x0540, 0x0552, 0x0565, 0x0574, 0x0583, 0x0595, 0x05a1, 0x05b0, - 0x05c2, 0x05d4, 0x05e0, 0x05ec, 0x05fb, 0x0607, 0x0610, 0x0626, - 0x0632, 0x063e, 0x0644, 0x0666, 0x0682, 0x0698, 0x06a1, 0x06ad, - 0x06bc, 0x06bc, 0x06c8, 0x06d4, 0x06e0, 0x06ef, 0x06ef, 0x06fb, - // Entry 80 - BF - 0x0707, 0x0719, 0x0722, 0x072e, 0x073a, 0x0749, 0x0755, 0x076d, - 0x0782, 0x0797, 0x07a6, 0x07b9, 0x07c5, 0x07d4, 0x07e3, 0x07ef, - 0x07fb, 0x0804, 0x0810, 0x0825, 0x0831, 0x083d, 0x0850, 0x085c, - 0x086b, 0x087a, 0x0886, 0x0892, 0x089e, 0x08a7, 0x08b3, 0x08c5, - 0x08d4, 0x08e0, 0x08ec, 0x08f8, 0x0904, 0x0913, 0x0925, 0x0934, - 0x0940, 0x094f, 0x0958, 0x096a, 0x0979, 0x0982, 0x098e, 0x0997, - 0x09a3, 0x09b2, 0x09c1, 0x09cd, 0x09d6, 0x09e5, 0x09f1, 0x0a00, - 0x0a0f, 0x0a0f, 0x0a1e, 0x0a27, 0x0a30, 0x0a3f, 0x0a4b, 0x0a57, - // Entry C0 - FF - 0x0a57, 0x0a70, 0x0a70, 0x0a7c, 0x0a8b, 0x0a94, 0x0aa0, 0x0aac, - 0x0acb, 0x0acb, 0x0ad7, 0x0ad7, 0x0ad7, 0x0add, 0x0b06, 0x0b1b, - 0x0b1b, 0x0b27, 0x0b30, 0x0b3c, 0x0b4b, 0x0b51, 0x0b5a, 0x0b6a, - 0x0b6a, 0x0b70, 0x0b79, 0x0b82, 0x0b88, 0x0b91, 0x0b9a, 0x0bb3, - 0x0bbc, 0x0bc5, 0x0bcb, 0x0bd7, 0x0bd7, 0x0be3, 0x0bf5, 0x0c07, - 0x0c10, 0x0c1c, 0x0c22, 0x0c2b, 0x0c37, 0x0c43, 0x0c49, 0x0c52, - 0x0c52, 0x0c58, 0x0c61, 0x0c6a, 0x0c76, 0x0c82, 0x0c8b, 0x0c94, - 0x0ca0, 0x0ca9, 0x0caf, 0x0cc5, 0x0cd1, 0x0ce0, 0x0cec, 0x0cf5, - // Entry 100 - 13F - 0x0d0e, 0x0d1a, 0x0d29, 0x0d45, 0x0d71, 0x0d71, 0x0d7a, 0x0d86, - 0x0d92, 0x0d9e, 0x0d9e, 0x0daa, 0x0db3, 0x0dbf, 0x0dc8, 0x0dea, - 0x0e03, 0x0e0f, 0x0e0f, 0x0e22, 0x0e2b, 0x0e34, 0x0e3d, 0x0e46, - 0x0e46, 0x0e62, 0x0e6e, 0x0e6e, 0x0e6e, 0x0e87, 0x0e93, 0x0e93, - 0x0e93, 0x0ea2, 0x0ea2, 0x0ea8, 0x0ebe, 0x0ebe, 0x0ebe, 0x0ecd, - 0x0ecd, 0x0ecd, 0x0edc, 0x0edf, 0x0eeb, 0x0efe, 0x0efe, 0x0efe, - 0x0efe, 0x0f0a, 0x0f1c, 0x0f1c, 0x0f1c, 0x0f1c, 0x0f1c, 0x0f1c, - 0x0f2b, 0x0f2b, 0x0f2b, 0x0f44, 0x0f5d, 0x0f5d, 0x0f5d, 0x0f69, - // Entry 140 - 17F - 0x0f75, 0x0f75, 0x0f88, 0x0f94, 0x0f94, 0x0fa6, 0x0fa6, 0x0fb2, - 0x0fd4, 0x0fed, 0x0ff3, 0x0ffc, 0x1005, 0x100e, 0x101a, 0x101a, - 0x101a, 0x1026, 0x1032, 0x103e, 0x103e, 0x103e, 0x103e, 0x103e, - 0x104a, 0x1053, 0x1059, 0x1062, 0x1062, 0x1074, 0x1074, 0x107d, - 0x1089, 0x109e, 0x109e, 0x10a4, 0x10a4, 0x10ad, 0x10ad, 0x10bd, - 0x10bd, 0x10bd, 0x10c3, 0x10d2, 0x10e1, 0x10f7, 0x1103, 0x1103, - 0x110c, 0x1125, 0x1125, 0x1125, 0x1131, 0x113a, 0x1146, 0x114f, - 0x115e, 0x116a, 0x116a, 0x1173, 0x117c, 0x117c, 0x117c, 0x118b, - // Entry 180 - 1BF - 0x118b, 0x118b, 0x118b, 0x1194, 0x1194, 0x1194, 0x119d, 0x11b0, - 0x11b0, 0x11bd, 0x11bd, 0x11c6, 0x11cc, 0x11d2, 0x11db, 0x11db, - 0x11db, 0x11e7, 0x11e7, 0x11f0, 0x11fc, 0x1208, 0x1208, 0x1211, - 0x1211, 0x121a, 0x121a, 0x1223, 0x1229, 0x1238, 0x1238, 0x1248, - 0x124e, 0x125a, 0x126f, 0x126f, 0x127b, 0x1287, 0x128d, 0x128d, - 0x129c, 0x12b8, 0x12c1, 0x12d3, 0x12d3, 0x12d3, 0x12d3, 0x12df, - 0x12f1, 0x130b, 0x131d, 0x1323, 0x133f, 0x1348, 0x1351, 0x1360, - 0x136a, 0x1376, 0x1385, 0x138e, 0x138e, 0x138e, 0x1394, 0x13a7, - // Entry 1C0 - 1FF - 0x13b0, 0x13c6, 0x13c6, 0x13d8, 0x13d8, 0x13d8, 0x13d8, 0x13d8, - 0x13ed, 0x13ed, 0x13fc, 0x140e, 0x141d, 0x141d, 0x1439, 0x1439, - 0x1439, 0x1439, 0x1439, 0x1439, 0x1439, 0x1439, 0x1439, 0x1448, - 0x1448, 0x144e, 0x1477, 0x1477, 0x1483, 0x1492, 0x1492, 0x1492, - 0x149b, 0x149b, 0x149b, 0x149b, 0x149b, 0x14ad, 0x14b3, 0x14bf, - 0x14c8, 0x14c8, 0x14d4, 0x14d4, 0x14e0, 0x14e0, 0x14ef, 0x14f8, - 0x150a, 0x1516, 0x1516, 0x152f, 0x152f, 0x1535, 0x1535, 0x1535, - 0x154b, 0x154b, 0x154b, 0x155a, 0x1560, 0x1579, 0x1585, 0x1585, - // Entry 200 - 23F - 0x1585, 0x1598, 0x15a5, 0x15b5, 0x15c8, 0x15d4, 0x15d4, 0x15ea, - 0x15ea, 0x15f3, 0x15f3, 0x15fc, 0x15fc, 0x15fc, 0x160b, 0x1621, - 0x162d, 0x162d, 0x162d, 0x1636, 0x163c, 0x163c, 0x1645, 0x164e, - 0x164e, 0x164e, 0x164e, 0x1660, 0x1660, 0x1660, 0x1660, 0x1660, - 0x1670, 0x1670, 0x1679, 0x1679, 0x1679, 0x1679, 0x1685, 0x168e, - 0x169a, 0x16ac, 0x16d8, 0x16e7, 0x16e7, 0x16f6, 0x16fc, 0x1702, - 0x1702, 0x1702, 0x1702, 0x1702, 0x1702, 0x1702, 0x170b, 0x1717, - 0x1726, 0x172f, 0x172f, 0x173e, 0x174e, 0x175d, 0x175d, 0x1763, - // Entry 240 - 27F - 0x1763, 0x1763, 0x1775, 0x177e, 0x177e, 0x178d, 0x178d, 0x17a5, - 0x17a5, 0x17a5, 0x17ce, 0x17d4, 0x17fa, 0x1800, 0x1826, 0x1826, - 0x1845, 0x186e, 0x1899, 0x18b8, 0x18da, 0x18fc, 0x1922, 0x1941, - 0x1960, 0x1960, 0x197f, 0x199e, 0x19ba, 0x19c6, 0x19e8, 0x1a0a, - 0x1a1f, 0x1a3b, 0x1a51, 0x1a6e, 0x1a87, -} // Size: 1250 bytes - -const arLangStr string = "" + // Size: 10039 bytes - "الأفاريةالأبخازيةالأفستيةالأفريقانيةالأكانيةالأمهريةالأراغونيةالعربيةالأ" + - "ساميةالأواريةالأيماراالأذربيجانيةالباشكيريةالبيلاروسيةالبلغاريةالبيسلام" + - "يةالبامباراالبنغاليةالتبتيةالبريتونيةالبوسنيةالكتالانيةالشيشانيةالتشامو" + - "روالكورسيكيةالكرىالتشيكيةسلافية كنسيةالتشوفاشيالويلزيةالدانماركيةالألما" + - "نيةالمالديفيةالزونخايةالإيوياليونانيةالإنجليزيةالإسبرانتوالإسبانيةالإست" + - "ونيةلغة الباسكالفارسيةالفولانيةالفنلنديةالفيجيةالفارويةالفرنسيةالفريزيا" + - "نالأيرلنديةالغيلية الأسكتلنديةالجاليكيةالغوارانيةالغوجاراتيةالمنكيةالهو" + - "ساالعبريةالهنديةالهيري موتوالكرواتيةالكريولية الهايتيةالهنغاريةالأرميني" + - "ةالهيريرواللّغة الوسيطةالإندونيسيةالإنترلينجالإيجبوالسيتشيون ييالإينبيا" + - "كالإيدوالأيسلنديةالإيطاليةالإينكتيتتاليابانيةالجاويةالجورجيةالكونغوالكي" + - "كيوالكيونياماالكازاخستانيةالكالاليستالخميريةالكاناداالكوريةالكانيوريالك" + - "شميريةالكرديةالكوميالكورنيةالقيرغيزيةاللاتينيةاللكسمبورغيةالجانداالليمب" + - "رجيشيةاللينجالااللاويةالليتوانيةاللبا-كاتانجااللاتفيةالمالاجاشيةالمارشا" + - "ليةالماوريةالمقدونيةالمالايالاميةالمنغوليةالماراثيةالماليزيةالمالطيةالب" + - "ورميةالنوروالنديبيل الشماليةالنيباليةالندونجاالهولنديةالنرويجية نينورسك" + - "النرويجية بوكمالالنديبيل الجنوبيالنافاجوالنيانجاالأوكيتانيةالأوجيبواالأ" + - "وروميةاللغة الأوريةالأوسيتيكالبنجابيةالباليةالبولنديةالبشتونيةالبرتغالي" + - "ةالكويتشواالرومانشيةالرنديالرومانيةالروسيةالكينياروانداالسنسكريتيةالسرد" + - "ينيةالسنديةالسامي الشماليةالسانجوالسنهاليةالسلوفاكيةالسلوفانيةالساموائي" + - "ةالشوناالصوماليةالألبانيةالصربيةالسواتيالسوتو الجنوبيةالسوندانيةالسويدي" + - "ةالسواحليةالتاميليةالتيلوجوالطاجيكيةالتايلانديةالتغرينيةالتركمانيةالتسو" + - "انيةالتونغيةالتركيةالسونجاالتتريةالتاهيتيةالأويغوريةالأوكرانيةالأورديةا" + - "لأوزبكيةالفينداالفيتناميةلغة الفولابوكالولونيةالولوفيةالخوسااليديشيةالي" + - "وروبيةالزهيونجالصينيةالزولوالأتشينيزيةالأكوليةالأدانجميةالأديغةالأفريهي" + - "ليةالأغمالآينويةالأكاديةالأليوتيةالألطائية الجنوبيةالإنجليزية القديمةال" + - "أنجيكاالآراميةالمابودونغونيةالأراباهواللهجة النجديةالأراواكيةالآسوالأست" + - "ريةالأواديةالبلوشيةاللغة الباليةالباسابامنلغة الغومالاالبيجاالبيمبابينا" + - "لغة البافوتالبلوشية الغربيةالبهوجبوريةالبيكوليةالبينيةلغة الكومالسيكسيك" + - "يةالبراجيةالبودوأكوسالبرياتيةالبجينيزيةلغة البولوالبلينيةلغة الميدومباا" + - "لكادوالكاريبيةالكايوجيةالأتسامالسيبونيةتشيغاالتشيبشاالتشاجاتايالتشكيزية" + - "الماريالشينوك جارجونالشوكتوالشيباوايانالشيروكيالشايانالسورانية الكرديةا" + - "لقبطيةلغة تتار القرمالفرنسية الكريولية السيشيليةالكاشبايانالداكوتاالدار" + - "جواتيتاالديلويرالسلافيةالدوجريبالدنكاالزارميةالدوجريةصوربيا السفلىالديو" + - "لاالهولندية الوسطىجولا فونياالدايلاالقرعانيةإمبوالإفيكالمصرية القديمةال" + - "إكاجكالإمايتالإنجليزية الوسطىالإيوندوالفانجالفلبينيةالفونالفرنسية الوسط" + - "ىالفرنسية القديمةالفريزينية الشماليةالفريزينية الشرقيةالفريلايانالجاالغ" + - "اغوزالغان الصينيةالجايوالجبياالجعزيةلغة أهل جبل طارقالألمانية العليا ال" + - "وسطىالألمانية العليا القديمةالجنديالجورونتالوالقوطيةالجريبواليونانية ال" + - "قديمةالألمانية السويسريةالغيزيةغوتشنالهيداالهاكا الصينيةلغة أهل الهاواي" + - "الهيليجينونالحثيةالهمونجيةالصوربية العلياشيانغ الصينيةالهباالإيبانالإيب" + - "يبيويةالإيلوكوالإنجوشيةاللوجباننغومباالماتشاميةالفارسية اليهوديةالعربية" + - " اليهوديةالكارا-كالباكالقبيليةالكاتشينالجوالكامباالكويالكاباردايانكانمبو" + - "التايابيةماكوندهكابوفيرديانوالكوروالكازيةالخوتانيزكويرا تشينيلغة الكاكو" + - "كالينجينالكيمبندوكومي-بيرماياكالكونكانيةالكوسراينالكبيلالكاراتشاي-بالكا" + - "رالكاريليةالكوروخشامبالالغة البافيالغة الكولونيانالقموقيةالكتيناياللادي" + - "نولانجياللاهندااللامباالليزجيةلاكوتامنغولىاللوزياللرية الشماليةاللبا-لؤ" + - "لؤاللوسينواللوندااللوالميزولغة اللوياالمادريزالماجاالمايثيليالماكاسارال" + - "ماندينغالماسايماباالموكشاالماندارالميندالميروالمورسيانيةالأيرلندية الوس" + - "طىماخاوا-ميتوميتاالميكماكيونيةالمينانجكاباوالمانشوالمانيبوريةالموهوكالم" + - "وسيمندنجلغات متعددةالكريكالميرانديزالمارواريةالأرزيةالمازندرانيةمين-نان" + - " الصينيةالنابوليةلغة الناماالألمانية السفلىالنواريةالنياسالنيويكواسيولغة" + - " النجيمبونالنوجايالنورس القديمأنكوالسوتو الشماليةالنويرالنوارية التقليدي" + - "ةالنيامويزيالنيانكولالنيوروالنزيماالأوساجالتركية العثمانيةالبانجاسينانا" + - "لبهلويةالبامبانجاالبابيامينتوالبالوانالبدجنية النيجيريةالفارسية القديمة" + - "الفينيقيةالبوهنبيايانالبروسياويةالبروفانسية القديمةكيشيالراجاسثانيةالرا" + - "بانيالراروتونجانيالرومبوالغجريةالأرومانيانالرواالسانداويالساخيةالآرامية" + - " السامريةسامبوروالساساكالسانتالينامبيسانغوالصقليةالأسكتلنديةالكردية الجن" + - "وبيةالسنيكاسيناالسيلكبكويرابورو سينيالأيرلندية القديمةتشلحيتالشانالعربي" + - "ة التشاديةالسيداموالسامي الجنوبياللول ساميالإيناري ساميالسكولت ساميالسو" + - "نينكالسوجدينالسرانان تونجوالسررلغة الساهوالسوكوماالسوسوالسوماريةالقمرية" + - "سريانية تقليديةالسريانيةالتيمنتيسوالتيرينوالتيتمالتيغريةالتيفالتوكيلاوا" + - "لكلينجونالتلينغيتيةالتاماشيكتونجا - نياساالتوك بيسينلغة التاروكوالتسيمش" + - "يانالتامبوكاالتوفالوتاساواقالتوفيةالأمازيغية وسط الأطلسالأدمرتاليجاريتي" + - "كالأمبندوالجذرالفايالفوتيكالفونجوالوالسرالولاياتاالوارايالواشووارلبيريا" + - "لوو الصينيةالكالميكالسوغاالياواليابيزيانجبنيمباالكَنْتُونيةالزابوتيكرمو" + - "ز المعايير الأساسيةالزيناجاالتمازيغية المغربية القياسيةالزونيةبدون محتو" + - "ى لغويزازاالعربية الرسمية الحديثةالألمانية النمساويةالألمانية العليا ال" + - "سويسريةالإنجليزية الأستراليةالإنجليزية الكنديةالإنجليزية البريطانيةالإن" + - "جليزية الأمريكيةالإسبانية أمريكا اللاتينيةالإسبانية الأوروبيةالإسبانية " + - "المكسيكيةالفرنسية الكنديةالفرنسية السويسريةالسكسونية السفلىالفلمنكيةالب" + - "رتغالية البرازيليةالبرتغالية الأوروبيةالمولدوفيةصربية-كرواتيةالكونغو ال" + - "سواحليةالصينية المبسطةالصينية التقليدية" - -var arLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0022, 0x0032, 0x0048, 0x0058, 0x0068, 0x007c, - 0x008a, 0x009a, 0x00aa, 0x00ba, 0x00d2, 0x00e6, 0x00fc, 0x010e, - 0x0122, 0x0134, 0x0146, 0x0154, 0x0168, 0x0178, 0x018c, 0x019e, - 0x01b0, 0x01c4, 0x01ce, 0x01de, 0x01f5, 0x0207, 0x0217, 0x022d, - 0x023f, 0x0253, 0x0265, 0x0271, 0x0283, 0x0297, 0x02ab, 0x02bd, - 0x02cf, 0x02e2, 0x02f2, 0x0304, 0x0316, 0x0324, 0x0334, 0x0344, - 0x0356, 0x036a, 0x038f, 0x03a1, 0x03b5, 0x03cb, 0x03d9, 0x03e5, - 0x03f3, 0x0401, 0x0416, 0x0428, 0x044b, 0x045d, 0x046f, 0x047f, - // Entry 40 - 7F - 0x049a, 0x04b0, 0x04c4, 0x04d2, 0x04e9, 0x04fb, 0x0507, 0x051b, - 0x052d, 0x0541, 0x0553, 0x0561, 0x0571, 0x057f, 0x058d, 0x05a1, - 0x05bb, 0x05cf, 0x05df, 0x05ef, 0x05fd, 0x060f, 0x0621, 0x062f, - 0x063b, 0x064b, 0x065f, 0x0671, 0x0689, 0x0697, 0x06af, 0x06c1, - 0x06cf, 0x06e3, 0x06fc, 0x070c, 0x0722, 0x0736, 0x0746, 0x0758, - 0x0772, 0x0784, 0x0796, 0x07a8, 0x07b8, 0x07c8, 0x07d4, 0x07f5, - 0x0807, 0x0817, 0x0829, 0x084a, 0x0869, 0x0888, 0x0898, 0x08a8, - 0x08be, 0x08d0, 0x08e2, 0x08fb, 0x090d, 0x091f, 0x092d, 0x093f, - // Entry 80 - BF - 0x0951, 0x0965, 0x0977, 0x098b, 0x0997, 0x09a9, 0x09b7, 0x09d1, - 0x09e7, 0x09f9, 0x0a07, 0x0a24, 0x0a32, 0x0a44, 0x0a58, 0x0a6c, - 0x0a80, 0x0a8c, 0x0a9e, 0x0ab0, 0x0abe, 0x0acc, 0x0ae9, 0x0afd, - 0x0b0d, 0x0b1f, 0x0b31, 0x0b41, 0x0b53, 0x0b69, 0x0b7b, 0x0b8f, - 0x0ba1, 0x0bb1, 0x0bbf, 0x0bcd, 0x0bdb, 0x0bed, 0x0c01, 0x0c15, - 0x0c25, 0x0c37, 0x0c45, 0x0c59, 0x0c72, 0x0c82, 0x0c92, 0x0c9e, - 0x0cae, 0x0cc0, 0x0cd0, 0x0cde, 0x0cea, 0x0d00, 0x0d10, 0x0d24, - 0x0d32, 0x0d32, 0x0d48, 0x0d52, 0x0d62, 0x0d72, 0x0d72, 0x0d84, - // Entry C0 - FF - 0x0d84, 0x0da7, 0x0dca, 0x0dda, 0x0dea, 0x0e06, 0x0e06, 0x0e18, - 0x0e18, 0x0e33, 0x0e47, 0x0e47, 0x0e47, 0x0e51, 0x0e51, 0x0e61, - 0x0e61, 0x0e71, 0x0e81, 0x0e9a, 0x0e9a, 0x0ea6, 0x0eae, 0x0eae, - 0x0ec5, 0x0ed1, 0x0edf, 0x0edf, 0x0ee7, 0x0efc, 0x0efc, 0x0f1b, - 0x0f31, 0x0f43, 0x0f51, 0x0f51, 0x0f62, 0x0f76, 0x0f76, 0x0f76, - 0x0f86, 0x0f86, 0x0f92, 0x0f9a, 0x0fac, 0x0fc0, 0x0fd3, 0x0fe3, - 0x0ffc, 0x1008, 0x101a, 0x102c, 0x103a, 0x104c, 0x1056, 0x1066, - 0x107a, 0x108c, 0x1098, 0x10b3, 0x10c1, 0x10d7, 0x10e7, 0x10f5, - // Entry 100 - 13F - 0x1116, 0x1124, 0x1124, 0x113e, 0x1174, 0x1188, 0x1198, 0x11a8, - 0x11b0, 0x11c0, 0x11d0, 0x11e0, 0x11ec, 0x11fc, 0x120c, 0x1225, - 0x1225, 0x1233, 0x1252, 0x1265, 0x1273, 0x1285, 0x128d, 0x1299, - 0x1299, 0x12b6, 0x12c4, 0x12d2, 0x12f3, 0x12f3, 0x1303, 0x1303, - 0x130f, 0x1321, 0x1321, 0x132b, 0x132b, 0x1348, 0x1367, 0x1367, - 0x138c, 0x13af, 0x13c3, 0x13cb, 0x13d9, 0x13f2, 0x13fe, 0x140a, - 0x140a, 0x1418, 0x1435, 0x1435, 0x1461, 0x148f, 0x148f, 0x149b, - 0x14b1, 0x14bf, 0x14cd, 0x14ee, 0x1513, 0x1513, 0x1513, 0x1521, - // Entry 140 - 17F - 0x152b, 0x1537, 0x1552, 0x156e, 0x156e, 0x1584, 0x1590, 0x15a2, - 0x15bf, 0x15d8, 0x15e2, 0x15f0, 0x1606, 0x1616, 0x1628, 0x1628, - 0x1628, 0x1638, 0x1644, 0x1658, 0x1679, 0x1698, 0x1698, 0x16b1, - 0x16c1, 0x16d1, 0x16d9, 0x16e7, 0x16f1, 0x1709, 0x1715, 0x1727, - 0x1735, 0x174d, 0x174d, 0x1759, 0x1759, 0x1767, 0x1779, 0x178e, - 0x178e, 0x178e, 0x17a1, 0x17b1, 0x17c3, 0x17dc, 0x17f0, 0x1802, - 0x180e, 0x182f, 0x182f, 0x182f, 0x1841, 0x184f, 0x185d, 0x1872, - 0x188d, 0x189d, 0x18ad, 0x18bd, 0x18c7, 0x18d7, 0x18e5, 0x18f5, - // Entry 180 - 1BF - 0x18f5, 0x18f5, 0x18f5, 0x1901, 0x1901, 0x190d, 0x1919, 0x1936, - 0x1936, 0x1949, 0x1959, 0x1967, 0x196f, 0x197b, 0x198e, 0x198e, - 0x198e, 0x199e, 0x199e, 0x19aa, 0x19bc, 0x19ce, 0x19e0, 0x19ee, - 0x19f6, 0x1a04, 0x1a14, 0x1a20, 0x1a2c, 0x1a42, 0x1a63, 0x1a78, - 0x1a80, 0x1a9a, 0x1ab4, 0x1ac2, 0x1ad8, 0x1ae6, 0x1af2, 0x1af2, - 0x1afc, 0x1b11, 0x1b1d, 0x1b31, 0x1b45, 0x1b45, 0x1b45, 0x1b53, - 0x1b6b, 0x1b87, 0x1b99, 0x1bac, 0x1bcb, 0x1bdb, 0x1be7, 0x1bf3, - 0x1bf3, 0x1bff, 0x1c18, 0x1c26, 0x1c3f, 0x1c3f, 0x1c47, 0x1c64, - // Entry 1C0 - 1FF - 0x1c70, 0x1c93, 0x1ca7, 0x1cb9, 0x1cc7, 0x1cd5, 0x1ce3, 0x1d04, - 0x1d1c, 0x1d2c, 0x1d40, 0x1d58, 0x1d68, 0x1d68, 0x1d8b, 0x1d8b, - 0x1d8b, 0x1daa, 0x1daa, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dd4, 0x1dea, - 0x1e0f, 0x1e17, 0x1e17, 0x1e2f, 0x1e3f, 0x1e59, 0x1e59, 0x1e59, - 0x1e67, 0x1e75, 0x1e75, 0x1e75, 0x1e75, 0x1e8b, 0x1e95, 0x1ea7, - 0x1eb5, 0x1ed6, 0x1ee4, 0x1ef2, 0x1f04, 0x1f04, 0x1f0e, 0x1f18, - 0x1f26, 0x1f3c, 0x1f3c, 0x1f5b, 0x1f69, 0x1f71, 0x1f71, 0x1f7f, - 0x1f9a, 0x1fbd, 0x1fbd, 0x1fc9, 0x1fd3, 0x1ff2, 0x2002, 0x2002, - // Entry 200 - 23F - 0x2002, 0x201d, 0x2030, 0x2049, 0x2060, 0x2070, 0x2080, 0x209b, - 0x20a5, 0x20b8, 0x20b8, 0x20c8, 0x20d4, 0x20e6, 0x20f4, 0x2111, - 0x2123, 0x2123, 0x2123, 0x212f, 0x2137, 0x2147, 0x2153, 0x2163, - 0x216d, 0x217f, 0x217f, 0x2191, 0x21a7, 0x21a7, 0x21b9, 0x21d0, - 0x21e5, 0x21e5, 0x21fc, 0x21fc, 0x2210, 0x2210, 0x2222, 0x2232, - 0x2240, 0x224e, 0x2276, 0x2284, 0x2298, 0x22a8, 0x22b2, 0x22bc, - 0x22bc, 0x22bc, 0x22bc, 0x22bc, 0x22ca, 0x22ca, 0x22d8, 0x22e6, - 0x22f8, 0x2306, 0x2312, 0x2322, 0x2339, 0x2349, 0x2349, 0x2355, - // Entry 240 - 27F - 0x235f, 0x236d, 0x2379, 0x2381, 0x2381, 0x2399, 0x23ab, 0x23d5, - 0x23d5, 0x23e5, 0x241b, 0x2429, 0x2445, 0x244d, 0x2479, 0x2479, - 0x249e, 0x24d0, 0x24f9, 0x251c, 0x2545, 0x256c, 0x259e, 0x25c3, - 0x25e8, 0x25e8, 0x2607, 0x262a, 0x2649, 0x265b, 0x2684, 0x26ab, - 0x26bf, 0x26d8, 0x26f9, 0x2716, 0x2737, -} // Size: 1250 bytes - -const azLangStr string = "" + // Size: 3713 bytes - "afarabxazavestanafrikaansakanamhararaqonərəbassamavaraymaraazərbaycanbaş" + - "qırdbelarusbolqarbislamabambarabenqaltibetbretonbosniakkatalançeçençamor" + - "okorsikakriçexslavyançuvaşuelsdanimarkaalmanmaldivdzonqaeveyunaningilise" + - "sperantoispanestonbaskfarsfulafinficifarerfransızqərbi frizirlandŞotland" + - "iya keltcəsiqalisiyaquaraniqucaratmankshausaivrithindhiri motuxorvathait" + - "i kreolmacarermənihererointerlinquaindoneziyainterlinqveiqbosiçuan yiinu" + - "piaqidoislanditalyaninuktitutyaponyavagürcükonqokikuyukuanyamaqazaxkalaa" + - "llisutkxmerkannadakoreyakanurikəşmirkürdkomikornqırğızlatınlüksemburqqan" + - "dalimburqlinqalalaoslitvaluba-katanqalatışmalaqasmarşalmaorimakedonmalay" + - "alammonqolmarathimalaymaltabirmannauruşimali ndebelenepalndonqahollandnü" + - "norsk norveçbokmal norveçcənubi ndebelenavayonyancaoksitanocibvaoromoodi" + - "yaosetinpəncabpalipolyakpuştuportuqalkeçuaromanşrundirumınruskinyarvanda" + - "sanskritsardinsindhişimali samisanqosinhalaslovakslovensamoaşonasomalial" + - "banserbsvatisesotosundanisveçsuahilitamilteluqutaciktaytiqrintürkmənsvan" + - "atonqatürksonqatatartaxitiuyğurukraynaurduözbəkvendavyetnamvolapükvalunv" + - "olofxosaidişyorubaçjuançinzuluakinakoliadanqmeadugeafrihiliaqhemaynuakka" + - "daleutcənubi altayqədim ingilisangikaaramikmapuçearapahoaravakasuasturiy" + - "aavadhibalucballibasabejabembabenaqərbi bəlucbxoçpuribikolbinisiksikəbra" + - "jbodoburyatbuginblinkeddokaribatsamsebuançiqaçibçaçağatayçukizmariçinuk " + - "ləhçəsiçoktauçipevyançerokiçeyensorankoptkrım türkcəsikaşubyandakotadarq" + - "vataitadelaverslaveydoqribdinkazarmadoqriaşağı sorbdualaorta hollanddiol" + - "adyuladazaqaembuefikqədim misirekacukelamitorta ingilisevondofangfilippi" + - "nfonorta fransızqədim fransızşimali frisfriulqaqaqauzqanqayoqabayaqezqil" + - "bertorta yüksək almanqədim almanqondiqorontalogotçaqreboqədim yunanİsveç" + - "rə almancasıqusiqviçinhaydahakkahavayhiliqaynonhittitmonqyuxarı sorbsyan" + - "hupaibanibibioilokoinquşloğbannqombamaçamivrit-farsivrit-ərəbqaraqalpaqk" + - "abilekaçinjukambakavikabarda-çərkəztiyapmakondkabuverdiankoroxazixotanko" + - "yra çiinikakokalencinkimbundukomi-permyakkonkanikosreyankpelleqaraçay-ba" + - "lkarkarelkuruxşambalabafiakölnkumıkkutenaysefardlangiqərbi pəncablambalə" + - "zgilakotamonqolozişimali luriluba-lulualuysenolundaluomizoluyiamadurizma" + - "qahimaitilimakasarməndinqomasaymokşamandarmendemerumorisienorta irlandma" + - "xuva-meettometa’mikmakminanqkabanmançumanipürimohavkmosimundanqçoxsaylı " + - "dillərkrikmirandmaruarierzyamazandaranMin Nanneapolitannamaaşağı almanne" + - "variniasniyuankvasiongiemboonnoqayqədim norsnqoşimal sotonuernyamvezinya" + - "nkolnyoronzimaosageosmanpanqasinanpəhləvipampanqapapyamentopalayanniger " + - "kreolqədim farsfoyenikponpeyqədim provansalkiçeracastanirapanuirarotonqa" + - "nromboromanaromanruasandavesaxasamaritansamburusasaksantalnqambaysanqusi" + - "ciliyaskotscənubi kürdsenaselkupkoyraboro senniqədim irlandtaçelitşansid" + - "amocənubi samilule samiinari samiskolt samisoninkesoqdiyensranan tonqose" + - "rersahosukumasususumeryankomorsuriyatimnetesoterenotetumtiqretivtokelayk" + - "linqontlinqittamaşeknyasa tonqatok pisintarokosimşyantumbukatuvalutasava" + - "qtuvinyanMərkəzi Atlas tamazicəsiudmurtuqaritumbundurutvaivotikvunyovall" + - "esvalamovarayvaşovalpirivukalmıksoqayaoyapizyanqbenyembakantonzapotekbli" + - "simbolszenaqatamazizunidil məzmunu yoxdurzazamüasir standart ərəbcənubi " + - "azərbaycanAvstriya almancasıİsveçrə yüksək almancasıAvstraliya ingiliscə" + - "siKanada ingiliscəsiBritaniya ingiliscəsiAmerika ingiliscəsiLatın Amerik" + - "ası ispancasıKastiliya ispancasıMeksika ispancasıKanada fransızcasıİsveç" + - "rə fransızcasıaşağı saksonflamandBraziliya portuqalcasıPortuqaliya portu" + - "qalcasımoldavserb-xorvatKonqo suahilicəsisadələşmiş çinənənəvi çin" - -var azLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x0009, 0x0010, 0x0019, 0x001d, 0x0022, 0x0028, - 0x002e, 0x0033, 0x0037, 0x003d, 0x0048, 0x0051, 0x0058, 0x005e, - 0x0065, 0x006c, 0x0072, 0x0077, 0x007d, 0x0084, 0x008b, 0x0092, - 0x0099, 0x00a0, 0x00a3, 0x00a7, 0x00ae, 0x00b5, 0x00b9, 0x00c2, - 0x00c7, 0x00cd, 0x00d3, 0x00d6, 0x00db, 0x00e2, 0x00eb, 0x00f0, - 0x00f5, 0x00f9, 0x00fd, 0x0101, 0x0104, 0x0108, 0x010d, 0x0115, - 0x0120, 0x0126, 0x013b, 0x0143, 0x014a, 0x0151, 0x0156, 0x015b, - 0x0160, 0x0164, 0x016d, 0x0173, 0x017e, 0x0183, 0x018a, 0x0190, - // Entry 40 - 7F - 0x019b, 0x01a5, 0x01b0, 0x01b4, 0x01be, 0x01c5, 0x01c8, 0x01ce, - 0x01d5, 0x01de, 0x01e3, 0x01e7, 0x01ee, 0x01f3, 0x01f9, 0x0201, - 0x0206, 0x0211, 0x0216, 0x021d, 0x0223, 0x0229, 0x0231, 0x0236, - 0x023a, 0x023e, 0x0247, 0x024d, 0x0258, 0x025d, 0x0264, 0x026b, - 0x026f, 0x0274, 0x0280, 0x0287, 0x028e, 0x0295, 0x029a, 0x02a1, - 0x02aa, 0x02b0, 0x02b7, 0x02bc, 0x02c1, 0x02c7, 0x02cc, 0x02db, - 0x02e0, 0x02e6, 0x02ed, 0x02fd, 0x030b, 0x031a, 0x0320, 0x0326, - 0x032d, 0x0333, 0x0338, 0x033d, 0x0343, 0x034a, 0x034e, 0x0354, - // Entry 80 - BF - 0x035a, 0x0362, 0x0368, 0x036f, 0x0374, 0x037a, 0x037d, 0x0388, - 0x0390, 0x0396, 0x039c, 0x03a8, 0x03ad, 0x03b4, 0x03ba, 0x03c0, - 0x03c5, 0x03ca, 0x03d0, 0x03d5, 0x03d9, 0x03de, 0x03e4, 0x03ea, - 0x03f0, 0x03f7, 0x03fc, 0x0402, 0x0407, 0x040a, 0x0410, 0x0419, - 0x041e, 0x0423, 0x0428, 0x042d, 0x0432, 0x0438, 0x043e, 0x0445, - 0x0449, 0x0450, 0x0455, 0x045c, 0x0464, 0x0469, 0x046e, 0x0472, - 0x0477, 0x047d, 0x0483, 0x0487, 0x048b, 0x048f, 0x0494, 0x049b, - 0x04a0, 0x04a0, 0x04a8, 0x04ad, 0x04b1, 0x04b6, 0x04b6, 0x04bb, - // Entry C0 - FF - 0x04bb, 0x04c8, 0x04d6, 0x04dc, 0x04e2, 0x04e9, 0x04e9, 0x04f0, - 0x04f0, 0x04f0, 0x04f6, 0x04f6, 0x04f6, 0x04f9, 0x04f9, 0x0501, - 0x0501, 0x0507, 0x050c, 0x0511, 0x0511, 0x0515, 0x0515, 0x0515, - 0x0515, 0x0519, 0x051e, 0x051e, 0x0522, 0x0522, 0x0522, 0x052f, - 0x0538, 0x053d, 0x0541, 0x0541, 0x0541, 0x0549, 0x0549, 0x0549, - 0x054d, 0x054d, 0x0551, 0x0551, 0x0557, 0x055c, 0x055c, 0x0560, - 0x0560, 0x0565, 0x056a, 0x056a, 0x056f, 0x0575, 0x057a, 0x0581, - 0x058a, 0x0590, 0x0594, 0x05a5, 0x05ac, 0x05b5, 0x05bc, 0x05c2, - // Entry 100 - 13F - 0x05c7, 0x05cb, 0x05cb, 0x05db, 0x05db, 0x05e4, 0x05ea, 0x05f0, - 0x05f5, 0x05fc, 0x0602, 0x0608, 0x060d, 0x0612, 0x0617, 0x0624, - 0x0624, 0x0629, 0x0635, 0x063a, 0x063f, 0x0645, 0x0649, 0x064d, - 0x064d, 0x0659, 0x065f, 0x0665, 0x0671, 0x0671, 0x0677, 0x0677, - 0x067b, 0x0683, 0x0683, 0x0686, 0x0686, 0x0693, 0x06a2, 0x06a2, - 0x06ae, 0x06ae, 0x06b3, 0x06b5, 0x06bb, 0x06be, 0x06c2, 0x06c8, - 0x06c8, 0x06cb, 0x06d2, 0x06d2, 0x06e5, 0x06f1, 0x06f1, 0x06f6, - 0x06ff, 0x0705, 0x070a, 0x0716, 0x072b, 0x072b, 0x072b, 0x072f, - // Entry 140 - 17F - 0x0736, 0x073b, 0x0740, 0x0745, 0x0745, 0x074f, 0x0755, 0x0759, - 0x0765, 0x0769, 0x076d, 0x0771, 0x0777, 0x077c, 0x0782, 0x0782, - 0x0782, 0x0789, 0x078f, 0x0795, 0x079f, 0x07ab, 0x07ab, 0x07b5, - 0x07bb, 0x07c1, 0x07c3, 0x07c8, 0x07cc, 0x07dd, 0x07dd, 0x07e2, - 0x07e8, 0x07f3, 0x07f3, 0x07f7, 0x07f7, 0x07fb, 0x0800, 0x080c, - 0x080c, 0x080c, 0x0810, 0x0818, 0x0820, 0x082c, 0x0833, 0x083b, - 0x0841, 0x0850, 0x0850, 0x0850, 0x0855, 0x085a, 0x0862, 0x0867, - 0x086c, 0x0872, 0x0879, 0x087f, 0x0884, 0x0892, 0x0897, 0x089d, - // Entry 180 - 1BF - 0x089d, 0x089d, 0x089d, 0x08a3, 0x08a3, 0x08a8, 0x08ac, 0x08b8, - 0x08b8, 0x08c2, 0x08c9, 0x08ce, 0x08d1, 0x08d5, 0x08da, 0x08da, - 0x08da, 0x08e1, 0x08e1, 0x08e7, 0x08ee, 0x08f5, 0x08fe, 0x0903, - 0x0903, 0x0909, 0x090f, 0x0914, 0x0918, 0x0920, 0x092b, 0x0938, - 0x093f, 0x0945, 0x0950, 0x0956, 0x095f, 0x0965, 0x0969, 0x0969, - 0x0970, 0x0982, 0x0986, 0x098c, 0x0993, 0x0993, 0x0993, 0x0998, - 0x09a2, 0x09a9, 0x09b3, 0x09b7, 0x09c5, 0x09cb, 0x09cf, 0x09d5, - 0x09d5, 0x09db, 0x09e4, 0x09e9, 0x09f4, 0x09f4, 0x09f7, 0x0a02, - // Entry 1C0 - 1FF - 0x0a06, 0x0a06, 0x0a0e, 0x0a15, 0x0a1a, 0x0a1f, 0x0a24, 0x0a29, - 0x0a33, 0x0a3c, 0x0a44, 0x0a4e, 0x0a55, 0x0a55, 0x0a60, 0x0a60, - 0x0a60, 0x0a6b, 0x0a6b, 0x0a72, 0x0a72, 0x0a72, 0x0a78, 0x0a78, - 0x0a88, 0x0a8d, 0x0a8d, 0x0a96, 0x0a9d, 0x0aa7, 0x0aa7, 0x0aa7, - 0x0aac, 0x0ab1, 0x0ab1, 0x0ab1, 0x0ab1, 0x0ab7, 0x0aba, 0x0ac1, - 0x0ac5, 0x0ace, 0x0ad5, 0x0ada, 0x0ae0, 0x0ae0, 0x0ae7, 0x0aec, - 0x0af4, 0x0af9, 0x0af9, 0x0b06, 0x0b06, 0x0b0a, 0x0b0a, 0x0b10, - 0x0b1f, 0x0b2c, 0x0b2c, 0x0b34, 0x0b38, 0x0b38, 0x0b3e, 0x0b3e, - // Entry 200 - 23F - 0x0b3e, 0x0b4a, 0x0b53, 0x0b5d, 0x0b67, 0x0b6e, 0x0b76, 0x0b82, - 0x0b87, 0x0b8b, 0x0b8b, 0x0b91, 0x0b95, 0x0b9d, 0x0ba2, 0x0ba2, - 0x0ba8, 0x0ba8, 0x0ba8, 0x0bad, 0x0bb1, 0x0bb7, 0x0bbc, 0x0bc1, - 0x0bc4, 0x0bcb, 0x0bcb, 0x0bd2, 0x0bd9, 0x0bd9, 0x0be1, 0x0bec, - 0x0bf5, 0x0bf5, 0x0bfb, 0x0bfb, 0x0c03, 0x0c03, 0x0c0a, 0x0c10, - 0x0c17, 0x0c1f, 0x0c3a, 0x0c40, 0x0c46, 0x0c4d, 0x0c50, 0x0c53, - 0x0c53, 0x0c53, 0x0c53, 0x0c53, 0x0c58, 0x0c58, 0x0c5d, 0x0c63, - 0x0c69, 0x0c6e, 0x0c73, 0x0c7a, 0x0c7c, 0x0c83, 0x0c83, 0x0c87, - // Entry 240 - 27F - 0x0c8a, 0x0c8f, 0x0c96, 0x0c9b, 0x0c9b, 0x0ca1, 0x0ca8, 0x0cb2, - 0x0cb2, 0x0cb8, 0x0cbe, 0x0cc2, 0x0cd5, 0x0cd9, 0x0cf0, 0x0d03, - 0x0d16, 0x0d34, 0x0d4b, 0x0d5e, 0x0d74, 0x0d88, 0x0da4, 0x0db8, - 0x0dca, 0x0dca, 0x0dde, 0x0df6, 0x0e05, 0x0e0c, 0x0e23, 0x0e3c, - 0x0e42, 0x0e4d, 0x0e5f, 0x0e72, 0x0e81, -} // Size: 1250 bytes - -const bgLangStr string = "" + // Size: 7891 bytes - "афарабхазкиавестскиафрикаансаканамхарскиарагонскиарабскиасамскиаварскиай" + - "мараазербайджанскибашкирскибеларускибългарскибисламабамбарабенгалскитиб" + - "етскибретонскибосненскикаталонскичеченскичаморокорсиканскикриичешкицърк" + - "овнославянскичувашкиуелскидатскинемскидивехидзонхаевегръцкианглийскиесп" + - "ерантоиспанскиестонскибаскиперсийскифулафинскифиджийскифарьорскифренски" + - "фризийскиирландскишотландски галскигалисийскигуаранигуджаратиманкскихау" + - "заивритхиндихири мотухърватскихаитянски креолскиунгарскиарменскихерерои" + - "нтерлингваиндонезийскиоксиденталигбосъчуански иинупиакидоисландскиитали" + - "анскиинуктитутяпонскияванскигрузинскиконгоанскикикуюкванямаказахскигрен" + - "ландскикхмерскиканнадакорейскиканурикашмирскикюрдскикомикорнуолскикирги" + - "зкилатинскилюксембургскигандалимбургскилингалалаоскилитовскилуба катанг" + - "алатвийскималгашкимаршалеземаорскимакедонскималаяламмонголскимаратимала" + - "йскималтийскибирманскинаурусеверен ндебеленепалскиндонганидерландскинор" + - "вежки (нюношк)норвежки (букмол)южен ндебеленавахонянджаокситанскиоджибв" + - "аоромоорияосетскипенджабскипалиполскипущупортугалскикечуаретороманскиру" + - "ндирумънскирускикиняруандасанскритсардинскисиндхисеверносаамскисангосин" + - "халскисловашкисловенскисамоанскишонасомалийскиалбанскисръбскисватисесот" + - "осунданскишведскисуахилитамилскителугутаджикскитайскитигринятуркменскит" + - "сванатонгатурскицонгататарскитаитянскиуйгурскиукраинскиурдуузбекскивенд" + - "авиетнамскиволапюквалонскиволофксосаидишйорубазуангкитайскизулускиачинс" + - "киаколиадангмеадигеафрихилиагемайнуакадскиалеутскиюжноалтайскистароангл" + - "ийскиангикаарамейскимапучеарапахоаравакасуастурскиавадибалучибалийскиба" + - "сабеябембабеназападен балочибожпурибиколскибинисиксикабраджбодобурятски" + - "бугинскибиленскикаддокарибскиатсамсебуаночигачибчачагатайчуукмарийскижа" + - "ргон чинуукчокточиипувскичерокичейенскикюрдски (централен)коптскикримск" + - "отатарскисеселва, креолски френскикашубскидакотскидаргватаитаделауерсле" + - "йвидогрибдинказармадогридолносръбскидуаласредновековен холандскидиолади" + - "уладазагаембуефикдревноегипетскиекажукеламитскисредновековен английские" + - "вондофангфилипинскифонсредновековен френскистарофренскисеверен фризскии" + - "зточнофризийскифриулианскигагагаузкигайогбаягиизгилбертскисредновисокон" + - "емскистаровисоконемскигондигоронталоготическигребодревногръцкишвейцарск" + - "и немскигусиигвичинхайдахавайскихилигайнонхитскихмонггорнолужишкихупаиб" + - "анибибиоилокоингушетскиложбаннгомбамачамеюдео-персийскиюдео-арабскикара" + - "калпашкикабилскикачинскижжукамбакавикабардиантуапмакондекабовердианскик" + - "орокхасикотскикойра чииникакокаленджинкимбундукоми-пермякскиконканикоср" + - "аенкпелекарачай-балкарскикарелскикурукшамбалабафиякьолнскикумикскикутен" + - "айладинолангилахндаламбалезгинскилакотамонголозисеверен лурилуба-лулуал" + - "уисеньолундалуомизолуямадурскимагахимайтхилимакасармандингомасайскимокш" + - "амандармендемеруморисиенсредновековен ирландскимакуа метометамикмакмина" + - "нгкабауманджурскиманипуримохоукмосимундангмногоезичникрикмирандийскимар" + - "вариерзиамазандаринеаполитанскинамадолнонемскиневарскиниасниуеанквасион" + - "гиембунногаистаронорвежкинкосеверен сотонуеркласически невариниамвезини" + - "анколенуоронзимаосейджиотомански турскипангасинанпахлавипампангапапиаме" + - "нтопалауаннигерийски пиджинстароперсийскифиникийскипонапеанпрускистароп" + - "ровансалскикичераджастанскирапа нуираротонгаромборомскиарумънскирвасанд" + - "авеякутскисамаритански арамейскисамбурусасаксанталингамбайсангусицилиан" + - "скишотландскиюжнокюрдскисенаселкупкойраборо сенистароирландскиташелхитш" + - "ансидамоюжносаамскилуле-саамскиинари-саамскисколт-саамскисонинкесогдийс" + - "кисранан тонгосерерсахосукумасусушумерскикоморскикласически сирийскисир" + - "ийскитемнетесотеренотетумтигретивтокелайскиклингонскитлингиттамашекниан" + - "са тонгаток писинтарокоцимшианскитумбукатувалуанскитасавактувинскицентр" + - "алноатласки тамазигтудмуртскиугаритскиумбундуроотваивотиквунджовалзерск" + - "и немскиваламоварайуашовалпирикалмиксогаяояпезеянгбенйембакантонскизапо" + - "текблис символизенагастандартен марокански тамазигтзунибез лингвистично" + - " съдържаниезазасъвременен стандартен арабскианглийски (САЩ)долносаксонск" + - "ифламандскимолдовскисърбохърватскиконгоански суахиликитайски (опростен)" - -var bgLangIdx = []uint16{ // 612 elements - // Entry 0 - 3F - 0x0000, 0x0008, 0x0016, 0x0026, 0x0038, 0x0040, 0x0050, 0x0062, - 0x0070, 0x007e, 0x008c, 0x0098, 0x00b4, 0x00c6, 0x00d8, 0x00ea, - 0x00f8, 0x0106, 0x0118, 0x0128, 0x013a, 0x014c, 0x0160, 0x0170, - 0x017c, 0x0192, 0x019a, 0x01a4, 0x01c6, 0x01d4, 0x01e0, 0x01ec, - 0x01f8, 0x0204, 0x0210, 0x0216, 0x0222, 0x0234, 0x0246, 0x0256, - 0x0266, 0x0270, 0x0282, 0x028a, 0x0296, 0x02a8, 0x02ba, 0x02c8, - 0x02da, 0x02ec, 0x030d, 0x0321, 0x032f, 0x0341, 0x034f, 0x0359, - 0x0363, 0x036d, 0x037e, 0x0390, 0x03b3, 0x03c3, 0x03d3, 0x03df, - // Entry 40 - 7F - 0x03f5, 0x040d, 0x0421, 0x0429, 0x043e, 0x044c, 0x0452, 0x0464, - 0x0478, 0x048a, 0x0498, 0x04a6, 0x04b8, 0x04cc, 0x04d6, 0x04e4, - 0x04f4, 0x050a, 0x051a, 0x0528, 0x0538, 0x0544, 0x0556, 0x0564, - 0x056c, 0x0580, 0x0590, 0x05a0, 0x05ba, 0x05c4, 0x05d8, 0x05e6, - 0x05f2, 0x0602, 0x0619, 0x062b, 0x063b, 0x064d, 0x065b, 0x066f, - 0x067f, 0x0691, 0x069d, 0x06ad, 0x06bf, 0x06d1, 0x06db, 0x06f8, - 0x0708, 0x0714, 0x072c, 0x074b, 0x076a, 0x0781, 0x078d, 0x0799, - 0x07ad, 0x07bb, 0x07c5, 0x07cd, 0x07db, 0x07ef, 0x07f7, 0x0803, - // Entry 80 - BF - 0x080b, 0x0821, 0x082b, 0x0843, 0x084d, 0x085d, 0x0867, 0x087b, - 0x088b, 0x089d, 0x08a9, 0x08c5, 0x08cf, 0x08e1, 0x08f1, 0x0903, - 0x0915, 0x091d, 0x0931, 0x0941, 0x094f, 0x0959, 0x0965, 0x0977, - 0x0985, 0x0993, 0x09a3, 0x09af, 0x09c1, 0x09cd, 0x09db, 0x09ef, - 0x09fb, 0x0a05, 0x0a11, 0x0a1b, 0x0a2b, 0x0a3d, 0x0a4d, 0x0a5f, - 0x0a67, 0x0a77, 0x0a81, 0x0a95, 0x0aa3, 0x0ab3, 0x0abd, 0x0ac7, - 0x0acf, 0x0adb, 0x0ae5, 0x0af5, 0x0b03, 0x0b11, 0x0b1b, 0x0b29, - 0x0b33, 0x0b33, 0x0b43, 0x0b4b, 0x0b53, 0x0b61, 0x0b61, 0x0b71, - // Entry C0 - FF - 0x0b71, 0x0b89, 0x0ba5, 0x0bb1, 0x0bc3, 0x0bcf, 0x0bcf, 0x0bdd, - 0x0bdd, 0x0bdd, 0x0be9, 0x0be9, 0x0be9, 0x0bef, 0x0bef, 0x0bff, - 0x0bff, 0x0c09, 0x0c15, 0x0c25, 0x0c25, 0x0c2d, 0x0c2d, 0x0c2d, - 0x0c2d, 0x0c33, 0x0c3d, 0x0c3d, 0x0c45, 0x0c45, 0x0c45, 0x0c60, - 0x0c6e, 0x0c7e, 0x0c86, 0x0c86, 0x0c86, 0x0c94, 0x0c94, 0x0c94, - 0x0c9e, 0x0c9e, 0x0ca6, 0x0ca6, 0x0cb6, 0x0cc6, 0x0cc6, 0x0cd6, - 0x0cd6, 0x0ce0, 0x0cf0, 0x0cf0, 0x0cfa, 0x0d08, 0x0d10, 0x0d1a, - 0x0d28, 0x0d30, 0x0d40, 0x0d59, 0x0d63, 0x0d75, 0x0d81, 0x0d91, - // Entry 100 - 13F - 0x0db4, 0x0dc2, 0x0dc2, 0x0de0, 0x0e0f, 0x0e1f, 0x0e2f, 0x0e3b, - 0x0e45, 0x0e53, 0x0e5f, 0x0e6b, 0x0e75, 0x0e7f, 0x0e89, 0x0ea1, - 0x0ea1, 0x0eab, 0x0ed8, 0x0ee2, 0x0eec, 0x0ef8, 0x0f00, 0x0f08, - 0x0f08, 0x0f26, 0x0f32, 0x0f44, 0x0f71, 0x0f71, 0x0f7d, 0x0f7d, - 0x0f85, 0x0f99, 0x0f99, 0x0f9f, 0x0f9f, 0x0fc8, 0x0fe0, 0x0fe0, - 0x0ffd, 0x101d, 0x1033, 0x1037, 0x1047, 0x1047, 0x104f, 0x1057, - 0x1057, 0x105f, 0x1073, 0x1073, 0x1097, 0x10b9, 0x10b9, 0x10c3, - 0x10d5, 0x10e7, 0x10f1, 0x1109, 0x112a, 0x112a, 0x112a, 0x1134, - // Entry 140 - 17F - 0x1140, 0x114a, 0x114a, 0x115a, 0x115a, 0x116e, 0x117a, 0x1184, - 0x119c, 0x119c, 0x11a4, 0x11ac, 0x11b8, 0x11c2, 0x11d6, 0x11d6, - 0x11d6, 0x11e2, 0x11ee, 0x11fa, 0x1215, 0x122c, 0x122c, 0x1244, - 0x1254, 0x1264, 0x126a, 0x1274, 0x127c, 0x128e, 0x128e, 0x1296, - 0x12a4, 0x12c0, 0x12c0, 0x12c8, 0x12c8, 0x12d2, 0x12de, 0x12f3, - 0x12f3, 0x12f3, 0x12fb, 0x130d, 0x131d, 0x1338, 0x1346, 0x1354, - 0x135e, 0x137f, 0x137f, 0x137f, 0x138f, 0x1399, 0x13a7, 0x13b1, - 0x13c1, 0x13d1, 0x13df, 0x13eb, 0x13f5, 0x1401, 0x140b, 0x141d, - // Entry 180 - 1BF - 0x141d, 0x141d, 0x141d, 0x1429, 0x1429, 0x1433, 0x143b, 0x1452, - 0x1452, 0x1465, 0x1475, 0x147f, 0x1485, 0x148d, 0x1493, 0x1493, - 0x1493, 0x14a3, 0x14a3, 0x14af, 0x14bf, 0x14cd, 0x14dd, 0x14ed, - 0x14ed, 0x14f7, 0x1503, 0x150d, 0x1515, 0x1525, 0x1552, 0x1565, - 0x156d, 0x1579, 0x158f, 0x15a3, 0x15b3, 0x15bf, 0x15c7, 0x15c7, - 0x15d5, 0x15eb, 0x15f3, 0x1609, 0x1617, 0x1617, 0x1617, 0x1621, - 0x1633, 0x1633, 0x164d, 0x1655, 0x166b, 0x167b, 0x1683, 0x168f, - 0x168f, 0x169b, 0x16ab, 0x16b5, 0x16cf, 0x16cf, 0x16d5, 0x16ec, - // Entry 1C0 - 1FF - 0x16f4, 0x1715, 0x1725, 0x1735, 0x173f, 0x1749, 0x1757, 0x1776, - 0x178a, 0x1798, 0x17a8, 0x17bc, 0x17ca, 0x17ca, 0x17eb, 0x17eb, - 0x17eb, 0x1807, 0x1807, 0x181b, 0x181b, 0x181b, 0x182b, 0x1837, - 0x1859, 0x1861, 0x1861, 0x1879, 0x1888, 0x189a, 0x189a, 0x189a, - 0x18a4, 0x18b0, 0x18b0, 0x18b0, 0x18b0, 0x18c2, 0x18c8, 0x18d6, - 0x18e4, 0x190f, 0x191d, 0x1927, 0x1935, 0x1935, 0x1943, 0x194d, - 0x1963, 0x1977, 0x1977, 0x198d, 0x198d, 0x1995, 0x1995, 0x19a1, - 0x19bc, 0x19d8, 0x19d8, 0x19e8, 0x19ee, 0x19ee, 0x19fa, 0x19fa, - // Entry 200 - 23F - 0x19fa, 0x1a10, 0x1a27, 0x1a40, 0x1a59, 0x1a67, 0x1a79, 0x1a90, - 0x1a9a, 0x1aa2, 0x1aa2, 0x1aae, 0x1ab6, 0x1ac6, 0x1ad6, 0x1afb, - 0x1b0b, 0x1b0b, 0x1b0b, 0x1b15, 0x1b1d, 0x1b29, 0x1b33, 0x1b3d, - 0x1b43, 0x1b57, 0x1b57, 0x1b6b, 0x1b79, 0x1b79, 0x1b87, 0x1b9e, - 0x1baf, 0x1baf, 0x1bbb, 0x1bbb, 0x1bcf, 0x1bcf, 0x1bdd, 0x1bf3, - 0x1c01, 0x1c11, 0x1c42, 0x1c54, 0x1c66, 0x1c74, 0x1c7c, 0x1c82, - 0x1c82, 0x1c82, 0x1c82, 0x1c82, 0x1c8c, 0x1c8c, 0x1c98, 0x1cb7, - 0x1cc3, 0x1ccd, 0x1cd5, 0x1ce3, 0x1ce3, 0x1cef, 0x1cef, 0x1cf7, - // Entry 240 - 27F - 0x1cfb, 0x1d05, 0x1d11, 0x1d1b, 0x1d1b, 0x1d2d, 0x1d3b, 0x1d52, - 0x1d52, 0x1d5e, 0x1d98, 0x1da0, 0x1dd4, 0x1ddc, 0x1e14, 0x1e14, - 0x1e14, 0x1e14, 0x1e14, 0x1e14, 0x1e14, 0x1e2f, 0x1e2f, 0x1e2f, - 0x1e2f, 0x1e2f, 0x1e2f, 0x1e2f, 0x1e4b, 0x1e5f, 0x1e5f, 0x1e5f, - 0x1e71, 0x1e8d, 0x1eb0, 0x1ed3, -} // Size: 1248 bytes - -const bnLangStr string = "" + // Size: 12336 bytes - "আফারআবখাজিয়ানআবেস্তীয়আফ্রিকানআকানআমহারিকআর্গোনিজআরবীআসামিআভেরিকআয়মারা" + - "আজারবাইজানীবাশকিরবেলারুশিয়বুলগেরিয়বিসলামাবামবারাবাংলাতিব্বতিব্রেটনবস" + - "নীয়ানকাতালানচেচেনচামোরোকর্সিকানক্রিচেকচার্চ স্লাভিকচুবাসওয়েলশডেনিশজা" + - "র্মানদিবেহিজোঙ্গাইউয়িগ্রিকইংরেজিএস্পেরান্তোস্প্যানিশএস্তোনীয়বাস্কফার" + - "্সিফুলাহ্ফিনিশফিজিআনফারোসফরাসিপশ্চিম ফ্রিসিয়ানআইরিশস্কটস-গ্যেলিকগ্যাল" + - "িশিয়গুয়ারানিগুজরাটিম্যাঙ্কসহাউসাহিব্রুহিন্দিহিরি মোতুক্রোয়েশীয়হাইত" + - "িয়ানহাঙ্গেরীয়আর্মেনিয়হেরেরোইন্টারলিঙ্গুয়াইন্দোনেশীয়ইন্টারলিঙ্গইগ্" + - "\u200cবোসিচুয়ান য়িইনুপিয়াকইডোআইসল্যান্ডীয়ইতালিয়ইনুক্টিটুটজাপানিজাভা" + - "নিজজর্জিয়ানকঙ্গোকিকুয়ুকোয়ানিয়ামাকাজাখক্যালাল্লিসুটখমেরকন্নড়কোরিয়" + - "ানকানুরিকাশ্মীরিকুর্দিশকোমিকর্ণিশকির্গিজলাটিনলুক্সেমবার্গীয়গান্ডালিম্" + - "বুর্গিশলিঙ্গালালাওলিথুয়েনীয়লুবা-কাটাঙ্গালাত্\u200cভীয়মালাগাসিমার্শা" + - "লিজমাওরিম্যাসিডোনীয়মালায়ালামমঙ্গোলিয়মারাঠিমালয়মল্টিয়বর্মিনাউরুউত্" + - "তর এন্দেবিলিনেপালীএন্দোঙ্গাডাচনরওয়েজীয়ান নিনর্স্কনরওয়েজিয়ান বোকমাল" + - "দক্ষিণ এনডেবেলেনাভাজোনায়াঞ্জাঅক্সিটানওজিবওয়াঅরোমোওড়িয়াওসেটিকপাঞ্জা" + - "বীপালিপোলিশপাশ্তুপর্তুগীজকেচুয়ারোমান্সরুন্দিরোমানীয়রুশকিনয়ারোয়ান্ড" + - "াসংস্কৃতসার্ডিনিয়ানসিন্ধিউত্তরাঞ্চলীয় সামিসাঙ্গোসিংহলীস্লোভাকস্লোভেন" + - "ীয়সামোয়ানশোনাসোমালিআলবেনীয়সার্বীয়সোয়াতিদক্ষিন সোথোসুদানীসুইডিশসোয" + - "়াহিলিতামিলতেলেগুতাজিকথাইতিগরিনিয়াতুর্কমেনীসোয়ানাটোঙ্গানতুর্কীসঙ্গাত" + - "াতারতাহিতিয়ানউইঘুরইউক্রেনীয়উর্দুউজবেকীয়ভেন্ডাভিয়েতনামীভোলাপুকওয়াল" + - "ুনউওলোফজোসায়িদ্দিশইওরুবাঝু্য়াঙচীনাজুলুঅ্যাচাইনিজআকোলিঅদাগ্মেআদেগেআফ্" + - "রিহিলিএঘেমআইনুআক্কাদিয়ানআলেউতদক্ষিন আলতাইপ্রাচীন ইংরেজীআঙ্গিকাআরামাইক" + - "মাপুচিআরাপাহোআরাওয়াকআসুআস্তুরিয়আওয়াধিবেলুচীবালিনীয়বাসাবেজাবেম্বাবে" + - "নাপশ্চিম বালোচিভোজপুরিবিকোলবিনিসিকসিকাব্রাজবোড়োবুরিয়াতবুগিনিব্লিনক্য" + - "াডোক্যারিবআত্সামচেবুয়ানোচিগাচিবচাচাগাতাইচুকিমারিচিনুক জার্গনচকটোওচিপে" + - "ওয়ানচেরোকীশাইয়েনমধ্য কুর্দিশকপটিকক্রিমিয়ান তুর্কিসেসেলওয়া ক্রেওল ফ" + - "্রেঞ্চকাশুবিয়ানডাকোটাদার্গওয়াতাইতাডেলাওয়েরস্ল্যাভদোগ্রীবডিংকাজার্মা" + - "ডোগরিনিম্নতর সোর্বিয়ানদুয়ালামধ্য ডাচজলা-ফনীডিউলাদাগাজাএম্বুএফিকপ্রাচ" + - "ীন মিশরীয়ইকাজুকএলামাইটমধ্য ইংরেজিইওন্ডোফ্যাঙ্গফিলিপিনোফনমধ্য ফরাসিপ্র" + - "াচীন ফরাসিউত্তরাঞ্চলীয় ফ্রিসিয়ানপূর্ব ফ্রিসিয়ফ্রিউলিয়ানগাগাগাউজgan" + - "গায়োবায়াগীজগিলবার্টিজমধ্য-উচ্চ জার্মানিপ্রাচীন উচ্চ জার্মানিগোন্ডিগো" + - "রোন্তালোগথিকগ্রেবোপ্রাচীন গ্রীকসুইস জার্মানগুসীগওইচ্’ইনহাইডাhakহাওয়াই" + - "য়ানহিলিগ্যায়নোনহিট্টিটহ্\u200cমোঙউচ্চ সোর্বিয়ানXiang চীনাহুপাইবানইব" + - "িবিওইলোকোইঙ্গুশলোজবানগোম্বামাকামেজুদেও ফার্সিজুদেও আরবিকারা-কাল্পাককাব" + - "াইলেকাচিনঅজ্জুকাম্বাকাউইকাবার্ডিয়ানটাইয়াপমাকোন্দেকাবুভারদিয়ানুকোরোখ" + - "াশিখোটানিজকোয়রা চীনিকাকোকালেনজিনকিম্বুন্দুকমি-পারমিআককোঙ্কানিকোস্রাইন" + - "ক্\u200cপেল্লেকারচে-বাল্কারকারেলিয়ানকুরুখশাম্বালাবাফিয়াকল্শকুমিককুটে" + - "নাইলাডিনোলাঙ্গিলান্ডালাম্বালেজঘিয়ানলাকোটামোঙ্গোলোজিউত্তর লুরিলুবা-লুল" + - "ুয়ালুইসেনোলুন্ডালুয়োমিজোলুইয়ামাদুরেসেমাগাহিমৈথিলিম্যাকাসারম্যান্ডিঙ" + - "্গোমাসাইমোকশাম্যাণ্ডারমেন্ডেমেরুমরিসিয়ানমধ্য আইরিশমাখুয়া-মেত্তোমেটাম" + - "িকম্যাকমিনাঙ্গ্\u200cকাবাউমাঞ্চুমণিপুরীমোহাওকমসিমুদাঙ্গএকাধিক ভাষাক্রি" + - "কমিরান্ডিজমারোয়ারিএরজিয়ামাজানদেরানিnanনেয়াপোলিটাননামানিম্ন জার্মানি" + - "নেওয়ারিনিয়াসনিউয়ানকোয়াসিওনিঙ্গেম্বুননোগাইপ্রাচীন নর্সএন’কোউত্তরাঞ্" + - "চলীয় সোথোনুয়ারপ্রাচীন নেওয়ারীন্যায়ামওয়েজিন্যায়াঙ্কোলেন্যোরোএনজিম" + - "াওসেজঅটোমান তুর্কিপাঙ্গাসিনানপাহ্লাভিপাম্পাঙ্গাপাপিয়ামেন্টোপালায়ুয়া" + - "ননাজেরিয় পিজিনপ্রাচীন ফার্সিফোনিশীয়ানপোহ্নপেইয়ানপ্রুশিয়ানপ্রাচীন প" + - "্রোভেনসালকি‘চেরাজস্থানীরাপানুইরারোটোংগানরম্বোরোমানিআরমেনিয়ানরাওয়াস্য" + - "ান্ডাওয়েশাখাসামারিটান আরামিকসামবুরুসাসাকসাঁওতালিন্যাগাম্বেসাঙ্গুসিসিল" + - "িয়ানস্কটসদক্ষিণ কুর্দিশসেনাসেল্কুপকোয়রাবেনো সেন্নীপ্রাচীন আইরিশতাচেল" + - "হিতশানসিডামোদক্ষিণাঞ্চলীয় সামিলুলে সামিইনারি সামিস্কোল্ট সামিসোনিঙ্কে" + - "সোগডিয়ানস্রানান টোঙ্গোসেরেরসাহোসুকুমাসুসুসুমেরীয়কমোরিয়ানপ্রাচীন সির" + - "িওসিরিয়াকটাইম্নেতেসোতেরেনোতেতুমটাইগ্রেটিভটোকেলাউক্লিঙ্গনত্লিঙ্গিটতামা" + - "শেকনায়াসা টোঙ্গাটোক পিসিনতারোকোসিমশিয়ানতুম্বুকাটুভালুতাসাওয়াকটুভিনি" + - "য়ানসেন্ট্রাল আটলাস তামাজিগাতউডমুর্টউগারিটিকউম্বুন্দুমূলভাইভোটিকভুঞ্জো" + - "ওয়ালসেরওয়ালামোওয়ারেওয়াশোওয়ার্লপিরিWu চীনাকাল্মইকসোগাইয়াওইয়াপেসে" + - "য়াঙ্গবেনয়েম্বাক্যানটোনীজজাপোটেকচিত্র ভাষাজেনাগাআদর্শ মরক্কোন তামাজিগ" + - "াতজুনিভাষাভিত্তিক বিষয়বস্তু নেইজাজাআধুনিক আদর্শ আরবীঅস্ট্রিয়ান জার্ম" + - "ানসুইস হাই জার্মানঅস্ট্রেলীয় ইংরেজিকানাডীয় ইংরেজিব্রিটিশ ইংরেজিআমেরি" + - "কার ইংরেজিল্যাটিন আমেরিকান স্প্যানিশইউরোপীয় স্প্যানিশম্যাক্সিকান স্প্" + - "যানিশকানাডীয় ফরাসিসুইস ফরাসিলো স্যাক্সনফ্লেমিশব্রাজিলের পর্তুগীজইউরোপ" + - "ের পর্তুগীজমলদাভিয়সার্বো-ক্রোয়েশিয়কঙ্গো সোয়াহিলিসরলীকৃত চীনাঐতিহ্য" + - "বাহি চীনা" - -var bnLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x002a, 0x0045, 0x005d, 0x0069, 0x007e, 0x0096, - 0x00a2, 0x00b1, 0x00c3, 0x00d8, 0x00f9, 0x010b, 0x0129, 0x0144, - 0x0159, 0x016e, 0x017d, 0x0192, 0x01a4, 0x01bc, 0x01d1, 0x01e0, - 0x01f2, 0x020a, 0x0216, 0x021f, 0x0244, 0x0253, 0x0265, 0x0274, - 0x0289, 0x029b, 0x02ad, 0x02bc, 0x02cb, 0x02dd, 0x02fe, 0x0319, - 0x0334, 0x0343, 0x0355, 0x0367, 0x0376, 0x0388, 0x0397, 0x03a6, - 0x03d7, 0x03e6, 0x040b, 0x0429, 0x0444, 0x0459, 0x0471, 0x0480, - 0x0492, 0x04a4, 0x04bd, 0x04de, 0x04f9, 0x0517, 0x0532, 0x0544, - // Entry 40 - 7F - 0x0571, 0x0592, 0x05b3, 0x05c5, 0x05e7, 0x0602, 0x060b, 0x0632, - 0x0647, 0x0665, 0x0677, 0x068c, 0x06a7, 0x06b6, 0x06cb, 0x06ef, - 0x06fe, 0x0725, 0x0731, 0x0743, 0x075b, 0x076d, 0x0785, 0x079a, - 0x07a6, 0x07b8, 0x07cd, 0x07dc, 0x0809, 0x081b, 0x083c, 0x0854, - 0x085d, 0x087e, 0x08a3, 0x08be, 0x08d6, 0x08f1, 0x0900, 0x0924, - 0x0942, 0x095d, 0x096f, 0x097e, 0x0993, 0x09a2, 0x09b1, 0x09dc, - 0x09ee, 0x0a09, 0x0a12, 0x0a4f, 0x0a86, 0x0ab1, 0x0ac3, 0x0ade, - 0x0af6, 0x0b0e, 0x0b1d, 0x0b32, 0x0b44, 0x0b5c, 0x0b68, 0x0b77, - // Entry 80 - BF - 0x0b89, 0x0ba1, 0x0bb6, 0x0bcb, 0x0bdd, 0x0bf5, 0x0bfe, 0x0c2b, - 0x0c40, 0x0c64, 0x0c76, 0x0caa, 0x0cbc, 0x0cce, 0x0ce3, 0x0d01, - 0x0d19, 0x0d25, 0x0d37, 0x0d4f, 0x0d67, 0x0d7c, 0x0d9b, 0x0dad, - 0x0dbf, 0x0dda, 0x0de9, 0x0dfb, 0x0e0a, 0x0e13, 0x0e31, 0x0e4c, - 0x0e61, 0x0e76, 0x0e88, 0x0e97, 0x0ea6, 0x0ec4, 0x0ed3, 0x0ef1, - 0x0f00, 0x0f18, 0x0f2a, 0x0f48, 0x0f5d, 0x0f72, 0x0f81, 0x0f8d, - 0x0fa5, 0x0fb7, 0x0fcc, 0x0fd8, 0x0fe4, 0x1002, 0x1011, 0x1026, - 0x1035, 0x1035, 0x1050, 0x105c, 0x1068, 0x1089, 0x1089, 0x1098, - // Entry C0 - FF - 0x1098, 0x10ba, 0x10e2, 0x10f7, 0x110c, 0x111e, 0x111e, 0x1133, - 0x1133, 0x1133, 0x114b, 0x114b, 0x114b, 0x1154, 0x1154, 0x116f, - 0x116f, 0x1184, 0x1196, 0x11ae, 0x11ae, 0x11ba, 0x11ba, 0x11ba, - 0x11ba, 0x11c6, 0x11d8, 0x11d8, 0x11e4, 0x11e4, 0x11e4, 0x1209, - 0x121e, 0x122d, 0x1239, 0x1239, 0x1239, 0x124e, 0x124e, 0x124e, - 0x125d, 0x125d, 0x126c, 0x126c, 0x1284, 0x1296, 0x1296, 0x12a5, - 0x12a5, 0x12b7, 0x12cc, 0x12cc, 0x12de, 0x12f9, 0x1305, 0x1314, - 0x1329, 0x1335, 0x1341, 0x1363, 0x1372, 0x138d, 0x139f, 0x13b4, - // Entry 100 - 13F - 0x13d6, 0x13e5, 0x13e5, 0x1416, 0x145a, 0x1478, 0x148a, 0x14a5, - 0x14b4, 0x14cf, 0x14e4, 0x14f9, 0x1508, 0x151a, 0x1529, 0x155d, - 0x155d, 0x1572, 0x1588, 0x159b, 0x15aa, 0x15bc, 0x15cb, 0x15d7, - 0x15d7, 0x1602, 0x1614, 0x1629, 0x1648, 0x1648, 0x165a, 0x165a, - 0x166f, 0x1687, 0x1687, 0x168d, 0x168d, 0x16a9, 0x16ce, 0x16ce, - 0x1714, 0x173c, 0x175d, 0x1763, 0x1775, 0x1778, 0x1787, 0x1796, - 0x1796, 0x179f, 0x17bd, 0x17bd, 0x17ef, 0x182a, 0x182a, 0x183c, - 0x185a, 0x1866, 0x1878, 0x189d, 0x18bf, 0x18bf, 0x18bf, 0x18cb, - // Entry 140 - 17F - 0x18e3, 0x18f2, 0x18f5, 0x1916, 0x1916, 0x193d, 0x1952, 0x1964, - 0x198f, 0x19a1, 0x19ad, 0x19b9, 0x19cb, 0x19da, 0x19ec, 0x19ec, - 0x19ec, 0x19fe, 0x1a10, 0x1a22, 0x1a44, 0x1a60, 0x1a60, 0x1a82, - 0x1a97, 0x1aa6, 0x1ab5, 0x1ac7, 0x1ad3, 0x1af7, 0x1af7, 0x1b0c, - 0x1b24, 0x1b4e, 0x1b4e, 0x1b5a, 0x1b5a, 0x1b66, 0x1b7b, 0x1b9a, - 0x1b9a, 0x1b9a, 0x1ba6, 0x1bbe, 0x1bdc, 0x1bfb, 0x1c13, 0x1c2b, - 0x1c46, 0x1c6b, 0x1c6b, 0x1c6b, 0x1c89, 0x1c98, 0x1cb0, 0x1cc5, - 0x1cd1, 0x1ce0, 0x1cf5, 0x1d07, 0x1d19, 0x1d2b, 0x1d3d, 0x1d58, - // Entry 180 - 1BF - 0x1d58, 0x1d58, 0x1d58, 0x1d6a, 0x1d6a, 0x1d7c, 0x1d88, 0x1da4, - 0x1da4, 0x1dc6, 0x1ddb, 0x1ded, 0x1dfc, 0x1e08, 0x1e1a, 0x1e1a, - 0x1e1a, 0x1e32, 0x1e32, 0x1e44, 0x1e56, 0x1e71, 0x1e95, 0x1ea4, - 0x1ea4, 0x1eb3, 0x1ece, 0x1ee0, 0x1eec, 0x1f07, 0x1f23, 0x1f4b, - 0x1f57, 0x1f6f, 0x1f99, 0x1fab, 0x1fc0, 0x1fd2, 0x1fdb, 0x1fdb, - 0x1ff0, 0x200f, 0x201e, 0x2039, 0x2054, 0x2054, 0x2054, 0x2069, - 0x208a, 0x208d, 0x20b1, 0x20bd, 0x20e5, 0x20fd, 0x210f, 0x2124, - 0x2124, 0x213c, 0x215d, 0x216c, 0x218e, 0x218e, 0x219d, 0x21d1, - // Entry 1C0 - 1FF - 0x21e3, 0x2211, 0x223b, 0x2262, 0x2274, 0x2286, 0x2292, 0x22b7, - 0x22d8, 0x22f0, 0x230e, 0x2335, 0x2356, 0x2356, 0x237e, 0x237e, - 0x237e, 0x23a6, 0x23a6, 0x23c4, 0x23c4, 0x23c4, 0x23e8, 0x2406, - 0x243a, 0x2449, 0x2449, 0x2464, 0x2479, 0x2497, 0x2497, 0x2497, - 0x24a6, 0x24b8, 0x24b8, 0x24b8, 0x24b8, 0x24d6, 0x24e8, 0x250c, - 0x2518, 0x2546, 0x255b, 0x256a, 0x2582, 0x2582, 0x25a0, 0x25b2, - 0x25d0, 0x25df, 0x25df, 0x2607, 0x2607, 0x2613, 0x2613, 0x2628, - 0x2659, 0x267e, 0x267e, 0x2696, 0x269f, 0x269f, 0x26b1, 0x26b1, - // Entry 200 - 23F - 0x26b1, 0x26e8, 0x2701, 0x271d, 0x273f, 0x2757, 0x2772, 0x279a, - 0x27a9, 0x27b5, 0x27b5, 0x27c7, 0x27d3, 0x27eb, 0x2806, 0x282b, - 0x2843, 0x2843, 0x2843, 0x2858, 0x2864, 0x2876, 0x2885, 0x289a, - 0x28a3, 0x28b8, 0x28b8, 0x28d0, 0x28eb, 0x28eb, 0x2900, 0x2928, - 0x2941, 0x2941, 0x2953, 0x2953, 0x296e, 0x296e, 0x2986, 0x2998, - 0x29b3, 0x29d1, 0x2a18, 0x2a2d, 0x2a45, 0x2a60, 0x2a69, 0x2a72, - 0x2a72, 0x2a72, 0x2a72, 0x2a72, 0x2a81, 0x2a81, 0x2a93, 0x2aab, - 0x2ac3, 0x2ad5, 0x2ae7, 0x2b08, 0x2b17, 0x2b2c, 0x2b2c, 0x2b38, - // Entry 240 - 27F - 0x2b47, 0x2b5f, 0x2b7a, 0x2b8f, 0x2b8f, 0x2bad, 0x2bc2, 0x2bde, - 0x2bde, 0x2bf0, 0x2c31, 0x2c3d, 0x2c87, 0x2c93, 0x2cc2, 0x2cc2, - 0x2cf9, 0x2d25, 0x2d59, 0x2d84, 0x2dac, 0x2dd7, 0x2e21, 0x2e55, - 0x2e92, 0x2e92, 0x2eba, 0x2ed6, 0x2ef5, 0x2f0a, 0x2f3e, 0x2f6c, - 0x2f84, 0x2fb8, 0x2fe3, 0x3005, 0x3030, -} // Size: 1250 bytes - -const caLangStr string = "" + // Size: 4583 bytes - "àfarabkhazavèsticafrikaansàkanamhàricaragonèsàrabassamèsàvaraimaraazerba" + - "idjanèsbaixkirbielorúsbúlgarbislamabambarabengalítibetàbretóbosniàcatalà" + - "txetxèchamorrocorscreetxeceslau eclesiàstictxuvaixgal·lèsdanèsalemanydiv" + - "ehidzongkaewegrecanglèsesperantoespanyolestoniàbascpersafulfinèsfijiàfer" + - "oèsfrancèsfrisó occidentalirlandèsgaèlic escocèsgallecguaranígujaratiman" + - "xhaussahebreuhindihiri motucroathaitiàhongarèsarmenihererointerlinguaind" + - "onesiinterlingueigboyi sichuaninupiakidoislandèsitaliàinuktitutjaponèsja" + - "vanèsgeorgiàkongokikuiukuanyamakazakhgrenlandèskhmerkannadacoreàkanurica" + - "ixmirikurdkomicòrnickirguísllatíluxemburguèsgandalimburguèslingalalaosià" + - "lituàluba katangaletómalgaixmarshallèsmaorimacedonimalaiàlammongolmarath" + - "imalaimaltèsbirmànauruàndebele septentrionalnepalèsndonganeerlandèsnorue" + - "c nynorsknoruec bokmålndebele meridionalnavahonyanjaoccitàojibwaoromoori" + - "yaossetapanjabipalipolonèspaixtuportuguèsquítxuaretoromànicrundiromanèsr" + - "usruandèssànscritsardsindhisami septentrionalsangosingalèseslovaceslovès" + - "amoàshonasomalialbanèsserbiswazisotho meridionalsundanèssuecsuahilitàmil" + - "telugutadjiktailandèstigrinyaturcmansetswanatongalèsturctsongatàtartahit" + - "iàuigurucraïnèsurdúuzbekvendavietnamitavolapükvalówòlofxosajiddischiorub" + - "azhuangxinèszuluatjehacoliadangmeadiguéafrihiliaghemainuaccadialabamaale" + - "utaalbanès gegaltaic meridionalanglès anticangikaarameuaraucàaraonaarapa" + - "hoarauacàrab egipciparellengua de signes americanaasturiàawadhibalutxiba" + - "linèsbavarèsbasabamumghomalabejabembabenabafutbadagabalutxi occidentalbh" + - "ojpuribicolbinikomblackfootbrajbrahuibodoakooseburiatbuguisekibilinmedum" + - "bacaddocaribcayugaatsamcebuàchigatxibtxatxagataichuukmaripidgin chinookc" + - "hoctawchipewyancherokeexeiennekurd soranicoptetàtar de Crimeafrancès cri" + - "oll de les Seychellescaixubidakotadarguàtaitadelawareslavidogribdinkazar" + - "madogribaix sòrabdoualaneerlandès mitjàdiolajuladazagaembuefikemiliàegip" + - "ci anticekajukelamitaanglès mitjàewondoextremenyfangfilipífonfrancès mit" + - "jàfrancès anticfrisó septentrionalfrisó orientalfriülàgagagaúsxinès gang" + - "ayogbayagueezgilbertèsgilakialt alemany mitjàalt alemany anticconcani de" + - " Goagondigorontalogòticgrebogrec anticalemany suíswayúgusígwichinhaidaxi" + - "nès hakkahawaiàhindi de Fijihiligainonhititahmongalt sòrabxinès xianghup" + - "aibanibibioilocàingúixcrioll anglès de Jamaicalojbanngombamachamejudeope" + - "rsajudeoàrabkarakalpakcabilenckatxinjjukambakawikabardíkanembutyapmakond" + - "ecrioll capverdiàkenyangkorokaingàkhasikhotanèskoyra chiinikakokalenjink" + - "imbundukomi-permiacconcanikosraeàkpellekaratxaikriocareliàkurukhshambala" + - "bafiacologniankúmikkutenailadílangipanjabi occidentallambalesguiàlígurla" + - "kotallombardmongoloziluri septentrionalluba-lulualuisenyolundaluomizoluy" + - "iaxinès clàssiclazmadurèsmafamagahimaithilimakassarmandingamassaimabamor" + - "dovià moksamandarmendemerumauriciàgaèlic irlandès mitjàmakhuwa-mettometa" + - "’micmacminangkabaumanxúmanipurímohawkmorémari occidentalmundangllengüe" + - "s vàriescreekmirandèsmarwarimyenemordovià erzamazanderanixinès min del s" + - "udnapolitànamabaix alemanynewariniasniueàbissiongiemboonnogainòrdic anti" + - "cnovialn’Kosotho septentrionalnuernewari clàssicnyamwesinyankolenyoronze" + - "maosageturc otomàpangasipahlavipampangapapiamentopalauàpicardpidgin de N" + - "igèriaalemany pennsilvaniàpersa anticalemany palatífenicipiemontèspòntic" + - "ponapeàprussiàprovençal anticquitxérajasthanirapanuirarotongàromanyèsrom" + - "boromaníaromanèsrwosandaweiacutarameu samaritàsamburusasaksantalingambay" + - "sangusiciliàescocèssasserèskurd meridionalsenecasenaselkupsonghai orient" + - "alirlandès antictaixelhitxanàrab txadiàsidamosami meridionalsami lulesam" + - "i d’Inarisami skoltsoninkesogdiàsrananserersahosukumasusúsumericomoriàsi" + - "ríac clàssicsiríacsilesiàtemnetesoterenatetuntigretivtokelauèstsakhurkli" + - "ngoniàtlingittalixamazictongatok pisintarokotsimshiàtat meridionaltumbuk" + - "atuvaluàtasawaqtuviniàamazic del Marroc centraludmurtugaríticumbunduarre" + - "lvaivènetvepseflamenc occidentalvòticvunjowalserametowaraywashowarlpirix" + - "inès wucalmucmingreliàsogayaoyapeàyangbenyembacantonèszapotecasímbols Bl" + - "isszelandèszenagaamazic estàndard marroquízunisense contingut lingüístic" + - "zazaàrab estàndard modernalemany austríacalt alemany suísanglès australi" + - "àanglès canadencanglès britànicanglès americàespanyol hispanoamericàesp" + - "anyol europeuespanyol de Mèxicfrancès canadencfrancès suísbaix saxóflame" + - "ncportuguès del Brasilportuguès de Portugalmoldauserbocroatsuahili del C" + - "ongoxinès simplificatxinès tradicional" - -var caLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0005, 0x000b, 0x0013, 0x001c, 0x0021, 0x0029, 0x0032, - 0x0037, 0x003f, 0x0044, 0x004a, 0x0058, 0x005f, 0x0068, 0x006f, - 0x0076, 0x007d, 0x0085, 0x008c, 0x0092, 0x0099, 0x00a0, 0x00a7, - 0x00af, 0x00b3, 0x00b7, 0x00bb, 0x00cd, 0x00d4, 0x00dd, 0x00e3, - 0x00ea, 0x00f0, 0x00f7, 0x00fa, 0x00fe, 0x0105, 0x010e, 0x0116, - 0x011e, 0x0122, 0x0127, 0x012a, 0x0130, 0x0136, 0x013d, 0x0145, - 0x0156, 0x015f, 0x016f, 0x0175, 0x017d, 0x0185, 0x0189, 0x018f, - 0x0195, 0x019a, 0x01a3, 0x01a8, 0x01af, 0x01b8, 0x01be, 0x01c4, - // Entry 40 - 7F - 0x01cf, 0x01d7, 0x01e2, 0x01e6, 0x01f0, 0x01f7, 0x01fa, 0x0203, - 0x020a, 0x0213, 0x021b, 0x0223, 0x022b, 0x0230, 0x0236, 0x023e, - 0x0244, 0x024f, 0x0254, 0x025b, 0x0261, 0x0267, 0x026f, 0x0273, - 0x0277, 0x027e, 0x0286, 0x028c, 0x0299, 0x029e, 0x02a9, 0x02b0, - 0x02b7, 0x02bd, 0x02c9, 0x02ce, 0x02d5, 0x02e0, 0x02e5, 0x02ed, - 0x02f7, 0x02fd, 0x0304, 0x0309, 0x0310, 0x0316, 0x031d, 0x0332, - 0x033a, 0x0340, 0x034b, 0x0359, 0x0367, 0x0379, 0x037f, 0x0385, - 0x038c, 0x0392, 0x0397, 0x039c, 0x03a2, 0x03a9, 0x03ad, 0x03b5, - // Entry 80 - BF - 0x03bb, 0x03c5, 0x03cd, 0x03d9, 0x03de, 0x03e6, 0x03e9, 0x03f1, - 0x03fa, 0x03fe, 0x0404, 0x0416, 0x041b, 0x0424, 0x042b, 0x0432, - 0x0438, 0x043d, 0x0443, 0x044b, 0x0450, 0x0455, 0x0465, 0x046e, - 0x0472, 0x0479, 0x047f, 0x0485, 0x048b, 0x0495, 0x049d, 0x04a4, - 0x04ac, 0x04b5, 0x04b9, 0x04bf, 0x04c5, 0x04cd, 0x04d2, 0x04dc, - 0x04e1, 0x04e6, 0x04eb, 0x04f5, 0x04fd, 0x0502, 0x0508, 0x050c, - 0x0514, 0x051a, 0x0520, 0x0526, 0x052a, 0x052f, 0x0534, 0x053b, - 0x0542, 0x0542, 0x054a, 0x054f, 0x0553, 0x0559, 0x0560, 0x0566, - // Entry C0 - FF - 0x0572, 0x0583, 0x0590, 0x0596, 0x059c, 0x05a3, 0x05a9, 0x05b0, - 0x05b0, 0x05b0, 0x05b6, 0x05b6, 0x05c2, 0x05c6, 0x05e1, 0x05e9, - 0x05e9, 0x05ef, 0x05f6, 0x05fe, 0x0606, 0x060a, 0x060f, 0x060f, - 0x0616, 0x061a, 0x061f, 0x061f, 0x0623, 0x0628, 0x062e, 0x0640, - 0x0648, 0x064d, 0x0651, 0x0651, 0x0654, 0x065d, 0x065d, 0x065d, - 0x0661, 0x0667, 0x066b, 0x0671, 0x0677, 0x067c, 0x0680, 0x0685, - 0x068c, 0x0691, 0x0696, 0x069c, 0x06a1, 0x06a7, 0x06ac, 0x06b3, - 0x06bb, 0x06c0, 0x06c4, 0x06d2, 0x06d9, 0x06e2, 0x06ea, 0x06f1, - // Entry 100 - 13F - 0x06fc, 0x0701, 0x0701, 0x0711, 0x0732, 0x0739, 0x073f, 0x0746, - 0x074b, 0x0753, 0x0758, 0x075e, 0x0763, 0x0768, 0x076d, 0x0778, - 0x0778, 0x077e, 0x0790, 0x0795, 0x0799, 0x079f, 0x07a3, 0x07a7, - 0x07ae, 0x07ba, 0x07c0, 0x07c7, 0x07d5, 0x07d5, 0x07db, 0x07e4, - 0x07e8, 0x07ef, 0x07ef, 0x07f2, 0x07f2, 0x0801, 0x080f, 0x080f, - 0x0823, 0x0832, 0x083a, 0x083c, 0x0843, 0x084d, 0x0851, 0x0856, - 0x0856, 0x085b, 0x0865, 0x086b, 0x087d, 0x088e, 0x089c, 0x08a1, - 0x08aa, 0x08b0, 0x08b5, 0x08bf, 0x08cc, 0x08d1, 0x08d1, 0x08d6, - // Entry 140 - 17F - 0x08dd, 0x08e2, 0x08ee, 0x08f5, 0x0902, 0x090c, 0x0912, 0x0917, - 0x0921, 0x092d, 0x0931, 0x0935, 0x093b, 0x0941, 0x0948, 0x0948, - 0x0961, 0x0967, 0x096d, 0x0974, 0x097e, 0x0988, 0x0988, 0x0992, - 0x099a, 0x09a0, 0x09a3, 0x09a8, 0x09ac, 0x09b4, 0x09bb, 0x09bf, - 0x09c6, 0x09d7, 0x09de, 0x09e2, 0x09e9, 0x09ee, 0x09f7, 0x0a03, - 0x0a03, 0x0a03, 0x0a07, 0x0a0f, 0x0a17, 0x0a23, 0x0a2a, 0x0a32, - 0x0a38, 0x0a40, 0x0a44, 0x0a44, 0x0a4c, 0x0a52, 0x0a5a, 0x0a5f, - 0x0a68, 0x0a6e, 0x0a75, 0x0a7a, 0x0a7f, 0x0a91, 0x0a96, 0x0a9e, - // Entry 180 - 1BF - 0x0a9e, 0x0aa4, 0x0aa4, 0x0aaa, 0x0ab2, 0x0ab7, 0x0abb, 0x0acd, - 0x0acd, 0x0ad7, 0x0adf, 0x0ae4, 0x0ae7, 0x0aeb, 0x0af0, 0x0aff, - 0x0b02, 0x0b0a, 0x0b0e, 0x0b14, 0x0b1c, 0x0b24, 0x0b2c, 0x0b32, - 0x0b36, 0x0b45, 0x0b4b, 0x0b50, 0x0b54, 0x0b5d, 0x0b75, 0x0b82, - 0x0b89, 0x0b8f, 0x0b9a, 0x0ba0, 0x0ba9, 0x0baf, 0x0bb4, 0x0bc3, - 0x0bca, 0x0bdb, 0x0be0, 0x0be9, 0x0bf0, 0x0bf0, 0x0bf5, 0x0c03, - 0x0c0e, 0x0c20, 0x0c29, 0x0c2d, 0x0c39, 0x0c3f, 0x0c43, 0x0c49, - 0x0c49, 0x0c4f, 0x0c58, 0x0c5d, 0x0c6a, 0x0c70, 0x0c76, 0x0c89, - // Entry 1C0 - 1FF - 0x0c8d, 0x0c9c, 0x0ca4, 0x0cac, 0x0cb1, 0x0cb6, 0x0cbb, 0x0cc6, - 0x0ccd, 0x0cd4, 0x0cdc, 0x0ce6, 0x0ced, 0x0cf3, 0x0d05, 0x0d1a, - 0x0d1a, 0x0d25, 0x0d34, 0x0d3a, 0x0d44, 0x0d4b, 0x0d53, 0x0d5b, - 0x0d6b, 0x0d72, 0x0d72, 0x0d7c, 0x0d83, 0x0d8d, 0x0d96, 0x0d96, - 0x0d9b, 0x0da2, 0x0da2, 0x0da2, 0x0da2, 0x0dab, 0x0dae, 0x0db5, - 0x0dba, 0x0dca, 0x0dd1, 0x0dd6, 0x0ddd, 0x0ddd, 0x0de4, 0x0de9, - 0x0df1, 0x0df9, 0x0e02, 0x0e11, 0x0e17, 0x0e1b, 0x0e1b, 0x0e21, - 0x0e31, 0x0e40, 0x0e40, 0x0e49, 0x0e4c, 0x0e59, 0x0e5f, 0x0e5f, - // Entry 200 - 23F - 0x0e5f, 0x0e6e, 0x0e77, 0x0e85, 0x0e8f, 0x0e96, 0x0e9d, 0x0ea3, - 0x0ea8, 0x0eac, 0x0eac, 0x0eb2, 0x0eb7, 0x0ebd, 0x0ec5, 0x0ed5, - 0x0edc, 0x0ee4, 0x0ee4, 0x0ee9, 0x0eed, 0x0ef3, 0x0ef8, 0x0efd, - 0x0f00, 0x0f0a, 0x0f11, 0x0f1b, 0x0f22, 0x0f27, 0x0f2d, 0x0f32, - 0x0f3b, 0x0f3b, 0x0f41, 0x0f41, 0x0f4a, 0x0f58, 0x0f5f, 0x0f67, - 0x0f6e, 0x0f76, 0x0f8f, 0x0f95, 0x0f9e, 0x0fa5, 0x0faa, 0x0fad, - 0x0fb3, 0x0fb8, 0x0fca, 0x0fca, 0x0fd0, 0x0fd0, 0x0fd5, 0x0fdb, - 0x0fe0, 0x0fe5, 0x0fea, 0x0ff2, 0x0ffb, 0x1001, 0x100b, 0x100f, - // Entry 240 - 27F - 0x1012, 0x1018, 0x101f, 0x1024, 0x1024, 0x102d, 0x1035, 0x1043, - 0x104c, 0x1052, 0x106d, 0x1071, 0x108d, 0x1091, 0x10a8, 0x10a8, - 0x10b9, 0x10ca, 0x10dc, 0x10ec, 0x10fd, 0x110d, 0x1125, 0x1135, - 0x1147, 0x1147, 0x1158, 0x1166, 0x1170, 0x1177, 0x118c, 0x11a2, - 0x11a8, 0x11b2, 0x11c3, 0x11d5, 0x11e7, -} // Size: 1250 bytes - -const csLangStr string = "" + // Size: 7397 bytes - "afarštinaabcházštinaavestánštinaafrikánštinaakanštinaamharštinaaragonšti" + - "naarabštinaásámštinaavarštinaajmarštinaázerbájdžánštinabaškirštinaběloru" + - "štinabulharštinabislamštinabambarštinabengálštinatibetštinabretonštinab" + - "osenštinakatalánštinačečenštinačamorokorsičtinakríjštinačeštinastaroslov" + - "ěnštinačuvaštinavelštinadánštinaněmčinamaledivštinadzongkäeweštinařečti" + - "naangličtinaesperantošpanělštinaestonštinabaskičtinaperštinafulbštinafin" + - "štinafidžijštinafaerštinafrancouzštinafríština (západní)irštinaskotská " + - "gaelštinagalicijštinaguaranštinagudžarátštinamanštinahauštinahebrejština" + - "hindštinahiri motuchorvatštinahaitštinamaďarštinaarménštinahererštinaint" + - "erlinguaindonéštinainterlingueigboštinaiština (sečuánská)inupiakštinaido" + - "islandštinaitalštinainuktitutštinajaponštinajavánštinagruzínštinakonžšti" + - "nakikujštinakuaňamštinakazaštinagrónštinakhmérštinakannadštinakorejština" + - "kanurikašmírštinakurdštinakomijštinakornštinakyrgyzštinalatinalucemburšt" + - "inagandštinalimburštinalingalštinalaoštinalitevštinalubu-katanžštinaloty" + - "štinamalgaštinamaršálštinamaorštinamakedonštinamalajálamštinamongolštin" + - "amaráthštinamalajštinamaltštinabarmštinanaurštinandebele (Zimbabwe)nepál" + - "štinandondštinanizozemštinanorština (nynorsk)norština (bokmål)ndebele (" + - "Jižní Afrika)navažštinaňandžštinaokcitánštinaodžibvejštinaoromštinaurijš" + - "tinaosetštinapaňdžábštinapálípolštinapaštštinaportugalštinakečuánštinaré" + - "torománštinakirundštinarumunštinaruštinakiňarwandštinasanskrtsardštinasi" + - "ndhštinasámština (severní)sangštinasinhálštinaslovenštinaslovinštinasamo" + - "jštinašonštinasomálštinaalbánštinasrbštinasiswatštinasotština (jižní)sun" + - "dštinašvédštinasvahilštinatamilštinatelugštinatádžičtinathajštinatigrini" + - "jštinaturkmenštinasetswanštinatongánštinaturečtinatsongatatarštinatahitš" + - "tinaujgurštinaukrajinštinaurdštinauzbečtinavendavietnamštinavolapükvalon" + - "štinawolofštinaxhoštinajidišjorubštinačuangštinačínštinazuluštinaacehšt" + - "inaakolštinaadangmeadygejštinaarabština (tuniská)afrihiliaghemainštinaak" + - "kadštinaalabamštinaaleutštinaalbánština (Gheg)altajština (jižní)staroang" + - "ličtinaangikaaramejštinamapudungunaraonštinaarapažštinaarabština (alžírs" + - "ká)arawacké jazykyarabština (marocká)arabština (egyptská)asuznaková řeč " + - "(americká)asturštinakotavaawadhštinabalúčštinabalijštinabavorštinabasaba" + - "munbatak tobaghomalabedžabembštinabatavštinabenabafutbadagštinabalúčštin" + - "a (západní)bhojpurštinabikolštinabinibandžarštinakomsiksikabišnuprijskom" + - "anipurštinabachtijárštinabradžštinabrahujštinabodoštinaakooseburjatština" + - "bugištinabulublinštinamedumbacaddokaribštinakajugštinaatsamcebuánštinaki" + - "gačibčačagatajštinačukštinamarijštinačinuk pidžinčoktštinačipevajštinače" + - "rokézštinačejenštinakurdština (sorání)koptštinakapiznonštinaturečtina (k" + - "rymská)kreolština (seychelská)kašubštinadakotštinadargštinataitadelawarš" + - "tinaslejvština (athabaský jazyk)dogribdinkštinazarmštinadogarštinadolnol" + - "užická srbštinakadazandusunštinadualštinaholandština (středověká)jola-fo" + - "nyidjuladazagaembuefikštinaemilijštinaegyptština staráekajukelamitštinaa" + - "ngličtina (středověká)jupikština (středoaljašská)ewondoextremadurštinafa" + - "ngfilipínštinafinština (tornedalská)fonštinafrancouzština (kajunská)fran" + - "couzština (středověká)francouzština (stará)franko-provensálštinafríština" + - " (severní)fríština (východní)furlanštinagaštinagagauzštinačínština (dial" + - "ekty Gan)gayogbajadaríjština (zoroastrijská)geezkiribatštinagilačtinahor" + - "noněmčina (středověká)hornoněmčina (stará)konkánština (Goa)góndštinagoro" + - "ntalogótštinagrebostarořečtinaněmčina (Švýcarsko)wayúuštinafrafragusiigw" + - "ichʼinhaidštinačínština (dialekty Hakka)havajštinahindština (Fidži)hilig" + - "ajnonštinachetitštinahmongštinahornolužická srbštinačínština (dialekty X" + - "iang)hupaibanštinaibibioilokánštinainguštinaingrijštinajamajská kreolšti" + - "nalojbanngombamašamejudeoperštinajudeoarabštinajutštinakarakalpačtinakab" + - "ylštinakačijštinajjukambštinakawikabardinštinakanembutyapmakondekapverdš" + - "tinakenyangkorokaingangkhásíchotánštinakoyra chiinichovarštinazazakština" + - "kakokalendžinkimbundštinakomi-permjačtinakonkánštinakosrajštinakpellekar" + - "ačajevo-balkarštinakriokinaraj-akarelštinakuruchštinašambalabafiakolínšt" + - "inakumyčtinakutenajštinaladinštinalangilahndštinalambštinalezginštinalin" + - "gua franca novaligurštinalivonštinalakotštinalombardštinamongštinalozšti" + - "nalúrština (severní)latgalštinaluba-luluaštinaluiseňolundštinaluoštinami" + - "zoštinaluhjačínština (klasická)lazštinamadurštinamafamagahijštinamaithil" + - "ištinamakasarštinamandingštinamasajštinamabamokšanštinamandarmendemeruma" + - "uricijská kreolštinairština (středověká)makhuwa-meettometa’micmacminangk" + - "abaumandžuštinamanipurštinamohawkštinamosimarijština (západní)mundangslo" + - "žené (víceřádkové) jazykykríkštinamirandštinamárvárštinamentavajštinamy" + - "eneerzjanštinamázandaránštinačínština (dialekty Minnan)neapolštinanamašt" + - "inadolnoněmčinanévárštinaniasniueštinaao (jazyky Nágálandu)kwasiongiembo" + - "onnogajštinanorština historickánovialn’kosotština (severní)nuerštinanewa" + - "rština (klasická)ňamwežštinaňankolštinaňorštinanzimaosageturečtina (osma" + - "nská)pangasinanštinapahlavštinapapangaupapiamentopalauštinapicardštinani" + - "gerijský pidžinněmčina (pensylvánská)němčina (plautdietsch)staroperština" + - "falčtinaféničtinapiemonštinapontštinapohnpeištinapruštinaprovensálštinak" + - "ičékečuánština (chimborazo)rádžastánštinarapanujštinararotongánštinaroma" + - "ňolštinarífštinaromboromštinarotumanštinarusínštinarovianštinaarumunšti" + - "narwasandawštinajakutštinasamarštinasamburusasakštinasantálštinasaurášte" + - "rštinangambaysangoštinasicilštinaskotštinasassarštinakurdština (jižní)se" + - "necasenaserištinaselkupštinakoyraboro senniirština (stará)žemaitštinataš" + - "elhitšanštinaarabština (čadská)sidamoněmčina (slezská)selajarštinasámšti" + - "na (jižní)sámština (lulejská)sámština (inarijská)sámština (skoltská)soni" + - "kštinasogdštinasranan tongosererštinasahofríština (saterlandská)sukumasu" + - "susumerštinakomorštinasyrština (klasická)syrštinaslezštinatuluštinatemne" + - "tesoterenotetumštinatigrejštinativštinatokelauštinacachurštinaklingonšti" + - "natlingittalyštinatamašektonžština (nyasa)tok pisinturojštinatarokotsako" + - "nštinatsimšijské jazykytatštinatumbukštinatuvalštinatasawaqtuvinštinatam" + - "azight (střední Maroko)udmurtštinaugaritštinaumbundukořenvaibenátštinave" + - "pštinavlámština (západní)němčina (mohansko-franské dialekty)votštinavõru" + - "štinavunjoněmčina (walser)wolajtštinawarajštinawaštinawarlpiričínština " + - "(dialekty Wu)kalmyčtinamingrelštinasogštinajaoštinajapštinajangbenštinay" + - "embanheengatukantonštinazapotéčtinabliss systémzélandštinazenagatamazigh" + - "t (standardní marocký)zunijštinažádný jazykový obsahzazaarabština (moder" + - "ní standardní)němčina standardní (Švýcarsko)angličtina (Velká Británie)a" + - "ngličtina (USA)španělština (Evropa)dolnosaštinavlámštinaportugalština (E" + - "vropa)moldavštinasrbochorvatštinasvahilština (Kongo)čínština (zjednoduše" + - "ná)" - -var csLangIdx = []uint16{ // 612 elements - // Entry 0 - 3F - 0x0000, 0x000a, 0x0017, 0x0025, 0x0033, 0x003d, 0x0048, 0x0054, - 0x005e, 0x006a, 0x0074, 0x007f, 0x0094, 0x00a1, 0x00ae, 0x00ba, - 0x00c6, 0x00d2, 0x00df, 0x00ea, 0x00f6, 0x0101, 0x010f, 0x011c, - 0x0123, 0x012e, 0x0139, 0x0142, 0x0154, 0x015f, 0x0168, 0x0172, - 0x017b, 0x0188, 0x0190, 0x0199, 0x01a2, 0x01ad, 0x01b6, 0x01c4, - 0x01cf, 0x01da, 0x01e3, 0x01ed, 0x01f6, 0x0203, 0x020d, 0x021b, - 0x0231, 0x0239, 0x024c, 0x0259, 0x0265, 0x0275, 0x027e, 0x0287, - 0x0293, 0x029d, 0x02a6, 0x02b3, 0x02bd, 0x02c9, 0x02d5, 0x02e0, - // Entry 40 - 7F - 0x02eb, 0x02f8, 0x0303, 0x030d, 0x0323, 0x0330, 0x0333, 0x033f, - 0x0349, 0x0358, 0x0363, 0x036f, 0x037c, 0x0387, 0x0392, 0x039f, - 0x03a9, 0x03b4, 0x03c0, 0x03cc, 0x03d7, 0x03dd, 0x03eb, 0x03f5, - 0x0400, 0x040a, 0x0416, 0x041c, 0x042a, 0x0434, 0x0440, 0x044c, - 0x0455, 0x0460, 0x0472, 0x047c, 0x0487, 0x0495, 0x049f, 0x04ac, - 0x04bc, 0x04c8, 0x04d5, 0x04e0, 0x04ea, 0x04f4, 0x04fe, 0x0510, - 0x051c, 0x0527, 0x0534, 0x0547, 0x055a, 0x0572, 0x057e, 0x058b, - 0x0599, 0x05a8, 0x05b2, 0x05bc, 0x05c6, 0x05d6, 0x05dc, 0x05e5, - // Entry 80 - BF - 0x05f0, 0x05fe, 0x060c, 0x061d, 0x0629, 0x0634, 0x063c, 0x064c, - 0x0653, 0x065d, 0x0668, 0x067d, 0x0687, 0x0694, 0x06a0, 0x06ac, - 0x06b7, 0x06c1, 0x06cd, 0x06d9, 0x06e2, 0x06ee, 0x0701, 0x070b, - 0x0717, 0x0723, 0x072e, 0x0739, 0x0746, 0x0750, 0x075e, 0x076b, - 0x0778, 0x0785, 0x078f, 0x0795, 0x07a0, 0x07ab, 0x07b6, 0x07c3, - 0x07cc, 0x07d6, 0x07db, 0x07e8, 0x07f0, 0x07fb, 0x0806, 0x080f, - 0x0815, 0x0820, 0x082c, 0x0837, 0x0841, 0x084b, 0x0855, 0x085c, - 0x0868, 0x087d, 0x0885, 0x088a, 0x0893, 0x089e, 0x08aa, 0x08b5, - // Entry C0 - FF - 0x08c8, 0x08dd, 0x08ed, 0x08f3, 0x08ff, 0x0909, 0x0914, 0x0921, - 0x0939, 0x0939, 0x0949, 0x095e, 0x0974, 0x0977, 0x0991, 0x099c, - 0x09a2, 0x09ad, 0x09ba, 0x09c5, 0x09d0, 0x09d4, 0x09d9, 0x09e3, - 0x09ea, 0x09f0, 0x09fa, 0x0a05, 0x0a09, 0x0a0e, 0x0a19, 0x0a32, - 0x0a3f, 0x0a4a, 0x0a4e, 0x0a5c, 0x0a5f, 0x0a66, 0x0a80, 0x0a90, - 0x0a9c, 0x0aa8, 0x0ab2, 0x0ab8, 0x0ac4, 0x0ace, 0x0ad2, 0x0adc, - 0x0ae3, 0x0ae8, 0x0af3, 0x0afe, 0x0b03, 0x0b10, 0x0b14, 0x0b1b, - 0x0b29, 0x0b33, 0x0b3e, 0x0b4c, 0x0b57, 0x0b65, 0x0b74, 0x0b80, - // Entry 100 - 13F - 0x0b95, 0x0b9f, 0x0bad, 0x0bc2, 0x0bdb, 0x0be7, 0x0bf2, 0x0bfc, - 0x0c01, 0x0c0e, 0x0c2c, 0x0c32, 0x0c3c, 0x0c46, 0x0c51, 0x0c69, - 0x0c7b, 0x0c85, 0x0ca1, 0x0cab, 0x0cb0, 0x0cb6, 0x0cba, 0x0cc4, - 0x0cd0, 0x0ce2, 0x0ce8, 0x0cf4, 0x0d0f, 0x0d2e, 0x0d34, 0x0d44, - 0x0d48, 0x0d56, 0x0d6e, 0x0d77, 0x0d91, 0x0daf, 0x0dc6, 0x0ddd, - 0x0df2, 0x0e09, 0x0e15, 0x0e1d, 0x0e29, 0x0e43, 0x0e47, 0x0e4c, - 0x0e69, 0x0e6d, 0x0e7a, 0x0e84, 0x0ea2, 0x0eb9, 0x0ecc, 0x0ed7, - 0x0ee0, 0x0eea, 0x0eef, 0x0efd, 0x0f14, 0x0f20, 0x0f26, 0x0f2b, - // Entry 140 - 17F - 0x0f34, 0x0f3e, 0x0f5a, 0x0f65, 0x0f78, 0x0f88, 0x0f94, 0x0f9f, - 0x0fb7, 0x0fd3, 0x0fd7, 0x0fe1, 0x0fe7, 0x0ff4, 0x0ffe, 0x100a, - 0x101f, 0x1025, 0x102b, 0x1032, 0x1040, 0x104f, 0x1058, 0x1067, - 0x1072, 0x107e, 0x1081, 0x108b, 0x108f, 0x109d, 0x10a4, 0x10a8, - 0x10af, 0x10bc, 0x10c3, 0x10c7, 0x10cf, 0x10d6, 0x10e3, 0x10ef, - 0x10fb, 0x1106, 0x110a, 0x1114, 0x1121, 0x1132, 0x113f, 0x114b, - 0x1151, 0x1169, 0x116d, 0x1176, 0x1181, 0x118d, 0x1195, 0x119a, - 0x11a6, 0x11b0, 0x11bd, 0x11c8, 0x11cd, 0x11d8, 0x11e2, 0x11ee, - // Entry 180 - 1BF - 0x1200, 0x120b, 0x1216, 0x1221, 0x122e, 0x1238, 0x1241, 0x1256, - 0x1262, 0x1272, 0x127a, 0x1284, 0x128d, 0x1297, 0x129c, 0x12b3, - 0x12bc, 0x12c7, 0x12cb, 0x12d8, 0x12e6, 0x12f3, 0x1300, 0x130b, - 0x130f, 0x131c, 0x1322, 0x1327, 0x132b, 0x1343, 0x135b, 0x1369, - 0x1370, 0x1376, 0x1381, 0x138e, 0x139b, 0x13a7, 0x13ab, 0x13c2, - 0x13c9, 0x13eb, 0x13f6, 0x1402, 0x1410, 0x141e, 0x1423, 0x142f, - 0x1441, 0x145e, 0x146a, 0x1474, 0x1482, 0x148f, 0x1493, 0x149d, - 0x14b4, 0x14ba, 0x14c3, 0x14ce, 0x14e3, 0x14e9, 0x14ef, 0x1503, - // Entry 1C0 - 1FF - 0x150d, 0x1524, 0x1532, 0x153f, 0x1549, 0x154e, 0x1553, 0x1569, - 0x1579, 0x1585, 0x158d, 0x1597, 0x15a2, 0x15ae, 0x15c1, 0x15db, - 0x15f3, 0x1601, 0x160a, 0x1615, 0x1621, 0x162b, 0x1638, 0x1641, - 0x1651, 0x1657, 0x1672, 0x1684, 0x1691, 0x16a2, 0x16b0, 0x16ba, - 0x16bf, 0x16c8, 0x16d5, 0x16e1, 0x16ed, 0x16f9, 0x16fc, 0x1708, - 0x1713, 0x171e, 0x1725, 0x1730, 0x173d, 0x174e, 0x1755, 0x1760, - 0x176b, 0x1775, 0x1781, 0x1795, 0x179b, 0x179f, 0x17a9, 0x17b5, - 0x17c4, 0x17d5, 0x17e2, 0x17eb, 0x17f5, 0x180a, 0x1810, 0x1824, - // Entry 200 - 23F - 0x1831, 0x1845, 0x185b, 0x1872, 0x1888, 0x1893, 0x189d, 0x18a9, - 0x18b4, 0x18b8, 0x18d2, 0x18d8, 0x18dc, 0x18e7, 0x18f2, 0x1907, - 0x1910, 0x191a, 0x1924, 0x1929, 0x192d, 0x1933, 0x193e, 0x194a, - 0x1953, 0x1960, 0x196c, 0x1979, 0x1980, 0x198a, 0x1992, 0x19a5, - 0x19ae, 0x19b9, 0x19bf, 0x19cb, 0x19de, 0x19e7, 0x19f3, 0x19fe, - 0x1a05, 0x1a10, 0x1a2c, 0x1a38, 0x1a44, 0x1a4b, 0x1a51, 0x1a54, - 0x1a60, 0x1a69, 0x1a80, 0x1aa6, 0x1aaf, 0x1aba, 0x1abf, 0x1ad1, - 0x1add, 0x1ae8, 0x1af0, 0x1af8, 0x1b11, 0x1b1c, 0x1b29, 0x1b32, - // Entry 240 - 27F - 0x1b3b, 0x1b44, 0x1b51, 0x1b56, 0x1b5f, 0x1b6b, 0x1b78, 0x1b85, - 0x1b92, 0x1b98, 0x1bb8, 0x1bc3, 0x1bdb, 0x1bdf, 0x1c00, 0x1c00, - 0x1c00, 0x1c23, 0x1c23, 0x1c23, 0x1c41, 0x1c52, 0x1c52, 0x1c69, - 0x1c69, 0x1c69, 0x1c69, 0x1c69, 0x1c76, 0x1c81, 0x1c81, 0x1c98, - 0x1ca4, 0x1cb5, 0x1cc9, 0x1ce5, -} // Size: 1248 bytes - -const daLangStr string = "" + // Size: 4141 bytes - "afarabkhasiskavestanafrikaansakanamhariskaragonesiskarabiskassamesiskava" + - "riskaymaraaserbajdsjanskbashkirhviderussiskbulgarskbislamabambarabengali" + - "tibetanskbretonskbosniskcatalansktjetjenskchamorrokorsikanskcreetjekkisk" + - "kirkeslaviskchuvashwalisiskdansktyskdivehidzongkhaewegræskengelskesperan" + - "tospanskestiskbaskiskpersiskfulahfinskfijianskfærøskfranskfrisiskirsksko" + - "tsk gæliskgaliciskguaranigujaratimanxhausahebraiskhindihirimotukroatiskh" + - "aitiskungarskarmenskhererointerlinguaindonesiskinterlingueigbosichuan yi" + - "inupiaqidoislandskitalienskinuktitutjapanskjavanesiskgeorgiskkongokikuyu" + - "kuanyamakasakhiskgrønlandskkhmerkannadakoreanskkanurikashmirikurdiskkomi" + - "corniskkirgisisklatinluxembourgskgandalimburgsklingalalaolitauiskluba-Ka" + - "tangalettiskmalagassiskmarshallesemaorimakedonskmalayalammongolskmarathi" + - "skmalajiskmaltesiskburmesisknaurunordndebelenepalesiskndongahollandsknyn" + - "orsknorsk bokmålsydndebelenavajonyanjaoccitanskojibwaoromooriyaossetiskp" + - "unjabiskpalipolskpashtoportugisiskquechuarætoromanskrundirumænskrussiskk" + - "inyarwandasanskritsardinsksindhinordsamisksangosingalesiskslovakiskslove" + - "nsksamoanskshonasomaliskalbanskserbiskswatisydsothosundanesisksvenskswah" + - "ilitamilsktelugutadsjikiskthaitigrinyaturkmensktswanatongansktyrkisktson" + - "gatatarisktahitianskuyguriskukrainskurduusbekiskvendavietnamesiskvolapyk" + - "vallonskwolofisiXhosajiddischyorubazhuangkinesiskzuluachinesiskacoliadan" + - "gmeadygheafrihiliaghemainuakkadiskaleutisksydaltaiskoldengelskangikaaram" + - "æiskmapudungunarapahoarawakasuasturiskawadhibaluchibalinesiskbasaabamun" + - "ghomalabejabembabenabafutvestbaluchibhojpuribikolbinikomsiksikabrajbodob" + - "akossiburiatiskbuginesiskbulublinmedumbacaddocaribiskcayugaatsamcebuanoc" + - "higachibchachagataichuukesemarichinookchoctawchipewyancherokeecheyenneso" + - "ranikoptiskkrim-tyrkiskseselwa (kreol-fransk)kasjubiskdakotadargwataitad" + - "elawareathapaskiskdogribdinkazarmadogrinedersorbiskdualamiddelhollandskj" + - "ola-fonyidyuladazagakiembuefikoldegyptiskekajukelamitiskmiddelengelskewo" + - "ndofangfilippinskfonmiddelfranskoldfransknordfrisiskøstfrisiskfriulianga" + - "gagauziskgan-kinesiskgayogbayageezgilbertesiskmiddelhøjtyskoldhøjtyskgon" + - "digorontalogotiskgrebooldgræskschweizertyskgusiigwichinhaidahakka-kinesi" + - "skhawaiianskhiligaynonhittitiskhmongøvresorbiskxiang-kinesiskhupaibanibi" + - "bioilokoingushlojbanngombamachamejødisk-persiskjødisk-arabiskkarakalpaki" + - "skkabyliskkachinjjukambakawikabardiankanembutyapmakondekapverdiskkorokha" + - "sikhotanesiskkoyra-chiinikakokalenjinkimbundukomi-permjakiskkonkanikosra" + - "eankpellekaratjai-balkarkarelskkurukhshambalabafiakölschkymykkutenajladi" + - "nolangilahndalambalezghianlakotamongolozinordluriluba-Lulualuisenolundal" + - "uolushailuyanamaduresemafamagahimaithilimakasarmandingomasaimabamokshama" + - "ndarmendemerumorisyenmiddelirskmakhuwa-meettometamicmacminangkabaumanchu" + - "manipurimohawkmossimundangflere sprogcreekmirandesiskmarwarimyeneerzyama" + - "zeniskmin-kinesiskneapolitansknamanedertysknewariniasniueanskkwasiongiem" + - "boonnogaioldislandskn-konordsothonuerklassisk newarisknyamwezinyankoleny" + - "oro-sprognzimaosageosmannisk tyrkiskpangasinanpahlavipampangapapiamentop" + - "alauansknigeriansk pidginoldpersiskfønikiskponapepreussiskoldprovencalsk" + - "quichérajasthanirapanuirarotongaromboromaniarumænskrwasandaweyakutsamari" + - "tansk aramæisksamburusasaksantalingambaysangusicilianskskotsksydkurdisks" + - "enecasenaselkupiskkoyraboro sennioldirsktachelhitshantchadisk arabisksid" + - "amosydsamisklulesamiskenaresamiskskoltesamisksoninkesogdiansksranan tong" + - "oserersahosukumasususumeriskshimaoreklassisk syrisksyrisktemnetesotereno" + - "tetumtigretivitokelauklingontlingittamasheknyasa tongansktok pisintaroko" + - "tsimshisktumbukatuvalutasawaqtuviniancentralmarokkansk tamazightudmurtug" + - "aristiskumbundurodvaivotiskvunjowalsertyskwalamowaraywashowalbiriwu-kine" + - "siskkalmyksogayaoyapeseyangbenyembakantonesiskzapotecblissymbolerzenagat" + - "amazightzuniintet sprogligt indholdzazamoderne standardarabiskøstrigsk t" + - "yskschweizerhøjtyskaustralsk engelskcanadisk engelskbritisk engelskameri" + - "kansk engelsklatinamerikansk spanskeuropæisk spanskmexicansk spanskcanad" + - "isk franskschweizisk franskflamskbrasiliansk portugisiskeuropæisk portug" + - "isiskmoldoviskserbokroatiskcongolesisk swahiliforenklet kinesisktraditio" + - "nelt kinesisk" - -var daLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000d, 0x0014, 0x001d, 0x0021, 0x0029, 0x0034, - 0x003b, 0x0045, 0x004c, 0x0052, 0x0060, 0x0067, 0x0073, 0x007b, - 0x0082, 0x0089, 0x0090, 0x0099, 0x00a1, 0x00a8, 0x00b1, 0x00ba, - 0x00c2, 0x00cc, 0x00d0, 0x00d8, 0x00e4, 0x00eb, 0x00f3, 0x00f8, - 0x00fc, 0x0102, 0x010a, 0x010d, 0x0113, 0x011a, 0x0123, 0x0129, - 0x012f, 0x0136, 0x013d, 0x0142, 0x0147, 0x014f, 0x0157, 0x015d, - 0x0164, 0x0168, 0x0176, 0x017e, 0x0185, 0x018d, 0x0191, 0x0196, - 0x019e, 0x01a3, 0x01ab, 0x01b3, 0x01ba, 0x01c1, 0x01c8, 0x01ce, - // Entry 40 - 7F - 0x01d9, 0x01e3, 0x01ee, 0x01f2, 0x01fc, 0x0203, 0x0206, 0x020e, - 0x0217, 0x0220, 0x0227, 0x0231, 0x0239, 0x023e, 0x0244, 0x024c, - 0x0255, 0x0260, 0x0265, 0x026c, 0x0274, 0x027a, 0x0282, 0x0289, - 0x028d, 0x0294, 0x029d, 0x02a2, 0x02ae, 0x02b3, 0x02bc, 0x02c3, - 0x02c6, 0x02ce, 0x02da, 0x02e1, 0x02ec, 0x02f7, 0x02fc, 0x0305, - 0x030e, 0x0316, 0x031f, 0x0327, 0x0330, 0x0339, 0x033e, 0x0349, - 0x0353, 0x0359, 0x0362, 0x0369, 0x0376, 0x0380, 0x0386, 0x038c, - 0x0395, 0x039b, 0x03a0, 0x03a5, 0x03ad, 0x03b6, 0x03ba, 0x03bf, - // Entry 80 - BF - 0x03c5, 0x03d0, 0x03d7, 0x03e3, 0x03e8, 0x03f0, 0x03f7, 0x0402, - 0x040a, 0x0412, 0x0418, 0x0422, 0x0427, 0x0432, 0x043b, 0x0443, - 0x044b, 0x0450, 0x0458, 0x045f, 0x0466, 0x046b, 0x0473, 0x047e, - 0x0484, 0x048b, 0x0492, 0x0498, 0x04a2, 0x04a6, 0x04ae, 0x04b7, - 0x04bd, 0x04c5, 0x04cc, 0x04d2, 0x04da, 0x04e4, 0x04ec, 0x04f4, - 0x04f8, 0x0500, 0x0505, 0x0511, 0x0518, 0x0520, 0x0525, 0x052d, - 0x0535, 0x053b, 0x0541, 0x0549, 0x054d, 0x0557, 0x055c, 0x0563, - 0x0569, 0x0569, 0x0571, 0x0576, 0x057a, 0x0582, 0x0582, 0x058a, - // Entry C0 - FF - 0x058a, 0x0594, 0x059e, 0x05a4, 0x05ad, 0x05b7, 0x05b7, 0x05be, - 0x05be, 0x05be, 0x05c4, 0x05c4, 0x05c4, 0x05c7, 0x05c7, 0x05cf, - 0x05cf, 0x05d5, 0x05dc, 0x05e6, 0x05e6, 0x05eb, 0x05f0, 0x05f0, - 0x05f7, 0x05fb, 0x0600, 0x0600, 0x0604, 0x0609, 0x0609, 0x0614, - 0x061c, 0x0621, 0x0625, 0x0625, 0x0628, 0x062f, 0x062f, 0x062f, - 0x0633, 0x0633, 0x0637, 0x063e, 0x0647, 0x0651, 0x0655, 0x0659, - 0x0660, 0x0665, 0x066d, 0x0673, 0x0678, 0x067f, 0x0684, 0x068b, - 0x0693, 0x069b, 0x069f, 0x06a6, 0x06ad, 0x06b6, 0x06be, 0x06c6, - // Entry 100 - 13F - 0x06cc, 0x06d3, 0x06d3, 0x06df, 0x06f5, 0x06fe, 0x0704, 0x070a, - 0x070f, 0x0717, 0x0722, 0x0728, 0x072d, 0x0732, 0x0737, 0x0743, - 0x0743, 0x0748, 0x0757, 0x0761, 0x0766, 0x076c, 0x0772, 0x0776, - 0x0776, 0x0781, 0x0787, 0x0790, 0x079d, 0x079d, 0x07a3, 0x07a3, - 0x07a7, 0x07b1, 0x07b1, 0x07b4, 0x07b4, 0x07c0, 0x07c9, 0x07c9, - 0x07d4, 0x07df, 0x07e7, 0x07e9, 0x07f2, 0x07fe, 0x0802, 0x0807, - 0x0807, 0x080b, 0x0817, 0x0817, 0x0825, 0x0830, 0x0830, 0x0835, - 0x083e, 0x0844, 0x0849, 0x0852, 0x085f, 0x085f, 0x085f, 0x0864, - // Entry 140 - 17F - 0x086b, 0x0870, 0x087e, 0x0888, 0x0888, 0x0892, 0x089b, 0x08a0, - 0x08ac, 0x08ba, 0x08be, 0x08c2, 0x08c8, 0x08cd, 0x08d3, 0x08d3, - 0x08d3, 0x08d9, 0x08df, 0x08e6, 0x08f5, 0x0904, 0x0904, 0x0911, - 0x0919, 0x091f, 0x0922, 0x0927, 0x092b, 0x0934, 0x093b, 0x093f, - 0x0946, 0x0950, 0x0950, 0x0954, 0x0954, 0x0959, 0x0964, 0x0970, - 0x0970, 0x0970, 0x0974, 0x097c, 0x0984, 0x0993, 0x099a, 0x09a2, - 0x09a8, 0x09b7, 0x09b7, 0x09b7, 0x09be, 0x09c4, 0x09cc, 0x09d1, - 0x09d8, 0x09dd, 0x09e4, 0x09ea, 0x09ef, 0x09f5, 0x09fa, 0x0a02, - // Entry 180 - 1BF - 0x0a02, 0x0a02, 0x0a02, 0x0a08, 0x0a08, 0x0a0d, 0x0a11, 0x0a19, - 0x0a19, 0x0a23, 0x0a2a, 0x0a2f, 0x0a32, 0x0a38, 0x0a3e, 0x0a3e, - 0x0a3e, 0x0a46, 0x0a4a, 0x0a50, 0x0a58, 0x0a5f, 0x0a67, 0x0a6c, - 0x0a70, 0x0a76, 0x0a7c, 0x0a81, 0x0a85, 0x0a8d, 0x0a97, 0x0aa5, - 0x0aa9, 0x0aaf, 0x0aba, 0x0ac0, 0x0ac8, 0x0ace, 0x0ad3, 0x0ad3, - 0x0ada, 0x0ae5, 0x0aea, 0x0af5, 0x0afc, 0x0afc, 0x0b01, 0x0b06, - 0x0b0e, 0x0b1a, 0x0b26, 0x0b2a, 0x0b33, 0x0b39, 0x0b3d, 0x0b45, - 0x0b45, 0x0b4b, 0x0b54, 0x0b59, 0x0b64, 0x0b64, 0x0b68, 0x0b71, - // Entry 1C0 - 1FF - 0x0b75, 0x0b86, 0x0b8e, 0x0b96, 0x0ba1, 0x0ba6, 0x0bab, 0x0bbc, - 0x0bc6, 0x0bcd, 0x0bd5, 0x0bdf, 0x0be8, 0x0be8, 0x0bf9, 0x0bf9, - 0x0bf9, 0x0c03, 0x0c03, 0x0c0c, 0x0c0c, 0x0c0c, 0x0c12, 0x0c1b, - 0x0c29, 0x0c30, 0x0c30, 0x0c3a, 0x0c41, 0x0c4a, 0x0c4a, 0x0c4a, - 0x0c4f, 0x0c55, 0x0c55, 0x0c55, 0x0c55, 0x0c5e, 0x0c61, 0x0c68, - 0x0c6d, 0x0c82, 0x0c89, 0x0c8e, 0x0c95, 0x0c95, 0x0c9c, 0x0ca1, - 0x0cab, 0x0cb1, 0x0cb1, 0x0cbb, 0x0cc1, 0x0cc5, 0x0cc5, 0x0cce, - 0x0cdd, 0x0ce4, 0x0ce4, 0x0ced, 0x0cf1, 0x0d01, 0x0d07, 0x0d07, - // Entry 200 - 23F - 0x0d07, 0x0d10, 0x0d1a, 0x0d25, 0x0d31, 0x0d38, 0x0d41, 0x0d4d, - 0x0d52, 0x0d56, 0x0d56, 0x0d5c, 0x0d60, 0x0d68, 0x0d70, 0x0d7f, - 0x0d85, 0x0d85, 0x0d85, 0x0d8a, 0x0d8e, 0x0d94, 0x0d99, 0x0d9e, - 0x0da2, 0x0da9, 0x0da9, 0x0db0, 0x0db7, 0x0db7, 0x0dbf, 0x0dcd, - 0x0dd6, 0x0dd6, 0x0ddc, 0x0ddc, 0x0de5, 0x0de5, 0x0dec, 0x0df2, - 0x0df9, 0x0e01, 0x0e1c, 0x0e22, 0x0e2c, 0x0e33, 0x0e36, 0x0e39, - 0x0e39, 0x0e39, 0x0e39, 0x0e39, 0x0e3f, 0x0e3f, 0x0e44, 0x0e4e, - 0x0e54, 0x0e59, 0x0e5e, 0x0e65, 0x0e70, 0x0e76, 0x0e76, 0x0e7a, - // Entry 240 - 27F - 0x0e7d, 0x0e83, 0x0e8a, 0x0e8f, 0x0e8f, 0x0e9a, 0x0ea1, 0x0ead, - 0x0ead, 0x0eb3, 0x0ebc, 0x0ec0, 0x0ed7, 0x0edb, 0x0ef2, 0x0ef2, - 0x0f00, 0x0f11, 0x0f22, 0x0f32, 0x0f41, 0x0f53, 0x0f69, 0x0f7a, - 0x0f8a, 0x0f8a, 0x0f99, 0x0faa, 0x0faa, 0x0fb0, 0x0fc7, 0x0fdd, - 0x0fe6, 0x0ff3, 0x1006, 0x1018, 0x102d, -} // Size: 1250 bytes - -const deLangStr string = "" + // Size: 5600 bytes - "AfarAbchasischAvestischAfrikaansAkanAmharischAragonesischArabischAssames" + - "ischAwarischAymaraAserbaidschanischBaschkirischWeißrussischBulgarischBis" + - "lamaBambaraBengalischTibetischBretonischBosnischKatalanischTschetschenis" + - "chChamorroKorsischCreeTschechischKirchenslawischTschuwaschischWalisischD" + - "änischDeutschDhivehiDzongkhaEweGriechischEnglischEsperantoSpanischEstni" + - "schBaskischPersischFulFinnischFidschiFäröischFranzösischWestfriesischIri" + - "schSchottisches GälischGalicischGuaraniGujaratiManxHaussaHebräischHindiH" + - "iri-MotuKroatischHaiti-KreolischUngarischArmenischHereroInterlinguaIndon" + - "esischInterlingueIgboYiInupiakIdoIsländischItalienischInuktitutJapanisch" + - "JavanischGeorgischKongolesischKikuyuKwanyamaKasachischGrönländischKhmerK" + - "annadaKoreanischKanuriKaschmiriKurdischKomiKornischKirgisischLateinLuxem" + - "burgischGandaLimburgischLingalaLaotischLitauischLuba-KatangaLettischMada" + - "gassischMarschallesischMaoriMazedonischMalayalamMongolischMarathiMalaiis" + - "chMaltesischBirmanischNauruischNord-NdebeleNepalesischNdongaNiederländis" + - "chNorwegisch NynorskNorwegisch BokmålSüd-NdebeleNavajoNyanjaOkzitanischO" + - "jibwaOromoOriyaOssetischPunjabiPaliPolnischPaschtuPortugiesischQuechuaRä" + - "toromanischRundiRumänischRussischKinyarwandaSanskritSardischSindhiNordsa" + - "mischSangoSinghalesischSlowakischSlowenischSamoanischShonaSomaliAlbanisc" + - "hSerbischSwaziSüd-SothoSundanesischSchwedischSuaheliTamilTeluguTadschiki" + - "schThailändischTigrinyaTurkmenischTswanaTongaischTürkischTsongaTatarisch" + - "TahitischUigurischUkrainischUrduUsbekischVendaVietnamesischVolapükWallon" + - "ischWolofXhosaJiddischYorubaZhuangChinesischZuluAcehAcholiAdangmeAdygeis" + - "chTunesisches ArabischAfrihiliAghemAinuAkkadischAlabamaAleutischGegischS" + - "üd-AltaischAltenglischAngikaAramäischMapudungunAraonaArapahoAlgerisches" + - " ArabischArawakMarokkanisches ArabischÄgyptisches ArabischAsuAmerikanisc" + - "he GebärdenspracheAsturianischKotavaAwadhiBelutschischBalinesischBairisc" + - "hBasaaBamunBatak TobaGhomalaBedauyeBembaBetawiBenaBafutBadagaWestliches " + - "BelutschiBhodschpuriBikolBiniBanjaresischKomBlackfootBishnupriyaBachtiar" + - "ischBraj-BhakhaBrahuiBodoAkooseBurjatischBuginesischBuluBlinMedumbaCaddo" + - "KaribischCayugaAtsamCebuanoRukigaChibchaTschagataischChuukesischMariChin" + - "ookChoctawChipewyanCherokeeCheyenneZentralkurdischKoptischCapiznonKrimta" + - "tarischSeychellenkreolKaschubischDakotaDarginischTaitaDelawareSlaveDogri" + - "bDinkaZarmaDogriNiedersorbischZentral-DusunDualaMittelniederländischDiol" + - "aDyulaDazagaEmbuEfikEmilianischÄgyptischEkajukElamischMittelenglischZent" + - "ral-Alaska-YupikEwondoExtremadurischPangweFilipinoMeänkieliFonCajunMitte" + - "lfranzösischAltfranzösischFrankoprovenzalischNordfriesischOstfriesischFr" + - "iaulischGaGagausischGanGayoGbayaGabriGeezKiribatischGilakiMittelhochdeut" + - "schAlthochdeutschGoa-KonkaniGondiMongondouGotischGreboAltgriechischSchwe" + - "izerdeutschWayúuFarefareGusiiKutchinHaidaHakkaHawaiischFidschi-HindiHili" + - "gaynonHethitischMiaoObersorbischXiangHupaIbanIbibioIlokanoInguschischIsc" + - "horischJamaikanisch-KreolischLojbanNgombaMachameJüdisch-PersischJüdisch-" + - "ArabischJütischKarakalpakischKabylischKachinJjuKambaKawiKabardinischKane" + - "mbuTyapMakondeKabuverdianuKenyangKoroKaingangKhasiSakischKoyra ChiiniKho" + - "warKirmanjkiKakoKalenjinKimbunduKomi-PermjakischKonkaniKosraeanischKpell" + - "eKaratschaiisch-BalkarischKrioKinaray-aKarelischOraonShambalaBafiaKölsch" + - "KumükischKutenaiLadinoLangiLahndaLambaLesgischLingua Franca NovaLigurisc" + - "hLivischLakotaLombardischMongoLoziNördliches LuriLettgallischLuba-LuluaL" + - "uisenoLundaLuoLushaiLuhyaKlassisches ChinesischLasischMaduresischMafaKho" + - "ttaMaithiliMakassarischMalinkeMassaiMabaMokschanischMandaresischMendeMer" + - "uMorisyenMittelirischMakhuwa-MeettoMeta’MicmacMinangkabauMandschurischMe" + - "itheiMohawkMossiBergmariMundangMehrsprachigMuskogeeMirandesischMarwariMe" + - "ntawaiMyeneErsja-MordwinischMasanderanischMin NanNeapolitanischNamaNiede" + - "rdeutschNewariNiasNiueAo-NagaKwasioNgiemboonNogaiAltnordischNovialN’KoNo" + - "rd-SothoNuerAlt-NewariNyamweziNyankoleNyoroNzimaOsageOsmanischPangasinan" + - "MittelpersischPampangganPapiamentoPalauPicardischNigerianisches PidginPe" + - "nnsylvaniadeutschPlautdietschAltpersischPfälzischPhönizischPiemontesisch" + - "PontischPonapeanischAltpreußischAltprovenzalischK’iche’Chimborazo Hochla" + - "nd-QuechuaRajasthaniRapanuiRarotonganischRomagnolTarifitRomboRomaniRotum" + - "anischRussinischRovianaAromunischRwaSandaweJakutischSamaritanischSamburu" + - "SasakSantaliSaurashtraNgambaySanguSizilianischSchottischSassarischSüdkur" + - "dischSenecaSenaSeriSelkupischKoyra SenniAltirischSamogitischTaschelhitSc" + - "hanTschadisch-ArabischSidamoSchlesisch (Niederschlesisch)SelayarSüdsamis" + - "chLule-SamischInari-SamischSkolt-SamischSoninkeSogdischSrananischSererSa" + - "hoSaterfriesischSukumaSusuSumerischKomorischAltsyrischSyrischSchlesisch " + - "(Wasserpolnisch)TuluTemneTesoTerenoTetumTigreTivTokelauanischTsachurisch" + - "KlingonischTlingitTalischTamaseqNyasa TongaNeumelanesischTuroyoTarokoTsa" + - "konischTsimshianTatischTumbukaTuvaluischTasawaqTuwinischZentralatlas-Tam" + - "azightUdmurtischUgaritischUmbunduRootVaiVenetischWepsischWestflämischMai" + - "nfränkischWotischVõroVunjoWalliserdeutschWalamoWarayWashoWarlpiriWuKalmü" + - "ckischMingrelischSogaYaoYapesischYangbenYembaNheengatuKantonesischZapote" + - "kischBliss-SymboleSeeländischZenagaTamazightZuniKeine SprachinhalteZazaM" + - "odernes HocharabischÖsterreichisches DeutschSchweizer HochdeutschAustral" + - "isches EnglischKanadisches EnglischBritisches EnglischAmerikanisches Eng" + - "lischLateinamerikanisches SpanischEuropäisches SpanischMexikanisches Spa" + - "nischKanadisches FranzösischSchweizer FranzösischNiedersächsischFlämisch" + - "Brasilianisches PortugiesischEuropäisches PortugiesischMoldauischSerbo-K" + - "roatischKongo-SwahiliChinesisch (vereinfacht)Chinesisch (traditionell)" - -var deLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000e, 0x0017, 0x0020, 0x0024, 0x002d, 0x0039, - 0x0041, 0x004c, 0x0054, 0x005a, 0x006b, 0x0077, 0x0084, 0x008e, - 0x0095, 0x009c, 0x00a6, 0x00af, 0x00b9, 0x00c1, 0x00cc, 0x00db, - 0x00e3, 0x00eb, 0x00ef, 0x00fa, 0x0109, 0x0117, 0x0120, 0x0128, - 0x012f, 0x0136, 0x013e, 0x0141, 0x014b, 0x0153, 0x015c, 0x0164, - 0x016c, 0x0174, 0x017c, 0x017f, 0x0187, 0x018e, 0x0198, 0x01a4, - 0x01b1, 0x01b7, 0x01cc, 0x01d5, 0x01dc, 0x01e4, 0x01e8, 0x01ee, - 0x01f8, 0x01fd, 0x0206, 0x020f, 0x021e, 0x0227, 0x0230, 0x0236, - // Entry 40 - 7F - 0x0241, 0x024c, 0x0257, 0x025b, 0x025d, 0x0264, 0x0267, 0x0272, - 0x027d, 0x0286, 0x028f, 0x0298, 0x02a1, 0x02ad, 0x02b3, 0x02bb, - 0x02c5, 0x02d3, 0x02d8, 0x02df, 0x02e9, 0x02ef, 0x02f8, 0x0300, - 0x0304, 0x030c, 0x0316, 0x031c, 0x0329, 0x032e, 0x0339, 0x0340, - 0x0348, 0x0351, 0x035d, 0x0365, 0x0371, 0x0380, 0x0385, 0x0390, - 0x0399, 0x03a3, 0x03aa, 0x03b3, 0x03bd, 0x03c7, 0x03d0, 0x03dc, - 0x03e7, 0x03ed, 0x03fc, 0x040e, 0x0420, 0x042c, 0x0432, 0x0438, - 0x0443, 0x0449, 0x044e, 0x0453, 0x045c, 0x0463, 0x0467, 0x046f, - // Entry 80 - BF - 0x0476, 0x0483, 0x048a, 0x0498, 0x049d, 0x04a7, 0x04af, 0x04ba, - 0x04c2, 0x04ca, 0x04d0, 0x04db, 0x04e0, 0x04ed, 0x04f7, 0x0501, - 0x050b, 0x0510, 0x0516, 0x051f, 0x0527, 0x052c, 0x0536, 0x0542, - 0x054c, 0x0553, 0x0558, 0x055e, 0x056a, 0x0577, 0x057f, 0x058a, - 0x0590, 0x0599, 0x05a2, 0x05a8, 0x05b1, 0x05ba, 0x05c3, 0x05cd, - 0x05d1, 0x05da, 0x05df, 0x05ec, 0x05f4, 0x05fe, 0x0603, 0x0608, - 0x0610, 0x0616, 0x061c, 0x0626, 0x062a, 0x062e, 0x0634, 0x063b, - 0x0644, 0x0658, 0x0660, 0x0665, 0x0669, 0x0672, 0x0679, 0x0682, - // Entry C0 - FF - 0x0689, 0x0696, 0x06a1, 0x06a7, 0x06b1, 0x06bb, 0x06c1, 0x06c8, - 0x06dc, 0x06dc, 0x06e2, 0x06f9, 0x070e, 0x0711, 0x072f, 0x073b, - 0x0741, 0x0747, 0x0753, 0x075e, 0x0766, 0x076b, 0x0770, 0x077a, - 0x0781, 0x0788, 0x078d, 0x0793, 0x0797, 0x079c, 0x07a2, 0x07b6, - 0x07c1, 0x07c6, 0x07ca, 0x07d6, 0x07d9, 0x07e2, 0x07ed, 0x07f9, - 0x0804, 0x080a, 0x080e, 0x0814, 0x081e, 0x0829, 0x082d, 0x0831, - 0x0838, 0x083d, 0x0846, 0x084c, 0x0851, 0x0858, 0x085e, 0x0865, - 0x0872, 0x087d, 0x0881, 0x0888, 0x088f, 0x0898, 0x08a0, 0x08a8, - // Entry 100 - 13F - 0x08b7, 0x08bf, 0x08c7, 0x08d4, 0x08e3, 0x08ee, 0x08f4, 0x08fe, - 0x0903, 0x090b, 0x0910, 0x0916, 0x091b, 0x0920, 0x0925, 0x0933, - 0x0940, 0x0945, 0x095a, 0x095f, 0x0964, 0x096a, 0x096e, 0x0972, - 0x097d, 0x0987, 0x098d, 0x0995, 0x09a3, 0x09b7, 0x09bd, 0x09cb, - 0x09d1, 0x09d9, 0x09e3, 0x09e6, 0x09eb, 0x09fd, 0x0a0c, 0x0a1f, - 0x0a2c, 0x0a38, 0x0a42, 0x0a44, 0x0a4e, 0x0a51, 0x0a55, 0x0a5a, - 0x0a5f, 0x0a63, 0x0a6e, 0x0a74, 0x0a85, 0x0a93, 0x0a9e, 0x0aa3, - 0x0aac, 0x0ab3, 0x0ab8, 0x0ac5, 0x0ad5, 0x0adb, 0x0ae3, 0x0ae8, - // Entry 140 - 17F - 0x0aef, 0x0af4, 0x0af9, 0x0b02, 0x0b0f, 0x0b19, 0x0b23, 0x0b27, - 0x0b33, 0x0b38, 0x0b3c, 0x0b40, 0x0b46, 0x0b4d, 0x0b58, 0x0b62, - 0x0b78, 0x0b7e, 0x0b84, 0x0b8b, 0x0b9c, 0x0bad, 0x0bb5, 0x0bc3, - 0x0bcc, 0x0bd2, 0x0bd5, 0x0bda, 0x0bde, 0x0bea, 0x0bf1, 0x0bf5, - 0x0bfc, 0x0c08, 0x0c0f, 0x0c13, 0x0c1b, 0x0c20, 0x0c27, 0x0c33, - 0x0c39, 0x0c42, 0x0c46, 0x0c4e, 0x0c56, 0x0c66, 0x0c6d, 0x0c79, - 0x0c7f, 0x0c98, 0x0c9c, 0x0ca5, 0x0cae, 0x0cb3, 0x0cbb, 0x0cc0, - 0x0cc7, 0x0cd1, 0x0cd8, 0x0cde, 0x0ce3, 0x0ce9, 0x0cee, 0x0cf6, - // Entry 180 - 1BF - 0x0d08, 0x0d11, 0x0d18, 0x0d1e, 0x0d29, 0x0d2e, 0x0d32, 0x0d42, - 0x0d4e, 0x0d58, 0x0d5f, 0x0d64, 0x0d67, 0x0d6d, 0x0d72, 0x0d88, - 0x0d8f, 0x0d9a, 0x0d9e, 0x0da4, 0x0dac, 0x0db8, 0x0dbf, 0x0dc5, - 0x0dc9, 0x0dd5, 0x0de1, 0x0de6, 0x0dea, 0x0df2, 0x0dfe, 0x0e0c, - 0x0e13, 0x0e19, 0x0e24, 0x0e31, 0x0e38, 0x0e3e, 0x0e43, 0x0e4b, - 0x0e52, 0x0e5e, 0x0e66, 0x0e72, 0x0e79, 0x0e81, 0x0e86, 0x0e97, - 0x0ea5, 0x0eac, 0x0eba, 0x0ebe, 0x0ecb, 0x0ed1, 0x0ed5, 0x0ed9, - 0x0ee0, 0x0ee6, 0x0eef, 0x0ef4, 0x0eff, 0x0f05, 0x0f0b, 0x0f15, - // Entry 1C0 - 1FF - 0x0f19, 0x0f23, 0x0f2b, 0x0f33, 0x0f38, 0x0f3d, 0x0f42, 0x0f4b, - 0x0f55, 0x0f63, 0x0f6d, 0x0f77, 0x0f7c, 0x0f86, 0x0f9b, 0x0fae, - 0x0fba, 0x0fc5, 0x0fcf, 0x0fda, 0x0fe7, 0x0fef, 0x0ffb, 0x1008, - 0x1018, 0x1023, 0x103e, 0x1048, 0x104f, 0x105d, 0x1065, 0x106c, - 0x1071, 0x1077, 0x1082, 0x108c, 0x1093, 0x109d, 0x10a0, 0x10a7, - 0x10b0, 0x10bd, 0x10c4, 0x10c9, 0x10d0, 0x10da, 0x10e1, 0x10e6, - 0x10f2, 0x10fc, 0x1106, 0x1112, 0x1118, 0x111c, 0x1120, 0x112a, - 0x1135, 0x113e, 0x1149, 0x1153, 0x1158, 0x116b, 0x1171, 0x118e, - // Entry 200 - 23F - 0x1195, 0x11a0, 0x11ac, 0x11b9, 0x11c6, 0x11cd, 0x11d5, 0x11df, - 0x11e4, 0x11e8, 0x11f6, 0x11fc, 0x1200, 0x1209, 0x1212, 0x121c, - 0x1223, 0x123e, 0x1242, 0x1247, 0x124b, 0x1251, 0x1256, 0x125b, - 0x125e, 0x126b, 0x1276, 0x1281, 0x1288, 0x128f, 0x1296, 0x12a1, - 0x12af, 0x12b5, 0x12bb, 0x12c5, 0x12ce, 0x12d5, 0x12dc, 0x12e6, - 0x12ed, 0x12f6, 0x130c, 0x1316, 0x1320, 0x1327, 0x132b, 0x132e, - 0x1337, 0x133f, 0x134c, 0x135a, 0x1361, 0x1366, 0x136b, 0x137a, - 0x1380, 0x1385, 0x138a, 0x1392, 0x1394, 0x13a0, 0x13ab, 0x13af, - // Entry 240 - 27F - 0x13b2, 0x13bb, 0x13c2, 0x13c7, 0x13d0, 0x13dc, 0x13e7, 0x13f4, - 0x1400, 0x1406, 0x140f, 0x1413, 0x1426, 0x142a, 0x143f, 0x143f, - 0x1458, 0x146d, 0x1483, 0x1497, 0x14aa, 0x14c1, 0x14de, 0x14f4, - 0x150a, 0x150a, 0x1522, 0x1538, 0x1548, 0x1551, 0x156e, 0x1589, - 0x1593, 0x15a2, 0x15af, 0x15c7, 0x15e0, -} // Size: 1250 bytes - -const elLangStr string = "" + // Size: 9051 bytes - "ΑφάρΑμπχαζικάΑβεστάνΑφρικάανςΑκάνΑμαρικάΑραγκονικάΑραβικάΑσαμεζικάΆβαρικ" + - "ΑϊμάραΑζερμπαϊτζανικάΜπασκίρΛευκορωσικάΒουλγαρικάΜπισλάμαΜπαμπάραΜπενγκ" + - "άλιΘιβετιανάΒρετονικάΒοσνιακάΚαταλανικάΤσετσενικάΚαμόρροΚορσικανικάΚριΤ" + - "σεχικάΕκκλησιαστικά ΣλαβικάΤσουβασικάΟυαλικάΔανικάΓερμανικάΝτιβέχιΝτζόν" + - "γκχαΓιΕλληνικάΑγγλικάΕσπεράντοΙσπανικάΕσθονικάΒασκικάΠερσικάΦουλάχΦινλα" + - "νδικάΦίτζιΦαρόεΓαλλικάΔυτικά ΦριζιανάΙρλανδικάΣκωτικά ΚελτικάΓαλικιανάΓ" + - "κουαρανίΓκουγιαράτιΜανξΧάουσαΕβραϊκάΧίντιΧίρι ΜότουΚροατικάΑϊτιανάΟυγγρ" + - "ικάΑρμενικάΧερέροΙντερλίνγκουαΙνδονησιακάΙντερλίνγκουεΊγκμποΣικουάν ΓιΙ" + - "νουπιάκΊντοΙσλανδικάΙταλικάΙνουκτιτούτΙαπωνικάΙαβανεζικάΓεωργιανάΚονγκό" + - "ΚικούγιουΚουανιγιάμαΚαζακικάΚαλαάλισουτΚαμποτζιανάΚανάνταΚορεατικάΚανού" + - "ριΚασμίριΚουρδικάΚόμιΚόρνιςΚυργιζικάΛατινικάΛουξεμβουργιανάΓκάνταΛιμβου" + - "ργιανάΛινγκάλαΛαοθιανάΛιθουανικάΛούμπα-ΚατάνγκαΛετονικάΜαλαγάσιΜάρσαλΜά" + - "οριΣλαβομακεδονικάΜαλαγιαλάμΜογγολικάΜαράθιΜαλάιΜαλτεζικάΒιρμανικάΝαούρ" + - "ουΒόρεια ΝτεμπέλεΝεπάλιΝτόνγκαΟλλανδικάΝορβηγικά ΝινόρσκΝορβηγικά Μποκμ" + - "άλΝότια ΝτέμπελεΝάβαχοΝιάντζαΟξιτανικάΟζιβίγουαΟρόμοΟρίγιαΟσετικάΠαντζα" + - "πικάΠάλιΠολωνικάΠάστοΠορτογαλικάΚετσούαΡομανικάΡούντιΡουμανικάΡωσικάΚιν" + - "ιαρβάνταΣανσκριτικάΣαρδινικάΣίντιΒόρεια ΣάμιΣάνγκοΣινχαλεζικάΣλοβακικάΣ" + - "λοβενικάΣαμόανΣχόναΣομάλιΑλβανικάΣερβικάΣουάτιΝότια ΣόθοΣουνδανικάΣουηδ" + - "ικάΣουαχίλιΤαμίλΤελούγκουΤατζικικάΤαϊλανδικάΤιγκρινικάΤουρκμενικάΤσουάν" + - "αΤονγκανικάΤουρκικάΤσόνγκαΤατάρΤαϊτιανάΟυιγουρικάΟυκρανικάΟυρντούΟυζμπε" + - "κικάΒένδαΒιετναμικάΒόλαπικΓουαλούνΓουόλοφΖόσαΓίντιςΓιορούμπαΖουάνγκΚινε" + - "ζικάΖουλούΑχινίζΑκολίΑντάνγκμεΑντιγκέαΑφριχίλιΑγκέμΑϊνούΑκάντιανΑλούτΝό" + - "τια ΑλαταϊκάΠαλαιά ΑγγλικάΑνγκικάΑραμαϊκάΑρουκάνιανΑράπαχοΑραγουάκΆσουΑ" + - "στουριανάΑγουαντίΜπαλούτσιΜπαλινίζΜπάσαΜπαμούνΓκομάλαΜπέζαΜπέμπαΜπέναΜπ" + - "αφούτΔυτικά ΜπαλοχικάΜποζπούριΜπικόλΜπίνιΚομΣικσίκαΜπρατζΜπόντοΑκόσιΜπο" + - "υριάτΜπουγκίζΜπουλούΜπλινΜεντούμπαΚάντοΚαρίμπΚαγιούγκαΑτσάμΚεμπουάνοΤσί" + - "γκαΤσίμπτσαΤσαγκατάιΤσουκίζιΜάριΙδιωματικά ΣινούκΤσοκτάουΤσίπιουανΤσερό" + - "κιΣεγιένΚουρδικά ΣοράνιΚοπτικάΤουρκικά ΚριμαίαςΚρεολικά Γαλλικά Σεϋχελλ" + - "ώνΚασούμπιανΝτακόταΝτάργκουαΤάιταΝτέλαγουερΣλαβικάΝτόγκριμπΝτίνκαΖάρμαΝ" + - "τόγκριΓλώσσα Κάτω ΛουσατίαςΝτουάλαΜέσα ΟλλανδικάΤζόλα-ΦόνιΝτογιούλαΝταζ" + - "άγκαΈμπουΕφίκΑρχαία ΑιγυπτιακάΕκατζούκΕλαμάιτΜέσα ΑγγλικάΕγουόντοΦανγκΦ" + - "ιλιππινεζικάΦονΜέσα ΓαλλικάΠαλαιά ΓαλλικάΒόρεια ΦριζιανάΑνατολικά Φριζι" + - "ανάΦριούλιανΓκαΓκαγκάουζΓκάγιοΓκμπάγιαΓκιζΓκιλμπερτίζΜέσα Άνω Γερμανικά" + - "Παλαιά Άνω ΓερμανικάΓκόντιΓκοροντάλοΓοτθικάΓκρίμποΑρχαία ΕλληνικάΓερμαν" + - "ικά ΕλβετίαςΓκούσιΓκουίτσινΧάινταΧαβανεζικάΧιλιγκαγιόνΧιτίτεΧμονγκΓλώσσ" + - "α Άνω ΛουσατίαςΧούπαΙμπάνΙμπίμπιοΙλόκοΙνγκούςΛόζμπανΝγκόμπαΜάχαμεΙουδαϊ" + - "κά-ΠερσικάΙουδαϊκά-ΑραβικάΚάρα-ΚαλπάκΚαμπίλεΚατσίνΤζουΚάμπαΚάουιΚαμπαρν" + - "τιανάΚανέμπουΤιάπΜακόντεΓλώσσα του Πράσινου ΑκρωτηρίουΚόροΚάσιΚοτανικάΚ" + - "όιρα ΤσίνιΚάκοΚαλεντζίνΚιμπούντουΚόμι-ΠερμιάκΚονκάνιΚοσραενικάΚπέλεΚαρα" + - "τσάι-ΜπαλκάρΚαρελιακάΚουρούχΣάμπαλαΜπάφιαΚολωνικάΚουμγιούκΚουτενάιΛαδίν" + - "οΛάνγκιΛάχδαΛάμπαΛαζγκιάνΛακόταΜόνγκοΛόζιΒόρεια ΛούριΛούμπα-ΛουλούαΛουι" + - "σένοΛούνταΛούοΛουσάιΛουχίαΜαντουρίζΜάφαΜαγκάχιΜαϊτχίλιΜακαζάρΜαντίνγκοΜ" + - "ασάιΜάμπαΜόκσαΜανδάρΜέντεΜερούΜορίσιενΜέσα ΙρλανδικάΜακούβα-ΜέτοΜετάΜικ" + - "μάκΜινανγκαμπάουΜαντσούΜανιπούριΜοχόκΜόσιΜουντάνγκΠολλαπλές γλώσσεςΚρικ" + - "ΜιραντεζικάΜαργουάριΜιένεΈρζυαΜαζαντεράνιΝαπολιτανικάΝάμαΚάτω Γερμανικά" + - "ΝεγουάριΝίαςΝιούεανΚβάσιοΝγκιεμπούνΝογκάιΠαλαιά ΝορβηγικάΝ’ΚοΒόρεια Σόθ" + - "οΝουέρΚλασικά ΝεουάριΝιαμγουέζιΝιανκόλεΝιόροΝζίμαΟσάζΟθωμανικά Τουρκικά" + - "ΠανγκασινάνΠαχλάβιΠαμπάνγκαΠαπιαμέντοΠαλάουανΠίτζιν ΝιγηρίαςΑρχαία Περσ" + - "ικάΦοινικικάΠομπηικάΠρωσικάΠαλαιά ΠροβανσάλΚισέΡαζασθάνιΡαπανούιΡαροτον" + - "γκάνΡόμποΡομανίΑρομανικάΡουάΣαντάγουεΓιακούτΣαμαρίτικα ΑραμαϊκάΣαμπούρο" + - "υΣασάκΣαντάλιΝγκαμπέιΣάνγκουΣικελιανάΣκωτικάΝότια ΚουρδικάΣένεκαΣέναΣελ" + - "κούπΚοϊραμπόρο ΣένιΠαλαιά ΙρλανδικάΤασελχίτΣανΑραβικά του ΤσαντΣιντάμοΝ" + - "ότια ΣάμιΛούλε ΣάμιΙνάρι ΣάμιΣκολτ ΣάμιΣονίνκεΣογκντιένΣρανάν ΤόνγκοΣερ" + - "έρΣάχοΣουκούμαΣούσουΣουμερικάΚομόρριαΚλασικά ΣυριακάΣυριακάΤίμνεΤέσοΤερ" + - "ένοΤέτουμΤίγκρεΤιβΤοκελάουΚλίνγκονΤλίνγκιτΤαμασέκΝιάσα ΤόνγκαΤοκ ΠισίνΤ" + - "αρόκοΤσίμσιανΤουμπούκαΤουβαλούΤασαβάκΤουβινικάΤαμαζίτ Κεντρικού ΜαρόκοΟ" + - "υντμούρτΟυγκαριτικάΟυμπούντουΡουτΒάιΒότικΒούντζοΒάλσερΓουάλαμοΓουάρειΓο" + - "υασόΓουαρλπίριwuuΚαλμίκΣόγκαΓιάοΓιαπίζΓιανγκμπένΓιέμπαΚαντονέζικαΖάποτε" + - "κΣύμβολα BlissΖενάγκαΤυπικά Ταμαζίγκτ ΜαρόκουΖούνιΧωρίς γλωσσολογικό πε" + - "ριεχόμενοΖάζαΣύγχρονα Τυπικά ΑραβικάΓερμανικά ΑυστρίαςΆνω Γερμανικά Ελβ" + - "ετίαςΑγγλικά ΑυστραλίαςΑγγλικά ΚαναδάΑγγλικά Ηνωμένου ΒασιλείουΑγγλικά " + - "ΑμερικήςΙσπανικά Λατινικής ΑμερικήςΙσπανικά ΕυρώπηςΙσπανικά ΜεξικούΓαλλ" + - "ικά ΚαναδάΓαλλικά ΕλβετίαςΚάτω Γερμανικά ΟλλανδίαςΦλαμανδικάΠορτογαλικά" + - " ΒραζιλίαςΠορτογαλικά ΕυρώπηςΜολδαβικάΣερβοκροατικάΚονγκό ΣουαχίλιΑπλοπο" + - "ιημένα ΚινεζικάΠαραδοσιακά Κινεζικά" - -var elLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0008, 0x001a, 0x0028, 0x003a, 0x0042, 0x0050, 0x0064, - 0x0072, 0x0084, 0x0090, 0x009c, 0x00ba, 0x00c8, 0x00de, 0x00f2, - 0x0102, 0x0112, 0x0124, 0x0136, 0x0148, 0x0158, 0x016c, 0x0180, - 0x018e, 0x01a4, 0x01aa, 0x01b8, 0x01e1, 0x01f5, 0x0203, 0x020f, - 0x0221, 0x022f, 0x0241, 0x0245, 0x0255, 0x0263, 0x0275, 0x0285, - 0x0295, 0x02a3, 0x02b1, 0x02bd, 0x02d1, 0x02db, 0x02e5, 0x02f3, - 0x0310, 0x0322, 0x033f, 0x0351, 0x0363, 0x0379, 0x0381, 0x038d, - 0x039b, 0x03a5, 0x03b8, 0x03c8, 0x03d6, 0x03e6, 0x03f6, 0x0402, - // Entry 40 - 7F - 0x041c, 0x0432, 0x044c, 0x0458, 0x046b, 0x047b, 0x0483, 0x0495, - 0x04a3, 0x04b9, 0x04c9, 0x04dd, 0x04ef, 0x04fb, 0x050d, 0x0523, - 0x0533, 0x0549, 0x055f, 0x056d, 0x057f, 0x058d, 0x059b, 0x05ab, - 0x05b3, 0x05bf, 0x05d1, 0x05e1, 0x05ff, 0x060b, 0x0623, 0x0633, - 0x0643, 0x0657, 0x0674, 0x0684, 0x0694, 0x06a0, 0x06aa, 0x06c8, - 0x06dc, 0x06ee, 0x06fa, 0x0704, 0x0716, 0x0728, 0x0736, 0x0753, - 0x075f, 0x076d, 0x077f, 0x07a0, 0x07c1, 0x07dc, 0x07e8, 0x07f6, - 0x0808, 0x081a, 0x0824, 0x0830, 0x083e, 0x0852, 0x085a, 0x086a, - // Entry 80 - BF - 0x0874, 0x088a, 0x0898, 0x08a8, 0x08b4, 0x08c6, 0x08d2, 0x08e8, - 0x08fe, 0x0910, 0x091a, 0x092f, 0x093b, 0x0951, 0x0963, 0x0975, - 0x0981, 0x098b, 0x0997, 0x09a7, 0x09b5, 0x09c1, 0x09d4, 0x09e8, - 0x09f8, 0x0a08, 0x0a12, 0x0a24, 0x0a36, 0x0a4a, 0x0a5e, 0x0a74, - 0x0a82, 0x0a96, 0x0aa6, 0x0ab4, 0x0abe, 0x0ace, 0x0ae2, 0x0af4, - 0x0b02, 0x0b16, 0x0b20, 0x0b34, 0x0b42, 0x0b52, 0x0b60, 0x0b68, - 0x0b74, 0x0b86, 0x0b94, 0x0ba4, 0x0bb0, 0x0bbc, 0x0bc6, 0x0bd8, - 0x0be8, 0x0be8, 0x0bf8, 0x0c02, 0x0c0c, 0x0c1c, 0x0c1c, 0x0c26, - // Entry C0 - FF - 0x0c26, 0x0c41, 0x0c5c, 0x0c6a, 0x0c7a, 0x0c8e, 0x0c8e, 0x0c9c, - 0x0c9c, 0x0c9c, 0x0cac, 0x0cac, 0x0cac, 0x0cb4, 0x0cb4, 0x0cc8, - 0x0cc8, 0x0cd8, 0x0cea, 0x0cfa, 0x0cfa, 0x0d04, 0x0d12, 0x0d12, - 0x0d20, 0x0d2a, 0x0d36, 0x0d36, 0x0d40, 0x0d4e, 0x0d4e, 0x0d6d, - 0x0d7f, 0x0d8b, 0x0d95, 0x0d95, 0x0d9b, 0x0da9, 0x0da9, 0x0da9, - 0x0db5, 0x0db5, 0x0dc1, 0x0dcb, 0x0ddb, 0x0deb, 0x0df9, 0x0e03, - 0x0e15, 0x0e1f, 0x0e2b, 0x0e3d, 0x0e47, 0x0e59, 0x0e65, 0x0e75, - 0x0e87, 0x0e97, 0x0e9f, 0x0ec0, 0x0ed0, 0x0ee2, 0x0ef0, 0x0efc, - // Entry 100 - 13F - 0x0f19, 0x0f27, 0x0f27, 0x0f48, 0x0f7a, 0x0f8e, 0x0f9c, 0x0fae, - 0x0fb8, 0x0fcc, 0x0fda, 0x0fec, 0x0ff8, 0x1002, 0x1010, 0x1038, - 0x1038, 0x1046, 0x1061, 0x1074, 0x1086, 0x1096, 0x10a0, 0x10a8, - 0x10a8, 0x10c9, 0x10d9, 0x10e7, 0x10fe, 0x10fe, 0x110e, 0x110e, - 0x1118, 0x1132, 0x1132, 0x1138, 0x1138, 0x114f, 0x116a, 0x116a, - 0x1187, 0x11aa, 0x11bc, 0x11c2, 0x11d4, 0x11d4, 0x11e0, 0x11f0, - 0x11f0, 0x11f8, 0x120e, 0x120e, 0x1230, 0x1256, 0x1256, 0x1262, - 0x1276, 0x1284, 0x1292, 0x12af, 0x12d2, 0x12d2, 0x12d2, 0x12de, - // Entry 140 - 17F - 0x12f0, 0x12fc, 0x12fc, 0x1310, 0x1310, 0x1326, 0x1332, 0x133e, - 0x1364, 0x1364, 0x136e, 0x1378, 0x1388, 0x1392, 0x13a0, 0x13a0, - 0x13a0, 0x13ae, 0x13bc, 0x13c8, 0x13e7, 0x1406, 0x1406, 0x141b, - 0x1429, 0x1435, 0x143d, 0x1447, 0x1451, 0x1469, 0x1479, 0x1481, - 0x148f, 0x14c8, 0x14c8, 0x14d0, 0x14d0, 0x14d8, 0x14e8, 0x14fd, - 0x14fd, 0x14fd, 0x1505, 0x1517, 0x152b, 0x1542, 0x1550, 0x1564, - 0x156e, 0x158d, 0x158d, 0x158d, 0x159f, 0x15ad, 0x15bb, 0x15c7, - 0x15d7, 0x15e9, 0x15f9, 0x1605, 0x1611, 0x161b, 0x1625, 0x1635, - // Entry 180 - 1BF - 0x1635, 0x1635, 0x1635, 0x1641, 0x1641, 0x164d, 0x1655, 0x166c, - 0x166c, 0x1687, 0x1697, 0x16a3, 0x16ab, 0x16b7, 0x16c3, 0x16c3, - 0x16c3, 0x16d5, 0x16dd, 0x16eb, 0x16fb, 0x1709, 0x171b, 0x1725, - 0x172f, 0x1739, 0x1745, 0x174f, 0x1759, 0x1769, 0x1784, 0x179b, - 0x17a3, 0x17af, 0x17c9, 0x17d7, 0x17e9, 0x17f3, 0x17fb, 0x17fb, - 0x180d, 0x182e, 0x1836, 0x184c, 0x185e, 0x185e, 0x1868, 0x1872, - 0x1888, 0x1888, 0x18a0, 0x18a8, 0x18c3, 0x18d3, 0x18db, 0x18e9, - 0x18e9, 0x18f5, 0x1909, 0x1915, 0x1934, 0x1934, 0x193d, 0x1952, - // Entry 1C0 - 1FF - 0x195c, 0x1979, 0x198d, 0x199d, 0x19a7, 0x19b1, 0x19b9, 0x19dc, - 0x19f2, 0x1a00, 0x1a12, 0x1a26, 0x1a36, 0x1a36, 0x1a53, 0x1a53, - 0x1a53, 0x1a6e, 0x1a6e, 0x1a80, 0x1a80, 0x1a80, 0x1a90, 0x1a9e, - 0x1abd, 0x1ac5, 0x1ac5, 0x1ad7, 0x1ae7, 0x1afd, 0x1afd, 0x1afd, - 0x1b07, 0x1b13, 0x1b13, 0x1b13, 0x1b13, 0x1b25, 0x1b2d, 0x1b3f, - 0x1b4d, 0x1b72, 0x1b84, 0x1b8e, 0x1b9c, 0x1b9c, 0x1bac, 0x1bba, - 0x1bcc, 0x1bda, 0x1bda, 0x1bf5, 0x1c01, 0x1c09, 0x1c09, 0x1c17, - 0x1c34, 0x1c53, 0x1c53, 0x1c63, 0x1c69, 0x1c89, 0x1c97, 0x1c97, - // Entry 200 - 23F - 0x1c97, 0x1caa, 0x1cbd, 0x1cd0, 0x1ce3, 0x1cf1, 0x1d03, 0x1d1c, - 0x1d26, 0x1d2e, 0x1d2e, 0x1d3e, 0x1d4a, 0x1d5c, 0x1d6c, 0x1d89, - 0x1d97, 0x1d97, 0x1d97, 0x1da1, 0x1da9, 0x1db5, 0x1dc1, 0x1dcd, - 0x1dd3, 0x1de3, 0x1de3, 0x1df3, 0x1e03, 0x1e03, 0x1e11, 0x1e28, - 0x1e39, 0x1e39, 0x1e45, 0x1e45, 0x1e55, 0x1e55, 0x1e67, 0x1e77, - 0x1e85, 0x1e97, 0x1ec5, 0x1ed7, 0x1eed, 0x1f01, 0x1f09, 0x1f0f, - 0x1f0f, 0x1f0f, 0x1f0f, 0x1f0f, 0x1f19, 0x1f19, 0x1f27, 0x1f33, - 0x1f43, 0x1f51, 0x1f5d, 0x1f71, 0x1f74, 0x1f80, 0x1f80, 0x1f8a, - // Entry 240 - 27F - 0x1f92, 0x1f9e, 0x1fb2, 0x1fbe, 0x1fbe, 0x1fd4, 0x1fe2, 0x1ff6, - 0x1ff6, 0x2004, 0x2032, 0x203c, 0x2076, 0x207e, 0x20aa, 0x20aa, - 0x20cd, 0x20f7, 0x211a, 0x2135, 0x2167, 0x2186, 0x21ba, 0x21d9, - 0x21f8, 0x21f8, 0x2213, 0x2232, 0x2260, 0x2274, 0x229d, 0x22c2, - 0x22d4, 0x22ee, 0x230b, 0x2334, 0x235b, -} // Size: 1250 bytes - -const enLangStr string = "" + // Size: 4944 bytes - "AfarAbkhazianAvestanAfrikaansAkanAmharicAragoneseArabicAssameseAvaricAym" + - "araAzerbaijaniBashkirBelarusianBulgarianBislamaBambaraBanglaTibetanBreto" + - "nBosnianCatalanChechenChamorroCorsicanCreeCzechChurch SlavicChuvashWelsh" + - "DanishGermanDivehiDzongkhaEweGreekEnglishEsperantoSpanishEstonianBasqueP" + - "ersianFulahFinnishFijianFaroeseFrenchWestern FrisianIrishScottish Gaelic" + - "GalicianGuaraniGujaratiManxHausaHebrewHindiHiri MotuCroatianHaitian Creo" + - "leHungarianArmenianHereroInterlinguaIndonesianInterlingueIgboSichuan YiI" + - "nupiaqIdoIcelandicItalianInuktitutJapaneseJavaneseGeorgianKongoKikuyuKua" + - "nyamaKazakhKalaallisutKhmerKannadaKoreanKanuriKashmiriKurdishKomiCornish" + - "KyrgyzLatinLuxembourgishGandaLimburgishLingalaLaoLithuanianLuba-KatangaL" + - "atvianMalagasyMarshalleseMaoriMacedonianMalayalamMongolianMarathiMalayMa" + - "lteseBurmeseNauruNorth NdebeleNepaliNdongaDutchNorwegian NynorskNorwegia" + - "n BokmålSouth NdebeleNavajoNyanjaOccitanOjibwaOromoOdiaOsseticPunjabiPal" + - "iPolishPashtoPortugueseQuechuaRomanshRundiRomanianRussianKinyarwandaSans" + - "kritSardinianSindhiNorthern SamiSangoSinhalaSlovakSlovenianSamoanShonaSo" + - "maliAlbanianSerbianSwatiSouthern SothoSundaneseSwedishSwahiliTamilTelugu" + - "TajikThaiTigrinyaTurkmenTswanaTonganTurkishTsongaTatarTahitianUyghurUkra" + - "inianUrduUzbekVendaVietnameseVolapükWalloonWolofXhosaYiddishYorubaZhuang" + - "ChineseZuluAchineseAcoliAdangmeAdygheTunisian ArabicAfrihiliAghemAinuAkk" + - "adianAlabamaAleutGheg AlbanianSouthern AltaiOld EnglishAngikaAramaicMapu" + - "cheAraonaArapahoAlgerian ArabicNajdi ArabicArawakMoroccan ArabicEgyptian" + - " ArabicAsuAmerican Sign LanguageAsturianKotavaAwadhiBaluchiBalineseBavar" + - "ianBasaaBamunBatak TobaGhomalaBejaBembaBetawiBenaBafutBadagaWestern Balo" + - "chiBhojpuriBikolBiniBanjarKomSiksikaBishnupriyaBakhtiariBrajBrahuiBodoAk" + - "ooseBuriatBugineseBuluBlinMedumbaCaddoCaribCayugaAtsamCebuanoChigaChibch" + - "aChagataiChuukeseMariChinook JargonChoctawChipewyanCherokeeCheyenneCentr" + - "al KurdishCopticCapiznonCrimean TurkishSeselwa Creole FrenchKashubianDak" + - "otaDargwaTaitaDelawareSlaveDogribDinkaZarmaDogriLower SorbianCentral Dus" + - "unDualaMiddle DutchJola-FonyiDyulaDazagaEmbuEfikEmilianAncient EgyptianE" + - "kajukElamiteMiddle EnglishCentral YupikEwondoExtremaduranFangFilipinoTor" + - "nedalen FinnishFonCajun FrenchMiddle FrenchOld FrenchArpitanNorthern Fri" + - "sianEastern FrisianFriulianGaGagauzGan ChineseGayoGbayaZoroastrian DariG" + - "eezGilberteseGilakiMiddle High GermanOld High GermanGoan KonkaniGondiGor" + - "ontaloGothicGreboAncient GreekSwiss GermanWayuuFrafraGusiiGwichʼinHaidaH" + - "akka ChineseHawaiianFiji HindiHiligaynonHittiteHmongUpper SorbianXiang C" + - "hineseHupaIbanIbibioIlokoIngushIngrianJamaican Creole EnglishLojbanNgomb" + - "aMachameJudeo-PersianJudeo-ArabicJutishKara-KalpakKabyleKachinJjuKambaKa" + - "wiKabardianKanembuTyapMakondeKabuverdianuKenyangKoroKaingangKhasiKhotane" + - "seKoyra ChiiniKhowarKirmanjkiKakoKalenjinKimbunduKomi-PermyakKonkaniKosr" + - "aeanKpelleKarachay-BalkarKrioKinaray-aKarelianKurukhShambalaBafiaCologni" + - "anKumykKutenaiLadinoLangiLahndaLambaLezghianLingua Franca NovaLigurianLi" + - "vonianLakotaLombardMongoLoziNorthern LuriLatgalianLuba-LuluaLuisenoLunda" + - "LuoMizoLuyiaLiterary ChineseLazMadureseMafaMagahiMaithiliMakasarMandingo" + - "MasaiMabaMokshaMandarMendeMeruMorisyenMiddle IrishMakhuwa-MeettoMetaʼMi'" + - "kmaqMinangkabauManchuManipuriMohawkMossiWestern MariMundangMultiple lang" + - "uagesCreekMirandeseMarwariMentawaiMyeneErzyaMazanderaniMin Nan ChineseNe" + - "apolitanNamaLow GermanNewariNiasNiueanAo NagaKwasioNgiemboonNogaiOld Nor" + - "seNovialN’KoNorthern SothoNuerClassical NewariNyamweziNyankoleNyoroNzima" + - "OsageOttoman TurkishPangasinanPahlaviPampangaPapiamentoPalauanPicardNige" + - "rian PidginPennsylvania GermanPlautdietschOld PersianPalatine GermanPhoe" + - "nicianPiedmontesePonticPohnpeianPrussianOld ProvençalKʼicheʼChimborazo H" + - "ighland QuichuaRajasthaniRapanuiRarotonganRomagnolRiffianRomboRomanyRotu" + - "manRusynRovianaAromanianRwaSandaweSakhaSamaritan AramaicSamburuSasakSant" + - "aliSaurashtraNgambaySanguSicilianScotsSassarese SardinianSouthern Kurdis" + - "hSenecaSenaSeriSelkupKoyraboro SenniOld IrishSamogitianTachelhitShanChad" + - "ian ArabicSidamoLower SilesianSelayarSouthern SamiLule SamiInari SamiSko" + - "lt SamiSoninkeSogdienSranan TongoSererSahoSaterland FrisianSukumaSusuSum" + - "erianComorianClassical SyriacSyriacSilesianTuluTimneTesoTerenoTetumTigre" + - "TivTokelauTsakhurKlingonTlingitTalyshTamashekNyasa TongaTok PisinTuroyoT" + - "arokoTsakonianTsimshianMuslim TatTumbukaTuvaluTasawaqTuvinianCentral Atl" + - "as TamazightUdmurtUgariticUmbunduRootVaiVenetianVepsWest FlemishMain-Fra" + - "nconianVoticVõroVunjoWalserWolayttaWarayWashoWarlpiriWu ChineseKalmykMin" + - "grelianSogaYaoYapeseYangbenYembaNheengatuCantoneseZapotecBlissymbolsZeel" + - "andicZenagaStandard Moroccan TamazightZuniNo linguistic contentZazaModer" + - "n Standard ArabicAustrian GermanSwiss High GermanAustralian EnglishCanad" + - "ian EnglishBritish EnglishAmerican EnglishLatin American SpanishEuropean" + - " SpanishMexican SpanishDariCanadian FrenchSwiss FrenchLow SaxonFlemishBr" + - "azilian PortugueseEuropean PortugueseMoldavianSerbo-CroatianCongo Swahil" + - "iSimplified ChineseTraditional Chinese" - -var enLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000d, 0x0014, 0x001d, 0x0021, 0x0028, 0x0031, - 0x0037, 0x003f, 0x0045, 0x004b, 0x0056, 0x005d, 0x0067, 0x0070, - 0x0077, 0x007e, 0x0084, 0x008b, 0x0091, 0x0098, 0x009f, 0x00a6, - 0x00ae, 0x00b6, 0x00ba, 0x00bf, 0x00cc, 0x00d3, 0x00d8, 0x00de, - 0x00e4, 0x00ea, 0x00f2, 0x00f5, 0x00fa, 0x0101, 0x010a, 0x0111, - 0x0119, 0x011f, 0x0126, 0x012b, 0x0132, 0x0138, 0x013f, 0x0145, - 0x0154, 0x0159, 0x0168, 0x0170, 0x0177, 0x017f, 0x0183, 0x0188, - 0x018e, 0x0193, 0x019c, 0x01a4, 0x01b2, 0x01bb, 0x01c3, 0x01c9, - // Entry 40 - 7F - 0x01d4, 0x01de, 0x01e9, 0x01ed, 0x01f7, 0x01fe, 0x0201, 0x020a, - 0x0211, 0x021a, 0x0222, 0x022a, 0x0232, 0x0237, 0x023d, 0x0245, - 0x024b, 0x0256, 0x025b, 0x0262, 0x0268, 0x026e, 0x0276, 0x027d, - 0x0281, 0x0288, 0x028e, 0x0293, 0x02a0, 0x02a5, 0x02af, 0x02b6, - 0x02b9, 0x02c3, 0x02cf, 0x02d6, 0x02de, 0x02e9, 0x02ee, 0x02f8, - 0x0301, 0x030a, 0x0311, 0x0316, 0x031d, 0x0324, 0x0329, 0x0336, - 0x033c, 0x0342, 0x0347, 0x0358, 0x0369, 0x0376, 0x037c, 0x0382, - 0x0389, 0x038f, 0x0394, 0x0398, 0x039f, 0x03a6, 0x03aa, 0x03b0, - // Entry 80 - BF - 0x03b6, 0x03c0, 0x03c7, 0x03ce, 0x03d3, 0x03db, 0x03e2, 0x03ed, - 0x03f5, 0x03fe, 0x0404, 0x0411, 0x0416, 0x041d, 0x0423, 0x042c, - 0x0432, 0x0437, 0x043d, 0x0445, 0x044c, 0x0451, 0x045f, 0x0468, - 0x046f, 0x0476, 0x047b, 0x0481, 0x0486, 0x048a, 0x0492, 0x0499, - 0x049f, 0x04a5, 0x04ac, 0x04b2, 0x04b7, 0x04bf, 0x04c5, 0x04ce, - 0x04d2, 0x04d7, 0x04dc, 0x04e6, 0x04ee, 0x04f5, 0x04fa, 0x04ff, - 0x0506, 0x050c, 0x0512, 0x0519, 0x051d, 0x0525, 0x052a, 0x0531, - 0x0537, 0x0546, 0x054e, 0x0553, 0x0557, 0x055f, 0x0566, 0x056b, - // Entry C0 - FF - 0x0578, 0x0586, 0x0591, 0x0597, 0x059e, 0x05a5, 0x05ab, 0x05b2, - 0x05c1, 0x05cd, 0x05d3, 0x05e2, 0x05f1, 0x05f4, 0x060a, 0x0612, - 0x0618, 0x061e, 0x0625, 0x062d, 0x0635, 0x063a, 0x063f, 0x0649, - 0x0650, 0x0654, 0x0659, 0x065f, 0x0663, 0x0668, 0x066e, 0x067d, - 0x0685, 0x068a, 0x068e, 0x0694, 0x0697, 0x069e, 0x06a9, 0x06b2, - 0x06b6, 0x06bc, 0x06c0, 0x06c6, 0x06cc, 0x06d4, 0x06d8, 0x06dc, - 0x06e3, 0x06e8, 0x06ed, 0x06f3, 0x06f8, 0x06ff, 0x0704, 0x070b, - 0x0713, 0x071b, 0x071f, 0x072d, 0x0734, 0x073d, 0x0745, 0x074d, - // Entry 100 - 13F - 0x075c, 0x0762, 0x076a, 0x0779, 0x078e, 0x0797, 0x079d, 0x07a3, - 0x07a8, 0x07b0, 0x07b5, 0x07bb, 0x07c0, 0x07c5, 0x07ca, 0x07d7, - 0x07e4, 0x07e9, 0x07f5, 0x07ff, 0x0804, 0x080a, 0x080e, 0x0812, - 0x0819, 0x0829, 0x082f, 0x0836, 0x0844, 0x0851, 0x0857, 0x0863, - 0x0867, 0x086f, 0x0881, 0x0884, 0x0890, 0x089d, 0x08a7, 0x08ae, - 0x08be, 0x08cd, 0x08d5, 0x08d7, 0x08dd, 0x08e8, 0x08ec, 0x08f1, - 0x0901, 0x0905, 0x090f, 0x0915, 0x0927, 0x0936, 0x0942, 0x0947, - 0x0950, 0x0956, 0x095b, 0x0968, 0x0974, 0x0979, 0x097f, 0x0984, - // Entry 140 - 17F - 0x098d, 0x0992, 0x099f, 0x09a7, 0x09b1, 0x09bb, 0x09c2, 0x09c7, - 0x09d4, 0x09e1, 0x09e5, 0x09e9, 0x09ef, 0x09f4, 0x09fa, 0x0a01, - 0x0a18, 0x0a1e, 0x0a24, 0x0a2b, 0x0a38, 0x0a44, 0x0a4a, 0x0a55, - 0x0a5b, 0x0a61, 0x0a64, 0x0a69, 0x0a6d, 0x0a76, 0x0a7d, 0x0a81, - 0x0a88, 0x0a94, 0x0a9b, 0x0a9f, 0x0aa7, 0x0aac, 0x0ab5, 0x0ac1, - 0x0ac7, 0x0ad0, 0x0ad4, 0x0adc, 0x0ae4, 0x0af0, 0x0af7, 0x0aff, - 0x0b05, 0x0b14, 0x0b18, 0x0b21, 0x0b29, 0x0b2f, 0x0b37, 0x0b3c, - 0x0b45, 0x0b4a, 0x0b51, 0x0b57, 0x0b5c, 0x0b62, 0x0b67, 0x0b6f, - // Entry 180 - 1BF - 0x0b81, 0x0b89, 0x0b91, 0x0b97, 0x0b9e, 0x0ba3, 0x0ba7, 0x0bb4, - 0x0bbd, 0x0bc7, 0x0bce, 0x0bd3, 0x0bd6, 0x0bda, 0x0bdf, 0x0bef, - 0x0bf2, 0x0bfa, 0x0bfe, 0x0c04, 0x0c0c, 0x0c13, 0x0c1b, 0x0c20, - 0x0c24, 0x0c2a, 0x0c30, 0x0c35, 0x0c39, 0x0c41, 0x0c4d, 0x0c5b, - 0x0c61, 0x0c68, 0x0c73, 0x0c79, 0x0c81, 0x0c87, 0x0c8c, 0x0c98, - 0x0c9f, 0x0cb1, 0x0cb6, 0x0cbf, 0x0cc6, 0x0cce, 0x0cd3, 0x0cd8, - 0x0ce3, 0x0cf2, 0x0cfc, 0x0d00, 0x0d0a, 0x0d10, 0x0d14, 0x0d1a, - 0x0d21, 0x0d27, 0x0d30, 0x0d35, 0x0d3e, 0x0d44, 0x0d4a, 0x0d58, - // Entry 1C0 - 1FF - 0x0d5c, 0x0d6c, 0x0d74, 0x0d7c, 0x0d81, 0x0d86, 0x0d8b, 0x0d9a, - 0x0da4, 0x0dab, 0x0db3, 0x0dbd, 0x0dc4, 0x0dca, 0x0dd9, 0x0dec, - 0x0df8, 0x0e03, 0x0e12, 0x0e1c, 0x0e27, 0x0e2d, 0x0e36, 0x0e3e, - 0x0e4c, 0x0e55, 0x0e70, 0x0e7a, 0x0e81, 0x0e8b, 0x0e93, 0x0e9a, - 0x0e9f, 0x0ea5, 0x0eac, 0x0eb1, 0x0eb8, 0x0ec1, 0x0ec4, 0x0ecb, - 0x0ed0, 0x0ee1, 0x0ee8, 0x0eed, 0x0ef4, 0x0efe, 0x0f05, 0x0f0a, - 0x0f12, 0x0f17, 0x0f2a, 0x0f3a, 0x0f40, 0x0f44, 0x0f48, 0x0f4e, - 0x0f5d, 0x0f66, 0x0f70, 0x0f79, 0x0f7d, 0x0f8b, 0x0f91, 0x0f9f, - // Entry 200 - 23F - 0x0fa6, 0x0fb3, 0x0fbc, 0x0fc6, 0x0fd0, 0x0fd7, 0x0fde, 0x0fea, - 0x0fef, 0x0ff3, 0x1004, 0x100a, 0x100e, 0x1016, 0x101e, 0x102e, - 0x1034, 0x103c, 0x1040, 0x1045, 0x1049, 0x104f, 0x1054, 0x1059, - 0x105c, 0x1063, 0x106a, 0x1071, 0x1078, 0x107e, 0x1086, 0x1091, - 0x109a, 0x10a0, 0x10a6, 0x10af, 0x10b8, 0x10c2, 0x10c9, 0x10cf, - 0x10d6, 0x10de, 0x10f5, 0x10fb, 0x1103, 0x110a, 0x110e, 0x1111, - 0x1119, 0x111d, 0x1129, 0x1138, 0x113d, 0x1142, 0x1147, 0x114d, - 0x1155, 0x115a, 0x115f, 0x1167, 0x1171, 0x1177, 0x1181, 0x1185, - // Entry 240 - 27F - 0x1188, 0x118e, 0x1195, 0x119a, 0x11a3, 0x11ac, 0x11b3, 0x11be, - 0x11c7, 0x11cd, 0x11e8, 0x11ec, 0x1201, 0x1205, 0x121b, 0x121b, - 0x122a, 0x123b, 0x124d, 0x125d, 0x126c, 0x127c, 0x1292, 0x12a2, - 0x12b1, 0x12b5, 0x12c4, 0x12d0, 0x12d9, 0x12e0, 0x12f4, 0x1307, - 0x1310, 0x131e, 0x132b, 0x133d, 0x1350, -} // Size: 1250 bytes - -const esLangStr string = "" + // Size: 4319 bytes - "afarabjasioavésticoafrikáansakanamáricoaragonésárabeasamésavaraimaraazer" + - "baiyanobaskirbielorrusobúlgarobislamabambarabengalítibetanobretónbosnioc" + - "atalánchechenochamorrocorsocreechecoeslavo eclesiásticochuvasiogalésdané" + - "salemándivehidzongkhaewégriegoinglésesperantoespañolestonioeuskerapersaf" + - "ulafinésfiyianoferoésfrancésfrisón occidentalirlandésgaélico escocésgall" + - "egoguaraníguyaratímanéshausahebreohindihiri motucroatacriollo haitianohú" + - "ngaroarmeniohererointerlinguaindonesiointerlingueigboyi de Sichuáninupia" + - "qidoislandésitalianoinuktitutjaponésjavanésgeorgianokongokikuyukuanyamak" + - "azajogroenlandésjemercanaréscoreanokanuricachemirokurdokomicórnicokirguí" + - "slatínluxemburguésgandalimburguéslingalalaolituanoluba-katangaletónmalga" + - "chemarshalésmaorímacedoniomalayalammongolmaratímalayomaltésbirmanonaurua" + - "nondebele septentrionalnepalíndonganeerlandésnoruego nynorsknoruego bokm" + - "alndebele meridionalnavajonyanjaoccitanoojibwaoromooriyaoséticopanyabípa" + - "lipolacopastúnportuguésquechuaromanchekirundirumanorusokinyarwandasánscr" + - "itosardosindhisami septentrionalsangocingaléseslovacoeslovenosamoanoshon" + - "asomalíalbanésserbiosuazisesotho meridionalsundanéssuecosuajilitamiltelu" + - "gutayikotailandéstigriñaturcomanosetsuanatonganoturcotsongatártarotahiti" + - "anouigurucranianourduuzbekovendavietnamitavolapükvalónwólofxhosayidisyor" + - "ubazhuangchinozulúacehnésacoliadangmeadiguéafrihiliaghemainuacadioaleuti" + - "anoaltái meridionalinglés antiguoangikaarameomapuchearapahoarahuacoasuas" + - "turianoavadhibaluchibalinésbasaabamúnghomalabejabembabenabafutbaluchi oc" + - "cidentalbhoyapuríbicolbinikomsiksikabrajbodoakooseburiatobuginésbulublin" + - "medumbacaddocaribecayugaatsamcebuanochigachibchachagatáitrukésmaríjerga " + - "chinukchoctawchipewyancheroquicheyenekurdo soranicoptotártaro de Crimeac" + - "riollo seychelensecasubiodakotadargvataitadelawareslavedogribdinkazarmad" + - "ogribajo sorbiodualaneerlandés mediojola-fonyidiuladazagaembuefikegipcio" + - " antiguoekajukelamitainglés medioewondofangfilipinofonfrancés mediofranc" + - "és antiguofrisón septentrionalfrisón orientalfriulanogagagauzochino gan" + - "gayogbayageezgilbertésalto alemán medioalto alemán antiguogondigorontalo" + - "góticogrebogriego antiguoalemán suizogusiikutchinhaidachino hakkahawaian" + - "ohiligaynonhititahmongalto sorbiochino xianghupaibanibibioilocanoingushl" + - "ojbanngombamachamejudeo-persajudeo-árabekarakalpakocabilakachinjjukambak" + - "awikabardianokanembutyapmakondecriollo caboverdianokorokhasikotanéskoyra" + - " chiinikakokalenjinkimbundukomi permiokonkaníkosraeanokpellekarachay-bal" + - "karcareliokurukhshambalabafiakölschkumykkutenailadinolangilahndalambalez" + - "gianolakotamongolozilorí septentrionalluba-lulualuiseñolundaluomizoluyia" + - "madurésmafamagahimaithilimacasarmandingomasáimabamokshamandarmendemerucr" + - "iollo mauricianoirlandés mediomakhuwa-meettometa’micmacminangkabaumanchú" + - "manipurimohawkmossimundangvarios idiomascreekmirandésmarwarimyeneerzyama" + - "zandaraníchino min nannapolitanonamabajo alemánnewariniasniueanokwasiong" + - "iemboonnogainórdico antiguon’kosesotho septentrionalnuernewari clásicony" + - "amwezinyankolenyoronzimaosageturco otomanopangasinánpahlavipampangapapia" + - "mentopalauanopidgin de Nigeriapersa antiguofeniciopohnpeianoprusianoprov" + - "enzal antiguoquichérajasthanirapanuirarotonganoromboromaníarrumanorwasan" + - "dawesakhaarameo samaritanosamburusasaksantalingambaysangusicilianoescocé" + - "skurdo meridionalsenecasenaselkupkoyraboro senniirlandés antiguotashelhi" + - "tshanárabe chadianosidamosami meridionalsami lulesami inarisami skoltson" + - "inkésogdianosranan tongoserersahosukumasususumeriocomorensesiríaco clási" + - "cosiriacotemnetesoterenotetúntigrétivtokelauanoklingontlingittamashekton" + - "ga del Nyasatok pisintarokotsimshianotumbukatuvaluanotasawaqtuvinianotam" + - "azight del Atlas Centraludmurtugaríticoumbunduraízvaivóticovunjowalserwo" + - "laytawaraywashowarlpirichino wukalmyksogayaoyapésyangbenyembacantonészap" + - "otecosímbolos Blisszenagatamazight estándar marroquízuñisin contenido li" + - "ngüísticozazakiárabe estándar modernoalemán austríacoalto alemán suizoin" + - "glés australianoinglés canadienseinglés británicoinglés estadounidensees" + - "pañol latinoamericanoespañol de Españaespañol de Méxicofrancés canadiens" + - "efrancés suizobajo sajónflamencoportugués de Brasilportugués de Portugal" + - "moldavoserbocroatasuajili del Congochino simplificadochino tradicional" - -var esLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000b, 0x0014, 0x001e, 0x0022, 0x002a, 0x0033, - 0x0039, 0x0040, 0x0044, 0x004a, 0x0055, 0x005b, 0x0065, 0x006d, - 0x0074, 0x007b, 0x0083, 0x008b, 0x0092, 0x0098, 0x00a0, 0x00a8, - 0x00b0, 0x00b5, 0x00b9, 0x00be, 0x00d2, 0x00da, 0x00e0, 0x00e6, - 0x00ed, 0x00f3, 0x00fb, 0x00ff, 0x0105, 0x010c, 0x0115, 0x011d, - 0x0124, 0x012b, 0x0130, 0x0134, 0x013a, 0x0141, 0x0148, 0x0150, - 0x0162, 0x016b, 0x017c, 0x0183, 0x018b, 0x0194, 0x019a, 0x019f, - 0x01a5, 0x01aa, 0x01b3, 0x01b9, 0x01c9, 0x01d1, 0x01d8, 0x01de, - // Entry 40 - 7F - 0x01e9, 0x01f2, 0x01fd, 0x0201, 0x020f, 0x0216, 0x0219, 0x0222, - 0x022a, 0x0233, 0x023b, 0x0243, 0x024c, 0x0251, 0x0257, 0x025f, - 0x0265, 0x0271, 0x0276, 0x027e, 0x0285, 0x028b, 0x0294, 0x0299, - 0x029d, 0x02a5, 0x02ad, 0x02b3, 0x02c0, 0x02c5, 0x02d0, 0x02d7, - 0x02da, 0x02e1, 0x02ed, 0x02f3, 0x02fb, 0x0305, 0x030b, 0x0314, - 0x031d, 0x0323, 0x032a, 0x0330, 0x0337, 0x033e, 0x0346, 0x035b, - 0x0362, 0x0368, 0x0373, 0x0382, 0x0390, 0x03a2, 0x03a8, 0x03ae, - 0x03b6, 0x03bc, 0x03c1, 0x03c6, 0x03ce, 0x03d6, 0x03da, 0x03e0, - // Entry 80 - BF - 0x03e7, 0x03f1, 0x03f8, 0x0400, 0x0407, 0x040d, 0x0411, 0x041c, - 0x0426, 0x042b, 0x0431, 0x0443, 0x0448, 0x0451, 0x0459, 0x0461, - 0x0468, 0x046d, 0x0474, 0x047c, 0x0482, 0x0487, 0x0499, 0x04a2, - 0x04a7, 0x04ae, 0x04b3, 0x04b9, 0x04bf, 0x04c9, 0x04d1, 0x04da, - 0x04e2, 0x04e9, 0x04ee, 0x04f4, 0x04fc, 0x0505, 0x050a, 0x0513, - 0x0517, 0x051d, 0x0522, 0x052c, 0x0534, 0x053a, 0x0540, 0x0545, - 0x054a, 0x0550, 0x0556, 0x055b, 0x0560, 0x0568, 0x056d, 0x0574, - 0x057b, 0x057b, 0x0583, 0x0588, 0x058c, 0x0592, 0x0592, 0x059b, - // Entry C0 - FF - 0x059b, 0x05ac, 0x05bb, 0x05c1, 0x05c7, 0x05ce, 0x05ce, 0x05d5, - 0x05d5, 0x05d5, 0x05dd, 0x05dd, 0x05dd, 0x05e0, 0x05e0, 0x05e9, - 0x05e9, 0x05ef, 0x05f6, 0x05fe, 0x05fe, 0x0603, 0x0609, 0x0609, - 0x0610, 0x0614, 0x0619, 0x0619, 0x061d, 0x0622, 0x0622, 0x0634, - 0x063e, 0x0643, 0x0647, 0x0647, 0x064a, 0x0651, 0x0651, 0x0651, - 0x0655, 0x0655, 0x0659, 0x065f, 0x0666, 0x066e, 0x0672, 0x0676, - 0x067d, 0x0682, 0x0688, 0x068e, 0x0693, 0x069a, 0x069f, 0x06a6, - 0x06af, 0x06b6, 0x06bb, 0x06c7, 0x06ce, 0x06d7, 0x06df, 0x06e6, - // Entry 100 - 13F - 0x06f2, 0x06f7, 0x06f7, 0x0709, 0x071c, 0x0723, 0x0729, 0x072f, - 0x0734, 0x073c, 0x0741, 0x0747, 0x074c, 0x0751, 0x0756, 0x0761, - 0x0761, 0x0766, 0x0777, 0x0781, 0x0786, 0x078c, 0x0790, 0x0794, - 0x0794, 0x07a3, 0x07a9, 0x07b0, 0x07bd, 0x07bd, 0x07c3, 0x07c3, - 0x07c7, 0x07cf, 0x07cf, 0x07d2, 0x07d2, 0x07e0, 0x07f0, 0x07f0, - 0x0805, 0x0815, 0x081d, 0x081f, 0x0826, 0x082f, 0x0833, 0x0838, - 0x0838, 0x083c, 0x0846, 0x0846, 0x0858, 0x086c, 0x086c, 0x0871, - 0x087a, 0x0881, 0x0886, 0x0894, 0x08a1, 0x08a1, 0x08a1, 0x08a6, - // Entry 140 - 17F - 0x08ad, 0x08b2, 0x08bd, 0x08c5, 0x08c5, 0x08cf, 0x08d5, 0x08da, - 0x08e5, 0x08f0, 0x08f4, 0x08f8, 0x08fe, 0x0905, 0x090b, 0x090b, - 0x090b, 0x0911, 0x0917, 0x091e, 0x0929, 0x0935, 0x0935, 0x0940, - 0x0946, 0x094c, 0x094f, 0x0954, 0x0958, 0x0962, 0x0969, 0x096d, - 0x0974, 0x0988, 0x0988, 0x098c, 0x098c, 0x0991, 0x0999, 0x09a5, - 0x09a5, 0x09a5, 0x09a9, 0x09b1, 0x09b9, 0x09c4, 0x09cc, 0x09d5, - 0x09db, 0x09ea, 0x09ea, 0x09ea, 0x09f1, 0x09f7, 0x09ff, 0x0a04, - 0x0a0b, 0x0a10, 0x0a17, 0x0a1d, 0x0a22, 0x0a28, 0x0a2d, 0x0a35, - // Entry 180 - 1BF - 0x0a35, 0x0a35, 0x0a35, 0x0a3b, 0x0a3b, 0x0a40, 0x0a44, 0x0a57, - 0x0a57, 0x0a61, 0x0a69, 0x0a6e, 0x0a71, 0x0a75, 0x0a7a, 0x0a7a, - 0x0a7a, 0x0a82, 0x0a86, 0x0a8c, 0x0a94, 0x0a9b, 0x0aa3, 0x0aa9, - 0x0aad, 0x0ab3, 0x0ab9, 0x0abe, 0x0ac2, 0x0ad4, 0x0ae3, 0x0af1, - 0x0af8, 0x0afe, 0x0b09, 0x0b10, 0x0b18, 0x0b1e, 0x0b23, 0x0b23, - 0x0b2a, 0x0b38, 0x0b3d, 0x0b46, 0x0b4d, 0x0b4d, 0x0b52, 0x0b57, - 0x0b63, 0x0b70, 0x0b7a, 0x0b7e, 0x0b8a, 0x0b90, 0x0b94, 0x0b9b, - 0x0b9b, 0x0ba1, 0x0baa, 0x0baf, 0x0bbf, 0x0bbf, 0x0bc5, 0x0bda, - // Entry 1C0 - 1FF - 0x0bde, 0x0bed, 0x0bf5, 0x0bfd, 0x0c02, 0x0c07, 0x0c0c, 0x0c19, - 0x0c24, 0x0c2b, 0x0c33, 0x0c3d, 0x0c45, 0x0c45, 0x0c56, 0x0c56, - 0x0c56, 0x0c63, 0x0c63, 0x0c6a, 0x0c6a, 0x0c6a, 0x0c74, 0x0c7c, - 0x0c8d, 0x0c94, 0x0c94, 0x0c9e, 0x0ca5, 0x0cb0, 0x0cb0, 0x0cb0, - 0x0cb5, 0x0cbc, 0x0cbc, 0x0cbc, 0x0cbc, 0x0cc4, 0x0cc7, 0x0cce, - 0x0cd3, 0x0ce4, 0x0ceb, 0x0cf0, 0x0cf7, 0x0cf7, 0x0cfe, 0x0d03, - 0x0d0c, 0x0d14, 0x0d14, 0x0d24, 0x0d2a, 0x0d2e, 0x0d2e, 0x0d34, - 0x0d43, 0x0d54, 0x0d54, 0x0d5d, 0x0d61, 0x0d70, 0x0d76, 0x0d76, - // Entry 200 - 23F - 0x0d76, 0x0d85, 0x0d8e, 0x0d98, 0x0da2, 0x0daa, 0x0db2, 0x0dbe, - 0x0dc3, 0x0dc7, 0x0dc7, 0x0dcd, 0x0dd1, 0x0dd8, 0x0de1, 0x0df2, - 0x0df9, 0x0df9, 0x0df9, 0x0dfe, 0x0e02, 0x0e08, 0x0e0e, 0x0e14, - 0x0e17, 0x0e21, 0x0e21, 0x0e28, 0x0e2f, 0x0e2f, 0x0e37, 0x0e46, - 0x0e4f, 0x0e4f, 0x0e55, 0x0e55, 0x0e5f, 0x0e5f, 0x0e66, 0x0e6f, - 0x0e76, 0x0e7f, 0x0e9a, 0x0ea0, 0x0eaa, 0x0eb1, 0x0eb6, 0x0eb9, - 0x0eb9, 0x0eb9, 0x0eb9, 0x0eb9, 0x0ec0, 0x0ec0, 0x0ec5, 0x0ecb, - 0x0ed2, 0x0ed7, 0x0edc, 0x0ee4, 0x0eec, 0x0ef2, 0x0ef2, 0x0ef6, - // Entry 240 - 27F - 0x0ef9, 0x0eff, 0x0f06, 0x0f0b, 0x0f0b, 0x0f14, 0x0f1c, 0x0f2b, - 0x0f2b, 0x0f31, 0x0f4e, 0x0f53, 0x0f6e, 0x0f74, 0x0f8c, 0x0f8c, - 0x0f9e, 0x0fb0, 0x0fc3, 0x0fd5, 0x0fe7, 0x0ffd, 0x1015, 0x1028, - 0x103b, 0x103b, 0x104e, 0x105c, 0x1067, 0x106f, 0x1083, 0x1099, - 0x10a0, 0x10ab, 0x10bc, 0x10ce, 0x10df, -} // Size: 1250 bytes - -const es419LangStr string = "" + // Size: 218 bytes - "vascogujaratihaitianolaosianoretorrománicoswahiliyídishachenésadigeoarap" + - "ajógriego clásicosorbio altoCriollo (Cabo Verde)luoprusiano antiguoárabe" + - " (Chad)tamazight del Marruecos Centralvaiwalamowuzuniswahili (Congo)" - -var es419LangIdx = []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x0015, 0x0015, 0x0015, 0x0015, - // Entry 40 - 7F - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - // Entry 80 - BF - 0x001d, 0x001d, 0x001d, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0041, 0x0041, 0x0041, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - // Entry C0 - FF - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - // Entry 100 - 13F - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, - // Entry 140 - 17F - 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - // Entry 180 - 1BF - 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, - 0x007d, 0x007d, 0x007d, 0x007d, 0x0080, 0x0080, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, - // Entry 1C0 - 1FF - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x009d, 0x009d, 0x009d, - // Entry 200 - 23F - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bf, - 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c7, 0x00c7, 0x00c7, 0x00c7, - // Entry 240 - 27F - 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, - 0x00c7, 0x00c7, 0x00c7, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, - 0x00cb, 0x00cb, 0x00da, -} // Size: 1246 bytes - -const etLangStr string = "" + // Size: 4574 bytes - "afariabhaasiavestaafrikaaniakaniamharaaragoniaraabiaassamiavaariaimaraas" + - "erbaidžaanibaškiirivalgevenebulgaariabislamabambarabengalitiibetibretoon" + - "ibosniakatalaanitšetšeenitšamorrokorsikakriitšehhikirikuslaavitšuvašikõm" + - "ritaanisaksamaldiividzongkhaevekreekaingliseesperantohispaaniaeestibaski" + - "pärsiafulasoomefidžifääriprantsuseläänefriisiiirigaeligaleegiguaraniigud" + - "žaratimänksihausaheebreahindihirimotuhorvaadihaitiungariarmeeniahereroi" + - "nterlinguaindoneesiainterlingueiboSichuani jiiinjupiakiidoislandiitaalia" + - "inuktitutijaapanijaavagruusiakongokikujukvanjamakasahhigröönikhmeerikann" + - "adakoreakanurikašmiirikurdikomikornikirgiisiladinaletseburgigandalimburg" + - "ilingalalaoleedulubalätimalagassimaršallimaoorimakedooniamalajalamimongo" + - "limarathimalaimaltabirmanaurupõhjandebelenepalindongahollandiuusnorranor" + - "ra bokmållõunandebelenavahonjandžaoksitaaniodžibveioromooriaosseedipandž" + - "abipaalipoolapuštuportugaliketšuaromanširundirumeeniaveneruandasanskriti" + - "sardisindhipõhjasaamisangosingalislovakisloveenisamoašonasomaalialbaania" + - "serbiasvaasilõunasothosundarootsisuahiilitamilitelugutadžikitaitigrinjat" + - "ürkmeenitsvanatongatürgitsongatataritahitiuiguuriukrainaurduusbekivenda" + - "vietnamivolapükivalloonivolofikoosajidišijorubatšuangihiinasuuluatšehiat" + - "šoliadangmeadõgeeTuneesia araabiaafrihiliaghemiainuakadialabamaaleuudig" + - "eegialtaivanaingliseangikaarameamapudunguniaraonaarapahoAlžeeria araabia" + - "aravakiMaroko araabiaEgiptuse araabiaasuAmeerika viipekeelastuuriaavadhi" + - "belutšibalibaieribasabamunibatakighomalabedžabembabetavibenabafutibadaga" + - "läänebelutšibhodžpuribikoliedobandžarikomi (Aafrika)mustjalaindiaanibišn" + - "uprijabahtiaribradžibrahuibodoakooseburjaadibugibulubilinimedumbakadokar" + - "iibikajukaatsamisebutšigatšibtšatšagataitšuugimaritšinuki žargoontšoktot" + - "šipevaitšerokiišaieenisoranikoptikapisnonikrimmitatariseišellikašuubisi" + - "uudargidavidadelavarisleividogribidinkazarmadogrialamsorbikeskdusunidual" + - "akeskhollandifonjidjuladazaembuefikiemiiliaegiptuseekadžukieelamikesking" + - "lisekeskjupikievondoestremenjufangifilipiinimeäfonicajun’ikeskprantsusev" + - "anaprantsusefrankoprovansipõhjafriisiidafriisifriuuligaagagauusikanigajo" + - "gbajaetioopiakiribatigilakikeskülemsaksavanaülemsaksagondigorontalogooti" + - "grebovanakreekašveitsisaksavajuufarefaregusiigvitšinihaidahakkahavaiFidž" + - "i hindihiligainonihetihmongiülemsorbisjangihupaibaniibibioilokoingušiisu" + - "riJamaica kreoolkeelložbanngombamatšamejuudipärsiajuudiaraabiajüütikarak" + - "alpakikabiilikatšinijjukambakaavikabardi-tšerkessikanembutjapimakondekab" + - "uverdianukorokaingangikhasisakakoyra chiinikhovarikõrmandžkikakokalendži" + - "nimbundupermikomikonkanikosraekpellekaratšai-balkaarikriokinaraiakarjala" + - "kuruhhišambalabafiakölnikumõkikutenailadiinolangilahndalambalesgiliguuri" + - "liivilakotalombardimongolozipõhjalurilatgalilulualuisenjolundaluolušeilu" + - "hjaklassikaline hiinalazimaduramafamagahimaithilimakassarimalinkemasaima" + - "bamokšamandarimendemeruMauritiuse kreoolkeelkeskiirimakhuwa-meettometami" + - "kmakiminangkabaumandžumanipurimohoogimoremäemarimundangimitu keeltmaskog" + - "imirandamarvarimentaveimjeneersamazandaraanilõunamininapolinamaalamsaksa" + - "nevariniasiniueaokwasiongiembooninogaivanapõhjalanoviaalnkoopõhjasothonu" + - "erivananevarinjamvesinkolenjoronzimaoseidžiosmanitürgipangasinanipahlavi" + - "pampangapapiamentobelaupikardiNigeeria pidžinkeelPennsylvania saksamenno" + - "niidisaksavanapärsiaPfalzifoiniikiapiemontepontosepoonpeipreisivanaprova" + - "nsikitšeradžastanirapanuirarotongaromanjariifirombomustlaskeelrotumaruss" + - "iinirovianaaromuunirvaasandavejakuudiSamaaria arameasamburusasakisantali" + - "sauraštrangambaisangusitsiiliašotilõunakurdisenekasenaserisölkupikoyrabo" + - "ro sennivanaiirižemaidišilhašaniTšaadi araabiasidamoalamsileesiaselajari" + - "lõunasaamiLule saamiInari saamikoltasaamisoninkesogdisrananisererisahosa" + - "terfriisisukumasususumerikomoorivanasüüriasüüriasileesiatulutemnetesoter" + - "enotetumitigreetivitokelautsahhiklingonitlingititalõšitamašekitšitongauu" + - "smelaneesiaturojotarokotsakooniatšimšilõunataaditumbukatuvalutaswaqitõva" + - "tamasiktiudmurdiugaritiumbundurootvaivenetivepsalääneflaamiMaini frangiv" + - "adjavõruvundžowalserivolaitavaraivašovarlpiriuukalmõkimegrelisogajaojapi" + - "yangbenijembanjengatukantonisapoteegiBlissi sümbolidzeelandizenagatamasi" + - "kti (Maroko)sunjimittekeelelinezazaaraabia (tänapäevane)Austria saksaŠve" + - "itsi ülemsaksaAustraalia ingliseKanada ingliseBriti ingliseAmeerika ingl" + - "iseLadina-Ameerika hispaaniaEuroopa hispaaniaMehhiko hispaaniaKanada pra" + - "ntsuseŠveitsi prantsuseHollandi alamsaksaflaamiBrasiilia portugaliEuroop" + - "a portugalimoldovaserbia-horvaadiKongo suahiili" - -var etLangIdx = []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0005, 0x000c, 0x0012, 0x001b, 0x0020, 0x0026, 0x002d, - 0x0034, 0x003a, 0x0040, 0x0046, 0x0054, 0x005d, 0x0066, 0x006f, - 0x0076, 0x007d, 0x0084, 0x008b, 0x0093, 0x0099, 0x00a2, 0x00ad, - 0x00b6, 0x00bd, 0x00c1, 0x00c8, 0x00d4, 0x00dd, 0x00e3, 0x00e8, - 0x00ed, 0x00f5, 0x00fd, 0x0100, 0x0106, 0x010d, 0x0116, 0x011f, - 0x0124, 0x0129, 0x0130, 0x0134, 0x0139, 0x013f, 0x0146, 0x014f, - 0x015c, 0x0160, 0x0165, 0x016c, 0x0174, 0x017e, 0x0185, 0x018a, - 0x0191, 0x0196, 0x019e, 0x01a6, 0x01ab, 0x01b1, 0x01b9, 0x01bf, - // Entry 40 - 7F - 0x01ca, 0x01d4, 0x01df, 0x01e2, 0x01ee, 0x01f7, 0x01fa, 0x0201, - 0x0208, 0x0212, 0x0219, 0x021e, 0x0225, 0x022a, 0x0230, 0x0238, - 0x023f, 0x0247, 0x024e, 0x0255, 0x025a, 0x0260, 0x0269, 0x026e, - 0x0272, 0x0277, 0x027f, 0x0285, 0x028f, 0x0294, 0x029c, 0x02a3, - 0x02a6, 0x02ab, 0x02af, 0x02b4, 0x02bd, 0x02c6, 0x02cc, 0x02d6, - 0x02e0, 0x02e7, 0x02ee, 0x02f3, 0x02f8, 0x02fd, 0x0302, 0x030f, - 0x0315, 0x031b, 0x0323, 0x032b, 0x0338, 0x0345, 0x034b, 0x0353, - 0x035c, 0x0365, 0x036a, 0x036e, 0x0375, 0x037e, 0x0383, 0x0388, - // Entry 80 - BF - 0x038e, 0x0397, 0x039e, 0x03a6, 0x03ab, 0x03b3, 0x03b7, 0x03bd, - 0x03c6, 0x03cb, 0x03d1, 0x03dc, 0x03e1, 0x03e8, 0x03ef, 0x03f7, - 0x03fc, 0x0401, 0x0408, 0x0410, 0x0416, 0x041c, 0x0427, 0x042c, - 0x0432, 0x043a, 0x0440, 0x0446, 0x044e, 0x0451, 0x0459, 0x0463, - 0x0469, 0x046e, 0x0474, 0x047a, 0x0480, 0x0486, 0x048d, 0x0494, - 0x0498, 0x049e, 0x04a3, 0x04ab, 0x04b4, 0x04bc, 0x04c2, 0x04c7, - 0x04ce, 0x04d4, 0x04dc, 0x04e1, 0x04e6, 0x04ed, 0x04f4, 0x04fb, - 0x0502, 0x0512, 0x051a, 0x0520, 0x0524, 0x0529, 0x0530, 0x0537, - // Entry C0 - FF - 0x053c, 0x0541, 0x054c, 0x0552, 0x0558, 0x0563, 0x0569, 0x0570, - 0x0581, 0x0581, 0x0588, 0x0596, 0x05a6, 0x05a9, 0x05bb, 0x05c3, - 0x05c3, 0x05c9, 0x05d1, 0x05d5, 0x05db, 0x05df, 0x05e5, 0x05eb, - 0x05f2, 0x05f8, 0x05fd, 0x0603, 0x0607, 0x060d, 0x0613, 0x0622, - 0x062c, 0x0632, 0x0635, 0x063e, 0x064c, 0x065c, 0x0667, 0x066f, - 0x0676, 0x067c, 0x0680, 0x0686, 0x068e, 0x0692, 0x0696, 0x069c, - 0x06a3, 0x06a7, 0x06ae, 0x06b4, 0x06ba, 0x06be, 0x06c4, 0x06cd, - 0x06d6, 0x06dd, 0x06e1, 0x06f2, 0x06f9, 0x0702, 0x070b, 0x0713, - // Entry 100 - 13F - 0x0719, 0x071e, 0x0727, 0x0733, 0x073c, 0x0744, 0x0748, 0x074d, - 0x0753, 0x075b, 0x0761, 0x0768, 0x076d, 0x0772, 0x0777, 0x0780, - 0x078a, 0x078f, 0x079b, 0x07a0, 0x07a5, 0x07a9, 0x07ad, 0x07b2, - 0x07b9, 0x07c1, 0x07ca, 0x07d0, 0x07db, 0x07e5, 0x07eb, 0x07f5, - 0x07fa, 0x0803, 0x0807, 0x080b, 0x0814, 0x0821, 0x082e, 0x083c, - 0x0848, 0x0851, 0x0858, 0x085b, 0x0863, 0x0867, 0x086b, 0x0870, - 0x0870, 0x0878, 0x0880, 0x0886, 0x0894, 0x08a2, 0x08a2, 0x08a7, - 0x08b0, 0x08b5, 0x08ba, 0x08c4, 0x08d1, 0x08d6, 0x08de, 0x08e3, - // Entry 140 - 17F - 0x08ec, 0x08f1, 0x08f6, 0x08fb, 0x0907, 0x0912, 0x0916, 0x091c, - 0x0926, 0x092c, 0x0930, 0x0935, 0x093b, 0x0940, 0x0947, 0x094c, - 0x095e, 0x0965, 0x096b, 0x0973, 0x097f, 0x098b, 0x0992, 0x099d, - 0x09a4, 0x09ac, 0x09af, 0x09b4, 0x09b9, 0x09cb, 0x09d2, 0x09d7, - 0x09de, 0x09ea, 0x09ea, 0x09ee, 0x09f7, 0x09fc, 0x0a00, 0x0a0c, - 0x0a13, 0x0a1f, 0x0a23, 0x0a2e, 0x0a34, 0x0a3d, 0x0a44, 0x0a4a, - 0x0a50, 0x0a62, 0x0a66, 0x0a6e, 0x0a75, 0x0a7c, 0x0a84, 0x0a89, - 0x0a8f, 0x0a96, 0x0a9d, 0x0aa4, 0x0aa9, 0x0aaf, 0x0ab4, 0x0ab9, - // Entry 180 - 1BF - 0x0ab9, 0x0ac0, 0x0ac5, 0x0acb, 0x0ad3, 0x0ad8, 0x0adc, 0x0ae6, - 0x0aed, 0x0af2, 0x0afa, 0x0aff, 0x0b02, 0x0b08, 0x0b0d, 0x0b1f, - 0x0b23, 0x0b29, 0x0b2d, 0x0b33, 0x0b3b, 0x0b44, 0x0b4b, 0x0b50, - 0x0b54, 0x0b5a, 0x0b61, 0x0b66, 0x0b6a, 0x0b7f, 0x0b87, 0x0b95, - 0x0b99, 0x0ba0, 0x0bab, 0x0bb2, 0x0bba, 0x0bc1, 0x0bc5, 0x0bcd, - 0x0bd5, 0x0bdf, 0x0be6, 0x0bed, 0x0bf4, 0x0bfc, 0x0c01, 0x0c05, - 0x0c11, 0x0c1b, 0x0c21, 0x0c25, 0x0c2e, 0x0c34, 0x0c39, 0x0c3d, - 0x0c3f, 0x0c45, 0x0c4f, 0x0c54, 0x0c60, 0x0c67, 0x0c6b, 0x0c76, - // Entry 1C0 - 1FF - 0x0c7b, 0x0c85, 0x0c8d, 0x0c92, 0x0c97, 0x0c9c, 0x0ca4, 0x0cb0, - 0x0cbb, 0x0cc2, 0x0cca, 0x0cd4, 0x0cd9, 0x0ce0, 0x0cf4, 0x0d06, - 0x0d15, 0x0d20, 0x0d26, 0x0d2f, 0x0d37, 0x0d3e, 0x0d45, 0x0d4b, - 0x0d57, 0x0d5d, 0x0d5d, 0x0d68, 0x0d6f, 0x0d78, 0x0d7f, 0x0d84, - 0x0d89, 0x0d94, 0x0d9a, 0x0da2, 0x0da9, 0x0db1, 0x0db5, 0x0dbc, - 0x0dc3, 0x0dd2, 0x0dd9, 0x0ddf, 0x0de6, 0x0df0, 0x0df7, 0x0dfc, - 0x0e05, 0x0e0a, 0x0e0a, 0x0e15, 0x0e1b, 0x0e1f, 0x0e23, 0x0e2b, - 0x0e3a, 0x0e42, 0x0e4a, 0x0e50, 0x0e55, 0x0e64, 0x0e6a, 0x0e76, - // Entry 200 - 23F - 0x0e7e, 0x0e89, 0x0e93, 0x0e9e, 0x0ea8, 0x0eaf, 0x0eb4, 0x0ebb, - 0x0ec1, 0x0ec5, 0x0ed0, 0x0ed6, 0x0eda, 0x0ee0, 0x0ee7, 0x0ef3, - 0x0efb, 0x0f03, 0x0f07, 0x0f0c, 0x0f10, 0x0f16, 0x0f1c, 0x0f22, - 0x0f26, 0x0f2d, 0x0f33, 0x0f3b, 0x0f43, 0x0f4b, 0x0f54, 0x0f5d, - 0x0f6a, 0x0f70, 0x0f76, 0x0f7f, 0x0f87, 0x0f92, 0x0f99, 0x0f9f, - 0x0fa6, 0x0fab, 0x0fb4, 0x0fbb, 0x0fc2, 0x0fc9, 0x0fcd, 0x0fd0, - 0x0fd6, 0x0fdb, 0x0fe8, 0x0ff4, 0x0ff9, 0x0ffe, 0x1005, 0x100c, - 0x1013, 0x1018, 0x101d, 0x1025, 0x1027, 0x102f, 0x1036, 0x103a, - // Entry 240 - 27F - 0x103d, 0x1041, 0x1049, 0x104e, 0x1056, 0x105d, 0x1066, 0x1076, - 0x107e, 0x1084, 0x1096, 0x109b, 0x10a9, 0x10ad, 0x10c4, 0x10c4, - 0x10d1, 0x10e4, 0x10f6, 0x1104, 0x1111, 0x1121, 0x113a, 0x114b, - 0x115c, 0x115c, 0x116c, 0x117e, 0x1190, 0x1196, 0x11a9, 0x11ba, - 0x11c1, 0x11d0, 0x11de, -} // Size: 1246 bytes - -const faLangStr string = "" + // Size: 7988 bytes - "آفاریآبخازیاوستاییآفریکانسآکانامهریآراگونیعربیآسامیآواریآیماراییترکی آذر" + - "بایجانیباشغیریبلاروسیبلغاریبیسلامابامباراییبنگالیتبتیبرتونبوسنیاییکاتال" + - "انچچنیچاموروییکورسیکریاییچکیاسلاوی کلیساییچوواشیولزیدانمارکیآلمانیدیوهی" + - "جونخاییاوه\u200cاییونانیانگلیسیاسپرانتواسپانیاییاستونیاییباسکیفارسیفولا" + - "ییفنلاندیفیجیاییفاروییفرانسویفریزی غربیایرلندیگیلی اسکاتلندیگالیسیاییگو" + - "ارانیگجراتیمانیهوسیاییعبریهندیموتویی هیریکرواتهائیتیاییمجاریارمنیهریروی" + - "یمیان\u200cزباناندونزیاییاکسیدنتالایگبویییی سیچواناینوپیکایدوایسلندیایت" + - "الیاییاینوکتیتوتژاپنیجاوه\u200cایگرجیکنگوییکیکویوییکوانیاماقزاقیگرینلند" + - "یخمریکاناراکره\u200cایکانوریاییکشمیریکردیکومیاییکرنوالیقرقیزیلاتینلوگزا" + - "مبورگیگانداییلیمبورگیلینگالالائوسیلیتوانیاییلوبایی‐کاتانگالتونیاییمالاگ" + - "اسیاییمارشالیمائوریاییمقدونیمالایالامیمغولیمراتیمالاییمالتیبرمه\u200cای" + - "نائوروییانده\u200cبله\u200cای شمالینپالیاندونگاییهلندینروژی نی\u200cنُش" + - "کنروژی بوک\u200cمُلانده\u200cبله\u200cای جنوبیناواهویینیانجاییاوکیتاییا" + - "وجیبواییاوروموییاوریه\u200cایآسیپنجابیپالیلهستانیپشتوپرتغالیکچواییرومان" + - "شروندیاییرومانیاییروسیکینیاروانداییسانسکریتساردینیاییسندیسامی شمالیسانگ" + - "وسینهالیاسلواکیاسلوونیاییساموآییشوناییسومالیاییآلبانیاییصربیسوازیاییسوت" + - "ویی جنوبیسونداییسوئدیسواحیلیتامیلیتلوگوییتاجیکیتایلندیتیگرینیاییترکمنیت" + - "سواناییتونگاییترکی استانبولیتسونگاییتاتاریتاهیتیاییاویغوریاوکراینیاردوا" + - "زبکیونداییویتنامیولاپوکوالونیولوفیخوسایییدییوروباییچوانگیچینیزولوییآچئی" + - "آچولیاییآدانگمه\u200cایآدیجیاییعربی تونسیآفریهیلیآگیمآینوییاکدیآلابامای" + - "یآلئوتیآلتایی جنوبیانگلیسی باستانآنگیکاآرامیماپوچه\u200cایآراپاهوییعربی" + - " الجزایریآراواکیعربی مراکشیعربی مصریآسوآستوریاودهیبلوچیبالیاییباواریاییب" + - "اساییبمونیبجاییبمباییبناییبلوچی غربیبوجپوریبیکولیبینیسیکسیکالری بختیاری" + - "براجبراهوییبودوییبوریاتیبوگیاییبلینکادوییکاریبیسبوییچیگاچیبچاجغتاییچوکی" + - "ماریاییچوکتوییچیپه\u200cویه\u200cایچروکیاییشایانیکردی مرکزیقبطیترکی کری" + - "مهسیشل آمیختهٔ فرانسویکاشوبیداکوتاییدارقینیتایتادلاواریدوگریبدینکاییزرم" + - "ادوگریصُربی سفلیدوآلاییهلندی میانهدیولا فونیدایولاییدازاگاییامبوافیکیمص" + - "ری کهناکاجوکعیلامیانگلیسی میانهاواندوفانگیفیلیپینیفونیفرانسوی کادینفران" + - "سوی میانهفرانسوی باستانفریزی شمالیفریزی شرقیفریولیاییگاییگاگائوزیاییگای" + - "وییگبایاییدری زرتشتیگی\u200cئزیگیلبرتیگیلکیآلمانی معیار میانهآلمانی علی" + - "ای باستانگوندیگورونتالوگوتیگریبویییونانی کهنآلمانی سوئیسیگوسیگویچ اینها" + - "یداییهاوائیاییهندی فیجیاییهیلی\u200cگاینونیهیتیهمونگصُربی علیاهوپاایبان" + - "یایبیبوییایلوکوییاینگوشیلوجباننگومباماچامه\u200cایفارسی یهودیعربی یهودی" + - "قره\u200cقالپاقیقبایلیکاچینیجوکامباییکاویاییکاباردینیتیاپیماکوندهکابوور" + - "دیانوکوروخاسیاییختنیکوجراچینیکهوارکرمانجیکاکاییکالنجینکیمبوندوییکومی پر" + - "میاککنکانیکپله\u200cایقره\u200cچایی‐بالکاریکاریلیانیکوروخیشامبالابافیای" + - "یریپواریکومیکیکوتنیلادینولانگیلاهندالامبالزگیلاکوتامونگوییلوزیاییلری شم" + - "الیلوبایی‐لولوالویسنولونداییلوئوییلوشه\u200cایلویاچینی ادبیمادوراییماگا" + - "هیاییمایدیلیماکاسارماندینگوییماساییمکشاییماندارمنده\u200cایمروییموریسین" + - "ایرلندی میانهماکوا متومتاییمیکماکیمینانگ\u200cکابوییمانچوییمیته\u200cای" + - "موهاکیماسیاییماندانگیچندین زبانکریکیمیراندیمارواریارزیاییمازندرانیناپلی" + - "ناماییآلمانی سفلینواریایینیاسینیوییکوازیوانگیمبونینغایینرس باستاننکوسوت" + - "ویی شمالینویرنواریایی کلاسیکنیام\u200cوزیایینیانکوله\u200cاینیورویینزیم" + - "اییاوسیجیترکی عثمانیپانگاسینانیپهلویپامپانگاییپاپیامنتوپالائویینیم" + - "\u200cزبان نیجریه\u200cایآلمانی پنسیلوانیاییفارسی باستانفنیقیپانپییپروسی" + - "پرووانسی باستانکیچه\u200cراجستانیراپانوییراروتونگاییرومبوییرومانوییآروم" + - "انیرواییسانداوه\u200cاییاقوتیآرامی سامریسامبوروساساکیسانتالیانگامباییسا" + - "نگوییسیسیلیاسکاتلندیکردی جنوبیسناسلکوپیکویرابورا سنیایرلندی باستانتاچل" + - "\u200cهیتشانیعربی چادیسیداموییسیلزیایی سفلیسامی جنوبیلوله سامیایناری سام" + - "یاسکولت سامیسونینکه\u200cایسغدیتاکی\u200cتاکیسریریساهوسوکوماییسوسوییسوم" + - "ریکوموریسریانی کلاسیکسریانیسیلزیاییتمنه\u200cایتسوییترنوتتومیتیگره" + - "\u200cایتیویکلینگونتلین\u200cگیتیتاماشقیتونگایی نیاساتوک\u200cپیسینیتارو" + - "کوییتسیم\u200cشیانیتومبوکاییتووالوییتسواکیتوواییآمازیغی اطلس مرکزیاودمو" + - "رتیاوگاریتیامبوندوییریشهویاییوتیونجووالسروالاموواراییواشوییوارلپیریقلمو" + - "قیسوگایییائویییاپییانگبنییمباییکانتونیزاپوتکیزناگاآمازیغی معیار مراکشزو" + - "نیاییبدون محتوای زبانیزازاییعربی رسمیترکی آذری جنوبیآلمانی اتریشآلمانی " + - "معیار سوئیسانگلیسی استرالیاانگلیسی کاناداانگلیسی بریتانیاانگلیسی امریکا" + - "اسپانیایی امریکای لاتیناسپانیایی اروپااسپانیایی مکزیکدریفرانسوی کاناداف" + - "رانسوی سوئیسساکسونی سفلیفلمنگیپرتغالی برزیلپرتغالی اروپامولداویاییصرب و" + - " کرواتیسواحیلی کنگوچینی ساده\u200cشدهچینی سنتی" - -var faLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000a, 0x0016, 0x0024, 0x0034, 0x003c, 0x0046, 0x0054, - 0x005c, 0x0066, 0x0070, 0x0080, 0x009d, 0x00ab, 0x00b9, 0x00c5, - 0x00d3, 0x00e5, 0x00f1, 0x00f9, 0x0103, 0x0113, 0x0121, 0x0129, - 0x0139, 0x0143, 0x014f, 0x0155, 0x0170, 0x017c, 0x0184, 0x0194, - 0x01a0, 0x01aa, 0x01b8, 0x01c5, 0x01d1, 0x01df, 0x01ef, 0x0201, - 0x0213, 0x021d, 0x0227, 0x0233, 0x0241, 0x024f, 0x025b, 0x0269, - 0x027c, 0x028a, 0x02a5, 0x02b7, 0x02c5, 0x02d1, 0x02d9, 0x02e7, - 0x02ef, 0x02f7, 0x030c, 0x0316, 0x0328, 0x0332, 0x033c, 0x034a, - // Entry 40 - 7F - 0x035d, 0x0371, 0x0383, 0x0391, 0x03a2, 0x03b0, 0x03b8, 0x03c6, - 0x03d8, 0x03ec, 0x03f6, 0x0405, 0x040d, 0x0419, 0x0429, 0x0439, - 0x0443, 0x0453, 0x045b, 0x0467, 0x0474, 0x0486, 0x0492, 0x049a, - 0x04a8, 0x04b6, 0x04c2, 0x04cc, 0x04e2, 0x04f0, 0x0500, 0x050e, - 0x051a, 0x052e, 0x054b, 0x055b, 0x0571, 0x057f, 0x0591, 0x059d, - 0x05b1, 0x05bb, 0x05c5, 0x05d1, 0x05db, 0x05ea, 0x05fa, 0x061d, - 0x0627, 0x0639, 0x0643, 0x065d, 0x0677, 0x069a, 0x06aa, 0x06ba, - 0x06ca, 0x06dc, 0x06ec, 0x06fd, 0x0703, 0x070f, 0x0717, 0x0725, - // Entry 80 - BF - 0x072d, 0x073b, 0x0747, 0x0753, 0x0763, 0x0775, 0x077d, 0x0797, - 0x07a7, 0x07bb, 0x07c3, 0x07d6, 0x07e0, 0x07ee, 0x07fc, 0x0810, - 0x081e, 0x082a, 0x083c, 0x084e, 0x0856, 0x0866, 0x087d, 0x088b, - 0x0895, 0x08a3, 0x08af, 0x08bd, 0x08c9, 0x08d7, 0x08eb, 0x08f7, - 0x0907, 0x0915, 0x0930, 0x0940, 0x094c, 0x095e, 0x096c, 0x097c, - 0x0984, 0x098e, 0x099a, 0x09a8, 0x09b4, 0x09c0, 0x09ca, 0x09d6, - 0x09dc, 0x09ec, 0x09f8, 0x0a00, 0x0a0c, 0x0a14, 0x0a24, 0x0a39, - 0x0a49, 0x0a5c, 0x0a6c, 0x0a74, 0x0a80, 0x0a88, 0x0a9a, 0x0aa6, - // Entry C0 - FF - 0x0aa6, 0x0abd, 0x0ad8, 0x0ae4, 0x0aee, 0x0b01, 0x0b01, 0x0b13, - 0x0b2c, 0x0b2c, 0x0b3a, 0x0b4f, 0x0b60, 0x0b66, 0x0b66, 0x0b72, - 0x0b72, 0x0b7c, 0x0b86, 0x0b94, 0x0ba6, 0x0bb2, 0x0bbc, 0x0bbc, - 0x0bbc, 0x0bc6, 0x0bd2, 0x0bd2, 0x0bdc, 0x0bdc, 0x0bdc, 0x0bef, - 0x0bfd, 0x0c09, 0x0c11, 0x0c11, 0x0c11, 0x0c1f, 0x0c1f, 0x0c34, - 0x0c3c, 0x0c4a, 0x0c56, 0x0c56, 0x0c64, 0x0c72, 0x0c72, 0x0c7a, - 0x0c7a, 0x0c86, 0x0c92, 0x0c92, 0x0c92, 0x0c9c, 0x0ca4, 0x0cae, - 0x0cba, 0x0cc2, 0x0cd0, 0x0cd0, 0x0cde, 0x0cf6, 0x0d06, 0x0d12, - // Entry 100 - 13F - 0x0d25, 0x0d2d, 0x0d2d, 0x0d40, 0x0d66, 0x0d72, 0x0d82, 0x0d90, - 0x0d9a, 0x0da8, 0x0da8, 0x0db4, 0x0dc2, 0x0dca, 0x0dd4, 0x0de7, - 0x0de7, 0x0df5, 0x0e0a, 0x0e1d, 0x0e2d, 0x0e3d, 0x0e45, 0x0e4f, - 0x0e4f, 0x0e5e, 0x0e6a, 0x0e76, 0x0e8f, 0x0e8f, 0x0e9b, 0x0e9b, - 0x0ea5, 0x0eb5, 0x0eb5, 0x0ebd, 0x0ed6, 0x0eef, 0x0f0a, 0x0f0a, - 0x0f1f, 0x0f32, 0x0f44, 0x0f4c, 0x0f62, 0x0f62, 0x0f6e, 0x0f7c, - 0x0f8f, 0x0f9c, 0x0faa, 0x0fb4, 0x0fd6, 0x0ffa, 0x0ffa, 0x1004, - 0x1016, 0x101e, 0x102c, 0x103f, 0x1058, 0x1058, 0x1058, 0x1060, - // Entry 140 - 17F - 0x106f, 0x107d, 0x107d, 0x108f, 0x10a6, 0x10bf, 0x10c7, 0x10d1, - 0x10e4, 0x10e4, 0x10ec, 0x10f8, 0x1108, 0x1118, 0x1126, 0x1126, - 0x1126, 0x1132, 0x113e, 0x1151, 0x1166, 0x1179, 0x1179, 0x1190, - 0x119c, 0x11a8, 0x11ac, 0x11ba, 0x11c8, 0x11da, 0x11da, 0x11e4, - 0x11f2, 0x1208, 0x1208, 0x1210, 0x1210, 0x121e, 0x1226, 0x1238, - 0x1242, 0x1250, 0x125c, 0x126a, 0x127e, 0x1293, 0x129f, 0x129f, - 0x12ae, 0x12d0, 0x12d0, 0x12d0, 0x12e2, 0x12ee, 0x12fc, 0x130a, - 0x1318, 0x1324, 0x132e, 0x133a, 0x1344, 0x1350, 0x135a, 0x1362, - // Entry 180 - 1BF - 0x1362, 0x1362, 0x1362, 0x136e, 0x136e, 0x137c, 0x138a, 0x139b, - 0x139b, 0x13b4, 0x13c0, 0x13ce, 0x13da, 0x13e9, 0x13f1, 0x1402, - 0x1402, 0x1412, 0x1412, 0x1424, 0x1432, 0x1440, 0x1454, 0x1460, - 0x1460, 0x146c, 0x1478, 0x1487, 0x1491, 0x149f, 0x14b8, 0x14c9, - 0x14d3, 0x14e1, 0x14fc, 0x150a, 0x1519, 0x1525, 0x1533, 0x1533, - 0x1543, 0x1556, 0x1560, 0x156e, 0x157c, 0x157c, 0x157c, 0x158a, - 0x159c, 0x159c, 0x15a6, 0x15b2, 0x15c7, 0x15d7, 0x15e1, 0x15eb, - 0x15eb, 0x15f7, 0x1609, 0x1613, 0x1626, 0x1626, 0x162c, 0x1643, - // Entry 1C0 - 1FF - 0x164b, 0x1668, 0x167f, 0x1696, 0x16a4, 0x16b2, 0x16be, 0x16d3, - 0x16e9, 0x16f3, 0x1707, 0x1719, 0x1729, 0x1729, 0x174e, 0x1773, - 0x1773, 0x178a, 0x178a, 0x1794, 0x1794, 0x1794, 0x17a0, 0x17aa, - 0x17c7, 0x17d2, 0x17d2, 0x17e2, 0x17f2, 0x1808, 0x1808, 0x1808, - 0x1816, 0x1826, 0x1826, 0x1826, 0x1826, 0x1834, 0x183e, 0x1853, - 0x185f, 0x1874, 0x1882, 0x188e, 0x189c, 0x189c, 0x18ae, 0x18bc, - 0x18c8, 0x18da, 0x18da, 0x18ed, 0x18ed, 0x18f3, 0x18f3, 0x18ff, - 0x1918, 0x1933, 0x1933, 0x1944, 0x194c, 0x195d, 0x196d, 0x1986, - // Entry 200 - 23F - 0x1986, 0x1999, 0x19aa, 0x19bf, 0x19d4, 0x19e9, 0x19f1, 0x1a04, - 0x1a0e, 0x1a16, 0x1a16, 0x1a26, 0x1a32, 0x1a3c, 0x1a48, 0x1a61, - 0x1a6d, 0x1a7d, 0x1a7d, 0x1a8c, 0x1a96, 0x1a9e, 0x1aa8, 0x1ab9, - 0x1ac1, 0x1ac1, 0x1ac1, 0x1acf, 0x1ae2, 0x1ae2, 0x1af0, 0x1b09, - 0x1b1e, 0x1b1e, 0x1b2e, 0x1b2e, 0x1b43, 0x1b43, 0x1b55, 0x1b65, - 0x1b71, 0x1b7d, 0x1b9f, 0x1baf, 0x1bbf, 0x1bd1, 0x1bd9, 0x1be3, - 0x1be3, 0x1be3, 0x1be3, 0x1be3, 0x1be9, 0x1be9, 0x1bf1, 0x1bfb, - 0x1c07, 0x1c13, 0x1c1f, 0x1c2f, 0x1c2f, 0x1c3b, 0x1c3b, 0x1c47, - // Entry 240 - 27F - 0x1c53, 0x1c5b, 0x1c69, 0x1c75, 0x1c75, 0x1c83, 0x1c91, 0x1c91, - 0x1c91, 0x1c9b, 0x1cbf, 0x1ccd, 0x1ced, 0x1cf9, 0x1d0a, 0x1d26, - 0x1d3d, 0x1d5f, 0x1d7e, 0x1d99, 0x1db8, 0x1dd3, 0x1dff, 0x1e1c, - 0x1e39, 0x1e3f, 0x1e5a, 0x1e73, 0x1e8a, 0x1e96, 0x1eaf, 0x1ec8, - 0x1edc, 0x1ef2, 0x1f09, 0x1f23, 0x1f34, -} // Size: 1250 bytes - -const fiLangStr string = "" + // Size: 4736 bytes - "afarabhaasiavestaafrikaansakanamharaaragoniaarabiaassamiavaariaimaraazer" + - "ibaškiirivalkovenäjäbulgariabislamabambarabengalitiibetbretonibosniakata" + - "laanitšetšeenitšamorrokorsikacreetšekkikirkkoslaavitšuvassikymritanskasa" + - "ksadivehidzongkhaewekreikkaenglantiesperantoespanjavirobaskifarsifulanis" + - "uomifidžifääriranskalänsifriisiiirigaeligaliciaguaranigudžaratimanksihau" + - "sahepreahindihiri-motukroatiahaitiunkariarmeniahererointerlinguaindonesi" + - "ainterlingueigbosichuanin-yiinupiaqidoislantiitaliainuktitutjapanijaavag" + - "eorgiakongokikujukuanjamakazakkikalaallisutkhmerkannadakoreakanurikašmir" + - "ikurdikomikornikirgiisilatinaluxemburggandalimburglingalalaoliettuakatan" + - "ganlubalatviamalagassimarshallmaorimakedoniamalajalammongolimarathimalai" + - "jimaltaburmanaurupohjois-ndebelenepalindongahollantinorjan nynorsknorjan" + - " bokmåletelä-ndebelenavajonjandžaoksitaaniodžibwaoromoorijaosseettipandž" + - "abipaalipuolapaštuportugaliketšuaretoromaanirundiromaniavenäjäruandasans" + - "kritsardisindhipohjoissaamesangosinhalaslovakkisloveenisamoašonasomalial" + - "baniaserbiaswazieteläsothosundaruotsiswahilitamilitelugutadžikkithaitigr" + - "injaturkmeenitswanatongaturkkitsongatataaritahitiuiguuriukrainaurduuzbek" + - "kivendavietnamvolapükvalloniwolofxhosajiddišjorubazhuangkiinazuluatšehat" + - "šoliadangmeadygetunisianarabiaafrihiliaghemainuakkadialabamaaleuttigegi" + - "altaimuinaisenglantiangikavaltakunnanarameamapudungunaraonaarapahoalgeri" + - "anarabiaarawakmarokonarabiaegyptinarabiaasuamerikkalainen viittomakielia" + - "sturiakotavaawadhibelutšibalibaijeribasaabamumbatak-tobaghomalabedžabemb" + - "abetawibenafutbadagalänsibelutšibhodžpuribikolbinibanjarkomsiksikabišnup" + - "riabahtiaribradžbrahuibodokooseburjaattibugibulubilinmedumbacaddokaribic" + - "ayugaatsamcebuanokigatšibtšatšagataichuukmarichinook-jargonchoctawchipew" + - "yancherokeecheyennesoranikopticapiznonkrimintataariseychellienkreolikašu" + - "bidakotadargitaitadelawareslevidogribdinkadjermadogrialasorbidusundualak" + - "eskihollantijola-fonyidjuladazagaembuefikemiliamuinaisegyptiekajukelamik" + - "eskienglantialaskanjupikewondoextremadurafangfilipinomeänkielifoncajunke" + - "skiranskamuinaisranskaarpitaanipohjoisfriisiitäfriisifriuligagagauzigan-" + - "kiinagajogbajazoroastrialaisdarige’ezkiribatigilakikeskiyläsaksamuinaisy" + - "läsaksagoankonkanigondigorontalogoottigrebomuinaiskreikkasveitsinsaksawa" + - "yuufrafragusiigwitšinhaidahakka-kiinahavaijifidžinhindihiligainoheettihm" + - "ongyläsorbixiang-kiinahupaibanibibioilokoinguušiinkeroinenjamaikankreoli" + - "englantilojbanngombamachamejuutalaispersiajuutalaisarabiajuuttikarakalpa" + - "kkikabyylikatšinjjukambakavikabardikanembutyapmakondekapverdenkreolikeny" + - "angnorsunluurannikonkorokaingangkhasikhotanikoyra chiinikhowarkirmanjkik" + - "akokalenjinkimbundukomipermjakkikonkanikosraekpellekaratšai-balkaarikrio" + - "kinaray-akarjalakurukhshambalabafiakölschkumykkikutenailadinolangolahnda" + - "lambalezgilingua franca novaliguuriliivilakotalombardimongolozipohjoislu" + - "rilatgalliluluanlubaluiseñolundaluolusailuhyaklassinen kiinalazimadurama" + - "famagahimaithilimakassarmandingomaasaimabamokšamandarmendemerumorisyenke" + - "ski-iirimakua-meettometa’micmacminangkabaumantšumanipurimohawkmossivuori" + - "marimundanguseita kieliäcreekmirandeesimarwarimentawaimyeneersämazandara" + - "nimin nan -kiinanapolinamaalasaksanewariniasniueao nagakwasiongiemboonno" + - "gaimuinaisnorjanovialn’kopohjoissothonuerklassinen newarinyamwezinyankol" + - "enyoronzimaosageosmanipangasinanpahlavipampangapapiamentupalaupicardinig" + - "erianpidginpennsylvaniansaksaplautdietschmuinaispersiapfaltsifoinikiapie" + - "montepontoksenkreikkapohnpeimuinaispreussimuinaisprovensaalikʼicheʼchimb" + - "orazonylänköketšuaradžastanirapanuirarotongaromagnolitarifitromboromanir" + - "otumaruteenirovianaaromaniarwasandawejakuuttisamarianarameasamburusasaks" + - "antalisauraštringambaysangusisiliaskottisassarinsardieteläkurdisenecasen" + - "aseriselkuppikoyraboro sennimuinaisiirisamogiittitašelhitshantšadinarabi" + - "asidamosleesiansaksaselayareteläsaameluulajansaameinarinsaamekoltansaame" + - "soninkesogdisrananserersahosaterlandinfriisisukumasususumerikomorimuinai" + - "ssyyriasyyriasleesiatulutemnetesoterenotetumtigretivtokelautsahuriklingo" + - "ntlingittališitamašekmalawintongatok-pisinturojotarokotsakoniatsimšitati" + - "tumbukatuvalutasawaqtuvakeskiatlaksentamazightudmurttiugaritmbundujuuriv" + - "aivenetsiavepsälänsiflaamimaininfrankkivatjavõrovunjowalserwolaittawaray" + - "washowarlpiriwu-kiinakalmukkimingrelisogajaojapiyangbenyembañeengatúkant" + - "oninkiinazapoteekkiblisskieliseelantizenagavakioitu tamazightzuniei kiel" + - "ellistä sisältöäzazayleisarabiaitävallansaksasveitsinyläsaksaaustraliane" + - "nglantikanadanenglantibritannianenglantiamerikanenglantiamerikanespanjae" + - "uroopanespanjameksikonespanjakanadanranskasveitsinranskaalankomaidenalas" + - "aksaflaamibrasilianportugalieuroopanportugalimoldovaserbokroaattikingwan" + - "ayksinkertaistettu kiinaperinteinen kiina" - -var fiLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000b, 0x0011, 0x001a, 0x001e, 0x0024, 0x002c, - 0x0032, 0x0038, 0x003e, 0x0044, 0x0049, 0x0052, 0x005f, 0x0067, - 0x006e, 0x0075, 0x007c, 0x0082, 0x0089, 0x008f, 0x0098, 0x00a3, - 0x00ac, 0x00b3, 0x00b7, 0x00be, 0x00ca, 0x00d3, 0x00d8, 0x00de, - 0x00e3, 0x00e9, 0x00f1, 0x00f4, 0x00fb, 0x0103, 0x010c, 0x0113, - 0x0117, 0x011c, 0x0121, 0x0127, 0x012c, 0x0132, 0x0139, 0x013f, - 0x014b, 0x014f, 0x0154, 0x015b, 0x0162, 0x016c, 0x0172, 0x0177, - 0x017d, 0x0182, 0x018b, 0x0192, 0x0197, 0x019d, 0x01a4, 0x01aa, - // Entry 40 - 7F - 0x01b5, 0x01be, 0x01c9, 0x01cd, 0x01d9, 0x01e0, 0x01e3, 0x01ea, - 0x01f0, 0x01f9, 0x01ff, 0x0204, 0x020b, 0x0210, 0x0216, 0x021e, - 0x0225, 0x0230, 0x0235, 0x023c, 0x0241, 0x0247, 0x024f, 0x0254, - 0x0258, 0x025d, 0x0265, 0x026b, 0x0274, 0x0279, 0x0280, 0x0287, - 0x028a, 0x0291, 0x029d, 0x02a3, 0x02ac, 0x02b4, 0x02b9, 0x02c2, - 0x02cb, 0x02d2, 0x02d9, 0x02e0, 0x02e5, 0x02ea, 0x02ef, 0x02fe, - 0x0304, 0x030a, 0x0312, 0x0320, 0x032e, 0x033c, 0x0342, 0x034a, - 0x0353, 0x035b, 0x0360, 0x0365, 0x036d, 0x0376, 0x037b, 0x0380, - // Entry 80 - BF - 0x0386, 0x038f, 0x0396, 0x03a1, 0x03a6, 0x03ad, 0x03b5, 0x03bb, - 0x03c3, 0x03c8, 0x03ce, 0x03da, 0x03df, 0x03e6, 0x03ee, 0x03f6, - 0x03fb, 0x0400, 0x0406, 0x040d, 0x0413, 0x0418, 0x0423, 0x0428, - 0x042e, 0x0435, 0x043b, 0x0441, 0x044a, 0x044e, 0x0456, 0x045f, - 0x0465, 0x046a, 0x0470, 0x0476, 0x047d, 0x0483, 0x048a, 0x0491, - 0x0495, 0x049c, 0x04a1, 0x04a8, 0x04b0, 0x04b7, 0x04bc, 0x04c1, - 0x04c8, 0x04ce, 0x04d4, 0x04d9, 0x04dd, 0x04e3, 0x04ea, 0x04f1, - 0x04f6, 0x0504, 0x050c, 0x0511, 0x0515, 0x051b, 0x0522, 0x0529, - // Entry C0 - FF - 0x052d, 0x0532, 0x0541, 0x0547, 0x0558, 0x0562, 0x0568, 0x056f, - 0x057d, 0x057d, 0x0583, 0x0590, 0x059d, 0x05a0, 0x05bc, 0x05c3, - 0x05c9, 0x05cf, 0x05d7, 0x05db, 0x05e2, 0x05e7, 0x05ec, 0x05f6, - 0x05fd, 0x0603, 0x0608, 0x060e, 0x0612, 0x0615, 0x061b, 0x0629, - 0x0633, 0x0638, 0x063c, 0x0642, 0x0645, 0x064c, 0x0656, 0x065e, - 0x0664, 0x066a, 0x066e, 0x0673, 0x067c, 0x0680, 0x0684, 0x0689, - 0x0690, 0x0695, 0x069b, 0x06a1, 0x06a6, 0x06ad, 0x06b1, 0x06ba, - 0x06c3, 0x06c8, 0x06cc, 0x06da, 0x06e1, 0x06ea, 0x06f2, 0x06fa, - // Entry 100 - 13F - 0x0700, 0x0705, 0x070d, 0x071a, 0x072b, 0x0732, 0x0738, 0x073d, - 0x0742, 0x074a, 0x074f, 0x0755, 0x075a, 0x0760, 0x0765, 0x076d, - 0x0772, 0x0777, 0x0784, 0x078e, 0x0793, 0x0799, 0x079d, 0x07a1, - 0x07a7, 0x07b4, 0x07ba, 0x07bf, 0x07cc, 0x07d8, 0x07de, 0x07e9, - 0x07ed, 0x07f5, 0x07ff, 0x0802, 0x0807, 0x0812, 0x081f, 0x0828, - 0x0835, 0x083f, 0x0845, 0x0847, 0x084e, 0x0857, 0x085b, 0x0860, - 0x0872, 0x0879, 0x0881, 0x0887, 0x0895, 0x08a5, 0x08b0, 0x08b5, - 0x08be, 0x08c4, 0x08c9, 0x08d7, 0x08e4, 0x08e9, 0x08ef, 0x08f4, - // Entry 140 - 17F - 0x08fc, 0x0901, 0x090c, 0x0913, 0x091f, 0x0928, 0x092e, 0x0933, - 0x093c, 0x0947, 0x094b, 0x094f, 0x0955, 0x095a, 0x0962, 0x096c, - 0x0982, 0x0988, 0x098e, 0x0995, 0x09a4, 0x09b3, 0x09b9, 0x09c5, - 0x09cc, 0x09d3, 0x09d6, 0x09db, 0x09df, 0x09e6, 0x09ed, 0x09f1, - 0x09f8, 0x0a07, 0x0a0e, 0x0a23, 0x0a2b, 0x0a30, 0x0a37, 0x0a43, - 0x0a49, 0x0a52, 0x0a56, 0x0a5e, 0x0a66, 0x0a73, 0x0a7a, 0x0a80, - 0x0a86, 0x0a98, 0x0a9c, 0x0aa5, 0x0aac, 0x0ab2, 0x0aba, 0x0abf, - 0x0ac6, 0x0acd, 0x0ad4, 0x0ada, 0x0adf, 0x0ae5, 0x0aea, 0x0aef, - // Entry 180 - 1BF - 0x0b01, 0x0b08, 0x0b0d, 0x0b13, 0x0b1b, 0x0b20, 0x0b24, 0x0b2f, - 0x0b37, 0x0b41, 0x0b49, 0x0b4e, 0x0b51, 0x0b56, 0x0b5b, 0x0b6a, - 0x0b6e, 0x0b74, 0x0b78, 0x0b7e, 0x0b86, 0x0b8e, 0x0b96, 0x0b9c, - 0x0ba0, 0x0ba6, 0x0bac, 0x0bb1, 0x0bb5, 0x0bbd, 0x0bc7, 0x0bd3, - 0x0bda, 0x0be0, 0x0beb, 0x0bf2, 0x0bfa, 0x0c00, 0x0c05, 0x0c0e, - 0x0c15, 0x0c23, 0x0c28, 0x0c32, 0x0c39, 0x0c41, 0x0c46, 0x0c4b, - 0x0c56, 0x0c64, 0x0c6a, 0x0c6e, 0x0c76, 0x0c7c, 0x0c80, 0x0c84, - 0x0c8b, 0x0c91, 0x0c9a, 0x0c9f, 0x0cab, 0x0cb1, 0x0cb7, 0x0cc3, - // Entry 1C0 - 1FF - 0x0cc7, 0x0cd7, 0x0cdf, 0x0ce7, 0x0cec, 0x0cf1, 0x0cf6, 0x0cfc, - 0x0d06, 0x0d0d, 0x0d15, 0x0d1f, 0x0d24, 0x0d2b, 0x0d39, 0x0d4b, - 0x0d57, 0x0d64, 0x0d6b, 0x0d73, 0x0d7b, 0x0d8b, 0x0d92, 0x0da0, - 0x0db2, 0x0dbb, 0x0dd5, 0x0de0, 0x0de7, 0x0df0, 0x0df9, 0x0e00, - 0x0e05, 0x0e0b, 0x0e11, 0x0e18, 0x0e1f, 0x0e27, 0x0e2a, 0x0e31, - 0x0e39, 0x0e47, 0x0e4e, 0x0e53, 0x0e5a, 0x0e64, 0x0e6b, 0x0e70, - 0x0e77, 0x0e7d, 0x0e8a, 0x0e95, 0x0e9b, 0x0e9f, 0x0ea3, 0x0eab, - 0x0eba, 0x0ec5, 0x0ecf, 0x0ed8, 0x0edc, 0x0ee9, 0x0eef, 0x0efc, - // Entry 200 - 23F - 0x0f03, 0x0f0e, 0x0f1b, 0x0f26, 0x0f31, 0x0f38, 0x0f3d, 0x0f43, - 0x0f48, 0x0f4c, 0x0f5d, 0x0f63, 0x0f67, 0x0f6d, 0x0f73, 0x0f80, - 0x0f86, 0x0f8d, 0x0f91, 0x0f96, 0x0f9a, 0x0fa0, 0x0fa5, 0x0faa, - 0x0fad, 0x0fb4, 0x0fbb, 0x0fc2, 0x0fc9, 0x0fd0, 0x0fd8, 0x0fe4, - 0x0fed, 0x0ff3, 0x0ff9, 0x1001, 0x1008, 0x100c, 0x1013, 0x1019, - 0x1020, 0x1024, 0x103a, 0x1042, 0x1048, 0x104e, 0x1053, 0x1056, - 0x105e, 0x1064, 0x1070, 0x107d, 0x1082, 0x1087, 0x108c, 0x1092, - 0x109a, 0x109f, 0x10a4, 0x10ac, 0x10b4, 0x10bc, 0x10c4, 0x10c8, - // Entry 240 - 27F - 0x10cb, 0x10cf, 0x10d6, 0x10db, 0x10e5, 0x10f2, 0x10fc, 0x1106, - 0x110e, 0x1114, 0x1126, 0x112a, 0x1145, 0x1149, 0x1154, 0x1154, - 0x1163, 0x1174, 0x1186, 0x1195, 0x11a7, 0x11b7, 0x11c6, 0x11d5, - 0x11e4, 0x11e4, 0x11f1, 0x11ff, 0x1213, 0x1219, 0x122b, 0x123c, - 0x1243, 0x1250, 0x1258, 0x126f, 0x1280, -} // Size: 1250 bytes - -const filLangStr string = "" + // Size: 3132 bytes - "AfarAbkhazianAfrikaansAkanAmharicAragoneseArabicAssameseAvaricAymaraAzer" + - "baijaniBashkirBelarusianBulgarianBislamaBambaraBanglaTibetanBretonBosnia" + - "nCatalanChechenChamorroCorsicanCzechChurch SlavicChuvashWelshDanishGerma" + - "nDivehiDzongkhaEweGreekInglesEsperantoSpanishEstonianBasquePersianFulahF" + - "innishFijianFaroeseFrenchKanlurang FrisianIrishScots GaelicGalicianGuara" + - "niGujaratiManxHausaHebrewHindiCroatianHaitianHungarianArmenianHereroInte" + - "rlinguaIndonesianInterlingueIgboSichuan YiIdoIcelandicItalianInuktitutJa" + - "paneseJavaneseGeorgianKongoKikuyuKuanyamaKazakhKalaallisutKhmerKannadaKo" + - "reanKanuriKashmiriKurdishKomiCornishKirghizLatinLuxembourgishGandaLimbur" + - "gishLingalaLaoLithuanianLuba-KatangaLatvianMalagasyMarshalleseMaoriMaced" + - "onianMalayalamMongolianMarathiMalayMalteseBurmeseNauruHilagang NdebeleNe" + - "paliNdongaDutchNorwegian NynorskNorwegian BokmålSouth NdebeleNavajoNyanj" + - "aOccitanOromoOdiaOsseticPunjabiPolishPashtoPortugueseQuechuaRomanshRundi" + - "RomanianRussianKinyarwandaSanskritSardinianSindhiHilagang SamiSangoSinha" + - "laSlovakSlovenianSamoanShonaSomaliAlbanianSerbianSwatiKatimugang SothoSu" + - "ndaneseSwedishSwahiliTamilTeluguTajikThaiTigrinyaTurkmenTswanaTonganTurk" + - "ishTsongaTatarTahitianUyghurUkranianUrduUzbekVendaVietnameseVolapükWallo" + - "onWolofXhosaYiddishYorubaChineseZuluAchineseAcoliAdangmeAdygheAghemAinuA" + - "leutSouthern AltaiAngikaMapucheArapahoAsuAsturianAwadhiBalineseBasaaBemb" + - "aBenaKanlurang BalochiBhojpuriBiniSiksikaBodoBugineseBlinCebuanoChigaChu" + - "ukeseMariChoctawCherokeeCheyenneCentral KurdishSeselwa Creole FrenchDako" + - "taDargwaTaitaDogribZarmaLower SorbianDualaJola-FonyiDazagaEmbuEfikEkajuk" + - "EwondoFilipinoFonFriulianGaGagauzGeezGilberteseGorontaloSwiss GermanGusi" + - "iGwichʼinHawaiianHiligaynonHmongUpper SorbianHupaIbanIbibioIlokoIngushLo" + - "jbanNgombaMachameKabyleKachinJjuKambaKabardianTyapMakondeKabuverdianuKor" + - "oKhasiKoyra ChiiniKakoKalenjinKimbunduKomi-PermyakKonkaniKpelleKarachay-" + - "BalkarKarelianKurukhShambalaBafiaColognianKumykLadinoLangiLezghianLakota" + - "LoziHilagang LuriLuba-LuluaLundaLuoMizoLuyiaMadureseMagahiMaithiliMakasa" + - "rMasaiMokshaMendeMeruMorisyenMakhuwa-MeettoMeta’MicmacMinangkabauManipur" + - "iMohawkMossiMundangMaramihang WikaCreekMirandeseErzyaMazanderaniNeapolit" + - "anNamaLow GermanNewariNiasNiueanKwasioNgiemboonNogaiN’KoHilagang SothoNu" + - "erNyankolePangasinanPampangaPapiamentoPalauanNigerian PidginPrussianKʼic" + - "heʼRapanuiRarotonganRomboAromanianRwaSandaweSakhaSamburuSantaliNgambaySa" + - "nguSicilianScotsKatimugang KurdishSenaKoyraboro SenniTachelhitShanKatimu" + - "gang SamiLule SamiInari SamiSkolt SamiSoninkeSranan TongoSahoSukumaComor" + - "ianSyriacTimneTesoTetumTigreKlingonTok PisinTarokoTumbukaTuvaluTasawaqTu" + - "vinianCentral Atlas TamazightUdmurtUmbunduRootVaiVunjoWalserWolayttaWara" + - "yWarlpiriKalmykSogaYangbenYembaCantoneseStandard Moroccan TamazightZuniW" + - "alang nilalaman na ukol sa wikaZazaModernong Karaniwang ArabicAustrian G" + - "ermanSwiss High GermanIngles ng AustralyaIngles sa CanadaIngles na Briti" + - "shIngles na AmericanLatin American na EspanyolEuropean SpanishMexican na" + - " EspanyolFrench sa CanadaSwiss na FrenchLow SaxonFlemishPortuges ng Bras" + - "ilEuropean PortugueseMoldavianSerbo-CroatianCongo SwahiliPinasimpleng Ch" + - "ineseTradisyonal na Chinese" - -var filLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000d, 0x000d, 0x0016, 0x001a, 0x0021, 0x002a, - 0x0030, 0x0038, 0x003e, 0x0044, 0x004f, 0x0056, 0x0060, 0x0069, - 0x0070, 0x0077, 0x007d, 0x0084, 0x008a, 0x0091, 0x0098, 0x009f, - 0x00a7, 0x00af, 0x00af, 0x00b4, 0x00c1, 0x00c8, 0x00cd, 0x00d3, - 0x00d9, 0x00df, 0x00e7, 0x00ea, 0x00ef, 0x00f5, 0x00fe, 0x0105, - 0x010d, 0x0113, 0x011a, 0x011f, 0x0126, 0x012c, 0x0133, 0x0139, - 0x014a, 0x014f, 0x015b, 0x0163, 0x016a, 0x0172, 0x0176, 0x017b, - 0x0181, 0x0186, 0x0186, 0x018e, 0x0195, 0x019e, 0x01a6, 0x01ac, - // Entry 40 - 7F - 0x01b7, 0x01c1, 0x01cc, 0x01d0, 0x01da, 0x01da, 0x01dd, 0x01e6, - 0x01ed, 0x01f6, 0x01fe, 0x0206, 0x020e, 0x0213, 0x0219, 0x0221, - 0x0227, 0x0232, 0x0237, 0x023e, 0x0244, 0x024a, 0x0252, 0x0259, - 0x025d, 0x0264, 0x026b, 0x0270, 0x027d, 0x0282, 0x028c, 0x0293, - 0x0296, 0x02a0, 0x02ac, 0x02b3, 0x02bb, 0x02c6, 0x02cb, 0x02d5, - 0x02de, 0x02e7, 0x02ee, 0x02f3, 0x02fa, 0x0301, 0x0306, 0x0316, - 0x031c, 0x0322, 0x0327, 0x0338, 0x0349, 0x0356, 0x035c, 0x0362, - 0x0369, 0x0369, 0x036e, 0x0372, 0x0379, 0x0380, 0x0380, 0x0386, - // Entry 80 - BF - 0x038c, 0x0396, 0x039d, 0x03a4, 0x03a9, 0x03b1, 0x03b8, 0x03c3, - 0x03cb, 0x03d4, 0x03da, 0x03e7, 0x03ec, 0x03f3, 0x03f9, 0x0402, - 0x0408, 0x040d, 0x0413, 0x041b, 0x0422, 0x0427, 0x0437, 0x0440, - 0x0447, 0x044e, 0x0453, 0x0459, 0x045e, 0x0462, 0x046a, 0x0471, - 0x0477, 0x047d, 0x0484, 0x048a, 0x048f, 0x0497, 0x049d, 0x04a5, - 0x04a9, 0x04ae, 0x04b3, 0x04bd, 0x04c5, 0x04cc, 0x04d1, 0x04d6, - 0x04dd, 0x04e3, 0x04e3, 0x04ea, 0x04ee, 0x04f6, 0x04fb, 0x0502, - 0x0508, 0x0508, 0x0508, 0x050d, 0x0511, 0x0511, 0x0511, 0x0516, - // Entry C0 - FF - 0x0516, 0x0524, 0x0524, 0x052a, 0x052a, 0x0531, 0x0531, 0x0538, - 0x0538, 0x0538, 0x0538, 0x0538, 0x0538, 0x053b, 0x053b, 0x0543, - 0x0543, 0x0549, 0x0549, 0x0551, 0x0551, 0x0556, 0x0556, 0x0556, - 0x0556, 0x0556, 0x055b, 0x055b, 0x055f, 0x055f, 0x055f, 0x0570, - 0x0578, 0x0578, 0x057c, 0x057c, 0x057c, 0x0583, 0x0583, 0x0583, - 0x0583, 0x0583, 0x0587, 0x0587, 0x0587, 0x058f, 0x058f, 0x0593, - 0x0593, 0x0593, 0x0593, 0x0593, 0x0593, 0x059a, 0x059f, 0x059f, - 0x059f, 0x05a7, 0x05ab, 0x05ab, 0x05b2, 0x05b2, 0x05ba, 0x05c2, - // Entry 100 - 13F - 0x05d1, 0x05d1, 0x05d1, 0x05d1, 0x05e6, 0x05e6, 0x05ec, 0x05f2, - 0x05f7, 0x05f7, 0x05f7, 0x05fd, 0x05fd, 0x0602, 0x0602, 0x060f, - 0x060f, 0x0614, 0x0614, 0x061e, 0x061e, 0x0624, 0x0628, 0x062c, - 0x062c, 0x062c, 0x0632, 0x0632, 0x0632, 0x0632, 0x0638, 0x0638, - 0x0638, 0x0640, 0x0640, 0x0643, 0x0643, 0x0643, 0x0643, 0x0643, - 0x0643, 0x0643, 0x064b, 0x064d, 0x0653, 0x0653, 0x0653, 0x0653, - 0x0653, 0x0657, 0x0661, 0x0661, 0x0661, 0x0661, 0x0661, 0x0661, - 0x066a, 0x066a, 0x066a, 0x066a, 0x0676, 0x0676, 0x0676, 0x067b, - // Entry 140 - 17F - 0x0684, 0x0684, 0x0684, 0x068c, 0x068c, 0x0696, 0x0696, 0x069b, - 0x06a8, 0x06a8, 0x06ac, 0x06b0, 0x06b6, 0x06bb, 0x06c1, 0x06c1, - 0x06c1, 0x06c7, 0x06cd, 0x06d4, 0x06d4, 0x06d4, 0x06d4, 0x06d4, - 0x06da, 0x06e0, 0x06e3, 0x06e8, 0x06e8, 0x06f1, 0x06f1, 0x06f5, - 0x06fc, 0x0708, 0x0708, 0x070c, 0x070c, 0x0711, 0x0711, 0x071d, - 0x071d, 0x071d, 0x0721, 0x0729, 0x0731, 0x073d, 0x0744, 0x0744, - 0x074a, 0x0759, 0x0759, 0x0759, 0x0761, 0x0767, 0x076f, 0x0774, - 0x077d, 0x0782, 0x0782, 0x0788, 0x078d, 0x078d, 0x078d, 0x0795, - // Entry 180 - 1BF - 0x0795, 0x0795, 0x0795, 0x079b, 0x079b, 0x079b, 0x079f, 0x07ac, - 0x07ac, 0x07b6, 0x07b6, 0x07bb, 0x07be, 0x07c2, 0x07c7, 0x07c7, - 0x07c7, 0x07cf, 0x07cf, 0x07d5, 0x07dd, 0x07e4, 0x07e4, 0x07e9, - 0x07e9, 0x07ef, 0x07ef, 0x07f4, 0x07f8, 0x0800, 0x0800, 0x080e, - 0x0815, 0x081b, 0x0826, 0x0826, 0x082e, 0x0834, 0x0839, 0x0839, - 0x0840, 0x084f, 0x0854, 0x085d, 0x085d, 0x085d, 0x085d, 0x0862, - 0x086d, 0x086d, 0x0877, 0x087b, 0x0885, 0x088b, 0x088f, 0x0895, - 0x0895, 0x089b, 0x08a4, 0x08a9, 0x08a9, 0x08a9, 0x08af, 0x08bd, - // Entry 1C0 - 1FF - 0x08c1, 0x08c1, 0x08c1, 0x08c9, 0x08c9, 0x08c9, 0x08c9, 0x08c9, - 0x08d3, 0x08d3, 0x08db, 0x08e5, 0x08ec, 0x08ec, 0x08fb, 0x08fb, - 0x08fb, 0x08fb, 0x08fb, 0x08fb, 0x08fb, 0x08fb, 0x08fb, 0x0903, - 0x0903, 0x090c, 0x090c, 0x090c, 0x0913, 0x091d, 0x091d, 0x091d, - 0x0922, 0x0922, 0x0922, 0x0922, 0x0922, 0x092b, 0x092e, 0x0935, - 0x093a, 0x093a, 0x0941, 0x0941, 0x0948, 0x0948, 0x094f, 0x0954, - 0x095c, 0x0961, 0x0961, 0x0973, 0x0973, 0x0977, 0x0977, 0x0977, - 0x0986, 0x0986, 0x0986, 0x098f, 0x0993, 0x0993, 0x0993, 0x0993, - // Entry 200 - 23F - 0x0993, 0x09a2, 0x09ab, 0x09b5, 0x09bf, 0x09c6, 0x09c6, 0x09d2, - 0x09d2, 0x09d6, 0x09d6, 0x09dc, 0x09dc, 0x09dc, 0x09e4, 0x09e4, - 0x09ea, 0x09ea, 0x09ea, 0x09ef, 0x09f3, 0x09f3, 0x09f8, 0x09fd, - 0x09fd, 0x09fd, 0x09fd, 0x0a04, 0x0a04, 0x0a04, 0x0a04, 0x0a04, - 0x0a0d, 0x0a0d, 0x0a13, 0x0a13, 0x0a13, 0x0a13, 0x0a1a, 0x0a20, - 0x0a27, 0x0a2f, 0x0a46, 0x0a4c, 0x0a4c, 0x0a53, 0x0a57, 0x0a5a, - 0x0a5a, 0x0a5a, 0x0a5a, 0x0a5a, 0x0a5a, 0x0a5a, 0x0a5f, 0x0a65, - 0x0a6d, 0x0a72, 0x0a72, 0x0a7a, 0x0a7a, 0x0a80, 0x0a80, 0x0a84, - // Entry 240 - 27F - 0x0a84, 0x0a84, 0x0a8b, 0x0a90, 0x0a90, 0x0a99, 0x0a99, 0x0a99, - 0x0a99, 0x0a99, 0x0ab4, 0x0ab8, 0x0ad8, 0x0adc, 0x0af7, 0x0af7, - 0x0b06, 0x0b17, 0x0b2a, 0x0b3a, 0x0b4b, 0x0b5d, 0x0b77, 0x0b87, - 0x0b9a, 0x0b9a, 0x0baa, 0x0bb9, 0x0bc2, 0x0bc9, 0x0bdb, 0x0bee, - 0x0bf7, 0x0c05, 0x0c12, 0x0c26, 0x0c3c, -} // Size: 1250 bytes - -const frLangStr string = "" + // Size: 5136 bytes - "afarabkhazeavestiqueafrikaansakanamhariquearagonaisarabeassamaisavarayma" + - "raazéribachkirbiélorussebulgarebichelamarbambarabengalitibétainbretonbos" + - "niaquecatalantchétchènechamorrocorsecreetchèqueslavon d’églisetchouvache" + - "galloisdanoisallemandmaldiviendzongkhaéwégrecanglaisespérantoespagnolest" + - "onienbasquepersanpeulfinnoisfidjienféroïenfrançaisfrison occidentalirlan" + - "daisgaélique écossaisgalicienguaranigoudjeratimannoishaoussahébreuhindih" + - "iri motucroatecréole haïtienhongroisarménienhérérointerlinguaindonésieni" + - "nterlingueigboyi du Sichuaninupiaqidoislandaisitalieninuktitutjaponaisja" + - "vanaisgéorgienkongokikuyukouanyamakazakhgroenlandaiskhmerkannadacoréenka" + - "nourikashmirikurdekomicorniquekirghizelatinluxembourgeoisgandalimbourgeo" + - "islingalalaolituanienluba-katangalettonmalgachemarshallaismaorimacédonie" + - "nmalayalammongolmarathemalaismaltaisbirmannauruanndébélé du Nordnépalais" + - "ndonganéerlandaisnorvégien nynorsknorvégien bokmålndébélé du Sudnavahony" + - "anjaoccitanojibwaoromooriyaossètependjabipalipolonaispachtoportugaisquec" + - "huaromancheroundiroumainrusserwandasanskritsardesindhisami du Nordsangho" + - "cinghalaisslovaqueslovènesamoanshonasomalialbanaisserbeswatisotho du Sud" + - "soundanaissuédoisswahilitamoultélougoutadjikthaïtigrignaturkmènetswanato" + - "nguienturctsongatatartahitienouïghourukrainienourdououzbekvendavietnamie" + - "nvolapukwallonwolofxhosayiddishyorubazhuangchinoiszoulouacehacoliadangme" + - "adyghéenarabe tunisienafrihiliaghemaïnouakkadienalabamaaléouteguèguealta" + - "ï du Sudancien anglaisangikaaraméenmapuchearaonaarapahoarabe algérienar" + - "awakarabe marocainarabe égyptienassoulangue des signes américaineasturie" + - "nkotavaawadhibaloutchibalinaisbavaroisbassabamounbatak tobaghomalabedjab" + - "embabetawibénabafutbadagabaloutchi occidentalbhojpuribikolbinibanjarkoms" + - "iksikabishnupriyabakhtiaribrajbrahouibodoakoosebouriatebugibouloublinméd" + - "umbacaddocaribecayugaatsamcebuanokigachibchatchaghataïchuukmarijargon ch" + - "inookchoctawchipewyancherokeecheyennesoranicoptecapiznonturc de Criméecr" + - "éole seychelloiskachoubedakotadargwataitadelawareesclavedogribdinkazarm" + - "adogribas-sorabedusun centraldoualamoyen néerlandaisdiola-fognydiouladaz" + - "agaembouéfikémilienégyptien ancienékadjoukélamitemoyen anglaisyoupik cen" + - "traléwondoestrémègnefangfilipinofinnois tornédalienfonfrançais cadienmoy" + - "en françaisancien françaisfrancoprovençalfrison du Nordfrison orientalfr" + - "ioulangagagaouzegangayogbayadari zoroastrienguèzegilbertingilakimoyen ha" + - "ut-allemandancien haut allemandkonkani de Goagondigorontalogothiquegrebo" + - "grec anciensuisse allemandwayuugurennegusiigwichʼinhaidahakkahawaïenhind" + - "i fidjienhiligaynonhittitehmonghaut-sorabexianghupaibanibibioilokanoingo" + - "ucheingriencréole jamaïcainlojbanngombamatchaméjudéo-persanjudéo-arabeju" + - "tekarakalpakkabylekachinjjukambakawikabardinkanemboutyapmakondécapverdie" + - "nkényangkorocainganguekhasikhotanaiskoyra chiinikhowarkirmanjkikakokalen" + - "djinkimboundoukomi-permiakkonkanikosraéenkpellékaratchaï balkarkriokinar" + - "ay-acarélienkouroukhchambalabafiafrancique ripuairekoumykkutenailadinola" + - "ngilahndalambalezghienlingua franca novaligurelivonienlakotalombardmongo" + - "lozilori du Nordlatgalienluba-lulualuiseñolundaluolushaïluhyachinois lit" + - "térairelazemadouraismafamagahimaithilimakassarmandinguemassaïmabamoksama" + - "ndarmendéméroucréole mauricienmoyen irlandaismakhuwa-meettométa’micmacmi" + - "nangkabaumandchoumanipurimohawkmorémari occidentalmoundangmultilinguecre" + - "ekmirandaismarwarîmentawaïmyènèerzyamazandéraniminnannapolitainnamabas-a" + - "llemandnewariniasniuéenAokwasiongiemboonnogaïvieux norroisnovialn’kosoth" + - "o du Nordnuernewarî classiquenyamwezinyankolényoronzemaosageturc ottoman" + - "pangasinanpahlavipampanganpapiamentopalaupicardpidgin nigérianpennsilfaa" + - "nischbas-prussienpersan ancienallemand palatinphénicienpiémontaispontiqu" + - "epohnpeiprussienprovençal ancienk’iche’quichua du Haut-Chimborazorajasth" + - "anirapanuirarotongienromagnolrifainromboromanirotumanruthènerovianavalaq" + - "uerwasandaweiakoutearaméen samaritainsambourousasaksantalsaurashtrangamb" + - "aysangusicilienécossaissarde sassaraiskurde du Sudsenecacisenasériselkou" + - "pekoyraboro senniancien irlandaissamogitienchleuhshanarabe tchadiensidam" + - "obas-silésiensélayarsami du Sudsami de Lulesami d’Inarisami skoltsoninké" + - "sogdiensranan tongosérèresahosaterlandaissoukoumasoussousumériencomorien" + - "syriaque classiquesyriaquesilésientouloutemnetesoterenotetumtigrétivtoke" + - "lautsakhourklingontlingittalyshtamacheqtonga nyasatok pisintouroyotaroko" + - "tsakonientsimshiantati caucasientoumboukatuvalutasawaqtouvatamazight du " + - "Maroc centraloudmourteougaritiqueoumboundouracinevaïvénitienvepseflamand" + - " occidentalfranconien du Mainvotevõrovunjowalserwalamowaraywashowarlpiri" + - "wukalmoukmingréliensogayaoyapoisyangbenyembanheengatoucantonaiszapotèque" + - "symboles Blisszélandaiszenagaamazighe standard marocainzuñisans contenu " + - "linguistiquezazakiarabe standard moderneallemand autrichienallemand suis" + - "seanglais australienanglais canadienanglais britanniqueanglais américain" + - "français canadienfrançais suissebas-saxon néerlandaisflamandportugais br" + - "ésilienportugais européenmoldaveserbo-croateswahili du Congochinois sim" + - "plifiéchinois traditionnel" - -var frLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000b, 0x0014, 0x001d, 0x0021, 0x002a, 0x0033, - 0x0038, 0x0040, 0x0044, 0x004a, 0x0050, 0x0057, 0x0062, 0x0069, - 0x0073, 0x007a, 0x0081, 0x008a, 0x0090, 0x0099, 0x00a0, 0x00ac, - 0x00b4, 0x00b9, 0x00bd, 0x00c5, 0x00d7, 0x00e1, 0x00e8, 0x00ee, - 0x00f6, 0x00ff, 0x0107, 0x010c, 0x0110, 0x0117, 0x0121, 0x0129, - 0x0131, 0x0137, 0x013d, 0x0141, 0x0148, 0x014f, 0x0158, 0x0161, - 0x0172, 0x017b, 0x018e, 0x0196, 0x019d, 0x01a7, 0x01ae, 0x01b5, - 0x01bc, 0x01c1, 0x01ca, 0x01d0, 0x01e0, 0x01e8, 0x01f1, 0x01f9, - // Entry 40 - 7F - 0x0204, 0x020f, 0x021a, 0x021e, 0x022b, 0x0232, 0x0235, 0x023e, - 0x0245, 0x024e, 0x0256, 0x025e, 0x0267, 0x026c, 0x0272, 0x027b, - 0x0281, 0x028d, 0x0292, 0x0299, 0x02a0, 0x02a7, 0x02af, 0x02b4, - 0x02b8, 0x02c0, 0x02c8, 0x02cd, 0x02db, 0x02e0, 0x02ec, 0x02f3, - 0x02f6, 0x02ff, 0x030b, 0x0311, 0x0319, 0x0324, 0x0329, 0x0334, - 0x033d, 0x0343, 0x034a, 0x0350, 0x0357, 0x035d, 0x0364, 0x0376, - 0x037f, 0x0385, 0x0391, 0x03a3, 0x03b5, 0x03c6, 0x03cc, 0x03d2, - 0x03d9, 0x03df, 0x03e4, 0x03e9, 0x03f0, 0x03f8, 0x03fc, 0x0404, - // Entry 80 - BF - 0x040a, 0x0413, 0x041a, 0x0422, 0x0428, 0x042f, 0x0434, 0x043a, - 0x0442, 0x0447, 0x044d, 0x0459, 0x045f, 0x0469, 0x0471, 0x0479, - 0x047f, 0x0484, 0x048a, 0x0492, 0x0497, 0x049c, 0x04a8, 0x04b2, - 0x04ba, 0x04c1, 0x04c7, 0x04d0, 0x04d6, 0x04db, 0x04e3, 0x04ec, - 0x04f2, 0x04fa, 0x04fe, 0x0504, 0x0509, 0x0511, 0x051a, 0x0523, - 0x0529, 0x052f, 0x0534, 0x053e, 0x0545, 0x054b, 0x0550, 0x0555, - 0x055c, 0x0562, 0x0568, 0x056f, 0x0575, 0x0579, 0x057e, 0x0585, - 0x058e, 0x059c, 0x05a4, 0x05a9, 0x05af, 0x05b7, 0x05be, 0x05c6, - // Entry C0 - FF - 0x05cd, 0x05da, 0x05e8, 0x05ee, 0x05f6, 0x05fd, 0x0603, 0x060a, - 0x0619, 0x0619, 0x061f, 0x062d, 0x063c, 0x0641, 0x065e, 0x0666, - 0x066c, 0x0672, 0x067b, 0x0683, 0x068b, 0x0690, 0x0696, 0x06a0, - 0x06a7, 0x06ac, 0x06b1, 0x06b7, 0x06bc, 0x06c1, 0x06c7, 0x06db, - 0x06e3, 0x06e8, 0x06ec, 0x06f2, 0x06f5, 0x06fc, 0x0707, 0x0710, - 0x0714, 0x071b, 0x071f, 0x0725, 0x072d, 0x0731, 0x0737, 0x073b, - 0x0743, 0x0748, 0x074e, 0x0754, 0x0759, 0x0760, 0x0764, 0x076b, - 0x0776, 0x077b, 0x077f, 0x078d, 0x0794, 0x079d, 0x07a5, 0x07ad, - // Entry 100 - 13F - 0x07b3, 0x07b8, 0x07c0, 0x07cf, 0x07e2, 0x07ea, 0x07f0, 0x07f6, - 0x07fb, 0x0803, 0x080a, 0x0810, 0x0815, 0x081a, 0x081f, 0x0829, - 0x0836, 0x083c, 0x084e, 0x0859, 0x085f, 0x0865, 0x086a, 0x086f, - 0x0877, 0x0887, 0x0890, 0x0898, 0x08a5, 0x08b3, 0x08ba, 0x08c6, - 0x08ca, 0x08d2, 0x08e6, 0x08e9, 0x08f9, 0x0908, 0x0918, 0x0928, - 0x0936, 0x0945, 0x094d, 0x094f, 0x0957, 0x095a, 0x095e, 0x0963, - 0x0973, 0x0979, 0x0982, 0x0988, 0x099b, 0x09af, 0x09bd, 0x09c2, - 0x09cb, 0x09d3, 0x09d8, 0x09e3, 0x09f2, 0x09f7, 0x09fe, 0x0a03, - // Entry 140 - 17F - 0x0a0c, 0x0a11, 0x0a16, 0x0a1e, 0x0a2b, 0x0a35, 0x0a3c, 0x0a41, - 0x0a4c, 0x0a51, 0x0a55, 0x0a59, 0x0a5f, 0x0a66, 0x0a6e, 0x0a75, - 0x0a87, 0x0a8d, 0x0a93, 0x0a9c, 0x0aa9, 0x0ab5, 0x0ab9, 0x0ac3, - 0x0ac9, 0x0acf, 0x0ad2, 0x0ad7, 0x0adb, 0x0ae3, 0x0aeb, 0x0aef, - 0x0af7, 0x0b01, 0x0b09, 0x0b0d, 0x0b17, 0x0b1c, 0x0b25, 0x0b31, - 0x0b37, 0x0b40, 0x0b44, 0x0b4d, 0x0b57, 0x0b63, 0x0b6a, 0x0b73, - 0x0b7a, 0x0b8b, 0x0b8f, 0x0b98, 0x0ba1, 0x0ba9, 0x0bb1, 0x0bb6, - 0x0bc8, 0x0bce, 0x0bd5, 0x0bdb, 0x0be0, 0x0be6, 0x0beb, 0x0bf3, - // Entry 180 - 1BF - 0x0c05, 0x0c0b, 0x0c13, 0x0c19, 0x0c20, 0x0c25, 0x0c29, 0x0c35, - 0x0c3e, 0x0c48, 0x0c50, 0x0c55, 0x0c58, 0x0c5f, 0x0c64, 0x0c77, - 0x0c7b, 0x0c84, 0x0c88, 0x0c8e, 0x0c96, 0x0c9e, 0x0ca7, 0x0cae, - 0x0cb2, 0x0cb7, 0x0cbd, 0x0cc3, 0x0cc9, 0x0cda, 0x0ce9, 0x0cf7, - 0x0cff, 0x0d05, 0x0d10, 0x0d18, 0x0d20, 0x0d26, 0x0d2b, 0x0d3a, - 0x0d42, 0x0d4d, 0x0d52, 0x0d5b, 0x0d63, 0x0d6c, 0x0d73, 0x0d78, - 0x0d84, 0x0d8a, 0x0d94, 0x0d98, 0x0da4, 0x0daa, 0x0dae, 0x0db5, - 0x0db7, 0x0dbd, 0x0dc6, 0x0dcc, 0x0dd9, 0x0ddf, 0x0de5, 0x0df2, - // Entry 1C0 - 1FF - 0x0df6, 0x0e07, 0x0e0f, 0x0e18, 0x0e1d, 0x0e22, 0x0e27, 0x0e33, - 0x0e3d, 0x0e44, 0x0e4d, 0x0e57, 0x0e5c, 0x0e62, 0x0e72, 0x0e81, - 0x0e8d, 0x0e9a, 0x0eaa, 0x0eb4, 0x0ebf, 0x0ec7, 0x0ece, 0x0ed6, - 0x0ee7, 0x0ef2, 0x0f0c, 0x0f16, 0x0f1d, 0x0f28, 0x0f30, 0x0f36, - 0x0f3b, 0x0f41, 0x0f48, 0x0f50, 0x0f57, 0x0f5e, 0x0f61, 0x0f68, - 0x0f6f, 0x0f82, 0x0f8b, 0x0f90, 0x0f96, 0x0fa0, 0x0fa7, 0x0fac, - 0x0fb4, 0x0fbd, 0x0fcc, 0x0fd8, 0x0fde, 0x0fe4, 0x0fe9, 0x0ff1, - 0x1000, 0x1010, 0x101a, 0x1020, 0x1024, 0x1032, 0x1038, 0x1045, - // Entry 200 - 23F - 0x104d, 0x1058, 0x1064, 0x1072, 0x107c, 0x1084, 0x108b, 0x1097, - 0x109f, 0x10a3, 0x10af, 0x10b7, 0x10be, 0x10c7, 0x10cf, 0x10e1, - 0x10e9, 0x10f2, 0x10f8, 0x10fd, 0x1101, 0x1107, 0x110c, 0x1112, - 0x1115, 0x111c, 0x1124, 0x112b, 0x1132, 0x1138, 0x1140, 0x114b, - 0x1154, 0x115b, 0x1161, 0x116a, 0x1173, 0x1181, 0x118a, 0x1190, - 0x1197, 0x119c, 0x11b6, 0x11bf, 0x11ca, 0x11d4, 0x11da, 0x11de, - 0x11e7, 0x11ec, 0x11fe, 0x1210, 0x1214, 0x1219, 0x121e, 0x1224, - 0x122a, 0x122f, 0x1234, 0x123c, 0x123e, 0x1245, 0x1250, 0x1254, - // Entry 240 - 27F - 0x1257, 0x125d, 0x1264, 0x1269, 0x1273, 0x127c, 0x1286, 0x1294, - 0x129e, 0x12a4, 0x12be, 0x12c3, 0x12dc, 0x12e2, 0x12f8, 0x12f8, - 0x130b, 0x131a, 0x132c, 0x133c, 0x134f, 0x1361, 0x1361, 0x1361, - 0x1361, 0x1361, 0x1373, 0x1383, 0x1399, 0x13a0, 0x13b4, 0x13c7, - 0x13ce, 0x13da, 0x13ea, 0x13fc, 0x1410, -} // Size: 1250 bytes - -const frCALangStr string = "" + // Size: 529 bytes - "azerbaïdjanaiscrigujaratikalaallisutodiasame du Nordsangovolapükadyguévi" + - "eil anglaisaraukanbenabicolbilenmedumbatchagataychinookkurde centralslav" + - "etlichoyupik centralewondocajunvieux haut-allemandilocanokabardekenyangk" + - "ölschliveluochinois classiquemeta’marwaribas allemandao naganewari clas" + - "siquenkolepalauanallemand de Pennsylvaniebas allemand mennonitevieux per" + - "sepalatinancien occitanrarotongaaroumainsantalikurde méridionalserivieil" + - " irlandaisselayarsame du Sudsame de Lulesame skoltturoyotamazightbas sax" + - "onswahili congolais" - -var frCALangIdx = []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x000f, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x001a, 0x001a, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, - // Entry 40 - 7F - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, - 0x001a, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, - // Entry 80 - BF - 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, - 0x0029, 0x0029, 0x0029, 0x0035, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, - // Entry C0 - FF - 0x0049, 0x0049, 0x0056, 0x0056, 0x0056, 0x005d, 0x005d, 0x005d, - 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, - 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, - 0x005d, 0x005d, 0x005d, 0x005d, 0x0061, 0x0061, 0x0061, 0x0061, - 0x0061, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x006b, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x007b, 0x007b, 0x007b, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - // Entry 100 - 13F - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x0094, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, - 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x00a7, 0x00ad, 0x00ad, - 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00b2, 0x00b2, 0x00b2, 0x00b2, - 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, - 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - // Entry 140 - 17F - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, - 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00cc, 0x00cc, 0x00cc, - 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, - 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00d3, 0x00d3, 0x00d3, - 0x00d3, 0x00d3, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, - 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, - 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, - 0x00e1, 0x00e1, 0x00e1, 0x00e1, 0x00e1, 0x00e1, 0x00e1, 0x00e1, - // Entry 180 - 1BF - 0x00e1, 0x00e1, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, - 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e8, 0x00e8, 0x00e8, 0x00f9, - 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, - 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, - 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, - 0x0100, 0x0100, 0x0100, 0x0100, 0x0107, 0x0107, 0x0107, 0x0107, - 0x0107, 0x0107, 0x0107, 0x0107, 0x0113, 0x0113, 0x0113, 0x0113, - 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, - // Entry 1C0 - 1FF - 0x011a, 0x012a, 0x012a, 0x012f, 0x012f, 0x012f, 0x012f, 0x012f, - 0x012f, 0x012f, 0x012f, 0x012f, 0x0136, 0x0136, 0x0136, 0x014e, - 0x0164, 0x016f, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, - 0x0184, 0x0184, 0x0184, 0x0184, 0x0184, 0x018d, 0x018d, 0x018d, - 0x018d, 0x018d, 0x018d, 0x018d, 0x018d, 0x0195, 0x0195, 0x0195, - 0x0195, 0x0195, 0x0195, 0x0195, 0x019c, 0x019c, 0x019c, 0x019c, - 0x019c, 0x019c, 0x019c, 0x01ad, 0x01ad, 0x01ad, 0x01b1, 0x01b1, - 0x01b1, 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c0, - // Entry 200 - 23F - 0x01c7, 0x01d2, 0x01de, 0x01de, 0x01e8, 0x01e8, 0x01e8, 0x01e8, - 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, - 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, - 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, - 0x01e8, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, - 0x01ee, 0x01ee, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, - 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, - 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, - // Entry 240 - 27F - 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, - 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, - 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x01f7, - 0x01f7, 0x01f7, 0x01f7, 0x01f7, 0x0200, 0x0200, 0x0200, 0x0200, - 0x0200, 0x0200, 0x0211, -} // Size: 1246 bytes - -const guLangStr string = "" + // Size: 11776 bytes - "અફારઅબખાજિયનઅવેસ્તનઆફ્રિકન્સઅકાનએમ્હારિકઅર્ગોનીઝઅરબીઆસામીઅવેરિકઆયમારાઅઝર" + - "બૈજાનીબશ્કીરબેલારુશિયનબલ્ગેરિયનબિસ્લામાબામ્બારાબંગાળીતિબેટીયનબ્રેટોનબો" + - "સ્નિયનકતલાનચેચનકેમોરોકોર્સિકનક્રીચેકચર્ચ સ્લાવિકચૂવાશવેલ્શડેનિશજર્મનદિ" + - "વેહીડ્ઝોંગ્ખાઈવગ્રીકઅંગ્રેજીએસ્પેરાન્ટોસ્પેનિશએસ્ટોનિયનબાસ્કફારસીફુલાહ" + - "ફિનિશફીજીયનફોરિસ્તફ્રેન્ચપશ્ચિમી ફ્રિસિયનઆઇરિશસ્કોટીસ ગેલિકગેલિશિયનગુઆ" + - "રાનીગુજરાતીમાંક્સહૌસાહીબ્રુહિન્દીહિરી મોટૂક્રોએશિયનહૈતીયનહંગેરિયનઆર્મે" + - "નિયનહેરેરોઇંટરલિંગુઆઇન્ડોનેશિયનઇંટરલિંગઇગ્બોસિચુઆન યીઇનુપિયાકઈડોઆઇસલેન" + - "્ડિકઇટાલિયનઇનુકિટૂટજાપાનીઝજાવાનીસજ્યોર્જિઅનકોંગોકિકુયૂક્વાન્યામાકઝાખકલ" + - "ાલ્લિસુતખ્મેરકન્નડકોરિયનકનુરીકાશ્મીરીકુર્દિશકોમીકોર્નિશકિર્ગીઝલેટિનલક્" + - "ઝેમબર્ગિશગાંડાલિંબૂર્ગિશલિંગાલાલાઓથિયનલિથુનિયનલૂબા-કટાંગાલાતવિયનમલાગસી" + - "માર્શલીઝમાઓરીમેસેડોનિયનમલયાલમમોંગોલિયનમરાઠીમલયમાલ્ટિઝબર્મીઝનાઉરૂઉત્તર " + - "દેબેલનેપાળીડોન્ગાડચનૉર્વેજીયન નાયનૉર્સ્કનોર્વેજીયન બોકમાલદક્ષિણ દેબેલન" + - "ાવાજોન્યાન્જાઓક્સિટનઓજિબ્વાઓરોમોઉડિયાઓસ્સેટિકપંજાબીપાલીપોલીશપશ્તોપોર્ટ" + - "ુગીઝક્વેચુઆરોમાન્શરૂન્દીરોમાનિયનરશિયનકિન્યારવાન્ડાસંસ્કૃતસાર્દિનિયનસિં" + - "ધીઉત્તરીય સામીસાંગોસિંહાલીસ્લોવૅકસ્લોવેનિયનસામોનશોનાસોમાલીઅલ્બેનિયનસર્" + - "બિયનસ્વાતીસદર્ન સોથોસંડેનીઝસ્વીડિશસ્વાહિલીતમિલતેલુગુતાજીકથાઈટાઇગ્રિનિય" + - "ાતુર્કમેનત્સ્વાનાટોંગાનટર્કીશસોંગાતતારતાહિતિયનઉઇગુરયુક્રેનિયનઉર્દૂઉઝ્બ" + - "ેકવેન્દાવિયેતનામીસવોલાપુકવાલૂનવોલોફખોસાયિદ્દિશયોરૂબાઝુઆગચાઇનીઝઝુલુઅચીન" + - "ીએકોલીઅદાંગ્મીઅદિઘેઅફ્રિહિલીઅઘેમઐનુઅક્કાદીયાનઅલેઉતદક્ષિણ અલ્તાઇજુની અં" + - "ગ્રેજીઅંગીકાએરમૈકમેપુચેઅરાપાહોઆલ્જેરિયન અરબીઅરાવકમોરોક્કન અરબીઈજિપ્શિય" + - "ન અરબીઅસુઅસ્તુરિયનઅવધીબલૂચીબાલિનીસબસાબામનબેજાબેમ્બાબેનાપશ્ચિમી બાલોચીભ" + - "ોજપુરીબિકોલબિનીસિક્સિકાબિષ્નુપ્રિયાવ્રજબ્રાહુઈબોડોબુરિયાતબુગિનીસબ્લિનક" + - "ડ્ડોકરિબઅત્સમસિબુઆનોચિગાચિબ્ચાછગાતાઇચૂકીસમારીચિનૂક જાર્ગનચોક્તૌશિપેવ્ય" + - "ાનશેરોકીશેયેન્નસેન્ટ્રલ કુર્દિશકોપ્ટિકક્રિમિયન તુર્કીસેસેલ્વા ક્રેઓલે " + - "ફ્રેન્ચકાશુબિયનદાકોતાદાર્ગવાતૈતાદેલવેરસ્લેવડોગ્રિબદિન્કાઝર્માડોગ્રીનિમ" + - "્ન સોર્બિયનદુઆલામધ્ય ડચજોલા-ફોન્યીડ્યુલાદાઝાગાઍમ્બુએફિકપ્રાચીન ઇજીપ્શિ" + - "યનએકાજુકએલામાઇટમિડિલ અંગ્રેજીઇવોન્ડોફેંગફિલિપિનોફોનમિડિલ ફ્રેંચજૂની ફ્" + - "રેંચઉત્તરીય ફ્રિશિયનપૂર્વ ફ્રિશિયનફ્રિયુલિયાનગાગાગાઝganગાયોબાયાઝોરોસ્ટ" + - "્રિઅન દારીગીઝજિલ્બરટીઝમધ્ય હાઇ જર્મનજૂની હાઇ જર્મનગોઅન કોંકણીગોંડીગોરો" + - "ન્તાલોગોથિકગ્રેબોપ્રાચીન ગ્રીકસ્વિસ જર્મનગુસીગ્વિચ’ઇનહૈડાhakહાવાઇયનફીજ" + - "ી હિંદીહિલિગેનોનહિટ્ટિતેહમોંગઅપ્પર સોર્બિયનhsnહૂપાઇબાનઈબિબિયોઇલોકોઇંગુ" + - "શલોજ્બાનનગોમ્બામકામેજુદેઓ-પર્શિયનજુદેઓ-અરબીકારા-કલ્પકકબાઇલકાચિનજ્જુકમ્" + - "બાકાવીકબાર્ડિયનત્યાપમકોન્ડેકાબુવર્ડિઆનુકોરોખાસીખોતાનીસકોયરા ચિનિકાકોકલ" + - "ેજિનકિમ્બન્દુકોમી-પર્મ્યાકકોંકણીકોસરિયનક્પેલ્લેકરાચય-બલ્કારકરેલિયનકુરૂ" + - "ખશમ્બાલાબફિયાકોલોગ્નિયનકુમીકકુતેનાઇલાદીનોલંગીલાહન્ડાલામ્બાલેઝધીયનલિંગ્" + - "વા ફેન્કા નોવાલાકોટામોંગોલોઝીઉત્તરીય લુરીલૂબા-લુલુઆલુઇસેનોલુન્ડાલ્યુઓમ" + - "િઝોલુઈયામાદુરીસમગહીમૈથિલીમકાસરમન્ડિન્ગોમસાઇમોક્ષમંદારમેન્ડેમેરુમોરીસ્ય" + - "ેનમધ્ય આઈરિશમાખુવા-મીટ્ટુમેતામિકમેકમિનાંગ્કાબાઉમાન્ચુમણિપુરીમોહૌકમોસ્સ" + - "ીપશ્ચિમી મારીમુનડાન્ગબહુવિધ ભાષાઓક્રિકમિરાંડીમારવાડીએર્ઝયામઝાન્દેરાનીn" + - "anનેપોલિટાનનમાલો જર્મનનેવારીનિયાસનિયુઆનક્વાસિઓનીએમબુનનોગાઇજૂની નોર્સએન’ક" + - "ોઉતરી સોથોનુએરપરંપરાગત નેવારીન્યામવેઝીન્યાનકોલન્યોરોન્ઝિમાઓસેજઓટોમાન ત" + - "ુર્કિશપંગાસીનાનપહલવીપમ્પાન્ગાપાપિયામેન્ટોપલાઉઆનનાજેરીયન પીજીનજૂની ફારસ" + - "ીફોનિશિયનપોહપિએનપ્રુસ્સીયનજુની પ્રોવેન્સલકિચેરાજસ્થાનીરાપાનુઇરારોટોંગન" + - "રોમ્બોરોમાનીઅરોમેનિયનરવાસોંડવેસખાસામરિટાન અરેમિકસમ્બુરુસાસાકસંતાલીન્ગા" + - "મ્બેયસાંગુસિસિલિયાનસ્કોટ્સસર્ઘન કુર્દીશસેનાસેલ્કપકોયરાબોરો સેન્નીજૂની " + - "આયરિશતેશીલહિટશેનસિદામોદક્ષિણ સામીલ્યુલ સામીઇનારી સામીસ્કોલ્ટ સામીસોનિન" + - "્કેસોગ્ડિએનસ્રાનન ટોન્ગોસેરેરસાહોસુકુમાસુસુસુમેરિયનકોમોરિયનપરંપરાગત સિ" + - "રિએકસિરિએકતુલુટિમ્નેતેસોતેરેનોતેતુમટાઇગ્રેતિવતોકેલાઉક્લિન્ગોનક્લીન્ગકિ" + - "ટતામાશેખન્યાસા ટોન્ગાટોક પિસિનટારોકોસિમ્શિયનમુસ્લિમ તાટતુમ્બુકાતુવાલુત" + - "સાવાકટુવીનિયનસેન્ટ્રલ ઍટ્લસ તામાઝિગ્ટઉદમુર્તયુગેરિટિકઉમ્બુન્ડૂરૂટવાઇવો" + - "ટિકવુન્જોવેલ્સેરવોલાયટ્ટાવારેયવાશોવાર્લ્પીરીwuuકાલ્મિકસોગાયાઓયાપીસયાન્" + - "ગબેનયેમ્બાકેંટોનીઝઝેપોટેકબ્લિસિમ્બોલ્સઝેનાગાપ્રમાણભૂત મોરોક્કન તામાઝિગ" + - "્ટઝૂનીકોઇ ભાષાશાસ્ત્રીય સામગ્રી નથીઝાઝામોડર્ન સ્ટાન્ડર્ડ અરબીઓસ્ટ્રિઅન" + - " જર્મનસ્વિસ હાય જર્મનઓસ્ટ્રેલિયન અંગ્રેજીકેનેડિયન અંગ્રેજીબ્રિટિશ અંગ્રે" + - "જીઅમેરિકન અંગ્રેજીલેટિન અમેરિકન સ્પેનિશયુરોપિયન સ્પેનિશમેક્સિકન સ્પેનિ" + - "શકેનેડિયન ફ્રેંચસ્વિસ ફ્રેંચલો સેક્સોનફ્લેમિશબ્રાઝિલીયન પોર્ટુગીઝયુરોપ" + - "િયન પોર્ટુગીઝમોલડાવિયનસર્બો-ક્રોએશિયનકોંગો સ્વાહિલીસરળીકૃત ચાઇનીઝપારંપ" + - "રિક ચાઇનીઝ" - -var guLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x0024, 0x0039, 0x0054, 0x0060, 0x0078, 0x0090, - 0x009c, 0x00ab, 0x00bd, 0x00cf, 0x00ea, 0x00fc, 0x011a, 0x0135, - 0x014d, 0x0165, 0x0177, 0x018f, 0x01a4, 0x01bc, 0x01cb, 0x01d7, - 0x01e9, 0x0201, 0x020d, 0x0216, 0x0238, 0x0247, 0x0256, 0x0265, - 0x0274, 0x0286, 0x02a1, 0x02a7, 0x02b6, 0x02ce, 0x02ef, 0x0304, - 0x031f, 0x032e, 0x033d, 0x034c, 0x035b, 0x036d, 0x0382, 0x0397, - 0x03c5, 0x03d4, 0x03f9, 0x0411, 0x0426, 0x043b, 0x044d, 0x0459, - 0x046b, 0x047d, 0x0496, 0x04b1, 0x04c3, 0x04db, 0x04f6, 0x0508, - // Entry 40 - 7F - 0x0526, 0x0547, 0x055f, 0x056e, 0x0587, 0x059f, 0x05a8, 0x05c6, - 0x05db, 0x05f3, 0x0608, 0x061d, 0x063b, 0x064a, 0x065c, 0x067a, - 0x0686, 0x06a4, 0x06b3, 0x06c2, 0x06d4, 0x06e3, 0x06fb, 0x0710, - 0x071c, 0x0731, 0x0746, 0x0755, 0x0779, 0x0788, 0x07a6, 0x07bb, - 0x07d0, 0x07e8, 0x0807, 0x081c, 0x082e, 0x0846, 0x0855, 0x0873, - 0x0885, 0x08a0, 0x08af, 0x08b8, 0x08cd, 0x08df, 0x08ee, 0x090d, - 0x091f, 0x0931, 0x0937, 0x0974, 0x09a5, 0x09c7, 0x09d9, 0x09f1, - 0x0a06, 0x0a1b, 0x0a2a, 0x0a39, 0x0a51, 0x0a63, 0x0a6f, 0x0a7e, - // Entry 80 - BF - 0x0a8d, 0x0aa8, 0x0abd, 0x0ad2, 0x0ae4, 0x0afc, 0x0b0b, 0x0b32, - 0x0b47, 0x0b65, 0x0b74, 0x0b96, 0x0ba5, 0x0bba, 0x0bcf, 0x0bed, - 0x0bfc, 0x0c08, 0x0c1a, 0x0c35, 0x0c4a, 0x0c5c, 0x0c78, 0x0c8d, - 0x0ca2, 0x0cba, 0x0cc6, 0x0cd8, 0x0ce7, 0x0cf0, 0x0d11, 0x0d29, - 0x0d41, 0x0d53, 0x0d65, 0x0d74, 0x0d80, 0x0d98, 0x0da7, 0x0dc5, - 0x0dd4, 0x0de6, 0x0df8, 0x0e16, 0x0e2b, 0x0e3a, 0x0e49, 0x0e55, - 0x0e6a, 0x0e7c, 0x0e88, 0x0e9a, 0x0ea6, 0x0eb5, 0x0ec4, 0x0edc, - 0x0eeb, 0x0eeb, 0x0f06, 0x0f12, 0x0f1b, 0x0f39, 0x0f39, 0x0f48, - // Entry C0 - FF - 0x0f48, 0x0f6d, 0x0f92, 0x0fa4, 0x0fb3, 0x0fc5, 0x0fc5, 0x0fda, - 0x1002, 0x1002, 0x1011, 0x1036, 0x105e, 0x1067, 0x1067, 0x1082, - 0x1082, 0x108e, 0x109d, 0x10b2, 0x10b2, 0x10bb, 0x10c7, 0x10c7, - 0x10c7, 0x10d3, 0x10e5, 0x10e5, 0x10f1, 0x10f1, 0x10f1, 0x1119, - 0x112e, 0x113d, 0x1149, 0x1149, 0x1149, 0x1161, 0x1185, 0x1185, - 0x1191, 0x11a6, 0x11b2, 0x11b2, 0x11c7, 0x11dc, 0x11dc, 0x11eb, - 0x11eb, 0x11fa, 0x1206, 0x1206, 0x1215, 0x122a, 0x1236, 0x1248, - 0x125a, 0x1269, 0x1275, 0x1297, 0x12a9, 0x12c4, 0x12d6, 0x12eb, - // Entry 100 - 13F - 0x1319, 0x132e, 0x132e, 0x1359, 0x139d, 0x13b5, 0x13c7, 0x13dc, - 0x13e8, 0x13fa, 0x1409, 0x141e, 0x1430, 0x143f, 0x1451, 0x1479, - 0x1479, 0x1488, 0x149b, 0x14ba, 0x14cc, 0x14de, 0x14ed, 0x14f9, - 0x14f9, 0x152a, 0x153c, 0x1551, 0x1579, 0x1579, 0x158e, 0x158e, - 0x159a, 0x15b2, 0x15b2, 0x15bb, 0x15bb, 0x15dd, 0x15fc, 0x15fc, - 0x162a, 0x1652, 0x1673, 0x1679, 0x1688, 0x168b, 0x1697, 0x16a3, - 0x16d4, 0x16dd, 0x16f8, 0x16f8, 0x171e, 0x1744, 0x1763, 0x1772, - 0x1790, 0x179f, 0x17b1, 0x17d6, 0x17f5, 0x17f5, 0x17f5, 0x1801, - // Entry 140 - 17F - 0x1819, 0x1825, 0x1828, 0x183d, 0x1859, 0x1874, 0x188c, 0x189b, - 0x18c3, 0x18c6, 0x18d2, 0x18de, 0x18f3, 0x1902, 0x1911, 0x1911, - 0x1911, 0x1926, 0x193b, 0x194a, 0x196f, 0x198b, 0x198b, 0x19a7, - 0x19b6, 0x19c5, 0x19d1, 0x19e0, 0x19ec, 0x1a07, 0x1a07, 0x1a16, - 0x1a2b, 0x1a4f, 0x1a4f, 0x1a5b, 0x1a5b, 0x1a67, 0x1a7c, 0x1a98, - 0x1a98, 0x1a98, 0x1aa4, 0x1ab6, 0x1ad1, 0x1af6, 0x1b08, 0x1b1d, - 0x1b35, 0x1b57, 0x1b57, 0x1b57, 0x1b6c, 0x1b7b, 0x1b90, 0x1b9f, - 0x1bbd, 0x1bcc, 0x1be1, 0x1bf3, 0x1bff, 0x1c14, 0x1c26, 0x1c3b, - // Entry 180 - 1BF - 0x1c70, 0x1c70, 0x1c70, 0x1c82, 0x1c82, 0x1c91, 0x1c9d, 0x1cbf, - 0x1cbf, 0x1cdb, 0x1cf0, 0x1d02, 0x1d11, 0x1d1d, 0x1d2c, 0x1d2c, - 0x1d2c, 0x1d41, 0x1d41, 0x1d4d, 0x1d5f, 0x1d6e, 0x1d89, 0x1d95, - 0x1d95, 0x1da4, 0x1db3, 0x1dc5, 0x1dd1, 0x1dec, 0x1e08, 0x1e2d, - 0x1e39, 0x1e4b, 0x1e6f, 0x1e81, 0x1e96, 0x1ea5, 0x1eb7, 0x1ed9, - 0x1ef1, 0x1f13, 0x1f22, 0x1f37, 0x1f4c, 0x1f4c, 0x1f4c, 0x1f5e, - 0x1f7f, 0x1f82, 0x1f9d, 0x1fa6, 0x1fbc, 0x1fce, 0x1fdd, 0x1fef, - 0x1fef, 0x2004, 0x2019, 0x2028, 0x2044, 0x2044, 0x2053, 0x206c, - // Entry 1C0 - 1FF - 0x2078, 0x20a3, 0x20be, 0x20d6, 0x20e8, 0x20fa, 0x2106, 0x212e, - 0x2149, 0x2158, 0x2173, 0x2197, 0x21a9, 0x21a9, 0x21d1, 0x21d1, - 0x21d1, 0x21ed, 0x21ed, 0x2205, 0x2205, 0x2205, 0x221a, 0x2238, - 0x2263, 0x226f, 0x226f, 0x228a, 0x229f, 0x22ba, 0x22ba, 0x22ba, - 0x22cc, 0x22de, 0x22de, 0x22de, 0x22de, 0x22f9, 0x2302, 0x2314, - 0x231d, 0x2348, 0x235d, 0x236c, 0x237e, 0x237e, 0x2399, 0x23a8, - 0x23c3, 0x23d8, 0x23d8, 0x23fd, 0x23fd, 0x2409, 0x2409, 0x241b, - 0x2449, 0x2465, 0x2465, 0x247d, 0x2486, 0x2486, 0x2498, 0x2498, - // Entry 200 - 23F - 0x2498, 0x24b7, 0x24d3, 0x24ef, 0x2511, 0x2529, 0x2541, 0x2566, - 0x2575, 0x2581, 0x2581, 0x2593, 0x259f, 0x25b7, 0x25cf, 0x25fa, - 0x260c, 0x260c, 0x2618, 0x262a, 0x2636, 0x2648, 0x2657, 0x266c, - 0x2675, 0x268a, 0x268a, 0x26a5, 0x26c3, 0x26c3, 0x26d8, 0x26fd, - 0x2716, 0x2716, 0x2728, 0x2728, 0x2740, 0x275f, 0x2777, 0x2789, - 0x279b, 0x27b3, 0x27f7, 0x280c, 0x2827, 0x2842, 0x284b, 0x2854, - 0x2854, 0x2854, 0x2854, 0x2854, 0x2863, 0x2863, 0x2875, 0x288a, - 0x28a5, 0x28b4, 0x28c0, 0x28de, 0x28e1, 0x28f6, 0x28f6, 0x2902, - // Entry 240 - 27F - 0x290b, 0x291a, 0x2932, 0x2944, 0x2944, 0x295c, 0x2971, 0x2998, - 0x2998, 0x29aa, 0x29fa, 0x2a06, 0x2a57, 0x2a63, 0x2aa1, 0x2aa1, - 0x2acc, 0x2af5, 0x2b2f, 0x2b60, 0x2b8e, 0x2bbc, 0x2bf7, 0x2c25, - 0x2c53, 0x2c53, 0x2c7e, 0x2ca0, 0x2cbc, 0x2cd1, 0x2d0b, 0x2d3f, - 0x2d5a, 0x2d85, 0x2dad, 0x2dd5, 0x2e00, -} // Size: 1250 bytes - -const heLangStr string = "" + // Size: 7096 bytes - "אפאריתאבחזיתאבסטןאפריקאנסאקאןאמהריתאראגוניתערביתאסאמיתאבאריתאיימאריתאזרי" + - "תבשקיריתבלארוסיתבולגריתביסלמהבמבארהבנגליתטיבטיתברטוניתבוסניתקטלאניתצ׳צ׳" + - "ניתצ׳מורוקורסיקניתקריצ׳כיתסלאבית כנסייתית עתיקהצ׳ובאשוולשיתדניתגרמניתדי" + - "בהידזונקהאווהיווניתאנגליתאספרנטוספרדיתאסטוניתבסקיתפרסיתפולהפיניתפיג׳יתפ" + - "ארואזיתצרפתיתפריזית מערביתאיריתגאלית סקוטיתגליציאניתגוארניגוג׳ארטימאנית" + - "האוסהעבריתהינדיהירי מוטוקרואטיתקריאולית (האיטי)הונגריתארמניתהררו\u200fא" + - "ינטרלינגואהאינדונזיתאינטרלינגהאיגבוסצ׳ואן ייאינופיאקאידואיסלנדיתאיטלקית" + - "אינוקטיטוטיפניתיאוואיתגאורגיתקונגוקיקויוקואניאמהקזחיתגרינלנדיתחמריתקנאד" + - "הקוריאניתקאנוריקשמיריתכורדיתקומיקורניתקירגיזיתלטיניתלוקסמבורגיתגאנדהלימ" + - "בורגיתלינגלהלאוליטאיתלובה-קטנגהלטביתמלגשיתמרשליתמאוריתמקדוניתמליאלאםמונ" + - "גוליתמראטהימלאיתמלטיתבורמזיתנאוריתנדבלה צפוניתנפאליתנדונגההולנדיתנורווג" + - "ית חדשהנורווגית ספרותיתנדבלה דרומיתנאוואחוניאנג׳האוקסיטניתאוג׳יבווהאורו" + - "מואוריהאוסטיתפנג׳אביפאליפולניתפאשטופורטוגזיתקצ׳ואהרומאנשקירונדירומניתרו" + - "סיתקנירואנדיתסנסקריטסרדיניתסינדהיתסמי צפוניתסנגוסינהלהסלובקיתסלובניתסמו" + - "איתשונהסומליתאלבניתסרביתסאווזיסותו דרומיתסונדנזיתשוודיתסווהיליטמיליתטלו" + - "גוטג׳יקיתתאיתתיגריניתטורקמניתסוואנהטונגאיתטורקיתטסונגהטטריתטהיטיתאויגור" + - "אוקראיניתאורדואוזבקיתוונדהויאטנמית\u200fוולאפיקוואלוןוולוףקוסהיידישיורו" + - "בהזואנגסיניתזולואכינזיתאקוליאדנמהאדיגיתאפריהיליאהייםאינואכדיתאלאוטאלטאי" + - " דרומיתאנגלית עתיקהאנג׳יקהארמיתאראוקניתארפהוארוואקאסואסטוריתאוואדיתבאלוצ" + - "׳יבלינזיתבוואריתבסאאבמוםגומאלהבז׳הבמבהבנהבאפוטבאלוצ׳י מערביתבוג׳פוריביק" + - "ולביניקוםסיקסיקהבראג׳בודואקוסהבוריאטבוגינזיתבולובליןמדומבהקאדוקאריבקאיו" + - "גהאטסםקבואנוצ׳יגהצ׳יבצ׳הצ׳אגאטאיצ׳וקסהמאריניב צ׳ינוקצ׳וקטאוצ׳יפוויאןצ׳ר" + - "וקישאייןכורדית סוראניתקופטיתטטרית של קריםקריאולית (סיישל)קשוביתדקוטהדרג" + - "ווהטאיטהדלאוורסלאביתדוגריבדינקהזארמהדוגריסורבית נמוכהדואלההולנדית תיכונ" + - "הג׳ולה פוניתדיולהדזאנגהאמבואפיקמצרית עתיקהאקיוקעילמיתאנגלית תיכונהאוונד" + - "ופנגפיליפיניתפוןצרפתית תיכונהצרפתית עתיקהפריזית צפוניתפריזית מזרחיתפריו" + - "ליתגאגגאוזיתסינית גאןגאיוגבאיהגעזקיריבטיתגרמנית בינונית-גבוההגרמנית עתי" + - "קה גבוההגונדיגורונטאלוגותיתגרבויוונית עתיקהגרמנית שוויצריתגוסיגוויצ׳ןהא" + - "ידהסינית האקההוואיתהיליגאינוןחתיתהמונגסורבית גבוההסינית שיאנגהופהאיבאןא" + - "יביביואילוקואינגושיתלוז׳באןנגומבהמאקאמהפרסית יהודיתערבית יהודיתקארא-קלפ" + - "אקקבילהקצ׳יןג׳וקמבהקאוויקברדיתקנמבוטיאפמקונדהקאבוורדיאנוקורוקהאסיקוטאנז" + - "יתקוירה צ׳יניקאקוקלנג׳יןקימבונדוקומי-פרמיאקיתקונקאניקוסראיאןקפלהקראצ׳י-" + - "בלקרקארליתקורוקשמבאלהבאפיהקולוניאןקומיקיתקוטנאילדינולאנגילנדהלמבהלזגיתל" + - "קוטהמונגולוזיתלורית צפוניתלובה-לולואהלויסנולונדהלואומיזולויהמדורזיתמאפא" + - "המאגאהיתמאיטיליתמקסארמנדינגומסאיתמאבאמוקשהמנדארמנדהמרוקריאולית מאוריציא" + - "ניתאירית תיכונהמאקוואה מטומטאמיקמקמיננגקבאומנצ׳ומניפוריתמוהוקמוסימונדאנ" + - "גמספר שפותקריקמירנדזיתמרווארימאייןארזיהמאזאנדראניסינית מין נאןנפוליטנית" + - "נאמהגרמנית תחתיתנוואריניאסניואןקוואסיונגיאמבוןנוגאי\u200fנורדית עתיקהנ׳" + - "קוסותו צפוניתנוארנווארית קלאסיתניאמווזיניאנקולהניורונזימהאוסג׳טורקית עו" + - "תומניתפנגסינאןפלאביפמפאניהפפיאמנטופלוואןניגרית פידג׳יתפרסית עתיקהפיניקי" + - "תפונפיאןפרוסיתפרובנסאל עתיקהקיצ׳הראג׳סטאנירפאנויררוטונגאןרומבורומאניארו" + - "מניתראווהסנדאווהסאחהארמית שומרוניתסמבורוסאסקסאנטאלינגמבאיסאנגוסיציליאני" + - "תסקוטיתכורדית דרומיתסנקהסנהסלקופקויראבורו סניאירית עתיקהשילהשאןערבית צ׳" + - "אדיתסידאמוסאמי דרומיתלולה סאמיאינארי סאמיסקולט סאמיסונינקהסוגדיאןסרנאן " + - "טונגוסררסאהוסוקומהסוסושומריתסירית קלאסיתסוריתטימנהטסוטרנוטטוםטיגריתטיבט" + - "וקלאוקלינגוןטלינגיטטמאשקניאסה טונגהטוק פיסיןטרוקוטסימשיאןטומבוקהטובאלוט" + - "סוואקטוביניתטמזייט של מרכז מרוקואודמורטאוגריתיתאומבונדורוטוואיווטיקוונג" + - "׳ווואלסרווליאטהווראיוואשווורלפיריסינית ווקלמיקיתסוגהיאויאפזיתיאנגבןימבה" + - "קנטונזיתזאפוטקבליסימבולסזנאגהתמזיע׳ת מרוקאית תקניתזוניללא תוכן לשוניזאז" + - "אערבית ספרותיתגרמנית (שוויץ)אנגלית (בריטניה)צרפתית (שוויץ)סקסונית תחתית" + - "פלמיתמולדביתסרבו-קרואטיתסווהילי קונגוסינית פשוטהסינית מסורתית" - -var heLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x0018, 0x0022, 0x0032, 0x003a, 0x0046, 0x0056, - 0x0060, 0x006c, 0x0078, 0x0088, 0x0092, 0x00a0, 0x00b0, 0x00be, - 0x00ca, 0x00d6, 0x00e2, 0x00ee, 0x00fc, 0x0108, 0x0116, 0x0124, - 0x0130, 0x0142, 0x0148, 0x0152, 0x017a, 0x0186, 0x0192, 0x019a, - 0x01a6, 0x01b0, 0x01bc, 0x01c4, 0x01d0, 0x01dc, 0x01ea, 0x01f6, - 0x0204, 0x020e, 0x0218, 0x0220, 0x022a, 0x0236, 0x0246, 0x0252, - 0x026b, 0x0275, 0x028c, 0x029e, 0x02aa, 0x02ba, 0x02c4, 0x02ce, - 0x02d8, 0x02e2, 0x02f3, 0x0301, 0x031e, 0x032c, 0x0338, 0x0340, - // Entry 40 - 7F - 0x035b, 0x036d, 0x0381, 0x038b, 0x039c, 0x03ac, 0x03b4, 0x03c4, - 0x03d2, 0x03e6, 0x03f0, 0x03fe, 0x040c, 0x0416, 0x0422, 0x0432, - 0x043c, 0x044e, 0x0458, 0x0462, 0x0472, 0x047e, 0x048c, 0x0498, - 0x04a0, 0x04ac, 0x04bc, 0x04c8, 0x04de, 0x04e8, 0x04fa, 0x0506, - 0x050c, 0x0518, 0x052b, 0x0535, 0x0541, 0x054d, 0x0559, 0x0567, - 0x0575, 0x0585, 0x0591, 0x059b, 0x05a5, 0x05b3, 0x05bf, 0x05d6, - 0x05e2, 0x05ee, 0x05fc, 0x0615, 0x0634, 0x064b, 0x0659, 0x0667, - 0x0679, 0x068b, 0x0697, 0x06a1, 0x06ad, 0x06bb, 0x06c3, 0x06cf, - // Entry 80 - BF - 0x06d9, 0x06eb, 0x06f7, 0x0703, 0x0711, 0x071d, 0x0727, 0x073b, - 0x0749, 0x0757, 0x0765, 0x0778, 0x0780, 0x078c, 0x079a, 0x07a8, - 0x07b4, 0x07bc, 0x07c8, 0x07d4, 0x07de, 0x07ea, 0x07ff, 0x080f, - 0x081b, 0x0829, 0x0835, 0x083f, 0x084d, 0x0855, 0x0865, 0x0875, - 0x0881, 0x088f, 0x089b, 0x08a7, 0x08b1, 0x08bd, 0x08c9, 0x08db, - 0x08e5, 0x08f3, 0x08fd, 0x090d, 0x091e, 0x092a, 0x0934, 0x093c, - 0x0946, 0x0952, 0x095c, 0x0966, 0x096e, 0x097c, 0x0986, 0x0990, - 0x099c, 0x099c, 0x09ac, 0x09b6, 0x09be, 0x09c8, 0x09c8, 0x09d2, - // Entry C0 - FF - 0x09d2, 0x09e9, 0x0a00, 0x0a0e, 0x0a18, 0x0a28, 0x0a28, 0x0a32, - 0x0a32, 0x0a32, 0x0a3e, 0x0a3e, 0x0a3e, 0x0a44, 0x0a44, 0x0a52, - 0x0a52, 0x0a60, 0x0a6e, 0x0a7c, 0x0a8a, 0x0a92, 0x0a9a, 0x0a9a, - 0x0aa6, 0x0aae, 0x0ab6, 0x0ab6, 0x0abc, 0x0ac6, 0x0ac6, 0x0ae1, - 0x0af1, 0x0afb, 0x0b03, 0x0b03, 0x0b09, 0x0b17, 0x0b17, 0x0b17, - 0x0b21, 0x0b21, 0x0b29, 0x0b33, 0x0b3f, 0x0b4f, 0x0b57, 0x0b5f, - 0x0b6b, 0x0b73, 0x0b7d, 0x0b89, 0x0b91, 0x0b9d, 0x0ba7, 0x0bb5, - 0x0bc5, 0x0bd1, 0x0bd9, 0x0bec, 0x0bfa, 0x0c0c, 0x0c18, 0x0c22, - // Entry 100 - 13F - 0x0c3d, 0x0c49, 0x0c49, 0x0c61, 0x0c7e, 0x0c8a, 0x0c94, 0x0ca0, - 0x0caa, 0x0cb6, 0x0cc2, 0x0cce, 0x0cd8, 0x0ce2, 0x0cec, 0x0d03, - 0x0d03, 0x0d0d, 0x0d28, 0x0d3d, 0x0d47, 0x0d53, 0x0d5b, 0x0d63, - 0x0d63, 0x0d78, 0x0d82, 0x0d8e, 0x0da7, 0x0da7, 0x0db3, 0x0db3, - 0x0db9, 0x0dcb, 0x0dcb, 0x0dd1, 0x0dd1, 0x0dea, 0x0e01, 0x0e01, - 0x0e1a, 0x0e33, 0x0e41, 0x0e45, 0x0e53, 0x0e64, 0x0e6c, 0x0e76, - 0x0e76, 0x0e7c, 0x0e8c, 0x0e8c, 0x0eb2, 0x0ed4, 0x0ed4, 0x0ede, - 0x0ef0, 0x0efa, 0x0f02, 0x0f19, 0x0f36, 0x0f36, 0x0f36, 0x0f3e, - // Entry 140 - 17F - 0x0f4c, 0x0f56, 0x0f69, 0x0f75, 0x0f75, 0x0f89, 0x0f91, 0x0f9b, - 0x0fb2, 0x0fc7, 0x0fcf, 0x0fd9, 0x0fe7, 0x0ff3, 0x1003, 0x1003, - 0x1003, 0x1011, 0x101d, 0x1029, 0x1040, 0x1057, 0x1057, 0x106a, - 0x1074, 0x107e, 0x1084, 0x108c, 0x1096, 0x10a2, 0x10ac, 0x10b4, - 0x10c0, 0x10d6, 0x10d6, 0x10de, 0x10de, 0x10e8, 0x10f8, 0x110d, - 0x110d, 0x110d, 0x1115, 0x1123, 0x1133, 0x114c, 0x115a, 0x116a, - 0x1172, 0x1187, 0x1187, 0x1187, 0x1193, 0x119d, 0x11a9, 0x11b3, - 0x11c3, 0x11d1, 0x11dd, 0x11e7, 0x11f1, 0x11f9, 0x1201, 0x120b, - // Entry 180 - 1BF - 0x120b, 0x120b, 0x120b, 0x1215, 0x1215, 0x121f, 0x1229, 0x1240, - 0x1240, 0x1255, 0x1261, 0x126b, 0x1273, 0x127b, 0x1283, 0x1283, - 0x1283, 0x1291, 0x129b, 0x12a9, 0x12b9, 0x12c3, 0x12d1, 0x12db, - 0x12e3, 0x12ed, 0x12f7, 0x12ff, 0x1305, 0x132c, 0x1343, 0x1358, - 0x135e, 0x1368, 0x137a, 0x1384, 0x1394, 0x139e, 0x13a6, 0x13a6, - 0x13b4, 0x13c5, 0x13cd, 0x13dd, 0x13eb, 0x13eb, 0x13f5, 0x13ff, - 0x1413, 0x142b, 0x143d, 0x1445, 0x145c, 0x1468, 0x1470, 0x147a, - 0x147a, 0x1488, 0x1498, 0x14a2, 0x14bc, 0x14bc, 0x14c4, 0x14d9, - // Entry 1C0 - 1FF - 0x14e1, 0x14fc, 0x150c, 0x151c, 0x1526, 0x1530, 0x153a, 0x1557, - 0x1567, 0x1571, 0x157f, 0x158f, 0x159b, 0x159b, 0x15b6, 0x15b6, - 0x15b6, 0x15cb, 0x15cb, 0x15d9, 0x15d9, 0x15d9, 0x15e7, 0x15f3, - 0x160e, 0x1618, 0x1618, 0x162a, 0x1636, 0x1648, 0x1648, 0x1648, - 0x1652, 0x165e, 0x165e, 0x165e, 0x165e, 0x166c, 0x1676, 0x1684, - 0x168c, 0x16a7, 0x16b3, 0x16bb, 0x16c9, 0x16c9, 0x16d5, 0x16df, - 0x16f3, 0x16ff, 0x16ff, 0x1718, 0x1720, 0x1726, 0x1726, 0x1730, - 0x1749, 0x175e, 0x175e, 0x1766, 0x176c, 0x1783, 0x178f, 0x178f, - // Entry 200 - 23F - 0x178f, 0x17a4, 0x17b5, 0x17ca, 0x17dd, 0x17eb, 0x17f9, 0x180e, - 0x1814, 0x181c, 0x181c, 0x1828, 0x1830, 0x183c, 0x183c, 0x1853, - 0x185d, 0x185d, 0x185d, 0x1867, 0x186d, 0x1875, 0x187d, 0x1889, - 0x188f, 0x189b, 0x189b, 0x18a9, 0x18b7, 0x18b7, 0x18c1, 0x18d6, - 0x18e7, 0x18e7, 0x18f1, 0x18f1, 0x1901, 0x1901, 0x190f, 0x191b, - 0x1927, 0x1935, 0x195a, 0x1968, 0x1978, 0x1988, 0x198e, 0x1996, - 0x1996, 0x1996, 0x1996, 0x1996, 0x19a0, 0x19a0, 0x19ac, 0x19b8, - 0x19c6, 0x19d0, 0x19da, 0x19ea, 0x19f9, 0x1a07, 0x1a07, 0x1a0f, - // Entry 240 - 27F - 0x1a15, 0x1a21, 0x1a2d, 0x1a35, 0x1a35, 0x1a45, 0x1a51, 0x1a65, - 0x1a65, 0x1a6f, 0x1a97, 0x1a9f, 0x1ab9, 0x1ac1, 0x1ada, 0x1ada, - 0x1ada, 0x1af3, 0x1af3, 0x1af3, 0x1b10, 0x1b10, 0x1b10, 0x1b10, - 0x1b10, 0x1b10, 0x1b10, 0x1b29, 0x1b42, 0x1b4c, 0x1b4c, 0x1b4c, - 0x1b5a, 0x1b71, 0x1b8a, 0x1b9f, 0x1bb8, -} // Size: 1250 bytes - -const hiLangStr string = "" + // Size: 11573 bytes - "अफ़ारअब्ख़ाज़ियनअवस्ताईअफ़्रीकीअकनअम्हेरीअर्गोनीअरबीअसमियाअवेरिकआयमाराअज" + - "़रबैजानीबशख़िरबेलारूसीबुल्गारियाईबिस्लामाबाम्बाराबंगालीतिब्बतीब्रेटनबो" + - "स्नियाईकातालानचेचनकमोरोकोर्सीकनक्रीचेकचर्च साल्विकचूवाशवेल्शडेनिशजर्मन" + - "दिवेहीज़ोन्गखाईवेयूनानीअंग्रेज़ीएस्पेरेंतोस्पेनीएस्टोनियाईबास्कफ़ारसीफ" + - "ुलाहफ़िनिशफ़ीजीफ़ैरोइज़फ़्रेंचपश्चिमी फ़्रिसियाईआइरिशस्कॉटिश गाएलिकगैल" + - "िशियनगुआरानीगुजरातीमैंक्सहौसाहिब्रूहिन्दीहिरी मोटूक्रोएशियाईहैतियाईहंग" + - "ेरियाईआर्मेनियाईहरैरोईन्टरलिंगुआइंडोनेशियाईईन्टरलिंगुइईग्बोसिचुआन यीइन" + - "ुपियाक्इडौआइसलैंडिकइतालवीइनूकीटूत्जापानीजावानीज़जॉर्जियाईकोंगोकिकुयूक्" + - "वान्यामाकज़ाख़कलालीसुतखमेरकन्नड़कोरियाईकनुरीकश्मीरीकुर्दिशकोमीकोर्निशक" + - "िर्गीज़लैटिनलग्ज़मबर्गीगांडालिंबर्गिशलिंगालालाओलिथुआनियाईल्यूबा-कटांगा" + - "लातवियाईमालागासीमार्शलीज़माओरीमैसिडोनियाईमलयालममंगोलियाईमराठीमलयमाल्टी" + - "ज़बर्मीज़नाउरूउत्तरी देबेलनेपालीडोन्गाडचनॉर्वेजियाई नॉयनॉर्स्कनॉर्वेजि" + - "याई बोकमालदक्षिण देबेलनावाजोन्यानजाओसीटानओजिब्वाओरोमोउड़ियाओस्सेटिकपंज" + - "ाबीपालीपोलिशपश्तोपुर्तगालीक्वेचुआरोमान्शरुन्दीरोमानियाईरूसीकिन्यारवांड" + - "ासंस्कृतसार्दिनियनसिंधीनॉर्दन सामीसांगोसिंहलीस्लोवाकस्लोवेनियाईसामोनशो" + - "णासोमालीअल्बानियाईसर्बियाईस्वातीसेसोथोसुंडानीस्वीडिशस्वाहिलीतमिलतेलुगू" + - "ताजिकथाईतिग्रीन्यातुर्कमेनसेत्स्वानाटोंगनतुर्कीसोंगातातारताहितियनविघुर" + - "यूक्रेनियाईउर्दूउज़्बेकवेन्दावियतनामीवोलापुकवाल्लूनवोलोफ़ख़ोसायहूदीयोर" + - "ूबाज़ुआंगचीनीज़ुलूअचाइनीसअकोलीअदान्गमेअदिघेअफ्रिहिलीअग्हेमऐनूअक्कादीअल" + - "ेउतदक्षिणी अल्ताईपुरानी अंग्रेज़ीअंगिकाऐरेमेकमापूचेअराफाओअरावकअसुअस्तु" + - "रियनअवधीबलूचीबालिनीसबसाबेजाबेम्बाबेनापश्चिमी बलोचीभोजपुरीबिकोलबिनीसिक्" + - "सिकाब्रजबोडोबुरियातबगिनीसब्लिनकैड्डोकैरिबअत्समसिबुआनोशिगाचिब्चाछगाताईच" + - "ूकीसमारीचिनूक जारगॉनचोक्तौशिपेव्यानशेरोकीशेयेन्नसोरानी कुर्दिशकॉप्टिकक" + - "्रीमीन तुर्कीसेसेल्वा क्रिओल फ्रेंचकाशुबियनदाकोतादार्गवातैताडिलैवेयरस्" + - "लेवडोग्रिबदिन्काझार्माडोग्रीनिचला सॉर्बियनदुआलामध्यकालीन पुर्तगालीजोला" + - "-फोंईड्युलादज़ागाएम्बुएफिकप्राचीन मिस्रीएकाजुकएलामाइटमध्यकालीन अंग्रेज़ी" + - "इवोन्डोफैन्गफ़िलिपीनोफॉनमध्यकालीन फ़्रांसीसीपुरातन फ़्रांसीसीउत्तरी फ़" + - "्रीसियाईपूर्वी फ़्रीसियाईफ्रीयुलीयानगागागौज़गायोग्बायागीज़गिल्बरतीसमध्" + - "यकालीन हाइ जर्मनपुरातन हाइ जर्मनगाँडीगोरोन्तालोगॉथिकग्रेबोप्राचीन यूना" + - "नीस्विस जर्मनगुसीग्विच’इनहैडाहवाईहिलिगेननहिताइतह्मॉंगऊपरी सॉर्बियनहूपा" + - "इबानइबिबियोइलोकोइंगुशलोज्बाननगोंबामैकहैमेजुदेओ-पर्शियनजुदेओ-अरेबिककारा" + - "-कल्पककबाइलकाचिनज्जुकम्बाकावीकबार्डियनत्यापमैकोंडकाबुवेर्दियानुकोरोखासीख" + - "ोतानीसकोयरा चीनीकाकोकलेंजिनकिम्बन्दुकोमी-पर्मयाककोंकणीकोसरैनक्पेलकराचय" + - "-बल्कारकरेलियनकुरूखशम्बालाबफिआकोलोनियाईकुमीकक्यूतनाईलादीनोलांगिलाह्न्डाल" + - "ाम्बालेज़्घीयनलैकोटामोंगोलोज़ीउत्तरी लूरील्यूबा-लुलुआलुइसेनोलुन्डाल्यु" + - "ओलुशाईल्युईआमादुरीसमगहीमैथिलीमकासरमन्डिन्गोमसाईमोक्षमंदारमेन्डेमेरुमोर" + - "ीस्येनमध्यकालीन आइरिशमैखुवा-मीट्टोमेटामिकमैकमिनांग्काबाउमन्चुमणिपुरीमो" + - "हौकमोस्सीमुंडैंगएकाधिक भाषाएँक्रीकमिरांडीमारवाड़ीएर्ज़यामाज़न्देरानीna" + - "nनीपोलिटननामानिचला जर्मननेवाड़ीनियासनियुआनक्वासिओगैम्बूनोगाईपुराना नॉर्स" + - "एन्कोउत्तरी सोथोनुएरपारम्परिक नेवारीन्यामवेज़ीन्यानकोलन्योरोन्ज़ीमाओसे" + - "जओटोमान तुर्किशपंगासीनानपाह्लावीपाम्पान्गापापियामेन्टोपलोउआननाइजीरियाई" + - " पिडगिनपुरानी फारसीफोएनिशियनपोह्नपिएनप्रुशियाईपुरानी प्रोवेन्सलकिशराजस्थ" + - "ानीरापानुईरारोतोंगनरोम्बोरोमानीअरोमानियनरवासन्डावेयाकूतसामैरिटन अरैमिक" + - "सैम्बुरुसासाकसंतालीन्गाम्बेसैंगुसिसिलियनस्कॉट्सदक्षिणी कार्डिशसेनासेल्" + - "कपकोयराबोरो सेन्नीपुरानी आइरिशतैचेल्हितशैनसिदामोदक्षिण सामील्युल सामीइ" + - "नारी सामीस्कोल्ट सामीसोनिन्केसोग्डिएनस्रानान टॉन्गोसेरेरसाहोसुकुमासुसु" + - "सुमेरियनकोमोरियनक्लासिकल सिरिएकसिरिएकटिम्नेटेसोतेरेनोतेतुमटाइग्रेतिवतो" + - "केलाऊक्लिंगनत्लिंगिततामाशेकन्यासा टोन्गाटोक पिसिनतारोकोत्सिमीशियनतम्बू" + - "कातुवालुटासवाकतुवीनियनमध्य एटलस तमाज़ितउदमुर्तयुगैरिटिकउम्बुन्डुरूटवाई" + - "वॉटिकवुंजोवाल्सरवलामोवारैवाशोवॉल्पेरीकाल्मिकसोगायाओयापीसयांगबेनयेंबाकै" + - "ंटोनीज़ज़ेपोटेकब्लिसिम्बॉल्सज़ेनान्गामानक मोरक्कन तामाज़ाइटज़ूनीकोई भा" + - "षा सामग्री नहींज़ाज़ाआधुनिक मानक अरबीऑस्ट्रियाई जर्मनस्विस उच्च जर्मनऑ" + - "स्ट्रेलियाई अंग्रेज़ीकनाडाई अंग्रेज़ीब्रिटिश अंग्रेज़ीअमेरिकी अंग्रेज़" + - "ीलैटिन अमेरिकी स्पेनिशयूरोपीय स्पेनिशमैक्सिकन स्पेनिशकनाडाई फ़्रेंचस्व" + - "िस फ़्रेंचनिचली सैक्सनफ़्लेमिशब्राज़ीली पुर्तगालीयूरोपीय पुर्तगालीमोलड" + - "ावियनसेर्बो-क्रोएशियाईकांगो स्वाहिलीसरलीकृत चीनीपारंपरिक चीनी" - -var hiLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x0030, 0x0045, 0x005d, 0x0066, 0x007b, 0x0090, - 0x009c, 0x00ae, 0x00c0, 0x00d2, 0x00f0, 0x0102, 0x011a, 0x013b, - 0x0153, 0x016b, 0x017d, 0x0192, 0x01a4, 0x01bf, 0x01d4, 0x01e0, - 0x01ef, 0x0207, 0x0213, 0x021c, 0x023e, 0x024d, 0x025c, 0x026b, - 0x027a, 0x028c, 0x02a4, 0x02ad, 0x02bf, 0x02da, 0x02f8, 0x030a, - 0x0328, 0x0337, 0x0349, 0x0358, 0x036a, 0x0379, 0x0391, 0x03a6, - 0x03da, 0x03e9, 0x0411, 0x0429, 0x043e, 0x0453, 0x0465, 0x0471, - 0x0483, 0x0495, 0x04ae, 0x04cc, 0x04e1, 0x04fc, 0x051a, 0x0529, - // Entry 40 - 7F - 0x054a, 0x056b, 0x058c, 0x059b, 0x05b4, 0x05cf, 0x05d8, 0x05f3, - 0x0605, 0x0620, 0x0632, 0x064a, 0x0665, 0x0674, 0x0686, 0x06a4, - 0x06b6, 0x06ce, 0x06da, 0x06ec, 0x0701, 0x0710, 0x0725, 0x073a, - 0x0746, 0x075b, 0x0773, 0x0782, 0x07a3, 0x07b2, 0x07cd, 0x07e2, - 0x07eb, 0x0809, 0x082e, 0x0846, 0x085e, 0x0879, 0x0888, 0x08a9, - 0x08bb, 0x08d6, 0x08e5, 0x08ee, 0x0906, 0x091b, 0x092a, 0x094c, - 0x095e, 0x0970, 0x0976, 0x09b6, 0x09ea, 0x0a0c, 0x0a1e, 0x0a33, - 0x0a45, 0x0a5a, 0x0a69, 0x0a7b, 0x0a93, 0x0aa5, 0x0ab1, 0x0ac0, - // Entry 80 - BF - 0x0acf, 0x0aea, 0x0aff, 0x0b14, 0x0b26, 0x0b41, 0x0b4d, 0x0b71, - 0x0b86, 0x0ba4, 0x0bb3, 0x0bd2, 0x0be1, 0x0bf3, 0x0c08, 0x0c29, - 0x0c38, 0x0c44, 0x0c56, 0x0c74, 0x0c8c, 0x0c9e, 0x0cb0, 0x0cc5, - 0x0cda, 0x0cf2, 0x0cfe, 0x0d10, 0x0d1f, 0x0d28, 0x0d46, 0x0d5e, - 0x0d7c, 0x0d8b, 0x0d9d, 0x0dac, 0x0dbb, 0x0dd3, 0x0de2, 0x0e03, - 0x0e12, 0x0e27, 0x0e39, 0x0e51, 0x0e66, 0x0e7b, 0x0e8d, 0x0e9c, - 0x0eab, 0x0ebd, 0x0ecf, 0x0edb, 0x0eea, 0x0eff, 0x0f0e, 0x0f26, - 0x0f35, 0x0f35, 0x0f50, 0x0f62, 0x0f6b, 0x0f80, 0x0f80, 0x0f8f, - // Entry C0 - FF - 0x0f8f, 0x0fb7, 0x0fe5, 0x0ff7, 0x1009, 0x101b, 0x101b, 0x102d, - 0x102d, 0x102d, 0x103c, 0x103c, 0x103c, 0x1045, 0x1045, 0x1060, - 0x1060, 0x106c, 0x107b, 0x1090, 0x1090, 0x1099, 0x1099, 0x1099, - 0x1099, 0x10a5, 0x10b7, 0x10b7, 0x10c3, 0x10c3, 0x10c3, 0x10e8, - 0x10fd, 0x110c, 0x1118, 0x1118, 0x1118, 0x1130, 0x1130, 0x1130, - 0x113c, 0x113c, 0x1148, 0x1148, 0x115d, 0x116f, 0x116f, 0x117e, - 0x117e, 0x1190, 0x119f, 0x119f, 0x11ae, 0x11c3, 0x11cf, 0x11e1, - 0x11f3, 0x1202, 0x120e, 0x1230, 0x1242, 0x125d, 0x126f, 0x1284, - // Entry 100 - 13F - 0x12ac, 0x12c1, 0x12c1, 0x12e9, 0x1327, 0x133f, 0x1351, 0x1366, - 0x1372, 0x138a, 0x1399, 0x13ae, 0x13c0, 0x13d2, 0x13e4, 0x140c, - 0x140c, 0x141b, 0x1452, 0x146b, 0x147d, 0x148f, 0x149e, 0x14aa, - 0x14aa, 0x14d2, 0x14e4, 0x14f9, 0x1530, 0x1530, 0x1545, 0x1545, - 0x1554, 0x156f, 0x156f, 0x1578, 0x1578, 0x15b2, 0x15e3, 0x15e3, - 0x1614, 0x1645, 0x1666, 0x166c, 0x167e, 0x167e, 0x168a, 0x169c, - 0x169c, 0x16a8, 0x16c3, 0x16c3, 0x16f8, 0x1724, 0x1724, 0x1733, - 0x1751, 0x1760, 0x1772, 0x179a, 0x17b9, 0x17b9, 0x17b9, 0x17c5, - // Entry 140 - 17F - 0x17dd, 0x17e9, 0x17e9, 0x17f5, 0x17f5, 0x180d, 0x181f, 0x1831, - 0x1856, 0x1856, 0x1862, 0x186e, 0x1883, 0x1892, 0x18a1, 0x18a1, - 0x18a1, 0x18b6, 0x18c8, 0x18dd, 0x1902, 0x1924, 0x1924, 0x1940, - 0x194f, 0x195e, 0x196a, 0x1979, 0x1985, 0x19a0, 0x19a0, 0x19af, - 0x19c1, 0x19eb, 0x19eb, 0x19f7, 0x19f7, 0x1a03, 0x1a18, 0x1a34, - 0x1a34, 0x1a34, 0x1a40, 0x1a55, 0x1a70, 0x1a92, 0x1aa4, 0x1ab6, - 0x1ac5, 0x1ae7, 0x1ae7, 0x1ae7, 0x1afc, 0x1b0b, 0x1b20, 0x1b2c, - 0x1b47, 0x1b56, 0x1b6e, 0x1b80, 0x1b8f, 0x1ba7, 0x1bb9, 0x1bd4, - // Entry 180 - 1BF - 0x1bd4, 0x1bd4, 0x1bd4, 0x1be6, 0x1be6, 0x1bf5, 0x1c04, 0x1c23, - 0x1c23, 0x1c45, 0x1c5a, 0x1c6c, 0x1c7b, 0x1c8a, 0x1c9c, 0x1c9c, - 0x1c9c, 0x1cb1, 0x1cb1, 0x1cbd, 0x1ccf, 0x1cde, 0x1cf9, 0x1d05, - 0x1d05, 0x1d14, 0x1d23, 0x1d35, 0x1d41, 0x1d5c, 0x1d87, 0x1dac, - 0x1db8, 0x1dca, 0x1dee, 0x1dfd, 0x1e12, 0x1e21, 0x1e33, 0x1e33, - 0x1e48, 0x1e6d, 0x1e7c, 0x1e91, 0x1ea9, 0x1ea9, 0x1ea9, 0x1ebe, - 0x1ee2, 0x1ee5, 0x1efd, 0x1f09, 0x1f28, 0x1f3d, 0x1f4c, 0x1f5e, - 0x1f5e, 0x1f73, 0x1f85, 0x1f94, 0x1fb6, 0x1fb6, 0x1fc5, 0x1fe4, - // Entry 1C0 - 1FF - 0x1ff0, 0x201e, 0x203c, 0x2054, 0x2066, 0x207b, 0x2087, 0x20af, - 0x20ca, 0x20e2, 0x2100, 0x2124, 0x2136, 0x2136, 0x2167, 0x2167, - 0x2167, 0x2189, 0x2189, 0x21a4, 0x21a4, 0x21a4, 0x21bf, 0x21da, - 0x220b, 0x2214, 0x2214, 0x222f, 0x2244, 0x225f, 0x225f, 0x225f, - 0x2271, 0x2283, 0x2283, 0x2283, 0x2283, 0x229e, 0x22a7, 0x22bc, - 0x22cb, 0x22f6, 0x230e, 0x231d, 0x232f, 0x232f, 0x2347, 0x2356, - 0x236e, 0x2383, 0x2383, 0x23ae, 0x23ae, 0x23ba, 0x23ba, 0x23cc, - 0x23fa, 0x241c, 0x241c, 0x2437, 0x2440, 0x2440, 0x2452, 0x2452, - // Entry 200 - 23F - 0x2452, 0x2471, 0x248d, 0x24a9, 0x24cb, 0x24e3, 0x24fb, 0x2523, - 0x2532, 0x253e, 0x253e, 0x2550, 0x255c, 0x2574, 0x258c, 0x25b7, - 0x25c9, 0x25c9, 0x25c9, 0x25db, 0x25e7, 0x25f9, 0x2608, 0x261d, - 0x2626, 0x263b, 0x263b, 0x2650, 0x2668, 0x2668, 0x267d, 0x26a2, - 0x26bb, 0x26bb, 0x26cd, 0x26cd, 0x26eb, 0x26eb, 0x2700, 0x2712, - 0x2724, 0x273c, 0x276b, 0x2780, 0x279b, 0x27b6, 0x27bf, 0x27c8, - 0x27c8, 0x27c8, 0x27c8, 0x27c8, 0x27d7, 0x27d7, 0x27e6, 0x27f8, - 0x2807, 0x2813, 0x281f, 0x2837, 0x2837, 0x284c, 0x284c, 0x2858, - // Entry 240 - 27F - 0x2861, 0x2870, 0x2885, 0x2894, 0x2894, 0x28af, 0x28c7, 0x28ee, - 0x28ee, 0x2909, 0x2947, 0x2956, 0x298f, 0x29a1, 0x29cd, 0x29cd, - 0x29fb, 0x2a27, 0x2a67, 0x2a95, 0x2ac6, 0x2af7, 0x2b32, 0x2b5d, - 0x2b8b, 0x2b8b, 0x2bb3, 0x2bd8, 0x2bfa, 0x2c12, 0x2c49, 0x2c7a, - 0x2c95, 0x2cc6, 0x2cee, 0x2d10, 0x2d35, -} // Size: 1250 bytes - -const hrLangStr string = "" + // Size: 4630 bytes - "afarskiabhaskiavestičkiafrikaansakanskiamharskiaragonskiarapskiasamskiav" + - "arskiajmarskiazerbajdžanskibaškirskibjeloruskibugarskibislamabambarabang" + - "latibetskibretonskibosanskikatalonskičečenskichamorrokorzičkicreečeškicr" + - "kvenoslavenskičuvaškivelškidanskinjemačkidivehidzongkhaewegrčkiengleskie" + - "sperantošpanjolskiestonskibaskijskiperzijskifulafinskifidžijskiferojskif" + - "rancuskizapadnofrizijskiirskiškotski gaelskigalicijskigvaranskigudžarats" + - "kimanskihausahebrejskihindskihiri motuhrvatskihaićanski kreolskimađarski" + - "armenskihererointerlinguaindonezijskiinterliguaigbosichuan yiinupiaqidoi" + - "slandskitalijanskiinuktitutjapanskijavanskigruzijskikongokikuyukuanyamak" + - "azaškikalaallisutkmerskikarnatačkikorejskikanurikašmirskikurdskikomikorn" + - "skikirgiskilatinskiluksemburškigandalimburškilingalalaoskilitavskiluba-k" + - "atangalatvijskimalgaškimaršalskimaorskimakedonskimalajalamskimongolskima" + - "rathskimalajskimalteškiburmanskinaurusjeverni ndebelenepalskindonganizoz" + - "emskinorveški nynorsknorveški bokmåljužni ndebelenavajonjandžaokcitanski" + - "ojibwaoromskiorijskiosetskipandžapskipalipoljskipaštunskiportugalskikeču" + - "anskiretoromanskirundirumunjskiruskikinyarwandasanskrtskisardskisindskis" + - "jeverni samisangosinhaleškislovačkislovenskisamoanskishonasomalskialbans" + - "kisrpskisvatisesotskisundanskišvedskisvahilitamilskiteluškitadžičkitajla" + - "ndskitigrinjaturkmenskicvanatonganskiturskitsongatatarskitahićanskiujgur" + - "skiukrajinskiurdskiuzbečkivendavijetnamskivolapükvalonskivolofxhosajidiš" + - "jorupskizhuangkineskizuluačinskiačoliadangmeadigejskiafrihiliaghemainusk" + - "iakadskialeutskijužni altaistaroengleskiangikaaramejskimapuchearapahoara" + - "vačkiasuasturijskiawadhibelučkibalijskibasabamunskighomalabejabembabenab" + - "afutzapadnobaludžijskibhojpuribikolskibinikomsiksikabrajbodoakooseburjat" + - "skibuginskibulublinmedumbacaddokaripskicayugaatsamcebuanochigačibčačagat" + - "ajskichuukesemarijskichinook žargonchoctawchipewyančerokijskičejenskisor" + - "anski kurdskikoptskikrimski turskisejšelski kreolskikašupskidakota jezik" + - "dargwataitadelavarskislavedogribdinkazarmadogridonjolužičkidualasrednjon" + - "izozemskijola-fonyidyuladazagaembuefikstaroegipatskiekajukelamitskisredn" + - "joengleskiewondofangfilipinskifonsrednjofrancuskistarofrancuskisjevernof" + - "rizijskiistočnofrizijskifurlanskigagagauskigan kineskigayogbayageezgilbe" + - "rtskisrednjogornjonjemačkistarovisokonjemačkigondigorontalogotskigrebost" + - "arogrčkišvicarski njemačkigusiigwich’inhaidihakka kineskihavajskihiligay" + - "nonskihetitskihmonggornjolužičkixiang kineskihupaibanibibioilokoingušets" + - "kilojbanngombamachamejudejsko-perzijskijudejsko-arapskikara-kalpakkabils" + - "kikačinskikajekambakawikabardinskikanembutyapmakondezelenortskikorokhasi" + - "khotanesekoyra chiinikakokalenjinkimbundukomi-permskikonkaninaurskikpell" + - "ekarachay-balkarkarelijskikuruškishambalabafiakelnskikumykkutenailadinol" + - "angilahndalambalezgiškilakotamongolozisjevernolurskiluba-lulualuisenolun" + - "daluolushailuyiamadurskimafamagahimaithilimakasarmandingomasajskimabamok" + - "shamandarmendemerumauricijski kreolskisrednjoirskimakhuwa-meettometa’mic" + - "macminangkabaumandžurskimanipurskimohokmossimundangviše jezikacreekmiran" + - "dskimarwarimyenemordvinskimazanderanskimin nan kineskinapolitanskinamado" + - "njonjemačkinewariniasniujskikwasiongiemboonnogajskistaronorveškin’kosjev" + - "erni sotskinuerskiklasični newarinyamwezinyankolenyoronzimaosageturski -" + - " otomanskipangasinanpahlavipampangapapiamentopalauanskinigerijski pidžin" + - "staroperzijskifeničkipohnpeianpruskistaroprovansalskikičerajasthanirapa " + - "nuirarotonškiromboromskiaromunskirwasandawejakutskisamarijanski aramejsk" + - "isamburusasaksantalskingambaysangusicilijskiškotskijužnokurdskisenecasen" + - "aselkupskikoyraboro sennistaroirskitachelhitshančadski arapskisidamojužn" + - "i samilule samiinari samiskolt samisoninkesogdiensranan tongoserersahosu" + - "kumasususumerskikomorskiklasični sirskisirijskitemnetesoterenotetumtigri" + - "škitivtokelaunskiklingonskitlingittamašečkinyasa tongatok pisintarokots" + - "imshiantumbukatuvaluanskitasawaqtuvinskitamašek (Srednji Atlas)udmurtski" + - "ugaritskiumbundukorijenskivaivotskivunjowalserskiwalamowaraywashowarlpir" + - "iwu kineskikalmyksogayaojapskiyangbenyembakantonskizapotečkiBlissovi sim" + - "bolizenagastandardni marokanski tamašekzunibez jezičnog sadržajazazakimo" + - "derni standardni arapskijužnoazerbajdžanskiaustrijski njemačkigornjonjem" + - "ački (švicarski)australski engleskikanadski engleskibritanski engleskiam" + - "erički engleskilatinoamerički španjolskieuropski španjolskimeksički špan" + - "jolskikanadski francuskišvicarski francuskidonjosaksonskiflamanskibrazil" + - "ski portugalskieuropski portugalskimoldavskisrpsko-hrvatskikongoanski sv" + - "ahilikineski (pojednostavljeni)kineski (tradicionalni)" - -var hrLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0007, 0x000e, 0x0018, 0x0021, 0x0028, 0x0030, 0x0039, - 0x0040, 0x0047, 0x004e, 0x0056, 0x0065, 0x006f, 0x0079, 0x0081, - 0x0088, 0x008f, 0x0095, 0x009d, 0x00a6, 0x00ae, 0x00b8, 0x00c2, - 0x00ca, 0x00d3, 0x00d7, 0x00de, 0x00ee, 0x00f7, 0x00fe, 0x0104, - 0x010d, 0x0113, 0x011b, 0x011e, 0x0124, 0x012c, 0x0135, 0x0140, - 0x0148, 0x0151, 0x015a, 0x015e, 0x0164, 0x016e, 0x0176, 0x017f, - 0x018f, 0x0194, 0x01a4, 0x01ae, 0x01b7, 0x01c3, 0x01c9, 0x01ce, - 0x01d7, 0x01de, 0x01e7, 0x01ef, 0x0202, 0x020b, 0x0213, 0x0219, - // Entry 40 - 7F - 0x0224, 0x0230, 0x023a, 0x023e, 0x0248, 0x024f, 0x0252, 0x025b, - 0x0265, 0x026e, 0x0276, 0x027e, 0x0287, 0x028c, 0x0292, 0x029a, - 0x02a2, 0x02ad, 0x02b4, 0x02bf, 0x02c7, 0x02cd, 0x02d7, 0x02de, - 0x02e2, 0x02e9, 0x02f1, 0x02f9, 0x0306, 0x030b, 0x0315, 0x031c, - 0x0322, 0x032a, 0x0336, 0x033f, 0x0348, 0x0352, 0x0359, 0x0363, - 0x036f, 0x0378, 0x0381, 0x0389, 0x0392, 0x039b, 0x03a0, 0x03b0, - 0x03b8, 0x03be, 0x03c8, 0x03d9, 0x03ea, 0x03f8, 0x03fe, 0x0406, - 0x0410, 0x0416, 0x041d, 0x0424, 0x042b, 0x0436, 0x043a, 0x0441, - // Entry 80 - BF - 0x044b, 0x0456, 0x0460, 0x046c, 0x0471, 0x047a, 0x047f, 0x048a, - 0x0494, 0x049b, 0x04a2, 0x04af, 0x04b4, 0x04bf, 0x04c8, 0x04d1, - 0x04da, 0x04df, 0x04e7, 0x04ef, 0x04f5, 0x04fa, 0x0502, 0x050b, - 0x0513, 0x051a, 0x0522, 0x052a, 0x0534, 0x053e, 0x0546, 0x0550, - 0x0555, 0x055e, 0x0564, 0x056a, 0x0572, 0x057d, 0x0585, 0x058f, - 0x0595, 0x059d, 0x05a2, 0x05ad, 0x05b5, 0x05bd, 0x05c2, 0x05c7, - 0x05cd, 0x05d5, 0x05db, 0x05e2, 0x05e6, 0x05ee, 0x05f4, 0x05fb, - 0x0604, 0x0604, 0x060c, 0x0611, 0x0618, 0x061f, 0x061f, 0x0627, - // Entry C0 - FF - 0x0627, 0x0633, 0x0640, 0x0646, 0x064f, 0x0656, 0x0656, 0x065d, - 0x065d, 0x065d, 0x0666, 0x0666, 0x0666, 0x0669, 0x0669, 0x0673, - 0x0673, 0x0679, 0x0681, 0x0689, 0x0689, 0x068d, 0x0695, 0x0695, - 0x069c, 0x06a0, 0x06a5, 0x06a5, 0x06a9, 0x06ae, 0x06ae, 0x06c1, - 0x06c9, 0x06d1, 0x06d5, 0x06d5, 0x06d8, 0x06df, 0x06df, 0x06df, - 0x06e3, 0x06e3, 0x06e7, 0x06ed, 0x06f6, 0x06fe, 0x0702, 0x0706, - 0x070d, 0x0712, 0x071a, 0x0720, 0x0725, 0x072c, 0x0731, 0x0738, - 0x0743, 0x074b, 0x0753, 0x0762, 0x0769, 0x0772, 0x077d, 0x0786, - // Entry 100 - 13F - 0x0796, 0x079d, 0x079d, 0x07ab, 0x07be, 0x07c7, 0x07d3, 0x07d9, - 0x07de, 0x07e8, 0x07ed, 0x07f3, 0x07f8, 0x07fd, 0x0802, 0x0810, - 0x0810, 0x0815, 0x0826, 0x0830, 0x0835, 0x083b, 0x083f, 0x0843, - 0x0843, 0x0851, 0x0857, 0x0860, 0x086f, 0x086f, 0x0875, 0x0875, - 0x0879, 0x0883, 0x0883, 0x0886, 0x0886, 0x0896, 0x08a4, 0x08a4, - 0x08b5, 0x08c6, 0x08cf, 0x08d1, 0x08d9, 0x08e4, 0x08e8, 0x08ed, - 0x08ed, 0x08f1, 0x08fb, 0x08fb, 0x0911, 0x0925, 0x0925, 0x092a, - 0x0933, 0x0939, 0x093e, 0x0949, 0x095d, 0x095d, 0x095d, 0x0962, - // Entry 140 - 17F - 0x096c, 0x0971, 0x097e, 0x0986, 0x0986, 0x0993, 0x099b, 0x09a0, - 0x09af, 0x09bc, 0x09c0, 0x09c4, 0x09ca, 0x09cf, 0x09da, 0x09da, - 0x09da, 0x09e0, 0x09e6, 0x09ed, 0x09ff, 0x0a0f, 0x0a0f, 0x0a1a, - 0x0a22, 0x0a2b, 0x0a2f, 0x0a34, 0x0a38, 0x0a43, 0x0a4a, 0x0a4e, - 0x0a55, 0x0a60, 0x0a60, 0x0a64, 0x0a64, 0x0a69, 0x0a72, 0x0a7e, - 0x0a7e, 0x0a7e, 0x0a82, 0x0a8a, 0x0a92, 0x0a9e, 0x0aa5, 0x0aac, - 0x0ab2, 0x0ac1, 0x0ac1, 0x0ac1, 0x0acb, 0x0ad3, 0x0adb, 0x0ae0, - 0x0ae7, 0x0aec, 0x0af3, 0x0af9, 0x0afe, 0x0b04, 0x0b09, 0x0b12, - // Entry 180 - 1BF - 0x0b12, 0x0b12, 0x0b12, 0x0b18, 0x0b18, 0x0b1d, 0x0b21, 0x0b2f, - 0x0b2f, 0x0b39, 0x0b40, 0x0b45, 0x0b48, 0x0b4e, 0x0b53, 0x0b53, - 0x0b53, 0x0b5b, 0x0b5f, 0x0b65, 0x0b6d, 0x0b74, 0x0b7c, 0x0b84, - 0x0b88, 0x0b8e, 0x0b94, 0x0b99, 0x0b9d, 0x0bb1, 0x0bbd, 0x0bcb, - 0x0bd2, 0x0bd8, 0x0be3, 0x0bee, 0x0bf8, 0x0bfd, 0x0c02, 0x0c02, - 0x0c09, 0x0c15, 0x0c1a, 0x0c23, 0x0c2a, 0x0c2a, 0x0c2f, 0x0c39, - 0x0c46, 0x0c55, 0x0c61, 0x0c65, 0x0c73, 0x0c79, 0x0c7d, 0x0c84, - 0x0c84, 0x0c8a, 0x0c93, 0x0c9b, 0x0ca9, 0x0ca9, 0x0caf, 0x0cbe, - // Entry 1C0 - 1FF - 0x0cc5, 0x0cd5, 0x0cdd, 0x0ce5, 0x0cea, 0x0cef, 0x0cf4, 0x0d06, - 0x0d10, 0x0d17, 0x0d1f, 0x0d29, 0x0d33, 0x0d33, 0x0d45, 0x0d45, - 0x0d45, 0x0d53, 0x0d53, 0x0d5b, 0x0d5b, 0x0d5b, 0x0d64, 0x0d6a, - 0x0d7b, 0x0d80, 0x0d80, 0x0d8a, 0x0d92, 0x0d9d, 0x0d9d, 0x0d9d, - 0x0da2, 0x0da8, 0x0da8, 0x0da8, 0x0da8, 0x0db1, 0x0db4, 0x0dbb, - 0x0dc3, 0x0dd9, 0x0de0, 0x0de5, 0x0dee, 0x0dee, 0x0df5, 0x0dfa, - 0x0e04, 0x0e0c, 0x0e0c, 0x0e19, 0x0e1f, 0x0e23, 0x0e23, 0x0e2c, - 0x0e3b, 0x0e45, 0x0e45, 0x0e4e, 0x0e52, 0x0e61, 0x0e67, 0x0e67, - // Entry 200 - 23F - 0x0e67, 0x0e72, 0x0e7b, 0x0e85, 0x0e8f, 0x0e96, 0x0e9d, 0x0ea9, - 0x0eae, 0x0eb2, 0x0eb2, 0x0eb8, 0x0ebc, 0x0ec4, 0x0ecc, 0x0edc, - 0x0ee4, 0x0ee4, 0x0ee4, 0x0ee9, 0x0eed, 0x0ef3, 0x0ef8, 0x0f01, - 0x0f04, 0x0f0f, 0x0f0f, 0x0f19, 0x0f20, 0x0f20, 0x0f2b, 0x0f36, - 0x0f3f, 0x0f3f, 0x0f45, 0x0f45, 0x0f4e, 0x0f4e, 0x0f55, 0x0f60, - 0x0f67, 0x0f6f, 0x0f87, 0x0f90, 0x0f99, 0x0fa0, 0x0faa, 0x0fad, - 0x0fad, 0x0fad, 0x0fad, 0x0fad, 0x0fb3, 0x0fb3, 0x0fb8, 0x0fc1, - 0x0fc7, 0x0fcc, 0x0fd1, 0x0fd9, 0x0fe3, 0x0fe9, 0x0fe9, 0x0fed, - // Entry 240 - 27F - 0x0ff0, 0x0ff6, 0x0ffd, 0x1002, 0x1002, 0x100b, 0x1015, 0x1025, - 0x1025, 0x102b, 0x1049, 0x104d, 0x1064, 0x106a, 0x1084, 0x1099, - 0x10ad, 0x10c9, 0x10dc, 0x10ed, 0x10ff, 0x1111, 0x112c, 0x1140, - 0x1155, 0x1155, 0x1167, 0x117b, 0x1189, 0x1192, 0x11a7, 0x11bb, - 0x11c4, 0x11d3, 0x11e5, 0x11ff, 0x1216, -} // Size: 1250 bytes - -const huLangStr string = "" + // Size: 4071 bytes - "afarabházavesztánafrikaansakanamharaaragonézarabasszámiavarajmaraazerbaj" + - "dzsánibaskírbelaruszbolgárbislamabambarabanglatibetibretonbosnyákkatalán" + - "csecsencsamorókorzikaikrícsehegyházi szlávcsuvaswalesidánnémetdivehidzso" + - "ngaevegörögangoleszperantóspanyolésztbaszkperzsafulanifinnfidzsiferöerif" + - "rancianyugati frízírskóciai keltagallegoguaranigudzsarátiman-szigetihaus" + - "zahéberhindihiri motuhorváthaiti kreolmagyarörményhererointerlingvaindon" + - "ézinterlingueigbószecsuán jiinupiakidóizlandiolaszinuktitutjapánjávaigr" + - "úzkongokikujukuanyamakazahgrönlandikhmerkannadakoreaikanurikasmírikurdk" + - "omikornikirgizlatinluxemburgigandalimburgilingalalaolitvánluba-katangale" + - "ttmalgasmarshallimaorimacedónmalajálammongolmaráthimalájmáltaiburmainaur" + - "uiészaki ndebelenepálindongahollandnorvég (nynorsk)norvég (bokmål)déli n" + - "debelenavahónyandzsaokszitánojibvaoromoodiaoszétpandzsábipalilengyelpast" + - "uportugálkecsuarétorománkirundirománoroszkinyarvandaszanszkritszardíniai" + - "szindhiészaki számiszangószingalézszlovákszlovénszamoaisonaszomálialbáns" + - "zerbsziszuatidéli szeszotószundanézsvédszuahélitamiltelugutadzsikthaitig" + - "rinyatürkménszecsuánitongaitörökcongatatártahitiujgurukránurduüzbégvenda" + - "vietnamivolapükvallonvolofxhoszajiddisjorubazsuangkínaizuluachinézakolia" + - "dangmeadygheafrihiliagemainuakkádaleutdél-altajióangolangikaarámimapucse" + - "arapahoaravakasuasztúrawádibalucsibalinézbaszabamungomalabedzsabembabena" + - "bafutnyugati beludzsbodzspuribikolbinikomsiksikabrajbodokosziburjátbugin" + - "ézbulublinmedumbacaddokaribkajugaatszamszebuanokigacsibcsacsagatájcsuké" + - "zmaricsinuk zsargoncsoktócsipevécserokicsejenközép-ázsiai kurdkoptkrími " + - "tatárszeszelva kreol franciakasubdakotadargvataitadelavárszlevidogribdin" + - "kazarmadogrialsó-szorbdualaközép hollandjola-fonyidiuladazagaembuefikóeg" + - "yiptomiekadzsukelamitközép angolevondofangfilippínófonközép franciaófran" + - "ciaészaki frízkeleti frízfriuligagagauzgan kínaigajogbajageezikiribatikö" + - "zép felső németófelső németgondigorontalogótgrebóógörögsvájci németguszi" + - "igvicsinhaidahakka kínaihawaiiilokanohittitehmongfelső-szorbxiang kínaih" + - "upaibanibibioilokóinguslojbanngombamachamezsidó-perzsazsidó-arabkara-kal" + - "pakkabijekacsinjjukambakawikabardikanembutyapmakondekabuverdianukorokasz" + - "ikotanézkojra-csínikakókalendzsinkimbundukomi-permjákkonkanikosreikpelle" + - "karacsáj-balkárkarelaikuruhsambalabafiakölschkumükkutenailadinolangilahn" + - "dalambalezglakotamongóloziészaki luriluba-lulualuisenolundaluolushailuji" + - "amaduraimafamagahimaithilimakaszarmandingómasaimabamoksánmandarmendemeru" + - "mauritiusi kreolközép írmakua-metómeta’mikmakminangkabaumandzsumanipurim" + - "ohawkmoszimundangtöbbszörös nyelvekkríkmirandézmárvárimyeneerzjánymázand" + - "eránimin nan kínainápolyinamaalsónémetnevariniasniueingumbangiemboonnoga" + - "jóskandinávn’kóészaki szeszotónuerklasszikus newarinyamvézinyankolenyoró" + - "nzimaosageottomán törökpangaszinanpahlavipampanganpapiamentopalauinigéri" + - "ai pidginóperzsafőniciaipohnpeiporoszóprovánszikicseradzsasztánirapanuir" + - "arotongairomboromaarománrwoszandaveszahaszamaritánus arámiszamburusasaks" + - "zantálingambayszanguszicíliaiskótdél-kurdszenekaszenaszölkupkojra-szenni" + - "óírtachelhitsancsádi arabszidamódéli számilulei számiinari számikolta s" + - "zámiszoninkesogdienszranai tongószererszahószukumaszuszusumércomoreiklas" + - "szikus szírszírtemneteszóterenótetumtigrétivtokelauiklingontlingittamase" + - "knyugati nyaszatok pisintarokócsimsiánitumbukatuvaluszaváktuvaiközép-atl" + - "aszi tamazigtudmurtugaritiumbunduősivaivotjákvunjowalservalamovaraóvasów" + - "arlpiriwu kínaikalmükszogajaójapijangbenjembakantonizapotékBliss jelképr" + - "endszerzenagamarokkói tamazightzuninincs nyelvészeti tartalomzazamodern " + - "szabányos arabosztrák németsvájci felnémetausztrál angolkanadai angolbri" + - "t angolamerikai angollatin-amerikai spanyoleurópai spanyolspanyol (mexik" + - "ói)kanadai franciasvájci franciaalsószászflamandbrazíliai portugáleuróp" + - "ai portugálmoldvaiszerbhorvátkongói szuahéliegyszerűsített kínaihagyomán" + - "yos kínai" - -var huLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000a, 0x0013, 0x001c, 0x0020, 0x0026, 0x002f, - 0x0033, 0x003b, 0x003f, 0x0045, 0x0053, 0x005a, 0x0062, 0x0069, - 0x0070, 0x0077, 0x007d, 0x0083, 0x0089, 0x0091, 0x0099, 0x00a0, - 0x00a8, 0x00b0, 0x00b4, 0x00b8, 0x00c7, 0x00cd, 0x00d3, 0x00d7, - 0x00dd, 0x00e3, 0x00ea, 0x00ed, 0x00f4, 0x00f9, 0x0104, 0x010b, - 0x0110, 0x0115, 0x011b, 0x0121, 0x0125, 0x012b, 0x0133, 0x013a, - 0x0147, 0x014a, 0x0158, 0x015f, 0x0166, 0x0171, 0x017c, 0x0182, - 0x0188, 0x018d, 0x0196, 0x019d, 0x01a8, 0x01ae, 0x01b6, 0x01bc, - // Entry 40 - 7F - 0x01c7, 0x01cf, 0x01da, 0x01df, 0x01eb, 0x01f2, 0x01f6, 0x01fd, - 0x0202, 0x020b, 0x0211, 0x0217, 0x021c, 0x0221, 0x0227, 0x022f, - 0x0234, 0x023e, 0x0243, 0x024a, 0x0250, 0x0256, 0x025e, 0x0262, - 0x0266, 0x026b, 0x0271, 0x0276, 0x0280, 0x0285, 0x028d, 0x0294, - 0x0297, 0x029e, 0x02aa, 0x02ae, 0x02b4, 0x02bd, 0x02c2, 0x02ca, - 0x02d4, 0x02da, 0x02e2, 0x02e8, 0x02ef, 0x02f5, 0x02fb, 0x030a, - 0x0311, 0x0317, 0x031e, 0x032f, 0x0340, 0x034d, 0x0354, 0x035c, - 0x0365, 0x036b, 0x0370, 0x0374, 0x037a, 0x0384, 0x0388, 0x038f, - // Entry 80 - BF - 0x0394, 0x039d, 0x03a3, 0x03ae, 0x03b5, 0x03bb, 0x03c0, 0x03cb, - 0x03d5, 0x03e0, 0x03e7, 0x03f5, 0x03fc, 0x0406, 0x040e, 0x0416, - 0x041d, 0x0421, 0x0429, 0x042f, 0x0434, 0x043d, 0x044c, 0x0456, - 0x045b, 0x0464, 0x0469, 0x046f, 0x0476, 0x047a, 0x0482, 0x048b, - 0x0495, 0x049b, 0x04a2, 0x04a7, 0x04ad, 0x04b3, 0x04b8, 0x04be, - 0x04c2, 0x04c9, 0x04ce, 0x04d6, 0x04de, 0x04e4, 0x04e9, 0x04ef, - 0x04f5, 0x04fb, 0x0501, 0x0507, 0x050b, 0x0513, 0x0518, 0x051f, - 0x0525, 0x0525, 0x052d, 0x0531, 0x0535, 0x053b, 0x053b, 0x0540, - // Entry C0 - FF - 0x0540, 0x054b, 0x0552, 0x0558, 0x055e, 0x0565, 0x0565, 0x056c, - 0x056c, 0x056c, 0x0572, 0x0572, 0x0572, 0x0575, 0x0575, 0x057c, - 0x057c, 0x0582, 0x0589, 0x0591, 0x0591, 0x0596, 0x059b, 0x059b, - 0x05a1, 0x05a7, 0x05ac, 0x05ac, 0x05b0, 0x05b5, 0x05b5, 0x05c4, - 0x05cd, 0x05d2, 0x05d6, 0x05d6, 0x05d9, 0x05e0, 0x05e0, 0x05e0, - 0x05e4, 0x05e4, 0x05e8, 0x05ed, 0x05f4, 0x05fc, 0x0600, 0x0604, - 0x060b, 0x0610, 0x0615, 0x061b, 0x0621, 0x0629, 0x062d, 0x0634, - 0x063d, 0x0644, 0x0648, 0x0656, 0x065d, 0x0665, 0x066c, 0x0672, - // Entry 100 - 13F - 0x0686, 0x068a, 0x068a, 0x0697, 0x06ae, 0x06b3, 0x06b9, 0x06bf, - 0x06c4, 0x06cc, 0x06d2, 0x06d8, 0x06dd, 0x06e2, 0x06e7, 0x06f2, - 0x06f2, 0x06f7, 0x0706, 0x0710, 0x0715, 0x071b, 0x071f, 0x0723, - 0x0723, 0x072e, 0x0736, 0x073c, 0x0749, 0x0749, 0x074f, 0x074f, - 0x0753, 0x075e, 0x075e, 0x0761, 0x0761, 0x0770, 0x0779, 0x0779, - 0x0786, 0x0792, 0x0798, 0x079a, 0x07a0, 0x07aa, 0x07ae, 0x07b3, - 0x07b3, 0x07b7, 0x07c0, 0x07c0, 0x07d5, 0x07e4, 0x07e4, 0x07e9, - 0x07f2, 0x07f6, 0x07fc, 0x0805, 0x0813, 0x0813, 0x0813, 0x0819, - // Entry 140 - 17F - 0x0820, 0x0825, 0x0831, 0x0837, 0x0837, 0x083e, 0x0845, 0x084a, - 0x0856, 0x0862, 0x0866, 0x086a, 0x0870, 0x0876, 0x087b, 0x087b, - 0x087b, 0x0881, 0x0887, 0x088e, 0x089b, 0x08a6, 0x08a6, 0x08b1, - 0x08b7, 0x08bd, 0x08c0, 0x08c5, 0x08c9, 0x08d0, 0x08d7, 0x08db, - 0x08e2, 0x08ee, 0x08ee, 0x08f2, 0x08f2, 0x08f7, 0x08ff, 0x090b, - 0x090b, 0x090b, 0x0910, 0x091a, 0x0922, 0x092f, 0x0936, 0x093c, - 0x0942, 0x0953, 0x0953, 0x0953, 0x095a, 0x095f, 0x0966, 0x096b, - 0x0972, 0x0978, 0x097f, 0x0985, 0x098a, 0x0990, 0x0995, 0x0999, - // Entry 180 - 1BF - 0x0999, 0x0999, 0x0999, 0x099f, 0x099f, 0x09a5, 0x09a9, 0x09b5, - 0x09b5, 0x09bf, 0x09c6, 0x09cb, 0x09ce, 0x09d4, 0x09d9, 0x09d9, - 0x09d9, 0x09e0, 0x09e4, 0x09ea, 0x09f2, 0x09fa, 0x0a03, 0x0a08, - 0x0a0c, 0x0a13, 0x0a19, 0x0a1e, 0x0a22, 0x0a32, 0x0a3d, 0x0a48, - 0x0a4f, 0x0a55, 0x0a60, 0x0a67, 0x0a6f, 0x0a75, 0x0a7a, 0x0a7a, - 0x0a81, 0x0a96, 0x0a9b, 0x0aa4, 0x0aad, 0x0aad, 0x0ab2, 0x0aba, - 0x0ac7, 0x0ad5, 0x0add, 0x0ae1, 0x0aec, 0x0af2, 0x0af6, 0x0afb, - 0x0afb, 0x0b01, 0x0b0a, 0x0b0f, 0x0b1b, 0x0b1b, 0x0b22, 0x0b33, - // Entry 1C0 - 1FF - 0x0b37, 0x0b48, 0x0b51, 0x0b59, 0x0b5f, 0x0b64, 0x0b69, 0x0b79, - 0x0b84, 0x0b8b, 0x0b94, 0x0b9e, 0x0ba4, 0x0ba4, 0x0bb4, 0x0bb4, - 0x0bb4, 0x0bbc, 0x0bbc, 0x0bc5, 0x0bc5, 0x0bc5, 0x0bcc, 0x0bd2, - 0x0bde, 0x0be3, 0x0be3, 0x0bf0, 0x0bf7, 0x0c01, 0x0c01, 0x0c01, - 0x0c06, 0x0c0a, 0x0c0a, 0x0c0a, 0x0c0a, 0x0c11, 0x0c14, 0x0c1c, - 0x0c21, 0x0c35, 0x0c3d, 0x0c42, 0x0c4b, 0x0c4b, 0x0c52, 0x0c58, - 0x0c62, 0x0c67, 0x0c67, 0x0c70, 0x0c77, 0x0c7c, 0x0c7c, 0x0c84, - 0x0c90, 0x0c95, 0x0c95, 0x0c9e, 0x0ca1, 0x0cac, 0x0cb4, 0x0cb4, - // Entry 200 - 23F - 0x0cb4, 0x0cc0, 0x0ccc, 0x0cd8, 0x0ce4, 0x0cec, 0x0cf3, 0x0d01, - 0x0d07, 0x0d0d, 0x0d0d, 0x0d14, 0x0d1a, 0x0d20, 0x0d27, 0x0d37, - 0x0d3c, 0x0d3c, 0x0d3c, 0x0d41, 0x0d47, 0x0d4e, 0x0d53, 0x0d59, - 0x0d5c, 0x0d64, 0x0d64, 0x0d6b, 0x0d72, 0x0d72, 0x0d79, 0x0d87, - 0x0d90, 0x0d90, 0x0d97, 0x0d97, 0x0da1, 0x0da1, 0x0da8, 0x0dae, - 0x0db5, 0x0dba, 0x0dd2, 0x0dd8, 0x0ddf, 0x0de6, 0x0dea, 0x0ded, - 0x0ded, 0x0ded, 0x0ded, 0x0ded, 0x0df4, 0x0df4, 0x0df9, 0x0dff, - 0x0e05, 0x0e0b, 0x0e10, 0x0e18, 0x0e21, 0x0e28, 0x0e28, 0x0e2d, - // Entry 240 - 27F - 0x0e31, 0x0e35, 0x0e3c, 0x0e41, 0x0e41, 0x0e48, 0x0e50, 0x0e65, - 0x0e65, 0x0e6b, 0x0e7e, 0x0e82, 0x0e9d, 0x0ea1, 0x0eb7, 0x0eb7, - 0x0ec6, 0x0ed7, 0x0ee6, 0x0ef3, 0x0efd, 0x0f0b, 0x0f21, 0x0f31, - 0x0f43, 0x0f43, 0x0f52, 0x0f61, 0x0f6c, 0x0f73, 0x0f87, 0x0f99, - 0x0fa0, 0x0fac, 0x0fbd, 0x0fd4, 0x0fe7, -} // Size: 1250 bytes - -const hyLangStr string = "" + // Size: 8542 bytes - "աֆարերենաբխազերենաֆրիկաանսաքանամհարերենարագոներենարաբերենասամերենավարերե" + - "նայմարաադրբեջաներենբաշկիրերենբելառուսերենբուլղարերենբիսլամաբամբարաբենգա" + - "լերենտիբեթերենբրետոներենբոսնիերենկատալաներենչեչեներենչամոռոկորսիկերենչե" + - "խերենեկեղեցական սլավոներենչուվաշերենուելսերենդանիերենգերմաներենմալդիվեր" + - "ենջոնգքհաէվեհունարենանգլերենէսպերանտոիսպաներենէստոներենբասկերենպարսկերե" + - "նֆուլահֆիններենֆիջիերենֆարյորերենֆրանսերենարևմտաֆրիզերենիռլանդերենգաելե" + - "րենգալիսերենգուարանիգուջարաթիմեներենհաուսաեբրայերենհինդիխորվաթերենխառնա" + - "կերտ հայիթերենհունգարերենհայերենհերերոինդոնեզերենիգբոսիչուանիդոիսլանդեր" + - "ենիտալերենինուկտիտուտճապոներենճավայերենվրացերենկիկույուկուանյամաղազախեր" + - "ենկալաալիսուտքմերերենկաննադակորեերենկանուրիքաշմիրերենքրդերենկոմիերենկոռ" + - "ներենղրղզերենլատիներենլյուքսեմբուրգերենգանդալիմբուրգերենլինգալալաոսերեն" + - "լիտվերենլուբա-կատանգալատվիերենմալգաշերենմարշալերենմաորիմակեդոներենմալայ" + - "ալամմոնղոլերենմարաթիմալայերենմալթայերենբիրմայերեննաուրուհյուսիսային նդե" + - "բելենեպալերեննդոնգահոլանդերեննորվեգերեն նյունորսկնորվեգերեն բուկմոլհարա" + - "վային նդեբելենավախոնյանջաօքսիտաներենօջիբվաօրոմոօրիյաօսերենփենջաբերենպալ" + - "իլեհերենփուշթուպորտուգալերենկեչուառոմանշերենռունդիռումիներենռուսերենկին" + - "յառուանդասանսկրիտսարդիներենսինդհիհյուսիսային սաամիսանգոսինհալերենսլովակ" + - "երենսլովեներենշոնասոմալիերենալբաներենսերբերենսվազերենհարավային սոթոսուն" + - "դաներենշվեդերենսուահիլիթամիլերենթելուգուտաջիկերենթայերենտիգրինյաթուրքմե" + - "ներենցվանատոնգերենթուրքերենցոնգաթաթարերենթաիտերենույղուրերենուկրաիներեն" + - "ուրդուուզբեկերենվենդավիետնամերենվոլապյուկվալոներենվոլոֆքոսաիդիշյորուբաժ" + - "ուանգչինարենզուլուերենաչեհերենաչոլիադանգմերենադիղերենթունիսական արաբերե" + - "նաղեմայներենաքքադերենալեութերենհարավային ալթայերենհին անգլերենանգիկաարա" + - "մեերենմապուչիարապահոալժիրական արաբերենեգիպտական արաբերենասուամերիկյան ժ" + - "եստերի լեզուաստուրերենավադհիբալիերենբասաաբեմբաբենաարևմտաբելուջիերենբինի" + - "սիկսիկաբոդոաքուզբուգիերենբիլինկաբուաներենչիգատրուկերենմարիչոկտոչերոկիշա" + - "յենսորանի քրդերենղպտերենղրիմյան թուրքերենդակոտադարգիներենթաիթադոգրիբզար" + - "մաստորին սորբերենդուալաջոլա-ֆոնյիդազագաէմբուէֆիկհին եգիպտերենէկաջուկէվո" + - "նդոֆիլիպիներենտորնադելեն ֆիններենֆոնհին ֆրանսերենարևելաֆրիզերենֆրիուլիե" + - "րենգայերենգագաուզերենզրադաշտական դարիգեեզկիրիբատիհին վերին գերմաներենգո" + - "րոնտալոգոթերենհին հունարենշվեյցարական գերմաներենվայուուգուսիգվիչինհավայ" + - "իերենհիլիգայնոնհմոնգվերին սորբերենսյան չինարենհուպաիբաներենիբիբիոիլոկեր" + - "ենինգուշերենլոժբաննգոմբամաշամեկաբիլերենկաչիներենջյուկամբատիապմակոնդեկաբ" + - "ուվերդյանուկորոկխասիկոյրա չինիկակոկալենջինկիմբունդուպերմյակ կոմիերենկոն" + - "կանիկպելլեերենկարաչայ-բալկարերենկարելերենկուրուխշամբալաբաֆիաքյոլներենկո" + - "ւմիկերենլադինոլանգիլեզգիերենլակոտալոզիհյուսիսային լուրիերենլուբա-լուլու" + - "ալունդալուոմիզոլույամադուրերենմագահիմայթիլիմակասարերենմասաիմոկշայերենմե" + - "նդեմերումորիսյենմաքուա-մետտոմետամիկմակմինանգկաբաումանիպուրիմոհավքմոսսիա" + - "րևմտամարիերենմունդանգբազմալեզուկրիկմիրանդերենէրզյամազանդարաներեննեապոլե" + - "րեննամանեվարերեննիասերեննիուերենկվասիոնգիեմբուննոգայերենհին նորվեգերենն" + - "կոհյուսիսային սոթոնուերնյանկոլեօսեյջօսմաներենպանգասինաներենպահլավերենպա" + - "մպանգաերենպապյամենտուպալաուերենպիկարդերենփենսիլվանական գերմաներենպլատագ" + - "երմաներենհին պարսկերենպալատինյան գերմաներենփյունիկերենպիեմոնտերենպոնտեր" + - "ենպոնպեերենպրուսերենհին պրովանսերենքիչեռաջաստաներենռապանուիռարոտոնգաներ" + - "ենռոմանիոլերենռիֆերենռոմբոռոմաներենռոտումանռուսիներենռովիանաարոմաներենռ" + - "վասանդավեյակուտերենսամբուրուսանտալինգամբայսանգուսիցիլիերենշոտլանդերենհա" + - "րավային քրդերենսենակոյրաբորո սեննիհին իռլանդերենտաշելհիթշաներենհարավայի" + - "ն սաամերենլուլե սաամիինարի սաամերենսկոլտ սաամերենսոնինկեսրանան տոնգոսահ" + - "ոերենսուկումակոմորերենասորերենտուլուտեմնետեսոտերենոտետումտիգրետիվերենտո" + - "կելաուցախուրկլինգոնտլինգիտթալիշերենտամաշեկտոկ փիսինտուրոյոտարոկոցակոներ" + - "ենցիմշյանտումբուկաթուվալուերենտասավաքտուվերենկենտրոնատլասյան թամազիղտու" + - "դմուրտերենուգարիտերենումբունդուռուտերենվաիվենետերենվեպսերենարևմտաֆլաման" + - "դերենվոդերենվորովունջովալսերենվոլայտավարայերենվաշովարլպիրիվու չինարենկա" + - "լմիկերենսոգայաոյափերենյանգբենեմբականտոներենսապոտեկերենզեյլանդերենզենագա" + - "ընդհանուր մարոկյան թամազիղտզունիերենառանց լեզվային բովանդակությանզազաեր" + - "ենարդի ընդհանուր արաբերենավստրիական գերմաներենշվեյցարական վերին գերմանե" + - "րենավստրալիական անգլերենկանադական անգլերենբրիտանական անգլերենամերիկյան " + - "անգլերենլատինամերիկյան իսպաներենեվրոպական իսպաներենմեքսիկական իսպաներեն" + - "կանադական ֆրանսերենշվեյցարական ֆրանսերենստորին սաքսոներենֆլամանդերենբրա" + - "զիլական պորտուգալերենեվրոպական պորտուգալերենմոլդովերենսերբա-խորվաթերենկ" + - "ոնգոյի սուահիլիպարզեցված չինարենավանդական չինարեն" - -var hyLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0022, 0x0022, 0x0034, 0x003c, 0x004e, 0x0062, - 0x0072, 0x0082, 0x0092, 0x009e, 0x00b6, 0x00ca, 0x00e2, 0x00f8, - 0x0106, 0x0114, 0x0128, 0x013a, 0x014e, 0x0160, 0x0176, 0x0188, - 0x0194, 0x01a8, 0x01a8, 0x01b6, 0x01df, 0x01f3, 0x0205, 0x0215, - 0x0229, 0x023d, 0x024b, 0x0251, 0x0261, 0x0271, 0x0283, 0x0295, - 0x02a7, 0x02b7, 0x02c9, 0x02d5, 0x02e5, 0x02f5, 0x0309, 0x031b, - 0x0337, 0x034b, 0x035b, 0x036d, 0x037d, 0x038f, 0x039d, 0x03a9, - 0x03bb, 0x03c5, 0x03c5, 0x03d9, 0x03fe, 0x0414, 0x0422, 0x042e, - // Entry 40 - 7F - 0x042e, 0x0444, 0x0444, 0x044c, 0x045a, 0x045a, 0x0460, 0x0474, - 0x0484, 0x049a, 0x04ac, 0x04be, 0x04ce, 0x04ce, 0x04de, 0x04f0, - 0x0502, 0x0518, 0x0528, 0x0536, 0x0546, 0x0554, 0x0568, 0x0576, - 0x0586, 0x0596, 0x05a6, 0x05b8, 0x05da, 0x05e4, 0x05fc, 0x060a, - 0x061a, 0x062a, 0x0643, 0x0655, 0x0669, 0x067d, 0x0687, 0x069d, - 0x06af, 0x06c3, 0x06cf, 0x06e1, 0x06f5, 0x0709, 0x0717, 0x073c, - 0x074e, 0x075a, 0x076e, 0x0795, 0x07b8, 0x07d9, 0x07e5, 0x07f1, - 0x0807, 0x0813, 0x081d, 0x0827, 0x0833, 0x0847, 0x084f, 0x085d, - // Entry 80 - BF - 0x086b, 0x0885, 0x0891, 0x08a5, 0x08b1, 0x08c5, 0x08d5, 0x08ed, - 0x08fd, 0x0911, 0x091d, 0x093e, 0x0948, 0x095c, 0x0970, 0x0984, - 0x0984, 0x098c, 0x09a0, 0x09b2, 0x09c2, 0x09d2, 0x09ed, 0x0a03, - 0x0a13, 0x0a23, 0x0a35, 0x0a45, 0x0a57, 0x0a65, 0x0a75, 0x0a8d, - 0x0a97, 0x0aa7, 0x0ab9, 0x0ac3, 0x0ad5, 0x0ae5, 0x0afb, 0x0b11, - 0x0b1d, 0x0b31, 0x0b3b, 0x0b51, 0x0b63, 0x0b75, 0x0b7f, 0x0b87, - 0x0b8f, 0x0b9d, 0x0ba9, 0x0bb7, 0x0bcb, 0x0bdb, 0x0be5, 0x0bf9, - 0x0c09, 0x0c2e, 0x0c2e, 0x0c36, 0x0c44, 0x0c56, 0x0c56, 0x0c6a, - // Entry C0 - FF - 0x0c6a, 0x0c8f, 0x0ca6, 0x0cb2, 0x0cc4, 0x0cd2, 0x0cd2, 0x0ce0, - 0x0d03, 0x0d03, 0x0d03, 0x0d03, 0x0d26, 0x0d2e, 0x0d5a, 0x0d6e, - 0x0d6e, 0x0d7a, 0x0d7a, 0x0d8a, 0x0d8a, 0x0d94, 0x0d94, 0x0d94, - 0x0d94, 0x0d94, 0x0d9e, 0x0d9e, 0x0da6, 0x0da6, 0x0da6, 0x0dc8, - 0x0dc8, 0x0dc8, 0x0dd0, 0x0dd0, 0x0dd0, 0x0dde, 0x0dde, 0x0dde, - 0x0dde, 0x0dde, 0x0de6, 0x0df0, 0x0df0, 0x0e02, 0x0e02, 0x0e0c, - 0x0e0c, 0x0e0c, 0x0e0c, 0x0e0c, 0x0e0c, 0x0e22, 0x0e2a, 0x0e2a, - 0x0e2a, 0x0e3c, 0x0e44, 0x0e44, 0x0e4e, 0x0e4e, 0x0e5a, 0x0e64, - // Entry 100 - 13F - 0x0e7f, 0x0e8d, 0x0e8d, 0x0eae, 0x0eae, 0x0eae, 0x0eba, 0x0ece, - 0x0ed8, 0x0ed8, 0x0ed8, 0x0ee4, 0x0ee4, 0x0eee, 0x0eee, 0x0f0b, - 0x0f0b, 0x0f17, 0x0f17, 0x0f2a, 0x0f2a, 0x0f36, 0x0f40, 0x0f48, - 0x0f48, 0x0f61, 0x0f6f, 0x0f6f, 0x0f6f, 0x0f6f, 0x0f7b, 0x0f7b, - 0x0f7b, 0x0f91, 0x0fb6, 0x0fbc, 0x0fbc, 0x0fbc, 0x0fd5, 0x0fd5, - 0x0fd5, 0x0ff1, 0x1007, 0x1015, 0x102b, 0x102b, 0x102b, 0x102b, - 0x104a, 0x1052, 0x1062, 0x1062, 0x1062, 0x1088, 0x1088, 0x1088, - 0x109a, 0x10a8, 0x10a8, 0x10bf, 0x10ea, 0x10f8, 0x10f8, 0x1102, - // Entry 140 - 17F - 0x110e, 0x110e, 0x110e, 0x1122, 0x1122, 0x1136, 0x1136, 0x1140, - 0x115b, 0x1172, 0x117c, 0x118c, 0x1198, 0x11a8, 0x11bc, 0x11bc, - 0x11bc, 0x11c8, 0x11d4, 0x11e0, 0x11e0, 0x11e0, 0x11e0, 0x11e0, - 0x11f2, 0x1204, 0x120c, 0x1216, 0x1216, 0x1216, 0x1216, 0x121e, - 0x122c, 0x1248, 0x1248, 0x1250, 0x1250, 0x125a, 0x125a, 0x126d, - 0x126d, 0x126d, 0x1275, 0x1285, 0x1299, 0x12b8, 0x12c6, 0x12c6, - 0x12da, 0x12fd, 0x12fd, 0x12fd, 0x130f, 0x131d, 0x132b, 0x1335, - 0x1347, 0x135b, 0x135b, 0x1367, 0x1371, 0x1371, 0x1371, 0x1383, - // Entry 180 - 1BF - 0x1383, 0x1383, 0x1383, 0x138f, 0x138f, 0x138f, 0x1397, 0x13c0, - 0x13c0, 0x13d9, 0x13d9, 0x13e5, 0x13ed, 0x13f5, 0x13ff, 0x13ff, - 0x13ff, 0x1413, 0x1413, 0x141f, 0x142d, 0x1443, 0x1443, 0x144d, - 0x144d, 0x1461, 0x1461, 0x146b, 0x1475, 0x1485, 0x1485, 0x149c, - 0x14a4, 0x14b0, 0x14c8, 0x14c8, 0x14da, 0x14e6, 0x14f0, 0x150c, - 0x151c, 0x1530, 0x1538, 0x154c, 0x154c, 0x154c, 0x154c, 0x1556, - 0x1572, 0x1572, 0x1586, 0x158e, 0x158e, 0x15a0, 0x15b0, 0x15c0, - 0x15c0, 0x15cc, 0x15de, 0x15f0, 0x160b, 0x160b, 0x1611, 0x1630, - // Entry 1C0 - 1FF - 0x163a, 0x163a, 0x163a, 0x164a, 0x164a, 0x164a, 0x1654, 0x1666, - 0x1682, 0x1696, 0x16ae, 0x16c4, 0x16d8, 0x16ec, 0x16ec, 0x171b, - 0x1739, 0x1752, 0x177b, 0x1791, 0x17a7, 0x17b7, 0x17c9, 0x17db, - 0x17f8, 0x1800, 0x1800, 0x1818, 0x1828, 0x1844, 0x185c, 0x186a, - 0x1874, 0x1886, 0x1896, 0x18aa, 0x18b8, 0x18cc, 0x18d2, 0x18e0, - 0x18f4, 0x18f4, 0x1906, 0x1906, 0x1914, 0x1914, 0x1922, 0x192e, - 0x1942, 0x1958, 0x1958, 0x1979, 0x1979, 0x1981, 0x1981, 0x1981, - 0x199e, 0x19b9, 0x19b9, 0x19c9, 0x19d7, 0x19d7, 0x19d7, 0x19d7, - // Entry 200 - 23F - 0x19d7, 0x19fa, 0x1a0f, 0x1a2a, 0x1a45, 0x1a53, 0x1a53, 0x1a6a, - 0x1a6a, 0x1a7a, 0x1a7a, 0x1a8a, 0x1a8a, 0x1a8a, 0x1a9c, 0x1a9c, - 0x1aac, 0x1aac, 0x1ab8, 0x1ac2, 0x1aca, 0x1ad6, 0x1ae2, 0x1aec, - 0x1afa, 0x1b0a, 0x1b16, 0x1b24, 0x1b32, 0x1b44, 0x1b52, 0x1b52, - 0x1b63, 0x1b71, 0x1b7d, 0x1b8f, 0x1b9d, 0x1b9d, 0x1baf, 0x1bc7, - 0x1bd5, 0x1be5, 0x1c14, 0x1c2c, 0x1c42, 0x1c56, 0x1c66, 0x1c6c, - 0x1c7e, 0x1c8e, 0x1cb0, 0x1cb0, 0x1cbe, 0x1cc6, 0x1cd2, 0x1ce2, - 0x1cf0, 0x1d02, 0x1d0a, 0x1d1a, 0x1d2f, 0x1d43, 0x1d43, 0x1d4b, - // Entry 240 - 27F - 0x1d51, 0x1d5f, 0x1d6d, 0x1d75, 0x1d75, 0x1d89, 0x1d9f, 0x1d9f, - 0x1db5, 0x1dc1, 0x1df5, 0x1e07, 0x1e3f, 0x1e4f, 0x1e7b, 0x1e7b, - 0x1ea4, 0x1eda, 0x1f03, 0x1f26, 0x1f4b, 0x1f6e, 0x1f9d, 0x1fc2, - 0x1fe9, 0x1fe9, 0x200e, 0x2037, 0x2058, 0x206e, 0x209d, 0x20ca, - 0x20de, 0x20fd, 0x211c, 0x213d, 0x215e, -} // Size: 1250 bytes - -const idLangStr string = "" + // Size: 3994 bytes - "AfarAbkhazAvestaAfrikaansAkanAmharikAragonArabAssamAvarAymaraAzerbaijani" + - "BashkirBelarusiaBulgariaBislamaBambaraBengaliTibetBretonBosniaKatalanChe" + - "chenChamorroKorsikaKreeCheskaBahasa Gereja SlavoniaChuvashWelshDanskJerm" + - "anDivehiDzongkhaEweYunaniInggrisEsperantoSpanyolEstiBasquePersiaFulaSuom" + - "iFijiFaroePrancisFrisia BaratIrlandiaGaelik SkotlandiaGalisiaGuaraniGuja" + - "ratManxHausaIbraniHindiHiri MotuKroasiaKreol HaitiHungariaArmeniaHereroI" + - "nterlinguaIndonesiaInterlingueIgboSichuan YiInupiakIdoIslandiaItaliaInuk" + - "titutJepangJawaGeorgiaKongoKikuyuKuanyamaKazakhKalaallisutKhmerKannadaKo" + - "reaKanuriKashmirKurdiKomiKornishKirgizLatinLuksemburgGandaLimburgiaLinga" + - "laLaoLituaviLuba-KatangaLatviMalagasiMarshallMaoriMakedoniaMalayalamMong" + - "oliaMarathiMelayuMaltaBurmaNauruNdebele UtaraNepaliNdongaBelandaNynorsk " + - "NorwegiaBokmål NorwegiaNdebele SelatanNavajoNyanjaOsitaniaOjibwaOromoOri" + - "yaOssetiaPunjabiPaliPolskiPashtoPortugisQuechuaReto-RomanRundiRumaniaRus" + - "iaKinyarwandaSanskertaSardiniaSindhiSami UtaraSangoSinhalaSlovakSlovenSa" + - "moaShonaSomaliAlbaniaSerbSwatiSotho SelatanSundaSwediaSwahiliTamilTelugu" + - "TajikThaiTigrinyaTurkmenTswanaTongaTurkiTsongaTatarTahitiUyghurUkrainaUr" + - "duUzbekVendaVietnamVolapukWalloonWolofXhosaYiddishYorubaZhuangTionghoaZu" + - "luAcehAcoliAdangmeAdygeiArab TunisiaAfrihiliAghemAinuAkkadiaAlabamaAleut" + - "Altai SelatanInggris KunoAngikaAramMapucheArapahoArab AljazairArawakArab" + - " MarokoArab MesirAsuBahasa Isyarat AmerikaAsturiaAwadhiBaluchiBaliBavari" + - "aBasaBamunBatak TobaGhomalaBejaBembaBetawiBenaBafutBalochi BaratBhojpuri" + - "BikolBiniBanjarKomSiksikaBrajBodoAkooseBuriatBugisBuluBlinMedumbaKadoKar" + - "ibCayugaAtsamCebuanoKigaChibchaChagataiChuukeMariJargon ChinookKoktawChi" + - "pewyanCherokeeCheyenneKurdi SoraniKoptikTatar KrimeaSeselwa Kreol Pranci" + - "sKashubiaDakotaDargwaTaitaDelawareSlaveDogribDinkaZarmaDogriSorbia Renda" + - "hDualaBelanda Abad PertengahanJola-FonyiDyulaDazagaEmbuEfikMesir KunoEka" + - "jukElamInggris Abad PertengahanEwondoFangFilipinoFonPrancis Abad Perteng" + - "ahanPrancis KunoArpitanFrisia UtaraFrisia TimurFriuliGaGagauzGayoGbayaGe" + - "ezGilbertGilakiJerman Abad PertengahanJerman KunoGondiGorontaloGotikGreb" + - "oYunani KunoJerman (Swiss)GusiiGwich’inHaidaHawaiiHindi FijiHiligaynonHi" + - "titHmongSorbia AtasHupaIbanIbibioIlokoIngushetiaLojbanNgombaMachameIbran" + - "i-PersiaIbrani-ArabKara-KalpakKabyleKachinJjuKambaKawiKabardiKanembuTyap" + - "MakondeKabuverdianuKenyangKoroKhasiKhotanKoyra ChiiniKakoKalenjinKimbund" + - "uKomi-PermyakKonkaniKosreKpelleKarachai BalkarKrioKareliaKurukShambalaBa" + - "fiaDialek KolschKumykKutenaiLadinoLangiLahndaLambaLezghiaLiguriaLakotaMo" + - "ngoLoziLuri UtaraLuba-LuluaLuisenoLundaLuoMizoLuyiaLazMaduraMafaMagahiMa" + - "ithiliMakasarMandingoMasaiMabaMokshaMandarMendeMeruMorisienIrlandia Abad" + - " PertengahanMakhuwa-MeettoMeta’MikmakMinangkabauManchuriaManipuriMohawkM" + - "ossiMundangBeberapa BahasaBahasa MuskogeeMirandaMarwariMentawaiMyeneEryz" + - "aMazanderaniNeapolitanNamaJerman RendahNewariNiasNiueaKwasioNgiemboonNog" + - "aiNorse KunoN’KoSotho UtaraNuerNewari KlasikNyamweziNyankoleNyoroNzimaOs" + - "ageTurki OsmaniPangasinaPahleviPampangaPapiamentoPalauPidgin NigeriaJerm" + - "an PennsylvaniaPersia KunoFunisiaPohnpeiaPrusiaProvencal LamaKʼicheʼRaja" + - "sthaniRapanuiRarotongaRomboRomaniRotumaAromaniaRwaSandaweSakhaAram Samar" + - "iaSamburuSasakSantaliNgambaiSanguSisiliaSkotlandiaKurdi SelatanSenecaSen" + - "aSeriSelkupKoyraboro SenniIrlandia KunoTachelhitShanArab SuwaSidamoSiles" + - "ia RendahSelayarSami SelatanLule SamiInari SamiSkolt SamiSoninkeSogdienS" + - "ranan TongoSererSahoSukumaSusuSumeriaKomoriaSuriah KlasikSuriahSilesiaTu" + - "luTimneTesoTerenoTetunTigreTivTokelauKlingonTlingitTamashekNyasa TongaTo" + - "k PisinTuroyoTarokoTsimshiaTat MuslimTumbukaTuvaluTasawaqTuviniaTamazigh" + - "t Maroko TengahUdmurtUgaritUmbunduRootVaiVenesiaVotiaVunjoWalserWalamoWa" + - "raiWashoWarlpiriKalmukSogaYaoYapoisYangbenYembaKantonZapotekBlissymbolZe" + - "nagaTamazight Maroko StandarZuniTidak ada konten linguistikZazaArab Stan" + - "dar ModernJerman Tinggi (Swiss)Inggris (Inggris)Spanyol (Eropa)Portugis " + - "(Eropa)MoldaviaSerbo-KroasiaKongo SwahiliTionghoa (Aksara Sederhana)Tion" + - "ghoa (Aksara Tradisional)" - -var idLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000a, 0x0010, 0x0019, 0x001d, 0x0024, 0x002a, - 0x002e, 0x0033, 0x0037, 0x003d, 0x0048, 0x004f, 0x0058, 0x0060, - 0x0067, 0x006e, 0x0075, 0x007a, 0x0080, 0x0086, 0x008d, 0x0094, - 0x009c, 0x00a3, 0x00a7, 0x00ad, 0x00c3, 0x00ca, 0x00cf, 0x00d4, - 0x00da, 0x00e0, 0x00e8, 0x00eb, 0x00f1, 0x00f8, 0x0101, 0x0108, - 0x010c, 0x0112, 0x0118, 0x011c, 0x0121, 0x0125, 0x012a, 0x0131, - 0x013d, 0x0145, 0x0156, 0x015d, 0x0164, 0x016b, 0x016f, 0x0174, - 0x017a, 0x017f, 0x0188, 0x018f, 0x019a, 0x01a2, 0x01a9, 0x01af, - // Entry 40 - 7F - 0x01ba, 0x01c3, 0x01ce, 0x01d2, 0x01dc, 0x01e3, 0x01e6, 0x01ee, - 0x01f4, 0x01fd, 0x0203, 0x0207, 0x020e, 0x0213, 0x0219, 0x0221, - 0x0227, 0x0232, 0x0237, 0x023e, 0x0243, 0x0249, 0x0250, 0x0255, - 0x0259, 0x0260, 0x0266, 0x026b, 0x0275, 0x027a, 0x0283, 0x028a, - 0x028d, 0x0294, 0x02a0, 0x02a5, 0x02ad, 0x02b5, 0x02ba, 0x02c3, - 0x02cc, 0x02d4, 0x02db, 0x02e1, 0x02e6, 0x02eb, 0x02f0, 0x02fd, - 0x0303, 0x0309, 0x0310, 0x0320, 0x0330, 0x033f, 0x0345, 0x034b, - 0x0353, 0x0359, 0x035e, 0x0363, 0x036a, 0x0371, 0x0375, 0x037b, - // Entry 80 - BF - 0x0381, 0x0389, 0x0390, 0x039a, 0x039f, 0x03a6, 0x03ab, 0x03b6, - 0x03bf, 0x03c7, 0x03cd, 0x03d7, 0x03dc, 0x03e3, 0x03e9, 0x03ef, - 0x03f4, 0x03f9, 0x03ff, 0x0406, 0x040a, 0x040f, 0x041c, 0x0421, - 0x0427, 0x042e, 0x0433, 0x0439, 0x043e, 0x0442, 0x044a, 0x0451, - 0x0457, 0x045c, 0x0461, 0x0467, 0x046c, 0x0472, 0x0478, 0x047f, - 0x0483, 0x0488, 0x048d, 0x0494, 0x049b, 0x04a2, 0x04a7, 0x04ac, - 0x04b3, 0x04b9, 0x04bf, 0x04c7, 0x04cb, 0x04cf, 0x04d4, 0x04db, - 0x04e1, 0x04ed, 0x04f5, 0x04fa, 0x04fe, 0x0505, 0x050c, 0x0511, - // Entry C0 - FF - 0x0511, 0x051e, 0x052a, 0x0530, 0x0534, 0x053b, 0x053b, 0x0542, - 0x054f, 0x054f, 0x0555, 0x0560, 0x056a, 0x056d, 0x0583, 0x058a, - 0x058a, 0x0590, 0x0597, 0x059b, 0x05a2, 0x05a6, 0x05ab, 0x05b5, - 0x05bc, 0x05c0, 0x05c5, 0x05cb, 0x05cf, 0x05d4, 0x05d4, 0x05e1, - 0x05e9, 0x05ee, 0x05f2, 0x05f8, 0x05fb, 0x0602, 0x0602, 0x0602, - 0x0606, 0x0606, 0x060a, 0x0610, 0x0616, 0x061b, 0x061f, 0x0623, - 0x062a, 0x062e, 0x0633, 0x0639, 0x063e, 0x0645, 0x0649, 0x0650, - 0x0658, 0x065e, 0x0662, 0x0670, 0x0676, 0x067f, 0x0687, 0x068f, - // Entry 100 - 13F - 0x069b, 0x06a1, 0x06a1, 0x06ad, 0x06c2, 0x06ca, 0x06d0, 0x06d6, - 0x06db, 0x06e3, 0x06e8, 0x06ee, 0x06f3, 0x06f8, 0x06fd, 0x070a, - 0x070a, 0x070f, 0x0727, 0x0731, 0x0736, 0x073c, 0x0740, 0x0744, - 0x0744, 0x074e, 0x0754, 0x0758, 0x0770, 0x0770, 0x0776, 0x0776, - 0x077a, 0x0782, 0x0782, 0x0785, 0x0785, 0x079d, 0x07a9, 0x07b0, - 0x07bc, 0x07c8, 0x07ce, 0x07d0, 0x07d6, 0x07d6, 0x07da, 0x07df, - 0x07df, 0x07e3, 0x07ea, 0x07f0, 0x0807, 0x0812, 0x0812, 0x0817, - 0x0820, 0x0825, 0x082a, 0x0835, 0x0843, 0x0843, 0x0843, 0x0848, - // Entry 140 - 17F - 0x0852, 0x0857, 0x0857, 0x085d, 0x0867, 0x0871, 0x0876, 0x087b, - 0x0886, 0x0886, 0x088a, 0x088e, 0x0894, 0x0899, 0x08a3, 0x08a3, - 0x08a3, 0x08a9, 0x08af, 0x08b6, 0x08c3, 0x08ce, 0x08ce, 0x08d9, - 0x08df, 0x08e5, 0x08e8, 0x08ed, 0x08f1, 0x08f8, 0x08ff, 0x0903, - 0x090a, 0x0916, 0x091d, 0x0921, 0x0921, 0x0926, 0x092c, 0x0938, - 0x0938, 0x0938, 0x093c, 0x0944, 0x094c, 0x0958, 0x095f, 0x0964, - 0x096a, 0x0979, 0x097d, 0x097d, 0x0984, 0x0989, 0x0991, 0x0996, - 0x09a3, 0x09a8, 0x09af, 0x09b5, 0x09ba, 0x09c0, 0x09c5, 0x09cc, - // Entry 180 - 1BF - 0x09cc, 0x09d3, 0x09d3, 0x09d9, 0x09d9, 0x09de, 0x09e2, 0x09ec, - 0x09ec, 0x09f6, 0x09fd, 0x0a02, 0x0a05, 0x0a09, 0x0a0e, 0x0a0e, - 0x0a11, 0x0a17, 0x0a1b, 0x0a21, 0x0a29, 0x0a30, 0x0a38, 0x0a3d, - 0x0a41, 0x0a47, 0x0a4d, 0x0a52, 0x0a56, 0x0a5e, 0x0a77, 0x0a85, - 0x0a8c, 0x0a92, 0x0a9d, 0x0aa6, 0x0aae, 0x0ab4, 0x0ab9, 0x0ab9, - 0x0ac0, 0x0acf, 0x0ade, 0x0ae5, 0x0aec, 0x0af4, 0x0af9, 0x0afe, - 0x0b09, 0x0b09, 0x0b13, 0x0b17, 0x0b24, 0x0b2a, 0x0b2e, 0x0b33, - 0x0b33, 0x0b39, 0x0b42, 0x0b47, 0x0b51, 0x0b51, 0x0b57, 0x0b62, - // Entry 1C0 - 1FF - 0x0b66, 0x0b73, 0x0b7b, 0x0b83, 0x0b88, 0x0b8d, 0x0b92, 0x0b9e, - 0x0ba7, 0x0bae, 0x0bb6, 0x0bc0, 0x0bc5, 0x0bc5, 0x0bd3, 0x0be6, - 0x0be6, 0x0bf1, 0x0bf1, 0x0bf8, 0x0bf8, 0x0bf8, 0x0c00, 0x0c06, - 0x0c14, 0x0c1d, 0x0c1d, 0x0c27, 0x0c2e, 0x0c37, 0x0c37, 0x0c37, - 0x0c3c, 0x0c42, 0x0c48, 0x0c48, 0x0c48, 0x0c50, 0x0c53, 0x0c5a, - 0x0c5f, 0x0c6b, 0x0c72, 0x0c77, 0x0c7e, 0x0c7e, 0x0c85, 0x0c8a, - 0x0c91, 0x0c9b, 0x0c9b, 0x0ca8, 0x0cae, 0x0cb2, 0x0cb6, 0x0cbc, - 0x0ccb, 0x0cd8, 0x0cd8, 0x0ce1, 0x0ce5, 0x0cee, 0x0cf4, 0x0d02, - // Entry 200 - 23F - 0x0d09, 0x0d15, 0x0d1e, 0x0d28, 0x0d32, 0x0d39, 0x0d40, 0x0d4c, - 0x0d51, 0x0d55, 0x0d55, 0x0d5b, 0x0d5f, 0x0d66, 0x0d6d, 0x0d7a, - 0x0d80, 0x0d87, 0x0d8b, 0x0d90, 0x0d94, 0x0d9a, 0x0d9f, 0x0da4, - 0x0da7, 0x0dae, 0x0dae, 0x0db5, 0x0dbc, 0x0dbc, 0x0dc4, 0x0dcf, - 0x0dd8, 0x0dde, 0x0de4, 0x0de4, 0x0dec, 0x0df6, 0x0dfd, 0x0e03, - 0x0e0a, 0x0e11, 0x0e28, 0x0e2e, 0x0e34, 0x0e3b, 0x0e3f, 0x0e42, - 0x0e49, 0x0e49, 0x0e49, 0x0e49, 0x0e4e, 0x0e4e, 0x0e53, 0x0e59, - 0x0e5f, 0x0e64, 0x0e69, 0x0e71, 0x0e71, 0x0e77, 0x0e77, 0x0e7b, - // Entry 240 - 27F - 0x0e7e, 0x0e84, 0x0e8b, 0x0e90, 0x0e90, 0x0e96, 0x0e9d, 0x0ea7, - 0x0ea7, 0x0ead, 0x0ec5, 0x0ec9, 0x0ee4, 0x0ee8, 0x0efb, 0x0efb, - 0x0efb, 0x0f10, 0x0f10, 0x0f10, 0x0f21, 0x0f21, 0x0f21, 0x0f30, - 0x0f30, 0x0f30, 0x0f30, 0x0f30, 0x0f30, 0x0f30, 0x0f30, 0x0f40, - 0x0f48, 0x0f55, 0x0f62, 0x0f7d, 0x0f9a, -} // Size: 1250 bytes - -const isLangStr string = "" + // Size: 4605 bytes - "afárabkasískaavestískaafríkanskaakanamharískaaragonskaarabískaassamskaav" + - "arískaaímaraaserskabaskírhvítrússneskabúlgarskabíslamabambarabengalskatí" + - "beskabretónskabosnískakatalónskatsjetsjenskakamorrókorsískakrítékkneskak" + - "irkjuslavneskasjúvasvelskadanskaþýskadívehídsongkaewegrískaenskaesperant" + - "óspænskaeistneskabaskneskapersneskafúlafinnskafídjeyskafæreyskafranskav" + - "esturfrísneskaírskaskosk gelískagalíanskagvaranígújaratímanskahásahebres" + - "kahindíhírímótúkróatískahaítískaungverskaarmenskahereróalþjóðatungaindón" + - "esískainterlingveígbósísúanjíínúpíakídóíslenskaítalskainúktitútjapanskaj" + - "avanskageorgískakongóskakíkújúkúanjamakasakskagrænlenskakmerkannadakóres" + - "kakanúríkasmírskakúrdískakomískakornbreskakirgiskalatínalúxemborgískagan" + - "dalimbúrgískalingalalaólitháískalúbakatangalettneskamalagasískamarshalls" + - "kamaorímakedónskamalajalammongólskamaratímalaískamaltneskaburmneskanárús" + - "kanorður-ndebelenepalskandongahollenskanýnorskanorskt bókmálsuðurndebele" + - "navahónjanja; sísjeva; sjevaoksítanískaojibvaoromoóríaossetískapúnjabípa" + - "lípólskapastúportúgalskakvesjúarómanskarúndírúmenskarússneskakínjarvanda" + - "sanskrítsardínskasindínorðursamískasangósingalískaslóvakískaslóvenskasam" + - "óskashonasómalskaalbanskaserbneskasvatísuðursótósúndanskasænskasvahílít" + - "amílskatelúgútadsjikskataílenskatígrinjatúrkmenskatsúanatongverskatyrkne" + - "skatsongatatarskatahítískaúígúrúkraínskaúrdúúsbekskavendavíetnamskavolap" + - "ykvallónskavolofsósajiddískajórúbasúangkínverskasúlúakkískaacoliadangmea" + - "dýgeafríhílíaghemaínu (Japan)akkadískaaleúskasuðuraltaískafornenskaangík" + - "aarameískaarákanískaarapahóaravakskaasuastúrískaavadíbalúkíbalískabasaba" + - "munbejabembabenavesturbalotsíbojpúríbíkolbínísiksikabraíbódóbakossibúría" + - "tbúgískablínkaddókaríbamálkajúgaatsamkebúanókígasíbsjasjagataísjúkískama" + - "rísínúksjoktásípevískaCherokee-málsjeyensorani-kúrdískakoptískakrímtyrkn" + - "eskaSeselwa kreólsk franskakasúbískadakótadargvataítadelaverslavneskadog" + - "ríbdinkazarmadogrílágsorbneskadúalamiðhollenskajola-fonyidjúladazagaembu" + - "efíkfornegypskaekajúkelamítmiðenskaevondófangfilippseyskafónmiðfranskafo" + - "rnfranskanorðurfrísneskaausturfrísneskafríúlskagagagásgajógbajagísgilber" + - "skamiðháþýskafornháþýskagondígorontalógotneskagerbóforngrískasvissnesk þ" + - "ýskagusiigvísínhaídahavaískahíligaínonhettitískahmonghásorbneskahúpaíba" + - "nibibioílokóingúslojbanngombamasjámegyðingapersneskagyðingaarabískakarak" + - "alpakkabílekasínjjukambakavíkabardískatyapmakondegrænhöfðeyskakorokasíko" + - "taskakoyra chiinikakokalenjinkimbúndúkómí-permyakkonkaníkosraskakpelleka" + - "rasaíbalkarkarélskakúrúksjambalabafíakölnískakúmíkkútenaíladínskalangíla" + - "ndalambalesgískalakótamongólozinorðurlúríluba-lulualúisenólúndalúólúsaíl" + - "uyiamadúrskamagahímaítílímakasarmandingómasaímoksamandarmendemerúmáritís" + - "kamiðírskamakhuwa-meettometa’mikmakmínangkabámansjúmanípúrímóhískamossím" + - "undangmargvísleg málkríkmirandesískamarvaríersjamasanderanínapólískanama" + - "lágþýska; lágsaxneskanevaríníasníveskakwasiongiemboonnógaínorrænan’konor" + - "ðursótónúerklassísk nevarískanjamvesínyankolenjórónsímaósagetyrkneska, " + - "ottómanpangasínmálpalavípampangapapíamentópaláskanígerískt pidginfornper" + - "sneskafönikískaponpeiskaprússneskafornpróvensalskakicherajastanírapanúír" + - "arótongskarombóromaníarúmenskarúasandavejakútsamversk arameískasambúrúsa" + - "saksantalíngambaysangúsikileyskaskoskasuðurkúrdískasenaselkúpkoíraboró-s" + - "ennífornírskatachelhitsjansídamósuðursamískalúlesamískaenaresamískaskolt" + - "esamískasóninkesogdíensranan tongoserersahosúkúmasúsúsúmerskashimaoríska" + - "klassísk sýrlenskasýrlenskatímnetesóterenótetúmtígretívtókeláskaklingons" + - "katlingittamasjektongverska (nyasa)tokpisintarókótsimsískatúmbúkatúvalús" + - "katasawaqtúvínskatamazightúdmúrtúgarítískaúmbúndúrótvaívotískavunjóvalse" + - "rvalamóvaraívasjóvarlpirikalmúkskasógajaójapískayangbenyembakantoneskasa" + - "pótekblisstáknsenagastaðlað marokkóskt tamazightsúníekkert tungumálaefni" + - "zázáískastöðluð nútímaarabískaausturrísk þýskasvissnesk háþýskaáströlsk " + - "enskakanadísk enskabresk enskabandarísk enskarómönsk-amerísk spænskaevró" + - "psk spænskamexíkósk spænskakanadísk franskasvissnesk franskalágsaxneskaf" + - "læmskabrasílísk portúgalskaevrópsk portúgalskamoldóvskaserbókróatískaKon" + - "gó-svahílíkínverska (einfölduð)kínverska (hefðbundin)" - -var isLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0005, 0x000f, 0x0019, 0x0024, 0x0028, 0x0032, 0x003b, - 0x0044, 0x004c, 0x0055, 0x005c, 0x0063, 0x006a, 0x0079, 0x0083, - 0x008b, 0x0092, 0x009b, 0x00a3, 0x00ad, 0x00b6, 0x00c1, 0x00cd, - 0x00d5, 0x00de, 0x00e2, 0x00ec, 0x00fb, 0x0102, 0x0108, 0x010e, - 0x0115, 0x011d, 0x0124, 0x0127, 0x012e, 0x0133, 0x013d, 0x0145, - 0x014e, 0x0157, 0x0160, 0x0165, 0x016c, 0x0176, 0x017f, 0x0186, - 0x0196, 0x019c, 0x01aa, 0x01b4, 0x01bc, 0x01c6, 0x01cc, 0x01d1, - 0x01d9, 0x01df, 0x01eb, 0x01f6, 0x0200, 0x0209, 0x0211, 0x0218, - // Entry 40 - 7F - 0x0227, 0x0234, 0x023f, 0x0245, 0x0250, 0x025a, 0x025f, 0x0268, - 0x0270, 0x027b, 0x0283, 0x028b, 0x0295, 0x029e, 0x02a7, 0x02b0, - 0x02b8, 0x02c3, 0x02c7, 0x02ce, 0x02d6, 0x02de, 0x02e8, 0x02f2, - 0x02fa, 0x0304, 0x030c, 0x0313, 0x0322, 0x0327, 0x0334, 0x033b, - 0x033f, 0x034a, 0x0356, 0x035f, 0x036b, 0x0376, 0x037c, 0x0387, - 0x0390, 0x039a, 0x03a1, 0x03aa, 0x03b3, 0x03bc, 0x03c5, 0x03d4, - 0x03dc, 0x03e2, 0x03eb, 0x03f4, 0x0403, 0x0410, 0x0417, 0x042e, - 0x043b, 0x0441, 0x0446, 0x044c, 0x0456, 0x045f, 0x0464, 0x046b, - // Entry 80 - BF - 0x0471, 0x047d, 0x0485, 0x048e, 0x0495, 0x049e, 0x04a8, 0x04b4, - 0x04bd, 0x04c7, 0x04cd, 0x04dc, 0x04e2, 0x04ed, 0x04f9, 0x0503, - 0x050b, 0x0510, 0x0519, 0x0521, 0x052a, 0x0530, 0x053c, 0x0546, - 0x054d, 0x0556, 0x055f, 0x0567, 0x0571, 0x057b, 0x0584, 0x058f, - 0x0596, 0x05a0, 0x05a9, 0x05af, 0x05b7, 0x05c2, 0x05ca, 0x05d5, - 0x05db, 0x05e4, 0x05e9, 0x05f4, 0x05fb, 0x0605, 0x060a, 0x060f, - 0x0618, 0x0620, 0x0626, 0x0630, 0x0636, 0x063e, 0x0643, 0x064a, - 0x0650, 0x0650, 0x065b, 0x0660, 0x066d, 0x0677, 0x0677, 0x067f, - // Entry C0 - FF - 0x067f, 0x068e, 0x0697, 0x069e, 0x06a8, 0x06b4, 0x06b4, 0x06bc, - 0x06bc, 0x06bc, 0x06c5, 0x06c5, 0x06c5, 0x06c8, 0x06c8, 0x06d3, - 0x06d3, 0x06d9, 0x06e1, 0x06e9, 0x06e9, 0x06ed, 0x06f2, 0x06f2, - 0x06f2, 0x06f6, 0x06fb, 0x06fb, 0x06ff, 0x06ff, 0x06ff, 0x070d, - 0x0716, 0x071c, 0x0722, 0x0722, 0x0722, 0x0729, 0x0729, 0x0729, - 0x072e, 0x072e, 0x0734, 0x073b, 0x0743, 0x074c, 0x074c, 0x0751, - 0x0751, 0x0757, 0x0762, 0x0769, 0x076e, 0x0777, 0x077c, 0x0783, - 0x078c, 0x0796, 0x079b, 0x07a2, 0x07a9, 0x07b4, 0x07c1, 0x07c7, - // Entry 100 - 13F - 0x07d8, 0x07e1, 0x07e1, 0x07ef, 0x0807, 0x0812, 0x0819, 0x081f, - 0x0825, 0x082c, 0x0835, 0x083c, 0x0841, 0x0846, 0x084c, 0x0859, - 0x0859, 0x085f, 0x086c, 0x0876, 0x087c, 0x0882, 0x0886, 0x088b, - 0x088b, 0x0896, 0x089d, 0x08a4, 0x08ad, 0x08ad, 0x08b4, 0x08b4, - 0x08b8, 0x08c4, 0x08c4, 0x08c8, 0x08c8, 0x08d3, 0x08de, 0x08de, - 0x08ef, 0x08ff, 0x0909, 0x090b, 0x0911, 0x0911, 0x0916, 0x091b, - 0x091b, 0x091f, 0x0928, 0x0928, 0x0936, 0x0944, 0x0944, 0x094a, - 0x0954, 0x095c, 0x0962, 0x096d, 0x097e, 0x097e, 0x097e, 0x0983, - // Entry 140 - 17F - 0x098b, 0x0991, 0x0991, 0x099a, 0x099a, 0x09a6, 0x09b1, 0x09b6, - 0x09c2, 0x09c2, 0x09c7, 0x09cc, 0x09d2, 0x09d9, 0x09df, 0x09df, - 0x09df, 0x09e5, 0x09eb, 0x09f3, 0x0a04, 0x0a15, 0x0a15, 0x0a1f, - 0x0a26, 0x0a2c, 0x0a2f, 0x0a34, 0x0a39, 0x0a44, 0x0a44, 0x0a48, - 0x0a4f, 0x0a5f, 0x0a5f, 0x0a63, 0x0a63, 0x0a68, 0x0a6f, 0x0a7b, - 0x0a7b, 0x0a7b, 0x0a7f, 0x0a87, 0x0a91, 0x0a9f, 0x0aa7, 0x0aaf, - 0x0ab5, 0x0ac3, 0x0ac3, 0x0ac3, 0x0acc, 0x0ad3, 0x0adb, 0x0ae1, - 0x0aeb, 0x0af2, 0x0afb, 0x0b04, 0x0b0a, 0x0b0f, 0x0b14, 0x0b1d, - // Entry 180 - 1BF - 0x0b1d, 0x0b1d, 0x0b1d, 0x0b24, 0x0b24, 0x0b2a, 0x0b2e, 0x0b3b, - 0x0b3b, 0x0b45, 0x0b4e, 0x0b54, 0x0b59, 0x0b60, 0x0b65, 0x0b65, - 0x0b65, 0x0b6e, 0x0b6e, 0x0b75, 0x0b7f, 0x0b86, 0x0b8f, 0x0b95, - 0x0b95, 0x0b9a, 0x0ba0, 0x0ba5, 0x0baa, 0x0bb5, 0x0bbf, 0x0bcd, - 0x0bd4, 0x0bda, 0x0be6, 0x0bed, 0x0bf8, 0x0c01, 0x0c07, 0x0c07, - 0x0c0e, 0x0c1e, 0x0c23, 0x0c30, 0x0c38, 0x0c38, 0x0c38, 0x0c3d, - 0x0c49, 0x0c49, 0x0c54, 0x0c58, 0x0c71, 0x0c78, 0x0c7d, 0x0c85, - 0x0c85, 0x0c8b, 0x0c94, 0x0c9b, 0x0ca3, 0x0ca3, 0x0ca9, 0x0cb6, - // Entry 1C0 - 1FF - 0x0cbb, 0x0ccf, 0x0cd8, 0x0ce0, 0x0ce7, 0x0ced, 0x0cf3, 0x0d06, - 0x0d13, 0x0d1a, 0x0d22, 0x0d2e, 0x0d36, 0x0d36, 0x0d48, 0x0d48, - 0x0d48, 0x0d55, 0x0d55, 0x0d60, 0x0d60, 0x0d60, 0x0d69, 0x0d74, - 0x0d85, 0x0d8a, 0x0d8a, 0x0d94, 0x0d9d, 0x0da9, 0x0da9, 0x0da9, - 0x0daf, 0x0db6, 0x0db6, 0x0db6, 0x0db6, 0x0dc0, 0x0dc4, 0x0dcb, - 0x0dd1, 0x0de4, 0x0ded, 0x0df2, 0x0dfa, 0x0dfa, 0x0e01, 0x0e07, - 0x0e11, 0x0e17, 0x0e17, 0x0e27, 0x0e27, 0x0e2b, 0x0e2b, 0x0e32, - 0x0e44, 0x0e4e, 0x0e4e, 0x0e57, 0x0e5b, 0x0e5b, 0x0e63, 0x0e63, - // Entry 200 - 23F - 0x0e63, 0x0e71, 0x0e7e, 0x0e8b, 0x0e99, 0x0ea1, 0x0ea9, 0x0eb5, - 0x0eba, 0x0ebe, 0x0ebe, 0x0ec6, 0x0ecc, 0x0ed5, 0x0ee1, 0x0ef5, - 0x0eff, 0x0eff, 0x0eff, 0x0f05, 0x0f0a, 0x0f11, 0x0f17, 0x0f1d, - 0x0f21, 0x0f2c, 0x0f2c, 0x0f36, 0x0f3d, 0x0f3d, 0x0f45, 0x0f57, - 0x0f5f, 0x0f5f, 0x0f67, 0x0f67, 0x0f71, 0x0f71, 0x0f7a, 0x0f85, - 0x0f8c, 0x0f96, 0x0f9f, 0x0fa7, 0x0fb4, 0x0fbe, 0x0fc2, 0x0fc6, - 0x0fc6, 0x0fc6, 0x0fc6, 0x0fc6, 0x0fce, 0x0fce, 0x0fd4, 0x0fda, - 0x0fe1, 0x0fe7, 0x0fed, 0x0ff5, 0x0ff5, 0x0fff, 0x0fff, 0x1004, - // Entry 240 - 27F - 0x1008, 0x1010, 0x1017, 0x101c, 0x101c, 0x1026, 0x102e, 0x1038, - 0x1038, 0x103e, 0x105d, 0x1063, 0x1078, 0x1083, 0x109f, 0x109f, - 0x10b2, 0x10c6, 0x10d6, 0x10e5, 0x10f0, 0x1100, 0x111b, 0x112c, - 0x113f, 0x113f, 0x1150, 0x1161, 0x116d, 0x1175, 0x118d, 0x11a2, - 0x11ac, 0x11bd, 0x11cd, 0x11e5, 0x11fd, -} // Size: 1250 bytes - -const itLangStr string = "" + // Size: 5026 bytes - "afarabcasoavestanafrikaansakanamaricoaragonesearaboassameseavaroaymaraaz" + - "erbaigianobaschirobielorussobulgarobislamabambarabengalesetibetanobreton" + - "ebosniacocatalanocecenochamorrocorsocreececoslavo della Chiesaciuvasciog" + - "allesedanesetedescodivehidzongkhaewegrecoingleseesperantospagnoloestoneb" + - "ascopersianofulahfinlandesefigianofaroesefrancesefrisone occidentaleirla" + - "ndesegaelico scozzesegalizianoguaranígujaratimannesehausaebraicohindihir" + - "i motucroatohaitianoungheresearmenohererointerlinguaindonesianointerling" + - "ueigbosichuan yiinupiakidoislandeseitalianoinuktitutgiapponesegiavaneseg" + - "eorgianokongokikuyukuanyamakazakogroenlandesekhmerkannadacoreanokanurika" + - "shmiricurdokomicornicochirghisolatinolussemburghesegandalimburgheselinga" + - "lalaolituanoluba-katangalettonemalgasciomarshallesemaorimacedonemalayala" + - "mmongolomarathimalesemaltesebirmanonaurundebele del nordnepalesendongaol" + - "andesenorvegese nynorsknorvegese bokmålndebele del sudnavajonyanjaoccita" + - "noojibwaoromooriyaosseticopunjabipalipolaccopashtoportoghesequechuaroman" + - "ciorundirumenorussokinyarwandasanscritosardosindhisami del nordsangosing" + - "aleseslovaccoslovenosamoanoshonasomaloalbaneseserboswatisotho del sudsun" + - "danesesvedeseswahilitamiltelugutagicothaitigrinoturcomannotswanatonganot" + - "urcotsongatatarotaitianouiguroucrainourduusbecovendavietnamitavolapükval" + - "lonewolofxhosayiddishyorubazhuangcinesezuluaccineseacioliadangmeadyghear" + - "abo tunisinoafrihiliaghemainuaccadoalabamaaleutoalbanese ghegoaltai meri" + - "dionaleinglese anticoangikaaramaicomapuchearaonaarapahoarabo algerinoaru" + - "acoarabo marocchinoarabo egizianoasulingua dei segni americanaasturianok" + - "otavaawadhibelucibalinesebavaresebasabamunbatak tobaghomalabegiawembabet" + - "awibenabafutbadagabeluci occidentalebhojpuribicolbinibanjarkomsiksikabis" + - "hnupriyabakhtiaribrajbrahuibodoakooseburiatbugibulublinmedumbacaddocarib" + - "icocayugaatsamcebuanochigachibchaciagataicochuukesemarigergo chinookchoc" + - "tawchipewyancherokeecheyennecurdo soranicoptocapiznonturco crimeocreolo " + - "delle Seychelleskashubiandakotadargwataitadelawareslavedogribdincazarmad" + - "ogribasso sorabodusun centraledualaolandese mediojola-fonydiuladazagaemb" + - "uefikemilianoegiziano anticoekajukaelamiticoinglese medioyupik centralee" + - "wondoestremegnofangfilippinofinlandese del Tornedalenfonfrancese cajunfr" + - "ancese mediofrancese anticofrancoprovenzalefrisone settentrionalefrisone" + - " orientalefriulanogagagauzogangayogbayadari zoroastrianogeezgilbertesegi" + - "lakitedesco medio altotedesco antico altokonkani goanogondigorontalogoti" + - "cogrebogreco anticotedesco svizzerowayuugusiigwichʼinhaidahakkahawaianoh" + - "indi figianoilongohittitehmongalto soraboxianghupaibanibibioilocanoingus" + - "hingricocreolo giamaicanolojbanngamambomachamegiudeo persianogiudeo arab" + - "ojutlandicokara-kalpakcabilokachinkaikambakawicabardinokanembutyapmakond" + - "ecapoverdianokorokaingangkhasikhotanesekoyra chiinikhowarkirmanjkikakoka" + - "lenjinkimbundupermiacokonkanikosraeankpellekarachay-Balkarcarelianokuruk" + - "hshambalabafiacoloniesekumykkutenaigiudeo-spagnololangilahndalambalesgoL" + - "ingua Franca Novaligurelivonelakotalombardololo bantuloziluri settentrio" + - "naleletgalloluba-lulualuisenolundaluolushailuyiacinese classicolazmadure" + - "semafamagahimaithilimakasarmandingomasaimabamokshamandarmendemerucreolo " + - "maurizianoirlandese mediomakhuwa-meettometa’micmacmenangkabaumanchumanip" + - "urimohawkmossimari occidentalemundangmultilinguacreekmirandesemarwarimen" + - "tawaimyeneerzyamazandaranimin nannapoletanonamabasso tedesconewariniasni" + - "ueaokwasiongiemboonnogainorse anticonovialn’kosotho del nordnuernewari c" + - "lassiconyamwezinyankolenyoronzimaosageturco ottomanopangasinanpahlavipam" + - "pangapapiamentopalaupiccardopidgin nigerianotedesco della Pennsylvaniape" + - "rsiano anticotedesco palatinofeniciopiemonteseponticoponapeprussianoprov" + - "enzale anticok’iche’quechua dell’altopiano del Chimborazorajasthanirapan" + - "uirarotongaromagnolotarifitromboromanirotumanorutenorovianaarumenorwasan" + - "daweyakutaramaico samaritanosamburusasaksantalisaurashtrangambaysangusic" + - "ilianoscozzesesassaresecurdo meridionalesenecasenaseriselkupkoyraboro se" + - "nniirlandese anticosamogiticotashelhitshanarabo ciadianosidamotedesco sl" + - "esianoselayarsami del sudsami di Lulesami di Inarisami skoltsoninkesogdi" + - "anosranan tongoserersahosaterfriesischsukumasususumerocomorianosiriaco c" + - "lassicosiriacoslesianotulutemnetesoterenotetumtigretivtokelautsakhurklin" + - "gontlingittalisciotamasheknyasa del Tongatok pisinturoyotarokozaconicots" + - "imshiantat islamicotumbukatuvalutasawaqtuviniantamazightudmurtugariticom" + - "bundurootvaivenetovepsofiammingo occidentalevotovõrovunjowalserwalamowar" + - "aywashowarlpiriwukalmykmengreliosogayao (bantu)yapeseyangbenyembanheenga" + - "tucantonesezapotecblissymbolzelandesezenagatamazight del Marocco standar" + - "dzuninessun contenuto linguisticozazaarabo moderno standardtedesco austr" + - "iacoalto tedesco svizzeroinglese australianoinglese canadeseinglese brit" + - "annicoinglese americanospagnolo latinoamericanospagnolo europeospagnolo " + - "messicanofrancese canadesefrancese svizzerobasso tedesco olandesefiammin" + - "goportoghese brasilianoportoghese europeomoldavoserbo-croatoswahili del " + - "Congocinese semplificatocinese tradizionale" - -var itLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000a, 0x0011, 0x001a, 0x001e, 0x0025, 0x002e, - 0x0033, 0x003b, 0x0040, 0x0046, 0x0052, 0x005a, 0x0064, 0x006b, - 0x0072, 0x0079, 0x0082, 0x008a, 0x0091, 0x0099, 0x00a1, 0x00a7, - 0x00af, 0x00b4, 0x00b8, 0x00bc, 0x00ce, 0x00d7, 0x00de, 0x00e4, - 0x00eb, 0x00f1, 0x00f9, 0x00fc, 0x0101, 0x0108, 0x0111, 0x0119, - 0x011f, 0x0124, 0x012c, 0x0131, 0x013b, 0x0142, 0x0149, 0x0151, - 0x0164, 0x016d, 0x017d, 0x0186, 0x018e, 0x0196, 0x019d, 0x01a2, - 0x01a9, 0x01ae, 0x01b7, 0x01bd, 0x01c5, 0x01ce, 0x01d4, 0x01da, - // Entry 40 - 7F - 0x01e5, 0x01f0, 0x01fb, 0x01ff, 0x0209, 0x0210, 0x0213, 0x021c, - 0x0224, 0x022d, 0x0237, 0x0240, 0x0249, 0x024e, 0x0254, 0x025c, - 0x0262, 0x026e, 0x0273, 0x027a, 0x0281, 0x0287, 0x028f, 0x0294, - 0x0298, 0x029f, 0x02a8, 0x02ae, 0x02bc, 0x02c1, 0x02cc, 0x02d3, - 0x02d6, 0x02dd, 0x02e9, 0x02f0, 0x02f9, 0x0304, 0x0309, 0x0311, - 0x031a, 0x0321, 0x0328, 0x032e, 0x0335, 0x033c, 0x0341, 0x0351, - 0x0359, 0x035f, 0x0367, 0x0378, 0x0389, 0x0398, 0x039e, 0x03a4, - 0x03ac, 0x03b2, 0x03b7, 0x03bc, 0x03c4, 0x03cb, 0x03cf, 0x03d6, - // Entry 80 - BF - 0x03dc, 0x03e6, 0x03ed, 0x03f5, 0x03fa, 0x0400, 0x0405, 0x0410, - 0x0419, 0x041e, 0x0424, 0x0431, 0x0436, 0x043f, 0x0447, 0x044e, - 0x0455, 0x045a, 0x0460, 0x0468, 0x046d, 0x0472, 0x047f, 0x0488, - 0x048f, 0x0496, 0x049b, 0x04a1, 0x04a7, 0x04ab, 0x04b2, 0x04bc, - 0x04c2, 0x04c9, 0x04ce, 0x04d4, 0x04da, 0x04e2, 0x04e8, 0x04ef, - 0x04f3, 0x04f9, 0x04fe, 0x0508, 0x0510, 0x0517, 0x051c, 0x0521, - 0x0528, 0x052e, 0x0534, 0x053a, 0x053e, 0x0546, 0x054c, 0x0553, - 0x0559, 0x0567, 0x056f, 0x0574, 0x0578, 0x057e, 0x0585, 0x058b, - // Entry C0 - FF - 0x0599, 0x05aa, 0x05b8, 0x05be, 0x05c6, 0x05cd, 0x05d3, 0x05da, - 0x05e8, 0x05e8, 0x05ee, 0x05fe, 0x060c, 0x060f, 0x0629, 0x0632, - 0x0638, 0x063e, 0x0644, 0x064c, 0x0654, 0x0658, 0x065d, 0x0667, - 0x066e, 0x0673, 0x0678, 0x067e, 0x0682, 0x0687, 0x068d, 0x069f, - 0x06a7, 0x06ac, 0x06b0, 0x06b6, 0x06b9, 0x06c0, 0x06cb, 0x06d4, - 0x06d8, 0x06de, 0x06e2, 0x06e8, 0x06ee, 0x06f2, 0x06f6, 0x06fa, - 0x0701, 0x0706, 0x070e, 0x0714, 0x0719, 0x0720, 0x0725, 0x072c, - 0x0736, 0x073e, 0x0742, 0x074f, 0x0756, 0x075f, 0x0767, 0x076f, - // Entry 100 - 13F - 0x077b, 0x0780, 0x0788, 0x0794, 0x07ab, 0x07b4, 0x07ba, 0x07c0, - 0x07c5, 0x07cd, 0x07d2, 0x07d8, 0x07dd, 0x07e2, 0x07e7, 0x07f3, - 0x0801, 0x0806, 0x0814, 0x081d, 0x0822, 0x0828, 0x082c, 0x0830, - 0x0838, 0x0847, 0x084e, 0x0857, 0x0864, 0x0872, 0x0878, 0x0882, - 0x0886, 0x088f, 0x08a8, 0x08ab, 0x08b9, 0x08c7, 0x08d6, 0x08e6, - 0x08fc, 0x090d, 0x0915, 0x0917, 0x091e, 0x0921, 0x0925, 0x092a, - 0x093b, 0x093f, 0x0949, 0x094f, 0x0961, 0x0974, 0x0981, 0x0986, - 0x098f, 0x0995, 0x099a, 0x09a6, 0x09b6, 0x09bb, 0x09bb, 0x09c0, - // Entry 140 - 17F - 0x09c9, 0x09ce, 0x09d3, 0x09db, 0x09e8, 0x09ee, 0x09f5, 0x09fa, - 0x0a05, 0x0a0a, 0x0a0e, 0x0a12, 0x0a18, 0x0a1f, 0x0a25, 0x0a2c, - 0x0a3d, 0x0a43, 0x0a4b, 0x0a52, 0x0a61, 0x0a6d, 0x0a77, 0x0a82, - 0x0a88, 0x0a8e, 0x0a91, 0x0a96, 0x0a9a, 0x0aa3, 0x0aaa, 0x0aae, - 0x0ab5, 0x0ac1, 0x0ac1, 0x0ac5, 0x0acd, 0x0ad2, 0x0adb, 0x0ae7, - 0x0aed, 0x0af6, 0x0afa, 0x0b02, 0x0b0a, 0x0b12, 0x0b19, 0x0b21, - 0x0b27, 0x0b36, 0x0b36, 0x0b36, 0x0b3f, 0x0b45, 0x0b4d, 0x0b52, - 0x0b5b, 0x0b60, 0x0b67, 0x0b76, 0x0b7b, 0x0b81, 0x0b86, 0x0b8b, - // Entry 180 - 1BF - 0x0b9d, 0x0ba3, 0x0ba9, 0x0baf, 0x0bb7, 0x0bc1, 0x0bc5, 0x0bd8, - 0x0be0, 0x0bea, 0x0bf1, 0x0bf6, 0x0bf9, 0x0bff, 0x0c04, 0x0c13, - 0x0c16, 0x0c1e, 0x0c22, 0x0c28, 0x0c30, 0x0c37, 0x0c3f, 0x0c44, - 0x0c48, 0x0c4e, 0x0c54, 0x0c59, 0x0c5d, 0x0c6e, 0x0c7d, 0x0c8b, - 0x0c92, 0x0c98, 0x0ca3, 0x0ca9, 0x0cb1, 0x0cb7, 0x0cbc, 0x0ccc, - 0x0cd3, 0x0cde, 0x0ce3, 0x0cec, 0x0cf3, 0x0cfb, 0x0d00, 0x0d05, - 0x0d10, 0x0d17, 0x0d21, 0x0d25, 0x0d32, 0x0d38, 0x0d3c, 0x0d40, - 0x0d42, 0x0d48, 0x0d51, 0x0d56, 0x0d62, 0x0d68, 0x0d6e, 0x0d7c, - // Entry 1C0 - 1FF - 0x0d80, 0x0d8f, 0x0d97, 0x0d9f, 0x0da4, 0x0da9, 0x0dae, 0x0dbc, - 0x0dc6, 0x0dcd, 0x0dd5, 0x0ddf, 0x0de4, 0x0dec, 0x0dfc, 0x0e16, - 0x0e16, 0x0e25, 0x0e35, 0x0e3c, 0x0e46, 0x0e4d, 0x0e53, 0x0e5c, - 0x0e6d, 0x0e78, 0x0e9f, 0x0ea9, 0x0eb0, 0x0eb9, 0x0ec2, 0x0ec9, - 0x0ece, 0x0ed4, 0x0edc, 0x0ee2, 0x0ee9, 0x0ef0, 0x0ef3, 0x0efa, - 0x0eff, 0x0f12, 0x0f19, 0x0f1e, 0x0f25, 0x0f2f, 0x0f36, 0x0f3b, - 0x0f44, 0x0f4c, 0x0f55, 0x0f66, 0x0f6c, 0x0f70, 0x0f74, 0x0f7a, - 0x0f89, 0x0f99, 0x0fa3, 0x0fac, 0x0fb0, 0x0fbe, 0x0fc4, 0x0fd4, - // Entry 200 - 23F - 0x0fdb, 0x0fe7, 0x0ff3, 0x1000, 0x100a, 0x1011, 0x1019, 0x1025, - 0x102a, 0x102e, 0x103c, 0x1042, 0x1046, 0x104c, 0x1055, 0x1065, - 0x106c, 0x1074, 0x1078, 0x107d, 0x1081, 0x1087, 0x108c, 0x1091, - 0x1094, 0x109b, 0x10a2, 0x10a9, 0x10b0, 0x10b8, 0x10c0, 0x10cf, - 0x10d8, 0x10de, 0x10e4, 0x10ec, 0x10f5, 0x1101, 0x1108, 0x110e, - 0x1115, 0x111d, 0x1126, 0x112c, 0x1135, 0x113b, 0x113f, 0x1142, - 0x1148, 0x114d, 0x1162, 0x1162, 0x1166, 0x116b, 0x1170, 0x1176, - 0x117c, 0x1181, 0x1186, 0x118e, 0x1190, 0x1196, 0x119f, 0x11a3, - // Entry 240 - 27F - 0x11ae, 0x11b4, 0x11bb, 0x11c0, 0x11c9, 0x11d2, 0x11d9, 0x11e3, - 0x11ec, 0x11f2, 0x1210, 0x1214, 0x1230, 0x1234, 0x124a, 0x124a, - 0x125b, 0x1270, 0x1283, 0x1293, 0x12a5, 0x12b6, 0x12ce, 0x12de, - 0x12f0, 0x12f0, 0x1301, 0x1312, 0x1328, 0x1331, 0x1346, 0x1358, - 0x135f, 0x136b, 0x137c, 0x138f, 0x13a2, -} // Size: 1250 bytes - -const jaLangStr string = "" + // Size: 10070 bytes - "アファル語アブハズ語アヴェスタ語アフリカーンス語アカン語アムハラ語アラゴン語アラビア語アッサム語アヴァル語アイマラ語アゼルバイジャン語バシキール" + - "語ベラルーシ語ブルガリア語ビスラマ語バンバラ語ベンガル語チベット語ブルトン語ボスニア語カタロニア語チェチェン語チャモロ語コルシカ語クリー語チ" + - "ェコ語教会スラブ語チュヴァシ語ウェールズ語デンマーク語ドイツ語ディベヒ語ゾンカ語エウェ語ギリシャ語英語エスペラント語スペイン語エストニア語バ" + - "スク語ペルシア語フラ語フィンランド語フィジー語フェロー語フランス語西フリジア語アイルランド語スコットランド・ゲール語ガリシア語グアラニー語グ" + - "ジャラート語マン島語ハウサ語ヘブライ語ヒンディー語ヒリモツ語クロアチア語ハイチ語ハンガリー語アルメニア語ヘレロ語インターリングアインドネシア" + - "語インターリングイボ語四川イ語イヌピアック語イド語アイスランド語イタリア語イヌクウティトット語日本語ジャワ語ジョージア語コンゴ語キクユ語クワ" + - "ニャマ語カザフ語グリーンランド語クメール語カンナダ語韓国語カヌリ語カシミール語クルド語コミ語コーンウォール語キルギス語ラテン語ルクセンブルク" + - "語ガンダ語リンブルフ語リンガラ語ラオ語リトアニア語ルバ・カタンガ語ラトビア語マダガスカル語マーシャル語マオリ語マケドニア語マラヤーラム語モン" + - "ゴル語マラーティー語マレー語マルタ語ミャンマー語ナウル語北ンデベレ語ネパール語ンドンガ語オランダ語ノルウェー語(ニーノシュク)ノルウェー語(" + - "ブークモール)南ンデベレ語ナバホ語ニャンジャ語オック語オジブウェー語オロモ語オリヤー語オセット語パンジャブ語パーリ語ポーランド語パシュトゥー" + - "語ポルトガル語ケチュア語ロマンシュ語ルンディ語ルーマニア語ロシア語キニアルワンダ語サンスクリット語サルデーニャ語シンド語北サーミ語サンゴ語シ" + - "ンハラ語スロバキア語スロベニア語サモア語ショナ語ソマリ語アルバニア語セルビア語スワジ語南部ソト語スンダ語スウェーデン語スワヒリ語タミル語テル" + - "グ語タジク語タイ語ティグリニア語トルクメン語ツワナ語トンガ語トルコ語ツォンガ語タタール語タヒチ語ウイグル語ウクライナ語ウルドゥー語ウズベク語" + - "ベンダ語ベトナム語ヴォラピュク語ワロン語ウォロフ語コサ語イディッシュ語ヨルバ語チワン語中国語ズールー語アチェ語アチョリ語アダングメ語アディゲ" + - "語チュニジア・アラビア語アフリヒリ語アゲム語アイヌ語アッカド語アラバマ語アレウト語ゲグ・アルバニア語南アルタイ語古英語アンギカ語アラム語マプ" + - "チェ語アラオナ語アラパホー語アルジェリア・アラビア語アラワク語モロッコ・アラビア語エジプト・アラビア語アス語アメリカ手話アストゥリアス語コタ" + - "ヴァアワディー語バルーチー語バリ語バイエルン・オーストリア語バサ語バムン語トバ・バタク語ゴーマラ語ベジャ語ベンバ語ベタウィ語ベナ語バフット語" + - "バダガ語西バローチー語ボージュプリー語ビコル語ビニ語バンジャル語コム語シクシカ語ビシュヌプリヤ・マニプリ語バフティヤーリー語ブラジ語ブラフイ" + - "語ボド語アコース語ブリヤート語ブギ語ブル語ビリン語メドゥンバ語カドー語カリブ語カユーガ語チャワイ語セブアノ語チガ語チブチャ語チャガタイ語チュ" + - "ーク語マリ語チヌーク混成語チョクトー語チペワイアン語チェロキー語シャイアン語クルド語(ソラニー)コプト語カピス語クリミア・タタール語セーシェ" + - "ル・クレオール語カシューブ語ダコタ語ダルガン語タイタ語デラウェア語スレイビー語ドグリブ語ディンカ語ザルマ語ドーグリー語低地ソルブ語中央ドゥス" + - "ン語ドゥアラ語中世オランダ語ジョラ=フォニィ語ジュラ語ダザガ語エンブ語エフィク語エミリア語古代エジプト語エカジュク語エラム語中英語中央アラス" + - "カ・ユピック語エウォンド語エストレマドゥーラ語ファング語フィリピノ語トルネダール・フィンランド語フォン語ケイジャン・フランス語中期フランス語" + - "古フランス語アルピタン語北フリジア語東フリジア語フリウリ語ガ語ガガウズ語贛語ガヨ語バヤ語ダリー語(ゾロアスター教)ゲエズ語キリバス語ギラキ語" + - "中高ドイツ語古高ドイツ語ゴア・コンカニ語ゴーンディー語ゴロンタロ語ゴート語グレボ語古代ギリシャ語スイスドイツ語ワユ語フラフラ語グシイ語グウィ" + - "ッチン語ハイダ語客家語ハワイ語フィジー・ヒンディー語ヒリガイノン語ヒッタイト語フモン語高地ソルブ語湘語フパ語イバン語イビビオ語イロカノ語イン" + - "グーシ語イングリア語ジャマイカ・クレオール語ロジバン語ンゴンバ語マチャメ語ユダヤ・ペルシア語ユダヤ・アラビア語ユトランド語カラカルパク語カビ" + - "ル語カチン語カジェ語カンバ語カウィ語カバルド語カネンブ語カタブ語マコンデ語カーボベルデ・クレオール語ニャン語コロ語カインガング語カシ語コータ" + - "ン語コイラ・チーニ語コワール語キルマンジュキ語カコ語カレンジン語キンブンド語コミ・ペルミャク語コンカニ語コスラエ語クペレ語カラチャイ・バルカ" + - "ル語クリオ語キナライア語カレリア語クルク語サンバー語バフィア語ケルン語クムク語クテナイ語ラディノ語ランギ語ラフンダー語ランバ語レズギ語リング" + - "ア・フランカ・ノバリグリア語リヴォニア語ラコタ語ロンバルド語モンゴ語ロジ語北ロル語ラトガリア語ルバ・ルルア語ルイセーニョ語ルンダ語ルオ語ルシ" + - "ャイ語ルヒヤ語漢文ラズ語マドゥラ語マファ語マガヒー語マイティリー語マカッサル語マンディンゴ語マサイ語マバ語モクシャ語マンダル語メンデ語メル語" + - "モーリシャス・クレオール語中期アイルランド語マクア・ミート語メタ語ミクマク語ミナンカバウ語満州語マニプリ語モーホーク語モシ語山地マリ語ムンダ" + - "ン語複数言語クリーク語ミランダ語マールワーリー語メンタワイ語ミエネ語エルジャ語マーザンダラーン語閩南語ナポリ語ナマ語低地ドイツ語ネワール語ニ" + - "アス語ニウーエイ語アオ・ナガ語クワシオ語ンジエムブーン語ノガイ語古ノルド語ノヴィアルンコ語北部ソト語ヌエル語古典ネワール語ニャムウェジ語ニャ" + - "ンコレ語ニョロ語ンゼマ語オセージ語オスマントルコ語パンガシナン語パフラヴィー語パンパンガ語パピアメント語パラオ語ピカルディ語ナイジェリア・ピ" + - "ジン語ペンシルベニア・ドイツ語メノナイト低地ドイツ語古代ペルシア語プファルツ語フェニキア語ピエモンテ語ポントス・ギリシャ語ポンペイ語プロシア" + - "語古期プロバンス語キチェ語チンボラソ高地ケチュア語ラージャスターン語ラパヌイ語ラロトンガ語ロマーニャ語リーフ語ロンボ語ロマーニー語ロツマ語ル" + - "シン語ロヴィアナ語アルーマニア語ルワ語サンダウェ語サハ語サマリア・アラム語サンブル語ササク語サンターリー語サウラーシュトラ語ンガムバイ語サン" + - "グ語シチリア語スコットランド語サッサリ・サルデーニャ語南部クルド語セネカ語セナ語セリ語セリクプ語コイラボロ・センニ語古アイルランド語サモギテ" + - "ィア語タシルハイト語シャン語チャド・アラビア語シダモ語低シレジア語スラヤール語南サーミ語ルレ・サーミ語イナリ・サーミ語スコルト・サーミ語ソニ" + - "ンケ語ソグド語スリナム語セレル語サホ語ザーターフリジア語スクマ語スス語シュメール語コモロ語古典シリア語シリア語シレジア語トゥル語テムネ語テソ" + - "語テレーノ語テトゥン語ティグレ語ティブ語トケラウ語ツァフル語クリンゴン語トリンギット語タリシュ語タマシェク語トンガ語(ニアサ)トク・ピシン語" + - "トゥロヨ語タロコ語ツァコン語チムシュ語ムスリム・タタール語トゥンブカ語ツバル語タサワク語トゥヴァ語中央アトラス・タマジクト語ウドムルト語ウガ" + - "リト語ムブンドゥ語ルートヴァイ語ヴェネト語ヴェプス語西フラマン語マインフランク語ヴォート語ヴォロ語ヴンジョ語ヴァリス語ウォライタ語ワライ語ワ" + - "ショ語ワルピリ語呉語カルムイク語メグレル語ソガ語ヤオ語ヤップ語ヤンベン語イエンバ語ニェエンガトゥ語広東語サポテカ語ブリスシンボルゼーラント語" + - "ゼナガ語標準モロッコ タマジクト語ズニ語言語的内容なしザザ語現代標準アラビア語標準ドイツ語 (スイス)オーストラリア英語カナダ英語イギリス英" + - "語アメリカ英語スペイン語 (イベリア半島)フレミッシュ語ポルトガル語 (イベリア半島)モルダビア語セルボ・クロアチア語コンゴ・スワヒリ語簡体" + - "中国語繁体中国語" - -var jaLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x001e, 0x0030, 0x0048, 0x0054, 0x0063, 0x0072, - 0x0081, 0x0090, 0x009f, 0x00ae, 0x00c9, 0x00db, 0x00ed, 0x00ff, - 0x010e, 0x011d, 0x012c, 0x013b, 0x014a, 0x0159, 0x016b, 0x017d, - 0x018c, 0x019b, 0x01a7, 0x01b3, 0x01c5, 0x01d7, 0x01e9, 0x01fb, - 0x0207, 0x0216, 0x0222, 0x022e, 0x023d, 0x0243, 0x0258, 0x0267, - 0x0279, 0x0285, 0x0294, 0x029d, 0x02b2, 0x02c1, 0x02d0, 0x02df, - 0x02f1, 0x0306, 0x032a, 0x0339, 0x034b, 0x0360, 0x036c, 0x0378, - 0x0387, 0x0399, 0x03a8, 0x03ba, 0x03c6, 0x03d8, 0x03ea, 0x03f6, - // Entry 40 - 7F - 0x040e, 0x0423, 0x0438, 0x0441, 0x044d, 0x0462, 0x046b, 0x0480, - 0x048f, 0x04ad, 0x04b6, 0x04c2, 0x04d4, 0x04e0, 0x04ec, 0x04fe, - 0x050a, 0x0522, 0x0531, 0x0540, 0x0549, 0x0555, 0x0567, 0x0573, - 0x057c, 0x0594, 0x05a3, 0x05af, 0x05c7, 0x05d3, 0x05e5, 0x05f4, - 0x05fd, 0x060f, 0x0627, 0x0636, 0x064b, 0x065d, 0x0669, 0x067b, - 0x0690, 0x069f, 0x06b4, 0x06c0, 0x06cc, 0x06de, 0x06ea, 0x06fc, - 0x070b, 0x071a, 0x0729, 0x074f, 0x0775, 0x0787, 0x0793, 0x07a5, - 0x07b1, 0x07c6, 0x07d2, 0x07e1, 0x07f0, 0x0802, 0x080e, 0x0820, - // Entry 80 - BF - 0x0835, 0x0847, 0x0856, 0x0868, 0x0877, 0x0889, 0x0895, 0x08ad, - 0x08c5, 0x08da, 0x08e6, 0x08f5, 0x0901, 0x0910, 0x0922, 0x0934, - 0x0940, 0x094c, 0x0958, 0x096a, 0x0979, 0x0985, 0x0994, 0x09a0, - 0x09b5, 0x09c4, 0x09d0, 0x09dc, 0x09e8, 0x09f1, 0x0a06, 0x0a18, - 0x0a24, 0x0a30, 0x0a3c, 0x0a4b, 0x0a5a, 0x0a66, 0x0a75, 0x0a87, - 0x0a99, 0x0aa8, 0x0ab4, 0x0ac3, 0x0ad8, 0x0ae4, 0x0af3, 0x0afc, - 0x0b11, 0x0b1d, 0x0b29, 0x0b32, 0x0b41, 0x0b4d, 0x0b5c, 0x0b6e, - 0x0b7d, 0x0b9e, 0x0bb0, 0x0bbc, 0x0bc8, 0x0bd7, 0x0be6, 0x0bf5, - // Entry C0 - FF - 0x0c10, 0x0c22, 0x0c2b, 0x0c3a, 0x0c46, 0x0c55, 0x0c64, 0x0c76, - 0x0c9a, 0x0c9a, 0x0ca9, 0x0cc7, 0x0ce5, 0x0cee, 0x0d00, 0x0d18, - 0x0d24, 0x0d36, 0x0d48, 0x0d51, 0x0d78, 0x0d81, 0x0d8d, 0x0da2, - 0x0db1, 0x0dbd, 0x0dc9, 0x0dd8, 0x0de1, 0x0df0, 0x0dfc, 0x0e11, - 0x0e29, 0x0e35, 0x0e3e, 0x0e50, 0x0e59, 0x0e68, 0x0e8f, 0x0eaa, - 0x0eb6, 0x0ec5, 0x0ece, 0x0edd, 0x0eef, 0x0ef8, 0x0f01, 0x0f0d, - 0x0f1f, 0x0f2b, 0x0f37, 0x0f46, 0x0f55, 0x0f64, 0x0f6d, 0x0f7c, - 0x0f8e, 0x0f9d, 0x0fa6, 0x0fbb, 0x0fcd, 0x0fe2, 0x0ff4, 0x1006, - // Entry 100 - 13F - 0x1020, 0x102c, 0x1038, 0x1056, 0x107a, 0x108c, 0x1098, 0x10a7, - 0x10b3, 0x10c5, 0x10d7, 0x10e6, 0x10f5, 0x1101, 0x1113, 0x1125, - 0x113a, 0x1149, 0x115e, 0x1179, 0x1185, 0x1191, 0x119d, 0x11ac, - 0x11bb, 0x11d0, 0x11e2, 0x11ee, 0x11f7, 0x121b, 0x122d, 0x124b, - 0x125a, 0x126c, 0x1296, 0x12a2, 0x12c3, 0x12d8, 0x12ea, 0x12fc, - 0x130e, 0x1320, 0x132f, 0x1335, 0x1344, 0x134a, 0x1353, 0x135c, - 0x137f, 0x138b, 0x139a, 0x13a6, 0x13b8, 0x13ca, 0x13e2, 0x13f7, - 0x1409, 0x1415, 0x1421, 0x1436, 0x144b, 0x1454, 0x1463, 0x146f, - // Entry 140 - 17F - 0x1484, 0x1490, 0x1499, 0x14a5, 0x14c6, 0x14db, 0x14ed, 0x14f9, - 0x150b, 0x1511, 0x151a, 0x1526, 0x1535, 0x1544, 0x1556, 0x1568, - 0x158c, 0x159b, 0x15aa, 0x15b9, 0x15d4, 0x15ef, 0x1601, 0x1616, - 0x1622, 0x162e, 0x163a, 0x1646, 0x1652, 0x1661, 0x1670, 0x167c, - 0x168b, 0x16b2, 0x16be, 0x16c7, 0x16dc, 0x16e5, 0x16f4, 0x170c, - 0x171b, 0x1733, 0x173c, 0x174e, 0x1760, 0x177b, 0x178a, 0x1799, - 0x17a5, 0x17c6, 0x17d2, 0x17e4, 0x17f3, 0x17ff, 0x180e, 0x181d, - 0x1829, 0x1835, 0x1844, 0x1853, 0x185f, 0x1871, 0x187d, 0x1889, - // Entry 180 - 1BF - 0x18ad, 0x18bc, 0x18ce, 0x18da, 0x18ec, 0x18f8, 0x1901, 0x190d, - 0x191f, 0x1934, 0x1949, 0x1955, 0x195e, 0x196d, 0x1979, 0x197f, - 0x1988, 0x1997, 0x19a3, 0x19b2, 0x19c7, 0x19d9, 0x19ee, 0x19fa, - 0x1a03, 0x1a12, 0x1a21, 0x1a2d, 0x1a36, 0x1a5d, 0x1a78, 0x1a90, - 0x1a99, 0x1aa8, 0x1abd, 0x1ac6, 0x1ad5, 0x1ae7, 0x1af0, 0x1aff, - 0x1b0e, 0x1b1a, 0x1b29, 0x1b38, 0x1b50, 0x1b62, 0x1b6e, 0x1b7d, - 0x1b98, 0x1ba1, 0x1bad, 0x1bb6, 0x1bc8, 0x1bd7, 0x1be3, 0x1bf5, - 0x1c07, 0x1c16, 0x1c2e, 0x1c3a, 0x1c49, 0x1c58, 0x1c61, 0x1c70, - // Entry 1C0 - 1FF - 0x1c7c, 0x1c91, 0x1ca6, 0x1cb8, 0x1cc4, 0x1cd0, 0x1cdf, 0x1cf7, - 0x1d0c, 0x1d21, 0x1d33, 0x1d48, 0x1d54, 0x1d66, 0x1d87, 0x1dab, - 0x1dcc, 0x1de1, 0x1df3, 0x1e05, 0x1e17, 0x1e35, 0x1e44, 0x1e53, - 0x1e6b, 0x1e77, 0x1e9b, 0x1eb6, 0x1ec5, 0x1ed7, 0x1ee9, 0x1ef5, - 0x1f01, 0x1f13, 0x1f1f, 0x1f2b, 0x1f3d, 0x1f52, 0x1f5b, 0x1f6d, - 0x1f76, 0x1f91, 0x1fa0, 0x1fac, 0x1fc1, 0x1fdc, 0x1fee, 0x1ffa, - 0x2009, 0x2021, 0x2045, 0x2057, 0x2063, 0x206c, 0x2075, 0x2084, - 0x20a2, 0x20ba, 0x20cf, 0x20e4, 0x20f0, 0x210b, 0x2117, 0x2129, - // Entry 200 - 23F - 0x213b, 0x214a, 0x215f, 0x2177, 0x2192, 0x21a1, 0x21ad, 0x21bc, - 0x21c8, 0x21d1, 0x21ec, 0x21f8, 0x2201, 0x2213, 0x221f, 0x2231, - 0x223d, 0x224c, 0x2258, 0x2264, 0x226d, 0x227c, 0x228b, 0x229a, - 0x22a6, 0x22b5, 0x22c4, 0x22d6, 0x22eb, 0x22fa, 0x230c, 0x2323, - 0x2338, 0x2347, 0x2353, 0x2362, 0x2371, 0x238f, 0x23a1, 0x23ad, - 0x23bc, 0x23cb, 0x23f2, 0x2404, 0x2413, 0x2425, 0x242e, 0x243a, - 0x2449, 0x2458, 0x246a, 0x2482, 0x2491, 0x249d, 0x24ac, 0x24bb, - 0x24cd, 0x24d9, 0x24e5, 0x24f4, 0x24fa, 0x250c, 0x251b, 0x2524, - // Entry 240 - 27F - 0x252d, 0x2539, 0x2548, 0x2557, 0x256f, 0x2578, 0x2587, 0x259c, - 0x25ae, 0x25ba, 0x25df, 0x25e8, 0x25fd, 0x2606, 0x2621, 0x2621, - 0x2621, 0x263f, 0x265a, 0x2669, 0x267b, 0x268d, 0x268d, 0x26b1, - 0x26b1, 0x26b1, 0x26b1, 0x26b1, 0x26b1, 0x26c6, 0x26c6, 0x26ed, - 0x26ff, 0x271d, 0x2738, 0x2747, 0x2756, -} // Size: 1250 bytes - -const kaLangStr string = "" + // Size: 12200 bytes - "აფარიაფხაზურიავესტურიაფრიკაანსიაკანიამჰარულიარაგონულიარაბულიასამურიხუნძუ" + - "რიაიმარააზერბაიჯანულიბაშკირულიბელორუსულიბულგარულიბისლამაბამბარაბენგალუ" + - "რიტიბეტურიბრეტონულიბოსნიურიკატალანურიჩეჩნურიჩამოროკორსიკულიკრიჩეხურისა" + - "ეკლესიო სლავურიჩუვაშურიუელსურიდანიურიგერმანულიდივეჰიძონგკხაევებერძნული" + - "ინგლისურიესპერანტოესპანურიესტონურიბასკურისპარსულიფულაფინურიფიჯიფარერულ" + - "იფრანგულიდასავლეთფრიზიულიირლანდიურიშოტლანდიური გელურიგალისიურიგუარანიგ" + - "უჯარათიმენურიჰაუსაებრაულიჰინდიხორვატულიჰაიტიური კრეოლიუნგრულისომხურიჰე" + - "რეროინტერლინგუალურიინდონეზიურიინტერლინგიიგბოსიჩუანის იიდოისლანდიურიიტა" + - "ლიურიინუკტიტუტიიაპონურიიავურიქართულიკონგოკიკუიუკუნამაყაზახურიდასავლეთ " + - "გრენლანდიურიქმერულიკანადაკორეულიკანურიქაშმირულიქურთულიკომიკორნულიყირგი" + - "ზულილათინურილუქსემბურგულიგანდალიმბურგულილინგალალაოსურილიტვურილუბა-კატა" + - "ნგალატვიურიმალაგასიურიმარშალურიმაორიმაკედონურიმალაიალამურიმონღოლურიმარ" + - "ათჰიმალაიურიმალტურიბირმულინაურუჩრდილოეთ ნდებელენეპალურინდონგანიდერლანდ" + - "ურინორვეგიული ნიუნორსკინორვეგიული ბუკმოლისამხრეთ ნდებელურინავახონიანჯა" + - "ოქსიტანურიოჯიბვეორომოორიაოსურიპენჯაბურიპალიპოლონურიპუშტუპორტუგალიურიკე" + - "ჩუარეტორომანულირუნდირუმინულირუსულიკინიარუანდასანსკრიტისარდინიულისინდჰუ" + - "რიჩრდილოეთ საამურისანგოსინჰალურისლოვაკურისლოვენურისამოაშონასომალიურიალ" + - "ბანურისერბულისუატისამხრეთ სოთოს ენასუნდურიშვედურისუაჰილიტამილურიტელუგუ" + - "ტაჯიკურიტაიტიგრინიათურქმენულიტსვანატონგანურითურქულიტსონგათათრულიტაიტურ" + - "იუიღურულიუკრაინულიურდუუზბეკურივენდავიეტნამურივოლაპუკივალონურივოლოფურიქ" + - "ჰოსაიდიშიიორუბაჩინურიზულუაჩეხურიაჩოლიადანგმეადიღეურიაღემიაინუურიაქადურ" + - "იალეუტურისამხრეთ ალთაურიძველი ინგლისურიანგიკაარამეულიმაპუდუნგუნიარაპაჰ" + - "ოარავაკიასუასტურიულიავადიბელუჯიბალინურიბასაბამუნიბეჯაბემბაბენადასავლეთ" + - " ბელუჯიბოჯპურიბინისიკსიკაბრაჯიბოდობურიატულიბუგინურიბილინიკაიუგასებუანოჩი" + - "გაჩიბჩაჩუკოტკურიმარიულიჩინუკის ჟარგონიჩოკტოჩიპევიანიჩეროკიჩეიენისორანი" + - " ქურთულიკოპტურიყირიმულ-თურქულისესელვა-კრეოლური ფრანგულიკაშუბურიდაკოტურიდ" + - "არგუულიტაიტადელავერულისლეივიდოგრიბიდინკაზარმადოგრიქვემოსორბულიდუალასაშ" + - "უალო ჰოლანდიურიდიოლადიულადაზაგაემბუეფიკიძველეგვიპტურიეკაჯუკისაშუალო ინ" + - "გლისურიევონდოფილიპინურიფონისაშუალო ფრანგულიძველი ფრანგულიჩრდილოფრიზიულ" + - "იაღმოსავლეთფრიზიულიფრიულურიგაგაგაუზურიგბაიაგეეზიგილბერტულისაშუალო ზემო" + - "გერმანულიძველი ზემოგერმანულიგონდიგორონტალოგოთურიძველი ბერძნულიშვეიცარი" + - "ული გერმანულიგუსიიგვიჩინიჰავაიურიჰილიგაინონიხეთურიჰმონგიზემოსორბულიჰუპ" + - "აიბანიიბიბიოილოკოინგუშურილოჟბანინგომბაკიმაშამიიუდეო-სპარსულიიუდეო-არაბ" + - "ულიყარაყალფახურიკაბილურიკაჩინიკაჯიკამბაყაბარდოულიტიაპიმაკონდეკაბუვერდი" + - "ანუკოროხასიკოირა-ჩიინიკაკოკალენჯინიკიმბუნდუკომი-პერმიაკულიკონკანიკუსაი" + - "ეკპელეყარაჩაულ-ბალყარულიკარელიურიკურუქიშამბალაბაფიაკიოლშიყუმუხურიკუტენ" + - "აილადინოლანგილანდალამბალეზგიურილაკოტამონგოლოზიჩრდილოეთ ლურილუბა-ლულუალ" + - "უისენიოლუნდალუომიზოლუჰიამადურულიმაფამაგაჰიმაითილიმაკასარიმასაიმაბამოქშ" + - "ამენდემერუმორისიენისაშუალო ირლანდიურიმაქუვა-მეეტომეტა-ენამიკმაკიმინანგ" + - "კაბაუმანჯურიულიმანიპურიმოჰაუკურიმოსიმუნდანგისხვადასხვა ენაკრიკიმირანდუ" + - "ლიმარვარიმიენეერზიამაზანდერანულინეაპოლიტანურინამაქვემოგერმანულინევარინ" + - "იასინიუეკვასიონგიმბუნინოღაურიძველსკანდინავიურინკოჩრდილოეთ სოთონუერიკლა" + - "სიკური ნევარულინიამვეზინიანკოლენიორონზიმაპანგასინანიფალაურიპამპანგაპაპ" + - "იამენტოფალაუანინიგერიული კრეოლურიძველი სპარსულიფინიკიურიპრუსიულიძველი " + - "პროვანსულიკიჩერაჯასთანირაპანუირაროტონგულირომბობოშურიარომანულირუასანდავ" + - "ეიაკუტურისამარიულ-არამეულისამბურუსანტალინგამბაისანგუსიცილიურიშოტლანდიუ" + - "რისამხრეთქურთულისენეკასენასელკუპურიკოირაბორო-სენიძველი ირლანდიურიშილჰა" + - "შანიჩადური არაბულისამხრეთსამურილულე-საამურიინარი-საამურისკოლტ-საამურის" + - "ონინკესრანან ტონგოსაჰოსუკუმაშუმერულიკომორულიკლასიკური სირიულისირიულიტი" + - "ნმეტესოტეტუმითიგრეკლინგონიტოკ-პისინიტაროკოტუმბუკატუვალუტასავაქიტუვაცენ" + - "ტრალური მოროკოს ტამაზიგხტიუდმურტულიუგარითულიუმბუნდუძირეული ენავაივუნჯო" + - "ვალსერიველაითავარაივალპირიყალმუხურისოგაიანგბენიიემბაკანტონურიბლისსიმბო" + - "ლოებიზენაგასტანდარტული მაროკოული ტამაზიგხტიზუნილინგვისტური შიგთავსი არ" + - " არისზაზაკითანამედროვე სტანდარტული არაბულიავსტრიული გერმანულიშვეიცარიული" + - " ზემოგერმანულიავსტრალიური ინგლისურიკანადური ინგლისურიბრიტანული ინგლისური" + - "ამერიკული ინგლისურილათინურ ამერიკული ესპანურიევროპული ესპანურიმექსიკურ" + - "ი ესპანურიკანადური ფრანგულიშვეიცარიული ფრანგულიქვემოსაქსონურიფლამანდიუ" + - "რიბრაზილიური პორტუგალიურიევროპული პორტუგალიურიმოლდავურისერბულ-ხორვატულ" + - "იკონგოს სუაჰილიგამარტივებული ჩინურიტრადიციული ჩინური" - -var kaLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x0027, 0x003f, 0x005d, 0x006c, 0x0084, 0x009f, - 0x00b4, 0x00c9, 0x00de, 0x00f0, 0x0117, 0x0132, 0x0150, 0x016b, - 0x0180, 0x0195, 0x01b0, 0x01c8, 0x01e3, 0x01fb, 0x0219, 0x022e, - 0x0240, 0x025b, 0x0264, 0x0276, 0x02a7, 0x02bf, 0x02d4, 0x02e9, - 0x0304, 0x0316, 0x032b, 0x0334, 0x034c, 0x0367, 0x0382, 0x039a, - 0x03b2, 0x03c7, 0x03df, 0x03eb, 0x03fd, 0x0409, 0x0421, 0x0439, - 0x0469, 0x0487, 0x04bb, 0x04d6, 0x04eb, 0x0503, 0x0515, 0x0524, - 0x0539, 0x0548, 0x0548, 0x0563, 0x058e, 0x05a3, 0x05b8, 0x05ca, - // Entry 40 - 7F - 0x05f7, 0x0618, 0x0636, 0x0642, 0x065e, 0x065e, 0x0667, 0x0685, - 0x069d, 0x06bb, 0x06d3, 0x06e5, 0x06fa, 0x0709, 0x071b, 0x072d, - 0x0745, 0x0782, 0x0797, 0x07a9, 0x07be, 0x07d0, 0x07eb, 0x0800, - 0x080c, 0x0821, 0x083c, 0x0854, 0x087b, 0x088a, 0x08a8, 0x08bd, - 0x08d2, 0x08e7, 0x0909, 0x0921, 0x0942, 0x095d, 0x096c, 0x098a, - 0x09ae, 0x09c9, 0x09de, 0x09f6, 0x0a0b, 0x0a20, 0x0a2f, 0x0a5d, - 0x0a75, 0x0a87, 0x0aab, 0x0ae5, 0x0b19, 0x0b4a, 0x0b5c, 0x0b6e, - 0x0b8c, 0x0b9e, 0x0bad, 0x0bb9, 0x0bc8, 0x0be3, 0x0bef, 0x0c07, - // Entry 80 - BF - 0x0c16, 0x0c3a, 0x0c49, 0x0c6d, 0x0c7c, 0x0c94, 0x0ca6, 0x0cc7, - 0x0ce2, 0x0d00, 0x0d18, 0x0d46, 0x0d55, 0x0d70, 0x0d8b, 0x0da6, - 0x0db5, 0x0dc1, 0x0ddc, 0x0df4, 0x0e09, 0x0e18, 0x0e47, 0x0e5c, - 0x0e71, 0x0e86, 0x0e9e, 0x0eb0, 0x0ec8, 0x0ed1, 0x0ee9, 0x0f07, - 0x0f19, 0x0f34, 0x0f49, 0x0f5b, 0x0f70, 0x0f85, 0x0f9d, 0x0fb8, - 0x0fc4, 0x0fdc, 0x0feb, 0x1009, 0x1021, 0x1039, 0x1051, 0x1060, - 0x106f, 0x1081, 0x1081, 0x1093, 0x109f, 0x10b4, 0x10c3, 0x10d8, - 0x10f0, 0x10f0, 0x10f0, 0x10ff, 0x1114, 0x1129, 0x1129, 0x1141, - // Entry C0 - FF - 0x1141, 0x116c, 0x1197, 0x11a9, 0x11c1, 0x11e2, 0x11e2, 0x11f7, - 0x11f7, 0x11f7, 0x120c, 0x120c, 0x120c, 0x1215, 0x1215, 0x1230, - 0x1230, 0x123f, 0x1251, 0x1269, 0x1269, 0x1275, 0x1287, 0x1287, - 0x1287, 0x1293, 0x12a2, 0x12a2, 0x12ae, 0x12ae, 0x12ae, 0x12d9, - 0x12ee, 0x12ee, 0x12fa, 0x12fa, 0x12fa, 0x130f, 0x130f, 0x130f, - 0x131e, 0x131e, 0x132a, 0x132a, 0x1345, 0x135d, 0x135d, 0x136f, - 0x136f, 0x136f, 0x136f, 0x1381, 0x1381, 0x1396, 0x13a2, 0x13b1, - 0x13b1, 0x13cc, 0x13e1, 0x140c, 0x141b, 0x1436, 0x1448, 0x145a, - // Entry 100 - 13F - 0x1482, 0x1497, 0x1497, 0x14c2, 0x1509, 0x1521, 0x1539, 0x1551, - 0x1560, 0x157e, 0x1590, 0x15a5, 0x15b4, 0x15c3, 0x15d2, 0x15f6, - 0x15f6, 0x1605, 0x1639, 0x1648, 0x1657, 0x1669, 0x1675, 0x1684, - 0x1684, 0x16ab, 0x16c0, 0x16c0, 0x16f1, 0x16f1, 0x1703, 0x1703, - 0x1703, 0x1721, 0x1721, 0x172d, 0x172d, 0x175b, 0x1783, 0x1783, - 0x17ad, 0x17e3, 0x17fb, 0x1801, 0x181c, 0x181c, 0x181c, 0x182b, - 0x182b, 0x183a, 0x1858, 0x1858, 0x1895, 0x18cc, 0x18cc, 0x18db, - 0x18f6, 0x1908, 0x1908, 0x1930, 0x196d, 0x196d, 0x196d, 0x197c, - // Entry 140 - 17F - 0x1991, 0x1991, 0x1991, 0x19a9, 0x19a9, 0x19ca, 0x19dc, 0x19ee, - 0x1a0f, 0x1a0f, 0x1a1b, 0x1a2a, 0x1a3c, 0x1a4b, 0x1a63, 0x1a63, - 0x1a63, 0x1a78, 0x1a8a, 0x1aa2, 0x1aca, 0x1aef, 0x1aef, 0x1b16, - 0x1b2e, 0x1b40, 0x1b4c, 0x1b5b, 0x1b5b, 0x1b79, 0x1b79, 0x1b88, - 0x1b9d, 0x1bc1, 0x1bc1, 0x1bcd, 0x1bcd, 0x1bd9, 0x1bd9, 0x1bf8, - 0x1bf8, 0x1bf8, 0x1c04, 0x1c1f, 0x1c37, 0x1c62, 0x1c77, 0x1c89, - 0x1c98, 0x1ccc, 0x1ccc, 0x1ccc, 0x1ce7, 0x1cf9, 0x1d0e, 0x1d1d, - 0x1d2f, 0x1d47, 0x1d5c, 0x1d6e, 0x1d7d, 0x1d8c, 0x1d9b, 0x1db3, - // Entry 180 - 1BF - 0x1db3, 0x1db3, 0x1db3, 0x1dc5, 0x1dc5, 0x1dd4, 0x1de0, 0x1e05, - 0x1e05, 0x1e21, 0x1e39, 0x1e48, 0x1e51, 0x1e5d, 0x1e6c, 0x1e6c, - 0x1e6c, 0x1e84, 0x1e90, 0x1ea2, 0x1eb7, 0x1ecf, 0x1ecf, 0x1ede, - 0x1eea, 0x1ef9, 0x1ef9, 0x1f08, 0x1f14, 0x1f2f, 0x1f63, 0x1f85, - 0x1f9b, 0x1fb0, 0x1fd1, 0x1fef, 0x2007, 0x2022, 0x202e, 0x202e, - 0x2046, 0x206e, 0x207d, 0x2098, 0x20ad, 0x20ad, 0x20bc, 0x20cb, - 0x20f2, 0x20f2, 0x2119, 0x2125, 0x214f, 0x2161, 0x2170, 0x217c, - 0x217c, 0x218e, 0x21a6, 0x21bb, 0x21ee, 0x21ee, 0x21f7, 0x221c, - // Entry 1C0 - 1FF - 0x222b, 0x225f, 0x2277, 0x228f, 0x229e, 0x22ad, 0x22ad, 0x22ad, - 0x22ce, 0x22e3, 0x22fb, 0x2319, 0x2331, 0x2331, 0x2365, 0x2365, - 0x2365, 0x238d, 0x238d, 0x23a8, 0x23a8, 0x23a8, 0x23a8, 0x23c0, - 0x23ee, 0x23fa, 0x23fa, 0x2415, 0x242a, 0x244b, 0x244b, 0x244b, - 0x245a, 0x246c, 0x246c, 0x246c, 0x246c, 0x2487, 0x2490, 0x24a5, - 0x24bd, 0x24ee, 0x2503, 0x2503, 0x2518, 0x2518, 0x252d, 0x253c, - 0x2557, 0x2578, 0x2578, 0x25a2, 0x25b4, 0x25c0, 0x25c0, 0x25db, - 0x2603, 0x2631, 0x2631, 0x2640, 0x264c, 0x2674, 0x2674, 0x2674, - // Entry 200 - 23F - 0x2674, 0x269b, 0x26bd, 0x26e2, 0x2707, 0x271c, 0x271c, 0x273e, - 0x273e, 0x274a, 0x274a, 0x275c, 0x275c, 0x2774, 0x278c, 0x27bd, - 0x27d2, 0x27d2, 0x27d2, 0x27e1, 0x27ed, 0x27ed, 0x27ff, 0x280e, - 0x280e, 0x280e, 0x280e, 0x2826, 0x2826, 0x2826, 0x2826, 0x2826, - 0x2842, 0x2842, 0x2854, 0x2854, 0x2854, 0x2854, 0x2869, 0x287b, - 0x2893, 0x289f, 0x28f2, 0x290d, 0x2928, 0x293d, 0x295c, 0x2965, - 0x2965, 0x2965, 0x2965, 0x2965, 0x2965, 0x2965, 0x2974, 0x2989, - 0x299e, 0x29ad, 0x29ad, 0x29c2, 0x29c2, 0x29dd, 0x29dd, 0x29e9, - // Entry 240 - 27F - 0x29e9, 0x29e9, 0x2a01, 0x2a10, 0x2a10, 0x2a2b, 0x2a2b, 0x2a55, - 0x2a55, 0x2a67, 0x2ac3, 0x2acf, 0x2b1d, 0x2b2f, 0x2b88, 0x2b88, - 0x2bbf, 0x2c08, 0x2c45, 0x2c79, 0x2cb0, 0x2ce7, 0x2d31, 0x2d62, - 0x2d96, 0x2d96, 0x2dc7, 0x2e01, 0x2e2b, 0x2e4c, 0x2e8f, 0x2ecc, - 0x2ee7, 0x2f15, 0x2f3d, 0x2f77, 0x2fa8, -} // Size: 1250 bytes - -const kkLangStr string = "" + // Size: 8563 bytes - "афар тіліабхаз тіліафрикаанс тіліакан тіліамхар тіліарагон тіліараб тілі" + - "ассам тіліавар тіліаймара тіліәзірбайжан тілібашқұрт тілібеларусь тіліб" + - "олгар тілібислама тілібамбара тілібенгал тілітибет тілібретон тілібосни" + - "я тілікаталан тілішешен тілічаморро тілікорсика тілічех тілішіркеулік с" + - "лавян тілічуваш тіліваллий тілідат тілінеміс тілідивехи тілідзонг-кэ ті" + - "ліэве тілігрек тіліағылшын тіліэсперанто тіліиспан тіліэстон тілібаск т" + - "іліпарсы тіліфула тіліфин тіліфиджи тіліфарер тіліфранцуз тілібатыс фри" + - "з тіліирланд тілігэль тілігалисия тілігуарани тілігуджарати тілімэн тіл" + - "іхауса тіліиврит тіліхинди тіліхорват тілігаити тілівенгр тіліармян тіл" + - "ігереро тіліинтерлингва тіліиндонезия тіліинтерлингве тіліигбо тілісычу" + - "ан и тіліидо тіліисланд тіліитальян тіліинуктитут тіліжапон тіліява тіл" + - "ігрузин тілікикуйю тілікваньяма тіліқазақ тілікалаалисут тілікхмер тілі" + - "каннада тілікорей тіліканури тілікашмир тілікүрд тілікоми тілікорн тілі" + - "қырғыз тілілатын тілілюксембург тіліганда тілілимбург тілілингала тіліл" + - "аос тілілитва тілілуба-катанга тілілатыш тілімалагаси тілімаршалл тілім" + - "аори тілімакедон тілімалаялам тілімоңғол тілімаратхи тілімалай тілімаль" + - "та тілібирма тілінауру тілісолтүстік ндебеле тілінепал тіліндонга тілін" + - "идерланд тілінорвегиялық нюнорск тілінорвегиялық букмол тіліоңтүстік нд" + - "ебеле тілінавахо тіліньянджа тіліокситан тіліоромо тіліория тіліосетин " + - "тіліпенджаб тіліполяк тіліпушту тіліпортугал тілікечуа тіліроманш тілір" + - "унди тілірумын тіліорыс тілікиньяруанда тілісанскрит тілісардин тілісин" + - "дхи тілісолтүстік саам тілісанго тілісингал тілісловак тілісловен тіліс" + - "амоа тілішона тілісомали тіліалбан тілісерб тілісвати тілісесото тілісу" + - "ндан тілішвед тілісуахили тілітамил тілітелугу тілітәжік тілітай тіліти" + - "гринья тілітүрікмен тілітсвана тілітонган тілітүрік тілітсонга тілітата" + - "р тілітаити тіліұйғыр тіліукраин тіліурду тіліөзбек тілівенда тілівьетн" + - "ам тіліволапюк тіліваллон тіліволоф тілікхоса тіліидиш тілійоруба тіліқ" + - "ытай тілізулу тіліачех тіліадангме тіліадыгей тіліагхем тіліайну тіліал" + - "еут тіліоңтүстік алтай тіліангика тілімапуче тіліарапахо тіліасу тіліас" + - "турия тіліавадхи тілібали тілібаса тілібемба тілібена тілібатыс балучи " + - "тілібходжпури тілібини тілісиксика тілібодо тілібугис тіліблин тілісебу" + - "ано тілікига тілічуук тілімари тілічокто тілічероки тілішайен тілісоран" + - "и тілісейшельдік креол тілідакота тілідаргин тілітаита тілідогриб тіліз" + - "арма тілітөменгі лужица тілідуала тілідиола тілідазага тіліэмбу тіліэфи" + - "к тіліэкаджук тіліэвондо тіліфилиппин тіліфон тіліфриуль тіліга тілігаг" + - "ауз тілігеэз тілігильберт тілігоронтало тілішвейцариялық неміс тілігуси" + - "и тілігвичин тілігавайи тіліхилигайнон тіліхмонг тіліжоғарғы лужица тіл" + - "іхупа тіліибан тіліибибио тіліилоко тіліингуш тіліложбан тілінгомба тіл" + - "імачаме тілікабил тілікачин тіліджу тілікамба тілікабардин тілітьяп тіл" + - "імаконде тілікабувердьяну тілікоро тілікхаси тілікойра чини тілікако ті" + - "лікаленжин тілікимбунду тілікоми-пермяк тіліконкани тілікпелле тіліқара" + - "шай-балқар тілікарель тілікурух тілішамбала тілібафиа тілікёльн тіліқұм" + - "ық тіліладино тіліланги тілілезгин тілілакота тілілози тілісолтүстік лю" + - "ри тілілуба-лулуа тілілунда тілілуо тілімизо тілілухиа тілімадур тіліма" + - "гахи тілімайтхили тілімакасар тілімасай тілімокша тіліменде тілімеру ті" + - "ліморисиен тілімакуа-меетто тілімета тілімикмак тіліминангкабау тіліман" + - "ипури тілімогавк тілімосси тілімунданг тілібірнеше тілкрик тілімиранд т" + - "іліэрзян тілімазандеран тілінеаполитан тілінама тілітөменгі неміс тілін" + - "евар тіліниас тіліниуэ тіліквасио тілінгиембун тіліноғай тілінко тілісо" + - "лтүстік сото тілінуэр тілінианколе тіліпангасинан тіліпампанга тіліпапь" + - "яменто тіліпалау тілінигериялық пиджин тіліпруссия тілікиче тілірапануй" + - " тіліраротонган тіліромбо тіліарумын тіліруа тілісандаве тіліякут тіліса" + - "мбуру тілісантали тілінгамбай тілісангу тілісицилия тілішотланд тіліоңт" + - "үстік күрд тілісена тілікойраборо сенни тіліташелхит тілішан тіліоңтүст" + - "ік саам тілілуле саам тіліинари саам тіліколтта саам тілісонинке тіліср" + - "анан тонго тілісахо тілісукума тілікомор тілісирия тілітемне тілітесо т" + - "ілітетум тілітигре тіліклингон тіліток-писин тілітароко тілітумбука тіл" + - "ітувалу тілітасавак тілітувин тіліорталық атлас тамазигхт тіліудмурт ті" + - "ліумбунду тіліата тілвай тілівунджо тілівальзер тіліволайта тіліварай т" + - "ілівальбири тіліқалмақ тілісога тіліянгбен тілійемба тілікантон тілімар" + - "окколық стандартты тамазигхт тілізуни тілітілдік мазмұны жоқзаза тіліқа" + - "зіргі стандартты араб тіліағылшын тілі (АҚШ)төменгі саксон тіліфламанд " + - "тілімолдован тілісерб-хорват тіліконго суахили тіліжеңілдетілген қытай " + - "тілідәстүрлі қытай тілі" - -var kkLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0011, 0x0024, 0x0024, 0x003f, 0x0050, 0x0063, 0x0078, - 0x0089, 0x009c, 0x00ad, 0x00c2, 0x00df, 0x00f6, 0x010f, 0x0124, - 0x013b, 0x0152, 0x0167, 0x017a, 0x018f, 0x01a4, 0x01bb, 0x01ce, - 0x01e5, 0x01fc, 0x01fc, 0x020b, 0x0233, 0x0246, 0x025b, 0x026a, - 0x027d, 0x0292, 0x02aa, 0x02b9, 0x02ca, 0x02e1, 0x02fc, 0x030f, - 0x0322, 0x0333, 0x0346, 0x0357, 0x0366, 0x0379, 0x038c, 0x03a3, - 0x03bf, 0x03d4, 0x03e5, 0x03fc, 0x0413, 0x042e, 0x043d, 0x0450, - 0x0463, 0x0476, 0x0476, 0x048b, 0x049e, 0x04b1, 0x04c4, 0x04d9, - // Entry 40 - 7F - 0x04f8, 0x0513, 0x0532, 0x0543, 0x055b, 0x055b, 0x056a, 0x057f, - 0x0596, 0x05b1, 0x05c4, 0x05d3, 0x05e8, 0x05e8, 0x05fd, 0x0616, - 0x0629, 0x0646, 0x0659, 0x0670, 0x0683, 0x0698, 0x06ad, 0x06be, - 0x06cf, 0x06e0, 0x06f5, 0x0708, 0x0725, 0x0738, 0x074f, 0x0766, - 0x0777, 0x078a, 0x07aa, 0x07bd, 0x07d6, 0x07ed, 0x0800, 0x0817, - 0x0830, 0x0845, 0x085c, 0x086f, 0x0884, 0x0897, 0x08aa, 0x08d4, - 0x08e7, 0x08fc, 0x0917, 0x0945, 0x0971, 0x0999, 0x09ae, 0x09c5, - 0x09dc, 0x09dc, 0x09ef, 0x0a00, 0x0a15, 0x0a2c, 0x0a2c, 0x0a3f, - // Entry 80 - BF - 0x0a52, 0x0a6b, 0x0a7e, 0x0a93, 0x0aa6, 0x0ab9, 0x0aca, 0x0ae9, - 0x0b02, 0x0b17, 0x0b2c, 0x0b50, 0x0b63, 0x0b78, 0x0b8d, 0x0ba2, - 0x0bb5, 0x0bc6, 0x0bdb, 0x0bee, 0x0bff, 0x0c12, 0x0c27, 0x0c3c, - 0x0c4d, 0x0c64, 0x0c77, 0x0c8c, 0x0c9f, 0x0cae, 0x0cc7, 0x0ce0, - 0x0cf5, 0x0d0a, 0x0d1d, 0x0d32, 0x0d45, 0x0d58, 0x0d6b, 0x0d80, - 0x0d91, 0x0da4, 0x0db7, 0x0dce, 0x0de5, 0x0dfa, 0x0e0d, 0x0e20, - 0x0e31, 0x0e46, 0x0e46, 0x0e59, 0x0e6a, 0x0e7b, 0x0e7b, 0x0e92, - 0x0ea7, 0x0ea7, 0x0ea7, 0x0eba, 0x0ecb, 0x0ecb, 0x0ecb, 0x0ede, - // Entry C0 - FF - 0x0ede, 0x0f02, 0x0f02, 0x0f17, 0x0f17, 0x0f2c, 0x0f2c, 0x0f43, - 0x0f43, 0x0f43, 0x0f43, 0x0f43, 0x0f43, 0x0f52, 0x0f52, 0x0f69, - 0x0f69, 0x0f7e, 0x0f7e, 0x0f8f, 0x0f8f, 0x0fa0, 0x0fa0, 0x0fa0, - 0x0fa0, 0x0fa0, 0x0fb3, 0x0fb3, 0x0fc4, 0x0fc4, 0x0fc4, 0x0fe4, - 0x0fff, 0x0fff, 0x1010, 0x1010, 0x1010, 0x1027, 0x1027, 0x1027, - 0x1027, 0x1027, 0x1038, 0x1038, 0x1038, 0x104b, 0x104b, 0x105c, - 0x105c, 0x105c, 0x105c, 0x105c, 0x105c, 0x1073, 0x1084, 0x1084, - 0x1084, 0x1095, 0x10a6, 0x10a6, 0x10b9, 0x10b9, 0x10ce, 0x10e1, - // Entry 100 - 13F - 0x10f6, 0x10f6, 0x10f6, 0x10f6, 0x111e, 0x111e, 0x1133, 0x1148, - 0x115b, 0x115b, 0x115b, 0x1170, 0x1170, 0x1183, 0x1183, 0x11a7, - 0x11a7, 0x11ba, 0x11ba, 0x11cd, 0x11cd, 0x11e2, 0x11f3, 0x1204, - 0x1204, 0x1204, 0x121b, 0x121b, 0x121b, 0x121b, 0x1230, 0x1230, - 0x1230, 0x1249, 0x1249, 0x1258, 0x1258, 0x1258, 0x1258, 0x1258, - 0x1258, 0x1258, 0x126d, 0x127a, 0x128f, 0x128f, 0x128f, 0x128f, - 0x128f, 0x12a0, 0x12b9, 0x12b9, 0x12b9, 0x12b9, 0x12b9, 0x12b9, - 0x12d4, 0x12d4, 0x12d4, 0x12d4, 0x1300, 0x1300, 0x1300, 0x1313, - // Entry 140 - 17F - 0x1328, 0x1328, 0x1328, 0x133d, 0x133d, 0x135a, 0x135a, 0x136d, - 0x1391, 0x1391, 0x13a2, 0x13b3, 0x13c8, 0x13db, 0x13ee, 0x13ee, - 0x13ee, 0x1403, 0x1418, 0x142d, 0x142d, 0x142d, 0x142d, 0x142d, - 0x1440, 0x1453, 0x1462, 0x1475, 0x1475, 0x148e, 0x148e, 0x149f, - 0x14b6, 0x14d7, 0x14d7, 0x14e8, 0x14e8, 0x14fb, 0x14fb, 0x1517, - 0x1517, 0x1517, 0x1528, 0x1541, 0x155a, 0x1578, 0x158f, 0x158f, - 0x15a4, 0x15c8, 0x15c8, 0x15c8, 0x15dd, 0x15f0, 0x1607, 0x161a, - 0x162d, 0x1640, 0x1640, 0x1655, 0x1668, 0x1668, 0x1668, 0x167d, - // Entry 180 - 1BF - 0x167d, 0x167d, 0x167d, 0x1692, 0x1692, 0x1692, 0x16a3, 0x16c7, - 0x16c7, 0x16e3, 0x16e3, 0x16f6, 0x1705, 0x1716, 0x1729, 0x1729, - 0x1729, 0x173c, 0x173c, 0x1751, 0x176a, 0x1781, 0x1781, 0x1794, - 0x1794, 0x17a7, 0x17a7, 0x17ba, 0x17cb, 0x17e4, 0x17e4, 0x1804, - 0x1815, 0x182a, 0x1849, 0x1849, 0x1862, 0x1877, 0x188a, 0x188a, - 0x18a1, 0x18b6, 0x18c7, 0x18dc, 0x18dc, 0x18dc, 0x18dc, 0x18ef, - 0x190c, 0x190c, 0x1929, 0x193a, 0x195c, 0x196f, 0x1980, 0x1991, - 0x1991, 0x19a6, 0x19bf, 0x19d2, 0x19d2, 0x19d2, 0x19e1, 0x1a05, - // Entry 1C0 - 1FF - 0x1a16, 0x1a16, 0x1a16, 0x1a2f, 0x1a2f, 0x1a2f, 0x1a2f, 0x1a2f, - 0x1a4c, 0x1a4c, 0x1a65, 0x1a82, 0x1a95, 0x1a95, 0x1abf, 0x1abf, - 0x1abf, 0x1abf, 0x1abf, 0x1abf, 0x1abf, 0x1abf, 0x1abf, 0x1ad6, - 0x1ad6, 0x1ae7, 0x1ae7, 0x1ae7, 0x1afe, 0x1b1b, 0x1b1b, 0x1b1b, - 0x1b2e, 0x1b2e, 0x1b2e, 0x1b2e, 0x1b2e, 0x1b43, 0x1b52, 0x1b69, - 0x1b7a, 0x1b7a, 0x1b91, 0x1b91, 0x1ba8, 0x1ba8, 0x1bbf, 0x1bd2, - 0x1be9, 0x1c00, 0x1c00, 0x1c22, 0x1c22, 0x1c33, 0x1c33, 0x1c33, - 0x1c59, 0x1c59, 0x1c59, 0x1c72, 0x1c81, 0x1c81, 0x1c81, 0x1c81, - // Entry 200 - 23F - 0x1c81, 0x1ca3, 0x1cbd, 0x1cd9, 0x1cf7, 0x1d0e, 0x1d0e, 0x1d2e, - 0x1d2e, 0x1d3f, 0x1d3f, 0x1d54, 0x1d54, 0x1d54, 0x1d67, 0x1d67, - 0x1d7a, 0x1d7a, 0x1d7a, 0x1d8d, 0x1d9e, 0x1d9e, 0x1db1, 0x1dc4, - 0x1dc4, 0x1dc4, 0x1dc4, 0x1ddb, 0x1ddb, 0x1ddb, 0x1ddb, 0x1ddb, - 0x1df5, 0x1df5, 0x1e0a, 0x1e0a, 0x1e0a, 0x1e0a, 0x1e21, 0x1e36, - 0x1e4d, 0x1e60, 0x1e95, 0x1eaa, 0x1eaa, 0x1ec1, 0x1ece, 0x1edd, - 0x1edd, 0x1edd, 0x1edd, 0x1edd, 0x1edd, 0x1edd, 0x1ef2, 0x1f09, - 0x1f20, 0x1f33, 0x1f33, 0x1f4c, 0x1f4c, 0x1f61, 0x1f61, 0x1f72, - // Entry 240 - 27F - 0x1f72, 0x1f72, 0x1f87, 0x1f9a, 0x1f9a, 0x1faf, 0x1faf, 0x1faf, - 0x1faf, 0x1faf, 0x1ff4, 0x2005, 0x2027, 0x2038, 0x206d, 0x206d, - 0x206d, 0x206d, 0x206d, 0x206d, 0x206d, 0x208d, 0x208d, 0x208d, - 0x208d, 0x208d, 0x208d, 0x208d, 0x20b1, 0x20c8, 0x20c8, 0x20c8, - 0x20e1, 0x20ff, 0x2121, 0x214f, 0x2173, -} // Size: 1250 bytes - -const kmLangStr string = "" + // Size: 8834 bytes - "អាហ្វារអាប់ខាហ៊្សានអាវេស្ថានអាហ្វ្រិកានអាកានអំហារិកអារ៉ាហ្គោនអារ៉ាប់អាសា" + - "មីសអាវ៉ារីកអីម៉ារ៉ាអាស៊ែបៃហ្សង់បាស្គៀបេឡារុស្សប៊ុលហ្គារីប៊ីស្លាម៉ាបាម្" + - "បារាបង់ក្លាដែសទីបេប្រីស្តុនបូស្នីកាតាឡានឈីឆេនឈីម៉ូរ៉ូកូស៊ីខានឆេកឈឺជស្ល" + - "ាវិកឈូវ៉ាសវេលដាណឺម៉ាកអាល្លឺម៉ង់ឌីវីហ៊ីដុងខាអ៊ីវក្រិកអង់គ្លេសអេស្ពេរ៉ាន" + - "់តូអេស្ប៉ាញអេស្តូនីបាសខ៍ភឺសៀនហ្វ៊ូឡាហ្វាំងឡង់ហ៊្វីជីហ្វារូសបារាំងហ្វ្រ" + - "ីស៊ានខាងលិចអៀរឡង់ស្កុតហ្កែលិគហ្គាលីស្យានហ្គូរ៉ានីហ្កុយ៉ារាទីមេនហូសាអ៊ី" + - "ស្រាអែលហិណ្ឌីក្រូអាតហៃទីហុងគ្រីអាមេនីហឺរីរ៉ូឥណ្ឌូណេស៊ីអ៊ីកបូស៊ីឈាន់យីអ" + - "៊ីដូអ៊ីស្លង់អ៊ីតាលីអ៊ីនុកទីទុតជប៉ុនជ្វាហ្សក\u200bហ្ស៊ីគីគូយូគូនយ៉ាម៉ាក" + - "ាហ្សាក់កាឡាលលីស៊ុតខ្មែរខាណាដាកូរ៉េកានូរីកាស្មៀរឃឺដកូមីកូនីស\u200bកៀហ្ស" + - "៊ីសឡាតំាងលុចហ្សំបួរហ្គាន់ដាលីមប៊ូសលីនកាឡាឡាវលីទុយអានីលូបាកាតានហ្គាឡាតវ" + - "ីម៉ាឡាហ្គាស៊ីម៉ាស់សលម៉ោរីម៉ាសេដូនីម៉ាឡាយ៉ាឡាមម៉ុងហ្គោលីម៉ារ៉ាធីម៉ាឡេម៉" + - "ាល់តាភូមាណូរូនេបេលេខាងជើងនេប៉ាល់នុនហ្គាហូឡង់ន័រវែស នីនូសន័រវែស បុកម៉ាល" + - "់នេប៊េលខាងត្បូងណាវ៉ាចូណានចាអូសីតាន់អូរ៉ូម៉ូអូឌៀអូស៊ីទិកបឹនជាពិប៉ូឡូញបា" + - "ស្តូព័រទុយហ្គាល់ហ្គិកឈួរ៉ូម៉ង់រូន្ឌីរូម៉ានីរុស្ស៊ីគិនយ៉ាវ៉ាន់ដាសំស្ក្រ" + - "ឹតសាឌីនាស៊ីនឌីសាមីខាងជើងសានហ្គោស្រីលង្កាស្លូវ៉ាគីស្លូវ៉ានីភាសាសាមូអាសូ" + - "ណាសូម៉ាលីអាល់បានីស៊ែបស្វាទីសូថូខាងត្បូងស៊ូដង់ស៊ុយអែតស្វាហ៊ីលីតាមីលតេលុ" + - "គុតាហ្ស៊ីគថៃទីហ្គ្រីញ៉ាតួកម៉េនស្វាណាតុងហ្គាទួរគីសុងហ្គាតាតាតាហ៊ីទីអ៊ុយ" + - "ហ្គឺរអ៊ុយក្រែនអ៊ូរឌូអ៊ូសបេគវេនដាវៀតណាមវូឡាពូកវ៉ាលូនវូឡុហ្វឃសាយីឌីហ្សយរ" + - "ូបាហ្សួងចិនសូលូអាកហ៊ីនឺសអាដេងមីអាឌីហ្គីអាហ្គីមអាយនូអាលូតអាល់តៃខាងត្បូង" + - "អាហ្គីកាម៉ាពូឈីអារ៉ាប៉ាហូអាស៊ូអាស្ទូរីអាវ៉ាឌីបាលីបាសាបេមបាបេណាបាឡូជីខា" + - "ងលិចបូចពូរីប៊ីនីស៊ីកស៊ីកាបូដូប៊ុកហ្គីប្ល៊ីនស៊ីប៊ូអាណូឈីហ្គាឈូគីម៉ារីឆុ" + - "កតាវឆេរូគីឈីយីនីឃឺដកណ្ដាលសេសេលវ៉ាគ្រីអូល (បារាំង)ដាកូតាដាចវ៉ាតៃតាដូគ្រ" + - "ីបហ្សាម៉ាសូប៊ីក្រោមឌួលឡាចូឡាហ៊្វុនយីដាហ្សាហ្គាអេមប៊ូអ៊ីហ្វិកអ៊ីកាជុកអ៊" + - "ីវ៉ុនដូហ្វីលីពីនហ្វ៊ុនហ៊្វ្រូលានហ្គាកាគូសជីសហ្គីលបឺទហ្គូរុនតាឡូអាល្លឺម" + - "៉ង (ស្វីស)ហ្គូស៊ីហ្គីចឈីនហាវៃហ៊ីលីហ្គេណុនម៉ុងសូប៊ីលើហ៊ូប៉ាអ៊ីបានអាយប៊ី" + - "ប៊ីអូអ៊ីឡូកូអ៊ិនហ្គូសលុចបានងុំបាម៉ាឆាំកាប៊ីឡេកាឈីនជូកាំបាកាបាឌៀយ៉ាប់ម៉" + - "ាកូនដេកាប៊ូវឺឌៀនូគូរូកាស៊ីគុយរ៉ាឈីនីកាកូកាលែនជីនគីមប៊ុនឌូគូមីភឹមយ៉ាគគុ" + - "នកានីគ្លីបការ៉ាឆាយបាល់កាការីលាគូរូកសាមបាឡាបាហ្វៀកូឡូញគូមីគឡាឌីណូឡានហ្គ" + - "ីឡេសហ្គីឡាកូតាឡូហ្ស៊ីលូរីខាងជើងលូបាលូឡាលុនដាលូអូមីហ្សូលូយ៉ាម៉ាឌូរីសម៉ា" + - "ហ្គាហ៊ីម៉ៃធីលីម៉ាកាសាម៉ាសៃមុខសាមេនឌីមេរូម៉ូរីស៊ីនម៉ាកគូវ៉ាមីតូមេតាមិកម" + - "េកមីណាងកាប៊ូម៉ានីពូរីម៊ូហាគមូស៊ីមុនដាងពហុភាសាគ្រីកមីរ៉ានដេសអឺហ្ស៊ីយ៉ាម" + - "៉ាហ្សានដឺរេនីនាប៉ូលីតានណាម៉ាអាល្លឺម៉ង់ក្រោមនេវ៉ាវីនីអាសនូអៀនក្វាស្យូងៀ" + - "មប៊ូនណូហ្គៃនគោសូថូខាងជើងនូអ័រណានកូលេភេនហ្គាស៊ីណានផាមភេនហ្គាប៉ាប៉ៃមេនតូ" + - "ប៉ាលូអានភាសាទំនាក់ទំនងនីហ្សេរីយ៉ាព្រូស៊ានគីចឈីរ៉ាប៉ានូរ៉ារ៉ូតុងហ្គានរុ" + - "មបូអារ៉ូម៉ានីរ៉្វាសានដាវីសាខាសាមបូរូសានតាលីងាំបេយសានហ្គូស៊ីស៊ីលានស្កុត" + - "ឃឺដខាងត្បូងស៊ីណាគុយរ៉ាបូរ៉ុស៊ីនីតាឈីលហ៊ីតសានសាមីខាងត្បូងលូលីសាមីអ៊ីណារ" + - "ីសាម៉ីស្កុលសាមីសូនីនគេស្រាណានតុងហ្គោសាហូស៊ូគូម៉ាកូម៉ូរីស៊ីរៀគធីមនីតេសូ" + - "ទីទុំធីហ្គ្រាឃ្លីនហ្គុនថុកពីស៊ីនតារ៉ូកូទុមប៊ូកាទូវ៉ាលូតាសាវ៉ាក់ទូវីនៀត" + - "ាម៉ាសាយអាត្លាសកណ្តាលអាត់មូដអាម់ប៊ុនឌូរូតវៃវុនចូវេលសឺវ៉ូឡាយតាវ៉ារេយវ៉ារ" + - "ីប៉ារីកាលមីគសូហ្គាយ៉ាងបេនយេមបាកន្តាំងតាម៉ាហ្សៃម៉ារ៉ុកស្តង់ដាហ្សូនីគ្មា" + - "ន\u200bទិន្នន័យ\u200bភាសាហ្សាហ្សាអារ៉ាប់ផ្លូវការអេស្ប៉ាញ (អ៊ឺរ៉ុប)ហ្សា" + - "ក់ស្យុងក្រោមផ្លាមីសព័រទុយហ្គាល់ (អឺរ៉ុប)ម៉ុលដាវីសឺបូក្រូអាតកុងហ្គោស្វា" + - "ហ៊ីលីចិន\u200bអក្សរ\u200bកាត់ចិន\u200bអក្សរ\u200bពេញ" - -var kmLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0015, 0x0039, 0x0054, 0x0075, 0x0084, 0x0099, 0x00b7, - 0x00cc, 0x00e1, 0x00f9, 0x0111, 0x0135, 0x0147, 0x0162, 0x0180, - 0x019e, 0x01b6, 0x01d4, 0x01e0, 0x01fb, 0x020d, 0x0222, 0x0231, - 0x0249, 0x0261, 0x0261, 0x026a, 0x0288, 0x029a, 0x02a3, 0x02bb, - 0x02d9, 0x02ee, 0x02fd, 0x0309, 0x0318, 0x0330, 0x0357, 0x036f, - 0x0387, 0x0396, 0x03a5, 0x03ba, 0x03d5, 0x03ea, 0x03ff, 0x0411, - 0x0441, 0x0453, 0x0477, 0x0498, 0x04b3, 0x04d4, 0x04dd, 0x04e9, - 0x0507, 0x0519, 0x0519, 0x052e, 0x053a, 0x054f, 0x0561, 0x0576, - // Entry 40 - 7F - 0x0576, 0x0594, 0x0594, 0x05a6, 0x05c1, 0x05c1, 0x05d0, 0x05e8, - 0x05fd, 0x061e, 0x062d, 0x0639, 0x0657, 0x0657, 0x0669, 0x0684, - 0x069c, 0x06bd, 0x06cc, 0x06de, 0x06ed, 0x06ff, 0x0714, 0x071d, - 0x0729, 0x0738, 0x0753, 0x0765, 0x0783, 0x079b, 0x07b0, 0x07c5, - 0x07ce, 0x07e9, 0x0810, 0x081f, 0x0843, 0x0858, 0x0867, 0x0882, - 0x08a3, 0x08c1, 0x08d9, 0x08e8, 0x08fd, 0x0909, 0x0915, 0x0939, - 0x094e, 0x0963, 0x0972, 0x0994, 0x09bf, 0x09e9, 0x09fe, 0x0a0d, - 0x0a25, 0x0a25, 0x0a3d, 0x0a49, 0x0a61, 0x0a76, 0x0a76, 0x0a88, - // Entry 80 - BF - 0x0a9a, 0x0abe, 0x0ad3, 0x0ae8, 0x0afa, 0x0b0f, 0x0b24, 0x0b4b, - 0x0b66, 0x0b78, 0x0b8a, 0x0ba8, 0x0bbd, 0x0bd8, 0x0bf3, 0x0c0e, - 0x0c2c, 0x0c38, 0x0c4d, 0x0c65, 0x0c71, 0x0c83, 0x0ca7, 0x0cb9, - 0x0cce, 0x0ce9, 0x0cf8, 0x0d0a, 0x0d22, 0x0d28, 0x0d49, 0x0d5e, - 0x0d70, 0x0d85, 0x0d94, 0x0da9, 0x0db5, 0x0dca, 0x0de5, 0x0e00, - 0x0e12, 0x0e27, 0x0e36, 0x0e48, 0x0e5d, 0x0e6f, 0x0e84, 0x0e8d, - 0x0ea2, 0x0eb1, 0x0ec0, 0x0ec9, 0x0ed5, 0x0ef0, 0x0ef0, 0x0f05, - 0x0f1d, 0x0f1d, 0x0f1d, 0x0f32, 0x0f41, 0x0f41, 0x0f41, 0x0f50, - // Entry C0 - FF - 0x0f50, 0x0f7a, 0x0f7a, 0x0f92, 0x0f92, 0x0fa7, 0x0fa7, 0x0fc5, - 0x0fc5, 0x0fc5, 0x0fc5, 0x0fc5, 0x0fc5, 0x0fd4, 0x0fd4, 0x0fec, - 0x0fec, 0x1001, 0x1001, 0x100d, 0x100d, 0x1019, 0x1019, 0x1019, - 0x1019, 0x1019, 0x1028, 0x1028, 0x1034, 0x1034, 0x1034, 0x1058, - 0x106d, 0x106d, 0x107c, 0x107c, 0x107c, 0x1097, 0x1097, 0x1097, - 0x1097, 0x1097, 0x10a3, 0x10a3, 0x10a3, 0x10bb, 0x10bb, 0x10cd, - 0x10cd, 0x10cd, 0x10cd, 0x10cd, 0x10cd, 0x10eb, 0x10fd, 0x10fd, - 0x10fd, 0x1109, 0x1118, 0x1118, 0x112a, 0x112a, 0x113c, 0x114e, - // Entry 100 - 13F - 0x1169, 0x1169, 0x1169, 0x1169, 0x11ab, 0x11ab, 0x11bd, 0x11cf, - 0x11db, 0x11db, 0x11db, 0x11f0, 0x11f0, 0x1205, 0x1205, 0x1223, - 0x1223, 0x1232, 0x1232, 0x1256, 0x1256, 0x1274, 0x1286, 0x129e, - 0x129e, 0x129e, 0x12b6, 0x12b6, 0x12b6, 0x12b6, 0x12d1, 0x12d1, - 0x12d1, 0x12ec, 0x12ec, 0x12fe, 0x12fe, 0x12fe, 0x12fe, 0x12fe, - 0x12fe, 0x12fe, 0x131c, 0x1328, 0x1337, 0x1337, 0x1337, 0x1337, - 0x1337, 0x1340, 0x1358, 0x1358, 0x1358, 0x1358, 0x1358, 0x1358, - 0x1379, 0x1379, 0x1379, 0x1379, 0x13a6, 0x13a6, 0x13a6, 0x13bb, - // Entry 140 - 17F - 0x13d3, 0x13d3, 0x13d3, 0x13df, 0x13df, 0x1403, 0x1403, 0x140f, - 0x1424, 0x1424, 0x1436, 0x1448, 0x1469, 0x147e, 0x1499, 0x1499, - 0x1499, 0x14ab, 0x14ba, 0x14cc, 0x14cc, 0x14cc, 0x14cc, 0x14cc, - 0x14e1, 0x14f0, 0x14f6, 0x1505, 0x1505, 0x1517, 0x1517, 0x1526, - 0x153e, 0x155f, 0x155f, 0x156b, 0x156b, 0x157a, 0x157a, 0x1598, - 0x1598, 0x1598, 0x15a4, 0x15bc, 0x15d7, 0x15f8, 0x160d, 0x160d, - 0x161c, 0x1646, 0x1646, 0x1646, 0x1658, 0x1667, 0x167c, 0x168e, - 0x169d, 0x16ac, 0x16ac, 0x16be, 0x16d3, 0x16d3, 0x16d3, 0x16e8, - // Entry 180 - 1BF - 0x16e8, 0x16e8, 0x16e8, 0x16fa, 0x16fa, 0x16fa, 0x170f, 0x172d, - 0x172d, 0x1745, 0x1745, 0x1754, 0x1760, 0x1772, 0x1781, 0x1781, - 0x1781, 0x1799, 0x1799, 0x17b7, 0x17cc, 0x17e1, 0x17e1, 0x17f0, - 0x17f0, 0x17ff, 0x17ff, 0x180e, 0x181a, 0x1835, 0x1835, 0x185c, - 0x1868, 0x187a, 0x1898, 0x1898, 0x18b3, 0x18c5, 0x18d4, 0x18d4, - 0x18e6, 0x18fb, 0x190a, 0x1925, 0x1925, 0x1925, 0x1925, 0x1943, - 0x196d, 0x196d, 0x198b, 0x199a, 0x19c7, 0x19dc, 0x19eb, 0x19fa, - 0x19fa, 0x1a12, 0x1a27, 0x1a39, 0x1a39, 0x1a39, 0x1a42, 0x1a60, - // Entry 1C0 - 1FF - 0x1a6f, 0x1a6f, 0x1a6f, 0x1a84, 0x1a84, 0x1a84, 0x1a84, 0x1a84, - 0x1aab, 0x1aab, 0x1ac9, 0x1aea, 0x1b02, 0x1b02, 0x1b4d, 0x1b4d, - 0x1b4d, 0x1b4d, 0x1b4d, 0x1b4d, 0x1b4d, 0x1b4d, 0x1b4d, 0x1b65, - 0x1b65, 0x1b74, 0x1b74, 0x1b74, 0x1b8c, 0x1bb6, 0x1bb6, 0x1bb6, - 0x1bc5, 0x1bc5, 0x1bc5, 0x1bc5, 0x1bc5, 0x1be3, 0x1bf2, 0x1c07, - 0x1c13, 0x1c13, 0x1c28, 0x1c28, 0x1c3d, 0x1c3d, 0x1c4f, 0x1c64, - 0x1c7f, 0x1c8e, 0x1c8e, 0x1caf, 0x1caf, 0x1cbe, 0x1cbe, 0x1cbe, - 0x1cee, 0x1cee, 0x1cee, 0x1d09, 0x1d12, 0x1d12, 0x1d12, 0x1d12, - // Entry 200 - 23F - 0x1d12, 0x1d36, 0x1d4e, 0x1d72, 0x1d8d, 0x1da2, 0x1da2, 0x1dcc, - 0x1dcc, 0x1dd8, 0x1dd8, 0x1df0, 0x1df0, 0x1df0, 0x1e05, 0x1e05, - 0x1e17, 0x1e17, 0x1e17, 0x1e26, 0x1e32, 0x1e32, 0x1e41, 0x1e59, - 0x1e59, 0x1e59, 0x1e59, 0x1e77, 0x1e77, 0x1e77, 0x1e77, 0x1e77, - 0x1e92, 0x1e92, 0x1ea7, 0x1ea7, 0x1ea7, 0x1ea7, 0x1ebf, 0x1ed4, - 0x1eef, 0x1f01, 0x1f40, 0x1f55, 0x1f55, 0x1f73, 0x1f7c, 0x1f82, - 0x1f82, 0x1f82, 0x1f82, 0x1f82, 0x1f82, 0x1f82, 0x1f91, 0x1fa0, - 0x1fb8, 0x1fca, 0x1fca, 0x1fe8, 0x1fe8, 0x1ffa, 0x1ffa, 0x200c, - // Entry 240 - 27F - 0x200c, 0x200c, 0x2021, 0x2030, 0x2030, 0x2045, 0x2045, 0x2045, - 0x2045, 0x2045, 0x208a, 0x209c, 0x20d5, 0x20ed, 0x211a, 0x211a, - 0x211a, 0x211a, 0x211a, 0x211a, 0x211a, 0x211a, 0x211a, 0x214a, - 0x214a, 0x214a, 0x214a, 0x214a, 0x217a, 0x218f, 0x218f, 0x21c8, - 0x21e0, 0x2201, 0x2231, 0x225b, 0x2282, -} // Size: 1250 bytes - -const knLangStr string = "" + // Size: 12261 bytes - "ಅಫಾರ್ಅಬ್ಖಾಜಿಯನ್ಅವೆಸ್ಟನ್ಆಫ್ರಿಕಾನ್ಸ್ಅಕಾನ್ಅಂಹರಿಕ್ಅರಗೊನೀಸ್ಅರೇಬಿಕ್ಅಸ್ಸಾಮೀಸ್ಅವ" + - "ರಿಕ್ಅಯ್ಮಾರಾಅಜೆರ್ಬೈಜಾನಿಬಶ್ಕಿರ್ಬೆಲರೂಸಿಯನ್ಬಲ್ಗೇರಿಯನ್ಬಿಸ್ಲಾಮಾಬಂಬಾರಾಬಾಂಗ್ಲಾ" + - "ಟಿಬೇಟಿಯನ್ಬ್ರೆಟನ್ಬೋಸ್ನಿಯನ್ಕೆಟಲಾನ್ಚೆಚನ್ಕಮೊರೊಕೋರ್ಸಿಕನ್ಕ್ರೀಜೆಕ್ಚರ್ಚ್ ಸ್ಲಾವ" + - "ಿಕ್ಚುವಾಶ್ವೆಲ್ಶ್ಡ್ಯಾನಿಶ್ಜರ್ಮನ್ದಿವೆಹಿಜೋಂಗ್\u200cಖಾಈವ್ಗ್ರೀಕ್ಇಂಗ್ಲೀಷ್ಎಸ್ಪೆ" + - "ರಾಂಟೊಸ್ಪ್ಯಾನಿಷ್ಎಸ್ಟೊನಿಯನ್ಬಾಸ್ಕ್ಪರ್ಶಿಯನ್ಫುಲಾಹ್ಫಿನ್ನಿಶ್ಫಿಜಿಯನ್ಫರೋಸಿಫ್ರೆಂ" + - "ಚ್ಪಶ್ಚಿಮ ಫ್ರಿಸಿಯನ್ಐರಿಷ್ಸ್ಕಾಟಿಶ್ ಗ್ಯಾಲಿಕ್ಗ್ಯಾಲಿಶಿಯನ್ಗೌರಾನಿಗುಜರಾತಿಮ್ಯಾಂಕ" + - "್ಸ್ಹೌಸಾಹೀಬ್ರ್ಯೂಹಿಂದಿಹಿರಿ ಮೊಟುಕ್ರೊಯೇಶಿಯನ್ಹೈಷಿಯನ್ ಕ್ರಿಯೋಲ್ಹಂಗೇರಿಯನ್ಅರ್ಮೇ" + - "ನಿಯನ್ಹೆರೆರೊಇಂಟರ್\u200cಲಿಂಗ್ವಾಇಂಡೋನೇಶಿಯನ್ಇಂಟರ್ಲಿಂಗ್ಇಗ್ಬೊಸಿಚುಅನ್ ಯಿಇನುಪಿ" + - "ಯಾಕ್ಇಡೊಐಸ್ಲಾಂಡಿಕ್ಇಟಾಲಿಯನ್ಇನುಕ್ಟಿಟುಟ್ಜಾಪನೀಸ್ಜಾವಾನೀಸ್ಜಾರ್ಜಿಯನ್ಕಾಂಗೋಕಿಕುಯ" + - "ುಕ್ವಾನ್\u200cಯಾಮಾಕಝಕ್ಕಲಾಲ್ಲಿಸುಟ್ಖಮೇರ್ಕನ್ನಡಕೊರಿಯನ್ಕನುರಿಕಾಶ್ಮೀರಿಕುರ್ದಿಷ್" + - "ಕೋಮಿಕಾರ್ನಿಷ್ಕಿರ್ಗಿಜ್ಲ್ಯಾಟಿನ್ಲಕ್ಸಂಬರ್ಗಿಷ್ಗಾಂಡಾಲಿಂಬರ್ಗಿಶ್ಲಿಂಗಾಲಲಾವೋಲಿಥುವ" + - "ೇನಿಯನ್ಲೂಬಾ-ಕಟಾಂಗಾಲಟ್ವಿಯನ್ಮಲಗಾಸಿಮಾರ್ಶಲ್ಲೀಸ್ಮಾವೋರಿಮೆಸಿಡೋನಿಯನ್ಮಲಯಾಳಂಮಂಗೋಲ" + - "ಿಯನ್ಮರಾಠಿಮಲಯ್ಮಾಲ್ಟೀಸ್ಬರ್ಮೀಸ್ನೌರುಉತ್ತರ ದೆಬೆಲೆನೇಪಾಳಿಡೋಂಗಾಡಚ್ನಾರ್ವೇಜಿಯನ್ " + - "ನೈನಾರ್ಸ್ಕ್ನಾರ್ವೆಜಿಯನ್ ಬೊಕ್ಮಲ್ದಕ್ಷಿಣ ದೆಬೆಲೆನವಾಜೊನ್ಯಾಂಜಾಒಸಿಟನ್ಒಜಿಬ್ವಾಓರೊ" + - "ಮೋಒರಿಯಾಒಸ್ಸೆಟಿಕ್ಪಂಜಾಬಿಪಾಲಿಪಾಲಿಷ್ಪಾಷ್ಟೋಪೋರ್ಚುಗೀಸ್ಕ್ವೆಚುವಾರೊಮಾನ್ಷ್ರುಂಡಿರ" + - "ೊಮೇನಿಯನ್ರಷ್ಯನ್ಕೀನ್ಯಾರುವಾಂಡಾಸಂಸ್ಕೃತಸರ್ಡೀನಿಯನ್ಸಿಂಧಿಉತ್ತರ ಸಾಮಿಸಾಂಗೋಸಿಂಹಳಸ" + - "್ಲೋವಾಕ್ಸ್ಲೋವೇನಿಯನ್ಸಮೋವನ್ಶೋನಾಸೊಮಾಲಿಅಲ್ಬೇನಿಯನ್ಸರ್ಬಿಯನ್ಸ್ವಾತಿದಕ್ಷಿಣ ಸೋಥೋಸ" + - "ುಂಡಾನೀಸ್ಸ್ವೀಡಿಷ್ಸ್ವಹಿಲಿತಮಿಳುತೆಲುಗುತಾಜಿಕ್ಥಾಯ್ಟಿಗ್ರಿನ್ಯಾಟರ್ಕ್\u200cಮೆನ್ಸ" + - "್ವಾನಾಟೋಂಗನ್ಟರ್ಕಿಶ್ಸೋಂಗಾಟಾಟರ್ಟಹೀಟಿಯನ್ಉಯಿಘರ್ಉಕ್ರೈನಿಯನ್ಉರ್ದುಉಜ್ಬೇಕ್ವೆಂಡಾವ" + - "ಿಯೇಟ್ನಾಮೀಸ್ವೋಲಾಪುಕ್ವಾಲೂನ್ವೋಲೋಫ್ಕ್ಸೋಸಯಿಡ್ಡಿಶ್ಯೊರುಬಾಝೂವಾಂಗ್ಚೈನೀಸ್ಜುಲುಅಛಿ" + - "ನೀಸ್ಅಕೋಲಿಅಡಂಗ್ಮೆಅಡೈಘೆಆಫ್ರಿಹಿಲಿಅಘೆಮ್ಐನುಅಕ್ಕಾಡಿಯನ್ಅಲೆಯುಟ್ದಕ್ಷಿಣ ಅಲ್ಟಾಯ್ಪ" + - "್ರಾಚೀನ ಇಂಗ್ಲೀಷ್ಆಂಗಿಕಾಅರಾಮಿಕ್ಮಪುಚೆಅರಪಾಹೋಅರಾವಾಕ್ಅಸುಆಸ್ಟುರಿಯನ್ಅವಧಿಬಲೂಚಿಬಲ" + - "ಿನೀಸ್ಬಸಾಬೇಜಾಬೆಂಬಾಬೆನಪಶ್ಚಿಮ ಬಲೊಚಿಭೋಜಪುರಿಬಿಕೊಲ್ಬಿನಿಸಿಕ್ಸಿಕಾಬ್ರಜ್ಬೋಡೊಬುರಿ" + - "ಯಟ್ಬುಗಿನೀಸ್ಬ್ಲಿನ್ಕ್ಯಾಡ್ಡೋಕಾರಿಬ್ಅಟ್ಸಮ್ಸೆಬುಆನೋಚಿಗಾಚಿಬ್ಚಾಚಗಟಾಯ್ಚೂಕಿಸೆಮಾರಿ" + - "ಚಿನೂಕ್ ಜಾರ್ಗೋನ್ಚೋಕ್ಟಾವ್ಚಿಪೆವ್ಯಾನ್ಚೆರೋಕೀಚೀಯೆನ್ನೇಸೊರಾನಿ ಕುರ್ದಿಷ್ಕೊಪ್ಟಿಕ್" + - "ಕ್ರಿಮೀಯನ್ ಟರ್ಕಿಷ್ಸೆಸೆಲ್ವಾ ಕ್ರಯೋಲ್ ಫ್ರೆಂಚ್ಕಶುಬಿಯನ್ಡಕೋಟಾದರ್ಗ್ವಾಟೈಟಡೆಲಾವೇ" + - "ರ್ಸ್ಲೇವ್ಡೋಗ್ರಿಬ್ಡಿಂಕಾಜರ್ಮಾಡೋಗ್ರಿಲೋವರ್ ಸೋರ್ಬಿಯನ್ಡುವಾಲಾಮಧ್ಯ ಡಚ್ಜೊಲ-ಫೊನ್ಯ" + - "ಿಡ್ಯೂಲಾಡಜಾಗಎಂಬುಎಫಿಕ್ಪ್ರಾಚೀನ ಈಜಿಪ್ಟಿಯನ್ಎಕಾಜುಕ್ಎಲಾಮೈಟ್ಮಧ್ಯ ಇಂಗ್ಲೀಷ್ಇವಾಂಡ" + - "ೋಫಾಂಗ್ಫಿಲಿಪಿನೊಫೋನ್ಮಧ್ಯ ಫ್ರೆಂಚ್ಪ್ರಾಚೀನ ಫ್ರೆಂಚ್ಉತ್ತರ ಫ್ರಿಸಿಯನ್ಪೂರ್ವ ಫ್ರಿ" + - "ಸಿಯನ್ಫ್ರಿಯುಲಿಯನ್ಗಗಗೌಜ್ಗಾನ್ ಚೀನೀಸ್ಗಾಯೋಗ್ಬಾಯಾಗೀಝ್ಗಿಲ್ಬರ್ಟೀಸ್ಮಧ್ಯ ಹೈ ಜರ್ಮ" + - "ನ್ಪ್ರಾಚೀನ ಹೈ ಜರ್ಮನ್ಗೊಂಡಿಗೊರೊಂಟಾಲೋಗೋಥಿಕ್ಗ್ರೇಬೋಪ್ರಾಚೀನ ಗ್ರೀಕ್ಸ್ವಿಸ್ ಜರ್ಮ" + - "ನ್ಗುಸಿಗ್ವಿಚ್\u200cಇನ್ಹೈಡಾಹಕ್ಹವಾಯಿಯನ್ಹಿಲಿಗೇನನ್ಹಿಟ್ಟಿಟೆಮೋಂಗ್ಅಪ್ಪರ್ ಸರ್ಬಿ" + - "ಯನ್ಶಯಾಂಗ್ ಚೀನೀಸೇಹೂಪಾಇಬಾನ್ಇಬಿಬಿಯೋಇಲ್ಲಿಕೋಇಂಗುಷ್ಲೊಜ್ಬಾನ್ನೊಂಬಾಮ್ಯಕಮೆಜೂಡಿಯೋ" + - "-ಪರ್ಶಿಯನ್ಜೂಡಿಯೋ-ಅರೇಬಿಕ್ಕಾರಾ-ಕಲ್ಪಾಕ್ಕಬೈಲ್ಕಚಿನ್ಜ್ಜುಕಂಬಾಕಾವಿಕಬರ್ಡಿಯನ್ಟ್ಯಾಪ್" + - "ಮ್ಯಾಕೊಂಡ್ಕಬುವೆರ್ಡಿಯನುಕೋರೋಖಾಸಿಖೋಟಾನೀಸ್ಕೊಯ್ರ ಚೀನಿಕಾಕೊಕಲೆಂಜಿನ್ಕಿಂಬುಂಡುಕೋಮ" + - "ಿ-ಪರ್ಮ್ಯಕ್ಕೊಂಕಣಿಕೊಸರಿಯನ್ಕಪೆಲ್ಲೆಕರಚಯ್-ಬಲ್ಕಾರ್ಕರೇಲಿಯನ್ಕುರುಖ್ಶಂಬಲಬಫಿಯಕಲೊಗ" + - "್ನಿಯನ್ಕುಮೈಕ್ಕುಟೇನಾಯ್ಲ್ಯಾಡಿನೋಲಾಂಗಿಲಹಂಡಾಲಂಬಾಲೆಜ್ಘಿಯನ್ಲಕೊಟಮೊಂಗೋಲೋಝಿಉತ್ತರ " + - "ಲೂರಿಲುಬ-ಲುಲಾಲೂಯಿಸೆನೋಲುಂಡಾಲುವೋಮಿಝೋಲುಯಿಯಮದುರೀಸ್ಮಗಾಹಿಮೈಥಿಲಿಮಕಾಸರ್ಮಂಡಿಂಗೊಮ" + - "ಸಾಯ್ಮೋಕ್ಷಮಂದಾರ್ಮೆಂಡೆಮೆರುಮೊರಿಸನ್ಮಧ್ಯ ಐರಿಷ್ಮ್ಯಖುವಾ- ಮೀಟ್ಟೊಮೆಟಾಮಿಕ್\u200c" + - "ಮ್ಯಾಕ್ಮಿನಂಗ್\u200cಕಬಾವುಮಂಚುಮಣಿಪುರಿಮೊಹಾವ್ಕ್ಮೊಸ್ಸಿಮುಂಡಂಗ್ಬಹುಸಂಖ್ಯೆಯ ಭಾಷೆ" + - "ಗಳುಕ್ರೀಕ್ಮಿರಾಂಡೀಸ್ಮಾರ್ವಾಡಿಎರ್ಝ್ಯಾಮಜಂದೆರಾನಿನಾನ್ನಿಯಾಪೊಲಿಟನ್ನಮಲೋ ಜರ್ಮನ್ನೇ" + - "ವಾರೀನಿಯಾಸ್ನಿಯುವನ್ಖ್ವಾಸಿಯೊನಿಂಬೂನ್ನೊಗಾಯ್ಪ್ರಾಚೀನ ನೋರ್ಸ್ಎನ್\u200cಕೋಉತ್ತರ ಸ" + - "ೋಥೋನೂಯರ್ಶಾಸ್ತ್ರೀಯ ನೇವಾರಿನ್ಯಾಮ್\u200cವೆಂಜಿನ್ಯಾನ್\u200cಕೋಲೆನ್ಯೋರೋಜೀಮಾಓಸಾ" + - "ಜ್ಒಟ್ಟೋಮನ್ ತುರ್ಕಿಷ್ಪಂಗಾಸಿನನ್ಪಹ್ಲವಿಪಂಪಾಂಗಾಪಾಪಿಯಮೆಂಟೋಪಲುಆನ್ನೈಜೀರಿಯನ್ ಪಿಡ" + - "್ಗಿನ್ಪ್ರಾಚೀನ ಪರ್ಶಿಯನ್ಫೀನಿಷಿಯನ್ಪೋನ್\u200c\u200cಪಿಯನ್ಪ್ರಶಿಯನ್ಪ್ರಾಚೀನ ಪ್ರ" + - "ೊವೆನ್ಶಿಯಲ್ಕಿಷೆರಾಜಸ್ಥಾನಿರಾಪಾನುಯಿರಾರೋಟೊಂಗನ್ರೊಂಬೊರೋಮಾನಿಅರೋಮಾನಿಯನ್ರುವಸಂಡಾವ" + - "ೇಸಖಾಸಮರಿಟನ್ ಅರಾಮಿಕ್ಸಂಬುರುಸಸಾಕ್ಸಂತಾಲಿನಂಬೇಸಂಗುಸಿಸಿಲಿಯನ್ಸ್ಕೋಟ್ಸ್ದಕ್ಷಿಣ ಕು" + - "ರ್ದಿಶ್ಸೆನಸೆಲ್ಕಪ್ಕೊಯ್ರಬೊರೊ ಸೆನ್ನಿಪ್ರಾಚೀನ ಐರಿಷ್ಟಷೆಲ್\u200dಹಿಟ್ಶಾನ್ಸಿಡಾಮೋ" + - "ದಕ್ಷಿಣ ಸಾಮಿಲೂಲ್ ಸಾಮಿಇನರಿ ಸಾಮಿಸ್ಕೋಟ್ ಸಾಮಿಸೋನಿಂಕೆಸೋಗ್ಡಿಯನ್ಸ್ರಾನನ್ ಟೋಂಗೋಸ" + - "ೇರೇರ್ಸಹೊಸುಕುಮಾಸುಸುಸುಮೇರಿಯನ್ಕೊಮೊರಿಯನ್ಶಾಸ್ತ್ರೀಯ ಸಿರಿಯಕ್ಸಿರಿಯಕ್ಟಿಮ್ನೆಟೆಸೊ" + - "ಟೆರೆನೋಟೇಟಮ್ಟೈಗ್ರೆಟಿವ್ಟೊಕೆಲಾವ್ಕ್ಲಿಂಗನ್ಟ್ಲಿಂಗಿಟ್ಟಮಾಷೆಕ್ನ್ಯಾಸಾ ಟೋಂಗಾಟೋಕ್ " + - "ಪಿಸಿನ್ಟರೊಕೊಸಿಂಶಿಯನ್ತುಂಬುಕಾಟುವಾಲುಟಸವಕ್ಟುವಿನಿಯನ್ಮಧ್ಯ ಅಟ್ಲಾಸ್ ಟಮಜೈಟ್ಉಡ್" + - "\u200cಮುರ್ಟ್ಉಗಾರಿಟಿಕ್ಉಂಬುಂಡುರೂಟ್ವಾಯಿವೋಟಿಕ್ವುಂಜೊವಾಲ್ಸರ್ವಲಾಯ್ತಾವರಾಯ್ವಾಷೋವಾ" + - "ರ್ಲ್\u200cಪಿರಿವುಕಲ್ಮೈಕ್ಸೊಗಯಾವೊಯಪೀಸೆಯಾಂಗ್ಬೆನ್ಯೆಂಬಾಕ್ಯಾಂಟನೀಸ್ಝೋಪೊಟೆಕ್ಬ್ಲ" + - "ಿಸ್ಸಿಂಬಲ್ಸ್ಝೆನಾಗಾಸ್ಟ್ಯಾಂಡರ್ಡ್ ಮೊರೊಕ್ಕನ್ ಟಮಜೈಟ್ಝೂನಿಯಾವುದೇ ಭಾಷಾಸಂಬಂಧಿ ವಿ" + - "ಷಯವಿಲ್ಲಜಾಝಾಆಧುನಿಕ ಪ್ರಮಾಣಿತ ಅರೇಬಿಕ್ಆಸ್ಟ್ರಿಯನ್ ಜರ್ಮನ್ಸ್ವಿಸ್ ಹೈ ಜರ್ಮನ್ಆಸ್" + - "ಟ್ರೇಲಿಯನ್ ಇಂಗ್ಲೀಷ್ಕೆನೆಡಿಯನ್ ಇಂಗ್ಲೀಷ್ಬ್ರಿಟಿಷ್ ಇಂಗ್ಲೀಷ್ಅಮೆರಿಕನ್ ಇಂಗ್ಲೀಷ್" + - "ಲ್ಯಾಟಿನ್ ಅಮೇರಿಕನ್ ಸ್ಪ್ಯಾನಿಷ್ಯುರೋಪಿಯನ್ ಸ್ಪ್ಯಾನಿಷ್ಮೆಕ್ಸಿಕನ್ ಸ್ಪ್ಯಾನಿಷ್ಕೆ" + - "ನೆಡಿಯನ್ ಫ್ರೆಂಚ್ಸ್ವಿಸ್ ಫ್ರೆಂಚ್ಲೋ ಸ್ಯಾಕ್ಸನ್ಫ್ಲೆಮಿಷ್ಬ್ರೆಜಿಲಿಯನ್ ಪೋರ್ಚುಗೀಸ" + - "್ಯೂರೋಪಿಯನ್ ಪೋರ್ಚುಗೀಸ್ಮಾಲ್ಡೇವಿಯನ್ಸರ್ಬೋ-ಕ್ರೊಯೇಶಿಯನ್ಕಾಂಗೊ ಸ್ವಹಿಲಿಸರಳೀಕೃತ " + - "ಚೈನೀಸ್ಸಾಂಪ್ರದಾಯಿಕ ಚೈನೀಸ್" - -var knLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x002d, 0x0045, 0x0066, 0x0075, 0x008a, 0x00a2, - 0x00b7, 0x00d2, 0x00e4, 0x00f9, 0x011a, 0x012f, 0x014d, 0x016b, - 0x0183, 0x0195, 0x01aa, 0x01c5, 0x01da, 0x01f5, 0x020a, 0x0219, - 0x0228, 0x0243, 0x024f, 0x025b, 0x0283, 0x0295, 0x02a7, 0x02bf, - 0x02d1, 0x02e3, 0x02fb, 0x0304, 0x0316, 0x032e, 0x034c, 0x036a, - 0x0388, 0x039a, 0x03b2, 0x03c4, 0x03dc, 0x03f1, 0x0400, 0x0415, - 0x0443, 0x0452, 0x0483, 0x04a4, 0x04b6, 0x04cb, 0x04e6, 0x04f2, - 0x050a, 0x0519, 0x0532, 0x0553, 0x0581, 0x059c, 0x05ba, 0x05cc, - // Entry 40 - 7F - 0x05f3, 0x0614, 0x0632, 0x0641, 0x065d, 0x0678, 0x0681, 0x069f, - 0x06b7, 0x06d8, 0x06ed, 0x0705, 0x0720, 0x072f, 0x0741, 0x0762, - 0x076e, 0x078f, 0x079e, 0x07ad, 0x07c2, 0x07d1, 0x07e9, 0x0801, - 0x080d, 0x0825, 0x083d, 0x0855, 0x0879, 0x0888, 0x08a6, 0x08b8, - 0x08c4, 0x08e5, 0x0904, 0x091c, 0x092e, 0x094f, 0x0961, 0x0982, - 0x0994, 0x09af, 0x09be, 0x09ca, 0x09e2, 0x09f7, 0x0a03, 0x0a25, - 0x0a37, 0x0a46, 0x0a4f, 0x0a8f, 0x0ac6, 0x0aeb, 0x0afa, 0x0b0f, - 0x0b21, 0x0b36, 0x0b45, 0x0b54, 0x0b6f, 0x0b81, 0x0b8d, 0x0b9f, - // Entry 80 - BF - 0x0bb1, 0x0bcf, 0x0be7, 0x0bff, 0x0c0e, 0x0c29, 0x0c3b, 0x0c62, - 0x0c77, 0x0c95, 0x0ca4, 0x0cc0, 0x0ccf, 0x0cde, 0x0cf6, 0x0d17, - 0x0d29, 0x0d35, 0x0d47, 0x0d65, 0x0d7d, 0x0d8f, 0x0dae, 0x0dc9, - 0x0de1, 0x0df6, 0x0e05, 0x0e17, 0x0e29, 0x0e35, 0x0e53, 0x0e71, - 0x0e83, 0x0e95, 0x0eaa, 0x0eb9, 0x0ec8, 0x0ee0, 0x0ef2, 0x0f10, - 0x0f1f, 0x0f34, 0x0f43, 0x0f67, 0x0f7f, 0x0f91, 0x0fa3, 0x0fb2, - 0x0fca, 0x0fdc, 0x0ff1, 0x1003, 0x100f, 0x1024, 0x1033, 0x1048, - 0x1057, 0x1057, 0x1072, 0x1081, 0x108a, 0x10a8, 0x10a8, 0x10bd, - // Entry C0 - FF - 0x10bd, 0x10e5, 0x1113, 0x1125, 0x113a, 0x1149, 0x1149, 0x115b, - 0x115b, 0x115b, 0x1170, 0x1170, 0x1170, 0x1179, 0x1179, 0x1197, - 0x1197, 0x11a3, 0x11b2, 0x11c7, 0x11c7, 0x11d0, 0x11d0, 0x11d0, - 0x11d0, 0x11dc, 0x11eb, 0x11eb, 0x11f4, 0x11f4, 0x11f4, 0x1216, - 0x122b, 0x123d, 0x1249, 0x1249, 0x1249, 0x1261, 0x1261, 0x1261, - 0x1270, 0x1270, 0x127c, 0x127c, 0x1291, 0x12a9, 0x12a9, 0x12bb, - 0x12bb, 0x12d3, 0x12e5, 0x12e5, 0x12f7, 0x130c, 0x1318, 0x132a, - 0x133c, 0x134e, 0x135a, 0x1385, 0x139d, 0x13bb, 0x13cd, 0x13e5, - // Entry 100 - 13F - 0x1410, 0x1428, 0x1428, 0x1459, 0x149d, 0x14b5, 0x14c4, 0x14d9, - 0x14e2, 0x14fa, 0x150c, 0x1524, 0x1533, 0x1542, 0x1554, 0x157f, - 0x157f, 0x1591, 0x15a7, 0x15c3, 0x15d5, 0x15e1, 0x15ed, 0x15fc, - 0x15fc, 0x1630, 0x1645, 0x165a, 0x167f, 0x167f, 0x1691, 0x1691, - 0x16a0, 0x16b8, 0x16b8, 0x16c4, 0x16c4, 0x16e6, 0x1711, 0x1711, - 0x173c, 0x1767, 0x1788, 0x178b, 0x179a, 0x17b9, 0x17c5, 0x17d7, - 0x17d7, 0x17e3, 0x1804, 0x1804, 0x182a, 0x1859, 0x1859, 0x1868, - 0x1883, 0x1895, 0x18a7, 0x18cf, 0x18f4, 0x18f4, 0x18f4, 0x1900, - // Entry 140 - 17F - 0x191e, 0x192a, 0x1933, 0x194b, 0x194b, 0x1966, 0x197e, 0x198d, - 0x19b8, 0x19dd, 0x19e9, 0x19f8, 0x1a0d, 0x1a22, 0x1a34, 0x1a34, - 0x1a34, 0x1a4c, 0x1a5b, 0x1a6d, 0x1a98, 0x1ac0, 0x1ac0, 0x1ae2, - 0x1af1, 0x1b00, 0x1b0c, 0x1b18, 0x1b24, 0x1b3f, 0x1b3f, 0x1b51, - 0x1b6c, 0x1b90, 0x1b90, 0x1b9c, 0x1b9c, 0x1ba8, 0x1bc0, 0x1bdc, - 0x1bdc, 0x1bdc, 0x1be8, 0x1c00, 0x1c18, 0x1c3d, 0x1c4f, 0x1c67, - 0x1c7c, 0x1ca1, 0x1ca1, 0x1ca1, 0x1cb9, 0x1ccb, 0x1cd7, 0x1ce3, - 0x1d01, 0x1d13, 0x1d2b, 0x1d43, 0x1d52, 0x1d61, 0x1d6d, 0x1d88, - // Entry 180 - 1BF - 0x1d88, 0x1d88, 0x1d88, 0x1d94, 0x1d94, 0x1da3, 0x1daf, 0x1dcb, - 0x1dcb, 0x1de1, 0x1df9, 0x1e08, 0x1e14, 0x1e20, 0x1e2f, 0x1e2f, - 0x1e2f, 0x1e44, 0x1e44, 0x1e53, 0x1e65, 0x1e77, 0x1e8c, 0x1e9b, - 0x1e9b, 0x1eaa, 0x1ebc, 0x1ecb, 0x1ed7, 0x1eec, 0x1f08, 0x1f31, - 0x1f3d, 0x1f5e, 0x1f82, 0x1f8e, 0x1fa3, 0x1fbb, 0x1fcd, 0x1fcd, - 0x1fe2, 0x2016, 0x2028, 0x2043, 0x205b, 0x205b, 0x205b, 0x2070, - 0x208b, 0x2097, 0x20b8, 0x20be, 0x20d7, 0x20e9, 0x20fb, 0x2110, - 0x2110, 0x2128, 0x213d, 0x214f, 0x2177, 0x2177, 0x2189, 0x21a5, - // Entry 1C0 - 1FF - 0x21b4, 0x21e2, 0x2206, 0x2227, 0x2239, 0x2245, 0x2254, 0x2285, - 0x22a0, 0x22b2, 0x22c7, 0x22e5, 0x22f7, 0x22f7, 0x232b, 0x232b, - 0x232b, 0x2359, 0x2359, 0x2374, 0x2374, 0x2374, 0x2395, 0x23ad, - 0x23ea, 0x23f6, 0x23f6, 0x2411, 0x2429, 0x2447, 0x2447, 0x2447, - 0x2456, 0x2468, 0x2468, 0x2468, 0x2468, 0x2486, 0x248f, 0x24a1, - 0x24aa, 0x24d5, 0x24e7, 0x24f6, 0x2508, 0x2508, 0x2514, 0x2520, - 0x253b, 0x2553, 0x2553, 0x257e, 0x257e, 0x2587, 0x2587, 0x259c, - 0x25ca, 0x25ef, 0x25ef, 0x260d, 0x2619, 0x2619, 0x262b, 0x262b, - // Entry 200 - 23F - 0x262b, 0x264a, 0x2663, 0x267c, 0x269b, 0x26b0, 0x26cb, 0x26f0, - 0x2702, 0x270b, 0x270b, 0x271d, 0x2729, 0x2744, 0x275f, 0x2790, - 0x27a5, 0x27a5, 0x27a5, 0x27b7, 0x27c3, 0x27d5, 0x27e4, 0x27f6, - 0x2802, 0x281a, 0x281a, 0x2832, 0x284d, 0x284d, 0x2862, 0x2884, - 0x28a3, 0x28a3, 0x28b2, 0x28b2, 0x28ca, 0x28ca, 0x28df, 0x28f1, - 0x2900, 0x291b, 0x2950, 0x296e, 0x2989, 0x299e, 0x29aa, 0x29b6, - 0x29b6, 0x29b6, 0x29b6, 0x29b6, 0x29c8, 0x29c8, 0x29d7, 0x29ec, - 0x2a01, 0x2a10, 0x2a1c, 0x2a3d, 0x2a43, 0x2a58, 0x2a58, 0x2a61, - // Entry 240 - 27F - 0x2a6d, 0x2a7c, 0x2a97, 0x2aa6, 0x2aa6, 0x2ac4, 0x2adc, 0x2b06, - 0x2b06, 0x2b18, 0x2b6b, 0x2b77, 0x2bc4, 0x2bd0, 0x2c11, 0x2c11, - 0x2c42, 0x2c6e, 0x2cab, 0x2cdf, 0x2d10, 0x2d41, 0x2d91, 0x2dcb, - 0x2e05, 0x2e05, 0x2e36, 0x2e5e, 0x2e80, 0x2e98, 0x2ed8, 0x2f12, - 0x2f33, 0x2f64, 0x2f89, 0x2fb1, 0x2fe5, -} // Size: 1250 bytes - -const koLangStr string = "" + // Size: 7030 bytes - "아파르어압카즈어아베스타어아프리칸스어아칸어암하라어아라곤어아랍어아삼어아바릭어아이마라어아제르바이잔어바슈키르어벨라루스어불가리아어비슬라마어" + - "밤바라어벵골어티베트어브르타뉴어보스니아어카탈로니아어체첸어차모로어코르시카어크리어체코어교회 슬라브어추바시어웨일스어덴마크어독일어디베히" + - "어종카어에웨어그리스어영어에스페란토어스페인어에스토니아어바스크어페르시아어풀라어핀란드어피지어페로어프랑스어서부 프리지아어아일랜드어스코" + - "틀랜드 게일어갈리시아어과라니어구자라트어맹크스어하우사어히브리어힌디어히리 모투어크로아티아어아이티어헝가리어아르메니아어헤레로어인터링구" + - "아인도네시아어인테르링구에이그보어쓰촨 이어이누피아크어이도어아이슬란드어이탈리아어이눅티투트어일본어자바어조지아어콩고어키쿠유어쿠안야마어" + - "카자흐어그린란드어크메르어칸나다어한국어칸누리어카슈미르어쿠르드어코미어콘월어키르기스어라틴어룩셈부르크어간다어림버거어링갈라어라오어리투아" + - "니아어루바-카탄가어라트비아어말라가시어마셜어마오리어마케도니아어말라얄람어몽골어마라티어말레이어몰타어버마어나우루어북부 은데벨레어네팔어" + - "느동가어네덜란드어노르웨이어(니노르스크)노르웨이어(보크말)남부 은데벨레어나바호어냔자어오크어오지브와어오로모어오리야어오세트어펀잡어팔" + - "리어폴란드어파슈토어포르투갈어케추아어로만시어룬디어루마니아어러시아어르완다어산스크리트어사르디니아어신디어북부 사미어산고어스리랑카어슬로" + - "바키아어슬로베니아어사모아어쇼나어소말리아어알바니아어세르비아어시스와티어남부 소토어순다어스웨덴어스와힐리어타밀어텔루구어타지크어태국어티" + - "그리냐어투르크멘어츠와나어통가어터키어총가어타타르어타히티어위구르어우크라이나어우르두어우즈베크어벤다어베트남어볼라퓌크어왈론어월로프어코사" + - "어이디시어요루바어주앙어중국어줄루어아체어아콜리어아당메어아디게어튀니지 아랍어아프리힐리어아그햄어아이누어아카드어알류트어남부 알타이어고" + - "대 영어앙가어아람어아라우칸어아라파호어알제리 아랍어아라와크어모로코 아랍어이집트 아랍어아수어아스투리아어아와히어발루치어발리어바사어바" + - "문어고말라어베자어벰바어베나어바푸트어서부 발로치어호즈푸리어비콜어비니어콤어식시카어브라지어브라후이어보도어아쿠즈어부리아타부기어불루어브" + - "린어메둠바어카도어카리브어카유가어앗삼어세부아노어치가어치브차어차가타이어추크어마리어치누크 자곤촉토어치페우얀체로키어샤이엔어소라니 쿠르" + - "드어콥트어크리민 터키어; 크리민 타타르어세이셸 크리올 프랑스어카슈비아어다코타어다르그와어타이타어델라웨어어슬라브어도그리브어딩카어자" + - "르마어도그리어저지 소르비아어두알라어중세 네덜란드어졸라 포니어드율라어다장가어엠부어이픽어고대 이집트어이카죽어엘람어중세 영어이원도어" + - "팡그어필리핀어폰어중세 프랑스어고대 프랑스어북부 프리지아어동부 프리슬란드어프리울리어가어가가우스어간어가요어그바야어조로아스터 다리어" + - "게이즈어키리바시어길라키어중세 고지 독일어고대 고지 독일어고아 콘칸어곤디어고론탈로어고트어게르보어고대 그리스어독일어(스위스)구시어" + - "그위친어하이다어하카어하와이어피지 힌디어헤리가뇬어하타이트어히몸어고지 소르비아어샹어후파어이반어이비비오어이로코어인귀시어로반어응곰바어" + - "마차메어유대-페르시아어유대-아라비아어카라칼파크어커바일어카친어까꼬토끄어캄바어카위어카바르디어카넴부어티얍어마콘데어크리올어코로어카시어" + - "호탄어코이라 친니어코와르어카코어칼렌진어킴분두어코미페르먀크어코카니어코스라이엔어크펠레어카라챠이-발카르어카렐리야어쿠르크어샴발라어바피" + - "아어콜로그니안어쿠믹어쿠테네어라디노어랑기어라한다어람바어레즈기안어링구아 프랑카 노바라코타어몽고어로지어북부 루리어루바-룰루아어루이세" + - "노어룬다어루오어루샤이어루야어마두라어마파어마가히어마이틸리어마카사어만딩고어마사이어마바어모크샤어만다르어멘데어메루어모리스얀어중세 아일" + - "랜드어마크후와-메토어메타어미크맥어미낭카바우어만주어마니푸리어모호크어모시어서부 마리어문당어다중 언어크리크어미란데어마르와리어미예네어" + - "엘즈야어마잔데라니어민난어나폴리어나마어저지 독일어네와르어니아스어니웨언어크와시오어느기엠본어노가이어고대 노르웨이어응코어북부 소토어누" + - "에르어고전 네와르어니암웨지어니안콜어뉴로어느지마어오세이지어오스만 터키어판가시난어팔레비어팜팡가어파피아먼토어팔라우어나이지리아 피진어" + - "고대 페르시아어페니키아어폰틱어폼페이어프러시아어고대 프로방스어키체어라자스탄어라파뉴이라로통가어롬보어집시어루신어아로마니아어르와어산다" + - "웨어야쿠트어사마리아 아랍어삼부루어사사크어산탈리어느감바이어상구어시칠리아어스코틀랜드어남부 쿠르드어세네카어세나어셀쿠프어코이야보로 세" + - "니어고대 아일랜드어타셸히트어샨어차디언 아라비아어시다모어남부 사미어룰레 사미어이나리 사미어스콜트 사미어소닌케어소그디엔어스라난 통" + - "가어세레르어사호어수쿠마어수수어수메르어코모로어고전 시리아어시리아어팀니어테조어테레노어테툼어티그레어티브어토켈라우제도어차후르어클링온어" + - "틀링깃족어탈리쉬어타마섹어니아사 통가어토크 피신어타로코어트심시안어툼부카어투발루어타사와크어투비니안어중앙 모로코 타마지트어우드말트어" + - "유가리틱어움분두어어근바이어보틱어분조어월저어월라이타어와라이어와쇼어왈피리어우어칼미크어소가어야오족어얍페세어양본어옘바어광둥어사포테크어" + - "블리스 심볼제나가어표준 모로코 타마지트어주니어언어 관련 내용 없음자자어현대 표준 아랍어고지 독일어(스위스)영어(호주)저지 색슨" + - "어플라망어몰도바어세르비아-크로아티아어콩고 스와힐리어" - -var koLangIdx = []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x0018, 0x0027, 0x0039, 0x0042, 0x004e, 0x005a, - 0x0063, 0x006c, 0x0078, 0x0087, 0x009c, 0x00ab, 0x00ba, 0x00c9, - 0x00d8, 0x00e4, 0x00ed, 0x00f9, 0x0108, 0x0117, 0x0129, 0x0132, - 0x013e, 0x014d, 0x0156, 0x015f, 0x0172, 0x017e, 0x018a, 0x0196, - 0x019f, 0x01ab, 0x01b4, 0x01bd, 0x01c9, 0x01cf, 0x01e1, 0x01ed, - 0x01ff, 0x020b, 0x021a, 0x0223, 0x022f, 0x0238, 0x0241, 0x024d, - 0x0263, 0x0272, 0x028b, 0x029a, 0x02a6, 0x02b5, 0x02c1, 0x02cd, - 0x02d9, 0x02e2, 0x02f2, 0x0304, 0x0310, 0x031c, 0x032e, 0x033a, - // Entry 40 - 7F - 0x0349, 0x035b, 0x036d, 0x0379, 0x0386, 0x0398, 0x03a1, 0x03b3, - 0x03c2, 0x03d4, 0x03dd, 0x03e6, 0x03f2, 0x03fb, 0x0407, 0x0416, - 0x0422, 0x0431, 0x043d, 0x0449, 0x0452, 0x045e, 0x046d, 0x0479, - 0x0482, 0x048b, 0x049a, 0x04a3, 0x04b5, 0x04be, 0x04ca, 0x04d6, - 0x04df, 0x04f1, 0x0504, 0x0513, 0x0522, 0x052b, 0x0537, 0x0549, - 0x0558, 0x0561, 0x056d, 0x0579, 0x0582, 0x058b, 0x0597, 0x05ad, - 0x05b6, 0x05c2, 0x05d1, 0x05f1, 0x060b, 0x0621, 0x062d, 0x0636, - 0x063f, 0x064e, 0x065a, 0x0666, 0x0672, 0x067b, 0x0684, 0x0690, - // Entry 80 - BF - 0x069c, 0x06ab, 0x06b7, 0x06c3, 0x06cc, 0x06db, 0x06e7, 0x06f3, - 0x0705, 0x0717, 0x0720, 0x0730, 0x0739, 0x0748, 0x075a, 0x076c, - 0x0778, 0x0781, 0x0790, 0x079f, 0x07ae, 0x07bd, 0x07cd, 0x07d6, - 0x07e2, 0x07f1, 0x07fa, 0x0806, 0x0812, 0x081b, 0x082a, 0x0839, - 0x0845, 0x084e, 0x0857, 0x0860, 0x086c, 0x0878, 0x0884, 0x0896, - 0x08a2, 0x08b1, 0x08ba, 0x08c6, 0x08d5, 0x08de, 0x08ea, 0x08f3, - 0x08ff, 0x090b, 0x0914, 0x091d, 0x0926, 0x092f, 0x093b, 0x0947, - 0x0953, 0x0966, 0x0978, 0x0984, 0x0990, 0x099c, 0x099c, 0x09a8, - // Entry C0 - FF - 0x09a8, 0x09bb, 0x09c8, 0x09d1, 0x09da, 0x09e9, 0x09e9, 0x09f8, - 0x0a0b, 0x0a0b, 0x0a1a, 0x0a2d, 0x0a40, 0x0a49, 0x0a49, 0x0a5b, - 0x0a5b, 0x0a67, 0x0a73, 0x0a7c, 0x0a7c, 0x0a85, 0x0a8e, 0x0a8e, - 0x0a9a, 0x0aa3, 0x0aac, 0x0aac, 0x0ab5, 0x0ac1, 0x0ac1, 0x0ad4, - 0x0ae3, 0x0aec, 0x0af5, 0x0af5, 0x0afb, 0x0b07, 0x0b07, 0x0b07, - 0x0b13, 0x0b22, 0x0b2b, 0x0b37, 0x0b43, 0x0b4c, 0x0b55, 0x0b5e, - 0x0b6a, 0x0b73, 0x0b7f, 0x0b8b, 0x0b94, 0x0ba3, 0x0bac, 0x0bb8, - 0x0bc7, 0x0bd0, 0x0bd9, 0x0be9, 0x0bf2, 0x0bfe, 0x0c0a, 0x0c16, - // Entry 100 - 13F - 0x0c2c, 0x0c35, 0x0c35, 0x0c60, 0x0c80, 0x0c8f, 0x0c9b, 0x0caa, - 0x0cb6, 0x0cc5, 0x0cd1, 0x0ce0, 0x0ce9, 0x0cf5, 0x0d01, 0x0d17, - 0x0d17, 0x0d23, 0x0d39, 0x0d49, 0x0d55, 0x0d61, 0x0d6a, 0x0d73, - 0x0d73, 0x0d86, 0x0d92, 0x0d9b, 0x0da8, 0x0da8, 0x0db4, 0x0db4, - 0x0dbd, 0x0dc9, 0x0dc9, 0x0dcf, 0x0dcf, 0x0de2, 0x0df5, 0x0df5, - 0x0e0b, 0x0e24, 0x0e33, 0x0e39, 0x0e48, 0x0e4e, 0x0e57, 0x0e63, - 0x0e7c, 0x0e88, 0x0e97, 0x0ea3, 0x0eba, 0x0ed1, 0x0ee1, 0x0eea, - 0x0ef9, 0x0f02, 0x0f0e, 0x0f21, 0x0f35, 0x0f35, 0x0f35, 0x0f3e, - // Entry 140 - 17F - 0x0f4a, 0x0f56, 0x0f5f, 0x0f6b, 0x0f7b, 0x0f8a, 0x0f99, 0x0fa2, - 0x0fb8, 0x0fbe, 0x0fc7, 0x0fd0, 0x0fdf, 0x0feb, 0x0ff7, 0x0ff7, - 0x0ff7, 0x1000, 0x100c, 0x1018, 0x102e, 0x1044, 0x1044, 0x1056, - 0x1062, 0x106b, 0x107a, 0x1083, 0x108c, 0x109b, 0x10a7, 0x10b0, - 0x10bc, 0x10c8, 0x10c8, 0x10d1, 0x10d1, 0x10da, 0x10e3, 0x10f6, - 0x1102, 0x1102, 0x110b, 0x1117, 0x1123, 0x1138, 0x1144, 0x1156, - 0x1162, 0x117b, 0x117b, 0x117b, 0x118a, 0x1196, 0x11a2, 0x11ae, - 0x11c0, 0x11c9, 0x11d5, 0x11e1, 0x11ea, 0x11f6, 0x11ff, 0x120e, - // Entry 180 - 1BF - 0x1228, 0x1228, 0x1228, 0x1234, 0x1234, 0x123d, 0x1246, 0x1256, - 0x1256, 0x1269, 0x1278, 0x1281, 0x128a, 0x1296, 0x129f, 0x129f, - 0x129f, 0x12ab, 0x12b4, 0x12c0, 0x12cf, 0x12db, 0x12e7, 0x12f3, - 0x12fc, 0x1308, 0x1314, 0x131d, 0x1326, 0x1335, 0x134b, 0x1361, - 0x136a, 0x1376, 0x1388, 0x1391, 0x13a0, 0x13ac, 0x13b5, 0x13c5, - 0x13ce, 0x13db, 0x13e7, 0x13f3, 0x1402, 0x1402, 0x140e, 0x141a, - 0x142c, 0x1435, 0x1441, 0x144a, 0x145a, 0x1466, 0x1472, 0x147e, - 0x147e, 0x148d, 0x149c, 0x14a8, 0x14be, 0x14be, 0x14c7, 0x14d7, - // Entry 1C0 - 1FF - 0x14e3, 0x14f6, 0x1505, 0x1511, 0x151a, 0x1526, 0x1535, 0x1548, - 0x1557, 0x1563, 0x156f, 0x1581, 0x158d, 0x158d, 0x15a6, 0x15a6, - 0x15a6, 0x15bc, 0x15bc, 0x15cb, 0x15cb, 0x15d4, 0x15e0, 0x15ef, - 0x1605, 0x160e, 0x160e, 0x161d, 0x1629, 0x1638, 0x1638, 0x1638, - 0x1641, 0x164a, 0x164a, 0x1653, 0x1653, 0x1665, 0x166e, 0x167a, - 0x1686, 0x169c, 0x16a8, 0x16b4, 0x16c0, 0x16c0, 0x16cf, 0x16d8, - 0x16e7, 0x16f9, 0x16f9, 0x170c, 0x1718, 0x1721, 0x1721, 0x172d, - 0x1746, 0x175c, 0x175c, 0x176b, 0x1771, 0x178a, 0x1796, 0x1796, - // Entry 200 - 23F - 0x1796, 0x17a6, 0x17b6, 0x17c9, 0x17dc, 0x17e8, 0x17f7, 0x180a, - 0x1816, 0x181f, 0x181f, 0x182b, 0x1834, 0x1840, 0x184c, 0x185f, - 0x186b, 0x186b, 0x186b, 0x1874, 0x187d, 0x1889, 0x1892, 0x189e, - 0x18a7, 0x18bc, 0x18c8, 0x18d4, 0x18e3, 0x18ef, 0x18fb, 0x190e, - 0x191e, 0x191e, 0x192a, 0x192a, 0x1939, 0x1939, 0x1945, 0x1951, - 0x1960, 0x196f, 0x198f, 0x199e, 0x19ad, 0x19b9, 0x19bf, 0x19c8, - 0x19c8, 0x19c8, 0x19c8, 0x19c8, 0x19d1, 0x19d1, 0x19da, 0x19e3, - 0x19f2, 0x19fe, 0x1a07, 0x1a13, 0x1a19, 0x1a25, 0x1a25, 0x1a2e, - // Entry 240 - 27F - 0x1a3a, 0x1a46, 0x1a4f, 0x1a58, 0x1a58, 0x1a61, 0x1a70, 0x1a80, - 0x1a80, 0x1a8c, 0x1aac, 0x1ab5, 0x1ad0, 0x1ad9, 0x1af0, 0x1af0, - 0x1af0, 0x1b0b, 0x1b19, 0x1b19, 0x1b19, 0x1b19, 0x1b19, 0x1b19, - 0x1b19, 0x1b19, 0x1b19, 0x1b19, 0x1b29, 0x1b35, 0x1b35, 0x1b35, - 0x1b41, 0x1b60, 0x1b76, -} // Size: 1246 bytes - -const kyLangStr string = "" + // Size: 6711 bytes - "афарчаабхазчаафрикаанчааканчаамхарчаарагончоарабчаассамчааварикчеаймарач" + - "аазербайжанчабашкырчабеларусчаболгарчабисламачабамбарачабангладешчетибе" + - "тчебретончобоснийчекаталанчачеченчечаморрочокорсиканчачехчечиркөө славя" + - "нчачувашчауелшчедатчанемисчедивехичежонгучаэбечегрекчеанглисчеэсперанто" + - "испанчаэстончобаскчафарсчафулачафинчефижичефароэчефранцузчабатыш фризче" + - "ирландчакельтчегалисиячагуарашгужаратчаманксычахаусачаивриттехиндичехор" + - "ватчагаитичевенгерчеармянчагерерочоинтерлингваиндонезчеигбочосычуань йи" + - "чеидочоисландчаиталиянчаинуктитутчажапончожаванизчегрузинчекикуйичекуан" + - "ьямачаказакчакалаалисутчакмерчеканнадачакорейчекануричекашмирчекурдчако" + - "мичекорнишчекыргызчалатынчалюксембургчагандачалимбургичелингалачалаочол" + - "итовчолуба-катангачалатышчамалагасчамаршаллчамаоричемакедончомалайаламч" + - "амонголчомаратичемалайчамалтизчебурмачанауручатүндүк ндыбелченепалчандо" + - "нгачаголландчанорвежче (Нинорск)норвежче (Букмал)түштүк ндебелеченавадж" + - "очоньянджачаокситанчаоромочоориячаосетинчепунжабичеполякчапуштучапортуг" + - "алчакечуачароманшчарундичерумынчаорусчаруандачасанскритчесардинчесиндхи" + - "четүндүк самичесангочосингалачасловакчасловенчесамоанчашоначасомаличеал" + - "банчасербчесватичесесоточосунданчашведчесуахиличетамилчетелугучатажикче" + - "тайчатигриниачатүркмөнчөтсваначатонгачатүркчөтсонгачататарчатаитичеуйгу" + - "рчаукраинчеурдучаөзбекчевендачавьетнамчаволапюкчаваллончоуолофчокосачаи" + - "дишчейорубачакытайчазулучаачехчеадаңмечеадыгейчеагемчеайнучаалеутчатүшт" + - "үк алтайчаангикачамапучечеарапахочоасучаастурийчеавадхичебаличебасаачаб" + - "ембачабеначачыгыш балучичебхожпуричебиничесиксикачабодочобугийчеблинчес" + - "ебуанчачигачачуукичемаричечокточочерокичешайеннчеборбордук курдчасеселв" + - "а креол французчадакотачадаргинчетаитачадогрибчезамрачатөмөнкү сорбианч" + - "адуалачажола-фоничедазагачаэмбучаэфикчеэкажукчаэвондочофилипинчефончофр" + - "иулчагачагагаузчаГань Кытайчагиизчегилбертчегоронталочонемисче (Швейцар" + - "ия)гусичегвичинчеХакка кытайчагавайчахилигайнончохмонгчожогорку сорбиан" + - "чаСянь Кытайчахупачаибанчаибибиочоилокочоингушчаложбанчангомбачамачамеч" + - "екабылчакахинчеджучакамбачакабардинчетяпчамакондечекабувердичекорочохас" + - "ичекойра чиничекакочокаленжичекимбундучакоми-пермякчаконканичекпеллечек" + - "арачай-балкарчакарелчекурухчашамабалачабафиячаколоньячакумыкчаладиночол" + - "ангичелезгинчелакотачалозичетүндүк луричелуба-лулуачалундачалуочомизочо" + - "лухиячамадурисчемагахичемаитиличемакасарчамасайчамокшачамендечемеручамо" + - "рисианчамакуачаметачамикмакчаминанкабаучаманипуричемохаукчамоссичемунда" + - "нгчабир нече тилдекрикчемирандизчеэрзянчамазандераничеnanнеополитанчана" + - "мачатөмөнкү немисченеваричениасчаньюанчаквасиочонгимбунчаногайчанкочотү" + - "ндүк сохочонуерченыйанколчопангасичепампангачапапиаменточопалауанчааргы" + - "ндашкан тил (Нигерия)пруссчакичечерапаньючараротонгачаромбочоаромунчару" + - "ачасандавечесахачасамбуручасанталиченгамбайчасангучасицилийчешотландчат" + - "үштүк курдчасеначакойраборо сенничеташелитчешанчатүштүк саамичелуле-сам" + - "ичеинари саамическолт саамичесонинкечесранан тонгочосахочосукумачакомор" + - "чосириячатимнечетесочотетумчатигречеклингончоток-писинчетарокочотумбука" + - "чатувалучатасабакчатувинчеБорбордук Атлас тамазитчеудмуртчаумбундучатүп" + - "күвайичевунжочовалцерчевольяттачаварайчаворлпиричеwuuкалмыкчасогачаянгб" + - "енчейембачакантончомарокко тамазигт адабий тилиндезуничетилдик мазмун ж" + - "окзазачаазыркы адабий араб тилиндеадабий немисче (Швейцария)испанча (Ев" + - "ропа)төмөнкү саксончофламандчапортугалча (Европа)молдованчасерб-хорватк" + - "онго суахаличекытайча (жөнөкөйлөштүрүлгөн)кытайча (салттуу)" - -var kyLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x001a, 0x001a, 0x002e, 0x003a, 0x0048, 0x0058, - 0x0064, 0x0072, 0x0082, 0x0092, 0x00aa, 0x00ba, 0x00cc, 0x00dc, - 0x00ee, 0x0100, 0x0116, 0x0124, 0x0134, 0x0144, 0x0156, 0x0164, - 0x0176, 0x018a, 0x018a, 0x0194, 0x01b1, 0x01bf, 0x01cb, 0x01d5, - 0x01e3, 0x01f3, 0x0201, 0x020b, 0x0217, 0x0227, 0x0239, 0x0247, - 0x0255, 0x0261, 0x026d, 0x0279, 0x0283, 0x028f, 0x029d, 0x02af, - 0x02c6, 0x02d6, 0x02e4, 0x02f6, 0x0302, 0x0314, 0x0324, 0x0332, - 0x0340, 0x034e, 0x034e, 0x035e, 0x036c, 0x037c, 0x038a, 0x039a, - // Entry 40 - 7F - 0x03b0, 0x03c2, 0x03c2, 0x03ce, 0x03e5, 0x03e5, 0x03ef, 0x03ff, - 0x0411, 0x0427, 0x0435, 0x0447, 0x0457, 0x0457, 0x0467, 0x047b, - 0x0489, 0x04a1, 0x04ad, 0x04bf, 0x04cd, 0x04dd, 0x04ed, 0x04f9, - 0x0505, 0x0515, 0x0525, 0x0533, 0x054b, 0x0559, 0x056d, 0x057f, - 0x0589, 0x0597, 0x05b2, 0x05c0, 0x05d2, 0x05e4, 0x05f2, 0x0604, - 0x061a, 0x062a, 0x063a, 0x0648, 0x0658, 0x0666, 0x0674, 0x0691, - 0x069f, 0x06af, 0x06c1, 0x06e2, 0x0701, 0x0720, 0x0732, 0x0744, - 0x0756, 0x0756, 0x0764, 0x0770, 0x0780, 0x0792, 0x0792, 0x07a0, - // Entry 80 - BF - 0x07ae, 0x07c2, 0x07d0, 0x07e0, 0x07ee, 0x07fc, 0x0808, 0x0818, - 0x082c, 0x083c, 0x084c, 0x0865, 0x0873, 0x0885, 0x0895, 0x08a5, - 0x08b5, 0x08c1, 0x08d1, 0x08df, 0x08eb, 0x08f9, 0x0909, 0x0919, - 0x0925, 0x0937, 0x0945, 0x0955, 0x0963, 0x096d, 0x0981, 0x0993, - 0x09a3, 0x09b1, 0x09bd, 0x09cd, 0x09db, 0x09e9, 0x09f7, 0x0a07, - 0x0a13, 0x0a21, 0x0a2f, 0x0a41, 0x0a53, 0x0a63, 0x0a71, 0x0a7d, - 0x0a89, 0x0a99, 0x0a99, 0x0aa7, 0x0ab3, 0x0abf, 0x0abf, 0x0acf, - 0x0adf, 0x0adf, 0x0adf, 0x0aeb, 0x0af7, 0x0af7, 0x0af7, 0x0b05, - // Entry C0 - FF - 0x0b05, 0x0b20, 0x0b20, 0x0b30, 0x0b30, 0x0b40, 0x0b40, 0x0b52, - 0x0b52, 0x0b52, 0x0b52, 0x0b52, 0x0b52, 0x0b5c, 0x0b5c, 0x0b6e, - 0x0b6e, 0x0b7e, 0x0b7e, 0x0b8a, 0x0b8a, 0x0b98, 0x0b98, 0x0b98, - 0x0b98, 0x0b98, 0x0ba6, 0x0ba6, 0x0bb2, 0x0bb2, 0x0bb2, 0x0bcd, - 0x0be1, 0x0be1, 0x0bed, 0x0bed, 0x0bed, 0x0bff, 0x0bff, 0x0bff, - 0x0bff, 0x0bff, 0x0c0b, 0x0c0b, 0x0c0b, 0x0c19, 0x0c19, 0x0c25, - 0x0c25, 0x0c25, 0x0c25, 0x0c25, 0x0c25, 0x0c35, 0x0c41, 0x0c41, - 0x0c41, 0x0c4f, 0x0c5b, 0x0c5b, 0x0c69, 0x0c69, 0x0c79, 0x0c89, - // Entry 100 - 13F - 0x0ca8, 0x0ca8, 0x0ca8, 0x0ca8, 0x0cd4, 0x0cd4, 0x0ce4, 0x0cf4, - 0x0d02, 0x0d02, 0x0d02, 0x0d12, 0x0d12, 0x0d20, 0x0d20, 0x0d41, - 0x0d41, 0x0d4f, 0x0d4f, 0x0d64, 0x0d64, 0x0d74, 0x0d80, 0x0d8c, - 0x0d8c, 0x0d8c, 0x0d9c, 0x0d9c, 0x0d9c, 0x0d9c, 0x0dac, 0x0dac, - 0x0dac, 0x0dbe, 0x0dbe, 0x0dc8, 0x0dc8, 0x0dc8, 0x0dc8, 0x0dc8, - 0x0dc8, 0x0dc8, 0x0dd6, 0x0dde, 0x0dee, 0x0e05, 0x0e05, 0x0e05, - 0x0e05, 0x0e11, 0x0e23, 0x0e23, 0x0e23, 0x0e23, 0x0e23, 0x0e23, - 0x0e39, 0x0e39, 0x0e39, 0x0e39, 0x0e5c, 0x0e5c, 0x0e5c, 0x0e68, - // Entry 140 - 17F - 0x0e78, 0x0e78, 0x0e91, 0x0e9f, 0x0e9f, 0x0eb7, 0x0eb7, 0x0ec5, - 0x0ee6, 0x0efd, 0x0f09, 0x0f15, 0x0f25, 0x0f33, 0x0f41, 0x0f41, - 0x0f41, 0x0f51, 0x0f61, 0x0f71, 0x0f71, 0x0f71, 0x0f71, 0x0f71, - 0x0f7f, 0x0f8d, 0x0f97, 0x0fa5, 0x0fa5, 0x0fb9, 0x0fb9, 0x0fc3, - 0x0fd5, 0x0feb, 0x0feb, 0x0ff7, 0x0ff7, 0x1003, 0x1003, 0x101a, - 0x101a, 0x101a, 0x1026, 0x1038, 0x104c, 0x1065, 0x1077, 0x1077, - 0x1087, 0x10a6, 0x10a6, 0x10a6, 0x10b4, 0x10c2, 0x10d6, 0x10e4, - 0x10f6, 0x1104, 0x1104, 0x1114, 0x1122, 0x1122, 0x1122, 0x1132, - // Entry 180 - 1BF - 0x1132, 0x1132, 0x1132, 0x1142, 0x1142, 0x1142, 0x114e, 0x1167, - 0x1167, 0x117e, 0x117e, 0x118c, 0x1196, 0x11a2, 0x11b0, 0x11b0, - 0x11b0, 0x11c2, 0x11c2, 0x11d2, 0x11e4, 0x11f6, 0x11f6, 0x1204, - 0x1204, 0x1212, 0x1212, 0x1220, 0x122c, 0x1240, 0x1240, 0x124e, - 0x125a, 0x126a, 0x1282, 0x1282, 0x1296, 0x12a6, 0x12b4, 0x12b4, - 0x12c6, 0x12e0, 0x12ec, 0x1300, 0x1300, 0x1300, 0x1300, 0x130e, - 0x1328, 0x132b, 0x1343, 0x134f, 0x136c, 0x137c, 0x1388, 0x1396, - 0x1396, 0x13a6, 0x13b8, 0x13c6, 0x13c6, 0x13c6, 0x13d0, 0x13e9, - // Entry 1C0 - 1FF - 0x13f5, 0x13f5, 0x13f5, 0x1409, 0x1409, 0x1409, 0x1409, 0x1409, - 0x141b, 0x141b, 0x142f, 0x1447, 0x1459, 0x1459, 0x1487, 0x1487, - 0x1487, 0x1487, 0x1487, 0x1487, 0x1487, 0x1487, 0x1487, 0x1495, - 0x1495, 0x14a1, 0x14a1, 0x14a1, 0x14b3, 0x14c9, 0x14c9, 0x14c9, - 0x14d7, 0x14d7, 0x14d7, 0x14d7, 0x14d7, 0x14e7, 0x14f1, 0x1503, - 0x150f, 0x150f, 0x1521, 0x1521, 0x1533, 0x1533, 0x1545, 0x1553, - 0x1565, 0x1577, 0x1577, 0x1590, 0x1590, 0x159c, 0x159c, 0x159c, - 0x15bd, 0x15bd, 0x15bd, 0x15cf, 0x15d9, 0x15d9, 0x15d9, 0x15d9, - // Entry 200 - 23F - 0x15d9, 0x15f4, 0x1609, 0x1622, 0x163b, 0x164d, 0x164d, 0x1668, - 0x1668, 0x1674, 0x1674, 0x1684, 0x1684, 0x1684, 0x1692, 0x1692, - 0x16a0, 0x16a0, 0x16a0, 0x16ae, 0x16ba, 0x16ba, 0x16c8, 0x16d6, - 0x16d6, 0x16d6, 0x16d6, 0x16e8, 0x16e8, 0x16e8, 0x16e8, 0x16e8, - 0x16fd, 0x16fd, 0x170d, 0x170d, 0x170d, 0x170d, 0x171f, 0x172f, - 0x1741, 0x174f, 0x177f, 0x178f, 0x178f, 0x17a1, 0x17ab, 0x17b7, - 0x17b7, 0x17b7, 0x17b7, 0x17b7, 0x17b7, 0x17b7, 0x17c5, 0x17d5, - 0x17e9, 0x17f7, 0x17f7, 0x180b, 0x180e, 0x181e, 0x181e, 0x182a, - // Entry 240 - 27F - 0x182a, 0x182a, 0x183a, 0x1848, 0x1848, 0x1858, 0x1858, 0x1858, - 0x1858, 0x1858, 0x1893, 0x189f, 0x18bf, 0x18cb, 0x18fc, 0x18fc, - 0x18fc, 0x192c, 0x192c, 0x192c, 0x192c, 0x192c, 0x192c, 0x1949, - 0x1949, 0x1949, 0x1949, 0x1949, 0x1968, 0x197a, 0x197a, 0x199d, - 0x19b1, 0x19c6, 0x19e3, 0x1a18, 0x1a37, -} // Size: 1250 bytes - -const loLangStr string = "" + // Size: 10855 bytes - "ອະຟາແອບຄາຊຽນອາເວັສແຕນອາຟຣິການອາການອຳຮາຣິກອາຣາໂກເນັດອາຣັບອັສຊາມີສອາວາຣິກອ" + - "າຍມາລາອາເຊີໄບຈານິບາຣກີເບລາຣັສຊຽນບັງກາຣຽນບິສລະມາບາມບາຣາເບັງກາລີທິເບທັນເ" + - "ບຣຕັນບອສນຽນຄາຕາລານຊີເຄນຊາມໍໂຣຄໍຊິກາຄີເຊກໂບດສລາວິກຊູວາຊເວວແດນິຊເຢຍລະມັນ" + - "ດີວີຮີດີຊອງຄາອິວາກຣີກອັງກິດເອສປາຍສະແປນນິຊເອສໂຕນຽນບັສກີເປີຊຽນຟູລາຟິນນິຊ" + - "ຟິຈຽນຟາໂຣສຝຣັ່ງຟຣິຊຽນ ຕາເວັນຕົກໄອຣິສສະກັອດເກລິກກາລິຊຽນກົວຣານີກູຈາຣາຕິແ" + - "ມງຊ໌ເຮົາຊາຮີບຣິວຮິນດິຮິຣິໂມຕູໂຄຣເອທຽນໄຮຕຽນຮັງກາຣຽນອາເມນຽນເຮິຮິໂຣອິນເຕີ" + - "ລິງລົວອິນໂດເນຊຽນອິນເຕີລິງກຣີອິກໂບເຊສວຍຢີອິນນູປຽກອີໂດໄອສແລນດິກອິຕາລຽນອິ" + - "ນນຸກຕິຕັດຍີ່ປຸ່ນຈາແວນີສຈໍຈຽນຄອງໂກຄິຄູຢຸກວນຍາມາຄາຊັກກຣີນແລນລິດຂະເໝນຄັນນ" + - "າດາເກົາຫລີຄານຸລິຄາສເມຍຣິເຄີດິສໂຄມິຄໍນິຊເກຍກີສລາຕິນລັກເຊມບວກກິຊແກນດາລິມ" + - "ເບີກີຊລິງກາລາລາວລິທົວນຽນລູບາ-ຄາຕັງກາລັດວຽນມາລາກາສຊີມາຊານເລັດມາວຣິແມຊິໂ" + - "ດນຽນມາເລອາລຳມອງໂກເລຍມາຣາທີມາເລມອລທີສມຽນມານາຢູລູເອັນເດເບເລເໜືອເນປາລີເອັ" + - "ນດອງກາດັຊນໍເວຈຽນ ນີນອກນໍເວຈຽນ ບັອກມອລນີບີລີໃຕ້ນາວາໂຈນານຈາອັອກຊີຕານໂອຈິ" + - "ບວາໂອໂຣໂມໂອຣິຢາອອດເຊຕິກປັນຈາບີປາລີໂປລິຊປາສໂຕປອກຕຸຍກິສຄີຊົວໂຣແມນຊ໌ຣຸນດິ" + - "ໂຣແມນຽນລັດເຊຍຄິນຢາວານດາສັນສະກຣິດສາດີນຽນສິນທິຊາມິເໜືອແຊງໂກສິນຫາລາສະໂລແວ" + - "ັກສະໂລເວນຽນຊາມົວໂຊນາໂຊມາລີອານບານຽນເຊີບຽນຊຣາຕິໂຊໂທໃຕ້ຊຸນແດນນີສສະວີດິຊຊວ" + - "າຮີລິທາມິລເຕລູກູທາຈິກໄທຕິກຣິນຢາເທີກເມັນເຕສະວານາທອງການເທີຄິຊເຕຊອງກາທາທາ" + - "ຕາຮີຕຽນອຸຍເຄີຢູເຄຣນຽນອູຣດູອຸສເບກເວນດາຫວຽດນາມໂວລາພັກວໍລູມວໍລອບໂຮຊາຢິວໂຢ" + - "ຣູບາຊວາງຈີນຊູລູແອັກຊີເນັສອາໂຄລີອາແດງມີເອດີຮິແອຟີຮີລີອາເຮັມໄອນູອັກກາດຽມ" + - "ອາເລີດອານໄຕໃຕ້ອັງກິດໂບຮານແອນຈີກາອາລາມິກມາພຸດຊີອາຣາປາໂຮອາຣາແວກອາຊູອັສຕູ" + - "ຮຽນອາວາຮິບາລູຊີບາລີເນັດບາຊາບາມຸນໂຄມາລາບີເຈເບັມບາບີນາບາຟັດບາໂລຈີ ພາກຕາເ" + - "ວັນຕົກໂບພູຣິບີຄອນບີນີກົມຊິກຊິກາບຣາໂບດູອາຄຸດບູຣຽດບູຈີເນັດບູລູບລິນເມດູມບ" + - "າແຄດໂດຄາຣິບຄາຢູກາອາດແຊມຊີບູໂນຊີກາຊິບຊາຊາກາໄຕຊູເກດມາຣິຊີນຸກຈາກອນຊອກຕິວຊ" + - "ີພິວຢານຊີໂຣກີຊີເຢນນີໂຊຣານິ ເຄີດິຊຄອບຕິກຄຣີເມນເຕີຄິຊເຊເຊວາ ໂຄຣດ ຝຣັ່ງກາ" + - "ຊູບຽນດາໂກຕາດາກວາໄຕຕາເດລາວາຊີເລັບໂດກຣິບດິນກາຊາມາດອກຣີຊໍບຽນຕໍ່ກວ່າດົວລາດ" + - "ັກກາງໂຈລາ-ຟອນຢີດູລາດາຊາກາເອັມບູອີຟິກອີຢິບບູຮານອີກາຈັກອີລາໄມອັງກິດກາງອີ" + - "ວອນດູແຟງຟີລິປີໂນຟອນຟຮັ່ງເສດກາງຟຮັ່ງເສດໂບຮານຟຣີຊຽນເໜືອຟຣີຊຽນຕາເວັນອອກຟຣ" + - "ີລຽນກາກາກາອຸຊກາໂຢບາຍາກີກິນເບີເທັດເຢຍລະມັນສູງກາງເຢຍລະມັນສູງໂບຮານກອນດີໂກ" + - "ຣອນຕາໂຣກອດຮິກກຣີໂບແອນຊຽນກຣີກສະວິສ ເຈີແມນກູຊິວິດອິນໄຮດາຮາໄວອຽນຮິຣິໄກນອນ" + - "ຮິດໄຕມອງຊໍບຽນ ທາງຕອນເໜືອຮູປາໄອບານໄອໄບໄບໂອໄອໂລໂກອິນກັຊໂລບບັນງອມບາມາແຊມຈ" + - "ູແດວ-ເພີຊຽນຈູແດວ-ອາລາບິກກາຣາ-ການປາກກາໄບລ໌ກາຊິນຈຣູກາມບາກະວີກາບາດຽນຄາແນມ" + - "ບູຕີບມາຄອນເດຄາເວີເດຍນູໂຄໂລຄາສິໂຄຕັນຄອຍຣາ ຊິນີຄາໂກຄາເລັນຈິນຄິມບັນດູໂຄມີ" + - "-ເພີມຢັກກອນການີຄູສໄລກາແປຣກາຣາໄຊ-ບານກາກາເຣລຽນກູຣູກຊຳບາລ້າບາເຟຍໂຄລອກນຽນຄູມ" + - "ີກຄູເທໄນລາດີໂນແລນກິລານດາແລມບາລີຊຽນລາໂກຕາແມັງໂກ້ໂລຊິລູຣິ ທາງຕອນເໜືອລູບາ" + - "-ລູລົວລູເຊໂນລຸນດາລົວລູໄຊລູໄຍມາດູລາມາຟາມາກາຮິໄມທີລິມາກາຊາຣມັນດິງກາມາໄຊມາບ" + - "າມອກຊາມານດາຣເມນເດເມຣູມໍຣິສເຢນໄອລິດກາງມາຄູວາ-ມີດໂຕເມທາມິກແມກທີແນງກາບູແມ" + - "ນຈູມານີພູຣິໂມຫາມອສຊີມັນດັງຫລາຍພາສາຄຣິກມີລັນດາມາວາຣິມໍຢິນເອີຍາມາແຊນເດີລ" + - "ັງນາໂປລີນາມາເຢຍລະມັນ ຕອນໄຕ້ນີວາຣິນີ່ອັດນີ່ອູກວາຊີໂອຈີ່ມບູນນໍໄກນໍໂບຮານເ" + - "ອັນໂກໂຊໂທເໜືອເນີເນວາດັ້ງເດີມນາມວີຊິນານຄອນໂນໂຣນິມາໂອແຊກຕູກີອອດໂຕມັນປານກ" + - "າຊີມານພາລາວີປາມປານກາປາມເປຍເມັນໂທປາລົວອານໄນຈີຣຽນພິດກິນເປີເຊຍໂບຮານຟີນີເຊ" + - "ຍພອນເພໂປວອງຊານໂບຮານKʼicheʼຣາຈັສທານິຣາປານຸຍຣາໂຣທອນການຣົມໂບໂຣເມນີອາໂຣມານ" + - "ຽນອາຣວາຊັນດາວຊາກາສາມາຣິແຕນ-ຊຳບູຣູຊາຊັກຊານທາລິກຳເບຊານກູຊີຊິລີນສກອດພາກໄຕ" + - "້ ຂອງ ກູດິດຊີນີກາຊີນາເຊນຄັບໂຄຍຣາໂບໂຣ ເຊນນິອີຣິຊເກົ່າທາເຊວຫິດຊານອາລັບ-ຊ" + - "າດຊິດາໂມຊາມິໃຕ້ລຸນຊາມິອີນາຣິຊາມິສກອດຊາມິໂຊນິນກີຊອກດິນສຣານນານຕອນໂກເຊເລີ" + - "ຊາໂຮຊູຄູມ້າຊູຊູຊູເມີເລຍໂຄໂນຣຽນຊີເລຍແບບດັ້ງເດີມຊີເລຍທີມເນເຕໂຊເຕເລໂນເຕຕູ" + - "ມໄທກຣີຕີວໂຕເກເລົາຄຣິງກອນທລີງກິດທາມາກເຊກນາຍອາຊາຕອງກາທອກພີຊິນຕາໂລໂກຊີມຊີ" + - "ແອນຕຳບູກາຕູວາລູຕາຊາວັກຕູວີນຽນອັດລາສ ທາມາຊີກ ກາງອຸດມັດຢູກາລິກອຳບັນດູລູດ" + - "ໄວໂວຕິກວັນໂຈວາເຊີວາລາໂມວາເລວາໂຊວາຣພິຣິການມິກໂຊກາເຢົ້າຢັບແຍງເບນແຢມບາກວາ" + - "ງຕຸ້ງຊາໂປແຕບສັນຍາລັກບລີຊິມເຊນາກາໂມຣັອກແຄນ ທາມາຊີກ ມາດຕະຖານຊູນີບໍ່ມີເນື" + - "້ອຫາພາສາຊາຊາອາຣາບິກມາດຕະຖານສະໄໝໃໝ່ເຢຍລະມັນ (ໂອສຕຣິດ)ສະວິສ ໄຮ ເຈີແມນອັງ" + - "ກິດ (ໂອດສະຕາລີ)ອັງກິດ (ບຣິດທິຊ)ອັງກິດ (ອາເມລິກັນ)ລາຕິນ ອາເມຣິກັນ ສະແປນ" + - "ນິຊສະເປັນ ຢຸໂຣບເມັກຊິກັນ ສະແປນນິຊຟລັງ(ການາດາ)ຊາຊອນ ຕອນໄຕຟລີມິຊປອກຕຸຍກິ" + - "ສ ບະເລຊີ່ນປອກຕຸຍກິສ ຢຸໂຣບໂມດາວຽນເຊີໂບ-ໂກເຊຍຄອງໂກ ຊວາຮີລິຈີນແບບຮຽບງ່າຍຈ" + - "ີນແບບດັ້ງເດີມ" - -var loLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x0024, 0x003f, 0x0057, 0x0066, 0x007b, 0x0099, - 0x00a8, 0x00c0, 0x00d5, 0x00ea, 0x010b, 0x011a, 0x0138, 0x0150, - 0x0165, 0x017a, 0x0192, 0x01a7, 0x01b9, 0x01cb, 0x01e0, 0x01ef, - 0x0201, 0x0213, 0x0219, 0x0222, 0x023d, 0x024c, 0x0255, 0x0264, - 0x027c, 0x028e, 0x02a3, 0x02af, 0x02bb, 0x02cd, 0x02df, 0x02f7, - 0x030f, 0x031e, 0x0330, 0x033c, 0x034e, 0x035d, 0x036c, 0x037b, - 0x03a9, 0x03b8, 0x03d9, 0x03ee, 0x0403, 0x041b, 0x042a, 0x043c, - 0x044e, 0x045d, 0x0475, 0x048d, 0x049c, 0x04b4, 0x04c9, 0x04de, - // Entry 40 - 7F - 0x0502, 0x0520, 0x0544, 0x0553, 0x0568, 0x0580, 0x058c, 0x05a7, - 0x05bc, 0x05dd, 0x05f2, 0x0607, 0x0616, 0x0625, 0x0637, 0x064c, - 0x065b, 0x0679, 0x0688, 0x069d, 0x06b2, 0x06c4, 0x06dc, 0x06ee, - 0x06fa, 0x0709, 0x071b, 0x072a, 0x074e, 0x075d, 0x0778, 0x078d, - 0x0796, 0x07ae, 0x07d0, 0x07e2, 0x07fd, 0x0818, 0x0827, 0x0842, - 0x085a, 0x0872, 0x0884, 0x0890, 0x08a2, 0x08b1, 0x08c3, 0x08ed, - 0x08ff, 0x091a, 0x0923, 0x0948, 0x0973, 0x098e, 0x09a0, 0x09af, - 0x09ca, 0x09df, 0x09f1, 0x0a03, 0x0a1b, 0x0a30, 0x0a3c, 0x0a4b, - // Entry 80 - BF - 0x0a5a, 0x0a75, 0x0a84, 0x0a99, 0x0aa8, 0x0abd, 0x0acf, 0x0aed, - 0x0b08, 0x0b1d, 0x0b2c, 0x0b44, 0x0b53, 0x0b68, 0x0b80, 0x0b9b, - 0x0baa, 0x0bb6, 0x0bc8, 0x0be0, 0x0bf2, 0x0c01, 0x0c16, 0x0c31, - 0x0c46, 0x0c5b, 0x0c6a, 0x0c7c, 0x0c8b, 0x0c91, 0x0ca9, 0x0cc1, - 0x0cd9, 0x0ceb, 0x0cfd, 0x0d12, 0x0d1e, 0x0d33, 0x0d45, 0x0d5d, - 0x0d6c, 0x0d7e, 0x0d8d, 0x0da2, 0x0db7, 0x0dc6, 0x0dd5, 0x0de1, - 0x0dea, 0x0dfc, 0x0e08, 0x0e11, 0x0e1d, 0x0e3b, 0x0e4d, 0x0e62, - 0x0e74, 0x0e74, 0x0e8c, 0x0e9e, 0x0eaa, 0x0ec2, 0x0ec2, 0x0ed4, - // Entry C0 - FF - 0x0ed4, 0x0eec, 0x0f0d, 0x0f22, 0x0f37, 0x0f4c, 0x0f4c, 0x0f64, - 0x0f64, 0x0f64, 0x0f79, 0x0f79, 0x0f79, 0x0f85, 0x0f85, 0x0f9d, - 0x0f9d, 0x0faf, 0x0fc1, 0x0fd9, 0x0fd9, 0x0fe5, 0x0ff4, 0x0ff4, - 0x1006, 0x1012, 0x1024, 0x1024, 0x1030, 0x103f, 0x103f, 0x1076, - 0x1088, 0x1097, 0x10a3, 0x10a3, 0x10ac, 0x10c1, 0x10c1, 0x10c1, - 0x10ca, 0x10ca, 0x10d6, 0x10e5, 0x10f4, 0x110c, 0x1118, 0x1124, - 0x1139, 0x1148, 0x1157, 0x1169, 0x117b, 0x118d, 0x1199, 0x11a8, - 0x11ba, 0x11c9, 0x11d5, 0x11f3, 0x1205, 0x121d, 0x122f, 0x1244, - // Entry 100 - 13F - 0x1269, 0x127b, 0x127b, 0x129f, 0x12ce, 0x12e3, 0x12f5, 0x1304, - 0x1310, 0x1322, 0x1334, 0x1346, 0x1355, 0x1361, 0x1370, 0x1394, - 0x1394, 0x13a3, 0x13b5, 0x13d1, 0x13dd, 0x13ef, 0x1401, 0x1410, - 0x1410, 0x142e, 0x1443, 0x1455, 0x1470, 0x1470, 0x1485, 0x1485, - 0x148e, 0x14a6, 0x14a6, 0x14af, 0x14af, 0x14d0, 0x14f7, 0x14f7, - 0x1515, 0x1542, 0x1554, 0x155a, 0x156f, 0x156f, 0x157b, 0x1587, - 0x1587, 0x158d, 0x15ab, 0x15ab, 0x15d5, 0x1605, 0x1605, 0x1614, - 0x162f, 0x1641, 0x1650, 0x166e, 0x1690, 0x1690, 0x1690, 0x169c, - // Entry 140 - 17F - 0x16ae, 0x16ba, 0x16ba, 0x16cf, 0x16cf, 0x16ea, 0x16f9, 0x1702, - 0x1730, 0x1730, 0x173c, 0x174b, 0x1763, 0x1775, 0x1787, 0x1787, - 0x1787, 0x1799, 0x17a8, 0x17b7, 0x17d9, 0x17fe, 0x17fe, 0x181d, - 0x182f, 0x183e, 0x1847, 0x1856, 0x1862, 0x1877, 0x188c, 0x1895, - 0x18aa, 0x18c8, 0x18c8, 0x18d4, 0x18d4, 0x18e0, 0x18ef, 0x190b, - 0x190b, 0x190b, 0x1917, 0x1932, 0x194a, 0x196c, 0x1981, 0x1990, - 0x199f, 0x19c1, 0x19c1, 0x19c1, 0x19d6, 0x19e5, 0x19fa, 0x1a09, - 0x1a21, 0x1a30, 0x1a42, 0x1a54, 0x1a63, 0x1a72, 0x1a81, 0x1a90, - // Entry 180 - 1BF - 0x1a90, 0x1a90, 0x1a90, 0x1aa2, 0x1aa2, 0x1ab7, 0x1ac3, 0x1aee, - 0x1aee, 0x1b0a, 0x1b1c, 0x1b2b, 0x1b34, 0x1b40, 0x1b4c, 0x1b4c, - 0x1b4c, 0x1b5e, 0x1b6a, 0x1b7c, 0x1b8e, 0x1ba3, 0x1bbb, 0x1bc7, - 0x1bd3, 0x1be2, 0x1bf4, 0x1c03, 0x1c0f, 0x1c27, 0x1c3f, 0x1c61, - 0x1c6d, 0x1c7f, 0x1c9a, 0x1ca9, 0x1cc1, 0x1ccd, 0x1cdc, 0x1cdc, - 0x1cee, 0x1d06, 0x1d12, 0x1d27, 0x1d39, 0x1d39, 0x1d48, 0x1d57, - 0x1d78, 0x1d78, 0x1d8a, 0x1d96, 0x1dc1, 0x1dd3, 0x1de5, 0x1df4, - 0x1df4, 0x1e09, 0x1e1e, 0x1e2a, 0x1e3f, 0x1e3f, 0x1e51, 0x1e69, - // Entry 1C0 - 1FF - 0x1e72, 0x1e96, 0x1eab, 0x1ebd, 0x1ec9, 0x1ed5, 0x1ee4, 0x1f08, - 0x1f26, 0x1f38, 0x1f50, 0x1f74, 0x1f8c, 0x1f8c, 0x1fb3, 0x1fb3, - 0x1fb3, 0x1fd4, 0x1fd4, 0x1fe9, 0x1fe9, 0x1fe9, 0x1ff8, 0x1ff8, - 0x201f, 0x2028, 0x2028, 0x2043, 0x2058, 0x2076, 0x2076, 0x2076, - 0x2085, 0x2097, 0x2097, 0x2097, 0x2097, 0x20b2, 0x20c1, 0x20d3, - 0x20df, 0x20fb, 0x210d, 0x211c, 0x2131, 0x2131, 0x213d, 0x214c, - 0x2161, 0x216d, 0x216d, 0x2199, 0x21ab, 0x21b7, 0x21b7, 0x21c9, - 0x21f4, 0x2212, 0x2212, 0x222a, 0x2233, 0x224c, 0x225e, 0x225e, - // Entry 200 - 23F - 0x225e, 0x2273, 0x2288, 0x22a6, 0x22be, 0x22d3, 0x22e5, 0x2309, - 0x2318, 0x2324, 0x2324, 0x2339, 0x2345, 0x235d, 0x2372, 0x23a2, - 0x23b1, 0x23b1, 0x23b1, 0x23c0, 0x23cc, 0x23de, 0x23ed, 0x23fc, - 0x2405, 0x241d, 0x241d, 0x2432, 0x2447, 0x2447, 0x245f, 0x2483, - 0x249b, 0x249b, 0x24ad, 0x24ad, 0x24c5, 0x24c5, 0x24d7, 0x24e9, - 0x24fe, 0x2513, 0x2545, 0x2557, 0x256c, 0x2581, 0x258a, 0x2590, - 0x2590, 0x2590, 0x2590, 0x2590, 0x259f, 0x259f, 0x25ae, 0x25bd, - 0x25cf, 0x25db, 0x25e7, 0x25fc, 0x25fc, 0x260e, 0x260e, 0x261a, - // Entry 240 - 27F - 0x2629, 0x2632, 0x2644, 0x2653, 0x2653, 0x266b, 0x2680, 0x26aa, - 0x26aa, 0x26bc, 0x2706, 0x2712, 0x2742, 0x274e, 0x2790, 0x2790, - 0x27c0, 0x27e9, 0x2819, 0x2819, 0x2843, 0x2873, 0x28b7, 0x28d9, - 0x290d, 0x290d, 0x292d, 0x292d, 0x294c, 0x295e, 0x2992, 0x29bd, - 0x29d2, 0x29f1, 0x2a16, 0x2a3d, 0x2a67, -} // Size: 1250 bytes - -const ltLangStr string = "" + // Size: 5947 bytes - "afarųabchazųavestųafrikanųakanųamharųaragonesųarabųasamųavarikųaimarųaze" + - "rbaidžaniečiųbaškirųbaltarusiųbulgarųbislamabambarųbengalųtibetiečiųbret" + - "onųbosniųkatalonųčečėnųčamorųkorsikiečiųkryčekųbažnytinė slavųčiuvašųval" + - "ųdanųvokiečiųdivehųbotijųeviųgraikųanglųesperantoispanųestųbaskųpersųfu" + - "lahųsuomiųfidžiųfarerųprancūzųvakarų fryzųairiųškotų (gėlų)galisųgvarani" + - "ųgudžaratųmeniečiųhausųhebrajųhindihiri motukroatųHaičiovengrųarmėnųher" + - "erųtarpinėindoneziečiųinterkalbaigbųsičuan jiinupiakųidoislandųitalųinuk" + - "itutjaponųjaviečiųgruzinųKongokikujųkuaniamakazachųkalalisutkhmerųkanadų" + - "korėjiečiųkanuriųkašmyrųkurdųkomikornųkirgizųlotynųliuksemburgiečiųganda" + - "limburgiečiųngalųlaosiečiųlietuviųluba katangalatviųmalagasųMaršalo Salų" + - "maoriųmakedonųmalajaliųmongolųmaratųmalajiečiųmaltiečiųbirmiečiųnaurųšia" + - "urės ndebelųnepaliečiųndongųolandųnaujoji norvegųnorvegų bukmolaspietų n" + - "debelenavajųnianjųočitarųojibvaoromųodijųosetinųpendžabųpalilenkųpuštūnų" + - "portugalųkečujųretoromanųrundirumunųrusųkinjaruandųsanskritassardiniečių" + - "sindųšiaurės samiųsangosinhalųslovakųslovėnųSamoašonųsomaliečiųalbanųser" + - "bųsvatųpietų Sotosundųšvedųsuahiliųtamilųtelugųtadžikųtajųtigrajųturkmėn" + - "ųtsvanųtonganųturkųtsongųtotoriųtaitiečiųuigūrųukrainiečiųurdųuzbekųven" + - "dųvietnamiečiųvolapiukovalonųvolofųkosųjidišjorubųchuangkinųzulųačinezųa" + - "koliųadangmųadygėjųTuniso arabųafrihiliaghemųainųakadianųalabamiečiųaleu" + - "tųalbanų kalbos gegų tarmėpietų Altajaussenoji anglųangikųaramaikųmapudu" + - "ngunųaraonųarapahųAlžyro arabųaravakųMaroko arabųEgipto arabųasuAmerikos" + - " ženklų kalbaasturianųkotavaavadhibalučibaliečiųbavarųbasųbamunųbatak to" + - "baghomalųbėjųbembųbetavibenųbafutųbadagavakarų beludžiųbaučpuribikolųbin" + - "ibandžarųkomųsiksikųbišnuprijosbakhtiaribrajųbrahujųbodoakūsųburiatųbugi" + - "nezųbulublinmedumbųkadokaribųkaijūgųatsamųsebuanųčigųčibčųčagatųčukesųma" + - "riųčinuk žargonasčoktaučipvėjųčerokiųčajenųsoranių kurdųkoptųcapiznonKry" + - "mo turkųSeišelių kreolų ir prancūzųkašubųdakotųdargvataitųdelaveroslaved" + - "ogribųdinkųzarmųdogrižemutinių sorbųcentrinio DusunodualųVidurio Vokieti" + - "josdžiola-fonidyulųdazagųembuefikitalų kalbos Emilijos tarmėsenovės egip" + - "tiečiųekajukelamitųVidurio Anglijoscentrinės Aliaskos jupikųevondoispanų" + - " kalbos Ekstremadūros tarmėfangųfilipiniečiųsuomių kalbos Tornedalio tar" + - "mėfonkadžunų prancūzųVidurio Prancūzijossenoji prancūzųarpitanošiaurinių" + - " fryzųrytų fryzųfriuliųgagagaūzųkinų kalbos dziangsi tarmėgajogbajazoroa" + - "strų darigyzkiribatigilakiVidurio Aukštosios Vokietijossenoji Aukštosios" + - " VokietijosGoa konkaniųgondigorontalogotųgrebosenovės graikųŠveicarijos " + - "vokiečiųvajųfrafragusigvičinohaidokinų kalbos hakų tarmėhavajiečiųFidžio" + - " hindihiligainonųhititųhmongaukštutinių sorbųkinų kalbos hunano tarmėhup" + - "aibanibibijųilokųingušųingrųJamaikos kreolų anglųloibanngombųmačamųjudėj" + - "ų persųjudėjų arabųdanų kalbos jutų tarmėkarakalpakųkebailųkačinųjukemb" + - "ųkaviųkabardinųkanembųtyapmakondųŽaliojo Kyšulio kreolųkenyangkorokaing" + - "angkasikotanezųkojra činikhovarųkirmanjkikakokalenjinųkimbundukomių-perm" + - "iųkonkaniųkosreanųkpeliųkaračiajų balkarijoskriokinaray-akarelųkurukšamb" + - "alųbafųkolognųkumikųkutenailadinolangilandalambalezginųnaujoji frankų ka" + - "lbaligūrųlyviųlakotųlombardųmongųloziųšiaurės lurilatgaliųluba lulualuis" + - "enoLundosluomizolujaklasikinė kinųlazmadurezųmafųmagahimaithiliMakasarom" + - "andingųmasajųmabųmokšamandarųmendemerųmorisijųVidurio Airijosmakua-maeto" + - "metamikmakųminangkabaumančumanipuriųmohokmosivakarų marimundangųkelios k" + - "alboskrykųmirandezųmarvarimentavaimjenųerzyjųmazenderaniųkinų kalbos pie" + - "tų minų tarmėneapoliečiųnamaŽemutinės Vokietijosnevariniasniujiečiųao na" + - "gakvasiųngiembūnųnogųsenoji norsųnovialenkošiaurės Sotonuerųklasikinė ne" + - "variniamveziniankolųniorųnzimaosageosmanų turkųpangasinanųvidurinė persų" + - " kalbapampangųpapiamentopalauliečiųpikardųNigerijos pidžinųPensilvanijos" + - " vokiečiųvokiečių kalbos žemaičių tarmėsenoji persųvokiečių kalbos Pfalc" + - "o tarmėfinikiečiųitalų kalbos Pjemonto tarmėPontoPonapėsprūsųsenovės pro" + - "vansalųkičiųČimboraso aukštumų kečujųRadžastanorapanuirarotonganųitalų k" + - "albos Romanijos tarmėrifųromboromųrotumanųrusinųRovianosaromaniųruasanda" + - "viųjakutųsamarėjų aramiųsambūrųsasaksantaliųsauraštrųngambajųsangųsicili" + - "ečiųškotųsasaresų sardinųpietų kurdųsenecųsenųseriselkupkojraboro senise" + - "noji airiųžemaičiųtachelhitųšanchadian arabųsidamųsileziečių žemaičiųsel" + - "ajarųpietų samiųLiuleo samiųInario samiųSkolto samiųsoninkesogdiensranan" + - " tongosererųsahoSaterlendo fryzųsukumasusušumerųkomorųklasikinė sirųsirų" + - "sileziečiųtulųtimnetesoTerenotetumtigretivTokelautsakurųklingonųtlingitų" + - "talyšųtamašekniasa tongųPapua pidžinųturoyoTarokotsakonųtsimšianmusulmon" + - "ų tatųtumbukųTuvalutasavakųtuviųCentrinio Maroko tamazitųudmurtųugaritų" + - "umbundurūtvaivenetųvepsųvakarų flamandųpagrindinė frankonųVotikveruvunjo" + - "valserųvalamovaraiVašovalrpirikinų kalbos vu tarmėkalmukųmegrelųsogųjaoj" + - "apezųjangbenųjembųnjengatukinų kalbos Kantono tarmėzapotekųBLISS simboli" + - "ųzelandųzenagastandartinė Maroko tamazigtųZuninėra kalbinio turiniozaza" + - "šiuolaikinė standartinė arabųAustrijos vokiečiųŠveicarijos aukštutinė v" + - "okiečiųAustralijos anglųKanados anglųDidžiosios Britanijos anglųJungtini" + - "ų Valstijų anglųLotynų Amerikos ispanųEuropos ispanųMeksikos ispanųKana" + - "dos prancūzųŠveicarijos prancūzųŽemutinės Saksonijos (Nyderlandai)flaman" + - "dųBrazilijos portugalųEuropos portugalųmoldavųserbų-kroatųKongo suahilių" + - "supaprastintoji kinųtradicinė kinų" - -var ltLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0006, 0x000e, 0x0015, 0x001e, 0x0024, 0x002b, 0x0035, - 0x003b, 0x0041, 0x0049, 0x0050, 0x0063, 0x006c, 0x0077, 0x007f, - 0x0086, 0x008e, 0x0096, 0x00a2, 0x00aa, 0x00b1, 0x00ba, 0x00c4, - 0x00cc, 0x00d9, 0x00dc, 0x00e2, 0x00f4, 0x00fe, 0x0103, 0x0108, - 0x0112, 0x0119, 0x0120, 0x0125, 0x012c, 0x0132, 0x013b, 0x0142, - 0x0147, 0x014d, 0x0153, 0x015a, 0x0161, 0x0169, 0x0170, 0x017a, - 0x0188, 0x018e, 0x019e, 0x01a5, 0x01ae, 0x01b9, 0x01c3, 0x01c9, - 0x01d1, 0x01d6, 0x01df, 0x01e6, 0x01ed, 0x01f4, 0x01fc, 0x0203, - // Entry 40 - 7F - 0x020b, 0x0219, 0x0223, 0x0228, 0x0232, 0x023b, 0x023e, 0x0246, - 0x024c, 0x0254, 0x025b, 0x0265, 0x026d, 0x0272, 0x0279, 0x0281, - 0x0289, 0x0292, 0x0299, 0x02a0, 0x02ad, 0x02b5, 0x02be, 0x02c4, - 0x02c8, 0x02ce, 0x02d6, 0x02dd, 0x02ef, 0x02f4, 0x0302, 0x0308, - 0x0313, 0x031c, 0x0328, 0x032f, 0x0338, 0x0346, 0x034d, 0x0356, - 0x0360, 0x0368, 0x036f, 0x037b, 0x0386, 0x0391, 0x0397, 0x03a9, - 0x03b5, 0x03bc, 0x03c3, 0x03d3, 0x03e4, 0x03f2, 0x03f9, 0x0400, - 0x0409, 0x040f, 0x0415, 0x041b, 0x0423, 0x042d, 0x0431, 0x0437, - // Entry 80 - BF - 0x0441, 0x044b, 0x0453, 0x045e, 0x0463, 0x046a, 0x046f, 0x047b, - 0x0485, 0x0492, 0x0498, 0x04a8, 0x04ad, 0x04b5, 0x04bd, 0x04c6, - 0x04cb, 0x04d1, 0x04dd, 0x04e4, 0x04ea, 0x04f0, 0x04fb, 0x0501, - 0x0508, 0x0511, 0x0518, 0x051f, 0x0528, 0x052d, 0x0535, 0x053f, - 0x0546, 0x054e, 0x0554, 0x055b, 0x0563, 0x056e, 0x0576, 0x0583, - 0x0588, 0x058f, 0x0595, 0x05a3, 0x05ac, 0x05b3, 0x05ba, 0x05bf, - 0x05c5, 0x05cc, 0x05d2, 0x05d7, 0x05dc, 0x05e5, 0x05ec, 0x05f4, - 0x05fd, 0x060a, 0x0612, 0x0619, 0x061e, 0x0627, 0x0634, 0x063b, - // Entry C0 - FF - 0x0656, 0x0665, 0x0672, 0x0679, 0x0682, 0x068e, 0x0695, 0x069d, - 0x06ab, 0x06ab, 0x06b3, 0x06c0, 0x06cd, 0x06d0, 0x06e7, 0x06f1, - 0x06f7, 0x06fd, 0x0704, 0x070e, 0x0715, 0x071a, 0x0721, 0x072b, - 0x0733, 0x0739, 0x073f, 0x0745, 0x074a, 0x0751, 0x0757, 0x0769, - 0x0772, 0x0779, 0x077d, 0x0787, 0x078c, 0x0794, 0x07a0, 0x07a9, - 0x07af, 0x07b7, 0x07bb, 0x07c2, 0x07ca, 0x07d3, 0x07d7, 0x07db, - 0x07e3, 0x07e7, 0x07ee, 0x07f7, 0x07fe, 0x0806, 0x080c, 0x0814, - 0x081c, 0x0824, 0x082a, 0x083a, 0x0841, 0x084b, 0x0854, 0x085c, - // Entry 100 - 13F - 0x086b, 0x0871, 0x0879, 0x0885, 0x08a5, 0x08ad, 0x08b4, 0x08ba, - 0x08c0, 0x08c8, 0x08cd, 0x08d5, 0x08db, 0x08e1, 0x08e6, 0x08f8, - 0x0908, 0x090e, 0x0920, 0x092c, 0x0932, 0x0939, 0x093d, 0x0941, - 0x095e, 0x0973, 0x0979, 0x0981, 0x0991, 0x09ac, 0x09b2, 0x09d6, - 0x09dc, 0x09ea, 0x0a0a, 0x0a0d, 0x0a21, 0x0a35, 0x0a46, 0x0a4e, - 0x0a60, 0x0a6c, 0x0a74, 0x0a76, 0x0a7f, 0x0a9b, 0x0a9f, 0x0aa4, - 0x0ab3, 0x0ab6, 0x0abe, 0x0ac4, 0x0ae2, 0x0aff, 0x0b0c, 0x0b11, - 0x0b1a, 0x0b1f, 0x0b24, 0x0b34, 0x0b4b, 0x0b50, 0x0b56, 0x0b5a, - // Entry 140 - 17F - 0x0b62, 0x0b67, 0x0b80, 0x0b8c, 0x0b99, 0x0ba5, 0x0bac, 0x0bb1, - 0x0bc5, 0x0bdf, 0x0be3, 0x0be7, 0x0bef, 0x0bf5, 0x0bfd, 0x0c03, - 0x0c1a, 0x0c20, 0x0c27, 0x0c2f, 0x0c3e, 0x0c4d, 0x0c66, 0x0c72, - 0x0c7a, 0x0c82, 0x0c84, 0x0c8a, 0x0c90, 0x0c9a, 0x0ca2, 0x0ca6, - 0x0cae, 0x0cc7, 0x0cce, 0x0cd2, 0x0cda, 0x0cde, 0x0ce7, 0x0cf2, - 0x0cfa, 0x0d03, 0x0d07, 0x0d11, 0x0d19, 0x0d27, 0x0d30, 0x0d39, - 0x0d40, 0x0d56, 0x0d5a, 0x0d63, 0x0d6a, 0x0d6f, 0x0d78, 0x0d7d, - 0x0d85, 0x0d8c, 0x0d93, 0x0d99, 0x0d9e, 0x0da3, 0x0da8, 0x0db0, - // Entry 180 - 1BF - 0x0dc5, 0x0dcd, 0x0dd3, 0x0dda, 0x0de3, 0x0de9, 0x0def, 0x0dfd, - 0x0e06, 0x0e10, 0x0e17, 0x0e1d, 0x0e20, 0x0e24, 0x0e28, 0x0e38, - 0x0e3b, 0x0e44, 0x0e49, 0x0e4f, 0x0e57, 0x0e5f, 0x0e68, 0x0e6f, - 0x0e74, 0x0e7a, 0x0e82, 0x0e87, 0x0e8c, 0x0e95, 0x0ea4, 0x0eaf, - 0x0eb3, 0x0ebb, 0x0ec6, 0x0ecc, 0x0ed6, 0x0edb, 0x0edf, 0x0eeb, - 0x0ef4, 0x0f01, 0x0f07, 0x0f11, 0x0f18, 0x0f20, 0x0f26, 0x0f2d, - 0x0f3a, 0x0f5a, 0x0f67, 0x0f6b, 0x0f81, 0x0f87, 0x0f8b, 0x0f96, - 0x0f9d, 0x0fa4, 0x0faf, 0x0fb4, 0x0fc1, 0x0fc7, 0x0fcb, 0x0fd9, - // Entry 1C0 - 1FF - 0x0fdf, 0x0ff0, 0x0ff8, 0x1001, 0x1007, 0x100c, 0x1011, 0x101f, - 0x102b, 0x1041, 0x104a, 0x1054, 0x1061, 0x1069, 0x107c, 0x1094, - 0x10b8, 0x10c5, 0x10e4, 0x10f0, 0x110d, 0x1112, 0x111a, 0x1121, - 0x1135, 0x113c, 0x115a, 0x1165, 0x116c, 0x1178, 0x1196, 0x119b, - 0x11a0, 0x11a5, 0x11ae, 0x11b5, 0x11bd, 0x11c6, 0x11c9, 0x11d2, - 0x11d9, 0x11eb, 0x11f4, 0x11f9, 0x1202, 0x120d, 0x1216, 0x121c, - 0x1228, 0x122f, 0x1241, 0x124e, 0x1255, 0x125a, 0x125e, 0x1264, - 0x1272, 0x127f, 0x128a, 0x1295, 0x1299, 0x12a7, 0x12ae, 0x12c6, - // Entry 200 - 23F - 0x12cf, 0x12dc, 0x12e9, 0x12f6, 0x1303, 0x130a, 0x1311, 0x131d, - 0x1324, 0x1328, 0x1339, 0x133f, 0x1343, 0x134b, 0x1352, 0x1362, - 0x1367, 0x1373, 0x1378, 0x137d, 0x1381, 0x1387, 0x138c, 0x1391, - 0x1394, 0x139b, 0x13a3, 0x13ac, 0x13b5, 0x13bd, 0x13c5, 0x13d1, - 0x13e0, 0x13e6, 0x13ec, 0x13f4, 0x13fd, 0x140d, 0x1415, 0x141b, - 0x1424, 0x142a, 0x1444, 0x144c, 0x1454, 0x145b, 0x145f, 0x1462, - 0x1469, 0x146f, 0x1480, 0x1495, 0x149a, 0x149e, 0x14a3, 0x14ab, - 0x14b1, 0x14b6, 0x14bb, 0x14c3, 0x14d9, 0x14e1, 0x14e9, 0x14ee, - // Entry 240 - 27F - 0x14f1, 0x14f8, 0x1501, 0x1507, 0x150f, 0x152a, 0x1533, 0x1542, - 0x154a, 0x1550, 0x156e, 0x1572, 0x1588, 0x158c, 0x15ad, 0x15ad, - 0x15c1, 0x15e5, 0x15f7, 0x1605, 0x1622, 0x163d, 0x1655, 0x1664, - 0x1674, 0x1674, 0x1686, 0x169d, 0x16c1, 0x16ca, 0x16df, 0x16f1, - 0x16f9, 0x1707, 0x1716, 0x172b, 0x173b, -} // Size: 1250 bytes - -const lvLangStr string = "" + // Size: 4355 bytes - "afāruabhāzuavestaafrikanduakanuamharuaragoniešuarābuasamiešuavāruaimarua" + - "zerbaidžāņubaškīrubaltkrievubulgārubišlamābambarubengāļutibetiešubretoņu" + - "bosniešukatalāņučečenučamorrukorsikāņukrīčehubaznīcslāvučuvašuvelsiešudā" + - "ņuvācumaldīviešudzongkeevugrieķuangļuesperantospāņuigauņubaskupersiešuf" + - "ulusomufidžiešufērufrančurietumfrīzuīrugēlugalisiešugvaranugudžaratumeni" + - "ešuhausuivritshindihirimotuhorvātuhaitiešuungāruarmēņuhereruinterlingvai" + - "ndonēziešuinterlingveigboSičuaņas jiinupiakuidoislandiešuitāļuinuītujapā" + - "ņujaviešugruzīnukongukikujukvaņamukazahugrenlandiešukhmerukannadukoreji" + - "ešukanurukašmiriešukurdukomiešukorniešukirgīzulatīņuluksemburgiešugandul" + - "imburgiešulingalalaosiešulietuviešulubakatangalatviešumalagasumāršaliešu" + - "maorumaķedoniešumalajalumongoļumaratumalajiešumaltiešubirmiešunauruiešuz" + - "iemeļndebelunepāliešundonguholandiešujaunnorvēģunorvēģu bukmolsdienvidnd" + - "ebelunavahučičevaoksitāņuodžibvuoromuorijuosetīnupandžabupālipoļupuštupo" + - "rtugāļukečvuretoromāņurundurumāņukrievukiņaruandasanskritssardīniešusind" + - "huziemeļsāmusangosingāļuslovākuslovēņusamoāņušonusomāļualbāņuserbusvatud" + - "ienvidsotuzunduzviedrusvahilitamilutelugutadžikutajutigrinjaturkmēņucvan" + - "utongiešuturkucongutatārutaitiešuuiguruukraiņuurduuzbekuvenduvjetnamiešu" + - "volapiksvaloņuvolofukhosujidišsjorubudžuanuķīniešuzuluačinuačoluadangmua" + - "diguafrihiliaghemuainuakadiešualeutudienvidaltajiešusenangļuangikaaramie" + - "šuaraukāņuarapahuaravakuasuastūriešuavadhubeludžubaliešubasubamumugomal" + - "ubedžubembubenabafuturietumbeludžubhodžpūrubikolubinukomusiksikubradžieš" + - "ubodonkosiburjatubugubulubilinumedumbukadukarībukajugaatsamusebuāņukigač" + - "ibčudžagatajsčūkumariešučinuku žargonsčoktavučipevaianučirokušejenucentr" + - "ālkurdukoptuKrimas tatārukreolu frančukašubudakotudargutaitudelavērusle" + - "ivudogribudinkuzarmudogrulejassorbudualuvidusholandiešudiola-fonjīdiūlud" + - "azukjembuefikuēģiptiešuekadžukuelamiešuvidusangļuevondufangufilipīniešuf" + - "onuvidusfrančusenfrančuziemeļfrīzuaustrumfrīzufriūlugagagauzugajogbajugē" + - "zukiribatiešuvidusaugšvācusenaugšvācugondu valodasgorontalugotugreboseng" + - "rieķuŠveices vācugusiikučinuhaiduhavajiešuhiligainonuhetuhmonguaugšsorbu" + - "hupuibanuibibioilokuingušuložbansjgomačamujūdpersiešujūdarābukarakalpaku" + - "kabilukačinukadžikambukāvikabardiešukaņembukatabumakondekaboverdiešukoru" + - "khasuhotaniešukoiračiinīkakokalendžīnukimbundukomiešu-permiešukonkanukos" + - "rājiešukpellukaračaju un balkārukarēļukuruhušambalubafijuĶelnes vācukumi" + - "kukutenajuladinolangilandulambulezgīnulakotumongulozuziemeļlurulubalulva" + - "luisenulunduluolušejuluhjumaduriešumafumagahiešumaithilimakasarumandingu" + - "masajumabumokšumandarumendumeruMaurīcijas kreoluvidusīrumakua-meettomgom" + - "ikmakuminangkabavumandžūrumanipūrumohaukumosumundanguvairākas valodaskrī" + - "kumirandiešumarvarumjenuerzjumazanderāņuneapoliešunamalejasvācunevarunja" + - "suniuāņukvasiongjembūnunogajusennorvēģunkoziemeļsotunueruklasiskā nevaru" + - "ņamvezuņankoluņorunzemuvažāžuturku osmaņupangasinanupehlevipampanganupa" + - "pjamentopalaviešupidžinssenpersufeniķiešuponapiešuprūšusenprovansiešukič" + - "eradžastāņurapanujurarotongiešurombočigānuaromūnuruandasandavujakutuSamā" + - "rijas aramiešusamburusasakusantalungambejusangusicīliešuskotudienvidkurd" + - "usenekusenuselkupukoiraboro sennisenīrušilhušanuČadas arābusidamudienvid" + - "sāmuLuleo sāmuInari sāmuskoltsāmusoninkusogdiešusranantogoserērusahosuku" + - "mususušumerukomoruklasiskā sīriešusīriešutemnutesoterenotetumutigrutivut" + - "okelaviešuklingoņutlinkitutuareguNjasas tongutokpisinstarokocimšiāņutumb" + - "ukutuvaliešutasavakutuviešuCentrālmarokas tamazītsudmurtuugaritiešuumbun" + - "dusaknevajuvotuvundžoVallisas vācuvalamuvarajuvašovarlpirīkalmikusogujao" + - "japiešujanbaņujembukantoniešusapotekublissimbolikazenagustandarta marokā" + - "ņu berberuzunjubez lingvistiska saturazazakimūsdienu standarta arābudie" + - "nvidazerbaidžāņuAustrijas vācuŠveices augšvācuAustrālijas angļuKanādas a" + - "ngļuLielbritānijas angļuASV angļuLatīņamerikas spāņuEiropas spāņuMeksika" + - "s spāņuKanādas frančuŠveices frančulejassakšuflāmuBrazīlijas portugāļuEi" + - "ropas portugāļumoldāvuserbu–horvātuKongo svahiliķīniešu vienkāršotāķīnie" + - "šu tradicionālā" - -var lvLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0006, 0x000d, 0x0013, 0x001c, 0x0021, 0x0027, 0x0032, - 0x0038, 0x0041, 0x0047, 0x004d, 0x005c, 0x0065, 0x006f, 0x0077, - 0x0080, 0x0087, 0x0090, 0x009a, 0x00a2, 0x00ab, 0x00b5, 0x00bd, - 0x00c5, 0x00d0, 0x00d4, 0x00d9, 0x00e6, 0x00ee, 0x00f7, 0x00fd, - 0x0102, 0x010e, 0x0115, 0x0118, 0x011f, 0x0125, 0x012e, 0x0135, - 0x013c, 0x0141, 0x014a, 0x014e, 0x0152, 0x015c, 0x0161, 0x0168, - 0x0174, 0x0178, 0x017d, 0x0187, 0x018e, 0x0198, 0x01a0, 0x01a5, - 0x01ab, 0x01b0, 0x01b8, 0x01c0, 0x01c9, 0x01d0, 0x01d8, 0x01de, - // Entry 40 - 7F - 0x01e9, 0x01f6, 0x0201, 0x0205, 0x0212, 0x021a, 0x021d, 0x0228, - 0x022f, 0x0236, 0x023e, 0x0246, 0x024e, 0x0253, 0x0259, 0x0261, - 0x0267, 0x0274, 0x027a, 0x0281, 0x028b, 0x0291, 0x029d, 0x02a2, - 0x02aa, 0x02b3, 0x02bb, 0x02c3, 0x02d2, 0x02d7, 0x02e3, 0x02ea, - 0x02f3, 0x02fe, 0x0309, 0x0312, 0x031a, 0x0327, 0x032c, 0x0339, - 0x0341, 0x0349, 0x034f, 0x0359, 0x0362, 0x036b, 0x0375, 0x0383, - 0x038e, 0x0394, 0x039f, 0x03ac, 0x03bd, 0x03cb, 0x03d1, 0x03d9, - 0x03e3, 0x03eb, 0x03f0, 0x03f5, 0x03fd, 0x0406, 0x040b, 0x0410, - // Entry 80 - BF - 0x0416, 0x0421, 0x0427, 0x0433, 0x0438, 0x0440, 0x0446, 0x0451, - 0x045a, 0x0466, 0x046c, 0x0478, 0x047d, 0x0486, 0x048e, 0x0497, - 0x04a0, 0x04a5, 0x04ad, 0x04b5, 0x04ba, 0x04bf, 0x04ca, 0x04cf, - 0x04d6, 0x04dd, 0x04e3, 0x04e9, 0x04f1, 0x04f5, 0x04fd, 0x0507, - 0x050c, 0x0515, 0x051a, 0x051f, 0x0526, 0x052f, 0x0535, 0x053d, - 0x0541, 0x0547, 0x054c, 0x0558, 0x0560, 0x0567, 0x056d, 0x0572, - 0x0579, 0x057f, 0x0586, 0x0590, 0x0594, 0x059a, 0x05a0, 0x05a7, - 0x05ac, 0x05ac, 0x05b4, 0x05ba, 0x05be, 0x05c7, 0x05c7, 0x05cd, - // Entry C0 - FF - 0x05cd, 0x05de, 0x05e7, 0x05ed, 0x05f6, 0x0600, 0x0600, 0x0607, - 0x0607, 0x0607, 0x060e, 0x060e, 0x060e, 0x0611, 0x0611, 0x061c, - 0x061c, 0x0622, 0x062a, 0x0632, 0x0632, 0x0636, 0x063c, 0x063c, - 0x0642, 0x0648, 0x064d, 0x064d, 0x0651, 0x0657, 0x0657, 0x0665, - 0x0670, 0x0676, 0x067a, 0x067a, 0x067e, 0x0685, 0x0685, 0x0685, - 0x0690, 0x0690, 0x0694, 0x0699, 0x06a0, 0x06a4, 0x06a8, 0x06ae, - 0x06b5, 0x06b9, 0x06c0, 0x06c6, 0x06cc, 0x06d5, 0x06d9, 0x06e0, - 0x06ea, 0x06f0, 0x06f8, 0x0708, 0x0710, 0x071b, 0x0722, 0x0729, - // Entry 100 - 13F - 0x0736, 0x073b, 0x073b, 0x0749, 0x0757, 0x075e, 0x0764, 0x0769, - 0x076e, 0x0777, 0x077d, 0x0784, 0x0789, 0x078e, 0x0793, 0x079d, - 0x079d, 0x07a2, 0x07b2, 0x07be, 0x07c4, 0x07c8, 0x07ce, 0x07d3, - 0x07d3, 0x07df, 0x07e8, 0x07f1, 0x07fc, 0x07fc, 0x0802, 0x0802, - 0x0807, 0x0814, 0x0814, 0x0818, 0x0818, 0x0824, 0x082e, 0x082e, - 0x083b, 0x0848, 0x084f, 0x0851, 0x0858, 0x0858, 0x085c, 0x0861, - 0x0861, 0x0866, 0x0872, 0x0872, 0x0881, 0x088e, 0x088e, 0x089b, - 0x08a4, 0x08a8, 0x08ad, 0x08b7, 0x08c5, 0x08c5, 0x08c5, 0x08ca, - // Entry 140 - 17F - 0x08d1, 0x08d6, 0x08d6, 0x08e0, 0x08e0, 0x08eb, 0x08ef, 0x08f5, - 0x08ff, 0x08ff, 0x0903, 0x0908, 0x090e, 0x0913, 0x091a, 0x091a, - 0x091a, 0x0922, 0x0925, 0x092c, 0x0939, 0x0943, 0x0943, 0x094e, - 0x0954, 0x095b, 0x0961, 0x0966, 0x096b, 0x0976, 0x097e, 0x0984, - 0x098b, 0x0998, 0x0998, 0x099c, 0x099c, 0x09a1, 0x09ab, 0x09b7, - 0x09b7, 0x09b7, 0x09bb, 0x09c7, 0x09cf, 0x09e1, 0x09e8, 0x09f4, - 0x09fa, 0x0a0f, 0x0a0f, 0x0a0f, 0x0a17, 0x0a1d, 0x0a25, 0x0a2b, - 0x0a38, 0x0a3e, 0x0a46, 0x0a4c, 0x0a51, 0x0a56, 0x0a5b, 0x0a63, - // Entry 180 - 1BF - 0x0a63, 0x0a63, 0x0a63, 0x0a69, 0x0a69, 0x0a6e, 0x0a72, 0x0a7d, - 0x0a7d, 0x0a86, 0x0a8d, 0x0a92, 0x0a95, 0x0a9c, 0x0aa1, 0x0aa1, - 0x0aa1, 0x0aab, 0x0aaf, 0x0ab9, 0x0ac1, 0x0ac9, 0x0ad1, 0x0ad7, - 0x0adb, 0x0ae1, 0x0ae8, 0x0aed, 0x0af1, 0x0b03, 0x0b0c, 0x0b18, - 0x0b1b, 0x0b22, 0x0b2e, 0x0b38, 0x0b41, 0x0b48, 0x0b4c, 0x0b4c, - 0x0b54, 0x0b65, 0x0b6b, 0x0b76, 0x0b7d, 0x0b7d, 0x0b82, 0x0b87, - 0x0b94, 0x0b94, 0x0b9f, 0x0ba3, 0x0bad, 0x0bb3, 0x0bb8, 0x0bc0, - 0x0bc0, 0x0bc6, 0x0bd0, 0x0bd6, 0x0be2, 0x0be2, 0x0be5, 0x0bf0, - // Entry 1C0 - 1FF - 0x0bf5, 0x0c05, 0x0c0d, 0x0c15, 0x0c1a, 0x0c1f, 0x0c28, 0x0c35, - 0x0c40, 0x0c47, 0x0c51, 0x0c5b, 0x0c65, 0x0c65, 0x0c6d, 0x0c6d, - 0x0c6d, 0x0c75, 0x0c75, 0x0c80, 0x0c80, 0x0c80, 0x0c8a, 0x0c91, - 0x0ca0, 0x0ca5, 0x0ca5, 0x0cb2, 0x0cba, 0x0cc7, 0x0cc7, 0x0cc7, - 0x0ccc, 0x0cd4, 0x0cd4, 0x0cd4, 0x0cd4, 0x0cdc, 0x0ce2, 0x0ce9, - 0x0cef, 0x0d03, 0x0d0a, 0x0d10, 0x0d17, 0x0d17, 0x0d1f, 0x0d24, - 0x0d2f, 0x0d34, 0x0d34, 0x0d40, 0x0d46, 0x0d4a, 0x0d4a, 0x0d51, - 0x0d60, 0x0d67, 0x0d67, 0x0d6d, 0x0d72, 0x0d7f, 0x0d85, 0x0d85, - // Entry 200 - 23F - 0x0d85, 0x0d91, 0x0d9c, 0x0da7, 0x0db1, 0x0db8, 0x0dc1, 0x0dcb, - 0x0dd2, 0x0dd6, 0x0dd6, 0x0ddc, 0x0de0, 0x0de7, 0x0ded, 0x0e00, - 0x0e09, 0x0e09, 0x0e09, 0x0e0e, 0x0e12, 0x0e18, 0x0e1e, 0x0e23, - 0x0e27, 0x0e33, 0x0e33, 0x0e3c, 0x0e44, 0x0e44, 0x0e4b, 0x0e57, - 0x0e60, 0x0e60, 0x0e66, 0x0e66, 0x0e71, 0x0e71, 0x0e78, 0x0e82, - 0x0e8a, 0x0e92, 0x0eab, 0x0eb2, 0x0ebd, 0x0ec4, 0x0ec9, 0x0ecd, - 0x0ecd, 0x0ecd, 0x0ecd, 0x0ecd, 0x0ed1, 0x0ed1, 0x0ed8, 0x0ee6, - 0x0eec, 0x0ef2, 0x0ef7, 0x0f00, 0x0f00, 0x0f07, 0x0f07, 0x0f0b, - // Entry 240 - 27F - 0x0f0e, 0x0f16, 0x0f1e, 0x0f23, 0x0f23, 0x0f2e, 0x0f36, 0x0f43, - 0x0f43, 0x0f49, 0x0f65, 0x0f6a, 0x0f81, 0x0f87, 0x0fa1, 0x0fb7, - 0x0fc6, 0x0fd9, 0x0fec, 0x0ffb, 0x1011, 0x101b, 0x1032, 0x1041, - 0x1051, 0x1051, 0x1061, 0x1071, 0x107c, 0x1082, 0x1099, 0x10ac, - 0x10b4, 0x10c4, 0x10d1, 0x10ea, 0x1103, -} // Size: 1250 bytes - -const mkLangStr string = "" + // Size: 10280 bytes - "афарскиапхаскиавестанскиафрикансаканскиамхарскиарагонскиарапскиасамскиав" + - "арскиајмарскиазербејџанскибашкирскибелорускибугарскибисламабамбарабенга" + - "лскитибетскибретонскибосанскикаталонскичеченскичаморскикорзиканскикриче" + - "шкицрковнословенскичувашкивелшкиданскигерманскидивехиѕонгкаевегрчкиангл" + - "искиесперантошпанскиестонскибаскискиперсискифулафинскифиџискифарскифран" + - "цускизападнофризискиирскишкотски гелскигалицискигваранскигуџаратиманксх" + - "аусахебрејскихиндихири мотухрватскихаитскиунгарскиерменскихерероинтерли" + - "нгваиндонезискиокциденталигбосичуан јиинупијачкиидоисландскииталијански" + - "инуктитутјапонскијаванскигрузискиконгокикујуквањамаказашкикалалисуткмер" + - "скиканнадакорејскиканурикашмирскикурдскикомикорнскикиргискилатинскилукс" + - "ембуршкигандалимбуршкилингалалаошкилитванскилуба-катангалатвискималгашк" + - "имаршалскимаорскимакедонскималајамскимонголскимаратималајскималтешкибур" + - "манскинауруанскисеверен ндебеленепалскиндонгахоландскинорвешки нинорскн" + - "орвешки букмолјужен ндебеленавахоњанџаокситанскиоџибваоромоодијаосетски" + - "пенџапскипалиполскипаштунскипортугалскикечуанскиретороманскирундироманс" + - "кирускируандскисанскритсардинскисиндисеверен самисангосинхалскисловачки" + - "словенечкисамоанскишонасомалискиалбанскисрпскисватисесотосундскишведски" + - "свахилитамилскителугутаџикистанскитајландскитигрињатуркменскицванатонга" + - "јскитурскицонгататарскитахитскиујгурскиукраинскиурдуузбечкивендавиетнам" + - "скиволапиквалонскиволофскикосајидишјорупскиџуаншкикинескизулуачешкиакол" + - "иадангмеадигејскитуниски арапскиафрихилиагемскиајнуакадскиалабамскиалеу" + - "тскигешки албанскијужноалтајскистароанглискиангикаарамејскимапучкиараон" + - "аарапахоалжирски арапскиаравачкимарокански арапскиегипетски арапскиасуа" + - "мерикански знаковен јазикастурскикотаваавадибелуџискибалискибаварскибас" + - "абамунскитобагомалабеџабембабетавскибенабафутбадагазападен балочибоџпур" + - "ибиколскибинибанџарскикомсиксикабишнупријабахтијарскибрајбрахујскибодоа" + - "косебурјатскибугискибулубиленскимедумбакадокарипскикајугаацамсебуанскич" + - "игачибчачагатајскичучкимарискичинучки жаргончоктавскичипевјанскичерокис" + - "кичејенскицентралнокурдскикоптскикапизнонкримскотурскифранцуски (Сеселв" + - "а креоли)кашупскидакотадаргватаитаделаверслејвидогрипскидинказармадогри" + - "долнолужичкидусунскидуаласреднохоландскијола-фоњиџуладазагаембуефикемил" + - "ијанскистароегипетскиекаџукеламскисредноанглискицентралнојупичкиевондое" + - "кстремадурскифангфилипинскитурнедаленски финскифонкаџунски францускисре" + - "днофранцускистарофранцускифранкопровансалскисевернофризискиисточнофризи" + - "скифурланскигагагаускигангајогбајазороастриски даригизгилбертанскигилан" + - "скисредногорногерманскистарогорногерманскигоански конканигондигоронтало" + - "готскигребостарогрчкишвајцарски германскигвахирофарефарегусигвичинскиха" + - "јдахакахавајскифиџиски хиндихилигајнонскихетитскихмонггорнолужичкисјанг" + - "хупаибанибибиоилоканскиингушкиижорскијамајски креолскиложбаннгомбамачам" + - "ееврејскоперсискиеврејскоарапскијитскикаракалпачкикабилскикачинскикаџек" + - "амбакавикабардинскиканембутјапмакондекабувердианукењангкорокаинганшкика" + - "сихотанскикојра чииниковарскизазакикакокаленџинкимбундукоми-пермјачкико" + - "нканикозрејскикпелекарачаевско-балкарскикриокинарајскикарелскикурухшамб" + - "алабафијаколоњскикумичкикутенајскиладинолангиландаламбалезгинскилингва " + - "франка новалигурскиливонскилакотскиломбардискимонголозисевернолурискила" + - "тгалскилуба-лулуалујсењскилундалуомизолујакнижевен кинескиласкимадурски" + - "мафамагахимаитилимакасарскимандингомасајскимабамокшанскимандарскимендем" + - "еруморисјенсредноирскимакува-митометамикмакминангкабауманџурскиманипурс" + - "кимохавскимосизападномарискимундангповеќе јазицикрикмирандскимарваримје" + - "неерзјанскимазендеранскијужноминскинеаполскинамадолногерманскиневарскин" + - "ијасниујескиао нагаквазионгиембунногајскистаронордискиновијалнкосеверно" + - "сотскинуеркласичен неварскињамвезињанколењоронзимаосашкиотомански турск" + - "ипангасинанскисредноперсискипампангапапијаментопалауанскипикардскинигер" + - "иски пиџинпенсилваниски германскименонитски долногерманскистароперсиски" + - "фалечкогерманскифеникискипиемонтскипонтскипонпејскипрускистаропровансал" + - "скикичекичванскираџастанскирапанујскираротонганскиромањолскирифскиромбо" + - "ромскиротуманскирусинскировијанскивлашкируасандавејакутскисамарјански а" + - "рамејскисамбурусасачкисанталисаураштрангембејсангусицилијанскишкотски г" + - "ерманскисасарски сардинскијужнокурдскисенекасенасериселкупскикојраборо " + - "сенистароирскисамогитскитачелхитшанчадски арапскисидамодолношлезискисел" + - "ајарскијужен самилуле самиинари самисколт самисонинкезогдијанскисрански" + - " тонгосерерсахозатерландски фризискисукумасусусумерскикоморијанскикласич" + - "ен сирискисирискишлезискитулутимнетесотеренотетумтигретивтокелауанскица" + - "хурскиклингонскитлингитталишкитамашекњаса тонгаток писинтуројотарокоцак" + - "онскицимшијанскитатскитумбукатувалуанскитазавактуванскицентралноатланск" + - "и тамазитскиудмуртскиугаритскиумбундукоренвајвенетскивепшкизападнофлама" + - "нскимајнскофранконскивотскивирувунџовалсерволамоварајскивашоварлпиривук" + - "алмичкимегрелскисогајаојапскијенгбенјембањенгатукантонскизапотечкиблисс" + - "имболизеландскизенагастандарден марокански тамазитскизунибез лингвистич" + - "ка содржиназазалитературен арапскиавстралиски англискиканадски англиски" + - "британски англискиамерикански англискишпански (во Европа)канадски франц" + - "ускишвајцарски францускифламанскипортугалски (во Европа)молдавскисрпско" + - "хрватскиконгоански свахилипоедноставен кинескитрадиционален кинески" - -var mkLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000e, 0x001c, 0x0030, 0x0040, 0x004e, 0x005e, 0x0070, - 0x007e, 0x008c, 0x009a, 0x00aa, 0x00c4, 0x00d6, 0x00e8, 0x00f8, - 0x0106, 0x0114, 0x0126, 0x0136, 0x0148, 0x0158, 0x016c, 0x017c, - 0x018c, 0x01a2, 0x01a8, 0x01b2, 0x01d2, 0x01e0, 0x01ec, 0x01f8, - 0x020a, 0x0216, 0x0222, 0x0228, 0x0232, 0x0242, 0x0254, 0x0262, - 0x0272, 0x0282, 0x0292, 0x029a, 0x02a6, 0x02b4, 0x02c0, 0x02d2, - 0x02f0, 0x02fa, 0x0315, 0x0327, 0x0339, 0x0349, 0x0353, 0x035d, - 0x036f, 0x0379, 0x038a, 0x039a, 0x03a8, 0x03b8, 0x03c8, 0x03d4, - // Entry 40 - 7F - 0x03ea, 0x0400, 0x0414, 0x041c, 0x042d, 0x0441, 0x0447, 0x0459, - 0x046f, 0x0481, 0x0491, 0x04a1, 0x04b1, 0x04bb, 0x04c7, 0x04d5, - 0x04e3, 0x04f5, 0x0503, 0x0511, 0x0521, 0x052d, 0x053f, 0x054d, - 0x0555, 0x0563, 0x0573, 0x0583, 0x059b, 0x05a5, 0x05b7, 0x05c5, - 0x05d1, 0x05e3, 0x05fa, 0x060a, 0x061a, 0x062c, 0x063a, 0x064e, - 0x0662, 0x0674, 0x0680, 0x0690, 0x06a0, 0x06b2, 0x06c6, 0x06e3, - 0x06f3, 0x06ff, 0x0711, 0x0730, 0x074d, 0x0766, 0x0772, 0x077c, - 0x0790, 0x079c, 0x07a6, 0x07b0, 0x07be, 0x07d0, 0x07d8, 0x07e4, - // Entry 80 - BF - 0x07f6, 0x080c, 0x081e, 0x0836, 0x0840, 0x0850, 0x085a, 0x086a, - 0x087a, 0x088c, 0x0896, 0x08ad, 0x08b7, 0x08c9, 0x08d9, 0x08ed, - 0x08ff, 0x0907, 0x0919, 0x0929, 0x0935, 0x093f, 0x094b, 0x0959, - 0x0967, 0x0975, 0x0985, 0x0991, 0x09ab, 0x09bf, 0x09cd, 0x09e1, - 0x09eb, 0x09fd, 0x0a09, 0x0a13, 0x0a23, 0x0a33, 0x0a43, 0x0a55, - 0x0a5d, 0x0a6b, 0x0a75, 0x0a89, 0x0a97, 0x0aa7, 0x0ab7, 0x0abf, - 0x0ac9, 0x0ad9, 0x0ae7, 0x0af5, 0x0afd, 0x0b09, 0x0b13, 0x0b21, - 0x0b33, 0x0b50, 0x0b60, 0x0b6e, 0x0b76, 0x0b84, 0x0b96, 0x0ba6, - // Entry C0 - FF - 0x0bc1, 0x0bdb, 0x0bf5, 0x0c01, 0x0c13, 0x0c21, 0x0c2d, 0x0c3b, - 0x0c5a, 0x0c5a, 0x0c6a, 0x0c8d, 0x0cae, 0x0cb4, 0x0ce6, 0x0cf6, - 0x0d02, 0x0d0c, 0x0d1e, 0x0d2c, 0x0d3c, 0x0d44, 0x0d54, 0x0d5c, - 0x0d68, 0x0d70, 0x0d7a, 0x0d8a, 0x0d92, 0x0d9c, 0x0da8, 0x0dc3, - 0x0dd1, 0x0de1, 0x0de9, 0x0dfb, 0x0e01, 0x0e0f, 0x0e23, 0x0e39, - 0x0e41, 0x0e53, 0x0e5b, 0x0e65, 0x0e77, 0x0e85, 0x0e8d, 0x0e9d, - 0x0eab, 0x0eb3, 0x0ec3, 0x0ecf, 0x0ed7, 0x0ee9, 0x0ef1, 0x0efb, - 0x0f0f, 0x0f19, 0x0f27, 0x0f42, 0x0f54, 0x0f6a, 0x0f7c, 0x0f8c, - // Entry 100 - 13F - 0x0fac, 0x0fba, 0x0fca, 0x0fe4, 0x1014, 0x1024, 0x1030, 0x103c, - 0x1046, 0x1054, 0x1060, 0x1072, 0x107c, 0x1086, 0x1090, 0x10a8, - 0x10b8, 0x10c2, 0x10e0, 0x10f1, 0x10f9, 0x1105, 0x110d, 0x1115, - 0x112b, 0x1147, 0x1153, 0x1161, 0x117d, 0x119d, 0x11a9, 0x11c5, - 0x11cd, 0x11e1, 0x1208, 0x120e, 0x1231, 0x124f, 0x126b, 0x128f, - 0x12ad, 0x12cb, 0x12dd, 0x12e1, 0x12f1, 0x12f7, 0x12ff, 0x1309, - 0x132a, 0x1330, 0x1348, 0x1358, 0x1380, 0x13a6, 0x13c3, 0x13cd, - 0x13df, 0x13eb, 0x13f5, 0x1409, 0x1430, 0x143e, 0x144e, 0x1456, - // Entry 140 - 17F - 0x1468, 0x1472, 0x147a, 0x148a, 0x14a3, 0x14bd, 0x14cd, 0x14d7, - 0x14ef, 0x14f9, 0x1501, 0x1509, 0x1515, 0x1527, 0x1535, 0x1543, - 0x1564, 0x1570, 0x157c, 0x1588, 0x15a8, 0x15c6, 0x15d2, 0x15ea, - 0x15fa, 0x160a, 0x1612, 0x161c, 0x1624, 0x163a, 0x1648, 0x1650, - 0x165e, 0x1676, 0x1682, 0x168a, 0x169e, 0x16a6, 0x16b6, 0x16cb, - 0x16db, 0x16e7, 0x16ef, 0x16ff, 0x170f, 0x172a, 0x1738, 0x174a, - 0x1754, 0x177d, 0x1785, 0x1799, 0x17a9, 0x17b3, 0x17c1, 0x17cd, - 0x17dd, 0x17eb, 0x17ff, 0x180b, 0x1815, 0x181f, 0x1829, 0x183b, - // Entry 180 - 1BF - 0x185d, 0x186d, 0x187d, 0x188d, 0x18a3, 0x18ad, 0x18b5, 0x18d1, - 0x18e3, 0x18f6, 0x1908, 0x1912, 0x1918, 0x1920, 0x1928, 0x1947, - 0x1951, 0x1961, 0x1969, 0x1975, 0x1983, 0x1997, 0x19a7, 0x19b7, - 0x19bf, 0x19d1, 0x19e3, 0x19ed, 0x19f5, 0x1a05, 0x1a1b, 0x1a30, - 0x1a38, 0x1a44, 0x1a5a, 0x1a6c, 0x1a80, 0x1a90, 0x1a98, 0x1ab4, - 0x1ac2, 0x1adb, 0x1ae3, 0x1af5, 0x1b03, 0x1b03, 0x1b0d, 0x1b1f, - 0x1b39, 0x1b4f, 0x1b61, 0x1b69, 0x1b85, 0x1b95, 0x1b9f, 0x1baf, - 0x1bbc, 0x1bc8, 0x1bd8, 0x1be8, 0x1c02, 0x1c10, 0x1c16, 0x1c30, - // Entry 1C0 - 1FF - 0x1c38, 0x1c59, 0x1c67, 0x1c75, 0x1c7d, 0x1c87, 0x1c93, 0x1cb2, - 0x1ccc, 0x1ce8, 0x1cf8, 0x1d0e, 0x1d22, 0x1d34, 0x1d51, 0x1d7e, - 0x1daf, 0x1dc9, 0x1de9, 0x1dfb, 0x1e0f, 0x1e1d, 0x1e2f, 0x1e3b, - 0x1e5d, 0x1e65, 0x1e77, 0x1e8d, 0x1ea1, 0x1ebb, 0x1ecf, 0x1edb, - 0x1ee5, 0x1ef1, 0x1f05, 0x1f15, 0x1f29, 0x1f35, 0x1f3b, 0x1f49, - 0x1f59, 0x1f82, 0x1f90, 0x1f9e, 0x1fac, 0x1fbe, 0x1fcc, 0x1fd6, - 0x1fee, 0x200f, 0x2032, 0x204a, 0x2056, 0x205e, 0x2066, 0x2078, - 0x2093, 0x20a7, 0x20bb, 0x20cb, 0x20d1, 0x20ec, 0x20f8, 0x2112, - // Entry 200 - 23F - 0x2126, 0x2139, 0x214a, 0x215d, 0x2170, 0x217e, 0x2194, 0x21ad, - 0x21b7, 0x21bf, 0x21e8, 0x21f4, 0x21fc, 0x220c, 0x2224, 0x2243, - 0x2251, 0x2261, 0x2269, 0x2273, 0x227b, 0x2287, 0x2291, 0x229b, - 0x22a1, 0x22b9, 0x22c9, 0x22dd, 0x22eb, 0x22f9, 0x2307, 0x231a, - 0x232b, 0x2337, 0x2343, 0x2353, 0x2369, 0x2375, 0x2383, 0x2399, - 0x23a7, 0x23b7, 0x23ee, 0x2400, 0x2412, 0x2420, 0x242a, 0x2430, - 0x2440, 0x244c, 0x246c, 0x248e, 0x249a, 0x24a2, 0x24ac, 0x24b8, - 0x24c4, 0x24d4, 0x24dc, 0x24ec, 0x24f0, 0x2500, 0x2512, 0x251a, - // Entry 240 - 27F - 0x2520, 0x252c, 0x253a, 0x2544, 0x2552, 0x2564, 0x2576, 0x258c, - 0x259e, 0x25aa, 0x25e8, 0x25f0, 0x2620, 0x2628, 0x264d, 0x264d, - 0x264d, 0x264d, 0x2674, 0x2695, 0x26b8, 0x26df, 0x26df, 0x2701, - 0x2701, 0x2701, 0x2724, 0x274b, 0x274b, 0x275d, 0x275d, 0x2787, - 0x2799, 0x27b5, 0x27d8, 0x27ff, 0x2828, -} // Size: 1250 bytes - -const mlLangStr string = "" + // Size: 12319 bytes - "അഫാർഅബ്\u200cഖാസിയൻഅവസ്റ്റാൻആഫ്രിക്കാൻസ്അകാൻ\u200cഅംഹാരിക്അരഗോണീസ്അറബിക്" + - "ആസ്സാമീസ്അവാരിക്അയ്മാറഅസർബൈജാനിബഷ്ഖിർബെലാറുഷ്യൻബൾഗേറിയൻബിസ്\u200cലാമബം" + - "ബാറബംഗാളിടിബറ്റൻബ്രെട്ടൺബോസ്നിയൻകറ്റാലാൻചെചൻചമോറോകോർസിക്കൻക്രീചെക്ക്ചർ" + - "ച്ച് സ്ലാവിക്ചുവാഷ്വെൽഷ്ഡാനിഷ്ജർമ്മൻദിവെഹിസോങ്കയൂവ്ഗ്രീക്ക്ഇംഗ്ലീഷ്എസ്" + - "\u200cപരാന്റോസ്\u200cപാനിഷ്എസ്റ്റോണിയൻബാസ്\u200cക്പേർഷ്യൻഫുലഫിന്നിഷ്ഫിജി" + - "യൻഫാറോസ്ഫ്രഞ്ച്പശ്ചിമ ഫ്രിഷിയൻഐറിഷ്സ്കോട്ടിഷ് ഗൈലിക്ഗലീഷ്യൻഗ്വരനീഗുജറാ" + - "ത്തിമാൻസ്ഹൗസഹീബ്രുഹിന്ദിഹിരി മോതുക്രൊയേഷ്യൻഹെയ്\u200cതിയൻ ക്രിയോൾഹംഗേറ" + - "ിയൻഅർമേനിയൻഹെരേരൊഇന്റർലിംഗ്വഇൻഡോനേഷ്യൻഇന്റർലിംഗ്വേഇഗ്ബോഷുവാൻയിഇനുപിയാക" + - "്ഇഡോഐസ്\u200cലാൻഡിക്ഇറ്റാലിയൻഇനുക്റ്റിറ്റട്ട്ജാപ്പനീസ്ജാവാനീസ്ജോർജിയൻക" + - "ോംഗോകികൂയുക്വാന്യമകസാഖ്കലാല്ലിസട്ട്ഖമെർകന്നഡകൊറിയൻകനൂറികാശ്\u200cമീരിക" + - "ുർദ്ദിഷ്കോമികോർണിഷ്കിർഗിസ്ലാറ്റിൻലക്\u200cസംബർഗിഷ്ഗാണ്ടലിംബർഗിഷ്ലിംഗാല" + - "ലാവോലിത്വാനിയൻലുബ-കറ്റംഗലാറ്റ്വിയൻമലഗാസിമാർഷല്ലീസ്മവോറിമാസിഡോണിയൻമലയാള" + - "ംമംഗോളിയൻമറാത്തിമലെയ്മാൾട്ടീസ്ബർമീസ്നൗറുനോർത്ത് ഡെബിൾനേപ്പാളിഡോങ്കഡച്ച" + - "്നോർവീജിയൻ നൈനോർക്\u200cസ്നോർവീജിയൻ ബുക്\u200cമൽദക്ഷിണ നെഡിബിൾനവാജോന്യ" + - "ൻജഓക്\u200cസിറ്റൻഓജിബ്വാഒറോമോഒഡിയഒസ്സെറ്റിക്പഞ്ചാബിപാലിപോളിഷ്പഷ്\u200c" + - "തോപോർച്ചുഗീസ്ക്വെച്ചുവറൊമാഞ്ച്റുണ്ടിറൊമാനിയൻറഷ്യൻകിന്യാർവാണ്ടസംസ്" + - "\u200cകൃതംസർഡിനിയാൻസിന്ധിവടക്കൻ സമിസാംഗോസിംഹളസ്ലോവാക്സ്ലോവേനിയൻസമോവൻഷോണസ" + - "ോമാലിഅൽബേനിയൻസെർബിയൻസ്വാറ്റിതെക്കൻ സോതോസുണ്ടാനീസ്സ്വീഡിഷ്സ്വാഹിലിതമിഴ്" + - "തെലുങ്ക്താജിക്തായ്ടൈഗ്രിന്യതുർക്\u200cമെൻസ്വാനടോംഗൻടർക്കിഷ്സോംഗടാട്ടർത" + - "ാഹിതിയൻഉയ്ഘുർഉക്രേനിയൻഉറുദുഉസ്\u200cബെക്ക്വെന്ദവിയറ്റ്നാമീസ്വോളാപുക്വല" + - "്ലൂൺവൊളോഫ്ഖോസയിദ്ദിഷ്യൊറൂബാസ്വാംഗ്ചൈനീസ്സുലുഅചിനീസ്അകോലിഅഡാങ്\u200cമിഅ" + - "ഡൈഗേആഫ്രിഹിലിആഘേംഐനുഅക്കാഡിയൻഅലൂട്ട്തെക്കൻ അൾത്തായിപഴയ ഇംഗ്ലീഷ്ആൻഗികഅര" + - "മായമാപുചിഅറാപഹോഅറാവക്ആസുഓസ്\u200cട്രിയൻഅവാധിബലൂചിബാലിനീസ്ബസബാമുൻഘോമാലബ" + - "േജബേംബബെനാബാഫട്ട്പശ്ചിമ ബലൂചിഭോജ്\u200cപുരിബികോൽബിനികോംസിക്സികബ്രജ്ബോഡ" + - "ോഅക്കൂസ്ബുറിയത്ത്ബുഗിനീസ്ബുളുബ്ലിൻമെഡുംബകാഡോകാരിബ്കയൂഗഅറ്റ്സാംസെബുവാനോ" + - "ചിഗചിബ്ചഷാഗതായ്ചൂകീസ്മാരിചിനൂഗ് ജാർഗൺചോക്റ്റാവ്ചിപേവ്യൻഷെരോക്കിഷായാൻസൊ" + - "റാനി കുർദിഷ്കോപ്റ്റിക്ക്രിമിയൻ ടർക്കിഷ്സെഷൽവ ക്രിയോൾ ഫ്രഞ്ച്കാഷുബിയാൻഡ" + - "കോട്ടഡർഗ്വാതൈതദെലവേർസ്ലേവ്ഡോഗ്രിബ്ദിൻകസാർമ്മഡോഗ്രിലോവർ സോർബിയൻദ്വാലമദ്" + - "ധ്യ ഡച്ച്യോല-ഫോന്യിദ്വൈലഡാസാഗഎംബുഎഫിക്പ്രാചീന ഈജിപ്ഷ്യൻഎകാജുക്എലാമൈറ്റ" + - "്മദ്ധ്യ ഇംഗ്ലീഷ്എവോൻഡോഫങ്ഫിലിപ്പിനോഫോൻമദ്ധ്യ ഫ്രഞ്ച്പഴയ ഫ്രഞ്ച്നോർത്തേ" + - "ൻ ഫ്രിഷ്യൻഈസ്റ്റേൺ ഫ്രിഷ്യൻഫ്രിയുലിയാൻഗാഗാഗൂസ്ഗാൻ ചൈനീസ്ഗയൊഗബ്യഗീസ്ഗിൽ" + - "ബർട്ടീസ്മദ്ധ്യ ഉച്ച ജർമൻഓൾഡ് ഹൈ ജർമൻഗോണ്ഡിഗൊറോൻറാലോഗോഥിക്ക്ഗ്രബൊപുരാതന" + - " ഗ്രീക്ക്സ്വിസ് ജർമ്മൻഗുസീഗ്വിച്ചിൻഹൈഡഹാക്ക ചൈനീസ്ഹവായിയൻഹിലിഗയ്നോൺഹിറ്റ" + - "ൈറ്റ്മോങ്അപ്പർ സോർബിയൻഷ്യാങ് ചൈനീസ്ഹൂപഇബാൻഇബീബിയോഇലോകോഇംഗ്വിഷ്ലോജ്ബാൻഗ" + - "ോമ്പമചേംജൂഡിയോ-പേർഷ്യൻജൂഡിയോ-അറബിക്കര-കാൽപ്പക്കബൈൽകാചിൻജ്ജുകംബകാവികബർഡ" + - "ിയാൻകനെംബുട്യാപ്മക്കോണ്ടെകബുവെർദിയാനുകോറോഘാസിഘോറ്റാനേസേകൊയ്റ ചീനികാകോക" + - "ലെഞ്ഞിൻകിംബുണ്ടുകോമി-പെർമ്യാക്ക്കൊങ്കണികൊസറേയൻകപെല്ലേകരചൈ-ബാൽകർകരീലിയൻ" + - "കുരുഖ്ഷംഭാളബാഫിയകൊളോണിയൻകുമൈക്കുതേനൈലാഡിനോലാംഗിലഹ്\u200cൻഡലംബലഹ്ഗിയാൻല" + - "ഗോത്തമോങ്കോലൊസിവടക്കൻ ലൂറിലൂബ-ലുലുവലൂയിസെനോലുൻഡലുവോമിസോലുയിയമദുരേസേമാഫ" + - "മഗാഹിമൈഥിലിമകാസർമണ്ഡിൻഗോമസായ്മാബമോക്ഷമണ്ഡാർമെൻഡെമേരുമൊറിസിൻമദ്ധ്യ ഐറിഷ" + - "്മാഖുവാ-മീത്തോമേത്താമിക്മാക്മിനാങ്കബൗമാൻ\u200cചുമണിപ്പൂരിമോഹാക്മൊസ്സിമ" + - "ുന്ദാംഗ്പലഭാഷകൾക്രീക്ക്മിരാൻറസേമർവാരിമയീൻഏഴ്സ്യമസന്ററാനിമിൻ നാൻ ചൈനീസ്" + - "നെപ്പോളിറ്റാൻനാമലോ ജർമൻനേവാരിനിയാസ്ന്യുവാൻക്വാസിയോഗീംബൂൺനോഗൈപഴയ നോഴ്" + - "\u200cസ്ഇൻകോനോർത്തേൻ സോതോനുവേർക്ലാസിക്കൽ നേവാരിന്യാംവേസിന്യാൻകോൾന്യോറോസി" + - "മഒസേജ്ഓട്ടോമൻ തുർക്കിഷ്പങ്കാസിനൻപാഹ്ലവിപാംപൻഗപാപിയാമെന്റൊപലാവുൻനൈജീരിയ" + - "ൻ പിഡ്\u200cഗിൻപഴയ പേർഷ്യൻഫീനിഷ്യൻപൊൻപിയൻപ്രഷ്യൻപഴയ പ്രൊവൻഷ്ൽക്വിച്ചെര" + - "ാജസ്ഥാനിരാപനൂയിരാരോടോങ്കൻറോംബോറൊമാനിആരോമാനിയൻറുവാസാൻഡവേസാഖസമരിയാക്കാരു" + - "ടെ അരമായസംബുരുസസാക്സന്താലിഗംബായ്സംഗുസിസിലിയൻസ്കോട്സ്തെക്കൻ കുർദ്ദിഷ്സെ" + - "നേകസേനസെൽകപ്കൊയ്റാബൊറോ സെന്നിപഴയ ഐറിഷ്താച്ചലിറ്റ്ഷാൻചാഡിയൻ അറബിസിഡാമോത" + - "െക്കൻ സാമിലൂലീ സമിഇനാരി സാമിസ്കോൾട്ട് സമിസോണിൻകെസോജിഡിയൻശ്രാനൻ ഡോങ്കോസ" + - "െറർസാഹോസുകുമസുസുസുമേരിയൻകൊമോറിയൻപുരാതന സുറിയാനിഭാഷസുറിയാനിടിംനേടെസോടെറ" + - "േനോടെറ്റുംടൈഗ്രിടിവ്ടൊക്കേലൗക്ലിംഗോൺലിംഗ്വിറ്റ്ടമഷേക്ന്യാസാ ഡോങ്കടോക് " + - "പിസിൻതരോക്കോസിംഷ്യൻടുംബുകടുവാലുടസവാക്ക്തുവിനിയൻമധ്യ അറ്റ്\u200cലസ് ടമാ" + - "സൈറ്റ്ഉഡ്മുർട്ട്ഉഗറിട്ടിക്ഉംബുന്ദുമൂലഭാഷവൈവോട്ടിക്വുൻജോവാൾസർവൊലൈറ്റവാര" + - "േയ്വാഷൊവൂൾപിരിവു ചൈനീസ്കൽമൈക്സോഗോയാവോയെപ്പീസ്യാംഗ്ബെൻയംബകാന്റണീസ്സാപ്പ" + - "ോടെക്ബ്ലിസ്സിംബൽസ്സെനഗസ്റ്റാൻഡേർഡ് മൊറോക്കൻ റ്റാമസിയറ്റ്സുനിഭാഷാപരമായ " + - "ഉള്ളടക്കമൊന്നുമില്ലസാസാആധുനിക സ്റ്റാൻഡേർഡ് അറബിക്ഓസ്\u200cട്രിയൻ ജർമൻസ" + - "്വിസ് ഹൈ ജർമൻഓസ്\u200cട്രേലിയൻ ഇംഗ്ലീഷ്കനേഡിയൻ ഇംഗ്ലീഷ്ബ്രിട്ടീഷ് ഇംഗ്" + - "ലീഷ്അമേരിക്കൻ ഇംഗ്ലീഷ്ലാറ്റിൻ അമേരിക്കൻ സ്\u200cപാനിഷ്യൂറോപ്യൻ സ്" + - "\u200cപാനിഷ്മെക്സിക്കൻ സ്പാനിഷ്കനേഡിയൻ ഫ്രഞ്ച്സ്വിസ് ഫ്രഞ്ച്ലോ സാക്സൺഫ്ല" + - "മിഷ്ബ്രസീലിയൻ പോർച്ചുഗീസ്യൂറോപ്യൻ പോർച്ചുഗീസ്മോൾഡാവിയൻസെർബോ-ക്രൊയേഷ്യൻ" + - "കോംഗോ സ്വാഹിലിലളിതമാക്കിയ ചൈനീസ്പരമ്പരാഗത ചൈനീസ്" - -var mlLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x002a, 0x0045, 0x0069, 0x0078, 0x0090, 0x00a8, - 0x00ba, 0x00d5, 0x00ea, 0x00fc, 0x0117, 0x0129, 0x0147, 0x015f, - 0x0177, 0x0186, 0x0198, 0x01ad, 0x01c5, 0x01dd, 0x01f5, 0x0201, - 0x0210, 0x022b, 0x0237, 0x0249, 0x0274, 0x0286, 0x0295, 0x02a7, - 0x02b9, 0x02cb, 0x02da, 0x02e6, 0x02fe, 0x0316, 0x0337, 0x0352, - 0x0373, 0x0388, 0x039d, 0x03a6, 0x03be, 0x03d0, 0x03e2, 0x03f7, - 0x0422, 0x0431, 0x0462, 0x0477, 0x0489, 0x04a4, 0x04b3, 0x04bc, - 0x04ce, 0x04e0, 0x04f9, 0x0517, 0x0548, 0x0560, 0x0578, 0x058a, - // Entry 40 - 7F - 0x05ab, 0x05c9, 0x05ed, 0x05fc, 0x0611, 0x062c, 0x0635, 0x0656, - 0x0671, 0x06a1, 0x06bc, 0x06d4, 0x06e9, 0x06f8, 0x070a, 0x0722, - 0x0731, 0x0755, 0x0761, 0x0770, 0x0782, 0x0791, 0x07ac, 0x07c7, - 0x07d3, 0x07e8, 0x07fd, 0x0812, 0x0836, 0x0845, 0x0860, 0x0872, - 0x087e, 0x089c, 0x08b8, 0x08d6, 0x08e8, 0x0906, 0x0915, 0x0933, - 0x0945, 0x095d, 0x0972, 0x0981, 0x099c, 0x09ae, 0x09ba, 0x09df, - 0x09f7, 0x0a06, 0x0a15, 0x0a4f, 0x0a80, 0x0aa8, 0x0ab7, 0x0ac6, - 0x0ae4, 0x0af9, 0x0b08, 0x0b14, 0x0b35, 0x0b4a, 0x0b56, 0x0b68, - // Entry 80 - BF - 0x0b7a, 0x0b9b, 0x0bb6, 0x0bce, 0x0be0, 0x0bf8, 0x0c07, 0x0c2b, - 0x0c46, 0x0c61, 0x0c73, 0x0c8f, 0x0c9e, 0x0cad, 0x0cc5, 0x0ce3, - 0x0cf2, 0x0cfb, 0x0d0d, 0x0d25, 0x0d3a, 0x0d52, 0x0d71, 0x0d8f, - 0x0da7, 0x0dbf, 0x0dce, 0x0de6, 0x0df8, 0x0e04, 0x0e1f, 0x0e3a, - 0x0e49, 0x0e58, 0x0e70, 0x0e7c, 0x0e8e, 0x0ea6, 0x0eb8, 0x0ed3, - 0x0ee2, 0x0f00, 0x0f0f, 0x0f36, 0x0f4e, 0x0f60, 0x0f72, 0x0f7b, - 0x0f93, 0x0fa5, 0x0fba, 0x0fcc, 0x0fd8, 0x0fed, 0x0ffc, 0x1014, - 0x1023, 0x1023, 0x103e, 0x104a, 0x1053, 0x106e, 0x106e, 0x1083, - // Entry C0 - FF - 0x1083, 0x10ae, 0x10d0, 0x10df, 0x10ee, 0x1100, 0x1100, 0x1112, - 0x1112, 0x1112, 0x1124, 0x1124, 0x1124, 0x112d, 0x112d, 0x114b, - 0x114b, 0x115a, 0x1169, 0x1181, 0x1181, 0x1187, 0x1196, 0x1196, - 0x11a5, 0x11ae, 0x11ba, 0x11ba, 0x11c6, 0x11db, 0x11db, 0x11fd, - 0x1218, 0x1227, 0x1233, 0x1233, 0x123c, 0x1251, 0x1251, 0x1251, - 0x1260, 0x1260, 0x126c, 0x1281, 0x129c, 0x12b4, 0x12c0, 0x12cf, - 0x12e1, 0x12ed, 0x12ff, 0x130b, 0x1323, 0x133b, 0x1344, 0x1353, - 0x1368, 0x137a, 0x1386, 0x13a8, 0x13c6, 0x13de, 0x13f6, 0x1405, - // Entry 100 - 13F - 0x142d, 0x144b, 0x144b, 0x147c, 0x14b7, 0x14d2, 0x14e4, 0x14f6, - 0x14ff, 0x1511, 0x1523, 0x153b, 0x1547, 0x1559, 0x156b, 0x158d, - 0x158d, 0x159c, 0x15be, 0x15da, 0x15e9, 0x15f8, 0x1604, 0x1613, - 0x1613, 0x1644, 0x1659, 0x1674, 0x169f, 0x169f, 0x16b1, 0x16b1, - 0x16ba, 0x16d8, 0x16d8, 0x16e1, 0x16e1, 0x1709, 0x1728, 0x1728, - 0x1759, 0x178a, 0x17ab, 0x17b1, 0x17c3, 0x17df, 0x17e8, 0x17f4, - 0x17f4, 0x1800, 0x1821, 0x1821, 0x184d, 0x186d, 0x186d, 0x187f, - 0x189a, 0x18b2, 0x18c1, 0x18ec, 0x1911, 0x1911, 0x1911, 0x191d, - // Entry 140 - 17F - 0x1938, 0x1941, 0x1963, 0x1978, 0x1978, 0x1996, 0x19b4, 0x19c0, - 0x19e5, 0x1a0a, 0x1a13, 0x1a1f, 0x1a34, 0x1a43, 0x1a5b, 0x1a5b, - 0x1a5b, 0x1a70, 0x1a7f, 0x1a8b, 0x1ab3, 0x1ad8, 0x1ad8, 0x1af7, - 0x1b03, 0x1b12, 0x1b1e, 0x1b27, 0x1b33, 0x1b4b, 0x1b5d, 0x1b6f, - 0x1b8a, 0x1bae, 0x1bae, 0x1bba, 0x1bba, 0x1bc6, 0x1be4, 0x1c00, - 0x1c00, 0x1c00, 0x1c0c, 0x1c24, 0x1c3f, 0x1c6d, 0x1c82, 0x1c97, - 0x1cac, 0x1cc8, 0x1cc8, 0x1cc8, 0x1cdd, 0x1cef, 0x1cfe, 0x1d0d, - 0x1d25, 0x1d37, 0x1d49, 0x1d5b, 0x1d6a, 0x1d7c, 0x1d85, 0x1d9d, - // Entry 180 - 1BF - 0x1d9d, 0x1d9d, 0x1d9d, 0x1daf, 0x1daf, 0x1dc1, 0x1dcd, 0x1dec, - 0x1dec, 0x1e05, 0x1e1d, 0x1e29, 0x1e35, 0x1e41, 0x1e50, 0x1e50, - 0x1e50, 0x1e65, 0x1e6e, 0x1e7d, 0x1e8f, 0x1e9e, 0x1eb6, 0x1ec5, - 0x1ece, 0x1edd, 0x1eef, 0x1efe, 0x1f0a, 0x1f1f, 0x1f41, 0x1f66, - 0x1f78, 0x1f90, 0x1fab, 0x1fbd, 0x1fd8, 0x1fea, 0x1ffc, 0x1ffc, - 0x2017, 0x202c, 0x2044, 0x205c, 0x206e, 0x206e, 0x207a, 0x208c, - 0x20a7, 0x20cd, 0x20f4, 0x20fd, 0x2110, 0x2122, 0x2134, 0x2149, - 0x2149, 0x2161, 0x2173, 0x217f, 0x219e, 0x219e, 0x21aa, 0x21cf, - // Entry 1C0 - 1FF - 0x21de, 0x220f, 0x222a, 0x2242, 0x2254, 0x225d, 0x226c, 0x229d, - 0x22b8, 0x22cd, 0x22df, 0x2303, 0x2315, 0x2315, 0x2346, 0x2346, - 0x2346, 0x2365, 0x2365, 0x237d, 0x237d, 0x237d, 0x2392, 0x23a7, - 0x23cc, 0x23e4, 0x23e4, 0x23ff, 0x2414, 0x2432, 0x2432, 0x2432, - 0x2441, 0x2453, 0x2453, 0x2453, 0x2453, 0x246e, 0x247a, 0x248c, - 0x2495, 0x24cf, 0x24e1, 0x24f0, 0x2505, 0x2505, 0x2517, 0x2523, - 0x253b, 0x2553, 0x2553, 0x2581, 0x2590, 0x2599, 0x2599, 0x25ab, - 0x25dc, 0x25f5, 0x25f5, 0x2616, 0x261f, 0x263e, 0x2650, 0x2650, - // Entry 200 - 23F - 0x2650, 0x266f, 0x2685, 0x26a1, 0x26c6, 0x26db, 0x26f3, 0x2718, - 0x2724, 0x2730, 0x2730, 0x273f, 0x274b, 0x2763, 0x277b, 0x27af, - 0x27c7, 0x27c7, 0x27c7, 0x27d6, 0x27e2, 0x27f4, 0x2809, 0x281b, - 0x2827, 0x283f, 0x283f, 0x2857, 0x2878, 0x2878, 0x288a, 0x28ac, - 0x28c8, 0x28c8, 0x28dd, 0x28dd, 0x28f2, 0x28f2, 0x2904, 0x2916, - 0x292e, 0x2946, 0x298a, 0x29a8, 0x29c6, 0x29de, 0x29f0, 0x29f6, - 0x29f6, 0x29f6, 0x29f6, 0x29f6, 0x2a0e, 0x2a0e, 0x2a1d, 0x2a2c, - 0x2a41, 0x2a53, 0x2a5f, 0x2a74, 0x2a8d, 0x2a9f, 0x2a9f, 0x2aab, - // Entry 240 - 27F - 0x2ab7, 0x2acf, 0x2ae7, 0x2af0, 0x2af0, 0x2b0b, 0x2b29, 0x2b50, - 0x2b50, 0x2b5c, 0x2bbe, 0x2bca, 0x2c1f, 0x2c2b, 0x2c75, 0x2c75, - 0x2ca0, 0x2cc6, 0x2d03, 0x2d31, 0x2d68, 0x2d9c, 0x2de9, 0x2e1d, - 0x2e54, 0x2e54, 0x2e7f, 0x2ea7, 0x2ec0, 0x2ed5, 0x2f12, 0x2f4c, - 0x2f67, 0x2f95, 0x2fbd, 0x2ff1, 0x301f, -} // Size: 1250 bytes - -const mnLangStr string = "" + // Size: 5582 bytes - "афарабхазафрикаканамхарарагонарабассамавар хэлаймараазербайжанбашкирбела" + - "русьболгарбисламбамбарабенгалтөвдбретонбосникаталанчеченьчаморро хэлкор" + - "сикчехсүмийн славян хэлчувашуэльсданигермандивехи хэлжонхаэвэгреканглиэ" + - "сперантоиспаниэстонибаскперсфулафинляндфижифарерфранцбаруун фризынирлан" + - "дшотланд келтгаликгуаранигужаратиманксхаусаеврейхиндихорватгаитийн крео" + - "лунгарарменхерероинтерлингвоиндонезинэгдмэл хэлигбосычуань иидоисландит" + - "алиинуктитутяпонявагүржкикуюүкуаньямахасагкалалисуткамбожканнадасолонго" + - "сканури хэлкашмиркүрдкоми хэлкорныкыргызлатинлюксембурггандалимбург хэл" + - "лингалалаослитвалуба-катангалатвималагасимаршаллын хэлмаоримакедонмалай" + - "ламмонголмаратималаймалтибирмнаурухойд ндебелебалбандонгаголланднорвеги" + - "йн нинорскнорвегийн букмолөмнөд ндебеленавахонянжафранцын окситаноромоо" + - "рияоссетийнпанжабпольшпаштопортугалькечуароманшрундирумынороскинярванда" + - "санскритсардинысиндхихойд самисангосинхаласловаксловенисамоагийншонасом" + - "алиалбанисербсватисесотосунданшведсвахилитамилтэлүгүтажиктайтигринатурк" + - "менцванатонгатуркцонгататартаитынуйгарукраинурдуузбеквендавьетнамволапю" + - "куоллунволофхосаиддишёрубахятадзулуачин хэладангмэадигэагемайнуалютөмнө" + - "д алтайангикмапүчиарапагоасуастури хэлавадхибали хэлбасаа хэлбембабенаб" + - "ожпурибинисиксикабодобуги хэлблин хэлсебуано хэлчигачуук хэлмари хэлчок" + - "тау хэлчирокичэеннсорани күрдсеселва креолын франц хэлдакотадаргва хэлт" + - "айтадогриб хэлзармаловер-сорбидуалажола-фонидазага хэлэмбуэфикэкажукэво" + - "ндофилиппинфонфриулийнгагагузгийзгилбертийнгоронталошвейцари германгузы" + - "гвичинхавайхилигайныхмонгдээд сорбихупаибанибибиоилокоингушложбан хэлнг" + - "омбамачамэкабилекачин хэлжжу хэлкамбакабардин хэлтяпмакондекабүвердиану" + - "корокаси хэлкойра чиникако хэлкаленжинкимбунду хэлкоми-пермякконканикпе" + - "ллекарачай-балкаркарель хэлкурукшамбалабафиакёльш хэлкумукладинлангилез" + - "ги хэллакоталозихойд лурилуба-лулуалундалуомизолуяамадури хэлмагахи хэл" + - "маймакасармасаймокшамендэ хэлмеруморисенмакува-митометамикмак хэлминанг" + - "кабауманипуримохаукмосси хэлмунданголон хэлкрийк хэлмеранди хэлэрзямаза" + - "ндеранинеаполитан хэлнаманевариниас хэлниуи хэлквазионгиембүүнногаи хэл" + - "нкохойд сотонуернянколепангасинпампангапапьяментопалаугийннигерийн пидж" + - "ин хэлпруссийнкичерапануираротонгийнромбоароманырвасандавэсахасамбүрүса" + - "нталингамбайсангүсицилийншотландуудсенакёраборо сенитачелхитшаньөмнөд с" + - "амилюле самиинари самисколт самисонинкесранан тонгосахосукумакомори хэл" + - "сирийнтимнтэсотетумтигрклингон хэлток писинтарокотумбулатувалутасавакту" + - "ватөв атласын тамазайтудмуртумбундурутвайвунжоуолсэруоллайттаварайхалим" + - "аг хэлсогаянгбенембакантон хэлтамазитзунихэл зүйн агуулгагүйзазастандар" + - "т арабавстри германшвейцари дээр германавстрали англиканад англибритани" + - "йн англиамерикийн англилатин америкийн испаниевропын испанимексикийн ис" + - "паниканад францшвейцари францбага саксонфламандпортугаль (бразил)европы" + - "н португальмолдавхорватын сербконго свахилихялбаршуулсан хятадуламжлалт" + - " хятад" - -var mnLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0008, 0x0012, 0x0012, 0x001c, 0x0024, 0x002e, 0x003a, - 0x0042, 0x004c, 0x005b, 0x0067, 0x007b, 0x0087, 0x0097, 0x00a3, - 0x00af, 0x00bd, 0x00c9, 0x00d1, 0x00dd, 0x00e7, 0x00f5, 0x0101, - 0x0116, 0x0122, 0x0122, 0x0128, 0x0148, 0x0152, 0x015c, 0x0164, - 0x0170, 0x0183, 0x018d, 0x0193, 0x019b, 0x01a5, 0x01b7, 0x01c3, - 0x01cf, 0x01d7, 0x01df, 0x01e7, 0x01f5, 0x01fd, 0x0207, 0x0211, - 0x022a, 0x0236, 0x024d, 0x0257, 0x0265, 0x0275, 0x027f, 0x0289, - 0x0293, 0x029d, 0x029d, 0x02a9, 0x02c2, 0x02cc, 0x02d6, 0x02e2, - // Entry 40 - 7F - 0x02f8, 0x0308, 0x031d, 0x0325, 0x0336, 0x0336, 0x033c, 0x0348, - 0x0352, 0x0364, 0x036c, 0x0372, 0x037a, 0x037a, 0x0386, 0x0396, - 0x03a0, 0x03b2, 0x03be, 0x03cc, 0x03dc, 0x03ef, 0x03fb, 0x0403, - 0x0412, 0x041c, 0x0428, 0x0432, 0x0446, 0x0450, 0x0465, 0x0473, - 0x047b, 0x0485, 0x049c, 0x04a6, 0x04b6, 0x04cf, 0x04d9, 0x04e7, - 0x04f7, 0x0503, 0x050f, 0x0519, 0x0523, 0x052b, 0x0535, 0x054c, - 0x0556, 0x0562, 0x0570, 0x0591, 0x05b0, 0x05c9, 0x05d5, 0x05df, - 0x05fc, 0x05fc, 0x0606, 0x060e, 0x061e, 0x062a, 0x062a, 0x0634, - // Entry 80 - BF - 0x063e, 0x0650, 0x065a, 0x0666, 0x0670, 0x067a, 0x0682, 0x0696, - 0x06a6, 0x06b4, 0x06c0, 0x06d1, 0x06db, 0x06e9, 0x06f5, 0x0703, - 0x0715, 0x071d, 0x0729, 0x0735, 0x073d, 0x0747, 0x0753, 0x075f, - 0x0767, 0x0775, 0x077f, 0x078b, 0x0795, 0x079b, 0x07a9, 0x07b7, - 0x07c1, 0x07cb, 0x07d3, 0x07dd, 0x07e7, 0x07f3, 0x07fd, 0x0809, - 0x0811, 0x081b, 0x0825, 0x0833, 0x0841, 0x084d, 0x0857, 0x085f, - 0x0869, 0x0873, 0x0873, 0x087d, 0x0885, 0x0894, 0x0894, 0x08a2, - 0x08ac, 0x08ac, 0x08ac, 0x08b4, 0x08bc, 0x08bc, 0x08bc, 0x08c4, - // Entry C0 - FF - 0x08c4, 0x08d9, 0x08d9, 0x08e3, 0x08e3, 0x08ef, 0x08ef, 0x08fd, - 0x08fd, 0x08fd, 0x08fd, 0x08fd, 0x08fd, 0x0903, 0x0903, 0x0916, - 0x0916, 0x0922, 0x0922, 0x0931, 0x0931, 0x0942, 0x0942, 0x0942, - 0x0942, 0x0942, 0x094c, 0x094c, 0x0954, 0x0954, 0x0954, 0x0954, - 0x0962, 0x0962, 0x096a, 0x096a, 0x096a, 0x0978, 0x0978, 0x0978, - 0x0978, 0x0978, 0x0980, 0x0980, 0x0980, 0x098f, 0x098f, 0x099e, - 0x099e, 0x099e, 0x099e, 0x099e, 0x099e, 0x09b3, 0x09bb, 0x09bb, - 0x09bb, 0x09ca, 0x09d9, 0x09d9, 0x09ec, 0x09ec, 0x09f8, 0x0a02, - // Entry 100 - 13F - 0x0a17, 0x0a17, 0x0a17, 0x0a17, 0x0a46, 0x0a46, 0x0a52, 0x0a65, - 0x0a6f, 0x0a6f, 0x0a6f, 0x0a82, 0x0a82, 0x0a8c, 0x0a8c, 0x0aa1, - 0x0aa1, 0x0aab, 0x0aab, 0x0abc, 0x0abc, 0x0acf, 0x0ad7, 0x0adf, - 0x0adf, 0x0adf, 0x0aeb, 0x0aeb, 0x0aeb, 0x0aeb, 0x0af7, 0x0af7, - 0x0af7, 0x0b07, 0x0b07, 0x0b0d, 0x0b0d, 0x0b0d, 0x0b0d, 0x0b0d, - 0x0b0d, 0x0b0d, 0x0b1d, 0x0b21, 0x0b2b, 0x0b2b, 0x0b2b, 0x0b2b, - 0x0b2b, 0x0b33, 0x0b47, 0x0b47, 0x0b47, 0x0b47, 0x0b47, 0x0b47, - 0x0b59, 0x0b59, 0x0b59, 0x0b59, 0x0b76, 0x0b76, 0x0b76, 0x0b7e, - // Entry 140 - 17F - 0x0b8a, 0x0b8a, 0x0b8a, 0x0b94, 0x0b94, 0x0ba6, 0x0ba6, 0x0bb0, - 0x0bc3, 0x0bc3, 0x0bcb, 0x0bd3, 0x0bdf, 0x0be9, 0x0bf3, 0x0bf3, - 0x0bf3, 0x0c06, 0x0c12, 0x0c1e, 0x0c1e, 0x0c1e, 0x0c1e, 0x0c1e, - 0x0c2a, 0x0c3b, 0x0c48, 0x0c52, 0x0c52, 0x0c69, 0x0c69, 0x0c6f, - 0x0c7d, 0x0c95, 0x0c95, 0x0c9d, 0x0c9d, 0x0cac, 0x0cac, 0x0cbf, - 0x0cbf, 0x0cbf, 0x0cce, 0x0cde, 0x0cf5, 0x0d0a, 0x0d18, 0x0d18, - 0x0d24, 0x0d3f, 0x0d3f, 0x0d3f, 0x0d52, 0x0d5c, 0x0d6a, 0x0d74, - 0x0d85, 0x0d8f, 0x0d8f, 0x0d99, 0x0da3, 0x0da3, 0x0da3, 0x0db4, - // Entry 180 - 1BF - 0x0db4, 0x0db4, 0x0db4, 0x0dc0, 0x0dc0, 0x0dc0, 0x0dc8, 0x0dd9, - 0x0dd9, 0x0dec, 0x0dec, 0x0df6, 0x0dfc, 0x0e04, 0x0e0c, 0x0e0c, - 0x0e0c, 0x0e1f, 0x0e1f, 0x0e32, 0x0e38, 0x0e46, 0x0e46, 0x0e50, - 0x0e50, 0x0e5a, 0x0e5a, 0x0e6b, 0x0e73, 0x0e81, 0x0e81, 0x0e96, - 0x0e9e, 0x0eb1, 0x0ec7, 0x0ec7, 0x0ed7, 0x0ee3, 0x0ef4, 0x0ef4, - 0x0f02, 0x0f11, 0x0f22, 0x0f37, 0x0f37, 0x0f37, 0x0f37, 0x0f3f, - 0x0f55, 0x0f55, 0x0f70, 0x0f78, 0x0f78, 0x0f84, 0x0f93, 0x0fa2, - 0x0fa2, 0x0fae, 0x0fc0, 0x0fd1, 0x0fd1, 0x0fd1, 0x0fd7, 0x0fe8, - // Entry 1C0 - 1FF - 0x0ff0, 0x0ff0, 0x0ff0, 0x0ffe, 0x0ffe, 0x0ffe, 0x0ffe, 0x0ffe, - 0x100e, 0x100e, 0x101e, 0x1032, 0x1044, 0x1044, 0x1068, 0x1068, - 0x1068, 0x1068, 0x1068, 0x1068, 0x1068, 0x1068, 0x1068, 0x1078, - 0x1078, 0x1080, 0x1080, 0x1080, 0x108e, 0x10a4, 0x10a4, 0x10a4, - 0x10ae, 0x10ae, 0x10ae, 0x10ae, 0x10ae, 0x10bc, 0x10c2, 0x10d0, - 0x10d8, 0x10d8, 0x10e6, 0x10e6, 0x10f4, 0x10f4, 0x1102, 0x110c, - 0x111c, 0x1130, 0x1130, 0x1130, 0x1130, 0x1138, 0x1138, 0x1138, - 0x1151, 0x1151, 0x1151, 0x1161, 0x1169, 0x1169, 0x1169, 0x1169, - // Entry 200 - 23F - 0x1169, 0x117c, 0x118d, 0x11a0, 0x11b3, 0x11c1, 0x11c1, 0x11d8, - 0x11d8, 0x11e0, 0x11e0, 0x11ec, 0x11ec, 0x11ec, 0x11ff, 0x11ff, - 0x120b, 0x120b, 0x120b, 0x1213, 0x121b, 0x121b, 0x1225, 0x122d, - 0x122d, 0x122d, 0x122d, 0x1242, 0x1242, 0x1242, 0x1242, 0x1242, - 0x1253, 0x1253, 0x125f, 0x125f, 0x125f, 0x125f, 0x126d, 0x1279, - 0x1287, 0x128f, 0x12b5, 0x12c1, 0x12c1, 0x12cf, 0x12d5, 0x12db, - 0x12db, 0x12db, 0x12db, 0x12db, 0x12db, 0x12db, 0x12e5, 0x12f1, - 0x1303, 0x130d, 0x130d, 0x130d, 0x130d, 0x1322, 0x1322, 0x132a, - // Entry 240 - 27F - 0x132a, 0x132a, 0x1336, 0x133e, 0x133e, 0x1351, 0x1351, 0x1351, - 0x1351, 0x1351, 0x135f, 0x1367, 0x138b, 0x1393, 0x13ac, 0x13ac, - 0x13c5, 0x13eb, 0x1406, 0x141b, 0x1438, 0x1455, 0x147f, 0x149a, - 0x14b9, 0x14b9, 0x14ce, 0x14e9, 0x14fe, 0x150c, 0x152d, 0x154e, - 0x155a, 0x1573, 0x158c, 0x15b1, 0x15ce, -} // Size: 1250 bytes - -const mrLangStr string = "" + // Size: 11500 bytes - "अफारअबखेजियनअवेस्तनअफ्रिकान्सअकानअम्हारिकअर्गोनीजअरबीआसामीअ\u200dॅव्हेरि" + - "कऐमराअझरबैजानीबष्किरबेलारुशियनबल्गेरियनबिस्लामाबाम्बाराबंगालीतिबेटीब्र" + - "ेतॉनबोस्नियनकातालानचेचेनकॅमोरोकॉर्सिकनक्रीझेकचर्च स्लाव्हिकचूवाशवेल्शड" + - "ॅनिशजर्मनदिवेहीझोंगखाएवेग्रीकइंग्रजीएस्परान्टोस्पॅनिशइस्टोनियनबास्कफार" + - "सीफुलाहफिन्निशफिजियनफरोइजफ्रेंचपश्चिमी फ्रिशियनआयरिशस्कॉट्स गेलिकगॅलिश" + - "ियनगुआरनीगुजरातीमांक्सहौसाहिब्रूहिंदीहिरी मॉटूक्रोएशियनहैतीयनहंगेरियनआ" + - "र्मेनियनहरेरोइंटरलिंग्वाइंडोनेशियनइन्टरलिंगईग्बोसिचुआन यीइनूपियाकइडौआई" + - "सलँडिकइटालियनइनुकिटुट्जपानीजावानीजजॉर्जियनकाँगोकिकुयूक्वान्यामाकझाककला" + - "ल्लिसतख्मेरकन्नडकोरियनकनुरीकाश्मीरीकुर्दिशकोमीकोर्निशकिरगीझलॅटिनलक्झें" + - "बर्गिशगांडालिंबूर्गिशलिंगालालाओलिथुआनियनल्यूबा-कटांगालात्व्हियनमलागसीम" + - "ार्शलीजमाओरीमॅसेडोनियनमल्याळममंगोलियनमराठीमलयमाल्टिज्बर्मीनउरूउत्तर दे" + - "बेलीनेपाळीडोंगाडचनॉर्वेजियन न्योर्स्कनॉर्वेजियन बोकमालदक्षिणात्य देबेल" + - "ीनावाजोन्यान्जाऑक्सितानओजिब्वाओरोमोउडियाओस्सेटिकपंजाबीपालीपोलिशपश्तोपो" + - "र्तुगीजक्वेचुआरोमान्शरुन्दीरोमानियनरशियनकिन्यार्वान्डासंस्कृतसर्दिनियन" + - "सिंधीउत्तरी सामीसांगोसिंहलास्लोव्हाकस्लोव्हेनियनसामोअनशोनासोमालीअल्बान" + - "ियनसर्बियनस्वातीसेसोथोसुंदानीजस्वीडिशस्वाहिलीतामिळतेलगूताजिकथाईतिग्रिन" + - "्यातुर्कमेनत्स्वानाटोंगनतुर्कीसोंगातातरताहितीयनउइगुरयुक्रेनियनउर्दूउझ्" + - "बेकव्हेंदाव्हिएतनामीओलापुकवालूनवोलोफखोसायिद्दिशयोरुबाझुआंगचीनीझुलूअचीन" + - "ीअकोलीअडांग्मेअडिघेअफ्रिहिलीअघेमऐनूअक्केडियनअलेउतदक्षिणात्य अल्ताईपुरा" + - "तन इंग्रजीअंगिकाअ\u200dॅरेमाइकमापुचीआरापाहोआरावाकअसुअस्तुरियनअवधीबलुची" + - "बालिनीजबसाबेजाबेम्बाबेनापश्चिमी बालोचीभोजपुरीबिकोलबिनीसिक्सिकाब्रजबोडो" + - "बुरियातबगिनीसब्लिनकॅड्डोकॅरिबअत्समसिबुआनोकिगाचिब्चाछागाताइचूकीसेमारीचि" + - "नूक जारगॉनचोक्तौशिपेव्यानचेरोकीशेयेन्नमध्य कुर्दिशकॉप्टिकक्राइमीन तुर्" + - "कीसेसेल्वा क्रिओल फ्रेंचकाशुबियनडाकोटादार्गवातायताडेलावेयरस्लाव्हडोग्र" + - "िबडिन्काझार्माडोगरीलोअर सोर्बियनदुआलामिडल डचजोला-फोंयीड्युलादाझागाएम्ब" + - "ूएफिकप्राचीन इजिप्शियनएकाजुकएलामाइटमिडल इंग्रजीइवोन्डोफँगफिलिपिनोफॉनमि" + - "डल फ्रेंचपुरातन फ्रेंचउत्तरी फ्रिशियनपौर्वात्य फ्रिशियनफ्रियुलियानगागा" + - "गाउझगॅन चिनीगायोबायागीझजिल्बरटीजमिडल हाय जर्मनपुरातन हाइ जर्मनगाँडीगोर" + - "ोन्तालोगॉथिकग्रेबोप्राचीन ग्रीकस्विस जर्मनगसीग्विच’इनहैडाहाक्का चिनीहव" + - "ाईयनहिलीगेनॉनहिट्टितेमाँगअप्पर सॉर्बियनशियांग चिनीहूपाइबानइबिबिओइलोकोइ" + - "ंगुशलोज्बानगोम्बामशामेजुदेओ-फारसीजुदेओ-अरबीकारा-कल्पककबाइलकाचिनज्जुकाम" + - "्बाकावीकबार्डियनत्यापमाकोन्देकाबवर्दियानुकोरोखासीखोतानीसकोयरा चीनीकाको" + - "कालेंजीनकिम्बन्दुकोमी-परम्याककोंकणीकोसरियनक्पेल्लेकराचय-बाल्करकरेलियनक" + - "ुरूखशांबालाबाफियाकोलोग्नियनकुमीककुतेनाईलादीनोलांगीलाह्न्डालाम्बालेझ्घी" + - "यनलाकोटामोंगोलोझिउत्तरी ल्युरीलुबा-लुलुआलुइसेनोलुन्डाल्युओमिझोल्युइयाम" + - "ादुरीसमगहीमैथिलीमकस्सरमन्डिन्गोमसाईमोक्षमंडारमेन्डेमेरूमोरिस्येनमिडल आ" + - "यरिशमाखुव्हा-मीट्टोमीटामिकमॅकमिनांग्काबाउमान्चुमणिपुरीमोहॉकमोस्सीमुंडा" + - "ंगएकविध भाषाक्रीकमिरांडिज्मारवाडीएर्झ्यामाझानदेरानीमिन नान चिनीनेपोलिट" + - "ाननामालो जर्मननेवारीनियासनियुआनक्वासिओजिएम्बूननोगाईपुरातन नॉर्सएन्कोउत" + - "्तरी सोथोनुएरअभिजात नेवारीन्यामवेझीन्यानकोलन्योरोन्झिमाओसेजओटोमान तुर्" + - "किशपंगासीनानपहलवीपाम्पान्गापापियामेन्टोपालाउआननायजिरिअन पिजिनपुरातन फा" + - "रसीफोनिशियनपोह्नपियनप्रुशियनपुरातन प्रोव्हेन्सलकीशेइराजस्थानीरापानुईरा" + - "रोटोंगनरोम्बोरोमानीअरोमानियनरव्हासँडवेसाखासामरिटान अरॅमिकसांबुरूसासाकस" + - "ंतालीगाम्बेसांगुसिसिलियनस्कॉट्सदक्षिणी कुर्दिशसेनासेल्कपकोयराबोरो सेन्" + - "नीपुरातन आयरिशताशेल्हिटशॅनसिदामोदक्षिणात्य सामील्युल सामीइनारी सामीस्क" + - "ोल्ट सामीसोनिन्केसोग्डिएनस्रानान टॉन्गोसेरेरसाहोसुकुमासुसुसुमेरियनकोमो" + - "रियनअभिजात सिरियाकसिरियाकटिम्नेतेसोतेरेनोतेतुमटाइग्रेतिवटोकेलाऊक्लिंगो" + - "नलिंगिततामाशेकन्यासा टोन्गाटोक पिसिनतारोकोसिम्शियनतुम्बुकाटुवालुतासाव्" + - "हाकटुवीनियनमध्य ऍटलास तॅमॅझायटउदमुर्तयुगॅरिटिकउम्बुन्डुरूटवाईवॉटिकवुंज" + - "ोवालसेरवोलायतावारेवाशोवार्लपिरीव्हू चिनीकाल्मिकसोगायाओयापीसयानगबेनयेमब" + - "ाकँटोनीजझेपोटेकब्लिसिम्बॉल्सझेनान्गाप्रमाण मोरोक्कन तॅमॅझायटझुनीभाषावै" + - "ज्ञानिक सामग्री नाहीझाझाआधुनिक प्रमाणित अरबीऑस्ट्रियन जर्मनस्विस हाय ज" + - "र्मनऑस्ट्रेलियन इंग्रजीकॅनडियन इंग्रजीब्रिटिश इंग्रजीअमेरिकन इंग्रजीलॅ" + - "टिन अमेरिकन स्पॅनिशयुरोपियन स्पॅनिशमेक्सिकन स्पॅनिशकॅनडियन फ्रेंचस्विस" + - " फ्रेंचलो सॅक्सनफ्लेमिशब्राझिलियन पोर्तुगीजयुरोपियन पोर्तुगीजमोल्डाव्हिय" + - "नसर्बो-क्रोएशियनकाँगो स्वाहिलीसरलीकृत चीनीपारंपारिक चीनी" - -var mrLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x0024, 0x0039, 0x0057, 0x0063, 0x007b, 0x0093, - 0x009f, 0x00ae, 0x00cc, 0x00d8, 0x00f3, 0x0105, 0x0123, 0x013e, - 0x0156, 0x016e, 0x0180, 0x0192, 0x01a7, 0x01bf, 0x01d4, 0x01e3, - 0x01f5, 0x020d, 0x0219, 0x0222, 0x024a, 0x0259, 0x0268, 0x0277, - 0x0286, 0x0298, 0x02aa, 0x02b3, 0x02c2, 0x02d7, 0x02f5, 0x030a, - 0x0325, 0x0334, 0x0343, 0x0352, 0x0367, 0x0379, 0x0388, 0x039a, - 0x03c8, 0x03d7, 0x03fc, 0x0414, 0x0426, 0x043b, 0x044d, 0x0459, - 0x046b, 0x047a, 0x0493, 0x04ae, 0x04c0, 0x04d8, 0x04f3, 0x0502, - // Entry 40 - 7F - 0x0523, 0x0541, 0x055c, 0x056b, 0x0584, 0x059c, 0x05a5, 0x05bd, - 0x05d2, 0x05ed, 0x05fc, 0x0611, 0x0629, 0x0638, 0x064a, 0x0668, - 0x0674, 0x068f, 0x069e, 0x06ad, 0x06bf, 0x06ce, 0x06e6, 0x06fb, - 0x0707, 0x071c, 0x072e, 0x073d, 0x0761, 0x0770, 0x078e, 0x07a3, - 0x07ac, 0x07c7, 0x07ec, 0x080a, 0x081c, 0x0834, 0x0843, 0x0861, - 0x0876, 0x088e, 0x089d, 0x08a6, 0x08be, 0x08cd, 0x08d9, 0x08fb, - 0x090d, 0x091c, 0x0922, 0x095c, 0x098d, 0x09be, 0x09d0, 0x09e8, - 0x0a00, 0x0a15, 0x0a24, 0x0a33, 0x0a4b, 0x0a5d, 0x0a69, 0x0a78, - // Entry 80 - BF - 0x0a87, 0x0aa2, 0x0ab7, 0x0acc, 0x0ade, 0x0af6, 0x0b05, 0x0b2f, - 0x0b44, 0x0b5f, 0x0b6e, 0x0b8d, 0x0b9c, 0x0bae, 0x0bc9, 0x0bed, - 0x0bff, 0x0c0b, 0x0c1d, 0x0c38, 0x0c4d, 0x0c5f, 0x0c71, 0x0c89, - 0x0c9e, 0x0cb6, 0x0cc5, 0x0cd4, 0x0ce3, 0x0cec, 0x0d0a, 0x0d22, - 0x0d3a, 0x0d49, 0x0d5b, 0x0d6a, 0x0d76, 0x0d8e, 0x0d9d, 0x0dbb, - 0x0dca, 0x0ddc, 0x0df1, 0x0e0f, 0x0e21, 0x0e30, 0x0e3f, 0x0e4b, - 0x0e60, 0x0e72, 0x0e81, 0x0e8d, 0x0e99, 0x0ea8, 0x0eb7, 0x0ecf, - 0x0ede, 0x0ede, 0x0ef9, 0x0f05, 0x0f0e, 0x0f29, 0x0f29, 0x0f38, - // Entry C0 - FF - 0x0f38, 0x0f69, 0x0f91, 0x0fa3, 0x0fbe, 0x0fd0, 0x0fd0, 0x0fe5, - 0x0fe5, 0x0fe5, 0x0ff7, 0x0ff7, 0x0ff7, 0x1000, 0x1000, 0x101b, - 0x101b, 0x1027, 0x1036, 0x104b, 0x104b, 0x1054, 0x1054, 0x1054, - 0x1054, 0x1060, 0x1072, 0x1072, 0x107e, 0x107e, 0x107e, 0x10a6, - 0x10bb, 0x10ca, 0x10d6, 0x10d6, 0x10d6, 0x10ee, 0x10ee, 0x10ee, - 0x10fa, 0x10fa, 0x1106, 0x1106, 0x111b, 0x112d, 0x112d, 0x113c, - 0x113c, 0x114e, 0x115d, 0x115d, 0x116c, 0x1181, 0x118d, 0x119f, - 0x11b4, 0x11c6, 0x11d2, 0x11f4, 0x1206, 0x1221, 0x1233, 0x1248, - // Entry 100 - 13F - 0x126a, 0x127f, 0x127f, 0x12aa, 0x12e8, 0x1300, 0x1312, 0x1327, - 0x1336, 0x134e, 0x1363, 0x1378, 0x138a, 0x139c, 0x13ab, 0x13d0, - 0x13d0, 0x13df, 0x13f2, 0x140e, 0x1420, 0x1432, 0x1441, 0x144d, - 0x144d, 0x147e, 0x1490, 0x14a5, 0x14c7, 0x14c7, 0x14dc, 0x14dc, - 0x14e5, 0x14fd, 0x14fd, 0x1506, 0x1506, 0x1525, 0x154a, 0x154a, - 0x1575, 0x15a9, 0x15ca, 0x15d0, 0x15e2, 0x15f8, 0x1604, 0x1610, - 0x1610, 0x1619, 0x1634, 0x1634, 0x165a, 0x1686, 0x1686, 0x1695, - 0x16b3, 0x16c2, 0x16d4, 0x16f9, 0x1718, 0x1718, 0x1718, 0x1721, - // Entry 140 - 17F - 0x1739, 0x1745, 0x1764, 0x1776, 0x1776, 0x1791, 0x17a9, 0x17b5, - 0x17dd, 0x17fc, 0x1808, 0x1814, 0x1826, 0x1835, 0x1844, 0x1844, - 0x1844, 0x1859, 0x186b, 0x187a, 0x1899, 0x18b5, 0x18b5, 0x18d1, - 0x18e0, 0x18ef, 0x18fb, 0x190d, 0x1919, 0x1934, 0x1934, 0x1943, - 0x195b, 0x197f, 0x197f, 0x198b, 0x198b, 0x1997, 0x19ac, 0x19c8, - 0x19c8, 0x19c8, 0x19d4, 0x19ec, 0x1a07, 0x1a29, 0x1a3b, 0x1a50, - 0x1a68, 0x1a8a, 0x1a8a, 0x1a8a, 0x1a9f, 0x1aae, 0x1ac3, 0x1ad5, - 0x1af3, 0x1b02, 0x1b17, 0x1b29, 0x1b38, 0x1b50, 0x1b62, 0x1b7a, - // Entry 180 - 1BF - 0x1b7a, 0x1b7a, 0x1b7a, 0x1b8c, 0x1b8c, 0x1b9b, 0x1ba7, 0x1bcc, - 0x1bcc, 0x1be8, 0x1bfd, 0x1c0f, 0x1c1e, 0x1c2a, 0x1c3f, 0x1c3f, - 0x1c3f, 0x1c54, 0x1c54, 0x1c60, 0x1c72, 0x1c84, 0x1c9f, 0x1cab, - 0x1cab, 0x1cba, 0x1cc9, 0x1cdb, 0x1ce7, 0x1d02, 0x1d1e, 0x1d49, - 0x1d55, 0x1d67, 0x1d8b, 0x1d9d, 0x1db2, 0x1dc1, 0x1dd3, 0x1dd3, - 0x1de8, 0x1e04, 0x1e13, 0x1e2e, 0x1e43, 0x1e43, 0x1e43, 0x1e58, - 0x1e79, 0x1e99, 0x1eb4, 0x1ec0, 0x1ed6, 0x1ee8, 0x1ef7, 0x1f09, - 0x1f09, 0x1f1e, 0x1f36, 0x1f45, 0x1f67, 0x1f67, 0x1f76, 0x1f95, - // Entry 1C0 - 1FF - 0x1fa1, 0x1fc6, 0x1fe1, 0x1ff9, 0x200b, 0x201d, 0x2029, 0x2051, - 0x206c, 0x207b, 0x2099, 0x20bd, 0x20d2, 0x20d2, 0x20fd, 0x20fd, - 0x20fd, 0x211f, 0x211f, 0x2137, 0x2137, 0x2137, 0x2152, 0x216a, - 0x21a1, 0x21b0, 0x21b0, 0x21cb, 0x21e0, 0x21fb, 0x21fb, 0x21fb, - 0x220d, 0x221f, 0x221f, 0x221f, 0x221f, 0x223a, 0x2249, 0x2258, - 0x2264, 0x228f, 0x22a4, 0x22b3, 0x22c5, 0x22c5, 0x22d7, 0x22e6, - 0x22fe, 0x2313, 0x2313, 0x233e, 0x233e, 0x234a, 0x234a, 0x235c, - 0x238a, 0x23ac, 0x23ac, 0x23c7, 0x23d0, 0x23d0, 0x23e2, 0x23e2, - // Entry 200 - 23F - 0x23e2, 0x240d, 0x2429, 0x2445, 0x2467, 0x247f, 0x2497, 0x24bf, - 0x24ce, 0x24da, 0x24da, 0x24ec, 0x24f8, 0x2510, 0x2528, 0x2550, - 0x2565, 0x2565, 0x2565, 0x2577, 0x2583, 0x2595, 0x25a4, 0x25b9, - 0x25c2, 0x25d7, 0x25d7, 0x25ef, 0x2601, 0x2601, 0x2616, 0x263b, - 0x2654, 0x2654, 0x2666, 0x2666, 0x267e, 0x267e, 0x2696, 0x26a8, - 0x26c3, 0x26db, 0x2710, 0x2725, 0x2740, 0x275b, 0x2764, 0x276d, - 0x276d, 0x276d, 0x276d, 0x276d, 0x277c, 0x277c, 0x278b, 0x279d, - 0x27b2, 0x27be, 0x27ca, 0x27e5, 0x27fe, 0x2813, 0x2813, 0x281f, - // Entry 240 - 27F - 0x2828, 0x2837, 0x284c, 0x285b, 0x285b, 0x2870, 0x2885, 0x28ac, - 0x28ac, 0x28c4, 0x2908, 0x2914, 0x295e, 0x296a, 0x29a2, 0x29a2, - 0x29cd, 0x29f6, 0x2a2d, 0x2a58, 0x2a83, 0x2aae, 0x2ae9, 0x2b17, - 0x2b45, 0x2b45, 0x2b6d, 0x2b8f, 0x2ba8, 0x2bbd, 0x2bf7, 0x2c2b, - 0x2c4f, 0x2c7a, 0x2ca2, 0x2cc4, 0x2cec, -} // Size: 1250 bytes - -const msLangStr string = "" + // Size: 3266 bytes - "aaAbkhaziaAvestanAfrikaansAkanAmharicAragonArabAssamAvaricAymaraAzerbaij" + - "anBashkirBelarusBulgariaBislamaBambaraBenggalaTibetBretonBosniaCatalonia" + - "ChechenChamorroCorsicaCzechSlavik GerejaChuvashWalesDenmarkJermanDivehiD" + - "zongkhaEweGreekInggerisEsperantoSepanyolEstoniaBasqueParsiFulahFinlandFi" + - "jiFaroePerancisFrisian BaratIrelandScots GaelicGaliciaGuaraniGujeratManx" + - "HausaIbraniHindiCroatiaHaitiHungaryArmeniaHereroInterlinguaIndonesiaInte" + - "rlingueIgboSichuan YiIdoIcelandItaliInuktitutJepunJawaGeorgiaKongoKikuya" + - "KuanyamaKazakhstanKalaallisutKhmerKannadaKoreaKanuriKashmirKurdishKomiCo" + - "rnishKirghizLatinLuxembourgGandaLimburgishLingalaLaosLithuaniaLuba-Katan" + - "gaLatviaMalagasyMarshallMaoriMacedoniaMalayalamMongoliaMarathiBahasa Mel" + - "ayuMaltaBurmaNauruNdebele UtaraNepalNdongaBelandaNynorsk NorwayBokmål No" + - "rwayNdebele SelatanNavajoNyanjaOccitaniaOromoOriyaOssetePunjabiPolandPas" + - "htoPortugisQuechuaRomanshRundiRomaniaRusiaKinyarwandaSanskritSardiniaSin" + - "dhiSami UtaraSangoSinhalaSlovakSloveniaSamoaShonaSomaliAlbaniaSerbiaSwat" + - "iSotho SelatanSundaSwedenSwahiliTamilTeluguTajikThaiTigrinyaTurkmenTswan" + - "aTongaTurkiTsongaTatarTahitiUyghurUkraineUrduUzbekistanVendaVietnamVolap" + - "ükWalloonWolofXhosaYiddishYorubaCinaZuluAcehAkoliAdangmeAdygheArab Tuni" + - "siaAghemAinualeAltai SelatananpMapucheArapahoArab AlgeriaArab MaghribiAr" + - "ab MesirAsuAsturiaAwadhiBaluchiBaliBasaaBamunGhomalaBejaBembaBenaBafutBa" + - "lochi BaratBhojpuriBiniKomSiksikaBishnupriyaBrahuiBodoAkooseBuriatBugisB" + - "uluBlinMedumbaCayugaCebuanoChigaChukeseMariChoctawCherokeeCheyenneKurdi " + - "SoraniCopticTurki KrimeaPerancis Seselwa CreoleDakotaDargwaTaitaDogribZa" + - "rmaDogriSorbian RendahDualaJola-FonyiDazagaEmbuEfikEkajukEwondoFilipinaF" + - "onFriulianGaGagauzCina GanGbayaZoroastrian DariGeezKiribatiGilakiGoronta" + - "loGreek PurbaJerman SwitzerlandGusiiGwichʼinCina HakkaHawaiiHiligaynonHm" + - "ongSorbian AtasCina XiangHupaIbanIbibioIlokoIngushLojbanNgombaMachameKab" + - "yleKachinJjuKambaKabardianKanembuTyapMakondeKabuverdianuKoroKhasiKoyra C" + - "hiiniKhowarKakoKalenjinKimbunduKomi-PermyakKonkaniKpelleKarachay-BalkarK" + - "arelianKurukhShambalaBafiaColognianKumykLadinoLangiLahndaLezghianLakotaL" + - "oziLuri UtaraLuba-LuluaLundaLuoMizoLuyiaMaduraMafaMagahiMaithiliMakasarM" + - "asaiMabaMokshaMendeMeruMorisyenMakhuwa-MeettoMeta’MicmacMinangkabauManip" + - "uriMohawkMossiMundangPelbagai BahasaCreekMirandeseMyeneErzyaMazanderaniC" + - "ina Min NanNeapolitanNamaJerman RendahNewariNiasNiuKwasioNgiemboonNogaiN" + - "’koSotho UtaraNuerNyankolePangasinanPampangaPapiamentoPalauanNigerian " + - "PidginPrussianKʼicheʼRapanuiRarotongaRomboAromanianRwaSandaweSakhaSambur" + - "uSantaliNgambaySanguSiciliScotsKurdish SelatanSenecaSenaKoyraboro SenniT" + - "achelhitShanArab ChadianSami SelatanLule SamiInari SamiSkolt SamiSoninke" + - "Sranan TongoSahoSukumaComoriaSyriacTimneTesoTetumTigreKlingonTalyshTok P" + - "isinTarokoTumbukaTuvaluTasawaqTuvinianTamazight Atlas TengahUdmurtUmbund" + - "uRootVaiVunjoWalserWolayttaWarayWarlpiriCina WuKalmykSogaYangbenYembaKan" + - "tonisTamazight Maghribi StandardZuniTiada kandungan linguistikZazaArab S" + - "tandard ModenJerman AustriaJerman Halus SwitzerlandInggeris AustraliaIng" + - "geris KanadaInggeris BritishInggeris ASSepanyol Amerika LatinSepanyol Er" + - "opahSepanyol MexicoPerancis KanadaPerancis SwitzerlandSaxon RendahFlemis" + - "hPortugis BrazilPortugis EropahMoldaviaSerboCroatiaCongo SwahiliCina Rin" + - "gkasCina Tradisional" - -var msLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0002, 0x000a, 0x0011, 0x001a, 0x001e, 0x0025, 0x002b, - 0x002f, 0x0034, 0x003a, 0x0040, 0x004a, 0x0051, 0x0058, 0x0060, - 0x0067, 0x006e, 0x0076, 0x007b, 0x0081, 0x0087, 0x0090, 0x0097, - 0x009f, 0x00a6, 0x00a6, 0x00ab, 0x00b8, 0x00bf, 0x00c4, 0x00cb, - 0x00d1, 0x00d7, 0x00df, 0x00e2, 0x00e7, 0x00ef, 0x00f8, 0x0100, - 0x0107, 0x010d, 0x0112, 0x0117, 0x011e, 0x0122, 0x0127, 0x012f, - 0x013c, 0x0143, 0x014f, 0x0156, 0x015d, 0x0164, 0x0168, 0x016d, - 0x0173, 0x0178, 0x0178, 0x017f, 0x0184, 0x018b, 0x0192, 0x0198, - // Entry 40 - 7F - 0x01a3, 0x01ac, 0x01b7, 0x01bb, 0x01c5, 0x01c5, 0x01c8, 0x01cf, - 0x01d4, 0x01dd, 0x01e2, 0x01e6, 0x01ed, 0x01f2, 0x01f8, 0x0200, - 0x020a, 0x0215, 0x021a, 0x0221, 0x0226, 0x022c, 0x0233, 0x023a, - 0x023e, 0x0245, 0x024c, 0x0251, 0x025b, 0x0260, 0x026a, 0x0271, - 0x0275, 0x027e, 0x028a, 0x0290, 0x0298, 0x02a0, 0x02a5, 0x02ae, - 0x02b7, 0x02bf, 0x02c6, 0x02d3, 0x02d8, 0x02dd, 0x02e2, 0x02ef, - 0x02f4, 0x02fa, 0x0301, 0x030f, 0x031d, 0x032c, 0x0332, 0x0338, - 0x0341, 0x0341, 0x0346, 0x034b, 0x0351, 0x0358, 0x0358, 0x035e, - // Entry 80 - BF - 0x0364, 0x036c, 0x0373, 0x037a, 0x037f, 0x0386, 0x038b, 0x0396, - 0x039e, 0x03a6, 0x03ac, 0x03b6, 0x03bb, 0x03c2, 0x03c8, 0x03d0, - 0x03d5, 0x03da, 0x03e0, 0x03e7, 0x03ed, 0x03f2, 0x03ff, 0x0404, - 0x040a, 0x0411, 0x0416, 0x041c, 0x0421, 0x0425, 0x042d, 0x0434, - 0x043a, 0x043f, 0x0444, 0x044a, 0x044f, 0x0455, 0x045b, 0x0462, - 0x0466, 0x0470, 0x0475, 0x047c, 0x0484, 0x048b, 0x0490, 0x0495, - 0x049c, 0x04a2, 0x04a2, 0x04a6, 0x04aa, 0x04ae, 0x04b3, 0x04ba, - 0x04c0, 0x04cc, 0x04cc, 0x04d1, 0x04d5, 0x04d5, 0x04d5, 0x04d8, - // Entry C0 - FF - 0x04d8, 0x04e5, 0x04e5, 0x04e8, 0x04e8, 0x04ef, 0x04ef, 0x04f6, - 0x0502, 0x0502, 0x0502, 0x050f, 0x0519, 0x051c, 0x051c, 0x0523, - 0x0523, 0x0529, 0x0530, 0x0534, 0x0534, 0x0539, 0x053e, 0x053e, - 0x0545, 0x0549, 0x054e, 0x054e, 0x0552, 0x0557, 0x0557, 0x0564, - 0x056c, 0x056c, 0x0570, 0x0570, 0x0573, 0x057a, 0x0585, 0x0585, - 0x0585, 0x058b, 0x058f, 0x0595, 0x059b, 0x05a0, 0x05a4, 0x05a8, - 0x05af, 0x05af, 0x05af, 0x05b5, 0x05b5, 0x05bc, 0x05c1, 0x05c1, - 0x05c1, 0x05c8, 0x05cc, 0x05cc, 0x05d3, 0x05d3, 0x05db, 0x05e3, - // Entry 100 - 13F - 0x05ef, 0x05f5, 0x05f5, 0x0601, 0x0618, 0x0618, 0x061e, 0x0624, - 0x0629, 0x0629, 0x0629, 0x062f, 0x062f, 0x0634, 0x0639, 0x0647, - 0x0647, 0x064c, 0x064c, 0x0656, 0x0656, 0x065c, 0x0660, 0x0664, - 0x0664, 0x0664, 0x066a, 0x066a, 0x066a, 0x066a, 0x0670, 0x0670, - 0x0670, 0x0678, 0x0678, 0x067b, 0x067b, 0x067b, 0x067b, 0x067b, - 0x067b, 0x067b, 0x0683, 0x0685, 0x068b, 0x0693, 0x0693, 0x0698, - 0x06a8, 0x06ac, 0x06b4, 0x06ba, 0x06ba, 0x06ba, 0x06ba, 0x06ba, - 0x06c3, 0x06c3, 0x06c3, 0x06ce, 0x06e0, 0x06e0, 0x06e0, 0x06e5, - // Entry 140 - 17F - 0x06ee, 0x06ee, 0x06f8, 0x06fe, 0x06fe, 0x0708, 0x0708, 0x070d, - 0x0719, 0x0723, 0x0727, 0x072b, 0x0731, 0x0736, 0x073c, 0x073c, - 0x073c, 0x0742, 0x0748, 0x074f, 0x074f, 0x074f, 0x074f, 0x074f, - 0x0755, 0x075b, 0x075e, 0x0763, 0x0763, 0x076c, 0x0773, 0x0777, - 0x077e, 0x078a, 0x078a, 0x078e, 0x078e, 0x0793, 0x0793, 0x079f, - 0x07a5, 0x07a5, 0x07a9, 0x07b1, 0x07b9, 0x07c5, 0x07cc, 0x07cc, - 0x07d2, 0x07e1, 0x07e1, 0x07e1, 0x07e9, 0x07ef, 0x07f7, 0x07fc, - 0x0805, 0x080a, 0x080a, 0x0810, 0x0815, 0x081b, 0x081b, 0x0823, - // Entry 180 - 1BF - 0x0823, 0x0823, 0x0823, 0x0829, 0x0829, 0x0829, 0x082d, 0x0837, - 0x0837, 0x0841, 0x0841, 0x0846, 0x0849, 0x084d, 0x0852, 0x0852, - 0x0852, 0x0858, 0x085c, 0x0862, 0x086a, 0x0871, 0x0871, 0x0876, - 0x087a, 0x0880, 0x0880, 0x0885, 0x0889, 0x0891, 0x0891, 0x089f, - 0x08a6, 0x08ac, 0x08b7, 0x08b7, 0x08bf, 0x08c5, 0x08ca, 0x08ca, - 0x08d1, 0x08e0, 0x08e5, 0x08ee, 0x08ee, 0x08ee, 0x08f3, 0x08f8, - 0x0903, 0x090f, 0x0919, 0x091d, 0x092a, 0x0930, 0x0934, 0x0937, - 0x0937, 0x093d, 0x0946, 0x094b, 0x094b, 0x094b, 0x0951, 0x095c, - // Entry 1C0 - 1FF - 0x0960, 0x0960, 0x0960, 0x0968, 0x0968, 0x0968, 0x0968, 0x0968, - 0x0972, 0x0972, 0x097a, 0x0984, 0x098b, 0x098b, 0x099a, 0x099a, - 0x099a, 0x099a, 0x099a, 0x099a, 0x099a, 0x099a, 0x099a, 0x09a2, - 0x09a2, 0x09ab, 0x09ab, 0x09ab, 0x09b2, 0x09bb, 0x09bb, 0x09bb, - 0x09c0, 0x09c0, 0x09c0, 0x09c0, 0x09c0, 0x09c9, 0x09cc, 0x09d3, - 0x09d8, 0x09d8, 0x09df, 0x09df, 0x09e6, 0x09e6, 0x09ed, 0x09f2, - 0x09f8, 0x09fd, 0x09fd, 0x0a0c, 0x0a12, 0x0a16, 0x0a16, 0x0a16, - 0x0a25, 0x0a25, 0x0a25, 0x0a2e, 0x0a32, 0x0a3e, 0x0a3e, 0x0a3e, - // Entry 200 - 23F - 0x0a3e, 0x0a4a, 0x0a53, 0x0a5d, 0x0a67, 0x0a6e, 0x0a6e, 0x0a7a, - 0x0a7a, 0x0a7e, 0x0a7e, 0x0a84, 0x0a84, 0x0a84, 0x0a8b, 0x0a8b, - 0x0a91, 0x0a91, 0x0a91, 0x0a96, 0x0a9a, 0x0a9a, 0x0a9f, 0x0aa4, - 0x0aa4, 0x0aa4, 0x0aa4, 0x0aab, 0x0aab, 0x0ab1, 0x0ab1, 0x0ab1, - 0x0aba, 0x0aba, 0x0ac0, 0x0ac0, 0x0ac0, 0x0ac0, 0x0ac7, 0x0acd, - 0x0ad4, 0x0adc, 0x0af2, 0x0af8, 0x0af8, 0x0aff, 0x0b03, 0x0b06, - 0x0b06, 0x0b06, 0x0b06, 0x0b06, 0x0b06, 0x0b06, 0x0b0b, 0x0b11, - 0x0b19, 0x0b1e, 0x0b1e, 0x0b26, 0x0b2d, 0x0b33, 0x0b33, 0x0b37, - // Entry 240 - 27F - 0x0b37, 0x0b37, 0x0b3e, 0x0b43, 0x0b43, 0x0b4b, 0x0b4b, 0x0b4b, - 0x0b4b, 0x0b4b, 0x0b66, 0x0b6a, 0x0b84, 0x0b88, 0x0b9b, 0x0b9b, - 0x0ba9, 0x0bc1, 0x0bd3, 0x0be2, 0x0bf2, 0x0bfd, 0x0c13, 0x0c22, - 0x0c31, 0x0c31, 0x0c40, 0x0c54, 0x0c60, 0x0c67, 0x0c76, 0x0c85, - 0x0c8d, 0x0c99, 0x0ca6, 0x0cb2, 0x0cc2, -} // Size: 1250 bytes - -const myLangStr string = "" + // Size: 10322 bytes - "အာဖာအဘ်ခါဇီရာတောင်အာဖရိကအာကန်အမ်ဟာရစ်ခ်အာရာဂွန်အာရဗီအာသံအာဗာရစ်ခ်အိုင်မာ" + - "ရအဇာဘိုင်ဂျန်ဘက်ရှ်ကာဘီလာရုဇ်ဘူလ်ဂေးရီးယားဘစ်စ်လာမာဘန်ဘာရာဘင်္ဂါလီတိဘက" + - "်ဘရီတွန်ဘော့စ်နီးယားကတ်တလန်ချက်ချန်းချမိုရိုခိုစီကန်ခရီးချက်ချပ်ချ် စလ" + - "ာဗစ်ချူဗက်ရှ်ဝေလဒိန်းမတ်ဂျာမန်ဒီဗာဟီဒဇွန်ကာအီဝီဂရိအင်္ဂလိပ်အက်စ်ပရန်တိ" + - "ုစပိန်အက်စ်တိုးနီးယားဘာစ်ခ်ပါရှန်ဖူလာဖင်လန်ဖီဂျီဖာရိုပြင်သစ်အနောက် ဖရီ" + - "စီရန်အိုင်းရစ်ရှ်စကော့တစ်ရှ် ဂေးလစ်ခ်ဂါလီစီယာဂူအာရာနီဂူဂျာရသီမန်းဇ်ဟာဥ" + - "စာဟီးဘရူးဟိန္ဒူခရိုအေးရှားဟေတီဟန်ဂေရီအာမေးနီးယားဟီရဲရိုအင်တာလင်ဂွါအင်ဒ" + - "ိုနီးရှားအစ္ဂဘိုစီချွမ် ရီအီဒိုအိုက်စ်လန်အီတလီအီနုခ်တီတုဂျပန်ဂျာဗားဂျေ" + - "ာ်ဂျီယာကွန်ဂိုကီကူယူကွန်းယာမာကာဇာခ်ကလာအ်လီဆပ်ခမာကန္နာဒါကိုရီးယားကနူရီက" + - "က်ရှ်မီးယားကဒ်ကိုမီခိုနီရှ်ကာဂျစ်လက်တင်လူဇင်ဘတ်ဂန်ဒါလင်ဘာဂစ်ရှ်လင်ဂါလာ" + - "လာအိုလစ်သူဝေးနီးယားလူဘာ-ကတန်ဂါလတ်ဗီးယားမာလဂက်စီမာရှယ်လိဇ်မာအိုရီမက်စီဒ" + - "ိုးနီးယားမလေးရာလမ်မွန်ဂိုလီးယားမာရသီမလေးမော်လ်တာမြန်မာနော်ရူးတောင် အွန" + - "်န်ဒီဘီလီနီပေါအွန်ဒွန်ဂါဒတ်ချ်နော်ဝေး နီးနောစ်နော်ဝေး ဘွတ်ခ်မော်လ်တောင" + - "် အွန်န်ဘီလီနာဗာဟိုနရန်ဂျာအိုစီတန်အိုရိုမိုအိုရီရာအိုဆဲတစ်ခ်ပန်ချာပီပါ" + - "ဠိပိုလန်ပက်ရှ်တွန်းပေါ်တူဂီခီချူဝါအိုဝါရောမရွန်ဒီရိုမေနီယားရုရှကင်ရာဝန" + - "်ဒါသင်္သကရိုက်ဆာဒီနီးယားစင်ဒီမြောက် ဆာမိဆန်ဂိုစင်ဟာလာစလိုဗက်စလိုဗေးနီး" + - "ယားဆမိုအာရှိုနာဆိုမာလီအယ်လ်ဘေးနီးယားဆားဘီးယားဆွာဇီလန်တောင်ပိုင်း ဆိုသိ" + - "ုဆူဒန်ဆွီဒင်ဆွာဟီလီတမီးလ်တီလီဂူတာဂျစ်ထိုင်းတီဂ်ရင်ရာတာ့ခ်မင်နစ္စတန်တီဆ" + - "ဝါနာတွန်ဂါတူရကီဆွန်ဂါတာတာတဟီတီဝီဂါယူကရိန်းအူရ်ဒူဦးဇ်ဘက်ဗင်န်ဒါဗီယက်နမ်" + - "ဗိုလာပိုက်ဝါလူးန်ဝူလိုဖ်ဇိုစာဂျူးယိုရူဘာတရုတ်ဇူးလူးအာချေးဒန်မဲအဒိုင်ဂီ" + - "အာဂ်ဟိန်းအိန်နုအာလီယုတောင် အာလ်တိုင်းအင်ဂလို ဆက္ကစွန်အန်ဂီကာမာပုချီအာရ" + - "ာပါဟိုအာစုအက်စတူရီယန်းအာဝါဒီဘာလီဘာဆာဘိန်ဘာဘီနာအနောက် ဘဲလိုချီဘို့ဂျ်ပူ" + - "ရီဘီနီစစ္စီကာဗိုဒိုဘူဂစ်စ်ဘလင်စီဗူအာနိုချီဂါချူကီးစ်မာရီချော့တိုချာရို" + - "ကီချေယန်းဆိုရာနီခရီအိုလီဒါကိုတာဒါဂ်ဝါတိုင်တာဒယ်လာဝဲလ်ဒေါ့ဂ်ရစ်ဘ်ဇာမာအန" + - "ိမ့် ဆိုဘီယန်းဒူအလာအလယ်ပိုင်း ဒတ်ချ်ဂျိုလာ-ဖွန်ရီဒဇာဂါအမ်ဘူအာဖိခ်ရှေးဟ" + - "ောင်း အီဂျစ်အီကာဂျုခ်အလယ်ပိုင်း အင်္ဂလိပ်အီဝန်ဒိုဖိလစ်ပိုင်ဖော်န်အလယ်ပ" + - "ိုင်း ပြင်သစ်ဖရန်စီစ်မြောက် ဖရီစီရန်အရှေ့ ဖရီစီရန်ဖရူလီယန်းဂါဂါဂုဇ်ဂီး" + - "ဇ်ကာရီဗာတီအလယ်ပိုင်း အမြင့် ဂျာမန်ဂိုရိုတာလိုရှေးဟောင်း ဂရိဆွစ် ဂျာမန်" + - "ဂူစီးဂွစ်ချင်ဟာဝိုင်ယီဟီလီဂေနွန်မုံဆက္ကဆိုနီဟူပါအီဗန်အီဘီဘီယိုအီလိုကို" + - "အင်ဂုရှ်လိုဂျ်ဘန်ဂွမ်ဘာမချာမီဂျူဒီယို-ပါရှန်ဂျူဒီယို-အာရဗီကဘိုင်လ်ကချင" + - "်ဂျူအူကမ်ဘာကဘာဒင်တိုင်အပ်မာခွန်ဒီကဘူဗာဒီအာနူကိုရိုခါစီကိုရာ ချီအီနီကကိ" + - "ုကလန်ဂျင်ကင်ဘွန်ဒူကိုမီ-ပါမြက်ကွန်ကနီကပ်ပဲလ်ကရာချေး-ဘာကာကာရီလီယန်ကူရုပ" + - "်ခ်ရှန်ဘာလာဘာဖီအာကိုလိုနီယန်းကွမ်မိုက်လာဒီနိုလန်ဂီလက်ဇ်ဂီးယားလာကိုတာလိ" + - "ုဇီမြောက်လူရီလူဘာ-လူလူအာလွန်ဒါလူအိုမီဇိုလူရီအာမဒူရာမဂါဟီမိုင်သီလီမကာဆာ" + - "မာဆိုင်မို့ခ်ရှာမန်ဒဲမီရုမောရစ်ရှအလယ်ပိုင်း အိုင်းရစ်ရှ်မာခူဝါ-မီအီတို" + - "မီတာမစ်ခ်မက်ခ်စူကူမီနန်မန်ချူးမနိပူရမိုဟော့ခ်မိုစီမွန်ဒန်းဘာသာစကား အမျ" + - "ိုးမျိုးခရိခ်မီရန်ဒီးဇ်အီဇယာမာဇန်ဒါရန်နီနပိုလီတန်နာမာအနိမ့် ဂျာမန်နီဝါ" + - "ရီနီးရပ်စ်နူအဲယန်းကွာစီအိုအွန်ရဲဘွန်းနိုဂိုင်အွန်ကိုမြောက် ဆိုသိုနူအာန" + - "ရန်ကိုလီပန်ဂါစီနန်ပမ်ပန်ညာပါပီမင်တိုပလာအိုနိုင်ဂျီးရီးယား ပစ်ဂျင်ပါရှန" + - "် အဟောင်းပရူရှန်ကီခ်အီချီရပန်နူအီရရိုတွန်ဂန်ရွမ်ဘိုအာရိုမန်းနီးယန်းရူဝ" + - "မ်ဆန်ဒါဝီဆခါဆမ်ဘူရူဆန်တာလီအွန်ဂမ်းဘေးဆန်ဂုစစ္စလီစကော့တ်စီနာကိုရာဘိုရို" + - " ဆမ်နီအိုင်းရစ် ဟောင်းတာချယ်လ်ဟစ်ရှမ်းတောင် ဆာမိလူလီ ဆာမိအီနာရီ ဆာမိစခို" + - "းလ် ဆမ်မီဆိုနင်ကေးဆရာနန် တွန်ဂိုဆာဟိုဆူကူမာကိုမိုရီးယန်းဆီးရီးယားတင်မ်" + - "နဲတီဆိုတီတွမ်တီဂရီကလင်ဂွန်တော့ခ် ပိစင်တရိုကိုတမ်ဘူကာတူဗာလူတာဆာဝါခ်တူဗန" + - "်အလယ်အာ့တလာစ် တာမာဇိုက်အူမူရတ်အူဘန်ဒူမူလရင်းမြစ်ဗိုင်ဗွန်ဂျိုဝေါလ်ဆာဝိ" + - "ုလက်တာဝါရေးဝေါလ်ပီရီကာလ်မိုက်ဆိုဂါရန်ဘဲန်ရမ်ဘာကွမ်တုံမိုရိုကို တမဇိုက်" + - "ဇူနီဘာသာစကားနှင့် ပတ်သက်သောအရာ မရှိပါဇာဇာဩစတြီးယား ဂျာမန်အလီမဲန်နစ် ဂျ" + - "ာမန်ဩစတြေးလျှ အင်္ဂလိပ်ကနေဒါ အင်္ဂလိပ်ဗြိတိသျှ အင်္ဂလိပ်အမေရိကန် အင်္ဂ" + - "လိပ်စပိန် (ဥရောပ)ကနေဒါ ပြင်သစ်ဆွစ် ပြင်သစ်ဂျာမန် (နယ်သာလန်)ဖလီမစ်ရှ်ဘရ" + - "ာဇီး ပေါ်တူဂီဥရောပ ပေါ်တူဂီမော်လဒိုဗာကွန်ဂို ဆွာဟီလီ" - -var myLangIdx = []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x0027, 0x0027, 0x0048, 0x0057, 0x0075, 0x008d, - 0x009c, 0x00a8, 0x00c3, 0x00db, 0x00ff, 0x0117, 0x012f, 0x0156, - 0x0171, 0x0186, 0x019e, 0x01ad, 0x01c2, 0x01e6, 0x01fb, 0x0216, - 0x022e, 0x0246, 0x0252, 0x025e, 0x0286, 0x02a1, 0x02aa, 0x02c2, - 0x02d4, 0x02e6, 0x02fb, 0x0307, 0x0310, 0x032b, 0x034f, 0x035e, - 0x038b, 0x039d, 0x03af, 0x03bb, 0x03cd, 0x03dc, 0x03eb, 0x0400, - 0x042b, 0x044f, 0x0489, 0x04a1, 0x04b9, 0x04d1, 0x04e3, 0x04f2, - 0x0507, 0x0519, 0x0519, 0x053a, 0x0546, 0x055b, 0x057c, 0x0591, - // Entry 40 - 7F - 0x05b2, 0x05d9, 0x05d9, 0x05ee, 0x060a, 0x060a, 0x0619, 0x0637, - 0x0646, 0x0664, 0x0673, 0x0685, 0x06a3, 0x06b8, 0x06ca, 0x06e5, - 0x06f7, 0x0715, 0x071e, 0x0733, 0x074e, 0x075d, 0x0781, 0x078a, - 0x0799, 0x07b1, 0x07c3, 0x07d5, 0x07ed, 0x07fc, 0x081d, 0x0832, - 0x0841, 0x086b, 0x088a, 0x08a5, 0x08bd, 0x08db, 0x08f0, 0x091d, - 0x0938, 0x095f, 0x096e, 0x097a, 0x0992, 0x09a4, 0x09b9, 0x09ed, - 0x09fc, 0x0a1a, 0x0a2c, 0x0a5a, 0x0a94, 0x0ac2, 0x0ad7, 0x0aec, - 0x0b04, 0x0b04, 0x0b1f, 0x0b34, 0x0b52, 0x0b6a, 0x0b76, 0x0b88, - // Entry 80 - BF - 0x0ba9, 0x0bc1, 0x0be5, 0x0bf1, 0x0c03, 0x0c21, 0x0c2d, 0x0c4b, - 0x0c6c, 0x0c8a, 0x0c99, 0x0cb8, 0x0cca, 0x0cdf, 0x0cf4, 0x0d1b, - 0x0d2d, 0x0d3f, 0x0d54, 0x0d7e, 0x0d99, 0x0db1, 0x0de5, 0x0df4, - 0x0e06, 0x0e1b, 0x0e2d, 0x0e3f, 0x0e51, 0x0e63, 0x0e7e, 0x0eab, - 0x0ec0, 0x0ed2, 0x0ee1, 0x0ef3, 0x0eff, 0x0f0e, 0x0f1a, 0x0f32, - 0x0f44, 0x0f59, 0x0f6e, 0x0f86, 0x0fa4, 0x0fb9, 0x0fce, 0x0fdd, - 0x0fe9, 0x0ffe, 0x0ffe, 0x100d, 0x101f, 0x1031, 0x1031, 0x1040, - 0x1058, 0x1058, 0x1058, 0x1073, 0x1085, 0x1085, 0x1085, 0x1097, - // Entry C0 - FF - 0x1097, 0x10c5, 0x10f3, 0x1108, 0x1108, 0x111d, 0x111d, 0x1138, - 0x1138, 0x1138, 0x1138, 0x1138, 0x1138, 0x1144, 0x1144, 0x1168, - 0x1168, 0x117a, 0x117a, 0x1186, 0x1186, 0x1192, 0x1192, 0x1192, - 0x1192, 0x1192, 0x11a4, 0x11a4, 0x11b0, 0x11b0, 0x11b0, 0x11db, - 0x11fc, 0x11fc, 0x1208, 0x1208, 0x1208, 0x121d, 0x121d, 0x121d, - 0x121d, 0x121d, 0x122f, 0x122f, 0x122f, 0x1244, 0x1244, 0x1250, - 0x1250, 0x1250, 0x1250, 0x1250, 0x1250, 0x126b, 0x127a, 0x127a, - 0x127a, 0x1292, 0x129e, 0x129e, 0x12b6, 0x12b6, 0x12ce, 0x12e3, - // Entry 100 - 13F - 0x12f8, 0x12f8, 0x12f8, 0x12f8, 0x1310, 0x1310, 0x1325, 0x1337, - 0x134c, 0x1367, 0x1367, 0x1388, 0x1388, 0x1394, 0x1394, 0x13c2, - 0x13c2, 0x13d1, 0x1402, 0x1427, 0x1427, 0x1436, 0x1445, 0x1457, - 0x1457, 0x1488, 0x14a3, 0x14a3, 0x14dd, 0x14dd, 0x14f5, 0x14f5, - 0x14f5, 0x1513, 0x1513, 0x1525, 0x1525, 0x1559, 0x1571, 0x1571, - 0x159c, 0x15c4, 0x15df, 0x15e5, 0x15f7, 0x15f7, 0x15f7, 0x15f7, - 0x15f7, 0x1606, 0x161e, 0x161e, 0x1662, 0x1662, 0x1662, 0x1662, - 0x1683, 0x1683, 0x1683, 0x16ab, 0x16ca, 0x16ca, 0x16ca, 0x16d9, - // Entry 140 - 17F - 0x16f1, 0x16f1, 0x16f1, 0x170c, 0x170c, 0x172a, 0x172a, 0x1733, - 0x174e, 0x174e, 0x175a, 0x1769, 0x1784, 0x179c, 0x17b4, 0x17b4, - 0x17b4, 0x17cf, 0x17e1, 0x17f3, 0x181e, 0x1846, 0x1846, 0x1846, - 0x185e, 0x186d, 0x187c, 0x188b, 0x188b, 0x189d, 0x189d, 0x18b5, - 0x18cd, 0x18ee, 0x18ee, 0x1900, 0x1900, 0x190c, 0x190c, 0x1931, - 0x1931, 0x1931, 0x193d, 0x1955, 0x1970, 0x1992, 0x19a7, 0x19a7, - 0x19bc, 0x19de, 0x19de, 0x19de, 0x19f9, 0x1a11, 0x1a29, 0x1a3b, - 0x1a5f, 0x1a7a, 0x1a7a, 0x1a8f, 0x1a9e, 0x1a9e, 0x1a9e, 0x1abf, - // Entry 180 - 1BF - 0x1abf, 0x1abf, 0x1abf, 0x1ad4, 0x1ad4, 0x1ad4, 0x1ae3, 0x1b01, - 0x1b01, 0x1b20, 0x1b20, 0x1b32, 0x1b41, 0x1b50, 0x1b62, 0x1b62, - 0x1b62, 0x1b71, 0x1b71, 0x1b80, 0x1b9b, 0x1baa, 0x1baa, 0x1bbf, - 0x1bbf, 0x1bda, 0x1bda, 0x1be9, 0x1bf5, 0x1c0d, 0x1c50, 0x1c78, - 0x1c84, 0x1ca2, 0x1cbd, 0x1cd2, 0x1ce4, 0x1cff, 0x1d0e, 0x1d0e, - 0x1d26, 0x1d60, 0x1d6f, 0x1d8d, 0x1d8d, 0x1d8d, 0x1d8d, 0x1d9c, - 0x1dc0, 0x1dc0, 0x1ddb, 0x1de7, 0x1e0c, 0x1e1e, 0x1e36, 0x1e4e, - 0x1e4e, 0x1e66, 0x1e87, 0x1e9f, 0x1e9f, 0x1e9f, 0x1eb4, 0x1ed9, - // Entry 1C0 - 1FF - 0x1ee5, 0x1ee5, 0x1ee5, 0x1f00, 0x1f00, 0x1f00, 0x1f00, 0x1f00, - 0x1f1e, 0x1f1e, 0x1f36, 0x1f54, 0x1f66, 0x1f66, 0x1fa9, 0x1fa9, - 0x1fa9, 0x1fd1, 0x1fd1, 0x1fd1, 0x1fd1, 0x1fd1, 0x1fd1, 0x1fe6, - 0x1fe6, 0x2001, 0x2001, 0x2001, 0x2019, 0x203a, 0x203a, 0x203a, - 0x204f, 0x204f, 0x204f, 0x204f, 0x204f, 0x207f, 0x208e, 0x20a3, - 0x20ac, 0x20ac, 0x20c1, 0x20c1, 0x20d6, 0x20d6, 0x20f7, 0x2106, - 0x2118, 0x212d, 0x212d, 0x212d, 0x212d, 0x2139, 0x2139, 0x2139, - 0x216a, 0x2198, 0x2198, 0x21b9, 0x21c8, 0x21c8, 0x21c8, 0x21c8, - // Entry 200 - 23F - 0x21c8, 0x21e4, 0x21fd, 0x221c, 0x2241, 0x225c, 0x225c, 0x2284, - 0x2284, 0x2293, 0x2293, 0x22a5, 0x22a5, 0x22a5, 0x22cc, 0x22cc, - 0x22e7, 0x22e7, 0x22e7, 0x22fc, 0x230b, 0x230b, 0x231d, 0x232c, - 0x232c, 0x232c, 0x232c, 0x2344, 0x2344, 0x2344, 0x2344, 0x2344, - 0x2366, 0x2366, 0x237b, 0x237b, 0x237b, 0x237b, 0x2390, 0x23a2, - 0x23ba, 0x23c9, 0x2409, 0x241e, 0x241e, 0x2433, 0x2454, 0x2463, - 0x2463, 0x2463, 0x2463, 0x2463, 0x2463, 0x2463, 0x247b, 0x2490, - 0x24a8, 0x24b7, 0x24b7, 0x24d2, 0x24d2, 0x24ed, 0x24ed, 0x24fc, - // Entry 240 - 27F - 0x24fc, 0x24fc, 0x2511, 0x2520, 0x2520, 0x2535, 0x2535, 0x2535, - 0x2535, 0x2535, 0x2566, 0x2572, 0x25d1, 0x25dd, 0x25dd, 0x25dd, - 0x260b, 0x263c, 0x2673, 0x269e, 0x26d2, 0x2706, 0x2706, 0x2727, - 0x2727, 0x2727, 0x274c, 0x276e, 0x279b, 0x27b6, 0x27e1, 0x2809, - 0x2827, 0x2827, 0x2852, -} // Size: 1246 bytes - -const neLangStr string = "" + // Size: 13512 bytes - "अफारअब्खाजियालीअवेस्तानअफ्रिकान्सआकानअम्हारिकअरागोनीअरबीआसामीअवारिकऐमारा" + - "अजरबैजानीबास्किरबेलारुसीबुल्गेरियालीबिस्लामबाम्बाराबंगालीतिब्बतीब्रेटन" + - "बोस्नियालीक्याटालनचेचेनचामोर्रोकोर्सिकनक्रीचेकचर्च स्लाभिकचुभासवेल्शडे" + - "निसजर्मनदिबेहीजोङ्खाइवीग्रीकअङ्ग्रेजीएस्पेरान्तोस्पेनीइस्टोनियालीबास्क" + - "फारसीफुलाहफिनिसफिजियालीफारोजफ्रान्सेलीफ्रिजियनआयरिसस्कटिस गाएलिकगलिसिय" + - "ालीगुवारानीगुजरातीमान्क्सहाउसाहिब्रुहिन्दीहिरी मोटुक्रोयसियालीहैटियाली" + - " क्रियोलहङ्गेरियालीआर्मेनियालीहेरेरोइन्टर्लिङ्गुआइन्डोनेसियालीइन्टरलिङ्ग" + - "्वेइग्बोसिचुआन यिइनुपिआक्इडोआइसल्यान्डियालीइटालेलीइनुक्टिटुटजापानीजाभा" + - "नीजर्जियालीकोङ्गोकिकुयुकुआन्यामाकाजाखकालालिसुटखमेरकन्नाडाकोरियालीकानुर" + - "ीकास्मिरीकुर्दीकोमीकोर्निसकिर्गिजल्याटिनलक्जेम्बर्गीगान्डालिम्बुर्गीलि" + - "ङ्गालालाओलिथुआनियालीलुबा-काताङ्गालात्भियालीमलागासीमार्सालीमाओरीम्यासेड" + - "ोनियालीमलयालममङ्गोलियालीमराठीमलायमाल्टिजबर्मेलीनाउरूउत्तरी न्डेबेलेनेप" + - "ालीन्दोन्गाडचनर्वेली नाइनोर्स्कनर्वेली बोकमालदक्षिण न्देबेलेनाभाजोन्या" + - "न्जाअक्सिटनओजिब्वाओरोमोउडियाअोस्सेटिकपंजाबीपालीपोलिसपास्तोपोर्तुगीक्वे" + - "चुवारोमानिसरुन्डीरोमानियालीरसियालीकिन्यारवान्डासंस्कृतसार्डिनियालीसिन्" + - "धीउत्तरी सामीसाङ्गोसिन्हालीस्लोभाकियालीस्लोभेनियालीसामोआशोनासोमालीअल्ब" + - "ानियालीसर्बियालीस्वातीदक्षिणी सोथोसुडानीस्विडिसस्वाहिलीतामिलतेलुगुताजि" + - "कथाईटिग्रिन्याटर्कमेनट्स्वानाटोङ्गनटर्किशट्सोङ्गातातारटाहिटियनउइघुरयुक" + - "्रेनीउर्दुउज्बेकीभेन्डाभियतनामीभोलापिकवाल्लुनवुलुफखोसायिद्दिसयोरूवाचिन" + - "ियाँजुलुअचाइनिजअकोलीअदाङमेअदिघेअफ्रिहिलीआघेमअइनुअक्कादियालीअलाबामाअलेउ" + - "टघेग अल्बानियालीदक्षिणी आल्टाइपुरातन अङ्ग्रेजीअङ्गिकाअरामाइकमापुचेअराओ" + - "नाअरापाहोअल्जेरियाली अरबीअरावाकमोरोक्कोली अरबीइजिप्ट अरबीआसुअमेरिकी सा" + - "ङ्केतिक भाषाअस्टुरियालीकोटावाअवधीबालुचीबालीबाभारियालीबासाबामुनबाताक तो" + - "बाघोमालाबेजाबेम्बाबेटावीबेनाबाफुटबडागापश्चिम बालोचीभोजपुरीबिकोलबिनीबन्" + - "जारकोमसिक्सिकाविष्णुप्रियाबाख्तिआरीब्रजब्राहुइबोडोअकुजबुरिआतबुगिनियाली" + - "बुलुब्लिनमेडुम्बाकाड्डोक्यारिबकायुगाअट्सामसेबुआनोचिगाचिब्चाचागाटाईचुके" + - "सेमारीचिनुक जार्गनचोक्टावचिपेव्यानचेरोकीचेयेन्नेकेन्द्रीय कुर्दीकोप्टि" + - "ककापिज्नोनक्रिमियाली तुर्कसेसेल्वा क्रिओल फ्रान्सेलीकासुवियनडाकोटादार्" + - "ग्वाताइतादेलावरदोग्रिबदिन्काजर्माडोगरीतल्लो सोर्बियनकेन्द्रीय दुसुनदुव" + - "ालामध्य डचजोला-फोनिलद्युलादाजागाएम्बुएफिकएमिलियालीपुरातन इजिप्टीएकाजुक" + - "एलामाइटमध्य अङ्ग्रेजीकेन्द्रीय युपिकइवोन्डोएक्सट्रेमादुरालीफाङफिलिपिनी" + - "फोनकाहुन फ्रान्सेलीमध्य फ्रान्सेलीपुरातन फ्रान्सेलीअर्पितानउत्तरी फ्रि" + - "जीपूर्वी फ्रिसियालीफ्रिउलियालीगागगाउजगान चिनियाँगायोग्बायागिजगिल्बर्टी" + - "गिलाकीमध्य उच्च जर्मनपुरातन उच्च जर्मनगोवा कोन्कानीगोन्डीगोरोन्टालोगोथ" + - "िकग्रेबोपुरातन ग्रिकस्वीस जर्मनफ्राफ्रागुसीगुइचिनहाइदाहक्का चिनियाँहवा" + - "इयनफिजी हिन्दीहिलिगायनोनहिट्टिटेहमोङमाथिल्लो सोर्बियनहुपाइबानइबिबियोइय" + - "ोकोइन्गसइन्ग्रियालीजमैकाली क्रेओले अङ्ग्रेजीलोज्बानन्गोम्बामाचामेजुडिय" + - "ो-फारसीजुडियो-अरबीजुटिसकारा-काल्पाककाबिलकाचिनज्जुकाम्बाकावीकाबार्दियाल" + - "ीकानेम्बुटुआपमाकोन्डेकाबुभेर्डियानुकेनयाङकोरोकाइनगाङखासीखोटानीकोयरा चि" + - "नीखोवारकिर्मान्जकीकाकोकालेन्जिनकिम्बुन्डुकोमी-पर्म्याककोन्कानीकोस्राली" + - "क्पेल्लेकाराचाय-बाल्करक्रिओकिनाराय-एकारेलियालीकुरुखशाम्बालाबाफियाकोलोग" + - "्नियालीकुमिककुतेनाइलाडिनोलाङ्गीलाहन्डालाम्बालाज्घियालीलिङ्गुवा फ्राङ्क" + - "ा नोभालिगुरियालीलिभोनियालीलाकोतालोम्बार्डमोङ्गोलोजीउत्तरी लुरीलाट्गाली" + - "लुबा-लुलुआलुइसेनोलुन्डालुओमिजोलुइयासाहित्यिक चिनियाँलाजमादुरेसेमाफामगध" + - "ीमैथिलीमाकासारमान्दिङोमसाईमाबामोक्षमन्दरमेन्डेमेरूमोरिसेनमध्य आयरिसमाख" + - "ुवा-मिट्टोमेटामिकमाकमिनाङकाबाउमान्चुमनिपुरीमोहकमोस्सीमुन्डाङबहुभाषाक्र" + - "िकमिरान्डीमाडवारीमेन्टावाईम्येनेइर्ज्यामजानडेरानीमिन नान चिनियाँनेपोलि" + - "टाननामातल्लो जर्मननेवारीनियासनिउएनअओ नागाक्वासियोन्गिएम्बुननोगाइपुरानो" + - " नोर्सेनोभियलनकोउत्तरी सोथोनुएरपरम्परागत नेवारीन्यामवेजीन्यान्कोलन्योरोन" + - "जिमाओसागेअटोमन तुर्कीपाङ्गासिनानपाहलावीपामपाङ्गापापियामेन्तोपालाउवालीप" + - "िकार्डनाइजेरियाली पिड्जिनपेन्सिलभानियाली जर्मनपुरातन फारसीपालाटिन जर्म" + - "नफोनिसियालीपिएडमोन्तेसेपोन्टिकप्रसियालीपुरातन प्रोभेन्कालकिचेचिम्बोराज" + - "ो उच्चस्थान किचुआराजस्थानीरापानुईरारोटोङ्गानरोम्बोअरोमानीयालीर्\u200cव" + - "ासान्डेअसाखासाम्बुरूसान्तालीन्गामबायसाङ्गुसिसिलियालीस्कट्सदक्षिणी कुर्" + - "दिशसेनाकोयराबोरो सेन्नीपुरातन आयरीसटाचेल्हिटशानचाड अरबीतल्लो सिलेसियाल" + - "ीदक्षिणी सामीलुले सामीइनारी सामीस्कोइट सामीसोनिन्केस्रानान टोङ्गोसाहोस" + - "ुकुमासुसूसुमेरियालीकोमोरीपरम्परागत सिरियाकसिरियाकटिम्नेटेसोटेटुमटिग्रे" + - "क्लिङ्गनन्यास टोङ्गाटोक पिसिनटारोकोमुस्लिम टाटटुम्बुकाटुभालुतासावाकटुभ" + - "िनियालीकेन्द्रीय एट्लास टामाजिघटउड्मुर्टउम्बुन्डीrootभाइमुख्य-फ्राङ्को" + - "नियालीभुन्जोवाल्सरवोलेट्टावारेवार्ल्पिरीकाल्मिकमिनग्रेलियालीसोगायाङ्बे" + - "नयेम्बान्हिनगातुकान्टोनियालीब्लिससिम्बोल्समानक मोरोक्कोन तामाजिघटजुनीभ" + - "ाषिक सामग्री छैनजाजाआधुनिक मानक अरबीअस्ट्रियाली जर्मनस्वीस हाई जर्मनअस" + - "्ट्रेलियाली अङ्ग्रेजीक्यानाडेली अङ्ग्रेजीबेलायती अङ्ग्रेजीअमेरिकी अङ्ग" + - "्रेजील्याटिन अमेरिकी स्पेनीयुरोपेली स्पेनीमेक्सिकन स्पेनीक्यानेडाली फ्" + - "रान्सेलीतल्लो साक्सनफ्लेमिसब्राजिली पोर्तुगीयुरोपेली पोर्तुगीकङ्गो स्व" + - "ाहिलीसरलिकृत चिनियाँपरम्परागत चिनियाँ" - -var neLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x002d, 0x0045, 0x0063, 0x006f, 0x0087, 0x009c, - 0x00a8, 0x00b7, 0x00c9, 0x00d8, 0x00f3, 0x0108, 0x0120, 0x0144, - 0x0159, 0x0171, 0x0183, 0x0198, 0x01aa, 0x01c8, 0x01e0, 0x01ef, - 0x0207, 0x021f, 0x022b, 0x0234, 0x0256, 0x0265, 0x0274, 0x0283, - 0x0292, 0x02a4, 0x02b6, 0x02bf, 0x02ce, 0x02e9, 0x030a, 0x031c, - 0x033d, 0x034c, 0x035b, 0x036a, 0x0379, 0x0391, 0x03a0, 0x03be, - 0x03d6, 0x03e5, 0x040a, 0x0425, 0x043d, 0x0452, 0x0467, 0x0476, - 0x0488, 0x049a, 0x04b3, 0x04d4, 0x0502, 0x0523, 0x0544, 0x0556, - // Entry 40 - 7F - 0x057d, 0x05a4, 0x05cb, 0x05da, 0x05f3, 0x060b, 0x0614, 0x0641, - 0x0656, 0x0674, 0x0686, 0x0698, 0x06b3, 0x06c5, 0x06d7, 0x06f2, - 0x0701, 0x071c, 0x0728, 0x073d, 0x0755, 0x0767, 0x077f, 0x0791, - 0x079d, 0x07b2, 0x07c7, 0x07dc, 0x0800, 0x0812, 0x0830, 0x0848, - 0x0851, 0x0872, 0x0897, 0x08b5, 0x08ca, 0x08e2, 0x08f1, 0x091b, - 0x092d, 0x094e, 0x095d, 0x0969, 0x097e, 0x0993, 0x09a2, 0x09cd, - 0x09df, 0x09f7, 0x09fd, 0x0a31, 0x0a59, 0x0a84, 0x0a96, 0x0aae, - 0x0ac3, 0x0ad8, 0x0ae7, 0x0af6, 0x0b11, 0x0b23, 0x0b2f, 0x0b3e, - // Entry 80 - BF - 0x0b50, 0x0b68, 0x0b80, 0x0b95, 0x0ba7, 0x0bc5, 0x0bda, 0x0c01, - 0x0c16, 0x0c3a, 0x0c4c, 0x0c6b, 0x0c7d, 0x0c95, 0x0cb9, 0x0cdd, - 0x0cec, 0x0cf8, 0x0d0a, 0x0d2b, 0x0d46, 0x0d58, 0x0d7a, 0x0d8c, - 0x0da1, 0x0db9, 0x0dc8, 0x0dda, 0x0de9, 0x0df2, 0x0e10, 0x0e25, - 0x0e3d, 0x0e4f, 0x0e61, 0x0e79, 0x0e88, 0x0ea0, 0x0eaf, 0x0ec7, - 0x0ed6, 0x0eeb, 0x0efd, 0x0f15, 0x0f2a, 0x0f3f, 0x0f4e, 0x0f5a, - 0x0f6f, 0x0f81, 0x0f81, 0x0f96, 0x0fa2, 0x0fb7, 0x0fc6, 0x0fd8, - 0x0fe7, 0x0fe7, 0x1002, 0x100e, 0x101a, 0x103b, 0x1050, 0x105f, - // Entry C0 - FF - 0x108a, 0x10b2, 0x10e0, 0x10f5, 0x110a, 0x111c, 0x112e, 0x1143, - 0x1171, 0x1171, 0x1183, 0x11ae, 0x11cd, 0x11d6, 0x1214, 0x1235, - 0x1247, 0x1253, 0x1265, 0x1271, 0x128f, 0x129b, 0x12aa, 0x12c6, - 0x12d8, 0x12e4, 0x12f6, 0x1308, 0x1314, 0x1323, 0x1332, 0x1357, - 0x136c, 0x137b, 0x1387, 0x1399, 0x13a2, 0x13ba, 0x13de, 0x13f9, - 0x1405, 0x141a, 0x1426, 0x1432, 0x1444, 0x1462, 0x146e, 0x147d, - 0x1495, 0x14a7, 0x14bc, 0x14ce, 0x14e0, 0x14f5, 0x1501, 0x1513, - 0x1528, 0x153a, 0x1546, 0x1568, 0x157d, 0x1598, 0x15aa, 0x15c2, - // Entry 100 - 13F - 0x15f0, 0x1605, 0x1620, 0x164e, 0x1698, 0x16b0, 0x16c2, 0x16da, - 0x16e9, 0x16fb, 0x16fb, 0x1710, 0x1722, 0x1731, 0x1740, 0x1768, - 0x1793, 0x17a5, 0x17b8, 0x17d4, 0x17e6, 0x17f8, 0x1807, 0x1813, - 0x182e, 0x1856, 0x1868, 0x187d, 0x18a5, 0x18d0, 0x18e5, 0x1915, - 0x191e, 0x1936, 0x1936, 0x193f, 0x196d, 0x1998, 0x19c9, 0x19e1, - 0x1a06, 0x1a37, 0x1a58, 0x1a5e, 0x1a6d, 0x1a8c, 0x1a98, 0x1aaa, - 0x1aaa, 0x1ab3, 0x1ace, 0x1ae0, 0x1b09, 0x1b38, 0x1b5d, 0x1b6f, - 0x1b8d, 0x1b9c, 0x1bae, 0x1bd0, 0x1bef, 0x1bef, 0x1c07, 0x1c13, - // Entry 140 - 17F - 0x1c25, 0x1c34, 0x1c59, 0x1c6b, 0x1c8a, 0x1ca8, 0x1cc0, 0x1ccc, - 0x1cfd, 0x1cfd, 0x1d09, 0x1d15, 0x1d2a, 0x1d39, 0x1d48, 0x1d69, - 0x1db0, 0x1dc5, 0x1ddd, 0x1def, 0x1e11, 0x1e30, 0x1e3f, 0x1e61, - 0x1e70, 0x1e7f, 0x1e8b, 0x1e9d, 0x1ea9, 0x1ecd, 0x1ee5, 0x1ef1, - 0x1f09, 0x1f33, 0x1f45, 0x1f51, 0x1f66, 0x1f72, 0x1f84, 0x1fa0, - 0x1faf, 0x1fd0, 0x1fdc, 0x1ff7, 0x2015, 0x203a, 0x2052, 0x206a, - 0x2082, 0x20aa, 0x20b9, 0x20d2, 0x20f0, 0x20ff, 0x2117, 0x2129, - 0x214d, 0x215c, 0x2171, 0x2183, 0x2195, 0x21aa, 0x21bc, 0x21da, - // Entry 180 - 1BF - 0x2218, 0x2236, 0x2254, 0x2266, 0x2281, 0x2293, 0x229f, 0x22be, - 0x22d6, 0x22f2, 0x2307, 0x2319, 0x2322, 0x232e, 0x233d, 0x236e, - 0x2377, 0x238f, 0x239b, 0x23a7, 0x23b9, 0x23ce, 0x23e6, 0x23f2, - 0x23fe, 0x240d, 0x241c, 0x242e, 0x243a, 0x244f, 0x246b, 0x2490, - 0x249c, 0x24ae, 0x24cc, 0x24de, 0x24f3, 0x24ff, 0x2511, 0x2511, - 0x2526, 0x253b, 0x254a, 0x2562, 0x2577, 0x2592, 0x25a4, 0x25b9, - 0x25d7, 0x2600, 0x261b, 0x2627, 0x2646, 0x2658, 0x2667, 0x2676, - 0x2689, 0x26a1, 0x26bf, 0x26ce, 0x26f3, 0x2705, 0x270e, 0x272d, - // Entry 1C0 - 1FF - 0x2739, 0x2767, 0x2782, 0x279d, 0x27af, 0x27be, 0x27cd, 0x27ef, - 0x2810, 0x2825, 0x2840, 0x2864, 0x287f, 0x2894, 0x28cb, 0x2908, - 0x2908, 0x292a, 0x294f, 0x296d, 0x2991, 0x29a6, 0x29a6, 0x29c1, - 0x29f5, 0x2a01, 0x2a4b, 0x2a66, 0x2a7b, 0x2a9c, 0x2a9c, 0x2a9c, - 0x2aae, 0x2aae, 0x2aae, 0x2aae, 0x2aae, 0x2acf, 0x2ade, 0x2af3, - 0x2aff, 0x2aff, 0x2b17, 0x2b17, 0x2b2f, 0x2b2f, 0x2b47, 0x2b59, - 0x2b77, 0x2b89, 0x2b89, 0x2bb4, 0x2bb4, 0x2bc0, 0x2bc0, 0x2bc0, - 0x2bee, 0x2c10, 0x2c10, 0x2c2b, 0x2c34, 0x2c4a, 0x2c4a, 0x2c78, - // Entry 200 - 23F - 0x2c78, 0x2c9a, 0x2cb3, 0x2ccf, 0x2cee, 0x2d06, 0x2d06, 0x2d2e, - 0x2d2e, 0x2d3a, 0x2d3a, 0x2d4c, 0x2d58, 0x2d76, 0x2d88, 0x2db9, - 0x2dce, 0x2dce, 0x2dce, 0x2de0, 0x2dec, 0x2dec, 0x2dfb, 0x2e0d, - 0x2e0d, 0x2e0d, 0x2e0d, 0x2e25, 0x2e25, 0x2e25, 0x2e25, 0x2e47, - 0x2e60, 0x2e60, 0x2e72, 0x2e72, 0x2e72, 0x2e91, 0x2ea9, 0x2ebb, - 0x2ed0, 0x2eee, 0x2f35, 0x2f4d, 0x2f4d, 0x2f68, 0x2f6c, 0x2f75, - 0x2f75, 0x2f75, 0x2f75, 0x2faf, 0x2faf, 0x2faf, 0x2fc1, 0x2fd3, - 0x2feb, 0x2ff7, 0x2ff7, 0x3015, 0x3015, 0x302a, 0x3051, 0x305d, - // Entry 240 - 27F - 0x305d, 0x305d, 0x3072, 0x3084, 0x309f, 0x30c3, 0x30c3, 0x30ed, - 0x30ed, 0x30ed, 0x312e, 0x313a, 0x3169, 0x3175, 0x31a1, 0x31a1, - 0x31d2, 0x31fb, 0x323e, 0x3278, 0x32a9, 0x32da, 0x3318, 0x3343, - 0x336e, 0x336e, 0x33ab, 0x33ab, 0x33cd, 0x33e2, 0x3413, 0x3444, - 0x3444, 0x3444, 0x346c, 0x3497, 0x34c8, -} // Size: 1250 bytes - -const nlLangStr string = "" + // Size: 4728 bytes - "AfarAbchazischAvestischAfrikaansAkanAmhaarsAragoneesArabischAssameesAvar" + - "ischAymaraAzerbeidzjaansBasjkiersWit-RussischBulgaarsBislamaBambaraBenga" + - "alsTibetaansBretonsBosnischCatalaansTsjetsjeensChamorroCorsicaansCreeTsj" + - "echischKerkslavischTsjoevasjischWelshDeensDuitsDivehiDzongkhaEweGrieksEn" + - "gelsEsperantoSpaansEstischBaskischPerzischFulahFinsFijischFaeröersFransF" + - "riesIersSchots-GaelischGalicischGuaraníGujaratiManxHausaHebreeuwsHindiHi" + - "ri MotuKroatischHaïtiaans CreoolsHongaarsArmeensHereroInterlinguaIndones" + - "ischInterlingueIgboYiInupiaqIdoIJslandsItaliaansInuktitutJapansJavaansGe" + - "orgischKongoGikuyuKuanyamaKazachsGroenlandsKhmerKannadaKoreaansKanuriKas" + - "jmiriKoerdischKomiCornishKirgizischLatijnLuxemburgsLugandaLimburgsLingal" + - "aLaotiaansLitouwsLuba-KatangaLetsMalagassischMarshalleesMaoriMacedonisch" + - "MalayalamMongoolsMarathiMaleisMalteesBirmaansNauruaansNoord-NdebeleNepal" + - "eesNdongaNederlandsNoors - NynorskNoors - BokmålZuid-NdbeleNavajoNyanjaO" + - "ccitaansOjibwaAfaan OromoOdiaOssetischPunjabiPaliPoolsPasjtoePortugeesQu" + - "echuaReto-RomaansKirundiRoemeensRussischKinyarwandaSanskrietSardijnsSind" + - "hiNoord-SamischSangoSingaleesSlowaaksSloveensSamoaansShonaSomalischAlban" + - "eesServischSwaziZuid-SothoSoendaneesZweedsSwahiliTamilTeluguTadzjieksTha" + - "iTigrinyaTurkmeensTswanaTongaansTurksTsongaTataarsTahitiaansOeigoersOekr" + - "aïensUrduOezbeeksVendaVietnameesVolapükWaalsWolofXhosaJiddischYorubaZhua" + - "ngChineesZoeloeAtjehsAkoliAdangmeAdygeesTunesisch ArabischAfrihiliAghemA" + - "inuAkkadischAlabamaAleoetischGegischZuid-AltaïschOudengelsAngikaArameesM" + - "apudungunAraonaArapahoAlgerijns ArabischArawakMarokkaans ArabischEgyptis" + - "ch ArabischAsuAmerikaanse GebarentaalAsturischKotavaAwadhiBeloetsjiBalin" + - "eesBeiersBasaBamounBatak TobaGhomala’BejaBembaBetawiBenaBafutBadagaWeste" + - "rs BeloetsjiBhojpuriBikolBiniBanjarKomSiksikaBishnupriyaBakhtiariBrajBra" + - "huiBodoAkooseBoerjatischBugineesBuluBlinMedumbaCaddoCaribischCayugaAtsam" + - "CebuanoChigaChibchaChagataiChuukeesMariChinook JargonChoctawChipewyanChe" + - "rokeeCheyenneSoranîKoptischCapiznonKrim-TataarsSeychellencreoolsKasjoebi" + - "schDakotaDargwaTaitaDelawareSlaveyDogribDinkaZarmaDogriNedersorbischDusu" + - "nDualaMiddelnederlandsJola-FonyiDyulaDazagaEmbuEfikEmilianoOudegyptischE" + - "kajukElamitischMiddelengelsYupikEwondoExtremeensFangFilipijnsTornedal-Fi" + - "nsFonCajun-FransMiddelfransOudfransArpitaansNoord-FriesOost-FriesFriulis" + - "chGaGagaoezischGanyuGayoGbayaZoroastrisch DariGe’ezGilberteesGilakiMidde" + - "lhoogduitsOudhoogduitsGoa KonkaniGondiGorontaloGothischGreboOudgrieksZwi" + - "tserduitsWayuuGuruneGusiiGwichʼinHaidaHakkaHawaïaansFijisch HindiHiligay" + - "nonHettitischHmongOppersorbischXiangyuHupaIbanIbibioIlokoIngoesjetischIn" + - "grischJamaicaans CreoolsLojbanNgombaMachameJudeo-PerzischJudeo-ArabischJ" + - "utlandsKarakalpaksKabylischKachinJjuKambaKawiKabardischKanembuTyapMakond" + - "eKaapverdisch CreoolsKenyangKoroKaingangKhasiKhotaneesKoyra ChiiniKhowar" + - "KirmanckîKakoKalenjinKimbunduKomi-PermjaaksKonkaniKosraeaansKpelleKarats" + - "jaj-BalkarischKrioKinaray-aKarelischKurukhShambalaBafiaKölschKoemuksKute" + - "naiLadinoLangiLahndaLambaLezgischLingua Franca NovaLigurischLijfsLakotaL" + - "ombardischMongoLoziNoordelijk LuriLetgaalsLuba-LuluaLuisenoLundaLuoMizoL" + - "uyiaKlassiek ChineesLazischMadoereesMafaMagahiMaithiliMakassaarsMandingo" + - "MaaMabaMoksjaMandarMendeMeruMorisyenMiddeliersMakhuwa-MeettoMeta’Mi’kmaq" + - "MinangkabauMantsjoeMeiteiMohawkMossiWest-MariMundangMeerdere talenCreekM" + - "irandeesMarwariMentawaiMyeneErzjaMazanderaniMinnanyuNapolitaansNamaNeder" + - "saksischNewariNiasNiueaansAo NagaNgumbaNgiemboonNogaiOudnoorsNovialN’KoN" + - "oord-SothoNuerKlassiek NepalbhasaNyamweziNyankoleNyoroNzimaOsageOttomaan" + - "s-TurksPangasinanPahlaviPampangaPapiamentsPalausPicardischNigeriaans Pid" + - "ginPennsylvania-DuitsPlautdietschOudperzischPaltsischFoenicischPiëmontee" + - "sPontischPohnpeiaansOudpruisischOudprovençaalsK’iche’KichwaRajasthaniRap" + - "anuiRarotonganRomagnolRiffijnsRomboRomaniRotumaansRoetheensRovianaAroeme" + - "ensRwaSandaweJakoetsSamaritaans-ArameesSamburuSasakSantaliSaurashtraNgam" + - "baySanguSiciliaansSchotsSassareesPahlavaniSenecaSenaSeriSelkoepsKoyrabor" + - "o SenniOudiersSamogitischTashelhiytShanTsjadisch ArabischSidamoSilezisch" + - " DuitsSelayarZuid-SamischLule-SamischInari-SamischSkolt-SamischSoninkeSo" + - "gdischSranantongoSererSahoSaterfriesSukumaSoesoeSoemerischShimaoreKlassi" + - "ek SyrischSyrischSilezischTuluTimneTesoTerenoTetunTigreTivTokelausTsakhu" + - "rKlingonTlingitTalyshTamashekNyasa TongaTok PisinTuroyoTarokoTsakonischT" + - "simshianMoslim TatToemboekaTuvaluaansTasawaqToevaansTamazight (Centraal-" + - "Marokko)OedmoertsOegaritischUmbunduRootVaiVenetiaansWepsischWest-VlaamsO" + - "pperfrankischVotischVõroVunjoWalserWolayttaWarayWashoWarlpiriWuyuKalmuks" + - "MingreelsSogaYaoYapeesYangbenYembaNheengatuKantoneesZapotecBlissymbolenZ" + - "eeuwsZenagaStandaard Marokkaanse TamazightZunigeen linguïstische inhoudZ" + - "azaServo-Kroatisch" - -var nlLangIdx = []uint16{ // 610 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000e, 0x0017, 0x0020, 0x0024, 0x002b, 0x0034, - 0x003c, 0x0044, 0x004c, 0x0052, 0x0060, 0x0069, 0x0075, 0x007d, - 0x0084, 0x008b, 0x0093, 0x009c, 0x00a3, 0x00ab, 0x00b4, 0x00bf, - 0x00c7, 0x00d1, 0x00d5, 0x00df, 0x00eb, 0x00f8, 0x00fd, 0x0102, - 0x0107, 0x010d, 0x0115, 0x0118, 0x011e, 0x0124, 0x012d, 0x0133, - 0x013a, 0x0142, 0x014a, 0x014f, 0x0153, 0x015a, 0x0163, 0x0168, - 0x016d, 0x0171, 0x0180, 0x0189, 0x0191, 0x0199, 0x019d, 0x01a2, - 0x01ab, 0x01b0, 0x01b9, 0x01c2, 0x01d4, 0x01dc, 0x01e3, 0x01e9, - // Entry 40 - 7F - 0x01f4, 0x01ff, 0x020a, 0x020e, 0x0210, 0x0217, 0x021a, 0x0222, - 0x022b, 0x0234, 0x023a, 0x0241, 0x024a, 0x024f, 0x0255, 0x025d, - 0x0264, 0x026e, 0x0273, 0x027a, 0x0282, 0x0288, 0x0290, 0x0299, - 0x029d, 0x02a4, 0x02ae, 0x02b4, 0x02be, 0x02c5, 0x02cd, 0x02d4, - 0x02dd, 0x02e4, 0x02f0, 0x02f4, 0x0300, 0x030b, 0x0310, 0x031b, - 0x0324, 0x032c, 0x0333, 0x0339, 0x0340, 0x0348, 0x0351, 0x035e, - 0x0366, 0x036c, 0x0376, 0x0385, 0x0394, 0x039f, 0x03a5, 0x03ab, - 0x03b4, 0x03ba, 0x03c5, 0x03c9, 0x03d2, 0x03d9, 0x03dd, 0x03e2, - // Entry 80 - BF - 0x03e9, 0x03f2, 0x03f9, 0x0405, 0x040c, 0x0414, 0x041c, 0x0427, - 0x0430, 0x0438, 0x043e, 0x044b, 0x0450, 0x0459, 0x0461, 0x0469, - 0x0471, 0x0476, 0x047f, 0x0487, 0x048f, 0x0494, 0x049e, 0x04a8, - 0x04ae, 0x04b5, 0x04ba, 0x04c0, 0x04c9, 0x04cd, 0x04d5, 0x04de, - 0x04e4, 0x04ec, 0x04f1, 0x04f7, 0x04fe, 0x0508, 0x0510, 0x051a, - 0x051e, 0x0526, 0x052b, 0x0535, 0x053d, 0x0542, 0x0547, 0x054c, - 0x0554, 0x055a, 0x0560, 0x0567, 0x056d, 0x0573, 0x0578, 0x057f, - 0x0586, 0x0598, 0x05a0, 0x05a5, 0x05a9, 0x05b2, 0x05b9, 0x05c3, - // Entry C0 - FF - 0x05ca, 0x05d8, 0x05e1, 0x05e7, 0x05ee, 0x05f8, 0x05fe, 0x0605, - 0x0617, 0x0617, 0x061d, 0x0630, 0x0642, 0x0645, 0x065c, 0x0665, - 0x066b, 0x0671, 0x067a, 0x0682, 0x0688, 0x068c, 0x0692, 0x069c, - 0x06a6, 0x06aa, 0x06af, 0x06b5, 0x06b9, 0x06be, 0x06c4, 0x06d5, - 0x06dd, 0x06e2, 0x06e6, 0x06ec, 0x06ef, 0x06f6, 0x0701, 0x070a, - 0x070e, 0x0714, 0x0718, 0x071e, 0x0729, 0x0731, 0x0735, 0x0739, - 0x0740, 0x0745, 0x074e, 0x0754, 0x0759, 0x0760, 0x0765, 0x076c, - 0x0774, 0x077c, 0x0780, 0x078e, 0x0795, 0x079e, 0x07a6, 0x07ae, - // Entry 100 - 13F - 0x07b5, 0x07bd, 0x07c5, 0x07d1, 0x07e2, 0x07ed, 0x07f3, 0x07f9, - 0x07fe, 0x0806, 0x080c, 0x0812, 0x0817, 0x081c, 0x0821, 0x082e, - 0x0833, 0x0838, 0x0848, 0x0852, 0x0857, 0x085d, 0x0861, 0x0865, - 0x086d, 0x0879, 0x087f, 0x0889, 0x0895, 0x089a, 0x08a0, 0x08aa, - 0x08ae, 0x08b7, 0x08c4, 0x08c7, 0x08d2, 0x08dd, 0x08e5, 0x08ee, - 0x08f9, 0x0903, 0x090c, 0x090e, 0x0919, 0x091e, 0x0922, 0x0927, - 0x0938, 0x093f, 0x0949, 0x094f, 0x095e, 0x096a, 0x0975, 0x097a, - 0x0983, 0x098b, 0x0990, 0x0999, 0x09a5, 0x09aa, 0x09b0, 0x09b5, - // Entry 140 - 17F - 0x09be, 0x09c3, 0x09c8, 0x09d2, 0x09df, 0x09e9, 0x09f3, 0x09f8, - 0x0a05, 0x0a0c, 0x0a10, 0x0a14, 0x0a1a, 0x0a1f, 0x0a2c, 0x0a34, - 0x0a46, 0x0a4c, 0x0a52, 0x0a59, 0x0a67, 0x0a75, 0x0a7d, 0x0a88, - 0x0a91, 0x0a97, 0x0a9a, 0x0a9f, 0x0aa3, 0x0aad, 0x0ab4, 0x0ab8, - 0x0abf, 0x0ad3, 0x0ada, 0x0ade, 0x0ae6, 0x0aeb, 0x0af4, 0x0b00, - 0x0b06, 0x0b10, 0x0b14, 0x0b1c, 0x0b24, 0x0b32, 0x0b39, 0x0b43, - 0x0b49, 0x0b5d, 0x0b61, 0x0b6a, 0x0b73, 0x0b79, 0x0b81, 0x0b86, - 0x0b8d, 0x0b94, 0x0b9b, 0x0ba1, 0x0ba6, 0x0bac, 0x0bb1, 0x0bb9, - // Entry 180 - 1BF - 0x0bcb, 0x0bd4, 0x0bd9, 0x0bdf, 0x0bea, 0x0bef, 0x0bf3, 0x0c02, - 0x0c0a, 0x0c14, 0x0c1b, 0x0c20, 0x0c23, 0x0c27, 0x0c2c, 0x0c3c, - 0x0c43, 0x0c4c, 0x0c50, 0x0c56, 0x0c5e, 0x0c68, 0x0c70, 0x0c73, - 0x0c77, 0x0c7d, 0x0c83, 0x0c88, 0x0c8c, 0x0c94, 0x0c9e, 0x0cac, - 0x0cb3, 0x0cbc, 0x0cc7, 0x0ccf, 0x0cd5, 0x0cdb, 0x0ce0, 0x0ce9, - 0x0cf0, 0x0cfe, 0x0d03, 0x0d0c, 0x0d13, 0x0d1b, 0x0d20, 0x0d25, - 0x0d30, 0x0d38, 0x0d43, 0x0d47, 0x0d54, 0x0d5a, 0x0d5e, 0x0d66, - 0x0d6d, 0x0d73, 0x0d7c, 0x0d81, 0x0d89, 0x0d8f, 0x0d95, 0x0da0, - // Entry 1C0 - 1FF - 0x0da4, 0x0db7, 0x0dbf, 0x0dc7, 0x0dcc, 0x0dd1, 0x0dd6, 0x0de5, - 0x0def, 0x0df6, 0x0dfe, 0x0e08, 0x0e0e, 0x0e18, 0x0e29, 0x0e3b, - 0x0e47, 0x0e52, 0x0e5b, 0x0e65, 0x0e70, 0x0e78, 0x0e83, 0x0e8f, - 0x0e9e, 0x0ea9, 0x0eaf, 0x0eb9, 0x0ec0, 0x0eca, 0x0ed2, 0x0eda, - 0x0edf, 0x0ee5, 0x0eee, 0x0ef7, 0x0efe, 0x0f07, 0x0f0a, 0x0f11, - 0x0f18, 0x0f2b, 0x0f32, 0x0f37, 0x0f3e, 0x0f48, 0x0f4f, 0x0f54, - 0x0f5e, 0x0f64, 0x0f6d, 0x0f76, 0x0f7c, 0x0f80, 0x0f84, 0x0f8c, - 0x0f9b, 0x0fa2, 0x0fad, 0x0fb7, 0x0fbb, 0x0fcd, 0x0fd3, 0x0fe2, - // Entry 200 - 23F - 0x0fe9, 0x0ff5, 0x1001, 0x100e, 0x101b, 0x1022, 0x102a, 0x1035, - 0x103a, 0x103e, 0x1048, 0x104e, 0x1054, 0x105e, 0x1066, 0x1076, - 0x107d, 0x1086, 0x108a, 0x108f, 0x1093, 0x1099, 0x109e, 0x10a3, - 0x10a6, 0x10ae, 0x10b5, 0x10bc, 0x10c3, 0x10c9, 0x10d1, 0x10dc, - 0x10e5, 0x10eb, 0x10f1, 0x10fb, 0x1104, 0x110e, 0x1117, 0x1121, - 0x1128, 0x1130, 0x114c, 0x1155, 0x1160, 0x1167, 0x116b, 0x116e, - 0x1178, 0x1180, 0x118b, 0x1199, 0x11a0, 0x11a5, 0x11aa, 0x11b0, - 0x11b8, 0x11bd, 0x11c2, 0x11ca, 0x11ce, 0x11d5, 0x11de, 0x11e2, - // Entry 240 - 27F - 0x11e5, 0x11eb, 0x11f2, 0x11f7, 0x1200, 0x1209, 0x1210, 0x121c, - 0x1222, 0x1228, 0x1247, 0x124b, 0x1265, 0x1269, 0x1269, 0x1269, - 0x1269, 0x1269, 0x1269, 0x1269, 0x1269, 0x1269, 0x1269, 0x1269, - 0x1269, 0x1269, 0x1269, 0x1269, 0x1269, 0x1269, 0x1269, 0x1269, - 0x1269, 0x1278, -} // Size: 1244 bytes - -const noLangStr string = "" + // Size: 4834 bytes - "afarabkhasiskavestiskafrikaansakanamhariskaragonskarabiskassamesiskavari" + - "skaymaraaserbajdsjanskbasjkirskhviterussiskbulgarskbislamabambarabengali" + - "tibetanskbretonskbosniskkatalansktsjetsjenskchamorrokorsikanskcreetsjekk" + - "iskkirkeslavisktsjuvasjiskwalisiskdansktyskdhivehidzongkhaewegreskengels" + - "kesperantospanskestiskbaskiskpersiskfulfuldefinskfijianskfærøyskfranskve" + - "stfrisiskirskskotsk-gæliskgalisiskguaranigujaratimanskhausahebraiskhindi" + - "hiri motukroatiskhaitiskungarskarmenskhererointerlinguaindonesiskinterli" + - "ngueibosichuan-yiinupiakidoislandskitalienskinuittiskjapanskjavanesiskge" + - "orgiskkikongokikuyukuanyamakasakhiskgrønlandskkhmerkannadakoreanskkanuri" + - "kasjmirikurdiskkomikorniskkirgisisklatinluxemburgskgandalimburgsklingala" + - "laotisklitauiskluba-katangalatviskgassiskmarshallesiskmaorimakedonskmala" + - "yalammongolskmarathimalayiskmaltesiskburmesisknaurunord-ndebelenepalindo" + - "nganederlandsknorsk nynorsknorsk bokmålsør-ndebelenavajonyanjaoksitansko" + - "jibwaoromooriyaossetiskpunjabipalipolskpashtoportugisiskquechuaretoroman" + - "skrundirumenskrussiskkinyarwandasanskritsardisksindhinordsamisksangosing" + - "alesiskslovakiskslovensksamoanskshonasomalialbanskserbiskswatisør-sothos" + - "undanesisksvenskswahilitamiltelugutadsjikiskthaitigrinjaturkmensksetswan" + - "atongansktyrkisktsongatatarisktahitiskuiguriskukrainskurduusbekiskvendav" + - "ietnamesiskvolapykvallonskwolofxhosajiddiskjorubazhuangkinesiskzuluachin" + - "esiskacoliadangmeadygeisktunisisk-arabiskafrihiliaghemainuakkadiskalabam" + - "aaleutiskgegisk-albansksøraltaiskgammelengelskangikaarameiskmapudungunar" + - "aonaarapahoalgerisk arabiskarawakmarokkansk-arabiskegyptisk arabiskasuam" + - "erikansk tegnspråkasturiskkotavaavadhibaluchibalinesiskbairiskbasaabamun" + - "batak tobaghomalabejabembabetawibenabafutbadagavestbalutsjibhojpuribikol" + - "binibanjarkomsiksikabishnupriyabakhtiaribrajbrahuibodoakoseburjatiskbugi" + - "nesiskbulublinmedumbacaddokaribiskcayugaatsamcebuanskkigachibchatsjagata" + - "ichuukesiskmarichinookchoctawchipewianskcherokesiskcheyennekurdisk (sora" + - "ni)koptiskkapizkrimtatariskseselwakasjubiskdakotadargwataitadelawareslav" + - "eydogribdinkazarmadogrilavsorbisksentraldusundualamellomnederlandskjola-" + - "fonyidyuladazagakiembuefikemilianskgammelegyptiskekajukelamittiskmellome" + - "ngelsksentralyupikewondoekstremaduranskfangfilipinotornedalsfinskfoncaju" + - "nfranskmellomfranskgammelfranskarpitansknordfrisiskøstfrisiskfriulianskg" + - "agagausiskgangayogbayazoroastrisk darigeezkiribatiskgilekimellomhøytyskg" + - "ammelhøytyskgoansk konkanigondigorontalogotiskgrebogammelgresksveitserty" + - "skwayuufrafragusiigwichinhaidahakkahawaiiskfijiansk hindihiligaynonhetti" + - "ttiskhmonghøysorbiskxianghupaibanibibioilokoingusjiskingriskjamaicansk k" + - "reolengelsklojbanngombamachamejødepersiskjødearabiskjyskkarakalpakiskkab" + - "ylskkachinjjukambakawikabardiskkanembutyapmakondekappverdiskkenyangkorok" + - "aingangkhasikhotanesiskkoyra chiinikhowarkirmanckikakokalenjinkimbunduko" + - "mipermjakiskkonkanikosraeanskkpellekaratsjajbalkarskkriokinaray-akarelsk" + - "kurukhshambalabafiakølnskkumykiskkutenailadinsklangilahndalambalesgiskli" + - "ngua franca novaligurisklivisklakotalombardiskmongolozinord-lurilatgalli" + - "skluba-lulualuisenolundaluomizoluhyaklassisk kinesisklaziskmaduresiskmaf" + - "amagahimaithilimakasarmandingomasaimabamoksjamandarmendemerumauritisk-kr" + - "eolskmellomirskmakhuwa-meettometa’micmacminangkabaumandsjumanipurimohawk" + - "mossivestmariskmundangflere språkcreekmirandesiskmarwarimentawaimyeneerz" + - "iamazandaraniminnannapolitansknamanedertysknewariniasniueanskao nagakwas" + - "iongiemboonnogaiskgammelnorsknovialnʼkonord-sothonuerklassisk newarinyam" + - "wezinyankolenyoronzimaosageottomansk tyrkiskpangasinanpahlavipampangapap" + - "iamentopalauiskpikardisknigeriansk pidginspråkpennsylvaniatyskplautdiets" + - "chgammelpersiskpalatintyskfønikiskpiemontesiskpontiskponapiskprøyssiskga" + - "mmelprovençalskquichékichwa (Chimborazo-høylandet)rajasthanirapanuirarot" + - "onganskromagnolskriffromboromanirotumanskrusinskrovianaaromanskrwasandaw" + - "ejakutisksamaritansk arameisksamburusasaksantalisaurashtrangambaysangusi" + - "cilianskskotsksassaresisk sardisksørkurdisksenecasenaseriselkupiskkoyrab" + - "oro sennigammelirsksamogitisktachelhitshantsjadisk arabisksidamolavschle" + - "siskselayarsørsamisklulesamiskenaresamiskskoltesamisksoninkesogdisksrana" + - "nserersahosaterfrisisksukumasususumeriskkomoriskklassisk syriskgammelsyr" + - "iskschlesisktulutemnetesoterenotetumtigrétivtokelauisktsakhurskklingontl" + - "ingittalysjtamasjeknyasa-tongansktok pisinturoyotarokotsakonisktsimshian" + - "muslimsk tattumbukatuvalsktasawaqtuvinsksentralmarokkansk tamazightudmur" + - "tiskugaritiskumbundurotvaivenetianskvepsiskvestflamskMain-frankiskvotisk" + - "sørestiskvunjowalsertyskwolayttawaray-waraywashowarlpiriwukalmukkiskming" + - "relsksogayaoyapesiskyangbenyembanheengatukantonesiskzapotekiskblissymbol" + - "erzeeuwszenagastandard marrokansk tamazightzuniuten språklig innholdzaza" + - "iskmoderne standardarabisknedersaksiskflamskmoldovskserbokroatiskkongole" + - "sisk swahiliforenklet kinesisktradisjonell kinesisk" - -var noLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000d, 0x0015, 0x001e, 0x0022, 0x002a, 0x0032, - 0x0039, 0x0043, 0x004a, 0x0050, 0x005e, 0x0067, 0x0073, 0x007b, - 0x0082, 0x0089, 0x0090, 0x0099, 0x00a1, 0x00a8, 0x00b1, 0x00bc, - 0x00c4, 0x00ce, 0x00d2, 0x00db, 0x00e7, 0x00f2, 0x00fa, 0x00ff, - 0x0103, 0x010a, 0x0112, 0x0115, 0x011a, 0x0121, 0x012a, 0x0130, - 0x0136, 0x013d, 0x0144, 0x014c, 0x0151, 0x0159, 0x0162, 0x0168, - 0x0173, 0x0177, 0x0185, 0x018d, 0x0194, 0x019c, 0x01a1, 0x01a6, - 0x01ae, 0x01b3, 0x01bc, 0x01c4, 0x01cb, 0x01d2, 0x01d9, 0x01df, - // Entry 40 - 7F - 0x01ea, 0x01f4, 0x01ff, 0x0202, 0x020c, 0x0213, 0x0216, 0x021e, - 0x0227, 0x0230, 0x0237, 0x0241, 0x0249, 0x0250, 0x0256, 0x025e, - 0x0267, 0x0272, 0x0277, 0x027e, 0x0286, 0x028c, 0x0294, 0x029b, - 0x029f, 0x02a6, 0x02af, 0x02b4, 0x02bf, 0x02c4, 0x02cd, 0x02d4, - 0x02db, 0x02e3, 0x02ef, 0x02f6, 0x02fd, 0x030a, 0x030f, 0x0318, - 0x0321, 0x0329, 0x0330, 0x0338, 0x0341, 0x034a, 0x034f, 0x035b, - 0x0361, 0x0367, 0x0372, 0x037f, 0x038c, 0x0398, 0x039e, 0x03a4, - 0x03ad, 0x03b3, 0x03b8, 0x03bd, 0x03c5, 0x03cc, 0x03d0, 0x03d5, - // Entry 80 - BF - 0x03db, 0x03e6, 0x03ed, 0x03f8, 0x03fd, 0x0404, 0x040b, 0x0416, - 0x041e, 0x0425, 0x042b, 0x0435, 0x043a, 0x0445, 0x044e, 0x0456, - 0x045e, 0x0463, 0x0469, 0x0470, 0x0477, 0x047c, 0x0486, 0x0491, - 0x0497, 0x049e, 0x04a3, 0x04a9, 0x04b3, 0x04b7, 0x04bf, 0x04c8, - 0x04d0, 0x04d8, 0x04df, 0x04e5, 0x04ed, 0x04f5, 0x04fd, 0x0505, - 0x0509, 0x0511, 0x0516, 0x0522, 0x0529, 0x0531, 0x0536, 0x053b, - 0x0542, 0x0548, 0x054e, 0x0556, 0x055a, 0x0564, 0x0569, 0x0570, - 0x0578, 0x0588, 0x0590, 0x0595, 0x0599, 0x05a1, 0x05a8, 0x05b0, - // Entry C0 - FF - 0x05be, 0x05c9, 0x05d6, 0x05dc, 0x05e4, 0x05ee, 0x05f4, 0x05fb, - 0x060b, 0x060b, 0x0611, 0x0623, 0x0633, 0x0636, 0x064b, 0x0653, - 0x0659, 0x065f, 0x0666, 0x0670, 0x0677, 0x067c, 0x0681, 0x068b, - 0x0692, 0x0696, 0x069b, 0x06a1, 0x06a5, 0x06aa, 0x06b0, 0x06bc, - 0x06c4, 0x06c9, 0x06cd, 0x06d3, 0x06d6, 0x06dd, 0x06e8, 0x06f1, - 0x06f5, 0x06fb, 0x06ff, 0x0704, 0x070d, 0x0717, 0x071b, 0x071f, - 0x0726, 0x072b, 0x0733, 0x0739, 0x073e, 0x0746, 0x074a, 0x0751, - 0x075a, 0x0764, 0x0768, 0x076f, 0x0776, 0x0781, 0x078c, 0x0794, - // Entry 100 - 13F - 0x07a4, 0x07ab, 0x07b0, 0x07bc, 0x07c3, 0x07cc, 0x07d2, 0x07d8, - 0x07dd, 0x07e5, 0x07eb, 0x07f1, 0x07f6, 0x07fb, 0x0800, 0x080a, - 0x0816, 0x081b, 0x082c, 0x0836, 0x083b, 0x0841, 0x0847, 0x084b, - 0x0854, 0x0862, 0x0868, 0x0872, 0x087f, 0x088b, 0x0891, 0x08a0, - 0x08a4, 0x08ac, 0x08ba, 0x08bd, 0x08c8, 0x08d4, 0x08e0, 0x08e9, - 0x08f4, 0x08ff, 0x0909, 0x090b, 0x0914, 0x0917, 0x091b, 0x0920, - 0x0930, 0x0934, 0x093e, 0x0944, 0x0952, 0x0960, 0x096e, 0x0973, - 0x097c, 0x0982, 0x0987, 0x0992, 0x099e, 0x09a3, 0x09a9, 0x09ae, - // Entry 140 - 17F - 0x09b5, 0x09ba, 0x09bf, 0x09c7, 0x09d5, 0x09df, 0x09e9, 0x09ee, - 0x09f9, 0x09fe, 0x0a02, 0x0a06, 0x0a0c, 0x0a11, 0x0a1a, 0x0a21, - 0x0a38, 0x0a3e, 0x0a44, 0x0a4b, 0x0a57, 0x0a63, 0x0a67, 0x0a74, - 0x0a7b, 0x0a81, 0x0a84, 0x0a89, 0x0a8d, 0x0a96, 0x0a9d, 0x0aa1, - 0x0aa8, 0x0ab3, 0x0aba, 0x0abe, 0x0ac6, 0x0acb, 0x0ad6, 0x0ae2, - 0x0ae8, 0x0af1, 0x0af5, 0x0afd, 0x0b05, 0x0b13, 0x0b1a, 0x0b24, - 0x0b2a, 0x0b3b, 0x0b3f, 0x0b48, 0x0b4f, 0x0b55, 0x0b5d, 0x0b62, - 0x0b69, 0x0b71, 0x0b78, 0x0b7f, 0x0b84, 0x0b8a, 0x0b8f, 0x0b96, - // Entry 180 - 1BF - 0x0ba8, 0x0bb0, 0x0bb6, 0x0bbc, 0x0bc6, 0x0bcb, 0x0bcf, 0x0bd8, - 0x0be2, 0x0bec, 0x0bf3, 0x0bf8, 0x0bfb, 0x0bff, 0x0c04, 0x0c15, - 0x0c1b, 0x0c25, 0x0c29, 0x0c2f, 0x0c37, 0x0c3e, 0x0c46, 0x0c4b, - 0x0c4f, 0x0c55, 0x0c5b, 0x0c60, 0x0c64, 0x0c75, 0x0c7f, 0x0c8d, - 0x0c94, 0x0c9a, 0x0ca5, 0x0cac, 0x0cb4, 0x0cba, 0x0cbf, 0x0cc9, - 0x0cd0, 0x0cdc, 0x0ce1, 0x0cec, 0x0cf3, 0x0cfb, 0x0d00, 0x0d05, - 0x0d10, 0x0d16, 0x0d21, 0x0d25, 0x0d2e, 0x0d34, 0x0d38, 0x0d40, - 0x0d47, 0x0d4d, 0x0d56, 0x0d5d, 0x0d68, 0x0d6e, 0x0d73, 0x0d7d, - // Entry 1C0 - 1FF - 0x0d81, 0x0d90, 0x0d98, 0x0da0, 0x0da5, 0x0daa, 0x0daf, 0x0dc0, - 0x0dca, 0x0dd1, 0x0dd9, 0x0de3, 0x0deb, 0x0df4, 0x0e0b, 0x0e1b, - 0x0e27, 0x0e34, 0x0e3f, 0x0e48, 0x0e54, 0x0e5b, 0x0e63, 0x0e6d, - 0x0e7f, 0x0e86, 0x0ea4, 0x0eae, 0x0eb5, 0x0ec1, 0x0ecb, 0x0ecf, - 0x0ed4, 0x0eda, 0x0ee3, 0x0eea, 0x0ef1, 0x0ef9, 0x0efc, 0x0f03, - 0x0f0b, 0x0f1f, 0x0f26, 0x0f2b, 0x0f32, 0x0f3c, 0x0f43, 0x0f48, - 0x0f52, 0x0f58, 0x0f6b, 0x0f76, 0x0f7c, 0x0f80, 0x0f84, 0x0f8d, - 0x0f9c, 0x0fa6, 0x0fb0, 0x0fb9, 0x0fbd, 0x0fcd, 0x0fd3, 0x0fdf, - // Entry 200 - 23F - 0x0fe6, 0x0ff0, 0x0ffa, 0x1005, 0x1011, 0x1018, 0x101f, 0x1025, - 0x102a, 0x102e, 0x103a, 0x1040, 0x1044, 0x104c, 0x1054, 0x1063, - 0x106f, 0x1078, 0x107c, 0x1081, 0x1085, 0x108b, 0x1090, 0x1096, - 0x1099, 0x10a3, 0x10ac, 0x10b3, 0x10ba, 0x10c0, 0x10c8, 0x10d6, - 0x10df, 0x10e5, 0x10eb, 0x10f4, 0x10fd, 0x1109, 0x1110, 0x1117, - 0x111e, 0x1125, 0x1140, 0x1149, 0x1152, 0x1159, 0x115c, 0x115f, - 0x1169, 0x1170, 0x117a, 0x1187, 0x118d, 0x1197, 0x119c, 0x11a6, - 0x11ae, 0x11b9, 0x11be, 0x11c6, 0x11c8, 0x11d2, 0x11db, 0x11df, - // Entry 240 - 27F - 0x11e2, 0x11ea, 0x11f1, 0x11f6, 0x11ff, 0x120a, 0x1214, 0x1220, - 0x1226, 0x122c, 0x1249, 0x124d, 0x1263, 0x126a, 0x1281, 0x1281, - 0x1281, 0x1281, 0x1281, 0x1281, 0x1281, 0x1281, 0x1281, 0x1281, - 0x1281, 0x1281, 0x1281, 0x1281, 0x128d, 0x1293, 0x1293, 0x1293, - 0x129b, 0x12a8, 0x12bb, 0x12cd, 0x12e2, -} // Size: 1250 bytes - -const paLangStr string = "" + // Size: 8148 bytes - "ਅਫ਼ਾਰਅਬਖਾਜ਼ੀਅਨਅਫ਼ਰੀਕੀਅਕਾਨਅਮਹਾਰਿਕਅਰਾਗੋਨੀਅਰਬੀਅਸਾਮੀਅਵਾਰਿਕਅਈਮਾਰਾਅਜ਼ਰਬਾਈਜਾਨੀਬ" + - "ਸ਼ਕੀਰਬੇਲਾਰੂਸੀਬੁਲਗਾਰੀਆਈਬਿਸਲਾਮਾਬੰਬਾਰਾਬੰਗਾਲੀਤਿੱਬਤੀਬਰੇਟਨਬੋਸਨੀਆਈਕੈਟਾਲਾਨਚੇਚਨ" + - "ਚਮੋਰੋਕੋਰਸੀਕਨਚੈੱਕਚਰਚ ਸਲਾਵੀਚੁਵਾਸ਼ਵੈਲਸ਼ਡੈਨਿਸ਼ਜਰਮਨਦਿਵੇਹੀਜ਼ੋਂਗਖਾਈਵਈਯੂਨਾਨੀਅੰ" + - "ਗਰੇਜ਼ੀਇਸਪੇਰਾਂਟੋਸਪੇਨੀਇਸਟੋਨੀਆਈਬਾਸਕਫ਼ਾਰਸੀਫੁਲਾਹਫਿਨਿਸ਼ਫ਼ਿਜ਼ੀਫ਼ੇਰੋਸੇਫਰਾਂਸੀਸੀ" + - "ਪੱਛਮੀ ਫ੍ਰਿਸੀਅਨਆਇਰਸ਼ਸਕਾਟਿਸ਼ ਗੇਲਿਕਗੈਲਿਸ਼ਿਅਨਗੁਆਰਾਨੀਗੁਜਰਾਤੀਮੈਂਕਸਹੌਸਾਹਿਬਰੂਹ" + - "ਿੰਦੀਕ੍ਰੋਏਸ਼ਿਆਈਹੈਤੀਆਈਹੰਗਰੀਆਈਅਰਮੀਨੀਆਈਹਰੇਰੋਇੰਟਰਲਿੰਗੁਆਇੰਡੋਨੇਸ਼ੀਆਈਇਗਬੋਸਿਚੁਆ" + - "ਨ ਯੀਇਡੂਆਈਸਲੈਂਡਿਕਇਤਾਲਵੀਇੰਕਟੀਟੂਤਜਪਾਨੀਜਾਵਾਨੀਜ਼ਜਾਰਜੀਆਈਕਿਕੂਯੂਕੁਆਨਯਾਮਾਕਜ਼ਾਖ਼" + - "ਕਲਾਅੱਲੀਸੁਟਖਮੇਰਕੰਨੜਕੋਰੀਆਈਕਨੂਰੀਕਸ਼ਮੀਰੀਕੁਰਦਕੋਮੀਕੋਰਨਿਸ਼ਕਿਰਗੀਜ਼ਲਾਤੀਨੀਲਕਜ਼ਮਬ" + - "ਰਗਿਸ਼ਗਾਂਡਾਲਿਮਬੁਰਗੀਲਿੰਗਾਲਾਲਾਓਲਿਥੁਆਨੀਅਨਲੂਬਾ-ਕਾਟਾਂਗਾਲਾਤੀਵੀਮੇਲੇਗਸੀਮਾਰਸ਼ਲੀਜ" + - "਼ਮਾਉਰੀਮੈਕਡੋਨੀਆਈਮਲਿਆਲਮਮੰਗੋਲੀਮਰਾਠੀਮਲਯਮਾਲਟੀਜ਼ਬਰਮੀਨਾਉਰੂਉੱਤਰੀ ਨਡੇਬੇਲੇਨੇਪਾਲੀ" + - "ਐਂਡੋਂਗਾਡੱਚਨਾਰਵੇਜਿਆਈ ਨਿਓਨੌਰਸਕਨਾਰਵੇਜਿਆਈ ਬੋਕਮਲਸਾਊਥ ਨਡੇਬੇਲੇਨਵਾਜੋਨਯਾਂਜਾਓਕਸੀ" + - "ਟਾਨਓਰੋਮੋਉੜੀਆਓਸੈਟਿਕਪੰਜਾਬੀਪਾਲੀਪੋਲੈਂਡੀਪਸ਼ਤੋਪੁਰਤਗਾਲੀਕਕੇਸ਼ੁਆਰੋਮਾਂਸ਼ਰੁੰਡੀਰੋਮ" + - "ਾਨੀਆਈਰੂਸੀਕਿਨਿਆਰਵਾਂਡਾਸੰਸਕ੍ਰਿਤਸਾਰਡੀਨੀਆਈਸਿੰਧੀਉੱਤਰੀ ਸਾਮੀਸਾਂਗੋਸਿੰਹਾਲਾਸਲੋਵਾਕ" + - "ਸਲੋਵੇਨੀਆਈਸਾਮੋਨਸ਼ੋਨਾਸੋਮਾਲੀਅਲਬਾਨੀਆਈਸਰਬੀਆਈਸਵਾਤੀਦੱਖਣੀ ਸੋਥੋਸੂੰਡਾਨੀਸਵੀਡਿਸ਼ਸਵ" + - "ਾਹਿਲੀਤਮਿਲਤੇਲਗੂਤਾਜਿਕਥਾਈਤਿਗ੍ਰੀਨਿਆਤੁਰਕਮੇਨਤਸਵਾਨਾਟੌਂਗਨਤੁਰਕੀਸੋਂਗਾਤਤਾਰਤਾਹੀਟੀਉ" + - "ਇਗੁਰਯੂਕਰੇਨੀਆਈਉੜਦੂਉਜ਼ਬੇਕਵੇਂਡਾਵੀਅਤਨਾਮੀਵੋਲਾਪੂਕਵਲੂਨਵੋਲੋਫਖੋਸਾਯਿਦਿਸ਼ਯੋਰੂਬਾਚੀ" + - "ਨੀ (ਮੈਂਡਰਿਨ)ਜ਼ੁਲੂਅਚੀਨੀਅਕੋਲੀਅਡਾਂਗਮੇਅਡਿਗੇਅਗੇਮਆਇਨੂਅਲੇਉਟਦੱਖਣੀ ਅਲਤਾਈਪੁਰਾਣੀ " + - "ਅੰਗਰੇਜ਼ੀਅੰਗਿਕਾਮਾਪੁਚੇਅਰਾਫਾਓਅਸੂਅਸਤੂਰੀਅਵਧੀਬਾਲੀਨੀਜ਼ਬਾਸਾਬੇਮਬਾਬੇਨਾਪੱਛਮੀ ਬਲੂਚ" + - "ੀਭੋਜਪੁਰੀਬਿਨੀਸਿਕਸਿਕਾਬੋਡੋਬਗਨੀਜ਼ਬਲਿਨਸੀਬੂਆਨੋਚੀਗਾਚੂਕੀਸਮਾਰੀਚੌਕਟੋਚੇਰੋਕੀਛਾਇਆਨਕ" + - "ੇਂਦਰੀ ਕੁਰਦਿਸ਼ਸੇਸੇਲਵਾ ਕ੍ਰਿਓਲ ਫ੍ਰੈਂਚਡਕੋਟਾਦਾਰਗਵਾਟੇਟਾਡੋਗਰਿੱਬਜ਼ਾਰਮਾਲੋਅਰ ਸੋਰ" + - "ਬੀਅਨਡੂਆਲਾਜੋਲਾ-ਫੋਇਨੀਡਜ਼ਾਗਾਇੰਬੂਐਫਿਕਪੁਰਾਤਨ ਮਿਸਰੀਏਕਾਜੁਕਇਵੋਂਡੋਫਿਲੀਪਿਨੋਫੌਨਫਰ" + - "ੀਉਲੀਅਨਗਾਗਾਗੌਜ਼ਚੀਨੀ ਗਾਨਜੀਜ਼ਗਿਲਬਰਤੀਜ਼ਗੋਰੋਂਤਾਲੋਪੁਰਾਤਨ ਯੂਨਾਨੀਜਰਮਨ (ਸਵਿਸ)ਗੁ" + - "ਸੀਗਵਿਚ’ਇਨਚੀਨੀ ਹਾਕਾਹਵਾਈਫਿਜੀ ਹਿੰਦੀਹਿਲੀਗੇਨਨਹਮੋਂਗਅੱਪਰ ਸੋਰਬੀਅਨਚੀਨੀ ਜ਼ਿਆਂਗਹੂ" + - "ਪਾਇਬਾਨਇਬੀਬੀਓਇਲੋਕੋਇੰਗੁਸ਼ਲੋਜਬਾਨਨਗੋਂਬਾਮਚਾਮੇਕਬਾਇਲਕਾਚਿਨਜਜੂਕੰਬਾਕਬਾਰਦੀਟਾਇਪਮਕੋ" + - "ਂਡਕਾਬੁਵੇਰਦਿਆਨੂਕੋਰੋਖਾਸੀਕੋਯਰਾ ਚੀਨੀਕਾਕੋਕਲੇਜਿਨਕਿਮਬੁੰਦੂਕੋਮੀ-ਪੇਰਮਿਆਕਕੋਂਕਣੀਕਪ" + - "ੇਲਕਰਾਚੇ ਬਲਕਾਰਕਰੀਲੀਅਨਕੁਰੁਖਸ਼ੰਬਾਲਾਬਫ਼ੀਆਕਲੋਗਨੀਅਨਕੁਮੀਕਲੈਡੀਨੋਲੰਗਾਈਲੈਜ਼ਗੀਲਕੋ" + - "ਟਾਲੋਜ਼ੀਉੱਤਰੀ ਲੁਰੀਲੁੰਡਾਲੂਓਮਿਜ਼ੋਲੂਈਆਮਾਡੂਰੀਸਮਗਾਹੀਮੈਥਲੀਮਕਾਸਰਮਸਾਈਮੋਕਸ਼ਾਮੇਂਡ" + - "ੇਮੇਰੂਮੋਰੀਸਿਅਨਮਖੋਵਾ-ਮਿੱਟੋਮੇਟਾਮਾਇਮੈਕਮਿਨਾਂਗਕਾਬਾਓਮਨੀਪੁਰੀਮੋਹਆਕਮੋਸੀਮੁੰਡੇਂਗਬਹ" + - "ੁਤੀਆਂ ਬੋਲੀਆਂਕ੍ਰੀਕਮਿਰਾਂਡੀਇਰਜ਼ੀਆਮੇਜ਼ੈਂਡਰਾਨੀਚੀਨੀ ਮਿਨ ਨਾਨਨਿਆਪੋਲੀਟਨਨਾਮਾਲੋ ਜ" + - "ਰਮਨਨੇਵਾਰੀਨਿਆਸਨਿਊਏਈਕਵਾਸਿਓਨਿਓਮਬੂਨਨੋਗਾਈਐਂਕੋਉੱਤਰੀ ਸੋਥੋਨੁਏਰਨਿਆਂਕੋਲੇਪੰਗਾਸੀਨਾ" + - "ਨਪੈਂਪਾਂਗਾਪਾਪਿਆਮੈਂਟੋਪਲਾਊਵੀਨਾਇਜੀਰੀਆਈ ਪਿਡਗਿਨਪਰੂਸ਼ੀਆਕੇਸ਼ਰਾਜਸਥਾਨੀਰਾਪਾਨੁਈਰਾਰ" + - "ੋਤੋਂਗਨਰੋਮਬੋਅਰੋਮੀਨੀਆਈਰਵਾਸਾਂਡੋਸਾਖਾਸਮਬੁਰੂਸੰਥਾਲੀਨਗਾਂਬੇਸੇਂਗੋਸਿਸੀਲੀਅਨਸਕਾਟਸਦੱ" + - "ਖਣੀ ਕੁਰਦਿਸ਼ਸੇਨਾਕੋਇਰਾਬੋਰੋ ਸੇਂਨੀਟਚੇਲਹਿਟਸ਼ਾਨਦੱਖਣੀ ਸਾਮੀਲਿਊਲ ਸਾਮੀਇਨਾਰੀ ਸਾਮੀ" + - "ਸਕੌਲਟ ਸਾਮੀਸੋਨਿੰਕੇਸ੍ਰਾਨਾਨ ਟੋਂਗੋਸਾਹੋਸੁਕੁਮਾਕੋਮੋਰੀਅਨਸੀਰੀਆਈਟਿਮਨੇਟੇਸੋਟੇਟਮਟਿਗ" + - "ਰਾਕਲਿੰਗਨਟੋਕ ਪਿਸਿਨਟਾਰੋਕੋਤੁੰਬੁਕਾਟਿਊਵਾਲੂਤਾਸਾਵਿਕਤੁਵੀਨੀਅਨਮੱਧ ਐਟਲਸ ਤਮਾਜ਼ਿਤਉਦ" + - "ਮੁਰਤਉਮਬੁੰਡੂਰੂਟਵਾਈਵੂੰਜੋਵਾਲਸਰਵੋਲਾਏਟਾਵੈਰੇਵਾਲਪੁਰੀਚੀਨੀ ਵੂਕਾਲਮਿਕਸੋਗਾਯਾਂਗਬੇਨਯ" + - "ੇਂਬਾਕੈਂਟੋਨੀਜ਼ਮਿਆਰੀ ਮੋਰੋਕੇਨ ਟਾਮਾਜ਼ਿਕਜ਼ੂਨੀਬੋਲੀ ਸੰਬੰਧੀ ਕੋਈ ਸਮੱਗਰੀ ਨਹੀਂਜ਼ਾ" + - "ਜ਼ਾਆਧੁਨਿਕ ਮਿਆਰੀ ਅਰਬੀਜਰਮਨ (ਆਸਟਰੀਆਈ)ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨਵੀ)ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕੀ)ਸ" + - "ਪੇਨੀ (ਯੂਰਪੀ)ਫਰਾਂਸੀਸੀ (ਕੈਨੇਡੀਅਨ)ਲੋ ਸੈਕਸਨਫਲੈਮਿਸ਼ਪੁਰਤਗਾਲੀ (ਬ੍ਰਾਜ਼ੀਲੀ)ਪੁਰਤ" + - "ਗਾਲੀ (ਯੂਰਪੀ)ਮੋਲਡਾਵੀਆਈਚੀਨੀ (ਸਰਲ)ਚੀਨੀ (ਰਵਾਇਤੀ)" - -var paLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x002a, 0x002a, 0x003f, 0x004b, 0x0060, 0x0075, - 0x0081, 0x0090, 0x00a2, 0x00b4, 0x00d5, 0x00e7, 0x00ff, 0x011a, - 0x012f, 0x0141, 0x0153, 0x0165, 0x0174, 0x0189, 0x019e, 0x01aa, - 0x01b9, 0x01ce, 0x01ce, 0x01da, 0x01f3, 0x0205, 0x0214, 0x0226, - 0x0232, 0x0244, 0x0259, 0x0262, 0x0274, 0x028c, 0x02a7, 0x02b6, - 0x02ce, 0x02da, 0x02ec, 0x02fb, 0x030d, 0x031f, 0x0334, 0x034c, - 0x0374, 0x0383, 0x03a8, 0x03c3, 0x03d8, 0x03ed, 0x03fc, 0x0408, - 0x0417, 0x0426, 0x0426, 0x0444, 0x0456, 0x046b, 0x0483, 0x0492, - // Entry 40 - 7F - 0x04b0, 0x04d1, 0x04d1, 0x04dd, 0x04f6, 0x04f6, 0x04ff, 0x051a, - 0x052c, 0x0544, 0x0553, 0x056b, 0x0580, 0x0580, 0x0592, 0x05aa, - 0x05bc, 0x05da, 0x05e6, 0x05f2, 0x0604, 0x0613, 0x0628, 0x0634, - 0x0640, 0x0655, 0x066a, 0x067c, 0x069d, 0x06ac, 0x06c4, 0x06d9, - 0x06e2, 0x06fd, 0x071f, 0x0731, 0x0746, 0x0761, 0x0770, 0x078b, - 0x079d, 0x07af, 0x07be, 0x07c7, 0x07dc, 0x07e8, 0x07f7, 0x081c, - 0x082e, 0x0843, 0x084c, 0x0880, 0x08ab, 0x08cd, 0x08dc, 0x08ee, - 0x0903, 0x0903, 0x0912, 0x091e, 0x0930, 0x0942, 0x094e, 0x0963, - // Entry 80 - BF - 0x0972, 0x098a, 0x099f, 0x09b4, 0x09c3, 0x09db, 0x09e7, 0x0a08, - 0x0a20, 0x0a3b, 0x0a4a, 0x0a66, 0x0a75, 0x0a8a, 0x0a9c, 0x0ab7, - 0x0ac6, 0x0ad5, 0x0ae7, 0x0aff, 0x0b11, 0x0b20, 0x0b3c, 0x0b51, - 0x0b66, 0x0b7b, 0x0b87, 0x0b96, 0x0ba5, 0x0bae, 0x0bc9, 0x0bde, - 0x0bf0, 0x0bff, 0x0c0e, 0x0c1d, 0x0c29, 0x0c3b, 0x0c4a, 0x0c65, - 0x0c71, 0x0c83, 0x0c92, 0x0caa, 0x0cbf, 0x0ccb, 0x0cda, 0x0ce6, - 0x0cf8, 0x0d0a, 0x0d0a, 0x0d2e, 0x0d3d, 0x0d4c, 0x0d5b, 0x0d70, - 0x0d7f, 0x0d7f, 0x0d7f, 0x0d8b, 0x0d97, 0x0d97, 0x0d97, 0x0da6, - // Entry C0 - FF - 0x0da6, 0x0dc5, 0x0df0, 0x0e02, 0x0e02, 0x0e14, 0x0e14, 0x0e26, - 0x0e26, 0x0e26, 0x0e26, 0x0e26, 0x0e26, 0x0e2f, 0x0e2f, 0x0e41, - 0x0e41, 0x0e4d, 0x0e4d, 0x0e65, 0x0e65, 0x0e71, 0x0e71, 0x0e71, - 0x0e71, 0x0e71, 0x0e80, 0x0e80, 0x0e8c, 0x0e8c, 0x0e8c, 0x0eab, - 0x0ec0, 0x0ec0, 0x0ecc, 0x0ecc, 0x0ecc, 0x0ee1, 0x0ee1, 0x0ee1, - 0x0ee1, 0x0ee1, 0x0eed, 0x0eed, 0x0eed, 0x0eff, 0x0eff, 0x0f0b, - 0x0f0b, 0x0f0b, 0x0f0b, 0x0f0b, 0x0f0b, 0x0f20, 0x0f2c, 0x0f2c, - 0x0f2c, 0x0f3b, 0x0f47, 0x0f47, 0x0f56, 0x0f56, 0x0f68, 0x0f77, - // Entry 100 - 13F - 0x0f9f, 0x0f9f, 0x0f9f, 0x0f9f, 0x0fda, 0x0fda, 0x0fe9, 0x0ffb, - 0x1007, 0x1007, 0x1007, 0x101c, 0x101c, 0x102e, 0x102e, 0x1050, - 0x1050, 0x105f, 0x105f, 0x107b, 0x107b, 0x108d, 0x1099, 0x10a5, - 0x10a5, 0x10c7, 0x10d9, 0x10d9, 0x10d9, 0x10d9, 0x10eb, 0x10eb, - 0x10eb, 0x1103, 0x1103, 0x110c, 0x110c, 0x110c, 0x110c, 0x110c, - 0x110c, 0x110c, 0x1124, 0x112a, 0x113c, 0x1152, 0x1152, 0x1152, - 0x1152, 0x115e, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, - 0x1194, 0x1194, 0x1194, 0x11b9, 0x11d4, 0x11d4, 0x11d4, 0x11e0, - // Entry 140 - 17F - 0x11f5, 0x11f5, 0x120e, 0x121a, 0x1236, 0x124e, 0x124e, 0x125d, - 0x127f, 0x129e, 0x12aa, 0x12b6, 0x12c8, 0x12d7, 0x12e9, 0x12e9, - 0x12e9, 0x12fb, 0x130d, 0x131c, 0x131c, 0x131c, 0x131c, 0x131c, - 0x132b, 0x133a, 0x1343, 0x134f, 0x134f, 0x1361, 0x1361, 0x136d, - 0x137c, 0x13a0, 0x13a0, 0x13ac, 0x13ac, 0x13b8, 0x13b8, 0x13d4, - 0x13d4, 0x13d4, 0x13e0, 0x13f2, 0x140a, 0x142c, 0x143e, 0x143e, - 0x144a, 0x1469, 0x1469, 0x1469, 0x147e, 0x148d, 0x14a2, 0x14b1, - 0x14c9, 0x14d8, 0x14d8, 0x14ea, 0x14f9, 0x14f9, 0x14f9, 0x150b, - // Entry 180 - 1BF - 0x150b, 0x150b, 0x150b, 0x151a, 0x151a, 0x151a, 0x1529, 0x1545, - 0x1545, 0x1545, 0x1545, 0x1554, 0x155d, 0x156c, 0x1578, 0x1578, - 0x1578, 0x158d, 0x158d, 0x159c, 0x15ab, 0x15ba, 0x15ba, 0x15c6, - 0x15c6, 0x15d8, 0x15d8, 0x15e7, 0x15f3, 0x160b, 0x160b, 0x162a, - 0x1636, 0x1648, 0x1669, 0x1669, 0x167e, 0x168d, 0x1699, 0x1699, - 0x16ae, 0x16d6, 0x16e5, 0x16fa, 0x16fa, 0x16fa, 0x16fa, 0x170c, - 0x172d, 0x174d, 0x1768, 0x1774, 0x1787, 0x1799, 0x17a5, 0x17b4, - 0x17b4, 0x17c6, 0x17db, 0x17ea, 0x17ea, 0x17ea, 0x17f6, 0x1812, - // Entry 1C0 - 1FF - 0x181e, 0x181e, 0x181e, 0x1836, 0x1836, 0x1836, 0x1836, 0x1836, - 0x1851, 0x1851, 0x1869, 0x1887, 0x1899, 0x1899, 0x18c7, 0x18c7, - 0x18c7, 0x18c7, 0x18c7, 0x18c7, 0x18c7, 0x18c7, 0x18c7, 0x18dc, - 0x18dc, 0x18e8, 0x18e8, 0x1900, 0x1915, 0x1930, 0x1930, 0x1930, - 0x193f, 0x193f, 0x193f, 0x193f, 0x193f, 0x195a, 0x1963, 0x1972, - 0x197e, 0x197e, 0x1990, 0x1990, 0x19a2, 0x19a2, 0x19b4, 0x19c3, - 0x19db, 0x19ea, 0x19ea, 0x1a0f, 0x1a0f, 0x1a1b, 0x1a1b, 0x1a1b, - 0x1a46, 0x1a46, 0x1a46, 0x1a5b, 0x1a67, 0x1a67, 0x1a67, 0x1a67, - // Entry 200 - 23F - 0x1a67, 0x1a83, 0x1a9c, 0x1ab8, 0x1ad4, 0x1ae9, 0x1ae9, 0x1b0e, - 0x1b0e, 0x1b1a, 0x1b1a, 0x1b2c, 0x1b2c, 0x1b2c, 0x1b44, 0x1b44, - 0x1b56, 0x1b56, 0x1b56, 0x1b65, 0x1b71, 0x1b71, 0x1b7d, 0x1b8c, - 0x1b8c, 0x1b8c, 0x1b8c, 0x1b9e, 0x1b9e, 0x1b9e, 0x1b9e, 0x1b9e, - 0x1bb7, 0x1bb7, 0x1bc9, 0x1bc9, 0x1bc9, 0x1bc9, 0x1bde, 0x1bf3, - 0x1c08, 0x1c20, 0x1c4c, 0x1c5e, 0x1c5e, 0x1c73, 0x1c7c, 0x1c85, - 0x1c85, 0x1c85, 0x1c85, 0x1c85, 0x1c85, 0x1c85, 0x1c94, 0x1ca3, - 0x1cb8, 0x1cc4, 0x1cc4, 0x1cd9, 0x1cec, 0x1cfe, 0x1cfe, 0x1d0a, - // Entry 240 - 27F - 0x1d0a, 0x1d0a, 0x1d1f, 0x1d2e, 0x1d2e, 0x1d49, 0x1d49, 0x1d49, - 0x1d49, 0x1d49, 0x1d87, 0x1d96, 0x1ddf, 0x1df1, 0x1e20, 0x1e20, - 0x1e44, 0x1e44, 0x1e44, 0x1e44, 0x1e74, 0x1ea1, 0x1ea1, 0x1ec2, - 0x1ec2, 0x1ec2, 0x1ef5, 0x1ef5, 0x1f0b, 0x1f20, 0x1f56, 0x1f80, - 0x1f9b, 0x1f9b, 0x1f9b, 0x1fb3, 0x1fd4, -} // Size: 1250 bytes - -const plLangStr string = "" + // Size: 5567 bytes - "afarabchaskiawestyjskiafrikaansakanamharskiaragońskiarabskiasamskiawarsk" + - "iajmaraazerbejdżańskibaszkirskibiałoruskibułgarskibislamabambarabengalsk" + - "itybetańskibretońskibośniackikatalońskiczeczeńskiczamorrokorsykańskikric" + - "zeskicerkiewnosłowiańskiczuwaskiwalijskiduńskiniemieckimalediwskidzongkh" + - "aewegreckiangielskiesperantohiszpańskiestońskibaskijskiperskifulanifińsk" + - "ifidżijskifarerskifrancuskizachodniofryzyjskiirlandzkiszkocki gaelickiga" + - "licyjskiguaranigudżaratimanxhausahebrajskihindihiri motuchorwackikreolsk" + - "i haitańskiwęgierskiormiańskihererointerlinguaindonezyjskiinterlingueigb" + - "osyczuańskiinupiakidoislandzkiwłoskiinuktitutjapońskijawajskigruzińskiko" + - "ngokikujukwanyamakazachskigrenlandzkikhmerskikannadakoreańskikanurikaszm" + - "irskikurdyjskikomikornijskikirgiskiłacińskiluksemburskigandalimburskilin" + - "galalaotańskilitewskiluba-katangałotewskimalgaskimarszalskimaoryjskimace" + - "dońskimalajalammongolskimarathimalajskimaltańskibirmańskinaurundebele pó" + - "łnocnynepalskindonganiderlandzkinorweski (nynorsk)norweski (bokmål)ndeb" + - "ele południowynawahonjandżaoksytańskiodżibwaoromoorijaosetyjskipendżabsk" + - "ipalijskipolskipasztoportugalskikeczuaretoromańskirundirumuńskirosyjskik" + - "inya-ruandasanskrytsardyńskisindhipółnocnolapońskisangosyngaleskisłowack" + - "isłoweńskisamoańskishonasomalijskialbańskiserbskisuazisotho południowysu" + - "ndajskiszwedzkisuahilitamilskitelugutadżyckitajskitigriniaturkmeńskisets" + - "wanatongatureckitsongatatarskitahitańskiujgurskiukraińskiurduuzbeckivend" + - "awietnamskiwolapikwalońskiwolofkhosajidyszjorubaczuangchińskizuluacehacz" + - "oliadangmeadygejskitunezyjski arabskiafrihiliaghemajnuakadyjskialabamaal" + - "euckialbański gegijskipołudniowoałtajskistaroangielskiangikaaramejskimap" + - "udungunaraonaarapahoalgierski arabskiarawakmarokański arabskiegipski ara" + - "bskiasuamerykański język migowyasturyjskikotavaawadhibeludżibalijskibawa" + - "rskibasaabamumbatak tobaghomalabedżabembabetawibenabafutbadagabeludżi pó" + - "łnocnybhodźpuribikolbinibanjarkomsiksikabisznuprija-manipuribachtiarski" + - "bradźbrahuibodoakooseburiackibugijskibulublinmedumbakaddokaraibskikajuga" + - "atsamcebuanochigaczibczaczagatajskichuukmaryjskiżargon czinuckiczoktawsk" + - "iczipewiańskiczirokeskiczejeńskisoranikoptyjskicapiznonkrymskotatarskikr" + - "eolski seszelskikaszubskidakotadargwijskitaitadelawareslavedogribdinkadż" + - "ermadogridolnołużyckidusun centralnydualaśredniowieczny niderlandzkidiol" + - "adiuladazagaembuefikemilijskistaroegipskiekajukelamickiśrednioangielskiy" + - "upik środkowosyberyjskiewondoestremadurskifangfilipinomeänkielifoncajuńs" + - "kiśredniofrancuskistarofrancuskifranko-prowansalskipółnocnofryzyjskiwsch" + - "odniofryzyjskifriulskigagagauskigangayogbayazaratusztriański darigyyzgil" + - "bertańskigiliańskiśrednio-wysoko-niemieckistaro-wysoko-niemieckikonkani " + - "(Goa)gondigorontalogockigrebostarogreckiszwajcarski niemieckiwayúufrafra" + - "gusiigwichʼinhaidahakkahawajskihindi fidżyjskiehiligaynonhetyckihmonggór" + - "nołużyckixianghupaibanibibioilokanoinguskiingryjskijamajskilojbanngombem" + - "achamejudeo-perskijudeoarabskijutlandzkikarakałpackikabylskikaczinjjukam" + - "bakawikabardyjskikanembutyapmakondekreolski Wysp Zielonego Przylądkakeny" + - "angkorokaingangkhasichotańskikoyra chiinikhowarkirmandżkikakokalenjinkim" + - "bundukomi-permiackikonkanikosraekpellekaraczajsko-bałkarskikriokinarayak" + - "arelskikurukhsambalabafiagwara kolońskakumyckikutenailadyńskilangilahnda" + - "lambalezgijskiLingua Franca Novaliguryjskiliwskilakotalombardzkimongoloz" + - "iluryjski północnyłatgalskiluba-lulualuisenolundaluomizoluhyachiński kla" + - "sycznylazyjskimadurajskimafamagahimaithilimakasarmandingomasajskimabamok" + - "szamandarmendemerukreolski Mauritiusaśrednioirlandzkimakuametamikmakmina" + - "ngkabumanchumanipurimohawkmossizachodniomaryjskimundangwiele językówkrik" + - "mirandyjskimarwarimentawaimyeneerzjamazanderańskiminnańskineapolitańskin" + - "amadolnoniemieckinewarskiniasniueaongumbangiemboonnogajskistaronordyjski" + - "novialn’kosotho północnynuernewarski klasycznyniamwezinyankolenyoronzema" + - "osageosmańsko-tureckipangasinopahlavipampangopapiamentopalaupikardyjskip" + - "idżyn nigeryjskipensylwańskiplautdietschstaroperskipalatynackifenickipie" + - "monckipontyjskiponpejskipruskistaroprowansalskikiczekeczua górski (Chimb" + - "orazo)radźasthanirapanuirarotongaromagnoltarifitrombocygańskirotumańskir" + - "usińskirovianaarumuńskirwasandawejakuckisamarytański aramejskisamburusas" + - "aksantalisaurasztryjskingambaysangusycylijskiscotssassarskipołudniowokur" + - "dyjskisenekasenaseriselkupskikoyraboro sennistaroirlandzkiżmudzkitashelh" + - "iytszanarabski (Czad)sidamodolnośląskiselayarpołudniowolapońskiluleinari" + - "skoltsoninkesogdyjskisranan tongoserersahofryzyjski saterlandzkisukumasu" + - "susumeryjskikomoryjskisyriackisyryjskiśląskitulutemneatesoterenotetumtig" + - "retiwtokelaucachurskiklingońskitlingittałyskitamaszektonga (Niasa)tok pi" + - "sinturoyotarokocakońskitsimshiantackitumbukatuvalutasawaqtuwińskitamazig" + - "ht (Atlas Środkowy)udmurckiugaryckiumbundujęzyk rdzennywaiweneckiwepskiz" + - "achodnioflamandzkimeński frankońskiwotiackivõrovunjowalserwolaytawarajwa" + - "showarlpiriwukałmuckimegrelskisogayaojapskiyangbenyembanheengatukantońsk" + - "izapoteckiblisszelandzkizenagastandardowy marokański tamazightzunibrak t" + - "reści o charakterze językowymzazakiwspółczesny arabskiaustriacki niemiec" + - "kiwysokoniemiecki (Szwajcaria)australijski angielskikanadyjski angielski" + - "brytyjski angielskiamerykański angielskiamerykański hiszpańskieuropejski" + - " hiszpańskimeksykański hiszpańskikanadyjski francuskiszwajcarski francus" + - "kidolnosaksońskiflamandzkibrazylijski portugalskieuropejski portugalskim" + - "ołdawskiserbsko-chorwackikongijski suahilichiński uproszczonychiński tra" + - "dycyjny" - -var plLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000c, 0x0016, 0x001f, 0x0023, 0x002b, 0x0035, - 0x003c, 0x0043, 0x004a, 0x0050, 0x0060, 0x006a, 0x0075, 0x007f, - 0x0086, 0x008d, 0x0096, 0x00a1, 0x00ab, 0x00b5, 0x00c0, 0x00cb, - 0x00d3, 0x00df, 0x00e2, 0x00e8, 0x00fd, 0x0105, 0x010d, 0x0114, - 0x011d, 0x0127, 0x012f, 0x0132, 0x0138, 0x0141, 0x014a, 0x0155, - 0x015e, 0x0167, 0x016d, 0x0173, 0x017a, 0x0184, 0x018c, 0x0195, - 0x01a7, 0x01b0, 0x01c0, 0x01ca, 0x01d1, 0x01db, 0x01df, 0x01e4, - 0x01ed, 0x01f2, 0x01fb, 0x0204, 0x0217, 0x0221, 0x022b, 0x0231, - // Entry 40 - 7F - 0x023c, 0x0248, 0x0253, 0x0257, 0x0262, 0x0269, 0x026c, 0x0275, - 0x027c, 0x0285, 0x028e, 0x0296, 0x02a0, 0x02a5, 0x02ab, 0x02b3, - 0x02bc, 0x02c7, 0x02cf, 0x02d6, 0x02e0, 0x02e6, 0x02f0, 0x02f9, - 0x02fd, 0x0306, 0x030e, 0x0318, 0x0324, 0x0329, 0x0332, 0x0339, - 0x0343, 0x034b, 0x0357, 0x0360, 0x0368, 0x0372, 0x037b, 0x0386, - 0x038f, 0x0398, 0x039f, 0x03a7, 0x03b1, 0x03bb, 0x03c0, 0x03d2, - 0x03da, 0x03e0, 0x03ec, 0x03fe, 0x0410, 0x0423, 0x0429, 0x0431, - 0x043c, 0x0444, 0x0449, 0x044e, 0x0457, 0x0462, 0x046a, 0x0470, - // Entry 80 - BF - 0x0476, 0x0481, 0x0487, 0x0494, 0x0499, 0x04a2, 0x04aa, 0x04b6, - 0x04be, 0x04c8, 0x04ce, 0x04e1, 0x04e6, 0x04f0, 0x04f9, 0x0504, - 0x050e, 0x0513, 0x051d, 0x0526, 0x052d, 0x0532, 0x0543, 0x054c, - 0x0554, 0x055b, 0x0563, 0x0569, 0x0572, 0x0578, 0x0580, 0x058b, - 0x0593, 0x0598, 0x059f, 0x05a5, 0x05ad, 0x05b8, 0x05c0, 0x05ca, - 0x05ce, 0x05d5, 0x05da, 0x05e4, 0x05eb, 0x05f4, 0x05f9, 0x05fe, - 0x0604, 0x060a, 0x0610, 0x0618, 0x061c, 0x0620, 0x0626, 0x062d, - 0x0636, 0x0648, 0x0650, 0x0655, 0x0659, 0x0662, 0x0669, 0x0670, - // Entry C0 - FF - 0x0682, 0x0696, 0x06a4, 0x06aa, 0x06b3, 0x06bd, 0x06c3, 0x06ca, - 0x06db, 0x06db, 0x06e1, 0x06f4, 0x0703, 0x0706, 0x0720, 0x072a, - 0x0730, 0x0736, 0x073e, 0x0746, 0x074e, 0x0753, 0x0758, 0x0762, - 0x0769, 0x076f, 0x0774, 0x077a, 0x077e, 0x0783, 0x0789, 0x079c, - 0x07a6, 0x07ab, 0x07af, 0x07b5, 0x07b8, 0x07bf, 0x07d3, 0x07de, - 0x07e4, 0x07ea, 0x07ee, 0x07f4, 0x07fc, 0x0804, 0x0808, 0x080c, - 0x0813, 0x0818, 0x0821, 0x0827, 0x082c, 0x0833, 0x0838, 0x083f, - 0x084a, 0x084f, 0x0857, 0x0867, 0x0871, 0x087e, 0x0888, 0x0892, - // Entry 100 - 13F - 0x0898, 0x08a1, 0x08a9, 0x08b8, 0x08ca, 0x08d3, 0x08d9, 0x08e3, - 0x08e8, 0x08f0, 0x08f5, 0x08fb, 0x0900, 0x0907, 0x090c, 0x091a, - 0x0929, 0x092e, 0x094a, 0x094f, 0x0954, 0x095a, 0x095e, 0x0962, - 0x096b, 0x0977, 0x097d, 0x0985, 0x0996, 0x09af, 0x09b5, 0x09c2, - 0x09c6, 0x09ce, 0x09d8, 0x09db, 0x09e4, 0x09f5, 0x0a03, 0x0a16, - 0x0a29, 0x0a3b, 0x0a43, 0x0a45, 0x0a4d, 0x0a50, 0x0a54, 0x0a59, - 0x0a6f, 0x0a73, 0x0a80, 0x0a8a, 0x0aa3, 0x0ab9, 0x0ac6, 0x0acb, - 0x0ad4, 0x0ad9, 0x0ade, 0x0ae9, 0x0afe, 0x0b04, 0x0b0a, 0x0b0f, - // Entry 140 - 17F - 0x0b18, 0x0b1d, 0x0b22, 0x0b2a, 0x0b3b, 0x0b45, 0x0b4c, 0x0b51, - 0x0b60, 0x0b65, 0x0b69, 0x0b6d, 0x0b73, 0x0b7a, 0x0b81, 0x0b8a, - 0x0b92, 0x0b98, 0x0b9e, 0x0ba5, 0x0bb1, 0x0bbd, 0x0bc7, 0x0bd4, - 0x0bdc, 0x0be2, 0x0be5, 0x0bea, 0x0bee, 0x0bf9, 0x0c00, 0x0c04, - 0x0c0b, 0x0c2d, 0x0c34, 0x0c38, 0x0c40, 0x0c45, 0x0c4f, 0x0c5b, - 0x0c61, 0x0c6c, 0x0c70, 0x0c78, 0x0c80, 0x0c8e, 0x0c95, 0x0c9b, - 0x0ca1, 0x0cb7, 0x0cbb, 0x0cc3, 0x0ccb, 0x0cd1, 0x0cd8, 0x0cdd, - 0x0cec, 0x0cf3, 0x0cfa, 0x0d03, 0x0d08, 0x0d0e, 0x0d13, 0x0d1c, - // Entry 180 - 1BF - 0x0d2e, 0x0d38, 0x0d3e, 0x0d44, 0x0d4e, 0x0d53, 0x0d57, 0x0d6a, - 0x0d74, 0x0d7e, 0x0d85, 0x0d8a, 0x0d8d, 0x0d91, 0x0d96, 0x0da8, - 0x0db0, 0x0dba, 0x0dbe, 0x0dc4, 0x0dcc, 0x0dd3, 0x0ddb, 0x0de3, - 0x0de7, 0x0ded, 0x0df3, 0x0df8, 0x0dfc, 0x0e0f, 0x0e20, 0x0e25, - 0x0e29, 0x0e2f, 0x0e39, 0x0e3f, 0x0e47, 0x0e4d, 0x0e52, 0x0e63, - 0x0e6a, 0x0e79, 0x0e7d, 0x0e88, 0x0e8f, 0x0e97, 0x0e9c, 0x0ea1, - 0x0eaf, 0x0eb9, 0x0ec7, 0x0ecb, 0x0ed9, 0x0ee1, 0x0ee5, 0x0ee9, - 0x0eeb, 0x0ef1, 0x0efa, 0x0f02, 0x0f10, 0x0f16, 0x0f1c, 0x0f2c, - // Entry 1C0 - 1FF - 0x0f30, 0x0f42, 0x0f4a, 0x0f52, 0x0f57, 0x0f5c, 0x0f61, 0x0f72, - 0x0f7b, 0x0f82, 0x0f8a, 0x0f94, 0x0f99, 0x0fa4, 0x0fb6, 0x0fc3, - 0x0fcf, 0x0fda, 0x0fe5, 0x0fec, 0x0ff5, 0x0ffe, 0x1007, 0x100d, - 0x101e, 0x1023, 0x103e, 0x104a, 0x1051, 0x105a, 0x1062, 0x1069, - 0x106e, 0x1077, 0x1082, 0x108b, 0x1092, 0x109c, 0x109f, 0x10a6, - 0x10ad, 0x10c4, 0x10cb, 0x10d0, 0x10d7, 0x10e5, 0x10ec, 0x10f1, - 0x10fb, 0x1100, 0x1109, 0x111d, 0x1123, 0x1127, 0x112b, 0x1134, - 0x1143, 0x1151, 0x1159, 0x1163, 0x1167, 0x1175, 0x117b, 0x1188, - // Entry 200 - 23F - 0x118f, 0x11a3, 0x11a7, 0x11ac, 0x11b1, 0x11b8, 0x11c1, 0x11cd, - 0x11d2, 0x11d6, 0x11ec, 0x11f2, 0x11f6, 0x1200, 0x120a, 0x1212, - 0x121a, 0x1222, 0x1226, 0x122b, 0x1230, 0x1236, 0x123b, 0x1240, - 0x1243, 0x124a, 0x1253, 0x125e, 0x1265, 0x126d, 0x1275, 0x1282, - 0x128b, 0x1291, 0x1297, 0x12a0, 0x12a9, 0x12ae, 0x12b5, 0x12bb, - 0x12c2, 0x12cb, 0x12e6, 0x12ee, 0x12f6, 0x12fd, 0x130b, 0x130e, - 0x1315, 0x131b, 0x132e, 0x1341, 0x1349, 0x134e, 0x1353, 0x1359, - 0x1360, 0x1365, 0x136a, 0x1372, 0x1374, 0x137d, 0x1386, 0x138a, - // Entry 240 - 27F - 0x138d, 0x1393, 0x139a, 0x139f, 0x13a8, 0x13b2, 0x13bb, 0x13c0, - 0x13c9, 0x13cf, 0x13f0, 0x13f4, 0x1419, 0x141f, 0x1434, 0x1434, - 0x1448, 0x1464, 0x147a, 0x148e, 0x14a1, 0x14b7, 0x14cf, 0x14e5, - 0x14fd, 0x14fd, 0x1511, 0x1526, 0x1535, 0x153f, 0x1556, 0x156c, - 0x1576, 0x1587, 0x1598, 0x15ac, 0x15bf, -} // Size: 1250 bytes - -const ptLangStr string = "" + // Size: 4104 bytes - "afarabcázioavésticoafricânerakanamáricoaragonêsárabeassamêsavaricaimaraa" + - "zerbaijanobashkirbielorrussobúlgarobislamábambarabengalitibetanobretãobó" + - "sniocatalãochechenochamorrocórsicocreetchecoeslavo eclesiásticotchuvache" + - "galêsdinamarquêsalemãodivehidzongaevegregoinglêsesperantoespanholestonia" + - "nobascopersafulafinlandêsfijianoferoêsfrancêsfrísio ocidentalirlandêsgaé" + - "lico escocêsgalegoguaraniguzeratemanxhauçáhebraicohíndihiri motucroataha" + - "itianohúngaroarmêniohererointerlínguaindonésiointerlingueibosichuan yiin" + - "upiaqueidoislandêsitalianoinuktitutjaponêsjavanêsgeorgianocongolêsquicui" + - "okuanyamacazaquegroenlandêskhmercanarêscoreanocanúricaxemiracurdokomicór" + - "nicoquirguizlatimluxemburguêslugandalimburguêslingalalaosianolituanoluba" + - "-catangaletãomalgaxemarshalêsmaorimacedôniomalaialamongolmaratamalaiomal" + - "têsbirmanêsnauruanondebele do nortenepalidongoholandêsnynorsk norueguêsb" + - "okmål norueguêsndebele do sulnavajonianjaoccitânicoojibwaoromooriyaosset" + - "opanjabipálipolonêspashtoportuguêsquíchuaromancherundiromenorussoquiniar" + - "uandasânscritosardosindisami setentrionalsangocingalêseslovacoeslovenosa" + - "moanoshonasomalialbanêssérviosuázisoto do sulsundanêssuecosuaílitâmiltel" + - "ugutajiquetailandêstigrínioturcomenotswanatonganêsturcotsongatatartaitia" + - "nouigurucranianourduusbequevendavietnamitavolapuquevalãouólofexosaiídich" + - "eiorubázhuangchinêszuluachémacoliadangmeadigueafrihiliaghemainuacadianoa" + - "leútealtai do sulinglês arcaicoangikaaramaicomapudungunarapahoarauaquias" + - "uasturianoawadhibalúchibalinêsbasabamumghomala’bejabembabenabafutbalúchi" + - " ocidentalbhojpuribikolbinikomsiksikabrajbodoakooseburiatobuginêsbulubli" + - "nmedumbacaddocaribecayugaatsamcebuanochigachibchachagataichuukesemarijar" + - "gão Chinookchoctawchipewyancherokeecheienesorâni curdocoptaturco da Crim" + - "eiacrioulo francês seichelensekashubiandacotadargwataitadelawareslavedog" + - "ribdinkazarmadogribaixo sorábiodualaholandês médiojola-fonyidiúladazagae" + - "mbuefiqueegípcio arcaicoekajukelamiteinglês médioewondofanguefilipinofom" + - "francês médiofrancês arcaicofrísio setentrionalfrisão orientalfriulanoga" + - "gagauzgangayogbaiageezgilbertêsalto alemão médioalemão arcaico altogondi" + - "gorontalogóticogrebogrego arcaicoalemão (Suíça)gusiigwichʼinhaidahacáhav" + - "aianohiligaynonhititahmongalto sorábioxianghupaibanibibioilocanoinguchel" + - "ojbannguembamachamejudaico-persajudaico-arábicokara-kalpakkabylekachinjj" + - "ukambakawikabardianokanembutyapmacondekabuverdianukorokhasikhotanêskoyra" + - " chiinikakokalenjinquimbundokomi-permyakconcanikosraeankpellekarachay-ba" + - "lkarcaréliokurukhshambalabafiakölschkumykkutenailadinolangilahndalambale" + - "zghianlacotamongoloziluri setentrionalluba-lulualuisenolundaluolushailuy" + - "iamadurêsmafamagahimaithilimakasarmandingamassaimabamocsamandarmendemeru" + - "morisyenirlandês médiomacuameta’miquemaqueminangkabaumanchumanipurimoica" + - "nomossimundangmúltiplos idiomascreekmirandêsmarwarimyeneerzyamazandarani" + - "min nannapolitanonamabaixo alemãonewariniasniueanokwasiongiemboonnogainó" + - "rdico arcaicon’kosoto setentrionalnuernewari clássiconyamwezinyankolenyo" + - "ronzimaosageturco otomanopangasinãpálavipampangapapiamentopalauanopidgin" + - " nigerianopersa arcaicofeníciopohnpeianoprussianoprovençal arcaicoquiché" + - "rajastanirapanuirarotonganoromboromaniaromenorwasandaweiacutoaramaico sa" + - "maritanosamburusasaksantalingambaysangusicilianoscotscurdo meridionalsen" + - "ecasenaselkupkoyraboro senniirlandês arcaicotachelhitshanárabe chadianos" + - "idamosami do sulsami de Lulesami de Inarisami de Skoltsoninquêsogdianosu" + - "rinamêssereresahosukumasususumériocomorianosiríaco clássicosiríacotimnet" + - "esoterenotétumtigrétivtoquelauanoklingontlinguitetamaxequetonganês de Ny" + - "asatok pisintarokotsimshianotumbukatuvaluanotasawaqtuvinianotamazight do" + - " Atlas Centraludmurteugaríticoumbunduraizvaivóticovunjowalserwolayttawar" + - "aywashowarlpiriwukalmyklusogayaoyapeseyangbenyembacantonêszapotecosímbol" + - "os bliszenagatamazight marroquino padrãozunhisem conteúdo linguísticozaz" + - "aárabe modernoazeri sulalto alemão (Suíça)baixo saxãoflamengomoldávioser" + - "vo-croatasuaíli do Congochinês simplificadochinês tradicional" - -var ptLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000c, 0x0015, 0x001f, 0x0023, 0x002b, 0x0034, - 0x003a, 0x0042, 0x0048, 0x004e, 0x0059, 0x0060, 0x006b, 0x0073, - 0x007b, 0x0082, 0x0089, 0x0091, 0x0098, 0x009f, 0x00a7, 0x00af, - 0x00b7, 0x00bf, 0x00c3, 0x00c9, 0x00dd, 0x00e6, 0x00ec, 0x00f8, - 0x00ff, 0x0105, 0x010b, 0x010e, 0x0113, 0x011a, 0x0123, 0x012b, - 0x0134, 0x0139, 0x013e, 0x0142, 0x014c, 0x0153, 0x015a, 0x0162, - 0x0173, 0x017c, 0x018d, 0x0193, 0x019a, 0x01a2, 0x01a6, 0x01ad, - 0x01b5, 0x01bb, 0x01c4, 0x01ca, 0x01d2, 0x01da, 0x01e2, 0x01e8, - // Entry 40 - 7F - 0x01f4, 0x01fe, 0x0209, 0x020c, 0x0216, 0x021f, 0x0222, 0x022b, - 0x0233, 0x023c, 0x0244, 0x024c, 0x0255, 0x025e, 0x0265, 0x026d, - 0x0274, 0x0280, 0x0285, 0x028d, 0x0294, 0x029b, 0x02a3, 0x02a8, - 0x02ac, 0x02b4, 0x02bc, 0x02c1, 0x02ce, 0x02d5, 0x02e0, 0x02e7, - 0x02ef, 0x02f6, 0x0302, 0x0308, 0x030f, 0x0319, 0x031e, 0x0328, - 0x0330, 0x0336, 0x033c, 0x0342, 0x0349, 0x0352, 0x035a, 0x036a, - 0x0370, 0x0375, 0x037e, 0x0390, 0x03a2, 0x03b0, 0x03b6, 0x03bc, - 0x03c7, 0x03cd, 0x03d2, 0x03d7, 0x03dd, 0x03e4, 0x03e9, 0x03f1, - // Entry 80 - BF - 0x03f7, 0x0401, 0x0409, 0x0411, 0x0416, 0x041c, 0x0421, 0x042d, - 0x0437, 0x043c, 0x0441, 0x0452, 0x0457, 0x0460, 0x0468, 0x0470, - 0x0477, 0x047c, 0x0482, 0x048a, 0x0491, 0x0497, 0x04a2, 0x04ab, - 0x04b0, 0x04b7, 0x04bd, 0x04c3, 0x04ca, 0x04d4, 0x04dd, 0x04e6, - 0x04ec, 0x04f5, 0x04fa, 0x0500, 0x0505, 0x050d, 0x0512, 0x051b, - 0x051f, 0x0526, 0x052b, 0x0535, 0x053e, 0x0544, 0x054b, 0x054f, - 0x0557, 0x055e, 0x0564, 0x056b, 0x056f, 0x0575, 0x057a, 0x0581, - 0x0587, 0x0587, 0x058f, 0x0594, 0x0598, 0x05a0, 0x05a0, 0x05a7, - // Entry C0 - FF - 0x05a7, 0x05b3, 0x05c2, 0x05c8, 0x05d0, 0x05da, 0x05da, 0x05e1, - 0x05e1, 0x05e1, 0x05e9, 0x05e9, 0x05e9, 0x05ec, 0x05ec, 0x05f5, - 0x05f5, 0x05fb, 0x0603, 0x060b, 0x060b, 0x060f, 0x0614, 0x0614, - 0x061e, 0x0622, 0x0627, 0x0627, 0x062b, 0x0630, 0x0630, 0x0642, - 0x064a, 0x064f, 0x0653, 0x0653, 0x0656, 0x065d, 0x065d, 0x065d, - 0x0661, 0x0661, 0x0665, 0x066b, 0x0672, 0x067a, 0x067e, 0x0682, - 0x0689, 0x068e, 0x0694, 0x069a, 0x069f, 0x06a6, 0x06ab, 0x06b2, - 0x06ba, 0x06c2, 0x06c6, 0x06d5, 0x06dc, 0x06e5, 0x06ed, 0x06f4, - // Entry 100 - 13F - 0x0701, 0x0706, 0x0706, 0x0716, 0x0732, 0x073b, 0x0741, 0x0747, - 0x074c, 0x0754, 0x0759, 0x075f, 0x0764, 0x0769, 0x076e, 0x077c, - 0x077c, 0x0781, 0x0791, 0x079b, 0x07a1, 0x07a7, 0x07ab, 0x07b1, - 0x07b1, 0x07c1, 0x07c7, 0x07ce, 0x07dc, 0x07dc, 0x07e2, 0x07e2, - 0x07e8, 0x07f0, 0x07f0, 0x07f3, 0x07f3, 0x0802, 0x0812, 0x0812, - 0x0826, 0x0836, 0x083e, 0x0840, 0x0846, 0x0849, 0x084d, 0x0852, - 0x0852, 0x0856, 0x0860, 0x0860, 0x0873, 0x0887, 0x0887, 0x088c, - 0x0895, 0x089c, 0x08a1, 0x08ae, 0x08bf, 0x08bf, 0x08bf, 0x08c4, - // Entry 140 - 17F - 0x08cd, 0x08d2, 0x08d7, 0x08df, 0x08df, 0x08e9, 0x08ef, 0x08f4, - 0x0901, 0x0906, 0x090a, 0x090e, 0x0914, 0x091b, 0x0922, 0x0922, - 0x0922, 0x0928, 0x092f, 0x0936, 0x0943, 0x0953, 0x0953, 0x095e, - 0x0964, 0x096a, 0x096d, 0x0972, 0x0976, 0x0980, 0x0987, 0x098b, - 0x0992, 0x099e, 0x099e, 0x09a2, 0x09a2, 0x09a7, 0x09b0, 0x09bc, - 0x09bc, 0x09bc, 0x09c0, 0x09c8, 0x09d1, 0x09dd, 0x09e4, 0x09ec, - 0x09f2, 0x0a01, 0x0a01, 0x0a01, 0x0a09, 0x0a0f, 0x0a17, 0x0a1c, - 0x0a23, 0x0a28, 0x0a2f, 0x0a35, 0x0a3a, 0x0a40, 0x0a45, 0x0a4d, - // Entry 180 - 1BF - 0x0a4d, 0x0a4d, 0x0a4d, 0x0a53, 0x0a53, 0x0a58, 0x0a5c, 0x0a6d, - 0x0a6d, 0x0a77, 0x0a7e, 0x0a83, 0x0a86, 0x0a8c, 0x0a91, 0x0a91, - 0x0a91, 0x0a99, 0x0a9d, 0x0aa3, 0x0aab, 0x0ab2, 0x0aba, 0x0ac0, - 0x0ac4, 0x0ac9, 0x0acf, 0x0ad4, 0x0ad8, 0x0ae0, 0x0af0, 0x0af5, - 0x0afc, 0x0b06, 0x0b11, 0x0b17, 0x0b1f, 0x0b26, 0x0b2b, 0x0b2b, - 0x0b32, 0x0b44, 0x0b49, 0x0b52, 0x0b59, 0x0b59, 0x0b5e, 0x0b63, - 0x0b6e, 0x0b75, 0x0b7f, 0x0b83, 0x0b90, 0x0b96, 0x0b9a, 0x0ba1, - 0x0ba1, 0x0ba7, 0x0bb0, 0x0bb5, 0x0bc5, 0x0bc5, 0x0bcb, 0x0bdc, - // Entry 1C0 - 1FF - 0x0be0, 0x0bf0, 0x0bf8, 0x0c00, 0x0c05, 0x0c0a, 0x0c0f, 0x0c1c, - 0x0c26, 0x0c2d, 0x0c35, 0x0c3f, 0x0c47, 0x0c47, 0x0c57, 0x0c57, - 0x0c57, 0x0c64, 0x0c64, 0x0c6c, 0x0c6c, 0x0c6c, 0x0c76, 0x0c7f, - 0x0c91, 0x0c98, 0x0c98, 0x0ca1, 0x0ca8, 0x0cb3, 0x0cb3, 0x0cb3, - 0x0cb8, 0x0cbe, 0x0cbe, 0x0cbe, 0x0cbe, 0x0cc5, 0x0cc8, 0x0ccf, - 0x0cd5, 0x0ce8, 0x0cef, 0x0cf4, 0x0cfb, 0x0cfb, 0x0d02, 0x0d07, - 0x0d10, 0x0d15, 0x0d15, 0x0d25, 0x0d2b, 0x0d2f, 0x0d2f, 0x0d35, - 0x0d44, 0x0d55, 0x0d55, 0x0d5e, 0x0d62, 0x0d71, 0x0d77, 0x0d77, - // Entry 200 - 23F - 0x0d77, 0x0d82, 0x0d8e, 0x0d9b, 0x0da8, 0x0db1, 0x0db9, 0x0dc3, - 0x0dc9, 0x0dcd, 0x0dcd, 0x0dd3, 0x0dd7, 0x0ddf, 0x0de8, 0x0dfa, - 0x0e02, 0x0e02, 0x0e02, 0x0e07, 0x0e0b, 0x0e11, 0x0e17, 0x0e1d, - 0x0e20, 0x0e2b, 0x0e2b, 0x0e32, 0x0e3b, 0x0e3b, 0x0e44, 0x0e56, - 0x0e5f, 0x0e5f, 0x0e65, 0x0e65, 0x0e6f, 0x0e6f, 0x0e76, 0x0e7f, - 0x0e86, 0x0e8f, 0x0ea9, 0x0eb0, 0x0eba, 0x0ec1, 0x0ec5, 0x0ec8, - 0x0ec8, 0x0ec8, 0x0ec8, 0x0ec8, 0x0ecf, 0x0ecf, 0x0ed4, 0x0eda, - 0x0ee2, 0x0ee7, 0x0eec, 0x0ef4, 0x0ef6, 0x0efc, 0x0efc, 0x0f02, - // Entry 240 - 27F - 0x0f05, 0x0f0b, 0x0f12, 0x0f17, 0x0f17, 0x0f20, 0x0f28, 0x0f36, - 0x0f36, 0x0f3c, 0x0f58, 0x0f5d, 0x0f77, 0x0f7b, 0x0f89, 0x0f92, - 0x0f92, 0x0fa8, 0x0fa8, 0x0fa8, 0x0fa8, 0x0fa8, 0x0fa8, 0x0fa8, - 0x0fa8, 0x0fa8, 0x0fa8, 0x0fa8, 0x0fb4, 0x0fbc, 0x0fbc, 0x0fbc, - 0x0fc5, 0x0fd1, 0x0fe1, 0x0ff5, 0x1008, -} // Size: 1250 bytes - -const ptPTLangStr string = "" + // Size: 882 bytes - "africanêschecochuvasheweestóniofrísico ocidentalhaúçahindiarménioigbocan" + - "arimgandamacedónionorueguês nynorsknorueguês bokmåloccitanoosséticopolac" + - "opastókinyarwandasami do nortetigríniaturcomanotongaiorubainglês antigom" + - "apuchebamunghomalaburiatjargão chinooksorani curdofrancês crioulo seselw" + - "aegípcio clássicofrancês antigofrísio orientalalemão alto antigogrego cl" + - "ássicoalemão suíçocabardianocrioulo cabo-verdianolezghianoluri do norte" + - "luomohawkbaixo-alemãonórdico antigolíngua pangasinesapersa antigolíngua " + - "pohnpeicaprovençal antigorajastanêssakhairlandês antigoárabe do Chadeina" + - "ri samirootvaisogaárabe moderno padrãoalemão austríacoalto alemão suíçoi" + - "nglês australianoinglês canadianoinglês britânicoinglês americanoespanho" + - "l latino-americanoespanhol europeufrancês canadianofrancês suíçobaixo-sa" + - "xãoportuguês do Brasilportuguês europeu" - -var ptPTLangIdx = []uint16{ // 608 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000f, 0x000f, 0x0016, 0x0016, 0x0016, - 0x0016, 0x0016, 0x0016, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x003a, - 0x003a, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x0047, 0x0047, - // Entry 40 - 7F - 0x0047, 0x0047, 0x0047, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, - 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, - 0x004b, 0x004b, 0x004b, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0061, - 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, - 0x0061, 0x0061, 0x0061, 0x0073, 0x0085, 0x0085, 0x0085, 0x0085, - 0x008d, 0x008d, 0x008d, 0x008d, 0x0096, 0x0096, 0x0096, 0x009c, - // Entry 80 - BF - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00ad, - 0x00ad, 0x00ad, 0x00ad, 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00ba, - 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00ba, - 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00c3, 0x00cc, - 0x00cc, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, - 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, - 0x00d1, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, - 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, - // Entry C0 - FF - 0x00d7, 0x00d7, 0x00e5, 0x00e5, 0x00e5, 0x00ec, 0x00ec, 0x00ec, - 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, - 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00f1, 0x00f1, - 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, - 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, - 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00fe, 0x00fe, 0x00fe, 0x00fe, - 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, - 0x00fe, 0x00fe, 0x00fe, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, - // Entry 100 - 13F - 0x0119, 0x0119, 0x0119, 0x0119, 0x0131, 0x0131, 0x0131, 0x0131, - 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, - 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, - 0x0131, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, - 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x0152, 0x0152, - 0x0152, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, - 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0175, 0x0175, 0x0175, - 0x0175, 0x0175, 0x0175, 0x0184, 0x0193, 0x0193, 0x0193, 0x0193, - // Entry 140 - 17F - 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, - 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, - 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, - 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x019d, 0x019d, 0x019d, - 0x019d, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, - 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, - 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, - 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01bb, - // Entry 180 - 1BF - 0x01bb, 0x01bb, 0x01bb, 0x01bb, 0x01bb, 0x01bb, 0x01bb, 0x01c8, - 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01cb, 0x01cb, 0x01cb, 0x01cb, - 0x01cb, 0x01cb, 0x01cb, 0x01cb, 0x01cb, 0x01cb, 0x01cb, 0x01cb, - 0x01cb, 0x01cb, 0x01cb, 0x01cb, 0x01cb, 0x01cb, 0x01cb, 0x01cb, - 0x01cb, 0x01cb, 0x01cb, 0x01cb, 0x01cb, 0x01d1, 0x01d1, 0x01d1, - 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, - 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01de, 0x01de, 0x01de, 0x01de, - 0x01de, 0x01de, 0x01de, 0x01de, 0x01ed, 0x01ed, 0x01ed, 0x01ed, - // Entry 1C0 - 1FF - 0x01ed, 0x01ed, 0x01ed, 0x01ed, 0x01ed, 0x01ed, 0x01ed, 0x01ed, - 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, - 0x0200, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x021d, 0x021d, - 0x022e, 0x022e, 0x022e, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, - 0x023e, 0x023e, 0x023e, 0x023e, 0x023e, 0x023e, 0x023e, 0x023e, - 0x023e, 0x023e, 0x023e, 0x023e, 0x023e, 0x023e, 0x023e, 0x023e, - 0x023e, 0x024e, 0x024e, 0x024e, 0x024e, 0x025d, 0x025d, 0x025d, - // Entry 200 - 23F - 0x025d, 0x025d, 0x025d, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, - 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, - 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, - 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, - 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, - 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x026b, 0x026e, - 0x026e, 0x026e, 0x026e, 0x026e, 0x026e, 0x026e, 0x026e, 0x026e, - 0x026e, 0x026e, 0x026e, 0x026e, 0x026e, 0x026e, 0x026e, 0x0272, - // Entry 240 - 27F - 0x0272, 0x0272, 0x0272, 0x0272, 0x0272, 0x0272, 0x0272, 0x0272, - 0x0272, 0x0272, 0x0272, 0x0272, 0x0272, 0x0272, 0x0288, 0x0288, - 0x029a, 0x02ae, 0x02c1, 0x02d2, 0x02e4, 0x02f5, 0x030e, 0x031e, - 0x031e, 0x031e, 0x0330, 0x0340, 0x034c, 0x034c, 0x0360, 0x0372, -} // Size: 1240 bytes - -const roLangStr string = "" + // Size: 4228 bytes - "afarabhazăavestanăafrikaansakanamharicăaragonezăarabăasamezăavarăaymaraa" + - "zerăbașkirăbielorusăbulgarăbislamabambarabengalezătibetanăbretonăbosniac" + - "ăcatalanăcecenăchamorrocorsicanăcreecehăslavonăciuvașăgalezădanezăgerma" + - "nădivehidzongkhaewegreacăenglezăesperantospaniolăestonăbascăpersanăfulah" + - "finlandezăfijianăfaroezăfrancezăfrizonă occidentalăirlandezăgaelică scoț" + - "ianăgalicianăguaranigujaratimanxhausaebraicăhindihiri motucroatăhaitiană" + - "maghiarăarmeanăhererointerlinguaindonezianăinterlingueigbosichuan yiinup" + - "iakidoislandezăitalianăinuktitutjaponezăjavanezăgeorgianăcongolezăkikuyu" + - "kuanyamakazahăkalaallisutkhmerăkannadacoreeanăkanuricașmirăkurdăkomicorn" + - "icăkârgâzălatinăluxemburghezăgandalimburghezălingalalaoțianălituanianălu" + - "ba-katangaletonămalgașămarshallezămaorimacedoneanămalayalammongolămarath" + - "imalaezămaltezăbirmanănaurundebele de nordnepalezăndonganeerlandezănorve" + - "giană nynorsknorvegiană bokmålndebele de sudnavajonyanjaoccitanăojibwaor" + - "omooriyaosetăpunjabipalipolonezăpaștunăportughezăquechuaromanșăkirundiro" + - "mânărusăkinyarwandasanscrităsardinianăsindhisami de nordsangosingalezăsl" + - "ovacăslovenăsamoanăshonasomalezăalbanezăsârbăswatisesothosundanezăsuedez" + - "ăswahilitamilătelugutadjicăthailandezătigrinăturkmenăsetswanatonganătur" + - "cătsongatătarătahitianăuigurăucraineanăurduuzbecăvendavietnamezăvolapukv" + - "alonăwolofxhosaidișyorubazhuangchinezăzuluacehacoliadangmeadygheafrihili" + - "aghemainuakkadianăaleutăaltaică meridionalăengleză vecheangikaaramaicăar" + - "aucanianăarapahoarawakasuasturianăawadhibaluchibalinezăbasaabamunghomala" + - "bejabembabenabafutbaluchi occidentalăbhojpuribikolbinikomsiksikabrajbodo" + - "akooseburiatbuginezăbulublinmedumbacaddocaribcayugaatsamcebuanăchigachib" + - "chachagataichuukesemarijargon chinookchoctawchipewyancherokeecheyennekur" + - "dă centralăcoptăturcă crimeeanăcreolă franceză seselwacașubianădakotadar" + - "gwataitadelawareslavedogribdinkazarmadogrisorabă de josdualaneerlandeză " + - "mediejola-fonyidyuladazagaembuefikegipteană vecheekajukelamităengleză me" + - "dieewondofangfilipinezăfonfranceză mediefranceză vechefrizonă nordicăfri" + - "zonă orientalăfriulanăgagăgăuzăchineză gangayogbayageezgilbertinăgermană" + - " înaltă mediegermană înaltă vechegondigorontalogoticăgrebogreacă vechege" + - "rmană (Elveția)gusiigwichʼinhaidachineză hakkahawaiianăhiligaynonhitităh" + - "mongsorabă de suschineză xianghupaibanibibioilokoingușălojbanngombamacha" + - "meiudeo-persanăiudeo-arabăkarakalpakkabylekachinjjukambakawikabardiankan" + - "embutyapmakondekabuverdianukorokhasikhotanezăkoyra chiinikakokalenjinkim" + - "bundukomi-permiakkonkanikosraekpellekaraceai-balkarkarelianăkurukhshamba" + - "labafiakölschkumykkutenailadinolangilahndalambalezghianlakotamongolozilu" + - "ri de nordluba-lulualuisenolundaluomizoluyiamadurezămafamagahimaithilima" + - "kasarmandingomasaimabamokshamandarmendemerumorisyenirlandeză mediemakhuw" + - "a-meettometa’micmacminangkabaumanciurianămanipurimohawkmossimundangmai m" + - "ulte limbicreekmirandezămarwarimyeneerzyamazanderanichineză min nannapol" + - "itanănamagermana de josnewariniasniueanăkwasiongiemboonnogainordică vech" + - "en’kosotho de nordnuernewari clasicănyamwezinyankolenyoronzimaosageturcă" + - " otomanăpangasinanpahlavipampangapapiamentopalauanăpidgin nigerianpersan" + - "ă vechefenicianăpohnpeianăprusacăprovensală vechequichérajasthanirapanu" + - "irarotonganromboromaniaromânărwasandawesakhaaramaică samariteanăsamburus" + - "asaksantalingambaysangusicilianăscotskurdă de sudsenecasenaselkupkoyrabo" + - "ro Senniirlandeză vechetachelhitshanarabă ciadianăsidamosami de sudlule " + - "samiinari samiskolt samisoninkesogdiensranan tongoserersahosukumasususum" + - "erianăcomorezăsiriacă clasicăsiriacătimnetesoterenotetumtigretivtokelauk" + - "lingonianătlingittamasheknyasa tongatok pisintarokotsimshiantumbukatuval" + - "utasawaqtuvanătamazight central marocanăudmurtugariticăumbundurootvaivot" + - "icăvunjowalserwolaitawaraywashowarlpirichineză wucalmucăsogayaoyapezăyan" + - "gbenyembacantonezăzapotecăsimboluri Bilsszenagatamazight standard maroca" + - "năzunifară conținut lingvisticzazaarabă standard modernăgermană standard" + - " (Elveția)saxona de josflamandămoldoveneascăsârbo-croatăswahili (R.D. Co" + - "ngo)chineză tradițională" - -var roLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000b, 0x0014, 0x001d, 0x0021, 0x002a, 0x0034, - 0x003a, 0x0042, 0x0048, 0x004e, 0x0054, 0x005d, 0x0067, 0x006f, - 0x0076, 0x007d, 0x0087, 0x0090, 0x0098, 0x00a1, 0x00aa, 0x00b1, - 0x00b9, 0x00c3, 0x00c7, 0x00cc, 0x00d4, 0x00dd, 0x00e4, 0x00eb, - 0x00f3, 0x00f9, 0x0101, 0x0104, 0x010b, 0x0113, 0x011c, 0x0125, - 0x012c, 0x0132, 0x013a, 0x013f, 0x014a, 0x0152, 0x015a, 0x0163, - 0x0178, 0x0182, 0x0195, 0x019f, 0x01a6, 0x01ae, 0x01b2, 0x01b7, - 0x01bf, 0x01c4, 0x01cd, 0x01d4, 0x01dd, 0x01e6, 0x01ee, 0x01f4, - // Entry 40 - 7F - 0x01ff, 0x020b, 0x0216, 0x021a, 0x0224, 0x022b, 0x022e, 0x0238, - 0x0241, 0x024a, 0x0253, 0x025c, 0x0266, 0x0270, 0x0276, 0x027e, - 0x0285, 0x0290, 0x0297, 0x029e, 0x02a7, 0x02ad, 0x02b6, 0x02bc, - 0x02c0, 0x02c8, 0x02d2, 0x02d9, 0x02e7, 0x02ec, 0x02f8, 0x02ff, - 0x0309, 0x0314, 0x0320, 0x0327, 0x0330, 0x033c, 0x0341, 0x034d, - 0x0356, 0x035e, 0x0365, 0x036d, 0x0375, 0x037d, 0x0382, 0x0391, - 0x039a, 0x03a0, 0x03ac, 0x03bf, 0x03d2, 0x03e0, 0x03e6, 0x03ec, - 0x03f5, 0x03fb, 0x0400, 0x0405, 0x040b, 0x0412, 0x0416, 0x041f, - // Entry 80 - BF - 0x0428, 0x0433, 0x043a, 0x0443, 0x044a, 0x0452, 0x0457, 0x0462, - 0x046c, 0x0477, 0x047d, 0x0489, 0x048e, 0x0498, 0x04a0, 0x04a8, - 0x04b0, 0x04b5, 0x04be, 0x04c7, 0x04ce, 0x04d3, 0x04da, 0x04e4, - 0x04ec, 0x04f3, 0x04fa, 0x0500, 0x0508, 0x0514, 0x051c, 0x0525, - 0x052d, 0x0535, 0x053b, 0x0541, 0x0549, 0x0553, 0x055a, 0x0565, - 0x0569, 0x0570, 0x0575, 0x0580, 0x0587, 0x058e, 0x0593, 0x0598, - 0x059d, 0x05a3, 0x05a9, 0x05b1, 0x05b5, 0x05b9, 0x05be, 0x05c5, - 0x05cb, 0x05cb, 0x05d3, 0x05d8, 0x05dc, 0x05e6, 0x05e6, 0x05ed, - // Entry C0 - FF - 0x05ed, 0x0602, 0x0610, 0x0616, 0x061f, 0x062b, 0x062b, 0x0632, - 0x0632, 0x0632, 0x0638, 0x0638, 0x0638, 0x063b, 0x063b, 0x0645, - 0x0645, 0x064b, 0x0652, 0x065b, 0x065b, 0x0660, 0x0665, 0x0665, - 0x066c, 0x0670, 0x0675, 0x0675, 0x0679, 0x067e, 0x067e, 0x0692, - 0x069a, 0x069f, 0x06a3, 0x06a3, 0x06a6, 0x06ad, 0x06ad, 0x06ad, - 0x06b1, 0x06b1, 0x06b5, 0x06bb, 0x06c1, 0x06ca, 0x06ce, 0x06d2, - 0x06d9, 0x06de, 0x06e3, 0x06e9, 0x06ee, 0x06f6, 0x06fb, 0x0702, - 0x070a, 0x0712, 0x0716, 0x0724, 0x072b, 0x0734, 0x073c, 0x0744, - // Entry 100 - 13F - 0x0754, 0x075a, 0x075a, 0x076b, 0x0784, 0x078f, 0x0795, 0x079b, - 0x07a0, 0x07a8, 0x07ad, 0x07b3, 0x07b8, 0x07bd, 0x07c2, 0x07d0, - 0x07d0, 0x07d5, 0x07e7, 0x07f1, 0x07f6, 0x07fc, 0x0800, 0x0804, - 0x0804, 0x0814, 0x081a, 0x0822, 0x0830, 0x0830, 0x0836, 0x0836, - 0x083a, 0x0845, 0x0845, 0x0848, 0x0848, 0x0857, 0x0866, 0x0866, - 0x0877, 0x088a, 0x0893, 0x0895, 0x089f, 0x08ab, 0x08af, 0x08b4, - 0x08b4, 0x08b8, 0x08c3, 0x08c3, 0x08da, 0x08f1, 0x08f1, 0x08f6, - 0x08ff, 0x0906, 0x090b, 0x0918, 0x092b, 0x092b, 0x092b, 0x0930, - // Entry 140 - 17F - 0x0939, 0x093e, 0x094c, 0x0956, 0x0956, 0x0960, 0x0967, 0x096c, - 0x097a, 0x0988, 0x098c, 0x0990, 0x0996, 0x099b, 0x09a3, 0x09a3, - 0x09a3, 0x09a9, 0x09af, 0x09b6, 0x09c4, 0x09d0, 0x09d0, 0x09da, - 0x09e0, 0x09e6, 0x09e9, 0x09ee, 0x09f2, 0x09fb, 0x0a02, 0x0a06, - 0x0a0d, 0x0a19, 0x0a19, 0x0a1d, 0x0a1d, 0x0a22, 0x0a2c, 0x0a38, - 0x0a38, 0x0a38, 0x0a3c, 0x0a44, 0x0a4c, 0x0a58, 0x0a5f, 0x0a65, - 0x0a6b, 0x0a7a, 0x0a7a, 0x0a7a, 0x0a84, 0x0a8a, 0x0a92, 0x0a97, - 0x0a9e, 0x0aa3, 0x0aaa, 0x0ab0, 0x0ab5, 0x0abb, 0x0ac0, 0x0ac8, - // Entry 180 - 1BF - 0x0ac8, 0x0ac8, 0x0ac8, 0x0ace, 0x0ace, 0x0ad3, 0x0ad7, 0x0ae3, - 0x0ae3, 0x0aed, 0x0af4, 0x0af9, 0x0afc, 0x0b00, 0x0b05, 0x0b05, - 0x0b05, 0x0b0e, 0x0b12, 0x0b18, 0x0b20, 0x0b27, 0x0b2f, 0x0b34, - 0x0b38, 0x0b3e, 0x0b44, 0x0b49, 0x0b4d, 0x0b55, 0x0b65, 0x0b73, - 0x0b7a, 0x0b80, 0x0b8b, 0x0b97, 0x0b9f, 0x0ba5, 0x0baa, 0x0baa, - 0x0bb1, 0x0bc0, 0x0bc5, 0x0bcf, 0x0bd6, 0x0bd6, 0x0bdb, 0x0be0, - 0x0beb, 0x0bfb, 0x0c06, 0x0c0a, 0x0c18, 0x0c1e, 0x0c22, 0x0c2a, - 0x0c2a, 0x0c30, 0x0c39, 0x0c3e, 0x0c4c, 0x0c4c, 0x0c52, 0x0c5f, - // Entry 1C0 - 1FF - 0x0c63, 0x0c72, 0x0c7a, 0x0c82, 0x0c87, 0x0c8c, 0x0c91, 0x0ca0, - 0x0caa, 0x0cb1, 0x0cb9, 0x0cc3, 0x0ccc, 0x0ccc, 0x0cdb, 0x0cdb, - 0x0cdb, 0x0ce9, 0x0ce9, 0x0cf3, 0x0cf3, 0x0cf3, 0x0cfe, 0x0d06, - 0x0d17, 0x0d1e, 0x0d1e, 0x0d28, 0x0d2f, 0x0d39, 0x0d39, 0x0d39, - 0x0d3e, 0x0d44, 0x0d44, 0x0d44, 0x0d44, 0x0d4d, 0x0d50, 0x0d57, - 0x0d5c, 0x0d72, 0x0d79, 0x0d7e, 0x0d85, 0x0d85, 0x0d8c, 0x0d91, - 0x0d9b, 0x0da0, 0x0da0, 0x0dad, 0x0db3, 0x0db7, 0x0db7, 0x0dbd, - 0x0dcc, 0x0ddc, 0x0ddc, 0x0de5, 0x0de9, 0x0df9, 0x0dff, 0x0dff, - // Entry 200 - 23F - 0x0dff, 0x0e0a, 0x0e13, 0x0e1d, 0x0e27, 0x0e2e, 0x0e35, 0x0e41, - 0x0e46, 0x0e4a, 0x0e4a, 0x0e50, 0x0e54, 0x0e5e, 0x0e67, 0x0e78, - 0x0e80, 0x0e80, 0x0e80, 0x0e85, 0x0e89, 0x0e8f, 0x0e94, 0x0e99, - 0x0e9c, 0x0ea3, 0x0ea3, 0x0eaf, 0x0eb6, 0x0eb6, 0x0ebe, 0x0ec9, - 0x0ed2, 0x0ed2, 0x0ed8, 0x0ed8, 0x0ee1, 0x0ee1, 0x0ee8, 0x0eee, - 0x0ef5, 0x0efc, 0x0f17, 0x0f1d, 0x0f27, 0x0f2e, 0x0f32, 0x0f35, - 0x0f35, 0x0f35, 0x0f35, 0x0f35, 0x0f3c, 0x0f3c, 0x0f41, 0x0f47, - 0x0f4e, 0x0f53, 0x0f58, 0x0f60, 0x0f6b, 0x0f73, 0x0f73, 0x0f77, - // Entry 240 - 27F - 0x0f7a, 0x0f81, 0x0f88, 0x0f8d, 0x0f8d, 0x0f97, 0x0fa0, 0x0faf, - 0x0faf, 0x0fb5, 0x0fd1, 0x0fd5, 0x0fef, 0x0ff3, 0x100b, 0x100b, - 0x100b, 0x1027, 0x1027, 0x1027, 0x1027, 0x1027, 0x1027, 0x1027, - 0x1027, 0x1027, 0x1027, 0x1027, 0x1034, 0x103d, 0x103d, 0x103d, - 0x104b, 0x1059, 0x106d, 0x106d, 0x1084, -} // Size: 1250 bytes - -const ruLangStr string = "" + // Size: 9389 bytes - "афарскийабхазскийавестийскийафрикаансаканамхарскийарагонскийарабскийасса" + - "мскийаварскийаймараазербайджанскийбашкирскийбелорусскийболгарскийбислам" + - "абамбарабенгальскийтибетскийбретонскийбоснийскийкаталанскийчеченскийчам" + - "оррокорсиканскийкричешскийцерковнославянскийчувашскийваллийскийдатскийн" + - "емецкиймальдивскийдзонг-кээвегреческийанглийскийэсперантоиспанскийэстон" + - "скийбаскскийперсидскийфулахфинскийфиджифарерскийфранцузскийзападный фри" + - "зскийирландскийгэльскийгалисийскийгуаранигуджаратимэнскийхаусаивритхинд" + - "ихиримотухорватскийгаитянскийвенгерскийармянскийгерероинтерлингваиндоне" + - "зийскийинтерлингвеигбоносуинупиакидоисландскийитальянскийинуктитутяпонс" + - "кийяванскийгрузинскийконгокикуйюкунамаказахскийгренландскийкхмерскийкан" + - "надакорейскийканурикашмирикурдскийкомикорнскийкиргизскийлатинскийлюксем" + - "бургскийгандалимбургскийлингалалаосскийлитовскийлуба-катангалатышскийма" + - "лагасийскиймаршалльскиймаоримакедонскиймалаяламмонгольскиймаратхималайс" + - "киймальтийскийбирманскийнаурусеверный ндебеленепальскийндонганидерландс" + - "кийнюнорскнорвежский букмолюжный ндебеленавахоньянджаокситанскийоджибва" + - "оромоорияосетинскийпанджабипалипольскийпуштупортугальскийкечуароманшски" + - "йрундирумынскийрусскийкиньяруандасанскритсардинскийсиндхисеверносаамски" + - "йсангосингальскийсловацкийсловенскийсамоанскийшонасомалиалбанскийсербск" + - "ийсвазиюжный сотосунданскийшведскийсуахилитамильскийтелугутаджикскийтай" + - "скийтигриньятуркменскийтсванатонганскийтурецкийтсонгататарскийтаитянски" + - "йуйгурскийукраинскийурдуузбекскийвендавьетнамскийволапюкваллонскийволоф" + - "косаидишйорубачжуанькитайскийзулуачехскийачолиадангмеадыгейскийафрихили" + - "агхемайнуаккадскийалеутскийюжноалтайскийстароанглийскийангикаарамейский" + - "мапучеарапахоаравакскийасуастурийскийавадхибелуджскийбалийскийбасабамум" + - "гомалабеджабембабенабафутзападный белуджскийбходжпурибикольскийбиникомс" + - "иксикабрауибодоакоосебурятскийбугийскийбулубилинмедумбакаддокарибкайюга" + - "атсамсебуанокигачибчачагатайскийчукотскиймарийскийчинук жаргончоктавчип" + - "евьянчерокичейеннсораникоптскийкрымско-татарскийсейшельский креольскийк" + - "ашубскийдакотадаргинскийтаитаделаварскийслейвидогрибдинкаджермадогриниж" + - "нелужицкийдуаласредненидерландскийдиола-фоньидиуладазаэмбуэфикдревнееги" + - "петскийэкаджукэламскийсреднеанглийскийэвондофангфилиппинскийфонсреднефр" + - "анцузскийстарофранцузскийсеверный фризскийвосточный фризскийфриульскийг" + - "агагаузскийганьгайогбаягеэзгильбертскийсредневерхненемецкийдревневерхне" + - "немецкийгондигоронталоготскийгребодревнегреческийшвейцарский немецкийгу" + - "сиигвичинхайдахаккагавайскийхилигайнонхеттскийхмонгверхнелужицкийсянхуп" + - "аибанскийибибиоилокоингушскийложбаннгомбамачамееврейско-персидскийеврей" + - "ско-арабскийкаракалпакскийкабильскийкачинскийкаджикамбакавикабардинский" + - "канембутьяпмакондекабувердьянукорокхасихотанскийкойра чииникакокаленджи" + - "нкимбундукоми-пермяцкийконканикосраенскийкпеллекарачаево-балкарскийкаре" + - "льскийкурухшамбалабафиякёльнскийкумыкскийкутенаиладиноланголахндаламбал" + - "езгинскийлакотамонголозисевернолурскийлуба-лулуалуисеньолундалуолушейлу" + - "хьямадурскиймафамагахимайтхилимакассарскиймандингомасаимабамокшанскийма" + - "ндарскиймендемерумаврикийский креольскийсреднеирландскиймакуа-мееттомет" + - "амикмакминангкабауманьчжурскийманипурскиймохаукмосимундангязыки разных " + - "семейкрикмирандскиймарваримиенеэрзянскиймазендеранскийминьнаньнеаполита" + - "нскийнаманижнегерманскийневарскийниасниуэквасионгиембундногайскийстарон" + - "орвежскийнкосеверный сотонуэрклассический невариньямвезиньянколеньоронз" + - "имаоседжистаротурецкийпангасинанпехлевийскийпампангапапьяментопалауниге" + - "рийско-креольскийстароперсидскийфиникийскийпонапепрусскийстаропровансал" + - "ьскийкичераджастханирапануйскийраротонгаромбоцыганскийарумынскийруандас" + - "андавеякутскийсамаритянский арамейскийсамбурусасакскийсанталингамбайски" + - "йсангусицилийскийшотландскийюжнокурдскийсенекасенаселькупскийкойраборо " + - "сеннистароирландскийташельхитшанскийчадский арабскийсидамаюжносаамскийл" + - "уле-саамскийинари-саамскийколтта-саамскийсонинкесогдийскийсранан-тонгос" + - "ерерсахосукумасусушумерскийкоморскийклассический сирийскийсирийскийтемн" + - "етесотеренотетумтигретивитокелайскийклингонскийтлингиттамашектонгаток-п" + - "исинтуройоседекскийцимшиантумбукатувалутасавактувинскийсреднеатласский " + - "тамазигхтскийудмуртскийугаритскийумбундукорневой языкваиводскийвунджова" + - "ллисскийволамоварайвашовальбиривукалмыцкийсогаяояпянгбенйембакантонский" + - "сапотекскийблиссимволиказенагскийтамазигхтскийзуньинет языкового матери" + - "алазазаарабский литературныйавстрийский немецкийлитературный швейцарски" + - "й немецкийавстралийский английскийканадский английскийбританский англий" + - "скийамериканский английскийлатиноамериканский испанскийевропейский испа" + - "нскиймексиканский испанскийканадский французскийшвейцарский французский" + - "нижнесаксонскийфламандскийбразильский португальскийевропейский португал" + - "ьскиймолдавскийсербскохорватскийконголезский суахиликитайский, упрощенн" + - "ое письмокитайский, традиционное письмо" - -var ruLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0022, 0x0038, 0x004a, 0x0052, 0x0064, 0x0078, - 0x0088, 0x009a, 0x00aa, 0x00b6, 0x00d4, 0x00e8, 0x00fe, 0x0112, - 0x0120, 0x012e, 0x0144, 0x0156, 0x016a, 0x017e, 0x0194, 0x01a6, - 0x01b4, 0x01cc, 0x01d2, 0x01e0, 0x0204, 0x0216, 0x022a, 0x0238, - 0x0248, 0x025e, 0x026d, 0x0273, 0x0285, 0x0299, 0x02ab, 0x02bd, - 0x02cf, 0x02df, 0x02f3, 0x02fd, 0x030b, 0x0315, 0x0327, 0x033d, - 0x035e, 0x0372, 0x0382, 0x0398, 0x03a6, 0x03b8, 0x03c6, 0x03d0, - 0x03da, 0x03e4, 0x03f4, 0x0408, 0x041c, 0x0430, 0x0442, 0x044e, - // Entry 40 - 7F - 0x0464, 0x047e, 0x0494, 0x049c, 0x04a4, 0x04b2, 0x04b8, 0x04cc, - 0x04e2, 0x04f4, 0x0504, 0x0514, 0x0528, 0x0532, 0x053e, 0x054a, - 0x055c, 0x0574, 0x0586, 0x0594, 0x05a6, 0x05b2, 0x05c0, 0x05d0, - 0x05d8, 0x05e8, 0x05fc, 0x060e, 0x062a, 0x0634, 0x064a, 0x0658, - 0x0668, 0x067a, 0x0691, 0x06a3, 0x06bd, 0x06d5, 0x06df, 0x06f5, - 0x0705, 0x071b, 0x0729, 0x073b, 0x0751, 0x0765, 0x076f, 0x078e, - 0x07a2, 0x07ae, 0x07c8, 0x07d6, 0x07f7, 0x0810, 0x081c, 0x082a, - 0x0840, 0x084e, 0x0858, 0x0860, 0x0874, 0x0884, 0x088c, 0x089c, - // Entry 80 - BF - 0x08a6, 0x08c0, 0x08ca, 0x08de, 0x08e8, 0x08fa, 0x0908, 0x091e, - 0x092e, 0x0942, 0x094e, 0x096c, 0x0976, 0x098c, 0x099e, 0x09b2, - 0x09c6, 0x09ce, 0x09da, 0x09ec, 0x09fc, 0x0a06, 0x0a19, 0x0a2d, - 0x0a3d, 0x0a4b, 0x0a5f, 0x0a6b, 0x0a7f, 0x0a8d, 0x0a9d, 0x0ab3, - 0x0abf, 0x0ad3, 0x0ae3, 0x0aef, 0x0b01, 0x0b15, 0x0b27, 0x0b3b, - 0x0b43, 0x0b55, 0x0b5f, 0x0b75, 0x0b83, 0x0b97, 0x0ba1, 0x0ba9, - 0x0bb1, 0x0bbd, 0x0bc9, 0x0bdb, 0x0be3, 0x0bf3, 0x0bfd, 0x0c0b, - 0x0c1f, 0x0c1f, 0x0c2f, 0x0c39, 0x0c41, 0x0c53, 0x0c53, 0x0c65, - // Entry C0 - FF - 0x0c65, 0x0c7f, 0x0c9d, 0x0ca9, 0x0cbd, 0x0cc9, 0x0cc9, 0x0cd7, - 0x0cd7, 0x0cd7, 0x0ceb, 0x0ceb, 0x0ceb, 0x0cf1, 0x0cf1, 0x0d07, - 0x0d07, 0x0d13, 0x0d27, 0x0d39, 0x0d39, 0x0d41, 0x0d4b, 0x0d4b, - 0x0d57, 0x0d61, 0x0d6b, 0x0d6b, 0x0d73, 0x0d7d, 0x0d7d, 0x0da2, - 0x0db4, 0x0dc8, 0x0dd0, 0x0dd0, 0x0dd6, 0x0de4, 0x0de4, 0x0de4, - 0x0dee, 0x0dee, 0x0df6, 0x0e02, 0x0e14, 0x0e26, 0x0e2e, 0x0e38, - 0x0e46, 0x0e50, 0x0e5a, 0x0e66, 0x0e70, 0x0e7e, 0x0e86, 0x0e90, - 0x0ea6, 0x0eb8, 0x0eca, 0x0ee1, 0x0eed, 0x0efd, 0x0f09, 0x0f15, - // Entry 100 - 13F - 0x0f21, 0x0f31, 0x0f31, 0x0f52, 0x0f7d, 0x0f8f, 0x0f9b, 0x0faf, - 0x0fb9, 0x0fcf, 0x0fdb, 0x0fe7, 0x0ff1, 0x0ffd, 0x1007, 0x1021, - 0x1021, 0x102b, 0x1051, 0x1066, 0x1070, 0x1078, 0x1080, 0x1088, - 0x1088, 0x10a8, 0x10b6, 0x10c6, 0x10e6, 0x10e6, 0x10f2, 0x10f2, - 0x10fa, 0x1112, 0x1112, 0x1118, 0x1118, 0x113a, 0x115a, 0x115a, - 0x117b, 0x119e, 0x11b2, 0x11b6, 0x11ca, 0x11d2, 0x11da, 0x11e2, - 0x11e2, 0x11ea, 0x1202, 0x1202, 0x122a, 0x1252, 0x1252, 0x125c, - 0x126e, 0x127c, 0x1286, 0x12a4, 0x12cb, 0x12cb, 0x12cb, 0x12d5, - // Entry 140 - 17F - 0x12e1, 0x12eb, 0x12f5, 0x1307, 0x1307, 0x131b, 0x132b, 0x1335, - 0x1351, 0x1357, 0x135f, 0x136f, 0x137b, 0x1385, 0x1397, 0x1397, - 0x1397, 0x13a3, 0x13af, 0x13bb, 0x13e0, 0x1401, 0x1401, 0x141d, - 0x1431, 0x1443, 0x144d, 0x1457, 0x145f, 0x1477, 0x1485, 0x148d, - 0x149b, 0x14b3, 0x14b3, 0x14bb, 0x14bb, 0x14c5, 0x14d7, 0x14ec, - 0x14ec, 0x14ec, 0x14f4, 0x1506, 0x1516, 0x1531, 0x153f, 0x1555, - 0x1561, 0x1588, 0x1588, 0x1588, 0x159c, 0x15a6, 0x15b4, 0x15be, - 0x15d0, 0x15e2, 0x15f0, 0x15fc, 0x1606, 0x1612, 0x161c, 0x1630, - // Entry 180 - 1BF - 0x1630, 0x1630, 0x1630, 0x163c, 0x163c, 0x1646, 0x164e, 0x166a, - 0x166a, 0x167d, 0x168d, 0x1697, 0x169d, 0x16a7, 0x16b1, 0x16b1, - 0x16b1, 0x16c3, 0x16cb, 0x16d7, 0x16e7, 0x16ff, 0x170f, 0x1719, - 0x1721, 0x1735, 0x1749, 0x1753, 0x175b, 0x1788, 0x17a8, 0x17bf, - 0x17c7, 0x17d3, 0x17e9, 0x1801, 0x1817, 0x1823, 0x182b, 0x182b, - 0x1839, 0x185b, 0x1863, 0x1877, 0x1885, 0x1885, 0x188f, 0x18a1, - 0x18bd, 0x18cd, 0x18e9, 0x18f1, 0x190f, 0x1921, 0x1929, 0x1931, - 0x1931, 0x193d, 0x194f, 0x1961, 0x197f, 0x197f, 0x1985, 0x199e, - // Entry 1C0 - 1FF - 0x19a6, 0x19cb, 0x19db, 0x19eb, 0x19f5, 0x19ff, 0x1a0b, 0x1a25, - 0x1a39, 0x1a51, 0x1a61, 0x1a75, 0x1a7f, 0x1a7f, 0x1aa8, 0x1aa8, - 0x1aa8, 0x1ac6, 0x1ac6, 0x1adc, 0x1adc, 0x1adc, 0x1ae8, 0x1af8, - 0x1b1e, 0x1b26, 0x1b26, 0x1b3c, 0x1b52, 0x1b64, 0x1b64, 0x1b64, - 0x1b6e, 0x1b80, 0x1b80, 0x1b80, 0x1b80, 0x1b94, 0x1ba0, 0x1bae, - 0x1bbe, 0x1bed, 0x1bfb, 0x1c0d, 0x1c1b, 0x1c1b, 0x1c31, 0x1c3b, - 0x1c51, 0x1c67, 0x1c67, 0x1c7f, 0x1c8b, 0x1c93, 0x1c93, 0x1ca9, - 0x1cc6, 0x1ce4, 0x1ce4, 0x1cf6, 0x1d04, 0x1d23, 0x1d2f, 0x1d2f, - // Entry 200 - 23F - 0x1d2f, 0x1d47, 0x1d60, 0x1d7b, 0x1d98, 0x1da6, 0x1dba, 0x1dd1, - 0x1ddb, 0x1de3, 0x1de3, 0x1def, 0x1df7, 0x1e09, 0x1e1b, 0x1e46, - 0x1e58, 0x1e58, 0x1e58, 0x1e62, 0x1e6a, 0x1e76, 0x1e80, 0x1e8a, - 0x1e92, 0x1ea8, 0x1ea8, 0x1ebe, 0x1ecc, 0x1ecc, 0x1eda, 0x1ee4, - 0x1ef5, 0x1f01, 0x1f13, 0x1f13, 0x1f21, 0x1f21, 0x1f2f, 0x1f3b, - 0x1f49, 0x1f5b, 0x1f94, 0x1fa8, 0x1fbc, 0x1fca, 0x1fe3, 0x1fe9, - 0x1fe9, 0x1fe9, 0x1fe9, 0x1fe9, 0x1ff7, 0x1ff7, 0x2003, 0x2017, - 0x2023, 0x202d, 0x2035, 0x2045, 0x2049, 0x205b, 0x205b, 0x2063, - // Entry 240 - 27F - 0x2067, 0x206b, 0x2077, 0x2081, 0x2081, 0x2095, 0x20ab, 0x20c5, - 0x20c5, 0x20d7, 0x20f1, 0x20fb, 0x2127, 0x212f, 0x2158, 0x2158, - 0x217f, 0x21bf, 0x21ee, 0x2215, 0x223e, 0x226b, 0x22a2, 0x22cb, - 0x22f6, 0x22f6, 0x231f, 0x234c, 0x236a, 0x2380, 0x23b1, 0x23e2, - 0x23f6, 0x2418, 0x243f, 0x2474, 0x24ad, -} // Size: 1250 bytes - -const siLangStr string = "" + // Size: 9440 bytes - "අෆාර්ඇබ්කාසියානුඅප්\u200dරිකානුඅකාන්ඇම්හාරික්ඇරගොනීස්අරාබිඇසමියානුඇවරික්" + - "අයිමරාඅසර්බයිජාන්බාෂ්කිර්බෙලරුසියානුබල්ගේරියානුබිස්ලමාබම්බරාබෙංගාලිටිබ" + - "ෙට්බ්\u200dරේටොන්බොස්නියානුකැටලන්චෙච්නියානුචමොරොක්\u200dරොඑශියානුචෙත්ච" + - "ර්ච් ස්ලැවික්චවේෂ්වේල්ස්ඩැනිශ්ජර්මන්දිවෙහිඩිසොන්කාඉව්ග්\u200dරීකඉංග්" + - "\u200dරීසිඑස්පැරන්ටෝස්පාඤ්ඤඑස්තෝනියානුබොස්කෝපර්සියානුෆුලාහ්ෆින්ලන්තෆීජිෆ" + - "ාරෝස්ප්\u200dරංශබටහිර ෆ්\u200dරිසියානුඅයර්ලන්තස්කොට්ටිශ් ගෙලික්ගැලීසිය" + - "ානුගුවාරනිගුජරාටිමැන්ක්ස්හෝසාහීබෲහින්දික්\u200dරෝයේශියානුහයිටිහන්ගේරිය" + - "ානුආර්මේනියානුහෙරෙරොඉන්ටලින්ගුආඉන්දුනීසියානුඉග්බෝසිචුආන් යීඉඩොඅයිස්ලන්" + - "තඉතාලිඉනුක්ටිටුට්ජපන්ජාවාජෝර්ජියානුකිකුයුකුයන්යමාකසාඛ්කලාලිසට්කමර්කණ්ණ" + - "ඩකොරියානුකනුරිකාෂ්මීර්කුර්දිකොමිකෝනීසියානුකිර්ගිස්ලතින්ලක්සැම්බර්ග්ගන්" + - "ඩාලිම්බර්ගිශ්ලින්ගලාලාඕලිතුවේනියානුලුලැට්වියානුමලගාසිමාශලීස්මාවොරිමැසි" + - "ඩෝනියානුමලයාලම්මොංගෝලියානුමරාතිමැලේමොල්ටිස්බුරුමනෞරුඋතුරු එන්ඩිබෙලෙනේප" + - "ාලන්ඩොන්ගාලන්දේසිනොවේර්ජියානු නයිනෝර්ස්ක්නෝවේජියානු බොක්මාල්සෞත් ඩ්බේල" + - "්නවාජොන්යන්ජාඔසිටාන්ඔරොමෝඔරියාඔසිටෙක්පන්ජාබිපෝලන්තපෂ්ටොපෘතුගීසික්වීචුව" + - "ාරොමෑන්ශ්රුන්ඩිරොමේනියානුරුසියානුකින්යර්වන්ඩාසංස්කෘතසාර්ඩිනිඅන්සින්ධිඋ" + - "තුරු සාමිසන්ග්\u200dරෝසිංහලස්ලෝවැක්ස්ලෝවේනියානුසෑමොඅන්ශෝනාසෝමාලිඇල්බේන" + - "ියානුසර්බියානුස්වතිසතර්න් සොතොසන්ඩනීසියානුස්වීඩන්ස්වාහිලිදෙමළතෙළිඟුටජි" + - "ක්තායිටිග්\u200dරින්යාටර්ක්මෙන්ස්වනාටොංගාතුර්කිසොන්ගටාටර්ටහිටියන්උයිගර" + - "්යුක්රේනියානුඋර්දුඋස්බෙක්වෙන්ඩාවියට්නාම්වොලපූක්වෑලූන්වොලොෆ්ශෝසායිඩිශ්ය" + - "ොරූබාචීනසුලුඅචයිනිස්අඩන්ග්මෙඅඩිඝෙටියුනිසියනු අරාබිඇගම්අයිනුඇලුඑට්සතර්න" + - "් අල්ටය්අන්ගිකමපුචෙඇරපහොඅසුඇස්ටියුරියන්අවදිබැලිනීස්බසාබෙම්බාබෙනාබටහිර " + - "බලොචිබොජ්පුරිබිනිසික්සිකාබොඩොබුගිනීස්බ්ලින්සෙබුඅනොචිගාචූකීස්මරිචොක්ටොව" + - "්චෙරොකීචෙයෙන්නෙසොරානි කුර්දිෂ්සෙසෙල්ව ක්\u200dරොල් ෆ්\u200dරෙන්ච්ඩකොටා" + - "ඩාර්ග්වාටයිටාඩොග්\u200dරිබ්සර්මාපහළ සෝබියානුඩුආලාජොල-ෆෝනියිඩසාගාඑම්බුඑ" + - "ෆික්එකජුක්එවොන්ඩොපිලිපීනෆොන්ෆ්\u200dරියුලියන්ගාගගාස්ගැන් චයිනිස්ගීස්ගි" + - "ල්බර්ටීස්ගොරොන්ටාලොස්විස් ජර්මානුගුසීග්විචින්හකා චයිනිස්හවායිහිලිගෙනන්" + - "මොන්ග්ඉහළ සෝබියානුසියැන් චීනහුපාඉබන්ඉබිබියොඉලොකොඉන්ගුෂ්ලොජ්බන්නොම්බාමැ" + - "කාමීකැබලාකචින්ජ්ජුකැම්බාකබාර්ඩියන්ට්යප්මැකොන්ඩ්කබුවෙර්ඩියානෝකොරොඛසිකොය" + - "ිරා චිනිකකොකලෙන්ජන්කිම්බුන්ඩුකොමි-පර්මියාක්කොන්කනික්පෙලෙකරන්චි-බාකර්කැ" + - "රෙලියන්කුරුඛ්ශාම්බලාබාෆියාකොලොග්නියන්කුමික්ලඩිනොලංගිලෙස්ගියන්ලකොටලොසිඋ" + - "තුරු ලුරිලුබ-ලුලුඅලුන්ඩලුඔමිසොලුයියාමදුරීස්මඝහිමයිතිලිමකාසාර්මසායිමොක්" + - "ශාමෙන්ඩෙමෙරුමොරිස්යෙම්මඛුවා-මීටෝමෙටාමික්මැක්මිනන්ග්කබාවුමනිපුරිමොහොව්ක" + - "්මොස්සිමුන්ඩන්බහු භාෂාක්\u200dරීක්මිරන්ඩීස්එර්ස්යාමැසන්ඩරනිමින් නන් චය" + - "ිනිස්නියාපොලිටන්නාමාපහළ ජර්මන්නෙවාරිනියාස්නියුඑන්කුවාසිඔන්ගියාම්බූන්නො" + - "ගායිඑන්‘කෝනොදර්න් සොතොනොයර්නයන්කොළේපන්ගසීනන්පන්පන්ගපපියමෙන්ටොපලවුවන්නෛ" + - "ජීරියන් පෙන්ගින්පෘශියන්කියිචේරපනුයිරරොටොන්ගන්රෝම්බෝඇරොමෙන්යන්ර්වාසන්ඩව" + - "ෙසඛාසම්බුරුසෑන්ටලින්ගම්බෙසංගුසිසිලියන්ස්කොට්ස්දකුණු කුර්දිසෙනාකෝයිරාබො" + - "රො සෙන්නිටචේල්හිට්ශාන්දකුණු සාමිලුලේ සාමිඉනාරි සාමිස්කොල්ට් සාමිසොනින්" + - "කෙස්\u200dරන් ටොන්ගොසහොසුකුමාකොමොරියන්ස්\u200dරයෑක්ටිම්නෙටෙසෝටේටම්ටීග්" + - "\u200dරෙක්ලින්ගොන්ටොක් පිසින්ටරොකොටුම්බුකාටුවාලුටසවාක්ටුවිනියන්මධ්\u200d" + - "යම ඇට්ලස් ටමසිට්අඩ්මර්ට්උබුන්ඩුරූට්වයිවුන්ජෝවොල්සර්වොලෙට්ටවොරෙය්වොපිරි" + - "වූ චයිනිස්කල්මික්සොගායන්ග්බෙන්යෙම්බාකැන්ටොනීස්සම්මත මොරොක්කෝ ටමසිග්ත්ස" + - "ුනිවාග් විද්\u200dයා අන්තර්ගතයක් නැතසාසානවීන සම්මත අරාබිඔස්ට්\u200dරිය" + - "ානු ජර්මන්ස්විස් උසස් ජර්මන්ඕස්ට්\u200dරේලියානු ඉංග්\u200dරීසිකැනේඩියා" + - "නු ඉංග්\u200dරීසිබ්\u200dරිතාන්\u200dය ඉංග්\u200dරීසිඇමෙරිකානු ඉංග්" + - "\u200dරීසිලතින් ඇමරිකානු ස්පාඤ්ඤයුරෝපීය ස්පාඤ්ඤමෙක්සිකානු ස්පාඤ්ඤකැනේඩිය" + - "ානු ප්\u200dරංශස්විස් ප්\u200dරංශපහළ සැක්සන්ෆ්ලෙමිශ්බ්\u200dරසීල පෘතුග" + - "ීසියුරෝපීය පෘතුගීසිමොල්ඩවිආනුසුළුකළ චීනසාම්ප්\u200dරදායික චීන" - -var siLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x0030, 0x0030, 0x004e, 0x005d, 0x0078, 0x0090, - 0x009f, 0x00b7, 0x00c9, 0x00db, 0x00fc, 0x0114, 0x0135, 0x0156, - 0x016b, 0x017d, 0x0192, 0x01a4, 0x01bf, 0x01dd, 0x01ef, 0x020d, - 0x021c, 0x0240, 0x0240, 0x024c, 0x0274, 0x0283, 0x0295, 0x02a7, - 0x02b9, 0x02cb, 0x02e3, 0x02ec, 0x02fe, 0x0319, 0x0337, 0x034c, - 0x036d, 0x037f, 0x039a, 0x03ac, 0x03c4, 0x03d0, 0x03e2, 0x03f4, - 0x0425, 0x043d, 0x046e, 0x048c, 0x04a1, 0x04b6, 0x04ce, 0x04da, - 0x04e6, 0x04f8, 0x04f8, 0x051f, 0x052e, 0x054f, 0x0570, 0x0582, - // Entry 40 - 7F - 0x05a3, 0x05ca, 0x05ca, 0x05d9, 0x05f5, 0x05f5, 0x05fe, 0x0619, - 0x0628, 0x0649, 0x0655, 0x0661, 0x067f, 0x067f, 0x0691, 0x06a9, - 0x06b8, 0x06d0, 0x06dc, 0x06eb, 0x0703, 0x0712, 0x072a, 0x073c, - 0x0748, 0x0766, 0x077e, 0x078d, 0x07b1, 0x07c0, 0x07e1, 0x07f6, - 0x07ff, 0x0823, 0x0829, 0x0847, 0x0859, 0x086e, 0x0880, 0x08a4, - 0x08b9, 0x08da, 0x08e9, 0x08f5, 0x090d, 0x091c, 0x0928, 0x0953, - 0x0962, 0x097a, 0x098f, 0x09d5, 0x0a0c, 0x0a2b, 0x0a3a, 0x0a4f, - 0x0a64, 0x0a64, 0x0a73, 0x0a82, 0x0a97, 0x0aac, 0x0aac, 0x0abe, - // Entry 80 - BF - 0x0acd, 0x0ae5, 0x0afd, 0x0b15, 0x0b27, 0x0b45, 0x0b5d, 0x0b81, - 0x0b96, 0x0bb7, 0x0bc9, 0x0be5, 0x0bfd, 0x0c0c, 0x0c24, 0x0c48, - 0x0c5d, 0x0c69, 0x0c7b, 0x0c9c, 0x0cb7, 0x0cc6, 0x0ce5, 0x0d09, - 0x0d1e, 0x0d36, 0x0d42, 0x0d54, 0x0d63, 0x0d6f, 0x0d90, 0x0dab, - 0x0dba, 0x0dc9, 0x0ddb, 0x0dea, 0x0df9, 0x0e11, 0x0e23, 0x0e47, - 0x0e56, 0x0e6b, 0x0e7d, 0x0e98, 0x0ead, 0x0ebf, 0x0ed1, 0x0edd, - 0x0eef, 0x0f01, 0x0f01, 0x0f0a, 0x0f16, 0x0f2e, 0x0f2e, 0x0f46, - 0x0f55, 0x0f86, 0x0f86, 0x0f92, 0x0fa1, 0x0fa1, 0x0fa1, 0x0fb3, - // Entry C0 - FF - 0x0fb3, 0x0fd8, 0x0fd8, 0x0fea, 0x0fea, 0x0ff9, 0x0ff9, 0x1008, - 0x1008, 0x1008, 0x1008, 0x1008, 0x1008, 0x1011, 0x1011, 0x1035, - 0x1035, 0x1041, 0x1041, 0x1059, 0x1059, 0x1062, 0x1062, 0x1062, - 0x1062, 0x1062, 0x1074, 0x1074, 0x1080, 0x1080, 0x1080, 0x109f, - 0x10b7, 0x10b7, 0x10c3, 0x10c3, 0x10c3, 0x10db, 0x10db, 0x10db, - 0x10db, 0x10db, 0x10e7, 0x10e7, 0x10e7, 0x10ff, 0x10ff, 0x1111, - 0x1111, 0x1111, 0x1111, 0x1111, 0x1111, 0x1126, 0x1132, 0x1132, - 0x1132, 0x1144, 0x114d, 0x114d, 0x1165, 0x1165, 0x1177, 0x118f, - // Entry 100 - 13F - 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x1201, 0x1201, 0x1210, 0x1228, - 0x1237, 0x1237, 0x1237, 0x1252, 0x1252, 0x1261, 0x1261, 0x1283, - 0x1283, 0x1292, 0x1292, 0x12ae, 0x12ae, 0x12bd, 0x12cc, 0x12db, - 0x12db, 0x12db, 0x12ed, 0x12ed, 0x12ed, 0x12ed, 0x1302, 0x1302, - 0x1302, 0x1317, 0x1317, 0x1323, 0x1323, 0x1323, 0x1323, 0x1323, - 0x1323, 0x1323, 0x1347, 0x134d, 0x135c, 0x137e, 0x137e, 0x137e, - 0x137e, 0x138a, 0x13ab, 0x13ab, 0x13ab, 0x13ab, 0x13ab, 0x13ab, - 0x13c9, 0x13c9, 0x13c9, 0x13c9, 0x13f1, 0x13f1, 0x13f1, 0x13fd, - // Entry 140 - 17F - 0x1415, 0x1415, 0x1434, 0x1443, 0x1443, 0x145e, 0x145e, 0x1470, - 0x1492, 0x14ae, 0x14ba, 0x14c6, 0x14db, 0x14ea, 0x14ff, 0x14ff, - 0x14ff, 0x1514, 0x1526, 0x1538, 0x1538, 0x1538, 0x1538, 0x1538, - 0x1547, 0x1556, 0x1562, 0x1574, 0x1574, 0x1592, 0x1592, 0x15a1, - 0x15b9, 0x15e0, 0x15e0, 0x15ec, 0x15ec, 0x15f5, 0x15f5, 0x1614, - 0x1614, 0x1614, 0x161d, 0x1635, 0x1653, 0x167b, 0x1690, 0x1690, - 0x16a2, 0x16c4, 0x16c4, 0x16c4, 0x16df, 0x16f1, 0x1706, 0x1718, - 0x1739, 0x174b, 0x174b, 0x175a, 0x1766, 0x1766, 0x1766, 0x1781, - // Entry 180 - 1BF - 0x1781, 0x1781, 0x1781, 0x178d, 0x178d, 0x178d, 0x1799, 0x17b5, - 0x17b5, 0x17ce, 0x17ce, 0x17dd, 0x17e6, 0x17f2, 0x1804, 0x1804, - 0x1804, 0x1819, 0x1819, 0x1825, 0x183a, 0x184f, 0x184f, 0x185e, - 0x185e, 0x1870, 0x1870, 0x1882, 0x188e, 0x18ac, 0x18ac, 0x18c8, - 0x18d4, 0x18ec, 0x1910, 0x1910, 0x1925, 0x193d, 0x194f, 0x194f, - 0x1964, 0x197a, 0x198f, 0x19aa, 0x19aa, 0x19aa, 0x19aa, 0x19bf, - 0x19da, 0x1a06, 0x1a27, 0x1a33, 0x1a4f, 0x1a61, 0x1a73, 0x1a88, - 0x1a88, 0x1a9d, 0x1ac1, 0x1ad3, 0x1ad3, 0x1ad3, 0x1ae5, 0x1b07, - // Entry 1C0 - 1FF - 0x1b16, 0x1b16, 0x1b16, 0x1b2e, 0x1b2e, 0x1b2e, 0x1b2e, 0x1b2e, - 0x1b49, 0x1b49, 0x1b5e, 0x1b7c, 0x1b91, 0x1b91, 0x1bc5, 0x1bc5, - 0x1bc5, 0x1bc5, 0x1bc5, 0x1bc5, 0x1bc5, 0x1bc5, 0x1bc5, 0x1bda, - 0x1bda, 0x1bec, 0x1bec, 0x1bec, 0x1bfe, 0x1c1c, 0x1c1c, 0x1c1c, - 0x1c2e, 0x1c2e, 0x1c2e, 0x1c2e, 0x1c2e, 0x1c4c, 0x1c58, 0x1c6a, - 0x1c73, 0x1c73, 0x1c88, 0x1c88, 0x1c9d, 0x1c9d, 0x1cb2, 0x1cbe, - 0x1cd9, 0x1cf1, 0x1cf1, 0x1d13, 0x1d13, 0x1d1f, 0x1d1f, 0x1d1f, - 0x1d50, 0x1d50, 0x1d50, 0x1d6b, 0x1d77, 0x1d77, 0x1d77, 0x1d77, - // Entry 200 - 23F - 0x1d77, 0x1d93, 0x1dac, 0x1dc8, 0x1ded, 0x1e05, 0x1e05, 0x1e2a, - 0x1e2a, 0x1e33, 0x1e33, 0x1e45, 0x1e45, 0x1e45, 0x1e60, 0x1e60, - 0x1e78, 0x1e78, 0x1e78, 0x1e8a, 0x1e96, 0x1e96, 0x1ea5, 0x1eba, - 0x1eba, 0x1eba, 0x1eba, 0x1ed8, 0x1ed8, 0x1ed8, 0x1ed8, 0x1ed8, - 0x1ef7, 0x1ef7, 0x1f06, 0x1f06, 0x1f06, 0x1f06, 0x1f1e, 0x1f30, - 0x1f42, 0x1f5d, 0x1f95, 0x1fad, 0x1fad, 0x1fc2, 0x1fce, 0x1fd7, - 0x1fd7, 0x1fd7, 0x1fd7, 0x1fd7, 0x1fd7, 0x1fd7, 0x1fe9, 0x1ffe, - 0x2013, 0x2025, 0x2025, 0x2037, 0x2053, 0x2068, 0x2068, 0x2074, - // Entry 240 - 27F - 0x2074, 0x2074, 0x208f, 0x20a1, 0x20a1, 0x20bf, 0x20bf, 0x20bf, - 0x20bf, 0x20bf, 0x2100, 0x210c, 0x215a, 0x2166, 0x2192, 0x2192, - 0x21c9, 0x21fb, 0x2241, 0x227b, 0x22b8, 0x22ef, 0x232d, 0x2358, - 0x238c, 0x238c, 0x23bd, 0x23e2, 0x2401, 0x2419, 0x2447, 0x2475, - 0x2493, 0x2493, 0x2493, 0x24af, 0x24e0, -} // Size: 1250 bytes - -const skLangStr string = "" + // Size: 5794 bytes - "afarčinaabcházčinaavestčinaafrikánčinaakančinaamharčinaaragónčinaarabčin" + - "aásamčinaavarčinaaymarčinaazerbajdžančinabaškirčinabieloruštinabulharčin" + - "abislamabambarčinabengálčinatibetčinabretónčinabosniačtinakatalánčinačeč" + - "enčinačamorčinakorzičtinakríčeštinacirkevná slovančinačuvaštinawaleština" + - "dánčinanemčinamaldivčinadzongkhaeweštinagréčtinaangličtinaesperantošpani" + - "elčinaestónčinabaskičtinaperzštinafulbčinafínčinafidžijčinafaerčinafranc" + - "úzštinazápadná frízštinaírčinaškótska gaelčinagalícijčinaguaraníjčinagu" + - "džarátčinamančinahauštinahebrejčinahindčinahiri motuchorvátčinahaitská k" + - "reolčinamaďarčinaarménčinahererointerlinguaindonézštinainterlingueigbošt" + - "inas’čchuanská iovčinainupikidoislandčinataliančinainuktitutjapončinajáv" + - "činagruzínčinakongčinakikujčinakuaňamakazaštinagrónčinakhmérčinakannadč" + - "inakórejčinakanurijčinakašmírčinakurdčinakomijčinakornčinakirgizštinalat" + - "inčinaluxemburčinagandčinalimburčinalingalčinalaoštinalitovčinalubčina (" + - "katanžská)lotyštinamalgaštinamarshallčinamaorijčinamacedónčinamalajálamč" + - "inamongolčinamaráthčinamalajčinamaltčinabarmčinanauruštinaseverná ndebel" + - "činanepálčinandongaholandčinanórčina (nynorsk)nórčina (bokmal)južná nde" + - "belčinanavahoňandžaokcitánčinaodžibvaoromčinauríjčinaosetčinapandžábčina" + - "pálípoľštinapaštčinaportugalčinakečuánčinarétorománčinarundčinarumunčina" + - "ruštinarwandčinasanskritsardínčinasindhčinaseverná lapončinasangosinhalč" + - "inaslovenčinaslovinčinasamojčinašončinasomálčinaalbánčinasrbčinasvazijči" + - "najužná sothčinasundčinašvédčinaswahilčinatamilčinatelugčinatadžičtinath" + - "ajčinatigriňaturkménčinatswančinatongčinaturečtinatsongčinatatárčinatahi" + - "tčinaujgurčinaukrajinčinaurdčinauzbečtinavendčinavietnamčinavolapükvalón" + - "činawolofčinaxhoštinajidišjorubčinačuangčinačínštinazuluštinaacehčinaač" + - "oliadangmeadygejčinaafrihiliaghemainčinaakkadčinaaleutčinajužná altajčin" + - "astará angličtinaangikaaramejčinaaraukánčinaarapažštinaarawačtinaasuastú" + - "rčinaawadhibalúčtinabalijčinabasabamunghomalabedžabembabenabafutzápadná " + - "balúčtinabhódžpurčinabikolčinabinikomsiksikabradžčinabodoakooseburiatčin" + - "abugištinabulublinmedumbakaddokaribčinakajugčinaatsamcebuánčinakigačibča" + - "čagatajčinachuukmarijčinačinucký žargónčoktčinačipevajčinačerokíčejenči" + - "nakurdčina (sorání)koptčinakrymská tatárčinaseychelská kreolčinakašubčin" + - "adakotčinadarginčinataitadelawarčinaslavédogribčinadinkčinazarmadógrídol" + - "nolužická srbčinadualastredná holandčinajola-fonyiďuladazagaembuefikstar" + - "oegyptčinaekadžukelamčinastredná angličtinaewondofangčinafilipínčinafonč" + - "inastredná francúzštinastará francúzštinaseverná frízštinavýchodofrízšti" + - "nafriulčinagagagauzštinagayogbajaetiópčinakiribatčinastredná horná nemči" + - "nastará horná nemčinagóndčinagorontalogótčinagrebostarogréčtinanemčina (" + - "švajčiarska)gusiikučinčinahaidahavajčinahiligajnončinachetitčinahmongči" + - "nahornolužická srbčinahupčinaibančinaibibioilokánčinainguštinalojbanngom" + - "bamašamežidovská perzštinažidovská arabčinakarakalpačtinakabylčinakačjin" + - "činajjukambakawikabardčinakanembutyapmakondekapverdčinakorokhasijčinach" + - "otančinazápadná songhajčinakakokalendžinkimbundukomi-permiačtinakonkánči" + - "nakusaiekpellekaračajevsko-balkarčinakarelčinakuruchčinašambalabafiakolí" + - "nčinakumyčtinakutenajčinažidovská španielčinalangilahandčinalambalezginč" + - "inalakotčinamongoloziseverné lurilubčina (luluánska)luiseňolundaluomizor" + - "ámčinaluhjamadurčinamafamagadhčinamaithilčinamakasarčinamandingomasajči" + - "namabamokšiančinamandarčinamendejčinamerumaurícijská kreolčinastredná ír" + - "činamakua-meettometa’mikmakčinaminangkabaučinamandžuštinamanípurčinamoh" + - "awkčinamossimundangviaceré jazykykríkčinamirandčinamarwarimyeneerzjančin" + - "amázandaránčinaneapolčinanamadolná nemčinanevárčinaniasánčinaniueštinakw" + - "asiongiemboonnogajčinastará nórčinan’koseverná sothčinanuerklasická nevá" + - "rčinaňamweziňankoleňoronzimaosedžštinaosmanská turečtinapangasinančinapa" + - "hlavíkapampangančinapapiamentopalaučinanigerijský pidžinstará perzštinaf" + - "eničtinapohnpeištinapruštinastará okcitánčinaquichéradžastančinarapanujč" + - "inararotongská maorijčinaromborómčinaarumunčinarwasandaweštinajakutčinas" + - "amaritánska aramejčinasamburusasačtinasantalčinangambaysangusicílčinaškó" + - "tčinajužná kurdčinasenekčinasenaselkupčinakoyraboro sennistará írčinatac" + - "helhitšančinačadská arabčinasidamojužná lapončinalapončina (lulská)lapon" + - "čina (inarijská)lapončina (skoltská)soninkesogdijčinasurinamčinasererči" + - "nasahosukumasususumerčinakomorčinasýrčina (klasická)sýrčinatemnetesoterê" + - "natetumčinatigrejčinativtokelauštinaklingónčinatlingitčinatuaregčinaňasa" + - " tonganovoguinejský pidžintarokocimšjančinatumbukatuvalčinatasawaqtuvian" + - "činastredomarocká tuaregčinaudmurtčinaugaritčinaumbundukoreňvaivodčinav" + - "unjowalserčinawalamčinawaraywashowarlpirikalmyčtinasogajaojapčinajangben" + - "yembakantončinazapotéčtinasystém Blisszenagatuaregčina (štandardná maroc" + - "ká)zuništinabez jazykového obsahuzazaarabčina (moderná štandardná)nemčin" + - "a (rakúska)nemčina (švajčiarska spisovná)angličtina (austrálska)angličti" + - "na (kanadská)angličtina (britská)angličtina (americká)španielčina (latin" + - "skoamerická)španielčina (európska)španielčina (mexická)francúzština (kan" + - "adská)francúzština (švajčiarska)dolná saštinaflámčinaportugalčina (brazí" + - "lska)portugalčina (európska)moldavčinasrbochorvátčinasvahilčina (konžská" + - ")čínština (zjednodušená)čínština (tradičná)" - -var skLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0015, 0x001f, 0x002c, 0x0035, 0x003f, 0x004b, - 0x0054, 0x005e, 0x0067, 0x0071, 0x0082, 0x008e, 0x009b, 0x00a6, - 0x00ad, 0x00b8, 0x00c4, 0x00ce, 0x00da, 0x00e6, 0x00f3, 0x00ff, - 0x010a, 0x0115, 0x0119, 0x0122, 0x0137, 0x0142, 0x014c, 0x0155, - 0x015d, 0x0168, 0x0170, 0x0179, 0x0183, 0x018e, 0x0197, 0x01a4, - 0x01af, 0x01ba, 0x01c4, 0x01cd, 0x01d6, 0x01e2, 0x01eb, 0x01f9, - 0x020e, 0x0216, 0x0229, 0x0236, 0x0244, 0x0253, 0x025b, 0x0264, - 0x026f, 0x0278, 0x0281, 0x028e, 0x02a1, 0x02ac, 0x02b7, 0x02bd, - // Entry 40 - 7F - 0x02c8, 0x02d6, 0x02e1, 0x02eb, 0x0303, 0x0309, 0x030c, 0x0317, - 0x0322, 0x032b, 0x0335, 0x033e, 0x034a, 0x0353, 0x035d, 0x0365, - 0x036f, 0x0379, 0x0384, 0x038f, 0x039a, 0x03a6, 0x03b3, 0x03bc, - 0x03c6, 0x03cf, 0x03db, 0x03e5, 0x03f2, 0x03fb, 0x0406, 0x0411, - 0x041a, 0x0424, 0x043a, 0x0444, 0x044f, 0x045c, 0x0467, 0x0474, - 0x0483, 0x048e, 0x049a, 0x04a4, 0x04ad, 0x04b6, 0x04c1, 0x04d5, - 0x04e0, 0x04e6, 0x04f1, 0x0504, 0x0516, 0x0529, 0x052f, 0x0537, - 0x0544, 0x054c, 0x0555, 0x055f, 0x0568, 0x0576, 0x057c, 0x0586, - // Entry 80 - BF - 0x0590, 0x059d, 0x05aa, 0x05ba, 0x05c3, 0x05cd, 0x05d5, 0x05df, - 0x05e7, 0x05f3, 0x05fd, 0x0610, 0x0615, 0x0620, 0x062b, 0x0636, - 0x0640, 0x0649, 0x0654, 0x065f, 0x0667, 0x0672, 0x0683, 0x068c, - 0x0697, 0x06a2, 0x06ac, 0x06b6, 0x06c2, 0x06cb, 0x06d3, 0x06e0, - 0x06ea, 0x06f3, 0x06fd, 0x0707, 0x0712, 0x071c, 0x0726, 0x0732, - 0x073a, 0x0744, 0x074d, 0x0759, 0x0761, 0x076c, 0x0776, 0x077f, - 0x0785, 0x078f, 0x079a, 0x07a5, 0x07af, 0x07b8, 0x07be, 0x07c5, - 0x07d0, 0x07d0, 0x07d8, 0x07dd, 0x07e5, 0x07ef, 0x07ef, 0x07f9, - // Entry C0 - FF - 0x07f9, 0x080b, 0x081d, 0x0823, 0x082e, 0x083b, 0x083b, 0x0848, - 0x0848, 0x0848, 0x0853, 0x0853, 0x0853, 0x0856, 0x0856, 0x0861, - 0x0861, 0x0867, 0x0872, 0x087c, 0x087c, 0x0880, 0x0885, 0x0885, - 0x088c, 0x0892, 0x0897, 0x0897, 0x089b, 0x08a0, 0x08a0, 0x08b5, - 0x08c4, 0x08ce, 0x08d2, 0x08d2, 0x08d5, 0x08dc, 0x08dc, 0x08dc, - 0x08e7, 0x08e7, 0x08eb, 0x08f1, 0x08fc, 0x0906, 0x090a, 0x090e, - 0x0915, 0x091a, 0x0924, 0x092e, 0x0933, 0x093f, 0x0943, 0x094a, - 0x0957, 0x095c, 0x0966, 0x0978, 0x0982, 0x098f, 0x0997, 0x09a2, - // Entry 100 - 13F - 0x09b6, 0x09bf, 0x09bf, 0x09d3, 0x09e9, 0x09f4, 0x09fe, 0x0a09, - 0x0a0e, 0x0a1a, 0x0a20, 0x0a2b, 0x0a34, 0x0a39, 0x0a40, 0x0a57, - 0x0a57, 0x0a5c, 0x0a70, 0x0a7a, 0x0a7f, 0x0a85, 0x0a89, 0x0a8d, - 0x0a8d, 0x0a9c, 0x0aa4, 0x0aad, 0x0ac1, 0x0ac1, 0x0ac7, 0x0ac7, - 0x0ad0, 0x0add, 0x0add, 0x0ae5, 0x0ae5, 0x0afc, 0x0b11, 0x0b11, - 0x0b25, 0x0b38, 0x0b42, 0x0b44, 0x0b50, 0x0b50, 0x0b54, 0x0b59, - 0x0b59, 0x0b64, 0x0b70, 0x0b70, 0x0b88, 0x0b9e, 0x0b9e, 0x0ba8, - 0x0bb1, 0x0bba, 0x0bbf, 0x0bce, 0x0be6, 0x0be6, 0x0be6, 0x0beb, - // Entry 140 - 17F - 0x0bf6, 0x0bfb, 0x0bfb, 0x0c05, 0x0c05, 0x0c14, 0x0c1f, 0x0c29, - 0x0c40, 0x0c40, 0x0c48, 0x0c51, 0x0c57, 0x0c63, 0x0c6d, 0x0c6d, - 0x0c6d, 0x0c73, 0x0c79, 0x0c80, 0x0c95, 0x0ca9, 0x0ca9, 0x0cb8, - 0x0cc2, 0x0cce, 0x0cd1, 0x0cd6, 0x0cda, 0x0ce5, 0x0cec, 0x0cf0, - 0x0cf7, 0x0d03, 0x0d03, 0x0d07, 0x0d07, 0x0d12, 0x0d1d, 0x0d33, - 0x0d33, 0x0d33, 0x0d37, 0x0d41, 0x0d49, 0x0d5a, 0x0d66, 0x0d6c, - 0x0d72, 0x0d8b, 0x0d8b, 0x0d8b, 0x0d95, 0x0da0, 0x0da8, 0x0dad, - 0x0db8, 0x0dc2, 0x0dce, 0x0de6, 0x0deb, 0x0df6, 0x0dfb, 0x0e06, - // Entry 180 - 1BF - 0x0e06, 0x0e06, 0x0e06, 0x0e10, 0x0e10, 0x0e15, 0x0e19, 0x0e26, - 0x0e26, 0x0e3b, 0x0e43, 0x0e48, 0x0e4b, 0x0e58, 0x0e5d, 0x0e5d, - 0x0e5d, 0x0e67, 0x0e6b, 0x0e76, 0x0e82, 0x0e8e, 0x0e96, 0x0ea0, - 0x0ea4, 0x0eb1, 0x0ebc, 0x0ec7, 0x0ecb, 0x0ee3, 0x0ef4, 0x0f00, - 0x0f07, 0x0f12, 0x0f22, 0x0f2f, 0x0f3c, 0x0f47, 0x0f4c, 0x0f4c, - 0x0f53, 0x0f62, 0x0f6c, 0x0f77, 0x0f7e, 0x0f7e, 0x0f83, 0x0f8e, - 0x0f9f, 0x0f9f, 0x0faa, 0x0fae, 0x0fbd, 0x0fc8, 0x0fd4, 0x0fde, - 0x0fde, 0x0fe4, 0x0fed, 0x0ff7, 0x1007, 0x1007, 0x100d, 0x101f, - // Entry 1C0 - 1FF - 0x1023, 0x1038, 0x1040, 0x1048, 0x104d, 0x1052, 0x105e, 0x1072, - 0x1081, 0x1089, 0x1099, 0x10a3, 0x10ad, 0x10ad, 0x10c0, 0x10c0, - 0x10c0, 0x10d1, 0x10d1, 0x10db, 0x10db, 0x10db, 0x10e8, 0x10f1, - 0x1105, 0x110c, 0x110c, 0x111b, 0x1127, 0x113f, 0x113f, 0x113f, - 0x1144, 0x114d, 0x114d, 0x114d, 0x114d, 0x1158, 0x115b, 0x1168, - 0x1172, 0x118b, 0x1192, 0x119c, 0x11a7, 0x11a7, 0x11ae, 0x11b3, - 0x11be, 0x11c9, 0x11c9, 0x11da, 0x11e4, 0x11e8, 0x11e8, 0x11f3, - 0x1202, 0x1211, 0x1211, 0x121a, 0x1223, 0x1235, 0x123b, 0x123b, - // Entry 200 - 23F - 0x123b, 0x124d, 0x1261, 0x1278, 0x128e, 0x1295, 0x12a0, 0x12ac, - 0x12b6, 0x12ba, 0x12ba, 0x12c0, 0x12c4, 0x12ce, 0x12d8, 0x12ed, - 0x12f6, 0x12f6, 0x12f6, 0x12fb, 0x12ff, 0x1306, 0x1310, 0x131b, - 0x131e, 0x132b, 0x132b, 0x1338, 0x1344, 0x1344, 0x134f, 0x135a, - 0x1370, 0x1370, 0x1376, 0x1376, 0x1383, 0x1383, 0x138a, 0x1394, - 0x139b, 0x13a6, 0x13c0, 0x13cb, 0x13d6, 0x13dd, 0x13e3, 0x13e6, - 0x13e6, 0x13e6, 0x13e6, 0x13e6, 0x13ee, 0x13ee, 0x13f3, 0x13fe, - 0x1408, 0x140d, 0x1412, 0x141a, 0x141a, 0x1425, 0x1425, 0x1429, - // Entry 240 - 27F - 0x142c, 0x1434, 0x143b, 0x1440, 0x1440, 0x144b, 0x1458, 0x1465, - 0x1465, 0x146b, 0x148e, 0x1498, 0x14ae, 0x14b2, 0x14d3, 0x14d3, - 0x14e6, 0x1508, 0x1521, 0x1538, 0x154e, 0x1565, 0x1586, 0x159f, - 0x15b7, 0x15b7, 0x15d1, 0x15ef, 0x15fe, 0x1608, 0x1622, 0x163b, - 0x1646, 0x1657, 0x166e, 0x168a, 0x16a2, -} // Size: 1250 bytes - -const slLangStr string = "" + // Size: 6423 bytes - "afarščinaabhaščinaavestijščinaafrikanščinaakanščinaamharščinaaragonščina" + - "arabščinaasamščinaavarščinaajmarščinaazerbajdžanščinabaškirščinabelorušč" + - "inabolgarščinabislamščinabambarščinabengalščinatibetanščinabretonščinabo" + - "sanščinakatalonščinačečenščinačamorščinakorziščinakrijščinačeščinastara " + - "cerkvena slovanščinačuvaščinavaližanščinadanščinanemščinadiveščinadzonka" + - "evenščinagrščinaangleščinaesperantošpanščinaestonščinabaskovščinaperzijš" + - "činafulščinafinščinafidžijščinaferščinafrancoščinazahodna frizijščinair" + - "ščinaškotska gelščinagalicijščinagvaranijščinagudžaratščinamanščinahavš" + - "činahebrejščinahindujščinahiri motuhrvaščinahaitijska kreolščinamadžarš" + - "činaarmenščinahererointerlingvaindonezijščinainterlingveigboščinasečuan" + - "ska jiščinainupiaščinaidoislandščinaitalijanščinainuktitutščinajaponščin" + - "ajavanščinagruzijščinakongovščinakikujščinakvanjamakazaščinagrenlandščin" + - "akmerščinakanadakorejščinakanurščinakašmirščinakurdščinakomijščinakornij" + - "ščinakirgiščinalatinščinaluksemburščinagandalimburščinalingalalaoščinal" + - "itovščinaluba-katangalatvijščinamalagaščinamarshallovščinamaorščinamaked" + - "onščinamalajalamščinamongolščinamaratščinamalajščinamalteščinaburmanščin" + - "anaurujščinaseverna ndebelščinanepalščinandonganizozemščinanovonorveščin" + - "aknjižna norveščinajužna ndebelščinanavajščinanjanščinaokcitanščinaanaši" + - "nabščinaoromoodijščinaosetinščinapandžabščinapalijščinapoljščinapaštunšč" + - "inaportugalščinakečuanščinaretoromanščinarundščinaromunščinaruščinaruand" + - "ščinasanskrtsardinščinasindščinaseverna samijščinasangosinhalščinaslova" + - "ščinaslovenščinasamoanščinašonščinasomalščinaalbanščinasrbščinasvazijšč" + - "inasesotosundanščinašvedščinasvahilitamilščinatelugijščinatadžiščinatajš" + - "činatigrajščinaturkmenščinacvanščinatongščinaturščinatsongatatarščinata" + - "hitščinaujgurščinaukrajinščinaurdujščinauzbeščinavendavietnamščinavolapu" + - "kvalonščinavolofščinakoščinajidišjorubščinakitajščinazulujščinaačejščina" + - "ačolijščinaadangmejščinaadigejščinaafrihiliaghemščinaainujščinaakadščina" + - "aleutščinajužna altajščinastara angleščinaangikaščinaaramejščinamapudung" + - "unščinaarapaščinaaravaščinaasujščinaasturijščinaavadščinabeludžijščinaba" + - "lijščinabasabedžabembabenajščinazahodnobalučijščinabodžpuribikolski jezi" + - "kedosiksikabradžbakanščinabodojščinaburjatščinabuginščinablinščinakadošč" + - "inakaribski jeziksebuanščinačigajščinačibčevščinačagatajščinatrukeščinam" + - "arijščinačinuški žargončoktavščinačipevščinačerokeščinačejenščinasoransk" + - "a kurdščinakoptščinakrimska tatarščinasejšelska francoska kreolščinakašu" + - "bščinadakotščinadarginščinataitajščinadelavarščinaslavejščinadogribdinka" + - "zarmajščinadogridolnja lužiška srbščinadualasrednja nizozemščinajola-fon" + - "jiščinadiuladazagaembujščinaefiščinastara egipčanščinaekajukelamščinasre" + - "dnja angleščinaevondovščinafangijščinafilipinščinafonščinasrednja franco" + - "ščinastara francoščinaseverna frizijščinavzhodna frizijščinafurlanščina" + - "gagagavščinagajščinagbajščinaetiopščinakiribatščinasrednja visoka nemšči" + - "nastara visoka nemščinagondigorontalščinagotščinagrebščinastara grščinan" + - "emščina (Švica)gusijščinagvičinhaidščinahavajščinahiligajnonščinahetitšč" + - "inahmonščinagornja lužiška srbščinahupaibanščinaibibijščinailokanščinain" + - "guščinalojbanngombamačamejščinajudovska perzijščinajudovska arabščinakar" + - "akalpaščinakabilščinakačinščinajjukambaščinakavikabardinščinatjapska nig" + - "erijščinamakondščinazelenortskootoška kreolščinakorokasikotanščinakoyra " + - "chiinikakokalenjinščinakimbundukomi-permjaščinakonkanščinakosrajščinakpe" + - "lejščinakaračaj-balkarščinakarelščinakurukšambalabafiakölnsko narečjekum" + - "iščinakutenajščinaladinščinalangijščinalandalambalezginščinalakotščinamo" + - "ngolozisevernolurijščinaluba-lulualuisenščinalundaluolushailuhijščinamad" + - "urščinamagadščinamaitilimakasarščinamandingomasajščinamokšavščinamandarš" + - "činamendemerumorisjenščinasrednja irščinamakuva-metometamikmaščinaminan" + - "gkabaumandžurščinamanipurščinamohoščinamosijščinamundangveč jezikovcreek" + - "ovščinamirandeščinamarvarščinaerzjanščinamazanderanščinanapolitanščinakh" + - "oekhoenizka nemščinanevarščinaniaščinaniuejščinakwasiongiemboonščinanoga" + - "jščinastara nordijščinan’koseverna sotščinanuerščinaklasična nevarščinan" + - "jamveščinanjankolenjoronzimaosageotomanska turščinapangasinanščinapampan" + - "ščinapapiamentupalavanščinanigerijski pidžinstara perzijščinafeničanšči" + - "naponpejščinastara pruščinastara provansalščinaquicheradžastanščinarapan" + - "ujščinararotongščinaromboromščinaaromunščinarwasandavščinajakutščinasama" + - "ritanska aramejščinasamburščinasasaščinasantalščinangambajščinasangujšči" + - "nasicilijanščinaškotščinajužna kurdščinasenaselkupščinakoyraboro sennist" + - "ara irščinatahelitska berberščinašanščinasidamščinajužna samijščinaluleš" + - "ka samijščinainarska samijščinasamijščina Skoltsoninkesurinamska kreolšč" + - "inasererščinasahosukumasusujščinasumerščinašikomorklasična sirščinasiršč" + - "inatemnejščinatesotetumščinatigrejščinativščinatokelavščinaklingonščinat" + - "lingitščinatamajaščinamalavijska tongščinatok pisintarokotsimščinatumbuk" + - "ščinatuvalujščinatasawaqtuvinščinatamašek (srednji atlas)udmurtščinauga" + - "ritski jezikumbundščinarootščinavajščinavotjaščinavunjowalservalamščinav" + - "arajščinavašajščinavarlpirščinakalmiščinasogščinajaojščinajapščinajangbe" + - "njembajščinakantonščinazapoteščinaznakovni jezik Blisszenaščinastandardn" + - "i maroški tamazigzunijščinabrez jezikoslovne vsebinezazajščinasodobna st" + - "andardna arabščinaavstrijska nemščinavisoka nemščina (Švica)avstralska a" + - "ngleščinakanadska angleščinaangleščina (VB)angleščina (ZDA)latinskoameri" + - "ška španščinaiberska španščinakanadska francoščinašvicarska francoščina" + - "nizka saščinaflamščinabrazilska portugalščinaiberska portugalščinamoldav" + - "ščinasrbohrvaščinakongoška svahilščinapoenostavljena kitajščinatradicio" + - "nalna kitajščina" - -var slLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000b, 0x0016, 0x0024, 0x0032, 0x003d, 0x0049, 0x0056, - 0x0061, 0x006c, 0x0077, 0x0083, 0x0096, 0x00a4, 0x00b1, 0x00be, - 0x00cb, 0x00d8, 0x00e5, 0x00f3, 0x0100, 0x010c, 0x011a, 0x0128, - 0x0135, 0x0141, 0x014c, 0x0156, 0x0172, 0x017e, 0x018d, 0x0197, - 0x01a1, 0x01ac, 0x01b2, 0x01bd, 0x01c6, 0x01d2, 0x01db, 0x01e7, - 0x01f3, 0x0200, 0x020d, 0x0217, 0x0221, 0x022f, 0x0239, 0x0246, - 0x025b, 0x0264, 0x0277, 0x0285, 0x0294, 0x02a4, 0x02ae, 0x02b8, - 0x02c5, 0x02d2, 0x02db, 0x02e6, 0x02fc, 0x030a, 0x0316, 0x031c, - // Entry 40 - 7F - 0x0327, 0x0337, 0x0342, 0x034d, 0x0361, 0x036e, 0x0371, 0x037e, - 0x038d, 0x039d, 0x03a9, 0x03b5, 0x03c2, 0x03cf, 0x03db, 0x03e3, - 0x03ee, 0x03fd, 0x0408, 0x040e, 0x041a, 0x0426, 0x0434, 0x043f, - 0x044b, 0x0458, 0x0464, 0x0470, 0x0480, 0x0485, 0x0492, 0x0499, - 0x04a3, 0x04af, 0x04bb, 0x04c8, 0x04d5, 0x04e6, 0x04f1, 0x04ff, - 0x050f, 0x051c, 0x0528, 0x0534, 0x0540, 0x054d, 0x055a, 0x056f, - 0x057b, 0x0581, 0x058f, 0x059f, 0x05b4, 0x05c8, 0x05d4, 0x05df, - 0x05ed, 0x05fd, 0x0602, 0x060d, 0x061a, 0x0629, 0x0635, 0x0640, - // Entry 80 - BF - 0x064e, 0x065d, 0x066b, 0x067b, 0x0686, 0x0692, 0x069b, 0x06a7, - 0x06ae, 0x06bb, 0x06c6, 0x06da, 0x06df, 0x06ec, 0x06f8, 0x0705, - 0x0712, 0x071d, 0x0729, 0x0735, 0x073f, 0x074c, 0x0752, 0x075f, - 0x076b, 0x0772, 0x077e, 0x078c, 0x0799, 0x07a3, 0x07b0, 0x07be, - 0x07c9, 0x07d4, 0x07de, 0x07e4, 0x07f0, 0x07fc, 0x0808, 0x0816, - 0x0822, 0x082d, 0x0832, 0x0840, 0x0847, 0x0853, 0x085f, 0x0868, - 0x086e, 0x087a, 0x087a, 0x0886, 0x0892, 0x089e, 0x08ac, 0x08bb, - 0x08c8, 0x08c8, 0x08d0, 0x08dc, 0x08e8, 0x08f3, 0x08f3, 0x08ff, - // Entry C0 - FF - 0x08ff, 0x0912, 0x0924, 0x0931, 0x093e, 0x094f, 0x094f, 0x095b, - 0x095b, 0x095b, 0x0967, 0x0967, 0x0967, 0x0972, 0x0972, 0x0980, - 0x0980, 0x098b, 0x099b, 0x09a7, 0x09a7, 0x09ab, 0x09ab, 0x09ab, - 0x09ab, 0x09b1, 0x09b6, 0x09b6, 0x09c2, 0x09c2, 0x09c2, 0x09d8, - 0x09e1, 0x09ef, 0x09f2, 0x09f2, 0x09f2, 0x09f9, 0x09f9, 0x09f9, - 0x0a0b, 0x0a0b, 0x0a17, 0x0a17, 0x0a24, 0x0a30, 0x0a30, 0x0a3b, - 0x0a3b, 0x0a46, 0x0a54, 0x0a54, 0x0a54, 0x0a61, 0x0a6e, 0x0a7d, - 0x0a8c, 0x0a98, 0x0aa4, 0x0ab5, 0x0ac3, 0x0ad0, 0x0ade, 0x0aeb, - // Entry 100 - 13F - 0x0aff, 0x0b0a, 0x0b0a, 0x0b1e, 0x0b3f, 0x0b4c, 0x0b58, 0x0b65, - 0x0b72, 0x0b80, 0x0b8d, 0x0b93, 0x0b98, 0x0ba5, 0x0baa, 0x0bc5, - 0x0bc5, 0x0bca, 0x0be0, 0x0bf1, 0x0bf6, 0x0bfc, 0x0c08, 0x0c12, - 0x0c12, 0x0c27, 0x0c2d, 0x0c38, 0x0c4c, 0x0c4c, 0x0c5a, 0x0c5a, - 0x0c67, 0x0c75, 0x0c75, 0x0c7f, 0x0c7f, 0x0c94, 0x0ca7, 0x0ca7, - 0x0cbc, 0x0cd1, 0x0cde, 0x0ce0, 0x0cec, 0x0cec, 0x0cf6, 0x0d01, - 0x0d01, 0x0d0d, 0x0d1b, 0x0d1b, 0x0d34, 0x0d4b, 0x0d4b, 0x0d50, - 0x0d5f, 0x0d69, 0x0d74, 0x0d83, 0x0d96, 0x0d96, 0x0d96, 0x0da2, - // Entry 140 - 17F - 0x0da9, 0x0db4, 0x0db4, 0x0dc0, 0x0dc0, 0x0dd1, 0x0ddd, 0x0de8, - 0x0e03, 0x0e03, 0x0e07, 0x0e12, 0x0e1f, 0x0e2c, 0x0e37, 0x0e37, - 0x0e37, 0x0e3d, 0x0e43, 0x0e52, 0x0e68, 0x0e7c, 0x0e7c, 0x0e8c, - 0x0e98, 0x0ea5, 0x0ea8, 0x0eb4, 0x0eb8, 0x0ec7, 0x0ec7, 0x0edd, - 0x0eea, 0x0f09, 0x0f09, 0x0f0d, 0x0f0d, 0x0f11, 0x0f1d, 0x0f29, - 0x0f29, 0x0f29, 0x0f2d, 0x0f3c, 0x0f44, 0x0f56, 0x0f63, 0x0f70, - 0x0f7d, 0x0f93, 0x0f93, 0x0f93, 0x0f9f, 0x0fa4, 0x0fac, 0x0fb1, - 0x0fc2, 0x0fcd, 0x0fdb, 0x0fe7, 0x0ff4, 0x0ff9, 0x0ffe, 0x100b, - // Entry 180 - 1BF - 0x100b, 0x100b, 0x100b, 0x1017, 0x1017, 0x101c, 0x1020, 0x1033, - 0x1033, 0x103d, 0x104a, 0x104f, 0x1052, 0x1058, 0x1064, 0x1064, - 0x1064, 0x1070, 0x1070, 0x107c, 0x1083, 0x1091, 0x1099, 0x10a5, - 0x10a5, 0x10b3, 0x10c0, 0x10c5, 0x10c9, 0x10d8, 0x10e9, 0x10f4, - 0x10f8, 0x1104, 0x110f, 0x111e, 0x112c, 0x1137, 0x1143, 0x1143, - 0x114a, 0x1156, 0x1164, 0x1172, 0x117f, 0x117f, 0x117f, 0x118c, - 0x119d, 0x119d, 0x11ad, 0x11b5, 0x11c5, 0x11d1, 0x11db, 0x11e7, - 0x11e7, 0x11ed, 0x11fd, 0x1209, 0x121c, 0x121c, 0x1222, 0x1234, - // Entry 1C0 - 1FF - 0x123f, 0x1255, 0x1262, 0x126a, 0x126f, 0x1274, 0x1279, 0x128d, - 0x129e, 0x129e, 0x12ab, 0x12b5, 0x12c3, 0x12c3, 0x12d5, 0x12d5, - 0x12d5, 0x12e8, 0x12e8, 0x12f7, 0x12f7, 0x12f7, 0x1304, 0x1314, - 0x132a, 0x1330, 0x1330, 0x1341, 0x134f, 0x135e, 0x135e, 0x135e, - 0x1363, 0x136d, 0x136d, 0x136d, 0x136d, 0x137a, 0x137d, 0x138a, - 0x1396, 0x13b0, 0x13bd, 0x13c8, 0x13d5, 0x13d5, 0x13e3, 0x13f0, - 0x1400, 0x140c, 0x140c, 0x141e, 0x141e, 0x1422, 0x1422, 0x142f, - 0x143e, 0x144d, 0x144d, 0x1465, 0x1470, 0x1470, 0x147c, 0x147c, - // Entry 200 - 23F - 0x147c, 0x148f, 0x14a4, 0x14b8, 0x14ca, 0x14d1, 0x14d1, 0x14e8, - 0x14f4, 0x14f8, 0x14f8, 0x14fe, 0x150a, 0x1516, 0x151e, 0x1532, - 0x153c, 0x153c, 0x153c, 0x1549, 0x154d, 0x154d, 0x1559, 0x1566, - 0x1570, 0x157e, 0x157e, 0x158c, 0x159a, 0x159a, 0x15a7, 0x15bd, - 0x15c6, 0x15c6, 0x15cc, 0x15cc, 0x15d7, 0x15d7, 0x15e4, 0x15f2, - 0x15f9, 0x1605, 0x161d, 0x162a, 0x1639, 0x1646, 0x1651, 0x165b, - 0x165b, 0x165b, 0x165b, 0x165b, 0x1667, 0x1667, 0x166c, 0x1672, - 0x167e, 0x168a, 0x1697, 0x16a5, 0x16a5, 0x16b1, 0x16b1, 0x16bb, - // Entry 240 - 27F - 0x16c6, 0x16d0, 0x16d7, 0x16e4, 0x16e4, 0x16f1, 0x16fe, 0x1712, - 0x1712, 0x171d, 0x1738, 0x1744, 0x175d, 0x1769, 0x1787, 0x1787, - 0x179c, 0x17b6, 0x17cd, 0x17e2, 0x17f3, 0x1805, 0x1823, 0x1837, - 0x1837, 0x1837, 0x184d, 0x1865, 0x1874, 0x187f, 0x1898, 0x18af, - 0x18bc, 0x18cb, 0x18e2, 0x18fd, 0x1917, -} // Size: 1250 bytes - -const sqLangStr string = "" + // Size: 4427 bytes - "afarishtabkazishtafrikanishtakanishtamarishtaragonezishtarabishtasamezis" + - "htavarikishtajmarishtazerbajxhanishtbashkirishtbjellorusishtbullgarishtb" + - "islamishtbambarishtbengalishttibetishtbretonishtboshnjakishtkatalonishtç" + - "eçenishtkamoroishtkorsikishtçekishtsllavishte kisheçuvashishtuellsishtda" + - "nishtgjermanishtdivehishtxhongaishteveishtgreqishtanglishtesperantospanj" + - "ishtestonishtbaskishtpersishtfulaishtfinlandishtfixhianishtfaroishtfrëng" + - "jishtfrizianishte perëndimoreirlandishtgalishte skocezegalicishtguaranis" + - "htguxharatishtmanksishthausishthebraishtindishtkroatishthaitishthungaris" + - "htarmenishthereroishtinterlinguaindonezishtgjuha oksidentaleigboishtsish" + - "uanishtidoishtislandishtitalishtinuktitutishtjaponishtjavanishtgjeorgjis" + - "htkikujuishtkuanjamaishtkazakishtkalalisutishtkmerishtkanadishtkoreanish" + - "tkanurishtkashmirishtkurdishtkomishtkornishtkirgizishtlatinishtluksembur" + - "gishtgandaishtlimburgishtlingalishtlaosishtlituanishtluba-katangaishtlet" + - "onishtmalagezishtmarshallishtmaorishtmaqedonishtmalajalamishtmongolishtm" + - "aratishtmalajishtmaltishtbirmanishtnauruishtndebelishte veriorenepalisht" + - "ndongaishtholandishtnorvegjishte nynorsknorvegjishte letrarendebelishte " + - "jugorenavahoishtnianjishtoksitanishtoromoishtodishtosetishtpanxhabishtpo" + - "lonishtpashtoishtportugalishtkeçuaishtretoromanishtrundishtrumanishtrusi" + - "shtkiniaruandishtsanskritishtsardenjishtsindishtsamishte verioresangoish" + - "tsinhalishtsllovakishtsllovenishtsamoanishtshonishtsomalishtshqipserbish" + - "tsuatishtsotoishte jugoresundanishtsuedishtsuahilishttamilishtteluguisht" + - "taxhikishttajlandishttigrinjaishtturkmenishtcuanaishttonganishtturqishtc" + - "ongaishttatarishttahitishtujgurishtukrainishturduishtuzbekishtvendaishtv" + - "ietnamishtvolapykishtualunishtulufishtkosaishtjidishtjorubaishtkinezisht" + - "zuluishtakinezishtandangmeishtadigishtagemishtajnuishtaleutishtaltaishte" + - " jugoreangikishtmapuçishtarapahoishtasuishtasturishtauadhishtbalinezisht" + - "basaishtbembaishtbenaishtbalokishte perëndimoreboxhpurishtbinishtsiksika" + - "ishtbodoishtbuginezishtblinishtsebuanishtçigishtçukezishtmarishtçoktauis" + - "htçerokishtçejenishtkurdishte qendrorefrëngjishte kreole seselvedakotish" + - "tdarguaishttajtaishtdogribishtzarmaishtsorbishte e poshtmedualaishtxhula" + - "fonjishtdazagauishtembuishtefikishtekajukishteuondoishtfilipinishtfonish" + - "tfriulianishtgaishtgagauzishtgizishtgilbertazishtgorontaloishtgjermanish" + - "te zviceranegusishtguiçinishthavaishthiligajnonishthmongishtsorbishte e " + - "sipërmehupaishtibanishtibibioishtilokoishtingushishtlojbanishtngombishtm" + - "açamishtkabilishtkaçinishtkajeishtkambaishtkabardianishttjapishtmakondis" + - "htkreolishte e Kepit të Gjelbërkoroishtkasishtkojraçinishtkakoishtkalenx" + - "hinishtkimbunduishtkomi-parmjakishtkonkanishtkpeleishtkaraçaj-balkarisht" + - "karelianishtkurukishtshambalishtbafianishtkëlnishtkumikishtladinoishtlan" + - "gishtlezgianishtlakotishtlozishtlurishte verioreluba-luluaishtlundaishtl" + - "uoishtmizoishtlujaishtmadurezishtmagaishtmaitilishtmakasarishtmasaishtmo" + - "kshaishtmendishtmeruishtmorisjenishtmakua-mitoishtmetaishtmikmakishtmina" + - "ngkabauishtmanipurishtmohokishtmosishtmundangishtgjuhë të shumëfishtakri" + - "kishtmirandishterzjaishtmazanderanishtnapoletanishtnamaishtgjermanishte " + - "e vendeve të ulëtaneuarishtniasishtniueanishtkuasishtngiembunishtnogajis" + - "htnkoishtsotoishte veriorenuerishtniankolishtpangasinanishtpampangaishtp" + - "apiamentishtpaluanishtpixhinishte nigerianeprusishtkiçeishtrapanuishtrar" + - "ontonganishtromboishtarumuneruaishtsandauishtsakaishtsamburishtsantalish" + - "tngambajishtsanguishtsiçilianishtskotishtkurdishte jugoresenaishtsenisht" + - "e kojraboretaçelitishtshanishtsamishte jugoresamishte lulesamishte inari" + - "samishte skoltisoninkishtsrananisht (sranantongoisht)sahoishtsukumaishtk" + - "amorianishtsiriakishttimneishttesoishttetumishttigreishtklingonishtpisin" + - "ishte tokutorokoishttumbukaishttuvaluishttasavakishttuvinianishttamaziat" + - "ishte atlase qendroreudmurtishtumbunduishtrutishtvaishtvunxhoishtualseri" + - "shtulajtaishtuarajishtuarlpirishtkalmikishtsogishtjangbenishtjembaishtka" + - "ntonezishttamaziatishte standarde marokenezunishtnuk ka përmbajtje gjuhë" + - "sorezazaishtarabishte standarde modernegjermanishte austriakegjermanisht" + - "e zvicerane (dialekti i Alpeve)anglishte australianeanglishte kanadezean" + - "glishte britanikeanglishte amerikanespanjishte amerikano-latinespanjisht" + - "e evropianespanjishte meksikanefrëngjishte kanadezefrëngjishte zvicerane" + - "gjermanishte saksone e vendeve të ulëtaflamandishtportugalishte brazilia" + - "neportugalishte evropianemoldavishtserbo-kroatishtsuahilishte kongoje" - -var sqLangIdx = []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x0008, 0x0011, 0x0011, 0x001c, 0x0024, 0x002c, 0x0038, - 0x0040, 0x004a, 0x0054, 0x005d, 0x006c, 0x0077, 0x0084, 0x008f, - 0x0099, 0x00a3, 0x00ad, 0x00b6, 0x00c0, 0x00cc, 0x00d7, 0x00e2, - 0x00ec, 0x00f6, 0x00f6, 0x00fe, 0x010e, 0x0119, 0x0122, 0x0129, - 0x0134, 0x013d, 0x0147, 0x014e, 0x0156, 0x015e, 0x0167, 0x0170, - 0x0179, 0x0181, 0x0189, 0x0191, 0x019c, 0x01a7, 0x01af, 0x01ba, - 0x01d3, 0x01dd, 0x01ed, 0x01f6, 0x0200, 0x020c, 0x0215, 0x021d, - 0x0226, 0x022d, 0x022d, 0x0236, 0x023e, 0x0248, 0x0251, 0x025b, - // Entry 40 - 7F - 0x0266, 0x0271, 0x0282, 0x028a, 0x0295, 0x0295, 0x029c, 0x02a6, - 0x02ae, 0x02bb, 0x02c4, 0x02cd, 0x02d8, 0x02d8, 0x02e2, 0x02ee, - 0x02f7, 0x0304, 0x030c, 0x0315, 0x031f, 0x0328, 0x0333, 0x033b, - 0x0342, 0x034a, 0x0354, 0x035d, 0x036b, 0x0374, 0x037f, 0x0389, - 0x0391, 0x039b, 0x03ab, 0x03b4, 0x03bf, 0x03cb, 0x03d3, 0x03de, - 0x03eb, 0x03f5, 0x03fe, 0x0407, 0x040f, 0x0419, 0x0422, 0x0435, - 0x043e, 0x0448, 0x0452, 0x0466, 0x047a, 0x048c, 0x0496, 0x049f, - 0x04aa, 0x04aa, 0x04b3, 0x04b9, 0x04c1, 0x04cc, 0x04cc, 0x04d5, - // Entry 80 - BF - 0x04df, 0x04eb, 0x04f5, 0x0502, 0x050a, 0x0513, 0x051a, 0x0528, - 0x0534, 0x053f, 0x0547, 0x0557, 0x0560, 0x056a, 0x0575, 0x0580, - 0x058a, 0x0592, 0x059b, 0x05a0, 0x05a8, 0x05b0, 0x05c0, 0x05ca, - 0x05d2, 0x05dc, 0x05e5, 0x05ef, 0x05f9, 0x0604, 0x0610, 0x061b, - 0x0624, 0x062e, 0x0636, 0x063f, 0x0648, 0x0651, 0x065a, 0x0664, - 0x066c, 0x0675, 0x067e, 0x0689, 0x0694, 0x069d, 0x06a5, 0x06ad, - 0x06b4, 0x06be, 0x06be, 0x06c7, 0x06cf, 0x06d9, 0x06d9, 0x06e5, - 0x06ed, 0x06ed, 0x06ed, 0x06f5, 0x06fd, 0x06fd, 0x06fd, 0x0706, - // Entry C0 - FF - 0x0706, 0x0716, 0x0716, 0x071f, 0x071f, 0x0729, 0x0729, 0x0734, - 0x0734, 0x0734, 0x0734, 0x0734, 0x0734, 0x073b, 0x073b, 0x0744, - 0x0744, 0x074d, 0x074d, 0x0758, 0x0758, 0x0760, 0x0760, 0x0760, - 0x0760, 0x0760, 0x0769, 0x0769, 0x0771, 0x0771, 0x0771, 0x0788, - 0x0793, 0x0793, 0x079a, 0x079a, 0x079a, 0x07a5, 0x07a5, 0x07a5, - 0x07a5, 0x07a5, 0x07ad, 0x07ad, 0x07ad, 0x07b8, 0x07b8, 0x07c0, - 0x07c0, 0x07c0, 0x07c0, 0x07c0, 0x07c0, 0x07ca, 0x07d2, 0x07d2, - 0x07d2, 0x07dc, 0x07e3, 0x07e3, 0x07ee, 0x07ee, 0x07f8, 0x0802, - // Entry 100 - 13F - 0x0814, 0x0814, 0x0814, 0x0814, 0x082f, 0x082f, 0x0838, 0x0842, - 0x084b, 0x084b, 0x084b, 0x0855, 0x0855, 0x085e, 0x085e, 0x0871, - 0x0871, 0x087a, 0x087a, 0x0887, 0x0887, 0x0892, 0x089a, 0x08a2, - 0x08a2, 0x08a2, 0x08ac, 0x08ac, 0x08ac, 0x08ac, 0x08b6, 0x08b6, - 0x08b6, 0x08c1, 0x08c1, 0x08c8, 0x08c8, 0x08c8, 0x08c8, 0x08c8, - 0x08c8, 0x08c8, 0x08d4, 0x08da, 0x08e4, 0x08e4, 0x08e4, 0x08e4, - 0x08e4, 0x08eb, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, - 0x0905, 0x0905, 0x0905, 0x0905, 0x091b, 0x091b, 0x091b, 0x0922, - // Entry 140 - 17F - 0x092d, 0x092d, 0x092d, 0x0935, 0x0935, 0x0943, 0x0943, 0x094c, - 0x0960, 0x0960, 0x0968, 0x0970, 0x097a, 0x0983, 0x098d, 0x098d, - 0x098d, 0x0997, 0x09a0, 0x09aa, 0x09aa, 0x09aa, 0x09aa, 0x09aa, - 0x09b3, 0x09bd, 0x09c5, 0x09ce, 0x09ce, 0x09db, 0x09db, 0x09e3, - 0x09ed, 0x0a0c, 0x0a0c, 0x0a14, 0x0a14, 0x0a1b, 0x0a1b, 0x0a28, - 0x0a28, 0x0a28, 0x0a30, 0x0a3d, 0x0a49, 0x0a59, 0x0a63, 0x0a63, - 0x0a6c, 0x0a7f, 0x0a7f, 0x0a7f, 0x0a8b, 0x0a94, 0x0a9f, 0x0aa9, - 0x0ab2, 0x0abb, 0x0abb, 0x0ac5, 0x0acd, 0x0acd, 0x0acd, 0x0ad8, - // Entry 180 - 1BF - 0x0ad8, 0x0ad8, 0x0ad8, 0x0ae1, 0x0ae1, 0x0ae1, 0x0ae8, 0x0af8, - 0x0af8, 0x0b06, 0x0b06, 0x0b0f, 0x0b16, 0x0b1e, 0x0b26, 0x0b26, - 0x0b26, 0x0b31, 0x0b31, 0x0b39, 0x0b43, 0x0b4e, 0x0b4e, 0x0b56, - 0x0b56, 0x0b60, 0x0b60, 0x0b68, 0x0b70, 0x0b7c, 0x0b7c, 0x0b8a, - 0x0b92, 0x0b9c, 0x0bab, 0x0bab, 0x0bb6, 0x0bbf, 0x0bc6, 0x0bc6, - 0x0bd1, 0x0be8, 0x0bf0, 0x0bfa, 0x0bfa, 0x0bfa, 0x0bfa, 0x0c03, - 0x0c11, 0x0c11, 0x0c1e, 0x0c26, 0x0c47, 0x0c50, 0x0c58, 0x0c62, - 0x0c62, 0x0c6a, 0x0c76, 0x0c7f, 0x0c7f, 0x0c7f, 0x0c86, 0x0c97, - // Entry 1C0 - 1FF - 0x0c9f, 0x0c9f, 0x0c9f, 0x0caa, 0x0caa, 0x0caa, 0x0caa, 0x0caa, - 0x0cb8, 0x0cb8, 0x0cc4, 0x0cd1, 0x0cdb, 0x0cdb, 0x0cf0, 0x0cf0, - 0x0cf0, 0x0cf0, 0x0cf0, 0x0cf0, 0x0cf0, 0x0cf0, 0x0cf0, 0x0cf8, - 0x0cf8, 0x0d01, 0x0d01, 0x0d01, 0x0d0b, 0x0d1a, 0x0d1a, 0x0d1a, - 0x0d23, 0x0d23, 0x0d23, 0x0d23, 0x0d23, 0x0d2a, 0x0d31, 0x0d3b, - 0x0d43, 0x0d43, 0x0d4d, 0x0d4d, 0x0d57, 0x0d57, 0x0d62, 0x0d6b, - 0x0d78, 0x0d80, 0x0d80, 0x0d90, 0x0d90, 0x0d98, 0x0d98, 0x0d98, - 0x0daa, 0x0daa, 0x0daa, 0x0db6, 0x0dbe, 0x0dbe, 0x0dbe, 0x0dbe, - // Entry 200 - 23F - 0x0dbe, 0x0dcd, 0x0dda, 0x0de8, 0x0df7, 0x0e01, 0x0e01, 0x0e1d, - 0x0e1d, 0x0e25, 0x0e25, 0x0e2f, 0x0e2f, 0x0e2f, 0x0e3b, 0x0e3b, - 0x0e45, 0x0e45, 0x0e45, 0x0e4e, 0x0e56, 0x0e56, 0x0e5f, 0x0e68, - 0x0e68, 0x0e68, 0x0e68, 0x0e73, 0x0e73, 0x0e73, 0x0e73, 0x0e73, - 0x0e82, 0x0e82, 0x0e8c, 0x0e8c, 0x0e8c, 0x0e8c, 0x0e97, 0x0ea1, - 0x0eac, 0x0eb8, 0x0ed5, 0x0edf, 0x0edf, 0x0eea, 0x0ef1, 0x0ef7, - 0x0ef7, 0x0ef7, 0x0ef7, 0x0ef7, 0x0ef7, 0x0ef7, 0x0f01, 0x0f0b, - 0x0f15, 0x0f1e, 0x0f1e, 0x0f29, 0x0f29, 0x0f33, 0x0f33, 0x0f3a, - // Entry 240 - 27F - 0x0f3a, 0x0f3a, 0x0f45, 0x0f4e, 0x0f4e, 0x0f5a, 0x0f5a, 0x0f5a, - 0x0f5a, 0x0f5a, 0x0f7a, 0x0f81, 0x0f9e, 0x0fa6, 0x0fc1, 0x0fc1, - 0x0fd7, 0x1001, 0x1016, 0x1028, 0x103b, 0x104e, 0x1069, 0x107d, - 0x1091, 0x1091, 0x10a6, 0x10bc, 0x10e5, 0x10f0, 0x1108, 0x111f, - 0x1129, 0x1138, 0x114b, -} // Size: 1246 bytes - -const srLangStr string = "" + // Size: 8071 bytes - "афарскиабхаскиавестанскиафрикансаканскиамхарскиарагонскиарапскиасамскиав" + - "арскиајмараазербејџанскибашкирскибелорускибугарскибисламабамбарабенгалс" + - "китибетанскибретонскибосанскикаталонскичеченскичаморокорзиканскикричешк" + - "ицрквенословенскичувашкивелшкиданскинемачкималдивскиџонгаевегрчкиенглес" + - "киесперантошпанскиестонскибаскијскиперсијскифулафинскифиџијскифарскифра" + - "нцускизападни фризијскиирскишкотски гелскигалицијскигваранигуџаратиманк" + - "схаусахебрејскихиндихири мотухрватскихаићанскимађарскијерменскихерероин" + - "терлингваиндонежанскиинтерлингвеигбосечуански јиинупикидоисландскиитали" + - "јанскиинуитскијапанскијаванскигрузијскиконгокикујуквањамаказашкигренлан" + - "дскикмерскиканадакорејскиканурикашмирскикурдскикомикорнволскикиргискила" + - "тинскилуксембуршкигандалимбуршкилингалалаоскилитванскилуба-катангалетон" + - "скималгашкимаршалскимаорскимакедонскималајаламмонголскимаратималајскима" + - "лтешкибурманскинаурускисеверни ндебеленепалскиндонгахоландскинорвешки н" + - "инорскнорвешки букмолјужни ндебеленавахоњанџаокситанскиоџибвеоромоодија" + - "осетинскипенџапскипалипољскипаштунскипортугалскикечуароманшкирундирумун" + - "скирускикињаруандасанскритсардинскисиндисеверни самисангосинхалешкислов" + - "ачкисловеначкисамоанскишонасомалскиалбанскисрпскисвазисесотосунданскишв" + - "едскисвахилитамилскителугутаџичкитајскитигрињатуркменскицванатонганскит" + - "урскицонгататарскитахићанскиујгурскиукрајинскиурдуузбечкивендавијетнамс" + - "киволапиквалонскиволофкосајидишјорубаџуаншкикинескизулуацешкиаколиаданг" + - "меадигејскиафрихилиагемаинуакадијскиалеутскијужноалтајскистароенглескиа" + - "нгикаарамејскимапучеарапахоаравачкиасуастуријскиавадибелучкибалијскибас" + - "абеџабембабеназападни белучкибоџпурибиколбинисисикабрајбодобурјатскибуг" + - "ијскиблинскикадокарипскиатсамсебуанскичигачипчачагатајчучкимаричинучкич" + - "октавскичипевјанскичерокичејенскицентрални курдскикоптскикримскотатарск" + - "исејшелски креолски францускикашупскидакотадаргинскитаитаделаверскислеј" + - "видогрипскидинказармадогридоњи лужичкосрпскидуаласредњехоландскиџола фо" + - "њиђуладазагаембуефичкистароегипатскиекаџукеламитскисредњеенглескиевондо" + - "фангфилипинскифонсредњефранцускистарофранцускисевернофризијскиисточнофр" + - "изијскифриулскигагагаузгајогбајагеезгилбертскисредњи високонемачкистаро" + - "немачкигондигоронталоготскигребостарогрчкиШвајцарски немачкигусигвичинс" + - "кихаидахавајскихилигајнонскихетитскихмоншкигорњи лужичкосрпскихупаибанс" + - "киибибиоилокоингушкиложбаннгомбамачамејудео-персијскијудео-арапскикара-" + - "калпашкикабилекачинскиџукамбакавикабардијскитјапмакондезеленортскикорок" + - "асикотанешкикојра чииникакокаленџинскикимбундукоми-пермскиконканикосрен" + - "скикпелекарачајско-балкарскикриокарелскикурукшамбалабафијакелнскикумичк" + - "икутенајладинолангиландаламбалезгинскилакотамонголозисеверни лурилуба-л" + - "улуалуисењолундалуомизолујиамадурскимагахимаитилимакасарскимандингомаса" + - "јскимокшамандармендемеруморисјенсредњеирскимакува-митометамикмакминангк" + - "абауманџурскиманипурскимохочкимосимундангВише језикакришкимирандскимарв" + - "ариерзјамазандеранскинапуљскинаманисконемачкиневариниасниуејскиквасионг" + - "иембунногајскистаронордијскинкосеверни сотонуеркласични неварскињамвези" + - "њанколењоронзимаосагеосмански турскипангасинанскипахлавипампангапапиаме" + - "нтопалаускинигеријски пиџинстароперсијскифеничанскипонпејскипрускистаро" + - "окситанскикичераџастанскирапануираротонганскиромборомскицинцарскируасан" + - "давејакутскисамаријански арамејскисамбурусасаксанталингамбајсангусицили" + - "јанскишкотскијужнокурдскисенаселкупскикојраборо сенистароирскиташелхитш" + - "анскисидамојужни самилуле самиинари самисколтски лапонскисонинкесогдијс" + - "кисранан тонгосерерскисахосукумасусусумерскикоморскисиријачкисиријскити" + - "мнетесотеренотетумтигретивтокелауклингонскитлингиттамашекњаса тонгаток " + - "писинтарокоцимшиантумбукатувалутасавактувинскицентралноатласки тамазигт" + - "удмуртскиугаритскиумбундуРутваиводскивунџовалсерскиволајтаварајскивашов" + - "арлпирикалмичкисогајаојапскијангбенјембакантонскизапотечкиблисимболизен" + - "агастандардни марокански тамазигтзунибез лингвистичког садржајазазасавр" + - "емени стандардни арапскишвајцарски високи немачкиенглески (Велика Брита" + - "нија)енглески (Сједињене Америчке Државе)нискосаксонскифламанскипортуга" + - "лски (Португал)молдавскисрпскохрватскикисвахилипоједностављени кинескит" + - "радиционални кинески" - -var srLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000e, 0x001c, 0x0030, 0x0040, 0x004e, 0x005e, 0x0070, - 0x007e, 0x008c, 0x009a, 0x00a6, 0x00c0, 0x00d2, 0x00e4, 0x00f4, - 0x0102, 0x0110, 0x0122, 0x0136, 0x0148, 0x0158, 0x016c, 0x017c, - 0x0188, 0x019e, 0x01a4, 0x01ae, 0x01ce, 0x01dc, 0x01e8, 0x01f4, - 0x0202, 0x0214, 0x021e, 0x0224, 0x022e, 0x023e, 0x0250, 0x025e, - 0x026e, 0x0280, 0x0292, 0x029a, 0x02a6, 0x02b6, 0x02c2, 0x02d4, - 0x02f5, 0x02ff, 0x031a, 0x032e, 0x033c, 0x034c, 0x0356, 0x0360, - 0x0372, 0x037c, 0x038d, 0x039d, 0x03af, 0x03bf, 0x03d1, 0x03dd, - // Entry 40 - 7F - 0x03f3, 0x040b, 0x0421, 0x0429, 0x0440, 0x044c, 0x0452, 0x0464, - 0x047a, 0x048a, 0x049a, 0x04aa, 0x04bc, 0x04c6, 0x04d2, 0x04e0, - 0x04ee, 0x0504, 0x0512, 0x051e, 0x052e, 0x053a, 0x054c, 0x055a, - 0x0562, 0x0576, 0x0586, 0x0596, 0x05ae, 0x05b8, 0x05ca, 0x05d8, - 0x05e4, 0x05f6, 0x060d, 0x061d, 0x062d, 0x063f, 0x064d, 0x0661, - 0x0673, 0x0685, 0x0691, 0x06a1, 0x06b1, 0x06c3, 0x06d3, 0x06f0, - 0x0700, 0x070c, 0x071e, 0x073d, 0x075a, 0x0773, 0x077f, 0x0789, - 0x079d, 0x07a9, 0x07b3, 0x07bd, 0x07cf, 0x07e1, 0x07e9, 0x07f5, - // Entry 80 - BF - 0x0807, 0x081d, 0x0827, 0x0833, 0x0841, 0x0851, 0x085b, 0x086f, - 0x087f, 0x0891, 0x089b, 0x08b2, 0x08bc, 0x08d0, 0x08e0, 0x08f4, - 0x0906, 0x090e, 0x091e, 0x092e, 0x093a, 0x0944, 0x0950, 0x0962, - 0x0970, 0x097e, 0x098e, 0x099a, 0x09a8, 0x09b4, 0x09c2, 0x09d6, - 0x09e0, 0x09f2, 0x09fe, 0x0a08, 0x0a18, 0x0a2c, 0x0a3c, 0x0a50, - 0x0a58, 0x0a66, 0x0a70, 0x0a86, 0x0a94, 0x0aa4, 0x0aae, 0x0ab6, - 0x0ac0, 0x0acc, 0x0ada, 0x0ae8, 0x0af0, 0x0afc, 0x0b06, 0x0b14, - 0x0b26, 0x0b26, 0x0b36, 0x0b3e, 0x0b46, 0x0b58, 0x0b58, 0x0b68, - // Entry C0 - FF - 0x0b68, 0x0b82, 0x0b9c, 0x0ba8, 0x0bba, 0x0bc6, 0x0bc6, 0x0bd4, - 0x0bd4, 0x0bd4, 0x0be4, 0x0be4, 0x0be4, 0x0bea, 0x0bea, 0x0bfe, - 0x0bfe, 0x0c08, 0x0c16, 0x0c26, 0x0c26, 0x0c2e, 0x0c2e, 0x0c2e, - 0x0c2e, 0x0c36, 0x0c40, 0x0c40, 0x0c48, 0x0c48, 0x0c48, 0x0c65, - 0x0c73, 0x0c7d, 0x0c85, 0x0c85, 0x0c85, 0x0c91, 0x0c91, 0x0c91, - 0x0c99, 0x0c99, 0x0ca1, 0x0ca1, 0x0cb3, 0x0cc3, 0x0cc3, 0x0cd1, - 0x0cd1, 0x0cd9, 0x0ce9, 0x0ce9, 0x0cf3, 0x0d05, 0x0d0d, 0x0d17, - 0x0d25, 0x0d2f, 0x0d37, 0x0d45, 0x0d57, 0x0d6d, 0x0d79, 0x0d89, - // Entry 100 - 13F - 0x0daa, 0x0db8, 0x0db8, 0x0dd6, 0x0e0c, 0x0e1c, 0x0e28, 0x0e3a, - 0x0e44, 0x0e58, 0x0e64, 0x0e76, 0x0e80, 0x0e8a, 0x0e94, 0x0eb7, - 0x0eb7, 0x0ec1, 0x0edf, 0x0ef0, 0x0ef8, 0x0f04, 0x0f0c, 0x0f18, - 0x0f18, 0x0f34, 0x0f40, 0x0f52, 0x0f6e, 0x0f6e, 0x0f7a, 0x0f7a, - 0x0f82, 0x0f96, 0x0f96, 0x0f9c, 0x0f9c, 0x0fba, 0x0fd6, 0x0fd6, - 0x0ff6, 0x1016, 0x1026, 0x102a, 0x1036, 0x1036, 0x103e, 0x1048, - 0x1048, 0x1050, 0x1064, 0x1064, 0x108b, 0x10a3, 0x10a3, 0x10ad, - 0x10bf, 0x10cb, 0x10d5, 0x10e9, 0x110c, 0x110c, 0x110c, 0x1114, - // Entry 140 - 17F - 0x1126, 0x1130, 0x1130, 0x1140, 0x1140, 0x115a, 0x116a, 0x1178, - 0x119d, 0x119d, 0x11a5, 0x11b3, 0x11bf, 0x11c9, 0x11d7, 0x11d7, - 0x11d7, 0x11e3, 0x11ef, 0x11fb, 0x1218, 0x1231, 0x1231, 0x124a, - 0x1256, 0x1266, 0x126a, 0x1274, 0x127c, 0x1292, 0x1292, 0x129a, - 0x12a8, 0x12be, 0x12be, 0x12c6, 0x12c6, 0x12ce, 0x12e0, 0x12f5, - 0x12f5, 0x12f5, 0x12fd, 0x1313, 0x1323, 0x133a, 0x1348, 0x135a, - 0x1364, 0x138b, 0x1393, 0x1393, 0x13a3, 0x13ad, 0x13bb, 0x13c7, - 0x13d5, 0x13e3, 0x13f1, 0x13fd, 0x1407, 0x1411, 0x141b, 0x142d, - // Entry 180 - 1BF - 0x142d, 0x142d, 0x142d, 0x1439, 0x1439, 0x1443, 0x144b, 0x1462, - 0x1462, 0x1475, 0x1483, 0x148d, 0x1493, 0x149b, 0x14a5, 0x14a5, - 0x14a5, 0x14b5, 0x14b5, 0x14c1, 0x14cf, 0x14e3, 0x14f3, 0x1503, - 0x1503, 0x150d, 0x1519, 0x1523, 0x152b, 0x153b, 0x1551, 0x1566, - 0x156e, 0x157a, 0x1590, 0x15a2, 0x15b6, 0x15c4, 0x15cc, 0x15cc, - 0x15da, 0x15ef, 0x15fb, 0x160d, 0x161b, 0x161b, 0x161b, 0x1625, - 0x163f, 0x163f, 0x164f, 0x1657, 0x166f, 0x167b, 0x1683, 0x1693, - 0x1693, 0x169f, 0x16af, 0x16bf, 0x16db, 0x16db, 0x16e1, 0x16f8, - // Entry 1C0 - 1FF - 0x1700, 0x1721, 0x172f, 0x173d, 0x1745, 0x174f, 0x1759, 0x1776, - 0x1790, 0x179e, 0x17ae, 0x17c2, 0x17d2, 0x17d2, 0x17f1, 0x17f1, - 0x17f1, 0x180d, 0x180d, 0x1821, 0x1821, 0x1821, 0x1833, 0x183f, - 0x185d, 0x1865, 0x1865, 0x187b, 0x1889, 0x18a3, 0x18a3, 0x18a3, - 0x18ad, 0x18b9, 0x18b9, 0x18b9, 0x18b9, 0x18cb, 0x18d1, 0x18df, - 0x18ef, 0x191a, 0x1928, 0x1932, 0x1940, 0x1940, 0x194e, 0x1958, - 0x1970, 0x197e, 0x197e, 0x1996, 0x1996, 0x199e, 0x199e, 0x19b0, - 0x19cb, 0x19df, 0x19df, 0x19ef, 0x19fb, 0x19fb, 0x1a07, 0x1a07, - // Entry 200 - 23F - 0x1a07, 0x1a1a, 0x1a2b, 0x1a3e, 0x1a5f, 0x1a6d, 0x1a7f, 0x1a96, - 0x1aa6, 0x1aae, 0x1aae, 0x1aba, 0x1ac2, 0x1ad2, 0x1ae2, 0x1af4, - 0x1b04, 0x1b04, 0x1b04, 0x1b0e, 0x1b16, 0x1b22, 0x1b2c, 0x1b36, - 0x1b3c, 0x1b4a, 0x1b4a, 0x1b5e, 0x1b6c, 0x1b6c, 0x1b7a, 0x1b8d, - 0x1b9e, 0x1b9e, 0x1baa, 0x1baa, 0x1bb8, 0x1bb8, 0x1bc6, 0x1bd2, - 0x1be0, 0x1bf0, 0x1c21, 0x1c33, 0x1c45, 0x1c53, 0x1c59, 0x1c5f, - 0x1c5f, 0x1c5f, 0x1c5f, 0x1c5f, 0x1c6b, 0x1c6b, 0x1c75, 0x1c87, - 0x1c95, 0x1ca5, 0x1cad, 0x1cbd, 0x1cbd, 0x1ccd, 0x1ccd, 0x1cd5, - // Entry 240 - 27F - 0x1cdb, 0x1ce7, 0x1cf5, 0x1cff, 0x1cff, 0x1d11, 0x1d23, 0x1d37, - 0x1d37, 0x1d43, 0x1d7d, 0x1d85, 0x1db7, 0x1dbf, 0x1df5, 0x1df5, - 0x1df5, 0x1e25, 0x1e25, 0x1e25, 0x1e57, 0x1e9a, 0x1e9a, 0x1e9a, - 0x1e9a, 0x1e9a, 0x1e9a, 0x1e9a, 0x1eb6, 0x1ec8, 0x1ec8, 0x1ef1, - 0x1f03, 0x1f1f, 0x1f31, 0x1f5e, 0x1f87, -} // Size: 1250 bytes - -const srLatnLangStr string = "" + // Size: 4236 bytes - "afarskiabhaskiavestanskiafrikansakanskiamharskiaragonskiarapskiasamskiav" + - "arskiajmaraazerbejdžanskibaškirskibeloruskibugarskibislamabambarabengals" + - "kitibetanskibretonskibosanskikatalonskičečenskičamorokorzikanskikričeški" + - "crkvenoslovenskičuvaškivelškidanskinemačkimaldivskidžongaevegrčkienglesk" + - "iesperantošpanskiestonskibaskijskipersijskifulafinskifidžijskifarskifran" + - "cuskizapadni frizijskiirskiškotski gelskigalicijskigvaranigudžaratimanks" + - "hausahebrejskihindihiri motuhrvatskihaićanskimađarskijermenskihererointe" + - "rlingvaindonežanskiinterlingveigbosečuanski jiinupikidoislandskiitalijan" + - "skiinuitskijapanskijavanskigruzijskikongokikujukvanjamakazaškigrenlandsk" + - "ikmerskikanadakorejskikanurikašmirskikurdskikomikornvolskikirgiskilatins" + - "kiluksemburškigandalimburškilingalalaoskilitvanskiluba-katangaletonskima" + - "lgaškimaršalskimaorskimakedonskimalajalammongolskimaratimalajskimalteški" + - "burmanskinauruskiseverni ndebelenepalskindongaholandskinorveški ninorskn" + - "orveški bukmoljužni ndebelenavahonjandžaoksitanskiodžibveoromoodijaoseti" + - "nskipendžapskipalipoljskipaštunskiportugalskikečuaromanškirundirumunskir" + - "uskikinjaruandasanskritsardinskisindiseverni samisangosinhaleškislovački" + - "slovenačkisamoanskišonasomalskialbanskisrpskisvazisesotosundanskišvedski" + - "svahilitamilskitelugutadžičkitajskitigrinjaturkmenskicvanatonganskitursk" + - "icongatatarskitahićanskiujgurskiukrajinskiurduuzbečkivendavijetnamskivol" + - "apikvalonskivolofkosajidišjorubadžuanškikineskizuluaceškiakoliadangmeadi" + - "gejskiafrihiliagemainuakadijskialeutskijužnoaltajskistaroengleskiangikaa" + - "ramejskimapučearapahoaravačkiasuasturijskiavadibelučkibalijskibasabedžab" + - "embabenazapadni belučkibodžpuribikolbinisisikabrajbodoburjatskibugijskib" + - "linskikadokaripskiatsamsebuanskičigačipčačagatajčučkimaričinučkičoktavsk" + - "ičipevjanskičerokičejenskicentralni kurdskikoptskikrimskotatarskisejšels" + - "ki kreolski francuskikašupskidakotadarginskitaitadelaverskislejvidogrips" + - "kidinkazarmadogridonji lužičkosrpskidualasrednjeholandskidžola fonjiđula" + - "dazagaembuefičkistaroegipatskiekadžukelamitskisrednjeengleskievondofangf" + - "ilipinskifonsrednjefrancuskistarofrancuskisevernofrizijskiistočnofrizijs" + - "kifriulskigagagauzgajogbajageezgilbertskisrednji visokonemačkistaronemač" + - "kigondigorontalogotskigrebostarogrčkiŠvajcarski nemačkigusigvičinskihaid" + - "ahavajskihiligajnonskihetitskihmonškigornji lužičkosrpskihupaibanskiibib" + - "ioilokoinguškiložbanngombamačamejudeo-persijskijudeo-arapskikara-kalpašk" + - "ikabilekačinskidžukambakavikabardijskitjapmakondezelenortskikorokasikota" + - "neškikojra čiinikakokalendžinskikimbundukomi-permskikonkanikosrenskikpel" + - "ekaračajsko-balkarskikriokarelskikurukšambalabafijakelnskikumičkikutenaj" + - "ladinolangilandalambalezginskilakotamongoloziseverni luriluba-lulualuise" + - "njolundaluomizolujiamadurskimagahimaitilimakasarskimandingomasajskimokša" + - "mandarmendemerumorisjensrednjeirskimakuva-mitometamikmakminangkabaumandž" + - "urskimanipurskimohočkimosimundangViše jezikakriškimirandskimarvarierzjam" + - "azanderanskinapuljskinamaniskonemačkinevariniasniuejskikvasiongiembunnog" + - "ajskistaronordijskinkoseverni sotonuerklasični nevarskinjamvezinjankolen" + - "joronzimaosageosmanski turskipangasinanskipahlavipampangapapiamentopalau" + - "skinigerijski pidžinstaropersijskifeničanskiponpejskipruskistarooksitans" + - "kikičeradžastanskirapanuirarotonganskiromboromskicincarskiruasandavejaku" + - "tskisamarijanski aramejskisamburusasaksantalingambajsangusicilijanskiško" + - "tskijužnokurdskisenaselkupskikojraboro senistaroirskitašelhitšanskisidam" + - "ojužni samilule samiinari samiskoltski laponskisoninkesogdijskisranan to" + - "ngosererskisahosukumasususumerskikomorskisirijačkisirijskitimnetesoteren" + - "otetumtigretivtokelauklingonskitlingittamašeknjasa tongatok pisintarokoc" + - "imšiantumbukatuvalutasavaktuvinskicentralnoatlaski tamazigtudmurtskiugar" + - "itskiumbunduRutvaivodskivundžovalserskivolajtavarajskivašovarlpirikalmič" + - "kisogajaojapskijangbenjembakantonskizapotečkiblisimbolizenagastandardni " + - "marokanski tamazigtzunibez lingvističkog sadržajazazasavremeni standardn" + - "i arapskišvajcarski visoki nemačkiengleski (Velika Britanija)engleski (S" + - "jedinjene Američke Države)niskosaksonskiflamanskiportugalski (Portugal)m" + - "oldavskisrpskohrvatskikisvahilipojednostavljeni kineskitradicionalni kin" + - "eski" - -var srLatnLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0007, 0x000e, 0x0018, 0x0020, 0x0027, 0x002f, 0x0038, - 0x003f, 0x0046, 0x004d, 0x0053, 0x0062, 0x006c, 0x0075, 0x007d, - 0x0084, 0x008b, 0x0094, 0x009e, 0x00a7, 0x00af, 0x00b9, 0x00c3, - 0x00ca, 0x00d5, 0x00d8, 0x00df, 0x00ef, 0x00f8, 0x00ff, 0x0105, - 0x010d, 0x0116, 0x011d, 0x0120, 0x0126, 0x012e, 0x0137, 0x013f, - 0x0147, 0x0150, 0x0159, 0x015d, 0x0163, 0x016d, 0x0173, 0x017c, - 0x018d, 0x0192, 0x01a1, 0x01ab, 0x01b2, 0x01bc, 0x01c1, 0x01c6, - 0x01cf, 0x01d4, 0x01dd, 0x01e5, 0x01ef, 0x01f8, 0x0201, 0x0207, - // Entry 40 - 7F - 0x0212, 0x021f, 0x022a, 0x022e, 0x023b, 0x0241, 0x0244, 0x024d, - 0x0258, 0x0260, 0x0268, 0x0270, 0x0279, 0x027e, 0x0284, 0x028c, - 0x0294, 0x029f, 0x02a6, 0x02ac, 0x02b4, 0x02ba, 0x02c4, 0x02cb, - 0x02cf, 0x02d9, 0x02e1, 0x02e9, 0x02f6, 0x02fb, 0x0305, 0x030c, - 0x0312, 0x031b, 0x0327, 0x032f, 0x0338, 0x0342, 0x0349, 0x0353, - 0x035c, 0x0365, 0x036b, 0x0373, 0x037c, 0x0385, 0x038d, 0x039c, - 0x03a4, 0x03aa, 0x03b3, 0x03c4, 0x03d4, 0x03e2, 0x03e8, 0x03f0, - 0x03fa, 0x0402, 0x0407, 0x040c, 0x0415, 0x0420, 0x0424, 0x042b, - // Entry 80 - BF - 0x0435, 0x0440, 0x0446, 0x044d, 0x0454, 0x045c, 0x0461, 0x046c, - 0x0474, 0x047d, 0x0482, 0x048e, 0x0493, 0x049e, 0x04a7, 0x04b2, - 0x04bb, 0x04c0, 0x04c8, 0x04d0, 0x04d6, 0x04db, 0x04e1, 0x04ea, - 0x04f2, 0x04f9, 0x0501, 0x0507, 0x0511, 0x0517, 0x051f, 0x0529, - 0x052e, 0x0537, 0x053d, 0x0542, 0x054a, 0x0555, 0x055d, 0x0567, - 0x056b, 0x0573, 0x0578, 0x0583, 0x058a, 0x0592, 0x0597, 0x059b, - 0x05a1, 0x05a7, 0x05b1, 0x05b8, 0x05bc, 0x05c3, 0x05c8, 0x05cf, - 0x05d8, 0x05d8, 0x05e0, 0x05e4, 0x05e8, 0x05f1, 0x05f1, 0x05f9, - // Entry C0 - FF - 0x05f9, 0x0607, 0x0614, 0x061a, 0x0623, 0x062a, 0x062a, 0x0631, - 0x0631, 0x0631, 0x063a, 0x063a, 0x063a, 0x063d, 0x063d, 0x0647, - 0x0647, 0x064c, 0x0654, 0x065c, 0x065c, 0x0660, 0x0660, 0x0660, - 0x0660, 0x0666, 0x066b, 0x066b, 0x066f, 0x066f, 0x066f, 0x067f, - 0x0688, 0x068d, 0x0691, 0x0691, 0x0691, 0x0697, 0x0697, 0x0697, - 0x069b, 0x069b, 0x069f, 0x069f, 0x06a8, 0x06b0, 0x06b0, 0x06b7, - 0x06b7, 0x06bb, 0x06c3, 0x06c3, 0x06c8, 0x06d1, 0x06d6, 0x06dd, - 0x06e5, 0x06ec, 0x06f0, 0x06f9, 0x0703, 0x070f, 0x0716, 0x071f, - // Entry 100 - 13F - 0x0730, 0x0737, 0x0737, 0x0746, 0x0763, 0x076c, 0x0772, 0x077b, - 0x0780, 0x078a, 0x0790, 0x0799, 0x079e, 0x07a3, 0x07a8, 0x07bd, - 0x07bd, 0x07c2, 0x07d2, 0x07de, 0x07e3, 0x07e9, 0x07ed, 0x07f4, - 0x07f4, 0x0802, 0x080a, 0x0813, 0x0822, 0x0822, 0x0828, 0x0828, - 0x082c, 0x0836, 0x0836, 0x0839, 0x0839, 0x0849, 0x0857, 0x0857, - 0x0867, 0x0878, 0x0880, 0x0882, 0x0888, 0x0888, 0x088c, 0x0891, - 0x0891, 0x0895, 0x089f, 0x089f, 0x08b5, 0x08c2, 0x08c2, 0x08c7, - 0x08d0, 0x08d6, 0x08db, 0x08e6, 0x08fa, 0x08fa, 0x08fa, 0x08fe, - // Entry 140 - 17F - 0x0908, 0x090d, 0x090d, 0x0915, 0x0915, 0x0922, 0x092a, 0x0932, - 0x0948, 0x0948, 0x094c, 0x0953, 0x0959, 0x095e, 0x0966, 0x0966, - 0x0966, 0x096d, 0x0973, 0x097a, 0x0989, 0x0996, 0x0996, 0x09a4, - 0x09aa, 0x09b3, 0x09b7, 0x09bc, 0x09c0, 0x09cb, 0x09cb, 0x09cf, - 0x09d6, 0x09e1, 0x09e1, 0x09e5, 0x09e5, 0x09e9, 0x09f3, 0x09ff, - 0x09ff, 0x09ff, 0x0a03, 0x0a10, 0x0a18, 0x0a24, 0x0a2b, 0x0a34, - 0x0a39, 0x0a4e, 0x0a52, 0x0a52, 0x0a5a, 0x0a5f, 0x0a67, 0x0a6d, - 0x0a74, 0x0a7c, 0x0a83, 0x0a89, 0x0a8e, 0x0a93, 0x0a98, 0x0aa1, - // Entry 180 - 1BF - 0x0aa1, 0x0aa1, 0x0aa1, 0x0aa7, 0x0aa7, 0x0aac, 0x0ab0, 0x0abc, - 0x0abc, 0x0ac6, 0x0ace, 0x0ad3, 0x0ad6, 0x0ada, 0x0adf, 0x0adf, - 0x0adf, 0x0ae7, 0x0ae7, 0x0aed, 0x0af4, 0x0afe, 0x0b06, 0x0b0e, - 0x0b0e, 0x0b14, 0x0b1a, 0x0b1f, 0x0b23, 0x0b2b, 0x0b37, 0x0b42, - 0x0b46, 0x0b4c, 0x0b57, 0x0b62, 0x0b6c, 0x0b74, 0x0b78, 0x0b78, - 0x0b7f, 0x0b8b, 0x0b92, 0x0b9b, 0x0ba2, 0x0ba2, 0x0ba2, 0x0ba7, - 0x0bb4, 0x0bb4, 0x0bbd, 0x0bc1, 0x0bce, 0x0bd4, 0x0bd8, 0x0be0, - 0x0be0, 0x0be6, 0x0bee, 0x0bf6, 0x0c04, 0x0c04, 0x0c07, 0x0c13, - // Entry 1C0 - 1FF - 0x0c17, 0x0c29, 0x0c31, 0x0c39, 0x0c3e, 0x0c43, 0x0c48, 0x0c57, - 0x0c64, 0x0c6b, 0x0c73, 0x0c7d, 0x0c85, 0x0c85, 0x0c97, 0x0c97, - 0x0c97, 0x0ca5, 0x0ca5, 0x0cb0, 0x0cb0, 0x0cb0, 0x0cb9, 0x0cbf, - 0x0cce, 0x0cd3, 0x0cd3, 0x0ce0, 0x0ce7, 0x0cf4, 0x0cf4, 0x0cf4, - 0x0cf9, 0x0cff, 0x0cff, 0x0cff, 0x0cff, 0x0d08, 0x0d0b, 0x0d12, - 0x0d1a, 0x0d30, 0x0d37, 0x0d3c, 0x0d43, 0x0d43, 0x0d4a, 0x0d4f, - 0x0d5b, 0x0d63, 0x0d63, 0x0d70, 0x0d70, 0x0d74, 0x0d74, 0x0d7d, - 0x0d8b, 0x0d95, 0x0d95, 0x0d9e, 0x0da5, 0x0da5, 0x0dab, 0x0dab, - // Entry 200 - 23F - 0x0dab, 0x0db6, 0x0dbf, 0x0dc9, 0x0dda, 0x0de1, 0x0dea, 0x0df6, - 0x0dfe, 0x0e02, 0x0e02, 0x0e08, 0x0e0c, 0x0e14, 0x0e1c, 0x0e26, - 0x0e2e, 0x0e2e, 0x0e2e, 0x0e33, 0x0e37, 0x0e3d, 0x0e42, 0x0e47, - 0x0e4a, 0x0e51, 0x0e51, 0x0e5b, 0x0e62, 0x0e62, 0x0e6a, 0x0e75, - 0x0e7e, 0x0e7e, 0x0e84, 0x0e84, 0x0e8c, 0x0e8c, 0x0e93, 0x0e99, - 0x0ea0, 0x0ea8, 0x0ec1, 0x0eca, 0x0ed3, 0x0eda, 0x0edd, 0x0ee0, - 0x0ee0, 0x0ee0, 0x0ee0, 0x0ee0, 0x0ee6, 0x0ee6, 0x0eed, 0x0ef6, - 0x0efd, 0x0f05, 0x0f0a, 0x0f12, 0x0f12, 0x0f1b, 0x0f1b, 0x0f1f, - // Entry 240 - 27F - 0x0f22, 0x0f28, 0x0f2f, 0x0f34, 0x0f34, 0x0f3d, 0x0f47, 0x0f51, - 0x0f51, 0x0f57, 0x0f75, 0x0f79, 0x0f95, 0x0f99, 0x0fb5, 0x0fb5, - 0x0fb5, 0x0fd0, 0x0fd0, 0x0fd0, 0x0feb, 0x1012, 0x1012, 0x1012, - 0x1012, 0x1012, 0x1012, 0x1012, 0x1020, 0x1029, 0x1029, 0x103f, - 0x1048, 0x1056, 0x105f, 0x1077, 0x108c, -} // Size: 1250 bytes - -const svLangStr string = "" + // Size: 5455 bytes - "afarabchaziskaavestiskaafrikaansakanamhariskaaragonesiskaarabiskaassames" + - "iskaavariskaaymaraazerbajdzjanskabasjkiriskavitryskabulgariskabislamabam" + - "barabengalitibetanskabretonskabosniskakatalanskatjetjenskachamorrokorsik" + - "anskacreetjeckiskakyrkslaviskatjuvasjiskawalesiskadanskatyskadivehidzong" + - "khaewegrekiskaengelskaesperantospanskaestniskabaskiskapersiskafulanifins" + - "kafijianskafäröiskafranskavästfrisiskairiskaskotsk gäliskagaliciskaguara" + - "nígujaratimanxhausahebreiskahindihirimotukroatiskahaitiskaungerskaarmeni" + - "skahererointerlinguaindonesiskainterlingueigboszezuan iinupiakidoisländs" + - "kaitalienskainuktitutjapanskajavanesiskageorgiskakikongokikuyukuanyamaka" + - "zakiskagrönländskakambodjanskakannadakoreanskakanurikashmiriskakurdiskak" + - "omekorniskakirgisiskalatinluxemburgiskalugandalimburgiskalingalalaotiska" + - "litauiskaluba-katangalettiskamalagassiskamarshalliskamaorimakedonskamala" + - "yalammongoliskamarathimalajiskamaltesiskaburmesiskanaurunordndebelenepal" + - "esiskandonganederländskanynorskabokmålsydndebelenavahonyanjaoccitanskaod" + - "jibwaoromooriyaossetiskapunjabipalipolskaafghanskaportugisiskaquechuarät" + - "oromanskarundirumänskaryskakinjarwandasanskritsardinskasindhinordsamiska" + - "sangosingalesiskaslovakiskaslovenskasamoanskashonasomaliskaalbanskaserbi" + - "skaswatisydsothosundanesiskasvenskaswahilitamiltelugutadzjikiskathailänd" + - "skatigrinjaturkmeniskatswanatonganskaturkiskatsongatatariskatahitiskauig" + - "uriskaukrainskaurduuzbekiskavendavietnamesiskavolapükvallonskawolofxhosa" + - "jiddischyorubazhuangkinesiskazuluacehnesiskaacholiadangmeadygeiskatunisi" + - "sk arabiskaafrihiliaghemainuakkadiskaAlabama-muskogeealeutiskagegiskasyd" + - "altaiskafornengelskaangikaarameiskamapudungunaraoniskaarapahoalgerisk ar" + - "abiskaarawakiskamarockansk arabiskaegyptisk arabiskaasuamerikanskt tecke" + - "nspråkasturiskakotavaawadhibaluchiskabalinesiskabayerskabasabamunskabata" + - "k-tobaghomalabejabembabetawiskabenabafutbagadavästbaluchiskabhojpuribiko" + - "lbinibanjariskabamekonsiksikabishnupriyabakhtiaribrajbrahuiskabodobakoss" + - "iburjätiskabuginesiskabouloublinbagangtecaddokaribiskacayugaatsamcebuano" + - "chigachibchachagataichuukesiskamariskachinookchoctawchipewyancherokesisk" + - "acheyennesoranisk kurdiskakoptiskakapisnonkrimtatariskaseychellisk kreol" + - "kasjubiskadakotadarginskataitadelawareslavejdogribdinkazarmadogrilågsorb" + - "iskacentraldusundualamedelnederländskajola-fonyidyuladazagaembuefikemili" + - "skafornegyptiskaekajukelamitiskamedelengelskacentralalaskisk jupiskaewon" + - "doextremaduriskafangfilippinskameänkielifonspråketcajun-franskamedelfran" + - "skafornfranskafrankoprovensalskanordfrisiskaöstfrisiskafriulianskagãgaga" + - "uziskagangayogbayazoroastrisk darietiopiskagilbertiskagilakimedelhögtysk" + - "afornhögtyskaGoa-konkanigondigorontalogotiskagreboforngrekiskaschweizert" + - "yskawayuufarefaregusiigwichinhaidahakkahawaiiskaFiji-hindihiligaynonhett" + - "itiskahmongspråkhögsorbiskaxianghupaibanskaibibioilokoingusjiskaingriska" + - "jamaikansk engelsk kreollojbanngombakimashamijudisk persiskajudisk arabi" + - "skajylländskakarakalpakiskakabyliskakachinjjukambakawikabardinskakanembu" + - "tyapmakondekapverdiskakenjangkorokaingangkhasikhotanesiskaTimbuktu-songh" + - "oykhowarkirmanjkimkakokalenjinkimbundukomi-permjakiskakonkanikosreanskak" + - "pellekarachay-balkarkriokinaray-akarelskakurukhkisambaabafiakölniskakumy" + - "kiskakutenajladinolangilahndalambalezghienlingua franca novaliguriskaliv" + - "oniskalakotalombardiskamongolozinordlurilettgalliskaluba-lulualuiseñolun" + - "daluolushailuhyalitterär kineiskalaziskamaduresiskamafamagahimaithilimak" + - "asarmandemassajiskamabamoksjamandarmendemerumauritansk kreolmedeliriskam" + - "akhuwa-meettometa’mi’kmaqminangkabaumanchuriskamanipurimohawkmossivästma" + - "riskamundangflera språkmuskogeemirandesiskamarwarimentawaimyeneerjyamaza" + - "nderanimin nannapolitanskanamalågtyskanewariskaniasniueanskaao-nagakwasi" + - "obamileké-ngiemboonnogaifornnordiskanovialn-kånordsothonuerklassisk newa" + - "riskanyamwezinyankolenyoronzimaosageottomanskapangasinanmedelpersiskapam" + - "pangapapiamentopalaupikardiskaNigeria-pidginPennsylvaniatyskamennonitisk" + - " lågtyskafornpersiskaPfalz-tyskafeniciskapiemontesiskapontiskapohnpeiska" + - "fornpreussiskafornprovensalskaquichéChimborazo-höglandskichwarajasthanir" + - "apanuirarotonganskaromagnolriffianskaromboromanirotumänskarusynrovianska" + - "arumänskarwasandawejakutiskasamaritanskasamburusasaksantalisaurashtranga" + - "mbaysangusicilianskaskotskasassaresisk sardiskasydkurdiskasenecasenaseri" + - "selkupGao-songhayforniriskasamogitiskatachelhitshanTchad-arabiskasidamol" + - "ågsilesiskaselayarsydsamiskalulesamiskaenaresamiskaskoltsamiskasoninkes" + - "ogdiskasranan tongoserersahosaterfrisiskasukumasususumeriskashimaoréklas" + - "sisk syriskasyriskasilesiskatulutemnetesoterenotetumtigrétivitokelauiska" + - "tsakhurklingonskatlingittalyshtamasheknyasatonganskatok pisinturoyotarok" + - "otsakodiskatsimshianmuslimsk tatariskatumbukatuvaluanskatasawaqtuviniska" + - "centralmarockansk tamazightudmurtiskaugaritiskaumbundurotvajvenetianskav" + - "epsvästflamländskaMain-frankiskavotiskavõruvunjowalsertyskawalamowaraywa" + - "showarlpiriwukalmuckiskamingrelianskalusogakiyaojapetiskayangbenbamileké" + - "-jembanheengatukantonesiskazapotekblissymbolerzeeländskazenagamarockansk" + - " standard-tamazightzuniinget språkligt innehållzazaiskamodern standardar" + - "abiskaösterrikisk tyskaschweizisk högtyskaaustralisk engelskakanadensisk" + - " engelskabrittisk engelskaamerikansk engelskalatinamerikansk spanskaeuro" + - "peisk spanskamexikansk spanskakanadensisk franskaschweizisk franskalågsa" + - "xiskaflamländskabrasiliansk portugisiskaeuropeisk portugisiskamoldaviska" + - "serbokroatiskaKongo-swahiliförenklad kinesiskatraditionell kinesiska" - -var svLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000e, 0x0017, 0x0020, 0x0024, 0x002d, 0x0039, - 0x0041, 0x004c, 0x0054, 0x005a, 0x0069, 0x0074, 0x007c, 0x0086, - 0x008d, 0x0094, 0x009b, 0x00a5, 0x00ae, 0x00b6, 0x00c0, 0x00ca, - 0x00d2, 0x00dd, 0x00e1, 0x00ea, 0x00f6, 0x0101, 0x010a, 0x0110, - 0x0115, 0x011b, 0x0123, 0x0126, 0x012e, 0x0136, 0x013f, 0x0146, - 0x014e, 0x0156, 0x015e, 0x0164, 0x016a, 0x0173, 0x017d, 0x0184, - 0x0191, 0x0197, 0x01a6, 0x01af, 0x01b7, 0x01bf, 0x01c3, 0x01c8, - 0x01d1, 0x01d6, 0x01de, 0x01e7, 0x01ef, 0x01f7, 0x0200, 0x0206, - // Entry 40 - 7F - 0x0211, 0x021c, 0x0227, 0x022b, 0x0234, 0x023b, 0x023e, 0x0248, - 0x0252, 0x025b, 0x0263, 0x026e, 0x0277, 0x027e, 0x0284, 0x028c, - 0x0295, 0x02a2, 0x02ae, 0x02b5, 0x02be, 0x02c4, 0x02cf, 0x02d7, - 0x02db, 0x02e3, 0x02ed, 0x02f2, 0x02ff, 0x0306, 0x0311, 0x0318, - 0x0320, 0x0329, 0x0335, 0x033d, 0x0349, 0x0355, 0x035a, 0x0364, - 0x036d, 0x0377, 0x037e, 0x0387, 0x0391, 0x039b, 0x03a0, 0x03ab, - 0x03b6, 0x03bc, 0x03c9, 0x03d1, 0x03d8, 0x03e2, 0x03e8, 0x03ee, - 0x03f8, 0x03ff, 0x0404, 0x0409, 0x0412, 0x0419, 0x041d, 0x0423, - // Entry 80 - BF - 0x042c, 0x0438, 0x043f, 0x044c, 0x0451, 0x045a, 0x045f, 0x046a, - 0x0472, 0x047b, 0x0481, 0x048c, 0x0491, 0x049d, 0x04a7, 0x04b0, - 0x04b9, 0x04be, 0x04c7, 0x04cf, 0x04d7, 0x04dc, 0x04e4, 0x04f0, - 0x04f7, 0x04fe, 0x0503, 0x0509, 0x0514, 0x0520, 0x0528, 0x0533, - 0x0539, 0x0542, 0x054a, 0x0550, 0x0559, 0x0562, 0x056b, 0x0574, - 0x0578, 0x0581, 0x0586, 0x0593, 0x059b, 0x05a4, 0x05a9, 0x05ae, - 0x05b6, 0x05bc, 0x05c2, 0x05cb, 0x05cf, 0x05da, 0x05e0, 0x05e7, - 0x05f0, 0x0601, 0x0609, 0x060e, 0x0612, 0x061b, 0x062b, 0x0634, - // Entry C0 - FF - 0x063b, 0x0646, 0x0652, 0x0658, 0x0661, 0x066b, 0x0674, 0x067b, - 0x068c, 0x068c, 0x0696, 0x06a9, 0x06ba, 0x06bd, 0x06d5, 0x06de, - 0x06e4, 0x06ea, 0x06f4, 0x06ff, 0x0707, 0x070b, 0x0713, 0x071d, - 0x0724, 0x0728, 0x072d, 0x0736, 0x073a, 0x073f, 0x0745, 0x0754, - 0x075c, 0x0761, 0x0765, 0x076f, 0x0776, 0x077d, 0x0788, 0x0791, - 0x0795, 0x079e, 0x07a2, 0x07a9, 0x07b4, 0x07bf, 0x07c5, 0x07c9, - 0x07d1, 0x07d6, 0x07df, 0x07e5, 0x07ea, 0x07f1, 0x07f6, 0x07fd, - 0x0805, 0x0810, 0x0817, 0x081e, 0x0825, 0x082e, 0x083a, 0x0842, - // Entry 100 - 13F - 0x0853, 0x085b, 0x0863, 0x0870, 0x0881, 0x088b, 0x0891, 0x089a, - 0x089f, 0x08a7, 0x08ad, 0x08b3, 0x08b8, 0x08bd, 0x08c2, 0x08ce, - 0x08da, 0x08df, 0x08f1, 0x08fb, 0x0900, 0x0906, 0x090a, 0x090e, - 0x0916, 0x0923, 0x0929, 0x0933, 0x0940, 0x0957, 0x095d, 0x096b, - 0x096f, 0x097a, 0x0984, 0x098f, 0x099c, 0x09a8, 0x09b3, 0x09c5, - 0x09d1, 0x09dd, 0x09e8, 0x09eb, 0x09f5, 0x09f8, 0x09fc, 0x0a01, - 0x0a11, 0x0a1a, 0x0a25, 0x0a2b, 0x0a39, 0x0a46, 0x0a51, 0x0a56, - 0x0a5f, 0x0a66, 0x0a6b, 0x0a77, 0x0a85, 0x0a8a, 0x0a92, 0x0a97, - // Entry 140 - 17F - 0x0a9e, 0x0aa3, 0x0aa8, 0x0ab1, 0x0abb, 0x0ac5, 0x0acf, 0x0ada, - 0x0ae6, 0x0aeb, 0x0aef, 0x0af6, 0x0afc, 0x0b01, 0x0b0b, 0x0b13, - 0x0b2b, 0x0b31, 0x0b37, 0x0b40, 0x0b4f, 0x0b5e, 0x0b69, 0x0b77, - 0x0b80, 0x0b86, 0x0b89, 0x0b8e, 0x0b92, 0x0b9d, 0x0ba4, 0x0ba8, - 0x0baf, 0x0bba, 0x0bc1, 0x0bc5, 0x0bcd, 0x0bd2, 0x0bde, 0x0bee, - 0x0bf4, 0x0bfd, 0x0c02, 0x0c0a, 0x0c12, 0x0c22, 0x0c29, 0x0c33, - 0x0c39, 0x0c48, 0x0c4c, 0x0c55, 0x0c5d, 0x0c63, 0x0c6b, 0x0c70, - 0x0c79, 0x0c82, 0x0c89, 0x0c8f, 0x0c94, 0x0c9a, 0x0c9f, 0x0ca7, - // Entry 180 - 1BF - 0x0cb9, 0x0cc2, 0x0ccb, 0x0cd1, 0x0cdc, 0x0ce1, 0x0ce5, 0x0ced, - 0x0cf9, 0x0d03, 0x0d0b, 0x0d10, 0x0d13, 0x0d19, 0x0d1e, 0x0d30, - 0x0d37, 0x0d42, 0x0d46, 0x0d4c, 0x0d54, 0x0d5b, 0x0d60, 0x0d6a, - 0x0d6e, 0x0d74, 0x0d7a, 0x0d7f, 0x0d83, 0x0d93, 0x0d9e, 0x0dac, - 0x0db3, 0x0dbc, 0x0dc7, 0x0dd2, 0x0dda, 0x0de0, 0x0de5, 0x0df1, - 0x0df8, 0x0e04, 0x0e0c, 0x0e18, 0x0e1f, 0x0e27, 0x0e2c, 0x0e31, - 0x0e3c, 0x0e43, 0x0e4f, 0x0e53, 0x0e5c, 0x0e65, 0x0e69, 0x0e72, - 0x0e79, 0x0e7f, 0x0e92, 0x0e97, 0x0ea3, 0x0ea9, 0x0eae, 0x0eb7, - // Entry 1C0 - 1FF - 0x0ebb, 0x0ecd, 0x0ed5, 0x0edd, 0x0ee2, 0x0ee7, 0x0eec, 0x0ef6, - 0x0f00, 0x0f0d, 0x0f15, 0x0f1f, 0x0f24, 0x0f2e, 0x0f3c, 0x0f4d, - 0x0f62, 0x0f6e, 0x0f79, 0x0f82, 0x0f8f, 0x0f97, 0x0fa1, 0x0faf, - 0x0fbf, 0x0fc6, 0x0fe0, 0x0fea, 0x0ff1, 0x0ffe, 0x1006, 0x1010, - 0x1015, 0x101b, 0x1026, 0x102b, 0x1034, 0x103e, 0x1041, 0x1048, - 0x1051, 0x105d, 0x1064, 0x1069, 0x1070, 0x107a, 0x1081, 0x1086, - 0x1091, 0x1098, 0x10ac, 0x10b7, 0x10bd, 0x10c1, 0x10c5, 0x10cb, - 0x10d6, 0x10e0, 0x10eb, 0x10f4, 0x10f8, 0x1106, 0x110c, 0x1119, - // Entry 200 - 23F - 0x1120, 0x112a, 0x1135, 0x1141, 0x114d, 0x1154, 0x115c, 0x1168, - 0x116d, 0x1171, 0x117e, 0x1184, 0x1188, 0x1191, 0x119a, 0x11aa, - 0x11b1, 0x11ba, 0x11be, 0x11c3, 0x11c7, 0x11cd, 0x11d2, 0x11d8, - 0x11dc, 0x11e7, 0x11ee, 0x11f8, 0x11ff, 0x1205, 0x120d, 0x121b, - 0x1224, 0x122a, 0x1230, 0x123a, 0x1243, 0x1255, 0x125c, 0x1267, - 0x126e, 0x1277, 0x1292, 0x129c, 0x12a6, 0x12ad, 0x12b0, 0x12b3, - 0x12be, 0x12c2, 0x12d3, 0x12e1, 0x12e8, 0x12ed, 0x12f2, 0x12fd, - 0x1303, 0x1308, 0x130d, 0x1315, 0x1317, 0x1322, 0x132f, 0x1335, - // Entry 240 - 27F - 0x133a, 0x1343, 0x134a, 0x1359, 0x1362, 0x136e, 0x1375, 0x1381, - 0x138c, 0x1392, 0x13af, 0x13b3, 0x13cd, 0x13d5, 0x13ec, 0x13ec, - 0x13fe, 0x1412, 0x1425, 0x1439, 0x144a, 0x145d, 0x1474, 0x1485, - 0x1496, 0x1496, 0x14a9, 0x14bb, 0x14c6, 0x14d2, 0x14ea, 0x1500, - 0x150a, 0x1518, 0x1525, 0x1539, 0x154f, -} // Size: 1250 bytes - -const swLangStr string = "" + // Size: 3904 bytes - "KiafarKiabkhaziKiafrikanaKiakaniKiamhariKiaragoniKiarabuKiassamKiavariKi" + - "aymaraKiazerbaijaniKibashkirKibelarusiKibulgariaKibislamaKibambaraKibeng" + - "aliKitibetiKibretoniKibosniaKikatalaniKichecheniaKichamorroKikosikaniKic" + - "hekiKislovakia cha ChurchKichuvashKiwelisiKidenmakiKijerumaniKidivehiKiz" + - "ongkhaKieweKigirikiKiingerezaKiesperantoKihispaniaKiestoniaKibasqueKiaje" + - "miKifulaKifiniKifijiKifaroeKifaransaKifrisia cha MagharibiKiayalandiKiga" + - "eli cha UskotiKigalisiKiguaraniKigujaratiKimanxKihausaKiebraniaKihindiKi" + - "kroeshiaKihaitiKihangariKiarmeniaKihereroKiintalinguaKiindonesiaKiigboSi" + - "chuan YiKiidoKiaisilandiKiitalianoKiinuktitutKijapaniKijavaKijojiaKikong" + - "oKikikuyuKikwanyamaKikazakhKikalaallisutKikambodiaKikannadaKikoreaKikanu" + - "riKikashmiriKikurdiKikomiKikorniKikyrgyzKilatiniKilasembagiKigandaLimbur" + - "gishKilingalaKilaosiKilithuaniaKiluba-KatangaKilatviaKimalagasiKimaoriKi" + - "macedoniaKimalayalamKimongoliaKimarathiKimaleiKimaltaKiburmaKinauruKinde" + - "bele cha KaskaziniKinepaliKindongaKiholanziKinorwe cha NynorskKinorwe ch" + - "a BokmålKindebeleKinavajoKinyanjaKiokitaniKioromoKioriyaKiosetiaKipunjab" + - "iKipolandiKipashtoKirenoKiquechuaKiromanshiKirundiKiromaniaKirusiKinyarw" + - "andaKisanskritiKisardiniaKisindhiKisami cha KaskaziniKisangoKisinhalaKis" + - "lovakiaKisloveniaKisamoaKishonaKisomaliKialbaniaKiserbiaKiswatiKisothoKi" + - "sundaKiswidiKiswahiliKitamilKiteluguKitajikiKitailandiKitigrinyaKituruki" + - "meniKitswanaKitongaKiturukiKitsongaKitatariKitahitiKiuyghurKiukraineKiur" + - "duKiuzbekiKivendaKivietinamuKivolapükWalloonLugha ya WolofKixhosaKiyiddi" + - "KiyorubaKichinaKizuluKiacheniKiakoliKiadangmeKiadygheKiaghemKiainuKialeu" + - "tKialtaiKiingereza cha KaleKiangikaKiaramuKimapucheKiarapahoKiarabu cha " + - "AlgeriaKiarabu cha MisriKiasuKiasturiaKiawadhiKibaliKibasaaKibamunKighom" + - "alaKibejaKibembaKibenaKibafutKibalochi cha MagharibiKibhojpuriKibiniKiko" + - "mKisiksikaKibodoLugha ya BugineseKibuluKiblinKimedumbaKichebuanoKichigaK" + - "ichukisiKimariKichoktaoKicherokeeKicheyeniKikurdi cha SoraniKikhuftiKrio" + - "li ya ShelisheliKidakotaKidaragwaKitaitaKidogribKizarmaKidolnoserbskiKid" + - "ualaKijola-FonyiKijulaKidazagaKiembuKiefikiKimisriKiekajukKiewondoKifili" + - "pinoKifonKifaransa cha KaleKifrisia cha KaskaziniKifrisia cha MasharikiK" + - "ifriulianKigaKigagauzKigbayaKige’ezKikiribatiKigorontaloKiyunaniKijeruma" + - "ni cha UswisiKikisiiGwichʼinKihawaiKihiligaynonKihitiKihmongKisobia cha " + - "Ukanda wa JuuHupaKiibanKiibibioKiilocanoLojbanKingombaKimachameKikabylia" + - "KachinKijjuKikambaKikanembuKityapKimakondeKikabuverdianuKikoroKikhasiKoy" + - "ra ChiiniLugha ya KakoKikalenjinKimbunduKikomi-PermyakKikonkaniKikpelleK" + - "ikarachay-BalkarKarjalaKurukhKisambaaKibafiaKicologneKumykKiladinoKirang" + - "iLambaKilakotaKimongoKiloziKiluri cha KaskaziniKiluba-LuluaKilundaKijalu" + - "oKimizoKiluhyaKimaduraKimafaKimagahiKimaithiliKimakasarKimaasaiKimabaLug" + - "ha ya MokshaKimendeKimeruKimoriseniKimakhuwa-MeettoKimetaMi’kmaqKiminang" + - "kabauKimanipuriLugha ya MohawkKimooreKimundangLugha NyingiKikrikiKierzya" + - "KimazanderaniKinapoliKinamaKisaksoniKinewariKiniueaKikwasioLugha ya Ngie" + - "mboonKinogaiN’KoKisotho cha KaskaziniKinuerKinewari cha kaleKinyamweziKi" + - "nyankoleKinyoroKinzemaKipangasinanKipampangaKipapiamentoKipalauKiajemi c" + - "ha KaleKiprussiaKʼicheʼKirapanuiKirarotongaKiromboKiaromaniaKirwaKisanda" + - "weKisakhaKiaramu cha WasamariaKisamburuKisantaliKingambayKisanguKisicili" + - "aKiskotiKikurdi cha KusiniKisenaKoyraboro SenniKitachelhitKishanKisami c" + - "ha KusiniKisami cha LuleKisami cha InariKisami cha SkoltKisoninkeLugha y" + - "a Sranan TongoKisahoKisukumaKisusuShikomorLugha ya SyriacKitemneKitesoKi" + - "tetumKitigreKiklingoniKitokpisinKitarokoKitumbukaKituvaluKitasawaqKituva" + - "Central Atlas TamazightUdmurtUmbunduRootKivaiKivunjoWalserKiwolayttaKiwa" + - "rayKiwarlpiriKikalmykKisogaKiyaoKiyangbenKiyembaKikantoniTamaziti Sanifu" + - " ya KimorokoKizuniHakuna maudhui ya lughaKizazaKiarabu Sanifu cha Kisasa" + - "Kihispania (Uhispania)Kihispania (Mexico)Kifaransa (Canada)KiflemiKireno" + - " (Brazil)Kiserbia-kroeshiaKingwanaKichina (Kilichorahisishwa)Kichina cha" + - " Jadi" - -var swLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0006, 0x000f, 0x000f, 0x0019, 0x0020, 0x0028, 0x0031, - 0x0038, 0x003f, 0x0046, 0x004e, 0x005b, 0x0064, 0x006e, 0x0078, - 0x0081, 0x008a, 0x0093, 0x009b, 0x00a4, 0x00ac, 0x00b6, 0x00c1, - 0x00cb, 0x00d5, 0x00d5, 0x00dc, 0x00f1, 0x00fa, 0x0102, 0x010b, - 0x0115, 0x011d, 0x0126, 0x012b, 0x0133, 0x013d, 0x0148, 0x0152, - 0x015b, 0x0163, 0x016a, 0x0170, 0x0176, 0x017c, 0x0183, 0x018c, - 0x01a2, 0x01ac, 0x01be, 0x01c6, 0x01cf, 0x01d9, 0x01df, 0x01e6, - 0x01ef, 0x01f6, 0x01f6, 0x0200, 0x0207, 0x0210, 0x0219, 0x0221, - // Entry 40 - 7F - 0x022d, 0x0238, 0x0238, 0x023e, 0x0248, 0x0248, 0x024d, 0x0258, - 0x0262, 0x026d, 0x0275, 0x027b, 0x0282, 0x0289, 0x0291, 0x029b, - 0x02a3, 0x02b0, 0x02ba, 0x02c3, 0x02ca, 0x02d2, 0x02dc, 0x02e3, - 0x02e9, 0x02f0, 0x02f8, 0x0300, 0x030b, 0x0312, 0x031c, 0x0325, - 0x032c, 0x0337, 0x0345, 0x034d, 0x0357, 0x0357, 0x035e, 0x0369, - 0x0374, 0x037e, 0x0387, 0x038e, 0x0395, 0x039c, 0x03a3, 0x03ba, - 0x03c2, 0x03ca, 0x03d3, 0x03e6, 0x03f9, 0x0402, 0x040a, 0x0412, - 0x041b, 0x041b, 0x0422, 0x0429, 0x0431, 0x043a, 0x043a, 0x0443, - // Entry 80 - BF - 0x044b, 0x0451, 0x045a, 0x0464, 0x046b, 0x0474, 0x047a, 0x0485, - 0x0490, 0x049a, 0x04a2, 0x04b6, 0x04bd, 0x04c6, 0x04d0, 0x04da, - 0x04e1, 0x04e8, 0x04f0, 0x04f9, 0x0501, 0x0508, 0x050f, 0x0516, - 0x051d, 0x0526, 0x052d, 0x0535, 0x053d, 0x0547, 0x0551, 0x055d, - 0x0565, 0x056c, 0x0574, 0x057c, 0x0584, 0x058c, 0x0594, 0x059d, - 0x05a3, 0x05ab, 0x05b2, 0x05bd, 0x05c7, 0x05ce, 0x05dc, 0x05e3, - 0x05ea, 0x05f2, 0x05f2, 0x05f9, 0x05ff, 0x0607, 0x060e, 0x0617, - 0x061f, 0x061f, 0x061f, 0x0626, 0x062c, 0x062c, 0x062c, 0x0633, - // Entry C0 - FF - 0x0633, 0x063a, 0x064d, 0x0655, 0x065c, 0x0665, 0x0665, 0x066e, - 0x0681, 0x0681, 0x0681, 0x0681, 0x0692, 0x0697, 0x0697, 0x06a0, - 0x06a0, 0x06a8, 0x06a8, 0x06ae, 0x06ae, 0x06b5, 0x06bc, 0x06bc, - 0x06c5, 0x06cb, 0x06d2, 0x06d2, 0x06d8, 0x06df, 0x06df, 0x06f6, - 0x0700, 0x0700, 0x0706, 0x0706, 0x070b, 0x0714, 0x0714, 0x0714, - 0x0714, 0x0714, 0x071a, 0x071a, 0x071a, 0x072b, 0x0731, 0x0737, - 0x0740, 0x0740, 0x0740, 0x0740, 0x0740, 0x074a, 0x0751, 0x0751, - 0x0751, 0x075a, 0x0760, 0x0760, 0x0769, 0x0769, 0x0773, 0x077c, - // Entry 100 - 13F - 0x078e, 0x0796, 0x0796, 0x0796, 0x07aa, 0x07aa, 0x07b2, 0x07bb, - 0x07c2, 0x07c2, 0x07c2, 0x07ca, 0x07ca, 0x07d1, 0x07d1, 0x07df, - 0x07df, 0x07e6, 0x07e6, 0x07f2, 0x07f8, 0x0800, 0x0806, 0x080d, - 0x080d, 0x0814, 0x081c, 0x081c, 0x081c, 0x081c, 0x0824, 0x0824, - 0x0824, 0x082e, 0x082e, 0x0833, 0x0833, 0x0833, 0x0845, 0x0845, - 0x085b, 0x0871, 0x087b, 0x087f, 0x0887, 0x0887, 0x0887, 0x088e, - 0x088e, 0x0897, 0x08a1, 0x08a1, 0x08a1, 0x08a1, 0x08a1, 0x08a1, - 0x08ac, 0x08ac, 0x08ac, 0x08b4, 0x08c9, 0x08c9, 0x08c9, 0x08d0, - // Entry 140 - 17F - 0x08d9, 0x08d9, 0x08d9, 0x08e0, 0x08e0, 0x08ec, 0x08f2, 0x08f9, - 0x0912, 0x0912, 0x0916, 0x091c, 0x0924, 0x092d, 0x092d, 0x092d, - 0x092d, 0x0933, 0x093b, 0x0944, 0x0944, 0x0944, 0x0944, 0x0944, - 0x094d, 0x0953, 0x0958, 0x095f, 0x095f, 0x095f, 0x0968, 0x096e, - 0x0977, 0x0985, 0x0985, 0x098b, 0x098b, 0x0992, 0x0992, 0x099e, - 0x099e, 0x099e, 0x09ab, 0x09b5, 0x09bd, 0x09cb, 0x09d4, 0x09d4, - 0x09dc, 0x09ed, 0x09ed, 0x09ed, 0x09f4, 0x09fa, 0x0a02, 0x0a09, - 0x0a12, 0x0a17, 0x0a17, 0x0a1f, 0x0a26, 0x0a26, 0x0a2b, 0x0a2b, - // Entry 180 - 1BF - 0x0a2b, 0x0a2b, 0x0a2b, 0x0a33, 0x0a33, 0x0a3a, 0x0a40, 0x0a54, - 0x0a54, 0x0a60, 0x0a60, 0x0a67, 0x0a6e, 0x0a74, 0x0a7b, 0x0a7b, - 0x0a7b, 0x0a83, 0x0a89, 0x0a91, 0x0a9b, 0x0aa4, 0x0aa4, 0x0aac, - 0x0ab2, 0x0ac1, 0x0ac1, 0x0ac8, 0x0ace, 0x0ad8, 0x0ad8, 0x0ae8, - 0x0aee, 0x0af7, 0x0b04, 0x0b04, 0x0b0e, 0x0b1d, 0x0b24, 0x0b24, - 0x0b2d, 0x0b39, 0x0b40, 0x0b40, 0x0b40, 0x0b40, 0x0b40, 0x0b47, - 0x0b54, 0x0b54, 0x0b5c, 0x0b62, 0x0b6b, 0x0b73, 0x0b73, 0x0b7a, - 0x0b7a, 0x0b82, 0x0b94, 0x0b9b, 0x0b9b, 0x0b9b, 0x0ba1, 0x0bb6, - // Entry 1C0 - 1FF - 0x0bbc, 0x0bcd, 0x0bd7, 0x0be1, 0x0be8, 0x0bef, 0x0bef, 0x0bef, - 0x0bfb, 0x0bfb, 0x0c05, 0x0c11, 0x0c18, 0x0c18, 0x0c18, 0x0c18, - 0x0c18, 0x0c28, 0x0c28, 0x0c28, 0x0c28, 0x0c28, 0x0c28, 0x0c31, - 0x0c31, 0x0c3a, 0x0c3a, 0x0c3a, 0x0c43, 0x0c4e, 0x0c4e, 0x0c4e, - 0x0c55, 0x0c55, 0x0c55, 0x0c55, 0x0c55, 0x0c5f, 0x0c64, 0x0c6d, - 0x0c74, 0x0c89, 0x0c92, 0x0c92, 0x0c9b, 0x0c9b, 0x0ca4, 0x0cab, - 0x0cb4, 0x0cbb, 0x0cbb, 0x0ccd, 0x0ccd, 0x0cd3, 0x0cd3, 0x0cd3, - 0x0ce2, 0x0ce2, 0x0ce2, 0x0ced, 0x0cf3, 0x0cf3, 0x0cf3, 0x0cf3, - // Entry 200 - 23F - 0x0cf3, 0x0d04, 0x0d13, 0x0d23, 0x0d33, 0x0d3c, 0x0d3c, 0x0d51, - 0x0d51, 0x0d57, 0x0d57, 0x0d5f, 0x0d65, 0x0d65, 0x0d6d, 0x0d6d, - 0x0d7c, 0x0d7c, 0x0d7c, 0x0d83, 0x0d89, 0x0d89, 0x0d90, 0x0d97, - 0x0d97, 0x0d97, 0x0d97, 0x0da1, 0x0da1, 0x0da1, 0x0da1, 0x0da1, - 0x0dab, 0x0dab, 0x0db3, 0x0db3, 0x0db3, 0x0db3, 0x0dbc, 0x0dc4, - 0x0dcd, 0x0dd3, 0x0dea, 0x0df0, 0x0df0, 0x0df7, 0x0dfb, 0x0e00, - 0x0e00, 0x0e00, 0x0e00, 0x0e00, 0x0e00, 0x0e00, 0x0e07, 0x0e0d, - 0x0e17, 0x0e1e, 0x0e1e, 0x0e28, 0x0e28, 0x0e30, 0x0e30, 0x0e36, - // Entry 240 - 27F - 0x0e3b, 0x0e3b, 0x0e44, 0x0e4b, 0x0e4b, 0x0e54, 0x0e54, 0x0e54, - 0x0e54, 0x0e54, 0x0e6f, 0x0e75, 0x0e8c, 0x0e92, 0x0eab, 0x0eab, - 0x0eab, 0x0eab, 0x0eab, 0x0eab, 0x0eab, 0x0eab, 0x0eab, 0x0ec1, - 0x0ed4, 0x0ed4, 0x0ee6, 0x0ee6, 0x0ee6, 0x0eed, 0x0efc, 0x0efc, - 0x0efc, 0x0f0d, 0x0f15, 0x0f30, 0x0f40, -} // Size: 1250 bytes - -const taLangStr string = "" + // Size: 12975 bytes - "அஃபார்அப்காஜியான்அவெஸ்தான்ஆஃப்ரிகான்ஸ்அகான்அம்ஹாரிக்ஆர்கோனீஸ்அரபிக்அஸ்ஸா" + - "மீஸ்அவேரிக்அய்மராஅஸர்பைஜானிபஷ்கிர்பெலாருஷியன்பல்கேரியன்பிஸ்லாமாபம்பாரா" + - "வங்காளம்திபெத்தியன்பிரெட்டன்போஸ்னியன்கேட்டலான்செச்சென்சாமோரோகார்சிகன்க" + - "்ரீசெக்சர்ச் ஸ்லாவிக்சுவாஷ்வேல்ஷ்டேனிஷ்ஜெர்மன்திவேஹிபூடானிஈவ்கிரேக்கம்" + - "ஆங்கிலம்எஸ்பரேன்டோஸ்பானிஷ்எஸ்டோனியன்பாஸ்க்பெர்ஷியன்ஃபுலாஃபின்னிஷ்ஃபிஜி" + - "யன்ஃபரோயிஸ்பிரெஞ்சுமேற்கு ஃப்ரிஷியன்ஐரிஷ்ஸ்காட்ஸ் கேலிக்காலிஸியன்க்வார" + - "னிகுஜராத்திமேங்க்ஸ்ஹௌஸாஹீப்ரூஇந்திஹிரி மோட்டுகுரோஷியன்ஹைத்தியன் க்ரியோ" + - "லிஹங்கேரியன்ஆர்மேனியன்ஹெரேரோஇன்டர்லிங்வாஇந்தோனேஷியன்இன்டர்லிங்இக்போசிச" + - "ுவான் ஈஇனுபியாக்இடோஐஸ்லேண்டிக்இத்தாலியன்இனுகிடூட்ஜப்பானியம்ஜாவனீஸ்ஜார்" + - "ஜியன்காங்கோகிகுயூகுவான்யாமாகசாக்கலாலிசூட்கெமெர்கன்னடம்கொரியன்கனுரிகாஷ்" + - "மிரிகுர்திஷ்கொமிகார்னிஷ்கிர்கிஸ்லத்தின்லக்ஸம்போர்கிஷ்கான்டாலிம்பர்கிஷ்" + - "லிங்காலாலாவோலிதுவேனியன்லுபா-கடாங்காலாட்வியன்மலகாஸிமார்ஷெலீஸ்மௌரிமாஸிடோ" + - "னியன்மலையாளம்மங்கோலியன்மராத்திமலாய்மால்டிஸ்பர்மீஸ்நவ்ரூவடக்கு தெபெலேநே" + - "பாளிதோங்காடச்சுநார்வேஜியன் நியூநார்ஸ்க்நார்வேஜியன் பொக்மால்தெற்கு தெபெ" + - "லேநவாஜோநயன்ஜாஒக்கிடன்ஒஜிப்வாஒரோமோஒடியாஒசெட்டிக்பஞ்சாபிபாலிபோலிஷ்பஷ்தோப" + - "ோர்ச்சுக்கீஸ்க்வெச்சுவாரோமான்ஷ்ருண்டிரோமேனியன்ரஷியன்கின்யாருவான்டாசமஸ்" + - "கிருதம்சார்தீனியன்சிந்திவடக்கு சமிசாங்கோசிங்களம்ஸ்லோவாக்ஸ்லோவேனியன்சமோ" + - "வான்ஷோனாசோமாலிஅல்பேனியன்செர்பியன்ஸ்வாடீதெற்கு ஸோதோசுண்டானீஸ்ஸ்வீடிஷ்ஸ்" + - "வாஹிலிதமிழ்தெலுங்குதஜிக்தாய்டிக்ரின்யாதுருக்மென்ஸ்வானாடோங்கான்துருக்கி" + - "ஷ்ஸோங்காடாடர்தஹிதியன்உய்குர்உக்ரைனியன்உருதுஉஸ்பெக்வென்டாவியட்நாமீஸ்ஒலா" + - "பூக்ஒவாலூன்ஓலோஃப்ஹோசாயெட்டிஷ்யோருபாஜுவாங்சீனம்ஜுலுஆச்சினீஸ்அகோலிஅதாங்ம" + - "ேஅதகேதுனிசிய அரபுஅஃப்ரிஹிலிஅகெம்ஐனுஅக்கேதியன்அலூட்தெற்கு அல்தைபழைய ஆங்" + - "கிலம்அங்கிகாஅராமைக்மபுச்சேஅரபஹோஅராவாக்அசுஅஸ்துரியன்அவதிபலூச்சிபலினீஸ்ப" + - "ாஸாபேஜாபெம்பாபெனாபடகாமேற்கு பலோச்சிபோஜ்பூரிபிகோல்பினிசிக்சிகாபிஷ்ணுப்ப" + - "ிரியாப்ராஜ்போடோபுரியாத்புகினீஸ்ப்லின்கேடோகரீப்ஆட்சம்செபுவானோசிகாசிப்சா" + - "ஷகதைசூகிசேமாரிசினூக் ஜார்கான்சோக்தௌசிபெவ்யான்செரோகீசெயேனிமத்திய குர்தி" + - "ஷ்காப்டிக்கிரிமியன் துர்க்கிசெசெல்வா க்ரெயோல் பிரெஞ்சுகஷுபியன்டகோடாதார" + - "்குவாடைடாடெலாவர்ஸ்லாவ்டோக்ரிப்டின்காஸார்மாடோக்ரிலோயர் சோர்பியன்டுவாலாம" + - "ிடில் டச்சுஜோலா-ஃபோன்யிட்யூலாடசாகாஎம்புஎஃபிக்பண்டைய எகிப்தியன்ஈகாஜுக்எ" + - "லமைட்மிடில் ஆங்கிலம்எவோன்டோஃபேங்க்ஃபிலிபினோஃபான்மிடில் பிரெஞ்சுபழைய பி" + - "ரெஞ்சுவடக்கு ஃப்ரிஸியான்கிழக்கு ஃப்ரிஸியான்ஃப்ரியூலியன்காகாகௌஸ்கன் சீன" + - "ம்கயோபயாகீஜ்கில்பெர்டீஸ்மிடில் ஹை ஜெர்மன்பழைய ஹை ஜெர்மன்கோன்டிகோரோன்டல" + - "ோகோதிக்க்ரேபோபண்டைய கிரேக்கம்ஸ்விஸ் ஜெர்மன்குஸிகுவிசின்ஹைடாஹக்கா சீனம்" + - "ஹவாயியன்ஃபிஜி இந்திஹிலிகாய்னான்ஹிட்டைட்மாங்க்அப்பர் சோர்பியான்சியாங்க்" + - " சீனம்ஹுபாஇபான்இபிபியோஇலோகோஇங்குஷ்லோஜ்பன்நகொம்பாமாசெம்ஜூதேயோ-பெர்ஷியன்ஜூ" + - "தேயோ-அராபிக்காரா-கல்பாக்கபாய்ல்காசின்ஜ்ஜூகம்பாகாவிகபார்டியன்தையாப்மகொண" + - "்டேகபுவெர்தியானுகோரோகாஸிகோதானீஸ்கொய்ரா சீனீககோகலின்ஜின்கிம்புன்துகொமி-" + - "பெர்ம்யாக்கொங்கணிகோஸ்ரைன்க்பெல்லேகராசே-பல்கார்கரேலியன்குருக்ஷம்பாலாபாஃ" + - "பியாகொலோக்னியன்கும்இக்குடேனைலடினோலங்கிலஹன்டாலம்பாலெஜ்ஜியன்லகோடாமோங்கோல" + - "ோசிவடக்கு லுரிலுபா-லுலுலாலுய்சேனோலூன்டாலுயோமிஸோலுயியாமதுரீஸ்மகாஹிமைதில" + - "ிமகாசார்மான்டிங்கோமாசாய்மோக்க்ஷாமான்டார்மென்டீமெருமொரிசியன்மிடில் ஐரிஷ" + - "்மகுவா-மீட்டோமேடாமிக்மாக்மின்னாங்கபௌமன்சூமணிப்புரிமொஹாக்மோஸ்ஸிமுன்டாங்" + - "பல மொழிகள்க்ரீக்மிரான்டீஸ்மார்வாரிஏர்ஜியாமசந்தேரனிமின் நான் சீனம்நியோப" + - "ோலிடன்நாமாலோ ஜெர்மன்நெவாரிநியாஸ்நியூவான்க்வாசியோநெகெய்ம்பூன்நோகைபழைய ந" + - "ோர்ஸ்என்‘கோவடக்கு சோதோநியூர்பாரம்பரிய நேவாரிநியாம்வேஜிநியான்கோலேநியோரோ" + - "நிஜ்மாஓசேஜ்ஓட்டோமான் துருக்கிஷ்பன்காசினன்பாஹ்லவிபம்பாங்காபபியாமென்டோபல" + - "ௌவன்நைஜீரியன் பிட்கின்பென்சில்வேனிய ஜெர்மன்பழைய பெர்ஷியன்ஃபொனிஷியன்ஃபோ" + - "ன்பெயென்பிரஷ்யன்பழைய ப்ரோவென்சால்கீசீராஜஸ்தானிரபனுய்ரரோடோங்கன்ரோம்போரோ" + - "மானிஅரோமானியன்ருவாசான்டாவேசகாசமாரிடன் அராமைக்சம்புருசாசாக்சான்டாலிசௌரா" + - "ஷ்டிரம்நெகாம்பேசங்குசிசிலியன்ஸ்காட்ஸ்தெற்கு குர்திஷ்செனாசெல்குப்கொய்ரா" + - "போரோ சென்னிபழைய ஐரிஷ்தசேஹித்ஷான்சிடாமோதெற்கு சமிலுலே சமிஇனாரி சமிஸ்கோல" + - "்ட் சமிசோனின்கேசோக்தியன்ஸ்ரானன் டோங்கோசெரெர்சஹோசுகுமாசுசுசுமேரியன்கொமோ" + - "ரியன்பாரம்பரிய சிரியாக்சிரியாக்டிம்னேடெசோடெரெனோடெடும்டைக்ரேடிவ்டோகேலௌக" + - "்ளிங்கோன்லிங்கிட்தமஷேக்நயாசா டோங்காடோக் பிஸின்தரோகோட்ஸிம்ஷியன்தும்புகா" + - "டுவாலுடசவாக்டுவினியன்மத்திய அட்லஸ் டமசைட்உட்முர்ட்உகாரிடிக்அம்பொண்டுரூ" + - "ட்வைவோட்க்வுன்ஜோவால்சேர்வோலாய்ட்டாவாரேவாஷோவல்பிரிவூ சீனம்கல்மிக்சோகாயா" + - "வ்யாபேசேயாங்பென்யெம்பாகாண்டோனீஸ்ஜாபோடெக்ப்லிஸ்ஸிம்பால்ஸ்ஜெனகாஸ்டாண்டர்" + - "ட் மொராக்கன் தமாசைட்ஜூனிமொழி உள்ளடக்கம் ஏதுமில்லைஜாஜாநவீன நிலையான அரபி" + - "க்ஆஸ்திரிய ஜெர்மன்ஸ்விஸ் ஹை ஜெர்மன்ஆஸ்திரேலிய ஆங்கிலம்கனடிய ஆங்கிலம்பி" + - "ரிட்டிஷ் ஆங்கிலம்அமெரிக்க ஆங்கிலம்லத்தின் அமெரிக்க ஸ்பானிஷ்ஐரோப்பிய ஸ்" + - "பானிஷ்மெக்ஸிகன் ஸ்பானிஷ்கனடிய பிரெஞ்சுஸ்விஸ் பிரஞ்சுலோ சாக்ஸன்ஃப்லெமிஷ" + - "்பிரேசிலிய போர்ச்சுகீஸ்ஐரோப்பிய போர்ச்சுகீஸ்மோல்டாவியன்செர்போ-குரோஷியன" + - "்காங்கோ ஸ்வாஹிலிஎளிதாக்கப்பட்ட சீனம்பாரம்பரிய சீனம்" - -var taLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0012, 0x0033, 0x004e, 0x0072, 0x0081, 0x009c, 0x00b7, - 0x00c9, 0x00e4, 0x00f9, 0x010b, 0x0129, 0x013e, 0x015f, 0x017d, - 0x0195, 0x01aa, 0x01c2, 0x01e3, 0x01fe, 0x0219, 0x0234, 0x024c, - 0x025e, 0x0279, 0x0285, 0x0291, 0x02b9, 0x02cb, 0x02dd, 0x02ef, - 0x0304, 0x0316, 0x0328, 0x0331, 0x034c, 0x0364, 0x0382, 0x039a, - 0x03b8, 0x03ca, 0x03e5, 0x03f4, 0x040f, 0x0427, 0x043f, 0x0457, - 0x0488, 0x0497, 0x04c2, 0x04dd, 0x04f2, 0x050d, 0x0525, 0x0531, - 0x0543, 0x0552, 0x0571, 0x058c, 0x05c0, 0x05de, 0x05fc, 0x060e, - // Entry 40 - 7F - 0x0632, 0x0656, 0x0674, 0x0683, 0x069f, 0x06ba, 0x06c3, 0x06e4, - 0x0702, 0x071d, 0x073b, 0x0750, 0x076b, 0x077d, 0x078f, 0x07ad, - 0x07bc, 0x07d7, 0x07e9, 0x07fe, 0x0813, 0x0822, 0x083a, 0x0852, - 0x085e, 0x0876, 0x088e, 0x08a3, 0x08cd, 0x08df, 0x0900, 0x0918, - 0x0924, 0x0945, 0x0967, 0x0982, 0x0994, 0x09b2, 0x09be, 0x09df, - 0x09f7, 0x0a15, 0x0a2a, 0x0a39, 0x0a51, 0x0a66, 0x0a75, 0x0a9a, - 0x0aac, 0x0abe, 0x0acd, 0x0b13, 0x0b4d, 0x0b72, 0x0b81, 0x0b93, - 0x0bab, 0x0bc0, 0x0bcf, 0x0bde, 0x0bf9, 0x0c0e, 0x0c1a, 0x0c2c, - // Entry 80 - BF - 0x0c3b, 0x0c65, 0x0c83, 0x0c9b, 0x0cad, 0x0cc8, 0x0cda, 0x0d04, - 0x0d25, 0x0d46, 0x0d58, 0x0d74, 0x0d86, 0x0d9e, 0x0db6, 0x0dd7, - 0x0dec, 0x0df8, 0x0e0a, 0x0e28, 0x0e43, 0x0e55, 0x0e74, 0x0e92, - 0x0eaa, 0x0ec2, 0x0ed1, 0x0ee9, 0x0ef8, 0x0f04, 0x0f22, 0x0f40, - 0x0f52, 0x0f6a, 0x0f88, 0x0f9a, 0x0fa9, 0x0fc1, 0x0fd6, 0x0ff4, - 0x1003, 0x1018, 0x102a, 0x104b, 0x1060, 0x1075, 0x1087, 0x1093, - 0x10ab, 0x10bd, 0x10cf, 0x10de, 0x10ea, 0x1105, 0x1114, 0x1129, - 0x1135, 0x1157, 0x1175, 0x1184, 0x118d, 0x11ab, 0x11ab, 0x11ba, - // Entry C0 - FF - 0x11ba, 0x11dc, 0x1201, 0x1216, 0x122b, 0x1240, 0x1240, 0x124f, - 0x124f, 0x124f, 0x1264, 0x1264, 0x1264, 0x126d, 0x126d, 0x128b, - 0x128b, 0x1297, 0x12ac, 0x12c1, 0x12c1, 0x12cd, 0x12cd, 0x12cd, - 0x12cd, 0x12d9, 0x12eb, 0x12eb, 0x12f7, 0x12f7, 0x1303, 0x132b, - 0x1343, 0x1355, 0x1361, 0x1361, 0x1361, 0x1379, 0x13a3, 0x13a3, - 0x13b5, 0x13b5, 0x13c1, 0x13c1, 0x13d9, 0x13f1, 0x13f1, 0x1403, - 0x1403, 0x140f, 0x141e, 0x141e, 0x1430, 0x1448, 0x1454, 0x1466, - 0x1472, 0x1484, 0x1490, 0x14bb, 0x14cd, 0x14eb, 0x14fd, 0x150f, - // Entry 100 - 13F - 0x153a, 0x1552, 0x1552, 0x1586, 0x15d0, 0x15e8, 0x15f7, 0x160f, - 0x161b, 0x1630, 0x1642, 0x165a, 0x166c, 0x167e, 0x1690, 0x16bb, - 0x16bb, 0x16cd, 0x16ef, 0x1711, 0x1723, 0x1732, 0x1741, 0x1753, - 0x1753, 0x1784, 0x1799, 0x17ab, 0x17d6, 0x17d6, 0x17eb, 0x17eb, - 0x1800, 0x181b, 0x181b, 0x182a, 0x182a, 0x1855, 0x187a, 0x187a, - 0x18ae, 0x18e5, 0x1909, 0x190f, 0x1921, 0x193a, 0x1943, 0x194c, - 0x194c, 0x1958, 0x197c, 0x197c, 0x19ab, 0x19d4, 0x19d4, 0x19e6, - 0x1a01, 0x1a13, 0x1a25, 0x1a53, 0x1a7b, 0x1a7b, 0x1a7b, 0x1a87, - // Entry 140 - 17F - 0x1a9f, 0x1aab, 0x1aca, 0x1ae2, 0x1b01, 0x1b25, 0x1b3d, 0x1b4f, - 0x1b80, 0x1ba8, 0x1bb4, 0x1bc3, 0x1bd8, 0x1be7, 0x1bfc, 0x1bfc, - 0x1bfc, 0x1c11, 0x1c26, 0x1c38, 0x1c66, 0x1c8e, 0x1c8e, 0x1cb0, - 0x1cc5, 0x1cd7, 0x1ce3, 0x1cf2, 0x1cfe, 0x1d1c, 0x1d1c, 0x1d2e, - 0x1d43, 0x1d6a, 0x1d6a, 0x1d76, 0x1d76, 0x1d82, 0x1d9a, 0x1db9, - 0x1db9, 0x1db9, 0x1dc2, 0x1ddd, 0x1dfb, 0x1e26, 0x1e3b, 0x1e53, - 0x1e6b, 0x1e90, 0x1e90, 0x1e90, 0x1ea8, 0x1eba, 0x1ecf, 0x1ee4, - 0x1f05, 0x1f1a, 0x1f2c, 0x1f3b, 0x1f4a, 0x1f5c, 0x1f6b, 0x1f86, - // Entry 180 - 1BF - 0x1f86, 0x1f86, 0x1f86, 0x1f95, 0x1f95, 0x1fa7, 0x1fb3, 0x1fd2, - 0x1fd2, 0x1ff1, 0x2009, 0x201b, 0x2027, 0x2033, 0x2045, 0x2045, - 0x2045, 0x205a, 0x205a, 0x2069, 0x207b, 0x2090, 0x20ae, 0x20c0, - 0x20c0, 0x20d8, 0x20f0, 0x2102, 0x210e, 0x2129, 0x214b, 0x216d, - 0x2179, 0x2191, 0x21b2, 0x21c1, 0x21dc, 0x21ee, 0x2200, 0x2200, - 0x2218, 0x2234, 0x2246, 0x2264, 0x227c, 0x227c, 0x227c, 0x2291, - 0x22ac, 0x22d5, 0x22f6, 0x2302, 0x231e, 0x2330, 0x2342, 0x235a, - 0x235a, 0x2372, 0x2396, 0x23a2, 0x23c1, 0x23c1, 0x23d3, 0x23f2, - // Entry 1C0 - 1FF - 0x2404, 0x2432, 0x2450, 0x246e, 0x2480, 0x2492, 0x24a1, 0x24db, - 0x24f9, 0x250e, 0x2529, 0x254a, 0x255c, 0x255c, 0x2590, 0x25cd, - 0x25cd, 0x25f5, 0x25f5, 0x2613, 0x2613, 0x2613, 0x2634, 0x264c, - 0x267d, 0x2689, 0x2689, 0x26a4, 0x26b6, 0x26d4, 0x26d4, 0x26d4, - 0x26e6, 0x26f8, 0x26f8, 0x26f8, 0x26f8, 0x2716, 0x2722, 0x273a, - 0x2743, 0x2771, 0x2786, 0x2798, 0x27b0, 0x27d1, 0x27e9, 0x27f8, - 0x2813, 0x282b, 0x282b, 0x2856, 0x2856, 0x2862, 0x2862, 0x287a, - 0x28ab, 0x28c7, 0x28c7, 0x28dc, 0x28e8, 0x28e8, 0x28fa, 0x28fa, - // Entry 200 - 23F - 0x28fa, 0x2916, 0x292c, 0x2945, 0x2967, 0x297f, 0x299a, 0x29c2, - 0x29d4, 0x29dd, 0x29dd, 0x29ef, 0x29fb, 0x2a16, 0x2a31, 0x2a65, - 0x2a7d, 0x2a7d, 0x2a7d, 0x2a8f, 0x2a9b, 0x2aad, 0x2abf, 0x2ad1, - 0x2add, 0x2aef, 0x2aef, 0x2b0d, 0x2b25, 0x2b25, 0x2b37, 0x2b59, - 0x2b78, 0x2b78, 0x2b87, 0x2b87, 0x2ba8, 0x2ba8, 0x2bc0, 0x2bd2, - 0x2be4, 0x2bff, 0x2c37, 0x2c52, 0x2c6d, 0x2c88, 0x2c94, 0x2c9a, - 0x2c9a, 0x2c9a, 0x2c9a, 0x2c9a, 0x2cac, 0x2cac, 0x2cbe, 0x2cd6, - 0x2cf4, 0x2d00, 0x2d0c, 0x2d21, 0x2d37, 0x2d4c, 0x2d4c, 0x2d58, - // Entry 240 - 27F - 0x2d64, 0x2d76, 0x2d8e, 0x2da0, 0x2da0, 0x2dbe, 0x2dd6, 0x2e06, - 0x2e06, 0x2e15, 0x2e68, 0x2e74, 0x2ebb, 0x2ec7, 0x2efc, 0x2efc, - 0x2f2a, 0x2f59, 0x2f90, 0x2fb8, 0x2fef, 0x3020, 0x3067, 0x3098, - 0x30cc, 0x30cc, 0x30f4, 0x311c, 0x3138, 0x3153, 0x3193, 0x31d0, - 0x31f1, 0x321f, 0x324a, 0x3284, 0x32af, -} // Size: 1250 bytes - -const teLangStr string = "" + // Size: 12415 bytes - "అఫార్అబ్ఖాజియన్అవేస్టాన్ఆఫ్రికాన్స్అకాన్అమ్హారిక్అరగోనిస్అరబిక్అస్సామీస్" + - "అవారిక్ఐమారాఅజర్బైజానిబష్కిర్బెలరుషియన్బల్గేరియన్బిస్లామాబంబారాబాంగ్లా" + - "టిబెటన్బ్రెటన్బోస్నియన్కెటలాన్చెచెన్చమర్రోకోర్సికన్క్రిచెక్చర్చ స్లావి" + - "క్చువాష్వెల్ష్డానిష్జర్మన్దివేహిజోంఖాఈవీగ్రీక్ఆంగ్లంఎస్పెరాంటోస్పానిష్" + - "ఈస్టోనియన్బాస్క్యూపర్షియన్ఫ్యులఫిన్నిష్ఫిజియన్ఫారోయీజ్ఫ్రెంచ్పశ్చిమ ఫ్" + - "రిసియన్ఐరిష్స్కాటిష్ గేలిక్గాలిషియన్గురానిగుజరాతిమంకస్హౌసాహీబ్రూహిందీహ" + - "ిరి మోటుక్రోయేషియన్హైటియన్ క్రియోల్హంగేరియన్ఆర్మేనియన్హిరేరోఇంటర్లింగ్" + - "వాఇండోనేషియన్ఇంటర్లింగ్ఇగ్బోశిషువన్ ఈఇనుపైయాక్ఈడౌఐస్లాండిక్ఇటాలియన్ఇంక" + - "్టిటుట్జపనీస్జావనీస్జార్జియన్కోంగోకికుయుక్వాన్యామకజఖ్కలాల్లిసూట్ఖ్మేర్" + - "కన్నడకొరియన్కానురికాశ్మీరికుర్దిష్కోమికోర్నిష్కిర్గిజ్లాటిన్లుక్సంబర్గ" + - "ిష్గాండాలిమ్బర్గిష్లింగాలలావోలిథుయేనియన్లూబ-కటాంగలాట్వియన్మాలాగసిమార్ష" + - "లీస్మయోరిమసడోనియన్మలయాళంమంగోలియన్మరాఠీమలేయ్మాల్టీస్బర్మీస్నౌరుఉత్తర దె" + - "బెలెనేపాలిదోంగాడచ్నార్వేజియాన్ న్యోర్స్క్నార్వేజియన్ బొక్మాల్దక్షిణ దె" + - "బెలెనవాజొన్యాన్జాఆక్సిటన్చేవాఒరోమోఒడియాఒసేటిక్పంజాబీపాలీపోలిష్పాష్టోపో" + - "ర్చుగీస్కెషుయారోమన్ష్రండిరోమానియన్రష్యన్కిన్యర్వాండాసంస్కృతంసార్డీనియన" + - "్సింధీఉత్తర సామిసాంగోసింహళంస్లోవాక్స్లోవేనియాన్సమోవన్షోనసోమాలిఅల్బేనియ" + - "న్సెర్బియన్స్వాతిదక్షిణ సోతోసుడానీస్స్వీడిష్స్వాహిలితమిళముతెలుగుతజిక్థ" + - "ాయ్తిగ్రిన్యాతుర్కమెన్సెటస్వానాటాంగాన్టర్కిష్సోంగాటాటర్తహితియన్ఉయ్" + - "\u200cఘర్ఉక్రేనియన్ఉర్దూఉజ్బెక్వెండావియత్నామీస్వోలాపుక్వాలూన్వొలాఫ్షోసాఇ" + - "డ్డిష్యోరుబాజువాన్చైనీస్జూలూఆఖినీస్అకోలిఅడాంగ్మేఅడిగాబ్జేటునీషియా అరబి" + - "క్అఫ్రిహిలిఅగేమ్ఐనుఅక్కాడియాన్అలియుట్దక్షిణ ఆల్టైప్రాచీన ఆంగ్లంఆంగికఅర" + - "ామేక్అరౌకేనియన్అరాపాహోఅరావాక్ఈజిప్షియన్ అరబిక్అసుఅస్టురియాన్అవధిబాలుచి" + - "బాలినీస్బసాబేజాబెంబాబీనాపశ్చిమ బలూచీభోజ్ పూరిబికోల్బినిసిక్ సికాబిష్ణు" + - "ప్రియబ్రాజ్బోడోబురియట్బ్యుగినిస్బ్లిన్కేడ్డోకేరిబ్అట్సామ్సెబుయానోఛిగాచ" + - "ిబ్చాచాగటైచూకిస్మారిచినూక్ జార్గన్చొచ్కతావ్చిపెవ్యాన్చెరోకీచేయేన్సెంట్" + - "రల్ కుర్దిష్కోప్టిక్క్రిమియన్ టర్కిష్సెసేల్వా క్రియోల్ ఫ్రెంచ్కషుబియన్" + - "డకోటాడార్గ్వాటైటాడెలావేర్స్లేవ్డోగ్రిబ్డింకాజార్మాడోగ్రిలోవర్ సోర్బియన" + - "్దుఆలామధ్యమ డచ్జోలా-ఫోనయిడ్యులాడాజాగాఇంబుఎఫిక్ప్రాచీన ఈజిప్షియన్ఏకాజక్" + - "ఎలామైట్మధ్యమ ఆంగ్లంఎవోండొఫాంగ్ఫిలిపినోఫాన్మధ్యమ ప్రెంచ్ప్రాచీన ఫ్రెంచ్" + - "ఉత్తర ఫ్రిసియన్తూర్పు ఫ్రిసియన్ఫ్రియులియన్గాగాగౌజ్గాన్ చైనీస్గాయోగ్బాయ" + - "ాజీజ్గిల్బర్టీస్మధ్యమ హై జర్మన్ప్రాచీన హై జర్మన్గోండిగోరోంటలాగోథిక్గ్ర" + - "ేబోప్రాచీన గ్రీక్స్విస్ జర్మన్గుస్సీగ్విచిన్హైడాహక్కా చైనీస్హవాయియన్హి" + - "లిగేయినోన్హిట్టిటేమోంగ్అప్పర్ సోర్బియన్జియాంగ్ చైనీస్హుపాఐబాన్ఇబిబియోఐ" + - "యోకోఇంగుష్లోజ్బాన్గోంబామకొమ్జ్యుడియో-పర్షియన్జ్యుడియో-అరబిక్కారా-కల్పా" + - "క్కాబిల్కాచిన్జ్యూకంబాకావికబార్డియన్ట్యాప్మకొండేకాబువేర్దియనుకోరోఖాసిఖ" + - "టోనీస్కొయరా చీన్నీకాకోకలెంజిన్కిమ్బుండుకోమి-పర్మాక్కొంకణికోస్రేయన్పెల్" + - "లేకరచే-బల్కార్కరేలియన్కూరుఖ్శంబాలాబాఫియకొలొజీయన్కుమ్యిక్కుటేనైలాడినోలా" + - "ంగీలాహండాలాంబాలేజ్ఘియన్లకొటామొంగోలోజిఉత్తర లూరీలుబా-లులువలుయిసెనోలుండా" + - "లువోమిజోలుయియమాదురీస్మగాహిమైథిలిమకాసార్మండింగోమాసాయిమొక్షామండార్మెండేమ" + - "ెరుమొరిస్యేన్మధ్యమ ఐరిష్మక్వా-మిట్టోమెటామికమాక్మినాంగ్కాబోమంచుమణిపూరిమ" + - "ోహుక్మోస్సిముదాంగ్బహుళ భాషలుక్రీక్మిరాండిస్మార్వాడిఎర్జియామాసన్\u200cద" + - "ెరానిమిన్ నాన్ చైనీస్నియాపోలిటన్నమలో జర్మన్నెవారినియాస్నియూఇయాన్క్వాసి" + - "యెగింబోన్నోగైప్రాచిన నోర్స్న్కోఉత్తర సోతోన్యుర్సాంప్రదాయ న్యూయారీన్యంవ" + - "ేజిన్యాన్కోలెనేయోరోజీమాఒసాజ్ఒట్టోమన్ టర్కిష్పంగా సినాన్పహ్లావిపంపగ్నపప" + - "ియమేంటోపాలుఆన్నైజీరియా పిడ్గిన్ప్రాచీన పర్షియన్ఫోనికన్పోహ్న్పెయన్ప్రష్" + - "యన్ప్రాచీన ప్రోవెంసాల్కిచేరాజస్తానీరాపన్యుయిరారోటొంగాన్రోంబోరోమానీఆరోమ" + - "ేనియన్ర్వాసండావిసఖాసమారిటన్ అరమేక్సంబురుససక్సంటాలిగాంబేసాంగుసిసిలియన్స" + - "్కాట్స్దక్షిణ కుర్దిష్సెనాసేల్కప్కోయోరాబోరో సెన్నీప్రాచీన ఐరిష్టాచెల్" + - "\u200cహిట్షాన్సిడామోదక్షిణ సామిలులే సామిఇనారి సామిస్కోల్ట్ సామిసోనింకిసో" + - "గ్డియన్స్రానన్ టోనగోసెరేర్సహోసుకుమాసుసుసుమేరియాన్కొమొరియన్సాంప్రదాయ సి" + - "రియాక్సిరియాక్తుళుటింనేటెసోటెరెనోటేటంటీగ్రెటివ్టోకెలావ్క్లింగాన్ట్లింగ" + - "ిట్టామషేక్న్యాసా టోన్గాటోక్ పిసిన్తరోకోశింషీయన్టుంబుకాటువాలుటసావాఖ్టువ" + - "ినియన్సెంట్రల్ అట్లాస్ టామాజైట్ఉడ్ముర్ట్ఉగారిటిక్ఉమ్బుండురూట్వాయివోటిక" + - "్వుంజొవాల్సర్వాలేట్టావారేవాషోవార్లపిరివు చైనీస్కల్మిక్సొగాయాయేయాపిస్యా" + - "ంగ్\u200cబెన్యెంబాకాంటనీస్జపోటెక్బ్లిసింబల్స్జెనాగాప్రామాణిక మొరొకన్ త" + - "మజియట్జునిలిపి లేదుజాజాఆధునిక ప్రామాణిక అరబిక్ఆస్ట్రేలియన్ జర్మన్స్విస" + - "్ హై జర్మన్ఆస్ట్రేలియన్ ఇంగ్లీష్కెనడియన్ ఇంగ్లీష్బ్రిటిష్ ఇంగ్లీష్అమెర" + - "ికన్ ఇంగ్లీష్లాటిన్ అమెరికన్ స్పానిష్యూరోపియన్ స్పానిష్మెక్సికన్ స్పాన" + - "ిష్కెనడియెన్ ఫ్రెంచ్స్విస్ ఫ్రెంచ్లో సాక్సన్ఫ్లెమిష్బ్రెజీలియన్ పోర్చు" + - "గీస్యూరోపియన్ పోర్చుగీస్మొల్డావియన్సేర్బో-క్రొయేషియన్కాంగో స్వాహిలిసరళ" + - "ీకృత చైనీస్సాంప్రదాయక చైనీస్" - -var teLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x002d, 0x0048, 0x0069, 0x0078, 0x0093, 0x00ab, - 0x00bd, 0x00d8, 0x00ed, 0x00fc, 0x011a, 0x012f, 0x014d, 0x016b, - 0x0183, 0x0195, 0x01aa, 0x01bf, 0x01d4, 0x01ef, 0x0204, 0x0216, - 0x0228, 0x0243, 0x024f, 0x025b, 0x0280, 0x0292, 0x02a4, 0x02b6, - 0x02c8, 0x02da, 0x02e9, 0x02f2, 0x0304, 0x0316, 0x0334, 0x034c, - 0x036a, 0x0382, 0x039a, 0x03a9, 0x03c1, 0x03d6, 0x03ee, 0x0403, - 0x0431, 0x0440, 0x046b, 0x0486, 0x0498, 0x04ad, 0x04bc, 0x04c8, - 0x04da, 0x04e9, 0x0502, 0x0523, 0x0551, 0x056c, 0x058a, 0x059c, - // Entry 40 - 7F - 0x05c0, 0x05e1, 0x05ff, 0x060e, 0x0627, 0x0642, 0x064b, 0x0669, - 0x0681, 0x069f, 0x06b1, 0x06c6, 0x06e1, 0x06f0, 0x0702, 0x071d, - 0x0729, 0x074a, 0x075c, 0x076b, 0x0780, 0x0792, 0x07aa, 0x07c2, - 0x07ce, 0x07e6, 0x07fe, 0x0810, 0x0837, 0x0846, 0x0867, 0x0879, - 0x0885, 0x08a6, 0x08bf, 0x08da, 0x08ef, 0x090a, 0x0919, 0x0934, - 0x0946, 0x0961, 0x0970, 0x097f, 0x0997, 0x09ac, 0x09b8, 0x09da, - 0x09ec, 0x09fb, 0x0a04, 0x0a47, 0x0a81, 0x0aa6, 0x0ab5, 0x0acd, - 0x0ae5, 0x0af1, 0x0b00, 0x0b0f, 0x0b24, 0x0b36, 0x0b42, 0x0b54, - // Entry 80 - BF - 0x0b66, 0x0b84, 0x0b96, 0x0bab, 0x0bb7, 0x0bd2, 0x0be4, 0x0c08, - 0x0c20, 0x0c41, 0x0c50, 0x0c6c, 0x0c7b, 0x0c8d, 0x0ca5, 0x0cc9, - 0x0cdb, 0x0ce4, 0x0cf6, 0x0d14, 0x0d2f, 0x0d41, 0x0d60, 0x0d78, - 0x0d90, 0x0da8, 0x0dba, 0x0dcc, 0x0ddb, 0x0de7, 0x0e05, 0x0e20, - 0x0e3b, 0x0e50, 0x0e65, 0x0e74, 0x0e83, 0x0e9b, 0x0eb0, 0x0ece, - 0x0edd, 0x0ef2, 0x0f01, 0x0f22, 0x0f3a, 0x0f4c, 0x0f5e, 0x0f6a, - 0x0f7f, 0x0f91, 0x0fa3, 0x0fb5, 0x0fc1, 0x0fd6, 0x0fe5, 0x0ffd, - 0x1018, 0x1043, 0x105e, 0x106d, 0x1076, 0x1097, 0x1097, 0x10ac, - // Entry C0 - FF - 0x10ac, 0x10ce, 0x10f6, 0x1105, 0x111a, 0x1138, 0x1138, 0x114d, - 0x114d, 0x114d, 0x1162, 0x1162, 0x1193, 0x119c, 0x119c, 0x11bd, - 0x11bd, 0x11c9, 0x11db, 0x11f3, 0x11f3, 0x11fc, 0x11fc, 0x11fc, - 0x11fc, 0x1208, 0x1217, 0x1217, 0x1223, 0x1223, 0x1223, 0x1245, - 0x125e, 0x1270, 0x127c, 0x127c, 0x127c, 0x1295, 0x12b6, 0x12b6, - 0x12c8, 0x12c8, 0x12d4, 0x12d4, 0x12e9, 0x1307, 0x1307, 0x1319, - 0x1319, 0x132b, 0x133d, 0x133d, 0x1352, 0x136a, 0x1376, 0x1388, - 0x1397, 0x13a9, 0x13b5, 0x13dd, 0x13f8, 0x1416, 0x1428, 0x143a, - // Entry 100 - 13F - 0x146b, 0x1483, 0x1483, 0x14b4, 0x14fb, 0x1513, 0x1522, 0x153a, - 0x1546, 0x155e, 0x1570, 0x1588, 0x1597, 0x15a9, 0x15bb, 0x15e6, - 0x15e6, 0x15f5, 0x160e, 0x162a, 0x163c, 0x164e, 0x165a, 0x1669, - 0x1669, 0x169d, 0x16af, 0x16c4, 0x16e6, 0x16e6, 0x16f8, 0x16f8, - 0x1707, 0x171f, 0x171f, 0x172b, 0x172b, 0x1750, 0x177b, 0x177b, - 0x17a6, 0x17d4, 0x17f5, 0x17fb, 0x180d, 0x182c, 0x1838, 0x184a, - 0x184a, 0x1856, 0x1877, 0x1877, 0x18a0, 0x18cf, 0x18cf, 0x18de, - 0x18f6, 0x1908, 0x191a, 0x1942, 0x1967, 0x1967, 0x1967, 0x1979, - // Entry 140 - 17F - 0x1991, 0x199d, 0x19bf, 0x19d7, 0x19d7, 0x19fb, 0x1a13, 0x1a22, - 0x1a50, 0x1a78, 0x1a84, 0x1a93, 0x1aa8, 0x1ab7, 0x1ac9, 0x1ac9, - 0x1ac9, 0x1ae1, 0x1af0, 0x1aff, 0x1b30, 0x1b5b, 0x1b5b, 0x1b7d, - 0x1b8f, 0x1ba1, 0x1bad, 0x1bb9, 0x1bc5, 0x1be3, 0x1be3, 0x1bf5, - 0x1c07, 0x1c2e, 0x1c2e, 0x1c3a, 0x1c3a, 0x1c46, 0x1c5b, 0x1c7d, - 0x1c7d, 0x1c7d, 0x1c89, 0x1ca1, 0x1cbc, 0x1cde, 0x1cf0, 0x1d0b, - 0x1d1d, 0x1d3f, 0x1d3f, 0x1d3f, 0x1d57, 0x1d69, 0x1d7b, 0x1d8a, - 0x1da5, 0x1dbd, 0x1dcf, 0x1de1, 0x1df0, 0x1e02, 0x1e11, 0x1e2c, - // Entry 180 - 1BF - 0x1e2c, 0x1e2c, 0x1e2c, 0x1e3b, 0x1e3b, 0x1e4a, 0x1e56, 0x1e72, - 0x1e72, 0x1e8e, 0x1ea6, 0x1eb5, 0x1ec1, 0x1ecd, 0x1edc, 0x1edc, - 0x1edc, 0x1ef4, 0x1ef4, 0x1f03, 0x1f15, 0x1f2a, 0x1f3f, 0x1f51, - 0x1f51, 0x1f63, 0x1f75, 0x1f84, 0x1f90, 0x1fae, 0x1fcd, 0x1fef, - 0x1ffb, 0x2010, 0x2031, 0x203d, 0x2052, 0x2064, 0x2076, 0x2076, - 0x208b, 0x20a7, 0x20b9, 0x20d4, 0x20ec, 0x20ec, 0x20ec, 0x2101, - 0x2125, 0x2151, 0x2172, 0x2178, 0x2191, 0x21a3, 0x21b5, 0x21d0, - 0x21d0, 0x21e8, 0x21fd, 0x2209, 0x2231, 0x2231, 0x223d, 0x2259, - // Entry 1C0 - 1FF - 0x226b, 0x229f, 0x22b7, 0x22d5, 0x22e7, 0x22f3, 0x2302, 0x2330, - 0x234f, 0x2364, 0x2376, 0x2391, 0x23a6, 0x23a6, 0x23d7, 0x23d7, - 0x23d7, 0x2405, 0x2405, 0x241a, 0x241a, 0x241a, 0x243b, 0x2453, - 0x248a, 0x2496, 0x2496, 0x24b1, 0x24cc, 0x24ed, 0x24ed, 0x24ed, - 0x24fc, 0x250e, 0x250e, 0x250e, 0x250e, 0x252c, 0x2538, 0x254a, - 0x2553, 0x257e, 0x2590, 0x259c, 0x25ae, 0x25ae, 0x25bd, 0x25cc, - 0x25e7, 0x25ff, 0x25ff, 0x262a, 0x262a, 0x2636, 0x2636, 0x264b, - 0x267c, 0x26a1, 0x26a1, 0x26c2, 0x26ce, 0x26ce, 0x26e0, 0x26e0, - // Entry 200 - 23F - 0x26e0, 0x26ff, 0x2718, 0x2734, 0x2759, 0x276e, 0x2789, 0x27ae, - 0x27c0, 0x27c9, 0x27c9, 0x27db, 0x27e7, 0x2805, 0x2820, 0x2854, - 0x286c, 0x286c, 0x2878, 0x2887, 0x2893, 0x28a5, 0x28b1, 0x28c3, - 0x28cf, 0x28e7, 0x28e7, 0x2902, 0x291d, 0x291d, 0x2932, 0x2957, - 0x2976, 0x2976, 0x2985, 0x2985, 0x299d, 0x299d, 0x29b2, 0x29c4, - 0x29d9, 0x29f4, 0x2a3b, 0x2a56, 0x2a71, 0x2a89, 0x2a95, 0x2aa1, - 0x2aa1, 0x2aa1, 0x2aa1, 0x2aa1, 0x2ab3, 0x2ab3, 0x2ac2, 0x2ad7, - 0x2aef, 0x2afb, 0x2b07, 0x2b22, 0x2b3b, 0x2b50, 0x2b50, 0x2b5c, - // Entry 240 - 27F - 0x2b68, 0x2b7a, 0x2b98, 0x2ba7, 0x2ba7, 0x2bbf, 0x2bd4, 0x2bf8, - 0x2bf8, 0x2c0a, 0x2c51, 0x2c5d, 0x2c76, 0x2c82, 0x2cc3, 0x2cc3, - 0x2cfa, 0x2d26, 0x2d63, 0x2d94, 0x2dc5, 0x2df6, 0x2e3a, 0x2e6e, - 0x2ea2, 0x2ea2, 0x2ed3, 0x2efb, 0x2f17, 0x2f2f, 0x2f6f, 0x2fa9, - 0x2fca, 0x2ffe, 0x3026, 0x304e, 0x307f, -} // Size: 1250 bytes - -const thLangStr string = "" + // Size: 13813 bytes - "อะฟาร์อับคาซอเวสตะแอฟริกานส์อาคันอัมฮาราอารากอนอาหรับอัสสัมอาวาร์ไอย์มาร" + - "าอาเซอร์ไบจานบัชคีร์เบลารุสบัลแกเรียบิสลามาบัมบาราเบงกาลีทิเบตเบรตันบอ" + - "สเนียกาตาลังเชเชนชามอร์โรคอร์ซิกาครีเช็กเชอร์ชสลาวิกชูวัชเวลส์เดนมาร์ก" + - "เยอรมันธิเวหิซองคาเอเวกรีกอังกฤษเอสเปอรันโตสเปนเอสโตเนียบัสเกเปอร์เซีย" + - "ฟูลาฮ์ฟินแลนด์ฟิจิแฟโรฝรั่งเศสฟริเซียนตะวันตกไอริชสกอตส์กาลิกกาลิเซียก" + - "วารานีคุชราตมานซ์เฮาชาฮิบรูฮินดีฮีรีโมตูโครเอเชียเฮติฮังการีอาร์เมเนีย" + - "เฮเรโรอินเตอร์ลิงกัวอินโดนีเชียอินเตอร์ลิงกิวอิกโบเสฉวนยิอีนูเปียกอีโด" + - "ไอซ์แลนด์อิตาลีอินุกติตุตญี่ปุ่นชวาจอร์เจียคองโกกีกูยูกวนยามาคาซัคกรีน" + - "แลนด์เขมรกันนาดาเกาหลีคานูรีกัศมีร์เคิร์ดโกมิคอร์นิชคีร์กีซละตินลักเซม" + - "เบิร์กยูกันดาลิมเบิร์กลิงกาลาลาวลิทัวเนียลูบา-กาตองกาลัตเวียมาลากาซีมา" + - "ร์แชลลิสเมารีมาซิโดเนียมาลายาลัมมองโกเลียมราฐีมาเลย์มอลตาพม่านาอูรูเอ็" + - "นเดเบเลเหนือเนปาลดองกาดัตช์นอร์เวย์นีนอสก์นอร์เวย์บุคมอลเอ็นเดเบเลใต้น" + - "าวาโฮเนียนจาอ็อกซิตันโอจิบวาโอโรโมโอริยาออสเซเตียปัญจาบบาลีโปแลนด์พาชต" + - "ูโปรตุเกสควิชัวโรแมนซ์บุรุนดีโรมาเนียรัสเซียรวันดาสันสกฤตซาร์เดญาสินธุ" + - "ซามิเหนือแซงโกสิงหลสโลวักสโลวีเนียซามัวโชนาโซมาลีแอลเบเนียเซอร์เบียสวา" + - "ติโซโทใต้ซุนดาสวีเดนสวาฮีลีทมิฬเตลูกูทาจิกไทยติกริญญาเติร์กเมนิสถานบอต" + - "สวานาตองกาตุรกีซิตซองกาตาตาร์ตาฮิตีอุยกัวยูเครนอูรดูอุซเบกเวนดาเวียดนา" + - "มโวลาพึควาโลนีโวลอฟคะห์โอซายิวโยรูบาจ้วงจีนซูลูอาเจะห์อาโคลิอาแดงมีอะด" + - "ืยเกอาหรับตูนิเซียแอฟริฮีลีอักเฮมไอนุอักกาดแอละแบมาอาลิวต์เกกแอลเบเนีย" + - "อัลไตใต้อังกฤษโบราณอังคิกาอราเมอิกอาเราคาเนียนอาเรานาอาราปาโฮอาหรับแอล" + - "จีเรียอาราวักอาหรับโมร็อกโกอาหรับพื้นเมืองอียิปต์อาซูภาษามืออเมริกันอั" + - "สตูเรียสโคตาวาอวธีบาลูชิบาหลีบาวาเรียบาสาบามันบาตักโทบาโคมาลาเบจาเบมบา" + - "เบตาวีเบนาบาฟัตพทคะบาลูจิตะวันตกโภชปุรีบิกอลบินีบันจาร์กมสิกสิกาพิศนุป" + - "ริยะบักติยารีพัรชบราฮุยโพโฑอาโคซีบูเรียตบูกิสบูลูบลินเมดุมบาคัดโดคาริบ" + - "คายูกาแอตแซมเซบูคีกาชิบชาชะกะไตชูกมารีชินุกจาร์กอนช็อกทอว์ชิพิวยันเชอโ" + - "รกีเชเยนเนเคิร์ดโซรานีคอปติกกาปิซนอนตุรกีไครเมียครีโอลเซเซลส์ฝรั่งเศสค" + - "าซูเบียนดาโกทาดาร์กินไททาเดลาแวร์สเลวีโดกริบดิงกาซาร์มาโฑครีซอร์บส์ตอน" + - "ล่างดูซุนกลางดัวลาดัตช์กลางโจลา-ฟอนยีดิวลาดาซากาเอ็มบูอีฟิกเอมีเลียอีย" + - "ิปต์โบราณอีกาจุกอีลาไมต์อังกฤษกลางยูพิกกลางอีวันโดเอกซ์เตรมาดูราฟองฟิล" + - "ิปปินส์ฟินแลนด์ทอร์เนดาเล็นฟอนฝรั่งเศสกาฌ็องฝรั่งเศสกลางฝรั่งเศสโบราณอ" + - "าร์พิตาฟริเซียนเหนือฟริเซียนตะวันออกฟรูลีกากากาอุซจีนกั้นกาโยกบายาดารี" + - "โซโรอัสเตอร์กีซกิลเบอร์ตกิลากีเยอรมันสูงกลางเยอรมันสูงโบราณกอนกานีของก" + - "ัวกอนดิกอรอนทาโลโกธิกเกรโบกรีกโบราณเยอรมันสวิสวายูฟราฟรากุซซีกวิชอินไฮ" + - "ดาจีนแคะฮาวายฮินดีฟิจิฮีลีกัยนนฮิตไตต์ม้งซอร์บส์ตอนบนจีนเซียงฮูปาอิบาน" + - "อิบิบิโออีโลโกอินกุชอินเกรียนอังกฤษคลีโอลจาเมกาโลชบันอึนกอมบามาชาเมยิว" + - "-เปอร์เซียยิว-อาหรับจัทการา-กาลพากกาไบลกะฉิ่นคจูคัมบากวีคาร์บาเดียคาเนมบ" + - "ูทีแยปมาคอนเดคาบูเวอร์เดียนูเกินยางโคโรเคนก่างกาสีโคตันโคย์ราชีนีโควาร" + - "์เคอร์มานิกิคาโกคาเลนจินคิมบุนดูโคมิ-เปียร์เมียคกอนกานีคูสไรกาแปลคาราไ" + - "ช-บัลคาร์คริโอกินารายอาแกรเลียนกุรุขชัมบาลาบาเฟียโคโลญคูมืยค์คูเทไนลาด" + - "ิโนแลนจีลาฮ์นดาแลมบาเลซเกียนลิงกัวฟรังกาโนวาลิกูเรียลิโวเนียลาโกตาลอมบ" + - "าร์ดมองโกโลซิลูรีเหนือลัตเกลลูบา-ลูลัวลุยเซโนลันดาลัวลูไชลูเยียจีนคลาส" + - "สิกแลซมาดูรามาฟามคหีไมถิลีมากาซาร์มันดิงกามาไซมาบามอคชามานดาร์เมนเดเมร" + - "ูมอริสเยนไอริชกลางมากัววา-มีทโทเมตามิกแมกมีนังกาเบาแมนจูมณีปุระโมฮอว์ก" + - "โมซีมารีตะวันตกมันดังหลายภาษาครีกมีรันดามารวาฑีเม็นตาไวมยีนเอียร์ซยามา" + - "ซันดารานีจีนมินหนานนาโปลีนามาเยอรมันต่ำ - แซกซอนต่ำเนวาร์นีอัสนีอูอ๋าว" + - "นากากวาซิโอจีมบูนโนไกนอร์สโบราณโนเวียลเอ็นโกโซโทเหนือเนือร์เนวาร์ดั้งเ" + - "ดิมเนียมเวซีเนียนโกเลนิโอโรนซิมาโอซากีตุรกีออตโตมันปางาซีนันปะห์ลาวีปั" + - "มปางาปาเปียเมนโตปาเลาปิการ์พิดจินเยอรมันเพนซิลเวเนียเพลาท์ดิชเปอร์เซีย" + - "โบราณเยอรมันพาลาทิเนตฟินิเชียพีดมอนต์พอนติกพอห์นเพปรัสเซียโปรวองซาลโบร" + - "าณกีเชควิชัวไฮแลนด์ชิมโบราโซราชสถานราปานูราโรทองกาโรมัณโญริฟฟิอันรอมโบ" + - "โรมานีโรทูมันรูซินโรเวียนาอาโรมาเนียนรวาซันดาเวซาฮาอราเมอิกซามาเรียแซม" + - "บูรูซาซักสันตาลีเสาราษฏร์กัมเบแซงกูซิซิลีสกอตส์ซาร์ดิเนียซาสซารีเคอร์ด" + - "ิชใต้เซนิกาเซนาเซรีเซลคุปโคย์ราโบโรเซนนีไอริชโบราณซาโมจิเตียนทาเชลีห์ท" + - "ไทใหญ่อาหรับ-ชาดซิดาโมไซลีเซียตอนล่างเซลายาร์ซามิใต้ซามิลูเลซามิอีนารี" + - "ซามิสคอลต์โซนีนเกซอกดีนซูรินาเมเซแรร์ซาโฮฟรีเซียนซัทเธอร์แลนด์ซูคูมาซู" + - "ซูซูเมอโคเมอเรียนซีเรียแบบดั้งเดิมซีเรียไซลีเซียตูลูทิมเนเตโซเทเรโนเตต" + - "ุมตีเกรทิฟโตเกเลาแซคเซอร์คลิงกอนทลิงกิตทาลิชทามาเชกไนอะซาตองกาท็อกพิซิ" + - "นตูโรโยทาโรโกซาโคเนียซิมชีแอนตัตมุสลิมทุมบูกาตูวาลูตัสซาวัคตูวาทามาไซต" + - "์แอตลาสกลางอุดมูร์ตยูการิตอุมบุนดูรูทไวเวเนโต้เวปส์เฟลมิชตะวันตกเมน-ฟร" + - "านโกเนียโวทิกโวโรวุนจูวัลเซอร์วาลาโมวาเรย์วาโชวอล์เพอร์รีจีนอู๋คัลมืยค" + - "์เมเกรเลียโซกาเย้ายัปแยงเบนเยมบาเหงงกาตุกวางตุ้งซาโปเตกบลิสซิมโบลส์เซแ" + - "ลนด์เซนากาทามาไซต์โมร็อกโกมาตรฐานซูนิไม่มีข้อมูลภาษาซาซาอาหรับมาตรฐานส" + - "มัยใหม่เยอรมัน - ออสเตรียเยอรมันสูง (สวิส)อังกฤษ - ออสเตรเลียอังกฤษ - " + - "แคนาดาอังกฤษ - สหราชอาณาจักรอังกฤษ - อเมริกันสเปน - ละตินอเมริกาสเปน -" + - " ยุโรปสเปน - เม็กซิโกฝรั่งเศส - แคนาดาฝรั่งเศส (สวิส)แซกซอนใต้เฟลมิชโปรต" + - "ุเกส - บราซิลโปรตุเกส - ยุโรปมอลโดวาเซอร์โบ-โครเอเชียสวาฮีลี-คองโกจีนต" + - "ัวย่อจีนตัวเต็ม" - -var thLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0012, 0x0024, 0x0036, 0x0054, 0x0063, 0x0078, 0x008d, - 0x009f, 0x00b1, 0x00c3, 0x00db, 0x00ff, 0x0114, 0x0129, 0x0144, - 0x0159, 0x016e, 0x0183, 0x0192, 0x01a4, 0x01b9, 0x01ce, 0x01dd, - 0x01f5, 0x020d, 0x0216, 0x0222, 0x0246, 0x0255, 0x0264, 0x027c, - 0x0291, 0x02a3, 0x02b2, 0x02be, 0x02ca, 0x02dc, 0x02fd, 0x0309, - 0x0324, 0x0333, 0x034e, 0x0360, 0x0378, 0x0384, 0x0390, 0x03a8, - 0x03d5, 0x03e4, 0x0405, 0x041d, 0x0432, 0x0444, 0x0453, 0x0462, - 0x0471, 0x0480, 0x0498, 0x04b3, 0x04bf, 0x04d4, 0x04f2, 0x0504, - // Entry 40 - 7F - 0x052e, 0x054f, 0x0579, 0x0588, 0x059d, 0x05b8, 0x05c4, 0x05df, - 0x05f1, 0x060f, 0x0624, 0x062d, 0x0645, 0x0654, 0x0666, 0x067b, - 0x068a, 0x06a5, 0x06b1, 0x06c6, 0x06d8, 0x06ea, 0x06ff, 0x0711, - 0x071d, 0x0732, 0x0747, 0x0756, 0x077a, 0x078f, 0x07aa, 0x07bf, - 0x07c8, 0x07e3, 0x0805, 0x081a, 0x0832, 0x0850, 0x085f, 0x087d, - 0x0898, 0x08b3, 0x08c2, 0x08d4, 0x08e3, 0x08ef, 0x0901, 0x092e, - 0x093d, 0x094c, 0x095b, 0x0988, 0x09b2, 0x09d9, 0x09eb, 0x0a00, - 0x0a1b, 0x0a30, 0x0a42, 0x0a54, 0x0a6f, 0x0a81, 0x0a8d, 0x0aa2, - // Entry 80 - BF - 0x0ab1, 0x0ac9, 0x0adb, 0x0af0, 0x0b05, 0x0b1d, 0x0b32, 0x0b44, - 0x0b59, 0x0b71, 0x0b80, 0x0b9b, 0x0baa, 0x0bb9, 0x0bcb, 0x0be6, - 0x0bf5, 0x0c01, 0x0c13, 0x0c2e, 0x0c49, 0x0c58, 0x0c6d, 0x0c7c, - 0x0c8e, 0x0ca3, 0x0caf, 0x0cc1, 0x0cd0, 0x0cd9, 0x0cf1, 0x0d1b, - 0x0d33, 0x0d42, 0x0d51, 0x0d69, 0x0d7b, 0x0d8d, 0x0d9f, 0x0db1, - 0x0dc0, 0x0dd2, 0x0de1, 0x0df9, 0x0e0e, 0x0e20, 0x0e2f, 0x0e47, - 0x0e50, 0x0e62, 0x0e6e, 0x0e77, 0x0e83, 0x0e98, 0x0eaa, 0x0ebf, - 0x0ed4, 0x0efe, 0x0f19, 0x0f2b, 0x0f37, 0x0f49, 0x0f61, 0x0f76, - // Entry C0 - FF - 0x0f9a, 0x0fb2, 0x0fd3, 0x0fe8, 0x1000, 0x1024, 0x1039, 0x1051, - 0x107e, 0x107e, 0x1093, 0x10bd, 0x10ff, 0x110b, 0x1138, 0x1156, - 0x1168, 0x1174, 0x1186, 0x1195, 0x11ad, 0x11b9, 0x11c8, 0x11e3, - 0x11f5, 0x1201, 0x1210, 0x1222, 0x122e, 0x123d, 0x1249, 0x1270, - 0x1285, 0x1294, 0x12a0, 0x12b5, 0x12bb, 0x12d0, 0x12ee, 0x1309, - 0x1315, 0x1327, 0x1333, 0x1345, 0x135a, 0x1369, 0x1375, 0x1381, - 0x1396, 0x13a5, 0x13b4, 0x13c6, 0x13d8, 0x13e4, 0x13f0, 0x13ff, - 0x1411, 0x141a, 0x1426, 0x144a, 0x1462, 0x147a, 0x148f, 0x14a4, - // Entry 100 - 13F - 0x14c8, 0x14da, 0x14f2, 0x1516, 0x1555, 0x1570, 0x1582, 0x1597, - 0x15a3, 0x15bb, 0x15ca, 0x15dc, 0x15eb, 0x15fd, 0x160c, 0x1636, - 0x1651, 0x1660, 0x167b, 0x1697, 0x16a6, 0x16b8, 0x16ca, 0x16d9, - 0x16f1, 0x1715, 0x172a, 0x1742, 0x1760, 0x177b, 0x1790, 0x17ba, - 0x17c3, 0x17e1, 0x181d, 0x1826, 0x1850, 0x1874, 0x189b, 0x18b3, - 0x18da, 0x190a, 0x1919, 0x191f, 0x1934, 0x1949, 0x1955, 0x1964, - 0x1994, 0x199d, 0x19b8, 0x19ca, 0x19f4, 0x1a21, 0x1a48, 0x1a57, - 0x1a72, 0x1a81, 0x1a90, 0x1aab, 0x1acc, 0x1ad8, 0x1aea, 0x1af9, - // Entry 140 - 17F - 0x1b0e, 0x1b1a, 0x1b2c, 0x1b3b, 0x1b56, 0x1b71, 0x1b86, 0x1b8f, - 0x1bb3, 0x1bcb, 0x1bd7, 0x1be6, 0x1bfe, 0x1c10, 0x1c22, 0x1c3d, - 0x1c73, 0x1c85, 0x1c9d, 0x1caf, 0x1cd4, 0x1cf0, 0x1cf9, 0x1d18, - 0x1d27, 0x1d39, 0x1d42, 0x1d51, 0x1d5a, 0x1d78, 0x1d8d, 0x1d9c, - 0x1db1, 0x1dde, 0x1df3, 0x1dff, 0x1e14, 0x1e20, 0x1e2f, 0x1e4d, - 0x1e5f, 0x1e80, 0x1e8c, 0x1ea4, 0x1ebc, 0x1eea, 0x1eff, 0x1f0e, - 0x1f1d, 0x1f45, 0x1f54, 0x1f6f, 0x1f87, 0x1f96, 0x1fab, 0x1fbd, - 0x1fcc, 0x1fe1, 0x1ff3, 0x2005, 0x2014, 0x2029, 0x2038, 0x2050, - // Entry 180 - 1BF - 0x2080, 0x2098, 0x20b0, 0x20c2, 0x20da, 0x20e9, 0x20f5, 0x2110, - 0x2122, 0x213e, 0x2153, 0x2162, 0x216b, 0x2177, 0x2189, 0x21a7, - 0x21b0, 0x21c2, 0x21ce, 0x21da, 0x21ec, 0x2204, 0x221c, 0x2228, - 0x2234, 0x2243, 0x2258, 0x2267, 0x2273, 0x228b, 0x22a6, 0x22cb, - 0x22d7, 0x22e9, 0x2307, 0x2316, 0x232b, 0x2340, 0x234c, 0x236d, - 0x237f, 0x2397, 0x23a3, 0x23b8, 0x23cd, 0x23e5, 0x23f1, 0x240c, - 0x242d, 0x244b, 0x245d, 0x2469, 0x24a5, 0x24b7, 0x24c6, 0x24d2, - 0x24ea, 0x24ff, 0x2511, 0x251d, 0x253b, 0x2550, 0x2562, 0x257d, - // Entry 1C0 - 1FF - 0x258f, 0x25b9, 0x25d4, 0x25ef, 0x2601, 0x2610, 0x2622, 0x2649, - 0x2664, 0x267c, 0x2691, 0x26b2, 0x26c1, 0x26d3, 0x26e5, 0x271e, - 0x2739, 0x2763, 0x2793, 0x27ab, 0x27c3, 0x27d5, 0x27ea, 0x2802, - 0x282c, 0x2838, 0x287a, 0x288f, 0x28a1, 0x28bc, 0x28d1, 0x28e9, - 0x28f8, 0x290a, 0x291f, 0x292e, 0x2946, 0x2967, 0x2970, 0x2985, - 0x2991, 0x29c1, 0x29d6, 0x29e5, 0x29fa, 0x2a15, 0x2a24, 0x2a33, - 0x2a45, 0x2a57, 0x2a8a, 0x2aab, 0x2abd, 0x2ac9, 0x2ad5, 0x2ae7, - 0x2b14, 0x2b32, 0x2b53, 0x2b6e, 0x2b80, 0x2b9c, 0x2bae, 0x2bdb, - // Entry 200 - 23F - 0x2bf3, 0x2c08, 0x2c20, 0x2c3e, 0x2c5c, 0x2c71, 0x2c83, 0x2c9b, - 0x2cad, 0x2cb9, 0x2cf8, 0x2d0a, 0x2d16, 0x2d25, 0x2d43, 0x2d76, - 0x2d88, 0x2da0, 0x2dac, 0x2dbb, 0x2dc7, 0x2dd9, 0x2de8, 0x2df7, - 0x2e00, 0x2e15, 0x2e2d, 0x2e42, 0x2e57, 0x2e66, 0x2e7b, 0x2e9c, - 0x2eb7, 0x2ec9, 0x2edb, 0x2ef3, 0x2f0b, 0x2f26, 0x2f3b, 0x2f4d, - 0x2f65, 0x2f71, 0x2fa7, 0x2fbf, 0x2fd4, 0x2fec, 0x2ff5, 0x2ffb, - 0x3010, 0x301f, 0x3046, 0x306e, 0x307d, 0x3089, 0x3098, 0x30b0, - 0x30c2, 0x30d4, 0x30e0, 0x3101, 0x3113, 0x312b, 0x3146, 0x3152, - // Entry 240 - 27F - 0x315e, 0x3167, 0x3179, 0x3188, 0x31a0, 0x31b8, 0x31cd, 0x31f1, - 0x3206, 0x3218, 0x325d, 0x3269, 0x3296, 0x32a2, 0x32e1, 0x32e1, - 0x3311, 0x333e, 0x3371, 0x3398, 0x33d4, 0x3401, 0x3434, 0x3452, - 0x3479, 0x3479, 0x34a6, 0x34cd, 0x34e8, 0x34fa, 0x3527, 0x3551, - 0x3566, 0x3597, 0x35bc, 0x35d7, 0x35f5, -} // Size: 1250 bytes - -const trLangStr string = "" + // Size: 5927 bytes - "AfarAbhazcaAvestçeAfrikaancaAkanAmharcaAragoncaArapçaAssamcaAvar DiliAym" + - "araAzericeBaşkırtçaBelarusçaBulgarcaBislamaBambaraBengalceTibetçeBretonc" + - "aBoşnakçaKatalancaÇeçenceÇamorro diliKorsikacaKriceÇekçeKilise SlavcasıÇ" + - "uvaşçaGalceDancaAlmancaDivehi diliDzongkhaEweYunancaİngilizceEsperantoİs" + - "panyolcaEstoncaBaskçaFarsçaFula diliFinceFiji DiliFaroe DiliFransızcaBat" + - "ı Frizcesiİrlandacaİskoç GaelcesiGaliçyacaGuarani diliGüceratçaManksHau" + - "sa diliİbraniceHintçeHiri MotuHırvatçaHaiti KreyoluMacarcaErmeniceHerero" + - " diliInterlinguaEndonezceInterlingueİbo diliSichuan YiİnyupikçeIdoİzland" + - "acaİtalyancaİnuit diliJaponcaCava DiliGürcüceKongo diliKikuyuKuanyamaKaz" + - "akçaGrönland diliKmerceKannada diliKoreceKanuri diliKeşmir diliKürtçeKom" + - "iKernevekçeKırgızcaLatinceLüksemburgcaGandaLimburgcaLingalaLao diliLitva" + - "ncaLuba-KatangaLetoncaMalgaşçaMarshall Adaları diliMaori diliMakedoncaMa" + - "layalam diliMoğolcaMarathiMalaycaMaltacaBurmacaNauru diliKuzey NdebeleNe" + - "palceNdongaFelemenkçeNorveççe NynorskNorveççe BokmålGüney NdebeleNavaho " + - "diliNyanjaOksitan diliOjibva diliOromo diliOriya DiliOsetçePencapçaPaliL" + - "ehçePeştucaPortekizceKeçuva diliRomanşçaKirundiRumenceRusçaKinyarwandaSa" + - "nskritSardunya diliSindhiKuzey LaponcasıSangoSeylancaSlovakçaSlovenceSam" + - "oa diliShonaSomaliceArnavutçaSırpçaSisvatiGüney Sotho diliSunda Diliİsve" + - "ççeSvahiliTamilceTelugu diliTacikçeTaycaTigrinyaTürkmenceSetsvanaTonga " + - "diliTürkçeTsongaTatarcaTahiti diliUygurcaUkraynacaUrducaÖzbekçeVenda dil" + - "iVietnamcaVolapükValoncaVolofçaZosa diliYidişYorubacaZhuangcaÇinceZuluca" + - "AçeceAcoliAdangmeAdigeceTunus ArapçasıAfrihiliAghemAyni DiliAkad DiliAla" + - "bamacaAleut diliGheg ArnavutçasıGüney AltaycaEski İngilizceAngikaAramice" + - "Mapuçe diliAraonaArapaho DiliCezayir ArapçasıArawak DiliFas ArapçasıMısı" + - "r ArapçasıAsuAmerikan İşaret DiliAsturyascaKotavaAwadhiBeluççaBali diliB" + - "avyera diliBasa DiliBamunBatak TobaGhomalaBeja diliBembaBetawiBenaBafutB" + - "adagaBatı BalochiArayaniceBikolBiniBanjar DiliKomKaraayak diliBishnupriy" + - "aBahtiyariBrajBrohiceBodoAkooseBuryatçaBugisBuluBlinMedumbaKado diliCari" + - "bKayuga diliAtsamSebuano diliKigacaÇibça diliÇağataycaChuukeseMari diliÇ" + - "inuk diliÇoktav diliÇipevya diliÇerokiceŞayenceOrta KürtçeKıpticeCapizno" + - "nKırım TürkçesiSeselwa Kreole FransızcasıKashubianDakotacaDarginceTaitaD" + - "elawareSlavey diliDogribDinka diliZarmaDogriAşağı SorbçaOrta KadazanDual" + - "aOrtaçağ FelemenkçesiJola-FonyiDyulaDazagaEmbuEfikEmilia DiliEski Mısır " + - "DiliEkajukElamOrtaçağ İngilizcesiMerkezi YupikçeEwondoEkstremadura DiliF" + - "angFilipinceTornedalin FincesiFonCajun FransızcasıOrtaçağ FransızcasıEsk" + - "i FransızcaArpitancaKuzey FrizceDoğu FrizcesiFriuli diliGa diliGagavuzca" + - "Gan ÇincesiGayo diliGbayaZerdüşt DaricesiGeezKiribaticeGilaniceOrtaçağ Y" + - "üksek AlmancasıEski Yüksek AlmancaGoa KonkanicesiGondi diliGorontalo di" + - "liGotçaGrebo diliAntik Yunancaİsviçre AlmancasıWayuu diliFrafraGusiiGuçi" + - "nceHaydacaHakka ÇincesiHawaii diliFiji HintçesiHiligaynon diliHititçeHmo" + - "ngYukarı SorbçaXiang ÇincesiHupacaIbanİbibio diliIlokoİnguşçaİngriya Dil" + - "iJamaika Patois DiliLojbanNgombaMachameYahudi FarsçasıYahudi ArapçasıYut" + - "land DiliKarakalpakçaKabiliyeceKaçin diliJjuKambaKawiKabardeyceKanembuTy" + - "apMakondeKabuverdianuKenyangKoroKaingangKhasi diliHotancaKoyra ChiiniÇit" + - "ral DiliKırmanççaKakoKalenjinKimbunduKomi-PermyakKonkani diliKosraeanKpe" + - "lle diliKaraçay-BalkarcaKrioKinaray-aKarelyacaKurukhShambalaBafiaKöln le" + - "hçesiKumukçaKutenai diliLadinoLangiLahndaLamba diliLezgiceLingua Franca " + - "NovaLigurcaLivoncaLakotacaLombardçaMongoLoziKuzey LuriLatgalianLuba-Lulu" + - "aLuisenoLundaLuoLushaiLuyiaEdebi ÇinceLazcaMadura DiliMafaMagahiMaithili" + - "MakasarMandingoMasaiMabaMokşa diliMandarMende diliMeruMorisyenOrtaçağ İr" + - "landacasıMakhuwa-MeettoMeta’MicmacMinangkabauMançurya diliManipuri diliM" + - "ohavk diliMossiOva ÇirmişçesiMundangBirden Fazla DilKrikçeMiranda diliMa" + - "rvariMentawaiMyeneErzyaMazenderancaMin Nan ÇincesiNapoliceNamaAşağı Alma" + - "ncaNevariNiasNiue diliAo NagaKwasioNgiemboonNogaycaEski Nors diliNovialN" + - "’KoKuzey Sotho diliNuerKlasik NevariNyamveziNyankoleNyoroNzima diliOsa" + - "geOsmanlı TürkçesiPangasinan diliPehlevi DiliPampangaPapiamentoPalau dil" + - "iPicard DiliNijerya Pidgin diliPensilvanya AlmancasıPlautdietschEski Far" + - "sçaPalatin AlmancasıFenike diliPiyemonteceKuzeybatı KafkasyaPohnpeianPru" + - "syacaEski ProvensalKiçeceChimborazo Highland QuichuaRajasthaniRapanui di" + - "liRarotonganRomanyolcaRif BerbericesiRomboRomancaRotumanRusinceRovianaUl" + - "ahçaRwaSandaveYakutçaSamarit AramcasıSamburuSasakSantaliSaurashtraNgamba" + - "ySanguSicilyacaİskoççaSassari SarducaGüney KürtçesiSeneca diliSenaSeriSe" + - "lkup diliKoyraboro SenniEski İrlandacaSamogitçeTaşelhitShan diliÇad Arap" + - "çasıSidamo diliAşağı SilezyacaSelayarGüney LaponcasıLule Laponcasıİnari" + - " LaponcasıSkolt LaponcasıSoninkeSogdiana DiliSranan TongoSerer diliSahoS" + - "aterland FrizcesiSukuma diliSusuSümerceKomorcaKlasik SüryaniceSüryaniceS" + - "ilezyacaTulucaTimneTesoTerenoTetumTigreTivTokelau diliSahurcaKlingoncaTl" + - "ingitTalışçaTamaşekNyasa TongaTok PisinTuroyoTarokoTsakoncaTsimshianTatç" + - "aTumbukaTuvalyancaTasawaqTuvacaOrta Atlas TamazigtiUdmurtçaUgarit diliUm" + - "bunduKökenVaiVenedikçeVeps diliBatı FlamancaMain Frankonya DiliVotçaVõro" + - "VunjoWalserValamoVarayVaşoWarlpiriWu ÇincesiKalmıkçaMegrelceSogaYaoYapça" + - "YangbenYembaNheengatuKantoncaZapotek diliBlis SembolleriZelandacaZenaga " + - "diliStandart Fas TamazigtiZuniceDilbilim içeriği yokZazacaModern Standar" + - "t ArapçaGüney AzericeAvusturya Almancasıİsviçre Yüksek AlmancasıAvustral" + - "ya İngilizcesiKanada İngilizcesiİngiliz İngilizcesiAmerikan İngilizcesiL" + - "atin Amerika İspanyolcasıAvrupa İspanyolcasıMeksika İspanyolcasıKanada F" + - "ransızcasıİsviçre FransızcasıAşağı SaksoncaFlamancaBrezilya Portekizcesi" + - "Avrupa PortekizcesiMoldovacaSırp-Hırvat DiliKongo SvahiliBasitleştirilmi" + - "ş ÇinceGeleneksel Çince" - -var trLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x000b, 0x0013, 0x001d, 0x0021, 0x0028, 0x0030, - 0x0037, 0x003e, 0x0047, 0x004d, 0x0054, 0x0060, 0x006a, 0x0072, - 0x0079, 0x0080, 0x0088, 0x0090, 0x0098, 0x00a2, 0x00ab, 0x00b4, - 0x00c1, 0x00ca, 0x00cf, 0x00d6, 0x00e6, 0x00f0, 0x00f5, 0x00fa, - 0x0101, 0x010c, 0x0114, 0x0117, 0x011e, 0x0128, 0x0131, 0x013c, - 0x0143, 0x014a, 0x0151, 0x015a, 0x015f, 0x0168, 0x0172, 0x017c, - 0x018a, 0x0194, 0x01a4, 0x01ae, 0x01ba, 0x01c5, 0x01ca, 0x01d4, - 0x01dd, 0x01e4, 0x01ed, 0x01f7, 0x0204, 0x020b, 0x0213, 0x021e, - // Entry 40 - 7F - 0x0229, 0x0232, 0x023d, 0x0246, 0x0250, 0x025b, 0x025e, 0x0268, - 0x0272, 0x027d, 0x0284, 0x028d, 0x0296, 0x02a0, 0x02a6, 0x02ae, - 0x02b6, 0x02c4, 0x02ca, 0x02d6, 0x02dc, 0x02e7, 0x02f3, 0x02fb, - 0x02ff, 0x030a, 0x0314, 0x031b, 0x0328, 0x032d, 0x0336, 0x033d, - 0x0345, 0x034d, 0x0359, 0x0360, 0x036a, 0x0380, 0x038a, 0x0393, - 0x03a1, 0x03a9, 0x03b0, 0x03b7, 0x03be, 0x03c5, 0x03cf, 0x03dc, - 0x03e3, 0x03e9, 0x03f4, 0x0406, 0x0418, 0x0426, 0x0431, 0x0437, - 0x0443, 0x044e, 0x0458, 0x0462, 0x0469, 0x0472, 0x0476, 0x047c, - // Entry 80 - BF - 0x0484, 0x048e, 0x049a, 0x04a4, 0x04ab, 0x04b2, 0x04b8, 0x04c3, - 0x04cb, 0x04d8, 0x04de, 0x04ee, 0x04f3, 0x04fb, 0x0504, 0x050c, - 0x0516, 0x051b, 0x0523, 0x052d, 0x0535, 0x053c, 0x054d, 0x0557, - 0x0561, 0x0568, 0x056f, 0x057a, 0x0582, 0x0587, 0x058f, 0x0599, - 0x05a1, 0x05ab, 0x05b3, 0x05b9, 0x05c0, 0x05cb, 0x05d2, 0x05db, - 0x05e1, 0x05ea, 0x05f4, 0x05fd, 0x0605, 0x060c, 0x0614, 0x061d, - 0x0623, 0x062b, 0x0633, 0x0639, 0x063f, 0x0645, 0x064a, 0x0651, - 0x0658, 0x0668, 0x0670, 0x0675, 0x067e, 0x0687, 0x0690, 0x069a, - // Entry C0 - FF - 0x06ac, 0x06ba, 0x06c9, 0x06cf, 0x06d6, 0x06e2, 0x06e8, 0x06f4, - 0x0706, 0x0706, 0x0711, 0x071f, 0x0731, 0x0734, 0x074a, 0x0754, - 0x075a, 0x0760, 0x0769, 0x0772, 0x077e, 0x0787, 0x078c, 0x0796, - 0x079d, 0x07a6, 0x07ab, 0x07b1, 0x07b5, 0x07ba, 0x07c0, 0x07cd, - 0x07d6, 0x07db, 0x07df, 0x07ea, 0x07ed, 0x07fa, 0x0805, 0x080e, - 0x0812, 0x0819, 0x081d, 0x0823, 0x082c, 0x0831, 0x0835, 0x0839, - 0x0840, 0x0849, 0x084e, 0x0859, 0x085e, 0x086a, 0x0870, 0x087c, - 0x0887, 0x088f, 0x0898, 0x08a3, 0x08af, 0x08bc, 0x08c5, 0x08cd, - // Entry 100 - 13F - 0x08da, 0x08e2, 0x08ea, 0x08fc, 0x0918, 0x0921, 0x0929, 0x0931, - 0x0936, 0x093e, 0x0949, 0x094f, 0x0959, 0x095e, 0x0963, 0x0973, - 0x097f, 0x0984, 0x099b, 0x09a5, 0x09aa, 0x09b0, 0x09b4, 0x09b8, - 0x09c3, 0x09d4, 0x09da, 0x09de, 0x09f4, 0x0a04, 0x0a0a, 0x0a1b, - 0x0a1f, 0x0a28, 0x0a3a, 0x0a3d, 0x0a50, 0x0a67, 0x0a76, 0x0a7f, - 0x0a8b, 0x0a99, 0x0aa4, 0x0aab, 0x0ab4, 0x0ac0, 0x0ac9, 0x0ace, - 0x0ae0, 0x0ae4, 0x0aee, 0x0af6, 0x0b12, 0x0b26, 0x0b35, 0x0b3f, - 0x0b4d, 0x0b53, 0x0b5d, 0x0b6a, 0x0b7e, 0x0b88, 0x0b8e, 0x0b93, - // Entry 140 - 17F - 0x0b9b, 0x0ba2, 0x0bb0, 0x0bbb, 0x0bc9, 0x0bd8, 0x0be0, 0x0be5, - 0x0bf4, 0x0c02, 0x0c08, 0x0c0c, 0x0c18, 0x0c1d, 0x0c27, 0x0c34, - 0x0c47, 0x0c4d, 0x0c53, 0x0c5a, 0x0c6b, 0x0c7c, 0x0c88, 0x0c95, - 0x0c9f, 0x0caa, 0x0cad, 0x0cb2, 0x0cb6, 0x0cc0, 0x0cc7, 0x0ccb, - 0x0cd2, 0x0cde, 0x0ce5, 0x0ce9, 0x0cf1, 0x0cfb, 0x0d02, 0x0d0e, - 0x0d1a, 0x0d26, 0x0d2a, 0x0d32, 0x0d3a, 0x0d46, 0x0d52, 0x0d5a, - 0x0d65, 0x0d76, 0x0d7a, 0x0d83, 0x0d8c, 0x0d92, 0x0d9a, 0x0d9f, - 0x0dad, 0x0db5, 0x0dc1, 0x0dc7, 0x0dcc, 0x0dd2, 0x0ddc, 0x0de3, - // Entry 180 - 1BF - 0x0df5, 0x0dfc, 0x0e03, 0x0e0b, 0x0e15, 0x0e1a, 0x0e1e, 0x0e28, - 0x0e31, 0x0e3b, 0x0e42, 0x0e47, 0x0e4a, 0x0e50, 0x0e55, 0x0e61, - 0x0e66, 0x0e71, 0x0e75, 0x0e7b, 0x0e83, 0x0e8a, 0x0e92, 0x0e97, - 0x0e9b, 0x0ea6, 0x0eac, 0x0eb6, 0x0eba, 0x0ec2, 0x0ed9, 0x0ee7, - 0x0eee, 0x0ef4, 0x0eff, 0x0f0d, 0x0f1a, 0x0f25, 0x0f2a, 0x0f3b, - 0x0f42, 0x0f52, 0x0f59, 0x0f65, 0x0f6c, 0x0f74, 0x0f79, 0x0f7e, - 0x0f8a, 0x0f9a, 0x0fa2, 0x0fa6, 0x0fb6, 0x0fbc, 0x0fc0, 0x0fc9, - 0x0fd0, 0x0fd6, 0x0fdf, 0x0fe6, 0x0ff4, 0x0ffa, 0x1000, 0x1010, - // Entry 1C0 - 1FF - 0x1014, 0x1021, 0x1029, 0x1031, 0x1036, 0x1040, 0x1045, 0x1058, - 0x1067, 0x1073, 0x107b, 0x1085, 0x108f, 0x109a, 0x10ad, 0x10c3, - 0x10cf, 0x10db, 0x10ed, 0x10f8, 0x1103, 0x1116, 0x111f, 0x1127, - 0x1135, 0x113c, 0x1157, 0x1161, 0x116d, 0x1177, 0x1181, 0x1190, - 0x1195, 0x119c, 0x11a3, 0x11aa, 0x11b1, 0x11b8, 0x11bb, 0x11c2, - 0x11ca, 0x11db, 0x11e2, 0x11e7, 0x11ee, 0x11f8, 0x11ff, 0x1204, - 0x120d, 0x1217, 0x1226, 0x1237, 0x1242, 0x1246, 0x124a, 0x1255, - 0x1264, 0x1273, 0x127d, 0x1286, 0x128f, 0x129e, 0x12a9, 0x12bb, - // Entry 200 - 23F - 0x12c2, 0x12d3, 0x12e2, 0x12f3, 0x1303, 0x130a, 0x1317, 0x1323, - 0x132d, 0x1331, 0x1343, 0x134e, 0x1352, 0x135a, 0x1361, 0x1372, - 0x137c, 0x1385, 0x138b, 0x1390, 0x1394, 0x139a, 0x139f, 0x13a4, - 0x13a7, 0x13b3, 0x13ba, 0x13c3, 0x13ca, 0x13d4, 0x13dc, 0x13e7, - 0x13f0, 0x13f6, 0x13fc, 0x1404, 0x140d, 0x1413, 0x141a, 0x1424, - 0x142b, 0x1431, 0x1445, 0x144e, 0x1459, 0x1460, 0x1466, 0x1469, - 0x1473, 0x147c, 0x148a, 0x149d, 0x14a3, 0x14a8, 0x14ad, 0x14b3, - 0x14b9, 0x14be, 0x14c3, 0x14cb, 0x14d6, 0x14e0, 0x14e8, 0x14ec, - // Entry 240 - 27F - 0x14ef, 0x14f5, 0x14fc, 0x1501, 0x150a, 0x1512, 0x151e, 0x152d, - 0x1536, 0x1541, 0x1557, 0x155d, 0x1573, 0x1579, 0x1590, 0x159e, - 0x15b2, 0x15ce, 0x15e5, 0x15f8, 0x160d, 0x1622, 0x163e, 0x1653, - 0x1669, 0x1669, 0x167d, 0x1694, 0x16a5, 0x16ad, 0x16c2, 0x16d5, - 0x16de, 0x16f0, 0x16fd, 0x1716, 0x1727, -} // Size: 1250 bytes - -const ukLangStr string = "" + // Size: 9189 bytes - "афарськаабхазькаавестійськаафрикаансаканамхарськаарагонськаарабськаассам" + - "ськааварськааймараазербайджанськабашкирськабілоруськаболгарськабісламаб" + - "амбарабенгальськатибетськабретонськабоснійськакаталонськачеченськачамор" + - "рокорсиканськакрічеськацерковнословʼянськачуваськаваллійськаданськаніме" + - "цькадівехідзонг-кеевегрецькаанглійськаесперантоіспанськаестонськабасксь" + - "каперськафулафінськафіджіфарерськафранцузьказахіднофризькаірландськагае" + - "льськагалісійськагуаранігуджаратіменкськахаусаівритгіндіхірі-мотухорват" + - "ськагаїтянськаугорськавірменськагерероінтерлінгваіндонезійськаінтерлінг" + - "веігбосичуаньінупіакідоісландськаіталійськаінуктітутяпонськаяванськагру" + - "зинськаконґолезькакікуйюкунамаказахськакалааллісуткхмерськаканнадакорей" + - "ськаканурікашмірськакурдськакомікорнійськакиргизькалатинськалюксембурзь" + - "кагандалімбургійськалінгалалаоськалитовськалуба-катангалатвійськамалага" + - "сійськамаршалльськамаорімакедонськамалаяламмонгольськамаратхімалайськам" + - "альтійськабірманськанаурундебелє північнанепальськандонгаголландськанюн" + - "ошк (Норвегія)букмол (Норвегія)ндебелє південнанавахоньянджаокитаноджіб" + - "ваоромооріяосетинськапанджабіпаліпольськапуштупортугальськакечуаретором" + - "анськарундірумунськаросійськакіньяруандасанскритсардинськасіндхісаамськ" + - "а північнасангосингальськасловацькасловенськасамоанськашонасомаліалбанс" + - "ькасербськасісватісото південнасунданськашведськасуахілітамільськателуг" + - "утаджицькатайськатигриньятуркменськатсванатонганськатурецькатсонгататар" + - "ськатаїтянськауйгурськаукраїнськаурдуузбецькавендавʼєтнамськаволапʼюква" + - "ллонськаволофкхосаідишйорубачжуанкитайськазулуськаачехськаачоліадангмеа" + - "дигейськаафрихіліагемайнськааккадськаалабамаалеутськапівденноалтайськад" + - "авньоанглійськаангікаарамейськаарауканськаараонаарапахоалжирська арабсь" + - "кааравакськаасуамериканська мова рухівастурськаавадхібалучібалійськабае" + - "рішбасабамумбатак тобагомалабеджабембабетавібенабафутбадагасхіднобелудж" + - "ійськабходжпурібікольськабінібанджарськакомсіксікабахтіарібраджбодоакус" + - "бурятськабугійськабулублінмедумбакаддокарібськакайюгаатсамсебуанськакіг" + - "ачібчачагатайськачуукськамарійськачинук жаргончокточіпевʼянчерокічейєнн" + - "курдська (сорані)коптськакримськотатарськасейшельська креольськакашубсь" + - "кадакотадаргінськатаітаделаварськаслейвдогрибськадінкаджермадогрінижньо" + - "лужицькадуаласередньонідерландськадьола-фонідіуладазагаембуефікдавньоєг" + - "ипетськаекаджукеламськасередньоанглійськаевондофангфіліппінськафонсеред" + - "ньофранцузькадавньофранцузькаарпітанськафризька північнафризька східнаф" + - "ріульськагагагаузькагайогбайягєезгільбертськасередньоверхньонімецькадав" + - "ньоверхньонімецькагондігоронталоготськагребодавньогрецьканімецька (Швей" + - "царія)гусіїкучінхайдагавайськахілігайнонхітітіхмонгверхньолужицькахупаі" + - "банськаібібіоілоканськаінгуськаложбаннгомбамачамеюдео-перськаюдео-арабс" + - "ькакаракалпацькакабільськакачінйюкамбакавікабардинськаканембутіапмаконд" + - "екабувердіанукорокхасіхотаносакськакойра чіїнікакокаленджинкімбундукомі" + - "-перм’яцькаконканікосраекпеллєкарачаєво-балкарськакарельськакурукхшамбал" + - "абафіаколоніанкумицькакутенаїладінолангіландаламбалезгінськалакотамонго" + - "лозіпівнічна лурськалуба-лулуалуїсеньолундалуомізолуйямадурськамафамага" + - "дхімайтхілімакасарськамандінгомасаїмабамокшамандарськамендемерумаврикій" + - "ська креольськасередньоірландськамакува-меетометамікмакмінангкабауманчж" + - "урськаманіпурімагавкмоссімундангкілька мовкрікмірандськамарварімиінерзя" + - "мазандеранськанеаполітанськанаманижньонімецьканеварініаськаніуеао нагак" + - "вазіонгємбунногайськадавньонорвезьканкосото північнануерневарі класична" + - "ньямвезіньянколеньоронзімаосейджосманськапангасінанськапехлевіпампангап" + - "апʼяментопалауанськанігерійсько-креольськадавньоперськафінікійсько-пуні" + - "чнапонапепруськадавньопровансальськакічераджастханірапануїраротонгаромб" + - "оциганськаарумунськарвасандавеякутськасамаритянська арамейськасамбуруса" + - "сакськасантальськангамбайсангусицилійськашотландськапівденнокурдськасен" + - "екасенаселькупськакойраборо сенідавньоірландськатачелітшанськачадійська" + - " арабськасідамопівденносаамськасаамська лулесаамська інарісаамська сколь" + - "тсонінкесогдійськасранан тонгосерерсахосукумасусушумерськакоморськасирі" + - "йська класичнасирійськатемнетесотеренотетумтигретівтокелауклінгонтлінгі" + - "ттамашекньяса тонгаток-пісінтарокоцимшиантумбукатувалутасавактувинськац" + - "ентральномароканська тамазітудмуртськаугаритськаумбундукоріньваїводська" + - "вуньовалзерськаваламоварайвашовалпірікалмицькасогаяояпянгбенємбакантонс" + - "ькасапотекськаблісса мовазенагастандартна марокканська берберськазуньїн" + - "емає мовного вмістузазакісучасна стандартна арабськапівденноазербайджан" + - "ськаверхньонімецька (Швейцарія)британська англійськаамериканська англій" + - "ськаіспанська (Європа)нижньосаксонськафламандськапортугальська (Європа)" + - "молдавськасербсько-хорватськаконгійське суахілікитайська спрощенакитайс" + - "ька традиційна" - -var ukLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0020, 0x0036, 0x0048, 0x0050, 0x0062, 0x0076, - 0x0086, 0x0098, 0x00a8, 0x00b4, 0x00d2, 0x00e6, 0x00fa, 0x010e, - 0x011c, 0x012a, 0x0140, 0x0152, 0x0166, 0x017a, 0x0190, 0x01a2, - 0x01b0, 0x01c8, 0x01ce, 0x01da, 0x0200, 0x0210, 0x0224, 0x0232, - 0x0242, 0x024e, 0x025d, 0x0263, 0x0271, 0x0285, 0x0297, 0x02a9, - 0x02bb, 0x02cb, 0x02d9, 0x02e1, 0x02ef, 0x02f9, 0x030b, 0x031f, - 0x033b, 0x034f, 0x0361, 0x0377, 0x0385, 0x0397, 0x03a7, 0x03b1, - 0x03bb, 0x03c5, 0x03d6, 0x03ea, 0x03fe, 0x040e, 0x0422, 0x042e, - // Entry 40 - 7F - 0x0444, 0x045e, 0x0474, 0x047c, 0x048a, 0x0498, 0x049e, 0x04b2, - 0x04c6, 0x04d8, 0x04e8, 0x04f8, 0x050c, 0x0522, 0x052e, 0x053a, - 0x054c, 0x0562, 0x0574, 0x0582, 0x0594, 0x05a0, 0x05b4, 0x05c4, - 0x05cc, 0x05e0, 0x05f2, 0x0604, 0x061e, 0x0628, 0x0642, 0x0650, - 0x065e, 0x0670, 0x0687, 0x069b, 0x06b5, 0x06cd, 0x06d7, 0x06ed, - 0x06fd, 0x0713, 0x0721, 0x0733, 0x0749, 0x075d, 0x0767, 0x0786, - 0x079a, 0x07a6, 0x07bc, 0x07db, 0x07fa, 0x0819, 0x0825, 0x0833, - 0x083f, 0x084d, 0x0857, 0x085f, 0x0873, 0x0883, 0x088b, 0x089b, - // Entry 80 - BF - 0x08a5, 0x08bf, 0x08c9, 0x08e3, 0x08ed, 0x08ff, 0x0911, 0x0927, - 0x0937, 0x094b, 0x0957, 0x0978, 0x0982, 0x0998, 0x09aa, 0x09be, - 0x09d2, 0x09da, 0x09e6, 0x09f8, 0x0a08, 0x0a16, 0x0a2f, 0x0a43, - 0x0a53, 0x0a61, 0x0a75, 0x0a81, 0x0a93, 0x0aa1, 0x0ab1, 0x0ac7, - 0x0ad3, 0x0ae7, 0x0af7, 0x0b03, 0x0b15, 0x0b29, 0x0b3b, 0x0b4f, - 0x0b57, 0x0b67, 0x0b71, 0x0b87, 0x0b97, 0x0bab, 0x0bb5, 0x0bbf, - 0x0bc7, 0x0bd3, 0x0bdd, 0x0bef, 0x0bff, 0x0c0f, 0x0c19, 0x0c27, - 0x0c3b, 0x0c3b, 0x0c4b, 0x0c53, 0x0c61, 0x0c73, 0x0c81, 0x0c93, - // Entry C0 - FF - 0x0c93, 0x0cb5, 0x0cd5, 0x0ce1, 0x0cf5, 0x0d0b, 0x0d17, 0x0d25, - 0x0d48, 0x0d48, 0x0d5c, 0x0d5c, 0x0d5c, 0x0d62, 0x0d8e, 0x0da0, - 0x0da0, 0x0dac, 0x0db8, 0x0dca, 0x0dd6, 0x0dde, 0x0de8, 0x0dfb, - 0x0e07, 0x0e11, 0x0e1b, 0x0e27, 0x0e2f, 0x0e39, 0x0e45, 0x0e69, - 0x0e7b, 0x0e8f, 0x0e97, 0x0ead, 0x0eb3, 0x0ec1, 0x0ec1, 0x0ed1, - 0x0edb, 0x0edb, 0x0ee3, 0x0eeb, 0x0efd, 0x0f0f, 0x0f17, 0x0f1f, - 0x0f2d, 0x0f37, 0x0f49, 0x0f55, 0x0f5f, 0x0f73, 0x0f7b, 0x0f85, - 0x0f9b, 0x0fab, 0x0fbd, 0x0fd4, 0x0fde, 0x0fee, 0x0ffa, 0x1006, - // Entry 100 - 13F - 0x1025, 0x1035, 0x1035, 0x1057, 0x1082, 0x1094, 0x10a0, 0x10b4, - 0x10be, 0x10d4, 0x10de, 0x10f2, 0x10fc, 0x1108, 0x1112, 0x112e, - 0x112e, 0x1138, 0x1162, 0x1175, 0x117f, 0x118b, 0x1193, 0x119b, - 0x119b, 0x11bb, 0x11c9, 0x11d9, 0x11fd, 0x11fd, 0x1209, 0x1209, - 0x1211, 0x1229, 0x1229, 0x122f, 0x122f, 0x1253, 0x1273, 0x1289, - 0x12a8, 0x12c3, 0x12d7, 0x12db, 0x12ed, 0x12ed, 0x12f5, 0x12ff, - 0x12ff, 0x1307, 0x131f, 0x131f, 0x134d, 0x1377, 0x1377, 0x1381, - 0x1393, 0x13a1, 0x13ab, 0x13c5, 0x13ea, 0x13ea, 0x13ea, 0x13f4, - // Entry 140 - 17F - 0x13fe, 0x1408, 0x1408, 0x141a, 0x141a, 0x142e, 0x143a, 0x1444, - 0x1462, 0x1462, 0x146a, 0x147a, 0x1486, 0x149a, 0x14aa, 0x14aa, - 0x14aa, 0x14b6, 0x14c2, 0x14ce, 0x14e5, 0x14fe, 0x14fe, 0x1518, - 0x152c, 0x1536, 0x153a, 0x1544, 0x154c, 0x1564, 0x1572, 0x157a, - 0x1588, 0x15a0, 0x15a0, 0x15a8, 0x15a8, 0x15b2, 0x15cc, 0x15e1, - 0x15e1, 0x15e1, 0x15e9, 0x15fb, 0x160b, 0x1629, 0x1637, 0x1643, - 0x164f, 0x1676, 0x1676, 0x1676, 0x168a, 0x1696, 0x16a4, 0x16ae, - 0x16be, 0x16ce, 0x16dc, 0x16e8, 0x16f2, 0x16fc, 0x1706, 0x171a, - // Entry 180 - 1BF - 0x171a, 0x171a, 0x171a, 0x1726, 0x1726, 0x1730, 0x1738, 0x1757, - 0x1757, 0x176a, 0x177a, 0x1784, 0x178a, 0x1792, 0x179a, 0x179a, - 0x179a, 0x17ac, 0x17b4, 0x17c2, 0x17d2, 0x17e8, 0x17f8, 0x1802, - 0x180a, 0x1814, 0x1828, 0x1832, 0x183a, 0x1867, 0x188b, 0x18a2, - 0x18aa, 0x18b6, 0x18cc, 0x18e2, 0x18f2, 0x18fe, 0x1908, 0x1908, - 0x1916, 0x1929, 0x1931, 0x1945, 0x1953, 0x1953, 0x195b, 0x1963, - 0x197f, 0x197f, 0x199b, 0x19a3, 0x19bf, 0x19cb, 0x19d9, 0x19e1, - 0x19ee, 0x19fa, 0x1a08, 0x1a1a, 0x1a38, 0x1a38, 0x1a3e, 0x1a57, - // Entry 1C0 - 1FF - 0x1a5f, 0x1a7c, 0x1a8c, 0x1a9c, 0x1aa6, 0x1ab0, 0x1abc, 0x1ace, - 0x1aea, 0x1af8, 0x1b08, 0x1b1c, 0x1b32, 0x1b32, 0x1b5d, 0x1b5d, - 0x1b5d, 0x1b77, 0x1b77, 0x1b9c, 0x1b9c, 0x1b9c, 0x1ba8, 0x1bb6, - 0x1bde, 0x1be6, 0x1be6, 0x1bfc, 0x1c0a, 0x1c1c, 0x1c1c, 0x1c1c, - 0x1c26, 0x1c38, 0x1c38, 0x1c38, 0x1c38, 0x1c4c, 0x1c52, 0x1c60, - 0x1c70, 0x1c9f, 0x1cad, 0x1cbf, 0x1cd5, 0x1cd5, 0x1ce3, 0x1ced, - 0x1d03, 0x1d19, 0x1d19, 0x1d39, 0x1d45, 0x1d4d, 0x1d4d, 0x1d63, - 0x1d7e, 0x1d9e, 0x1d9e, 0x1dac, 0x1dba, 0x1ddd, 0x1de9, 0x1de9, - // Entry 200 - 23F - 0x1de9, 0x1e09, 0x1e22, 0x1e3d, 0x1e5a, 0x1e68, 0x1e7c, 0x1e93, - 0x1e9d, 0x1ea5, 0x1ea5, 0x1eb1, 0x1eb9, 0x1ecb, 0x1edd, 0x1f00, - 0x1f12, 0x1f12, 0x1f12, 0x1f1c, 0x1f24, 0x1f30, 0x1f3a, 0x1f44, - 0x1f4a, 0x1f58, 0x1f58, 0x1f66, 0x1f74, 0x1f74, 0x1f82, 0x1f97, - 0x1fa8, 0x1fa8, 0x1fb4, 0x1fb4, 0x1fc2, 0x1fc2, 0x1fd0, 0x1fdc, - 0x1fea, 0x1ffc, 0x2035, 0x2049, 0x205d, 0x206b, 0x2077, 0x207d, - 0x207d, 0x207d, 0x207d, 0x207d, 0x208b, 0x208b, 0x2095, 0x20a9, - 0x20b5, 0x20bf, 0x20c7, 0x20d5, 0x20d5, 0x20e7, 0x20e7, 0x20ef, - // Entry 240 - 27F - 0x20f3, 0x20f7, 0x2103, 0x210b, 0x210b, 0x211f, 0x2135, 0x214a, - 0x214a, 0x2156, 0x2198, 0x21a2, 0x21c8, 0x21d4, 0x2208, 0x2236, - 0x2236, 0x2269, 0x2269, 0x2269, 0x2292, 0x22bf, 0x22bf, 0x22e0, - 0x22e0, 0x22e0, 0x22e0, 0x22e0, 0x2300, 0x2316, 0x2316, 0x233f, - 0x2353, 0x2378, 0x239b, 0x23be, 0x23e5, -} // Size: 1250 bytes - -const urLangStr string = "" + // Size: 5313 bytes - "افارابقازیانایفریکانزاکانامہاریاراگونیزعربیآسامیاواریایماراآذربائیجانیبا" + - "شکیربیلاروسیبلغاریبسلامابمبارابنگالیتبتیبریٹنبوسنیکیٹالانچیچنکموروکوراس" + - "یکنچیکچرچ سلاؤچوواشویلشڈینشجرمنڈیویہیژونگکھاایویونانیانگریزیایسپرانٹوہس" + - "پانویاسٹونینباسکیفارسیفولہفینیشفجیفیروئیزفرانسیسیمغربی فریسیئنآئیرِشسکا" + - "ٹ گیلِکگالیشیائیگُارانیگجراتیمینکسہؤساعبرانیہندیکراتیہیتیہنگیرینارمینیہ" + - "ریروبین لسانیاتانڈونیثیائیاِگبوسچوان ایایڈوآئس لینڈکاطالویاینُکٹیٹٹجاپا" + - "نیجاویجارجیکانگوکیکویوکونیاماقزاخكالاليستخمیرکنّاڈاکوریائیکانوریکشمیریک" + - "ردشکومیکورنشکرغیزیلاطینیلکسمبرگیشگینڈالیمبرگشلِنگَلالاؤلیتھوینینلبا-كات" + - "انجالیٹوینملاگاسیمارشلیزماؤریمقدونیائیمالایالممنگولینمراٹهیمالےمالٹیبرم" + - "یناؤروشمالی دبیلنیپالینڈونگاڈچنورویجینی نینورسکنارویجین بوکملجنوبی نڈیب" + - "یلینواجونیانجاآكسیٹاناورومواڑیہاوسیٹکپنجابیپولشپشتوپُرتگالیکویچوآرومانش" + - "رونڈیرومینینروسیکینیاروانڈاسنسکرتسردینینسندھیشمالی سامیساںغوسنہالاسلووا" + - "کسلووینیائیساموآنشوناصومالیالبانیسربینسواتیجنوبی سوتھوسنڈانیزسویڈشسواحل" + - "یتملتیلگوتاجکتھائیٹگرینیاترکمانسواناٹونگنترکیزونگاتاتارتاہیتییوئگہریوکر" + - "ینیائیاردوازبیکوینڈاویتنامیوولاپوکوالونوولوفژوسایدشیوروباچینیزولواچائین" + - "یزاکولیادانگمےادیگھےاغماینوالیوتجنوبی الٹائیانگیکاماپوچےاراپاہوآسواسٹور" + - "یائیاوادھیبالینیزباسابیمبابینامغربی بلوچیبھوجپوریبینیسکسیکابوڈوبگینیزبل" + - "ینسیبوآنوچیگاچوکیزماریچاکٹاؤچیروکیچینّےسورانی کردشڈاکوٹادرگواتائتادوگری" + - "بزرماذیلی سربیائیدوالاجولا فونيادزاگاامبوایفِکایکاجویایوانڈوفلیپینوفونف" + - "ریولیائیگاغاغاوزganگیزگلبرتیزگورانٹالوسوئس جرمنگسیگوئچ انhakہوائیحلی گی" + - "ننہمانگاپر سربیائیhsnہیوپاایبانابی بیوایلوکوانگوشلوجباننگومباماشیمقبائل" + - "یکاچنجے جوکامباکبارڈینتیاپماكوندهكابويرديانوکوروکھاسیكويرا شينيکاکوكالي" + - "نجينکیمبونڈوکومی پرمیاککونکنیکیپیلّےکراچے بالکرکیرلینکوروکھشامبالابافيا" + - "کولوگنیائیکومیکلیڈینولانگیلیزگیانلاکوٹالوزیشمالی لریلیوبا لولوآلونڈالوم" + - "یزولویامدورسیمگاہیمیتھیلیمکاسرماسایموکشامیندےمیروموریسیینماخاوا-ميتومیٹ" + - "امکمیکمنانگکباؤمنی پوریموہاکموسیمنڈانگمتعدد زبانیںکریکمیرانڈیزارزیامزند" + - "رانیnanنیاپولیٹنناماادنی جرمننیوارینیاسنیویائیكوايسونگیمبوننوگائیاینکوش" + - "مالی سوتھونویرنینکولپنگاسنانپامپنگاپاپیامینٹوپالاوننائجیریائی پڈگنپارسی" + - "كيشیرپانویراروتونگانرومبوارومانیرواسنڈاوےساکھاسامبوروسنتالینگامبےسانگوس" + - "یسیلینسکاٹجنوبی کردسیناكويرابورو سينیتشلحيتشانجنوبی سامیلول سامیاناری س" + - "امیسکولٹ سامیسوننکےسرانن ٹونگوساہوسکوماکوموریائیسریانیٹمنےتیسوٹیٹمٹگرےک" + - "لنگنٹوک پِسِنٹوروکوٹمبوکاتووالوتاساواقتووینینسینٹرل ایٹلس ٹمازائٹادمورت" + - "اومبوندوروٹوائیونجووالسروولایتاوارےوارلپیریwuuکالمیکسوگایانگبینیمباکینٹ" + - "ونیزاسٹینڈرڈ مراقشی تمازیقیزونیکوئی لسانی مواد نہیںزازاماڈرن اسٹینڈرڈ ع" + - "ربیآزربائیجانی (عربی)آسٹریائی جرمنسوئس ہائی جرمنآسٹریلیائی انگریزیکینیڈ" + - "ین انگریزیبرطانوی انگریزیامریکی انگریزیلاطینی امریکی ہسپانوییورپی ہسپان" + - "ویمیکسیکن ہسپانویکینیڈین فرانسیسیسوئس فرینچادنی سیکسنفلیمِشبرازیلی پرتگ" + - "الییورپی پرتگالیمالدوواسربو-کروئیشینکانگو سواحلیچینی (آسان کردہ)روایتی " + - "چینی" - -var urLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0008, 0x0018, 0x0018, 0x002a, 0x0032, 0x003e, 0x004e, - 0x0056, 0x0060, 0x006a, 0x0076, 0x008c, 0x0098, 0x00a8, 0x00b4, - 0x00c0, 0x00cc, 0x00d8, 0x00e0, 0x00ea, 0x00f4, 0x0102, 0x010a, - 0x0114, 0x0124, 0x0124, 0x012a, 0x0139, 0x0143, 0x014b, 0x0153, - 0x015b, 0x0167, 0x0175, 0x017b, 0x0187, 0x0195, 0x01a7, 0x01b5, - 0x01c3, 0x01cd, 0x01d7, 0x01df, 0x01e9, 0x01ef, 0x01fd, 0x020d, - 0x0226, 0x0232, 0x0245, 0x0257, 0x0265, 0x0271, 0x027b, 0x0283, - 0x028f, 0x0297, 0x0297, 0x02a1, 0x02a9, 0x02b7, 0x02c3, 0x02cd, - // Entry 40 - 7F - 0x02e2, 0x02f8, 0x02f8, 0x0302, 0x0311, 0x0311, 0x0319, 0x032a, - 0x0336, 0x0348, 0x0354, 0x035c, 0x0366, 0x0370, 0x037c, 0x038a, - 0x0392, 0x03a2, 0x03aa, 0x03b6, 0x03c4, 0x03d0, 0x03dc, 0x03e4, - 0x03ec, 0x03f6, 0x0402, 0x040e, 0x0420, 0x042a, 0x0438, 0x0446, - 0x044c, 0x045e, 0x0473, 0x047f, 0x048d, 0x049b, 0x04a5, 0x04b7, - 0x04c7, 0x04d5, 0x04e1, 0x04e9, 0x04f3, 0x04fb, 0x0505, 0x0518, - 0x0524, 0x0530, 0x0534, 0x0555, 0x0570, 0x0589, 0x0593, 0x059f, - 0x05ad, 0x05ad, 0x05b9, 0x05c1, 0x05cd, 0x05d9, 0x05d9, 0x05e1, - // Entry 80 - BF - 0x05e9, 0x05f9, 0x0605, 0x0611, 0x061b, 0x0629, 0x0631, 0x0647, - 0x0653, 0x0661, 0x066b, 0x067e, 0x0688, 0x0694, 0x06a0, 0x06b4, - 0x06c0, 0x06c8, 0x06d4, 0x06e0, 0x06ea, 0x06f4, 0x0709, 0x0717, - 0x0721, 0x072d, 0x0733, 0x073d, 0x0745, 0x074f, 0x075d, 0x0769, - 0x0773, 0x077d, 0x0785, 0x078f, 0x0799, 0x07a5, 0x07b1, 0x07c5, - 0x07cd, 0x07d7, 0x07e1, 0x07ef, 0x07fd, 0x0807, 0x0811, 0x0819, - 0x081f, 0x082b, 0x082b, 0x0833, 0x083b, 0x084b, 0x0855, 0x0863, - 0x086f, 0x086f, 0x086f, 0x0875, 0x087d, 0x087d, 0x087d, 0x0887, - // Entry C0 - FF - 0x0887, 0x089e, 0x089e, 0x08aa, 0x08aa, 0x08b6, 0x08b6, 0x08c4, - 0x08c4, 0x08c4, 0x08c4, 0x08c4, 0x08c4, 0x08ca, 0x08ca, 0x08dc, - 0x08dc, 0x08e8, 0x08e8, 0x08f6, 0x08f6, 0x08fe, 0x08fe, 0x08fe, - 0x08fe, 0x08fe, 0x0908, 0x0908, 0x0910, 0x0910, 0x0910, 0x0925, - 0x0935, 0x0935, 0x093d, 0x093d, 0x093d, 0x0949, 0x0949, 0x0949, - 0x0949, 0x0949, 0x0951, 0x0951, 0x0951, 0x095d, 0x095d, 0x0965, - 0x0965, 0x0965, 0x0965, 0x0965, 0x0965, 0x0973, 0x097b, 0x097b, - 0x097b, 0x0985, 0x098d, 0x098d, 0x0999, 0x0999, 0x09a5, 0x09af, - // Entry 100 - 13F - 0x09c4, 0x09c4, 0x09c4, 0x09c4, 0x09c4, 0x09c4, 0x09d0, 0x09da, - 0x09e4, 0x09e4, 0x09e4, 0x09f0, 0x09f0, 0x09f8, 0x09f8, 0x0a0f, - 0x0a0f, 0x0a19, 0x0a19, 0x0a2c, 0x0a2c, 0x0a36, 0x0a3e, 0x0a48, - 0x0a48, 0x0a48, 0x0a56, 0x0a56, 0x0a56, 0x0a56, 0x0a64, 0x0a64, - 0x0a64, 0x0a72, 0x0a72, 0x0a78, 0x0a78, 0x0a78, 0x0a78, 0x0a78, - 0x0a78, 0x0a78, 0x0a8a, 0x0a8e, 0x0a9a, 0x0a9d, 0x0a9d, 0x0a9d, - 0x0a9d, 0x0aa3, 0x0ab1, 0x0ab1, 0x0ab1, 0x0ab1, 0x0ab1, 0x0ab1, - 0x0ac3, 0x0ac3, 0x0ac3, 0x0ac3, 0x0ad4, 0x0ad4, 0x0ad4, 0x0ada, - // Entry 140 - 17F - 0x0ae7, 0x0ae7, 0x0aea, 0x0af4, 0x0af4, 0x0b03, 0x0b03, 0x0b0d, - 0x0b22, 0x0b25, 0x0b2f, 0x0b39, 0x0b46, 0x0b52, 0x0b5c, 0x0b5c, - 0x0b5c, 0x0b68, 0x0b74, 0x0b7e, 0x0b7e, 0x0b7e, 0x0b7e, 0x0b7e, - 0x0b8a, 0x0b92, 0x0b9b, 0x0ba5, 0x0ba5, 0x0bb3, 0x0bb3, 0x0bbb, - 0x0bc9, 0x0bdf, 0x0bdf, 0x0be7, 0x0be7, 0x0bf1, 0x0bf1, 0x0c04, - 0x0c04, 0x0c04, 0x0c0c, 0x0c1c, 0x0c2c, 0x0c41, 0x0c4d, 0x0c4d, - 0x0c5b, 0x0c70, 0x0c70, 0x0c70, 0x0c7c, 0x0c88, 0x0c96, 0x0ca0, - 0x0cb4, 0x0cbe, 0x0cbe, 0x0cca, 0x0cd4, 0x0cd4, 0x0cd4, 0x0ce2, - // Entry 180 - 1BF - 0x0ce2, 0x0ce2, 0x0ce2, 0x0cee, 0x0cee, 0x0cee, 0x0cf6, 0x0d07, - 0x0d07, 0x0d1c, 0x0d1c, 0x0d26, 0x0d2a, 0x0d32, 0x0d3a, 0x0d3a, - 0x0d3a, 0x0d46, 0x0d46, 0x0d50, 0x0d5e, 0x0d68, 0x0d68, 0x0d72, - 0x0d72, 0x0d7c, 0x0d7c, 0x0d86, 0x0d8e, 0x0d9e, 0x0d9e, 0x0db3, - 0x0dbb, 0x0dc5, 0x0dd7, 0x0dd7, 0x0de6, 0x0df0, 0x0df8, 0x0df8, - 0x0e04, 0x0e1b, 0x0e23, 0x0e33, 0x0e33, 0x0e33, 0x0e33, 0x0e3d, - 0x0e4d, 0x0e50, 0x0e62, 0x0e6a, 0x0e7b, 0x0e87, 0x0e8f, 0x0e9d, - 0x0e9d, 0x0ea9, 0x0eb7, 0x0ec3, 0x0ec3, 0x0ec3, 0x0ecd, 0x0ee2, - // Entry 1C0 - 1FF - 0x0eea, 0x0eea, 0x0eea, 0x0ef6, 0x0ef6, 0x0ef6, 0x0ef6, 0x0ef6, - 0x0f06, 0x0f06, 0x0f14, 0x0f28, 0x0f34, 0x0f34, 0x0f51, 0x0f51, - 0x0f51, 0x0f51, 0x0f51, 0x0f51, 0x0f51, 0x0f51, 0x0f51, 0x0f5b, - 0x0f5b, 0x0f63, 0x0f63, 0x0f63, 0x0f6f, 0x0f83, 0x0f83, 0x0f83, - 0x0f8d, 0x0f8d, 0x0f8d, 0x0f8d, 0x0f8d, 0x0f9b, 0x0fa1, 0x0fad, - 0x0fb7, 0x0fb7, 0x0fc5, 0x0fc5, 0x0fd1, 0x0fd1, 0x0fdd, 0x0fe7, - 0x0ff5, 0x0ffd, 0x0ffd, 0x100e, 0x100e, 0x1016, 0x1016, 0x1016, - 0x1031, 0x1031, 0x1031, 0x103d, 0x1043, 0x1043, 0x1043, 0x1043, - // Entry 200 - 23F - 0x1043, 0x1056, 0x1065, 0x1078, 0x108b, 0x1097, 0x1097, 0x10ac, - 0x10ac, 0x10b4, 0x10b4, 0x10be, 0x10be, 0x10be, 0x10d0, 0x10d0, - 0x10dc, 0x10dc, 0x10dc, 0x10e4, 0x10ec, 0x10ec, 0x10f4, 0x10fc, - 0x10fc, 0x10fc, 0x10fc, 0x1106, 0x1106, 0x1106, 0x1106, 0x1106, - 0x1117, 0x1117, 0x1123, 0x1123, 0x1123, 0x1123, 0x112f, 0x113b, - 0x1149, 0x1157, 0x117d, 0x1189, 0x1189, 0x1199, 0x119f, 0x11a7, - 0x11a7, 0x11a7, 0x11a7, 0x11a7, 0x11a7, 0x11a7, 0x11af, 0x11b9, - 0x11c7, 0x11cf, 0x11cf, 0x11df, 0x11e2, 0x11ee, 0x11ee, 0x11f6, - // Entry 240 - 27F - 0x11f6, 0x11f6, 0x1204, 0x120c, 0x120c, 0x121c, 0x121c, 0x121c, - 0x121c, 0x121c, 0x1248, 0x1250, 0x1275, 0x127d, 0x12a1, 0x12c2, - 0x12db, 0x12f5, 0x1318, 0x1335, 0x1352, 0x136d, 0x1395, 0x13ae, - 0x13cb, 0x13cb, 0x13ea, 0x13fd, 0x1410, 0x141c, 0x1439, 0x1452, - 0x1460, 0x1479, 0x1490, 0x14ac, 0x14c1, -} // Size: 1250 bytes - -const uzLangStr string = "" + // Size: 2777 bytes - "abxazafrikaansakanamxararagonarabassamavaraymaraozarbayjonboshqirdbelaru" + - "sbolgarbislamabambarabengaltibetbretonbosniykatalanchechenchamorrokorsik" + - "anchexslavyan (cherkov)chuvashvalliydatnemischadzongkaevegrekinglizchaes" + - "perantoispanchaestonchabaskforsfinchafijifarerchafransuzchag‘arbiy frizi" + - "rlandgalisiyguaranigujarotmenxausaibroniyhindxorvatgaityanvengerarmanger" + - "erointerlingvaindonezigbosichuanidoislanditalyaninuktitutyaponyavangruzi" + - "nchakikuyukvanyamaqozoqchagrenlandxmerchakannadakoreyschakanurikashmirch" + - "akurdchakomikornqirgʻizchalotinchalyuksemburgchagandalimburglingalalaosl" + - "itvaluba-katangalatishchamalagasiymarshallmaorimakedonmalayalammo‘g‘ulma" + - "ratximalaymaltiybirmannaurushimoliy ndebelenepalndongagollandnorveg-nyun" + - "orsknorveg-bokmalnavaxooromooriyaosetinpanjobchapolyakchapushtuportugalc" + - "hakechuaromanshrundirumincharuschakinyaruandasanskritsardinsindxishimoli" + - "y saamsangosingalslovakchaslovenchasamoashonasomalichaalbanserbchajanubi" + - "y sotosundanshvedsuaxilitamiltelugutojiktaytigrinyaturkmantsvanatongantu" + - "rktsongatatartaitiuyg‘urukrainurduo‘zbekvendavyetnamvolapyukvallonvolofk" + - "xosaidishyorubaxitoyzuluachinadangmeadigeyagemaynualeutjanubiy oltoyangi" + - "kaaraukanarapaxoasuasturiyavadxibembabenag‘arbiy balujbxojpuribinisiksik" + - "abodobugichigachukotchoktavcherokicheyennsorani-kurdkreol (Seyshel)dakot" + - "adargvataitadogribzarmaquyi sorbchadualadiola-fogniembuefikekajukfilipin" + - "chafongagagauzgangeezgilbertgorontalonemis (Shveytsariya)gusiigvichinhak" + - "gavaychaxmongyuqori sorbhsnxupaibanibibioilokoingushlojbanngombamachamek" + - "abilkachinkajikambakabardintyapmakondekabuverdianukorokxasikoyra-chiinik" + - "akokalenjinkimbundukomi-permyakkonkankpelleqorachoy-bolqorkarelkuruxsham" + - "balabafiyakyolnqo‘miqladinolangilezginlakotalozishimoliy luriluba-lulual" + - "undaluolushayluhyamadurmagahimaythilimakasarmasaymokshamendemerumorisyen" + - "maxuva-mittometamikmakminangkabaumohaukmossimundangbir nechta tilkrikmir" + - "andaerzyamozandaronnanneapolitannamaquyi nemisnevarniaskvasiongiyembunno" + - "‘g‘aynkoshimoliy sotonuernyankolepangasinanpampangapalaukreol (Nigeriy" + - "a)prusskicherapanuirarotonganromboaruminruandasandavesaxasamburungambays" + - "angusitsiliyashotlandjanubiy kurdsenakoyraboro-sennitashelxitshanjanubiy" + - " saamlule-saaminari-saamskolt-saamsoninkesranan-tongosukumaqamartimnetes" + - "otetumtigreklingontok-piksintarokotumbukatuvalutasavaktuvamarkaziy atlas" + - " tamazigxtudmurtumbundutub aholi tilivaivunjovarayvalbiriwuuqalmoqsogaya" + - "ngbenyembakantontamazigxtzunitil tarkibi yo‘qzazastandart arabnemis (Avs" + - "triya)yuqori nemis (Shveytsariya)ingliz (Avstraliya)ingliz (Kanada)ingli" + - "z (Britaniya)ingliz (Amerika)ispan (Lotin Amerikasi)ispan (Yevropa)ispan" + - " (Meksika)fransuz (Kanada)fransuz (Shveytsariya)quyi saksonflamandportug" + - "al (Braziliya)portugal (Yevropa)moldovansuaxili (Kongo)xitoy (soddalashg" + - "an)xitoy (an’anaviy)" - -var uzLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x0005, 0x000e, 0x0012, 0x0017, 0x001d, - 0x0021, 0x0026, 0x002a, 0x0030, 0x003a, 0x0042, 0x0049, 0x004f, - 0x0056, 0x005d, 0x0063, 0x0068, 0x006e, 0x0074, 0x007b, 0x0082, - 0x008a, 0x0092, 0x0092, 0x0096, 0x00a7, 0x00ae, 0x00b4, 0x00b7, - 0x00bf, 0x00bf, 0x00c6, 0x00c9, 0x00cd, 0x00d6, 0x00df, 0x00e7, - 0x00ef, 0x00f3, 0x00f7, 0x00f7, 0x00fd, 0x0101, 0x0109, 0x0113, - 0x0121, 0x0127, 0x0127, 0x012e, 0x0135, 0x013c, 0x013f, 0x0144, - 0x014b, 0x014f, 0x014f, 0x0155, 0x015c, 0x0162, 0x0167, 0x016d, - // Entry 40 - 7F - 0x0178, 0x017f, 0x017f, 0x0183, 0x018a, 0x018a, 0x018d, 0x0193, - 0x019a, 0x01a3, 0x01a8, 0x01ad, 0x01b6, 0x01b6, 0x01bc, 0x01c4, - 0x01cc, 0x01d4, 0x01db, 0x01e2, 0x01eb, 0x01f1, 0x01fb, 0x0202, - 0x0206, 0x020a, 0x0215, 0x021d, 0x022b, 0x0230, 0x0237, 0x023e, - 0x0242, 0x0247, 0x0253, 0x025c, 0x0265, 0x026d, 0x0272, 0x0279, - 0x0282, 0x028d, 0x0294, 0x0299, 0x029f, 0x02a5, 0x02aa, 0x02ba, - 0x02bf, 0x02c5, 0x02cc, 0x02db, 0x02e8, 0x02e8, 0x02ee, 0x02ee, - 0x02ee, 0x02ee, 0x02f3, 0x02f8, 0x02fe, 0x0307, 0x0307, 0x0310, - // Entry 80 - BF - 0x0316, 0x0321, 0x0327, 0x032e, 0x0333, 0x033b, 0x0341, 0x034c, - 0x0354, 0x035a, 0x0360, 0x036d, 0x0372, 0x0378, 0x0381, 0x038a, - 0x038f, 0x0394, 0x039d, 0x03a2, 0x03a9, 0x03a9, 0x03b5, 0x03bb, - 0x03c0, 0x03c7, 0x03cc, 0x03d2, 0x03d7, 0x03da, 0x03e2, 0x03e9, - 0x03ef, 0x03f5, 0x03f9, 0x03ff, 0x0404, 0x0409, 0x0411, 0x0417, - 0x041b, 0x0423, 0x0428, 0x042f, 0x0437, 0x043d, 0x0442, 0x0447, - 0x044c, 0x0452, 0x0452, 0x0457, 0x045b, 0x0460, 0x0460, 0x0467, - 0x046d, 0x046d, 0x046d, 0x0471, 0x0475, 0x0475, 0x0475, 0x047a, - // Entry C0 - FF - 0x047a, 0x0487, 0x0487, 0x048d, 0x048d, 0x0494, 0x0494, 0x049b, - 0x049b, 0x049b, 0x049b, 0x049b, 0x049b, 0x049e, 0x049e, 0x04a5, - 0x04a5, 0x04ab, 0x04ab, 0x04ab, 0x04ab, 0x04ab, 0x04ab, 0x04ab, - 0x04ab, 0x04ab, 0x04b0, 0x04b0, 0x04b4, 0x04b4, 0x04b4, 0x04c3, - 0x04cb, 0x04cb, 0x04cf, 0x04cf, 0x04cf, 0x04d6, 0x04d6, 0x04d6, - 0x04d6, 0x04d6, 0x04da, 0x04da, 0x04da, 0x04de, 0x04de, 0x04de, - 0x04de, 0x04de, 0x04de, 0x04de, 0x04de, 0x04de, 0x04e3, 0x04e3, - 0x04e3, 0x04e9, 0x04e9, 0x04e9, 0x04f0, 0x04f0, 0x04f7, 0x04fe, - // Entry 100 - 13F - 0x0509, 0x0509, 0x0509, 0x0509, 0x0518, 0x0518, 0x051e, 0x0524, - 0x0529, 0x0529, 0x0529, 0x052f, 0x052f, 0x0534, 0x0534, 0x0540, - 0x0540, 0x0545, 0x0545, 0x0550, 0x0550, 0x0550, 0x0554, 0x0558, - 0x0558, 0x0558, 0x055e, 0x055e, 0x055e, 0x055e, 0x055e, 0x055e, - 0x055e, 0x0568, 0x0568, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, - 0x056b, 0x056b, 0x056b, 0x056d, 0x0573, 0x0576, 0x0576, 0x0576, - 0x0576, 0x057a, 0x0581, 0x0581, 0x0581, 0x0581, 0x0581, 0x0581, - 0x058a, 0x058a, 0x058a, 0x058a, 0x059e, 0x059e, 0x059e, 0x05a3, - // Entry 140 - 17F - 0x05aa, 0x05aa, 0x05ad, 0x05b5, 0x05b5, 0x05b5, 0x05b5, 0x05ba, - 0x05c5, 0x05c8, 0x05cc, 0x05d0, 0x05d6, 0x05db, 0x05e1, 0x05e1, - 0x05e1, 0x05e7, 0x05ed, 0x05f4, 0x05f4, 0x05f4, 0x05f4, 0x05f4, - 0x05f9, 0x05ff, 0x0603, 0x0608, 0x0608, 0x0610, 0x0610, 0x0614, - 0x061b, 0x0627, 0x0627, 0x062b, 0x062b, 0x0630, 0x0630, 0x063c, - 0x063c, 0x063c, 0x0640, 0x0648, 0x0650, 0x065c, 0x0662, 0x0662, - 0x0668, 0x0677, 0x0677, 0x0677, 0x067c, 0x0681, 0x0689, 0x068f, - 0x0694, 0x069c, 0x069c, 0x06a2, 0x06a7, 0x06a7, 0x06a7, 0x06ad, - // Entry 180 - 1BF - 0x06ad, 0x06ad, 0x06ad, 0x06b3, 0x06b3, 0x06b3, 0x06b7, 0x06c4, - 0x06c4, 0x06ce, 0x06ce, 0x06d3, 0x06d6, 0x06dc, 0x06e1, 0x06e1, - 0x06e1, 0x06e6, 0x06e6, 0x06ec, 0x06f4, 0x06fb, 0x06fb, 0x0700, - 0x0700, 0x0706, 0x0706, 0x070b, 0x070f, 0x0717, 0x0717, 0x0723, - 0x0727, 0x072d, 0x0738, 0x0738, 0x0738, 0x073e, 0x0743, 0x0743, - 0x074a, 0x0758, 0x075c, 0x0763, 0x0763, 0x0763, 0x0763, 0x0768, - 0x0772, 0x0775, 0x077f, 0x0783, 0x078d, 0x0792, 0x0796, 0x0796, - 0x0796, 0x079c, 0x07a5, 0x07b0, 0x07b0, 0x07b0, 0x07b3, 0x07c0, - // Entry 1C0 - 1FF - 0x07c4, 0x07c4, 0x07c4, 0x07cc, 0x07cc, 0x07cc, 0x07cc, 0x07cc, - 0x07d6, 0x07d6, 0x07de, 0x07de, 0x07e3, 0x07e3, 0x07f3, 0x07f3, - 0x07f3, 0x07f3, 0x07f3, 0x07f3, 0x07f3, 0x07f3, 0x07f3, 0x07f8, - 0x07f8, 0x07fd, 0x07fd, 0x07fd, 0x0804, 0x080e, 0x080e, 0x080e, - 0x0813, 0x0813, 0x0813, 0x0813, 0x0813, 0x0819, 0x081f, 0x0826, - 0x082a, 0x082a, 0x0831, 0x0831, 0x0831, 0x0831, 0x0838, 0x083d, - 0x0846, 0x084e, 0x084e, 0x085a, 0x085a, 0x085e, 0x085e, 0x085e, - 0x086d, 0x086d, 0x086d, 0x0876, 0x087a, 0x087a, 0x087a, 0x087a, - // Entry 200 - 23F - 0x087a, 0x0886, 0x088f, 0x0899, 0x08a3, 0x08aa, 0x08aa, 0x08b6, - 0x08b6, 0x08b6, 0x08b6, 0x08bc, 0x08bc, 0x08bc, 0x08c1, 0x08c1, - 0x08c1, 0x08c1, 0x08c1, 0x08c6, 0x08ca, 0x08ca, 0x08cf, 0x08d4, - 0x08d4, 0x08d4, 0x08d4, 0x08db, 0x08db, 0x08db, 0x08db, 0x08db, - 0x08e5, 0x08e5, 0x08eb, 0x08eb, 0x08eb, 0x08eb, 0x08f2, 0x08f8, - 0x08ff, 0x0903, 0x091b, 0x0921, 0x0921, 0x0928, 0x0936, 0x0939, - 0x0939, 0x0939, 0x0939, 0x0939, 0x0939, 0x0939, 0x093e, 0x093e, - 0x093e, 0x0943, 0x0943, 0x094a, 0x094d, 0x0953, 0x0953, 0x0957, - // Entry 240 - 27F - 0x0957, 0x0957, 0x095e, 0x0963, 0x0963, 0x0969, 0x0969, 0x0969, - 0x0969, 0x0969, 0x0972, 0x0976, 0x0988, 0x098c, 0x0999, 0x0999, - 0x09a9, 0x09c4, 0x09d7, 0x09e6, 0x09f8, 0x0a08, 0x0a1f, 0x0a2e, - 0x0a3d, 0x0a3d, 0x0a4d, 0x0a63, 0x0a6e, 0x0a75, 0x0a89, 0x0a9b, - 0x0aa3, 0x0aa3, 0x0ab2, 0x0ac6, 0x0ad9, -} // Size: 1250 bytes - -const viLangStr string = "" + // Size: 8662 bytes - "Tiếng AfarTiếng AbkhaziaTiếng AvestanTiếng AfrikaansTiếng AkanTiếng Amha" + - "ricTiếng AragonTiếng Ả RậpTiếng AssamTiếng AvaricTiếng AymaraTiếng Azerb" + - "aijanTiếng BashkirTiếng BelarusTiếng BulgariaTiếng BislamaTiếng BambaraT" + - "iếng BanglaTiếng Tây TạngTiếng BretonTiếng BosniaTiếng CatalanTiếng Chec" + - "henTiếng ChamorroTiếng CorsicaTiếng CreeTiếng SécTiếng Slavơ Nhà thờTiến" + - "g ChuvashTiếng WalesTiếng Đan MạchTiếng ĐứcTiếng DivehiTiếng DzongkhaTiế" + - "ng EweTiếng Hy LạpTiếng AnhTiếng Quốc Tế NgữTiếng Tây Ban NhaTiếng Eston" + - "iaTiếng BasqueTiếng Ba TưTiếng FulahTiếng Phần LanTiếng FijiTiếng FaroeT" + - "iếng PhápTiếng FrisiaTiếng IrelandTiếng Gael ScotlandTiếng GalicianTiếng" + - " GuaraniTiếng GujaratiTiếng ManxTiếng HausaTiếng Do TháiTiếng HindiTiếng" + - " Hiri MotuTiếng CroatiaTiếng HaitiTiếng HungaryTiếng ArmeniaTiếng Herero" + - "Tiếng Khoa Học Quốc TếTiếng IndonesiaTiếng InterlingueTiếng IgboTiếng Di" + - " Tứ XuyênTiếng InupiaqTiếng IdoTiếng IcelandTiếng ÝTiếng InuktitutTiếng " + - "NhậtTiếng JavaTiếng GruziaTiếng KongoTiếng KikuyuTiếng KuanyamaTiếng Kaz" + - "akhTiếng KalaallisutTiếng Khơ-meTiếng KannadaTiếng HànTiếng KanuriTiếng " + - "KashmirTiếng KurdTiếng KomiTiếng CornwallTiếng KyrgyzTiếng La-tinhTiếng " + - "LuxembourgTiếng GandaTiếng LimburgTiếng LingalaTiếng LàoTiếng LitvaTiếng" + - " Luba-KatangaTiếng LatviaTiếng MalagasyTiếng MarshallTiếng MaoriTiếng Ma" + - "cedoniaTiếng MalayalamTiếng Mông CổTiếng MarathiTiếng Mã LaiTiếng MaltaT" + - "iếng Miến ĐiệnTiếng NauruTiếng Ndebele Miền BắcTiếng NepalTiếng NdongaTi" + - "ếng Hà LanTiếng Na Uy (Nynorsk)Tiếng Na Uy (Bokmål)Tiếng Ndebele Miền " + - "NamTiếng NavajoTiếng NyanjaTiếng OccitanTiếng OjibwaTiếng OromoTiếng Odi" + - "aTiếng OsseticTiếng PunjabTiếng PaliTiếng Ba LanTiếng PashtoTiếng Bồ Đào" + - " NhaTiếng QuechuaTiếng RomanshTiếng RundiTiếng RomaniaTiếng NgaTiếng Kin" + - "yarwandaTiếng PhạnTiếng SardiniaTiếng SindhiTiếng Sami Miền BắcTiếng San" + - "goTiếng SinhalaTiếng SlovakTiếng SloveniaTiếng SamoaTiếng ShonaTiếng Som" + - "aliTiếng AlbaniaTiếng SerbiaTiếng SwatiTiếng Sotho Miền NamTiếng SundaTi" + - "ếng Thụy ĐiểnTiếng SwahiliTiếng TamilTiếng TeluguTiếng TajikTiếng Thái" + - "Tiếng TigrinyaTiếng TurkmenTiếng TswanaTiếng TongaTiếng Thổ Nhĩ KỳTiếng " + - "TsongaTiếng TatarTiếng TahitiTiếng Duy Ngô NhĩTiếng UcrainaTiếng UrduTiế" + - "ng UzbekTiếng VendaTiếng ViệtTiếng VolapükTiếng WalloonTiếng WolofTiếng " + - "XhosaTiếng YiddishTiếng YorubaTiếng ChoangTiếng TrungTiếng ZuluTiếng Ach" + - "ineseTiếng AcoliTiếng AdangmeTiếng AdygheTiếng AfrihiliTiếng AghemTiếng " + - "AinuTiếng AkkadiaTiếng AlabamaTiếng AleutTiếng Gheg AlbaniTiếng Altai Mi" + - "ền NamTiếng Anh cổTiếng AngikaTiếng AramaicTiếng MapucheTiếng AraonaTi" + - "ếng ArapahoTiếng Ả Rập AlgeriaTiếng ArawakTiếng Ả Rập Ai CậpTiếng AsuN" + - "gôn ngữ Ký hiệu MỹTiếng AsturiasTiếng AwadhiTiếng BaluchiTiếng BaliTiếng" + - " BavariaTiếng BasaaTiếng BamunTiếng Batak TobaTiếng GhomalaTiếng BejaTiế" + - "ng BembaTiếng BetawiTiếng BenaTiếng BafutTiếng BadagaTiếng Tây BalochiTi" + - "ếng BhojpuriTiếng BikolTiếng BiniTiếng BanjarTiếng KomTiếng SiksikaTiế" + - "ng BishnupriyaTiếng BakhtiariTiếng BrajTiếng BrahuiTiếng BodoTiếng Akoos" + - "eTiếng BuriatTiếng BuginTiếng BuluTiếng BlinTiếng MedumbaTiếng CaddoTiến" + - "g CaribTiếng CayugaTiếng AtsamTiếng CebuanoTiếng ChigaTiếng ChibchaTiếng" + - " ChagataiTiếng ChuukTiếng MariBiệt ngữ ChinookTiếng ChoctawTiếng Chipewy" + - "anTiếng CherokeeTiếng CheyenneTiếng Kurd Miền TrungTiếng CopticTiếng Cap" + - "iznonTiếng Thổ Nhĩ Kỳ CrimeanTiếng Pháp Seselwa CreoleTiếng KashubiaTiến" + - "g DakotaTiếng DargwaTiếng TaitaTiếng DelawareTiếng SlaveTiếng DogribTiến" + - "g DinkaTiếng ZarmaTiếng DogriTiếng Hạ SorbiaTiếng Dusun Miền TrungTiếng " + - "DualaTiếng Hà Lan Trung cổTiếng Jola-FonyiTiếng DyulaTiếng DazagaTiếng E" + - "mbuTiếng EfikTiếng EmiliaTiếng Ai Cập cổTiếng EkajukTiếng ElamiteTiếng A" + - "nh Trung cổTiếng Yupik Miền TrungTiếng EwondoTiếng ExtremaduraTiếng Fang" + - "Tiếng PhilippinesTiếng FonTiếng Pháp CajunTiếng Pháp Trung cổTiếng Pháp " + - "cổTiếng ArpitanTiếng Frisia Miền BắcTiếng Frisian Miền ĐôngTiếng Friulia" + - "nTiếng GaTiếng GagauzTiếng CámTiếng GayoTiếng GbayaTiếng GeezTiếng Gilbe" + - "rtTiếng GilakiTiếng Thượng Giéc-man Trung cổTiếng Thượng Giéc-man cổTiến" + - "g Goan KonkaniTiếng GondiTiếng GorontaloTiếng Gô-tíchTiếng GreboTiếng Hy" + - " Lạp cổTiếng Đức (Thụy Sĩ)Tiếng FrafraTiếng GusiiTiếng GwichʼinTiếng Hai" + - "daTiếng Khách GiaTiếng HawaiiTiếng Fiji HindiTiếng HiligaynonTiếng Hitti" + - "teTiếng HmôngTiếng Thượng SorbiaTiếng TươngTiếng HupaTiếng IbanTiếng Ibi" + - "bioTiếng IlokoTiếng IngushTiếng IngriaTiếng Anh Jamaica CreoleTiếng Lojb" + - "anTiếng NgombaTiếng MachameTiếng Judeo-Ba TưTiếng Judeo-Ả RậpTiếng Jutis" + - "hTiếng Kara-KalpakTiếng KabyleTiếng KachinTiếng JjuTiếng KambaTiếng Kawi" + - "Tiếng KabardianTiếng KanembuTiếng TyapTiếng MakondeTiếng KabuverdianuTiế" + - "ng KoroTiếng KhasiTiếng KhotanTiếng Koyra ChiiniTiếng KakoTiếng Kalenjin" + - "Tiếng KimbunduTiếng Komi-PermyakTiếng KonkaniTiếng KosraeTiếng KpelleTiế" + - "ng Karachay-BalkarTiếng KarelianTiếng KurukhTiếng ShambalaTiếng BafiaTiế" + - "ng CologneTiếng KumykTiếng KutenaiTiếng LadinoTiếng LangiTiếng LahndaTiế" + - "ng LambaTiếng LezghianTiếng LakotaTiếng MongoTiếng LoziTiếng Bắc LuriTiế" + - "ng Luba-LuluaTiếng LuisenoTiếng LundaTiếng LuoTiếng LushaiTiếng LuyiaTiế" + - "ng MaduraTiếng MafaTiếng MagahiTiếng MaithiliTiếng MakasarTiếng Mandingo" + - "Tiếng MasaiTiếng MabaTiếng MokshaTiếng MandarTiếng MendeTiếng MeruTiếng " + - "MorisyenTiếng Ai-len Trung cổTiếng Makhuwa-MeettoTiếng Meta’Tiếng Micmac" + - "Tiếng MinangkabauTiếng Mãn ChâuTiếng ManipuriTiếng MohawkTiếng MossiTiến" + - "g MundangNhiều Ngôn ngữTiếng CreekTiếng MirandaTiếng MarwariTiếng MyeneT" + - "iếng ErzyaTiếng MazanderaniTiếng Mân NamTiếng NapoliTiếng NamaTiếng Hạ G" + - "iéc-manTiếng NewariTiếng NiasTiếng NiueanTiếng Ao NagaTiếng KwasioTiếng " + - "NgiemboonTiếng NogaiTiếng Na Uy cổTiếng N’KoTiếng Sotho Miền BắcTiếng Nu" + - "erTiếng Newari cổTiếng NyamweziTiếng NyankoleTiếng NyoroTiếng NzimaTiếng" + - " OsageTiếng Thổ Nhĩ Kỳ OttomanTiếng PangasinanTiếng PahlaviTiếng Pampang" + - "aTiếng PapiamentoTiếng PalauanTiếng Nigeria PidginTiếng Ba Tư cổTiếng Ph" + - "oeniciaTiếng PohnpeianTiếng PrussiaTiếng Provençal cổTiếng KʼicheʼTiếng " + - "Quechua ở Cao nguyên ChimborazoTiếng RajasthaniTiếng RapanuiTiếng Raroto" + - "nganTiếng RomboTiếng RomanyTiếng AromaniaTiếng RwaTiếng SandaweTiếng Sak" + - "haTiếng Samaritan AramaicTiếng SamburuTiếng SasakTiếng SantaliTiếng Ngam" + - "bayTiếng SanguTiếng SiciliaTiếng ScotsTiếng Kurd Miền NamTiếng SenecaTiế" + - "ng SenaTiếng SelkupTiếng Koyraboro SenniTiếng Ai-len cổTiếng TachelhitTi" + - "ếng ShanTiếng Ả-Rập ChadTiếng SidamoTiếng Sami Miền NamTiếng Lule Sami" + - "Tiếng Inari SamiTiếng Skolt SamiTiếng SoninkeTiếng SogdienTiếng Sranan T" + - "ongoTiếng SererTiếng SahoTiếng SukumaTiếng SusuTiếng SumeriaTiếng CômoTi" + - "ếng Syriac cổTiếng SyriacTiếng TimneTiếng TesoTiếng TerenoTiếng TetumT" + - "iếng TigreTiếng TivTiếng TokelauTiếng KlingonTiếng TlingitTiếng Tamashek" + - "Tiếng Nyasa TongaTiếng Tok PisinTiếng TarokoTiếng TsimshianTiếng Tumbuka" + - "Tiếng TuvaluTiếng TasawaqTiếng TuvinianTiếng Tamazight Miền Trung Ma-rốc" + - "Tiếng UdmurtTiếng UgariticTiếng UmbunduTiếng RootTiếng VaiTiếng VoticTiế" + - "ng VunjoTiếng WalserTiếng WalamoTiếng WarayTiếng WashoTiếng WarlpiriTiến" + - "g NgôTiếng KalmykTiếng SogaTiếng YaoTiếng YapTiếng YangbenTiếng YembaTiế" + - "ng Quảng ĐôngTiếng ZapotecKý hiệu BlissymbolsTiếng ZenagaTiếng Tamazight" + - " Chuẩn của Ma-rốcTiếng ZuniKhông có nội dung ngôn ngữTiếng ZazaTiếng Ả R" + - "ập Hiện đạiTiếng Thượng Giéc-man (Thụy Sĩ)Tiếng Anh (Anh)Tiếng Anh (Mỹ" + - ")Tiếng Tây Ban Nha (Mỹ La tinh)Tiếng Tây Ban Nha (Châu Âu)Tiếng Hạ Saxon" + - "Tiếng FlemishTiếng Bồ Đào Nha (Châu Âu)Tiếng MoldovaTiếng Serbo-CroatiaT" + - "iếng Swahili Congo" - -var viLangIdx = []uint16{ // 611 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x001c, 0x002b, 0x003c, 0x0048, 0x0057, 0x0065, - 0x0076, 0x0083, 0x0091, 0x009f, 0x00b1, 0x00c0, 0x00cf, 0x00df, - 0x00ee, 0x00fd, 0x010b, 0x011e, 0x012c, 0x013a, 0x0149, 0x0158, - 0x0168, 0x0177, 0x0183, 0x018f, 0x01a8, 0x01b7, 0x01c4, 0x01d7, - 0x01e5, 0x01f3, 0x0203, 0x020e, 0x021e, 0x0229, 0x0242, 0x0256, - 0x0265, 0x0273, 0x0281, 0x028e, 0x02a0, 0x02ac, 0x02b9, 0x02c6, - 0x02d4, 0x02e3, 0x02f8, 0x0308, 0x0317, 0x0327, 0x0333, 0x0340, - 0x0350, 0x035d, 0x036e, 0x037d, 0x038a, 0x0399, 0x03a8, 0x03b6, - // Entry 40 - 7F - 0x03d4, 0x03e5, 0x03f8, 0x0404, 0x041a, 0x0429, 0x0434, 0x0443, - 0x044d, 0x045e, 0x046c, 0x0478, 0x0486, 0x0493, 0x04a1, 0x04b1, - 0x04bf, 0x04d2, 0x04e1, 0x04f0, 0x04fc, 0x050a, 0x0519, 0x0525, - 0x0531, 0x0541, 0x054f, 0x055e, 0x0570, 0x057d, 0x058c, 0x059b, - 0x05a7, 0x05b4, 0x05c8, 0x05d6, 0x05e6, 0x05f6, 0x0603, 0x0614, - 0x0625, 0x0637, 0x0646, 0x0655, 0x0662, 0x0678, 0x0685, 0x06a1, - 0x06ae, 0x06bc, 0x06cb, 0x06e2, 0x06f9, 0x0713, 0x0721, 0x072f, - 0x073e, 0x074c, 0x0759, 0x0765, 0x0774, 0x0782, 0x078e, 0x079c, - // Entry 80 - BF - 0x07aa, 0x07c0, 0x07cf, 0x07de, 0x07eb, 0x07fa, 0x0805, 0x0818, - 0x0826, 0x0836, 0x0844, 0x085d, 0x086a, 0x0879, 0x0887, 0x0897, - 0x08a4, 0x08b1, 0x08bf, 0x08ce, 0x08dc, 0x08e9, 0x0901, 0x090e, - 0x0924, 0x0933, 0x0940, 0x094e, 0x095b, 0x0968, 0x0978, 0x0987, - 0x0995, 0x09a2, 0x09b9, 0x09c7, 0x09d4, 0x09e2, 0x09f7, 0x0a06, - 0x0a12, 0x0a1f, 0x0a2c, 0x0a3a, 0x0a4a, 0x0a59, 0x0a66, 0x0a73, - 0x0a82, 0x0a90, 0x0a9e, 0x0aab, 0x0ab7, 0x0ac7, 0x0ad4, 0x0ae3, - 0x0af1, 0x0af1, 0x0b01, 0x0b0e, 0x0b1a, 0x0b29, 0x0b38, 0x0b45, - // Entry C0 - FF - 0x0b58, 0x0b70, 0x0b80, 0x0b8e, 0x0b9d, 0x0bac, 0x0bba, 0x0bc9, - 0x0be2, 0x0be2, 0x0bf0, 0x0bf0, 0x0c0a, 0x0c15, 0x0c30, 0x0c40, - 0x0c40, 0x0c4e, 0x0c5d, 0x0c69, 0x0c78, 0x0c85, 0x0c92, 0x0ca4, - 0x0cb3, 0x0cbf, 0x0ccc, 0x0cda, 0x0ce6, 0x0cf3, 0x0d01, 0x0d15, - 0x0d25, 0x0d32, 0x0d3e, 0x0d4c, 0x0d57, 0x0d66, 0x0d79, 0x0d8a, - 0x0d96, 0x0da4, 0x0db0, 0x0dbe, 0x0dcc, 0x0dd9, 0x0de5, 0x0df1, - 0x0e00, 0x0e0d, 0x0e1a, 0x0e28, 0x0e35, 0x0e44, 0x0e51, 0x0e60, - 0x0e70, 0x0e7d, 0x0e89, 0x0e9d, 0x0eac, 0x0ebd, 0x0ecd, 0x0edd, - // Entry 100 - 13F - 0x0ef6, 0x0f04, 0x0f14, 0x0f33, 0x0f4f, 0x0f5f, 0x0f6d, 0x0f7b, - 0x0f88, 0x0f98, 0x0fa5, 0x0fb3, 0x0fc0, 0x0fcd, 0x0fda, 0x0fed, - 0x1007, 0x1014, 0x102e, 0x1040, 0x104d, 0x105b, 0x1067, 0x1073, - 0x1081, 0x1096, 0x10a4, 0x10b3, 0x10c9, 0x10e3, 0x10f1, 0x1104, - 0x1110, 0x1123, 0x1123, 0x112e, 0x1141, 0x1159, 0x116b, 0x117a, - 0x1195, 0x11b2, 0x11c2, 0x11cc, 0x11da, 0x11e6, 0x11f2, 0x11ff, - 0x11ff, 0x120b, 0x121a, 0x1228, 0x124e, 0x126e, 0x1282, 0x128f, - 0x12a0, 0x12b1, 0x12be, 0x12d3, 0x12ee, 0x12ee, 0x12fc, 0x1309, - // Entry 140 - 17F - 0x131a, 0x1327, 0x1339, 0x1347, 0x1359, 0x136b, 0x137a, 0x1388, - 0x13a0, 0x13af, 0x13bb, 0x13c7, 0x13d5, 0x13e2, 0x13f0, 0x13fe, - 0x1418, 0x1426, 0x1434, 0x1443, 0x1457, 0x146e, 0x147c, 0x148f, - 0x149d, 0x14ab, 0x14b6, 0x14c3, 0x14cf, 0x14e0, 0x14ef, 0x14fb, - 0x150a, 0x151e, 0x151e, 0x152a, 0x152a, 0x1537, 0x1545, 0x1559, - 0x1559, 0x1559, 0x1565, 0x1575, 0x1585, 0x1599, 0x15a8, 0x15b6, - 0x15c4, 0x15db, 0x15db, 0x15db, 0x15eb, 0x15f9, 0x1609, 0x1616, - 0x1625, 0x1632, 0x1641, 0x164f, 0x165c, 0x166a, 0x1677, 0x1687, - // Entry 180 - 1BF - 0x1687, 0x1687, 0x1687, 0x1695, 0x1695, 0x16a2, 0x16ae, 0x16c0, - 0x16c0, 0x16d2, 0x16e1, 0x16ee, 0x16f9, 0x1707, 0x1714, 0x1714, - 0x1714, 0x1722, 0x172e, 0x173c, 0x174c, 0x175b, 0x176b, 0x1778, - 0x1784, 0x1792, 0x17a0, 0x17ad, 0x17b9, 0x17c9, 0x17e2, 0x17f8, - 0x1807, 0x1815, 0x1828, 0x183a, 0x184a, 0x1858, 0x1865, 0x1865, - 0x1874, 0x1887, 0x1894, 0x18a3, 0x18b2, 0x18b2, 0x18bf, 0x18cc, - 0x18df, 0x18ef, 0x18fd, 0x1909, 0x191f, 0x192d, 0x1939, 0x1947, - 0x1956, 0x1964, 0x1975, 0x1982, 0x1994, 0x1994, 0x19a2, 0x19bc, - // Entry 1C0 - 1FF - 0x19c8, 0x19db, 0x19eb, 0x19fb, 0x1a08, 0x1a15, 0x1a22, 0x1a41, - 0x1a53, 0x1a62, 0x1a72, 0x1a84, 0x1a93, 0x1a93, 0x1aa9, 0x1aa9, - 0x1aa9, 0x1abc, 0x1abc, 0x1acd, 0x1acd, 0x1acd, 0x1ade, 0x1aed, - 0x1b04, 0x1b15, 0x1b3f, 0x1b51, 0x1b60, 0x1b72, 0x1b72, 0x1b72, - 0x1b7f, 0x1b8d, 0x1b8d, 0x1b8d, 0x1b8d, 0x1b9d, 0x1ba8, 0x1bb7, - 0x1bc4, 0x1bdd, 0x1bec, 0x1bf9, 0x1c08, 0x1c08, 0x1c17, 0x1c24, - 0x1c33, 0x1c40, 0x1c40, 0x1c57, 0x1c65, 0x1c71, 0x1c71, 0x1c7f, - 0x1c96, 0x1ca9, 0x1ca9, 0x1cba, 0x1cc6, 0x1cdc, 0x1cea, 0x1cea, - // Entry 200 - 23F - 0x1cea, 0x1d01, 0x1d12, 0x1d24, 0x1d36, 0x1d45, 0x1d54, 0x1d68, - 0x1d75, 0x1d81, 0x1d81, 0x1d8f, 0x1d9b, 0x1daa, 0x1db7, 0x1dca, - 0x1dd8, 0x1dd8, 0x1dd8, 0x1de5, 0x1df1, 0x1dff, 0x1e0c, 0x1e19, - 0x1e24, 0x1e33, 0x1e33, 0x1e42, 0x1e51, 0x1e51, 0x1e61, 0x1e74, - 0x1e85, 0x1e85, 0x1e93, 0x1e93, 0x1ea4, 0x1ea4, 0x1eb3, 0x1ec1, - 0x1ed0, 0x1ee0, 0x1f07, 0x1f15, 0x1f25, 0x1f34, 0x1f40, 0x1f4b, - 0x1f4b, 0x1f4b, 0x1f4b, 0x1f4b, 0x1f58, 0x1f58, 0x1f65, 0x1f73, - 0x1f81, 0x1f8e, 0x1f9b, 0x1fab, 0x1fb7, 0x1fc5, 0x1fc5, 0x1fd1, - // Entry 240 - 27F - 0x1fdc, 0x1fe7, 0x1ff6, 0x2003, 0x2003, 0x2019, 0x2028, 0x203e, - 0x203e, 0x204c, 0x2074, 0x2080, 0x20a1, 0x20ad, 0x20cc, 0x20cc, - 0x20cc, 0x20f4, 0x20f4, 0x20f4, 0x2105, 0x2117, 0x213a, 0x215a, - 0x215a, 0x215a, 0x215a, 0x215a, 0x216c, 0x217b, 0x217b, 0x219d, - 0x21ac, 0x21c1, 0x21d6, -} // Size: 1246 bytes - -const zhLangStr string = "" + // Size: 6428 bytes - "阿法尔文阿布哈西亚语阿维斯塔文南非荷兰语阿肯文阿姆哈拉文阿拉贡文阿拉伯语阿萨姆文阿瓦尔文艾马拉文阿塞拜疆语巴什基尔文白俄罗斯语保加利亚语比斯拉马" + - "文班巴拉文孟加拉语藏语布列塔尼文波斯尼亚语加泰罗尼亚语车臣文查莫罗文科西嘉文克里族文捷克语教会斯拉夫文楚瓦什文威尔士语丹麦语德文迪维希文宗卡" + - "文埃维文希腊语英语世界语西班牙文爱沙尼亚语巴斯克文波斯文富拉文芬兰语斐济文法罗文法语西弗里西亚文爱尔兰语苏格兰盖尔文加利西亚语瓜拉尼文古吉拉" + - "特语马恩岛文豪萨文希伯来语印地语希里莫图文克罗地亚语海地克里奥尔文匈牙利语亚美尼亚语赫雷罗文国际语印度尼西亚语国际文字(E)伊布文四川彝文伊" + - "努皮克文伊多文冰岛语意大利语因纽特语日语爪哇语格鲁吉亚语刚果语吉库尤文宽亚玛文哈萨克语格陵兰文高棉文卡纳达文韩文卡努里文克什米尔文库尔德文科" + - "米文凯尔特文吉尔吉斯文拉丁语卢森堡语卢干达文林堡文林加拉文老挝语立陶宛语鲁巴加丹加文拉脱维亚语马尔加什文马绍尔文毛利文马其顿文马拉雅拉姆语蒙" + - "古文马拉地文马来语马耳他文缅甸语瑙鲁文北恩德贝勒文尼泊尔语恩东加文荷兰语挪威尼诺斯克文挪威博克马尔语南恩德贝勒文纳瓦霍文尼昂加文奥克西唐文奥" + - "吉布瓦文奥洛莫文奥里亚文奥塞梯文旁遮普文巴利文波兰文普什图文葡萄牙文盖丘亚文罗曼什文隆迪文罗马尼亚文俄文卢旺达语梵文萨丁文信德文北萨米文桑戈" + - "文僧伽罗文斯洛伐克文斯洛文尼亚文萨摩亚文绍纳文索马里文阿尔巴尼亚文塞尔维亚文斯瓦蒂文南索托文巽他文瑞典语斯瓦希里文泰米尔语泰卢固语塔吉克语泰" + - "语提格利尼亚文土库曼文茨瓦纳文汤加文土耳其文聪加文鞑靼文塔西提文维吾尔语乌克兰语乌尔都语乌兹别克语文达文越南语沃拉普克文瓦隆文沃洛夫文科萨文" + - "意第绪文约鲁巴文壮语中文祖鲁语亚齐文阿乔利文阿当梅文阿迪格文阿弗里希利文亚罕文阿伊努文阿卡德文阿留申文南阿尔泰文古英文昂加文阿拉米文马普切文" + - "阿拉帕霍文阿拉瓦克文阿苏文阿斯图里亚斯文阿瓦乔文俾路支文巴里文巴萨文巴姆穆文戈马拉文贝沙文别姆巴文贝纳文巴非特文西俾路支文博杰普尔文比科尔文" + - "比尼文科姆文西克西卡文布拉杰文博多文阿库色文布里亚特文布吉文布鲁文布林文梅敦巴文卡多文加勒比语卡尤加文阿灿文宿务文奇加文奇布查文查加台文丘克" + - "文马里文奇努克混合文乔克托文奇佩维安文彻罗基文夏延文中库尔德文科普特文克里米亚土耳其文塞舌尔克里奥尔文卡舒比文达科他文达尔格瓦文台塔文特拉华" + - "文史拉维文多格里布文丁卡文哲尔马文多格拉文下索布文都阿拉文中古荷兰文朱拉文迪尤拉文达扎葛文恩布文埃菲克文古埃及语艾卡朱克文埃兰文中古英文旺杜" + - "文芳格文菲律宾语丰文中古法文古法文北弗里西亚文东弗里西亚文弗留利文加族文加告兹文赣语迦约文格巴亚文吉兹文吉尔伯特斯文中古高地德文古高地德文冈" + - "德文哥伦打洛文哥特文格列博文古希腊语德语(瑞士)古西文吉维克琴文海达文客家语夏威夷文希利盖农文赫梯文苗族文上索布文湘语胡帕文伊班文伊比比奥文" + - "伊洛干诺文印古什文逻辑文恩艮巴马切姆文犹太波斯语犹太阿拉伯语卡拉卡尔帕克文卡比尔文克钦文卡捷文卡姆巴文卡威文卡巴尔德文加涅姆布文卡塔布文马孔" + - "德文卡布佛得鲁文科罗文卡西文和田文西桑海文卡库文卡伦金文金邦杜文科米-彼尔米亚克文刚卡尼文科斯拉伊文克佩列文卡拉恰伊巴尔卡尔文卡累利阿文库鲁" + - "克文香巴拉文巴菲亚文科隆文库米克文库特奈文拉地诺文朗吉文印度-雅利安文兰巴文列兹金文拉科塔文蒙戈文洛齐文北卢尔文卢巴-卢拉文卢伊塞诺文隆达文" + - "卢奥文米佐文卢雅文马都拉文马法文马加伊文迈蒂利文望加锡文曼丁哥文萨伊文马坝文莫克沙文曼达尔文门德文梅鲁文毛里求斯克里奥尔文中古爱尔兰文马库阿" + - "文梅塔文密克马克文米南卡保文满文曼尼普尔文摩霍克文莫西文蒙当文多种语系克里克文米兰德斯文马尔瓦里文姆耶内文厄尔兹亚文马赞德兰文闽南语那不勒斯" + - "文纳马文低地德文内瓦里文尼亚斯文纽埃文夸西奥文恩甘澎文诺盖文古诺尔斯文西非书面文字北索托文努埃尔文古典尼瓦尔文尼扬韦齐文尼昂科勒文尼奥罗文恩" + - "济马文奥塞治文奥斯曼土耳其文邦阿西南文巴拉维文邦板牙文帕皮阿门托文帕劳文尼日利亚皮钦文古波斯文腓尼基文波纳佩文普鲁士文古普罗文斯文基切文拉贾" + - "斯坦文拉帕努伊文拉罗汤加文兰博文吉普赛文阿罗蒙文罗瓦文桑达韦文萨哈文萨马利亚阿拉姆文桑布鲁文萨萨克文桑塔利文甘拜文桑古文西西里文苏格兰文南库" + - "尔德文塞内卡文塞纳文塞尔库普文东桑海文古爱尔兰文希尔哈文掸文乍得阿拉伯文悉达摩文南萨米文律勒萨米文伊纳里萨米文斯科特萨米文索宁克文粟特文苏里" + - "南汤加文塞雷尔文萨霍文苏库马文苏苏文苏美尔文科摩罗文古典叙利亚文古叙利亚文泰姆奈文特索文特伦诺文德顿文提格雷文蒂夫文托克劳文克林贡文特林吉特" + - "文塔马奇克文尼亚萨汤加文托克皮辛文太鲁阁文钦西安文通布卡文图瓦卢文北桑海文图瓦文塔马齐格特文乌德穆尔特文乌加里特文翁本杜文根语言瓦伊文维普森" + - "文沃提克文温旧文瓦尔瑟文瓦拉莫文瓦瑞文瓦绍文瓦尔皮瑞文吴语卡尔梅克文索加文瑶族语雅浦文洋卞文耶姆巴文粤语萨波蒂克文布里斯符号泽纳加文标准摩洛" + - "哥塔马塞特文祖尼文无语言内容扎扎文现代标准阿拉伯语南阿塞拜疆文奥地利德文瑞士高地德文拉丁美洲西班牙文欧洲西班牙文墨西哥西班牙文低萨克森文佛兰" + - "德文巴西葡萄牙文欧洲葡萄牙文摩尔多瓦文塞尔维亚-克罗地亚文刚果斯瓦希里文简体中文繁体中文" - -var zhLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x001e, 0x002d, 0x003c, 0x0045, 0x0054, 0x0060, - 0x006c, 0x0078, 0x0084, 0x0090, 0x009f, 0x00ae, 0x00bd, 0x00cc, - 0x00db, 0x00e7, 0x00f3, 0x00f9, 0x0108, 0x0117, 0x0129, 0x0132, - 0x013e, 0x014a, 0x0156, 0x015f, 0x0171, 0x017d, 0x0189, 0x0192, - 0x0198, 0x01a4, 0x01ad, 0x01b6, 0x01bf, 0x01c5, 0x01ce, 0x01da, - 0x01e9, 0x01f5, 0x01fe, 0x0207, 0x0210, 0x0219, 0x0222, 0x0228, - 0x023a, 0x0246, 0x0258, 0x0267, 0x0273, 0x0282, 0x028e, 0x0297, - 0x02a3, 0x02ac, 0x02bb, 0x02ca, 0x02df, 0x02eb, 0x02fa, 0x0306, - // Entry 40 - 7F - 0x030f, 0x0321, 0x0334, 0x033d, 0x0349, 0x0358, 0x0361, 0x036a, - 0x0376, 0x0382, 0x0388, 0x0391, 0x03a0, 0x03a9, 0x03b5, 0x03c1, - 0x03cd, 0x03d9, 0x03e2, 0x03ee, 0x03f4, 0x0400, 0x040f, 0x041b, - 0x0424, 0x0430, 0x043f, 0x0448, 0x0454, 0x0460, 0x0469, 0x0475, - 0x047e, 0x048a, 0x049c, 0x04ab, 0x04ba, 0x04c6, 0x04cf, 0x04db, - 0x04ed, 0x04f6, 0x0502, 0x050b, 0x0517, 0x0520, 0x0529, 0x053b, - 0x0547, 0x0553, 0x055c, 0x0571, 0x0586, 0x0598, 0x05a4, 0x05b0, - 0x05bf, 0x05ce, 0x05da, 0x05e6, 0x05f2, 0x05fe, 0x0607, 0x0610, - // Entry 80 - BF - 0x061c, 0x0628, 0x0634, 0x0640, 0x0649, 0x0658, 0x065e, 0x066a, - 0x0670, 0x0679, 0x0682, 0x068e, 0x0697, 0x06a3, 0x06b2, 0x06c4, - 0x06d0, 0x06d9, 0x06e5, 0x06f7, 0x0706, 0x0712, 0x071e, 0x0727, - 0x0730, 0x073f, 0x074b, 0x0757, 0x0763, 0x0769, 0x077b, 0x0787, - 0x0793, 0x079c, 0x07a8, 0x07b1, 0x07ba, 0x07c6, 0x07d2, 0x07de, - 0x07ea, 0x07f9, 0x0802, 0x080b, 0x081a, 0x0823, 0x082f, 0x0838, - 0x0844, 0x0850, 0x0856, 0x085c, 0x0865, 0x086e, 0x087a, 0x0886, - 0x0892, 0x0892, 0x08a4, 0x08ad, 0x08b9, 0x08c5, 0x08c5, 0x08d1, - // Entry C0 - FF - 0x08d1, 0x08e0, 0x08e9, 0x08f2, 0x08fe, 0x090a, 0x090a, 0x0919, - 0x0919, 0x0919, 0x0928, 0x0928, 0x0928, 0x0931, 0x0931, 0x0946, - 0x0946, 0x0952, 0x095e, 0x0967, 0x0967, 0x0970, 0x097c, 0x097c, - 0x0988, 0x0991, 0x099d, 0x099d, 0x09a6, 0x09b2, 0x09b2, 0x09c1, - 0x09d0, 0x09dc, 0x09e5, 0x09e5, 0x09ee, 0x09fd, 0x09fd, 0x09fd, - 0x0a09, 0x0a09, 0x0a12, 0x0a1e, 0x0a2d, 0x0a36, 0x0a3f, 0x0a48, - 0x0a54, 0x0a5d, 0x0a69, 0x0a75, 0x0a7e, 0x0a87, 0x0a90, 0x0a9c, - 0x0aa8, 0x0ab1, 0x0aba, 0x0acc, 0x0ad8, 0x0ae7, 0x0af3, 0x0afc, - // Entry 100 - 13F - 0x0b0b, 0x0b17, 0x0b17, 0x0b2f, 0x0b47, 0x0b53, 0x0b5f, 0x0b6e, - 0x0b77, 0x0b83, 0x0b8f, 0x0b9e, 0x0ba7, 0x0bb3, 0x0bbf, 0x0bcb, - 0x0bcb, 0x0bd7, 0x0be6, 0x0bef, 0x0bfb, 0x0c07, 0x0c10, 0x0c1c, - 0x0c1c, 0x0c28, 0x0c37, 0x0c40, 0x0c4c, 0x0c4c, 0x0c55, 0x0c55, - 0x0c5e, 0x0c6a, 0x0c6a, 0x0c70, 0x0c70, 0x0c7c, 0x0c85, 0x0c85, - 0x0c97, 0x0ca9, 0x0cb5, 0x0cbe, 0x0cca, 0x0cd0, 0x0cd9, 0x0ce5, - 0x0ce5, 0x0cee, 0x0d00, 0x0d00, 0x0d12, 0x0d21, 0x0d21, 0x0d2a, - 0x0d39, 0x0d42, 0x0d4e, 0x0d5a, 0x0d6c, 0x0d6c, 0x0d6c, 0x0d75, - // Entry 140 - 17F - 0x0d84, 0x0d8d, 0x0d96, 0x0da2, 0x0da2, 0x0db1, 0x0dba, 0x0dc3, - 0x0dcf, 0x0dd5, 0x0dde, 0x0de7, 0x0df6, 0x0e05, 0x0e11, 0x0e11, - 0x0e11, 0x0e1a, 0x0e23, 0x0e2f, 0x0e3e, 0x0e50, 0x0e50, 0x0e65, - 0x0e71, 0x0e7a, 0x0e83, 0x0e8f, 0x0e98, 0x0ea7, 0x0eb6, 0x0ec2, - 0x0ece, 0x0ee0, 0x0ee0, 0x0ee9, 0x0ee9, 0x0ef2, 0x0efb, 0x0f07, - 0x0f07, 0x0f07, 0x0f10, 0x0f1c, 0x0f28, 0x0f41, 0x0f4d, 0x0f5c, - 0x0f68, 0x0f83, 0x0f83, 0x0f83, 0x0f92, 0x0f9e, 0x0faa, 0x0fb6, - 0x0fbf, 0x0fcb, 0x0fd7, 0x0fe3, 0x0fec, 0x0fff, 0x1008, 0x1014, - // Entry 180 - 1BF - 0x1014, 0x1014, 0x1014, 0x1020, 0x1020, 0x1029, 0x1032, 0x103e, - 0x103e, 0x104e, 0x105d, 0x1066, 0x106f, 0x1078, 0x1081, 0x1081, - 0x1081, 0x108d, 0x1096, 0x10a2, 0x10ae, 0x10ba, 0x10c6, 0x10cf, - 0x10d8, 0x10e4, 0x10f0, 0x10f9, 0x1102, 0x111d, 0x112f, 0x113b, - 0x1144, 0x1153, 0x1162, 0x1168, 0x1177, 0x1183, 0x118c, 0x118c, - 0x1195, 0x11a1, 0x11ad, 0x11bc, 0x11cb, 0x11cb, 0x11d7, 0x11e6, - 0x11f5, 0x11fe, 0x120d, 0x1216, 0x1222, 0x122e, 0x123a, 0x1243, - 0x1243, 0x124f, 0x125b, 0x1264, 0x1273, 0x1273, 0x1285, 0x1291, - // Entry 1C0 - 1FF - 0x129d, 0x12af, 0x12be, 0x12cd, 0x12d9, 0x12e5, 0x12f1, 0x1306, - 0x1315, 0x1321, 0x132d, 0x133f, 0x1348, 0x1348, 0x135d, 0x135d, - 0x135d, 0x1369, 0x1369, 0x1375, 0x1375, 0x1375, 0x1381, 0x138d, - 0x139f, 0x13a8, 0x13a8, 0x13b7, 0x13c6, 0x13d5, 0x13d5, 0x13d5, - 0x13de, 0x13ea, 0x13ea, 0x13ea, 0x13ea, 0x13f6, 0x13ff, 0x140b, - 0x1414, 0x142c, 0x1438, 0x1444, 0x1450, 0x1450, 0x1459, 0x1462, - 0x146e, 0x147a, 0x147a, 0x1489, 0x1495, 0x149e, 0x149e, 0x14ad, - 0x14b9, 0x14c8, 0x14c8, 0x14d4, 0x14da, 0x14ec, 0x14f8, 0x14f8, - // Entry 200 - 23F - 0x14f8, 0x1504, 0x1513, 0x1525, 0x1537, 0x1543, 0x154c, 0x155e, - 0x156a, 0x1573, 0x1573, 0x157f, 0x1588, 0x1594, 0x15a0, 0x15b2, - 0x15c1, 0x15c1, 0x15c1, 0x15cd, 0x15d6, 0x15e2, 0x15eb, 0x15f7, - 0x1600, 0x160c, 0x160c, 0x1618, 0x1627, 0x1627, 0x1636, 0x1648, - 0x1657, 0x1657, 0x1663, 0x1663, 0x166f, 0x166f, 0x167b, 0x1687, - 0x1693, 0x169c, 0x16ae, 0x16c0, 0x16cf, 0x16db, 0x16e4, 0x16ed, - 0x16ed, 0x16f9, 0x16f9, 0x16f9, 0x1705, 0x1705, 0x170e, 0x171a, - 0x1726, 0x172f, 0x1738, 0x1747, 0x174d, 0x175c, 0x175c, 0x1765, - // Entry 240 - 27F - 0x176e, 0x1777, 0x1780, 0x178c, 0x178c, 0x1792, 0x17a1, 0x17b0, - 0x17b0, 0x17bc, 0x17da, 0x17e3, 0x17f2, 0x17fb, 0x1813, 0x1825, - 0x1834, 0x1846, 0x1846, 0x1846, 0x1846, 0x1846, 0x185e, 0x1870, - 0x1885, 0x1885, 0x1885, 0x1885, 0x1894, 0x18a0, 0x18b2, 0x18c4, - 0x18d3, 0x18ef, 0x1904, 0x1910, 0x191c, -} // Size: 1250 bytes - -const zhHantLangStr string = "" + // Size: 7573 bytes - "阿法文阿布哈茲文阿維斯塔文南非荷蘭文阿坎文阿姆哈拉文阿拉貢文阿拉伯文阿薩姆文阿瓦爾文艾馬拉文亞塞拜然文巴什喀爾文白俄羅斯文保加利亞文比斯拉馬文班" + - "巴拉文孟加拉文藏文布列塔尼文波士尼亞文加泰蘭文車臣文查莫洛文科西嘉文克里文捷克文宗教斯拉夫文楚瓦什文威爾斯文丹麥文德文迪維西文宗卡文埃維文希" + - "臘文英文世界文西班牙文愛沙尼亞文巴斯克文波斯文富拉文芬蘭文斐濟文法羅文法文西弗里西亞文愛爾蘭文蘇格蘭蓋爾文加利西亞文瓜拉尼文古吉拉特文曼島文" + - "豪撒文希伯來文印地文西里莫圖土文克羅埃西亞文海地文匈牙利文亞美尼亞文赫雷羅文國際文印尼文國際文(E)伊布文四川彝文依奴皮維克文伊多文冰島文義" + - "大利文因紐特文日文爪哇文喬治亞文剛果文吉庫尤文廣亞馬文哈薩克文格陵蘭文高棉文坎那達文韓文卡努里文喀什米爾文庫德文科米文康瓦耳文吉爾吉斯文拉丁" + - "文盧森堡文干達文林堡文林加拉文寮文立陶宛文魯巴加丹加文拉脫維亞文馬拉加什文馬紹爾文毛利文馬其頓文馬來亞拉姆文蒙古文馬拉地文馬來文馬爾他文緬甸" + - "文諾魯文北地畢列文尼泊爾文恩東加文荷蘭文耐諾斯克挪威文巴克摩挪威文南地畢列文納瓦霍文尼揚賈文奧克西坦文奧杰布瓦文奧羅莫文歐迪亞文奧塞提文旁遮" + - "普文巴利文波蘭文普什圖文葡萄牙文蓋楚瓦文羅曼斯文隆迪文羅馬尼亞文俄文盧安達文梵文撒丁文信德文北薩米文桑戈文僧伽羅文斯洛伐克文斯洛維尼亞文薩摩" + - "亞文紹納文索馬利文阿爾巴尼亞文塞爾維亞文斯瓦特文塞索托文巽他文瑞典文史瓦希里文坦米爾文泰盧固文塔吉克文泰文提格利尼亞文土庫曼文突尼西亞文東加" + - "文土耳其文特松加文韃靼文大溪地文維吾爾文烏克蘭文烏都文烏茲別克文溫達文越南文沃拉普克文瓦隆文沃洛夫文科薩文意第緒文約魯巴文壯文中文祖魯文亞齊" + - "文阿僑利文阿當莫文阿迪各文突尼斯阿拉伯文阿弗里希利文亞罕文阿伊努文阿卡德文阿拉巴馬文阿留申文蓋格阿爾巴尼亞文南阿爾泰文古英文昂加文阿拉米文馬" + - "普切文阿拉奧納文阿拉帕霍文阿爾及利亞阿拉伯文阿拉瓦克文摩洛哥阿拉伯文埃及阿拉伯文阿蘇文美國手語阿斯圖里亞文科塔瓦文阿瓦文俾路支文峇里文巴伐利" + - "亞文巴薩文巴姆穆文巴塔克托巴文戈馬拉文貝扎文別姆巴文貝塔維文貝納文富特文巴達加文西俾路支文博傑普爾文比科爾文比尼文班亞爾文康姆文錫克錫卡文比" + - "什奴普萊利亞文巴赫蒂亞里文布拉杰文布拉維文博多文阿庫色文布里阿特文布吉斯文布魯文比林文梅敦巴文卡多文加勒比文卡尤加文阿燦文宿霧文奇加文奇布查" + - "文查加文處奇斯文馬里文契奴克文喬克托文奇佩瓦揚文柴羅基文沙伊安文中庫德文科普特文卡皮茲文土耳其文(克里米亞半島)塞席爾克里奧爾法文卡舒布文達" + - "科他文達爾格瓦文台塔文德拉瓦文斯拉夫多格里布文丁卡文扎爾馬文多格來文下索布文中部杜順文杜亞拉文中古荷蘭文朱拉文迪尤拉文達薩文恩布文埃菲克文埃" + - "米利安文古埃及文艾卡朱克文埃蘭文中古英文中尤皮克文依汪都文埃斯特雷馬杜拉文芳族文菲律賓文托爾訥芬蘭文豐文卡真法文中古法文古法文法蘭克-普羅旺" + - "斯文北弗里西亞文東弗里西亞文弗留利文加族文加告茲文贛語加約文葛巴亞文索羅亞斯德教達里文吉茲文吉爾伯特群島文吉拉基文中古高地德文古高地德文孔卡" + - "尼文岡德文科隆達羅文哥德文格列博文古希臘文德文(瑞士)瓦尤文弗拉弗拉文古西文圭契文海達文客家話夏威夷文斐濟印地文希利蓋農文赫梯文孟文上索布文" + - "湘語胡帕文伊班文伊比比奧文伊洛闊文印古什文英格里亞文牙買加克里奧爾英文邏輯文恩格姆巴文馬恰美文猶太教-波斯文猶太阿拉伯文日德蘭文卡拉卡爾帕克" + - "文卡比爾文卡琴文卡捷文卡姆巴文卡威文卡巴爾達文卡念布文卡塔布文馬孔德文卡布威爾第文肯揚文科羅文坎剛文卡西文和闐文西桑海文科瓦文北紮紮其文卡庫" + - "文卡倫金文金邦杜文科米-彼爾米亞克文貢根文科斯雷恩文克佩列文卡拉柴-包爾卡爾文塞拉利昂克裏奧爾文基那來阿文卡累利阿文庫魯科文尚巴拉文巴菲亞文" + - "科隆文庫密克文庫特奈文拉迪諾文朗吉文拉亨達文蘭巴文列茲干文新共同語言利古里亞文利伏尼亞文拉科塔文倫巴底文芒戈文洛齊文北盧爾文拉特加萊文魯巴魯" + - "魯亞文路易塞諾文盧恩達文盧奧文米佐文盧雅文文言文拉茲文馬都拉文馬法文馬加伊文邁蒂利文望加錫文曼丁哥文馬賽文馬巴文莫克沙文曼達文門德文梅魯文克" + - "里奧文(模里西斯)中古愛爾蘭文馬夸文美塔文米克馬克文米南卡堡文滿族文曼尼普爾文莫霍克文莫西文西馬里文蒙當文多種語言克里克文米蘭德斯文馬瓦里文" + - "明打威文姆耶內文厄爾茲亞文馬贊德蘭文閩南語拿波里文納馬文低地德文尼瓦爾文尼亞斯文紐埃文阿沃那加文夸西奧文恩甘澎文諾蓋文古諾爾斯文諾維亞文曼德" + - "文字 (N’Ko)北索托文努埃爾文古尼瓦爾文尼揚韋齊文尼揚科萊文尼奧囉文尼茲馬文歐塞奇文鄂圖曼土耳其文潘加辛文巴列維文潘帕嘉文帕皮阿門托文帛" + - "琉文庇卡底文奈及利亞皮欽文賓夕法尼亞德文門諾低地德文古波斯文普法爾茨德文腓尼基文皮埃蒙特文旁狄希臘文波那貝文普魯士文古普羅旺斯文基切文欽博拉" + - "索海蘭蓋丘亞文拉賈斯坦諸文復活島文拉羅通加文羅馬格諾里文里菲亞諾文蘭博文吉普賽文羅圖馬島文盧森尼亞文羅維阿納文羅馬尼亞語系羅瓦文桑達韋文雅庫" + - "特文薩瑪利亞阿拉姆文薩布魯文撒撒克文散塔利文索拉什特拉文甘拜文桑古文西西里文蘇格蘭文薩丁尼亞-薩薩里文南庫德文塞訥卡文賽納文瑟里文塞爾庫普文" + - "東桑海文古愛爾蘭文薩莫吉希亞文希爾哈文撣文阿拉伯文(查德)希達摩文下西利西亞文塞拉亞文南薩米文魯勒薩米文伊納里薩米文斯科特薩米文索尼基文索格" + - "底亞納文蘇拉南東墎文塞雷爾文薩霍文沙特菲士蘭文蘇庫馬文蘇蘇文蘇美文葛摩文古敘利亞文敘利亞文西利西亞文圖盧文提姆文特索文泰雷諾文泰頓文蒂格雷文" + - "提夫文托克勞文查庫爾文克林貢文特林基特文塔里什文塔馬奇克文東加文(尼亞薩)托比辛文圖羅尤文太魯閣文特薩克尼恩文欽西安文穆斯林塔特文圖姆布卡文" + - "吐瓦魯文北桑海文圖瓦文中阿特拉斯塔馬塞特文烏德穆爾特文烏加列文姆本杜文根語言瓦伊文威尼斯文維普森文西佛蘭德文美茵-法蘭克尼亞文沃提克文佛羅文" + - "溫舊文瓦爾瑟文瓦拉莫文瓦瑞文瓦紹文沃皮瑞文吳語卡爾梅克文明格列爾文索加文瑤文雅浦文洋卞文耶姆巴文奈恩加圖文粵語薩波特克文布列斯符號西蘭文澤納" + - "加文標準摩洛哥塔馬塞特文祖尼文無語言內容扎扎文現代標準阿拉伯文高地德文(瑞士)低地薩克遜文佛蘭芒文摩爾多瓦文塞爾維亞克羅埃西亞文史瓦希里文(" + - "剛果)簡體中文繁體中文" - -var zhHantLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0018, 0x0027, 0x0036, 0x003f, 0x004e, 0x005a, - 0x0066, 0x0072, 0x007e, 0x008a, 0x0099, 0x00a8, 0x00b7, 0x00c6, - 0x00d5, 0x00e1, 0x00ed, 0x00f3, 0x0102, 0x0111, 0x011d, 0x0126, - 0x0132, 0x013e, 0x0147, 0x0150, 0x0162, 0x016e, 0x017a, 0x0183, - 0x0189, 0x0195, 0x019e, 0x01a7, 0x01b0, 0x01b6, 0x01bf, 0x01cb, - 0x01da, 0x01e6, 0x01ef, 0x01f8, 0x0201, 0x020a, 0x0213, 0x0219, - 0x022b, 0x0237, 0x0249, 0x0258, 0x0264, 0x0273, 0x027c, 0x0285, - 0x0291, 0x029a, 0x02ac, 0x02be, 0x02c7, 0x02d3, 0x02e2, 0x02ee, - // Entry 40 - 7F - 0x02f7, 0x0300, 0x0310, 0x0319, 0x0325, 0x0337, 0x0340, 0x0349, - 0x0355, 0x0361, 0x0367, 0x0370, 0x037c, 0x0385, 0x0391, 0x039d, - 0x03a9, 0x03b5, 0x03be, 0x03ca, 0x03d0, 0x03dc, 0x03eb, 0x03f4, - 0x03fd, 0x0409, 0x0418, 0x0421, 0x042d, 0x0436, 0x043f, 0x044b, - 0x0451, 0x045d, 0x046f, 0x047e, 0x048d, 0x0499, 0x04a2, 0x04ae, - 0x04c0, 0x04c9, 0x04d5, 0x04de, 0x04ea, 0x04f3, 0x04fc, 0x050b, - 0x0517, 0x0523, 0x052c, 0x0541, 0x0553, 0x0562, 0x056e, 0x057a, - 0x0589, 0x0598, 0x05a4, 0x05b0, 0x05bc, 0x05c8, 0x05d1, 0x05da, - // Entry 80 - BF - 0x05e6, 0x05f2, 0x05fe, 0x060a, 0x0613, 0x0622, 0x0628, 0x0634, - 0x063a, 0x0643, 0x064c, 0x0658, 0x0661, 0x066d, 0x067c, 0x068e, - 0x069a, 0x06a3, 0x06af, 0x06c1, 0x06d0, 0x06dc, 0x06e8, 0x06f1, - 0x06fa, 0x0709, 0x0715, 0x0721, 0x072d, 0x0733, 0x0745, 0x0751, - 0x0760, 0x0769, 0x0775, 0x0781, 0x078a, 0x0796, 0x07a2, 0x07ae, - 0x07b7, 0x07c6, 0x07cf, 0x07d8, 0x07e7, 0x07f0, 0x07fc, 0x0805, - 0x0811, 0x081d, 0x0823, 0x0829, 0x0832, 0x083b, 0x0847, 0x0853, - 0x085f, 0x0874, 0x0886, 0x088f, 0x089b, 0x08a7, 0x08b6, 0x08c2, - // Entry C0 - FF - 0x08da, 0x08e9, 0x08f2, 0x08fb, 0x0907, 0x0913, 0x0922, 0x0931, - 0x094c, 0x094c, 0x095b, 0x0970, 0x0982, 0x098b, 0x0997, 0x09a9, - 0x09b5, 0x09be, 0x09ca, 0x09d3, 0x09e2, 0x09eb, 0x09f7, 0x0a09, - 0x0a15, 0x0a1e, 0x0a2a, 0x0a36, 0x0a3f, 0x0a48, 0x0a54, 0x0a63, - 0x0a72, 0x0a7e, 0x0a87, 0x0a93, 0x0a9c, 0x0aab, 0x0ac3, 0x0ad5, - 0x0ae1, 0x0aed, 0x0af6, 0x0b02, 0x0b11, 0x0b1d, 0x0b26, 0x0b2f, - 0x0b3b, 0x0b44, 0x0b50, 0x0b5c, 0x0b65, 0x0b6e, 0x0b77, 0x0b83, - 0x0b8c, 0x0b98, 0x0ba1, 0x0bad, 0x0bb9, 0x0bc8, 0x0bd4, 0x0be0, - // Entry 100 - 13F - 0x0bec, 0x0bf8, 0x0c04, 0x0c28, 0x0c43, 0x0c4f, 0x0c5b, 0x0c6a, - 0x0c73, 0x0c7f, 0x0c88, 0x0c97, 0x0ca0, 0x0cac, 0x0cb8, 0x0cc4, - 0x0cd3, 0x0cdf, 0x0cee, 0x0cf7, 0x0d03, 0x0d0c, 0x0d15, 0x0d21, - 0x0d30, 0x0d3c, 0x0d4b, 0x0d54, 0x0d60, 0x0d6f, 0x0d7b, 0x0d93, - 0x0d9c, 0x0da8, 0x0dba, 0x0dc0, 0x0dcc, 0x0dd8, 0x0de1, 0x0dfa, - 0x0e0c, 0x0e1e, 0x0e2a, 0x0e33, 0x0e3f, 0x0e45, 0x0e4e, 0x0e5a, - 0x0e75, 0x0e7e, 0x0e93, 0x0e9f, 0x0eb1, 0x0ec0, 0x0ecc, 0x0ed5, - 0x0ee4, 0x0eed, 0x0ef9, 0x0f05, 0x0f17, 0x0f20, 0x0f2f, 0x0f38, - // Entry 140 - 17F - 0x0f41, 0x0f4a, 0x0f53, 0x0f5f, 0x0f6e, 0x0f7d, 0x0f86, 0x0f8c, - 0x0f98, 0x0f9e, 0x0fa7, 0x0fb0, 0x0fbf, 0x0fcb, 0x0fd7, 0x0fe6, - 0x1001, 0x100a, 0x1019, 0x1025, 0x1038, 0x104a, 0x1056, 0x106b, - 0x1077, 0x1080, 0x1089, 0x1095, 0x109e, 0x10ad, 0x10b9, 0x10c5, - 0x10d1, 0x10e3, 0x10ec, 0x10f5, 0x10fe, 0x1107, 0x1110, 0x111c, - 0x1125, 0x1134, 0x113d, 0x1149, 0x1155, 0x116e, 0x1177, 0x1186, - 0x1192, 0x11ab, 0x11c6, 0x11d5, 0x11e4, 0x11f0, 0x11fc, 0x1208, - 0x1211, 0x121d, 0x1229, 0x1235, 0x123e, 0x124a, 0x1253, 0x125f, - // Entry 180 - 1BF - 0x126e, 0x127d, 0x128c, 0x1298, 0x12a4, 0x12ad, 0x12b6, 0x12c2, - 0x12d1, 0x12e3, 0x12f2, 0x12fe, 0x1307, 0x1310, 0x1319, 0x1322, - 0x132b, 0x1337, 0x1340, 0x134c, 0x1358, 0x1364, 0x1370, 0x1379, - 0x1382, 0x138e, 0x1397, 0x13a0, 0x13a9, 0x13c7, 0x13d9, 0x13e2, - 0x13eb, 0x13fa, 0x1409, 0x1412, 0x1421, 0x142d, 0x1436, 0x1442, - 0x144b, 0x1457, 0x1463, 0x1472, 0x147e, 0x148a, 0x1496, 0x14a5, - 0x14b4, 0x14bd, 0x14c9, 0x14d2, 0x14de, 0x14ea, 0x14f6, 0x14ff, - 0x150e, 0x151a, 0x1526, 0x152f, 0x153e, 0x154a, 0x155f, 0x156b, - // Entry 1C0 - 1FF - 0x1577, 0x1586, 0x1595, 0x15a4, 0x15b0, 0x15bc, 0x15c8, 0x15dd, - 0x15e9, 0x15f5, 0x1601, 0x1613, 0x161c, 0x1628, 0x163d, 0x1652, - 0x1664, 0x1670, 0x1682, 0x168e, 0x169d, 0x16ac, 0x16b8, 0x16c4, - 0x16d6, 0x16df, 0x16fd, 0x170f, 0x171b, 0x172a, 0x173c, 0x174b, - 0x1754, 0x1760, 0x176f, 0x177e, 0x178d, 0x179f, 0x17a8, 0x17b4, - 0x17c0, 0x17d8, 0x17e4, 0x17f0, 0x17fc, 0x180e, 0x1817, 0x1820, - 0x182c, 0x1838, 0x1851, 0x185d, 0x1869, 0x1872, 0x187b, 0x188a, - 0x1896, 0x18a5, 0x18b7, 0x18c3, 0x18c9, 0x18e1, 0x18ed, 0x18ff, - // Entry 200 - 23F - 0x190b, 0x1917, 0x1926, 0x1938, 0x194a, 0x1956, 0x1968, 0x197a, - 0x1986, 0x198f, 0x19a1, 0x19ad, 0x19b6, 0x19bf, 0x19c8, 0x19d7, - 0x19e3, 0x19f2, 0x19fb, 0x1a04, 0x1a0d, 0x1a19, 0x1a22, 0x1a2e, - 0x1a37, 0x1a43, 0x1a4f, 0x1a5b, 0x1a6a, 0x1a76, 0x1a85, 0x1a9d, - 0x1aa9, 0x1ab5, 0x1ac1, 0x1ad3, 0x1adf, 0x1af1, 0x1b00, 0x1b0c, - 0x1b18, 0x1b21, 0x1b3f, 0x1b51, 0x1b5d, 0x1b69, 0x1b72, 0x1b7b, - 0x1b87, 0x1b93, 0x1ba2, 0x1bbb, 0x1bc7, 0x1bd0, 0x1bd9, 0x1be5, - 0x1bf1, 0x1bfa, 0x1c03, 0x1c0f, 0x1c15, 0x1c24, 0x1c33, 0x1c3c, - // Entry 240 - 27F - 0x1c42, 0x1c4b, 0x1c54, 0x1c60, 0x1c6f, 0x1c75, 0x1c84, 0x1c93, - 0x1c9c, 0x1ca8, 0x1cc6, 0x1ccf, 0x1cde, 0x1ce7, 0x1cff, 0x1cff, - 0x1cff, 0x1d17, 0x1d17, 0x1d17, 0x1d17, 0x1d17, 0x1d17, 0x1d17, - 0x1d17, 0x1d17, 0x1d17, 0x1d17, 0x1d29, 0x1d35, 0x1d35, 0x1d35, - 0x1d44, 0x1d62, 0x1d7d, 0x1d89, 0x1d95, -} // Size: 1250 bytes - -const zuLangStr string = "" + // Size: 4670 bytes - "isi-Afarisi-Abkhaziani-Afrikaansisi-Akanisi-Amharicisi-Aragoneseisi-Arab" + - "icisi-Assameseisi-Avaricisi-Aymaraisi-Azerbaijaniisi-Bashkirisi-Belarusi" + - "anisi-Bulgarii-Bislamaisi-Bambaraisi-Bengaliisi-Tibetanisi-Bretonisi-Bos" + - "nianisi-Catalanisi-Chechenisi-Chamorroisi-Corsicanisi-Czechisi-Church Sl" + - "avicisi-Chuvashisi-Welshisi-Danishisi-Germanisi-Divehiisi-Dzongkhaisi-Ew" + - "eisi-Greeki-Englishisi-Esperantoisi-Spanishisi-Estoniaisi-Basqueisi-Pers" + - "ianisi-Fulahisi-Finnishisi-Fijianisi-Faroeseisi-Frenchisi-Western Frisia" + - "nisi-Irishi-Scottish Gaelicisi-Galiciaisi-Guaraniisi-Gujaratiisi-Manxisi" + - "-Hausaisi-Hebrewisi-Hindiisi-Croatianisi-Haitianisi-Hungarianisi-Armenia" + - "isi-Hereroizilimi ezihlangeneisi-Indonesianizimiliisi-Igboisi-Sichuan Yi" + - "isi-Idoisi-Icelandicisi-Italianisi-Inuktitutisi-Japaneseisi-Javaneseisi-" + - "Georgianisi-Kongoisi-Kikuyuisi-Kuanyamaisi-Kazakhisi-Kalaallisutisi-Khme" + - "risi-Kannadaisi-Koreanisi-Kanuriisi-Kashmiriisi-Kurdishisi-Komiisi-Corni" + - "shisi-Kyrgyzisi-Latinisi-Luxembourgishisi-Gandaisi-Limburgishisi-Lingala" + - "i-Laoisi-Lithuanianisi-Luba-Katangaisi-Latvianisi-Malagasyisi-Marshalles" + - "eisi-Maoriisi-Macedonianisi-Malayalamisi-Mongolianisi-Marathiisi-Malayis" + - "i-Malteseisi-Burmeseisi-Nauruisi-North Ndebeleisi-Nepaliisi-Ndongaisi-Du" + - "tchi-Norwegian Nynorskisi-Norwegian Bokmåli-South Ndebeleisi-Navajoisi-N" + - "yanjaisi-Occitani-Oromoisi-Odiaisi-Osseticisi-Punjabiisi-Polishisi-Pasht" + - "oisi-Portugueseisi-Quechuaisi-Romanshisi-Rundiisi-Romanianisi-Russianisi" + - "-Kinyarwandaisi-Sanskriti-Sardinianisi-Sindhiisi-Northern Samiisi-Sangoi" + - "-Sinhalaisi-Slovakisi-Slovenianisi-SamoanisiShonaisi-Somaliisi-Albaniais" + - "i-SerbianisiSwatiisiSuthuisi-Sundaneseisi-SwedishisiSwahiliisi-Tamilisi-" + - "Teluguisi-Tajikisi-Thaiisi-Tigrinyaisi-Turkmenisi-Tswanaisi-Tonganisi-Tu" + - "rkishisi-Tsongaisi-Tatarisi-Tahitianisi-Uighurisi-Ukrainianisi-Urduisi-U" + - "zbekisi-Vendaisi-Vietnameseisi-Volapükisi-Walloonisi-WolofisiXhosaisi-Yi" + - "ddishisi-Yorubaisi-ChineseisiZuluisi-Achineseisi-Acoliisi-Adangmeisi-Ady" + - "gheisi-Aghemisi-Ainuisi-Aleuti-Southern Altaiisi-Angikaisi-Mapucheisi-Ar" + - "apahoisi-Asuisi-Asturianisi-Awadhiisi-Balineseisi-Basaaisi-Bembaisi-Bena" + - "isi-Western Balochiisi-Bhojpurii-Binii-Siksikaisi-Bodoisi-Buginesei-Blin" + - "isi-Cebuanoisi-Chigaisi-Chuukeseisi-Mariisi-Choctawisi-Cherokeeisi-Cheye" + - "nneisi-Central Kurdishi-Seselwa Creole Frenchisi-Dakotaisi-Dargwaisi-Tai" + - "taisi-Dogribisi-Zarmaisi-Lower Sorbianisi-Dualaisi-Jola-Fonyiisi-Dazagai" + - "si-Embuisi-Efikisi-Ekajukisi-Ewondoisi-Filipinoisi-Fonisi-Friulianisi-Ga" + - "isi-Gagauzisi-Gan Chineseisi-Geezisi-Gilberteseisi-Gorontaloisi-Swiss Ge" + - "rmanisi-Gusliisi-Gwichʼinisi-Hakka Chineseisi-Hawaiianisi-Hiligaynonisi-" + - "Hmongisi-Upper Sorbianisi-Xiang Chineseisi-Hupaisi-Ibanisi-Ibibioisi-Ilo" + - "koisi-Ingushisi-Lojbanisi-Ngombaisi-Machameisi-Kabyleisi-Kachinisi-Jjuis" + - "i-Kambaisi-Kabardianisi-Tyapisi-Makondeisi-Kabuverdianuisi-Koroisi-Khasi" + - "isi-Koyra Chiiniisi-Kakoisi-Kalenjinisi-Kimbunduisi-Komi-Permyakisi-Konk" + - "aniisi-Kpelleisi-Karachay-Balkarisi-Karelianisi-KurukhisiShambalaisi-Baf" + - "iaisi-Colognianisi-Kumykisi-Ladinoisi-Langiisi-Lezghianisi-Lakotaisi-Loz" + - "iisi-Northern Luriisi-Luba-Luluaisi-Lundaisi-Luoisi-Mizoisi-Luyiaisi-Mad" + - "ureseisi-Magahiisi-Maithiliisi-Makasarisi-Masaiisi-Mokshaisi-Mendeisi-Me" + - "ruisi-Morisyenisi-Makhuwa-Meettoisi-Meta’isi-Micmacisi-Minangkabauisi-Ma" + - "nipuriisi-Mohawkisi-Mossiisi-Mundangizilimi ezehlukeneisi-Creekisi-Miran" + - "deseisi-Erzyaisi-Mazanderaniisi-Min Nan Chineseisi-Neapolitanisi-Namaisi" + - "-Low Germanisi-Newariisi-Niasisi-Niueanisi-Kwasioisi-Ngiemboonisi-Nogaii" + - "si-N’Koisi-Northern Sothoisi-Nuerisi-Nyankoleisi-Pangasinanisi-Pampangai" + - "si-Papiamentoisi-Palauanisi-Nigerian Pidginisi-Prussianisi-Kʼicheʼi-Rapa" + - "nuii-Rarotonganisi-Romboisi-Aromanianisi-Rwai-Sandawei-Sakhaisi-Samburui" + - "-Santaliisi-Ngambayisi-Sangui-Siciliani-Scotsi-Southern Kurdishisi-Senai" + - "si-Koyraboro Senniisi-Tachelhiti-Shani-Southern Samiisi-Lule Samiisi-Ina" + - "ri Samiisi-Skolt Samii-Soninkei-Sranan Tongoi-Sahoi-Sukumaisi-Comoriani-" + - "Syriacisi-Timneisi-Tesoisi-Tetumisi-Tigreisi-Klingonisi-Tok Pisinisi-Tar" + - "okoisi-Tumbukaisi-Tuvaluisi-Tasawaqisi-Tuvinianisi-Central Atlas Tamazig" + - "htisi-Udmurtisi-Umbundui-Rootisi-VaiisiVunjoisi-Walserisi-Wolayttaisi-Wa" + - "rayisi-Warlpiriisi-Wu Chineseisi-Kalmykisi-Sogaisi-Yangbenisi-Yembaisi-C" + - "antoneseisi-Moroccan Tamazight esivamileisi-Zuniakukho okuqukethwe kolim" + - "iisi-Zazaisi-Arabic esivamile sesimanjeisi-Austrian Germani-Swiss High G" + - "ermanisi-Austrillian Englishi-Canadian Englishi-British Englishi-America" + - "n Englishisi-Latin American Spanishi-European Spanishi-Mexican Spanishi-" + - "Canadian Frenchi-Swiss Frenchisi-Low Saxonisi-Flemishisi-Brazillian Port" + - "ugueseisi-European Portugueseisi-Moldavianisi-Serbo-Croatianisi-Congo Sw" + - "ahiliisi-Chinese (esenziwe-lula)isi-Chinese (Okosiko)" - -var zuLangIdx = []uint16{ // 613 elements - // Entry 0 - 3F - 0x0000, 0x0008, 0x0015, 0x0015, 0x0020, 0x0028, 0x0033, 0x0040, - 0x004a, 0x0056, 0x0060, 0x006a, 0x0079, 0x0084, 0x0092, 0x009d, - 0x00a6, 0x00b1, 0x00bc, 0x00c7, 0x00d1, 0x00dc, 0x00e7, 0x00f2, - 0x00fe, 0x010a, 0x010a, 0x0113, 0x0124, 0x012f, 0x0138, 0x0142, - 0x014c, 0x0156, 0x0162, 0x0169, 0x0172, 0x017b, 0x0188, 0x0193, - 0x019e, 0x01a8, 0x01b3, 0x01bc, 0x01c7, 0x01d1, 0x01dc, 0x01e6, - 0x01f9, 0x0202, 0x0213, 0x021e, 0x0229, 0x0235, 0x023d, 0x0246, - 0x0250, 0x0259, 0x0259, 0x0265, 0x0270, 0x027d, 0x0288, 0x0292, - // Entry 40 - 7F - 0x02a5, 0x02b3, 0x02ba, 0x02c2, 0x02d0, 0x02d0, 0x02d7, 0x02e4, - 0x02ef, 0x02fc, 0x0308, 0x0314, 0x0320, 0x0329, 0x0333, 0x033f, - 0x0349, 0x0358, 0x0361, 0x036c, 0x0376, 0x0380, 0x038c, 0x0397, - 0x039f, 0x03aa, 0x03b4, 0x03bd, 0x03ce, 0x03d7, 0x03e5, 0x03f0, - 0x03f5, 0x0403, 0x0413, 0x041e, 0x042a, 0x0439, 0x0442, 0x0450, - 0x045d, 0x046a, 0x0475, 0x047e, 0x0489, 0x0494, 0x049d, 0x04ae, - 0x04b8, 0x04c2, 0x04cb, 0x04de, 0x04f3, 0x0502, 0x050c, 0x0516, - 0x0521, 0x0521, 0x0528, 0x0530, 0x053b, 0x0546, 0x0546, 0x0550, - // Entry 80 - BF - 0x055a, 0x0568, 0x0573, 0x057e, 0x0587, 0x0593, 0x059e, 0x05ad, - 0x05b9, 0x05c4, 0x05ce, 0x05df, 0x05e8, 0x05f1, 0x05fb, 0x0608, - 0x0612, 0x061a, 0x0624, 0x062f, 0x063a, 0x0642, 0x064a, 0x0657, - 0x0662, 0x066c, 0x0675, 0x067f, 0x0688, 0x0690, 0x069c, 0x06a7, - 0x06b1, 0x06bb, 0x06c6, 0x06d0, 0x06d9, 0x06e5, 0x06ef, 0x06fc, - 0x0704, 0x070d, 0x0716, 0x0724, 0x0730, 0x073b, 0x0744, 0x074c, - 0x0757, 0x0761, 0x0761, 0x076c, 0x0773, 0x077f, 0x0788, 0x0793, - 0x079d, 0x079d, 0x079d, 0x07a6, 0x07ae, 0x07ae, 0x07ae, 0x07b7, - // Entry C0 - FF - 0x07b7, 0x07c7, 0x07c7, 0x07d1, 0x07d1, 0x07dc, 0x07dc, 0x07e7, - 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07ee, 0x07ee, 0x07fa, - 0x07fa, 0x0804, 0x0804, 0x0810, 0x0810, 0x0819, 0x0819, 0x0819, - 0x0819, 0x0819, 0x0822, 0x0822, 0x082a, 0x082a, 0x082a, 0x083d, - 0x0849, 0x0849, 0x084f, 0x084f, 0x084f, 0x0858, 0x0858, 0x0858, - 0x0858, 0x0858, 0x0860, 0x0860, 0x0860, 0x086c, 0x086c, 0x0872, - 0x0872, 0x0872, 0x0872, 0x0872, 0x0872, 0x087d, 0x0886, 0x0886, - 0x0886, 0x0892, 0x089a, 0x089a, 0x08a5, 0x08a5, 0x08b1, 0x08bd, - // Entry 100 - 13F - 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08e7, 0x08e7, 0x08f1, 0x08fb, - 0x0904, 0x0904, 0x0904, 0x090e, 0x090e, 0x0917, 0x0917, 0x0928, - 0x0928, 0x0931, 0x0931, 0x093f, 0x093f, 0x0949, 0x0951, 0x0959, - 0x0959, 0x0959, 0x0963, 0x0963, 0x0963, 0x0963, 0x096d, 0x096d, - 0x096d, 0x0979, 0x0979, 0x0980, 0x0980, 0x0980, 0x0980, 0x0980, - 0x0980, 0x0980, 0x098c, 0x0992, 0x099c, 0x09ab, 0x09ab, 0x09ab, - 0x09ab, 0x09b3, 0x09c1, 0x09c1, 0x09c1, 0x09c1, 0x09c1, 0x09c1, - 0x09ce, 0x09ce, 0x09ce, 0x09ce, 0x09de, 0x09de, 0x09de, 0x09e7, - // Entry 140 - 17F - 0x09f4, 0x09f4, 0x0a05, 0x0a11, 0x0a11, 0x0a1f, 0x0a1f, 0x0a28, - 0x0a39, 0x0a4a, 0x0a52, 0x0a5a, 0x0a64, 0x0a6d, 0x0a77, 0x0a77, - 0x0a77, 0x0a81, 0x0a8b, 0x0a96, 0x0a96, 0x0a96, 0x0a96, 0x0a96, - 0x0aa0, 0x0aaa, 0x0ab1, 0x0aba, 0x0aba, 0x0ac7, 0x0ac7, 0x0acf, - 0x0ada, 0x0aea, 0x0aea, 0x0af2, 0x0af2, 0x0afb, 0x0afb, 0x0b0b, - 0x0b0b, 0x0b0b, 0x0b13, 0x0b1f, 0x0b2b, 0x0b3b, 0x0b46, 0x0b46, - 0x0b50, 0x0b63, 0x0b63, 0x0b63, 0x0b6f, 0x0b79, 0x0b84, 0x0b8d, - 0x0b9a, 0x0ba3, 0x0ba3, 0x0bad, 0x0bb6, 0x0bb6, 0x0bb6, 0x0bc2, - // Entry 180 - 1BF - 0x0bc2, 0x0bc2, 0x0bc2, 0x0bcc, 0x0bcc, 0x0bcc, 0x0bd4, 0x0be5, - 0x0be5, 0x0bf3, 0x0bf3, 0x0bfc, 0x0c03, 0x0c0b, 0x0c14, 0x0c14, - 0x0c14, 0x0c20, 0x0c20, 0x0c2a, 0x0c36, 0x0c41, 0x0c41, 0x0c4a, - 0x0c4a, 0x0c54, 0x0c54, 0x0c5d, 0x0c65, 0x0c71, 0x0c71, 0x0c83, - 0x0c8e, 0x0c98, 0x0ca7, 0x0ca7, 0x0cb3, 0x0cbd, 0x0cc6, 0x0cc6, - 0x0cd1, 0x0ce3, 0x0cec, 0x0cf9, 0x0cf9, 0x0cf9, 0x0cf9, 0x0d02, - 0x0d11, 0x0d24, 0x0d32, 0x0d3a, 0x0d48, 0x0d52, 0x0d5a, 0x0d64, - 0x0d64, 0x0d6e, 0x0d7b, 0x0d84, 0x0d84, 0x0d84, 0x0d8e, 0x0da0, - // Entry 1C0 - 1FF - 0x0da8, 0x0da8, 0x0da8, 0x0db4, 0x0db4, 0x0db4, 0x0db4, 0x0db4, - 0x0dc2, 0x0dc2, 0x0dce, 0x0ddc, 0x0de7, 0x0de7, 0x0dfa, 0x0dfa, - 0x0dfa, 0x0dfa, 0x0dfa, 0x0dfa, 0x0dfa, 0x0dfa, 0x0dfa, 0x0e06, - 0x0e06, 0x0e13, 0x0e13, 0x0e13, 0x0e1c, 0x0e28, 0x0e28, 0x0e28, - 0x0e31, 0x0e31, 0x0e31, 0x0e31, 0x0e31, 0x0e3e, 0x0e45, 0x0e4e, - 0x0e55, 0x0e55, 0x0e60, 0x0e60, 0x0e69, 0x0e69, 0x0e74, 0x0e7d, - 0x0e87, 0x0e8e, 0x0e8e, 0x0ea0, 0x0ea0, 0x0ea8, 0x0ea8, 0x0ea8, - 0x0ebb, 0x0ebb, 0x0ebb, 0x0ec8, 0x0ece, 0x0ece, 0x0ece, 0x0ece, - // Entry 200 - 23F - 0x0ece, 0x0edd, 0x0eea, 0x0ef8, 0x0f06, 0x0f0f, 0x0f0f, 0x0f1d, - 0x0f1d, 0x0f23, 0x0f23, 0x0f2b, 0x0f2b, 0x0f2b, 0x0f37, 0x0f37, - 0x0f3f, 0x0f3f, 0x0f3f, 0x0f48, 0x0f50, 0x0f50, 0x0f59, 0x0f62, - 0x0f62, 0x0f62, 0x0f62, 0x0f6d, 0x0f6d, 0x0f6d, 0x0f6d, 0x0f6d, - 0x0f7a, 0x0f7a, 0x0f84, 0x0f84, 0x0f84, 0x0f84, 0x0f8f, 0x0f99, - 0x0fa4, 0x0fb0, 0x0fcb, 0x0fd5, 0x0fd5, 0x0fe0, 0x0fe6, 0x0fed, - 0x0fed, 0x0fed, 0x0fed, 0x0fed, 0x0fed, 0x0fed, 0x0ff5, 0x0fff, - 0x100b, 0x1014, 0x1014, 0x1020, 0x102e, 0x1038, 0x1038, 0x1040, - // Entry 240 - 27F - 0x1040, 0x1040, 0x104b, 0x1054, 0x1054, 0x1061, 0x1061, 0x1061, - 0x1061, 0x1061, 0x1081, 0x1089, 0x10a2, 0x10aa, 0x10c8, 0x10c8, - 0x10db, 0x10ee, 0x1105, 0x1117, 0x1128, 0x113a, 0x1154, 0x1166, - 0x1177, 0x1177, 0x1188, 0x1196, 0x11a3, 0x11ae, 0x11c7, 0x11de, - 0x11eb, 0x11fd, 0x120e, 0x1229, 0x123e, -} // Size: 1250 bytes - -// Total size for lang: 1022818 bytes (1022 KB) - -// Number of keys: 175 -var ( - scriptIndex = tagIndex{ - "", - "", - "AdlmAfakAghbAhomArabArmiArmnAvstBaliBamuBassBatkBengBhksBlisBopoBrahBrai" + - "BugiBuhdCakmCansCariChamCherCirtCoptCprtCyrlCyrsDevaDsrtDuplEgydEgyh" + - "EgypElbaEthiGeokGeorGlagGothGranGrekGujrGuruHanbHangHaniHanoHansHant" + - "HatrHebrHiraHluwHmngHrktHungIndsItalJamoJavaJpanJurcKaliKanaKharKhmr" + - "KhojKndaKoreKpelKthiLanaLaooLatfLatgLatnLepcLimbLinaLinbLisuLomaLyci" + - "LydiMahjMandManiMarcMayaMendMercMeroMlymModiMongMoonMrooMteiMultMymr" + - "NarbNbatNewaNkgbNkooNshuOgamOlckOrkhOryaOsgeOsmaPalmPaucPermPhagPhli" + - "PhlpPhlvPhnxPlrdPrtiRjngRoroRunrSamrSaraSarbSaurSgnwShawShrdSiddSind" + - "SinhSoraSundSyloSyrcSyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTeluTeng" + - "TfngTglgThaaThaiTibtTirhUgarVaiiVispWaraWoleXpeoXsuxYiiiZinhZmthZsye" + - "ZsymZxxxZyyyZzzz", - } -) - -var scriptHeaders = [252]header{ - { // af - afScriptStr, - afScriptIdx, - }, - {}, // agq - {}, // ak - { // am - amScriptStr, - amScriptIdx, - }, - { // ar - arScriptStr, - arScriptIdx, - }, - {}, // ar-EG - {}, // ar-LY - {}, // ar-SA - { // as - "বঙালী", - []uint16{ // 14 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000f, - }, - }, - {}, // asa - { // ast - "adlmafakacáucaso-albanésahomárabearamaicu imperialarmeniuavésticubalinés" + - "bamumbassa vahbatakbengalínbhkssímbolos de Blissbopomofobrahmibraill" + - "elontarabuhidchakmasilábicu unificáu de los nativos canadiensescariu" + - "chamcherokicirthcoptuxipriotacirílicueslavónicu cirílicu eclesiástic" + - "u antiguudevanagarialfabetu Deserettaquigrafía Duployédemóticu exipc" + - "ianuhieráticu exipcianuxeroglíficos exipcianoselbasanetíopekhutsuri " + - "xeorxanuxeorxanuglagolíticugóticugranthagrieguguyaratigurmukhihanbha" + - "ngulhanhanunó’ohan simplificáuhan tradicionalhatranuhebréuḥiraganaxe" + - "roglíficos anatoliospahawh hmongsilabarios xaponeseshúngaru antiguui" + - "ndusitálicu antiguujamoxavanésxaponésjurchenkayah likatakanakharosht" + - "hiḥemerkhojkicanaréscoreanukpellekaithilannalaosianufraktur llatínga" + - "élicu llatínllatínlepchalimbullinial Allinial Balfabetu de Fraserlo" + - "maliciulidiumahajanimandéumaniquéumarcxeroglíficos mayesmendemeroíti" + - "cu en cursivameroíticumalayalammodimongoltipos Moonmromeitei mayekmu" + - "ltanibirmanuárabe del norte antiguunabatéunewageba del naxin’konüshu" + - "oghamol chikiorkhonoriyaosgeosmanyapalmirenupau cin haupérmicu antig" + - "uuescritura ‘Phags-papahlavi d’inscripcionespahlavi de salteriupahla" + - "vi de llibrosfeniciufonéticu de Pollardpartu d’inscripcionesrejangro" + - "ngorongorunessamaritanusaratiárabe del sur antiguusaurashtraescritur" + - "a de signosshavianusharadasiddhamkhudabadicingaléssora sompengsondan" + - "éssyloti nagrisiriacusiriacu estrangelosiriacu occidentalsiriacu or" + - "ientaltagbanwatakritai letai lue nuevutamiltanguttai viettelugutengw" + - "artifinaghtagalogthaanatailandéstibetanutirhutaugaríticuvaifala visi" + - "blevarang kshitiwoleaipersa antiguucuneiforme sumeriu acadiuyiheredá" + - "uescritura matemáticaemojisímbolosnon escritucomúnescritura desconoc" + - "ida", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x0009, 0x001a, 0x001e, 0x0024, 0x0035, 0x003c, - 0x0045, 0x004d, 0x0052, 0x005b, 0x0060, 0x0069, 0x006d, 0x007f, - 0x0087, 0x008d, 0x0094, 0x009b, 0x00a0, 0x00a6, 0x00d4, 0x00d9, - 0x00dd, 0x00e4, 0x00e9, 0x00ee, 0x00f6, 0x00ff, 0x012a, 0x0134, - 0x0144, 0x0159, 0x016c, 0x0180, 0x0198, 0x019f, 0x01a6, 0x01b7, - 0x01bf, 0x01cb, 0x01d2, 0x01d9, 0x01df, 0x01e7, 0x01ef, 0x01f3, - 0x01f9, 0x01fc, 0x0207, 0x0217, 0x0226, 0x022d, 0x0234, 0x023e, - 0x0255, 0x0261, 0x0275, 0x0285, 0x028a, 0x029a, 0x029e, 0x02a6, - // Entry 40 - 7F - 0x02ae, 0x02b5, 0x02bd, 0x02c5, 0x02cf, 0x02d6, 0x02dc, 0x02e4, - 0x02eb, 0x02f1, 0x02f7, 0x02fc, 0x0304, 0x0313, 0x0323, 0x032a, - 0x0330, 0x0335, 0x033e, 0x0347, 0x0359, 0x035d, 0x0362, 0x0367, - 0x036f, 0x0376, 0x037f, 0x0383, 0x0396, 0x039b, 0x03b0, 0x03ba, - 0x03c3, 0x03c7, 0x03cd, 0x03d7, 0x03da, 0x03e6, 0x03ed, 0x03f4, - 0x040c, 0x0414, 0x0418, 0x0425, 0x042b, 0x0431, 0x0436, 0x043e, - 0x0444, 0x0449, 0x044d, 0x0454, 0x045d, 0x0468, 0x0478, 0x048d, - 0x04a6, 0x04b9, 0x04cb, 0x04d2, 0x04e6, 0x04fd, 0x0503, 0x050d, - // Entry 80 - BF - 0x0512, 0x051c, 0x0522, 0x0538, 0x0542, 0x0555, 0x055d, 0x0564, - 0x056b, 0x0574, 0x057d, 0x0589, 0x0592, 0x059e, 0x05a5, 0x05b7, - 0x05c9, 0x05d9, 0x05e1, 0x05e6, 0x05ec, 0x05f9, 0x05fe, 0x0604, - 0x060c, 0x0612, 0x0619, 0x0621, 0x0628, 0x062e, 0x0638, 0x0640, - 0x0647, 0x0651, 0x0654, 0x0660, 0x066d, 0x0673, 0x0680, 0x0699, - 0x069b, 0x06a3, 0x06b8, 0x06bd, 0x06c6, 0x06d1, 0x06d7, 0x06ec, - }, - }, - { // az - azScriptStr, - azScriptIdx, - }, - { // az-Cyrl - "Кирил", - []uint16{ // 30 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, - }, - }, - {}, // bas - { // be - "арабскаеармянскаебенгальскаебапамофашрыфт Брайлякірыліцадэванагарыэфіопс" + - "каегрузінскаегрэчаскаегуджарацігурмукхіхан з бапамофахангыльханспро" + - "шчанае хантрадыцыйнае ханяўрэйскаехіраганаяпонскія складовыя пісьмы" + - "чамояпонскаекатаканакхмерскаеканадакарэйскаелаоскаелацініцамалаялам" + - "старамангольскаем’янмарскаеорыясінгальскаетамільскаетэлугутанатайск" + - "аетыбецкаематэматычныя знакіэмодзісімвалыбеспісьменнаязвычайнаеневя" + - "домае пісьмо", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0022, - 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0038, 0x0038, 0x0038, - 0x0048, 0x0048, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, - 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x006f, 0x006f, 0x0083, - 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, 0x0095, 0x0095, - 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00bb, 0x00cd, 0x00dd, 0x00f7, - 0x0105, 0x010b, 0x010b, 0x0126, 0x0143, 0x0143, 0x0155, 0x0165, - 0x0165, 0x0165, 0x0195, 0x0195, 0x0195, 0x0195, 0x019d, 0x019d, - // Entry 40 - 7F - 0x01ad, 0x01ad, 0x01ad, 0x01bd, 0x01bd, 0x01cf, 0x01cf, 0x01db, - 0x01ed, 0x01ed, 0x01ed, 0x01ed, 0x01fb, 0x01fb, 0x01fb, 0x020b, - 0x020b, 0x020b, 0x020b, 0x020b, 0x020b, 0x020b, 0x020b, 0x020b, - 0x020b, 0x020b, 0x020b, 0x020b, 0x020b, 0x020b, 0x020b, 0x020b, - 0x021b, 0x021b, 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, 0x0252, - 0x0252, 0x0252, 0x0252, 0x0252, 0x0252, 0x0252, 0x0252, 0x0252, - 0x0252, 0x025a, 0x025a, 0x025a, 0x025a, 0x025a, 0x025a, 0x025a, - 0x025a, 0x025a, 0x025a, 0x025a, 0x025a, 0x025a, 0x025a, 0x025a, - // Entry 80 - BF - 0x025a, 0x025a, 0x025a, 0x025a, 0x025a, 0x025a, 0x025a, 0x025a, - 0x025a, 0x025a, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, - 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0284, 0x0284, - 0x0284, 0x0290, 0x0290, 0x0290, 0x0290, 0x0298, 0x02a6, 0x02b6, - 0x02b6, 0x02b6, 0x02b6, 0x02b6, 0x02b6, 0x02b6, 0x02b6, 0x02b6, - 0x02b6, 0x02b6, 0x02d9, 0x02e5, 0x02f3, 0x030d, 0x031f, 0x033e, - }, - }, - {}, // bem - {}, // bez - { // bg - bgScriptStr, - bgScriptIdx, - }, - {}, // bm - { // bn - bnScriptStr, - bnScriptIdx, - }, - {}, // bn-IN - { // bo - "རྒྱ་ཡིག་གསར་པ།རྒྱ་ཡིག་རྙིང་པ།བོད་ཡིག་སྙན་བརྒྱུད། ཡིག་རིགས་སུ་མ་བཀོད་པའི་" + - "ཟིན་ཐོ།", - []uint16{ // 174 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x002a, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - // Entry 40 - 7F - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - // Entry 80 - BF - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x006f, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00eb, - }, - }, - {}, // bo-IN - { // br - "arabekarameek impalaerelarmenianekavestekbalinekbengalibopomofoBraillebo" + - "ugiekkoptekkirillekkirillek henslavonekdevanagarihieroglifoù egiptek" + - "etiopekjorjianekglagolitekgotekgresianekgujaratigurmukhihangeulhanha" + - "n eeunaethan hengounelhebraekhiraganahieroglifoù Anatoliahenitalekja" + - "vanekjapanekkatakanakhmerkannadakoreaneklaoseklatin gouezeleklatinhi" + - "eroglifoù mayaekmalayalammongolekmyanmarogamoriyaruneksinghaleksunda" + - "neksirieksiriek Estrangelāsiriek ar C’hornôgsiriek ar Retertamilekte" + - "lougoutagalogthaanathaitibetanekougaritekvaipersek kozhnotadur jedon" + - "ielarouezioùanskrivetboutinskritur dianav", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0018, 0x0022, - 0x0029, 0x0030, 0x0030, 0x0030, 0x0030, 0x0037, 0x0037, 0x0037, - 0x003f, 0x003f, 0x0046, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x0053, 0x0053, 0x005b, 0x006f, 0x0079, - 0x0079, 0x0079, 0x0079, 0x0079, 0x008d, 0x008d, 0x0094, 0x0094, - 0x009d, 0x00a7, 0x00ac, 0x00ac, 0x00b5, 0x00bd, 0x00c5, 0x00c5, - 0x00cc, 0x00cf, 0x00cf, 0x00da, 0x00e7, 0x00e7, 0x00ee, 0x00f6, - 0x010b, 0x010b, 0x010b, 0x010b, 0x010b, 0x0114, 0x0114, 0x011b, - // Entry 40 - 7F - 0x0122, 0x0122, 0x0122, 0x012a, 0x012a, 0x012f, 0x012f, 0x0136, - 0x013e, 0x013e, 0x013e, 0x013e, 0x0144, 0x0144, 0x0153, 0x0158, - 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, - 0x0158, 0x0158, 0x0158, 0x0158, 0x016b, 0x016b, 0x016b, 0x016b, - 0x0174, 0x0174, 0x017c, 0x017c, 0x017c, 0x017c, 0x017c, 0x0183, - 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0187, 0x0187, - 0x0187, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, - 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, - // Entry 80 - BF - 0x0191, 0x0191, 0x0191, 0x0191, 0x0191, 0x0191, 0x0191, 0x0191, - 0x0191, 0x0191, 0x019a, 0x019a, 0x01a2, 0x01a2, 0x01a8, 0x01ba, - 0x01cf, 0x01de, 0x01de, 0x01de, 0x01de, 0x01de, 0x01e5, 0x01e5, - 0x01e5, 0x01ed, 0x01ed, 0x01ed, 0x01f4, 0x01fa, 0x01fe, 0x0207, - 0x0207, 0x0210, 0x0213, 0x0213, 0x0213, 0x0213, 0x021e, 0x021e, - 0x021e, 0x021e, 0x022e, 0x022e, 0x0238, 0x0241, 0x0247, 0x0255, - }, - }, - { // brx - "अरबीशहनशाही आरामाईकअर्मेनियाईअवस्तन्बालीबटकीबंगालीब्लीस चीन्हबोपोमोफोब्र" + - "ह्मीब्रेलबुगीनीबुहीदयुनीफाईड कैनेडियन अबॉरीजीनल सीलैबीक्सकारियनकॅम" + - "चिरूकीसिर्थकॉप्टसीप्रीओट्सिरिलिक्पुरानी चर्च सिरिलिक्देवनागरीदेसेर" + - "ट्मीस्री डैमोटीक्मीस्री हैरैटीक्मीस्री हैरोग्लीफ़्ईथोपियाईजोर्जीयन" + - " खुतसुरीजोर्जीयनग्लैगोलिटीकगौथीकग्रीकगुजरातीगुरमुखीहंगुलहानहानुनुसरल" + - "ीकृत हानपारम्परिक हानहिब्रूहीरागानापाहवाह ह्मौंगकाताकाना या हीरागा" + - "नापुरानी हंगैरीयनसिन्धुपुरानी इटैलियनजावानीसजापानीकायाह लीकाताकाना" + - "खरोष्टीख्मेरकन्नड़कोरियाईलानालाओफ्रैक्तुर लैटिनगैलीक लैटिनलैटिनलेप" + - "चालिम्बुलीनीयर एलीनीयर बीलीसीयनलीडीयनमांडेमानीकीमाया हीरोग्लीफ्मेर" + - "ोईटीक्मलयालम्मंगोलियाईमुन्मेतेई मयेकम्यानमार्न्गकोओगहैमओल चीकीओरखो" + - "नउड़ियाओस्मानियापुरानी पर्मीक्फाग्स पाबुक (सालटर) पहलवीफोनीशीयनपौल" + - "ार्ड़ फोनेटीकरेजेंगरोंगोरोंगोरूनिकसमारतीसरातीसौराष्ट्रसांकेतिक लेख" + - "शेवियनसिंहालीसूडानीसील्होटी नागरीसीरीआकएस्ट्रांगलो सीरीआकपश्चीमी स" + - "ीरीआकपूर्वी सीरीआकतागबानवाताई लेनया ताई लुएतमीळतेलुगुतेंगवारतीफीना" + - "ग़टागालॉगथानाथाईतिब्बतीऊगारीटीकवाईवीज़ीबल बोलीपुरानी फारसीसुमेरो अ" + - "क्काड़ी कुनेईफॉर्मयीविरासतअलिखितआमअज्ञात या अवैध लिपि", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x0037, 0x0055, - 0x006a, 0x0076, 0x0076, 0x0076, 0x0082, 0x0094, 0x0094, 0x00b3, - 0x00cb, 0x00e0, 0x00ef, 0x0101, 0x0110, 0x0110, 0x0179, 0x018b, - 0x0194, 0x01a6, 0x01b5, 0x01c4, 0x01df, 0x01f7, 0x022f, 0x0247, - 0x025c, 0x025c, 0x0287, 0x02b2, 0x02e6, 0x02e6, 0x02fe, 0x032c, - 0x0344, 0x0365, 0x0374, 0x0374, 0x0383, 0x0398, 0x03ad, 0x03ad, - 0x03bc, 0x03c5, 0x03d7, 0x03f6, 0x041b, 0x041b, 0x042d, 0x0445, - 0x0445, 0x046a, 0x04a2, 0x04cd, 0x04df, 0x0507, 0x0507, 0x051c, - // Entry 40 - 7F - 0x052e, 0x052e, 0x0544, 0x055c, 0x0571, 0x0580, 0x0580, 0x0592, - 0x05a7, 0x05a7, 0x05a7, 0x05b3, 0x05bc, 0x05e7, 0x0606, 0x0615, - 0x0624, 0x0636, 0x064c, 0x0665, 0x0665, 0x0665, 0x0677, 0x0689, - 0x0689, 0x0698, 0x06aa, 0x06aa, 0x06d5, 0x06d5, 0x06d5, 0x06f0, - 0x0705, 0x0705, 0x0720, 0x072c, 0x072c, 0x0748, 0x0748, 0x0763, - 0x0763, 0x0763, 0x0763, 0x0763, 0x0772, 0x0772, 0x0781, 0x0794, - 0x07a3, 0x07b5, 0x07b5, 0x07d0, 0x07d0, 0x07d0, 0x07f8, 0x080e, - 0x080e, 0x080e, 0x0839, 0x0851, 0x087f, 0x087f, 0x0891, 0x08af, - // Entry 80 - BF - 0x08be, 0x08d0, 0x08df, 0x08df, 0x08fa, 0x091c, 0x092e, 0x092e, - 0x092e, 0x092e, 0x0943, 0x0943, 0x0955, 0x097d, 0x098f, 0x09c3, - 0x09eb, 0x0a10, 0x0a28, 0x0a28, 0x0a38, 0x0a55, 0x0a61, 0x0a61, - 0x0a61, 0x0a73, 0x0a88, 0x0aa0, 0x0ab5, 0x0ac1, 0x0aca, 0x0adf, - 0x0adf, 0x0af7, 0x0b00, 0x0b22, 0x0b22, 0x0b22, 0x0b44, 0x0b8e, - 0x0b94, 0x0ba6, 0x0ba6, 0x0ba6, 0x0ba6, 0x0bb8, 0x0bbe, 0x0bf1, - }, - }, - { // bs - "arapsko pismoimperijsko aramejsko pismoarmensko pismoavestansko pismobal" + - "ijsko pismobatak pismobengalsko pismoblisimbolično pismobopomofo pis" + - "mobramansko pismobrajevo pismobuginsko pismobuhidsko pismočakmansko " + - "pismoUjedinjeni kanadski aboridžinski silabicikarijsko pismočamsko p" + - "ismočerokicirt pismokoptičko pismokiparsko pismoćirilicaStaroslovens" + - "ka crkvena ćirilicadevanagari pismodezeretegipatsko narodno pismoegi" + - "patsko hijeratsko pismoegipatski hijeroglifietiopsko pismogruzijsko " + - "khutsuri pismogruzijsko pismoglagoljicagotikagrčko pismogudžarati pi" + - "smogurmuki pismohanb pismohangul pismohan pismohanuno pismopojednost" + - "avljeno han pismotradicionalno han pismohebrejsko pismohiraganapahaw" + - "h hmong pismokatakana ili hiraganaStaromađarsko pismoinduško ismosta" + - "ro italsko pismojamojavansko pismojapansko pismokajah li pismokataka" + - "nakarošti pismokmersko pismokanada pismokorejsko pismokaićansko pism" + - "olanna pismolaosko pismolatinica (fraktur varijanta)galska latinical" + - "atinicalepča pismolimbu pismolinearno A pismolinearno B pismolisijsk" + - "o pismolidijsko pismomandeansko pismomanihejsko pismomajanski hijero" + - "glifimeroitik pismomalajalamsko pismomongolsko pismomesečevo pismome" + - "itei majek pismomijanmarsko pismon’ko pismoogham pismool čiki pismoo" + - "rkhon pismoorija pismoosmanja pismostaro permiksko pismophags-pa pis" + - "mopisani pahlavipsalter pahlavipahlavi pismofeničansko pismopolard f" + - "onetsko pismopisani partianrejang pismorongorongo pismorunsko pismos" + - "amaritansko pismosarati pismosauraštra pismoznakovno pismošavian pis" + - "mosinhala pismosiloti nagri pismosirijsko pismosirijsko estrangelo p" + - "ismozapadnosirijsko pismopismo istočne Sirijetagbanva pismotai le pi" + - "smonovo tai lue pismotamilsko pismotai viet pismotelugu pismotengvar" + - " pismotifinag pismotagalogtana pismotajlandsko pismotibetansko pismo" + - "ugaritsko pismovai pismovidljivi govorstaropersijsko pismosumersko-a" + - "kadsko kuneiform pismoji pismonasledno pismomatematička notacijaemoj" + - "i sličicesimbolinepisani jezikzajedničko pismonepoznato pismo", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000d, 0x0027, 0x0035, - 0x0045, 0x0053, 0x0053, 0x0053, 0x005e, 0x006d, 0x006d, 0x0081, - 0x008f, 0x009e, 0x00ab, 0x00b9, 0x00c7, 0x00d7, 0x0101, 0x010f, - 0x011c, 0x0123, 0x012d, 0x013c, 0x014a, 0x0153, 0x0173, 0x0183, - 0x018a, 0x018a, 0x01a1, 0x01bb, 0x01d0, 0x01d0, 0x01de, 0x01f6, - 0x0205, 0x020f, 0x0215, 0x0215, 0x0221, 0x0231, 0x023e, 0x0248, - 0x0254, 0x025d, 0x0269, 0x0283, 0x029a, 0x029a, 0x02a9, 0x02b1, - 0x02b1, 0x02c3, 0x02d8, 0x02ec, 0x02f9, 0x030c, 0x0310, 0x031e, - // Entry 40 - 7F - 0x032c, 0x032c, 0x033a, 0x0342, 0x0350, 0x035d, 0x035d, 0x0369, - 0x0377, 0x0377, 0x0387, 0x0392, 0x039e, 0x03ba, 0x03c9, 0x03d1, - 0x03dd, 0x03e8, 0x03f8, 0x0408, 0x0408, 0x0408, 0x0416, 0x0424, - 0x0424, 0x0434, 0x0444, 0x0444, 0x0458, 0x0458, 0x0458, 0x0466, - 0x0478, 0x0478, 0x0487, 0x0496, 0x0496, 0x04a8, 0x04a8, 0x04b9, - 0x04b9, 0x04b9, 0x04b9, 0x04b9, 0x04c5, 0x04c5, 0x04d0, 0x04de, - 0x04ea, 0x04f5, 0x04f5, 0x0502, 0x0502, 0x0502, 0x0517, 0x0525, - 0x0533, 0x0542, 0x054f, 0x0560, 0x0575, 0x0583, 0x058f, 0x059f, - // Entry 80 - BF - 0x05ab, 0x05bd, 0x05c9, 0x05c9, 0x05d9, 0x05e7, 0x05f4, 0x05f4, - 0x05f4, 0x05f4, 0x0601, 0x0601, 0x0601, 0x0613, 0x0621, 0x063a, - 0x064f, 0x0664, 0x0672, 0x0672, 0x067e, 0x0690, 0x069e, 0x069e, - 0x06ac, 0x06b8, 0x06c5, 0x06d2, 0x06d9, 0x06e3, 0x06f3, 0x0703, - 0x0703, 0x0712, 0x071b, 0x0729, 0x0729, 0x0729, 0x073d, 0x075d, - 0x0765, 0x0773, 0x0788, 0x0796, 0x079d, 0x07ab, 0x07bc, 0x07cb, - }, - }, - { // bs-Cyrl - "арапско писмоимперијско арамејско писмојерменско писмоавестанско писмоба" + - "лијско писмобатак писмобенгалско писмоблисимболично писмобопомофо п" + - "исмобраманско писмоБрајево писмобугинско писмобухидско писмочакманс" + - "ко писмоуједињени канадски абориџински силабицикаријско писмочамско" + - " писмоЧерокицирт писмокоптичко писмокипарско писмоЋирилицаСтарослове" + - "нска црквена ћирилицаДеванагариДезеретегипатско народно писмоегипат" + - "ско хијератско писмоегипатски хијероглифиетиопско писмогрузијско кх" + - "утсури писмогрузијско писмоглагољицаГотикагрчко писмогујарати писмо" + - "гурмуки писмохангулханханунопоједностављени хантрадиционални ханхеб" + - "рејско писмоХираганапахав хмонг писмоКатакана или Хираганастаромађа" + - "рско писмоиндушко писмостари италикЏамојаванско писмојапанско писмо" + - "кајах-ли писмоКатаканакарошти писмокмерско писмоканнада писмокорејс" + - "ко писмокаитиланна писмолаошко писмолатиница (фрактур варијанта)гал" + - "ска латиницаЛатиницалепча писмолимбу писмолинеарно А писмолинеарно " + - "Б писмолисијско писмолидијско писмомандеанско писмоманихејско писмо" + - "мајански хијероглифимероитик писмомалајалам писмомонголско писмомес" + - "ечево писмомеитеи мајек писмомијанмарско писмон’ко писмоогамско пис" + - "моол чики писмоорконско писмооријанско писмоосмањанско писмостаро п" + - "ермикско писмопагс-па писмописани пахлавипсалтер пахлавипахлави пис" + - "моФеничанско писмопоралд фонетско писмописани партианрејанг писморо" + - "нгоронго писморунско писмосамаританско писмосарати писмосаураштра п" + - "исмознаковно писмошавијанско писмосинхала писмосилоти нагри писмоси" + - "ријско писмосиријско естрангело писмозападносиријско писмописмо ист" + - "очне Сиријетагбанва писмотаи ле писмонови таи луетамилско писмотаи " + - "виет писмотелугу писмотенгвар писмотифинаг писмоТагалогтхана писмот" + - "ајландско писмотибетанско писмоугаритско писмоваи писмовидљиви гово" + - "рстароперсијско писмосумерско-акадско кунеиформ писмоји писмонаслед" + - "но писмоматематичка нотацијасимболиНеписани језикзаједничко писмоНе" + - "познато или неважеће писмо", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0019, 0x004b, 0x0068, - 0x0087, 0x00a2, 0x00a2, 0x00a2, 0x00b7, 0x00d4, 0x00d4, 0x00f9, - 0x0114, 0x0131, 0x014a, 0x0165, 0x0180, 0x019d, 0x01e8, 0x0203, - 0x021a, 0x0226, 0x0239, 0x0254, 0x026f, 0x027f, 0x02bb, 0x02cf, - 0x02dd, 0x02dd, 0x0309, 0x033b, 0x0364, 0x0364, 0x037f, 0x03ad, - 0x03ca, 0x03dc, 0x03e8, 0x03e8, 0x03fd, 0x0418, 0x0431, 0x0431, - 0x043d, 0x0443, 0x044f, 0x0474, 0x0495, 0x0495, 0x04b2, 0x04c2, - 0x04c2, 0x04e2, 0x050a, 0x052f, 0x0548, 0x055f, 0x0567, 0x0582, - // Entry 40 - 7F - 0x059d, 0x059d, 0x05b7, 0x05c7, 0x05e0, 0x05f9, 0x05f9, 0x0612, - 0x062d, 0x062d, 0x0637, 0x064c, 0x0663, 0x0697, 0x06b4, 0x06c4, - 0x06d9, 0x06ee, 0x070c, 0x072a, 0x072a, 0x072a, 0x0745, 0x0760, - 0x0760, 0x077f, 0x079e, 0x079e, 0x07c5, 0x07c5, 0x07c5, 0x07e0, - 0x07fd, 0x07fd, 0x081a, 0x0835, 0x0835, 0x0857, 0x0857, 0x0878, - 0x0878, 0x0878, 0x0878, 0x0878, 0x088c, 0x088c, 0x08a5, 0x08bd, - 0x08d8, 0x08f5, 0x08f5, 0x0914, 0x0914, 0x0914, 0x093c, 0x0954, - 0x096f, 0x098c, 0x09a5, 0x09c4, 0x09ec, 0x0a07, 0x0a1e, 0x0a3d, - // Entry 80 - BF - 0x0a54, 0x0a77, 0x0a8e, 0x0a8e, 0x0aab, 0x0ac6, 0x0ae5, 0x0ae5, - 0x0ae5, 0x0ae5, 0x0afe, 0x0afe, 0x0afe, 0x0b20, 0x0b3b, 0x0b6b, - 0x0b94, 0x0bba, 0x0bd5, 0x0bd5, 0x0beb, 0x0c01, 0x0c1c, 0x0c1c, - 0x0c36, 0x0c4d, 0x0c66, 0x0c7f, 0x0c8d, 0x0ca2, 0x0cc1, 0x0ce0, - 0x0ce0, 0x0cfd, 0x0d0e, 0x0d27, 0x0d27, 0x0d27, 0x0d4e, 0x0d8b, - 0x0d9a, 0x0db5, 0x0ddc, 0x0ddc, 0x0dea, 0x0e05, 0x0e24, 0x0e59, - }, - }, - { // ca - caScriptStr, - caScriptIdx, - }, - { // ce - "Ӏаьрбийнэрмалойнбенгалхойнбопомофобрайлякириллицадеванагариэфиопингуьржи" + - "йнгрекийнгуджаратигурмукхихангылькитайнатта китайнламастан китайнжу" + - "гтийнхираганаяпонийнкатаканакхмерийнканнадакорейнлаоссийнлатинанмал" + - "аялийнмонголийнмьянманийнорисингалхойнтамилхойнтелугутаанатайнтибет" + - "хойнсимволашйоза доцумассара а тӀеэцнадоьвзуш доцу йоза", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0020, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0034, 0x0034, 0x0034, - 0x0044, 0x0044, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0062, 0x0062, 0x0076, - 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0084, 0x0084, - 0x0094, 0x0094, 0x0094, 0x0094, 0x00a2, 0x00b4, 0x00c4, 0x00c4, - 0x00d2, 0x00de, 0x00de, 0x00f3, 0x0110, 0x0110, 0x011e, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - // Entry 40 - 7F - 0x013c, 0x013c, 0x013c, 0x014c, 0x014c, 0x015c, 0x015c, 0x016a, - 0x0176, 0x0176, 0x0176, 0x0176, 0x0186, 0x0186, 0x0186, 0x0194, - 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, - 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, - 0x01a6, 0x01a6, 0x01b8, 0x01b8, 0x01b8, 0x01b8, 0x01b8, 0x01cc, - 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, - 0x01cc, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, - 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, - // Entry 80 - BF - 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, - 0x01d2, 0x01d2, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01f8, 0x01f8, - 0x01f8, 0x0204, 0x0204, 0x0204, 0x0204, 0x020e, 0x0216, 0x0228, - 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, - 0x0228, 0x0228, 0x0228, 0x0228, 0x0238, 0x0249, 0x0269, 0x0289, - }, - }, - {}, // cgg - { // chr - "ᎡᎳᏈᎩᎠᎳᎻᎠᏂᏇᏂᎦᎠᏆᏉᎼᏬᏗᏂᎨᏫ ᎤᏃᏪᎶᏙᏗᏣᎳᎩᏲᏂᎢ ᏗᎪᏪᎵᏕᏫᎾᎦᎵᎢᏗᏯᏈᎩᏦᏥᎠᏂᎪᎢᎫᏣᎳᏘᎬᎹᎩᎭᏂ-ᏆᏉᎼᏬᎭᏂᎫ" + - "ᎵᎭᏂᎠᎯᏗᎨ ᎭᏂᎤᏦᏍᏗ ᎭᏂᎠᏂᏈᎵᎯᎳᎦᎾᏣᏩᏂᏏ ᏧᏃᏴᎩᏣᎼᏣᏆᏂᏏᎧᏔᎧᎾᎩᎻᎷᎧᎾᏓᎪᎵᎠᏂᎳᎣᎳᏘᏂᎹᎳᏯᎳᎻᎹᏂ" + - "ᎪᎵᎠᏂᎹᎡᏂᎹᎳᎣᏗᎠᏏᏅᎭᎳᏔᎻᎵᏖᎷᎦᏔᎠᎾᏔᏱ ᏔᏯᎴᏂᏘᏇᏔᏂᎠᏰᎦᎴᏴᏫᏍᎩ ᎠᎤᏓᏗᏍᏙᏗᎡᎼᏥᏗᎬᏟᎶᏍᏙᏗᎪᏪᎳᏅ" + - " ᏂᎨᏒᎾᏯᏃᏉ ᏱᎬᏍᏛᏭᏄᏬᎵᏍᏛᎾ ᎠᏍᏓᏩᏛᏍᏙᏗ", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x0027, 0x0027, 0x0027, - 0x0033, 0x0033, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x005b, 0x005b, 0x005b, 0x005b, 0x0071, 0x0071, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x008f, 0x008f, - 0x009b, 0x009b, 0x009b, 0x009b, 0x00a1, 0x00ad, 0x00b6, 0x00c9, - 0x00d5, 0x00db, 0x00db, 0x00ee, 0x0101, 0x0101, 0x010d, 0x0119, - 0x0119, 0x0119, 0x0132, 0x0132, 0x0132, 0x0132, 0x0138, 0x0138, - // Entry 40 - 7F - 0x0144, 0x0144, 0x0144, 0x0150, 0x0150, 0x0159, 0x0159, 0x0162, - 0x016e, 0x016e, 0x016e, 0x016e, 0x0174, 0x0174, 0x0174, 0x017d, - 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, - 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, - 0x018c, 0x018c, 0x019e, 0x019e, 0x019e, 0x019e, 0x019e, 0x01ad, - 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, - 0x01ad, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, - 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, - // Entry 80 - BF - 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, - 0x01b6, 0x01b6, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, - 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01cb, 0x01cb, - 0x01cb, 0x01d4, 0x01d4, 0x01d4, 0x01d4, 0x01dd, 0x01f0, 0x01fc, - 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, - 0x01fc, 0x01fc, 0x022a, 0x0233, 0x0248, 0x0261, 0x027a, 0x02a5, - }, - }, - { // ckb - "عەرەبیئەرمەنیبەنگالیبۆپۆمۆفۆبرەیلسریلیکدەڤەناگەریئەتیۆپیکگورجییۆنانیگوجە" + - "راتیگورموکھیھانگولهیبرێھیراگاناژاپۆنیکاتاکاناخمێریکەنەداکۆریاییلاول" + - "اتینیمالایالاممەنگۆلیمیانمارئۆریاسینھالاتامیلیتیلوگوتانەتایلەندی", - []uint16{ // 159 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x0028, 0x0028, 0x0028, - 0x0038, 0x0038, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x004e, 0x004e, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0072, 0x0072, - 0x007c, 0x007c, 0x007c, 0x007c, 0x0088, 0x0098, 0x00a8, 0x00a8, - 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00be, 0x00ce, - 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, - // Entry 40 - 7F - 0x00da, 0x00da, 0x00da, 0x00ea, 0x00ea, 0x00f4, 0x00f4, 0x0100, - 0x010e, 0x010e, 0x010e, 0x010e, 0x0114, 0x0114, 0x0114, 0x0120, - 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, - 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, - 0x0132, 0x0132, 0x0140, 0x0140, 0x0140, 0x0140, 0x0140, 0x014e, - 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, - 0x014e, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, - 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, - // Entry 80 - BF - 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, - 0x0158, 0x0158, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, - 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0172, 0x0172, - 0x0172, 0x017e, 0x017e, 0x017e, 0x017e, 0x0186, 0x0196, - }, - }, - { // cs - csScriptStr, - csScriptIdx, - }, - { // cy - "ArabaiddArmenaiddBengalaiddBopomofoBrailleCyriligDevanagariEthiopigGeorg" + - "aiddGroegaiddGwjarataiddGwrmwciHanbHangulHanHan symledigHan traddodi" + - "adolHebreigHiraganaSyllwyddor JapaneaiddJamoJapaneaiddCatacanaChmera" + - "iddCanaraiddCoreaiddLaoaiddLladinMalayalamaiddMongolaiddMyanmaraiddO" + - "gamOrïaiddSinhanaiddTamilaiddTeluguThaanaTaiTibetaiddNodiant Mathema" + - "tegolEmojiSymbolauAnysgrifenedigCyffredinSgript anhysbys", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001b, 0x001b, 0x001b, - 0x0023, 0x0023, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0031, 0x0031, 0x003b, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x0043, 0x0043, - 0x004c, 0x004c, 0x004c, 0x004c, 0x0055, 0x0060, 0x0067, 0x006b, - 0x0071, 0x0074, 0x0074, 0x0080, 0x0090, 0x0090, 0x0097, 0x009f, - 0x009f, 0x009f, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b8, 0x00b8, - // Entry 40 - 7F - 0x00c2, 0x00c2, 0x00c2, 0x00ca, 0x00ca, 0x00d3, 0x00d3, 0x00dc, - 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00eb, 0x00eb, 0x00eb, 0x00f1, - 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, - 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, - 0x00fe, 0x00fe, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0113, - 0x0113, 0x0113, 0x0113, 0x0113, 0x0113, 0x0113, 0x0117, 0x0117, - 0x0117, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, - 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, - // Entry 80 - BF - 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, - 0x011f, 0x011f, 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, - 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, 0x0132, 0x0132, - 0x0132, 0x0138, 0x0138, 0x0138, 0x0138, 0x013e, 0x0141, 0x014a, - 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, - 0x014a, 0x014a, 0x015e, 0x0163, 0x016b, 0x0179, 0x0182, 0x0191, - }, - }, - { // da - daScriptStr, - daScriptIdx, - }, - {}, // dav - { // de - deScriptStr, - deScriptIdx, - }, - {}, // de-AT - {}, // de-CH - {}, // de-LU - {}, // dje - { // dsb - "arabskiarmeńskibengalskibopomofobraillowe pismokyriliskidevanagarietiopi" + - "skigeorgiskigrichiskigujaratigurmukhihangulhanzjadnorjone hantradici" + - "onalne hanhebrejskihiraganajapańskikatakanakhmerkannadakorejskilaosk" + - "iłatyńskimalayalamskimongolskiburmaskioriyasinghaleskitamilskitelugu" + - "thaanathaiskitibetskisymbolebźez pismapowšyknenjeznate pismo", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0019, 0x0019, 0x0019, - 0x0021, 0x0021, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, - 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0039, 0x0039, 0x0043, - 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x004c, 0x004c, - 0x0055, 0x0055, 0x0055, 0x0055, 0x005e, 0x0066, 0x006e, 0x006e, - 0x0074, 0x0077, 0x0077, 0x0086, 0x0097, 0x0097, 0x00a0, 0x00a8, - 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, - // Entry 40 - 7F - 0x00b1, 0x00b1, 0x00b1, 0x00b9, 0x00b9, 0x00be, 0x00be, 0x00c5, - 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00d3, 0x00d3, 0x00d3, 0x00dd, - 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, - 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, - 0x00e9, 0x00e9, 0x00f2, 0x00f2, 0x00f2, 0x00f2, 0x00f2, 0x00fa, - 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, - 0x00fa, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, - 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, - // Entry 80 - BF - 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, - 0x00ff, 0x00ff, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, - 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x0112, 0x0112, - 0x0112, 0x0118, 0x0118, 0x0118, 0x0118, 0x011e, 0x0125, 0x012d, - 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, - 0x012d, 0x012d, 0x012d, 0x012d, 0x0134, 0x013f, 0x0148, 0x0156, - }, - }, - {}, // dua - {}, // dyo - { // dz - "ཨེ་ར་བིཀ་ཡིག་གུཨར་མི་ནི་ཡཱན་ཡིག་གུབངྒ་ལ་ཡིག་གུབོ་པོ་མོ་ཕཱོ་ཡིག་གུའབུར་ཡི" + - "གསིརིལ་ལིཀ་ཡིག་གུདེ་ཝ་ན་ག་རི་ཡིག་གུཨི་ཐི་ཡོ་པིཀ྄་ཡིག་གུཇཽ་ཇི་ཡཱན་ཡ" + - "ིག་གུགྲིཀ་ཡིག་གུགུ་ཇ་ར་ཏི་ཡིག་གུགུ་རུ་མུ་ཁ་ཡིག་གུཧཱན་གུལ་ཡིག་གུརྒྱ" + - "་ནག་ཡིག་གུརྒྱ་ཡིག་ ལུགས་གསར་ལུགས་རྙིང་ རྒྱ་ཡིགཧེ་བྲུ་ཡིག་གུཇ་པཱན་ག" + - "ྱི་ཧི་ར་ག་ན་ཡིག་གུཇ་པཱན་ཡིག་གུཇ་པཱན་གྱི་ཀ་ཏ་ཀ་ན་ཡིག་གུཁེ་མེར་ཡིག་ག" + - "ུཀ་ན་ཌ་ཡིག་གུཀོ་རི་ཡཱན་ཡིག་གུལའོ་ཡིག་གུལེ་ཊིན་ཡིག་གུམ་ལ་ཡ་ལམ་ཡིག་ག" + - "ུསོག་པོའི་ཡིག་གུབར་མིས་ཡིག་གུཨོ་རི་ཡ་ཡིག་གུསིན་ཧ་ལ་རིག་གུཏ་མིལ་ཡིག" + - "་གུཏེ་ལུ་གུ་ཡིག་གུཐཱ་ན་ཡིག་གུཐཱའི་ཡིག་གུང་བཅས་ཀྱི་ཡིག་གུམཚན་རྟགསཡི" + - "ག་ཐོག་མ་བཀོདཔསྤྱིཡིགངོ་མ་ཤེས་པའི་ཡི་གུ", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x002d, 0x002d, 0x0066, - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x008a, 0x008a, 0x008a, - 0x00c3, 0x00c3, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, - 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x010b, 0x010b, 0x0141, - 0x0141, 0x0141, 0x0141, 0x0141, 0x0141, 0x0141, 0x017d, 0x017d, - 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ce, 0x01fe, 0x0231, 0x0231, - 0x025b, 0x0282, 0x0282, 0x02b6, 0x02ea, 0x02ea, 0x0311, 0x035c, - 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, 0x035c, - // Entry 40 - 7F - 0x0380, 0x0380, 0x0380, 0x03c8, 0x03c8, 0x03ef, 0x03ef, 0x0413, - 0x0443, 0x0443, 0x0443, 0x0443, 0x0461, 0x0461, 0x0461, 0x0488, - 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, - 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, - 0x04b5, 0x04b5, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x0509, - 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, - 0x0509, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, - 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, - // Entry 80 - BF - 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, - 0x0533, 0x0533, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, - 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x0581, 0x0581, - 0x0581, 0x05ae, 0x05ae, 0x05ae, 0x05ae, 0x05cf, 0x05f0, 0x0620, - 0x0620, 0x0620, 0x0620, 0x0620, 0x0620, 0x0620, 0x0620, 0x0620, - 0x0620, 0x0620, 0x0620, 0x0620, 0x0638, 0x0665, 0x067a, 0x06b0, - }, - }, - {}, // ebu - { // ee - "Arabiagbeŋɔŋlɔarmeniagbeŋɔŋlɔbengaligbeŋɔŋlɔbopomfogbeŋɔŋlɔbraillegbeŋɔŋ" + - "lɔCyrillicgbeŋɔŋlɔdevanagarigbeŋɔŋlɔethiopiagbeŋɔŋlɔgɔgiagbeŋɔŋlɔgri" + - "sigbeŋɔŋlɔgudzaratigbeŋɔŋlɔgurmukhigbeŋɔŋlɔhangulgbeŋɔŋlɔhangbeŋɔŋlɔ" + - "HansgbeŋɔŋlɔBlema HantgbeŋcŋlɔhebrigbeŋɔŋlɔhiraganagbeŋɔŋlɔJapaneseg" + - "beŋɔŋlɔkatakanagbeŋɔŋlɔkhmergbeŋɔŋlɔkannadagbeŋɔŋlɔKoreagbeŋɔŋlɔlaog" + - "beŋɔŋlɔLatingbeŋɔŋlɔmalayagbeŋɔŋlɔmongoliagbeŋɔŋlɔmyanmargbeŋɔŋlɔori" + - "yagbeŋɔŋlɔsinhalagbeŋɔŋlɔtamilgbeŋɔŋlɔtelegugbeŋɔŋlɔthaanagbeŋɔŋlɔta" + - "igbeŋɔŋlɔtibetgbeŋɔŋlɔŋɔŋlɔdzesiwogbemaŋlɔgbeŋɔŋlɔ bɔbɔgbeŋɔŋlɔ many" + - "a", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0012, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0038, 0x0038, 0x0038, - 0x004b, 0x004b, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, - 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x0072, 0x0072, 0x0088, - 0x0088, 0x0088, 0x0088, 0x0088, 0x0088, 0x0088, 0x009c, 0x009c, - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00bf, 0x00d4, 0x00e8, 0x00e8, - 0x00fa, 0x0109, 0x0109, 0x0119, 0x012e, 0x012e, 0x013f, 0x0153, - 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, - // Entry 40 - 7F - 0x0167, 0x0167, 0x0167, 0x017b, 0x017b, 0x018c, 0x018c, 0x019f, - 0x01b0, 0x01b0, 0x01b0, 0x01b0, 0x01bf, 0x01bf, 0x01bf, 0x01d0, - 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, - 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, - 0x01e2, 0x01e2, 0x01f6, 0x01f6, 0x01f6, 0x01f6, 0x01f6, 0x0209, - 0x0209, 0x0209, 0x0209, 0x0209, 0x0209, 0x0209, 0x0209, 0x0209, - 0x0209, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, - 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, - // Entry 80 - BF - 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, - 0x021a, 0x021a, 0x022d, 0x022d, 0x022d, 0x022d, 0x022d, 0x022d, - 0x022d, 0x022d, 0x022d, 0x022d, 0x022d, 0x022d, 0x023e, 0x023e, - 0x023e, 0x0250, 0x0250, 0x0250, 0x0250, 0x0262, 0x0271, 0x0282, - 0x0282, 0x0282, 0x0282, 0x0282, 0x0282, 0x0282, 0x0282, 0x0282, - 0x0282, 0x0282, 0x0282, 0x0282, 0x0292, 0x029c, 0x02af, 0x02c1, - }, - }, - { // el - elScriptStr, - elScriptIdx, - }, - { // en - enScriptStr, - enScriptIdx, - }, - {}, // en-AU - { // en-IN - "BengaliOriya", - []uint16{ // 114 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x000c, - }, - }, - {}, // en-NZ - {}, // eo - { // es - esScriptStr, - esScriptIdx, - }, - { // es-419 - es419ScriptStr, - es419ScriptIdx, - }, - {}, // es-AR - {}, // es-BO - {}, // es-CL - {}, // es-CO - {}, // es-CR - {}, // es-DO - {}, // es-EC - {}, // es-GT - {}, // es-HN - { // es-MX - "telugú", - []uint16{ // 154 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, - }, - }, - {}, // es-NI - {}, // es-PA - {}, // es-PE - {}, // es-PR - {}, // es-PY - {}, // es-SV - {}, // es-US - {}, // es-VE - { // et - etScriptStr, - etScriptIdx, - }, - { // eu - "arabiarraarmeniarrabengaliarrabopomofoabrailleazirilikoadevanagariaetiop" + - "iarrageorgiarragreziarragujarateragurmukhiahänerahangulaidazkera txi" + - "natarraidazkera txinatar sinplifikatuaidazkera txinatar tradizionala" + - "hebreerahiraganasilaba japoniarrakjamo-bihurketajaponiarrakatakanakh" + - "emerarrakanadarrakorearralaosarralatinamalayalameramongoliarrabirman" + - "iarraoriyarrasinhalatamilarrateluguarrathaanathailandiarratibetarram" + - "atematikako notazioaemotikonoaikurrakidatzi gabeaohikoaidazkera ezez" + - "aguna", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0009, 0x0013, - 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x001e, 0x001e, 0x001e, - 0x0027, 0x0027, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x0038, 0x0038, 0x0043, - 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x004d, 0x004d, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0060, 0x006a, 0x0073, 0x007a, - 0x0081, 0x0094, 0x0094, 0x00b3, 0x00d1, 0x00d1, 0x00d9, 0x00e1, - 0x00e1, 0x00e1, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x0101, 0x0101, - // Entry 40 - 7F - 0x010b, 0x010b, 0x010b, 0x0113, 0x0113, 0x011d, 0x011d, 0x0126, - 0x012e, 0x012e, 0x012e, 0x012e, 0x0136, 0x0136, 0x0136, 0x013c, - 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, - 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, - 0x0148, 0x0148, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x015e, - 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, - 0x015e, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, - 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, - // Entry 80 - BF - 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, - 0x0166, 0x0166, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, - 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x0176, 0x0176, - 0x0176, 0x0180, 0x0180, 0x0180, 0x0180, 0x0186, 0x0193, 0x019c, - 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, - 0x019c, 0x019c, 0x01b1, 0x01bb, 0x01c2, 0x01ce, 0x01d4, 0x01e6, - }, - }, - {}, // ewo - { // fa - faScriptStr, - faScriptIdx, - }, - { // fa-AF - "مغلی", - []uint16{ // 99 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0008, - }, - }, - {}, // ff - { // fi - fiScriptStr, - fiScriptIdx, - }, - { // fil - filScriptStr, - filScriptIdx, - }, - { // fo - "arabiskarmensktbengalibopomofoblindaskriftkyrillisktdevanagarietiopisktg" + - "eorgiansktgriksktgujaratigurmukhihanbhangulhaneinkult hanvanligt han" + - "hebraiskthiraganajapanskir stavirjamojapansktkatakanakhmerkannadakor" + - "eansktlaolatínsktmalayalammongolskmyanmarsktoriyasinhalatamilskttelu" + - "guthaanatailendskttibetsktstøddfrøðilig teknskipanemojitekinóskrivav" + - "anligókend skrift", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x0016, 0x0016, 0x0016, - 0x001e, 0x001e, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0034, 0x0034, 0x003e, - 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x0047, 0x0047, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0059, 0x0061, 0x0069, 0x006d, - 0x0073, 0x0076, 0x0076, 0x0081, 0x008c, 0x008c, 0x0095, 0x009d, - 0x009d, 0x009d, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00b1, 0x00b1, - // Entry 40 - 7F - 0x00b9, 0x00b9, 0x00b9, 0x00c1, 0x00c1, 0x00c6, 0x00c6, 0x00cd, - 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d9, 0x00d9, 0x00d9, 0x00e2, - 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, - 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, - 0x00eb, 0x00eb, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00fd, - 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, - 0x00fd, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, - 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, - // Entry 80 - BF - 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, - 0x0102, 0x0102, 0x0109, 0x0109, 0x0109, 0x0109, 0x0109, 0x0109, - 0x0109, 0x0109, 0x0109, 0x0109, 0x0109, 0x0109, 0x0111, 0x0111, - 0x0111, 0x0117, 0x0117, 0x0117, 0x0117, 0x011d, 0x0127, 0x012f, - 0x012f, 0x012f, 0x012f, 0x012f, 0x012f, 0x012f, 0x012f, 0x012f, - 0x012f, 0x012f, 0x014a, 0x014f, 0x0154, 0x015c, 0x0162, 0x016f, - }, - }, - { // fr - frScriptStr, - frScriptIdx, - }, - {}, // fr-BE - { // fr-CA - frCAScriptStr, - frCAScriptIdx, - }, - {}, // fr-CH - { // fur - "araparmenbalinêsbengalêsBraillebuginêsSilabari unificât aborigjens canad" + - "êscoptcipriotciriliccirilic dal vieri slavonic de glesiedevanagarid" + - "emotic egjizianjeratic egjizianjeroglifics egjiziansetiopicgeorgjian" + - "glagoliticgoticgrêcgujaratihanHan semplificâtHan tradizionâlebreukat" + - "akana o hiraganavieri ongjarêsvieri italicgjavanêsgjaponêskhmerkanna" + - "dacoreanlaolatin Frakturlatin gaeliclatinlineâr Alineâr Bjeroglifics" + - " Mayamalayalammongulmyanmaroriyarunicsinhalasiriacsiriac Estrangelos" + - "iriac ocidentâlsiriac orientâltamiltelegutagalogthaanathaitibetanuga" + - "riticvieri persiancuneiform sumeric-acadiccodiç pes lenghis no scrit" + - "iscomuncodiç par scrituris no codificadis", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0004, 0x0009, - 0x0009, 0x0011, 0x0011, 0x0011, 0x0011, 0x001a, 0x001a, 0x001a, - 0x001a, 0x001a, 0x0021, 0x0029, 0x0029, 0x0029, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x0053, 0x005a, 0x0061, 0x0085, 0x008f, - 0x008f, 0x008f, 0x009f, 0x00af, 0x00c4, 0x00c4, 0x00cb, 0x00cb, - 0x00d4, 0x00de, 0x00e3, 0x00e3, 0x00e8, 0x00f0, 0x00f0, 0x00f0, - 0x00f0, 0x00f3, 0x00f3, 0x0103, 0x0113, 0x0113, 0x0118, 0x0118, - 0x0118, 0x0118, 0x012b, 0x013a, 0x013a, 0x0146, 0x0146, 0x014f, - // Entry 40 - 7F - 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x015d, 0x015d, 0x0164, - 0x016a, 0x016a, 0x016a, 0x016a, 0x016d, 0x017a, 0x0186, 0x018b, - 0x018b, 0x018b, 0x0194, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, - 0x019d, 0x019d, 0x019d, 0x019d, 0x01ad, 0x01ad, 0x01ad, 0x01ad, - 0x01b6, 0x01b6, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01c3, - 0x01c3, 0x01c3, 0x01c3, 0x01c3, 0x01c3, 0x01c3, 0x01c3, 0x01c3, - 0x01c3, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, - 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, - // Entry 80 - BF - 0x01cd, 0x01cd, 0x01cd, 0x01cd, 0x01cd, 0x01cd, 0x01cd, 0x01cd, - 0x01cd, 0x01cd, 0x01d4, 0x01d4, 0x01d4, 0x01d4, 0x01da, 0x01eb, - 0x01fc, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x0211, 0x0211, - 0x0211, 0x0217, 0x0217, 0x0217, 0x021e, 0x0224, 0x0228, 0x022f, - 0x022f, 0x0237, 0x0237, 0x0237, 0x0237, 0x0237, 0x0244, 0x025c, - 0x025c, 0x025c, 0x025c, 0x025c, 0x025c, 0x0279, 0x027e, 0x02a1, - }, - }, - { // fy - "DefakaArabyskKeizerlijk ArameesArmeensAvestaanskBalineeskBamounBassa Vah" + - "BatakBengaleesBlissymbolenBopomofoBrahmiBrailleBugineeskBuhidChakmaV" + - "erenigde Canadese Aboriginal-symbolenKaryskChamCherokeeCirthKoptyskS" + - "ypryskSyrillyskAldkerkslavysk SyrillyskDevanagariDeseretDuployan sne" + - "lschriftEgyptysk demotyskEgyptysk hiëratyskEgyptyske hiërogliefenEth" + - "iopyskGeorgysk KhutsuriGeorgyskGlagolityskGothyskGranthaGrieksGujara" + - "tiGurmukhiHangulHanHanunooFerienfâldigd SineeskTraditjoneel SineeskH" + - "ebreeuwskHiraganaAnatolyske hiërogliefenPahawh HmongKatakana of Hira" + - "ganaAldhongaarsIndusAld-italyskJamoJavaanskJapansJurchenKayah LiKata" + - "kanaKharoshthiKhmerKhojkiKannadaKoreaanskKpelleKaithiLannaLaoGotysk " + - "LatynGaelysk LatynLatynLepchaLimbuLineair ALineair BFraserLomaLycysk" + - "LydyskMandaeansManicheaanskMayahiërogliefenMendeMeroitysk cursiefMer" + - "oïtyskMalayalamMongoolsMoonMroMeiteiMyanmarAld Noard-ArabyskNabateaa" + - "nskNaxi GebaN’KoNüshuOghamOl ChikiOrkhonOdiaOsmanyaPalmyreensAldperm" + - "yskPhags-paInscriptioneel PahlaviPsalmen PahlaviBoek PahlaviFoenicys" + - "kPollard-fonetyskInscriptioneel ParthyskRejangRongorongoRunicSamarit" + - "aanskSaratiAld Sûd-ArabyskSaurashtraSignWritingShavianSharadaSindhiS" + - "inhalaSora SompengSoendaneeskSyloti NagriSyriacEstrangelo ArameeskWe" + - "st-ArameeskEast-ArameeskTagbanwaTakriTai LeNij Tai LueTamilTangutTai" + - " VietTeluguTengwarTifinaghTagalogThaanaThaisTibetaanskTirhutaUgarity" + - "skVaiSichtbere spraakVarang KshitiWoleaiAldperzyskSumero-Akkadian Cu" + - "neiformYiOergeërfdWiskundige notatieSymbolenOngeschrevenAlgemeenOnbe" + - "kend schriftsysteem", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, 0x000d, 0x001f, 0x0026, - 0x0030, 0x0039, 0x003f, 0x0048, 0x004d, 0x0056, 0x0056, 0x0062, - 0x006a, 0x0070, 0x0077, 0x0080, 0x0085, 0x008b, 0x00b1, 0x00b7, - 0x00bb, 0x00c3, 0x00c8, 0x00cf, 0x00d6, 0x00df, 0x00f7, 0x0101, - 0x0108, 0x011c, 0x012d, 0x0140, 0x0157, 0x0157, 0x0160, 0x0171, - 0x0179, 0x0184, 0x018b, 0x0192, 0x0198, 0x01a0, 0x01a8, 0x01a8, - 0x01ae, 0x01b1, 0x01b8, 0x01ce, 0x01e2, 0x01e2, 0x01ec, 0x01f4, - 0x020c, 0x0218, 0x022c, 0x0237, 0x023c, 0x0247, 0x024b, 0x0253, - // Entry 40 - 7F - 0x0259, 0x0260, 0x0268, 0x0270, 0x027a, 0x027f, 0x0285, 0x028c, - 0x0295, 0x029b, 0x02a1, 0x02a6, 0x02a9, 0x02b5, 0x02c2, 0x02c7, - 0x02cd, 0x02d2, 0x02db, 0x02e4, 0x02ea, 0x02ee, 0x02f4, 0x02fa, - 0x02fa, 0x0303, 0x030f, 0x030f, 0x0320, 0x0325, 0x0336, 0x0340, - 0x0349, 0x0349, 0x0351, 0x0355, 0x0358, 0x035e, 0x035e, 0x0365, - 0x0376, 0x0381, 0x0381, 0x038a, 0x0390, 0x0396, 0x039b, 0x03a3, - 0x03a9, 0x03ad, 0x03ad, 0x03b4, 0x03be, 0x03be, 0x03c8, 0x03d0, - 0x03e6, 0x03f5, 0x0401, 0x040a, 0x041a, 0x0431, 0x0437, 0x0441, - // Entry 80 - BF - 0x0446, 0x0452, 0x0458, 0x0468, 0x0472, 0x047d, 0x0484, 0x048b, - 0x048b, 0x0491, 0x0498, 0x04a4, 0x04af, 0x04bb, 0x04c1, 0x04d4, - 0x04e1, 0x04ee, 0x04f6, 0x04fb, 0x0501, 0x050c, 0x0511, 0x0517, - 0x051f, 0x0525, 0x052c, 0x0534, 0x053b, 0x0541, 0x0546, 0x0550, - 0x0557, 0x0560, 0x0563, 0x0573, 0x0580, 0x0586, 0x0590, 0x05a9, - 0x05ab, 0x05b5, 0x05c7, 0x05c7, 0x05cf, 0x05db, 0x05e3, 0x05fa, - }, - }, - { // ga - "Albánach CugasachArabachAramach ImpiriúilAirméanachAivéisteachBailíochBa" + - "tacachBeangálachBopomofoBrailleBuigineachButhaideachSeiricíochCoptac" + - "hCipireachCoireallachDéiveanágrachÉigipteach coiteannÉigipteach clia" + - "rúilIairiglifí ÉigipteachaAetópachSeoirseachGlagalachGotachGréagachG" + - "úisearátachGurmúcachHan agus BopomofoHangalachHanHan SimplitheHan T" + - "raidisiúntaEabhrachHireagánachIairiglifí AnatólachaSiollabraí Seapán" + - "achaSean-UngárachSean-IodáilicSeamóIávachSeapánachCatacánachCiméarac" + - "hCannadachCóiréachLaosachCló GaelachLaidineachLiombúchLíneach ALínea" + - "ch BFraserLiciachLidiachMahasánachMainicéasachIairiglifí MáigheachaM" + - "eindeachMailéalamachMongólachMaenmarachSean-Arabach ThuaidhOghamOirí" + - "seachSean-PheirmeachFéiníceachPollard FoghrachPairtiach Inscríbhinni" + - "úilRúnachSamárachSean-Arabach TheasShawachSiolónachSiriceachTamalac" + - "hTeileagúchTifinaghTagálagachTánachTéalannachTibéadachÚgairíteachSea" + - "n-PheirseachDingchruthach Suiméar-AcádachÍsOidhreachtNodaireacht Mha" + - "tamaiticiúilEmojiSiombailíGan ScríobhCoitiantaScript Anaithnid", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0012, 0x0012, 0x0019, 0x002b, 0x0036, - 0x0042, 0x004b, 0x004b, 0x004b, 0x0053, 0x005e, 0x005e, 0x005e, - 0x0066, 0x0066, 0x006d, 0x0077, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x008d, 0x008d, 0x0094, 0x009d, 0x00a8, 0x00a8, 0x00b7, - 0x00b7, 0x00b7, 0x00cb, 0x00e0, 0x00f8, 0x00f8, 0x0101, 0x0101, - 0x010b, 0x0114, 0x011a, 0x011a, 0x0123, 0x0131, 0x013b, 0x014c, - 0x0155, 0x0158, 0x0158, 0x0165, 0x0176, 0x0176, 0x017e, 0x018a, - 0x01a1, 0x01a1, 0x01b8, 0x01c6, 0x01c6, 0x01d4, 0x01da, 0x01e1, - // Entry 40 - 7F - 0x01eb, 0x01eb, 0x01eb, 0x01f6, 0x01f6, 0x0200, 0x0200, 0x0209, - 0x0213, 0x0213, 0x0213, 0x0213, 0x021a, 0x021a, 0x0226, 0x0230, - 0x0230, 0x0239, 0x0243, 0x024d, 0x0253, 0x0253, 0x025a, 0x0261, - 0x026c, 0x026c, 0x0279, 0x0279, 0x0290, 0x0299, 0x0299, 0x0299, - 0x02a6, 0x02a6, 0x02b0, 0x02b0, 0x02b0, 0x02b0, 0x02b0, 0x02ba, - 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02d3, 0x02d3, - 0x02d3, 0x02dd, 0x02dd, 0x02dd, 0x02dd, 0x02dd, 0x02ec, 0x02ec, - 0x02ec, 0x02ec, 0x02ec, 0x02f8, 0x0308, 0x0323, 0x0323, 0x0323, - // Entry 80 - BF - 0x032a, 0x0333, 0x0333, 0x0345, 0x0345, 0x0345, 0x034c, 0x034c, - 0x034c, 0x034c, 0x0356, 0x0356, 0x0356, 0x0356, 0x035f, 0x035f, - 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x0367, 0x0367, - 0x0367, 0x0372, 0x0372, 0x037a, 0x0385, 0x038c, 0x0397, 0x03a1, - 0x03a1, 0x03ae, 0x03ae, 0x03ae, 0x03ae, 0x03ae, 0x03bd, 0x03dc, - 0x03df, 0x03e9, 0x0405, 0x040a, 0x0414, 0x0420, 0x0429, 0x0439, - }, - }, - { // gd - "AfakaAlbàinis ChabhcasachAhomArabaisAramais impireilAirmeinisAvestanaisB" + - "aliBamumBassa VahBatakBeangailisComharran BlissBopomofoBrahmiBraille" + - "BuhidChakmaSgrìobhadh Lideach Aonaichte nan Tùsanach CanadachChamChe" + - "rokeeCirthCoptaisCìoprasaisCirilisCirilis Seann-Slàbhais na h-Eaglai" + - "seDevanagariDeseretSealbh-sgrìobhadh ÈipheiteachGe’ezCairtbheilisGot" + - "aisGranthaGreugaisGujaratiGurmukhiHangulHanHanunooHan simplichteHan " + - "tradaiseantaEabhraHiraganaDealbh-sgrìobhadh AnatolachPahawh HmongKat" + - "akana no HiraganaSeann-UngaraisSeann-EadailtisJamoDeàbhanaisSeapanai" + - "sJurchenKayah LiKatakanaKharoshthiCmèarKhojkiKannadaCoirèanaisKpelle" + - "KaithiLannaLàthoLaideann frakturLaideann GhàidhealachLaideannLepchaL" + - "imbuLinear ALinear BLomaMahajaniDealbh-sgrìobhadh MayachMendeMalayal" + - "amModiMongolaisMroMeitei MayekMultaniMiànmarSeann-Arabach ThuathachN" + - "axi GebaN’koNüshuOgham-chraobhOl ChikiOrkhonOriyaOsmanyaPau Cin HauP" + - "hags-paPartais snaidh-sgrìobhteRejangRongorongoRùn-sgrìobhadhSaratiS" + - "eann-Arabais DheasachSaurashtraSharadaSiddhamKhudawadiSinhalaSora So" + - "mpengSundaSyloti NagriSuraidheacSuraidheac SiarachSuraidheac EarachT" + - "agbanwaTakriTai LeTai Lue ÙrTaimilTangutTai VietTeluguTengwarTifinag" + - "hTagalogThaanaTàidhTibeitisTirhutaVaiVarang KshitiWoleaiSeann-Pheirs" + - "isYiGnìomhairean matamataigSamhlaidheanGun sgrìobhadhCoitcheannLitre" + - "adh neo-aithnichte", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x001a, 0x001e, 0x0025, 0x0035, 0x003e, - 0x0048, 0x004c, 0x0051, 0x005a, 0x005f, 0x0069, 0x0069, 0x0078, - 0x0080, 0x0086, 0x008d, 0x008d, 0x0092, 0x0098, 0x00cc, 0x00cc, - 0x00d0, 0x00d8, 0x00dd, 0x00e4, 0x00ef, 0x00f6, 0x011b, 0x0125, - 0x012c, 0x012c, 0x012c, 0x012c, 0x014b, 0x014b, 0x0152, 0x0152, - 0x015e, 0x015e, 0x0164, 0x016b, 0x0173, 0x017b, 0x0183, 0x0183, - 0x0189, 0x018c, 0x0193, 0x01a1, 0x01b1, 0x01b1, 0x01b7, 0x01bf, - 0x01db, 0x01e7, 0x01fb, 0x0209, 0x0209, 0x0218, 0x021c, 0x0227, - // Entry 40 - 7F - 0x0230, 0x0237, 0x023f, 0x0247, 0x0251, 0x0257, 0x025d, 0x0264, - 0x026f, 0x0275, 0x027b, 0x0280, 0x0286, 0x0296, 0x02ac, 0x02b4, - 0x02ba, 0x02bf, 0x02c7, 0x02cf, 0x02cf, 0x02d3, 0x02d3, 0x02d3, - 0x02db, 0x02db, 0x02db, 0x02db, 0x02f4, 0x02f9, 0x02f9, 0x02f9, - 0x0302, 0x0306, 0x030f, 0x030f, 0x0312, 0x031e, 0x0325, 0x032d, - 0x0344, 0x0344, 0x0344, 0x034d, 0x0353, 0x0359, 0x0366, 0x036e, - 0x0374, 0x0379, 0x0379, 0x0380, 0x0380, 0x038b, 0x038b, 0x0393, - 0x0393, 0x0393, 0x0393, 0x0393, 0x0393, 0x03ac, 0x03b2, 0x03bc, - // Entry 80 - BF - 0x03cc, 0x03cc, 0x03d2, 0x03e8, 0x03f2, 0x03f2, 0x03f2, 0x03f9, - 0x0400, 0x0409, 0x0410, 0x041c, 0x0421, 0x042d, 0x0437, 0x0437, - 0x0449, 0x045a, 0x0462, 0x0467, 0x046d, 0x0478, 0x047e, 0x0484, - 0x048c, 0x0492, 0x0499, 0x04a1, 0x04a8, 0x04ae, 0x04b4, 0x04bc, - 0x04c3, 0x04c3, 0x04c6, 0x04c6, 0x04d3, 0x04d9, 0x04e7, 0x04e7, - 0x04e9, 0x04e9, 0x0501, 0x0501, 0x050d, 0x051c, 0x0526, 0x053d, - }, - }, - { // gl - "árabearmeniobengalíbopomofobrailleSilabario aborixe canadiano unificadoc" + - "irílicodevanágarietíopexeorxianogregoguxaratígurmukhihanbhangulhanha" + - "n simplificadohan tradicionalhebreohiraganasilabarios xaponesesjamox" + - "aponéskatakanakhmercanaréscoreanolaosianolatinomalabarmongolbirmanoo" + - "riácingaléstámiltelugúthaanatailandéstibetanonotación matemáticaemoj" + - "issímbolosnon escritocomúnalfabeto descoñecido", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x0015, 0x0015, 0x0015, - 0x001d, 0x001d, 0x0024, 0x0024, 0x0024, 0x0024, 0x0049, 0x0049, - 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, 0x0052, 0x0052, 0x005d, - 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x0064, 0x0064, - 0x006d, 0x006d, 0x006d, 0x006d, 0x0072, 0x007b, 0x0083, 0x0087, - 0x008d, 0x0090, 0x0090, 0x00a0, 0x00af, 0x00af, 0x00b5, 0x00bd, - 0x00bd, 0x00bd, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d5, 0x00d5, - // Entry 40 - 7F - 0x00dd, 0x00dd, 0x00dd, 0x00e5, 0x00e5, 0x00ea, 0x00ea, 0x00f2, - 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x0101, 0x0101, 0x0101, 0x0107, - 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, - 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, - 0x010e, 0x010e, 0x0114, 0x0114, 0x0114, 0x0114, 0x0114, 0x011b, - 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, - 0x011b, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, - 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, - // Entry 80 - BF - 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, - 0x0120, 0x0120, 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, - 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, 0x012f, 0x012f, - 0x012f, 0x0136, 0x0136, 0x0136, 0x0136, 0x013c, 0x0146, 0x014e, - 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, - 0x014e, 0x014e, 0x0163, 0x0169, 0x0172, 0x017d, 0x0183, 0x0198, - }, - }, - { // gsw - "ArabischArmiArmenischAveschtischBalinesischBattakischBengalischBliss-Sym" + - "boolBopomofoBrahmiBlindäschriftBuginesischBuhidUCASKarischChamCherok" + - "eeCirthKoptischZypriotischKyrillischAltchileslawischTövanagaariTeser" + - "etTemozisch-ÄgüptischHiraazisch-ÄgüptischÄgüptischi HiroglüüfeÄzioop" + - "ischGhutsuriGeorgischGlagolitischGotischGriechischGuscharatiGurmukhi" + - "HangulChineesischHanunooVeräifachti Chineesischi SchriftTradizionell" + - "i Chineesischi SchriftHebräischHiraganaPahawh HmongKatakana oder Hir" + - "aganaAltungarischIndus-SchriftAltitalischJavanesischJapanischKayah L" + - "iKatakanaKharoshthiKhmerKannadaKoreanischLannaLaotischLatiinisch - F" + - "raktur-VarianteLatiinisch - Gäälischi VarianteLatiinischLepchaLimbuL" + - "inear ALinear BLykischLydischMandäischManichäischMaya-HieroglyphäMer" + - "oitischMalaysischMongolischMoonMeitei MayekBurmesischN’KoOghamOl Chi" + - "kiOrchon-RunäOriyaOsmanischAltpermischPhags-paPahlaviPhönizischPolla" + - "rd PhonetischRejangRongorongoRunäschriftSamaritanischSaratiSaurashtr" + - "aGebäärdeschpraachShaw-AlphabetSinghalesischSundanesischSyloti Nagri" + - "SyrischSyrisch - Eschtrangelo-VarianteWeschtsyrischOschtsyrischTagba" + - "nwaTai LeTai LueTamilischTeluguTengwarTifinaghTagalogThaanaThaiTibee" + - "tischUgaritischVaiSichtbari SchpraachAltpersischSumerisch-akkadischi" + - " KeilschriftYiG’eerbtä SchriftwärtSchriftlosi SchpraachUnbeschtimmtU" + - "ncodiirti Schrift", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x000c, 0x0015, - 0x0020, 0x002b, 0x002b, 0x002b, 0x0035, 0x003f, 0x003f, 0x004c, - 0x0054, 0x005a, 0x0068, 0x0073, 0x0078, 0x0078, 0x007c, 0x0083, - 0x0087, 0x008f, 0x0094, 0x009c, 0x00a7, 0x00b1, 0x00c1, 0x00cd, - 0x00d4, 0x00d4, 0x00e9, 0x00ff, 0x0118, 0x0118, 0x0123, 0x012b, - 0x0134, 0x0140, 0x0147, 0x0147, 0x0151, 0x015b, 0x0163, 0x0163, - 0x0169, 0x0174, 0x017b, 0x019c, 0x01be, 0x01be, 0x01c8, 0x01d0, - 0x01d0, 0x01dc, 0x01f2, 0x01fe, 0x020b, 0x0216, 0x0216, 0x0221, - // Entry 40 - 7F - 0x022a, 0x022a, 0x0232, 0x023a, 0x0244, 0x0249, 0x0249, 0x0250, - 0x025a, 0x025a, 0x025a, 0x025f, 0x0267, 0x0284, 0x02a5, 0x02af, - 0x02b5, 0x02ba, 0x02c2, 0x02ca, 0x02ca, 0x02ca, 0x02d1, 0x02d8, - 0x02d8, 0x02e2, 0x02ee, 0x02ee, 0x02ff, 0x02ff, 0x02ff, 0x0309, - 0x0313, 0x0313, 0x031d, 0x0321, 0x0321, 0x032d, 0x032d, 0x0337, - 0x0337, 0x0337, 0x0337, 0x0337, 0x033d, 0x033d, 0x0342, 0x034a, - 0x0356, 0x035b, 0x035b, 0x0364, 0x0364, 0x0364, 0x036f, 0x0377, - 0x0377, 0x0377, 0x037e, 0x0389, 0x039b, 0x039b, 0x03a1, 0x03ab, - // Entry 80 - BF - 0x03b7, 0x03c4, 0x03ca, 0x03ca, 0x03d4, 0x03e7, 0x03f4, 0x03f4, - 0x03f4, 0x03f4, 0x0401, 0x0401, 0x040d, 0x0419, 0x0420, 0x043f, - 0x044c, 0x0458, 0x0460, 0x0460, 0x0466, 0x046d, 0x0476, 0x0476, - 0x0476, 0x047c, 0x0483, 0x048b, 0x0492, 0x0498, 0x049c, 0x04a6, - 0x04a6, 0x04b0, 0x04b3, 0x04c6, 0x04c6, 0x04c6, 0x04d1, 0x04f1, - 0x04f3, 0x050b, 0x050b, 0x050b, 0x050b, 0x0520, 0x052c, 0x053e, - }, - }, - { // gu - guScriptStr, - guScriptIdx, - }, - {}, // guz - {}, // gv - {}, // ha - {}, // haw - { // he - heScriptStr, - heScriptIdx, - }, - { // hi - hiScriptStr, - hiScriptIdx, - }, - { // hr - hrScriptStr, - hrScriptIdx, - }, - { // hsb - "arabscearmenscebengalscebopomofoBraillowe pismokyriliscedevanagarietiopi" + - "scegeorgiscegrjekscegujaratigurmukhihangulchinscezjednorjene chinske" + - " pismotradicionalne chinske pismohebrejscehiraganajapanscekatakanakh" + - "merscekannadscekorejscelaoscełaćonscemalayalamscemongolsceburmasceor" + - "iyasinghalscetamilsceteluguthaanathailandscetibetscesymbolebjez pism" + - "apowšitkownenjeznate pismo", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x0018, 0x0018, 0x0018, - 0x0020, 0x0020, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x0038, 0x0038, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x004b, 0x004b, - 0x0054, 0x0054, 0x0054, 0x0054, 0x005c, 0x0064, 0x006c, 0x006c, - 0x0072, 0x0079, 0x0079, 0x0092, 0x00ad, 0x00ad, 0x00b6, 0x00be, - 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, - // Entry 40 - 7F - 0x00c6, 0x00c6, 0x00c6, 0x00ce, 0x00ce, 0x00d6, 0x00d6, 0x00df, - 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00ed, 0x00ed, 0x00ed, 0x00f7, - 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, - 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, - 0x0103, 0x0103, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x0114, - 0x0114, 0x0114, 0x0114, 0x0114, 0x0114, 0x0114, 0x0114, 0x0114, - 0x0114, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - // Entry 80 - BF - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, - 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, 0x012b, 0x012b, - 0x012b, 0x0131, 0x0131, 0x0131, 0x0131, 0x0137, 0x0142, 0x014a, - 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, - 0x014a, 0x014a, 0x014a, 0x014a, 0x0151, 0x015b, 0x0167, 0x0175, - }, - }, - { // hu - huScriptStr, - huScriptIdx, - }, - { // hy - hyScriptStr, - hyScriptIdx, - }, - { // id - idScriptStr, - idScriptIdx, - }, - {}, // ig - { // ii - "ꀊꇁꀨꁱꂷꀊꆨꌦꇁꃚꁱꂷꈝꐯꉌꈲꁱꂷꀎꋏꉌꈲꁱꂷꇁꄀꁱꂷꆈꌠꁱꂷꁱꀋꉆꌠꅉꀋꐚꌠꁱꂷ", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x0024, 0x0024, 0x0024, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, - 0x0024, 0x0024, 0x0024, 0x0036, 0x0048, 0x0048, 0x0048, 0x0048, - 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, - // Entry 40 - 7F - 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, - 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - // Entry 80 - BF - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x006c, 0x006c, 0x007e, - }, - }, - { // is - isScriptStr, - isScriptIdx, - }, - { // it - itScriptStr, - itScriptIdx, - }, - { // ja - jaScriptStr, - jaScriptIdx, - }, - { // jgo - "mík -ŋwaꞌnɛ yi ɛ́ líŋɛ́nɛ Latɛ̂ŋntúu yi pɛ́ ká ŋwaꞌnεntɛ-ŋwaꞌnɛ yí pɛ́ k" + - "á kɛ́ jí", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - // Entry 80 - BF - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x004c, 0x004c, 0x0073, - }, - }, - {}, // jmc - { // ka - kaScriptStr, - kaScriptIdx, - }, - {}, // kab - {}, // kam - {}, // kde - { // kea - "arábikuarméniubengalibopomofobraillesirílikudevanagarietiópikujorjianugr" + - "egugujaratigurmukihangulhanhan simplifikaduhan tradisionalebraikuira" + - "ganajaponeskatakanakmerkanareskorianulausianulatinumalaialammongolbi" + - "rmanesoriyasingalestamiltelugutaanatailandestibetanusímbulusnãu skri" + - "tukomunskrita diskonxedu", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0017, 0x0017, 0x0017, - 0x001f, 0x001f, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x002f, 0x002f, 0x0039, - 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0042, 0x0042, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004f, 0x0057, 0x005e, 0x005e, - 0x0064, 0x0067, 0x0067, 0x0077, 0x0086, 0x0086, 0x008d, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - // Entry 40 - 7F - 0x009b, 0x009b, 0x009b, 0x00a3, 0x00a3, 0x00a7, 0x00a7, 0x00ae, - 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00bd, 0x00bd, 0x00bd, 0x00c3, - 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, - 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, - 0x00cc, 0x00cc, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00da, - 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, - 0x00da, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, - 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, - // Entry 80 - BF - 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, - 0x00df, 0x00df, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, - 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00ec, 0x00ec, - 0x00ec, 0x00f2, 0x00f2, 0x00f2, 0x00f2, 0x00f7, 0x0100, 0x0108, - 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, - 0x0108, 0x0108, 0x0108, 0x0108, 0x0111, 0x011c, 0x0121, 0x0132, - }, - }, - {}, // khq - {}, // ki - { // kk - kkScriptStr, - kkScriptIdx, - }, - {}, // kkj - {}, // kl - {}, // kln - { // km - kmScriptStr, - kmScriptIdx, - }, - { // kn - knScriptStr, - knScriptIdx, - }, - { // ko - koScriptStr, - koScriptIdx, - }, - {}, // ko-KP - {}, // kok - { // ks - "اَربیاَرمانیَناَویستَنبالَنیٖزباتَکبیٚنگٲلۍبِلِس سِمبلزبوپوموفوبرٛاہمیبر" + - "یلبُگِنیٖزبُہِدیُنِفایِڑ کنیڑِیَن ایٚب آرجِنَل سِلیبِککاریَنچَمچیٚر" + - "وکیکِرتھکاپٹِککِپرایِٹسَیرِلِکپرون چٔرچسلیوونِک سَیرِلِکدیوناگریڈیٚ" + - "سٔریٚٹاِجپشِیَن ڈِماٹِکاِجِپشَن ہَیریٹِکاِجِپشَن ہَیروگلِپھساِتھیوپ" + - "ِکجارجِیَن کھتسوریجارجِیَنگلیگولِٹِکگوتھِکگرَنتھاگریٖکگُجرٲتۍہانٛگُ" + - "لہانہانُنوٗسِمپلِفایِڑ ہانٹریڑِشَنَلہِبرِوہیٖراگاناپَہاو مانٛگکَٹاک" + - "انا یا ہِراگاناپرون ہَنگیریَناِنڈَساولڈ اِٹیلِکجاوَنیٖزجیٚپَنیٖزکای" + - "ا لیکَتاکاناخَروشتھیکھٕمیرکَنَڑاکوریَنلانالاوفرٛکتُر لیٹِنگیلِک لیٹ" + - "َنلیٹِنلیٚپکالِمبوٗلیٖنیَر اےلیٖنیَر بیلیسِیَنلیدِیَنمَندییَنمانیشی" + - "یَنمایَن ہیٖروگلِپھمِرایٹِکمَلیالَممَنٛگولیَنموٗنمیتی مایَکمَیَنمار" + - "ایٚن کواوگہاماول چِکیاورکھوناورِیااوسمانیااولڈ پٔرمِکپھاگس پابوٗک پ" + - "َہَلویپھونِشِیَنپولاڑ پھونِٹِکریجَنٛگرونٛگو رونٛگورَنِکسَمارِٹَنسَر" + - "اتیسوراشٹرااِشارٲتی لِکھٲےشاویَنسِنہالاسَنڈَنیٖزسیلوتی ناگریسیٖرِیَ" + - "کایٚسٹرینجِلو سیٖرِیَکمغرِبی سیٖریَکمشرَقی سیٖریَکتَگبَنواتَیلیےنوٚ" + - "و تیلوتَمِلتیلگوٗتیٚنگوارتِفِناگتَگَلوگتھاناتھاےتِبتیاُگارِٹِکواےوِ" + - "زِبٕل سپیٖچپرون فارسیسُمیرو اکادیَن کوٗنِفامیٖیلیٚکھنَےعاماَن زٲنۍ " + - "یا نا لَگہٕ ہار رَسمُل خظ", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x001c, - 0x002c, 0x003c, 0x003c, 0x003c, 0x0046, 0x0056, 0x0056, 0x006d, - 0x007d, 0x008b, 0x0093, 0x00a3, 0x00ad, 0x00ad, 0x00f7, 0x0103, - 0x0109, 0x0117, 0x0121, 0x012d, 0x013d, 0x014d, 0x017f, 0x018f, - 0x01a1, 0x01a1, 0x01c2, 0x01e3, 0x020a, 0x020a, 0x021c, 0x023b, - 0x024b, 0x025f, 0x026b, 0x026b, 0x0279, 0x0283, 0x0291, 0x0291, - 0x029f, 0x02a5, 0x02b3, 0x02d0, 0x02e4, 0x02e4, 0x02f0, 0x0302, - 0x0302, 0x0317, 0x033d, 0x0358, 0x0364, 0x037b, 0x037b, 0x038b, - // Entry 40 - 7F - 0x039d, 0x039d, 0x03aa, 0x03ba, 0x03ca, 0x03d6, 0x03d6, 0x03e2, - 0x03ee, 0x03ee, 0x03ee, 0x03f6, 0x03fc, 0x0415, 0x042a, 0x0434, - 0x0440, 0x044c, 0x045f, 0x0472, 0x0472, 0x0472, 0x0480, 0x048e, - 0x048e, 0x049e, 0x04b0, 0x04b0, 0x04cf, 0x04cf, 0x04cf, 0x04df, - 0x04ef, 0x04ef, 0x0503, 0x050b, 0x050b, 0x051e, 0x051e, 0x052e, - 0x052e, 0x052e, 0x052e, 0x052e, 0x053b, 0x053b, 0x0547, 0x0556, - 0x0564, 0x0570, 0x0570, 0x0580, 0x0580, 0x0580, 0x0595, 0x05a4, - 0x05a4, 0x05a4, 0x05bb, 0x05cf, 0x05ea, 0x05ea, 0x05f8, 0x0611, - // Entry 80 - BF - 0x061b, 0x062d, 0x0639, 0x0639, 0x0649, 0x0666, 0x0672, 0x0672, - 0x0672, 0x0672, 0x0680, 0x0680, 0x0692, 0x06a9, 0x06b9, 0x06e2, - 0x06fd, 0x0718, 0x0728, 0x0728, 0x0734, 0x0745, 0x074f, 0x074f, - 0x074f, 0x075b, 0x076b, 0x0779, 0x0787, 0x0791, 0x0799, 0x07a3, - 0x07a3, 0x07b5, 0x07bb, 0x07d4, 0x07d4, 0x07d4, 0x07e7, 0x0813, - 0x0819, 0x0819, 0x0819, 0x0819, 0x0819, 0x0829, 0x082f, 0x086c, - }, - }, - {}, // ksb - {}, // ksf - { // ksh - "arraabesche Schreffarmeenesche Schreffbängjaalesche Schreffschineeseche " + - "Ömschreff BopomofoBlindeschreffkürrellesche Schreffindesche Devanaj" + - "ari-Schreffätejoopesche Schreffje’orrjesche Schreffjriischesche Schr" + - "effjujaraatesche Schreffindesche Gurmukhi-Schreffkorrejaanesche Schr" + - "effen schineesesche Schreffeijfacher schineesesche Schrefftradizjonä" + - "ll schineesesche Schreffhebrääjesche Schreffjapaanesche Hiddajaana-S" + - "chreffen japaanesche Schreffjapaanesche Kattakaana-SchreffKhmer-Schr" + - "effindesche Kannada-Schreffkorrejaanesche Schreff udder en schineese" + - "sche Schrefflahootesche Schrefflateinesche Schreffindesche Malajalam" + - "-Schreffmongjoolesche Schreffbirmahnesche Schreffindesche Orija-Schr" + - "effsingjaleesesche Schrefftamiilesche Schreffindesche Telugu-Schreff" + - "malledivesche Taana-Schrefftailändesche Schrefftibeetesche Schreff-Z" + - "eiche ävver kein Schreff--jaa keij Schreff--öhnß en Schreff--onbikan" + - "nte Schreff-", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0013, 0x0013, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x003c, 0x003c, 0x003c, - 0x005c, 0x005c, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x007e, 0x007e, 0x0099, - 0x0099, 0x0099, 0x0099, 0x0099, 0x0099, 0x0099, 0x00ae, 0x00ae, - 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00d8, 0x00ed, 0x0106, 0x0106, - 0x011c, 0x0134, 0x0134, 0x0153, 0x0176, 0x0176, 0x018c, 0x01aa, - 0x01aa, 0x01aa, 0x01aa, 0x01aa, 0x01aa, 0x01aa, 0x01aa, 0x01aa, - // Entry 40 - 7F - 0x01c0, 0x01c0, 0x01c0, 0x01de, 0x01de, 0x01eb, 0x01eb, 0x0203, - 0x0238, 0x0238, 0x0238, 0x0238, 0x024b, 0x024b, 0x024b, 0x025e, - 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, - 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, - 0x0278, 0x0278, 0x028d, 0x028d, 0x028d, 0x028d, 0x028d, 0x02a1, - 0x02a1, 0x02a1, 0x02a1, 0x02a1, 0x02a1, 0x02a1, 0x02a1, 0x02a1, - 0x02a1, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, - 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, - // Entry 80 - BF - 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, - 0x02b7, 0x02b7, 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02ce, - 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02e1, 0x02e1, - 0x02e1, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0313, 0x0328, 0x033b, - 0x033b, 0x033b, 0x033b, 0x033b, 0x033b, 0x033b, 0x033b, 0x033b, - 0x033b, 0x033b, 0x033b, 0x033b, 0x0357, 0x0369, 0x037c, 0x0390, - }, - }, - {}, // kw - { // ky - kyScriptStr, - kyScriptIdx, - }, - {}, // lag - { // lb - "ArabeschArmiArmeneschAvesteschBalineseschBattakeschBengaleschBliss-Symbo" + - "lerBopomofoBrahmiBlanneschrëftBugineseschBuhidUCASKareschChamCheroke" + - "eCirthKopteschZyprioteschKyrilleschAlkiercheslaweschDevanagariDesere" + - "tEgyptesch-DemoteschEgyptesch-HierateschEgyptesch HieroglyphenEthiop" + - "eschKhutsuriGeorgeschGlagoliteschGoteschGriicheschGujaratiGurmukhiHa" + - "ngulChineseschHanunooVereinfacht ChineseschTraditionellt ChineseschH" + - "ebräeschHiraganaPahawh HmongKatakana oder HiraganaAlungareschIndus-S" + - "chrëftAlitaleschJavaneseschJapaneschKayah LiKatakanaKharoshthiKhmerK" + - "annadaKoreaneschLannaLaoteschLaténgesch-Fraktur-VariantLaténgesch-Gä" + - "llesch VariantLaténgeschLepchaLimbuLinear ALinear BLykeschLydeschMan" + - "däeschManichäeschMaya-HieroglyphenMeroiteschMalayseschMongoleschMoon" + - "Meitei MayekBirmaneschN’KoOghamOl ChikiOrchon-RunenOriyaOsmaneschAlp" + - "ermeschPhags-paPahlaviPhönizeschPollard PhoneteschRejangRongorongoRu" + - "neschrëftSamaritaneschSaratiSaurashtraZeechesproochShaw-AlphabetSing" + - "haleseschSundaneseschSyloti NagriSyreschSyresch-Estrangelo-VariantWe" + - "stsyreschOstsyreschTai LeTai LueTamileschTeluguTengwarTifinaghDagalo" + - "gThaanaThaiTibeteschUgariteschVaiSiichtbar SproochAlperseschSumeresc" + - "h-akkadesch KeilschrëftYiGeierfte SchrëftwäertSymbolerOuni SchrëftOn" + - "bestëmmtOncodéiert Schrëft", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x000c, 0x0015, - 0x001e, 0x0029, 0x0029, 0x0029, 0x0033, 0x003d, 0x003d, 0x004b, - 0x0053, 0x0059, 0x0067, 0x0072, 0x0077, 0x0077, 0x007b, 0x0082, - 0x0086, 0x008e, 0x0093, 0x009b, 0x00a6, 0x00b0, 0x00c1, 0x00cb, - 0x00d2, 0x00d2, 0x00e5, 0x00f9, 0x010f, 0x010f, 0x0119, 0x0121, - 0x012a, 0x0136, 0x013d, 0x013d, 0x0147, 0x014f, 0x0157, 0x0157, - 0x015d, 0x0167, 0x016e, 0x0184, 0x019c, 0x019c, 0x01a6, 0x01ae, - 0x01ae, 0x01ba, 0x01d0, 0x01db, 0x01e9, 0x01f3, 0x01f3, 0x01fe, - // Entry 40 - 7F - 0x0207, 0x0207, 0x020f, 0x0217, 0x0221, 0x0226, 0x0226, 0x022d, - 0x0237, 0x0237, 0x0237, 0x023c, 0x0244, 0x025f, 0x027c, 0x0287, - 0x028d, 0x0292, 0x029a, 0x02a2, 0x02a2, 0x02a2, 0x02a9, 0x02b0, - 0x02b0, 0x02ba, 0x02c6, 0x02c6, 0x02d7, 0x02d7, 0x02d7, 0x02e1, - 0x02eb, 0x02eb, 0x02f5, 0x02f9, 0x02f9, 0x0305, 0x0305, 0x030f, - 0x030f, 0x030f, 0x030f, 0x030f, 0x0315, 0x0315, 0x031a, 0x0322, - 0x032e, 0x0333, 0x0333, 0x033c, 0x033c, 0x033c, 0x0346, 0x034e, - 0x034e, 0x034e, 0x0355, 0x0360, 0x0372, 0x0372, 0x0378, 0x0382, - // Entry 80 - BF - 0x038e, 0x039b, 0x03a1, 0x03a1, 0x03ab, 0x03b8, 0x03c5, 0x03c5, - 0x03c5, 0x03c5, 0x03d2, 0x03d2, 0x03de, 0x03ea, 0x03f1, 0x040b, - 0x0416, 0x0420, 0x0420, 0x0420, 0x0426, 0x042d, 0x0436, 0x0436, - 0x0436, 0x043c, 0x0443, 0x044b, 0x0452, 0x0458, 0x045c, 0x0465, - 0x0465, 0x046f, 0x0472, 0x0483, 0x0483, 0x0483, 0x048d, 0x04ad, - 0x04af, 0x04c6, 0x04c6, 0x04c6, 0x04ce, 0x04db, 0x04e6, 0x04fa, - }, - }, - {}, // lg - {}, // lkt - {}, // ln - { // lo - loScriptStr, - loScriptIdx, - }, - { // lrc - "عأرأڤیأرمأنیبأنگالیبوٙپوٙبئرئیلسیریلیکدیڤانگأریئتوٙیوٙپیاییگورجییوٙنانیگ" + - "وجأراتیگوٙروٙمخیھانگوٙلھانیبیتار سادە بیەسونأتی بیتارعئبریھیراگاناج" + - "اپوٙنیکاتانگاخئمئرکاناداکورئ ییلائولاتینمالایامموغولیمیانمارئوریاسی" + - "ناھالاتامیلتئلئگوتاناتایلأندیتأبأتینئشوٙنە یانیسئسە نأبیەجائوفتاأنی" + - "سئسە نادیار", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0026, 0x0026, 0x0026, - 0x0032, 0x0032, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, - 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x004c, 0x004c, 0x005e, - 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x0076, 0x0076, - 0x0080, 0x0080, 0x0080, 0x0080, 0x008e, 0x009e, 0x00b0, 0x00b0, - 0x00be, 0x00c6, 0x00c6, 0x00e0, 0x00f7, 0x00f7, 0x0101, 0x0111, - 0x0111, 0x0111, 0x0111, 0x0111, 0x0111, 0x0111, 0x0111, 0x0111, - // Entry 40 - 7F - 0x011f, 0x011f, 0x011f, 0x012d, 0x012d, 0x0137, 0x0137, 0x0143, - 0x0150, 0x0150, 0x0150, 0x0150, 0x0158, 0x0158, 0x0158, 0x0162, - 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, - 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, - 0x0170, 0x0170, 0x017c, 0x017c, 0x017c, 0x017c, 0x017c, 0x018a, - 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, - 0x018a, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, - 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, - // Entry 80 - BF - 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, - 0x0194, 0x0194, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, - 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01ae, 0x01ae, - 0x01ae, 0x01ba, 0x01ba, 0x01ba, 0x01ba, 0x01c2, 0x01d2, 0x01de, - 0x01de, 0x01de, 0x01de, 0x01de, 0x01de, 0x01de, 0x01de, 0x01de, - 0x01de, 0x01de, 0x01de, 0x01de, 0x01f1, 0x0208, 0x0218, 0x0231, - }, - }, - { // lt - ltScriptStr, - ltScriptIdx, - }, - {}, // lu - {}, // luo - {}, // luy - { // lv - lvScriptStr, - lvScriptIdx, - }, - {}, // mas - {}, // mer - {}, // mfe - {}, // mg - {}, // mgh - { // mgo - "ngam ŋwaʼringam choʼabo ŋwaʼri tisɔʼ", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - // Entry 80 - BF - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x0017, 0x0017, 0x002b, - }, - }, - { // mk - mkScriptStr, - mkScriptIdx, - }, - { // ml - mlScriptStr, - mlScriptIdx, - }, - { // mn - mnScriptStr, - mnScriptIdx, - }, - { // mr - mrScriptStr, - mrScriptIdx, - }, - { // ms - msScriptStr, - msScriptIdx, - }, - { // mt - "GħarbiĊirillikuGriegHan SimplifikatHan TradizzjonaliLatinPersjan AntikMh" + - "ux MiktubKomuniKitba Mhux Magħrufa", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0016, 0x0016, 0x0016, 0x0016, - 0x0016, 0x0016, 0x0016, 0x0025, 0x0036, 0x0036, 0x0036, 0x0036, - 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, - // Entry 40 - 7F - 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, - 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x003b, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - // Entry 80 - BF - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, - 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x0048, 0x0048, - 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0053, 0x0059, 0x006d, - }, - }, - {}, // mua - { // my - myScriptStr, - myScriptIdx, - }, - { // mzn - "عربیارمنیبنگالیبوپوموفوسیریلیکدیوانانگریاتیوپیاییگرجییونانیگجراتیگورموخی" + - "هانگولهانساده\u200cبَیی هاناستاندارد ِسنتی هانتعبریهیراگاناجاپونیکا" + - "تاکانا", - []uint16{ // 68 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x001e, 0x001e, 0x001e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x003c, 0x003c, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0062, 0x0062, - 0x006a, 0x006a, 0x006a, 0x006a, 0x0076, 0x0082, 0x0090, 0x0090, - 0x009c, 0x00a2, 0x00a2, 0x00bc, 0x00e2, 0x00e2, 0x00ea, 0x00fa, - 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, - // Entry 40 - 7F - 0x0106, 0x0106, 0x0106, 0x0116, - }, - }, - {}, // naq - {}, // nd - { // ne - neScriptStr, - neScriptIdx, - }, - { // nl - nlScriptStr, - nlScriptIdx, - }, - {}, // nmg - { // nn - "arabiskarmiskarmenskavestiskbalinesiskbatakbengaliblissymbolbopomofobrah" + - "mibraillebuginesiskbuhidchakmafelles kanadiske urspråksstavingarkari" + - "skchamcherokeecirthkoptiskkypriotiskkyrilliskkyrillisk (kyrkjeslavis" + - "k variant)devanagarideseretegyptisk demotiskegyptisk hieratiskegypti" + - "ske hieroglyfaretiopiskkhutsuri (asomtavruli og nuskhuri)georgiskgla" + - "golittiskgotiskgreskgujaratigurmukhihangulhanhanunooforenkla kinesis" + - "ktradisjonell kinesiskhebraiskhiraganapahawk hmongkatakana eller hir" + - "aganagammalungarskindusgammalitaliskjavanesiskjapanskkayah likatakan" + - "akharoshthikhmerkannadakoreanskkaithisklannalaotisklatinsk (frakturv" + - "ariant)latinsk (gælisk variant)latinsklepchalumbulineær Alineær Blyk" + - "isklydiskmandaiskmanikeiskmaya-hieroglyfarmeroitiskmalayalammongolsk" + - "moonmeitei-mayekmyanmarn’kooghamol-chikiorkhonoriyaosmanyagammalperm" + - "iskphags-painskripsjonspahlavisalmepahlavipahlavifønikiskpollard-fon" + - "etiskinskripsjonsparthiskrejangrongorongorunersamaritansksaratisaura" + - "shtrateiknskriftshavisksinhalasundanesisksyloti nagrisyriakisksyriak" + - "isk (estrangelo-variant)syriakisk (vestleg variant)syriakisk (austle" + - "g variant)tagbanwatai leny tai luetamilsktai viettelugutengwartifina" + - "ghtagalogthaanathaitibetanskugaritiskvaisynleg talegammalpersisksume" + - "ro-akkadisk kileskriftyinedarvamatematisk notasjonsymbolkode for spr" + - "åk utan skriftfellesukjend skrift", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x000d, 0x0014, - 0x001c, 0x0026, 0x0026, 0x0026, 0x002b, 0x0032, 0x0032, 0x003c, - 0x0044, 0x004a, 0x0051, 0x005b, 0x0060, 0x0066, 0x0089, 0x008f, - 0x0093, 0x009b, 0x00a0, 0x00a7, 0x00b1, 0x00ba, 0x00db, 0x00e5, - 0x00ec, 0x00ec, 0x00fd, 0x010f, 0x0124, 0x0124, 0x012c, 0x014e, - 0x0156, 0x0162, 0x0168, 0x0168, 0x016d, 0x0175, 0x017d, 0x017d, - 0x0183, 0x0186, 0x018d, 0x019e, 0x01b3, 0x01b3, 0x01bb, 0x01c3, - 0x01c3, 0x01cf, 0x01e6, 0x01f3, 0x01f8, 0x0205, 0x0205, 0x020f, - // Entry 40 - 7F - 0x0216, 0x0216, 0x021e, 0x0226, 0x0230, 0x0235, 0x0235, 0x023c, - 0x0244, 0x0244, 0x024c, 0x0251, 0x0258, 0x0270, 0x0289, 0x0290, - 0x0296, 0x029b, 0x02a4, 0x02ad, 0x02ad, 0x02ad, 0x02b3, 0x02b9, - 0x02b9, 0x02c1, 0x02ca, 0x02ca, 0x02da, 0x02da, 0x02da, 0x02e3, - 0x02ec, 0x02ec, 0x02f4, 0x02f8, 0x02f8, 0x0304, 0x0304, 0x030b, - 0x030b, 0x030b, 0x030b, 0x030b, 0x0311, 0x0311, 0x0316, 0x031e, - 0x0324, 0x0329, 0x0329, 0x0330, 0x0330, 0x0330, 0x033d, 0x0345, - 0x0358, 0x0364, 0x036b, 0x0374, 0x0384, 0x0398, 0x039e, 0x03a8, - // Entry 80 - BF - 0x03ad, 0x03b8, 0x03be, 0x03be, 0x03c8, 0x03d3, 0x03da, 0x03da, - 0x03da, 0x03da, 0x03e1, 0x03e1, 0x03ec, 0x03f8, 0x0401, 0x041f, - 0x043a, 0x0455, 0x045d, 0x045d, 0x0463, 0x046d, 0x0474, 0x0474, - 0x047c, 0x0482, 0x0489, 0x0491, 0x0498, 0x049e, 0x04a2, 0x04ab, - 0x04ab, 0x04b4, 0x04b7, 0x04c2, 0x04c2, 0x04c2, 0x04cf, 0x04e9, - 0x04eb, 0x04f2, 0x0505, 0x0505, 0x050b, 0x0526, 0x052c, 0x0539, - }, - }, - {}, // nnh - { // no - noScriptStr, - noScriptIdx, - }, - {}, // nus - {}, // nyn - { // om - "Latin", - []uint16{ // 80 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, - }, - }, - { // or - "ଆରବିକ୍ଇମ୍ପେରିଆଲ୍ ଆରମିକ୍ଆର୍ମେନିଆନ୍ଆବେସ୍ଥାନ୍ବାଲିନୀଜ୍ବାଟାକ୍ବଙ୍ଗାଳୀବ୍ଲିସିମ୍ବ" + - "ଲସ୍ବୋପୋମୋଫୋବ୍ରାହ୍ମୀବ୍ରିଲ୍ବୁଗାନୀଜ୍ବୁହିଦ୍ଚକମାୟୁନିଫାଏଡ୍ କାନାଡିଆନ୍ ଆବ୍" + - "ରୋଜିନାଲ୍ ସିଲାବିକସ୍କୈରନ୍ଛମ୍ଚିରୁକୀସିର୍ଥକପଟିକ୍ସିପ୍ରଅଟ୍ସିରିଲିକ୍ଓଲ୍ଡ ଚର" + - "୍ଚ୍ଚ ସାଲଭୋନିକ୍ ସିରିଲିକ୍ଦେବାନଗିରିଡେସର୍ଟଇଜିପ୍ଟିଆନ୍ ଡେମୋଟିକ୍ଇଜିପ୍ଟିଆନ" + - "୍ ହାଇଅରଟିକ୍ଇଜିପ୍ଟିଆନ୍ ହାଅରଗ୍ଲିପସ୍ଇଥୋପିକ୍ଜର୍ଜିଆନ୍ ଖୁଟସୁରୀଜର୍ଜିଆନ୍ଗ୍" + - "ଲାଗ୍ଲୋଟିକ୍ଗୋଥିକ୍ଗ୍ରୀକ୍ଗୁଜୁରାଟୀଗୁରୁମୁଖୀହାଙ୍ଗୁଲ୍ହାନ୍ହାନୁନ୍ସରଳୀକୃତ ହା" + - "ନ୍ପାରମ୍ପରିକ୍ ହାନ୍ହେବ୍ର୍ୟୁହିରାଗାନାପାହୋ ହୋଙ୍ଗକାଟାକାନ୍ କିମ୍ବା ହିରାଗାନ" + - "୍ପୁରୁଣା ହଙ୍ଗେରିଆନ୍ସିନ୍ଧୁପୁରୁଣା ଇଟାଲୀଜାଭାନୀଜ୍ଜାପାନୀଜ୍କାୟାହା ଲୀକାଟକା" + - "ନ୍ଖାରୋସ୍ଥିଖ୍ମେର୍କନ୍ନଡକୋରିଆନ୍କୈଥିଲାନାଲାଓଫ୍ରାକଥୁର୍ ଲାଟିନ୍ଗାଏଲିକ୍ ଲାଟ" + - "ିନ୍ଲାଟିନ୍ଲେପଚାଲିମ୍ବୁଲିନିୟର୍ଲିନିୟର୍ ବିଲିଶିୟନ୍ଲିଡିୟନ୍ମାନଡେନ୍ମନଶୀନ୍ମୟ" + - "ାନ୍ ହାୟରଲଜିକସ୍ମେରୋଇଟିକ୍ମାଲୟଲମ୍ମଙ୍ଗୋଲିଆନ୍ଚନ୍ଦ୍ରମାଏତି ମାୟେକ୍ମିଆମାର୍ଏ" + - "ନ୍ କୋଓଘାମାଓଲ୍ ଚିକିଓରୋଖନ୍ଓଡିଆଓସୋମାନିୟାଓଲ୍ଡ ପରମିକ୍ଫାଗସ୍-ପାଇନସ୍କ୍ରୀପସ" + - "ାନଲ୍ ପାହାଲାୱୀସ୍ଲାଟର୍ ପାହାଲାୱୀବୁକ୍ ପାହାଲାୱୀଫେନୋସିଆନ୍ପୋଲାର୍ଡ ଫୋନେଟିକ" + - "୍ଇନସ୍କ୍ରୀପସାନଲ୍ ପାର୍ଥିଆନ୍ରେଜାଙ୍ଗରୋଙ୍ଗୋରୋଙ୍ଗୋରନିକ୍ସମୌରିଟନ୍ସାରାତିସୌର" + - "ାଷ୍ଟ୍ରସାଙ୍କେତିକ ଲିଖସାବିୟାନ୍ସିଂହଳସୁଦାନୀଜ୍ସୀଲିତୋ ନଗରୀସିରିୟାକ୍ଏଷ୍ଟ୍ରା" + - "ଙ୍ଗେଲୋ ସିରିକ୍ୱେଷ୍ଟର୍ନ ସିରିକ୍ଇଷ୍ଟର୍ନ ସିରିକ୍ତଗବାନ୍ୱାତାଇ ଲେନୂତନ ତାଇ ଲ" + - "ୁଏତାମିଲ୍ତାଇ ଭିଏତ୍ତେଲୁଗୁତେଙ୍ଗୱାର୍ତିଫିଙ୍ଘାଟାଗାଲୋଗ୍ଥାନାଥାଇତିବେତାନ୍ୟୁଗ" + - "ାରିଟିକ୍ୱାଇଭିଜିବଲ୍ ସ୍ପିଚ୍ପୁରୁଣା ଫରାସୀସୁମେରୋ-ଆକ୍କାଡିଆନ୍ ସୁନିଫର୍ମୟୀବଂ" + - "ଶଗତଗାଣିତିକ ନୋଟେସନ୍ସିମ୍ବଲ୍ଅଲିଖିତସାଧାରଣଅଞ୍ଜାତ କିମ୍ବା ଅବୈଧ ସ୍କ୍ରୀପ୍ଟ", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0043, 0x0061, - 0x007c, 0x0094, 0x0094, 0x0094, 0x00a6, 0x00bb, 0x00bb, 0x00df, - 0x00f7, 0x010f, 0x0121, 0x0139, 0x014b, 0x0157, 0x01cc, 0x01db, - 0x01e4, 0x01f6, 0x0205, 0x0217, 0x022f, 0x0247, 0x029b, 0x02b6, - 0x02c8, 0x02c8, 0x02ff, 0x0339, 0x0379, 0x0379, 0x038e, 0x03bc, - 0x03d4, 0x03f8, 0x040a, 0x040a, 0x041c, 0x0434, 0x044c, 0x044c, - 0x0464, 0x0470, 0x0482, 0x04a4, 0x04cf, 0x04cf, 0x04e7, 0x04ff, - 0x04ff, 0x051b, 0x055f, 0x0590, 0x05a2, 0x05c4, 0x05c4, 0x05dc, - // Entry 40 - 7F - 0x05f4, 0x05f4, 0x060d, 0x0622, 0x063a, 0x064c, 0x064c, 0x065b, - 0x0670, 0x0670, 0x067c, 0x0688, 0x0691, 0x06bf, 0x06e7, 0x06f9, - 0x0708, 0x071a, 0x072f, 0x074b, 0x074b, 0x074b, 0x0760, 0x0775, - 0x0775, 0x078a, 0x079c, 0x079c, 0x07ca, 0x07ca, 0x07ca, 0x07e5, - 0x07fa, 0x07fa, 0x0818, 0x082a, 0x082a, 0x084c, 0x084c, 0x0861, - 0x0861, 0x0861, 0x0861, 0x0861, 0x0871, 0x0871, 0x0880, 0x0896, - 0x08a8, 0x08b4, 0x08b4, 0x08cf, 0x08cf, 0x08cf, 0x08ee, 0x0904, - 0x0947, 0x0975, 0x099a, 0x09b5, 0x09e3, 0x0a29, 0x0a3e, 0x0a62, - // Entry 80 - BF - 0x0a71, 0x0a89, 0x0a9b, 0x0a9b, 0x0ab6, 0x0adb, 0x0af3, 0x0af3, - 0x0af3, 0x0af3, 0x0b02, 0x0b02, 0x0b1a, 0x0b39, 0x0b51, 0x0b8b, - 0x0bb6, 0x0bde, 0x0bf6, 0x0bf6, 0x0c06, 0x0c26, 0x0c38, 0x0c38, - 0x0c51, 0x0c63, 0x0c7e, 0x0c96, 0x0cae, 0x0cba, 0x0cc3, 0x0cdb, - 0x0cdb, 0x0cf9, 0x0d02, 0x0d2a, 0x0d2a, 0x0d2a, 0x0d4c, 0x0d96, - 0x0d9c, 0x0dab, 0x0dd6, 0x0dd6, 0x0deb, 0x0dfd, 0x0e0f, 0x0e5d, - }, - }, - { // os - "АраббагКиррилицӕӔнцонгонд китайагТрадицион китайагЛатинагНӕфысгӕНӕзонгӕ " + - "скрипт", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x0020, 0x0020, 0x0020, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0020, 0x0020, 0x0020, 0x0041, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - // Entry 40 - 7F - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, - 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - // Entry 80 - BF - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x007e, 0x007e, 0x0099, - }, - }, - { // pa - paScriptStr, - paScriptIdx, - }, - { // pa-Arab - "عربیگُرمُکھی", - []uint16{ // 47 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0018, - }, - }, - { // pl - plScriptStr, - plScriptIdx, - }, - {}, // prg - { // ps - "عربي", - []uint16{ // 6 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, - }, - }, - { // pt - ptScriptStr, - ptScriptIdx, - }, - { // pt-PT - ptPTScriptStr, - ptPTScriptIdx, - }, - {}, // qu - { // rm - "arabarameic imperialarmenavesticbalinaisbatakbengalsimbols da Blissbopom" + - "ofobrahmiscrittira da Braillebuginaisbuhidchakmasimbols autoctons ca" + - "nadais unifitgadscarianchamcherokeecirthcopticcipriotcirillicslav da" + - " baselgia vegldevanagarideseretegipzian demoticegipzian ieraticierog" + - "lifas egipzianasetiopickutsurigeorgianglagoliticgoticgrecgujaratigur" + - "mukhihangulhanhanunooscrittira chinaisa simplifitgadascrittira china" + - "isa tradiziunalaebraichiraganapahawn hmongkatanaka u hiraganaungarai" + - "s veglindusitalic vegljavanaisgiapunaiskayah likatakanakharoshthikhm" + - "er/cambodschankannadacoreankaithilannalaotlatin (scrittira gotica)la" + - "tin (scrittira gaelica)latinlepchalimbulinear Alinear Blichiclidicma" + - "ndaicmanicheicieroglifas mayameroiticmalaisianmongolicmoonmeetei may" + - "ekburmaisn’kooghamol chikiorkhonoriyaosmanpermic veglphags-papahlavi" + - " dad inscripziunspahlavi da psalmspahlavi da cudeschsfenizianfonetic" + - "a da Pollardpartic dad inscripziunsrejangrongorongorunicsamaritansar" + - "atisaurashtralingua da segnsshaviansingalaissundanaissyloti nagrisir" + - "icsiric estrangelosiric dal vestsiric da l’osttagbanwatai letai luet" + - "amiltai viettelugutengwartifinaghtagalogthaanatailandaistibetanugari" + - "ticvaiialfabet visibelpersian veglscrittira a cugn sumeric-accadicay" + - "iertànotaziun matematicasimbolslinguas na scrittasbetg determinàscri" + - "ttira nunenconuschenta u nunvalaivla", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0014, 0x0019, - 0x0020, 0x0028, 0x0028, 0x0028, 0x002d, 0x0033, 0x0033, 0x0043, - 0x004b, 0x0051, 0x0065, 0x006d, 0x0072, 0x0078, 0x009d, 0x00a3, - 0x00a7, 0x00af, 0x00b4, 0x00ba, 0x00c1, 0x00c9, 0x00de, 0x00e8, - 0x00ef, 0x00ef, 0x00ff, 0x010f, 0x0124, 0x0124, 0x012b, 0x0132, - 0x013a, 0x0144, 0x0149, 0x0149, 0x014d, 0x0155, 0x015d, 0x015d, - 0x0163, 0x0166, 0x016d, 0x018d, 0x01ac, 0x01ac, 0x01b2, 0x01ba, - 0x01ba, 0x01c6, 0x01d9, 0x01e6, 0x01eb, 0x01f6, 0x01f6, 0x01fe, - // Entry 40 - 7F - 0x0207, 0x0207, 0x020f, 0x0217, 0x0221, 0x0232, 0x0232, 0x0239, - 0x023f, 0x023f, 0x0245, 0x024a, 0x024e, 0x0266, 0x027f, 0x0284, - 0x028a, 0x028f, 0x0297, 0x029f, 0x029f, 0x029f, 0x02a5, 0x02aa, - 0x02aa, 0x02b1, 0x02ba, 0x02ba, 0x02c9, 0x02c9, 0x02c9, 0x02d1, - 0x02da, 0x02da, 0x02e2, 0x02e6, 0x02e6, 0x02f2, 0x02f2, 0x02f9, - 0x02f9, 0x02f9, 0x02f9, 0x02f9, 0x02ff, 0x02ff, 0x0304, 0x030c, - 0x0312, 0x0317, 0x0317, 0x031c, 0x031c, 0x031c, 0x0327, 0x032f, - 0x0347, 0x0358, 0x036b, 0x0373, 0x0386, 0x039d, 0x03a3, 0x03ad, - // Entry 80 - BF - 0x03b2, 0x03bb, 0x03c1, 0x03c1, 0x03cb, 0x03da, 0x03e1, 0x03e1, - 0x03e1, 0x03e1, 0x03ea, 0x03ea, 0x03f3, 0x03ff, 0x0404, 0x0414, - 0x0422, 0x0432, 0x043a, 0x043a, 0x0440, 0x0447, 0x044c, 0x044c, - 0x0454, 0x045a, 0x0461, 0x0469, 0x0470, 0x0476, 0x0480, 0x0487, - 0x0487, 0x048f, 0x0493, 0x04a2, 0x04a2, 0x04a2, 0x04ae, 0x04cf, - 0x04d1, 0x04d6, 0x04e9, 0x04e9, 0x04f0, 0x0503, 0x0512, 0x053a, - }, - }, - {}, // rn - { // ro - roScriptStr, - roScriptIdx, - }, - {}, // ro-MD - {}, // rof - { // ru - ruScriptStr, - ruScriptIdx, - }, - {}, // ru-UA - {}, // rw - {}, // rwk - { // sah - "АрааптыыЭрмээннииНууччалыыГириэктииДьоппуоннууКэриэйдииЛатыынныыМоҕуоллу" + - "уТаайдыыСуруллубатахБиллибэт сурук", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0022, - 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, - 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, - 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, - 0x0034, 0x0034, 0x0034, 0x0034, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, - // Entry 40 - 7F - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - // Entry 80 - BF - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x00a0, 0x00a0, - 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, - 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00b8, 0x00b8, 0x00d3, - }, - }, - {}, // saq - {}, // sbp - { // se - "arábakyrillalašgreikkalašhangulkiinnašálkiárbevirolašhiraganakatakanaláh" + - "tenašorrut chállojuvvotdovdameahttun chállin", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x001c, 0x001c, 0x001c, 0x001c, - 0x0022, 0x002a, 0x002a, 0x002f, 0x003c, 0x003c, 0x003c, 0x0044, - 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - // Entry 40 - 7F - 0x0044, 0x0044, 0x0044, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, - 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - // Entry 80 - BF - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0069, 0x0069, 0x007f, - }, - }, - { // se-FI - "arábalaškiinnálašálkes kiinnálašárbevirolaš kiinnálašorrut čállojuvvotdo" + - "vdameahttun čállin", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x0015, 0x0015, 0x0027, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - // Entry 40 - 7F - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - // Entry 80 - BF - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0053, 0x0053, 0x0069, - }, - }, - {}, // seh - {}, // ses - {}, // sg - {}, // shi - {}, // shi-Latn - { // si - siScriptStr, - siScriptIdx, - }, - { // sk - skScriptStr, - skScriptIdx, - }, - { // sl - slScriptStr, - slScriptIdx, - }, - {}, // smn - {}, // sn - { // so - "Aan la qorinFar aan la aqoon amase aan saxnayn", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x002e, - }, - }, - { // sq - sqScriptStr, - sqScriptIdx, - }, - { // sr - srScriptStr, - srScriptIdx, - }, - {}, // sr-Cyrl-BA - {}, // sr-Cyrl-ME - {}, // sr-Cyrl-XK - { // sr-Latn - srLatnScriptStr, - srLatnScriptIdx, - }, - {}, // sr-Latn-BA - {}, // sr-Latn-ME - {}, // sr-Latn-XK - { // sv - svScriptStr, - svScriptIdx, - }, - {}, // sv-FI - { // sw - swScriptStr, - swScriptIdx, - }, - {}, // sw-CD - {}, // sw-KE - { // ta - taScriptStr, - taScriptIdx, - }, - { // te - teScriptStr, - teScriptIdx, - }, - {}, // teo - { // th - thScriptStr, - thScriptIdx, - }, - { // ti - "ፊደልላቲን", - []uint16{ // 80 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - // Entry 40 - 7F - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0012, - }, - }, - { // to - "tohinima fakaʻafakatohinima fakaʻalapēnia-kaukasiatohinima fakaʻalepeato" + - "hinima fakaʻalāmiti-ʻemipaeatohinima fakaʻāmeniatohinima fakaʻavesit" + - "anitohinima fakapalitohinima fakapamumitohinima fakapasa-vātohinima " + - "fakapātakitohinima fakapengikalitohinima fakaʻilonga-pilisitohinima " + - "fakapopomofotohinima fakapalāmītohinima laukonga ki he kuitohinima f" + - "akapukisitohinima fakapuhititohinima fakasakimātohinima fakatupuʻi-k" + - "ānata-fakatahatahatohinima fakakalitohinima fakasamitohinima fakase" + - "lokītohinima fakakīlititohinima fakakopitikatohinima fakasaipalesito" + - "hinima fakalūsiatohinima fakalūsia-lotu-motuʻatohinima fakaʻinitia-t" + - "evanākalītohinima fakateseletitohinimanounou fakatupoloiētohinima te" + - "motika-fakaʻisipitetohinima hielatika-fakaʻisipitetohinima tongitapu" + - "-fakaʻisipitetohinima fakaʻelepasanitohinima fakaʻītiōpiatohinima fa" + - "kakutusuli-seōsiatohinima fakaseōsiatohinima fakakalakolititohinima " + - "fakakotikatohinima fakasilanitātohinima fakakalisitohinima fakaʻinit" + - "ia-kutalatitohinima fakakūmukitohinima fakahānipitohinima fakakōlea-" + - "hāngūlutohinima fakasiainatohinima fakahanunōʻotohinima fakasiaina-f" + - "akafaingofuatohinima fakasiaina-tukufakaholotohinima fakahepelūtohin" + - "ima fakasiapani-hilakanatohinima tongitapu-fakaʻanatoliatohinima fak" + - "apahaumongitohinima fakasilapa-siapanitohinima fakahungakalia-motuʻa" + - "tohinima fakaʻinitusitohinima fakaʻītali-motuʻatohinima fakasamotohi" + - "nima fakasavatohinima fakasiapanitohinima fakaiūkenitohinima fakakai" + - "alītohinima fakasiapani-katakanatohinima fakakalositītohinima fakaka" + - "mipōtiatohinima fakakosikītohinima fakaʻinitia-kanatatohinima fakakō" + - "leatohinima fakakepeletohinima fakakaiatītohinima fakalanatohinima f" + - "akalautohinima fakalatina-falakitulitohinima fakalatina-kaelikitohin" + - "ima fakalatinatohinima fakalepasātohinima fakalimipūtohinima fakalin" + - "ea-Atohinima fakalinea-Ptohinima fakafalāsetohinima fakalomatohinima" + - " fakalīsiatohinima fakalītiatohinima fakamahasanitohinima fakamanita" + - "eatohinima fakamanikaeatohinima tongitapu fakamaiatohinima fakamēnit" + - "itohinima fakameloue-heiheitohinima fakamelouetohinima fakaʻinitia-m" + - "alāialamitohinima fakamotītohinima fakamongokōliatohinima laukonga k" + - "i he kui-māhinatohinima fakamolōtohinima fakametei-maiekitohinima fa" + - "kapematohinima fakaʻalepea-tokelau-motuʻatohinima fakanapateatohinim" + - "a fakanati-sepatohinima fakanikōtohinima fakanasiūtohinima fakaʻokam" + - "itohinima fakaʻolisikitohinima fakaʻolikonitohinima fakaʻotiatohinim" + - "a fakaʻosimāniatohinima fakapalamilenetohinima fakapausinihautohinim" + - "a fakapēmi-motuʻatohinima fakapākisipātohinima fakapālavi-tongitohin" + - "ima fakapālavi-saametohinima fakapālavi-tohitohinima fakafoinikiatoh" + - "inima fakafonētiki-polātitohinima fakapātia-tongitohinima fakalesian" + - "gitohinima fakalongolongotohinima fakalunikitohinima fakasamalitanet" + - "ohinima fakasalatitohinima fakaʻalepea-tonga-motuʻatohinima fakasaul" + - "asitātohinima fakaʻilonga-tohitohinima fakasiavitohinima fakasiālatā" + - "tohinima fakasititamitohinima fakakutauātitohinima fakasingihalatohi" + - "nima fakasolasomipengitohinima fakasunitātohinima fakasailoti-nakili" + - "tohinima fakasuliāiātohinima fakasuliāiā-ʻesitelangelotohinima fakas" + - "uliāiā-hihifotohinima fakasuliāiā-hahaketohinima fakatakipaneuātohin" + - "ima fakatakilitohinima fakatai-luetohinima fakatai-lue-foʻoutohinima" + - " fakatamilitohinima fakatangutitohinima fakatai-vietitohinima fakaʻi" + - "nitia-telukutohinima fakatengiualitohinima fakatifinākitohinima faka" + - "takalokatohinima fakatānatohinima fakatailanitohinima fakataipetitoh" + - "inima fakatīhutatohinima fakaʻūkalititohinima fakavaitohinima fakafo" + - "nētiki-hāmaitohinima fakavalangi-kisitītohinima fakauoleaitohinima f" + - "akapēsiamuʻatohinima fakamataʻingahau-sumelo-akatiatohinima fakaīīto" + - "hinima hokositohinima fakamatematikatohinima fakatātātohinima fakaʻi" + - "longatohinima taʻetohitohiʻitohinima fakatatautohinima taʻeʻiloa", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0014, 0x0035, 0x0035, 0x004a, 0x006b, 0x0081, - 0x0099, 0x00aa, 0x00bd, 0x00d2, 0x00e6, 0x00fc, 0x00fc, 0x0118, - 0x012d, 0x0142, 0x015d, 0x0170, 0x0183, 0x0197, 0x01c0, 0x01d1, - 0x01e2, 0x01f6, 0x020a, 0x021f, 0x0235, 0x0248, 0x0268, 0x028a, - 0x029f, 0x02bb, 0x02da, 0x02fa, 0x031a, 0x0332, 0x034a, 0x0367, - 0x037b, 0x0392, 0x03a5, 0x03bb, 0x03ce, 0x03ec, 0x0400, 0x0414, - 0x0431, 0x0444, 0x045b, 0x047c, 0x049c, 0x049c, 0x04b0, 0x04cd, - 0x04ee, 0x0505, 0x0520, 0x053f, 0x0555, 0x0572, 0x0583, 0x0594, - // Entry 40 - 7F - 0x05a8, 0x05bc, 0x05d0, 0x05ed, 0x0603, 0x061a, 0x062e, 0x064a, - 0x065d, 0x0670, 0x0684, 0x0695, 0x06a5, 0x06c3, 0x06de, 0x06f1, - 0x0705, 0x0719, 0x072d, 0x0741, 0x0755, 0x0766, 0x0779, 0x078c, - 0x07a1, 0x07b6, 0x07cb, 0x07cb, 0x07e6, 0x07fa, 0x0814, 0x0827, - 0x0848, 0x085a, 0x0872, 0x0895, 0x08a7, 0x08c0, 0x08c0, 0x08d1, - 0x08f6, 0x090a, 0x090a, 0x0920, 0x0932, 0x0945, 0x0959, 0x096f, - 0x0985, 0x0998, 0x0998, 0x09b0, 0x09c7, 0x09de, 0x09f8, 0x0a0f, - 0x0a29, 0x0a43, 0x0a5c, 0x0a71, 0x0a8f, 0x0aa8, 0x0abd, 0x0ad4, - // Entry 80 - BF - 0x0ae7, 0x0afe, 0x0b11, 0x0b34, 0x0b4b, 0x0b65, 0x0b77, 0x0b8d, - 0x0ba2, 0x0bb8, 0x0bce, 0x0be8, 0x0bfc, 0x0c17, 0x0c2d, 0x0c52, - 0x0c6f, 0x0c8c, 0x0ca4, 0x0cb7, 0x0ccb, 0x0ce6, 0x0cf9, 0x0d0d, - 0x0d23, 0x0d3f, 0x0d55, 0x0d6b, 0x0d80, 0x0d92, 0x0da6, 0x0dba, - 0x0dce, 0x0de5, 0x0df5, 0x0e12, 0x0e2e, 0x0e41, 0x0e59, 0x0e81, - 0x0e92, 0x0ea1, 0x0eb8, 0x0ecb, 0x0ee0, 0x0ef9, 0x0f0b, 0x0f1f, - }, - }, - { // tr - trScriptStr, - trScriptIdx, - }, - {}, // twq - {}, // tzm - { // ug - "ئافاكائەرەبخان جەمەتى ئارامۇئەرمەنئاۋېستابالىبامۇمباسساباتاكبېنگالبىلىس " + - "بەلگىلىرىخەنچە پىنيىنبراخمىبرائىل ئەمالار يېزىقىبۇگىبۇخىتچاكمابىرلى" + - "ككە كەلگەن كانادا يەرلىك بوغۇم جەدۋىلىكارىياچامچېروكىكىرسچەكوپتىكسى" + - "پرۇسكىرىلقەدىمكى چىركاۋ سىلاۋيانچە كىرىلدېۋاناگارىدېزېرېتدۇپلويان ت" + - "ېز خاتىرىلەشدېموتىكچە مىسىرخىيەراتىكچە مىسىرتەسۋىرىي يېزىق مىسىرئېف" + - "ىيوپىيەچەخۇتسۇرى گىرۇزىنچەگىرۇزىنچەگىلاگوتچەگوتچەگىرانتاچەگىرېكچەگۇ" + - "جاراتچەگۇرمۇكىچەخەنچەخانۇنۇچەئاددىي خەنچەمۇرەككەپ خەنچەئىبرانىچەخىر" + - "اگانائاناتولىيە تەسۋىرىي يېزىقمۆڭچەياپونچە خىراگانا ياكى كاتاكاناقە" + - "دىمكى ماجارچەئىندۇسچەقەدىمكى ئىتاليانچەياۋاچەياپونچەجۇرچېنچەكاياھچە" + - "كاتاكاناكاروشتىچەكېخمېرچەخوجكىچەكانناداچەكورېيەچەكپېللېچەكاياتىچەلا" + - "نناچەلائوسچەفىراكتۇر لاتىنچەسىكوت لاتىنچەلاتىنچەلەپچاچەلىمبۇچەسىزىق" + - "لىق Aسىزىقلىق Bفراسېرچەلوماچەلىسىيانچەلىدىيەچەماندائىكچەمانەكېزەمچە" + - "ماياچە تەسۋىرىي يېزىقمېندېچەمېتروئىت يازمىچەمېتروئىتمالايامچەموڭغۇل" + - "چەكورىيەمروچەمانىپۇرىچەبىرماچەقەدىمكى شىمالىي ئەرەبچەئانباتچەناشىچە" + - "نىكوچەنۈشۇچەئوگەمچەئول-چىكىچەئورخۇنچەئورىياچەئوسمانيەپالمىراچەقەدىم" + - "كى پېرمىكچەپاسپاچەپەھلىۋىچە ئويما خەتپەھلىۋىچە شېئىرىي تىلپەھلىۋىچە" + - " كىتابى تىلفىنىكچەپوللارد تاۋۇشلىرىپارتىئانچە ئويما خەترېجاڭچەروڭگور" + - "وڭگورۇنىكچەسامارىچەساراتىچەقەدىمكى جەنۇبى ئەرەبچەسائۇراشتىراچەئىشار" + - "ەت تىلىشاۋىيانچەشاراداچەكۇداۋادچەسىنخالاچەسورا سامپىڭسۇنداچەسىيولوت" + - "ى-ناگرىچەسۈرىيەچەسۈرىيەچە ئەبجەتغەربىي سۈرىيەچەشەرقىي سۈرىيەچەتاگبا" + - "نۋاچەتاكرىچەتاي-لەچەيېڭى تاي-لەچەتامىلچەتاڭغۇتچەتايلاندچە-ۋىيېتنامچ" + - "ەتېلۇگۇچەتېڭۋارچەتىفىناغچەتاگالوگچەتاناچەتايلاندچەتىبەتچەتىرخۇتاچەئ" + - "ۇگارىتىكچەۋايچەكۆرۈنۈشچان تاۋۇشۋاراڭ كىشىتىۋولىئايقەدىمكى پارىسچەسۇ" + - "مېر-ئاككادىيان مىخ خەتيىچەئىرسىيەت ئاتالغۇماتېماتىكىلىق بەلگەبەلگەي" + - "ېزىلمىغانئورتاقيوچۇن يېزىق", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000c, 0x000c, 0x000c, 0x0016, 0x0036, 0x0042, - 0x0050, 0x0058, 0x0062, 0x006c, 0x0076, 0x0082, 0x0082, 0x009f, - 0x00b6, 0x00c2, 0x00ea, 0x00f2, 0x00fc, 0x0106, 0x0157, 0x0163, - 0x0169, 0x0175, 0x0181, 0x018d, 0x0199, 0x01a3, 0x01de, 0x01f2, - 0x0200, 0x022a, 0x0247, 0x0268, 0x028e, 0x028e, 0x02a6, 0x02c7, - 0x02d9, 0x02eb, 0x02f5, 0x0307, 0x0315, 0x0327, 0x0339, 0x0339, - 0x0339, 0x0343, 0x0353, 0x036a, 0x0385, 0x0385, 0x0397, 0x03a7, - 0x03d7, 0x03e1, 0x041a, 0x0437, 0x0447, 0x046a, 0x046a, 0x0476, - // Entry 40 - 7F - 0x0484, 0x0494, 0x04a2, 0x04b2, 0x04c4, 0x04d4, 0x04e2, 0x04f4, - 0x0504, 0x0514, 0x0524, 0x0532, 0x0540, 0x055f, 0x0578, 0x0586, - 0x0594, 0x05a2, 0x05b4, 0x05c6, 0x05d6, 0x05e2, 0x05f4, 0x0604, - 0x0604, 0x0618, 0x062e, 0x062e, 0x0656, 0x0664, 0x0683, 0x0693, - 0x06a5, 0x06a5, 0x06b5, 0x06c1, 0x06cb, 0x06df, 0x06df, 0x06ed, - 0x0719, 0x0729, 0x0729, 0x0735, 0x0741, 0x074d, 0x075b, 0x076e, - 0x077e, 0x078e, 0x078e, 0x079e, 0x07b0, 0x07b0, 0x07cf, 0x07dd, - 0x0801, 0x0829, 0x084f, 0x085d, 0x087e, 0x08a4, 0x08b2, 0x08c6, - // Entry 80 - BF - 0x08d4, 0x08e4, 0x08f4, 0x091e, 0x0938, 0x094f, 0x0961, 0x0971, - 0x0971, 0x0983, 0x0995, 0x09aa, 0x09b8, 0x09d7, 0x09e7, 0x0a04, - 0x0a21, 0x0a3e, 0x0a52, 0x0a60, 0x0a6f, 0x0a87, 0x0a95, 0x0aa5, - 0x0acc, 0x0adc, 0x0aec, 0x0afe, 0x0b10, 0x0b1c, 0x0b2e, 0x0b3c, - 0x0b4e, 0x0b64, 0x0b6e, 0x0b8d, 0x0ba4, 0x0bb2, 0x0bcf, 0x0bfc, - 0x0c04, 0x0c23, 0x0c48, 0x0c48, 0x0c52, 0x0c66, 0x0c72, 0x0c87, - }, - }, - { // uk - ukScriptStr, - ukScriptIdx, - }, - { // ur - urScriptStr, - urScriptIdx, - }, - {}, // ur-IN - { // uz - uzScriptStr, - uzScriptIdx, - }, - { // uz-Arab - "عربی", - []uint16{ // 6 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, - }, - }, - { // uz-Cyrl - "АрабАрманБенгалиБопомофоБраиллеКирилДевангариҲабашГрузинЮнонГужаратиГурм" + - "ухиХангулХанСоддалаштирилганАнъанавийИбронийХираганаЯпонКатаканаХме" + - "рКаннадаКорейсЛаоЛотинМалайаламМўғулчаМьянмаОрияСинхалаТамилТелугуТ" + - "аанаТайТибетРамзларЁзилмаганУмумийНомаълум шрифт", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0020, 0x0020, 0x0020, - 0x0030, 0x0030, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, - 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x0048, 0x0048, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x0064, 0x0064, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0078, 0x0088, 0x0096, 0x0096, - 0x00a2, 0x00a8, 0x00a8, 0x00c8, 0x00da, 0x00da, 0x00e8, 0x00f8, - 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, - // Entry 40 - 7F - 0x0100, 0x0100, 0x0100, 0x0110, 0x0110, 0x0118, 0x0118, 0x0126, - 0x0132, 0x0132, 0x0132, 0x0132, 0x0138, 0x0138, 0x0138, 0x0142, - 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, - 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, - 0x0154, 0x0154, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x016e, - 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, - 0x016e, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, - 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, - // Entry 80 - BF - 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, - 0x0176, 0x0176, 0x0184, 0x0184, 0x0184, 0x0184, 0x0184, 0x0184, - 0x0184, 0x0184, 0x0184, 0x0184, 0x0184, 0x0184, 0x018e, 0x018e, - 0x018e, 0x019a, 0x019a, 0x019a, 0x019a, 0x01a4, 0x01aa, 0x01b4, - 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, - 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01c2, 0x01d4, 0x01e0, 0x01fb, - }, - }, - {}, // vai - {}, // vai-Latn - { // vi - viScriptStr, - viScriptIdx, - }, - {}, // vun - { // wae - "ArabišArmenišBengališKirillišDevanagariEthiopišGeorgišGričišGujaratiVere" + - "ifačtTraditionellHebräišJapanišKhmerKannadaKorianišLaotišLatinišMala" + - "isišBurmesišOriyaSingalesišTamilišTeluguThánaThaiSchriftlosUnkodiert" + - "i Schrift", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0021, 0x0021, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x0034, 0x0034, - 0x003c, 0x003c, 0x003c, 0x003c, 0x0044, 0x004c, 0x004c, 0x004c, - 0x004c, 0x004c, 0x004c, 0x0056, 0x0062, 0x0062, 0x006b, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, - // Entry 40 - 7F - 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0078, 0x0078, 0x007f, - 0x0088, 0x0088, 0x0088, 0x0088, 0x008f, 0x008f, 0x008f, 0x0097, - 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, - 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, - 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a9, - 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, - 0x00a9, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - // Entry 80 - BF - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, - 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00c1, 0x00c1, - 0x00c1, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00cd, 0x00d1, 0x00d1, - 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, - 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00db, 0x00db, 0x00ed, - }, - }, - {}, // xog - {}, // yav - { // yi - "אַראַבישצירילישדעוואַנאַגאַריגריכישHebrגַלחיש", - []uint16{ // 80 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x001e, 0x001e, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x0046, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - // Entry 40 - 7F - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x0056, - }, - }, - {}, // yo - {}, // yo-BJ - { // yue - "阿法卡文字高加索阿爾巴尼亞文阿拉伯文皇室亞美尼亞文亞美尼亞文阿維斯陀文峇里文巴姆穆文巴薩文巴塔克文孟加拉文布列斯文注音符號婆羅米文盲人用點字布吉" + - "斯文布希德文查克馬文加拿大原住民通用字符卡里亞文占文柴羅基文色斯文科普特文塞浦路斯文斯拉夫文西里爾文(古教會斯拉夫文變體)天城文德瑟" + - "雷特文杜普洛伊速記古埃及世俗體古埃及僧侶體古埃及象形文字愛爾巴桑文衣索比亞文喬治亞語系(阿索他路里和努斯克胡里文)喬治亞文格拉哥里文" + - "歌德文格蘭他文字希臘文古吉拉特文古魯穆奇文漢語注音韓文字漢語哈努諾文簡體中文繁體中文希伯來文平假名安那托利亞象形文字楊松錄苗文片假名" + - "或平假名古匈牙利文印度河流域(哈拉帕文)古意大利文韓文字母爪哇文日文女真文字克耶李文片假名卡羅須提文高棉文克吉奇文字坎那達文韓文克培" + - "列文凱提文藍拿文寮國文拉丁文(尖角體活字變體)拉丁文(蓋爾語變體)拉丁文雷布查文林佈文線性文字(A)線性文字(B)栗僳文洛馬文呂西亞" + - "語里底亞語曼底安文摩尼教文瑪雅象形文字門德文麥羅埃文(曲線字體)麥羅埃文馬來亞拉姆文蒙古文蒙氏點字謬文曼尼普爾文緬甸文古北阿拉伯文納" + - "巴泰文字納西格巴文西非書面語言 (N’Ko)女書文字歐甘文桑塔利文鄂爾渾文歐利亞文歐斯曼亞文帕米瑞拉文字古彼爾姆諸文八思巴文巴列維文" + - "(碑銘體)巴列維文(聖詩體)巴列維文(書體)腓尼基文柏格理拼音符帕提亞文(碑銘體)拉讓文朗格朗格象形文古北歐文字撒馬利亞文沙拉堤文古" + - "南阿拉伯文索拉什特拉文手語書寫符號簫柏納字符夏拉達文悉曇文字信德文錫蘭文索朗桑朋文字巽他文希洛弟納格里文敍利亞文敘利亞文(福音體文字" + - "變體)敘利亞文(西方文字變體)敘利亞文(東方文字變體)南島文塔卡里文字傣哪文西雙版納新傣文坦米爾文西夏文傣擔文泰盧固文談格瓦文提非納" + - "文塔加拉文塔安那文泰文西藏文邁蒂利文烏加列文瓦依文視覺語音文字瓦郎奇蒂文字沃雷艾文古波斯文蘇米魯亞甲文楔形文字彞文繼承文字(Unic" + - "ode)數學符號表情符號符號非書寫語言一般文字未知文字", - []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000f, 0x002a, 0x002a, 0x0036, 0x004b, 0x005a, - 0x0069, 0x0072, 0x007e, 0x0087, 0x0093, 0x009f, 0x009f, 0x00ab, - 0x00b7, 0x00c3, 0x00d2, 0x00de, 0x00ea, 0x00f6, 0x0114, 0x0120, - 0x0126, 0x0132, 0x013b, 0x0147, 0x0156, 0x0162, 0x018f, 0x0198, - 0x01a7, 0x01b9, 0x01cb, 0x01dd, 0x01f2, 0x0201, 0x0210, 0x0249, - 0x0255, 0x0264, 0x026d, 0x027c, 0x0285, 0x0294, 0x02a3, 0x02af, - 0x02b8, 0x02be, 0x02ca, 0x02d6, 0x02e2, 0x02e2, 0x02ee, 0x02f7, - 0x0312, 0x0321, 0x0336, 0x0345, 0x0366, 0x0375, 0x0381, 0x038a, - // Entry 40 - 7F - 0x0390, 0x039c, 0x03a8, 0x03b1, 0x03c0, 0x03c9, 0x03d8, 0x03e4, - 0x03ea, 0x03f6, 0x03ff, 0x0408, 0x0411, 0x0435, 0x0453, 0x045c, - 0x0468, 0x0471, 0x0484, 0x0497, 0x04a0, 0x04a9, 0x04b5, 0x04c1, - 0x04c1, 0x04cd, 0x04d9, 0x04d9, 0x04eb, 0x04f4, 0x0512, 0x051e, - 0x0530, 0x0530, 0x0539, 0x0545, 0x054b, 0x055a, 0x055a, 0x0563, - 0x0575, 0x0584, 0x0584, 0x0593, 0x05ae, 0x05ba, 0x05c3, 0x05cf, - 0x05db, 0x05e7, 0x05e7, 0x05f6, 0x0608, 0x0608, 0x061a, 0x0626, - 0x0641, 0x065c, 0x0674, 0x0680, 0x0692, 0x06ad, 0x06b6, 0x06cb, - // Entry 80 - BF - 0x06da, 0x06e9, 0x06f5, 0x0707, 0x0719, 0x072b, 0x073a, 0x0746, - 0x0752, 0x075b, 0x0764, 0x0776, 0x077f, 0x0794, 0x07a0, 0x07c7, - 0x07eb, 0x080f, 0x0818, 0x0827, 0x0830, 0x0845, 0x0851, 0x085a, - 0x0863, 0x086f, 0x087b, 0x0887, 0x0893, 0x089f, 0x08a5, 0x08ae, - 0x08ba, 0x08c6, 0x08cf, 0x08e1, 0x08f3, 0x08ff, 0x090b, 0x0929, - 0x092f, 0x0948, 0x0954, 0x0960, 0x0966, 0x0975, 0x0981, 0x098d, - }, - }, - {}, // zgh - { // zh - zhScriptStr, - zhScriptIdx, - }, - { // zh-Hant - zhHantScriptStr, - zhHantScriptIdx, - }, - { // zh-Hant-HK - "西里爾文梵文埃塞俄比亞文格魯吉亞文古木基文簡體字繁體字坎納達文老撾文拉丁字母馬拉雅拉姆文奧里雅文僧伽羅文泰米爾文它拿字母藏文", - []uint16{ // 160 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0024, 0x0024, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x003f, 0x003f, - 0x003f, 0x003f, 0x003f, 0x0048, 0x0051, 0x0051, 0x0051, 0x0051, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, - // Entry 40 - 7F - 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x005d, - 0x005d, 0x005d, 0x005d, 0x005d, 0x0066, 0x0066, 0x0066, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, - 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, - 0x0084, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - // Entry 80 - BF - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x0090, 0x0090, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, - 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x00a8, 0x00a8, - 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00b4, 0x00b4, 0x00ba, - }, - }, - { // zu - zuScriptStr, - zuScriptIdx, - }, -} - -const afScriptStr string = "" + // Size: 372 bytes - "ArabiesArmeensBengaalsBopomofoBrailleSirilliesDevanagariEtiopiesGeorgies" + - "GrieksGudjaratiGurmukhiHanbHangulHanVereenvoudigde HanTradisionele HanHe" + - "breeusHiraganaJapannese lettergreepskrifJamoJapanneesKatakanaKhmerKannad" + - "aKoreaansLaoLatynMalabaarsMongoolsMianmarOriyaSinhalaTamilTeloegoeThaana" + - "ThaiTibettaansWiskundige notasieEmojiSimboleOngeskreweAlgemeenOnbekende " + - "skryfstelsel" - -var afScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x0016, 0x0016, 0x0016, - 0x001e, 0x001e, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x002e, 0x002e, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0040, 0x0040, - 0x0048, 0x0048, 0x0048, 0x0048, 0x004e, 0x0057, 0x005f, 0x0063, - 0x0069, 0x006c, 0x006c, 0x007e, 0x008e, 0x008e, 0x0096, 0x009e, - 0x009e, 0x009e, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00bc, 0x00bc, - // Entry 40 - 7F - 0x00c5, 0x00c5, 0x00c5, 0x00cd, 0x00cd, 0x00d2, 0x00d2, 0x00d9, - 0x00e1, 0x00e1, 0x00e1, 0x00e1, 0x00e4, 0x00e4, 0x00e4, 0x00e9, - 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, - 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, - 0x00f2, 0x00f2, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - // Entry 80 - BF - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0106, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, - 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x0112, 0x0112, - 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x0120, 0x0124, 0x012e, - 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, - 0x012e, 0x012e, 0x0140, 0x0145, 0x014c, 0x0156, 0x015e, 0x0174, -} // Size: 376 bytes - -const amScriptStr string = "" + // Size: 566 bytes - "ዓረብኛአርሜንያዊቤንጋሊቦፖሞፎብሬይልሲይሪልክደቫንጋሪኢትዮፒክጆርጂያዊግሪክጉጃራቲጉርሙኪሃንብሐንጉልሃንቀለል ያለ ሃንባ" + - "ህላዊ ሃንእብራይስጥሂራጋናካታካና ወይንም ሂራጋናጃሞጃፓንኛካታካናክህመርካንአዳኮሪያኛላኦላቲንማላያልምሞንጎሊያኛምያ" + - "ንማርኦሪያሲንሃላታሚልተሉጉታናታይቲቤታንZmthZsyeምልክቶችያልተጻፈየጋራያልታወቀ ስክሪፕት" - -var amScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x002a, 0x002a, 0x002a, - 0x0036, 0x0036, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0051, 0x0051, 0x0060, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x006f, 0x006f, - 0x007e, 0x007e, 0x007e, 0x007e, 0x0087, 0x0093, 0x009f, 0x00a8, - 0x00b4, 0x00ba, 0x00ba, 0x00d1, 0x00e4, 0x00e4, 0x00f6, 0x0102, - 0x0102, 0x0102, 0x0128, 0x0128, 0x0128, 0x0128, 0x012e, 0x012e, - // Entry 40 - 7F - 0x013a, 0x013a, 0x013a, 0x0146, 0x0146, 0x0152, 0x0152, 0x015e, - 0x016a, 0x016a, 0x016a, 0x016a, 0x0170, 0x0170, 0x0170, 0x0179, - 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, - 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, - 0x0188, 0x0188, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x01a9, - 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, - 0x01a9, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, - 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, - // Entry 80 - BF - 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, 0x01b2, - 0x01b2, 0x01b2, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, - 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01c7, 0x01c7, - 0x01c7, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d6, 0x01dc, 0x01e8, - 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, 0x01e8, - 0x01e8, 0x01e8, 0x01ec, 0x01f0, 0x01ff, 0x020e, 0x0217, 0x0236, -} // Size: 376 bytes - -const arScriptStr string = "" + // Size: 2477 bytes - "العربيةالأرمينيةالباليةالباتاكالبنغاليةرموز بليسالبوبوموفوالهندوسيةالبرا" + - "يلالبجينيزالبهيديةمقاطع كندية أصلية موحدةالكاريةالتشاميةالشيروكيالسيرثا" + - "لقبطيةالقبرصيةالسيريليةالسيريلية السلافية الكنسية القديمةالديفاناجاريال" + - "ديسيريتالديموطيقيةالهيراطيقيةالهيروغليفيةالأثيوبيةالأبجدية الجورجية - أ" + - "سومتافرلي و نسخريالجورجيةالجلاجوليتيكالقوطيةاليونانيةالتاغجراتيةالجرمخي" + - "هانبالهانغولالهانالهانونوالهان المبسطةالهان التقليديةالعبريةالهيراجاناا" + - "لباهوه همونجأبجدية مقطعية يابانيةالمجرية القديمةاندس - هارابانالإيطالية" + - " القديمةجاموالجاويةاليابانيةالكياه لىالكتكاناالخاروشتىالخميريةالكاناداال" + - "كوريةالانااللاواللاتينية - متغير فراكتراللاتينية - متغير غيلىاللاتينيةا" + - "لليبتشا - رونجالليمبوالخطية أالخطية بالليسيةالليديةالمانداينيةالمايا ال" + - "هيروغليفيةالميرويتيكالماليالامالمغوليةمونالميانمارالعربية الشمالية القد" + - "يمةأنكوالأوجهامالأورخونالأورياالأوسمانياالبيرميكية القديمةالفاجسباالفين" + - "يقيةالصوتيات الجماءرنجورنجوالرونيالساراتيالعربية الجنوبية القديمةالشوان" + - "يالسينهالاالسوندانيةالسيلوتي ناغريالسريانيةالسريانية الأسترنجيليةالسريا" + - "نية الغربيةالسريانية الشرقيةالتاجبانواالتاي ليالتاى لى الجديدالتاميليةا" + - "لتيلجوالتينجوارالتيفيناغالتغالوغيةالثعنةالتايلانديةالتبتيةالأجاريتيكيةا" + - "لفايالكلام المرئيالفارسية القديمةالكتابة المسمارية الأكدية السومريةاليي" + - "الموروثتدوين رياضيإيموجيرموزغير مكتوبعامنظام كتابة غير معروف" - -var arScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x000e, 0x0020, - 0x0020, 0x002e, 0x002e, 0x002e, 0x003c, 0x004e, 0x004e, 0x005f, - 0x0073, 0x0085, 0x0093, 0x00a3, 0x00b3, 0x00b3, 0x00de, 0x00ec, - 0x00fc, 0x010c, 0x0118, 0x0126, 0x0136, 0x0148, 0x0189, 0x01a1, - 0x01b3, 0x01b3, 0x01c9, 0x01df, 0x01f7, 0x01f7, 0x0209, 0x024f, - 0x025f, 0x0277, 0x0285, 0x0285, 0x0297, 0x02ad, 0x02bb, 0x02c3, - 0x02d3, 0x02dd, 0x02ed, 0x0306, 0x0323, 0x0323, 0x0331, 0x0345, - 0x0345, 0x035e, 0x0386, 0x03a3, 0x03bc, 0x03dd, 0x03e5, 0x03f3, - // Entry 40 - 7F - 0x0405, 0x0405, 0x0416, 0x0426, 0x0438, 0x0448, 0x0448, 0x0458, - 0x0466, 0x0466, 0x0466, 0x0470, 0x047a, 0x04a6, 0x04ce, 0x04e0, - 0x04fb, 0x0509, 0x0518, 0x0527, 0x0527, 0x0527, 0x0535, 0x0543, - 0x0543, 0x0559, 0x0559, 0x0559, 0x057e, 0x057e, 0x057e, 0x0592, - 0x05a6, 0x05a6, 0x05b6, 0x05bc, 0x05bc, 0x05bc, 0x05bc, 0x05ce, - 0x05fc, 0x05fc, 0x05fc, 0x05fc, 0x0604, 0x0604, 0x0614, 0x0614, - 0x0624, 0x0632, 0x0632, 0x0646, 0x0646, 0x0646, 0x0669, 0x0679, - 0x0679, 0x0679, 0x0679, 0x068b, 0x06a8, 0x06a8, 0x06a8, 0x06b8, - // Entry 80 - BF - 0x06c4, 0x06c4, 0x06d4, 0x0702, 0x0702, 0x0702, 0x0710, 0x0710, - 0x0710, 0x0710, 0x0722, 0x0722, 0x0736, 0x0751, 0x0763, 0x078e, - 0x07af, 0x07d0, 0x07e4, 0x07e4, 0x07f3, 0x080f, 0x0821, 0x0821, - 0x0821, 0x082f, 0x0841, 0x0853, 0x0867, 0x0873, 0x0889, 0x0897, - 0x0897, 0x08af, 0x08b9, 0x08d2, 0x08d2, 0x08d2, 0x08f1, 0x0932, - 0x093a, 0x0948, 0x095d, 0x0969, 0x0971, 0x0982, 0x0988, 0x09ad, -} // Size: 376 bytes - -const azScriptStr string = "" + // Size: 1070 bytes - "ərəbarmierməniavestanbalibatakbenqalblissymbolsbopomofobrahmibraylbuqinb" + - "uhidkakmbirləşmiş kanada yerli yazısıkariyançamçirokisirtkoptikkiprkiril" + - "qədimi kilsa kirilidevanaqarideseretmisir demotikmisir hiyeratikmisir hi" + - "yeroqlifefiopgürcü xutsurigürcüqlaqolitikqotikyunanqucaratqurmuxihanbhan" + - "qılhanhanunuSadələşdirilmiş HanƏnənəvi Hanibraniiraqanapahav monqhecalı " + - "yapon əlifbasıqədimi macarhindistanqədimi italyalıjamocavayaponkayax lik" + - "atakanaxaroştikxmerkannadakoreyaktilannalaofraktur latınıgael latınılatı" + - "nlepçəlimbulusianludianmandayenmaniçayenmaya hiyeroqlifimeroytikmalayala" + - "mmonqolmunmeytey mayekmyanmarnkooğamol çikiorxonoriyaosmanyaqədimi permi" + - "kfaqs-pafliflpkitab paxlavifoenikpolard fonetikprtirecəngronqoronqorunik" + - "samaritansaratisaurastraişarət yazısışavyansinhalsundansiloti nəqrisirya" + - "kestrangela süryanicetaqbanvatay letəzə tay lutamiltavtteluqutengvartifi" + - "naqtaqaloqthanataytibetuqaritvaydanışma səsləriqədimi farssumer-akadyan " + - "kuneyformyiriyazi notasiyaemojisimvollaryazısızümumi yazıtanınmayan yazı" - -var azScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000a, 0x0011, - 0x0018, 0x001c, 0x001c, 0x001c, 0x0021, 0x0027, 0x0027, 0x0032, - 0x003a, 0x0040, 0x0045, 0x004a, 0x004f, 0x0053, 0x0075, 0x007c, - 0x0080, 0x0087, 0x008b, 0x0091, 0x0095, 0x009a, 0x00ae, 0x00b8, - 0x00bf, 0x00bf, 0x00cc, 0x00db, 0x00eb, 0x00eb, 0x00f0, 0x00ff, - 0x0106, 0x0110, 0x0115, 0x0115, 0x011a, 0x0121, 0x0128, 0x012c, - 0x0133, 0x0136, 0x013c, 0x0153, 0x0161, 0x0161, 0x0167, 0x016e, - 0x016e, 0x0178, 0x0190, 0x019d, 0x01a6, 0x01b7, 0x01bb, 0x01bf, - // Entry 40 - 7F - 0x01c4, 0x01c4, 0x01cc, 0x01d4, 0x01dc, 0x01e1, 0x01e1, 0x01e8, - 0x01ee, 0x01ee, 0x01f1, 0x01f6, 0x01f9, 0x0209, 0x0216, 0x021c, - 0x0223, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x022e, 0x0234, - 0x0234, 0x023c, 0x0246, 0x0246, 0x0256, 0x0256, 0x0256, 0x025e, - 0x0267, 0x0267, 0x026d, 0x0270, 0x0270, 0x027c, 0x027c, 0x0283, - 0x0283, 0x0283, 0x0283, 0x0283, 0x0286, 0x0286, 0x028b, 0x0293, - 0x0298, 0x029d, 0x029d, 0x02a4, 0x02a4, 0x02a4, 0x02b2, 0x02b9, - 0x02bc, 0x02bf, 0x02cc, 0x02d2, 0x02e0, 0x02e4, 0x02eb, 0x02f5, - // Entry 80 - BF - 0x02fa, 0x0303, 0x0309, 0x0309, 0x0312, 0x0323, 0x032a, 0x032a, - 0x032a, 0x032a, 0x0330, 0x0330, 0x0336, 0x0343, 0x0349, 0x035e, - 0x035e, 0x035e, 0x0366, 0x0366, 0x036c, 0x0379, 0x037e, 0x037e, - 0x0382, 0x0388, 0x038f, 0x0396, 0x039d, 0x03a2, 0x03a5, 0x03aa, - 0x03aa, 0x03b0, 0x03b3, 0x03c6, 0x03c6, 0x03c6, 0x03d2, 0x03e9, - 0x03eb, 0x03eb, 0x03fa, 0x03ff, 0x0408, 0x0411, 0x041d, 0x042e, -} // Size: 376 bytes - -const bgScriptStr string = "" + // Size: 2351 bytes - "арабскаАрамейскаарменскаАвестанскаБалийскиБатакскабенгалскаБлис символиб" + - "опомофоБрахмиБрайловаБугинскаБухидЧакмаУнифицирани символи на канадски " + - "аборигениКарийскаХамитскаЧерокиКиртКоптскаКипърскакирилицадеванагариДез" + - "еретЕгипетско демотично писмоЕгипетско йератично писмоЕгипетски йерогли" + - "фиетиопскаГрузинска хуцуригрузинскаГлаголическаГотическагръцкагуджарати" + - "гурмукхиханбхангълкитайскаХанунуопростен китайскитрадиционен китайскиив" + - "ритхираганаПахау хмонгяпонска сричковаСтароунгарскаХарапскаДревно итали" + - "йскаджамоЯванскаяпонскаКая ЛикатаканаКхароштхикхмерскаканнадакорейскаКа" + - "йтхиЛанналаоскаЛатинска фрактураГалска латинскалатиницаЛепчаЛимбуЛинейн" + - "а АЛинейна БЛицийскаЛидийскаМандаринскаМанихейскаЙероглифи на МаитеМеро" + - "итскамалаяламмонголскаМунМанипурибирманскаН’КоОгамическаОл ЧикиОрхоно-е" + - "нисейскаорияОсманскаДревно пермскаФагс-паПахлавскаФиникийскаПисменост П" + - "олардРонго-ронгоРуническаСамаританскаСаратиСаураштрасинхалскаСунданскаС" + - "илоти НагриСирийскаСирийска естрангелоЗападна сирийскаИзточна сирийскаТ" + - "агбанваТай ЛеНова Тай ЛетамилскателугуТагалогтаанатайскатибетскаУгаритс" + - "каВайскаВидима речСтароперсийскаШумеро-акадски клинописЙиМатематически " + - "символиемотиконисимволибез писменостобщанепозната писменост" - -var bgScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x0020, 0x0030, - 0x0044, 0x0054, 0x0054, 0x0054, 0x0064, 0x0076, 0x0076, 0x008d, - 0x009d, 0x00a9, 0x00b9, 0x00c9, 0x00d3, 0x00dd, 0x012b, 0x013b, - 0x014b, 0x0157, 0x015f, 0x016d, 0x017d, 0x018d, 0x018d, 0x01a1, - 0x01af, 0x01af, 0x01df, 0x020f, 0x0234, 0x0234, 0x0244, 0x0263, - 0x0275, 0x028d, 0x029f, 0x029f, 0x02ab, 0x02bd, 0x02cd, 0x02d5, - 0x02e1, 0x02f1, 0x02fd, 0x031e, 0x0345, 0x0345, 0x034f, 0x035f, - 0x035f, 0x0374, 0x0393, 0x03ad, 0x03bd, 0x03dc, 0x03e6, 0x03f4, - // Entry 40 - 7F - 0x0402, 0x0402, 0x040d, 0x041d, 0x042f, 0x043f, 0x043f, 0x044d, - 0x045d, 0x045d, 0x0469, 0x0473, 0x047f, 0x04a0, 0x04bd, 0x04cd, - 0x04d7, 0x04e1, 0x04f2, 0x0503, 0x0503, 0x0503, 0x0513, 0x0523, - 0x0523, 0x0539, 0x054d, 0x054d, 0x056f, 0x056f, 0x056f, 0x0581, - 0x0591, 0x0591, 0x05a3, 0x05a9, 0x05a9, 0x05b9, 0x05b9, 0x05cb, - 0x05cb, 0x05cb, 0x05cb, 0x05cb, 0x05d4, 0x05d4, 0x05e8, 0x05f5, - 0x0614, 0x061c, 0x061c, 0x062c, 0x062c, 0x062c, 0x0647, 0x0654, - 0x0654, 0x0654, 0x0666, 0x067a, 0x0699, 0x0699, 0x0699, 0x06ae, - // Entry 80 - BF - 0x06c0, 0x06d8, 0x06e4, 0x06e4, 0x06f6, 0x06f6, 0x06f6, 0x06f6, - 0x06f6, 0x06f6, 0x0708, 0x0708, 0x071a, 0x0731, 0x0741, 0x0766, - 0x0785, 0x07a4, 0x07b4, 0x07b4, 0x07bf, 0x07d3, 0x07e3, 0x07e3, - 0x07e3, 0x07ef, 0x07ef, 0x07ef, 0x07fd, 0x0807, 0x0813, 0x0823, - 0x0823, 0x0835, 0x0841, 0x0854, 0x0854, 0x0854, 0x0870, 0x089c, - 0x08a0, 0x08a0, 0x08c9, 0x08db, 0x08e9, 0x0902, 0x090a, 0x092f, -} // Size: 376 bytes - -const bnScriptStr string = "" + // Size: 3617 bytes - "আরবিআরমিআর্মেনীয়আভেসতানবালীয়বাটাকবাংলাব্লিসপ্রতীকবোপোমোফোব্রাহ্মীব্রেই" + - "লবুগিবুহিডচাকমাসংযুক্ত কানাডিয়ান অ্যাব্রোজিনিয়ান সিলেবিক্সক্যারিয়ান" + - "চ্যামচেরোকিকির্টকোপ্টিকসাইপ্রোয়েটসিরিলিকপ্রাচীন চার্চ স্লাভোনিক সিরিল" + - "িকদেবনাগরিদেসেরাতমিশরীয় ডেমোটিকমিশরীয় হায়রেটিকমিশরীয় হায়ারোগ্লিপই" + - "থিওপিয়জর্জিয় খুৎসুরিজর্জিয়ানগ্লাগোলিটিকগোথিকগ্রিকগুজরাটিগুরুমুখিহ্য" + - "ানবিহাঙ্গুলহ্যানহ্যানুনুসরলিকৃত হ্যানঐতিহ্যবাহী হ্যানহিব্রুহিরাগানাফাহ" + - "াও মঙজাপানি অক্ষরমালাপুরোনো হাঙ্গেরীয়সিন্ধুপ্রাচীন ইতালিজ্যামোজাভানিজ" + - "জাপানীকায়াহ লিকাটাকানাখরোষ্ঠীখেমেরকানাড়াকোরিয়ানকাইথিলান্নালাওফ্রাক্" + - "টুর ল্যাটিনগ্যালিক ল্যাটিনল্যাটিনলেপ্চালিম্বুলিনিয়ার এলিনিয়ার বিলাইস" + - "িয়ানলাইডিয়ানম্যান্ডায়ীনম্যানিচাইনমায়ান হায়ারোগ্লিপমেরোইটিকমালায়া" + - "লামমোঙ্গোলীয়মুনমেইটেই মায়েকমায়ানমারএনকোওঘামওল চিকিঅর্খোনওড়িয়াওসমা" + - "নিয়প্রাচীন পার্মিকফাগ্স-পাখদিত পাহলভিসল্টার পাহলভিপুস্তক পাহলভিফিনিশি" + - "য়পোলার্ড ধ্বনিকপার্থিয়নরেজ্যাঙ্গরোঙ্গোরোঙ্গোরুনিকসমেরিটনসারাতিসৌরাষ্" + - "ট্রচিহ্ন লিখনসাভিয়ানসিংহলিসান্দানিজসিলেটি নাগরিসিরিয়াকএস্ট্রেঙ্গেলো " + - "সিরিয়াকপশ্চিমাঞ্চলীয় সিরিয়াকপূর্বাঞ্চলীয় সিরিয়াকটাগোওয়ানাতাইলেনত" + - "ুন তাই লুতামিলতাই ভিয়েৎতেলেগুতেঙ্গোয়ারতিফিনাগটাগালগথানাথাইতিব্বতিউগা" + - "রিটিকভাইদৃশ্যমান ভাষাপ্রাচীন ফার্সিসুমের-আক্কাদীয় কীলকরূপউইকাইগানিতিক" + - " চিহ্নইমোজিপ্রতিকগুলিঅলিখিতসাধারনঅজানা লিপি" - -var bnScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x0018, 0x0033, - 0x0048, 0x005a, 0x005a, 0x005a, 0x0069, 0x0078, 0x0078, 0x0099, - 0x00b1, 0x00c9, 0x00db, 0x00e7, 0x00f6, 0x0105, 0x0186, 0x01a4, - 0x01b3, 0x01c5, 0x01d4, 0x01e9, 0x020a, 0x021f, 0x0276, 0x028e, - 0x02a3, 0x02a3, 0x02ce, 0x02ff, 0x0339, 0x0339, 0x0351, 0x037c, - 0x0397, 0x03b8, 0x03c7, 0x03c7, 0x03d6, 0x03eb, 0x0403, 0x0418, - 0x042d, 0x043c, 0x0454, 0x0479, 0x04a7, 0x04a7, 0x04b9, 0x04d1, - 0x04d1, 0x04e7, 0x0515, 0x0546, 0x0558, 0x057d, 0x058f, 0x05a4, - // Entry 40 - 7F - 0x05b6, 0x05b6, 0x05cf, 0x05e7, 0x05fc, 0x060b, 0x060b, 0x0620, - 0x0638, 0x0638, 0x0647, 0x0659, 0x0662, 0x0693, 0x06be, 0x06d3, - 0x06e5, 0x06f7, 0x0713, 0x0732, 0x0732, 0x0732, 0x074d, 0x0768, - 0x0768, 0x078c, 0x07aa, 0x07aa, 0x07e1, 0x07e1, 0x07e1, 0x07f9, - 0x0817, 0x0817, 0x0835, 0x083e, 0x083e, 0x0863, 0x0863, 0x087e, - 0x087e, 0x087e, 0x087e, 0x087e, 0x088a, 0x088a, 0x0896, 0x08a9, - 0x08bb, 0x08d0, 0x08d0, 0x08e8, 0x08e8, 0x08e8, 0x0913, 0x0929, - 0x0948, 0x096d, 0x0992, 0x09aa, 0x09d2, 0x09ed, 0x0a08, 0x0a2c, - // Entry 80 - BF - 0x0a3b, 0x0a50, 0x0a62, 0x0a62, 0x0a7d, 0x0a99, 0x0ab1, 0x0ab1, - 0x0ab1, 0x0ab1, 0x0ac3, 0x0ac3, 0x0ade, 0x0b00, 0x0b18, 0x0b58, - 0x0b9b, 0x0bdb, 0x0bf9, 0x0bf9, 0x0c08, 0x0c25, 0x0c34, 0x0c34, - 0x0c50, 0x0c62, 0x0c80, 0x0c95, 0x0ca7, 0x0cb3, 0x0cbc, 0x0cd1, - 0x0cd1, 0x0ce9, 0x0cf2, 0x0d17, 0x0d17, 0x0d17, 0x0d3f, 0x0d80, - 0x0d86, 0x0d8f, 0x0db4, 0x0dc3, 0x0de1, 0x0df3, 0x0e05, 0x0e21, -} // Size: 376 bytes - -const caScriptStr string = "" + // Size: 1638 bytes - "adlamafakaalbanès caucàsicahomàrabarameu imperialarmeniavèsticbalinèsbam" + - "umbassa vahbatakbengalíbhaiksukisímbols Blissbopomofobrahmibraillebuginè" + - "sbuhidchakmasíl·labes dels aborígens canadencs unificatscariàchamcheroke" + - "ecirthcoptexipriotaciríl·licciríl·lic de l’antic eslau eclesiàsticdevana" + - "garideserettaquigrafia Duployédemòtic egipcihieràtic egipcijeroglífic eg" + - "ipcielbasanetiòpicgeorgià hucurigeorgiàglagolíticgòticgranthagrecgujarat" + - "igurmukhihanbhangulhanhanunoohan simplificathan tradicionalhebreuhiragan" + - "ajeroglífic anatolipahawh hmongkatakana o hiraganahongarès anticescriptu" + - "ra de la vall de l’Induscursiva antigajamojavanèsjaponèsjürchenkayah lik" + - "atakanakharosthikhmerkhojakannadacoreàkpellekaithilannalaollatí frakturl" + - "latí gaèlicllatílepchalimbulineal Alineal Blisulomalicilidimahajanimanda" + - "icmaniqueujeroglífics maiesmendecursiva meroíticameroíticmalaiàlammodimo" + - "ngolmoonmromanipurímultanibirmàantic nord-aràbicnabateunewargeban’Konü s" + - "huoghamsantaliorkhonoriyaosageosmanyapalmirèPau Cin Hauantic pèrmicphags" + - "papahlavi inscripcionalpsalter pahlavipahlavifenicipollard miaoparthià i" + - "nscripcionalrejangrongo-rongorúnicsamaritàsaratisud-aràbic anticsaurasht" + - "raescriptura de signesshaviàshradasiddhamdevangarisingalèssora sompengsu" + - "ndanèssyloti nagrisiríacsiríac estrangelosiríac occidentalsiríac orienta" + - "ltagbanwatakritai lenou tai luetàmiltanguttai viettelugutengwartifinaght" + - "agàlogthaanatailandèstibetàtirhutugaríticvaillenguatge visiblevarang ksh" + - "itiwoleaipersa anticcuneïforme sumeri-accadiyiheretatnotació matemàticae" + - "mojisímbolssense escripturacomúescriptura desconeguda" - -var caScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0005, 0x000a, 0x001c, 0x0020, 0x0025, 0x0034, 0x003a, - 0x0042, 0x004a, 0x004f, 0x0058, 0x005d, 0x0065, 0x006e, 0x007c, - 0x0084, 0x008a, 0x0091, 0x0099, 0x009e, 0x00a4, 0x00d3, 0x00d9, - 0x00dd, 0x00e5, 0x00ea, 0x00ef, 0x00f7, 0x0102, 0x012d, 0x0137, - 0x013e, 0x0152, 0x0161, 0x0171, 0x0183, 0x018a, 0x0192, 0x01a1, - 0x01a9, 0x01b4, 0x01ba, 0x01c1, 0x01c5, 0x01cd, 0x01d5, 0x01d9, - 0x01df, 0x01e2, 0x01e9, 0x01f8, 0x0207, 0x0207, 0x020d, 0x0215, - 0x0228, 0x0234, 0x0247, 0x0256, 0x0278, 0x0286, 0x028a, 0x0292, - // Entry 40 - 7F - 0x029a, 0x02a2, 0x02aa, 0x02b2, 0x02bb, 0x02c0, 0x02c5, 0x02cc, - 0x02d2, 0x02d8, 0x02de, 0x02e3, 0x02e6, 0x02f4, 0x0302, 0x0308, - 0x030e, 0x0313, 0x031b, 0x0323, 0x0327, 0x032b, 0x032f, 0x0333, - 0x033b, 0x0342, 0x034a, 0x034a, 0x035c, 0x0361, 0x0373, 0x037c, - 0x0386, 0x038a, 0x0390, 0x0394, 0x0397, 0x03a0, 0x03a7, 0x03ad, - 0x03bf, 0x03c6, 0x03cb, 0x03cf, 0x03d5, 0x03dc, 0x03e1, 0x03e8, - 0x03ee, 0x03f3, 0x03f8, 0x03ff, 0x0407, 0x0412, 0x041f, 0x0426, - 0x043b, 0x044a, 0x0451, 0x0457, 0x0463, 0x0479, 0x047f, 0x048a, - // Entry 80 - BF - 0x0490, 0x0499, 0x049f, 0x04b0, 0x04ba, 0x04ce, 0x04d5, 0x04db, - 0x04e2, 0x04eb, 0x04f4, 0x0500, 0x0509, 0x0515, 0x051c, 0x052e, - 0x0540, 0x0550, 0x0558, 0x055d, 0x0563, 0x056e, 0x0574, 0x057a, - 0x0582, 0x0588, 0x058f, 0x0597, 0x059f, 0x05a5, 0x05af, 0x05b6, - 0x05bc, 0x05c5, 0x05c8, 0x05da, 0x05e7, 0x05ed, 0x05f8, 0x0611, - 0x0613, 0x061a, 0x062e, 0x0633, 0x063b, 0x064b, 0x0650, 0x0666, -} // Size: 376 bytes - -const csScriptStr string = "" + // Size: 1906 bytes - "afakakavkazskoalbánskéarabskéaramejské (imperiální)arménskéavestánskébal" + - "ijskébamumskébassa vahbatackébengálskéBlissovo písmobopomofobráhmíBraill" + - "ovo písmobuginskébuhidskéčakmaslabičné písmo kanadských domorodcůkarijsk" + - "éčamčerokíkirtkoptskékyperskécyrilicecyrilce - staroslověnskádévanágárí" + - "deseretDuployého těsnopisegyptské démotickéegyptské hieratickéegyptské h" + - "ieroglyfyelbasanskéetiopskégruzínské chutsurigruzínskéhlaholicegotickégr" + - "anthařeckégudžarátígurmukhihanbhangulhanhanunóohan (zjednodušené)han (tr" + - "adiční)hebrejskéhiraganaanatolské hieroglyfyhmongskéjaponské slabičnésta" + - "romaďarskéharappskéetruskéjamojavánskéjaponskédžürčenskékayah likatakana" + - "kháróšthíkhmerskéchodžikikannadskékorejskékpellekaithilannalaoskélatinka" + - " - lomenálatinka - galskálatinkalepčskélimbulineární Alineární BFraserov" + - "olomalýkijskélýdskémahádžanímandejskémanichejskémayské hieroglyfymendské" + - "meroitické psacímeroitickémalajlámskémodímongolskéMoonovomromejtej majek" + - " (manipurské)myanmarskéstaroseveroarabskénabatejskénaxi geban’konü-šuoga" + - "mskésantálské (ol chiki)orchonskéurijskéosmansképalmýrsképau cin haustar" + - "opermsképhags-papahlavské klínovépahlavské žalmovépahlavské knižnífénick" + - "éPollardova fonetická abecedaparthské klínovéredžanskérongorongorunovés" + - "amařskésaratistarojihoarabskésaurášterskéSignWritingShawova abecedašárad" + - "ásiddhamchudábádísinhálskésora sompengsundskésylhetskésyrskésyrské - es" + - "trangelosyrské - západnísyrské - východnítagbanwatakrítai letai lü novét" + - "amilskétanguttai viettelugskétengwarberberskétagalskéthaanathajskétibets" + - "kétirhutaugaritské klínovévaividitelná řečvarang kšitikarolínské (woleai" + - ")staroperské klínové písmosumero-akkadské klínové písmoyimatematický záp" + - "isemodžisymbolybez zápisuobecnéneznámé písmo" - -var csScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x0018, 0x0018, 0x0020, 0x0039, 0x0043, - 0x004f, 0x0058, 0x0061, 0x006a, 0x0072, 0x007d, 0x007d, 0x008c, - 0x0094, 0x009c, 0x00ac, 0x00b5, 0x00be, 0x00c4, 0x00ec, 0x00f5, - 0x00f9, 0x0101, 0x0105, 0x010d, 0x0116, 0x011e, 0x0138, 0x0146, - 0x014d, 0x0161, 0x0176, 0x018b, 0x019f, 0x01aa, 0x01b3, 0x01c7, - 0x01d2, 0x01db, 0x01e3, 0x01ea, 0x01f1, 0x01fd, 0x0205, 0x0209, - 0x020f, 0x0212, 0x021a, 0x022e, 0x023e, 0x023e, 0x0248, 0x0250, - 0x0265, 0x026e, 0x0282, 0x0291, 0x029b, 0x02a3, 0x02a7, 0x02b1, - // Entry 40 - 7F - 0x02ba, 0x02c8, 0x02d0, 0x02d8, 0x02e5, 0x02ee, 0x02f7, 0x0301, - 0x030a, 0x0310, 0x0316, 0x031b, 0x0322, 0x0333, 0x0344, 0x034b, - 0x0354, 0x0359, 0x0365, 0x0371, 0x037a, 0x037e, 0x0388, 0x0390, - 0x039c, 0x03a6, 0x03b2, 0x03b2, 0x03c4, 0x03cc, 0x03de, 0x03e9, - 0x03f6, 0x03fb, 0x0405, 0x040c, 0x040f, 0x0429, 0x0429, 0x0434, - 0x0447, 0x0452, 0x0452, 0x045b, 0x0461, 0x0468, 0x0470, 0x0486, - 0x0490, 0x0498, 0x0498, 0x04a1, 0x04ac, 0x04b7, 0x04c4, 0x04cc, - 0x04e0, 0x04f4, 0x0507, 0x0510, 0x052d, 0x0540, 0x054b, 0x0555, - // Entry 80 - BF - 0x055c, 0x0566, 0x056c, 0x057d, 0x058c, 0x0597, 0x05a6, 0x05af, - 0x05b6, 0x05c2, 0x05cd, 0x05d9, 0x05e1, 0x05eb, 0x05f2, 0x0606, - 0x0619, 0x062d, 0x0635, 0x063b, 0x0641, 0x064e, 0x0657, 0x065d, - 0x0665, 0x066e, 0x0675, 0x067f, 0x0688, 0x068e, 0x0696, 0x069f, - 0x06a6, 0x06ba, 0x06bd, 0x06cd, 0x06da, 0x06ef, 0x070c, 0x072d, - 0x072f, 0x072f, 0x0742, 0x0749, 0x0750, 0x075b, 0x0762, 0x0772, -} // Size: 376 bytes - -const daScriptStr string = "" + // Size: 1483 bytes - "afakaarabiskarmiarmenskavestanskbalinesiskbamumbassabatakbengaliblissymb" + - "olerbopomofobramiskbrailleskriftbuginesiskbuhidcakmoprindelige canadiske" + - " symbolerkarianskchamcherokeecirtkoptiskcypriotiskkyrilliskkyrillisk - o" + - "ldkirkeslavisk variantdevanagarideseretDuploya-stenografiegyptisk demoti" + - "skegyptisk hieratiskegyptiske hieroglyfferetiopiskgeorgisk kutsurigeorgi" + - "skglagolitiskgotiskgranthagræskgujaratigurmukhihan med bopomofohangulhan" + - "hanunooforenklet hantraditionelt hanhebraiskhiraganaanatolske hieroglyff" + - "erpahawh hmongjapanske skrifttegnoldungarskindusOlditaliskjamojavanesisk" + - "japanskjurchenkaya likatakanakharoshtikhmerkhojkikannadakoreanskkpellekt" + - "hilannalaolatinsk - frakturvariantlatinsk - gælisk variantlatinsklepchal" + - "imbulineær Alineær Blisulomalykisklydiskmandaiskmanikæiskmayahieroglyffe" + - "rmendemetroitisk sammenhængendemeroitiskmalayalammongolskmoonmroomeitei-" + - "mayekburmesiskgammelt nordarabisknabateisknakhi geban’konüshuoghamol-chi" + - "kiorkhonoriyaosmanniskpalmyrenskoldpermiskphags-paphliphlppahlavifønikis" + - "kpollardtegnprtirejangrongo-rongorunersamaritansksaratioldsørarabisksaur" + - "ashtrategnskriftshavisksharadakhudawadisingalesisksorasundanesisksyloti " + - "nagrisyrisksyrisk - estrangelovariantvestsyriskøstsyriakisktagbanwatakri" + - "tai letai luetamilsktanguttavttelugutengwartifinaghtagalogthaanathailand" + - "sktibetansktirhutaugaritiskvaisynlig talevarang kshitiwoleaioldpersisksu" + - "mero-akkadisk cuneiformyiarvetmatematisk notationemojisymboleruden skrif" + - "tsprogfællesukendt skriftsprog" - -var daScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x0005, 0x0005, 0x000c, 0x0010, 0x0017, - 0x0020, 0x002a, 0x002f, 0x0034, 0x0039, 0x0040, 0x0040, 0x004c, - 0x0054, 0x005b, 0x0068, 0x0072, 0x0077, 0x007b, 0x0099, 0x00a1, - 0x00a5, 0x00ad, 0x00b1, 0x00b8, 0x00c2, 0x00cb, 0x00ee, 0x00f8, - 0x00ff, 0x0111, 0x0122, 0x0134, 0x014a, 0x014a, 0x0152, 0x0162, - 0x016a, 0x0175, 0x017b, 0x0182, 0x0188, 0x0190, 0x0198, 0x01a8, - 0x01ae, 0x01b1, 0x01b8, 0x01c5, 0x01d5, 0x01d5, 0x01dd, 0x01e5, - 0x01fb, 0x0207, 0x021a, 0x0224, 0x0229, 0x0233, 0x0237, 0x0241, - // Entry 40 - 7F - 0x0248, 0x024f, 0x0256, 0x025e, 0x0267, 0x026c, 0x0272, 0x0279, - 0x0281, 0x0287, 0x028b, 0x0290, 0x0293, 0x02ab, 0x02c4, 0x02cb, - 0x02d1, 0x02d6, 0x02df, 0x02e8, 0x02ec, 0x02f0, 0x02f6, 0x02fc, - 0x02fc, 0x0304, 0x030e, 0x030e, 0x031e, 0x0323, 0x033d, 0x0346, - 0x034f, 0x034f, 0x0357, 0x035b, 0x035f, 0x036b, 0x036b, 0x0374, - 0x0387, 0x0390, 0x0390, 0x039a, 0x03a0, 0x03a6, 0x03ab, 0x03b3, - 0x03b9, 0x03be, 0x03be, 0x03c7, 0x03d1, 0x03d1, 0x03db, 0x03e3, - 0x03e7, 0x03eb, 0x03f2, 0x03fb, 0x0406, 0x040a, 0x0410, 0x041b, - // Entry 80 - BF - 0x0420, 0x042b, 0x0431, 0x043f, 0x0449, 0x0453, 0x045a, 0x0461, - 0x0461, 0x046a, 0x0475, 0x0479, 0x0484, 0x0490, 0x0496, 0x04b0, - 0x04ba, 0x04c7, 0x04cf, 0x04d4, 0x04da, 0x04e1, 0x04e8, 0x04ee, - 0x04f2, 0x04f8, 0x04ff, 0x0507, 0x050e, 0x0514, 0x051e, 0x0527, - 0x052e, 0x0537, 0x053a, 0x0545, 0x0552, 0x0558, 0x0562, 0x057b, - 0x057d, 0x0582, 0x0595, 0x059a, 0x05a2, 0x05b2, 0x05b9, 0x05cb, -} // Size: 376 bytes - -const deScriptStr string = "" + // Size: 1697 bytes - "AfakaKaukasisch-AlbanischArabischArmiArmenischAvestischBalinesischBamunB" + - "assaBattakischBengalischBliss-SymboleBopomofoBrahmiBlindenschriftBugines" + - "ischBuhidChakmaUCASKarischChamCherokeeCirthKoptischZypriotischKyrillisch" + - "AltkirchenslawischDevanagariDeseretDuployanischÄgyptisch - DemotischÄgyp" + - "tisch - HieratischÄgyptische HieroglyphenElbasanischÄthiopischKhutsuriGe" + - "orgischGlagolitischGotischGranthaGriechischGujaratiGurmukhiHanbHangulChi" + - "nesischHanunooVereinfachtes ChinesischTraditionelles ChinesischHebräisch" + - "HiraganaHieroglyphen-LuwischPahawh HmongJapanische SilbenschriftAltungar" + - "ischIndus-SchriftAltitalischJamoJavanesischJapanischJurchenKayah LiKatak" + - "anaKharoshthiKhmerKhojkiKannadaKoreanischKpelleKaithiLannaLaotischLatein" + - "isch - Fraktur-VarianteLateinisch - Gälische VarianteLateinischLepchaLim" + - "buLinear ALinear BFraserLomaLykischLydischMahajaniMandäischManichäischMa" + - "ya-HieroglyphenMendeMeroitisch kursivMeroitischMalayalamModiMongolischMo" + - "onMroMeitei MayekBirmanischAltnordarabischNabatäischGebaN’KoFrauenschrif" + - "tOghamOl ChikiOrchon-RunenOriyaOsmanischPalmyrenischPau Cin HauAltpermis" + - "chPhags-paBuch-PahlaviPsalter-PahlaviPahlaviPhönizischPollard Phonetisch" + - "ParthischRejangRongorongoRunenschriftSamaritanischSaratiAltsüdarabischSa" + - "urashtraGebärdenspracheShaw-AlphabetSharadaSiddhamKhudawadiSinghalesisch" + - "Sora SompengSundanesischSyloti NagriSyrischSyrisch - Estrangelo-Variante" + - "WestsyrischOstsyrischTagbanwaTakriTai LeTai LueTamilischXixiaTai-VietTel" + - "uguTengwarTifinaghTagalogThaanaThaiTibetischTirhutaUgaritischVaiSichtbar" + - "e SpracheVarang KshitiWoleaianischAltpersischSumerisch-akkadische Keilsc" + - "hriftYiGeerbter SchriftwertMathematische NotationEmojiSymboleSchriftlosV" + - "erbreitetUnbekannte Schrift" - -var deScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x0019, 0x0019, 0x0021, 0x0025, 0x002e, - 0x0037, 0x0042, 0x0047, 0x004c, 0x0056, 0x0060, 0x0060, 0x006d, - 0x0075, 0x007b, 0x0089, 0x0094, 0x0099, 0x009f, 0x00a3, 0x00aa, - 0x00ae, 0x00b6, 0x00bb, 0x00c3, 0x00ce, 0x00d8, 0x00ea, 0x00f4, - 0x00fb, 0x0107, 0x011d, 0x0134, 0x014c, 0x0157, 0x0162, 0x016a, - 0x0173, 0x017f, 0x0186, 0x018d, 0x0197, 0x019f, 0x01a7, 0x01ab, - 0x01b1, 0x01bb, 0x01c2, 0x01da, 0x01f3, 0x01f3, 0x01fd, 0x0205, - 0x0219, 0x0225, 0x023d, 0x0249, 0x0256, 0x0261, 0x0265, 0x0270, - // Entry 40 - 7F - 0x0279, 0x0280, 0x0288, 0x0290, 0x029a, 0x029f, 0x02a5, 0x02ac, - 0x02b6, 0x02bc, 0x02c2, 0x02c7, 0x02cf, 0x02ec, 0x030b, 0x0315, - 0x031b, 0x0320, 0x0328, 0x0330, 0x0336, 0x033a, 0x0341, 0x0348, - 0x0350, 0x035a, 0x0366, 0x0366, 0x0377, 0x037c, 0x038d, 0x0397, - 0x03a0, 0x03a4, 0x03ae, 0x03b2, 0x03b5, 0x03c1, 0x03c1, 0x03cb, - 0x03da, 0x03e5, 0x03e5, 0x03e9, 0x03ef, 0x03fc, 0x0401, 0x0409, - 0x0415, 0x041a, 0x041a, 0x0423, 0x042f, 0x043a, 0x0445, 0x044d, - 0x0459, 0x0468, 0x046f, 0x047a, 0x048c, 0x0495, 0x049b, 0x04a5, - // Entry 80 - BF - 0x04b1, 0x04be, 0x04c4, 0x04d3, 0x04dd, 0x04ed, 0x04fa, 0x0501, - 0x0508, 0x0511, 0x051e, 0x052a, 0x0536, 0x0542, 0x0549, 0x0566, - 0x0571, 0x057b, 0x0583, 0x0588, 0x058e, 0x0595, 0x059e, 0x05a3, - 0x05ab, 0x05b1, 0x05b8, 0x05c0, 0x05c7, 0x05cd, 0x05d1, 0x05da, - 0x05e1, 0x05eb, 0x05ee, 0x05ff, 0x060c, 0x0618, 0x0623, 0x0643, - 0x0645, 0x0659, 0x066f, 0x0674, 0x067b, 0x0685, 0x068f, 0x06a1, -} // Size: 376 bytes - -const elScriptStr string = "" + // Size: 2665 bytes - "ΑραβικόΑυτοκρατορικό ΑραμαϊκόΑρμενικόΑβεστάνΜπαλινίζΜπατάκΜπενγκάλιΣύμβο" + - "λα BlissΜποπομόφοΜπραχμίΜπράιγΜπούγκιςΜπουχίντΤσάκμαΕνοποιημένοι Καναδε" + - "ζικοί Συλλαβισμοί ΙθαγενώνΚαριάνΤσαμΤσερόκιΣερθΚοπτικόΚυπριακόΚυριλλικό" + - "Παλαιό Εκκλησιαστικό Σλαβικό ΚυριλλικόΝτεβαναγκάριΝτεσερέΛαϊκό Αιγυπτια" + - "κόΙερατικό ΑιγυπτιακόΑιγυπτιακά ΙερογλυφικάΑιθιοπικόΓεωργιανό Κχουτσούρ" + - "ιΓεωργιανόΓκλαγκολιτικόΓοτθικόΕλληνικόΓκουγιαράτιΓκουρμουκχίΧανμπΧανγκο" + - "ύλΧανΧανούνουΑπλοποιημένο ΧανΠαραδοσιακό ΧανΕβραϊκόΧιραγκάναΠαχάχ Χμονγ" + - "κΚατακάνα ή ΧιραγκάναΠαλαιό ΟυγγρικόΊνδουςΠαλαιό ΙταλικόΤζάμοΙαβανεζικό" + - "ΙαπωνικόΚαγιάχ ΛιΚατακάναΚαρόσθιΧμερΚανάνταΚορεατικόΚαϊθίΛάνναΛάοςΦράκτ" + - "ουρ ΛατινικόΓαελικό ΛατινικόΛατινικόΛέπτσαΛιμπούΓραμμικό ΑΓραμμικό ΒΛυκ" + - "ιανικόΛυδιανικόΜανδαϊκόΜανιχαϊκόΙερογλυφικά ΜάγιαΜεροϊτικόΜαλαγιάλαμΜογ" + - "γολικόΜουνΜεϊτέι ΜάγεκΜιανμάρΝ’ΚοΌγκχαμΟλ ΤσίκιΌρκχονΟρίγιαΟσμάνγιαΠαλα" + - "ιό ΠερμικόΠαγκς-παΕπιγραφικό ΠαχλάβιΨάλτερ ΠαχλάβιΜπουκ ΠαχλαβίΦοινικικ" + - "όΦωνητικό ΠόλαρντΕπιγραφικό ΠαρθιάνΡετζάνγκΡονγκορόνγκοΡουνίκΣαμαριτικό" + - "ΣαράθιΣαουράστραΝοηματική γραφήΣαβιανόΣινχάλαΣουνδανικόΣυλότι ΝάγκριΣυρ" + - "ιακόΕστραντζέλο ΣυριακόΔυτικό ΣυριακόΑνατολικό ΣυριακόΤαγκμάνγουαΤάι Λε" + - "Νέο Τάι ΛούεΤαμίλΤάι ΒιέτΤελούγκουΤεγνγουάρΤιφινάγκΤαγκαλόγκΘαανάΤαϊλαν" + - "δικόΘιβετιανόΟυγκαριτικόΒάιΟρατή ομιλίαΠαλαιό ΠερσικόΣούμερο-Ακάντιαν Κ" + - "ουνεϊφόρμΓιΚληρονομημένοΜαθηματική σημειογραφίαZsyeΣύμβολαΆγραφοΚοινόΆγ" + - "νωστη γραφή" - -var elScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x0039, 0x0049, - 0x0057, 0x0067, 0x0067, 0x0067, 0x0073, 0x0085, 0x0085, 0x0099, - 0x00ab, 0x00b9, 0x00c5, 0x00d5, 0x00e5, 0x00f1, 0x0148, 0x0154, - 0x015c, 0x016a, 0x0172, 0x0180, 0x0190, 0x01a2, 0x01eb, 0x0203, - 0x0211, 0x0211, 0x0230, 0x0255, 0x0280, 0x0280, 0x0292, 0x02b9, - 0x02cb, 0x02e5, 0x02f3, 0x02f3, 0x0303, 0x0319, 0x032f, 0x0339, - 0x0349, 0x034f, 0x035f, 0x037e, 0x039b, 0x039b, 0x03a9, 0x03bb, - 0x03bb, 0x03d2, 0x03f8, 0x0415, 0x0421, 0x043c, 0x0446, 0x045a, - // Entry 40 - 7F - 0x046a, 0x046a, 0x047b, 0x048b, 0x0499, 0x04a1, 0x04a1, 0x04af, - 0x04c1, 0x04c1, 0x04cb, 0x04d5, 0x04dd, 0x04fe, 0x051d, 0x052d, - 0x0539, 0x0545, 0x0558, 0x056b, 0x056b, 0x056b, 0x057d, 0x058f, - 0x058f, 0x059f, 0x05b1, 0x05b1, 0x05d2, 0x05d2, 0x05d2, 0x05e4, - 0x05f8, 0x05f8, 0x060a, 0x0612, 0x0612, 0x0629, 0x0629, 0x0637, - 0x0637, 0x0637, 0x0637, 0x0637, 0x0640, 0x0640, 0x064c, 0x065b, - 0x0667, 0x0673, 0x0673, 0x0683, 0x0683, 0x0683, 0x069e, 0x06ad, - 0x06d0, 0x06eb, 0x0704, 0x0716, 0x0735, 0x0758, 0x0768, 0x0780, - // Entry 80 - BF - 0x078c, 0x07a0, 0x07ac, 0x07ac, 0x07c0, 0x07dd, 0x07eb, 0x07eb, - 0x07eb, 0x07eb, 0x07f9, 0x07f9, 0x080d, 0x0826, 0x0834, 0x0859, - 0x0874, 0x0895, 0x08ab, 0x08ab, 0x08b6, 0x08cc, 0x08d6, 0x08d6, - 0x08e5, 0x08f7, 0x0909, 0x0919, 0x092b, 0x0935, 0x0949, 0x095b, - 0x095b, 0x0971, 0x0977, 0x098e, 0x098e, 0x098e, 0x09a9, 0x09dd, - 0x09e1, 0x09fb, 0x0a28, 0x0a2c, 0x0a3a, 0x0a46, 0x0a50, 0x0a69, -} // Size: 376 bytes - -const enScriptStr string = "" + // Size: 1585 bytes - "AdlamAfakaCaucasian AlbanianAhomArabicImperial AramaicArmenianAvestanBal" + - "ineseBamumBassa VahBatakBanglaBhaiksukiBlissymbolsBopomofoBrahmiBrailleB" + - "ugineseBuhidChakmaUnified Canadian Aboriginal SyllabicsCarianChamCheroke" + - "eCirthCopticCypriotCyrillicOld Church Slavonic CyrillicDevanagariDeseret" + - "Duployan shorthandEgyptian demoticEgyptian hieraticEgyptian hieroglyphsE" + - "lbasanEthiopicGeorgian KhutsuriGeorgianGlagoliticGothicGranthaGreekGujar" + - "atiGurmukhiHan with BopomofoHangulHanHanunooSimplified HanTraditional Ha" + - "nHatranHebrewHiraganaAnatolian HieroglyphsPahawh HmongJapanese syllabari" + - "esOld HungarianIndusOld ItalicJamoJavaneseJapaneseJurchenKayah LiKatakan" + - "aKharoshthiKhmerKhojkiKannadaKoreanKpelleKaithiLannaLaoFraktur LatinGael" + - "ic LatinLatinLepchaLimbuLinear ALinear BFraserLomaLycianLydianMahajaniMa" + - "ndaeanManichaeanMarchenMayan hieroglyphsMendeMeroitic CursiveMeroiticMal" + - "ayalamModiMongolianMoonMroMeitei MayekMultaniMyanmarOld North ArabianNab" + - "ataeanNewaNaxi GebaN’KoNüshuOghamOl ChikiOrkhonOdiaOsageOsmanyaPalmyrene" + - "Pau Cin HauOld PermicPhags-paInscriptional PahlaviPsalter PahlaviBook Pa" + - "hlaviPhoenicianPollard PhoneticInscriptional ParthianRejangRongorongoRun" + - "icSamaritanSaratiOld South ArabianSaurashtraSignWritingShavianSharadaSid" + - "dhamKhudawadiSinhalaSora SompengSundaneseSyloti NagriSyriacEstrangelo Sy" + - "riacWestern SyriacEastern SyriacTagbanwaTakriTai LeNew Tai LueTamilTangu" + - "tTai VietTeluguTengwarTifinaghTagalogThaanaThaiTibetanTirhutaUgariticVai" + - "Visible SpeechVarang KshitiWoleaiOld PersianSumero-Akkadian CuneiformYiI" + - "nheritedMathematical NotationEmojiSymbolsUnwrittenCommonUnknown Script" - -var enScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0005, 0x000a, 0x001c, 0x0020, 0x0026, 0x0036, 0x003e, - 0x0045, 0x004d, 0x0052, 0x005b, 0x0060, 0x0066, 0x006f, 0x007a, - 0x0082, 0x0088, 0x008f, 0x0097, 0x009c, 0x00a2, 0x00c7, 0x00cd, - 0x00d1, 0x00d9, 0x00de, 0x00e4, 0x00eb, 0x00f3, 0x010f, 0x0119, - 0x0120, 0x0132, 0x0142, 0x0153, 0x0167, 0x016e, 0x0176, 0x0187, - 0x018f, 0x0199, 0x019f, 0x01a6, 0x01ab, 0x01b3, 0x01bb, 0x01cc, - 0x01d2, 0x01d5, 0x01dc, 0x01ea, 0x01f9, 0x01ff, 0x0205, 0x020d, - 0x0222, 0x022e, 0x0242, 0x024f, 0x0254, 0x025e, 0x0262, 0x026a, - // Entry 40 - 7F - 0x0272, 0x0279, 0x0281, 0x0289, 0x0293, 0x0298, 0x029e, 0x02a5, - 0x02ab, 0x02b1, 0x02b7, 0x02bc, 0x02bf, 0x02cc, 0x02d8, 0x02dd, - 0x02e3, 0x02e8, 0x02f0, 0x02f8, 0x02fe, 0x0302, 0x0308, 0x030e, - 0x0316, 0x031e, 0x0328, 0x032f, 0x0340, 0x0345, 0x0355, 0x035d, - 0x0366, 0x036a, 0x0373, 0x0377, 0x037a, 0x0386, 0x038d, 0x0394, - 0x03a5, 0x03ae, 0x03b2, 0x03bb, 0x03c1, 0x03c7, 0x03cc, 0x03d4, - 0x03da, 0x03de, 0x03e3, 0x03ea, 0x03f3, 0x03fe, 0x0408, 0x0410, - 0x0425, 0x0434, 0x0440, 0x044a, 0x045a, 0x0470, 0x0476, 0x0480, - // Entry 80 - BF - 0x0485, 0x048e, 0x0494, 0x04a5, 0x04af, 0x04ba, 0x04c1, 0x04c8, - 0x04cf, 0x04d8, 0x04df, 0x04eb, 0x04f4, 0x0500, 0x0506, 0x0517, - 0x0525, 0x0533, 0x053b, 0x0540, 0x0546, 0x0551, 0x0556, 0x055c, - 0x0564, 0x056a, 0x0571, 0x0579, 0x0580, 0x0586, 0x058a, 0x0591, - 0x0598, 0x05a0, 0x05a3, 0x05b1, 0x05be, 0x05c4, 0x05cf, 0x05e8, - 0x05ea, 0x05f3, 0x0608, 0x060d, 0x0614, 0x061d, 0x0623, 0x0631, -} // Size: 376 bytes - -const esScriptStr string = "" + // Size: 1206 bytes - "árabearmenioavésticobalinésbatakbengalísímbolos blisbopomofobrahmibraill" + - "ebuginésbuhidsímbolos aborígenes canadienses unificadoscariochamcherokee" + - "cirthcoptochipriotacirílicocirílico del antiguo eslavo eclesiásticodevan" + - "agarideseretegipcio demóticoegipcio hieráticojeroglíficos egipciosetiópi" + - "cogeorgiano eclesiásticogeorgianoglagolíticogóticogriegogujaratigurmujih" + - "anbhangulhanhanunoohan simplificadohan tradicionalhebreohiraganapahawh h" + - "mongsilabarios japoneseshúngaro antiguoIndio (harappan)antigua bastardil" + - "lajamojavanésjaponéskayah likatakanakharosthijemercanaréscoreanolannalao" + - "sianolatino frakturlatino gaélicolatinolepchalimbulineal Alineal Bliciol" + - "idiomandeojeroglíficos mayasmeroíticomalayálammongolmoonmanipuribirmanon" + - "’kooghamol cikiorkhonoriyaosmaniyapermiano antiguophags-pafenicioPolla" + - "rd Miaorejangrongo-rongorúnicosaratisaurashtraSignWritingshavianocingalé" + - "ssundanéssyloti nagrisiriacosiriaco estrangelosiriaco occidentalsiriaco " + - "orientaltagbanúatai lenuevo tai luetamiltelugutengwartifinaghtagalothaan" + - "atailandéstibetanougaríticovailenguaje visiblepersa antiguocuneiforme su" + - "merio-acadioyiheredadonotación matemáticaemojissímbolosno escritocomúnal" + - "fabeto desconocido" - -var esScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x000d, - 0x0016, 0x001e, 0x001e, 0x001e, 0x0023, 0x002b, 0x002b, 0x0039, - 0x0041, 0x0047, 0x004e, 0x0056, 0x005b, 0x005b, 0x0087, 0x008c, - 0x0090, 0x0098, 0x009d, 0x00a2, 0x00ab, 0x00b4, 0x00de, 0x00e8, - 0x00ef, 0x00ef, 0x0100, 0x0112, 0x0128, 0x0128, 0x0131, 0x0148, - 0x0151, 0x015d, 0x0164, 0x0164, 0x016a, 0x0172, 0x0179, 0x017d, - 0x0183, 0x0186, 0x018d, 0x019d, 0x01ac, 0x01ac, 0x01b2, 0x01ba, - 0x01ba, 0x01c6, 0x01da, 0x01ea, 0x01fa, 0x020d, 0x0211, 0x0219, - // Entry 40 - 7F - 0x0221, 0x0221, 0x0229, 0x0231, 0x023a, 0x023f, 0x023f, 0x0247, - 0x024e, 0x024e, 0x024e, 0x0253, 0x025b, 0x0269, 0x0278, 0x027e, - 0x0284, 0x0289, 0x0291, 0x0299, 0x0299, 0x0299, 0x029e, 0x02a3, - 0x02a3, 0x02a9, 0x02a9, 0x02a9, 0x02bc, 0x02bc, 0x02bc, 0x02c6, - 0x02d0, 0x02d0, 0x02d6, 0x02da, 0x02da, 0x02e2, 0x02e2, 0x02e9, - 0x02e9, 0x02e9, 0x02e9, 0x02e9, 0x02ef, 0x02ef, 0x02f4, 0x02fb, - 0x0301, 0x0306, 0x0306, 0x030e, 0x030e, 0x030e, 0x031e, 0x0326, - 0x0326, 0x0326, 0x0326, 0x032d, 0x0339, 0x0339, 0x033f, 0x034a, - // Entry 80 - BF - 0x0351, 0x0351, 0x0357, 0x0357, 0x0361, 0x036c, 0x0374, 0x0374, - 0x0374, 0x0374, 0x037d, 0x037d, 0x0386, 0x0392, 0x0399, 0x03ab, - 0x03bd, 0x03cd, 0x03d6, 0x03d6, 0x03dc, 0x03e9, 0x03ee, 0x03ee, - 0x03ee, 0x03f4, 0x03fb, 0x0403, 0x0409, 0x040f, 0x0419, 0x0421, - 0x0421, 0x042b, 0x042e, 0x043e, 0x043e, 0x043e, 0x044b, 0x0464, - 0x0466, 0x046e, 0x0483, 0x0489, 0x0492, 0x049c, 0x04a2, 0x04b6, -} // Size: 376 bytes - -const es419ScriptStr string = "katakana o hiraganalaolatín" - -var es419ScriptIdx = []uint16{ // 80 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, - // Entry 40 - 7F - 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, - 0x0013, 0x0013, 0x0013, 0x0013, 0x0016, 0x0016, 0x0016, 0x001c, -} // Size: 184 bytes - -const etScriptStr string = "" + // Size: 1555 bytes - "afakaalbaaniahomiaraabiavanaarameaarmeeniaavestabalibamumibassabatakiben" + - "galiBlissi sümbolidbopomofobraahmipunktkiribugibuhiditšaakmaKanada põlis" + - "rahvaste ühtlustatud silpkirikaariatšaamitšerokiiCirthikoptiKüprose silp" + - "kirikirillitsakürilliline kirikuslaavidevanaagarideseretiDuployé kiirkir" + - "iegiptuse demootilineegiptuse hieraatilineegiptuse hieroglüüfkiriElbasan" + - "ietioopiahutsurigruusiaglagoolitsagootigranthakreekagudžaratigurmukhihan" + - "bikoreahanihanunoolihtsustatud hanitraditsiooniline haniHatraheebreahira" + - "ganaAnatoolia hieroglüüfkiriphahau-hmongi kirijaapani silpkirjadvanaunga" + - "riIndusevanaitalijamojaavajaapanitšurtšenikaja-liikatakanakharoshthikhme" + - "erihodžkikannadakorea segakirikpellekaithitai-thamilaoladina fraktuurkir" + - "iladina gaeliladinaleptšalimbulineaarkiri Alineaarkiri Blisulomalüükialü" + - "üdiamahaadžanimandeamanimaaja hieroglüüfkirimendemeroe kursiivkirimeroe" + - "malajalamimodimongoliMoonimruumeiteiMultanibirmaPõhja-AraabiaNabateanasi" + - "nkoonüšuogamsantaliOrhonioriaosmaniPalmyravanapermiphakpapahlavi raidkir" + - "ipahlavi psalmikiripahlavi raamatukirifoiniikiaPollardi miaopartia raidk" + - "iriredžangirongorongoruunikiriSamaariasaratiLõuna-Araabiasauraštraviipek" + - "iriShaw’ kirišaaradasiddhamihudavadisingalisorasundasilotisüüriasüüria e" + - "strangeloläänesüüriaidasüüriatagbanvataakritai-lööuus tai-lõõtamilitangu" + - "uditai-vietiteluguTengwaritifinagitagalogitaanataitiibetitirhutaugaritiv" + - "ainähtava kõnehoovoleaivanapärsiasumeri-akadi kiilkirijiipäritudmatemaat" + - "iline tähistusemojisümbolidkirjakeeletaüldinemääramata kiri" - -var etScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x000c, 0x0011, 0x0018, 0x0022, 0x002a, - 0x0030, 0x0034, 0x003a, 0x003f, 0x0045, 0x004c, 0x004c, 0x005c, - 0x0064, 0x006b, 0x0074, 0x0078, 0x007e, 0x0086, 0x00b1, 0x00b7, - 0x00be, 0x00c7, 0x00cd, 0x00d2, 0x00e3, 0x00ed, 0x0106, 0x0111, - 0x0119, 0x012a, 0x013e, 0x0153, 0x016c, 0x0174, 0x017c, 0x0183, - 0x018a, 0x0195, 0x019a, 0x01a1, 0x01a7, 0x01b1, 0x01b9, 0x01be, - 0x01c3, 0x01c7, 0x01ce, 0x01df, 0x01f4, 0x01f9, 0x0200, 0x0208, - 0x0222, 0x0234, 0x0246, 0x0250, 0x0256, 0x025f, 0x0263, 0x0268, - // Entry 40 - 7F - 0x026f, 0x027a, 0x0282, 0x028a, 0x0294, 0x029b, 0x02a2, 0x02a9, - 0x02b7, 0x02bd, 0x02c3, 0x02cc, 0x02cf, 0x02e2, 0x02ee, 0x02f4, - 0x02fb, 0x0300, 0x030d, 0x031a, 0x031e, 0x0322, 0x032a, 0x0332, - 0x033d, 0x0343, 0x0347, 0x0347, 0x035d, 0x0362, 0x0373, 0x0378, - 0x0382, 0x0386, 0x038d, 0x0392, 0x0396, 0x039c, 0x03a3, 0x03a8, - 0x03b6, 0x03bd, 0x03bd, 0x03c1, 0x03c5, 0x03cb, 0x03cf, 0x03d6, - 0x03dc, 0x03e0, 0x03e0, 0x03e6, 0x03ed, 0x03ed, 0x03f6, 0x03fc, - 0x040c, 0x041e, 0x0431, 0x043a, 0x0447, 0x0456, 0x045f, 0x0469, - // Entry 80 - BF - 0x0472, 0x047a, 0x0480, 0x048e, 0x0498, 0x04a1, 0x04ad, 0x04b5, - 0x04bd, 0x04c5, 0x04cc, 0x04d0, 0x04d5, 0x04db, 0x04e3, 0x04f6, - 0x0505, 0x0510, 0x0518, 0x051e, 0x0527, 0x0534, 0x053a, 0x0542, - 0x054b, 0x0551, 0x0559, 0x0561, 0x0569, 0x056e, 0x0571, 0x0578, - 0x057f, 0x0586, 0x0589, 0x0597, 0x059a, 0x05a0, 0x05ab, 0x05c0, - 0x05c3, 0x05cb, 0x05e2, 0x05e7, 0x05f0, 0x05fc, 0x0603, 0x0613, -} // Size: 376 bytes - -const faScriptStr string = "" + // Size: 1877 bytes - "آلبانیایی قفقازیعربیآرامی هخامنشیارمنیاوستاییبالیاییباتاکیبنگالینمادهای " + - "بلیسبوپوموفوبراهمیبریلبوگیاییبوهیدچاکماییکاریچمیچروکیاییکرتقبطیقبرسیسیر" + - "یلیدوناگریدیسرتیکاهنی مصریهیروگلیف مصریاتیوپیاییگرجی خوتسوریگرجیگلاگولی" + - "تیگوتییونانیگجراتیگورومخیهانبیهانگولهانهانونوییهان ساده\u200cشدههان سنت" + - "یعبریهیراگاناهیروگلیف آناتولیسیلابی\u200cهای ژاپنیمجاری باستانایندوسایت" + - "الی باستانجاموجاوه\u200cایژاپنیکایالیکاتاکاناخمریخواجکیکاناراکره\u200cا" + - "یکثیلاناییلائوسیلاتینی فراکتورلاتینی گیلیلاتینیلیمباییخطی الفخطی بلسیای" + - "یلدیاییمنده\u200cایمانویهیروگلیف مایاییمروییتیمالایالامیمغولیمونیمایک م" + - "یتیمیانمارعربی شمالی باستاننبطیاوگامیاورخونیاوریه\u200cایپالمیراییپرمی " + - "باستانپهلوی کتیبه\u200cایپهلوی زبوریپهلوی کتابیفنیقیپارتی کتیبه\u200cای" + - "رجنگیرونیسامریساراتیعربی جنوبی باستانسوراشتراییشاویسینهالیسیلوتی نگاریس" + - "ریانیسریانی سطرنجیلیسریانی غربیسریانی شرقیتگبنواییتامیلیتلوگوییتنگوارتی" + - "فیناغیتاگالوگیتانه\u200cایتایلندیتبتیاوگاریتیویاییگفتار قابل مشاهدهفارس" + - "ی باستانمیخی سومری‐اکدیییموروثیعلائم ریاضیاموجیعلائمنانوشتهمشترکخط نامش" + - "خص" - -var faScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x001f, 0x001f, 0x0027, 0x0040, 0x004a, - 0x0058, 0x0066, 0x0066, 0x0066, 0x0072, 0x007e, 0x007e, 0x0095, - 0x00a5, 0x00b1, 0x00b9, 0x00c7, 0x00d1, 0x00df, 0x00df, 0x00e7, - 0x00ed, 0x00fd, 0x0103, 0x010b, 0x0115, 0x0121, 0x0121, 0x012f, - 0x013b, 0x013b, 0x013b, 0x014e, 0x0167, 0x0167, 0x0179, 0x0190, - 0x0198, 0x01aa, 0x01b2, 0x01b2, 0x01be, 0x01ca, 0x01d8, 0x01e2, - 0x01ee, 0x01f4, 0x0204, 0x021c, 0x022b, 0x022b, 0x0233, 0x0243, - 0x0262, 0x0262, 0x0282, 0x0299, 0x02a5, 0x02be, 0x02c6, 0x02d5, - // Entry 40 - 7F - 0x02df, 0x02df, 0x02eb, 0x02fb, 0x02fb, 0x0303, 0x030f, 0x031b, - 0x0328, 0x0328, 0x032e, 0x033a, 0x0346, 0x0361, 0x0376, 0x0382, - 0x0382, 0x0390, 0x039d, 0x03a6, 0x03a6, 0x03a6, 0x03b2, 0x03be, - 0x03be, 0x03cd, 0x03d7, 0x03d7, 0x03f4, 0x03f4, 0x03f4, 0x0402, - 0x0416, 0x0416, 0x0420, 0x0428, 0x0428, 0x0439, 0x0439, 0x0447, - 0x0467, 0x046f, 0x046f, 0x046f, 0x046f, 0x046f, 0x047b, 0x047b, - 0x0489, 0x049a, 0x049a, 0x049a, 0x04ac, 0x04ac, 0x04c1, 0x04c1, - 0x04dd, 0x04f2, 0x0507, 0x0511, 0x0511, 0x052d, 0x0537, 0x0537, - // Entry 80 - BF - 0x053f, 0x0549, 0x0555, 0x0575, 0x0589, 0x0589, 0x0591, 0x0591, - 0x0591, 0x0591, 0x059f, 0x059f, 0x059f, 0x05b6, 0x05c2, 0x05df, - 0x05f4, 0x0609, 0x0619, 0x0619, 0x0619, 0x0619, 0x0625, 0x0625, - 0x0625, 0x0633, 0x063f, 0x064f, 0x065f, 0x066e, 0x067c, 0x0684, - 0x0684, 0x0694, 0x069e, 0x06be, 0x06be, 0x06be, 0x06d5, 0x06f3, - 0x06f7, 0x0703, 0x0718, 0x0722, 0x072c, 0x073a, 0x0744, 0x0755, -} // Size: 376 bytes - -const fiScriptStr string = "" + // Size: 2515 bytes - "fulanin adlam-aakkostoafakakaukasianalbanialainenahomarabialainenvaltaku" + - "nnanaramealainenarmenialainenavestalainenbalilainenbamumbassabatakilaine" + - "nbengalilainensanskritin bhaiksuki-aakkostobliss-symbolitbopomofobrahmib" + - "raille-pistekirjoitusbugilainenbuhidilainenchakmalainenkanadalaisten alk" + - "uperäiskansojen yhtenäistetty tavukirjoituskaarialainentšamilainencherok" + - "eelainencirthkoptilainenmuinaiskyproslainenkyrillinenkyrillinen muinaisk" + - "irkkoslaavimuunnelmadevanagarideseretDuployén pikakirjoitusegyptiläinen " + - "demoottinenegyptiläinen hieraattinenegyptiläiset hieroglyfitelbasanilain" + - "enetiopialainenmuinaisgeorgialainengeorgialainenglagoliittinengoottilain" + - "engranthakreikkalainengudžaratilainengurmukhikiinan han ja bopomofohangu" + - "lkiinalainen hanhanunoolainenkiinalainen yksinkertaistettu hankiinalaine" + - "n perinteinen hanhatralainenheprealainenhiraganaanatolialaiset hieroglyf" + - "itpahawh hmonghiragana tai katakanamuinaisunkarilaineninduslainenmuinais" + - "italialainenkorean hangulin jamo-elementitjaavalainenjapanilainendžurtše" + - "nkayah likatakanakharosthikhmeriläinenkhojkikannadalainenkorealainenkpel" + - "lekaithilannalaolainenlatinalainen fraktuuramuunnelmalatinalainen gaelim" + - "uunnelmalatinalainenlepchalainenlimbulainenlineaari-Alineaari-BFraserin " + - "aakkosetlomalyykialainenlyydialainenmahajanilainenmandealainenmanikealai" + - "nentiibetiläinen marchan-kirjoitusmaya-hieroglyfitmendemeroiittinen kurs" + - "iivikirjoitusmeroiittinenmalajalamilainenmodi-aakkosetmongolilainenmoon-" + - "kohokirjoitusmromeiteimultanilainenburmalainenmuinaispohjoisarabialainen" + - "nabatealainennewarin newa-tavukirjoitusnaxi geban’konüshuogamol chikiork" + - "honorijalainenosagen aakkostoosmanjalainenpalmyralainenzotuallaimuinaisp" + - "ermiläinenphags-papiirtokirjoituspahlavilainenpsalttaripahlavilainenkirj" + - "apahlavilainenfoinikialainenPollardin foneettinenpiirtokirjoitusparthial" + - "ainenrejangrongorongoriimukirjoitussamarianaramealainensaratimuinaisetel" + - "äarabialainensaurashtraSignWritingshaw’lainenšaradasiddham-tavukirjoitu" + - "skhudabadisinhalilainensorang sompengsundalainensyloti nagrisyyrialainen" + - "syyrialainen estrangelo-muunnelmasyyrialainen läntinen muunnelmasyyriala" + - "inen itäinen muunnelmatagbanwalainentakritailelainenuusi tailuelainentam" + - "ililainentanguttai viettelugulainentengwartifinaghtagalogilainenthaanath" + - "ailainentiibetiläinentirhutaugaritilainenvailainennäkyvä puhevarang kshi" + - "tiwoleaimuinaispersialainensumerilais-akkadilainen nuolenpääkirjoitusyil" + - "äinenperittymatemaattinenemoji-symbolitsymbolitkirjoittamatonmäärittämä" + - "töntuntematon kirjoitusjärjestelmä" - -var fiScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0016, 0x001b, 0x0031, 0x0035, 0x0041, 0x0058, 0x0065, - 0x0071, 0x007b, 0x0080, 0x0085, 0x0091, 0x009e, 0x00bb, 0x00c9, - 0x00d1, 0x00d7, 0x00ed, 0x00f7, 0x0103, 0x010f, 0x014d, 0x0159, - 0x0165, 0x0173, 0x0178, 0x0183, 0x0196, 0x01a0, 0x01c7, 0x01d1, - 0x01d8, 0x01ef, 0x0208, 0x0222, 0x023b, 0x0249, 0x0256, 0x026a, - 0x0277, 0x0285, 0x0291, 0x0298, 0x02a5, 0x02b5, 0x02bd, 0x02d3, - 0x02d9, 0x02e8, 0x02f5, 0x0316, 0x0331, 0x033c, 0x0348, 0x0350, - 0x036a, 0x0376, 0x038b, 0x039e, 0x03a9, 0x03bc, 0x03da, 0x03e5, - // Entry 40 - 7F - 0x03f1, 0x03fb, 0x0403, 0x040b, 0x0414, 0x0421, 0x0427, 0x0434, - 0x043f, 0x0445, 0x044b, 0x0450, 0x0459, 0x0478, 0x0493, 0x049f, - 0x04ab, 0x04b6, 0x04c0, 0x04ca, 0x04db, 0x04df, 0x04eb, 0x04f7, - 0x0505, 0x0511, 0x051e, 0x053e, 0x054e, 0x0553, 0x0571, 0x057d, - 0x058d, 0x059a, 0x05a7, 0x05b9, 0x05bc, 0x05c2, 0x05cf, 0x05da, - 0x05f4, 0x0601, 0x061b, 0x0624, 0x062a, 0x0630, 0x0634, 0x063c, - 0x0642, 0x064d, 0x065c, 0x0669, 0x0676, 0x067f, 0x0692, 0x069a, - 0x06b6, 0x06cc, 0x06de, 0x06ec, 0x0701, 0x071d, 0x0723, 0x072d, - // Entry 80 - BF - 0x073b, 0x074f, 0x0755, 0x076e, 0x0778, 0x0783, 0x0790, 0x0797, - 0x07ac, 0x07b5, 0x07c2, 0x07d0, 0x07db, 0x07e7, 0x07f3, 0x0814, - 0x0834, 0x0853, 0x0861, 0x0866, 0x0871, 0x0882, 0x088e, 0x0894, - 0x089c, 0x08a8, 0x08af, 0x08b7, 0x08c5, 0x08cb, 0x08d5, 0x08e3, - 0x08ea, 0x08f7, 0x0900, 0x090d, 0x091a, 0x0920, 0x0933, 0x095f, - 0x0968, 0x096f, 0x097c, 0x098a, 0x0992, 0x09a0, 0x09b2, 0x09d3, -} // Size: 376 bytes - -const filScriptStr string = "" + // Size: 363 bytes - "ArabicArmenianBanglaBopomofoBrailleCyrillicDevanagariEthiopicGeorgianGre" + - "ekGujaratiGurmukhiHanbHangulHanPinasimpleng HanTradisyonal na HanHebrewH" + - "iraganaJapanese syllabariesJamoJapaneseKatakanaKhmerKannadaKoreanLaoLati" + - "nMalayalamMongolianMyanmarOdiaSinhalaTamilTeluguThaanaThaiTibetanMathema" + - "tical NotationEmojiMga SimboloHindi NakasulatKaraniwanHindi Kilalang Scr" + - "ipt" - -var filScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x0014, 0x0014, 0x0014, - 0x001c, 0x001c, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x002b, 0x002b, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003d, 0x003d, - 0x0045, 0x0045, 0x0045, 0x0045, 0x004a, 0x0052, 0x005a, 0x005e, - 0x0064, 0x0067, 0x0067, 0x0077, 0x0089, 0x0089, 0x008f, 0x0097, - 0x0097, 0x0097, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00af, 0x00af, - // Entry 40 - 7F - 0x00b7, 0x00b7, 0x00b7, 0x00bf, 0x00bf, 0x00c4, 0x00c4, 0x00cb, - 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d4, 0x00d4, 0x00d4, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00e2, 0x00e2, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00f2, - 0x00f2, 0x00f2, 0x00f2, 0x00f2, 0x00f2, 0x00f2, 0x00f2, 0x00f2, - 0x00f2, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, - 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, - // Entry 80 - BF - 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, - 0x00f6, 0x00f6, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, - 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x0102, 0x0102, - 0x0102, 0x0108, 0x0108, 0x0108, 0x0108, 0x010e, 0x0112, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x012e, 0x0133, 0x013e, 0x014d, 0x0156, 0x016b, -} // Size: 376 bytes - -const frScriptStr string = "" + // Size: 1457 bytes - "arabearaméen impérialarménienavestiquebalinaisbatakbengalisymboles Bliss" + - "bopomofobrâhmîbraillebouguisbouhidechakmasyllabaire autochtone canadien " + - "unifiécarienchamcherokeecirthcoptesyllabaire chypriotecyrilliquecyrilliq" + - "ue (variante slavonne)dévanâgarîdéséretdémotique égyptienhiératique égyp" + - "tienhiéroglyphes égyptienséthiopiquegéorgien khoutsourigéorgienglagoliti" + - "quegotiquegrecgoudjarâtîgourmoukhîHanbhangûlsinogrammeshanounóosinogramm" + - "es simplifiéssinogrammes traditionnelshébreuhiraganapahawh hmongkatakana" + - " ou hiraganaancien hongroisindusancien italiqueJamojavanaisjaponaiskayah" + - " likatakanakharochthîkhmerkannaracoréenkaithîlannalaolatin (variante bri" + - "sée)latin (variante gaélique)latinlepchalimboulinéaire Alinéaire Blycien" + - "lydienmandéenmanichéenhiéroglyphes mayasméroïtiquemalayalammongolmoonmei" + - "tei mayekbirmann’koogamol tchikiorkhonoriyaosmanaisancien permienphags p" + - "apehlevi des inscriptionspehlevi des psautierspehlevi des livresphénicie" + - "nphonétique de Pollardparthe des inscriptionsrejangrongorongoruniquesama" + - "ritainsaratisaurashtraécriture des signesshaviencinghalaissundanaissylot" + - "î nâgrîsyriaquesyriaque estranghélosyriaque occidentalsyriaque oriental" + - "tagbanouataï-lenouveau taï-luetamoultaï viêttélougoutengwartifinaghtagal" + - "thânathaïtibétainougaritiquevaïparole visiblecunéiforme persépolitaincun" + - "éiforme suméro-akkadienyihériténotation mathématiqueZsyesymbolesnon écr" + - "itcommunécriture inconnue" - -var frScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x0017, 0x0020, - 0x0029, 0x0031, 0x0031, 0x0031, 0x0036, 0x003d, 0x003d, 0x004b, - 0x0053, 0x005b, 0x0062, 0x0069, 0x0070, 0x0076, 0x009c, 0x00a2, - 0x00a6, 0x00ae, 0x00b3, 0x00b8, 0x00cc, 0x00d6, 0x00f4, 0x0101, - 0x010a, 0x010a, 0x011e, 0x0133, 0x014b, 0x014b, 0x0156, 0x016a, - 0x0173, 0x017f, 0x0186, 0x0186, 0x018a, 0x0196, 0x01a1, 0x01a5, - 0x01ac, 0x01b7, 0x01c0, 0x01d7, 0x01f0, 0x01f0, 0x01f7, 0x01ff, - 0x01ff, 0x020b, 0x021f, 0x022e, 0x0233, 0x0242, 0x0246, 0x024e, - // Entry 40 - 7F - 0x0256, 0x0256, 0x025e, 0x0266, 0x0271, 0x0276, 0x0276, 0x027d, - 0x0284, 0x0284, 0x028b, 0x0290, 0x0293, 0x02ab, 0x02c5, 0x02ca, - 0x02d0, 0x02d6, 0x02e1, 0x02ec, 0x02ec, 0x02ec, 0x02f2, 0x02f8, - 0x02f8, 0x0300, 0x030a, 0x030a, 0x031d, 0x031d, 0x031d, 0x0329, - 0x0332, 0x0332, 0x0338, 0x033c, 0x033c, 0x0348, 0x0348, 0x034e, - 0x034e, 0x034e, 0x034e, 0x034e, 0x0354, 0x0354, 0x0358, 0x0361, - 0x0367, 0x036c, 0x036c, 0x0374, 0x0374, 0x0374, 0x0382, 0x038a, - 0x03a2, 0x03b7, 0x03c9, 0x03d3, 0x03e9, 0x0400, 0x0406, 0x0410, - // Entry 80 - BF - 0x0417, 0x0421, 0x0427, 0x0427, 0x0431, 0x0445, 0x044c, 0x044c, - 0x044c, 0x044c, 0x0456, 0x0456, 0x045f, 0x046e, 0x0476, 0x048b, - 0x049e, 0x04af, 0x04b8, 0x04b8, 0x04bf, 0x04cf, 0x04d5, 0x04d5, - 0x04df, 0x04e8, 0x04ef, 0x04f7, 0x04fc, 0x0502, 0x0507, 0x0510, - 0x0510, 0x051b, 0x051f, 0x052d, 0x052d, 0x052d, 0x0547, 0x0563, - 0x0565, 0x056d, 0x0583, 0x0587, 0x058f, 0x0599, 0x059f, 0x05b1, -} // Size: 376 bytes - -const frCAScriptStr string = "" + // Size: 118 bytes - "devanagarigujaratihanbcaractères chinois simplifiéscaractères chinois tr" + - "aditionnelssyllabaires japonaisjamoodiazsye" - -var frCAScriptIdx = []uint16{ // 172 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0012, 0x0012, 0x0016, - 0x0016, 0x0016, 0x0016, 0x0035, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x006a, 0x006a, 0x006a, 0x006a, 0x006e, 0x006e, - // Entry 40 - 7F - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, - 0x006e, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - // Entry 80 - BF - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0076, -} // Size: 368 bytes - -const guScriptStr string = "" + // Size: 3357 bytes - "અરબીઇમ્પિરિયલ આર્મનિકઅર્મેનિયનઅવેસ્તનબાલીનીઝબટાકબંગાળીબ્લિસિમ્બોલ્સબોપોમ" + - "ોફોબ્રહ્મીબ્રેલબગિનીસબુહિદચકમાયુનાઇટેડ કેનેડિયન એબોરિજનલ સિલેબિક્સકરૈન" + - "ચેરોકીસિર્થકોપ્ટિકસિપ્રાયટસિરિલિકઓલ્ડ ચર્ચ સ્લાવોનિક સિરિલિકદેવનાગરીડે" + - "સરેટઇજિપ્શિયન ડેમોટિકઇજિપ્શિયન હાઇરેટિકઇજિપ્શિયન હાઇરોગ્લિફ્સઇથિયોપિકજ" + - "્યોર્જિઅન ખુતસુરીજ્યોર્જિઅનગ્લેગોલિટિકગોથિકગ્રીકગુજરાતીગુરૂમુખીહાન્બહં" + - "ગુલહાનહનુનૂસરળીકૃત હાનપરંપરાગત હાનહીબ્રુહિરાગાનાપહાઉ મોન્ગજાપાનીઝ વર્ણ" + - "માળાઓલ્ડ હંગેરિયનસિન્ધુજૂનુ ઇટાલિકજેમોજાવાનીસજાપાનીકાયાહ લીકટાકાનાખારો" + - "શ્થીખ્મેરકન્નડાકોરિયનકૈથીલાનાલાઓફ્રેકતુર લેટિનગૈલિક લેટિનલેટિનલેપચાલિમ" + - "્બૂલીનિયર અલીનિયર બીલિશિયનલિડિયનમાન્ડાયીનમાનીચાયીનમયાન હાઇરોગ્લિફ્સમેર" + - "ોઇટિકમલયાલમમોંગોલિયનમૂનમેઇતેઇ માયેકમ્યાંમારએન’ કોઓઘામઓલ ચિકીઓરખોનઉડિયા" + - "ઓસ્માન્યાઓલ્ડ પરમિકફાગ્સ-પાઇન્સ્ક્રિપ્શનલ પહલવીસાલટર પહલવીબુક પહલવીફોન" + - "િશિયનપોલાર્ડ ફોનેટિકઇન્સ્ક્રિપ્શનલ પાર્થિયનરીજાંગરોંગોરોંગોરૂનિકસમરિટા" + - "નસરાતીસૌરાષ્ટ્રસંકેત લિપીશાવિયાનસિંહલીસુદાનીઝસિલોતી નાગરીસિરિયેકએસ્ત્ર" + - "ેન્જેલો સિરિયાકપશ્ચિમ સિરિયાકપૂર્વ સિરિયાકતગબન્વાતાઇ લીનવીન તાઇ લૂતમિલ" + - "તાઇ વેઇતતેલુગુતેન્ગવારતિફિનાઘટેગાલોગથાનાથાઇટિબેટીયુગાતિટિકવાઇવિસિબલ સ્" + - "પીચજુની ફારસીસુમેરો અક્કાદિયન સુનિફોર્મયીવંશાગતગણિતીય સંકેતલિપિઇમોજીપ્" + - "રતીકોઅલિખિતસામાન્યઅજ્ઞાત લિપિ" - -var guScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x003d, 0x0058, - 0x006d, 0x0082, 0x0082, 0x0082, 0x008e, 0x00a0, 0x00a0, 0x00c7, - 0x00df, 0x00f4, 0x0103, 0x0115, 0x0124, 0x0130, 0x0196, 0x01a2, - 0x01a2, 0x01b4, 0x01c3, 0x01d8, 0x01f0, 0x0205, 0x0250, 0x0268, - 0x027a, 0x027a, 0x02ab, 0x02df, 0x031f, 0x031f, 0x0337, 0x036b, - 0x0389, 0x03aa, 0x03b9, 0x03b9, 0x03c8, 0x03dd, 0x03f5, 0x0404, - 0x0413, 0x041c, 0x042b, 0x044a, 0x046c, 0x046c, 0x047e, 0x0496, - 0x0496, 0x04b2, 0x04e0, 0x0505, 0x0517, 0x0536, 0x0542, 0x0557, - // Entry 40 - 7F - 0x0569, 0x0569, 0x057f, 0x0594, 0x05ac, 0x05bb, 0x05bb, 0x05cd, - 0x05df, 0x05df, 0x05eb, 0x05f7, 0x0600, 0x0628, 0x0647, 0x0656, - 0x0665, 0x0677, 0x068d, 0x06a6, 0x06a6, 0x06a6, 0x06b8, 0x06ca, - 0x06ca, 0x06e5, 0x0700, 0x0700, 0x0731, 0x0731, 0x0731, 0x0749, - 0x075b, 0x075b, 0x0776, 0x077f, 0x077f, 0x07a1, 0x07a1, 0x07b9, - 0x07b9, 0x07b9, 0x07b9, 0x07b9, 0x07c9, 0x07c9, 0x07d5, 0x07e8, - 0x07f7, 0x0806, 0x0806, 0x0821, 0x0821, 0x0821, 0x083d, 0x0853, - 0x088d, 0x08ac, 0x08c5, 0x08dd, 0x0908, 0x094b, 0x095d, 0x097b, - // Entry 80 - BF - 0x098a, 0x099f, 0x09ae, 0x09ae, 0x09c9, 0x09e5, 0x09fa, 0x09fa, - 0x09fa, 0x09fa, 0x0a0c, 0x0a0c, 0x0a21, 0x0a43, 0x0a58, 0x0a95, - 0x0abd, 0x0ae2, 0x0af7, 0x0af7, 0x0b07, 0x0b24, 0x0b30, 0x0b30, - 0x0b46, 0x0b58, 0x0b70, 0x0b85, 0x0b9a, 0x0ba6, 0x0baf, 0x0bc1, - 0x0bc1, 0x0bdc, 0x0be5, 0x0c07, 0x0c07, 0x0c07, 0x0c23, 0x0c6d, - 0x0c73, 0x0c85, 0x0cb3, 0x0cc2, 0x0cd7, 0x0ce9, 0x0cfe, 0x0d1d, -} // Size: 376 bytes - -const heScriptStr string = "" + // Size: 875 bytes - "ערביארמניבאלינזיבנגליבופומופובריילצ׳אםצ׳ירוקיקופטיקפריסאיקיריליקירילי סל" + - "אבוני כנסייתי עתיקדוואנגריכתב חרטומיםאתיופיגאורגיגותייווניגוג׳רטיגורמוק" + - "יהאנבהאנגולהאןהאן פשוטהאן מסורתיעבריהירגאנההברתי יפניהונגרי עתיקאינדוסא" + - "יטלקי עתיקג׳אמוג׳אוונזייפניקטקאנהחמריקאנאדהקוריאנילאיתלטיני גאלילטינימא" + - "יהמליאלאםמונגולימיאנמראורייהפיניקירוניסינהלהסוריסורי מערביסורי מזרחיטמי" + - "לטלוגוטגלוגתאנהתאיטיבטיאוגריתיפרסי עתיקמורשסימון מתמטיאמוג׳יסמליםלא כתו" + - "ברגילכתב שאינו ידוע" - -var heScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0012, - 0x0012, 0x0020, 0x0020, 0x0020, 0x0020, 0x002a, 0x002a, 0x002a, - 0x003a, 0x003a, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, - 0x004c, 0x005a, 0x005a, 0x0064, 0x0072, 0x007e, 0x00b1, 0x00c1, - 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00d6, 0x00d6, 0x00e2, 0x00e2, - 0x00ee, 0x00ee, 0x00f6, 0x00f6, 0x0100, 0x010e, 0x011c, 0x0124, - 0x0130, 0x0136, 0x0136, 0x0145, 0x0158, 0x0158, 0x0160, 0x016e, - 0x016e, 0x016e, 0x0181, 0x0196, 0x01a2, 0x01b7, 0x01c1, 0x01d1, - // Entry 40 - 7F - 0x01d9, 0x01d9, 0x01d9, 0x01e5, 0x01e5, 0x01ed, 0x01ed, 0x01f9, - 0x0207, 0x0207, 0x0207, 0x0207, 0x020f, 0x020f, 0x0222, 0x022c, - 0x022c, 0x022c, 0x022c, 0x022c, 0x022c, 0x022c, 0x022c, 0x022c, - 0x022c, 0x022c, 0x022c, 0x022c, 0x0234, 0x0234, 0x0234, 0x0234, - 0x0242, 0x0242, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, 0x025c, - 0x025c, 0x025c, 0x025c, 0x025c, 0x025c, 0x025c, 0x025c, 0x025c, - 0x025c, 0x0268, 0x0268, 0x0268, 0x0268, 0x0268, 0x0268, 0x0268, - 0x0268, 0x0268, 0x0268, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, - // Entry 80 - BF - 0x027c, 0x027c, 0x027c, 0x027c, 0x027c, 0x027c, 0x027c, 0x027c, - 0x027c, 0x027c, 0x0288, 0x0288, 0x0288, 0x0288, 0x0290, 0x0290, - 0x02a3, 0x02b6, 0x02b6, 0x02b6, 0x02b6, 0x02b6, 0x02be, 0x02be, - 0x02be, 0x02c8, 0x02c8, 0x02c8, 0x02d2, 0x02da, 0x02e0, 0x02ea, - 0x02ea, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0309, 0x0309, - 0x0309, 0x0311, 0x0326, 0x0332, 0x033c, 0x0349, 0x0351, 0x036b, -} // Size: 376 bytes - -const hiScriptStr string = "" + // Size: 3366 bytes - "अरबीइम्पिरियल आर्मेनिकआर्मेनियाईअवेस्तनबालीबटकीबंगालीब्लिसिम्बॉल्सबोपोमो" + - "फ़ोब्रह्मीब्रेलबगिनीसबुहिदचकमायुनिफाइड कैनेडियन एबोरिजनल सिलेबिक्सकरैन" + - "चामचेरोकीकिर्थकॉप्टिककाइप्रायटसिरिलिकओल्ड चर्च स्लावोनिक सिरिलिकदेवनाग" + - "रीडेसरेटइजिप्शियन डेमोटिकइजिप्शियन हाइरेटिकइजिप्शियन हाइरोग्लिफ्सइथियो" + - "पियाईजॉर्जियन खुतसुरीजॉर्जियनग्लेगोलिटिकगोथिकग्रन्थयूनानीगुजरातीगुरमुख" + - "ीहांबहंगुलहानहनुनूसरलीकृत हानपारंपरिक हानहिब्रूहिरागानापाहो ह्मोन्गजाप" + - "ानी सिलेबरीज़ऑल्ड हंगेरियनसिन्धुपुरानी इटलीजामोजावानीसजापानीकायाह लीका" + - "ताकानाखारोशथीखमेरकन्नड़कोरियाईकैथीलानालाओफ़्रैक्टुर लातिनीगेली लातिनील" + - "ैटिनलेपचालिम्बूलीनियर Aलीनियर बीलिशियनलिडियनमनडेनमनीशीनमयान हाइरोग्लिफ" + - "्समेरोइटिकमलयालममंगोलियाईमूनमेइतेइ मायेकम्यांमारएन्‘कोओगमऑल चिकीओरखोनउ" + - "ड़ियाओस्मान्याओल्ड परमिकफाग्स-पाइंस्क्रिपश्नल पाहलवीसॉल्टर पाहलवीबुक प" + - "ाहलवीफोनिशियनपॉलार्ड फोनेटिकइंस्क्रिपश्नल पार्थियनरीजांगरोन्गोरोन्गोरू" + - "निकसमरिटनसरातीसौराष्ट्रसांकेतिक लेखशावियानसिंहलीसूडानीसिलोती नागरीसिरि" + - "येकएस्त्रेन्जेलो सिरिएकपश्चिम सिरिएकपूर्व सिरिएकतगबन्वाताई लीनया ताई ल" + - "ुतमिलताई विएततेलुगूतेन्गवारतिफिनाघटैगालोगथानाथाईतिब्बतीयुगारिटिकवाईविस" + - "िबल स्पीचपुरानी फारसीसुमेरो अक्कादियन सुनिफॉर्मयीविरासतगणितीय संकेतनईम" + - "ोजीचिह्नअलिखितसामान्यअज्ञात लिपि" - -var hiScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x0040, 0x005e, - 0x0073, 0x007f, 0x007f, 0x007f, 0x008b, 0x009d, 0x009d, 0x00c4, - 0x00df, 0x00f4, 0x0103, 0x0115, 0x0124, 0x0130, 0x0196, 0x01a2, - 0x01ab, 0x01bd, 0x01cc, 0x01e1, 0x01fc, 0x0211, 0x025c, 0x0274, - 0x0286, 0x0286, 0x02b7, 0x02eb, 0x032b, 0x032b, 0x0349, 0x0377, - 0x038f, 0x03b0, 0x03bf, 0x03d1, 0x03e3, 0x03f8, 0x040d, 0x0419, - 0x0428, 0x0431, 0x0440, 0x045f, 0x0481, 0x0481, 0x0493, 0x04ab, - 0x04ab, 0x04cd, 0x04fb, 0x0520, 0x0532, 0x0551, 0x055d, 0x0572, - // Entry 40 - 7F - 0x0584, 0x0584, 0x059a, 0x05b2, 0x05c7, 0x05d3, 0x05d3, 0x05e5, - 0x05fa, 0x05fa, 0x0606, 0x0612, 0x061b, 0x064c, 0x066b, 0x067a, - 0x0689, 0x069b, 0x06af, 0x06c8, 0x06c8, 0x06c8, 0x06da, 0x06ec, - 0x06ec, 0x06fb, 0x070d, 0x070d, 0x073e, 0x073e, 0x073e, 0x0756, - 0x0768, 0x0768, 0x0783, 0x078c, 0x078c, 0x07ae, 0x07ae, 0x07c6, - 0x07c6, 0x07c6, 0x07c6, 0x07c6, 0x07d8, 0x07d8, 0x07e1, 0x07f4, - 0x0803, 0x0815, 0x0815, 0x0830, 0x0830, 0x0830, 0x084c, 0x0862, - 0x089c, 0x08c1, 0x08dd, 0x08f5, 0x0920, 0x0960, 0x0972, 0x0996, - // Entry 80 - BF - 0x09a5, 0x09b7, 0x09c6, 0x09c6, 0x09e1, 0x0a03, 0x0a18, 0x0a18, - 0x0a18, 0x0a18, 0x0a2a, 0x0a2a, 0x0a3c, 0x0a5e, 0x0a73, 0x0aad, - 0x0ad2, 0x0af4, 0x0b09, 0x0b09, 0x0b19, 0x0b33, 0x0b3f, 0x0b3f, - 0x0b55, 0x0b67, 0x0b7f, 0x0b94, 0x0ba9, 0x0bb5, 0x0bbe, 0x0bd3, - 0x0bd3, 0x0bee, 0x0bf7, 0x0c19, 0x0c19, 0x0c19, 0x0c3b, 0x0c85, - 0x0c8b, 0x0c9d, 0x0cc2, 0x0cd1, 0x0ce0, 0x0cf2, 0x0d07, 0x0d26, -} // Size: 376 bytes - -const hrScriptStr string = "" + // Size: 2397 bytes - "afaka pismoarapsko pismoaramejsko pismoarmensko pismoavestansko pismobal" + - "ijsko pismobamum pismobassa vah pismobatak pismobengalsko pismoblissymbo" + - "lsbopomofo pismobrahmi pismobrajicabuginsko pismobuhid pismochakma pismo" + - "unificirani kanadski aboriđinski slogovikarijsko pismočamsko pismočeroki" + - " pismocirth pismokoptsko pismocypriot pismoćirilicastaroslavenska crkven" + - "a čirilicadevangari pismodeseret pismoegipatsko narodno pismoegipatsko h" + - "ijeratsko pismoegipatski hijeroglifietiopsko pismogruzijsko khutsuri pis" + - "mogruzijsko pismoglagoljicagotičko pismograntha pismogrčko pismogudžarat" + - "sko pismogurmukhi pismohanb pismohangul pismohansko pismohanunoo pismopo" + - "jednostavljeno hansko pismotradicionalno hansko pismohebrejsko pismohira" + - "gana pismoanatolijski hijeroglifipahawh hmong pismojapansko slogovno pis" + - "mostaro mađarsko pismoindijsko pismostaro talijansko pismojamo pismojava" + - "nsko pismojapansko pismojurchen pismokayah li pismokatakana pismokharosh" + - "thi pismokmersko pismokhojki pismokannada pismokorejsko pismokpelle pism" + - "okaithi pismolanna pismolaosko pismofraktur latinicakeltska latinicalati" + - "nicalepcha pismolimbu pismolinear A pismolinear B pismofraser pismoloma " + - "pismolikijsko pismolidijsko pismomandai pismomanihejsko pismomajanski hi" + - "jeroglifimende pismomeroitski kurzivmeroitic pismomalajalamsko pismomong" + - "olsko pismomoon pismomro pismomeitei mayek pismomjanmarsko pismostaro sj" + - "evernoarapsko pismonabatejsko pismonaxi geba pismon’ko pismonushu pismoo" + - "gham pismool chiki pismoorkhon pismoorijsko pismoosmanya pismopalmyrene " + - "pismostaro permic pismophags-pa pismopisani pahlavipsalter pahlavipahlav" + - "i pismofeničko pismopollard fonetsko pismopisani parthianrejang pismoron" + - "gorongo pismorunsko pismosamaritansko pismosarati pismostaro južnoarapsk" + - "o pismosaurashtra pismoznakovno pismoshavian pismosharada pismokhudawadi" + - " pismosinhaleško pismosora sompeng pismosundansko pismosyloti nagri pism" + - "osirijsko pismosirijsko estrangelo pismopismo zapadne Sirijepismo istočn" + - "e Sirijetagbanwa pismotakri pismotai le pismonovo tai lue pismotamilsko " + - "pismotangut pismotai viet pismoteluško pismotengwar pismotifinartagalog " + - "pismothaana pismotajsko pismotibetansko pismotirhuta pismougaritsko pism" + - "ovai pismoVisible Speechvarang kshiti pismowoleai pismostaro perzijsko p" + - "ismosumersko-akadsko cuneiform pismoYi pismonasljedno pismomatematičko z" + - "nakovljeemotikonisimbolijezik bez pismenostizajedničko pismonepoznato pi" + - "smo" - -var hrScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000b, 0x000b, 0x000b, 0x0018, 0x0027, 0x0035, - 0x0045, 0x0053, 0x005e, 0x006d, 0x0078, 0x0087, 0x0087, 0x0092, - 0x00a0, 0x00ac, 0x00b3, 0x00c1, 0x00cc, 0x00d8, 0x0101, 0x010f, - 0x011c, 0x0129, 0x0134, 0x0141, 0x014e, 0x0157, 0x0177, 0x0186, - 0x0193, 0x0193, 0x01aa, 0x01c4, 0x01d9, 0x01d9, 0x01e7, 0x01ff, - 0x020e, 0x0218, 0x0226, 0x0233, 0x023f, 0x0251, 0x025f, 0x0269, - 0x0275, 0x0281, 0x028e, 0x02ab, 0x02c5, 0x02c5, 0x02d4, 0x02e2, - 0x02f9, 0x030b, 0x0322, 0x0337, 0x0345, 0x035b, 0x0365, 0x0373, - // Entry 40 - 7F - 0x0381, 0x038e, 0x039c, 0x03aa, 0x03ba, 0x03c7, 0x03d3, 0x03e0, - 0x03ee, 0x03fa, 0x0406, 0x0411, 0x041d, 0x042d, 0x043d, 0x0445, - 0x0451, 0x045c, 0x046a, 0x0478, 0x0484, 0x048e, 0x049c, 0x04aa, - 0x04aa, 0x04b6, 0x04c6, 0x04c6, 0x04da, 0x04e5, 0x04f5, 0x0503, - 0x0515, 0x0515, 0x0524, 0x052e, 0x0537, 0x0549, 0x0549, 0x0559, - 0x0574, 0x0584, 0x0584, 0x0593, 0x059f, 0x05aa, 0x05b5, 0x05c3, - 0x05cf, 0x05dc, 0x05dc, 0x05e9, 0x05f8, 0x05f8, 0x060a, 0x0618, - 0x0626, 0x0635, 0x0642, 0x0650, 0x0666, 0x0675, 0x0681, 0x0691, - // Entry 80 - BF - 0x069d, 0x06af, 0x06bb, 0x06d4, 0x06e4, 0x06f2, 0x06ff, 0x070c, - 0x070c, 0x071b, 0x072c, 0x073e, 0x074d, 0x075f, 0x076d, 0x0786, - 0x079a, 0x07af, 0x07bd, 0x07c8, 0x07d4, 0x07e6, 0x07f4, 0x0800, - 0x080e, 0x081c, 0x0829, 0x0830, 0x083d, 0x0849, 0x0855, 0x0865, - 0x0872, 0x0881, 0x088a, 0x0898, 0x08ab, 0x08b7, 0x08cc, 0x08ec, - 0x08f4, 0x0903, 0x0919, 0x0922, 0x0929, 0x093d, 0x094e, 0x095d, -} // Size: 376 bytes - -const huScriptStr string = "" + // Size: 1286 bytes - "ArabBirodalmi arámiÖrményAvesztánBalinézBatakBengáliBliss jelképrendszer" + - "BopomofoBrámiVakírásBuginézBuhidCsakmaEgyesített kanadai őslakos jelekKa" + - "riCsámCserokiKoptCiprusiCirillÓegyházi szláv cirillDevanagáriDeseretEgyi" + - "ptomi demotikusEgyiptomi hieratikusEgyiptomi hieroglifákEtiópGrúz kucsur" + - "iGrúzGlagolitikusGótGörögGudzsarátiGurmukiHanbHangulHanHanunooEgyszerűsí" + - "tett kínaiHagyományos kínaiHéberHiraganaPahawh hmongKatakana vagy hiraga" + - "naÓmagyarIndusRégi olaszJamoJávaiJapánKajah liKatakanaKharoshthiKhmerKan" + - "nadaKoreaiKaithiLannaLaoFraktur latinGael latinLatinLepchaLimbuLineáris " + - "ALineáris BLíciaiLídiaiMandaiManicheusMaja hieroglifákMeroitikusMalajála" + - "mMongolMoonMeitei mayekBurmaiN’koOghamOl chikiOrhonOriyaOszmánÓpermikusP" + - "hags-paFelriatos pahlaviPsalter pahlaviKönyv pahlaviFőniciaiPollard fone" + - "tikusFeliratos parthianRedzsangRongorongoRunikusSzamaritánSzaratiSzauras" + - "traJelírásShaw ábécéSzingalézSzundanézSylheti nagáriSzíriaiEstrangelo sz" + - "íriaiNyugat-szíriaiKelet-szíriaiTagbanwaTai LeÚj tai lueTamilTai vietTe" + - "luguTengwarBerberTagalogThaanaThaiTibetiUgariVaiLátható beszédÓperzsaÉkí" + - "rásos suméro-akkádJiSzármaztatottMatematikai jelrendszerEmojiSzimbólumÍr" + - "atlan nyelvek kódjaMeghatározatlanIsmeretlen írásrendszer" - -var huScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0014, 0x001c, - 0x0025, 0x002d, 0x002d, 0x002d, 0x0032, 0x003a, 0x003a, 0x004f, - 0x0057, 0x005d, 0x0066, 0x006e, 0x0073, 0x0079, 0x009b, 0x009f, - 0x00a4, 0x00ab, 0x00ab, 0x00af, 0x00b6, 0x00bc, 0x00d4, 0x00df, - 0x00e6, 0x00e6, 0x00f9, 0x010d, 0x0123, 0x0123, 0x0129, 0x0136, - 0x013b, 0x0147, 0x014b, 0x014b, 0x0152, 0x015d, 0x0164, 0x0168, - 0x016e, 0x0171, 0x0178, 0x018f, 0x01a2, 0x01a2, 0x01a8, 0x01b0, - 0x01b0, 0x01bc, 0x01d2, 0x01da, 0x01df, 0x01ea, 0x01ee, 0x01f4, - // Entry 40 - 7F - 0x01fa, 0x01fa, 0x0202, 0x020a, 0x0214, 0x0219, 0x0219, 0x0220, - 0x0226, 0x0226, 0x022c, 0x0231, 0x0234, 0x0241, 0x024b, 0x0250, - 0x0256, 0x025b, 0x0266, 0x0271, 0x0271, 0x0271, 0x0278, 0x027f, - 0x027f, 0x0285, 0x028e, 0x028e, 0x029f, 0x029f, 0x029f, 0x02a9, - 0x02b3, 0x02b3, 0x02b9, 0x02bd, 0x02bd, 0x02c9, 0x02c9, 0x02cf, - 0x02cf, 0x02cf, 0x02cf, 0x02cf, 0x02d5, 0x02d5, 0x02da, 0x02e2, - 0x02e7, 0x02ec, 0x02ec, 0x02f3, 0x02f3, 0x02f3, 0x02fd, 0x0305, - 0x0316, 0x0325, 0x0333, 0x033c, 0x034d, 0x035f, 0x0367, 0x0371, - // Entry 80 - BF - 0x0378, 0x0383, 0x038a, 0x038a, 0x0394, 0x039d, 0x03aa, 0x03aa, - 0x03aa, 0x03aa, 0x03b4, 0x03b4, 0x03be, 0x03cd, 0x03d5, 0x03e8, - 0x03f7, 0x0405, 0x040d, 0x040d, 0x0413, 0x041e, 0x0423, 0x0423, - 0x042b, 0x0431, 0x0438, 0x043e, 0x0445, 0x044b, 0x044f, 0x0455, - 0x0455, 0x045a, 0x045d, 0x046e, 0x046e, 0x046e, 0x0476, 0x0490, - 0x0492, 0x04a0, 0x04b7, 0x04bc, 0x04c6, 0x04dd, 0x04ed, 0x0506, -} // Size: 376 bytes - -const hyScriptStr string = "" + // Size: 781 bytes - "արաբականհայկականբենգալականբոպոմոֆոբրայլիկյուրեղագիրդեւանագարիեթովպականվր" + - "ացականհունականգուջարաթիգուրմուխիհանբհանգուլչինականպարզեցված չինականավան" + - "դական չինականեբրայականհիրագանաճապոնական վանկագիրջամոճապոնականկատականաքմ" + - "երականկաննադակորեականլաոսականլատինականմալայալամմոնղոլականմյանմարականօրի" + - "յասինհալականթամիլականթելուգութաանաթայականտիբեթականմաթեմատիկական նշաններ" + - "էմոձինշաններչգրվածընդհանուրանհայտ գիր" - -var hyScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0020, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0034, 0x0034, 0x0034, - 0x0044, 0x0044, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, - 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0066, 0x0066, 0x007a, - 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x008c, 0x008c, - 0x009c, 0x009c, 0x009c, 0x009c, 0x00ac, 0x00be, 0x00d0, 0x00d8, - 0x00e6, 0x00f4, 0x00f4, 0x0115, 0x0136, 0x0136, 0x0148, 0x0158, - 0x0158, 0x0158, 0x017b, 0x017b, 0x017b, 0x017b, 0x0183, 0x0183, - // Entry 40 - 7F - 0x0195, 0x0195, 0x0195, 0x01a5, 0x01a5, 0x01b5, 0x01b5, 0x01c3, - 0x01d3, 0x01d3, 0x01d3, 0x01d3, 0x01e3, 0x01e3, 0x01e3, 0x01f5, - 0x01f5, 0x01f5, 0x01f5, 0x01f5, 0x01f5, 0x01f5, 0x01f5, 0x01f5, - 0x01f5, 0x01f5, 0x01f5, 0x01f5, 0x01f5, 0x01f5, 0x01f5, 0x01f5, - 0x0207, 0x0207, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x0231, - 0x0231, 0x0231, 0x0231, 0x0231, 0x0231, 0x0231, 0x0231, 0x0231, - 0x0231, 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, - 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, - // Entry 80 - BF - 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, 0x023b, - 0x023b, 0x023b, 0x024f, 0x024f, 0x024f, 0x024f, 0x024f, 0x024f, - 0x024f, 0x024f, 0x024f, 0x024f, 0x024f, 0x024f, 0x0261, 0x0261, - 0x0261, 0x0271, 0x0271, 0x0271, 0x0271, 0x027b, 0x0289, 0x029b, - 0x029b, 0x029b, 0x029b, 0x029b, 0x029b, 0x029b, 0x029b, 0x029b, - 0x029b, 0x029b, 0x02c4, 0x02ce, 0x02dc, 0x02e8, 0x02fa, 0x030d, -} // Size: 376 bytes - -const idScriptStr string = "" + // Size: 1408 bytes - "AfakaAlbania KaukasiaArabAram ImperialArmeniaAvestaBaliBamumBassa VahBat" + - "akBengaliBlissymbolBopomofoBrahmiBrailleBugisBuhidChakmaSimbol Aborigin " + - "Kanada KesatuanKariaChamCherokeeCirthKoptikSiprusSirilikGereja Slavonia " + - "Sirilik LamaDevanagariDeseretStenografi DuployanDemotik MesirHieratik Me" + - "sirHieroglip MesirEtiopiaGeorgian KhutsuriGeorgiaGlagoliticGothicGrantha" + - "YunaniGujaratGurmukhiHanbHangulHanHanunooHan SederhanaHan TradisionalIbr" + - "aniHiraganaHieroglif AnatoliaPahawh HmongKatakana atau HiraganaHungaria " + - "KunoIndusItalia LamaJamoJawaJepangJurchenKayah LiKatakanaKharoshthiKhmer" + - "KhojkiKannadaKoreaKpelleKaithiLannaLaosLatin FrakturLatin GaelikLatinLep" + - "chaLimbuLinear ALinear BLisuLomaLyciaLydiaMandaeManikheiHieroglip MayaMe" + - "ndeKursif MeroitikMeroitikMalayalamModiMongoliaMoonMroMeitei MayekMyanma" + - "rArab Utara KunoNabataeaNaxi GebaN’KoNushuOghamChiki LamaOrkhonOriyaOsma" + - "nyaPalmiraPermik KunoPhags-paPahleviMazmur PahleviKitab PahleviPhoenixFo" + - "netik PollardPrasasti ParthiaRejangRongorongoRunikSamariaSaratiArab Sela" + - "tan KunoSaurashtraTulisan IsyaratShaviaSharadaSiddhamKhudawadiSinhalaSor" + - "a SompengSundaSyloti NagriSuriahSuriah EstrangeloSuriah BaratSuriah Timu" + - "rTagbanwaTakriTai LeTai Lue BaruTamilTangutTai VietTeluguTenghwarTifinag" + - "hTagalogThaanaThaiTibetTirhutaUgaritikVaiUcapan TerlihatVarang KshitiWol" + - "eaiPersia KunoCuneiform Sumero-AkkadiaYiWarisanNotasi MatematikaEmojiSim" + - "bolTidak TertulisUmumSkrip Tak Dikenal" - -var idScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x0015, 0x0015, 0x0019, 0x0026, 0x002d, - 0x0033, 0x0037, 0x003c, 0x0045, 0x004a, 0x0051, 0x0051, 0x005b, - 0x0063, 0x0069, 0x0070, 0x0075, 0x007a, 0x0080, 0x009f, 0x00a4, - 0x00a8, 0x00b0, 0x00b5, 0x00bb, 0x00c1, 0x00c8, 0x00e4, 0x00ee, - 0x00f5, 0x0108, 0x0115, 0x0123, 0x0132, 0x0132, 0x0139, 0x014a, - 0x0151, 0x015b, 0x0161, 0x0168, 0x016e, 0x0175, 0x017d, 0x0181, - 0x0187, 0x018a, 0x0191, 0x019e, 0x01ad, 0x01ad, 0x01b3, 0x01bb, - 0x01cd, 0x01d9, 0x01ef, 0x01fc, 0x0201, 0x020c, 0x0210, 0x0214, - // Entry 40 - 7F - 0x021a, 0x0221, 0x0229, 0x0231, 0x023b, 0x0240, 0x0246, 0x024d, - 0x0252, 0x0258, 0x025e, 0x0263, 0x0267, 0x0274, 0x0280, 0x0285, - 0x028b, 0x0290, 0x0298, 0x02a0, 0x02a4, 0x02a8, 0x02ad, 0x02b2, - 0x02b2, 0x02b8, 0x02c0, 0x02c0, 0x02ce, 0x02d3, 0x02e2, 0x02ea, - 0x02f3, 0x02f7, 0x02ff, 0x0303, 0x0306, 0x0312, 0x0312, 0x0319, - 0x0328, 0x0330, 0x0330, 0x0339, 0x033f, 0x0344, 0x0349, 0x0353, - 0x0359, 0x035e, 0x035e, 0x0365, 0x036c, 0x036c, 0x0377, 0x037f, - 0x0386, 0x0394, 0x03a1, 0x03a8, 0x03b7, 0x03c7, 0x03cd, 0x03d7, - // Entry 80 - BF - 0x03dc, 0x03e3, 0x03e9, 0x03fa, 0x0404, 0x0413, 0x0419, 0x0420, - 0x0427, 0x0430, 0x0437, 0x0443, 0x0448, 0x0454, 0x045a, 0x046b, - 0x0477, 0x0483, 0x048b, 0x0490, 0x0496, 0x04a2, 0x04a7, 0x04ad, - 0x04b5, 0x04bb, 0x04c3, 0x04cb, 0x04d2, 0x04d8, 0x04dc, 0x04e1, - 0x04e8, 0x04f0, 0x04f3, 0x0502, 0x050f, 0x0515, 0x0520, 0x0538, - 0x053a, 0x0541, 0x0552, 0x0557, 0x055d, 0x056b, 0x056f, 0x0580, -} // Size: 376 bytes - -const isScriptStr string = "" + // Size: 401 bytes - "arabísktarmensktbengalsktbopomofoblindraleturkyrillísktdevanagarieþíópís" + - "ktgeorgísktgrísktgújaratígurmukhihanbhangulkínverskteinfaldað hanhefðbun" + - "dið hanhebreskthiraganakatakana eða hiraganajamojapansktkatakanakmerkann" + - "adakóresktlaolatnesktmalalajammongólsktmjanmarsktoriyasinhalatamílskttel" + - "úgúthaanataílenskttíbesktstærðfræðitáknemoji-tákntáknóskrifaðalmenntóþe" + - "kkt letur" - -var isScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0009, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001a, 0x001a, 0x001a, - 0x0022, 0x0022, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x0039, 0x0039, 0x0043, - 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0050, 0x0050, - 0x005a, 0x005a, 0x005a, 0x005a, 0x0061, 0x006b, 0x0073, 0x0077, - 0x007d, 0x0087, 0x0087, 0x0095, 0x00a5, 0x00a5, 0x00ad, 0x00b5, - 0x00b5, 0x00b5, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cf, 0x00cf, - // Entry 40 - 7F - 0x00d7, 0x00d7, 0x00d7, 0x00df, 0x00df, 0x00e3, 0x00e3, 0x00ea, - 0x00f2, 0x00f2, 0x00f2, 0x00f2, 0x00f5, 0x00f5, 0x00f5, 0x00fd, - 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, - 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, - 0x0106, 0x0106, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x011a, - 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, - 0x011a, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, - 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, - // Entry 80 - BF - 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, - 0x011f, 0x011f, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, - 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x012f, 0x012f, - 0x012f, 0x0137, 0x0137, 0x0137, 0x0137, 0x013d, 0x0147, 0x014f, - 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, - 0x014f, 0x014f, 0x0162, 0x016d, 0x0172, 0x017c, 0x0183, 0x0191, -} // Size: 376 bytes - -const itScriptStr string = "" + // Size: 1575 bytes - "afakaaraboaramaico imperialearmenoavesticobalinesebamumBassa Vahbatakben" + - "galesesimboli blissbopomofobrahmibraillebuginesebuhidchakmasimboli abori" + - "geni canadesi unificaticarianchamcherokeecirthcoptocipriotacirillicociri" + - "llico antica chiesa slavonicadevanagarideseretstenografia duployanegizia" + - "no demoticoieratico egizianogeroglifici egizianietiopekutsurigeorgianogl" + - "agoliticogoticogranthagrecogujaratigurmukhihanbhangulhanhanunoohan sempl" + - "ificatohan tradizionaleebraicohiraganageroglifici anatolicipahawn hmongk" + - "atanaka o hiraganaantico unghereseinduitalico anticojamojavanesegiappone" + - "sejurchenkayah likatakanakharoshthikhmerkhojkikannadacoreanoKpellekaithi" + - "lannalaovariante fraktur del latinovariante gaelica del latinolatinolepc" + - "halimbulineare Alineare Blisulomalycilydimandaicomanicheogeroglifici may" + - "amendecorsivo meroiticomeroiticomalayalammongolomoonmromeetei mayekbirma" + - "noarabo settentrionale anticonabateogeba naxin’konushuoghamol chikiorkho" + - "noriyaosmanyapalmirenopermico anticophags-papahlavi delle iscrizionipahl" + - "avi psalterpahlavi bookfeniciofonetica di pollardpartico delle iscrizion" + - "irejangrongorongorunicosamaritanosaratiarabo meridionale anticosaurashtr" + - "alinguaggio dei segnishavianosharadakhudawadisingalesesora sompengsundan" + - "esesyloti nagrisirianosiriaco estrangelosiriaco occidentalesiriaco orien" + - "taletagbanwatakritai letai luetamiltanguttai viettelugutengwartifinaghta" + - "galogthaanathailandesetibetanotirhutaugaritavaiialfabeto visivovarang ks" + - "hitiwoleaipersiano anticosumero-accadiano cuneiformeyiereditatonotazione" + - " matematicaemojisimbolinon scrittocomunescrittura sconosciuta" - -var itScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x0005, 0x0005, 0x000a, 0x001c, 0x0022, - 0x002a, 0x0032, 0x0037, 0x0040, 0x0045, 0x004e, 0x004e, 0x005b, - 0x0063, 0x0069, 0x0070, 0x0078, 0x007d, 0x0083, 0x00a7, 0x00ad, - 0x00b1, 0x00b9, 0x00be, 0x00c3, 0x00cb, 0x00d4, 0x00f5, 0x00ff, - 0x0106, 0x011a, 0x012b, 0x013c, 0x0150, 0x0150, 0x0156, 0x015d, - 0x0166, 0x0171, 0x0177, 0x017e, 0x0183, 0x018b, 0x0193, 0x0197, - 0x019d, 0x01a0, 0x01a7, 0x01b7, 0x01c7, 0x01c7, 0x01ce, 0x01d6, - 0x01eb, 0x01f7, 0x020a, 0x021a, 0x021e, 0x022c, 0x0230, 0x0238, - // Entry 40 - 7F - 0x0242, 0x0249, 0x0251, 0x0259, 0x0263, 0x0268, 0x026e, 0x0275, - 0x027c, 0x0282, 0x0288, 0x028d, 0x0290, 0x02ab, 0x02c6, 0x02cc, - 0x02d2, 0x02d7, 0x02e0, 0x02e9, 0x02ed, 0x02f1, 0x02f5, 0x02f9, - 0x02f9, 0x0301, 0x0309, 0x0309, 0x0319, 0x031e, 0x032f, 0x0338, - 0x0341, 0x0341, 0x0348, 0x034c, 0x034f, 0x035b, 0x035b, 0x0362, - 0x037d, 0x0384, 0x0384, 0x038d, 0x0393, 0x0398, 0x039d, 0x03a5, - 0x03ab, 0x03b0, 0x03b0, 0x03b7, 0x03c0, 0x03c0, 0x03ce, 0x03d6, - 0x03ee, 0x03fd, 0x0409, 0x0410, 0x0423, 0x043b, 0x0441, 0x044b, - // Entry 80 - BF - 0x0451, 0x045b, 0x0461, 0x0479, 0x0483, 0x0497, 0x049f, 0x04a6, - 0x04a6, 0x04af, 0x04b8, 0x04c4, 0x04cd, 0x04d9, 0x04e0, 0x04f2, - 0x0505, 0x0516, 0x051e, 0x0523, 0x0529, 0x0530, 0x0535, 0x053b, - 0x0543, 0x0549, 0x0550, 0x0558, 0x055f, 0x0565, 0x0570, 0x0578, - 0x057f, 0x0586, 0x058a, 0x0599, 0x05a6, 0x05ac, 0x05bb, 0x05d6, - 0x05d8, 0x05e1, 0x05f5, 0x05fa, 0x0601, 0x060c, 0x0612, 0x0627, -} // Size: 376 bytes - -const jaScriptStr string = "" + // Size: 3286 bytes - "アファカ文字カフカス・アルバニア文字アラビア文字帝国アラム文字アルメニア文字アヴェスター文字バリ文字バムン文字バサ文字バタク文字ベンガル文字ブリ" + - "スシンボル注音字母ブラーフミー文字ブライユ点字ブギス文字ブヒッド文字チャクマ文字統合カナダ先住民音節文字カリア文字チャム文字チェロキー文字キ" + - "アス文字コプト文字キプロス文字キリル文字古代教会スラブ語キリル文字デーバナーガリー文字デセレット文字デュプロワエ式速記エジプト民衆文字エジプ" + - "ト神官文字エジプト聖刻文字エルバサン文字エチオピア文字ジョージア文字(フツリ)ジョージア文字グラゴル文字ゴート文字グランタ文字ギリシャ文字グ" + - "ジャラート文字グルムキー文字漢語注音字母ハングル漢字ハヌノオ文字漢字(簡体字)漢字(繁体字)ヘブライ文字ひらがなアナトリア象形文字パハウ・フ" + - "モン文字仮名古代ハンガリー文字インダス文字古イタリア文字字母ジャワ文字日本語の文字女真文字カヤー文字カタカナカローシュティー文字クメール文字" + - "ホジャ文字カンナダ文字韓国語の文字クペレ文字カイティ文字ラーンナー文字ラオ文字ラテン文字(ドイツ文字)ラテン文字 (ゲール文字)ラテン文字レ" + - "プチャ文字リンブ文字線文字A線文字Bフレイザー文字ロマ文字リキア文字リディア文字マハージャニー文字マンダ文字マニ文字マヤ象形文字メンデ文字メ" + - "ロエ文字草書体メロエ文字マラヤーラム文字モーディー文字モンゴル文字ムーン文字ムロ文字メイテイ文字ミャンマー文字古代北アラビア文字ナバテア文字" + - "ナシ族ゲバ文字ンコ文字女書オガム文字オルチキ文字オルホン文字オリヤー文字オスマニア文字パルミラ文字パウ・チン・ハウ文字古ぺルム文字パスパ文字" + - "碑文パフラヴィー文字詩編用パフラヴィー文字書物用パフラヴィー文字フェニキア文字ポラード音声記号碑文パルティア文字ルジャン文字ロンゴロンゴ文字" + - "ルーン文字サマリア文字サラティ文字古代南アラビア文字サウラーシュトラ文字手話文字ショー文字シャーラダー文字梵字クダワディ文字シンハラ文字ソラ" + - "ング・ソンペング文字スンダ文字シロティ・ナグリ文字シリア文字シリア文字(エストランゲロ文字)シリア文字(西方シリア文字)シリア文字(東方シリ" + - "ア文字)タグバンワ文字タークリー文字タイ・レ文字新タイ・ルー文字タミール文字西夏文字タイ・ヴェト文字テルグ文字テングワール文字ティフナグ文字" + - "タガログ文字ターナ文字タイ文字チベット文字ティルフータ文字ウガリット文字ヴァイ文字視話法バラン・クシティ文字ウォレアイ文字古代ペルシア文字シ" + - "ュメール=アッカド語楔形文字イ文字基底文字の種別を継承する結合文字数学記号絵文字記号文字非表記共通文字未定義文字" - -var jaScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0012, 0x0036, 0x0036, 0x0048, 0x005d, 0x0072, - 0x008a, 0x0096, 0x00a5, 0x00b1, 0x00c0, 0x00d2, 0x00d2, 0x00e7, - 0x00f3, 0x010b, 0x011d, 0x012c, 0x013e, 0x0150, 0x0174, 0x0183, - 0x0192, 0x01a7, 0x01b6, 0x01c5, 0x01d7, 0x01e6, 0x020d, 0x022b, - 0x0240, 0x025b, 0x0273, 0x028b, 0x02a3, 0x02b8, 0x02cd, 0x02ed, - 0x0302, 0x0314, 0x0323, 0x0335, 0x0347, 0x035f, 0x0374, 0x0386, - 0x0392, 0x0398, 0x03aa, 0x03bb, 0x03cc, 0x03cc, 0x03de, 0x03ea, - 0x0405, 0x0420, 0x0426, 0x0441, 0x0453, 0x0468, 0x046e, 0x047d, - // Entry 40 - 7F - 0x048f, 0x049b, 0x04aa, 0x04b6, 0x04d4, 0x04e6, 0x04f5, 0x0507, - 0x0519, 0x0528, 0x053a, 0x054f, 0x055b, 0x057b, 0x059c, 0x05ab, - 0x05bd, 0x05cc, 0x05d6, 0x05e0, 0x05f5, 0x0601, 0x0610, 0x0622, - 0x063d, 0x064c, 0x0658, 0x0658, 0x066a, 0x0679, 0x0691, 0x06a0, - 0x06b8, 0x06cd, 0x06df, 0x06ee, 0x06fa, 0x070c, 0x070c, 0x0721, - 0x073c, 0x074e, 0x074e, 0x0763, 0x076f, 0x0775, 0x0784, 0x0796, - 0x07a8, 0x07ba, 0x07ba, 0x07cf, 0x07e1, 0x07ff, 0x0811, 0x0820, - 0x083e, 0x085f, 0x0880, 0x0895, 0x08ad, 0x08c8, 0x08da, 0x08f2, - // Entry 80 - BF - 0x0901, 0x0913, 0x0925, 0x0940, 0x095e, 0x096a, 0x0979, 0x0991, - 0x0997, 0x09ac, 0x09be, 0x09e2, 0x09f1, 0x0a0f, 0x0a1e, 0x0a4a, - 0x0a70, 0x0a96, 0x0aab, 0x0ac0, 0x0ad2, 0x0aea, 0x0afc, 0x0b08, - 0x0b20, 0x0b2f, 0x0b47, 0x0b5c, 0x0b6e, 0x0b7d, 0x0b89, 0x0b9b, - 0x0bb3, 0x0bc8, 0x0bd7, 0x0be0, 0x0bfe, 0x0c13, 0x0c2b, 0x0c58, - 0x0c61, 0x0c91, 0x0c9d, 0x0ca6, 0x0cb2, 0x0cbb, 0x0cc7, 0x0cd6, -} // Size: 376 bytes - -const kaScriptStr string = "" + // Size: 4040 bytes - "აფაკაარაბულიიმპერიული არამეულისომხურიავესტურიბალიურიბამუმიბასა ვაჰიბატაკ" + - "იბენგალურიბლისსიმბოლოებიბოპომოფობრაჰმიბრაილიბუჰიდიჩაკმაკარიულიჩამიჩერო" + - "კიკირთიკოპტურიკვიპროსულიკირილიცაძველი სლავური კირილიცადევანაგარიდეზერე" + - "ტისდუპლოის სტენოგრაფიაეგვიპტური დემოტიკურიეგვიპტური იერატიკულიეგვიპტურ" + - "ი იეროგლიფურიეთიოპიურიხუცურიქართულიგლაგოლიცაგოთურიგრანთაბერძნულიგუჯარა" + - "თულიგურმუხიჰანბიჰანგულიჰანიჰანუნოოგამარტივებული ჰანიტრადიციული ჰანიებრ" + - "აულიჰირაგანაანატოლიური იეროგლიფურიფაჰაუ-მონიიაპონური კანაძველი უნგრული" + - "ჯამოიავურიიაპონურიჯურჯენულიკაიაჰ-ლიკატაკანაქაროშთიქმერულიქოჯკიკანადაკო" + - "რეულიკპელეკაითილაოსურიგელური ლათინურილათინურილიმბუA-ხაზოვანიB-ხაზოვანი" + - "ლომალიკიურილიდიურიმანდეურიმანიქეურიმაიას იეროგლიფებიმენდემეროიტული კურ" + - "სივიმეროიტულიმალაიალამურიმონღოლურიმრომიანმურიძველი ჩრდილოეთ-არაბულინაბ" + - "ატეურინკონუშუოღამიოლ-ჩიკიორხონულიორიაოსმანიაპალმირულიძველი პერმულიფაგს" + - "პამონუმენტური ფალაურიფსალმუნური ფალაურიწიგნური ფალაურიფინიკიურიმონუმენ" + - "ტური პართულირეჯანგირონგორონგორუნულისამარიულისარატიძველი სამხრეთ-არაბულ" + - "ისაურაშტრაჟესტთაშარადაქუდავადისინჰალურისორან-სომპენისუნდანურისილოტი ნა" + - "გრისირიულისირიული ესტრანგელოდასავლეთი სირიულიაღმოსავლეთი სირიულიტაგბან" + - "ვატაკრიტაი ლეახალი ტაი ლიუტამილურიტანღუტურიტაი-ვიეტიტელუგუტენგვარიტიფი" + - "ნაღითაანატაიტიბეტურიტირჰუტაუგარითულივაიხილული მეტყველებავარანგ-კშიტივო" + - "ლეაიძველი სპარსულიშუმერულ-აქადური ლურსმნულიგადაღებულიმათემატიკური ნოტა" + - "ციაEmojiსიმბოლოებიუმწერლობოზოგადიუცნობი დამწერლობა" - -var kaScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000f, 0x000f, 0x000f, 0x0024, 0x0058, 0x006d, - 0x0085, 0x009a, 0x00ac, 0x00c5, 0x00d7, 0x00f2, 0x00f2, 0x011c, - 0x0134, 0x0146, 0x0158, 0x0158, 0x016a, 0x0179, 0x0179, 0x018e, - 0x019a, 0x01ac, 0x01bb, 0x01d0, 0x01ee, 0x0206, 0x0244, 0x0262, - 0x027d, 0x02b4, 0x02ee, 0x0328, 0x0365, 0x0365, 0x0380, 0x0392, - 0x03a7, 0x03c2, 0x03d4, 0x03e6, 0x03fe, 0x041c, 0x0431, 0x0440, - 0x0455, 0x0461, 0x0476, 0x04aa, 0x04d5, 0x04d5, 0x04ea, 0x0502, - 0x0542, 0x055e, 0x0583, 0x05a8, 0x05a8, 0x05a8, 0x05b4, 0x05c6, - // Entry 40 - 7F - 0x05de, 0x05f9, 0x060f, 0x0627, 0x063c, 0x0651, 0x0660, 0x0672, - 0x0687, 0x0696, 0x06a5, 0x06a5, 0x06ba, 0x06ba, 0x06e5, 0x06fd, - 0x06fd, 0x070c, 0x0726, 0x0740, 0x0740, 0x074c, 0x0761, 0x0776, - 0x0776, 0x078e, 0x07a9, 0x07a9, 0x07da, 0x07e9, 0x081a, 0x0835, - 0x0859, 0x0859, 0x0874, 0x0874, 0x087d, 0x087d, 0x087d, 0x0895, - 0x08d3, 0x08ee, 0x08ee, 0x08ee, 0x08f7, 0x0903, 0x0912, 0x0925, - 0x093d, 0x0949, 0x0949, 0x095e, 0x0979, 0x0979, 0x099e, 0x09b0, - 0x09e7, 0x0a1b, 0x0a46, 0x0a61, 0x0a61, 0x0a98, 0x0aad, 0x0acb, - // Entry 80 - BF - 0x0add, 0x0af8, 0x0b0a, 0x0b45, 0x0b60, 0x0b72, 0x0b72, 0x0b84, - 0x0b84, 0x0b9c, 0x0bb7, 0x0bdc, 0x0bf7, 0x0c19, 0x0c2e, 0x0c62, - 0x0c93, 0x0cca, 0x0ce2, 0x0cf1, 0x0d01, 0x0d24, 0x0d3c, 0x0d57, - 0x0d70, 0x0d82, 0x0d9a, 0x0db2, 0x0db2, 0x0dc1, 0x0dca, 0x0de2, - 0x0df7, 0x0e12, 0x0e1b, 0x0e4c, 0x0e6e, 0x0e80, 0x0ea8, 0x0eef, - 0x0eef, 0x0f0d, 0x0f47, 0x0f4c, 0x0f6a, 0x0f85, 0x0f97, 0x0fc8, -} // Size: 376 bytes - -const kkScriptStr string = "" + // Size: 1036 bytes - "араб жазуыармян жазуыбенгал жазуыбопомофо жазуБрайль жазуыкирилл жазуыде" + - "ванагари жазуыэфиоп жазугрузин жазуыгрек жазуыгуджарати жазуыгурмукхи ж" + - "азуыханб жазуыхангыл жазуықытай жазуыжеңілдетілген қытай иероглифыдәстү" + - "рлі қытай иероглифыиврит жазуыхирагана жазуыжапон силлабарийічамо жазуы" + - "жапон жазуыкатакана жазуыкхмер жазуыканнада жазуыкорей жазуылаос жазуыл" + - "атын жазуымалаялам жазуымоңғол жазуымьянма жазуыория жазуысингаль жазуы" + - "тамиль жазуытелугу жазуытаана жазуытай жазуытибет жазуыматематикалық жа" + - "зуэмодзитаңбаларжазусызжалпыбелгісіз жазу" - -var kkScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0013, 0x0013, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x003f, 0x003f, 0x003f, - 0x0058, 0x0058, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0086, 0x0086, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00b8, 0x00b8, - 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00e2, 0x00ff, 0x011a, 0x012d, - 0x0144, 0x0159, 0x0159, 0x0191, 0x01bf, 0x01bf, 0x01d4, 0x01ef, - 0x01ef, 0x01ef, 0x0210, 0x0210, 0x0210, 0x0210, 0x0223, 0x0223, - // Entry 40 - 7F - 0x0238, 0x0238, 0x0238, 0x0253, 0x0253, 0x0268, 0x0268, 0x0281, - 0x0296, 0x0296, 0x0296, 0x0296, 0x02a9, 0x02a9, 0x02a9, 0x02be, - 0x02be, 0x02be, 0x02be, 0x02be, 0x02be, 0x02be, 0x02be, 0x02be, - 0x02be, 0x02be, 0x02be, 0x02be, 0x02be, 0x02be, 0x02be, 0x02be, - 0x02d9, 0x02d9, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x0307, - 0x0307, 0x0307, 0x0307, 0x0307, 0x0307, 0x0307, 0x0307, 0x0307, - 0x0307, 0x031a, 0x031a, 0x031a, 0x031a, 0x031a, 0x031a, 0x031a, - 0x031a, 0x031a, 0x031a, 0x031a, 0x031a, 0x031a, 0x031a, 0x031a, - // Entry 80 - BF - 0x031a, 0x031a, 0x031a, 0x031a, 0x031a, 0x031a, 0x031a, 0x031a, - 0x031a, 0x031a, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, - 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x034a, 0x034a, - 0x034a, 0x0361, 0x0361, 0x0361, 0x0361, 0x0376, 0x0387, 0x039c, - 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, - 0x039c, 0x039c, 0x03bf, 0x03cb, 0x03db, 0x03e9, 0x03f3, 0x040c, -} // Size: 376 bytes - -const kmScriptStr string = "" + // Size: 1140 bytes - "អារ៉ាប់អាមេនីបង់ក្លាដែសបូផូម៉ូហ្វូអក្សរ\u200bសម្រាប់មនុស្ស\u200bពិការ" + - "\u200bភ្នែកស៊ីរីលីកដាវ៉ាន់ណាការិអេត្យូពីហ្សកហ្ស៊ីក្រិចគូចារ៉ាទីកុមុយឃីហា" + - "នប៍ហាំងកុលហានអក្សរ\u200bហាន\u200bកាត់អក្សរ\u200bហាន\u200bពេញអ៊ីស្រាអែល" + - "ហ៊ីរ៉ាកាណាសញ្ញាសំឡេងភាសាជប៉ុនចាម៉ូជប៉ុនកាតាកាណាខ្មែរខាណាដាកូរ៉េឡាវឡាតា" + - "ំងមលយាល័មម៉ុងហ្គោលីភូមាអូឌៀស៊ីនហាឡាតាមីលតេលុគុថាណាថៃទីបេនិមិត្តសញ្ញាគណ" + - "ិតវិទ្យាសញ្ញាអារម្មណ៍និមិត្តសញ្ញាគ្មានការសរសេរទូទៅអក្សរមិនស្គាល់" - -var kmScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0015, 0x0015, 0x0027, - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0045, 0x0045, 0x0045, - 0x0066, 0x0066, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, - 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00db, 0x00db, 0x0102, - 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x011a, 0x011a, - 0x0135, 0x0135, 0x0135, 0x0135, 0x0144, 0x015f, 0x0174, 0x0183, - 0x0198, 0x01a1, 0x01a1, 0x01cb, 0x01f2, 0x01f2, 0x0210, 0x022e, - 0x022e, 0x022e, 0x0267, 0x0267, 0x0267, 0x0267, 0x0276, 0x0276, - // Entry 40 - 7F - 0x0285, 0x0285, 0x0285, 0x029d, 0x029d, 0x02ac, 0x02ac, 0x02be, - 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02d6, 0x02d6, 0x02d6, 0x02e8, - 0x02e8, 0x02e8, 0x02e8, 0x02e8, 0x02e8, 0x02e8, 0x02e8, 0x02e8, - 0x02e8, 0x02e8, 0x02e8, 0x02e8, 0x02e8, 0x02e8, 0x02e8, 0x02e8, - 0x02fd, 0x02fd, 0x031b, 0x031b, 0x031b, 0x031b, 0x031b, 0x0327, - 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, 0x0327, - 0x0327, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, - 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, - // Entry 80 - BF - 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, 0x0333, - 0x0333, 0x0333, 0x034b, 0x034b, 0x034b, 0x034b, 0x034b, 0x034b, - 0x034b, 0x034b, 0x034b, 0x034b, 0x034b, 0x034b, 0x035a, 0x035a, - 0x035a, 0x036c, 0x036c, 0x036c, 0x036c, 0x0378, 0x037e, 0x038a, - 0x038a, 0x038a, 0x038a, 0x038a, 0x038a, 0x038a, 0x038a, 0x038a, - 0x038a, 0x038a, 0x03cc, 0x03f3, 0x0417, 0x043e, 0x044a, 0x0474, -} // Size: 376 bytes - -const knScriptStr string = "" + // Size: 3811 bytes - "ಅರೇಬಿಕ್ಇಂಪೀರಿಯಲ್ ಅರೆಮಾಯಿಕ್ಅರ್ಮೇನಿಯನ್ಅವೆಸ್ತಾನ್ಬಾಲಿನೀಸ್ಬಾಟಕ್ಬೆಂಗಾಲಿಬ್ಲಿಸ್" + - "\u200cಸಿಂಬಲ್ಸ್ಬೋಪೊಮೋಫೋಬ್ರಾಹ್ಮಿಬ್ರೈಲ್ಬಗಿನೀಸ್ಬುಹಿದ್ಕಾಕಂಯುನಿಟೆಡ್ ಕೆನೆಡಿಯನ್ " + - "ಅಬೊರಿಜಿನಲ್ ಸಿಲ್ಯಾಬಿಕ್ಸ್ಕರೇನ್ಚಾಮ್ಚೆರೋಕೀಸಿರ್ಥ್ಕಾಪ್ಟಿಕ್ಸಿಪ್ರಿಯಾಟ್ಸಿರಿಲಿಕ್" + - "ಪ್ರಾಚೀನ ಚರ್ಚ್ ಸ್ಲೋವಾನಿಕ್ ಸಿರಿಲಿಕ್ದೇವನಾಗರಿಡಸರ್ಟ್ಈಜಿಪ್ಟಿಯನ್ ಡೆಮೋಟಿಕ್ಈಜಿಪ" + - "್ಟಿಯನ್ ಹಯಾರಿಟಿಕ್ಈಜಿಪ್ಟಿಯನ್ ಹೀರೋಗ್ಲಿಫ್ಸ್ಇಥಿಯೋಪಿಕ್ಜಾರ್ಜಿಯನ್ ಖುಸ್ತುರಿಜಾರ್" + - "ಜಿಯನ್ಗ್ಲಾಗೋಲಿಟಿಕ್ಗೋತಿಕ್ಗ್ರೀಕ್ಗುಜರಾತಿಗುರ್ಮುಖಿಹಂಬ್ಹ್ಯಾಂಗುಲ್ಹಾನ್ಹನೂನೂಸರಳೀ" + - "ಕೃತ ಹಾನ್ಸಾಂಪ್ರದಾಯಿಕ ಹಾನ್ಹೀಬ್ರೂಹಿರಾಗನಪಹವ್ ಹ್ಮೋಂಗ್ಜಪಾನೀಸ್ ಸಿಲಬರೀಸ್ಪ್ರಾಚೀ" + - "ನ ಹಂಗೇರಿಯನ್ಸಿಂಧೂಪ್ರಾಚೀನ್ ಇಟಾಲಿಕ್ಜಮೋಜಾವನೀಸ್ಜಾಪನೀಸ್ಕೆಯಾ ಲಿಕಟಕಾನಾಖರೋಶ್ತಿಖ" + - "ಮೇರ್ಕನ್ನಡಕೊರಿಯನ್ಕೈಥಿಲಾನಾಲಾವೋಫ್ರಾಕ್ತರ್ ಲ್ಯಾಟಿನ್ಗೇಲಿಕ್ ಲ್ಯಾಟಿನ್ಲ್ಯಾಟಿನ್ಲ" + - "ೆಪ್ಚಾಲಿಂಬುಲೀನಯರ್ ಎಲೀನಯರ್ ಬಿಲೈಸಿಯನ್ಲಿಡಿಯನ್ಮಂಡೇಯನ್ಮನಿಚೈಯನ್ಮಯಾನ್ ಹೀರೋಗ್ಲಿ" + - "ಫ್ಸ್ಮೆರೊಯಿಟಿಕ್ಮಲಯಾಳಂಮಂಗೋಲಿಯನ್ಮೂನ್ಮೈತಿ ಮಯೆಕ್ಮ್ಯಾನ್ಮಾರ್ಎನ್\u200dಕೋಓಘಮ್ಓಲ" + - "್ ಚಿಕಿಓರ್ಖೋನ್ಒರಿಯಾಓಸ್ಮಾನ್ಯಾಪ್ರಾಚೀನ ಪೆರ್ಮಿಕ್ಫಾಗ್ಸ್-ಪಾಇನ್ಸ್\u200cಕ್ರಿಪ್ಶ" + - "ನಲ್ ಪಾಹ್ಲವಿಸಾಲ್ಟರ್ ಪಾಹ್ಲವಿಬುಕ್ ಪಾಹ್ಲವಿಫೀನಿಶಿಯನ್ಪೊಲ್ಲಾರ್ಡ್ ಫೊನೆಟಿಕ್ಇನ್ಸ" + - "್\u200cಕ್ರಿಪ್ಶನಲ್ ಪಾರ್ಥಿಯನ್ರೆಜಾಂಗ್ರೋಂಗೋರೋಂಗೋರೂನಿಕ್ಸಮಾರಿಟನ್ಸರಾಟಿಸೌರಾಷ್ಟ" + - "್ರಸೈನ್\u200cರೈಟಿಂಗ್ಶಾವಿಯಾನ್ಸಿಂಹಳಸುಂಡಾನೀಸ್ಸೈಲೋಟಿ ನಗ್ರಿಸಿರಿಯಾಕ್ಎಸ್ಟ್ರಾಂಜ" + - "ಿಲೋ ಸಿರಿಯಾಕ್ಪಶ್ಚಿಮ ಸಿರಿಯಾಕ್ಪೂರ್ವ ಸಿರಿಯಾಕ್ಟಾಗ್ಬಾನವಾಥಾಯ್ ಲಿನ್ಯೂ ಥಾಯ್ ಲುಇ" + - "ತಮಿಳುಥಾಯ್ ವಿಯೆಟ್ತೆಲುಗುತೆಂಗ್\u200cವಾರ್ಟಿಫಿನಾಘ್ಟ್ಯಾಗಲೋಗ್ಥಾನಾಥಾಯ್ಟಿಬೇಟನ್ಉ" + - "ಗಾರಿಟಿಕ್ವಾಯ್ವಿಸಿಬಲ್ ಸ್ಪೀಚ್ಪ್ರಾಚೀನ ಪರ್ಶಿಯನ್ಸುಮೇರೋ-ಅಕ್ಕಾಡಿಯನ್ ಕ್ಯೂನಿಫಾರ್" + - "ಮ್ಯಿಇನ್\u200dಹೆರಿಟೆಡ್ಗಣೀತ ಸಂಕೇತಲಿಪಿಎಮೋಜಿಸಂಕೇತಗಳುಅಲಿಖಿತಸಾಮಾನ್ಯಅಪರಿಚಿತ ಲ" + - "ಿಪಿ" - -var knScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0015, 0x004c, 0x006a, - 0x0085, 0x009d, 0x009d, 0x009d, 0x00ac, 0x00c1, 0x00c1, 0x00ee, - 0x0106, 0x011e, 0x0130, 0x0145, 0x0157, 0x0163, 0x01db, 0x01ea, - 0x01f6, 0x0208, 0x021a, 0x0232, 0x0250, 0x0268, 0x02c5, 0x02dd, - 0x02ef, 0x02ef, 0x0326, 0x0360, 0x03a3, 0x03a3, 0x03be, 0x03f2, - 0x040d, 0x0431, 0x0443, 0x0443, 0x0455, 0x046a, 0x0482, 0x048e, - 0x04a9, 0x04b5, 0x04c4, 0x04e6, 0x0514, 0x0514, 0x0526, 0x0538, - 0x0538, 0x055a, 0x0588, 0x05b9, 0x05c8, 0x05f6, 0x05ff, 0x0614, - // Entry 40 - 7F - 0x0629, 0x0629, 0x063c, 0x064e, 0x0663, 0x0672, 0x0672, 0x0681, - 0x0696, 0x0696, 0x06a2, 0x06ae, 0x06ba, 0x06ee, 0x0719, 0x0731, - 0x0743, 0x0752, 0x0768, 0x0781, 0x0781, 0x0781, 0x0796, 0x07ab, - 0x07ab, 0x07c0, 0x07d8, 0x07d8, 0x080c, 0x080c, 0x080c, 0x082a, - 0x083c, 0x083c, 0x0857, 0x0863, 0x0863, 0x087f, 0x087f, 0x089d, - 0x089d, 0x089d, 0x089d, 0x089d, 0x08af, 0x08af, 0x08bb, 0x08d1, - 0x08e6, 0x08f5, 0x08f5, 0x0910, 0x0910, 0x0910, 0x093e, 0x0957, - 0x099d, 0x09c8, 0x09ea, 0x0a05, 0x0a3c, 0x0a88, 0x0a9d, 0x0abb, - // Entry 80 - BF - 0x0acd, 0x0ae5, 0x0af4, 0x0af4, 0x0b0f, 0x0b33, 0x0b4b, 0x0b4b, - 0x0b4b, 0x0b4b, 0x0b5a, 0x0b5a, 0x0b75, 0x0b97, 0x0baf, 0x0bec, - 0x0c17, 0x0c3f, 0x0c5a, 0x0c5a, 0x0c6d, 0x0c90, 0x0c9f, 0x0c9f, - 0x0cbe, 0x0cd0, 0x0cee, 0x0d06, 0x0d21, 0x0d2d, 0x0d39, 0x0d4e, - 0x0d4e, 0x0d69, 0x0d75, 0x0d9d, 0x0d9d, 0x0d9d, 0x0dcb, 0x0e21, - 0x0e27, 0x0e4b, 0x0e73, 0x0e82, 0x0e9a, 0x0eac, 0x0ec1, 0x0ee3, -} // Size: 376 bytes - -const koScriptStr string = "" + // Size: 2803 bytes - "아파카 문자코카시안 알바니아 문자아랍 문자아랍제국 문자아르메니아 문자아베스타 문자발리 문자바뭄 문자바사바흐 문자바타크 문자벵골 문" + - "자블리스기호 문자주음부호브라미브라유 점자부기 문자부히드 문자차크마 문자통합 캐나다 토착어카리 문자칸 고어체로키 문자키르쓰콥트 " + - "문자키프로스 문자키릴 문자고대교회슬라브어 키릴문자데바나가리 문자디저렛 문자듀플로이안 문자고대 이집트 민중문자고대 이집트 신관문" + - "자고대 이집트 신성문자엘바산 문자에티오피아 문자그루지야 쿠츠리 문자조지아 문자글라골 문자고트 문자그란타 문자그리스 문자구자라트" + - " 문자구르무키 문자주음 자모한글한자하누누 문자한자 간체한자 번체히브리 문자히라가나아나톨리아 상형문자파하우 몽 문자가나고대 헝가리 " + - "문자인더스 문자고대 이탈리아 문자자모자바 문자일본 문자줄첸 문자카야 리 문자가타카나카로슈티 문자크메르 문자코즈키 문자칸나다 문" + - "자한국어크펠레 문자카이시 문자란나 문자라오 문자독일식 로마자아일랜드식 로마자로마자렙차 문자림부 문자선형 문자(A)선형 문자(B" + - ")프레이저 문자로마 문자리키아 문자리디아 문자마하자니 문자만다이아 문자마니교 문자마야 상형 문자멘데 문자메로에 필기체메로에 문자말" + - "라얄람 문자몽골 문자문 문자므로 문자메이테이 마옉 문자미얀마 문자옛 북부 아라비아 문자나바테아 문자나시 게바 문자응코 문자누슈" + - " 문자오검 문자올 치키 문자오르혼어오리야 문자오스마니아 문자팔미라 문자고대 페름 문자파스파 문자명문 팔라비 문자솔터 팔라비 문자북" + - " 팔라비 문자페니키아 문자폴라드 표음 문자명문 파라티아 문자레장 문자롱고롱고룬 문자사마리아 문자사라티옛 남부 아라비아 문자사우라슈" + - "트라 문자수화 문자샤비안 문자사라다 문자실담자쿠다와디 문자신할라 문자소라 솜펭 문자순다 문자실헤티 나가리시리아 문자에스트랑겔로" + - "식 시리아 문자서부 시리아 문자동부 시리아 문자타그반와 문자타크리 문자타이 레 문자신 타이 루에타밀 문자탕구트 문자태국 베트남" + - " 문자텔루구 문자텡과르 문자티피나그 문자타갈로그 문자타나 문자타이 문자티베트 문자티르후타 문자우가리트 문자바이 문자시화법바랑 크시" + - "티 문자울레아이고대 페르시아 문자수메르-아카드어 설형문자이 문자구전 문자수학 기호이모티콘기호구전일반 문자알 수 없는 문자" - -var koScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0010, 0x0030, 0x0030, 0x003d, 0x0050, 0x0066, - 0x0079, 0x0086, 0x0093, 0x00a6, 0x00b6, 0x00c3, 0x00c3, 0x00d9, - 0x00e5, 0x00ee, 0x00fe, 0x010b, 0x011b, 0x012b, 0x0145, 0x0152, - 0x015c, 0x016c, 0x0175, 0x0182, 0x0195, 0x01a2, 0x01c7, 0x01dd, - 0x01ed, 0x0203, 0x0220, 0x023d, 0x025a, 0x026a, 0x0280, 0x029d, - 0x02ad, 0x02bd, 0x02ca, 0x02da, 0x02ea, 0x02fd, 0x0310, 0x031d, - 0x0323, 0x0329, 0x0339, 0x0346, 0x0353, 0x0353, 0x0363, 0x036f, - 0x038b, 0x039f, 0x03a5, 0x03bc, 0x03cc, 0x03e6, 0x03ec, 0x03f9, - // Entry 40 - 7F - 0x0406, 0x0413, 0x0424, 0x0430, 0x0443, 0x0453, 0x0463, 0x0473, - 0x047c, 0x048c, 0x049c, 0x04a9, 0x04b6, 0x04c9, 0x04e2, 0x04eb, - 0x04f8, 0x0505, 0x0515, 0x0525, 0x0538, 0x0545, 0x0555, 0x0565, - 0x0578, 0x058b, 0x059b, 0x059b, 0x05af, 0x05bc, 0x05cf, 0x05df, - 0x05f2, 0x05f2, 0x05ff, 0x0609, 0x0616, 0x0630, 0x0630, 0x0640, - 0x065e, 0x0671, 0x0671, 0x0685, 0x0692, 0x069f, 0x06ac, 0x06bd, - 0x06c9, 0x06d9, 0x06d9, 0x06ef, 0x06ff, 0x06ff, 0x0713, 0x0723, - 0x073a, 0x0751, 0x0765, 0x0778, 0x078f, 0x07a9, 0x07b6, 0x07c2, - // Entry 80 - BF - 0x07cc, 0x07df, 0x07e8, 0x0806, 0x081f, 0x082c, 0x083c, 0x084c, - 0x0855, 0x0868, 0x0878, 0x088c, 0x0899, 0x08ac, 0x08bc, 0x08e2, - 0x08f9, 0x0910, 0x0923, 0x0933, 0x0944, 0x0955, 0x0962, 0x0972, - 0x0989, 0x0999, 0x09a9, 0x09bc, 0x09cf, 0x09dc, 0x09e9, 0x09f9, - 0x0a0c, 0x0a1f, 0x0a2c, 0x0a35, 0x0a4c, 0x0a58, 0x0a72, 0x0a95, - 0x0a9f, 0x0aac, 0x0ab9, 0x0ac5, 0x0acb, 0x0ad1, 0x0ade, 0x0af3, -} // Size: 376 bytes - -const kyScriptStr string = "" + // Size: 608 bytes - "АрабАрмянБенгалБопомофоБрейлКириллДеванагариЭфиопГрузинГрекГужаратиГурму" + - "хиХанбХангулХаньЖөнөк. ХаньСалттуу ХаньИвритХираганаЖапон силлабография" + - "сыДжамоЖапанКатаканаКмерКаннадаКорейЛаоЛатынМалайаламМонголМйанмарОрийа" + - "СингалаТамилТелуТаанаТайТибетМатематикалык мааниБыйтыкчаБелгилерЖазылба" + - "ганЖалпыБелгисиз жазуу" - -var kyScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x001e, 0x001e, 0x001e, - 0x002e, 0x002e, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0044, 0x0044, 0x0058, - 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0062, 0x0062, - 0x006e, 0x006e, 0x006e, 0x006e, 0x0076, 0x0086, 0x0094, 0x009c, - 0x00a8, 0x00b0, 0x00b0, 0x00c4, 0x00db, 0x00db, 0x00e5, 0x00f5, - 0x00f5, 0x00f5, 0x011e, 0x011e, 0x011e, 0x011e, 0x0128, 0x0128, - // Entry 40 - 7F - 0x0132, 0x0132, 0x0132, 0x0142, 0x0142, 0x014a, 0x014a, 0x0158, - 0x0162, 0x0162, 0x0162, 0x0162, 0x0168, 0x0168, 0x0168, 0x0172, - 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, - 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, 0x0172, - 0x0184, 0x0184, 0x0190, 0x0190, 0x0190, 0x0190, 0x0190, 0x019e, - 0x019e, 0x019e, 0x019e, 0x019e, 0x019e, 0x019e, 0x019e, 0x019e, - 0x019e, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - // Entry 80 - BF - 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, - 0x01a8, 0x01a8, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, - 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01c0, 0x01c0, - 0x01c0, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01d2, 0x01d8, 0x01e2, - 0x01e2, 0x01e2, 0x01e2, 0x01e2, 0x01e2, 0x01e2, 0x01e2, 0x01e2, - 0x01e2, 0x01e2, 0x0207, 0x0217, 0x0227, 0x023b, 0x0245, 0x0260, -} // Size: 376 bytes - -const loScriptStr string = "" + // Size: 3937 bytes - "ອັບຟາກາອາຣາບິກອິມພີຮຽນ ອາເມອິກອາເມນຽນອະເວສຕະບາລີບາມູມບັດຊາບາຕັກເບັງກາບລິ" + - "ກຊິມໂບລສຈູ້ອິນພຮາຫມີເບຣວບູກິສບູຮິດຊາກມາສັນຍາລັກຊົນເຜົ່າພື້ນເມືອງແຄນນາດ" + - "າຄາເຮຍຈາມເຊໂຮກີເຊີຮຄອບຕິກໄຊເປຍຊີຣິວລິກເຊຮັດສລາ ໂວນິກຊີຮິກລິກໂບຮານດີວານ" + - "າກາຣີເດເຊເຮຊົວເລດັບໂລຍັນດີໂມຕິກອີຍິບເຮຍຮາຕິກອີຍິບເຮຍໂຮກລິຟອີຍິບອີທິໂອປ" + - "ິກຄອດຊູຮີຈໍເຈຍຈໍຈຽນກລາໂກລິຕິກໂກຮິກເຄນທາກຣີກຈູຈາຣາທີກົວມູຄີຮັນຮັນກູນຮານ" + - "ຮານູໂນໂອຈີນ (ແບບງ່າຍ)ຈີນ (ດັ້ງເດີມ)ຮີບຣິວຣິຣະງະນະອັກລຮະອານາໂຕເລຍປາເຮາເ" + - "ມັງຕາຕາລາງພະຍາງພາສາຍີ່ປຸ່ນຮັງກາຮີໂບຮານອິນດັດອີຕາລີໂບຮານຈາໂມຈາວາຍີ່ປຸ່ນ" + - "ຈູຮເຊັນຄຍາຄະຕະກະນະຂໍໂຮກສີຂະແມຄໍຈຄີຄັນນາດາເກົາຫຼີເປລເລກາຍຕິລ້ານນາລາວລາຕ" + - "ິນ-ຟຮັ່ງເຕຣລາຕິນ-ແກລິກລາຕິນເລຊາລິມບູລີເນຍລີເນຍຣເຟຣເຊຮໂລມາໄລເຊຍລີເດຍແມນ" + - "ດຽນມານິແຊນມາຍາໄຮໂຮກລິບເມນເດເຄເລີຊີເມໂຮອິຕິກເມໂຮຕິກມາເລຢາລາມມົງໂກນມູນເມ" + - "ໂຮເມເທມາເຍກມຽນມາອາຮະເບຍເໜືອໂບຮານນາບາທາທຽນກີບາ-ນາຊີເອັນໂກນຸຊຸອອກຄອນໂອຊິ" + - "ກິອອກສມັນຍາໂອເດຍພາລໄມຮິນເພີມີໂບຮານຟາກສ-ປາປະຫລາວີອິນສຄິບຊັນແນລປະຫລາວີຊອ" + - "ດເຕຮ໌ປະຫລາວີບຸກຟີນິເຊຍສັດຕະສາດພໍຮລາພາຮ໌ເທຍອິນສຄຮິປຊັນແນລເຮຈັງຮອງໂກຮອງໂ" + - "ກຮູນິກຊາມາເລຍຊາຮາຕິອາລະເບຍໃຕ້ໂບຮານໂສຮັດຕຣະໄຊນ໌ໄຮຕີ້ງຊອວຽນຊາຮາດາດຸດາວາດ" + - "ີສິນຫາລາໂສຮາສົມເປັງຊຸນດາຊີໂລຕິນາກຣີຊີເຮຍຊີເຮຍເອສທຮານຈີໂລຊີເຮຍຕາເວັນຕົກ" + - "ຊີເຮຍຕາເວັນອອກຕັກບັນວາທາຄຮີໄທເລໄທລື້ໃໝ່ທາມິລຕັນກັນໄທຫວຽດເທລູກູເທງກວາຮທ" + - "ີຟີນາກຕາກາລອກທານາໄທທິເບທັນເທຮຸທາຍູກາຮິດໄວຄຳເວົ້າທີ່ເບີ່ງເຫັນໄດ້ວາຮັງກສ" + - "ິຕິໂອລີເອເປຮເຊຍໂບຮານອັກສອນຮູບປລີ່ມສຸເມເຮຍ-ອັດຄາເດຍຍີອິນເຮຮິດເຄື່ອງໝາຍທ" + - "າງຄະນິດສາດອີໂມຈິສັນຍາລັກບໍ່ມີພາສາຂຽນສາມັນແບບຂຽນທີ່ບໍ່ຮູ້ຈັກ" - -var loScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0015, 0x0015, 0x0015, 0x002a, 0x0058, 0x006d, - 0x0082, 0x008e, 0x009d, 0x00ac, 0x00bb, 0x00cd, 0x00cd, 0x00ee, - 0x0100, 0x0112, 0x011e, 0x012d, 0x013c, 0x014b, 0x01ab, 0x01ba, - 0x01c3, 0x01d5, 0x01e1, 0x01f3, 0x0202, 0x021a, 0x0269, 0x0287, - 0x0299, 0x02c0, 0x02e4, 0x030b, 0x0335, 0x0335, 0x0350, 0x0374, - 0x0383, 0x03a1, 0x03b0, 0x03bf, 0x03cb, 0x03e3, 0x03f8, 0x0401, - 0x0413, 0x041c, 0x0434, 0x0455, 0x0479, 0x0479, 0x048b, 0x04a3, - 0x04d0, 0x04eb, 0x0530, 0x0554, 0x0566, 0x0587, 0x0593, 0x059f, - // Entry 40 - 7F - 0x05b4, 0x05c9, 0x05d2, 0x05ea, 0x05ff, 0x060b, 0x061a, 0x062f, - 0x0644, 0x0653, 0x0662, 0x0674, 0x067d, 0x06a5, 0x06c4, 0x06d3, - 0x06df, 0x06ee, 0x06fd, 0x070f, 0x0721, 0x072d, 0x073c, 0x074b, - 0x074b, 0x075d, 0x0772, 0x0772, 0x0796, 0x07a5, 0x07d5, 0x07ea, - 0x0805, 0x0805, 0x0817, 0x0820, 0x082c, 0x0847, 0x0847, 0x0856, - 0x0886, 0x08a1, 0x08a1, 0x08ba, 0x08cc, 0x08d8, 0x08ea, 0x08fc, - 0x0917, 0x0926, 0x0926, 0x0926, 0x093e, 0x093e, 0x095c, 0x096f, - 0x09ab, 0x09d5, 0x09f3, 0x0a08, 0x0a2f, 0x0a6e, 0x0a7d, 0x0a9b, - // Entry 80 - BF - 0x0aaa, 0x0abf, 0x0ad1, 0x0afe, 0x0b16, 0x0b34, 0x0b43, 0x0b55, - 0x0b55, 0x0b6d, 0x0b82, 0x0ba3, 0x0bb2, 0x0bd3, 0x0be2, 0x0c12, - 0x0c3c, 0x0c66, 0x0c7e, 0x0c8d, 0x0c99, 0x0cb1, 0x0cc0, 0x0cd2, - 0x0ce4, 0x0cf6, 0x0d0b, 0x0d20, 0x0d35, 0x0d41, 0x0d47, 0x0d5c, - 0x0d6e, 0x0d83, 0x0d89, 0x0dcb, 0x0de9, 0x0dfb, 0x0e1c, 0x0e74, - 0x0e7a, 0x0e92, 0x0ece, 0x0ee0, 0x0ef8, 0x0f1c, 0x0f2b, 0x0f61, -} // Size: 376 bytes - -const ltScriptStr string = "" + // Size: 1663 bytes - "AfakaKaukazo Albanijosarabųimperinė aramaikųarmėnųavestanoBaliečiųBamumB" + - "assa Vahbatakbengalų„Bliss“ simboliaibopomofobrahmibrailiobuginezųbuhidč" + - "akmasuvienodinti Kanados aborigenų silabiniaikariųčamčerokiųkirtkoptųkip" + - "rokirilicasenoji bažnytinė slavų kirilicadevanagarideseretasDuplojė sten" + - "ografijaEgipto liaudiesEgipto žyniųegipto hieroglifaiElbasanoetiopųgruzi" + - "nų kutsurigruzinųglagolitikgotųGrantagraikųgudžaratųgurmukihanbųhangulha" + - "nhanunosupaprastinti hantradiciniai hanhebrajųhiraganaAnatolijaus hierog" + - "lifaipahav hmongkatakana / hiraganasenasis vengrųindussenasis italųJamo " + - "simboliaijaviečiųjaponųJurchenkajah likatakanakaroštikhmerųKhojkikanadųk" + - "orėjiečiųKpelųkaithilanalaosiečiųfraktur lotynųgėlų lotynųlotynųlepčalim" + - "bulinijiniai Alinijiniai BFraserLomalicianlidianMahadžanimandėjųmaničųma" + - "lų hieroglifaiMendeMerojitų rankraštinismeroitikmalajaliųModimongolųmūnM" + - "romeitei majekbirmiečiųSenasis šiaurės arabųNabatėjųNaxi GebaenkoNüshuog" + - "hamol čikiorkonorijųosmanųPalmirosPau Cin Hausenieji permėspagsa parašyt" + - "iniai pahlavipselter pahlavibuk pahvalifoenikųpolard fonetinėrašytiniai " + - "partųrejangrongorongorunųsamariečiųsaratisenoji pietų Arabijossauraštraž" + - "enklų raštasšaviųŠaradosSiddhamKhudawadisinhalųSora Sompengsundųsyloti n" + - "agrisirųestrangelo siriečiųvakarų sirųrytų sirųtagbanvaTakritai lenaujas" + - "is Tailando luetamilųTanguttai vettelugųtengvartifinagtagalogųhanatajųti" + - "betiečiųTirhutaugaritikvaimatoma kalbaVarang KshitiWoleaisenieji persųŠu" + - "mero Akado dantiraštisjipaveldėtasmatematiniai simboliaijaustukaisimboli" + - "ųneparašytabendrinežinomi rašmenys" - -var ltScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x0016, 0x0016, 0x001c, 0x002f, 0x0037, - 0x003f, 0x0049, 0x004e, 0x0057, 0x005c, 0x0064, 0x0064, 0x0079, - 0x0081, 0x0087, 0x008e, 0x0097, 0x009c, 0x00a2, 0x00cc, 0x00d2, - 0x00d6, 0x00df, 0x00e3, 0x00e9, 0x00ee, 0x00f6, 0x0118, 0x0122, - 0x012b, 0x0140, 0x014f, 0x015d, 0x016f, 0x0177, 0x017e, 0x018e, - 0x0196, 0x01a0, 0x01a5, 0x01ab, 0x01b2, 0x01bd, 0x01c4, 0x01ca, - 0x01d0, 0x01d3, 0x01d9, 0x01ea, 0x01f9, 0x01f9, 0x0201, 0x0209, - 0x0220, 0x022b, 0x023e, 0x024d, 0x0252, 0x0260, 0x026e, 0x0278, - // Entry 40 - 7F - 0x027f, 0x0286, 0x028e, 0x0296, 0x029e, 0x02a5, 0x02ab, 0x02b2, - 0x02bf, 0x02c5, 0x02cb, 0x02cf, 0x02da, 0x02e9, 0x02f7, 0x02fe, - 0x0304, 0x0309, 0x0315, 0x0321, 0x0327, 0x032b, 0x0331, 0x0337, - 0x0341, 0x034a, 0x0352, 0x0352, 0x0363, 0x0368, 0x037f, 0x0387, - 0x0391, 0x0395, 0x039d, 0x03a1, 0x03a4, 0x03b0, 0x03b0, 0x03bb, - 0x03d3, 0x03dd, 0x03dd, 0x03e6, 0x03ea, 0x03f0, 0x03f5, 0x03fd, - 0x0402, 0x0408, 0x0408, 0x040f, 0x0417, 0x0422, 0x0431, 0x0439, - 0x044c, 0x045b, 0x0466, 0x046e, 0x047e, 0x0490, 0x0496, 0x04a0, - // Entry 80 - BF - 0x04a5, 0x04b1, 0x04b7, 0x04cd, 0x04d7, 0x04e7, 0x04ee, 0x04f6, - 0x04fd, 0x0506, 0x050e, 0x051a, 0x0520, 0x052c, 0x0531, 0x0546, - 0x0553, 0x055e, 0x0566, 0x056b, 0x0571, 0x0586, 0x058d, 0x0593, - 0x059a, 0x05a1, 0x05a8, 0x05af, 0x05b8, 0x05bc, 0x05c1, 0x05cd, - 0x05d4, 0x05dc, 0x05df, 0x05eb, 0x05f8, 0x05fe, 0x060c, 0x0626, - 0x0628, 0x0633, 0x0649, 0x0652, 0x065b, 0x0666, 0x066c, 0x067f, -} // Size: 376 bytes - -const lvScriptStr string = "" + // Size: 794 bytes - "arābuaramiešuarmēņubaliešubengāļubopomofobrahmiBraila rakstsirokēzukoptu" + - "kirilicasenslāvudevānagāridemotiskais rakstshierātiskais rakstsēģiptiešu" + - " hieroglifietiopiešugruzīnugotugrieķugudžaratupandžabuķīniešu hanbhangil" + - "aķīniešuhanu vienkāršotāhanu tradicionālāivritshiraganakatakana vai hira" + - "ganasenungāruvecitāļudžamojaviešujapāņukatakanakhmerukannadukorejiešulao" + - "siešulatīņulineārā Alineārā BlīdiešumaijumalajalumongoļuMūna rakstsbirmi" + - "ešuogamiskais rakstsorijuosmaņu turkufeniķiešurongorongorūnu rakstssamar" + - "iešusingāļuzundusīriešurietumsīriešuaustrumsīriešutamilutelugutagalutaan" + - "atajutibetiešusenperiešušumeru-akadiešu ķīļrakstsjimantotāmatemātiskais " + - "pierakstsemocijzīmessimbolibez rakstībasvispārējānezināma rakstība" - -var lvScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000f, 0x0017, - 0x0017, 0x001f, 0x001f, 0x001f, 0x001f, 0x0028, 0x0028, 0x0028, - 0x0030, 0x0036, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, - 0x0043, 0x004b, 0x004b, 0x0050, 0x0050, 0x0058, 0x0061, 0x006d, - 0x006d, 0x006d, 0x007f, 0x0093, 0x00aa, 0x00aa, 0x00b4, 0x00b4, - 0x00bc, 0x00bc, 0x00c0, 0x00c0, 0x00c7, 0x00d1, 0x00da, 0x00e9, - 0x00f0, 0x00fa, 0x00fa, 0x010d, 0x0120, 0x0120, 0x0126, 0x012e, - 0x012e, 0x012e, 0x0143, 0x014d, 0x014d, 0x0157, 0x015d, 0x0165, - // Entry 40 - 7F - 0x016d, 0x016d, 0x016d, 0x0175, 0x0175, 0x017b, 0x017b, 0x0182, - 0x018c, 0x018c, 0x018c, 0x018c, 0x0195, 0x0195, 0x0195, 0x019d, - 0x019d, 0x019d, 0x01a8, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01bc, - 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01c1, 0x01c1, 0x01c1, 0x01c1, - 0x01c9, 0x01c9, 0x01d1, 0x01dd, 0x01dd, 0x01dd, 0x01dd, 0x01e6, - 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01f7, 0x01f7, - 0x01f7, 0x01fc, 0x01fc, 0x0209, 0x0209, 0x0209, 0x0209, 0x0209, - 0x0209, 0x0209, 0x0209, 0x0214, 0x0214, 0x0214, 0x0214, 0x021e, - // Entry 80 - BF - 0x022a, 0x0234, 0x0234, 0x0234, 0x0234, 0x0234, 0x0234, 0x0234, - 0x0234, 0x0234, 0x023d, 0x023d, 0x0242, 0x0242, 0x024b, 0x024b, - 0x025a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x0270, 0x0270, - 0x0270, 0x0276, 0x0276, 0x0276, 0x027c, 0x0281, 0x0285, 0x028f, - 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x029a, 0x02b8, - 0x02ba, 0x02c2, 0x02da, 0x02e6, 0x02ed, 0x02fb, 0x0307, 0x031a, -} // Size: 376 bytes - -const mkScriptStr string = "" + // Size: 3531 bytes - "афакакавкаскоалбанскиарапско писмоцарскоарамејскиерменско писмоавестанск" + - "обалискобамумскобасабатачкобенгалско писмоблиссимболибопомофобрамибрајо" + - "во писмобугискобухидскочакманскоканадско слоговнокарискочамскочерокиско" + - "кирткоптскокипарскокирилско писмостарословенска кирилицадеванагаридезер" + - "етскоДиплојеево стенографскоегипетско демотскоегипетско хиератскоегипет" + - "ски хиероглифиелбасанскоетиопско писмогрузиски хуцуригрузиско писмоглаг" + - "олицаготскогрантагрчко писмогуџаратигурмукиханбхангулханско писмохануно" + - "овскопоедноставено ханско писмотрадиционално ханскохебрејско писмохираг" + - "анаанадолски хиероглифипахауанско хмоншкојапонско слоговностароунгарско" + - "харапскостароиталскоџамојаванскојапонско писмоџурченскокаја ликатаканак" + - "ароштикмерско писмохоџкиканнадакорејско писмокпелскокајтилансколаошко п" + - "исмофрактурна латиницагелска латиницалатинично писмолепчансколимбулинеа" + - "рно Алинеарно БФрејзероволомсколикисколидискомахаџанимандејскоманихејск" + - "омајански хиероглифимендскомероитско ракописномероитскомалајаламско пис" + - "момодимонголско писмоМуновомромејтејскомјанмарско писмостаросеверноарап" + - "сконабатејсконасиска гебанконишуогамол чикистаротурскооријанско писмосо" + - "малископалмирскоПаучинхауовостаропермскопагспанатписно средноперсископс" + - "алтирско средноперсискокнижевно староперсискофеникискоПолардовонатписно" + - " партискореџаншкоронгоронгорунскосамарјанскосаратистаројужноарапскосаура" + - "штранскознаковно пишувањеШоовошарадасидамкудабадисинхалско писмосоранг " + - "сомпенгсунданскосилхетско нагарисирискоестрангелско сирискозападносирис" + - "коисточносирискотагбанванскотакритај леново тај луетамилско писмотангут" + - "скотај вјеттелугутенгвартифинагтагалошкотанатајландско писмотибетско пи" + - "смотирхутаугаритсковајвидлив говорваранг кшитиволеајскостароперсискосум" + - "ероакадско клинестојинаследеноматематичка нотацијаемоџисимболибез писмо" + - "општонепознато писмо" - -var mkScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000a, 0x002a, 0x002a, 0x0043, 0x0061, 0x007c, - 0x0090, 0x009e, 0x00ae, 0x00b6, 0x00c4, 0x00e1, 0x00e1, 0x00f7, - 0x0107, 0x0111, 0x012a, 0x0138, 0x0148, 0x015a, 0x017b, 0x0189, - 0x0195, 0x01a7, 0x01af, 0x01bd, 0x01cd, 0x01e8, 0x0215, 0x0229, - 0x023d, 0x026a, 0x028d, 0x02b2, 0x02d9, 0x02ed, 0x0308, 0x0325, - 0x0340, 0x0352, 0x035e, 0x036a, 0x037f, 0x038f, 0x039d, 0x03a5, - 0x03b1, 0x03c8, 0x03de, 0x0410, 0x0437, 0x0437, 0x0454, 0x0464, - 0x048b, 0x04ae, 0x04cf, 0x04e9, 0x04f9, 0x0511, 0x0519, 0x0529, - // Entry 40 - 7F - 0x0544, 0x0556, 0x0563, 0x0573, 0x0581, 0x059a, 0x05a4, 0x05b2, - 0x05cd, 0x05db, 0x05e5, 0x05f1, 0x0608, 0x062b, 0x0648, 0x0665, - 0x0677, 0x0681, 0x0694, 0x06a7, 0x06bb, 0x06c7, 0x06d5, 0x06e3, - 0x06f3, 0x0705, 0x0719, 0x0719, 0x073e, 0x074c, 0x0771, 0x0783, - 0x07a6, 0x07ae, 0x07cb, 0x07d7, 0x07dd, 0x07ef, 0x07ef, 0x080e, - 0x0834, 0x0848, 0x0848, 0x085f, 0x0865, 0x086d, 0x0875, 0x0882, - 0x0898, 0x08b5, 0x08b5, 0x08c7, 0x08d9, 0x08f1, 0x0909, 0x0915, - 0x0942, 0x0973, 0x099e, 0x09b0, 0x09c2, 0x09e3, 0x09f3, 0x0a07, - // Entry 80 - BF - 0x0a13, 0x0a29, 0x0a35, 0x0a57, 0x0a71, 0x0a92, 0x0a9c, 0x0aa8, - 0x0ab2, 0x0ac2, 0x0adf, 0x0afa, 0x0b0c, 0x0b2b, 0x0b39, 0x0b60, - 0x0b7c, 0x0b98, 0x0bb0, 0x0bba, 0x0bc5, 0x0bdb, 0x0bf6, 0x0c08, - 0x0c17, 0x0c23, 0x0c31, 0x0c3f, 0x0c51, 0x0c59, 0x0c78, 0x0c93, - 0x0ca1, 0x0cb3, 0x0cb9, 0x0cd0, 0x0ce7, 0x0cf9, 0x0d13, 0x0d3e, - 0x0d42, 0x0d54, 0x0d7b, 0x0d85, 0x0d93, 0x0da4, 0x0dae, 0x0dcb, -} // Size: 376 bytes - -const mlScriptStr string = "" + // Size: 3513 bytes - "അറബിക്അർമിഅർമേനിയൻഅവെസ്ഥൻബാലിനീസ്ബട്ടക്ബംഗാളിബ്ലിസ് ചിത്ര ലിപിബോപ്പോമോഫോ" + - "ബ്രാഹ്മിബ്രെയ്\u200cലിബുഗിനീസ്ബുഹിഡ്ചകംഏകീകൃത കനേഡിയൻ ഗോത്രലിപിചരിയൻഛം" + - "ചെറോക്കിചിർത്ത്കോപ്റ്റിക്സൈപ്രിയോട്ട്സിറിലിക്പുരാതന ചർച്ച് സ്ലവോണിക് സ" + - "ിറിലിക്ദേവനാഗരിഡെസെർട്ട്ഈജിപ്ഷ്യൻ ഡിമോട്ടിക്ഈജിപ്ഷ്യൻ ഹിരാറ്റിക്ഈജിപ്ഷ" + - "്യൻ ചിത്രലിപിഎത്യോപിക്ജോർജ്ജിയൻ ഖുട്സുരിജോർജ്ജിയൻഗ്ലഗോലിറ്റിക്ഗോഥിക്ഗ്" + - "രീക്ക്ഗുജറാത്തിഗുരുമുഖിഹൻബ്ഹാംഗുൽഹാൻഹനുനൂലളിതവൽക്കരിച്ച ഹാൻപരമ്പരാഗത ഹ" + - "ാൻഹീബ്രുഹിരഗാനപഹ്വാ ഹമോംഗ്ജാപ്പനീസ് സില്ലബറീസ്പുരാതന ഹംഗേറിയൻസിന്ധുപഴയ" + - " ഇറ്റാലിയൻജാമോജാവനീസ്ജാപ്പനീസ്കയാ ലികറ്റക്കാനഖരോഷ്ടിഖമെർകന്നഡകൊറിയൻക്തില" + - "ന്നലാവോഫ്രാക്ടുർ ലാറ്റിൻഗെയ്\u200cലിക് ലാറ്റിൻലാറ്റിൻലെപ്ചലിംബുസമരേഖയി" + - "ലുള്ള എലീനിയർ ബിലൈസിൻലൈഡിയൻമൻഡേയൻമണിചേയൻമായൻ ചിത്രലിപിമെറോയിറ്റിക്മലയാ" + - "ളംമംഗോളിയൻമൂൺമേറ്റി മായക്മ്യാൻമാർഎൻകോഒഖാംഒൽ ചിക്കിഒർഖോൺഒഡിയഒസ്\u200cമാ" + - "നിയപുരാതന പെർമിക്ഫഗസ് പഎഴുത്തു പഹൽവിസാൾട്ടർ പഹൽവിപഹൽവി ലിപിഫിനീഷ്യൻപൊള" + - "്ളാർഡ് ശബ്ദലിപിപൃതിറെജാംഗ്റൊംഗോറൊംഗോറുണിക്സമരിയസരതിസൗരാഷ്ട്രചിഹ്നലിപിഷ" + - "ാവിയൻസിംഹളസന്താനീസ്സൈലോതി നാഗരിസിറിയക്ക്എസ്റ്റ്രാംഗ്ലോ സിറിയക്പശ്ചിമസു" + - "റിയാനികിഴക്കൻ സിറിയക്തഗ്ബൻവാതായ് ലേപുതിയ തായ് ല്യൂതമിഴ്ത്വട്തെലുങ്ക്തെ" + - "ംഗ്വർതിഫിനാഗ്തഗലോഗ്ഥാനതായ്ടിബറ്റൻഉഗ്രൈറ്റിക്വൈദൃശ്യഭാഷപഴയ പേർഷ്യൻസുമേറ" + - "ോ അക്കാഡിയൻ ക്യുണിഫോംയിപാരമ്പര്യമായഗണിത രൂപംഇമോജിചിഹ്നങ്ങൾഎഴുതപ്പെടാത്" + - "തത്സാധാരണഅജ്ഞാത ലിപി" - -var mlScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x001e, 0x0036, - 0x004b, 0x0063, 0x0063, 0x0063, 0x0075, 0x0087, 0x0087, 0x00b6, - 0x00d4, 0x00ec, 0x0107, 0x011f, 0x0131, 0x013a, 0x017e, 0x018d, - 0x0193, 0x01ab, 0x01c0, 0x01de, 0x0202, 0x021a, 0x0274, 0x028c, - 0x02a7, 0x02a7, 0x02e1, 0x031b, 0x0352, 0x0352, 0x036d, 0x03a1, - 0x03bc, 0x03e3, 0x03f5, 0x03f5, 0x040d, 0x0428, 0x0440, 0x044c, - 0x045e, 0x0467, 0x0476, 0x04aa, 0x04cf, 0x04cf, 0x04e1, 0x04f3, - 0x04f3, 0x0515, 0x054f, 0x057a, 0x058c, 0x05b1, 0x05bd, 0x05d2, - // Entry 40 - 7F - 0x05ed, 0x05ed, 0x05fd, 0x0618, 0x062d, 0x0639, 0x0639, 0x0648, - 0x065a, 0x065a, 0x0666, 0x0672, 0x067e, 0x06af, 0x06e0, 0x06f5, - 0x0704, 0x0713, 0x073b, 0x0754, 0x0754, 0x0754, 0x0763, 0x0775, - 0x0775, 0x0787, 0x079c, 0x079c, 0x07c4, 0x07c4, 0x07c4, 0x07e8, - 0x07fa, 0x07fa, 0x0812, 0x081b, 0x081b, 0x083d, 0x083d, 0x0855, - 0x0855, 0x0855, 0x0855, 0x0855, 0x0861, 0x0861, 0x086d, 0x0886, - 0x0895, 0x08a1, 0x08a1, 0x08bc, 0x08bc, 0x08bc, 0x08e4, 0x08f4, - 0x0919, 0x093e, 0x095a, 0x0972, 0x09a6, 0x09b2, 0x09c7, 0x09e5, - // Entry 80 - BF - 0x09f7, 0x0a06, 0x0a12, 0x0a12, 0x0a2d, 0x0a48, 0x0a5a, 0x0a5a, - 0x0a5a, 0x0a5a, 0x0a69, 0x0a69, 0x0a84, 0x0aa6, 0x0ac1, 0x0b01, - 0x0b2b, 0x0b56, 0x0b6b, 0x0b6b, 0x0b7e, 0x0ba7, 0x0bb6, 0x0bb6, - 0x0bc5, 0x0bdd, 0x0bf2, 0x0c0a, 0x0c1c, 0x0c25, 0x0c31, 0x0c46, - 0x0c46, 0x0c67, 0x0c6d, 0x0c85, 0x0c85, 0x0c85, 0x0ca4, 0x0cee, - 0x0cf4, 0x0d18, 0x0d31, 0x0d40, 0x0d5b, 0x0d88, 0x0d9a, 0x0db9, -} // Size: 376 bytes - -const mnScriptStr string = "" + // Size: 666 bytes - "арабарменибенгалвопомофобрайлкириллдеванагариэтиопгүржгрекгүжаратигурмук" + - "хиханбхангулханхялбаршуулсан ханзуламжлалт ханзеврейхираганаяпон хэлний" + - " үеийн цагаан толгойжамояпонкатаканакхмерканнадасолонгослаослатинмалаяла" + - "ммонгол бичигмьянмарориясинхалатамилтэлүгүтанатайтөвдматематик тооллын " + - "системэможитэмдэгбичигдээгүйнийтлэгтодорхойгүй бичиг" - -var mnScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0020, 0x0020, 0x0020, - 0x0030, 0x0030, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x0046, 0x0046, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x0064, 0x0064, - 0x006c, 0x006c, 0x006c, 0x006c, 0x0074, 0x0084, 0x0094, 0x009c, - 0x00a8, 0x00ae, 0x00ae, 0x00d1, 0x00ec, 0x00ec, 0x00f6, 0x0106, - 0x0106, 0x0106, 0x0140, 0x0140, 0x0140, 0x0140, 0x0148, 0x0148, - // Entry 40 - 7F - 0x0150, 0x0150, 0x0150, 0x0160, 0x0160, 0x016a, 0x016a, 0x0178, - 0x0188, 0x0188, 0x0188, 0x0188, 0x0190, 0x0190, 0x0190, 0x019a, - 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, - 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, - 0x01aa, 0x01aa, 0x01c1, 0x01c1, 0x01c1, 0x01c1, 0x01c1, 0x01cf, - 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, - 0x01cf, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, - 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, - // Entry 80 - BF - 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, - 0x01d7, 0x01d7, 0x01e5, 0x01e5, 0x01e5, 0x01e5, 0x01e5, 0x01e5, - 0x01e5, 0x01e5, 0x01e5, 0x01e5, 0x01e5, 0x01e5, 0x01ef, 0x01ef, - 0x01ef, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x0203, 0x0209, 0x0211, - 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, - 0x0211, 0x0211, 0x023f, 0x0249, 0x0255, 0x026b, 0x0279, 0x029a, -} // Size: 376 bytes - -const mrScriptStr string = "" + // Size: 3418 bytes - "अरबीइम्पिरियल आर्मेनिकअर्मेनियनअवेस्तानबालीबटाकबंगालीब्लिसिम्बॉल्सबोपोमो" + - "फोब्रह्मीब्रेलबूगीबुहिदचकमायूनिफाइड कॅनेडियन अ\u200dॅबोरिदनल सिलॅबिक्स" + - "कॅरियनचामचेरोकीकिर्थकॉप्टिकसायप्रिऑटसीरिलिकपुरातन चर्च स्लाव्होनिक सिर" + - "िलिकदेवनागरीडेसर्टइजिप्शियन डेमोटिकइजिप्शियन हायरेटिकइजिप्शियन हायरोग्" + - "लिफ्सईथिओपिकजॉर्जियन खुत्सुरीजॉर्जियनग्लॅगोलिटिकगोथिकग्रीकगुजरातीगुरुम" + - "ुखीहान्बहंगुलहानहनुनूसरलीकृत हानपारंपारिक हानहिब्रूहिरागानापहाउ मंगजाप" + - "ानी स्वरलिपीपुरातन हंगेरियनसिन्धुजुनी इटालिकजामोजावानीसजपानीकायाह लीकॅ" + - "टाकानाखारोश्थीख्मेरकन्नडकोरियनकाइथीलानालाओफ्रॅक्तुर लॅटिनगाएलिक लेटिनल" + - "ॅटिनलेपचालिम्बूलीनियार अलीनियर बीलायशियानलायडियानमान्डायीनमानीचायीनमाय" + - "ान हाइरोग्लिफ्समेरोइटिकमल्याळममंगोलियनमूनमेइतेइ मायेकम्यानमारएन्‘कोओघा" + - "मओल चिकिओर्खोनउडियाउस्मानियापुरातन पर्मिकफाग्स-पाइन्स्क्रिप्शनल पाहलवी" + - "सॉल्टर पाहलवीबुक पाहलवीफोनिशियनपोलार्ड फोनेटिकइन्स्क्रिप्शनल पर्थियनरी" + - "जांगरोन्गोरोन्गोरूनिकसमरिटानसरातीसौराष्ट्रसंकेत लिपीशॅव्हियनसिंहलासूदा" + - "नीसिलोती नागरीसिरीयाकएस्त्ट्रेन्जेलो सिरियाकपश्चिमी सिरियाकपूर्वी सिरि" + - "याकतगोआन्वाताई लीनवीन ताई लूतामिळताई विएततेलगुतेन्गवारतिफिनाघटागालोगथा" + - "नाथाईतिबेटीयुगारिटिकवाईदृश्य संवादपुरातन फारसीदृश्यमान भाषायीवंशपरंपरा" + - "गतगणितीय संकेतलिपीइमोजीप्रतीकअलिखितसामान्यअज्ञात लिपी" - -var mrScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x0040, 0x005b, - 0x0073, 0x007f, 0x007f, 0x007f, 0x008b, 0x009d, 0x009d, 0x00c4, - 0x00dc, 0x00f1, 0x0100, 0x010c, 0x011b, 0x0127, 0x0193, 0x01a5, - 0x01ae, 0x01c0, 0x01cf, 0x01e4, 0x01ff, 0x0214, 0x026b, 0x0283, - 0x0295, 0x0295, 0x02c6, 0x02fa, 0x033a, 0x033a, 0x034f, 0x0380, - 0x0398, 0x03b9, 0x03c8, 0x03c8, 0x03d7, 0x03ec, 0x0404, 0x0413, - 0x0422, 0x042b, 0x043a, 0x0459, 0x047e, 0x047e, 0x0490, 0x04a8, - 0x04a8, 0x04be, 0x04e9, 0x0514, 0x0526, 0x0545, 0x0551, 0x0566, - // Entry 40 - 7F - 0x0575, 0x0575, 0x058b, 0x05a3, 0x05bb, 0x05ca, 0x05ca, 0x05d9, - 0x05eb, 0x05eb, 0x05fa, 0x0606, 0x060f, 0x063a, 0x065c, 0x066b, - 0x067a, 0x068c, 0x06a5, 0x06be, 0x06be, 0x06be, 0x06d6, 0x06ee, - 0x06ee, 0x0709, 0x0724, 0x0724, 0x0758, 0x0758, 0x0758, 0x0770, - 0x0785, 0x0785, 0x079d, 0x07a6, 0x07a6, 0x07c8, 0x07c8, 0x07e0, - 0x07e0, 0x07e0, 0x07e0, 0x07e0, 0x07f2, 0x07f2, 0x07fe, 0x0811, - 0x0823, 0x0832, 0x0832, 0x084d, 0x084d, 0x084d, 0x0872, 0x0888, - 0x08c5, 0x08ea, 0x0906, 0x091e, 0x0949, 0x0989, 0x099b, 0x09bf, - // Entry 80 - BF - 0x09ce, 0x09e3, 0x09f2, 0x09f2, 0x0a0d, 0x0a29, 0x0a41, 0x0a41, - 0x0a41, 0x0a41, 0x0a53, 0x0a53, 0x0a65, 0x0a87, 0x0a9c, 0x0adf, - 0x0b0a, 0x0b32, 0x0b4a, 0x0b4a, 0x0b5a, 0x0b77, 0x0b86, 0x0b86, - 0x0b9c, 0x0bab, 0x0bc3, 0x0bd8, 0x0bed, 0x0bf9, 0x0c02, 0x0c14, - 0x0c14, 0x0c2f, 0x0c38, 0x0c57, 0x0c57, 0x0c57, 0x0c79, 0x0c9e, - 0x0ca4, 0x0cc5, 0x0cf3, 0x0d02, 0x0d14, 0x0d26, 0x0d3b, 0x0d5a, -} // Size: 376 bytes - -const msScriptStr string = "" + // Size: 342 bytes - "ArabArmeniaBaliBamuBenggalaBopomofoBrailleCansCyrilDevanagariEthiopiaGeo" + - "rgiaGreekGujaratGurmukhiHanbHangulHanHan RingkasHan TradisionalIbraniHir" + - "aganaEjaan sukuan JepunJamoJepunKatakanaKhmerKannadaKoreaLaoLatinMalayal" + - "amMongoliaMyammarOriyaSinhalaTamilTeluguThaanaThaiTibetTatatanda matemat" + - "ikEmojiSimbolTidak ditulisLazimTulisan Tidak Diketahui" - -var msScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0004, 0x000b, - 0x000b, 0x000f, 0x0013, 0x0013, 0x0013, 0x001b, 0x001b, 0x001b, - 0x0023, 0x0023, 0x002a, 0x002a, 0x002a, 0x002a, 0x002e, 0x002e, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x0033, 0x0033, 0x003d, - 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x0045, 0x0045, - 0x004c, 0x004c, 0x004c, 0x004c, 0x0051, 0x0058, 0x0060, 0x0064, - 0x006a, 0x006d, 0x006d, 0x0078, 0x0087, 0x0087, 0x008d, 0x0095, - 0x0095, 0x0095, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00ab, 0x00ab, - // Entry 40 - 7F - 0x00b0, 0x00b0, 0x00b0, 0x00b8, 0x00b8, 0x00bd, 0x00bd, 0x00c4, - 0x00c9, 0x00c9, 0x00c9, 0x00c9, 0x00cc, 0x00cc, 0x00cc, 0x00d1, - 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, - 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, - 0x00da, 0x00da, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e9, - 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, - 0x00e9, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, - 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, - // Entry 80 - BF - 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, - 0x00ee, 0x00ee, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, - 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00fa, 0x00fa, - 0x00fa, 0x0100, 0x0100, 0x0100, 0x0100, 0x0106, 0x010a, 0x010f, - 0x010f, 0x010f, 0x010f, 0x010f, 0x010f, 0x010f, 0x010f, 0x010f, - 0x010f, 0x010f, 0x0122, 0x0127, 0x012d, 0x013a, 0x013f, 0x0156, -} // Size: 376 bytes - -const myScriptStr string = "" + // Size: 1241 bytes - "အာရေဗျအာမေးနီးယားဘင်္ဂါလီဘိုပိုဗြဟ္မမီဘရေစစ်ရိလစ်ဒီဗနာဂရီအီသီယိုးပီးယားဂ" + - "ျော်ဂျီယာဂရိဂုဂျာရသီဂူရူဟန်ဘ်ဟန်ဂူးလ်ဟန်ဟန် ရိုးရှင်းဟန် ရိုးရာဟီဗရူးဟ" + - "ီရဂနဂျပန် အက္ခရာဂျမိုဂျာဗားနီးစ်ဂျပန်ကယားလီခတခနခမာခန္နာဒါကိုရီးယားလာအိ" + - "ုလက်တင်မာလာယာလမ်မွန်ဂိုလီးယားမြန်မာအိုရာဆင်ဟာလတိုင်လီတမီးလ်တီလုတဂလော့ဂ" + - "်သာအ်ထိုင်းတိဘက်မြင်နိုင်သော စကားပါရှန် အဟောင်းရီဂဏန်းသင်္ချာအီမိုဂျီသ" + - "င်္ကေတမရေးထားသောအများနှင့်သက်ဆိုင်သောမသိ သို့မဟုတ် မရှိသော စကားလုံး" - -var myScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0012, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x004b, 0x004b, 0x004b, - 0x005d, 0x0072, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x0093, 0x0093, 0x00ab, - 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00d5, 0x00d5, - 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00fc, 0x0114, 0x0120, 0x012f, - 0x0147, 0x0150, 0x0150, 0x0175, 0x0191, 0x0191, 0x01a3, 0x01b2, - 0x01b2, 0x01b2, 0x01d4, 0x01d4, 0x01d4, 0x01d4, 0x01e3, 0x0204, - // Entry 40 - 7F - 0x0213, 0x0213, 0x0225, 0x0231, 0x0231, 0x023a, 0x023a, 0x024f, - 0x026a, 0x026a, 0x026a, 0x026a, 0x0279, 0x0279, 0x0279, 0x028b, - 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, - 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, - 0x02a6, 0x02a6, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02cd, 0x02df, - 0x02df, 0x02df, 0x02df, 0x02df, 0x02df, 0x02df, 0x02df, 0x02df, - 0x02df, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, - 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, - // Entry 80 - BF - 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, 0x02ee, - 0x02ee, 0x02ee, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, - 0x0300, 0x0300, 0x0300, 0x0300, 0x0315, 0x0315, 0x0327, 0x0327, - 0x0327, 0x0333, 0x0333, 0x0333, 0x034b, 0x0357, 0x0369, 0x0378, - 0x0378, 0x0378, 0x0378, 0x03a9, 0x03a9, 0x03a9, 0x03d1, 0x03d1, - 0x03d7, 0x03d7, 0x03fb, 0x0413, 0x0428, 0x0446, 0x0485, 0x04d9, -} // Size: 376 bytes - -const neScriptStr string = "" + // Size: 3039 bytes - "अरबीआर्मीआर्मेनियालीआभेस्टानबालीबाटकबङ्गालीब्लिजसिम्बोल्सबोपोमोफोब्राह्म" + - "ीब्रेलबुगिनिजबुहिदकाक्म्कारियनचामचेरोकीकिर्थकप्टिककप्रियटसिरिलिकदेवाना" + - "गरीडेसेरेटइजिप्टियन डेमोटिकइजिप्टियन हाइरटिकइजिप्टियन हाइरोग्लिफ्सइथिय" + - "ोपिकग्रुजियाली खुट्सुरीजर्जियालीग्लागोलिटिकगोथिकग्रीकगुजरातीगुरूमुखीहा" + - "न्बहान्गुलहानहानुनुसरलिकृत चिनीपरम्परागत चिनीहिब्रुहिरागनापहावह हमोङ्ग" + - "काताकाना वा हिरागानापुरानो हङ्गेरियालीइन्दुसपुरानो इटालिकजामोजाभानीजाप" + - "ानीकायाहलीकाताकानाखारोस्थितिखमेरकान्नाडाकोरियनक्थीलान्नालाओफ्राक्टुर ल" + - "्याटिनग्यालिक ल्याटिनल्याटिनलेप्चालिम्बुलाइसियनलाइडियनमान्डाएनमानिकाएन" + - "माया हाइरोग्लिफ्समेरियोटिकमलायालममङ्गोलजूनमाइटेइ मायेकम्यान्मारएन्कोओघ" + - "ामओलचिकीओर्खोनओडियाओस्मान्यापुरानो पर्मिकफाग्स-पाफ्लिफ्ल्पबुक पहल्भीफो" + - "निसियनपोल्लार्ड फोनेटिकपिआरटीरेजाङरोङ्गोरोङ्गोरूनिकसमारिटनसारतीसौराष्ट" + - "्रसाइनराइटिङशाभियनसिन्हालास्ल्योटी नाग्रीसिरियाकइस्ट्रेनजेलो सिरियाकपश" + - "्चिमी सिरियाकपूर्वी सिरियाकटाग्वान्वाटाइलेन्यू टाइ लुइतामिलटाभ्टतेलुगु" + - "टेङ्वारटिफिनाघटागालोगथानाथाईतिब्बतीयुगारिटिकभाइदृश्यमय वाणीपुरानो पर्स" + - "ियनयीइन्हेरिटेडZmthZsyeप्रतीकहरूनलेखिएकोसाझाअज्ञात लिपि" - -var neScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x001b, 0x003c, - 0x0054, 0x0060, 0x0060, 0x0060, 0x006c, 0x0081, 0x0081, 0x00ab, - 0x00c3, 0x00db, 0x00ea, 0x00ff, 0x010e, 0x0120, 0x0120, 0x0132, - 0x013b, 0x014d, 0x015c, 0x016e, 0x0183, 0x0198, 0x0198, 0x01b3, - 0x01c8, 0x01c8, 0x01f9, 0x022a, 0x026a, 0x026a, 0x0282, 0x02b9, - 0x02d4, 0x02f5, 0x0304, 0x0304, 0x0313, 0x0328, 0x0340, 0x034f, - 0x0364, 0x036d, 0x037f, 0x03a1, 0x03c9, 0x03c9, 0x03db, 0x03f0, - 0x03f0, 0x0412, 0x044a, 0x047e, 0x0490, 0x04b5, 0x04c1, 0x04d3, - // Entry 40 - 7F - 0x04e5, 0x04e5, 0x04fa, 0x0512, 0x0530, 0x053c, 0x053c, 0x0554, - 0x0566, 0x0566, 0x0572, 0x0584, 0x058d, 0x05be, 0x05e9, 0x05fe, - 0x0610, 0x0622, 0x0622, 0x0622, 0x0622, 0x0622, 0x0637, 0x064c, - 0x064c, 0x0664, 0x067c, 0x067c, 0x06ad, 0x06ad, 0x06ad, 0x06c8, - 0x06dd, 0x06dd, 0x06ef, 0x06f8, 0x06f8, 0x071a, 0x071a, 0x0735, - 0x0735, 0x0735, 0x0735, 0x0735, 0x0744, 0x0744, 0x0750, 0x0762, - 0x0774, 0x0783, 0x0783, 0x079e, 0x079e, 0x079e, 0x07c3, 0x07d9, - 0x07e5, 0x07f4, 0x0810, 0x0828, 0x0859, 0x086b, 0x087a, 0x089e, - // Entry 80 - BF - 0x08ad, 0x08c2, 0x08d1, 0x08d1, 0x08ec, 0x090a, 0x091c, 0x091c, - 0x091c, 0x091c, 0x0934, 0x0934, 0x0934, 0x095f, 0x0974, 0x09ae, - 0x09d9, 0x0a01, 0x0a1f, 0x0a1f, 0x0a2e, 0x0a4e, 0x0a5d, 0x0a5d, - 0x0a6c, 0x0a7e, 0x0a93, 0x0aa8, 0x0abd, 0x0ac9, 0x0ad2, 0x0ae7, - 0x0ae7, 0x0b02, 0x0b0b, 0x0b2d, 0x0b2d, 0x0b2d, 0x0b55, 0x0b55, - 0x0b5b, 0x0b79, 0x0b7d, 0x0b81, 0x0b9c, 0x0bb4, 0x0bc0, 0x0bdf, -} // Size: 376 bytes - -const nlScriptStr string = "" + // Size: 1678 bytes - "AdlamDefakaKaukasisch AlbaneesAhomArabischKeizerlijk ArameesArmeensAvest" + - "aansBalineesBamounBassa VahBatakBengaalsBhaiksukiBlissymbolenBopomofoBra" + - "hmiBrailleBugineesBuhidChakmaVerenigde Canadese Aboriginal-symbolenCaris" + - "chChamCherokeeCirthKoptischCyprischCyrillischOudkerkslavisch CyrillischD" + - "evanagariDeseretDuployan snelschriftEgyptisch demotischEgyptisch hiërati" + - "schEgyptische hiërogliefenElbasanEthiopischGeorgisch KhutsuriGeorgischGl" + - "agolitischGothischGranthaGrieksGujaratiGurmukhiHanbHangulHanHanunooveree" + - "nvoudigd Chineestraditioneel ChineesHatranHebreeuwsHiraganaAnatolische h" + - "iërogliefenPahawh HmongKatakana of HiraganaOudhongaarsIndusOud-italischJ" + - "amoJavaansJapansJurchenKayah LiKatakanaKharoshthiKhmerKhojkiKannadaKorea" + - "ansKpelleKaithiLannaLaotiaansGotisch LatijnsGaelisch LatijnsLatijnsLepch" + - "aLimbuLineair ALineair BFraserLomaLycischLydischMahajaniMandaeansManiche" + - "aansMarchenMayahiërogliefenMendeMeroitisch cursiefMeroïtischMalayalamMod" + - "iMongoolsMoonMroMeiteiMultaniBirmaansOud Noord-ArabischNabateaansNewariN" + - "axi GebaN’KoNüshuOghamOl ChikiOrkhonOdiaOsageOsmanyaPalmyreensPau Cin Ha" + - "uOudpermischPhags-paInscriptioneel PahlaviPsalmen PahlaviBoek PahlaviFoe" + - "nicischPollard-fonetischInscriptioneel ParthischRejangRongorongoRunicSam" + - "aritaansSaratiOud Zuid-ArabischSaurashtraSignWritingShavianSharadaSiddha" + - "mSindhiSingaleesSora SompengSoendaneesSyloti NagriSyriacEstrangelo Arame" + - "esWest-ArameesOost-ArameesTagbanwaTakriTai LeNieuw Tai LueTamilTangutTai" + - " VietTeluguTengwarTifinaghTagalogThaanaThaiTibetaansTirhutaUgaritischVai" + - "Zichtbare spraakVarang KshitiWoleaiOudperzischSumero-Akkadian CuneiformY" + - "iOvergeërfdWiskundige notatieemojiSymbolenongeschrevenalgemeenonbekend s" + - "chriftsysteem" - -var nlScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0005, 0x000b, 0x001e, 0x0022, 0x002a, 0x003c, 0x0043, - 0x004c, 0x0054, 0x005a, 0x0063, 0x0068, 0x0070, 0x0079, 0x0085, - 0x008d, 0x0093, 0x009a, 0x00a2, 0x00a7, 0x00ad, 0x00d3, 0x00da, - 0x00de, 0x00e6, 0x00eb, 0x00f3, 0x00fb, 0x0105, 0x011f, 0x0129, - 0x0130, 0x0144, 0x0157, 0x016c, 0x0184, 0x018b, 0x0195, 0x01a7, - 0x01b0, 0x01bc, 0x01c4, 0x01cb, 0x01d1, 0x01d9, 0x01e1, 0x01e5, - 0x01eb, 0x01ee, 0x01f5, 0x020a, 0x021e, 0x0224, 0x022d, 0x0235, - 0x024e, 0x025a, 0x026e, 0x0279, 0x027e, 0x028a, 0x028e, 0x0295, - // Entry 40 - 7F - 0x029b, 0x02a2, 0x02aa, 0x02b2, 0x02bc, 0x02c1, 0x02c7, 0x02ce, - 0x02d6, 0x02dc, 0x02e2, 0x02e7, 0x02f0, 0x02ff, 0x030f, 0x0316, - 0x031c, 0x0321, 0x032a, 0x0333, 0x0339, 0x033d, 0x0344, 0x034b, - 0x0353, 0x035c, 0x0367, 0x036e, 0x037f, 0x0384, 0x0396, 0x03a1, - 0x03aa, 0x03ae, 0x03b6, 0x03ba, 0x03bd, 0x03c3, 0x03ca, 0x03d2, - 0x03e4, 0x03ee, 0x03f4, 0x03fd, 0x0403, 0x0409, 0x040e, 0x0416, - 0x041c, 0x0420, 0x0425, 0x042c, 0x0436, 0x0441, 0x044c, 0x0454, - 0x046a, 0x0479, 0x0485, 0x048f, 0x04a0, 0x04b8, 0x04be, 0x04c8, - // Entry 80 - BF - 0x04cd, 0x04d8, 0x04de, 0x04ef, 0x04f9, 0x0504, 0x050b, 0x0512, - 0x0519, 0x051f, 0x0528, 0x0534, 0x053e, 0x054a, 0x0550, 0x0562, - 0x056e, 0x057a, 0x0582, 0x0587, 0x058d, 0x059a, 0x059f, 0x05a5, - 0x05ad, 0x05b3, 0x05ba, 0x05c2, 0x05c9, 0x05cf, 0x05d3, 0x05dc, - 0x05e3, 0x05ed, 0x05f0, 0x0600, 0x060d, 0x0613, 0x061e, 0x0637, - 0x0639, 0x0644, 0x0656, 0x065b, 0x0663, 0x066f, 0x0677, 0x068e, -} // Size: 376 bytes - -const noScriptStr string = "" + // Size: 1603 bytes - "afakakaukasus-albanskahomarabiskarameiskarmenskavestiskbalinesiskbamumba" + - "ssa vahbatakbengalskblissymbolbopomofobrahmibraillebuginesiskbuhidchakma" + - "felles kanadiske urspråksstavelserkariskchamcherokeecirthkoptiskkyprioti" + - "skkyrilliskkirkeslavisk kyrilliskdevanagarideseretduployan stenografiegy" + - "ptisk demotiskegyptisk hieratiskegyptiske hieroglyferelbasisketiopiskgeo" + - "rgisk khutsurigeorgiskglagolittiskgotiskgammeltamilskgreskgujaratigurmuk" + - "hihanbhangulhanhanunooforenklet hantradisjonell hanhatransk armenskhebra" + - "iskhiraganaanatoliske hieroglyferpahawh hmongjapanske stavelsesskrifterg" + - "ammelungarskindusgammelitaliskjamojavanesiskjapanskjurchenkayah likataka" + - "nakharoshthikhmerkhojkikannadakoreanskkpellekaithisklannalaotiskfrakturl" + - "atinskgælisk latinsklatinsklepchalimbulineær Alineær Bfraserlomalykiskly" + - "diskmahajanimandaiskmanikeiskmaya-hieroglyfermendemeroitisk kursivmeroit" + - "iskmalayalammodimongolskmoonmromeitei-mayekmultanimyanmargammelnordarabi" + - "sknabataeansknaxi geban’konüshuoghamol-chikiorkhonoriyaosmanyapalmyrensk" + - "pau cin haugammelpermiskphags-painskripsjonspahlavipsalter pahlavipahlav" + - "ifønikiskpollard-fonetiskinskripsjonsparthiskrejangrongorongorunersamari" + - "tansksaratigammelsørarabisksaurashtrategnskriftshavisksharadasiddhamkhud" + - "awadisinhalasora sompengsundanesisksyloti nagrisyriskestrangelosyriakisk" + - "vestlig syriakiskøstlig syriakisktagbanwatakritai leny tai luetamilsktan" + - "guttai viettelugutengwartifinaghtagalogthaanathaitibetansktirhutaugariti" + - "skvaisynlig talevarang kshitiwoleaigammelpersisksumersk-akkadisk kileskr" + - "iftyinedarvetmatematisk notasjonzsyesymbolerspråk uten skriftfellesukjen" + - "t skrift" - -var noScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x0015, 0x0019, 0x0020, 0x0028, 0x002f, - 0x0037, 0x0041, 0x0046, 0x004f, 0x0054, 0x005c, 0x005c, 0x0066, - 0x006e, 0x0074, 0x007b, 0x0085, 0x008a, 0x0090, 0x00b3, 0x00b9, - 0x00bd, 0x00c5, 0x00ca, 0x00d1, 0x00db, 0x00e4, 0x00fa, 0x0104, - 0x010b, 0x011e, 0x012f, 0x0141, 0x0156, 0x015e, 0x0166, 0x0177, - 0x017f, 0x018b, 0x0191, 0x019e, 0x01a3, 0x01ab, 0x01b3, 0x01b7, - 0x01bd, 0x01c0, 0x01c7, 0x01d4, 0x01e4, 0x01f4, 0x01fc, 0x0204, - 0x021a, 0x0226, 0x0240, 0x024d, 0x0252, 0x025f, 0x0263, 0x026d, - // Entry 40 - 7F - 0x0274, 0x027b, 0x0283, 0x028b, 0x0295, 0x029a, 0x02a0, 0x02a7, - 0x02af, 0x02b5, 0x02bd, 0x02c2, 0x02c9, 0x02d7, 0x02e6, 0x02ed, - 0x02f3, 0x02f8, 0x0301, 0x030a, 0x0310, 0x0314, 0x031a, 0x0320, - 0x0328, 0x0330, 0x0339, 0x0339, 0x0349, 0x034e, 0x035e, 0x0367, - 0x0370, 0x0374, 0x037c, 0x0380, 0x0383, 0x038f, 0x0396, 0x039d, - 0x03ae, 0x03b9, 0x03b9, 0x03c2, 0x03c8, 0x03ce, 0x03d3, 0x03db, - 0x03e1, 0x03e6, 0x03e6, 0x03ed, 0x03f7, 0x0402, 0x040f, 0x0417, - 0x042a, 0x0439, 0x0440, 0x0449, 0x0459, 0x046d, 0x0473, 0x047d, - // Entry 80 - BF - 0x0482, 0x048d, 0x0493, 0x04a4, 0x04ae, 0x04b8, 0x04bf, 0x04c6, - 0x04cd, 0x04d6, 0x04dd, 0x04e9, 0x04f4, 0x0500, 0x0506, 0x0519, - 0x052a, 0x053b, 0x0543, 0x0548, 0x054e, 0x0558, 0x055f, 0x0565, - 0x056d, 0x0573, 0x057a, 0x0582, 0x0589, 0x058f, 0x0593, 0x059c, - 0x05a3, 0x05ac, 0x05af, 0x05ba, 0x05c7, 0x05cd, 0x05da, 0x05f5, - 0x05f7, 0x05ff, 0x0612, 0x0616, 0x061e, 0x0630, 0x0636, 0x0643, -} // Size: 376 bytes - -const paScriptStr string = "" + // Size: 828 bytes - "ਅਰਬੀਅਰਮੀਨੀਆਈਬੰਗਾਲੀਬੋਪੋਮੋਫੋਬਰੇਲਸਿਰੀਲਿਕਦੇਵਨਾਗਰੀਇਥੀਓਪਿਕਜਾਰਜੀਆਈਯੂਨਾਨੀਗੁਜਰਾਤੀ" + - "ਗੁਰਮੁਖੀਹਾਂਬਹੰਗੁਲਹਾਨਸਰਲ ਹਾਨਰਵਾਇਤੀ ਹਾਨਹਿਬਰੂਹਿਰਾਗਾਨਾਜਾਪਾਨੀ ਸਿਲੇਬਰੀਜ਼ਜਾਮੋਜ" + - "ਪਾਨੀਕਾਟਾਕਾਨਾਖਮੇਰਕੰਨੜਕੋਰੀਆਈਲਾਓਲਾਤੀਨੀਮਲਿਆਲਮਮੰਗੋਲੀਅਨਮਿਆਂਮਾਰਉੜੀਆਸਿੰਹਾਲਾਤਮਿ" + - "ਲਤੇਲਗੂਥਾਨਾਥਾਈਤਿੱਬਤੀਗਣਿਤ ਚਿੰਨ੍ਹ-ਲਿਪੀਇਮੋਜੀਚਿੰਨ੍ਹਅਲਿਖਤਸਧਾਰਨਅਣਪਛਾਤੀ ਲਿਪੀ" - -var paScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x0024, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0036, 0x0036, 0x0036, - 0x004e, 0x004e, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x006f, 0x006f, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x009c, 0x009c, - 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00c3, 0x00d8, 0x00ed, 0x00f9, - 0x0108, 0x0111, 0x0111, 0x0124, 0x0140, 0x0140, 0x014f, 0x0167, - 0x0167, 0x0167, 0x0195, 0x0195, 0x0195, 0x0195, 0x01a1, 0x01a1, - // Entry 40 - 7F - 0x01b0, 0x01b0, 0x01b0, 0x01c8, 0x01c8, 0x01d4, 0x01d4, 0x01e0, - 0x01f2, 0x01f2, 0x01f2, 0x01f2, 0x01fb, 0x01fb, 0x01fb, 0x020d, - 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, - 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, - 0x021f, 0x021f, 0x0237, 0x0237, 0x0237, 0x0237, 0x0237, 0x024c, - 0x024c, 0x024c, 0x024c, 0x024c, 0x024c, 0x024c, 0x024c, 0x024c, - 0x024c, 0x0258, 0x0258, 0x0258, 0x0258, 0x0258, 0x0258, 0x0258, - 0x0258, 0x0258, 0x0258, 0x0258, 0x0258, 0x0258, 0x0258, 0x0258, - // Entry 80 - BF - 0x0258, 0x0258, 0x0258, 0x0258, 0x0258, 0x0258, 0x0258, 0x0258, - 0x0258, 0x0258, 0x026d, 0x026d, 0x026d, 0x026d, 0x026d, 0x026d, - 0x026d, 0x026d, 0x026d, 0x026d, 0x026d, 0x026d, 0x0279, 0x0279, - 0x0279, 0x0288, 0x0288, 0x0288, 0x0288, 0x0294, 0x029d, 0x02af, - 0x02af, 0x02af, 0x02af, 0x02af, 0x02af, 0x02af, 0x02af, 0x02af, - 0x02af, 0x02af, 0x02db, 0x02ea, 0x02fc, 0x030b, 0x031a, 0x033c, -} // Size: 376 bytes - -const plScriptStr string = "" + // Size: 1489 bytes - "arabskiearmiormiańskieawestyjskiebalijskiebamunbatakbengalskiesymbole Bl" + - "issabopomofobrahmiBraille’abugińskiebuhidchakmazunifikowane symbole kana" + - "dyjskich autochtonówkaryjskieczamskieczirokeskicirthkoptyjskiecypryjskie" + - "cyrylicacyrylica staro-cerkiewno-słowiańskadewanagarideseretegipskie dem" + - "otyczneegipskie hieratycznehieroglify egipskieetiopskiegruzińskie chucur" + - "igruzińskiegłagolicagotyckiegreckiegudźarackiegurmukhihanbhangylhanhanun" + - "oouproszczone hantradycyjne hanhebrajskiehiraganapahawh hmongsylabariusz" + - "e japońskiestarowęgierskieindusstarowłoskiejamojawajskiejapońskiekayah l" + - "ikatakanacharostikhmerskiekannadakoreańskiekaithilannalaotańskiełaciński" + - " - frakturałaciński - odmiana gaelickałacińskielepchalimbulinearne Aline" + - "arne Blikijskielidyjskiemandejskiemanichejskiehieroglify Majówmeroickiem" + - "alajalammongolskieMoon’ameitei mayekbirmańskien’kooghamol chikiorchoński" + - "eorijaosmanyastaropermskiephags-painskrypcyjne pahlawipahlawi psałterzow" + - "ypahlawi książkowyfenickifonetyczny Pollard’apartyjski inskrypcyjnyrejan" + - "grongorongorunicznesamarytańskisaratisaurashtrapismo znakoweshawasyngale" + - "skiesundajskiesyloti nagrisyryjskisyriacki estrangelosyryjski (odmiana z" + - "achodnia)syryjski (odmiana wschodnia)tagbanwatai lenowy tai luetamilskie" + - "tai viettelugutengwartifinagh (berberski)tagalogthaanatajskietybetańskie" + - "ugaryckievaiVisible Speechstaroperskieklinowe sumero-akadyjskieyidziedzi" + - "czonenotacja matematycznaEmojisymbolejęzyk bez systemu pismawspólneniezn" + - "any skrypt" - -var plScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x000c, 0x0017, - 0x0022, 0x002b, 0x0030, 0x0030, 0x0035, 0x003f, 0x003f, 0x004d, - 0x0055, 0x005b, 0x0066, 0x0070, 0x0075, 0x007b, 0x00a9, 0x00b2, - 0x00ba, 0x00c4, 0x00c9, 0x00d3, 0x00dd, 0x00e5, 0x010a, 0x0114, - 0x011b, 0x011b, 0x012e, 0x0142, 0x0155, 0x0155, 0x015e, 0x0171, - 0x017c, 0x0186, 0x018e, 0x018e, 0x0195, 0x01a1, 0x01a9, 0x01ad, - 0x01b3, 0x01b6, 0x01bd, 0x01cc, 0x01da, 0x01da, 0x01e4, 0x01ec, - 0x01ec, 0x01f8, 0x020f, 0x021f, 0x0224, 0x0231, 0x0235, 0x023e, - // Entry 40 - 7F - 0x0248, 0x0248, 0x0250, 0x0258, 0x0260, 0x0269, 0x0269, 0x0270, - 0x027b, 0x027b, 0x0281, 0x0286, 0x0291, 0x02a6, 0x02c3, 0x02ce, - 0x02d4, 0x02d9, 0x02e3, 0x02ed, 0x02ed, 0x02ed, 0x02f6, 0x02ff, - 0x02ff, 0x0309, 0x0315, 0x0315, 0x0326, 0x0326, 0x0326, 0x032f, - 0x0338, 0x0338, 0x0342, 0x034a, 0x034a, 0x0356, 0x0356, 0x0361, - 0x0361, 0x0361, 0x0361, 0x0361, 0x0367, 0x0367, 0x036c, 0x0374, - 0x037f, 0x0384, 0x0384, 0x038b, 0x038b, 0x038b, 0x0398, 0x03a0, - 0x03b4, 0x03c8, 0x03db, 0x03e2, 0x03f8, 0x040e, 0x0414, 0x041e, - // Entry 80 - BF - 0x0426, 0x0433, 0x0439, 0x0439, 0x0443, 0x0450, 0x0455, 0x0455, - 0x0455, 0x0455, 0x0460, 0x0460, 0x046a, 0x0476, 0x047e, 0x0491, - 0x04ad, 0x04c9, 0x04d1, 0x04d1, 0x04d7, 0x04e3, 0x04ec, 0x04ec, - 0x04f4, 0x04fa, 0x0501, 0x0515, 0x051c, 0x0522, 0x0529, 0x0535, - 0x0535, 0x053e, 0x0541, 0x054f, 0x054f, 0x054f, 0x055b, 0x0574, - 0x0576, 0x0582, 0x0596, 0x059b, 0x05a2, 0x05ba, 0x05c2, 0x05d1, -} // Size: 376 bytes - -const ptScriptStr string = "" + // Size: 1282 bytes - "árabearmiarmênioavésticobalinêsbamumbataquebengalisímbolos blissbopomofo" + - "brahmibraillebuginêsbuhidcakmescrita silábica unificada dos aborígenes c" + - "anadensescarianochamcherokeecirthcópticocipriotacirílicocirílico eslavo " + - "eclesiásticodevanágarideseretdemótico egípciohierático egípciohieróglifo" + - "s egípciosetiópicokhutsuri georgianogeorgianoglagolíticogóticogregogujer" + - "atigurmuquihanbhangulhanhanunoohan simplificadohan tradicionalhebraicohi" + - "raganapahawh hmongsilabários japoneseshúngaro antigoindoitálico antigoja" + - "mojavanêsjaponêskayah likatakanakharoshthikhmerkannadacoreanokthilannala" + - "olatim frakturlatim gaélicolatimlepchalimbulinear Alinear Blisulíciolídi" + - "omandaicomaniqueanohieróglifos maiasmeroítico cursivomeroíticomalaialamo" + - "ngolmoonmeitei mayekbirmanêsn’koogâmicool chikiorkhonoriyaosmaniapérmico" + - " antigophags-paphliphlppahlavi antigofeníciofonético pollardprtirejangro" + - "ngorongorúnicosamaritanosaratisaurashtrasignwritingshavianocingalêssunda" + - "nêssyloti nagrisiríacosiríaco estrangelosiríaco ocidentalsiríaco orienta" + - "ltagbanwatai Lenovo tai luetâmiltavttélugotengwartifinaghtagalothaanatai" + - "landêstibetanougaríticovaivisible speechpersa antigosumério-acadiano cun" + - "eiformeyiherdadonotação matemáticaEmojizsymágrafocomumescrita desconheci" + - "da" - -var ptScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000a, 0x0012, - 0x001b, 0x0023, 0x0028, 0x0028, 0x002f, 0x0036, 0x0036, 0x0045, - 0x004d, 0x0053, 0x005a, 0x0062, 0x0067, 0x006b, 0x00a1, 0x00a8, - 0x00ac, 0x00b4, 0x00b9, 0x00c1, 0x00c9, 0x00d2, 0x00f0, 0x00fb, - 0x0102, 0x0102, 0x0114, 0x0127, 0x013d, 0x013d, 0x0146, 0x0158, - 0x0161, 0x016d, 0x0174, 0x0174, 0x0179, 0x0181, 0x0189, 0x018d, - 0x0193, 0x0196, 0x019d, 0x01ad, 0x01bc, 0x01bc, 0x01c4, 0x01cc, - 0x01cc, 0x01d8, 0x01ed, 0x01fc, 0x0200, 0x020f, 0x0213, 0x021b, - // Entry 40 - 7F - 0x0223, 0x0223, 0x022b, 0x0233, 0x023d, 0x0242, 0x0242, 0x0249, - 0x0250, 0x0250, 0x0254, 0x0259, 0x025c, 0x0269, 0x0277, 0x027c, - 0x0282, 0x0287, 0x028f, 0x0297, 0x029b, 0x029b, 0x02a1, 0x02a7, - 0x02a7, 0x02af, 0x02b9, 0x02b9, 0x02cb, 0x02cb, 0x02dd, 0x02e7, - 0x02ef, 0x02ef, 0x02f5, 0x02f9, 0x02f9, 0x0305, 0x0305, 0x030e, - 0x030e, 0x030e, 0x030e, 0x030e, 0x0314, 0x0314, 0x031c, 0x0324, - 0x032a, 0x032f, 0x032f, 0x0336, 0x0336, 0x0336, 0x0345, 0x034d, - 0x0351, 0x0355, 0x0363, 0x036b, 0x037c, 0x0380, 0x0386, 0x0390, - // Entry 80 - BF - 0x0397, 0x03a1, 0x03a7, 0x03a7, 0x03b1, 0x03bc, 0x03c4, 0x03c4, - 0x03c4, 0x03c4, 0x03cd, 0x03cd, 0x03d6, 0x03e2, 0x03ea, 0x03fd, - 0x040f, 0x0420, 0x0428, 0x0428, 0x042e, 0x043a, 0x0440, 0x0440, - 0x0444, 0x044b, 0x0452, 0x045a, 0x0460, 0x0466, 0x0470, 0x0478, - 0x0478, 0x0482, 0x0485, 0x0493, 0x0493, 0x0493, 0x049f, 0x04bb, - 0x04bd, 0x04c4, 0x04d9, 0x04de, 0x04e2, 0x04e9, 0x04ee, 0x0502, -} // Size: 376 bytes - -const ptPTScriptStr string = "" + // Size: 108 bytes - "arménioegípcio demóticoegípcio hieráticoguzerateindussiloti nagritai let" + - "eluguemojisímbolosnão escrito" - -var ptPTScriptIdx = []uint16{ // 174 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0008, 0x0008, 0x001a, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x003a, 0x003a, 0x003a, 0x003a, - // Entry 40 - 7F - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - // Entry 80 - BF - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x0046, 0x0046, 0x0046, - 0x0046, 0x0046, 0x0046, 0x0046, 0x004c, 0x004c, 0x004c, 0x004c, - 0x004c, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0057, 0x0060, 0x006c, -} // Size: 372 bytes - -const roScriptStr string = "" + // Size: 858 bytes - "arabăarmeanăbalinezăbengalezăbopomofobraillesilabică aborigenă canadiană" + - " unificatăcoptăcipriotăchirilicăchirilică slavonă bisericească vechedeva" + - "nagarimormonădemotică egipteanăhieratică egipteanăhieroglife egipteneeti" + - "opianăgeorgiană bisericeascăgeorgianăglagoliticăgoticăgreacăgujaratigurm" + - "ukhihanbhangulhanhan simplificatăhan tradiționalăebraicăhiraganakatakana" + - " sau hiraganamaghiară vecheindusitalică vechejamojavanezăjaponezăkatakan" + - "akhmerăkannadacoreeanălaoțianălatină Frakturlatină gaelicălatinălineară " + - "Alineară Blidianăhieroglife mayamalayalammongolăbirmanăoriyafenicianărun" + - "icăsingalezăsiriacăsiriacă occidentalăsiriacă orientalătamilăteluguberbe" + - "răthaanathailandezătibetanăpersană vechecuneiformă sumero-akkadianămoște" + - "nitănotație matematicăemojisimbolurinescrisăcomunăscriere necunoscută" - -var roScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x000e, - 0x000e, 0x0017, 0x0017, 0x0017, 0x0017, 0x0021, 0x0021, 0x0021, - 0x0029, 0x0029, 0x0030, 0x0030, 0x0030, 0x0030, 0x005a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x0060, 0x0069, 0x0073, 0x009a, 0x00a4, - 0x00ac, 0x00ac, 0x00c0, 0x00d5, 0x00e8, 0x00e8, 0x00f2, 0x010a, - 0x0114, 0x0120, 0x0127, 0x0127, 0x012e, 0x0136, 0x013e, 0x0142, - 0x0148, 0x014b, 0x014b, 0x015c, 0x016e, 0x016e, 0x0176, 0x017e, - 0x017e, 0x017e, 0x0193, 0x01a2, 0x01a7, 0x01b5, 0x01b9, 0x01c2, - // Entry 40 - 7F - 0x01cb, 0x01cb, 0x01cb, 0x01d3, 0x01d3, 0x01da, 0x01da, 0x01e1, - 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01f4, 0x0203, 0x0213, 0x021a, - 0x021a, 0x021a, 0x0224, 0x022e, 0x022e, 0x022e, 0x022e, 0x0236, - 0x0236, 0x0236, 0x0236, 0x0236, 0x0245, 0x0245, 0x0245, 0x0245, - 0x024e, 0x024e, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x025e, - 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, - 0x025e, 0x0263, 0x0263, 0x0263, 0x0263, 0x0263, 0x0263, 0x0263, - 0x0263, 0x0263, 0x0263, 0x026d, 0x026d, 0x026d, 0x026d, 0x026d, - // Entry 80 - BF - 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, - 0x0274, 0x0274, 0x027e, 0x027e, 0x027e, 0x027e, 0x0286, 0x0286, - 0x029b, 0x02ae, 0x02ae, 0x02ae, 0x02ae, 0x02ae, 0x02b5, 0x02b5, - 0x02b5, 0x02bb, 0x02bb, 0x02c3, 0x02c3, 0x02c9, 0x02d5, 0x02de, - 0x02de, 0x02de, 0x02de, 0x02de, 0x02de, 0x02de, 0x02ec, 0x0309, - 0x0309, 0x0314, 0x0328, 0x032d, 0x0336, 0x033f, 0x0346, 0x035a, -} // Size: 376 bytes - -const ruScriptStr string = "" + // Size: 3416 bytes - "афакаарабицаарамейскаяармянскаяавестийскаябалийскаябамумбасса (вах)батак" + - "скаябенгальскаяблиссимволикабопомофобрахмиБрайлябугинизийскаябухидчакми" + - "йскаяканадское слоговое письмокарийскаячамскаячерокикирткоптскаякипрска" + - "якириллицастарославянскаядеванагаридезеретдуплоянская скорописьегипетск" + - "ая демотическаяегипетская иератическаяегипетская иероглифическаяэфиопск" + - "аягрузинская хуцуригрузинскаяглаголицаготскаягрантхагреческаягуджаратиг" + - "урмукхиханьбхангылькитайскаяханунуупрощенная китайскаятрадиционная кита" + - "йскаяеврейскаяхираганалувийские иероглифыпахау хмонгкатакана или хирага" + - "настаровенгерскаяхараппская (письменность долины Инда)староитальянскаяд" + - "жамояванскаяяпонскаячжурчжэньскаякайакатаканакхароштхикхмерскаяходжикик" + - "аннадакорейскаякпеллекайтхиланналаосскаялатинская фрактурагэльская лати" + - "нскаялатиницалепхалимбулинейное письмо Алинейное письмо Блисуломалициан" + - "лидийскаямандейскаяманихейскаямайямендемероитская курсивнаямероитскаяма" + - "лаяламмонгольскаяазбука мунамроманипуримьянманскаясеверноаравийскоенаба" + - "тейскаянаси гебанконюй-шуогамическаяол чикиорхоно-енисейскаяорияосманск" + - "аяпальмирыдревнепермскаяпагспапехлевийскаяпахлави псалтирнаяпахлави кни" + - "жнаяфиникийскаяполлардовская фонетикапарфянскаяреджангскаяронго-ронгору" + - "ническаясамаритянскаясаратистароюжноарабскаясаураштраязык знаковалфавит" + - " Шоушарадакхудавадисингальскаясора-сонпенгсунданскаясилоти нагрисирийска" + - "ясирийская эстрангелозападносирийскаявосточно-сирийскаятагбанватакритай" + - "ский леновый тайский летамильскаятангутское менятай-вьеттелугутенгварск" + - "аядревнеливийскаятагалогтанатайскаятибетскаятирхутаугаритскаявайскаявид" + - "имая речьваранг-кшитиволеаистароперсидскаяшумеро-аккадская клинописьиун" + - "аследованнаяматематические обозначенияэмодзисимволыбесписьменныйобщепри" + - "нятаянеизвестная письменность" - -var ruScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000a, 0x000a, 0x000a, 0x0018, 0x002c, 0x003e, - 0x0054, 0x0066, 0x0070, 0x0083, 0x0095, 0x00ab, 0x00ab, 0x00c5, - 0x00d5, 0x00e1, 0x00ed, 0x0107, 0x0111, 0x0125, 0x0155, 0x0167, - 0x0175, 0x0181, 0x0189, 0x0199, 0x01a9, 0x01bb, 0x01d9, 0x01ed, - 0x01fb, 0x0224, 0x0251, 0x027e, 0x02b1, 0x02b1, 0x02c3, 0x02e4, - 0x02f8, 0x030a, 0x0318, 0x0326, 0x0338, 0x034a, 0x035a, 0x0364, - 0x0372, 0x0384, 0x0390, 0x03b7, 0x03e2, 0x03e2, 0x03f4, 0x0404, - 0x0429, 0x043e, 0x0466, 0x0484, 0x04c9, 0x04e9, 0x04f3, 0x0503, - // Entry 40 - 7F - 0x0513, 0x052d, 0x0535, 0x0545, 0x0557, 0x0569, 0x0577, 0x0585, - 0x0597, 0x05a3, 0x05af, 0x05b9, 0x05c9, 0x05ec, 0x060f, 0x061f, - 0x0629, 0x0633, 0x0653, 0x0673, 0x067b, 0x0683, 0x068f, 0x06a1, - 0x06a1, 0x06b5, 0x06cb, 0x06cb, 0x06d3, 0x06dd, 0x0704, 0x0718, - 0x0728, 0x0728, 0x073e, 0x0753, 0x0759, 0x0769, 0x0769, 0x077f, - 0x07a1, 0x07b7, 0x07b7, 0x07c8, 0x07ce, 0x07d9, 0x07ef, 0x07fc, - 0x081d, 0x0825, 0x0825, 0x0837, 0x0847, 0x0847, 0x0863, 0x086f, - 0x0887, 0x08aa, 0x08c7, 0x08dd, 0x0908, 0x091c, 0x0932, 0x0947, - // Entry 80 - BF - 0x095b, 0x0975, 0x0981, 0x09a3, 0x09b5, 0x09ca, 0x09df, 0x09eb, - 0x09eb, 0x09fd, 0x0a13, 0x0a2a, 0x0a3e, 0x0a55, 0x0a67, 0x0a8e, - 0x0aae, 0x0ad1, 0x0ae1, 0x0aeb, 0x0afe, 0x0b1c, 0x0b30, 0x0b4d, - 0x0b5c, 0x0b68, 0x0b7e, 0x0b9c, 0x0baa, 0x0bb2, 0x0bc0, 0x0bd2, - 0x0be0, 0x0bf4, 0x0c02, 0x0c19, 0x0c30, 0x0c3c, 0x0c5a, 0x0c8c, - 0x0c8e, 0x0caa, 0x0cdd, 0x0ce9, 0x0cf7, 0x0d11, 0x0d29, 0x0d58, -} // Size: 376 bytes - -const siScriptStr string = "" + // Size: 940 bytes - "අරාබිආර්මේනියානුබෙංගාලිබොපොමොෆෝබ්\u200dරේල්සිරිලික්දේවනාගරීඉතියෝපියානුජෝ" + - "ර්ජියානුග්\u200dරීකගුජරාටිගුර්මුඛිහැන්ඩ්බ්හැන්ගුල්හන්සුළුකළ හෑන්සම්ප්" + - "\u200dරදායික හෑන්හීබෲහිරඟනාජෑපනීස් සිලබරීස්ජාමොජපන්කතකනාකමර්කණ්ණඩකොරියාන" + - "ුලාඕලතින්මලයාලම්මොන්ගෝලියානුමියන්මාරඔරියාසිංහලදෙමළතෙළිඟුතානතායිටි" + - "\u200dබෙට්ගනිතමය සංකේතඉමොජිසංකේතඅලිඛිතපොදු.නොදත් අක්ෂර මාලාව" - -var siScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000f, 0x000f, 0x0030, - 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0045, 0x0045, 0x0045, - 0x005d, 0x005d, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x008a, 0x008a, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00c3, 0x00c3, - 0x00e1, 0x00e1, 0x00e1, 0x00e1, 0x00f3, 0x0108, 0x0120, 0x0138, - 0x0150, 0x0159, 0x0159, 0x0178, 0x01a9, 0x01a9, 0x01b5, 0x01c7, - 0x01c7, 0x01c7, 0x01f5, 0x01f5, 0x01f5, 0x01f5, 0x0201, 0x0201, - // Entry 40 - 7F - 0x020d, 0x020d, 0x020d, 0x021c, 0x021c, 0x0228, 0x0228, 0x0237, - 0x024f, 0x024f, 0x024f, 0x024f, 0x0258, 0x0258, 0x0258, 0x0267, - 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, - 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, 0x0267, - 0x027c, 0x027c, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02b8, - 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, - 0x02b8, 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02c7, - 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02c7, - // Entry 80 - BF - 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02c7, - 0x02c7, 0x02c7, 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02d6, - 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02e2, 0x02e2, - 0x02e2, 0x02f4, 0x02f4, 0x02f4, 0x02f4, 0x02fd, 0x0309, 0x031e, - 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, - 0x031e, 0x031e, 0x0340, 0x034f, 0x035e, 0x0370, 0x037d, 0x03ac, -} // Size: 376 bytes - -const skScriptStr string = "" + // Size: 540 bytes - "arabskéarménskebalijskýbengálskebopomofobraillovocyrilikadévanágaríegypt" + - "ské hieroglyfyetiópskegruzínskehlaholikagotickýgréckegudžarátígurmukhičí" + - "nske a bopomofohangulčínskečínske zjednodušenéčínske tradičnéhebrejskéhi" + - "raganakanajamojaponskékatakanakhmérskekannadskékórejskélaoskélatinkaline" + - "árna Alineárna Bmayské hieroglyfymalajálamskemongolskébarmskéuríjskeosm" + - "anskýRunové písmosinhálsketamilskételugskétánathajskétibetskématematický" + - " zápisemodžisymbolybez zápisuvšeobecnéneznáme písmo" - -var skScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0011, - 0x0011, 0x001a, 0x001a, 0x001a, 0x001a, 0x0024, 0x0024, 0x0024, - 0x002c, 0x002c, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003d, 0x003d, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x005e, 0x005e, 0x0067, 0x0067, - 0x0071, 0x007a, 0x0082, 0x0082, 0x0089, 0x0095, 0x009d, 0x00b0, - 0x00b6, 0x00be, 0x00be, 0x00d5, 0x00e8, 0x00e8, 0x00f2, 0x00fa, - 0x00fa, 0x00fa, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x0102, 0x0102, - // Entry 40 - 7F - 0x010b, 0x010b, 0x010b, 0x0113, 0x0113, 0x011c, 0x011c, 0x0126, - 0x0130, 0x0130, 0x0130, 0x0130, 0x0137, 0x0137, 0x0137, 0x013e, - 0x013e, 0x013e, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0166, 0x0166, 0x0166, 0x0166, - 0x0173, 0x0173, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x0185, - 0x0185, 0x0185, 0x0185, 0x0185, 0x0185, 0x0185, 0x0185, 0x0185, - 0x0185, 0x018d, 0x018d, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, - 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, - // Entry 80 - BF - 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, - 0x01a4, 0x01a4, 0x01ae, 0x01ae, 0x01ae, 0x01ae, 0x01ae, 0x01ae, - 0x01ae, 0x01ae, 0x01ae, 0x01ae, 0x01ae, 0x01ae, 0x01b7, 0x01b7, - 0x01b7, 0x01c0, 0x01c0, 0x01c0, 0x01c0, 0x01c5, 0x01cd, 0x01d6, - 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, - 0x01d6, 0x01d6, 0x01e9, 0x01f0, 0x01f7, 0x0202, 0x020d, 0x021c, -} // Size: 376 bytes - -const slScriptStr string = "" + // Size: 1495 bytes - "arabskiimperialno-aramejskiarmenskiavestanskibalijskibataškibengalskizna" + - "kovna pisava Blissbopomofobramanskibraillova pisavabuginskibuhidskipoeno" + - "tena zlogovna pisava kanadskih staroselcevChamčerokeškikirtkoptskiciprsk" + - "icirilicastarocerkvenoslovanska cirilicadevanagarščicafonetska pisava de" + - "seretdemotska egipčanska pisavahieratska egipčanska pisavaegipčanska sli" + - "kovna pisavaetiopskicerkvenogruzijskigruzijskiglagoliškigotskigrškigudža" + - "ratskigurmukiHanbhangulkanjihanunskipoenostavljena pisava hantradicional" + - "na pisava hanhebrejskihiraganapahavhmonska zlogovna pisavakatakana ali h" + - "iraganastaroogrskiinduškistaroitalskiJamojavanskijaponskikarenskikatakan" + - "agandarskikmerskikanadskikorejskikajatskilaoškifrakturagelski latiničnil" + - "atinicalepškilimbuškilinearna pisava Alinearna pisava Blicijskilidijskim" + - "andanskimanihejskimajevska slikovna pisavameroitskimalajalamskimongolska" + - "Moonova pisava za slepemanipurskimjanmarskiogamskisantalskiorkonskiorijs" + - "kiosmanskistaropermijskipagpajskivrezani napisi pahlavipsalmski pahlavik" + - "njižno palavanskifeničanskiPollardova fonetska pisavarongorongorunskisam" + - "aritanskisaratskiznakovna pisavašojevskisinhalskisundanskisiletsko-nagar" + - "ijskisirijskisirska abeceda estrangelozahodnosirijskivzhodnosirijskitagb" + - "anskitamilskitajsko-vietnamskiteluškitengvarskitifinajskitagaloškitanajs" + - "kitajskitibetanskiugaritskizlogovna pisava vaividni govorstaroperzijskis" + - "umersko-akadski klinopispodedovanmatematična znamenjasimbolinenapisanosp" + - "lošnoneznan ali neveljaven zapis" - -var slScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x001b, 0x0023, - 0x002d, 0x0035, 0x0035, 0x0035, 0x003d, 0x0046, 0x0046, 0x005b, - 0x0063, 0x006c, 0x007c, 0x0084, 0x008c, 0x008c, 0x00bb, 0x00bb, - 0x00bf, 0x00ca, 0x00ce, 0x00d5, 0x00dc, 0x00e4, 0x0103, 0x0113, - 0x012a, 0x012a, 0x0145, 0x0161, 0x017c, 0x017c, 0x0184, 0x0195, - 0x019e, 0x01a9, 0x01af, 0x01af, 0x01b5, 0x01c1, 0x01c8, 0x01cc, - 0x01d2, 0x01d7, 0x01df, 0x01f8, 0x0210, 0x0210, 0x0219, 0x0221, - 0x0221, 0x023d, 0x0252, 0x025d, 0x0265, 0x0271, 0x0275, 0x027d, - // Entry 40 - 7F - 0x0285, 0x0285, 0x028d, 0x0295, 0x029e, 0x02a5, 0x02a5, 0x02ad, - 0x02b5, 0x02b5, 0x02bd, 0x02bd, 0x02c4, 0x02cc, 0x02dd, 0x02e5, - 0x02ec, 0x02f5, 0x0306, 0x0317, 0x0317, 0x0317, 0x031f, 0x0327, - 0x0327, 0x0330, 0x033a, 0x033a, 0x0352, 0x0352, 0x0352, 0x035b, - 0x0367, 0x0367, 0x0370, 0x0387, 0x0387, 0x0391, 0x0391, 0x039b, - 0x039b, 0x039b, 0x039b, 0x039b, 0x039b, 0x039b, 0x03a2, 0x03ab, - 0x03b3, 0x03ba, 0x03ba, 0x03c2, 0x03c2, 0x03c2, 0x03d0, 0x03d9, - 0x03ef, 0x03ff, 0x0412, 0x041d, 0x0437, 0x0437, 0x0437, 0x0441, - // Entry 80 - BF - 0x0447, 0x0453, 0x045b, 0x045b, 0x045b, 0x046a, 0x0473, 0x0473, - 0x0473, 0x0473, 0x047c, 0x047c, 0x0485, 0x0498, 0x04a0, 0x04b9, - 0x04c8, 0x04d7, 0x04e0, 0x04e0, 0x04e0, 0x04e0, 0x04e8, 0x04e8, - 0x04f9, 0x0501, 0x050b, 0x0515, 0x051f, 0x0527, 0x052d, 0x0537, - 0x0537, 0x0540, 0x0553, 0x055e, 0x055e, 0x055e, 0x056c, 0x0585, - 0x0585, 0x058e, 0x05a3, 0x05a3, 0x05aa, 0x05b4, 0x05bc, 0x05d7, -} // Size: 376 bytes - -const sqScriptStr string = "" + // Size: 355 bytes - "arabikarmenbengalbopomofbrailishtcirilikdevanagaretiopikgjeorgjiangrekgu" + - "xharatgurmukhanbikhangulhanhan i thjeshtuarhan tradicionalhebraikhiragan" + - "alfabet rrokjesor japonezjamosishtjaponezkatakankmerkanadkoreanlaosishtl" + - "atinmalajalammongolbirmanorijasinhaltamiltelugtanishttajlandeztibetishts" + - "imbole matematikoreemojime simbolei pashkruari zakonshëmi panjohur" - -var sqScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x000b, - 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x0011, 0x0011, 0x0011, - 0x0018, 0x0018, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0028, 0x0028, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0038, 0x0038, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0046, 0x004e, 0x0054, 0x005a, - 0x0060, 0x0063, 0x0063, 0x0073, 0x0082, 0x0082, 0x0089, 0x0090, - 0x0090, 0x0090, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00b2, 0x00b2, - // Entry 40 - 7F - 0x00b9, 0x00b9, 0x00b9, 0x00c0, 0x00c0, 0x00c4, 0x00c4, 0x00c9, - 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00d7, 0x00d7, 0x00d7, 0x00dc, - 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, - 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, - 0x00e5, 0x00e5, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00f1, - 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, - 0x00f1, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, - 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, - // Entry 80 - BF - 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, - 0x00f6, 0x00f6, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, - 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x0101, 0x0101, - 0x0101, 0x0106, 0x0106, 0x0106, 0x0106, 0x010d, 0x0116, 0x011f, - 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, - 0x011f, 0x011f, 0x0133, 0x0138, 0x0142, 0x014d, 0x0159, 0x0163, -} // Size: 376 bytes - -const srScriptStr string = "" + // Size: 3732 bytes - "арапско писмоимперијско арамејско писмојерменско писмоавестанско писмоба" + - "лијско писмобатак писмобенгалско писмоблисимболично писмобопомофо писмо" + - "браманско писмоБрајево писмобугинско писмобухидско писмочакманско писмо" + - "уједињени канадски абориџински силабицикаријско писмочамско писмоЧероки" + - "цирт писмокоптичко писмокипарско писмоћирилицаСтарословенска црквена ћи" + - "рилицадеванагариДезеретегипатско народно писмоегипатско хијератско писм" + - "оегипатски хијероглифиетиопско писмогрузијско кхутсури писмогрузијско п" + - "исмоглагољицаГотикагрчко писмогуџаратско писмогурмуки писмоханбхангулха" + - "нханунопоједностављено хан писмотрадиционално хан писмохебрејско писмох" + - "ираганапахав хмонг писмојапанска слоговна писмастаромађарско писмоиндуш" + - "ко писмостари италикџамојаванско писмојапанско писмокајах-ли писмокатак" + - "анакарошти писмокмерско писмоканада писмокорејско писмокаитиланна писмо" + - "лаошко писмолатиница (фрактур варијанта)галска латиницалатиницалепча пи" + - "смолимбу писмолинеарно А писмолинеарно Б писмолисијско писмолидијско пи" + - "смомандеанско писмоманихејско писмомајански хијероглифимероитик писмома" + - "лајаламско писмомонголско писмомесечево писмомеитеи мајек писмомијанмар" + - "ско писмон’ко писмоогамско писмоол чики писмоорконско писмооријанско пи" + - "смоосмањанско писмостаро пермикско писмопагс-па писмописани пахлавипсал" + - "тер пахлавипахлави писмоФеничанско писмопоралд фонетско писмописани пар" + - "тианрејанг писморонгоронго писморунско писмосамаританско писмосарати пи" + - "смосаураштра писмознаковно писмошавијанско писмосинхалско писмосунданск" + - "о писмосилоти нагри писмосиријско писмосиријско естрангело писмозападно" + - "сиријско писмописмо источне Сиријетагбанва писмотаи ле писмонови таи лу" + - "етамилско писмотаи виет писмотелугу писмотенгвар писмотифинаг писмоТага" + - "логтана писмотајландско писмотибетанско писмоугаритско писмоваи писмови" + - "дљиви говорстароперсијско писмосумерско-акадско кунеиформ писмоји писмо" + - "наследно писмоматематичка нотацијаемоџисимболинеписани језикзаједничко " + - "писмонепознато писмо" - -var srScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0019, 0x004b, 0x0068, - 0x0087, 0x00a2, 0x00a2, 0x00a2, 0x00b7, 0x00d4, 0x00d4, 0x00f9, - 0x0114, 0x0131, 0x014a, 0x0165, 0x0180, 0x019d, 0x01e8, 0x0203, - 0x021a, 0x0226, 0x0239, 0x0254, 0x026f, 0x027f, 0x02bb, 0x02cf, - 0x02dd, 0x02dd, 0x0309, 0x033b, 0x0364, 0x0364, 0x037f, 0x03ad, - 0x03ca, 0x03dc, 0x03e8, 0x03e8, 0x03fd, 0x041c, 0x0435, 0x043d, - 0x0449, 0x044f, 0x045b, 0x048b, 0x04b7, 0x04b7, 0x04d4, 0x04e4, - 0x04e4, 0x0504, 0x0530, 0x0555, 0x056e, 0x0585, 0x058d, 0x05a8, - // Entry 40 - 7F - 0x05c3, 0x05c3, 0x05dd, 0x05ed, 0x0606, 0x061f, 0x061f, 0x0636, - 0x0651, 0x0651, 0x065b, 0x0670, 0x0687, 0x06bb, 0x06d8, 0x06e8, - 0x06fd, 0x0712, 0x0730, 0x074e, 0x074e, 0x074e, 0x0769, 0x0784, - 0x0784, 0x07a3, 0x07c2, 0x07c2, 0x07e9, 0x07e9, 0x07e9, 0x0804, - 0x0827, 0x0827, 0x0844, 0x085f, 0x085f, 0x0881, 0x0881, 0x08a2, - 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08b6, 0x08b6, 0x08cf, 0x08e7, - 0x0902, 0x091f, 0x091f, 0x093e, 0x093e, 0x093e, 0x0966, 0x097e, - 0x0999, 0x09b6, 0x09cf, 0x09ee, 0x0a16, 0x0a31, 0x0a48, 0x0a67, - // Entry 80 - BF - 0x0a7e, 0x0aa1, 0x0ab8, 0x0ab8, 0x0ad5, 0x0af0, 0x0b0f, 0x0b0f, - 0x0b0f, 0x0b0f, 0x0b2c, 0x0b2c, 0x0b49, 0x0b6b, 0x0b86, 0x0bb6, - 0x0bdf, 0x0c05, 0x0c20, 0x0c20, 0x0c36, 0x0c4c, 0x0c67, 0x0c67, - 0x0c81, 0x0c98, 0x0cb1, 0x0cca, 0x0cd8, 0x0ceb, 0x0d0a, 0x0d29, - 0x0d29, 0x0d46, 0x0d57, 0x0d70, 0x0d70, 0x0d70, 0x0d97, 0x0dd4, - 0x0de3, 0x0dfe, 0x0e25, 0x0e2f, 0x0e3d, 0x0e58, 0x0e77, 0x0e94, -} // Size: 376 bytes - -const srLatnScriptStr string = "" + // Size: 1974 bytes - "arapsko pismoimperijsko aramejsko pismojermensko pismoavestansko pismoba" + - "lijsko pismobatak pismobengalsko pismoblisimbolično pismobopomofo pismob" + - "ramansko pismoBrajevo pismobuginsko pismobuhidsko pismočakmansko pismouj" + - "edinjeni kanadski aboridžinski silabicikarijsko pismočamsko pismoČerokic" + - "irt pismokoptičko pismokiparsko pismoćirilicaStaroslovenska crkvena ćiri" + - "licadevanagariDezeretegipatsko narodno pismoegipatsko hijeratsko pismoeg" + - "ipatski hijeroglifietiopsko pismogruzijsko khutsuri pismogruzijsko pismo" + - "glagoljicaGotikagrčko pismogudžaratsko pismogurmuki pismohanbhangulhanha" + - "nunopojednostavljeno han pismotradicionalno han pismohebrejsko pismohira" + - "ganapahav hmong pismojapanska slogovna pismastaromađarsko pismoinduško p" + - "ismostari italikdžamojavansko pismojapansko pismokajah-li pismokatakanak" + - "arošti pismokmersko pismokanada pismokorejsko pismokaitilanna pismolaošk" + - "o pismolatinica (fraktur varijanta)galska latinicalatinicalepča pismolim" + - "bu pismolinearno A pismolinearno B pismolisijsko pismolidijsko pismomand" + - "eansko pismomanihejsko pismomajanski hijeroglifimeroitik pismomalajalams" + - "ko pismomongolsko pismomesečevo pismomeitei majek pismomijanmarsko pismo" + - "n’ko pismoogamsko pismool čiki pismoorkonsko pismoorijansko pismoosmanja" + - "nsko pismostaro permiksko pismopags-pa pismopisani pahlavipsalter pahlav" + - "ipahlavi pismoFeničansko pismoporald fonetsko pismopisani partianrejang " + - "pismorongorongo pismorunsko pismosamaritansko pismosarati pismosauraštra" + - " pismoznakovno pismošavijansko pismosinhalsko pismosundansko pismosiloti" + - " nagri pismosirijsko pismosirijsko estrangelo pismozapadnosirijsko pismo" + - "pismo istočne Sirijetagbanva pismotai le pismonovi tai luetamilsko pismo" + - "tai viet pismotelugu pismotengvar pismotifinag pismoTagalogtana pismotaj" + - "landsko pismotibetansko pismougaritsko pismovai pismovidljivi govorstaro" + - "persijsko pismosumersko-akadsko kuneiform pismoji pismonasledno pismomat" + - "ematička notacijaemodžisimbolinepisani jezikzajedničko pismonepoznato pi" + - "smo" - -var srLatnScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000d, 0x0027, 0x0036, - 0x0046, 0x0054, 0x0054, 0x0054, 0x005f, 0x006e, 0x006e, 0x0082, - 0x0090, 0x009f, 0x00ac, 0x00ba, 0x00c8, 0x00d8, 0x0102, 0x0110, - 0x011d, 0x0124, 0x012e, 0x013d, 0x014b, 0x0154, 0x0174, 0x017e, - 0x0185, 0x0185, 0x019c, 0x01b6, 0x01cb, 0x01cb, 0x01d9, 0x01f1, - 0x0200, 0x020a, 0x0210, 0x0210, 0x021c, 0x022e, 0x023b, 0x023f, - 0x0245, 0x0248, 0x024e, 0x0268, 0x027f, 0x027f, 0x028e, 0x0296, - 0x0296, 0x02a7, 0x02be, 0x02d2, 0x02e0, 0x02ec, 0x02f2, 0x0300, - // Entry 40 - 7F - 0x030e, 0x030e, 0x031c, 0x0324, 0x0332, 0x033f, 0x033f, 0x034b, - 0x0359, 0x0359, 0x035e, 0x0369, 0x0376, 0x0392, 0x03a1, 0x03a9, - 0x03b5, 0x03c0, 0x03d0, 0x03e0, 0x03e0, 0x03e0, 0x03ee, 0x03fc, - 0x03fc, 0x040c, 0x041c, 0x041c, 0x0430, 0x0430, 0x0430, 0x043e, - 0x0450, 0x0450, 0x045f, 0x046e, 0x046e, 0x0480, 0x0480, 0x0491, - 0x0491, 0x0491, 0x0491, 0x0491, 0x049d, 0x049d, 0x04aa, 0x04b8, - 0x04c6, 0x04d5, 0x04d5, 0x04e6, 0x04e6, 0x04e6, 0x04fb, 0x0508, - 0x0516, 0x0525, 0x0532, 0x0543, 0x0558, 0x0566, 0x0572, 0x0582, - // Entry 80 - BF - 0x058e, 0x05a0, 0x05ac, 0x05ac, 0x05bc, 0x05ca, 0x05db, 0x05db, - 0x05db, 0x05db, 0x05ea, 0x05ea, 0x05f9, 0x060b, 0x0619, 0x0632, - 0x0647, 0x065c, 0x066a, 0x066a, 0x0676, 0x0682, 0x0690, 0x0690, - 0x069e, 0x06aa, 0x06b7, 0x06c4, 0x06cb, 0x06d5, 0x06e5, 0x06f5, - 0x06f5, 0x0704, 0x070d, 0x071b, 0x071b, 0x071b, 0x072f, 0x074f, - 0x0757, 0x0765, 0x077a, 0x0781, 0x0788, 0x0796, 0x07a7, 0x07b6, -} // Size: 376 bytes - -const svScriptStr string = "" + // Size: 1720 bytes - "afakiskakaukasiska albanskaahomarabiskaimperisk arameiskaarmeniskaavesti" + - "skabalinesiskabamunskabassaiska vahbatakbengaliskabhaiksukiskablissymbol" + - "erbopomofobramipunktskriftbuginesiskabuhidchakmakanadensiska stavelsetec" + - "kenkariskachamcherokeecirtkoptiskacypriotiskakyrilliskafornkyrkoslavisk " + - "kyrilliskadevanagarideseretDuployéstenografiskademotiskahieratiskaegypti" + - "ska hieroglyferelbasiskaetiopiskakutsurigeorgiskaglagolitiskagotiskagamm" + - "altamilskagrekiskagujaratigurmukhihan med bopomofohangulhanhanunó’ofören" + - "klade han-teckentraditionella han-teckenhatranhebreiskahiraganahittitisk" + - "a hieroglyferpahaw mongkatakana/hiraganafornungerskaindusfornitaliskajam" + - "ojavanskajapanskajurchenskakaya likatakanakharoshtikhmeriskakhojkiskakan" + - "aresiskakoreanskakpellékaithiskalannalaotiskafrakturlatingaeliskt latinl" + - "atinskaronglimbulinjär Alinjär BFraserlomalykiskalydiskamahajaniskamanda" + - "éiskamanikeanskamarchenskamayahieroglyfermendekursiv-meroitiskameroitis" + - "kamalayalammodiskamongoliskamoonmrumeitei-mayekmultaniskaburmesiskafornn" + - "ordarabiskanabateiskanewariskanaxi geban-kånüshuoghamol-chikiorkonoriyao" + - "smanjapalmyreniskaPau Cin Hau-skriftfornpermiskaphags-patidig pahlavipsa" + - "ltaren-pahlavibokpahlavifeniciskapollardteckentidig parthianskarejangron" + - "go-rongorunorsamaritiskasaratifornsydarabiskasaurashtrateckningsskriftsh" + - "awiskasharadasiddhamskasindhiskasingalesiskasora sompengsundanesiskasylo" + - "ti nagrisyriskaestrangelosyriskavästsyriskaöstsyriskatagbanwatakritiskat" + - "ai letai luetamilskatangutiskatai viettelugutengwartifinaghiskatagalogta" + - "anathailändskatibetanskatirhutaugaritiskavajsynligt talvarang kshitiwole" + - "aifornpersiskasumero-akkadisk kilskriftyiärvdamatematisk notationemojisy" + - "mboleroskrivet språkgemensammaokänt skriftsystem" - -var svScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0008, 0x001b, 0x001f, 0x0027, 0x0039, 0x0042, - 0x004b, 0x0056, 0x005e, 0x006b, 0x0070, 0x007a, 0x0086, 0x0092, - 0x009a, 0x009f, 0x00aa, 0x00b5, 0x00ba, 0x00c0, 0x00db, 0x00e2, - 0x00e6, 0x00ee, 0x00f2, 0x00fa, 0x0105, 0x010f, 0x012a, 0x0134, - 0x013b, 0x0150, 0x0159, 0x0163, 0x0178, 0x0181, 0x018a, 0x0191, - 0x019a, 0x01a6, 0x01ad, 0x01bb, 0x01c3, 0x01cb, 0x01d3, 0x01e3, - 0x01e9, 0x01ec, 0x01f7, 0x020d, 0x0225, 0x022b, 0x0234, 0x023c, - 0x0252, 0x025c, 0x026d, 0x0279, 0x027e, 0x028a, 0x028e, 0x0296, - // Entry 40 - 7F - 0x029e, 0x02a8, 0x02af, 0x02b7, 0x02c0, 0x02c9, 0x02d2, 0x02dd, - 0x02e6, 0x02ed, 0x02f6, 0x02fb, 0x0303, 0x030f, 0x031d, 0x0325, - 0x0329, 0x032e, 0x0337, 0x0340, 0x0346, 0x034a, 0x0351, 0x0358, - 0x0363, 0x036e, 0x0379, 0x0383, 0x0392, 0x0397, 0x03a8, 0x03b2, - 0x03bb, 0x03c2, 0x03cc, 0x03d0, 0x03d3, 0x03df, 0x03e9, 0x03f3, - 0x0403, 0x040d, 0x0416, 0x041f, 0x0424, 0x042a, 0x042f, 0x0437, - 0x043c, 0x0441, 0x0441, 0x0448, 0x0454, 0x0466, 0x0472, 0x047a, - 0x0487, 0x0498, 0x04a2, 0x04ab, 0x04b8, 0x04c9, 0x04cf, 0x04da, - // Entry 80 - BF - 0x04df, 0x04ea, 0x04f0, 0x04ff, 0x0509, 0x0518, 0x0520, 0x0527, - 0x0531, 0x053a, 0x0546, 0x0552, 0x055e, 0x056a, 0x0571, 0x0582, - 0x058e, 0x0599, 0x05a1, 0x05ab, 0x05b1, 0x05b8, 0x05c0, 0x05ca, - 0x05d2, 0x05d8, 0x05df, 0x05eb, 0x05f2, 0x05f7, 0x0603, 0x060d, - 0x0614, 0x061e, 0x0621, 0x062c, 0x0639, 0x063f, 0x064b, 0x0664, - 0x0666, 0x066c, 0x067f, 0x0684, 0x068c, 0x069b, 0x06a5, 0x06b8, -} // Size: 376 bytes - -const swScriptStr string = "" + // Size: 392 bytes - "KiarabuKiarmeniaKibengaliKibopomofoBrailleKisirilikiKidevanagariKiethiop" + - "iaKijojiaKigirikiKigujaratiKigurmukhiHanbKihangulKihanKihan RahisiKihan " + - "cha JadiKiebraniaHiraganaHati za KijapaniJamoKijapaniKikatakanaKikambodi" + - "aKikannadaKikoreaKilaosiKilatiniKimalayalamKimongoliaMyamaKioriyaKisinha" + - "laKitamilKiteluguKithaanaKithaiKitibetiHati za kihisabatiEmojiAlamaHaija" + - "andikwaKawaidaHati isiyojulikana" - -var swScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0019, 0x0019, 0x0019, - 0x0023, 0x0023, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0034, 0x0034, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x004a, 0x004a, - 0x0051, 0x0051, 0x0051, 0x0051, 0x0059, 0x0063, 0x006d, 0x0071, - 0x0079, 0x007e, 0x007e, 0x008a, 0x0098, 0x0098, 0x00a1, 0x00a9, - 0x00a9, 0x00a9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00bd, 0x00bd, - // Entry 40 - 7F - 0x00c5, 0x00c5, 0x00c5, 0x00cf, 0x00cf, 0x00d9, 0x00d9, 0x00e2, - 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00f0, 0x00f0, 0x00f0, 0x00f8, - 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, - 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, - 0x0103, 0x0103, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x0112, - 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, - 0x0112, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - // Entry 80 - BF - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, - 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0129, 0x0129, - 0x0129, 0x0131, 0x0131, 0x0131, 0x0131, 0x0139, 0x013f, 0x0147, - 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, - 0x0147, 0x0147, 0x0159, 0x015e, 0x0163, 0x016f, 0x0176, 0x0188, -} // Size: 376 bytes - -const taScriptStr string = "" + // Size: 3954 bytes - "அரபிக்இம்பேரியல் அரமெய்க்அர்மேனியன்அவெஸ்தான்பாலினீஸ்பாடாக்வங்காளம்ப்லிஸ்" + - "ஸிமிபால்ஸ்போபோமோஃபோபிரம்மிபிரெயில்புகினீஸ்புகித்சக்மாயுனிஃபைடு கனடியன்" + - " அபொரிஜினல் சிலபிக்ஸ்கரியன்சாம்செரோக்கிகிர்த்காப்டிக்சைப்ரியாட்சிரிலிக்ப" + - "ழைய சர்ச் ஸ்லவோனிக் சிரிலிக்தேவநாகரிடெசராட்எகிப்தியன் டெமோட்டிக்எகிப்த" + - "ியன் ஹைரேட்டிக்எகிப்தியன் ஹைரோகிளிப்ஸ்எத்தியோபிக்ஜியார்ஜியன் குட்சுரிஜ" + - "ார்ஜியன்க்லாகோலிடிக்கோதிக்கிரேக்கம்குஜராத்திகுர்முகிஹன்ப்ஹங்குல்ஹன்ஹனு" + - "னூஎளிதாக்கப்பட்ட ஹன்பாரம்பரிய ஹன்ஹீப்ருஹிராகானாபஹாவ் மாங்க்ஜப்பானிய எழ" + - "ுத்துருக்கள்பழைய ஹங்கேரியன்சிந்துபழைய இத்தாலிஜமோஜாவனீஸ்ஜப்பானியம்கயாஹ்" + - " லீகதகானாகரோஷ்டிகமெர்கன்னடம்கொரியன்காய்திலன்னாலாவோஃப்ரக்டூர் லெத்தின்கேல" + - "ிக் லெத்தின்லத்தின்லெப்சாலிம்புலினியர் ஏலினியர் பிலிசியன்லிடியன்மேன்டி" + - "யன்மனிசெய்ன்மயான் ஹைரோகிளிப்மெராய்டிக்மலையாளம்மங்கோலியன்மூன்மெய்தெய் ம" + - "யக்மியான்மர்என்‘கோஒகாம்ஒல் சிக்கிஆர்கான்ஒடியாஒஸ்மான்யாபழைய பெர்மிக்பக்" + - "ஸ்-பாஇன்ஸ்கிரிப்ஷனல் பஹலவிசால்டர் பஹலவிபுக் பஹலவிஃபோனேஷியன்போலார்ட் ஃப" + - "ொனெட்டிக்இன்ஸ்கிரிப்ஷனல் பார்த்தியன்ரெஜெய்ன்ரொங்கோரொங்கோருனிக்சமாரிடன்" + - "சாராதிசௌராஷ்ட்ராஸைன்எழுத்துஷவியான்சிங்களம்சுந்தானீஸ்சிலோடி நக்ரிசிரியா" + - "க்எஸ்ட்ரெங்கெலோ சிரியாக்மேற்கு சிரியாக்கிழக்கு சிரியாக்தகோவானாதாய் லேப" + - "ுதிய தை லூதமிழ்தை வியத்தெலுங்குதெங்வார்டிஃபினாக்தகலாக்தானாதாய்திபெத்தி" + - "யன்உகாரதிக்வைவிசிபிள் ஸ்பீச்பழைய பெர்ஷியன்சுமெரோ-அக்கடியன் க்யூனிஃபார்" + - "ம்யீபாரம்பரியமானகணிதக்குறியீடுஎமோஜிசின்னங்கள்எழுதப்படாததுபொதுஅறியப்படா" + - "த ஸ்கிரிப்ட்" - -var taScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0049, 0x0067, - 0x0082, 0x009a, 0x009a, 0x009a, 0x00ac, 0x00c4, 0x00c4, 0x00f4, - 0x010f, 0x0124, 0x013c, 0x0154, 0x0166, 0x0175, 0x01e1, 0x01f3, - 0x01ff, 0x0217, 0x0229, 0x0241, 0x025f, 0x0277, 0x02c8, 0x02e0, - 0x02f5, 0x02f5, 0x0332, 0x036f, 0x03b2, 0x03b2, 0x03d3, 0x040d, - 0x0428, 0x044c, 0x045e, 0x045e, 0x0479, 0x0494, 0x04ac, 0x04bb, - 0x04d0, 0x04d9, 0x04e8, 0x051c, 0x0541, 0x0541, 0x0553, 0x056b, - 0x056b, 0x058d, 0x05d0, 0x05fb, 0x060d, 0x062f, 0x0638, 0x064d, - // Entry 40 - 7F - 0x066b, 0x066b, 0x0681, 0x0693, 0x06a8, 0x06b7, 0x06b7, 0x06cc, - 0x06e1, 0x06e1, 0x06f3, 0x0702, 0x070e, 0x0745, 0x0770, 0x0785, - 0x0797, 0x07a9, 0x07c2, 0x07de, 0x07de, 0x07de, 0x07f3, 0x0808, - 0x0808, 0x0823, 0x083e, 0x083e, 0x086c, 0x086c, 0x086c, 0x088a, - 0x08a2, 0x08a2, 0x08c0, 0x08cc, 0x08cc, 0x08f1, 0x08f1, 0x090c, - 0x090c, 0x090c, 0x090c, 0x090c, 0x091e, 0x091e, 0x092d, 0x0949, - 0x095e, 0x096d, 0x096d, 0x0988, 0x0988, 0x0988, 0x09ad, 0x09c3, - 0x0a00, 0x0a25, 0x0a41, 0x0a5f, 0x0a99, 0x0ae8, 0x0b00, 0x0b24, - // Entry 80 - BF - 0x0b36, 0x0b4e, 0x0b60, 0x0b60, 0x0b7e, 0x0b9f, 0x0bb4, 0x0bb4, - 0x0bb4, 0x0bb4, 0x0bcc, 0x0bcc, 0x0bea, 0x0c0c, 0x0c24, 0x0c64, - 0x0c8f, 0x0cbd, 0x0cd2, 0x0cd2, 0x0ce5, 0x0d02, 0x0d11, 0x0d11, - 0x0d27, 0x0d3f, 0x0d57, 0x0d72, 0x0d84, 0x0d90, 0x0d9c, 0x0dbd, - 0x0dbd, 0x0dd5, 0x0ddb, 0x0e06, 0x0e06, 0x0e06, 0x0e2e, 0x0e84, - 0x0e8a, 0x0eae, 0x0ed8, 0x0ee7, 0x0f05, 0x0f29, 0x0f35, 0x0f72, -} // Size: 376 bytes - -const teScriptStr string = "" + // Size: 3756 bytes - "అరబిక్ఇంపీరియల్ అరామాక్అర్మేనియన్అవేస్టాన్బాలినీస్బాటక్బాంగ్లాబ్లిస్సింబ" + - "ల్స్బోపోమోఫోబ్రాహ్మిబ్రెయిల్బ్యుగినీస్బుహిడ్చక్మాయునిఫైడ్ కెనెడియన్ అబ" + - "ొరిజినల్ సిలబిక్స్కారియన్చామ్చిరోకిసిర్థ్కోప్టిక్సైప్రోట్సిరిలిక్ప్రాచ" + - "ీన చర్చ స్లావోనిక్ సిరిలిక్దేవనాగరిడేసెరెట్ఇజిప్షియన్ డెమోటిక్ఇజిప్షియ" + - "న్ హైరాటిక్ఇజిప్షియన్ హైరోగ్లైఫ్స్ఇథియోపిక్జార్జియన్ ఖట్సూరిజార్జియన్గ" + - "్లాగో లిటిక్గోతిక్గ్రీక్గుజరాతీగుర్ముఖిహాన్బ్హంగుల్హాన్హనునూసరళీకృత హా" + - "న్సాంప్రదాయక హాన్హీబ్రుహిరాగానపాహవా హ్మోంగ్జపనీస్ సిలబెరీస్ప్రాచీన హంగ" + - "ేరియన్సింధుప్రాచిన ఐటాలిక్జమోజావనీస్జాపనీస్కాయాహ్ లికాటాకానఖరోషథిఖ్మేర" + - "్కన్నడకొరియన్కైథిలన్నాలావోఫ్రాక్టూర్ లాటిన్గేలిక్ లాటిన్లాటిన్లేప్చాలి" + - "ంబులినియర్ ఎలినియర్ బిలిసియన్లిడియన్మాన్డియన్మానిచేన్మాయన్ హైరోగ్లైఫ్స" + - "్మెరోఇటిక్మలయాళంమంగోలియన్మూన్మీటి మయెక్మయాన్మార్న్కోఒఘమ్ఓల్ చికిఓర్ఖోన" + - "్ఒడియాఓసమాన్యప్రాచీన పెర్మిక్ఫాగ్స్-పాఇంస్క్రిప్షనాల్ పహ్లావిసల్టార్ ప" + - "హ్లావిపుస్తక పహ్లావిఫోనిశియన్పోల్లర్డ్ ఫోనెటిక్ఇంస్క్రిప్షనాల్ పార్థియ" + - "న్రేజాంగ్రోంగో రోంగోరూనిక్సమారిటన్సరాటిసౌరాష్ట్రసంజ్ఞ లిపిషవియాన్సింహళ" + - "ంసుడానీస్స్లోటి నాగ్రిసిరియాక్ఎస్ట్రానజీలో సిరియాక్పశ్చిమ సిరియాక్తూర్" + - "పు సిరియాక్టాగ్బానవాతై లీక్రొత్త టై లుఇతమిళముటై వియట్తెలుగుటేంగ్వార్టి" + - "ఫీనాఘ్టగలాగ్థానాథాయ్టిబెటన్యుగారిటిక్వాయికనిపించే భాషప్రాచీన పర్షియన్స" + - "ుమేరో- అక్కడియన్ క్యునిఫార్మ్యివారసత్వంగణిత సంకేతలిపిఎమోజిచిహ్నాలులిపి" + - " లేనిసామాన్యతెలియని లిపి" - -var teScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0043, 0x0061, - 0x007c, 0x0094, 0x0094, 0x0094, 0x00a3, 0x00b8, 0x00b8, 0x00e2, - 0x00fa, 0x0112, 0x012a, 0x0148, 0x015a, 0x0169, 0x01d8, 0x01ed, - 0x01f9, 0x020b, 0x021d, 0x0235, 0x024d, 0x0265, 0x02bf, 0x02d7, - 0x02ef, 0x02ef, 0x0326, 0x035d, 0x03a0, 0x03a0, 0x03bb, 0x03ec, - 0x0407, 0x042c, 0x043e, 0x043e, 0x0450, 0x0465, 0x047d, 0x048f, - 0x04a1, 0x04ad, 0x04bc, 0x04de, 0x0509, 0x0509, 0x051b, 0x0530, - 0x0530, 0x0555, 0x0583, 0x05b4, 0x05c3, 0x05ee, 0x05f7, 0x060c, - // Entry 40 - 7F - 0x0621, 0x0621, 0x063a, 0x064f, 0x0661, 0x0673, 0x0673, 0x0682, - 0x0697, 0x0697, 0x06a3, 0x06b2, 0x06be, 0x06ef, 0x0714, 0x0726, - 0x0738, 0x0747, 0x0760, 0x077c, 0x077c, 0x077c, 0x0791, 0x07a6, - 0x07a6, 0x07c1, 0x07d9, 0x07d9, 0x080d, 0x080d, 0x080d, 0x0828, - 0x083a, 0x083a, 0x0855, 0x0861, 0x0861, 0x087d, 0x087d, 0x0898, - 0x0898, 0x0898, 0x0898, 0x0898, 0x08a4, 0x08a4, 0x08b0, 0x08c6, - 0x08db, 0x08ea, 0x08ea, 0x08ff, 0x08ff, 0x08ff, 0x092d, 0x0946, - 0x0989, 0x09b4, 0x09dc, 0x09f7, 0x0a2b, 0x0a74, 0x0a89, 0x0aa8, - // Entry 80 - BF - 0x0aba, 0x0ad2, 0x0ae1, 0x0ae1, 0x0afc, 0x0b18, 0x0b2d, 0x0b2d, - 0x0b2d, 0x0b2d, 0x0b3f, 0x0b3f, 0x0b57, 0x0b7c, 0x0b94, 0x0bd1, - 0x0bfc, 0x0c27, 0x0c42, 0x0c42, 0x0c4f, 0x0c75, 0x0c87, 0x0c87, - 0x0c9d, 0x0caf, 0x0cca, 0x0ce2, 0x0cf4, 0x0d00, 0x0d0c, 0x0d21, - 0x0d21, 0x0d3f, 0x0d4b, 0x0d6d, 0x0d6d, 0x0d6d, 0x0d9b, 0x0def, - 0x0df5, 0x0e0d, 0x0e35, 0x0e44, 0x0e5c, 0x0e75, 0x0e8a, 0x0eac, -} // Size: 376 bytes - -const thScriptStr string = "" + // Size: 4368 bytes - "อะฟาคาแอลเบเนีย คอเคเซียอาหรับอิมพีเรียล อราเมอิกอาร์เมเนียอเวสตะบาหลีบา" + - "มุมบัสซาบาตักเบงกาลีบลิสซิมโบลส์ปอพอมอฟอพราหมีเบรลล์บูกิสบูฮิดชากมาสัญ" + - "ลักษณ์ชนเผ่าพื้นเมืองแคนาดาคาเรียจามเชอโรกีเซิร์ทคอปติกไซเปรียทซีริลลิ" + - "กเชอร์ชสลาโวนิกซีริลลิกโบราณเทวนาครีเดเซเรทชวเลขดัปโลยันดีโมติกอียิปต์" + - "เฮียราติกอียิปต์เฮียโรกลิฟส์อียิปต์เอลบ์ซานเอธิโอปิกคัตซูรีจอร์เจียจอร" + - "์เจียกลาโกลิติกโกธิกคฤณห์กรีกคุชราตกูร์มูคีจีนกลางฮันกึลฮั่นฮานูโนโอฮั" + - "่นตัวย่อฮั่นตัวเต็มฮีบรูฮิระงะนะอักขระอานาโตเลียปาเฮาห์ม้งคะตะกะนะหรือ" + - "ฮิระงะนะฮังการีโบราณอินดัสอิตาลีโบราณจาโมชวาญี่ปุ่นจูร์เชนคยาห์คะตะกะน" + - "ะขโรษฐีเขมรคอจคีกันนาดาเกาหลีเปลเลกายติล้านนาลาวลาติน - ฟรังเตอร์ลาติน" + - " - แกลิกละตินเลปชาลิมบูลีเนียร์เอลีเนียร์บีเฟรเซอร์โลมาไลเซียลีเดียมหาชน" + - "ีแมนเดียนมานิแชนมายาไฮโรกลิฟส์เมนเดเคอร์ซีฟ-เมโรอิติกเมโรติกมาลายาลัมโ" + - "มฑีมองโกเลียมูนมโรเมเทมาเยกพม่าอาระเบียเหนือโบราณนาบาทาเอียนกีบา-นาซีเ" + - "อ็นโกนุซุโอคัมโอลชิกิออร์คอนโอริยาออสมันยาพาลไมรีนป่อจิ้งฮอเปอร์มิกโบร" + - "าณฟากส์-ปาปะห์ลาวีอินสคริปชันแนลปะห์ลาวีซอลเตอร์ปะห์ลาวีบุ๊กฟินิเชียสั" + - "ทศาสตร์พอลลาร์ดพาร์เทียอินสคริปชันแนลเรจังรองโกรองโกรูนิกซามาเรียซาราต" + - "ิอาระเบียใต้โบราณโสวรัสตระไซน์ไรติ้งซอเวียนชาราดาสิทธัมคุดาวาดีสิงหลโส" + - "ราสมเป็งซุนดาซิโลตินากรีซีเรียซีเรียเอสทรานจีโลซีเรียตะวันตกซีเรียตะวั" + - "นออกตักบันวาทาครีไทเลไทลื้อใหม่ทมิฬตันกัทไทเวียตเตลูกูเทงกวาร์ทิฟินากต" + - "ากาล็อกทานาไทยทิเบตเทอฮุทายูการิตไวคำพูดที่มองเห็นได้วารังกสิติโอลีเอเ" + - "ปอร์เซียโบราณอักษรรูปลิ่มสุเมเรีย-อัคคาเดียยิอินเฮอริตเครื่องหมายทางคณ" + - "ิตศาสตร์อีโมจิซิมโบลส์ไม่มีภาษาเขียนสามัญสคริปต์ที่ไม่รู้จัก" - -var thScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0012, 0x0046, 0x0046, 0x0058, 0x008f, 0x00ad, - 0x00bf, 0x00ce, 0x00dd, 0x00ec, 0x00fb, 0x0110, 0x0110, 0x0134, - 0x014c, 0x015e, 0x0170, 0x017f, 0x018e, 0x019d, 0x01f7, 0x0209, - 0x0212, 0x0227, 0x0239, 0x024b, 0x0263, 0x027b, 0x02cc, 0x02e4, - 0x02f9, 0x0320, 0x034a, 0x037a, 0x03b3, 0x03cb, 0x03e6, 0x0413, - 0x042b, 0x0449, 0x0458, 0x0467, 0x0473, 0x0485, 0x049d, 0x04b2, - 0x04c4, 0x04d0, 0x04e8, 0x0506, 0x0527, 0x0527, 0x0536, 0x054e, - 0x057e, 0x059c, 0x05d8, 0x05fc, 0x060e, 0x062f, 0x063b, 0x0644, - // Entry 40 - 7F - 0x0659, 0x066e, 0x067d, 0x0695, 0x06a7, 0x06b3, 0x06c2, 0x06d7, - 0x06e9, 0x06f8, 0x0707, 0x0719, 0x0722, 0x074f, 0x0770, 0x077f, - 0x078e, 0x079d, 0x07bb, 0x07d9, 0x07f1, 0x07fd, 0x080f, 0x0821, - 0x0833, 0x084b, 0x0860, 0x0860, 0x088a, 0x0899, 0x08cd, 0x08e2, - 0x08fd, 0x0909, 0x0924, 0x092d, 0x0936, 0x0951, 0x0951, 0x095d, - 0x0993, 0x09b4, 0x09b4, 0x09cd, 0x09df, 0x09eb, 0x09fa, 0x0a0f, - 0x0a24, 0x0a36, 0x0a36, 0x0a4e, 0x0a66, 0x0a81, 0x0aa8, 0x0abe, - 0x0b00, 0x0b30, 0x0b54, 0x0b6c, 0x0b9f, 0x0be1, 0x0bf0, 0x0c0e, - // Entry 80 - BF - 0x0c1d, 0x0c35, 0x0c47, 0x0c77, 0x0c92, 0x0cb0, 0x0cc5, 0x0cd7, - 0x0ce9, 0x0d01, 0x0d10, 0x0d2e, 0x0d3d, 0x0d5e, 0x0d70, 0x0da3, - 0x0dca, 0x0df4, 0x0e0c, 0x0e1b, 0x0e27, 0x0e45, 0x0e51, 0x0e63, - 0x0e78, 0x0e8a, 0x0ea2, 0x0eb7, 0x0ecf, 0x0edb, 0x0ee4, 0x0ef3, - 0x0f08, 0x0f1d, 0x0f23, 0x0f59, 0x0f77, 0x0f89, 0x0fb3, 0x100b, - 0x1011, 0x102c, 0x1074, 0x1086, 0x109e, 0x10c8, 0x10d7, 0x1110, -} // Size: 376 bytes - -const trScriptStr string = "" + // Size: 1504 bytes - "AfakaKafkas AlbanyasıArapİmparatorluk AramicesiErmeniAvestaBali DiliBamu" + - "mBassa VahBatakBengalBlis SembolleriBopomofoBrahmiBrailleBugisBuhidChakm" + - "aUCASKaryaChamÇerokiCirthKıptiKıbrısKirilEski Kilise Slavcası KirilDevan" + - "agariDeseretDuployé StenografiDemotik MısırHiyeratik MısırMısır Hiyerogl" + - "ifleriElbasanEtiyopyaHutsuri GürcüGürcüGlagolitGotikGranthaYunanGüceratG" + - "urmukhiHanbHangılHanHanunooBasitleştirilmiş HanGeleneksel HanİbraniHirag" + - "anaAnadolu HiyeroglifleriPahavh HmongKatakana veya HiraganaEski MacarInd" + - "usEski İtalyanJamoCava DiliJaponJurchenKayah LiKatakanaKharoshthiKmerKho" + - "jkiKannadaKoreKpelleKaithiLannaLaoFraktur LatinGael LatinLatinLepchaLimb" + - "uLineer ALineer BFraserLomaLikyaLidyaMahajaniMandenManiMaya Hiyeroglifle" + - "riMendeMeroitik El YazısıMeroitikMalayalamModiMoğolMoonMroMeitei MayekBu" + - "rmaEski Kuzey ArapNebatiNaksi GebaN’KoNüshuOghamOl ChikiOrhunOriyaOsmany" + - "aPalmiraPau Cin HauEski PermikPhags-paPehlevi Kitabe DiliPsalter Pehlevi" + - "Kitap Pehlevi DiliFenikePollard FonetikPartça Kitabe DiliRejangRongorong" + - "oRunikSamaritSaratiEski Güney ArapSaurashtraİşaret DiliShavianSharadaSid" + - "dhamKhudabadiSeylanSora SompengSundaSyloti NagriSüryaniEstrangela Süryan" + - "iBatı SüryaniDoğu SüryaniTagbanvaTakriTai LeNew Tai LueTamilTangutTai Vi" + - "etTeluguTengvarTifinaghTakalotThaanaTayTibetTirhutaUgarit Çivi YazısıVai" + - "Konuşma Sesleri ÇizimlemesiVarang KshitiWoleaiEski FarsSümer-Akad Çivi Y" + - "azısıYiKalıtsalMatematiksel GösterimEmojiSembolYazılı OlmayanOrtakBilinm" + - "eyen Alfabe" - -var trScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x0016, 0x0016, 0x001a, 0x0031, 0x0037, - 0x003d, 0x0046, 0x004b, 0x0054, 0x0059, 0x005f, 0x005f, 0x006e, - 0x0076, 0x007c, 0x0083, 0x0088, 0x008d, 0x0093, 0x0097, 0x009c, - 0x00a0, 0x00a7, 0x00ac, 0x00b2, 0x00ba, 0x00bf, 0x00da, 0x00e4, - 0x00eb, 0x00fe, 0x010d, 0x011e, 0x0134, 0x013b, 0x0143, 0x0152, - 0x0159, 0x0161, 0x0166, 0x016d, 0x0172, 0x017a, 0x0182, 0x0186, - 0x018d, 0x0190, 0x0197, 0x01ad, 0x01bb, 0x01bb, 0x01c2, 0x01ca, - 0x01e0, 0x01ec, 0x0202, 0x020c, 0x0211, 0x021e, 0x0222, 0x022b, - // Entry 40 - 7F - 0x0230, 0x0237, 0x023f, 0x0247, 0x0251, 0x0255, 0x025b, 0x0262, - 0x0266, 0x026c, 0x0272, 0x0277, 0x027a, 0x0287, 0x0291, 0x0296, - 0x029c, 0x02a1, 0x02a9, 0x02b1, 0x02b7, 0x02bb, 0x02c0, 0x02c5, - 0x02cd, 0x02d3, 0x02d7, 0x02d7, 0x02ea, 0x02ef, 0x0303, 0x030b, - 0x0314, 0x0318, 0x031e, 0x0322, 0x0325, 0x0331, 0x0331, 0x0336, - 0x0345, 0x034b, 0x034b, 0x0355, 0x035b, 0x0361, 0x0366, 0x036e, - 0x0373, 0x0378, 0x0378, 0x037f, 0x0386, 0x0391, 0x039c, 0x03a4, - 0x03b7, 0x03c6, 0x03d8, 0x03de, 0x03ed, 0x0400, 0x0406, 0x0410, - // Entry 80 - BF - 0x0415, 0x041c, 0x0422, 0x0432, 0x043c, 0x0449, 0x0450, 0x0457, - 0x045e, 0x0467, 0x046d, 0x0479, 0x047e, 0x048a, 0x0492, 0x04a5, - 0x04b3, 0x04c1, 0x04c9, 0x04ce, 0x04d4, 0x04df, 0x04e4, 0x04ea, - 0x04f2, 0x04f8, 0x04ff, 0x0507, 0x050e, 0x0514, 0x0517, 0x051c, - 0x0523, 0x0538, 0x053b, 0x0558, 0x0565, 0x056b, 0x0574, 0x058e, - 0x0590, 0x0599, 0x05af, 0x05b4, 0x05ba, 0x05ca, 0x05cf, 0x05e0, -} // Size: 376 bytes - -const ukScriptStr string = "" + // Size: 2950 bytes - "афакакавказька албанськаахомарабицяармівірменськаавестійськийбалійськийб" + - "амумбассабатакбенгальськасимволи Бліссабопомофобрахмішрифт Брайлябугійс" + - "ькийбухідчакмауніфіковані символи канадських тубільцівкаріанськийхамітс" + - "ькийчерокікирткоптськийкіпрськийкирилицядавньоцерковнословʼянськийдеван" + - "агарідезеретєгипетський демотичнийєгипетський ієратичнийєгипетський ієр" + - "огліфічнийефіопськакхутсурігрузинськаглаголичнийготичнийгрецькагуджарат" + - "ігурмухіханьхангилькитайськаханунукитайська спрощенакитайська традиційн" + - "аівритхіраганапахау хмонгяпонські силабаріїдавньоугорськийхарапськийдав" + - "ньоіталійськийчамояванськийяпонськакая лікатаканакхароштхікхмерськаканн" + - "адакорейськакаїтіланналаоськалатинський фрактурнийлатинський гельськийл" + - "атиницялепчалімбулінійний Алінійний Вабетка Фрейзераломалікійськийлідій" + - "ськиймандейськийманіхейськиймайя ієрогліфічниймероїтськиймалаяламськамо" + - "нгольськамунмейтей майєкмʼянмськанкоогамічнийсантальськийорхонськийорія" + - "османськийдавньопермськийпхагс-папехлеві написівпехлеві релігійнийпехле" + - "ві літературнийфінікійськийписемність Поллардапарфянськийреджангронго-р" + - "онгорунічнийсамаритянськийсаратісаураштразнаковийшоусингальськасундансь" + - "кийсілоті нагрісирійськийдавньосирійський естрангелодавньосирійський за" + - "хіднийдавньосирійський східнийтагбанватай-ліновий тайський луетамільськ" + - "атангуттай-вʼєттелугутенгвартифінагтагальськийтаанатайськатибетськаугар" + - "итськийваївидиме мовленнядавньоперськийшумеро-аккадський клінописйїуспа" + - "дкованаматематичнаемодзісимвольнабезписемназвичайнаневідома система пис" + - "ьма" - -var ukScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000a, 0x002f, 0x0037, 0x0045, 0x004d, 0x0061, - 0x0079, 0x008d, 0x0097, 0x00a1, 0x00ab, 0x00c1, 0x00c1, 0x00dc, - 0x00ec, 0x00f8, 0x010f, 0x0123, 0x012d, 0x0137, 0x0184, 0x019a, - 0x01ae, 0x01ba, 0x01c2, 0x01d4, 0x01e6, 0x01f6, 0x022a, 0x023e, - 0x024c, 0x024c, 0x0277, 0x02a2, 0x02d3, 0x02d3, 0x02e5, 0x02f5, - 0x0309, 0x031f, 0x032f, 0x032f, 0x033d, 0x034f, 0x035d, 0x0365, - 0x0373, 0x0385, 0x0391, 0x03b4, 0x03db, 0x03db, 0x03e5, 0x03f5, - 0x03f5, 0x040a, 0x042d, 0x044b, 0x045f, 0x0481, 0x0489, 0x049b, - // Entry 40 - 7F - 0x04ab, 0x04ab, 0x04b6, 0x04c6, 0x04d8, 0x04ea, 0x04ea, 0x04f8, - 0x050a, 0x050a, 0x0514, 0x051e, 0x052c, 0x0555, 0x057c, 0x058c, - 0x0596, 0x05a0, 0x05b3, 0x05c6, 0x05e3, 0x05eb, 0x05ff, 0x0613, - 0x0613, 0x0629, 0x0641, 0x0641, 0x0664, 0x0664, 0x0664, 0x067a, - 0x0692, 0x0692, 0x06a8, 0x06ae, 0x06ae, 0x06c5, 0x06c5, 0x06d7, - 0x06d7, 0x06d7, 0x06d7, 0x06d7, 0x06dd, 0x06dd, 0x06ef, 0x0707, - 0x071b, 0x0723, 0x0723, 0x0737, 0x0737, 0x0737, 0x0755, 0x0764, - 0x0781, 0x07a4, 0x07cb, 0x07e3, 0x0808, 0x081e, 0x082c, 0x0841, - // Entry 80 - BF - 0x0851, 0x086d, 0x0879, 0x0879, 0x088b, 0x089b, 0x08a1, 0x08a1, - 0x08a1, 0x08a1, 0x08b7, 0x08b7, 0x08cd, 0x08e4, 0x08f8, 0x092d, - 0x095e, 0x098d, 0x099d, 0x099d, 0x09a8, 0x09ca, 0x09de, 0x09ea, - 0x09f9, 0x0a05, 0x0a13, 0x0a21, 0x0a37, 0x0a41, 0x0a4f, 0x0a61, - 0x0a61, 0x0a77, 0x0a7d, 0x0a9a, 0x0a9a, 0x0a9a, 0x0ab6, 0x0ae8, - 0x0aec, 0x0b02, 0x0b18, 0x0b24, 0x0b36, 0x0b4a, 0x0b5a, 0x0b86, -} // Size: 376 bytes - -const urScriptStr string = "" + // Size: 579 bytes - "عربیآرمینیائیبنگالیبوپوموفوبریلسیریلکدیوناگریایتھوپیائیجارجیائییونانیگجر" + - "اتیگرمکھیہینبہنگولہانآسان ہانروایتی ہانعبرانیہیراگیناجاپانی سیلابریزجام" + - "وجاپانیکٹاکاناخمیرکنڑکوریائیلاؤلاطینیملیالممنگولیائیمیانماراڑیہسنہالاتم" + - "لتیلگوتھاناتھائیتبتیریاضی کی علامتیںایموجیعلاماتغیر تحریر شدہعامنامعلوم" + - " رسم الخط" - -var urScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x001a, - 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x0026, 0x0026, 0x0026, - 0x0036, 0x0036, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, - 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x004a, 0x004a, 0x005a, - 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x006e, 0x006e, - 0x007e, 0x007e, 0x007e, 0x007e, 0x008a, 0x0096, 0x00a2, 0x00aa, - 0x00b4, 0x00ba, 0x00ba, 0x00c9, 0x00dc, 0x00dc, 0x00e8, 0x00f8, - 0x00f8, 0x00f8, 0x0115, 0x0115, 0x0115, 0x0115, 0x011d, 0x011d, - // Entry 40 - 7F - 0x0129, 0x0129, 0x0129, 0x0137, 0x0137, 0x013f, 0x013f, 0x0145, - 0x0153, 0x0153, 0x0153, 0x0153, 0x0159, 0x0159, 0x0159, 0x0165, - 0x0165, 0x0165, 0x0165, 0x0165, 0x0165, 0x0165, 0x0165, 0x0165, - 0x0165, 0x0165, 0x0165, 0x0165, 0x0165, 0x0165, 0x0165, 0x0165, - 0x0171, 0x0171, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0191, - 0x0191, 0x0191, 0x0191, 0x0191, 0x0191, 0x0191, 0x0191, 0x0191, - 0x0191, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - // Entry 80 - BF - 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, - 0x0199, 0x0199, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, - 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01ab, 0x01ab, - 0x01ab, 0x01b5, 0x01b5, 0x01b5, 0x01b5, 0x01bf, 0x01c9, 0x01d1, - 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, - 0x01d1, 0x01d1, 0x01ef, 0x01fb, 0x0207, 0x021f, 0x0225, 0x0243, -} // Size: 376 bytes - -const uzScriptStr string = "" + // Size: 321 bytes - "arabarmanbengalbopomofobraylkirilldevanagarihabashgruzingrekgujarotgurmu" + - "kxihanbhangulxitoysoddalashgan xitoyan’anaviy xitoyivrithiraganakatakana" + - " yoki hiraganajamoyaponkatakanakxmerkannadakoreyslaoslotinmalayalammongo" + - "lmyanmaoriyasingaltamiltelugutaanataytibetmatematik ifodalaremojibelgila" + - "ryozuvsizumumiynoma’lum yozuv" - -var uzScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0004, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x000f, 0x000f, 0x000f, - 0x0017, 0x0017, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, - 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x0022, 0x0022, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x0032, 0x0032, - 0x0038, 0x0038, 0x0038, 0x0038, 0x003c, 0x0043, 0x004b, 0x004f, - 0x0055, 0x005a, 0x005a, 0x006c, 0x007d, 0x007d, 0x0082, 0x008a, - 0x008a, 0x008a, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a4, 0x00a4, - // Entry 40 - 7F - 0x00a9, 0x00a9, 0x00a9, 0x00b1, 0x00b1, 0x00b6, 0x00b6, 0x00bd, - 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c7, 0x00c7, 0x00c7, 0x00cc, - 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, - 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, - 0x00d5, 0x00d5, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00e1, - 0x00e1, 0x00e1, 0x00e1, 0x00e1, 0x00e1, 0x00e1, 0x00e1, 0x00e1, - 0x00e1, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, - 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, - // Entry 80 - BF - 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, - 0x00e6, 0x00e6, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, - 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00f1, 0x00f1, - 0x00f1, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00fc, 0x00ff, 0x0104, - 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, - 0x0104, 0x0104, 0x0116, 0x011b, 0x0123, 0x012b, 0x0131, 0x0141, -} // Size: 376 bytes - -const viScriptStr string = "" + // Size: 2528 bytes - "Chữ AfakaChữ Ả RậpChữ Imperial AramaicChữ ArmeniaChữ AvestanChữ BaliChữ " + - "BamumChữ Bassa VahChữ BatakChữ BangladeshChữ BlissymbolsChữ BopomofoChữ " + - "BrahmiChữ nổi BrailleChữ BuginChữ BuhidChữ ChakmaÂm tiết Thổ dân Canada " + - "Hợp nhấtChữ CariaChữ ChămChữ CherokeeChữ CirthChữ CopticChứ SípChữ Kirin" + - "Chữ Kirin Slavơ Nhà thờ cổChữ DevanagariChữ DeseretChữ tốc ký DuployanCh" + - "ữ Ai Cập bình dânChữ Ai Cập thày tuChữ tượng hình Ai CậpChữ EthiopiaCh" + - "ữ Khutsuri GeorgiaChữ GruziaChữ GlagoliticChữ Gô-tíchChữ GranthaChữ Hy" + - " LạpChữ GujaratiChữ GurmukhiChữ HanbChữ HangulChữ HánChữ HanunooChữ Hán " + - "giản thểChữ Hán phồn thểChữ Do TháiChữ HiraganaChữ tượng hình AnatoliaCh" + - "ữ Pahawh HmongBảng ký hiệu âm tiết Tiếng NhậtChữ Hungary cổChữ IndusCh" + - "ữ Italic cổChữ JamoChữ JavaChữ Nhật BảnChữ JurchenChữ Kayah LiChữ Kata" + - "kanaChữ KharoshthiChữ Khơ-meChữ KhojkiChữ KannadaChữ Hàn QuốcChữ KpelleC" + - "hữ KaithiChữ LannaChữ LàoChữ La-tinh FrakturChữ La-tinh Xcốt-lenChữ La t" + - "inhChữ LepchaChữ LimbuChữ Linear AChữ Linear BChữ FraserChữ LomaChữ Lyci" + - "aChữ LydiaChữ MandaeanChữ ManichaeanChữ tượng hình MayaChữ MendeChữ Mero" + - "itic Nét thảoChữ MeroiticChữ MalayalamChữ Mông CổChữ nổi MoonChữ MroChữ " + - "Meitei MayekChữ MyanmarChữ Bắc Ả Rập cổChữ NabataeanChữ Naxi GebaChữ N’K" + - "oChữ NüshuChữ OghamChữ Ol ChikiChữ OrkhonChữ OdiaChữ OsmanyaChữ Palmyren" + - "eChữ Permic cổChữ Phags-paChữ Pahlavi Văn biaChữ Pahlavi Thánh caChữ Pah" + - "lavi SáchChữ PhoeniciaNgữ âm PollardChữ Parthia Văn biaChữ RejangChữ Ron" + - "gorongoChữ RunicChữ SamaritanChữ SaratiChữ Nam Ả Rập cổChữ SaurashtraChữ" + - " viết Ký hiệuChữ ShavianChữ SharadaChữ KhudawadiChữ SinhalaChữ Sora Somp" + - "engChữ Xu-đăngChữ Syloti NagriChữ SyriaChữ Estrangelo SyriacChữ Tây Syri" + - "aChữ Đông SyriaChữ TagbanwaChữ TakriChữ Thái NaChữ Thái Lặc mớiChữ Tamil" + - "Chữ TangutChữ Thái ViệtChữ TeluguChữ TengwarChữ TifinaghChữ TagalogChữ T" + - "haanaChữ TháiChữ Tây TạngChữ TirhutaChữ UgaritChữ VaiTiếng nói Nhìn thấy" + - " đượcChữ Varang KshitiChữ WoleaiChữ Ba Tư cổChữ hình nêm Sumero-Akkadian" + - "Chữ DiChữ Kế thừaKý hiệu Toán họcBiểu tượngKý hiệuChưa có chữ viếtChungC" + - "hữ viết không xác định" - -var viScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000b, 0x000b, 0x000b, 0x001a, 0x0030, 0x003d, - 0x004a, 0x0054, 0x005f, 0x006e, 0x0079, 0x0089, 0x0089, 0x009a, - 0x00a8, 0x00b4, 0x00c7, 0x00d2, 0x00dd, 0x00e9, 0x0112, 0x011d, - 0x0128, 0x0136, 0x0141, 0x014d, 0x0157, 0x0162, 0x0184, 0x0194, - 0x01a1, 0x01b9, 0x01d2, 0x01e9, 0x0206, 0x0206, 0x0214, 0x022a, - 0x0236, 0x0246, 0x0255, 0x0262, 0x0270, 0x027e, 0x028c, 0x0296, - 0x02a2, 0x02ac, 0x02b9, 0x02d0, 0x02e7, 0x02e7, 0x02f5, 0x0303, - 0x0320, 0x0332, 0x035d, 0x036f, 0x037a, 0x038b, 0x0395, 0x039f, - // Entry 40 - 7F - 0x03b1, 0x03be, 0x03cc, 0x03da, 0x03ea, 0x03f7, 0x0403, 0x0410, - 0x0421, 0x042d, 0x0439, 0x0444, 0x044e, 0x0463, 0x047b, 0x0488, - 0x0494, 0x049f, 0x04ad, 0x04bb, 0x04c7, 0x04d1, 0x04dc, 0x04e7, - 0x04e7, 0x04f5, 0x0505, 0x0505, 0x051e, 0x0529, 0x0543, 0x0551, - 0x0560, 0x0560, 0x0570, 0x0580, 0x0589, 0x059b, 0x059b, 0x05a8, - 0x05c2, 0x05d1, 0x05d1, 0x05e0, 0x05ec, 0x05f8, 0x0603, 0x0611, - 0x061d, 0x0627, 0x0627, 0x0634, 0x0643, 0x0643, 0x0654, 0x0662, - 0x0678, 0x068f, 0x06a2, 0x06b1, 0x06c2, 0x06d8, 0x06e4, 0x06f4, - // Entry 80 - BF - 0x06ff, 0x070e, 0x071a, 0x0732, 0x0742, 0x0759, 0x0766, 0x0773, - 0x0773, 0x0782, 0x078f, 0x07a1, 0x07b0, 0x07c2, 0x07cd, 0x07e4, - 0x07f4, 0x0806, 0x0814, 0x081f, 0x082d, 0x0844, 0x084f, 0x085b, - 0x086d, 0x0879, 0x0886, 0x0894, 0x08a1, 0x08ad, 0x08b8, 0x08c9, - 0x08d6, 0x08e2, 0x08eb, 0x090d, 0x0920, 0x092c, 0x093d, 0x095d, - 0x0965, 0x0976, 0x098c, 0x099b, 0x09a5, 0x09bb, 0x09c0, 0x09e0, -} // Size: 376 bytes - -const zhScriptStr string = "" + // Size: 2277 bytes - "Adlm阿法卡文AghbAhom阿拉伯文皇室亚拉姆文亚美尼亚文阿维斯陀文巴厘文巴姆穆文巴萨文巴塔克文孟加拉文Bhks布列斯符号汉语拼音婆罗米文字" + - "布莱叶盲文布吉文布希德文查克马文加拿大土著统一音节卡里亚文占文切罗基文色斯文克普特文塞浦路斯文西里尔文西里尔文字(古教会斯拉夫文的变体)天城" + - "文德塞莱特文杜普洛伊速记后期埃及文古埃及僧侣书写体古埃及象形文厄尔巴埃塞俄比亚文格鲁吉亚文(教堂体)格鲁吉亚文格拉哥里文哥特文格兰塔文希腊文" + - "古吉拉特文果鲁穆奇文汉语注音谚文汉字汉奴罗文简体中文繁体中文Hatr希伯来文平假名安那托利亚象形文字杨松录苗文片假名或平假名古匈牙利文古希腊" + - "哈拉潘古意大利文韩文字母爪哇文日文女真文克耶李文字片假名卡罗须提文高棉文克吉奇文字卡纳达文韩文克佩列文凯提文兰拿文老挝文拉丁文(哥特式字体变" + - "体)拉丁文(盖尔文变体)拉丁文雷布查文林布文线形文字(A)线形文字(B)傈僳文洛马文利西亚文吕底亚文Mahj阿拉米文摩尼教文Marc玛雅圣符" + - "文门迪文麦罗埃草书麦若提克文马拉雅拉姆文Modi蒙古文韩文语系谬文曼尼普尔文Mult缅甸文古北方阿拉伯文纳巴泰文Newa纳西格巴文西非书面文" + - "字(N’Ko)女书欧甘文桑塔利文鄂尔浑文奥里亚文Osge奥斯曼亚文帕尔迈拉文Pauc古彼尔姆文八思巴文巴列维文碑铭体巴列维文(圣诗体)巴列维" + - "文(书体)腓尼基文波拉德音标文字帕提亚文碑铭体拉让文朗格朗格文古代北欧文撒马利亚文沙拉堤文古南阿拉伯文索拉什特拉文书写符号萧伯纳式文夏拉达文" + - "悉昙信德文僧伽罗文索朗桑朋文巽他文锡尔赫特文叙利亚文福音体叙利亚文西叙利亚文东叙利亚文塔格班瓦文泰克里文泰乐文新傣文泰米尔文唐古特文越南傣文" + - "泰卢固文腾格瓦文字提非纳文塔加路文塔安那文泰文藏文迈蒂利文乌加里特文瓦依文可见语言瓦郎奇蒂文字沃莱艾文古波斯文苏美尔-阿卡德楔形文字彝文遗传" + - "学术语数学符号绘文字符号非书面文字通用未知文字" - -var zhScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0004, 0x0010, 0x0014, 0x0018, 0x0024, 0x0036, 0x0045, - 0x0054, 0x005d, 0x0069, 0x0072, 0x007e, 0x008a, 0x008e, 0x009d, - 0x00a9, 0x00b8, 0x00c7, 0x00d0, 0x00dc, 0x00e8, 0x0103, 0x010f, - 0x0115, 0x0121, 0x012a, 0x0136, 0x0145, 0x0151, 0x0184, 0x018d, - 0x019c, 0x01ae, 0x01bd, 0x01d5, 0x01e7, 0x01f0, 0x0202, 0x0220, - 0x022f, 0x023e, 0x0247, 0x0253, 0x025c, 0x026b, 0x027a, 0x0286, - 0x028c, 0x0292, 0x029e, 0x02aa, 0x02b6, 0x02ba, 0x02c6, 0x02cf, - 0x02ea, 0x02f9, 0x030e, 0x031d, 0x032f, 0x033e, 0x034a, 0x0353, - // Entry 40 - 7F - 0x0359, 0x0362, 0x0371, 0x037a, 0x0389, 0x0392, 0x03a1, 0x03ad, - 0x03b3, 0x03bf, 0x03c8, 0x03d1, 0x03da, 0x03fe, 0x041c, 0x0425, - 0x0431, 0x043a, 0x044d, 0x0460, 0x0469, 0x0472, 0x047e, 0x048a, - 0x048e, 0x049a, 0x04a6, 0x04aa, 0x04b9, 0x04c2, 0x04d1, 0x04e0, - 0x04f2, 0x04f6, 0x04ff, 0x050b, 0x0511, 0x0520, 0x0524, 0x052d, - 0x0542, 0x054e, 0x0552, 0x0561, 0x057f, 0x0585, 0x058e, 0x059a, - 0x05a6, 0x05b2, 0x05b6, 0x05c5, 0x05d4, 0x05d8, 0x05e7, 0x05f3, - 0x0608, 0x0623, 0x063b, 0x0647, 0x065c, 0x0671, 0x067a, 0x0689, - // Entry 80 - BF - 0x0698, 0x06a7, 0x06b3, 0x06c5, 0x06d7, 0x06e3, 0x06f2, 0x06fe, - 0x0704, 0x070d, 0x0719, 0x0728, 0x0731, 0x0740, 0x074c, 0x0761, - 0x0770, 0x077f, 0x078e, 0x079a, 0x07a3, 0x07ac, 0x07b8, 0x07c4, - 0x07d0, 0x07dc, 0x07eb, 0x07f7, 0x0803, 0x080f, 0x0815, 0x081b, - 0x0827, 0x0836, 0x083f, 0x084b, 0x085d, 0x0869, 0x0875, 0x0894, - 0x089a, 0x08a9, 0x08b5, 0x08be, 0x08c4, 0x08d3, 0x08d9, 0x08e5, -} // Size: 376 bytes - -const zhHantScriptStr string = "" + // Size: 2460 bytes - "阿法卡文字高加索阿爾巴尼亞文阿拉伯文皇室亞美尼亞文亞美尼亞文阿維斯陀文峇里文巴姆穆文巴薩文巴塔克文孟加拉文布列斯文注音符號婆羅米文盲人用點字布吉" + - "斯文布希德文查克馬文加拿大原住民通用字符卡里亞文占文柴羅基文色斯文科普特文塞浦路斯文斯拉夫文西里爾文(古教會斯拉夫文變體)天城文德瑟雷特文杜" + - "普洛伊速記古埃及世俗體古埃及僧侶體古埃及象形文字愛爾巴桑文衣索比亞文喬治亞語系(阿索他路里和努斯克胡里文)喬治亞文格拉哥里文歌德文格蘭他文字" + - "希臘文古吉拉特文古魯穆奇文標上注音符號的漢字韓文字漢字哈努諾文簡體中文繁體中文希伯來文平假名安那托利亞象形文字楊松錄苗文片假名或平假名古匈牙" + - "利文印度河流域(哈拉帕文)古意大利文韓文字母爪哇文日文女真文字克耶李文片假名卡羅須提文高棉文克吉奇文字坎那達文韓文克培列文凱提文藍拿文寮國文" + - "拉丁文(尖角體活字變體)拉丁文(蓋爾語變體)拉丁文雷布查文林佈文線性文字(A)線性文字(B)栗僳文洛馬文呂西亞語里底亞語曼底安文摩尼教文瑪雅" + - "象形文字門德文麥羅埃文(曲線字體)麥羅埃文馬來亞拉姆文蒙古文蒙氏點字謬文曼尼普爾文緬甸文古北阿拉伯文納巴泰文字納西格巴文西非書面語言 (N’" + - "Ko)女書文字歐甘文桑塔利文鄂爾渾文歐利亞文歐斯曼亞文帕米瑞拉文字古彼爾姆諸文八思巴文巴列維文(碑銘體)巴列維文(聖詩體)巴列維文(書體)腓尼基" + - "文柏格理拼音符帕提亞文(碑銘體)拉讓文朗格朗格象形文古北歐文字撒馬利亞文沙拉堤文古南阿拉伯文索拉什特拉文手語書寫符號簫柏納字符夏拉達文悉曇文" + - "字信德文錫蘭文索朗桑朋文字巽他文希洛弟納格里文敍利亞文敘利亞文(福音體文字變體)敘利亞文(西方文字變體)敘利亞文(東方文字變體)南島文塔卡里" + - "文字傣哪文西雙版納新傣文坦米爾文西夏文傣擔文泰盧固文談格瓦文提非納文塔加拉文塔安那文泰文西藏文邁蒂利文烏加列文瓦依文視覺語音文字瓦郎奇蒂文字" + - "沃雷艾文古波斯文蘇米魯亞甲文楔形文字彞文繼承文字(Unicode)數學符號表情符號符號非書寫語言一般文字未知文字" - -var zhHantScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000f, 0x002a, 0x002a, 0x0036, 0x004b, 0x005a, - 0x0069, 0x0072, 0x007e, 0x0087, 0x0093, 0x009f, 0x009f, 0x00ab, - 0x00b7, 0x00c3, 0x00d2, 0x00de, 0x00ea, 0x00f6, 0x0114, 0x0120, - 0x0126, 0x0132, 0x013b, 0x0147, 0x0156, 0x0162, 0x018f, 0x0198, - 0x01a7, 0x01b9, 0x01cb, 0x01dd, 0x01f2, 0x0201, 0x0210, 0x0249, - 0x0255, 0x0264, 0x026d, 0x027c, 0x0285, 0x0294, 0x02a3, 0x02be, - 0x02c7, 0x02cd, 0x02d9, 0x02e5, 0x02f1, 0x02f1, 0x02fd, 0x0306, - 0x0321, 0x0330, 0x0345, 0x0354, 0x0375, 0x0384, 0x0390, 0x0399, - // Entry 40 - 7F - 0x039f, 0x03ab, 0x03b7, 0x03c0, 0x03cf, 0x03d8, 0x03e7, 0x03f3, - 0x03f9, 0x0405, 0x040e, 0x0417, 0x0420, 0x0444, 0x0462, 0x046b, - 0x0477, 0x0480, 0x0493, 0x04a6, 0x04af, 0x04b8, 0x04c4, 0x04d0, - 0x04d0, 0x04dc, 0x04e8, 0x04e8, 0x04fa, 0x0503, 0x0521, 0x052d, - 0x053f, 0x053f, 0x0548, 0x0554, 0x055a, 0x0569, 0x0569, 0x0572, - 0x0584, 0x0593, 0x0593, 0x05a2, 0x05bd, 0x05c9, 0x05d2, 0x05de, - 0x05ea, 0x05f6, 0x05f6, 0x0605, 0x0617, 0x0617, 0x0629, 0x0635, - 0x0650, 0x066b, 0x0683, 0x068f, 0x06a1, 0x06bc, 0x06c5, 0x06da, - // Entry 80 - BF - 0x06e9, 0x06f8, 0x0704, 0x0716, 0x0728, 0x073a, 0x0749, 0x0755, - 0x0761, 0x076a, 0x0773, 0x0785, 0x078e, 0x07a3, 0x07af, 0x07d6, - 0x07fa, 0x081e, 0x0827, 0x0836, 0x083f, 0x0854, 0x0860, 0x0869, - 0x0872, 0x087e, 0x088a, 0x0896, 0x08a2, 0x08ae, 0x08b4, 0x08bd, - 0x08c9, 0x08d5, 0x08de, 0x08f0, 0x0902, 0x090e, 0x091a, 0x0938, - 0x093e, 0x0957, 0x0963, 0x096f, 0x0975, 0x0984, 0x0990, 0x099c, -} // Size: 376 bytes - -const zuScriptStr string = "" + // Size: 504 bytes - "isi-Arabicisi-Armenianisi-Banglaisi-Bopomofoi-Brailleisi-Cyrillicisi-Dev" + - "anagariisi-Ethiopicisi-Georgianisi-Greekisi-Gujaratiisi-Gurmukhiisi-Hanb" + - "isi-Hangulisi-Hanisi-Han esenziwe lulaisi-Han sosikoisi-Hebrewisi-Hiraga" + - "nai-Japanese syllabariesisi-Jamoisi-Japaneseisi-Katakanaisi-Khmerisi-Kan" + - "nadaisi-Koreanisi-Laoisi-Latinisi-Malayalamisi-Mongolianisi-Myanmarisi-O" + - "diaisi-Sinhalaisi-Tamilisi-Teluguisi-Thaanaisi-Thaii-Tibetani-Mathematic" + - "al Notationi-Emojiamasimbuliokungabhaliwejwayelekileiskripthi esingaziwa" - -var zuScriptIdx = []uint16{ // 176 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x0016, - 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0020, 0x0020, 0x0020, - 0x002c, 0x002c, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0041, 0x0041, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x005b, 0x005b, - 0x0067, 0x0067, 0x0067, 0x0067, 0x0070, 0x007c, 0x0088, 0x0090, - 0x009a, 0x00a1, 0x00a1, 0x00b6, 0x00c4, 0x00c4, 0x00ce, 0x00da, - 0x00da, 0x00da, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f8, 0x00f8, - // Entry 40 - 7F - 0x0104, 0x0104, 0x0104, 0x0110, 0x0110, 0x0119, 0x0119, 0x0124, - 0x012e, 0x012e, 0x012e, 0x012e, 0x0135, 0x0135, 0x0135, 0x013e, - 0x013e, 0x013e, 0x013e, 0x013e, 0x013e, 0x013e, 0x013e, 0x013e, - 0x013e, 0x013e, 0x013e, 0x013e, 0x013e, 0x013e, 0x013e, 0x013e, - 0x014b, 0x014b, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0163, - 0x0163, 0x0163, 0x0163, 0x0163, 0x0163, 0x0163, 0x0163, 0x0163, - 0x0163, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, - 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, - // Entry 80 - BF - 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, - 0x016b, 0x016b, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, - 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x017f, 0x017f, - 0x017f, 0x0189, 0x0189, 0x0189, 0x0189, 0x0193, 0x019b, 0x01a4, - 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, - 0x01a4, 0x01a4, 0x01bb, 0x01c2, 0x01cc, 0x01d9, 0x01e4, 0x01f8, -} // Size: 376 bytes - -// Total size for script: 242449 bytes (242 KB) - -// Number of keys: 291 -var ( - regionIndex = tagIndex{ - "ACADAEAFAGAIALAMAOAQARASATAUAWAXAZBABBBDBEBFBGBHBIBJBLBMBNBOBQBRBSBTBVBW" + - "BYBZCACCCDCFCGCHCICKCLCMCNCOCPCRCUCVCWCXCYCZDEDGDJDKDMDODZEAECEEEGEH" + - "ERESETEUEZFIFJFKFMFOFRGAGBGDGEGFGGGHGIGLGMGNGPGQGRGSGTGUGWGYHKHMHNHR" + - "HTHUICIDIEILIMINIOIQIRISITJEJMJOJPKEKGKHKIKMKNKPKRKWKYKZLALBLCLILKLR" + - "LSLTLULVLYMAMCMDMEMFMGMHMKMLMMMNMOMPMQMRMSMTMUMVMWMXMYMZNANCNENFNGNI" + - "NLNONPNRNUNZOMPAPEPFPGPHPKPLPMPNPRPSPTPWPYQAQORERORSRURWSASBSCSDSESG" + - "SHSISJSKSLSMSNSOSRSSSTSVSXSYSZTATCTDTFTGTHTJTKTLTMTNTOTRTTTVTWTZUAUG" + - "UMUNUSUYUZVAVCVEVGVIVNVUWFWSXKYEYTZAZMZWZZ", - "001002003005009011013014015017018019021029030034035039053054057061142143" + - "145150151154155419", - "", - } -) - -var regionHeaders = [252]header{ - { // af - afRegionStr, - afRegionIdx, - }, - { // agq - "ÀndolàYùnaetɛ Alab ɛmelɛ̀Àfɨ̀ganìsɨ̀tânÀntigwà à BàbudàÀŋgwilàÀabɛnìaÀmɛ" + - "nyìaÀŋgolàÀdzɛ̀ntinàÀmɛlekan SamwàUsɨtɨ̀làÙsɨ̀tɛ̀lɛlìaÀlubàÀzɨbɛ̀dzâ" + - "nBosɨnyìa à Hɛ̀zɛ̀gòvinàBàbadòsBaŋgɨ̀làdɛ̂BɛɛdzwùmBùkinà FasòBùugɛlì" + - "aBàlaenBùlundìBɛ̀nɨ̂ŋBɛ̀mudàBɨ̀lunèBòlevàBɨ̀làzîiBàhamàsMbutànBòtɨ̀s" + - "wǎnàBɛlàlûsBɛ̀lezɨ̀KanadàDɛ̀mùkàlatì Lèkpubèlè è KuŋgùSɛnta Afɨlekan" + - " LèkpobèlèKuŋgùSuezàlânKu Dɨ̀vûaChwɨla ŋ̀ KûʔChilèKàmàlûŋChaenàKòlom" + - "bìaKòsɨ̀tà LekàKuuwbàChwɨla ŋ̀ Kɛ̀b Vɛ̂ɛSaekpùlùChɛ̂ LèkpubèlèDzaman" + - "èDzìbuwtìDɛnɨmàDòmenekàDòmenekà LèkpubèlèÀadzɛlìaEkwadòÈsɨ̀tonyìaEd" + - "zìÈletɨ̀làSɨ̀kpɛ̂nÈtyǒpìaFɨnlànFidziChwɨlà fɨ FakɨlànMaekòlòneshìaFà" + - "lâŋnsìGàbûnYùnaetɛ Kiŋdɔ̀mGɨ̀lɛnadàDzɔɔdzìaGàyanà è FàlâŋnsìGaanàDzi" + - "bɨ̀latàGɨ̀lenlânGambìaGinèGwadalukpɛ̀Èkwɛ̀tolia GinèGɨ̀lêsGwàtɨ̀malà" + - "GwamGinè BìsawùGùyanàHɔndulàsKòwɛshìaHǎetìHɔŋgàlèÈndòneshìaAelɨ̀lânE" + - "zɨ̀lɛ̂EndìaDɨŋò kɨ dzughùnstòʔ kɨ Endìa kɨ Bɨ̀letì kòÈlâkɨ̀ÈlânAesɨ̀" + - "lânEtalèDzàmɛkàDzodànDzàkpânKɨnyàKìdzisɨ̀tânKàmbodìaKèlèbatiKomolòsS" + - "ɛ̀n Kî à NevìKùulîa, EkùwKùulîa, EmàmKùwɛ̂Chwɨlà ŋ̀ KaemànKàzasɨ̀tâ" + - "nLàwosLɛbanèSɛ̀n LushìaLetɨnshɨ̀nSɨ̀le LaŋkàLàebɛlìaLɛ̀sotùLètwǎnyìa" + - "LuzɨmbùʔLàtɨvaLebìaMòlokòMùnakuMòodovàMàdàgasɨkàChwɨlà fɨ MashàMɨ̀sɨ" + - "̀donyìaMalèMǐanmàMùŋgolìaChwɨlà m̀ Màlǐanà mɨ̀ Ekùw mòMàtìnekìMùlèt" + - "anyìaMùŋtselàMaatàMùleshwɨ̀sMàdivèMàlawìMɛkɨzikùMàlɛshìaMùzàmbîNàmib" + - "ìaKàlèdonyìa È fūghūNaedzàChwɨlà fɨ NufòʔGɨ̀anyɨNikàlagwàNedàlânNoo" + - "wɛ̂ɛNɛkpâaNàwulùNiyuZìlân È fūghūUmànKpanàmaKpɛlûKpoleneshìa è Fàlâŋ" + - "nsìKpakpua Ginè È fūghūFelèkpîKpakìsɨ̀tânKpulànSɛ̀n Kpiyɛ̀ à Mikelɔŋ" + - "Kpitɨ̀kalèKpǒto LekoAdzɨmā kɨ ŋgùŋ kɨ Palɛsɨtɨnyia à kɨ Gazà kòKputu" + - "wgàKpàlawùKpalàgwɛ̂KatàLèyunyɔ̀ŋLùmanyìaLoshìaLùwandàSawudi AlabiChw" + - "ɨlà fɨ Solomwɨ̀nSɛchɛ̀lɛ̀sSùdânSuedɨ̀nSiŋgàkpôoSɛ̀n ÈlenàSɨ̀lòvɨnyì" + - "aSɨ̀lòvɨkɨ̀aSilìa lûŋSàn MàlenùSɛ̀nɛ̀gâaSòmalìaSulènamèSawo Tɔ̀me à " + - "Kpèlènsikpɛ̀EsàvadòSilîaShǔazìlânChwɨla n Tɨtê à KaekùsChâTugùTaelàn" + - "Tàdzikìsɨ̀tânTuwkelawùÊs TaemòTekɨmènèsɨ̀tânTùneshìaTuŋgàTeekìTèlene" + - "dà à TòbagùTuwvalùwTaewànTàanzanyìaYùkɛ̀lɛ̂YùgandàUSAYulùgwɛ̂Yùzɨ̀bɛ" + - "kìsɨ̀tânVatikàn Sɨ̀tɛ̂Sɛ̀n Vinsɨ̀n à Gɨlenadi Ù tēVɛ̀nɛ̀zǔɛɛlàChwɨlà" + - " m̀ Vidzinyìa m̀ Bɨ̀letì mòU. S. Chwɨlà fɨ MbuʔmbuVìyɛnàmVànǔatùwWal" + - "es à FùwtuwnàSàmowàYɛmɛ̀nMàyotìAfɨlekà ghɨ Emàm ghòZambìaZìmbagbɛ̀", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0008, 0x0020, 0x0035, 0x004a, 0x0054, 0x005e, - 0x0068, 0x0071, 0x0071, 0x007f, 0x0090, 0x009c, 0x00af, 0x00b6, - 0x00b6, 0x00c5, 0x00e5, 0x00ee, 0x00ff, 0x010a, 0x0118, 0x0123, - 0x012a, 0x0133, 0x013f, 0x013f, 0x0149, 0x0153, 0x015b, 0x015b, - 0x0167, 0x0170, 0x0177, 0x0177, 0x0186, 0x0190, 0x019c, 0x01a3, - 0x01a3, 0x01cb, 0x01e8, 0x01ef, 0x01f9, 0x0205, 0x0217, 0x021d, - 0x0228, 0x022f, 0x0239, 0x0239, 0x024a, 0x0251, 0x026c, 0x026c, - 0x026c, 0x0276, 0x0289, 0x0291, 0x0291, 0x029b, 0x02a4, 0x02ae, - // Entry 40 - 7F - 0x02c5, 0x02d0, 0x02d0, 0x02d7, 0x02e5, 0x02ea, 0x02ea, 0x02f6, - 0x0302, 0x030c, 0x030c, 0x030c, 0x0314, 0x0319, 0x032f, 0x033f, - 0x033f, 0x034b, 0x0352, 0x0366, 0x0373, 0x037e, 0x0396, 0x0396, - 0x039c, 0x03a9, 0x03b5, 0x03bc, 0x03c1, 0x03ce, 0x03e1, 0x03ea, - 0x03ea, 0x03f8, 0x03fc, 0x040a, 0x0412, 0x0412, 0x0412, 0x041c, - 0x0427, 0x042e, 0x0439, 0x0439, 0x0446, 0x0451, 0x045c, 0x045c, - 0x0462, 0x049a, 0x04a4, 0x04aa, 0x04b5, 0x04bb, 0x04bb, 0x04c5, - 0x04cc, 0x04d5, 0x04dc, 0x04eb, 0x04f5, 0x04ff, 0x0507, 0x051a, - // Entry 80 - BF - 0x0529, 0x0538, 0x0540, 0x0555, 0x0563, 0x0569, 0x0571, 0x057f, - 0x058c, 0x059b, 0x05a6, 0x05b0, 0x05bc, 0x05c7, 0x05cf, 0x05d5, - 0x05dd, 0x05e4, 0x05ed, 0x05ed, 0x05ed, 0x05fb, 0x060e, 0x061f, - 0x0624, 0x062c, 0x0637, 0x0637, 0x065e, 0x0669, 0x0676, 0x0681, - 0x0687, 0x0694, 0x069c, 0x06a4, 0x06af, 0x06ba, 0x06c4, 0x06cd, - 0x06e5, 0x06ec, 0x0700, 0x070a, 0x0715, 0x071e, 0x0728, 0x0730, - 0x0738, 0x073c, 0x074e, 0x0753, 0x075b, 0x0762, 0x077e, 0x0796, - 0x079f, 0x07ae, 0x07b5, 0x07d1, 0x07de, 0x07e9, 0x0822, 0x082b, - // Entry C0 - FF - 0x0834, 0x0840, 0x0845, 0x0845, 0x0852, 0x085c, 0x085c, 0x0863, - 0x086c, 0x0878, 0x0890, 0x089f, 0x08a6, 0x08af, 0x08bb, 0x08c9, - 0x08d9, 0x08d9, 0x08ea, 0x08f6, 0x0903, 0x0911, 0x091a, 0x0924, - 0x0924, 0x0944, 0x094d, 0x094d, 0x0953, 0x095f, 0x095f, 0x097a, - 0x097e, 0x097e, 0x0983, 0x098a, 0x099c, 0x09a6, 0x09b0, 0x09c4, - 0x09ce, 0x09d5, 0x09db, 0x09f1, 0x09fa, 0x0a01, 0x0a0d, 0x0a1a, - 0x0a23, 0x0a23, 0x0a23, 0x0a26, 0x0a31, 0x0a48, 0x0a5b, 0x0a7f, - 0x0a93, 0x0abd, 0x0ad8, 0x0ae2, 0x0aed, 0x0b00, 0x0b08, 0x0b08, - // Entry 100 - 13F - 0x0b11, 0x0b19, 0x0b32, 0x0b39, 0x0b45, - }, - }, - { // ak - "AndoraUnited Arab EmiratesAfganistanAntigua ne BaabudaAnguilaAlbeniaAame" + - "niaAngolaAgyɛntinaAmɛrika SamoaƆstriaƆstreliaArubaAzebaegyanBosnia n" + - "e HɛzegovinaBaabadosBangladɛhyeBɛlgyiumBɔkina FasoBɔlgeriaBarenBurun" + - "diBɛninBɛmudaBrunaeBoliviaBrazilBahamaButanBɔtswanaBɛlarusBelizKanad" + - "aKongo (Zair)Afrika Finimfin ManKongoSwetzalandLa Côte d’IvoireKook " + - "NsupɔwKyiliKamɛrunKyaenaKolombiaKɔsta RikaKubaKepvɛdfo IslandsSaeprɔ" + - "sKyɛk KurokɛseGyaamanGyibutiDɛnmakDɔmenekaDɔmeneka KurokɛseƆlgyeriaI" + - "kuwadɔƐstoniaNisrimƐritreaSpainIthiopiaFinlandFigyiFɔlkman AelandMae" + - "kronehyiaFrɛnkyemanGabɔnAhendiman NkabomGrenadaGyɔgyeaFrɛnkye Gayana" + - "GaanaGyebraltaGreenmanGambiaGiniGuwadelupGini IkuwetaGreekmanGuwatem" + - "alaGuamGini BisawGayanaHɔndurasKrowehyiaHeitiHangariIndɔnehyiaAerela" + - "ndIsraelIndiaBritenfo Hɔn Man Wɔ India Po No MuIrakIranAeslandItaliG" + - "yamekaGyɔdanGyapanKɛnyaKɛɛgestanKambodiaKiribatiKɔmɔrɔsSaint Kitts n" + - "e NɛvesEtifi KoriaAnaafo KoriaKuweteKemanfo IslandsKazakstanLaosLɛba" + - "nɔnSaint LuciaLektenstaenSri LankaLaeberiaLɛsutuLituweniaLaksembɛgLa" + - "tviaLibyaMorokoMɔnakoMɔldovaMadagaskaMarshall IslandsMasedoniaMaliMi" + - "yanmaMɔngoliaNorthern Mariana IslandsMatinikMɔreteniaMantseratMɔltaM" + - "ɔrehyeɔsMaldivesMalawiMɛksikoMalehyiaMozambikNamibiaKaledonia Fofor" + - "oNigyɛNɔfolk AelandNaegyeriaNekaraguwaNɛdɛlandNɔɔweNɛpɔlNaworuNiyuZi" + - "land FoforoOmanPanamaPeruFrɛnkye PɔlenehyiaPapua Guinea FoforoPhilip" + - "pinesPakistanPolandSaint Pierre ne MiquelonPitcairnPuɛto RikoPalesta" + - "en West Bank ne GazaPɔtugalPalauParaguayKataReyuniɔnRomeniaRɔhyeaRwa" + - "ndaSaudi ArabiaSolomon IslandsSeyhyɛlSudanSwedenSingapɔSaint HelenaS" + - "loviniaSlovakiaSierra LeoneSan MarinoSenegalSomaliaSurinameSão Tomé " + - "and PríncipeƐl SalvadɔSiriaSwazilandTurks ne Caicos IslandsKyadTogoT" + - "aelandTajikistanTokelauTimɔ BokaTɛkmɛnistanTunihyiaTongaTɛɛkiTrinida" + - "d ne TobagoTuvaluTaiwanTanzaniaUkrenUgandaAmɛrikaYurugwaeUzbɛkistanV" + - "atican ManSaint Vincent ne GrenadinesVenezuelaBritainfo Virgin Islan" + - "dsAmɛrika Virgin IslandsViɛtnamVanuatuWallis ne FutunaSamoaYɛmenMayɔ" + - "teAfrika AnaafoZambiaZembabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x001a, 0x0024, 0x0036, 0x003d, 0x0044, - 0x004b, 0x0051, 0x0051, 0x005b, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0088, 0x009d, 0x00a5, 0x00b1, 0x00ba, 0x00c6, 0x00cf, - 0x00d4, 0x00db, 0x00e1, 0x00e1, 0x00e8, 0x00ee, 0x00f5, 0x00f5, - 0x00fb, 0x0101, 0x0106, 0x0106, 0x010f, 0x0117, 0x011c, 0x0122, - 0x0122, 0x012e, 0x0141, 0x0146, 0x0150, 0x0163, 0x016f, 0x0174, - 0x017c, 0x0182, 0x018a, 0x018a, 0x0195, 0x0199, 0x01aa, 0x01aa, - 0x01aa, 0x01b2, 0x01c1, 0x01c8, 0x01c8, 0x01cf, 0x01d6, 0x01df, - // Entry 40 - 7F - 0x01f2, 0x01fb, 0x01fb, 0x0203, 0x020b, 0x0211, 0x0211, 0x0219, - 0x021e, 0x0226, 0x0226, 0x0226, 0x022d, 0x0232, 0x0241, 0x024d, - 0x024d, 0x0258, 0x025e, 0x026e, 0x0275, 0x027d, 0x028c, 0x028c, - 0x0291, 0x029a, 0x02a2, 0x02a8, 0x02ac, 0x02b5, 0x02c1, 0x02c9, - 0x02c9, 0x02d3, 0x02d7, 0x02e1, 0x02e7, 0x02e7, 0x02e7, 0x02f0, - 0x02f9, 0x02fe, 0x0305, 0x0305, 0x0310, 0x0318, 0x031e, 0x031e, - 0x0323, 0x0347, 0x034b, 0x034f, 0x0356, 0x035b, 0x035b, 0x0362, - 0x0369, 0x036f, 0x0375, 0x0380, 0x0388, 0x0390, 0x039a, 0x03af, - // Entry 80 - BF - 0x03ba, 0x03c6, 0x03cc, 0x03db, 0x03e4, 0x03e8, 0x03f1, 0x03fc, - 0x0407, 0x0410, 0x0418, 0x041f, 0x0428, 0x0432, 0x0438, 0x043d, - 0x0443, 0x044a, 0x0452, 0x0452, 0x0452, 0x045b, 0x046b, 0x0474, - 0x0478, 0x047f, 0x0488, 0x0488, 0x04a0, 0x04a7, 0x04b1, 0x04ba, - 0x04c0, 0x04cb, 0x04d3, 0x04d9, 0x04e1, 0x04e9, 0x04f1, 0x04f8, - 0x0508, 0x050e, 0x051c, 0x0525, 0x052f, 0x0539, 0x0540, 0x0547, - 0x054d, 0x0551, 0x055e, 0x0562, 0x0568, 0x056c, 0x0580, 0x0593, - 0x059e, 0x05a6, 0x05ac, 0x05c4, 0x05cc, 0x05d7, 0x05f2, 0x05fa, - // Entry C0 - FF - 0x05ff, 0x0607, 0x060b, 0x060b, 0x0614, 0x061b, 0x061b, 0x0622, - 0x0628, 0x0634, 0x0643, 0x064b, 0x0650, 0x0656, 0x065e, 0x066a, - 0x0672, 0x0672, 0x067a, 0x0686, 0x0690, 0x0697, 0x069e, 0x06a6, - 0x06a6, 0x06be, 0x06ca, 0x06ca, 0x06cf, 0x06d8, 0x06d8, 0x06ef, - 0x06f3, 0x06f3, 0x06f7, 0x06fe, 0x0708, 0x070f, 0x0719, 0x0726, - 0x072e, 0x0733, 0x073a, 0x074c, 0x0752, 0x0758, 0x0760, 0x0765, - 0x076b, 0x076b, 0x076b, 0x0773, 0x077b, 0x0786, 0x0791, 0x07ac, - 0x07b5, 0x07cd, 0x07e4, 0x07ec, 0x07f3, 0x0803, 0x0808, 0x0808, - // Entry 100 - 13F - 0x080e, 0x0815, 0x0822, 0x0828, 0x0830, - }, - }, - { // am - amRegionStr, - amRegionIdx, - }, - { // ar - arRegionStr, - arRegionIdx, - }, - {}, // ar-EG - { // ar-LY - "سبتة ومليليةمونتيسيراتأوروغواي", - []uint16{ // 245 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - // Entry 80 - BF - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - // Entry C0 - FF - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x002b, 0x003b, - }, - }, - { // ar-SA - "جزر البهاماسبتة ومليليةمونتيسيراتسان بيير وميكولونأوروغواي", - []uint16{ // 245 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - // Entry 40 - 7F - 0x0015, 0x0015, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - // Entry 80 - BF - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, - // Entry C0 - FF - 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0070, - }, - }, - { // as - "এন্টাৰ্টিকাব্ৰাজিলবভেট দ্বীপচীনজাৰ্মানিফ্ৰান্সসংযুক্ত ৰাজ্যদক্ষিণ জৰ্জিয" + - "়া আৰু দক্ষিণ চেণ্ডৱিচ্\u200c দ্বীপহাৰ্ড দ্বীপ আৰু মেক্\u200cডোনাল" + - "্ড দ্বীপভাৰতব্ৰিটিশ্ব ইণ্ডিয়ান মহাসাগৰৰ অঞ্চলইটালিজাপানৰুচদক্ষিণ " + - "ফ্ৰান্সৰ অঞ্চলযুক্তৰাষ্ট্ৰঅজ্ঞাত বা অবৈধ অঞ্চল", - []uint16{ // 262 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, - 0x0036, 0x0036, 0x0036, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, - 0x005b, 0x005b, 0x005b, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, - // Entry 40 - 7F - 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, - 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, - 0x0073, 0x0088, 0x0088, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, - 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, - 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0182, 0x0182, - 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, - 0x018e, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01fd, 0x01fd, 0x01fd, - 0x01fd, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, - // Entry 80 - BF - 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, - 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, - 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, - 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, - 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, - 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, - 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, - 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, - // Entry C0 - FF - 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x0215, - 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, - 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, - 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, - 0x0215, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, - 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, - 0x0250, 0x0250, 0x0250, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, - 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, - // Entry 100 - 13F - 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x02aa, - }, - }, - { // asa - "AndoraFalme dha KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArme" + - "niaAngolaAjentinaThamoa ya MarekaniAuthtriaAuthtraliaArubaAdhabajani" + - "Bothnia na HedhegovinaBabadothiBangladeshiUbelgijiBukinafathoBulgari" + - "aBahareniBurundiBeniniBermudaBruneiBraziliBahamaButaniBotthwanaBelar" + - "uthiBelidheKanadaJamhuri ya Kidemokrathia ya KongoJamhuri ya Afrika " + - "ya KatiKongoUthwithiKodivaaVithiwa vya CookChileKameruniChinaKolombi" + - "aKothtarikaKubaKepuvedeKuprothiJamhuri ya ChekiUjerumaniJibutiDenmak" + - "iDominikaJamhuri ya DominikaAljeriaEkwadoEthtoniaMithriEritreaHithpa" + - "niaUhabeshiUfiniFijiVithiwa vya FalklandMikronethiaUfaranthaGaboniUi" + - "ngeredhaGrenadaJojiaGwiyana ya UfaranthaGhanaJibraltaGrinlandiGambia" + - "GineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurathiK" + - "orathiaHaitiHungariaIndonethiaAyalandiIthraeliIndiaIeneo la Uingered" + - "ha katika Bahari HindiIrakiUajemiAithlandiItaliaJamaikaYordaniJapani" + - "KenyaKirigizithtaniKambodiaKiribatiKomoroThantakitdhi na NevithKorea" + - " KathkaziniKorea KuthiniKuwaitiVithiwa vya KaymanKazakithtaniLaothiL" + - "ebanoniThantaluthiaLishenteniThirilankaLiberiaLethotoLitwaniaLathemb" + - "agiLativiaLibyaMorokoMonakoMoldovaBukiniVithiwa vya MarshalMathedoni" + - "aMaliMyamaMongoliaVithiwa vya Mariana vya KathkaziniMartinikiMoritan" + - "iaMonttherratiMaltaMorithiModivuMalawiMekthikoMalethiaMthumbijiNamib" + - "iaNyukaledoniaNijeriKithiwa cha NorfokNijeriaNikaragwaUholandhiNorwe" + - "NepaliNauruNiueNyudhilandiOmaniPanamaPeruPolinesia ya UfaranthaPapua" + - "FilipinoPakithtaniPolandiThantapieri na MikeloniPitkairniPwetorikoPa" + - "lestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUruthiRwandaThaudiVit" + - "hiwa vya TholomonShelisheliThudaniUthwidiThingapooThantahelenaThlove" + - "niaTholvakiaThiera LeoniThamarinoThenegaliThomaliaThurinamuThao Tome" + - " na PrincipeElsavadoThiriaUthwadhiVithiwa vya Turki na KaikoChadiTog" + - "oTailandiTajikithtaniTokelauTimori ya MasharikiTurukimenithtaniTunit" + - "hiaTongaUturukiTrinidad na TobagoTuvaluTaiwaniTadhaniaUgandaMarekani" + - "UrugwaiUdhibekithtaniVatikaniThantavithenti na GrenadiniVenezuelaVit" + - "hiwa vya Virgin vya UingeredhaVithiwa vya Virgin vya MarekaniVietina" + - "muVanuatuWalith na FutunaThamoaYemeniMayotteAfrika KuthiniDhambiaDhi" + - "mbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0017, 0x0023, 0x0035, 0x003d, 0x0044, - 0x004b, 0x0051, 0x0051, 0x0059, 0x006b, 0x0073, 0x007d, 0x0082, - 0x0082, 0x008c, 0x00a2, 0x00ab, 0x00b6, 0x00be, 0x00c9, 0x00d1, - 0x00d9, 0x00e0, 0x00e6, 0x00e6, 0x00ed, 0x00f3, 0x00f3, 0x00f3, - 0x00fa, 0x0100, 0x0106, 0x0106, 0x010f, 0x0118, 0x011f, 0x0125, - 0x0125, 0x0146, 0x015f, 0x0164, 0x016c, 0x0173, 0x0183, 0x0188, - 0x0190, 0x0195, 0x019d, 0x019d, 0x01a7, 0x01ab, 0x01b3, 0x01b3, - 0x01b3, 0x01bb, 0x01cb, 0x01d4, 0x01d4, 0x01da, 0x01e1, 0x01e9, - // Entry 40 - 7F - 0x01fc, 0x0203, 0x0203, 0x0209, 0x0211, 0x0217, 0x0217, 0x021e, - 0x0227, 0x022f, 0x022f, 0x022f, 0x0234, 0x0238, 0x024c, 0x0257, - 0x0257, 0x0260, 0x0266, 0x0270, 0x0277, 0x027c, 0x0290, 0x0290, - 0x0295, 0x029d, 0x02a6, 0x02ac, 0x02b0, 0x02b9, 0x02c2, 0x02c9, - 0x02c9, 0x02d2, 0x02d6, 0x02df, 0x02e5, 0x02e5, 0x02e5, 0x02ef, - 0x02f7, 0x02fc, 0x0304, 0x0304, 0x030e, 0x0316, 0x031e, 0x031e, - 0x0323, 0x034a, 0x034f, 0x0355, 0x035e, 0x0364, 0x0364, 0x036b, - 0x0372, 0x0378, 0x037d, 0x038b, 0x0393, 0x039b, 0x03a1, 0x03b7, - // Entry 80 - BF - 0x03c7, 0x03d4, 0x03db, 0x03ed, 0x03f9, 0x03ff, 0x0407, 0x0413, - 0x041d, 0x0427, 0x042e, 0x0435, 0x043d, 0x0447, 0x044e, 0x0453, - 0x0459, 0x045f, 0x0466, 0x0466, 0x0466, 0x046c, 0x047f, 0x0489, - 0x048d, 0x0492, 0x049a, 0x049a, 0x04bc, 0x04c5, 0x04ce, 0x04da, - 0x04df, 0x04e6, 0x04ec, 0x04f2, 0x04fa, 0x0502, 0x050b, 0x0512, - 0x051e, 0x0524, 0x0536, 0x053d, 0x0546, 0x054f, 0x0554, 0x055a, - 0x055f, 0x0563, 0x056e, 0x0573, 0x0579, 0x057d, 0x0593, 0x0598, - 0x05a0, 0x05aa, 0x05b1, 0x05c8, 0x05d1, 0x05da, 0x05e3, 0x05e8, - // Entry C0 - FF - 0x05ed, 0x05f5, 0x05fb, 0x05fb, 0x0604, 0x060b, 0x060b, 0x0611, - 0x0617, 0x061d, 0x0631, 0x063b, 0x0642, 0x0649, 0x0652, 0x065e, - 0x0667, 0x0667, 0x0670, 0x067c, 0x0685, 0x068e, 0x0696, 0x069f, - 0x069f, 0x06b4, 0x06bc, 0x06bc, 0x06c2, 0x06ca, 0x06ca, 0x06e4, - 0x06e9, 0x06e9, 0x06ed, 0x06f5, 0x0701, 0x0708, 0x071b, 0x072b, - 0x0733, 0x0738, 0x073f, 0x0751, 0x0757, 0x075e, 0x0766, 0x0766, - 0x076c, 0x076c, 0x076c, 0x0774, 0x077b, 0x0789, 0x0791, 0x07ac, - 0x07b5, 0x07d6, 0x07f5, 0x07fe, 0x0805, 0x0815, 0x081b, 0x081b, - // Entry 100 - 13F - 0x0821, 0x0828, 0x0836, 0x083d, 0x0846, - }, - }, - { // ast - "Islla AscensiónAndorraEmiratos Árabes XuníosAfganistánAntigua y BarbudaA" + - "nguilaAlbaniaArmeniaAngolaL’AntártidaArxentinaSamoa AmericanaAustria" + - "AustraliaArubaIslles AlandAzerbaixánBosnia y HerzegovinaBarbadosBang" + - "ladexBélxicaBurkina FasuBulgariaBaḥréinBurundiBenínSan BartoloméLes " + - "BermudesBrunéiBoliviaCaribe neerlandésBrasilLes BahamesButánIslla Bo" + - "uvetBotsuanaBielorrusiaBelizeCanadáIslles Cocos (Keeling)Congu - Kin" + - "xasaRepública CentroafricanaCongu - BrazzavilleSuizaCosta de MarfilI" + - "slles CookChileCamerúnChinaColombiaIslla ClippertonCosta RicaCubaCab" + - "u VerdeCuraçaoIslla ChristmasXipreChequiaAlemañaDiego GarciaXibutiDi" + - "namarcaDominicaRepública DominicanaArxeliaCeuta y MelillaEcuadorEsto" + - "niaExiptuSáḥara OccidentalEritreaEspañaEtiopíaXunión EuropeaFinlandi" + - "aIslles FixiFalkland IslandsMicronesiaIslles FeroeFranciaGabónReinu " + - "XuníuGranadaXeorxaGuyana FrancesaGuernseyGhanaXibraltarGroenlandiaGa" + - "mbiaGuineaGuadalupeGuinea EcuatorialGreciaIslles Xeorxa del Sur y Sa" + - "ndwich del SurGuatemalaGuamGuinea-BisáuGuyanaARE China de Ḥong KongI" + - "slles Heard y McDonaldHonduresCroaciaHaitíHungríaIslles CanariesIndo" + - "nesiaIrlandaIsraelIslla de ManIndiaTerritoriu Británicu del Océanu Í" + - "ndicuIraqIránIslandiaItaliaJerseyXamaicaXordaniaXapónKeniaKirguistán" + - "CamboyaKiribatiLes ComoresSaint Kitts y NevisCorea del NorteCorea de" + - "l SurKuwaitIslles CaimánKazakstánLaosLíbanuSanta LlucíaLiechtenstein" + - "Sri LankaLiberiaLesothuLituaniaLuxemburguLetoniaLibiaMarruecosMónacu" + - "MoldaviaMontenegruSaint MartinMadagascarIslles MarshallMacedoniaMalí" + - "Myanmar (Birmania)MongoliaARE China de MacáuIslles Marianes del Nort" + - "eLa MartinicaMauritaniaMontserratMaltaMauriciuLes MaldivesMalauiMéxi" + - "cuMalasiaMozambiqueNamibiaNueva CaledoniaEl NíxerIslla NorfolkNixeri" + - "aNicaraguaPaíses BaxosNoruegaNepalNauruNiueNueva ZelandaOmánPanamáPe" + - "rúPolinesia FrancesaPapúa Nueva GuineaFilipinesPaquistánPoloniaSaint" + - " Pierre y MiquelonIslles PitcairnPuertu RicuTerritorios PalestinosPo" + - "rtugalPaláuParaguáiQatarOceanía esteriorReuniónRumaníaSerbiaRusiaRua" + - "ndaArabia SauditaIslles SalomónLes SeixelesSudánSueciaSingapurSanta " + - "HelenaEsloveniaSvalbard ya Islla Jan MayenEslovaquiaSierra LleonaSan" + - " MarínSenegalSomaliaSurinamSudán del SurSantu Tomé y PríncipeEl Salv" + - "adorSint MaartenSiriaSuazilandiaTristán da CunhaIslles Turques y Cai" + - "cosChadTierres Australes FrancesesToguTailandiaTaxiquistánTokeláuTim" + - "or OrientalTurkmenistánTuniciaTongaTurquíaTrinidá y TobaguTuvaluTaiw" + - "ánTanzaniaUcraínaUgandaIslles Perifériques Menores de los EE.XX.Est" + - "aos XuníosUruguáiUzbequistánCiudá del VaticanuSan Vicente y Granadin" + - "esVenezuelaIslles Vírxenes BritániquesIslles Vírxenes AmericanesViet" + - "namVanuatuWallis y FutunaSamoaKosovuYemenMayotteSudáfricaZambiaZimba" + - "bueRexón desconocidaMunduÁfricaNorteaméricaAmérica del SurOceaníaÁfr" + - "ica OccidentalAmérica CentralÁfrica OrientalÁfrica del NorteÁfrica C" + - "entralÁfrica del SurAméricaAmérica del NorteCaribeAsia OrientalAsia " + - "del SurSureste AsiáticuEuropa del SurAustralasiaMelanesiaRexón de Mi" + - "cronesiaPolinesiaAsiaAsia CentralAsia OccidentalEuropaEuropa Orienta" + - "lEuropa del NorteEuropa OccidentalAmérica Llatina", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0017, 0x002f, 0x003a, 0x004b, 0x0052, 0x0059, - 0x0060, 0x0066, 0x0074, 0x007d, 0x008c, 0x0093, 0x009c, 0x00a1, - 0x00ad, 0x00b8, 0x00cc, 0x00d4, 0x00dd, 0x00e5, 0x00f1, 0x00f9, - 0x0103, 0x010a, 0x0110, 0x011e, 0x012a, 0x0131, 0x0138, 0x014a, - 0x0150, 0x015b, 0x0161, 0x016d, 0x0175, 0x0180, 0x0186, 0x018d, - 0x01a3, 0x01b2, 0x01cb, 0x01de, 0x01e3, 0x01f2, 0x01fd, 0x0202, - 0x020a, 0x020f, 0x0217, 0x0227, 0x0231, 0x0235, 0x023f, 0x0247, - 0x0256, 0x025b, 0x0262, 0x026a, 0x0276, 0x027c, 0x0285, 0x028d, - // Entry 40 - 7F - 0x02a2, 0x02a9, 0x02b8, 0x02bf, 0x02c6, 0x02cc, 0x02e0, 0x02e7, - 0x02ee, 0x02f6, 0x0305, 0x0305, 0x030e, 0x0319, 0x0329, 0x0333, - 0x033f, 0x0346, 0x034c, 0x0358, 0x035f, 0x0365, 0x0374, 0x037c, - 0x0381, 0x038a, 0x0395, 0x039b, 0x03a1, 0x03aa, 0x03bb, 0x03c1, - 0x03e9, 0x03f2, 0x03f6, 0x0403, 0x0409, 0x0421, 0x0438, 0x0440, - 0x0447, 0x044d, 0x0455, 0x0464, 0x046d, 0x0474, 0x047a, 0x0486, - 0x048b, 0x04b4, 0x04b8, 0x04bd, 0x04c5, 0x04cb, 0x04d1, 0x04d8, - 0x04e0, 0x04e6, 0x04eb, 0x04f6, 0x04fd, 0x0505, 0x0510, 0x0523, - // Entry 80 - BF - 0x0532, 0x053f, 0x0545, 0x0553, 0x055d, 0x0561, 0x0568, 0x0575, - 0x0582, 0x058b, 0x0592, 0x0599, 0x05a1, 0x05ab, 0x05b2, 0x05b7, - 0x05c0, 0x05c7, 0x05cf, 0x05d9, 0x05e5, 0x05ef, 0x05fe, 0x0607, - 0x060c, 0x061e, 0x0626, 0x0639, 0x0652, 0x065e, 0x0668, 0x0672, - 0x0677, 0x067f, 0x068b, 0x0691, 0x0698, 0x069f, 0x06a9, 0x06b0, - 0x06bf, 0x06c8, 0x06d5, 0x06dc, 0x06e5, 0x06f2, 0x06f9, 0x06fe, - 0x0703, 0x0707, 0x0714, 0x0719, 0x0720, 0x0725, 0x0737, 0x074a, - 0x0753, 0x075d, 0x0764, 0x077b, 0x078a, 0x0795, 0x07ab, 0x07b3, - // Entry C0 - FF - 0x07b9, 0x07c2, 0x07c7, 0x07d8, 0x07e0, 0x07e8, 0x07ee, 0x07f3, - 0x07f9, 0x0807, 0x0816, 0x0822, 0x0828, 0x082e, 0x0836, 0x0842, - 0x084b, 0x0866, 0x0870, 0x087d, 0x0887, 0x088e, 0x0895, 0x089c, - 0x08aa, 0x08c1, 0x08cc, 0x08d8, 0x08dd, 0x08e8, 0x08f9, 0x0910, - 0x0914, 0x092f, 0x0933, 0x093c, 0x0948, 0x0950, 0x095e, 0x096b, - 0x0972, 0x0977, 0x097f, 0x0990, 0x0996, 0x099d, 0x09a5, 0x09ad, - 0x09b3, 0x09dd, 0x09dd, 0x09eb, 0x09f3, 0x09ff, 0x0a12, 0x0a2a, - 0x0a33, 0x0a50, 0x0a6b, 0x0a72, 0x0a79, 0x0a88, 0x0a8d, 0x0a93, - // Entry 100 - 13F - 0x0a98, 0x0a9f, 0x0aa9, 0x0aaf, 0x0ab7, 0x0ac9, 0x0ace, 0x0ad5, - 0x0ae2, 0x0af2, 0x0afa, 0x0b0c, 0x0b1c, 0x0b2c, 0x0b3d, 0x0b4c, - 0x0b5b, 0x0b63, 0x0b75, 0x0b7b, 0x0b88, 0x0b94, 0x0ba5, 0x0bb3, - 0x0bbe, 0x0bc7, 0x0bdb, 0x0be4, 0x0be8, 0x0bf4, 0x0c03, 0x0c09, - 0x0c18, 0x0c28, 0x0c39, 0x0c49, - }, - }, - { // az - azRegionStr, - azRegionIdx, - }, - { // az-Cyrl - "Аскенсон адасыАндорраБирләшмиш Әрәб ӘмирликләриӘфганыстанАнтигуа вә Барб" + - "удаАнҝилјаАлбанијаЕрмәнистанАнголаАнтарктикаАрҝентинаАмерика Самоас" + - "ыАвстријаАвстралијаАрубаАланд адаларыАзәрбајҹанБоснија вә Һерсегови" + - "наБарбадосБангладешБелчикаБуркина ФасоБолгарыстанБәһрејнБурундиБени" + - "нСент-БартелемиБермуд адаларыБрунејБоливијаБразилијаБаһам адаларыБу" + - "танБуве адасыБотсванаБеларусБелизКанадаКокос (Килинг) адаларыКонго-" + - "КиншасаМәркәзи Африка РеспубликасыКонго-БраззавилИсвечрәKотд’ивуарК" + - "ук адаларыЧилиКамерунЧинКолумбијаКлиппертон адасыКоста РикаКубаКабо" + - "-ВердеКурасаоМилад адасыКипрЧехијаАлманијаДиего ГарсијаҸибутиДанимар" + - "каДоминикаДоминикан РеспубликасыӘлҹәзаирСеута вә МелилјаЕквадорЕсто" + - "нијаМисирЕритрејаИспанијаЕфиопијаАвропа БирлијиФинландијаФиҹиФолкле" + - "нд адаларыМикронезијаФарер адаларыФрансаГабонБирләшмиш КраллыгГрена" + - "даҜүрҹүстанФранса ГвианасыҜернсиГанаҸәбәллүтаригГренландијаГамбијаГ" + - "винејаГваделупаЕкваториал ГвинејаЈунаныстанҸәнуби Ҹорҹија вә Ҹәнуби" + - " Сендвич адаларыГватемалаГуамГвинеја-БисауГајанаҺонк Конг Хүсуси Инз" + - "ибати Әрази ЧинҺерд вә Макдоналд адаларыҺондурасХорватијаҺаитиМаҹар" + - "ыстанКанар адаларыИндонезијаИрландијаИсраилМен адасыҺиндистанБритан" + - "тјанын Һинд Океаны ӘразисиИрагИранИсландијаИталијаҸерсиЈамајкаИорда" + - "нијаЈапонијаКенијаГырғызыстанКамбоҹаКирибатиКомор адаларыСент-Китс " + - "вә НевисШимали КорејаҸәнуби КорејаКүвејтКајман адаларыГазахыстанЛао" + - "сЛиванСент-ЛусијаЛихтенштејнШри-ЛанкаЛиберијаЛесотоЛитваЛүксембургЛ" + - "атвијаЛивијаМәракешМонакоМолдоваМонтенегроСент МартинМадагаскарМарш" + - "ал адаларыМалиМјанмаМонголустанМакао Хүсуси Инзибати Әрази ЧинШимал" + - "и Мариан адаларыМартиникМавританијаМонсератМалтаМаврикиМалдив адала" + - "рыМалавиМексикаМалајзијаМозамбикНамибијаЈени КаледонијаНиҝерНорфолк" + - " адасыНиҝеријаНикарагуаНидерландНорвечНепалНауруНиуеЈени ЗеландијаОм" + - "анПанамаПеруФранса ПолинезијасыПапуа-Јени ГвинејаФилиппинПакистанПо" + - "лшаМүгәддәс Пјер вә МикелонПиткерн адаларыПуерто РикоПортугалијаПал" + - "ауПарагвајГәтәрУзаг ОкеанијаРејунјонРумынијаСербијаРусијаРуандаСәуд" + - "ијјә ӘрәбистаныСоломон адаларыСејшел адаларыСуданИсвечСингапурМүгәд" + - "дәс ЈеленаСловенијаСвалбард вә Јан-МајенСловакијаСјерра-ЛеонеСан-Ма" + - "риноСенегалСомалиСуринамҸәнуби СуданСан-Томе вә ПринсипиСалвадорСин" + - "т-МартенСуријаСвазилендТристан да КунјаТөркс вә Кајкос адаларыЧадФр" + - "ансанын Ҹәнуб ӘразиләриТогоТаиландТаҹикистанТокелауШәрги ТиморТүркм" + - "әнистанТунисТонгаТүркијәТринидад вә ТобагоТувалуТајванТанзанијаУкра" + - "јнаУгандаАБШ-а бағлы кичик адаҹыгларАмерика Бирләшмиш ШтатларыУругв" + - "ајӨзбәкистанВатиканСент-Винсент вә ГренадинләрВенесуелаБританијанын" + - " Вирҝин адаларыАБШ Вирҝин адаларыВјетнамВануатуУоллис вә ФутунаСамоа" + - "КосовоЈәмәнМајотҸәнуб АфрикаЗамбијаЗимбабвеНамәлум РеҝионДүнјаАфрик" + - "аШимали АмерикаҸәнуби АмерикаОкеанијаГәрби АфрикаМәркәзи АмерикаШәр" + - "ги АфрикаШимали АфрикаМәркәзи АфрикаҸәнуби АфрикаАмерикаШимал Амери" + - "касыКарибШәрги АсијаҸәнуби АсијаҸәнуб-Шәрги АсијаҸәнуби АвропаАвстр" + - "алазијаМеланезијаМикронезија РеҝионуПолинезијаАсијаМәркәзи АсијаГәр" + - "би АсијаАвропаШәрги АвропаШимали АвропаГәрби АвропаЛатын Америкасы", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001b, 0x0029, 0x005b, 0x006f, 0x0091, 0x009f, 0x00af, - 0x00c3, 0x00cf, 0x00e3, 0x00f5, 0x0112, 0x0122, 0x0136, 0x0140, - 0x0159, 0x016d, 0x0197, 0x01a7, 0x01b9, 0x01c7, 0x01de, 0x01f4, - 0x0202, 0x0210, 0x021a, 0x0235, 0x0250, 0x025c, 0x026c, 0x026c, - 0x027e, 0x0297, 0x02a1, 0x02b4, 0x02c4, 0x02d2, 0x02dc, 0x02e8, - 0x0310, 0x0329, 0x035d, 0x037a, 0x0388, 0x039c, 0x03b1, 0x03b9, - 0x03c7, 0x03cd, 0x03df, 0x03fe, 0x0411, 0x0419, 0x042c, 0x043a, - 0x044f, 0x0457, 0x0463, 0x0473, 0x048c, 0x0498, 0x04aa, 0x04ba, - // Entry 40 - 7F - 0x04e5, 0x04f5, 0x0513, 0x0521, 0x0531, 0x053b, 0x053b, 0x054b, - 0x055b, 0x056b, 0x0586, 0x0586, 0x059a, 0x05a2, 0x05c1, 0x05d7, - 0x05f0, 0x05fc, 0x0606, 0x0627, 0x0635, 0x0647, 0x0664, 0x0670, - 0x0678, 0x0690, 0x06a6, 0x06b4, 0x06c2, 0x06d4, 0x06f7, 0x070b, - 0x0756, 0x0768, 0x0770, 0x0789, 0x0795, 0x07d6, 0x0805, 0x0815, - 0x0827, 0x0831, 0x0845, 0x085e, 0x0872, 0x0884, 0x0890, 0x08a1, - 0x08b3, 0x08f0, 0x08f8, 0x0900, 0x0912, 0x0920, 0x092a, 0x0938, - 0x094a, 0x095a, 0x0966, 0x097c, 0x098a, 0x099a, 0x09b3, 0x09d4, - // Entry 80 - BF - 0x09ed, 0x0a06, 0x0a12, 0x0a2d, 0x0a41, 0x0a49, 0x0a53, 0x0a68, - 0x0a7e, 0x0a8f, 0x0a9f, 0x0aab, 0x0ab5, 0x0ac9, 0x0ad7, 0x0ae3, - 0x0af1, 0x0afd, 0x0b0b, 0x0b1f, 0x0b34, 0x0b48, 0x0b63, 0x0b63, - 0x0b6b, 0x0b77, 0x0b8d, 0x0bc7, 0x0bef, 0x0bff, 0x0c15, 0x0c25, - 0x0c2f, 0x0c3d, 0x0c58, 0x0c64, 0x0c72, 0x0c84, 0x0c94, 0x0ca4, - 0x0cc1, 0x0ccb, 0x0ce4, 0x0cf4, 0x0d06, 0x0d18, 0x0d24, 0x0d2e, - 0x0d38, 0x0d40, 0x0d5b, 0x0d63, 0x0d6f, 0x0d77, 0x0d9c, 0x0dbe, - 0x0dce, 0x0dde, 0x0de8, 0x0e15, 0x0e32, 0x0e47, 0x0e47, 0x0e5d, - // Entry C0 - FF - 0x0e67, 0x0e77, 0x0e81, 0x0e9a, 0x0eaa, 0x0eba, 0x0ec8, 0x0ed4, - 0x0ee0, 0x0f05, 0x0f22, 0x0f3d, 0x0f47, 0x0f51, 0x0f61, 0x0f7e, - 0x0f90, 0x0fb7, 0x0fc9, 0x0fe0, 0x0ff3, 0x1001, 0x100d, 0x101b, - 0x1032, 0x1057, 0x1067, 0x107c, 0x1088, 0x109a, 0x10b8, 0x10e3, - 0x10e9, 0x1119, 0x1121, 0x112f, 0x1143, 0x1151, 0x1166, 0x117e, - 0x1188, 0x1192, 0x11a0, 0x11c2, 0x11ce, 0x11da, 0x11ec, 0x11fa, - 0x1206, 0x1238, 0x1238, 0x126a, 0x1278, 0x128c, 0x129a, 0x12cd, - 0x12df, 0x1313, 0x1335, 0x1343, 0x1351, 0x136f, 0x1379, 0x1385, - // Entry 100 - 13F - 0x138f, 0x1399, 0x13b0, 0x13be, 0x13ce, 0x13e9, 0x13f3, 0x13ff, - 0x141a, 0x1435, 0x1445, 0x145c, 0x1479, 0x1490, 0x14a9, 0x14c4, - 0x14dd, 0x14eb, 0x1508, 0x1512, 0x1527, 0x153e, 0x155e, 0x1577, - 0x158f, 0x15a3, 0x15c8, 0x15dc, 0x15e6, 0x15ff, 0x1614, 0x1620, - 0x1637, 0x1650, 0x1667, 0x1684, - }, - }, - { // bas - "Àŋdɔ̂rÀdnà i Bilɔ̀ŋ bi ArābìàÀfgànìstâŋÀŋtigà ɓɔ BàrbudàÀŋgiyàÀlbanìàÀrm" + - "enìàÀŋgolàÀrgàŋtinàÒstrǐkÒstralìàÀrubàÀzɛ̀rbajàŋBòhnià ƐrzègòvinàBàr" + - "badòBàŋglàdɛ̂sBɛlgyùmBùrkìnà FasòBùlgarìàBàraìnBùrundìBènɛ̂ŋBɛ̀rmudà" + - "BruneiBòlivìàBràsîlBàhamàsBùtânBòdsùanàBèlarùsBèlîsKànadàKòŋgo ìkɛŋi" + - "Ŋ̀ɛm AfrīkàKòŋgoSùwîsMàŋ mi Njɔ̂kBìòn bi KookKìlîKàmɛ̀rûnKinàKɔ̀lɔm" + - "bìàKòstà RikàKubàKabwɛ᷆rKipròJamânJìbutìDànmârkDòmnîkDòmnikàÀlgerìàÈ" + - "kwàtorìàÈstonìàÈgîptòÈrìtrěàPànyaÈtìopìàFìnlândFijiBìòn bi FalklandM" + - "ìkrònesìàPùlàsi / Fɛ̀lɛ̀nsi /Gàbɔ̂ŋÀdnà i Lɔ̂ŋGrènadàGèɔrgìàGùyanà " + - "PùlàsiGanàGìlbràtârGrǐnlàndGàmbiàGìnêGwàdèlûpGìne ÈkwàtorìàGrǐkyàGwà" + - "tèmalàGùâmGìne BìsàôGùyanàƆ̀ŋduràsKròasìàÀitìƆ̀ŋgriìIndònèsiàÌrlândI" + - "sràɛ̂lIndìàBìtèk bi Ŋgisì i Tūyɛ ĪndìàÌrâkÌrâŋÌslandìàÌtalìàJàmàikàY" + - "ɔ̀rdaniàKenìàKìrgìzìstàŋKàmbodìàKìrìbatìKɔ̀mɔ̂rNûmpubi Kîts nì Nevì" + - "sKɔ̀re ì Ŋ̀ɔmbɔkKɔ̀re ì Ŋ̀wɛ̀lmbɔkKòwêtBìòn bi KaymànKàzàkstâŋLàôsLè" + - "banònNûmpubi LusìLigstɛntànSrìlaŋkàLìberìàLesòtòLìtùanìàLùgsàmbûrLàd" + - "viàLibìàMàrokòMònakòMoldavìàMàdàgàskârBìòn bi MarcàlMàsèdonìàMàliMyà" + - "nmârMòŋgolìàBìòn bi Marìanà ŋ̀ɔmbɔkMàrtìnîkMòrìtanìàMɔ̀ŋseràtMaltàMò" + - "rîsMàldîfMàlàwiMɛ̀gsîkMàlɛ̀sìàMòsàmbîkNàmibìàKàlèdonìà Yɔ̀ndɔNìjɛ̂rÒ" + - "n i Nɔrfɔ̂kNìgerìàNìkàragwàǸlɛndiNɔ̀rvegìàNèpâlNerùNìuɛ̀Sìlând Yɔ̀nd" + - "ɔÒmânPànàmaPèrûPòlìnesìà PùlàsiGìne ì PàpuFìlìpînPàkìstânPòlàndNûmp" + - "ubi Petrò nì MikèlônPìdkaìrnPɔ̀rtò RikòPàlɛ̀htinà Hyɔ̀ŋg nì GazàPɔ̀t" + - "ɔkìPàlaùPàràgwêKàtârRèunyɔ̂ŋRùmanìàRuslàndRùandàSàudi ÀrabìàBìòn bi" + - " SalōmòSèsɛ̂lSùdâŋSwedɛ̀nSìŋgàpûrNûmpubi ƐlēnàSlòvanìàSlòvakìàSièra " + - "Lèɔ̂nNûmpubi MāatìnSènègâlSòmalìàSùrinâmSào Tòme ɓɔ Prɛ̀ŋcipèSàlvàdɔ" + - "̂rSirìàSwàzìlândBìòn bi Tûrks nì KalkòsCâdTògoTaylàndTàjìkìstaŋTòkè" + - "laòTìmɔ̂r lìkòlTùrgmènìstânTùnisìàTɔŋgàTùrkâyTrìnidàd ɓɔ TòbagòTùvàl" + - "ùTàywânTànzàniàÙkrɛ̌nÙgandàÀdnà i Bilɔ̀ŋ bi AmerkàÙrùgwêyÙzbèkìstân" + - "VàtìkâŋNûmpubi Vɛ̂ŋsâŋ nì grènàdînVènèzùelàBìòn bi kɔnji bi ŊgisìBìò" + - "n bi kɔnji bi U.S.Vìɛ̀dnâmVànùatùWàlîs nì FùtunàSàmoàYèmɛ̂nMàyɔ̂tÀfr" + - "ǐkà Sɔ̀ZàmbiàZìmbàbwê", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000a, 0x0029, 0x0038, 0x0050, 0x0059, 0x0063, - 0x006d, 0x0076, 0x0076, 0x0083, 0x0083, 0x008b, 0x0096, 0x009d, - 0x009d, 0x00ac, 0x00c3, 0x00cc, 0x00db, 0x00e4, 0x00f4, 0x00ff, - 0x0107, 0x0110, 0x011a, 0x011a, 0x0125, 0x012b, 0x0135, 0x0135, - 0x013d, 0x0146, 0x014d, 0x014d, 0x0158, 0x0161, 0x0168, 0x0170, - 0x0170, 0x0180, 0x0190, 0x0197, 0x019e, 0x01ae, 0x01bc, 0x01c2, - 0x01ce, 0x01d3, 0x01e1, 0x01e1, 0x01ee, 0x01f3, 0x01fd, 0x01fd, - 0x01fd, 0x0203, 0x0203, 0x0209, 0x0209, 0x0211, 0x021a, 0x0222, - // Entry 40 - 7F - 0x022b, 0x0235, 0x0235, 0x0242, 0x024c, 0x0255, 0x0255, 0x0260, - 0x0266, 0x0271, 0x0271, 0x0271, 0x027a, 0x027e, 0x0290, 0x029e, - 0x029e, 0x02b8, 0x02c2, 0x02d2, 0x02db, 0x02e6, 0x02f7, 0x02f7, - 0x02fc, 0x0308, 0x0312, 0x031a, 0x0320, 0x032b, 0x033e, 0x0346, - 0x0346, 0x0352, 0x0358, 0x0366, 0x036e, 0x036e, 0x036e, 0x037a, - 0x0384, 0x038a, 0x0395, 0x0395, 0x03a1, 0x03a9, 0x03b3, 0x03b3, - 0x03ba, 0x03de, 0x03e4, 0x03eb, 0x03f6, 0x03ff, 0x03ff, 0x0409, - 0x0415, 0x0415, 0x041c, 0x042c, 0x0437, 0x0442, 0x044d, 0x0466, - // Entry 80 - BF - 0x047c, 0x0496, 0x049d, 0x04ae, 0x04bb, 0x04c1, 0x04ca, 0x04d8, - 0x04e4, 0x04ef, 0x04f9, 0x0501, 0x050d, 0x0519, 0x0521, 0x0528, - 0x0530, 0x0538, 0x0542, 0x0542, 0x0542, 0x0550, 0x0561, 0x056e, - 0x0573, 0x057c, 0x0588, 0x0588, 0x05a7, 0x05b2, 0x05bf, 0x05cc, - 0x05d2, 0x05d9, 0x05e1, 0x05e9, 0x05f3, 0x0600, 0x060b, 0x0615, - 0x062c, 0x0635, 0x0645, 0x064f, 0x065b, 0x0663, 0x0670, 0x0677, - 0x067c, 0x0684, 0x0696, 0x069c, 0x06a4, 0x06aa, 0x06c0, 0x06ce, - 0x06d8, 0x06e3, 0x06eb, 0x0708, 0x0712, 0x0721, 0x0743, 0x074e, - // Entry C0 - FF - 0x0755, 0x075f, 0x0766, 0x0766, 0x0772, 0x077c, 0x077c, 0x0784, - 0x078c, 0x079c, 0x07ae, 0x07b7, 0x07bf, 0x07c8, 0x07d4, 0x07e5, - 0x07f0, 0x07f0, 0x07fb, 0x080a, 0x081b, 0x0825, 0x082f, 0x0838, - 0x0838, 0x0855, 0x0862, 0x0862, 0x0869, 0x0875, 0x0875, 0x0891, - 0x0895, 0x0895, 0x089a, 0x08a2, 0x08b0, 0x08ba, 0x08cb, 0x08db, - 0x08e5, 0x08ed, 0x08f5, 0x090d, 0x0916, 0x091e, 0x0929, 0x0932, - 0x093a, 0x093a, 0x093a, 0x0957, 0x0961, 0x096f, 0x097a, 0x099f, - 0x09ac, 0x09c7, 0x09df, 0x09eb, 0x09f5, 0x0a09, 0x0a10, 0x0a10, - // Entry 100 - 13F - 0x0a19, 0x0a22, 0x0a31, 0x0a39, 0x0a44, - }, - }, - { // be - "Востраў УзнясенняАндораАб’яднаныя Арабскія ЭміратыАфганістанАнтыгуа і Ба" + - "рбудаАнгільяАлбаніяАрменіяАнголаАнтарктыкаАргенцінаАмерыканскае Сам" + - "оаАўстрыяАўстраліяАрубаАландскія астравыАзербайджанБоснія і Герцага" + - "вінаБарбадасБангладэшБельгіяБуркіна-ФасоБалгарыяБахрэйнБурундзіБені" + - "нСен-БартэльміБермудскія астравыБрунейБалівіяКарыбскія НідэрландыБр" + - "азіліяБагамыБутанВостраў БувэБатсванаБеларусьБелізКанадаКакосавыя (" + - "Кілінг) астравыКонга (Кіншаса)Цэнтральнаафрыканская РэспублікаКонга" + - " - БразавільШвейцарыяКот-д’ІвуарАстравы КукаЧыліКамерунКітайКалумбія" + - "Востраў КліпертонКоста-РыкаКубаКаба-ВердэКюрасааВостраў КалядКіпрЧэ" + - "хіяГерманіяВостраў Дыега-ГарсіяДжыбуціДаніяДамінікаДамініканская Рэ" + - "спублікаАлжырСеўта і МелільяЭквадорЭстоніяЕгіпетЗаходняя СахараЭрыт" + - "рэяІспаніяЭфіопіяЕўрапейскі саюзФінляндыяФіджыФалклендскія астравыМ" + - "ікранезіяФарэрскія астравыФранцыяГабонВялікабрытаніяГрэнадаГрузіяФр" + - "анцузская ГвіянаГернсіГанаГібралтарГрэнландыяГамбіяГвінеяГвадэлупаЭ" + - "кватарыяльная ГвінеяГрэцыяПаўднёвая Джорджыя і Паўднёвыя Сандвічавы" + - " астравыГватэмалаГуамГвінея-БісауГаянаГанконг, САР (Кітай)Астравы Хе" + - "рд і МакдональдГандурасХарватыяГаіціВенгрыяКанарскія астравыІнданез" + - "іяІрландыяІзраільВостраў МэнІндыяБрытанская тэрыторыя ў Індыйскім а" + - "кіянеІракІранІсландыяІталіяДжэрсіЯмайкаІарданіяЯпоніяКеніяКыргызста" + - "нКамбоджаКірыбаціКаморскія АстравыСент-Кітс і НевісПаўночная КарэяП" + - "аўднёвая КарэяКувейтКайманавы астравыКазахстанЛаосЛіванСент-ЛюсіяЛі" + - "хтэнштэйнШры-ЛанкаЛіберыяЛесотаЛітваЛюксембургЛатвіяЛівіяМарокаМана" + - "каМалдоваЧарнагорыяСен-МартэнМадагаскарМаршалавы АстравыМакедоніяМа" + - "ліМ’янма (Бірма)МанголіяМакаа, САР (Кітай)Паўночныя Марыянскія астр" + - "авыМарцінікаМаўрытаніяМантсератМальтаМаўрыкійМальдывыМалавіМексікаМ" + - "алайзіяМазамбікНамібіяНовая КаледоніяНігерВостраў НорфалкНігерыяНік" + - "арагуаНідэрландыНарвегіяНепалНауруНіуэНовая ЗеландыяАманПанамаПеруФ" + - "ранцузская ПалінезіяПапуа-Новая ГвінеяФіліпіныПакістанПольшчаСен-П’" + - "ер і МікелонАстравы ПіткэрнПуэрта-РыкаПалесцінскія ТэрыторыіПартуга" + - "ліяПалауПарагвайКатарЗнешняя АкіяніяРэюньёнРумыніяСербіяРасіяРуанда" + - "Саудаўская АравіяСаламонавы АстравыСейшэльскія АстравыСуданШвецыяСі" + - "нгапурВостраў Святой АленыСлавеніяШпіцберген і Ян-МаенСлавакіяСьера" + - "-ЛеонэСан-МарынаСенегалСамаліСурынамПаўднёвы СуданСан-Тамэ і Прынсіп" + - "іСальвадорСінт-МартэнСірыяСвазілендТрыстан-да-КуньяЦёркс і КайкасЧа" + - "дФранцузскія Паўднёвыя тэрыторыіТогаТайландТаджыкістанТакелауТымор-" + - "ЛешціТуркменістанТунісТонгаТурцыяТрынідад і ТабагаТувалуТайваньТанз" + - "аніяУкраінаУгандаМалыя Аддаленыя астравы ЗШАЗлучаныя Штаты АмерыкіУ" + - "ругвайУзбекістанВатыканСент-Вінсент і ГрэнадзіныВенесуэлаБрытанскія" + - " Віргінскія астравыАмерыканскія Віргінскія астравыВ’етнамВануатуУолі" + - "с і ФутунаСамоаКосаваЕменМаётаПаўднёваафрыканская РэспублікаЗамбіяЗ" + - "імбабвэНевядомы рэгіёнСветАфрыкаПаўночная АмерыкаПаўднёвая АмерыкаА" + - "кіяніяЗаходняя АфрыкаЦэнтральная АмерыкаУсходняя АфрыкаПаўночная Аф" + - "рыкаЦэнтральная АфрыкаПаўднёвая АфрыкаПаўночная і Паўднёвая Амерыкі" + - "Паўночнаамерыканскі рэгіёнКарыбскія астравыУсходняя АзіяПаўднёвая А" + - "зіяПаўднёва-Усходняя АзіяПаўднёвая ЕўропаАўстралазіяМеланезіяМікран" + - "езійскі рэгіёнПалінезіяАзіяЦэнтральная АзіяЗаходняя АзіяЕўропаУсход" + - "няя ЕўропаПаўночная ЕўропаЗаходняя ЕўропаЛацінская Амерыка", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0021, 0x002d, 0x0062, 0x0076, 0x0096, 0x00a4, 0x00b2, - 0x00c0, 0x00cc, 0x00e0, 0x00f2, 0x0115, 0x0123, 0x0135, 0x013f, - 0x0160, 0x0176, 0x019c, 0x01ac, 0x01be, 0x01cc, 0x01e3, 0x01f3, - 0x0201, 0x0211, 0x021b, 0x0234, 0x0257, 0x0263, 0x0271, 0x0298, - 0x02a8, 0x02b4, 0x02be, 0x02d5, 0x02e5, 0x02f5, 0x02ff, 0x030b, - 0x033b, 0x0356, 0x0395, 0x03b4, 0x03c6, 0x03dc, 0x03f3, 0x03fb, - 0x0409, 0x0413, 0x0423, 0x0444, 0x0457, 0x045f, 0x0472, 0x0480, - 0x0499, 0x04a1, 0x04ab, 0x04bb, 0x04e1, 0x04ef, 0x04f9, 0x0509, - // Entry 40 - 7F - 0x0538, 0x0542, 0x055e, 0x056c, 0x057a, 0x0586, 0x05a3, 0x05b1, - 0x05bf, 0x05cd, 0x05ea, 0x05ea, 0x05fc, 0x0606, 0x062d, 0x0641, - 0x0662, 0x0670, 0x067a, 0x0696, 0x06a4, 0x06b0, 0x06d3, 0x06df, - 0x06e7, 0x06f9, 0x070d, 0x0719, 0x0725, 0x0737, 0x0760, 0x076c, - 0x07c9, 0x07db, 0x07e3, 0x07fa, 0x0804, 0x0827, 0x0856, 0x0866, - 0x0876, 0x0880, 0x088e, 0x08af, 0x08c1, 0x08d1, 0x08df, 0x08f4, - 0x08fe, 0x0948, 0x0950, 0x0958, 0x0968, 0x0974, 0x0980, 0x098c, - 0x099c, 0x09a8, 0x09b2, 0x09c6, 0x09d6, 0x09e6, 0x0a07, 0x0a26, - // Entry 80 - BF - 0x0a43, 0x0a60, 0x0a6c, 0x0a8d, 0x0a9f, 0x0aa7, 0x0ab1, 0x0ac4, - 0x0ada, 0x0aeb, 0x0af9, 0x0b05, 0x0b0f, 0x0b23, 0x0b2f, 0x0b39, - 0x0b45, 0x0b51, 0x0b5f, 0x0b73, 0x0b86, 0x0b9a, 0x0bbb, 0x0bcd, - 0x0bd5, 0x0bef, 0x0bff, 0x0c1e, 0x0c54, 0x0c66, 0x0c7a, 0x0c8c, - 0x0c98, 0x0ca8, 0x0cb8, 0x0cc4, 0x0cd2, 0x0ce2, 0x0cf2, 0x0d00, - 0x0d1d, 0x0d27, 0x0d44, 0x0d52, 0x0d64, 0x0d78, 0x0d88, 0x0d92, - 0x0d9c, 0x0da4, 0x0dbf, 0x0dc7, 0x0dd3, 0x0ddb, 0x0e04, 0x0e26, - 0x0e36, 0x0e46, 0x0e54, 0x0e76, 0x0e93, 0x0ea8, 0x0ed3, 0x0ee7, - // Entry C0 - FF - 0x0ef1, 0x0f01, 0x0f0b, 0x0f28, 0x0f36, 0x0f44, 0x0f50, 0x0f5a, - 0x0f66, 0x0f87, 0x0faa, 0x0fcf, 0x0fd9, 0x0fe5, 0x0ff5, 0x101b, - 0x102b, 0x1050, 0x1060, 0x1075, 0x1088, 0x1096, 0x10a2, 0x10b0, - 0x10cb, 0x10ee, 0x1100, 0x1115, 0x111f, 0x1131, 0x114f, 0x1169, - 0x116f, 0x11ab, 0x11b3, 0x11c1, 0x11d7, 0x11e5, 0x11fa, 0x1212, - 0x121c, 0x1226, 0x1232, 0x1252, 0x125e, 0x126c, 0x127c, 0x128a, - 0x1296, 0x12c9, 0x12c9, 0x12f3, 0x1301, 0x1315, 0x1323, 0x1352, - 0x1364, 0x139c, 0x13d8, 0x13e7, 0x13f5, 0x140f, 0x1419, 0x1425, - // Entry 100 - 13F - 0x142d, 0x1437, 0x1472, 0x147e, 0x148e, 0x14ab, 0x14b3, 0x14bf, - 0x14e0, 0x1501, 0x150f, 0x152c, 0x1551, 0x156e, 0x158d, 0x15b0, - 0x15cf, 0x1606, 0x1639, 0x165a, 0x1673, 0x168e, 0x16b8, 0x16d7, - 0x16ed, 0x16ff, 0x1726, 0x1738, 0x1740, 0x175f, 0x1778, 0x1784, - 0x17a1, 0x17c0, 0x17dd, 0x17fe, - }, - }, - { // bem - "Zambia", - []uint16{ // 260 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 100 - 13F - 0x0000, 0x0000, 0x0000, 0x0006, - }, - }, - { // bez - "HuandolaHufalme dza HihalabuHuafuganistaniHuantigua na HubarubudaHuangui" + - "laHualbaniaHuameniaHuangolaHuajendinaHusamoa ya HumalekaniHuastliaHu" + - "austlaliaHualubaHuazabajaniHubosinia na HuhezegovinaHubabadosiHubang" + - "aladeshiHuubelgijiHubukinafasoHubulgariaHubahaleniHuburundiHubeniniH" + - "ubelmudaHubruneiHuboliviaHublaziliHubahamaHubutaniHubotiswanaHubelal" + - "usiHubelizeHukanadaIjamhuri ya Hidemokrasi ya HukongoIjamhuri ya Afr" + - "ika ya PagatiHukongoHuuswisiHukodivaaIfisima fya KookHuchileHukameru" + - "niHuchinaHukolombiaHukostarikaHukubaHukepuvedeHukuprosiIjamhuri ya C" + - "hekiHuujerumaniHujibutiHudenmakiHudominikaIjamhuri ya HudominikaHual" + - "jeliaHuekwadoHuestoniaHumisriHueritreaHuhispaniaHuuhabeshiHuufiniHuf" + - "ijiIfisima fya FalklandHumikronesiaHuufaransaHugaboniHuuingerezaHugr" + - "enadaHujojiaHugwiyana ya HuufaransaHughanaHujiblaltaHujinlandiHugamb" + - "iaHujineHugwadelupeHuginekwetaHuugilikiHugwatemalaHugwamHuginebisauH" + - "uguyanaHuhondulasiHukorasiaHuhaitiHuhungaliaHuindonesiaHuayalandiHui" + - "slaheliHuindiaUlubali lwa Hubahari ya Hindi lwa HuingerezaHuilakiHuu" + - "ajemiHuaislandiHuitaliaHujamaikaHuyolodaniHujapaniHukenyaHukiligizis" + - "taniHukambodiaHukilibatiHukomoroHusantakitzi na HunevisHukolea Kaska" + - "ziniHukolea KusiniHukuwaitiIfisima fya KaymanHukazakistaniHulaosiHul" + - "ebanoniHusantalusiaHulishenteniHusirilankaHulibeliaHulesotoHulitwani" + - "aHulasembagiHulativiaHulibiyaHumolokoHumonakoHumoldovaHubukiniIfisim" + - "a fya MarshalHumasedoniaHumaliHumyamaHumongoliaIfisima fya Mariana f" + - "ya HukaskaziniHumartinikiHumolitaniaHumontserratiHumaltaHumolisiHumo" + - "divuHumalawiHumeksikoHumalesiaHumusumbijiHunamibiaHunyukaledoniaHuni" + - "jeliIhisima sha NorfokHunijeliaHunikaragwaHuuholanziHunolweHunepaliH" + - "unauruHuniueHunyuzilandiHuomaniHupanamaHupeluHupolinesia ya Huufaran" + - "saHupapuaHufilipinoHupakistaniHupolandiHusantapieri na HumikeloniHup" + - "itkainiHupwetorikoUlubali lwa Magharibi nu Gaza wa HupalestinaHuulen" + - "oHupalauHupalagwaiHukataliHuliyunioniHulomaniaHuulusiHulwandaHusaudi" + - "Ifisima fya SolomonHushelisheliHusudaniHuuswidiHusingapooHusantahele" + - "naHusloveniaHuslovakiaHusiela LioniHusamalinoHusenegaliHusomaliaHusu" + - "rinamuHusaotome na HuprinsipeHuelsavadoHusiliaHuuswaziIfisima fya Tu" + - "rki na KaikoHuchadiHutogoHutailandiHutajikistaniHutokelauHutimori ya" + - " MasharikiHuuturukimenistaniHutunisiaHutongaHuuturukiHutrinad na Hut" + - "obagoHutuvaluHutaiwaniHutanzaniaHuukrainiHuugandaHumalekaniHuulugwai" + - "HuuzibekistaniHuvatikaniHusantavisenti na HugrenadiniHuvenezuelaIfis" + - "ima fya Virgin fya HuingerezaIfisima fya Virgin fya HumelekaniHuviet" + - "inamuHuvanuatuHuwalis na HufutunaHusamoaHuyemeniHumayotteHuafrika iy" + - "a HukusiniHuzambiaHuzimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0008, 0x001c, 0x002a, 0x0041, 0x004a, 0x0053, - 0x005b, 0x0063, 0x0063, 0x006d, 0x0082, 0x008a, 0x0095, 0x009c, - 0x009c, 0x00a7, 0x00c0, 0x00ca, 0x00d8, 0x00e2, 0x00ee, 0x00f8, - 0x0102, 0x010b, 0x0113, 0x0113, 0x011c, 0x0124, 0x012d, 0x012d, - 0x0136, 0x013e, 0x0146, 0x0146, 0x0151, 0x015b, 0x0163, 0x016b, - 0x016b, 0x018d, 0x01a9, 0x01b0, 0x01b8, 0x01c1, 0x01d1, 0x01d8, - 0x01e2, 0x01e9, 0x01f3, 0x01f3, 0x01fe, 0x0204, 0x020e, 0x020e, - 0x020e, 0x0217, 0x0228, 0x0233, 0x0233, 0x023b, 0x0244, 0x024e, - // Entry 40 - 7F - 0x0264, 0x026d, 0x026d, 0x0275, 0x027e, 0x0285, 0x0285, 0x028e, - 0x0298, 0x02a2, 0x02a2, 0x02a2, 0x02a9, 0x02af, 0x02c3, 0x02cf, - 0x02cf, 0x02d9, 0x02e1, 0x02ec, 0x02f5, 0x02fc, 0x0313, 0x0313, - 0x031a, 0x0324, 0x032e, 0x0336, 0x033c, 0x0347, 0x0352, 0x035b, - 0x035b, 0x0366, 0x036c, 0x0377, 0x037f, 0x037f, 0x037f, 0x038a, - 0x0393, 0x039a, 0x03a4, 0x03a4, 0x03af, 0x03b9, 0x03c3, 0x03c3, - 0x03ca, 0x03f6, 0x03fd, 0x0405, 0x040f, 0x0417, 0x0417, 0x0420, - 0x042a, 0x0432, 0x0439, 0x0448, 0x0452, 0x045c, 0x0464, 0x047b, - // Entry 80 - BF - 0x048c, 0x049a, 0x04a3, 0x04b5, 0x04c2, 0x04c9, 0x04d3, 0x04df, - 0x04eb, 0x04f6, 0x04ff, 0x0507, 0x0511, 0x051c, 0x0525, 0x052d, - 0x0535, 0x053d, 0x0546, 0x0546, 0x0546, 0x054e, 0x0561, 0x056c, - 0x0572, 0x0579, 0x0583, 0x0583, 0x05a6, 0x05b1, 0x05bc, 0x05c9, - 0x05d0, 0x05d8, 0x05e0, 0x05e8, 0x05f1, 0x05fa, 0x0605, 0x060e, - 0x061c, 0x0624, 0x0636, 0x063f, 0x064a, 0x0654, 0x065b, 0x0663, - 0x066a, 0x0670, 0x067c, 0x0683, 0x068b, 0x0691, 0x06aa, 0x06b1, - 0x06bb, 0x06c6, 0x06cf, 0x06e9, 0x06f3, 0x06fe, 0x072a, 0x0731, - // Entry C0 - FF - 0x0738, 0x0742, 0x074a, 0x074a, 0x0755, 0x075e, 0x075e, 0x0765, - 0x076d, 0x0774, 0x0787, 0x0793, 0x079b, 0x07a3, 0x07ad, 0x07ba, - 0x07c4, 0x07c4, 0x07ce, 0x07db, 0x07e5, 0x07ef, 0x07f8, 0x0802, - 0x0802, 0x0819, 0x0823, 0x0823, 0x082a, 0x0832, 0x0832, 0x084c, - 0x0853, 0x0853, 0x0859, 0x0863, 0x0870, 0x0879, 0x088e, 0x08a0, - 0x08a9, 0x08b0, 0x08b9, 0x08cd, 0x08d5, 0x08de, 0x08e8, 0x08f1, - 0x08f9, 0x08f9, 0x08f9, 0x0903, 0x090c, 0x091a, 0x0924, 0x0941, - 0x094c, 0x096d, 0x098e, 0x0999, 0x09a2, 0x09b5, 0x09bc, 0x09bc, - // Entry 100 - 13F - 0x09c4, 0x09cd, 0x09e2, 0x09ea, 0x09f4, - }, - }, - { // bg - bgRegionStr, - bgRegionIdx, - }, - { // bm - "AndɔrArabu mara kafoliAfiganistaŋAntiga-ni-BarbudaAngiyaAlibaniArimeniAn" + - "golaArizantinSamowa amerikaniOtirisiOsitiraliArubaAzɛrbayjaŋBozni-Ɛr" + - "izigoviniBarbadiBɛngiladɛsiBɛlizikiBurukina FasoBuligariBareyiniBuru" + - "ndiBenɛnBermudiBurinɛyiBoliviBereziliBahamasiButaŋBɔtisiwanaBelarusi" + - "BeliziKanadaKongo ka republiki demɔkratikiSantarafirikiKongoSuwisiKo" + - "diwariKuki GunSiliKameruniSiniwajamanaKolombiKɔsitarikaKubaCapivɛrdi" + - "CipriCeki republikiAlimaɲiJibutiDanemarkiDɔminikiDɔmimiki republikiA" + - "lizeriEkwatɔrEsetoniEziputiEritereEsipaɲiEtiopiFinilandiFijiMaluwini" + - " GunMikironesiFaransiGabɔŋAngilɛtɛriGranadiZeyɔrziFaransi ka gwiyani" + - "GanaZibralitariGɔrɔhenelandiGanbiGineGwadelupGine ekwatɔriGɛrɛsiGwat" + - "emalaGwamGine BisawoGwiyanaHɔndirasiKroasiAyitiHɔngriƐndoneziIriland" + - "iIsirayeliƐndujamanaAngilɛ ka ɛndu dugukoloIrakiIraŋIsilandiItaliZam" + - "ayikiZɔrdaniZapɔnKeniyaKirigizisitaŋKambojiKiribatiKomɔriKristɔfo-Se" + - "nu-ni-ƝevɛsKɛɲɛka KoreWorodugu KoreKowɛtiBama GunKazakistaŋLayosiLib" + - "aŋLusi-SenuLisɛnsitayiniSirilankaLiberiyaLesotoLituyaniLikisanburuLe" + - "toniLibiMarɔkuMonakoMolidaviMadagasikariMarisali GunMacedɔniMaliMyan" + - "imariMoŋoliKɛɲɛka Mariyani GunMaritinikiMɔritaniMoŋseraMaltiMorisiMa" + - "ldiviMalawiMeksikiMalɛziMozanbikiNamibiKaledoni KouraNizɛriNɔrofolik" + - "i GunNizeriyaNikaragwaPeyibaNɔriwɛziNepaliNawuruNyuweZelandi KouraOm" + - "aŋPanamaPeruFaransi ka polineziPapuwasi-Gine-KouraFilipiniPakisitaŋP" + - "oloɲiPiyɛri-Senu-ni-MikelɔŋPitikariniPɔrotorikoPalesitiniPɔritigaliP" + - "alawuParaguwayiKatariReyuɲɔŋRumaniIrisiRuwandaArabiya SawudiyaSalomo" + - " GunSesɛliSudaŋSuwɛdiSɛngapuriƐlɛni SenuSloveniSlowakiSiyera LewɔniM" + - "arini-SenuSenegaliSomaliSurinamiSawo Tome-ni-PrinicipeSalivadɔrSiriS" + - "wazilandiTuriki Gun ni KayikiCadiTogoTayilandiTajikisitaniTokeloKɔrɔ" + - "n TimɔrTurikimenisitaniTuniziTongaTurikiTrinite-ni-TobagoTuvaluTayiw" + - "aniTanzaniUkɛrɛniUgandaAmerikiUrugwayiUzebekisitaniVatikaŋVinisɛn-Se" + - "nu-ni-GrenadiniVenezuwelaAngilɛ ka Sungurunnin GunAmeriki ka Sunguru" + - "nnin GunWiyɛtinamuVanuwatuWalisi-ni-FutunaSamowaYemɛniMayotiWorodugu" + - " AfrikiZanbiZimbabuwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0017, 0x0023, 0x0034, 0x003a, 0x0041, - 0x0048, 0x004e, 0x004e, 0x0057, 0x0067, 0x006e, 0x0077, 0x007c, - 0x007c, 0x0088, 0x009a, 0x00a1, 0x00ae, 0x00b7, 0x00c4, 0x00cc, - 0x00d4, 0x00db, 0x00e1, 0x00e1, 0x00e8, 0x00f1, 0x00f7, 0x00f7, - 0x00ff, 0x0107, 0x010d, 0x010d, 0x0118, 0x0120, 0x0126, 0x012c, - 0x012c, 0x014b, 0x0158, 0x015d, 0x0163, 0x016b, 0x0173, 0x0177, - 0x017f, 0x018b, 0x0192, 0x0192, 0x019d, 0x01a1, 0x01ab, 0x01ab, - 0x01ab, 0x01b0, 0x01be, 0x01c6, 0x01c6, 0x01cc, 0x01d5, 0x01de, - // Entry 40 - 7F - 0x01f1, 0x01f8, 0x01f8, 0x0200, 0x0207, 0x020e, 0x020e, 0x0215, - 0x021d, 0x0223, 0x0223, 0x0223, 0x022c, 0x0230, 0x023c, 0x0246, - 0x0246, 0x024d, 0x0254, 0x0260, 0x0267, 0x026f, 0x0281, 0x0281, - 0x0285, 0x0290, 0x029f, 0x02a4, 0x02a8, 0x02b0, 0x02be, 0x02c6, - 0x02c6, 0x02cf, 0x02d3, 0x02de, 0x02e5, 0x02e5, 0x02e5, 0x02ef, - 0x02f5, 0x02fa, 0x0301, 0x0301, 0x030a, 0x0312, 0x031b, 0x031b, - 0x0326, 0x033f, 0x0344, 0x0349, 0x0351, 0x0356, 0x0356, 0x035e, - 0x0366, 0x036c, 0x0372, 0x0380, 0x0387, 0x038f, 0x0396, 0x03af, - // Entry 80 - BF - 0x03bd, 0x03ca, 0x03d1, 0x03d9, 0x03e4, 0x03ea, 0x03f0, 0x03f9, - 0x0407, 0x0410, 0x0418, 0x041e, 0x0426, 0x0431, 0x0437, 0x043b, - 0x0442, 0x0448, 0x0450, 0x0450, 0x0450, 0x045c, 0x0468, 0x0471, - 0x0475, 0x047e, 0x0485, 0x0485, 0x049b, 0x04a5, 0x04ae, 0x04b6, - 0x04bb, 0x04c1, 0x04c8, 0x04ce, 0x04d5, 0x04dc, 0x04e5, 0x04eb, - 0x04f9, 0x0500, 0x050f, 0x0517, 0x0520, 0x0526, 0x0530, 0x0536, - 0x053c, 0x0541, 0x054e, 0x0553, 0x0559, 0x055d, 0x0570, 0x0583, - 0x058b, 0x0595, 0x059c, 0x05b5, 0x05bf, 0x05ca, 0x05d4, 0x05df, - // Entry C0 - FF - 0x05e5, 0x05ef, 0x05f5, 0x05f5, 0x05ff, 0x0605, 0x0605, 0x060a, - 0x0611, 0x0621, 0x062b, 0x0632, 0x0638, 0x063f, 0x0649, 0x0655, - 0x065c, 0x065c, 0x0663, 0x0671, 0x067c, 0x0684, 0x068a, 0x0692, - 0x0692, 0x06a8, 0x06b2, 0x06b2, 0x06b6, 0x06c0, 0x06c0, 0x06d4, - 0x06d8, 0x06d8, 0x06dc, 0x06e5, 0x06f1, 0x06f7, 0x0705, 0x0715, - 0x071b, 0x0720, 0x0726, 0x0737, 0x073d, 0x0745, 0x074c, 0x0755, - 0x075b, 0x075b, 0x075b, 0x0762, 0x076a, 0x0777, 0x077f, 0x0799, - 0x07a3, 0x07bd, 0x07d7, 0x07e2, 0x07ea, 0x07fa, 0x0800, 0x0800, - // Entry 100 - 13F - 0x0807, 0x080d, 0x081c, 0x0821, 0x082a, - }, - }, - { // bn - bnRegionStr, - bnRegionIdx, - }, - { // bn-IN - "হন্ডুরাসমলডোভামার্কিন যুক্তরাষ্ট্রের পার্শ্ববর্তী দ্বীপপুঞ্জ", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - // Entry 80 - BF - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - // Entry C0 - FF - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, - 0x002a, 0x00ae, - }, - }, - { // bo - "རྒྱ་ནགའཇར་མན་དབྱིན་ཇི་རྒྱ་གར་ཨི་ཀྲར་ལི་ཉི་ཧོང་ལྷོ་ཀོ་རི་ཡ།བལ་ཡུལ་ཨུ་རུ་ས" + - "ུ་ཨ་མེ་རི་ཀ།མིའི་ཤེས་རྟོགས་མ་བྱུང་བའི་ཁོར་ཡུགའཛམ་གླིང་།", - []uint16{ // 263 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, - // Entry 40 - 7F - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, - 0x0027, 0x0027, 0x0027, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0075, 0x0075, 0x0075, - 0x0075, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, - // Entry 80 - BF - 0x008a, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00c3, - 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, - 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, - // Entry C0 - FF - 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00de, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, - 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, - // Entry 100 - 13F - 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x015f, 0x017d, - }, - }, - { // bo-IN - "ཨོཤི་ཡཱན་ན།", - []uint16{ // 267 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 100 - 13F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0021, - }, - }, - { // br - "Enez AscensionAndorraEmirelezhioù Arab UnanetAfghanistanAntigua ha Barbu" + - "daAnguillaAlbaniaArmeniaAngolaAntarktikaArcʼhantinaSamoa AmerikanAos" + - "triaAostraliaArubaInizi ÅlandAzerbaidjanBosnia ha HerzegovinaBarbado" + - "sBangladeshBelgiaBurkina FasoBulgariaBahreinBurundiBeninSaint Barthé" + - "lemyBermudaBruneiBoliviaKarib NederlandatBrazilBahamasBhoutanEnez Bo" + - "uvetBotswanaBelarusBelizeKanadaInizi KokozKongo - KinshasaRepublik K" + - "reizafrikanKongo - BrazzavilleSuisAod an OlifantInizi CookChileKamer" + - "ounSinaKolombiaEnez ClippertonCosta RicaKubaKab-GlasCuraçaoEnez Chri" + - "stmasKiprenezRepublik TchekAlamagnDiego GarciaDjiboutiDanmarkDominic" + - "aRepublik DominikanAljeriaCeuta ha MelillaEcuadorEstoniaEgiptSahara " + - "ar CʼhornôgEritreaSpagnEtiopiaUnaniezh EuropaFinlandFidjiInizi Falkl" + - "andMikroneziaInizi FaeroFrañsGabonRouantelezh-UnanetGrenadaJorjiaGwi" + - "ana cʼhallGwernenezGhanaJibraltarGreunlandGambiaGineaGwadeloupGinea " + - "ar CʼhehederGresInizi Georgia ar Su hag Inizi Sandwich ar SuGuatemal" + - "aGuamGinea-BissauGuyanaHong Kong RMD SinaInizi Heard ha McDonaldHond" + - "urasKroatiaHaitiHungariaInizi KanariezIndoneziaIwerzhonIsraelEnez Va" + - "navIndiaTiriad breizhveurat Meurvor IndezIraqIranIslandItaliaJerzene" + - "zJamaikaJordaniaJapanKenyaKyrgyzstanKambodjaKiribatiKomorezSaint Kit" + - "ts ha NevisKorea an NorzhKorea ar SuKoweitInizi CaymanKazakstanLaosL" + - "ibanSaint LuciaLiechtensteinSri LankaLiberiaLesothoLituaniaLuksembou" + - "rgLatviaLibiaMarokoMonacoMoldovaMontenegroSaint MartinMadagaskarIniz" + - "i MarshallMakedoniaMaliMyanmar (Birmania)MongoliaMacau RMD SinaInizi" + - " Mariana an NorzhMartinikMaouritaniaMontserratMaltaMorisMaldivezMala" + - "wiMecʼhikoMalaysiaMozambikNamibiaKaledonia NevezNigerEnez NorfolkNig" + - "eriaNicaraguaIzelvroioùNorvegiaNepalNauruNiueZeland-NevezOmanPanamáP" + - "erouPolinezia CʼhallPapoua Ginea-NevezFilipinezPakistanPoloniaSant-P" + - "êr-ha-MikelonEnez PitcairnPuerto RicoTiriadoù PalestinaPortugalPala" + - "uParaguayQatarOseania diabellAr ReünionRoumaniaSerbiaRusiaRwandaArab" + - "ia SaoudatInizi SalomonSechelezSoudanSvedenSingapourSaint-HelenaSlov" + - "eniaSvalbardSlovakiaSierra LeoneSan MarinoSenegalSomaliaSurinamSusou" + - "danSão Tomé ha PríncipeSalvadorSint MaartenSiriaSwazilandTristan da " + - "CunhaInizi Turks ha CaicosTchadDouaroù aostral FrañsTogoThailandTadj" + - "ikistanTokelauTimor-LesteTurkmenistanTuniziaTongaTurkiaTrinidad ha T" + - "obagoTuvaluTaiwanTanzaniaUkrainaOugandaInizi diabell ar Stadoù-Unane" + - "tStadoù-UnanetUruguayOuzbekistanVatikanSant Visant hag ar Grenadinez" + - "VenezuelaInizi Gwercʼh Breizh-VeurInizi Gwercʼh ar Stadoù-UnanetViêt" + - " NamVanuatuWallis ha FutunaSamoaKosovoYemenMayotteSuafrikaZambiaZimb" + - "abweRannved dianavBedAfrikaNorzhamerikaSuamerikaOseaniaAfrika ar Cʼh" + - "ornôgKreizamerikaAfrika ar ReterAfrika an NorzhAfrika ar CʼhreizAfri" + - "ka ar SuAmerikaoùAmerika an NorzhKaribAzia ar ReterAzia ar SuAzia ar" + - " GevredEuropa ar SuAostralaziaMelaneziaRannved MikroneziaPolineziaAz" + - "iaAzia ar CʼhreizAzia ar CʼhornôgEuropaEuropa ar ReterEuropa an Norz" + - "hEuropa ar CʼhornôgAmerika Latin", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000e, 0x0015, 0x002e, 0x0039, 0x004b, 0x0053, 0x005a, - 0x0061, 0x0067, 0x0071, 0x007d, 0x008b, 0x0092, 0x009b, 0x00a0, - 0x00ac, 0x00b7, 0x00cc, 0x00d4, 0x00de, 0x00e4, 0x00f0, 0x00f8, - 0x00ff, 0x0106, 0x010b, 0x011c, 0x0123, 0x0129, 0x0130, 0x0141, - 0x0147, 0x014e, 0x0155, 0x0160, 0x0168, 0x016f, 0x0175, 0x017b, - 0x0186, 0x0196, 0x01ab, 0x01be, 0x01c2, 0x01d0, 0x01da, 0x01df, - 0x01e7, 0x01eb, 0x01f3, 0x0202, 0x020c, 0x0210, 0x0218, 0x0220, - 0x022e, 0x0236, 0x0244, 0x024b, 0x0257, 0x025f, 0x0266, 0x026e, - // Entry 40 - 7F - 0x0280, 0x0287, 0x0297, 0x029e, 0x02a5, 0x02aa, 0x02be, 0x02c5, - 0x02ca, 0x02d1, 0x02e0, 0x02e0, 0x02e7, 0x02ec, 0x02fa, 0x0304, - 0x030f, 0x0315, 0x031a, 0x032c, 0x0333, 0x0339, 0x0347, 0x0350, - 0x0355, 0x035e, 0x0367, 0x036d, 0x0372, 0x037b, 0x038e, 0x0392, - 0x03be, 0x03c7, 0x03cb, 0x03d7, 0x03dd, 0x03ef, 0x0406, 0x040e, - 0x0415, 0x041a, 0x0422, 0x0430, 0x0439, 0x0441, 0x0447, 0x0451, - 0x0456, 0x0477, 0x047b, 0x047f, 0x0485, 0x048b, 0x0493, 0x049a, - 0x04a2, 0x04a7, 0x04ac, 0x04b6, 0x04be, 0x04c6, 0x04cd, 0x04e1, - // Entry 80 - BF - 0x04ef, 0x04fa, 0x0500, 0x050c, 0x0515, 0x0519, 0x051e, 0x0529, - 0x0536, 0x053f, 0x0546, 0x054d, 0x0555, 0x0560, 0x0566, 0x056b, - 0x0571, 0x0577, 0x057e, 0x0588, 0x0594, 0x059e, 0x05ac, 0x05b5, - 0x05b9, 0x05cb, 0x05d3, 0x05e1, 0x05f7, 0x05ff, 0x060a, 0x0614, - 0x0619, 0x061e, 0x0626, 0x062c, 0x0635, 0x063d, 0x0645, 0x064c, - 0x065b, 0x0660, 0x066c, 0x0673, 0x067c, 0x0687, 0x068f, 0x0694, - 0x0699, 0x069d, 0x06a9, 0x06ad, 0x06b4, 0x06b9, 0x06ca, 0x06dc, - 0x06e5, 0x06ed, 0x06f4, 0x0708, 0x0715, 0x0720, 0x0733, 0x073b, - // Entry C0 - FF - 0x0740, 0x0748, 0x074d, 0x075c, 0x0767, 0x076f, 0x0775, 0x077a, - 0x0780, 0x078e, 0x079b, 0x07a3, 0x07a9, 0x07af, 0x07b8, 0x07c4, - 0x07cc, 0x07d4, 0x07dc, 0x07e8, 0x07f2, 0x07f9, 0x0800, 0x0807, - 0x080f, 0x0826, 0x082e, 0x083a, 0x083f, 0x0848, 0x0858, 0x086d, - 0x0872, 0x0889, 0x088d, 0x0895, 0x08a0, 0x08a7, 0x08b2, 0x08be, - 0x08c5, 0x08ca, 0x08d0, 0x08e2, 0x08e8, 0x08ee, 0x08f6, 0x08fd, - 0x0904, 0x0923, 0x0923, 0x0931, 0x0938, 0x0943, 0x094a, 0x0967, - 0x0970, 0x098a, 0x09aa, 0x09b3, 0x09ba, 0x09ca, 0x09cf, 0x09d5, - // Entry 100 - 13F - 0x09da, 0x09e1, 0x09e9, 0x09ef, 0x09f7, 0x0a05, 0x0a08, 0x0a0e, - 0x0a1a, 0x0a23, 0x0a2a, 0x0a3e, 0x0a4a, 0x0a59, 0x0a68, 0x0a7a, - 0x0a86, 0x0a90, 0x0aa0, 0x0aa5, 0x0ab2, 0x0abc, 0x0aca, 0x0ad6, - 0x0ae1, 0x0aea, 0x0afc, 0x0b05, 0x0b09, 0x0b19, 0x0b2b, 0x0b31, - 0x0b40, 0x0b4f, 0x0b63, 0x0b70, - }, - }, - { // brx - "ऍन्डोरासंयुक्त अरब अमीरातअफ़ग़ानिस्तानएन्टिगुआ एवं बारबूडाएंगीलाअल्बानिय" + - "ाआर्मेनियाअंगोलाअंटार्कटिकाअर्जेण्टिनाअमरिकी समोआऑस्ट्रियाऑस्ट्रेल" + - "ियाअरूबाआलाँड द्वीपअज़रबैजानबोसनिया हर्ज़ेगोविनाबारबाडोसबंगलादेशबे" + - "ल्जियमबुर्किना फासोबल्गैरियाबहरैनबुरुंडीबेनेँसेँ बार्थेलेमीबरमूडाब" + - "्रूनइबोलीवियाब्राज़ीलबहामाभूटानबुवे द्वीपबोत्स्वानाबेलारूसबेलिज़कै" + - "नाडाकोकोस द्वीपकॉंगो किनशासासेंट्रल अफ्रीकन रिपब्लिककॉंगो ब्राज़्ज" + - "़ावीलस्वित्ज़रलैंडआईवरी कोस्टकुक द्वीपचिलीकोमेरानचीनकोलम्बियाकोस्ट" + - "ारीकाक्यूबाकैप वेर्देक्रिस्मस द्वीपसाइप्रसचेक गणराज्यजर्मनीद्जिबूत" + - "ीडेनमार्कडोमिनिकाडोमिनिकन गणराज्यअल्जीरियाएक्वाडोरएस्टोनियामिस्रपश" + - "्चिमी सहाराएरिट्रियास्पेनइथिओपियायूरोपीय संघफिनलैंडफिजीफ़ॉल्कलैंड " + - "द्वीपमाइक्रोनेशियाफरो द्वीपफ्राँसगैबॉनब्रितनग्रेनडाजॉर्जियाफ्राँसी" + - "सी गिआनागेर्नसेघानाजिब्राल्टरग्रीनलैण्डगाम्बियागिनीग्वादलुपइक्वेटो" + - "रियल गिनीग्रीसदक्षिण जोर्जिया एवं दक्षिण सैंडवीच द्वीपगोतेदालागुआम" + - "गीनी-बिसाउगुयानाहाँगकाँग विशेष प्रशासनिक क्षेत्र चीनहर्ड द्वीप एवं" + - " मैकडोनॉल्ड द्वीपहौण्डूरासक्रोएशियाहाइतीहंगरीइंडोनेशियाआयरलैंडइस्राइ" + - "लआईल ऑफ़ मैनभारतब्रिटिश हिंद महासागरिय क्षेत्रईराक़ईरानआइसलैंडइटली" + - "जर्सीजमाइकाजॉर्डनजापानकेन्याकिर्गिज़कम्बोडियाकिरिबातीकोमोरोज़सेंट " + - "किट्स एवं नेविसउत्तर कोरियादक्षिण कोरियाकुवैतकेमैन द्वीपकज़ाखस्तान" + - "लाओसलेबनोनसेंट लूसियालिक्टैनस्टाईनश्री लँकालाइबेरियालसोथोलिथुआनिया" + - "लक्समबर्गलाट्वीयालीबियामोरोक्कोमोनाकोमोल्डेवियामोंटेनेग्रोसेँ मार्" + - "टेँमदागास्करमार्शल द्वीपमैसेडोनियामालीम्यानमारमंगोलियामकाओ विशेष प" + - "्रशासनिक क्षेत्र (चीन)उत्तरी मारियाना द्वीपमार्टीनिकमॉरिटेनियामॉंस" + - "ेरामाल्टामॉरिसमालदीवमलावीमैक्सिकोमलेशियामोज़ाम्बिकनामीबियान्यू कैल" + - "ेडोनियानाइजेरनॉरफ़ॉक द्वीपनाइजीरियानिकारागुआनेदरलैण्डनॉर्वेनेपालना" + - "उरूनीयूएन्यूज़ीलैंडओमानपनामापेरूफ्राँसीसी पॉलिनीशियापापुआ न्यू गिन" + - "ीफिलीपिन्सपाकिस्तानपोलैण्डसेँ पीएर एवं मि\u200dकेलॉंपिटकेर्नपुएर्ट" + - "ो रीकोफ़िलिस्तीनपुर्तगालपलाऊपारागुएक़तारबाहरिय ओशेआनियारेयूनियॉंरो" + - "मानियासर्बियारूसरूआण्डासऊदी अरबसॉलोमन द्वीपसेशेल्ससूदानस्वीडनसिंगा" + - "पुरसेण्\u200dट हेलेनास्लोवेनियास्वाल्बार्ड एवं यान मायेनस्लोवाकिया" + - "सियेरा लेओनसैन मरीनोसेनेगालसोमालियासुरिनामसाउँ-तोमे एवं प्रिंसिपऍल" + - " साल्वाडोरसीरियास्वाज़ीलैंडतुर्की एवं कैकोज़ द्वीपचाडफ्राँसीसी उत्तर" + - "ी क्षेत्रोंटोगोथाइलैण्डताजिकिस्तानटोकेलौपूर्वी तिमोरतुर्कमेनीस्तान" + - "त्युनिशियाटॉंगातुर्कीट्रिनिडाड एवं टोबैगोतुवालुताइवानतंज़ानियायूक्" + - "रेनयुगाँडायुनाइटेड स्टेट्स के छोटे बाहरिय द्वीपसंयुक्त राज्य अमरिक" + - "ायुरूगुएउज़बेकिस्तानवैटिकनसेंट विंसंट एवं दी ग्रनाडीन्स्वेनेज़ुएला" + - "ब्रिटिश वर्जीन आईलंड्सयु.एस. वर्जीन आईलंड्सवियतनामवानाऊटुवॉलेस एवं" + - " फ़्यूचूनासमोआयमनमैयौटदक्षिण अफ्रीकाज़ाम्बियाज़ीम्बाब्वेअज्ञात या अव" + - "ैध प्रदेशदुनियाअफ्रीकाउत्तर अमरिकादक्षिण अमरिकाओशेआनियापश्चिमी अफ्" + - "रीकामध्य अमरिकापूर्वी अफ्रीकाउत्तरी अफ्रीकामध्य अफ्रीकादक्षिणी अफ्" + - "रीकाअमरिकाज़्उत्तरी अमरिकाकैरिबियनपूर्वी एशियादक्षिणी एशियादक्षिण-" + - "पूर्वी एशियादक्षिणी यूरोपऑस्ट्रेलिया एवं न्यूजीलैंडमेलीनेशियामाईक्" + - "रोनेशियापोलीनेशियाएशियामध्य एशियापश्चिमी ऐशियायूरोपपूर्वी यूरोपउत्" + - "तरी यूरोपपश्चिमी यूरोप्लैटिन अमरिका एवं करीबी", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0015, 0x0047, 0x006e, 0x00a6, 0x00b8, 0x00d3, - 0x00ee, 0x0100, 0x0121, 0x0142, 0x0161, 0x017c, 0x019d, 0x01ac, - 0x01cb, 0x01e6, 0x0220, 0x0238, 0x0250, 0x0268, 0x028d, 0x02a8, - 0x02b7, 0x02cc, 0x02db, 0x0303, 0x0315, 0x0327, 0x033f, 0x033f, - 0x0357, 0x0366, 0x0375, 0x0391, 0x03af, 0x03c4, 0x03d6, 0x03e8, - 0x0407, 0x042c, 0x0470, 0x04a7, 0x04ce, 0x04ed, 0x0506, 0x0512, - 0x0527, 0x0530, 0x054b, 0x054b, 0x0569, 0x057b, 0x0597, 0x0597, - 0x05bf, 0x05d4, 0x05f3, 0x0605, 0x0605, 0x061d, 0x0635, 0x064d, - // Entry 40 - 7F - 0x067b, 0x0696, 0x0696, 0x06ae, 0x06c9, 0x06d8, 0x06fd, 0x0718, - 0x0727, 0x073f, 0x075e, 0x075e, 0x0773, 0x077f, 0x07ad, 0x07d4, - 0x07ed, 0x07ff, 0x080e, 0x0820, 0x0835, 0x084d, 0x0878, 0x088d, - 0x0899, 0x08b7, 0x08d5, 0x08ed, 0x08f9, 0x0911, 0x093f, 0x094e, - 0x09bc, 0x09d4, 0x09e0, 0x09fc, 0x0a0e, 0x0a72, 0x0ac7, 0x0ae2, - 0x0afd, 0x0b0c, 0x0b1b, 0x0b1b, 0x0b39, 0x0b4e, 0x0b63, 0x0b80, - 0x0b8c, 0x0be0, 0x0bef, 0x0bfb, 0x0c10, 0x0c1c, 0x0c2b, 0x0c3d, - 0x0c4f, 0x0c5e, 0x0c70, 0x0c88, 0x0ca3, 0x0cbb, 0x0cd3, 0x0d09, - // Entry 80 - BF - 0x0d2b, 0x0d50, 0x0d5f, 0x0d7e, 0x0d9c, 0x0da8, 0x0dba, 0x0dd9, - 0x0e00, 0x0e19, 0x0e34, 0x0e43, 0x0e5e, 0x0e79, 0x0e91, 0x0ea3, - 0x0ebb, 0x0ecd, 0x0eeb, 0x0f0c, 0x0f2b, 0x0f46, 0x0f68, 0x0f86, - 0x0f92, 0x0faa, 0x0fc2, 0x101c, 0x1057, 0x1072, 0x1090, 0x10a5, - 0x10b7, 0x10c6, 0x10d8, 0x10e7, 0x10ff, 0x1114, 0x1132, 0x114a, - 0x1175, 0x1187, 0x11ac, 0x11c7, 0x11e2, 0x11fd, 0x120f, 0x121e, - 0x122d, 0x123c, 0x125d, 0x1269, 0x1278, 0x1284, 0x12be, 0x12e7, - 0x1302, 0x131d, 0x1332, 0x136b, 0x1383, 0x13a5, 0x13c3, 0x13db, - // Entry C0 - FF - 0x13e7, 0x13fc, 0x140b, 0x1436, 0x1451, 0x1469, 0x147e, 0x1487, - 0x149c, 0x14b2, 0x14d4, 0x14e9, 0x14f8, 0x150a, 0x1522, 0x1547, - 0x1565, 0x15aa, 0x15c8, 0x15e7, 0x1600, 0x1615, 0x162d, 0x1642, - 0x1642, 0x167e, 0x16a0, 0x16a0, 0x16b2, 0x16d3, 0x16d3, 0x1712, - 0x171b, 0x1765, 0x1771, 0x1789, 0x17aa, 0x17bc, 0x17de, 0x1808, - 0x1826, 0x1835, 0x1847, 0x187f, 0x1891, 0x18a3, 0x18be, 0x18d3, - 0x18e8, 0x194d, 0x194d, 0x1985, 0x199a, 0x19be, 0x19d0, 0x1a22, - 0x1a40, 0x1a7e, 0x1ab5, 0x1aca, 0x1adf, 0x1b14, 0x1b20, 0x1b20, - // Entry 100 - 13F - 0x1b29, 0x1b38, 0x1b60, 0x1b7b, 0x1b9c, 0x1bd5, 0x1be7, 0x1bfc, - 0x1c1e, 0x1c43, 0x1c5b, 0x1c86, 0x1ca5, 0x1ccd, 0x1cf5, 0x1d17, - 0x1d42, 0x1d5d, 0x1d82, 0x1d9a, 0x1dbc, 0x1de1, 0x1e16, 0x1e3b, - 0x1e85, 0x1ea3, 0x1eca, 0x1ee8, 0x1ef7, 0x1f13, 0x1f38, 0x1f47, - 0x1f69, 0x1f8b, 0x1fb3, 0x1fef, - }, - }, - { // bs - "Ostrvo AsensionAndoraUjedinjeni Arapski EmiratiAfganistanAntigva i Barbu" + - "daAngvilaAlbanijaArmenijaAngolaAntarktikaArgentinaAmerička SamoaAust" + - "rijaAustralijaArubaOlandska OstrvaAzerbejdžanBosna i HercegovinaBarb" + - "adosBangladešBelgijaBurkina FasoBugarskaBahreinBurundiBeninSveti Bar" + - "tolomejBermudaBrunejBolivijaKaripska HolandijaBrazilBahamiButanOstrv" + - "o BuveBocvanaBjelorusijaBelizeKanadaKokosova (Kilingova) OstrvaDemok" + - "ratska Republika KongoCentralnoafrička RepublikaKongoŠvicarskaObala " + - "SlonovačeKukova OstrvaČileKamerunKinaKolumbijaOstrvo KlipertonKostar" + - "ikaKubaKape VerdeKurasaoBožićna OstrvaKiparČeškaNjemačkaDijego Garsi" + - "jaDžibutiDanskaDominikaDominikanska RepublikaAlžirSeuta i MeliljaEkv" + - "adorEstonijaEgipatZapadna SaharaEritrejaŠpanijaEtiopijaEvropska unij" + - "aFinskaFidžiFolklandska OstrvaMikronezijaFarska OstrvaFrancuskaGabon" + - "Velika BritanijaGrenadaGruzijaFrancuska GvajanaGernziGanaGibraltarGr" + - "enlandGambijaGvinejaGvadalupeEkvatorijalna GvinejaGrčkaJužna Džordži" + - "ja i Južna Sendvička OstrvaGvatemalaGuamGvineja-BisaoGvajanaHong Kon" + - "g (SAR Kina)Herd i arhipelag MekDonaldHondurasHrvatskaHaitiMađarskaK" + - "anarska OstrvaIndonezijaIrskaIzraelOstrvo ManIndijaBritanska Teritor" + - "ija u Indijskom OkeanuIrakIranIslandItalijaDžerziJamajkaJordanJapanK" + - "enijaKirgistanKambodžaKiribatiKomorska OstrvaSveti Kits i NevisSjeve" + - "rna KorejaJužna KorejaKuvajtKajmanska OstrvaKazahstanLaosLibanSveta " + - "LucijaLihtenštajnŠri LankaLiberijaLesotoLitvanijaLuksemburgLatvijaLi" + - "bijaMarokoMonakoMoldavijaCrna GoraSv. MartinMadagaskarMaršalova Ostr" + - "vaMakedonijaMaliMijanmarMongolijaMakao (SAR Kina)Sjeverna Marijanska" + - " OstrvaMartinikMauritanijaMonseratMaltaMauricijusMaldiviMalaviMeksik" + - "oMalezijaMozambikNamibijaNova KaledonijaNigerOstrvo NorfolkNigerijaN" + - "ikaragvaHolandijaNorveškaNepalNauruNiueNovi ZelandOmanPanamaPeruFran" + - "cuska PolinezijaPapua Nova GvinejaFilipiniPakistanPoljskaSveti Petar" + - " i MikelonPitkernska OstrvaPorto RikoPalestinska TeritorijaPortugalP" + - "alauParagvajKatarVanjska OkeanijaReunionRumunijaSrbijaRusijaRuandaSa" + - "udijska ArabijaSolomonska OstrvaSejšeliSudanŠvedskaSingapurSveta Hel" + - "enaSlovenijaSvalbard i Jan MajenSlovačkaSijera LeoneSan MarinoSenega" + - "lSomalijaSurinamJužni SudanSao Tome i PrincipeSalvadorSint MartenSir" + - "ijaSvazilendTristan da KunjaOstrva Turks i KaikosČadFrancuske Južne " + - "TeritorijeTogoTajlandTadžikistanTokelauIstočni TimorTurkmenistanTuni" + - "sTongaTurskaTrinidad i TobagoTuvaluTajvanTanzanijaUkrajinaUgandaAmer" + - "ička Vanjska OstrvaUjedinjene NacijeSjedinjene Američke DržaveUrugva" + - "jUzbekistanVatikanSveti Vinsent i GrenadinVenecuelaBritanska Djeviča" + - "nska OstrvaAmerička Djevičanska OstrvaVijetnamVanuatuOstrva Valis i " + - "FutunaSamoaKosovoJemenMajoteJužnoafrička RepublikaZambijaZimbabveNep" + - "oznata oblastSvijetAfrikaSjeverna AmerikaJužna AmerikaOkeanijaZapadn" + - "a AfrikaSrednja AmerikaIstočna AfrikaSjeverna AfrikaCentralna Afrika" + - "Južna AfrikaAmerikaSjeverni dio AmerikeKaribiIstočna AzijaJužna Azij" + - "aJugoistočna AzijaJužna EvropaAustralazijaMelanezijaMikronezijska re" + - "gijaPolinezijaAzijaCentralna AzijaZapadna AzijaEvropaIstočna EvropaS" + - "jeverna EvropaZapadna EvropaLatinska Amerika", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x0015, 0x002f, 0x0039, 0x004a, 0x0051, 0x0059, - 0x0061, 0x0067, 0x0071, 0x007a, 0x0089, 0x0091, 0x009b, 0x00a0, - 0x00af, 0x00bb, 0x00ce, 0x00d6, 0x00e0, 0x00e7, 0x00f3, 0x00fb, - 0x0102, 0x0109, 0x010e, 0x011e, 0x0125, 0x012b, 0x0133, 0x0145, - 0x014b, 0x0151, 0x0156, 0x0161, 0x0168, 0x0173, 0x0179, 0x017f, - 0x019a, 0x01b5, 0x01d0, 0x01d5, 0x01df, 0x01ef, 0x01fc, 0x0201, - 0x0208, 0x020c, 0x0215, 0x0225, 0x022e, 0x0232, 0x023c, 0x0243, - 0x0253, 0x0258, 0x025f, 0x0268, 0x0276, 0x027e, 0x0284, 0x028c, - // Entry 40 - 7F - 0x02a2, 0x02a8, 0x02b7, 0x02be, 0x02c6, 0x02cc, 0x02da, 0x02e2, - 0x02ea, 0x02f2, 0x0300, 0x0300, 0x0306, 0x030c, 0x031e, 0x0329, - 0x0336, 0x033f, 0x0344, 0x0354, 0x035b, 0x0362, 0x0373, 0x0379, - 0x037d, 0x0386, 0x038e, 0x0395, 0x039c, 0x03a5, 0x03ba, 0x03c0, - 0x03ed, 0x03f6, 0x03fa, 0x0407, 0x040e, 0x0422, 0x043c, 0x0444, - 0x044c, 0x0451, 0x045a, 0x0469, 0x0473, 0x0478, 0x047e, 0x0488, - 0x048e, 0x04b5, 0x04b9, 0x04bd, 0x04c3, 0x04ca, 0x04d1, 0x04d8, - 0x04de, 0x04e3, 0x04e9, 0x04f2, 0x04fb, 0x0503, 0x0512, 0x0524, - // Entry 80 - BF - 0x0533, 0x0540, 0x0546, 0x0556, 0x055f, 0x0563, 0x0568, 0x0574, - 0x0580, 0x058a, 0x0592, 0x0598, 0x05a1, 0x05ab, 0x05b2, 0x05b8, - 0x05be, 0x05c4, 0x05cd, 0x05d6, 0x05e0, 0x05ea, 0x05fb, 0x0605, - 0x0609, 0x0611, 0x061a, 0x062a, 0x0644, 0x064c, 0x0657, 0x065f, - 0x0664, 0x066e, 0x0675, 0x067b, 0x0682, 0x068a, 0x0692, 0x069a, - 0x06a9, 0x06ae, 0x06bc, 0x06c4, 0x06cd, 0x06d6, 0x06df, 0x06e4, - 0x06e9, 0x06ed, 0x06f8, 0x06fc, 0x0702, 0x0706, 0x071a, 0x072c, - 0x0734, 0x073c, 0x0743, 0x0758, 0x0769, 0x0773, 0x0789, 0x0791, - // Entry C0 - FF - 0x0796, 0x079e, 0x07a3, 0x07b3, 0x07ba, 0x07c2, 0x07c8, 0x07ce, - 0x07d4, 0x07e5, 0x07f6, 0x07fe, 0x0803, 0x080b, 0x0813, 0x081f, - 0x0828, 0x083c, 0x0845, 0x0851, 0x085b, 0x0862, 0x086a, 0x0871, - 0x087d, 0x0890, 0x0898, 0x08a3, 0x08a9, 0x08b2, 0x08c2, 0x08d7, - 0x08db, 0x08f6, 0x08fa, 0x0901, 0x090d, 0x0914, 0x0922, 0x092e, - 0x0933, 0x0938, 0x093e, 0x094f, 0x0955, 0x095b, 0x0964, 0x096c, - 0x0972, 0x098a, 0x099b, 0x09b7, 0x09be, 0x09c8, 0x09cf, 0x09e7, - 0x09f0, 0x0a0d, 0x0a2a, 0x0a32, 0x0a39, 0x0a4e, 0x0a53, 0x0a59, - // Entry 100 - 13F - 0x0a5e, 0x0a64, 0x0a7c, 0x0a83, 0x0a8b, 0x0a9b, 0x0aa1, 0x0aa7, - 0x0ab7, 0x0ac5, 0x0acd, 0x0adb, 0x0aea, 0x0af9, 0x0b08, 0x0b18, - 0x0b25, 0x0b2c, 0x0b40, 0x0b46, 0x0b54, 0x0b60, 0x0b72, 0x0b7f, - 0x0b8b, 0x0b95, 0x0ba9, 0x0bb3, 0x0bb8, 0x0bc7, 0x0bd4, 0x0bda, - 0x0be9, 0x0bf8, 0x0c06, 0x0c16, - }, - }, - { // bs-Cyrl - "Острво АсенсионАндораУједињени Арапски ЕмиратиАвганистанАнтигва и Барбуд" + - "аАнгвилаАлбанијаАрменијаАнголаАнтарктикАргентинаАмеричка СамоаАустр" + - "ијаАустралијаАрубаАландска острваАзербејџанБосна и ХерцеговинаБарба" + - "досБангладешБелгијаБуркина ФасоБугарскаБахреинБурундиБенинСвети Бар" + - "толомејБермудаБрунејБоливијаБразилБахамиБутанБуве ОстрваБоцванаБело" + - "русијаБелизеКанадаКокос (Келинг) ОстрваКонго - КиншасаЦентрално Афр" + - "ичка РепубликаКонго - БразавилШвајцарскаОбала СлоновачеКукова Острв" + - "аЧилеКамерунКинаКолумбијаОстрво КлипертонКостарикаКубаКапе ВердеБож" + - "ићна острваКипарЧешкаНемачкаДијего ГарсијаЏибутиДанскаДоминикаДомин" + - "иканска РепубликаАлжирСеута и МелиљаЕквадорЕстонијаЕгипатЗападна Са" + - "хараЕритрејаШпанијаЕтиопијаЕвропска УнијаФинскаФиџиФокландска острв" + - "аМикронезијаФарска ОстрваФранцускаГабонВелика БританијаГренадаГрузи" + - "јаФранцуска ГвајанаГурнсиГанаГибралтарГренландГамбијаГвинејаГваделу" + - "пеЕкваторијална ГвинејаГрчкаЈужна Џорџија и Јужна Сендвич ОстрваГва" + - "темалаГуамГвинеја-БисаоГвајанаХонг Конг С. А. Р. КинаХерд и Мекдона" + - "лд ОстрваХондурасХрватскаХаитиМађарскаКанарска острваИндонезијаИрск" + - "аИзраелОстрво МанИндијаБританска територија у Индијском океануИракИ" + - "ранИсландИталијаЏерсиЈамајкаЈорданЈапанКенијаКиргизстанКамбоџаКириб" + - "атиКоморска ОстрваСент Китс и НевисСеверна КорејаЈужна КорејаКувајт" + - "Кајманска ОстрваКазахстанЛаосЛибанСент ЛуцијаЛихтенштајнШри ЛанкаЛи" + - "беријаЛесотоЛитванијаЛуксембургЛетонијаЛибијаМарокоМонакоМолдавијаЦ" + - "рна ГораСент МартинМадагаскарМаршалска ОстрваМакедонијаМалиМијанмар" + - " (Бурма)МонголијаМакао С. А. Р. КинаСеверна Маријанска ОстрваМартини" + - "кМауританијаМонсератМалтаМаурицијусМалдивиМалавиМексикоМалезијаМоза" + - "мбикНамибијаНова КаледонијаНигерНорфолк ОстрвоНигеријаНикарагваХола" + - "ндијаНорвешкаНепалНауруНиуеНови ЗеландОманПанамаПеруФранцуска Полин" + - "езијаПапуа Нова ГвинејаФилипиниПакистанПољскаСен Пјер и МикелонПитк" + - "ернПорто РикоПалестинске територијеПортугалијаПалауПарагвајКатарОст" + - "ала океанијаРеинионРумунијаСрбијаРусијаРуандаСаудијска АрабијаСолом" + - "онска ОстрваСејшелиСуданШведскаСингапурСвета ЈеленаСловенијаСвалбар" + - "д и Јанмајен ОстрваСловачкаСијера ЛеонеСан МариноСенегалСомалијаСур" + - "инамСао Томе и ПринципеСалвадорСиријаСвазилендТристан да КуњаТуркс " + - "и Кајкос ОстрваЧадФранцуске Јужне ТериторијеТогоТајландТаџикистанТо" + - "келауИсточни ТиморТуркменистанТунисТонгаТурскаТринидад и ТобагоТува" + - "луТајванТанзанијаУкрајинаУгандаМања удаљена острва САДСједињене Аме" + - "ричке ДржавеУругвајУзбекистанВатиканСент Винсент и ГренадиниВенецуе" + - "лаБританска Девичанска ОстрваС.А.Д. Девичанска ОстрваВијетнамВануат" + - "уВалис и Футуна ОстрваСамоаЈеменМајотеЈужноафричка РепубликаЗамбија" + - "ЗимбабвеНепозната или неважећа областСветАфрикаСеверноамерички конт" + - "инентЈужна АмерикаОкеанијаЗападна АфрикаЦентрална АмерикаИсточна Аф" + - "рикаСеверна АфрикаЦентрална АфрикаЈужна АфрикаАмерикеСеверна Америк" + - "аКарибиИсточна АзијаЈужна АзијаЈугоисточна АзијаЈужна ЕвропаАустрал" + - "ија и Нови ЗеландМеланезијаМикронезијски регионПолинезијаАзијаЦентр" + - "ална АзијаЗападна АзијаЕвропаИсточна ЕвропаСеверна ЕвропаЗападна Ев" + - "ропаЛатинска Америка", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001d, 0x0029, 0x0059, 0x006d, 0x008d, 0x009b, 0x00ab, - 0x00bb, 0x00c7, 0x00d9, 0x00eb, 0x0106, 0x0116, 0x012a, 0x0134, - 0x0151, 0x0165, 0x0189, 0x0199, 0x01ab, 0x01b9, 0x01d0, 0x01e0, - 0x01ee, 0x01fc, 0x0206, 0x0225, 0x0233, 0x023f, 0x024f, 0x024f, - 0x025b, 0x0267, 0x0271, 0x0286, 0x0294, 0x02a8, 0x02b4, 0x02c0, - 0x02e6, 0x0301, 0x0335, 0x0352, 0x0366, 0x0383, 0x039c, 0x03a4, - 0x03b2, 0x03ba, 0x03cc, 0x03eb, 0x03fd, 0x0405, 0x0418, 0x0418, - 0x0433, 0x043d, 0x0447, 0x0455, 0x0470, 0x047c, 0x0488, 0x0498, - // Entry 40 - 7F - 0x04c3, 0x04cd, 0x04e7, 0x04f5, 0x0505, 0x0511, 0x052c, 0x053c, - 0x054a, 0x055a, 0x0575, 0x0575, 0x0581, 0x0589, 0x05aa, 0x05c0, - 0x05d9, 0x05eb, 0x05f5, 0x0614, 0x0622, 0x0630, 0x0651, 0x065d, - 0x0665, 0x0677, 0x0687, 0x0695, 0x06a3, 0x06b5, 0x06de, 0x06e8, - 0x072b, 0x073d, 0x0745, 0x075e, 0x076c, 0x0792, 0x07bd, 0x07cd, - 0x07dd, 0x07e7, 0x07f7, 0x0814, 0x0828, 0x0832, 0x083e, 0x0851, - 0x085d, 0x08a7, 0x08af, 0x08b7, 0x08c3, 0x08d1, 0x08db, 0x08e9, - 0x08f5, 0x08ff, 0x090b, 0x091f, 0x092d, 0x093d, 0x095a, 0x0979, - // Entry 80 - BF - 0x0994, 0x09ab, 0x09b7, 0x09d6, 0x09e8, 0x09f0, 0x09fa, 0x0a0f, - 0x0a25, 0x0a36, 0x0a46, 0x0a52, 0x0a64, 0x0a78, 0x0a88, 0x0a94, - 0x0aa0, 0x0aac, 0x0abe, 0x0acf, 0x0ae4, 0x0af8, 0x0b17, 0x0b2b, - 0x0b33, 0x0b50, 0x0b62, 0x0b81, 0x0bb1, 0x0bc1, 0x0bd7, 0x0be7, - 0x0bf1, 0x0c05, 0x0c13, 0x0c1f, 0x0c2d, 0x0c3d, 0x0c4d, 0x0c5d, - 0x0c7a, 0x0c84, 0x0c9f, 0x0caf, 0x0cc1, 0x0cd3, 0x0ce3, 0x0ced, - 0x0cf7, 0x0cff, 0x0d14, 0x0d1c, 0x0d28, 0x0d30, 0x0d57, 0x0d79, - 0x0d89, 0x0d99, 0x0da5, 0x0dc6, 0x0dd4, 0x0de7, 0x0e12, 0x0e28, - // Entry C0 - FF - 0x0e32, 0x0e42, 0x0e4c, 0x0e69, 0x0e77, 0x0e87, 0x0e93, 0x0e9f, - 0x0eab, 0x0ecc, 0x0eed, 0x0efb, 0x0f05, 0x0f13, 0x0f23, 0x0f3a, - 0x0f4c, 0x0f7d, 0x0f8d, 0x0fa4, 0x0fb7, 0x0fc5, 0x0fd5, 0x0fe3, - 0x0fe3, 0x1006, 0x1016, 0x1016, 0x1022, 0x1034, 0x1050, 0x1077, - 0x107d, 0x10af, 0x10b7, 0x10c5, 0x10d9, 0x10e7, 0x1100, 0x1118, - 0x1122, 0x112c, 0x1138, 0x1158, 0x1164, 0x1170, 0x1182, 0x1192, - 0x119e, 0x11c9, 0x11c9, 0x11f9, 0x1207, 0x121b, 0x1229, 0x1256, - 0x1268, 0x129c, 0x12c7, 0x12d7, 0x12e5, 0x130c, 0x1316, 0x1316, - // Entry 100 - 13F - 0x1320, 0x132c, 0x1357, 0x1365, 0x1375, 0x13ac, 0x13b4, 0x13c0, - 0x13f1, 0x140a, 0x141a, 0x1435, 0x1456, 0x1471, 0x148c, 0x14ab, - 0x14c2, 0x14d0, 0x14ed, 0x14f9, 0x1512, 0x1527, 0x1548, 0x155f, - 0x158c, 0x15a0, 0x15c7, 0x15db, 0x15e5, 0x1602, 0x161b, 0x1627, - 0x1642, 0x165d, 0x1678, 0x1697, - }, - }, - { // ca - caRegionStr, - caRegionIdx, - }, - { // ce - "Айъадаларан гӀайреАндорраӀарбийн Цхьанатоьхна ЭмираташОвхӀан-пачхьалкхАн" + - "тигуа а, Барбуда аАнгильяАлбаниЭрмалойчоьАнголаАнтарктидаАргентинаА" + - "мерикан СамоаАвстриАвстралиАрубаАландан гӀайренашАзербайджанБосни а" + - ", Герцеговина аБарбадосБангладешБельгиБуркина- ФасоБолгариБахрейнБур" + - "ундиБенинСен-БартельмиБермудан гӀайренашБруней-ДаруссаламБоливиБонэ" + - "йр, Синт-Эстатиус а, Саба аБразилиБагаман гӀайренашБутанБувен гӀайр" + - "еБотсванаБелоруссиБелизКанадаКокосийн гӀайренашДемократин Республик" + - "а КонгоЮккъерчу Африкин РеспубликаРеспублика КонгоШвейцариКот-Д’иву" + - "арКукан гӀайренашЧилиКамерунКитайКолумбиКлиппертонКоста-РикаКубаКаб" + - "о-ВердеКюрасаоГӀайре ӏиса пайхӏамар вина деКипрЧехиГерманиДиего-Гар" + - "сиДжибутиДаниДоминикаДоминикан РеспубликаАлжирСеута а, Мелилья аЭкв" + - "адорЭстониМисарМалхбузен СаьхьараЭритрейИспаниЭфиопиЕвробартФинлянд" + - "иФиджиФолклендан гӀайренашМикронезин Федеративни штаташФарерийн гӀа" + - "йренашФранциГабонЙоккха БританиГренадаГуьржийчоьФранцузийн ГвианаГе" + - "рнсиГанаГибралтарГренландиГамбиГвинейГваделупаЭкваторан ГвинейГреци" + - "Къилба Джорджи а, Къилба Гавайн гӀайренаш аГватемалаГуамГвиней-Биса" + - "уГайанаГонконг (ша-къаьстина кӀошт)Херд гӀайре а, Макдональд гӀайре" + - "наш аГондурасХорватиГаитиВенгриКанаран гӀайренашИндонезиИрландиИзра" + - "ильМэн гӀайреИндиБританин латта Индин океанехьӀиракъГӀажарийчоьИсла" + - "ндиИталиДжерсиЯмайкаУрданЯпониКениКиргизиКамбоджаКирибатиКоморашСен" + - "т-Китс а, Невис аКъилбаседа КорейКъилба КорейКувейтКайман гӀайренаш" + - "КазахстанЛаосЛиванСент-ЛюсиЛихтенштейнШри-ЛанкаЛибериЛесотоЛитваЛюк" + - "сембургЛатвиЛивиМароккоМонакоМолдавиӀаьржаламанхойчоьСен-МартенМада" + - "гаскарМаршаллан гӀайренашМакедониМалиМьянма (Бирма)МонголиМакао (ша" + - "-къаьстина кӀошт)Къилбаседа Марианан гӀайренашМартиникаМавританиМонт" + - "серратМальтаМаврикиМальдивашМалавиМексикаМалайзиМозамбикНамибиКерла" + - " КаледониНигерНорфолк гӀайреНигериНикарагуаНидерландашНорвегиНепалНа" + - "уруНиуэКерла ЗеландиОманПанамаПеруФранцузийн ПолинезиПапуа — Керла " + - "ГвинейФилиппинашПакистанПольшаСен-Пьер а, Микелон аПиткэрн гӀайрена" + - "шПуэрто-РикоПалестинан латтанашПортугалиПалауПарагвайКатарАрахьара " + - "ОкеаниРеюньонРумыниСербиРоссиРуандаСаӀудийн АравиСоломонан гӀайрена" + - "шСейшелан гӀайренашСуданШвециСингапурСийлахьчу Еленин гӀайреСловени" + - "Шпицберген а, Ян-Майен аСловакиСьерра- ЛеонеСан-МариноСенегалСомали" + - "СуринамКъилба СуданСан-Томе а, Принсипи аСальвадорСинт-МартенШемаСв" + - "азилендТристан-да- КуньяТёркс а, Кайкос а гӀайренашЧадФранцузийн къ" + - "илба латтанашТогоТаиландТаджикистанТокелауМалхбален ТиморТуркмениТу" + - "нисТонгаТуркойчоьТринидад а, Тобаго аТувалуТайваньТанзаниУкраинаУга" + - "ндаАЦШн арахьара кегийн гӀайренашЦхьанатоьхна ШтаташУругвайУзбекист" + - "анВатиканСент-Винсент а, Гренадинаш аВенесуэлаВиргинийн гӀайренаш (" + - "Британи)Виргинийн гӀайренаш (АЦШ)ВьетнамВануатуУоллис а, Футуна аСа" + - "моаКосовоЙеменМайоттаКъилба-Африкин РеспубликаЗамбиЗимбабвеЙоьвзуш " + - "йоцу регионДерригдуьненанАфрикаКъилбаседа АмерикаКъилба АмерикаОкеа" + - "ниМалхбузен АфрикаЮккъера АмерикаМалхбален АфрикаКъилбаседа АфрикаЮ" + - "ккъера АфрикаКъилба АфрикаКъилбаседа а, къилба а АмерикаКъилбаседа " + - "Америка – АЦШ а, Канада аКарибашЮккъера АзиКъилба АзиКъилба-малхбал" + - "ен АзиКъилба ЕвропаАвстралазиМеланезиМикронезиПолинезиАзиЮккъера Ма" + - "лхбалеЮккъера а, Гергара а МалхбалеЕвропаМалхбален ЕвропаКъилбаседа" + - " ЕвропаМалхбузен ЕвропаЛатинан Америка", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0023, 0x0031, 0x0069, 0x0088, 0x00ac, 0x00ba, 0x00c6, - 0x00da, 0x00e6, 0x00fa, 0x010c, 0x0127, 0x0133, 0x0143, 0x014d, - 0x016e, 0x0184, 0x01ac, 0x01bc, 0x01ce, 0x01da, 0x01f2, 0x0200, - 0x020e, 0x021c, 0x0226, 0x023f, 0x0262, 0x0283, 0x028f, 0x02c6, - 0x02d4, 0x02f5, 0x02ff, 0x0316, 0x0326, 0x0338, 0x0342, 0x034e, - 0x0371, 0x03a5, 0x03d9, 0x03f8, 0x0408, 0x041e, 0x043b, 0x0443, - 0x0451, 0x045b, 0x0469, 0x047d, 0x0490, 0x0498, 0x04ab, 0x04b9, - 0x04ef, 0x04f7, 0x04ff, 0x050d, 0x0522, 0x0530, 0x0538, 0x0548, - // Entry 40 - 7F - 0x056f, 0x0579, 0x0599, 0x05a7, 0x05b3, 0x05bd, 0x05e0, 0x05ee, - 0x05fa, 0x0606, 0x0616, 0x0616, 0x0626, 0x0630, 0x0657, 0x068f, - 0x06b2, 0x06be, 0x06c8, 0x06e3, 0x06f1, 0x0705, 0x0726, 0x0732, - 0x073a, 0x074c, 0x075e, 0x0768, 0x0774, 0x0786, 0x07a5, 0x07af, - 0x07fe, 0x0810, 0x0818, 0x082f, 0x083b, 0x086e, 0x08b2, 0x08c2, - 0x08d0, 0x08da, 0x08e6, 0x0907, 0x0917, 0x0925, 0x0933, 0x0946, - 0x094e, 0x0985, 0x0991, 0x09a7, 0x09b5, 0x09bf, 0x09cb, 0x09d7, - 0x09e1, 0x09eb, 0x09f3, 0x0a01, 0x0a11, 0x0a21, 0x0a2f, 0x0a52, - // Entry 80 - BF - 0x0a71, 0x0a88, 0x0a94, 0x0ab3, 0x0ac5, 0x0acd, 0x0ad7, 0x0ae8, - 0x0afe, 0x0b0f, 0x0b1b, 0x0b27, 0x0b31, 0x0b45, 0x0b4f, 0x0b57, - 0x0b65, 0x0b71, 0x0b7f, 0x0ba1, 0x0bb4, 0x0bc8, 0x0bed, 0x0bfd, - 0x0c05, 0x0c1e, 0x0c2c, 0x0c5b, 0x0c93, 0x0ca5, 0x0cb7, 0x0ccb, - 0x0cd7, 0x0ce5, 0x0cf7, 0x0d03, 0x0d11, 0x0d1f, 0x0d2f, 0x0d3b, - 0x0d56, 0x0d60, 0x0d7b, 0x0d87, 0x0d99, 0x0daf, 0x0dbd, 0x0dc7, - 0x0dd1, 0x0dd9, 0x0df2, 0x0dfa, 0x0e06, 0x0e0e, 0x0e33, 0x0e59, - 0x0e6d, 0x0e7d, 0x0e89, 0x0eae, 0x0ecf, 0x0ee4, 0x0f09, 0x0f1b, - // Entry C0 - FF - 0x0f25, 0x0f35, 0x0f3f, 0x0f5c, 0x0f6a, 0x0f76, 0x0f80, 0x0f8a, - 0x0f96, 0x0fb1, 0x0fd6, 0x0ff9, 0x1003, 0x100d, 0x101d, 0x1049, - 0x1057, 0x1082, 0x1090, 0x10a8, 0x10bb, 0x10c9, 0x10d5, 0x10e3, - 0x10fa, 0x1121, 0x1133, 0x1148, 0x1150, 0x1162, 0x1181, 0x11b2, - 0x11b8, 0x11ea, 0x11f2, 0x1200, 0x1216, 0x1224, 0x1241, 0x1251, - 0x125b, 0x1265, 0x1277, 0x129b, 0x12a7, 0x12b5, 0x12c3, 0x12d1, - 0x12dd, 0x1316, 0x1316, 0x133b, 0x1349, 0x135d, 0x136b, 0x139e, - 0x13b0, 0x13e6, 0x1414, 0x1422, 0x1430, 0x1450, 0x145a, 0x1466, - // Entry 100 - 13F - 0x1470, 0x147e, 0x14ae, 0x14b8, 0x14c8, 0x14ec, 0x1508, 0x1514, - 0x1537, 0x1552, 0x155e, 0x157d, 0x159a, 0x15b9, 0x15da, 0x15f5, - 0x160e, 0x1645, 0x1687, 0x1695, 0x16aa, 0x16bd, 0x16e3, 0x16fc, - 0x1710, 0x1720, 0x1732, 0x1742, 0x1748, 0x1767, 0x179c, 0x17a8, - 0x17c7, 0x17e8, 0x1807, 0x1824, - }, - }, - { // cgg - "AndoraAmahanga ga Buharabu ageeteereineAfuganistaniAngiguwa na BabudaAng" + - "wiraArubaniaArimeniyaAngoraArigentinaSamowa ya AmeerikaOsituriaOsitu" + - "reeriyaArubaAzabagyaniBoziniya na HezegovinaBabadosiBangaradeshiBubi" + - "rigiBokina FasoBurugariyaBahareniBurundiBeniniBerimudaBuruneiBoriivi" + - "yaBuraziiriBahamaButaniBotswanaBararusiBerizeKanadaDemokoratika Ripa" + - "aburika ya KongoEihanga rya Rwagati ya AfirikaKongoSwisiAivore Kosit" + - "iEbizinga bya KuukuChileKameruuniChinaKorombiyaKositarikaCubaEbizing" + - "a bya KepuvadeSaipurasiRipaaburika ya ZeekiBugirimaaniGyibutiDeenima" + - "akaDominikaRipaaburika ya DominicaArigyeriyaIkwedaEsitoniyaMisiriEri" + - "teriyaSipeyiniEthiyopiyaBufiniFigyiEbizinga bya FaakilandaMikironesi" + - "yaBufaransaGabooniBungyerezaGurenadaGyogiyaGuyana ya BufaransaGanaGi" + - "buraataGuriinirandiGambiyaGineGwaderupeGuniGuriisiGwatemaraGwamuGine" + - "bisauGuyanaHondurasiKorasiyaHaitiHangareIndoneeziyaIrerandiIsirairiI" + - "ndiyaIraakaIraaniAisilandiItareGyamaikaYorudaaniGyapaaniKenyaKirigiz" + - "istaniKambodiyaKiribatiKoromoSenti Kittis na NevisiKoreya AmatembaKo" + - "reya AmashuumaKuweitiEbizinga bya KayimaniKazakisitaniLayosiLebanoni" + - "Senti RusiyaLishenteniSirirankaLiberiyaLesothoLithuaniaLakizembaagaL" + - "atviyaLibyaMoroccoMonacoMoridovaMadagasikaEbizinga bya MarshaaMasedo" + - "oniaMariMyanamarMongoriaEbizinga by’amatemba ga MarianaMartiniqueMau" + - "riteeniyaMontserratiMaritaMaurishiasiMaridivesMarawiMexicomarayiziaM" + - "ozambiqueNamibiyaNiukaredoniaNaigyaEkizinga NorifokoNaigyeriyaNikara" + - "gwaHoorandiNoorweNepoNauruNiueNiuzirandiOmaaniPanamaPeruPolinesia ya" + - " BufaransaPapuaFiripinoPakisitaaniPoorandiSenti Piyerre na MikweronP" + - "itkainiPwetorikoPocugoPalaawuParagwaiKataRiyuniyoniRomaniyaRrashaRwa" + - "ndaSaudi AreebiyaEbizinga bya SurimaaniShesheresiSudaniSwideniSingap" + - "oSenti HerenaSirovaaniyaSirovaakiyaSirra RiyooniSamarinoSenegoSomaar" + - "iyaSurinaamuSawo Tome na PurinsipoEri SalivadoSiriyaSwazirandiEbizin" + - "ga bya Buturuki na KaikoChadiTogoTairandiTajikisitaniTokerawuBurugwe" + - "izooba bwa TimoriTurukimenisitaniTuniziaTongaButuruki /TakeTurinidad" + - " na TobagoTuvaruTayiwaaniTanzaniaUkureiniUgandaAmerikaUrugwaiUzibeki" + - "sitaniVatikaniSenti Vinsent na GurenadiniVenezuweraEbizinga bya Viri" + - "gini ebya BungyerezaEbizinga bya Virigini ebya AmerikaViyetinaamuVan" + - "uatuWarris na FutunaSamowaYemeniMayoteSausi AfirikaZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0027, 0x0033, 0x0045, 0x004c, 0x0054, - 0x005d, 0x0063, 0x0063, 0x006d, 0x007f, 0x0087, 0x0093, 0x0098, - 0x0098, 0x00a2, 0x00b8, 0x00c0, 0x00cc, 0x00d4, 0x00df, 0x00e9, - 0x00f1, 0x00f8, 0x00fe, 0x00fe, 0x0106, 0x010d, 0x0116, 0x0116, - 0x011f, 0x0125, 0x012b, 0x012b, 0x0133, 0x013b, 0x0141, 0x0147, - 0x0147, 0x0168, 0x0186, 0x018b, 0x0190, 0x019d, 0x01af, 0x01b4, - 0x01bd, 0x01c2, 0x01cb, 0x01cb, 0x01d5, 0x01d9, 0x01ee, 0x01ee, - 0x01ee, 0x01f7, 0x020b, 0x0216, 0x0216, 0x021d, 0x0227, 0x022f, - // Entry 40 - 7F - 0x0246, 0x0250, 0x0250, 0x0256, 0x025f, 0x0265, 0x0265, 0x026e, - 0x0276, 0x0280, 0x0280, 0x0280, 0x0286, 0x028b, 0x02a2, 0x02ae, - 0x02ae, 0x02b7, 0x02be, 0x02c8, 0x02d0, 0x02d7, 0x02ea, 0x02ea, - 0x02ee, 0x02f7, 0x0303, 0x030a, 0x030e, 0x0317, 0x031b, 0x0322, - 0x0322, 0x032b, 0x0330, 0x0339, 0x033f, 0x033f, 0x033f, 0x0348, - 0x0350, 0x0355, 0x035c, 0x035c, 0x0367, 0x036f, 0x0377, 0x0377, - 0x037d, 0x037d, 0x0383, 0x0389, 0x0392, 0x0397, 0x0397, 0x039f, - 0x03a8, 0x03b0, 0x03b5, 0x03c2, 0x03cb, 0x03d3, 0x03d9, 0x03ef, - // Entry 80 - BF - 0x03fe, 0x040e, 0x0415, 0x042a, 0x0436, 0x043c, 0x0444, 0x0450, - 0x045a, 0x0463, 0x046b, 0x0472, 0x047b, 0x0487, 0x048e, 0x0493, - 0x049a, 0x04a0, 0x04a8, 0x04a8, 0x04a8, 0x04b2, 0x04c6, 0x04d0, - 0x04d4, 0x04dc, 0x04e4, 0x04e4, 0x0505, 0x050f, 0x051b, 0x0526, - 0x052c, 0x0537, 0x0540, 0x0546, 0x054c, 0x0555, 0x055f, 0x0567, - 0x0573, 0x0579, 0x058a, 0x0594, 0x059d, 0x05a5, 0x05ab, 0x05af, - 0x05b4, 0x05b8, 0x05c2, 0x05c8, 0x05ce, 0x05d2, 0x05e8, 0x05ed, - 0x05f5, 0x0600, 0x0608, 0x0621, 0x0629, 0x0632, 0x0632, 0x0638, - // Entry C0 - FF - 0x063f, 0x0647, 0x064b, 0x064b, 0x0655, 0x065d, 0x065d, 0x0663, - 0x0669, 0x0677, 0x068d, 0x0697, 0x069d, 0x06a4, 0x06ab, 0x06b7, - 0x06c2, 0x06c2, 0x06cd, 0x06da, 0x06e2, 0x06e8, 0x06f1, 0x06fa, - 0x06fa, 0x0710, 0x071c, 0x071c, 0x0722, 0x072c, 0x072c, 0x074a, - 0x074f, 0x074f, 0x0753, 0x075b, 0x0767, 0x076f, 0x0787, 0x0797, - 0x079e, 0x07a3, 0x07b1, 0x07c4, 0x07ca, 0x07d3, 0x07db, 0x07e3, - 0x07e9, 0x07e9, 0x07e9, 0x07f0, 0x07f7, 0x0804, 0x080c, 0x0827, - 0x0831, 0x0856, 0x0878, 0x0883, 0x088a, 0x089a, 0x08a0, 0x08a0, - // Entry 100 - 13F - 0x08a6, 0x08ac, 0x08b9, 0x08bf, 0x08c7, - }, - }, - { // chr - "ᎤᎵᏌᎳᏓᏅ ᎤᎦᏚᏛᎢᎠᏂᏙᎳᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᎡᎳᏈ ᎢᎹᎵᏘᏏᎠᏫᎨᏂᏍᏖᏂᎤᏪᏘ ᎠᎴ ᏆᏊᏓᎠᏂᎩᎳᎠᎵᏇᏂᏯᎠᎵᎻᏂᎠᎠᏂᎪᎳᏧ" + - "ᏁᏍᏓᎸᎠᏥᏂᏘᏂᎠᎠᎺᎵᎧ ᏌᎼᎠᎠᏍᏟᏯᎡᎳᏗᏜᎠᎷᏆᎣᎴᏅᏓ ᏚᎦᏚᏛᎢᎠᏎᏆᏣᏂᏉᏏᏂᎠ ᎠᎴ ᎲᏤᎪᏫᏆᏇᏙᏍᏆᏂᎦᎵᏕᏍ" + - "ᏇᎵᏥᎥᎻᏋᎩᎾ ᏩᏐᏊᎵᎨᎵᎠᏆᎭᎴᎢᏂᏋᎷᏂᏗᏆᏂᎢᏂᎤᏓᏅᏘ ᏆᏕᎳᎻᏆᏊᏓᏊᎾᎢᏉᎵᏫᎠᎧᎵᏈᎢᏂᎯ ᎾᏍᎩᏁᏛᎳᏂᏆᏏᎵᎾ" + - "ᏍᎩ ᏆᎭᎹᏍᏊᏔᏂᏊᏪ ᎤᎦᏚᏛᎢᏆᏣᏩᎾᏇᎳᎷᏍᏇᎵᏍᎨᎾᏓᎪᎪᏍ (ᎩᎵᏂ) ᏚᎦᏚᏛᎢᎧᏂᎪ - ᎨᏂᏝᏌᎬᎿᎨᏍᏛ ᎠᏰᏟ" + - " ᏍᎦᏚᎩᎧᏂᎪ - ᏆᏌᏩᎵᏍᏫᏍᎢᏬᎵ ᎾᎿ ᎠᎹᏳᎶᏗᎠᏓᏍᏓᏴᎲᏍᎩ ᏚᎦᏚᏛᎢᏥᎵᎧᎹᎷᏂᏓᎶᏂᎨᏍᏛᎪᎸᎻᏈᎢᎠᎦᏂᏴᏔᏅᎣ" + - "ᏓᎸ ᎤᎦᏚᏛᎢᎪᏍᏓ ᎵᎧᎫᏆᎢᎬᎾᏕᎾ ᎢᏤᏳᏍᏗᎫᎳᎨᎣᏓᏂᏍᏓᏲᎯᎲ ᎤᎦᏚᏛᎢᏌᎢᏆᏍᏤᎩᎠᎠᏂᏛᏥᏗᏰᎪ ᎦᏏᏯᏥᏊᏗᏗ" + - "ᏂᎹᎦᏙᎻᏂᎧᏙᎻᏂᎧᏂ ᏍᎦᏚᎩᎠᎵᏥᎵᏯᏑᏔ ᎠᎴ ᎺᎵᏯᎡᏆᏙᎵᎡᏍᏙᏂᏯᎢᏥᏈᎢᏭᏕᎵᎬ ᏗᏜ ᏌᎮᎳᎡᎵᏟᏯᎠᏂᏍᏆᏂᏱᎢ" + - "ᏗᎣᏈᎠᏳᎳᏛ ᎠᏂᎤᎾᏓᏡᎬᏫᏂᎦᏙᎯᏫᏥᏩᎩ ᏚᎦᏚᏛᎢᎹᎢᏉᏂᏏᏯᏪᎶ ᏚᎦᏚᏛᎢᎦᎸᏥᏱᎦᏉᏂᎩᎵᏏᏲᏋᎾᏓᏣᎠᏥᎢᎠᏂᎦᎸ" + - "Ꮵ ᎩᎠᎬᏂᏏᎦᎠᎾᏥᏆᎵᏓᎢᏤᏍᏛᏱᎦᎹᏈᎢᎠᎩᎢᏂᏩᏓᎷᏇᎡᏆᏙᎵᎠᎵ ᎩᎢᏂᎪᎢᎯᏧᎦᏃᏮ ᏣᎠᏥᎢ ᎠᎴ ᎾᏍᎩ ᏧᎦᏃᏮ " + - "ᎠᏍᏛᎭᏟ ᏚᎦᏚᏛᎢᏩᏔᎹᎳᏆᎻᎩᎢᏂ-ᏈᏌᎤᏫᎦᏯᎾᎰᏂᎩ ᎪᏂᎩ ᎤᏓᏤᎵᏓ ᏧᏂᎸᏫᏍᏓᏁᏗ ᎢᎬᎾᏕᎾ ᏓᎶᏂᎨᏍᏛᎲᏗ " + - "ᎤᎦᏚᏛᎢ ᎠᎴ ᎺᎩᏓᎾᎵᏗ ᏚᎦᏚᏛᎢᎭᏂᏚᎳᏍᎧᎶᎡᏏᎠᎮᎢᏘᎲᏂᎦᎵᏥᏍᏆ ᏚᎦᏚᏛᎢᎢᏂᏙᏂᏍᏯᎠᏲᎳᏂᎢᏏᎵᏱᎤᏍᏗ Ꭴ" + - "ᎦᏚᏛᎢ ᎾᎿ ᎠᏍᎦᏯᎢᏅᏗᎾᏈᏗᏏ ᏴᏫᏯ ᎠᎺᏉ ᎢᎬᎾᏕᏅᎢᎳᎩᎢᎴᏂᏧᏁᏍᏓᎸᎯᎢᏔᎵᏨᎵᏏᏣᎺᎢᎧᏦᏓᏂᏣᏩᏂᏏᎨᏂᏯᎩ" + - "ᎵᏣᎢᏍᎧᎹᏉᏗᎠᏂᎧᎵᏆᏘᎪᎼᎳᏍᎤᏓᏅᏘ ᎨᏘᏏ ᎠᎴ ᏁᏪᏏᏧᏴᏢ ᎪᎵᎠᏧᎦᏃᏮ ᎪᎵᎠᎫᏪᎢᏘᎨᎢᎹᏂ ᏚᎦᏚᏛᎢᎧᏎᎧᏍ" + - "ᏕᏂᎴᎣᏍᎴᏆᎾᏂᎤᏓᏅᏘ ᎷᏏᏯᎵᎦᏗᏂᏍᏓᏂᏍᎵ ᎳᏂᎧᎳᏈᎵᏯᎴᏐᏙᎵᏗᏪᏂᎠᎸᎧᏎᏋᎩᎳᏘᏫᎠᎵᏈᏯᎼᎶᎪᎹᎾᎪᎹᎵᏙᏫᎠᎼ" + - "ᏂᏔᏁᎦᎶᎤᏓᏅᏘ ᏡᏡᎹᏓᎦᏍᎧᎵᎹᏌᎵ ᏚᎦᏚᏛᎢᎹᏎᏙᏂᏯᎹᎵᎹᏯᎹᎵᎹᏂᎪᎵᎠᎹᎧᎣ (ᎤᏓᏤᎵᏓ ᏧᏂᎸᏫᏍᏓᏁᏗ ᎢᎬᎾ" + - "ᏕᎾ) ᏣᎢᏧᏴᏢ ᏗᏜ ᎹᎵᎠᎾ ᏚᎦᏚᏛᎢᎹᏘᏂᎨᎹᏘᎢᏯᎹᏂᏘᏌᎳᏗᎹᎵᏔᎼᎵᏏᎥᏍᎹᎵᏗᏫᏍᎹᎳᏫᎠᏂᏍᏆᏂᎹᎴᏏᎢᎠᎼᏎᎻ" + - "ᏇᎩᎾᎻᏈᎢᏯᎢᏤ ᎧᎵᏙᏂᎠᏂᎾᎢᏨᏃᎵᏬᎵᎩ ᎤᎦᏚᏛᎢᏂᏥᎵᏯᏂᎧᎳᏆᏁᏛᎳᏂᏃᏪᏁᏆᎵᏃᎤᎷᏂᏳᎢᏤ ᏏᎢᎴᏂᏗᎣᎺᏂᏆᎾᎹ" + - "ᏇᎷᎠᏂᎦᎸᏥ ᏆᎵᏂᏏᎠᏆᏇ ᎢᏤ ᎩᎢᏂᎠᏂᏈᎵᎩᏃᏆᎩᏍᏖᏂᏉᎳᏂᎤᏓᏅᏘ ᏈᏰ ᎠᎴ ᎻᏇᎶᏂᏈᎧᎵᏂ ᏚᎦᏚᏛᎢᏇᎡᏙ Ꮅ" + - "ᎢᎪᏆᎴᏍᏗᏂᎠᏂ ᏄᎬᏫᏳᏌᏕᎩᏉᏥᎦᎳᏆᎴᎠᏫᏆᎳᏇᎢᏯᎧᏔᎵᎠᏍᏛ ᎣᏏᏰᏂᎠᎴᏳᏂᎠᏂᎶᎹᏂᏯᏒᏈᏯᏲᏂᎢᎶᏩᏂᏓᏌᎤᏗ Ꭱ" + - "ᎴᏈᎠᏐᎶᎹᏂ ᏚᎦᏚᏛᎢᏏᎡᏥᎵᏍᏑᏕᏂᏍᏫᏕᏂᏏᏂᎦᏉᎵᎤᏓᏅᏘ ᎮᎵᎾᏍᎶᏫᏂᎠᏍᏩᎵᏆᎵᏗ ᎠᎴ ᏤᏂ ᎹᏰᏂᏍᎶᏩᎩᎠᏏᎡ" + - "Ꮃ ᎴᎣᏂᎤᏓᏅᏘ ᎹᎵᎢᏃᏏᏂᎦᎵᏐᎹᎵᏒᎵᎾᎻᏧᎦᎾᏮ ᏑᏕᏂᏌᎣ ᏙᎺ ᎠᎴ ᏈᏂᏏᏇᎡᎵᏌᎵᏆᏙᎵᏏᏂᏘ ᎹᏘᏂᏏᎵᎠᎠᏂᏍ" + - "ᏩᏏᎢᏟᏍᏛᏂ Ꮣ ᎫᎾᎭᎠᏂᏛᎵᎩ ᎠᎴ ᎨᎢᎪ ᏚᎦᏚᏛᎢᏣᏗᎠᏂᎦᎸᏥ ᏧᎦᎾᏮ ᎦᏙᎯ ᎤᎵᏍᏛᎢᏙᎪᏔᏯᎴᏂᏔᏥᎩᏍᏕᏂᏙ" + - "ᎨᎳᏭᏘᎼᎵ-ᎴᏍᏖᏛᎵᎩᎺᏂᏍᏔᏂᏚᏂᏏᏍᎠᏙᏅᎦᎬᏃᏟᏂᏕᏗ ᎠᎴ ᏙᏆᎪᏚᏩᎷᏔᎢᏩᏂᏖᏂᏏᏂᏯᏳᎧᎴᏂᏳᎦᏂᏓU.S. ᎠᏍ" + - "Ꮫ ᏚᎦᏚᏛᎢᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᏍᎦᏚᎩᏳᎷᏇᎤᏍᏇᎩᏍᏖᏂᎠᏥᎳᏁᏠ ᎦᏚᎲᎤᏓᏅᏘ ᏫᏂᏏᏂᏗ ᎠᎴ ᎾᏍᎩ ᏇᎾᏗᏁᏍᏪᏁ" + - "ᏑᏪᎳᏈᏗᏍ ᎠᏒᏂᎸ ᏂᎨᏒᎾ ᏚᎦᏚᏛᎢU.S. ᎠᏒᏂᎸ ᏂᎨᏒᎾ ᏚᎦᏚᏛᎢᏫᎡᏘᎾᎻᏩᏂᎤᏩᏚᏩᎵᏍ ᎠᎴ ᏊᏚᎾᏌᎼᎠᎪ" + - "ᏐᏉᏰᎺᏂᎺᏯᏖᏧᎦᎾᏮ ᎬᎿᎨᏍᏛᏌᎻᏈᏯᏏᎻᏆᏇᏄᏬᎵᏍᏛᎾ ᎤᏔᏂᏗᎦᏙᎯᎡᎶᎯᎬᎿᎨᏍᏛᏧᏴᏢ ᎠᎹᏰᏟᏧᎦᏃᏮ ᎠᎺᎵᎦᎣ" + - "ᏏᏰᏂᎠᏭᏕᎵᎬ ᏗᏜ ᎬᎿᎨᏍᏛᎠᏰᏟ ᎠᎹᏰᏟᏗᎧᎸᎬ ᏗᏜ ᎬᎿᎨᏍᏛᏧᏴᏢ ᏗᏜ ᎬᎿᎨᏍᏛᎠᏰᏟ ᎬᎿᎨᏍᏛᏧᎦᎾᏮ ᏗᏜ" + - " ᎬᎿᎨᏍᏛᎠᎺᎵᎦᎢᏧᏴᏢ ᏗᏜ ᎠᎹᏰᏟᎨᏆᏙᏯᏗᎧᎸᎬ ᏗᏜ ᏓᎶᏂᎨᏍᏛᏧᎦᎾᏮ ᏗᏜ ᏓᎶᏂᎨᏍᏛᏧᎦᎾᏮ ᏗᎧᎸᎬ ᏓᎶᏂᎨ" + - "ᏍᏛᏧᎦᎾᏮ ᏗᏜ ᏳᎳᏛᎠᏍᏔᎴᏏᎠᎺᎳᏁᏏᎠᎠᏰᏟ ᏧᎾᎵᎪᎯ ᎾᎿ ᎹᎢᏉᏂᏏᏯ ᎢᎬᎾᏕᎾᏆᎵᏂᏏᎠᏓᎶᎾᎨᏍᏛᎠᏰᏟ ᏓᎶ" + - "ᏂᎨᏍᏛᏭᏕᎵᎬ ᏗᏜ ᏓᎶᏂᎨᏍᏛᏳᎳᏛᏗᎧᎸᎬ ᏗᏜ ᏳᎳᏛᏧᏴᏢ ᏗᏜ ᏳᎳᏛᏭᏕᎵᎬ ᏗᏜ ᏳᎳᏛᎳᏘᏂ ᎠᎹᏰᏟ", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0022, 0x002e, 0x0064, 0x0079, 0x0093, 0x009f, 0x00ae, - 0x00bd, 0x00c9, 0x00d8, 0x00ea, 0x0100, 0x010c, 0x0118, 0x0121, - 0x013d, 0x014c, 0x016c, 0x0178, 0x018a, 0x0199, 0x01a9, 0x01b8, - 0x01c7, 0x01d3, 0x01df, 0x01f8, 0x0201, 0x020a, 0x0216, 0x023e, - 0x0247, 0x025d, 0x0266, 0x027c, 0x0288, 0x0294, 0x029d, 0x02a6, - 0x02cb, 0x02e3, 0x0309, 0x0321, 0x032a, 0x034a, 0x0372, 0x0378, - 0x0384, 0x0396, 0x03a8, 0x03d0, 0x03e0, 0x03e6, 0x0405, 0x0411, - 0x0436, 0x0442, 0x044b, 0x0457, 0x046a, 0x0473, 0x047f, 0x048b, - // Entry 40 - 7F - 0x04a7, 0x04b6, 0x04cd, 0x04d9, 0x04e8, 0x04f4, 0x0511, 0x051d, - 0x052f, 0x053e, 0x055d, 0x055d, 0x056c, 0x0572, 0x0588, 0x059a, - 0x05b0, 0x05bc, 0x05c5, 0x05d1, 0x05da, 0x05e6, 0x05fc, 0x0605, - 0x060e, 0x061a, 0x0629, 0x0638, 0x0641, 0x064d, 0x0669, 0x0672, - 0x06c9, 0x06d5, 0x06db, 0x06f1, 0x06fa, 0x0759, 0x0799, 0x07a8, - 0x07b7, 0x07c0, 0x07cc, 0x07e5, 0x07f7, 0x0803, 0x080f, 0x083c, - 0x0848, 0x0875, 0x087e, 0x0887, 0x0899, 0x08a2, 0x08ab, 0x08b7, - 0x08c0, 0x08cc, 0x08d5, 0x08e4, 0x08f6, 0x0902, 0x090e, 0x0935, - // Entry 80 - BF - 0x0948, 0x095e, 0x096a, 0x0986, 0x0998, 0x09a1, 0x09ad, 0x09c3, - 0x09d8, 0x09e8, 0x09f4, 0x09fd, 0x0a0c, 0x0a1b, 0x0a27, 0x0a30, - 0x0a39, 0x0a42, 0x0a51, 0x0a63, 0x0a76, 0x0a88, 0x0aa1, 0x0ab0, - 0x0ab6, 0x0ac2, 0x0ad1, 0x0b1c, 0x0b49, 0x0b55, 0x0b61, 0x0b73, - 0x0b7c, 0x0b8b, 0x0b9a, 0x0ba3, 0x0bb2, 0x0bc1, 0x0bd0, 0x0bdf, - 0x0bf8, 0x0c01, 0x0c20, 0x0c2c, 0x0c38, 0x0c44, 0x0c4a, 0x0c53, - 0x0c5c, 0x0c62, 0x0c78, 0x0c81, 0x0c8a, 0x0c90, 0x0caf, 0x0cc6, - 0x0cd8, 0x0ce7, 0x0cf0, 0x0d17, 0x0d33, 0x0d46, 0x0d71, 0x0d7d, - // Entry C0 - FF - 0x0d89, 0x0d98, 0x0da1, 0x0dba, 0x0dc9, 0x0dd5, 0x0dde, 0x0de7, - 0x0df3, 0x0e09, 0x0e25, 0x0e34, 0x0e3d, 0x0e49, 0x0e58, 0x0e6e, - 0x0e7d, 0x0ea7, 0x0eb6, 0x0ec9, 0x0ee2, 0x0eee, 0x0ef7, 0x0f03, - 0x0f19, 0x0f3a, 0x0f4f, 0x0f62, 0x0f6b, 0x0f7d, 0x0f97, 0x0fc7, - 0x0fcd, 0x1003, 0x1009, 0x1015, 0x1027, 0x1033, 0x1046, 0x105e, - 0x106d, 0x1076, 0x107c, 0x1099, 0x10a2, 0x10ae, 0x10bd, 0x10c9, - 0x10d5, 0x10f3, 0x10f3, 0x111c, 0x1125, 0x113a, 0x1153, 0x1190, - 0x119f, 0x11d2, 0x1200, 0x120f, 0x121e, 0x1238, 0x1241, 0x124a, - // Entry 100 - 13F - 0x1253, 0x125c, 0x1278, 0x1284, 0x1290, 0x12b8, 0x12c1, 0x12d0, - 0x12e6, 0x12ff, 0x130e, 0x1331, 0x1347, 0x136a, 0x138a, 0x13a3, - 0x13c6, 0x13d5, 0x13f2, 0x13fe, 0x1424, 0x144a, 0x1476, 0x1493, - 0x14a5, 0x14b4, 0x14f7, 0x1506, 0x1518, 0x1534, 0x155a, 0x1563, - 0x1580, 0x159a, 0x15b7, 0x15cd, - }, - }, - { // ckb - "ئاندۆرامیرنشینە یەکگرتووە عەرەبییەکانئەفغانستانئانتیگوا و باربودائەڵبانی" + - "ائەرمەنستانئەنگۆلائانتارکتیکائارجەنتیناساموای ئەمەریکایینەمسائۆسترا" + - "لیائارووبائازەربایجانبۆسنیا و ھەرزەگۆڤیناباربادۆسبەنگلادیشبەلژیکبور" + - "کینافاسۆبولگاریابەحرەینبوروندیبنینبۆلیڤیابرازیلبەھامابووتانبۆتسوانا" + - "بیلاڕووسبەلیزکانەداکۆنگۆ کینشاساکۆماری ئەفریقای ناوەڕاستسویسراکۆتدی" + - "ڤوارشیلیکامیروونچینکۆلۆمبیاکۆستاریکاکووباکەیپڤەردقیبرسکۆماری چیکئەڵ" + - "مانیاجیبووتیدانمارکدۆمینیکائەلجەزایرئیکوادۆرمیسرئەریتریائیسپانیائەت" + - "یۆپیافینلاندفیجیمایکرۆنیزیافەڕەنساگابۆنشانشینی یەکگرتووگریناداگورجس" + - "تانغەناگرینلاندگامبیاگینێیۆنانگواتیمالاگوامگینێ بیساوگویاناھۆندوورا" + - "سکرۆواتیاھایتیمەجارستانئیندۆنیزیائیرلەندئیسرائیلھیندستانعێراقئێرانئ" + - "ایسلەندئیتاڵیجامایکائوردنژاپۆنقرغیزستانکەمبۆدیاکیریباسدوورگەکانی قە" + - "مەرسەینت کیتس و نیڤیسکۆریای باکوورکوەیتکازاخستانلاوسلوبنانسەینت لوو" + - "سیالیختنشتاینسریلانکالیبەریالەسۆتۆلیتوانایالوکسەمبورگلاتڤیالیبیامەغ" + - "ریبمۆناکۆمۆلدۆڤامۆنتینیگرۆماداگاسکاردوورگەکانی مارشاڵمالیمیانمارمەن" + - "گۆلیامۆریتانیاماڵتامالدیڤمالاویمەکسیکمالیزیامۆزامبیکنامیبیانیجەرنیک" + - "اراگواھۆڵەندانۆرویژنیپالنائوروونیوزیلاندعومانپاناماپیرووپاپوا گینێی" + - " نوێفلیپینپاکستانپۆڵەنداپورتوگالپالاوپاراگوایقەتەرڕۆمانیاسربیاڕووسیا" + - "ڕوانداعەرەبستانی سەعوودیدوورگەکانی سلێمانسیشێلسوودانسویدسینگاپورسلۆ" + - "ڤێنیاسلۆڤاکیاسیەرالیۆنسان مارینۆسینیگالسۆمالیاسورینامساوتۆمێ و پرین" + - "سیپیئێلسالڤادۆرسووریاسوازیلاندچادتۆگۆتایلەندتاجیکستانتورکمانستانتوو" + - "نستۆنگاتورکیاترینیداد و تۆباگوتووڤالووتایوانتانزانیائۆکرانیائوگاندا" + - "ئوروگوایئوزبەکستانڤاتیکانسەینت ڤینسەنت و گرینادینزڤیەتنامڤانوواتووس" + - "اموایەمەنئەفریقای باشوورزامبیازیمبابویئەورووپای باشووریئاسیای ناوەن" + - "دیئاسیای ڕۆژاوا", - []uint16{ // 287 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000e, 0x0048, 0x005c, 0x007e, 0x007e, 0x008e, - 0x00a2, 0x00b0, 0x00c6, 0x00da, 0x00fb, 0x0105, 0x0117, 0x0125, - 0x0125, 0x013b, 0x0161, 0x0171, 0x0183, 0x018f, 0x01a5, 0x01b5, - 0x01c3, 0x01d1, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e7, 0x01e7, - 0x01f3, 0x01ff, 0x020b, 0x020b, 0x021b, 0x022b, 0x0235, 0x0241, - 0x0241, 0x025a, 0x0288, 0x0288, 0x0294, 0x02a6, 0x02a6, 0x02ae, - 0x02be, 0x02c4, 0x02d4, 0x02d4, 0x02e6, 0x02f0, 0x0300, 0x0300, - 0x0300, 0x030a, 0x031d, 0x032d, 0x032d, 0x033b, 0x0349, 0x0359, - // Entry 40 - 7F - 0x0359, 0x036b, 0x036b, 0x037b, 0x037b, 0x0383, 0x0383, 0x0393, - 0x03a3, 0x03b3, 0x03b3, 0x03b3, 0x03c1, 0x03c9, 0x03c9, 0x03df, - 0x03df, 0x03ed, 0x03f7, 0x0416, 0x0424, 0x0434, 0x0434, 0x0434, - 0x043c, 0x043c, 0x044c, 0x0458, 0x0460, 0x0460, 0x0460, 0x046a, - 0x046a, 0x047c, 0x0484, 0x0497, 0x04a3, 0x04a3, 0x04a3, 0x04b5, - 0x04c5, 0x04cf, 0x04e1, 0x04e1, 0x04f5, 0x0503, 0x0513, 0x0513, - 0x0523, 0x0523, 0x052d, 0x0537, 0x0547, 0x0553, 0x0553, 0x0561, - 0x056b, 0x0575, 0x0575, 0x0587, 0x0597, 0x05a5, 0x05c4, 0x05e5, - // Entry 80 - BF - 0x05fe, 0x05fe, 0x0608, 0x0608, 0x061a, 0x0622, 0x062e, 0x0645, - 0x0659, 0x0669, 0x0677, 0x0683, 0x0695, 0x06a9, 0x06b5, 0x06bf, - 0x06cb, 0x06d7, 0x06e5, 0x06f9, 0x06f9, 0x070d, 0x072e, 0x072e, - 0x0736, 0x0744, 0x0754, 0x0754, 0x0754, 0x0754, 0x0766, 0x0766, - 0x0770, 0x0770, 0x077c, 0x0788, 0x0794, 0x07a2, 0x07b2, 0x07c0, - 0x07c0, 0x07ca, 0x07ca, 0x07ca, 0x07dc, 0x07ea, 0x07f6, 0x0800, - 0x080e, 0x080e, 0x0820, 0x082a, 0x0836, 0x0840, 0x0840, 0x085c, - 0x0868, 0x0876, 0x0884, 0x0884, 0x0884, 0x0884, 0x0884, 0x0894, - // Entry C0 - FF - 0x089e, 0x08ae, 0x08b8, 0x08b8, 0x08b8, 0x08c6, 0x08d0, 0x08dc, - 0x08e8, 0x090b, 0x092c, 0x0936, 0x0942, 0x094a, 0x095a, 0x095a, - 0x096a, 0x096a, 0x097a, 0x098c, 0x099f, 0x09ad, 0x09bb, 0x09c9, - 0x09c9, 0x09eb, 0x0a01, 0x0a01, 0x0a0d, 0x0a1f, 0x0a1f, 0x0a1f, - 0x0a25, 0x0a25, 0x0a2d, 0x0a3b, 0x0a4d, 0x0a4d, 0x0a4d, 0x0a63, - 0x0a6d, 0x0a77, 0x0a83, 0x0aa3, 0x0ab3, 0x0abf, 0x0acf, 0x0adf, - 0x0aed, 0x0aed, 0x0aed, 0x0aed, 0x0afd, 0x0b11, 0x0b1f, 0x0b4e, - 0x0b4e, 0x0b4e, 0x0b4e, 0x0b5c, 0x0b6e, 0x0b6e, 0x0b78, 0x0b78, - // Entry 100 - 13F - 0x0b82, 0x0b82, 0x0b9f, 0x0bab, 0x0bbb, 0x0bbb, 0x0bbb, 0x0bbb, - 0x0bbb, 0x0bbb, 0x0bbb, 0x0bbb, 0x0bbb, 0x0bbb, 0x0bbb, 0x0bbb, - 0x0bbb, 0x0bbb, 0x0bbb, 0x0bbb, 0x0bbb, 0x0bbb, 0x0bbb, 0x0bdc, - 0x0bdc, 0x0bdc, 0x0bdc, 0x0bdc, 0x0bdc, 0x0bf7, 0x0c10, - }, - }, - { // cs - csRegionStr, - csRegionIdx, - }, - { // cy - "Ynys AscensionAndorraEmiradau Arabaidd UnedigAfghanistanAntigua a Barbud" + - "aAnguillaAlbaniaArmeniaAngolaAntarcticaYr ArianninSamoa AmericaAwstr" + - "iaAwstraliaArubaYnysoedd ÅlandAzerbaijanBosnia a HercegovinaBarbados" + - "BangladeshGwlad BelgBurkina FasoBwlgariaBahrainBurundiBeninSaint Bar" + - "thélemyBermudaBruneiBolifiaAntilles yr IseldiroeddBrasilY BahamasBhu" + - "tanYnys BouvetBotswanaBelarwsBelizeCanadaYnysoedd Cocos (Keeling)Y C" + - "ongo - KinshasaGweriniaeth Canolbarth AffricaY Congo - BrazzavilleY " + - "SwistirCôte d’IvoireYnysoedd CookChileCamerŵnTsieinaColombiaYnys Cli" + - "ppertonCosta RicaCiwbaCabo VerdeCuraçaoYnys y NadoligCyprusTsieciaYr" + - " AlmaenDiego GarciaDjiboutiDenmarcDominicaGweriniaeth DominicaAlgeri" + - "aCeuta a MelillaEcuadorEstoniaYr AifftGorllewin SaharaEritreaSbaenEt" + - "hiopiaYr Undeb EwropeaiddY FfindirFijiYnysoedd y Falkland/MalvinasMi" + - "cronesiaYnysoedd FfaroFfraincGabonY Deyrnas UnedigGrenadaGeorgiaGuya" + - "ne FfrengigYnys y GarnGhanaGibraltarYr Ynys LasGambiaGuinéeGuadeloup" + - "eGuinea GyhydeddolGwlad GroegDe Georgia ac Ynysoedd Sandwich y DeGua" + - "temalaGuamGuiné-BissauGuyanaHong Kong RhGA TsieinaYnys Heard ac Ynys" + - "oedd McDonaldHondurasCroatiaHaitiHwngariYr Ynysoedd DedwyddIndonesia" + - "IwerddonIsraelYnys ManawIndiaTiriogaeth Brydeinig Cefnfor IndiaIracI" + - "ranGwlad yr IâYr EidalJerseyJamaicaGwlad IorddonenJapanKenyaKyrgyzst" + - "anCambodiaKiribatiComorosSaint Kitts a NevisGogledd KoreaDe KoreaKuw" + - "aitYnysoedd CaymanKazakstanLaosLibanusSaint LuciaLiechtensteinSri La" + - "nkaLiberiaLesothoLithuaniaLwcsembwrgLatfiaLibyaMorocoMonacoMoldofaMo" + - "ntenegroSaint MartinMadagascarYnysoedd MarshallMacedoniaMaliMyanmar " + - "(Burma)MongoliaMacau RhGA TsieinaYnysoedd Gogledd MarianaMartiniqueM" + - "auritaniaMontserratMaltaMauritiusY MaldivesMalawiMecsicoMalaysiaMoza" + - "mbiqueNamibiaCaledonia NewyddNigerYnys NorfolkNigeriaNicaraguaYr Ise" + - "ldiroeddNorwyNepalNauruNiueSeland NewyddOmanPanamaPeriwPolynesia Ffr" + - "engigPapua Guinea NewyddY PhilipinauPakistanGwlad PwylSaint-Pierre-e" + - "t-MiquelonYnysoedd PitcairnPuerto RicoTiriogaethau PalesteinaiddPort" + - "iwgalPalauParaguayQatarOceania BellennigRéunionRwmaniaSerbiaRwsiaRwa" + - "ndaSaudi ArabiaYnysoedd SolomonSeychellesSwdanSwedenSingaporeSaint H" + - "elenaSlofeniaSvalbard a Jan MayenSlofaciaSierra LeoneSan MarinoSeneg" + - "alSomaliaSurinameDe SwdanSão Tomé a PríncipeEl SalvadorSint MaartenS" + - "yriaGwlad SwaziTristan da CunhaYnysoedd Turks a CaicosTchadTiroedd D" + - "eheuol ac Antarctig FfraincTogoGwlad ThaiTajikistanTokelauTimor-Lest" + - "eTurkmenistanTunisiaTongaTwrciTrinidad a TobagoTuvaluTaiwanTanzaniaW" + - "cráinUgandaYnysoedd Pellennig UDACenhedloedd UnedigYr Unol Daleithia" + - "uUruguayUzbekistanY FaticanSaint Vincent a’r GrenadinesVenezuelaYnys" + - "oedd Gwyryf PrydainYnysoedd Gwyryf yr Unol DaleithiauFietnamVanuatuW" + - "allis a FutunaSamoaKosovoYemenMayotteDe AffricaZambiaZimbabweRhanbar" + - "th AnhysbysY BydAffricaGogledd AmericaDe AmericaOceaniaGorllewin Aff" + - "ricaCanolbarth AmericaDwyrain AffricaGogledd AffricaCanol AffricaDeh" + - "eudir AffricaYr AmerigAmerica i’r Gogledd o FecsicoY CaribîDwyrain A" + - "siaDe AsiaDe-Ddwyrain AsiaDe EwropAwstralasiaMelanesiaRhanbarth Micr" + - "onesiaPolynesiaAsiaCanol AsiaGorllewin AsiaEwropDwyrain EwropGogledd" + - " EwropGorllewin EwropAmerica Ladin", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000e, 0x0015, 0x002d, 0x0038, 0x0049, 0x0051, 0x0058, - 0x005f, 0x0065, 0x006f, 0x007a, 0x0087, 0x008e, 0x0097, 0x009c, - 0x00ab, 0x00b5, 0x00c9, 0x00d1, 0x00db, 0x00e5, 0x00f1, 0x00f9, - 0x0100, 0x0107, 0x010c, 0x011d, 0x0124, 0x012a, 0x0131, 0x0148, - 0x014e, 0x0157, 0x015d, 0x0168, 0x0170, 0x0177, 0x017d, 0x0183, - 0x019b, 0x01ad, 0x01cb, 0x01e0, 0x01e9, 0x01f9, 0x0206, 0x020b, - 0x0213, 0x021a, 0x0222, 0x0231, 0x023b, 0x0240, 0x024a, 0x0252, - 0x0260, 0x0266, 0x026d, 0x0276, 0x0282, 0x028a, 0x0291, 0x0299, - // Entry 40 - 7F - 0x02ad, 0x02b4, 0x02c3, 0x02ca, 0x02d1, 0x02d9, 0x02e9, 0x02f0, - 0x02f5, 0x02fd, 0x0310, 0x0310, 0x0319, 0x031d, 0x0339, 0x0343, - 0x0351, 0x0358, 0x035d, 0x036d, 0x0374, 0x037b, 0x038a, 0x0395, - 0x039a, 0x03a3, 0x03ae, 0x03b4, 0x03bb, 0x03c5, 0x03d6, 0x03e1, - 0x0405, 0x040e, 0x0412, 0x041f, 0x0425, 0x043b, 0x045a, 0x0462, - 0x0469, 0x046e, 0x0475, 0x0488, 0x0491, 0x0499, 0x049f, 0x04a9, - 0x04ae, 0x04d0, 0x04d4, 0x04d8, 0x04e4, 0x04ec, 0x04f2, 0x04f9, - 0x0508, 0x050d, 0x0512, 0x051c, 0x0524, 0x052c, 0x0533, 0x0546, - // Entry 80 - BF - 0x0553, 0x055b, 0x0561, 0x0570, 0x0579, 0x057d, 0x0584, 0x058f, - 0x059c, 0x05a5, 0x05ac, 0x05b3, 0x05bc, 0x05c6, 0x05cc, 0x05d1, - 0x05d7, 0x05dd, 0x05e4, 0x05ee, 0x05fa, 0x0604, 0x0615, 0x061e, - 0x0622, 0x0631, 0x0639, 0x064b, 0x0663, 0x066d, 0x0677, 0x0681, - 0x0686, 0x068f, 0x0699, 0x069f, 0x06a6, 0x06ae, 0x06b8, 0x06bf, - 0x06cf, 0x06d4, 0x06e0, 0x06e7, 0x06f0, 0x06fe, 0x0703, 0x0708, - 0x070d, 0x0711, 0x071e, 0x0722, 0x0728, 0x072d, 0x073f, 0x0752, - 0x075e, 0x0766, 0x0770, 0x0788, 0x0799, 0x07a4, 0x07be, 0x07c7, - // Entry C0 - FF - 0x07cc, 0x07d4, 0x07d9, 0x07ea, 0x07f2, 0x07f9, 0x07ff, 0x0804, - 0x080a, 0x0816, 0x0826, 0x0830, 0x0835, 0x083b, 0x0844, 0x0850, - 0x0858, 0x086c, 0x0874, 0x0880, 0x088a, 0x0891, 0x0898, 0x08a0, - 0x08a8, 0x08be, 0x08c9, 0x08d5, 0x08da, 0x08e5, 0x08f5, 0x090c, - 0x0911, 0x0935, 0x0939, 0x0943, 0x094d, 0x0954, 0x095f, 0x096b, - 0x0972, 0x0977, 0x097c, 0x098d, 0x0993, 0x0999, 0x09a1, 0x09a8, - 0x09ae, 0x09c4, 0x09d6, 0x09e8, 0x09ef, 0x09f9, 0x0a02, 0x0a20, - 0x0a29, 0x0a40, 0x0a62, 0x0a69, 0x0a70, 0x0a7f, 0x0a84, 0x0a8a, - // Entry 100 - 13F - 0x0a8f, 0x0a96, 0x0aa0, 0x0aa6, 0x0aae, 0x0ac0, 0x0ac5, 0x0acc, - 0x0adb, 0x0ae5, 0x0aec, 0x0afd, 0x0b0f, 0x0b1e, 0x0b2d, 0x0b3a, - 0x0b4a, 0x0b53, 0x0b72, 0x0b7b, 0x0b87, 0x0b8e, 0x0b9e, 0x0ba6, - 0x0bb1, 0x0bba, 0x0bce, 0x0bd7, 0x0bdb, 0x0be5, 0x0bf3, 0x0bf8, - 0x0c05, 0x0c12, 0x0c21, 0x0c2e, - }, - }, - { // da - daRegionStr, - daRegionIdx, - }, - { // dav - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa ya MarekaniAustriaAustraliaArubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareni" + - "BurundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarusi" + - "BelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya Kat" + - "iKongoUswisiKodivaaVisiwa vya CookChileKameruniChinaKolombiaKostarik" + - "aKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominikaJa" + - "mhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshiUfi" + - "niFijiVisiwa vya FalklandMikronesiaUfaransaGaboniUingerezaGrenadaJoj" + - "iaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGinekw" + - "etaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungariaI" + - "ndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiIra" + - "kiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigizistaniKambodia" + - "KiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaitiV" + - "isiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSirilank" + - "aLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBukini" + - "Visiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya K" + - "askaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksikoM" + - "alesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNikar" + - "agwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia y" + - "a UfaransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitkair" + - "niPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUrenoPa" + - "lauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya SolomonS" + - "helisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera LeoniS" + - "amarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswaz" + - "iVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori " + - "ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuva" + - "luTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibekistaniVatikaniSan" + - "tavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa" + - " vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMa" + - "yotteAfrika KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00b6, 0x00c0, 0x00c8, - 0x00d0, 0x00d7, 0x00dd, 0x00dd, 0x00e4, 0x00ea, 0x00f1, 0x00f1, - 0x00f8, 0x00fe, 0x0104, 0x0104, 0x010c, 0x0114, 0x011a, 0x0120, - 0x0120, 0x0140, 0x0159, 0x015e, 0x0164, 0x016b, 0x017a, 0x017f, - 0x0187, 0x018c, 0x0194, 0x0194, 0x019d, 0x01a1, 0x01a9, 0x01a9, - 0x01a9, 0x01b0, 0x01c0, 0x01c9, 0x01c9, 0x01cf, 0x01d6, 0x01de, - // Entry 40 - 7F - 0x01f1, 0x01f8, 0x01f8, 0x01fe, 0x0205, 0x020a, 0x020a, 0x0211, - 0x0219, 0x0221, 0x0221, 0x0221, 0x0226, 0x022a, 0x023d, 0x0247, - 0x0247, 0x024f, 0x0255, 0x025e, 0x0265, 0x026a, 0x027d, 0x027d, - 0x0282, 0x028a, 0x0293, 0x0299, 0x029d, 0x02a6, 0x02af, 0x02b6, - 0x02b6, 0x02bf, 0x02c3, 0x02cc, 0x02d2, 0x02d2, 0x02d2, 0x02db, - 0x02e2, 0x02e7, 0x02ef, 0x02ef, 0x02f8, 0x0300, 0x0307, 0x0307, - 0x030c, 0x0331, 0x0336, 0x033c, 0x0344, 0x034a, 0x034a, 0x0351, - 0x0358, 0x035e, 0x0363, 0x0370, 0x0378, 0x0380, 0x0386, 0x0399, - // Entry 80 - BF - 0x03a8, 0x03b4, 0x03bb, 0x03cc, 0x03d7, 0x03dc, 0x03e4, 0x03ee, - 0x03f8, 0x0401, 0x0408, 0x040e, 0x0416, 0x041f, 0x0426, 0x042b, - 0x0431, 0x0437, 0x043e, 0x043e, 0x043e, 0x0444, 0x0456, 0x045f, - 0x0463, 0x0468, 0x0470, 0x0470, 0x0490, 0x0499, 0x04a2, 0x04ad, - 0x04b2, 0x04b8, 0x04be, 0x04c4, 0x04cb, 0x04d2, 0x04da, 0x04e1, - 0x04ed, 0x04f3, 0x0504, 0x050b, 0x0514, 0x051c, 0x0521, 0x0527, - 0x052c, 0x0530, 0x053a, 0x053f, 0x0545, 0x0549, 0x055e, 0x0563, - 0x056b, 0x0574, 0x057b, 0x0591, 0x059a, 0x05a3, 0x05d5, 0x05da, - // Entry C0 - FF - 0x05df, 0x05e7, 0x05ed, 0x05ed, 0x05f6, 0x05fd, 0x05fd, 0x0602, - 0x0608, 0x060d, 0x061f, 0x0629, 0x062f, 0x0635, 0x063d, 0x0648, - 0x0650, 0x0650, 0x0658, 0x0663, 0x066b, 0x0673, 0x067a, 0x0682, - 0x0682, 0x0696, 0x069e, 0x069e, 0x06a3, 0x06a9, 0x06a9, 0x06c2, - 0x06c7, 0x06c7, 0x06cb, 0x06d3, 0x06de, 0x06e5, 0x06f8, 0x0707, - 0x070e, 0x0713, 0x071a, 0x072c, 0x0732, 0x0739, 0x0741, 0x0748, - 0x074e, 0x074e, 0x074e, 0x0756, 0x075d, 0x0769, 0x0771, 0x078a, - 0x0793, 0x07b2, 0x07d0, 0x07d9, 0x07e0, 0x07ef, 0x07f4, 0x07f4, - // Entry 100 - 13F - 0x07fa, 0x0801, 0x080e, 0x0814, 0x081c, - }, - }, - { // de - deRegionStr, - deRegionIdx, - }, - { // de-AT - "Svalbard und Jan Mayen", - []uint16{ // 210 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0016, - }, - }, - { // de-CH - "BruneiBotswanaWeissrusslandKapverdenGrossbritannienÄusseres OzeanienSalo" + - "mon-InselnZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x000e, 0x001b, 0x001b, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x0024, 0x0024, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, - // Entry 40 - 7F - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, - 0x0024, 0x0024, 0x0024, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - // Entry 80 - BF - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - // Entry C0 - FF - 0x0033, 0x0033, 0x0033, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, - 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, - 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, - 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, - 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, - 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, - 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, - // Entry 100 - 13F - 0x0053, 0x0053, 0x0053, 0x0053, 0x005b, - }, - }, - {}, // de-LU - { // dje - "AndooraLaaraw Imaarawey MarganteyAfgaanistanAntigua nda BarbuudaAngiiyaA" + - "lbaaniArmeeniAngoolaArgentineAmeriki SamoaOtrišiOstraaliAruubaAzerba" + - "ayijaŋBosni nda HerzegovineBarbaadosBangladešiBelgiikiBurkina fasoBu" + - "lgaariBahareenBurundiBeniŋBermudaBruuneeBooliviBreezilBahamasBuutaŋB" + - "otswaanaBilorišiBeliiziKanaadaKongoo demookaratiki labooCentraafriki" + - " koyraKongooSwisuKudwarKuuk gungeyŠiiliKameruunŠiinKolombiKosta rika" + - "KuubaKapuver gungeyŠiipurCek laboAlmaaɲeJibuutiDanemarkDoominiki lab" + - "ooAlžeeriEkwateerEstooniMisraEritreeEspaaɲeEcioopiFinlanduFijiKalkan" + - " gungeyMikroneziFaransiGaabonAlbaasalaama MargantaGrenaadaGorgiFaran" + - "si GuyaanGaanaGibraltarGrinlandGambiGineGwadeluupGinee EkwatorialGre" + - "eceGwatemaalaGuamGine-BissoGuyaaneHondurasKrwaasiHaitiHungaariIndone" + - "eziIrlanduIsrayelIndu labooBritiši Indu teekoo laamaIraakIraanAysela" + - "ndItaaliJamaayikUrdunJaapoŋKeeniyaKyrgyzstankamboogiKiribaatiKomoorS" + - "eŋ Kitts nda NevisGurma KooreeHawsa KooreeKuweetKayman gungeyKaazaks" + - "tanLaawosLubnaanSeŋ LussiaLiechtensteinSrilankaLiberiaLeesotoLituaan" + - "iLuxembourgLetooniLiibiMaarokMonakoMoldoviMadagascarMaršal gungeyMaa" + - "cedooniMaaliMaynamarMongooliMariana Gurma GungeyMartiniikiMooritaani" + - "MontserratMaltaMooris gungeyMaldiivuMalaawiMexikiMaleeziMozambikNaam" + - "ibiKaaledooni TaagaaNižerNorfolk GungooNaajiriiaNikaragwaHollanduNor" + - "veejNeepalNauruNiueZeelandu TaagaOmaanPanamaPeeruFaransi PolineeziPa" + - "pua Ginee TaagaFilipinePaakistanPoloɲeSeŋ Piyer nda MikelonPitikarin" + - "Porto RikoPalestine Dangay nda GaazaPortugaalPaluParaguweyKataarReen" + - "ioŋRumaaniIriši labooRwandaSaudiyaSolomon GungeySeešelSuudaŋSweedeSi" + - "ngapurSeŋ HelenaSloveeniSlovaakiSeera LeonSan MarinoSenegalSomaaliSu" + - "rinaamSao Tome nda PrinsipeSalvador labooSuuriaSwazilandTurk nda Kay" + - "ikos GungeyCaaduTogoTaayilandTaažikistanTokelauTimoor hawsaTurkmenis" + - "taŋTuniziTongaTurkiTrinidad nda TobaagoTuvaluTaayiwanTanzaaniUkreenU" + - "gandaAmeriki Laabu MarganteyUruguweyUzbeekistanVaatikan LaamaSeŋvins" + - "aŋ nda GrenadineVeneezuyeelaBritiši Virgin gungeyAmeerik Virgin Gung" + - "eyVietnaamVanautuWallis nda FutunaSamoaYamanMayootiHawsa Afriki Labo" + - "oZambiZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x0021, 0x002c, 0x0040, 0x0047, 0x004e, - 0x0055, 0x005c, 0x005c, 0x0065, 0x0072, 0x0079, 0x0081, 0x0087, - 0x0087, 0x0094, 0x00a9, 0x00b2, 0x00bd, 0x00c5, 0x00d1, 0x00d9, - 0x00e1, 0x00e8, 0x00ee, 0x00ee, 0x00f5, 0x00fc, 0x0103, 0x0103, - 0x010a, 0x0111, 0x0118, 0x0118, 0x0121, 0x012a, 0x0131, 0x0138, - 0x0138, 0x0152, 0x0164, 0x016a, 0x016f, 0x0175, 0x0180, 0x0186, - 0x018e, 0x0193, 0x019a, 0x019a, 0x01a4, 0x01a9, 0x01b7, 0x01b7, - 0x01b7, 0x01be, 0x01c6, 0x01ce, 0x01ce, 0x01d5, 0x01dd, 0x01dd, - // Entry 40 - 7F - 0x01ec, 0x01f4, 0x01f4, 0x01fc, 0x0203, 0x0208, 0x0208, 0x020f, - 0x0217, 0x021e, 0x021e, 0x021e, 0x0226, 0x022a, 0x0237, 0x0240, - 0x0240, 0x0247, 0x024d, 0x0262, 0x026a, 0x026f, 0x027d, 0x027d, - 0x0282, 0x028b, 0x0293, 0x0298, 0x029c, 0x02a5, 0x02b5, 0x02bb, - 0x02bb, 0x02c5, 0x02c9, 0x02d3, 0x02da, 0x02da, 0x02da, 0x02e2, - 0x02e9, 0x02ee, 0x02f6, 0x02f6, 0x02ff, 0x0306, 0x030d, 0x030d, - 0x0317, 0x0331, 0x0336, 0x033b, 0x0343, 0x0349, 0x0349, 0x0351, - 0x0356, 0x035d, 0x0364, 0x036e, 0x0376, 0x037f, 0x0385, 0x0399, - // Entry 80 - BF - 0x03a5, 0x03b1, 0x03b7, 0x03c4, 0x03ce, 0x03d4, 0x03db, 0x03e6, - 0x03f3, 0x03fb, 0x0402, 0x0409, 0x0411, 0x041b, 0x0422, 0x0427, - 0x042d, 0x0433, 0x043a, 0x043a, 0x043a, 0x0444, 0x0452, 0x045c, - 0x0461, 0x0469, 0x0471, 0x0471, 0x0485, 0x048f, 0x0499, 0x04a3, - 0x04a8, 0x04b5, 0x04bd, 0x04c4, 0x04ca, 0x04d1, 0x04d9, 0x04e0, - 0x04f1, 0x04f7, 0x0505, 0x050e, 0x0517, 0x051f, 0x0526, 0x052c, - 0x0531, 0x0535, 0x0543, 0x0548, 0x054e, 0x0553, 0x0564, 0x0575, - 0x057d, 0x0586, 0x058d, 0x05a3, 0x05ac, 0x05b6, 0x05d0, 0x05d9, - // Entry C0 - FF - 0x05dd, 0x05e6, 0x05ec, 0x05ec, 0x05f4, 0x05fb, 0x05fb, 0x0607, - 0x060d, 0x0614, 0x0622, 0x0629, 0x0630, 0x0636, 0x063e, 0x0649, - 0x0651, 0x0651, 0x0659, 0x0663, 0x066d, 0x0674, 0x067b, 0x0683, - 0x0683, 0x0698, 0x06a6, 0x06a6, 0x06ac, 0x06b5, 0x06b5, 0x06cc, - 0x06d1, 0x06d1, 0x06d5, 0x06de, 0x06ea, 0x06f1, 0x06fd, 0x070a, - 0x0710, 0x0715, 0x071a, 0x072e, 0x0734, 0x073c, 0x0744, 0x074a, - 0x0750, 0x0750, 0x0750, 0x0767, 0x076f, 0x077a, 0x0788, 0x07a1, - 0x07ad, 0x07c3, 0x07d8, 0x07e0, 0x07e7, 0x07f8, 0x07fd, 0x07fd, - // Entry 100 - 13F - 0x0802, 0x0809, 0x081b, 0x0820, 0x0828, - }, - }, - { // dsb - "AscensionAndorraZjadnośone arabiske emiratyAfghanistanAntigua a BarbudaA" + - "nguillaAlbańskaArmeńskaAngolaAntarktisArgentinskaAmeriska SamoaAwstr" + - "iskaAwstralskaArubaÅlandAzerbajdžanBosniska a HercegowinaBarbadosBan" + - "gladešBelgiskaBurkina FasoBulgarskaBahrainBurundiBeninSt. Barthélemy" + - "BermudyBruneiBoliwiskaKaribiska NižozemskaBrazilskaBahamyBhutanBouve" + - "towa kupaBotswanaBěłoruskaBelizeKanadaKokosowe kupyKongo-KinshasaCen" + - "tralnoafriska republikaKongo-BrazzavilleŠwicarskaCôte d’IvoireCookow" + - "e kupyChilskaKamerunChinaKolumbiskaClippertonowa kupaKosta RikaKubaK" + - "ap VerdeCuraçaoGódowne kupyCypriskaČeska republikaNimskaDiego Garcia" + - "DžibutiDańskaDominikaDominikańska republikaAlgeriskaCeuta a MelillaE" + - "kwadorEstniskaEgyptojskaPódwjacorna SaharaEritrejaŠpańskaEtiopiskaEu" + - "ropska unijaFinskaFidžiFalklandske kupyMikroneziskaFäröjeFrancojskaG" + - "abunZjadnośone kralejstwoGrenadaGeorgiskaFrancojska GuyanaGuernseyGh" + - "anaGibraltarGrönlandskaGambijaGinejaGuadeloupeEkwatorialna GinejaGri" + - "chiskaPódpołdnjowa Georgiska a Pódpołdnjowe Sandwichowe kupyGuatemal" + - "aGuamGineja-BissauGuyanaWósebna zastojnstwowa cona HongkongHeardowa " + - "kupa a McDonaldowe kupyHondurasChorwatskaHaitiHungorskaKanariske kup" + - "yIndoneziskaIrskaIsraelManIndiskaBritiski indiskooceaniski teritoriu" + - "mIrakIranIslandskaItalskaJerseyJamaikaJordaniskaJapańskaKeniaKirgizi" + - "stanKambodžaKiribatiKomorySt. Kitts a NevisPódpołnocna KorejaPódpołd" + - "njowa KorejaKuwaitKajmaniske kupyKazachstanLaosLibanonSt. LuciaLiech" + - "tensteinSri LankaLiberijaLesothoLitawskaLuxemburgskaLetiskaLibyskaMa" + - "rokkoMonacoMoldawskaCarna GóraSt. MartinMadagaskarMarshallowe kupyMa" + - "kedońskaMaliMyanmarMongolskaWósebna zastojnstwowa cona MacaoPódpołno" + - "cne MarianyMartiniqueMawretańskaMontserratMaltaMauritiusMalediwyMala" + - "wiMexikoMalajzijaMosambikNamibijaNowa KaledoniskaNigerNorfolkowa kup" + - "aNigerijaNikaraguaNižozemskaNorwegskaNepalNauruNiueNowoseelandskaOma" + - "nPanamaPeruFrancojska PolyneziskaPapua-NeuguineaFilipinyPakistanPóls" + - "kaSt. Pierre a MiquelonPitcairnowe kupyPuerto RicoPalestinski awtono" + - "mny teritoriumPortugalskaPalauParaguayKatarwenkowna OceaniskaRéunion" + - "RumuńskaSerbiskaRuskaRuandaSaudi-ArabiskaSalomonySeychelleSudanŠweds" + - "kaSingapurSt. HelenaSłowjeńskaSvalbard a Jan MayenSłowakskaSierra Le" + - "oneSan MarinoSenegalSomalijaSurinamskaPódpołdnjowy SudanSão Tomé a P" + - "ríncipeEl SalvadorSint MaartenSyriskaSwasiskaTristan da CunhaTurks a" + - " Caicos kupyČadFrancojski pódpołdnjowy a antarktiski teritoriumTogoT" + - "hailandskaTadźikistanTokelauTimor-LesteTurkmeniskaTuneziskaTongaTurk" + - "ojskaTrinidad a TobagoTuvaluTaiwanTansanijaUkrainaUgandaAmeriska Oce" + - "aniskaZjadnośone staty AmerikiUruguayUzbekistanVatikańske městoSt. V" + - "incent a GrenadinyVenezuelaBritiske kněžniske kupyAmeriske kněžniske" + - " kupyVietnamVanuatuWallis a FutunaSamoaKosowoJemenMayottePódpołdnjow" + - "a Afrika (Republika)SambijaSimbabwenjeznaty regionswětAfrikaPódpołno" + - "cna AmerikaPódpołdnjowa AmerikaOceaniskaPódwjacorna AfrikaSrjejźna A" + - "merikapódzajtšna Afrikapódpołnocna Afrikasrjejźna Afrikapódpołdnjowa" + - " AfrikaAmerikapódpołnocny ameriski kontinentKaribiskapódzajtšna Azij" + - "apódpołdnjowa Azijakrotkozajtšna Azijapódpołdnjowa EuropaAwstralazij" + - "aMelaneziskaMikroneziska (kupowy region)PolyneziskaAzijacentralna Az" + - "ijapódwjacorna AzijaEuropapódzajtšna Europapódpołnocna Europapódwjac" + - "orna EuropaŁatyńska Amerika", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002c, 0x0037, 0x0048, 0x0050, 0x0059, - 0x0062, 0x0068, 0x0071, 0x007c, 0x008a, 0x0093, 0x009d, 0x00a2, - 0x00a8, 0x00b4, 0x00ca, 0x00d2, 0x00dc, 0x00e4, 0x00f0, 0x00f9, - 0x0100, 0x0107, 0x010c, 0x011b, 0x0122, 0x0128, 0x0131, 0x0146, - 0x014f, 0x0155, 0x015b, 0x0169, 0x0171, 0x017c, 0x0182, 0x0188, - 0x0195, 0x01a3, 0x01bd, 0x01ce, 0x01d8, 0x01e8, 0x01f4, 0x01fb, - 0x0202, 0x0207, 0x0211, 0x0223, 0x022d, 0x0231, 0x023a, 0x0242, - 0x024f, 0x0257, 0x0267, 0x026d, 0x0279, 0x0281, 0x0288, 0x0290, - // Entry 40 - 7F - 0x02a7, 0x02b0, 0x02bf, 0x02c6, 0x02ce, 0x02d8, 0x02eb, 0x02f3, - 0x02fc, 0x0305, 0x0313, 0x0313, 0x0319, 0x031f, 0x032f, 0x033b, - 0x0343, 0x034d, 0x0352, 0x0368, 0x036f, 0x0378, 0x0389, 0x0391, - 0x0396, 0x039f, 0x03ab, 0x03b2, 0x03b8, 0x03c2, 0x03d5, 0x03de, - 0x0418, 0x0421, 0x0425, 0x0432, 0x0438, 0x045c, 0x047c, 0x0484, - 0x048e, 0x0493, 0x049c, 0x04aa, 0x04b5, 0x04ba, 0x04c0, 0x04c3, - 0x04ca, 0x04ee, 0x04f2, 0x04f6, 0x04ff, 0x0506, 0x050c, 0x0513, - 0x051d, 0x0526, 0x052b, 0x0536, 0x053f, 0x0547, 0x054d, 0x055e, - // Entry 80 - BF - 0x0572, 0x0587, 0x058d, 0x059c, 0x05a6, 0x05aa, 0x05b1, 0x05ba, - 0x05c7, 0x05d0, 0x05d8, 0x05df, 0x05e7, 0x05f3, 0x05fa, 0x0601, - 0x0608, 0x060e, 0x0617, 0x0622, 0x062c, 0x0636, 0x0646, 0x0651, - 0x0655, 0x065c, 0x0665, 0x0686, 0x069b, 0x06a5, 0x06b1, 0x06bb, - 0x06c0, 0x06c9, 0x06d1, 0x06d7, 0x06dd, 0x06e6, 0x06ee, 0x06f6, - 0x0706, 0x070b, 0x071a, 0x0722, 0x072b, 0x0736, 0x073f, 0x0744, - 0x0749, 0x074d, 0x075b, 0x075f, 0x0765, 0x0769, 0x077f, 0x078e, - 0x0796, 0x079e, 0x07a5, 0x07ba, 0x07ca, 0x07d5, 0x07f5, 0x0800, - // Entry C0 - FF - 0x0805, 0x080d, 0x0812, 0x0824, 0x082c, 0x0835, 0x083d, 0x0842, - 0x0848, 0x0856, 0x085e, 0x0867, 0x086c, 0x0874, 0x087c, 0x0886, - 0x0892, 0x08a6, 0x08b0, 0x08bc, 0x08c6, 0x08cd, 0x08d5, 0x08df, - 0x08f3, 0x0909, 0x0914, 0x0920, 0x0927, 0x092f, 0x093f, 0x0952, - 0x0956, 0x0988, 0x098c, 0x0997, 0x09a3, 0x09aa, 0x09b5, 0x09c0, - 0x09c9, 0x09ce, 0x09d7, 0x09e8, 0x09ee, 0x09f4, 0x09fd, 0x0a04, - 0x0a0a, 0x0a1c, 0x0a1c, 0x0a35, 0x0a3c, 0x0a46, 0x0a58, 0x0a6f, - 0x0a78, 0x0a91, 0x0aaa, 0x0ab1, 0x0ab8, 0x0ac7, 0x0acc, 0x0ad2, - // Entry 100 - 13F - 0x0ad7, 0x0ade, 0x0aff, 0x0b06, 0x0b0e, 0x0b1d, 0x0b22, 0x0b28, - 0x0b3d, 0x0b53, 0x0b5c, 0x0b6f, 0x0b80, 0x0b93, 0x0ba7, 0x0bb7, - 0x0bcc, 0x0bd3, 0x0bf3, 0x0bfc, 0x0c0e, 0x0c22, 0x0c36, 0x0c4b, - 0x0c57, 0x0c62, 0x0c7e, 0x0c89, 0x0c8e, 0x0c9d, 0x0caf, 0x0cb5, - 0x0cc8, 0x0cdc, 0x0cef, 0x0d01, - }, - }, - { // dua - "Cameroun", - []uint16{ // 49 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0008, - }, - }, - { // dyo - "AndorraAfganistanAntigua di BarbudaAngiiyaAlbaniArmeniAngolaArsantinSamo" + - "a yati AmerikOtrisOstraaliaArubaAserbaysanBosni di HersegovinBarbadB" + - "angladesBelsikBurukiina FasoBulgariBahraynBurundiBeneBermudBuruneyBo" + - "liiviBresilBahamaButanBoswanaBelarusBeliisKanadaMofam demokratik mat" + - "i KongoKongoKoddiwarCiliKamerunSiinKolombiKosta RikaKubaKap VerSiipr" + - "Mofam mati CekAlmaañJibutiDanmarkDominikaMofam mati DominikAlseriEku" + - "adorEstoniEsíptEritreeEspaañEcoopiFinlandFijiFransGabonGrenadaSeorsi" + - "GaanaSipraltaarGreenlandGambiGinéGuwadalupGresGuatemalaGuamGiné Bisa" + - "auGiyanOndurasKroasiAytiOŋriEndonesiIrlandIsraelEndIrakIranIislandIt" + - "aliSamaikSapoŋKeniyaKambojKomorSaŋ LusiaSiri LankaLiberiaMadagaskaar" + - "MaliEcinkey yati NoorfokAbari SaudiSudanSingapurSloveniSlovakiSerra " + - "LeonSenegalSomaliSalvadoorCadTogoTailand", - []uint16{ // 228 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x0007, 0x0011, 0x0023, 0x002a, 0x0030, - 0x0036, 0x003c, 0x003c, 0x0044, 0x0055, 0x005a, 0x0063, 0x0068, - 0x0068, 0x0072, 0x0085, 0x008b, 0x0094, 0x009a, 0x00a8, 0x00af, - 0x00b6, 0x00bd, 0x00c1, 0x00c1, 0x00c7, 0x00ce, 0x00d5, 0x00d5, - 0x00db, 0x00e1, 0x00e6, 0x00e6, 0x00ed, 0x00f4, 0x00fa, 0x0100, - 0x0100, 0x011b, 0x011b, 0x0120, 0x0120, 0x0128, 0x0128, 0x012c, - 0x0133, 0x0137, 0x013e, 0x013e, 0x0148, 0x014c, 0x0153, 0x0153, - 0x0153, 0x0158, 0x0166, 0x016d, 0x016d, 0x0173, 0x017a, 0x0182, - // Entry 40 - 7F - 0x0194, 0x019a, 0x019a, 0x01a1, 0x01a7, 0x01ad, 0x01ad, 0x01b4, - 0x01bb, 0x01c1, 0x01c1, 0x01c1, 0x01c8, 0x01cc, 0x01cc, 0x01cc, - 0x01cc, 0x01d1, 0x01d6, 0x01d6, 0x01dd, 0x01e3, 0x01e3, 0x01e3, - 0x01e8, 0x01f2, 0x01fb, 0x0200, 0x0205, 0x020e, 0x020e, 0x0212, - 0x0212, 0x021b, 0x021f, 0x022b, 0x0230, 0x0230, 0x0230, 0x0237, - 0x023d, 0x0241, 0x0246, 0x0246, 0x024e, 0x0254, 0x025a, 0x025a, - 0x025d, 0x025d, 0x0261, 0x0265, 0x026c, 0x0271, 0x0271, 0x0277, - 0x0277, 0x027d, 0x0283, 0x0283, 0x0289, 0x0289, 0x028e, 0x028e, - // Entry 80 - BF - 0x028e, 0x028e, 0x028e, 0x028e, 0x028e, 0x028e, 0x028e, 0x0298, - 0x0298, 0x02a2, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, - 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02b4, 0x02b4, 0x02b4, - 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, - 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, - 0x02b8, 0x02b8, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, - 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, - 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, - // Entry C0 - FF - 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, - 0x02cc, 0x02d7, 0x02d7, 0x02d7, 0x02dc, 0x02dc, 0x02e4, 0x02e4, - 0x02eb, 0x02eb, 0x02f2, 0x02fc, 0x02fc, 0x0303, 0x0309, 0x0309, - 0x0309, 0x0309, 0x0312, 0x0312, 0x0312, 0x0312, 0x0312, 0x0312, - 0x0315, 0x0315, 0x0319, 0x0320, - }, - }, - { // dz - "ཨེ་སེན་ཤུན་ཚོ་གླིང༌ཨཱན་དོ་རཡུ་ནཱའི་ཊེཌ་ ཨ་རབ་ ཨེ་མེ་རེཊསཨཕ་གྷ་ནི་སཏཱནཨན་" + - "ཊི་གུ་ཝ་ ཨེནཌ་ བྷར་བྷུ་ཌཨང་གི་ལཨཱལ་བེ་ནི་ཡཨར་མི་ནི་ཡཨང་གྷོ་ལའཛམ་གླ" + - "ིང་ལྷོ་མཐའི་ཁྱགས་གླིངཨར་ཇེན་ཊི་ནས་མོ་ཨ་ཡུ་ཨེས་ཨེ་མངའ་ཁོངསཨཱོས་ཊྲི་" + - "ཡཨཱོས་ཊྲེལ་ལི་ཡཨ་རུ་བཱཨ་ལནཌ་གླིང་ཚོམཨ་ཛར་བྷའི་ཇཱནབྷོས་ནི་ཡ་ ཨེནཌ་ " + - "ཧར་ཛི་གྷོ་བི་ནབྷར་བེ་ཌོསབངྒ་ལ་དེཤབྷེལ་ཇམབྷར་ཀི་ན་ ཕེ་སོབུལ་ག་རི་ཡབ" + - "ྷ་རེནབྷུ་རུན་ཌིབྷེ་ནིནསེནཊ་ བར་ཐོ་ལོམ་མིའུབར་མུ་ཌབྷྲུ་ནའིབྷེ་ལི་བི" + - "་ཡཀེ་རི་བི་ཡེན་ནེ་དར་ལནཌས྄བྲ་ཛིལབྷ་ཧ་མས྄འབྲུགབོའུ་ཝེཊ་མཚོ་གླིངབྷོཙ" + - "་ཝ་ནབེལ་ཨ་རུ་སུབྷེ་ལིཛཀེ་ན་ཌཀོ་ཀོས་གླིང་ཚོམཀོང་གྷོ ཀིན་ཤ་སསེན་ཊལ་ " + - "ཨཕ་རི་ཀཱན་ རི་པབ་ལིཀཀོང་གྷོ བྷྲ་ཛ་བིལསུ་ཝིཊ་ཛར་ལེནཌཀོ་ཊེ་ ཌི་ཨི་ཝོ" + - "་རེཀུག་གླིང་ཚོམཅི་ལིཀེ་མ་རུནརྒྱ་ནགཀོ་ལོམ་བྷི་ཡཀི་ལི་པེར་ཊོན་མཚོ་གླ" + - "ིང་ཀོས་ཊ་རི་ཀཀིའུ་བྷཀེཔ་བཱཌཀྱཱུར་ར་ཀོཁི་རིསྟ་མེས་མཚོ་གླིངསཱའི་པྲསཅ" + - "ེཀ་ རི་པབ་ལིཀཇཱར་མ་ནིཌི་ཡེ་གོ་གར་སིའོཇི་བྷུ་ཊིཌེན་མཱཀཌོ་མི་ནི་ཀཌོ་" + - "མི་ནི་ཀཱན་ རི་པབ་ལིཀཨཱལ་ཇི་རི་ཡསེ་ཨུ་ཏ་ ཨེནཌ་ མེལ་ལི་ལཨེ་ཁྭ་ཌོརཨེས" + - "་ཊོ་ནི་ཡཨི་ཇིབཊནུབ་ཕྱོགས་ ས་ཧཱ་རཨེ་རི་ཊྲེ་ཡཨིས་པེནཨི་ཐི་ཡོ་པི་ཡཡུ་" + - "རོབ་གཅིག་བསྡོམས་ཚོགས་པཕིན་ལེནཌཕི་ཇིཕལྐ་ལནྜ་གླིང་ཚོམམའི་ཀྲོ་ནི་ཤི་ཡ" + - "ཕཱའེ་རོ་གླིང་ཚོམཕྲཱནསགྷ་བྷོནཡུ་ནཱའི་ཊེཌ་ ཀིང་ཌམགྲྀ་ན་ཌཇཽར་ཇཱགུའི་ཡ" + - "་ན་ ཕྲནས྄་མངའ་ཁོངསགུ་ཨེརྣ་སིགྷ་ནཇིབ་རཱལ་ཊརགིརཱིན་ལནཌ྄གྷེམ་བི་ཡགྷི་" + - "ནིགོ་ཌེ་ལུ་པེཨེ་ཀུ་ཊོ་རེལ་ གི་ནིགིརིས྄སཱའུཐ་ཇཽར་ཇཱ་ དང་ སཱའུཐ་སེནཌ" + - "྄་ཝིཅ་གླིང་ཚོམགྷོ་ཊ་མ་ལགུ་འམ་ མཚོ་གླིངགྷི་ནི་ བྷི་སཱའུགྷ་ཡ་ནཧོང་ཀོ" + - "ང་ཅཱའི་ནཧཱརཌ་མཚོ་གླིང་ དང་ མེཀ་ཌོ་ནལཌ྄་གླིང་ཚོམཧཱན་ཌུ་རཱས྄ཀྲོ་ཨེ་ཤ" + - "ཧེ་ཊིཧཱང་གྷ་རིཀ་ནེ་རི་གླིང་ཚོམཨིན་ཌོ་ནེ་ཤི་ཡཨཱ་ཡ་ལེནཌཨིས་ར་ཡེལཨ་ཡུ" + - "ལ་ ཨོཕ་ མཱནརྒྱ་གརབྲི་ཊིཤ་རྒྱ་གར་གྱི་རྒྱ་མཚོ་ས་ཁོངསཨི་རཱཀཨི་རཱནཨཱའི" + - "ས་ལེནཌཨི་ཊ་ལིཇེར་སིཇཱ་མཻ་ཀཇོར་ཌནཇ་པཱནཀེན་ཡཀིར་གིས་སཏཱནཀམ་བྷོ་ཌི་ཡཀ" + - "ི་རི་བ་ཏི་མཚོ་གླིངཀོ་མོ་རོསསེནཊ་ ཀིཊས་ དང་ ནེ་བིསབྱང་ ཀོ་རི་ཡལྷོ་ " + - "ཀོ་རི་ཡཀུ་ཝེཊཁེ་མེན་གླིང་ཚོམཀ་ཛགས་སཏཱནལཱ་ཝོསལེ་བ་ནོནསེནཊ་ ལུ་སི་ཡལ" + - "ིཀ་ཏནས་ཏ་ཡིནཤྲཱི་ལང་ཀལཱའི་བེ་རི་ཡལཻ་སོ་ཐོལི་ཐུ་ཝེ་ནི་ཡལག་ཛམ་བོརྒལཊ" + - "་བི་ཡལི་བི་ཡམོ་རོ་ཀོམོ་ན་ཀོམོལ་དོ་བཱམོན་ཊི་ནེག་རོསེནཊ་ མཱར་ཊིནམ་དཱ" + - "་གེས་ཀརམར་ཤེལ་གླིང་ཚོམམ་སེ་ཌོ་ནི་ཡམཱ་ལིམི་ཡཱན་མར་ (བྷར་མ)སོག་པོ་ཡུ" + - "ལམཀ་ཨའུ་ཅཱའི་ནབྱང་ཕྱོགས་ཀྱི་མ་ར་ཡ་ན་གླིང་ཚོམམཱར་ཊི་ནིཀམོ་རི་ཊེ་ནི་" + - "ཡམོན་ས་རཊམཱལ་ཊམོ་རི་ཤཱསམཱལ་དིབསམ་ལ་ཝིམེཀ་སི་ཀོམ་ལེ་ཤི་ཡམོ་ཛམ་བྷིཀན" + - "་མི་བི་ཡནིའུ་ཀ་ལི་དོ་ནི་ཡནཱའི་ཇཱནོར་ཕོལཀ་མཚོ་གླིང༌ནཱའི་ཇི་རི་ཡནི་ཀ" + - "ྲ་ཝ་གནེ་དར་ལནཌས྄ནོར་ཝེབལ་ཡུལནའུ་རུ་ནི་ཨུ་ཨཻནིའུ་ཛི་ལེནཌཨོ་མཱནཔ་ན་མ" + - "པེ་རུཕྲཱནས྄་ཀྱི་པོ་ལི་ནི་ཤི་ཡཔ་པུ་ ནིའུ་གི་ནིཕི་ལི་པིནསཔ་ཀི་སཏཱནཔོ" + - "་ལེནཌསིནཊ་པི་ཡེར་ ཨེནཌ་ མིཀོ་ལེནཔིཊ་ཀེ་ཡེརན་གླིང་ཚོམཔུ་འེར་ཊོ་རི་ཁ" + - "ོཔེ་ལིསི་ཊི་ནི་ཡན་ཊེ་རི་ཐོ་རིཔོར་ཅུ་གཱལཔ་ལའུཔ་ར་གུ་ཝའིཀ་ཊརཨོཤི་ཡཱན" + - "་ན་གྱི་མཐའ་མཚམསརེ་ཡུ་ནི་ཡོནརོ་མེ་ནི་ཡསཱར་བྷི་ཡཨུ་རུ་སུརུ་ཝན་ཌསཱཝ་ད" + - "ི་ ཨ་རེ་བྷི་ཡསོ་ལོ་མོན་ གླིང་ཚོམསེ་ཤཱལསསུ་ཌཱནསུའི་ཌེནསིང་ག་པོརསེནཊ" + - "་ ཧེ་ལི་ནསུ་ལོ་བི་ནི་ཡསྭཱལ་བྷརྡ་ ཨེནཌ་ ཇཱན་མ་ཡེནསུ་ལོ་བཱ་ཀི་ཡསི་ར་" + - " ལི་འོནསཱན་མ་རི་ནོསེ་ནི་གྷལསོ་མ་ལི་ཡསུ་རི་ནཱམསཱའུཐ་ སུ་ཌཱནསཝ་ ཊོ་མེ་" + - " ཨེནཌ་ པྲྀན་སི་པེཨེལ་སལ་བ་ཌོརསིནཊ་ མཱར་ཊེནསི་རི་ཡསུ་ཝ་ཛི་ལེནཌཏྲིས་ཏན" + - "་ད་ཀུན་ཧཏུརྐས྄་ ཨེནཌ་ ཀ་ཀོས་གླིང་ཚོམཅཱཌཕྲནཅ་གི་ལྷོ་ཕྱོགས་མངའ་ཁོངསཊ" + - "ོ་གྷོཐཱའི་ལེནཌཏ་ཇིག་གི་སཏཱནཏོ་ཀེ་ལའུ་ མཚོ་གླིངཏི་་མོར་ལེ་ཨེསཊཊཱརཀ་" + - "མེནའི་སཏཱནཊུ་ནི་ཤི་ཡཊོང་གྷཊཱར་ཀིཊི་ནི་ཌཱཌ་ ཨེནཌ་ ཊོ་བྷེ་གྷོཏུ་ཝ་ལུ" + - "ཊཱའི་ཝཱནཊཱན་ཛཱ་ནི་ཡཡུ་ཀརེནཡུ་གྷན་ཌཡུ་ཨེས་གྱི་མཐའ་མཚམས་མཚོ་གླིང་ཡུ་" + - "ཨེས་ཨེཡུ་རུ་གུ་ཝའིཨུས་བེག་གི་སཏཱནབ་ཊི་ཀཱན་ སི་ཊིསེནཊ་ཝིན་སེནཌ྄ ཨེན" + - "ཌ་ གི་རེ་ན་དིནས྄བེ་ནི་ཛུ་ཝེ་ལཝརཇིན་གླིང་ཚོམ་ བྲཱི་ཊིཤ་མངའ་ཁོངསཝརཇི" + - "ན་གླིང་ཚོམ་ ཡུ་ཨེས་ཨེ་མངའ་ཁོངསབེཊ་ནཱམཝ་ནུ་ཨ་ཏུཝལ་ལིས྄་ ཨེནཌ་ ཕུ་ཏུ" + - "་ན་ས་མོ་ཨཡེ་མེནམེ་ཡོཊསཱའུཐ་ ཨཕ་རི་ཀཛམ་བྷི་ཡཛིམ་བྷབ་ཝེངོ་མ་ཤེས་པའི་" + - "ལུང་ཕྱོགསའཛམ་གླིང༌ཨཕ་རི་ཀབྱང་ཨ་མི་རི་ཀལྷོ་ཨ་མི་རི་ཀཨོཤི་ཡཱན་ནནུབ་ཕ" + - "ྱོགས་ཀྱི་ཨཕ་རི་ཀབར་ཕྱོགས་ཨ་མི་རི་ཀཤར་ཕྱོགས་ཀྱི་ཨཕ་རི་ཀབྱང་ཕྱོགས་ཀྱ" + - "ི་ཨཕ་རི་ཀསྦུག་ཕྱོགས་ཀྱི་ཨཕ་རི་ཀལྷོའི་ཨཕ་རི་ཀཨ་མི་རི་ཀ་ཚུབྱང་ཕྱོགས་" + - "ཀྱི་ཨ་མི་རི་ཀཀེ་རི་བི་ཡེནཤར་ཕྱོགས་ཀྱི་ཨེ་ཤི་ཡལྷོའི་ཨེ་ཤི་ཡལྷོ་ཤར་ཕ" + - "ྱོགས་ཀྱི་ཨེ་ཤི་ཡལྷོའི་ཡུ་རོབཨཱོས་ཊྲེལ་ཨེ་ཤི་ཡམེ་ལ་ནི་ཤི་ཡལུང་ཕྱོགས" + - "་མའི་ཀྲོ་ནི་ཤི་ཡཔོ་ལི་ནི་ཤི་ཡཨེ་ཤི་ཡསྦུག་ཕྱོགས་ཀྱི་ཨེ་ཤི་ཡནུབ་ཕྱོག" + - "ས་ཀྱི་ཨེ་ཤི་ཡཡུ་རོབཤར་ཕྱོགས་ཀྱི་ཡུ་རོབབྱང་ཕྱོགས་ཀྱི་ཡུ་རོབནུབ་ཕྱོག" + - "ས་ཀྱི་ཡུ་རོབལེ་ཊིནཨ་མི་རི་ཀ", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0039, 0x0051, 0x00a4, 0x00cb, 0x0118, 0x012d, 0x014e, - 0x016c, 0x0184, 0x01d5, 0x01f6, 0x0241, 0x025f, 0x0289, 0x029e, - 0x02c8, 0x02ef, 0x0348, 0x0366, 0x0381, 0x0396, 0x03c1, 0x03df, - 0x03f1, 0x040f, 0x0424, 0x045e, 0x0473, 0x048b, 0x04ac, 0x04f4, - 0x0506, 0x051e, 0x052d, 0x0560, 0x0578, 0x0599, 0x05ae, 0x05c0, - 0x05ed, 0x0618, 0x0668, 0x0699, 0x06c3, 0x06f7, 0x071b, 0x072a, - 0x0742, 0x0754, 0x0778, 0x07bd, 0x07db, 0x07f0, 0x0805, 0x0823, - 0x085f, 0x0877, 0x089f, 0x08b7, 0x08e7, 0x0902, 0x0917, 0x0935, - // Entry 40 - 7F - 0x0978, 0x0999, 0x09da, 0x09f5, 0x0a16, 0x0a2b, 0x0a5c, 0x0a7d, - 0x0a92, 0x0ab9, 0x0b04, 0x0b04, 0x0b1c, 0x0b2b, 0x0b5b, 0x0b88, - 0x0bb8, 0x0bc7, 0x0bdc, 0x0c13, 0x0c28, 0x0c3a, 0x0c80, 0x0c9e, - 0x0caa, 0x0cc8, 0x0ce9, 0x0d04, 0x0d16, 0x0d37, 0x0d6e, 0x0d80, - 0x0dfa, 0x0e15, 0x0e40, 0x0e6e, 0x0e80, 0x0eaa, 0x0f1b, 0x0f3c, - 0x0f54, 0x0f63, 0x0f7e, 0x0fae, 0x0fd8, 0x0ff3, 0x100e, 0x1037, - 0x1049, 0x10ac, 0x10be, 0x10d0, 0x10ee, 0x1103, 0x1115, 0x112a, - 0x113c, 0x114b, 0x115a, 0x117e, 0x119f, 0x11d8, 0x11f3, 0x122f, - // Entry 80 - BF - 0x1251, 0x1273, 0x1285, 0x12b2, 0x12d0, 0x12e2, 0x12fa, 0x131f, - 0x1346, 0x1361, 0x1385, 0x139d, 0x13c4, 0x13e2, 0x13f7, 0x140c, - 0x1424, 0x1439, 0x1454, 0x147b, 0x14a0, 0x14c1, 0x14ee, 0x1512, - 0x1521, 0x1551, 0x156f, 0x1596, 0x15f0, 0x160e, 0x1635, 0x164d, - 0x165c, 0x1677, 0x168f, 0x16a1, 0x16bc, 0x16d7, 0x16f5, 0x1710, - 0x1743, 0x1758, 0x178e, 0x17b2, 0x17cd, 0x17ee, 0x1800, 0x1812, - 0x1827, 0x183f, 0x1863, 0x1875, 0x1884, 0x1893, 0x18db, 0x1909, - 0x1927, 0x1942, 0x1957, 0x19a4, 0x19e0, 0x1a0d, 0x1a61, 0x1a7f, - // Entry C0 - FF - 0x1a8e, 0x1aac, 0x1ab8, 0x1afd, 0x1b21, 0x1b3f, 0x1b5a, 0x1b72, - 0x1b87, 0x1bbb, 0x1bf2, 0x1c07, 0x1c19, 0x1c31, 0x1c4c, 0x1c71, - 0x1c98, 0x1ce2, 0x1d09, 0x1d2b, 0x1d4c, 0x1d67, 0x1d82, 0x1d9d, - 0x1dc2, 0x1e0d, 0x1e31, 0x1e56, 0x1e6b, 0x1e8f, 0x1ebc, 0x1f0c, - 0x1f15, 0x1f63, 0x1f75, 0x1f90, 0x1fb7, 0x1fee, 0x201b, 0x2048, - 0x2066, 0x2078, 0x208a, 0x20d7, 0x20ec, 0x2104, 0x2125, 0x213a, - 0x2152, 0x21a9, 0x21a9, 0x21c4, 0x21e8, 0x2215, 0x2240, 0x22a2, - 0x22c9, 0x232a, 0x238e, 0x23a3, 0x23be, 0x23ff, 0x2411, 0x2411, - // Entry 100 - 13F - 0x2423, 0x2435, 0x245d, 0x2475, 0x2493, 0x24d5, 0x24f0, 0x2505, - 0x252c, 0x2553, 0x2571, 0x25b0, 0x25e6, 0x2622, 0x2661, 0x26a3, - 0x26ca, 0x26ee, 0x2733, 0x2757, 0x2793, 0x27ba, 0x2802, 0x2826, - 0x2859, 0x287d, 0x28c8, 0x28ef, 0x2904, 0x2946, 0x2985, 0x2997, - 0x29d0, 0x2a0c, 0x2a48, 0x2a75, - }, - }, - { // ebu - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa ya MarekaniAustriaAustraliaArubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareni" + - "BurundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarusi" + - "BelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya Kat" + - "iKongoUswisiKodivaaVisiwa vya CookChileKameruniChinaKolombiaKostarik" + - "aKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominikaJa" + - "mhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshiUfi" + - "niFijiVisiwa vya FalklandMikronesiaUfaransaGaboniUingerezaGrenadaJoj" + - "iaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGinekw" + - "etaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungariaI" + - "ndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiIra" + - "kiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigizistaniKambodia" + - "KiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaitiV" + - "isiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSirilank" + - "aLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBukini" + - "Visiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya K" + - "askaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksikoM" + - "alesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNikar" + - "agwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia y" + - "a UfaransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitkair" + - "niPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUrenoPa" + - "lauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya SolomonS" + - "helisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera LeoniS" + - "amarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswaz" + - "iVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori " + - "ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuva" + - "luTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibekistaniVatikaniSan" + - "tavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa" + - " vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMa" + - "yotteAfrika KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00b6, 0x00c0, 0x00c8, - 0x00d0, 0x00d7, 0x00dd, 0x00dd, 0x00e4, 0x00ea, 0x00f1, 0x00f1, - 0x00f8, 0x00fe, 0x0104, 0x0104, 0x010c, 0x0114, 0x011a, 0x0120, - 0x0120, 0x0140, 0x0159, 0x015e, 0x0164, 0x016b, 0x017a, 0x017f, - 0x0187, 0x018c, 0x0194, 0x0194, 0x019d, 0x01a1, 0x01a9, 0x01a9, - 0x01a9, 0x01b0, 0x01c0, 0x01c9, 0x01c9, 0x01cf, 0x01d6, 0x01de, - // Entry 40 - 7F - 0x01f1, 0x01f8, 0x01f8, 0x01fe, 0x0205, 0x020a, 0x020a, 0x0211, - 0x0219, 0x0221, 0x0221, 0x0221, 0x0226, 0x022a, 0x023d, 0x0247, - 0x0247, 0x024f, 0x0255, 0x025e, 0x0265, 0x026a, 0x027d, 0x027d, - 0x0282, 0x028a, 0x0293, 0x0299, 0x029d, 0x02a6, 0x02af, 0x02b6, - 0x02b6, 0x02bf, 0x02c3, 0x02cc, 0x02d2, 0x02d2, 0x02d2, 0x02db, - 0x02e2, 0x02e7, 0x02ef, 0x02ef, 0x02f8, 0x0300, 0x0307, 0x0307, - 0x030c, 0x0331, 0x0336, 0x033c, 0x0344, 0x034a, 0x034a, 0x0351, - 0x0358, 0x035e, 0x0363, 0x0370, 0x0378, 0x0380, 0x0386, 0x0399, - // Entry 80 - BF - 0x03a8, 0x03b4, 0x03bb, 0x03cc, 0x03d7, 0x03dc, 0x03e4, 0x03ee, - 0x03f8, 0x0401, 0x0408, 0x040e, 0x0416, 0x041f, 0x0426, 0x042b, - 0x0431, 0x0437, 0x043e, 0x043e, 0x043e, 0x0444, 0x0456, 0x045f, - 0x0463, 0x0468, 0x0470, 0x0470, 0x0490, 0x0499, 0x04a2, 0x04ad, - 0x04b2, 0x04b8, 0x04be, 0x04c4, 0x04cb, 0x04d2, 0x04da, 0x04e1, - 0x04ed, 0x04f3, 0x0504, 0x050b, 0x0514, 0x051c, 0x0521, 0x0527, - 0x052c, 0x0530, 0x053a, 0x053f, 0x0545, 0x0549, 0x055e, 0x0563, - 0x056b, 0x0574, 0x057b, 0x0591, 0x059a, 0x05a3, 0x05d5, 0x05da, - // Entry C0 - FF - 0x05df, 0x05e7, 0x05ed, 0x05ed, 0x05f6, 0x05fd, 0x05fd, 0x0602, - 0x0608, 0x060d, 0x061f, 0x0629, 0x062f, 0x0635, 0x063d, 0x0648, - 0x0650, 0x0650, 0x0658, 0x0663, 0x066b, 0x0673, 0x067a, 0x0682, - 0x0682, 0x0696, 0x069e, 0x069e, 0x06a3, 0x06a9, 0x06a9, 0x06c2, - 0x06c7, 0x06c7, 0x06cb, 0x06d3, 0x06de, 0x06e5, 0x06f8, 0x0707, - 0x070e, 0x0713, 0x071a, 0x072c, 0x0732, 0x0739, 0x0741, 0x0748, - 0x074e, 0x074e, 0x074e, 0x0756, 0x075d, 0x0769, 0x0771, 0x078a, - 0x0793, 0x07b2, 0x07d0, 0x07d9, 0x07e0, 0x07ef, 0x07f4, 0x07f4, - // Entry 100 - 13F - 0x07fa, 0x0801, 0x080e, 0x0814, 0x081c, - }, - }, - { // ee - "Ascension ƒudomekpo nutomeAndorra nutomeUnited Arab Emirates nutomeAfgha" + - "nistan nutoméAntigua kple Barbuda nutomeAnguilla nutomeAlbania nuto" + - "meArmenia nutomeAngola nutomeAntartica nutomeArgentina nutomeAmerika" + - " Samoa nutomeAustria nutomeAustralia nutomeAruba nutomeÅland ƒudomek" + - "po nutomeAzerbaijan nutomeBosnia kple Herzergovina nutomeBarbados nu" + - "tomeBangladesh nutomeBelgium nutomeBurkina Faso nutomeBulgaria nutom" + - "eBahrain nutomeBurundi nutomeBenin nutomeSaint Barthélemy nutomeBerm" + - "uda nutomeBrunei nutomeBolivia nutomeBrazil nutomeBahamas nutomeBhut" + - "an nutomeBouvet ƒudomekpo nutomeBotswana nutomeBelarus nutomeBelize " + - "nutomeCanada nutomeKokos (Kiling) fudomekpo nutomeKongo Kinshasa nut" + - "omeTitina Afrika repɔblik nutomeKongo Brazzaville nutomeSwitzerland " + - "nutomeKote d’Ivoire nutomeKook ƒudomekpo nutomeTsile nutomeKamerun n" + - "utomeTsaina nutomeKolombia nutomeKlipaton ƒudomekpo nutomeKosta Rika" + - " nutomeKuba nutomeKape Verde nutomeKristmas ƒudomekpo nutomeSaiprus " + - "nutomeTsɛk repɔblik nutomeGermania nutomeDiego Garsia nutomeDzibuti " + - "nutomeDenmark nutomeDominika nutomeDominika repɔblik nutomeAlgeria n" + - "utomeKeuta and Melilla nutomeEkuadɔ nutomeEstonia nutomeEgypte nutom" + - "eƔetoɖoƒe Sahara nutomeEritrea nutomeSpain nutomeEtiopia nutomeEurop" + - "a Wɔɖeka nutomeFinland nutomeFidzi nutomeFalkland ƒudomekpowo nutome" + - "Mikronesia nutomeFaroe ƒudomekpowo nutomeFrance nutomeGabɔn nutomeUn" + - "ited Kingdom nutomeGrenada nutomeGeorgia nutomeFrentsi Gayana nutome" + - "Guernse nutomeGhana nutomeGibraltar nutomeGrinland nutomeGambia nuto" + - "meGuini nutomeGuadelupe nutomeEkuatorial Guini nutomeGreece nutomeAn" + - "yiehe Georgia kple Anyiehe Sandwich ƒudomekpowo nutomeGuatemala nuto" + - "meGuam nutomeGini-Bisao nutomeGuyanaduHɔng Kɔng SAR Tsaina nutomeHea" + - "rd kple Mcdonald ƒudomekpowo nutomeHondurasduKroatsia nutomeHaiti nu" + - "tomeHungari nutomeKanari ƒudomekpowo nutomeIndonesia nutomeIreland n" + - "utomeIsrael nutomeAisle of Man nutomeIndia nutomeBritaintɔwo ƒe indi" + - "a ƒudome nutomeiraqdukɔIran nutomeAiseland nutomeItalia nutomeDzɛse " + - "nutomeDzamaika nutomeYordan nutomeDzapan nutomeKenya nutomeKirgizsta" + - "n nutomeKambodia nutomeKiribati nutomeKomoros nutomeSaint Kitis kple" + - " Nevis nutomeDziehe Korea nutomeAnyiehe Korea nutomeKuwait nutomeKay" + - "man ƒudomekpowo nutomeKazakstan nutomeLaos nutomeLebanɔn nutomeSaint" + - " Lusia nutomeLitsenstein nutomeSri Lanka nutomeLiberia nutomeLɛsoto " + - "nutomeLituania nutomeLazembɔg nutomeLatvia nutomeLibya nutomeMoroko " + - "nutomeMonako nutomeMoldova nutomeMontenegro nutomeSaint Martin nutom" + - "eMadagaska nutomeMarshal ƒudomekpowo nutomeMakedonia nutomeMali nuto" + - "meMyanmar (Burma) nutomeMongolia nutomeMacau SAR Tsaina nutomeDziehe" + - " Marina ƒudomekpowo nutomeMartiniki nutomeMauritania nutomeMontserra" + - "t nutomeMalta nutomemauritiusdukɔmaldivesdukɔMalawi nutomeMexico nut" + - "omeMalaysia nutomeMozambiki nutomeNamibia nutomeNew Kaledonia nutome" + - "Niger nutomeNorfolk ƒudomekpo nutomeNigeria nutomeNicaraguadukɔNethe" + - "rlands nutomeNorway nutomeNepal nutomeNauru nutomeNiue nutomeNew Zea" + - "land nutomeOman nutomePanama nutomePeru nutomeFrentsi Pɔlinesia nuto" + - "mePapua New Gini nutomeFilipini nutomePakistan nutomePoland nutomeSa" + - "int Pierre kple Mikelɔn nutomePitkairn ƒudomekpo nutomePuerto Riko n" + - "utomePalestinia nutomePortugal nutomePalau nutomeParagua nutomeKatar" + - " nutomeOutlaying Oceania nutomeRéunion nutomeRomania nutomeRussia nu" + - "tomeRwanda nutomeSaudi Arabia nutomeSolomon ƒudomekpowo nutomeSeshɛl" + - "s nutomeSudan nutomeSweden nutomeSingapɔr nutomeSaint Helena nutomeS" + - "lovenia nutomeSvalbard kple Yan Mayen nutomeSlovakia nutomeSierra Le" + - "one nutomeSan Marino nutomeSenegal nutomeSomalia nutomeSuriname nuto" + - "meSão Tomé kple Príncipe nutomeEl Salvadɔ nutomeSiria nutomeSwazilan" + - "d nutomeTristan da Kunha nutomeTɛks kple Kaikos ƒudomekpowo nutomeTs" + - "ad nutomeAnyiehe Franseme nutomeTogo nutomeThailand nutomeTajikistan" + - " nutomeTokelau nutomeTimor-Leste nutomeTɛkmenistan nutomeTunisia nut" + - "omeTonga nutomeTɛki nutomeTrinidad kple Tobago nutomeTuvalu nutomeTa" + - "iwan nutomeTanzania nutomeUkraine nutomeUganda nutomeU.S. Minor Outl" + - "aying ƒudomekpowo nutomeUSA nutomeuruguaydukɔUzbekistan nutomeVatika" + - "ndu nutomeSaint Vincent kple Grenadine nutomeVenezuela nutomeBritain" + - "tɔwo ƒe Virgin ƒudomekpowo nutomeU.S. Vɛrgin ƒudomekpowo nutomeVietn" + - "am nutomeVanuatu nutomeWallis kple Futuna nutomeSamoa nutomeYemen nu" + - "tomeMayotte nutomeAnyiehe Africa nutomeZambia nutomeZimbabwe nutomen" + - "utome manyaxexemeAfrika nutomeDziehe Amerika nutomeAnyiehe Amerika n" + - "utomeOceania nutomeƔetoɖoƒelɔƒo Afrika nutomeTitina Amerika nutomeƔe" + - "dzeƒe Afrika nutomeDziehe Afrika nutomeTitina Afrika nutomeAnyiehelɔ" + - "ƒo Afrika nutomeAmerika nutomeDziehelɔƒo Amerika nutomeKaribbea nut" + - "omeƔedzeƒe Asia nutomeAnyiehelɔƒo Asia nutomeAnyiehe Ɣedzeƒe Afrika " + - "nutomeAnyiehelɔƒo Europa nutomeAustralia kple New Zealand nutomeMela" + - "nesia nutomeMikronesiaPɔlinesia nutomeAsia nutomeTitina Asia nutomeƔ" + - "etoɖoƒelɔƒo Asia nutomeEuropa nutomeƔedzeƒe Europa nutomeDziehelɔƒo " + - "Europa nutomeƔetoɖoƒelɔƒo Europa nutomeLatin Amerika nutome", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001b, 0x0029, 0x0044, 0x0056, 0x0073, 0x0082, 0x0090, - 0x009e, 0x00ab, 0x00bb, 0x00cb, 0x00df, 0x00ed, 0x00fd, 0x0109, - 0x0121, 0x0132, 0x0151, 0x0160, 0x0171, 0x017f, 0x0192, 0x01a1, - 0x01af, 0x01bd, 0x01c9, 0x01e1, 0x01ef, 0x01fc, 0x020a, 0x020a, - 0x0217, 0x0225, 0x0232, 0x024a, 0x0259, 0x0267, 0x0274, 0x0281, - 0x02a0, 0x02b5, 0x02d3, 0x02eb, 0x02fd, 0x0313, 0x0329, 0x0335, - 0x0343, 0x0350, 0x035f, 0x0379, 0x038a, 0x0395, 0x03a6, 0x03a6, - 0x03c0, 0x03ce, 0x03e4, 0x03f3, 0x0406, 0x0414, 0x0422, 0x0431, - // Entry 40 - 7F - 0x044a, 0x0458, 0x0470, 0x047e, 0x048c, 0x0499, 0x04b2, 0x04c0, - 0x04cc, 0x04da, 0x04f0, 0x04f0, 0x04fe, 0x050a, 0x0526, 0x0537, - 0x0550, 0x055d, 0x056a, 0x057f, 0x058d, 0x059b, 0x05b0, 0x05be, - 0x05ca, 0x05da, 0x05e9, 0x05f6, 0x0602, 0x0612, 0x0629, 0x0636, - 0x066f, 0x067f, 0x068a, 0x069b, 0x06a3, 0x06c0, 0x06e7, 0x06f1, - 0x0700, 0x070c, 0x071a, 0x0734, 0x0744, 0x0752, 0x075f, 0x0772, - 0x077e, 0x07a3, 0x07ac, 0x07b7, 0x07c6, 0x07d3, 0x07e0, 0x07ef, - 0x07fc, 0x0809, 0x0815, 0x0826, 0x0835, 0x0844, 0x0852, 0x086f, - // Entry 80 - BF - 0x0882, 0x0896, 0x08a3, 0x08bd, 0x08cd, 0x08d8, 0x08e7, 0x08f9, - 0x090b, 0x091b, 0x0929, 0x0937, 0x0946, 0x0956, 0x0963, 0x096f, - 0x097c, 0x0989, 0x0997, 0x09a8, 0x09bb, 0x09cb, 0x09e6, 0x09f6, - 0x0a01, 0x0a17, 0x0a26, 0x0a3d, 0x0a5e, 0x0a6e, 0x0a7f, 0x0a90, - 0x0a9c, 0x0aaa, 0x0ab7, 0x0ac4, 0x0ad1, 0x0ae0, 0x0af0, 0x0afe, - 0x0b12, 0x0b1e, 0x0b37, 0x0b45, 0x0b53, 0x0b65, 0x0b72, 0x0b7e, - 0x0b8a, 0x0b95, 0x0ba7, 0x0bb2, 0x0bbf, 0x0bca, 0x0be3, 0x0bf8, - 0x0c07, 0x0c16, 0x0c23, 0x0c44, 0x0c5e, 0x0c70, 0x0c81, 0x0c90, - // Entry C0 - FF - 0x0c9c, 0x0caa, 0x0cb6, 0x0cce, 0x0cdd, 0x0ceb, 0x0ceb, 0x0cf8, - 0x0d05, 0x0d18, 0x0d33, 0x0d42, 0x0d4e, 0x0d5b, 0x0d6b, 0x0d7e, - 0x0d8d, 0x0dab, 0x0dba, 0x0dcd, 0x0dde, 0x0dec, 0x0dfa, 0x0e09, - 0x0e09, 0x0e29, 0x0e3b, 0x0e3b, 0x0e47, 0x0e57, 0x0e6e, 0x0e93, - 0x0e9e, 0x0eb5, 0x0ec0, 0x0ecf, 0x0ee0, 0x0eee, 0x0f00, 0x0f13, - 0x0f21, 0x0f2d, 0x0f39, 0x0f54, 0x0f61, 0x0f6e, 0x0f7d, 0x0f8b, - 0x0f98, 0x0fc0, 0x0fc0, 0x0fca, 0x0fd6, 0x0fe7, 0x0ff7, 0x101a, - 0x102a, 0x1055, 0x1075, 0x1083, 0x1091, 0x10aa, 0x10b6, 0x10b6, - // Entry 100 - 13F - 0x10c2, 0x10d0, 0x10e5, 0x10f2, 0x1101, 0x110d, 0x1113, 0x1120, - 0x1135, 0x114b, 0x1159, 0x1178, 0x118d, 0x11a4, 0x11b8, 0x11cc, - 0x11e7, 0x11f5, 0x1210, 0x121f, 0x1234, 0x124d, 0x126c, 0x1287, - 0x12a8, 0x12b8, 0x12c2, 0x12d3, 0x12de, 0x12f0, 0x130d, 0x131a, - 0x1331, 0x134b, 0x136a, 0x137e, - }, - }, - { // el - elRegionStr, - elRegionIdx, - }, - { // en - enRegionStr, - enRegionIdx, - }, - {}, // en-AU - {}, // en-IN - {}, // en-NZ - { // eo - "AndoroUnuiĝintaj Arabaj EmirlandojAfganujoAntigvo-BarbudoAngviloAlbanujo" + - "ArmenujoAngoloAntarktoArgentinoAŭstrujoAŭstralioAruboAzerbajĝanoBosn" + - "io-HercegovinoBarbadoBangladeŝoBelgujoBurkinoBulgarujoBarejnoBurundo" + - "BeninoBermudojBrunejoBolivioBraziloBahamojButanoBocvanoBelorusujoBel" + - "izoKanadoCentr-Afrika RespublikoKongoloSvisujoEbur-BordoKukinsulojĈi" + - "lioKamerunoĈinujoKolombioKostarikoKuboKabo-VerdoKiproĈeĥujoGermanujo" + - "ĜibutioDanujoDominikoDomingoAlĝerioEkvadoroEstonujoEgiptoOkcidenta " + - "SaharoEritreoHispanujoEtiopujoFinnlandoFiĝojMikronezioFeroojFrancujo" + - "GabonoUnuiĝinta ReĝlandoGrenadoKartvelujoFranca GvianoGanaoĜibraltar" + - "oGronlandoGambioGvineoGvadelupoEkvatora GvineoGrekujoSud-Georgio kaj" + - " Sud-SandviĉinsulojGvatemaloGvamoGvineo-BisaŭoGujanoHerda kaj Makdon" + - "aldaj InsulojHonduroKroatujoHaitioHungarujoIndonezioIrlandoIsraeloHi" + - "ndujoBrita Hindoceana TeritorioIrakoIranoIslandoItalujoJamajkoJordan" + - "ioJapanujoKenjoKirgizistanoKamboĝoKiribatoKomorojSent-Kristofo kaj N" + - "evisoNord-KoreoSud-KoreoKuvajtoKejmanojKazaĥstanoLaosoLibanoSent-Luc" + - "ioLiĥtenŝtejnoSri-LankoLiberioLesotoLitovujoLuksemburgoLatvujoLibioM" + - "arokoMonakoMoldavujoMadagaskaroMarŝalojMakedonujoMalioMjanmaoMongolu" + - "joNord-MarianojMartinikoMaŭritanujoMaltoMaŭricioMaldivojMalavioMeksi" + - "koMalajzioMozambikoNamibioNov-KaledonioNiĝeroNorfolkinsuloNiĝerioNik" + - "aragvoNederlandoNorvegujoNepaloNauroNiuoNov-ZelandoOmanoPanamoPeruoF" + - "ranca PolinezioPapuo-Nov-GvineoFilipinojPakistanoPollandoSent-Piero " + - "kaj MikelonoPitkarna InsuloPuerto-RikoPortugalujoBelaŭoParagvajoKata" + - "roReunioRumanujoRusujoRuandoSaŭda ArabujoSalomonojSejŝelojSudanoSved" + - "ujoSingapuroSent-HelenoSlovenujoSvalbardo kaj Jan-Majen-insuloSlovak" + - "ujoSiera-LeonoSan-MarinoSenegaloSomalujoSurinamoSao-Tomeo kaj Princi" + - "peoSalvadoroSirioSvazilandoĈadoTogoloTajlandoTaĝikujoTurkmenujoTuniz" + - "ioTongoTurkujoTrinidado kaj TobagoTuvaloTajvanoTanzanioUkrajnoUgando" + - "Usonaj malgrandaj insulojUsonoUrugvajoUzbekujoVatikanoSent-Vincento " + - "kaj la GrenadinojVenezueloBritaj VirgulininsulojUsonaj Virgulininsul" + - "ojVjetnamoVanuatuoValiso kaj FutunoSamooJemenoMajotoSud-AfrikoZambio" + - "Zimbabvo", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0023, 0x002b, 0x003a, 0x0041, 0x0049, - 0x0051, 0x0057, 0x005f, 0x0068, 0x0068, 0x0071, 0x007b, 0x0080, - 0x0080, 0x008c, 0x009e, 0x00a5, 0x00b0, 0x00b7, 0x00be, 0x00c7, - 0x00ce, 0x00d5, 0x00db, 0x00db, 0x00e3, 0x00ea, 0x00f1, 0x00f1, - 0x00f8, 0x00ff, 0x0105, 0x0105, 0x010c, 0x0116, 0x011c, 0x0122, - 0x0122, 0x0122, 0x0139, 0x0140, 0x0147, 0x0151, 0x015b, 0x0161, - 0x0169, 0x0170, 0x0178, 0x0178, 0x0181, 0x0185, 0x018f, 0x018f, - 0x018f, 0x0194, 0x019c, 0x01a5, 0x01a5, 0x01ad, 0x01b3, 0x01bb, - // Entry 40 - 7F - 0x01c2, 0x01ca, 0x01ca, 0x01d2, 0x01da, 0x01e0, 0x01f0, 0x01f7, - 0x0200, 0x0208, 0x0208, 0x0208, 0x0211, 0x0217, 0x0217, 0x0221, - 0x0227, 0x022f, 0x0235, 0x0249, 0x0250, 0x025a, 0x0267, 0x0267, - 0x026c, 0x0277, 0x0280, 0x0286, 0x028c, 0x0295, 0x02a4, 0x02ab, - 0x02ce, 0x02d7, 0x02dc, 0x02ea, 0x02f0, 0x02f0, 0x030d, 0x0314, - 0x031c, 0x0322, 0x032b, 0x032b, 0x0334, 0x033b, 0x0342, 0x0342, - 0x0349, 0x0363, 0x0368, 0x036d, 0x0374, 0x037b, 0x037b, 0x0382, - 0x038a, 0x0392, 0x0397, 0x03a3, 0x03ab, 0x03b3, 0x03ba, 0x03d2, - // Entry 80 - BF - 0x03dc, 0x03e5, 0x03ec, 0x03f4, 0x03ff, 0x0404, 0x040a, 0x0414, - 0x0422, 0x042b, 0x0432, 0x0438, 0x0440, 0x044b, 0x0452, 0x0457, - 0x045d, 0x0463, 0x046c, 0x046c, 0x046c, 0x0477, 0x0480, 0x048a, - 0x048f, 0x0496, 0x049f, 0x049f, 0x04ac, 0x04b5, 0x04c1, 0x04c1, - 0x04c6, 0x04cf, 0x04d7, 0x04de, 0x04e5, 0x04ed, 0x04f6, 0x04fd, - 0x050a, 0x0511, 0x051e, 0x0526, 0x052f, 0x0539, 0x0542, 0x0548, - 0x054d, 0x0551, 0x055c, 0x0561, 0x0567, 0x056c, 0x057c, 0x058c, - 0x0595, 0x059e, 0x05a6, 0x05bd, 0x05cc, 0x05d7, 0x05d7, 0x05e2, - // Entry C0 - FF - 0x05e9, 0x05f2, 0x05f8, 0x05f8, 0x05fe, 0x0606, 0x0606, 0x060c, - 0x0612, 0x0620, 0x0629, 0x0632, 0x0638, 0x063f, 0x0648, 0x0653, - 0x065c, 0x067a, 0x0683, 0x068e, 0x0698, 0x06a0, 0x06a8, 0x06b0, - 0x06b0, 0x06c7, 0x06d0, 0x06d0, 0x06d5, 0x06df, 0x06df, 0x06df, - 0x06e4, 0x06e4, 0x06ea, 0x06f2, 0x06fb, 0x06fb, 0x06fb, 0x0705, - 0x070c, 0x0711, 0x0718, 0x072c, 0x0732, 0x0739, 0x0741, 0x0748, - 0x074e, 0x0767, 0x0767, 0x076c, 0x0774, 0x077c, 0x0784, 0x07a3, - 0x07ac, 0x07c2, 0x07d8, 0x07e0, 0x07e8, 0x07f9, 0x07fe, 0x07fe, - // Entry 100 - 13F - 0x0804, 0x080a, 0x0814, 0x081a, 0x0822, - }, - }, - { // es - esRegionStr, - esRegionIdx, - }, - { // es-419 - es419RegionStr, - es419RegionIdx, - }, - { // es-AR - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-BO - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-CL - "Bosnia y HerzegovinaSahara OccidentalTristán de AcuñaTimor-LesteIslas me" + - "nores alejadas de EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - // Entry 80 - BF - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - // Entry C0 - FF - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0037, 0x0037, - 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0063, - }, - }, - { // es-CO - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-CR - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-DO - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-EC - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-GT - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-HN - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-MX - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas Ultramarinas Menore" + - "s de Estados UnidosÁfrica OccidentalÁfrica OrientalÁfrica del NorteÁ" + - "frica CentralÁfrica del SurAsia OrientalAsia del SurSudeste Asiático" + - "Europa del SurAsia CentralAsia OccidentalEuropa OrientalEuropa del N" + - "orteEuropa Occidental", - []uint16{ // 291 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, - 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, - // Entry 100 - 13F - 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, - 0x005d, 0x005d, 0x005d, 0x006f, 0x006f, 0x007f, 0x0090, 0x009f, - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00bb, 0x00c7, 0x00d8, 0x00e6, - 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00f2, 0x0101, 0x0101, - 0x0110, 0x0120, 0x0131, - }, - }, - { // es-NI - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-PA - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-PE - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-PR - "Islas menores alejadas de EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0021, - }, - }, - { // es-PY - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // es-SV - "Islas menores alejadas de EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0021, - }, - }, - { // es-US - "Islas menores alejadas de EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0021, - }, - }, - { // es-VE - "Bosnia y HerzegovinaTristán de AcuñaTimor-LesteIslas menores alejadas de" + - " EE. UU.", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 40 - 7F - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry 80 - BF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - // Entry C0 - FF - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0031, 0x0031, - 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x0031, 0x0052, - }, - }, - { // et - etRegionStr, - etRegionIdx, - }, - { // eu - "Ascension uharteaAndorraArabiar Emirerri BatuakAfganistanAntigua eta Bar" + - "budaAngilaAlbaniaArmeniaAngolaAntartikaArgentinaAmerikar SamoaAustri" + - "aAustraliaArubaAland uharteakAzerbaijanBosnia-HerzegovinaBarbadosBan" + - "gladeshBelgikaBurkina FasoBulgariaBahrainBurundiBeninSaint Barthélem" + - "yBermudaBruneiBoliviaKaribeko HerbehereakBrasilBahamakBhutanBouvet u" + - "harteaBotswanaBielorrusiaBelizeKanadaCocos uharteakKongoko Errepubli" + - "ka DemokratikoaAfrika Erdiko ErrepublikaKongo (Brazzaville)SuitzaBol" + - "i KostaCook uharteakTxileKamerunTxinaKolonbiaClipperton uharteaCosta" + - " RicaKubaCabo VerdeCuraçaoChristmas uharteaZipreTxekiaAlemaniaDiego " + - "GarciaDjibutiDanimarkaDominikaDominikar ErrepublikaAljeriaCeuta eta " + - "MelillaEkuadorEstoniaEgiptoMendebaldeko SaharaEritreaEspainiaEtiopia" + - "Europar BatasunaFinlandiaFijiMalvinakMikronesiaFaroe uharteakFrantzi" + - "aGabonErresuma BatuaGrenadaGeorgiaGuyana FrantsesaGuerneseyGhanaGibr" + - "altarGroenlandiaGambiaGineaGuadalupeEkuatore GineaGreziaHegoaldeko G" + - "eorgia eta Hegoaldeko Sandwich uharteakGuatemalaGuamGinea-BissauGuya" + - "naHong Kong AEB TxinaHeard eta McDonald uharteakHondurasKroaziaHaiti" + - "HungariaKanariakIndonesiaIrlandaIsraelMan uharteaIndiaIndiako Ozeano" + - "ko lurralde britainiarraIrakIranIslandiaItaliaJerseyJamaikaJordaniaJ" + - "aponiaKenyaKirgizistanKanbodiaKiribatiKomoreakSaint Kitts eta NevisI" + - "par KoreaHego KoreaKuwaitKaiman uharteakKazakhstanLaosLibanoSanta Lu" + - "ziaLiechtensteinSri LankaLiberiaLesothoLituaniaLuxenburgoLetoniaLibi" + - "aMarokoMonakoMoldaviaMontenegroSan MartinMadagaskarMarshall uharteak" + - "MazedoniaMaliMyanmar (Birmania)MongoliaMacau AEB TxinaIparraldeko Ma" + - "riana uharteakMartinikaMauritaniaMontserratMaltaMaurizioMaldivakMala" + - "wiMexikoMalaysiaMozambikeNamibiaKaledonia BerriaNigerNorfolk uhartea" + - "NigeriaNikaraguaHerbehereakNorvegiaNepalNauruNiueZeelanda BerriaOman" + - "PanamaPeruPolinesia FrantsesaPapua Ginea BerriaFilipinakPakistanPolo" + - "niaSaint-Pierre eta MikelunePitcairn uharteakPuerto RicoPalestinako " + - "LurraldeakPortugalPalauParaguaiQatarMugaz kanpoko OzeaniaReunionErru" + - "maniaSerbiaErrusiaRuandaSaudi ArabiaSalomon uharteakSeychelleakSudan" + - "SuediaSingapurSanta HelenaEsloveniaSvalbard eta Jan Mayen uharteakEs" + - "lovakiaSierra LeonaSan MarinoSenegalSomaliaSurinamHego SudanSao Tome" + - " eta PrincipeEl SalvadorSint MaartenSiriaSwazilandiaTristan da Cunha" + - "Turk eta Caico uharteakTxadHegoaldeko lurralde frantsesakTogoThailan" + - "diaTajikistanTokelauEkialdeko TimorTurkmenistanTunisiaTongaTurkiaTri" + - "nidad eta TobagoTuvaluTaiwanTanzaniaUkrainaUgandaAmeriketako Estatu " + - "Batuetako Kanpoaldeko Uharte TxikiakAmeriketako Estatu BatuakUruguai" + - "UzbekistanVatikano HiriaSaint Vincent eta GrenadinakVenezuelaBirjina" + - " uharte britainiarrakBirjina uharte amerikarrakVietnamVanuatuWallis " + - "eta FutunaSamoaKosovoYemenMayotteHegoafrikaZambiaZimbabweEskualde ez" + - "ezagunaMunduaAfrikaIpar AmerikaHego AmerikaOzeaniaAfrika mendebaldea" + - "Erdialdeko AmerikaAfrika ekialdeaAfrika iparraldeaErdialdeko AfrikaA" + - "frika hegoaldeaAmerikaAmerika iparraldeaKaribeaAsia ekialdeaAsia heg" + - "oaldeaAsia hego-ekialdeaEuropa hegoaldeaAustralasiaMelanesiaMikrones" + - "ia eskualdeaPolinesiaAsiaAsia erdialdeaAsia mendebaldeaEuropaEuropa " + - "ekialdeaEuropa iparraldeaEuropa mendebaldeaLatinoamerika", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0011, 0x0018, 0x002f, 0x0039, 0x004c, 0x0052, 0x0059, - 0x0060, 0x0066, 0x006f, 0x0078, 0x0086, 0x008d, 0x0096, 0x009b, - 0x00a9, 0x00b3, 0x00c5, 0x00cd, 0x00d7, 0x00de, 0x00ea, 0x00f2, - 0x00f9, 0x0100, 0x0105, 0x0116, 0x011d, 0x0123, 0x012a, 0x013e, - 0x0144, 0x014b, 0x0151, 0x015f, 0x0167, 0x0172, 0x0178, 0x017e, - 0x018c, 0x01ac, 0x01c5, 0x01d8, 0x01de, 0x01e8, 0x01f5, 0x01fa, - 0x0201, 0x0206, 0x020e, 0x0220, 0x022a, 0x022e, 0x0238, 0x0240, - 0x0251, 0x0256, 0x025c, 0x0264, 0x0270, 0x0277, 0x0280, 0x0288, - // Entry 40 - 7F - 0x029d, 0x02a4, 0x02b5, 0x02bc, 0x02c3, 0x02c9, 0x02dc, 0x02e3, - 0x02eb, 0x02f2, 0x0302, 0x0302, 0x030b, 0x030f, 0x0317, 0x0321, - 0x032f, 0x0337, 0x033c, 0x034a, 0x0351, 0x0358, 0x0368, 0x0371, - 0x0376, 0x037f, 0x038a, 0x0390, 0x0395, 0x039e, 0x03ac, 0x03b2, - 0x03e5, 0x03ee, 0x03f2, 0x03fe, 0x0404, 0x0417, 0x0432, 0x043a, - 0x0441, 0x0446, 0x044e, 0x0456, 0x045f, 0x0466, 0x046c, 0x0477, - 0x047c, 0x04a2, 0x04a6, 0x04aa, 0x04b2, 0x04b8, 0x04be, 0x04c5, - 0x04cd, 0x04d4, 0x04d9, 0x04e4, 0x04ec, 0x04f4, 0x04fc, 0x0511, - // Entry 80 - BF - 0x051b, 0x0525, 0x052b, 0x053a, 0x0544, 0x0548, 0x054e, 0x0559, - 0x0566, 0x056f, 0x0576, 0x057d, 0x0585, 0x058f, 0x0596, 0x059b, - 0x05a1, 0x05a7, 0x05af, 0x05b9, 0x05c3, 0x05cd, 0x05de, 0x05e7, - 0x05eb, 0x05fd, 0x0605, 0x0614, 0x0630, 0x0639, 0x0643, 0x064d, - 0x0652, 0x065a, 0x0662, 0x0668, 0x066e, 0x0676, 0x067f, 0x0686, - 0x0696, 0x069b, 0x06aa, 0x06b1, 0x06ba, 0x06c5, 0x06cd, 0x06d2, - 0x06d7, 0x06db, 0x06ea, 0x06ee, 0x06f4, 0x06f8, 0x070b, 0x071d, - 0x0726, 0x072e, 0x0735, 0x074e, 0x075f, 0x076a, 0x0780, 0x0788, - // Entry C0 - FF - 0x078d, 0x0795, 0x079a, 0x07af, 0x07b6, 0x07bf, 0x07c5, 0x07cc, - 0x07d2, 0x07de, 0x07ee, 0x07f9, 0x07fe, 0x0804, 0x080c, 0x0818, - 0x0821, 0x0840, 0x0849, 0x0855, 0x085f, 0x0866, 0x086d, 0x0874, - 0x087e, 0x0893, 0x089e, 0x08aa, 0x08af, 0x08ba, 0x08ca, 0x08e1, - 0x08e5, 0x0903, 0x0907, 0x0911, 0x091b, 0x0922, 0x0931, 0x093d, - 0x0944, 0x0949, 0x094f, 0x0962, 0x0968, 0x096e, 0x0976, 0x097d, - 0x0983, 0x09ba, 0x09ba, 0x09d3, 0x09da, 0x09e4, 0x09f2, 0x0a0e, - 0x0a17, 0x0a33, 0x0a4d, 0x0a54, 0x0a5b, 0x0a6c, 0x0a71, 0x0a77, - // Entry 100 - 13F - 0x0a7c, 0x0a83, 0x0a8d, 0x0a93, 0x0a9b, 0x0aad, 0x0ab3, 0x0ab9, - 0x0ac5, 0x0ad1, 0x0ad8, 0x0aea, 0x0afc, 0x0b0b, 0x0b1c, 0x0b2d, - 0x0b3d, 0x0b44, 0x0b56, 0x0b5d, 0x0b6a, 0x0b78, 0x0b8a, 0x0b9a, - 0x0ba5, 0x0bae, 0x0bc2, 0x0bcb, 0x0bcf, 0x0bdd, 0x0bed, 0x0bf3, - 0x0c02, 0x0c13, 0x0c25, 0x0c32, - }, - }, - { // ewo - "AndórBemirá yá Arábə uníAfəganisətánAntígwa ai BarəbúdaAngíyəAləbániaArə" + - "méniaAngoláArəhenətínaBəsamóa yá Amə́rəkaOsətəlíaOsətəlalíArúbaAzɛrə" + - "baidzáŋBosəní ai ɛrəzegovínBarəbádBangaladɛ́sBɛləhígBuləkiná FasóBul" + - "əgaríBahərɛ́nBurundíBəníŋBɛrəmúdBulunéBolíviaBəlazílBahámasButáŋBot" + - "swanáBəlarúsBəlískanadáǹnam Kongó Demokəlatígǹnam Zǎŋ AfirikáKongóSu" + - "ísKód Divɔ́rMinlán Mí kúgTsilíKamərúnTsáinaKolɔmbíKosta RíkaKubáMin" + - "lán Mí Káb VɛrSipəlúsǸnam Tsɛ́gNdzámanDzibutíDanəmárəgDómənikaRépubl" + - "ique dominicaineAləyériaEkwatórEsetoníEhíbətɛnElitəléKpənyáEtiopíFin" + - "əlánFidzíMinlán Mi FóləkəlanMikoronésiaFulɛnsíGabóŋǸnam EngəlisGələ" + - "nádəHorə́yiaGuyán yá FulɛnsíGanáYiləbalatárGoelánGambíGinéGuadəlúbGi" + - "né EkwatóGəlɛ́sGuatemaláGuámGiné BisaóGuyánOndurásKəlowásiaAitíOngir" + - "íɛndonésiaIrəlándəIsəraɛ́lɛ́ndəǹnam ɛngəlís yá Máŋ mə́ ɛ́ndəIrágIrá" + - "nIsəlándəItáliɛnHamaíkaHorədaníHapɔ́nKeniáKirigisətánkambodíaKiribat" + - "íKomɔ́rǸfúfúb-Kilisətóv-ai-NevisKoré yá NórKoré yá SúdKowɛ́dMinlán " + - "Mí KalimáŋKazakətáŋLaósLibáŋǸfúfúb-LúsiaLísə́sə́táinSəri LaŋkáLibéri" + - "aLəsotóLituaníLukəzambúdLətoníLibíMarɔ́gMɔnakóMolədavíMadagasəkárəMi" + - "nlán Mí MaresálMasedóniaMalíMianəmárMɔngɔ́liaMinlán Mi Marián yá Nór" + - "MarətinígMoritaníMɔ́ntserádMálətəMorísMalədívəMalawíMɛkəsígMalɛ́ziaM" + - "ozambígNamibíǸkpámɛn KaledóniaNihɛ́rMinlán Nɔrəfɔ́ləkəNihériaNikarág" + - "uaPɛíbáNɔrəvɛ́sNepálNaurúNiuéǸkpámɛn ZeláŋOmánPanamáPerúPolinesí yá " + - "FulɛnsíPapwazi yá Ǹkpámɛ́n GinéFilipínPakisətánfólisǸfúfúb-Píɛr-ai-M" + - "ikəlɔ́ŋPítə́kɛ́rɛnəPwɛrəto RíkoǸnam Palɛsətínfɔrətugɛ́sPalauParaguéK" + - "atárReuniɔ́ŋRumaníRúsianRuwandáArabí SaudíMinlán Mí Solomɔ́nSɛsɛ́lSu" + - "dáŋSuwɛ́dSingapúrǸfúfúb-Ɛlɛ́naSəlovéniaSəlovakíSierá-leónəǸfúfúb Mar" + - "ínoSenegálSomáliaSurinámSaó Tomé ai PəlinəsípeSaləvadórSiríSwazilán" + - "dəMinlán Mí túrə́g-ai-KaígTsádTogóTailánTadzikisətáŋTokelóTimôrTurək" + - "əmənisətáŋTunisíTɔngáTurəkíTəlinité-ai-TobágoTuvalúTaiwánTaŋəzaníUk" + - "ərɛ́nUgandáǸnam AmɛrəkəUruguéUzubekisətánǸnam VatikánǸfúfúb-Vɛngəsá" + - "ŋ-ai-Bə GələnadínVenezuélańnam Minlán ɛ́ngəlísMinlán Mi AmɛrəkəViɛd" + - "ənámVanuátuWalís-ai-FutúnaSamoáYemɛ́nMayɔ́dAfiríka yá SúdZambíZimba" + - "bwé", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x001e, 0x002d, 0x0043, 0x004b, 0x0055, - 0x005f, 0x0066, 0x0066, 0x0074, 0x008d, 0x0098, 0x00a4, 0x00aa, - 0x00aa, 0x00ba, 0x00d3, 0x00dc, 0x00e9, 0x00f3, 0x0103, 0x010d, - 0x0118, 0x0120, 0x0128, 0x0128, 0x0132, 0x0139, 0x0141, 0x0141, - 0x014a, 0x0152, 0x0159, 0x0159, 0x0162, 0x016b, 0x0172, 0x0179, - 0x0179, 0x0193, 0x01a7, 0x01ad, 0x01b2, 0x01bf, 0x01cf, 0x01d5, - 0x01de, 0x01e5, 0x01ee, 0x01ee, 0x01f9, 0x01fe, 0x0213, 0x0213, - 0x0213, 0x021c, 0x0229, 0x0231, 0x0231, 0x0239, 0x0245, 0x024f, - // Entry 40 - 7F - 0x0266, 0x0270, 0x0270, 0x0278, 0x0280, 0x028b, 0x028b, 0x0294, - 0x029c, 0x02a3, 0x02a3, 0x02a3, 0x02ac, 0x02b2, 0x02c9, 0x02d5, - 0x02d5, 0x02de, 0x02e5, 0x02f3, 0x02ff, 0x0309, 0x031d, 0x031d, - 0x0322, 0x032f, 0x0336, 0x033c, 0x0341, 0x034b, 0x0358, 0x0361, - 0x0361, 0x036b, 0x0370, 0x037c, 0x0382, 0x0382, 0x0382, 0x038a, - 0x0395, 0x039a, 0x03a1, 0x03a1, 0x03ac, 0x03b7, 0x03c2, 0x03c2, - 0x03ca, 0x03f3, 0x03f8, 0x03fd, 0x0408, 0x0411, 0x0411, 0x0419, - 0x0423, 0x042b, 0x0431, 0x043e, 0x0447, 0x0450, 0x0458, 0x0476, - // Entry 80 - BF - 0x0484, 0x0492, 0x049a, 0x04af, 0x04bb, 0x04c0, 0x04c7, 0x04d7, - 0x04e9, 0x04f6, 0x04fe, 0x0506, 0x050e, 0x051a, 0x0522, 0x0527, - 0x052f, 0x0537, 0x0541, 0x0541, 0x0541, 0x0550, 0x0564, 0x056e, - 0x0573, 0x057d, 0x0589, 0x0589, 0x05a4, 0x05af, 0x05b8, 0x05c5, - 0x05ce, 0x05d4, 0x05df, 0x05e6, 0x05f0, 0x05fa, 0x0603, 0x060a, - 0x061f, 0x0627, 0x0640, 0x0648, 0x0652, 0x065a, 0x0666, 0x066c, - 0x0672, 0x0677, 0x0689, 0x068e, 0x0695, 0x069a, 0x06b1, 0x06cf, - 0x06d7, 0x06e2, 0x06e8, 0x0708, 0x071b, 0x072a, 0x073c, 0x074a, - // Entry C0 - FF - 0x074f, 0x0757, 0x075d, 0x075d, 0x0768, 0x076f, 0x076f, 0x0776, - 0x077e, 0x078b, 0x07a1, 0x07aa, 0x07b1, 0x07b9, 0x07c2, 0x07d5, - 0x07e0, 0x07e0, 0x07ea, 0x07f8, 0x0809, 0x0811, 0x0819, 0x0821, - 0x0821, 0x083c, 0x0847, 0x0847, 0x084c, 0x0858, 0x0858, 0x0876, - 0x087b, 0x087b, 0x0880, 0x0887, 0x0896, 0x089d, 0x08a3, 0x08b8, - 0x08bf, 0x08c6, 0x08ce, 0x08e3, 0x08ea, 0x08f1, 0x08fc, 0x0906, - 0x090d, 0x090d, 0x090d, 0x091d, 0x0924, 0x0932, 0x0940, 0x096a, - 0x0974, 0x098e, 0x09a3, 0x09ae, 0x09b6, 0x09c7, 0x09cd, 0x09cd, - // Entry 100 - 13F - 0x09d5, 0x09dd, 0x09ee, 0x09f4, 0x09fd, - }, - }, - { // fa - faRegionStr, - faRegionIdx, - }, - { // fa-AF - "اندوراانتیگوا و باربوداالبانیاانگولاانترکتیکاارجنتاینآسترالیابوسنیا و هر" + - "زه\u200cگوینابنگله\u200cدیشبلجیمبلغاریابرونیبولیویابرازیلبهاماسروسی" + - "هٔ سفیدکانگو - کینشاساکانگو - برازویلسویسچلیکولمبیاکاستریکاکیوبادنم" + - "ارکاستونیااریتریاهسپانیهایتوپیافنلندمیکرونزیاگریناداگاناگینیاگینیا " + - "استواییگواتیمالاگینیا بیسائوگیاناهاندوراسکروشیاهایتیاندونیزیاآیرلند" + - "آیسلندجاپانکینیاقرغزستانکمپوچیاکوریای شمالیکوریای جنوبیسریلانکالیسو" + - "تولتوانیالاتویالیبیامادغاسکرمنگولیاموریتانیامالتامکسیکومالیزیاموزمب" + - "یقنایجرنیجریانیکاراگواهالندناروینیپالزیلاند جدیدپانامهپیروپاپوا نیو" + - " گینیاپولندپرتگالپاراگوایرومانیاروآنداسویدنسینگاپورسلونیاسلواکیاسیرا" + - "لیونسینیگالسومالیهالسلوادورتاجکستاناکراینیوگاندایوروگوایسنت وینسنت " + - "و گرنادین\u200cهاونزویلاکوسوازیمبابوی", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000c, 0x000c, 0x000c, 0x002c, 0x002c, 0x003a, - 0x003a, 0x0046, 0x0058, 0x0068, 0x0068, 0x0068, 0x0078, 0x0078, - 0x0078, 0x0078, 0x009d, 0x009d, 0x00b0, 0x00ba, 0x00ba, 0x00c8, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00d2, 0x00e0, 0x00e0, - 0x00ec, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x010d, 0x010d, 0x010d, - 0x010d, 0x0128, 0x0128, 0x0143, 0x014b, 0x014b, 0x014b, 0x0151, - 0x0151, 0x0151, 0x015f, 0x015f, 0x016f, 0x0179, 0x0179, 0x0179, - 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0185, 0x0185, - // Entry 40 - 7F - 0x0185, 0x0185, 0x0185, 0x0185, 0x0193, 0x0193, 0x0193, 0x01a1, - 0x01af, 0x01bd, 0x01bd, 0x01bd, 0x01c7, 0x01c7, 0x01c7, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e7, 0x01e7, 0x01e7, 0x01e7, - 0x01ef, 0x01ef, 0x01ef, 0x01ef, 0x01f9, 0x01f9, 0x0212, 0x0212, - 0x0212, 0x0224, 0x0224, 0x023b, 0x0245, 0x0245, 0x0245, 0x0255, - 0x0261, 0x026b, 0x026b, 0x026b, 0x027d, 0x0289, 0x0289, 0x0289, - 0x0289, 0x0289, 0x0289, 0x0289, 0x0295, 0x0295, 0x0295, 0x0295, - 0x0295, 0x029f, 0x02a9, 0x02b9, 0x02c7, 0x02c7, 0x02c7, 0x02c7, - // Entry 80 - BF - 0x02de, 0x02f5, 0x02f5, 0x02f5, 0x02f5, 0x02f5, 0x02f5, 0x02f5, - 0x02f5, 0x0305, 0x0305, 0x0311, 0x031f, 0x031f, 0x032b, 0x0335, - 0x0335, 0x0335, 0x0335, 0x0335, 0x0335, 0x0345, 0x0345, 0x0345, - 0x0345, 0x0345, 0x0353, 0x0353, 0x0353, 0x0353, 0x0365, 0x0365, - 0x036f, 0x036f, 0x036f, 0x036f, 0x037b, 0x0389, 0x0397, 0x0397, - 0x0397, 0x03a1, 0x03a1, 0x03ad, 0x03bf, 0x03c9, 0x03d3, 0x03dd, - 0x03dd, 0x03dd, 0x03f2, 0x03f2, 0x03fe, 0x0406, 0x0406, 0x0422, - 0x0422, 0x0422, 0x042c, 0x042c, 0x042c, 0x042c, 0x042c, 0x0438, - // Entry C0 - FF - 0x0438, 0x0448, 0x0448, 0x0448, 0x0448, 0x0456, 0x0456, 0x0456, - 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x046c, 0x047c, 0x047c, - 0x0488, 0x0488, 0x0496, 0x04a6, 0x04a6, 0x04b4, 0x04c2, 0x04c2, - 0x04c2, 0x04c2, 0x04d4, 0x04d4, 0x04d4, 0x04d4, 0x04d4, 0x04d4, - 0x04d4, 0x04d4, 0x04d4, 0x04d4, 0x04e4, 0x04e4, 0x04e4, 0x04e4, - 0x04e4, 0x04e4, 0x04e4, 0x04e4, 0x04e4, 0x04e4, 0x04e4, 0x04f0, - 0x04fe, 0x04fe, 0x04fe, 0x04fe, 0x050e, 0x050e, 0x050e, 0x053a, - 0x0548, 0x0548, 0x0548, 0x0548, 0x0548, 0x0548, 0x0548, 0x0552, - // Entry 100 - 13F - 0x0552, 0x0552, 0x0552, 0x0552, 0x0562, - }, - }, - { // ff - "AnndooraEmiraat Araab DenntuɗeAfganistaanAntiguwaa e BarbudaaAnngiyaaAlb" + - "aniiArmeniiAnngolaaArjantiinSamowa AmerikOtiriisOstaraaliiAruubaAjer" + - "bayjaanBosnii HersegowiinBarbadoosBanglaadeesBeljikBurkibaa FaasoBul" + - "gariiBahreynBurunndiBeneeBermudaaBurnaayBoliwiiBeresiilBahamaasButaa" + - "nBotswaanaBelaruusBeliiseKanadaaNdenndaandi Demokaraasiire KonngoNde" + - "nndaandi SantarafrikKonngoSuwiisKodduwaarDuuɗe KuukCiliiKameruunSiin" + - "KolombiyaKosta RikaaKubaaDuuɗe Kap WeerSiiparNdenndaandi CekAlmaañJi" + - "butiiDanmarkDominikaNdenndanndi DominikaAlaseriEkuwatoorEstoniEjiptE" + - "ritereeEspaañEcoppiFenlandFijjiDuuɗe FalklandMikoronesiiFarayseGaboo" + - "Laamateeri RentundiGarnaadJeorgiiGiyaan FarayseGanaaJibraltaarGorwen" + - "dlandGammbiGineGwaadalupGinee EkuwaatoriyaalGereesGwaatemalaaGuwamGi" + - "ne-BisaawoGiyaanOnnduraasKorwasiiHaytiiOnngiriEnndonesiiIrlanndaIsra" + - "a’iilaEnndoKeeriindi britaani to maayo enndoIraakIraanIslanndaItaliJ" + - "amaykaJordaniSapooKeñaaKirgistaanKambodsoKiribariKomoorSent Kits e N" + - "ewisKoree RewoKoree WorgoKuweytiDuuɗe KaymaaKasakstaanLawoosLibaaSen" + - "t LusiyaaLincenstaynSiri LankaLiberiyaaLesotoLituaaniiLiksembuurLeto" + - "niiLibiMarukMonaakooMoldawiiMadagaskaarDuuɗe MarsaalMeceduwaanMaaliM" + - "iyamaarMonngoliiDuuɗe Mariyaana RewoMartinikMuritaniMonseraatMalteMo" + - "riisMaldiiweMalaawiMeksikMalesiiMosammbikNamibiiNuwel KaledoniiNijee" + - "rDuuɗe NorfolkNijeriyaaNikaraguwaaNederlanndaNorweesNepaalNawuruNiuw" + - "eNuwel SelanndaOmaanPanamaaPeruPolinesii FaraysePapuwaa Nuwel GineFi" + - "lipiinPakistaanPoloñSee Piyeer e MikelooPitkernPorto RikooPalestiin " + - "Sisjordani e GaasaaPurtugaalPalawuParaguwaayKataarRewiñooRumaniiRiis" + - "iiRuwanndaaArabii SawditDuuɗe SolomonSeyselSudaanSuweedSinngapuurSen" + - "t HelenSloweniiSlowakiiSeraa liyonSee MareeSenegaalSomaliiSurinaamSa" + - "wo Tome e PerensipeEl SalwadorSiriiSwaasilanndaDuuɗe Turke e Keikoos" + - "CaadTogooTaylanndaTajikistaanTokelaawTimoor FuɗnaangeTurkmenistaanTu" + - "nisiiTonngaaTurkiiTirnidaad e TobaagoTuwaluuTaywaanTansaniiUkereenUn" + - "ganndaaDowlaaji Dentuɗi AmerikUruguwaayUsbekistaanDowla WaticaanSee " + - "Weesaa e GarnadiinWenesuwelaaduuɗe kecce britaniiDuuɗe Kecce AmerikW" + - "iyetnaamWanuwaatuuWalis e FutunaSamowaaYemenMayootAfrik bŋ WorgoSamm" + - "biSimbaabuwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0008, 0x001f, 0x002a, 0x003e, 0x0046, 0x004d, - 0x0054, 0x005c, 0x005c, 0x0065, 0x0072, 0x0079, 0x0083, 0x0089, - 0x0089, 0x0094, 0x00a6, 0x00af, 0x00ba, 0x00c0, 0x00ce, 0x00d6, - 0x00dd, 0x00e5, 0x00ea, 0x00ea, 0x00f2, 0x00f9, 0x0100, 0x0100, - 0x0108, 0x0110, 0x0116, 0x0116, 0x011f, 0x0127, 0x012e, 0x0135, - 0x0135, 0x0156, 0x016d, 0x0173, 0x0179, 0x0182, 0x018d, 0x0192, - 0x019a, 0x019e, 0x01a7, 0x01a7, 0x01b2, 0x01b7, 0x01c6, 0x01c6, - 0x01c6, 0x01cc, 0x01db, 0x01e2, 0x01e2, 0x01e9, 0x01f0, 0x01f8, - // Entry 40 - 7F - 0x020c, 0x0213, 0x0213, 0x021c, 0x0222, 0x0227, 0x0227, 0x022f, - 0x0236, 0x023c, 0x023c, 0x023c, 0x0243, 0x0248, 0x0257, 0x0262, - 0x0262, 0x0269, 0x026e, 0x0281, 0x0288, 0x028f, 0x029d, 0x029d, - 0x02a2, 0x02ac, 0x02b7, 0x02bd, 0x02c1, 0x02ca, 0x02de, 0x02e4, - 0x02e4, 0x02ef, 0x02f4, 0x0300, 0x0306, 0x0306, 0x0306, 0x030f, - 0x0317, 0x031d, 0x0324, 0x0324, 0x032e, 0x0336, 0x0342, 0x0342, - 0x0347, 0x0368, 0x036d, 0x0372, 0x037a, 0x037f, 0x037f, 0x0386, - 0x038d, 0x0392, 0x0398, 0x03a2, 0x03aa, 0x03b2, 0x03b8, 0x03c9, - // Entry 80 - BF - 0x03d3, 0x03de, 0x03e5, 0x03f2, 0x03fc, 0x0402, 0x0407, 0x0413, - 0x041e, 0x0428, 0x0431, 0x0437, 0x0440, 0x044a, 0x0451, 0x0455, - 0x045a, 0x0462, 0x046a, 0x046a, 0x046a, 0x0475, 0x0483, 0x048d, - 0x0492, 0x049a, 0x04a3, 0x04a3, 0x04b8, 0x04c0, 0x04c8, 0x04d1, - 0x04d6, 0x04dc, 0x04e4, 0x04eb, 0x04f1, 0x04f8, 0x0501, 0x0508, - 0x0517, 0x051d, 0x052b, 0x0534, 0x053f, 0x054a, 0x0551, 0x0557, - 0x055d, 0x0562, 0x0570, 0x0575, 0x057c, 0x0580, 0x0591, 0x05a3, - 0x05ab, 0x05b4, 0x05ba, 0x05ce, 0x05d5, 0x05e0, 0x05fd, 0x0606, - // Entry C0 - FF - 0x060c, 0x0616, 0x061c, 0x061c, 0x0624, 0x062b, 0x062b, 0x0631, - 0x063a, 0x0647, 0x0655, 0x065b, 0x0661, 0x0667, 0x0671, 0x067b, - 0x0683, 0x0683, 0x068b, 0x0696, 0x069f, 0x06a7, 0x06ae, 0x06b6, - 0x06b6, 0x06cb, 0x06d6, 0x06d6, 0x06db, 0x06e7, 0x06e7, 0x06fd, - 0x0701, 0x0701, 0x0706, 0x070f, 0x071a, 0x0722, 0x0733, 0x0740, - 0x0747, 0x074e, 0x0754, 0x0767, 0x076e, 0x0775, 0x077d, 0x0784, - 0x078d, 0x078d, 0x078d, 0x07a5, 0x07ae, 0x07b9, 0x07c7, 0x07dd, - 0x07e8, 0x07fd, 0x0810, 0x0819, 0x0823, 0x0831, 0x0838, 0x0838, - // Entry 100 - 13F - 0x083d, 0x0843, 0x0852, 0x0858, 0x0862, - }, - }, - { // fi - fiRegionStr, - fiRegionIdx, - }, - { // fil - filRegionStr, - filRegionIdx, - }, - { // fo - "AscensionAndorraSameindu EmirríkiniAfganistanAntigua & BarbudaAnguillaAl" + - "baniaArmeniaAngolaAntarktisArgentinaAmerikanska SamoaEysturríkiAvstr" + - "aliaArubaÁlandAserbadjanBosnia-HersegovinaBarbadosBangladesjBelgiaBu" + - "rkina FasoBulgariaBareinBurundiBeninSt-BarthélemyBermudaBruneiBolivi" + - "aNiðurlonds KaribiaBrasilBahamaoyggjarButanBouvetoyggjBotsvanaHvítar" + - "usslandBelisKanadaKokosoyggjarKongo, Dem. LýðveldiðMiðafrikalýðveldi" + - "ðKongoSveisFílabeinsstrondinCooksoyggjarKiliKamerunKinaKolombiaClip" + - "pertonKosta RikaKubaGrønhøvdaoyggjarCuraçaoJólaoyggjinKýprosKekkiaTý" + - "sklandDiego GarciaDjibutiDanmarkDominikaDominikalýðveldiðAlgeriaCeut" + - "a og MelillaEkvadorEstlandEgyptalandVestursaharaEritreaSpaniaEtiopia" + - "EvropasamveldiðFinnlandFijiFalklandsoyggjarMikronesiasamveldiðFøroya" + - "rFraklandGabonStórabretlandGrenadaGeorgiaFranska GujanaGuernseyGanaG" + - "ibraltarGrønlandGambiaGuineaGuadeloupeEkvatorguineaGrikkalandSuðurge" + - "orgia og SuðursandwichoyggjarGuatemalaGuamGuinea-BissauGujanaHong Ko" + - "ng SAR KinaHeard og McDonaldoyggjarHondurasKroatiaHaitiUngarnKanariu" + - "oyggjarIndonesiaÍrlandÍsraelIsle of ManIndiaStóra Bretlands Indiahav" + - "oyggjarIrakIranÍslandItaliaJerseyJamaikaJordanJapanKenjaKirgisiaKamb" + - "odjaKiribatiKomoroyggjarSt. Kitts & NevisNorðurkoreaSuðurkoreaKuvait" + - "CaymanoyggjarKasakstanLaosLibanonSt. LusiaLiktinsteinSri LankaLiberi" + - "aLesotoLitavaLuksemborgLettlandLibyaMarokkoMonakoMoldovaMontenegroSt" + - "-MartinMadagaskarMarshalloyggjarMakedóniaMaliMyanmar (Burma)Mongolia" + - "Makao SAR KinaNorðaru MariuoyggjarMartiniqueMóritaniaMontserratMalta" + - "MóritiusMaldivoyggjarMalaviMeksikoMalaisiaMosambikNamibiaNýkaledónia" + - "NigerNorfolksoyggjNigeriaNikaraguaNiðurlondNoregNepalNauruNiueNýsæla" + - "ndOmanPanamaPeruFranska PolynesiaPapua NýguineaFilipsoyggjarPakistan" + - "PóllandSaint Pierre og MiquelonPitcairnoyggjarPuerto RikoPalestinskt" + - " landøkiPortugalPalauParaguaiKatarfjarskoti OsianiaRéunionRumeniaSer" + - "biaRusslandRuandaSaudiarabiaSalomonoyggjarSeyskelloyggjarSudanSvørík" + - "iSingaporSt. HelenaSloveniaSvalbard & Jan MayenSlovakiaSierra LeonaS" + - "an MarinoSenegalSomaliaSurinamSuðursudanSao Tome & PrinsipiEl Salvad" + - "orSint MaartenSýriaSvasilandTristan da CunhaTurks- og CaicosoyggjarK" + - "jadFronsku sunnaru landaøkiTogoTailandTadsjikistanTokelauEysturtimor" + - "TurkmenistanTunesiaTongaTurkalandTrinidad & TobagoTuvaluTaivanTansan" + - "iaUkrainaUgandaSambandsríki Amerikas fjarskotnu oyggjarSambandsríki " + - "AmerikaUruguaiUsbekistanVatikanbýurSt. Vinsent & GrenadinoyggjarVene" + - "suelaStóra Bretlands JomfrúoyggjarSambandsríki Amerikas Jomfrúoyggja" + - "rVjetnamVanuatuWallis- og FutunaoyggjarSamoaKosovoJemenMayotteSuðura" + - "frikaSambiaSimbabviókent økiheimurAfrikaNorðuramerikaSuðuramerikaOsi" + - "aniaVesturafrikaMiðamerikaEysturafrikaNorðurafrikaMiðafrikasunnari p" + - "artur av AfrikaAmerikaAmerika norðanfyri MeksikoKaribiaEysturasiaSuð" + - "urasiaÚtsynningsasiaSuðurevropaAvstralasiaMelanesiaMikronesi økiPoly" + - "nesiaAsiaMiðasiaVesturasiaEvropaEysturevropaNorðurevropaVesturevropa" + - "Latínamerika", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x0024, 0x002e, 0x003f, 0x0047, 0x004e, - 0x0055, 0x005b, 0x0064, 0x006d, 0x007e, 0x0089, 0x0092, 0x0097, - 0x009d, 0x00a7, 0x00b9, 0x00c1, 0x00cb, 0x00d1, 0x00dd, 0x00e5, - 0x00eb, 0x00f2, 0x00f7, 0x0105, 0x010c, 0x0112, 0x0119, 0x012c, - 0x0132, 0x013f, 0x0144, 0x014f, 0x0157, 0x0165, 0x016a, 0x0170, - 0x017c, 0x0194, 0x01aa, 0x01af, 0x01b4, 0x01c6, 0x01d2, 0x01d6, - 0x01dd, 0x01e1, 0x01e9, 0x01f3, 0x01fd, 0x0201, 0x0213, 0x021b, - 0x0227, 0x022e, 0x0234, 0x023d, 0x0249, 0x0250, 0x0257, 0x025f, - // Entry 40 - 7F - 0x0273, 0x027a, 0x028a, 0x0291, 0x0298, 0x02a2, 0x02ae, 0x02b5, - 0x02bb, 0x02c2, 0x02d2, 0x02d2, 0x02da, 0x02de, 0x02ee, 0x0302, - 0x030a, 0x0312, 0x0317, 0x0325, 0x032c, 0x0333, 0x0341, 0x0349, - 0x034d, 0x0356, 0x035f, 0x0365, 0x036b, 0x0375, 0x0382, 0x038c, - 0x03b2, 0x03bb, 0x03bf, 0x03cc, 0x03d2, 0x03e4, 0x03fc, 0x0404, - 0x040b, 0x0410, 0x0416, 0x0424, 0x042d, 0x0434, 0x043b, 0x0446, - 0x044b, 0x046b, 0x046f, 0x0473, 0x047a, 0x0480, 0x0486, 0x048d, - 0x0493, 0x0498, 0x049d, 0x04a5, 0x04ad, 0x04b5, 0x04c1, 0x04d2, - // Entry 80 - BF - 0x04de, 0x04e9, 0x04ef, 0x04fc, 0x0505, 0x0509, 0x0510, 0x0519, - 0x0524, 0x052d, 0x0534, 0x053a, 0x0540, 0x054a, 0x0552, 0x0557, - 0x055e, 0x0564, 0x056b, 0x0575, 0x057e, 0x0588, 0x0597, 0x05a1, - 0x05a5, 0x05b4, 0x05bc, 0x05ca, 0x05df, 0x05e9, 0x05f3, 0x05fd, - 0x0602, 0x060b, 0x0618, 0x061e, 0x0625, 0x062d, 0x0635, 0x063c, - 0x0649, 0x064e, 0x065b, 0x0662, 0x066b, 0x0675, 0x067a, 0x067f, - 0x0684, 0x0688, 0x0692, 0x0696, 0x069c, 0x06a0, 0x06b1, 0x06c0, - 0x06cd, 0x06d5, 0x06dd, 0x06f5, 0x0704, 0x070f, 0x0723, 0x072b, - // Entry C0 - FF - 0x0730, 0x0738, 0x073d, 0x074e, 0x0756, 0x075d, 0x0763, 0x076b, - 0x0771, 0x077c, 0x078a, 0x0799, 0x079e, 0x07a7, 0x07af, 0x07b9, - 0x07c1, 0x07d5, 0x07dd, 0x07e9, 0x07f3, 0x07fa, 0x0801, 0x0808, - 0x0813, 0x0826, 0x0831, 0x083d, 0x0843, 0x084c, 0x085c, 0x0873, - 0x0877, 0x0890, 0x0894, 0x089b, 0x08a7, 0x08ae, 0x08b9, 0x08c5, - 0x08cc, 0x08d1, 0x08da, 0x08eb, 0x08f1, 0x08f7, 0x08ff, 0x0906, - 0x090c, 0x0935, 0x0935, 0x094a, 0x0951, 0x095b, 0x0967, 0x0984, - 0x098d, 0x09ac, 0x09d1, 0x09d8, 0x09df, 0x09f7, 0x09fc, 0x0a02, - // Entry 100 - 13F - 0x0a07, 0x0a0e, 0x0a1a, 0x0a20, 0x0a28, 0x0a33, 0x0a39, 0x0a3f, - 0x0a4d, 0x0a5a, 0x0a61, 0x0a6d, 0x0a78, 0x0a84, 0x0a91, 0x0a9b, - 0x0ab3, 0x0aba, 0x0ad5, 0x0adc, 0x0ae6, 0x0af0, 0x0aff, 0x0b0b, - 0x0b16, 0x0b1f, 0x0b2d, 0x0b36, 0x0b3a, 0x0b42, 0x0b4c, 0x0b52, - 0x0b5e, 0x0b6b, 0x0b77, 0x0b84, - }, - }, - { // fr - frRegionStr, - frRegionIdx, - }, - { // fr-BE - "BruneiÎles Géorgie du Sud et Sandwich du Sud", - []uint16{ // 97 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - // Entry 40 - 7F - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x002e, - }, - }, - { // fr-CA - frCARegionStr, - frCARegionIdx, - }, - {}, // fr-CH - { // fur - "AndorraEmirâts araps unîtsAfghanistanAntigua e BarbudaAnguillaAlbanieArm" + - "enieAngolaAntarticArgjentineSamoa merecanisAustrieAustralieArubaIsul" + - "is AlandAzerbaigianBosnie e ErcegovineBarbadosBangladeshBelgjicheBur" + - "kina FasoBulgarieBahrainBurundiBeninSant BarthélemyBermudaBruneiBoli" + - "vieBrasîlBahamasBhutanIsule BouvetBotswanaBielorussieBelizeCanadeIsu" + - "lis CocosRepubliche Democratiche dal CongoRepubliche centri africane" + - "Congo - BrazzavilleSvuizareCueste di AvoliIsulis CookCileCamerunCine" + - "ColombieIsule ClippertonCosta RicaCubaCjâf vertIsule ChristmasCipriR" + - "epubliche cecheGjermanieDiego GarciaGibutiDanimarcjeDominicheRepubli" + - "che dominicaneAlzerieCeuta e MelillaEcuadorEstonieEgjitSahara ociden" + - "tâlEritreeSpagneEtiopieUnion europeaneFinlandieFiziIsulis FalklandMi" + - "cronesieIsulis FaroeFranceGabonReam unîtGrenadaGjeorgjieGuiana franc" + - "êsGuernseyGhanaGjibraltarGroenlandeGambiaGuineeGuadalupeGuinee ecua" + - "toriâlGrecieGeorgia dal Sud e Isulis Sandwich dal SudGuatemalaGuamGu" + - "inea-BissauGuyanaRegjon aministrative speciâl de Cine di Hong KongIs" + - "ule Heard e Isulis McDonaldHondurasCravuazieHaitiOngjarieIsulis Cana" + - "riisIndonesieIrlandeIsraêlIsule di ManIndiaTeritori britanic dal Oce" + - "an IndianIraqIranIslandeItalieJerseyGjamaicheJordanieGjaponKenyaKirg" + - "hizstanCambozeKiribatiComorisSan Kitts e NevisCoree dal nordCoree da" + - "l sudKuwaitIsulis CaymanKazachistanLaosLibanSante LusieLiechtenstein" + - "Sri LankaLiberieLesothoLituanieLussemburcLetonieLibieMarocMonacoMold" + - "avieMontenegroSant MartinMadagascarIsulis MarshallMacedonieMaliBirma" + - "nieMongolieRegjon aministrative speciâl de Cine di MacaoIsulis Maria" + - "na dal NordMartinicheMauritanieMontserratMaltaMauriziMaldivisMalawiM" + - "essicMalaysiaMozambicNamibieGnove CaledonieNigerIsole NorfolkNigerie" + - "NicaraguaPaîs basNorvegjeNepalNauruNiueGnove ZelandeOmanPanamàPerùPo" + - "linesie francêsPapue Gnove GuineeFilipinisPakistanPolonieSan Pierre " + - "e MiquelonPitcairnPorto RicoTeritoris palestinêsPortugalPalauParagua" + - "yQatarOceanie perifericheReunionRomanieSerbieRussieRuandeArabie Saud" + - "ideIsulis SalomonSeychellesSudanSvezieSingaporeSante ElineSlovenieSv" + - "albard e Jan MayenSlovachieSierra LeoneSan MarinSenegalSomalieSurina" + - "meSao Tomè e PrincipeEl SalvadorSirieSwazilandTristan da CunhaIsulis" + - " Turks e CaicosÇadTeritoris meridionâi francêsTogoTailandieTazikista" + - "nTokelauTimor orientâlTurkmenistanTunisieTongaTurchieTrinidad e Toba" + - "goTuvaluTaiwanTanzanieUcraineUgandaIsulis periferichis minôrs dai St" + - "âts UnîtsStâts UnîtsUruguayUzbechistanVaticanSan Vincent e lis Gren" + - "adinisVenezuelaIsulis vergjinis britanichisIsulis vergjinis american" + - "isVietnamVanuatuWallis e FutunaSamoaYemenMayotteSud AfricheZambiaZim" + - "babweRegjon no cognossude o no valideMontAfricheAmeriche dal NordAme" + - "riche meridionâlOceanieAfriche ocidentâlAmeriche centrâlAfriche orie" + - "ntâlAfriche setentrionâlAfriche di mieçAfriche meridionâlAmerichisAm" + - "eriche setentrionâlcaraibicAsie orientâlAsie meridionâlAsie sud orie" + - "ntâlEurope meridionâlAustralie e Gnove ZelandeMelanesieRegjon de Mic" + - "ronesiePolinesieAsieAsie centrâlAsie ocidentâlEuropeEurope orientâlE" + - "urope setentrionâlEurope ocidentâlAmeriche latine", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x001c, 0x0027, 0x0038, 0x0040, 0x0047, - 0x004e, 0x0054, 0x005c, 0x0066, 0x0075, 0x007c, 0x0085, 0x008a, - 0x0096, 0x00a1, 0x00b4, 0x00bc, 0x00c6, 0x00cf, 0x00db, 0x00e3, - 0x00ea, 0x00f1, 0x00f6, 0x0106, 0x010d, 0x0113, 0x011a, 0x011a, - 0x0121, 0x0128, 0x012e, 0x013a, 0x0142, 0x014d, 0x0153, 0x0159, - 0x0165, 0x0186, 0x01a0, 0x01b3, 0x01bb, 0x01ca, 0x01d5, 0x01d9, - 0x01e0, 0x01e4, 0x01ec, 0x01fc, 0x0206, 0x020a, 0x0214, 0x0214, - 0x0223, 0x0228, 0x0238, 0x0241, 0x024d, 0x0253, 0x025d, 0x0266, - // Entry 40 - 7F - 0x027b, 0x0282, 0x0291, 0x0298, 0x029f, 0x02a4, 0x02b5, 0x02bc, - 0x02c2, 0x02c9, 0x02d8, 0x02d8, 0x02e1, 0x02e5, 0x02f4, 0x02fe, - 0x030a, 0x0310, 0x0315, 0x031f, 0x0326, 0x032f, 0x033e, 0x0346, - 0x034b, 0x0355, 0x035f, 0x0365, 0x036b, 0x0374, 0x0386, 0x038c, - 0x03b5, 0x03be, 0x03c2, 0x03cf, 0x03d5, 0x0407, 0x0424, 0x042c, - 0x0435, 0x043a, 0x0442, 0x0451, 0x045a, 0x0461, 0x0468, 0x0474, - 0x0479, 0x049b, 0x049f, 0x04a3, 0x04aa, 0x04b0, 0x04b6, 0x04bf, - 0x04c7, 0x04cd, 0x04d2, 0x04dd, 0x04e4, 0x04ec, 0x04f3, 0x0504, - // Entry 80 - BF - 0x0512, 0x051f, 0x0525, 0x0532, 0x053d, 0x0541, 0x0546, 0x0551, - 0x055e, 0x0567, 0x056e, 0x0575, 0x057d, 0x0587, 0x058e, 0x0593, - 0x0598, 0x059e, 0x05a6, 0x05b0, 0x05bb, 0x05c5, 0x05d4, 0x05dd, - 0x05e1, 0x05e9, 0x05f1, 0x061f, 0x0636, 0x0640, 0x064a, 0x0654, - 0x0659, 0x0660, 0x0668, 0x066e, 0x0674, 0x067c, 0x0684, 0x068b, - 0x069a, 0x069f, 0x06ac, 0x06b3, 0x06bc, 0x06c5, 0x06cd, 0x06d2, - 0x06d7, 0x06db, 0x06e8, 0x06ec, 0x06f3, 0x06f8, 0x070a, 0x071c, - 0x0725, 0x072d, 0x0734, 0x0749, 0x0751, 0x075b, 0x0770, 0x0778, - // Entry C0 - FF - 0x077d, 0x0785, 0x078a, 0x079d, 0x07a4, 0x07ab, 0x07b1, 0x07b7, - 0x07bd, 0x07cb, 0x07d9, 0x07e3, 0x07e8, 0x07ee, 0x07f7, 0x0802, - 0x080a, 0x081e, 0x0827, 0x0833, 0x083c, 0x0843, 0x084a, 0x0852, - 0x0852, 0x0866, 0x0871, 0x0871, 0x0876, 0x087f, 0x088f, 0x08a4, - 0x08a8, 0x08c6, 0x08ca, 0x08d3, 0x08dd, 0x08e4, 0x08f3, 0x08ff, - 0x0906, 0x090b, 0x0912, 0x0923, 0x0929, 0x092f, 0x0937, 0x093e, - 0x0944, 0x0971, 0x0971, 0x097e, 0x0985, 0x0990, 0x0997, 0x09b3, - 0x09bc, 0x09d8, 0x09f3, 0x09fa, 0x0a01, 0x0a10, 0x0a15, 0x0a15, - // Entry 100 - 13F - 0x0a1a, 0x0a21, 0x0a2c, 0x0a32, 0x0a3a, 0x0a5a, 0x0a5e, 0x0a65, - 0x0a76, 0x0a8a, 0x0a91, 0x0aa3, 0x0ab4, 0x0ac5, 0x0ada, 0x0aea, - 0x0afd, 0x0b06, 0x0b1c, 0x0b24, 0x0b32, 0x0b42, 0x0b54, 0x0b66, - 0x0b7f, 0x0b88, 0x0b9c, 0x0ba5, 0x0ba9, 0x0bb6, 0x0bc5, 0x0bcb, - 0x0bdb, 0x0bef, 0x0c00, 0x0c0f, - }, - }, - { // fy - "AscensionAndorraVerenigde Arabyske EmiratenAfghanistanAntigua en Barbuda" + - "AnguillaAlbaniëArmeniëAngolaAntarcticaArgentiniëAmerikaansk SamoaEas" + - "tenrykAustraliëArubaÅlânAzerbeidzjanBosnië en HerzegovinaBarbadosBan" + - "gladeshBelgiëBurkina FasoBulgarijeBahreinBurundiBeninSaint Barthélem" + - "yBermudaBruneiBoliviaKaribysk NederlânBraziliëBahama’sBhutanBouvetei" + - "lânBotswanaWit-RuslânBelizeCanadaKokosilanenCongo-KinshasaSintraal-A" + - "frikaanske RepublykCongo-BrazzavilleSwitserlânIvoorkustCookeilannenC" + - "hiliKameroenSinaKolombiaClippertonCosta RicaKubaKaapverdiëCuraçaoKry" + - "steilanSyprusTsjechjeDútslânDiego GarciaDjiboutiDenemarkenDominikaDo" + - "minikaanske RepublykAlgerijeCeuta en MelillaEcuadorEstlânEgypteWeste" + - "lijke SaharaEritreaSpanjeEthiopiëEuropeeske UnieFinlânFijiFalklâneil" + - "annenMicronesiëFaeröerFrankrijkGabonVerenigd KoninkrijkGrenadaGeorgi" + - "ëFrans-GuyanaGuernseyGhanaGibraltarGrienlânGambiaGuineeGuadeloupeEq" + - "uatoriaal-GuineaGrikelânSûd-Georgia en Sûdlike SandwicheilannenGuate" + - "malaGuamGuinee-BissauGuyanaHongkong SAR van SinaHeard- en McDonaldei" + - "lannenHondurasKroatiëHaïtiHongarijeKanaryske EilânnenYndonesiëIerlân" + - "IsraëlIsle of ManIndiaBritse Gebieden yn de Indyske OseaanIrakIranYs" + - "lânItaliëJerseyJamaicaJordaniëJapanKeniaKirgiziëCambodjaKiribatiComo" + - "renSaint Kitts en NevisNoard-KoreaSûd-KoreaKoeweitCaymaneilannenKaza" + - "chstanLaosLibanonSaint LuciaLiechtensteinSri LankaLiberiaLesothoLito" + - "uwenLuxemburgLetlânLibiëMarokkoMonacoMoldaviëMontenegroSaint-MartinM" + - "adeiaskarMarshalleilannenMacedoniëMaliMyanmar (Birma)MongoliëMacao S" + - "AR van SinaNoardlike MarianeneilannenMartiniqueMauritaniëMontserratM" + - "altaMauritiusMaldivenMalawiMexicoMaleisiëMozambiqueNamibiëNij-Caledo" + - "niëNigerNorfolkeilânNigeriaNicaraguaNederlânNoarwegenNepalNauruNiueN" + - "ij-SeelânOmanPanamaPeruFrans-PolynesiëPapoea-Nij-GuineaFilipijnenPak" + - "istanPolenSaint-Pierre en MiquelonPitcairneilannenPuerto RicoPalesty" + - "nske gebietenPortugalPalauParaguayQatarOerig OceaniëRéunionRoemeniëS" + - "erviëRuslânRwandaSaoedi-ArabiëSalomonseilannenSeychellenSoedanZweden" + - "SingaporeSint-HelenaSloveniëSpitsbergen en Jan MayenSlowakijeSierra " + - "LeoneSan MarinoSenegalSomaliëSurinameSûd-SoedanSao Tomé en PrincipeE" + - "l SalvadorSint-MaartenSyriëSwazilânTristan da CunhaTurks- en Caicose" + - "ilannenTsjaadFranse Gebieden in de zuidelijke Indyske OseaanTogoThai" + - "lânTadzjikistanTokelauEast-TimorTurkmenistanTunesiëTongaTurkijeTrini" + - "dad en TobagoTuvaluTaiwanTanzaniaOekraïneOegandaLyts ôflizzen eilann" + - "en fan de Ferienigde StatenFerienigde StatenUruguayOezbekistanVatica" + - "anstêdSaint Vincent en de GrenadinesVenezuelaBritse MaagdeneilannenA" + - "merikaanske MaagdeneilannenVietnamVanuatuWallis en FutunaSamoaKosovo" + - "JemenMayotteSûd-AfrikaZambiaZimbabweUnbekend gebietWrâldAfrikaNoard-" + - "AmerikaSûd-AmerikaOceaniëWest-AfrikaMidden-AmerikaEast-AfrikaNoard-A" + - "frikaSintraal-AfrikaSûdelijk AfrikaAmerikaNoardlik AmerikaKaribysk g" + - "ebietEast-AziëSûd-AziëSûdoost-AziëSûd-EuropaAustralaziëMelanesiëMicr" + - "onesyske regioPolynesiëAziëSintraal-AziëWest-AziëEuropaEast-EuropaNo" + - "ard-EuropaWest-EuropaLatynsk-Amearika", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002b, 0x0036, 0x0048, 0x0050, 0x0058, - 0x0060, 0x0066, 0x0070, 0x007b, 0x008c, 0x0095, 0x009f, 0x00a4, - 0x00aa, 0x00b6, 0x00cc, 0x00d4, 0x00de, 0x00e5, 0x00f1, 0x00fa, - 0x0101, 0x0108, 0x010d, 0x011e, 0x0125, 0x012b, 0x0132, 0x0144, - 0x014d, 0x0157, 0x015d, 0x0169, 0x0171, 0x017c, 0x0182, 0x0188, - 0x0193, 0x01a1, 0x01be, 0x01cf, 0x01da, 0x01e3, 0x01ef, 0x01f4, - 0x01fc, 0x0200, 0x0208, 0x0212, 0x021c, 0x0220, 0x022b, 0x0233, - 0x023d, 0x0243, 0x024b, 0x0254, 0x0260, 0x0268, 0x0272, 0x027a, - // Entry 40 - 7F - 0x0290, 0x0298, 0x02a8, 0x02af, 0x02b6, 0x02bc, 0x02cd, 0x02d4, - 0x02da, 0x02e3, 0x02f2, 0x02f2, 0x02f9, 0x02fd, 0x030d, 0x0318, - 0x0320, 0x0329, 0x032e, 0x0341, 0x0348, 0x0350, 0x035c, 0x0364, - 0x0369, 0x0372, 0x037b, 0x0381, 0x0387, 0x0391, 0x03a3, 0x03ac, - 0x03d5, 0x03de, 0x03e2, 0x03ef, 0x03f5, 0x040a, 0x0424, 0x042c, - 0x0434, 0x043a, 0x0443, 0x0456, 0x0460, 0x0467, 0x046e, 0x0479, - 0x047e, 0x04a2, 0x04a6, 0x04aa, 0x04b0, 0x04b7, 0x04bd, 0x04c4, - 0x04cd, 0x04d2, 0x04d7, 0x04e0, 0x04e8, 0x04f0, 0x04f7, 0x050b, - // Entry 80 - BF - 0x0516, 0x0520, 0x0527, 0x0535, 0x053f, 0x0543, 0x054a, 0x0555, - 0x0562, 0x056b, 0x0572, 0x0579, 0x0581, 0x058a, 0x0591, 0x0597, - 0x059e, 0x05a4, 0x05ad, 0x05b7, 0x05c3, 0x05cd, 0x05dd, 0x05e7, - 0x05eb, 0x05fa, 0x0603, 0x0615, 0x062f, 0x0639, 0x0644, 0x064e, - 0x0653, 0x065c, 0x0664, 0x066a, 0x0670, 0x0679, 0x0683, 0x068b, - 0x0699, 0x069e, 0x06ab, 0x06b2, 0x06bb, 0x06c4, 0x06cd, 0x06d2, - 0x06d7, 0x06db, 0x06e6, 0x06ea, 0x06f0, 0x06f4, 0x0704, 0x0715, - 0x071f, 0x0727, 0x072c, 0x0744, 0x0754, 0x075f, 0x0773, 0x077b, - // Entry C0 - FF - 0x0780, 0x0788, 0x078d, 0x079b, 0x07a3, 0x07ac, 0x07b3, 0x07ba, - 0x07c0, 0x07ce, 0x07de, 0x07e8, 0x07ee, 0x07f4, 0x07fd, 0x0808, - 0x0811, 0x0829, 0x0832, 0x083e, 0x0848, 0x084f, 0x0857, 0x085f, - 0x086a, 0x087f, 0x088a, 0x0896, 0x089c, 0x08a5, 0x08b5, 0x08cd, - 0x08d3, 0x0902, 0x0906, 0x090e, 0x091a, 0x0921, 0x092b, 0x0937, - 0x093f, 0x0944, 0x094b, 0x095d, 0x0963, 0x0969, 0x0971, 0x097a, - 0x0981, 0x09b1, 0x09b1, 0x09c2, 0x09c9, 0x09d4, 0x09e1, 0x09ff, - 0x0a08, 0x0a1e, 0x0a3a, 0x0a41, 0x0a48, 0x0a58, 0x0a5d, 0x0a63, - // Entry 100 - 13F - 0x0a68, 0x0a6f, 0x0a7a, 0x0a80, 0x0a88, 0x0a97, 0x0a9d, 0x0aa3, - 0x0ab0, 0x0abc, 0x0ac4, 0x0acf, 0x0add, 0x0ae8, 0x0af4, 0x0b03, - 0x0b13, 0x0b1a, 0x0b2a, 0x0b39, 0x0b43, 0x0b4d, 0x0b5b, 0x0b66, - 0x0b72, 0x0b7c, 0x0b8e, 0x0b98, 0x0b9d, 0x0bab, 0x0bb5, 0x0bbb, - 0x0bc6, 0x0bd2, 0x0bdd, 0x0bed, - }, - }, - { // ga - "Oileán na DeascabhálaAndóraAontas na nÉimíríochtaí ArabachaAn Afganastái" + - "nAntigua agus BarbúdaAngaíleAn AlbáinAn AirméinAngólaAn AntartaiceAn" + - " AirgintínSamó MeiriceánachAn OstairAn AstráilArúbaOileáin ÅlandAn A" + - "sarbaiseáinAn Bhoisnia agus An HeirseagaivéinBarbadósAn Bhanglaidéis" + - "An BheilgBuircíne FasóAn BhulgáirBairéinAn BhurúinBeininSaint Barthé" + - "lemyBeirmiúdaBrúinéAn BholaivAn Ísiltír ChairibeachAn BhrasaílNa Bah" + - "ámaíAn BhútáinOileán BouvetAn BhotsuáinAn BhealarúisAn BheilísCeana" + - "daOileáin Cocos (Keeling)Poblacht Dhaonlathach an ChongóPoblacht na " + - "hAfraice LáirAn CongóAn EilvéisAn Cósta EabhairOileáin CookAn tSileC" + - "amarúnAn tSínAn CholóimOileán ClippertonCósta RíceCúbaRinn VerdeCura" + - "çaoOileán na NollagAn ChipirPoblacht na SeiceAn GhearmáinDiego Garc" + - "iaDjiboutiAn DanmhairgDoiminiceAn Phoblacht DhoiminiceachAn AilgéirC" + - "euta agus MelillaEacuadórAn EastóinAn ÉigiptAn Sahára ThiarAn Eiritr" + - "éAn SpáinnAn AetóipAn tAontas EorpachAn FhionlainnFidsíOileáin Fhác" + - "lainneAn MhicrinéisOileáin FharóAn FhraincAn GhabúinAn Ríocht Aontai" + - "theGreanádaAn tSeoirsiaGuáin na FrainceGeansaíGánaGiobráltarAn Ghrao" + - "nlainnAn GhaimbiaAn GhuineGuadalúipAn Ghuine MheánchriosachAn Ghréig" + - "An tSeoirsia Theas agus Oileáin Sandwich TheasGuatamalaGuamGuine Bis" + - "sauAn GhuáinS.R.R. na Síne Hong CongOileán Heard agus Oileáin McDona" + - "ldHondúrasAn ChróitHáítíAn UngáirNa hOileáin ChanárachaAn IndinéisÉi" + - "reIosraelOileán MhanannAn IndiaCríoch Aigéan Indiach na BreataineAn " + - "IaráicAn IaráinAn ÍoslainnAn IodáilGeirsíIamáiceAn IordáinAn tSeapái" + - "nAn ChéiniaAn ChirgeastáinAn ChambóidCireabaitíOileáin ChomóraSan Cr" + - "íostóir-NimheasAn Chóiré ThuaidhAn Chóiré TheasCuáitOileáin CaymanA" + - "n ChasacstáinLaosAn LiobáinSaint LuciaLichtinstéinSrí LancaAn Libéir" + - "LeosótaAn LiotuáinLucsamburgAn LaitviaAn LibiaMaracóMonacóAn Mholdói" + - "vMontainéagróSaint-MartinMadagascarOileáin MarshallAn MhacadóinMailí" + - "Maenmar (Burma)An MhongóilS.R.R. na Síne MacaoNa hOileáin Mháirianac" + - "ha ThuaidhMartiniqueAn MháratáinMontsaratMáltaOileán MhuirísOileáin " + - "MhaildíveAn MhaláivMeicsiceoAn MhalaeisiaMósaimbícAn NamaibAn Nua-Ch" + - "aladóinAn NígirOileán NorfolkAn NigéirNicearaguaAn ÍsiltírAn IoruaNe" + - "ipealNárúNiueAn Nua-ShéalainnÓmanPanamaPeiriúPolainéis na FrainceNua" + - "-Ghuine PhapuaNa hOileáin FhilipíneachaAn PhacastáinAn PholainnSaint" + - "-Pierre-et-MiquelonOileáin PitcairnPortó RíceNa Críocha Palaistíneac" + - "haAn PhortaingéilPalauParaguaCatarAn Aigéine ImeallachRéunionAn Rómá" + - "inAn tSeirbiaAn RúisRuandaAn Araib ShádachOileáin SholomónNa Séiséil" + - "An tSúdáinAn tSualainnSingeapórSan HéilinAn tSlóivéinSvalbard agus J" + - "an MayenAn tSlóvaicSiarra LeonSan MairíneAn tSeineagáilAn tSomáilSur" + - "anamAn tSúdáin TheasSão Tomé agus PríncipeAn tSalvadóirSint MaartenA" + - "n tSiriaAn tSuasalainnTristan da CunhaOileáin na dTurcach agus Caico" + - "sSeadCríocha Francacha Dheisceart an DomhainTógaAn TéalainnAn Táidsí" + - "ceastáinTócaláTíomór ThoirAn TuircméanastáinAn TúinéisTongaAn TuircO" + - "ileán na Tríonóide agus TobágaTuvaluAn TéaváinAn TansáinAn ÚcráinUga" + - "ndaOileáin Imeallacha S.A.M.Náisiúin AontaitheStáit Aontaithe Mheiri" + - "ceáUruguaAn ÚisbéiceastáinAn VatacáinSan Uinseann agus na Greanáidín" + - "íVeiniséalaOileáin Bhriotanacha na MaighdeanOileáin Mheiriceánacha " + - "na MaighdeanVítneamVanuatúVailís agus FutúnaSamóAn ChosaivÉiminMayot" + - "teAn Afraic TheasAn tSaimbiaAn tSiombáibRéigiún AnaithnidAn DomhanAn" + - " AfraicMeiriceá ThuaidhMeiriceá TheasAn AigéineIarthar na hAfraiceMe" + - "iriceá LáirOirthear na hAfraiceTuaisceart na hAfraiceAn Afraic LáirD" + - "eisceart na hAfraiceCríocha MheiriceáTuaisceart MheiriceáAn Mhuir Ch" + - "airibOirthear na hÁiseDeisceart na hÁiseOirdheisceart na hÁiseDeisce" + - "art na hEorpaAn AstraláiseAn MheilinéisAn Réigiún MicrinéiseachAn Ph" + - "olainéisAn ÁiseAn Áise LáirIarthar na hÁiseAn EoraipOirthear na hEor" + - "paTuaisceart na hEorpaIarthar na hEorpaMeiriceá Laidineach", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0017, 0x001e, 0x0042, 0x0051, 0x0066, 0x006e, 0x0078, - 0x0083, 0x008a, 0x0097, 0x00a4, 0x00b7, 0x00c0, 0x00cb, 0x00d1, - 0x00e0, 0x00f0, 0x0113, 0x011c, 0x012c, 0x0135, 0x0144, 0x0150, - 0x0158, 0x0163, 0x0169, 0x017a, 0x0184, 0x018c, 0x0196, 0x01ae, - 0x01ba, 0x01c6, 0x01d2, 0x01e0, 0x01ed, 0x01fb, 0x0206, 0x020d, - 0x0225, 0x0245, 0x025f, 0x0268, 0x0273, 0x0284, 0x0291, 0x0299, - 0x02a1, 0x02a9, 0x02b4, 0x02c6, 0x02d2, 0x02d7, 0x02e1, 0x02e9, - 0x02fa, 0x0303, 0x0314, 0x0321, 0x032d, 0x0335, 0x0341, 0x034a, - // Entry 40 - 7F - 0x0364, 0x036f, 0x0381, 0x038a, 0x0395, 0x039f, 0x03af, 0x03ba, - 0x03c4, 0x03ce, 0x03e0, 0x03e0, 0x03ed, 0x03f3, 0x0407, 0x0415, - 0x0424, 0x042e, 0x0439, 0x044d, 0x0456, 0x0462, 0x0473, 0x047b, - 0x0480, 0x048b, 0x0499, 0x04a4, 0x04ad, 0x04b7, 0x04d0, 0x04da, - 0x0509, 0x0512, 0x0516, 0x0522, 0x052c, 0x0545, 0x0569, 0x0572, - 0x057c, 0x0584, 0x058e, 0x05a6, 0x05b2, 0x05b7, 0x05be, 0x05cd, - 0x05d5, 0x05f9, 0x0603, 0x060d, 0x0619, 0x0623, 0x062a, 0x0632, - 0x063d, 0x0649, 0x0654, 0x0664, 0x0670, 0x067b, 0x068c, 0x06a3, - // Entry 80 - BF - 0x06b6, 0x06c7, 0x06cd, 0x06dc, 0x06eb, 0x06ef, 0x06fa, 0x0705, - 0x0712, 0x071c, 0x0726, 0x072e, 0x073a, 0x0744, 0x074e, 0x0756, - 0x075d, 0x0764, 0x0770, 0x077e, 0x078a, 0x0794, 0x07a5, 0x07b2, - 0x07b8, 0x07c7, 0x07d3, 0x07e8, 0x080a, 0x0814, 0x0822, 0x082b, - 0x0831, 0x0841, 0x0854, 0x085f, 0x0868, 0x0875, 0x0880, 0x0889, - 0x089a, 0x08a3, 0x08b2, 0x08bc, 0x08c6, 0x08d2, 0x08da, 0x08e1, - 0x08e7, 0x08eb, 0x08fc, 0x0901, 0x0907, 0x090e, 0x0923, 0x0934, - 0x094f, 0x095d, 0x0968, 0x0980, 0x0991, 0x099d, 0x09b8, 0x09c8, - // Entry C0 - FF - 0x09cd, 0x09d4, 0x09d9, 0x09ee, 0x09f6, 0x0a01, 0x0a0c, 0x0a14, - 0x0a1a, 0x0a2b, 0x0a3d, 0x0a49, 0x0a55, 0x0a61, 0x0a6b, 0x0a76, - 0x0a84, 0x0a9b, 0x0aa7, 0x0ab2, 0x0abe, 0x0acd, 0x0ad8, 0x0adf, - 0x0af1, 0x0b0a, 0x0b18, 0x0b24, 0x0b2d, 0x0b3b, 0x0b4b, 0x0b6b, - 0x0b6f, 0x0b97, 0x0b9c, 0x0ba8, 0x0bbc, 0x0bc4, 0x0bd2, 0x0be6, - 0x0bf2, 0x0bf7, 0x0bff, 0x0c22, 0x0c28, 0x0c34, 0x0c3f, 0x0c4a, - 0x0c50, 0x0c6a, 0x0c7e, 0x0c99, 0x0c9f, 0x0cb3, 0x0cbf, 0x0ce2, - 0x0ced, 0x0d0f, 0x0d34, 0x0d3c, 0x0d44, 0x0d58, 0x0d5d, 0x0d67, - // Entry 100 - 13F - 0x0d6d, 0x0d74, 0x0d83, 0x0d8e, 0x0d9b, 0x0dae, 0x0db7, 0x0dc0, - 0x0dd1, 0x0de0, 0x0deb, 0x0dfe, 0x0e0d, 0x0e21, 0x0e37, 0x0e46, - 0x0e5b, 0x0e6e, 0x0e83, 0x0e93, 0x0ea5, 0x0eb8, 0x0ecf, 0x0ee2, - 0x0ef0, 0x0efe, 0x0f19, 0x0f27, 0x0f2f, 0x0f3d, 0x0f4e, 0x0f57, - 0x0f69, 0x0f7d, 0x0f8e, 0x0fa2, - }, - }, - { // gd - "Eilean na DeasgabhalachAndorraNa h-Iomaratan Arabach AonaichteAfghanastà" + - "nAintìoga is BarbudaAnguilliaAlbàiniaAirmeineaAngòlaAn AntartaigAn A" + - "rgantainSamotha na h-AimeireagaAn OstairAstràiliaArùbaNa h-Eileanan " + - "ÅlandAsarbaideànBosna agus HearsagobhanaBarbadosBangladaisA’ Bheilg" + - "Buirciona FasoA’ BhulgairBachrainBurundaidhBeininSaint BarthélemyBea" + - "rmùdaBrùnaighBoilibhiaNa Tìrean Ìsle CaraibeachBraisilNa h-Eileanan " + - "BhathamaButànEilean BouvetBotsuanaA’ BhealaruisA’ BheilìsCanadaNa h-" + - "Eileanan Chocos (Keeling)Congo - KinshasaPoblachd Meadhan AfragaA’ C" + - "hongo - BrazzavilleAn EilbheisCôte d’IvoireEileanan CookAn t-SileCam" + - "arunAn t-SìnColoimbiaEilean ClippertonCosta RìceaCùbaAn Ceap UaineCu" + - "raçaoEilean na NollaigCìoprasAn t-SeicA’ GhearmailtDiego GarciaDiobù" + - "taidhAn DanmhairgDoiminiceaA’ Phoblachd DhoiminiceachAildiriaCeuta a" + - "gus MelillaEacuadorAn EastoinAn ÈiphitSathara an IarEartraAn Spàinnt" + - "An ItiopAn t-Aonadh EòrpachAn FhionnlannFìdiNa h-Eileanan Fàclannach" + - "Na Meanbh-eileananNa h-Eileanan FàroAn FhraingGabonAn Rìoghachd Aona" + - "ichteGreanàdaA’ ChairtbheilGuidheàna na FraingeGeàrnsaidhGànaDiobral" + - "tarA’ GhraonlannA’ GhaimbiaGiniGuadalupGini Mheadhan-ChriosachA’ Ghr" + - "eugSeòirsea a Deas is na h-Eileanan Sandwich a DeasGuatamalaGuamGini" + - "-BiosoGuidheànaHong Kong SAR na SìneEilean Heard is MhicDhòmhnaillHo" + - "ndùrasA’ ChròthaisHaidhtiAn UngairNa h-Eileanan CanàrachNa h-Innd-in" + - "nseÈirinnIosraelEilean MhanainnNa h-InnseachanRanntair Breatannach C" + - "uan nan InnseachanIoràcIorànInnis TìleAn EadailtDeàrsaidhDiameugaIòr" + - "danAn t-SeapanCeiniaCìorgastanCambuideaCiribeasComorosNaomh Crìstean" + - " is NibheisCoirèa a TuathCoirèaCuibhèitNa h-Eileanan CaimeanCasachst" + - "ànLàthosLeabanonNaomh LùiseaLichtensteinSri LancaLibèirLeasotoAn Li" + - "otuainLugsamburgAn LaitbheLibiaMorocoMonacoA’ MholdobhaAm Monadh Nea" + - "grachNaomh MàrtainnMadagasgarEileanan MharshallA’ MhasadonMàiliMiànm" + - "arDùthaich nam MongolMacàthu SAR na SìneNa h-Eileanan Mairianach a T" + - "uathMairtinicMoratàineaMontsaratMaltaNa h-Eileanan MhoiriseasNa h-Ei" + - "leanan MhaladaibhMalabhaidhMeagsagoMalaidhseaMòsaimbicAn NamaibCaill" + - "eann NuadhNìgeirEilean NorfolkNigèiriaNiocaraguaNa Tìrean ÌsleNirrib" + - "hidhNeapàlNabhruNiueSealainn NuadhOmànPanamaPearùPoilinèis na Fraing" + - "eGini Nuadh PhaputhachNa h-Eileanan FilipineachPagastànA’ PhòlainnSa" + - "int Pierre agus MiquelonEileanan Peit a’ ChàirnPorto RìceoNa Ranntai" + - "rean PalastaineachA’ PhortagailPalabhParaguaidhCatarRoinn Iomallach " + - "a’ Chuain SèimhRéunionRomàiniaAn t-SèirbAn RuisRubhandaAràibia nan S" + - "abhdEileanan SholaimhNa h-Eileanan SheiseallSudànAn t-SuainSingeapòr" + - "Eilean Naomh EilidhAn t-SlòbhainSvalbard agus Jan MayenAn t-SlòbhacS" + - "iarra LeòmhannSan MarinoSeanagalSomàiliaSuranamSudàn a DeasSão Tomé " + - "agus PríncipeAn SalbhadorSint MaartenSiridheaDùthaich nan SuasaidhTr" + - "istan da CunhaNa h-Eileanan Turcach is CaiceoAn t-SeàdRanntairean a " + - "Deas na FraingeTogoDùthaich nan TàidhTaidigeastànTokelauTimor-LesteT" + - "urcmanastànTuiniseaTongaAn TuircTrianaid agus TobagoTubhaluTaidh-Bhà" + - "nAn TansanAn UcràinUgandaMeanbh-Eileanan Iomallach nan SANa Stàitean" + - " AonaichteUruguaidhUsbagastànCathair na BhatacainNaomh Bhionsant agu" + - "s Eileanan GreanadachA’ BheinisealaEileanan Breatannach na Maighdinn" + - "Eileanan na Maighdinn aig na SABhiet-NamVanuatuUallas agus FutunaSam" + - "othaA’ ChosobhoAn EamanMayotteAfraga a DeasSàimbiaAn t-SìombabRoinn-" + - "dùthcha neo-aithnichteAn SaoghalAfragaAimeireaga a TuathAimeireaga a" + - " DeasRoinn a’ Chuain SèimhAfraga an IarMeadhan AimeireagaAfraga an E" + - "arAfraga a TuathMeadhan AfragaCeann a Deas AfragaAn Dà AimeireagaCea" + - "nn a Tuath AimeireagaAm Muir CaraibeachÀisia an EarÀisia a DeasÀisia" + - " an Ear-dheasAn Roinn-Eòrpa a DeasAstràilia is Sealainn NuadhNa h-Ei" + - "leanan DubhaRoinn nam Meanbh-EileananPoilinèisÀisiaMeadhan ÀisiaÀisi" + - "a an IarAn Roinn-EòrpaAn Roinn-Eòrpa an EarAn Roinn-Eòrpa a TuathAn " + - "Roinn-Eòrpa an IarAimeireaga Laidinneach", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0017, 0x001e, 0x003e, 0x004a, 0x005e, 0x0067, 0x0070, - 0x0079, 0x0080, 0x008c, 0x0098, 0x00af, 0x00b8, 0x00c2, 0x00c8, - 0x00dc, 0x00e8, 0x0100, 0x0108, 0x0112, 0x011d, 0x012b, 0x0138, - 0x0140, 0x014a, 0x0150, 0x0161, 0x016a, 0x0173, 0x017c, 0x0197, - 0x019e, 0x01b4, 0x01ba, 0x01c7, 0x01cf, 0x01de, 0x01eb, 0x01f1, - 0x020f, 0x021f, 0x0236, 0x024f, 0x025a, 0x026a, 0x0277, 0x0280, - 0x0287, 0x0290, 0x0299, 0x02aa, 0x02b6, 0x02bb, 0x02c8, 0x02d0, - 0x02e1, 0x02e9, 0x02f2, 0x0301, 0x030d, 0x0318, 0x0324, 0x032e, - // Entry 40 - 7F - 0x034a, 0x0352, 0x0364, 0x036c, 0x0376, 0x0380, 0x038e, 0x0394, - 0x039f, 0x03a7, 0x03bb, 0x03bb, 0x03c8, 0x03cd, 0x03e6, 0x03f8, - 0x040b, 0x0415, 0x041a, 0x0431, 0x043a, 0x044a, 0x045f, 0x046a, - 0x046f, 0x0479, 0x0488, 0x0495, 0x0499, 0x04a1, 0x04b8, 0x04c3, - 0x04f4, 0x04fd, 0x0501, 0x050b, 0x0515, 0x052b, 0x054a, 0x0553, - 0x0562, 0x0569, 0x0572, 0x0589, 0x0598, 0x059f, 0x05a6, 0x05b5, - 0x05c4, 0x05ec, 0x05f2, 0x05f8, 0x0603, 0x060d, 0x0617, 0x061f, - 0x0626, 0x0631, 0x0637, 0x0642, 0x064b, 0x0653, 0x065a, 0x0674, - // Entry 80 - BF - 0x0683, 0x068a, 0x0693, 0x06a8, 0x06b3, 0x06ba, 0x06c2, 0x06cf, - 0x06db, 0x06e4, 0x06eb, 0x06f2, 0x06fd, 0x0707, 0x0711, 0x0716, - 0x071c, 0x0722, 0x0730, 0x0742, 0x0751, 0x075b, 0x076d, 0x077a, - 0x0780, 0x0788, 0x079c, 0x07b1, 0x07d1, 0x07da, 0x07e5, 0x07ee, - 0x07f3, 0x080b, 0x0823, 0x082d, 0x0835, 0x083f, 0x0849, 0x0852, - 0x0861, 0x0868, 0x0876, 0x087f, 0x0889, 0x0899, 0x08a3, 0x08aa, - 0x08b0, 0x08b4, 0x08c2, 0x08c7, 0x08cd, 0x08d3, 0x08e8, 0x08fd, - 0x0916, 0x091f, 0x092d, 0x0947, 0x0961, 0x096d, 0x0989, 0x0998, - // Entry C0 - FF - 0x099e, 0x09a8, 0x09ad, 0x09cf, 0x09d7, 0x09e0, 0x09eb, 0x09f2, - 0x09fa, 0x0a0c, 0x0a1d, 0x0a34, 0x0a3a, 0x0a44, 0x0a4e, 0x0a61, - 0x0a6f, 0x0a86, 0x0a93, 0x0aa3, 0x0aad, 0x0ab5, 0x0abe, 0x0ac5, - 0x0ad2, 0x0aeb, 0x0af7, 0x0b03, 0x0b0b, 0x0b21, 0x0b31, 0x0b50, - 0x0b5a, 0x0b77, 0x0b7b, 0x0b8f, 0x0b9c, 0x0ba3, 0x0bae, 0x0bbb, - 0x0bc3, 0x0bc8, 0x0bd0, 0x0be4, 0x0beb, 0x0bf6, 0x0bff, 0x0c09, - 0x0c0f, 0x0c2f, 0x0c2f, 0x0c45, 0x0c4e, 0x0c59, 0x0c6d, 0x0c95, - 0x0ca5, 0x0cc6, 0x0ce5, 0x0cee, 0x0cf5, 0x0d07, 0x0d0e, 0x0d1b, - // Entry 100 - 13F - 0x0d23, 0x0d2a, 0x0d37, 0x0d3f, 0x0d4c, 0x0d69, 0x0d73, 0x0d79, - 0x0d8b, 0x0d9c, 0x0db4, 0x0dc1, 0x0dd3, 0x0de0, 0x0dee, 0x0dfc, - 0x0e0f, 0x0e20, 0x0e38, 0x0e4a, 0x0e57, 0x0e64, 0x0e77, 0x0e8d, - 0x0ea9, 0x0ebc, 0x0ed5, 0x0edf, 0x0ee5, 0x0ef3, 0x0f00, 0x0f0f, - 0x0f25, 0x0f3c, 0x0f52, 0x0f68, - }, - }, - { // gl - "Illa de AscensiónAndorraEmiratos Árabes UnidosAfganistánAntiga e Barbuda" + - "AnguilaAlbaniaArmeniaAngolaAntártidaArxentinaSamoa AmericanaAustriaA" + - "ustraliaArubaIllas AlandAcerbaixánBosnia-HercegovinaBarbadosBangladé" + - "sBélxicaBurkina FasoBulgariaBahrainBurundiBeninSaint-BarthélemyBermu" + - "dasBruneiBoliviaCaribe NeerlandésBrasilBahamasButánIlla BouvetBotsua" + - "naBielorrusiaBeliceCanadáIllas Cocos (Keeling)República Democrática " + - "do CongoRepública CentroafricanaRepública do CongoSuízaCosta do Marf" + - "ilIllas CookChileCamerúnA ChinaColombiaIlla ClippertonCosta RicaCuba" + - "Cabo VerdeCuraçaoIlla de NadalChipreChequiaAlemañaDiego GarcíaDjibut" + - "iDinamarcaDominicaRepública DominicanaAlxeriaCeuta e MelillaEcuadorE" + - "stoniaExiptoSáhara OccidentalEritreaEspañaEtiopíaUnión EuropeaFinlan" + - "diaFidxiIllas MalvinasMicronesiaIllas FeroeFranciaGabónReino UnidoGr" + - "anadaXeorxiaGüiana FrancesaGuernseyGhanaXibraltarGroenlandiaGambiaGu" + - "ineaGuadalupeGuinea EcuatorialGreciaIllas Xeorxia do Sur e Sandwich " + - "do SurGuatemalaGuamGuinea-BisauGüianaHong Kong RAE de ChinaIlla Hear" + - "d e Illas McDonaldHondurasCroaciaHaitíHungríaIllas CanariasIndonesia" + - "IrlandaIsraelIlla de ManA IndiaTerritorio Británico do Océano Índico" + - "IraqIránIslandiaItaliaJerseyXamaicaXordaniaO XapónKenyaQuirguicistán" + - "CamboxaKiribatiComoresSaint Kitts e NevisCorea do NorteCorea do SurK" + - "uwaitIllas CaimánCasaquistánLaosLíbanoSanta LucíaLiechtensteinSri La" + - "nkaLiberiaLesotoLituaniaLuxemburgoLetoniaLibiaMarrocosMónacoMoldavia" + - "MontenegroSaint-MartinMadagascarIllas MarshallMacedoniaMalíMyanmar (" + - "Birmania)MongoliaMacau RAE de ChinaIllas Marianas do NorteMartinicaM" + - "auritaniaMontserratMaltaMauricioMaldivasMalauiMéxicoMalaisiaMozambiq" + - "ueNamibiaNova CaledoniaNíxerIlla NorfolkNixeriaNicaraguaPaíses Baixo" + - "sNoruegaNepalNauruNiueNova ZelandiaOmánPanamáPerúPolinesia FrancesaP" + - "apúa-Nova GuineaFilipinasPaquistánPoloniaSaint Pierre e MiquelonIlla" + - "s PitcairnPorto RicoTerritorios palestinosPortugalPalauParaguaiQatar" + - "Territorios afastados de OceaníaReuniónRomaníaSerbiaRusiaRuandaArabi" + - "a SauditaIllas SalomónSeixelesSudánSueciaSingapurSanta HelenaEsloven" + - "iaSvalbard e Jan MayenEslovaquiaSerra LeoaSan MarinoSenegalSomaliaSu" + - "rinameSudán do surSan Tomé e PríncipeO SalvadorSint MaartenSiriaSuac" + - "ilandiaTristán da CunhaIllas Turks e CaicosChadTerritorios Austrais " + - "FrancesesTogoTailandiaTaxiquistánToquelauTimor LesteTurcomenistánTun" + - "isiaTongaTurquíaTrinidad e TobagoTuvaluTaiwánTanzaniaUcraínaUgandaIl" + - "las Ultramarinas dos EUANacións UnidasEstados Unidos de AméricaUrugu" + - "aiUzbekistánCidade do VaticanoSan Vicente e as GranadinasVenezuelaIl" + - "las Virxes BritánicasIllas Virxes EstadounidensesVietnamVanuatuWalli" + - "s e FutunaSamoaKosovoIemenMayotteSuráfricaZambiaCimbabuerexión desco" + - "ñecidamundoÁfricaNorteaméricaSuraméricaOceaníaÁfrica OccidentalAmér" + - "ica CentralÁfrica OrientalÁfrica SetentrionalÁfrica CentralÁfrica Me" + - "ridionalAméricaAmérica do NorteCaribeAsia OrientalAsia MeridionalSue" + - "ste AsiáticoEuropa MeridionalAustralasiaMelanesiarexión da Micronesi" + - "aPolinesiaAsiaAsia CentralAsia OccidentalEuropaEuropa do LesteEuropa" + - " SetentrionalEuropa OccidentalAmérica Latina", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0012, 0x0019, 0x0030, 0x003b, 0x004b, 0x0052, 0x0059, - 0x0060, 0x0066, 0x0070, 0x0079, 0x0088, 0x008f, 0x0098, 0x009d, - 0x00a8, 0x00b3, 0x00c5, 0x00cd, 0x00d7, 0x00df, 0x00eb, 0x00f3, - 0x00fa, 0x0101, 0x0106, 0x0117, 0x011f, 0x0125, 0x012c, 0x013e, - 0x0144, 0x014b, 0x0151, 0x015c, 0x0164, 0x016f, 0x0175, 0x017c, - 0x0191, 0x01b1, 0x01ca, 0x01dd, 0x01e3, 0x01f2, 0x01fc, 0x0201, - 0x0209, 0x0210, 0x0218, 0x0227, 0x0231, 0x0235, 0x023f, 0x0247, - 0x0254, 0x025a, 0x0261, 0x0269, 0x0276, 0x027d, 0x0286, 0x028e, - // Entry 40 - 7F - 0x02a3, 0x02aa, 0x02b9, 0x02c0, 0x02c7, 0x02cd, 0x02df, 0x02e6, - 0x02ed, 0x02f5, 0x0303, 0x0303, 0x030c, 0x0311, 0x031f, 0x0329, - 0x0334, 0x033b, 0x0341, 0x034c, 0x0353, 0x035a, 0x036a, 0x0372, - 0x0377, 0x0380, 0x038b, 0x0391, 0x0397, 0x03a0, 0x03b1, 0x03b7, - 0x03dd, 0x03e6, 0x03ea, 0x03f6, 0x03fd, 0x0413, 0x042e, 0x0436, - 0x043d, 0x0443, 0x044b, 0x0459, 0x0462, 0x0469, 0x046f, 0x047a, - 0x0481, 0x04a9, 0x04ad, 0x04b2, 0x04ba, 0x04c0, 0x04c6, 0x04cd, - 0x04d5, 0x04dd, 0x04e2, 0x04f0, 0x04f7, 0x04ff, 0x0506, 0x0519, - // Entry 80 - BF - 0x0527, 0x0533, 0x0539, 0x0546, 0x0552, 0x0556, 0x055d, 0x0569, - 0x0576, 0x057f, 0x0586, 0x058c, 0x0594, 0x059e, 0x05a5, 0x05aa, - 0x05b2, 0x05b9, 0x05c1, 0x05cb, 0x05d7, 0x05e1, 0x05ef, 0x05f8, - 0x05fd, 0x060f, 0x0617, 0x0629, 0x0640, 0x0649, 0x0653, 0x065d, - 0x0662, 0x066a, 0x0672, 0x0678, 0x067f, 0x0687, 0x0691, 0x0698, - 0x06a6, 0x06ac, 0x06b8, 0x06bf, 0x06c8, 0x06d6, 0x06dd, 0x06e2, - 0x06e7, 0x06eb, 0x06f8, 0x06fd, 0x0704, 0x0709, 0x071b, 0x072d, - 0x0736, 0x0740, 0x0747, 0x075e, 0x076c, 0x0776, 0x078c, 0x0794, - // Entry C0 - FF - 0x0799, 0x07a1, 0x07a6, 0x07c7, 0x07cf, 0x07d7, 0x07dd, 0x07e2, - 0x07e8, 0x07f6, 0x0804, 0x080c, 0x0812, 0x0818, 0x0820, 0x082c, - 0x0835, 0x0849, 0x0853, 0x085d, 0x0867, 0x086e, 0x0875, 0x087d, - 0x088a, 0x089f, 0x08a9, 0x08b5, 0x08ba, 0x08c5, 0x08d6, 0x08ea, - 0x08ee, 0x090c, 0x0910, 0x0919, 0x0925, 0x092d, 0x0938, 0x0946, - 0x094d, 0x0952, 0x095a, 0x096b, 0x0971, 0x0978, 0x0980, 0x0988, - 0x098e, 0x09a8, 0x09b7, 0x09d1, 0x09d8, 0x09e3, 0x09f5, 0x0a10, - 0x0a19, 0x0a31, 0x0a4d, 0x0a54, 0x0a5b, 0x0a6a, 0x0a6f, 0x0a75, - // Entry 100 - 13F - 0x0a7a, 0x0a81, 0x0a8b, 0x0a91, 0x0a99, 0x0aad, 0x0ab2, 0x0ab9, - 0x0ac6, 0x0ad1, 0x0ad9, 0x0aeb, 0x0afb, 0x0b0b, 0x0b1f, 0x0b2e, - 0x0b40, 0x0b48, 0x0b59, 0x0b5f, 0x0b6c, 0x0b7b, 0x0b8b, 0x0b9c, - 0x0ba7, 0x0bb0, 0x0bc5, 0x0bce, 0x0bd2, 0x0bde, 0x0bed, 0x0bf3, - 0x0c02, 0x0c15, 0x0c26, 0x0c35, - }, - }, - { // gsw - "AndorraVeräinigti Arabischi EmirateAfganischtanAntigua und BarbudaAnguil" + - "laAlbaanieArmeenieAngoolaAntarktisArgentiinieAmerikaanisch-SamoaÖösc" + - "htriichAuschtraalieArubaAaland-InsleAserbäidschanBosnie und Herzegow" + - "inaBarbadosBangladeschBelgieBurkina FaasoBulgaarieBachräinBurundiBen" + - "inSt. BarthelemiBermuudaBrunäi TarussalamBoliivieBrasilieBahaamasBhu" + - "tanBouvet-InsleBotswanaWiissrusslandBelizeKanadaKokos-InsleTemokraat" + - "ischi Republik KongoZentraalafrikaanischi RepublikKongoSchwiizElfebä" + - "iküschteCook-InsleTschileKamerunChiinaKolumbieCoschta RicaKubaKap Ve" + - "rdeWienachts-InsleZypereTschechischi RepublikTüütschlandTschibuutiTä" + - "nemarkTominicaTominikaanischi RepublikAlgeerieEcuadorEestlandÄgüpteW" + - "eschtsaharaÄritreeaSchpanieÄthiopieEuropääischi UnioonFinnlandFitsch" + - "iFalkland-InsleMikroneesieFäröerFrankriichGabunVeräinigts Chönigriic" + - "hGrenadaGeoorgieFranzösisch-GuäjaanaGäärnsiGaanaGibraltarGröönlandGa" + - "mbiaGineeaGuadälupÄquatoriaalgineeaGriechelandSüüdgeorgie und d’süüd" + - "lichi Sändwitsch-InsleGuatemaalaGuamGineea-BissauGuäjaanaSonderverwa" + - "ltigszone HongkongHöörd- und MäcDonald-InsleHondurasKroaazieHaitiUng" + - "arnIndoneesieIrlandIsraelInsle vo MänIndieBritischs Territoorium im " + - "Indische OozeanIraakIraanIislandItaalieDschörsiDschamäikaJordaanieJa" + - "panKeeniaKirgiisischtanKambodschaKiribaatiKomooreSt. Kitts und Niuwi" + - "sDemokraatischi Volksrepublik KoreeaRepublik KoreeaKuwäitKäimän-Insl" + - "eKasachschtanLaaosLibanonSt. LutschiiaLiächteschtäiSchri LankaLibeer" + - "iaLesootoLittaueLuxemburgLettlandLüübieMarokkoMonacoRepublik MoldauM" + - "onteneegroSt. MartinMadagaschkarMarshallinsleMazedoonieMaaliMyanmar " + - "(Burma)MongoleiSonderverwaltigszone MacaoNördlichi MariaaneMartinigg" + - "MauretaanieMoosörratMaltaMauriiziusMalediiweMalaawiMexikoMaläisiaMos" + - "ambikNamiibiaNöikaledoonieNigerNorfolk-InsleNigeeriaNicaraaguaHollan" + - "dNorweegeNeepalNauruNiueNöiseelandOmaanPanamaPeruFranzösisch-Polinee" + - "siePapua-NeuguineaPhilippiinePakischtanPooleSt. Pierr und MiggeloPit" + - "ggäärnPuerto RiggoPaläschtinänsischi GebietPortugalPalauParaguaiGgat" + - "arÜssers OzeaanieReünioonRumäänieSärbieRusslandRuandaSaudi-AraabieSa" + - "lomooneSeischälleSudanSchweedeSingapuurSt. HelenaSloweenieSvalbard u" + - "nd Jaan MääieSlowakäiSierra LeooneSan MariinoSenegalSomaalieSurinamS" + - "ao Tome und PrinssipeEl SalvadorSüürieSwasilandTörks- und Gaiggos-In" + - "sleTschadFranzösischi Süüd- und AntarktisgebietToogoThailandTadschik" + - "ischtanTokelauOschttimorTurkmeenischtanTuneesieTongaTürggeiTrinidad " + - "und TobaagoTuvaluTaiwanTansaniiaUkraiineUgandaAmerikanisch-OzeaanieV" + - "eräinigti SchtaateUruguayUschbeekischtanVatikanstadtSt. Vincent und " + - "d’GrönadiineVenezueelaBritischi Jungfere-InsleAmerikaanischi Jungfer" + - "e-InsleWietnamWanuatuWallis und FutuunaSamooaJeemeMajottSüüdafrikaSa" + - "mbiaSimbabweUnbekannti oder ungültigi RegioonWältAfrikaNordameerikaS" + - "üüdameerikaOzeaanieWeschtafrikaMittelameerikaOschtafrikaNordafrikaZ" + - "entraalafrikaSüüdlichs AfrikaNord-, Mittel- und SüüdameerikaNördlich" + - "s AmeerikaKaribikOschtaasieSüüdaasieSüüdoschtaasieSüüdeuropaAuschtra" + - "alie und NöiseelandMelaneesieMikroneesischs InselgebietPolineesieAas" + - "ieZentraalaasieWeschtaasieEuroopaOschteuroopaNordeuroopaWeschteuroop" + - "aLatiinameerika", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x0024, 0x0030, 0x0043, 0x004b, 0x0053, - 0x005b, 0x0062, 0x006b, 0x0076, 0x0089, 0x0096, 0x00a2, 0x00a7, - 0x00b3, 0x00c1, 0x00d7, 0x00df, 0x00ea, 0x00f0, 0x00fd, 0x0106, - 0x010f, 0x0116, 0x011b, 0x0129, 0x0131, 0x0143, 0x014b, 0x014b, - 0x0153, 0x015b, 0x0161, 0x016d, 0x0175, 0x0182, 0x0188, 0x018e, - 0x0199, 0x01b6, 0x01d4, 0x01d9, 0x01e0, 0x01f0, 0x01fa, 0x0201, - 0x0208, 0x020e, 0x0216, 0x0216, 0x0222, 0x0226, 0x022f, 0x022f, - 0x023e, 0x0244, 0x0259, 0x0266, 0x0266, 0x0270, 0x0279, 0x0281, - // Entry 40 - 7F - 0x0299, 0x02a1, 0x02a1, 0x02a8, 0x02b0, 0x02b8, 0x02c4, 0x02cd, - 0x02d5, 0x02de, 0x02f3, 0x02f3, 0x02fb, 0x0302, 0x0310, 0x031b, - 0x0323, 0x032d, 0x0332, 0x034a, 0x0351, 0x0359, 0x036f, 0x0378, - 0x037d, 0x0386, 0x0391, 0x0397, 0x039d, 0x03a6, 0x03b8, 0x03c3, - 0x03f6, 0x0400, 0x0404, 0x0411, 0x041a, 0x0437, 0x0454, 0x045c, - 0x0464, 0x0469, 0x046f, 0x046f, 0x0479, 0x047f, 0x0485, 0x0492, - 0x0497, 0x04c0, 0x04c5, 0x04ca, 0x04d1, 0x04d8, 0x04e1, 0x04ec, - 0x04f5, 0x04fa, 0x0500, 0x050e, 0x0518, 0x0521, 0x0528, 0x053c, - // Entry 80 - BF - 0x055f, 0x056e, 0x0575, 0x0583, 0x058f, 0x0594, 0x059b, 0x05a8, - 0x05b7, 0x05c2, 0x05ca, 0x05d1, 0x05d8, 0x05e1, 0x05e9, 0x05f1, - 0x05f8, 0x05fe, 0x060d, 0x0618, 0x0622, 0x062e, 0x063b, 0x0645, - 0x064a, 0x0659, 0x0661, 0x067b, 0x068e, 0x0697, 0x06a2, 0x06ac, - 0x06b1, 0x06bb, 0x06c4, 0x06cb, 0x06d1, 0x06da, 0x06e2, 0x06ea, - 0x06f8, 0x06fd, 0x070a, 0x0712, 0x071c, 0x0723, 0x072b, 0x0731, - 0x0736, 0x073a, 0x0745, 0x074a, 0x0750, 0x0754, 0x076b, 0x077a, - 0x0785, 0x078f, 0x0794, 0x07a9, 0x07b4, 0x07c0, 0x07db, 0x07e3, - // Entry C0 - FF - 0x07e8, 0x07f0, 0x07f6, 0x0806, 0x080f, 0x0819, 0x0820, 0x0828, - 0x082e, 0x083b, 0x0844, 0x084f, 0x0854, 0x085c, 0x0865, 0x086f, - 0x0878, 0x0891, 0x089a, 0x08a7, 0x08b2, 0x08b9, 0x08c1, 0x08c8, - 0x08c8, 0x08de, 0x08e9, 0x08e9, 0x08f1, 0x08fa, 0x08fa, 0x0913, - 0x0919, 0x0942, 0x0947, 0x094f, 0x095e, 0x0965, 0x096f, 0x097e, - 0x0986, 0x098b, 0x0993, 0x09a7, 0x09ad, 0x09b3, 0x09bc, 0x09c4, - 0x09ca, 0x09df, 0x09df, 0x09f3, 0x09fa, 0x0a09, 0x0a15, 0x0a34, - 0x0a3e, 0x0a56, 0x0a73, 0x0a7a, 0x0a81, 0x0a93, 0x0a99, 0x0a99, - // Entry 100 - 13F - 0x0a9e, 0x0aa4, 0x0ab0, 0x0ab6, 0x0abe, 0x0ae0, 0x0ae5, 0x0aeb, - 0x0af7, 0x0b05, 0x0b0d, 0x0b19, 0x0b27, 0x0b32, 0x0b3c, 0x0b4a, - 0x0b5c, 0x0b7d, 0x0b90, 0x0b97, 0x0ba1, 0x0bac, 0x0bbc, 0x0bc8, - 0x0be4, 0x0bee, 0x0c08, 0x0c12, 0x0c17, 0x0c24, 0x0c2f, 0x0c36, - 0x0c42, 0x0c4d, 0x0c5a, 0x0c68, - }, - }, - { // gu - guRegionStr, - guRegionIdx, - }, - { // guz - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa ya MarekaniAustriaAustraliaArubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareni" + - "BurundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarusi" + - "BelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya Kat" + - "iKongoUswisiKodivaaVisiwa vya CookChileKameruniChinaKolombiaKostarik" + - "aKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominikaJa" + - "mhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshiUfi" + - "niFijiVisiwa vya FalklandMikronesiaUfaransaGaboniUingerezaGrenadaJoj" + - "iaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGinekw" + - "etaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungariaI" + - "ndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiIra" + - "kiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigizistaniKambodia" + - "KiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaitiV" + - "isiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSirilank" + - "aLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBukini" + - "Visiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya K" + - "askaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksikoM" + - "alesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNikar" + - "agwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia y" + - "a UfaransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitkair" + - "niPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUrenoPa" + - "lauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya SolomonS" + - "helisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera LeoniS" + - "amarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswaz" + - "iVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori " + - "ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuva" + - "luTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibekistaniVatikaniSan" + - "tavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa" + - " vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMa" + - "yotteAfrika KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00b6, 0x00c0, 0x00c8, - 0x00d0, 0x00d7, 0x00dd, 0x00dd, 0x00e4, 0x00ea, 0x00f1, 0x00f1, - 0x00f8, 0x00fe, 0x0104, 0x0104, 0x010c, 0x0114, 0x011a, 0x0120, - 0x0120, 0x0140, 0x0159, 0x015e, 0x0164, 0x016b, 0x017a, 0x017f, - 0x0187, 0x018c, 0x0194, 0x0194, 0x019d, 0x01a1, 0x01a9, 0x01a9, - 0x01a9, 0x01b0, 0x01c0, 0x01c9, 0x01c9, 0x01cf, 0x01d6, 0x01de, - // Entry 40 - 7F - 0x01f1, 0x01f8, 0x01f8, 0x01fe, 0x0205, 0x020a, 0x020a, 0x0211, - 0x0219, 0x0221, 0x0221, 0x0221, 0x0226, 0x022a, 0x023d, 0x0247, - 0x0247, 0x024f, 0x0255, 0x025e, 0x0265, 0x026a, 0x027d, 0x027d, - 0x0282, 0x028a, 0x0293, 0x0299, 0x029d, 0x02a6, 0x02af, 0x02b6, - 0x02b6, 0x02bf, 0x02c3, 0x02cc, 0x02d2, 0x02d2, 0x02d2, 0x02db, - 0x02e2, 0x02e7, 0x02ef, 0x02ef, 0x02f8, 0x0300, 0x0307, 0x0307, - 0x030c, 0x0331, 0x0336, 0x033c, 0x0344, 0x034a, 0x034a, 0x0351, - 0x0358, 0x035e, 0x0363, 0x0370, 0x0378, 0x0380, 0x0386, 0x0399, - // Entry 80 - BF - 0x03a8, 0x03b4, 0x03bb, 0x03cc, 0x03d7, 0x03dc, 0x03e4, 0x03ee, - 0x03f8, 0x0401, 0x0408, 0x040e, 0x0416, 0x041f, 0x0426, 0x042b, - 0x0431, 0x0437, 0x043e, 0x043e, 0x043e, 0x0444, 0x0456, 0x045f, - 0x0463, 0x0468, 0x0470, 0x0470, 0x0490, 0x0499, 0x04a2, 0x04ad, - 0x04b2, 0x04b8, 0x04be, 0x04c4, 0x04cb, 0x04d2, 0x04da, 0x04e1, - 0x04ed, 0x04f3, 0x0504, 0x050b, 0x0514, 0x051c, 0x0521, 0x0527, - 0x052c, 0x0530, 0x053a, 0x053f, 0x0545, 0x0549, 0x055e, 0x0563, - 0x056b, 0x0574, 0x057b, 0x0591, 0x059a, 0x05a3, 0x05d5, 0x05da, - // Entry C0 - FF - 0x05df, 0x05e7, 0x05ed, 0x05ed, 0x05f6, 0x05fd, 0x05fd, 0x0602, - 0x0608, 0x060d, 0x061f, 0x0629, 0x062f, 0x0635, 0x063d, 0x0648, - 0x0650, 0x0650, 0x0658, 0x0663, 0x066b, 0x0673, 0x067a, 0x0682, - 0x0682, 0x0696, 0x069e, 0x069e, 0x06a3, 0x06a9, 0x06a9, 0x06c2, - 0x06c7, 0x06c7, 0x06cb, 0x06d3, 0x06de, 0x06e5, 0x06f8, 0x0707, - 0x070e, 0x0713, 0x071a, 0x072c, 0x0732, 0x0739, 0x0741, 0x0748, - 0x074e, 0x074e, 0x074e, 0x0756, 0x075d, 0x0769, 0x0771, 0x078a, - 0x0793, 0x07b2, 0x07d0, 0x07d9, 0x07e0, 0x07ef, 0x07f4, 0x07f4, - // Entry 100 - 13F - 0x07fa, 0x0801, 0x080e, 0x0814, 0x081c, - }, - }, - { // gv - "Rywvaneth UnysEllan Vannin", - []uint16{ // 112 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x001a, - }, - }, - { // ha - "AndoraHaɗaɗɗiyar Daular LarabawaAfaganistanAntigwa da BarbubaAngilaAlban" + - "iyaArmeniyaAngolaArjantiniyaSamowa Ta AmurkaOstiriyaOstareliyaArubaA" + - "zarbaijanBosniya HarzagobinaBarbadasBangiladasBelgiyomBurkina FasoBu" + - "lgariyaBaharanBurundiBininBarmudaBuruneBolibiyaBirazilBahamasButanBa" + - "swanaBelarusBelizKanadaJamhuriyar Dimokuraɗiyyar KongoJamhuriyar Afi" + - "rka Ta TsakiyaKongoSuwizalanAibari KwasTsibiran KukuCayileKamaruCain" + - "a, SinKolambiyaKwasta RikaKyubaTsibiran Kap BardeSifurusJamhuriyar C" + - "akJamusJibutiDanmarkDominikaJamhuriyar DominikaAljeriyaEkwadorEstoni" + - "yaMasar, MisiraEritireyaSipenHabashaFinlanFijiTsibiran FalkilanMikur" + - "onesiyaFaransaGabonBirtaniyaGirnadaJiwarjiyaGini Ta FaransaGanaJibar" + - "altarGrinlanGambiyaGiniGwadalufGini Ta IkwaitaGirkaGwatamalaGwamGini" + - " BisauGuyanaHondurasKurowaishiyaHaitiHungariIndunusiyaAyalanIziraʼil" + - "aIndiyaYankin Birtaniya Na Tekun IndiyaIraƙiIranAisalanItaliyaJamaik" + - "aJordanJapanKenyaKirgizistanKambodiyaKiribatiKwamorasSan Kiti Da Neb" + - "isKoreya Ta ArewaKoreya Ta KuduKwiyatTsibiran KaimanKazakistanLawasL" + - "abananSan LusiyaLicansitanSiri LankaLaberiyaLesotoLituweniyaLukusamb" + - "urlatibiyaLibiyaMarokoMonakoMaldobaMadagaskarTsibiran MarshalMasedon" + - "iyaMaliBurma, MiyamarMangoliyaTsibiran Mariyana Na ArewaMartinikMori" + - "taniyaManseratiMaltaMoritusMaldibiMalawiMakasikoMalaisiyaMozambikNam" + - "ibiyaKaledoniya SabuwaNijarTsibirin NarfalkNajeriyaNikaraguwaHolanNo" + - "rweNefalNauruNiyuNuzilanOmanPanamaPeruFolinesiya Ta FaransaPapuwa Nu" + - "giniFilipinPakistanPolanSan Piyar Da MikelanPitakarinPorto RikoPalas" + - "ɗinuPortugalPalauParagaiKwatarRawuniyanRomaniyaRashaRuwandaƘasar Ma" + - "kkaTsibiran SalamanSaishalSudanSuwedanSingapurSan HelenaSulobeniyaSu" + - "lobakiyaSalewoSan MarinoSinigalSomaliyaSurinameSawo Tome Da Paransip" + - "El SalbadorSham, SiriyaSuwazilanTurkis Da Tsibiran KaikwasCadiTogoTa" + - "ilanTajikistanTakelauTimor Ta GabasTurkumenistanTunisiyaTangaTurkiyy" + - "aTirinidad Da TobagoTubaluTaiwanTanzaniyaYukaranYugandaAmurkaYurugai" + - "UzubekistanBatikanSan Binsan Da GirnadinBenezuwelaTsibirin Birjin Na" + - " BirtaniyaTsibiran Birjin Ta AmurkaBiyetinamBanuwatuWalis Da FutunaS" + - "amowaYamalMayotiAfirka Ta KuduZambiyaZimbabuwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0023, 0x002e, 0x0040, 0x0046, 0x004e, - 0x0056, 0x005c, 0x005c, 0x0067, 0x0077, 0x007f, 0x0089, 0x008e, - 0x008e, 0x0098, 0x00ab, 0x00b3, 0x00bd, 0x00c5, 0x00d1, 0x00da, - 0x00e1, 0x00e8, 0x00ed, 0x00ed, 0x00f4, 0x00fa, 0x0102, 0x0102, - 0x0109, 0x0110, 0x0115, 0x0115, 0x011c, 0x0123, 0x0128, 0x012e, - 0x012e, 0x014e, 0x016a, 0x016f, 0x0178, 0x0183, 0x0190, 0x0196, - 0x019c, 0x01a6, 0x01af, 0x01af, 0x01ba, 0x01bf, 0x01d1, 0x01d1, - 0x01d1, 0x01d8, 0x01e6, 0x01eb, 0x01eb, 0x01f1, 0x01f8, 0x0200, - // Entry 40 - 7F - 0x0213, 0x021b, 0x021b, 0x0222, 0x022a, 0x0237, 0x0237, 0x0240, - 0x0245, 0x024c, 0x024c, 0x024c, 0x0252, 0x0256, 0x0267, 0x0273, - 0x0273, 0x027a, 0x027f, 0x0288, 0x028f, 0x0298, 0x02a7, 0x02a7, - 0x02ab, 0x02b5, 0x02bc, 0x02c3, 0x02c7, 0x02cf, 0x02de, 0x02e3, - 0x02e3, 0x02ec, 0x02f0, 0x02fa, 0x0300, 0x0300, 0x0300, 0x0308, - 0x0314, 0x0319, 0x0320, 0x0320, 0x032a, 0x0330, 0x033a, 0x033a, - 0x0340, 0x0360, 0x0366, 0x036a, 0x0371, 0x0378, 0x0378, 0x037f, - 0x0385, 0x038a, 0x038f, 0x039a, 0x03a3, 0x03ab, 0x03b3, 0x03c4, - // Entry 80 - BF - 0x03d3, 0x03e1, 0x03e7, 0x03f6, 0x0400, 0x0405, 0x040c, 0x0416, - 0x0420, 0x042a, 0x0432, 0x0438, 0x0442, 0x044c, 0x0454, 0x045a, - 0x0460, 0x0466, 0x046d, 0x046d, 0x046d, 0x0477, 0x0487, 0x0491, - 0x0495, 0x04a3, 0x04ac, 0x04ac, 0x04c6, 0x04ce, 0x04d8, 0x04e1, - 0x04e6, 0x04ed, 0x04f4, 0x04fa, 0x0502, 0x050b, 0x0513, 0x051b, - 0x052c, 0x0531, 0x0541, 0x0549, 0x0553, 0x0558, 0x055d, 0x0562, - 0x0567, 0x056b, 0x0572, 0x0576, 0x057c, 0x0580, 0x0595, 0x05a2, - 0x05a9, 0x05b1, 0x05b6, 0x05ca, 0x05d3, 0x05dd, 0x05e7, 0x05ef, - // Entry C0 - FF - 0x05f4, 0x05fb, 0x0601, 0x0601, 0x060a, 0x0612, 0x0612, 0x0617, - 0x061e, 0x062a, 0x063a, 0x0641, 0x0646, 0x064d, 0x0655, 0x065f, - 0x0669, 0x0669, 0x0673, 0x0679, 0x0683, 0x068a, 0x0692, 0x069a, - 0x069a, 0x06af, 0x06ba, 0x06ba, 0x06c6, 0x06cf, 0x06cf, 0x06e9, - 0x06ed, 0x06ed, 0x06f1, 0x06f7, 0x0701, 0x0708, 0x0716, 0x0723, - 0x072b, 0x0730, 0x0738, 0x074b, 0x0751, 0x0757, 0x0760, 0x0767, - 0x076e, 0x076e, 0x076e, 0x0774, 0x077b, 0x0786, 0x078d, 0x07a3, - 0x07ad, 0x07c9, 0x07e2, 0x07eb, 0x07f3, 0x0802, 0x0808, 0x0808, - // Entry 100 - 13F - 0x080d, 0x0813, 0x0821, 0x0828, 0x0831, - }, - }, - { // haw - "NūhōlaniKanakāKinaKelemāniaKenemakaKepaniaPalaniAupuni Mōʻī Hui Pū ʻIaHe" + - "leneʻIlelaniʻIseraʻelaʻĪniaʻĪkāliaIāpanaMekikoHōlaniAotearoaʻĀina Pi" + - "lipinoLūkiaʻAmelika Hui Pū ʻIa", - []uint16{ // 244 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x001f, 0x001f, 0x001f, 0x0027, 0x0027, - // Entry 40 - 7F - 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, - 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, - 0x002e, 0x0034, 0x0034, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, - 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, - 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x005e, 0x006a, 0x006a, - 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x007b, 0x007b, 0x007b, - 0x007b, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - // Entry 80 - BF - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0088, 0x0088, 0x0088, 0x0088, - 0x0088, 0x0088, 0x0088, 0x0088, 0x0088, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, - 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, - // Entry C0 - FF - 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00ad, - 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, - 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, - 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, - 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, - 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, - 0x00ad, 0x00ad, 0x00ad, 0x00c3, - }, - }, - { // he - heRegionStr, - heRegionIdx, - }, - { // hi - hiRegionStr, - hiRegionIdx, - }, - { // hr - hrRegionStr, - hrRegionIdx, - }, - { // hsb - "AscensionAndorraZjednoćene arabske emiratyAfghanistanAntigua a BarbudaAn" + - "guillaAlbanskaArmenskaAngolaAntarktikaArgentinskaAmeriska SamoaAwstr" + - "iskaAwstralskaArubaÅlandAzerbajdźanBosniska a HercegowinaBarbadosBan" + - "gladešBelgiskaBurkina FasoBołharskaBahrainBurundiBeninSt. Barthélemy" + - "BermudyBruneiBoliwiskaKaribiska NižozemskaBrazilskaBahamyBhutanBouve" + - "towa kupaBotswanaBěłoruskaBelizeKanadaKokosowe kupyKongo-KinshasaCen" + - "tralnoafriska republikaKongo-BrazzavilleŠwicarskaCôte d’IvoireCookow" + - "e kupyChilskaKamerunChinaKolumbiskaClippertonowa kupaKosta RikaKubaK" + - "ap VerdeCuraçaoHodowna kupaCypernČěska republikaNěmskaDiego GarciaDź" + - "ibutiDanskaDominikaDominikanska republikaAlgeriskaCeuta a MelillaEkw" + - "adorEstiskaEgyptowskaZapadna SaharaEritrejaŠpaniskaEtiopiskaEuropska" + - " unijaFinskaFidźiFalklandske kupyMikroneziskaFäröske kupyFrancoskaGa" + - "bunZjednoćene kralestwoGrenadaGeorgiskaFrancoska GuyanaGuernseyGhana" + - "GibraltarGrönlandskaGambijaGinejaGuadeloupeEkwatorialna GinejaGrjeks" + - "kaJužna Georgiska a Južne Sandwichowe kupyGuatemalaGuamGineja-Bissau" + - "GuyanaWosebita zarjadniska cona HongkongHeardowa kupa a McDonaldowe " + - "kupyHondurasChorwatskaHaitiMadźarskaKanariske kupyIndoneskaIrskaIsra" + - "elManIndiskaBritiski teritorij w Indiskim oceanjeIrakIranIslandskaIt" + - "alskaJerseyJamaikaJordaniskaJapanskaKenijaKirgizistanKambodźaKiribat" + - "iKomorySt. Kitts a NevisSewjerna KorejaJužna KorejaKuwaitKajmanske k" + - "upyKazachstanLaosLibanonSt. LuciaLiechtensteinSri LankaLiberijaLesot" + - "hoLitawskaLuxemburgskaLetiskaLibyskaMarokkoMonacoMoldawskaMontenegro" + - "St. MartinMadagaskarMarshallowe kupyMakedonskaMaliMyanmarMongolskaWo" + - "sebita zarjadniska cona MacaoSewjerne MarianyMartiniqueMawretanskaMo" + - "ntserratMaltaMauritiusMalediwyMalawiMexikoMalajzijaMosambikNamibijaN" + - "owa KaledoniskaNigerNorfolkowa kupaNigerijaNikaraguaNižozemskaNorweg" + - "skaNepalNauruNiueNowoseelandskaOmanPanamaPeruFrancoska PolyneziskaPa" + - "puwa-Nowa GinejaFilipinyPakistanPólskaSt. Pierre a MiquelonPitcairno" + - "we kupyPuerto RicoPalestinski awtonomny teritorijPortugalskaPalauPar" + - "aguayKatarWonkowna OceaniskaRéunionRumunskaSerbiskaRuskaRuandaSawdi-" + - "ArabskaSalomonySeychelleSudanŠwedskaSingapurSt. HelenaSłowjenskaSval" + - "bard a Jan MayenSłowakskaSierra LeoneSan MarinoSenegalSomalijaSurina" + - "mJužny SudanSão Tomé a PríncipeEl SalvadorSint MaartenSyriskaSwazisk" + - "aTristan da Cunhakupy Turks a CaicosČadFrancoski južny a antarktiski" + - " teritorijTogoThailandskaTadźikistanTokelauTimor-LesteTurkmeniskaTun" + - "eziskaTongaTurkowskaTrinidad a TobagoTuvaluTaiwanTansanijaUkrainaUga" + - "ndaAmeriska OceaniskaZjednoćene staty AmerikiUruguayUzbekistanVatika" + - "nske městoSt. Vincent a GrenadinyVenezuelaBritiske knježniske kupyAm" + - "eriske knježniske kupyVietnamVanuatuWallis a FutunaSamoaKosowoJemenM" + - "ayotteJužna Afrika (Republika)SambijaSimbabwenjeznaty regionswětAfri" + - "kaSewjerna AmerikaJužna AmerikaOceaniskazapadna AfrikaSrjedźna Ameri" + - "kawuchodna Afrikasewjerna Afrikasrjedźna Afrikajužna AfrikaAmerikase" + - "wjerny ameriski kontinentKaribikawuchodna Azijajužna Azijajuhowuchod" + - "na Azijajužna EuropaAwstralazijaMelaneziskaMikroneziska (kupowy regi" + - "on)PolyneziskaAzijacentralna Azijazapadna AzijaEuropawuchodna Europa" + - "sewjerna Europazapadna EuropaŁaćonska Amerika", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002b, 0x0036, 0x0047, 0x004f, 0x0057, - 0x005f, 0x0065, 0x006f, 0x007a, 0x0088, 0x0091, 0x009b, 0x00a0, - 0x00a6, 0x00b2, 0x00c8, 0x00d0, 0x00da, 0x00e2, 0x00ee, 0x00f8, - 0x00ff, 0x0106, 0x010b, 0x011a, 0x0121, 0x0127, 0x0130, 0x0145, - 0x014e, 0x0154, 0x015a, 0x0168, 0x0170, 0x017b, 0x0181, 0x0187, - 0x0194, 0x01a2, 0x01bc, 0x01cd, 0x01d7, 0x01e7, 0x01f3, 0x01fa, - 0x0201, 0x0206, 0x0210, 0x0222, 0x022c, 0x0230, 0x0239, 0x0241, - 0x024d, 0x0253, 0x0264, 0x026b, 0x0277, 0x027f, 0x0285, 0x028d, - // Entry 40 - 7F - 0x02a3, 0x02ac, 0x02bb, 0x02c2, 0x02c9, 0x02d3, 0x02e1, 0x02e9, - 0x02f2, 0x02fb, 0x0309, 0x0309, 0x030f, 0x0315, 0x0325, 0x0331, - 0x033f, 0x0348, 0x034d, 0x0362, 0x0369, 0x0372, 0x0382, 0x038a, - 0x038f, 0x0398, 0x03a4, 0x03ab, 0x03b1, 0x03bb, 0x03ce, 0x03d6, - 0x0400, 0x0409, 0x040d, 0x041a, 0x0420, 0x0442, 0x0462, 0x046a, - 0x0474, 0x0479, 0x0483, 0x0491, 0x049a, 0x049f, 0x04a5, 0x04a8, - 0x04af, 0x04d4, 0x04d8, 0x04dc, 0x04e5, 0x04ec, 0x04f2, 0x04f9, - 0x0503, 0x050b, 0x0511, 0x051c, 0x0525, 0x052d, 0x0533, 0x0544, - // Entry 80 - BF - 0x0553, 0x0560, 0x0566, 0x0574, 0x057e, 0x0582, 0x0589, 0x0592, - 0x059f, 0x05a8, 0x05b0, 0x05b7, 0x05bf, 0x05cb, 0x05d2, 0x05d9, - 0x05e0, 0x05e6, 0x05ef, 0x05f9, 0x0603, 0x060d, 0x061d, 0x0627, - 0x062b, 0x0632, 0x063b, 0x065a, 0x066a, 0x0674, 0x067f, 0x0689, - 0x068e, 0x0697, 0x069f, 0x06a5, 0x06ab, 0x06b4, 0x06bc, 0x06c4, - 0x06d4, 0x06d9, 0x06e8, 0x06f0, 0x06f9, 0x0704, 0x070d, 0x0712, - 0x0717, 0x071b, 0x0729, 0x072d, 0x0733, 0x0737, 0x074c, 0x075e, - 0x0766, 0x076e, 0x0775, 0x078a, 0x079a, 0x07a5, 0x07c4, 0x07cf, - // Entry C0 - FF - 0x07d4, 0x07dc, 0x07e1, 0x07f3, 0x07fb, 0x0803, 0x080b, 0x0810, - 0x0816, 0x0823, 0x082b, 0x0834, 0x0839, 0x0841, 0x0849, 0x0853, - 0x085e, 0x0872, 0x087c, 0x0888, 0x0892, 0x0899, 0x08a1, 0x08a8, - 0x08b4, 0x08ca, 0x08d5, 0x08e1, 0x08e8, 0x08f0, 0x0900, 0x0913, - 0x0917, 0x093f, 0x0943, 0x094e, 0x095a, 0x0961, 0x096c, 0x0977, - 0x0980, 0x0985, 0x098e, 0x099f, 0x09a5, 0x09ab, 0x09b4, 0x09bb, - 0x09c1, 0x09d3, 0x09d3, 0x09ec, 0x09f3, 0x09fd, 0x0a0e, 0x0a25, - 0x0a2e, 0x0a47, 0x0a60, 0x0a67, 0x0a6e, 0x0a7d, 0x0a82, 0x0a88, - // Entry 100 - 13F - 0x0a8d, 0x0a94, 0x0aad, 0x0ab4, 0x0abc, 0x0acb, 0x0ad0, 0x0ad6, - 0x0ae6, 0x0af4, 0x0afd, 0x0b0b, 0x0b1c, 0x0b2b, 0x0b3a, 0x0b4a, - 0x0b57, 0x0b5e, 0x0b79, 0x0b81, 0x0b8f, 0x0b9b, 0x0bad, 0x0bba, - 0x0bc6, 0x0bd1, 0x0bed, 0x0bf8, 0x0bfd, 0x0c0c, 0x0c19, 0x0c1f, - 0x0c2e, 0x0c3d, 0x0c4b, 0x0c5d, - }, - }, - { // hu - huRegionStr, - huRegionIdx, - }, - { // hy - hyRegionStr, - hyRegionIdx, - }, - { // id - idRegionStr, - idRegionIdx, - }, - { // ig - "BininBemudaChainaHatiComorosuLibyiaMaldivesaNigeria", - []uint16{ // 172 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0005, 0x0005, 0x000b, 0x000b, 0x000b, 0x000b, - 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, - 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, - 0x000b, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - // Entry 40 - 7F - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, - 0x0011, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001d, 0x001d, - // Entry 80 - BF - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, - 0x0023, 0x0023, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x0033, - }, - }, - { // ii - "ꀠꑭꍏꇩꄓꇩꃔꇩꑱꇩꑴꄗꑴꄊꆺꏝꀪꊉꇆꌦꂰꇩꃅꄷꅉꀋꐚꌠ", - []uint16{ // 262 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - // Entry 40 - 7F - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x0018, 0x0018, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x002d, 0x002d, 0x002d, - 0x002d, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - // Entry 80 - BF - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, - // Entry C0 - FF - 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, - // Entry 100 - 13F - 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0054, - }, - }, - { // is - isRegionStr, - isRegionIdx, - }, - { // it - itRegionStr, - itRegionIdx, - }, - { // ja - jaRegionStr, - jaRegionIdx, - }, - { // jgo - "Aŋgɔ́laAjɛntînMbulukína FásɔMbulundíMbɛnɛ̂ŋMbɔlivîMbɛlazîlMbɔtswánaKanad" + - "âKɔ́ŋgɔ-KinshásaKɔ́ŋgɔ-MbɛlazavîlSẅísɛKɔ́t NdivwâCíllɛKamɛlûnShînKɔ" + - "llɔmbîKúbaNjámanNjimbútiAljɛlîƐkwandɔ̂ƐjíptɛƐlitɛlɛ́yaƐspániyaƐtiyɔp" + - "îFɛlánciŊgabɔ̂ŋŊgánaŊgambîŊginɛ̂Ŋginɛ̂ ƐkwatɔliyâlŊgɛlɛ̂kŊginɛ̂ Mbi" + - "sáwuIslayɛ̂lÁndɛIlâkItalîJapɔ̂nKɛ́nyaKɔmɔ́lɔshiLibɛrîLɛsɔ́tɔLibîMɔlɔ" + - "̂kMándaŋgasɛkâMalîMɔlitanîMaláwiMɛksîkMɔzambîkNamimbîNijɛ̂Ninjɛliyâ" + - "Nɔlɛvɛ́jɛPɛlûLɛ́uniyɔ̂nSɛlɛbîLusîLuwándaPɛsɛ́shɛlSundânSiyɛ́la Lɛɔ̂n" + - "SɛnɛgâlSɔmalîSáwɔŋ Tɔmɛ́ nɛ́ PɛlínsipɛSwazilânCâtTɔ́ŋgɔTunizîTanzanî" + - "UŋgándaVɛnɛzwɛ́laMayɔ̂tZambîZimbámbwɛŋgɔŋ yi pɛ́ ká kɛ́ jʉɔMbíAfɛlîk" + - "AmɛlîkAzîɄlôp", - []uint16{ // 288 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x000a, 0x000a, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, - 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0024, 0x0024, - 0x0024, 0x002d, 0x0038, 0x0038, 0x0038, 0x0038, 0x0041, 0x0041, - 0x004b, 0x004b, 0x004b, 0x004b, 0x0056, 0x0056, 0x0056, 0x005d, - 0x005d, 0x0071, 0x0071, 0x0088, 0x0091, 0x009f, 0x009f, 0x00a6, - 0x00af, 0x00b4, 0x00bf, 0x00bf, 0x00bf, 0x00c4, 0x00c4, 0x00c4, - 0x00c4, 0x00c4, 0x00c4, 0x00cb, 0x00cb, 0x00d4, 0x00d4, 0x00d4, - // Entry 40 - 7F - 0x00d4, 0x00dc, 0x00dc, 0x00e7, 0x00e7, 0x00f0, 0x00f0, 0x00fe, - 0x0108, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, - 0x0112, 0x011b, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, - 0x012d, 0x012d, 0x012d, 0x0135, 0x013e, 0x013e, 0x0156, 0x0161, - 0x0161, 0x0161, 0x0161, 0x0173, 0x0173, 0x0173, 0x0173, 0x0173, - 0x0173, 0x0173, 0x0173, 0x0173, 0x0173, 0x0173, 0x017d, 0x017d, - 0x0183, 0x0183, 0x0188, 0x0188, 0x0188, 0x018e, 0x018e, 0x018e, - 0x018e, 0x0196, 0x019e, 0x019e, 0x019e, 0x019e, 0x01ac, 0x01ac, - // Entry 80 - BF - 0x01ac, 0x01ac, 0x01ac, 0x01ac, 0x01ac, 0x01ac, 0x01ac, 0x01ac, - 0x01ac, 0x01ac, 0x01b4, 0x01bf, 0x01bf, 0x01bf, 0x01bf, 0x01c4, - 0x01cd, 0x01cd, 0x01cd, 0x01cd, 0x01cd, 0x01dd, 0x01dd, 0x01dd, - 0x01e2, 0x01e2, 0x01e2, 0x01e2, 0x01e2, 0x01e2, 0x01ec, 0x01ec, - 0x01ec, 0x01ec, 0x01ec, 0x01f3, 0x01fb, 0x01fb, 0x0205, 0x020d, - 0x020d, 0x0214, 0x0214, 0x021f, 0x021f, 0x021f, 0x022d, 0x022d, - 0x022d, 0x022d, 0x022d, 0x022d, 0x022d, 0x0233, 0x0233, 0x0233, - 0x0233, 0x0233, 0x0233, 0x0233, 0x0233, 0x0233, 0x0233, 0x0233, - // Entry C0 - FF - 0x0233, 0x0233, 0x0233, 0x0233, 0x0241, 0x0241, 0x024a, 0x024f, - 0x0257, 0x0257, 0x0257, 0x0264, 0x026b, 0x026b, 0x026b, 0x026b, - 0x026b, 0x026b, 0x026b, 0x027d, 0x027d, 0x0287, 0x028f, 0x028f, - 0x028f, 0x02b3, 0x02b3, 0x02b3, 0x02b3, 0x02bc, 0x02bc, 0x02bc, - 0x02c0, 0x02c0, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, - 0x02d1, 0x02d1, 0x02d1, 0x02d1, 0x02d1, 0x02d1, 0x02d9, 0x02d9, - 0x02e2, 0x02e2, 0x02e2, 0x02e2, 0x02e2, 0x02e2, 0x02e2, 0x02e2, - 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, - // Entry 100 - 13F - 0x02f0, 0x02f8, 0x02f8, 0x02fe, 0x0309, 0x0329, 0x032d, 0x0335, - 0x0335, 0x0335, 0x0335, 0x0335, 0x0335, 0x0335, 0x0335, 0x0335, - 0x0335, 0x033d, 0x033d, 0x033d, 0x033d, 0x033d, 0x033d, 0x033d, - 0x033d, 0x033d, 0x033d, 0x033d, 0x0341, 0x0341, 0x0341, 0x0347, - }, - }, - { // jmc - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa ya MarekaniAustriaAustraliaArubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareni" + - "BurundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarusi" + - "BelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya Kat" + - "iKongoUswisiKodivaaVisiwa vya CookChileKameruniChinaKolombiaKostarik" + - "aKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominikaJa" + - "mhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshiUfi" + - "niFijiVisiwa vya FalklandMikronesiaUfaransaGaboniUingerezaGrenadaJoj" + - "iaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGinekw" + - "etaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungariaI" + - "ndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiIra" + - "kiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigizistaniKambodia" + - "KiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaitiV" + - "isiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSirilank" + - "aLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBukini" + - "Visiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya K" + - "askaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksikoM" + - "alesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNikar" + - "agwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia y" + - "a UfaransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitkair" + - "niPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUrenoPa" + - "lauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya SolomonS" + - "helisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera LeoniS" + - "amarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswaz" + - "iVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori " + - "ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuva" + - "luTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibekistaniVatikaniSan" + - "tavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa" + - " vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMa" + - "yotteAfrika KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00b6, 0x00c0, 0x00c8, - 0x00d0, 0x00d7, 0x00dd, 0x00dd, 0x00e4, 0x00ea, 0x00f1, 0x00f1, - 0x00f8, 0x00fe, 0x0104, 0x0104, 0x010c, 0x0114, 0x011a, 0x0120, - 0x0120, 0x0140, 0x0159, 0x015e, 0x0164, 0x016b, 0x017a, 0x017f, - 0x0187, 0x018c, 0x0194, 0x0194, 0x019d, 0x01a1, 0x01a9, 0x01a9, - 0x01a9, 0x01b0, 0x01c0, 0x01c9, 0x01c9, 0x01cf, 0x01d6, 0x01de, - // Entry 40 - 7F - 0x01f1, 0x01f8, 0x01f8, 0x01fe, 0x0205, 0x020a, 0x020a, 0x0211, - 0x0219, 0x0221, 0x0221, 0x0221, 0x0226, 0x022a, 0x023d, 0x0247, - 0x0247, 0x024f, 0x0255, 0x025e, 0x0265, 0x026a, 0x027d, 0x027d, - 0x0282, 0x028a, 0x0293, 0x0299, 0x029d, 0x02a6, 0x02af, 0x02b6, - 0x02b6, 0x02bf, 0x02c3, 0x02cc, 0x02d2, 0x02d2, 0x02d2, 0x02db, - 0x02e2, 0x02e7, 0x02ef, 0x02ef, 0x02f8, 0x0300, 0x0307, 0x0307, - 0x030c, 0x0331, 0x0336, 0x033c, 0x0344, 0x034a, 0x034a, 0x0351, - 0x0358, 0x035e, 0x0363, 0x0370, 0x0378, 0x0380, 0x0386, 0x0399, - // Entry 80 - BF - 0x03a8, 0x03b4, 0x03bb, 0x03cc, 0x03d7, 0x03dc, 0x03e4, 0x03ee, - 0x03f8, 0x0401, 0x0408, 0x040e, 0x0416, 0x041f, 0x0426, 0x042b, - 0x0431, 0x0437, 0x043e, 0x043e, 0x043e, 0x0444, 0x0456, 0x045f, - 0x0463, 0x0468, 0x0470, 0x0470, 0x0490, 0x0499, 0x04a2, 0x04ad, - 0x04b2, 0x04b8, 0x04be, 0x04c4, 0x04cb, 0x04d2, 0x04da, 0x04e1, - 0x04ed, 0x04f3, 0x0504, 0x050b, 0x0514, 0x051c, 0x0521, 0x0527, - 0x052c, 0x0530, 0x053a, 0x053f, 0x0545, 0x0549, 0x055e, 0x0563, - 0x056b, 0x0574, 0x057b, 0x0591, 0x059a, 0x05a3, 0x05d5, 0x05da, - // Entry C0 - FF - 0x05df, 0x05e7, 0x05ed, 0x05ed, 0x05f6, 0x05fd, 0x05fd, 0x0602, - 0x0608, 0x060d, 0x061f, 0x0629, 0x062f, 0x0635, 0x063d, 0x0648, - 0x0650, 0x0650, 0x0658, 0x0663, 0x066b, 0x0673, 0x067a, 0x0682, - 0x0682, 0x0696, 0x069e, 0x069e, 0x06a3, 0x06a9, 0x06a9, 0x06c2, - 0x06c7, 0x06c7, 0x06cb, 0x06d3, 0x06de, 0x06e5, 0x06f8, 0x0707, - 0x070e, 0x0713, 0x071a, 0x072c, 0x0732, 0x0739, 0x0741, 0x0748, - 0x074e, 0x074e, 0x074e, 0x0756, 0x075d, 0x0769, 0x0771, 0x078a, - 0x0793, 0x07b2, 0x07d0, 0x07d9, 0x07e0, 0x07ef, 0x07f4, 0x07f4, - // Entry 100 - 13F - 0x07fa, 0x0801, 0x080e, 0x0814, 0x081c, - }, - }, - { // ka - kaRegionStr, - kaRegionIdx, - }, - { // kab - "UnduraTigeldunin Yedduklen TaɛrabinAfɣanistanUntiga d BarbudaUngiyaLalba" + - "niArminyaUngulaArjuntinSamwa TamarikanitUstriyaUstraliArubaAzrabijan" + - "Busna d HersekBarbadusBangladacBelǧikBurkina FasuBulgariBaḥrinBurand" + - "iBininBermudaBruneyBuliviBrizilBahamasBhutanBustwanaBilarusBilizKana" + - "daTigduda Tagdudant n KunguTigduda n Tefriqt TalemmastKunguSwisKuṭ D" + - "ivwarTigzirin n KukCiliKamirunLacinKulumbiKusta RikaKubaTigzirin n y" + - "ixef azegzawCiprČčekLalmanǦibutiDenmarkDuminikTigduda TaduminikitLez" + - "zayerIkwaṭurIstunyaMaṣrIritiriaSpanyaUtyupiFinlundFijiTigzirin n Fal" + - "klandMikrunizyaFransaGabunTagelda YedduklenGrunadJiyurjiƔana tafrans" + - "istƔanaJibraltarGrunlandGambyaƔinyaGwadalupiƔinya TasebgastLagrisGwa" + - "timalaGwamƔinya-BisawGuwanaHundurasKerwasyaHaytiHungriInduniziLirlun" + - "dIzrayilLhendAkal Aglizi deg Ugaraw AhendiLɛiraqIranIslandṬelyanJamy" + - "ikaLajurdaniJappuKinyaKirigistanCambudyaKiribatiKumurSan Kits d Nivi" + - "sKurya, UfellaKurya, WaddaKuwaytTigzirin n KamyanKazaxistanLawsLubna" + - "nSan LučyaLayctenstanSri LankaLibiryaLizuṭuLiṭwanyaLuksamburgLatviaL" + - "ibyaLmerrukMunakuMuldabiMadaɣecqerTigzirin n MarcalMasidwanMaliMyanm" + - "arMungulyaTigzirin n Maryan UfellaMartinikMuriṭanyaMunsiratMalṭMuris" + - "MaldibMalawiMeksikMalizyaMuzembiqNamibyaKalidunya TamaynutNijerTigzi" + - "rin TinawfukinNijiryaNikaragwaTimura-YessakesrenNurvijNipalNuruNiwiZ" + - "iland TamaynutƐumanPanamPiruPulunizi tafransistƔinya Tamaynut Tapapu" + - "tFilipinPakistanPulundSan Pyar d MiklunPitkarinPurtu RikuFalisṭin d " + - "ƔezzaPurtugalPaluParagwayQaṭarTimlilitRumaniRrusRuwandaSuɛudiya Taɛ" + - "rabtTigzirin n SulumunSeycelSudanSwidSingafurSant IlinaSluvinyaSluva" + - "kyaSira LyunSan MarinuSinigalṢumalSurinamSaw Tumi d PransipSalvadurS" + - "uryaSwazilundṬurk d Tegzirin n KaykusČadṬuguṬaylandTajikistanṬukluTu" + - "mur AsamarṬurkmanistanTunesṬungaṬurkṬrindad d ṬubaguṬuvaluṬaywanṬanz" + - "anyaUkranUɣandaWDMUrugwayUzbaxistanAwanek n VatikanSan Vansu d Gruna" + - "dinVenzwilaTigzirin Tiverjiniyin TigliziyinW.D. Tigzirin n VirginyaV" + - "yeṭnamVanwatuWallis d FutunaSamwaLyamenMayuṭTafriqt WaddaZambyaZimba" + - "bwi", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0024, 0x002f, 0x003f, 0x0045, 0x004c, - 0x0053, 0x0059, 0x0059, 0x0061, 0x0072, 0x0079, 0x0080, 0x0085, - 0x0085, 0x008e, 0x009c, 0x00a4, 0x00ad, 0x00b4, 0x00c0, 0x00c7, - 0x00cf, 0x00d6, 0x00db, 0x00db, 0x00e2, 0x00e8, 0x00ee, 0x00ee, - 0x00f4, 0x00fb, 0x0101, 0x0101, 0x0109, 0x0110, 0x0115, 0x011b, - 0x011b, 0x0134, 0x014f, 0x0154, 0x0158, 0x0164, 0x0172, 0x0176, - 0x017d, 0x0182, 0x0189, 0x0189, 0x0193, 0x0197, 0x01af, 0x01af, - 0x01af, 0x01b3, 0x01b9, 0x01bf, 0x01bf, 0x01c6, 0x01cd, 0x01d4, - // Entry 40 - 7F - 0x01e7, 0x01ef, 0x01ef, 0x01f8, 0x01ff, 0x0205, 0x0205, 0x020d, - 0x0213, 0x0219, 0x0219, 0x0219, 0x0220, 0x0224, 0x0237, 0x0241, - 0x0241, 0x0247, 0x024c, 0x025d, 0x0263, 0x026a, 0x027a, 0x027a, - 0x027f, 0x0288, 0x0290, 0x0296, 0x029c, 0x02a5, 0x02b5, 0x02bb, - 0x02bb, 0x02c4, 0x02c8, 0x02d4, 0x02da, 0x02da, 0x02da, 0x02e2, - 0x02ea, 0x02ef, 0x02f5, 0x02f5, 0x02fd, 0x0304, 0x030b, 0x030b, - 0x0310, 0x032d, 0x0334, 0x0338, 0x033e, 0x0346, 0x0346, 0x034d, - 0x0356, 0x035b, 0x0360, 0x036a, 0x0372, 0x037a, 0x037f, 0x038f, - // Entry 80 - BF - 0x039c, 0x03a8, 0x03ae, 0x03bf, 0x03c9, 0x03cd, 0x03d3, 0x03dd, - 0x03e8, 0x03f1, 0x03f8, 0x0400, 0x040a, 0x0414, 0x041a, 0x041f, - 0x0426, 0x042c, 0x0433, 0x0433, 0x0433, 0x043e, 0x044f, 0x0457, - 0x045b, 0x0462, 0x046a, 0x046a, 0x0482, 0x048a, 0x0495, 0x049d, - 0x04a3, 0x04a8, 0x04ae, 0x04b4, 0x04ba, 0x04c1, 0x04c9, 0x04d0, - 0x04e2, 0x04e7, 0x04fa, 0x0501, 0x050a, 0x051c, 0x0522, 0x0527, - 0x052b, 0x052f, 0x053e, 0x0544, 0x0549, 0x054d, 0x0560, 0x0577, - 0x057e, 0x0586, 0x058c, 0x059d, 0x05a5, 0x05af, 0x05c2, 0x05ca, - // Entry C0 - FF - 0x05ce, 0x05d6, 0x05dd, 0x05dd, 0x05e5, 0x05eb, 0x05eb, 0x05ef, - 0x05f6, 0x0608, 0x061a, 0x0620, 0x0625, 0x0629, 0x0631, 0x063b, - 0x0643, 0x0643, 0x064b, 0x0654, 0x065e, 0x0665, 0x066c, 0x0673, - 0x0673, 0x0685, 0x068d, 0x068d, 0x0692, 0x069b, 0x069b, 0x06b5, - 0x06b9, 0x06b9, 0x06bf, 0x06c8, 0x06d2, 0x06d9, 0x06e5, 0x06f3, - 0x06f8, 0x06ff, 0x0705, 0x0719, 0x0721, 0x0729, 0x0733, 0x0738, - 0x073f, 0x073f, 0x073f, 0x0742, 0x0749, 0x0753, 0x0763, 0x0777, - 0x077f, 0x079f, 0x07b7, 0x07c0, 0x07c7, 0x07d6, 0x07db, 0x07db, - // Entry 100 - 13F - 0x07e1, 0x07e8, 0x07f5, 0x07fb, 0x0803, - }, - }, - { // kam - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa ya MarekaniAustriaAustraliaArubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareni" + - "MbulundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarus" + - "iBelizeKanandaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya K" + - "atiKongoUswisiKodivaaIsiwa sya CookChileKameluniKyainaKolombiaKostar" + - "ikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominika" + - "Jamhuri ya DominikaAljeriaEkwadoEstoniaMisiliEritreaHispaniaUhabeshi" + - "UfiniFijiVisiwa vya FalklandMikronesiaUvalanzaGaboniUingerezaGrenada" + - "JojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGin" + - "ekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungar" + - "iaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari Hindi" + - "IrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigizistaniKambo" + - "diaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwai" + - "tiIsiwa sya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSirila" + - "nkaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBuki" + - "niVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya" + - " KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksik" + - "oMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNik" + - "aragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia" + - " ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitka" + - "irniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUreno" + - "PalauParagwaiKatariRiyunioniRomaniaUrusiLwandaSaudiIsiwa sya Solomon" + - "ShelisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera Leoni" + - "SamarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswa" + - "ziVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori" + - " ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuv" + - "aluTaiwaniTanzaniaUkrainiUkandaMarekaniUrugwaiUzibekistaniVatikaniSa" + - "ntavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiw" + - "a vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniM" + - "ayotteAfrika KusiniNzambiaNzimbambwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00b6, 0x00c0, 0x00c8, - 0x00d0, 0x00d8, 0x00de, 0x00de, 0x00e5, 0x00eb, 0x00f2, 0x00f2, - 0x00f9, 0x00ff, 0x0105, 0x0105, 0x010d, 0x0115, 0x011b, 0x0122, - 0x0122, 0x0142, 0x015b, 0x0160, 0x0166, 0x016d, 0x017b, 0x0180, - 0x0188, 0x018e, 0x0196, 0x0196, 0x019f, 0x01a3, 0x01ab, 0x01ab, - 0x01ab, 0x01b2, 0x01c2, 0x01cb, 0x01cb, 0x01d1, 0x01d8, 0x01e0, - // Entry 40 - 7F - 0x01f3, 0x01fa, 0x01fa, 0x0200, 0x0207, 0x020d, 0x020d, 0x0214, - 0x021c, 0x0224, 0x0224, 0x0224, 0x0229, 0x022d, 0x0240, 0x024a, - 0x024a, 0x0252, 0x0258, 0x0261, 0x0268, 0x026d, 0x0280, 0x0280, - 0x0285, 0x028d, 0x0296, 0x029c, 0x02a0, 0x02a9, 0x02b2, 0x02b9, - 0x02b9, 0x02c2, 0x02c6, 0x02cf, 0x02d5, 0x02d5, 0x02d5, 0x02de, - 0x02e5, 0x02ea, 0x02f2, 0x02f2, 0x02fb, 0x0303, 0x030a, 0x030a, - 0x030f, 0x0334, 0x0339, 0x033f, 0x0347, 0x034d, 0x034d, 0x0354, - 0x035b, 0x0361, 0x0366, 0x0373, 0x037b, 0x0383, 0x0389, 0x039c, - // Entry 80 - BF - 0x03ab, 0x03b7, 0x03be, 0x03ce, 0x03d9, 0x03de, 0x03e6, 0x03f0, - 0x03fa, 0x0403, 0x040a, 0x0410, 0x0418, 0x0421, 0x0428, 0x042d, - 0x0433, 0x0439, 0x0440, 0x0440, 0x0440, 0x0446, 0x0458, 0x0461, - 0x0465, 0x046a, 0x0472, 0x0472, 0x0492, 0x049b, 0x04a4, 0x04af, - 0x04b4, 0x04ba, 0x04c0, 0x04c6, 0x04cd, 0x04d4, 0x04dc, 0x04e3, - 0x04ef, 0x04f5, 0x0506, 0x050d, 0x0516, 0x051e, 0x0523, 0x0529, - 0x052e, 0x0532, 0x053c, 0x0541, 0x0547, 0x054b, 0x0560, 0x0565, - 0x056d, 0x0576, 0x057d, 0x0593, 0x059c, 0x05a5, 0x05d7, 0x05dc, - // Entry C0 - FF - 0x05e1, 0x05e9, 0x05ef, 0x05ef, 0x05f8, 0x05ff, 0x05ff, 0x0604, - 0x060a, 0x060f, 0x0620, 0x062a, 0x0630, 0x0636, 0x063e, 0x0649, - 0x0651, 0x0651, 0x0659, 0x0664, 0x066c, 0x0674, 0x067b, 0x0683, - 0x0683, 0x0697, 0x069f, 0x069f, 0x06a4, 0x06aa, 0x06aa, 0x06c3, - 0x06c8, 0x06c8, 0x06cc, 0x06d4, 0x06df, 0x06e6, 0x06f9, 0x0708, - 0x070f, 0x0714, 0x071b, 0x072d, 0x0733, 0x073a, 0x0742, 0x0749, - 0x074f, 0x074f, 0x074f, 0x0757, 0x075e, 0x076a, 0x0772, 0x078b, - 0x0794, 0x07b3, 0x07d1, 0x07da, 0x07e1, 0x07f0, 0x07f5, 0x07f5, - // Entry 100 - 13F - 0x07fb, 0x0802, 0x080f, 0x0816, 0x0820, - }, - }, - { // kde - "AndolaDimiliki dya Vakulungwa va ChalabuAfuganistaniAntigua na BalbudaAn" + - "gwilaAlbaniaAlmeniaAngolaAdyentinaSamoa ya MalekaniAustliaAustlaliaA" + - "lubaAzabadyaniBosnia na HezegovinaBabadosiBangladeshiUbelgidiBuchina" + - "fasoBulgaliaBahaleniBulundiBeniniBelmudaBluneiBoliviaBlaziliBahamaBu" + - "taniBotswanaBelalusiBelizeKanadaJamuhuli ya Chidemoklasia ya kuKongo" + - "Jamuhuli ya Afilika ya Paching’atiKongoUswisiKodivaaChisiwa cha Cook" + - "ChileKameluniChinaKolombiaKostalikaKubaKepuvedeKuplosiJamuhuli ya Ch" + - "echiUdyerumaniDyibutiDenmakiDominikaJamuhuli ya DominikaAljeliaEkwad" + - "oEstoniaMisliElitileaHispaniaUhabeshiUfiniFijiChisiwa cha FalklandMi" + - "kilonesiaUfalansaGaboniNngalesaGlenadaDyodyaGwiyana ya UfalansaGhana" + - "DiblaltaGlinlandiGambiaGineGwadelupeGinekwetaUgilichiGwatemalaGwamGi" + - "nebisauGuyanaHondulasiKolasiaHaitiHungaliaIndonesiaAyalandiIslaeliIn" + - "diaLieneo lyaki Nngalesa Nbahali ya HindiIlakiUadyemiAislandiItaliaD" + - "yamaikaYordaniDyapaniKenyaKiligizistaniKambodiaKilibatiKomoloSantaki" + - "tzi na NevisKolea KasikaziniKolea KusiniKuwaitiChisiwa cha KemenKaza" + - "chistaniLaosiLebanoniSantalusiaLishenteniSililankaLibeliaLesotoLitwa" + - "niaLasembagiLativiaLibyaMolokoMonakoMoldovaBukiniChisiwa cha Malusha" + - "lMasedoniaMaliMyamaMongoliaChisiwa cha Marian cha KasikaziniMalitini" + - "kiMolitaniaMonselatiMaltaMolisiModivuMalawiMeksikoMalesiaMsumbijiNam" + - "ibiaNyukaledoniaNidyeliChisiwa cha NolufokNidyeliaNikalagwaUholanziN" + - "orweNepaliNauluNiueNyuzilandiOmaniPanamaPeluPolinesia ya UfalansaPap" + - "uaFilipinoPakistaniPolandiSantapieli na MikeloniPitikeluniPwetolikoN" + - "chingu wa Magalibi wa Mpanda wa kuGaza wa kuPalesUlenoPalauPalagwaiK" + - "ataliLiyunioniLomaniaUlusiLwandaSaudiaChisiwa cha SolomonShelisheliS" + - "udaniUswidiSingapooSantahelenaSloveniaSlovakiaSiela LeoniSamalinoSen" + - "egaliSomaliaSulinamuSaotome na PrinsipeElsavadoSiliaUswaziChisiwa ch" + - "a Tuluchi na KaikoChadiTogoTailandiTadikistaniTokelauTimoli ya Masha" + - "likiTuluchimenistaniTunisiaTongaUtuluchiTilinidad na TobagoTuvaluTai" + - "waniTanzaniaUklainiUgandaMalekaniUlugwaiUzibechistaniVatikaniSantavi" + - "senti na GlenadiniVenezuelaChisiwa Chivihi cha WingalesaChisiwa Chiv" + - "ihi cha MalekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMaoleAfili" + - "ka KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0028, 0x0034, 0x0046, 0x004d, 0x0054, - 0x005b, 0x0061, 0x0061, 0x006a, 0x007b, 0x0082, 0x008b, 0x0090, - 0x0090, 0x009a, 0x00ae, 0x00b6, 0x00c1, 0x00c9, 0x00d4, 0x00dc, - 0x00e4, 0x00eb, 0x00f1, 0x00f1, 0x00f8, 0x00fe, 0x0105, 0x0105, - 0x010c, 0x0112, 0x0118, 0x0118, 0x0120, 0x0128, 0x012e, 0x0134, - 0x0134, 0x0158, 0x017c, 0x0181, 0x0187, 0x018e, 0x019e, 0x01a3, - 0x01ab, 0x01b0, 0x01b8, 0x01b8, 0x01c1, 0x01c5, 0x01cd, 0x01cd, - 0x01cd, 0x01d4, 0x01e6, 0x01f0, 0x01f0, 0x01f7, 0x01fe, 0x0206, - // Entry 40 - 7F - 0x021a, 0x0221, 0x0221, 0x0227, 0x022e, 0x0233, 0x0233, 0x023b, - 0x0243, 0x024b, 0x024b, 0x024b, 0x0250, 0x0254, 0x0268, 0x0273, - 0x0273, 0x027b, 0x0281, 0x0289, 0x0290, 0x0296, 0x02a9, 0x02a9, - 0x02ae, 0x02b6, 0x02bf, 0x02c5, 0x02c9, 0x02d2, 0x02db, 0x02e3, - 0x02e3, 0x02ec, 0x02f0, 0x02f9, 0x02ff, 0x02ff, 0x02ff, 0x0308, - 0x030f, 0x0314, 0x031c, 0x031c, 0x0325, 0x032d, 0x0334, 0x0334, - 0x0339, 0x035f, 0x0364, 0x036b, 0x0373, 0x0379, 0x0379, 0x0381, - 0x0388, 0x038f, 0x0394, 0x03a1, 0x03a9, 0x03b1, 0x03b7, 0x03ca, - // Entry 80 - BF - 0x03da, 0x03e6, 0x03ed, 0x03fe, 0x040a, 0x040f, 0x0417, 0x0421, - 0x042b, 0x0434, 0x043b, 0x0441, 0x0449, 0x0452, 0x0459, 0x045e, - 0x0464, 0x046a, 0x0471, 0x0471, 0x0471, 0x0477, 0x048b, 0x0494, - 0x0498, 0x049d, 0x04a5, 0x04a5, 0x04c6, 0x04d0, 0x04d9, 0x04e2, - 0x04e7, 0x04ed, 0x04f3, 0x04f9, 0x0500, 0x0507, 0x050f, 0x0516, - 0x0522, 0x0529, 0x053c, 0x0544, 0x054d, 0x0555, 0x055a, 0x0560, - 0x0565, 0x0569, 0x0573, 0x0578, 0x057e, 0x0582, 0x0597, 0x059c, - 0x05a4, 0x05ad, 0x05b4, 0x05ca, 0x05d4, 0x05dd, 0x060f, 0x0614, - // Entry C0 - FF - 0x0619, 0x0621, 0x0627, 0x0627, 0x0630, 0x0637, 0x0637, 0x063c, - 0x0642, 0x0648, 0x065b, 0x0665, 0x066b, 0x0671, 0x0679, 0x0684, - 0x068c, 0x068c, 0x0694, 0x069f, 0x06a7, 0x06af, 0x06b6, 0x06be, - 0x06be, 0x06d1, 0x06d9, 0x06d9, 0x06de, 0x06e4, 0x06e4, 0x0700, - 0x0705, 0x0705, 0x0709, 0x0711, 0x071c, 0x0723, 0x0736, 0x0746, - 0x074d, 0x0752, 0x075a, 0x076d, 0x0773, 0x077a, 0x0782, 0x0789, - 0x078f, 0x078f, 0x078f, 0x0797, 0x079e, 0x07ab, 0x07b3, 0x07cc, - 0x07d5, 0x07f2, 0x080e, 0x0817, 0x081e, 0x082d, 0x0832, 0x0832, - // Entry 100 - 13F - 0x0838, 0x083d, 0x084b, 0x0851, 0x0859, - }, - }, - { // kea - "Ilha di AsensãuAndoraEmiradus Árabi UniduAfeganistãuAntigua i BarbudaAng" + - "ilaAlbániaArméniaAngolaAntártikaArjentinaSamoa MerkanuÁustriaAustrál" + - "iaArubaIlhas ÅlandAzerbaijãuBósnia i ErzegovinaBarbadusBangladexiBél" + - "jikaBurkina FasuBulgáriaBarainBurundiBeninSãu BartolomeuBermudasBrun" + - "eiBolíviaKaraibas OlandezasBrazilBaamasButãuIlha BuveBotsuanaBelarus" + - "BeliziKanadáIlhas Kokus (Keeling)Kongu - KinxasaRepublika Sentru-Afr" + - "ikanuKongu - BrazaviliSuisaKosta di MarfinIlhas KukXiliKamarõisXinaK" + - "olômbiaIlha KlipertonKosta RikaKubaKabu VerdiKurasauIlha di NatalXip" + - "riTxékiaAlimanhaDiegu GarsiaDjibutiDinamarkaDominikaRepúblika Domini" + - "kanaArjéliaSeuta i MelilhaEkuadorStóniaEjituSara OsidentalIritreiaSp" + - "anhaEtiópiaUniãu EuropeiaFinlándiaFidjiIlhas MalvinasMikronéziaIlhas" + - " FaroeFransaGabãuReinu UniduGranadaJiórjiaGiana FransezaGernziGanaJi" + - "braltarGronelándiaGámbiaGineGuadalupiGine EkuatorialGrésiaIlhas Jeór" + - "jia di Sul i Sanduixi di SulGuatimalaGuamGine-BisauGianaRejiãu Admin" + - "istrativu Spesial di Hong KongIlhas Heard i McDonaldOndurasKroásiaAi" + - "tíUngriaKanáriasIndonéziaIrlandaIsraelIlha di ManÍndiaIlhas Británik" + - "as di ÍndikuIrakiIrãuIslándiaItáliaJersiJamaikaJordániaJapãuKéniaKir" + - "gistãuKambodjaKiribatiKamorisSãu Kristovãu i NevisKoreia di NortiKor" + - "eia di SulKueitiIlhas KaimãuKazakistãuLausLíbanuSanta LúsiaLixenstai" + - "nSri LankaLibériaLezotuLituániaLuxemburguLetóniaLíbiaMarokusMónakuMo" + - "ldáviaMontenegruSãu Martinhu di FransaMadagaskarIlhas MarxalMasidóni" + - "aMaliMianmar (Birmánia)MongóliaRejiãu Administrativu Spesial di Maka" + - "uIlhas Marianas di NortiMartinikaMauritániaMonseratMaltaMaurísiaMald" + - "ivasMalauiMéxikuMaláziaMusambikiNamíbiaNova KalidóniaNijerIlhas Norf" + - "olkNijériaNikaráguaOlandaNoruegaNepalNauruNiueNova ZilándiaOmanPanam" + - "áPeruPolinézia FransezaPapua-Nova GineFilipinasPakistãuPulóniaSan P" + - "iere i MikelonPirkairnPortu RikuPalistinaPurtugalPalauParaguaiKatarI" + - "lhas di OseaniaRuniãuRuméniaSérviaRúsiaRuandaArábia SauditaIlhas Sal" + - "umãuSeixelisSudãuSuésiaSingapuraSanta IlenaSlovéniaSvalbard i Jan Ma" + - "ienSlovákiaSera LioaSan MarinuSenegalSumáliaSurinamiSudãu di SulSãu " + - "Tume i PrínsipiEl SalvadorSãu Martinhu di OlandaSíriaSuazilándiaTris" + - "tan da KunhaIlhas Turkas i KaikusTxadiTerras Franses di SulToguTailá" + - "ndiaTadjikistãuTokelauTimor LestiTurkumenistãuTuníziaTongaTurkiaTrin" + - "idad i TobaguTuvaluTaiuanTanzániaUkrániaUgandaIlhas Minoris Distanti" + - "s de Stadus UnidusStadus Unidos di MerkaUruguaiUzbekistãuVatikanuSãu" + - " Bisenti i GranadinasVinizuelaIlhas Virjens BritánikasIlhas Virjens " + - "MerkanasVietnamVanuatuUalis i FutunaSamoaKozovuIémenMaioteÁfrika di " + - "SulZámbiaZimbábuiRejiãu DiskonxeduMunduÁfrikaMerka di NortiMerka di " + - "SulOseaniaÁfrika OsidentalMerka SentralÁfrika OrientalNorti di Áfrik" + - "aÁfrika SentralSul di ÁfrikaMerkasNorti di MerkaKaraibasÁzia Orienta" + - "lSul di ÁziaSudesti AziátikuEuropa di SulAustraláziaMelanéziaRejiãu " + - "di MikronéziaPolinéziaÁziaÁzia SentralÁzia OsidentalEuropaEuropa Ori" + - "entalEuropa di NortiEuropa OsidentalMerka Latinu", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0016, 0x002b, 0x0037, 0x0048, 0x004e, 0x0056, - 0x005e, 0x0064, 0x006e, 0x0077, 0x0084, 0x008c, 0x0096, 0x009b, - 0x00a7, 0x00b2, 0x00c6, 0x00ce, 0x00d8, 0x00e0, 0x00ec, 0x00f5, - 0x00fb, 0x0102, 0x0107, 0x0116, 0x011e, 0x0124, 0x012c, 0x013e, - 0x0144, 0x014a, 0x0150, 0x0159, 0x0161, 0x0168, 0x016e, 0x0175, - 0x018a, 0x0199, 0x01b2, 0x01c3, 0x01c8, 0x01d7, 0x01e0, 0x01e4, - 0x01ed, 0x01f1, 0x01fa, 0x0208, 0x0212, 0x0216, 0x0220, 0x0227, - 0x0234, 0x0239, 0x0240, 0x0248, 0x0254, 0x025b, 0x0264, 0x026c, - // Entry 40 - 7F - 0x0281, 0x0289, 0x0298, 0x029f, 0x02a6, 0x02ab, 0x02b9, 0x02c1, - 0x02c7, 0x02cf, 0x02de, 0x02de, 0x02e8, 0x02ed, 0x02fb, 0x0306, - 0x0311, 0x0317, 0x031d, 0x0328, 0x032f, 0x0337, 0x0345, 0x034b, - 0x034f, 0x0358, 0x0364, 0x036b, 0x036f, 0x0378, 0x0387, 0x038e, - 0x03b5, 0x03be, 0x03c2, 0x03cc, 0x03d1, 0x03fc, 0x0412, 0x0419, - 0x0421, 0x0426, 0x042c, 0x0435, 0x043f, 0x0446, 0x044c, 0x0457, - 0x045d, 0x0479, 0x047e, 0x0483, 0x048c, 0x0493, 0x0498, 0x049f, - 0x04a8, 0x04ae, 0x04b4, 0x04be, 0x04c6, 0x04ce, 0x04d5, 0x04ec, - // Entry 80 - BF - 0x04fb, 0x0508, 0x050e, 0x051b, 0x0526, 0x052a, 0x0531, 0x053d, - 0x0547, 0x0550, 0x0558, 0x055e, 0x0567, 0x0571, 0x0579, 0x057f, - 0x0586, 0x058d, 0x0596, 0x05a0, 0x05b7, 0x05c1, 0x05cd, 0x05d7, - 0x05db, 0x05ee, 0x05f7, 0x061e, 0x0635, 0x063e, 0x0649, 0x0651, - 0x0656, 0x065f, 0x0667, 0x066d, 0x0674, 0x067c, 0x0685, 0x068d, - 0x069c, 0x06a1, 0x06ae, 0x06b6, 0x06c0, 0x06c6, 0x06cd, 0x06d2, - 0x06d7, 0x06db, 0x06e9, 0x06ed, 0x06f4, 0x06f8, 0x070b, 0x071a, - 0x0723, 0x072c, 0x0734, 0x0747, 0x074f, 0x0759, 0x0762, 0x076a, - // Entry C0 - FF - 0x076f, 0x0777, 0x077c, 0x078c, 0x0793, 0x079b, 0x07a2, 0x07a8, - 0x07ae, 0x07bd, 0x07cb, 0x07d3, 0x07d9, 0x07e0, 0x07e9, 0x07f4, - 0x07fd, 0x0811, 0x081a, 0x0823, 0x082d, 0x0834, 0x083c, 0x0844, - 0x0851, 0x0866, 0x0871, 0x0888, 0x088e, 0x089a, 0x08aa, 0x08bf, - 0x08c4, 0x08d9, 0x08dd, 0x08e7, 0x08f3, 0x08fa, 0x0905, 0x0913, - 0x091b, 0x0920, 0x0926, 0x0937, 0x093d, 0x0943, 0x094c, 0x0954, - 0x095a, 0x0982, 0x0982, 0x0998, 0x099f, 0x09aa, 0x09b2, 0x09cb, - 0x09d4, 0x09ed, 0x0a03, 0x0a0a, 0x0a11, 0x0a1f, 0x0a24, 0x0a2a, - // Entry 100 - 13F - 0x0a30, 0x0a36, 0x0a44, 0x0a4b, 0x0a54, 0x0a66, 0x0a6b, 0x0a72, - 0x0a80, 0x0a8c, 0x0a93, 0x0aa4, 0x0ab1, 0x0ac1, 0x0ad1, 0x0ae0, - 0x0aee, 0x0af4, 0x0b02, 0x0b0a, 0x0b18, 0x0b24, 0x0b35, 0x0b42, - 0x0b4e, 0x0b58, 0x0b6e, 0x0b78, 0x0b7d, 0x0b8a, 0x0b99, 0x0b9f, - 0x0bae, 0x0bbd, 0x0bcd, 0x0bd9, - }, - }, - { // khq - "AndooraLaaraw Imaarawey MarganteyAfgaanistanAntigua nda BarbuudaAngiiyaA" + - "lbaaniArmeeniAngoolaArgentineAmeriki SamoaOtrišiOstraaliAruubaAzerba" + - "ayijaŋBosni nda HerzegovineBarbaadosBangladešiBelgiikiBurkina fasoBu" + - "lgaariBahareenBurundiBeniŋBermudaBruuneeBooliviBreezilBahamasBuutaŋB" + - "otswaanaBilorišiBeliiziKanaadaKongoo demookaratiki labooCentraafriki" + - " koyraKongooSwisuKudwarKuuk gungeyŠiiliKameruunŠiinKolombiKosta rika" + - "KuubaKapuver gungeyŠiipurCek laboAlmaaɲeJibuutiDanemarkDoominikiDoom" + - "iniki labooAlžeeriEkwateerEstooniMisraEritreeEspaaɲeEcioopiFinlanduF" + - "ijiKalkan gungeyMikroneziFaransiGaabonAlbaasalaama MargantaGrenaadaG" + - "orgiFaransi GuyaanGaanaGibraltarGrinlandGambiGineGwadeluupGinee Ekwa" + - "torialGreeceGwatemaalaGuamGine-BissoGuyaaneHondurasKrwaasiHaitiHunga" + - "ariIndoneeziIrlanduIsrayelIndu labooBritiši Indu teekoo laamaIraakIr" + - "aanAycelandItaaliJamaayikUrdunJaapoŋKeeniyaKyrgyzstanKamboogiKiribaa" + - "tiKomoorSeŋ Kitts nda NevisKooree, GurmaKooree, HawsaKuweetKayman gu" + - "ngeyKaazakstanLaawosLubnaanSeŋ LussiaLiechtensteinSrilankaLiberiaLee" + - "sotoLituaaniLuxembourgLetooniLiibiMaarokMonakoMoldoviMadagascarMarša" + - "l gungeyMaacedooniMaaliMaynamarMongooliMariana Gurma GungeyMartiniik" + - "iMooritaaniMontserratMaltaMooris gungeyMaldiivuMalaawiMexikiMaleeziM" + - "ozambikNaamibiKaaledooni TaagaaNižerNorfolk GungooNaajiriiaNikaragwa" + - "HollanduNorveejNeepalNauruNiueZeelandu TaagaOmaanPanamaPeeruFaransi " + - "PolineeziPapua Ginee TaagaFilipinePaakistanPoloɲeSeŋ Piyer nda Mikel" + - "onPitikarinPorto RikoPalestine Dangay nda GaazaPortugaalPaluParaguwe" + - "yKataarReenioŋRumaaniIriši labooRwandaSaudiyaSolomon GungeySeešelSuu" + - "daŋSweedeSingapurSeŋ HelenaSloveeniSlovaakiSeera LeonSan MarinoSeneg" + - "alSomaaliSurinaamSao Tome nda PrinsipeSalvador labooSuuriaSwazilandT" + - "urk nda Kayikos GungeyCaaduTogoTaayilandTaažikistanTokelauTimoor haw" + - "saTurkmenistaŋTuniziTongaTurkiTrinidad nda TobaagoTuvaluTaayiwanTanz" + - "aaniUkreenUgandaAmeriki Laabu MarganteyUruguweyUzbeekistanVaatikan L" + - "aamaSeŋvinsaŋ nda GrenadineVeneezuyeelaBritiši Virgin gungeyAmeerik " + - "Virgin GungeyVietnaamVanautuWallis nda FutunaSamoaYamanMayootiHawsa " + - "Afriki LabooZambiZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x0021, 0x002c, 0x0040, 0x0047, 0x004e, - 0x0055, 0x005c, 0x005c, 0x0065, 0x0072, 0x0079, 0x0081, 0x0087, - 0x0087, 0x0094, 0x00a9, 0x00b2, 0x00bd, 0x00c5, 0x00d1, 0x00d9, - 0x00e1, 0x00e8, 0x00ee, 0x00ee, 0x00f5, 0x00fc, 0x0103, 0x0103, - 0x010a, 0x0111, 0x0118, 0x0118, 0x0121, 0x012a, 0x0131, 0x0138, - 0x0138, 0x0152, 0x0164, 0x016a, 0x016f, 0x0175, 0x0180, 0x0186, - 0x018e, 0x0193, 0x019a, 0x019a, 0x01a4, 0x01a9, 0x01b7, 0x01b7, - 0x01b7, 0x01be, 0x01c6, 0x01ce, 0x01ce, 0x01d5, 0x01dd, 0x01e6, - // Entry 40 - 7F - 0x01f5, 0x01fd, 0x01fd, 0x0205, 0x020c, 0x0211, 0x0211, 0x0218, - 0x0220, 0x0227, 0x0227, 0x0227, 0x022f, 0x0233, 0x0240, 0x0249, - 0x0249, 0x0250, 0x0256, 0x026b, 0x0273, 0x0278, 0x0286, 0x0286, - 0x028b, 0x0294, 0x029c, 0x02a1, 0x02a5, 0x02ae, 0x02be, 0x02c4, - 0x02c4, 0x02ce, 0x02d2, 0x02dc, 0x02e3, 0x02e3, 0x02e3, 0x02eb, - 0x02f2, 0x02f7, 0x02ff, 0x02ff, 0x0308, 0x030f, 0x0316, 0x0316, - 0x0320, 0x033a, 0x033f, 0x0344, 0x034c, 0x0352, 0x0352, 0x035a, - 0x035f, 0x0366, 0x036d, 0x0377, 0x037f, 0x0388, 0x038e, 0x03a2, - // Entry 80 - BF - 0x03af, 0x03bc, 0x03c2, 0x03cf, 0x03d9, 0x03df, 0x03e6, 0x03f1, - 0x03fe, 0x0406, 0x040d, 0x0414, 0x041c, 0x0426, 0x042d, 0x0432, - 0x0438, 0x043e, 0x0445, 0x0445, 0x0445, 0x044f, 0x045d, 0x0467, - 0x046c, 0x0474, 0x047c, 0x047c, 0x0490, 0x049a, 0x04a4, 0x04ae, - 0x04b3, 0x04c0, 0x04c8, 0x04cf, 0x04d5, 0x04dc, 0x04e4, 0x04eb, - 0x04fc, 0x0502, 0x0510, 0x0519, 0x0522, 0x052a, 0x0531, 0x0537, - 0x053c, 0x0540, 0x054e, 0x0553, 0x0559, 0x055e, 0x056f, 0x0580, - 0x0588, 0x0591, 0x0598, 0x05ae, 0x05b7, 0x05c1, 0x05db, 0x05e4, - // Entry C0 - FF - 0x05e8, 0x05f1, 0x05f7, 0x05f7, 0x05ff, 0x0606, 0x0606, 0x0612, - 0x0618, 0x061f, 0x062d, 0x0634, 0x063b, 0x0641, 0x0649, 0x0654, - 0x065c, 0x065c, 0x0664, 0x066e, 0x0678, 0x067f, 0x0686, 0x068e, - 0x068e, 0x06a3, 0x06b1, 0x06b1, 0x06b7, 0x06c0, 0x06c0, 0x06d7, - 0x06dc, 0x06dc, 0x06e0, 0x06e9, 0x06f5, 0x06fc, 0x0708, 0x0715, - 0x071b, 0x0720, 0x0725, 0x0739, 0x073f, 0x0747, 0x074f, 0x0755, - 0x075b, 0x075b, 0x075b, 0x0772, 0x077a, 0x0785, 0x0793, 0x07ac, - 0x07b8, 0x07ce, 0x07e3, 0x07eb, 0x07f2, 0x0803, 0x0808, 0x0808, - // Entry 100 - 13F - 0x080d, 0x0814, 0x0826, 0x082b, 0x0833, - }, - }, - { // ki - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa ya MarekaniAustriaAustraliaArubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareni" + - "MburundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarus" + - "iBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya Ka" + - "tiKongoUswisiKodivaaVisiwa vya CookChileKameruniCainaKolombiaKostari" + - "kaKiumbaKepuvedeKuprosiJamhuri ya ChekiNjeremaniJibutiDenmakiDominik" + - "aJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshi" + - "UfiniFijiVisiwa vya FalklandMikronesiaUbaranjaGaboniNgerethaGrenadaJ" + - "ojiaGwiyana ya UfaransaNganaJibraltaGrinlandiGambiaGineGwadelupeGine" + - "kwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungari" + - "aIndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiI" + - "rakiUajemiAislandiItaliaJamaikaNjorondaniNjabaniKenyaKirigizistaniKa" + - "mbodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKu" + - "waitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSi" + - "rilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldova" + - "BukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana" + - " vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMe" + - "ksikoMalesiaMsumbijiNamimbiaNyukaledoniaNijeriKisiwa cha NorfokNainj" + - "eriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPo" + - "linesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri na Mikelo" + - "niPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa Palesti" + - "naUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya" + - " SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSie" + - "ra LeoniSamarinoSenegaliSomariaSurinamuSao Tome na PrincipeElsavadoS" + - "iriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokel" + - "auTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na T" + - "obagoTuvaluTaiwaniTanzaniaUkrainiUgandaAmerikaUrugwaiUzibekistaniVat" + - "ikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya Uingere" + - "zaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoa" + - "YemeniMayotteAfrika KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00b6, 0x00c0, 0x00c8, - 0x00d0, 0x00d8, 0x00de, 0x00de, 0x00e5, 0x00eb, 0x00f2, 0x00f2, - 0x00f9, 0x00ff, 0x0105, 0x0105, 0x010d, 0x0115, 0x011b, 0x0121, - 0x0121, 0x0141, 0x015a, 0x015f, 0x0165, 0x016c, 0x017b, 0x0180, - 0x0188, 0x018d, 0x0195, 0x0195, 0x019e, 0x01a4, 0x01ac, 0x01ac, - 0x01ac, 0x01b3, 0x01c3, 0x01cc, 0x01cc, 0x01d2, 0x01d9, 0x01e1, - // Entry 40 - 7F - 0x01f4, 0x01fb, 0x01fb, 0x0201, 0x0208, 0x020d, 0x020d, 0x0214, - 0x021c, 0x0224, 0x0224, 0x0224, 0x0229, 0x022d, 0x0240, 0x024a, - 0x024a, 0x0252, 0x0258, 0x0260, 0x0267, 0x026c, 0x027f, 0x027f, - 0x0284, 0x028c, 0x0295, 0x029b, 0x029f, 0x02a8, 0x02b1, 0x02b8, - 0x02b8, 0x02c1, 0x02c5, 0x02ce, 0x02d4, 0x02d4, 0x02d4, 0x02dd, - 0x02e4, 0x02e9, 0x02f1, 0x02f1, 0x02fa, 0x0302, 0x0309, 0x0309, - 0x030e, 0x0333, 0x0338, 0x033e, 0x0346, 0x034c, 0x034c, 0x0353, - 0x035d, 0x0364, 0x0369, 0x0376, 0x037e, 0x0386, 0x038c, 0x039f, - // Entry 80 - BF - 0x03ae, 0x03ba, 0x03c1, 0x03d2, 0x03dd, 0x03e2, 0x03ea, 0x03f4, - 0x03fe, 0x0407, 0x040e, 0x0414, 0x041c, 0x0425, 0x042c, 0x0431, - 0x0437, 0x043d, 0x0444, 0x0444, 0x0444, 0x044a, 0x045c, 0x0465, - 0x0469, 0x046e, 0x0476, 0x0476, 0x0496, 0x049f, 0x04a8, 0x04b3, - 0x04b8, 0x04be, 0x04c4, 0x04ca, 0x04d1, 0x04d8, 0x04e0, 0x04e8, - 0x04f4, 0x04fa, 0x050b, 0x0514, 0x051d, 0x0525, 0x052a, 0x0530, - 0x0535, 0x0539, 0x0543, 0x0548, 0x054e, 0x0552, 0x0567, 0x056c, - 0x0574, 0x057d, 0x0584, 0x059a, 0x05a3, 0x05ac, 0x05de, 0x05e3, - // Entry C0 - FF - 0x05e8, 0x05f0, 0x05f6, 0x05f6, 0x05ff, 0x0606, 0x0606, 0x060b, - 0x0611, 0x0616, 0x0628, 0x0632, 0x0638, 0x063e, 0x0646, 0x0651, - 0x0659, 0x0659, 0x0661, 0x066c, 0x0674, 0x067c, 0x0683, 0x068b, - 0x068b, 0x069f, 0x06a7, 0x06a7, 0x06ac, 0x06b2, 0x06b2, 0x06cb, - 0x06d0, 0x06d0, 0x06d4, 0x06dc, 0x06e7, 0x06ee, 0x0701, 0x0710, - 0x0717, 0x071c, 0x0723, 0x0735, 0x073b, 0x0742, 0x074a, 0x0751, - 0x0757, 0x0757, 0x0757, 0x075e, 0x0765, 0x0771, 0x0779, 0x0792, - 0x079b, 0x07ba, 0x07d8, 0x07e1, 0x07e8, 0x07f7, 0x07fc, 0x07fc, - // Entry 100 - 13F - 0x0802, 0x0809, 0x0816, 0x081c, 0x0824, - }, - }, - { // kk - kkRegionStr, - kkRegionIdx, - }, - { // kkj - "Kamɛrun", - []uint16{ // 49 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0008, - }, - }, - { // kl - "Kalaallit Nunaat", - []uint16{ // 91 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0010, - }, - }, - { // kln - "Emetab AndorraEmetab kibagenge nebo arabukEmetab AfghanistanEmetab Antig" + - "ua ak BarbudaEmetab AnguillaEmetab AlbaniaEmetab ArmeniaEmetab Angol" + - "aEmetab ArgentinaEmetab American SamoaEmetab AustriaEmetab Australia" + - "Emetab ArubaEmetab AzerbaijanEmetab Bosnia ak HerzegovinaEmetab Barb" + - "adosEmetab BangladeshEmetab BelgiumEmetab Burkina FasoEmetab Bulgari" + - "aEmetab BahrainEmetab BurundiEmetab BeninEmetab BermudaEmetab Brunei" + - "Emetab BoliviaEmetab BrazilEmetab BahamasEmetab BhutanEmetab Botswan" + - "aEmetab BelarusEmetab BelizeEmetab CanadaEmetab Congo - KinshasaEmet" + - "ab Afrika nebo KwenEmetab Congo - BrazzavilleEmetab SwitzerlandEmeta" + - "b Côte d’IvoireIkwembeyotab CookEmetab ChileEmetab CameroonEmetab Ch" + - "inaEmetab ColombiaEmetab Costa RicaEmetab CubaIkwembeyotab Cape Verd" + - "eEmetab CyprusEmetab Czech RepublicEmetab GerumanEmetab DjiboutiEmet" + - "ab DenmarkEmetab DominicaEmetab Dominican RepublicEmetab AlgeriaEmet" + - "ab EcuadorEmetab EstoniaEmetab MisiriEmetab EritreaEmetab SpainEmeta" + - "b EthiopiaEmetab FinlandEmetab FijiIkwembeyotab FalklandEmetab Micro" + - "nesiaEmetab FranceEmetab GabonEmetab Kibagenge nebo UingerezaEmetab " + - "GrenadaEmetab GeorgiaEmetab Guiana nebo UfaransaEmetab GhanaEmetab G" + - "ibraltarEmetab GreenlandEmetab GambiaEmetab GuineaEmetab GuadeloupeE" + - "metab Equatorial GuineaEmetab GreeceEmetab GuatemalaEmetab GuamEmeta" + - "b Guinea-BissauEmetab GuyanaEmetab HondurasEmetab CroatiaEmetab Hait" + - "iEmetab HungaryEmetab IndonesiaEmetab IrelandEmetab IsraelEmetab Ind" + - "iaKebebertab araraitab indian Ocean nebo UingeresaEmetab IraqEmetab " + - "IranEmetab IcelandEmetab ItalyEmetab JamaicaEmetab JordanEmetab Japa" + - "nEmetab KenyaEmetab KyrgyzstanEmetab CambodiaEmetab KiribatiEmetab C" + - "omorosEmetab Saint Kitts ak NevisEmetab Korea nebo murot katamEmetab" + - " korea nebo murot taiEmetab KuwaitIkwembeyotab CaymanEmetab Kazakhst" + - "anEmetab LaosEmetab LebanonEmetab Lucia NeEmetab LiechtensteinEmetab" + - " Sri LankaEmetab LiberiaEmetab LesothoEmetab LithuaniaEmetab Luxembo" + - "urgEmetab LatviaEmetab LibyaEmetab MoroccoEmetab MonacoEmetab Moldov" + - "aEmetab MadagascarIkwembeiyotab MarshallEmetab MacedoniaEmetab MaliE" + - "metab MyanmarEmetab MongoliaIkwembeiyotab Mariana nebo murot katamEm" + - "etab MartiniqueEmetab MauritaniaEmetab MontserratEmetab MaltaEmetab " + - "MauritiusEmetab MaldivesEmetab MalawiEmetab MexicoEmetab MalaysiaEme" + - "tab MozambiqueEmetab NamibiaEmetab New CaledoniaEmetab nigerIkwembei" + - "yotab NorforkEmetab NigeriaEmetab NicaraguaEmetab HolandEmetab Norwa" + - "yEmetab NepalEmetab NauruEmetab NiueEmetab New ZealandEmetab OmanEme" + - "tab PanamaEmetab PeruEmetab Polynesia nebo ufaransaEmetab Papua New " + - "GuineaEmetab PhilippinesEmetab PakistanEmetab PolandEmetab Peter Ne " + - "titil ak MiquelonEmetab PitcairnEmetab Puerto RicoEmetab PalestineEm" + - "etab PortugalEmetab PalauEmetab ParaguayEmetab QatarEmetab RéunionEm" + - "etab RomaniaEmetab RussiaEmetab RwandaEmetab Saudi ArabiaIkwembeiyot" + - "ab SolomonEmetab SeychellesEmetab SudanEmetab SwedenEmetab Singapore" + - "Emetab Helena Ne tililEmetab SloveniaEmetab SlovakiaEmetab Sierra Le" + - "oneEmetab San MarinoEmetab SenegalEmetab SomaliaEmetab SurinameEmeta" + - "b São Tomé and PríncipeEmetab El SalvadorEmetab SyriaEmetab Swazilan" + - "dIkwembeiyotab Turks ak CaicosEmetab ChadEmetab TogoEmetab ThailandE" + - "metab TajikistanEmetab TokelauEmetab Timor nebo Murot taiEmetab Turk" + - "menistanEmetab TunisiaEmetab TongaEmetab TurkeyEmetab Trinidad ak To" + - "bagoEmetab TuvaluEmetab TaiwanEmetab TanzaniaEmetab UkrainieEmetab U" + - "gandaEmetab amerikaEmetab UruguayEmetab UzibekistaniEmetab VaticanEm" + - "etab Vincent netilil ak GrenadinesEmetab VenezuelaIkwembeyotab Briti" + - "sh VirginIkwemweiyotab AmerikaEmetab VietnamEmetab VanuatuEmetab Wal" + - "is ak FutunaEmetab SamoaEmetab YemenEmetab MayotteEmetab Afrika nebo" + - " Murot taiEmetab ZambiaEmetab Zimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000e, 0x002a, 0x003c, 0x0055, 0x0064, 0x0072, - 0x0080, 0x008d, 0x008d, 0x009d, 0x00b2, 0x00c0, 0x00d0, 0x00dc, - 0x00dc, 0x00ed, 0x0109, 0x0118, 0x0129, 0x0137, 0x014a, 0x0159, - 0x0167, 0x0175, 0x0181, 0x0181, 0x018f, 0x019c, 0x01aa, 0x01aa, - 0x01b7, 0x01c5, 0x01d2, 0x01d2, 0x01e1, 0x01ef, 0x01fc, 0x0209, - 0x0209, 0x0220, 0x0237, 0x0251, 0x0263, 0x027a, 0x028b, 0x0297, - 0x02a6, 0x02b2, 0x02c1, 0x02c1, 0x02d2, 0x02dd, 0x02f4, 0x02f4, - 0x02f4, 0x0301, 0x0316, 0x0324, 0x0324, 0x0333, 0x0341, 0x0350, - // Entry 40 - 7F - 0x0369, 0x0377, 0x0377, 0x0385, 0x0393, 0x03a0, 0x03a0, 0x03ae, - 0x03ba, 0x03c9, 0x03c9, 0x03c9, 0x03d7, 0x03e2, 0x03f7, 0x0408, - 0x0408, 0x0415, 0x0421, 0x0440, 0x044e, 0x045c, 0x0477, 0x0477, - 0x0483, 0x0493, 0x04a3, 0x04b0, 0x04bd, 0x04ce, 0x04e6, 0x04f3, - 0x04f3, 0x0503, 0x050e, 0x0522, 0x052f, 0x052f, 0x052f, 0x053e, - 0x054c, 0x0558, 0x0566, 0x0566, 0x0576, 0x0584, 0x0591, 0x0591, - 0x059d, 0x05cd, 0x05d8, 0x05e3, 0x05f1, 0x05fd, 0x05fd, 0x060b, - 0x0618, 0x0624, 0x0630, 0x0641, 0x0650, 0x065f, 0x066d, 0x0688, - // Entry 80 - BF - 0x06a5, 0x06c0, 0x06cd, 0x06e0, 0x06f1, 0x06fc, 0x070a, 0x0719, - 0x072d, 0x073d, 0x074b, 0x0759, 0x0769, 0x077a, 0x0787, 0x0793, - 0x07a1, 0x07ae, 0x07bc, 0x07bc, 0x07bc, 0x07cd, 0x07e3, 0x07f3, - 0x07fe, 0x080c, 0x081b, 0x081b, 0x0841, 0x0852, 0x0863, 0x0874, - 0x0880, 0x0890, 0x089f, 0x08ac, 0x08b9, 0x08c8, 0x08d9, 0x08e7, - 0x08fb, 0x0907, 0x091c, 0x092a, 0x093a, 0x0947, 0x0954, 0x0960, - 0x096c, 0x0977, 0x0989, 0x0994, 0x09a1, 0x09ac, 0x09ca, 0x09e1, - 0x09f3, 0x0a02, 0x0a0f, 0x0a30, 0x0a3f, 0x0a51, 0x0a61, 0x0a70, - // Entry C0 - FF - 0x0a7c, 0x0a8b, 0x0a97, 0x0a97, 0x0aa6, 0x0ab4, 0x0ab4, 0x0ac1, - 0x0ace, 0x0ae1, 0x0af6, 0x0b07, 0x0b13, 0x0b20, 0x0b30, 0x0b46, - 0x0b55, 0x0b55, 0x0b64, 0x0b77, 0x0b88, 0x0b96, 0x0ba4, 0x0bb3, - 0x0bb3, 0x0bd2, 0x0be4, 0x0be4, 0x0bf0, 0x0c00, 0x0c00, 0x0c1d, - 0x0c28, 0x0c28, 0x0c33, 0x0c42, 0x0c53, 0x0c61, 0x0c7c, 0x0c8f, - 0x0c9d, 0x0ca9, 0x0cb6, 0x0ccf, 0x0cdc, 0x0ce9, 0x0cf8, 0x0d07, - 0x0d14, 0x0d14, 0x0d14, 0x0d22, 0x0d30, 0x0d43, 0x0d51, 0x0d75, - 0x0d85, 0x0da0, 0x0db5, 0x0dc3, 0x0dd1, 0x0de7, 0x0df3, 0x0df3, - // Entry 100 - 13F - 0x0dff, 0x0e0d, 0x0e29, 0x0e36, 0x0e45, - }, - }, - { // km - kmRegionStr, - kmRegionIdx, - }, - { // kn - knRegionStr, - knRegionIdx, - }, - { // ko - koRegionStr, - koRegionIdx, - }, - { // ko-KP - "조선민주주의인민공화국", - []uint16{ // 129 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0021, - }, - }, - { // kok - "भारत", - []uint16{ // 113 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x000c, - }, - }, - { // ks - "اٮ۪نڑورامُتحدہ عرَب اماراتاَفغانَستاناٮ۪نٹِگُوا تہٕ باربوڑاانگوئیلااٮ۪لب" + - "انِیااَرمانِیاانگولااینٹارٹِکاأرجَنٹینااَمریٖکَن سَمواآسٹِیاآسٹریلِ" + - "یااَروٗباایلینٛڑ جٔزیٖرٕآزَرباجانبوسنِیا تہٕ ہَرزِگووِناباربیڈاسبَن" + - "ٛگلادیشبیٛلجِیَمبُرکِنا فیسوبَلجیرِیابحریٖنبورَنڈِبِنِنسینٛٹ بارتَھ" + - "یلمیبٔرمیوڈابُرنٔےبولِوِیابرطانوی قُطبہِ جَنوٗبی علاقہٕبرٛازِلبَہام" + - "َسبوٗٹانبووَٹ جٔزیٖرٕبوتَسوانابیلاروٗسبیلِجکینَڑاکوکَس کیٖلِنٛگ جٔز" + - "یٖرٕکونٛگو کِنشاسامرکٔزی اَفریٖکی جموٗریَتکونٛگو بٔرٛزاوِلیسُوِزَرل" + - "ینٛڑاَیوٕری کوسٹکُک جٔزیٖرٕچِلیکیٚمِروٗنچیٖنکولَمبِیاکوسٹا رِکاکیوٗ" + - "باکیپ ؤرڑیکرِسمَس جٔزیٖرٕسایفرٛسچیک جَموٗرِیَتجرمٔنیجِبوٗتیڈینٛمارٕ" + - "کڈومِنِکاڈومِنِکَن جموٗرِیَتاٮ۪لجیرِیااِکواڑورایسٹونِیامِسٔرمشرِقی " + - "سَہارااِرٕٹِیاسٕپیناِتھوپِیافِنلینٛڑفِجیفٕلاکلینٛڑ جٔزیٖرٕفرٛانسگیب" + - "انیُنایٹِڑ کِنٛگڈَمگرٛنیڑاجارجِیافرٛانسِسی گِاناگیوَنَرسےگاناجِبرال" + - "ٹَرگریٖنلینٛڑگَمبِیاگِنیگَواڑیلوپاِکوِٹورِیَل گِنیگریٖسجنوٗبی جارجِ" + - "یا تہٕ جنوٗبی سینٛڑوٕچ جٔزیٖرٕگوتیدالاگُوامگیٖنی بِساوگُیاناہانٛگ ک" + - "انٛگ ایس اے آر چیٖنہَرٕڑ جٔزیٖرٕ تہٕ مٮ۪کڈونالڑٕ جٔزیٖرٕہانٛڈوٗرِسک" + - "رٛوشِیاہایتیہَنٛگریاِنڑونیشِیااَیَرلینٛڑاِسرایٖلآیِل آف میٛنہِنٛدوس" + - "تانبرطانوی بحرِ ہِنٛدۍ علاقہٕایٖراقایٖراناَیِسلینٛڑاِٹلیجٔرسیجَمایک" + - "اجاپانکِنٛیاکِرگِستانکَمبوڑِیاکِرٕباتیکَمورَسسینٛٹ کِٹَس تہٕ نیوِسش" + - "ُمٲلی کورِیاجنوٗبی کورِیاکُویتکیمَن جٔزیٖرٕکَزاکِستانلاسلٮ۪بنانسینٛ" + - "ٹ لوٗسِیالِکٹیٛسٹیٖنسِریٖلَنٛکالایبیرِیالیسوتھولِتھُوانِیالَکسَمبٔر" + - "ٕگلیٛٹوِیالِبیاموروکومونیٚکومولڑاوِیاموٹونیٛگِریوسینٛٹ مارٹِنمیڑاگا" + - "سکارمارشَل جٔزیٖرٕمٮ۪سوڑونِیامالیمَیَنما بٔرمامَنٛگولِیامَکاوو ایس " + - "اے آر چیٖنشُمٲلی مارِیانا جٔزیٖرٕمارٹِنِکمارٕٹانِیامانٛٹسیراٹمالٹام" + - "ورِشَسمالدیٖوملاویمٮ۪کسِکومَلیشِیاموزَمبِکنامِبِیانِو کیلِڑونِیانای" + - "جَرنارفاک جٔزیٖرٕنایجیرِیاناکاراگُوانیٖدَرلینٛڑناروےنیپالنارووٗنیوٗ" + - "نیوٗزِلینٛڑاومانپَناماپیٖروٗفرٛانسی پولِنیشِیاپاپُوا نیوٗ گیٖنیفِلِ" + - "پِینسپاکِستانپولینٛڑسینٛٹ پیٖری تہٕ موکیلِیَنپِٹکیرٕنۍ جٔزیٖرٕپٔرٹو" + - " رِکوفَلَستیٖنپُرتِگالپَلاوپَراگُےقَطِرآوُٹلاینِگ اوشینِیارِیوٗنِیَن" + - "رومانِیاسَربِیاروٗسروٗوانٛڈاسوٗدی عربِیہسولامان جٔزیٖرٕسیشَلِسسوٗڈا" + - "نسُوِڈَنٛسِنٛگاپوٗرسینٛٹ ہٮ۪لِناسَلووینِیاسَوالبریڑ تہٕ جان ماییڑسَ" + - "لوواکِیاسیٖرالیوونسین میرِنوسینیگَلسومالِیاسُرِنامساو توم تہٕ پرٛنس" + - "ِپیاٮ۪ل سَلواڑورشامسُوزِلینٛڑتُرُک تہٕ کیکوس جٔزیٖرٕچاڑفرٛانسِسی جَ" + - "نوٗبی عَلاقہٕٹوگوتھایلینٛڑتاجکِستانتوکیلاومَشرِقی تایمورتُرمِنِستان" + - "ٹونیشِیاٹونٛگاتُرکیٹرٛنِنداد تہٕ ٹوبیگوتوٗوالوٗتایوانتَنجانِیایوٗرِ" + - "کینیوٗگانٛڑایوٗنایٹِڑ سِٹیٹِس ماینَر آوُٹلییِنٛگ جٔزیٖرٕیوٗنایٹِڑ س" + - "ِٹیٹِسیوٗروگےاُزبِکِستانویٹِکَن سِٹیسینٛٹ وینسٮ۪ٹ تہٕ گرٛیناڑاینٕزو" + - "ینازوٗلابَرطانوی ؤرجِن جٔزیٖرٕیوٗ ایس ؤرجِن جٔزیٖرٕویٹِناموانوٗتوٗو" + - "الِس تہٕ فیوٗچوٗناسیمووایَمَنمَییٹجَنوٗبی اَفریٖکاجامبِیازِمبابےنام" + - "علوٗم تہٕ نالَگہار عَلاقہٕدُنیااَفریٖکاشُمٲلی اَمریٖکاجَنوٗنی اَمرٖ" + - "یٖکااوشَنیامَغریٖبی اَفریٖکامرکٔزی اَمریٖکامَشرِقی اَفریٖکاشُمٲلی ا" + - "َفریٖکاوسطی اَفریٖکاجنوٗبی اَفریٖکااَمریٖکَسشُمٲلی اَمریٖکا خٕطہٕکَ" + - "رِببیٖنمَشرِقی ایشیاجنوٗبی ایشیاجنوٗبہِ مَشرِقی ایشیاجنوٗبی یوٗرَپآ" + - "سٹریلیا تہٕ نِوزِلینٛڑمٮ۪لَنیٖشِیامَیکرونَیشِیَن خٕطہٕپالنیشِیاایشی" + - "امرکٔزی ایشیامَغرِبی ایشیایوٗرَپمشرِقی یوٗرَپشُمٲلی یوٗرَپمغرِبی یو" + - "ٗرَپلاطیٖنی اَمریٖکا تہٕ کیرَبیٖن", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0010, 0x0032, 0x0048, 0x0072, 0x0082, 0x0096, - 0x00a8, 0x00b4, 0x00c8, 0x00da, 0x00f7, 0x0103, 0x0115, 0x0123, - 0x0140, 0x0152, 0x017e, 0x018e, 0x01a2, 0x01b4, 0x01cb, 0x01dd, - 0x01e9, 0x01f7, 0x0201, 0x0220, 0x0230, 0x023c, 0x024c, 0x0283, - 0x0291, 0x029f, 0x02ab, 0x02c4, 0x02d6, 0x02e6, 0x02f0, 0x02fc, - 0x0326, 0x0341, 0x036f, 0x0390, 0x03a8, 0x03bf, 0x03d4, 0x03dc, - 0x03ee, 0x03f6, 0x0408, 0x0408, 0x041b, 0x0427, 0x0436, 0x0436, - 0x0453, 0x0461, 0x047c, 0x0488, 0x0488, 0x0496, 0x04a8, 0x04b8, - // Entry 40 - 7F - 0x04dd, 0x04f1, 0x04f1, 0x0501, 0x0513, 0x051d, 0x0536, 0x0546, - 0x0550, 0x0562, 0x0562, 0x0562, 0x0572, 0x057a, 0x059d, 0x059d, - 0x059d, 0x05a9, 0x05b3, 0x05d4, 0x05e2, 0x05f0, 0x060d, 0x061f, - 0x0627, 0x0639, 0x064d, 0x065b, 0x0663, 0x0675, 0x0696, 0x06a0, - 0x06ef, 0x06ff, 0x0709, 0x071e, 0x072a, 0x0759, 0x079f, 0x07b3, - 0x07c3, 0x07cd, 0x07db, 0x07db, 0x07f1, 0x0805, 0x0815, 0x082b, - 0x083f, 0x0870, 0x087c, 0x0888, 0x089c, 0x08a6, 0x08b0, 0x08be, - 0x08be, 0x08c8, 0x08d4, 0x08e6, 0x08f8, 0x0908, 0x0916, 0x093d, - // Entry 80 - BF - 0x0956, 0x096f, 0x0979, 0x0992, 0x09a6, 0x09ac, 0x09ba, 0x09d3, - 0x09e9, 0x09ff, 0x0a11, 0x0a1f, 0x0a35, 0x0a4b, 0x0a5b, 0x0a65, - 0x0a71, 0x0a7f, 0x0a91, 0x0aa9, 0x0ac0, 0x0ad4, 0x0aef, 0x0b05, - 0x0b0d, 0x0b26, 0x0b3a, 0x0b60, 0x0b8c, 0x0b9c, 0x0bb0, 0x0bc4, - 0x0bce, 0x0bdc, 0x0bea, 0x0bf4, 0x0c04, 0x0c14, 0x0c24, 0x0c34, - 0x0c4f, 0x0c5b, 0x0c76, 0x0c88, 0x0c9c, 0x0cb2, 0x0cbc, 0x0cc6, - 0x0cd2, 0x0cda, 0x0cf0, 0x0cfa, 0x0d06, 0x0d12, 0x0d35, 0x0d55, - 0x0d67, 0x0d77, 0x0d85, 0x0db4, 0x0dd5, 0x0de8, 0x0dfa, 0x0e0a, - // Entry C0 - FF - 0x0e14, 0x0e22, 0x0e2c, 0x0e51, 0x0e65, 0x0e75, 0x0e83, 0x0e8b, - 0x0e9d, 0x0eb4, 0x0ed1, 0x0edf, 0x0eeb, 0x0ef9, 0x0f0f, 0x0f28, - 0x0f3c, 0x0f67, 0x0f7b, 0x0f8f, 0x0fa2, 0x0fb0, 0x0fc0, 0x0fce, - 0x0fce, 0x0ff3, 0x100c, 0x100c, 0x1012, 0x1026, 0x1026, 0x1051, - 0x1057, 0x1087, 0x108f, 0x10a1, 0x10b3, 0x10c1, 0x10dc, 0x10f2, - 0x1102, 0x110e, 0x1118, 0x113e, 0x114e, 0x115a, 0x116c, 0x117c, - 0x118e, 0x11e2, 0x11e2, 0x1203, 0x1211, 0x1227, 0x123e, 0x1277, - 0x1289, 0x12b3, 0x12da, 0x12e8, 0x12f8, 0x131c, 0x1328, 0x1328, - // Entry 100 - 13F - 0x1332, 0x133c, 0x135b, 0x1369, 0x1377, 0x13ae, 0x13b8, 0x13c8, - 0x13e5, 0x1406, 0x1414, 0x1435, 0x1452, 0x1471, 0x148e, 0x14a7, - 0x14c4, 0x14d6, 0x14fe, 0x1510, 0x1529, 0x1540, 0x1568, 0x1581, - 0x15ad, 0x15c5, 0x15ec, 0x15fe, 0x1608, 0x161f, 0x1638, 0x1644, - 0x165d, 0x1676, 0x168f, 0x16c6, - }, - }, - { // ksb - "AndolaFalme za KialabuAfuganistaniAntigua na BalbudaAnguillaAlbaniaAlmen" + - "iaAngolaAjentinaSamoa ya MalekaniAustliaAustlaliaAlubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiBukinafasoBulgaliaBahaleniBulundiB" + - "eniniBelmudaBluneiBoliviaBlaziliBahamaButaniBotswanaBelalusiBelizeKa" + - "nadaJamhuli ya Kidemoklasia ya KongoJamhuli ya Afrika ya GatiKongoUs" + - "wisiKodivaaVisiwa vya CookChileKameluniChinaKolombiaKostalikaKubaKep" + - "uvedeKuplosiJamhuli ya ChekiUjeumaniJibutiDenmakiDominikaJamhuli ya " + - "DominikaAljeliaEkwadoEstoniaMisliElitleaHispaniaUhabeshiUfiniFijiVis" + - "iwa vya FalklandMiklonesiaUfalansaGaboniUingeezaGlenadaJojiaGwiyana " + - "ya UfalansaGhanaJiblaltaGlinlandiGambiaGineGwadelupeGinekwetaUgiikiG" + - "watemalaGwamGinebisauGuyanaHonduasiKolasiaHaitiHungaliaIndonesiaAyal" + - "andiIslaeliIndiaEneo ja Uingeeza mwe Bahali HindiIlakiUajemiAislandi" + - "ItaliaJamaikaYoldaniJapaniKenyaKiigizistaniKambodiaKiibatiKomoloSant" + - "akitzi na NevisKolea KaskaziniKolea KusiniKuwaitiVisiwa vya KaymanKa" + - "zakistaniLaosiLebanoniSantalusiaLishenteniSililankaLibeliaLesotoLitw" + - "aniaLasembagiLativiaLibyaMolokoMonakoMoldovaBukiniVisiwa vya MashalM" + - "asedoniaMaliMyamaMongoliaVisiwa vya Maliana vya KaskaziniMaltinikiMa" + - "ulitaniaMontselatiMaltaMolisiModivuMalawiMeksikoMalesiaMsumbijiNamib" + - "iaNyukaledoniaNaijaKisiwa cha NolfokNaijeliaNikalagwaUholanziNolweiN" + - "epaliNauluNiueNyuzilandiOmaniPanamaPeluPolinesia ya UfalansaPapuaFil" + - "ipinoPakistaniPolandiSantapieli na MikeloniPitkailniPwetolikoUkingo " + - "wa Maghalibi na Ukanda wa Gaza wa PalestinaUlenoPalauPalagwaiKataliL" + - "iyunioniLomaniaUlusiLwandaSaudiVisiwa vya SolomonShelisheliSudaniUsw" + - "idiSingapooSantahelenaSloveniaSlovakiaSiela LeoniSamalinoSenegaliSom" + - "aliaSulinamuSao Tome na PlincipeElsavadoSiliaUswaziVisiwa vya Tulki " + - "na KaikoChadiTogoTailandiTajikistaniTokelauTimoli ya MashalikiTuluki" + - "menistaniTunisiaTongaUtulukiTlinidad na TobagoTuvaluTaiwaniTanzaniaU" + - "klainiUgandaMalekaniUlugwaiUzibekistaniVatikaniSantavisenti na Glena" + - "diniVenezuelaVisiwa vya Vilgin vya UingeezaVisiwa vya Vilgin vya Mal" + - "ekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMayotteAflika KusiniZ" + - "ambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00ae, 0x00b8, 0x00c0, - 0x00c8, 0x00cf, 0x00d5, 0x00d5, 0x00dc, 0x00e2, 0x00e9, 0x00e9, - 0x00f0, 0x00f6, 0x00fc, 0x00fc, 0x0104, 0x010c, 0x0112, 0x0118, - 0x0118, 0x0138, 0x0151, 0x0156, 0x015c, 0x0163, 0x0172, 0x0177, - 0x017f, 0x0184, 0x018c, 0x018c, 0x0195, 0x0199, 0x01a1, 0x01a1, - 0x01a1, 0x01a8, 0x01b8, 0x01c0, 0x01c0, 0x01c6, 0x01cd, 0x01d5, - // Entry 40 - 7F - 0x01e8, 0x01ef, 0x01ef, 0x01f5, 0x01fc, 0x0201, 0x0201, 0x0208, - 0x0210, 0x0218, 0x0218, 0x0218, 0x021d, 0x0221, 0x0234, 0x023e, - 0x023e, 0x0246, 0x024c, 0x0254, 0x025b, 0x0260, 0x0273, 0x0273, - 0x0278, 0x0280, 0x0289, 0x028f, 0x0293, 0x029c, 0x02a5, 0x02ab, - 0x02ab, 0x02b4, 0x02b8, 0x02c1, 0x02c7, 0x02c7, 0x02c7, 0x02cf, - 0x02d6, 0x02db, 0x02e3, 0x02e3, 0x02ec, 0x02f4, 0x02fb, 0x02fb, - 0x0300, 0x0321, 0x0326, 0x032c, 0x0334, 0x033a, 0x033a, 0x0341, - 0x0348, 0x034e, 0x0353, 0x035f, 0x0367, 0x036e, 0x0374, 0x0387, - // Entry 80 - BF - 0x0396, 0x03a2, 0x03a9, 0x03ba, 0x03c5, 0x03ca, 0x03d2, 0x03dc, - 0x03e6, 0x03ef, 0x03f6, 0x03fc, 0x0404, 0x040d, 0x0414, 0x0419, - 0x041f, 0x0425, 0x042c, 0x042c, 0x042c, 0x0432, 0x0443, 0x044c, - 0x0450, 0x0455, 0x045d, 0x045d, 0x047d, 0x0486, 0x0490, 0x049a, - 0x049f, 0x04a5, 0x04ab, 0x04b1, 0x04b8, 0x04bf, 0x04c7, 0x04ce, - 0x04da, 0x04df, 0x04f0, 0x04f8, 0x0501, 0x0509, 0x050f, 0x0515, - 0x051a, 0x051e, 0x0528, 0x052d, 0x0533, 0x0537, 0x054c, 0x0551, - 0x0559, 0x0562, 0x0569, 0x057f, 0x0588, 0x0591, 0x05c3, 0x05c8, - // Entry C0 - FF - 0x05cd, 0x05d5, 0x05db, 0x05db, 0x05e4, 0x05eb, 0x05eb, 0x05f0, - 0x05f6, 0x05fb, 0x060d, 0x0617, 0x061d, 0x0623, 0x062b, 0x0636, - 0x063e, 0x063e, 0x0646, 0x0651, 0x0659, 0x0661, 0x0668, 0x0670, - 0x0670, 0x0684, 0x068c, 0x068c, 0x0691, 0x0697, 0x0697, 0x06b0, - 0x06b5, 0x06b5, 0x06b9, 0x06c1, 0x06cc, 0x06d3, 0x06e6, 0x06f5, - 0x06fc, 0x0701, 0x0708, 0x071a, 0x0720, 0x0727, 0x072f, 0x0736, - 0x073c, 0x073c, 0x073c, 0x0744, 0x074b, 0x0757, 0x075f, 0x0778, - 0x0781, 0x079f, 0x07bd, 0x07c6, 0x07cd, 0x07dc, 0x07e1, 0x07e1, - // Entry 100 - 13F - 0x07e7, 0x07ee, 0x07fb, 0x0801, 0x0809, - }, - }, - { // ksf - "andɔrǝbǝlɔŋ bǝ kaksa bɛ táatáaŋzǝnafganistáŋantiga ri barbúdaangiyaalban" + - "íarmɛníangólaarjǝntínsamɔa a amɛrikaotricɔstralíarubaazabecánbɔsnyɛ" + - " ri hɛrsǝgɔvínbaabaadǝbaŋladɛ́cbɛljíkbukína fǝ́ asɔbulgaríbarǝ́nburu" + - "ndíbɛnǝ́nbɛɛmúdǝbrunǝ́bɔɔlívíbrɛsílbaamásbutánbotswanabɛlarisbɛlizka" + - "nadakɔngó anyɔ́nsantrafríkkɔngóswískɔtiwuárzɛ i kúkcílikamɛrúncínkol" + - "ɔmbíkɔstaríkakubakapvɛrcíprɛcɛ́kdjɛrmandyibutídanmakdɔminikdɔminik " + - "rɛpublíkaljɛríɛkwatɛǝ́ɛstoníɛjíptɛritrɛ́kpanyáɛtyɔpífínlanfíjizǝ maa" + - "lwínmikronɛ́sipɛrɛsǝ́gabɔŋkǝlɔŋ kǝ kǝtáatáaŋzǝngrɛnadǝjɔrjíguyán i p" + - "ɛrɛsǝ́gánajibraltágrínlangambíginɛ́gwadɛlúpginɛ́ ɛkwatɔrialgrɛ́kgwá" + - "tǝmalagwámginɛ́ bisɔ́guyánɔnduraskrwasíayitiɔngríindonɛsíilánisraɛ́l" + - "indízǝ ingɛrís ncɔ́m wa indiirákiráŋzǝ i glásitalíjamaíkjɔrdánjapɔ́ŋ" + - "kɛnyakigistáŋkambodjkiribátikomɔrsɛnkrǝstɔ́f ri nyɛ́vǝkorɛanɔ́rkorɛa" + - "sudkuwɛitzǝ i gankazakstáŋlaɔslibáŋsɛntlísílictɛnstɛ́nsrílaŋkalibɛry" + - "alǝsótolitwaníluksɛmbúrlɛtonílibímarɔkmonakomɔldavímadagaskazǝ i mar" + - "cálmásǝdwánmalimyanmármɔŋolízǝ maryánnɔ́rmatiníkmwaritanímɔnsɛratmal" + - "tǝmwarísmaldivǝmalawimɛksíkmalɛsímosambíknamibíkalɛdoní anyɔ́nnijɛ́r" + - "zɛ nɔ́fɔlknijɛ́ryaníkarágwakǝlɔŋ kǝ ázǝnɔrvɛjǝnɛpalnwarúniwɛ́zɛlan a" + - "nyɔ́nomanpanamapɛrúpɔlinɛsí a pɛrɛsǝ́papwazí ginɛ́ anyɔ́nfilipǝ́npak" + - "istáŋpolɔ́nsɛnpyɛr ri mikɛlɔŋpitkɛ́npɔtoríkozǝ palɛstínǝportugálpalw" + - "aparagwɛ́katárɛunyɔŋrɔmanírisírwandaarabí saodízǝ salomɔ́nsɛcɛlsudan" + - "swɛdǝsiŋapósɛntɛ́lenslovɛníslovakísyɛraleonsɛnmarǝnsɛnɛgalsomalísuri" + - "namsaotomɛ́ ri priŋsibsalvadɔrsiríswazilanzǝ tirk ri kakɔscaádtogotɛ" + - "lantadjikistaŋtokǝlaotimor anǝ á ɛsttirkmɛnistaŋtunɛsítɔŋatirkítɛrin" + - "itɛ ri tobagotuwalutɛwántanzaníukrainugandaamɛrikaurugwɛ́usbɛkistaŋw" + - "atikáŋsɛnvǝnsǝŋ ri grɛnadínwɛnǝzwɛlazǝ bɛ gɔn inɛ a ingɛríszǝ bɛ gɔn" + - " inɛ á amɛrikawyɛtnámwanwatuwalis ri futunasamɔayɛmɛnmayɔ́tafrik anǝ" + - " a sudzambízimbabwɛ́", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0008, 0x002d, 0x0039, 0x004b, 0x0051, 0x0058, - 0x0060, 0x0067, 0x0067, 0x0071, 0x0082, 0x0087, 0x0090, 0x0095, - 0x0095, 0x009e, 0x00b8, 0x00c1, 0x00cd, 0x00d5, 0x00e7, 0x00ef, - 0x00f7, 0x00ff, 0x0108, 0x0108, 0x0113, 0x011b, 0x0126, 0x0126, - 0x012e, 0x0135, 0x013b, 0x013b, 0x0143, 0x014b, 0x0151, 0x0157, - 0x0157, 0x0167, 0x0172, 0x0179, 0x017e, 0x0188, 0x0192, 0x0197, - 0x01a0, 0x01a4, 0x01ad, 0x01ad, 0x01b8, 0x01bc, 0x01c3, 0x01c3, - 0x01c3, 0x01ca, 0x01d0, 0x01d8, 0x01d8, 0x01e0, 0x01e6, 0x01ee, - // Entry 40 - 7F - 0x0201, 0x0209, 0x0209, 0x0215, 0x021d, 0x0224, 0x0224, 0x022e, - 0x0235, 0x023e, 0x023e, 0x023e, 0x0245, 0x024a, 0x0256, 0x0262, - 0x0262, 0x026d, 0x0274, 0x0292, 0x029b, 0x02a2, 0x02b6, 0x02b6, - 0x02bb, 0x02c4, 0x02cc, 0x02d2, 0x02d9, 0x02e3, 0x02f7, 0x02fe, - 0x02fe, 0x0309, 0x030e, 0x031d, 0x0323, 0x0323, 0x0323, 0x032b, - 0x0332, 0x0337, 0x033e, 0x033e, 0x0348, 0x034d, 0x0356, 0x0356, - 0x035b, 0x0378, 0x037d, 0x0383, 0x038e, 0x0394, 0x0394, 0x039b, - 0x03a3, 0x03ac, 0x03b2, 0x03bc, 0x03c3, 0x03cc, 0x03d2, 0x03ee, - // Entry 80 - BF - 0x03fa, 0x0403, 0x040a, 0x0413, 0x041e, 0x0423, 0x042a, 0x0435, - 0x0443, 0x044d, 0x0455, 0x045d, 0x0465, 0x0470, 0x0478, 0x047d, - 0x0483, 0x0489, 0x0492, 0x0492, 0x0492, 0x049b, 0x04a8, 0x04b3, - 0x04b7, 0x04bf, 0x04c8, 0x04c8, 0x04d9, 0x04e1, 0x04eb, 0x04f5, - 0x04fb, 0x0502, 0x050a, 0x0510, 0x0518, 0x0520, 0x0529, 0x0530, - 0x0543, 0x054b, 0x0559, 0x0563, 0x056e, 0x0580, 0x058a, 0x0590, - 0x0596, 0x059d, 0x05ac, 0x05b0, 0x05b6, 0x05bc, 0x05d5, 0x05ee, - 0x05f8, 0x0602, 0x060a, 0x0621, 0x062a, 0x0634, 0x0644, 0x064d, - // Entry C0 - FF - 0x0652, 0x065c, 0x0661, 0x0661, 0x066b, 0x0673, 0x0673, 0x0678, - 0x067e, 0x068b, 0x0699, 0x06a0, 0x06a5, 0x06ac, 0x06b4, 0x06c0, - 0x06c9, 0x06c9, 0x06d1, 0x06db, 0x06e5, 0x06ee, 0x06f5, 0x06fc, - 0x06fc, 0x0712, 0x071b, 0x071b, 0x0720, 0x0728, 0x0728, 0x073a, - 0x073f, 0x073f, 0x0743, 0x0749, 0x0755, 0x075d, 0x076f, 0x077d, - 0x0785, 0x078b, 0x0791, 0x07a5, 0x07ab, 0x07b2, 0x07ba, 0x07c0, - 0x07c6, 0x07c6, 0x07c6, 0x07ce, 0x07d7, 0x07e3, 0x07ec, 0x0807, - 0x0813, 0x0830, 0x084d, 0x0856, 0x085d, 0x086c, 0x0872, 0x0872, - // Entry 100 - 13F - 0x0879, 0x0881, 0x0891, 0x0897, 0x08a2, - }, - }, - { // ksh - "AßensionAndorraVereinschte Arrabesche EmmirateAfjaanistahnAntigwa un Bar" + - "budaAnggwillaAlbaanijeArrmeenijeAngjoolader SödpolAjjentiinijeAmmeri" + - "kaanesch SammohaÖösterischAustraalijeArubade Ohland-EnselleAsserbaid" + - "schahnBoßnije un Herzegovinade Ensel BarbadosBangladeschBelljeBukkin" + - "na-FaaseBulljaarijeBachrainBurundidä Beninde Zint Battälmi-Ensellede" + - " BermudasBruneiBolliivijede karribbesche NederlängBrasilijede Bahama" + - "sButtaande Buvee-EnselBozwaanaWießrußlandBelizeKanadade Kokkos-Ensel" + - "ledä Konggo (Kinschasa)de Zäntraalaffrikaanesche Republikdä Konggo (" + - "Brassavill)de SchweizÄlfebeijn-Kößde Kuuk-EnselleSchiileKammeruhnSch" + - "iinaKolumbijede Klipperton-EnselKostarikaKuhbade kapvärdesche Ensell" + - "eCuraçaode Weihnaachs-EnselZüpperede TschäscheiDoütschlandde Diego-G" + - "arcia-EnselDschibuttiDänemarkDominnikade Dommenekaanesche ReppublikA" + - "lljeerijeZe’uta un MeliijaÄkwadorÄßlandÄjüpteWäß-SaharaÄritrejaSchpa" + - "anijeÄttijoopijede Europähjesche UnijonFinnlandde Fidschi-Endellede " + - "Falkland-EnselleMikroneesijede Färrör-EnselleFrankrischJabuhnJruußbr" + - "ettannijeJrenahdaJeorrjijeFranzüüsesch JujaanaJöönseiJaanaJibralltaa" + - "JröhnlandJambijaJinnehaJuadeluppÄquatorial JineejaJrieschelandSöd-Je" + - "orjie un de södlijje Botteramms-EnselleJuwatemahlaJuhamJinneha_Bißau" + - "JujaanaHongkongde Heart Ensel un de McDonald-EnselleHondurasKrowazij" + - "eHa’ittiUnjannde Kannaresche EnselleIndoneesijeIrrlandIßraälde Ensel" + - " MänIndijeBrettesche Besezunge em indesche OozejahnIrakPersijeIßland" + - "ItaalijeJöösehJammaikaJordaanijeJapanKeenijaKirrjiisijeKambodschaKir" + - "ibatide KommooreZint Kitts un NevisNood-KorejaSöd-KorejaKuweitde Kai" + - "man-EnselleKassakstahnLa’osLebbannonde Ensel Zint-LutschaLischtescht" + - "einSri LankaLibeerijaLesootoLittaueLuxemburschLätlandLibbijeMarokkoM" + - "onakkoMoldaavijeet Monteneejrode Zint-Määtes-EnselMaddajaskade Machs" + - "chall-EnselleMazedoonijeMaaliBirmaMongjoleiMakaude nöödlijje Marijan" + - "ne-EnselleMachtinikMautitaanijeMongßerratMaltaMaurizijusMallediiveMa" + - "lawiMäxikoMalaisijeMosambikNamiibijeNeuschottlandNijerde Noofok-Ense" + - "lNikaraaguaNikarahguwade NederlängNorrweejeNepallNauruNiueNeuseeland" + - "OmanPannamaPerruhFranzüüsesch PollineesijePapuwa NeujineejaFillipiin" + - "ePakistahnPoleZint Pjäär un Mikelongde Pitkärn-EnselPochtorikoPaläst" + - "inaPochtojallPallauParraguwaiKataaOzejahnije ußerhallefRehunjohnRomä" + - "änijeSärbijeRußlandRuandaSaudi Arraabijede Solomone-Ensellede Seisc" + - "hälleNoodsudahnSchweedeSingjapuurde Ensel Zint Hellenaẞloveenijede E" + - "nselle Svalbard un Jan MayenẞlovakeiSjärra LejoneSan-Marinoder Senne" + - "jallSomaalijeSürinammSödsudahnZint Tommeh un PrintschipeÄl Slavadohr" + - "Zint MaartenSürijeẞwaasilandTristan da Cunjade Enselle Turks un Kaik" + - "osder TschaddFranzüüsesche Södsee-EnselleToojoTailandTadschikistahnT" + - "okelauOß-TimorTurkmenistahnTuneesijeTonggade TörkeiTrinidad un Tobäh" + - "joTuvaluTaiwanTansanijade Ukra’iineUjandade Vereineschte Schtaate vu" + - "n Amärrika ier ußerhallef jelääje Enselschede vereineschte Schtaate " + - "vun AmmärrikaUrrujwaiUßbeekistahnder VattikahnZint Vinzänz un de Jre" + - "nadines-EnselleVenezuelade brettesche Juffer-Ensellede ammärrikahnes" + - "che Juffer-EnselleVijätnammVanuatuWallis un FutunaSammohaKosovoJämme" + - "Majottde Republik SödaffrikaSambijaSimbabwe- Jähjend onbikannt -de Ä" + - "ädAffrikaNood-AmärrikaSöhd-AmärrikaOzejahnejeWäß-AffrikaMeddelammär" + - "rikaOß-AffrikaNood-AffrikaMeddel-AffrikaSöhd-AffrikaAmmärrikader Nor" + - "de vun Amärrikade KarribikOß-AasijeSöhd-AasijeSöhd-Oß-AasijeSöhd-Eur" + - "oppade Rejjohn öm AustrahlijeMellanehsijede Rejohn vun MikronehsejeP" + - "olinehsijeAasijeMeddelaasijeWäß-AasijeEuroppaOß-EuroppaNood-EuroppaW" + - "äß-EuroppaLateinamärrika", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002f, 0x003b, 0x004d, 0x0056, 0x005f, - 0x0069, 0x0071, 0x007c, 0x0088, 0x009e, 0x00aa, 0x00b5, 0x00ba, - 0x00cb, 0x00da, 0x00f1, 0x0102, 0x010d, 0x0113, 0x0121, 0x012c, - 0x0134, 0x013b, 0x0144, 0x015d, 0x0168, 0x016e, 0x0178, 0x0192, - 0x019b, 0x01a5, 0x01ac, 0x01ba, 0x01c2, 0x01cf, 0x01d5, 0x01db, - 0x01ec, 0x0202, 0x0225, 0x023c, 0x0246, 0x0256, 0x0265, 0x026c, - 0x0275, 0x027c, 0x0285, 0x0298, 0x02a1, 0x02a6, 0x02be, 0x02c6, - 0x02d9, 0x02e1, 0x02ef, 0x02fb, 0x0310, 0x031a, 0x0323, 0x032c, - // Entry 40 - 7F - 0x0349, 0x0353, 0x0366, 0x036e, 0x0376, 0x037e, 0x038a, 0x0393, - 0x039d, 0x03a9, 0x03c1, 0x03c1, 0x03c9, 0x03db, 0x03ee, 0x03fa, - 0x040d, 0x0417, 0x041d, 0x042e, 0x0436, 0x043f, 0x0455, 0x045e, - 0x0463, 0x046d, 0x0477, 0x047e, 0x0485, 0x048e, 0x04a1, 0x04ad, - 0x04dc, 0x04e7, 0x04ec, 0x04fa, 0x0501, 0x0509, 0x052e, 0x0536, - 0x053f, 0x0548, 0x054e, 0x0564, 0x056f, 0x0576, 0x057e, 0x058b, - 0x0591, 0x05ba, 0x05be, 0x05c5, 0x05cc, 0x05d4, 0x05dc, 0x05e4, - 0x05ee, 0x05f3, 0x05fa, 0x0605, 0x060f, 0x0617, 0x0622, 0x0635, - // Entry 80 - BF - 0x0640, 0x064b, 0x0651, 0x0662, 0x066d, 0x0674, 0x067d, 0x0692, - 0x06a0, 0x06a9, 0x06b2, 0x06b9, 0x06c0, 0x06cb, 0x06d3, 0x06da, - 0x06e1, 0x06e8, 0x06f2, 0x0700, 0x0716, 0x0720, 0x0735, 0x0740, - 0x0745, 0x074a, 0x0753, 0x0758, 0x0778, 0x0781, 0x078d, 0x0798, - 0x079d, 0x07a7, 0x07b1, 0x07b7, 0x07be, 0x07c7, 0x07cf, 0x07d8, - 0x07e5, 0x07ea, 0x07f9, 0x0803, 0x080e, 0x081b, 0x0824, 0x082a, - 0x082f, 0x0833, 0x083d, 0x0841, 0x0848, 0x084e, 0x0869, 0x087a, - 0x0884, 0x088d, 0x0891, 0x08a9, 0x08ba, 0x08c4, 0x08ce, 0x08d8, - // Entry C0 - FF - 0x08de, 0x08e8, 0x08ed, 0x0903, 0x090c, 0x0917, 0x091f, 0x0927, - 0x092d, 0x093c, 0x094f, 0x095d, 0x0967, 0x096f, 0x0979, 0x098e, - 0x099a, 0x09ba, 0x09c4, 0x09d2, 0x09dc, 0x09e9, 0x09f2, 0x09fb, - 0x0a05, 0x0a1f, 0x0a2c, 0x0a38, 0x0a3f, 0x0a4b, 0x0a5b, 0x0a75, - 0x0a80, 0x0a9f, 0x0aa4, 0x0aab, 0x0ab9, 0x0ac0, 0x0ac9, 0x0ad6, - 0x0adf, 0x0ae5, 0x0aef, 0x0b03, 0x0b09, 0x0b0f, 0x0b18, 0x0b26, - 0x0b2c, 0x0b76, 0x0b76, 0x0b9d, 0x0ba5, 0x0bb2, 0x0bbf, 0x0be5, - 0x0bee, 0x0c0a, 0x0c2d, 0x0c37, 0x0c3e, 0x0c4e, 0x0c55, 0x0c5b, - // Entry 100 - 13F - 0x0c61, 0x0c67, 0x0c7e, 0x0c85, 0x0c8d, 0x0ca3, 0x0cab, 0x0cb2, - 0x0cc0, 0x0ccf, 0x0cd9, 0x0ce6, 0x0cf6, 0x0d01, 0x0d0d, 0x0d1b, - 0x0d28, 0x0d32, 0x0d49, 0x0d54, 0x0d5e, 0x0d6a, 0x0d7a, 0x0d87, - 0x0da1, 0x0dad, 0x0dc7, 0x0dd2, 0x0dd8, 0x0de4, 0x0df0, 0x0df7, - 0x0e02, 0x0e0e, 0x0e1b, 0x0e2a, - }, - }, - { // kw - "Rywvaneth Unys", - []uint16{ // 84 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x000e, - }, - }, - { // ky - kyRegionStr, - kyRegionIdx, - }, - { // lag - "AndóraɄtemi wa KɨaráabuAfuganisitáaniAntigúua na BaribúudaAnguíilaAlubán" + - "iaAriméniaAngóolaAjentíinaSamóoa ya Amerɨ́kaÁusitiriaAusiteréeliaArú" + - "ubaAzabajáaniBósiniaBabadóosiBangaladéeshiɄbeligíijiBukinafáasoBulig" + - "aríaBaharéeniBurúundiBeníiniBerimúudaBurunéeiBolíviaBrasíiliBaháamaB" + - "utáaniBotiswáanaBelarúusiBelíiseKánadaJamuhúuri ya Kɨdemokurasía ya " + - "KóongoJuhúuri ya Afɨrɨka ya katɨ katɨKóongoUswíisiIvori KositiVisíiw" + - "a vya KúukuChíileKamerúuniChíinaKolómbiaKósita Rɨ́ɨkaKyúubaKepuvéede" + - "KupuróosiJamuhúuri ya ChéekiɄjerumáaniJibúutiDenimakiDomínɨkaJamuhúu" + - "ri ya DominɨkaAlijériaÍkwadoEstoníaMísiriEritereaHisipániaɄhabéeshiU" + - "fíiniFíijiVisíiwa vya FakulandiMikironésiaɄfaráansaGabóoniɄɨngeréesa" + - "GirenáadaJójiaGwiyáana yʉ ɄfaráansaGáanaJiburálitaGiriniláandiGámbia" + - "GíineGwadelúupeGíine IkwéetaUgiríkiGwatemáalaGwaniGíine BisáauGuyáan" + - "aHonduráasiKoréshiaHaíitiHungáriaIndonésiaAyaláandiIsiraéeliÍndiaƗsɨ" + - " yʉ Ʉɨngeréesa irivii ra HíindiIráakiɄajéemiAisiláandiItáliaJamáikaJ" + - "ódaniJapáaniKéenyaKirigisitáaniKambódiaKiribáatiKomóoroMʉtakatíifu " + - "kitisi na NevíisiKoréa yʉ ʉtʉrʉkoKoréa ya SaameKʉwáitiVisíiwa vya Ka" + - "yimaniKazakasitáaniLaóosiLebanóoniMʉtakatíifu LusíiaLishentéeniSiril" + - "áankaLiibériaLesóotoLisuániaLasembáagiLativiaLíbiaMoróokoMonáakoMol" + - "idóovaBukíiniVisíiwa vya MarisháaliMasedóniaMáaliMiáamaMongóliaVisiw" + - "a vya Mariana vya KaskaziniMaritiníikiMoritániaMonteráatiMálitaMoríi" + - "siModíivuMaláawiMekisikoMaleísiaMusumbíijiNamíbiaKaledónia IfyaNíija" + - "Kisíiwa cha NofifóokiNiijériaNikarágʉaɄholáanziNorweNepáaliNaúuruNiú" + - "ueNyuzílandiÓmaniPanáamaPéeruPolinésia yʉ ɄfaráansaPapúuaUfilipíinoP" + - "akisitáaniPólandiMʉtakatíifu Peéteri na MɨkaéeliPatikaíriniPwetorɨ́ɨ" + - "koMweemberera wa kʉmweeri wa GáazaɄréenoPaláauParaguáaiKatáariReyuni" + - "óoniRomaníiaUrúusiRwáandaSaudíia ArabíiaVisíiwa vya SolomóoniShelis" + - "héeliSudáaniUswíidiSingapooMʉtakatíifu HeléenaSulovéniaSulováakiaSer" + - "aleóoniSamaríinoSenegáaliSomáliaSurináamuSao Tóome na PirinsipeElisa" + - "livadoSíriaɄswáaziVisíiwa vya Turíiki na KaíikoCháadiTóogoTáilandiTa" + - "jikisitáaniTokeláauTimóori yi ItʉʉmbaUturukimenisitáaniTunísiaTóonga" + - "UturúukiTiriníida ya TobáagoTuváaluTaiwáaniTaansaníaɄkɨréeniɄgáandaA" + - "merɨkaUruguáaiUsibekisitáaniVatikáaniMʉtakatíifu Viséenti na Gernadí" + - "iniVenezuéelaVisíiwa vya Vigíini vya ɄɨngeréesaVisíiwa vya Vigíini v" + - "ya Amerɨ́kaVietináamuVanuáatuWalíisi na FutúunaSamóoaYémeniMayóoteAf" + - "ɨrɨka ya SaameSámbiaSimbáabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x001b, 0x002a, 0x0041, 0x004a, 0x0053, - 0x005c, 0x0064, 0x0064, 0x006e, 0x0083, 0x008d, 0x009a, 0x00a1, - 0x00a1, 0x00ac, 0x00b4, 0x00be, 0x00cc, 0x00d8, 0x00e4, 0x00ee, - 0x00f8, 0x0101, 0x0109, 0x0109, 0x0113, 0x011c, 0x0124, 0x0124, - 0x012d, 0x0135, 0x013d, 0x013d, 0x0148, 0x0152, 0x015a, 0x0161, - 0x0161, 0x0189, 0x01ad, 0x01b4, 0x01bc, 0x01c8, 0x01db, 0x01e2, - 0x01ec, 0x01f3, 0x01fc, 0x01fc, 0x020d, 0x0214, 0x021e, 0x021e, - 0x021e, 0x0228, 0x023d, 0x0249, 0x0249, 0x0251, 0x0259, 0x0263, - // Entry 40 - 7F - 0x027a, 0x0283, 0x0283, 0x028a, 0x0292, 0x0299, 0x0299, 0x02a1, - 0x02ab, 0x02b6, 0x02b6, 0x02b6, 0x02bd, 0x02c3, 0x02d9, 0x02e5, - 0x02e5, 0x02f0, 0x02f8, 0x0305, 0x030f, 0x0315, 0x032e, 0x032e, - 0x0334, 0x033f, 0x034c, 0x0353, 0x0359, 0x0364, 0x0373, 0x037b, - 0x037b, 0x0386, 0x038b, 0x0399, 0x03a1, 0x03a1, 0x03a1, 0x03ac, - 0x03b5, 0x03bc, 0x03c5, 0x03c5, 0x03cf, 0x03d9, 0x03e3, 0x03e3, - 0x03e9, 0x0412, 0x0419, 0x0422, 0x042d, 0x0434, 0x0434, 0x043c, - 0x0443, 0x044b, 0x0452, 0x0460, 0x0469, 0x0473, 0x047b, 0x049b, - // Entry 80 - BF - 0x04b0, 0x04bf, 0x04c8, 0x04dd, 0x04eb, 0x04f2, 0x04fc, 0x0511, - 0x051d, 0x0528, 0x0531, 0x0539, 0x0542, 0x054d, 0x0554, 0x055a, - 0x0562, 0x056a, 0x0574, 0x0574, 0x0574, 0x057c, 0x0594, 0x059e, - 0x05a4, 0x05ab, 0x05b4, 0x05b4, 0x05d4, 0x05e0, 0x05ea, 0x05f5, - 0x05fc, 0x0604, 0x060c, 0x0614, 0x061c, 0x0625, 0x0630, 0x0638, - 0x0647, 0x064d, 0x0664, 0x066d, 0x0678, 0x0683, 0x0688, 0x0690, - 0x0697, 0x069d, 0x06a8, 0x06ae, 0x06b6, 0x06bc, 0x06d6, 0x06dd, - 0x06e8, 0x06f4, 0x06fc, 0x0720, 0x072c, 0x073a, 0x075c, 0x0764, - // Entry C0 - FF - 0x076b, 0x0775, 0x077d, 0x077d, 0x0788, 0x0791, 0x0791, 0x0798, - 0x07a0, 0x07b1, 0x07c8, 0x07d4, 0x07dc, 0x07e4, 0x07ec, 0x0802, - 0x080c, 0x080c, 0x0817, 0x0822, 0x082c, 0x0836, 0x083e, 0x0848, - 0x0848, 0x085f, 0x086a, 0x086a, 0x0870, 0x0879, 0x0879, 0x0899, - 0x08a0, 0x08a0, 0x08a6, 0x08af, 0x08bd, 0x08c6, 0x08db, 0x08ee, - 0x08f6, 0x08fd, 0x0906, 0x091c, 0x0924, 0x092d, 0x0937, 0x0942, - 0x094b, 0x094b, 0x094b, 0x0953, 0x095c, 0x096b, 0x0975, 0x099b, - 0x09a6, 0x09cd, 0x09f1, 0x09fc, 0x0a05, 0x0a19, 0x0a20, 0x0a20, - // Entry 100 - 13F - 0x0a27, 0x0a2f, 0x0a41, 0x0a48, 0x0a52, - }, - }, - { // lb - "AscensionAndorraVereenegt Arabesch EmiraterAfghanistanAntigua a BarbudaA" + - "nguillaAlbanienArmenienAngolaAntarktisArgentinienAmerikanesch-SamoaÉ" + - "isträichAustralienArubaÅlandinselenAserbaidschanBosnien an Herzegowi" + - "naBarbadosBangladeschBelschBurkina FasoBulgarienBahrainBurundiBeninS" + - "aint-BarthélemyBermudaBruneiBolivienKaribescht HollandBrasilienBaham" + - "asBhutanBouvetinselBotsuanaWäissrusslandBelizeKanadaKokosinselenKong" + - "o-KinshasaZentralafrikanesch RepublikKongo-BrazzavilleSchwäizCôte d’" + - "IvoireCookinselenChileKamerunChinaKolumbienClipperton-InselCosta Ric" + - "aKubaKap VerdeCuraçaoChrëschtdagsinselZypernTschechienDäitschlandDie" + - "go GarciaDschibutiDänemarkDominicaDominikanesch RepublikAlgerienCeut" + - "a a MelillaEcuadorEstlandEgyptenWestsaharaEritreaSpanienEthiopienEur" + - "opäesch UniounFinnlandFidschiFalklandinselenMikronesienFäröerFrankrä" + - "ichGabunGroussbritannienGrenadaGeorgienGuayaneGuernseyGhanaGibraltar" + - "GrönlandGambiaGuineaGuadeloupeEquatorialguineaGriichelandSüdgeorgien" + - " an déi Südlech SandwichinselenGuatemalaGuamGuinea-BissauGuyanaSpezi" + - "alverwaltungszon Hong KongHeard- a McDonald-InselenHondurasKroatienH" + - "aitiUngarnKanaresch InselenIndonesienIrlandIsraelIsle of ManIndienBr" + - "itescht Territorium am Indeschen OzeanIrakIranIslandItalienJerseyJam" + - "aikaJordanienJapanKeniaKirgisistanKambodschaKiribatiKomorenSt. Kitts" + - " an NevisNordkoreaSüdkoreaKuwaitKaimaninselenKasachstanLaosLibanonSt" + - ". LuciaLiechtensteinSri LankaLiberiaLesothoLitauenLëtzebuergLettland" + - "LibyenMarokkoMonacoMoldawienMontenegroSt. MartinMadagaskarMarshallin" + - "selenMazedonienMaliMyanmarMongoleiSpezialverwaltungszon MacauNërdlec" + - "h MarianenMartiniqueMauretanienMontserratMaltaMauritiusMaldivenMalaw" + - "iMexikoMalaysiaMosambikNamibiaNeikaledonienNigerNorfolkinselNigeriaN" + - "icaraguaHollandNorwegenNepalNauruNiueNeiséilandOmanPanamaPeruFranséi" + - "sch-PolynesienPapua-NeiguineaPhilippinnenPakistanPolenSt. Pierre a M" + - "iquelonPitcairninselenPuerto RicoPalestinensesch AutonomiegebidderPo" + - "rtugalPalauParaguayKatarBaussecht OzeanienRéunionRumänienSerbienRuss" + - "landRuandaSaudi-ArabienSalomonenSeychellenSudanSchwedenSingapurSt. H" + - "elenaSlowenienSvalbard a Jan MayenSlowakeiSierra LeoneSan MarinoSene" + - "galSomaliaSurinameSüdsudanSão Tomé a PríncipeEl SalvadorSint Maarten" + - "SyrienSwasilandTristan da CunhaTurks- a CaicosinselenTschadFranséisc" + - "h Süd- an AntarktisgebidderTogoThailandTadschikistanTokelauOsttimorT" + - "urkmenistanTunesienTongaTierkeiTrinidad an TobagoTuvaluTaiwanTansani" + - "aUkrainUgandaAmerikanesch-OzeanienVereenegt Staate vun AmerikaUrugua" + - "yUsbekistanVatikanstadSt. Vincent an d’GrenadinnenVenezuelaBritesch " + - "JoffereninselenAmerikanesch JoffereninselenVietnamVanuatuWallis a Fu" + - "tunaSamoaKosovoJemenMayotteSüdafrikaSambiaSimbabweOnbekannt RegiounW" + - "eltAfrikaNordamerikaSüdamerikaOzeanienWestafrikaMëttelamerikaOstafri" + - "kaNordafrikaZentralafrikaSüdlecht AfrikaAmerikaNërdlecht AmerikaKari" + - "bikOstasienSüdasienSüdostasienSüdeuropaAustralien an NeiséilandMelan" + - "esienMikronesescht InselgebittPolynesienAsienZentralasienWestasienEu" + - "ropaOsteuropaNordeuropaWesteuropaLatäinamerika", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002b, 0x0036, 0x0047, 0x004f, 0x0057, - 0x005f, 0x0065, 0x006e, 0x0079, 0x008b, 0x0096, 0x00a0, 0x00a5, - 0x00b2, 0x00bf, 0x00d5, 0x00dd, 0x00e8, 0x00ee, 0x00fa, 0x0103, - 0x010a, 0x0111, 0x0116, 0x0127, 0x012e, 0x0134, 0x013c, 0x014e, - 0x0157, 0x015e, 0x0164, 0x016f, 0x0177, 0x0185, 0x018b, 0x0191, - 0x019d, 0x01ab, 0x01c6, 0x01d7, 0x01df, 0x01ef, 0x01fa, 0x01ff, - 0x0206, 0x020b, 0x0214, 0x0224, 0x022e, 0x0232, 0x023b, 0x0243, - 0x0255, 0x025b, 0x0265, 0x0271, 0x027d, 0x0286, 0x028f, 0x0297, - // Entry 40 - 7F - 0x02ad, 0x02b5, 0x02c4, 0x02cb, 0x02d2, 0x02d9, 0x02e3, 0x02ea, - 0x02f1, 0x02fa, 0x030c, 0x030c, 0x0314, 0x031b, 0x032a, 0x0335, - 0x033d, 0x0348, 0x034d, 0x035d, 0x0364, 0x036c, 0x0373, 0x037b, - 0x0380, 0x0389, 0x0392, 0x0398, 0x039e, 0x03a8, 0x03b8, 0x03c3, - 0x03f0, 0x03f9, 0x03fd, 0x040a, 0x0410, 0x042f, 0x0448, 0x0450, - 0x0458, 0x045d, 0x0463, 0x0474, 0x047e, 0x0484, 0x048a, 0x0495, - 0x049b, 0x04c3, 0x04c7, 0x04cb, 0x04d1, 0x04d8, 0x04de, 0x04e5, - 0x04ee, 0x04f3, 0x04f8, 0x0503, 0x050d, 0x0515, 0x051c, 0x052e, - // Entry 80 - BF - 0x0537, 0x0540, 0x0546, 0x0553, 0x055d, 0x0561, 0x0568, 0x0571, - 0x057e, 0x0587, 0x058e, 0x0595, 0x059c, 0x05a7, 0x05af, 0x05b5, - 0x05bc, 0x05c2, 0x05cb, 0x05d5, 0x05df, 0x05e9, 0x05f8, 0x0602, - 0x0606, 0x060d, 0x0615, 0x0630, 0x0642, 0x064c, 0x0657, 0x0661, - 0x0666, 0x066f, 0x0677, 0x067d, 0x0683, 0x068b, 0x0693, 0x069a, - 0x06a7, 0x06ac, 0x06b8, 0x06bf, 0x06c8, 0x06cf, 0x06d7, 0x06dc, - 0x06e1, 0x06e5, 0x06f0, 0x06f4, 0x06fa, 0x06fe, 0x0714, 0x0723, - 0x072f, 0x0737, 0x073c, 0x0751, 0x0760, 0x076b, 0x078c, 0x0794, - // Entry C0 - FF - 0x0799, 0x07a1, 0x07a6, 0x07b8, 0x07c0, 0x07c9, 0x07d0, 0x07d8, - 0x07de, 0x07eb, 0x07f4, 0x07fe, 0x0803, 0x080b, 0x0813, 0x081d, - 0x0826, 0x083a, 0x0842, 0x084e, 0x0858, 0x085f, 0x0866, 0x086e, - 0x0877, 0x088d, 0x0898, 0x08a4, 0x08aa, 0x08b3, 0x08c3, 0x08d9, - 0x08df, 0x0905, 0x0909, 0x0911, 0x091e, 0x0925, 0x092d, 0x0939, - 0x0941, 0x0946, 0x094d, 0x095f, 0x0965, 0x096b, 0x0973, 0x0979, - 0x097f, 0x0994, 0x0994, 0x09b0, 0x09b7, 0x09c1, 0x09cc, 0x09ea, - 0x09f3, 0x0a0b, 0x0a27, 0x0a2e, 0x0a35, 0x0a44, 0x0a49, 0x0a4f, - // Entry 100 - 13F - 0x0a54, 0x0a5b, 0x0a65, 0x0a6b, 0x0a73, 0x0a84, 0x0a88, 0x0a8e, - 0x0a99, 0x0aa4, 0x0aac, 0x0ab6, 0x0ac4, 0x0acd, 0x0ad7, 0x0ae4, - 0x0af4, 0x0afb, 0x0b0d, 0x0b14, 0x0b1c, 0x0b25, 0x0b31, 0x0b3b, - 0x0b54, 0x0b5e, 0x0b77, 0x0b81, 0x0b86, 0x0b92, 0x0b9b, 0x0ba1, - 0x0baa, 0x0bb4, 0x0bbe, 0x0bcc, - }, - }, - { // lg - "AndoraEmireetiAfaganisitaniAntigwa ne BarabudaAngwilaAlibaniyaArameniyaA" + - "ngolaArigentinaSamowa omumerikaAwusituriyaAwusitureliyaArubaAzerebay" + - "ijaaniBoziniya HezegovinaBarabadosiBangaladesiBubirigiBurukina FasoB" + - "ulugariyaBaareeniBurundiBeniniBeremudaBurunayiBoliviyaBuraziiriBaham" + - "asiButaaniBotiswanaBelarusiBelizeKanadaKongo - ZayireLipubulika eya " + - "SenturafirikiKongoSwitizirandiKote DivwaBizinga bya KkukiCileKameruu" + - "niCayinaKolombyaKosita RikaCubaBizinga by’e Kepu VerediSipuriyaLipub" + - "ulika ya CeekaBudaakiJjibutiDenimaakaDominikaLipubulika ya DominikaA" + - "ligeryaEkwadoEsitoniyaMisiriEritureyaSipeyiniEsyopyaFinilandiFijiBiz" + - "inga by’eFalikalandiMikuronezyaBufalansaGaboniBungerezaGurenadaGyogy" + - "aGuyana enfalansaGanaGiburalitaGurenelandiGambyaGiniGwadalupeGayana " + - "ey’oku ekwetaBugereeki/BuyonaaniGwatemalaGwamuGini-BisawuGayanaHundu" + - "rasiKurowesyaHayitiHangareYindonezyaAyalandiYisirayeriBuyindiBizinga" + - " by’eCagoYiraakaYiraaniAyisirandiYitaleJamayikaYorodaniJapaniKenyaKi" + - "rigizisitaaniKambodyaKiribatiBizinga by’eKomoroSenti Kitisi ne Nevis" + - "iKoreya ey’omumambukaKoreya ey’omumaserengetaKuwetiBizinga ebya Kayi" + - "maaniKazakisitaaniLawosiLebanoniSenti LuciyaLicitensitayiniSirilanka" + - "LiberyaLesosoLisuwenyaLukisembaagaLativyaLibyaMorokoMonakoMolodovaMa" + - "dagasikaBizinga bya MarisoMasedoniyaMaliMyanimaMongoliyaBizinga bya " + - "Mariyana eby’omumambukaMaritiniikiMawulitenyaMonteseraatiMalitaMawul" + - "isyasiBizinga by’eMalidiveMalawiMekisikoMalezyaMozambiikiNamibiyaKal" + - "edonya mupyaNijeKizinga ky’eNorofokoNayijeryaNikaraguwaHolandiNoweNe" + - "paloNawuruNiyuweNiyuziirandiOmaaniPanamaPeruPolinesiya enfalansaPapw" + - "a NyuginiBizinga bya FiripinoPakisitaaniPolandiSenti Piyere ne Mikel" + - "oniPitikeeniPotorikoPalesitayiniPotugaaliPalawuParagwayiKataaLeyunyo" + - "niLomaniyaLasaRwandaSawudarebya - BuwarabuBizanga by’eSolomooniSeser" + - "eSudaaniSwideniSingapowaSenti HerenaSirovenyaSirovakyaSiyeralewoneSa" + - "nimarinoSenegaaloSomaliyaSurinaamuSanitome ne PurincipeEl salivadoSi" + - "riyaSwazirandiBizinga by’eTaaka ne KayikosiCaadiTogoTayirandiTajikis" + - "itaaniTokelawuTimowaTakimenesitaaniTunisyaTongaTtakeTurindaadi ne To" + - "bagoTuvaluTayiwaniTanzaniyaYukurayineYugandaAmerikaWurugwayiWuzibeki" + - "sitaaniVatikaaniSenti Vinsenti ne GurendadiiniVenzweraBizinga ebya V" + - "irigini ebitwalibwa BungerezaBizinga bya Virigini eby’AmerikaVyetina" + - "amuVanawuwatuWalisi ne FutunaSamowaYemeniMayotteSawusafirikaZambyaZi" + - "mbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x000e, 0x001b, 0x002e, 0x0035, 0x003e, - 0x0047, 0x004d, 0x004d, 0x0057, 0x0067, 0x0072, 0x007f, 0x0084, - 0x0084, 0x0092, 0x00a5, 0x00af, 0x00ba, 0x00c2, 0x00cf, 0x00d9, - 0x00e1, 0x00e8, 0x00ee, 0x00ee, 0x00f6, 0x00fe, 0x0106, 0x0106, - 0x010f, 0x0117, 0x011e, 0x011e, 0x0127, 0x012f, 0x0135, 0x013b, - 0x013b, 0x0149, 0x0165, 0x016a, 0x0176, 0x0180, 0x0191, 0x0195, - 0x019e, 0x01a4, 0x01ac, 0x01ac, 0x01b7, 0x01bb, 0x01d5, 0x01d5, - 0x01d5, 0x01dd, 0x01f0, 0x01f7, 0x01f7, 0x01fe, 0x0207, 0x020f, - // Entry 40 - 7F - 0x0225, 0x022d, 0x022d, 0x0233, 0x023c, 0x0242, 0x0242, 0x024b, - 0x0253, 0x025a, 0x025a, 0x025a, 0x0263, 0x0267, 0x0280, 0x028b, - 0x028b, 0x0294, 0x029a, 0x02a3, 0x02ab, 0x02b1, 0x02c1, 0x02c1, - 0x02c5, 0x02cf, 0x02da, 0x02e0, 0x02e4, 0x02ed, 0x0303, 0x0316, - 0x0316, 0x031f, 0x0324, 0x032f, 0x0335, 0x0335, 0x0335, 0x033e, - 0x0347, 0x034d, 0x0354, 0x0354, 0x035e, 0x0366, 0x0370, 0x0370, - 0x0377, 0x0389, 0x0390, 0x0397, 0x03a1, 0x03a7, 0x03a7, 0x03af, - 0x03b7, 0x03bd, 0x03c2, 0x03d1, 0x03d9, 0x03e1, 0x03f5, 0x040b, - // Entry 80 - BF - 0x0421, 0x043b, 0x0441, 0x0457, 0x0464, 0x046a, 0x0472, 0x047e, - 0x048d, 0x0496, 0x049d, 0x04a3, 0x04ac, 0x04b8, 0x04bf, 0x04c4, - 0x04ca, 0x04d0, 0x04d8, 0x04d8, 0x04d8, 0x04e2, 0x04f4, 0x04fe, - 0x0502, 0x0509, 0x0512, 0x0512, 0x0537, 0x0542, 0x054d, 0x0559, - 0x055f, 0x056a, 0x0580, 0x0586, 0x058e, 0x0595, 0x059f, 0x05a7, - 0x05b6, 0x05ba, 0x05d0, 0x05d9, 0x05e3, 0x05ea, 0x05ee, 0x05f4, - 0x05fa, 0x0600, 0x060c, 0x0612, 0x0618, 0x061c, 0x0630, 0x063d, - 0x0651, 0x065c, 0x0663, 0x067b, 0x0684, 0x068c, 0x0698, 0x06a1, - // Entry C0 - FF - 0x06a7, 0x06b0, 0x06b5, 0x06b5, 0x06be, 0x06c6, 0x06c6, 0x06ca, - 0x06d0, 0x06e6, 0x06fd, 0x0703, 0x070a, 0x0711, 0x071a, 0x0726, - 0x072f, 0x072f, 0x0738, 0x0744, 0x074e, 0x0757, 0x075f, 0x0768, - 0x0768, 0x077d, 0x0788, 0x0788, 0x078e, 0x0798, 0x0798, 0x07b7, - 0x07bc, 0x07bc, 0x07c0, 0x07c9, 0x07d6, 0x07de, 0x07e4, 0x07f3, - 0x07fa, 0x07ff, 0x0804, 0x0818, 0x081e, 0x0826, 0x082f, 0x0839, - 0x0840, 0x0840, 0x0840, 0x0847, 0x0850, 0x085f, 0x0868, 0x0886, - 0x088e, 0x08b9, 0x08db, 0x08e5, 0x08ef, 0x08ff, 0x0905, 0x0905, - // Entry 100 - 13F - 0x090b, 0x0912, 0x091e, 0x0924, 0x092c, - }, - }, - { // lkt - "Uŋčíyapi MakȟóčhePȟečhókaŋhaŋska MakȟóčheIyášiča MakȟóčheSpayólaȟče Makȟ" + - "óčheKisúŋla MakȟóčheSpayóla MakȟóčheMílahaŋska TȟamákȟočheMakȟásito" + - "mniHásapa MakȟáwitaKhéya WítaHazíla MakȟáwitaWašíču Makȟáwita", - []uint16{ // 288 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, - 0x0037, 0x0037, 0x0037, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - // Entry 40 - 7F - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0066, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - // Entry 80 - BF - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - 0x007b, 0x007b, 0x007b, 0x007b, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - // Entry C0 - FF - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, - 0x008f, 0x008f, 0x008f, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, - 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, - // Entry 100 - 13F - 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00b9, 0x00cc, - 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, - 0x00cc, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, - 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00eb, 0x00eb, 0x00eb, 0x0100, - }, - }, - { // ln - "AndorɛLɛmila alaboAfiganisitáAntiga mpé BarbudaAngiyɛAlibaniAmɛniAngólaA" + - "ntarctiqueArizantinɛSamoa ya AmerikiOtilisiOsitáliArubaAzɛlɛbaizáBos" + - "ini mpé HezegovineBarɛbadɛBengalidɛsiBelezikiBukina FasoBiligariBahr" + - "ɛnɛBurundiBenɛBermudaBrineyiBoliviBrezílɛBahamasɛButániBotswanaByel" + - "orisiBelizɛKanadaRepublíki ya Kongó DemokratíkiRepibiki ya Afríka ya" + - " KátiKongoSwisɛKotídivualɛBisanga bya KookɛSíliKamɛruneSinɛKolombiKo" + - "sitarikaKibaBisanga bya KapevɛrɛSípɛlɛShekiaAlemaniDzibutiDanɛmarike" + - "DomínikeRepibiki ya DomínikɛAlizɛriEkwatɛ́lɛEsitoniEzípiteElitelɛEsi" + - "panyeEtsíopiFilandɛFidziBisanga bya MaluniMikroneziFalánsɛGabɔAngɛlɛ" + - "tɛ́lɛGelenadɛZorziGiyanɛ ya FalánsɛGuerneseyGanaZibatalɛGowelandeGam" + - "biGinɛGwadɛlupɛGinɛ́kwatɛ́lɛGelekiÎles de Géorgie du Sud et Sandwich" + - " du SudGwatémalaGwamɛGinɛbisauGiyaneIle Heard et Iles McDonaldOndura" + - "sɛKrowasiAyitiOngiliIndoneziIrelandɛIsirayelɛÍndɛMabelé ya Angɛlɛtɛ́" + - "lɛ na mbú ya IndiyaIrakiIrâIsilandɛItaliZamaikiZɔdaniZapɔKenyaKigizi" + - "sitáKambodzaKiribatiKomorɛSántu krístofe mpé Nevɛ̀sKorɛ ya nɔ́rdiKor" + - "ɛ ya súdiKowetiBisanga bya KayímaKazakisitáLawosiLibáSántu lisiLish" + - "ɛteniSirilankaLibériyaLesotoLitwaniLikisambuluLetoniLibíMarokɛMonak" + - "oMolidaviMonténégroMadagasikariBisanga bya MarishalɛMasedwanɛMalíBir" + - "manieMongolíBisanga bya Marianɛ ya nɔ́rdiMartinikiMoritaniMɔseraMali" + - "tɛMorisɛMadívɛMalawiMeksikeMaleziMozambíkiNamibiKaledoni ya sikaNizɛ" + - "rɛEsanga NorfokɛNizeryaNikaragwaOlandɛNorivezɛNepálɛNauruNyuéZelandɛ" + - " ya sikaOmánɛPanamaPéruPolinezi ya FalánsɛPapwazi Ginɛ ya sikaFilipi" + - "nɛPakisitáPoloniSántu pététo mpé MikelɔPikairniPɔtorikoPalɛsinePutúl" + - "ugɛsiPalauPalagweiKatariLenyoRomaniSerbieRisíRwandaAlabi SawuditɛBis" + - "anga SolomɔSɛshɛlɛSudáSwédɛSingapurɛSántu eleniSiloveniSilovakiSiera" + - " LeonɛSántu MarinɛSenegalɛSomaliSurinamɛSao Tomé mpé PresipɛSavadɔrɛ" + - "SiríSwazilandiBisanga bya Turki mpé KaikoTsádiTerres australes et an" + - "tarctiques françaisesTogoTailandɛTazikisitáTokelauTimorɛ ya MoniɛlɛT" + - "ikɛménisitáTiniziTongaTilikiTinidadɛ mpé TobagoTuvaluTaiwaninTanzani" + - "IkrɛniUgandaAmerikiIrigweiUzibɛkisitáVatikáSántu vesá mpé Gelenadinɛ" + - "VenézuelaBisanga bya Vierzi ya Angɛlɛtɛ́lɛBisanga bya Vierzi ya Amer" + - "ikiViyetinamɛVanuatuWalisɛ mpé FutunaSamoaYemɛnɛMayotɛAfríka ya Súdi" + - "ZambiZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x0014, 0x0020, 0x0033, 0x003a, 0x0041, - 0x0047, 0x004e, 0x0059, 0x0064, 0x0074, 0x007b, 0x0083, 0x0088, - 0x0088, 0x0095, 0x00ab, 0x00b5, 0x00c1, 0x00c9, 0x00d4, 0x00dc, - 0x00e5, 0x00ec, 0x00f1, 0x00f1, 0x00f8, 0x00ff, 0x0105, 0x0105, - 0x010e, 0x0117, 0x011e, 0x011e, 0x0126, 0x012f, 0x0136, 0x013c, - 0x013c, 0x015d, 0x0179, 0x017e, 0x0184, 0x0191, 0x01a3, 0x01a8, - 0x01b1, 0x01b6, 0x01bd, 0x01bd, 0x01c7, 0x01cb, 0x01e1, 0x01e1, - 0x01e1, 0x01ea, 0x01f0, 0x01f7, 0x01f7, 0x01fe, 0x0209, 0x0212, - // Entry 40 - 7F - 0x0228, 0x0230, 0x0230, 0x023c, 0x0243, 0x024b, 0x024b, 0x0253, - 0x025b, 0x0263, 0x0263, 0x0263, 0x026b, 0x0270, 0x0282, 0x028b, - 0x028b, 0x0294, 0x0299, 0x02a9, 0x02b2, 0x02b7, 0x02cb, 0x02d4, - 0x02d8, 0x02e1, 0x02ea, 0x02ef, 0x02f4, 0x02ff, 0x0311, 0x0317, - 0x0342, 0x034c, 0x0352, 0x035c, 0x0362, 0x0362, 0x037c, 0x0385, - 0x038c, 0x0391, 0x0397, 0x0397, 0x039f, 0x03a8, 0x03b2, 0x03b2, - 0x03b8, 0x03e5, 0x03ea, 0x03ee, 0x03f7, 0x03fc, 0x03fc, 0x0403, - 0x040a, 0x040f, 0x0414, 0x041f, 0x0427, 0x042f, 0x0436, 0x0454, - // Entry 80 - BF - 0x0465, 0x0473, 0x0479, 0x048c, 0x0497, 0x049d, 0x04a2, 0x04ad, - 0x04b7, 0x04c0, 0x04c9, 0x04cf, 0x04d6, 0x04e1, 0x04e7, 0x04ec, - 0x04f3, 0x04f9, 0x0501, 0x050d, 0x050d, 0x0519, 0x052f, 0x0539, - 0x053e, 0x0546, 0x054e, 0x054e, 0x056e, 0x0577, 0x057f, 0x0586, - 0x058d, 0x0594, 0x059c, 0x05a2, 0x05a9, 0x05af, 0x05b9, 0x05bf, - 0x05cf, 0x05d7, 0x05e6, 0x05ed, 0x05f6, 0x05fd, 0x0606, 0x060e, - 0x0613, 0x0618, 0x0628, 0x062f, 0x0635, 0x063a, 0x064f, 0x0664, - 0x066d, 0x0676, 0x067c, 0x0698, 0x06a0, 0x06a9, 0x06b2, 0x06be, - // Entry C0 - FF - 0x06c3, 0x06cb, 0x06d1, 0x06d1, 0x06d6, 0x06dc, 0x06e2, 0x06e7, - 0x06ed, 0x06fc, 0x070b, 0x0715, 0x071a, 0x0721, 0x072b, 0x0737, - 0x073f, 0x073f, 0x0747, 0x0753, 0x0761, 0x076a, 0x0770, 0x0779, - 0x0779, 0x0790, 0x079a, 0x079a, 0x079f, 0x07a9, 0x07a9, 0x07c5, - 0x07cb, 0x07f7, 0x07fb, 0x0804, 0x080f, 0x0816, 0x082a, 0x0839, - 0x083f, 0x0844, 0x084a, 0x085f, 0x0865, 0x086d, 0x0874, 0x087b, - 0x0881, 0x0881, 0x0881, 0x0888, 0x088f, 0x089c, 0x08a3, 0x08c0, - 0x08ca, 0x08f0, 0x090d, 0x0918, 0x091f, 0x0932, 0x0937, 0x0937, - // Entry 100 - 13F - 0x093f, 0x0946, 0x0956, 0x095b, 0x0963, - }, - }, - { // lo - loRegionStr, - loRegionIdx, - }, - { // lrc - "بئرئزیلچینآلمانفأرانسەبیریتانیا گأپھئنئیتالیاجاپوٙنروٙسیەڤولاتیا یأکاگئر" + - "تەراساگە نادیاردونیائفریقائمریکا شومالیئمریکا ھارگەھوم پئڤأند جأھوٙ" + - "ن آڤمینجا ئمریکائمریکائمریکا ڤاروکارائیبآسیائوروٙپائمریکا لاتین", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, - 0x0014, 0x0014, 0x0014, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - // Entry 40 - 7F - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, - 0x001e, 0x002c, 0x002c, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x0059, 0x0059, 0x0059, - 0x0059, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry 80 - BF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, - // Entry C0 - FF - 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0071, - 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, - 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, - 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, - 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, - 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, - 0x0071, 0x0071, 0x0071, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - // Entry 100 - 13F - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x00ab, 0x00b5, 0x00c1, - 0x00da, 0x00f1, 0x0116, 0x0116, 0x012d, 0x012d, 0x012d, 0x012d, - 0x012d, 0x0139, 0x014e, 0x015c, 0x015c, 0x015c, 0x015c, 0x015c, - 0x015c, 0x015c, 0x015c, 0x015c, 0x0164, 0x0164, 0x0164, 0x0172, - 0x0172, 0x0172, 0x0172, 0x0189, - }, - }, - { // lt - ltRegionStr, - ltRegionIdx, - }, - { // lu - "AndoreLemila alabuAfuganisitaAntiga ne BarbudaAngiyeAlubaniAmeniAngolaAl" + - "ijantineSamoa wa AmerikiOtilisiOsitaliArubaAjelbayidjaMbosini ne Hez" + - "egovineBarebadeBenguladeshiBelejikiBukinafasoBiligariBahreneBurundiB" + - "eneBermudaBrineyiMboliviMnulezileBahamaseButaniMbotswanaByelorisiBel" + - "izeKanadaDitunga wa KonguDitunga dya Afrika wa munkatshiKonguSwiseKo" + - "tedivualeLutanda lua KookɛShiliKameruneShineKolombiKositarikaKubaLut" + - "anda lua KapeveleShipeleDitunga dya TshekaAlemanuDjibutiDanemalakuDu" + - "minikuDitunga wa DuminikuAlijeriEkwateleEsitoniMushidiEliteleNsipani" + - "EtshiopiFilandeFujiLutanda lua MaluniMikroneziNfalanseNgabuAngeletel" + - "eNgelenadeJorijiGiyane wa NfalanseNganaJibeletaleNgowelandeGambiNgin" + - "eNgwadelupeGine EkwateleNgelekaNgwatemalaNgwameNginebisauNgiyaneOndu" + - "raseKrowasiAyitiOngiliIndoneziIrelandeIsirayeleIndeLutanda lwa Angel" + - "etele ku mbu wa IndiyaIrakiIraIsilandeItaliJamaikiJodaniJapuKenyaKig" + - "izisitaKambodzaKiribatiKomoruSantu krístofe ne NevesKore wa muuluKor" + - "e wa mwinshiKowetiLutanda lua KayimaKazakusitaLawosiLibaSantu lisiLi" + - "shuteniSirilankaLiberiyaLesotoLitwaniLikisambuluLetoniLibiMarokeMona" + - "kuMolidaviMadagasikariLutanda lua MarishaleMasedwaneMaliMyamareMongo" + - "liLutanda lua Mariane wa muuluMartinikiMoritaniMuseraMaliteMoriseMad" + - "iveMalawiMeksikeMaleziMozambikiNamibiKaledoni wa mumuNijereLutanda l" + - "ua NorfokNijeryaNikaragwaOlandɛNorivejeNepálɛNauruNyueZelanda wa mum" + - "uOmanePanamaPeruPolinezi wa NfalansePapwazi wa Nginɛ wa mumuNfilipiP" + - "akisitaMpoloniSantu pététo ne MikeluPikairniMpotorikuPalesineMputulu" + - "geshiPalauPalagweiKatariLenyoRomaniRisiRwandaAlabu NsawudiLutanda lu" + - "a SolomuSesheleSudaSuwediSingapureSantu eleniSiloveniSilovakiSiera L" + - "eoneSantu MarineSenegaleSomaliSurinameSao Tome ne PresipɛSavadoreSir" + - "iSwazilandiLutanda lua Tuluki ne KaikoTshadiToguTayilandaTazikisitaT" + - "okelauTimoru wa dibokuTukemenisitaTiniziTongaTulukiTinidade ne Tobag" + - "oTuvaluTaiwaniTanzaniUkreniUgandaAmerikiIrigweiUzibekisitaNvatikaSan" + - "tu vesa ne NgelenadineVenezuelaLutanda lua Vierzi wa AngeleteleLutan" + - "da lua Vierzi wa AmerikiViyetinameVanuatuWalise ne FutunaSamoaYemenu" + - "MayoteAfrika ya SúdiZambiZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0012, 0x001d, 0x002e, 0x0034, 0x003b, - 0x0040, 0x0046, 0x0046, 0x0050, 0x0060, 0x0067, 0x006e, 0x0073, - 0x0073, 0x007e, 0x0093, 0x009b, 0x00a7, 0x00af, 0x00b9, 0x00c1, - 0x00c8, 0x00cf, 0x00d3, 0x00d3, 0x00da, 0x00e1, 0x00e8, 0x00e8, - 0x00f1, 0x00f9, 0x00ff, 0x00ff, 0x0108, 0x0111, 0x0117, 0x011d, - 0x011d, 0x012d, 0x014c, 0x0151, 0x0156, 0x0161, 0x0173, 0x0178, - 0x0180, 0x0185, 0x018c, 0x018c, 0x0196, 0x019a, 0x01ae, 0x01ae, - 0x01ae, 0x01b5, 0x01c7, 0x01ce, 0x01ce, 0x01d5, 0x01df, 0x01e7, - // Entry 40 - 7F - 0x01fa, 0x0201, 0x0201, 0x0209, 0x0210, 0x0217, 0x0217, 0x021e, - 0x0225, 0x022d, 0x022d, 0x022d, 0x0234, 0x0238, 0x024a, 0x0253, - 0x0253, 0x025b, 0x0260, 0x026a, 0x0273, 0x0279, 0x028b, 0x028b, - 0x0290, 0x029a, 0x02a4, 0x02a9, 0x02ae, 0x02b8, 0x02c5, 0x02cc, - 0x02cc, 0x02d6, 0x02dc, 0x02e6, 0x02ed, 0x02ed, 0x02ed, 0x02f5, - 0x02fc, 0x0301, 0x0307, 0x0307, 0x030f, 0x0317, 0x0320, 0x0320, - 0x0324, 0x034b, 0x0350, 0x0353, 0x035b, 0x0360, 0x0360, 0x0367, - 0x036d, 0x0371, 0x0376, 0x0380, 0x0388, 0x0390, 0x0396, 0x03ae, - // Entry 80 - BF - 0x03bb, 0x03ca, 0x03d0, 0x03e2, 0x03ec, 0x03f2, 0x03f6, 0x0400, - 0x0409, 0x0412, 0x041a, 0x0420, 0x0427, 0x0432, 0x0438, 0x043c, - 0x0442, 0x0448, 0x0450, 0x0450, 0x0450, 0x045c, 0x0471, 0x047a, - 0x047e, 0x0485, 0x048c, 0x048c, 0x04a8, 0x04b1, 0x04b9, 0x04bf, - 0x04c5, 0x04cb, 0x04d1, 0x04d7, 0x04de, 0x04e4, 0x04ed, 0x04f3, - 0x0503, 0x0509, 0x051b, 0x0522, 0x052b, 0x0532, 0x053a, 0x0542, - 0x0547, 0x054b, 0x055a, 0x055f, 0x0565, 0x0569, 0x057d, 0x0596, - 0x059d, 0x05a5, 0x05ac, 0x05c4, 0x05cc, 0x05d5, 0x05dd, 0x05e9, - // Entry C0 - FF - 0x05ee, 0x05f6, 0x05fc, 0x05fc, 0x0601, 0x0607, 0x0607, 0x060b, - 0x0611, 0x061e, 0x0630, 0x0637, 0x063b, 0x0641, 0x064a, 0x0655, - 0x065d, 0x065d, 0x0665, 0x0670, 0x067c, 0x0684, 0x068a, 0x0692, - 0x0692, 0x06a6, 0x06ae, 0x06ae, 0x06b2, 0x06bc, 0x06bc, 0x06d7, - 0x06dd, 0x06dd, 0x06e1, 0x06ea, 0x06f4, 0x06fb, 0x070b, 0x0717, - 0x071d, 0x0722, 0x0728, 0x073a, 0x0740, 0x0747, 0x074e, 0x0754, - 0x075a, 0x075a, 0x075a, 0x0761, 0x0768, 0x0773, 0x077a, 0x0793, - 0x079c, 0x07bc, 0x07d9, 0x07e3, 0x07ea, 0x07fa, 0x07ff, 0x07ff, - // Entry 100 - 13F - 0x0805, 0x080b, 0x081a, 0x081f, 0x0827, - }, - }, - { // luo - "AndorraUnited Arab EmiratesAfghanistanAntigua gi BarbudaAnguillaAlbaniaA" + - "rmeniaAngolaArgentinaAmerican SamoaAustriaAustraliaArubaAzerbaijanBo" + - "snia gi HerzegovinaBarbadosBangladeshBelgiumBurkina FasoBulgariaBahr" + - "ainBurundiBeninBermudaBruneiBoliviaBrazilBahamasBhutanBotswanaBelaru" + - "sBelizeCanadaDemocratic Republic of the CongoCentral African Republi" + - "cCongoSwitzerlandCôte dCook IslandsChileCameroonChinaColombiaCosta R" + - "icaCubaCape Verde IslandsCyprusCzech RepublicGermanyDjiboutiDenmarkD" + - "ominicaDominican RepublicAlgeriaEcuadorEstoniaEgyptEritreaSpainEthio" + - "piaFinlandFijiChuia mar FalklandMicronesiaFranceGabonUnited KingdomG" + - "renadaGeorgiaFrench GuianaGhanaGibraltarGreenlandGambiaGuineaGuadelo" + - "upeEquatorial GuineaGreeceGuatemalaGuamGuinea-BissauGuyanaHondurasCr" + - "oatiaHaitiHungaryIndonesiaIrelandIsraelIndiaBritish Indian Ocean Ter" + - "ritoryIraqIranIcelandItalyJamaicaJordanJapanKenyaKyrgyzstanCambodiaK" + - "iribatiComorosSaint Kitts gi NevisKorea MasawaKorea MilamboKuwaitCay" + - "man IslandsKazakhstanLaosLebanonSaint LuciaLiechtensteinSri LankaLib" + - "eriaLesothoLithuaniaLuxembourgLatviaLibyaMoroccoMonacoMoldovaMadagas" + - "carChuia mar MarshallMacedoniaMaliMyanmarMongoliaNorthern Mariana Is" + - "landsMartiniqueMauritaniaMontserratMaltaMauritiusMaldivesMalawiMexic" + - "oMalaysiaMozambiqueNamibiaNew CaledoniaNigerChuia mar NorfolkNigeria" + - "NicaraguaNetherlandsNorwayNepalNauruNiueNew ZealandOmanPanamaPeruFre" + - "nch PolynesiaPapua New GuineaPhilippinesPakistanPolandSaint Pierre g" + - "i MiquelonPitcairnPuerto RicoPalestinian West Bank gi GazaPortugalPa" + - "lauParaguayQatarRéunionRomaniaRussiaRwandaSaudi ArabiaSolomon Island" + - "sSeychellesSudanSwedenSingaporeSaint HelenaSloveniaSlovakiaSierra Le" + - "oneSan MarinoSenegalSomaliaSurinameSão Tomé gi PríncipeEl SalvadorSy" + - "riaSwazilandTurks gi Caicos IslandsChadTogoThailandTajikistanTokelau" + - "East TimorTurkmenistanTunisiaTongaTurkeyTrinidad gi TobagoTuvaluTaiw" + - "anTanzaniaUkraineUgandaUSAUruguayUzbekistanVatican StateSaint Vincen" + - "t gi GrenadinesVenezuelaBritish Virgin IslandsU.S. Virgin IslandsVie" + - "tnamVanuatuWallis gi FutunaSamoaYemenMayotteSouth AfricaZambiaZimbab" + - "we", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x001b, 0x0026, 0x0038, 0x0040, 0x0047, - 0x004e, 0x0054, 0x0054, 0x005d, 0x006b, 0x0072, 0x007b, 0x0080, - 0x0080, 0x008a, 0x009f, 0x00a7, 0x00b1, 0x00b8, 0x00c4, 0x00cc, - 0x00d3, 0x00da, 0x00df, 0x00df, 0x00e6, 0x00ec, 0x00f3, 0x00f3, - 0x00f9, 0x0100, 0x0106, 0x0106, 0x010e, 0x0115, 0x011b, 0x0121, - 0x0121, 0x0141, 0x0159, 0x015e, 0x0169, 0x0170, 0x017c, 0x0181, - 0x0189, 0x018e, 0x0196, 0x0196, 0x01a0, 0x01a4, 0x01b6, 0x01b6, - 0x01b6, 0x01bc, 0x01ca, 0x01d1, 0x01d1, 0x01d9, 0x01e0, 0x01e8, - // Entry 40 - 7F - 0x01fa, 0x0201, 0x0201, 0x0208, 0x020f, 0x0214, 0x0214, 0x021b, - 0x0220, 0x0228, 0x0228, 0x0228, 0x022f, 0x0233, 0x0245, 0x024f, - 0x024f, 0x0255, 0x025a, 0x0268, 0x026f, 0x0276, 0x0283, 0x0283, - 0x0288, 0x0291, 0x029a, 0x02a0, 0x02a6, 0x02b0, 0x02c1, 0x02c7, - 0x02c7, 0x02d0, 0x02d4, 0x02e1, 0x02e7, 0x02e7, 0x02e7, 0x02ef, - 0x02f6, 0x02fb, 0x0302, 0x0302, 0x030b, 0x0312, 0x0318, 0x0318, - 0x031d, 0x033b, 0x033f, 0x0343, 0x034a, 0x034f, 0x034f, 0x0356, - 0x035c, 0x0361, 0x0366, 0x0370, 0x0378, 0x0380, 0x0387, 0x039b, - // Entry 80 - BF - 0x03a7, 0x03b4, 0x03ba, 0x03c8, 0x03d2, 0x03d6, 0x03dd, 0x03e8, - 0x03f5, 0x03fe, 0x0405, 0x040c, 0x0415, 0x041f, 0x0425, 0x042a, - 0x0431, 0x0437, 0x043e, 0x043e, 0x043e, 0x0448, 0x045a, 0x0463, - 0x0467, 0x046e, 0x0476, 0x0476, 0x048e, 0x0498, 0x04a2, 0x04ac, - 0x04b1, 0x04ba, 0x04c2, 0x04c8, 0x04ce, 0x04d6, 0x04e0, 0x04e7, - 0x04f4, 0x04f9, 0x050a, 0x0511, 0x051a, 0x0525, 0x052b, 0x0530, - 0x0535, 0x0539, 0x0544, 0x0548, 0x054e, 0x0552, 0x0562, 0x0572, - 0x057d, 0x0585, 0x058b, 0x05a3, 0x05ab, 0x05b6, 0x05d3, 0x05db, - // Entry C0 - FF - 0x05e0, 0x05e8, 0x05ed, 0x05ed, 0x05f5, 0x05fc, 0x05fc, 0x0602, - 0x0608, 0x0614, 0x0623, 0x062d, 0x0632, 0x0638, 0x0641, 0x064d, - 0x0655, 0x0655, 0x065d, 0x0669, 0x0673, 0x067a, 0x0681, 0x0689, - 0x0689, 0x06a0, 0x06ab, 0x06ab, 0x06b0, 0x06b9, 0x06b9, 0x06d0, - 0x06d4, 0x06d4, 0x06d8, 0x06e0, 0x06ea, 0x06f1, 0x06fb, 0x0707, - 0x070e, 0x0713, 0x0719, 0x072b, 0x0731, 0x0737, 0x073f, 0x0746, - 0x074c, 0x074c, 0x074c, 0x074f, 0x0756, 0x0760, 0x076d, 0x0788, - 0x0791, 0x07a7, 0x07ba, 0x07c1, 0x07c8, 0x07d8, 0x07dd, 0x07dd, - // Entry 100 - 13F - 0x07e2, 0x07e9, 0x07f5, 0x07fb, 0x0803, - }, - }, - { // luy - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa lya MarekaniAustriaAustraliaArubaAzabajaniBosn" + - "ia na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBaharen" + - "iBurundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarus" + - "iBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya Ka" + - "tiKongoUswisiKodivaaVisiwa vya CookChileKameruniChinaKolombiaKostari" + - "kaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominikaJ" + - "amhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshiUf" + - "iniFijiVisiwa vya FalklandMikronesiaUfaransaGaboniUingerezaGrenadaJo" + - "jiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGinek" + - "wetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungaria" + - "IndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiIr" + - "akiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigizistaniKambodi" + - "aKiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaiti" + - "Visiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSirilan" + - "kaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBukin" + - "iVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya " + - "KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksiko" + - "MalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNika" + - "ragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia " + - "ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitkai" + - "rniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUrenoP" + - "alauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya Solomon" + - "ShelisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera Leoni" + - "SamarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswa" + - "ziVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori" + - " ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuv" + - "aluTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibekistaniVatikaniSa" + - "ntavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiw" + - "a vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniM" + - "ayotteAfrika KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x006a, 0x0071, 0x007a, 0x007f, - 0x007f, 0x0088, 0x009c, 0x00a4, 0x00af, 0x00b7, 0x00c1, 0x00c9, - 0x00d1, 0x00d8, 0x00de, 0x00de, 0x00e5, 0x00eb, 0x00f2, 0x00f2, - 0x00f9, 0x00ff, 0x0105, 0x0105, 0x010d, 0x0115, 0x011b, 0x0121, - 0x0121, 0x0141, 0x015a, 0x015f, 0x0165, 0x016c, 0x017b, 0x0180, - 0x0188, 0x018d, 0x0195, 0x0195, 0x019e, 0x01a2, 0x01aa, 0x01aa, - 0x01aa, 0x01b1, 0x01c1, 0x01ca, 0x01ca, 0x01d0, 0x01d7, 0x01df, - // Entry 40 - 7F - 0x01f2, 0x01f9, 0x01f9, 0x01ff, 0x0206, 0x020b, 0x020b, 0x0212, - 0x021a, 0x0222, 0x0222, 0x0222, 0x0227, 0x022b, 0x023e, 0x0248, - 0x0248, 0x0250, 0x0256, 0x025f, 0x0266, 0x026b, 0x027e, 0x027e, - 0x0283, 0x028b, 0x0294, 0x029a, 0x029e, 0x02a7, 0x02b0, 0x02b7, - 0x02b7, 0x02c0, 0x02c4, 0x02cd, 0x02d3, 0x02d3, 0x02d3, 0x02dc, - 0x02e3, 0x02e8, 0x02f0, 0x02f0, 0x02f9, 0x0301, 0x0308, 0x0308, - 0x030d, 0x0332, 0x0337, 0x033d, 0x0345, 0x034b, 0x034b, 0x0352, - 0x0359, 0x035f, 0x0364, 0x0371, 0x0379, 0x0381, 0x0387, 0x039a, - // Entry 80 - BF - 0x03a9, 0x03b5, 0x03bc, 0x03cd, 0x03d8, 0x03dd, 0x03e5, 0x03ef, - 0x03f9, 0x0402, 0x0409, 0x040f, 0x0417, 0x0420, 0x0427, 0x042c, - 0x0432, 0x0438, 0x043f, 0x043f, 0x043f, 0x0445, 0x0457, 0x0460, - 0x0464, 0x0469, 0x0471, 0x0471, 0x0491, 0x049a, 0x04a3, 0x04ae, - 0x04b3, 0x04b9, 0x04bf, 0x04c5, 0x04cc, 0x04d3, 0x04db, 0x04e2, - 0x04ee, 0x04f4, 0x0505, 0x050c, 0x0515, 0x051d, 0x0522, 0x0528, - 0x052d, 0x0531, 0x053b, 0x0540, 0x0546, 0x054a, 0x055f, 0x0564, - 0x056c, 0x0575, 0x057c, 0x0592, 0x059b, 0x05a4, 0x05d6, 0x05db, - // Entry C0 - FF - 0x05e0, 0x05e8, 0x05ee, 0x05ee, 0x05f7, 0x05fe, 0x05fe, 0x0603, - 0x0609, 0x060e, 0x0620, 0x062a, 0x0630, 0x0636, 0x063e, 0x0649, - 0x0651, 0x0651, 0x0659, 0x0664, 0x066c, 0x0674, 0x067b, 0x0683, - 0x0683, 0x0697, 0x069f, 0x069f, 0x06a4, 0x06aa, 0x06aa, 0x06c3, - 0x06c8, 0x06c8, 0x06cc, 0x06d4, 0x06df, 0x06e6, 0x06f9, 0x0708, - 0x070f, 0x0714, 0x071b, 0x072d, 0x0733, 0x073a, 0x0742, 0x0749, - 0x074f, 0x074f, 0x074f, 0x0757, 0x075e, 0x076a, 0x0772, 0x078b, - 0x0794, 0x07b3, 0x07d1, 0x07da, 0x07e1, 0x07f0, 0x07f5, 0x07f5, - // Entry 100 - 13F - 0x07fb, 0x0802, 0x080f, 0x0815, 0x081d, - }, - }, - { // lv - lvRegionStr, - lvRegionIdx, - }, - { // mas - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa ya MarekaniAustriaAustraliaArubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareni" + - "BurundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarusi" + - "BelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya Kat" + - "iKongoUswisiKodivaaVisiwa vya CookChileKameruniChinaKolombiaKostarik" + - "aKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominikaJa" + - "mhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshiUfi" + - "niFijiVisiwa vya FalklandMikronesiaUfaransaGaboniUingerezaGrenadaJoj" + - "iaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGinekw" + - "etaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungariaI" + - "ndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiIra" + - "kiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigizistaniKambodia" + - "KiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaitiV" + - "isiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSirilank" + - "aLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBukini" + - "Visiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya K" + - "askaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksikoM" + - "alesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNikar" + - "agwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia y" + - "a UfaransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitkair" + - "niPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUrenoPa" + - "lauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya SolomonS" + - "helisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera LeoniS" + - "amarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswaz" + - "iVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori " + - "ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuva" + - "luTaiwaniTansaniaUkrainiUgandaMarekaniUrugwaiUzibekistaniVatikaniSan" + - "tavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa" + - " vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMa" + - "yotteAfrika KusiniSambiaSimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00b6, 0x00c0, 0x00c8, - 0x00d0, 0x00d7, 0x00dd, 0x00dd, 0x00e4, 0x00ea, 0x00f1, 0x00f1, - 0x00f8, 0x00fe, 0x0104, 0x0104, 0x010c, 0x0114, 0x011a, 0x0120, - 0x0120, 0x0140, 0x0159, 0x015e, 0x0164, 0x016b, 0x017a, 0x017f, - 0x0187, 0x018c, 0x0194, 0x0194, 0x019d, 0x01a1, 0x01a9, 0x01a9, - 0x01a9, 0x01b0, 0x01c0, 0x01c9, 0x01c9, 0x01cf, 0x01d6, 0x01de, - // Entry 40 - 7F - 0x01f1, 0x01f8, 0x01f8, 0x01fe, 0x0205, 0x020a, 0x020a, 0x0211, - 0x0219, 0x0221, 0x0221, 0x0221, 0x0226, 0x022a, 0x023d, 0x0247, - 0x0247, 0x024f, 0x0255, 0x025e, 0x0265, 0x026a, 0x027d, 0x027d, - 0x0282, 0x028a, 0x0293, 0x0299, 0x029d, 0x02a6, 0x02af, 0x02b6, - 0x02b6, 0x02bf, 0x02c3, 0x02cc, 0x02d2, 0x02d2, 0x02d2, 0x02db, - 0x02e2, 0x02e7, 0x02ef, 0x02ef, 0x02f8, 0x0300, 0x0307, 0x0307, - 0x030c, 0x0331, 0x0336, 0x033c, 0x0344, 0x034a, 0x034a, 0x0351, - 0x0358, 0x035e, 0x0363, 0x0370, 0x0378, 0x0380, 0x0386, 0x0399, - // Entry 80 - BF - 0x03a8, 0x03b4, 0x03bb, 0x03cc, 0x03d7, 0x03dc, 0x03e4, 0x03ee, - 0x03f8, 0x0401, 0x0408, 0x040e, 0x0416, 0x041f, 0x0426, 0x042b, - 0x0431, 0x0437, 0x043e, 0x043e, 0x043e, 0x0444, 0x0456, 0x045f, - 0x0463, 0x0468, 0x0470, 0x0470, 0x0490, 0x0499, 0x04a2, 0x04ad, - 0x04b2, 0x04b8, 0x04be, 0x04c4, 0x04cb, 0x04d2, 0x04da, 0x04e1, - 0x04ed, 0x04f3, 0x0504, 0x050b, 0x0514, 0x051c, 0x0521, 0x0527, - 0x052c, 0x0530, 0x053a, 0x053f, 0x0545, 0x0549, 0x055e, 0x0563, - 0x056b, 0x0574, 0x057b, 0x0591, 0x059a, 0x05a3, 0x05d5, 0x05da, - // Entry C0 - FF - 0x05df, 0x05e7, 0x05ed, 0x05ed, 0x05f6, 0x05fd, 0x05fd, 0x0602, - 0x0608, 0x060d, 0x061f, 0x0629, 0x062f, 0x0635, 0x063d, 0x0648, - 0x0650, 0x0650, 0x0658, 0x0663, 0x066b, 0x0673, 0x067a, 0x0682, - 0x0682, 0x0696, 0x069e, 0x069e, 0x06a3, 0x06a9, 0x06a9, 0x06c2, - 0x06c7, 0x06c7, 0x06cb, 0x06d3, 0x06de, 0x06e5, 0x06f8, 0x0707, - 0x070e, 0x0713, 0x071a, 0x072c, 0x0732, 0x0739, 0x0741, 0x0748, - 0x074e, 0x074e, 0x074e, 0x0756, 0x075d, 0x0769, 0x0771, 0x078a, - 0x0793, 0x07b2, 0x07d0, 0x07d9, 0x07e0, 0x07ef, 0x07f4, 0x07f4, - // Entry 100 - 13F - 0x07fa, 0x0801, 0x080e, 0x0814, 0x081c, - }, - }, - { // mer - "AndoraFalme cia KiarabuAfuganistaniAntigua na BarbudaAnguillaAlubaniaArm" + - "eniaAngolaAjentinaSamoa ya AmerikaAustiriaAustrĩliaArubaAzebaijaniBo" + - "snia na HezegovinaBabadosiBangiradeshiBeronjiamuBukinafasoBulgariaBa" + - "hariniBurundiBeniniBamudaBruneiBoliviaBraziluBahamasiButaniBotswanaB" + - "elarusiBelizeKanadaNthĩ ya Kidemokrasĩ ya KongoNthĩ ya Afrika gatĩga" + - "tĩKongoSwizilandiKodivaaAĩrandi cia CookChileKameruniChinaKolombiaKo" + - "starikaKiubaKepuvedeCaipurasiNthĩ ya ChekiNjamanĩJibutiDenimakiDomin" + - "ikaNthĩ ya DominikaAngiriaEkwadoEstoniaMisiriEritreaSpĩniIthiopiaFin" + - "ilandiFijiAĩrandi cia FalklandiMikronesiaFransiGaboniNgerethaGrenada" + - "JojiaGwiyana ya FransiGhanaNgĩbrataNgirinilandiGambiaGineGwadelupeGi" + - "ne ya IquitaNgirikiGwatemalaGwamGinebisauGuyanaHondurasiKoroashiaHai" + - "tiHangarĩIndonesiaAelandiIsiraeliIndiaNthĩ cia Ngeretha gatagatĩ ka " + - "ĩria ria HindiIrakiIraniAisilandiItalĩJamaikaJorondaniJapaniKenyaKi" + - "rigizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea NothiKorea" + - " SaũthiKuwĩ tiAĩrandi cia KaymanKazakistaniLaosiLebanoniSantalusiaLi" + - "shenteniSirilankaLiberiaLesothoLithuaniaLuxemboguLativiaLĩbiaMorokoM" + - "onakoMoldovaMadagasikaAĩrandi cia MarshalMacedoniaMaliMyanimaMongoli" + - "aAĩrandi cia Mariana ya nothiMartinikiMauritaniaMontserratiMaltaMaur" + - "ĩtiasiModivuMalawiMexikoMalĩsiaMozambikiNamibiaKalendoia ĨnjeruNija" + - "Aĩrandi cia NorfokNijeriaNikaragwaHolandiNorwiNepaliNauruNiueNiuzila" + - "ndiOmaniPanamaPeruPolinesia ya FransiPapuaFilipinoPakistaniPolandiSa" + - "ntapieri na MikeloniPitkairniPwetorikoRũtere rwa Westi banki na Gaza" + - " cia PalestinaPotogoPalauParagwaiKataRiyunioniRomaniaRashiaRwandaSau" + - "diAirandi Cia SolomonShelisheliSudaniSwideniSingapooSantahelenaSlove" + - "niaSlovakiaSiera LeoniSamarinoSenegoSomaliaSurinamuSao Tome na Princ" + - "ipeElsavadoSiriaSwazilandiAĩrandi cia Takĩ na KaikoChadiTogoThaĩland" + - "iTajikistaniTokelauTimori ya IstiTukumenistaniTunisiaTongaTakĩTrinid" + - "ad na TobagoTuvaluTaiwaniTanzaniaUkirĩniUgandaAmerikaUrugwĩUzibekist" + - "aniVatikaniSantavisenti na GrenadiniVenezuelaAĩrandi cia Virgin cia " + - "NgerethaAĩrandi cia Virgin cia AmerikaVietinamuVanuatuWalis na Futun" + - "aSamoaYemeniMayotteAfrika ya SouthiZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0017, 0x0023, 0x0035, 0x003d, 0x0045, - 0x004c, 0x0052, 0x0052, 0x005a, 0x006a, 0x0072, 0x007c, 0x0081, - 0x0081, 0x008b, 0x009f, 0x00a7, 0x00b3, 0x00bd, 0x00c7, 0x00cf, - 0x00d7, 0x00de, 0x00e4, 0x00e4, 0x00ea, 0x00f0, 0x00f7, 0x00f7, - 0x00fe, 0x0106, 0x010c, 0x010c, 0x0114, 0x011c, 0x0122, 0x0128, - 0x0128, 0x0146, 0x0160, 0x0165, 0x016f, 0x0176, 0x0187, 0x018c, - 0x0194, 0x0199, 0x01a1, 0x01a1, 0x01aa, 0x01af, 0x01b7, 0x01b7, - 0x01b7, 0x01c0, 0x01ce, 0x01d6, 0x01d6, 0x01dc, 0x01e4, 0x01ec, - // Entry 40 - 7F - 0x01fd, 0x0204, 0x0204, 0x020a, 0x0211, 0x0217, 0x0217, 0x021e, - 0x0224, 0x022c, 0x022c, 0x022c, 0x0235, 0x0239, 0x024f, 0x0259, - 0x0259, 0x025f, 0x0265, 0x026d, 0x0274, 0x0279, 0x028a, 0x028a, - 0x028f, 0x0298, 0x02a4, 0x02aa, 0x02ae, 0x02b7, 0x02c5, 0x02cc, - 0x02cc, 0x02d5, 0x02d9, 0x02e2, 0x02e8, 0x02e8, 0x02e8, 0x02f1, - 0x02fa, 0x02ff, 0x0307, 0x0307, 0x0310, 0x0317, 0x031f, 0x031f, - 0x0324, 0x0353, 0x0358, 0x035d, 0x0366, 0x036c, 0x036c, 0x0373, - 0x037c, 0x0382, 0x0387, 0x0394, 0x039c, 0x03a4, 0x03aa, 0x03bd, - // Entry 80 - BF - 0x03c8, 0x03d5, 0x03dd, 0x03f0, 0x03fb, 0x0400, 0x0408, 0x0412, - 0x041c, 0x0425, 0x042c, 0x0433, 0x043c, 0x0445, 0x044c, 0x0452, - 0x0458, 0x045e, 0x0465, 0x0465, 0x0465, 0x046f, 0x0483, 0x048c, - 0x0490, 0x0497, 0x049f, 0x049f, 0x04bc, 0x04c5, 0x04cf, 0x04da, - 0x04df, 0x04ea, 0x04f0, 0x04f6, 0x04fc, 0x0504, 0x050d, 0x0514, - 0x0525, 0x0529, 0x053c, 0x0543, 0x054c, 0x0553, 0x0558, 0x055e, - 0x0563, 0x0567, 0x0571, 0x0576, 0x057c, 0x0580, 0x0593, 0x0598, - 0x05a0, 0x05a9, 0x05b0, 0x05c6, 0x05cf, 0x05d8, 0x0605, 0x060b, - // Entry C0 - FF - 0x0610, 0x0618, 0x061c, 0x061c, 0x0625, 0x062c, 0x062c, 0x0632, - 0x0638, 0x063d, 0x0650, 0x065a, 0x0660, 0x0667, 0x066f, 0x067a, - 0x0682, 0x0682, 0x068a, 0x0695, 0x069d, 0x06a3, 0x06aa, 0x06b2, - 0x06b2, 0x06c6, 0x06ce, 0x06ce, 0x06d3, 0x06dd, 0x06dd, 0x06f8, - 0x06fd, 0x06fd, 0x0701, 0x070b, 0x0716, 0x071d, 0x072b, 0x0738, - 0x073f, 0x0744, 0x0749, 0x075b, 0x0761, 0x0768, 0x0770, 0x0778, - 0x077e, 0x077e, 0x077e, 0x0785, 0x078c, 0x0798, 0x07a0, 0x07b9, - 0x07c2, 0x07e2, 0x0801, 0x080a, 0x0811, 0x0820, 0x0825, 0x0825, - // Entry 100 - 13F - 0x082b, 0x0832, 0x0842, 0x0848, 0x0850, - }, - }, - { // mfe - "AndorEmira arab iniAfganistanAntigua-ek-BarbudaAnguillaAlbaniArmeniAngol" + - "aLarzantinnSamoa amerikinLostrisLostraliArubaAzerbaïdjanBosni-Herzeg" + - "ovinnBarbadBangladesBelzikBurkina FasoBilgariBahreïnBurundiBeninBerm" + - "idBruneiBoliviBrezilBahamasBoutanBotswanaBelarisBelizKanadaRepiblik " + - "demokratik KongoRepiblik Lafrik SantralKongoLaswisCôte d’IvoireZil C" + - "ookShiliKamerounnLasinnKolonbiCosta RicaCubaKap-VerCyprusRepiblik Ch" + - "ekAlmagnDjiboutiDannmarkDominikRepiblik dominikinAlzeriEkwaterEstoni" + - "LeziptErythreLespagnLetiopiFinlandFidjiZil malwinnMikroneziLafransGa" + - "bonUnited KingdomGrenadZeorziGwiyann franseGhanaZibraltarGreenlandGa" + - "mbiGineGuadloupGine ekwatoryalGresGuatemalaGuamGine-BisauGuyanaHondu" + - "rasKroasiAytiOngriIndoneziIrlandIzraelLennTeritwar Britanik Losean I" + - "ndienIrakIranIslandItaliZamaikZordaniZaponKenyaKirghizistanKambodjKi" + - "ribatiKomorSaint-Christophe-ek-NiévèsLakore-dinorLakore-disidKoweitZ" + - "il KaymanKazakstanLaosLibanSainte-LucieLiechtensteinSri LankaLiberia" + - "LezotoLituaniLuxembourgLetoniLibiMarokMonakoMoldaviMadagaskarZil Mar" + - "shallMasedwannMaliMyanmarMongoliZil Maryann dinorMartinikMoritaniMon" + - "tseraMaltMorisMaldivMalawiMexikMaleziMozambikNamibiNouvel-KaledoniNi" + - "zerLil NorfolkNizeriaNicaraguaOlandNorvezNepalNauruNioweNouvel Zelan" + - "dOmanPanamaPerouPolinezi fransePapouazi-Nouvel-GineFilipinnPakistanP" + - "olognSaint-Pierre-ek-MiquelonPitcairnPorto RicoTeritwar PalestinnPor" + - "tigalPalauParaguayKatarLarenionRoumaniLarisiRwandaLarabi SaouditZil " + - "SalomonSeselSoudanLaswedSingapourSainte-HélèneSloveniSlovakiSierra L" + - "eoneSaint-MarinSenegalSomaliSurinamSão Tome-ek-PrínsipSalvadorLasiri" + - "SwazilandZil Tirk ek CaïcosTchadTogoThaylandTadjikistanTokelauTimor " + - "oriantalTurkmenistanTiniziTongaTirkiTrinite-ek-TobagoTuvaluTaiwanTan" + - "zaniIkrennOugandaLamerikUruguayOuzbekistanLata VatikanSaint-Vincent-" + - "ek-GrenadinesVenezuelaZil vierz britanikZil Vierz LamerikVietnamVanu" + - "atuWallis-ek-FutunaSamoaYemennMayotSid-AfrikZambiZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0005, 0x0013, 0x001d, 0x002f, 0x0037, 0x003d, - 0x0043, 0x0049, 0x0049, 0x0053, 0x0061, 0x0068, 0x0070, 0x0075, - 0x0075, 0x0081, 0x0092, 0x0098, 0x00a1, 0x00a7, 0x00b3, 0x00ba, - 0x00c2, 0x00c9, 0x00ce, 0x00ce, 0x00d4, 0x00da, 0x00e0, 0x00e0, - 0x00e6, 0x00ed, 0x00f3, 0x00f3, 0x00fb, 0x0102, 0x0107, 0x010d, - 0x010d, 0x0126, 0x013d, 0x0142, 0x0148, 0x0158, 0x0160, 0x0165, - 0x016e, 0x0174, 0x017b, 0x017b, 0x0185, 0x0189, 0x0190, 0x0190, - 0x0190, 0x0196, 0x01a3, 0x01a9, 0x01a9, 0x01b1, 0x01b9, 0x01c0, - // Entry 40 - 7F - 0x01d2, 0x01d8, 0x01d8, 0x01df, 0x01e5, 0x01eb, 0x01eb, 0x01f2, - 0x01f9, 0x0200, 0x0200, 0x0200, 0x0207, 0x020c, 0x0217, 0x0220, - 0x0220, 0x0227, 0x022c, 0x023a, 0x0240, 0x0246, 0x0254, 0x0254, - 0x0259, 0x0262, 0x026b, 0x0270, 0x0274, 0x027c, 0x028b, 0x028f, - 0x028f, 0x0298, 0x029c, 0x02a6, 0x02ac, 0x02ac, 0x02ac, 0x02b4, - 0x02ba, 0x02be, 0x02c3, 0x02c3, 0x02cb, 0x02d1, 0x02d7, 0x02d7, - 0x02db, 0x02fa, 0x02fe, 0x0302, 0x0308, 0x030d, 0x030d, 0x0313, - 0x031a, 0x031f, 0x0324, 0x0330, 0x0337, 0x033f, 0x0344, 0x0360, - // Entry 80 - BF - 0x036c, 0x0378, 0x037e, 0x0388, 0x0391, 0x0395, 0x039a, 0x03a6, - 0x03b3, 0x03bc, 0x03c3, 0x03c9, 0x03d0, 0x03da, 0x03e0, 0x03e4, - 0x03e9, 0x03ef, 0x03f6, 0x03f6, 0x03f6, 0x0400, 0x040c, 0x0415, - 0x0419, 0x0420, 0x0427, 0x0427, 0x0438, 0x0440, 0x0448, 0x0450, - 0x0454, 0x0459, 0x045f, 0x0465, 0x046a, 0x0470, 0x0478, 0x047e, - 0x048d, 0x0492, 0x049d, 0x04a4, 0x04ad, 0x04b2, 0x04b8, 0x04bd, - 0x04c2, 0x04c7, 0x04d4, 0x04d8, 0x04de, 0x04e3, 0x04f2, 0x0506, - 0x050e, 0x0516, 0x051c, 0x0534, 0x053c, 0x0546, 0x0558, 0x0560, - // Entry C0 - FF - 0x0565, 0x056d, 0x0572, 0x0572, 0x057a, 0x0581, 0x0581, 0x0587, - 0x058d, 0x059b, 0x05a6, 0x05ab, 0x05b1, 0x05b7, 0x05c0, 0x05cf, - 0x05d6, 0x05d6, 0x05dd, 0x05e9, 0x05f4, 0x05fb, 0x0601, 0x0608, - 0x0608, 0x061d, 0x0625, 0x0625, 0x062b, 0x0634, 0x0634, 0x0647, - 0x064c, 0x064c, 0x0650, 0x0658, 0x0663, 0x066a, 0x0678, 0x0684, - 0x068a, 0x068f, 0x0694, 0x06a5, 0x06ab, 0x06b1, 0x06b8, 0x06be, - 0x06c5, 0x06c5, 0x06c5, 0x06cc, 0x06d3, 0x06de, 0x06ea, 0x0705, - 0x070e, 0x0720, 0x0731, 0x0738, 0x073f, 0x074f, 0x0754, 0x0754, - // Entry 100 - 13F - 0x075a, 0x075f, 0x0768, 0x076d, 0x0775, - }, - }, - { // mg - "AndorraEmirà Arabo mitambatraAfghanistanAntiga sy BarbodaAnguillaAlbania" + - "ArmeniaAngolaArzantinaSamoa amerikaninaAotrisyAostraliaArobàAzerbaid" + - "janBosnia sy HerzegovinaBarbadyBangladesyBelzikaBorkina FasoBiolgari" + - "aBahrainBorondiBeninBermiodaBruneiBoliviaBrezilaBahamasBhotanaBotsoa" + - "naBelarosyBelizeKanadaRepoblikan’i KongoRepoblika Ivon’AfrikaKôngôSo" + - "isaCôte d’IvoireNosy KookShiliKameronaSinaKôlômbiaKosta RikàKiobàNos" + - "y Cap-VertSypraRepoblikan’i TsekyAlemainaDjibotiDanmarkaDominikaRepo" + - "blika DominikaninaAlzeriaEkoateraEstoniaEjyptaEritreaEspainaEthiopia" + - "FinlandyFidjiNosy FalkandMikrôneziaFrantsaGabonAngleteraGrenadyZeorz" + - "iaGuyana frantsayGhanaZibraltaraGroenlandGambiaGineaGoadelopyGuinea " + - "EkoateraGresyGoatemalàGuamGiné-BisaoGuyanaHondiorasyKroasiaHaitiHong" + - "riaIndoneziaIrlandyIsraelyIndyFaridranomasina indiana britanikaIrakI" + - "ranIslandyItaliaJamaïkaJordaniaJapanaKenyaKiordistanKambôdjaKiribati" + - "KômaoroSaint-Christophe-et-NiévèsKorea AvaratraKorea AtsimoKôeityNos" + - "y KaymanKazakhstanLaôsLibanaSainte-LucieListensteinSri LankaLiberiaL" + - "esothoLitoaniaLioksamboroLetoniaLibyaMarôkaMônakôMôldaviaMadagasikar" + - "aNosy MarshallMakedoniaMaliMyanmarMôngôliaNosy Mariana AtsinananaMar" + - "tinikaMaoritaniaMontserratMaltaMaorisyMaldivaMalaoìMeksikaMalaiziaMo" + - "zambikaNamibiaNouvelle-CalédonieNigerNosy NorfolkNizeriaNikaragoàHol" + - "andaNôrvezyNepalaNaoròNioéNouvelle-ZélandeOmanPanamaPeroaPolynezia f" + - "rantsayPapouasie-Nouvelle-GuinéeFilipinaPakistanPôlônaSaint-Pierre-e" + - "t-MiquelonPitkairnPôrtô RikôPalestinaPôrtiogalaPalaoParagoayKatarLar" + - "enionRomaniaRosiaRoandaArabia saoditaNosy SalomonaSeyshelaSodanSoedy" + - "SingaporoSainte-HélèneSloveniaSlovakiaSierra LeoneSaint-MarinSenegal" + - "SomaliaSorinamSão Tomé-et-PríncipeEl SalvadorSyriaSoazilandyNosy Tur" + - "ks sy CaïquesTsadyTogoThailandyTajikistanTokelaoTimor AtsinananaTork" + - "menistanToniziaTongàTorkiaTrinidad sy TobagôTovalòTaioanaTanzaniaOkr" + - "ainaOgandaEtazoniaOrogoayOzbekistanFirenen’i VatikanaSaint-Vincent-e" + - "t-les GrenadinesVenezoelàNosy britanika virijinyNosy Virijiny Etazon" + - "iaVietnamVanoatòWallis sy FutunaSamoaYemenMayôtyAfrika AtsimoZambiaZ" + - "imbaboe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x001e, 0x0029, 0x003a, 0x0042, 0x0049, - 0x0050, 0x0056, 0x0056, 0x005f, 0x0070, 0x0077, 0x0080, 0x0086, - 0x0086, 0x0091, 0x00a6, 0x00ad, 0x00b7, 0x00be, 0x00ca, 0x00d3, - 0x00da, 0x00e1, 0x00e6, 0x00e6, 0x00ee, 0x00f4, 0x00fb, 0x00fb, - 0x0102, 0x0109, 0x0110, 0x0110, 0x0118, 0x0120, 0x0126, 0x012c, - 0x012c, 0x0140, 0x0157, 0x015e, 0x0163, 0x0173, 0x017c, 0x0181, - 0x0189, 0x018d, 0x0197, 0x0197, 0x01a2, 0x01a8, 0x01b5, 0x01b5, - 0x01b5, 0x01ba, 0x01ce, 0x01d6, 0x01d6, 0x01dd, 0x01e5, 0x01ed, - // Entry 40 - 7F - 0x0203, 0x020a, 0x020a, 0x0212, 0x0219, 0x021f, 0x021f, 0x0226, - 0x022d, 0x0235, 0x0235, 0x0235, 0x023d, 0x0242, 0x024e, 0x0259, - 0x0259, 0x0260, 0x0265, 0x026e, 0x0275, 0x027c, 0x028b, 0x028b, - 0x0290, 0x029a, 0x02a3, 0x02a9, 0x02ae, 0x02b7, 0x02c6, 0x02cb, - 0x02cb, 0x02d5, 0x02d9, 0x02e4, 0x02ea, 0x02ea, 0x02ea, 0x02f4, - 0x02fb, 0x0300, 0x0307, 0x0307, 0x0310, 0x0317, 0x031e, 0x031e, - 0x0322, 0x0343, 0x0347, 0x034b, 0x0352, 0x0358, 0x0358, 0x0360, - 0x0368, 0x036e, 0x0373, 0x037d, 0x0386, 0x038e, 0x0396, 0x03b2, - // Entry 80 - BF - 0x03c0, 0x03cc, 0x03d3, 0x03de, 0x03e8, 0x03ed, 0x03f3, 0x03ff, - 0x040a, 0x0413, 0x041a, 0x0421, 0x0429, 0x0434, 0x043b, 0x0440, - 0x0447, 0x044f, 0x0458, 0x0458, 0x0458, 0x0464, 0x0471, 0x047a, - 0x047e, 0x0485, 0x048f, 0x048f, 0x04a6, 0x04af, 0x04b9, 0x04c3, - 0x04c8, 0x04cf, 0x04d6, 0x04dd, 0x04e4, 0x04ec, 0x04f5, 0x04fc, - 0x050f, 0x0514, 0x0520, 0x0527, 0x0531, 0x0538, 0x0540, 0x0546, - 0x054c, 0x0551, 0x0562, 0x0566, 0x056c, 0x0571, 0x0583, 0x059d, - 0x05a5, 0x05ad, 0x05b5, 0x05cd, 0x05d5, 0x05e2, 0x05eb, 0x05f6, - // Entry C0 - FF - 0x05fb, 0x0603, 0x0608, 0x0608, 0x0610, 0x0617, 0x0617, 0x061c, - 0x0622, 0x0630, 0x063d, 0x0645, 0x064a, 0x064f, 0x0658, 0x0667, - 0x066f, 0x066f, 0x0677, 0x0683, 0x068e, 0x0695, 0x069c, 0x06a3, - 0x06a3, 0x06ba, 0x06c5, 0x06c5, 0x06ca, 0x06d4, 0x06d4, 0x06ea, - 0x06ef, 0x06ef, 0x06f3, 0x06fc, 0x0706, 0x070d, 0x071d, 0x0729, - 0x0730, 0x0736, 0x073c, 0x074f, 0x0756, 0x075d, 0x0765, 0x076c, - 0x0772, 0x0772, 0x0772, 0x077a, 0x0781, 0x078b, 0x079f, 0x07be, - 0x07c8, 0x07df, 0x07f5, 0x07fc, 0x0804, 0x0814, 0x0819, 0x0819, - // Entry 100 - 13F - 0x081e, 0x0825, 0x0832, 0x0838, 0x0840, - }, - }, - { // mgh - "UandoraUfugustaniUalbaniaUsamoa ya MarekaniUazabajaniUrundiUbelinUkanada" + - "UkongoUswisiUkodivaUchileUchinaUkolombiaUkubaUkuprosiUchekiUjibutiUd" + - "enimakaUdominikaAlujeriaUmisiriUritereaUhispaniaUhabeshiUfiniUfijiUf" + - "aransaUgaboniUgrenadaUjojiaUfaransa yo GwayaUganaUjibraltaUgrinlandi" + - "UgambiaUgineUgwadelupeUgwatemalaUgwamUginebisauUguyanaUhondurasiUkor" + - "asiaUhaitiUhungariaUndonesiaUayalandiUisraeliUhindiniWirakiItaliaUja" + - "maikaUyordaniUjapaniUkenyaUkambodiaUkomoroUsantakitzi na NevisUkorea" + - " KaskaziniUkorea KusiniUkazakistaniUlebanoniUsantalusiaUshenteniUsir" + - "ilankaUliberiaUlesotoUtwaniaUsembajiUlativiaUlibyaUmantegroUbukiniUm" + - "asedoniaUmalawiUmozambikiUnijeriUnijeriaUnorweUomaniUpanamaUperuuUfa" + - "ransa yo PotinaUpapuaUfilipinoUpakistaniUpolandiUsantapieri na Mikel" + - "oniUpitkairniUpwetorikoParagwaiUkatariUriyunioniUromaniaUrwandaUsaud" + - "iUshelisheliUsudaniUswidiUsingapooUsantahelenaUsloveniaUslovakiaUsam" + - "arinoUsenegaliUsomaliaUsurinamuUsao Tome na PrincipeUsalavadoUsiriaU" + - "swaziUchadiUtogoUtailandiUjikistaniUtokelauUtimo MasharikiUturukimen" + - "istaniUtunisiaUtongaUtukiUtrinidad na TobagoUtuvaluUtanzaniaUmarekan" + - "iUvatikaniUsantavisenti na GrenadiniUvenezuelaUvietinamuUvanuatuUwal" + - "is na FutunaUsamoaUyemeniAfrika du SuluUzambiaUzimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x0007, 0x0011, 0x0011, 0x0011, 0x0019, - 0x0019, 0x0019, 0x0019, 0x0019, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, - 0x0035, 0x003b, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, - 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0048, - 0x0048, 0x0048, 0x0048, 0x004e, 0x0054, 0x005b, 0x005b, 0x0061, - 0x0061, 0x0067, 0x0070, 0x0070, 0x0070, 0x0075, 0x0075, 0x0075, - 0x0075, 0x007d, 0x0083, 0x0083, 0x0083, 0x008a, 0x0093, 0x009c, - // Entry 40 - 7F - 0x009c, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00ab, 0x00ab, 0x00b3, - 0x00bc, 0x00c4, 0x00c4, 0x00c4, 0x00c9, 0x00ce, 0x00ce, 0x00ce, - 0x00ce, 0x00d6, 0x00dd, 0x00dd, 0x00e5, 0x00eb, 0x00fc, 0x00fc, - 0x0101, 0x010a, 0x0114, 0x011b, 0x0120, 0x012a, 0x012a, 0x012a, - 0x012a, 0x0134, 0x0139, 0x0143, 0x014a, 0x014a, 0x014a, 0x0154, - 0x015c, 0x0162, 0x016b, 0x016b, 0x0174, 0x017d, 0x0185, 0x0185, - 0x018d, 0x018d, 0x0193, 0x0193, 0x0193, 0x0199, 0x0199, 0x01a1, - 0x01a9, 0x01b0, 0x01b6, 0x01b6, 0x01bf, 0x01bf, 0x01c6, 0x01da, - // Entry 80 - BF - 0x01ea, 0x01f7, 0x01f7, 0x01f7, 0x0203, 0x0203, 0x020c, 0x0217, - 0x0220, 0x022a, 0x0232, 0x0239, 0x0240, 0x0248, 0x0250, 0x0256, - 0x0256, 0x0256, 0x0256, 0x025f, 0x025f, 0x0266, 0x0266, 0x0270, - 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, - 0x0270, 0x0270, 0x0270, 0x0277, 0x0277, 0x0277, 0x0281, 0x0281, - 0x0281, 0x0288, 0x0288, 0x0290, 0x0290, 0x0290, 0x0296, 0x0296, - 0x0296, 0x0296, 0x0296, 0x029c, 0x02a3, 0x02a9, 0x02bb, 0x02c1, - 0x02ca, 0x02d4, 0x02dc, 0x02f3, 0x02fd, 0x0307, 0x0307, 0x0307, - // Entry C0 - FF - 0x0307, 0x030f, 0x0316, 0x0316, 0x0320, 0x0328, 0x0328, 0x0328, - 0x032f, 0x0335, 0x0335, 0x0340, 0x0347, 0x034d, 0x0356, 0x0362, - 0x036b, 0x036b, 0x0374, 0x0374, 0x037d, 0x0386, 0x038e, 0x0397, - 0x0397, 0x03ac, 0x03b5, 0x03b5, 0x03bb, 0x03c1, 0x03c1, 0x03c1, - 0x03c7, 0x03c7, 0x03cc, 0x03d5, 0x03df, 0x03e7, 0x03f6, 0x0406, - 0x040e, 0x0414, 0x0419, 0x042c, 0x0433, 0x0433, 0x043c, 0x043c, - 0x043c, 0x043c, 0x043c, 0x0445, 0x0445, 0x0445, 0x044e, 0x0468, - 0x0472, 0x0472, 0x0472, 0x047c, 0x0484, 0x0494, 0x049a, 0x049a, - // Entry 100 - 13F - 0x04a1, 0x04a1, 0x04af, 0x04b6, 0x04bf, - }, - }, - { // mgo - "Kamalunaba aben tisɔ̀", - []uint16{ // 262 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 40 - 7F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 80 - BF - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry C0 - FF - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, - // Entry 100 - 13F - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0017, - }, - }, - { // mk - mkRegionStr, - mkRegionIdx, - }, - { // ml - mlRegionStr, - mlRegionIdx, - }, - { // mn - mnRegionStr, - mnRegionIdx, - }, - { // mr - mrRegionStr, - mrRegionIdx, - }, - { // ms - msRegionStr, - msRegionIdx, - }, - { // mt - "Ascension IslandAndorral-Emirati Għarab Magħqudal-AfganistanAntigua u Ba" + - "rbudaAnguillal-Albanijal-Armenjal-Angolal-Antartikal-Arġentinais-Sam" + - "oa Amerikanal-Awstrijal-AwstraljaArubail-Gżejjer Alandl-Ażerbajġanil" + - "-Bożnija-ĦerzegovinaBarbadosil-Bangladeshil-Belġjuil-Burkina Fasoil-" + - "Bulgarijail-Bahrainil-Burundiil-BeninSaint BarthélemyBermudail-Brune" + - "iil-Bolivjain-Netherlands tal-KaribewIl-Brażilil-Bahamasil-BhutanGżi" + - "ra Bouvetil-Botswanail-Belarussjail-Belizeil-KanadaGżejjer Cocos (Ke" + - "eling)ir-Repubblika Demokratika tal-Kongoir-Repubblika Ċentru-Afrika" + - "nail-Kongo - BrazzavilleŻvizzerail-Kosta tal-AvorjuGżejjer Cookiċ-Ċi" + - "liil-KamerunCNil-Kolombjail-Gżira Clippertonil-Costa RicaKubaCape Ve" + - "rdeCuraçaoil-Gżira ChristmasĊipruir-Repubblika Ċekail-ĠermanjaDiego " + - "Garciail-Djiboutiid-DanimarkaDominicair-Repubblika Dominicanal-Alġer" + - "ijaCeuta u Melillal-Ekwadorl-Estonjal-Eġittuis-Saħara tal-Punentl-Er" + - "itreaSpanjal-EtjopjaUnjoni Ewropeail-FinlandjaFiġiil-Gżejjer Falklan" + - "dMikroneżjail-Gżejjer FaeroeFranzail-Gabonir-Renju UnitGrenadail-Geo" + - "rgiail-Guyana FranċiżaGuernseyil-GhanaĠibiltàGreenlandil-Gambjail-Gu" + - "ineaGuadeloupeil-Guinea Ekwatorjaliil-Greċjail-Georgia tan-Nofsinhar" + - " u l-Gżejjer Sandwich tan-Nofsinharil-GwatemalaGuamil-Guinea-Bissaui" + - "l-Guyanair-Reġjun Amministrattiv Speċjali ta’ Hong Kong tar-Repubbli" + - "ka tal-Poplu taċ-Ċinail-Gżejjer Heard u l-Gżejjer McDonaldil-Hondura" + - "sil-Kroazjail-Haitil-Ungerijail-Gżejjer Canaryl-Indoneżjal-IrlandaIż" + - "raelIsle of Manl-IndjaTerritorju Brittaniku tal-Oċean Indjanl-Iraql-" + - "Iranl-iżlandal-ItaljaJerseyil-Ġamajkail-Ġordanil-Ġappunil-Kenjail-Ki" + - "rgiżistanil-KambodjaKiribatiComorosSaint Kitts u Nevisil-Korea ta’ F" + - "uqil-Korea t’Isfelil-Kuwajtil-Gżejjer Caymanil-Każakistanil-Laosil-L" + - "ibanuSaint Luciail-Liechtensteinis-Sri Lankail-Liberjail-Lesotoil-Li" + - "twanjail-Lussemburguil-Latvjail-Libjail-MarokkMonacoil-Moldovail-Mon" + - "tenegroSaint MartinMadagascarGżejjer Marshalll-Eks-Repubblika Jugosl" + - "ava tal-Maċedoniail-Maliil-Myanmar/Burmail-Mongoljair-Reġjun Amminis" + - "trattiv Speċjali tal-Macao tar-Repubblika tal-Poplu taċ-ĊinaĠżejjer " + - "Mariana tat-TramuntanaMartiniqueil-MauritaniaMontserratMaltaMauritiu" + - "sil-Maldiviil-Malawiil-Messikuil-Malasjail-Mozambiquein-NamibjaNew C" + - "aledoniain-NiġerGżira Norfolkin-Niġerjain-Nikaragwain-Netherlandsin-" + - "Norveġjain-NepalNauruNiueNew Zealandl-Omanil-Panamail-PerùPolineżja " + - "FranċiżaPapua New Guineail-Filippiniil-Pakistanil-PolonjaSaint Pierr" + - "e u MiquelonGżejjer PitcairnPuerto Ricoit-Territorji Palestinjaniil-" + - "PortugallPalauil-Paragwajil-QatarRéunionir-Rumanijais-Serbjair-Russj" + - "air-Rwandal-Arabia Sawdijail-Gżejjer Solomonis-Seychellesis-Sudanl-I" + - "żvezjaSingaporeSaint Helenais-SlovenjaSvalbard u Jan Mayenis-Slovak" + - "kjaSierra LeoneSan Marinois-Senegalis-Somaljais-Surinameis-Sudan t’I" + - "sfelSão Tomé u PríncipeEl SalvadorSint Maartenis-Sirjais-SwazilandTr" + - "istan da Cunhail-Gżejjer Turks u Caicosiċ-ChadIt-Territorji Franċiżi" + - " tan-Nofsinharit-Togoit-Tajlandjait-Taġikistanit-TokelauTimor Lestei" + - "t-Turkmenistanit-TuneżijaTongait-TurkijaTrinidad u TobagoTuvaluit-Ta" + - "jwanit-Tanzanijal-Ukrajnal-UgandaIl-Gżejjer Minuri Mbiegħda tal-Ista" + - "ti Unitil-Istati Unitil-Urugwajl-Użbekistanl-Istat tal-Belt tal-Vati" + - "kanSaint Vincent u l-Grenadiniil-Venezwelail-Gżejjer Verġni Brittani" + - "ċiil-Gżejjer Verġni tal-Istati Unitiil-VjetnamVanuatuWallis u Futun" + - "aSamoaKosovoil-JemenMayottel-Afrika t’Isfeliż-Żambjaiż-ŻimbabweReġju" + - "n Mhux MagħrufDinjaAffrikaAmerika t’IsfelOċejanjaAffrika tal-PunentA" + - "merika ĊentraliAffrika tal-LvantAffrika ta’ FuqAffrika NofsaniAffrik" + - "a t’IsfelAmerikaKaribewAsja tal-LvantAsja t’Isfel ĊentraliAsja tax-X" + - "lokkEwropa t’IsfelAwstralja u New ZealandMelanesjaReġjun ta’ Mikrone" + - "żjaPolinesjaAsjaAsja ĊentraliAsja tal-PunentEwropaEwropa tal-LvantE" + - "wropa ta’ FuqEwropa tal-PunentAmerika Latina", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0017, 0x0032, 0x003e, 0x004f, 0x0057, 0x0061, - 0x006a, 0x0072, 0x007d, 0x0089, 0x009b, 0x00a5, 0x00b0, 0x00b5, - 0x00c6, 0x00d4, 0x00ec, 0x00f4, 0x0101, 0x010b, 0x011a, 0x0126, - 0x0130, 0x013a, 0x0142, 0x0153, 0x015a, 0x0163, 0x016d, 0x0187, - 0x0191, 0x019b, 0x01a4, 0x01b1, 0x01bc, 0x01c9, 0x01d2, 0x01db, - 0x01f3, 0x0216, 0x0234, 0x024a, 0x0253, 0x0266, 0x0273, 0x027c, - 0x0286, 0x0288, 0x0293, 0x02a7, 0x02b4, 0x02b8, 0x02c2, 0x02ca, - 0x02dd, 0x02e3, 0x02f6, 0x0302, 0x030e, 0x0319, 0x0325, 0x032d, - // Entry 40 - 7F - 0x0345, 0x0350, 0x035f, 0x0368, 0x0371, 0x037a, 0x038f, 0x0398, - 0x039e, 0x03a7, 0x03b5, 0x03b5, 0x03c1, 0x03c6, 0x03da, 0x03e5, - 0x03f7, 0x03fd, 0x0405, 0x0412, 0x0419, 0x0423, 0x0437, 0x043f, - 0x0447, 0x0450, 0x0459, 0x0462, 0x046b, 0x0475, 0x048a, 0x0494, - 0x04d0, 0x04dc, 0x04e0, 0x04f0, 0x04f9, 0x0550, 0x0577, 0x0582, - 0x058c, 0x0594, 0x059e, 0x05b0, 0x05bc, 0x05c5, 0x05cc, 0x05d7, - 0x05de, 0x0605, 0x060b, 0x0611, 0x061b, 0x0623, 0x0629, 0x0634, - 0x063e, 0x0648, 0x0650, 0x065f, 0x066a, 0x0672, 0x0679, 0x068c, - // Entry 80 - BF - 0x069e, 0x06b0, 0x06b9, 0x06cb, 0x06d9, 0x06e0, 0x06e9, 0x06f4, - 0x0704, 0x0710, 0x071a, 0x0723, 0x072e, 0x073c, 0x0745, 0x074d, - 0x0756, 0x075c, 0x0766, 0x0773, 0x077f, 0x0789, 0x079a, 0x07c3, - 0x07ca, 0x07da, 0x07e5, 0x0836, 0x0856, 0x0860, 0x086d, 0x0877, - 0x087c, 0x0885, 0x088f, 0x0898, 0x08a2, 0x08ac, 0x08b9, 0x08c3, - 0x08d0, 0x08d9, 0x08e7, 0x08f2, 0x08fe, 0x090c, 0x0918, 0x0920, - 0x0925, 0x0929, 0x0934, 0x093a, 0x0943, 0x094b, 0x0960, 0x0970, - 0x097c, 0x0987, 0x0991, 0x09a8, 0x09b9, 0x09c4, 0x09de, 0x09ea, - // Entry C0 - FF - 0x09ef, 0x09fa, 0x0a02, 0x0a02, 0x0a0a, 0x0a15, 0x0a1e, 0x0a27, - 0x0a30, 0x0a40, 0x0a53, 0x0a60, 0x0a68, 0x0a72, 0x0a7b, 0x0a87, - 0x0a92, 0x0aa6, 0x0ab2, 0x0abe, 0x0ac8, 0x0ad2, 0x0adc, 0x0ae7, - 0x0af9, 0x0b0f, 0x0b1a, 0x0b26, 0x0b2e, 0x0b3a, 0x0b4a, 0x0b64, - 0x0b6c, 0x0b92, 0x0b99, 0x0ba5, 0x0bb3, 0x0bbd, 0x0bc8, 0x0bd7, - 0x0be3, 0x0be8, 0x0bf2, 0x0c03, 0x0c09, 0x0c12, 0x0c1e, 0x0c27, - 0x0c2f, 0x0c5c, 0x0c5c, 0x0c6a, 0x0c73, 0x0c80, 0x0c9c, 0x0cb7, - 0x0cc3, 0x0ce2, 0x0d06, 0x0d10, 0x0d17, 0x0d26, 0x0d2b, 0x0d31, - // Entry 100 - 13F - 0x0d39, 0x0d40, 0x0d52, 0x0d5d, 0x0d6a, 0x0d7f, 0x0d84, 0x0d8b, - 0x0d8b, 0x0d9c, 0x0da5, 0x0db7, 0x0dc8, 0x0dd9, 0x0dea, 0x0df9, - 0x0e0a, 0x0e11, 0x0e11, 0x0e18, 0x0e26, 0x0e3e, 0x0e4c, 0x0e5c, - 0x0e73, 0x0e7c, 0x0e95, 0x0e9e, 0x0ea2, 0x0eb0, 0x0ebf, 0x0ec5, - 0x0ed5, 0x0ee5, 0x0ef6, 0x0f04, - }, - }, - { // mua - "andorraSǝr Arabiya ma tainiafghanistaŋantiguan ne Barbudaanguiyaalbaniya" + - "armeniyaangolaargentiniyasamoa Amerikaaustriyaaustraliyaarubaazerbai" + - "jaŋbosniya ne Herzegovinabarbadiyabangladeshiyabelgikaburkina Fasobu" + - "lgariyabahraiŋburundibeniŋbermudiyabruniyaboliviyabrazilyabahamasbut" + - "aŋbotswanabelarussiyabeliziyakanadaSǝr Kongo ma dii ne zaircentrafri" + - "kakongoSǝr Swissser Ivoiriyakook ma laŋnesyilikameruŋsyiŋkolombiyako" + - "sta RikaKubakap ma laŋneSyipriyaSǝr SyekGermaniyaDjiboutiDaŋmarkDomi" + - "nikSǝr Dominik ma liialgeriyaEkwatǝrEstoniyaSǝr EgyptSǝr EritreEspaŋ" + - "iyaEtiopiaSǝr FinlandSǝr FijiSǝr malouniya ma laŋneMicronesiyaFranss" + - "ǝGaboŋSǝr AnglofoŋGrenadǝGeorgiyaSǝr Guyana ma FranssǝGanaSǝr Gibra" + - "ltarSǝr GroenlandGambiyaGuineSǝr GwadeloupǝSǝr GuineSǝr GrekGwatemal" + - "aGwamGuine ma BissaoGuyanaSǝr HonduraskroatiyaSǝr HaitiHungriyaIndon" + - "esiyaSǝr IrelandSǝr IsraelSǝr Indǝanglofoŋ ma IndiyaIrakIraŋSǝr Isla" + - "ndItaliyaJamaikaJordaniyaJapaŋSǝr KenyaKirgizstaŋkambodiyaSǝr Kiriba" + - "tikomoraSǝr Kristof ne NievǝSǝr Kore fah sǝŋSǝr Kore nekǝsǝŋSǝr Kowa" + - "itkayman ma laŋneKazakstaŋSǝr LaosLibaŋSǝr LuciaLichtǝnsteiŋSǝr Lank" + - "aLiberiyaSǝr LesothoLituaniyaSǝr LuxemburgLetoniyaLibiyaMarokMonakoM" + - "oldoviyaMadagaskarSǝr Marshall ma laŋneMacedoniyaSǝr MaliSǝr Myanmar" + - "MongoliyaSǝr Maria ma laŋneMartinikaMauritaniyaSǝr MontserratSǝr Mal" + - "taSǝr MauricǝMaldivǝSǝr MalawiMexikoMalaysiyaMozambikaNamibiyaKaledo" + - "niya mafuuSǝr NigerNorfolk ma laŋneNigeriyaNikaragwaSǝr ma kasǝŋNorv" + - "egǝSǝr NepalSǝr NauruNiweZeland mafuuOmaŋSǝr PanamaPeruSǝr Polynesiy" + - "a ma FranssǝPapuasiya Guine mafuuFilipiŋPakistaŋPologŋSǝr Pǝtar ne M" + - "ikǝlonPitkairnPorto RikoSǝr PalestiniyaSǝr PortugalSǝr PalauParagwai" + - "KatarSǝr ReunionRomaniyaRussiyaRwandaSǝr ArabiyaSǝr Salomon ma laŋne" + - "SaichelSudaŋSǝr SuedSingapurSǝr HelenaSloveniyaSlovakiyaSierra Leonǝ" + - "Sǝr MarinoSenegalSomaliyaSǝr SurinamSao Tome ne PrincipeSǝr Salvador" + - "SyriaSǝr SwazilandTurkiya ne kaicos ma laŋnesyadSǝr TogoTailandTajik" + - "istaŋSǝr TokelauTimoriyaTurkmenistaŋTunisiyaSǝr TongaTurkiyaTrinite " + - "ne TobagoSǝr TuvaluTaiwaŋTanzaniyaUkraiŋUgandaAmerikaUrugwaiUzbekist" + - "aŋVaticaŋSǝr Vinceŋ ne GrenadiŋSǝr Venezuelaser Anglofon ma laŋneSǝr" + - " amerika ma laŋneSǝr VietnamSǝr VanuatuWallis ne FutunaSǝr SamoaYeme" + - "ŋMayotAfrika nekǝsǝŋZambiyaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x001c, 0x0028, 0x003b, 0x0042, 0x004a, - 0x0052, 0x0058, 0x0058, 0x0063, 0x0070, 0x0078, 0x0082, 0x0087, - 0x0087, 0x0092, 0x00a8, 0x00b1, 0x00be, 0x00c5, 0x00d1, 0x00da, - 0x00e2, 0x00e9, 0x00ef, 0x00ef, 0x00f8, 0x00ff, 0x0107, 0x0107, - 0x010f, 0x0116, 0x011c, 0x011c, 0x0124, 0x012f, 0x0137, 0x013d, - 0x013d, 0x0156, 0x0161, 0x0166, 0x0170, 0x017c, 0x018a, 0x018f, - 0x0197, 0x019c, 0x01a5, 0x01a5, 0x01af, 0x01b3, 0x01c0, 0x01c0, - 0x01c0, 0x01c8, 0x01d1, 0x01da, 0x01da, 0x01e2, 0x01ea, 0x01f1, - // Entry 40 - 7F - 0x0204, 0x020c, 0x020c, 0x0214, 0x021c, 0x0226, 0x0226, 0x0231, - 0x023a, 0x0241, 0x0241, 0x0241, 0x024d, 0x0256, 0x026e, 0x0279, - 0x0279, 0x0281, 0x0287, 0x0295, 0x029d, 0x02a5, 0x02bc, 0x02bc, - 0x02c0, 0x02ce, 0x02dc, 0x02e3, 0x02e8, 0x02f8, 0x0302, 0x030b, - 0x030b, 0x0314, 0x0318, 0x0327, 0x032d, 0x032d, 0x032d, 0x033a, - 0x0342, 0x034c, 0x0354, 0x0354, 0x035e, 0x036a, 0x0375, 0x0375, - 0x037f, 0x0392, 0x0396, 0x039b, 0x03a6, 0x03ad, 0x03ad, 0x03b4, - 0x03bd, 0x03c3, 0x03cd, 0x03d8, 0x03e1, 0x03ee, 0x03f4, 0x040a, - // Entry 80 - BF - 0x041d, 0x0431, 0x043c, 0x044c, 0x0456, 0x045f, 0x0465, 0x046f, - 0x047d, 0x0487, 0x048f, 0x049b, 0x04a4, 0x04b2, 0x04ba, 0x04c0, - 0x04c5, 0x04cb, 0x04d4, 0x04d4, 0x04d4, 0x04de, 0x04f5, 0x04ff, - 0x0508, 0x0514, 0x051d, 0x051d, 0x0531, 0x053a, 0x0545, 0x0554, - 0x055e, 0x056b, 0x0573, 0x057e, 0x0584, 0x058d, 0x0596, 0x059e, - 0x05ae, 0x05b8, 0x05c9, 0x05d1, 0x05da, 0x05e9, 0x05f1, 0x05fb, - 0x0605, 0x0609, 0x0615, 0x061a, 0x0625, 0x0629, 0x0644, 0x0659, - 0x0661, 0x066a, 0x0671, 0x0688, 0x0690, 0x069a, 0x06aa, 0x06b7, - // Entry C0 - FF - 0x06c1, 0x06c9, 0x06ce, 0x06ce, 0x06da, 0x06e2, 0x06e2, 0x06e9, - 0x06ef, 0x06fb, 0x0711, 0x0718, 0x071e, 0x0727, 0x072f, 0x073a, - 0x0743, 0x0743, 0x074c, 0x0759, 0x0764, 0x076b, 0x0773, 0x077f, - 0x077f, 0x0793, 0x07a0, 0x07a0, 0x07a5, 0x07b3, 0x07b3, 0x07ce, - 0x07d2, 0x07d2, 0x07db, 0x07e2, 0x07ed, 0x07f9, 0x0801, 0x080e, - 0x0816, 0x0820, 0x0827, 0x0838, 0x0843, 0x084a, 0x0853, 0x085a, - 0x0860, 0x0860, 0x0860, 0x0867, 0x086e, 0x0879, 0x0881, 0x089a, - 0x08a8, 0x08be, 0x08d4, 0x08e0, 0x08ec, 0x08fc, 0x0906, 0x0906, - // Entry 100 - 13F - 0x090c, 0x0911, 0x0922, 0x0929, 0x0931, - }, - }, - { // my - myRegionStr, - myRegionIdx, - }, - { // mzn - "آسنسیون جزیرهآندورامتحده عربی اماراتافغانستونآنتیگوا و باربوداآنگویلاآلب" + - "انیارمنستونآنگولاجنوبی یخ\u200cبزه قطبآرژانتینآمریکای ِساموآاتریشاس" + - "ترالیاآروباآلند جزیرهآذربایجونبوسنی و هرزگوینباربادوسبنگلادشبلژیکبو" + - "رکینا فاسوبلغارستونبحرینبوروندیبنینسنت بارتلمیبرمودابرونئیبولیویهلن" + - "د ِکاراییبی جزایربرزیلباهامابوتانبووت جزیرهبوتساوانابلاروسبلیزکاناد" + - "اکوک (کیلینگ) جزایرکنگو کینشاسامرکزی آفریقای جمهوریکنگو برازاویلسوی" + - "یسعاج ِساحلکوک جزایرشیلیکامرونچینکلمبیاکلیپرتون جزیرهکاستاریکاکوباک" + - "یپ وردکوراسائوکریسمس جزیرهقبرسچک جمهوریآلماندیگو گارسیاجیبوتیدانمار" + - "کدومنیکادومنیکن جمهوریالجزیرهسوتا و ملیلهاکوادراستونیمصرغربی صحراار" + - "یترهایسپانیااتیوپیاروپا اتحادیهفنلاندفیجیفالکلند جزیره\u200cئونمیکر" + - "ونزیفارو جزایرفرانسهگابونبریتانیاگراناداگرجستونفرانسه\u200cی ِگویان" + - "گرنزیغناجبل طارقگرینلندگامبیاگینهگوادلوپاستوایی گینهیونانجنوبی جورج" + - "یا و جنوبی ساندویچ جزایرگواتمالاگوئامگینه بیسائوگویانهنگ کنگهارد و " + - "مک\u200cدونالد جزایرهندوراسکرواسیهاییتیمجارستونقناری جزایراندونزیای" + - "رلندایسراییلمن ِجزیرههندبریتانیای هند ِاوقیانوس ِمناطقعراقایرانایسل" + - "ندایتالیاجرسیجاماییکااردنجاپونکنیاقرقیزستونکامبوجکیریباتیکومورسنت ک" + - "یتس و نویسشمالی کُرهجنوبی کُرهکویتکیمن جزیره\u200cئونقزاقستونلائوسل" + - "بنانسنت لوسیالیختن اشتاینسریلانکالیبریالسوتولتونیلوکزامبورگلاتویالی" + - "بیمراکشموناکومولداویمونته\u200cنگروسنت مارتینماداگاسکارمارشال جزایر" + - "مقدونیهمالیمیانمارمغولستونماکائو (چین دله)شمالی ماریانا جزایرمارتین" + - "یک جزیره\u200cئونموریتانیمونتسراتمالتمورى تيوسمالدیومالاویمکزیکمالز" + - "یموزامبیکنامبیانیو کالیدونیانیجرنورفولک جزیرهنیجریهنیکاراگوئههلندنر" + - "وژنپالنائورونیئونیوزلندعمانپاناماپروفرانسه\u200cی پولی\u200cنزیپاپو" + - "ا نو گینهفیلیپینپاکستونلهستونسن پییر و میکلنپیتکارین جزایرپورتوریکو" + - "فلسطین ِسرزمینپرتغالپالائوپاراگوئهقطراوقیانوسیه\u200cی ِپرت ِجائونر" + - "ئونیونرومانیصربستونروسیهروآنداعربستونسلیمون جزیرهسیشلسودانسوئدسنگاپ" + - "ورسنت هلنااسلوونیسوالبارد و يان مايناسلواکیسیرالئونسن مارینوسنگالسو" + - "مالیسورینامجنوبی سودانسائوتومه و پرینسیپالسالوادورسنت مارتنسوریهسوا" + - "زیلندتریستان دا جونهاتورکس و کایکوس جزایرچادفرانسه\u200cی جنوبی منا" + - "طقتوگوتایلندتاجیکستونتوکلائوتیمور شرقیترکمونستونتونستونگاترکیهترینی" + - "داد و توباگوتووالوتایوانتانزانیااوکرایناوگانداآمریکای پَرتِ\u200cپِ" + - "لا جزیره\u200cئونمتحده ایالاتاروگوئهازبکستونواتیکانسنت وینسنت و گرن" + - "ادینونزوئلابریتانیای ویرجینآمریکای ویرجینویتناموانواتووالیس و فوتون" + - "اساموآکوزوویمنمایوتجنوبی افریقازامبیازیمبابوهنامَیِّن منطقهجهونآفری" + - "قاشمالی آمریکاجنوبی آمریکااوقیانوسیهغربی آفریقامیونی آمریکاشرقی آفر" + - "یقاشمالی ۀفریقامیونی آفریقاجنوبی آفریقاآمریکاشمالی امریکاکاراییبشرق" + - "ی آسیاجنوبی آسیاآسیای ِجنوب\u200cشرقی\u200cوَرجنوبی اروپااوسترالزیم" + - "لانزیمیکرونزی منقطهپولی\u200cنزیآسیامیونی آسیاغربی آسیااروپاشرقی ار" + - "وپاشمالی اروپاغربی اروپالاتین آمریکا", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0019, 0x0025, 0x0045, 0x0057, 0x0077, 0x0085, 0x0091, - 0x00a1, 0x00ad, 0x00cc, 0x00dc, 0x00f7, 0x0101, 0x0111, 0x011b, - 0x012e, 0x0140, 0x015c, 0x016c, 0x017a, 0x0184, 0x019b, 0x01ad, - 0x01b7, 0x01c5, 0x01cd, 0x01e2, 0x01ee, 0x01fa, 0x0206, 0x022c, - 0x0236, 0x0242, 0x024c, 0x025f, 0x0271, 0x027d, 0x0285, 0x0291, - 0x02b1, 0x02c8, 0x02ee, 0x0307, 0x0311, 0x0322, 0x0333, 0x033b, - 0x0347, 0x034d, 0x0359, 0x0374, 0x0386, 0x038e, 0x039b, 0x03ab, - 0x03c2, 0x03ca, 0x03db, 0x03e5, 0x03fa, 0x0406, 0x0414, 0x0422, - // Entry 40 - 7F - 0x043d, 0x044b, 0x0461, 0x046d, 0x0479, 0x047f, 0x0490, 0x049c, - 0x04ac, 0x04b8, 0x04d1, 0x04d1, 0x04dd, 0x04e5, 0x0507, 0x0517, - 0x052a, 0x0536, 0x0540, 0x0550, 0x055e, 0x056c, 0x058a, 0x0594, - 0x059a, 0x05a9, 0x05b7, 0x05c3, 0x05cb, 0x05d9, 0x05f0, 0x05fa, - 0x0639, 0x0649, 0x0653, 0x0668, 0x0672, 0x067f, 0x06a9, 0x06b7, - 0x06c3, 0x06cf, 0x06df, 0x06f4, 0x0702, 0x070e, 0x071e, 0x072f, - 0x0735, 0x076e, 0x0776, 0x0780, 0x078c, 0x079a, 0x07a2, 0x07b2, - 0x07ba, 0x07c4, 0x07cc, 0x07de, 0x07ea, 0x07fa, 0x0804, 0x081f, - // Entry 80 - BF - 0x0832, 0x0845, 0x084d, 0x0869, 0x0879, 0x0883, 0x088d, 0x089e, - 0x08b5, 0x08c5, 0x08d1, 0x08db, 0x08e5, 0x08f9, 0x0905, 0x090d, - 0x0917, 0x0923, 0x0931, 0x0946, 0x0959, 0x096d, 0x0984, 0x0992, - 0x099a, 0x09a8, 0x09b8, 0x09d4, 0x09f8, 0x0a1c, 0x0a2c, 0x0a3c, - 0x0a44, 0x0a55, 0x0a61, 0x0a6d, 0x0a77, 0x0a81, 0x0a91, 0x0a9d, - 0x0ab6, 0x0abe, 0x0ad7, 0x0ae3, 0x0af7, 0x0aff, 0x0b07, 0x0b0f, - 0x0b1b, 0x0b23, 0x0b31, 0x0b39, 0x0b45, 0x0b4b, 0x0b6e, 0x0b86, - 0x0b94, 0x0ba2, 0x0bae, 0x0bc9, 0x0be4, 0x0bf6, 0x0c11, 0x0c1d, - // Entry C0 - FF - 0x0c29, 0x0c39, 0x0c3f, 0x0c6e, 0x0c7c, 0x0c88, 0x0c96, 0x0ca0, - 0x0cac, 0x0cba, 0x0cd1, 0x0cd9, 0x0ce3, 0x0ceb, 0x0cf9, 0x0d08, - 0x0d16, 0x0d39, 0x0d47, 0x0d57, 0x0d68, 0x0d72, 0x0d7e, 0x0d8c, - 0x0da1, 0x0dc3, 0x0dd7, 0x0de8, 0x0df2, 0x0e02, 0x0e20, 0x0e45, - 0x0e4b, 0x0e72, 0x0e7a, 0x0e86, 0x0e98, 0x0ea6, 0x0eb9, 0x0ecd, - 0x0ed5, 0x0edf, 0x0ee9, 0x0f09, 0x0f15, 0x0f21, 0x0f31, 0x0f3f, - 0x0f4d, 0x0f85, 0x0f85, 0x0f9c, 0x0faa, 0x0fba, 0x0fc8, 0x0fed, - 0x0ffb, 0x101a, 0x1035, 0x1041, 0x104f, 0x1069, 0x1073, 0x107d, - // Entry 100 - 13F - 0x1083, 0x108d, 0x10a4, 0x10b0, 0x10c0, 0x10db, 0x10e3, 0x10ef, - 0x1106, 0x111d, 0x1131, 0x1146, 0x115d, 0x1172, 0x1189, 0x11a0, - 0x11b7, 0x11c3, 0x11da, 0x11e8, 0x11f9, 0x120c, 0x1235, 0x124a, - 0x125c, 0x1268, 0x1283, 0x1294, 0x129c, 0x12af, 0x12c0, 0x12ca, - 0x12dd, 0x12f2, 0x1305, 0x131c, - }, - }, - { // naq - "AndorrabUnited Arab EmiratesAfghanistanniAntiguab tsî BarbudabAnguillabA" + - "lbaniabArmeniabAngolabArgentinabAmericab SamoabAustriabAustraliebAru" + - "babAzerbaijanniBosniab tsî HerzegovinabBarbadosBangladesBelgiummiBur" + - "kina FasobBulgariabBahrainBurundibBeninsBermudasBruneiBoliviabBrazil" + - "iabBahamasBhutansBotswanabBelarusBelizeKanadabDemocratic Republic of" + - " the CongoCentral African RepublikiCongobSwitzerlandiIvoorkusiCook I" + - "slandsChilibCameroonniChinabColombiabCosta RicaCubabCape Verde Islan" + - "dsCyprusCzech RepublikiDuitslandiDjiboutiDenmarkiDominicabDominican " + - "RepublicAlgeriabEcuadoriEstoniabEgiptebEritreabSpaniebEthiopiabFinla" + - "ndiFijibFalkland IslandsMicronesiaFrankreikiGaboniUnited KingdomGren" + - "adaGeorgiabFrench GuianaGhanabGibraltarGreenlandGambiabGuineabGuadel" + - "oupeEquatorial GuineabXrikelandiGuatemalaGuamGuinea-BissauGuyanaHond" + - "urasCroatiabHaitiHongareiebIndonesiabIrlandiIsraeliIndiabBritish Ind" + - "ian Ocean TerritoryIraqiIranniIcelandItaliabJamaicabJordanniJapanniK" + - "enyabKyrgyzstanniCambodiabKiribatiComorosSaint Kitts and NevisKoreab" + - ", NoordKoreab, SuidKuwaitiCayman IslandsKazakhstanniLaosLebanonniSai" + - "nt LuciaLiechtensteinniSri LankabLiberiabLesothobLithuaniabLuxembour" + - "giLatviaLibyabMoroccoMonacoMoldovaMadagascariMarshall IslandsMacedon" + - "iabMalibMyanmarMongoliaNorthern Mariana IslandsMartiniqueMauritaniaM" + - "ontserratMaltaMauritiusMaldivesMalawibMexicobMalaysiabMozambikiNamib" + - "iabNew CaledoniaNigeriNorfolk IslandNigeriebNicaraguabNetherlandsNoo" + - "rweebNepaliNauruNiueNew ZealandiOmanPanamaPerubFrench PolynesiaPapua" + - " New GuineabPhilippinniPakistanniPolandiSaint Pierre and MiquelonPit" + - "cairnPuerto RicoPalestinian West Bank and GazaPortugaliPalauParaguai" + - "bQatarRéunionRomaniaRasiabRwandabSaudi ArabiabSolomon IslandsSeychel" + - "lesSudanniSwedebSingaporeSaint HelenaSloveniaSlovakiaSierra LeoneSan" + - " MarinoSenegaliSomaliabSurinameSão Tomé and PríncipeEl SalvadoriSyri" + - "abSwazilandiTurks and Caicos IslandsChadiTogobThailandiTajikistanTok" + - "elauEast TimorTurkmenistanTunisiabTongaTurkeiebTrinidad and TobagoTu" + - "valuTaiwanTanzaniabUkraineUgandabAmerikabUruguaibUzbekistanVatican S" + - "tateSaint Vincent and the GrenadinesVenezuelabBritish Virgin Islands" + - "U.S. Virgin IslandsVietnammiVanuatuWallis and FutunaSamoaYemenMayott" + - "eSuid AfrikabZambiabZimbabweb", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0008, 0x001c, 0x0029, 0x003f, 0x0048, 0x0050, - 0x0058, 0x005f, 0x005f, 0x0069, 0x0078, 0x0080, 0x008a, 0x0090, - 0x0090, 0x009c, 0x00b5, 0x00bd, 0x00c6, 0x00cf, 0x00dc, 0x00e5, - 0x00ec, 0x00f4, 0x00fa, 0x00fa, 0x0102, 0x0108, 0x0110, 0x0110, - 0x0119, 0x0120, 0x0127, 0x0127, 0x0130, 0x0137, 0x013d, 0x0144, - 0x0144, 0x0164, 0x017d, 0x0183, 0x018f, 0x0198, 0x01a4, 0x01aa, - 0x01b4, 0x01ba, 0x01c3, 0x01c3, 0x01cd, 0x01d2, 0x01e4, 0x01e4, - 0x01e4, 0x01ea, 0x01f9, 0x0203, 0x0203, 0x020b, 0x0213, 0x021c, - // Entry 40 - 7F - 0x022e, 0x0236, 0x0236, 0x023e, 0x0246, 0x024d, 0x024d, 0x0255, - 0x025c, 0x0265, 0x0265, 0x0265, 0x026d, 0x0272, 0x0282, 0x028c, - 0x028c, 0x0296, 0x029c, 0x02aa, 0x02b1, 0x02b9, 0x02c6, 0x02c6, - 0x02cc, 0x02d5, 0x02de, 0x02e5, 0x02ec, 0x02f6, 0x0308, 0x0312, - 0x0312, 0x031b, 0x031f, 0x032c, 0x0332, 0x0332, 0x0332, 0x033a, - 0x0342, 0x0347, 0x0351, 0x0351, 0x035b, 0x0362, 0x0369, 0x0369, - 0x036f, 0x038d, 0x0392, 0x0398, 0x039f, 0x03a6, 0x03a6, 0x03ae, - 0x03b6, 0x03bd, 0x03c3, 0x03cf, 0x03d8, 0x03e0, 0x03e7, 0x03fc, - // Entry 80 - BF - 0x0409, 0x0415, 0x041c, 0x042a, 0x0436, 0x043a, 0x0443, 0x044e, - 0x045d, 0x0467, 0x046f, 0x0477, 0x0481, 0x048c, 0x0492, 0x0498, - 0x049f, 0x04a5, 0x04ac, 0x04ac, 0x04ac, 0x04b7, 0x04c7, 0x04d1, - 0x04d6, 0x04dd, 0x04e5, 0x04e5, 0x04fd, 0x0507, 0x0511, 0x051b, - 0x0520, 0x0529, 0x0531, 0x0538, 0x053f, 0x0548, 0x0551, 0x0559, - 0x0566, 0x056c, 0x057a, 0x0582, 0x058c, 0x0597, 0x059f, 0x05a5, - 0x05aa, 0x05ae, 0x05ba, 0x05be, 0x05c4, 0x05c9, 0x05d9, 0x05ea, - 0x05f5, 0x05ff, 0x0606, 0x061f, 0x0627, 0x0632, 0x0650, 0x0659, - // Entry C0 - FF - 0x065e, 0x0667, 0x066c, 0x066c, 0x0674, 0x067b, 0x067b, 0x0681, - 0x0688, 0x0695, 0x06a4, 0x06ae, 0x06b5, 0x06bb, 0x06c4, 0x06d0, - 0x06d8, 0x06d8, 0x06e0, 0x06ec, 0x06f6, 0x06fe, 0x0706, 0x070e, - 0x070e, 0x0726, 0x0732, 0x0732, 0x0738, 0x0742, 0x0742, 0x075a, - 0x075f, 0x075f, 0x0764, 0x076d, 0x0777, 0x077e, 0x0788, 0x0794, - 0x079c, 0x07a1, 0x07a9, 0x07bc, 0x07c2, 0x07c8, 0x07d1, 0x07d8, - 0x07df, 0x07df, 0x07df, 0x07e7, 0x07ef, 0x07f9, 0x0806, 0x0826, - 0x0830, 0x0846, 0x0859, 0x0862, 0x0869, 0x087a, 0x087f, 0x087f, - // Entry 100 - 13F - 0x0884, 0x088b, 0x0897, 0x089e, 0x08a7, - }, - }, - { // nd - "AndoraUnited Arab EmiratesAfghanistanAntigua le BarbudaAnguillaAlbaniaAr" + - "meniaAngolaAjentinaSamoa ye AmelikaAustriaAustraliaArubhaAzerbaijanB" + - "hosnia le HerzegovinaBhabhadosiBhangiladeshiBhelgiumBhukina FasoBhul" + - "gariyaBhahareniBhurundiBheniniBhemudaBruneiBholiviyaBraziliBhahamasB" + - "hutaniBotswanaBhelarusiBhelizeKhanadaDemocratic Republic of the Cong" + - "oCentral African RepublicKhongoSwitzerlandIvory CoastCook IslandsChi" + - "leKhameruniChinaKholombiyaKhosta RikhaCubaCape Verde IslandsCyprusCz" + - "ech RepublicGermanyDjiboutiDenmakhiDominikhaDominican RepublicAljeri" + - "yaEcuadorEstoniaEgyptEritreaSpainEthiopiaFinlandFijiFalkland Islands" + - "MicronesiaFuransiGabhoniUnited KingdomGrenadaGeorgiaGwiyana ye Furan" + - "siGhanaGibraltarGreenlandGambiyaGuineaGuadeloupeEquatorial GuineaGre" + - "eceGuatemalaGuamGuinea-BissauGuyanaHondurasCroatiaHayitiHungaryIndon" + - "esiyaIrelandIsuraeliIndiyaBritish Indian Ocean TerritoryIrakiIranIce" + - "landItaliJamaicaJodaniJapanKhenyaKyrgyzstanCambodiaKhiribatiKhomoroS" + - "aint Kitts and NevisNorth KoreaSouth KoreaKhuweitiCayman IslandsKaza" + - "khstanLaosLebhanoniSaint LuciaLiechtensteinSri LankaLibheriyaLesotho" + - "LithuaniaLuxembourgLatviaLibhiyaMorokhoMonakhoMoldovaMadagaskaMarsha" + - "ll IslandsMacedoniaMaliMyanmarMongoliaNorthern Mariana IslandsMartin" + - "iqueMauritaniaMontserratMaltaMauritiusMaldivesMalawiMeksikhoMalezhiy" + - "aMozambiqueNamibhiyaNew CaledoniaNigerNorfolk IslandNigeriyaNicaragu" + - "aNetherlandsNoweyiNephaliNauruNiueNew ZealandOmaniPanamaPheruPholine" + - "siya ye FulansiPapua New GuineaPhilippinesPhakistaniPholandiSaint Pi" + - "erre and MiquelonPitcairnPuerto RicoPalestinian West Bank and GazaPo" + - "rtugalPalauParaguayKathariRéunionRomaniaRashiyaRuwandaSaudi ArabiaSo" + - "lomon IslandsSeychellesSudaniSwedenSingaporeSaint HelenaSloveniaSlov" + - "akiaSierra LeoneSan MarinoSenegaliSomaliyaSurinameSão Tomé and Prínc" + - "ipeEl SalvadorSyriaSwazilandTurks and Caicos IslandsChadiThogoThayil" + - "andiTajikistanThokelawuEast TimorTurkmenistanTunisiyaThongaThekhiTri" + - "nidad le TobagoThuvaluThayiwaniTanzaniyaYukreiniUgandaAmelikaYurugwa" + - "iUzbekistanVatican StateSaint Vincent and the GrenadinesVenezuelaBri" + - "tish Virgin IslandsU.S. Virgin IslandsVietnamVhanuatuWallis and Futu" + - "naSamowaYemeniMayotteMzansi ye AfrikaZambiyaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x001a, 0x0025, 0x0037, 0x003f, 0x0046, - 0x004d, 0x0053, 0x0053, 0x005b, 0x006b, 0x0072, 0x007b, 0x0081, - 0x0081, 0x008b, 0x00a1, 0x00ab, 0x00b8, 0x00c0, 0x00cc, 0x00d6, - 0x00df, 0x00e7, 0x00ee, 0x00ee, 0x00f5, 0x00fb, 0x0104, 0x0104, - 0x010b, 0x0113, 0x011a, 0x011a, 0x0122, 0x012b, 0x0132, 0x0139, - 0x0139, 0x0159, 0x0171, 0x0177, 0x0182, 0x018d, 0x0199, 0x019e, - 0x01a7, 0x01ac, 0x01b6, 0x01b6, 0x01c2, 0x01c6, 0x01d8, 0x01d8, - 0x01d8, 0x01de, 0x01ec, 0x01f3, 0x01f3, 0x01fb, 0x0203, 0x020c, - // Entry 40 - 7F - 0x021e, 0x0226, 0x0226, 0x022d, 0x0234, 0x0239, 0x0239, 0x0240, - 0x0245, 0x024d, 0x024d, 0x024d, 0x0254, 0x0258, 0x0268, 0x0272, - 0x0272, 0x0279, 0x0280, 0x028e, 0x0295, 0x029c, 0x02ae, 0x02ae, - 0x02b3, 0x02bc, 0x02c5, 0x02cc, 0x02d2, 0x02dc, 0x02ed, 0x02f3, - 0x02f3, 0x02fc, 0x0300, 0x030d, 0x0313, 0x0313, 0x0313, 0x031b, - 0x0322, 0x0328, 0x032f, 0x032f, 0x0339, 0x0340, 0x0348, 0x0348, - 0x034e, 0x036c, 0x0371, 0x0375, 0x037c, 0x0381, 0x0381, 0x0388, - 0x038e, 0x0393, 0x0399, 0x03a3, 0x03ab, 0x03b4, 0x03bb, 0x03d0, - // Entry 80 - BF - 0x03db, 0x03e6, 0x03ee, 0x03fc, 0x0406, 0x040a, 0x0413, 0x041e, - 0x042b, 0x0434, 0x043d, 0x0444, 0x044d, 0x0457, 0x045d, 0x0464, - 0x046b, 0x0472, 0x0479, 0x0479, 0x0479, 0x0482, 0x0492, 0x049b, - 0x049f, 0x04a6, 0x04ae, 0x04ae, 0x04c6, 0x04d0, 0x04da, 0x04e4, - 0x04e9, 0x04f2, 0x04fa, 0x0500, 0x0508, 0x0511, 0x051b, 0x0524, - 0x0531, 0x0536, 0x0544, 0x054c, 0x0555, 0x0560, 0x0566, 0x056d, - 0x0572, 0x0576, 0x0581, 0x0586, 0x058c, 0x0591, 0x05a7, 0x05b7, - 0x05c2, 0x05cc, 0x05d4, 0x05ed, 0x05f5, 0x0600, 0x061e, 0x0626, - // Entry C0 - FF - 0x062b, 0x0633, 0x063a, 0x063a, 0x0642, 0x0649, 0x0649, 0x0650, - 0x0657, 0x0663, 0x0672, 0x067c, 0x0682, 0x0688, 0x0691, 0x069d, - 0x06a5, 0x06a5, 0x06ad, 0x06b9, 0x06c3, 0x06cb, 0x06d3, 0x06db, - 0x06db, 0x06f3, 0x06fe, 0x06fe, 0x0703, 0x070c, 0x070c, 0x0724, - 0x0729, 0x0729, 0x072e, 0x0738, 0x0742, 0x074b, 0x0755, 0x0761, - 0x0769, 0x076f, 0x0775, 0x0787, 0x078e, 0x0797, 0x07a0, 0x07a8, - 0x07ae, 0x07ae, 0x07ae, 0x07b5, 0x07bd, 0x07c7, 0x07d4, 0x07f4, - 0x07fd, 0x0813, 0x0826, 0x082d, 0x0835, 0x0846, 0x084c, 0x084c, - // Entry 100 - 13F - 0x0852, 0x0859, 0x0869, 0x0870, 0x0878, - }, - }, - { // ne - neRegionStr, - neRegionIdx, - }, - { // nl - nlRegionStr, - nlRegionIdx, - }, - { // nmg - "Andɔ́raMinlambɔ́ Nsaŋ́nsa mí ArabiaAfganistaŋAntíga bá BarbúdaAnguíllaAl" + - "baniaArméniaAngolaArgentínaSamoa m ́Amɛ́rkaÖtrishÖstraliáÁrúbaAzerba" + - "ïjaŋBosnia na ƐrzegovinaBarbadoBɛŋgladɛshBɛlgikBurkina FasoBulgaria" + - "BahrainBurundiBeninBɛrmudaBrunɛiBoliviaBrésilBahamasButaŋBotswanaBel" + - "arusBɛlizKanadaKongó ZaïreSentrafríkaKongoSwitzɛrlandKote d´IvoireMa" + - "ŋ́ má KookTshiliKamerunShineKɔlɔ́mbiaKosta RíkaKubaMaŋ́ má KapvɛrSi" + - "priaNlambɔ́ bó tschɛkJamanJibútiDanemarkDominíkaNlambɔ́ DominíkaAlge" + - "riaEkuateurƐstoniaÄgyptɛnErytreaPaŋáEthiopiáFinlandeFijiáMaŋ má Falk" + - "landMikronesiaFalaGabɔŋNlambɔ́ NgɛlɛnGrenadaJɔrgiaGuyane FalaGánaGil" + - "bratarGreenlandGambiaGuineGuadeloupGuine EkuatorialGrɛceGuatemalaGua" + - "mGuine BissoGuyanaƆndúrasKroasiaHaïtiƆngríaIndonesiaIrlandÄsrɛlIndia" + - "Nlambɔ́ ngɛlɛn ma yí maŋ ntsiɛhIrakIranIslandItaliaJamaikaJɔrdaniaJa" + - "pɔnKɛnyaKyrgystaŋKambodiaKiribatiKɔmɔrSaint Kitts na NevisKoré yí bv" + - "uɔKoré yí síKowɛitMaŋ́ má kumbiKazakstaŋLaosLibaŋSaint LuciaLishenst" + - "einSri LankaLiberiaLesotoLituaniáLuxembourgLatviaLibyaMarɔkMonakoMɔl" + - "daviaMadagaskarMaŋ́ má MarshallMacedoniaMaliMyanmarMɔngoliaMaŋ́ Mari" + - "áMartinikaMoritaniaMɔnserratMaltaMorisseMaldiviaMalawiMɛxikMalaysia" + - "MozambikNamibiaKaledoni nwanahNigerMaŋ́ má NɔrfɔrkNigeriaNikaraguaNe" + - "dɛrlandNɔrvɛgNepalNoruNiuɛZeland nwanahOmanPanamaPeruPolynesia FalaG" + - "uine PapuasiFilipinPakistanPɔlɔŋSaint Peter ba MikelɔnPitkairnPuɛrto" + - " RikoPalɛstinPɔrtugalPaloParaguayKatarRéuniɔnRoumaniaRussiRwandaSaud" + - "i ArabiaMaŋ́ má SalomɔnSeychɛlleSudaŋSuɛdSingapurSaint LinaSloveniaS" + - "lovakiaSierra LeɔnSan MarinoSenegalSomáliaSurinamSao Tomé ba Prinshi" + - "pSalvadɔrSyriaSwazilandMaŋ́ má Turk na KaikoTshadTogoTaïlandTajikist" + - "aŋTokeloTimɔr tsindikēhTurkmɛnistaŋTunisiáTɔngaTurkiTrinidad ba Tobá" + - "góTuvalúTaïwanTanzáníaUkrɛnUgandaAmɛŕkaUruguayUsbǝkistaŋVatikaŋSaint" + - " Vincent ba GrenadinesVǝnǝzuelaMinsilɛ́ mímaŋ mí ngɛ̄lɛ̄nMinsilɛ mí " + - "maŋ́ m´AmɛrkaViɛtnamVanuatuWallis ba FutunaSamoaYǝmɛnMayɔtAfríka yí " + - "síZambiaZimbabwǝ", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0009, 0x002a, 0x0035, 0x0049, 0x0052, 0x0059, - 0x0061, 0x0067, 0x0067, 0x0071, 0x0084, 0x008b, 0x0095, 0x009c, - 0x009c, 0x00a8, 0x00bd, 0x00c4, 0x00d1, 0x00d8, 0x00e4, 0x00ec, - 0x00f3, 0x00fa, 0x00ff, 0x00ff, 0x0107, 0x010e, 0x0115, 0x0115, - 0x011c, 0x0123, 0x0129, 0x0129, 0x0131, 0x0138, 0x013e, 0x0144, - 0x0144, 0x0151, 0x015d, 0x0162, 0x016e, 0x017c, 0x018b, 0x0191, - 0x0198, 0x019d, 0x01a9, 0x01a9, 0x01b4, 0x01b8, 0x01ca, 0x01ca, - 0x01ca, 0x01d0, 0x01e5, 0x01ea, 0x01ea, 0x01f1, 0x01f9, 0x0202, - // Entry 40 - 7F - 0x0215, 0x021c, 0x021c, 0x0224, 0x022c, 0x0235, 0x0235, 0x023c, - 0x0242, 0x024b, 0x024b, 0x024b, 0x0253, 0x0259, 0x026a, 0x0274, - 0x0274, 0x0278, 0x027f, 0x0291, 0x0298, 0x029f, 0x02aa, 0x02aa, - 0x02af, 0x02b8, 0x02c1, 0x02c7, 0x02cc, 0x02d5, 0x02e5, 0x02eb, - 0x02eb, 0x02f4, 0x02f8, 0x0303, 0x0309, 0x0309, 0x0309, 0x0312, - 0x0319, 0x031f, 0x0327, 0x0327, 0x0330, 0x0336, 0x033d, 0x033d, - 0x0342, 0x0368, 0x036c, 0x0370, 0x0376, 0x037c, 0x037c, 0x0383, - 0x038c, 0x0392, 0x0398, 0x03a2, 0x03aa, 0x03b2, 0x03b9, 0x03cd, - // Entry 80 - BF - 0x03dc, 0x03e9, 0x03f0, 0x0400, 0x040a, 0x040e, 0x0414, 0x041f, - 0x042a, 0x0433, 0x043a, 0x0440, 0x0449, 0x0453, 0x0459, 0x045e, - 0x0464, 0x046a, 0x0473, 0x0473, 0x0473, 0x047d, 0x0490, 0x0499, - 0x049d, 0x04a4, 0x04ad, 0x04ad, 0x04ba, 0x04c3, 0x04cc, 0x04d6, - 0x04db, 0x04e2, 0x04ea, 0x04f0, 0x04f6, 0x04fe, 0x0506, 0x050d, - 0x051c, 0x0521, 0x0535, 0x053c, 0x0545, 0x054f, 0x0557, 0x055c, - 0x0560, 0x0565, 0x0572, 0x0576, 0x057c, 0x0580, 0x058e, 0x059b, - 0x05a2, 0x05aa, 0x05b2, 0x05c9, 0x05d1, 0x05dd, 0x05e6, 0x05ef, - // Entry C0 - FF - 0x05f3, 0x05fb, 0x0600, 0x0600, 0x0609, 0x0611, 0x0611, 0x0616, - 0x061c, 0x0628, 0x063b, 0x0645, 0x064b, 0x0650, 0x0658, 0x0662, - 0x066a, 0x066a, 0x0672, 0x067e, 0x0688, 0x068f, 0x0697, 0x069e, - 0x069e, 0x06b3, 0x06bc, 0x06bc, 0x06c1, 0x06ca, 0x06ca, 0x06e2, - 0x06e7, 0x06e7, 0x06eb, 0x06f3, 0x06fe, 0x0704, 0x0715, 0x0723, - 0x072b, 0x0731, 0x0736, 0x074a, 0x0751, 0x0758, 0x0762, 0x0768, - 0x076e, 0x076e, 0x076e, 0x0776, 0x077d, 0x0789, 0x0791, 0x07ac, - 0x07b7, 0x07da, 0x07f8, 0x0800, 0x0807, 0x0817, 0x081c, 0x081c, - // Entry 100 - 13F - 0x0823, 0x0829, 0x0838, 0x083e, 0x0847, - }, - }, - { // nn - "AscensionAndorraDei sameinte arabiske emirataAfghanistanAntigua og Barbu" + - "daAnguillaAlbaniaArmeniaAngolaAntarktisArgentinaAmerikansk SamoaAust" + - "errikeAustraliaArubaÅlandAserbajdsjanBosnia og HercegovinaBarbadosBa" + - "ngladeshBelgiaBurkina FasoBulgariaBahrainBurundiBeninSaint Barthélem" + - "yBermudaBruneiBoliviaBrasilBahamasBhutanBouvetøyaBotswanaKviterussla" + - "ndBelizeCanadaKokosøyaneKongo-KinshasaDen sentralafrikanske republik" + - "kenKongo-BrazzavilleSveitsElfenbeinskystenCookøyaneChileKamerunKinaC" + - "olombiaClippertonøyaCosta RicaCubaKapp VerdeCuraçaoChristmasøyaKypro" + - "sTsjekkiaTysklandDiego GarciaDjiboutiDanmarkDominicaDen dominikanske" + - " republikkenAlgerieCeuta og MelillaEcuadorEstlandEgyptVest-SaharaEri" + - "treaSpaniaEtiopiaDen europeiske unionenFinlandFijiFalklandsøyaneMikr" + - "onesiaføderasjonenFærøyaneFrankrikeGabonStorbritanniaGrenadaGeorgiaF" + - "ransk GuyanaGuernseyGhanaGibraltarGrønlandGambiaGuineaGuadeloupeEkva" + - "torial-GuineaHellasSør-Georgia og Sør-Sandwich-øyaneGuatemalaGuamGui" + - "nea-BissauGuyanaHongkong S.A.R. KinaHeard- og McDonaldsøyaneHonduras" + - "KroatiaHaitiUngarnKanariøyaneIndonesiaIrlandIsraelManIndiaBritiske o" + - "mråde i Det indiske havIrakIranIslandItaliaJerseyJamaicaJordanJapanK" + - "enyaKirgisistanKambodsjaKiribatiKomoraneSt. Christopher og NevisNord" + - "-KoreaSør-KoreaKuwaitCaymanøyaneKasakhstanLaosLibanonSt. LuciaLiecht" + - "ensteinSri LankaLiberiaLesothoLitauenLuxembourgLatviaLibyaMarokkoMon" + - "acoMoldovaMontenegroSaint MartinMadagaskarMarshalløyaneMakedoniaMali" + - "Myanmar (Burma)MongoliaMacao S.A.R. KinaNord-MariananeMartiniqueMaur" + - "itaniaMontserratMaltaMauritiusMaldivaneMalawiMexicoMalaysiaMosambikN" + - "amibiaNy-CaledoniaNigerNorfolkøyaneNigeriaNicaraguaNederlandNoregNep" + - "alNauruNiueNew ZealandOmanPanamaPeruFransk PolynesiaPapua Ny-GuineaF" + - "ilippinanePakistanPolenSt. Pierre og MiquelonPitcairnPuerto RicoPale" + - "stinsk territoriumPortugalPalauParaguayQatarYtre OseaniaRéunionRoman" + - "iaSerbiaRusslandRwandaSaudi-ArabiaSalomonøyaneSeychellaneSudanSverig" + - "eSingaporeSaint HelenaSloveniaSvalbard og Jan MayenSlovakiaSierra Le" + - "oneSan MarinoSenegalSomaliaSurinamSør-SudanSão Tomé og PríncipeEl Sa" + - "lvadorSint MaartenSyriaSwazilandTristan da CunhaTurks- og Caicosøyan" + - "eTsjadFranske sørområdeTogoThailandTadsjikistanTokelauTimor-Leste (A" + - "ust-Timor)TurkmenistanTunisiaTongaTyrkiaTrinidad og TobagoTuvaluTaiw" + - "anTanzaniaUkrainaUgandaUSAs ytre småøyarUSAUruguayUsbekistanVatikans" + - "tatenSt. Vincent og GrenadinaneVenezuelaDei britiske jomfruøyaneDei " + - "amerikanske jomfruøyaneVietnamVanuatuWallis og FutunaSamoaKosovoJeme" + - "nMayotteSør-AfrikaZambiaZimbabweukjent områdeverdaAfrikaNord-Amerika" + - "Sør-AmerikaOseaniaVest-AfrikaSentral-AmerikaAust-AfrikaNord-AfrikaSe" + - "ntral-AfrikaSørlege AfrikaAmerikanordlege AmerikaKaribiaAust-AsiaSør" + - "-AsiaSøraust-AsiaSør-EuropaAustralia og New ZealandMelanesiaMikrones" + - "iaPolynesiaAsiaSentral-AsiaVest-AsiaEuropaAust-EuropaNord-EuropaVest" + - "-EuropaLatin-Amerika", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002d, 0x0038, 0x004a, 0x0052, 0x0059, - 0x0060, 0x0066, 0x006f, 0x0078, 0x0088, 0x0092, 0x009b, 0x00a0, - 0x00a6, 0x00b2, 0x00c7, 0x00cf, 0x00d9, 0x00df, 0x00eb, 0x00f3, - 0x00fa, 0x0101, 0x0106, 0x0117, 0x011e, 0x0124, 0x012b, 0x012b, - 0x0131, 0x0138, 0x013e, 0x0148, 0x0150, 0x015d, 0x0163, 0x0169, - 0x0174, 0x0182, 0x01a3, 0x01b4, 0x01ba, 0x01ca, 0x01d4, 0x01d9, - 0x01e0, 0x01e4, 0x01ec, 0x01fa, 0x0204, 0x0208, 0x0212, 0x021a, - 0x0227, 0x022d, 0x0235, 0x023d, 0x0249, 0x0251, 0x0258, 0x0260, - // Entry 40 - 7F - 0x027c, 0x0283, 0x0293, 0x029a, 0x02a1, 0x02a6, 0x02b1, 0x02b8, - 0x02be, 0x02c5, 0x02db, 0x02db, 0x02e2, 0x02e6, 0x02f5, 0x030c, - 0x0316, 0x031f, 0x0324, 0x0331, 0x0338, 0x033f, 0x034c, 0x0354, - 0x0359, 0x0362, 0x036b, 0x0371, 0x0377, 0x0381, 0x0392, 0x0398, - 0x03bc, 0x03c5, 0x03c9, 0x03d6, 0x03dc, 0x03f0, 0x0409, 0x0411, - 0x0418, 0x041d, 0x0423, 0x042f, 0x0438, 0x043e, 0x0444, 0x0447, - 0x044c, 0x046e, 0x0472, 0x0476, 0x047c, 0x0482, 0x0488, 0x048f, - 0x0495, 0x049a, 0x049f, 0x04aa, 0x04b3, 0x04bb, 0x04c3, 0x04db, - // Entry 80 - BF - 0x04e5, 0x04ef, 0x04f5, 0x0501, 0x050b, 0x050f, 0x0516, 0x051f, - 0x052c, 0x0535, 0x053c, 0x0543, 0x054a, 0x0554, 0x055a, 0x055f, - 0x0566, 0x056c, 0x0573, 0x057d, 0x0589, 0x0593, 0x05a1, 0x05aa, - 0x05ae, 0x05bd, 0x05c5, 0x05d6, 0x05e4, 0x05ee, 0x05f8, 0x0602, - 0x0607, 0x0610, 0x0619, 0x061f, 0x0625, 0x062d, 0x0635, 0x063c, - 0x0648, 0x064d, 0x065a, 0x0661, 0x066a, 0x0673, 0x0678, 0x067d, - 0x0682, 0x0686, 0x0691, 0x0695, 0x069b, 0x069f, 0x06af, 0x06be, - 0x06c9, 0x06d1, 0x06d6, 0x06ec, 0x06f4, 0x06ff, 0x0715, 0x071d, - // Entry C0 - FF - 0x0722, 0x072a, 0x072f, 0x073b, 0x0743, 0x074a, 0x0750, 0x0758, - 0x075e, 0x076a, 0x0777, 0x0782, 0x0787, 0x078e, 0x0797, 0x07a3, - 0x07ab, 0x07c0, 0x07c8, 0x07d4, 0x07de, 0x07e5, 0x07ec, 0x07f3, - 0x07fd, 0x0814, 0x081f, 0x082b, 0x0830, 0x0839, 0x0849, 0x085f, - 0x0864, 0x0877, 0x087b, 0x0883, 0x088f, 0x0896, 0x08ae, 0x08ba, - 0x08c1, 0x08c6, 0x08cc, 0x08de, 0x08e4, 0x08ea, 0x08f2, 0x08f9, - 0x08ff, 0x0912, 0x0912, 0x0915, 0x091c, 0x0926, 0x0933, 0x094d, - 0x0956, 0x096f, 0x098b, 0x0992, 0x0999, 0x09a9, 0x09ae, 0x09b4, - // Entry 100 - 13F - 0x09b9, 0x09c0, 0x09cb, 0x09d1, 0x09d9, 0x09e7, 0x09ec, 0x09f2, - 0x09fe, 0x0a0a, 0x0a11, 0x0a1c, 0x0a2b, 0x0a36, 0x0a41, 0x0a4f, - 0x0a5e, 0x0a65, 0x0a75, 0x0a7c, 0x0a85, 0x0a8e, 0x0a9b, 0x0aa6, - 0x0abe, 0x0ac7, 0x0ad1, 0x0ada, 0x0ade, 0x0aea, 0x0af3, 0x0af9, - 0x0b04, 0x0b0f, 0x0b1a, 0x0b27, - }, - }, - { // nnh - "Kàmalûm", - []uint16{ // 49 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0009, - }, - }, - { // no - noRegionStr, - noRegionIdx, - }, - { // nus - "AndoraAbganithtanAntiguaa kɛnɛ BarbudaAŋguɛlaAlbäniaAɛrmäniaAŋgolaAɛrgen" + - "tinAmerika thamowAthtɛriaAthɔra̱liaArubaAdhe̱rbe̱ja̱nBothnia kɛnɛ ɣä" + - "rgobiniaBärbadothBengeladiecBe̱lgimBurkinɛ pa̱thuBulga̱a̱riaBa̱reenB" + - "urundiBe̱ni̱nBe̱rmudaaBurunɛyBulibiaBäraadhiilBämuɔthButa̱nBothiwaan" + - "aBe̱lɛruthBilidhaKänɛdaCɛntrɔl aprika repuɔblicKɔŋgɔKodibo̱o̱Kuk ɣa̱" + - "ylɛnCili̱KɛmɛrunCaynaKolombiaKothtirikaKɛp bedi ɣa̱ylɛnAlgeriaKorwaa" + - "tiaBurutic ɣe̱ndian oce̱nKombodiaKomruthKaymɛn ɣa̱ylɛnSudanCa̱dBurut" + - "ic dhuɔ̱ɔ̱l be̱rgin", - []uint16{ // 250 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0006, 0x0011, 0x0028, 0x0031, 0x0039, - 0x0043, 0x004a, 0x004a, 0x0054, 0x0062, 0x006b, 0x0077, 0x007c, - 0x007c, 0x008c, 0x00a7, 0x00b1, 0x00bc, 0x00c4, 0x00d4, 0x00e1, - 0x00e9, 0x00f0, 0x00f9, 0x00f9, 0x0103, 0x010b, 0x0112, 0x0112, - 0x011d, 0x0126, 0x012d, 0x012d, 0x0137, 0x0142, 0x0149, 0x0151, - 0x0151, 0x0151, 0x016c, 0x0174, 0x0174, 0x017f, 0x018d, 0x0193, - 0x019c, 0x01a1, 0x01a9, 0x01a9, 0x01b3, 0x01b3, 0x01c7, 0x01c7, - 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, - // Entry 40 - 7F - 0x01c7, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, - 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, - 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, - 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, - 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, - 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, - 0x01d7, 0x01f0, 0x01f0, 0x01f0, 0x01f0, 0x01f0, 0x01f0, 0x01f0, - 0x01f0, 0x01f0, 0x01f0, 0x01f0, 0x01f8, 0x01f8, 0x01ff, 0x01ff, - // Entry 80 - BF - 0x01ff, 0x01ff, 0x01ff, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, - 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, - 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, - 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, - 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, - 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, - 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, - 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, - // Entry C0 - FF - 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, - 0x0211, 0x0211, 0x0211, 0x0211, 0x0216, 0x0216, 0x0216, 0x0216, - 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, - 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, - 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, - 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, - 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, - 0x021b, 0x0238, - }, - }, - { // nyn - "AndoraAmahanga ga Buharabu ageeteereineAfuganistaniAngiguwa na BabudaAng" + - "wiraArubaniaArimeniyaAngoraArigentinaSamowa ya AmeerikaOsituriaOsitu" + - "reeriyaArubaAzabagyaniBoziniya na HezegovinaBabadosiBangaradeshiBubi" + - "rigiBokina FasoBurugariyaBahareniBurundiBeniniBerimudaBuruneiBoriivi" + - "yaBuraziiriBahamaButaniBotswanaBararusiBerizeKanadaDemokoratika Ripa" + - "aburika ya KongoEihanga rya Rwagati ya AfirikaKongoSwisiAivore Kosit" + - "iEbizinga bya KuukuChileKameruuniChinaKorombiyaKositarikaCubaEbizing" + - "a bya KepuvadeSaipurasiRipaaburika ya ZeekiBugirimaaniGyibutiDeenima" + - "akaDominikaRipaaburika ya DominicaArigyeriyaIkwedaEsitoniyaMisiriEri" + - "teriyaSipeyiniEthiyopiyaBufiniFigyiEbizinga bya FaakilandaMikironesi" + - "yaBufaransaGabooniBungyerezaGurenadaGyogiyaGuyana ya BufaransaGanaGi" + - "buraataGuriinirandiGambiyaGineGwaderupeGuniGuriisiGwatemaraGwamuGine" + - "bisauGuyanaHondurasiKorasiyaHaitiHangareIndoneeziyaIrerandiIsirairiI" + - "ndiyaEbizinga bya Indian ebya BungyerezaIraakaIraaniAisilandiItareGy" + - "amaikaYorudaaniGyapaaniKenyaKirigizistaniKambodiyaKiribatiKoromoSent" + - "i Kittis na NevisiKoreya AmatembaKoreya AmashuumaKuweitiEbizinga bya" + - " KayimaniKazakisitaniLayosiLebanoniSenti RusiyaLishenteniSirirankaLi" + - "beriyaLesothoLithuaniaLakizembaagaLatviyaLibyaMoroccoMonacoMoridovaM" + - "adagasikaEbizinga bya MarshaaMasedooniaMariMyanamarMongoriaEbizinga " + - "by’amatemba ga MarianaMartiniqueMauriteeniyaMontserratiMaritaMaurish" + - "iasiMaridivesMarawiMexicomarayiziaMozambiqueNamibiyaNiukaredoniaNaig" + - "yaEkizinga NorifokoNaigyeriyaNikaragwaHoorandiNoorweNepoNauruNiueNiu" + - "zirandiOmaaniPanamaPeruPolinesia ya BufaransaPapuaFiripinoPakisitaan" + - "iPoorandiSenti Piyerre na MikweronPitkainiPwetorikoParestiina na Gaz" + - "aPocugoPalaawuParagwaiKataRiyuniyoniRomaniyaRrashaRwandaSaudi Areebi" + - "yaEbizinga bya SurimaaniShesheresiSudaniSwideniSingapoSenti HerenaSi" + - "rovaaniyaSirovaakiyaSirra RiyooniSamarinoSenegoSomaariyaSurinaamuSaw" + - "o Tome na PurinsipoEri SalivadoSiriyaSwazirandiEbizinga bya Buturuki" + - " na KaikoChadiTogoTairandiTajikisitaniTokerawuBurugweizooba bwa Timo" + - "riTurukimenisitaniTuniziaTongaButuruki /TakeTurinidad na TobagoTuvar" + - "uTayiwaaniTanzaniaUkureiniUgandaAmerikaUrugwaiUzibekisitaniVatikaniS" + - "enti Vinsent na GurenadiniVenezuweraEbizinga bya Virigini ebya Bungy" + - "erezaEbizinga bya Virigini ebya AmerikaViyetinaamuVanuatuWarris na F" + - "utunaSamowaYemeniMayoteSausi AfirikaZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0027, 0x0033, 0x0045, 0x004c, 0x0054, - 0x005d, 0x0063, 0x0063, 0x006d, 0x007f, 0x0087, 0x0093, 0x0098, - 0x0098, 0x00a2, 0x00b8, 0x00c0, 0x00cc, 0x00d4, 0x00df, 0x00e9, - 0x00f1, 0x00f8, 0x00fe, 0x00fe, 0x0106, 0x010d, 0x0116, 0x0116, - 0x011f, 0x0125, 0x012b, 0x012b, 0x0133, 0x013b, 0x0141, 0x0147, - 0x0147, 0x0168, 0x0186, 0x018b, 0x0190, 0x019d, 0x01af, 0x01b4, - 0x01bd, 0x01c2, 0x01cb, 0x01cb, 0x01d5, 0x01d9, 0x01ee, 0x01ee, - 0x01ee, 0x01f7, 0x020b, 0x0216, 0x0216, 0x021d, 0x0227, 0x022f, - // Entry 40 - 7F - 0x0246, 0x0250, 0x0250, 0x0256, 0x025f, 0x0265, 0x0265, 0x026e, - 0x0276, 0x0280, 0x0280, 0x0280, 0x0286, 0x028b, 0x02a2, 0x02ae, - 0x02ae, 0x02b7, 0x02be, 0x02c8, 0x02d0, 0x02d7, 0x02ea, 0x02ea, - 0x02ee, 0x02f7, 0x0303, 0x030a, 0x030e, 0x0317, 0x031b, 0x0322, - 0x0322, 0x032b, 0x0330, 0x0339, 0x033f, 0x033f, 0x033f, 0x0348, - 0x0350, 0x0355, 0x035c, 0x035c, 0x0367, 0x036f, 0x0377, 0x0377, - 0x037d, 0x03a0, 0x03a6, 0x03ac, 0x03b5, 0x03ba, 0x03ba, 0x03c2, - 0x03cb, 0x03d3, 0x03d8, 0x03e5, 0x03ee, 0x03f6, 0x03fc, 0x0412, - // Entry 80 - BF - 0x0421, 0x0431, 0x0438, 0x044d, 0x0459, 0x045f, 0x0467, 0x0473, - 0x047d, 0x0486, 0x048e, 0x0495, 0x049e, 0x04aa, 0x04b1, 0x04b6, - 0x04bd, 0x04c3, 0x04cb, 0x04cb, 0x04cb, 0x04d5, 0x04e9, 0x04f3, - 0x04f7, 0x04ff, 0x0507, 0x0507, 0x0528, 0x0532, 0x053e, 0x0549, - 0x054f, 0x055a, 0x0563, 0x0569, 0x056f, 0x0578, 0x0582, 0x058a, - 0x0596, 0x059c, 0x05ad, 0x05b7, 0x05c0, 0x05c8, 0x05ce, 0x05d2, - 0x05d7, 0x05db, 0x05e5, 0x05eb, 0x05f1, 0x05f5, 0x060b, 0x0610, - 0x0618, 0x0623, 0x062b, 0x0644, 0x064c, 0x0655, 0x0667, 0x066d, - // Entry C0 - FF - 0x0674, 0x067c, 0x0680, 0x0680, 0x068a, 0x0692, 0x0692, 0x0698, - 0x069e, 0x06ac, 0x06c2, 0x06cc, 0x06d2, 0x06d9, 0x06e0, 0x06ec, - 0x06f7, 0x06f7, 0x0702, 0x070f, 0x0717, 0x071d, 0x0726, 0x072f, - 0x072f, 0x0745, 0x0751, 0x0751, 0x0757, 0x0761, 0x0761, 0x077f, - 0x0784, 0x0784, 0x0788, 0x0790, 0x079c, 0x07a4, 0x07bc, 0x07cc, - 0x07d3, 0x07d8, 0x07e6, 0x07f9, 0x07ff, 0x0808, 0x0810, 0x0818, - 0x081e, 0x081e, 0x081e, 0x0825, 0x082c, 0x0839, 0x0841, 0x085c, - 0x0866, 0x088b, 0x08ad, 0x08b8, 0x08bf, 0x08cf, 0x08d5, 0x08d5, - // Entry 100 - 13F - 0x08db, 0x08e1, 0x08ee, 0x08f4, 0x08fc, - }, - }, - { // om - "BrazilChinaGermanyItoophiyaaFranceUnited KingdomIndiaItalyJapanKeeniyaaR" + - "ussiaUnited States", - []uint16{ // 244 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, - 0x000b, 0x000b, 0x000b, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - // Entry 40 - 7F - 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, - 0x0012, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, - 0x001c, 0x0022, 0x0022, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, - 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, - 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, - 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, - 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003a, 0x003a, 0x003a, - 0x003a, 0x003f, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - // Entry 80 - BF - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, - // Entry C0 - FF - 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x005a, - }, - }, - { // or - "ଆଣ୍ଡୋରାସଂଯୁକ୍ତ ଆରବ ଏମିରେଟସ୍ଆଫାଗାନିସ୍ତାନ୍ଆଣ୍ଟିଗୁଆ ଏବଂ ବାରବୁଦାଆଙ୍ଗୁଇଲ୍ଲାଆଲ" + - "ବାନିଆଆର୍ମେନିଆଆଙ୍ଗୋଲାଆର୍ଣ୍ଟକଟିକାଆର୍ଜେଣ୍ଟିନାଆମେରିକାନ୍ ସାମୋଆଅଷ୍ଟ୍ରିଆଅ" + - "ଷ୍ଟ୍ରେଲିଆଆରୁବାଆଲାଣ୍ଡ ଆଇସଲ୍ୟାଣ୍ଡଆଜେରବାଇଜାନ୍ବୋସନିଆ ଏବଂ ହର୍ଜଗୋଭିନାବାର" + - "ବାଡୋସ୍ବାଙ୍ଗଲାଦେଶ୍ବେଲଜିୟମ୍ବୁର୍କିନୋ ଫାସୋବୁଲଗେରିଆବାହାରିନ୍ବୁରୁନ୍ଦିବେନି" + - "ନ୍ସେଣ୍ଟ ବାର୍ଥେଲେମିବରମୁଡାବ୍ରୁନେଇବୋଲଭିଆବ୍ରାଜିଲ୍ବାହାମାସ୍ଭୁଟାନ୍ବୌଭେଟ୍ " + - "ଆଇସଲ୍ୟାଣ୍ଡବୋଟସ୍ବାନ୍ବେଲାରୁଷ୍ବେଲିଜ୍କାନାଡାକୋକୋସ୍ ଆଇସଲ୍ୟାଣ୍ଡକଙ୍ଗୋ-କିନସ" + - "ାସାମଧ୍ୟ ଆଫ୍ରିକୀୟ ଗଣତନ୍ତ୍ରକଙ୍ଗୋ-ବ୍ରାଜିଭିଲ୍ଲେସ୍ବିଜରଲ୍ୟାଣ୍ଡଆଇବରୀ କୋଷ୍" + - "ଟକୁକ୍ ଆଇସଲ୍ୟାଣ୍ଡଚିଲ୍ଲୀକାମେରୁନ୍ଚିନ୍କୋଲମ୍ବିଆକୋଷ୍ଟା ରିକାକ୍ୱିବାକେପ୍ ଭର" + - "୍ଦେଖ୍ରୀଷ୍ଟମାସ ଆଇଲ୍ୟାଣ୍ଡସାଇପ୍ରସ୍ଚେକ୍ ସାଧାରଣତନ୍ତ୍ରଜର୍ମାନୀଡିବୌଟିଡେନମା" + - "ର୍କଡୋମିନାକାଡୋମିନକାନ୍ ପ୍ରଜାତନ୍ତ୍ରଆଲଜେରିଆଇକ୍ୱାଡୋର୍ଏସ୍ତୋନିଆଇଜିପ୍ଟପଶ୍ଚ" + - "ିମ ସାହାରାଇରିଟ୍ରିୟାସ୍ପେନ୍ଇଥିଓପିଆୟୁରୋପିଆନ୍ ୟୁନିଅନ୍ଫିନଲ୍ୟାଣ୍ଡଫିଜିଫଲ୍କ" + - "ଲ୍ୟାଣ୍ଡ ଦ୍ବୀପପୁଞ୍ଜମାଇକ୍ରୋନେସିଆଫାରୋଇ ଦ୍ବୀପପୁଞ୍ଜଫ୍ରାନ୍ସଗାବୋନ୍ବ୍ରିଟେନ" + - "୍ଗ୍ରେନାଡାଜର୍ଜିଆଫ୍ରେଞ୍ଚ ଗୁଇନାଗୁଏରନେସିଘାନାଜିବ୍ରାଲ୍ଟର୍ଗ୍ରୀନଲ୍ୟାଣ୍ଡଗାମ" + - "୍ବିଆଗୁଏନେଆଗୌଡେଲୌପେଇକ୍ବାଟେରିଆଲ୍ ଗୁଇନିଆଗ୍ରୀସ୍ଦକ୍ଷିଣ ଜର୍ଜିଆ ଏବଂ ଦକ୍ଷି" + - "ଣ ସାଣ୍ଡୱିଚ୍ ଦ୍ବୀପପୁଞ୍ଜଗୁଏତମାଲାଗୁଆମ୍ଗୁଇନିଆ-ବିସାଉଗୁଇନାହଂକଂ ବିଶେଷ ପ୍ର" + - "ଶାସନିକ କ୍ଷେତ୍ର ଚୀନ୍ହାର୍ଡ ଦ୍ବୀପପୁଞ୍ଜ ଏବଂ ମ୍ୟାକଡୋନାଲ୍ ଦ୍ବୀପପୁଞ୍ଜହୋଣ୍" + - "ଡାରୁସ୍କ୍ରୋଆଟିଆହାଇତିହଙ୍ଗେରୀଇଣ୍ଡୋନେସିଆଆୟରଲ୍ୟାଣ୍ଡଇସ୍ରାଏଲ୍ଆଇଲ୍ ଅଫ୍ ମୈନ" + - "୍ଭାରତବ୍ରିଟିଶ୍ ଭାରତୀୟ ସାମୁଦ୍ରିକ କ୍ଷେତ୍ରଇରାକ୍ଇରାନ୍ଆଇସଲ୍ୟାଣ୍ଡଇଟାଲୀଜର୍" + - "ସିଜାମାଇକାଜୋର୍ଡାନ୍ଜାପାନ୍କେନିୟାକିର୍ଗିଜିସ୍ଥାନକାମ୍ବୋଡିଆକିରିବାଟୀକାମୋରସ୍" + - "ସେଣ୍ଟ କିଟସ୍ ଏଣ୍ଡ ନେଭିସ୍ଉତ୍ତର କୋରିଆଦକ୍ଷିଣ କୋରିଆକୁଏତ୍କେମ୍ୟାନ୍ ଦ୍ବୀପପ" + - "ୁଞ୍ଜକାଜାକାସ୍ଥାନ୍ଲାଓସ୍ଲେବାନନ୍ସେଣ୍ଟ ଲୁସିଆଲିଚେସ୍ତିଆନାନ୍ଶ୍ରୀଲଙ୍କାଲିବେର" + - "ିଆଲେସୋଥୋଲିଥାଆନିଆଲକ୍ସେମବର୍ଗଲାଟଭିଆଲିବିଆମୋରୋକ୍କୋମୋନାକୋମାଲଡୋଭାମଣ୍ଟେଗ୍ର" + - "ୋସେଣ୍ଟ ମାର୍ଟିନ୍ମାଡାଗାସ୍କର୍ମାର୍ଶଲ୍ ଦ୍ବୀପପୁଞ୍ଜମାସେଡୋନିଆମାଳୀମିୟାମାର୍ମ" + - "ଙ୍ଗୋଲିଆମାକାଉ SAR ଚିନ୍ଉତ୍ତର ମାରିଆନା ଦ୍ବୀପପୁଞ୍ଜମାର୍ଟିନିକ୍ୟୁମାଉରିଟାନି" + - "ଆମଣ୍ଟେସେରାଟ୍ମାଲ୍ଟାମୌରିସସ୍ମାଳଦ୍ବୀପମାଲୱିମେକ୍ସିକୋମାଲେସିଆମୋଜାମ୍ବିକ୍ୟୁନ" + - "ାମ୍ବିଆନୂତନ କାଲେଡୋନିଆନାଇଜର୍ନରଫ୍ଲକ୍ ଦ୍ବୀପନାଇଜେରିଆନିକାରାଗୁଆନେଦରଲ୍ୟାଣ୍" + - "ଡନରୱେନେପାଳନାଉରୁନିଉନ୍ୟୁଜିଲାଣ୍ଡଓମାନ୍ପାନାମାପେରୁଫ୍ରେଞ୍ଚ ପଲିନେସିଆପପୁଆ ନ" + - "୍ୟୁ ଗୁଏନିଆଫିଲିପାଇନସ୍ପାକିସ୍ତାନପୋଲାଣ୍ଡସେଣ୍ଟ ପିଏରେ ଏବଂ ମିକ୍ବାଲୋନ୍ପିଟକ" + - "ାଇରିନ୍ପୁଏର୍ତ୍ତୋ ରିକୋପାଲେସ୍ତେନିଆପର୍ତ୍ତୁଗାଲ୍ପାଲାଉପାରାଗୁଏକତାର୍ଆଉଟଲେଇଂ" + - " ଓସେନିଆରିୟୁନିଅନ୍ରୋମାନିଆସର୍ବିଆରୁଷିଆରାୱାଣ୍ଡାସାଉଦି ଆରବିଆସୋଲୋମନ୍ ଦ୍ବୀପପୁ" + - "ଞ୍ଜସେଚେଲସ୍ସୁଦାନ୍ସ୍ୱେଡେନ୍ସିଙ୍ଗାପୁର୍ସେଣ୍ଟ ହେଲେନାସ୍ଲୋଭେନିଆସାଲ୍ଭାର୍ଡ ଏ" + - "ବଂ ଜାନ୍ ମାୟୋନ୍ସ୍ଲୋଭାକିଆସିଓରା ଲିଓନ୍ସାନ୍ ମାରିନୋସେନେଗାଲ୍ସୋମାଲିଆସୁରିନା" + - "ମସାଓ ଟୋମେ ଏବଂ ପ୍ରିନସିପିଏଲ୍ ସାଲଭାଡୋର୍ସିରିଆସ୍ବାଜିଲାଣ୍ଡତୁର୍କସ୍ ଏବଂ ସା" + - "ଇକସ୍ ଦ୍ବୀପପୁଞ୍ଜଚାଦ୍ଫରାସୀ ଦକ୍ଷିଣ କ୍ଷେତ୍ରଟୋଗୋଥାଇଲାଣ୍ଡତାଜିକିସ୍ଥାନ୍ଟୋକ" + - "େଲାଉପୁର୍ବ ତିମୋର୍ତୁର୍କମେନିସ୍ତାନ୍ତୁନିସିଆଟୋଙ୍ଗାତୁର୍କୀତ୍ରିନିଦାଦ୍ ଏବଂ ଟ" + - "ୋବାଗୋଟୁଭାଲୁତାଇୱାନ୍ତାଞ୍ଜାନିଆୟୁକ୍ରାଇନ୍ଉଗାଣ୍ଡାୟୁନାଇଟେଡ୍ ଷ୍ଟେଟସ୍ ମାଇନର" + - "୍ ଆଉଟଲେଇଂ ଦ୍ବୀପପୁଞ୍ଜଯୁକ୍ତ ରାଷ୍ଟ୍ର ଆମେରିକାଉରୁଗୁଏଉଜବେକିସ୍ଥାନ୍ଭାଟିକାନ" + - "୍ସେଣ୍ଟ ଭିନସେଣ୍ଟ ଏବଂ ଦି ଗ୍ରେନାଡିସ୍ଭେନଜୁଏଲାବ୍ରିଟିଶ୍ ଭର୍ଜିନ୍ ଦ୍ବୀପପୁଞ" + - "୍ଜୟୁଏସ୍ ଭର୍ଜିନ୍ ଦ୍ବୀପପୁଞ୍ଜଭିଏତନାମ୍ଭାନୁଆତୁୱାଲିସ୍ ଏବଂ ଫୁତୁନାସାମୋଆୟେମ" + - "େନ୍ମାୟୋଟେଦକ୍ଷିଣ ଆଫ୍ରିକାଜାମ୍ବିଆଜିମ୍ବାୱେଅଜଣା କିମ୍ବା ଅବୈଧ ପ୍ରଦେଶବିଶ୍ବ" + - "ଆଫ୍ରିକାଉତ୍ତର ଆମେରିକାଦକ୍ଷିଣ ଆମେରିକାଓସୋନିଆନ୍ପଶ୍ଚିମ ଆଫ୍ରିକାମଧ୍ୟ ଆମେରି" + - "କାପୂର୍ବ ଆଫ୍ରିକାଉତ୍ତର ଆଫ୍ରିକାମଧ୍ୟ ଆଫ୍ରିକାଦକ୍ଷିଣସ୍ଥ ଆଫ୍ରିକାଆମେରିକାସ୍" + - "ଉତ୍ତରସ୍ଥ ଆମେରିକାକାରିବିଆନ୍ପୂର୍ବ ଏସିଆଦକ୍ଷିଣ ଏସିଆଦକ୍ଷିଣ-ପୂର୍ବ ଏସିଆଦକ୍" + - "ଷିଣ ୟୁରୋପ୍ଅଷ୍ଟ୍ରେଲିଆ ଏବଂ ନ୍ୟୁଜିଲ୍ୟାଣ୍ଡମେଲାନେସିଆମାଇକ୍ରୋନେସିଆନ୍ ଅଞ୍ଚ" + - "ଳପଲିନେସିଆଏସିଆମଧ୍ୟ ଏସିଆପଶ୍ଚିମ ଏସିଆୟୁରୋପ୍ପୂର୍ବ ୟୁରୋପ୍ଉତ୍ତର ୟୁରୋପ୍ପଶ୍" + - "ଚିମ ୟୁରୋପ୍ଲାଟିନ୍ ଆମେରିକା ଏବଂ କାରିବିଆନ୍", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0015, 0x004d, 0x0074, 0x00ac, 0x00ca, 0x00df, - 0x00f7, 0x010c, 0x012d, 0x014e, 0x0179, 0x0191, 0x01af, 0x01be, - 0x01ef, 0x0210, 0x024b, 0x0266, 0x0287, 0x029f, 0x02c4, 0x02dc, - 0x02f4, 0x030c, 0x031e, 0x034c, 0x035e, 0x0373, 0x0385, 0x0385, - 0x039d, 0x03b5, 0x03c7, 0x03f8, 0x0413, 0x042b, 0x043d, 0x044f, - 0x0480, 0x04a5, 0x04e3, 0x0517, 0x053e, 0x055d, 0x0588, 0x059a, - 0x05b2, 0x05be, 0x05d6, 0x05d6, 0x05f5, 0x0607, 0x0623, 0x0623, - 0x065d, 0x0675, 0x06a6, 0x06bb, 0x06bb, 0x06cd, 0x06e5, 0x06fd, - // Entry 40 - 7F - 0x073a, 0x074f, 0x074f, 0x076a, 0x0782, 0x0794, 0x07b9, 0x07d4, - 0x07e6, 0x07fb, 0x082c, 0x082c, 0x084a, 0x0856, 0x0896, 0x08ba, - 0x08e8, 0x08fd, 0x090f, 0x0927, 0x093f, 0x0951, 0x0976, 0x098e, - 0x099a, 0x09bb, 0x09df, 0x09f4, 0x0a06, 0x0a1e, 0x0a55, 0x0a67, - 0x0ae4, 0x0afc, 0x0b0b, 0x0b2d, 0x0b3c, 0x0b97, 0x0c10, 0x0c2e, - 0x0c46, 0x0c55, 0x0c6a, 0x0c6a, 0x0c88, 0x0ca6, 0x0cbe, 0x0ce1, - 0x0ced, 0x0d4a, 0x0d59, 0x0d68, 0x0d86, 0x0d95, 0x0da4, 0x0db9, - 0x0dd1, 0x0de3, 0x0df5, 0x0e1c, 0x0e37, 0x0e4f, 0x0e64, 0x0ea3, - // Entry 80 - BF - 0x0ec2, 0x0ee4, 0x0ef3, 0x0f2a, 0x0f4e, 0x0f5d, 0x0f72, 0x0f91, - 0x0fb8, 0x0fd3, 0x0fe8, 0x0ffa, 0x1012, 0x1030, 0x1042, 0x1051, - 0x1069, 0x107b, 0x1090, 0x10ab, 0x10d3, 0x10f4, 0x1128, 0x1143, - 0x114f, 0x1167, 0x117f, 0x119f, 0x11e3, 0x1207, 0x1225, 0x1246, - 0x1258, 0x126d, 0x1285, 0x1294, 0x12ac, 0x12c1, 0x12e5, 0x12fa, - 0x1322, 0x1334, 0x1359, 0x1371, 0x138c, 0x13ad, 0x13b9, 0x13c8, - 0x13d7, 0x13e0, 0x1401, 0x1410, 0x1422, 0x142e, 0x145c, 0x1488, - 0x14a6, 0x14c1, 0x14d6, 0x151e, 0x153c, 0x1564, 0x1585, 0x15a6, - // Entry C0 - FF - 0x15b5, 0x15ca, 0x15d9, 0x1601, 0x161c, 0x1631, 0x1643, 0x1652, - 0x166a, 0x1689, 0x16bd, 0x16d2, 0x16e4, 0x16fc, 0x171a, 0x173c, - 0x1757, 0x179c, 0x17b7, 0x17d6, 0x17f5, 0x180d, 0x1822, 0x1837, - 0x1837, 0x1873, 0x1898, 0x1898, 0x18a7, 0x18c8, 0x18c8, 0x1919, - 0x1925, 0x195d, 0x1969, 0x1981, 0x19a5, 0x19ba, 0x19dc, 0x1a09, - 0x1a1e, 0x1a30, 0x1a42, 0x1a7d, 0x1a8f, 0x1aa4, 0x1abf, 0x1ada, - 0x1aef, 0x1b68, 0x1b68, 0x1ba3, 0x1bb5, 0x1bd9, 0x1bf1, 0x1c49, - 0x1c61, 0x1cae, 0x1cf2, 0x1d0a, 0x1d1f, 0x1d4e, 0x1d5d, 0x1d5d, - // Entry 100 - 13F - 0x1d6f, 0x1d81, 0x1da9, 0x1dbe, 0x1dd6, 0x1e15, 0x1e24, 0x1e39, - 0x1e5e, 0x1e86, 0x1e9e, 0x1ec6, 0x1ee8, 0x1f0d, 0x1f32, 0x1f54, - 0x1f85, 0x1fa0, 0x1fce, 0x1fe9, 0x2005, 0x2024, 0x2053, 0x2078, - 0x20c8, 0x20e3, 0x211d, 0x2135, 0x2141, 0x215a, 0x2179, 0x218b, - 0x21ad, 0x21cf, 0x21f4, 0x2242, - }, - }, - { // os - "БразилиКитайГерманФранцСтыр БританиГуырдзыстонИндиИталиЯпонУӕрӕсеАИШНӕзо" + - "нгӕ бӕстӕДунеАфрикӕОкеаниАмерикӕАзиЕвропӕ", - []uint16{ // 288 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, - 0x000e, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, - // Entry 40 - 7F - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, - 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, - 0x0024, 0x002e, 0x002e, 0x0045, 0x0045, 0x005b, 0x005b, 0x005b, - 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, - 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, - 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x006d, 0x006d, 0x006d, - 0x006d, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - // Entry 80 - BF - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - // Entry C0 - FF - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - // Entry 100 - 13F - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x00a0, 0x00a8, 0x00b4, - 0x00b4, 0x00b4, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, - 0x00c0, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, - 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00d4, 0x00d4, 0x00d4, 0x00e0, - }, - }, - { // pa - paRegionStr, - paRegionIdx, - }, - { // pa-Arab - "پاکستان", - []uint16{ // 186 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x000e, - }, - }, - { // pl - plRegionStr, - plRegionIdx, - }, - {}, // prg - { // ps - "افغانستانالبانیهانګولاانتارکتیکااتریشبنګله\u200cدیشبلغاریهکاناډاسویسچینک" + - "ولمبیاکیوباالمانډنمارکالجزایرمصرهسپانیهحبشهفنلینډفرانسهبرتانیهګاناګ" + - "یانایونانګواتیمالاهانډوراسمجارستاناندونیزیاهندعراقآیسلینډایټالیهجمی" + - "کاجاپانکمبودیاکویټلاوسلبنانلایبریالیبیامراکشمغولستانمالیزیانایجیریا" + - "نکاراګواهالېنډناروۍنیپالنیوزیلنډپاکستانپولنډفلسطینپورتګالروسیهروندا" + - "سعودی عربستانسویډنسالوېډورسوریهتاجکستانتنزانیایوروګواییمن", - []uint16{ // 257 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0012, 0x0012, 0x0020, - 0x0020, 0x002c, 0x0040, 0x0040, 0x0040, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x005d, 0x005d, 0x005d, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x007f, 0x007f, 0x007f, 0x007f, - 0x007f, 0x0085, 0x0093, 0x0093, 0x0093, 0x009d, 0x009d, 0x009d, - 0x009d, 0x009d, 0x009d, 0x00a7, 0x00a7, 0x00a7, 0x00b3, 0x00b3, - // Entry 40 - 7F - 0x00b3, 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00c7, 0x00c7, 0x00c7, - 0x00d5, 0x00dd, 0x00dd, 0x00dd, 0x00e9, 0x00e9, 0x00e9, 0x00e9, - 0x00e9, 0x00f5, 0x00f5, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, - 0x010b, 0x010b, 0x010b, 0x010b, 0x0115, 0x0115, 0x0115, 0x011f, - 0x011f, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0141, - 0x0141, 0x0141, 0x0151, 0x0151, 0x0163, 0x0163, 0x0163, 0x0163, - 0x0169, 0x0169, 0x0171, 0x0171, 0x017f, 0x018d, 0x018d, 0x0197, - 0x0197, 0x01a1, 0x01a1, 0x01a1, 0x01af, 0x01af, 0x01af, 0x01af, - // Entry 80 - BF - 0x01af, 0x01af, 0x01b7, 0x01b7, 0x01b7, 0x01bf, 0x01c9, 0x01c9, - 0x01c9, 0x01c9, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01e1, - 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, - 0x01eb, 0x01eb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, - 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x0209, 0x0209, 0x0209, - 0x0209, 0x0209, 0x0209, 0x0219, 0x0229, 0x0235, 0x023f, 0x0249, - 0x0249, 0x0249, 0x0259, 0x0259, 0x0259, 0x0259, 0x0259, 0x0259, - 0x0259, 0x0267, 0x0271, 0x0271, 0x0271, 0x0271, 0x027d, 0x028b, - // Entry C0 - FF - 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x0295, - 0x029f, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02c2, 0x02c2, 0x02c2, - 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, - 0x02c2, 0x02c2, 0x02d2, 0x02d2, 0x02dc, 0x02dc, 0x02dc, 0x02dc, - 0x02dc, 0x02dc, 0x02dc, 0x02dc, 0x02ec, 0x02ec, 0x02ec, 0x02ec, - 0x02ec, 0x02ec, 0x02ec, 0x02ec, 0x02ec, 0x02ec, 0x02fa, 0x02fa, - 0x02fa, 0x02fa, 0x02fa, 0x02fa, 0x030a, 0x030a, 0x030a, 0x030a, - 0x030a, 0x030a, 0x030a, 0x030a, 0x030a, 0x030a, 0x030a, 0x030a, - // Entry 100 - 13F - 0x0310, - }, - }, - { // pt - ptRegionStr, - ptRegionIdx, - }, - { // pt-PT - ptPTRegionStr, - ptPTRegionIdx, - }, - { // qu - "AndorraAfganistánAlbaniaArmeniaAngolaArgentinaSamoa AmericanaAustriaAust" + - "raliaAzerbaiyánBangladeshBélgicaBulgariaBaréinBurundiBenínBrunéiBoli" + - "viaBonaireBrasilBahamasButánBotsuanaBelarúsIslas CocosCongo (RDC)Con" + - "goSuizaCôte d’IvoireChileCamerúnChinaColombiaCosta RicaCubaCurazaoIs" + - "la ChristmasChipreAlemaniaYibutiDinamarcaDominicaArgeliaEcuadorEston" + - "iaEgiptoEritreaEspañaEtiopíaFinlandiaFiyiMicronesiaFranciaGabónReino" + - " UnidoGuerneseyGhanaGambiaGuineaGuinea EcuatorialGreciaGuatemalaGuam" + - "Guinea-BisáuGuyanaHong Kong (RAE)Islas Heard y McDonaldHondurasCroac" + - "iaHaitíIndonesiaIsraelIndiaIrakIránIslandiaItaliaJerseyJordaniaKenia" + - "KirguistánCamboyaKiribatiComorasSan Cristóbal y NievesCorea del Nort" + - "eCorea del SurKuwaitKazajistánLaosLíbanoLiechtensteinSri LankaLiberi" + - "aLesotoLituaniaLuxemburgoLetoniaMarruecosMónacoMoldovaSan MartínMada" + - "gascarIslas MarshallERY MacedoniaMalíMyanmarMacao RAEIslas Marianas " + - "del NorteMauritaniaMaltaMauricioMaldivasMalawiMéxicoMozambiqueNamibi" + - "aNueva CaledoniaNígerIsla NorfolkNigeriaNicaraguaPaíses BajosNoruega" + - "NepalNauruOmánPanamáPerúPolinesia FrancesaPapúa Nueva GuineaFilipina" + - "sPakistánPoloniaSan Pedro y MiquelónIslas PitcairnPuerto RicoPalesti" + - "na KamachikuqPortugalPalaosParaguayQatarSerbiaRusiaRuandaArabia Saud" + - "íSeychellesSudánSueciaSingapurEsloveniaEslovaquiaSierra LeonaSan Ma" + - "rinoSenegalSomaliaSurinamSudán del SurSanto Tomé y PríncipeEl Salvad" + - "orSint MaartenSiriaSuazilandiaChadTerritorios Australes FrancesesTog" + - "oTailandiaTayikistánTimor-LesteTúnezTongaTurquíaTrinidad y TobagoTan" + - "zaniaUgandaIslas menores alejadas de los EE.UU.Estados UnidosUruguay" + - "UzbekistánSanta Sede (Ciudad del Vaticano)VenezuelaEE.UU. Islas Vírg" + - "enesVietnamVanuatuWallis y FutunaSamoaYemenSudáfricaZambiaZimbabue", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x0007, 0x0012, 0x0012, 0x0012, 0x0019, - 0x0020, 0x0026, 0x0026, 0x002f, 0x003e, 0x0045, 0x004e, 0x004e, - 0x004e, 0x0059, 0x0059, 0x0059, 0x0063, 0x006b, 0x006b, 0x0073, - 0x007a, 0x0081, 0x0087, 0x0087, 0x0087, 0x008e, 0x0095, 0x009c, - 0x00a2, 0x00a9, 0x00af, 0x00af, 0x00b7, 0x00bf, 0x00bf, 0x00bf, - 0x00ca, 0x00d5, 0x00d5, 0x00da, 0x00df, 0x00ef, 0x00ef, 0x00f4, - 0x00fc, 0x0101, 0x0109, 0x0109, 0x0113, 0x0117, 0x0117, 0x011e, - 0x012c, 0x0132, 0x0132, 0x013a, 0x013a, 0x0140, 0x0149, 0x0151, - // Entry 40 - 7F - 0x0151, 0x0158, 0x0158, 0x015f, 0x0166, 0x016c, 0x016c, 0x0173, - 0x017a, 0x0182, 0x0182, 0x0182, 0x018b, 0x018f, 0x018f, 0x0199, - 0x0199, 0x01a0, 0x01a6, 0x01b1, 0x01b1, 0x01b1, 0x01b1, 0x01ba, - 0x01bf, 0x01bf, 0x01bf, 0x01c5, 0x01cb, 0x01cb, 0x01dc, 0x01e2, - 0x01e2, 0x01eb, 0x01ef, 0x01fc, 0x0202, 0x0211, 0x0227, 0x022f, - 0x0236, 0x023c, 0x023c, 0x023c, 0x0245, 0x0245, 0x024b, 0x024b, - 0x0250, 0x0250, 0x0254, 0x0259, 0x0261, 0x0267, 0x026d, 0x026d, - 0x0275, 0x0275, 0x027a, 0x0285, 0x028c, 0x0294, 0x029b, 0x02b2, - // Entry 80 - BF - 0x02c1, 0x02ce, 0x02d4, 0x02d4, 0x02df, 0x02e3, 0x02ea, 0x02ea, - 0x02f7, 0x0300, 0x0307, 0x030d, 0x0315, 0x031f, 0x0326, 0x0326, - 0x032f, 0x0336, 0x033d, 0x033d, 0x0348, 0x0352, 0x0360, 0x036d, - 0x0372, 0x0379, 0x0379, 0x0382, 0x039a, 0x039a, 0x03a4, 0x03a4, - 0x03a9, 0x03b1, 0x03b9, 0x03bf, 0x03c6, 0x03c6, 0x03d0, 0x03d7, - 0x03e6, 0x03ec, 0x03f8, 0x03ff, 0x0408, 0x0415, 0x041c, 0x0421, - 0x0426, 0x0426, 0x0426, 0x042b, 0x0432, 0x0437, 0x0449, 0x045c, - 0x0465, 0x046e, 0x0475, 0x048a, 0x0498, 0x04a3, 0x04b7, 0x04bf, - // Entry C0 - FF - 0x04c5, 0x04cd, 0x04d2, 0x04d2, 0x04d2, 0x04d2, 0x04d8, 0x04dd, - 0x04e3, 0x04f0, 0x04f0, 0x04fa, 0x0500, 0x0506, 0x050e, 0x050e, - 0x0517, 0x0517, 0x0521, 0x052d, 0x0537, 0x053e, 0x0545, 0x054c, - 0x055a, 0x0571, 0x057c, 0x0588, 0x058d, 0x0598, 0x0598, 0x0598, - 0x059c, 0x05bb, 0x05bf, 0x05c8, 0x05d3, 0x05d3, 0x05de, 0x05de, - 0x05e4, 0x05e9, 0x05f1, 0x0602, 0x0602, 0x0602, 0x060a, 0x060a, - 0x0610, 0x0634, 0x0634, 0x0642, 0x0649, 0x0654, 0x0674, 0x0674, - 0x067d, 0x067d, 0x0693, 0x069a, 0x06a1, 0x06b0, 0x06b5, 0x06b5, - // Entry 100 - 13F - 0x06ba, 0x06ba, 0x06c4, 0x06ca, 0x06d2, - }, - }, - { // rm - "AndorraEmirats Arabs UnidsAfghanistanAntigua e BarbudaAnguillaAlbaniaArm" + - "eniaAngolaAntarcticaArgentiniaSamoa AmericanaAustriaAustraliaArubaIn" + - "slas AlandAserbaidschanBosnia ed ErzegovinaBarbadosBangladeschBelgia" + - "Burkina FasoBulgariaBahrainBurundiBeninSon BarthélemyBermudasBruneiB" + - "oliviaBrasilaBahamasBhutanInsla BouvetBotswanaBielorussiaBelizeCanad" + - "aInslas CocosRepublica Democratica dal CongoRepublica Centralafrican" + - "aCongoSvizraCosta d’IvurInslas CookChileCamerunChinaColumbiaCosta Ri" + - "caCubaCap VerdInsla da ChristmasCipraRepublica TschecaGermaniaDschib" + - "utiDanemarcDominicaRepublica DominicanaAlgeriaEcuadorEstoniaEgiptaSa" + - "hara OccidentalaEritreaSpagnaEtiopiaUniun europeicaFinlandaFidschiIn" + - "slas dal FalklandMicronesiaInslas FeroeFrantschaGabunReginavel UnìGr" + - "enadaGeorgiaGuyana FranzosaGuernseyGhanaGibraltarGrönlandaGambiaGuin" + - "eaGuadeloupeGuinea EquatorialaGreziaGeorgia dal Sid e las Inslas San" + - "dwich dal SidGuatemalaGuamGuinea-BissauGuyanaRegiun d’administraziun" + - " speziala da Hongkong, ChinaInslas da Heard e da McDonladHondurasCro" + - "aziaHaitiUngariaIndonesiaIrlandaIsraelInsla da ManIndiaTerritori Bri" + - "tannic en l’Ocean IndicIracIranIslandaItaliaJerseyGiamaicaJordaniaGi" + - "apunKeniaKirghisistanCambodschaKiribatiComorasSaint Kitts e NevisCor" + - "ea dal NordCorea dal SidKuwaitInslas CaymanKasachstanLaosLibanonSain" + - "t LuciaLiechtensteinSri LankaLiberiaLesothoLituaniaLuxemburgLettonia" + - "LibiaMarocMonacoMoldaviaMontenegroSaint MartinMadagascarInslas da Ma" + - "rshallMacedoniaMaliMyanmarMongoliaRegiun d’administraziun speziala M" + - "acao, ChinaInslas Mariannas dal NordMartiniqueMauretaniaMontserratMa" + - "ltaMauritiusMaldivasMalawiMexicoMalaisiaMosambicNamibiaNova Caledoni" + - "aNigerInsla NorfolkNigeriaNicaraguaPajais BassNorvegiaNepalNauruNiue" + - "Nova ZelandaOmanPanamaPeruPolinesia FranzosaPapua Nova GuineaFilippi" + - "nasPakistanPolognaSaint Pierre e MiquelonPitcairnPuerto RicoTerritor" + - "i PalestinaisPortugalPalauParaguaiKatarOceania PerifericaRéunionRume" + - "niaSerbiaRussiaRuandaArabia SauditaSalomonasSeychellasSudanSveziaSin" + - "gapurSontg’ElenaSloveniaSvalbard e Jan MayenSlovachiaSierra LeoneSan" + - " MarinoSenegalSomaliaSurinamSão Tomé e PrincipeEl SalvadorSiriaSwazi" + - "landInslas Turks e CaicosTschadTerritoris Franzos MeridiunalsTogoTai" + - "landaTadschikistanTokelauTimor da l’OstTurkmenistanTunesiaTongaTirch" + - "iaTrinidad e TobagoTuvaluTaiwanTansaniaUcrainaUgandaInslas pitschnas" + - " perifericas dals Stadis Unids da l’AmericaStadis Unids da l’America" + - "UruguayUsbekistanCitad dal VaticanSaint Vincent e las GrenadinasVene" + - "zuelaInslas Verginas BritannicasInslas Verginas AmericanasVietnamVan" + - "uatuWallis e FutunaSamoaJemenMayotteAfrica dal SidSambiaSimbabweRegi" + - "un betg encouschenta u nunvalaivlamundAfricaAmerica dal NordAmerica " + - "dal SidOceaniaAfrica dal VestAmerica CentralaAfrica da l’OstAfrica d" + - "al NordAfrica CentralaAfrica MeridiunalaAmerica dal Nord, America Ce" + - "ntrala ed America dal SidCaribicaAsia da l’OstAsia dal SidAsia dal S" + - "idostEuropa dal SidAustralia e Nova ZelandaMelanesiaRegiun Micronesi" + - "caPolinesiaAsiaAsia CentralaAsia dal VestEuropaEuropa OrientalaEurop" + - "a dal NordEuropa dal VestAmerica Latina", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x001a, 0x0025, 0x0036, 0x003e, 0x0045, - 0x004c, 0x0052, 0x005c, 0x0066, 0x0075, 0x007c, 0x0085, 0x008a, - 0x0096, 0x00a3, 0x00b7, 0x00bf, 0x00ca, 0x00d0, 0x00dc, 0x00e4, - 0x00eb, 0x00f2, 0x00f7, 0x0106, 0x010e, 0x0114, 0x011b, 0x011b, - 0x0122, 0x0129, 0x012f, 0x013b, 0x0143, 0x014e, 0x0154, 0x015a, - 0x0166, 0x0185, 0x019e, 0x01a3, 0x01a9, 0x01b7, 0x01c2, 0x01c7, - 0x01ce, 0x01d3, 0x01db, 0x01db, 0x01e5, 0x01e9, 0x01f1, 0x01f1, - 0x0203, 0x0208, 0x0219, 0x0221, 0x0221, 0x022a, 0x0232, 0x023a, - // Entry 40 - 7F - 0x024e, 0x0255, 0x0255, 0x025c, 0x0263, 0x0269, 0x027b, 0x0282, - 0x0288, 0x028f, 0x029e, 0x029e, 0x02a6, 0x02ad, 0x02c0, 0x02ca, - 0x02d6, 0x02df, 0x02e4, 0x02f2, 0x02f9, 0x0300, 0x030f, 0x0317, - 0x031c, 0x0325, 0x032f, 0x0335, 0x033b, 0x0345, 0x0357, 0x035d, - 0x038a, 0x0393, 0x0397, 0x03a4, 0x03aa, 0x03df, 0x03fc, 0x0404, - 0x040b, 0x0410, 0x0417, 0x0417, 0x0420, 0x0427, 0x042d, 0x0439, - 0x043e, 0x0464, 0x0468, 0x046c, 0x0473, 0x0479, 0x047f, 0x0487, - 0x048f, 0x0495, 0x049a, 0x04a6, 0x04b0, 0x04b8, 0x04bf, 0x04d2, - // Entry 80 - BF - 0x04e0, 0x04ed, 0x04f3, 0x0500, 0x050a, 0x050e, 0x0515, 0x0520, - 0x052d, 0x0536, 0x053d, 0x0544, 0x054c, 0x0555, 0x055d, 0x0562, - 0x0567, 0x056d, 0x0575, 0x057f, 0x058b, 0x0595, 0x05a7, 0x05b0, - 0x05b4, 0x05bb, 0x05c3, 0x05f2, 0x060b, 0x0615, 0x061f, 0x0629, - 0x062e, 0x0637, 0x063f, 0x0645, 0x064b, 0x0653, 0x065b, 0x0662, - 0x0670, 0x0675, 0x0682, 0x0689, 0x0692, 0x069d, 0x06a5, 0x06aa, - 0x06af, 0x06b3, 0x06bf, 0x06c3, 0x06c9, 0x06cd, 0x06df, 0x06f0, - 0x06fa, 0x0702, 0x0709, 0x0720, 0x0728, 0x0733, 0x0748, 0x0750, - // Entry C0 - FF - 0x0755, 0x075d, 0x0762, 0x0774, 0x077c, 0x0783, 0x0789, 0x078f, - 0x0795, 0x07a3, 0x07ac, 0x07b6, 0x07bb, 0x07c1, 0x07c9, 0x07d6, - 0x07de, 0x07f2, 0x07fb, 0x0807, 0x0811, 0x0818, 0x081f, 0x0826, - 0x0826, 0x083b, 0x0846, 0x0846, 0x084b, 0x0854, 0x0854, 0x0869, - 0x086f, 0x088d, 0x0891, 0x0899, 0x08a6, 0x08ad, 0x08bd, 0x08c9, - 0x08d0, 0x08d5, 0x08dc, 0x08ed, 0x08f3, 0x08f9, 0x0901, 0x0908, - 0x090e, 0x094b, 0x094b, 0x0966, 0x096d, 0x0977, 0x0988, 0x09a6, - 0x09af, 0x09ca, 0x09e4, 0x09eb, 0x09f2, 0x0a01, 0x0a06, 0x0a06, - // Entry 100 - 13F - 0x0a0b, 0x0a12, 0x0a20, 0x0a26, 0x0a2e, 0x0a54, 0x0a58, 0x0a5e, - 0x0a6e, 0x0a7d, 0x0a84, 0x0a93, 0x0aa3, 0x0ab4, 0x0ac3, 0x0ad2, - 0x0ae4, 0x0b19, 0x0b19, 0x0b21, 0x0b30, 0x0b3c, 0x0b4b, 0x0b59, - 0x0b71, 0x0b7a, 0x0b8c, 0x0b95, 0x0b99, 0x0ba6, 0x0bb3, 0x0bb9, - 0x0bc9, 0x0bd8, 0x0be7, 0x0bf5, - }, - }, - { // rn - "AndoraLeta Zunze Ubumwe z’AbarabuAfuganisitaniAntigwa na BaribudaAngwila" + - "AlubaniyaArumeniyaAngolaArijantineSamowa nyamerikaOtirisheOsitaraliy" + - "aArubaAzerubayijaniBosiniya na HerigozevineBarubadosiBangaladeshiUbu" + - "biligiBurukina FasoBuligariyaBahareyiniUburundiBeneBerimudaBuruneyiB" + - "oliviyaBureziliBahamasiButaniBotswanaBelausiBelizeKanadaRepubulika I" + - "haranira Demokarasi ya KongoRepubulika ya SantarafurikaKongoUbusuwis" + - "iKotedivuwareIzinga rya KukuShiliKameruniUbushinwaKolombiyaKositarik" + - "aKibaIbirwa bya KapuveriIzinga rya ShipureRepubulika ya CekeUbudageJ" + - "ibutiDanimarikiDominikaRepubulika ya DominikaAlijeriyaEkwateriEsiton" + - "iyaMisiriElitereyaHisipaniyaEtiyopiyaFinilandiFijiIzinga rya Filikil" + - "andiMikoroniziyaUbufaransaGaboUbwongerezaGerenadaJeworujiyaGwayana y" + - "’AbafaransaGanaJuburalitariGurunilandiGambiyaGuneyaGwadelupeGineya" + - " EkwatoriyaliUbugerekiGwatemalaGwamuGineya BisawuGuyaneHondurasiKoro" + - "wasiyaHayitiHungariyaIndoneziyaIrilandiIsiraheliUbuhindiIntara y’Ubw" + - "ongereza yo mu birwa by’AbahindiIrakiIraniAyisilandiUbutaliyaniJamay" + - "ikaYorudaniyaUbuyapaniKenyaKirigisitaniKambojeKiribatiIzinga rya Kom" + - "oreSekitsi na NevisiKoreya y’amajaruguruKoreya y’amajepfoKowetiIbirw" + - "a bya KeyimaniKazakisitaniLayosiLibaniSelusiyaLishyitenshitayiniSiri" + - "lankaLiberiyaLesotoLituwaniyaLukusamburuLativaLibiyaMarokeMonakoMolu" + - "daviMadagasikariIzinga rya MarishariMasedoniyaMaliBirimaniyaMongoliy" + - "aAmazinga ya Mariyana ryo mu majaruguruMaritinikiMoritaniyaMontesera" + - "tiMalitaIzinga rya MoriseMoludaveMalawiMigizikeMaleziyaMozambikiNami" + - "biyaNiyukaledoniyaNijeriizinga rya NorufolukeNijeriyaNikaragwaUbuhol" + - "andiNoruvejiNepaliNawuruNiyuweNuvelizelandiOmaniPanamaPeruPolineziya" + - " y’AbafaransaPapuwa NiyugineyaAmazinga ya FilipinePakisitaniPolonyeS" + - "empiyeri na MikeloniPitikeyiriniPuwetorikoPalesitina Wesitibanka na " + - "GazaPorutugaliPalawuParagweKatariAmazinga ya ReyiniyoRumaniyaUburusi" + - "yau RwandaArabiya SawuditeAmazinga ya SalumoniAmazinga ya SeyisheliS" + - "udaniSuwediSingapuruSeheleneSiloveniyaSilovakiyaSiyeralewoneSanimari" + - "noSenegaliSomaliyaSurinameSawotome na PerensipeEli SaluvatoriSiriyaS" + - "uwazilandiAmazinga ya Turkisi na CayikosiCadiTogoTayilandiTajikisita" + - "niTokelawuTimoru y’iburasirazubaTurukumenisitaniTuniziyaTongaTurukiy" + - "aTirinidadi na TobagoTuvaluTayiwaniTanzaniyaIkereneUbugandeLeta Zunz" + - "e Ubumwe za AmerikaIrigweUzubekisitaniUmurwa wa VatikaniSevensa na G" + - "erenadineVenezuwelaIbirwa by’isugi by’AbongerezaAmazinga y’Isugi y’A" + - "banyamerikaViyetinamuVanuwatuWalisi na FutunaSamowaYemeniMayoteAfuri" + - "ka y’EpfoZambiyaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0023, 0x0030, 0x0043, 0x004a, 0x0053, - 0x005c, 0x0062, 0x0062, 0x006c, 0x007c, 0x0084, 0x008f, 0x0094, - 0x0094, 0x00a1, 0x00b9, 0x00c3, 0x00cf, 0x00d8, 0x00e5, 0x00ef, - 0x00f9, 0x0101, 0x0105, 0x0105, 0x010d, 0x0115, 0x011d, 0x011d, - 0x0125, 0x012d, 0x0133, 0x0133, 0x013b, 0x0142, 0x0148, 0x014e, - 0x014e, 0x0176, 0x0191, 0x0196, 0x019f, 0x01ab, 0x01ba, 0x01bf, - 0x01c7, 0x01d0, 0x01d9, 0x01d9, 0x01e3, 0x01e7, 0x01fa, 0x01fa, - 0x01fa, 0x020c, 0x021e, 0x0225, 0x0225, 0x022b, 0x0235, 0x023d, - // Entry 40 - 7F - 0x0253, 0x025c, 0x025c, 0x0264, 0x026d, 0x0273, 0x0273, 0x027c, - 0x0286, 0x028f, 0x028f, 0x028f, 0x0298, 0x029c, 0x02b2, 0x02be, - 0x02be, 0x02c8, 0x02cc, 0x02d7, 0x02df, 0x02e9, 0x02ff, 0x02ff, - 0x0303, 0x030f, 0x031a, 0x0321, 0x0327, 0x0330, 0x0343, 0x034c, - 0x034c, 0x0355, 0x035a, 0x0367, 0x036d, 0x036d, 0x036d, 0x0376, - 0x0380, 0x0386, 0x038f, 0x038f, 0x0399, 0x03a1, 0x03aa, 0x03aa, - 0x03b2, 0x03e2, 0x03e7, 0x03ec, 0x03f6, 0x0401, 0x0401, 0x0409, - 0x0413, 0x041c, 0x0421, 0x042d, 0x0434, 0x043c, 0x044d, 0x045e, - // Entry 80 - BF - 0x0474, 0x0487, 0x048d, 0x04a0, 0x04ac, 0x04b2, 0x04b8, 0x04c0, - 0x04d2, 0x04db, 0x04e3, 0x04e9, 0x04f3, 0x04fe, 0x0504, 0x050a, - 0x0510, 0x0516, 0x051e, 0x051e, 0x051e, 0x052a, 0x053e, 0x0548, - 0x054c, 0x0556, 0x055f, 0x055f, 0x0585, 0x058f, 0x0599, 0x05a4, - 0x05aa, 0x05bb, 0x05c3, 0x05c9, 0x05d1, 0x05d9, 0x05e2, 0x05ea, - 0x05f8, 0x05fe, 0x0613, 0x061b, 0x0624, 0x062e, 0x0636, 0x063c, - 0x0642, 0x0648, 0x0655, 0x065a, 0x0660, 0x0664, 0x067d, 0x068e, - 0x06a2, 0x06ac, 0x06b3, 0x06c8, 0x06d4, 0x06de, 0x06fc, 0x0706, - // Entry C0 - FF - 0x070c, 0x0713, 0x0719, 0x0719, 0x072d, 0x0735, 0x0735, 0x073e, - 0x0746, 0x0756, 0x076a, 0x077f, 0x0785, 0x078b, 0x0794, 0x079c, - 0x07a6, 0x07a6, 0x07b0, 0x07bc, 0x07c6, 0x07ce, 0x07d6, 0x07de, - 0x07de, 0x07f3, 0x0801, 0x0801, 0x0807, 0x0812, 0x0812, 0x0831, - 0x0835, 0x0835, 0x0839, 0x0842, 0x084e, 0x0856, 0x086e, 0x087e, - 0x0886, 0x088b, 0x0893, 0x08a7, 0x08ad, 0x08b5, 0x08be, 0x08c5, - 0x08cd, 0x08cd, 0x08cd, 0x08e9, 0x08ef, 0x08fc, 0x090e, 0x0923, - 0x092d, 0x094e, 0x0971, 0x097b, 0x0983, 0x0993, 0x0999, 0x0999, - // Entry 100 - 13F - 0x099f, 0x09a5, 0x09b5, 0x09bc, 0x09c4, - }, - }, - { // ro - roRegionStr, - roRegionIdx, - }, - { // ro-MD - "Myanmar", - []uint16{ // 154 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0007, - }, - }, - { // rof - "AndoroFalme za KiarabuAfuganistaniAntigua na BabudaAnguilaAlbaniaAmeniaA" + - "ngoloAjentinaSamoa ya MarekaniOstriaAustraliaArubaAzabajaniBosnia na" + - " HezegovinaBabadoBangladeshiUbelgijiBukinafasoBulgariaBahareniBurund" + - "iBeniniBermudaBruneiBoliviaBraziliBahamasiButaniBotswanaBelarusiBeli" + - "zeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya KatiKon" + - "goUswisiKodivaaVisiwa vya CookChileKameruniChinaKolombiaKostarikaKub" + - "aKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominikaJamhur" + - "i ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshiUfiniFi" + - "jiVisiwa vya FalklandMikronesiaUfaransaGaboniUingerezaGrenadaJojiaGw" + - "iyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGinekwetaU" + - "girikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungariaIndon" + - "esiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiIrakiUa" + - "jemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigizistaniKambodiaKiri" + - "batiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaitiVisiw" + - "a vya KaimaiKazakistaniLaosiLebanoniSantalusiaLishenteniSirilankaLib" + - "eriaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBukiniVisi" + - "wa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya Kaska" + - "ziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksikoMales" + - "iaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNikaragwa" + - "UholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia ya Uf" + - "aransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitkairniPw" + - "etorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUrenoPalauP" + - "aragwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya SolomonSheli" + - "sheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera LeoniSamar" + - "inoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswaziVis" + - "iwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori ya M" + - "asharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuvaluTa" + - "iwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibekistaniVatikaniSantavi" + - "senti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa vya" + - " Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMayott" + - "eAfrika KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0033, 0x003a, 0x0041, - 0x0047, 0x004d, 0x004d, 0x0055, 0x0066, 0x006c, 0x0075, 0x007a, - 0x007a, 0x0083, 0x0097, 0x009d, 0x00a8, 0x00b0, 0x00ba, 0x00c2, - 0x00ca, 0x00d1, 0x00d7, 0x00d7, 0x00de, 0x00e4, 0x00eb, 0x00eb, - 0x00f2, 0x00fa, 0x0100, 0x0100, 0x0108, 0x0110, 0x0116, 0x011c, - 0x011c, 0x013c, 0x0155, 0x015a, 0x0160, 0x0167, 0x0176, 0x017b, - 0x0183, 0x0188, 0x0190, 0x0190, 0x0199, 0x019d, 0x01a5, 0x01a5, - 0x01a5, 0x01ac, 0x01bc, 0x01c5, 0x01c5, 0x01cb, 0x01d2, 0x01da, - // Entry 40 - 7F - 0x01ed, 0x01f4, 0x01f4, 0x01fa, 0x0201, 0x0206, 0x0206, 0x020d, - 0x0215, 0x021d, 0x021d, 0x021d, 0x0222, 0x0226, 0x0239, 0x0243, - 0x0243, 0x024b, 0x0251, 0x025a, 0x0261, 0x0266, 0x0279, 0x0279, - 0x027e, 0x0286, 0x028f, 0x0295, 0x0299, 0x02a2, 0x02ab, 0x02b2, - 0x02b2, 0x02bb, 0x02bf, 0x02c8, 0x02ce, 0x02ce, 0x02ce, 0x02d7, - 0x02de, 0x02e3, 0x02eb, 0x02eb, 0x02f4, 0x02fc, 0x0303, 0x0303, - 0x0308, 0x032d, 0x0332, 0x0338, 0x0340, 0x0346, 0x0346, 0x034d, - 0x0354, 0x035a, 0x035f, 0x036c, 0x0374, 0x037c, 0x0382, 0x0395, - // Entry 80 - BF - 0x03a4, 0x03b0, 0x03b7, 0x03c8, 0x03d3, 0x03d8, 0x03e0, 0x03ea, - 0x03f4, 0x03fd, 0x0404, 0x040a, 0x0412, 0x041b, 0x0422, 0x0427, - 0x042d, 0x0433, 0x043a, 0x043a, 0x043a, 0x0440, 0x0452, 0x045b, - 0x045f, 0x0464, 0x046c, 0x046c, 0x048c, 0x0495, 0x049e, 0x04a9, - 0x04ae, 0x04b4, 0x04ba, 0x04c0, 0x04c7, 0x04ce, 0x04d6, 0x04dd, - 0x04e9, 0x04ef, 0x0500, 0x0507, 0x0510, 0x0518, 0x051d, 0x0523, - 0x0528, 0x052c, 0x0536, 0x053b, 0x0541, 0x0545, 0x055a, 0x055f, - 0x0567, 0x0570, 0x0577, 0x058d, 0x0596, 0x059f, 0x05d1, 0x05d6, - // Entry C0 - FF - 0x05db, 0x05e3, 0x05e9, 0x05e9, 0x05f2, 0x05f9, 0x05f9, 0x05fe, - 0x0604, 0x0609, 0x061b, 0x0625, 0x062b, 0x0631, 0x0639, 0x0644, - 0x064c, 0x064c, 0x0654, 0x065f, 0x0667, 0x066f, 0x0676, 0x067e, - 0x067e, 0x0692, 0x069a, 0x069a, 0x069f, 0x06a5, 0x06a5, 0x06be, - 0x06c3, 0x06c3, 0x06c7, 0x06cf, 0x06da, 0x06e1, 0x06f4, 0x0703, - 0x070a, 0x070f, 0x0716, 0x0728, 0x072e, 0x0735, 0x073d, 0x0744, - 0x074a, 0x074a, 0x074a, 0x0752, 0x0759, 0x0765, 0x076d, 0x0786, - 0x078f, 0x07ae, 0x07cc, 0x07d5, 0x07dc, 0x07eb, 0x07f0, 0x07f0, - // Entry 100 - 13F - 0x07f6, 0x07fd, 0x080a, 0x0810, 0x0818, - }, - }, - { // ru - ruRegionStr, - ruRegionIdx, - }, - { // ru-UA - "О-в ВознесенияОбъединенные Арабские ЭмиратыО-в БувеЦентрально-Африканска" + - "я РеспубликаО-ва КукаО-в КлиппертонО-в РождестваО-ва Херд и Макдона" + - "льдО-в НорфолкТимор-ЛестеМалые Тихоокеанские Отдаленные Острова США", - []uint16{ // 242 elements - // Entry 0 - 3F - 0x0000, 0x001a, 0x001a, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, - 0x0052, 0x0052, 0x0052, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, - 0x0060, 0x0060, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00b0, 0x00b0, - 0x00b0, 0x00b0, 0x00b0, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, - 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, - // Entry 40 - 7F - 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, - 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, - 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, - 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, - 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x010a, 0x010a, - 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, - 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, - 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, - // Entry 80 - BF - 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, - 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, - 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, - 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, - 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, - 0x010a, 0x010a, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, - 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, - 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, - // Entry C0 - FF - 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, - 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, - 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, - 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, - 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x0133, 0x0133, - 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, - 0x0133, 0x0183, - }, - }, - { // rw - "RwandaIgitonga", - []uint16{ // 234 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry 80 - BF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // Entry C0 - FF - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, - 0x0006, 0x000e, - }, - }, - { // rwk - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa ya MarekaniAustriaAustraliaArubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareni" + - "BurundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarusi" + - "BelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya Kat" + - "iKongoUswisiKodivaaVisiwa vya CookChileKameruniChinaKolombiaKostarik" + - "aKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominikaJa" + - "mhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshiUfi" + - "niFijiVisiwa vya FalklandMikronesiaUfaransaGaboniUingerezaGrenadaJoj" + - "iaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGinekw" + - "etaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungariaI" + - "ndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiIra" + - "kiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigizistaniKambodia" + - "KiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaitiV" + - "isiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSirilank" + - "aLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBukini" + - "Visiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya K" + - "askaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksikoM" + - "alesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNikar" + - "agwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia y" + - "a UfaransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitkair" + - "niPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUrenoPa" + - "lauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya SolomonS" + - "helisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera LeoniS" + - "amarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswaz" + - "iVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori " + - "ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuva" + - "luTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibekistaniVatikaniSan" + - "tavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa" + - " vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMa" + - "yotteAfrika KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00b6, 0x00c0, 0x00c8, - 0x00d0, 0x00d7, 0x00dd, 0x00dd, 0x00e4, 0x00ea, 0x00f1, 0x00f1, - 0x00f8, 0x00fe, 0x0104, 0x0104, 0x010c, 0x0114, 0x011a, 0x0120, - 0x0120, 0x0140, 0x0159, 0x015e, 0x0164, 0x016b, 0x017a, 0x017f, - 0x0187, 0x018c, 0x0194, 0x0194, 0x019d, 0x01a1, 0x01a9, 0x01a9, - 0x01a9, 0x01b0, 0x01c0, 0x01c9, 0x01c9, 0x01cf, 0x01d6, 0x01de, - // Entry 40 - 7F - 0x01f1, 0x01f8, 0x01f8, 0x01fe, 0x0205, 0x020a, 0x020a, 0x0211, - 0x0219, 0x0221, 0x0221, 0x0221, 0x0226, 0x022a, 0x023d, 0x0247, - 0x0247, 0x024f, 0x0255, 0x025e, 0x0265, 0x026a, 0x027d, 0x027d, - 0x0282, 0x028a, 0x0293, 0x0299, 0x029d, 0x02a6, 0x02af, 0x02b6, - 0x02b6, 0x02bf, 0x02c3, 0x02cc, 0x02d2, 0x02d2, 0x02d2, 0x02db, - 0x02e2, 0x02e7, 0x02ef, 0x02ef, 0x02f8, 0x0300, 0x0307, 0x0307, - 0x030c, 0x0331, 0x0336, 0x033c, 0x0344, 0x034a, 0x034a, 0x0351, - 0x0358, 0x035e, 0x0363, 0x0370, 0x0378, 0x0380, 0x0386, 0x0399, - // Entry 80 - BF - 0x03a8, 0x03b4, 0x03bb, 0x03cc, 0x03d7, 0x03dc, 0x03e4, 0x03ee, - 0x03f8, 0x0401, 0x0408, 0x040e, 0x0416, 0x041f, 0x0426, 0x042b, - 0x0431, 0x0437, 0x043e, 0x043e, 0x043e, 0x0444, 0x0456, 0x045f, - 0x0463, 0x0468, 0x0470, 0x0470, 0x0490, 0x0499, 0x04a2, 0x04ad, - 0x04b2, 0x04b8, 0x04be, 0x04c4, 0x04cb, 0x04d2, 0x04da, 0x04e1, - 0x04ed, 0x04f3, 0x0504, 0x050b, 0x0514, 0x051c, 0x0521, 0x0527, - 0x052c, 0x0530, 0x053a, 0x053f, 0x0545, 0x0549, 0x055e, 0x0563, - 0x056b, 0x0574, 0x057b, 0x0591, 0x059a, 0x05a3, 0x05d5, 0x05da, - // Entry C0 - FF - 0x05df, 0x05e7, 0x05ed, 0x05ed, 0x05f6, 0x05fd, 0x05fd, 0x0602, - 0x0608, 0x060d, 0x061f, 0x0629, 0x062f, 0x0635, 0x063d, 0x0648, - 0x0650, 0x0650, 0x0658, 0x0663, 0x066b, 0x0673, 0x067a, 0x0682, - 0x0682, 0x0696, 0x069e, 0x069e, 0x06a3, 0x06a9, 0x06a9, 0x06c2, - 0x06c7, 0x06c7, 0x06cb, 0x06d3, 0x06de, 0x06e5, 0x06f8, 0x0707, - 0x070e, 0x0713, 0x071a, 0x072c, 0x0732, 0x0739, 0x0741, 0x0748, - 0x074e, 0x074e, 0x074e, 0x0756, 0x075d, 0x0769, 0x0771, 0x078a, - 0x0793, 0x07b2, 0x07d0, 0x07d9, 0x07e0, 0x07ef, 0x07f4, 0x07f4, - // Entry 100 - 13F - 0x07fa, 0x0801, 0x080e, 0x0814, 0x081c, - }, - }, - { // sah - "БразилияКанаадаЧиилиКытайКуубаЭстонияФинляндияУлуу БританияИрландияМэн а" + - "рыыИсландияДьамаайкаЛитваЛатвияЛиибийэМиэксикэНорвегияАрассыыйаСуда" + - "анШвецияАмерика Холбоһуктаах ШтааттараАан дойдуАапырыкаХотугу Эмиэр" + - "икэСоҕуруу Эмиэрикэ", - []uint16{ // 266 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x001e, - 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0028, - 0x0028, 0x0032, 0x0032, 0x0032, 0x0032, 0x003c, 0x003c, 0x003c, - 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, - // Entry 40 - 7F - 0x003c, 0x003c, 0x003c, 0x003c, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, - 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0085, 0x0085, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x00a4, 0x00a4, 0x00a4, 0x00b6, - 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, - // Entry 80 - BF - 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, - 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00c0, 0x00c0, 0x00cc, 0x00da, - 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, - 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, - 0x00da, 0x00da, 0x00da, 0x00da, 0x00ea, 0x00ea, 0x00ea, 0x00ea, - 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00fa, 0x00fa, - 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, - 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, - // Entry C0 - FF - 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x0118, 0x0124, 0x0124, 0x0124, - 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, - 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, - 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, - 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, - 0x0124, 0x0124, 0x0124, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, - 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, - // Entry 100 - 13F - 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x016f, 0x017f, - 0x019c, 0x01bb, - }, - }, - { // saq - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa ya MarekaniAustriaAustraliaArubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareni" + - "BurundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarusi" + - "BelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya Kat" + - "iKongoUswisiKodivaaVisiwa vya CookChileKameruniChinaKolombiaKostarik" + - "aKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominikaJa" + - "mhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshiUfi" + - "niFijiVisiwa vya FalklandMikronesiaUfaransaGaboniUingerezaGrenadaJoj" + - "iaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGinekw" + - "etaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungariaI" + - "ndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiIra" + - "kiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigizistaniKambodia" + - "KiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaitiV" + - "isiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSirilank" + - "aLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBukini" + - "Visiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya K" + - "askaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksikoM" + - "alesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNikar" + - "agwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia y" + - "a UfaransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitkair" + - "niPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUrenoPa" + - "lauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya SolomonS" + - "helisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera LeoniS" + - "amarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswaz" + - "iVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori " + - "ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuva" + - "luTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibekistaniVatikaniSan" + - "tavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa" + - " vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMa" + - "yotteAfrika KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00b6, 0x00c0, 0x00c8, - 0x00d0, 0x00d7, 0x00dd, 0x00dd, 0x00e4, 0x00ea, 0x00f1, 0x00f1, - 0x00f8, 0x00fe, 0x0104, 0x0104, 0x010c, 0x0114, 0x011a, 0x0120, - 0x0120, 0x0140, 0x0159, 0x015e, 0x0164, 0x016b, 0x017a, 0x017f, - 0x0187, 0x018c, 0x0194, 0x0194, 0x019d, 0x01a1, 0x01a9, 0x01a9, - 0x01a9, 0x01b0, 0x01c0, 0x01c9, 0x01c9, 0x01cf, 0x01d6, 0x01de, - // Entry 40 - 7F - 0x01f1, 0x01f8, 0x01f8, 0x01fe, 0x0205, 0x020a, 0x020a, 0x0211, - 0x0219, 0x0221, 0x0221, 0x0221, 0x0226, 0x022a, 0x023d, 0x0247, - 0x0247, 0x024f, 0x0255, 0x025e, 0x0265, 0x026a, 0x027d, 0x027d, - 0x0282, 0x028a, 0x0293, 0x0299, 0x029d, 0x02a6, 0x02af, 0x02b6, - 0x02b6, 0x02bf, 0x02c3, 0x02cc, 0x02d2, 0x02d2, 0x02d2, 0x02db, - 0x02e2, 0x02e7, 0x02ef, 0x02ef, 0x02f8, 0x0300, 0x0307, 0x0307, - 0x030c, 0x0331, 0x0336, 0x033c, 0x0344, 0x034a, 0x034a, 0x0351, - 0x0358, 0x035e, 0x0363, 0x0370, 0x0378, 0x0380, 0x0386, 0x0399, - // Entry 80 - BF - 0x03a8, 0x03b4, 0x03bb, 0x03cc, 0x03d7, 0x03dc, 0x03e4, 0x03ee, - 0x03f8, 0x0401, 0x0408, 0x040e, 0x0416, 0x041f, 0x0426, 0x042b, - 0x0431, 0x0437, 0x043e, 0x043e, 0x043e, 0x0444, 0x0456, 0x045f, - 0x0463, 0x0468, 0x0470, 0x0470, 0x0490, 0x0499, 0x04a2, 0x04ad, - 0x04b2, 0x04b8, 0x04be, 0x04c4, 0x04cb, 0x04d2, 0x04da, 0x04e1, - 0x04ed, 0x04f3, 0x0504, 0x050b, 0x0514, 0x051c, 0x0521, 0x0527, - 0x052c, 0x0530, 0x053a, 0x053f, 0x0545, 0x0549, 0x055e, 0x0563, - 0x056b, 0x0574, 0x057b, 0x0591, 0x059a, 0x05a3, 0x05d5, 0x05da, - // Entry C0 - FF - 0x05df, 0x05e7, 0x05ed, 0x05ed, 0x05f6, 0x05fd, 0x05fd, 0x0602, - 0x0608, 0x060d, 0x061f, 0x0629, 0x062f, 0x0635, 0x063d, 0x0648, - 0x0650, 0x0650, 0x0658, 0x0663, 0x066b, 0x0673, 0x067a, 0x0682, - 0x0682, 0x0696, 0x069e, 0x069e, 0x06a3, 0x06a9, 0x06a9, 0x06c2, - 0x06c7, 0x06c7, 0x06cb, 0x06d3, 0x06de, 0x06e5, 0x06f8, 0x0707, - 0x070e, 0x0713, 0x071a, 0x072c, 0x0732, 0x0739, 0x0741, 0x0748, - 0x074e, 0x074e, 0x074e, 0x0756, 0x075d, 0x0769, 0x0771, 0x078a, - 0x0793, 0x07b2, 0x07d0, 0x07d9, 0x07e0, 0x07ef, 0x07f4, 0x07f4, - // Entry 100 - 13F - 0x07fa, 0x0801, 0x080e, 0x0814, 0x081c, - }, - }, - { // sbp - "AndolaWutwa wa shiyalabuAfuganisitaniAnitiguya ni BalubudaAnguillaAluban" + - "iyaAlimeniyaAngolaAjentinaSamoya ya MalekaniAwusitiliyaAwusitilaliya" + - "AlubaAsabajaniBosiniya ni HesegovinaBabadosiBangiladeshiUbeligijiBuk" + - "inafasoBuligaliyaBahaleniBulundiBeniniBelimudaBuluneyiBoliviyaBulasi" + - "liBahamaButaniBotiswanaBelalusiBeliseKanadaJamuhuli ya Kidemokilasiy" + - "a ya KongoJamuhuli ya Afilika ya PakhatiKongoUswisiKodivayaFigunguli" + - " fya KookiShileKameruniShinaKolombiyaKositalikaKubaKepuvedeKupilosiJ" + - "amuhuli ya ShekiWujelumaniJibutiDenimakiDominikaJamuhuli ya Dominika" + - "AlijeliyaEkwadoEsitoniyaMisiliElitileyaHisipaniyaUhabeshiWufiniFijiF" + - "igunguli fya FokolendiMikilonesiyaWufalansaGaboniUwingelesaGilenadaJ" + - "ojiyaGwiyana ya WufalansaKhanaJibulalitaGilinilandiGambiyaGineGwadel" + - "upeGinekwetaWugilikiGwatemalaGwamuGinebisawuGuyanaHondulasiKolasiyaH" + - "ayitiHungaliyaIndonesiyaAyalandiIsilaeliIndiyaUluvala lwa Uwingelesa" + - " ku Bahali ya HindiIlakiUwajemiAyisilendiItaliyaJamaikaYolodaniJapan" + - "iKenyaKiligisisitaniKambodiyaKilibatiKomoloSantakitisi ni NevisiKole" + - "ya ya luvala lwa KunyamandeKoleya ya KusiniKuwaitiFigunguli ifya Kay" + - "imayiKasakisitaniLayosiLebanoniSantalusiyaLisheniteniSililankaLibeli" + - "yaLesotoLitwaniyaLasembagiLativiyaLibiyaMolokoMonakoMolidovaBukiniFi" + - "gunguli ifya MalishaliMasedoniyaMaliMuyamaMongoliyaFigunguli fya Mal" + - "iyana ifya luvala lwa KunyamandeMalitinikiMolitaniyaMonitiselatiMali" + - "taMolisiModivuMalawiMekisikoMalesiyaMusumbijiNamibiyaNyukaledoniyaNi" + - "jeliShigunguli sha NolifokiNijeliyaNikalagwaWuholansiNolweNepaliNawu" + - "luNiwueNyusilendiOmaniPanamaPeluPolinesiya ya WufalansaPapuwaFilipin" + - "oPakisitaniPolandiSantapieli ni MikeloniPitikailiniPwetolikoMunjema " + - "gwa Kusikha nu Luvala lwa Gasa lwa PalesitWulenoPalawuPalagwayiKatal" + - "iLiyunioniLomaniyaWulusiLwandaSawudiFigunguli fya SolomoniShelisheli" + - "SudaniUswidiSingapooSantahelenaSiloveniyaSilovakiyaSiela LiyoniSamal" + - "inoSenegaliSomaliyaSulinamuSayo Tome ni PilinikipeElisavadoSiliyaUsw" + - "asiFigunguli fya Tuliki ni KaikoShadiTogoTailandiTajikisitaniTokelaw" + - "uTimoli ya kunenaTulukimenisitaniTunisiyaTongaUtulukiTilinidadi ni T" + - "obagoTuvaluTaiwaniTansaniyaYukileiniUgandaMalekaniUlugwayiUsibekisit" + - "aniVatikaniSantavisenti na GilenadiniVenesuelaFigunguli ifya Viligin" + - "iya ifya UwingelesaFigunguli fya Viliginiya ifya MalekaniVietinamuVa" + - "nuatuWalisi ni FutunaSamoyaYemeniMayoteAfilika KusiniSambiyaSimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0018, 0x0025, 0x003a, 0x0042, 0x004b, - 0x0054, 0x005a, 0x005a, 0x0062, 0x0074, 0x007f, 0x008c, 0x0091, - 0x0091, 0x009a, 0x00b0, 0x00b8, 0x00c4, 0x00cd, 0x00d7, 0x00e1, - 0x00e9, 0x00f0, 0x00f6, 0x00f6, 0x00fe, 0x0106, 0x010e, 0x010e, - 0x0116, 0x011c, 0x0122, 0x0122, 0x012b, 0x0133, 0x0139, 0x013f, - 0x013f, 0x0162, 0x0180, 0x0185, 0x018b, 0x0193, 0x01a6, 0x01ab, - 0x01b3, 0x01b8, 0x01c1, 0x01c1, 0x01cb, 0x01cf, 0x01d7, 0x01d7, - 0x01d7, 0x01df, 0x01f0, 0x01fa, 0x01fa, 0x0200, 0x0208, 0x0210, - // Entry 40 - 7F - 0x0224, 0x022d, 0x022d, 0x0233, 0x023c, 0x0242, 0x0242, 0x024b, - 0x0255, 0x025d, 0x025d, 0x025d, 0x0263, 0x0267, 0x027e, 0x028a, - 0x028a, 0x0293, 0x0299, 0x02a3, 0x02ab, 0x02b1, 0x02c5, 0x02c5, - 0x02ca, 0x02d4, 0x02df, 0x02e6, 0x02ea, 0x02f3, 0x02fc, 0x0304, - 0x0304, 0x030d, 0x0312, 0x031c, 0x0322, 0x0322, 0x0322, 0x032b, - 0x0333, 0x0339, 0x0342, 0x0342, 0x034c, 0x0354, 0x035c, 0x035c, - 0x0362, 0x038b, 0x0390, 0x0397, 0x03a1, 0x03a8, 0x03a8, 0x03af, - 0x03b7, 0x03bd, 0x03c2, 0x03d0, 0x03d9, 0x03e1, 0x03e7, 0x03fc, - // Entry 80 - BF - 0x041b, 0x042b, 0x0432, 0x0449, 0x0455, 0x045b, 0x0463, 0x046e, - 0x0479, 0x0482, 0x048a, 0x0490, 0x0499, 0x04a2, 0x04aa, 0x04b0, - 0x04b6, 0x04bc, 0x04c4, 0x04c4, 0x04c4, 0x04ca, 0x04e2, 0x04ec, - 0x04f0, 0x04f6, 0x04ff, 0x04ff, 0x0530, 0x053a, 0x0544, 0x0550, - 0x0556, 0x055c, 0x0562, 0x0568, 0x0570, 0x0578, 0x0581, 0x0589, - 0x0596, 0x059c, 0x05b3, 0x05bb, 0x05c4, 0x05cd, 0x05d2, 0x05d8, - 0x05de, 0x05e3, 0x05ed, 0x05f2, 0x05f8, 0x05fc, 0x0613, 0x0619, - 0x0621, 0x062b, 0x0632, 0x0648, 0x0653, 0x065c, 0x068e, 0x0694, - // Entry C0 - FF - 0x069a, 0x06a3, 0x06a9, 0x06a9, 0x06b2, 0x06ba, 0x06ba, 0x06c0, - 0x06c6, 0x06cc, 0x06e2, 0x06ec, 0x06f2, 0x06f8, 0x0700, 0x070b, - 0x0715, 0x0715, 0x071f, 0x072b, 0x0733, 0x073b, 0x0743, 0x074b, - 0x074b, 0x0762, 0x076b, 0x076b, 0x0771, 0x0777, 0x0777, 0x0794, - 0x0799, 0x0799, 0x079d, 0x07a5, 0x07b1, 0x07b9, 0x07c9, 0x07d9, - 0x07e1, 0x07e6, 0x07ed, 0x0801, 0x0807, 0x080e, 0x0817, 0x0820, - 0x0826, 0x0826, 0x0826, 0x082e, 0x0836, 0x0843, 0x084b, 0x0865, - 0x086e, 0x0897, 0x08bd, 0x08c6, 0x08cd, 0x08dd, 0x08e3, 0x08e3, - // Entry 100 - 13F - 0x08e9, 0x08ef, 0x08fd, 0x0904, 0x090c, - }, - }, - { // se - "AscensionAndorraOvttastuvvan ArábaemiráhtatAfghanistanAntigua ja Barbuda" + - "AnguillaAlbániaArmeniaAngolaAntárktisArgentinaAmerihká SamoaNuortari" + - "ikaAustráliaArubaÅlándaAserbaižanBosnia-HercegovinaBarbadosBanglades" + - "hBelgiaBurkina FasoBulgáriaBahrainBurundiBeninSaint BarthélemyBermud" + - "aBruneiBoliviaBrasilBahamasBhutanBouvet-sullotBotswanaVilges-RuoššaB" + - "elizeKanádaCocos-sullotKongo-KinshasaGaska-Afrihká dásseváldiKongo-B" + - "razzavilleŠveicaElfenbenaridduCook-sullotČiileKamerunKiinnáKolombiaC" + - "lipperton-sullotCosta RicaKubaKap VerdeCuraçaoJuovllat-sullotKyprosČ" + - "eahkkaDuiskaDiego GarciaDjiboutiDánmárkuDominicaDominikána dásseváld" + - "iAlgeriaCeuta ja MelillaEcuadorEstlándaEgyptaOarje-SaháraEritreaSpán" + - "iaEtiopiaEurohpa UniovdnaSuopmaFijisullotFalklandsullotMikronesiaFea" + - "rsullotFrankriikaGabonStuorra-BritánniaGrenadaGeorgiaFrankriikka Gua" + - "yanaGuernseyGhanaGibraltarKalaallit NunaatGámbiaGuineaGuadeloupeEkva" + - "toriála GuineaGreikaLulli Georgia ja Lulli Sandwich-sullotGuatemalaG" + - "uamGuinea-BissauGuyanaHongkongHeard- ja McDonald-sullotHondurasKroát" + - "iaHaitiUngárKanáriasullotIndonesiaIrlándaIsraelMann-sullotIndiaIrakI" + - "ranIslándaItáliaJerseyJamaicaJordániaJapánaKeniaKirgisistanKambodžaK" + - "iribatiKomorosSaint Kitts ja NevisDavvi-KoreaMátta-KoreaKuwaitCayman" + - "-sullotKasakstanLaosLibanonSaint LuciaLiechtensteinSri LankaLiberiaL" + - "esothoLietuvaLuxembourgLátviaLibyaMarokkoMonacoMoldáviaMontenegroFra" + - "nkriikka Saint MartinMadagaskarMarshallsullotMakedoniaMaliBurmaMongo" + - "liaMakáoDavvi-MariánatMartiniqueMauretániaMontserratMáltaMauritiusMa" + - "lediivvatMalawiMeksikoMalesiaMosambikNamibiaOđđa-KaledoniaNigerNorfo" + - "lksullotNigeriaNicaraguaVuolleeatnamatNorgaNepalNauruNiueOđđa-Selánd" + - "aOmanPanamaPeruFrankriikka PolynesiaPapua-Ođđa-GuineaFilippiinnatPak" + - "istanPolenSaint Pierre ja MiquelonPitcairnPuerto RicoPalestinaPortug" + - "álaPalauParaguayQatarRéunionRomániaSerbiaRuoššaRwandaSaudi-ArábiaSa" + - "lomon-sullotSeychellsullotDavvisudanRuoŧŧaSingaporeSaint HelenaSlove" + - "niaSvalbárda ja Jan MayenSlovákiaSierra LeoneSan MarinoSenegalSomáli" + - "aSurinamMáttasudanSão Tomé ja PríncipeEl SalvadorVuolleeatnamat Sain" + - "t MartinSyriaSvazieanaTristan da CunhaTurks ja Caicos-sullotTčadTogo" + - "ThaieanaTažikistanTokelauNuorta-TimorTurkmenistanTunisiaTongaDurkaTr" + - "inidad ja TobagoTuvaluTaiwanTanzániaUkrainaUgandaAmerihká ovttastuvv" + - "an stáhtatUruguayUsbekistanVatikánaSaint Vincent ja GrenadineVenezue" + - "laBrittania Virgin-sullotAOS Virgin-sullotVietnamVanuatuWallis ja Fu" + - "tunaSamoaKosovoJemenMayotteMátta-AfrihkáZambiaZimbabwedovdameahttun " + - "guovlumáilbmiAfrihkkádávvi-Amerihkká ja gaska-Amerihkkámátta-Amerihk" + - "káOseaniaoarji-Afrihkkágaska-Amerihkkánuorta-Afrihkkádavvi-Afrihkkág" + - "aska-Afrihkkámátta-AfrihkkáAmerihkkádávvi-AmerihkkáKaribianuorta-Ási" + - "amátta-Ásiamátta-nuorta-Ásiamátta-EurohpáAustrália ja Ođđa-SelándaMe" + - "lanesiaMikronesia guovllusPolynesiaÁsiagaska-Ásiaoarji-ÁsiaEurohpánu" + - "orta-Eurohpádavvi-Eurohpáoarji-Eurohpálulli-Amerihkká", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002d, 0x0038, 0x004a, 0x0052, 0x005a, - 0x0061, 0x0067, 0x0071, 0x007a, 0x0089, 0x0094, 0x009e, 0x00a3, - 0x00ab, 0x00b6, 0x00c8, 0x00d0, 0x00da, 0x00e0, 0x00ec, 0x00f5, - 0x00fc, 0x0103, 0x0108, 0x0119, 0x0120, 0x0126, 0x012d, 0x012d, - 0x0133, 0x013a, 0x0140, 0x014d, 0x0155, 0x0164, 0x016a, 0x0171, - 0x017d, 0x018b, 0x01a6, 0x01b7, 0x01be, 0x01cc, 0x01d7, 0x01dd, - 0x01e4, 0x01eb, 0x01f3, 0x0204, 0x020e, 0x0212, 0x021b, 0x0223, - 0x0232, 0x0238, 0x0240, 0x0246, 0x0252, 0x025a, 0x0264, 0x026c, - // Entry 40 - 7F - 0x0284, 0x028b, 0x029b, 0x02a2, 0x02ab, 0x02b1, 0x02be, 0x02c5, - 0x02cc, 0x02d3, 0x02e3, 0x02e3, 0x02e9, 0x02f3, 0x0301, 0x030b, - 0x0315, 0x031f, 0x0324, 0x0336, 0x033d, 0x0344, 0x0357, 0x035f, - 0x0364, 0x036d, 0x037d, 0x0384, 0x038a, 0x0394, 0x03a7, 0x03ad, - 0x03d3, 0x03dc, 0x03e0, 0x03ed, 0x03f3, 0x03fb, 0x0414, 0x041c, - 0x0424, 0x0429, 0x042f, 0x043d, 0x0446, 0x044e, 0x0454, 0x045f, - 0x0464, 0x0464, 0x0468, 0x046c, 0x0474, 0x047b, 0x0481, 0x0488, - 0x0491, 0x0498, 0x049d, 0x04a8, 0x04b1, 0x04b9, 0x04c0, 0x04d4, - // Entry 80 - BF - 0x04df, 0x04eb, 0x04f1, 0x04fe, 0x0507, 0x050b, 0x0512, 0x051d, - 0x052a, 0x0533, 0x053a, 0x0541, 0x0548, 0x0552, 0x0559, 0x055e, - 0x0565, 0x056b, 0x0574, 0x057e, 0x0596, 0x05a0, 0x05ae, 0x05b7, - 0x05bb, 0x05c0, 0x05c8, 0x05ce, 0x05dd, 0x05e7, 0x05f2, 0x05fc, - 0x0602, 0x060b, 0x0616, 0x061c, 0x0623, 0x062a, 0x0632, 0x0639, - 0x0649, 0x064e, 0x065b, 0x0662, 0x066b, 0x0679, 0x067e, 0x0683, - 0x0688, 0x068c, 0x069b, 0x069f, 0x06a5, 0x06a9, 0x06be, 0x06d1, - 0x06dd, 0x06e5, 0x06ea, 0x0702, 0x070a, 0x0715, 0x071e, 0x0728, - // Entry C0 - FF - 0x072d, 0x0735, 0x073a, 0x073a, 0x0742, 0x074a, 0x0750, 0x0758, - 0x075e, 0x076b, 0x0779, 0x0787, 0x0791, 0x0799, 0x07a2, 0x07ae, - 0x07b6, 0x07cd, 0x07d6, 0x07e2, 0x07ec, 0x07f3, 0x07fb, 0x0802, - 0x080d, 0x0824, 0x082f, 0x084a, 0x084f, 0x0858, 0x0868, 0x087e, - 0x0883, 0x0883, 0x0887, 0x088f, 0x089a, 0x08a1, 0x08ad, 0x08b9, - 0x08c0, 0x08c5, 0x08ca, 0x08dc, 0x08e2, 0x08e8, 0x08f1, 0x08f8, - 0x08fe, 0x08fe, 0x08fe, 0x091d, 0x0924, 0x092e, 0x0937, 0x0951, - 0x095a, 0x0971, 0x0982, 0x0989, 0x0990, 0x09a0, 0x09a5, 0x09ab, - // Entry 100 - 13F - 0x09b0, 0x09b7, 0x09c6, 0x09cc, 0x09d4, 0x09e8, 0x09f0, 0x09f9, - 0x0a1e, 0x0a2f, 0x0a36, 0x0a45, 0x0a55, 0x0a65, 0x0a74, 0x0a83, - 0x0a93, 0x0a9d, 0x0aae, 0x0ab5, 0x0ac1, 0x0acd, 0x0ae0, 0x0aef, - 0x0b0c, 0x0b15, 0x0b28, 0x0b31, 0x0b36, 0x0b41, 0x0b4c, 0x0b54, - 0x0b63, 0x0b71, 0x0b7f, 0x0b8f, - }, - }, - { // se-FI - "Bosnia ja HercegovinaKambožaSudanChadDavvi-Amerihkká ja Gaska-AmerihkkáL" + - "ulli-AmerihkkáGaska-AmerihkkáDavvi-AmerihkkáLatiinnalaš-Amerihkká", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - // Entry 40 - 7F - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x001d, 0x001d, 0x001d, 0x001d, - // Entry 80 - BF - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - // Entry C0 - FF - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x0022, 0x0022, 0x0022, 0x0022, - 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, - 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, - // Entry 100 - 13F - 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, - 0x004a, 0x005a, 0x005a, 0x005a, 0x006a, 0x006a, 0x006a, 0x006a, - 0x006a, 0x006a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, - 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, - 0x007a, 0x007a, 0x007a, 0x0091, - }, - }, - { // seh - "AndorraEmirados Árabes UnidosAfeganistãoAntígua e BarbudaAnguillaAlbânia" + - "ArmêniaAngolaArgentinaSamoa AmericanaÁustriaAustráliaArubaAzerbaijão" + - "Bósnia-HerzegovinaBarbadosBangladeshBélgicaBurquina FasoBulgáriaBahr" + - "ainBurundiBeninBermudasBruneiBolíviaBrasilBahamasButãoBotsuanaBelaru" + - "sBelizeCanadáCongo-KinshasaRepública Centro-AfricanaCongoSuíçaCosta " + - "do MarfimIlhas CookChileRepública dos CamarõesChinaColômbiaCosta Ric" + - "aCubaCabo VerdeChipreRepública TchecaAlemanhaDjibutiDinamarcaDominic" + - "aRepública DominicanaArgéliaEquadorEstôniaEgitoEritréiaEspanhaEtiópi" + - "aFinlândiaFijiIlhas MalvinasMicronésiaFrançaGabãoReino UnidoGranadaG" + - "eórgiaGuiana FrancesaGanaGibraltarGroênlandiaGâmbiaGuinéGuadalupeGui" + - "né EquatorialGréciaGuatemalaGuamGuiné BissauGuianaHondurasCroáciaHai" + - "tiHungriaIndonésiaIrlandaIsraelÍndiaTerritório Britânico do Oceano Í" + - "ndicoIraqueIrãIslândiaItáliaJamaicaJordâniaJapãoQuêniaQuirguistãoCam" + - "bojaQuiribatiComoresSão Cristovão e NevisCoréia do NorteCoréia do Su" + - "lKuwaitIlhas CaimanCasaquistãoLaosLíbanoSanta LúciaLiechtensteinSri " + - "LankaLibériaLesotoLituâniaLuxemburgoLetôniaLíbiaMarrocosMônacoMoldáv" + - "iaMadagascarIlhas MarshallMacedôniaMaliMianmarMongóliaIlhas Marianas" + - " do NorteMartinicaMauritâniaMontserratMaltaMaurícioMaldivasMalawiMéx" + - "icoMalásiaMoçambiqueNamíbiaNova CaledôniaNígerIlhas NorfolkNigériaNi" + - "caráguaHolandaNoruegaNepalNauruNiueNova ZelândiaOmãPanamáPeruPolinés" + - "ia FrancesaPapua-Nova GuinéFilipinasPaquistãoPolôniaSaint Pierre e M" + - "iquelonPitcairnPorto RicoTerritório da PalestinaPortugalPalauParagua" + - "iCatarReuniãoRomêniaRússiaRuandaArábia SauditaIlhas SalomãoSeychelle" + - "sSudãoSuéciaCingapuraSanta HelenaEslovêniaEslováquiaSerra LeoaSan Ma" + - "rinoSenegalSomáliaSurinameSão Tomé e PríncipeEl SalvadorSíriaSuazilâ" + - "ndiaIlhas Turks e CaicosChadeTogoTailândiaTadjiquistãoTokelauTimor L" + - "esteTurcomenistãoTunísiaTongaTurquiaTrinidad e TobagoTuvaluTaiwanUcr" + - "âniaUgandaEstados UnidosUruguaiUzbequistãoVaticanoSão Vicente e Gra" + - "nadinasVenezuelaIlhas Virgens BritânicasIlhas Virgens dos EUAVietnãV" + - "anuatuWallis e FutunaSamoaIêmenMayotteÁfrica do SulZâmbiaZimbábue", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x001e, 0x002a, 0x003c, 0x0044, 0x004c, - 0x0054, 0x005a, 0x005a, 0x0063, 0x0072, 0x007a, 0x0084, 0x0089, - 0x0089, 0x0094, 0x00a7, 0x00af, 0x00b9, 0x00c1, 0x00ce, 0x00d7, - 0x00de, 0x00e5, 0x00ea, 0x00ea, 0x00f2, 0x00f8, 0x0100, 0x0100, - 0x0106, 0x010d, 0x0113, 0x0113, 0x011b, 0x0122, 0x0128, 0x012f, - 0x012f, 0x013d, 0x0157, 0x015c, 0x0163, 0x0172, 0x017c, 0x0181, - 0x0199, 0x019e, 0x01a7, 0x01a7, 0x01b1, 0x01b5, 0x01bf, 0x01bf, - 0x01bf, 0x01c5, 0x01d6, 0x01de, 0x01de, 0x01e5, 0x01ee, 0x01f6, - // Entry 40 - 7F - 0x020b, 0x0213, 0x0213, 0x021a, 0x0222, 0x0227, 0x0227, 0x0230, - 0x0237, 0x023f, 0x023f, 0x023f, 0x0249, 0x024d, 0x025b, 0x0266, - 0x0266, 0x026d, 0x0273, 0x027e, 0x0285, 0x028d, 0x029c, 0x029c, - 0x02a0, 0x02a9, 0x02b5, 0x02bc, 0x02c2, 0x02cb, 0x02dc, 0x02e3, - 0x02e3, 0x02ec, 0x02f0, 0x02fd, 0x0303, 0x0303, 0x0303, 0x030b, - 0x0313, 0x0318, 0x031f, 0x031f, 0x0329, 0x0330, 0x0336, 0x0336, - 0x033c, 0x0364, 0x036a, 0x036e, 0x0377, 0x037e, 0x037e, 0x0385, - 0x038e, 0x0394, 0x039b, 0x03a7, 0x03ae, 0x03b7, 0x03be, 0x03d5, - // Entry 80 - BF - 0x03e5, 0x03f3, 0x03f9, 0x0405, 0x0411, 0x0415, 0x041c, 0x0428, - 0x0435, 0x043e, 0x0446, 0x044c, 0x0455, 0x045f, 0x0467, 0x046d, - 0x0475, 0x047c, 0x0485, 0x0485, 0x0485, 0x048f, 0x049d, 0x04a7, - 0x04ab, 0x04b2, 0x04bb, 0x04bb, 0x04d2, 0x04db, 0x04e6, 0x04f0, - 0x04f5, 0x04fe, 0x0506, 0x050c, 0x0513, 0x051b, 0x0526, 0x052e, - 0x053d, 0x0543, 0x0550, 0x0558, 0x0562, 0x0569, 0x0570, 0x0575, - 0x057a, 0x057e, 0x058c, 0x0590, 0x0597, 0x059b, 0x05ae, 0x05bf, - 0x05c8, 0x05d2, 0x05da, 0x05f1, 0x05f9, 0x0603, 0x061b, 0x0623, - // Entry C0 - FF - 0x0628, 0x0630, 0x0635, 0x0635, 0x063d, 0x0645, 0x0645, 0x064c, - 0x0652, 0x0661, 0x066f, 0x0679, 0x067f, 0x0686, 0x068f, 0x069b, - 0x06a5, 0x06a5, 0x06b0, 0x06ba, 0x06c4, 0x06cb, 0x06d3, 0x06db, - 0x06db, 0x06f1, 0x06fc, 0x06fc, 0x0702, 0x070e, 0x070e, 0x0722, - 0x0727, 0x0727, 0x072b, 0x0735, 0x0742, 0x0749, 0x0754, 0x0762, - 0x076a, 0x076f, 0x0776, 0x0787, 0x078d, 0x0793, 0x0793, 0x079b, - 0x07a1, 0x07a1, 0x07a1, 0x07af, 0x07b6, 0x07c2, 0x07ca, 0x07e3, - 0x07ec, 0x0805, 0x081a, 0x0821, 0x0828, 0x0837, 0x083c, 0x083c, - // Entry 100 - 13F - 0x0842, 0x0849, 0x0857, 0x085e, 0x0867, - }, - }, - { // ses - "AndooraLaaraw Imaarawey MarganteyAfgaanistanAntigua nda BarbuudaAngiiyaA" + - "lbaaniArmeeniAngoolaArgentineAmeriki SamoaOtrišiOstraaliAruubaAzerba" + - "ayijaŋBosni nda HerzegovineBarbaadosBangladešiBelgiikiBurkina fasoBu" + - "lgaariBahareenBurundiBeniŋBermudaBruuneeBooliviBreezilBahamasBuutaŋB" + - "otswaanaBilorišiBeliiziKanaadaKongoo demookaratiki labooCentraafriki" + - " koyraKongooSwisuKudwarKuuk gungeyŠiiliKameruunŠiinKolombiKosta rika" + - "KuubaKapuver gungeyŠiipurCek laboAlmaaɲeJibuutiDanemarkDoominikiDoom" + - "iniki labooAlžeeriEkwateerEstooniMisraEritreeEspaaɲeEcioopiFinlanduF" + - "ijiKalkan gungeyMikroneziFaransiGaabonAlbaasalaama MargantaGrenaadaG" + - "orgiFaransi GuyaanGaanaGibraltarGrinlandGambiGineGwadeluupGinee Ekwa" + - "torialGreeceGwatemaalaGuamGine-BissoGuyaaneHondurasKrwaasiHaitiHunga" + - "ariIndoneeziIrlanduIsrayelIndu labooBritiši Indu teekoo laamaIraakIr" + - "aanAycelandItaaliJamaayikUrdunJaapoŋKeeniyaKyrgyzstanKamboogiKiribaa" + - "tiKomoorSeŋ Kitts nda NevisKooree, GurmaKooree, HawsaKuweetKayman gu" + - "ngeyKaazakstanLaawosLubnaanSeŋ LussiaLiechtensteinSrilankaLiberiaLee" + - "sotoLituaaniLuxembourgLetooniLiibiMaarokMonakoMoldoviMadagascarMarša" + - "l gungeyMaacedooniMaaliMaynamarMongooliMariana Gurma GungeyMartiniik" + - "iMooritaaniMontserratMaltaMooris gungeyMaldiivuMalaawiMexikiMaleeziM" + - "ozambikNaamibiKaaledooni TaagaaNižerNorfolk GungooNaajiriiaNikaragwa" + - "HollanduNorveejNeepalNauruNiueZeelandu TaagaOmaanPanamaPeeruFaransi " + - "PolineeziPapua Ginee TaagaFilipinePaakistanPoloɲeSeŋ Piyer nda Mikel" + - "onPitikarinPorto RikoPalestine Dangay nda GaazaPortugaalPaluParaguwe" + - "yKataarReenioŋRumaaniIriši labooRwandaSaudiyaSolomon GungeySeešelSuu" + - "daŋSweedeSingapurSeŋ HelenaSloveeniSlovaakiSeera LeonSan MarinoSeneg" + - "alSomaaliSurinaamSao Tome nda PrinsipeSalvador labooSuuriaSwazilandT" + - "urk nda Kayikos GungeyCaaduTogoTaayilandTaažikistanTokelauTimoor haw" + - "saTurkmenistaŋTuniziTongaTurkiTrinidad nda TobaagoTuvaluTaayiwanTanz" + - "aaniUkreenUgandaAmeriki Laabu MarganteyUruguweyUzbeekistanVaatikan L" + - "aamaSeŋvinsaŋ nda GrenadineVeneezuyeelaBritiši Virgin gungeyAmeerik " + - "Virgin GungeyVietnaamVanautuWallis nda FutunaSamoaYamanMayootiHawsa " + - "Afriki LabooZambiZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x0021, 0x002c, 0x0040, 0x0047, 0x004e, - 0x0055, 0x005c, 0x005c, 0x0065, 0x0072, 0x0079, 0x0081, 0x0087, - 0x0087, 0x0094, 0x00a9, 0x00b2, 0x00bd, 0x00c5, 0x00d1, 0x00d9, - 0x00e1, 0x00e8, 0x00ee, 0x00ee, 0x00f5, 0x00fc, 0x0103, 0x0103, - 0x010a, 0x0111, 0x0118, 0x0118, 0x0121, 0x012a, 0x0131, 0x0138, - 0x0138, 0x0152, 0x0164, 0x016a, 0x016f, 0x0175, 0x0180, 0x0186, - 0x018e, 0x0193, 0x019a, 0x019a, 0x01a4, 0x01a9, 0x01b7, 0x01b7, - 0x01b7, 0x01be, 0x01c6, 0x01ce, 0x01ce, 0x01d5, 0x01dd, 0x01e6, - // Entry 40 - 7F - 0x01f5, 0x01fd, 0x01fd, 0x0205, 0x020c, 0x0211, 0x0211, 0x0218, - 0x0220, 0x0227, 0x0227, 0x0227, 0x022f, 0x0233, 0x0240, 0x0249, - 0x0249, 0x0250, 0x0256, 0x026b, 0x0273, 0x0278, 0x0286, 0x0286, - 0x028b, 0x0294, 0x029c, 0x02a1, 0x02a5, 0x02ae, 0x02be, 0x02c4, - 0x02c4, 0x02ce, 0x02d2, 0x02dc, 0x02e3, 0x02e3, 0x02e3, 0x02eb, - 0x02f2, 0x02f7, 0x02ff, 0x02ff, 0x0308, 0x030f, 0x0316, 0x0316, - 0x0320, 0x033a, 0x033f, 0x0344, 0x034c, 0x0352, 0x0352, 0x035a, - 0x035f, 0x0366, 0x036d, 0x0377, 0x037f, 0x0388, 0x038e, 0x03a2, - // Entry 80 - BF - 0x03af, 0x03bc, 0x03c2, 0x03cf, 0x03d9, 0x03df, 0x03e6, 0x03f1, - 0x03fe, 0x0406, 0x040d, 0x0414, 0x041c, 0x0426, 0x042d, 0x0432, - 0x0438, 0x043e, 0x0445, 0x0445, 0x0445, 0x044f, 0x045d, 0x0467, - 0x046c, 0x0474, 0x047c, 0x047c, 0x0490, 0x049a, 0x04a4, 0x04ae, - 0x04b3, 0x04c0, 0x04c8, 0x04cf, 0x04d5, 0x04dc, 0x04e4, 0x04eb, - 0x04fc, 0x0502, 0x0510, 0x0519, 0x0522, 0x052a, 0x0531, 0x0537, - 0x053c, 0x0540, 0x054e, 0x0553, 0x0559, 0x055e, 0x056f, 0x0580, - 0x0588, 0x0591, 0x0598, 0x05ae, 0x05b7, 0x05c1, 0x05db, 0x05e4, - // Entry C0 - FF - 0x05e8, 0x05f1, 0x05f7, 0x05f7, 0x05ff, 0x0606, 0x0606, 0x0612, - 0x0618, 0x061f, 0x062d, 0x0634, 0x063b, 0x0641, 0x0649, 0x0654, - 0x065c, 0x065c, 0x0664, 0x066e, 0x0678, 0x067f, 0x0686, 0x068e, - 0x068e, 0x06a3, 0x06b1, 0x06b1, 0x06b7, 0x06c0, 0x06c0, 0x06d7, - 0x06dc, 0x06dc, 0x06e0, 0x06e9, 0x06f5, 0x06fc, 0x0708, 0x0715, - 0x071b, 0x0720, 0x0725, 0x0739, 0x073f, 0x0747, 0x074f, 0x0755, - 0x075b, 0x075b, 0x075b, 0x0772, 0x077a, 0x0785, 0x0793, 0x07ac, - 0x07b8, 0x07ce, 0x07e3, 0x07eb, 0x07f2, 0x0803, 0x0808, 0x0808, - // Entry 100 - 13F - 0x080d, 0x0814, 0x0826, 0x082b, 0x0833, - }, - }, - { // sg - "AndôroArâbo Emirâti ÔkoFaganïta, AfganïstäanAntîgua na BarbûdaAngûîlaAlb" + - "anïiArmenïiAngoläaArzantînaSamöa tî AmerîkaOtrîsiOstralïi, SotralïiA" + - "rûbaZerebaidyäan, Azerbaidyäan,Bosnïi na HerzegovînniBarabâdaBenglad" + - "êshiBêleze, BelezîkiBurkina FasoBulugarïiBahrâinaBurundïiBenëenBere" + - "mûdaBrunêiBolivïiBrezîliBahâmasaButäanBotswanaBelarüsiBelîziKanadäaK" + - "ödörösêse tî Ngunuhalëzo tî kongöKödörösêse tî BêafrîkaKongöSûîsiKô" + - "divüäraâzûâ KûkuShilïiKamerûneShînaKolombïiKôsta RîkaKubäaAzûâ tî Kâ" + - "po-VêreSîpriKödörösêse tî TyêkiZâmaniDibutùiiDanemêrkeDömïnîkaKödörö" + - "sêse tî DominîkaAlzerïiEkuatëreEstonïiKâmitâEritrëeEspânyeEtiopïiFël" + - "ândeFidyïiÂzûâ tî MälüîniMikronezïiFarânziGaböonKödörögbïä--ÔkoGren" + - "âdaZorzïiGüyâni tî farânziGanäaZibraltära, ZibaratäraGorolândeGambï" + - "iGinëeGuadelûpuGinëe tî EkuatëreGerêsiGuatêmäläGuâmGninëe-BisauGayân" + - "aHonduräsiKroasïiHaitïiHongirùiiÊnndonezïiIrlândeIsraëliÊnndeSêse tî" + - " Anglëe na Ngûyämä tî ÊnndeIrâkiIräanIslândeItalùiiZamaîkaZordanïiZa" + - "pöonKenyäaKirigizitùaanKämbôziKiribatiKömôroSên-Krïstôfo-na-NevîsiKo" + - "rëe tî BangaKorëe tî MbongoKöwêtiÂzûâ Ngundë, KaimäniKazakisitäanLùa" + - "ôsiLibùaanSênt-LisïiLiechtenstein,Sirî-LankaLiberïaLesôthoLituanïiL" + - "ugzambûruLetonùiiLibïiMarôkoMonaköoMoldavùiiMadagaskäraÂzûâ MärshâlM" + - "aseduäniMalïiMyämâraMongolïiÂzûâ Märïâni tî BangaMärtïnîkiMoritanïiM" + - "onserâteMâltaMörîsiMaldîvaMalawïiMekisîkiMalezïiMözämbîkaNamibùiiFin" + - "î KaledonïiNizëreZûâ NôrfôlkoNizerïaNikaraguaHoländeNörvêziNëpâliNa" + - "uruNiueFinî ZelândeOmâniPanamaPerüuPolinezïi tî farânziPapû Finî Gin" + - "ëe, PapuazïiFilipîniPakistäanPölôniSên-Pyêre na MikelöonPitikêrniPo" + - "rto RîkoSêse tî PalestîniPörtugäle, Ködörö PûraPalauParaguëeKatäraRe" + - "inïonRumanïiRusïiRuandäaSaûdi ArabïiZûâ SalomöonSëyshêleSudäanSuêdeS" + - "ïngäpûruSênt-HelênaSolovenïiSolovakïiSierä-LeôneSên-MarëenSenegäleS" + - "omalïiSurinämSâô Tömê na PrinsîpeSalvadöroSirïiSwäzïlândeÂzûâ Turku " + - "na KaîkiTyâdeTogöTailândeTaazikiistäanTokelauTimôro tî TöTurkumenist" + - "äanTunizïiTongaTurukïiTrinitùee na TobagöTüvalüTâiwâniTanzanïiUkrên" + - "iUgandäaÂLeaa-Ôko tî AmerikaUruguëeUzbekistäanLetëe tî VatikäanSên-V" + - "ensäan na âGrenadîniVenezueläaÂzôâ Viîrîggo tî AnglëeÂzûâ Virîgo tî " + - "AmerîkaVietnämVanuatüWalîsi na FutunaSamoäaYëmêniMäyôteMbongo-Afrîka" + - "ZambïiZimbäbwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x001b, 0x0033, 0x0047, 0x0050, 0x0058, - 0x0060, 0x0068, 0x0068, 0x0072, 0x0085, 0x008c, 0x00a0, 0x00a6, - 0x00a6, 0x00c3, 0x00db, 0x00e4, 0x00f0, 0x0102, 0x010e, 0x0118, - 0x0121, 0x012a, 0x0131, 0x0131, 0x013a, 0x0141, 0x0149, 0x0149, - 0x0151, 0x015a, 0x0161, 0x0161, 0x0169, 0x0172, 0x0179, 0x0181, - 0x0181, 0x01ab, 0x01c8, 0x01ce, 0x01d5, 0x01e1, 0x01ee, 0x01f5, - 0x01fe, 0x0204, 0x020d, 0x020d, 0x0219, 0x021f, 0x0235, 0x0235, - 0x0235, 0x023b, 0x0254, 0x025b, 0x025b, 0x0264, 0x026e, 0x0279, - // Entry 40 - 7F - 0x0295, 0x029d, 0x029d, 0x02a6, 0x02ae, 0x02b6, 0x02b6, 0x02be, - 0x02c6, 0x02ce, 0x02ce, 0x02ce, 0x02d7, 0x02de, 0x02f4, 0x02ff, - 0x02ff, 0x0307, 0x030e, 0x0323, 0x032b, 0x0332, 0x0347, 0x0347, - 0x034d, 0x0365, 0x036f, 0x0376, 0x037c, 0x0386, 0x039a, 0x03a1, - 0x03a1, 0x03ad, 0x03b2, 0x03bf, 0x03c6, 0x03c6, 0x03c6, 0x03d0, - 0x03d8, 0x03df, 0x03e9, 0x03e9, 0x03f5, 0x03fd, 0x0405, 0x0405, - 0x040b, 0x0435, 0x043b, 0x0441, 0x0449, 0x0451, 0x0451, 0x0459, - 0x0462, 0x0469, 0x0470, 0x047e, 0x0487, 0x048f, 0x0497, 0x04b1, - // Entry 80 - BF - 0x04c1, 0x04d2, 0x04da, 0x04f3, 0x0500, 0x0508, 0x0510, 0x051c, - 0x052a, 0x0535, 0x053d, 0x0545, 0x054e, 0x0559, 0x0562, 0x0568, - 0x056f, 0x0577, 0x0581, 0x0581, 0x0581, 0x058d, 0x059e, 0x05a8, - 0x05ae, 0x05b7, 0x05c0, 0x05c0, 0x05dc, 0x05e8, 0x05f2, 0x05fc, - 0x0602, 0x060a, 0x0612, 0x061a, 0x0623, 0x062b, 0x0637, 0x0640, - 0x0650, 0x0657, 0x0667, 0x066f, 0x0678, 0x0680, 0x0689, 0x0691, - 0x0696, 0x069a, 0x06a8, 0x06ae, 0x06b4, 0x06ba, 0x06d1, 0x06ee, - 0x06f7, 0x0701, 0x0709, 0x0721, 0x072b, 0x0736, 0x074a, 0x0766, - // Entry C0 - FF - 0x076b, 0x0774, 0x077b, 0x077b, 0x0783, 0x078b, 0x078b, 0x0791, - 0x0799, 0x07a7, 0x07b6, 0x07c0, 0x07c7, 0x07cd, 0x07d9, 0x07e6, - 0x07f0, 0x07f0, 0x07fa, 0x0807, 0x0813, 0x081c, 0x0824, 0x082c, - 0x082c, 0x0845, 0x084f, 0x084f, 0x0855, 0x0862, 0x0862, 0x0879, - 0x087f, 0x087f, 0x0884, 0x088d, 0x089b, 0x08a2, 0x08b1, 0x08c0, - 0x08c8, 0x08cd, 0x08d5, 0x08ea, 0x08f2, 0x08fb, 0x0904, 0x090b, - 0x0913, 0x0913, 0x0913, 0x092a, 0x0932, 0x093e, 0x0952, 0x096f, - 0x097a, 0x0998, 0x09b4, 0x09bc, 0x09c4, 0x09d5, 0x09dc, 0x09dc, - // Entry 100 - 13F - 0x09e4, 0x09ec, 0x09fa, 0x0a01, 0x0a0a, - }, - }, - { // shi - "ⴰⵏⴷⵓⵔⴰⵍⵉⵎⴰⵔⴰⵜⴰⴼⵖⴰⵏⵉⵙⵜⴰⵏⴰⵏⵜⵉⴳⴰ ⴷ ⴱⵔⴱⵓⴷⴰⴰⵏⴳⵉⵍⴰⴰⵍⴱⴰⵏⵢⴰⴰⵔⵎⵉⵏⵢⴰⴰⵏⴳⵓⵍⴰⴰⵔⵊⴰⵏⵜⵉⵏ" + - "ⵙⴰⵎⵡⴰ ⵜⴰⵎⵉⵔⵉⴽⴰⵏⵉⵜⵏⵏⵎⵙⴰⵓⵙⵜⵔⴰⵍⵢⴰⴰⵔⵓⴱⴰⴰⴷⵔⴰⴱⵉⵊⴰⵏⴱⵓⵙⵏⴰ ⴷ ⵀⵉⵔⵙⵉⴽⴱⴰⵔⴱⴰⴷⴱⴰ" + - "ⵏⴳⵍⴰⴷⵉⵛⴱⵍⵊⵉⴽⴰⴱⵓⵔⴽⵉⵏⴰ ⴼⴰⵙⵓⴱⵍⵖⴰⵔⵢⴰⴱⵃⵔⴰⵢⵏⴱⵓⵔⵓⵏⴷⵉⴱⵉⵏⵉⵏⴱⵔⵎⵓⴷⴰⴱⵔⵓⵏⵉⴱⵓⵍⵉⴼ" + - "ⵢⴰⴱⵔⴰⵣⵉⵍⴱⴰⵀⴰⵎⴰⵙⴱⵀⵓⵜⴰⵏⴱⵓⵜⵙⵡⴰⵏⴰⴱⵉⵍⴰⵔⵓⵙⵢⴰⴱⵉⵍⵉⵣⴽⴰⵏⴰⴷⴰⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⴷⵉⵎⵓⵇ" + - "ⵔⴰⵜⵉⵜ ⵏ ⴽⵓⵏⴳⵓⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⵏⴰⵎⵎⴰⵙⵜ ⵏ ⵉⴼⵔⵉⵇⵢⴰⴽⵓⵏⴳⵓⵙⵡⵉⵙⵔⴰⴽⵓⵜ ⴷⵉⴼⵡⴰⵔⵜⵉⴳ" + - "ⵣⵉⵔⵉⵏ ⵏ ⴽⵓⴽⵛⵛⵉⵍⵉⴽⴰⵎⵉⵔⵓⵏⵛⵛⵉⵏⵡⴰⴽⵓⵍⵓⵎⴱⵢⴰⴽⵓⵙⵜⴰ ⵔⵉⴽⴰⴽⵓⴱⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⴽⴰⴱⴱ" + - "ⵉⵔⴷⵉⵇⵓⴱⵔⵓⵙⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⵜⵛⵉⴽⵉⵜⴰⵍⵎⴰⵏⵢⴰⴷⵊⵉⴱⵓⵜⵉⴷⴰⵏⵎⴰⵔⴽⴷⵓⵎⵉⵏⵉⴽⵜⴰⴳⴷⵓⴷⴰⵏⵜ " + - "ⵜⴰⴷⵓⵎⵉⵏⵉⴽⵜⴷⵣⴰⵢⵔⵉⴽⵡⴰⴷⵓⵔⵉⵙⵜⵓⵏⵢⴰⵎⵉⵚⵕⵉⵔⵉⵜⵉⵔⵢⴰⵙⴱⴰⵏⵢⴰⵉⵜⵢⵓⴱⵢⴰⴼⵉⵍⵍⴰⵏⴷⴰⴼⵉⴷⵊ" + - "ⵉⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵎⴰⵍⴰⵡⵉⵎⵉⴽⵔⵓⵏⵉⵣⵢⴰⴼⵔⴰⵏⵙⴰⴳⴰⴱⵓⵏⵜⴰⴳⵍⴷⵉⵜ ⵉⵎⵓⵏⵏⵖⵔⵏⴰⵟⴰⵊⵓⵔⵊⵢⴰⴳⵡ" + - "ⵉⵢⴰⵏ ⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜⵖⴰⵏⴰⴰⴷⵔⴰⵔ ⵏ ⵟⴰⵕⵉⵇⴳⵔⵉⵍⴰⵏⴷⴳⴰⵎⴱⵢⴰⵖⵉⵏⵢⴰⴳⵡⴰⴷⴰⵍⵓⴱⵖⵉⵏⵢⴰ ⵏ " + - "ⵉⴽⵡⴰⴷⵓⵔⵍⵢⵓⵏⴰⵏⴳⵡⴰⵜⵉⵎⴰⵍⴰⴳⵡⴰⵎⵖⵉⵏⵢⴰ ⴱⵉⵙⴰⵡⴳⵡⵉⵢⴰⵏⴰⵀⵓⵏⴷⵓⵔⴰⵙⴽⵔⵡⴰⵜⵢⴰⵀⴰⵢⵜⵉⵀⵏ" + - "ⵖⴰⵔⵢⴰⴰⵏⴷⵓⵏⵉⵙⵢⴰⵉⵔⵍⴰⵏⴷⴰⵉⵙⵔⴰⵢⵉⵍⵍⵀⵉⵏⴷⵜⴰⵎⵏⴰⴹⵜ ⵜⴰⵏⴳⵍⵉⵣⵉⵜ ⵏ ⵓⴳⴰⵔⵓ ⴰⵀⵉⵏⴷⵉⵍ" + - "ⵄⵉⵔⴰⵇⵉⵔⴰⵏⵉⵙⵍⴰⵏⴷⵉⵟⴰⵍⵢⴰⵊⴰⵎⴰⵢⴽⴰⵍⵓⵔⴷⵓⵏⵍⵢⴰⴱⴰⵏⴽⵉⵏⵢⴰⴽⵉⵔⵖⵉⵣⵉⵙⵜⴰⵏⴽⴰⵎⴱⵓⴷⵢⴰⴽⵉ" + - "ⵔⵉⴱⴰⵜⵉⵇⵓⵎⵓⵔⵙⴰⵏⴽⵔⵉⵙ ⴷ ⵏⵉⴼⵉⵙⴽⵓⵔⵢⴰ ⵏ ⵉⵥⵥⵍⵎⴹⴽⵓⵔⵢⴰ ⵏ ⵉⴼⴼⵓⵙⵍⴽⵡⵉⵜⵜⵉⴳⵣⵉⵔⵉⵏ" + - " ⵏ ⴽⴰⵢⵎⴰⵏⴽⴰⵣⴰⵅⵙⵜⴰⵏⵍⴰⵡⵙⵍⵓⴱⵏⴰⵏⵙⴰⵏⵜⵍⵓⵙⵉⵍⵉⴽⵉⵏⵛⵜⴰⵢⵏⵙⵔⵉⵍⴰⵏⴽⴰⵍⵉⴱⵉⵔⵢⴰⵍⵉⵚⵓⵟⵓⵍ" + - "ⵉⵜⵡⴰⵏⵢⴰⵍⵓⴽⵙⴰⵏⴱⵓⵔⴳⵍⴰⵜⴼⵢⴰⵍⵉⴱⵢⴰⵍⵎⵖⵔⵉⴱⵎⵓⵏⴰⴽⵓⵎⵓⵍⴷⵓⴼⵢⴰⵎⴰⴷⴰⵖⴰⵛⵇⴰⵔⵜⵉⴳⵣⵉⵔⵉⵏ" + - " ⵏ ⵎⴰⵔⵛⴰⵍⵎⴰⵙⵉⴷⵓⵏⵢⴰⵎⴰⵍⵉⵎⵢⴰⵏⵎⴰⵔⵎⵏⵖⵓⵍⵢⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵎⴰⵔⵢⴰⵏ ⵏ ⵉⵥⵥⵍⵎⴹⵎⴰⵔⵜⵉⵏ" + - "ⵉⴽⵎⵓⵕⵉⵟⴰⵏⵢⴰⵎⵓⵏⵙⵉⵔⴰⵜⵎⴰⵍⵟⴰⵎⵓⵔⵉⵙⵎⴰⵍⴷⵉⴼⵎⴰⵍⴰⵡⵉⵎⵉⴽⵙⵉⴽⵎⴰⵍⵉⵣⵢⴰⵎⵓⵣⵏⴱⵉⵇⵏⴰⵎⵉⴱ" + - "ⵢⴰⴽⴰⵍⵉⴷⵓⵏⵢⴰ ⵜⴰⵎⴰⵢⵏⵓⵜⵏⵏⵉⵊⵉⵔⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵏⵓⵔⴼⵓⵍⴽⵏⵉⵊⵉⵔⵢⴰⵏⵉⴽⴰⵔⴰⴳⵡⴰⵀⵓⵍⴰⵏⴷ" + - "ⴰⵏⵏⵔⵡⵉⵊⵏⵉⴱⴰⵍⵏⴰⵡⵔⵓⵏⵉⵡⵉⵏⵢⵓⵣⵉⵍⴰⵏⴷⴰⵄⵓⵎⴰⵏⴱⴰⵏⴰⵎⴰⴱⵉⵔⵓⴱⵓⵍⵉⵏⵉⵣⵢⴰ ⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜ" + - "ⴱⴰⴱⵡⴰ ⵖⵉⵏⵢⴰ ⵜⴰⵎⴰⵢⵏⵓⵜⴼⵉⵍⵉⴱⴱⵉⵏⴱⴰⴽⵉⵙⵜⴰⵏⴱⵓⵍⵓⵏⵢⴰⵙⴰⵏⴱⵢⵉⵔ ⴷ ⵎⵉⴽⵍⵓⵏⴱⵉⵜⴽⴰⵢⵔ" + - "ⵏⴱⵓⵔⵜⵓ ⵔⵉⴽⵓⴰⴳⵎⵎⴰⴹ ⵏ ⵜⴰⴳⵓⵜ ⴷ ⵖⵣⵣⴰⴱⵕⵟⵇⵉⵣⴱⴰⵍⴰⵡⴱⴰⵔⴰⴳⵡⴰⵢⵇⴰⵜⴰⵔⵔⵉⵢⵓⵏⵢⵓⵏⵔⵓ" + - "ⵎⴰⵏⵢⴰⵔⵓⵙⵢⴰⵔⵡⴰⵏⴷⴰⵙⵙⴰⵄⵓⴷⵉⵢⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵙⴰⵍⵓⵎⴰⵏⵙⵙⵉⵛⵉⵍⵙⵙⵓⴷⴰⵏⵙⵙⵡⵉⴷⵙⵏⵖⴰⴼⵓ" + - "ⵔⴰⵙⴰⵏⵜⵉⵍⵉⵏⵙⵍⵓⴼⵉⵏⵢⴰⵙⵍⵓⴼⴰⴽⵢⴰⵙⵙⵉⵔⴰⵍⵢⵓⵏⵙⴰⵏⵎⴰⵔⵉⵏⵓⵙⵙⵉⵏⵉⴳⴰⵍⵚⵚⵓⵎⴰⵍⵙⵓⵔⵉⵏⴰⵎⵙ" + - "ⴰⵡⵟⵓⵎⵉ ⴷ ⴱⵔⴰⵏⵙⵉⴱⵙⴰⵍⴼⴰⴷⵓⵔⵙⵓⵔⵢⴰⵙⵡⴰⵣⵉⵍⴰⵏⴷⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵜⵓⵔⴽⵢⴰ ⴷ ⴽⴰⵢⴽⵜⵛⴰ" + - "ⴷⵟⵓⴳⵓⵟⴰⵢⵍⴰⵏⴷⵜⴰⴷⵊⴰⴽⵉⵙⵜⴰⵏⵟⵓⴽⵍⴰⵡⵜⵉⵎⵓⵔ ⵏ ⵍⵇⴱⵍⵜⵜⵓⵔⴽⵎⴰⵏⵙⵜⴰⵏⵜⵓⵏⵙⵟⵓⵏⴳⴰⵜⵓⵔⴽ" + - "ⵢⴰⵜⵔⵉⵏⵉⴷⴰⴷ ⴷ ⵟⵓⴱⴰⴳⵓⵜⵓⴼⴰⵍⵓⵟⴰⵢⵡⴰⵏⵟⴰⵏⵥⴰⵏⵢⴰⵓⴽⵔⴰⵏⵢⴰⵓⵖⴰⵏⴷⴰⵉⵡⵓⵏⴰⴽ ⵎⵓⵏⵏⵉⵏ " + - "ⵏ ⵎⵉⵔⵉⴽⴰⵏⵓⵔⵓⴳⵡⴰⵢⵓⵣⴱⴰⴽⵉⵙⵜⴰⵏⴰⵡⴰⵏⴽ ⵏ ⴼⴰⵜⵉⴽⴰⵏⵙⴰⵏⴼⴰⵏⵙⴰⵏ ⴷ ⴳⵔⵉⵏⴰⴷⵉⵏⴼⵉⵏⵣⵡ" + - "ⵉⵍⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵜⵉⵎⴳⴰⴷ ⵏ ⵏⵏⴳⵍⵉⵣⵜⵉⴳⵣⵉⵔⵉⵏ ⵜⵉⵎⴳⴰⴷ ⵏ ⵉⵡⵓⵏⴰⴽ ⵎⵓⵏⵏⵉⵏⴼⵉⵜⵏⴰⵎⴼⴰ" + - "ⵏⵡⴰⵟⵓⵡⴰⵍⵉⵙ ⴷ ⴼⵓⵜⵓⵏⴰⵙⴰⵎⵡⴰⵢⴰⵎⴰⵏⵎⴰⵢⵓⵟⴰⴼⵔⵉⵇⵢⴰ ⵏ ⵉⴼⴼⵓⵙⵣⴰⵎⴱⵢⴰⵣⵉⵎⴱⴰⴱⵡⵉ", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0012, 0x0027, 0x0045, 0x006e, 0x0080, 0x0095, - 0x00aa, 0x00bc, 0x00bc, 0x00d4, 0x0105, 0x0114, 0x012c, 0x013b, - 0x013b, 0x0156, 0x017c, 0x018e, 0x01a9, 0x01bb, 0x01dd, 0x01f2, - 0x0204, 0x0219, 0x0228, 0x0228, 0x023a, 0x0249, 0x025e, 0x025e, - 0x0270, 0x0285, 0x0297, 0x0297, 0x02af, 0x02ca, 0x02d9, 0x02eb, - 0x02eb, 0x033f, 0x0390, 0x039f, 0x03b1, 0x03cd, 0x03f3, 0x0402, - 0x0417, 0x0429, 0x0441, 0x0441, 0x045d, 0x0469, 0x049e, 0x049e, - 0x049e, 0x04b0, 0x04e4, 0x04f9, 0x04f9, 0x050e, 0x0523, 0x0538, - // Entry 40 - 7F - 0x0572, 0x0581, 0x0581, 0x0596, 0x05ab, 0x05b7, 0x05b7, 0x05cf, - 0x05e1, 0x05f6, 0x05f6, 0x05f6, 0x060e, 0x061d, 0x064c, 0x066a, - 0x066a, 0x067c, 0x068b, 0x06b0, 0x06c2, 0x06d4, 0x0705, 0x0705, - 0x0711, 0x0734, 0x0749, 0x075b, 0x076a, 0x0782, 0x07ab, 0x07bd, - 0x07bd, 0x07d8, 0x07e4, 0x0803, 0x0818, 0x0818, 0x0818, 0x0830, - 0x0845, 0x0854, 0x0869, 0x0869, 0x0884, 0x0899, 0x08ae, 0x08ae, - 0x08bd, 0x0915, 0x0927, 0x0933, 0x0945, 0x0957, 0x0957, 0x096c, - 0x097e, 0x0990, 0x099f, 0x09c0, 0x09d8, 0x09f0, 0x09ff, 0x0a28, - // Entry 80 - BF - 0x0a4e, 0x0a71, 0x0a80, 0x0aaf, 0x0aca, 0x0ad6, 0x0ae8, 0x0b00, - 0x0b1e, 0x0b36, 0x0b4b, 0x0b5d, 0x0b75, 0x0b93, 0x0ba5, 0x0bb4, - 0x0bc6, 0x0bd8, 0x0bf0, 0x0bf0, 0x0bf0, 0x0c0e, 0x0c3d, 0x0c58, - 0x0c64, 0x0c79, 0x0c8e, 0x0c8e, 0x0cd4, 0x0cec, 0x0d07, 0x0d1f, - 0x0d2e, 0x0d3d, 0x0d4f, 0x0d61, 0x0d73, 0x0d88, 0x0d9d, 0x0db2, - 0x0de6, 0x0df8, 0x0e2a, 0x0e3f, 0x0e5a, 0x0e6f, 0x0e81, 0x0e90, - 0x0e9f, 0x0eab, 0x0ec9, 0x0ed8, 0x0eea, 0x0ef6, 0x0f30, 0x0f68, - 0x0f80, 0x0f98, 0x0fad, 0x0fd9, 0x0ff1, 0x100d, 0x1044, 0x1056, - // Entry C0 - FF - 0x1065, 0x107d, 0x108c, 0x108c, 0x10a4, 0x10b9, 0x10b9, 0x10c8, - 0x10da, 0x10f5, 0x1127, 0x1139, 0x114b, 0x115a, 0x1172, 0x118a, - 0x11a2, 0x11a2, 0x11ba, 0x11d5, 0x11f0, 0x1208, 0x121a, 0x122f, - 0x122f, 0x125e, 0x1276, 0x1276, 0x1285, 0x12a3, 0x12a3, 0x12e3, - 0x12ef, 0x12ef, 0x12fb, 0x1310, 0x1331, 0x1343, 0x1366, 0x1387, - 0x1393, 0x13a2, 0x13b4, 0x13e3, 0x13f5, 0x1407, 0x141f, 0x1434, - 0x1446, 0x1446, 0x1446, 0x1485, 0x149a, 0x14b8, 0x14e1, 0x1519, - 0x1531, 0x1573, 0x15c8, 0x15da, 0x15ef, 0x1615, 0x1624, 0x1624, - // Entry 100 - 13F - 0x1633, 0x1642, 0x166b, 0x167d, 0x1695, - }, - }, - { // shi-Latn - "anduralimaratafɣanistanantiga d brbudaangilaalbanyaarminyaangulaarjantin" + - "samwa tamirikanitnnmsaustralyaarubaadrabijanbusna d hirsikbarbadbang" + - "ladicbljikaburkina fasublɣarabḥraynburundibininbrmudabrunibulibyabra" + - "zilbahamasbhutanbutswanabilarusyabilizkanadatagdudant tadimukratit n" + - " Kongotagdudant tanammast n ifriqyakunguswisrakut difwartigzirin n k" + - "ukccilikamirunccinwaculumbyakusta rikakubatigzirin n kabbirdiqubrust" + - "agdudant tatcikitalmanyadjibutidanmarkduminiktagdudant taduminiktdza" + - "yrikwaduristunyamiṣṛiritiryasbanyaityubyafillandafidjitigzirin n mal" + - "awimikrunizyafransagabuntagldit imunnɣrnaṭajurjyagwiyan tafransistɣa" + - "naadrar n ṭaṛiqgrilandgambyaɣinyagwadalubɣinya n ikwadurlyunangwatim" + - "alagwamɣinya bisawgwiyanahunduraskrwatyahaytihnɣaryaandunisyairlanda" + - "israyillhindtamnaḍt tanglizit n ugaru ahindilɛiraqiranislandiṭalyaja" + - "maykalurdunlyabankinyakirɣizistankambudyakiribaticumursankris d nifi" + - "skurya n iẓẓlmḍkurya n iffuslkwittigzirin n kaymankazaxstanlawslubna" + - "nsantlusilikinctaynsrilankalibiryaliṣuṭulitwanyaluksanburglatfyaliby" + - "almɣribmunakumuldufyamadaɣacqartigzirin n marcalmasidunyamalimyanmar" + - "mnɣulyatigzirin n maryan n iẓẓlmḍmartinikmuṛiṭanyamunsiratmalṭamuris" + - "maldifmalawimiksikmalizyamuznbiqnamibyakalidunya tamaynutnnijirtigzi" + - "rin n nurfulknijiryanikaragwahulandannrwijnibalnawruniwinyuzilandaɛu" + - "manbanamabirubulinizya tafransistbabwa ɣinya tamaynutfilibbinbakista" + - "nbulunyasanbyir d miklunbitkayrnburtu rikuagmmaḍ n tagut d ɣzzabṛṭqi" + - "zbalawbaragwayqatarriyunyunrumanyarusyarwandassaɛudiyatigzirin n sal" + - "umanssicilssudansswidsnɣafurasantilinslufinyaslufakyassiralyunsanmar" + - "inussinigalṣṣumalsurinamsawṭumi d bransibsalfadursuryaswazilandatigz" + - "irin n turkya d kayktcadṭuguṭaylandtadjakistanṭuklawtimur n lqblttur" + - "kmanstantunsṭungaturkyatrinidad d ṭubagutufaluṭaywanṭanẓanyaukranyau" + - "ɣandaiwunak munnin n mirikanurugwayuzbakistanawank n fatikansanfans" + - "an d grinadinfinzwilatigzirin timgad n nngliztigzirin timgad n iwuna" + - "k munninfitnamfanwaṭuwalis d futunasamwayamanmayuṭafriqya n iffuszam" + - "byazimbabwi", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x000d, 0x0018, 0x0027, 0x002d, 0x0034, - 0x003b, 0x0041, 0x0041, 0x0049, 0x005a, 0x005f, 0x0067, 0x006c, - 0x006c, 0x0075, 0x0083, 0x0089, 0x0092, 0x0098, 0x00a4, 0x00ab, - 0x00b3, 0x00ba, 0x00bf, 0x00bf, 0x00c5, 0x00ca, 0x00d1, 0x00d1, - 0x00d7, 0x00de, 0x00e4, 0x00e4, 0x00ec, 0x00f5, 0x00fa, 0x0100, - 0x0100, 0x011e, 0x013b, 0x0140, 0x0146, 0x0150, 0x015e, 0x0163, - 0x016a, 0x0170, 0x0178, 0x0178, 0x0182, 0x0186, 0x0199, 0x0199, - 0x0199, 0x019f, 0x01b1, 0x01b8, 0x01b8, 0x01bf, 0x01c6, 0x01cd, - // Entry 40 - 7F - 0x01e1, 0x01e6, 0x01e6, 0x01ed, 0x01f4, 0x01fc, 0x01fc, 0x0204, - 0x020a, 0x0211, 0x0211, 0x0211, 0x0219, 0x021e, 0x022f, 0x0239, - 0x0239, 0x023f, 0x0244, 0x0251, 0x025a, 0x0260, 0x0271, 0x0271, - 0x0276, 0x0287, 0x028e, 0x0294, 0x029a, 0x02a2, 0x02b2, 0x02b8, - 0x02b8, 0x02c1, 0x02c5, 0x02d1, 0x02d8, 0x02d8, 0x02d8, 0x02e0, - 0x02e7, 0x02ec, 0x02f4, 0x02f4, 0x02fd, 0x0304, 0x030b, 0x030b, - 0x0310, 0x0332, 0x0339, 0x033d, 0x0343, 0x034b, 0x034b, 0x0352, - 0x0358, 0x035e, 0x0363, 0x036f, 0x0377, 0x037f, 0x0384, 0x0393, - // Entry 80 - BF - 0x03a7, 0x03b4, 0x03b9, 0x03ca, 0x03d3, 0x03d7, 0x03dd, 0x03e5, - 0x03ef, 0x03f7, 0x03fe, 0x0408, 0x0410, 0x041a, 0x0420, 0x0425, - 0x042c, 0x0432, 0x043a, 0x043a, 0x043a, 0x0445, 0x0456, 0x045f, - 0x0463, 0x046a, 0x0472, 0x0472, 0x0492, 0x049a, 0x04a7, 0x04af, - 0x04b6, 0x04bb, 0x04c1, 0x04c7, 0x04cd, 0x04d4, 0x04db, 0x04e2, - 0x04f4, 0x04fa, 0x050c, 0x0513, 0x051c, 0x0523, 0x0529, 0x052e, - 0x0533, 0x0537, 0x0541, 0x0547, 0x054d, 0x0551, 0x0565, 0x057a, - 0x0582, 0x058a, 0x0591, 0x05a1, 0x05a9, 0x05b3, 0x05cb, 0x05d5, - // Entry C0 - FF - 0x05da, 0x05e2, 0x05e7, 0x05e7, 0x05ef, 0x05f6, 0x05f6, 0x05fb, - 0x0601, 0x060b, 0x061d, 0x0623, 0x0629, 0x062e, 0x0637, 0x063f, - 0x0647, 0x0647, 0x064f, 0x0658, 0x0661, 0x0669, 0x0673, 0x067a, - 0x067a, 0x068d, 0x0695, 0x0695, 0x069a, 0x06a4, 0x06a4, 0x06bc, - 0x06c0, 0x06c0, 0x06c6, 0x06cf, 0x06da, 0x06e2, 0x06ef, 0x06fa, - 0x06fe, 0x0705, 0x070b, 0x071e, 0x0724, 0x072c, 0x0738, 0x073f, - 0x0746, 0x0746, 0x0746, 0x075d, 0x0764, 0x076e, 0x077d, 0x0791, - 0x0799, 0x07b1, 0x07d0, 0x07d6, 0x07df, 0x07ed, 0x07f2, 0x07f2, - // Entry 100 - 13F - 0x07f7, 0x07fe, 0x080d, 0x0813, 0x081b, - }, - }, - { // si - siRegionStr, - siRegionIdx, - }, - { // sk - skRegionStr, - skRegionIdx, - }, - { // sl - slRegionStr, - slRegionIdx, - }, - { // smn - "Ascension-suáluiAndorraArabiemirkodehAfganistanAntigua já BarbudaAnguill" + - "aAlbaniaArmeniaAngolaAntarktisArgentinaAmerika SamoaNuorttâriijkâAus" + - "traliaArubaVuáskueennâmAzerbaidžanBosnia já HerzegovinaBarbadosBangl" + - "adeshBelgiaBurkina FasoBulgariaBahrainBurundiBeninSt. BarthélemyBerm" + - "udaBruneiBoliviaBrasiliaBahamaBhutanBouvetsuáluiBotswanaVielgis-Ruoš" + - "šâBelizeKanadaKookossuolluuh (Keelingsuolluuh)Koskâ-Afrika täsiväld" + - "iSveitsiCôte d’IvoireCooksuolluuhChileKamerunKiinaKolumbiaClipperton" + - "suáluiCosta RicaKuubaCape VerdeCuraçaoJuovlâsuáluiKyprosTšekkiSaksaD" + - "iego GarciaDjiboutiTanskaDominicaDominikaanisâš täsiväldiAlgeriaCeut" + - "a já MelillaEcuadorEestieennâmEgyptiEritreaEspanjaEtiopiaSuomâFidžiF" + - "alklandsuolluuhMikronesia littoväldiFärsuolluuhRanskaGabonOvtâstum K" + - "unâgâskoddeGrenadaGeorgiaRanska GuyanaGuernseyGhanaGibraltarGrönland" + - "GambiaGuineaGuadeloupePeeivitäsideijee GuineaKreikkaMaadâ-Georgia já" + - " Máddááh SandwichsuolluuhGuatemalaGuamGuinea-BissauGuyanaHongkong – " + - "Kiina e.h.k.Heard já McDonaldsuolluuhHondurasKroatiaHaitiUŋgarKanari" + - "asuolluuhIndonesiaIrlandIsraelMansuáluiIndiaBrittilâš India väldimee" + - "râ kuávluIrakIranIslandItaliaJerseyJamaikaJordanJaapaanKeniaKirgisia" + - "KambodžaKiribatiKomorehSt. Kitts já NevisTave-KoreaMaadâ-KoreaKuwait" + - "CaymansuolluuhKazakstanLaosLibanonSt. LuciaLiechtensteinSri LankaLib" + - "eriaLesothoLiettuaLuxemburgLatviaLibyaMarokkoMonacoMoldovaMontenegro" + - "St. MartinMadagaskarMarshallsuolluuhMaliMyanmar (Burma)MongoliaMacao" + - " - – Kiina e.h.k.Tave-MarianehMartiniqueMauritaniaMontserratMaltaMau" + - "ritiusMaledivehMalawiMeksikoMalaysiaMosambikNamibiaUđđâ-KaledoniaNig" + - "erNorfolksuáluiNigeriaNicaraguaVuáládâhenâmehTaažâNepalNauruNiueUđđâ" + - "-SeelandOmanPanamaPeruRanska PolynesiaPapua-Uđđâ-GuineaFilipinehPaki" + - "stanPuolaSt. Pierre já MiquelonPitcairnPuerto RicoPortugalPalauParag" + - "uayQatarRéunionRomaniaSerbiaRuoššâRuandaSaudi ArabiaSalomosuolluuhSe" + - "ychellehSudanRuotâSingaporeSaint HelenaSloveniaČokkeväärih já Jan Ma" + - "yenSlovakiaSierra LeoneSan MarinoSenegalSomaliaSurinamMaadâ-SudanSão" + - " Tomé já PríncipeEl SalvadorSint MaartenSyriaSwazieennâmTristan da C" + - "unhaTurks- já CaicossuolluuhTšadRanska máddááh kuávluhTogoThaieennâm" + - "TadžikistanTokelauTimor-LesteTurkmenistanTunisiaTongaTurkkiTrinidad " + - "já TobagoTuvaluTaiwanTansaniaUkrainaUgandaOvtâstum Staatâi sierânâss" + - "uolluuhOvtâstum StaatahUruguayUzbekistanVatikanSt. Vincent já Grenad" + - "inesVenezuelaBrittiliih NieidâsuolluuhOvtâstum Staatâi Nieidâsuolluu" + - "hVietnamVanuatuWallis já FutunaSamoaKosovoJemenMayotteMaadâ-AfrikkaS" + - "ambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0011, 0x0018, 0x0026, 0x0030, 0x0043, 0x004b, 0x0052, - 0x0059, 0x005f, 0x0068, 0x0071, 0x007e, 0x008d, 0x0096, 0x009b, - 0x00a9, 0x00b5, 0x00cb, 0x00d3, 0x00dd, 0x00e3, 0x00ef, 0x00f7, - 0x00fe, 0x0105, 0x010a, 0x0119, 0x0120, 0x0126, 0x012d, 0x012d, - 0x0135, 0x013b, 0x0141, 0x014e, 0x0156, 0x0167, 0x016d, 0x0173, - 0x0193, 0x0193, 0x01ac, 0x01ac, 0x01b3, 0x01c3, 0x01cf, 0x01d4, - 0x01db, 0x01e0, 0x01e8, 0x01f9, 0x0203, 0x0208, 0x0212, 0x021a, - 0x0228, 0x022e, 0x0235, 0x023a, 0x0246, 0x024e, 0x0254, 0x025c, - // Entry 40 - 7F - 0x0278, 0x027f, 0x0290, 0x0297, 0x02a3, 0x02a9, 0x02a9, 0x02b0, - 0x02b7, 0x02be, 0x02be, 0x02be, 0x02c4, 0x02ca, 0x02da, 0x02f0, - 0x02fc, 0x0302, 0x0307, 0x031f, 0x0326, 0x032d, 0x033a, 0x0342, - 0x0347, 0x0350, 0x0359, 0x035f, 0x0365, 0x036f, 0x0387, 0x038e, - 0x03bc, 0x03c5, 0x03c9, 0x03d6, 0x03dc, 0x03f5, 0x040f, 0x0417, - 0x041e, 0x0423, 0x0429, 0x0438, 0x0441, 0x0447, 0x044d, 0x0457, - 0x045c, 0x0482, 0x0486, 0x048a, 0x0490, 0x0496, 0x049c, 0x04a3, - 0x04a9, 0x04b0, 0x04b5, 0x04bd, 0x04c6, 0x04ce, 0x04d5, 0x04e8, - // Entry 80 - BF - 0x04f2, 0x04fe, 0x0504, 0x0512, 0x051b, 0x051f, 0x0526, 0x052f, - 0x053c, 0x0545, 0x054c, 0x0553, 0x055a, 0x0563, 0x0569, 0x056e, - 0x0575, 0x057b, 0x0582, 0x058c, 0x0596, 0x05a0, 0x05b0, 0x05b0, - 0x05b4, 0x05c3, 0x05cb, 0x05e3, 0x05f0, 0x05fa, 0x0604, 0x060e, - 0x0613, 0x061c, 0x0625, 0x062b, 0x0632, 0x063a, 0x0642, 0x0649, - 0x065a, 0x065f, 0x066d, 0x0674, 0x067d, 0x068f, 0x0696, 0x069b, - 0x06a0, 0x06a4, 0x06b3, 0x06b7, 0x06bd, 0x06c1, 0x06d1, 0x06e5, - 0x06ee, 0x06f6, 0x06fb, 0x0712, 0x071a, 0x0725, 0x0725, 0x072d, - // Entry C0 - FF - 0x0732, 0x073a, 0x073f, 0x073f, 0x0747, 0x074e, 0x0754, 0x075d, - 0x0763, 0x076f, 0x077d, 0x0787, 0x078c, 0x0792, 0x079b, 0x07a7, - 0x07af, 0x07cb, 0x07d3, 0x07df, 0x07e9, 0x07f0, 0x07f7, 0x07fe, - 0x080a, 0x0822, 0x082d, 0x0839, 0x083e, 0x084a, 0x085a, 0x0873, - 0x0878, 0x0892, 0x0896, 0x08a1, 0x08ad, 0x08b4, 0x08bf, 0x08cb, - 0x08d2, 0x08d7, 0x08dd, 0x08f0, 0x08f6, 0x08fc, 0x0904, 0x090b, - 0x0911, 0x0936, 0x0936, 0x0947, 0x094e, 0x0958, 0x095f, 0x0979, - 0x0982, 0x099c, 0x09be, 0x09c5, 0x09cc, 0x09dd, 0x09e2, 0x09e8, - // Entry 100 - 13F - 0x09ed, 0x09f4, 0x0a02, 0x0a08, 0x0a10, - }, - }, - { // sn - "AndoraUnited Arab EmiratesAfuganistaniAntigua ne BarbudaAnguilaAlbaniaAr" + - "meniaAngolaAjentinaSamoa ye AmerikaAustriaAustraliaArubhaAzabajaniBo" + - "znia ne HerzegovinaBarbadosBangladeshiBeljiumBukinafasoBulgariaBahar" + - "eniBurundiBeniniBermudaBuruneiBoliviaBrazilBahamaBhutaniBotswanaBela" + - "rusiBelizeKanadaDemocratic Republic of the CongoCentral African Repu" + - "blicKongoSwitzerlandIvory CoastZvitsuwa zveCookChileKameruniChinaKol" + - "ombiaKostarikaCubaZvitsuwa zveCape VerdeCyprusCzech RepublicGermanyD" + - "jiboutiDenmarkDominicaDominican RepublicAljeriaEcuadorEstoniaEgyptEr" + - "itreaSpainEtiopiaFinlandFijiZvitsuwa zveFalklandsMicronesiaFranceGab" + - "onUnited KingdomGrenadaGeorgiaFrench GuianaGhanaGibraltarGreenlandGa" + - "mbiaGuineaGuadeloupeEquatorial GuineaGreeceGuatemalaGuamGuinea-Bissa" + - "uGuyanaHondurasKorasiaHaitiHungaryIndonesiaIrelandIzuraeriIndiaBriti" + - "sh Indian Ocean TerritoryIraqIranIcelandItalyJamaicaJordanJapanKenya" + - "KyrgyzstanKambodiaKiribatiKomoroSaint Kitts and NevisKorea, NorthKor" + - "ea, SouthKuwaitZvitsuwa zveCaymanKazakhstanLaosLebanonSaint LuciaLie" + - "chtensteinSri LankaLiberiaLesothoLithuaniaLuxembourgLatviaLibyaMoroc" + - "coMonacoMoldovaMadagascarZvitsuwa zveMarshallMacedoniaMaliMyanmarMon" + - "goliaZvitsuwa zvekumaodzanyemba eMarianaMartiniqueMauritaniaMontserr" + - "atMaltaMauritiusMaldivesMalawiMexicoMalaysiaMozambiqueNamibiaNew Cal" + - "edoniaNigerChitsuwa cheNorfolkNigeriaNicaraguaNetherlandsNorwayNepal" + - "NauruNiueNew ZealandOmanPanamaPeruFrench PolynesiaPapua New GuineaPh" + - "ilippinesPakistanPolandSaint Pierre and MiquelonPitcairnPuerto RicoP" + - "ortugalPalauParaguayQatarRéunionRomaniaRussiaRwandaSaudi ArabiaZvits" + - "uwa zvaSolomonSeychellesSudanSwedenSingaporeSaint HelenaSloveniaSlov" + - "akiaSierra LeoneSan MarinoSenegalSomaliaSurinameSão Tomé and Príncip" + - "eEl SalvadorSyriaSwazilandZvitsuwa zveTurk neCaicoChadiTogoThailandT" + - "ajikistanTokelauEast TimorTurkmenistanTunisiaTongaTurkeyTrinidad and" + - " TobagoTuvaluTaiwanTanzaniaUkraineUgandaAmerikaUruguayUzbekistanVati" + - "can StateSaint Vincent and the GrenadinesVenezuelaZvitsuwa zveHingir" + - "andiZvitsuwa zveAmerikaVietnamVanuatuWallis and FutunaSamoaYemenMayo" + - "tteSouth AfricaZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x001a, 0x0026, 0x0038, 0x003f, 0x0046, - 0x004d, 0x0053, 0x0053, 0x005b, 0x006b, 0x0072, 0x007b, 0x0081, - 0x0081, 0x008a, 0x009f, 0x00a7, 0x00b2, 0x00b9, 0x00c3, 0x00cb, - 0x00d3, 0x00da, 0x00e0, 0x00e0, 0x00e7, 0x00ee, 0x00f5, 0x00f5, - 0x00fb, 0x0101, 0x0108, 0x0108, 0x0110, 0x0118, 0x011e, 0x0124, - 0x0124, 0x0144, 0x015c, 0x0161, 0x016c, 0x0177, 0x0187, 0x018c, - 0x0194, 0x0199, 0x01a1, 0x01a1, 0x01aa, 0x01ae, 0x01c4, 0x01c4, - 0x01c4, 0x01ca, 0x01d8, 0x01df, 0x01df, 0x01e7, 0x01ee, 0x01f6, - // Entry 40 - 7F - 0x0208, 0x020f, 0x020f, 0x0216, 0x021d, 0x0222, 0x0222, 0x0229, - 0x022e, 0x0235, 0x0235, 0x0235, 0x023c, 0x0240, 0x0255, 0x025f, - 0x025f, 0x0265, 0x026a, 0x0278, 0x027f, 0x0286, 0x0293, 0x0293, - 0x0298, 0x02a1, 0x02aa, 0x02b0, 0x02b6, 0x02c0, 0x02d1, 0x02d7, - 0x02d7, 0x02e0, 0x02e4, 0x02f1, 0x02f7, 0x02f7, 0x02f7, 0x02ff, - 0x0306, 0x030b, 0x0312, 0x0312, 0x031b, 0x0322, 0x032a, 0x032a, - 0x032f, 0x034d, 0x0351, 0x0355, 0x035c, 0x0361, 0x0361, 0x0368, - 0x036e, 0x0373, 0x0378, 0x0382, 0x038a, 0x0392, 0x0398, 0x03ad, - // Entry 80 - BF - 0x03b9, 0x03c5, 0x03cb, 0x03dd, 0x03e7, 0x03eb, 0x03f2, 0x03fd, - 0x040a, 0x0413, 0x041a, 0x0421, 0x042a, 0x0434, 0x043a, 0x043f, - 0x0446, 0x044c, 0x0453, 0x0453, 0x0453, 0x045d, 0x0471, 0x047a, - 0x047e, 0x0485, 0x048d, 0x048d, 0x04b0, 0x04ba, 0x04c4, 0x04ce, - 0x04d3, 0x04dc, 0x04e4, 0x04ea, 0x04f0, 0x04f8, 0x0502, 0x0509, - 0x0516, 0x051b, 0x052e, 0x0535, 0x053e, 0x0549, 0x054f, 0x0554, - 0x0559, 0x055d, 0x0568, 0x056c, 0x0572, 0x0576, 0x0586, 0x0596, - 0x05a1, 0x05a9, 0x05af, 0x05c8, 0x05d0, 0x05db, 0x05db, 0x05e3, - // Entry C0 - FF - 0x05e8, 0x05f0, 0x05f5, 0x05f5, 0x05fd, 0x0604, 0x0604, 0x060a, - 0x0610, 0x061c, 0x062f, 0x0639, 0x063e, 0x0644, 0x064d, 0x0659, - 0x0661, 0x0661, 0x0669, 0x0675, 0x067f, 0x0686, 0x068d, 0x0695, - 0x0695, 0x06ad, 0x06b8, 0x06b8, 0x06bd, 0x06c6, 0x06c6, 0x06de, - 0x06e3, 0x06e3, 0x06e7, 0x06ef, 0x06f9, 0x0700, 0x070a, 0x0716, - 0x071d, 0x0722, 0x0728, 0x073b, 0x0741, 0x0747, 0x074f, 0x0756, - 0x075c, 0x075c, 0x075c, 0x0763, 0x076a, 0x0774, 0x0781, 0x07a1, - 0x07aa, 0x07c0, 0x07d3, 0x07da, 0x07e1, 0x07f2, 0x07f7, 0x07f7, - // Entry 100 - 13F - 0x07fc, 0x0803, 0x080f, 0x0815, 0x081d, - }, - }, - { // so - "AndoraImaaraadka Carabta ee MidoobayAfgaanistaanAntigua iyo BarbudaAngui" + - "llaAlbaaniyaArmeeniyaAngoolaArjantiinSamowa AmeerikaAwsteriyaAwstara" + - "aliyaArubaAzerbajaanBosniya HersigoviinaBaarbadoosBangaaladheeshBilj" + - "amBurkiina FaasoBulgaariyaBaxreynBurundiBiniinBermuudaBuruneeyaBolii" + - "fiyaBraasiilBahaamasBhutanBotuswaanaBelarusBelizeKanadaJamhuuriyadda" + - " Dimuquraadiga KongoJamhuuriyadda Afrikada DhexeKongoSwiiserlaandIvo" + - "ry coastJaziiradda CookJiliKaameruunShiinahaKolombiyaKosta RiikaKuub" + - "aCape Verde IslandsQubrusJamhuuriyadda JekJarmalJabuutiDenmarkDomeen" + - "ikaJamhuuriyadda DomeenikaAljeeriyaIkuwadoorEstooniyaMasarEretereeya" + - "IsbeynItoobiyaFinlandFijiJaziiradaha FooklaanMicronesiaFaransiisGaab" + - "oonUnited KingdomGiriinaadaJoorjiyaFrench GuianaGaanaGibraltarGreenl" + - "andGambiyaGiniGuadeloupeEquatorial GuineaGiriigGuwaatamaalaGuamGini-" + - "BisaawGuyanaHondurasKorweeshiyaHaytiHangeriIndoneesiyaAyrlaandIsraaʼ" + - "iilHindiyaBritish Indian Ocean TerritoryCiraaqIiraanIislaandTalyaani" + - "JameykaUrdunJabaanKiiniyaKirgistaanKamboodiyaKiribatiKomoorosSaint K" + - "itts and NevisKuuriyada WaqooyiKuuriyada KoonfureedKuwaytCayman Isla" + - "ndsKasaakhistaanLaosLubnaanSaint LuciaLiechtensteinSirilaankaLaybeer" + - "iyaLosootoLituweeniyaLuksemboorgLatfiyaLiibiyaMarookoMoonakoMoldofaM" + - "adagaskarMarshall IslandsMakadooniyaMaaliMiyanmarMongooliyaNorthern " + - "Mariana IslandsMartiniqueMuritaaniyaMontserratMaaldaMurishiyoosMaald" + - "iqeenMalaawiMeksikoMalaysiaMusambiigNamiibiyaNew CaledoniaNayjerNorf" + - "olk IslandNayjeeriyaNikaraaguwaNetherlandsNoorweeyNebaalNauruNiueNey" + - "uusilaandCumaanPanamaPeruFrench PolynesiaPapua New GuineaFilibiinBak" + - "istaanBoolandSaint Pierre and MiquelonPitcairnPuerto RicoFalastiin D" + - "aanka galbeed iyo QasaBortuqaalPalauParaguayQadarRéunionRumaaniyaRuu" + - "shRuwandaSacuudi CarabiyaSolomon IslandsSishelisSuudaanIswidhanSinga" + - "boorSaint HelenaSloveniaSlovakiaSiraaliyoonSan MarinoSinigaalSoomaal" + - "iyaSurinameSão Tomé and PríncipeEl SalvadorSuuriyaIswaasilaandTurks " + - "and Caicos IslandsJaadToogoTaylaandTajikistanTokelauTimorka bariTurk" + - "menistanTuniisiyaTongaTurkiTrinidad and TobagoTuvaluTaywaanTansaaniy" + - "aUkraynUgaandaMaraykankaUruguwaayUusbakistaanFaatikaanSaint Vincent " + - "and the GrenadinesFenisuweelaBritish Virgin IslandsU.S. Virgin Islan" + - "dsFiyetnaamVanuatuWallis and FutunaSamoaYamanMayotteKoonfur AfrikaSa" + - "ambiyaSimbaabweFar aan la aqoon amase aan saxnayn", - []uint16{ // 262 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0024, 0x0030, 0x0043, 0x004b, 0x0054, - 0x005d, 0x0064, 0x0064, 0x006d, 0x007c, 0x0085, 0x0091, 0x0096, - 0x0096, 0x00a0, 0x00b4, 0x00be, 0x00cc, 0x00d2, 0x00e0, 0x00ea, - 0x00f1, 0x00f8, 0x00fe, 0x00fe, 0x0106, 0x010f, 0x0118, 0x0118, - 0x0120, 0x0128, 0x012e, 0x012e, 0x0138, 0x013f, 0x0145, 0x014b, - 0x014b, 0x016c, 0x0188, 0x018d, 0x0199, 0x01a4, 0x01b3, 0x01b7, - 0x01c0, 0x01c8, 0x01d1, 0x01d1, 0x01dc, 0x01e1, 0x01f3, 0x01f3, - 0x01f3, 0x01f9, 0x020a, 0x0210, 0x0210, 0x0217, 0x021e, 0x0227, - // Entry 40 - 7F - 0x023e, 0x0247, 0x0247, 0x0250, 0x0259, 0x025e, 0x025e, 0x0268, - 0x026e, 0x0276, 0x0276, 0x0276, 0x027d, 0x0281, 0x0295, 0x029f, - 0x029f, 0x02a8, 0x02af, 0x02bd, 0x02c7, 0x02cf, 0x02dc, 0x02dc, - 0x02e1, 0x02ea, 0x02f3, 0x02fa, 0x02fe, 0x0308, 0x0319, 0x031f, - 0x031f, 0x032b, 0x032f, 0x033a, 0x0340, 0x0340, 0x0340, 0x0348, - 0x0353, 0x0358, 0x035f, 0x035f, 0x036a, 0x0372, 0x037c, 0x037c, - 0x0383, 0x03a1, 0x03a7, 0x03ad, 0x03b5, 0x03bd, 0x03bd, 0x03c4, - 0x03c9, 0x03cf, 0x03d6, 0x03e0, 0x03ea, 0x03f2, 0x03fa, 0x040f, - // Entry 80 - BF - 0x0420, 0x0434, 0x043a, 0x0448, 0x0455, 0x0459, 0x0460, 0x046b, - 0x0478, 0x0482, 0x048c, 0x0493, 0x049e, 0x04a9, 0x04b0, 0x04b7, - 0x04be, 0x04c5, 0x04cc, 0x04cc, 0x04cc, 0x04d6, 0x04e6, 0x04f1, - 0x04f6, 0x04fe, 0x0508, 0x0508, 0x0520, 0x052a, 0x0535, 0x053f, - 0x0545, 0x0550, 0x055a, 0x0561, 0x0568, 0x0570, 0x0579, 0x0582, - 0x058f, 0x0595, 0x05a3, 0x05ad, 0x05b8, 0x05c3, 0x05cb, 0x05d1, - 0x05d6, 0x05da, 0x05e6, 0x05ec, 0x05f2, 0x05f6, 0x0606, 0x0616, - 0x061e, 0x0627, 0x062e, 0x0647, 0x064f, 0x065a, 0x067b, 0x0684, - // Entry C0 - FF - 0x0689, 0x0691, 0x0696, 0x0696, 0x069e, 0x06a7, 0x06a7, 0x06ac, - 0x06b3, 0x06c3, 0x06d2, 0x06da, 0x06e1, 0x06e9, 0x06f2, 0x06fe, - 0x0706, 0x0706, 0x070e, 0x0719, 0x0723, 0x072b, 0x0735, 0x073d, - 0x073d, 0x0755, 0x0760, 0x0760, 0x0767, 0x0773, 0x0773, 0x078b, - 0x078f, 0x078f, 0x0794, 0x079c, 0x07a6, 0x07ad, 0x07b9, 0x07c5, - 0x07ce, 0x07d3, 0x07d8, 0x07eb, 0x07f1, 0x07f8, 0x0802, 0x0808, - 0x080f, 0x080f, 0x080f, 0x0819, 0x0822, 0x082e, 0x0837, 0x0857, - 0x0862, 0x0878, 0x088b, 0x0894, 0x089b, 0x08ac, 0x08b1, 0x08b1, - // Entry 100 - 13F - 0x08b6, 0x08bd, 0x08cb, 0x08d3, 0x08dc, 0x08fe, - }, - }, - { // sq - sqRegionStr, - sqRegionIdx, - }, - { // sr - srRegionStr, - srRegionIdx, - }, - { // sr-Cyrl-BA - "БјелорусијаКонгоОбала Слоноваче (Кот д’Ивоар)Кабо ВердеЧешка РепубликаЊе" + - "мачкаСвети Китс и НевисСАР МакаоСвети Пјер и МикелонРеунионТимор-Ле" + - "сте (Источни Тимор)Мања удаљена острва САДСвети Винсент и Гренадини" + - "Британска Дјевичанска ОстрваАмеричка Дјевичанска Острва", - []uint16{ // 251 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0016, 0x0016, 0x0016, - 0x0016, 0x0016, 0x0016, 0x0020, 0x0020, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0069, 0x0069, - 0x0069, 0x0069, 0x0086, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - // Entry 40 - 7F - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, - 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x00b5, - // Entry 80 - BF - 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, - 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, - 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, 0x00b5, - 0x00b5, 0x00b5, 0x00b5, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, - 0x00c6, 0x00c6, 0x00c6, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, - // Entry C0 - FF - 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00f9, 0x00f9, 0x00f9, 0x00f9, - 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, - 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, - 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, - 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x012a, 0x012a, - 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, - 0x012a, 0x0155, 0x0155, 0x0155, 0x0155, 0x0155, 0x0155, 0x0184, - 0x0184, 0x01ba, 0x01ee, - }, - }, - { // sr-Cyrl-ME - "БјелорусијаКонгоОбала Слоноваче (Кот д’Ивоар)Чешка РепубликаЊемачкаСвети" + - " Китс и НевисСвети Пјер и МикелонРеунионТимор-Лесте (Источни Тимор)М" + - "ања удаљена острва САДСвети Винсент и ГренадиниБританска Дјевичанск" + - "а ОстрваАмеричка Дјевичанска Острва", - []uint16{ // 251 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0016, 0x0016, 0x0016, - 0x0016, 0x0016, 0x0016, 0x0020, 0x0020, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, - 0x0056, 0x0056, 0x0073, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - // Entry 40 - 7F - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x00a2, - // Entry 80 - BF - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, - 0x00a2, 0x00a2, 0x00a2, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, - // Entry C0 - FF - 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x0106, 0x0106, - 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, - 0x0106, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0160, - 0x0160, 0x0196, 0x01ca, - }, - }, - { // sr-Cyrl-XK - "КонгоОбала Слоноваче (Кот д’Ивоар)Кабо ВердеЧешка РепубликаСАР ХонгконгС" + - "вети Китс и НевисСАР МакаоСвети Пјер и МикелонРеунионТимор-Лесте (И" + - "сточни Тимор)Мања удаљена острва САДСвети Винсент и Гренадини", - []uint16{ // 248 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0053, 0x0053, - 0x0053, 0x0053, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - // Entry 40 - 7F - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, - 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x00a8, - // Entry 80 - BF - 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, - 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, - 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, - 0x00a8, 0x00a8, 0x00a8, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, - 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, - 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, - 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, - 0x00b9, 0x00b9, 0x00b9, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - // Entry C0 - FF - 0x00de, 0x00de, 0x00de, 0x00de, 0x00ec, 0x00ec, 0x00ec, 0x00ec, - 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, - 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, - 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, - 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x011d, 0x011d, - 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, - 0x011d, 0x0148, 0x0148, 0x0148, 0x0148, 0x0148, 0x0148, 0x0177, - }, - }, - { // sr-Latn - srLatnRegionStr, - srLatnRegionIdx, - }, - { // sr-Latn-BA - "BjelorusijaKongoObala Slonovače (Kot d’Ivoar)Kabo VerdeČeška RepublikaNj" + - "emačkaSveti Kits i NevisSAR MakaoSveti Pjer i MikelonReunionTimor-Le" + - "ste (Istočni Timor)Manja udaljena ostrva SADSveti Vinsent i Grenadin" + - "iBritanska Djevičanska OstrvaAmerička Djevičanska Ostrva", - []uint16{ // 251 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000b, 0x000b, 0x000b, - 0x000b, 0x000b, 0x000b, 0x0010, 0x0010, 0x0030, 0x0030, 0x0030, - 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x003a, 0x003a, - 0x003a, 0x003a, 0x004b, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - // Entry 40 - 7F - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0066, - // Entry 80 - BF - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, - 0x0066, 0x0066, 0x0066, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, - 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, - 0x006f, 0x006f, 0x006f, 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, - // Entry C0 - FF - 0x0083, 0x0083, 0x0083, 0x0083, 0x008a, 0x008a, 0x008a, 0x008a, - 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, - 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, - 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, - 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x00a6, 0x00a6, - 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, - 0x00a6, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00d8, - 0x00d8, 0x00f5, 0x0112, - }, - }, - { // sr-Latn-ME - "BjelorusijaKongoObala Slonovače (Kot d’Ivoar)Češka RepublikaNjemačkaSvet" + - "i Kits i NevisSveti Pjer i MikelonReunionTimor-Leste (Istočni Timor)" + - "Manja udaljena ostrva SADSveti Vinsent i GrenadiniBritanska Djevičan" + - "ska OstrvaAmerička Djevičanska Ostrva", - []uint16{ // 251 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000b, 0x000b, 0x000b, - 0x000b, 0x000b, 0x000b, 0x0010, 0x0010, 0x0030, 0x0030, 0x0030, - 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, - 0x0030, 0x0030, 0x0041, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - // Entry 40 - 7F - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, - 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x005c, - // Entry 80 - BF - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, 0x005c, - 0x005c, 0x005c, 0x005c, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, - // Entry C0 - FF - 0x0070, 0x0070, 0x0070, 0x0070, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, - 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x0093, 0x0093, - 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, - 0x0093, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00c5, - 0x00c5, 0x00e2, 0x00ff, - }, - }, - { // sr-Latn-XK - "KongoObala Slonovače (Kot d’Ivoar)Kabo VerdeČeška RepublikaSAR HongkongS" + - "veti Kits i NevisSAR MakaoSveti Pjer i MikelonReunionTimor-Leste (Is" + - "točni Timor)Manja udaljena ostrva SADSveti Vinsent i Grenadini", - []uint16{ // 248 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0005, 0x0005, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x002f, 0x002f, - 0x002f, 0x002f, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - // Entry 40 - 7F - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x004c, 0x004c, 0x004c, - 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, - 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, - 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x005e, - // Entry 80 - BF - 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, - 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, - 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, - 0x005e, 0x005e, 0x005e, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, - 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, - 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, - 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, - 0x0067, 0x0067, 0x0067, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, - // Entry C0 - FF - 0x007b, 0x007b, 0x007b, 0x007b, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, - 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x009e, 0x009e, - 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, - 0x009e, 0x00b7, 0x00b7, 0x00b7, 0x00b7, 0x00b7, 0x00b7, 0x00d0, - }, - }, - { // sv - svRegionStr, - svRegionIdx, - }, - {}, // sv-FI - { // sw - swRegionStr, - swRegionIdx, - }, - { // sw-CD - "AfuganistaniAzabajaniBeniniKodivaaKisiwa cha ChristmasSaiprasiDenmakiKro" + - "eshiaYordaniLebanoniLishenteniLasembagiLativiaMorokoMyamaMaldiviNije" + - "riNijeriaNorweNepaliOmaniPuetorikoKatariSudaniSao Tome na PrinsipeCh" + - "adiTimori ya MasharikiVietnamuAsia Mashariki", - []uint16{ // 277 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x000c, 0x000c, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, - 0x000c, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, - 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x0022, 0x0022, 0x0022, - 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, - 0x0036, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x0045, 0x0045, - // Entry 40 - 7F - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, - // Entry 80 - BF - 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x005c, 0x005c, - 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x006f, 0x0076, 0x0076, - 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, - 0x007c, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, - 0x0081, 0x0081, 0x0088, 0x0088, 0x0088, 0x0088, 0x0088, 0x0088, - 0x0088, 0x008e, 0x008e, 0x0095, 0x0095, 0x0095, 0x009a, 0x00a0, - 0x00a0, 0x00a0, 0x00a0, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, - 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00ae, 0x00ae, 0x00ae, - // Entry C0 - FF - 0x00ae, 0x00ae, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, - 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00ba, 0x00ba, 0x00ba, 0x00ba, - 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00ba, - 0x00ba, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, - 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00e6, 0x00e6, - 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, - 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, - 0x00e6, 0x00e6, 0x00e6, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, - // Entry 100 - 13F - 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, - 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, - 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00fc, - }, - }, - { // sw-KE - "AzabajaniIvorikostiKisiwa cha ChristmasSaiprasiGwadelupeYordaniLebanoniL" + - "ishtensteniLesothoLasembagiLativiaMaldiviNijerNijeriaNorweNepaliOman" + - "iPuetorikoKatariSurinameSao Tome na PrinsipeChadiVietnamu", - []uint16{ // 252 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0013, 0x0013, 0x0013, - 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, - 0x0027, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - // Entry 40 - 7F - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, - 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, - // Entry 80 - BF - 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x0047, 0x0047, - 0x0053, 0x0053, 0x0053, 0x005a, 0x005a, 0x0063, 0x006a, 0x006a, - 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, - 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, - 0x006a, 0x006a, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, - 0x0071, 0x0076, 0x0076, 0x007d, 0x007d, 0x007d, 0x0082, 0x0088, - 0x0088, 0x0088, 0x0088, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, - 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, 0x0096, 0x0096, 0x0096, - // Entry C0 - FF - 0x0096, 0x0096, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, - 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, - 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x00a4, - 0x00a4, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, - 0x00bd, 0x00bd, 0x00bd, 0x00c5, - }, - }, - { // ta - taRegionStr, - taRegionIdx, - }, - { // te - teRegionStr, - teRegionIdx, - }, - { // teo - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa ya MarekaniAustriaAustraliaArubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareni" + - "BurundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarusi" + - "BelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya Kat" + - "iKongoUswisiKodivaaVisiwa vya CookChileKameruniChinaKolombiaKostarik" + - "aKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominikaJa" + - "mhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshiUfi" + - "niFijiVisiwa vya FalklandMikronesiaUfaransaGaboniUingerezaGrenadaJoj" + - "iaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGinekw" + - "etaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungariaI" + - "ndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiIra" + - "kiUajemiAislandiItaliaJamaikaYordaniJapaniKeniaKirigizistaniKambodia" + - "KiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaitiV" + - "isiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSirilank" + - "aLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBukini" + - "Visiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya K" + - "askaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksikoM" + - "alesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNikar" + - "agwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia y" + - "a UfaransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitkair" + - "niPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUrenoPa" + - "lauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya SolomonS" + - "helisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera LeoniS" + - "amarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswaz" + - "iVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori " + - "ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuva" + - "luTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibekistaniVatikaniSan" + - "tavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa" + - " vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMa" + - "yotteAfrika KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00b6, 0x00c0, 0x00c8, - 0x00d0, 0x00d7, 0x00dd, 0x00dd, 0x00e4, 0x00ea, 0x00f1, 0x00f1, - 0x00f8, 0x00fe, 0x0104, 0x0104, 0x010c, 0x0114, 0x011a, 0x0120, - 0x0120, 0x0140, 0x0159, 0x015e, 0x0164, 0x016b, 0x017a, 0x017f, - 0x0187, 0x018c, 0x0194, 0x0194, 0x019d, 0x01a1, 0x01a9, 0x01a9, - 0x01a9, 0x01b0, 0x01c0, 0x01c9, 0x01c9, 0x01cf, 0x01d6, 0x01de, - // Entry 40 - 7F - 0x01f1, 0x01f8, 0x01f8, 0x01fe, 0x0205, 0x020a, 0x020a, 0x0211, - 0x0219, 0x0221, 0x0221, 0x0221, 0x0226, 0x022a, 0x023d, 0x0247, - 0x0247, 0x024f, 0x0255, 0x025e, 0x0265, 0x026a, 0x027d, 0x027d, - 0x0282, 0x028a, 0x0293, 0x0299, 0x029d, 0x02a6, 0x02af, 0x02b6, - 0x02b6, 0x02bf, 0x02c3, 0x02cc, 0x02d2, 0x02d2, 0x02d2, 0x02db, - 0x02e2, 0x02e7, 0x02ef, 0x02ef, 0x02f8, 0x0300, 0x0307, 0x0307, - 0x030c, 0x0331, 0x0336, 0x033c, 0x0344, 0x034a, 0x034a, 0x0351, - 0x0358, 0x035e, 0x0363, 0x0370, 0x0378, 0x0380, 0x0386, 0x0399, - // Entry 80 - BF - 0x03a8, 0x03b4, 0x03bb, 0x03cc, 0x03d7, 0x03dc, 0x03e4, 0x03ee, - 0x03f8, 0x0401, 0x0408, 0x040e, 0x0416, 0x041f, 0x0426, 0x042b, - 0x0431, 0x0437, 0x043e, 0x043e, 0x043e, 0x0444, 0x0456, 0x045f, - 0x0463, 0x0468, 0x0470, 0x0470, 0x0490, 0x0499, 0x04a2, 0x04ad, - 0x04b2, 0x04b8, 0x04be, 0x04c4, 0x04cb, 0x04d2, 0x04da, 0x04e1, - 0x04ed, 0x04f3, 0x0504, 0x050b, 0x0514, 0x051c, 0x0521, 0x0527, - 0x052c, 0x0530, 0x053a, 0x053f, 0x0545, 0x0549, 0x055e, 0x0563, - 0x056b, 0x0574, 0x057b, 0x0591, 0x059a, 0x05a3, 0x05d5, 0x05da, - // Entry C0 - FF - 0x05df, 0x05e7, 0x05ed, 0x05ed, 0x05f6, 0x05fd, 0x05fd, 0x0602, - 0x0608, 0x060d, 0x061f, 0x0629, 0x062f, 0x0635, 0x063d, 0x0648, - 0x0650, 0x0650, 0x0658, 0x0663, 0x066b, 0x0673, 0x067a, 0x0682, - 0x0682, 0x0696, 0x069e, 0x069e, 0x06a3, 0x06a9, 0x06a9, 0x06c2, - 0x06c7, 0x06c7, 0x06cb, 0x06d3, 0x06de, 0x06e5, 0x06f8, 0x0707, - 0x070e, 0x0713, 0x071a, 0x072c, 0x0732, 0x0739, 0x0741, 0x0748, - 0x074e, 0x074e, 0x074e, 0x0756, 0x075d, 0x0769, 0x0771, 0x078a, - 0x0793, 0x07b2, 0x07d0, 0x07d9, 0x07e0, 0x07ef, 0x07f4, 0x07f4, - // Entry 100 - 13F - 0x07fa, 0x0801, 0x080e, 0x0814, 0x081c, - }, - }, - { // th - thRegionStr, - thRegionIdx, - }, - {}, // ti - { // to - "Motu ʻAsenisiniʻAnitolaʻAlepea FakatahatahaʻAfikānisitaniAnitikua mo Pal" + - "aputaAnikuilaʻAlipaniaʻĀmeniaʻAngikolaʻAnitātikaʻAsenitinaHaʻamoa ʻA" + - "melikaʻAosituliaʻAositelēliaʻAlupaʻOtumotu ʻAlaniʻAsapaisaniPosinia " + - "mo HesikōvinaPāpeitosiPengilātesiPelesiumePekano FasoPulukaliaPalein" + - "iPulunitiPeniniSā PatēlemiPēmutaPuluneiPolīviaKalipiane fakahōlaniPa" + - "lāsiliPahamaPūtaniMotu PuvetiPotisiuanaPelalusiPeliseKānataʻOtumotu " + - "KokoKongo - KinisasaLipapilika ʻAfilika LotolotoKongo - PalasavilaSu" + - "isilaniMatafonua ʻAivolīʻOtumotu KukiSiliKameluniSiainaKolomipiaMotu" + - " KilipatoniKosita LikaKiupaMuiʻi VēteKulasaoMotu KilisimasiSaipalesi" + - "SēkiaSiamaneTieko KāsiaSiputiTenimaʻakeTominikaLipapilika TominikaʻA" + - "isiliaSiuta mo MelilaʻEkuetoaʻEsitōniaʻIsipiteSahala fakahihifoʻElit" + - "uliaSipeiniʻĪtiōpiaʻIulope fakatahatahaFinilaniFisiʻOtumotu Fokulani" + - "MikolonīsiaʻOtumotu FaloeFalanisēKaponiPilitāniaKelenatāSeōsiaKuiana" + - " fakafalanisēKuenisīKanaSipalālitāKulinilaniKamipiaKiniKuatalupeʻEku" + - "eta KiniKalisiʻOtumotu Seōsia-tonga mo Saniuisi-tongaKuatamalaKuamuK" + - "ini-PisauKuianaHongi Kongi SAR SiainaʻOtumotu Heati mo MakitonaliHon" + - "itulasiKuloisiaHaitiHungakaliaʻOtumotu KaneliʻInitonēsiaʻAealaniʻIsi" + - "leliMotu ManiʻInitiaPotu fonua moana ʻInitia fakapilitāniaʻIlaakiʻIl" + - "aaniʻAisilaniʻĪtaliSelusīSamaikaSoataneSiapaniKeniāKīkisitaniKamipōt" + - "iaKilipasiKomolosiSā Kitisi mo NevisiKōlea tokelauKōlea tongaKueitiʻ" + - "Otumotu KeimeniKasakitaniLauLepanoniSā LūsiaLikitenisiteiniSīlangikā" + - "LaipeliaLesotoLituaniaLakisimipekiLativiaLīpiaMolokoMonakoMolotovaMo" + - "nitenikaloSā Mātini (fakafalanisē)MatakasikaʻOtumotu MāsoloMasetōnia" + - "MāliPemaMongokōliaMakau SAR SiainaʻOtumotu Maliana tokelauMātenikiMa" + - "uliteniaMoʻungaselatiMalitaMaulitiusiMalativisiMalauiMekisikouMalēsi" + - "aMosēmipikiNamipiaNiu KaletōniaNisiaMotu NōfolikiNaisiliaNikalakuaHō" + - "laniNoauēNepaliNauluNiuēNuʻusilaʻOmaniPanamāPelūPolinisia fakafalani" + - "sēPapuaniukiniFilipainiPākisitaniPolaniSā Piea mo MikeloniʻOtumotu P" + - "itikeniPuēto LikoPotu PalesitainePotukaliPalauPalakuaiKatāʻOsēnia ma" + - "maʻoLēunioniLomēniaSēpiaLūsiaLuanitāSaute ʻAlepeaʻOtumotu SolomoneʻO" + - "tumotu SeiseliSūteniSuēteniSingapoaSā HelenaSilōveniaSivolopāti mo S" + - "ani MaieniSilōvakiaSiela LeoneSā MalinoSenekaloSōmaliaSulinameSūtani" + - " fakatongaSao Tomē mo PilinisipeʻEle SalavatoaSā Mātini (fakahōlani)" + - "SīliaSuasilaniTulisitani ta KunuhaʻOtumotu Tuki mo KaikosiSātiPotu f" + - "onua tonga fakafalanisēTokoTailaniTasikitaniTokelauTimoa hahakeTūkim" + - "enisitaniTunīsiaTongaToakeTilinitati mo TopakoTūvaluTaiuaniTenisānia" + - "ʻŪkalaʻineʻIukanitāʻOtumotu siʻi ʻo ʻAmelikaPuleʻanga fakatahataha " + - "ʻAmelikaʻUlukuaiʻUsipekitaniKolo VatikaniSā Viniseni mo KulenatiniV" + - "enesuelaʻOtumotu Vilikini fakapilitāniaʻOtumotu Vilikini fakaʻamelik" + - "aVietinamiVanuatuʻUvea mo FutunaHaʻamoaKōsovoIemeniMaioteʻAfilika to" + - "ngaSemipiaSimipapueiPotu fonua taʻeʻiloa pe halaMāmaniʻAfilikaʻAmeli" + - "ka tokelauʻAmelika tongaʻOsēniaʻAfilika fakahihifoʻAmelika lotolotoʻ" + - "Afilika fakahahakeʻAfilika fakatokelauʻAfilika lotolotoʻAfilika faka" + - "tongaOngo ʻAmelikaʻAmelika fakatokelauKalipianeʻĒsia fakahahakeʻĒsia" + - " fakatongaʻĒsia fakatongahahakeʻIulope fakatongaʻAositelēlēsiaMelanī" + - "siaPotu fonua MikolonīsiaPolinīsiaʻĒsiaʻĒsia lotolotoʻĒsia fakahihif" + - "oʻIulopeʻIulope fakahahakeʻIulope fakatokelauʻIulope fakahihifoʻAmel" + - "ika fakalatina", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0019, 0x002e, 0x003e, 0x0052, 0x005a, 0x0064, - 0x006d, 0x0077, 0x0083, 0x008e, 0x00a0, 0x00ab, 0x00b9, 0x00c0, - 0x00d1, 0x00dd, 0x00f3, 0x00fd, 0x0109, 0x0112, 0x011d, 0x0126, - 0x012d, 0x0135, 0x013b, 0x0148, 0x014f, 0x0156, 0x015e, 0x0173, - 0x017c, 0x0182, 0x0189, 0x0194, 0x019e, 0x01a6, 0x01ac, 0x01b3, - 0x01c1, 0x01d1, 0x01ee, 0x0200, 0x0209, 0x021c, 0x022a, 0x022e, - 0x0236, 0x023c, 0x0245, 0x0254, 0x025f, 0x0264, 0x0270, 0x0277, - 0x0286, 0x028f, 0x0295, 0x029c, 0x02a8, 0x02ae, 0x02b9, 0x02c1, - // Entry 40 - 7F - 0x02d4, 0x02dd, 0x02ec, 0x02f5, 0x0300, 0x0309, 0x031a, 0x0324, - 0x032b, 0x0336, 0x034b, 0x034b, 0x0353, 0x0357, 0x0369, 0x0375, - 0x0384, 0x038d, 0x0393, 0x039d, 0x03a6, 0x03ad, 0x03c1, 0x03c9, - 0x03cd, 0x03d9, 0x03e3, 0x03ea, 0x03ee, 0x03f7, 0x0404, 0x040a, - 0x0433, 0x043c, 0x0441, 0x044b, 0x0451, 0x0467, 0x0484, 0x048e, - 0x0496, 0x049b, 0x04a5, 0x04b5, 0x04c2, 0x04cb, 0x04d4, 0x04dd, - 0x04e5, 0x050d, 0x0515, 0x051d, 0x0527, 0x052f, 0x0536, 0x053d, - 0x0544, 0x054b, 0x0551, 0x055c, 0x0566, 0x056e, 0x0576, 0x058a, - // Entry 80 - BF - 0x0598, 0x05a4, 0x05aa, 0x05bb, 0x05c5, 0x05c8, 0x05d0, 0x05da, - 0x05e9, 0x05f4, 0x05fc, 0x0602, 0x060a, 0x0616, 0x061d, 0x0623, - 0x0629, 0x062f, 0x0637, 0x0643, 0x065e, 0x0668, 0x0679, 0x0683, - 0x0688, 0x068c, 0x0697, 0x06a7, 0x06c0, 0x06c9, 0x06d3, 0x06e1, - 0x06e7, 0x06f1, 0x06fb, 0x0701, 0x070a, 0x0712, 0x071d, 0x0724, - 0x0732, 0x0737, 0x0745, 0x074d, 0x0756, 0x075d, 0x0763, 0x0769, - 0x076e, 0x0773, 0x077c, 0x0783, 0x078a, 0x078f, 0x07a6, 0x07b2, - 0x07bb, 0x07c6, 0x07cc, 0x07e0, 0x07f2, 0x07fd, 0x080d, 0x0815, - // Entry C0 - FF - 0x081a, 0x0822, 0x0827, 0x0838, 0x0841, 0x0849, 0x084f, 0x0855, - 0x085d, 0x086b, 0x087d, 0x088e, 0x0895, 0x089d, 0x08a5, 0x08af, - 0x08b9, 0x08d3, 0x08dd, 0x08e8, 0x08f2, 0x08fa, 0x0902, 0x090a, - 0x091b, 0x0932, 0x0941, 0x095a, 0x0960, 0x0969, 0x097d, 0x0996, - 0x099b, 0x09b9, 0x09bd, 0x09c4, 0x09ce, 0x09d5, 0x09e1, 0x09f0, - 0x09f8, 0x09fd, 0x0a02, 0x0a16, 0x0a1d, 0x0a24, 0x0a2e, 0x0a3b, - 0x0a46, 0x0a63, 0x0a63, 0x0a84, 0x0a8d, 0x0a9a, 0x0aa7, 0x0ac1, - 0x0aca, 0x0aeb, 0x0b0b, 0x0b14, 0x0b1b, 0x0b2b, 0x0b33, 0x0b3a, - // Entry 100 - 13F - 0x0b40, 0x0b46, 0x0b55, 0x0b5c, 0x0b66, 0x0b84, 0x0b8b, 0x0b94, - 0x0ba5, 0x0bb4, 0x0bbd, 0x0bd1, 0x0be3, 0x0bf7, 0x0c0c, 0x0c1e, - 0x0c31, 0x0c3f, 0x0c54, 0x0c5d, 0x0c6f, 0x0c80, 0x0c97, 0x0ca9, - 0x0cba, 0x0cc4, 0x0cdb, 0x0ce5, 0x0cec, 0x0cfc, 0x0d0e, 0x0d16, - 0x0d29, 0x0d3d, 0x0d50, 0x0d64, - }, - }, - { // tr - trRegionStr, - trRegionIdx, - }, - { // twq - "AndooraLaaraw Imaarawey MarganteyAfgaanistanAntigua nda BarbuudaAngiiyaA" + - "lbaaniArmeeniAngoolaArgentineAmeriki SamoaOtrišiOstraaliAruubaAzerba" + - "ayijaŋBosni nda HerzegovineBarbaadosBangladešiBelgiikiBurkina fasoBu" + - "lgaariBahareenBurundiBeniŋBermudaBruuneeBooliviBreezilBahamasBuutaŋB" + - "otswaanaBilorišiBeliiziKanaadaKongoo demookaratiki labooCentraafriki" + - " koyraKongooSwisuKudwarKuuk gungeyŠiiliKameruunŠiinKolombiKosta rika" + - "KuubaKapuver gungeyŠiipurCek laboAlmaaɲeJibuutiDanemarkDoominikiDoom" + - "iniki labooAlžeeriEkwateerEstooniMisraEritreeEspaaɲeEcioopiFinlanduF" + - "ijiKalkan gungeyMikroneziFaransiGaabonAlbaasalaama MargantaGrenaadaG" + - "orgiFaransi GuyaanGaanaGibraltarGrinlandGambiGineGwadeluupGinee Ekwa" + - "torialGreeceGwatemaalaGuamGine-BissoGuyaaneHondurasKrwaasiHaitiHunga" + - "ariIndoneeziIrlanduIsrayelIndu labooBritiši Indu teekoo laamaIraakIr" + - "aanAyselandItaaliJamaayikUrdunJaapoŋKeeniyaKyrgyzstankamboogiKiribaa" + - "tiKomoorSeŋ Kitts nda NevisKooree, GurmaKooree, HawsaKuweetKayman gu" + - "ngeyKaazakstanLaawosLubnaanSeŋ LussiaLiechtensteinSrilankaLiberiaLee" + - "sotoLituaaniLuxembourgLetooniLiibiMaarokMonakoMoldoviMadagascarMarša" + - "l gungeyMaacedooniMaaliMaynamarMongooliMariana Gurma GungeyMartiniik" + - "iMooritaaniMontserratMaltaMooris gungeyMaldiivuMalaawiMexikiMaleeziM" + - "ozambikNaamibiKaaledooni TaagaaNižerNorfolk GungooNaajiriiaNikaragwa" + - "HollanduNorveejNeepalNauruNiueZeelandu TaagaOmaanPanamaPeeruFaransi " + - "PolineeziPapua Ginee TaagaFilipinePaakistanPoloɲeSeŋ Piyer nda Mikel" + - "onPitikarinPorto RikoPalestine Dangay nda GaazaPortugaalPaluParaguwe" + - "yKataarReenioŋRumaaniIriši labooRwandaSaudiyaSolomon GungeySeešelSuu" + - "daŋSweedeSingapurSeŋ HelenaSloveeniSlovaakiSeera LeonSan MarinoSeneg" + - "alSomaaliSurinaamSao Tome nda PrinsipeSalvador labooSuuriaSwazilandT" + - "urk nda Kayikos GungeyCaaduTogoTaayilandTaažikistanTokelauTimoor haw" + - "saTurkmenistaŋTuniziTongaTurkiTrinidad nda TobaagoTuvaluTaayiwanTanz" + - "aaniUkreenUgandaAmeriki Laabu MarganteyUruguweyUzbeekistanVaatikan L" + - "aamaSeŋvinsaŋ nda GrenadineVeneezuyeelaBritiši Virgin gungeyAmeerik " + - "Virgin GungeyVietnaamVanautuWallis nda FutunaSamoaYamanMayootiHawsa " + - "Afriki LabooZambiZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0007, 0x0021, 0x002c, 0x0040, 0x0047, 0x004e, - 0x0055, 0x005c, 0x005c, 0x0065, 0x0072, 0x0079, 0x0081, 0x0087, - 0x0087, 0x0094, 0x00a9, 0x00b2, 0x00bd, 0x00c5, 0x00d1, 0x00d9, - 0x00e1, 0x00e8, 0x00ee, 0x00ee, 0x00f5, 0x00fc, 0x0103, 0x0103, - 0x010a, 0x0111, 0x0118, 0x0118, 0x0121, 0x012a, 0x0131, 0x0138, - 0x0138, 0x0152, 0x0164, 0x016a, 0x016f, 0x0175, 0x0180, 0x0186, - 0x018e, 0x0193, 0x019a, 0x019a, 0x01a4, 0x01a9, 0x01b7, 0x01b7, - 0x01b7, 0x01be, 0x01c6, 0x01ce, 0x01ce, 0x01d5, 0x01dd, 0x01e6, - // Entry 40 - 7F - 0x01f5, 0x01fd, 0x01fd, 0x0205, 0x020c, 0x0211, 0x0211, 0x0218, - 0x0220, 0x0227, 0x0227, 0x0227, 0x022f, 0x0233, 0x0240, 0x0249, - 0x0249, 0x0250, 0x0256, 0x026b, 0x0273, 0x0278, 0x0286, 0x0286, - 0x028b, 0x0294, 0x029c, 0x02a1, 0x02a5, 0x02ae, 0x02be, 0x02c4, - 0x02c4, 0x02ce, 0x02d2, 0x02dc, 0x02e3, 0x02e3, 0x02e3, 0x02eb, - 0x02f2, 0x02f7, 0x02ff, 0x02ff, 0x0308, 0x030f, 0x0316, 0x0316, - 0x0320, 0x033a, 0x033f, 0x0344, 0x034c, 0x0352, 0x0352, 0x035a, - 0x035f, 0x0366, 0x036d, 0x0377, 0x037f, 0x0388, 0x038e, 0x03a2, - // Entry 80 - BF - 0x03af, 0x03bc, 0x03c2, 0x03cf, 0x03d9, 0x03df, 0x03e6, 0x03f1, - 0x03fe, 0x0406, 0x040d, 0x0414, 0x041c, 0x0426, 0x042d, 0x0432, - 0x0438, 0x043e, 0x0445, 0x0445, 0x0445, 0x044f, 0x045d, 0x0467, - 0x046c, 0x0474, 0x047c, 0x047c, 0x0490, 0x049a, 0x04a4, 0x04ae, - 0x04b3, 0x04c0, 0x04c8, 0x04cf, 0x04d5, 0x04dc, 0x04e4, 0x04eb, - 0x04fc, 0x0502, 0x0510, 0x0519, 0x0522, 0x052a, 0x0531, 0x0537, - 0x053c, 0x0540, 0x054e, 0x0553, 0x0559, 0x055e, 0x056f, 0x0580, - 0x0588, 0x0591, 0x0598, 0x05ae, 0x05b7, 0x05c1, 0x05db, 0x05e4, - // Entry C0 - FF - 0x05e8, 0x05f1, 0x05f7, 0x05f7, 0x05ff, 0x0606, 0x0606, 0x0612, - 0x0618, 0x061f, 0x062d, 0x0634, 0x063b, 0x0641, 0x0649, 0x0654, - 0x065c, 0x065c, 0x0664, 0x066e, 0x0678, 0x067f, 0x0686, 0x068e, - 0x068e, 0x06a3, 0x06b1, 0x06b1, 0x06b7, 0x06c0, 0x06c0, 0x06d7, - 0x06dc, 0x06dc, 0x06e0, 0x06e9, 0x06f5, 0x06fc, 0x0708, 0x0715, - 0x071b, 0x0720, 0x0725, 0x0739, 0x073f, 0x0747, 0x074f, 0x0755, - 0x075b, 0x075b, 0x075b, 0x0772, 0x077a, 0x0785, 0x0793, 0x07ac, - 0x07b8, 0x07ce, 0x07e3, 0x07eb, 0x07f2, 0x0803, 0x0808, 0x0808, - // Entry 100 - 13F - 0x080d, 0x0814, 0x0826, 0x082b, 0x0833, - }, - }, - { // tzm - "AnḍurraImarat Tiεrabin TidduklinAfɣanistanAntigwa d BarbudaAngwillaAlban" + - "yaArminyaAngulaArjuntinSamwa ImirikaniyyinUstriyyaUsṭralyaArubaAzerb" + - "iǧanBusna-d-HirsikBarbadusBangladicBeljikaBurkina FasuBelɣaryaBaḥray" + - "nBurundiBininBirmudaBrunayBulivyaBṛazilBahamasBuṭanButswanaBilarusya" + - "BilizKanadaTagduda Tadimuqraṭit n KunguTagduda n Afrika WammasKunguS" + - "wisraTaɣazut n UszerTigzirin n KukCciliKamerunṢṣinKulumbyaKusṭa Rika" + - "kubaTigzirin n Iɣf UzegzawQubrusTagduda n ČikAlmanyaǦibutiDanmarkḌum" + - "inikaTagduda n ḌuminikanDzayerIkwaḍurIsṭunyaMiṣrIritryaSbanyaItyupya" + - "FinlanḍaFijiTigzirin n FalklandMikrunizyaFṛansaGabunTagelda Taddukel" + - "tGrinadaJyurjyaGuyana TafransistƔanaJibralṭarGrinlanḍaGambyaƔinyaGwa" + - "dalupƔinya Tikwaṭur itYunanGwatimalaGwamƔinya-BissawGuyanaHindurasKr" + - "watyaHaytiHenɣaryaIndunizyaIrlanḍaIsraeilHindAmur n Agaraw Uhindi Ub" + - "ṛiṭaniƐiraqIranIslanḍaIṭalyaJamaykaUrḍunJjappunKinyaKirɣistanKambu" + - "djKiribatiQumurSantekits d NivisKurya TugafatKurya TunẓultKuwwaytTig" + - "zirin n KaymanKazaxistanLawsLubnanSantelusyaLictencṭaynSrilankaLibir" + - "yaLisuṭuLitwanyaLiksumburgLiṭṭunyaLibyaMeṛṛukMunakuMulḍavyaMadaɣacqa" + - "rTigzirin n MarcalMaqdunyaMaliMyanmarManɣulyaTigzirin n Maryana Tuga" + - "fatMartinikMuritanyaMuntsirraMalṭaMurisMaldivMalawiMiksikMalizyaMuza" + - "mbiqNamibyakalidunya TamaynutNnijerTigzirt NurfulkNijiriaNikaragwaHu" + - "lanḍaNnurwijNippalNawruNiwiZilanḍa TamaynutƐummanPanamaPiruPulinizya" + - " TafransistPapwa Ɣinya TamaynutFilippinPakistanPulunyaSantepyir d Mi" + - "kelunPitkirnPurturikuAgemmaḍ Ugut d Ɣazza IfilisṭiniyenPurtuɣalPaluP" + - "aragwayQaṭarRiyyunyunṚumanyaRusyaRuwwanḍaSsaεudiyya TaεrabtTigzirin " + - "n SalumunSsicilSsudanSsewwidSanɣafuraSantehilinSluvinyaSluvakyaSiral" + - "yunSanmarinuSsiniɣalṢṣumalSurinamSawṭumi d PrinsipSalvaḍurSuryaSwazi" + - "lanḍaTigzirin Turkiyyin d TikaykusinTcadṬṭuguṬaylanḍaṬaǧikistanTuklu" + - "Timur TagmuṭTurkmanistanTunesṬungaTurkyaTrinidad d ṬubaguṬuvaluṬaywa" + - "nṬanzanyaUkranyaUɣandaIwunak Idduklen n AmirikaUrugwayUzbakistanAwan" + - "k iɣrem n VatikanSantevinsent d GrinadinVinzwillaTigzirin (Virgin) T" + - "ibṛiṭaniyinTigzirin n Virjin n Iwunak YedduklenViṭnamVanwatuWalis d " + - "FutunaSamwaYamanMayuṭTafrikt TunẓulZambyaZimbabwi", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0009, 0x0023, 0x002e, 0x003f, 0x0047, 0x004e, - 0x0055, 0x005b, 0x005b, 0x0063, 0x0076, 0x007e, 0x0088, 0x008d, - 0x008d, 0x0097, 0x00a5, 0x00ad, 0x00b6, 0x00bd, 0x00c9, 0x00d2, - 0x00db, 0x00e2, 0x00e7, 0x00e7, 0x00ee, 0x00f4, 0x00fb, 0x00fb, - 0x0103, 0x010a, 0x0111, 0x0111, 0x0119, 0x0122, 0x0127, 0x012d, - 0x012d, 0x014b, 0x0162, 0x0167, 0x016d, 0x017d, 0x018b, 0x0190, - 0x0197, 0x019f, 0x01a7, 0x01a7, 0x01b3, 0x01b7, 0x01ce, 0x01ce, - 0x01ce, 0x01d4, 0x01e2, 0x01e9, 0x01e9, 0x01f0, 0x01f7, 0x0201, - // Entry 40 - 7F - 0x0216, 0x021c, 0x021c, 0x0225, 0x022e, 0x0234, 0x0234, 0x023b, - 0x0241, 0x0248, 0x0248, 0x0248, 0x0252, 0x0256, 0x0269, 0x0273, - 0x0273, 0x027b, 0x0280, 0x0291, 0x0298, 0x029f, 0x02b0, 0x02b0, - 0x02b5, 0x02c0, 0x02cb, 0x02d1, 0x02d7, 0x02df, 0x02f3, 0x02f8, - 0x02f8, 0x0301, 0x0305, 0x0312, 0x0318, 0x0318, 0x0318, 0x0320, - 0x0327, 0x032c, 0x0335, 0x0335, 0x033e, 0x0347, 0x034e, 0x034e, - 0x0352, 0x0373, 0x0379, 0x037d, 0x0386, 0x038e, 0x038e, 0x0395, - 0x039c, 0x03a3, 0x03a8, 0x03b2, 0x03b9, 0x03c1, 0x03c6, 0x03d7, - // Entry 80 - BF - 0x03e4, 0x03f3, 0x03fa, 0x040b, 0x0415, 0x0419, 0x041f, 0x0429, - 0x0436, 0x043e, 0x0445, 0x044d, 0x0455, 0x045f, 0x046b, 0x0470, - 0x047a, 0x0480, 0x048a, 0x048a, 0x048a, 0x0495, 0x04a6, 0x04ae, - 0x04b2, 0x04b9, 0x04c2, 0x04c2, 0x04dc, 0x04e4, 0x04ed, 0x04f6, - 0x04fd, 0x0502, 0x0508, 0x050e, 0x0514, 0x051b, 0x0523, 0x052a, - 0x053c, 0x0542, 0x0551, 0x0558, 0x0561, 0x056a, 0x0571, 0x0577, - 0x057c, 0x0580, 0x0592, 0x0599, 0x059f, 0x05a3, 0x05b7, 0x05cc, - 0x05d4, 0x05dc, 0x05e3, 0x05f6, 0x05fd, 0x0606, 0x062d, 0x0636, - // Entry C0 - FF - 0x063a, 0x0642, 0x0649, 0x0649, 0x0652, 0x065b, 0x065b, 0x0660, - 0x066a, 0x067e, 0x0690, 0x0696, 0x069c, 0x06a3, 0x06ad, 0x06b7, - 0x06bf, 0x06bf, 0x06c7, 0x06cf, 0x06d8, 0x06e1, 0x06eb, 0x06f2, - 0x06f2, 0x0705, 0x070f, 0x070f, 0x0714, 0x0720, 0x0720, 0x073f, - 0x0743, 0x0743, 0x074c, 0x0758, 0x0765, 0x076a, 0x0778, 0x0784, - 0x0789, 0x0790, 0x0796, 0x07a9, 0x07b1, 0x07b9, 0x07c3, 0x07ca, - 0x07d1, 0x07d1, 0x07d1, 0x07ea, 0x07f1, 0x07fb, 0x0811, 0x0828, - 0x0831, 0x0853, 0x0877, 0x087f, 0x0886, 0x0894, 0x0899, 0x0899, - // Entry 100 - 13F - 0x089e, 0x08a5, 0x08b5, 0x08bb, 0x08c3, - }, - }, - { // ug - "ئاسسېنسىيون ئارىلىئاندوررائەرەب بىرلەشمە خەلىپىلىكىئافغانىستانئانتىگۇئا " + - "ۋە باربۇدائانگۋىللائالبانىيەئەرمېنىيەئانگولائانتاركتىكائارگېنتىنائا" + - "مېرىكا ساموئائاۋىستىرىيەئاۋسترالىيەئارۇبائالاند ئاراللىرىئەزەربەيجا" + - "نبوسىنىيە ۋە گېرتسېگوۋىناباربادوسبېنگالبېلگىيەبۇركىنا فاسوبۇلغارىيە" + - "بەھرەينبۇرۇندىبېنىنساينت بارتېلېمىبېرمۇدابىرۇنېيبولىۋىيەكارىب دېڭىز" + - "ى گوللاندىيەبىرازىلىيەباھامابۇتانبوۋېت ئارىلىبوتسۋانابېلارۇسىيەبېلى" + - "زكاناداكوكوس (كىلىڭ) ئاراللىرىكونگو - كىنشاسائوتتۇرا ئافرىقا جۇمھۇر" + - "ىيىتىكونگو - بىراززاۋىلشىۋېتسارىيەكوتې دې ئىۋوئىركۇك ئاراللىرىچىلىك" + - "امېرونجۇڭگوكولومبىيەكىلىپپېرتون ئاراللىرىكوستارىكاكۇبايېشىل تۇمشۇقك" + - "ۇراچاۋمىلاد ئارىلىسىپرۇسچېخ جۇمھۇرىيىتىگېرمانىيەدېگو-گارشىياجىبۇتىد" + - "انىيەدومىنىكادومىنىكا جۇمھۇرىيىتىئالجىرىيەسېيتا ۋە مېلىلائېكۋاتورئې" + - "ستونىيەمىسىرغەربىي ساخارائېرىترىيەئىسپانىيەئېفىيوپىيەياۋروپا ئىتتىپ" + - "اقىفىنلاندىيەفىجىفالكلاند ئاراللىرىمىكرونېزىيەفارو ئاراللىرىفىرانسى" + - "يەگابونبىرلەشمە پادىشاھلىقگىرېناداگىرۇزىيەفىرانسىيەگە قاراشلىق گىۋى" + - "ياناگۇرنسېيگاناجەبىلتارىقگىرېنلاندىيەگامبىيەگىۋىنىيەگىۋادېلۇپئېكۋات" + - "ور گىۋىنىيەسىگىرېتسىيەجەنۇبىي جورجىيە ۋە جەنۇبىي ساندۋىچ ئاراللىرىگ" + - "ىۋاتېمالاگۇئامگىۋىنىيە بىسسائۇگىۋىياناشياڭگاڭ ئالاھىدە مەمۇرىي رايو" + - "نى (جۇڭگو)ھېرد ئارىلى ۋە ماكدونالد ئاراللىرىھوندۇراسكىرودىيەھايتىۋې" + - "نگىرىيەكانارى ئاراللىرىھىندونېزىيەئىرېلاندىيەئىسرائىلىيەمان ئارىلىھ" + - "ىندىستانئەنگلىيەگە قاراشلىق ھىندى ئوكيان تېررىتورىيەسىئىراقئىرانئىس" + - "لاندىيەئىتالىيەجېرسېييامايكائىيوردانىيەياپونىيەكېنىيەقىرغىزىستانكام" + - "بودژاكىرىباتىكوموروساينت كىتىس ۋە نېۋىسچاۋشيەنكورېيەكۇۋەيتكايمان ئا" + - "راللىرىقازاقىستانلائوسلىۋانساينت لۇسىيەلىكتېنستېينسىرىلانكالىبېرىيە" + - "لېسوتولىتۋانىيەلىيۇكسېمبۇرگلاتۋىيەلىۋىيەماراكەشموناكومولدوۋاقارا تا" + - "غساينت مارتىنماداغاسقارمارشال ئاراللىرىماكېدونىيەمالىبىرماموڭغۇلىيە" + - "ئاۋمېن ئالاھىدە مەمۇرىي رايونىشىمالىي مارىيانا ئاراللىرىمارتىنىكاما" + - "ۋرىتانىيەمونتسېرراتمالتاماۋرىتىيۇسمالدىۋېمالاۋىمېكسىكامالايسىياموزا" + - "مبىكنامىبىيەيېڭى كالېدونىيەنىگېرنورفولك ئارىلىنىگېرىيەنىكاراگۇئاگول" + - "لاندىيەنورۋېگىيەنېپالناۋرۇنيۇئېيېڭى زېلاندىيەئومانپاناماپېرۇفىرانسى" + - "يەگە قاراشلىق پولىنېزىيەپاپۇئا يېڭى گىۋىنىيەسىفىلىپپىنپاكىستانپولشا" + - "ساينت پىيېر ۋە مىكېلون ئاراللىرىپىتكايرن ئاراللىرىپۇئېرتو رىكوپەلەس" + - "تىن زېمىنىپورتۇگالىيەپالائۇپاراگۋايقاتارئوكيانىيە ئەتراپىدىكى ئارال" + - "لاررېيۇنىيونرومىنىيەسېربىيەرۇسىيەرىۋانداسەئۇدىي ئەرەبىستانسولومون ئ" + - "اراللىرىسېيشېلسۇدانشىۋېتسىيەسىنگاپورساينىت ھېلېناسىلوۋېنىيەسىۋالبار" + - "د ۋە يان مايېنسىلوۋاكىيەسېررالېئونسان مارىنوسېنېگالسومالىسۇرىنامجەن" + - "ۇبىي سۇدانسان تومې ۋە پرىنسىپېسالۋادورسىنت مارتېنسۇرىيەسىۋېزىلاندتر" + - "ىستان داكۇنھاتۇركس ۋە كايكوس ئاراللىرىچادفىرانسىيەنىڭ جەنۇبىي زېمىن" + - "ىتوگوتايلاندتاجىكىستانتوكېلاۋشەرقىي تىمورتۈركمەنىستانتۇنىستونگاتۈرك" + - "ىيەتىرىنىداد ۋە توباگوتۇۋالۇتەيۋەنتانزانىيەئۇكرائىنائۇگاندائا ق ش ت" + - "اشقى ئاراللىرىئامېرىكا قوشما ئىشتاتلىرىئۇرۇگۋايئۆزبېكىستانۋاتىكانسا" + - "ينت ۋىنسېنت ۋە گىرېنادىنېسۋېنېسۇئېلائەنگلىيە ۋىرگىن ئاراللىرىئا ق ش" + - " ۋىرگىن ئاراللىرىۋىيېتنامۋانۇئاتۇۋاللىس ۋە فۇتۇناساموئاكوسوۋويەمەنما" + - "يوتىجەنۇبىي ئافرىقازامبىيەزىمبابۋېيوچۇن جايدۇنيائافرىقاشىمالىي ئامې" + - "رىكاجەنۇبىي ئامېرىكائوكيانىيەغەربىي ئافرىقائوتتۇرا ئامېرىكاشەرقىي ئ" + - "افرىقاشىمالىي ئافرىقائوتتۇرا ئافرىقاجەنۇبىي ئافرىقا رايونىئامېرىكاش" + - "ىمالىي ئامېرىكا رايونىكارىب دېڭىزىشەرقىي ئاسىياجەنۇبىي ئاسىياشەرقىي" + - " جەنۇبىي ئاسىياجەنۇبىي ياۋروپائاۋسترالئاسىيامېلانېسىيەمىكرونېزىيە را" + - "يونىپولىنىزىيەئاسىيائوتتۇرا ئاسىياغەربىي ئاسىياياۋروپاشەرقىي ياۋروپ" + - "اشىمالىي ياۋروپاغەربىي ياۋروپالاتىن ئامېرىكا", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0023, 0x0033, 0x0063, 0x0079, 0x009f, 0x00b1, 0x00c3, - 0x00d5, 0x00e3, 0x00f9, 0x010d, 0x012a, 0x0140, 0x0156, 0x0162, - 0x0181, 0x0197, 0x01c5, 0x01d5, 0x01e1, 0x01ef, 0x0206, 0x0218, - 0x0226, 0x0234, 0x023e, 0x025b, 0x0269, 0x0277, 0x0287, 0x02b3, - 0x02c7, 0x02d3, 0x02dd, 0x02f4, 0x0304, 0x0318, 0x0322, 0x032e, - 0x0358, 0x0373, 0x03a7, 0x03c8, 0x03de, 0x03fa, 0x0413, 0x041b, - 0x0429, 0x0433, 0x0445, 0x046e, 0x0480, 0x0488, 0x049f, 0x04ad, - 0x04c4, 0x04d0, 0x04ed, 0x04ff, 0x0516, 0x0522, 0x052e, 0x053e, - // Entry 40 - 7F - 0x0565, 0x0577, 0x0593, 0x05a3, 0x05b5, 0x05bf, 0x05d8, 0x05ea, - 0x05fc, 0x0610, 0x0631, 0x0631, 0x0645, 0x064d, 0x0670, 0x0686, - 0x06a1, 0x06b3, 0x06bd, 0x06e2, 0x06f2, 0x0702, 0x073a, 0x0748, - 0x0750, 0x0764, 0x077c, 0x078a, 0x079a, 0x07ac, 0x07d1, 0x07e3, - 0x0836, 0x084a, 0x0854, 0x0873, 0x0883, 0x08cb, 0x090b, 0x091b, - 0x092b, 0x0935, 0x0947, 0x0966, 0x097c, 0x0992, 0x09a8, 0x09bb, - 0x09cd, 0x0a25, 0x0a2f, 0x0a39, 0x0a4d, 0x0a5d, 0x0a69, 0x0a77, - 0x0a8d, 0x0a9d, 0x0aa9, 0x0abf, 0x0acf, 0x0adf, 0x0aeb, 0x0b10, - // Entry 80 - BF - 0x0b1e, 0x0b2a, 0x0b36, 0x0b55, 0x0b69, 0x0b73, 0x0b7d, 0x0b94, - 0x0baa, 0x0bbc, 0x0bcc, 0x0bd8, 0x0bea, 0x0c02, 0x0c10, 0x0c1c, - 0x0c2a, 0x0c36, 0x0c44, 0x0c53, 0x0c6a, 0x0c7e, 0x0c9d, 0x0cb1, - 0x0cb9, 0x0cc3, 0x0cd5, 0x0d0e, 0x0d40, 0x0d52, 0x0d68, 0x0d7c, - 0x0d86, 0x0d9a, 0x0da8, 0x0db4, 0x0dc2, 0x0dd4, 0x0de4, 0x0df4, - 0x0e11, 0x0e1b, 0x0e36, 0x0e46, 0x0e5a, 0x0e6e, 0x0e80, 0x0e8a, - 0x0e94, 0x0e9e, 0x0eb9, 0x0ec3, 0x0ecf, 0x0ed7, 0x0f13, 0x0f3d, - 0x0f4d, 0x0f5d, 0x0f67, 0x0fa3, 0x0fc6, 0x0fdd, 0x0ffa, 0x1010, - // Entry C0 - FF - 0x101c, 0x102c, 0x1036, 0x1070, 0x1082, 0x1092, 0x10a0, 0x10ac, - 0x10ba, 0x10dd, 0x10fe, 0x110a, 0x1114, 0x1126, 0x1136, 0x114f, - 0x1163, 0x118c, 0x11a0, 0x11b4, 0x11c7, 0x11d5, 0x11e1, 0x11ef, - 0x1208, 0x122d, 0x123d, 0x1252, 0x125e, 0x1272, 0x128f, 0x12be, - 0x12c4, 0x12f8, 0x1300, 0x130e, 0x1322, 0x1330, 0x1347, 0x135f, - 0x1369, 0x1373, 0x1381, 0x13a5, 0x13b1, 0x13bd, 0x13cf, 0x13e1, - 0x13ef, 0x1417, 0x1417, 0x1447, 0x1457, 0x146d, 0x147b, 0x14b0, - 0x14c4, 0x14f4, 0x151e, 0x152e, 0x153e, 0x155c, 0x1568, 0x1574, - // Entry 100 - 13F - 0x157e, 0x158a, 0x15a7, 0x15b5, 0x15c5, 0x15d6, 0x15e0, 0x15ee, - 0x160d, 0x162c, 0x163e, 0x1659, 0x1678, 0x1693, 0x16b0, 0x16cd, - 0x16f7, 0x1707, 0x1733, 0x174a, 0x1763, 0x177e, 0x17a6, 0x17c3, - 0x17df, 0x17f3, 0x1816, 0x182a, 0x1836, 0x1851, 0x186a, 0x1878, - 0x1893, 0x18b0, 0x18cb, 0x18e6, - }, - }, - { // uk - ukRegionStr, - ukRegionIdx, - }, - { // ur - urRegionStr, - urRegionIdx, - }, - { // ur-IN - "جزیرہ اسینشنجزائر آلینڈجزیرہ بوویتجزائر (کیلنگ) کوکوسجزائر ککجزیرہ کلپرٹ" + - "نڈیگو گارشیاجزائر فاکلینڈجزائر فیروفرانسیسی گیاناجزائر ہرڈ و مکڈونل" + - "ڈجزائر کناریبرطانوی بحرہند خطہجزائر مارشلجزائر شمالی ماریاناجزیرہ ن" + - "ارفوکجزائر پٹکیرنجزائر سلیمانترسٹان دا کونیاجزائر کیکس و ترکیہامریک" + - "ی بیرونی جزائربرطانوی جزائر ورجنامریکی جزائر ورجن", - []uint16{ // 251 elements - // Entry 0 - 3F - 0x0000, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, - 0x002c, 0x002c, 0x002c, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, - 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0072, 0x0072, - 0x0072, 0x0072, 0x0072, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x009e, 0x009e, 0x009e, 0x009e, - // Entry 40 - 7F - 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, - 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, 0x00b7, 0x00b7, - 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00e5, 0x00e5, - 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, - 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x0108, 0x0108, - 0x0108, 0x0108, 0x0108, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, - 0x011d, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - // Entry 80 - BF - 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, - 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x0154, 0x0154, - 0x0154, 0x0154, 0x0154, 0x0154, 0x0178, 0x0178, 0x0178, 0x0178, - 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, - 0x0178, 0x0178, 0x018f, 0x018f, 0x018f, 0x018f, 0x018f, 0x018f, - 0x018f, 0x018f, 0x018f, 0x018f, 0x018f, 0x018f, 0x018f, 0x018f, - 0x018f, 0x018f, 0x018f, 0x018f, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - // Entry C0 - FF - 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, - 0x01a6, 0x01a6, 0x01bd, 0x01bd, 0x01bd, 0x01bd, 0x01bd, 0x01bd, - 0x01bd, 0x01bd, 0x01bd, 0x01bd, 0x01bd, 0x01bd, 0x01bd, 0x01bd, - 0x01bd, 0x01bd, 0x01bd, 0x01bd, 0x01bd, 0x01bd, 0x01d9, 0x01fa, - 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, - 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, - 0x01fa, 0x021e, 0x021e, 0x021e, 0x021e, 0x021e, 0x021e, 0x021e, - 0x021e, 0x0240, 0x0260, - }, - }, - { // uz - uzRegionStr, - uzRegionIdx, - }, - { // uz-Arab - "افغانستان", - []uint16{ // 5 elements - 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, - }, - }, - { // uz-Cyrl - "Меърож оролиАндорраБирлашган Араб АмирликлариАфғонистонАнтигуа ва Барбуд" + - "аАнгиляАлбанияАрманистонАнголаАнтарктидаАргентинаАмерика СамоасиАвс" + - "трияАвстралияАрубаАланд ороллариОзарбайжонБосния ва ГерцеговинаБарб" + - "адосБангладешБельгияБуркина-ФасоБолгарияБаҳрайнБурундиБенинСен-Барт" + - "елемиБермудаБрунейБоливияБонейр, Синт-Эстатиус ва СабаБразилияБагам" + - "а ороллариБутанБуве оролиБотсваннаБелорусияБелизКанадаКокос (Килинг" + - ") ороллариКонго-КиншасаМарказий Африка РеспубликасиКонго БраззавильШ" + - "вейцарияКот-д’ИвуарКук ороллариЧилиКамерунХитойКолумбияКлиппертон о" + - "ролиКоста-РикаКубаКабо-ВердеКюрасаоРождество оролиКипрЧехияГермания" + - "Диего-ГарсияЖибутиДанияДоминикаДоминикан РеспубликасиЖазоирСэута ва" + - " МелиллаЭквадорЭстонияМисрҒарбий Саҳрои КабирЭритреяИспанияЭфиопияЕв" + - "ропа ИттифоқиФинляндияФижиФолкленд ороллариМикронезияФарер ороллари" + - "ФранцияГабонБуюк БританияГренадаГрузияФранцуз ГвианасиГернсиГанаГиб" + - "ралтарГренландияГамбияГвинеяГваделупеЭкваториал ГвинеяГрецияЖанубий" + - " Георгия ва Жанубий Сендвич ороллариГватемалаГуамГвинея-БисауГаянаГо" + - "нконг (Хитой ММҲ)Херд ва Макдоналд ороллариГондурасХорватияГаитиВен" + - "грияКанар ороллариИндонезияИрландияИсроилМэн оролиҲиндистонБритания" + - "нинг Ҳинд океанидаги ҳудудиИроқЭронИсландияИталияЖерсиЯмайкаИордани" + - "яЯпонияКенияҚирғизистонКамбоджаКирибатиКомор ороллариСент-Китс ва Н" + - "евисШимолий КореяЖанубий КореяҚувайтКайман ороллариҚозоғистонЛаосЛи" + - "ванСент-ЛюсияЛихтенштейнШри-ЛанкаЛиберияЛесотоЛитваЛюксембургЛатвия" + - "ЛивияМарокашМонакоМолдоваЧерногорияСент-МартинМадагаскарМаршал орол" + - "лариМакедонияМалиМьянма (Бирма)МонголияМакао (Хитой ММҲ)Шимолий Мар" + - "ианна ороллариМартиникаМавританияМонтсерратМальтаМаврикийМальдив ор" + - "оллариМалавиМексикаМалайзияМозамбикНамибияЯнги КаледонияНигерНорфол" + - "к ороллариНигерияНикарагуаНидерландияНорвегияНепалНауруНиуэЯнги Зел" + - "андияУммонПанамаПеруФранцуз ПолинезиясиПапуа - Янги ГвинеяФилиппинП" + - "окистонПольшаСент-Пьер ва МикелонПиткэрн ороллариПуэрто-РикоФаласти" + - "н ҳудудиПортугалияПалауПарагвайҚатарЁндош ОкеанияРеюнионРуминияСерб" + - "ияРоссияРуандаСаудия АрабистониСоломон ороллариСейшел ороллариСудан" + - "ШвецияСингапурМуқаддас Елена оролиСловенияСвалбард ва Ян-МайенСлова" + - "кияСьерра-ЛеонеСан-МариноСенегалСомалиСуринамЖанубий СуданСан-Томе " + - "ва ПринсипиСалвадорСинт-МартенСурияСвазилендТристан-да-КуняТуркс ва" + - " Кайкос ороллариЧадФранцуз жанубий худудлариТогоТаиландТожикистонТок" + - "елауТимор-ЛестеТуркманистонТунисТонгаТуркияТринидад ва ТобагоТувалу" + - "ТайванТанзанияУкраинаУгандаАҚШ ёндош ороллариАмерика Қўшма Штатлари" + - "УругвайЎзбекистонВатиканСент-Винсент ва ГренадинВенесуэлаБртания Ви" + - "ргин ороллариАҚШ Виргин ороллариВьетнамВануатуУоллис ва ФутунаСамоа" + - "КосовоЯманМайоттаЖанубий Африка РеспубликасиЗамбияЗимбабвеНомаълум " + - "минтақаДунёАфрикаШимолий АмерикаЖанубий АмерикаОкеанияҒарбий Африка" + - "Марказий АмерикаШарқий АфрикаШимолий АфрикаМарказий АфрикаЖануби-Аф" + - "рикаАмерикаШимоли-АмерикаКариб ҳавзасиШарқий ОсиёЖанубий ОсиёЖануби" + - "й-Шарқий ОсиёЖанубий ЕвропаАвстралазияМеланезияМикронезия минтақаси" + - "ПолинезияОсиёМарказий ОсиёҒарбий ОсиёЕвропаШарқий ЕвропаШимолий Евр" + - "опаҒарбий ЕвропаЛотин Америкаси", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0017, 0x0025, 0x0057, 0x006b, 0x008d, 0x0099, 0x00a7, - 0x00bb, 0x00c7, 0x00db, 0x00ed, 0x010a, 0x0118, 0x012a, 0x0134, - 0x014f, 0x0163, 0x018b, 0x019b, 0x01ad, 0x01bb, 0x01d2, 0x01e2, - 0x01f0, 0x01fe, 0x0208, 0x0221, 0x022f, 0x023b, 0x0249, 0x027e, - 0x028e, 0x02ab, 0x02b5, 0x02c8, 0x02da, 0x02ec, 0x02f6, 0x0302, - 0x032c, 0x0345, 0x037b, 0x039a, 0x03ac, 0x03c2, 0x03d9, 0x03e1, - 0x03ef, 0x03f9, 0x0409, 0x0428, 0x043b, 0x0443, 0x0456, 0x0464, - 0x0481, 0x0489, 0x0493, 0x04a3, 0x04ba, 0x04c6, 0x04d0, 0x04e0, - // Entry 40 - 7F - 0x050b, 0x0517, 0x0535, 0x0543, 0x0551, 0x0559, 0x057d, 0x058b, - 0x0599, 0x05a7, 0x05c4, 0x05c4, 0x05d6, 0x05de, 0x05ff, 0x0613, - 0x062e, 0x063c, 0x0646, 0x065f, 0x066d, 0x0679, 0x0698, 0x06a4, - 0x06ac, 0x06be, 0x06d2, 0x06de, 0x06ea, 0x06fc, 0x071d, 0x0729, - 0x077a, 0x078c, 0x0794, 0x07ab, 0x07b5, 0x07d7, 0x0808, 0x0818, - 0x0828, 0x0832, 0x0840, 0x085b, 0x086d, 0x087d, 0x0889, 0x089a, - 0x08ac, 0x08ef, 0x08f7, 0x08ff, 0x090f, 0x091b, 0x0925, 0x0931, - 0x0941, 0x094d, 0x0957, 0x096d, 0x097d, 0x098d, 0x09a8, 0x09c9, - // Entry 80 - BF - 0x09e2, 0x09fb, 0x0a07, 0x0a24, 0x0a38, 0x0a40, 0x0a4a, 0x0a5d, - 0x0a73, 0x0a84, 0x0a92, 0x0a9e, 0x0aa8, 0x0abc, 0x0ac8, 0x0ad2, - 0x0ae0, 0x0aec, 0x0afa, 0x0b0e, 0x0b23, 0x0b37, 0x0b54, 0x0b66, - 0x0b6e, 0x0b87, 0x0b97, 0x0bb5, 0x0be5, 0x0bf7, 0x0c0b, 0x0c1f, - 0x0c2b, 0x0c3b, 0x0c5a, 0x0c66, 0x0c74, 0x0c84, 0x0c94, 0x0ca2, - 0x0cbd, 0x0cc7, 0x0ce6, 0x0cf4, 0x0d06, 0x0d1c, 0x0d2c, 0x0d36, - 0x0d40, 0x0d48, 0x0d61, 0x0d6b, 0x0d77, 0x0d7f, 0x0da4, 0x0dc6, - 0x0dd6, 0x0de6, 0x0df2, 0x0e17, 0x0e36, 0x0e4b, 0x0e68, 0x0e7c, - // Entry C0 - FF - 0x0e86, 0x0e96, 0x0ea0, 0x0eb9, 0x0ec7, 0x0ed5, 0x0ee1, 0x0eed, - 0x0ef9, 0x0f1a, 0x0f39, 0x0f56, 0x0f60, 0x0f6c, 0x0f7c, 0x0fa2, - 0x0fb2, 0x0fd7, 0x0fe7, 0x0ffe, 0x1011, 0x101f, 0x102b, 0x1039, - 0x1052, 0x1077, 0x1087, 0x109c, 0x10a6, 0x10b8, 0x10d4, 0x1101, - 0x1107, 0x1137, 0x113f, 0x114d, 0x1161, 0x116f, 0x1184, 0x119c, - 0x11a6, 0x11b0, 0x11bc, 0x11de, 0x11ea, 0x11f6, 0x1206, 0x1214, - 0x1220, 0x1242, 0x1242, 0x126c, 0x127a, 0x128e, 0x129c, 0x12c9, - 0x12db, 0x1307, 0x132b, 0x1339, 0x1347, 0x1365, 0x136f, 0x137b, - // Entry 100 - 13F - 0x1383, 0x1391, 0x13c5, 0x13d1, 0x13e1, 0x1400, 0x1408, 0x1414, - 0x1431, 0x144e, 0x145c, 0x1475, 0x1494, 0x14ad, 0x14c8, 0x14e5, - 0x14fe, 0x150c, 0x1527, 0x1540, 0x1555, 0x156c, 0x1590, 0x15ab, - 0x15c1, 0x15d3, 0x15fa, 0x160c, 0x1614, 0x162d, 0x1642, 0x164e, - 0x1667, 0x1682, 0x169b, 0x16b8, - }, - }, - { // vai - "ꕉꖆꕟꖳꕯꔤꗳ ꕉꕟꔬ ꗡꕆꔓꔻꕉꔱꕭꔕꔻꕚꘋꕉꘋꔳꖶꕎ ꗪ ꕑꖜꕜꕉꕄꕞꕉꔷꕑꕇꕩꕉꕆꕯꕉꖐꕞꕉꘀꘋꔳꕯꕶꕱ ꕢꕹꕎꖺꔻꖤꕎꖺꖬꖤꔃꔷꕩꕉꖩꕑ" + - "ꕉꕤꕑꔤꕧꘋꕷꔻꕇꕰ ꗪ ꗥꕤꖑꔲꕯꕑꔆꖁꔻꕑꕅꕞꗵꔼꗩꕀꗚꘋꕷꕃꕯ ꕘꖇꗂꔠꔸꕩꕑꗸꘋꖜꖩꔺꗩꕇꘋꗩꖷꕜꖜꖩꘉꔧꕷꔷꔲꕩꖜꕟꔘꔀꕑ" + - "ꕌꕮꔻꖜꕚꘋꕷꖬꕎꕯꗩꕞꖩꔻꔆꔷꔘꕪꕯꕜꖏꖐ ꗵꗞꖴꕟꔎ ꕸꖃꔀꕉꔱꔸꕪ ꗳ ꗳ ꕸꖃꔀꖏꖐꖬꔃꕤ ꖨꕮꕊꖏꔳ ꕾꕎꖏꕃ ꔳꘋꗣꔚꔷ" + - "ꕪꔈꖩꘋꕦꔤꕯꗛꗏꔭꕩꖏꔻꕚ ꔸꕪꕃꖳꕑꔞꔪ ꗲꔵ ꔳꘋꗣꕢꗡꖛꗐꔻꗿꕃ ꕸꖃꔀꕧꕮꔧꕀꖜꔳꕜꕇꕮꕃꖁꕆꕇꕪꖁꕆꕇꕪꘋ ꕸꕱꔀꕉꔷꔠ" + - "ꔸꕩꗡꖴꔃꗍꗡꔻꕿꕇꕰꕆꔖꕞꔀꔸꔳꕟꕐꘊꔧꔤꔳꖎꔪꕩꔱꘋ ꖨꕮꕊꔱꔤꕀꕘꔷꕃ ꖨꕮ ꔳꘋꗣꕆꖏꕇꔻꕩꖢꕟꘋꔻꕭꕷꘋꖕꕯꔤꗳꖶꕟꕯꕜꗘ" + - "ꖺꕀꕩꗱꘋꔻ ꖶꕎꕯꕭꕌꕯꕀꖜꕟꕚꕧꕓ ꖴꕎ ꖨꕮꕊꕭꔭꕩꕅꔤꕇꖶꕎꔐꖨꔅꖦꕰꕊ ꗳ ꕅꔤꕇꗥꗷꘋꖶꕎꔎꕮꕞꖶꕎꕆꕅꔤꕇ ꔫꕢꕴꖶꕩ" + - "ꕯꖽꖫꕟꖏꔓꔻꕩꕌꔤꔳꖽꘋꕭꔓꔤꖆꕇꔻꕩꕉꔓ ꖨꕮꕊꕑꕇꔻꕞꔤꕞꔤꔺꕩꔛꔟꔻ ꔤꔺꕩ ꗛꔤꘂ ꕗꕴꔀ ꕮꔤꕟꕃꔤꕟꘋꕉꔤꔻ ꖨꕮꕊꔤ" + - "ꕚꔷꕧꕮꔧꕪꗘꖺꗵꘋꔛꗨꗢꔞꕰꕃꕅꔻꕚꘋꕪꕹꔵꕩꕃꔸꕑꔳꖏꕹꖄꔻꔻꘋ ꕃꔳꔻ ꗪ ꔕꔲꔻꖏꔸꕩ ꗛꔤ ꕪꘋꗒꖏꔸꕩ ꗛꔤ ꔒꘋꗣ ꗏ" + - "ꖴꔃꔳꔞꔀꕮꘋ ꔳꘋꗣꕪꕤꔻꕚꘋꕞꕴꔻꔒꕑꗟꘋꔻꘋ ꖨꔻꕩꔷꗿꘋꔻꗳꘋꖬꔸ ꕞꘋꕪꕞꔤꔫꕩꔷꖇꕿꔷꖤꔃꕇꕰꗏꔻꘋꗂꖺꕞꔳꔲꕩꔒꔫꕩꗞ" + - "ꕟꖏꗞꕯꖏꖒꔷꖁꕙꕮꕜꕭꔻꕪꕮꕊꕣ ꔳꘋꗣꕮꔖꖁꕇꕰꕮꔷꕆꕩꘋꕮꗞꖐꔷꕩꗛꔤ ꕪꘋꗒ ꕮꔸꕩꕯ ꔳꘋꗣꕮꔳꕇꕃꗞꔓꔎꕇꕰꗞꘋꔖꕟꔳꕮ" + - "ꕊꕚꗞꔓꗔꕮꔷꕜꔍꕮꕞꕌꔨꘈꔻꖏꕮꔒꔻꕩꕹꕤꔭꕃꕯꕆꔫꕩꕪꔷꖁꕇꕰ ꕯꕮꕊꕯꔤꕧꗟꖺꗉ ꔳꘋꗣꕯꔤꕀꔸꕩꕇꕪꕟꖶꕎꘉꕜ ꖨꕮꕊꗟꖺꔃ" + - "ꕇꕐꔷꖆꖩꖸꔃꔤꔽꔤ ꖨꕮ ꕯꕮꕊꕱꕮꘋꕐꕯꕮꗨꗡꖩꗱꘋꔻ ꕶꔷꕇꔻꕩꕐꖛꕎ ꕅꔤꕇ ꕯꕮꕊꔱꔒꔪꘋꕐꕃꔻꕚꘋꕶꗷꘋꔻꘋ ꔪꘂ ꗪ " + - "ꕆꔞꗏꘋꔪꔳꕪꕆꔪꖳꕿ ꔸꖏꕐꔒꔻꔳꕯ ꔎꔒ ꕀꔤ ꗛꔤ ꕞ ꗱ ꗪ ꕭꕌꕤꕶꕿꕃꔤ ꕸꖃꔀꕐꖃꕐꕟꗝꔀꕪꕚꕌꔓꗠꖻꖄꕆꕇꕰꗐꖺꔻꕩ" + - "ꕟꖙꕡꕞꕌꖝ ꕸꖃꔀꖬꕞꔤꕮꕊꕯ ꔳꘋꗣꔖꗼꔷꖬꗵꘋꖬꔨꗵꘋꔻꕬꕶꕱꔻꘋ ꗥꔷꕯꔻꖃꔍꕇꕰꔻꖃꕙꕃꕩꔋꕩ ꕒꕌꖺ ꕸꖃꔀꕮꔸꖆ ꕢꘋ" + - "ꔻꕇꕭꕌꖇꕮꔷꕩꖬꔸꕯꔈꕢꕴ ꕿꔈ ꗪ ꕉ ꕮꔧ ꕗꕴꔀꗡꗷ ꕢꔍꗍꖺꔻꕩꘋꖬꕎꔽ ꖨꕮꕊꗋꖺꕃꔻ ꗪ ꕪꔤꖏꔻ ꔳꘋꗣꕦꔵꕿꖑꕚꔤ" + - " ꖨꕮꕊꕚꕀꕃꔻꕚꘋꕿꔞꖃꔎꔒ ꗃ ꔳꗞꖻꗋꖺꕃꕮꕇꔻꕚꘋꖤꕇꔻꕩꗋꕬꗋꖺꕃꖤꔸꔕꕜ ꗪ ꕿꔆꖑꕚꖣꖨꕚꔤꕎꘋꕚꘋꕤꕇꕰꖳꖴꔓꘋꖳꕭꕡꕶ" + - "ꕱꖳꔓꗝꔀꖳꗩꕃꔻꕚꘋꔻꘋ ꔲꘋꔻꘋ ꗪ ꖶꔓꕯꔵꘋ ꖸꕙꔳꕪꘋ ꕸꖃꔀꔛꔟꔻ ꗩꗡ ꗏ ꖷꖬ ꔳꘋꗣꕶꕱ ꗩꗡ ꗏ ꖷꖬ ꔳꘋꗣꗲ" + - "ꕇꖮꔃꕞꕙꖸꕎꖤꕎꔷꔻ ꗪ ꖢꖤꕯꕢꕹꖙꕉꔝꘈꘋꕮꗚꔎꕉꔱꔸꕪ ꗛꔤ ꔒꘋꗣ ꗏ ꕸꖃꔀꕤꔭꕩꔽꕓꖜꔃ", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0009, 0x002c, 0x0041, 0x005e, 0x0067, 0x0076, - 0x007f, 0x0088, 0x0088, 0x0097, 0x00a7, 0x00b3, 0x00c5, 0x00ce, - 0x00ce, 0x00e0, 0x0100, 0x010c, 0x011b, 0x0127, 0x0137, 0x0143, - 0x014c, 0x0155, 0x015e, 0x015e, 0x0167, 0x0173, 0x017f, 0x017f, - 0x018b, 0x0197, 0x01a0, 0x01a0, 0x01ac, 0x01b8, 0x01c1, 0x01ca, - 0x01ca, 0x01ea, 0x0208, 0x020e, 0x0221, 0x022e, 0x023e, 0x0244, - 0x0250, 0x0259, 0x0265, 0x0265, 0x0275, 0x027e, 0x0295, 0x0295, - 0x0295, 0x02a4, 0x02b4, 0x02bd, 0x02bd, 0x02c6, 0x02d2, 0x02de, - // Entry 40 - 7F - 0x02f7, 0x0306, 0x0306, 0x0312, 0x0321, 0x032a, 0x032a, 0x0336, - 0x033f, 0x034e, 0x034e, 0x034e, 0x035e, 0x0367, 0x0381, 0x0390, - 0x0390, 0x039c, 0x03a5, 0x03b1, 0x03bd, 0x03c9, 0x03dc, 0x03dc, - 0x03e5, 0x03f1, 0x0408, 0x0411, 0x041a, 0x0429, 0x0440, 0x0449, - 0x0449, 0x0458, 0x0461, 0x0474, 0x047d, 0x047d, 0x047d, 0x0486, - 0x0492, 0x049b, 0x04a7, 0x04a7, 0x04b6, 0x04c6, 0x04d8, 0x04d8, - 0x04e1, 0x050c, 0x0515, 0x051e, 0x0531, 0x053a, 0x053a, 0x0546, - 0x0552, 0x055b, 0x0561, 0x0570, 0x057c, 0x0588, 0x0594, 0x05b2, - // Entry 80 - BF - 0x05cc, 0x05ea, 0x05f3, 0x0609, 0x0618, 0x0621, 0x062d, 0x063d, - 0x064f, 0x065f, 0x066b, 0x0674, 0x0683, 0x0692, 0x069e, 0x06a7, - 0x06b0, 0x06b9, 0x06c5, 0x06c5, 0x06c5, 0x06d4, 0x06e7, 0x06f6, - 0x06fc, 0x0708, 0x0714, 0x0714, 0x073b, 0x0747, 0x0756, 0x0765, - 0x076e, 0x0777, 0x0783, 0x078f, 0x0798, 0x07a4, 0x07b0, 0x07bc, - 0x07d5, 0x07de, 0x07f1, 0x0800, 0x080f, 0x081f, 0x0828, 0x0831, - 0x0837, 0x0840, 0x0857, 0x0860, 0x0869, 0x0872, 0x088b, 0x08a8, - 0x08b4, 0x08c3, 0x08cc, 0x08ea, 0x08f6, 0x0906, 0x0940, 0x0956, - // Entry C0 - FF - 0x095c, 0x0968, 0x0971, 0x0971, 0x097a, 0x0986, 0x0986, 0x0992, - 0x099b, 0x09ae, 0x09ca, 0x09d3, 0x09dc, 0x09e8, 0x09f4, 0x0a04, - 0x0a13, 0x0a13, 0x0a22, 0x0a3c, 0x0a4c, 0x0a58, 0x0a64, 0x0a70, - 0x0a70, 0x0a96, 0x0aa9, 0x0aa9, 0x0ab2, 0x0ac5, 0x0ac5, 0x0aec, - 0x0af2, 0x0af2, 0x0af8, 0x0b08, 0x0b1a, 0x0b23, 0x0b37, 0x0b4f, - 0x0b5b, 0x0b61, 0x0b6a, 0x0b84, 0x0b8d, 0x0b99, 0x0ba8, 0x0bb4, - 0x0bbd, 0x0bbd, 0x0bbd, 0x0bc3, 0x0bcf, 0x0be1, 0x0be1, 0x0c0c, - 0x0c22, 0x0c47, 0x0c69, 0x0c78, 0x0c84, 0x0c9b, 0x0ca7, 0x0ca7, - // Entry 100 - 13F - 0x0cb0, 0x0cb9, 0x0ce4, 0x0ced, 0x0cf9, - }, - }, - { // vai-Latn - "AŋdóraYunaitɛ Arabhi ƐmireAfigándesitaŋAŋtígwa ƁahabhudaAŋgílaAbhaniyaAm" + - "éniyaAŋgólaAjɛŋtínaPoo SambowaƆ́situwaƆsituwéeliyaArubhaAzabhaijaŋB" + - "hɔsiniyaBhabhedoBhangiladɛ̀shiBhɛgiyɔŋBhokina FásoBhɔgeriyaBharɛŋBhu" + - "rundiBhɛniBhɛmudaBhurunɛĩBholiviyaBhurazeliBahámasiBhutaŋBhosuwanaBh" + - "ɛlarusiBhelizKánádaAvorekooÁfíríka Lumaã Tɛ BoloeKóngoSuweza LumaãK" + - "ódivówaKóki TiŋŋɛChéliKameruŋCháínaKɔlɔmbiyaKósíta RíkoKiyubhaKepi " + - "Vɛdi TiŋŋɛSaɛpurɔChɛki BoloeJamáĩJibhutiDanimahaDomíiníkaDomíiníka Ɓ" + - "oloeAgiriyaƐ́kúwédɔƐsitóninyaMísélaƐriteraPanyɛĩÍtiyópiyaFiŋlɛŋFíjiF" + - "áháki Luma TiŋŋɛMikonisiyaFɛŋsiGabhɔŋYunaitɛ KíŋdɔŋGurinédaJɔɔjiyaF" + - "ɛŋsi GiwanaGanaJibhurataJamba Kuwa LumaãGambiyaGiniGuwadelupeDúúnyá" + - " Tɛ GiiniHɛlɛŋGuwatɛmalaGuwamiGini BhisawoGuyanaHɔnduraKoresiyaHáiti" + - "Hɔ́ngareÍndonisiyaÁre LumaãBhanísiláilaÍndiyaJengéesi Gbawoe Índiya " + - "Kɔiyɛ LɔIrakiIraŋÁisi LumaãÍtaliJamaikaJɔɔdaŋJapaŋKényaKigisitaŋKaŋb" + - "hodiyaKiribhatiKomorosiSiŋ Kisi ɓɛ́ NevisiKoriya Kɔi KaŋndɔKoriya Kɔ" + - "i Leŋŋɛ LɔKuwetiKeemaŋ TiŋŋɛKazasitaŋLawosiLebhanɔSiŋ LusiyaSuri Laŋ" + - "kaLaibhiyaLisótoLituweninyaLusimbɔLativiyaLebhiyaMɔrokoMɔnakoMɔlidov" + - "aMadagasitaMasha TiŋŋɛMasedoninyaMaliMiyamahaMɔngoliyaKɔi Kaŋndɔ Mar" + - "iyana TiŋŋɛMatinikiMɔretaninyaMɔseratiMalitaMɔreshɔMalidaviMalawiMɛs" + - "íkoMalesiyaMozambikiNamibiyaKalidoninya NámaáNaĩjaNɔfɔ TiŋŋɛNaĩjiri" + - "yaNikaraguwaNidɔlɛŋNɔɔweNepaNoruNiweZilɛŋ NámaáOmaŋPanamaPɛruFɛŋsi P" + - "olinísiyaPapuwa Gini NámaáFélepiŋPakisitaŋPólɛŋSiŋ Piiyɛ ɓɛ́ Mikelɔŋ" + - "PitikɛŋPiyuto RikoPalesitininya Tele Jii Kɔiyɛ lá hĩ GazaPotokíiPalo" + - "ParagɔeKatahaRenyɔɔ̃RomininyaRɔshiyaRawundaLahabuSulaimaãna TiŋŋɛSes" + - "hɛɛSudɛŋSuwidɛŋSíingapooSiŋ HɛlinaSuloveninyaSulovakiyaGbeya BahawɔS" + - "aŋ MarindoSinigahaSomaliyaSurinambeSawo Tombe ɓɛ a GbawoeƐlɛ SávádɔS" + - "íyaŋSuwazi LumaãTukisi ɓɛ̀ Kaikóosi TiŋŋɛChádiTogoTai LumaãTajikisi" + - "taŋTokeloTele Ɓɔ́ Timɔɔ̃TukimɛnisitaŋTunisiyaTɔngaTɔ́ɔ́kiTurindeda ɓ" + - "ɛ́ TobhegoTuváluTaiwaŋTaŋzaninyaYukuréŋYugandaPooYuwegɔweYubhɛkisit" + - "aŋVatikaŋ ƁoloeSiŋ ViŋsiVɛnɛzuwelaJengéesi Bhɛɛ Lɔ Musu TiŋŋɛPoo Bhɛ" + - "ɛ lɔ Musu TiŋŋɛViyanamiVanuwátuWalísiSamowaYemɛniMavoteAfirika Kɔi " + - "Leŋŋɛ LɔZambiyaZimbabhuwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0008, 0x001e, 0x002d, 0x0041, 0x0049, 0x0051, - 0x0059, 0x0061, 0x0061, 0x006c, 0x0077, 0x0081, 0x008f, 0x0095, - 0x0095, 0x00a0, 0x00aa, 0x00b2, 0x00c2, 0x00cd, 0x00da, 0x00e4, - 0x00ec, 0x00f4, 0x00fa, 0x00fa, 0x0102, 0x010c, 0x0115, 0x0115, - 0x011e, 0x0127, 0x012e, 0x012e, 0x0137, 0x0141, 0x0147, 0x014f, - 0x014f, 0x0157, 0x0172, 0x0178, 0x0185, 0x018f, 0x019d, 0x01a3, - 0x01ab, 0x01b3, 0x01be, 0x01be, 0x01cc, 0x01d3, 0x01e6, 0x01e6, - 0x01e6, 0x01ef, 0x01fb, 0x0202, 0x0202, 0x0209, 0x0211, 0x021c, - // Entry 40 - 7F - 0x022e, 0x0235, 0x0235, 0x0242, 0x024e, 0x0256, 0x0256, 0x025e, - 0x0266, 0x0271, 0x0271, 0x0271, 0x027a, 0x027f, 0x0295, 0x029f, - 0x029f, 0x02a6, 0x02ae, 0x02c1, 0x02ca, 0x02d3, 0x02e1, 0x02e1, - 0x02e5, 0x02ee, 0x02ff, 0x0306, 0x030a, 0x0314, 0x0327, 0x032f, - 0x032f, 0x033a, 0x0340, 0x034c, 0x0352, 0x0352, 0x0352, 0x035a, - 0x0362, 0x0368, 0x0372, 0x0372, 0x037d, 0x0388, 0x0396, 0x0396, - 0x039d, 0x03c1, 0x03c6, 0x03cb, 0x03d7, 0x03dd, 0x03dd, 0x03e4, - 0x03ed, 0x03f3, 0x03f9, 0x0403, 0x040e, 0x0417, 0x041f, 0x0436, - // Entry 80 - BF - 0x044a, 0x0462, 0x0468, 0x0478, 0x0482, 0x0488, 0x0490, 0x049b, - 0x049b, 0x04a6, 0x04ae, 0x04b5, 0x04c0, 0x04c8, 0x04d0, 0x04d7, - 0x04de, 0x04e5, 0x04ee, 0x04ee, 0x04ee, 0x04f8, 0x0506, 0x0511, - 0x0515, 0x051d, 0x0527, 0x0527, 0x0546, 0x054e, 0x055a, 0x0563, - 0x0569, 0x0572, 0x057a, 0x0580, 0x0588, 0x0590, 0x0599, 0x05a1, - 0x05b4, 0x05ba, 0x05c9, 0x05d3, 0x05dd, 0x05e7, 0x05ee, 0x05f2, - 0x05f6, 0x05fa, 0x0609, 0x060e, 0x0614, 0x0619, 0x062c, 0x063f, - 0x0648, 0x0652, 0x065a, 0x0676, 0x067f, 0x068a, 0x06b5, 0x06bd, - // Entry C0 - FF - 0x06c1, 0x06c9, 0x06cf, 0x06cf, 0x06d9, 0x06e2, 0x06e2, 0x06ea, - 0x06f1, 0x06f7, 0x070b, 0x0713, 0x071a, 0x0723, 0x072d, 0x0739, - 0x0744, 0x0744, 0x074e, 0x075b, 0x0767, 0x076f, 0x0777, 0x0780, - 0x0780, 0x0798, 0x07a7, 0x07a7, 0x07ae, 0x07bb, 0x07bb, 0x07db, - 0x07e1, 0x07e1, 0x07e5, 0x07ef, 0x07fb, 0x0801, 0x0816, 0x0825, - 0x082d, 0x0833, 0x083e, 0x0856, 0x085d, 0x0864, 0x086f, 0x0878, - 0x087f, 0x087f, 0x087f, 0x0882, 0x088b, 0x0899, 0x08a8, 0x08b3, - 0x08bf, 0x08e1, 0x08fd, 0x0905, 0x090e, 0x0915, 0x091b, 0x091b, - // Entry 100 - 13F - 0x0922, 0x0928, 0x0941, 0x0948, 0x0952, - }, - }, - { // vi - viRegionStr, - viRegionIdx, - }, - { // vun - "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + - "iaAngolaAjentinaSamoa ya MarekaniAustriaAustraliaArubaAzabajaniBosni" + - "a na HezegovinaBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareni" + - "BurundiBeniniBermudaBruneiBoliviaBraziliBahamaButaniBotswanaBelarusi" + - "BelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya Afrika ya Kat" + - "iKongoUswisiKodivaaVisiwa vya CookChileKameruniChinaKolombiaKostarik" + - "aKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDenmakiDominikaJa" + - "mhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispaniaUhabeshiUfi" + - "niFijiVisiwa vya FalklandMikronesiaUfaransaGaboniUingerezaGrenadaJoj" + - "iaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineGwadelupeGinekw" + - "etaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasiaHaitiHungariaI" + - "ndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika Bahari HindiIra" + - "kiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigizistaniKambodia" + - "KiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaitiV" + - "isiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSirilank" + - "aLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonakoMoldovaBukini" + - "Visiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya Mariana vya K" + - "askaziniMartinikiMoritaniaMontserratiMaltaMorisiModivuMalawiMeksikoM" + - "alesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha NorfokNijeriaNikar" + - "agwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaPeruPolinesia y" + - "a UfaransaPapuaFilipinoPakistaniPolandiSantapieri na MikeloniPitkair" + - "niPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa PalestinaUrenoPa" + - "lauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiwa vya SolomonS" + - "helisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiera LeoniS" + - "amarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsavadoSiriaUswaz" + - "iVisiwa vya Turki na KaikoChadiTogoTailandiTajikistaniTokelauTimori " + - "ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad na TobagoTuva" + - "luTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibekistaniVatikaniSan" + - "tavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa" + - " vya Virgin vya MarekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMa" + - "yotteAfrika KusiniZambiaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, - 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x0070, 0x0079, 0x007e, - 0x007e, 0x0087, 0x009b, 0x00a3, 0x00ae, 0x00b6, 0x00c0, 0x00c8, - 0x00d0, 0x00d7, 0x00dd, 0x00dd, 0x00e4, 0x00ea, 0x00f1, 0x00f1, - 0x00f8, 0x00fe, 0x0104, 0x0104, 0x010c, 0x0114, 0x011a, 0x0120, - 0x0120, 0x0140, 0x0159, 0x015e, 0x0164, 0x016b, 0x017a, 0x017f, - 0x0187, 0x018c, 0x0194, 0x0194, 0x019d, 0x01a1, 0x01a9, 0x01a9, - 0x01a9, 0x01b0, 0x01c0, 0x01c9, 0x01c9, 0x01cf, 0x01d6, 0x01de, - // Entry 40 - 7F - 0x01f1, 0x01f8, 0x01f8, 0x01fe, 0x0205, 0x020a, 0x020a, 0x0211, - 0x0219, 0x0221, 0x0221, 0x0221, 0x0226, 0x022a, 0x023d, 0x0247, - 0x0247, 0x024f, 0x0255, 0x025e, 0x0265, 0x026a, 0x027d, 0x027d, - 0x0282, 0x028a, 0x0293, 0x0299, 0x029d, 0x02a6, 0x02af, 0x02b6, - 0x02b6, 0x02bf, 0x02c3, 0x02cc, 0x02d2, 0x02d2, 0x02d2, 0x02db, - 0x02e2, 0x02e7, 0x02ef, 0x02ef, 0x02f8, 0x0300, 0x0307, 0x0307, - 0x030c, 0x0331, 0x0336, 0x033c, 0x0344, 0x034a, 0x034a, 0x0351, - 0x0358, 0x035e, 0x0363, 0x0370, 0x0378, 0x0380, 0x0386, 0x0399, - // Entry 80 - BF - 0x03a8, 0x03b4, 0x03bb, 0x03cc, 0x03d7, 0x03dc, 0x03e4, 0x03ee, - 0x03f8, 0x0401, 0x0408, 0x040e, 0x0416, 0x041f, 0x0426, 0x042b, - 0x0431, 0x0437, 0x043e, 0x043e, 0x043e, 0x0444, 0x0456, 0x045f, - 0x0463, 0x0468, 0x0470, 0x0470, 0x0490, 0x0499, 0x04a2, 0x04ad, - 0x04b2, 0x04b8, 0x04be, 0x04c4, 0x04cb, 0x04d2, 0x04da, 0x04e1, - 0x04ed, 0x04f3, 0x0504, 0x050b, 0x0514, 0x051c, 0x0521, 0x0527, - 0x052c, 0x0530, 0x053a, 0x053f, 0x0545, 0x0549, 0x055e, 0x0563, - 0x056b, 0x0574, 0x057b, 0x0591, 0x059a, 0x05a3, 0x05d5, 0x05da, - // Entry C0 - FF - 0x05df, 0x05e7, 0x05ed, 0x05ed, 0x05f6, 0x05fd, 0x05fd, 0x0602, - 0x0608, 0x060d, 0x061f, 0x0629, 0x062f, 0x0635, 0x063d, 0x0648, - 0x0650, 0x0650, 0x0658, 0x0663, 0x066b, 0x0673, 0x067a, 0x0682, - 0x0682, 0x0696, 0x069e, 0x069e, 0x06a3, 0x06a9, 0x06a9, 0x06c2, - 0x06c7, 0x06c7, 0x06cb, 0x06d3, 0x06de, 0x06e5, 0x06f8, 0x0707, - 0x070e, 0x0713, 0x071a, 0x072c, 0x0732, 0x0739, 0x0741, 0x0748, - 0x074e, 0x074e, 0x074e, 0x0756, 0x075d, 0x0769, 0x0771, 0x078a, - 0x0793, 0x07b2, 0x07d0, 0x07d9, 0x07e0, 0x07ef, 0x07f4, 0x07f4, - // Entry 100 - 13F - 0x07fa, 0x0801, 0x080e, 0x0814, 0x081c, - }, - }, - { // wae - "HimmelfártsinslaAndorraVereinigti Arabiše EmiratAfganištanAntigua und Ba" + - "rbudaAnguillaAlbanieArmenieAngolaAntarktisArgentinieAmerikaniš Samoa" + - "ÖštričAustralieArubaAlandinsläAserbaidšanBosnie und HerzegovinaBarb" + - "adosBangladešBelgieBurkina FasoBulgarieBačrainBurundiBeninSt. Bartho" + - "lomäus-InslaBermudaBruneiBoliwieBrasilieBahamasBhutanBouvetinslaBots" + - "wanaWísrusslandBelizeKanadaKokosinsläKongo-KinshasaZentralafrikaniši" + - " RebublikKongo BrazzavilleSchwizElfebeiküštaCookinsläTšileKamerunChi" + - "naKolumbieClipperton InslaCosta RicaKubaKap VerdeWienäčtsinsläZypreT" + - "šečieTitšlandDiego GarciaDšibutiDänemarkDoninicaDominikaniši Rebubl" + - "ikAlgerieCeuta und MelillaEcuadorEštlandEgypteWeštsaharaEritreaSchpa" + - "nieEthiopieEuropäiši UnioFinnlandFidšiFalklandinsläMikronesieFäröeFr" + - "ankričGabonEnglandGrenadaGeorgieFranzösiš GuianaGuernseyGanaGibralta" + - "rGrönlandGambiaGineaGuadeloupeEquatorialgineaGričelandSüdgeorgie und" + - " d’südliče SenwičinsläGuatemalaGuamGinea BissauGuyanaSonderverwaltig" + - "szona HongkongHeard- und McDonald-InsläHondurasKroatieHaitiUngareKan" + - "ariše InsläIndonesieIrlandIsraelIsle of ManIndieBritišes Territorium" + - " em indiše OzeanIrakIranIslandItalieJerseyJamaikaJordanieJapanKenyaK" + - "irgištanKambodšaKiribatiKomoreSt. Kitts und NevisNordkoreaSüdkoreaKu" + - "weitKaimaninsläKasačstanLaosLibanonSt. LuciaLiečtešteiSri LankaLiber" + - "iaLesothoLitaueLuxeburgLettlandLübieMarokoMonagoMoldauMontenegroSt. " + - "MartinMadagaskarMaršalinsläMazedonieMaliBurmaMongoleiSonderverwaltig" + - "szona MakauNördliči MarianeMartiniqueMauretanieMonserratMaltaMauriti" + - "usMalediweMalawiMexikoMalaysiaMosambikNamibiaNiwkaledonieNigerNorfol" + - "kinslaNigeriaNicaraguaHolandNorwägeNepalNauruNiueNiwsélandOmanPanama" + - "PeruFranzösiš PolinesiePapua NiwgineaPhilippinePakištanPoleSt. Pierr" + - "e und MiquelonPitcairnPuerto RicoPaleštinaPortugalPalauParaguaiKatar" + - "Üssers OzeanieRéunionRumänieSerbieRusslandRuandaSaudi ArabieSalomon" + - "eSečelleSudanSchwedeSingapurSt. HelenaSlowenieSvalbard und Jan Mayen" + - "SlowakeiSierra LeoneSan MarinoSenegalSomaliaSurinameSão Tomé and Prí" + - "ncipeEl SalvadorSürieSwasilandTristan da CunhaTurks- und Caicosinslä" + - "TšadFranzösiši Süd- und AntarktisgebietTogoThailandTadšikistanTokela" + - "uOšttimorTurkmeništanTunesieTongaTürkeiTrinidad und TobagoTuvaluTaiw" + - "anTansaniaUkraineUgandaAmerikaniš OzeanieAmerikaUrugauyUsbekištanVat" + - "ikanSt. Vincent und d’GrenadineVenezuelaBritiši JungfröiwinsläAmerik" + - "aniši JungfröiwinsläVietnamVanuatuWallis und FutunaSamoaJémeMoyetteS" + - "üdafrikaSambiaSimbabweUnbekannti RegioWäldAfrikaNordamerikaSüdameri" + - "kaOzeanieWeštafrikaZentralamerikaOštafrikaNordafrikaMittelafrikaSüdl" + - "ičs AfrikaAmerikaniš KontinäntNördličs AmerikaKaribikOštasieSüdasieS" + - "üdoštasieSüdeuropaAuštralie und NiwsélandMelanesieMikronesišes Inse" + - "lgebietPolinesieAsieZentralasieWeštasieEuropaOšteuropaNordeuropaWešt" + - "europaLatíamerika", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0011, 0x0018, 0x0032, 0x003d, 0x0050, 0x0058, 0x005f, - 0x0066, 0x006c, 0x0075, 0x007f, 0x0090, 0x0099, 0x00a2, 0x00a7, - 0x00b2, 0x00be, 0x00d4, 0x00dc, 0x00e6, 0x00ec, 0x00f8, 0x0100, - 0x0108, 0x010f, 0x0114, 0x012b, 0x0132, 0x0138, 0x013f, 0x013f, - 0x0147, 0x014e, 0x0154, 0x015f, 0x0167, 0x0173, 0x0179, 0x017f, - 0x018a, 0x0198, 0x01b3, 0x01c4, 0x01ca, 0x01d8, 0x01e2, 0x01e8, - 0x01ef, 0x01f4, 0x01fc, 0x020c, 0x0216, 0x021a, 0x0223, 0x0223, - 0x0233, 0x0238, 0x0240, 0x0249, 0x0255, 0x025d, 0x0266, 0x026e, - // Entry 40 - 7F - 0x0284, 0x028b, 0x029c, 0x02a3, 0x02ab, 0x02b1, 0x02bc, 0x02c3, - 0x02cb, 0x02d3, 0x02e3, 0x02e3, 0x02eb, 0x02f1, 0x02ff, 0x0309, - 0x0310, 0x0319, 0x031e, 0x0325, 0x032c, 0x0333, 0x0345, 0x034d, - 0x0351, 0x035a, 0x0363, 0x0369, 0x036e, 0x0378, 0x0387, 0x0391, - 0x03bc, 0x03c5, 0x03c9, 0x03d5, 0x03db, 0x03f8, 0x0412, 0x041a, - 0x0421, 0x0426, 0x042c, 0x043c, 0x0445, 0x044b, 0x0451, 0x045c, - 0x0461, 0x0487, 0x048b, 0x048f, 0x0495, 0x049b, 0x04a1, 0x04a8, - 0x04b0, 0x04b5, 0x04ba, 0x04c4, 0x04cd, 0x04d5, 0x04db, 0x04ee, - // Entry 80 - BF - 0x04f7, 0x0500, 0x0506, 0x0512, 0x051c, 0x0520, 0x0527, 0x0530, - 0x053c, 0x0545, 0x054c, 0x0553, 0x0559, 0x0561, 0x0569, 0x056f, - 0x0575, 0x057b, 0x0581, 0x058b, 0x0595, 0x059f, 0x05ac, 0x05b5, - 0x05b9, 0x05be, 0x05c6, 0x05e0, 0x05f2, 0x05fc, 0x0606, 0x060f, - 0x0614, 0x061d, 0x0625, 0x062b, 0x0631, 0x0639, 0x0641, 0x0648, - 0x0654, 0x0659, 0x0665, 0x066c, 0x0675, 0x067b, 0x0683, 0x0688, - 0x068d, 0x0691, 0x069b, 0x069f, 0x06a5, 0x06a9, 0x06be, 0x06cc, - 0x06d6, 0x06df, 0x06e3, 0x06fa, 0x0702, 0x070d, 0x0717, 0x071f, - // Entry C0 - FF - 0x0724, 0x072c, 0x0731, 0x0740, 0x0748, 0x0750, 0x0756, 0x075e, - 0x0764, 0x0770, 0x0778, 0x0780, 0x0785, 0x078c, 0x0794, 0x079e, - 0x07a6, 0x07bc, 0x07c4, 0x07d0, 0x07da, 0x07e1, 0x07e8, 0x07f0, - 0x07f0, 0x0808, 0x0813, 0x0813, 0x0819, 0x0822, 0x0832, 0x0849, - 0x084e, 0x0874, 0x0878, 0x0880, 0x088c, 0x0893, 0x089c, 0x08a9, - 0x08b0, 0x08b5, 0x08bc, 0x08cf, 0x08d5, 0x08db, 0x08e3, 0x08ea, - 0x08f0, 0x0903, 0x0903, 0x090a, 0x0911, 0x091c, 0x0923, 0x0940, - 0x0949, 0x0962, 0x097f, 0x0986, 0x098d, 0x099e, 0x09a3, 0x09a3, - // Entry 100 - 13F - 0x09a8, 0x09af, 0x09b9, 0x09bf, 0x09c7, 0x09d7, 0x09dc, 0x09e2, - 0x09ed, 0x09f8, 0x09ff, 0x0a0a, 0x0a18, 0x0a22, 0x0a2c, 0x0a38, - 0x0a48, 0x0a5e, 0x0a70, 0x0a77, 0x0a7f, 0x0a87, 0x0a93, 0x0a9d, - 0x0ab6, 0x0abf, 0x0ad8, 0x0ae1, 0x0ae5, 0x0af0, 0x0af9, 0x0aff, - 0x0b09, 0x0b13, 0x0b1e, 0x0b2a, - }, - }, - { // xog - "AndoraEmireetiAfaganisitaniAntigwa ni BarabudaAngwilaAlibaniyaArameniyaA" + - "ngolaArigentinaSamowa omumerikaAwusituriyaAwusitureliyaArubaAzerebay" + - "ijaaniBoziniya HezegovinaBarabadosiBangaladesiBubirigiBurukina FasoB" + - "ulugariyaBaareeniBurundiBeniniBeremudaBurunayiBoliviyaBuraziiriBaham" + - "asiButaaniBotiswanaBelarusiBelizeKanadaKongo - ZayireLipabulika ya S" + - "enturafirikiKongoSwitizirandiKote DivwaEbizinga bya KkukiCileKameruu" + - "niCayinaKolombyaKosita RikaCubaEbizinga bya Kepu VerediSipuriyaLipab" + - "ulika ya CeekaBudaakiJjibutiDenimaakaDominikaLipabulika ya DominikaA" + - "ligeryaEkwadoEsitoniyaMisiriEritureyaSipeyiniEsyopyaFinilandiFijiEbi" + - "izinga bya FalikalandiMikuronezyaBufalansaGaboniBungerezaGurenadaGyo" + - "gyaGuyana enfalansaGanaGiburalitaGurenelandiGambyaGiniGwadalupeGayan" + - "a yaku ekwetaBuyonaaniGwatemalaGwamuGini-BisawuGayanaHundurasiKurowe" + - "syaHayitiHangareYindonezyaAyalandiYisirayeriBuyindiEbizinga bya Cago" + - "YiraakaYiraaniAyisirandiYitaleJamayikaYorodaniJapaniKenyaKirigizisit" + - "aaniKambodyaKiribatiEbizinga bya KomoroSenti Kitisi ne NevisiKoreya " + - "eya mumambukaKoreya eya mumaserengetaKuwetiEbizinga bya KayimaaniKaz" + - "akisitaaniLawosiLebanoniSenti LuciyaLicitensitayiniSirilankaLiberyaL" + - "esosoLisuwenyaLukisembaagaLativyaLibyaMorokoMonakoMolodovaMadagasika" + - "Bizinga bya MarisoMasedoniyaMaliMyanimaMongoliyaBizinga bya Mariyana" + - " ebyamumambukaMaritiniikiMawulitenyaMonteseraatiMalitaMawulisyasiEbi" + - "zinga bya MalidiveMalawiMekisikoMalezyaMozambiikiNamibiyaKaledonya m" + - "upyaNijeKizinga ky’eNorofokoNayijeryaNikaraguwaHolandiNoweNepaloNawu" + - "ruNiyuweNiyuziirandiOmaaniPanamaPeruPolinesiya enfalansaPapwa Nyugin" + - "iEbizinga bya FiripinoPakisitaaniPolandiSenti Piyere ni MikeloniPiti" + - "keeniPotorikoPalesitayini ni GazaPotugaaliPalawuParagwayiKataaLeyuny" + - "oniLomaniyaLasaRwandaSawudarebyaEbizanga bya SolomooniSesereSudaaniS" + - "wideniSingapowaSenti HerenaSirovenyaSirovakyaSiyeralewoneSanimarinoS" + - "enegaaloSomaliyaSurinaamuSanitome ni PurincipeEl salivadoSiriyaSwazi" + - "randiEbizinga bya Taaka ni KayikosiCaadiTogoTayirandiTajikisitaaniTo" + - "kelawuTimowaTakimenesitaaniTunisyaTongaTtakeTurindaadi ni TobagoTuva" + - "luTayiwaniYukurayineYugandaAmerikaWurugwayiWuzibekisitaaniVatikaaniS" + - "enti Vinsenti ni GurendadiiniVenzweraEbizinga bya Virigini ebitwalib" + - "wa BungerezaEbizinga bya Virigini eby’AmerikaVyetinaamuVanawuwatuWal" + - "isi ni FutunaSamowaYemeniMayotteSawusafirikaZambyaZimbabwe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0006, 0x000e, 0x001b, 0x002e, 0x0035, 0x003e, - 0x0047, 0x004d, 0x004d, 0x0057, 0x0067, 0x0072, 0x007f, 0x0084, - 0x0084, 0x0092, 0x00a5, 0x00af, 0x00ba, 0x00c2, 0x00cf, 0x00d9, - 0x00e1, 0x00e8, 0x00ee, 0x00ee, 0x00f6, 0x00fe, 0x0106, 0x0106, - 0x010f, 0x0117, 0x011e, 0x011e, 0x0127, 0x012f, 0x0135, 0x013b, - 0x013b, 0x0149, 0x0164, 0x0169, 0x0175, 0x017f, 0x0191, 0x0195, - 0x019e, 0x01a4, 0x01ac, 0x01ac, 0x01b7, 0x01bb, 0x01d3, 0x01d3, - 0x01d3, 0x01db, 0x01ee, 0x01f5, 0x01f5, 0x01fc, 0x0205, 0x020d, - // Entry 40 - 7F - 0x0223, 0x022b, 0x022b, 0x0231, 0x023a, 0x0240, 0x0240, 0x0249, - 0x0251, 0x0258, 0x0258, 0x0258, 0x0261, 0x0265, 0x027e, 0x0289, - 0x0289, 0x0292, 0x0298, 0x02a1, 0x02a9, 0x02af, 0x02bf, 0x02bf, - 0x02c3, 0x02cd, 0x02d8, 0x02de, 0x02e2, 0x02eb, 0x02fd, 0x0306, - 0x0306, 0x030f, 0x0314, 0x031f, 0x0325, 0x0325, 0x0325, 0x032e, - 0x0337, 0x033d, 0x0344, 0x0344, 0x034e, 0x0356, 0x0360, 0x0360, - 0x0367, 0x0378, 0x037f, 0x0386, 0x0390, 0x0396, 0x0396, 0x039e, - 0x03a6, 0x03ac, 0x03b1, 0x03c0, 0x03c8, 0x03d0, 0x03e3, 0x03f9, - // Entry 80 - BF - 0x040d, 0x0425, 0x042b, 0x0441, 0x044e, 0x0454, 0x045c, 0x0468, - 0x0477, 0x0480, 0x0487, 0x048d, 0x0496, 0x04a2, 0x04a9, 0x04ae, - 0x04b4, 0x04ba, 0x04c2, 0x04c2, 0x04c2, 0x04cc, 0x04de, 0x04e8, - 0x04ec, 0x04f3, 0x04fc, 0x04fc, 0x051e, 0x0529, 0x0534, 0x0540, - 0x0546, 0x0551, 0x0566, 0x056c, 0x0574, 0x057b, 0x0585, 0x058d, - 0x059c, 0x05a0, 0x05b6, 0x05bf, 0x05c9, 0x05d0, 0x05d4, 0x05da, - 0x05e0, 0x05e6, 0x05f2, 0x05f8, 0x05fe, 0x0602, 0x0616, 0x0623, - 0x0638, 0x0643, 0x064a, 0x0662, 0x066b, 0x0673, 0x0687, 0x0690, - // Entry C0 - FF - 0x0696, 0x069f, 0x06a4, 0x06a4, 0x06ad, 0x06b5, 0x06b5, 0x06b9, - 0x06bf, 0x06ca, 0x06e0, 0x06e6, 0x06ed, 0x06f4, 0x06fd, 0x0709, - 0x0712, 0x0712, 0x071b, 0x0727, 0x0731, 0x073a, 0x0742, 0x074b, - 0x074b, 0x0760, 0x076b, 0x076b, 0x0771, 0x077b, 0x077b, 0x0799, - 0x079e, 0x079e, 0x07a2, 0x07ab, 0x07b8, 0x07c0, 0x07c6, 0x07d5, - 0x07dc, 0x07e1, 0x07e6, 0x07fa, 0x0800, 0x0808, 0x0808, 0x0812, - 0x0819, 0x0819, 0x0819, 0x0820, 0x0829, 0x0838, 0x0841, 0x085f, - 0x0867, 0x0892, 0x08b5, 0x08bf, 0x08c9, 0x08d9, 0x08df, 0x08df, - // Entry 100 - 13F - 0x08e5, 0x08ec, 0x08f8, 0x08fe, 0x0906, - }, - }, - { // yav - "Aŋtúlaimiláat i paaláapAfkanistáŋAŋtíka na PalpútaAŋkílaAlpaníAlmaníaAŋk" + - "úlaAlsaŋtínSámua u AmelíkaOtilísOtalalíAlúpaAsɛlpaisáŋPusiní-ɛlkofí" + - "naPalpatósPaŋkalatɛsPɛlsíikPulikínafásóPulukalíiPalɛŋPúlúndíPenɛŋPɛl" + - "mútaPulunéyPolífiaPilesílPahámasPutaŋPosuánaPelalúsPelíseKánátakitɔŋ" + - " kí kongóSantalafilíikKongósuwíisKótifualɛKúukeSilíKemelúnSíineKɔlɔ́" + - "mbíaKóstálíkakúpaKápfɛlsíplɛkitɔŋ kí cɛ́knsámansíputítanemálktúmúnék" + - "ekitɔŋ kí tumunikɛ́ŋAlselíekuatɛ́lɛstoniisípitelitéepanyáetiopífɛnlá" + - "ndfísimaluwínmikolonesífelensíkapɔ́ŋingilíískelenáatsɔlsíikuyáan u f" + - "elensíkanásílpalatáalkuluɛnlándkambíikiinékuatelúupkinéekuatolialkil" + - "ɛ́ɛkkuatemalákuamiɛkiinépisaókuyáanɔndúlasKolowasíiayítiɔngilíɛndon" + - "esíililándísilayɛ́lɛ́ɛndKɔɔ́m kí ndián yi ngilísilákiláŋisláanditalí" + - "samayíiksɔltanísapɔ́ɔŋkéniakilikisistáŋKámbósekilipatíKɔmɔ́ɔlsɛ́ŋkil" + - "istɔ́f eniɛ́fkɔlé u muɛnɛ́kɔlé wu mbátkowéetKáyímanɛkasaksitáŋlawósl" + - "ipáŋsɛ́ŋtɛ́lusílístɛ́nsitáyinsilíláŋkalipélialesotólitiyaníliksambúu" + - "lletonílipíimalóokmonakómoltafímatakaskáalílmalasáalmasetuánmalímiaŋ" + - "máalmongolíil maliyanɛ u muɛnɛ́maltiníikmolitanímɔŋsilámálɛ́tmolísma" + - "letíifmalawímɛksíikmalesímosambíknamipínufɛ́l kaletonínisɛ́ɛlil nɔ́l" + - "fɔ́lɔknisélianikalakánitililáandnɔlfɛ́ɛsnepáalnawulúniyuwénufɛ́l sel" + - "áandomáŋpanamápelúpolinesí u felensípapuasí nufɛ́l kiinéfilipíinpak" + - "istáŋpɔlɔ́ɔnysɛ́ŋpiɛ́l e mikelɔ́ŋpitikɛ́ɛlínɛ́pólótolíkokitɔŋ ki pal" + - "ɛstíinpɔltukáalpalawúpalakúékatáalelewuniɔ́ŋulumaníulusíuluándáalap" + - "ísawutíitil salomɔ́ŋsesɛ́ɛlsutáaŋsuɛ́tsingapúulsɛ́ŋtɛ́ elɛ́ɛnɛsilof" + - "enísilofakísieláleyɔ́ɔnsan malínosenekáalsomalísulináamsáwó tomé e p" + - "elensípesalfatɔ́ɔlsuasiláandtúluk na káyiikSáattokótayiláandtasikist" + - "áaŋtokelótimɔ́ɔl u nipálɛ́ntulukmenisitáaŋtunusítɔ́ŋkatulukíitilini" + - "táat na tupákɔtufalútayiwáantaŋsaníukilɛ́ɛnukándaamálíkaulukuéyusupe" + - "kistáaŋfatikáaŋsɛ́ŋ fɛŋsáŋ elekelenatíinfenesuweláFilisíin ungilíspi" + - "ndisúlɛ́ pi amálíkafiɛtnáamfanuatúwalíis na futúnasamowáyémɛnmayɔ́ɔt" + - "afilí mbátɛ́saambíisimbapuwé", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0008, 0x001b, 0x0027, 0x003b, 0x0043, 0x004a, - 0x0052, 0x005a, 0x005a, 0x0064, 0x0075, 0x007c, 0x0084, 0x008a, - 0x008a, 0x0097, 0x00a9, 0x00b2, 0x00be, 0x00c7, 0x00d6, 0x00e0, - 0x00e7, 0x00f1, 0x00f8, 0x00f8, 0x0101, 0x0109, 0x0111, 0x0111, - 0x0119, 0x0121, 0x0127, 0x0127, 0x012f, 0x0137, 0x013e, 0x0146, - 0x0146, 0x0158, 0x0166, 0x016c, 0x0173, 0x017e, 0x0184, 0x0189, - 0x0191, 0x0197, 0x01a4, 0x01a4, 0x01b0, 0x01b5, 0x01bd, 0x01bd, - 0x01bd, 0x01c4, 0x01d6, 0x01dd, 0x01dd, 0x01e5, 0x01ee, 0x01f9, - // Entry 40 - 7F - 0x0212, 0x0219, 0x0219, 0x0223, 0x022a, 0x0231, 0x0231, 0x0238, - 0x023e, 0x0245, 0x0245, 0x0245, 0x024e, 0x0253, 0x025b, 0x0266, - 0x0266, 0x026e, 0x0277, 0x0281, 0x028a, 0x0292, 0x02a4, 0x02a4, - 0x02a9, 0x02b6, 0x02c2, 0x02c9, 0x02cf, 0x02d9, 0x02e8, 0x02f2, - 0x02f2, 0x02fc, 0x0303, 0x030f, 0x0316, 0x0316, 0x0316, 0x031f, - 0x0329, 0x032f, 0x0337, 0x0337, 0x0341, 0x0349, 0x0355, 0x0355, - 0x035d, 0x037b, 0x0380, 0x0386, 0x038e, 0x0394, 0x0394, 0x039d, - 0x03a6, 0x03b1, 0x03b7, 0x03c5, 0x03ce, 0x03d7, 0x03e2, 0x03fd, - // Entry 80 - BF - 0x040f, 0x041e, 0x0425, 0x0430, 0x043c, 0x0442, 0x0449, 0x045a, - 0x046c, 0x0478, 0x0480, 0x0487, 0x0490, 0x049b, 0x04a2, 0x04a8, - 0x04af, 0x04b6, 0x04be, 0x04be, 0x04be, 0x04ca, 0x04d6, 0x04df, - 0x04e4, 0x04ee, 0x04f6, 0x04f6, 0x050e, 0x0518, 0x0521, 0x052b, - 0x0534, 0x053a, 0x0543, 0x054a, 0x0553, 0x055a, 0x0563, 0x056a, - 0x057c, 0x0586, 0x0598, 0x05a0, 0x05a9, 0x05b5, 0x05c1, 0x05c8, - 0x05cf, 0x05d6, 0x05e7, 0x05ed, 0x05f4, 0x05f9, 0x060d, 0x0625, - 0x062e, 0x0638, 0x0644, 0x0660, 0x0673, 0x0680, 0x0696, 0x06a1, - // Entry C0 - FF - 0x06a8, 0x06b1, 0x06b8, 0x06b8, 0x06c5, 0x06cd, 0x06cd, 0x06d3, - 0x06dc, 0x06eb, 0x06f9, 0x0703, 0x070b, 0x0712, 0x071c, 0x0734, - 0x073d, 0x073d, 0x0746, 0x0756, 0x0761, 0x076a, 0x0771, 0x077a, - 0x077a, 0x0793, 0x07a0, 0x07a0, 0x07a0, 0x07ab, 0x07ab, 0x07bc, - 0x07c1, 0x07c1, 0x07c6, 0x07d0, 0x07dd, 0x07e4, 0x07fc, 0x080d, - 0x0814, 0x081d, 0x0825, 0x083c, 0x0843, 0x084c, 0x0855, 0x0860, - 0x0867, 0x0867, 0x0867, 0x0870, 0x0878, 0x0886, 0x0890, 0x08b1, - 0x08bc, 0x08ce, 0x08e8, 0x08f2, 0x08fa, 0x090c, 0x0913, 0x0913, - // Entry 100 - 13F - 0x091a, 0x0924, 0x0934, 0x093c, 0x0946, - }, - }, - { // yi - "אַנדארעאַפֿגהאַניסטאַןאַנטיגוע און באַרבודעאַלבאַניעאַרמעניעאַנגאלעאַנטא" + - "ַרקטיקעאַרגענטינעעסטרייךאויסטראַליעאַרובאַבאסניע הערצעגאווינעבאַרבא" + - "ַדאסבאַנגלאַדעשבעלגיעבורקינע פֿאַסאבולגאַריעבורונדיבעניןבערמודעברונ" + - "ייבאליוויעבראַזילבאַהאַמאַסבהוטאַןבאצוואַנעבעלאַרוסבעליזקאַנאַדעקאנ" + - "גא־קינשאַזעצענטראַל־אַפֿריקאַנישע רעפּובליקשווייץהעלפֿאַ נדביין באר" + - "טןקוק אינזלעןטשילעקאַמערוןכינעקאלאמביעקאסטאַ ריקאַקובאַקאַפּווערדיש" + - "ע אינזלעןקוראַסאַאטשעכיידייטשלאַנדדזשיבוטידענמאַרקדאמיניקעדאמיניקאַ" + - "נישע רעפּובליקעקוואַדארעסטלאַנדעגיפּטןעריטרעעשפּאַניעעטיאפּיעאייראפ" + - "ּעישער פֿאַרבאַנדפֿינלאַנדפֿידזשיפֿאַלקלאַנד אינזלעןמיקראנעזיעפֿאַר" + - "א אינזלעןפֿראַנקרייךגאַבאןפֿאַראייניגטע קעניגרייךגרענאַדאַגרוזיעפֿר" + - "אַנצויזישע גויאַנעגערנזיגהאַנעגיבראַלטאַרגרינלאַנדגאַמביעגינעגוואַד" + - "עלופעקוואַטארישע גינעגריכנלאַנדגוואַטעמאַלעגוואַםגינע־ביסאַוגויאַנע" + - "האנדוראַסקראאַטיעהאַיטיאונגערןקאַנאַרישע אינזלעןאינדאנעזיעאירלאַנדי" + - "שראלאינדיעאיראַןאיסלאַנדאיטאַליעדזשערזידזשאַמייקעיאַפּאַןקעניעקאַמב" + - "אדיעקיריבאַטיקאמאראסקיימאַן אינזלעןלאַאסלבנוןליכטנשטייןסרי־לאַנקאַל" + - "יבעריעלעסאטאליטעלוקסעמבורגלעטלאַנדליביעמאַראקאמאנאַקאמאלדאוועמאנטענ" + - "עגראמאַדאַגאַסקאַרמאַרשאַל אינזלעןמאַקעדאניעמאַלימיאַנמאַרמאנגאליימ" + - "אַרטיניקמאַריטאַניעמאנטסעראַטמאַלטאַמאריציוסמאַלדיווןמאַלאַווימעקסי" + - "קעמאַלייזיעמאזאַמביקנאַמיביענײַ קאַלעדאניעניזשערנארפֿאלק אינזלניגער" + - "יעניקאַראַגועהאלאַנדנארוועגיענעפּאַלניו זילאַנדפּאַנאַמאַפּערופֿראַ" + - "נצויזישע פּאלינעזיעפּאַפּואַ נײַ גינעפֿיליפּינעןפּאַקיסטאַןפּוילןפּ" + - "יטקערן אינזלעןפּארטא־ריקאפּארטוגאַלפּאַראַגווײַקאַטאַררעאוניאןרומענ" + - "יעסערביערוסלאַנדרוואַנדעסאלאמאן אינזלעןסיישעלסודאַןשוועדןסינגאַפּור" + - "סט העלענעסלאוועניעסלאוואַקייסיערע לעאנעסאַן מאַרינאסענעגאַלסאמאַליע" + - "סורינאַםדרום־סודאַןסאַא טאמע און פּרינסיפּעעל סאַלוואַדארסיריעסוואַ" + - "זילאַנדטשאַדטאגאטיילאַנדטורקמעניסטאַןטוניסיעטאנגאַטערקייטרינידאַד א" + - "ון טאבאַגאטואוואַלוטאַנזאַניעאוקראַינעאוגאַנדעפֿאַראייניגטע שטאַטןא" + - "ורוגווייוואַטיקאַן שטאָטווענעזועלעוויעטנאַםוואַנואַטוסאַמאאַקאסאווא" + - "תימןמאַיאטדרום־אַפֿריקעזאַמביעזימבאַבוועאומבאַוואוסטער ראַיאןוועלטא" + - "ַפֿריקעצפון־אַמעריקעדרום־אַמעריקעאקעאַניעצענטראַל־אַמעריקעאַמעריקעצ" + - "פונדיקע אַמעריקעקאַראַאיבעמזרח אַזיעדרום־אַזיעדרום־מזרח אַזיעדרום־א" + - "ייראפּעפּאלינעזיעאַזיעצענטראַל־אַזיעמערב־אַזיעאייראפּעמזרח־אייראפּע" + - "צפֿון־אייראפּעמערב־אייראפּעלאַטיין־אַמעריקע", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x000e, 0x000e, 0x002c, 0x0054, 0x0054, 0x0066, - 0x0076, 0x0084, 0x009c, 0x00b0, 0x00b0, 0x00be, 0x00d4, 0x00e2, - 0x00e2, 0x00e2, 0x0107, 0x011b, 0x0131, 0x013d, 0x0158, 0x016a, - 0x016a, 0x0178, 0x0182, 0x0182, 0x0190, 0x019c, 0x01ac, 0x01ac, - 0x01ba, 0x01ce, 0x01dc, 0x01dc, 0x01ee, 0x01fe, 0x0208, 0x0218, - 0x0218, 0x0234, 0x0273, 0x0273, 0x027f, 0x02a5, 0x02ba, 0x02c4, - 0x02d4, 0x02dc, 0x02ec, 0x02ec, 0x0303, 0x030d, 0x0336, 0x0348, - 0x0348, 0x0348, 0x0354, 0x0368, 0x0368, 0x0378, 0x0388, 0x0398, - // Entry 40 - 7F - 0x03c5, 0x03c5, 0x03c5, 0x03d7, 0x03e7, 0x03f5, 0x03f5, 0x0403, - 0x0413, 0x0423, 0x0450, 0x0450, 0x0462, 0x0470, 0x0495, 0x04a9, - 0x04c4, 0x04da, 0x04e6, 0x0513, 0x0525, 0x0531, 0x055a, 0x0566, - 0x0572, 0x0588, 0x059a, 0x05a8, 0x05b0, 0x05c4, 0x05e5, 0x05f9, - 0x05f9, 0x0611, 0x061d, 0x0633, 0x0641, 0x0641, 0x0641, 0x0653, - 0x0663, 0x066f, 0x067d, 0x06a0, 0x06b4, 0x06c4, 0x06ce, 0x06ce, - 0x06da, 0x06da, 0x06da, 0x06e6, 0x06f6, 0x0706, 0x0714, 0x0728, - 0x0728, 0x0738, 0x0742, 0x0742, 0x0754, 0x0766, 0x0774, 0x0774, - // Entry 80 - BF - 0x0774, 0x0774, 0x0774, 0x0791, 0x0791, 0x079b, 0x07a5, 0x07a5, - 0x07b9, 0x07cf, 0x07dd, 0x07e9, 0x07f1, 0x0805, 0x0815, 0x081f, - 0x082d, 0x083b, 0x084b, 0x085f, 0x085f, 0x087b, 0x089a, 0x08ae, - 0x08b8, 0x08ca, 0x08da, 0x08da, 0x08da, 0x08ec, 0x0902, 0x0916, - 0x0924, 0x0934, 0x0946, 0x0958, 0x0966, 0x0978, 0x098a, 0x099a, - 0x09b5, 0x09c1, 0x09dc, 0x09ea, 0x0a00, 0x0a0e, 0x0a20, 0x0a2e, - 0x0a2e, 0x0a2e, 0x0a43, 0x0a43, 0x0a57, 0x0a61, 0x0a90, 0x0ab2, - 0x0ac8, 0x0ade, 0x0aea, 0x0aea, 0x0b09, 0x0b1f, 0x0b1f, 0x0b33, - // Entry C0 - FF - 0x0b33, 0x0b4b, 0x0b59, 0x0b59, 0x0b69, 0x0b77, 0x0b83, 0x0b93, - 0x0ba3, 0x0ba3, 0x0bc0, 0x0bcc, 0x0bd8, 0x0be4, 0x0bf8, 0x0c09, - 0x0c1b, 0x0c1b, 0x0c2f, 0x0c44, 0x0c5b, 0x0c6b, 0x0c7b, 0x0c8b, - 0x0ca1, 0x0cce, 0x0ce9, 0x0ce9, 0x0cf3, 0x0d0b, 0x0d0b, 0x0d0b, - 0x0d15, 0x0d15, 0x0d1d, 0x0d2d, 0x0d2d, 0x0d2d, 0x0d2d, 0x0d47, - 0x0d55, 0x0d61, 0x0d6d, 0x0d95, 0x0da7, 0x0da7, 0x0dbb, 0x0dcd, - 0x0ddd, 0x0ddd, 0x0ddd, 0x0e04, 0x0e16, 0x0e16, 0x0e35, 0x0e35, - 0x0e49, 0x0e49, 0x0e49, 0x0e5b, 0x0e6f, 0x0e6f, 0x0e7d, 0x0e8b, - // Entry 100 - 13F - 0x0e93, 0x0e9f, 0x0eb9, 0x0ec7, 0x0edb, 0x0f04, 0x0f0e, 0x0f1e, - 0x0f38, 0x0f52, 0x0f62, 0x0f62, 0x0f84, 0x0f84, 0x0f84, 0x0f84, - 0x0f84, 0x0f94, 0x0fb5, 0x0fc9, 0x0fdc, 0x0ff0, 0x100d, 0x1027, - 0x1027, 0x1027, 0x1027, 0x103b, 0x1045, 0x1061, 0x1075, 0x1085, - 0x109f, 0x10bb, 0x10d5, 0x10f5, - }, - }, - { // yo - "Orílẹ́ède ÀàndóràOrílẹ́ède Ẹmirate ti Awọn ArabuOrílẹ́ède ÀfùgànístánìOr" + - "ílẹ́ède Ààntígúà àti BáríbúdàOrílẹ́ède ÀàngúlílàOrílẹ́ède Àlùbàníán" + - "ìOrílẹ́ède AméníàOrílẹ́ède ÀàngólàOrílẹ́ède AgentínàSámóánì ti Oríl" + - "ẹ́ède ÀméríkàOrílẹ́ède AsítíríàOrílẹ́ède ÁstràlìáOrílẹ́ède ÁrúbàOr" + - "ílẹ́ède Asẹ́bájánìOrílẹ́ède Bọ̀síníà àti ẸtisẹgófínàOrílẹ́ède Bábád" + - "ósìOrílẹ́ède BángáládésìOrílẹ́ède Bégíọ́mùOrílẹ́ède Bùùkíná FasòOrí" + - "lẹ́ède BùùgáríàOrílẹ́ède BáránìOrílẹ́ède BùùrúndìOrílẹ́ède Bẹ̀nẹ̀Orí" + - "lẹ́ède BémúdàOrílẹ́ède Búrúnẹ́lìOrílẹ́ède Bọ̀lífíyàOrílẹ́ède Bàràsíl" + - "ìOrílẹ́ède BàhámásìOrílẹ́ède BútánìOrílẹ́ède Bọ̀tìsúwánàOrílẹ́ède B" + - "élárúsìOrílẹ́ède Bèlísẹ̀Orílẹ́ède KánádàOrilẹ́ède KóngòOrílẹ́ède Àr" + - "in gùngun ÁfíríkàOrílẹ́ède KóngòOrílẹ́ède switiṣilandiOrílẹ́ède Kóút" + - "è foràOrílẹ́ède Etíokun KùúkùOrílẹ́ède ṣílèOrílẹ́ède KamerúúnìOrílẹ" + - "́ède ṣáínàOrílẹ́ède KòlómíbìaOrílẹ́ède Kuusita RíkàOrílẹ́ède KúbàOr" + - "ílẹ́ède Etíokun Kápé féndèOrílẹ́ède KúrúsìOrílẹ́ède ṣẹ́ẹ́kìOrílẹ́èd" + - "e GemaniOrílẹ́ède Díbọ́ótìOrílẹ́ède Dẹ́mákìOrílẹ́ède DòmíníkàOrilẹ́è" + - "de DòmíníkánìOrílẹ́ède ÀlùgèríánìOrílẹ́ède EkuádòOrílẹ́ède EsitoniaO" + - "rílẹ́ède ÉgípítìOrílẹ́ède EritiraOrílẹ́ède SipaniOrílẹ́ède EtopiaOrí" + - "lẹ́ède FilandiOrílẹ́ède FijiOrílẹ́ède Etikun FakalandiOrílẹ́ède Mako" + - "ronesiaOrílẹ́ède FaranseOrílẹ́ède GabonOrílẹ́ède OmobabirinOrílẹ́ède" + - " GenadaOrílẹ́ède GọgiaOrílẹ́ède Firenṣi GuanaOrílẹ́ède GanaOrílẹ́ède" + - " GibarataraOrílẹ́ède GerelandiOrílẹ́ède GambiaOrílẹ́ède GeneOrílẹ́èd" + - "e GadelopeOrílẹ́ède Ekutoria GiniOrílẹ́ède GeriisiOrílẹ́ède Guatemal" + - "aOrílẹ́ède GuamuOrílẹ́ède Gene-BusauOrílẹ́ède GuyanaOrílẹ́ède Hondur" + - "asiOrílẹ́ède KòróátíàOrílẹ́ède HaatiOrílẹ́ède HungariOrílẹ́ède Indon" + - "esiaOrílẹ́ède AilandiOrílẹ́ède IserẹliOrílẹ́ède IndiaOrílẹ́ède Etíku" + - "n Índíánì ti Ìlú BírítísìOrílẹ́ède IrakiOrílẹ́ède IraniOrílẹ́ède Aṣi" + - "landiOrílẹ́ède ItaliyiOrílẹ́ède JamaikaOrílẹ́ède JọdaniOrílẹ́ède Jap" + - "aniOrílẹ́ède KenyaOrílẹ́ède KuriṣisitaniOrílẹ́ède KàmùbódíàOrílẹ́ède" + - " KiribatiOrílẹ́ède KòmòrósìOrílẹ́ède Kiiti ati NeefiOrílẹ́ède Guusu " + - "KọriaOrílẹ́ède Ariwa KọriaOrílẹ́ède KuwetiOrílẹ́ède Etíokun KámánìOr" + - "ílẹ́ède KaṣaṣataniOrílẹ́ède LaosiOrílẹ́ède LebanoniOrílẹ́ède LuṣiaO" + - "rílẹ́ède LẹṣitẹnisiteniOrílẹ́ède Siri LankaOrílẹ́ède LaberiaOrílẹ́èd" + - "e LesotoOrílẹ́ède LituaniaOrílẹ́ède LusemogiOrílẹ́ède LatifiaOrílẹ́è" + - "de LibiyaOrílẹ́ède MorokoOrílẹ́ède MonakoOrílẹ́ède ModofiaOrílẹ́ède " + - "MadasikaOrílẹ́ède Etikun MáṣaliOrílẹ́ède MasidoniaOrílẹ́ède MaliOríl" + - "ẹ́ède ManamariOrílẹ́ède MogoliaOrílẹ́ède Etikun Guusu MarianaOrílẹ" + - "́ède MatinikuwiOrílẹ́ède MaritaniaOrílẹ́ède MotseratiOrílẹ́ède Mala" + - "taOrílẹ́ède MaritiusiOrílẹ́ède MaladifiOrílẹ́ède MalawiOrílẹ́ède Mes" + - "ikoOrílẹ́ède MalasiaOrílẹ́ède MoṣamibikuOrílẹ́ède NamibiaOrílẹ́ède K" + - "aledonia TitunOrílẹ́ède NàìjáOrílẹ́ède Etikun Nọ́úfókìOrílẹ́ède Nàìj" + - "íríàOrílẹ́ède NIkaraguaOrílẹ́ède NedalandiOrílẹ́ède NọọwiiOrílẹ́ède" + - " NepaOrílẹ́ède NauruOrílẹ́ède NiueOrílẹ́ède ṣilandi TitunOrílẹ́ède Ọ" + - "ọmaOrílẹ́ède PanamaOrílẹ́ède PeruOrílẹ́ède Firenṣi PolinesiaOrílẹ́" + - "ède Paapu ti GiiniOrílẹ́ède filipiniOrílẹ́ède PakisitanOrílẹ́ède Po" + - "landiOrílẹ́ède Pẹẹri ati mikuloniOrílẹ́ède PikariniOrílẹ́ède Pọto Ri" + - "koOrílẹ́ède Iwọorun Pakisitian ati GaṣaOrílẹ́ède PọtugiOrílẹ́ède Paa" + - "luOrílẹ́ède ParaguyeOrílẹ́ède KotaOrílẹ́ède RiuniyanOrílẹ́ède Romani" + - "yaOrílẹ́ède RọṣiaOrílẹ́ède RuwandaOrílẹ́ède Saudi ArabiaOrílẹ́ède Et" + - "ikun SolomoniOrílẹ́ède seṣẹlẹsiOrílẹ́ède SudaniOrílẹ́ède SwidiniOríl" + - "ẹ́ède SingapoOrílẹ́ède HẹlenaOrílẹ́ède SilofaniaOrílẹ́ède Silofaki" + - "aOrílẹ́ède Siria looniOrílẹ́ède Sani MarinoOrílẹ́ède SẹnẹgaOrílẹ́ède" + - " SomaliaOrílẹ́ède SurinamiOrílẹ́ède Sao tomi ati piriiṣipiOrílẹ́ède " + - "ẸẹsáfádòOrílẹ́ède SiriaOrílẹ́ède SaṣilandOrílẹ́ède Tọọki ati Etiku" + - "n KakọsiOrílẹ́ède ṣààdìOrílẹ́ède TogoOrílẹ́ède TailandiOrílẹ́ède Tak" + - "isitaniOrílẹ́ède TokelauOrílẹ́ède ÌlàOòrùn Tímọ̀Orílẹ́ède Tọọkimenis" + - "itaOrílẹ́ède TuniṣiaOrílẹ́ède TongaOrílẹ́ède TọọkiOrílẹ́ède Tirinida" + - " ati TobagaOrílẹ́ède TufaluOrílẹ́ède TaiwaniOrílẹ́ède TanṣaniaOrílẹ́" + - "ède UkariniOrílẹ́ède UgandaOrílẹ́ède Orilẹede AmerikaOrílẹ́ède Nrug" + - "uayiOrílẹ́ède NṣibẹkisitaniOrílẹ́ède FatikaniOrílẹ́ède Fisẹnnti ati " + - "GenadinaOrílẹ́ède FẹnẹṣuẹlaOrílẹ́ède Etíkun Fágínì ti ìlú BírítísìOr" + - "ílẹ́ède Etikun Fagini ti AmẹrikaOrílẹ́ède FẹtinamiOrílẹ́ède Faniatu" + - "Orílẹ́ède Wali ati futunaOrílẹ́ède SamọOrílẹ́ède yemeniOrílẹ́ède May" + - "oteOrílẹ́ède Ariwa AfirikaOrílẹ́ède ṣamibiaOrílẹ́ède ṣimibabe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x001a, 0x0042, 0x0063, 0x0091, 0x00ae, 0x00cd, - 0x00e5, 0x00ff, 0x00ff, 0x0118, 0x0141, 0x015c, 0x0177, 0x018e, - 0x018e, 0x01ad, 0x01e2, 0x01fd, 0x021c, 0x0239, 0x0259, 0x0275, - 0x028d, 0x02a8, 0x02c3, 0x02c3, 0x02db, 0x02f9, 0x0317, 0x0317, - 0x0332, 0x034d, 0x0365, 0x0365, 0x0386, 0x03a1, 0x03bc, 0x03d4, - 0x03d4, 0x03e9, 0x0411, 0x0427, 0x0444, 0x0461, 0x0481, 0x0498, - 0x04b3, 0x04cc, 0x04e8, 0x04e8, 0x0505, 0x051a, 0x0540, 0x0540, - 0x0540, 0x0558, 0x0577, 0x058c, 0x058c, 0x05a9, 0x05c4, 0x05df, - // Entry 40 - 7F - 0x05fc, 0x061b, 0x061b, 0x0632, 0x0649, 0x0663, 0x0663, 0x0679, - 0x068e, 0x06a3, 0x06a3, 0x06a3, 0x06b9, 0x06cc, 0x06eb, 0x0705, - 0x0705, 0x071b, 0x072f, 0x0748, 0x075d, 0x0773, 0x0791, 0x0791, - 0x07a4, 0x07bd, 0x07d5, 0x07ea, 0x07fd, 0x0814, 0x0830, 0x0846, - 0x0846, 0x085e, 0x0872, 0x088b, 0x08a0, 0x08a0, 0x08a0, 0x08b8, - 0x08d4, 0x08e8, 0x08fe, 0x08fe, 0x0916, 0x092c, 0x0944, 0x0944, - 0x0958, 0x0990, 0x09a4, 0x09b8, 0x09d1, 0x09e7, 0x09e7, 0x09fd, - 0x0a14, 0x0a29, 0x0a3d, 0x0a5a, 0x0a77, 0x0a8e, 0x0aa9, 0x0ac7, - // Entry 80 - BF - 0x0ae3, 0x0aff, 0x0b14, 0x0b35, 0x0b52, 0x0b66, 0x0b7d, 0x0b93, - 0x0bb6, 0x0bcf, 0x0be5, 0x0bfa, 0x0c11, 0x0c28, 0x0c3e, 0x0c53, - 0x0c68, 0x0c7d, 0x0c93, 0x0c93, 0x0c93, 0x0caa, 0x0cc9, 0x0ce1, - 0x0cf4, 0x0d0b, 0x0d21, 0x0d21, 0x0d44, 0x0d5d, 0x0d75, 0x0d8d, - 0x0da2, 0x0dba, 0x0dd1, 0x0de6, 0x0dfb, 0x0e11, 0x0e2c, 0x0e42, - 0x0e60, 0x0e77, 0x0e9b, 0x0eb7, 0x0ecf, 0x0ee7, 0x0f00, 0x0f13, - 0x0f27, 0x0f3a, 0x0f58, 0x0f6f, 0x0f84, 0x0f97, 0x0fb9, 0x0fd6, - 0x0fed, 0x1005, 0x101b, 0x1040, 0x1057, 0x1071, 0x109f, 0x10b6, - // Entry C0 - FF - 0x10ca, 0x10e1, 0x10f4, 0x10f4, 0x110b, 0x1122, 0x1122, 0x113a, - 0x1150, 0x116b, 0x1189, 0x11a6, 0x11bb, 0x11d1, 0x11e7, 0x11fe, - 0x1216, 0x1216, 0x122e, 0x1248, 0x1262, 0x127b, 0x1291, 0x12a8, - 0x12a8, 0x12cf, 0x12ed, 0x12ed, 0x1301, 0x131a, 0x131a, 0x1346, - 0x135f, 0x135f, 0x1372, 0x1389, 0x13a2, 0x13b8, 0x13dd, 0x13fd, - 0x1415, 0x1429, 0x1441, 0x1463, 0x1478, 0x148e, 0x14a7, 0x14bd, - 0x14d2, 0x14d2, 0x14d2, 0x14f3, 0x150a, 0x152a, 0x1541, 0x1567, - 0x1587, 0x15bd, 0x15e6, 0x15ff, 0x1615, 0x1633, 0x1648, 0x1648, - // Entry 100 - 13F - 0x165d, 0x1672, 0x168e, 0x16a6, 0x16bf, - }, - }, - { // yo-BJ - "Orílɛ́ède ÀàndóràOrílɛ́ède Ɛmirate ti Awɔn ArabuOrílɛ́ède ÀfùgànístánìOr" + - "ílɛ́ède Ààntígúà àti BáríbúdàOrílɛ́ède ÀàngúlílàOrílɛ́ède Àlùbàníán" + - "ìOrílɛ́ède AméníàOrílɛ́ède ÀàngólàOrílɛ́ède AgentínàSámóánì ti Oríl" + - "ɛ́ède ÀméríkàOrílɛ́ède AsítíríàOrílɛ́ède ÁstràlìáOrílɛ́ède ÁrúbàOrí" + - "lɛ́ède Asɛ́bájánìOrílɛ́ède Bɔ̀síníà àti ƐtisɛgófínàOrílɛ́ède Bábádós" + - "ìOrílɛ́ède BángáládésìOrílɛ́ède Bégíɔ́mùOrílɛ́ède Bùùkíná FasòOrílɛ" + - "́ède BùùgáríàOrílɛ́ède BáránìOrílɛ́ède BùùrúndìOrílɛ́ède Bɛ̀nɛ̀Oríl" + - "ɛ́ède BémúdàOrílɛ́ède Búrúnɛ́lìOrílɛ́ède Bɔ̀lífíyàOrílɛ́ède Bàràsíl" + - "ìOrílɛ́ède BàhámásìOrílɛ́ède BútánìOrílɛ́ède Bɔ̀tìsúwánàOrílɛ́ède B" + - "élárúsìOrílɛ́ède Bèlísɛ̀Orílɛ́ède KánádàOrilɛ́ède KóngòOrílɛ́ède Àr" + - "in gùngun ÁfíríkàOrílɛ́ède KóngòOrílɛ́ède switishilandiOrílɛ́ède Kóú" + - "tè foràOrílɛ́ède Etíokun KùúkùOrílɛ́ède shílèOrílɛ́ède KamerúúnìOríl" + - "ɛ́ède sháínàOrílɛ́ède KòlómíbìaOrílɛ́ède Kuusita RíkàOrílɛ́ède Kúbà" + - "Orílɛ́ède Etíokun Kápé féndèOrílɛ́ède KúrúsìOrílɛ́ède shɛ́ɛ́kìOrílɛ́" + - "ède GemaniOrílɛ́ède Díbɔ́ótìOrílɛ́ède Dɛ́mákìOrílɛ́ède DòmíníkàOril" + - "ɛ́ède DòmíníkánìOrílɛ́ède ÀlùgèríánìOrílɛ́ède EkuádòOrílɛ́ède Esito" + - "niaOrílɛ́ède ÉgípítìOrílɛ́ède EritiraOrílɛ́ède SipaniOrílɛ́ède Etopi" + - "aOrílɛ́ède FilandiOrílɛ́ède FijiOrílɛ́ède Etikun FakalandiOrílɛ́ède " + - "MakoronesiaOrílɛ́ède FaranseOrílɛ́ède GabonOrílɛ́ède OmobabirinOrílɛ" + - "́ède GenadaOrílɛ́ède GɔgiaOrílɛ́ède Firenshi GuanaOrílɛ́ède GanaOrí" + - "lɛ́ède GibarataraOrílɛ́ède GerelandiOrílɛ́ède GambiaOrílɛ́ède GeneOr" + - "ílɛ́ède GadelopeOrílɛ́ède Ekutoria GiniOrílɛ́ède GeriisiOrílɛ́ède G" + - "uatemalaOrílɛ́ède GuamuOrílɛ́ède Gene-BusauOrílɛ́ède GuyanaOrílɛ́ède" + - " HondurasiOrílɛ́ède KòróátíàOrílɛ́ède HaatiOrílɛ́ède HungariOrílɛ́èd" + - "e IndonesiaOrílɛ́ède AilandiOrílɛ́ède IserɛliOrílɛ́ède IndiaOrílɛ́èd" + - "e Etíkun Índíánì ti Ìlú BírítísìOrílɛ́ède IrakiOrílɛ́ède IraniOrílɛ́" + - "ède AshilandiOrílɛ́ède ItaliyiOrílɛ́ède JamaikaOrílɛ́ède JɔdaniOríl" + - "ɛ́ède JapaniOrílɛ́ède KenyaOrílɛ́ède KurishisitaniOrílɛ́ède Kàmùbód" + - "íàOrílɛ́ède KiribatiOrílɛ́ède KòmòrósìOrílɛ́ède Kiiti ati NeefiOríl" + - "ɛ́ède Guusu KɔriaOrílɛ́ède Ariwa KɔriaOrílɛ́ède KuwetiOrílɛ́ède Etí" + - "okun KámánìOrílɛ́ède KashashataniOrílɛ́ède LaosiOrílɛ́ède LebanoniOr" + - "ílɛ́ède LushiaOrílɛ́ède LɛshitɛnisiteniOrílɛ́ède Siri LankaOrílɛ́èd" + - "e LaberiaOrílɛ́ède LesotoOrílɛ́ède LituaniaOrílɛ́ède LusemogiOrílɛ́è" + - "de LatifiaOrílɛ́ède LibiyaOrílɛ́ède MorokoOrílɛ́ède MonakoOrílɛ́ède " + - "ModofiaOrílɛ́ède MadasikaOrílɛ́ède Etikun MáshaliOrílɛ́ède Masidonia" + - "Orílɛ́ède MaliOrílɛ́ède ManamariOrílɛ́ède MogoliaOrílɛ́ède Etikun Gu" + - "usu MarianaOrílɛ́ède MatinikuwiOrílɛ́ède MaritaniaOrílɛ́ède Motserat" + - "iOrílɛ́ède MalataOrílɛ́ède MaritiusiOrílɛ́ède MaladifiOrílɛ́ède Mala" + - "wiOrílɛ́ède MesikoOrílɛ́ède MalasiaOrílɛ́ède MoshamibikuOrílɛ́ède Na" + - "mibiaOrílɛ́ède Kaledonia TitunOrílɛ́ède NàìjáOrílɛ́ède Etikun Nɔ́úfó" + - "kìOrílɛ́ède NàìjíríàOrílɛ́ède NIkaraguaOrílɛ́ède NedalandiOrílɛ́ède " + - "NɔɔwiiOrílɛ́ède NepaOrílɛ́ède NauruOrílɛ́ède NiueOrílɛ́ède shilandi " + - "TitunOrílɛ́ède ƆɔmaOrílɛ́ède PanamaOrílɛ́ède PeruOrílɛ́ède Firenshi " + - "PolinesiaOrílɛ́ède Paapu ti GiiniOrílɛ́ède filipiniOrílɛ́ède Pakisit" + - "anOrílɛ́ède PolandiOrílɛ́ède Pɛɛri ati mikuloniOrílɛ́ède PikariniOrí" + - "lɛ́ède Pɔto RikoOrílɛ́ède Iwɔorun Pakisitian ati GashaOrílɛ́ède Pɔtu" + - "giOrílɛ́ède PaaluOrílɛ́ède ParaguyeOrílɛ́ède KotaOrílɛ́ède RiuniyanO" + - "rílɛ́ède RomaniyaOrílɛ́ède RɔshiaOrílɛ́ède RuwandaOrílɛ́ède Saudi Ar" + - "abiaOrílɛ́ède Etikun SolomoniOrílɛ́ède seshɛlɛsiOrílɛ́ède SudaniOríl" + - "ɛ́ède SwidiniOrílɛ́ède SingapoOrílɛ́ède HɛlenaOrílɛ́ède SilofaniaOr" + - "ílɛ́ède SilofakiaOrílɛ́ède Siria looniOrílɛ́ède Sani MarinoOrílɛ́èd" + - "e SɛnɛgaOrílɛ́ède SomaliaOrílɛ́ède SurinamiOrílɛ́ède Sao tomi ati pi" + - "riishipiOrílɛ́ède ƐɛsáfádòOrílɛ́ède SiriaOrílɛ́ède SashilandOrílɛ́èd" + - "e Tɔɔki ati Etikun KakɔsiOrílɛ́ède shààdìOrílɛ́ède TogoOrílɛ́ède Tai" + - "landiOrílɛ́ède TakisitaniOrílɛ́ède TokelauOrílɛ́ède ÌlàOòrùn Tímɔ̀Or" + - "ílɛ́ède TɔɔkimenisitaOrílɛ́ède TunishiaOrílɛ́ède TongaOrílɛ́ède Tɔɔ" + - "kiOrílɛ́ède Tirinida ati TobagaOrílɛ́ède TufaluOrílɛ́ède TaiwaniOríl" + - "ɛ́ède TanshaniaOrílɛ́ède UkariniOrílɛ́ède UgandaOrílɛ́ède Orilɛede " + - "AmerikaOrílɛ́ède NruguayiOrílɛ́ède NshibɛkisitaniOrílɛ́ède FatikaniO" + - "rílɛ́ède Fisɛnnti ati GenadinaOrílɛ́ède FɛnɛshuɛlaOrílɛ́ède Etíkun F" + - "ágínì ti ìlú BírítísìOrílɛ́ède Etikun Fagini ti AmɛrikaOrílɛ́ède Fɛ" + - "tinamiOrílɛ́ède FaniatuOrílɛ́ède Wali ati futunaOrílɛ́ède SamɔOrílɛ́" + - "ède yemeniOrílɛ́ède MayoteOrílɛ́ède Ariwa AfirikaOrílɛ́ède shamibia" + - "Orílɛ́ède shimibabe", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0019, 0x003e, 0x005e, 0x008b, 0x00a7, 0x00c5, - 0x00dc, 0x00f5, 0x00f5, 0x010d, 0x0135, 0x014f, 0x0169, 0x017f, - 0x017f, 0x019c, 0x01cd, 0x01e7, 0x0205, 0x0220, 0x023f, 0x025a, - 0x0271, 0x028b, 0x02a3, 0x02a3, 0x02ba, 0x02d6, 0x02f2, 0x02f2, - 0x030c, 0x0326, 0x033d, 0x033d, 0x035c, 0x0376, 0x038f, 0x03a6, - 0x03a6, 0x03ba, 0x03e1, 0x03f6, 0x0411, 0x042d, 0x044c, 0x0461, - 0x047b, 0x0492, 0x04ad, 0x04ad, 0x04c9, 0x04dd, 0x0502, 0x0502, - 0x0502, 0x0519, 0x0534, 0x0548, 0x0548, 0x0563, 0x057c, 0x0596, - // Entry 40 - 7F - 0x05b2, 0x05d0, 0x05d0, 0x05e6, 0x05fc, 0x0615, 0x0615, 0x062a, - 0x063e, 0x0652, 0x0652, 0x0652, 0x0667, 0x0679, 0x0697, 0x06b0, - 0x06b0, 0x06c5, 0x06d8, 0x06f0, 0x0704, 0x0718, 0x0734, 0x0734, - 0x0746, 0x075e, 0x0775, 0x0789, 0x079b, 0x07b1, 0x07cc, 0x07e1, - 0x07e1, 0x07f8, 0x080b, 0x0823, 0x0837, 0x0837, 0x0837, 0x084e, - 0x0869, 0x087c, 0x0891, 0x0891, 0x08a8, 0x08bd, 0x08d3, 0x08d3, - 0x08e6, 0x091d, 0x0930, 0x0943, 0x095a, 0x096f, 0x096f, 0x0984, - 0x0999, 0x09ad, 0x09c0, 0x09db, 0x09f7, 0x0a0d, 0x0a27, 0x0a44, - // Entry 80 - BF - 0x0a5e, 0x0a78, 0x0a8c, 0x0aac, 0x0ac6, 0x0ad9, 0x0aef, 0x0b03, - 0x0b22, 0x0b3a, 0x0b4f, 0x0b63, 0x0b79, 0x0b8f, 0x0ba4, 0x0bb8, - 0x0bcc, 0x0be0, 0x0bf5, 0x0bf5, 0x0bf5, 0x0c0b, 0x0c28, 0x0c3f, - 0x0c51, 0x0c67, 0x0c7c, 0x0c7c, 0x0c9e, 0x0cb6, 0x0ccd, 0x0ce4, - 0x0cf8, 0x0d0f, 0x0d25, 0x0d39, 0x0d4d, 0x0d62, 0x0d7b, 0x0d90, - 0x0dad, 0x0dc3, 0x0de5, 0x0e00, 0x0e17, 0x0e2e, 0x0e44, 0x0e56, - 0x0e69, 0x0e7b, 0x0e97, 0x0eab, 0x0ebf, 0x0ed1, 0x0ef1, 0x0f0d, - 0x0f23, 0x0f3a, 0x0f4f, 0x0f71, 0x0f87, 0x0f9f, 0x0fca, 0x0fdf, - // Entry C0 - FF - 0x0ff2, 0x1008, 0x101a, 0x101a, 0x1030, 0x1046, 0x1046, 0x105b, - 0x1070, 0x108a, 0x10a7, 0x10c0, 0x10d4, 0x10e9, 0x10fe, 0x1113, - 0x112a, 0x112a, 0x1141, 0x115a, 0x1173, 0x1189, 0x119e, 0x11b4, - 0x11b4, 0x11d9, 0x11f4, 0x11f4, 0x1207, 0x121e, 0x121e, 0x1246, - 0x125d, 0x125d, 0x126f, 0x1285, 0x129d, 0x12b2, 0x12d5, 0x12f2, - 0x1308, 0x131b, 0x1330, 0x1351, 0x1365, 0x137a, 0x1391, 0x13a6, - 0x13ba, 0x13ba, 0x13ba, 0x13d9, 0x13ef, 0x140c, 0x1422, 0x1446, - 0x1461, 0x1496, 0x14bd, 0x14d4, 0x14e9, 0x1506, 0x1519, 0x1519, - // Entry 100 - 13F - 0x152d, 0x1541, 0x155c, 0x1572, 0x1589, - }, - }, - { // yue - "阿森松島安道爾阿拉伯聯合大公國阿富汗安提瓜同巴布達安圭拉阿爾巴尼亞亞美尼亞安哥拉南極洲阿根廷美屬薩摩亞奧地利澳洲荷屬阿魯巴奧蘭群島亞塞拜然波斯尼" + - "亞同黑塞哥維那巴貝多孟加拉比利時布吉納法索保加利亞巴林蒲隆地貝南聖巴瑟米百慕達汶萊玻利維亞荷蘭加勒比區巴西巴哈馬不丹布威島波札那白俄" + - "羅斯貝里斯加拿大科科斯(基林)群島剛果(金夏沙)中非共和國剛果(布拉薩)瑞士象牙海岸庫克群島智利喀麥隆中華人民共和國哥倫比亞克里派頓" + - "島哥斯大黎加古巴維德角庫拉索聖誕島賽普勒斯捷克德國迪亞哥加西亞島吉布地丹麥多米尼克多明尼加共和國阿爾及利亞休達與梅利利亞厄瓜多愛沙尼" + - "亞埃及西撒哈拉厄利垂亞西班牙衣索比亞歐盟芬蘭斐濟福克蘭群島密克羅尼西亞群島法羅群島法國加彭英國格瑞那達喬治亞共和國法屬圭亞那根西島迦" + - "納直布羅陀格陵蘭甘比亞幾內亞瓜地洛普赤道幾內亞希臘南佐治亞島同南桑威奇群島瓜地馬拉關島幾內亞比索蓋亞那中華人民共和國香港特別行政區赫" + - "德島同麥克唐納群島宏都拉斯克羅埃西亞海地匈牙利加那利群島印尼愛爾蘭以色列曼島印度英屬印度洋領地伊拉克伊朗冰島義大利澤西島牙買加約旦日" + - "本肯亞吉爾吉斯柬埔寨吉里巴斯葛摩聖基茨同尼維斯北韓南韓科威特開曼群島哈薩克寮國黎巴嫩聖露西亞列支敦斯登斯里蘭卡賴比瑞亞賴索托立陶宛盧" + - "森堡拉脫維亞利比亞摩洛哥摩納哥摩爾多瓦蒙特內哥羅法屬聖馬丁馬達加斯加馬紹爾群島馬其頓馬利緬甸蒙古中華人民共和國澳門特別行政區北馬里亞" + - "納群島馬丁尼克島茅利塔尼亞蒙哲臘馬爾他模里西斯馬爾地夫馬拉威墨西哥馬來西亞莫三比克納米比亞新喀里多尼亞尼日諾福克島奈及利亞尼加拉瓜荷" + - "蘭挪威尼泊爾諾魯紐埃島紐西蘭阿曼王國巴拿馬秘魯法屬玻里尼西亞巴布亞紐幾內亞菲律賓巴基斯坦波蘭聖皮埃爾同密克隆群島皮特肯群島波多黎各巴" + - "勒斯坦自治區葡萄牙帛琉巴拉圭卡達大洋洲邊疆群島留尼旺羅馬尼亞塞爾維亞俄羅斯盧安達沙烏地阿拉伯索羅門群島塞席爾蘇丹瑞典新加坡聖赫勒拿島" + - "斯洛維尼亞斯瓦爾巴特群島同揚馬延島斯洛伐克獅子山聖馬利諾塞內加爾索馬利亞蘇利南南蘇丹聖多美同普林西比薩爾瓦多荷屬聖馬丁敘利亞史瓦濟蘭" + - "特里斯坦達庫尼亞群島土克斯及開科斯群島查德法屬南方屬地多哥泰國塔吉克托克勞群島東帝汶土庫曼突尼西亞東加土耳其千里達同多巴哥吐瓦魯台灣" + - "坦尚尼亞烏克蘭烏干達美國本土外小島嶼美國烏拉圭烏茲別克梵蒂岡聖文森特同格林納丁斯委內瑞拉英屬維京群島美屬維京群島越南萬那杜瓦利斯同富" + - "圖納群島薩摩亞科索沃葉門馬約特南非尚比亞辛巴威未知區域世界非洲北美洲南美洲大洋洲西非中美東非北非中非非洲南部美洲北美加勒比海東亞南亞" + - "東南亞南歐澳洲同紐西蘭美拉尼西亞密克羅尼西亞玻里尼西亞亞洲中亞西亞歐洲東歐北歐西歐拉丁美洲", - []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x0015, 0x002d, 0x0036, 0x004b, 0x0054, 0x0063, - 0x006f, 0x0078, 0x0081, 0x008a, 0x0099, 0x00a2, 0x00a8, 0x00b7, - 0x00c3, 0x00cf, 0x00ed, 0x00f6, 0x00ff, 0x0108, 0x0117, 0x0123, - 0x0129, 0x0132, 0x0138, 0x0144, 0x014d, 0x0153, 0x015f, 0x0171, - 0x0177, 0x0180, 0x0186, 0x018f, 0x0198, 0x01a4, 0x01ad, 0x01b6, - 0x01d1, 0x01e6, 0x01f5, 0x020a, 0x0210, 0x021c, 0x0228, 0x022e, - 0x0237, 0x024c, 0x0258, 0x0267, 0x0276, 0x027c, 0x0285, 0x028e, - 0x0297, 0x02a3, 0x02a9, 0x02af, 0x02c4, 0x02cd, 0x02d3, 0x02df, - // Entry 40 - 7F - 0x02f4, 0x0303, 0x0318, 0x0321, 0x032d, 0x0333, 0x033f, 0x034b, - 0x0354, 0x0360, 0x0366, 0x0366, 0x036c, 0x0372, 0x0381, 0x0399, - 0x03a5, 0x03ab, 0x03b1, 0x03b7, 0x03c3, 0x03d5, 0x03e4, 0x03ed, - 0x03f3, 0x03ff, 0x0408, 0x0411, 0x041a, 0x0426, 0x0435, 0x043b, - 0x045f, 0x046b, 0x0471, 0x0480, 0x0489, 0x04b3, 0x04d1, 0x04dd, - 0x04ec, 0x04f2, 0x04fb, 0x050a, 0x0510, 0x0519, 0x0522, 0x0528, - 0x052e, 0x0543, 0x054c, 0x0552, 0x0558, 0x0561, 0x056a, 0x0573, - 0x0579, 0x057f, 0x0585, 0x0591, 0x059a, 0x05a6, 0x05ac, 0x05c1, - // Entry 80 - BF - 0x05c7, 0x05cd, 0x05d6, 0x05e2, 0x05eb, 0x05f1, 0x05fa, 0x0606, - 0x0615, 0x0621, 0x062d, 0x0636, 0x063f, 0x0648, 0x0654, 0x065d, - 0x0666, 0x066f, 0x067b, 0x068a, 0x0699, 0x06a8, 0x06b7, 0x06c0, - 0x06c6, 0x06cc, 0x06d2, 0x06fc, 0x0711, 0x0720, 0x072f, 0x0738, - 0x0741, 0x074d, 0x0759, 0x0762, 0x076b, 0x0777, 0x0783, 0x078f, - 0x07a1, 0x07a7, 0x07b3, 0x07bf, 0x07cb, 0x07d1, 0x07d7, 0x07e0, - 0x07e6, 0x07ef, 0x07f8, 0x0804, 0x080d, 0x0813, 0x0828, 0x083d, - 0x0846, 0x0852, 0x0858, 0x0876, 0x0885, 0x0891, 0x08a6, 0x08af, - // Entry C0 - FF - 0x08b5, 0x08be, 0x08c4, 0x08d9, 0x08e2, 0x08ee, 0x08fa, 0x0903, - 0x090c, 0x091e, 0x092d, 0x0936, 0x093c, 0x0942, 0x094b, 0x095a, - 0x0969, 0x098d, 0x0999, 0x09a2, 0x09ae, 0x09ba, 0x09c6, 0x09cf, - 0x09d8, 0x09f0, 0x09fc, 0x0a0b, 0x0a14, 0x0a20, 0x0a3e, 0x0a59, - 0x0a5f, 0x0a71, 0x0a77, 0x0a7d, 0x0a86, 0x0a95, 0x0a9e, 0x0aa7, - 0x0ab3, 0x0ab9, 0x0ac2, 0x0ad7, 0x0ae0, 0x0ae6, 0x0af2, 0x0afb, - 0x0b04, 0x0b1c, 0x0b1c, 0x0b22, 0x0b2b, 0x0b37, 0x0b40, 0x0b5e, - 0x0b6a, 0x0b7c, 0x0b8e, 0x0b94, 0x0b9d, 0x0bb8, 0x0bc1, 0x0bca, - // Entry 100 - 13F - 0x0bd0, 0x0bd9, 0x0bdf, 0x0be8, 0x0bf1, 0x0bfd, 0x0c03, 0x0c09, - 0x0c12, 0x0c1b, 0x0c24, 0x0c2a, 0x0c30, 0x0c36, 0x0c3c, 0x0c42, - 0x0c4e, 0x0c54, 0x0c5a, 0x0c66, 0x0c6c, 0x0c72, 0x0c7b, 0x0c81, - 0x0c93, 0x0ca2, 0x0cb4, 0x0cc3, 0x0cc9, 0x0ccf, 0x0cd5, 0x0cdb, - 0x0ce1, 0x0ce7, 0x0ced, 0x0cf9, - }, - }, - { // zgh - "ⴰⵏⴷⵓⵔⴰⵍⵉⵎⴰⵔⴰⵜⴰⴼⵖⴰⵏⵉⵙⵜⴰⵏⴰⵏⵜⵉⴳⴰ ⴷ ⴱⵔⴱⵓⴷⴰⴰⵏⴳⵉⵍⴰⴰⵍⴱⴰⵏⵢⴰⴰⵔⵎⵉⵏⵢⴰⴰⵏⴳⵓⵍⴰⴰⵔⵊⴰⵏⵜⵉⵏ" + - "ⵙⴰⵎⵡⴰ ⵜⴰⵎⵉⵔⵉⴽⴰⵏⵉⵜⵏⵏⵎⵙⴰⵓⵙⵜⵔⴰⵍⵢⴰⴰⵔⵓⴱⴰⴰⴷⵔⴰⴱⵉⵊⴰⵏⴱⵓⵙⵏⴰ ⴷ ⵀⵉⵔⵙⵉⴽⴱⴰⵔⴱⴰⴷⴱⴰ" + - "ⵏⴳⵍⴰⴷⵉⵛⴱⵍⵊⵉⴽⴰⴱⵓⵔⴽⵉⵏⴰ ⴼⴰⵙⵓⴱⵍⵖⴰⵔⵢⴰⴱⵃⵔⴰⵢⵏⴱⵓⵔⵓⵏⴷⵉⴱⵉⵏⵉⵏⴱⵔⵎⵓⴷⴰⴱⵔⵓⵏⵉⴱⵓⵍⵉⴱ" + - "ⵢⴰⴱⵔⴰⵣⵉⵍⴱⴰⵀⴰⵎⴰⵙⴱⵀⵓⵜⴰⵏⴱⵓⵜⵙⵡⴰⵏⴰⴱⵉⵍⴰⵔⵓⵙⵢⴰⴱⵉⵍⵉⵣⴽⴰⵏⴰⴷⴰⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⴷⵉⵎⵓⵇ" + - "ⵔⴰⵜⵉⵜ ⵏ ⴽⵓⵏⴳⵓⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⵏⴰⵎⵎⴰⵙⵜ ⵏ ⵉⴼⵔⵉⵇⵢⴰⴽⵓⵏⴳⵓⵙⵡⵉⵙⵔⴰⴽⵓⵜ ⴷⵉⴼⵡⴰⵔⵜⵉⴳ" + - "ⵣⵉⵔⵉⵏ ⵏ ⴽⵓⴽⵛⵛⵉⵍⵉⴽⴰⵎⵉⵔⵓⵏⵛⵛⵉⵏⵡⴰⴽⵓⵍⵓⵎⴱⵢⴰⴽⵓⵙⵜⴰ ⵔⵉⴽⴰⴽⵓⴱⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⴽⴰⴱⴱ" + - "ⵉⵔⴷⵉⵇⵓⴱⵔⵓⵙⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⵜⵛⵉⴽⵉⵜⴰⵍⵎⴰⵏⵢⴰⴷⵊⵉⴱⵓⵜⵉⴷⴰⵏⵎⴰⵔⴽⴷⵓⵎⵉⵏⵉⴽⵜⴰⴳⴷⵓⴷⴰⵏⵜ " + - "ⵜⴰⴷⵓⵎⵉⵏⵉⴽⵜⴷⵣⴰⵢⵔⵉⴽⵡⴰⴷⵓⵔⵉⵙⵜⵓⵏⵢⴰⵎⵉⵚⵕⵉⵔⵉⵜⵉⵔⵢⴰⵙⴱⴰⵏⵢⴰⵉⵜⵢⵓⴱⵢⴰⴼⵉⵍⵍⴰⵏⴷⴰⴼⵉⴷⵊ" + - "ⵉⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵎⴰⵍⴰⵡⵉⵎⵉⴽⵔⵓⵏⵉⵣⵢⴰⴼⵔⴰⵏⵙⴰⴳⴰⴱⵓⵏⵜⴰⴳⵍⴷⵉⵜ ⵉⵎⵓⵏⵏⵖⵔⵏⴰⵟⴰⵊⵓⵔⵊⵢⴰⴳⵡ" + - "ⵉⵢⴰⵏ ⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜⵖⴰⵏⴰⴰⴷⵔⴰⵔ ⵏ ⵟⴰⵕⵉⵇⴳⵔⵉⵍⴰⵏⴷⴳⴰⵎⴱⵢⴰⵖⵉⵏⵢⴰⴳⵡⴰⴷⴰⵍⵓⴱⵖⵉⵏⵢⴰ ⵏ " + - "ⵉⴽⵡⴰⴷⵓⵔⵍⵢⵓⵏⴰⵏⴳⵡⴰⵜⵉⵎⴰⵍⴰⴳⵡⴰⵎⵖⵉⵏⵢⴰ ⴱⵉⵙⴰⵡⴳⵡⵉⵢⴰⵏⴰⵀⵓⵏⴷⵓⵔⴰⵙⴽⵔⵡⴰⵜⵢⴰⵀⴰⵢⵜⵉⵀⵏ" + - "ⵖⴰⵔⵢⴰⴰⵏⴷⵓⵏⵉⵙⵢⴰⵉⵔⵍⴰⵏⴷⴰⵉⵙⵔⴰⵢⵉⵍⵍⵀⵉⵏⴷⵜⴰⵎⵏⴰⴹⵜ ⵜⴰⵏⴳⵍⵉⵣⵉⵜ ⵏ ⵓⴳⴰⵔⵓ ⴰⵀⵉⵏⴷⵉⵍ" + - "ⵄⵉⵔⴰⵇⵉⵔⴰⵏⵉⵙⵍⴰⵏⴷⵉⵟⴰⵍⵢⴰⵊⴰⵎⴰⵢⴽⴰⵍⵓⵔⴷⵓⵏⵍⵢⴰⴱⴰⵏⴽⵉⵏⵢⴰⴽⵉⵔⵖⵉⵣⵉⵙⵜⴰⵏⴽⴰⵎⴱⵓⴷⵢⴰⴽⵉ" + - "ⵔⵉⴱⴰⵜⵉⵇⵓⵎⵓⵔⵙⴰⵏⴽⵔⵉⵙ ⴷ ⵏⵉⴼⵉⵙⴽⵓⵔⵢⴰ ⵏ ⵉⵥⵥⵍⵎⴹⴽⵓⵔⵢⴰ ⵏ ⵉⴼⴼⵓⵙⵍⴽⵡⵉⵜⵜⵉⴳⵣⵉⵔⵉⵏ" + - " ⵏ ⴽⴰⵢⵎⴰⵏⴽⴰⵣⴰⵅⵙⵜⴰⵏⵍⴰⵡⵙⵍⵓⴱⵏⴰⵏⵙⴰⵏⵜⵍⵓⵙⵉⵍⵉⴽⵉⵏⵛⵜⴰⵢⵏⵙⵔⵉⵍⴰⵏⴽⴰⵍⵉⴱⵉⵔⵢⴰⵍⵉⵚⵓⵟⵓⵍ" + - "ⵉⵜⵡⴰⵏⵢⴰⵍⵓⴽⵙⴰⵏⴱⵓⵔⴳⵍⴰⵜⴼⵢⴰⵍⵉⴱⵢⴰⵍⵎⵖⵔⵉⴱⵎⵓⵏⴰⴽⵓⵎⵓⵍⴷⵓⴼⵢⴰⵎⵓⵏⵜⵉⵏⵉⴳⵔⵓⵎⴰⴷⴰⵖⴰⵛⵇ" + - "ⴰⵔⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵎⴰⵔⵛⴰⵍⵎⴰⵙⵉⴷⵓⵏⵢⴰⵎⴰⵍⵉⵎⵢⴰⵏⵎⴰⵔⵎⵏⵖⵓⵍⵢⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵎⴰⵔⵢⴰⵏ ⵏ " + - "ⵉⵥⵥⵍⵎⴹⵎⴰⵔⵜⵉⵏⵉⴽⵎⵓⵕⵉⵟⴰⵏⵢⴰⵎⵓⵏⵙⵉⵔⴰⵜⵎⴰⵍⵟⴰⵎⵓⵔⵉⵙⵎⴰⵍⴷⵉⴼⵎⴰⵍⴰⵡⵉⵎⵉⴽⵙⵉⴽⵎⴰⵍⵉⵣⵢⴰ" + - "ⵎⵓⵣⵏⴱⵉⵇⵏⴰⵎⵉⴱⵢⴰⴽⴰⵍⵉⴷⵓⵏⵢⴰ ⵜⴰⵎⴰⵢⵏⵓⵜⵏⵏⵉⵊⵉⵔⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵏⵓⵔⴼⵓⵍⴽⵏⵉⵊⵉⵔⵢⴰⵏⵉⴽ" + - "ⴰⵔⴰⴳⵡⴰⵀⵓⵍⴰⵏⴷⴰⵏⵏⵔⵡⵉⵊⵏⵉⴱⴰⵍⵏⴰⵡⵔⵓⵏⵉⵡⵉⵏⵢⵓⵣⵉⵍⴰⵏⴷⴰⵄⵓⵎⴰⵏⴱⴰⵏⴰⵎⴰⴱⵉⵔⵓⴱⵓⵍⵉⵏⵉⵣⵢ" + - "ⴰ ⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜⴱⴰⴱⵡⴰ ⵖⵉⵏⵢⴰ ⵜⴰⵎⴰⵢⵏⵓⵜⴼⵉⵍⵉⴱⴱⵉⵏⴱⴰⴽⵉⵙⵜⴰⵏⴱⵓⵍⵓⵏⵢⴰⵙⴰⵏⴱⵢⵉⵔ ⴷ ⵎ" + - "ⵉⴽⵍⵓⵏⴱⵉⵜⴽⴰⵢⵔⵏⴱⵓⵔⵜⵓ ⵔⵉⴽⵓⴰⴳⵎⵎⴰⴹ ⵏ ⵜⴰⴳⵓⵜ ⴷ ⵖⵣⵣⴰⴱⵕⵟⵇⵉⵣⴱⴰⵍⴰⵡⴱⴰⵔⴰⴳⵡⴰⵢⵇⴰⵜ" + - "ⴰⵔⵔⵉⵢⵓⵏⵢⵓⵏⵔⵓⵎⴰⵏⵢⴰⵙⵉⵔⴱⵢⴰⵔⵓⵙⵢⴰⵔⵡⴰⵏⴷⴰⵙⵙⴰⵄⵓⴷⵉⵢⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵙⴰⵍⵓⵎⴰⵏⵙⵙⵉⵛⵉ" + - "ⵍⵙⵙⵓⴷⴰⵏⵙⵙⵡⵉⴷⵙⵏⵖⴰⴼⵓⵔⴰⵙⴰⵏⵜⵉⵍⵉⵏⵙⵍⵓⴼⵉⵏⵢⴰⵙⵍⵓⴼⴰⴽⵢⴰⵙⵙⵉⵔⴰⵍⵢⵓⵏⵙⴰⵏⵎⴰⵔⵉⵏⵓⵙⵙⵉⵏ" + - "ⵉⴳⴰⵍⵚⵚⵓⵎⴰⵍⵙⵓⵔⵉⵏⴰⵎⵙⵙⵓⴷⴰⵏ ⵏ ⵉⴼⴼⵓⵙⵙⴰⵡⵟⵓⵎⵉ ⴷ ⴱⵔⴰⵏⵙⵉⴱⵙⴰⵍⴼⴰⴷⵓⵔⵙⵓⵔⵢⴰⵙⵡⴰⵣⵉ" + - "ⵍⴰⵏⴷⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵜⵓⵔⴽⵢⴰ ⴷ ⴽⴰⵢⴽⵜⵛⴰⴷⵟⵓⴳⵓⵟⴰⵢⵍⴰⵏⴷⵜⴰⴷⵊⴰⴽⵉⵙⵜⴰⵏⵟⵓⴽⵍⴰⵡⵜⵉⵎⵓⵔ" + - " ⵏ ⵍⵇⴱⵍⵜⵜⵓⵔⴽⵎⴰⵏⵙⵜⴰⵏⵜⵓⵏⵙⵟⵓⵏⴳⴰⵜⵓⵔⴽⵢⴰⵜⵔⵉⵏⵉⴷⴰⴷ ⴷ ⵟⵓⴱⴰⴳⵓⵜⵓⴼⴰⵍⵓⵟⴰⵢⵡⴰⵏⵟⴰⵏⵥⴰ" + - "ⵏⵢⴰⵓⴽⵔⴰⵏⵢⴰⵓⵖⴰⵏⴷⴰⵉⵡⵓⵏⴰⴽ ⵎⵓⵏⵏⵉⵏ ⵏ ⵎⵉⵔⵉⴽⴰⵏⵓⵔⵓⴳⵡⴰⵢⵓⵣⴱⴰⴽⵉⵙⵜⴰⵏⴰⵡⴰⵏⴽ ⵏ ⴼⴰ" + - "ⵜⵉⴽⴰⵏⵙⴰⵏⴼⴰⵏⵙⴰⵏ ⴷ ⴳⵔⵉⵏⴰⴷⵉⵏⴼⵉⵏⵣⵡⵉⵍⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵜⵉⵎⴳⴰⴷ ⵏ ⵏⵏⴳⵍⵉⵣⵜⵉⴳⵣⵉⵔⵉⵏ " + - "ⵜⵉⵎⴳⴰⴷ ⵏ ⵉⵡⵓⵏⴰⴽ ⵎⵓⵏⵏⵉⵏⴼⵉⵜⵏⴰⵎⴼⴰⵏⵡⴰⵟⵓⵡⴰⵍⵉⵙ ⴷ ⴼⵓⵜⵓⵏⴰⵙⴰⵎⵡⴰⵢⴰⵎⴰⵏⵎⴰⵢⵓⵟⴰⴼ" + - "ⵔⵉⵇⵢⴰ ⵏ ⵉⴼⴼⵓⵙⵣⴰⵎⴱⵢⴰⵣⵉⵎⴱⴰⴱⵡⵉ", - []uint16{ // 261 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0012, 0x0027, 0x0045, 0x006e, 0x0080, 0x0095, - 0x00aa, 0x00bc, 0x00bc, 0x00d4, 0x0105, 0x0114, 0x012c, 0x013b, - 0x013b, 0x0156, 0x017c, 0x018e, 0x01a9, 0x01bb, 0x01dd, 0x01f2, - 0x0204, 0x0219, 0x0228, 0x0228, 0x023a, 0x0249, 0x025e, 0x025e, - 0x0270, 0x0285, 0x0297, 0x0297, 0x02af, 0x02ca, 0x02d9, 0x02eb, - 0x02eb, 0x033f, 0x0390, 0x039f, 0x03b1, 0x03cd, 0x03f3, 0x0402, - 0x0417, 0x0429, 0x0441, 0x0441, 0x045d, 0x0469, 0x049e, 0x049e, - 0x049e, 0x04b0, 0x04e4, 0x04f9, 0x04f9, 0x050e, 0x0523, 0x0538, - // Entry 40 - 7F - 0x0572, 0x0581, 0x0581, 0x0596, 0x05ab, 0x05b7, 0x05b7, 0x05cf, - 0x05e1, 0x05f6, 0x05f6, 0x05f6, 0x060e, 0x061d, 0x064c, 0x066a, - 0x066a, 0x067c, 0x068b, 0x06b0, 0x06c2, 0x06d4, 0x0705, 0x0705, - 0x0711, 0x0734, 0x0749, 0x075b, 0x076a, 0x0782, 0x07ab, 0x07bd, - 0x07bd, 0x07d8, 0x07e4, 0x0803, 0x0818, 0x0818, 0x0818, 0x0830, - 0x0845, 0x0854, 0x0869, 0x0869, 0x0884, 0x0899, 0x08ae, 0x08ae, - 0x08bd, 0x0915, 0x0927, 0x0933, 0x0945, 0x0957, 0x0957, 0x096c, - 0x097e, 0x0990, 0x099f, 0x09c0, 0x09d8, 0x09f0, 0x09ff, 0x0a28, - // Entry 80 - BF - 0x0a4e, 0x0a71, 0x0a80, 0x0aaf, 0x0aca, 0x0ad6, 0x0ae8, 0x0b00, - 0x0b1e, 0x0b36, 0x0b4b, 0x0b5d, 0x0b75, 0x0b93, 0x0ba5, 0x0bb4, - 0x0bc6, 0x0bd8, 0x0bf0, 0x0c0e, 0x0c0e, 0x0c2c, 0x0c5b, 0x0c76, - 0x0c82, 0x0c97, 0x0cac, 0x0cac, 0x0cf2, 0x0d0a, 0x0d25, 0x0d3d, - 0x0d4c, 0x0d5b, 0x0d6d, 0x0d7f, 0x0d91, 0x0da6, 0x0dbb, 0x0dd0, - 0x0e04, 0x0e16, 0x0e48, 0x0e5d, 0x0e78, 0x0e8d, 0x0e9f, 0x0eae, - 0x0ebd, 0x0ec9, 0x0ee7, 0x0ef6, 0x0f08, 0x0f14, 0x0f4e, 0x0f86, - 0x0f9e, 0x0fb6, 0x0fcb, 0x0ff7, 0x100f, 0x102b, 0x1062, 0x1074, - // Entry C0 - FF - 0x1083, 0x109b, 0x10aa, 0x10aa, 0x10c2, 0x10d7, 0x10e9, 0x10f8, - 0x110a, 0x1125, 0x1157, 0x1169, 0x117b, 0x118a, 0x11a2, 0x11ba, - 0x11d2, 0x11d2, 0x11ea, 0x1205, 0x1220, 0x1238, 0x124a, 0x125f, - 0x1285, 0x12b4, 0x12cc, 0x12cc, 0x12db, 0x12f9, 0x12f9, 0x1339, - 0x1345, 0x1345, 0x1351, 0x1366, 0x1387, 0x1399, 0x13bc, 0x13dd, - 0x13e9, 0x13f8, 0x140a, 0x1439, 0x144b, 0x145d, 0x1475, 0x148a, - 0x149c, 0x149c, 0x149c, 0x14db, 0x14f0, 0x150e, 0x1537, 0x156f, - 0x1587, 0x15c9, 0x161e, 0x1630, 0x1645, 0x166b, 0x167a, 0x167a, - // Entry 100 - 13F - 0x1689, 0x1698, 0x16c1, 0x16d3, 0x16eb, - }, - }, - { // zh - zhRegionStr, - zhRegionIdx, - }, - { // zh-Hant - zhHantRegionStr, - zhHantRegionIdx, - }, - { // zh-Hant-HK - "阿拉伯聯合酋長國安提瓜和巴布達阿魯巴阿塞拜疆波斯尼亞和黑塞哥維那巴巴多斯布基納法索布隆迪貝寧聖巴泰勒米鮑威特島博茨瓦納伯利茲可可斯群島科特迪瓦克" + - "里珀頓島哥斯達黎加佛得角塞浦路斯吉布提厄瓜多爾厄立特里亞埃塞俄比亞加蓬格林納達格魯吉亞加納岡比亞南佐治亞島與南桑威奇群島危地馬拉幾內" + - "亞比紹圭亞那洪都拉斯克羅地亞馬恩島意大利肯雅科摩羅聖基茨和尼維斯老撾聖盧西亞列支敦士登利比里亞萊索托黑山馬里毛里塔尼亞蒙特塞拉特馬耳" + - "他毛里裘斯馬爾代夫馬拉維莫桑比克尼日爾尼日利亞瑙魯阿曼法屬波利尼西亞巴布亞新幾內亞皮特凱恩島巴勒斯坦領土卡塔爾盧旺達沙地阿拉伯所羅門" + - "群島塞舌爾斯洛文尼亞斯瓦爾巴特群島及揚馬延島塞拉利昂索馬里蘇里南聖多美和普林西比敍利亞斯威士蘭特克斯和凱科斯群島乍得法屬南部領地多哥" + - "共和國湯加千里達和多巴哥圖瓦盧坦桑尼亞聖文森特和格林納丁斯英屬維爾京群島美屬維爾京群島瓦努阿圖也門贊比亞津巴布韋中美洲加勒比波利尼西" + - "亞", - []uint16{ // 284 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0018, 0x0018, 0x002d, 0x002d, 0x002d, - 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x0036, - 0x0036, 0x0042, 0x0060, 0x006c, 0x006c, 0x006c, 0x007b, 0x007b, - 0x007b, 0x0084, 0x008a, 0x0099, 0x0099, 0x0099, 0x0099, 0x0099, - 0x0099, 0x0099, 0x0099, 0x00a5, 0x00b1, 0x00b1, 0x00ba, 0x00ba, - 0x00c9, 0x00c9, 0x00c9, 0x00c9, 0x00c9, 0x00d5, 0x00d5, 0x00d5, - 0x00d5, 0x00d5, 0x00d5, 0x00e4, 0x00f3, 0x00f3, 0x00fc, 0x00fc, - 0x00fc, 0x0108, 0x0108, 0x0108, 0x0108, 0x0111, 0x0111, 0x0111, - // Entry 40 - 7F - 0x0111, 0x0111, 0x0111, 0x011d, 0x011d, 0x011d, 0x011d, 0x012c, - 0x012c, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, - 0x013b, 0x013b, 0x0141, 0x0141, 0x014d, 0x0159, 0x0159, 0x0159, - 0x015f, 0x015f, 0x015f, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, - 0x018c, 0x0198, 0x0198, 0x01a7, 0x01b0, 0x01b0, 0x01b0, 0x01bc, - 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01d1, - 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01da, 0x01da, 0x01da, - 0x01da, 0x01da, 0x01e0, 0x01e0, 0x01e0, 0x01e0, 0x01e9, 0x01fe, - // Entry 80 - BF - 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x0204, 0x0204, 0x0210, - 0x021f, 0x021f, 0x022b, 0x0234, 0x0234, 0x0234, 0x0234, 0x0234, - 0x0234, 0x0234, 0x0234, 0x023a, 0x023a, 0x023a, 0x023a, 0x023a, - 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x024f, 0x025e, - 0x0267, 0x0273, 0x027f, 0x0288, 0x0288, 0x0288, 0x0294, 0x0294, - 0x0294, 0x029d, 0x029d, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, - 0x02af, 0x02af, 0x02af, 0x02b5, 0x02b5, 0x02b5, 0x02ca, 0x02df, - 0x02df, 0x02df, 0x02df, 0x02df, 0x02ee, 0x02ee, 0x0300, 0x0300, - // Entry C0 - FF - 0x0300, 0x0300, 0x0309, 0x0309, 0x0309, 0x0309, 0x0309, 0x0309, - 0x0312, 0x0321, 0x0330, 0x0339, 0x0339, 0x0339, 0x0339, 0x0339, - 0x0348, 0x036c, 0x036c, 0x0378, 0x0378, 0x0378, 0x0381, 0x038a, - 0x038a, 0x03a2, 0x03a2, 0x03a2, 0x03ab, 0x03b7, 0x03b7, 0x03d2, - 0x03d8, 0x03ea, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, - 0x03f9, 0x03ff, 0x03ff, 0x0414, 0x041d, 0x041d, 0x0429, 0x0429, - 0x0429, 0x0429, 0x0429, 0x0429, 0x0429, 0x0429, 0x0429, 0x0447, - 0x0447, 0x045c, 0x0471, 0x0471, 0x047d, 0x047d, 0x047d, 0x047d, - // Entry 100 - 13F - 0x0483, 0x0483, 0x0483, 0x048c, 0x0498, 0x0498, 0x0498, 0x0498, - 0x0498, 0x0498, 0x0498, 0x0498, 0x04a1, 0x04a1, 0x04a1, 0x04a1, - 0x04a1, 0x04a1, 0x04a1, 0x04aa, 0x04aa, 0x04aa, 0x04aa, 0x04aa, - 0x04aa, 0x04aa, 0x04aa, 0x04b9, - }, - }, - { // zu - zuRegionStr, - zuRegionIdx, - }, -} - -const afRegionStr string = "" + // Size: 3008 bytes - "AscensioneilandAndorraVerenigde Arabiese EmirateAfganistanAntigua en Bar" + - "budaAnguillaAlbaniëArmeniëAngolaAntarktikaArgentiniëAmerikaans-SamoaOost" + - "enrykAustraliëArubaÅlandeilandeAzerbeidjanBosnië en HerzegowinaBarbadosB" + - "angladesjBelgiëBurkina FasoBulgaryeBahreinBurundiBeninSint BarthélemyBer" + - "mudaBroeneiBoliviëKaribiese NederlandBrasiliëBahamasBhoetanBouvet-eiland" + - "BotswanaBelarusBelizeKanadaKokos-eilandeDemokratiese Republiek van die K" + - "ongoSentraal-Afrikaanse RepubliekKongo - BrazzavilleSwitserlandIvoorkusC" + - "ookeilandeChiliKameroenSjinaColombiëClippertoneilandCosta RicaKubaKaap V" + - "erdeCuraçaoKerseilandSiprusTjeggiëDuitslandDiego GarciaDjiboetiDenemarke" + - "DominicaDominikaanse RepubliekAlgeriëCeuta en MelillaEcuadorEstlandEgipt" + - "eWes-SaharaEritreaSpanjeEthiopiëEuropese UnieFinlandFidjiFalklandeilande" + - "MikronesiëFaroëreilandeFrankrykGaboenVerenigde KoninkrykGrenadaGeorgiëFr" + - "ans-GuyanaGuernseyGhanaGibraltarGroenlandGambiëGuineeGuadeloupeEkwatoria" + - "al-GuineeGriekelandSuid-Georgië en die Suidelike SandwicheilandeGuatemal" + - "aGuamGuinee-BissauGuyanaHongkong SAS SjinaHeard- en McDonaldeilandeHondu" + - "rasKroasiëHaïtiHongaryeKanariese EilandeIndonesiëIerlandIsraelEiland Man" + - "IndiëBrits-Indiese OseaangebiedIrakIranYslandItaliëJerseyJamaikaJordanië" + - "JapanKeniaKirgisiëKambodjaKiribatiComoreSt. Kitts en NevisNoord-KoreaSui" + - "d-KoreaKoeweitKaaimanseilandeKazakstanLaosLibanonSt. LuciaLiechtensteinS" + - "ri LankaLiberiëLesothoLitaueLuxemburgLetlandLibiëMarokkoMonacoMoldowaMon" + - "tenegroSt. MartinMadagaskarMarshalleilandeMacedoniëMaliMianmar (Birma)Mo" + - "ngoliëMacau SAS SjinaNoord-Mariane-eilandeMartiniqueMauritaniëMontserrat" + - "MaltaMauritiusMalediveMalawiMeksikoMaleisiëMosambiekNamibiëNieu-Kaledoni" + - "ëNigerNorfolkeilandNigeriëNicaraguaNederlandNoorweëNepalNauruNiueNieu-S" + - "eelandOmanPanamaPeruFrans-PolinesiëPapoea-Nieu-GuineeFilippynePakistanPo" + - "leSt. Pierre en MiquelonPitcairneilandePuerto RicoPalestynse gebiedePort" + - "ugalPalauParaguayKatarOmliggende OseaniëRéunionRoemeniëSerwiëRuslandRwan" + - "daSaoedi-ArabiëSalomonseilandeSeychelleSoedanSwedeSingapoerSint HelenaSl" + - "oweniëSvalbard en Jan MayenSlowakyeSierra LeoneSan MarinoSenegalSomaliëS" + - "urinameSuid-SoedanSão Tomé en PríncipeEl SalvadorSint MaartenSiriëSwazil" + - "andTristan da CunhaTurks- en CaicoseilandeTsjadFranse Suidelike GebiedeT" + - "ogoThailandTadjikistanTokelauOos-TimorTurkmeniëTunisiëTongaTurkyeTrinida" + - "d en TobagoTuvaluTaiwanTanzaniëOekraïneUgandaVS klein omliggende eilande" + - "verenigde nasiesVerenigde State van AmerikaUruguayOesbekistanVatikaansta" + - "dSt. Vincent en die GrenadineVenezuelaBritse Maagde-eilandeAmerikaanse M" + - "aagde-eilandeViëtnamVanuatuWallis en FutunaSamoaKosovoJemenMayotteSuid-A" + - "frikaZambiëZimbabweOnbekende gebiedWêreldAfrikaNoord-AmerikaSuid-Amerika" + - "OseaniëWes-AfrikaSentraal-AmerikaOos-AfrikaNoord-AfrikaMidde-AfrikaSuide" + - "r-AfrikaAmerikasNoordelike AmerikaKaribiesOos-AsiëSuid-AsiëSuidoos-AsiëS" + - "uid-EuropaAustralasiëMelanesiëMikronesiese streekPolinesiëAsiëSentraal-A" + - "siëWes-AsiëEuropaOos-EuropaNoord-EuropaWes-EuropaLatyns-Amerika" - -var afRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x0016, 0x0030, 0x003a, 0x004c, 0x0054, 0x005c, - 0x0064, 0x006a, 0x0074, 0x007f, 0x008f, 0x0098, 0x00a2, 0x00a7, - 0x00b4, 0x00bf, 0x00d5, 0x00dd, 0x00e7, 0x00ee, 0x00fa, 0x0102, - 0x0109, 0x0110, 0x0115, 0x0125, 0x012c, 0x0133, 0x013b, 0x014e, - 0x0157, 0x015e, 0x0165, 0x0172, 0x017a, 0x0181, 0x0187, 0x018d, - 0x019a, 0x01be, 0x01db, 0x01ee, 0x01f9, 0x0201, 0x020c, 0x0211, - 0x0219, 0x021e, 0x0227, 0x0237, 0x0241, 0x0245, 0x024f, 0x0257, - 0x0261, 0x0267, 0x026f, 0x0278, 0x0284, 0x028c, 0x0295, 0x029d, - // Entry 40 - 7F - 0x02b3, 0x02bb, 0x02cb, 0x02d2, 0x02d9, 0x02df, 0x02e9, 0x02f0, - 0x02f6, 0x02ff, 0x030c, 0x030c, 0x0313, 0x0318, 0x0327, 0x0332, - 0x0340, 0x0348, 0x034e, 0x0361, 0x0368, 0x0370, 0x037c, 0x0384, - 0x0389, 0x0392, 0x039b, 0x03a2, 0x03a8, 0x03b2, 0x03c4, 0x03ce, - 0x03fc, 0x0405, 0x0409, 0x0416, 0x041c, 0x042e, 0x0447, 0x044f, - 0x0457, 0x045d, 0x0465, 0x0476, 0x0480, 0x0487, 0x048d, 0x0497, - 0x049d, 0x04b7, 0x04bb, 0x04bf, 0x04c5, 0x04cc, 0x04d2, 0x04d9, - 0x04e2, 0x04e7, 0x04ec, 0x04f5, 0x04fd, 0x0505, 0x050b, 0x051d, - // Entry 80 - BF - 0x0528, 0x0532, 0x0539, 0x0548, 0x0551, 0x0555, 0x055c, 0x0565, - 0x0572, 0x057b, 0x0583, 0x058a, 0x0590, 0x0599, 0x05a0, 0x05a6, - 0x05ad, 0x05b3, 0x05ba, 0x05c4, 0x05ce, 0x05d8, 0x05e7, 0x05f1, - 0x05f5, 0x0604, 0x060d, 0x061c, 0x0631, 0x063b, 0x0646, 0x0650, - 0x0655, 0x065e, 0x0666, 0x066c, 0x0673, 0x067c, 0x0685, 0x068d, - 0x069c, 0x06a1, 0x06ae, 0x06b6, 0x06bf, 0x06c8, 0x06d0, 0x06d5, - 0x06da, 0x06de, 0x06ea, 0x06ee, 0x06f4, 0x06f8, 0x0708, 0x071a, - 0x0723, 0x072b, 0x072f, 0x0745, 0x0754, 0x075f, 0x0771, 0x0779, - // Entry C0 - FF - 0x077e, 0x0786, 0x078b, 0x079e, 0x07a6, 0x07af, 0x07b6, 0x07bd, - 0x07c3, 0x07d1, 0x07e0, 0x07e9, 0x07ef, 0x07f4, 0x07fd, 0x0808, - 0x0811, 0x0826, 0x082e, 0x083a, 0x0844, 0x084b, 0x0853, 0x085b, - 0x0866, 0x087d, 0x0888, 0x0894, 0x089a, 0x08a3, 0x08b3, 0x08ca, - 0x08cf, 0x08e7, 0x08eb, 0x08f3, 0x08fe, 0x0905, 0x090e, 0x0918, - 0x0920, 0x0925, 0x092b, 0x093d, 0x0943, 0x0949, 0x0952, 0x095b, - 0x0961, 0x097c, 0x098c, 0x09a7, 0x09ae, 0x09b9, 0x09c5, 0x09e1, - 0x09ea, 0x09ff, 0x0a19, 0x0a21, 0x0a28, 0x0a38, 0x0a3d, 0x0a43, - // Entry 100 - 13F - 0x0a48, 0x0a4f, 0x0a5a, 0x0a61, 0x0a69, 0x0a79, 0x0a80, 0x0a86, - 0x0a93, 0x0a9f, 0x0aa7, 0x0ab1, 0x0ac1, 0x0acb, 0x0ad7, 0x0ae3, - 0x0af0, 0x0af8, 0x0b0a, 0x0b12, 0x0b1b, 0x0b25, 0x0b32, 0x0b3d, - 0x0b49, 0x0b53, 0x0b66, 0x0b70, 0x0b75, 0x0b83, 0x0b8c, 0x0b92, - 0x0b9c, 0x0ba8, 0x0bb2, 0x0bc0, -} // Size: 608 bytes - -const amRegionStr string = "" + // Size: 5358 bytes - "አሴንሽን ደሴትአንዶራየተባበሩት ዓረብ ኤምሬትስአፍጋኒስታንአንቲጓ እና ባሩዳአንጉኢላአልባኒያአርሜኒያአንጐላአንታርክቲ" + - "ካአርጀንቲናየአሜሪካ ሳሞአኦስትሪያአውስትራልያአሩባየአላንድ ደሴቶችአዘርባጃንቦስኒያ እና ሄርዞጎቪኒያባርቤዶስባንግ" + - "ላዲሽቤልጄምቡርኪና ፋሶቡልጌሪያባህሬንብሩንዲቤኒንቅዱስ በርቴሎሜቤርሙዳብሩኒቦሊቪያየካሪቢያን ኔዘርላንድስብራዚልባሃ" + - "ማስቡህታንቡቬት ደሴትቦትስዋናቤላሩስቤሊዘካናዳኮኮስ(ኬሊንግ) ደሴቶችኮንጎ-ኪንሻሳየመካከለኛው አፍሪካ ሪፐብሊክኮን" + - "ጎ ብራዛቪልስዊዘርላንድኮት ዲቯርኩክ ደሴቶችቺሊካሜሩንቻይናኮሎምቢያክሊፐርቶን ደሴትኮስታ ሪካኩባኬፕ ቬርዴኩራሳዎየ" + - "ገና ደሴትሳይፕረስቼቺያጀርመንዲዬጎ ጋርሺያጂቡቲዴንማርክዶሚኒካዶሚኒክ ሪፑብሊክአልጄሪያሴኡታና ሜሊላኢኳዶርኤስቶኒያ" + - "ግብጽምዕራባዊ ሳህራኤርትራስፔንኢትዮጵያየአውሮፓ ህብረትፊንላንድፊጂየፎክላንድ ደሴቶችሚክሮኔዢያየፋሮ ደሴቶችፈረንሳ" + - "ይጋቦንእንግሊዝግሬናዳጆርጂያየፈረንሳይ ጉዊአናጉርነሲጋናጂብራልተርግሪንላንድጋምቢያጊኒጉዋደሉፕኢኳቶሪያል ጊኒግሪክደ" + - "ቡብ ጆርጂያ እና የደቡብ ሳንድዊች ደሴቶችጉዋቲማላጉዋምጊኒ ቢሳኦጉያናሆንግ ኮንግ ልዩ የአስተዳደር ክልል ቻይናኽ" + - "ርድ ደሴቶችና ማክዶናልድ ደሴቶችሆንዱራስክሮኤሽያሀይቲሀንጋሪየካናሪ ደሴቶችኢንዶኔዢያአየርላንድእስራኤልአይል ኦፍ " + - "ማንህንድየብሪታኒያ ህንድ ውቂያኖስ ግዛትኢራቅኢራንአይስላንድጣሊያንጀርሲጃማይካጆርዳንጃፓንኬንያኪርጊስታንካምቦዲያኪ" + - "ሪባቲኮሞሮስቅዱስ ኪትስ እና ኔቪስሰሜን ኮሪያደቡብ ኮሪያክዌትካይማን ደሴቶችካዛኪስታንላኦስሊባኖስሴንት ሉቺያሊችተ" + - "ንስታይንሲሪላንካላይቤሪያሌሶቶሊቱዌኒያሉክሰምበርግላትቪያሊቢያሞሮኮሞናኮሞልዶቫሞንተኔግሮሴንት ማርቲንማዳጋስካርማርሻ" + - "ል አይላንድመቄዶንያማሊማይናማር(በርማ)ሞንጎሊያማካኡ ልዩ የአስተዳደር ክልል ቻይናየሰሜናዊ ማሪያና ደሴቶችማርቲኒ" + - "ክሞሪቴኒያሞንትሴራትማልታሞሪሸስማልዲቭስማላዊሜክሲኮማሌዢያሞዛምቢክናሚቢያኒው ካሌዶኒያኒጀርኖርፎልክ ደሴትናይጄሪያኒ" + - "ካራጓኔዘርላንድኖርዌይኔፓልናኡሩኒኡይኒው ዚላንድኦማንፓናማፔሩየፈረንሳይ ፖሊኔዢያፓፑዋ ኒው ጊኒፊሊፒንስፓኪስታንፖላ" + - "ንድቅዱስ ፒዬር እና ሚኩኤሎንፒትካኢርን አይስላንድፖርታ ሪኮየፍልስጤም ግዛትፖርቱጋልፓላውፓራጓይኳታርአውትላይንግ " + - "ኦሽንያሪዩኒየንሮሜኒያሰርብያራሽያሩዋንዳሳውድአረቢያሰሎሞን ደሴትሲሼልስሱዳንስዊድንሲንጋፖርሴንት ሄለናስሎቬኒያስቫል" + - "ባርድ እና ጃን ማየንስሎቫኪያሴራሊዮንሳን ማሪኖሴኔጋልሱማሌሱሪናምደቡብ ሱዳንሳኦ ቶሜ እና ፕሪንሲፔኤል ሳልቫዶርሲ" + - "ንት ማርተንሲሪያሱዋዚላንድትሪስታን ዲ ኩንሃየቱርኮችና የካኢኮስ ደሴቶችቻድየፈረንሳይ ደቡባዊ ግዛቶችቶጐታይላንድታ" + - "ጃኪስታንቶክላውምስራቅ ሌስትቱርክሜኒስታንቱኒዚያቶንጋቱርክትሪናዳድ እና ቶቤጎቱቫሉታይዋንታንዛኒያዩክሬንዩጋንዳየዩ " + - "ኤስ ጠረፍ ላይ ያሉ ደሴቶችየተባበሩት መንግስታትዩናይትድ ስቴትስኡራጓይኡዝቤኪስታንቫቲካን ከተማቅዱስ ቪንሴንት እ" + - "ና ግሬናዲንስቬንዙዌላየእንግሊዝ ቨርጂን ደሴቶችየአሜሪካ ቨርጂን ደሴቶችቬትናምቫኑአቱዋሊስ እና ፉቱና ደሴቶችሳሞአ" + - "ኮሶቮየመንሜይኦቴደቡብ አፍሪካዛምቢያዚምቧቤያልታወቀ ክልልዓለምአፍሪካሰሜን አሜሪካደቡብ አሜሪካኦሽኒአምስራቃዊ አፍ" + - "ሪካመካከለኛው አሜሪካምዕራባዊ አፍሪካሰሜናዊ አፍሪካመካከለኛው አፍሪካደቡባዊ አፍሪካአሜሪካሰሜናዊ አሜሪካካሪቢያን" + - "ምዕራባዊ እሲያደቡባዊ እሲያምዕራባዊ ደቡብ እሲያደቡባዊ አውሮፓአውስትራሊያሜላኔዥያየማይክሮኔዥያን ክልልፖሊኔዥያእ" + - "ሲያመካከለኛው እሲያምስራቃዊ እሲያአውሮፓምዕራባዊ አውሮፓሰሜናዊ አውሮፓምስራቃዊ አውሮፓላቲን አሜሪካ" - -var amRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0019, 0x0025, 0x0051, 0x0066, 0x0083, 0x0092, 0x00a1, - 0x00b0, 0x00bc, 0x00d1, 0x00e3, 0x00fc, 0x010b, 0x0120, 0x0129, - 0x0145, 0x0157, 0x0180, 0x018f, 0x01a1, 0x01ad, 0x01c0, 0x01cf, - 0x01db, 0x01e7, 0x01f0, 0x0209, 0x0215, 0x021e, 0x022a, 0x0252, - 0x025e, 0x026a, 0x0276, 0x0289, 0x0298, 0x02a4, 0x02ad, 0x02b6, - 0x02da, 0x02f0, 0x0322, 0x033b, 0x0350, 0x0360, 0x0373, 0x0379, - 0x0385, 0x038e, 0x039d, 0x03b9, 0x03c9, 0x03cf, 0x03df, 0x03eb, - 0x03fe, 0x040d, 0x0416, 0x0422, 0x0438, 0x0441, 0x0450, 0x045c, - // Entry 40 - 7F - 0x0478, 0x0487, 0x049d, 0x04a9, 0x04b8, 0x04c1, 0x04da, 0x04e6, - 0x04ef, 0x04fe, 0x051a, 0x051a, 0x0529, 0x052f, 0x054e, 0x0560, - 0x0576, 0x0585, 0x058e, 0x059d, 0x05a9, 0x05b5, 0x05d4, 0x05e0, - 0x05e6, 0x05f8, 0x060a, 0x0616, 0x061c, 0x062b, 0x0644, 0x064d, - 0x0694, 0x06a3, 0x06ac, 0x06bc, 0x06c5, 0x0709, 0x0742, 0x0751, - 0x0760, 0x0769, 0x0775, 0x078e, 0x07a0, 0x07b2, 0x07c1, 0x07d8, - 0x07e1, 0x0817, 0x0820, 0x0829, 0x083b, 0x0847, 0x0850, 0x085c, - 0x0868, 0x0871, 0x087a, 0x088c, 0x089b, 0x08a7, 0x08b3, 0x08d7, - // Entry 80 - BF - 0x08ea, 0x08fd, 0x0906, 0x091f, 0x0931, 0x093a, 0x0946, 0x0959, - 0x0971, 0x0980, 0x098f, 0x0998, 0x09a7, 0x09bc, 0x09c8, 0x09d1, - 0x09da, 0x09e3, 0x09ef, 0x0a01, 0x0a17, 0x0a29, 0x0a45, 0x0a54, - 0x0a5a, 0x0a74, 0x0a83, 0x0abd, 0x0ae6, 0x0af5, 0x0b04, 0x0b16, - 0x0b1f, 0x0b2b, 0x0b3a, 0x0b43, 0x0b4f, 0x0b5b, 0x0b6a, 0x0b76, - 0x0b8c, 0x0b95, 0x0bae, 0x0bbd, 0x0bc9, 0x0bdb, 0x0be7, 0x0bf0, - 0x0bf9, 0x0c02, 0x0c15, 0x0c1e, 0x0c27, 0x0c2d, 0x0c4f, 0x0c66, - 0x0c75, 0x0c84, 0x0c90, 0x0cba, 0x0cdf, 0x0cef, 0x0d0b, 0x0d1a, - // Entry C0 - FF - 0x0d23, 0x0d2f, 0x0d38, 0x0d5a, 0x0d69, 0x0d75, 0x0d81, 0x0d8a, - 0x0d96, 0x0dab, 0x0dc1, 0x0dcd, 0x0dd6, 0x0de2, 0x0df1, 0x0e04, - 0x0e13, 0x0e3d, 0x0e4c, 0x0e5b, 0x0e6b, 0x0e77, 0x0e80, 0x0e8c, - 0x0e9f, 0x0ec3, 0x0ed9, 0x0eef, 0x0ef8, 0x0f0a, 0x0f27, 0x0f56, - 0x0f5c, 0x0f88, 0x0f8e, 0x0f9d, 0x0faf, 0x0fbb, 0x0fd1, 0x0fe9, - 0x0ff5, 0x0ffe, 0x1007, 0x1027, 0x1030, 0x103c, 0x104b, 0x1057, - 0x1063, 0x1095, 0x10ba, 0x10d6, 0x10e2, 0x10f7, 0x110d, 0x1140, - 0x114f, 0x117b, 0x11a4, 0x11b0, 0x11bc, 0x11e3, 0x11ec, 0x11f5, - // Entry 100 - 13F - 0x11fe, 0x120a, 0x1220, 0x122c, 0x1238, 0x1251, 0x125a, 0x1266, - 0x127c, 0x1292, 0x129e, 0x12ba, 0x12d9, 0x12f5, 0x130e, 0x132d, - 0x1346, 0x1352, 0x136b, 0x137a, 0x1393, 0x13a9, 0x13cc, 0x13e5, - 0x13fa, 0x1409, 0x142e, 0x143d, 0x1446, 0x1462, 0x147b, 0x1487, - 0x14a3, 0x14bc, 0x14d8, 0x14ee, -} // Size: 608 bytes - -const arRegionStr string = "" + // Size: 5398 bytes - "جزيرة أسينشيونأندوراالإمارات العربية المتحدةأفغانستانأنتيغوا وبربوداأنغو" + - "يلاألبانياأرمينياأنغولاأنتاركتيكاالأرجنتينساموا الأمريكيةالنمساأستراليا" + - "أروباجزر آلاندأذربيجانالبوسنة والهرسكبربادوسبنغلاديشبلجيكابوركينا فاسوب" + - "لغارياالبحرينبورونديبنينسان بارتليميبرمودابرونايبوليفياهولندا الكاريبية" + - "البرازيلالبهامابوتانجزيرة بوفيهبتسوانابيلاروسبليزكنداجزر كوكوس (كيلينغ)" + - "الكونغو - كينشاساجمهورية أفريقيا الوسطىالكونغو - برازافيلسويسراساحل الع" + - "اججزر كوكتشيليالكاميرونالصينكولومبياجزيرة كليبيرتونكوستاريكاكوباالرأس ا" + - "لأخضركوراساوجزيرة الكريسماسقبرصالتشيكألمانيادييغو غارسياجيبوتيالدانمركد" + - "ومينيكاجمهورية الدومينيكانالجزائرسيوتا وميليلاالإكوادورإستونيامصرالصحرا" + - "ء الغربيةإريترياإسبانياإثيوبياالاتحاد الأوروبيفنلندافيجيجزر فوكلاندميكر" + - "ونيزياجزر فاروفرنساالغابونالمملكة المتحدةغريناداجورجياغويانا الفرنسيةغي" + - "رنزيغاناجبل طارقغرينلاندغامبياغينياغوادلوبغينيا الاستوائيةاليونانجورجيا" + - " الجنوبية وجزر ساندويتش الجنوبيةغواتيمالاغوامغينيا بيساوغياناهونغ كونغ ا" + - "لصينيةجزيرة هيرد وجزر ماكدونالدهندوراسكرواتياهايتيهنغارياجزر الكناريإند" + - "ونيسياأيرلنداإسرائيلجزيرة مانالهندالإقليم البريطاني في المحيط الهنديالع" + - "راقإيرانأيسلنداإيطالياجيرسيجامايكاالأردناليابانكينياقيرغيزستانكمبودياكي" + - "ريباتيجزر القمرسانت كيتس ونيفيسكوريا الشماليةكوريا الجنوبيةالكويتجزر كا" + - "يمانكازاخستانلاوسلبنانسانت لوسياليختنشتاينسريلانكاليبيرياليسوتوليتوانيا" + - "لوكسمبورغلاتفياليبياالمغربموناكومولدوفاالجبل الأسودسانت مارتنمدغشقرجزر " + - "مارشالمقدونياماليميانمار (بورما)منغوليامكاو الصينية (منطقة إدارية خاصة)" + - "جزر ماريانا الشماليةجزر المارتينيكموريتانيامونتسراتمالطاموريشيوسجزر الم" + - "الديفملاويالمكسيكماليزياموزمبيقناميبياكاليدونيا الجديدةالنيجرجزيرة نورف" + - "ولكنيجيريانيكاراغواهولنداالنرويجنيبالناورونيوينيوزيلنداعُمانبنمابيروبول" + - "ينيزيا الفرنسيةبابوا غينيا الجديدةالفلبينباكستانبولنداسانت بيير وميكولو" + - "نجزر بيتكيرنبورتوريكوالأراضي الفلسطينيةالبرتغالبالاوباراغوايقطرأوقيانوس" + - "يا النائيةروينيونرومانياصربياروسياروانداالمملكة العربية السعوديةجزر سلي" + - "مانسيشلالسودانالسويدسنغافورةسانت هيلانةسلوفينياسفالبارد وجان مايانسلوفا" + - "كياسيراليونسان مارينوالسنغالالصومالسورينامجنوب السودانساو تومي وبرينسيب" + - "يالسلفادورسينت مارتنسورياسوازيلاندتريستان دي كونهاجزر توركس وكايكوستشاد" + - "الأقاليم الجنوبية الفرنسيةتوغوتايلاندطاجيكستانتوكيلوتيمور- ليشتيتركمانس" + - "تانتونستونغاتركياترينيداد وتوباغوتوفالوتايوانتنزانياأوكرانياأوغنداجزر ا" + - "لولايات المتحدة النائيةالأمم المتحدةالولايات المتحدةأورغوايأوزبكستانالف" + - "اتيكانسانت فنسنت وجزر غرينادينفنزويلاجزر فيرجن البريطانيةجزر فيرجن التا" + - "بعة للولايات المتحدةفيتنامفانواتوجزر والس وفوتوناسامواكوسوفواليمنمايوتج" + - "نوب أفريقيازامبيازيمبابويمنطقة غير معروفةالعالمأفريقياأمريكا الشماليةأم" + - "ريكا الجنوبيةأوقيانوسياغرب أفريقياأمريكا الوسطىشرق أفريقياشمال أفريقياو" + - "سط أفريقياأفريقيا الجنوبيةالأمريكتانشمال أمريكاالكاريبيشرق آسياجنوب آسي" + - "اجنوب شرق آسياجنوب أوروباأسترالاسياميلانيزياالجزر الميكرونيزيةبولينيزيا" + - "آسياوسط آسياغرب آسياأوروباشرق أوروباشمال أوروباغرب أوروباأمريكا اللاتين" + - "ية" - -var arRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001b, 0x0027, 0x0055, 0x0067, 0x0084, 0x0092, 0x00a0, - 0x00ae, 0x00ba, 0x00ce, 0x00e0, 0x00fd, 0x0109, 0x0119, 0x0123, - 0x0134, 0x0144, 0x0161, 0x016f, 0x017f, 0x018b, 0x01a2, 0x01b0, - 0x01be, 0x01cc, 0x01d4, 0x01eb, 0x01f7, 0x0203, 0x0211, 0x0230, - 0x0240, 0x024e, 0x0258, 0x026d, 0x027b, 0x0289, 0x0291, 0x0299, - 0x02b9, 0x02d8, 0x0302, 0x0323, 0x032f, 0x0342, 0x034f, 0x0359, - 0x036b, 0x0375, 0x0385, 0x03a2, 0x03b4, 0x03bc, 0x03d3, 0x03e1, - 0x03fe, 0x0406, 0x0412, 0x0420, 0x0437, 0x0443, 0x0453, 0x0463, - // Entry 40 - 7F - 0x0488, 0x0496, 0x04af, 0x04c1, 0x04cf, 0x04d5, 0x04f2, 0x0500, - 0x050e, 0x051c, 0x053b, 0x053b, 0x0547, 0x054f, 0x0564, 0x0578, - 0x0587, 0x0591, 0x059f, 0x05bc, 0x05ca, 0x05d6, 0x05f3, 0x05ff, - 0x0607, 0x0616, 0x0626, 0x0632, 0x063c, 0x064a, 0x0669, 0x0677, - 0x06bf, 0x06d1, 0x06d9, 0x06ee, 0x06f8, 0x0718, 0x0747, 0x0755, - 0x0763, 0x076d, 0x077b, 0x0790, 0x07a2, 0x07b0, 0x07be, 0x07cf, - 0x07d9, 0x0819, 0x0825, 0x082f, 0x083d, 0x084b, 0x0855, 0x0863, - 0x086f, 0x087d, 0x0887, 0x089b, 0x08a9, 0x08b9, 0x08ca, 0x08e8, - // Entry 80 - BF - 0x0903, 0x091e, 0x092a, 0x093d, 0x094f, 0x0957, 0x0961, 0x0974, - 0x0988, 0x0998, 0x09a6, 0x09b2, 0x09c2, 0x09d4, 0x09e0, 0x09ea, - 0x09f6, 0x0a02, 0x0a10, 0x0a27, 0x0a3a, 0x0a46, 0x0a59, 0x0a67, - 0x0a6f, 0x0a8a, 0x0a98, 0x0ad2, 0x0af8, 0x0b13, 0x0b25, 0x0b35, - 0x0b3f, 0x0b4f, 0x0b66, 0x0b70, 0x0b7e, 0x0b8c, 0x0b9a, 0x0ba8, - 0x0bc9, 0x0bd5, 0x0bee, 0x0bfc, 0x0c0e, 0x0c1a, 0x0c28, 0x0c32, - 0x0c3c, 0x0c44, 0x0c56, 0x0c60, 0x0c68, 0x0c70, 0x0c93, 0x0cb7, - 0x0cc5, 0x0cd3, 0x0cdf, 0x0d01, 0x0d16, 0x0d28, 0x0d4b, 0x0d5b, - // Entry C0 - FF - 0x0d65, 0x0d75, 0x0d7b, 0x0d9e, 0x0dac, 0x0dba, 0x0dc4, 0x0dce, - 0x0dda, 0x0e08, 0x0e1b, 0x0e23, 0x0e31, 0x0e3d, 0x0e4d, 0x0e62, - 0x0e72, 0x0e96, 0x0ea6, 0x0eb6, 0x0ec9, 0x0ed7, 0x0ee5, 0x0ef3, - 0x0f0a, 0x0f2c, 0x0f3e, 0x0f51, 0x0f5b, 0x0f6d, 0x0f8b, 0x0fab, - 0x0fb3, 0x0fe5, 0x0fed, 0x0ffb, 0x100d, 0x1019, 0x102f, 0x1043, - 0x104b, 0x1055, 0x105f, 0x107e, 0x108a, 0x1096, 0x10a4, 0x10b4, - 0x10c0, 0x10f5, 0x110e, 0x112d, 0x113b, 0x114d, 0x115f, 0x118c, - 0x119a, 0x11c0, 0x1200, 0x120c, 0x121a, 0x1238, 0x1242, 0x124e, - // Entry 100 - 13F - 0x1258, 0x1262, 0x1279, 0x1285, 0x1295, 0x12b3, 0x12bf, 0x12cd, - 0x12ea, 0x1307, 0x131b, 0x1330, 0x1349, 0x135e, 0x1375, 0x138a, - 0x13a9, 0x13bd, 0x13d2, 0x13e2, 0x13f1, 0x1402, 0x141a, 0x142f, - 0x1443, 0x1455, 0x1478, 0x148a, 0x1492, 0x14a1, 0x14b0, 0x14bc, - 0x14cf, 0x14e4, 0x14f7, 0x1516, -} // Size: 608 bytes - -const azRegionStr string = "" + // Size: 3262 bytes - "Askenson adasıAndorraBirləşmiş Ərəb ƏmirlikləriƏfqanıstanAntiqua və Barb" + - "udaAngilyaAlbaniyaErmənistanAnqolaAntarktikaArgentinaAmerika SamoasıAvst" + - "riyaAvstraliyaArubaAland adalarıAzərbaycanBosniya və HerseqovinaBarbados" + - "BanqladeşBelçikaBurkina FasoBolqarıstanBəhreynBurundiBeninSent-Bartelemi" + - "Bermud adalarıBruneyBoliviyaKarib NiderlandıBraziliyaBaham adalarıButanB" + - "uve adasıBotsvanaBelarusBelizKanadaKokos (Kilinq) adalarıKonqo - Kinşasa" + - "Mərkəzi Afrika RespublikasıKonqo - BrazzavilİsveçrəKotd’ivuarKuk adaları" + - "ÇiliKamerunÇinKolumbiyaKlipperton adasıKosta RikaKubaKabo-VerdeKurasaoM" + - "ilad adasıKiprÇexiyaAlmaniyaDieqo QarsiyaCibutiDanimarkaDominikaDominika" + - "n RespublikasıƏlcəzairSeuta və MelilyaEkvadorEstoniyaMisirQərbi SaxaraEr" + - "itreyaİspaniyaEfiopiyaAvropa BirliyiFinlandiyaFiciFolklend adalarıMikron" + - "eziyaFarer adalarıFransaQabonBirləşmiş KrallıqQrenadaGürcüstanFransa Qvi" + - "anasıGernsiQanaCəbəllütariqQrenlandiyaQambiyaQvineyaQvadelupaEkvatorial " + - "QvineyaYunanıstanCənubi Corciya və Cənubi Sendviç adalarıQvatemalaQuamQv" + - "ineya-BisauQayanaHonq Konq Xüsusi İnzibati Ərazi ÇinHerd və Makdonald ad" + - "alarıHondurasXorvatiyaHaitiMacarıstanKanar adalarıİndoneziyaİrlandiyaİsr" + - "ailMen adasıHindistanBritaniyanın Hind Okeanı Ərazisiİraqİranİslandiyaİt" + - "aliyaCersiYamaykaİordaniyaYaponiyaKeniyaQırğızıstanKambocaKiribatiKomor " + - "adalarıSent-Kits və NevisŞimali KoreyaCənubi KoreyaKüveytKayman adalarıQ" + - "azaxıstanLaosLivanSent-LusiyaLixtenşteynŞri-LankaLiberiyaLesotoLitvaLüks" + - "emburqLatviyaLiviyaMərakeşMonakoMoldovaMonteneqroSent MartinMadaqaskarMa" + - "rşal adalarıMakedoniyaMaliMyanmaMonqolustanMakao Xüsusi İnzibati Ərazi Ç" + - "inŞimali Marian adalarıMartinikMavritaniyaMonseratMaltaMavrikiMaldiv ada" + - "larıMalaviMeksikaMalayziyaMozambikNamibiyaYeni KaledoniyaNigerNorfolk ad" + - "asıNigeriyaNikaraquaNiderlandNorveçNepalNauruNiueYeni ZelandiyaOmanPanam" + - "aPeruFransa PolineziyasıPapua-Yeni QvineyaFilippinPakistanPolşaMüqəddəs " + - "Pyer və MikelonPitkern adalarıPuerto RikoFələstin ƏraziləriPortuqaliyaPa" + - "lauParaqvayQətərUzaq OkeaniyaReyunyonRumıniyaSerbiyaRusiyaRuandaSəudiyyə" + - " ƏrəbistanıSolomon adalarıSeyşel adalarıSudanİsveçSinqapurMüqəddəs Yelen" + - "aSloveniyaSvalbard və Yan-MayenSlovakiyaSyerra-LeoneSan-MarinoSeneqalSom" + - "aliSurinamCənubi SudanSan-Tome və PrinsipiSalvadorSint-MartenSuriyaSvazi" + - "lendTristan da KunyaTörks və Kaykos adalarıÇadFransanın Cənub ƏraziləriT" + - "oqoTailandTacikistanTokelauŞərqi TimorTürkmənistanTunisTonqaTürkiyəTrini" + - "dad və TobaqoTuvaluTayvanTanzaniyaUkraynaUqandaABŞ-a bağlı kiçik adacıql" + - "arBirləşmiş Millətlər TəşkilatıAmerika Birləşmiş ŞtatlarıUruqvayÖzbəkist" + - "anVatikanSent-Vinsent və QrenadinlərVenesuelaBritaniyanın Virgin adaları" + - "ABŞ Virgin adalarıVyetnamVanuatuUollis və FutunaSamoaKosovoYəmənMayotCən" + - "ub AfrikaZambiyaZimbabveNaməlum RegionDünyaAfrikaŞimali AmerikaCənubi Am" + - "erikaOkeaniyaQərbi AfrikaMərkəzi AmerikaŞərqi AfrikaŞimali AfrikaMərkəzi" + - " AfrikaCənubi AfrikaAmerikaŞimal AmerikasıKaribŞərqi AsiyaCənubi AsiyaCə" + - "nub-Şərqi AsiyaCənubi AvropaAvstralaziyaMelaneziyaMikroneziya RegionuPol" + - "ineziyaAsiyaMərkəzi AsiyaQərbi AsiyaAvropaŞərqi AvropaŞimali AvropaQərbi" + - " AvropaLatın Amerikası" - -var azRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x0016, 0x0037, 0x0043, 0x0056, 0x005d, 0x0065, - 0x0070, 0x0076, 0x0080, 0x0089, 0x0099, 0x00a1, 0x00ab, 0x00b0, - 0x00be, 0x00c9, 0x00e0, 0x00e8, 0x00f2, 0x00fa, 0x0106, 0x0112, - 0x011a, 0x0121, 0x0126, 0x0134, 0x0143, 0x0149, 0x0151, 0x0162, - 0x016b, 0x0179, 0x017e, 0x0189, 0x0191, 0x0198, 0x019d, 0x01a3, - 0x01ba, 0x01ca, 0x01e8, 0x01f9, 0x0203, 0x020f, 0x021b, 0x0220, - 0x0227, 0x022b, 0x0234, 0x0245, 0x024f, 0x0253, 0x025d, 0x0264, - 0x0270, 0x0274, 0x027b, 0x0283, 0x0290, 0x0296, 0x029f, 0x02a7, - // Entry 40 - 7F - 0x02be, 0x02c8, 0x02d9, 0x02e0, 0x02e8, 0x02ed, 0x02fa, 0x0302, - 0x030b, 0x0313, 0x0321, 0x0321, 0x032b, 0x032f, 0x0340, 0x034b, - 0x0359, 0x035f, 0x0364, 0x0379, 0x0380, 0x038b, 0x039b, 0x03a1, - 0x03a5, 0x03b4, 0x03bf, 0x03c6, 0x03cd, 0x03d6, 0x03e8, 0x03f3, - 0x0420, 0x0429, 0x042d, 0x043a, 0x0440, 0x0467, 0x0482, 0x048a, - 0x0493, 0x0498, 0x04a3, 0x04b1, 0x04bc, 0x04c6, 0x04cd, 0x04d7, - 0x04e0, 0x0503, 0x0508, 0x050d, 0x0517, 0x051f, 0x0524, 0x052b, - 0x0535, 0x053d, 0x0543, 0x0552, 0x0559, 0x0561, 0x056f, 0x0582, - // Entry 80 - BF - 0x0590, 0x059e, 0x05a5, 0x05b4, 0x05bf, 0x05c3, 0x05c8, 0x05d3, - 0x05df, 0x05e9, 0x05f1, 0x05f7, 0x05fc, 0x0607, 0x060e, 0x0614, - 0x061d, 0x0623, 0x062a, 0x0634, 0x063f, 0x0649, 0x0659, 0x0663, - 0x0667, 0x066d, 0x0678, 0x069b, 0x06b2, 0x06ba, 0x06c5, 0x06cd, - 0x06d2, 0x06d9, 0x06e8, 0x06ee, 0x06f5, 0x06fe, 0x0706, 0x070e, - 0x071d, 0x0722, 0x0730, 0x0738, 0x0741, 0x074a, 0x0751, 0x0756, - 0x075b, 0x075f, 0x076d, 0x0771, 0x0777, 0x077b, 0x078f, 0x07a1, - 0x07a9, 0x07b1, 0x07b7, 0x07d3, 0x07e3, 0x07ee, 0x0804, 0x080f, - // Entry C0 - FF - 0x0814, 0x081c, 0x0823, 0x0830, 0x0838, 0x0841, 0x0848, 0x084e, - 0x0854, 0x086c, 0x087c, 0x088c, 0x0891, 0x0898, 0x08a0, 0x08b2, - 0x08bb, 0x08d1, 0x08da, 0x08e6, 0x08f0, 0x08f7, 0x08fd, 0x0904, - 0x0911, 0x0926, 0x092e, 0x0939, 0x093f, 0x0948, 0x0958, 0x0972, - 0x0976, 0x0993, 0x0997, 0x099e, 0x09a8, 0x09af, 0x09bc, 0x09ca, - 0x09cf, 0x09d4, 0x09dd, 0x09f0, 0x09f6, 0x09fc, 0x0a05, 0x0a0c, - 0x0a12, 0x0a32, 0x0a57, 0x0a76, 0x0a7d, 0x0a89, 0x0a90, 0x0aad, - 0x0ab6, 0x0ad3, 0x0ae7, 0x0aee, 0x0af5, 0x0b06, 0x0b0b, 0x0b11, - // Entry 100 - 13F - 0x0b18, 0x0b1d, 0x0b2a, 0x0b31, 0x0b39, 0x0b48, 0x0b4e, 0x0b54, - 0x0b63, 0x0b72, 0x0b7a, 0x0b87, 0x0b98, 0x0ba6, 0x0bb4, 0x0bc4, - 0x0bd2, 0x0bd9, 0x0bea, 0x0bef, 0x0bfc, 0x0c09, 0x0c1d, 0x0c2b, - 0x0c37, 0x0c41, 0x0c54, 0x0c5e, 0x0c63, 0x0c72, 0x0c7e, 0x0c84, - 0x0c92, 0x0ca0, 0x0cad, 0x0cbe, -} // Size: 608 bytes - -const bgRegionStr string = "" + // Size: 5910 bytes - "остров ВъзнесениеАндораОбединени арабски емирстваАфганистанАнтигуа и Бар" + - "будаАнгуилаАлбанияАрменияАнголаАнтарктикаАржентинаАмериканска СамоаАвст" + - "рияАвстралияАрубаОландски островиАзербайджанБосна и ХерцеговинаБарбадос" + - "БангладешБелгияБуркина ФасоБългарияБахрейнБурундиБенинСен БартелемиБерм" + - "удаБруней ДаруссаламБоливияКарибска НидерландияБразилияБахамиБутаностро" + - "в БувеБотсванаБеларусБелизКанадаКокосови острови (острови Кийлинг)Конго" + - " (Киншаса)Централноафриканска републикаКонго (Бразавил)ШвейцарияКот д’Ив" + - "оарострови КукЧилиКамерунКитайКолумбияостров КлипертонКоста РикаКубаКаб" + - "о ВердеКюрасаоостров РождествоКипърЧехияГерманияДиего ГарсияДжибутиДани" + - "яДоминикаДоминиканска републикаАлжирСеута и МелияЕквадорЕстонияЕгипетЗа" + - "падна СахараЕритреяИспанияЕтиопияЕвропейски съюзФинландияФиджиФолклендс" + - "ки островиМикронезияФарьорски островиФранцияГабонОбединеното кралствоГр" + - "енадаГрузияФренска ГвианаГърнзиГанаГибралтарГренландияГамбияГвинеяГваде" + - "лупаЕкваториална ГвинеяГърцияЮжна Джорджия и Южни Сандвичеви островиГва" + - "темалаГуамГвинея-БисауГаянаХонконг, САР на Китайостров Хърд и острови М" + - "акдоналдХондурасХърватияХаитиУнгарияКанарски островиИндонезияИрландияИз" + - "раелостров МанИндияБританска територия в Индийския океанИракИранИсланди" + - "яИталияДжърсиЯмайкаЙорданияЯпонияКенияКиргизстанКамбоджаКирибатиКоморск" + - "и островиСейнт Китс и НевисСеверна КореяЮжна КореяКувейтКайманови остро" + - "виКазахстанЛаосЛиванСейнт ЛусияЛихтенщайнШри ЛанкаЛиберияЛесотоЛитваЛюк" + - "сембургЛатвияЛибияМарокоМонакоМолдоваЧерна гораСен МартенМадагаскарМарш" + - "алови островиМакедонияМалиМианмар (Бирма)МонголияМакао, САР на КитайСев" + - "ерни Мариански островиМартиникаМавританияМонтсератМалтаМаврицийМалдивиМ" + - "алавиМексикоМалайзияМозамбикНамибияНова КаледонияНигеростров НорфолкНиг" + - "ерияНикарагуаНидерландияНорвегияНепалНауруНиуеНова ЗеландияОманПанамаПе" + - "руФренска ПолинезияПапуа-Нова ГвинеяФилипиниПакистанПолшаСен Пиер и Мик" + - "елонОстрови ПиткернПуерто РикоПалестински територииПортугалияПалауПараг" + - "вайКатарОтдалечени острови на ОкеанияРеюнионРумънияСърбияРусияРуандаСау" + - "дитска АрабияСоломонови островиСейшелиСуданШвецияСингапурСвета ЕленаСло" + - "венияСвалбард и Ян МайенСловакияСиера ЛеонеСан МариноСенегалСомалияСури" + - "намЮжен СуданСао Томе и ПринсипиСалвадорСинт МартенСирияСвазилендТриста" + - "н да Куняострови Търкс и КайкосЧадФренски южни територииТогоТайландТадж" + - "икистанТокелауИзточен ТиморТуркменистанТунисТонгаТурцияТринидад и Тобаг" + - "оТувалуТайванТанзанияУкрайнаУгандаОтдалечени острови на САЩОрганизация " + - "на обединените нацииСъединени щатиУругвайУзбекистанВатиканСейнт Винсънт" + - " и ГренадиниВенецуелаБритански Вирджински островиАмерикански Вирджински " + - "островиВиетнамВануатуУолис и ФутунаСамоаКосовоЙеменМайотЮжна АфрикаЗамб" + - "ияЗимбабвенепознат регионСвятАфрикаСеверноамерикански континентЮжна Аме" + - "рикаОкеанияЗападна АфиркаЦентрална АмерикаИзточна АфрикаСеверна АфрикаЦ" + - "ентрална АфрикаЮжноафрикански регионАмерикаСеверна АмерикаКарибски реги" + - "онИзточна АзияЮжна АзияЮгоизточна АзияЮжна ЕвропаАвстралазияМеланезияМи" + - "кронезийски регионПолинезияАзияЦентрална АзияЗападна АзияЕвропаИзточна " + - "ЕвропаСеверна ЕвропаЗападна ЕвропаЛатинска Америка" - -var bgRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0021, 0x002d, 0x005f, 0x0073, 0x0093, 0x00a1, 0x00af, - 0x00bd, 0x00c9, 0x00dd, 0x00ef, 0x0110, 0x011e, 0x0130, 0x013a, - 0x0159, 0x016f, 0x0193, 0x01a3, 0x01b5, 0x01c1, 0x01d8, 0x01e8, - 0x01f6, 0x0204, 0x020e, 0x0227, 0x0235, 0x0256, 0x0264, 0x028b, - 0x029b, 0x02a7, 0x02b1, 0x02c6, 0x02d6, 0x02e4, 0x02ee, 0x02fa, - 0x0339, 0x0354, 0x038d, 0x03aa, 0x03bc, 0x03d2, 0x03e7, 0x03ef, - 0x03fd, 0x0407, 0x0417, 0x0436, 0x0449, 0x0451, 0x0464, 0x0472, - 0x0491, 0x049b, 0x04a5, 0x04b5, 0x04cc, 0x04da, 0x04e4, 0x04f4, - // Entry 40 - 7F - 0x051f, 0x0529, 0x0541, 0x054f, 0x055d, 0x0569, 0x0584, 0x0592, - 0x05a0, 0x05ae, 0x05cb, 0x05cb, 0x05dd, 0x05e7, 0x060c, 0x0620, - 0x0641, 0x064f, 0x0659, 0x0680, 0x068e, 0x069a, 0x06b5, 0x06c1, - 0x06c9, 0x06db, 0x06ef, 0x06fb, 0x0707, 0x0719, 0x073e, 0x074a, - 0x0793, 0x07a5, 0x07ad, 0x07c4, 0x07ce, 0x07f4, 0x082e, 0x083e, - 0x084e, 0x0858, 0x0866, 0x0885, 0x0897, 0x08a7, 0x08b3, 0x08c6, - 0x08d0, 0x0916, 0x091e, 0x0926, 0x0936, 0x0942, 0x094e, 0x095a, - 0x096a, 0x0976, 0x0980, 0x0994, 0x09a4, 0x09b4, 0x09d3, 0x09f4, - // Entry 80 - BF - 0x0a0d, 0x0a20, 0x0a2c, 0x0a4d, 0x0a5f, 0x0a67, 0x0a71, 0x0a86, - 0x0a9a, 0x0aab, 0x0ab9, 0x0ac5, 0x0acf, 0x0ae3, 0x0aef, 0x0af9, - 0x0b05, 0x0b11, 0x0b1f, 0x0b32, 0x0b45, 0x0b59, 0x0b7a, 0x0b8c, - 0x0b94, 0x0baf, 0x0bbf, 0x0be1, 0x0c11, 0x0c23, 0x0c37, 0x0c49, - 0x0c53, 0x0c63, 0x0c71, 0x0c7d, 0x0c8b, 0x0c9b, 0x0cab, 0x0cb9, - 0x0cd4, 0x0cde, 0x0cf9, 0x0d07, 0x0d19, 0x0d2f, 0x0d3f, 0x0d49, - 0x0d53, 0x0d5b, 0x0d74, 0x0d7c, 0x0d88, 0x0d90, 0x0db1, 0x0dd1, - 0x0de1, 0x0df1, 0x0dfb, 0x0e1c, 0x0e39, 0x0e4e, 0x0e77, 0x0e8b, - // Entry C0 - FF - 0x0e95, 0x0ea5, 0x0eaf, 0x0ee6, 0x0ef4, 0x0f02, 0x0f0e, 0x0f18, - 0x0f24, 0x0f43, 0x0f66, 0x0f74, 0x0f7e, 0x0f8a, 0x0f9a, 0x0faf, - 0x0fbf, 0x0fe2, 0x0ff2, 0x1007, 0x101a, 0x1028, 0x1036, 0x1044, - 0x1057, 0x107a, 0x108a, 0x109f, 0x10a9, 0x10bb, 0x10d7, 0x1100, - 0x1106, 0x1130, 0x1138, 0x1146, 0x115c, 0x116a, 0x1183, 0x119b, - 0x11a5, 0x11af, 0x11bb, 0x11db, 0x11e7, 0x11f3, 0x1203, 0x1211, - 0x121d, 0x124c, 0x1289, 0x12a4, 0x12b2, 0x12c6, 0x12d4, 0x1303, - 0x1315, 0x134b, 0x1385, 0x1393, 0x13a1, 0x13bb, 0x13c5, 0x13d1, - // Entry 100 - 13F - 0x13db, 0x13e5, 0x13fa, 0x1406, 0x1416, 0x1433, 0x143b, 0x1447, - 0x147e, 0x1495, 0x14a3, 0x14be, 0x14df, 0x14fa, 0x1515, 0x1534, - 0x155d, 0x156b, 0x1588, 0x15a5, 0x15bc, 0x15cd, 0x15ea, 0x15ff, - 0x1615, 0x1627, 0x164e, 0x1660, 0x1668, 0x1683, 0x169a, 0x16a6, - 0x16c1, 0x16dc, 0x16f7, 0x1716, -} // Size: 608 bytes - -const bnRegionStr string = "" + // Size: 9509 bytes - "অ্যাসসেনশন আইল্যান্ডআন্ডোরাসংযুক্ত আরব আমিরাতআফগানিস্তানএন্টিগুয়া ও বার" + - "বুডাএ্যাঙ্গুইলাআলবেনিয়াআর্মেনিয়াঅ্যাঙ্গোলাঅ্যান্টার্কটিকাআর্জেন্টিনা" + - "আমেরিকান সামোয়াঅস্ট্রিয়াঅস্ট্রেলিয়াআরুবাআলান্ড দ্বীপপুঞ্জআজারবাইজান" + - "বসনিয়া ও হার্জেগোভিনাবারবাদোসবাংলাদেশবেলজিয়ামবুরকিনা ফাসোবুলগেরিয়াব" + - "াহরাইনবুরুন্ডিবেনিনসেন্ট বারথেলিমিবারমুডাব্রুনেইবলিভিয়াক্যারিবিয়ান ন" + - "েদারল্যান্ডসব্রাজিলবাহামা দ্বীপপুঞ্জভুটানবোভেট দ্বীপবতসোয়ানাবেলারুশবে" + - "লিজকানাডাকোকোস (কিলিং) দ্বীপপুঞ্জকঙ্গো-কিনশাসামধ্য আফ্রিকার প্রজাতন্ত্" + - "রকঙ্গো - ব্রাজাভিলসুইজারল্যান্ডআইভরি কোস্টকুক দ্বীপপুঞ্জচিলিক্যামেরুনচ" + - "ীনকলম্বিয়াক্লিপারটন আইল্যান্ডকোস্টারিকাকিউবাকেপভার্দেকিউরাসাওক্রিসমাস" + - " দ্বীপসাইপ্রাসচেচিয়াজার্মানিদিয়েগো গার্সিয়াজিবুতিডেনমার্কডোমিনিকাডোমে" + - "নিকান প্রজাতন্ত্রআলজেরিয়াকুউটা এবং মেলিলাইকুয়েডরএস্তোনিয়ামিশরপশ্চিম" + - " সাহারাইরিত্রিয়াস্পেনইফিওপিয়াইউরোপীয় ইউনিয়নফিনল্যান্ডফিজিফকল্যান্ড দ" + - "্বীপপুঞ্জমাইক্রোনেশিয়াফ্যারও দ্বীপপুঞ্জফ্রান্সগ্যাবনযুক্তরাজ্যগ্রেনাড" + - "াজর্জিয়াফরাসী গায়ানাগ্রাঞ্জিঘানাজিব্রাল্টারগ্রীনল্যান্ডগাম্বিয়াগিনি" + - "গুয়াদেলৌপনিরক্ষীয় গিনিগ্রীসদক্ষিণ জর্জিয়া ও দক্ষিণ স্যান্ডউইচ দ্বীপ" + - "পুঞ্জগুয়াতেমালাগুয়ামগিনি-বিসাউগিয়ানাহংকং এসএআর চীনাহার্ড দ্বীপ এবং " + - "ম্যাকডোনাল্ড দ্বীপপুঞ্জহণ্ডুরাসক্রোয়েশিয়াহাইতিহাঙ্গেরিক্যানারি দ্বীপ" + - "পুঞ্জইন্দোনেশিয়াআয়ারল্যান্ডইজরায়েলআইল অফ ম্যানভারতব্রিটিশ ভারত মহাস" + - "াগরীয় অঞ্চলইরাকইরানআইসল্যান্ডইতালিজার্সিজামাইকাজর্ডনজাপানকেনিয়াকিরগি" + - "জিস্তানকম্বোডিয়াকিরিবাতিকমোরোসসেন্ট কিটস ও নেভিসউত্তর কোরিয়াদক্ষিণ ক" + - "োরিয়াকুয়েতকেম্যান দ্বীপপুঞ্জকাজাখস্তানলাওসলেবাননসেন্ট লুসিয়ালিচেনস্" + - "টেইনশ্রীলঙ্কালাইবেরিয়ালেসোথোলিথুয়ানিয়ালাক্সেমবার্গলাত্ভিয়ালিবিয়াম" + - "োরক্কোমোনাকোমোল্দাভিয়ামন্টিনিগ্রোসেন্ট মার্টিনমাদাগাস্কারমার্শাল দ্বী" + - "পপুঞ্জম্যাসাডোনিয়ামালিমায়ানমার (বার্মা)মঙ্গোলিয়াম্যাকাও এসএআর চীনাউ" + - "ত্তরাঞ্চলীয় মারিয়ানা দ্বীপপুঞ্জমার্টিনিকমরিতানিয়ামন্টসেরাটমাল্টামরি" + - "শাসমালদ্বীপমালাউইমেক্সিকোমালয়েশিয়ামোজাম্বিকনামিবিয়ানিউ ক্যালেডোনিয়" + - "ানাইজারনিরফোক দ্বীপনাইজেরিয়ানিকারাগুয়ানেদারল্যান্ডসনরওয়েনেপালনাউরুন" + - "িউয়েনিউজিল্যান্ডওমানপানামাপেরুফরাসী পলিনেশিয়াপাপুয়া নিউ গিনিফিলিপাই" + - "নপাকিস্তানপোল্যান্ডসেন্ট পিয়ের ও মিকুয়েলনপিটকেয়ার্ন দ্বীপপুঞ্জপুয়ে" + - "র্তো রিকোফিলিস্তিন অঞ্চলসমূহপর্তুগালপালাউপ্যারাগুয়েকাতারআউটলাইনিং ওসা" + - "নিয়ারিইউনিয়নরোমানিয়াসার্বিয়ারাশিয়ারুয়ান্ডাসৌদি আরবসলোমন দ্বীপপুঞ" + - "্জসিসিলিসুদানসুইডেনসিঙ্গাপুরসেন্ট হেলেনাস্লোভানিয়াস্বালবার্ড ও জান মে" + - "য়েনস্লোভাকিয়াসিয়েরালিওনসান মারিনোসেনেগালসোমালিয়াসুরিনামদক্ষিণ সুদা" + - "নসাওটোমা ও প্রিন্সিপিএল সালভেদরসিন্ট মার্টেনসিরিয়াসোয়াজিল্যান্ডট্রিস" + - "্টান ডা কুনহাতুর্কস ও কাইকোস দ্বীপপুঞ্জচাদফরাসী দক্ষিণাঞ্চলটোগোথাইল্যা" + - "ন্ডতাজিকস্থানটোকেলাউতিমুর-লেস্তেতুর্কমেনিস্তানতিউনিসিয়াটোঙ্গাতুরস্কত্" + - "রিনিনাদ ও টোব্যাগোটুভালুতাইওয়ানতাঞ্জানিয়াইউক্রেনউগান্ডাযুক্তরাষ্ট্রে" + - "র পার্শ্ববর্তী দ্বীপপুঞ্জজাতিসংঘমার্কিন যুক্তরাষ্ট্রউরুগুয়েউজবেকিস্তা" + - "নভ্যাটিকান সিটিসেন্ট ভিনসেন্ট ও দ্যা গ্রেনাডিনসভেনেজুয়েলাব্রিটিশ ভার্" + - "জিন দ্বীপপুঞ্জমার্কিন যুক্তরাষ্ট্রের ভার্জিন দ্বীপপুঞ্জভিয়েতনামভানুয়" + - "াটুওয়ালিস ও ফুটুনাসামোয়াকসোভোইয়েমেনমায়োত্তেদক্ষিণ আফ্রিকাজাম্বিয়া" + - "জিম্বাবোয়েঅজানা অঞ্চলপৃথিবীআফ্রিকাউত্তর আমেরিকাদক্ষিণ আমেরিকাওশিয়ানি" + - "য়াপশ্চিম আফ্রিকামধ্য আমেরিকাপূর্ব আফ্রিকাউত্তর আফ্রিকামধ্য আফ্রিকাদক্" + - "ষিন আফ্রিকাআমেরিকাসউত্তরাঞ্চলীয় আমেরিকাক্যারাবিয়ানপূর্ব এশিয়াদক্ষিণ" + - " এশিয়াদক্ষিণ পূর্ব এশিয়াদক্ষিণ ইউরোপঅস্ট্রালেশিয়াম্যালেনেশিয়ামাইক্রো" + - "নেশিয়া অঞ্চলপলিনেশিয়াএশিয়ামধ্য এশিয়াপশ্চিম এশিয়াইউরোপপূর্ব ইউরোপউ" + - "ত্তর ইউরোপপশ্চিম ইউরোপল্যাটিন আমেরিকা" - -var bnRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x003a, 0x004f, 0x0081, 0x00a2, 0x00da, 0x00fb, 0x0116, - 0x0134, 0x0152, 0x017f, 0x01a0, 0x01ce, 0x01ec, 0x0210, 0x021f, - 0x0250, 0x026e, 0x02ac, 0x02c4, 0x02dc, 0x02f7, 0x0319, 0x0337, - 0x034c, 0x0364, 0x0373, 0x039e, 0x03b3, 0x03c8, 0x03e0, 0x042c, - 0x0441, 0x0472, 0x0481, 0x04a0, 0x04bb, 0x04d0, 0x04df, 0x04f1, - 0x0531, 0x0556, 0x059d, 0x05ca, 0x05f1, 0x0610, 0x0638, 0x0644, - 0x065f, 0x0668, 0x0683, 0x06ba, 0x06d8, 0x06e7, 0x0702, 0x071a, - 0x0742, 0x075a, 0x076f, 0x0787, 0x07b8, 0x07ca, 0x07e2, 0x07fa, - // Entry 40 - 7F - 0x0837, 0x0852, 0x087e, 0x0896, 0x08b4, 0x08c0, 0x08e5, 0x0903, - 0x0912, 0x092d, 0x095b, 0x095b, 0x0979, 0x0985, 0x09bf, 0x09e9, - 0x0a1a, 0x0a2f, 0x0a41, 0x0a5f, 0x0a77, 0x0a8f, 0x0ab4, 0x0acc, - 0x0ad8, 0x0af9, 0x0b1d, 0x0b38, 0x0b44, 0x0b62, 0x0b8a, 0x0b99, - 0x0c19, 0x0c3a, 0x0c4c, 0x0c68, 0x0c7d, 0x0ca6, 0x0d13, 0x0d2b, - 0x0d4f, 0x0d5e, 0x0d76, 0x0dad, 0x0dd1, 0x0df5, 0x0e0d, 0x0e2d, - 0x0e39, 0x0e8a, 0x0e96, 0x0ea2, 0x0ec0, 0x0ecf, 0x0ee1, 0x0ef6, - 0x0f05, 0x0f14, 0x0f29, 0x0f4d, 0x0f6b, 0x0f83, 0x0f95, 0x0fc5, - // Entry 80 - BF - 0x0fea, 0x1012, 0x1024, 0x1058, 0x1076, 0x1082, 0x1094, 0x10b9, - 0x10da, 0x10f5, 0x1113, 0x1125, 0x1149, 0x116d, 0x1188, 0x119d, - 0x11b2, 0x11c4, 0x11e5, 0x1206, 0x122b, 0x124c, 0x1280, 0x12a7, - 0x12b3, 0x12e3, 0x1301, 0x1333, 0x1395, 0x13b0, 0x13ce, 0x13e9, - 0x13fb, 0x140d, 0x1425, 0x1437, 0x144f, 0x1470, 0x148b, 0x14a6, - 0x14d7, 0x14e9, 0x150b, 0x1529, 0x154a, 0x1571, 0x1583, 0x1592, - 0x15a1, 0x15b3, 0x15d7, 0x15e3, 0x15f5, 0x1601, 0x162f, 0x165b, - 0x1673, 0x168e, 0x16a9, 0x16eb, 0x172b, 0x1753, 0x178a, 0x17a2, - // Entry C0 - FF - 0x17b1, 0x17d2, 0x17e1, 0x1815, 0x1830, 0x184b, 0x1866, 0x187b, - 0x1896, 0x18ac, 0x18da, 0x18ec, 0x18fb, 0x190d, 0x1928, 0x194a, - 0x196b, 0x19aa, 0x19cb, 0x19ec, 0x1a08, 0x1a1d, 0x1a38, 0x1a4d, - 0x1a6f, 0x1aa7, 0x1ac3, 0x1ae8, 0x1afd, 0x1b27, 0x1b59, 0x1ba1, - 0x1baa, 0x1bdb, 0x1be7, 0x1c05, 0x1c23, 0x1c38, 0x1c5a, 0x1c84, - 0x1ca2, 0x1cb4, 0x1cc6, 0x1cfe, 0x1d10, 0x1d28, 0x1d49, 0x1d5e, - 0x1d73, 0x1de1, 0x1df6, 0x1e30, 0x1e48, 0x1e69, 0x1e91, 0x1ee9, - 0x1f0a, 0x1f54, 0x1fc9, 0x1fe4, 0x1fff, 0x202b, 0x2040, 0x204f, - // Entry 100 - 13F - 0x2064, 0x207f, 0x20a7, 0x20c2, 0x20e3, 0x2102, 0x2114, 0x2129, - 0x214e, 0x2176, 0x2197, 0x21bf, 0x21e1, 0x2206, 0x222b, 0x224d, - 0x2275, 0x228d, 0x22ca, 0x22ee, 0x2310, 0x2335, 0x236a, 0x238c, - 0x23b6, 0x23dd, 0x2417, 0x2435, 0x2447, 0x2466, 0x248b, 0x249a, - 0x24b9, 0x24d8, 0x24fa, 0x2525, -} // Size: 608 bytes - -const caRegionStr string = "" + // Size: 3167 bytes - "Illa de l’AscensióAndorraEmirats Àrabs UnitsAfganistanAntigua i BarbudaA" + - "nguillaAlbàniaArmèniaAngolaAntàrtidaArgentinaSamoa Nord-americanaÀustria" + - "AustràliaArubaIlles ÅlandAzerbaidjanBòsnia i HercegovinaBarbadosBangla D" + - "eshBèlgicaBurkina FasoBulgàriaBahrainBurundiBenínSaint BarthélemyBermude" + - "sBruneiBolíviaCarib NeerlandèsBrasilBahamesBhutanBouvetBotswanaBelarúsBe" + - "lizeCanadàIlles CocosCongo - KinshasaRepública CentreafricanaCongo - Bra" + - "zzavilleSuïssaCosta d’IvoriIlles CookXileCamerunXinaColòmbiaIlla Clipper" + - "tonCosta RicaCubaCap VerdCuraçaoIlla ChristmasXipreTxèquiaAlemanyaDiego " + - "GarciaDjiboutiDinamarcaDominicaRepública DominicanaAlgèriaCeuta i Melill" + - "aEquadorEstòniaEgipteSàhara OccidentalEritreaEspanyaEtiòpiaUnió EuropeaF" + - "inlàndiaFijiIlles MalvinesMicronèsiaIlles FèroeFrançaGabonRegne UnitGren" + - "adaGeòrgiaGuaiana FrancesaGuernseyGhanaGibraltarGrenlàndiaGàmbiaGuineaGu" + - "adeloupeGuinea EquatorialGrèciaIlles Geòrgia del Sud i Sandwich del SudG" + - "uatemalaGuamGuinea BissauGuyanaHong Kong (RAE Xina)Illa Heard i Illes Mc" + - "DonaldHonduresCroàciaHaitíHongriaIlles CanàriesIndonèsiaIrlandaIsraelIll" + - "a de ManÍndiaTerritori Britànic de l’Oceà ÍndicIraqIranIslàndiaItàliaJer" + - "seyJamaicaJordàniaJapóKenyaKirguizistanCambodjaKiribatiComoresSaint Chri" + - "stopher i NevisCorea del NordCorea del SudKuwaitIlles CaimanKazakhstanLa" + - "osLíbanSaint LuciaLiechtensteinSri LankaLibèriaLesothoLituàniaLuxemburgL" + - "etòniaLíbiaMarrocMònacoMoldàviaMontenegroSaint MartinMadagascarIlles Mar" + - "shallMacedòniaMaliMyanmar (Birmània)MongòliaMacau (RAE Xina)Illes Marian" + - "nes del NordMartinicaMauritàniaMontserratMaltaMauriciMaldivesMalawiMèxic" + - "MalàisiaMoçambicNamíbiaNova CaledòniaNígerNorfolkNigèriaNicaraguaPaïsos " + - "BaixosNoruegaNepalNauruNiueNova ZelandaOmanPanamàPerúPolinèsia FrancesaP" + - "apua Nova GuineaFilipinesPakistanPolòniaSaint-Pierre-et-MiquelonIlles Pi" + - "tcairnPuerto Ricoterritoris palestinsPortugalPalauParaguaiQatarTerritori" + - "s allunyats d’OceaniaIlla de la ReunióRomaniaSèrbiaRússiaRuandaAràbia Sa" + - "uditaIlles SalomóSeychellesSudanSuèciaSingapurSaint HelenaEslovèniaSvalb" + - "ard i Jan MayenEslovàquiaSierra LeoneSan MarinoSenegalSomàliaSurinamSuda" + - "n del SudSão Tomé i PríncipeEl SalvadorSint MaartenSíriaSwazilàndiaTrist" + - "ão da CunhaIlles Turks i CaicosTxadTerritoris Francesos del SudTogoTail" + - "àndiaTadjikistanTokelauTimor OrientalTurkmenistanTunísiaTongaTurquiaTri" + - "nitat i TobagoTuvaluTaiwanTanzàniaUcraïnaUgandaIlles Perifèriques Menors" + - " dels EUANacions UnidesEstats UnitsUruguaiUzbekistanCiutat del VaticàSai" + - "nt Vincent i les GrenadinesVeneçuelaIlles Verges BritàniquesIlles Verges" + - " Nord-americanesVietnamVanuatuWallis i FutunaSamoaKosovoIemenMayotteRepú" + - "blica de Sud-àfricaZàmbiaZimbàbueRegió desconegudaMónÀfricaAmèrica del N" + - "ordAmèrica del SudOceaniaÀfrica occidentalAmèrica CentralÀfrica oriental" + - "Àfrica septentrionalÀfrica centralÀfrica meridionalAmèricaAmèrica septe" + - "ntrionalCaribÀsia orientalÀsia meridionalÀsia sud-orientalEuropa meridio" + - "nalAustralàsiaMelanèsiaRegió de la MicronèsiaPolinèsiaÀsiaÀsia centralÀs" + - "ia occidentalEuropaEuropa orientalEuropa septentrionalEuropa occidentalA" + - "mèrica Llatina" - -var caRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0015, 0x001c, 0x0030, 0x003a, 0x004b, 0x0053, 0x005b, - 0x0063, 0x0069, 0x0073, 0x007c, 0x0090, 0x0098, 0x00a2, 0x00a7, - 0x00b3, 0x00be, 0x00d3, 0x00db, 0x00e6, 0x00ee, 0x00fa, 0x0103, - 0x010a, 0x0111, 0x0117, 0x0128, 0x0130, 0x0136, 0x013e, 0x014f, - 0x0155, 0x015c, 0x0162, 0x0168, 0x0170, 0x0178, 0x017e, 0x0185, - 0x0190, 0x01a0, 0x01b9, 0x01cc, 0x01d3, 0x01e2, 0x01ec, 0x01f0, - 0x01f7, 0x01fb, 0x0204, 0x0213, 0x021d, 0x0221, 0x0229, 0x0231, - 0x023f, 0x0244, 0x024c, 0x0254, 0x0260, 0x0268, 0x0271, 0x0279, - // Entry 40 - 7F - 0x028e, 0x0296, 0x02a5, 0x02ac, 0x02b4, 0x02ba, 0x02cc, 0x02d3, - 0x02da, 0x02e2, 0x02ef, 0x02ef, 0x02f9, 0x02fd, 0x030b, 0x0316, - 0x0322, 0x0329, 0x032e, 0x0338, 0x033f, 0x0347, 0x0357, 0x035f, - 0x0364, 0x036d, 0x0378, 0x037f, 0x0385, 0x038f, 0x03a0, 0x03a7, - 0x03d0, 0x03d9, 0x03dd, 0x03ea, 0x03f0, 0x0404, 0x041f, 0x0427, - 0x042f, 0x0435, 0x043c, 0x044b, 0x0455, 0x045c, 0x0462, 0x046d, - 0x0473, 0x049a, 0x049e, 0x04a2, 0x04ab, 0x04b2, 0x04b8, 0x04bf, - 0x04c8, 0x04cd, 0x04d2, 0x04de, 0x04e6, 0x04ee, 0x04f5, 0x050e, - // Entry 80 - BF - 0x051c, 0x0529, 0x052f, 0x053b, 0x0545, 0x0549, 0x054f, 0x055a, - 0x0567, 0x0570, 0x0578, 0x057f, 0x0588, 0x0591, 0x0599, 0x059f, - 0x05a5, 0x05ac, 0x05b5, 0x05bf, 0x05cb, 0x05d5, 0x05e3, 0x05ed, - 0x05f1, 0x0604, 0x060d, 0x061d, 0x0635, 0x063e, 0x0649, 0x0653, - 0x0658, 0x065f, 0x0667, 0x066d, 0x0673, 0x067c, 0x0685, 0x068d, - 0x069c, 0x06a2, 0x06a9, 0x06b1, 0x06ba, 0x06c8, 0x06cf, 0x06d4, - 0x06d9, 0x06dd, 0x06e9, 0x06ed, 0x06f4, 0x06f9, 0x070c, 0x071d, - 0x0726, 0x072e, 0x0736, 0x074e, 0x075c, 0x0767, 0x077b, 0x0783, - // Entry C0 - FF - 0x0788, 0x0790, 0x0795, 0x07b5, 0x07c7, 0x07ce, 0x07d5, 0x07dc, - 0x07e2, 0x07f1, 0x07fe, 0x0808, 0x080d, 0x0814, 0x081c, 0x0828, - 0x0832, 0x0846, 0x0851, 0x085d, 0x0867, 0x086e, 0x0876, 0x087d, - 0x088a, 0x08a0, 0x08ab, 0x08b7, 0x08bd, 0x08c9, 0x08da, 0x08ee, - 0x08f2, 0x090e, 0x0912, 0x091c, 0x0927, 0x092e, 0x093c, 0x0948, - 0x0950, 0x0955, 0x095c, 0x096d, 0x0973, 0x0979, 0x0982, 0x098a, - 0x0990, 0x09b3, 0x09c1, 0x09cd, 0x09d4, 0x09de, 0x09f0, 0x0a0e, - 0x0a18, 0x0a31, 0x0a4d, 0x0a54, 0x0a5b, 0x0a6a, 0x0a6f, 0x0a75, - // Entry 100 - 13F - 0x0a7a, 0x0a81, 0x0a9a, 0x0aa1, 0x0aaa, 0x0abc, 0x0ac0, 0x0ac7, - 0x0ad8, 0x0ae8, 0x0aef, 0x0b01, 0x0b11, 0x0b21, 0x0b36, 0x0b45, - 0x0b57, 0x0b5f, 0x0b75, 0x0b7a, 0x0b88, 0x0b98, 0x0baa, 0x0bbb, - 0x0bc7, 0x0bd1, 0x0be9, 0x0bf3, 0x0bf8, 0x0c05, 0x0c15, 0x0c1b, - 0x0c2a, 0x0c3e, 0x0c4f, 0x0c5f, -} // Size: 608 bytes - -const csRegionStr string = "" + // Size: 3208 bytes - "AscensionAndorraSpojené arabské emirátyAfghánistánAntigua a BarbudaAngui" + - "llaAlbánieArménieAngolaAntarktidaArgentinaAmerická SamoaRakouskoAustráli" + - "eArubaÅlandyÁzerbájdžánBosna a HercegovinaBarbadosBangladéšBelgieBurkina" + - " FasoBulharskoBahrajnBurundiBeninSvatý BartolomějBermudyBrunejBolívieKar" + - "ibské NizozemskoBrazílieBahamyBhútánBouvetův ostrovBotswanaBěloruskoBeli" + - "zeKanadaKokosové ostrovyKongo – KinshasaStředoafrická republikaKongo – B" + - "razzavilleŠvýcarskoPobřeží slonovinyCookovy ostrovyChileKamerunČínaKolum" + - "bieClippertonův ostrovKostarikaKubaKapverdyCuraçaoVánoční ostrovKyprČesk" + - "oNěmeckoDiego GarcíaDžibutskoDánskoDominikaDominikánská republikaAlžírsk" + - "oCeuta a MelillaEkvádorEstonskoEgyptZápadní SaharaEritreaŠpanělskoEtiopi" + - "eEvropská unieFinskoFidžiFalklandské ostrovyMikronésieFaerské ostrovyFra" + - "ncieGabonSpojené královstvíGrenadaGruzieFrancouzská GuyanaGuernseyGhanaG" + - "ibraltarGrónskoGambieGuineaGuadeloupeRovníková GuineaŘeckoJižní Georgie " + - "a Jižní Sandwichovy ostrovyGuatemalaGuamGuinea-BissauGuyanaHongkong – ZA" + - "O ČínyHeardův ostrov a McDonaldovy ostrovyHondurasChorvatskoHaitiMaďarsk" + - "oKanárské ostrovyIndonésieIrskoIzraelOstrov ManIndieBritské indickooceán" + - "ské územíIrákÍránIslandItálieJerseyJamajkaJordánskoJaponskoKeňaKyrgyzstá" + - "nKambodžaKiribatiKomorySvatý Kryštof a NevisSeverní KoreaJižní KoreaKuva" + - "jtKajmanské ostrovyKazachstánLaosLibanonSvatá LucieLichtenštejnskoSrí La" + - "nkaLibérieLesothoLitvaLucemburskoLotyšskoLibyeMarokoMonakoMoldavskoČerná" + - " HoraSvatý Martin (Francie)MadagaskarMarshallovy ostrovyMakedonieMaliMya" + - "nmar (Barma)MongolskoMacao – ZAO ČínySeverní MarianyMartinikMauritánieMo" + - "ntserratMaltaMauriciusMaledivyMalawiMexikoMalajsieMosambikNamibieNová Ka" + - "ledonieNigerNorfolkNigérieNikaraguaNizozemskoNorskoNepálNauruNiueNový Zé" + - "landOmánPanamaPeruFrancouzská PolynésiePapua-Nová GuineaFilipínyPákistán" + - "PolskoSaint-Pierre a MiquelonPitcairnovy ostrovyPortorikoPalestinská úze" + - "míPortugalskoPalauParaguayKatarVnější OceánieRéunionRumunskoSrbskoRuskoR" + - "wandaSaúdská ArábieŠalamounovy ostrovySeychelySúdánŠvédskoSingapurSvatá " + - "HelenaSlovinskoŠpicberky a Jan MayenSlovenskoSierra LeoneSan MarinoSeneg" + - "alSomálskoSurinamJižní SúdánSvatý Tomáš a Princův ostrovSalvadorSvatý Ma" + - "rtin (Nizozemsko)SýrieSvazijskoTristan da CunhaTurks a CaicosČadFrancouz" + - "ská jižní územíTogoThajskoTádžikistánTokelauVýchodní TimorTurkmenistánTu" + - "niskoTongaTureckoTrinidad a TobagoTuvaluTchaj-wanTanzanieUkrajinaUgandaM" + - "enší odlehlé ostrovy USAOSNSpojené státyUruguayUzbekistánVatikánSvatý Vi" + - "ncenc a GrenadinyVenezuelaBritské Panenské ostrovyAmerické Panenské ostr" + - "ovyVietnamVanuatuWallis a FutunaSamoaKosovoJemenMayotteJihoafrická repub" + - "likaZambieZimbabweNeznámá oblastSvětAfrikaSeverní AmerikaJižní AmerikaOc" + - "eánieZápadní AfrikaStřední AmerikaVýchodní AfrikaSeverní AfrikaStřední A" + - "frikaJižní AfrikaAmerikaSeverní Amerika (oblast)KaribikVýchodní AsieJižn" + - "í AsieJihovýchodní AsieJižní EvropaAustralasieMelanésieMikronésie (regi" + - "on)PolynésieAsieStřední AsieZápadní AsieEvropaVýchodní EvropaSeverní Evr" + - "opaZápadní EvropaLatinská Amerika" - -var csRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002a, 0x0037, 0x0048, 0x0050, 0x0058, - 0x0060, 0x0066, 0x0070, 0x0079, 0x0088, 0x0090, 0x009a, 0x009f, - 0x00a6, 0x00b5, 0x00c8, 0x00d0, 0x00db, 0x00e1, 0x00ed, 0x00f6, - 0x00fd, 0x0104, 0x0109, 0x011b, 0x0122, 0x0128, 0x0130, 0x0144, - 0x014d, 0x0153, 0x015b, 0x016b, 0x0173, 0x017d, 0x0183, 0x0189, - 0x019a, 0x01ac, 0x01c5, 0x01da, 0x01e5, 0x01f9, 0x0208, 0x020d, - 0x0214, 0x021a, 0x0222, 0x0236, 0x023f, 0x0243, 0x024b, 0x0253, - 0x0264, 0x0268, 0x026e, 0x0276, 0x0283, 0x028d, 0x0294, 0x029c, - // Entry 40 - 7F - 0x02b4, 0x02be, 0x02cd, 0x02d5, 0x02dd, 0x02e2, 0x02f2, 0x02f9, - 0x0304, 0x030b, 0x0319, 0x0319, 0x031f, 0x0325, 0x0339, 0x0344, - 0x0354, 0x035b, 0x0360, 0x0375, 0x037c, 0x0382, 0x0395, 0x039d, - 0x03a2, 0x03ab, 0x03b3, 0x03b9, 0x03bf, 0x03c9, 0x03db, 0x03e1, - 0x040e, 0x0417, 0x041b, 0x0428, 0x042e, 0x0445, 0x046a, 0x0472, - 0x047c, 0x0481, 0x048a, 0x049c, 0x04a6, 0x04ab, 0x04b1, 0x04bb, - 0x04c0, 0x04e2, 0x04e7, 0x04ed, 0x04f3, 0x04fa, 0x0500, 0x0507, - 0x0511, 0x0519, 0x051e, 0x0529, 0x0532, 0x053a, 0x0540, 0x0557, - // Entry 80 - BF - 0x0565, 0x0572, 0x0578, 0x058a, 0x0595, 0x0599, 0x05a0, 0x05ac, - 0x05bc, 0x05c6, 0x05ce, 0x05d5, 0x05da, 0x05e5, 0x05ee, 0x05f3, - 0x05f9, 0x05ff, 0x0608, 0x0614, 0x062b, 0x0635, 0x0648, 0x0651, - 0x0655, 0x0664, 0x066d, 0x0681, 0x0691, 0x0699, 0x06a4, 0x06ae, - 0x06b3, 0x06bc, 0x06c4, 0x06ca, 0x06d0, 0x06d8, 0x06e0, 0x06e7, - 0x06f6, 0x06fb, 0x0702, 0x070a, 0x0713, 0x071d, 0x0723, 0x0729, - 0x072e, 0x0732, 0x073f, 0x0744, 0x074a, 0x074e, 0x0765, 0x0777, - 0x0780, 0x078a, 0x0790, 0x07a7, 0x07ba, 0x07c3, 0x07d7, 0x07e2, - // Entry C0 - FF - 0x07e7, 0x07ef, 0x07f4, 0x0806, 0x080e, 0x0816, 0x081c, 0x0821, - 0x0827, 0x0838, 0x084c, 0x0854, 0x085b, 0x0864, 0x086c, 0x0879, - 0x0882, 0x0898, 0x08a1, 0x08ad, 0x08b7, 0x08be, 0x08c7, 0x08ce, - 0x08dd, 0x08fd, 0x0905, 0x091f, 0x0925, 0x092e, 0x093e, 0x094c, - 0x0950, 0x096c, 0x0970, 0x0977, 0x0985, 0x098c, 0x099c, 0x09a9, - 0x09b0, 0x09b5, 0x09bc, 0x09cd, 0x09d3, 0x09dc, 0x09e4, 0x09ec, - 0x09f2, 0x0a0e, 0x0a11, 0x0a20, 0x0a27, 0x0a32, 0x0a3a, 0x0a54, - 0x0a5d, 0x0a77, 0x0a92, 0x0a99, 0x0aa0, 0x0aaf, 0x0ab4, 0x0aba, - // Entry 100 - 13F - 0x0abf, 0x0ac6, 0x0adc, 0x0ae2, 0x0aea, 0x0afa, 0x0aff, 0x0b05, - 0x0b15, 0x0b24, 0x0b2c, 0x0b3c, 0x0b4d, 0x0b5e, 0x0b6d, 0x0b7d, - 0x0b8b, 0x0b92, 0x0bab, 0x0bb2, 0x0bc1, 0x0bcd, 0x0be0, 0x0bee, - 0x0bf9, 0x0c03, 0x0c17, 0x0c21, 0x0c25, 0x0c33, 0x0c41, 0x0c47, - 0x0c58, 0x0c67, 0x0c77, 0x0c88, -} // Size: 608 bytes - -const daRegionStr string = "" + // Size: 2960 bytes - "AscensionøenAndorraDe Forenede Arabiske EmiraterAfghanistanAntigua og Ba" + - "rbudaAnguillaAlbanienArmenienAngolaAntarktisArgentinaAmerikansk SamoaØst" + - "rigAustralienArubaÅlandAserbajdsjanBosnien-HercegovinaBarbadosBangladesh" + - "BelgienBurkina FasoBulgarienBahrainBurundiBeninSaint BarthélemyBermudaBr" + - "uneiBoliviaDe tidligere Nederlandske AntillerBrasilienBahamasBhutanBouve" + - "tøenBotswanaHvideruslandBelizeCanadaCocosøerneCongo-KinshasaDen Centrala" + - "frikanske RepublikCongo-BrazzavilleSchweizElfenbenskystenCookøerneChileC" + - "amerounKinaColombiaClippertonøenCosta RicaCubaKap VerdeCuraçaoJuleøenCyp" + - "ernTjekkietTysklandDiego GarciaDjiboutiDanmarkDominicaDen Dominikanske R" + - "epublikAlgerietCeuta og MelillaEcuadorEstlandEgyptenVestsaharaEritreaSpa" + - "nienEtiopienDen Europæiske UnionFinlandFijiFalklandsøerneMikronesiens Fo" + - "renede StaterFærøerneFrankrigGabonStorbritannienGrenadaGeorgienFransk Gu" + - "yanaGuernseyGhanaGibraltarGrønlandGambiaGuineaGuadeloupeÆkvatorialguinea" + - "GrækenlandSouth Georgia og De Sydlige SandwichøerGuatemalaGuamGuinea-Bis" + - "sauGuyanaSAR HongkongHeard Island og McDonald IslandsHondurasKroatienHai" + - "tiUngarnKanariske øerIndonesienIrlandIsraelIsle of ManIndienDet britiske" + - " territorium i Det Indiske OceanIrakIranIslandItalienJerseyJamaicaJordan" + - "JapanKenyaKirgisistanCambodjaKiribatiComorerneSaint Kitts og NevisNordko" + - "reaSydkoreaKuwaitCaymanøerneKasakhstanLaosLibanonSaint LuciaLiechtenstei" + - "nSri LankaLiberiaLesothoLitauenLuxembourgLetlandLibyenMarokkoMonacoMoldo" + - "vaMontenegroSaint MartinMadagaskarMarshalløerneMakedonienMaliMyanmar (Bu" + - "rma)MongolietSAR MacaoNordmarianerneMartiniqueMauretanienMontserratMalta" + - "MauritiusMaldiverneMalawiMexicoMalaysiaMozambiqueNamibiaNy KaledonienNig" + - "erNorfolk IslandNigeriaNicaraguaHollandNorgeNepalNauruNiueNew ZealandOma" + - "nPanamaPeruFransk PolynesienPapua Ny GuineaFilippinernePakistanPolenSain" + - "t Pierre og MiquelonPitcairnPuerto RicoDe palæstinensiske områderPortuga" + - "lPalauParaguayQatarYdre OceanienRéunionRumænienSerbienRuslandRwandaSaudi" + - "-ArabienSalomonøerneSeychellerneSudanSverigeSingaporeSt. HelenaSlovenien" + - "Svalbard og Jan MayenSlovakietSierra LeoneSan MarinoSenegalSomaliaSurina" + - "mSydsudanSão Tomé og PríncipeEl SalvadorSint MaartenSyrienSwazilandTrist" + - "an da CunhaTurks- og CaicosøerneTchadDe franske besiddelser i Det Sydlig" + - "e Indiske OceanTogoThailandTadsjikistanTokelauTimor-LesteTurkmenistanTun" + - "esienTongaTyrkietTrinidad og TobagoTuvaluTaiwanTanzaniaUkraineUgandaAmer" + - "ikanske oversøiske øerForenede NationerUSAUruguayUsbekistanVatikanstaten" + - "Saint Vincent og GrenadinerneVenezuelaDe Britiske JomfruøerDe Amerikansk" + - "e JomfruøerVietnamVanuatuWallis og FutunaSamoaKosovoYemenMayotteSydafrik" + - "aZambiaZimbabweUkendt områdeVerdenAfrikaNordamerikaSydamerikaOceanienVes" + - "tafrikaMellemamerikaØstafrikaNordafrikaCentralafrikaDet sydlige AfrikaAm" + - "erikaDet nordlige AmerikaCaribienØstasienSydasienSydøstasienSydeuropaAus" + - "tralasienMelanesienMikronesienPolynesienAsienCentralasienVestasienEuropa" + - "ØsteuropaNordeuropaVesteuropaLatinamerika" - -var daRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000d, 0x0014, 0x0031, 0x003c, 0x004e, 0x0056, 0x005e, - 0x0066, 0x006c, 0x0075, 0x007e, 0x008e, 0x0095, 0x009f, 0x00a4, - 0x00aa, 0x00b6, 0x00c9, 0x00d1, 0x00db, 0x00e2, 0x00ee, 0x00f7, - 0x00fe, 0x0105, 0x010a, 0x011b, 0x0122, 0x0128, 0x012f, 0x0151, - 0x015a, 0x0161, 0x0167, 0x0171, 0x0179, 0x0185, 0x018b, 0x0191, - 0x019c, 0x01aa, 0x01c8, 0x01d9, 0x01e0, 0x01ef, 0x01f9, 0x01fe, - 0x0206, 0x020a, 0x0212, 0x0220, 0x022a, 0x022e, 0x0237, 0x023f, - 0x0247, 0x024d, 0x0255, 0x025d, 0x0269, 0x0271, 0x0278, 0x0280, - // Entry 40 - 7F - 0x0299, 0x02a1, 0x02b1, 0x02b8, 0x02bf, 0x02c6, 0x02d0, 0x02d7, - 0x02de, 0x02e6, 0x02fb, 0x02fb, 0x0302, 0x0306, 0x0315, 0x0331, - 0x033b, 0x0343, 0x0348, 0x0356, 0x035d, 0x0365, 0x0372, 0x037a, - 0x037f, 0x0388, 0x0391, 0x0397, 0x039d, 0x03a7, 0x03b8, 0x03c3, - 0x03eb, 0x03f4, 0x03f8, 0x0405, 0x040b, 0x0417, 0x0437, 0x043f, - 0x0447, 0x044c, 0x0452, 0x0460, 0x046a, 0x0470, 0x0476, 0x0481, - 0x0487, 0x04b3, 0x04b7, 0x04bb, 0x04c1, 0x04c8, 0x04ce, 0x04d5, - 0x04db, 0x04e0, 0x04e5, 0x04f0, 0x04f8, 0x0500, 0x0509, 0x051d, - // Entry 80 - BF - 0x0526, 0x052e, 0x0534, 0x0540, 0x054a, 0x054e, 0x0555, 0x0560, - 0x056d, 0x0576, 0x057d, 0x0584, 0x058b, 0x0595, 0x059c, 0x05a2, - 0x05a9, 0x05af, 0x05b6, 0x05c0, 0x05cc, 0x05d6, 0x05e4, 0x05ee, - 0x05f2, 0x0601, 0x060a, 0x0613, 0x0621, 0x062b, 0x0636, 0x0640, - 0x0645, 0x064e, 0x0658, 0x065e, 0x0664, 0x066c, 0x0676, 0x067d, - 0x068a, 0x068f, 0x069d, 0x06a4, 0x06ad, 0x06b4, 0x06b9, 0x06be, - 0x06c3, 0x06c7, 0x06d2, 0x06d6, 0x06dc, 0x06e0, 0x06f1, 0x0700, - 0x070c, 0x0714, 0x0719, 0x0731, 0x0739, 0x0744, 0x0760, 0x0768, - // Entry C0 - FF - 0x076d, 0x0775, 0x077a, 0x0787, 0x078f, 0x0798, 0x079f, 0x07a6, - 0x07ac, 0x07b9, 0x07c6, 0x07d2, 0x07d7, 0x07de, 0x07e7, 0x07f1, - 0x07fa, 0x080f, 0x0818, 0x0824, 0x082e, 0x0835, 0x083c, 0x0843, - 0x084b, 0x0862, 0x086d, 0x0879, 0x087f, 0x0888, 0x0898, 0x08ae, - 0x08b3, 0x08e5, 0x08e9, 0x08f1, 0x08fd, 0x0904, 0x090f, 0x091b, - 0x0923, 0x0928, 0x092f, 0x0941, 0x0947, 0x094d, 0x0955, 0x095c, - 0x0962, 0x097e, 0x098f, 0x0992, 0x0999, 0x09a3, 0x09b0, 0x09cd, - 0x09d6, 0x09ec, 0x0a05, 0x0a0c, 0x0a13, 0x0a23, 0x0a28, 0x0a2e, - // Entry 100 - 13F - 0x0a33, 0x0a3a, 0x0a43, 0x0a49, 0x0a51, 0x0a5f, 0x0a65, 0x0a6b, - 0x0a76, 0x0a80, 0x0a88, 0x0a92, 0x0a9f, 0x0aa9, 0x0ab3, 0x0ac0, - 0x0ad2, 0x0ad9, 0x0aed, 0x0af5, 0x0afe, 0x0b06, 0x0b12, 0x0b1b, - 0x0b27, 0x0b31, 0x0b3c, 0x0b46, 0x0b4b, 0x0b57, 0x0b60, 0x0b66, - 0x0b70, 0x0b7a, 0x0b84, 0x0b90, -} // Size: 608 bytes - -const deRegionStr string = "" + // Size: 3075 bytes - "AscensionAndorraVereinigte Arabische EmirateAfghanistanAntigua und Barbu" + - "daAnguillaAlbanienArmenienAngolaAntarktisArgentinienAmerikanisch-SamoaÖs" + - "terreichAustralienArubaÅlandinselnAserbaidschanBosnien und HerzegowinaBa" + - "rbadosBangladeschBelgienBurkina FasoBulgarienBahrainBurundiBeninSt. Bart" + - "hélemyBermudaBrunei DarussalamBolivienBonaire, Sint Eustatius und SabaBr" + - "asilienBahamasBhutanBouvetinselBotsuanaBelarusBelizeKanadaKokosinselnKon" + - "go-KinshasaZentralafrikanische RepublikKongo-BrazzavilleSchweizCôte d’Iv" + - "oireCookinselnChileKamerunChinaKolumbienClipperton-InselCosta RicaKubaCa" + - "bo VerdeCuraçaoWeihnachtsinselZypernTschechienDeutschlandDiego GarciaDsc" + - "hibutiDänemarkDominicaDominikanische RepublikAlgerienCeuta und MelillaEc" + - "uadorEstlandÄgyptenWestsaharaEritreaSpanienÄthiopienEuropäische UnionFin" + - "nlandFidschiFalklandinselnMikronesienFäröerFrankreichGabunVereinigtes Kö" + - "nigreichGrenadaGeorgienFranzösisch-GuayanaGuernseyGhanaGibraltarGrönland" + - "GambiaGuineaGuadeloupeÄquatorialguineaGriechenlandSüdgeorgien und die Sü" + - "dlichen SandwichinselnGuatemalaGuamGuinea-BissauGuyanaSonderverwaltungsz" + - "one HongkongHeard und McDonaldinselnHondurasKroatienHaitiUngarnKanarisch" + - "e InselnIndonesienIrlandIsraelIsle of ManIndienBritisches Territorium im" + - " Indischen OzeanIrakIranIslandItalienJerseyJamaikaJordanienJapanKeniaKir" + - "gisistanKambodschaKiribatiKomorenSt. Kitts und NevisNordkoreaSüdkoreaKuw" + - "aitKaimaninselnKasachstanLaosLibanonSt. LuciaLiechtensteinSri LankaLiber" + - "iaLesothoLitauenLuxemburgLettlandLibyenMarokkoMonacoRepublik MoldauMonte" + - "negroSt. MartinMadagaskarMarshallinselnMazedonienMaliMyanmarMongoleiSond" + - "erverwaltungsregion MacauNördliche MarianenMartiniqueMauretanienMontserr" + - "atMaltaMauritiusMaledivenMalawiMexikoMalaysiaMosambikNamibiaNeukaledonie" + - "nNigerNorfolkinselNigeriaNicaraguaNiederlandeNorwegenNepalNauruNiueNeuse" + - "elandOmanPanamaPeruFranzösisch-PolynesienPapua-NeuguineaPhilippinenPakis" + - "tanPolenSt. Pierre und MiquelonPitcairninselnPuerto RicoPalästinensische" + - " AutonomiegebietePortugalPalauParaguayKatarÄußeres OzeanienRéunionRumäni" + - "enSerbienRusslandRuandaSaudi-ArabienSalomonenSeychellenSudanSchwedenSing" + - "apurSt. HelenaSlowenienSpitzbergenSlowakeiSierra LeoneSan MarinoSenegalS" + - "omaliaSurinameSüdsudanSão Tomé und PríncipeEl SalvadorSint MaartenSyrien" + - "SwasilandTristan da CunhaTurks- und CaicosinselnTschadFranzösische Süd- " + - "und AntarktisgebieteTogoThailandTadschikistanTokelauOsttimorTurkmenistan" + - "TunesienTongaTürkeiTrinidad und TobagoTuvaluTaiwanTansaniaUkraineUgandaA" + - "merikanische ÜberseeinselnVereinte NationenVereinigte StaatenUruguayUsbe" + - "kistanVatikanstadtSt. Vincent und die GrenadinenVenezuelaBritische Jungf" + - "erninselnAmerikanische JungferninselnVietnamVanuatuWallis und FutunaSamo" + - "aKosovoJemenMayotteSüdafrikaSambiaSimbabweUnbekannte RegionWeltAfrikaNor" + - "damerikaSüdamerikaOzeanienWestafrikaMittelamerikaOstafrikaNordafrikaZent" + - "ralafrikaSüdliches AfrikaAmerikaNördliches AmerikaKaribikOstasienSüdasie" + - "nSüdostasienSüdeuropaAustralasienMelanesienMikronesisches InselgebietPol" + - "ynesienAsienZentralasienWestasienEuropaOsteuropaNordeuropaWesteuropaLate" + - "inamerika" - -var deRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002c, 0x0037, 0x004a, 0x0052, 0x005a, - 0x0062, 0x0068, 0x0071, 0x007c, 0x008e, 0x0099, 0x00a3, 0x00a8, - 0x00b4, 0x00c1, 0x00d8, 0x00e0, 0x00eb, 0x00f2, 0x00fe, 0x0107, - 0x010e, 0x0115, 0x011a, 0x0129, 0x0130, 0x0141, 0x0149, 0x0169, - 0x0172, 0x0179, 0x017f, 0x018a, 0x0192, 0x0199, 0x019f, 0x01a5, - 0x01b0, 0x01be, 0x01da, 0x01eb, 0x01f2, 0x0202, 0x020c, 0x0211, - 0x0218, 0x021d, 0x0226, 0x0236, 0x0240, 0x0244, 0x024e, 0x0256, - 0x0265, 0x026b, 0x0275, 0x0280, 0x028c, 0x0295, 0x029e, 0x02a6, - // Entry 40 - 7F - 0x02bd, 0x02c5, 0x02d6, 0x02dd, 0x02e4, 0x02ec, 0x02f6, 0x02fd, - 0x0304, 0x030e, 0x0320, 0x0320, 0x0328, 0x032f, 0x033d, 0x0348, - 0x0350, 0x035a, 0x035f, 0x0376, 0x037d, 0x0385, 0x0399, 0x03a1, - 0x03a6, 0x03af, 0x03b8, 0x03be, 0x03c4, 0x03ce, 0x03df, 0x03eb, - 0x0419, 0x0422, 0x0426, 0x0433, 0x0439, 0x0457, 0x046f, 0x0477, - 0x047f, 0x0484, 0x048a, 0x049b, 0x04a5, 0x04ab, 0x04b1, 0x04bc, - 0x04c2, 0x04eb, 0x04ef, 0x04f3, 0x04f9, 0x0500, 0x0506, 0x050d, - 0x0516, 0x051b, 0x0520, 0x052b, 0x0535, 0x053d, 0x0544, 0x0557, - // Entry 80 - BF - 0x0560, 0x0569, 0x056f, 0x057b, 0x0585, 0x0589, 0x0590, 0x0599, - 0x05a6, 0x05af, 0x05b6, 0x05bd, 0x05c4, 0x05cd, 0x05d5, 0x05db, - 0x05e2, 0x05e8, 0x05f7, 0x0601, 0x060b, 0x0615, 0x0623, 0x062d, - 0x0631, 0x0638, 0x0640, 0x065d, 0x0670, 0x067a, 0x0685, 0x068f, - 0x0694, 0x069d, 0x06a6, 0x06ac, 0x06b2, 0x06ba, 0x06c2, 0x06c9, - 0x06d6, 0x06db, 0x06e7, 0x06ee, 0x06f7, 0x0702, 0x070a, 0x070f, - 0x0714, 0x0718, 0x0722, 0x0726, 0x072c, 0x0730, 0x0747, 0x0756, - 0x0761, 0x0769, 0x076e, 0x0785, 0x0793, 0x079e, 0x07c0, 0x07c8, - // Entry C0 - FF - 0x07cd, 0x07d5, 0x07da, 0x07ec, 0x07f4, 0x07fd, 0x0804, 0x080c, - 0x0812, 0x081f, 0x0828, 0x0832, 0x0837, 0x083f, 0x0847, 0x0851, - 0x085a, 0x0865, 0x086d, 0x0879, 0x0883, 0x088a, 0x0891, 0x0899, - 0x08a2, 0x08ba, 0x08c5, 0x08d1, 0x08d7, 0x08e0, 0x08f0, 0x0907, - 0x090d, 0x0935, 0x0939, 0x0941, 0x094e, 0x0955, 0x095d, 0x0969, - 0x0971, 0x0976, 0x097d, 0x0990, 0x0996, 0x099c, 0x09a4, 0x09ab, - 0x09b1, 0x09cd, 0x09de, 0x09f0, 0x09f7, 0x0a01, 0x0a0d, 0x0a2b, - 0x0a34, 0x0a4c, 0x0a68, 0x0a6f, 0x0a76, 0x0a87, 0x0a8c, 0x0a92, - // Entry 100 - 13F - 0x0a97, 0x0a9e, 0x0aa8, 0x0aae, 0x0ab6, 0x0ac7, 0x0acb, 0x0ad1, - 0x0adc, 0x0ae7, 0x0aef, 0x0af9, 0x0b06, 0x0b0f, 0x0b19, 0x0b26, - 0x0b37, 0x0b3e, 0x0b51, 0x0b58, 0x0b60, 0x0b69, 0x0b75, 0x0b7f, - 0x0b8b, 0x0b95, 0x0baf, 0x0bb9, 0x0bbe, 0x0bca, 0x0bd3, 0x0bd9, - 0x0be2, 0x0bec, 0x0bf6, 0x0c03, -} // Size: 608 bytes - -const elRegionStr string = "" + // Size: 6223 bytes - "Νήσος ΑσενσιόνΑνδόραΗνωμένα Αραβικά ΕμιράταΑφγανιστάνΑντίγκουα και Μπαρμ" + - "πούνταΑνγκουίλαΑλβανίαΑρμενίαΑνγκόλαΑνταρκτικήΑργεντινήΑμερικανική Σαμό" + - "αΑυστρίαΑυστραλίαΑρούμπαΝήσοι ΌλαντΑζερμπαϊτζάνΒοσνία - ΕρζεγοβίνηΜπαρμ" + - "πάντοςΜπανγκλαντέςΒέλγιοΜπουρκίνα ΦάσοΒουλγαρίαΜπαχρέινΜπουρούντιΜπενίν" + - "Άγιος ΒαρθολομαίοςΒερμούδεςΜπρουνέιΒολιβίαΟλλανδία ΚαραϊβικήςΒραζιλίαΜπ" + - "αχάμεςΜπουτάνΝήσος ΜπουβέΜποτσουάναΛευκορωσίαΜπελίζΚαναδάςΝήσοι Κόκος (" + - "Κίλινγκ)Κονγκό - ΚινσάσαΚεντροαφρικανική ΔημοκρατίαΚονγκό - ΜπραζαβίλΕλ" + - "βετίαΑκτή ΕλεφαντοστούΝήσοι ΚουκΧιλήΚαμερούνΚίναΚολομβίαΝήσος Κλίπερτον" + - "Κόστα ΡίκαΚούβαΠράσινο ΑκρωτήριοΚουρασάοΝήσος των ΧριστουγέννωνΚύπροςΤσ" + - "εχίαΓερμανίαΝτιέγκο ΓκαρσίαΤζιμπουτίΔανίαΝτομίνικαΔομινικανή Δημοκρατία" + - "ΑλγερίαΘεούτα και ΜελίλαΕκουαδόρΕσθονίαΑίγυπτοςΔυτική ΣαχάραΕρυθραίαΙσπ" + - "ανίαΑιθιοπίαΕυρωπαϊκή ΈνωσηΦινλανδίαΦίτζιΝήσοι ΦόκλαντΜικρονησίαΝήσοι Φ" + - "ερόεςΓαλλίαΓκαμπόνΗνωμένο ΒασίλειοΓρενάδαΓεωργίαΓαλλική ΓουιάναΓκέρνζιΓ" + - "κάναΓιβραλτάρΓροιλανδίαΓκάμπιαΓουινέαΓουαδελούπηΙσημερινή ΓουινέαΕλλάδα" + - "Νήσοι Νότια Γεωργία και Νότιες ΣάντουιτςΓουατεμάλαΓκουάμΓουινέα Μπισάου" + - "ΓουιάναΧονγκ Κονγκ ΕΔΠ ΚίναςΝήσοι Χερντ και ΜακντόναλντΟνδούραΚροατίαΑϊ" + - "τήΟυγγαρίαΚανάριοι ΝήσοιΙνδονησίαΙρλανδίαΙσραήλΝήσος ΜανΙνδίαΒρετανικά " + - "Εδάφη Ινδικού ΩκεανούΙράκΙράνΙσλανδίαΙταλίαΤζέρζιΤζαμάικαΙορδανίαΙαπωνί" + - "αΚένυαΚιργιστάνΚαμπότζηΚιριμπάτιΚομόρεςΆγιος Χριστόφορος και ΝέβιςΒόρει" + - "α ΚορέαΝότια ΚορέαΚουβέιτΝήσοι ΚάιμανΚαζακστάνΛάοςΛίβανοςΑγία ΛουκίαΛιχ" + - "τενστάινΣρι ΛάνκαΛιβερίαΛεσότοΛιθουανίαΛουξεμβούργοΛετονίαΛιβύηΜαρόκοΜο" + - "νακόΜολδαβίαΜαυροβούνιοΆγιος Μαρτίνος (Γαλλικό τμήμα)ΜαδαγασκάρηΝήσοι Μ" + - "άρσαλΠρώην Γιουγκοσλαβική Δημοκρατία της ΜακεδονίαςΜάλιΜιανμάρ/Βιρμανία" + - "ΜογγολίαΜακάο ΕΔΠ ΚίναςΝήσοι Βόρειες ΜαριάνεςΜαρτινίκαΜαυριτανίαΜονσερά" + - "τΜάλταΜαυρίκιοςΜαλδίβεςΜαλάουιΜεξικόΜαλαισίαΜοζαμβίκηΝαμίμπιαΝέα Καληδο" + - "νίαΝίγηραςΝήσος ΝόρφολκΝιγηρίαΝικαράγουαΟλλανδίαΝορβηγίαΝεπάλΝαουρούΝιο" + - "ύεΝέα ΖηλανδίαΟμάνΠαναμάςΠερούΓαλλική ΠολυνησίαΠαπούα Νέα ΓουινέαΦιλιππ" + - "ίνεςΠακιστάνΠολωνίαΣεν Πιερ και ΜικελόνΝήσοι ΠίτκερνΠουέρτο ΡίκοΠαλαιστ" + - "ινιακά ΕδάφηΠορτογαλίαΠαλάουΠαραγουάηΚατάρΠεριφερειακή ΩκεανίαΡεϊνιόνΡο" + - "υμανίαΣερβίαΡωσίαΡουάνταΣαουδική ΑραβίαΝήσοι ΣολομώντοςΣεϋχέλλεςΣουδάνΣ" + - "ουηδίαΣιγκαπούρηΑγία ΕλένηΣλοβενίαΣβάλμπαρντ και Γιαν ΜαγιένΣλοβακίαΣιέ" + - "ρα ΛεόνεΆγιος ΜαρίνοςΣενεγάληΣομαλίαΣουρινάμΝότιο ΣουδάνΣάο Τομέ και Πρ" + - "ίνσιπεΕλ ΣαλβαδόρΆγιος Μαρτίνος (Ολλανδικό τμήμα)ΣυρίαΣουαζιλάνδηΤριστά" + - "ν ντα ΚούνιαΝήσοι Τερκ και ΚάικοςΤσαντΓαλλικές περιοχές του νοτίου ημισ" + - "φαιρίουΤόγκοΤαϊλάνδηΤατζικιστάνΤοκελάουΤιμόρ-ΛέστεΤουρκμενιστάνΤυνησίαΤ" + - "όνγκαΤουρκίαΤρινιντάντ και ΤομπάγκοΤουβαλούΤαϊβάνΤανζανίαΟυκρανίαΟυγκάν" + - "ταΑπομακρυσμένες Νησίδες ΗΠΑΗνωμένα ΈθνηΗνωμένες ΠολιτείεςΟυρουγουάηΟυζ" + - "μπεκιστάνΒατικανόΆγιος Βικέντιος και ΓρεναδίνεςΒενεζουέλαΒρετανικές Παρ" + - "θένοι ΝήσοιΑμερικανικές Παρθένοι ΝήσοιΒιετνάμΒανουάτουΟυάλις και Φουτού" + - "ναΣαμόαΚόσοβοΥεμένηΜαγιότΝότια ΑφρικήΖάμπιαΖιμπάμπουεΆγνωστη περιοχήΚόσ" + - "μοςΑφρικήΒόρεια ΑμερικήΝότια ΑμερικήΩκεανίαΔυτική ΑφρικήΚεντρική Αμερικ" + - "ήΑνατολική ΑφρικήΒόρεια ΑφρικήΜέση ΑφρικήΝότιος ΑφρικήΑμερικήΒόρειος Αμ" + - "ερικήΚαραϊβικήΑνατολική ΑσίαΝότια ΑσίαΝοτιοανατολική ΑσίαΝότια ΕυρώπηΑυ" + - "στραλασίαΜελανησίαΠεριοχή ΜικρονησίαςΠολυνησίαΑσίαΚεντρική ΑσίαΔυτική Α" + - "σίαΕυρώπηΑνατολική ΕυρώπηΒόρεια ΕυρώπηΔυτική ΕυρώπηΛατινική Αμερική" - -var elRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001b, 0x0027, 0x0053, 0x0067, 0x0097, 0x00a9, 0x00b7, - 0x00c5, 0x00d3, 0x00e7, 0x00f9, 0x011a, 0x0128, 0x013a, 0x0148, - 0x015d, 0x0175, 0x0198, 0x01ae, 0x01c6, 0x01d2, 0x01ed, 0x01ff, - 0x020f, 0x0223, 0x022f, 0x0252, 0x0264, 0x0274, 0x0282, 0x02a7, - 0x02b7, 0x02c7, 0x02d5, 0x02ec, 0x0300, 0x0314, 0x0320, 0x032e, - 0x0354, 0x0371, 0x03a6, 0x03c7, 0x03d5, 0x03f6, 0x0409, 0x0411, - 0x0421, 0x0429, 0x0439, 0x0456, 0x0469, 0x0473, 0x0494, 0x04a4, - 0x04d0, 0x04dc, 0x04e8, 0x04f8, 0x0515, 0x0527, 0x0531, 0x0543, - // Entry 40 - 7F - 0x056c, 0x057a, 0x059a, 0x05aa, 0x05b8, 0x05c8, 0x05e1, 0x05f1, - 0x05ff, 0x060f, 0x062c, 0x062c, 0x063e, 0x0648, 0x0661, 0x0675, - 0x068c, 0x0698, 0x06a6, 0x06c5, 0x06d3, 0x06e1, 0x06fe, 0x070c, - 0x0716, 0x0728, 0x073c, 0x074a, 0x0758, 0x076e, 0x078f, 0x079b, - 0x07e6, 0x07fa, 0x0806, 0x0823, 0x0831, 0x0858, 0x088b, 0x0899, - 0x08a7, 0x08af, 0x08bf, 0x08da, 0x08ec, 0x08fc, 0x0908, 0x0919, - 0x0923, 0x095e, 0x0966, 0x096e, 0x097e, 0x098a, 0x0996, 0x09a6, - 0x09b6, 0x09c4, 0x09ce, 0x09e0, 0x09f0, 0x0a02, 0x0a10, 0x0a43, - // Entry 80 - BF - 0x0a5a, 0x0a6f, 0x0a7d, 0x0a94, 0x0aa6, 0x0aae, 0x0abc, 0x0ad1, - 0x0ae7, 0x0af8, 0x0b06, 0x0b12, 0x0b24, 0x0b3c, 0x0b4a, 0x0b54, - 0x0b60, 0x0b6c, 0x0b7c, 0x0b92, 0x0bc9, 0x0bdf, 0x0bf6, 0x0c4e, - 0x0c56, 0x0c75, 0x0c85, 0x0ca1, 0x0ccb, 0x0cdd, 0x0cf1, 0x0d01, - 0x0d0b, 0x0d1d, 0x0d2d, 0x0d3b, 0x0d47, 0x0d57, 0x0d69, 0x0d79, - 0x0d92, 0x0da0, 0x0db9, 0x0dc7, 0x0ddb, 0x0deb, 0x0dfb, 0x0e05, - 0x0e13, 0x0e1d, 0x0e34, 0x0e3c, 0x0e4a, 0x0e54, 0x0e75, 0x0e97, - 0x0eab, 0x0ebb, 0x0ec9, 0x0eee, 0x0f07, 0x0f1e, 0x0f43, 0x0f57, - // Entry C0 - FF - 0x0f63, 0x0f75, 0x0f7f, 0x0fa6, 0x0fb4, 0x0fc4, 0x0fd0, 0x0fda, - 0x0fe8, 0x1005, 0x1024, 0x1036, 0x1042, 0x1050, 0x1064, 0x1077, - 0x1087, 0x10b8, 0x10c8, 0x10dd, 0x10f6, 0x1106, 0x1114, 0x1124, - 0x113b, 0x1162, 0x1177, 0x11b2, 0x11bc, 0x11d2, 0x11f4, 0x121b, - 0x1225, 0x1271, 0x127b, 0x128b, 0x12a1, 0x12b1, 0x12c6, 0x12e0, - 0x12ee, 0x12fa, 0x1308, 0x1334, 0x1344, 0x1350, 0x1360, 0x1370, - 0x1380, 0x13b2, 0x13c9, 0x13ec, 0x1400, 0x1418, 0x1428, 0x1461, - 0x1475, 0x14a5, 0x14d9, 0x14e7, 0x14f9, 0x151d, 0x1527, 0x1533, - // Entry 100 - 13F - 0x153f, 0x154b, 0x1562, 0x156e, 0x1582, 0x159f, 0x15ab, 0x15b7, - 0x15d2, 0x15eb, 0x15f9, 0x1612, 0x1631, 0x1650, 0x1669, 0x167e, - 0x1697, 0x16a5, 0x16c2, 0x16d4, 0x16ef, 0x1702, 0x1727, 0x173e, - 0x1754, 0x1766, 0x178b, 0x179d, 0x17a5, 0x17be, 0x17d3, 0x17df, - 0x17fe, 0x1817, 0x1830, 0x184f, -} // Size: 608 bytes - -const enRegionStr string = "" + // Size: 2935 bytes - "Ascension IslandAndorraUnited Arab EmiratesAfghanistanAntigua & BarbudaA" + - "nguillaAlbaniaArmeniaAngolaAntarcticaArgentinaAmerican SamoaAustriaAustr" + - "aliaArubaÅland IslandsAzerbaijanBosnia & HerzegovinaBarbadosBangladeshBe" + - "lgiumBurkina FasoBulgariaBahrainBurundiBeninSt. BarthélemyBermudaBruneiB" + - "oliviaCaribbean NetherlandsBrazilBahamasBhutanBouvet IslandBotswanaBelar" + - "usBelizeCanadaCocos (Keeling) IslandsCongo - KinshasaCentral African Rep" + - "ublicCongo - BrazzavilleSwitzerlandCôte d’IvoireCook IslandsChileCameroo" + - "nChinaColombiaClipperton IslandCosta RicaCubaCape VerdeCuraçaoChristmas " + - "IslandCyprusCzechiaGermanyDiego GarciaDjiboutiDenmarkDominicaDominican R" + - "epublicAlgeriaCeuta & MelillaEcuadorEstoniaEgyptWestern SaharaEritreaSpa" + - "inEthiopiaEuropean UnionEurozoneFinlandFijiFalkland IslandsMicronesiaFar" + - "oe IslandsFranceGabonUnited KingdomGrenadaGeorgiaFrench GuianaGuernseyGh" + - "anaGibraltarGreenlandGambiaGuineaGuadeloupeEquatorial GuineaGreeceSouth " + - "Georgia & South Sandwich IslandsGuatemalaGuamGuinea-BissauGuyanaHong Kon" + - "g SAR ChinaHeard & McDonald IslandsHondurasCroatiaHaitiHungaryCanary Isl" + - "andsIndonesiaIrelandIsraelIsle of ManIndiaBritish Indian Ocean Territory" + - "IraqIranIcelandItalyJerseyJamaicaJordanJapanKenyaKyrgyzstanCambodiaKirib" + - "atiComorosSt. Kitts & NevisNorth KoreaSouth KoreaKuwaitCayman IslandsKaz" + - "akhstanLaosLebanonSt. LuciaLiechtensteinSri LankaLiberiaLesothoLithuania" + - "LuxembourgLatviaLibyaMoroccoMonacoMoldovaMontenegroSt. MartinMadagascarM" + - "arshall IslandsMacedoniaMaliMyanmar (Burma)MongoliaMacau SAR ChinaNorthe" + - "rn Mariana IslandsMartiniqueMauritaniaMontserratMaltaMauritiusMaldivesMa" + - "lawiMexicoMalaysiaMozambiqueNamibiaNew CaledoniaNigerNorfolk IslandNiger" + - "iaNicaraguaNetherlandsNorwayNepalNauruNiueNew ZealandOmanPanamaPeruFrenc" + - "h PolynesiaPapua New GuineaPhilippinesPakistanPolandSt. Pierre & Miquelo" + - "nPitcairn IslandsPuerto RicoPalestinian TerritoriesPortugalPalauParaguay" + - "QatarOutlying OceaniaRéunionRomaniaSerbiaRussiaRwandaSaudi ArabiaSolomon" + - " IslandsSeychellesSudanSwedenSingaporeSt. HelenaSloveniaSvalbard & Jan M" + - "ayenSlovakiaSierra LeoneSan MarinoSenegalSomaliaSurinameSouth SudanSão T" + - "omé & PríncipeEl SalvadorSint MaartenSyriaSwazilandTristan da CunhaTurks" + - " & Caicos IslandsChadFrench Southern TerritoriesTogoThailandTajikistanTo" + - "kelauTimor-LesteTurkmenistanTunisiaTongaTurkeyTrinidad & TobagoTuvaluTai" + - "wanTanzaniaUkraineUgandaU.S. Outlying IslandsUnited NationsUnited States" + - "UruguayUzbekistanVatican CitySt. Vincent & GrenadinesVenezuelaBritish Vi" + - "rgin IslandsU.S. Virgin IslandsVietnamVanuatuWallis & FutunaSamoaKosovoY" + - "emenMayotteSouth AfricaZambiaZimbabweUnknown RegionWorldAfricaNorth Amer" + - "icaSouth AmericaOceaniaWestern AfricaCentral AmericaEastern AfricaNorthe" + - "rn AfricaMiddle AfricaSouthern AfricaAmericasNorthern AmericaCaribbeanEa" + - "stern AsiaSouthern AsiaSoutheast AsiaSouthern EuropeAustralasiaMelanesia" + - "Micronesian RegionPolynesiaAsiaCentral AsiaWestern AsiaEuropeEastern Eur" + - "opeNorthern EuropeWestern EuropeLatin America" - -var enRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0017, 0x002b, 0x0036, 0x0047, 0x004f, 0x0056, - 0x005d, 0x0063, 0x006d, 0x0076, 0x0084, 0x008b, 0x0094, 0x0099, - 0x00a7, 0x00b1, 0x00c5, 0x00cd, 0x00d7, 0x00de, 0x00ea, 0x00f2, - 0x00f9, 0x0100, 0x0105, 0x0114, 0x011b, 0x0121, 0x0128, 0x013d, - 0x0143, 0x014a, 0x0150, 0x015d, 0x0165, 0x016c, 0x0172, 0x0178, - 0x018f, 0x019f, 0x01b7, 0x01ca, 0x01d5, 0x01e5, 0x01f1, 0x01f6, - 0x01fe, 0x0203, 0x020b, 0x021c, 0x0226, 0x022a, 0x0234, 0x023c, - 0x024c, 0x0252, 0x0259, 0x0260, 0x026c, 0x0274, 0x027b, 0x0283, - // Entry 40 - 7F - 0x0295, 0x029c, 0x02ab, 0x02b2, 0x02b9, 0x02be, 0x02cc, 0x02d3, - 0x02d8, 0x02e0, 0x02ee, 0x02f6, 0x02fd, 0x0301, 0x0311, 0x031b, - 0x0328, 0x032e, 0x0333, 0x0341, 0x0348, 0x034f, 0x035c, 0x0364, - 0x0369, 0x0372, 0x037b, 0x0381, 0x0387, 0x0391, 0x03a2, 0x03a8, - 0x03ce, 0x03d7, 0x03db, 0x03e8, 0x03ee, 0x0401, 0x0419, 0x0421, - 0x0428, 0x042d, 0x0434, 0x0442, 0x044b, 0x0452, 0x0458, 0x0463, - 0x0468, 0x0486, 0x048a, 0x048e, 0x0495, 0x049a, 0x04a0, 0x04a7, - 0x04ad, 0x04b2, 0x04b7, 0x04c1, 0x04c9, 0x04d1, 0x04d8, 0x04e9, - // Entry 80 - BF - 0x04f4, 0x04ff, 0x0505, 0x0513, 0x051d, 0x0521, 0x0528, 0x0531, - 0x053e, 0x0547, 0x054e, 0x0555, 0x055e, 0x0568, 0x056e, 0x0573, - 0x057a, 0x0580, 0x0587, 0x0591, 0x059b, 0x05a5, 0x05b5, 0x05be, - 0x05c2, 0x05d1, 0x05d9, 0x05e8, 0x0600, 0x060a, 0x0614, 0x061e, - 0x0623, 0x062c, 0x0634, 0x063a, 0x0640, 0x0648, 0x0652, 0x0659, - 0x0666, 0x066b, 0x0679, 0x0680, 0x0689, 0x0694, 0x069a, 0x069f, - 0x06a4, 0x06a8, 0x06b3, 0x06b7, 0x06bd, 0x06c1, 0x06d1, 0x06e1, - 0x06ec, 0x06f4, 0x06fa, 0x070f, 0x071f, 0x072a, 0x0741, 0x0749, - // Entry C0 - FF - 0x074e, 0x0756, 0x075b, 0x076b, 0x0773, 0x077a, 0x0780, 0x0786, - 0x078c, 0x0798, 0x07a7, 0x07b1, 0x07b6, 0x07bc, 0x07c5, 0x07cf, - 0x07d7, 0x07eb, 0x07f3, 0x07ff, 0x0809, 0x0810, 0x0817, 0x081f, - 0x082a, 0x0840, 0x084b, 0x0857, 0x085c, 0x0865, 0x0875, 0x088b, - 0x088f, 0x08aa, 0x08ae, 0x08b6, 0x08c0, 0x08c7, 0x08d2, 0x08de, - 0x08e5, 0x08ea, 0x08f0, 0x0901, 0x0907, 0x090d, 0x0915, 0x091c, - 0x0922, 0x0937, 0x0945, 0x0952, 0x0959, 0x0963, 0x096f, 0x0987, - 0x0990, 0x09a6, 0x09b9, 0x09c0, 0x09c7, 0x09d6, 0x09db, 0x09e1, - // Entry 100 - 13F - 0x09e6, 0x09ed, 0x09f9, 0x09ff, 0x0a07, 0x0a15, 0x0a1a, 0x0a20, - 0x0a2d, 0x0a3a, 0x0a41, 0x0a4f, 0x0a5e, 0x0a6c, 0x0a7b, 0x0a88, - 0x0a97, 0x0a9f, 0x0aaf, 0x0ab8, 0x0ac4, 0x0ad1, 0x0adf, 0x0aee, - 0x0af9, 0x0b02, 0x0b14, 0x0b1d, 0x0b21, 0x0b2d, 0x0b39, 0x0b3f, - 0x0b4d, 0x0b5c, 0x0b6a, 0x0b77, -} // Size: 608 bytes - -const esRegionStr string = "" + // Size: 3097 bytes - "Isla de la AscensiónAndorraEmiratos Árabes UnidosAfganistánAntigua y Bar" + - "budaAnguilaAlbaniaArmeniaAngolaAntártidaArgentinaSamoa AmericanaAustriaA" + - "ustraliaArubaIslas ÅlandAzerbaiyánBosnia-HerzegovinaBarbadosBangladésBél" + - "gicaBurkina FasoBulgariaBaréinBurundiBenínSan BartoloméBermudasBrunéiBol" + - "iviaCaribe neerlandésBrasilBahamasButánIsla BouvetBotsuanaBielorrusiaBel" + - "iceCanadáIslas CocosRepública Democrática del CongoRepública Centroafric" + - "anaRepública del CongoSuizaCôte d’IvoireIslas CookChileCamerúnChinaColom" + - "biaIsla ClippertonCosta RicaCubaCabo VerdeCurazaoIsla de NavidadChipreCh" + - "equiaAlemaniaDiego GarcíaYibutiDinamarcaDominicaRepública DominicanaArge" + - "liaCeuta y MelillaEcuadorEstoniaEgiptoSáhara OccidentalEritreaEspañaEtio" + - "píaUnión EuropeaFinlandiaFiyiIslas MalvinasMicronesiaIslas FeroeFranciaG" + - "abónReino UnidoGranadaGeorgiaGuayana FrancesaGuerneseyGhanaGibraltarGroe" + - "nlandiaGambiaGuineaGuadalupeGuinea EcuatorialGreciaIslas Georgia del Sur" + - " y Sandwich del SurGuatemalaGuamGuinea-BisáuGuyanaRAE de Hong Kong (Chin" + - "a)Islas Heard y McDonaldHondurasCroaciaHaitíHungríaCanariasIndonesiaIrla" + - "ndaIsraelIsla de ManIndiaTerritorio Británico del Océano ÍndicoIrakIránI" + - "slandiaItaliaJerseyJamaicaJordaniaJapónKeniaKirguistánCamboyaKiribatiCom" + - "orasSan Cristóbal y NievesCorea del NorteCorea del SurKuwaitIslas Caimán" + - "KazajistánLaosLíbanoSanta LucíaLiechtensteinSri LankaLiberiaLesotoLituan" + - "iaLuxemburgoLetoniaLibiaMarruecosMónacoMoldaviaMontenegroSan MartínMadag" + - "ascarIslas MarshallMacedoniaMaliMyanmar (Birmania)MongoliaRAE de Macao (" + - "China)Islas Marianas del NorteMartinicaMauritaniaMontserratMaltaMauricio" + - "MaldivasMalauiMéxicoMalasiaMozambiqueNamibiaNueva CaledoniaNígerIsla Nor" + - "folkNigeriaNicaraguaPaíses BajosNoruegaNepalNauruNiueNueva ZelandaOmánPa" + - "namáPerúPolinesia FrancesaPapúa Nueva GuineaFilipinasPakistánPoloniaSan " + - "Pedro y MiquelónIslas PitcairnPuerto RicoTerritorios PalestinosPortugalP" + - "alaosParaguayCatarTerritorios alejados de OceaníaReuniónRumaníaSerbiaRus" + - "iaRuandaArabia SaudíIslas SalomónSeychellesSudánSueciaSingapurSanta Elen" + - "aEsloveniaSvalbard y Jan MayenEslovaquiaSierra LeonaSan MarinoSenegalSom" + - "aliaSurinamSudán del SurSanto Tomé y PríncipeEl SalvadorSint MaartenSiri" + - "aSuazilandiaTristán de AcuñaIslas Turcas y CaicosChadTerritorios Austral" + - "es FrancesesTogoTailandiaTayikistánTokelauTimor-LesteTurkmenistánTúnezTo" + - "ngaTurquíaTrinidad y TobagoTuvaluTaiwánTanzaniaUcraniaUgandaIslas menore" + - "s alejadas de EE. UU.Estados UnidosUruguayUzbekistánCiudad del VaticanoS" + - "an Vicente y las GranadinasVenezuelaIslas Vírgenes BritánicasIslas Vírge" + - "nes de EE. UU.VietnamVanuatuWallis y FutunaSamoaKosovoYemenMayotteSudáfr" + - "icaZambiaZimbabueRegión desconocidaMundoÁfricaAmérica del NorteSudaméric" + - "aOceaníaÁfrica occidentalCentroaméricaÁfrica orientalÁfrica septentriona" + - "lÁfrica centralÁfrica meridionalAméricaNorteaméricaCaribeAsia orientalAs" + - "ia meridionalSudeste asiáticoEuropa meridionalAustralasiaMelanesiaRegión" + - " de MicronesiaPolinesiaAsiaAsia centralAsia occidentalEuropaEuropa orien" + - "talEuropa septentrionalEuropa occidentalLatinoamérica" - -var esRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0015, 0x001c, 0x0033, 0x003e, 0x004f, 0x0056, 0x005d, - 0x0064, 0x006a, 0x0074, 0x007d, 0x008c, 0x0093, 0x009c, 0x00a1, - 0x00ad, 0x00b8, 0x00ca, 0x00d2, 0x00dc, 0x00e4, 0x00f0, 0x00f8, - 0x00ff, 0x0106, 0x010c, 0x011a, 0x0122, 0x0129, 0x0130, 0x0142, - 0x0148, 0x014f, 0x0155, 0x0160, 0x0168, 0x0173, 0x0179, 0x0180, - 0x018b, 0x01ac, 0x01c5, 0x01d9, 0x01de, 0x01ee, 0x01f8, 0x01fd, - 0x0205, 0x020a, 0x0212, 0x0221, 0x022b, 0x022f, 0x0239, 0x0240, - 0x024f, 0x0255, 0x025c, 0x0264, 0x0271, 0x0277, 0x0280, 0x0288, - // Entry 40 - 7F - 0x029d, 0x02a4, 0x02b3, 0x02ba, 0x02c1, 0x02c7, 0x02d9, 0x02e0, - 0x02e7, 0x02ef, 0x02fd, 0x02fd, 0x0306, 0x030a, 0x0318, 0x0322, - 0x032d, 0x0334, 0x033a, 0x0345, 0x034c, 0x0353, 0x0363, 0x036c, - 0x0371, 0x037a, 0x0385, 0x038b, 0x0391, 0x039a, 0x03ab, 0x03b1, - 0x03d9, 0x03e2, 0x03e6, 0x03f3, 0x03f9, 0x0411, 0x0427, 0x042f, - 0x0436, 0x043c, 0x0444, 0x044c, 0x0455, 0x045c, 0x0462, 0x046d, - 0x0472, 0x049b, 0x049f, 0x04a4, 0x04ac, 0x04b2, 0x04b8, 0x04bf, - 0x04c7, 0x04cd, 0x04d2, 0x04dd, 0x04e4, 0x04ec, 0x04f3, 0x050a, - // Entry 80 - BF - 0x0519, 0x0526, 0x052c, 0x0539, 0x0544, 0x0548, 0x054f, 0x055b, - 0x0568, 0x0571, 0x0578, 0x057e, 0x0586, 0x0590, 0x0597, 0x059c, - 0x05a5, 0x05ac, 0x05b4, 0x05be, 0x05c9, 0x05d3, 0x05e1, 0x05ea, - 0x05ee, 0x0600, 0x0608, 0x061c, 0x0634, 0x063d, 0x0647, 0x0651, - 0x0656, 0x065e, 0x0666, 0x066c, 0x0673, 0x067a, 0x0684, 0x068b, - 0x069a, 0x06a0, 0x06ac, 0x06b3, 0x06bc, 0x06c9, 0x06d0, 0x06d5, - 0x06da, 0x06de, 0x06eb, 0x06f0, 0x06f7, 0x06fc, 0x070e, 0x0721, - 0x072a, 0x0733, 0x073a, 0x074f, 0x075d, 0x0768, 0x077e, 0x0786, - // Entry C0 - FF - 0x078c, 0x0794, 0x0799, 0x07b9, 0x07c1, 0x07c9, 0x07cf, 0x07d4, - 0x07da, 0x07e7, 0x07f5, 0x07ff, 0x0805, 0x080b, 0x0813, 0x081e, - 0x0827, 0x083b, 0x0845, 0x0851, 0x085b, 0x0862, 0x0869, 0x0870, - 0x087e, 0x0895, 0x08a0, 0x08ac, 0x08b1, 0x08bc, 0x08ce, 0x08e3, - 0x08e7, 0x0906, 0x090a, 0x0913, 0x091e, 0x0925, 0x0930, 0x093d, - 0x0943, 0x0948, 0x0950, 0x0961, 0x0967, 0x096e, 0x0976, 0x097d, - 0x0983, 0x09a4, 0x09a4, 0x09b2, 0x09b9, 0x09c4, 0x09d7, 0x09f3, - 0x09fc, 0x0a17, 0x0a31, 0x0a38, 0x0a3f, 0x0a4e, 0x0a53, 0x0a59, - // Entry 100 - 13F - 0x0a5e, 0x0a65, 0x0a6f, 0x0a75, 0x0a7d, 0x0a90, 0x0a95, 0x0a9c, - 0x0aae, 0x0ab9, 0x0ac1, 0x0ad3, 0x0ae1, 0x0af1, 0x0b06, 0x0b15, - 0x0b27, 0x0b2f, 0x0b3c, 0x0b42, 0x0b4f, 0x0b5e, 0x0b6f, 0x0b80, - 0x0b8b, 0x0b94, 0x0ba9, 0x0bb2, 0x0bb6, 0x0bc2, 0x0bd1, 0x0bd7, - 0x0be6, 0x0bfa, 0x0c0b, 0x0c19, -} // Size: 608 bytes - -const es419RegionStr string = "" + // Size: 122 bytes - "Costa de MarfilIslas CanariasIslas UltramarinasTristán da CunhaTimor Ori" + - "entalIslas Ultramarinas de EE.UU.Asia sudoriental" - -var es419RegionIdx = []uint16{ // 279 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - // Entry 40 - 7F - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - 0x000f, 0x000f, 0x000f, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - // Entry 80 - BF - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, - // Entry C0 - FF - 0x001d, 0x001d, 0x001d, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, - 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x0040, 0x0040, - 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x004e, 0x004e, - 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, - 0x004e, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, - 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, - // Entry 100 - 13F - 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, - 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, - 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x007a, -} // Size: 582 bytes - -const etRegionStr string = "" + // Size: 3012 bytes - "Ascensioni saarAndorraAraabia ÜhendemiraadidAfganistanAntigua ja Barbuda" + - "AnguillaAlbaaniaArmeeniaAngolaAntarktikaArgentinaAmeerika SamoaAustriaAu" + - "straaliaArubaAhvenamaaAserbaidžaanBosnia ja HertsegoviinaBarbadosBanglad" + - "eshBelgiaBurkina FasoBulgaariaBahreinBurundiBeninSaint BarthélemyBermuda" + - "BruneiBoliiviaHollandi Kariibi mere saaredBrasiiliaBahamaBhutanBouvet’ s" + - "aarBotswanaValgeveneBelizeKanadaKookossaaredKongo DVKesk-Aafrika Vabarii" + - "kKongo VabariikŠveitsCôte d’IvoireCooki saaredTšiiliKamerunHiinaColombia" + - "Clippertoni saarCosta RicaKuubaRoheneemesaaredCuraçaoJõulusaarKüprosTšeh" + - "hiaSaksamaaDiego GarciaDjiboutiTaaniDominicaDominikaani VabariikAlžeeria" + - "Ceuta ja MelillaEcuadorEestiEgiptusLääne-SaharaEritreaHispaaniaEtioopiaE" + - "uroopa LiitSoomeFidžiFalklandi saaredMikroneesiaFääri saaredPrantsusmaaG" + - "abonSuurbritanniaGrenadaGruusiaPrantsuse GuajaanaGuernseyGhanaGibraltarG" + - "röönimaaGambiaGuineaGuadeloupeEkvatoriaal-GuineaKreekaLõuna-Georgia ja L" + - "õuna-Sandwichi saaredGuatemalaGuamGuinea-BissauGuyanaHongkongi erihaldu" + - "spiirkondHeardi ja McDonaldi saaredHondurasHorvaatiaHaitiUngariKanaari s" + - "aaredIndoneesiaIirimaaIisraelMani saarIndiaBriti India ookeani alaIraakI" + - "raanIslandItaaliaJerseyJamaicaJordaaniaJaapanKeeniaKõrgõzstanKambodžaKir" + - "ibatiKomooridSaint Kitts ja NevisPõhja-KoreaLõuna-KoreaKuveitKaimanisaar" + - "edKasahstanLaosLiibanonSaint LuciaLiechtensteinSri LankaLibeeriaLesothoL" + - "eeduLuksemburgLätiLiibüaMarokoMonacoMoldovaMontenegroSaint-MartinMadagas" + - "karMarshalli SaaredMakedooniaMaliMyanmar (Birma)MongooliaMacau erihaldus" + - "piirkondPõhja-MariaanidMartiniqueMauritaaniaMontserratMaltaMauritiusMald" + - "iividMalawiMehhikoMalaisiaMosambiikNamiibiaUus-KaledooniaNigerNorfolkNig" + - "eeriaNicaraguaHollandNorraNepalNauruNiueUus-MeremaaOmaanPanamaPeruuPrant" + - "suse PolüneesiaPaapua Uus-GuineaFilipiinidPakistanPoolaSaint Pierre ja M" + - "iquelonPitcairni saaredPuerto RicoPalestiina aladPortugalBelauParaguayKa" + - "tarOkeaania hajasaaredRéunionRumeeniaSerbiaVenemaaRwandaSaudi AraabiaSaa" + - "lomoni SaaredSeišellidSudaanRootsiSingapurSaint HelenaSloveeniaSvalbard " + - "ja Jan MayenSlovakkiaSierra LeoneSan MarinoSenegalSomaaliaSurinameLõuna-" + - "SudaanSão Tomé ja PríncipeEl SalvadorSint MaartenSüüriaSvaasimaaTristan " + - "da CunhaTurks ja CaicosTšaadPrantsuse LõunaaladTogoTaiTadžikistanTokelau" + - "Ida-TimorTürkmenistanTuneesiaTongaTürgiTrinidad ja TobagoTuvaluTaiwanTan" + - "saaniaUkrainaUgandaÜhendriikide hajasaaredÜhendatud Rahvaste Organisatsi" + - "oonAmeerika ÜhendriigidUruguayUsbekistanVatikanSaint Vincent ja Grenadii" + - "nidVenezuelaBriti NeitsisaaredUSA NeitsisaaredVietnamVanuatuWallis ja Fu" + - "tunaSamoaKosovoJeemenMayotteLõuna-Aafrika VabariikSambiaZimbabweTundmatu" + - " piirkondmaailmAafrikaPõhja-AmeerikaLõuna-AmeerikaOkeaaniaLääne-AafrikaK" + - "esk-AmeerikaIda-AafrikaPõhja-AafrikaKesk-AafrikaLõuna-AafrikaAmeerikaAme" + - "erika põhjaosaKariibi piirkondIda-AasiaLõuna-AasiaKagu-AasiaLõuna-Euroop" + - "aAustralaasiaMelaneesiaMikroneesia (piirkond)PolüneesiaAasiaKesk-AasiaLä" + - "äne-AasiaEuroopaIda-EuroopaPõhja-EuroopaLääne-EuroopaLadina-Ameerika" - -var etRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x0016, 0x002d, 0x0037, 0x0049, 0x0051, 0x0059, - 0x0061, 0x0067, 0x0071, 0x007a, 0x0088, 0x008f, 0x0099, 0x009e, - 0x00a7, 0x00b4, 0x00cb, 0x00d3, 0x00dd, 0x00e3, 0x00ef, 0x00f8, - 0x00ff, 0x0106, 0x010b, 0x011c, 0x0123, 0x0129, 0x0131, 0x014d, - 0x0156, 0x015c, 0x0162, 0x0170, 0x0178, 0x0181, 0x0187, 0x018d, - 0x0199, 0x01a1, 0x01b6, 0x01c4, 0x01cb, 0x01db, 0x01e7, 0x01ee, - 0x01f5, 0x01fa, 0x0202, 0x0212, 0x021c, 0x0221, 0x0230, 0x0238, - 0x0242, 0x0249, 0x0251, 0x0259, 0x0265, 0x026d, 0x0272, 0x027a, - // Entry 40 - 7F - 0x028e, 0x0297, 0x02a7, 0x02ae, 0x02b3, 0x02ba, 0x02c8, 0x02cf, - 0x02d8, 0x02e0, 0x02ec, 0x02ec, 0x02f1, 0x02f7, 0x0307, 0x0312, - 0x0320, 0x032b, 0x0330, 0x033d, 0x0344, 0x034b, 0x035d, 0x0365, - 0x036a, 0x0373, 0x037e, 0x0384, 0x038a, 0x0394, 0x03a6, 0x03ac, - 0x03d5, 0x03de, 0x03e2, 0x03ef, 0x03f5, 0x0410, 0x042a, 0x0432, - 0x043b, 0x0440, 0x0446, 0x0454, 0x045e, 0x0465, 0x046c, 0x0475, - 0x047a, 0x0491, 0x0496, 0x049b, 0x04a1, 0x04a8, 0x04ae, 0x04b5, - 0x04be, 0x04c4, 0x04ca, 0x04d6, 0x04df, 0x04e7, 0x04ef, 0x0503, - // Entry 80 - BF - 0x050f, 0x051b, 0x0521, 0x052e, 0x0537, 0x053b, 0x0543, 0x054e, - 0x055b, 0x0564, 0x056c, 0x0573, 0x0578, 0x0582, 0x0587, 0x058e, - 0x0594, 0x059a, 0x05a1, 0x05ab, 0x05b7, 0x05c1, 0x05d1, 0x05db, - 0x05df, 0x05ee, 0x05f7, 0x060e, 0x061e, 0x0628, 0x0633, 0x063d, - 0x0642, 0x064b, 0x0654, 0x065a, 0x0661, 0x0669, 0x0672, 0x067a, - 0x0688, 0x068d, 0x0694, 0x069c, 0x06a5, 0x06ac, 0x06b1, 0x06b6, - 0x06bb, 0x06bf, 0x06ca, 0x06cf, 0x06d5, 0x06da, 0x06ef, 0x0700, - 0x070a, 0x0712, 0x0717, 0x072f, 0x073f, 0x074a, 0x0759, 0x0761, - // Entry C0 - FF - 0x0766, 0x076e, 0x0773, 0x0786, 0x078e, 0x0796, 0x079c, 0x07a3, - 0x07a9, 0x07b6, 0x07c6, 0x07d0, 0x07d6, 0x07dc, 0x07e4, 0x07f0, - 0x07f9, 0x080e, 0x0817, 0x0823, 0x082d, 0x0834, 0x083c, 0x0844, - 0x0851, 0x0868, 0x0873, 0x087f, 0x0887, 0x0890, 0x08a0, 0x08af, - 0x08b5, 0x08c9, 0x08cd, 0x08d0, 0x08dc, 0x08e3, 0x08ec, 0x08f9, - 0x0901, 0x0906, 0x090c, 0x091e, 0x0924, 0x092a, 0x0933, 0x093a, - 0x0940, 0x0958, 0x097a, 0x098f, 0x0996, 0x09a0, 0x09a7, 0x09c3, - 0x09cc, 0x09de, 0x09ee, 0x09f5, 0x09fc, 0x0a0c, 0x0a11, 0x0a17, - // Entry 100 - 13F - 0x0a1d, 0x0a24, 0x0a3b, 0x0a41, 0x0a49, 0x0a5a, 0x0a60, 0x0a67, - 0x0a76, 0x0a85, 0x0a8d, 0x0a9c, 0x0aa9, 0x0ab4, 0x0ac2, 0x0ace, - 0x0adc, 0x0ae4, 0x0af6, 0x0b06, 0x0b0f, 0x0b1b, 0x0b25, 0x0b33, - 0x0b3f, 0x0b49, 0x0b5f, 0x0b6a, 0x0b6f, 0x0b79, 0x0b86, 0x0b8d, - 0x0b98, 0x0ba6, 0x0bb5, 0x0bc4, -} // Size: 608 bytes - -const faRegionStr string = "" + // Size: 5004 bytes - "جزایر آسنسیونآندوراامارات متحدهٔ عربیافغانستانآنتیگوا و باربوداآنگویلاآل" + - "بانیارمنستانآنگولاجنوبگانآرژانتینساموآی امریکااتریشاسترالیاآروباجزایر آ" + - "لاندجمهوری آذربایجانبوسنی و هرزگوینباربادوسبنگلادشبلژیکبورکینافاسوبلغار" + - "ستانبحرینبوروندیبنینسن بارتلمیبرمودابرونئیبولیویجزایر کارائیب هلندبرزیل" + - "باهامابوتانجزیرهٔ بووهبوتسوانابلاروسبلیزکاناداجزایر کوکوسکنگو - کینشاسا" + - "جمهوری افریقای مرکزیکنگو - برازویلسوئیسساحل عاججزایر کوکشیلیکامرونچینکل" + - "مبیاجزایر کلیپرتونکاستاریکاکوباکیپ\u200cوردکوراسائوجزیرهٔ کریسمسقبرسجمه" + - "وری چکآلماندیه\u200cگو گارسیاجیبوتیدانمارکدومینیکاجمهوری دومینیکنالجزای" + - "رسبته و ملیلهاکوادوراستونیمصرصحرای غربیاریترهاسپانیااتیوپیاتحادیهٔ اروپ" + - "افنلاندفیجیجزایر فالکلندمیکرونزیجزایر فاروفرانسهگابنبریتانیاگرناداگرجست" + - "انگویان فرانسهگرنزیغناجبل\u200cالطارقگرینلندگامبیاگینهگوادلوپگینهٔ استو" + - "ایییونانجزایر جورجیای جنوبی و ساندویچ جنوبیگواتمالاگوامگینهٔ بیسائوگویا" + - "نهنگ\u200cکنگ، ناحیهٔ ویژهٔ حکومتی چینجزیرهٔ هرد و جزایر مک\u200cدونالد" + - "هندوراسکرواسیهائیتیمجارستانجزایر قناریاندونزیایرلنداسرائیلجزیرهٔ منهندق" + - "لمرو بریتانیا در اقیانوس هندعراقایرانایسلندایتالیاجرزیجامائیکااردنژاپنک" + - "نیاقرقیزستانکامبوجکیریباتیکوموروسنت کیتس و نویسکرهٔ شمالیکرهٔ جنوبیکویت" + - "جزایر کِیمنقزاقستانلائوسلبنانسنت لوسیالیختن\u200cاشتاینسری\u200cلانکالی" + - "بریالسوتولیتوانیلوکزامبورگلتونیلیبیمراکشموناکومولداویمونته\u200cنگروسنت" + - " مارتینماداگاسکارجزایر مارشالمقدونیهمالیمیانمار (برمه)مغولستانماکائو، نا" + - "حیهٔ ویژهٔ حکومتی چینجزایر ماریانای شمالیمارتینیکموریتانیمونت\u200cسرات" + - "مالتموریسمالدیومالاویمکزیکمالزیموزامبیکنامیبیاکالدونیای جدیدنیجرجزیرهٔ " + - "نورفولکنیجریهنیکاراگوئههلندنروژنپالنائورونیوئهنیوزیلندعمانپاناماپروپلی" + - "\u200cنزی فرانسهپاپوا گینهٔ نوفیلیپینپاکستانلهستانسن پیر و میکلنجزایر پی" + - "ت\u200cکرنپورتوریکوسرزمین\u200cهای فلسطینیپرتغالپالائوپاراگوئهقطربخش" + - "\u200cهای دورافتادهٔ اقیانوسیهرئونیونرومانیصربستانروسیهروانداعربستان سعو" + - "دیجزایر سلیمانسیشلسودانسوئدسنگاپورسنت هلناسلوونیاسوالبارد و جان\u200cما" + - "یناسلواکیسیرالئونسان\u200cمارینوسنگالسومالیسورینامسودان جنوبیسائوتومه و" + - " پرینسیپالسالوادورسنت مارتنسوریهسوازیلندتریستان دا کوناجزایر تورکس و کای" + - "کوسچادقلمروهای جنوبی فرانسهتوگوتایلندتاجیکستانتوکلائوتیمور-لستهترکمنستا" + - "نتونستونگاترکیهترینیداد و توباگوتووالوتایوانتانزانیااوکرایناوگانداجزایر" + - " دورافتادهٔ ایالات متحدهسازمان ملل متحدایالات متحدهاروگوئهازبکستانواتیکا" + - "نسنت وینسنت و گرنادینونزوئلاجزایر ویرجین بریتانیاجزایر ویرجین ایالات مت" + - "حدهویتناموانواتووالیس و فوتوناساموآکوزوویمنمایوتافریقای جنوبیزامبیازیمب" + - "ابوهناحیهٔ نامشخصجهانافریقاامریکای شمالیامریکای جنوبیاقیانوسیهغرب افریق" + - "اامریکای مرکزیشرق افریقاشمال افریقامرکز افریقاجنوب افریقاامریکاشمال امر" + - "یکاکارائیبشرق آسیاجنوب آسیاجنوب شرق آسیاجنوب اروپااسترالزیملانزیناحیهٔ " + - "میکرونزیپلی\u200cنزیآسیاآسیای مرکزیغرب آسیااروپاشرق اروپاشمال اروپاغرب " + - "اروپاامریکای لاتین" - -var faRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0019, 0x0025, 0x0047, 0x0059, 0x0079, 0x0087, 0x0093, - 0x00a3, 0x00af, 0x00bd, 0x00cd, 0x00e6, 0x00f0, 0x0100, 0x010a, - 0x011f, 0x013e, 0x015a, 0x016a, 0x0178, 0x0182, 0x0198, 0x01aa, - 0x01b4, 0x01c2, 0x01ca, 0x01dd, 0x01e9, 0x01f5, 0x0201, 0x0223, - 0x022d, 0x0239, 0x0243, 0x0258, 0x0268, 0x0274, 0x027c, 0x0288, - 0x029d, 0x02b6, 0x02dc, 0x02f5, 0x02ff, 0x030e, 0x031f, 0x0327, - 0x0333, 0x0339, 0x0345, 0x0360, 0x0372, 0x037a, 0x0389, 0x0399, - 0x03b2, 0x03ba, 0x03cb, 0x03d5, 0x03ef, 0x03fb, 0x0409, 0x0419, - // Entry 40 - 7F - 0x0436, 0x0444, 0x045a, 0x0468, 0x0474, 0x047a, 0x048d, 0x0499, - 0x04a7, 0x04b3, 0x04ce, 0x04ce, 0x04da, 0x04e2, 0x04fb, 0x050b, - 0x051e, 0x052a, 0x0532, 0x0542, 0x054e, 0x055c, 0x0573, 0x057d, - 0x0583, 0x0598, 0x05a6, 0x05b2, 0x05ba, 0x05c8, 0x05e1, 0x05eb, - 0x062c, 0x063c, 0x0644, 0x065b, 0x0665, 0x06a2, 0x06d7, 0x06e5, - 0x06f1, 0x06fd, 0x070d, 0x0722, 0x0730, 0x073c, 0x074a, 0x075b, - 0x0761, 0x0797, 0x079f, 0x07a9, 0x07b5, 0x07c3, 0x07cb, 0x07db, - 0x07e3, 0x07eb, 0x07f3, 0x0805, 0x0811, 0x0821, 0x082d, 0x0848, - // Entry 80 - BF - 0x085b, 0x086e, 0x0876, 0x088b, 0x089b, 0x08a5, 0x08af, 0x08c0, - 0x08d9, 0x08ec, 0x08f8, 0x0902, 0x0910, 0x0924, 0x092e, 0x0936, - 0x0940, 0x094c, 0x095a, 0x096f, 0x0982, 0x0996, 0x09ad, 0x09bb, - 0x09c3, 0x09dc, 0x09ec, 0x0a26, 0x0a4c, 0x0a5c, 0x0a6c, 0x0a7f, - 0x0a87, 0x0a91, 0x0a9d, 0x0aa9, 0x0ab3, 0x0abd, 0x0acd, 0x0adb, - 0x0af6, 0x0afe, 0x0b19, 0x0b25, 0x0b39, 0x0b41, 0x0b49, 0x0b51, - 0x0b5d, 0x0b67, 0x0b77, 0x0b7f, 0x0b8b, 0x0b91, 0x0bad, 0x0bc7, - 0x0bd5, 0x0be3, 0x0bef, 0x0c08, 0x0c22, 0x0c34, 0x0c58, 0x0c64, - // Entry C0 - FF - 0x0c70, 0x0c80, 0x0c86, 0x0cbd, 0x0ccb, 0x0cd7, 0x0ce5, 0x0cef, - 0x0cfb, 0x0d14, 0x0d2b, 0x0d33, 0x0d3d, 0x0d45, 0x0d53, 0x0d60, - 0x0d6e, 0x0d95, 0x0da3, 0x0db3, 0x0dc8, 0x0dd2, 0x0dde, 0x0dec, - 0x0e01, 0x0e23, 0x0e37, 0x0e48, 0x0e52, 0x0e62, 0x0e7e, 0x0ea3, - 0x0ea9, 0x0ed1, 0x0ed9, 0x0ee5, 0x0ef7, 0x0f05, 0x0f18, 0x0f2a, - 0x0f32, 0x0f3c, 0x0f46, 0x0f66, 0x0f72, 0x0f7e, 0x0f8e, 0x0f9c, - 0x0faa, 0x0fe1, 0x0ffd, 0x1014, 0x1022, 0x1032, 0x1040, 0x1065, - 0x1073, 0x109b, 0x10ca, 0x10d6, 0x10e4, 0x10fe, 0x1108, 0x1112, - // Entry 100 - 13F - 0x1118, 0x1122, 0x113b, 0x1147, 0x1157, 0x1170, 0x1178, 0x1184, - 0x119d, 0x11b6, 0x11c8, 0x11db, 0x11f4, 0x1207, 0x121c, 0x1231, - 0x1246, 0x1252, 0x1267, 0x1275, 0x1284, 0x1295, 0x12ad, 0x12c0, - 0x12d0, 0x12dc, 0x12f9, 0x1308, 0x1310, 0x1325, 0x1334, 0x133e, - 0x134f, 0x1362, 0x1373, 0x138c, -} // Size: 608 bytes - -const fiRegionStr string = "" + // Size: 3023 bytes - "Ascension-saariAndorraArabiemiirikunnatAfganistanAntigua ja BarbudaAngui" + - "llaAlbaniaArmeniaAngolaAntarktisArgentiinaAmerikan SamoaItävaltaAustrali" + - "aArubaAhvenanmaaAzerbaidžanBosnia ja HertsegovinaBarbadosBangladeshBelgi" + - "aBurkina FasoBulgariaBahrainBurundiBeninSaint-BarthélemyBermudaBruneiBol" + - "iviaKaribian AlankomaatBrasiliaBahamaBhutanBouvet’nsaariBotswanaValko-Ve" + - "näjäBelizeKanadaKookossaaret (Keelingsaaret)Kongon demokraattinen tasava" + - "ltaKeski-Afrikan tasavaltaKongon tasavaltaSveitsiNorsunluurannikkoCookin" + - "saaretChileKamerunKiinaKolumbiaClippertoninsaariCosta RicaKuubaKap Verde" + - "CuraçaoJoulusaariKyprosTšekinmaaSaksaDiego GarciaDjiboutiTanskaDominicaD" + - "ominikaaninen tasavaltaAlgeriaCeuta ja MelillaEcuadorViroEgyptiLänsi-Sah" + - "araEritreaEspanjaEtiopiaEuroopan unioniSuomiFidžiFalklandinsaaretMikrone" + - "sian liittovaltioFärsaaretRanskaGabonIso-BritanniaGrenadaGeorgiaRanskan " + - "GuayanaGuernseyGhanaGibraltarGrönlantiGambiaGuineaGuadeloupePäiväntasaaj" + - "an GuineaKreikkaEtelä-Georgia ja Eteläiset SandwichsaaretGuatemalaGuamGu" + - "inea-BissauGuyanaHongkong – Kiinan e.h.a.Heard ja McDonaldinsaaretHondur" + - "asKroatiaHaitiUnkariKanariansaaretIndonesiaIrlantiIsraelMansaariIntiaBri" + - "ttiläinen Intian valtameren alueIrakIranIslantiItaliaJerseyJamaikaJordan" + - "iaJapaniKeniaKirgisiaKambodžaKiribatiKomoritSaint Kitts ja NevisPohjois-" + - "KoreaEtelä-KoreaKuwaitCaymansaaretKazakstanLaosLibanonSaint LuciaLiechte" + - "nsteinSri LankaLiberiaLesothoLiettuaLuxemburgLatviaLibyaMarokkoMonacoMol" + - "dovaMontenegroSaint-MartinMadagaskarMarshallinsaaretMakedoniaMaliMyanmar" + - " (Burma)MongoliaMacao – Kiinan e.h.a.Pohjois-MariaanitMartiniqueMauritan" + - "iaMontserratMaltaMauritiusMalediivitMalawiMeksikoMalesiaMosambikNamibiaU" + - "usi-KaledoniaNigerNorfolkinsaariNigeriaNicaraguaAlankomaatNorjaNepalNaur" + - "uNiueUusi-SeelantiOmanPanamaPeruRanskan PolynesiaPapua-Uusi-GuineaFilipp" + - "iinitPakistanPuolaSaint-Pierre ja MiquelonPitcairnPuerto RicoPalestiinal" + - "aisalueetPortugaliPalauParaguayQatarulkomeriRéunionRomaniaSerbiaVenäjäRu" + - "andaSaudi-ArabiaSalomonsaaretSeychellitSudanRuotsiSingaporeSaint HelenaS" + - "loveniaHuippuvuoret ja Jan MayenSlovakiaSierra LeoneSan MarinoSenegalSom" + - "aliaSurinameEtelä-SudanSão Tomé ja PríncipeEl SalvadorSint MaartenSyyria" + - "SwazimaaTristan da CunhaTurks- ja CaicossaaretTšadRanskan eteläiset alue" + - "etTogoThaimaaTadžikistanTokelauItä-TimorTurkmenistanTunisiaTongaTurkkiTr" + - "inidad ja TobagoTuvaluTaiwanTansaniaUkrainaUgandaYhdysvaltain erillissaa" + - "retYhdistyneet kansakunnatYhdysvallatUruguayUzbekistanVatikaaniSaint Vin" + - "cent ja GrenadiinitVenezuelaBrittiläiset NeitsytsaaretYhdysvaltain Neits" + - "ytsaaretVietnamVanuatuWallis ja FutunaSamoaKosovoJemenMayotteEtelä-Afrik" + - "kaSambiaZimbabwetuntematon aluemaailmaAfrikkaPohjois-AmerikkaEtelä-Ameri" + - "kkaOseaniaLänsi-AfrikkaVäli-AmerikkaItä-AfrikkaPohjois-AfrikkaKeski-Afri" + - "kkaeteläinen AfrikkaAmerikkapohjoinen AmerikkaKaribiaItä-AasiaEtelä-Aasi" + - "aKaakkois-AasiaEtelä-EurooppaAustralaasiaMelanesiaMikronesiaPolynesiaAas" + - "iaKeski-AasiaLänsi-AasiaEurooppaItä-EurooppaPohjois-EurooppaLänsi-Euroop" + - "paLatinalainen Amerikka" - -var fiRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x0016, 0x0027, 0x0031, 0x0043, 0x004b, 0x0052, - 0x0059, 0x005f, 0x0068, 0x0072, 0x0080, 0x0089, 0x0092, 0x0097, - 0x00a1, 0x00ad, 0x00c3, 0x00cb, 0x00d5, 0x00db, 0x00e7, 0x00ef, - 0x00f6, 0x00fd, 0x0102, 0x0113, 0x011a, 0x0120, 0x0127, 0x013a, - 0x0142, 0x0148, 0x014e, 0x015d, 0x0165, 0x0173, 0x0179, 0x017f, - 0x019b, 0x01ba, 0x01d1, 0x01e1, 0x01e8, 0x01f9, 0x0205, 0x020a, - 0x0211, 0x0216, 0x021e, 0x022f, 0x0239, 0x023e, 0x0247, 0x024f, - 0x0259, 0x025f, 0x0269, 0x026e, 0x027a, 0x0282, 0x0288, 0x0290, - // Entry 40 - 7F - 0x02a8, 0x02af, 0x02bf, 0x02c6, 0x02ca, 0x02d0, 0x02dd, 0x02e4, - 0x02eb, 0x02f2, 0x0301, 0x0301, 0x0306, 0x030c, 0x031c, 0x0334, - 0x033e, 0x0344, 0x0349, 0x0356, 0x035d, 0x0364, 0x0373, 0x037b, - 0x0380, 0x0389, 0x0393, 0x0399, 0x039f, 0x03a9, 0x03c0, 0x03c7, - 0x03f2, 0x03fb, 0x03ff, 0x040c, 0x0412, 0x042c, 0x0445, 0x044d, - 0x0454, 0x0459, 0x045f, 0x046d, 0x0476, 0x047d, 0x0483, 0x048b, - 0x0490, 0x04b4, 0x04b8, 0x04bc, 0x04c3, 0x04c9, 0x04cf, 0x04d6, - 0x04de, 0x04e4, 0x04e9, 0x04f1, 0x04fa, 0x0502, 0x0509, 0x051d, - // Entry 80 - BF - 0x052a, 0x0536, 0x053c, 0x0548, 0x0551, 0x0555, 0x055c, 0x0567, - 0x0574, 0x057d, 0x0584, 0x058b, 0x0592, 0x059b, 0x05a1, 0x05a6, - 0x05ad, 0x05b3, 0x05ba, 0x05c4, 0x05d0, 0x05da, 0x05ea, 0x05f3, - 0x05f7, 0x0606, 0x060e, 0x0625, 0x0636, 0x0640, 0x064a, 0x0654, - 0x0659, 0x0662, 0x066c, 0x0672, 0x0679, 0x0680, 0x0688, 0x068f, - 0x069d, 0x06a2, 0x06b0, 0x06b7, 0x06c0, 0x06ca, 0x06cf, 0x06d4, - 0x06d9, 0x06dd, 0x06ea, 0x06ee, 0x06f4, 0x06f8, 0x0709, 0x071a, - 0x0725, 0x072d, 0x0732, 0x074a, 0x0752, 0x075d, 0x0771, 0x077a, - // Entry C0 - FF - 0x077f, 0x0787, 0x078c, 0x0794, 0x079c, 0x07a3, 0x07a9, 0x07b1, - 0x07b7, 0x07c3, 0x07d0, 0x07da, 0x07df, 0x07e5, 0x07ee, 0x07fa, - 0x0802, 0x081b, 0x0823, 0x082f, 0x0839, 0x0840, 0x0847, 0x084f, - 0x085b, 0x0872, 0x087d, 0x0889, 0x088f, 0x0897, 0x08a7, 0x08bd, - 0x08c2, 0x08db, 0x08df, 0x08e6, 0x08f2, 0x08f9, 0x0903, 0x090f, - 0x0916, 0x091b, 0x0921, 0x0933, 0x0939, 0x093f, 0x0947, 0x094e, - 0x0954, 0x096e, 0x0985, 0x0990, 0x0997, 0x09a1, 0x09aa, 0x09c6, - 0x09cf, 0x09ea, 0x0a04, 0x0a0b, 0x0a12, 0x0a22, 0x0a27, 0x0a2d, - // Entry 100 - 13F - 0x0a32, 0x0a39, 0x0a47, 0x0a4d, 0x0a55, 0x0a64, 0x0a6b, 0x0a72, - 0x0a82, 0x0a91, 0x0a98, 0x0aa6, 0x0ab4, 0x0ac0, 0x0acf, 0x0adc, - 0x0aee, 0x0af6, 0x0b08, 0x0b0f, 0x0b19, 0x0b25, 0x0b33, 0x0b42, - 0x0b4e, 0x0b57, 0x0b61, 0x0b6a, 0x0b6f, 0x0b7a, 0x0b86, 0x0b8e, - 0x0b9b, 0x0bab, 0x0bba, 0x0bcf, -} // Size: 608 bytes - -const filRegionStr string = "" + // Size: 3030 bytes - "Acsencion islandAndorraUnited Arab EmiratesAfghanistanAntigua and Barbud" + - "aAnguillaAlbaniaArmeniaAngolaAntarcticaArgentinaAmerican SamoaAustriaAus" + - "traliaArubaÅland IslandsAzerbaijanBosnia and HerzegovinaBarbadosBanglade" + - "shBelgiumBurkina FasoBulgariaBahrainBurundiBeninSaint BarthélemyBermudaB" + - "runeiBoliviaCaribbean NetherlandsBrazilBahamasBhutanBouvet IslandBotswan" + - "aBelarusBelizeCanadaCocos (Keeling) IslandsCongo - KinshasaCentral Afric" + - "an RepublicCongo - BrazzavilleSwitzerlandCôte d’IvoireCook IslandsChileC" + - "ameroonChinaColombiaClipperton IslandCosta RicaCubaCape VerdeCuraçaoChri" + - "stmas IslandCyprusCzechiaGermanyDiego GarciaDjiboutiDenmarkDominicaDomin" + - "ican RepublicAlgeriaCeuta and MelillaEcuadorEstoniaEgyptKanlurang Sahara" + - "EritreaSpainEthiopiaEuropean UnionFinlandFijiFalkland IslandsMicronesiaF" + - "aroe IslandsFranceGabonUnited KingdomGrenadaGeorgiaFrench GuianaGuernsey" + - "GhanaGibraltarGreenlandGambiaGuineaGuadeloupeEquatorial GuineaGreeceSout" + - "h Georgia and the South Sandwich IslandsGuatemalaGuamGuinea-BissauGuyana" + - "Hong Kong SAR ChinaHeard Island and McDonald IslandsHondurasCroatiaHaiti" + - "HungaryCanary IslandsIndonesiaIrelandIsraelIsle of ManIndiaBritish India" + - "n Ocean TerritoryIraqIranIcelandItalyJerseyJamaicaJordanJapanKenyaKyrgyz" + - "stanCambodiaKiribatiComorosSaint Kitts and NevisHilagang KoreaTimog Kore" + - "aKuwaitCayman IslandsKazakhstanLaosLebanonSaint LuciaLiechtensteinSri La" + - "nkaLiberiaLesothoLithuaniaLuxembourgLatviaLibyaMoroccoMonacoMoldovaMonte" + - "negroSaint MartinMadagascarMarshall IslandsMacedoniaMaliMyanmar (Burma)M" + - "ongoliaMacau SAR ChinaNorthern Mariana IslandsMartiniqueMauritaniaMontse" + - "rratMaltaMauritiusMaldivesMalawiMexicoMalaysiaMozambiqueNamibiaNew Caled" + - "oniaNigerNorfolk IslandNigeriaNicaraguaNetherlandsNorwayNepalNauruNiueNe" + - "w ZealandOmanPanamaPeruFrench PolynesiaPapua New GuineaPilipinasPakistan" + - "PolandSaint Pierre and MiquelonPitcairn IslandsPuerto RicoPalestinian Te" + - "rritoriesPortugalPalauParaguayQatarOutlying OceaniaRéunionRomaniaSerbiaR" + - "ussiaRwandaSaudi ArabiaSolomon IslandsSeychellesSudanSwedenSingaporeSain" + - "t HelenaSloveniaSvalbard and Jan MayenSlovakiaSierra LeoneSan MarinoSene" + - "galSomaliaSurinameTimog SudanSão Tomé and PríncipeEl SalvadorSint Maarte" + - "nSyriaSwazilandTristan de CunhaTurks and Caicos IslandsChadFrench Southe" + - "rn TerritoriesTogoThailandTajikistanTokelauTimor-LesteTurkmenistanTunisi" + - "aTongaTurkeyTrinidad and TobagoTuvaluTaiwanTanzaniaUkraineUgandaU.S. Out" + - "lying IslandsNagkakaisang BansaEstados UnidosUruguayUzbekistanVatican Ci" + - "tySaint Vincent and the GrenadinesVenezuelaBritish Virgin IslandsU.S. Vi" + - "rgin IslandsVietnamVanuatuWallis and FutunaSamoaKosovoYemenMayotteSouth " + - "AfricaZambiaZimbabweHindi Kilalang RehiyonMundoAfricaHilagang AmerikaTim" + - "og AmerikaOceaniaKanlurang AfricaGitnang AmerikaSilangang AfricaHilagang" + - " AfricaGitnang AfricaKatimugang AfricaAmericasNorthern AmericaCarribbean" + - "Silangang AsyaKatimugang AsyaTimog-Silangang AsyaKatimugang EuropeAustra" + - "lasiaMelanesiaRehiyon ng MicronesiaPolynesiaAsyaGitnang AsyaKanlurang As" + - "yaEuropeSilangang EuropeHilagang EuropeKanlurang EuropeLatin America" - -var filRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0017, 0x002b, 0x0036, 0x0049, 0x0051, 0x0058, - 0x005f, 0x0065, 0x006f, 0x0078, 0x0086, 0x008d, 0x0096, 0x009b, - 0x00a9, 0x00b3, 0x00c9, 0x00d1, 0x00db, 0x00e2, 0x00ee, 0x00f6, - 0x00fd, 0x0104, 0x0109, 0x011a, 0x0121, 0x0127, 0x012e, 0x0143, - 0x0149, 0x0150, 0x0156, 0x0163, 0x016b, 0x0172, 0x0178, 0x017e, - 0x0195, 0x01a5, 0x01bd, 0x01d0, 0x01db, 0x01eb, 0x01f7, 0x01fc, - 0x0204, 0x0209, 0x0211, 0x0222, 0x022c, 0x0230, 0x023a, 0x0242, - 0x0252, 0x0258, 0x025f, 0x0266, 0x0272, 0x027a, 0x0281, 0x0289, - // Entry 40 - 7F - 0x029b, 0x02a2, 0x02b3, 0x02ba, 0x02c1, 0x02c6, 0x02d6, 0x02dd, - 0x02e2, 0x02ea, 0x02f8, 0x02f8, 0x02ff, 0x0303, 0x0313, 0x031d, - 0x032a, 0x0330, 0x0335, 0x0343, 0x034a, 0x0351, 0x035e, 0x0366, - 0x036b, 0x0374, 0x037d, 0x0383, 0x0389, 0x0393, 0x03a4, 0x03aa, - 0x03d6, 0x03df, 0x03e3, 0x03f0, 0x03f6, 0x0409, 0x042a, 0x0432, - 0x0439, 0x043e, 0x0445, 0x0453, 0x045c, 0x0463, 0x0469, 0x0474, - 0x0479, 0x0497, 0x049b, 0x049f, 0x04a6, 0x04ab, 0x04b1, 0x04b8, - 0x04be, 0x04c3, 0x04c8, 0x04d2, 0x04da, 0x04e2, 0x04e9, 0x04fe, - // Entry 80 - BF - 0x050c, 0x0517, 0x051d, 0x052b, 0x0535, 0x0539, 0x0540, 0x054b, - 0x0558, 0x0561, 0x0568, 0x056f, 0x0578, 0x0582, 0x0588, 0x058d, - 0x0594, 0x059a, 0x05a1, 0x05ab, 0x05b7, 0x05c1, 0x05d1, 0x05da, - 0x05de, 0x05ed, 0x05f5, 0x0604, 0x061c, 0x0626, 0x0630, 0x063a, - 0x063f, 0x0648, 0x0650, 0x0656, 0x065c, 0x0664, 0x066e, 0x0675, - 0x0682, 0x0687, 0x0695, 0x069c, 0x06a5, 0x06b0, 0x06b6, 0x06bb, - 0x06c0, 0x06c4, 0x06cf, 0x06d3, 0x06d9, 0x06dd, 0x06ed, 0x06fd, - 0x0706, 0x070e, 0x0714, 0x072d, 0x073d, 0x0748, 0x075f, 0x0767, - // Entry C0 - FF - 0x076c, 0x0774, 0x0779, 0x0789, 0x0791, 0x0798, 0x079e, 0x07a4, - 0x07aa, 0x07b6, 0x07c5, 0x07cf, 0x07d4, 0x07da, 0x07e3, 0x07ef, - 0x07f7, 0x080d, 0x0815, 0x0821, 0x082b, 0x0832, 0x0839, 0x0841, - 0x084c, 0x0864, 0x086f, 0x087b, 0x0880, 0x0889, 0x0899, 0x08b1, - 0x08b5, 0x08d0, 0x08d4, 0x08dc, 0x08e6, 0x08ed, 0x08f8, 0x0904, - 0x090b, 0x0910, 0x0916, 0x0929, 0x092f, 0x0935, 0x093d, 0x0944, - 0x094a, 0x095f, 0x0971, 0x097f, 0x0986, 0x0990, 0x099c, 0x09bc, - 0x09c5, 0x09db, 0x09ee, 0x09f5, 0x09fc, 0x0a0d, 0x0a12, 0x0a18, - // Entry 100 - 13F - 0x0a1d, 0x0a24, 0x0a30, 0x0a36, 0x0a3e, 0x0a54, 0x0a59, 0x0a5f, - 0x0a6f, 0x0a7c, 0x0a83, 0x0a93, 0x0aa2, 0x0ab2, 0x0ac1, 0x0acf, - 0x0ae0, 0x0ae8, 0x0af8, 0x0b02, 0x0b10, 0x0b1f, 0x0b33, 0x0b44, - 0x0b4f, 0x0b58, 0x0b6d, 0x0b76, 0x0b7a, 0x0b86, 0x0b94, 0x0b9a, - 0x0baa, 0x0bb9, 0x0bc9, 0x0bd6, -} // Size: 608 bytes - -const frRegionStr string = "" + // Size: 3309 bytes - "Île de l’AscensionAndorreÉmirats arabes unisAfghanistanAntigua-et-Barbud" + - "aAnguillaAlbanieArménieAngolaAntarctiqueArgentineSamoa américainesAutric" + - "heAustralieArubaÎles ÅlandAzerbaïdjanBosnie-HerzégovineBarbadeBangladesh" + - "BelgiqueBurkina FasoBulgarieBahreïnBurundiBéninSaint-BarthélemyBermudesB" + - "runéi DarussalamBoliviePays-Bas caribéensBrésilBahamasBhoutanÎle BouvetB" + - "otswanaBiélorussieBelizeCanadaÎles CocosCongo-KinshasaRépublique centraf" + - "ricaineCongo-BrazzavilleSuisseCôte d’IvoireÎles CookChiliCamerounChineCo" + - "lombieÎle ClippertonCosta RicaCubaCap-VertCuraçaoÎle ChristmasChypreTché" + - "quieAllemagneDiego GarciaDjiboutiDanemarkDominiqueRépublique dominicaine" + - "AlgérieCeuta et MelillaÉquateurEstonieÉgypteSahara occidentalÉrythréeEsp" + - "agneÉthiopieUnion européenneFinlandeFidjiÎles MalouinesÉtats fédérés de " + - "MicronésieÎles FéroéFranceGabonRoyaume-UniGrenadeGéorgieGuyane française" + - "GuerneseyGhanaGibraltarGroenlandGambieGuinéeGuadeloupeGuinée équatoriale" + - "GrèceGéorgie du Sud et îles Sandwich du SudGuatemalaGuamGuinée-BissauGuy" + - "anaR.A.S. chinoise de Hong KongÎles Heard et McDonaldHondurasCroatieHaït" + - "iHongrieÎles CanariesIndonésieIrlandeIsraëlÎle de ManIndeTerritoire brit" + - "annique de l’océan IndienIrakIranIslandeItalieJerseyJamaïqueJordanieJapo" + - "nKenyaKirghizistanCambodgeKiribatiComoresSaint-Christophe-et-NiévèsCorée" + - " du NordCorée du SudKoweïtÎles CaïmansKazakhstanLaosLibanSainte-LucieLie" + - "chtensteinSri LankaLibériaLesothoLituanieLuxembourgLettonieLibyeMarocMon" + - "acoMoldavieMonténégroSaint-MartinMadagascarÎles MarshallMacédoineMaliMya" + - "nmar (Birmanie)MongolieR.A.S. chinoise de MacaoÎles Mariannes du NordMar" + - "tiniqueMauritanieMontserratMalteMauriceMaldivesMalawiMexiqueMalaisieMoza" + - "mbiqueNamibieNouvelle-CalédonieNigerÎle NorfolkNigériaNicaraguaPays-BasN" + - "orvègeNépalNauruNiueNouvelle-ZélandeOmanPanamaPérouPolynésie françaisePa" + - "pouasie-Nouvelle-GuinéePhilippinesPakistanPologneSaint-Pierre-et-Miquelo" + - "nÎles PitcairnPorto RicoTerritoires palestiniensPortugalPalaosParaguayQa" + - "tarrégions éloignées de l’OcéanieLa RéunionRoumanieSerbieRussieRwandaAra" + - "bie saouditeÎles SalomonSeychellesSoudanSuèdeSingapourSainte-HélèneSlové" + - "nieSvalbard et Jan MayenSlovaquieSierra LeoneSaint-MarinSénégalSomalieSu" + - "rinameSoudan du SudSao Tomé-et-PrincipeEl SalvadorSaint-Martin (partie n" + - "éerlandaise)SyrieSwazilandTristan da CunhaÎles Turques-et-CaïquesTchadT" + - "erres australes françaisesTogoThaïlandeTadjikistanTokélaouTimor oriental" + - "TurkménistanTunisieTongaTurquieTrinité-et-TobagoTuvaluTaïwanTanzanieUkra" + - "ineOugandaÎles mineures éloignées des États-UnisNations UniesÉtats-UnisU" + - "ruguayOuzbékistanÉtat de la Cité du VaticanSaint-Vincent-et-les-Grenadin" + - "esVenezuelaÎles Vierges britanniquesÎles Vierges des États-UnisVietnamVa" + - "nuatuWallis-et-FutunaSamoaKosovoYémenMayotteAfrique du SudZambieZimbabwe" + - "région indéterminéeMondeAfriqueAmérique du NordAmérique du SudOcéanieAfr" + - "ique occidentaleAmérique centraleAfrique orientaleAfrique septentrionale" + - "Afrique centraleAfrique australeAmériquesAmérique septentrionaleCaraïbes" + - "Asie orientaleAsie du SudAsie du Sud-EstEurope méridionaleAustralasieMél" + - "anésierégion micronésiennePolynésieAsieAsie centraleAsie occidentaleEuro" + - "peEurope de l’EstEurope septentrionaleEurope occidentaleAmérique latine" - -var frRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0015, 0x001c, 0x0030, 0x003b, 0x004d, 0x0055, 0x005c, - 0x0064, 0x006a, 0x0075, 0x007e, 0x0090, 0x0098, 0x00a1, 0x00a6, - 0x00b2, 0x00be, 0x00d1, 0x00d8, 0x00e2, 0x00ea, 0x00f6, 0x00fe, - 0x0106, 0x010d, 0x0113, 0x0124, 0x012c, 0x013e, 0x0145, 0x0158, - 0x015f, 0x0166, 0x016d, 0x0178, 0x0180, 0x018c, 0x0192, 0x0198, - 0x01a3, 0x01b1, 0x01cb, 0x01dc, 0x01e2, 0x01f2, 0x01fc, 0x0201, - 0x0209, 0x020e, 0x0216, 0x0225, 0x022f, 0x0233, 0x023b, 0x0243, - 0x0251, 0x0257, 0x0260, 0x0269, 0x0275, 0x027d, 0x0285, 0x028e, - // Entry 40 - 7F - 0x02a5, 0x02ad, 0x02bd, 0x02c6, 0x02cd, 0x02d4, 0x02e5, 0x02ef, - 0x02f6, 0x02ff, 0x0310, 0x0310, 0x0318, 0x031d, 0x032c, 0x034c, - 0x0359, 0x035f, 0x0364, 0x036f, 0x0376, 0x037e, 0x038f, 0x0398, - 0x039d, 0x03a6, 0x03af, 0x03b5, 0x03bc, 0x03c6, 0x03da, 0x03e0, - 0x0408, 0x0411, 0x0415, 0x0423, 0x0429, 0x0445, 0x045c, 0x0464, - 0x046b, 0x0471, 0x0478, 0x0486, 0x0490, 0x0497, 0x049e, 0x04a9, - 0x04ad, 0x04d8, 0x04dc, 0x04e0, 0x04e7, 0x04ed, 0x04f3, 0x04fc, - 0x0504, 0x0509, 0x050e, 0x051a, 0x0522, 0x052a, 0x0531, 0x054d, - // Entry 80 - BF - 0x055b, 0x0568, 0x056f, 0x057d, 0x0587, 0x058b, 0x0590, 0x059c, - 0x05a9, 0x05b2, 0x05ba, 0x05c1, 0x05c9, 0x05d3, 0x05db, 0x05e0, - 0x05e5, 0x05eb, 0x05f3, 0x05ff, 0x060b, 0x0615, 0x0623, 0x062d, - 0x0631, 0x0643, 0x064b, 0x0663, 0x067a, 0x0684, 0x068e, 0x0698, - 0x069d, 0x06a4, 0x06ac, 0x06b2, 0x06b9, 0x06c1, 0x06cb, 0x06d2, - 0x06e5, 0x06ea, 0x06f6, 0x06fe, 0x0707, 0x070f, 0x0717, 0x071d, - 0x0722, 0x0726, 0x0737, 0x073b, 0x0741, 0x0747, 0x075c, 0x0776, - 0x0781, 0x0789, 0x0790, 0x07a8, 0x07b6, 0x07c0, 0x07d8, 0x07e0, - // Entry C0 - FF - 0x07e6, 0x07ee, 0x07f3, 0x0817, 0x0822, 0x082a, 0x0830, 0x0836, - 0x083c, 0x084b, 0x0858, 0x0862, 0x0868, 0x086e, 0x0877, 0x0886, - 0x088f, 0x08a4, 0x08ad, 0x08b9, 0x08c4, 0x08cd, 0x08d4, 0x08dc, - 0x08e9, 0x08fe, 0x0909, 0x092c, 0x0931, 0x093a, 0x094a, 0x0963, - 0x0968, 0x0984, 0x0988, 0x0992, 0x099d, 0x09a6, 0x09b4, 0x09c1, - 0x09c8, 0x09cd, 0x09d4, 0x09e6, 0x09ec, 0x09f3, 0x09fb, 0x0a02, - 0x0a09, 0x0a33, 0x0a40, 0x0a4b, 0x0a52, 0x0a5e, 0x0a7a, 0x0a99, - 0x0aa2, 0x0abc, 0x0ad9, 0x0ae0, 0x0ae7, 0x0af7, 0x0afc, 0x0b02, - // Entry 100 - 13F - 0x0b08, 0x0b0f, 0x0b1d, 0x0b23, 0x0b2b, 0x0b41, 0x0b46, 0x0b4d, - 0x0b5e, 0x0b6e, 0x0b76, 0x0b89, 0x0b9b, 0x0bac, 0x0bc2, 0x0bd2, - 0x0be2, 0x0bec, 0x0c04, 0x0c0d, 0x0c1b, 0x0c26, 0x0c35, 0x0c48, - 0x0c53, 0x0c5e, 0x0c74, 0x0c7e, 0x0c82, 0x0c8f, 0x0c9f, 0x0ca5, - 0x0cb6, 0x0ccb, 0x0cdd, 0x0ced, -} // Size: 608 bytes - -const frCARegionStr string = "" + // Size: 492 bytes - "île de l’Ascensionîles d’ÅlandBruneiîle BouvetBélarusîles Cocos (Keeling" + - ")îles Cookîle Christmasîles MalouinesMicronésieîles Féroéîles Heard et M" + - "cDonaldîles Canariesîle de ManSaint-Martin (France)MyanmarMariannes du N" + - "ordîle Norfolkîles PitcairnOcéanie lointainela RéunionSaint-Martin (Pays" + - "-Bas)TokelauTimor-Lesteîles mineures éloignées des États-UnisCité du Vat" + - "icanSaint-Vincent-et-les Grenadinesîles Vierges britanniquesîles Vierges" + - " américainesEurope orientale" - -var frCARegionIdx = []uint16{ // 289 elements - // Entry 0 - 3F - 0x0000, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, - 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x002b, 0x002b, 0x002b, - 0x002b, 0x002b, 0x002b, 0x0036, 0x0036, 0x003e, 0x003e, 0x003e, - 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x0053, 0x005d, 0x005d, - 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, - // Entry 40 - 7F - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, - 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x007a, 0x0085, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, - 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x00a9, 0x00a9, - 0x00a9, 0x00a9, 0x00a9, 0x00b7, 0x00b7, 0x00b7, 0x00b7, 0x00c2, - 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, - 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, - // Entry 80 - BF - 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, - 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, - 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00d7, 0x00d7, 0x00d7, 0x00d7, - 0x00d7, 0x00de, 0x00de, 0x00de, 0x00ef, 0x00ef, 0x00ef, 0x00ef, - 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, - 0x00ef, 0x00ef, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x00fb, - 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x0109, 0x0109, 0x0109, 0x0109, - // Entry C0 - FF - 0x0109, 0x0109, 0x0109, 0x011b, 0x0126, 0x0126, 0x0126, 0x0126, - 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, - 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, - 0x0126, 0x0126, 0x0126, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, - 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x0144, 0x014f, 0x014f, - 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, - 0x014f, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0189, 0x01a8, - 0x01a8, 0x01c2, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, - // Entry 100 - 13F - 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, - 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, - 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, - 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, - 0x01ec, -} // Size: 602 bytes - -const guRegionStr string = "" + // Size: 8687 bytes - "એસેન્શન આઇલેન્ડઍંડોરાયુનાઇટેડ આરબ અમીરાતઅફઘાનિસ્તાનએન્ટીગુઆ અને બર્મુડાઍ" + - "ંગ્વિલાઅલ્બેનિયાઆર્મેનિયાઅંગોલાએન્ટાર્કટિકાઆર્જેન્ટીનાઅમેરીકન સમોઆઑસ્ટ" + - "્રિયાઑસ્ટ્રેલિયાઅરુબાએલેંડ ટાપુઓઅઝરબૈજાનબોસ્નિયા અને હર્ઝેગોવિનાબાર્બા" + - "ડોસબાંગ્લાદેશબેલ્જીયમબુર્કિના ફાસોબલ્ગેરિયાબેહરીનબુરુંડીબેનિનસેન્ટ બાર" + - "્થેલેમીબર્મુડાબ્રુનેઇબોલિવિયાકેરેબિયન નેધરલેન્ડ્ઝબ્રાઝિલબહામાસભૂટાનબૌવ" + - "ેત આઇલેન્ડબોત્સ્વાનાબેલારુસબેલીઝકેનેડાકોકોઝ (કીલીંગ) આઇલેન્ડ્સકોંગો - " + - "કિંશાસાસેન્ટ્રલ આફ્રિકન રીપબ્લિકકોંગો - બ્રાઝાવિલેસ્વિટ્ઝર્લૅન્ડકોટ ડી" + - " આઇવરીકુક આઇલેન્ડ્સચિલીકૅમરૂનચીનકોલમ્બિયાક્લિપરટન આઇલેન્ડકોસ્ટા રિકાક્યુ" + - "બાકૅપ વર્ડેક્યુરાસાઓક્રિસમસ આઇલેન્ડસાયપ્રસચેકીયાજર્મનીડિએગો ગારસિઆજીબૌ" + - "ટીડેનમાર્કડોમિનિકાડોમિનિકન રીપબ્લિકઅલ્જીરિયાસ્યુટા અને મેલિલાએક્વાડોરએ" + - "સ્ટોનિયાઇજિપ્તપશ્ચિમી સહારાએરિટ્રિયાસ્પેનઇથિઓપિયાયુરોપિયન સંઘફિનલેન્ડફ" + - "ીજીફૉકલેન્ડ ટાપુઓમાઇક્રોનેશિયાફૅરો ટાપુઓફ્રાંસગેબનયુનાઇટેડ કિંગડમગ્રેન" + - "ેડાજ્યોર્જીયાફ્રેંચ ગયાનાગ્વેર્નસેઘાનાજીબ્રાલ્ટરગ્રીનલેન્ડગેમ્બિયાગિની" + - "ગ્વાડેલોપઇક્વેટોરિયલ ગિનીગ્રીસદક્ષિણ જ્યોર્જીયા અને દક્ષિણ સેન્ડવિચ આઇ" + - "લેન્ડ્સગ્વાટેમાલાગ્વામગિની-બિસાઉગયાનાહોંગકોંગ SAR ચીનહર્ડ અને મેકડોનાલ" + - "્ડ આઇલેન્ડ્સહોન્ડુરસક્રોએશિયાહૈતિહંગેરીકૅનેરી ટાપુઓઇન્ડોનેશિયાઆયર્લેન્" + - "ડઇઝરાઇલઆઈલ ઓફ મૅનભારતબ્રિટિશ ઇન્ડિયન ઓશન ટેરિટરીઇરાકઈરાનઆઇસલેન્ડઇટાલીજ" + - "ર્સીજમૈકાજોર્ડનજાપાનકેન્યાકિર્ગિઝ્સ્તાનકંબોડિયાકિરિબાટીકોમોરસસેન્ટ કિટ" + - "્સ અને નેવિસઉત્તર કોરિયાદક્ષિણ કોરિયાકુવૈતકેમેન ટાપુઓકઝાકિસ્તાનલાઓસલેબ" + - "નોનસેન્ટ લુસિયાલૈચટેંસ્ટેઇનશ્રીલંકાલાઇબેરિયાલેસોથોલિથુઆનિયાલક્ઝમબર્ગલા" + - "ત્વિયાલિબિયામોરોક્કોમોનાકોમોલડોવામૉન્ટેંનેગ્રોસેન્ટ માર્ટિનમેડાગાસ્કરમ" + - "ાર્શલ આઇલેન્ડ્સમેસેડોનિયામાલીમ્યાંમાર (બર્મા)મંગોલિયામકાઉ SAR ચીનઉત્તર" + - "ીય મારિયાના આઇલેન્ડ્સમાર્ટીનીકમૌરિટાનિયામોંટસેરાતમાલ્ટામોરિશિયસમાલદિવ્" + - "સમાલાવીમેક્સિકોમલેશિયામોઝામ્બિકનામિબિયાન્યુ સેલેડોનિયાનાઇજરનોરફૉક ટાપુ" + - "નાઇજીરીયાનિકારાગુઆનેધરલેન્ડનૉર્વેનેપાળનૌરુનીયુન્યુઝીલેન્ડઓમાનપનામાપેરુ" + - "ફ્રેંચ પોલિનેશિયાપાપુઆ ન્યૂ ગિનીફિલીપાઇન્સપાકિસ્તાનપોલેંડસેન્ટ પિયર અન" + - "ે મીક્વેલનપીટકૈર્ન આઇલેન્ડ્સપ્યુઅર્ટો રિકોપેલેસ્ટિનિયન ટેરિટરીપોર્ટુગલ" + - "પલાઉપેરાગ્વેકતારઆઉટલાઈન્ગ ઓશનિયારીયુનિયનરોમાનિયાસર્બિયારશિયારવાંડાસાઉદ" + - "ી અરેબિયાસોલોમન આઇલેન્ડ્સસેશેલ્સસુદાનસ્વીડનસિંગાપુરસેન્ટ હેલેનાસ્લોવેન" + - "િયાસ્વાલબર્ડ અને જેન મેયનસ્લોવેકિયાસીએરા લેઓનસૅન મેરિનોસેનેગલસોમાલિયાસ" + - "ુરીનામદક્ષિણ સુદાનસાઓ ટૉમ અને પ્રિંસિપેએલ સેલ્વાડોરસિંટ માર્ટેનસીરિયાસ" + - "્વાઝિલેન્ડત્રિસ્તાન દા કુન્હાતુર્ક્સ અને કાઇકોસ ટાપુઓચાડફ્રેંચ સદર્ન ટ" + - "ેરિટરીઝટોગોથાઇલેંડતાજીકિસ્તાનટોકેલાઉતિમોર-લેસ્તેતુર્કમેનિસ્તાનટ્યુનિશિ" + - "યાટોંગાતુર્કીટ્રિનીદાદ અને ટોબેગોતુવાલુતાઇવાનતાંઝાનિયાયુક્રેનયુગાંડાસં" + - "યુક્ત રાજ્ય આઉટલાઇંગ આયલેન્ડ્સસંયુક્ત રાષ્ટ્રસંયુકત રાજ્ય અમેરિકાઉરુગ્" + - "વેઉઝ્બેકિસ્તાનવેટિકન સિટીસેન્ટ વિન્સેટ અને ગ્રેનેડીન્સવેનેઝુએલાબ્રિટિશ" + - " વર્જિન ટાપુઓયુ.એસ. વર્જિન ટાપુઓવિયેતનામવાનુઆતુવેલીસ અને ફ્યુટુનાસમોઆકોસ" + - "ોવોયેમેનમેયોટદક્ષિણ આફ્રિકાઝામ્બિયાઝિમ્બાબ્વેઅજ્ઞાત પ્રદેશવિશ્વઆફ્રિકા" + - "ઉત્તર અમેરિકાદક્ષિણ અમેરિકાઓશનિયાપશ્ચિમી આફ્રિકામધ્ય અમેરિકાપૂર્વીય આફ" + - "્રિકાઉત્તરીય આફ્રિકામધ્ય આફ્રિકાસધર્ન આફ્રિકાઅમેરિકાઉત્તરીય અમેરિકાકેર" + - "િબિયનપૂર્વીય એશિયાસર્ધન એશિયાદક્ષિણપૂર્વ એશિયાસધર્ન યુરોપઓસ્ટ્રેલેશિયા" + - "મેલાનેશિયામાઈક્રોનેશિયન ક્ષેત્રપોલિનેશિયાએશિયામધ્ય એશિયાપશ્ચિમી એશિયાય" + - "ુરોપપૂર્વીય યુરોપઉત્તરીય યુરોપપશ્ચિમ યુરોપલેટિન અમેરિકા" - -var guRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x002b, 0x003d, 0x0072, 0x0093, 0x00cb, 0x00e3, 0x00fe, - 0x0119, 0x012b, 0x014f, 0x0170, 0x0192, 0x01ad, 0x01ce, 0x01dd, - 0x01fc, 0x0214, 0x0258, 0x0273, 0x0291, 0x02a9, 0x02ce, 0x02e9, - 0x02fb, 0x0310, 0x031f, 0x034d, 0x0362, 0x0377, 0x038f, 0x03c9, - 0x03de, 0x03f0, 0x03ff, 0x0424, 0x0442, 0x0457, 0x0466, 0x0478, - 0x04b8, 0x04df, 0x0526, 0x0556, 0x0580, 0x05a0, 0x05c5, 0x05d1, - 0x05e3, 0x05ec, 0x0607, 0x0635, 0x0654, 0x0666, 0x067f, 0x069a, - 0x06c5, 0x06da, 0x06ec, 0x06fe, 0x0720, 0x0732, 0x074a, 0x0762, - // Entry 40 - 7F - 0x0793, 0x07ae, 0x07dd, 0x07f5, 0x0810, 0x0822, 0x0847, 0x0862, - 0x0871, 0x0889, 0x08ab, 0x08ab, 0x08c3, 0x08cf, 0x08f7, 0x091e, - 0x093a, 0x094c, 0x0958, 0x0983, 0x099b, 0x09b9, 0x09db, 0x09f6, - 0x0a02, 0x0a20, 0x0a3e, 0x0a56, 0x0a62, 0x0a7d, 0x0aab, 0x0aba, - 0x0b3d, 0x0b5b, 0x0b6a, 0x0b86, 0x0b95, 0x0bbb, 0x0c0c, 0x0c24, - 0x0c3f, 0x0c4b, 0x0c5d, 0x0c7f, 0x0ca0, 0x0cbb, 0x0ccd, 0x0ce7, - 0x0cf3, 0x0d3e, 0x0d4a, 0x0d56, 0x0d6e, 0x0d7d, 0x0d8c, 0x0d9b, - 0x0dad, 0x0dbc, 0x0dce, 0x0df5, 0x0e0d, 0x0e25, 0x0e37, 0x0e70, - // Entry 80 - BF - 0x0e92, 0x0eb7, 0x0ec6, 0x0ee5, 0x0f03, 0x0f0f, 0x0f21, 0x0f43, - 0x0f67, 0x0f7f, 0x0f9a, 0x0fac, 0x0fc7, 0x0fe2, 0x0ffa, 0x100c, - 0x1024, 0x1036, 0x104b, 0x1072, 0x1097, 0x10b5, 0x10e3, 0x1101, - 0x110d, 0x1137, 0x114f, 0x1169, 0x11b3, 0x11ce, 0x11ec, 0x1207, - 0x1219, 0x1231, 0x1249, 0x125b, 0x1273, 0x1288, 0x12a3, 0x12bb, - 0x12e6, 0x12f5, 0x1314, 0x132f, 0x134a, 0x1365, 0x1377, 0x1386, - 0x1392, 0x139e, 0x13bf, 0x13cb, 0x13da, 0x13e6, 0x1417, 0x1440, - 0x145e, 0x1479, 0x148b, 0x14ca, 0x14fe, 0x1526, 0x1560, 0x1578, - // Entry C0 - FF - 0x1584, 0x159c, 0x15a8, 0x15d6, 0x15ee, 0x1606, 0x161b, 0x162a, - 0x163c, 0x1661, 0x168f, 0x16a4, 0x16b3, 0x16c5, 0x16dd, 0x16ff, - 0x171d, 0x1759, 0x1777, 0x1793, 0x17af, 0x17c1, 0x17d9, 0x17ee, - 0x1810, 0x1849, 0x186b, 0x188d, 0x189f, 0x18c0, 0x18f5, 0x1937, - 0x1940, 0x197b, 0x1987, 0x199c, 0x19bd, 0x19d2, 0x19f4, 0x1a1e, - 0x1a3c, 0x1a4b, 0x1a5d, 0x1a95, 0x1aa7, 0x1ab9, 0x1ad4, 0x1ae9, - 0x1afe, 0x1b58, 0x1b83, 0x1bbb, 0x1bd0, 0x1bf4, 0x1c13, 0x1c64, - 0x1c7f, 0x1cb7, 0x1ce8, 0x1d00, 0x1d15, 0x1d47, 0x1d53, 0x1d65, - // Entry 100 - 13F - 0x1d74, 0x1d83, 0x1dab, 0x1dc3, 0x1de1, 0x1e06, 0x1e15, 0x1e2a, - 0x1e4f, 0x1e77, 0x1e89, 0x1eb4, 0x1ed6, 0x1f01, 0x1f2c, 0x1f4e, - 0x1f73, 0x1f88, 0x1fb3, 0x1fcb, 0x1ff0, 0x200f, 0x2040, 0x205f, - 0x2086, 0x20a4, 0x20e1, 0x20ff, 0x210e, 0x212a, 0x214f, 0x215e, - 0x2183, 0x21a8, 0x21ca, 0x21ef, -} // Size: 608 bytes - -const heRegionStr string = "" + // Size: 5025 bytes - "האי אסנשןאנדורהאיחוד האמירויות הערביותאפגניסטןאנטיגואה וברבודהאנגילהאלבנ" + - "יהארמניהאנגולהאנטארקטיקהארגנטינהסמואה האמריקניתאוסטריהאוסטרליהארובהאיי " + - "אולנדאזרבייג׳ןבוסניה והרצגובינהברבדוסבנגלדשבלגיהבורקינה פאסובולגריהבחרי" + - "יןבורונדיבניןסנט ברתולומיאוברמודהברונייבוליביההאיים הקריביים ההולנדייםב" + - "רזילאיי בהאמהבהוטןאיי בובהבוצוואנהבלארוסבליזקנדהאיי קוקוס (קילינג)קונגו" + - " - קינשאסההרפובליקה של מרכז אפריקהקונגו - ברזאוילשווייץחוף השנהבאיי קוקצ" + - "׳ילהקמרוןסיןקולומביההאי קליפרטוןקוסטה ריקהקובהכף ורדהקוראסאוהאי כריסטמס" + - "קפריסיןצ׳כיהגרמניהדייגו גרסיהג׳יבוטידנמרקדומיניקההרפובליקה הדומיניקניתא" + - "לג׳יריהסאוטה ומלייהאקוודוראסטוניהמצריםסהרה המערביתאריתריאהספרדאתיופיההא" + - "יחוד האירופיפינלנדפיג׳יאיי פוקלנדמיקרונזיהאיי פארוצרפתגבוןהממלכה המאוחד" + - "תגרנדהגאורגיהגיאנה הצרפתיתגרנסיגאנהגיברלטרגרינלנדגמביהגינאהגוואדלופגינא" + - "ה המשווניתיווןג׳ורג׳יה הדרומית ואיי סנדוויץ׳ הדרומייםגואטמלהגואםגינאה ב" + - "יסאוגיאנההונג קונג (מחוז מנהלי מיוחד של סין)איי הרד ומקדונלדהונדורסקרוא" + - "טיההאיטיהונגריההאיים הקנרייםאינדונזיהאירלנדישראלהאי מאןהודוהטריטוריה הב" + - "ריטית באוקיינוס ההודיעיראקאיראןאיסלנדאיטליהג׳רסיג׳מייקהירדןיפןקניהקירגי" + - "זסטןקמבודיהקיריבאטיקומורוסנט קיטס ונוויסקוריאה הצפוניתקוריאה הדרומיתכוו" + - "יתאיי קיימןקזחסטןלאוסלבנוןסנט לוסיהליכטנשטייןסרי לנקהליבריהלסוטוליטאלוק" + - "סמבורגלטביהלובמרוקומונקומולדובהמונטנגרוסן מרטןמדגסקראיי מרשלמקדוניהמאלי" + - "מיאנמר (בורמה)מונגוליהמקאו (מחוז מנהלי מיוחד של סין)איי מריאנה הצפוניים" + - "מרטיניקמאוריטניהמונסראטמלטהמאוריציוסהאיים המלדיבייםמלאווימקסיקומלזיהמוז" + - "מביקנמיביהקלדוניה החדשהניז׳ראיי נורפוקניגריהניקרגואההולנדנורווגיהנפאלנא" + - "ורוניווהניו זילנדעומאןפנמהפרופולינזיה הצרפתיתפפואה גינאה החדשההפיליפיני" + - "םפקיסטןפוליןסנט פייר ומיקלוןאיי פיטקרןפוארטו ריקוהשטחים הפלסטינייםפורטו" + - "גלפלאופרגוואיקטארטריטוריות באוקיאניהראוניוןרומניהסרביהרוסיהרואנדהערב הס" + - "עודיתאיי שלמהאיי סיישלסודןשוודיהסינגפורסנט הלנהסלובניהסוולבארד ויאן מאי" + - "יןסלובקיהסיירה לאונהסן מרינוסנגלסומליהסורינםדרום סודןסאו טומה ופרינסיפה" + - "אל סלבדורסנט מארטןסוריהסווזילנדטריסטן דה קונהאיי טורקס וקאיקוסצ׳אדהטריט" + - "וריות הדרומיות של צרפתטוגותאילנדטג׳יקיסטןטוקלאוטימור לסטהטורקמניסטןטוני" + - "סיהטונגהטורקיהטרינידד וטובגוטובאלוטייוואןטנזניהאוקראינהאוגנדההאיים המרו" + - "חקים הקטנים של ארה״בהאומות המאוחדותארצות הבריתאורוגוואיאוזבקיסטןהוותיקן" + - "סנט וינסנט והגרנדיניםונצואלהאיי הבתולה הבריטייםאיי הבתולה של ארצות הברי" + - "תוייטנאםונואטואיי ווליס ופוטונהסמואהקוסובותימןמאיוטדרום אפריקהזמביהזימב" + - "בואהאזור לא ידועהעולםאפריקהצפון אמריקהדרום אמריקהאוקיאניהמערב אפריקהמרכ" + - "ז אמריקהמזרח אפריקהצפון אפריקהמרכז אפריקהדרום יבשת אפריקהאמריקהאמריקה ה" + - "צפוניתהאיים הקריבייםמזרח אסיהדרום אסיהדרום־מזרח אסיהדרום אירופהאוסטרלאס" + - "יהמלנזיהאזור מיקרונזיהפולינזיהאסיהמרכז אסיהמערב אסיהאירופהמזרח אירופהצפ" + - "ון אירופהמערב אירופהאמריקה הלטינית" - -var heRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0011, 0x001d, 0x0049, 0x0059, 0x0078, 0x0084, 0x0090, - 0x009c, 0x00a8, 0x00bc, 0x00cc, 0x00e9, 0x00f7, 0x0107, 0x0111, - 0x0122, 0x0134, 0x0155, 0x0161, 0x016d, 0x0177, 0x018e, 0x019c, - 0x01a8, 0x01b6, 0x01be, 0x01d9, 0x01e5, 0x01f1, 0x01ff, 0x022d, - 0x0237, 0x0248, 0x0252, 0x0261, 0x0271, 0x027d, 0x0285, 0x028d, - 0x02ad, 0x02c8, 0x02f5, 0x0310, 0x031c, 0x032d, 0x033a, 0x0344, - 0x034e, 0x0354, 0x0364, 0x037b, 0x038e, 0x0396, 0x03a3, 0x03b1, - 0x03c6, 0x03d4, 0x03de, 0x03ea, 0x03ff, 0x040d, 0x0417, 0x0427, - // Entry 40 - 7F - 0x0450, 0x0460, 0x0477, 0x0485, 0x0493, 0x049d, 0x04b4, 0x04c4, - 0x04cc, 0x04da, 0x04f5, 0x04f5, 0x0501, 0x050b, 0x051e, 0x0530, - 0x053f, 0x0547, 0x054f, 0x056a, 0x0574, 0x0582, 0x059b, 0x05a5, - 0x05ad, 0x05bb, 0x05c9, 0x05d3, 0x05dd, 0x05ed, 0x0608, 0x0610, - 0x065a, 0x0668, 0x0670, 0x0685, 0x068f, 0x06cd, 0x06eb, 0x06f9, - 0x0707, 0x0711, 0x071f, 0x0738, 0x074a, 0x0756, 0x0760, 0x076d, - 0x0775, 0x07b4, 0x07be, 0x07c8, 0x07d4, 0x07e0, 0x07ea, 0x07f8, - 0x0800, 0x0806, 0x080e, 0x0820, 0x082e, 0x083e, 0x084a, 0x0866, - // Entry 80 - BF - 0x0881, 0x089c, 0x08a6, 0x08b7, 0x08c3, 0x08cb, 0x08d5, 0x08e6, - 0x08fa, 0x0909, 0x0915, 0x091f, 0x0927, 0x0939, 0x0943, 0x0949, - 0x0953, 0x095d, 0x096b, 0x097b, 0x0988, 0x0994, 0x09a3, 0x09b1, - 0x09b9, 0x09d2, 0x09e2, 0x0a17, 0x0a3b, 0x0a49, 0x0a5b, 0x0a69, - 0x0a71, 0x0a83, 0x0aa0, 0x0aac, 0x0ab8, 0x0ac2, 0x0ad0, 0x0adc, - 0x0af5, 0x0aff, 0x0b12, 0x0b1e, 0x0b2e, 0x0b38, 0x0b48, 0x0b50, - 0x0b5a, 0x0b64, 0x0b75, 0x0b7f, 0x0b87, 0x0b8d, 0x0bac, 0x0bcc, - 0x0be0, 0x0bec, 0x0bf6, 0x0c14, 0x0c27, 0x0c3c, 0x0c5d, 0x0c6b, - // Entry C0 - FF - 0x0c73, 0x0c81, 0x0c89, 0x0cae, 0x0cbc, 0x0cc8, 0x0cd2, 0x0cdc, - 0x0ce8, 0x0cfd, 0x0d0c, 0x0d1d, 0x0d25, 0x0d31, 0x0d3f, 0x0d4e, - 0x0d5c, 0x0d80, 0x0d8e, 0x0da3, 0x0db2, 0x0dba, 0x0dc6, 0x0dd2, - 0x0de3, 0x0e05, 0x0e16, 0x0e27, 0x0e31, 0x0e41, 0x0e5b, 0x0e7b, - 0x0e83, 0x0eb6, 0x0ebe, 0x0eca, 0x0edc, 0x0ee8, 0x0efb, 0x0f0f, - 0x0f1d, 0x0f27, 0x0f33, 0x0f4e, 0x0f5a, 0x0f68, 0x0f74, 0x0f84, - 0x0f90, 0x0fc8, 0x0fe5, 0x0ffa, 0x100c, 0x101e, 0x102c, 0x1054, - 0x1062, 0x1086, 0x10b4, 0x10c2, 0x10ce, 0x10ee, 0x10f8, 0x1104, - // Entry 100 - 13F - 0x110c, 0x1116, 0x112b, 0x1135, 0x1145, 0x115b, 0x1165, 0x1171, - 0x1186, 0x119b, 0x11ab, 0x11c0, 0x11d5, 0x11ea, 0x11ff, 0x1214, - 0x1232, 0x123e, 0x1259, 0x1274, 0x1285, 0x1296, 0x12b1, 0x12c6, - 0x12da, 0x12e6, 0x1301, 0x1311, 0x1319, 0x132a, 0x133b, 0x1347, - 0x135c, 0x1371, 0x1386, 0x13a1, -} // Size: 608 bytes - -const hiRegionStr string = "" + // Size: 8753 bytes - "असेंशन द्वीपएंडोरासंयुक्त अरब अमीरातअफ़गानिस्तानएंटिगुआ और बरबुडाएंग्विल" + - "ाअल्बानियाआर्मेनियाअंगोलाअंटार्कटिकाअर्जेंटीनाअमेरिकी समोआऑस्ट्रियाऑस्" + - "ट्रेलियाअरूबाएलैंड द्वीपसमूहअज़रबैजानबोस्निया और हर्ज़ेगोविनाबारबाडोसब" + - "ांग्लादेशबेल्जियमबुर्किना फ़ासोबुल्गारियाबहरीनबुरुंडीबेनिनसेंट बार्थेल" + - "ेमीबरमूडाब्रूनेईबोलीवियाकैरिबियन नीदरलैंडब्राज़ीलबहामासभूटानबोवेत द्वी" + - "पबोत्स्वानाबेलारूसबेलीज़कनाडाकोकोस (कीलिंग) द्वीपसमूहकांगो - किंशासामध" + - "्य अफ़्रीकी गणराज्यकांगो – ब्राज़ाविलस्विट्ज़रलैंडकोट डी आइवरकुक द्वीप" + - "समूहचिलीकैमरूनचीनकोलंबियाक्लिपर्टन द्वीपकोस्टारिकाक्यूबाकेप वर्डक्यूरा" + - "साओक्रिसमस द्वीपसाइप्रसचेकियाजर्मनीडिएगो गार्सियाजिबूतीडेनमार्कडोमिनिक" + - "ाडोमिनिकन गणराज्यअल्जीरियासेउटा और मेलिलाइक्वाडोरएस्टोनियामिस्रपश्चिमी" + - " सहाराइरिट्रियास्पेनइथियोपियायूरोपीय संघफ़िनलैंडफ़िजीफ़ॉकलैंड द्वीपसमूहम" + - "ाइक्रोनेशियाफ़ेरो द्वीपसमूहफ़्रांसगैबॉनयूनाइटेड किंगडमग्रेनाडाजॉर्जिया" + - "फ़्रेंच गयानागर्नसीघानाजिब्राल्टरग्रीनलैंडगाम्बियागिनीग्वाडेलूपइक्वेटो" + - "रियल गिनीयूनानदक्षिण जॉर्जिया और दक्षिण सैंडविच द्वीपसमूहग्वाटेमालागुआ" + - "मगिनी-बिसाउगयानाहाँग काँग (चीन विशेष प्रशासनिक क्षेत्र)हर्ड द्वीप और म" + - "ैकडोनॉल्ड द्वीपसमूहहोंडूरासक्रोएशियाहैतीहंगरीकैनेरी द्वीपसमूहइंडोनेशिय" + - "ाआयरलैंडइज़राइलआइल ऑफ़ मैनभारतब्रिटिश हिंद महासागरीय क्षेत्रइराकईरानआइ" + - "सलैंडइटलीजर्सीजमैकाजॉर्डनजापानकेन्याकिर्गिज़स्तानकंबोडियाकिरिबातीकोमोर" + - "ोससेंट किट्स और नेविसउत्तर कोरियादक्षिण कोरियाकुवैतकेमैन द्वीपसमूहकज़ा" + - "खस्तानलाओसलेबनानसेंट लूसियालिचेंस्टीनश्रीलंकालाइबेरियालेसोथोलिथुआनियाल" + - "ग्ज़मबर्गलातवियालीबियामोरक्कोमोनाकोमॉल्डोवामोंटेनेग्रोसेंट मार्टिनमेडा" + - "गास्करमार्शल द्वीपसमूहमैसिडोनियामालीम्यांमार (बर्मा)मंगोलियामकाऊ (विशे" + - "ष प्रशासनिक क्षेत्र चीन)उत्तरी मारियाना द्वीपसमूहमार्टीनिकमॉरिटानियामो" + - "ंटसेरातमाल्टामॉरिशसमालदीवमलावीमैक्सिकोमलेशियामोज़ांबिकनामीबियान्यू कैल" + - "ेडोनियानाइजरनॉरफ़ॉक द्वीपनाइजीरियानिकारागुआनीदरलैंडनॉर्वेनेपालनाउरुनीय" + - "ून्यूज़ीलैंडओमानपनामापेरूफ़्रेंच पोलिनेशियापापुआ न्यू गिनीफ़िलिपींसपाक" + - "िस्तानपोलैंडसेंट पिएरे और मिक्वेलानपिटकैर्न द्वीपसमूहपोर्टो रिकोफ़िलिस" + - "्तीनी क्षेत्रपुर्तगालपलाऊपेराग्वेक़तरआउटलाइंग ओशिनियारियूनियनरोमानियास" + - "र्बियारूसरवांडासऊदी अरबसोलोमन द्वीपसमूहसेशेल्ससूडानस्वीडनसिंगापुरसेंट " + - "हेलेनास्लोवेनियास्वालबार्ड और जान मायेनस्लोवाकियासिएरा लियोनसैन मेरीनो" + - "सेनेगलसोमालियासूरीनामदक्षिण सूडानसाओ टोम और प्रिंसिपेअल सल्वाडोरसिंट म" + - "ार्टिनसीरियास्वाज़ीलैंडत्रिस्टान डा कुनातुर्क और कैकोज़ द्वीपसमूहचाडफ़" + - "्रांसीसी दक्षिणी क्षेत्रटोगोथाईलैंडताज़िकिस्तानतोकेलाउतिमोर-लेस्ततुर्क" + - "मेनिस्तानट्यूनीशियाटोंगातुर्कीत्रिनिदाद और टोबैगोतुवालूताइवानतंज़ानिया" + - "यूक्रेनयुगांडायू.एस. आउटलाइंग द्वीपसमूहसंयुक्त राष्ट्रसंयुक्त राज्यउरू" + - "ग्वेउज़्बेकिस्तानवेटिकन सिटीसेंट विंसेंट और ग्रेनाडाइंसवेनेज़ुएलाब्रिट" + - "िश वर्जिन द्वीपसमूहयू.एस. वर्जिन द्वीपसमूहवियतनामवनुआतूवालिस और फ़्यूच" + - "ूनासमोआकोसोवोयमनमायोतेदक्षिण अफ़्रीकाज़ाम्बियाज़िम्बाब्वेअज्ञात क्षेत्" + - "रविश्वअफ़्रीकाउत्तर अमेरिकादक्षिण अमेरिकाओशिआनियापश्चिमी अफ़्रीकामध्य " + - "अमेरिकापूर्वी अफ़्रीकाउत्तरी अफ़्रीकामध्य अफ़्रीकादक्षिणी अफ़्रीकाअमेर" + - "िकाज़उत्तरी अमेरिकाकैरिबियनपूर्वी एशियादक्षिणी एशियादक्षिण-पूर्व एशिया" + - "दक्षिणी यूरोपऑस्ट्रेलेशियामेलानेशियामाइक्रोनेशियाई क्षेत्रपोलीनेशियाएश" + - "ियामध्य एशियापश्चिमी एशियायूरोपपूर्वी यूरोपउत्तरी यूरोपपश्चिमी यूरोपलै" + - "टिन अमेरिका" - -var hiRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0022, 0x0034, 0x0066, 0x008a, 0x00b9, 0x00d1, 0x00ec, - 0x0107, 0x0119, 0x013a, 0x0158, 0x017a, 0x0195, 0x01b6, 0x01c5, - 0x01f0, 0x020b, 0x024f, 0x0267, 0x0285, 0x029d, 0x02c5, 0x02e3, - 0x02f2, 0x0307, 0x0316, 0x0341, 0x0353, 0x0368, 0x0380, 0x03b1, - 0x03c9, 0x03db, 0x03ea, 0x0409, 0x0427, 0x043c, 0x044e, 0x045d, - 0x049d, 0x04c4, 0x04ff, 0x0531, 0x0558, 0x0575, 0x059a, 0x05a6, - 0x05b8, 0x05c1, 0x05d9, 0x0604, 0x0622, 0x0634, 0x064a, 0x0665, - 0x068a, 0x069f, 0x06b1, 0x06c3, 0x06eb, 0x06fd, 0x0715, 0x072d, - // Entry 40 - 7F - 0x075b, 0x0776, 0x079f, 0x07b7, 0x07d2, 0x07e1, 0x0806, 0x0821, - 0x0830, 0x084b, 0x086a, 0x086a, 0x0882, 0x0891, 0x08c5, 0x08ec, - 0x0917, 0x092c, 0x093b, 0x0966, 0x097e, 0x0996, 0x09bb, 0x09cd, - 0x09d9, 0x09f7, 0x0a12, 0x0a2a, 0x0a36, 0x0a51, 0x0a7f, 0x0a8e, - 0x0b05, 0x0b23, 0x0b2f, 0x0b4b, 0x0b5a, 0x0bc1, 0x0c1f, 0x0c37, - 0x0c52, 0x0c5e, 0x0c6d, 0x0c9b, 0x0cb9, 0x0cce, 0x0ce3, 0x0d00, - 0x0d0c, 0x0d60, 0x0d6c, 0x0d78, 0x0d8d, 0x0d99, 0x0da8, 0x0db7, - 0x0dc9, 0x0dd8, 0x0dea, 0x0e11, 0x0e29, 0x0e41, 0x0e56, 0x0e89, - // Entry 80 - BF - 0x0eab, 0x0ed0, 0x0edf, 0x0f0a, 0x0f28, 0x0f34, 0x0f46, 0x0f65, - 0x0f83, 0x0f9b, 0x0fb6, 0x0fc8, 0x0fe3, 0x1001, 0x1016, 0x1028, - 0x103d, 0x104f, 0x1067, 0x1088, 0x10aa, 0x10c8, 0x10f6, 0x1114, - 0x1120, 0x114a, 0x1162, 0x11bc, 0x1203, 0x121e, 0x123c, 0x1257, - 0x1269, 0x127b, 0x128d, 0x129c, 0x12b4, 0x12c9, 0x12e4, 0x12fc, - 0x1327, 0x1336, 0x135b, 0x1376, 0x1391, 0x13a9, 0x13bb, 0x13ca, - 0x13d9, 0x13e5, 0x1406, 0x1412, 0x1421, 0x142d, 0x1461, 0x148a, - 0x14a5, 0x14c0, 0x14d2, 0x1511, 0x1545, 0x1564, 0x159b, 0x15b3, - // Entry C0 - FF - 0x15bf, 0x15d7, 0x15e3, 0x1611, 0x1629, 0x1641, 0x1656, 0x165f, - 0x1671, 0x1687, 0x16b5, 0x16ca, 0x16d9, 0x16eb, 0x1703, 0x1722, - 0x1740, 0x177f, 0x179d, 0x17bc, 0x17d8, 0x17ea, 0x1802, 0x1817, - 0x1839, 0x186f, 0x188e, 0x18b0, 0x18c2, 0x18e3, 0x1912, 0x1957, - 0x1960, 0x19aa, 0x19b6, 0x19cb, 0x19ef, 0x1a04, 0x1a23, 0x1a4d, - 0x1a6b, 0x1a7a, 0x1a8c, 0x1ac1, 0x1ad3, 0x1ae5, 0x1b00, 0x1b15, - 0x1b2a, 0x1b6d, 0x1b98, 0x1bbd, 0x1bd2, 0x1bf9, 0x1c18, 0x1c63, - 0x1c81, 0x1cc5, 0x1d02, 0x1d17, 0x1d29, 0x1d5b, 0x1d67, 0x1d79, - // Entry 100 - 13F - 0x1d82, 0x1d94, 0x1dbf, 0x1dda, 0x1dfb, 0x1e23, 0x1e32, 0x1e4a, - 0x1e6f, 0x1e97, 0x1eaf, 0x1edd, 0x1eff, 0x1f2a, 0x1f55, 0x1f7a, - 0x1fa8, 0x1fc3, 0x1feb, 0x2003, 0x2025, 0x204a, 0x207c, 0x20a1, - 0x20c8, 0x20e6, 0x2126, 0x2144, 0x2153, 0x216f, 0x2194, 0x21a3, - 0x21c5, 0x21e7, 0x220c, 0x2231, -} // Size: 608 bytes - -const hrRegionStr string = "" + // Size: 3132 bytes - "Otok AscensionAndoraUjedinjeni Arapski EmiratiAfganistanAntigva i Barbud" + - "aAngvilaAlbanijaArmenijaAngolaAntarktikaArgentinaAmerička SamoaAustrijaA" + - "ustralijaArubaÅlandski otociAzerbajdžanBosna i HercegovinaBarbadosBangla" + - "dešBelgijaBurkina FasoBugarskaBahreinBurundiBeninSaint BarthélemyBermudi" + - "BrunejBolivijaKaripski otoci NizozemskeBrazilBahamiButanOtok BouvetBocva" + - "naBjelorusijaBelizeKanadaKokosovi (Keelingovi) otociKongo - KinshasaSred" + - "njoafrička RepublikaKongo - BrazzavilleŠvicarskaObala BjelokostiCookovi " + - "OtociČileKamerunKinaKolumbijaOtok ClippertonKostarikaKubaZelenortska Rep" + - "ublikaCuraçaoBožićni otokCiparČeškaNjemačkaDiego GarciaDžibutiDanskaDomi" + - "nikaDominikanska RepublikaAlžirCeuta i MelillaEkvadorEstonijaEgipatZapad" + - "na SaharaEritrejaŠpanjolskaEtiopijaEuropska unijaFinskaFidžiFalklandski " + - "otociMikronezijaFarski otociFrancuskaGabonUjedinjeno KraljevstvoGrenadaG" + - "ruzijaFrancuska GijanaGuernseyGanaGibraltarGrenlandGambijaGvinejaGuadalu" + - "peEkvatorska GvinejaGrčkaJužna Georgija i Južni Sendvički OtociGvatemala" + - "GuamGvineja BisauGvajanaPUP Hong Kong KinaOtoci Heard i McDonaldHonduras" + - "HrvatskaHaitiMađarskaKanarski otociIndonezijaIrskaIzraelOtok ManIndijaBr" + - "itanski Indijskooceanski teritorijIrakIranIslandItalijaJerseyJamajkaJord" + - "anJapanKenijaKirgistanKambodžaKiribatiKomoriSveti Kristofor i NevisSjeve" + - "rna KorejaJužna KorejaKuvajtKajmanski otociKazahstanLaosLibanonSveta Luc" + - "ijaLihtenštajnŠri LankaLiberijaLesotoLitvaLuksemburgLatvijaLibijaMarokoM" + - "onakoMoldavijaCrna GoraSaint MartinMadagaskarMaršalovi OtociMakedonijaMa" + - "liMjanmar (Burma)MongolijaPUP Makao KinaSjevernomarijanski otociMartiniq" + - "ueMauretanijaMontserratMaltaMauricijusMaldiviMalaviMeksikoMalezijaMozamb" + - "ikNamibijaNova KaledonijaNigerOtok NorfolkNigerijaNikaragvaNizozemskaNor" + - "veškaNepalNauruNiueNovi ZelandOmanPanamaPeruFrancuska PolinezijaPapua No" + - "va GvinejaFilipiniPakistanPoljskaSaint-Pierre-et-MiquelonOtoci PitcairnP" + - "ortorikoPalestinsko PodručjePortugalPalauParagvajKatarVanjska područja O" + - "ceanijeRéunionRumunjskaSrbijaRusijaRuandaSaudijska ArabijaSalomonski Oto" + - "ciSejšeliSudanŠvedskaSingapurSveta HelenaSlovenijaSvalbard i Jan MayenSl" + - "ovačkaSijera LeoneSan MarinoSenegalSomalijaSurinamJužni SudanSveti Toma " + - "i PrincipSalvadorSint MaartenSirijaSvaziTristan da CunhaOtoci Turks i Ca" + - "icosČadFrancuski južni i antarktički teritorijiTogoTajlandTadžikistanTok" + - "elauTimor-LesteTurkmenistanTunisTongaTurskaTrinidad i TobagoTuvaluTajvan" + - "TanzanijaUkrajinaUgandaMali udaljeni otoci SAD-aUjedinjeni narodiSjedinj" + - "ene Američke DržaveUrugvajUzbekistanVatikanski GradSveti Vincent i Grena" + - "diniVenezuelaBritanski Djevičanski otociAmerički Djevičanski otociVijetn" + - "amVanuatuWallis i FutunaSamoaKosovoJemenMayotteJužnoafrička RepublikaZam" + - "bijaZimbabvenepoznato područjeSvijetAfrikaSjevernoamerički kontinentJužn" + - "a AmerikaOceanijaZapadna AfrikaCentralna AmerikaIstočna AfrikaSjeverna A" + - "frikaSredišnja AfrikaJužna AfrikaAmerikeSjeverna AmerikaKaribiIstočna Az" + - "ijaJužna AzijaJugoistočna AzijaJužna EuropaAustralazijaMelanezijaMikrone" + - "zijsko područjePolinezijaAzijaSrednja AzijaZapadna AzijaEuropaIstočna Eu" + - "ropaSjeverna EuropaZapadna EuropaLatinska Amerika" - -var hrRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000e, 0x0014, 0x002e, 0x0038, 0x0049, 0x0050, 0x0058, - 0x0060, 0x0066, 0x0070, 0x0079, 0x0088, 0x0090, 0x009a, 0x009f, - 0x00ae, 0x00ba, 0x00cd, 0x00d5, 0x00df, 0x00e6, 0x00f2, 0x00fa, - 0x0101, 0x0108, 0x010d, 0x011e, 0x0125, 0x012b, 0x0133, 0x014c, - 0x0152, 0x0158, 0x015d, 0x0168, 0x016f, 0x017a, 0x0180, 0x0186, - 0x01a1, 0x01b1, 0x01ca, 0x01dd, 0x01e7, 0x01f7, 0x0204, 0x0209, - 0x0210, 0x0214, 0x021d, 0x022c, 0x0235, 0x0239, 0x024e, 0x0256, - 0x0264, 0x0269, 0x0270, 0x0279, 0x0285, 0x028d, 0x0293, 0x029b, - // Entry 40 - 7F - 0x02b1, 0x02b7, 0x02c6, 0x02cd, 0x02d5, 0x02db, 0x02e9, 0x02f1, - 0x02fc, 0x0304, 0x0312, 0x0312, 0x0318, 0x031e, 0x032f, 0x033a, - 0x0346, 0x034f, 0x0354, 0x036a, 0x0371, 0x0378, 0x0388, 0x0390, - 0x0394, 0x039d, 0x03a5, 0x03ac, 0x03b3, 0x03bc, 0x03ce, 0x03d4, - 0x03fd, 0x0406, 0x040a, 0x0417, 0x041e, 0x0430, 0x0446, 0x044e, - 0x0456, 0x045b, 0x0464, 0x0472, 0x047c, 0x0481, 0x0487, 0x048f, - 0x0495, 0x04b9, 0x04bd, 0x04c1, 0x04c7, 0x04ce, 0x04d4, 0x04db, - 0x04e1, 0x04e6, 0x04ec, 0x04f5, 0x04fe, 0x0506, 0x050c, 0x0523, - // Entry 80 - BF - 0x0532, 0x053f, 0x0545, 0x0554, 0x055d, 0x0561, 0x0568, 0x0574, - 0x0580, 0x058a, 0x0592, 0x0598, 0x059d, 0x05a7, 0x05ae, 0x05b4, - 0x05ba, 0x05c0, 0x05c9, 0x05d2, 0x05de, 0x05e8, 0x05f8, 0x0602, - 0x0606, 0x0615, 0x061e, 0x062c, 0x0644, 0x064e, 0x0659, 0x0663, - 0x0668, 0x0672, 0x0679, 0x067f, 0x0686, 0x068e, 0x0696, 0x069e, - 0x06ad, 0x06b2, 0x06be, 0x06c6, 0x06cf, 0x06d9, 0x06e2, 0x06e7, - 0x06ec, 0x06f0, 0x06fb, 0x06ff, 0x0705, 0x0709, 0x071d, 0x072f, - 0x0737, 0x073f, 0x0746, 0x075e, 0x076c, 0x0775, 0x078a, 0x0792, - // Entry C0 - FF - 0x0797, 0x079f, 0x07a4, 0x07be, 0x07c6, 0x07cf, 0x07d5, 0x07db, - 0x07e1, 0x07f2, 0x0802, 0x080a, 0x080f, 0x0817, 0x081f, 0x082b, - 0x0834, 0x0848, 0x0851, 0x085d, 0x0867, 0x086e, 0x0876, 0x087d, - 0x0889, 0x089d, 0x08a5, 0x08b1, 0x08b7, 0x08bc, 0x08cc, 0x08e0, - 0x08e4, 0x090e, 0x0912, 0x0919, 0x0925, 0x092c, 0x0937, 0x0943, - 0x0948, 0x094d, 0x0953, 0x0964, 0x096a, 0x0970, 0x0979, 0x0981, - 0x0987, 0x09a0, 0x09b1, 0x09cd, 0x09d4, 0x09de, 0x09ed, 0x0a06, - 0x0a0f, 0x0a2b, 0x0a47, 0x0a4f, 0x0a56, 0x0a65, 0x0a6a, 0x0a70, - // Entry 100 - 13F - 0x0a75, 0x0a7c, 0x0a94, 0x0a9b, 0x0aa3, 0x0ab6, 0x0abc, 0x0ac2, - 0x0add, 0x0aeb, 0x0af3, 0x0b01, 0x0b12, 0x0b21, 0x0b30, 0x0b41, - 0x0b4e, 0x0b55, 0x0b65, 0x0b6b, 0x0b79, 0x0b85, 0x0b97, 0x0ba4, - 0x0bb0, 0x0bba, 0x0bd1, 0x0bdb, 0x0be0, 0x0bed, 0x0bfa, 0x0c00, - 0x0c0f, 0x0c1e, 0x0c2c, 0x0c3c, -} // Size: 608 bytes - -const huRegionStr string = "" + // Size: 3325 bytes - "Ascension-szigetAndorraEgyesült Arab EmírségekAfganisztánAntigua és Barb" + - "udaAnguillaAlbániaÖrményországAngolaAntarktiszArgentínaAmerikai SzamoaAu" + - "sztriaAusztráliaArubaÅland-szigetekAzerbajdzsánBosznia-HercegovinaBarbad" + - "osBangladesBelgiumBurkina FasoBulgáriaBahreinBurundiBeninSaint-Barthélem" + - "yBermudaBruneiBolíviaHolland Karib-térségBrazíliaBahama-szigetekBhutánBo" + - "uvet-szigetBotswanaBelaruszBelizeKanadaKókusz (Keeling)-szigetekKongó - " + - "KinshasaKözép-afrikai KöztársaságKongó - BrazzavilleSvájcElefántcsontpar" + - "tCook-szigetekChileKamerunKínaKolumbiaClipperton-szigetCosta RicaKubaZöl" + - "d-foki KöztársaságCuraçaoKarácsony-szigetCiprusCsehországNémetországDieg" + - "o GarciaDzsibutiDániaDominikaDominikai KöztársaságAlgériaCeuta és Melill" + - "aEcuadorÉsztországEgyiptomNyugat-SzaharaEritreaSpanyolországEtiópiaEuróp" + - "ai UnióFinnországFidzsiFalkland-szigetekMikronéziaFeröer-szigetekFrancia" + - "országGabonEgyesült KirályságGrenadaGrúziaFrancia GuyanaGuernseyGhánaGib" + - "raltárGrönlandGambiaGuineaGuadeloupeEgyenlítői-GuineaGörögországDéli-Geo" + - "rgia és Déli-Sandwich-szigetekGuatemalaGuamBissau-GuineaGuyanaHongkong K" + - "KTHeard-sziget és McDonald-szigetekHondurasHorvátországHaitiMagyarország" + - "Kanári-szigetekIndonéziaÍrországIzraelMan-szigetIndiaBrit Indiai-óceáni " + - "TerületIrakIránIzlandOlaszországJerseyJamaicaJordániaJapánKenyaKirgizisz" + - "tánKambodzsaKiribatiComore-szigetekSaint Kitts és NevisÉszak-KoreaDél-Ko" + - "reaKuvaitKajmán-szigetekKazahsztánLaoszLibanonSaint LuciaLiechtensteinSr" + - "í LankaLibériaLesothoLitvániaLuxemburgLettországLíbiaMarokkóMonacoMoldo" + - "vaMontenegróSaint MartinMadagaszkárMarshall-szigetekMacedóniaMaliMianmar" + - " (Burma)MongóliaMakaó KKTÉszaki Mariana-szigetekMartiniqueMauritániaMont" + - "serratMáltaMauritiusMaldív-szigetekMalawiMexikóMalajziaMozambikNamíbiaÚj" + - "-KaledóniaNigerNorfolk-szigetNigériaNicaraguaHollandiaNorvégiaNepálNauru" + - "NiueÚj-ZélandOmánPanamaPeruFrancia PolinéziaPápua Új-GuineaFülöp-szigete" + - "kPakisztánLengyelországSaint-Pierre és MiquelonPitcairn-szigetekPuerto R" + - "icoPalesztin TerületPortugáliaPalauParaguayKatarKülső-ÓceániaRéunionRomá" + - "niaSzerbiaOroszországRuandaSzaúd-ArábiaSalamon-szigetekSeychelle-szigete" + - "kSzudánSvédországSzingapúrSzent IlonaSzlovéniaSvalbard és Jan MayenSzlov" + - "ákiaSierra LeoneSan MarinoSzenegálSzomáliaSurinameDél-SzudánSao Tomé és" + - " PríncipeSalvadorSint MaartenSzíriaSzváziföldTristan da CunhaTurks- és C" + - "aicos-szigetekCsádFrancia Déli TerületekTogoThaiföldTádzsikisztánTokelau" + - "Kelet-TimorTürkmenisztánTunéziaTongaTörökországTrinidad és TobagoTuvaluT" + - "ajvanTanzániaUkrajnaUgandaAz Amerikai Egyesült Államok lakatlan külbirto" + - "kaiENSZEgyesült ÁllamokUruguayÜzbegisztánVatikánSaint Vincent és a Grena" + - "dine-szigetekVenezuelaBrit Virgin-szigetekAmerikai Virgin-szigetekVietna" + - "mVanuatuWallis és FutunaSzamoaKoszovóJemenMayotteDél-afrikai Köztársaság" + - "ZambiaZimbabweIsmeretlen körzetVilágAfrikaÉszak-AmerikaDél-AmerikaÓceáni" + - "aNyugat-AfrikaKözép-AmerikaKelet-AfrikaÉszak-AfrikaKözép-AfrikaAfrika dé" + - "li részeAmerikaAmerika északi részeKarib-térségKelet-ÁzsiaDél-ÁzsiaDélke" + - "let-ÁzsiaDél-EurópaAusztrálázsiaMelanéziaMikronéziai régióPolinéziaÁzsia" + - "Közép-ÁzsiaNyugat-ÁzsiaEurópaKelet-EurópaÉszak-EurópaNyugat-EurópaLatin-" + - "Amerika" - -var huRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0017, 0x0031, 0x003d, 0x0050, 0x0058, 0x0060, - 0x006f, 0x0075, 0x007f, 0x0089, 0x0098, 0x00a0, 0x00ab, 0x00b0, - 0x00bf, 0x00cc, 0x00df, 0x00e7, 0x00f0, 0x00f7, 0x0103, 0x010c, - 0x0113, 0x011a, 0x011f, 0x0130, 0x0137, 0x013d, 0x0145, 0x015b, - 0x0164, 0x0173, 0x017a, 0x0187, 0x018f, 0x0197, 0x019d, 0x01a3, - 0x01bd, 0x01ce, 0x01ec, 0x0200, 0x0206, 0x0217, 0x0224, 0x0229, - 0x0230, 0x0235, 0x023d, 0x024e, 0x0258, 0x025c, 0x0275, 0x027d, - 0x028e, 0x0294, 0x029f, 0x02ac, 0x02b8, 0x02c0, 0x02c6, 0x02ce, - // Entry 40 - 7F - 0x02e6, 0x02ee, 0x02ff, 0x0306, 0x0312, 0x031a, 0x0328, 0x032f, - 0x033d, 0x0345, 0x0353, 0x0353, 0x035e, 0x0364, 0x0375, 0x0380, - 0x0390, 0x039e, 0x03a3, 0x03b8, 0x03bf, 0x03c6, 0x03d4, 0x03dc, - 0x03e2, 0x03ec, 0x03f5, 0x03fb, 0x0401, 0x040b, 0x041e, 0x042c, - 0x0455, 0x045e, 0x0462, 0x046f, 0x0475, 0x0481, 0x04a3, 0x04ab, - 0x04b9, 0x04be, 0x04cb, 0x04db, 0x04e5, 0x04ef, 0x04f5, 0x04ff, - 0x0504, 0x0521, 0x0525, 0x052a, 0x0530, 0x053c, 0x0542, 0x0549, - 0x0552, 0x0558, 0x055d, 0x056a, 0x0573, 0x057b, 0x058a, 0x059f, - // Entry 80 - BF - 0x05ab, 0x05b5, 0x05bb, 0x05cb, 0x05d6, 0x05db, 0x05e2, 0x05ed, - 0x05fa, 0x0604, 0x060c, 0x0613, 0x061c, 0x0625, 0x0630, 0x0636, - 0x063e, 0x0644, 0x064b, 0x0656, 0x0662, 0x066e, 0x067f, 0x0689, - 0x068d, 0x069c, 0x06a5, 0x06af, 0x06c7, 0x06d1, 0x06dc, 0x06e6, - 0x06ec, 0x06f5, 0x0705, 0x070b, 0x0712, 0x071a, 0x0722, 0x072a, - 0x0738, 0x073d, 0x074b, 0x0753, 0x075c, 0x0765, 0x076e, 0x0774, - 0x0779, 0x077d, 0x0788, 0x078d, 0x0793, 0x0797, 0x07a9, 0x07ba, - 0x07ca, 0x07d4, 0x07e2, 0x07fb, 0x080c, 0x0817, 0x0829, 0x0834, - // Entry C0 - FF - 0x0839, 0x0841, 0x0846, 0x0857, 0x085f, 0x0867, 0x086e, 0x087a, - 0x0880, 0x088e, 0x089e, 0x08b0, 0x08b7, 0x08c3, 0x08cd, 0x08d8, - 0x08e2, 0x08f8, 0x0902, 0x090e, 0x0918, 0x0921, 0x092a, 0x0932, - 0x093e, 0x0955, 0x095d, 0x0969, 0x0970, 0x097c, 0x098c, 0x09a6, - 0x09ab, 0x09c3, 0x09c7, 0x09d0, 0x09df, 0x09e6, 0x09f1, 0x0a00, - 0x0a08, 0x0a0d, 0x0a1b, 0x0a2e, 0x0a34, 0x0a3a, 0x0a43, 0x0a4a, - 0x0a50, 0x0a84, 0x0a88, 0x0a9a, 0x0aa1, 0x0aae, 0x0ab6, 0x0adc, - 0x0ae5, 0x0af9, 0x0b11, 0x0b18, 0x0b1f, 0x0b30, 0x0b36, 0x0b3e, - // Entry 100 - 13F - 0x0b43, 0x0b4a, 0x0b65, 0x0b6b, 0x0b73, 0x0b85, 0x0b8b, 0x0b91, - 0x0b9f, 0x0bab, 0x0bb4, 0x0bc1, 0x0bd0, 0x0bdc, 0x0be9, 0x0bf7, - 0x0c0a, 0x0c11, 0x0c27, 0x0c35, 0x0c41, 0x0c4c, 0x0c5c, 0x0c68, - 0x0c77, 0x0c81, 0x0c95, 0x0c9f, 0x0ca5, 0x0cb3, 0x0cc0, 0x0cc7, - 0x0cd4, 0x0ce2, 0x0cf0, 0x0cfd, -} // Size: 608 bytes - -const hyRegionStr string = "" + // Size: 6248 bytes - "Համբարձման կղզիԱնդորրաԱրաբական Միացյալ ԷմիրություններԱֆղանստանԱնտիգուա և" + - " ԲարբուդաԱնգուիլաԱլբանիաՀայաստանԱնգոլաԱնտարկտիդաԱրգենտինաԱմերիկյան Սամոա" + - "ԱվստրիաԱվստրալիաԱրուբաԱլանդյան կղզիներԱդրբեջանԲոսնիա և ՀերցեգովինաԲարբա" + - "դոսԲանգլադեշԲելգիաԲուրկինա ՖասոԲուլղարիաԲահրեյնԲուրունդիԲենինՍեն Բարտել" + - "միԲերմուդներԲրունեյԲոլիվիաԿարիբյան ՆիդեռլանդներԲրազիլիաԲահամաներԲութանԲ" + - "ուվե կղզիԲոթսվանաԲելառուսԲելիզԿանադաԿոկոսյան (Քիլինգ) կղզիներԿոնգո - Կի" + - "նշասաԿենտրոնական Աֆրիկյան ՀանրապետությունԿոնգո - ԲրազավիլՇվեյցարիաԿոտ դ" + - "’ԻվուարԿուկի կղզիներՉիլիԿամերունՉինաստանԿոլումբիաՔլիփերթոն կղզիԿոստա Ռ" + - "իկաԿուբաԿաբո ՎերդեԿյուրասաոՍուրբ Ծննդյան կղզիԿիպրոսՉեխիաԳերմանիաԴիեգո Գ" + - "արսիաՋիբութիԴանիաԴոմինիկաԴոմինիկյան ՀանրապետությունԱլժիրՍեուտա և Մելիլյ" + - "աԷկվադորԷստոնիաԵգիպտոսԱրևմտյան ՍահարաԷրիթրեաԻսպանիաԵթովպիաԵվրոպական Միո" + - "ւթյունՖինլանդիաՖիջիՖոլքլենդյան կղզիներՄիկրոնեզիաՖարերյան կղզիներՖրանսիա" + - "ԳաբոնՄիացյալ ԹագավորությունԳրենադաՎրաստանՖրանսիական ԳվիանաԳերնսիԳանաՋիբ" + - "րալթարԳրենլանդիաԳամբիաԳվինեաԳվադելուպաՀասարակածային ԳվինեաՀունաստանՀարա" + - "վային Ջորջիա և Հարավային Սենդվիչյան կղզիներԳվատեմալաԳուամԳվինեա-Բիսսաու" + - "ԳայանաՀոնկոնգի ՀՎՇՀերդ կղզի և ՄակԴոնալդի կղզիներՀոնդուրասԽորվաթիաՀայիթի" + - "ՀունգարիաԿանարյան կղզիներԻնդոնեզիաԻռլանդիաԻսրայելՄեն կղզիՀնդկաստանԲրիտա" + - "նական Տարածք Հնդկական ՕվկիանոսումԻրաքԻրանԻսլանդիաԻտալիաՋերսիՃամայկաՀորդ" + - "անանՃապոնիաՔենիաՂրղզստանԿամբոջաԿիրիբատիԿոմորյան կղզիներՍենտ Քիտս և Նևիս" + - "Հյուսիսային ԿորեաՀարավային ԿորեաՔուվեյթԿայմանյան կղզիներՂազախստանԼաոսԼի" + - "բանանՍենթ ԼյուսիաԼիխտենշտեյնՇրի ԼանկաԼիբերիաԼեսոտոԼիտվաԼյուքսեմբուրգԼատ" + - "վիաԼիբիաՄարոկկոՄոնակոՄոլդովաՉեռնոգորիաՍեն ՄարտենՄադագասկարՄարշալյան կղզ" + - "իներՄակեդոնիաՄալիՄյանմա (Բիրմա)ՄոնղոլիաՉինաստանի Մակաո ՀՎՇՀյուսիսային Մ" + - "արիանյան կղզիներՄարտինիկաՄավրիտանիաՄոնսեռատՄալթաՄավրիկիոսՄալդիվներՄալավ" + - "իՄեքսիկաՄալայզիաՄոզամբիկՆամիբիաՆոր ԿալեդոնիաՆիգերՆորֆոլկ կղզիՆիգերիաՆիկ" + - "արագուաՆիդեռլանդներՆորվեգիաՆեպալՆաուրուՆիուեՆոր ԶելանդիաՕմանՊանամաՊերու" + - "Ֆրանսիական ՊոլինեզիաՊապուա Նոր ԳվինեաՖիլիպիններՊակիստանԼեհաստանՍեն Պիեռ" + - " և ՄիքելոնՊիտկեռն կղզիներՊուերտո ՌիկոՊաղեստինյան տարածքներՊորտուգալիաՊալ" + - "աուՊարագվայԿատարԱրտաքին ՕվկիանիաՌեյունիոնՌումինիաՍերբիաՌուսաստանՌուանդա" + - "Սաուդյան ԱրաբիաՍողոմոնյան կղզիներՍեյշելներՍուդանՇվեդիաՍինգապուրՍուրբ Հե" + - "ղինեի կղզիՍլովենիաՍվալբարդ և Յան ՄայենՍլովակիաՍիեռա ԼեոնեՍան ՄարինոՍենե" + - "գալՍոմալիՍուրինամՀարավային ՍուդանՍան Տոմե և ՓրինսիպիՍալվադորՍինտ Մարտեն" + - "ՍիրիաՍվազիլենդՏրիստան դա ԿունյաԹըրքս և Կայկոս կղզիներՉադՖրանսիական Հարա" + - "վային ՏարածքներՏոգոԹայլանդՏաջիկստանՏոկելաուԹիմոր ԼեշտիԹուրքմենստանԹունի" + - "սՏոնգաԹուրքիաՏրինիդադ և ՏոբագոՏուվալուԹայվանՏանզանիաՈւկրաինաՈւգանդաԱրտա" + - "քին կղզիներ (ԱՄՆ)Միավորված ազգերի կազմակերպությունՄիացյալ ՆահանգներՈւրո" + - "ւգվայՈւզբեկստանՎատիկանՍենթ Վինսենթ և ԳրենադիններՎենեսուելաԲրիտանական Վի" + - "րջինյան կղզիներԱՄՆ Վիրջինյան կղզիներՎիետնամՎանուատուՈւոլիս և ՖուտունաՍա" + - "մոաԿոսովոԵմենՄայոտՀարավաֆրիկյան ՀանրապետությունԶամբիաԶիմբաբվեԱնհայտ տար" + - "ածաշրջանԱշխարհԱֆրիկաՀյուսիսային ԱմերիկաՀարավային ԱմերիկաՕվկիանիաԱրևմտյա" + - "ն ԱֆրիկաԿենտրոնական ԱմերիկաԱրևելյան ԱֆրիկաՀյուսիսային ԱֆրիկաԿենտրոնական" + - " ԱֆրիկաՀարավային ԱֆրիկաԱմերիկաՀյուսիսային Ամերիկա - ԱՄՆ և ԿանադաԿարիբներ" + - "Արևելյան ԱսիաՀարավային ԱսիաՀարավարևելյան ԱսիաՀարավային ԵվրոպաԱվստրալասի" + - "աՄելանեզիաՄիկրոնեզյան տարածաշրջանՊոլինեզիաԱսիաԿենտրոնական ԱսիաԱրևմտյան " + - "ԱսիաԵվրոպաԱրևելյան ԵվրոպաՀյուսիսային ԵվրոպաԱրևմտյան ԵվրոպաԼատինական Ամե" + - "րիկա" - -var hyRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001d, 0x002b, 0x0067, 0x0079, 0x009d, 0x00ad, 0x00bb, - 0x00cb, 0x00d7, 0x00eb, 0x00fd, 0x011a, 0x0128, 0x013a, 0x0146, - 0x0165, 0x0175, 0x019b, 0x01ab, 0x01bd, 0x01c9, 0x01e2, 0x01f4, - 0x0202, 0x0214, 0x021e, 0x0235, 0x0249, 0x0257, 0x0265, 0x028e, - 0x029e, 0x02b0, 0x02bc, 0x02cf, 0x02df, 0x02ef, 0x02f9, 0x0305, - 0x0333, 0x034e, 0x0394, 0x03b1, 0x03c3, 0x03db, 0x03f4, 0x03fc, - 0x040c, 0x041c, 0x042e, 0x0449, 0x045c, 0x0466, 0x0479, 0x048b, - 0x04ad, 0x04b9, 0x04c3, 0x04d3, 0x04ea, 0x04f8, 0x0502, 0x0512, - // Entry 40 - 7F - 0x0545, 0x054f, 0x056d, 0x057b, 0x0589, 0x0597, 0x05b4, 0x05c2, - 0x05d0, 0x05de, 0x0603, 0x0603, 0x0615, 0x061d, 0x0642, 0x0656, - 0x0675, 0x0683, 0x068d, 0x06b8, 0x06c6, 0x06d4, 0x06f5, 0x0701, - 0x0709, 0x071b, 0x072f, 0x073b, 0x0747, 0x075b, 0x0782, 0x0794, - 0x07ed, 0x07ff, 0x0809, 0x0824, 0x0830, 0x0847, 0x087f, 0x0891, - 0x08a1, 0x08ad, 0x08bf, 0x08de, 0x08f0, 0x0900, 0x090e, 0x091d, - 0x092f, 0x0978, 0x0980, 0x0988, 0x0998, 0x09a4, 0x09ae, 0x09bc, - 0x09cc, 0x09da, 0x09e4, 0x09f4, 0x0a02, 0x0a12, 0x0a31, 0x0a4e, - // Entry 80 - BF - 0x0a6f, 0x0a8c, 0x0a9a, 0x0abb, 0x0acd, 0x0ad5, 0x0ae3, 0x0afa, - 0x0b10, 0x0b21, 0x0b2f, 0x0b3b, 0x0b45, 0x0b5f, 0x0b6b, 0x0b75, - 0x0b83, 0x0b8f, 0x0b9d, 0x0bb1, 0x0bc4, 0x0bd8, 0x0bf9, 0x0c0b, - 0x0c13, 0x0c2c, 0x0c3c, 0x0c60, 0x0c98, 0x0caa, 0x0cbe, 0x0cce, - 0x0cd8, 0x0cea, 0x0cfc, 0x0d08, 0x0d16, 0x0d26, 0x0d36, 0x0d44, - 0x0d5d, 0x0d67, 0x0d7e, 0x0d8c, 0x0da0, 0x0db8, 0x0dc8, 0x0dd2, - 0x0de0, 0x0dea, 0x0e01, 0x0e09, 0x0e15, 0x0e1f, 0x0e46, 0x0e66, - 0x0e7a, 0x0e8a, 0x0e9a, 0x0ebb, 0x0ed8, 0x0eef, 0x0f18, 0x0f2e, - // Entry C0 - FF - 0x0f3a, 0x0f4a, 0x0f54, 0x0f73, 0x0f85, 0x0f95, 0x0fa1, 0x0fb3, - 0x0fc1, 0x0fde, 0x1001, 0x1013, 0x101f, 0x102b, 0x103d, 0x105f, - 0x106f, 0x1094, 0x10a4, 0x10b9, 0x10cc, 0x10da, 0x10e6, 0x10f6, - 0x1115, 0x1138, 0x1148, 0x115d, 0x1167, 0x1179, 0x1199, 0x11c2, - 0x11c8, 0x1202, 0x120a, 0x1218, 0x122a, 0x123a, 0x124f, 0x1267, - 0x1273, 0x127d, 0x128b, 0x12ab, 0x12bb, 0x12c7, 0x12d7, 0x12e7, - 0x12f5, 0x131b, 0x135b, 0x137c, 0x138e, 0x13a2, 0x13b0, 0x13e1, - 0x13f5, 0x142b, 0x1453, 0x1461, 0x1473, 0x1493, 0x149d, 0x14a9, - // Entry 100 - 13F - 0x14b1, 0x14bb, 0x14f4, 0x1500, 0x1510, 0x1533, 0x153f, 0x154b, - 0x1570, 0x1591, 0x15a1, 0x15be, 0x15e3, 0x1600, 0x1623, 0x1646, - 0x1665, 0x1673, 0x16b1, 0x16c1, 0x16da, 0x16f5, 0x1718, 0x1737, - 0x174d, 0x175f, 0x178c, 0x179e, 0x17a6, 0x17c5, 0x17de, 0x17ea, - 0x1807, 0x182a, 0x1847, 0x1868, -} // Size: 608 bytes - -const idRegionStr string = "" + // Size: 3068 bytes - "Pulau AscensionAndorraUni Emirat ArabAfganistanAntigua dan BarbudaAnguil" + - "laAlbaniaArmeniaAngolaAntartikaArgentinaSamoa AmerikaAustriaAustraliaAru" + - "baKepulauan AlandAzerbaijanBosnia dan HerzegovinaBarbadosBangladeshBelgi" + - "aBurkina FasoBulgariaBahrainBurundiBeninSaint BarthélemyBermudaBruneiBol" + - "iviaKaribia BelandaBrasilBahamaBhutanPulau BouvetBotswanaBelarusBelizeKa" + - "nadaKepulauan Cocos (Keeling)Kongo - KinshasaRepublik Afrika TengahKongo" + - " - BrazzavilleSwissCote d’IvoireKepulauan CookCileKamerunTiongkokKolombi" + - "aPulau ClippertonKosta RikaKubaTanjung VerdeCuraçaoPulau ChristmasSiprus" + - "CheskaJermanDiego GarciaJibutiDenmarkDominikaRepublik DominikaAljazairCe" + - "uta dan MelillaEkuadorEstoniaMesirSahara BaratEritreaSpanyolEtiopiaUni E" + - "ropaFinlandiaFijiKepulauan MalvinasMikronesiaKepulauan FaroePrancisGabon" + - "Inggris RayaGrenadaGeorgiaGuyana PrancisGuernseyGhanaGibraltarGrinlandia" + - "GambiaGuineaGuadeloupeGuinea EkuatorialYunaniGeorgia Selatan & Kep. Sand" + - "wich SelatanGuatemalaGuamGuinea-BissauGuyanaHong Kong SAR TiongkokPulau " + - "Heard dan Kepulauan McDonaldHondurasKroasiaHaitiHungariaKepulauan Canary" + - "IndonesiaIrlandiaIsraelPulau ManIndiaWilayah Inggris di Samudra HindiaIr" + - "akIranIslandiaItaliaJerseyJamaikaYordaniaJepangKenyaKirgistanKambojaKiri" + - "batiKomoroSaint Kitts dan NevisKorea UtaraKorea SelatanKuwaitKepulauan C" + - "aymanKazakstanLaosLebanonSaint LuciaLiechtensteinSri LankaLiberiaLesotho" + - "LituaniaLuksemburgLatviaLibiaMarokoMonakoMoldovaMontenegroSaint MartinMa" + - "dagaskarKepulauan MarshallMakedoniaMaliMyanmar (Burma)MongoliaMakau SAR " + - "TiongkokKepulauan Mariana UtaraMartinikMauritaniaMontserratMaltaMauritiu" + - "sMaladewaMalawiMeksikoMalaysiaMozambikNamibiaKaledonia BaruNigerKepulaua" + - "n NorfolkNigeriaNikaraguaBelandaNorwegiaNepalNauruNiueSelandia BaruOmanP" + - "anamaPeruPolinesia PrancisPapua NuginiFilipinaPakistanPolandiaSaint Pier" + - "re dan MiquelonKepulauan PitcairnPuerto RikoWilayah PalestinaPortugalPal" + - "auParaguayQatarOseania LuarRéunionRumaniaSerbiaRusiaRwandaArab SaudiKepu" + - "lauan SolomonSeychellesSudanSwediaSingapuraSaint HelenaSloveniaKepulauan" + - " Svalbard dan Jan MayenSlovakiaSierra LeoneSan MarinoSenegalSomaliaSurin" + - "ameSudan SelatanSao Tome dan PrincipeEl SalvadorSint MaartenSuriahSwazil" + - "andTristan da CunhaKepulauan Turks dan CaicosCadWilayah Kutub Selatan Pr" + - "ancisTogoThailandTajikistanTokelauTimor LesteTurkimenistanTunisiaTongaTu" + - "rkiTrinidad dan TobagoTuvaluTaiwanTanzaniaUkrainaUgandaKepulauan Terluar" + - " A.S.Perserikatan Bangsa-BangsaAmerika SerikatUruguayUzbekistanVatikanSa" + - "int Vincent dan GrenadinesVenezuelaKepulauan Virgin InggrisKepulauan Vir" + - "gin A.S.VietnamVanuatuKepulauan Wallis dan FutunaSamoaKosovoYamanMayotte" + - "Afrika SelatanZambiaZimbabweWilayah Tidak DikenalDuniaAfrikaAmerika Utar" + - "aAmerika SelatanOseaniaAfrika Bagian BaratAmerika TengahAfrika Bagian Ti" + - "murAfrika Bagian UtaraAfrika Bagian TengahAfrika Bagian SelatanAmerikaAm" + - "erika Bagian UtaraKepulauan KaribiaAsia Bagian TimurAsia Bagian SelatanA" + - "sia TenggaraEropa Bagian SelatanAustralasiaMelanesiaWilayah MikronesiaPo" + - "linesiaAsiaAsia TengahAsia Bagian BaratEropaEropa Bagian TimurEropa Bagi" + - "an UtaraEropa Bagian BaratAmerika Latin" - -var idRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x0016, 0x0025, 0x002f, 0x0042, 0x004a, 0x0051, - 0x0058, 0x005e, 0x0067, 0x0070, 0x007d, 0x0084, 0x008d, 0x0092, - 0x00a1, 0x00ab, 0x00c1, 0x00c9, 0x00d3, 0x00d9, 0x00e5, 0x00ed, - 0x00f4, 0x00fb, 0x0100, 0x0111, 0x0118, 0x011e, 0x0125, 0x0134, - 0x013a, 0x0140, 0x0146, 0x0152, 0x015a, 0x0161, 0x0167, 0x016d, - 0x0186, 0x0196, 0x01ac, 0x01bf, 0x01c4, 0x01d3, 0x01e1, 0x01e5, - 0x01ec, 0x01f4, 0x01fc, 0x020c, 0x0216, 0x021a, 0x0227, 0x022f, - 0x023e, 0x0244, 0x024a, 0x0250, 0x025c, 0x0262, 0x0269, 0x0271, - // Entry 40 - 7F - 0x0282, 0x028a, 0x029b, 0x02a2, 0x02a9, 0x02ae, 0x02ba, 0x02c1, - 0x02c8, 0x02cf, 0x02d8, 0x02d8, 0x02e1, 0x02e5, 0x02f7, 0x0301, - 0x0310, 0x0317, 0x031c, 0x0328, 0x032f, 0x0336, 0x0344, 0x034c, - 0x0351, 0x035a, 0x0364, 0x036a, 0x0370, 0x037a, 0x038b, 0x0391, - 0x03b8, 0x03c1, 0x03c5, 0x03d2, 0x03d8, 0x03ee, 0x0410, 0x0418, - 0x041f, 0x0424, 0x042c, 0x043c, 0x0445, 0x044d, 0x0453, 0x045c, - 0x0461, 0x0482, 0x0486, 0x048a, 0x0492, 0x0498, 0x049e, 0x04a5, - 0x04ad, 0x04b3, 0x04b8, 0x04c1, 0x04c8, 0x04d0, 0x04d6, 0x04eb, - // Entry 80 - BF - 0x04f6, 0x0503, 0x0509, 0x0519, 0x0522, 0x0526, 0x052d, 0x0538, - 0x0545, 0x054e, 0x0555, 0x055c, 0x0564, 0x056e, 0x0574, 0x0579, - 0x057f, 0x0585, 0x058c, 0x0596, 0x05a2, 0x05ac, 0x05be, 0x05c7, - 0x05cb, 0x05da, 0x05e2, 0x05f4, 0x060b, 0x0613, 0x061d, 0x0627, - 0x062c, 0x0635, 0x063d, 0x0643, 0x064a, 0x0652, 0x065a, 0x0661, - 0x066f, 0x0674, 0x0685, 0x068c, 0x0695, 0x069c, 0x06a4, 0x06a9, - 0x06ae, 0x06b2, 0x06bf, 0x06c3, 0x06c9, 0x06cd, 0x06de, 0x06ea, - 0x06f2, 0x06fa, 0x0702, 0x071b, 0x072d, 0x0738, 0x0749, 0x0751, - // Entry C0 - FF - 0x0756, 0x075e, 0x0763, 0x076f, 0x0777, 0x077e, 0x0784, 0x0789, - 0x078f, 0x0799, 0x07aa, 0x07b4, 0x07b9, 0x07bf, 0x07c8, 0x07d4, - 0x07dc, 0x07fc, 0x0804, 0x0810, 0x081a, 0x0821, 0x0828, 0x0830, - 0x083d, 0x0852, 0x085d, 0x0869, 0x086f, 0x0878, 0x0888, 0x08a2, - 0x08a5, 0x08c2, 0x08c6, 0x08ce, 0x08d8, 0x08df, 0x08ea, 0x08f7, - 0x08fe, 0x0903, 0x0908, 0x091b, 0x0921, 0x0927, 0x092f, 0x0936, - 0x093c, 0x0952, 0x096c, 0x097b, 0x0982, 0x098c, 0x0993, 0x09af, - 0x09b8, 0x09d0, 0x09e5, 0x09ec, 0x09f3, 0x0a0e, 0x0a13, 0x0a19, - // Entry 100 - 13F - 0x0a1e, 0x0a25, 0x0a33, 0x0a39, 0x0a41, 0x0a56, 0x0a5b, 0x0a61, - 0x0a6e, 0x0a7d, 0x0a84, 0x0a97, 0x0aa5, 0x0ab8, 0x0acb, 0x0adf, - 0x0af4, 0x0afb, 0x0b0f, 0x0b20, 0x0b31, 0x0b44, 0x0b51, 0x0b65, - 0x0b70, 0x0b79, 0x0b8b, 0x0b94, 0x0b98, 0x0ba3, 0x0bb4, 0x0bb9, - 0x0bcb, 0x0bdd, 0x0bef, 0x0bfc, -} // Size: 608 bytes - -const isRegionStr string = "" + // Size: 3329 bytes - "Ascension-eyjaAndorraSameinuðu arabísku furstadæminAfganistanAntígva og " + - "BarbúdaAngvillaAlbaníaArmeníaAngólaSuðurskautslandiðArgentínaBandaríska " + - "SamóaAusturríkiÁstralíaArúbaÁlandseyjarAserbaídsjanBosnía og Hersegóvína" + - "BarbadosBangladessBelgíaBúrkína FasóBúlgaríaBareinBúrúndíBenínSankti Bar" + - "tólómeusareyjarBermúdaeyjarBrúneiBólivíaKaríbahafshluti HollandsBrasilía" + - "BahamaeyjarBútanBouveteyjaBotsvanaHvíta-RússlandBelísKanadaKókoseyjar (K" + - "eeling)Kongó-KinshasaMið-AfríkulýðveldiðKongó-BrazzavilleSvissFílabeinss" + - "tröndinCooks-eyjarSíleKamerúnKínaKólumbíaClipperton-eyjaKostaríkaKúbaGræ" + - "nhöfðaeyjarCuracaoJólaeyKýpurTékklandÞýskalandDiego GarciaDjíbútíDanmörk" + - "DóminíkaDóminíska lýðveldiðAlsírCeuta og MelillaEkvadorEistlandEgyptalan" + - "dVestur-SaharaErítreaSpánnEþíópíaEvrópusambandiðFinnlandFídjíeyjarFalkla" + - "ndseyjarMíkrónesíaFæreyjarFrakklandGabonBretlandGrenadaGeorgíaFranska Gv" + - "æjanaGuernseyGanaGíbraltarGrænlandGambíaGíneaGvadelúpeyjarMiðbaugs-Gíne" + - "aGrikklandSuður-Georgía og Suður-SandvíkureyjarGvatemalaGvamGínea-BissáG" + - "væjanaSjálfstjórnarsvæðið Hong KongHeard og McDonaldseyjarHondúrasKróatí" + - "aHaítíUngverjalandKanaríeyjarIndónesíaÍrlandÍsraelMönIndlandBresku Indla" + - "ndshafseyjarÍrakÍranÍslandÍtalíaJerseyJamaíkaJórdaníaJapanKeníaKirgistan" + - "KambódíaKíribatíKómoreyjarSankti Kitts og NevisNorður-KóreaSuður-KóreaKú" + - "veitCaymaneyjarKasakstanLaosLíbanonSankti LúsíaLiechtensteinSrí LankaLíb" + - "eríaLesótóLitháenLúxemborgLettlandLíbíaMarokkóMónakóMoldóvaSvartfjallala" + - "ndSt. MartinMadagaskarMarshalleyjarMakedóníaMalíMjanmar (Búrma)MongólíaS" + - "jálfstjórnarsvæðið MakaóNorður-MaríanaeyjarMartiníkMáritaníaMontserratMa" + - "ltaMáritíusMaldíveyjarMalavíMexíkóMalasíaMósambíkNamibíaNýja-KaledóníaNí" + - "gerNorfolkeyjaNígeríaNíkaragvaHollandNoregurNepalNárúNiueNýja-SjálandÓma" + - "nPanamaPerúFranska PólýnesíaPapúa Nýja-GíneaFilippseyjarPakistanPóllandS" + - "ankti Pierre og MiquelonPitcairn-eyjarPúertó RíkóHeimastjórnarsvæði Pale" + - "stínumannaPortúgalPaláParagvæKatarYtri EyjaálfaRéunionRúmeníaSerbíaRússl" + - "andRúandaSádi-ArabíaSalómonseyjarSeychelles-eyjarSúdanSvíþjóðSingapúrSan" + - "kti HelenaSlóveníaSvalbarði og Jan MayenSlóvakíaSíerra LeóneSan MarínóSe" + - "negalSómalíaSúrínamSuður-SúdanSaó Tóme og PrinsípeEl SalvadorSankti Mart" + - "inSýrlandSvasílandTristan da CunhaTurks- og CaicoseyjarTsjadFrönsku suðl" + - "ægu landsvæðinTógóTaílandTadsjikistanTókeláTímor-LesteTúrkmenistanTúnis" + - "TongaTyrklandTrínidad og TóbagóTúvalúTaívanTansaníaÚkraínaÚgandaSmáeyjar" + - " BandaríkjannaSameinuðu þjóðirnarBandaríkinÚrúgvæÚsbekistanVatíkaniðSank" + - "ti Vinsent og GrenadíneyjarVenesúelaBresku JómfrúaeyjarBandarísku Jómfrú" + - "aeyjarVíetnamVanúatúWallis- og FútúnaeyjarSamóaKósóvóJemenMayotteSuður-A" + - "fríkaSambíaSimbabveÓþekkt svæðiHeimurinnAfríkaNorður-AmeríkaSuður-Amerík" + - "aEyjaálfaVestur-AfríkaMið-AmeríkaAustur-AfríkaNorður-AfríkaMið-AfríkaSuð" + - "urhluti AfríkuAmeríkaAmeríka norðan MexikóKaríbahafiðAustur-AsíaSuður-As" + - "íaSuðaustur-AsíaSuður-EvrópaÁstralasíaMelanesíaMíkrónesíusvæðiðPólýnesí" + - "aAsíaMið-AsíaVestur-AsíaEvrópaAustur-EvrópaNorður-EvrópaVestur-EvrópaRóm" + - "anska Ameríka" - -var isRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000e, 0x0015, 0x0036, 0x0040, 0x0054, 0x005c, 0x0064, - 0x006c, 0x0073, 0x0086, 0x0090, 0x00a2, 0x00ad, 0x00b7, 0x00bd, - 0x00c9, 0x00d6, 0x00ee, 0x00f6, 0x0100, 0x0107, 0x0116, 0x0120, - 0x0126, 0x0130, 0x0136, 0x0151, 0x015e, 0x0165, 0x016e, 0x0187, - 0x0190, 0x019b, 0x01a1, 0x01ab, 0x01b3, 0x01c3, 0x01c9, 0x01cf, - 0x01e4, 0x01f3, 0x020b, 0x021d, 0x0222, 0x0235, 0x0240, 0x0245, - 0x024d, 0x0252, 0x025c, 0x026b, 0x0275, 0x027a, 0x028b, 0x0292, - 0x0299, 0x029f, 0x02a8, 0x02b3, 0x02bf, 0x02c9, 0x02d1, 0x02db, - // Entry 40 - 7F - 0x02f3, 0x02f9, 0x0309, 0x0310, 0x0318, 0x0322, 0x032f, 0x0337, - 0x033d, 0x0348, 0x0359, 0x0359, 0x0361, 0x036d, 0x037b, 0x0388, - 0x0391, 0x039a, 0x039f, 0x03a7, 0x03ae, 0x03b6, 0x03c6, 0x03ce, - 0x03d2, 0x03dc, 0x03e5, 0x03ec, 0x03f2, 0x0400, 0x0410, 0x0419, - 0x0442, 0x044b, 0x044f, 0x045c, 0x0464, 0x0486, 0x049d, 0x04a6, - 0x04af, 0x04b6, 0x04c2, 0x04ce, 0x04d9, 0x04e0, 0x04e7, 0x04eb, - 0x04f2, 0x050a, 0x050f, 0x0514, 0x051b, 0x0523, 0x0529, 0x0531, - 0x053b, 0x0540, 0x0546, 0x054f, 0x0559, 0x0563, 0x056e, 0x0583, - // Entry 80 - BF - 0x0591, 0x059e, 0x05a5, 0x05b0, 0x05b9, 0x05bd, 0x05c5, 0x05d3, - 0x05e0, 0x05ea, 0x05f3, 0x05fb, 0x0603, 0x060d, 0x0615, 0x061c, - 0x0624, 0x062c, 0x0634, 0x0643, 0x064d, 0x0657, 0x0664, 0x066f, - 0x0674, 0x0684, 0x068e, 0x06ad, 0x06c2, 0x06cb, 0x06d6, 0x06e0, - 0x06e5, 0x06ef, 0x06fb, 0x0702, 0x070a, 0x0712, 0x071c, 0x0724, - 0x0735, 0x073b, 0x0746, 0x074f, 0x0759, 0x0760, 0x0767, 0x076c, - 0x0772, 0x0776, 0x0784, 0x0789, 0x078f, 0x0794, 0x07a8, 0x07bb, - 0x07c7, 0x07cf, 0x07d7, 0x07f0, 0x07fe, 0x080d, 0x0832, 0x083b, - // Entry C0 - FF - 0x0840, 0x0848, 0x084d, 0x085b, 0x0863, 0x086c, 0x0873, 0x087c, - 0x0883, 0x0890, 0x089e, 0x08ae, 0x08b4, 0x08bf, 0x08c8, 0x08d5, - 0x08df, 0x08f6, 0x0900, 0x090e, 0x091a, 0x0921, 0x092a, 0x0933, - 0x0940, 0x0957, 0x0962, 0x096f, 0x0977, 0x0981, 0x0991, 0x09a6, - 0x09ab, 0x09ca, 0x09d0, 0x09d8, 0x09e4, 0x09ec, 0x09f8, 0x0a05, - 0x0a0b, 0x0a10, 0x0a18, 0x0a2d, 0x0a35, 0x0a3c, 0x0a45, 0x0a4e, - 0x0a55, 0x0a6d, 0x0a84, 0x0a8f, 0x0a98, 0x0aa3, 0x0aae, 0x0ace, - 0x0ad8, 0x0aed, 0x0b07, 0x0b0f, 0x0b18, 0x0b30, 0x0b36, 0x0b3f, - // Entry 100 - 13F - 0x0b44, 0x0b4b, 0x0b59, 0x0b60, 0x0b68, 0x0b78, 0x0b81, 0x0b88, - 0x0b98, 0x0ba7, 0x0bb0, 0x0bbe, 0x0bcb, 0x0bd9, 0x0be8, 0x0bf4, - 0x0c07, 0x0c0f, 0x0c27, 0x0c34, 0x0c40, 0x0c4c, 0x0c5c, 0x0c6a, - 0x0c76, 0x0c80, 0x0c96, 0x0ca2, 0x0ca7, 0x0cb1, 0x0cbd, 0x0cc4, - 0x0cd2, 0x0ce1, 0x0cef, 0x0d01, -} // Size: 608 bytes - -const itRegionStr string = "" + // Size: 3030 bytes - "Isola AscensioneAndorraEmirati Arabi UnitiAfghanistanAntigua e BarbudaAn" + - "guillaAlbaniaArmeniaAngolaAntartideArgentinaSamoa americaneAustriaAustra" + - "liaArubaIsole ÅlandAzerbaigianBosnia ed ErzegovinaBarbadosBangladeshBelg" + - "ioBurkina FasoBulgariaBahreinBurundiBeninSaint-BarthélemyBermudaBruneiBo" + - "liviaCaraibi olandesiBrasileBahamasBhutanIsola BouvetBotswanaBielorussia" + - "BelizeCanadaIsole Cocos (Keeling)Congo - KinshasaRepubblica Centrafrican" + - "aCongo-BrazzavilleSvizzeraCosta d’AvorioIsole CookCileCamerunCinaColombi" + - "aIsola di ClippertonCosta RicaCubaCapo VerdeCuraçaoIsola ChristmasCiproC" + - "èchiaGermaniaDiego GarciaGibutiDanimarcaDominicaRepubblica DominicanaAl" + - "geriaCeuta e MelillaEcuadorEstoniaEgittoSahara occidentaleEritreaSpagnaE" + - "tiopiaUnione EuropeaFinlandiaFigiIsole FalklandMicronesiaIsole Fær ØerFr" + - "anciaGabonRegno UnitoGrenadaGeorgiaGuyana franceseGuernseyGhanaGibilterr" + - "aGroenlandiaGambiaGuineaGuadalupaGuinea EquatorialeGreciaGeorgia del Sud" + - " e Sandwich australiGuatemalaGuamGuinea-BissauGuyanaRAS di Hong KongIsol" + - "e Heard e McDonaldHondurasCroaziaHaitiUngheriaIsole CanarieIndonesiaIrla" + - "ndaIsraeleIsola di ManIndiaTerritorio britannico dell’Oceano IndianoIraq" + - "IranIslandaItaliaJerseyGiamaicaGiordaniaGiapponeKenyaKirghizistanCambogi" + - "aKiribatiComoreSaint Kitts e NevisCorea del NordCorea del SudKuwaitIsole" + - " CaymanKazakistanLaosLibanoSaint LuciaLiechtensteinSri LankaLiberiaLesot" + - "hoLituaniaLussemburgoLettoniaLibiaMaroccoMonacoMoldaviaMontenegroSaint M" + - "artinMadagascarIsole MarshallRepubblica di MacedoniaMaliMyanmar (Birmani" + - "a)MongoliaRAS di MacaoIsole Marianne settentrionaliMartinicaMauritaniaMo" + - "ntserratMaltaMauritiusMaldiveMalawiMessicoMalaysiaMozambicoNamibiaNuova " + - "CaledoniaNigerIsola NorfolkNigeriaNicaraguaPaesi BassiNorvegiaNepalNauru" + - "NiueNuova ZelandaOmanPanamáPerùPolinesia francesePapua Nuova GuineaFilip" + - "pinePakistanPoloniaSaint Pierre e MiquelonIsole PitcairnPortoricoTerrito" + - "ri palestinesiPortogalloPalauParaguayQatarOceania lontanaRiunioneRomania" + - "SerbiaRussiaRuandaArabia SauditaIsole SalomoneSeychellesSudanSveziaSinga" + - "poreSant’ElenaSloveniaSvalbard e Jan MayenSlovacchiaSierra LeoneSan Mari" + - "noSenegalSomaliaSurinameSud SudanSão Tomé e PríncipeEl SalvadorSint Maar" + - "tenSiriaSwazilandTristan da CunhaIsole Turks e CaicosCiadTerre australi " + - "francesiTogoThailandiaTagikistanTokelauTimor EstTurkmenistanTunisiaTonga" + - "TurchiaTrinidad e TobagoTuvaluTaiwanTanzaniaUcrainaUgandaAltre isole ame" + - "ricane del Pacificonazioni uniteStati UnitiUruguayUzbekistanCittà del Va" + - "ticanoSaint Vincent e GrenadinesVenezuelaIsole Vergini BritannicheIsole " + - "Vergini AmericaneVietnamVanuatuWallis e FutunaSamoaKosovoYemenMayotteSud" + - "africaZambiaZimbabweRegione sconosciutaMondoAfricaNord AmericaAmerica de" + - "l SudOceaniaAfrica occidentaleAmerica CentraleAfrica orientaleNordafrica" + - "Africa centraleAfrica del SudAmericheAmerica del NordCaraibiAsia orienta" + - "leAsia del SudSud-est asiaticoEuropa meridionaleAustralasiaMelanesiaRegi" + - "one micronesianaPolinesiaAsiaAsia centraleAsia occidentaleEuropaEuropa o" + - "rientaleEuropa settentrionaleEuropa occidentaleAmerica Latina" - -var itRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0017, 0x002a, 0x0035, 0x0046, 0x004e, 0x0055, - 0x005c, 0x0062, 0x006b, 0x0074, 0x0083, 0x008a, 0x0093, 0x0098, - 0x00a4, 0x00af, 0x00c3, 0x00cb, 0x00d5, 0x00db, 0x00e7, 0x00ef, - 0x00f6, 0x00fd, 0x0102, 0x0113, 0x011a, 0x0120, 0x0127, 0x0137, - 0x013e, 0x0145, 0x014b, 0x0157, 0x015f, 0x016a, 0x0170, 0x0176, - 0x018b, 0x019b, 0x01b3, 0x01c4, 0x01cc, 0x01dc, 0x01e6, 0x01ea, - 0x01f1, 0x01f5, 0x01fd, 0x0210, 0x021a, 0x021e, 0x0228, 0x0230, - 0x023f, 0x0244, 0x024b, 0x0253, 0x025f, 0x0265, 0x026e, 0x0276, - // Entry 40 - 7F - 0x028b, 0x0292, 0x02a1, 0x02a8, 0x02af, 0x02b5, 0x02c7, 0x02ce, - 0x02d4, 0x02db, 0x02e9, 0x02e9, 0x02f2, 0x02f6, 0x0304, 0x030e, - 0x031d, 0x0324, 0x0329, 0x0334, 0x033b, 0x0342, 0x0351, 0x0359, - 0x035e, 0x0368, 0x0373, 0x0379, 0x037f, 0x0388, 0x039a, 0x03a0, - 0x03c3, 0x03cc, 0x03d0, 0x03dd, 0x03e3, 0x03f3, 0x0409, 0x0411, - 0x0418, 0x041d, 0x0425, 0x0432, 0x043b, 0x0442, 0x0449, 0x0455, - 0x045a, 0x0485, 0x0489, 0x048d, 0x0494, 0x049a, 0x04a0, 0x04a8, - 0x04b1, 0x04b9, 0x04be, 0x04ca, 0x04d2, 0x04da, 0x04e0, 0x04f3, - // Entry 80 - BF - 0x0501, 0x050e, 0x0514, 0x0520, 0x052a, 0x052e, 0x0534, 0x053f, - 0x054c, 0x0555, 0x055c, 0x0563, 0x056b, 0x0576, 0x057e, 0x0583, - 0x058a, 0x0590, 0x0598, 0x05a2, 0x05ae, 0x05b8, 0x05c6, 0x05dd, - 0x05e1, 0x05f3, 0x05fb, 0x0607, 0x0624, 0x062d, 0x0637, 0x0641, - 0x0646, 0x064f, 0x0656, 0x065c, 0x0663, 0x066b, 0x0674, 0x067b, - 0x068a, 0x068f, 0x069c, 0x06a3, 0x06ac, 0x06b7, 0x06bf, 0x06c4, - 0x06c9, 0x06cd, 0x06da, 0x06de, 0x06e5, 0x06ea, 0x06fc, 0x070e, - 0x0717, 0x071f, 0x0726, 0x073d, 0x074b, 0x0754, 0x0769, 0x0773, - // Entry C0 - FF - 0x0778, 0x0780, 0x0785, 0x0794, 0x079c, 0x07a3, 0x07a9, 0x07af, - 0x07b5, 0x07c3, 0x07d1, 0x07db, 0x07e0, 0x07e6, 0x07ef, 0x07fb, - 0x0803, 0x0817, 0x0821, 0x082d, 0x0837, 0x083e, 0x0845, 0x084d, - 0x0856, 0x086c, 0x0877, 0x0883, 0x0888, 0x0891, 0x08a1, 0x08b5, - 0x08b9, 0x08d0, 0x08d4, 0x08de, 0x08e8, 0x08ef, 0x08f8, 0x0904, - 0x090b, 0x0910, 0x0917, 0x0928, 0x092e, 0x0934, 0x093c, 0x0943, - 0x0949, 0x096b, 0x0978, 0x0983, 0x098a, 0x0994, 0x09a7, 0x09c1, - 0x09ca, 0x09e3, 0x09fa, 0x0a01, 0x0a08, 0x0a17, 0x0a1c, 0x0a22, - // Entry 100 - 13F - 0x0a27, 0x0a2e, 0x0a37, 0x0a3d, 0x0a45, 0x0a58, 0x0a5d, 0x0a63, - 0x0a6f, 0x0a7e, 0x0a85, 0x0a97, 0x0aa7, 0x0ab7, 0x0ac1, 0x0ad0, - 0x0ade, 0x0ae6, 0x0af6, 0x0afd, 0x0b0b, 0x0b17, 0x0b27, 0x0b39, - 0x0b44, 0x0b4d, 0x0b61, 0x0b6a, 0x0b6e, 0x0b7b, 0x0b8b, 0x0b91, - 0x0ba1, 0x0bb6, 0x0bc8, 0x0bd6, -} // Size: 608 bytes - -const jaRegionStr string = "" + // Size: 4839 bytes - "アセンション島アンドラアラブ首長国連邦アフガニスタンアンティグア・バーブーダアンギラアルバニアアルメニアアンゴラ南極アルゼンチン米領サモアオース" + - "トリアオーストラリアアルバオーランド諸島アゼルバイジャンボスニア・ヘルツェゴビナバルバドスバングラデシュベルギーブルキナファソブルガリアバー" + - "レーンブルンジベナンサン・バルテルミー島バミューダブルネイボリビアオランダ領カリブブラジルバハマブータンブーベ島ボツワナベラルーシベリーズカ" + - "ナダココス(キーリング)諸島コンゴ民主共和国(キンシャサ)中央アフリカ共和国コンゴ共和国(ブラザビル)スイスコートジボワールクック諸島チリカ" + - "メルーン中国コロンビアクリッパートン島コスタリカキューバカーボベルデキュラソークリスマス島キプロスチェコドイツディエゴガルシア島ジブチデンマ" + - "ークドミニカ国ドミニカ共和国アルジェリアセウタ・メリリャエクアドルエストニアエジプト西サハラエリトリアスペインエチオピア欧州連合フィンランド" + - "フィジーフォークランド諸島ミクロネシア連邦フェロー諸島フランスガボンイギリスグレナダジョージア仏領ギアナガーンジーガーナジブラルタルグリーン" + - "ランドガンビアギニアグアドループ赤道ギニアギリシャ南ジョージア島・南サンドイッチ諸島グアテマラグアムギニアビサウガイアナ中華人民共和国香港特" + - "別行政区ハード島・マクドナルド諸島ホンジュラスクロアチアハイチハンガリーカナリア諸島インドネシアアイルランドイスラエルマン島インド英領インド" + - "洋地域イラクイランアイスランドイタリアジャージージャマイカヨルダン日本ケニアキルギスカンボジアキリバスコモロセントクリストファー・ネーヴィス" + - "朝鮮民主主義人民共和国大韓民国クウェートケイマン諸島カザフスタンラオスレバノンセントルシアリヒテンシュタインスリランカリベリアレソトリトアニ" + - "アルクセンブルクラトビアリビアモロッコモナコモルドバモンテネグロサン・マルタンマダガスカルマーシャル諸島マケドニアマリミャンマーモンゴル中華" + - "人民共和国マカオ特別行政区北マリアナ諸島マルティニークモーリタニアモントセラトマルタモーリシャスモルディブマラウイメキシコマレーシアモザンビ" + - "ークナミビアニューカレドニアニジェールノーフォーク島ナイジェリアニカラグアオランダノルウェーネパールナウルニウエニュージーランドオマーンパナ" + - "マペルー仏領ポリネシアパプアニューギニアフィリピンパキスタンポーランドサンピエール島・ミクロン島ピトケアン諸島プエルトリコパレスチナ自治区ポ" + - "ルトガルパラオパラグアイカタールオセアニア周辺地域レユニオン島ルーマニアセルビアロシアルワンダサウジアラビアソロモン諸島セーシェルスーダンス" + - "ウェーデンシンガポールセントヘレナスロベニアスバールバル諸島・ヤンマイエン島スロバキアシエラレオネサンマリノセネガルソマリアスリナム南スーダ" + - "ンサントメ・プリンシペエルサルバドルシント・マールテンシリアスワジランドトリスタン・ダ・クーニャタークス・カイコス諸島チャド仏領極南諸島トー" + - "ゴタイタジキスタントケラウ東ティモールトルクメニスタンチュニジアトンガトルコトリニダード・トバゴツバル台湾タンザニアウクライナウガンダ合衆国" + - "領有小離島こくさいれんごうアメリカ合衆国ウルグアイウズベキスタンバチカン市国セントビンセント及びグレナディーン諸島ベネズエラ英領ヴァージン諸" + - "島米領ヴァージン諸島ベトナムバヌアツウォリス・フツナサモアコソボイエメンマヨット島南アフリカザンビアジンバブエ不明な地域世界アフリカ北アメリ" + - "カ大陸南アメリカオセアニア西アフリカ中央アメリカ東アフリカ北アフリカ中部アフリカ南部アフリカアメリカ大陸北アメリカカリブ東アジア南アジア東南" + - "アジア南ヨーロッパオーストララシアメラネシアミクロネシアポリネシアアジア中央アジア西アジアヨーロッパ東ヨーロッパ北ヨーロッパ西ヨーロッパラテ" + - "ンアメリカ" - -var jaRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0015, 0x0021, 0x0039, 0x004e, 0x0072, 0x007e, 0x008d, - 0x009c, 0x00a8, 0x00ae, 0x00c0, 0x00cf, 0x00e1, 0x00f6, 0x00ff, - 0x0114, 0x012c, 0x0150, 0x015f, 0x0174, 0x0180, 0x0195, 0x01a4, - 0x01b3, 0x01bf, 0x01c8, 0x01e6, 0x01f5, 0x0201, 0x020d, 0x0225, - 0x0231, 0x023a, 0x0246, 0x0252, 0x025e, 0x026d, 0x0279, 0x0282, - 0x02a2, 0x02cb, 0x02e6, 0x0309, 0x0312, 0x032a, 0x0339, 0x033f, - 0x034e, 0x0354, 0x0363, 0x037b, 0x038a, 0x0396, 0x03a8, 0x03b7, - 0x03c9, 0x03d5, 0x03de, 0x03e7, 0x0402, 0x040b, 0x041a, 0x0429, - // Entry 40 - 7F - 0x043e, 0x0450, 0x0468, 0x0477, 0x0486, 0x0492, 0x049e, 0x04ad, - 0x04b9, 0x04c8, 0x04d4, 0x04d4, 0x04e6, 0x04f2, 0x050d, 0x0525, - 0x0537, 0x0543, 0x054c, 0x0558, 0x0564, 0x0573, 0x0582, 0x0591, - 0x059a, 0x05ac, 0x05c1, 0x05cd, 0x05d6, 0x05e8, 0x05f7, 0x0603, - 0x0636, 0x0645, 0x064e, 0x0660, 0x066c, 0x0696, 0x06bd, 0x06cf, - 0x06de, 0x06e7, 0x06f6, 0x0708, 0x071a, 0x072c, 0x073b, 0x0744, - 0x074d, 0x0765, 0x076e, 0x0777, 0x0789, 0x0795, 0x07a4, 0x07b3, - 0x07bf, 0x07c5, 0x07ce, 0x07da, 0x07e9, 0x07f5, 0x07fe, 0x082e, - // Entry 80 - BF - 0x084f, 0x085b, 0x086a, 0x087c, 0x088e, 0x0897, 0x08a3, 0x08b5, - 0x08d0, 0x08df, 0x08eb, 0x08f4, 0x0903, 0x0918, 0x0924, 0x092d, - 0x0939, 0x0942, 0x094e, 0x0960, 0x0975, 0x0987, 0x099c, 0x09ab, - 0x09b1, 0x09c0, 0x09cc, 0x09f9, 0x0a0e, 0x0a23, 0x0a35, 0x0a47, - 0x0a50, 0x0a62, 0x0a71, 0x0a7d, 0x0a89, 0x0a98, 0x0aaa, 0x0ab6, - 0x0ace, 0x0add, 0x0af2, 0x0b04, 0x0b13, 0x0b1f, 0x0b2e, 0x0b3a, - 0x0b43, 0x0b4c, 0x0b64, 0x0b70, 0x0b79, 0x0b82, 0x0b97, 0x0bb2, - 0x0bc1, 0x0bd0, 0x0bdf, 0x0c06, 0x0c1b, 0x0c2d, 0x0c45, 0x0c54, - // Entry C0 - FF - 0x0c5d, 0x0c6c, 0x0c78, 0x0c93, 0x0ca5, 0x0cb4, 0x0cc0, 0x0cc9, - 0x0cd5, 0x0cea, 0x0cfc, 0x0d0b, 0x0d17, 0x0d29, 0x0d3b, 0x0d4d, - 0x0d5c, 0x0d8c, 0x0d9b, 0x0dad, 0x0dbc, 0x0dc8, 0x0dd4, 0x0de0, - 0x0def, 0x0e0d, 0x0e22, 0x0e3d, 0x0e46, 0x0e58, 0x0e7c, 0x0e9d, - 0x0ea6, 0x0eb8, 0x0ec1, 0x0ec7, 0x0ed9, 0x0ee5, 0x0ef7, 0x0f0f, - 0x0f1e, 0x0f27, 0x0f30, 0x0f4e, 0x0f57, 0x0f5d, 0x0f6c, 0x0f7b, - 0x0f87, 0x0f9f, 0x0fb7, 0x0fcc, 0x0fdb, 0x0ff0, 0x1002, 0x103b, - 0x104a, 0x1065, 0x1080, 0x108c, 0x1098, 0x10b0, 0x10b9, 0x10c2, - // Entry 100 - 13F - 0x10ce, 0x10dd, 0x10ec, 0x10f8, 0x1107, 0x1116, 0x111c, 0x1128, - 0x113d, 0x114c, 0x115b, 0x116a, 0x117c, 0x118b, 0x119a, 0x11ac, - 0x11be, 0x11d0, 0x11df, 0x11e8, 0x11f4, 0x1200, 0x120f, 0x1221, - 0x1239, 0x1248, 0x125a, 0x1269, 0x1272, 0x1281, 0x128d, 0x129c, - 0x12ae, 0x12c0, 0x12d2, 0x12e7, -} // Size: 608 bytes - -const kaRegionStr string = "" + // Size: 9436 bytes - "ამაღლების კუნძულიანდორაარაბთა გაერთიანებული საამიროებიავღანეთიანტიგუა და" + - " ბარბუდაანგვილაალბანეთისომხეთიანგოლაანტარქტიკაარგენტინაამერიკის სამოაავს" + - "ტრიაავსტრალიაარუბაალანდის კუნძულებიაზერბაიჯანიბოსნია და ჰერცეგოვინაბარ" + - "ბადოსიბანგლადეშიბელგიაბურკინა-ფასობულგარეთიბაჰრეინიბურუნდიბენინისენ-ბა" + - "რთელმიბერმუდაბრუნეიბოლივიაკარიბის ნიდერლანდებიბრაზილიაბაჰამის კუნძულებ" + - "იბუტანიბუვებოტსვანაბელარუსიბელიზიკანადაქოქოსის (კილინგის) კუნძულებიკონ" + - "გო - კინშასაცენტრალური აფრიკის რესპუბლიკაკონგო - ბრაზავილიშვეიცარიაკოტ" + - "-დივუარიკუკის კუნძულებიჩილეკამერუნიჩინეთიკოლუმბიაკლიპერტონის კუნძულიკოსტ" + - "ა-რიკაკუბაკაბო-ვერდეკიურასაოშობის კუნძულიკვიპროსიჩეხეთიგერმანიადიეგო-გ" + - "არსიაჯიბუტიდანიადომინიკადომინიკელთა რესპუბლიკაალჟირისეუტა და მელილაეკვ" + - "ადორიესტონეთიეგვიპტედასავლეთ საჰარაერიტრეაესპანეთიეთიოპიაევროკავშირიფი" + - "ნეთიფიჯიფოლკლენდის კუნძულებიმიკრონეზიაფარერის კუნძულებისაფრანგეთიგაბონ" + - "იგაერთიანებული სამეფოგრენადასაქართველოსაფრანგეთის გვიანაგერნსიგანაგიბრ" + - "ალტარიგრენლანდიაგამბიაგვინეაგვადელუპაეკვატორული გვინეასაბერძნეთისამხრე" + - "თ ჯორჯია და სამხრეთ სენდვიჩის კუნძულებიგვატემალაგუამიგვინეა-ბისაუგაიან" + - "აჰონკონგის სპეციალური ადმინისტრაციული რეგიონი ჩინეთიჰერდი და მაკდონალდ" + - "ის კუნძულებიჰონდურასიხორვატიაჰაიტიუნგრეთიკანარის კუნძულებიინდონეზიაირლ" + - "ანდიაისრაელიმენის კუნძულიინდოეთიბრიტანეთის ტერიტორია ინდოეთის ოკეანეში" + - "ერაყიირანიისლანდიაიტალიაჯერსიიამაიკაიორდანიაიაპონიაკენიაყირგიზეთიკამბო" + - "ჯაკირიბატიკომორის კუნძულებისენტ-კიტსი და ნევისიჩრდილოეთ კორეასამხრეთ კ" + - "ორეაქუვეითიკაიმანის კუნძულებიყაზახეთილაოსილიბანისენტ-ლუსიალიხტენშტაინი" + - "შრი-ლანკალიბერიალესოთოლიტვალუქსემბურგილატვიალიბიამაროკომონაკომოლდოვამო" + - "ნტენეგროსენ-მარტენიმადაგასკარიმარშალის კუნძულებიმაკედონიამალიმიანმარი " + - "(ბირმა)მონღოლეთიმაკაოს სპეციალური ადმინისტრაციული რეგიონი ჩინეთიჩრდილოეთ" + - " მარიანას კუნძულებიმარტინიკამავრიტანიამონსერატიმალტამავრიკიმალდივებიმალა" + - "ვიმექსიკამალაიზიამოზამბიკინამიბიაახალი კალედონიანიგერინორფოლკის კუნძულ" + - "ინიგერიანიკარაგუანიდერლანდებინორვეგიანეპალინაურუნიუეახალი ზელანდიაომან" + - "იპანამაპერუსაფრანგეთის პოლინეზიაპაპუა-ახალი გვინეაფილიპინებიპაკისტანიპ" + - "ოლონეთისენ-პიერი და მიკელონიპიტკერნის კუნძულებიპუერტო-რიკოპალესტინის ტ" + - "ერიტორიებიპორტუგალიაპალაუპარაგვაიკატარიშორეული ოკეანეთირეუნიონირუმინეთ" + - "ისერბეთირუსეთირუანდასაუდის არაბეთისოლომონის კუნძულებისეიშელის კუნძულებ" + - "ისუდანიშვედეთისინგაპურიწმინდა ელენეს კუნძულისლოვენიაშპიცბერგენი და იან" + - "-მაიენისლოვაკეთისიერა-ლეონესან-მარინოსენეგალისომალისურინამისამხრეთ სუდან" + - "ისან-ტომე და პრინსიპისალვადორისინტ-მარტენისირიასვაზილენდიტრისტან-და-კუ" + - "ნიათერქს-ქაიქოსის კუნძულებიჩადიფრანგული სამხრეთის ტერიტორიებიტოგოტაილა" + - "ნდიტაჯიკეთიტოკელაუტიმორ-ლესტეთურქმენეთიტუნისიტონგათურქეთიტრინიდადი და " + - "ტობაგოტუვალუტაივანიტანზანიაუკრაინაუგანდააშშ-ის შორეული კუნძულებიგაეროა" + - "მერიკის შეერთებული შტატებიურუგვაიუზბეკეთიქალაქი ვატიკანისენტ-ვინსენტი " + - "და გრენადინებივენესუელაბრიტანეთის ვირჯინის კუნძულებიაშშ-ის ვირჯინის კუ" + - "ნძულებივიეტნამივანუატუუოლისი და ფუტუნასამოაკოსოვოიემენიმაიოტასამხრეთ ა" + - "ფრიკის რესპუბლიკაზამბიაზიმბაბვეუცნობი რეგიონიმსოფლიოაფრიკაჩრდილოეთ ამე" + - "რიკასამხრეთ ამერიკაოკეანეთიდასავლეთ აფრიკაცენტრალური ამერიკააღმოსავლეთ" + - " აფრიკაჩრდილოეთ აფრიკაშუა აფრიკასამხრეთ აფრიკაამერიკებიამერიკის ჩრდილოეთ" + - "იკარიბის ზღვააღმოსავლეთ აზიასამხრეთ აზიასამხრეთ-აღმოსავლეთ აზიასამხრეთ" + - " ევროპაავსტრალაზიამელანეზიამიკრონეზიის რეგიონიპოლინეზიააზიაცენტრალური აზ" + - "იადასავლეთ აზიაევროპააღმოსავლეთ ევროპაჩრდილოეთ ევროპადასავლეთ ევროპალა" + - "თინური ამერიკა" - -var kaRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0031, 0x0043, 0x009c, 0x00b4, 0x00e6, 0x00fb, 0x0113, - 0x0128, 0x013a, 0x0158, 0x0173, 0x019b, 0x01b0, 0x01cb, 0x01da, - 0x020b, 0x022c, 0x0267, 0x0282, 0x02a0, 0x02b2, 0x02d4, 0x02ef, - 0x0307, 0x031c, 0x032e, 0x0350, 0x0365, 0x0377, 0x038c, 0x03c6, - 0x03de, 0x040f, 0x0421, 0x042d, 0x0445, 0x045d, 0x046f, 0x0481, - 0x04cd, 0x04f4, 0x0547, 0x0574, 0x058f, 0x05ae, 0x05d9, 0x05e5, - 0x05fd, 0x060f, 0x0627, 0x065e, 0x067a, 0x0686, 0x06a2, 0x06ba, - 0x06df, 0x06f7, 0x0709, 0x0721, 0x0743, 0x0755, 0x0764, 0x077c, - // Entry 40 - 7F - 0x07bc, 0x07ce, 0x07f7, 0x080f, 0x0827, 0x083c, 0x0867, 0x087c, - 0x0894, 0x08a9, 0x08ca, 0x08ca, 0x08dc, 0x08e8, 0x0922, 0x0940, - 0x0971, 0x098f, 0x09a1, 0x09db, 0x09f0, 0x0a0e, 0x0a42, 0x0a54, - 0x0a60, 0x0a7e, 0x0a9c, 0x0aae, 0x0ac0, 0x0adb, 0x0b0c, 0x0b2a, - 0x0ba7, 0x0bc2, 0x0bd1, 0x0bf3, 0x0c05, 0x0c96, 0x0cea, 0x0d05, - 0x0d1d, 0x0d2c, 0x0d41, 0x0d72, 0x0d8d, 0x0da5, 0x0dba, 0x0ddf, - 0x0df4, 0x0e60, 0x0e6f, 0x0e7e, 0x0e96, 0x0ea8, 0x0eb7, 0x0ecc, - 0x0ee4, 0x0ef9, 0x0f08, 0x0f23, 0x0f38, 0x0f50, 0x0f81, 0x0fb7, - // Entry 80 - BF - 0x0fdf, 0x1004, 0x1019, 0x104d, 0x1065, 0x1074, 0x1086, 0x10a2, - 0x10c6, 0x10df, 0x10f4, 0x1106, 0x1115, 0x1136, 0x1148, 0x1157, - 0x1169, 0x117b, 0x1190, 0x11ae, 0x11cd, 0x11ee, 0x1222, 0x123d, - 0x1249, 0x1273, 0x128e, 0x1316, 0x1363, 0x137e, 0x139c, 0x13b7, - 0x13c6, 0x13db, 0x13f6, 0x1408, 0x141d, 0x1435, 0x1450, 0x1465, - 0x1490, 0x14a2, 0x14d3, 0x14e8, 0x1503, 0x1527, 0x153f, 0x1551, - 0x1560, 0x156c, 0x1594, 0x15a3, 0x15b5, 0x15c1, 0x15fe, 0x1630, - 0x164e, 0x1669, 0x1681, 0x16ba, 0x16f1, 0x1710, 0x1750, 0x176e, - // Entry C0 - FF - 0x177d, 0x1795, 0x17a7, 0x17d5, 0x17ed, 0x1805, 0x181a, 0x182c, - 0x183e, 0x1866, 0x189d, 0x18d1, 0x18e3, 0x18f8, 0x1913, 0x194e, - 0x1966, 0x19ab, 0x19c6, 0x19e5, 0x1a01, 0x1a19, 0x1a2b, 0x1a43, - 0x1a6b, 0x1aa1, 0x1abc, 0x1ade, 0x1aed, 0x1b0b, 0x1b37, 0x1b7b, - 0x1b87, 0x1bdd, 0x1be9, 0x1c01, 0x1c19, 0x1c2e, 0x1c4d, 0x1c6b, - 0x1c7d, 0x1c8c, 0x1ca1, 0x1cd6, 0x1ce8, 0x1cfd, 0x1d15, 0x1d2a, - 0x1d3c, 0x1d7e, 0x1d8d, 0x1dda, 0x1def, 0x1e07, 0x1e32, 0x1e80, - 0x1e9b, 0x1eee, 0x1f33, 0x1f4b, 0x1f60, 0x1f8c, 0x1f9b, 0x1fad, - // Entry 100 - 13F - 0x1fbf, 0x1fd1, 0x201b, 0x202d, 0x2045, 0x206d, 0x2082, 0x2094, - 0x20c2, 0x20ed, 0x2105, 0x2130, 0x2164, 0x2195, 0x21c0, 0x21dc, - 0x2204, 0x221f, 0x2253, 0x2275, 0x22a0, 0x22c2, 0x2303, 0x232b, - 0x234c, 0x2367, 0x239e, 0x23b9, 0x23c5, 0x23f0, 0x2415, 0x2427, - 0x2458, 0x2483, 0x24ae, 0x24dc, -} // Size: 608 bytes - -const kkRegionStr string = "" + // Size: 6155 bytes - "Әскенжін аралыАндорраБіріккен Араб ӘмірліктеріАуғанстанАнтигуа және Барб" + - "удаАнгильяАлбанияАрменияАнголаАнтарктидаАргентинаАмерикалық СамоаАвстри" + - "яАвстралияАрубаАланд аралдарыӘзірбайжанБосния және ГерцеговинаБарбадосБ" + - "англадешБельгияБуркина-ФасоБолгарияБахрейнБурундиБенинСен-БартелемиБерм" + - "уд аралдарыБрунейБоливияКариб НидерландысыБразилияБагам аралдарыБутанБу" + - "ве аралыБотсванаБеларусьБелизКанадаКокос (Килинг) аралдарыКонгоОрталық " + - "Африка РеспубликасыКонго-Браззавиль РеспубликасыШвейцарияКот-д’ИвуарКук" + - " аралдарыЧилиКамерунҚытайКолумбияКлиппертон аралыКоста-РикаКубаКабо-Верд" + - "еКюрасаоРождество аралыКипрЧехияГерманияДиего-ГарсияДжибутиДанияДоминик" + - "аДоминикан РеспубликасыАлжирСеута және МелильяЭквадорЭстонияМысырБатыс " + - "СахараЭритреяИспанияЭфиопияЕуропалық ОдақФинляндияФиджиФолкленд аралдар" + - "ыМикронезияФарер аралдарыФранцияГабонҰлыбританияГренадаГрузияФранцуз Гв" + - "ианасыГернсиГанаГибралтарГренландияГамбияГвинеяГваделупаЭкваторлық Гвин" + - "еяГрекияОңтүстік Георгия және Оңтүстік Сандвич аралдарыГватемалаГуамГви" + - "нея-БисауГайанаҚытай Халық Республикасының Гонконг арнайы әкімшілік ауд" + - "аныХерд аралы және Макдональд аралдарыГондурасХорватияГаитиВенгрияКанар" + - " аралдарыИндонезияИрландияИзраильМэн аралыҮндістанҮнді мұхитындағы Брита" + - "н аймағыИракИранИсландияИталияДжерсиЯмайкаИорданияЖапонияКенияҚырғызста" + - "нКамбоджаКирибатиКомор аралдарыСент-Китс және НевисСолтүстік КореяОңтүс" + - "тік КореяКувейтКайман аралдарыҚазақстанЛаосЛиванСент-ЛюсияЛихтенштейнШр" + - "и-ЛанкаЛиберияЛесотоЛитваЛюксембургЛатвияЛивияМароккоМонакоМолдоваЧерно" + - "горияСен-МартенМадагаскарМаршалл аралдарыМакедонияМалиМьянма (Бирма)Моң" + - "ғолияҚытай Халық Республикасының Макао арнайы әкімшілік ауданыСолтүстік" + - " Мариана аралдарыМартиникаМавританияМонтсерратМальтаМаврикийМальдив арал" + - "дарыМалавиМексикаМалайзияМозамбикНамибияЖаңа КаледонияНигерНорфолк арал" + - "ыНигерияНикарагуаНидерландНорвегияНепалНауруНиуэЖаңа ЗеландияОманПанама" + - "ПеруФранцуз ПолинезиясыПапуа — Жаңа ГвинеяФилиппинПәкістанПольшаСен-Пье" + - "р және МикелонПиткэрн аралдарыПуэрто-РикоПалестина аймақтарыПортугалияП" + - "алауПарагвайКатарАлыс ОкеанияРеюньонРумынияСербияРесейРуандаСауд Арабия" + - "сыСоломон аралдарыСейшель аралдарыСуданШвецияСингапурӘулие Елена аралыС" + - "ловенияШпицберген және Ян-МайенСловакияСьерра-ЛеонеСан-МариноСенегалСом" + - "алиСуринамОңтүстік СуданСан-Томе және ПринсипиСальвадорСинт-МартенСирия" + - "СвазилендТристан-да-КуньяТеркс және Кайкос аралдарыЧадФранцияның оңтүст" + - "ік аймақтарыТогоТайландТәжікстанТокелауТимор-ЛестеТүрікменстанТунисТонг" + - "аТүркияТринидад және ТобагоТувалуТайваньТанзанияУкраинаУгандаАҚШ-тың сы" + - "ртқы кіші аралдарыБіріккен Ұлттар ҰйымыАмерика Құрама ШтаттарыУругвайӨз" + - "бекстанВатиканСент-Винсент және Гренадин аралдарыВенесуэлаБритандық Вир" + - "гин аралдарыАҚШ-тың Виргин аралдарыВьетнамВануатуУоллис және ФутунаСамо" + - "аКосовоЙеменМайоттаОңтүстік Африка РеспубликасыЗамбияЗимбабвеБелгісіз а" + - "ймақӘлемАфрикаСолтүстік АмерикаОңтүстік АмерикаОкеанияБатыс АфрикаОртал" + - "ық АмерикаШығыс АфрикаСолтүстік АфрикаОрталық АфрикаОңтүстік АфрикаСолт" + - "үстік және Оңтүстік АмерикаСолтүстік Америка (аймақ)КарибШығыс АзияОңтү" + - "стік АзияОңтүстік-Шығыс АзияОңтүстік ЕуропаАвстралазияМеланезияМикронез" + - "ия аймағыПолинезияАзияОрталық АзияБатыс АзияЕуропаШығыс ЕуропаСолтүстік" + - " ЕуропаБатыс ЕуропаЛатын Америкасы" - -var kkRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001b, 0x0029, 0x0059, 0x006b, 0x0091, 0x009f, 0x00ad, - 0x00bb, 0x00c7, 0x00db, 0x00ed, 0x010c, 0x011a, 0x012c, 0x0136, - 0x0151, 0x0165, 0x0191, 0x01a1, 0x01b3, 0x01c1, 0x01d8, 0x01e8, - 0x01f6, 0x0204, 0x020e, 0x0227, 0x0244, 0x0250, 0x025e, 0x0281, - 0x0291, 0x02ac, 0x02b6, 0x02c9, 0x02d9, 0x02e9, 0x02f3, 0x02ff, - 0x0329, 0x0333, 0x0367, 0x039f, 0x03b1, 0x03c7, 0x03de, 0x03e6, - 0x03f4, 0x03fe, 0x040e, 0x042d, 0x0440, 0x0448, 0x045b, 0x0469, - 0x0486, 0x048e, 0x0498, 0x04a8, 0x04bf, 0x04cd, 0x04d7, 0x04e7, - // Entry 40 - 7F - 0x0512, 0x051c, 0x053e, 0x054c, 0x055a, 0x0564, 0x057b, 0x0589, - 0x0597, 0x05a5, 0x05c0, 0x05c0, 0x05d2, 0x05dc, 0x05fd, 0x0611, - 0x062c, 0x063a, 0x0644, 0x065a, 0x0668, 0x0674, 0x0693, 0x069f, - 0x06a7, 0x06b9, 0x06cd, 0x06d9, 0x06e5, 0x06f7, 0x0718, 0x0724, - 0x077d, 0x078f, 0x0797, 0x07ae, 0x07ba, 0x082a, 0x086c, 0x087c, - 0x088c, 0x0896, 0x08a4, 0x08bf, 0x08d1, 0x08e1, 0x08ef, 0x0900, - 0x0910, 0x0949, 0x0951, 0x0959, 0x0969, 0x0975, 0x0981, 0x098d, - 0x099d, 0x09ab, 0x09b5, 0x09c9, 0x09d9, 0x09e9, 0x0a04, 0x0a29, - // Entry 80 - BF - 0x0a46, 0x0a61, 0x0a6d, 0x0a8a, 0x0a9c, 0x0aa4, 0x0aae, 0x0ac1, - 0x0ad7, 0x0ae8, 0x0af6, 0x0b02, 0x0b0c, 0x0b20, 0x0b2c, 0x0b36, - 0x0b44, 0x0b50, 0x0b5e, 0x0b72, 0x0b85, 0x0b99, 0x0bb8, 0x0bca, - 0x0bd2, 0x0beb, 0x0bfb, 0x0c67, 0x0c99, 0x0cab, 0x0cbf, 0x0cd3, - 0x0cdf, 0x0cef, 0x0d0e, 0x0d1a, 0x0d28, 0x0d38, 0x0d48, 0x0d56, - 0x0d71, 0x0d7b, 0x0d94, 0x0da2, 0x0db4, 0x0dc6, 0x0dd6, 0x0de0, - 0x0dea, 0x0df2, 0x0e0b, 0x0e13, 0x0e1f, 0x0e27, 0x0e4c, 0x0e70, - 0x0e80, 0x0e90, 0x0e9c, 0x0ec3, 0x0ee2, 0x0ef7, 0x0f1c, 0x0f30, - // Entry C0 - FF - 0x0f3a, 0x0f4a, 0x0f54, 0x0f6b, 0x0f79, 0x0f87, 0x0f93, 0x0f9d, - 0x0fa9, 0x0fc2, 0x0fe1, 0x1000, 0x100a, 0x1016, 0x1026, 0x1046, - 0x1056, 0x1083, 0x1093, 0x10aa, 0x10bd, 0x10cb, 0x10d7, 0x10e5, - 0x1100, 0x1129, 0x113b, 0x1150, 0x115a, 0x116c, 0x118a, 0x11bb, - 0x11c1, 0x11f9, 0x1201, 0x120f, 0x1221, 0x122f, 0x1244, 0x125c, - 0x1266, 0x1270, 0x127c, 0x12a2, 0x12ae, 0x12bc, 0x12cc, 0x12da, - 0x12e6, 0x131a, 0x1342, 0x136e, 0x137c, 0x138e, 0x139c, 0x13de, - 0x13f0, 0x1420, 0x144b, 0x1459, 0x1467, 0x1489, 0x1493, 0x149f, - // Entry 100 - 13F - 0x14a9, 0x14b7, 0x14ed, 0x14f9, 0x1509, 0x1524, 0x152c, 0x1538, - 0x1559, 0x1578, 0x1586, 0x159d, 0x15ba, 0x15d1, 0x15f0, 0x160b, - 0x1628, 0x1663, 0x1691, 0x169b, 0x16ae, 0x16c7, 0x16eb, 0x1708, - 0x171e, 0x1730, 0x1751, 0x1763, 0x176b, 0x1782, 0x1795, 0x17a1, - 0x17b8, 0x17d7, 0x17ee, 0x180b, -} // Size: 608 bytes - -const kmRegionStr string = "" + // Size: 8993 bytes - "កោះ\u200bអាសេនសិនអង់ដូរ៉ាអារ៉ាប់រួមអាហ្វហ្គានីស្ថានអង់ទីហ្គា និង បាប៊ុយដ" + - "ាអង់ហ្គីឡាអាល់បានីអាមេនីអង់ហ្គោឡាអង់តាក់ទិកអាហ្សង់ទីនសាម័រ អាមេរិកាំងអ" + - "ូទ្រីសអូស្ត្រាលីអារូបាកោះ\u200bអាឡាំងអាស៊ែបៃហ្សង់បូស្នី និងហឺហ្សីហ្គូវ" + - "ីណាបាបាដុសបង់ក្លាដែសបែលហ្ស៊ិកបួគីណាហ្វាសូប៊ុលហ្គារីបារ៉ែនប៊ូរុនឌីបេណាំ" + - "ងសង់ បាតេឡេម៉ីប៊ឺមុយដាប្រ៊ុយណេបូលីវីហុល្លង់ ការ៉ាប៊ីនប្រេស៊ីលបាហាម៉ាប៊" + - "ូតានកោះ\u200bប៊ូវ៉េតបុតស្វាណាបេឡារុស្សបេលីហ្សកាណាដាកោះ\u200bកូកូស (គីល" + - "ីង)កុងហ្គោ- គីនស្ហាសាសាធារណរដ្ឋអាហ្វ្រិកកណ្ដាលកុងហ្គោ - ប្រាហ្សាវីលស្វ" + - "ីសកូដឌីវ័រកោះ\u200bខូកស៊ីលីកាមេរូនចិនកូឡុំប៊ីកោះ\u200bឃ្លីភឺតុនកូស្តារ" + - "ីកាគុយបាកាបវែរកូរ៉ាកៅកោះ\u200bគ្រីស្មាសស៊ីបឆេគាអាល្លឺម៉ង់ឌៀហ្គោហ្គាស៊ី" + - "ជីប៊ូទីដាណឺម៉ាកដូមីនីកសាធារណរដ្ឋ\u200bដូមីនីកអាល់ហ្សេរីជឺតា និង\u200bម" + - "៉េលីឡាអេក្វាឌ័រអេស្តូនីអេហ្ស៊ីបសាហារ៉ាខាងលិចអេរីទ្រាអេស្ប៉ាញអេត្យូពីសហ" + - "ភាព\u200bអឺរ៉ុបហ្វាំងឡង់ហ្វីជីកោះ\u200bហ្វក់ឡែនមីក្រូណេស៊ីកោះ\u200bហ្វ" + - "ារ៉ូបារាំងហ្គាបុងចក្រភព\u200bអង់គ្លេសហ្គ្រីណាដាហ្សកហ្ស៊ីហ្គៀណាបារាំងហ្" + - "គេនស៊ីហ្គាណាហ្គីប្រាលតាហ្គ្រោអង់ឡង់ហ្គាំប៊ីហ្គីណេហ្គោដឺឡុបហ្គីណេអេក្វា" + - "ទ័រក្រិកកោះ\u200bហ្សកហ្ស៊ី\u200bខាង\u200bត្បូង និង សាន់វិច\u200bខាង" + - "\u200bត្បូងហ្គាតេម៉ាឡាហ្គាំហ្គីណេប៊ីសូហ្គីយ៉ាណាហុងកុងកោះ\u200bហឺដ និង" + - "\u200bម៉ាក់ដូណាល់ហុងឌូរ៉ាសក្រូអាតហៃទីហុងគ្រីកោះ\u200bកាណារីឥណ្ឌូណេស៊ីអៀរ" + - "ឡង់អ៊ីស្រាអែលអែលអុហ្វមែនឥណ្ឌាដែនដី\u200bអង់គ្លេស\u200bនៅ\u200bមហា" + - "\u200bសមុទ្រ\u200bឥណ្ឌាអ៊ីរ៉ាក់អ៊ីរ៉ង់អ៊ីស្លង់អ៊ីតាលីជឺស៊ីចាម៉ៃកាហ៊្សកដា" + - "នីជប៉ុនកេនយ៉ាកៀហ្ស៊ីស៊ីស្ថានកម្ពុជាគិរិបាទីកូម័រសង់ឃីត និង\u200bណេវីសក" + - "ូរ៉េ\u200bខាង\u200bជើងកូរ៉េ\u200bខាង\u200bត្បូងគុយវ៉ែតកោះ\u200bកៃម៉ង់ក" + - "ាហ្សាក់ស្ថានឡាវលីបង់សង់\u200bលូសៀលិចទេនស្តែនស្រីលង្កាលីបេរីយ៉ាឡេសូតូលី" + - "ទុយអានីលុចហ្សំបួរឡាតវីយ៉ាលីប៊ីម៉ារ៉ុកម៉ូណាកូម៉ុលដាវីម៉ុងតេណេហ្គ្រោសង់" + - "\u200bម៉ាទីនម៉ាដាហ្គាស្កាកោះ\u200bម៉ាស់សលម៉ាសេដូនាម៉ាលីមីយ៉ាន់ម៉ា (ភូមា)" + - "ម៉ុងហ្គោលីម៉ាកាវកោះ\u200bម៉ារីណា\u200bខាង\u200bជើងម៉ាទីនីកម៉ូរីតានីម៉ុ" + - "ង\u200bសេរ៉ង់ម៉ាល់តាម៉ូរីសម៉ាល់ឌីវម៉ាឡាវីម៉ិកស៊ិកម៉ាឡេស៊ីម៉ូហ្សាំប៊ិកណ" + - "ាមីប៊ីញូកាឡេដូនៀនីហ្សេរកោះ\u200bណ័រហ្វក់នីហ្សេរីយ៉ានីការ៉ាហ្គ័រហូឡង់ន័" + - "រវែសនេប៉ាល់ណូរូណៀនូវែលហ្សេឡង់អូម៉ង់ប៉ាណាម៉ាប៉េរូប៉ូលី\u200bណេស៊ី\u200b" + - "បារាំងប៉ាពួញ៉ូហ្គីណេហ្វីលីពីនប៉ាគីស្ថានប៉ូឡូញសង់ព្យែរ និង\u200bមីគីឡុង" + - "កោះ\u200bភីតកានព័រតូរីកូដែន\u200bប៉ាលេស្ទីនព័រទុយហ្គាល់ផៅឡូប៉ារ៉ាហ្គាយ" + - "កាតាតំបន់ជាយអូសេអានីរេអុយញ៉ុងរូម៉ានីស៊ែបរុស្ស៊ីរវ៉ាន់ដាអារ៉ាប៊ីសាអូឌីត" + - "កោះ\u200bសូឡូម៉ុងសីសែលស៊ូដង់ស៊ុយអែតសិង្ហបុរីសង់\u200bហេឡេណាស្លូវេនីស្វ" + - "ាលបាដ និង ហ្សង់ម៉ាយេនស្លូវ៉ាគីសេរ៉ាឡេអូនសាន\u200bម៉ារីណូសេណេហ្គាល់សូម៉" + - "ាលីសូរីណាមស៊ូដង់\u200bខាង\u200bត្បូងសៅតូម៉េ និង ប្រាំងស៊ីបអែលសាល់វ៉ាឌ័" + - "រសីង\u200bម៉ាធីនស៊ីរីស្វាហ្ស៊ីឡង់ទ្រីស្តង់\u200bដា\u200bចូនហាកោះ\u200b" + - "ទួគ និង កៃកូសឆាដដែនដី\u200bបារាំង\u200bនៅ\u200bភាគខាងត្បូងតូហ្គោថៃតាហ្" + - "ស៊ីគីស្ថានតូខេឡៅទីម័រតួកម៉េនីស្ថានទុយនេស៊ីតុងហ្គាទួរគីទ្រីនីដាត និង" + - "\u200bតូបាហ្គោទូវ៉ាលូតៃវ៉ាន់តង់ហ្សានីអ៊ុយក្រែនអ៊ូហ្គង់ដាកោះ\u200bអៅឡាយីង" + - "\u200bអាមេរិកអង្គការសហប្រជាជាតិសហរដ្ឋអាមេរិកអ៊ុយរ៉ាហ្គាយអ៊ូសបេគីស្ថានបុរ" + - "ី\u200bវ៉ាទីកង់សាំង\u200bវីនសេន និង\u200bឌឹ\u200bហ្គ្រីណាឌីនីសវេនេហ្ស៊" + - "ុយឡាកោះ\u200bវឺជិន\u200bចក្រភព\u200bអង់គ្លេសកោះ\u200bវឺជីន\u200bអាមេរិ" + - "កវៀតណាមវ៉ានូអាទូវ៉ាលីស និង\u200bហ្វូទូណាសាម័រកូសូវ៉ូយេមែនម៉ាយុតអាហ្វ្រ" + - "ិកខាងត្បូងហ្សាំប៊ីហ្ស៊ីមបាវ៉េតំបន់មិនស្គាល់ពិភពលោកអាហ្វ្រិកអាមេរិក" + - "\u200bខាង\u200bជើងអាមេរិក\u200bខាង\u200bត្បូងអូសេអានីអាហ្វ្រិក\u200bខាង" + - "\u200bលិចអាមេរិក\u200bកណ្ដាលអាហ្វ្រិកខាងកើតអាហ្វ្រិក\u200bខាង\u200bជើងអា" + - "ហ្វ្រិក\u200bកណ្តាលអាហ្វ្រិកភាគខាងត្បូងអាមេរិកអាមេរិក\u200bភាគ\u200bខា" + - "ង\u200bជើងការ៉ាប៊ីនអាស៊ី\u200bខាង\u200bកើតអាស៊ី\u200bខាង\u200bត្បូងអាស" + - "៊ីអាគ្នេយ៍អឺរ៉ុប\u200bខាង\u200bត្បូងអូស្ត្រាឡាស៊ីមេឡាណេស៊ីតំបន់\u200bម" + - "ីក្រូណេស៊ីប៉ូលីណេស៊ីអាស៊ីអាស៊ី\u200bកណ្ដាលអាស៊ី\u200bខាង\u200bលិចអឺរ៉ុ" + - "បអឺរ៉ុប\u200bខាង\u200bកើតអឺរ៉ុប\u200bខាង\u200bជើងអឺរ៉ុប\u200bខាង\u200b" + - "លិចអាមេរិក\u200bឡាទីន" - -var kmRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0024, 0x003c, 0x005a, 0x008a, 0x00c8, 0x00e3, 0x00fb, - 0x010d, 0x0128, 0x0146, 0x0164, 0x0192, 0x01a7, 0x01c5, 0x01d7, - 0x01f5, 0x0219, 0x025f, 0x0274, 0x0292, 0x02ad, 0x02d1, 0x02ef, - 0x0301, 0x0319, 0x032b, 0x0350, 0x0368, 0x0380, 0x0392, 0x03c3, - 0x03db, 0x03f0, 0x0402, 0x0423, 0x043e, 0x0459, 0x046e, 0x0480, - 0x04ad, 0x04df, 0x052a, 0x0563, 0x0572, 0x058a, 0x059f, 0x05ae, - 0x05c3, 0x05cc, 0x05e4, 0x060b, 0x0629, 0x0638, 0x064a, 0x065f, - 0x0686, 0x0692, 0x069e, 0x06bc, 0x06e3, 0x06f8, 0x0710, 0x0725, - // Entry 40 - 7F - 0x075b, 0x0779, 0x07a7, 0x07c2, 0x07da, 0x07f2, 0x0819, 0x0831, - 0x0849, 0x0861, 0x0885, 0x0885, 0x08a0, 0x08b2, 0x08d6, 0x08f7, - 0x0918, 0x092a, 0x093f, 0x096c, 0x098a, 0x09a5, 0x09c9, 0x09e1, - 0x09f3, 0x0a14, 0x0a38, 0x0a50, 0x0a62, 0x0a7d, 0x0aaa, 0x0ab9, - 0x0b3c, 0x0b5d, 0x0b6c, 0x0b8d, 0x0ba8, 0x0bba, 0x0bfd, 0x0c18, - 0x0c2d, 0x0c39, 0x0c4e, 0x0c6c, 0x0c8a, 0x0c9c, 0x0cba, 0x0cdb, - 0x0cea, 0x0d50, 0x0d68, 0x0d7d, 0x0d95, 0x0daa, 0x0db9, 0x0dce, - 0x0de9, 0x0df8, 0x0e0a, 0x0e37, 0x0e4c, 0x0e64, 0x0e73, 0x0ea1, - // Entry 80 - BF - 0x0ec8, 0x0ef5, 0x0f0a, 0x0f28, 0x0f4f, 0x0f58, 0x0f67, 0x0f7f, - 0x0fa0, 0x0fbb, 0x0fd6, 0x0fe8, 0x1003, 0x1021, 0x1039, 0x1048, - 0x105d, 0x1072, 0x108a, 0x10b4, 0x10d2, 0x10f9, 0x111a, 0x1135, - 0x1144, 0x1171, 0x118f, 0x11a1, 0x11da, 0x11f2, 0x120d, 0x122e, - 0x1243, 0x1255, 0x126d, 0x1282, 0x129a, 0x12b2, 0x12d6, 0x12eb, - 0x1309, 0x131e, 0x1342, 0x1363, 0x1387, 0x1396, 0x13a8, 0x13bd, - 0x13c9, 0x13cf, 0x13f3, 0x1405, 0x141d, 0x142c, 0x1462, 0x148c, - 0x14a7, 0x14c5, 0x14d7, 0x1511, 0x152f, 0x154a, 0x1574, 0x1598, - // Entry C0 - FF - 0x15a4, 0x15c5, 0x15d1, 0x1601, 0x161c, 0x1631, 0x163d, 0x1652, - 0x166a, 0x1697, 0x16bb, 0x16ca, 0x16dc, 0x16f1, 0x170c, 0x172a, - 0x1742, 0x1786, 0x17a1, 0x17bf, 0x17e0, 0x17fe, 0x1813, 0x1828, - 0x1858, 0x1896, 0x18bd, 0x18db, 0x18ea, 0x190e, 0x1944, 0x1973, - 0x197c, 0x19cd, 0x19df, 0x19e5, 0x1a0f, 0x1a21, 0x1a30, 0x1a57, - 0x1a6f, 0x1a84, 0x1a93, 0x1ad3, 0x1ae8, 0x1afd, 0x1b18, 0x1b33, - 0x1b51, 0x1b8a, 0x1bc0, 0x1be7, 0x1c0b, 0x1c32, 0x1c59, 0x1cb7, - 0x1cdb, 0x1d26, 0x1d59, 0x1d6b, 0x1d86, 0x1dbd, 0x1dcc, 0x1de1, - // Entry 100 - 13F - 0x1df0, 0x1e02, 0x1e35, 0x1e4d, 0x1e6e, 0x1e98, 0x1ead, 0x1ec8, - 0x1ef5, 0x1f28, 0x1f40, 0x1f73, 0x1f9d, 0x1fca, 0x1ffd, 0x202d, - 0x2069, 0x207e, 0x20b7, 0x20d2, 0x20f9, 0x2126, 0x214d, 0x217d, - 0x21a4, 0x21bf, 0x21f2, 0x2210, 0x221f, 0x2243, 0x226a, 0x227c, - 0x22a6, 0x22d0, 0x22fa, 0x2321, -} // Size: 608 bytes - -const knRegionStr string = "" + // Size: 9399 bytes - "ಅಸೆನ್ಶನ್ ದ್ವೀಪಅಂಡೋರಾಸಂಯುಕ್ತ ಅರಬ್ ಎಮಿರೇಟಸ್ಅಫಘಾನಿಸ್ಥಾನ್ಆಂಟಿಗುವಾ ಮತ್ತು ಬರ್ಬ" + - "ುಡಾಆಂಗ್ವಿಲ್ಲಾಅಲ್ಬೇನಿಯಾಅರ್ಮೇನಿಯಾಅಂಗೋಲಾಅಂಟಾರ್ಟಿಕಾಅರ್ಜೆಂಟಿನಾಅಮೇರಿಕನ್ ಸಮೋವ" + - "ಾಆಸ್ಟ್ರಿಯಾಆಸ್ಟ್ರೇಲಿಯಅರುಬಾಆಲ್ಯಾಂಡ್ ದ್ವೀಪಗಳುಅಜರ್ಬೈಜಾನ್ಬೋಸ್ನಿಯಾ ಮತ್ತು ಹರ್" + - "ಜೆಗೋವಿನಾಬಾರ್ಬಡೋಸ್ಬಾಂಗ್ಲಾದೇಶ್ಬೆಲ್ಜಿಯಮ್ಬುರ್ಕಿನಾ ಫಾಸೋಬಲ್ಗೇರಿಯಾಬಹ್ರೇನ್ಬುರು" + - "ಂಡಿಬೆನಿನ್ಸೇಂಟ್ ಬಾರ್ಥೆಲೆಮಿಬರ್ಮುಡಾಬ್ರೂನಿಬೊಲಿವಿಯಾಕೆರೀಬಿಯನ್ ನೆದರ್\u200cಲ್ಯ" + - "ಾಂಡ್ಸ್ಬ್ರೆಜಿಲ್ಬಹಾಮಾಸ್ಭೂತಾನ್ಬೋವೆಟ್ ದ್ವೀಪಬೋಟ್ಸ್\u200cವಾನಾಬೆಲಾರಸ್ಬೆಲಿಜ್ಕೆ" + - "ನಡಾಕೊಕೊಸ್ (ಕೀಲಿಂಗ್) ದ್ವೀಪಗಳುಕಾಂಗೋ - ಕಿನ್ಶಾಸಾಮಧ್ಯ ಆಫ್ರಿಕಾ ಗಣರಾಜ್ಯಕಾಂಗೋ " + - "- ಬ್ರಾಜಾವಿಲ್ಲೇಸ್ವಿಟ್ಜರ್ಲ್ಯಾಂಡ್ಕೋತ್\u200c ದಿವಾರ್\u200dಕುಕ್ ದ್ವೀಪಗಳುಚಿಲಿಕ್" + - "ಯಾಮರೋನ್ಚೀನಾಕೊಲಂಬಿಯಾಕ್ಲಿಪ್ಪರ್\u200cಟಾನ್ ದ್ವೀಪಗಳುಕೊಸ್ಟಾ ರಿಕಾಕ್ಯೂಬಾಕೇಪ್ ವ" + - "ರ್ಡೆಕುರಾಕಾವ್ಕ್ರಿಸ್ಮಸ್ ದ್ವೀಪಸೈಪ್ರಸ್ಝೆಕಿಯಾಜರ್ಮನಿಡೈಗೋ ಗಾರ್ಸಿಯಜಿಬೋಟಿಡೆನ್ಮಾ" + - "ರ್ಕ್ಡೊಮಿನಿಕಾಡೊಮೆನಿಕನ್ ರಿಪಬ್ಲಿಕ್ಅಲ್ಗೇರಿಯಾಸೆಯುಟಾ ಹಾಗೂ ಮೆಲಿಲ್ಲಾಈಕ್ವೆಡಾರ್ಎ" + - "ಸ್ಟೋನಿಯಾಈಜಿಪ್ಟ್ಪಶ್ಚಿಮ ಸಹಾರಾಏರಿಟ್ರಿಯಾಸ್ಪೇನ್ಇಥಿಯೋಪಿಯಾಯುರೋಪಿಯನ್ ಒಕ್ಕೂಟಫಿನ" + - "್\u200cಲ್ಯಾಂಡ್ಫಿಜಿಫಾಲ್ಕ್\u200cಲ್ಯಾಂಡ್ ದ್ವೀಪಗಳುಮೈಕ್ರೋನೇಶಿಯಾಫರೋ ದ್ವೀಪಗಳು" + - "ಫ್ರಾನ್ಸ್ಗೆಬೊನ್ಬ್ರಿಟನ್/ಇಂಗ್ಲೆಂಡ್ಗ್ರೆನೆಡಾಜಾರ್ಜಿಯಾಫ್ರೆಂಚ್ ಗಯಾನಾಗುರ್ನ್" + - "\u200cಸೆಘಾನಾಗಿಬ್ರಾಲ್ಟರ್ಗ್ರೀನ್\u200cಲ್ಯಾಂಡ್ಗ್ಯಾಂಬಿಯಾಗಿನಿಗುಡೆಲೋಪ್ಈಕ್ವೆಟೋರಿ" + - "ಯಲ್ ಗಿನಿಗ್ರೀಸ್ದಕ್ಷಿಣ ಜಾರ್ಜಿಯಾ ಮತ್ತು ದಕ್ಷಿಣ ಸ್ಯಾಂಡ್\u200dವಿಚ್ ದ್ವೀಪಗಳುಗ" + - "್ವಾಟೆಮಾಲಾಗುಯಾಮ್ಗಿನಿ-ಬಿಸ್ಸಾವ್ಗಯಾನಾಹಾಂಗ್ ಕಾಂಗ್ SAR ಚೈನಾಹರ್ಡ್ ಮತ್ತು ಮ್ಯಾಕ" + - "್\u200cಡೋನಾಲ್ಡ್ ದ್ವೀಪಗಳುಹೊಂಡುರಾಸ್ಕ್ರೊಯೇಶಿಯಾಹೈಟಿಹಂಗೇರಿಕ್ಯಾನರಿ ದ್ವೀಪಗಳುಇ" + - "ಂಡೋನೇಶಿಯಾಐರ್ಲೆಂಡ್ಇಸ್ರೇಲ್ಐಲ್ ಆಫ್ ಮ್ಯಾನ್ಭಾರತಬ್ರಿಟೀಷ್ ಹಿಂದೂ ಮಹಾಸಾಗರದ ಪ್ರದ" + - "ೇಶಇರಾಕ್ಇರಾನ್ಐಸ್\u200cಲ್ಯಾಂಡ್ಇಟಲಿಜೆರ್ಸಿಜಮೈಕಾಜೋರ್ಡಾನ್ಜಪಾನ್ಕೀನ್ಯಾಕಿರ್ಗಿಸ್" + - "ಥಾನ್ಕಾಂಬೋಡಿಯಾಕಿರಿಬಾತಿಕೊಮೊರೊಸ್ಸೇಂಟ್ ಕಿಟ್ಸ್ ಮತ್ತು ನೆವಿಸ್ಉತ್ತರ ಕೋರಿಯಾದಕ್ಷ" + - "ಿಣ ಕೋರಿಯಾಕುವೈತ್ಕೇಮನ್ ದ್ವೀಪಗಳುಕಝಾಕಿಸ್ಥಾನ್ಲಾವೋಸ್ಲೆಬನಾನ್ಸೇಂಟ್ ಲೂಸಿಯಾಲಿಚೆನ" + - "್\u200cಸ್ಟೈನ್ಶ್ರೀಲಂಕಾಲಿಬೇರಿಯಾಲೆಸೊಥೋಲಿಥುವೇನಿಯಾಲಕ್ಸಂಬರ್ಗ್ಲಾಟ್ವಿಯಾಲಿಬಿಯಾಮ" + - "ೊರಾಕ್ಕೊಮೊನಾಕೊಮೊಲ್ಡೋವಾಮೊಂಟೆನೆಗ್ರೋಸೇಂಟ್ ಮಾರ್ಟಿನ್ಮಡಗಾಸ್ಕರ್ಮಾರ್ಷಲ್ ದ್ವೀಪಗಳ" + - "ುಮ್ಯಾಸಿಡೋನಿಯಾಮಾಲಿಮಯನ್ಮಾರ್ (ಬರ್ಮಾ)ಮೊಂಗೋಲಿಯಾಮಖಾವು (SAR) ಚೈನಾಉತ್ತರ ಮರಿಯಾನ" + - "ಾ ದ್ವೀಪಗಳುಮಾರ್ಟಿನಿಕ್ಮಾರಿಟೇನಿಯಾಮಾಂಟ್\u200cಸೆರೇಟ್ಮಾಲ್ಟಾಮಾರಿಷಸ್ಮಾಲ್ಡಿವ್ಸ್" + - "ಮಲಾವಿಮೆಕ್ಸಿಕೊಮಲೇಶಿಯಾಮೊಜಾಂಬಿಕ್ನಮೀಬಿಯಾನ್ಯೂ ಕ್ಯಾಲಿಡೋನಿಯಾನೈಜರ್ನಾರ್ಫೋಕ್ ದ್ವ" + - "ೀಪನೈಜೀರಿಯಾನಿಕಾರಾಗುವಾನೆದರ್\u200cಲ್ಯಾಂಡ್ಸ್ನಾರ್ವೇನೇಪಾಳನೌರುನಿಯುನ್ಯೂಜಿಲೆಂಡ್" + - "ಓಮನ್ಪನಾಮಾಪೆರುಫ್ರೆಂಚ್ ಪಾಲಿನೇಷ್ಯಾಪಪುವಾ ನ್ಯೂಗಿನಿಯಾಫಿಲಿಫೈನ್ಸ್ಪಾಕಿಸ್ತಾನಪೋಲ್" + - "ಯಾಂಡ್ಸೇಂಟ್ ಪಿಯರೆ ಮತ್ತು ಮಿಕೆಲನ್ಪಿಟ್\u200cಕೈರ್ನ್ ದ್ವೀಪಗಳುಪ್ಯೂರ್ಟೋ ರಿಕೊಪ್" + - "ಯಾಲೇಸ್ಟೇನಿಯನ್ ಪ್ರದೇಶಗಳುಪೋರ್ಚುಗಲ್ಪಲಾವುಪರಾಗ್ವೇಖತಾರ್ಔಟ್ ಲೈಯಿಂಗ್ ಓಷಿಯಾನಿಯಾ" + - "ರೀಯೂನಿಯನ್ರೊಮೇನಿಯಾಸೆರ್ಬಿಯಾರಷ್ಯಾರುವಾಂಡಾಸೌದಿ ಅರೇಬಿಯಾಸೊಲೊಮನ್ ದ್ವೀಪಗಳುಸೀಶೆಲ" + - "್ಲೆಸ್ಸೂಡಾನ್ಸ್ವೀಡನ್ಸಿಂಗಾಪುರ್ಸೇಂಟ್ ಹೆಲೆನಾಸ್ಲೋವೇನಿಯಾಸ್ವಾಲ್ಬಾರ್ಡ್ ಮತ್ತು ಜಾ" + - "ನ್ ಮೆಯನ್ಸ್ಲೋವಾಕಿಯಾಸಿಯೆರ್ರಾ ಲಿಯೋನ್ಸ್ಯಾನ್ ಮೆರಿನೋಸೆನೆಗಲ್ಸೊಮಾಲಿಯಾಸುರಿನಾಮದಕ" + - "್ಷಿಣ ಸೂಡಾನ್ಸಾವೋ ಟೋಮ್ ಮತ್ತು ಪ್ರಿನ್ಸಿಪಿಎಲ್ ಸಾಲ್ವೇಡಾರ್ಸಿಂಟ್ ಮಾರ್ಟೆನ್ಸಿರಿಯ" + - "ಾಸ್ವಾಜಿಲ್ಯಾಂಡ್ಟ್ರಿಸ್ತನ್ ಡಾ ಕುನ್ಹಾಟರ್ಕ್ಸ್ ಮತ್ತು ಕೈಕೋಸ್ ದ್ವೀಪಗಳುಚಾದ್ಫ್ರೆ" + - "ಂಚ್ ದಕ್ಷಿಣ ಪ್ರದೇಶಗಳುಟೋಗೋಥೈಲ್ಯಾಂಡ್ತಜಿಕಿಸ್ತಾನ್ಟೊಕೆಲಾವ್ಪೂರ್ವ ತಿಮೋರ್ತುರ್ಕಮ" + - "ೆನಿಸ್ತಾನ್ಟುನಿಶಿಯಾಟೊಂಗಟರ್ಕಿಟ್ರಿನಿಡಾಡ್ ಮತ್ತು ಟೊಬಾಗೊಟುವಾಲುಥೈವಾನ್ತಾಂಜೇನಿಯಾ" + - "ಉಕ್ರೈನ್ಉಗಾಂಡಾಯುಎಸ್\u200c. ಔಟ್\u200cಲೇಯಿಂಗ್ ದ್ವೀಪಗಳುಸಂಯುಕ್ತ ಸಂಸ್ಥಾನಗಳುಅ" + - "ಮೇರಿಕಾ ಸಂಯುಕ್ತ ಸಂಸ್ಥಾನಉರುಗ್ವೇಉಜ್ಬೇಕಿಸ್ಥಾನ್ವ್ಯಾಟಿಕನ್ಸೇಂಟ್. ವಿನ್ಸೆಂಟ್ ಮತ" + - "್ತು ಗ್ರೆನೆಡೈನ್ಸ್ವೆನೆಜುವೆಲಾಬ್ರಿಟಿಷ್ ವರ್ಜಿನ್ ದ್ವೀಪಗಳುಯು.ಎಸ್. ವರ್ಜಿನ್ ದ್ವ" + - "ೀಪಗಳುವಿಯೇಟ್ನಾಮ್ವನೌಟುವಾಲಿಸ್ ಮತ್ತು ಫುಟುನಾಸಮೋವಾಕೊಸೊವೊಯೆಮನ್ಮಯೊಟ್ಟೆದಕ್ಷಿಣ ಆ" + - "ಫ್ರಿಕಾಝಾಂಬಿಯಾಜಿಂಬಾಬ್ವೆಅಜ್ಞಾತ ಪ್ರದೇಶಪ್ರಪಂಚಆಫ್ರಿಕಾಉತ್ತರ ಅಮೇರಿಕಾದಕ್ಷಿಣ ಅಮ" + - "ೇರಿಕಾಓಶಿಯೇನಿಯಾಪಶ್ಚಿಮ ಆಫ್ರಿಕಾಮಧ್ಯ ಅಮೇರಿಕಾಪೂರ್ವ ಆಫ್ರಿಕಾಉತ್ತರ ಆಫ್ರಿಕಾಮಧ್ಯ" + - " ಆಫ್ರಿಕಾಆಫ್ರಿಕಾದ ದಕ್ಷಿಣ ಭಾಗಅಮೆರಿಕಾಸ್ಅಮೇರಿಕಾದ ಉತ್ತರ ಭಾಗಕೆರೀಬಿಯನ್ಪೂರ್ವ ಏಷ್" + - "ಯಾದಕ್ಷಿಣ ಏಷ್ಯಾಆಗ್ನೇಯ ಏಷ್ಯಾದಕ್ಷಿಣ ಯೂರೋಪ್ಆಸ್ಟ್ರೇಲೇಷ್ಯಾಮೆಲನೇಷಿಯಾಮೈಕ್ರೋನೇಶ" + - "ಿಯನ್ ಪ್ರದೇಶಪಾಲಿನೇಷ್ಯಾಏಷ್ಯಾಮಧ್ಯ ಏಷ್ಯಾಪಶ್ಚಿಮ ಏಷ್ಯಾಯೂರೋಪ್ಪೂರ್ವ ಯೂರೋಪ್ಉತ್ತ" + - "ರ ಯೂರೋಪ್ಪಶ್ಚಿಮ ಯೂರೋಪ್ಲ್ಯಾಟಿನ್ ಅಮೇರಿಕಾ" - -var knRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0028, 0x003a, 0x0075, 0x0099, 0x00d7, 0x00f5, 0x0110, - 0x012b, 0x013d, 0x015b, 0x0179, 0x01a1, 0x01bc, 0x01da, 0x01e9, - 0x021a, 0x0238, 0x0282, 0x029d, 0x02be, 0x02d9, 0x02fe, 0x0319, - 0x032e, 0x0343, 0x0355, 0x0383, 0x0398, 0x03aa, 0x03c2, 0x040b, - 0x0423, 0x0438, 0x044a, 0x046c, 0x048d, 0x04a2, 0x04b4, 0x04c3, - 0x0506, 0x0530, 0x0568, 0x059e, 0x05ce, 0x05f3, 0x0618, 0x0624, - 0x063f, 0x064b, 0x0663, 0x06a6, 0x06c5, 0x06d7, 0x06f3, 0x070b, - 0x0736, 0x074b, 0x075d, 0x076f, 0x0791, 0x07a3, 0x07c1, 0x07d9, - // Entry 40 - 7F - 0x0810, 0x082b, 0x0863, 0x087e, 0x0899, 0x08ae, 0x08d0, 0x08eb, - 0x08fd, 0x0918, 0x0946, 0x0946, 0x096a, 0x0976, 0x09b9, 0x09dd, - 0x09ff, 0x0a17, 0x0a29, 0x0a5a, 0x0a72, 0x0a8a, 0x0aaf, 0x0aca, - 0x0ad6, 0x0af7, 0x0b21, 0x0b3c, 0x0b48, 0x0b60, 0x0b91, 0x0ba3, - 0x0c2f, 0x0c4d, 0x0c5f, 0x0c84, 0x0c93, 0x0cc3, 0x0d29, 0x0d44, - 0x0d62, 0x0d6e, 0x0d80, 0x0dae, 0x0dcc, 0x0de4, 0x0df9, 0x0e1f, - 0x0e2b, 0x0e7f, 0x0e8e, 0x0e9d, 0x0ebe, 0x0eca, 0x0edc, 0x0eeb, - 0x0f03, 0x0f12, 0x0f24, 0x0f48, 0x0f63, 0x0f7b, 0x0f93, 0x0fd8, - // Entry 80 - BF - 0x0ffa, 0x101f, 0x1031, 0x1059, 0x107a, 0x108c, 0x10a1, 0x10c3, - 0x10ea, 0x1102, 0x111a, 0x112c, 0x114a, 0x1168, 0x1180, 0x1192, - 0x11aa, 0x11bc, 0x11d4, 0x11f5, 0x121d, 0x1238, 0x1266, 0x128a, - 0x1296, 0x12c0, 0x12db, 0x12fd, 0x133b, 0x1359, 0x1377, 0x139b, - 0x13ad, 0x13c2, 0x13e0, 0x13ef, 0x1407, 0x141c, 0x1437, 0x144c, - 0x147d, 0x148c, 0x14b4, 0x14cc, 0x14ea, 0x1517, 0x1529, 0x1538, - 0x1544, 0x1550, 0x1571, 0x157d, 0x158c, 0x1598, 0x15cc, 0x15fa, - 0x1618, 0x1633, 0x164e, 0x1693, 0x16cd, 0x16f2, 0x173b, 0x1756, - // Entry C0 - FF - 0x1765, 0x177a, 0x1789, 0x17c4, 0x17df, 0x17f7, 0x180f, 0x181e, - 0x1833, 0x1855, 0x1883, 0x18a1, 0x18b3, 0x18c8, 0x18e3, 0x1905, - 0x1923, 0x1974, 0x1992, 0x19bd, 0x19e2, 0x19f7, 0x1a0f, 0x1a24, - 0x1a49, 0x1a91, 0x1ab9, 0x1ae1, 0x1af3, 0x1b1a, 0x1b4f, 0x1ba0, - 0x1bac, 0x1bf0, 0x1bfc, 0x1c17, 0x1c38, 0x1c50, 0x1c72, 0x1c9f, - 0x1cb7, 0x1cc3, 0x1cd2, 0x1d13, 0x1d25, 0x1d37, 0x1d52, 0x1d67, - 0x1d79, 0x1dc7, 0x1dfb, 0x1e3c, 0x1e51, 0x1e78, 0x1e93, 0x1ef4, - 0x1f12, 0x1f59, 0x1f99, 0x1fb7, 0x1fc6, 0x1ffb, 0x200a, 0x201c, - // Entry 100 - 13F - 0x202b, 0x2040, 0x2068, 0x207d, 0x2098, 0x20bd, 0x20cf, 0x20e4, - 0x2109, 0x2131, 0x214c, 0x2174, 0x2196, 0x21bb, 0x21e0, 0x2202, - 0x2237, 0x2252, 0x2284, 0x229f, 0x22be, 0x22e0, 0x2302, 0x2327, - 0x234e, 0x2369, 0x23a3, 0x23c1, 0x23d0, 0x23ec, 0x240e, 0x2420, - 0x2442, 0x2464, 0x2489, 0x24b7, -} // Size: 608 bytes - -const koRegionStr string = "" + // Size: 3880 bytes - "어센션 섬안도라아랍에미리트아프가니스탄앤티가 바부다앵귈라알바니아아르메니아앙골라남극 대륙아르헨티나아메리칸 사모아오스트리아오스트레일리아" + - "아루바올란드 제도아제르바이잔보스니아 헤르체고비나바베이도스방글라데시벨기에부르키나파소불가리아바레인부룬디베냉생바르텔레미버뮤다브루나이" + - "볼리비아네덜란드령 카리브브라질바하마부탄부베섬보츠와나벨라루스벨리즈캐나다코코스 제도콩고-킨샤사중앙 아프리카 공화국콩고-브라자빌스위" + - "스코트디부아르쿡 제도칠레카메룬중국콜롬비아클립퍼튼 섬코스타리카쿠바카보베르데퀴라소크리스마스섬키프로스체코독일디에고 가르시아지부티덴마" + - "크도미니카도미니카 공화국알제리세우타 및 멜리야에콰도르에스토니아이집트서사하라에리트리아스페인에티오피아유럽 연합핀란드피지포클랜드 제" + - "도미크로네시아페로 제도프랑스가봉영국그레나다조지아프랑스령 기아나건지가나지브롤터그린란드감비아기니과들루프적도 기니그리스사우스조지아 " + - "사우스샌드위치 제도과테말라괌기니비사우가이아나홍콩(중국 특별행정구)허드 맥도널드 제도온두라스크로아티아아이티헝가리카나리아 제도인도" + - "네시아아일랜드이스라엘맨 섬인도영국령 인도양 식민지이라크이란아이슬란드이탈리아저지자메이카요르단일본케냐키르기스스탄캄보디아키리바시코모" + - "로세인트키츠 네비스북한대한민국쿠웨이트케이맨 제도카자흐스탄라오스레바논세인트루시아리히텐슈타인스리랑카라이베리아레소토리투아니아룩셈부르" + - "크라트비아리비아모로코모나코몰도바몬테네그로생마르탱마다가스카르마셜 제도마케도니아말리미얀마몽골마카오(중국 특별행정구)북마리아나제도마" + - "르티니크모리타니몬트세라트몰타모리셔스몰디브말라위멕시코말레이시아모잠비크나미비아뉴칼레도니아니제르노퍽섬나이지리아니카라과네덜란드노르웨이" + - "네팔나우루니우에뉴질랜드오만파나마페루프랑스령 폴리네시아파푸아뉴기니필리핀파키스탄폴란드생피에르 미클롱핏케언 섬푸에르토리코팔레스타인 " + - "지구포르투갈팔라우파라과이카타르오세아니아 외곽리유니온루마니아세르비아러시아르완다사우디아라비아솔로몬 제도세이셸수단스웨덴싱가포르세인트" + - "헬레나슬로베니아스발바르제도-얀마웬섬슬로바키아시에라리온산마리노세네갈소말리아수리남남수단상투메 프린시페엘살바도르신트마르턴시리아스와질" + - "란드트리스탄다쿠나터크스 케이커스 제도차드프랑스 남부 지방토고태국타지키스탄토켈라우동티모르투르크메니스탄튀니지통가터키트리니다드 토바" + - "고투발루대만탄자니아우크라이나우간다미국령 해외 제도유엔미국우루과이우즈베키스탄바티칸 시국세인트빈센트그레나딘베네수엘라영국령 버진아일" + - "랜드미국령 버진아일랜드베트남바누아투왈리스-푸투나 제도사모아코소보예멘마요트남아프리카잠비아짐바브웨알려지지 않은 지역세계아프리카북아" + - "메리카남아메리카(남미)오세아니아서부 아프리카중앙 아메리카동부 아프리카북부 아프리카중부 아프리카남부 아프리카아메리카 대륙북부 아" + - "메리카카리브 제도동아시아남아시아동남아시아남유럽오스트랄라시아멜라네시아미크로네시아 지역폴리네시아아시아중앙 아시아서아시아유럽동유럽북" + - "유럽서유럽라틴 아메리카" - -var koRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000d, 0x0016, 0x0028, 0x003a, 0x004d, 0x0056, 0x0062, - 0x0071, 0x007a, 0x0087, 0x0096, 0x00ac, 0x00bb, 0x00d0, 0x00d9, - 0x00e9, 0x00fb, 0x011a, 0x0129, 0x0138, 0x0141, 0x0153, 0x015f, - 0x0168, 0x0171, 0x0177, 0x0189, 0x0192, 0x019e, 0x01aa, 0x01c3, - 0x01cc, 0x01d5, 0x01db, 0x01e4, 0x01f0, 0x01fc, 0x0205, 0x020e, - 0x021e, 0x022e, 0x024b, 0x025e, 0x0267, 0x0279, 0x0283, 0x0289, - 0x0292, 0x0298, 0x02a4, 0x02b4, 0x02c3, 0x02c9, 0x02d8, 0x02e1, - 0x02f3, 0x02ff, 0x0305, 0x030b, 0x0321, 0x032a, 0x0333, 0x033f, - // Entry 40 - 7F - 0x0355, 0x035e, 0x0375, 0x0381, 0x0390, 0x0399, 0x03a5, 0x03b4, - 0x03bd, 0x03cc, 0x03d9, 0x03d9, 0x03e2, 0x03e8, 0x03fb, 0x040d, - 0x041a, 0x0423, 0x0429, 0x042f, 0x043b, 0x0444, 0x045a, 0x0460, - 0x0466, 0x0472, 0x047e, 0x0487, 0x048d, 0x0499, 0x04a6, 0x04af, - 0x04de, 0x04ea, 0x04ed, 0x04fc, 0x0508, 0x0526, 0x0540, 0x054c, - 0x055b, 0x0564, 0x056d, 0x0580, 0x058f, 0x059b, 0x05a7, 0x05ae, - 0x05b4, 0x05d1, 0x05da, 0x05e0, 0x05ef, 0x05fb, 0x0601, 0x060d, - 0x0616, 0x061c, 0x0622, 0x0634, 0x0640, 0x064c, 0x0655, 0x066e, - // Entry 80 - BF - 0x0674, 0x0680, 0x068c, 0x069c, 0x06ab, 0x06b4, 0x06bd, 0x06cf, - 0x06e1, 0x06ed, 0x06fc, 0x0705, 0x0714, 0x0723, 0x072f, 0x0738, - 0x0741, 0x074a, 0x0753, 0x0762, 0x076e, 0x0780, 0x078d, 0x079c, - 0x07a2, 0x07ab, 0x07b1, 0x07d2, 0x07e7, 0x07f6, 0x0802, 0x0811, - 0x0817, 0x0823, 0x082c, 0x0835, 0x083e, 0x084d, 0x0859, 0x0865, - 0x0877, 0x0880, 0x0889, 0x0898, 0x08a4, 0x08b0, 0x08bc, 0x08c2, - 0x08cb, 0x08d4, 0x08e0, 0x08e6, 0x08ef, 0x08f5, 0x0911, 0x0923, - 0x092c, 0x0938, 0x0941, 0x0957, 0x0964, 0x0976, 0x098c, 0x0998, - // Entry C0 - FF - 0x09a1, 0x09ad, 0x09b6, 0x09cc, 0x09d8, 0x09e4, 0x09f0, 0x09f9, - 0x0a02, 0x0a17, 0x0a27, 0x0a30, 0x0a36, 0x0a3f, 0x0a4b, 0x0a5d, - 0x0a6c, 0x0a8b, 0x0a9a, 0x0aa9, 0x0ab5, 0x0abe, 0x0aca, 0x0ad3, - 0x0adc, 0x0af2, 0x0b01, 0x0b10, 0x0b19, 0x0b28, 0x0b3d, 0x0b5a, - 0x0b60, 0x0b77, 0x0b7d, 0x0b83, 0x0b92, 0x0b9e, 0x0baa, 0x0bbf, - 0x0bc8, 0x0bce, 0x0bd4, 0x0bed, 0x0bf6, 0x0bfc, 0x0c08, 0x0c17, - 0x0c20, 0x0c37, 0x0c3d, 0x0c43, 0x0c4f, 0x0c61, 0x0c71, 0x0c8f, - 0x0c9e, 0x0cba, 0x0cd6, 0x0cdf, 0x0ceb, 0x0d05, 0x0d0e, 0x0d17, - // Entry 100 - 13F - 0x0d1d, 0x0d26, 0x0d35, 0x0d3e, 0x0d4a, 0x0d64, 0x0d6a, 0x0d76, - 0x0d85, 0x0d9c, 0x0dab, 0x0dbe, 0x0dd1, 0x0de4, 0x0df7, 0x0e0a, - 0x0e1d, 0x0e30, 0x0e43, 0x0e53, 0x0e5f, 0x0e6b, 0x0e7a, 0x0e83, - 0x0e98, 0x0ea7, 0x0ec0, 0x0ecf, 0x0ed8, 0x0ee8, 0x0ef4, 0x0efa, - 0x0f03, 0x0f0c, 0x0f15, 0x0f28, -} // Size: 608 bytes - -const kyRegionStr string = "" + // Size: 5809 bytes - "Ассеншин аралыАндорраБириккен Араб ЭмираттарыАфганистанАнтигуа жана Барб" + - "удаАнгуилаАлбанияАрменияАнголаАнтарктикаАргентинаАмерика СамоасыАвстрия" + - "АвстралияАрубаАланд аралдарыАзербайжанБосния жана ГерцеговинаБарбадосБа" + - "нгладешБельгияБуркина-ФасоБолгарияБахрейнБурундиБенинСент БартелемиБерм" + - "уд аралдарыБрунейБоливияКариб НидерланддарыБразилияБагам аралдарыБутанБ" + - "уве аралдарыБотсванаБеларусьБелизКанадаКокос (Килиӊ) аралдарыКонго-Кинш" + - "асаБорбордук Африка РеспубликасыКонго-БраззавилШвейцарияКот-д’ИвуарКук " + - "аралдарыЧилиКамерунКытайКолумбияКлиппертон аралыКоста-РикаКубаКапе Верд" + - "еКюрасаоКрисмас аралыКипрЧехияГерманияДиего ГарсияДжибутиДанияДоминикаД" + - "оминика РеспубликасыАлжирСеута жана МелиллаЭквадорЭстонияЕгипетБатыш Са" + - "хараЭритреяИспанияЭфиопияЕвропа БиримдигиФинляндияФиджиФолклэнд аралдар" + - "ыМикронезияФарер аралдарыФранцияГабонУлуу БританияГренадаГрузияГвиана (" + - "Франция)ГернсиГанаГибралтарГренландияГамбияГвинеяГваделупаЭкваториалдык" + - " ГвинеяГрецияТүштүк Жоржия жана Түштүк Сэндвич аралдарыГватемалаГуамГвин" + - "ея-БисауГайанаГонконг Кытай АААХерд жана Макдоналд аралдарыГондурасХорв" + - "атияГаитиВенгрияКанар аралдарыИндонезияИрландияИзраильМэн аралыИндияБри" + - "таниянын Индия океанындагы аймагыИракИранИсландияИталияЖерсиЯмайкаИорда" + - "нияЯпонияКенияКыргызстанКамбоджаКирибатиКоморосСент-Китс жана НевисТүнд" + - "үк КореяТүштүк КореяКувейтКайман АралдарыКазакстанЛаосЛиванСент-ЛюсияЛи" + - "хтенштейнШри-ЛанкаЛиберияЛесотоЛитваЛюксембургЛатвияЛивияМароккоМонакоМ" + - "олдоваЧерногорияСент-МартинМадагаскарМаршалл аралдарыМакедонияМалиМьянм" + - "а (Бирма)МонголияМакау Кытай АААТүндүк Мариана аралдарыМартиникаМаврита" + - "нияМонсерратМальтаМаврикийМалдив аралдарыМалавиМексикаМалайзияМозамбикН" + - "амибияЖаӊы КаледонияНигерНорфолк аралыНигерияНикарагуаНидерланддарНорве" + - "гияНепалНауруНиуэЖаӊы ЗеландияОманПанамаПеруФранцуз ПолинезиясыПапуа Жа" + - "ңы-ГвинеяФиллипинПакистанПольшаСен-Пьер жана МикелонПиткэрн аралдарыПуэ" + - "рто-РикоПалестина аймактарыПортугалияПалауПарагвайКатарАлыскы ОкеанияРе" + - "юнионРумынияСербияРоссияРуандаСауд АрабиясыСоломон аралдарыСейшелдерСуд" + - "анШвецияСингапурЫйык ЕленаСловенияСвалбард жана Жан МайенСловакияСьерра" + - "-ЛеонеСан МариноСенегалСомалиСуринамеТүштүк СуданСан-Томе жана ПринсипиЭ" + - "л СалвадорСинт МаартенСирияСвазилендТристан да КуньяТүркс жана Кайкос а" + - "ралдарыЧадФранциянын Түштүктөгү аймактарыТогоТаиландТажикстанТокелауТим" + - "ор-ЛестеТүркмөнстанТунисТонгаТүркияТринидад жана ТобагоТувалуТайваньТан" + - "занияУкраинаУгандаАКШнын сырткы аралдарыБУАмерика Кошмо ШтаттарыУругвай" + - "ӨзбекстанВатиканСент-Винсент жана ГренадиналарВенесуэлаВиргин аралдары " + - "(Британия)Виргин аралдары (АКШ)ВьетнамВануатуУоллис жана ФутунаСамоаКосо" + - "воЙеменМайоттаТүштүк Африка РеспубликасыЗамбияЗимбабвеБелгисиз чөлкөмДү" + - "йнөАфрикаТүндүк АмерикаТүштүк АмерикаОкеанияБатыш АфрикаБорбордук Амери" + - "каЧыгыш АфрикаТүндүк АфрикаБорбордук АфрикаТүштүк АфрикаАмерикаТүндүк А" + - "мерика (чөлкөм)Кариб аралдарыЧыгыш АзияТүштүк АзияТүштүк-Чыгыш АзияТүшт" + - "үк ЕвропаАвстралазияМеланезияМикронезия чөлкөмүПолинезияАзияБорбор Азия" + - "Батыш АзияЕвропаЧыгыш ЕвропаТүндүк ЕвропаБатыш ЕвропаЛатын Америкасы" - -var kyRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001b, 0x0029, 0x0057, 0x006b, 0x0091, 0x009f, 0x00ad, - 0x00bb, 0x00c7, 0x00db, 0x00ed, 0x010a, 0x0118, 0x012a, 0x0134, - 0x014f, 0x0163, 0x018f, 0x019f, 0x01b1, 0x01bf, 0x01d6, 0x01e6, - 0x01f4, 0x0202, 0x020c, 0x0227, 0x0244, 0x0250, 0x025e, 0x0283, - 0x0293, 0x02ae, 0x02b8, 0x02d1, 0x02e1, 0x02f1, 0x02fb, 0x0307, - 0x032f, 0x0348, 0x0380, 0x039d, 0x03af, 0x03c5, 0x03dc, 0x03e4, - 0x03f2, 0x03fc, 0x040c, 0x042b, 0x043e, 0x0446, 0x0459, 0x0467, - 0x0480, 0x0488, 0x0492, 0x04a2, 0x04b9, 0x04c7, 0x04d1, 0x04e1, - // Entry 40 - 7F - 0x050a, 0x0514, 0x0536, 0x0544, 0x0552, 0x055e, 0x0575, 0x0583, - 0x0591, 0x059f, 0x05be, 0x05be, 0x05d0, 0x05da, 0x05fb, 0x060f, - 0x062a, 0x0638, 0x0642, 0x065b, 0x0669, 0x0675, 0x0692, 0x069e, - 0x06a6, 0x06b8, 0x06cc, 0x06d8, 0x06e4, 0x06f6, 0x071d, 0x0729, - 0x0778, 0x078a, 0x0792, 0x07a9, 0x07b5, 0x07d5, 0x080a, 0x081a, - 0x082a, 0x0834, 0x0842, 0x085d, 0x086f, 0x087f, 0x088d, 0x089e, - 0x08a8, 0x08ed, 0x08f5, 0x08fd, 0x090d, 0x0919, 0x0923, 0x092f, - 0x093f, 0x094b, 0x0955, 0x0969, 0x0979, 0x0989, 0x0997, 0x09bc, - // Entry 80 - BF - 0x09d3, 0x09ea, 0x09f6, 0x0a13, 0x0a25, 0x0a2d, 0x0a37, 0x0a4a, - 0x0a60, 0x0a71, 0x0a7f, 0x0a8b, 0x0a95, 0x0aa9, 0x0ab5, 0x0abf, - 0x0acd, 0x0ad9, 0x0ae7, 0x0afb, 0x0b10, 0x0b24, 0x0b43, 0x0b55, - 0x0b5d, 0x0b76, 0x0b86, 0x0ba2, 0x0bce, 0x0be0, 0x0bf4, 0x0c06, - 0x0c12, 0x0c22, 0x0c3f, 0x0c4b, 0x0c59, 0x0c69, 0x0c79, 0x0c87, - 0x0ca2, 0x0cac, 0x0cc5, 0x0cd3, 0x0ce5, 0x0cfd, 0x0d0d, 0x0d17, - 0x0d21, 0x0d29, 0x0d42, 0x0d4a, 0x0d56, 0x0d5e, 0x0d83, 0x0da3, - 0x0db3, 0x0dc3, 0x0dcf, 0x0df6, 0x0e15, 0x0e2a, 0x0e4f, 0x0e63, - // Entry C0 - FF - 0x0e6d, 0x0e7d, 0x0e87, 0x0ea2, 0x0eb0, 0x0ebe, 0x0eca, 0x0ed6, - 0x0ee2, 0x0efb, 0x0f1a, 0x0f2c, 0x0f36, 0x0f42, 0x0f52, 0x0f65, - 0x0f75, 0x0fa0, 0x0fb0, 0x0fc7, 0x0fda, 0x0fe8, 0x0ff4, 0x1004, - 0x101b, 0x1044, 0x1059, 0x1070, 0x107a, 0x108c, 0x10aa, 0x10db, - 0x10e1, 0x111d, 0x1125, 0x1133, 0x1145, 0x1153, 0x1168, 0x117e, - 0x1188, 0x1192, 0x119e, 0x11c4, 0x11d0, 0x11de, 0x11ee, 0x11fc, - 0x1208, 0x1232, 0x1236, 0x1260, 0x126e, 0x1280, 0x128e, 0x12c7, - 0x12d9, 0x1309, 0x132f, 0x133d, 0x134b, 0x136d, 0x1377, 0x1383, - // Entry 100 - 13F - 0x138d, 0x139b, 0x13cd, 0x13d9, 0x13e9, 0x1406, 0x1410, 0x141c, - 0x1437, 0x1452, 0x1460, 0x1477, 0x1498, 0x14af, 0x14c8, 0x14e7, - 0x1500, 0x150e, 0x1538, 0x1553, 0x1566, 0x157b, 0x159b, 0x15b4, - 0x15ca, 0x15dc, 0x15ff, 0x1611, 0x1619, 0x162e, 0x1641, 0x164d, - 0x1664, 0x167d, 0x1694, 0x16b1, -} // Size: 608 bytes - -const loRegionStr string = "" + // Size: 8094 bytes - "ເກາະອາເຊນຊັນອັນດໍຣາສະຫະລັດອາຣັບເອມິເຣດອາຟການິດສະຖານແອນທິກົວ ແລະ ບາບູດາແອ" + - "ນກຸຍລາແອວເບເນຍອາເມເນຍແອງໂກລາແອນຕາດຕິກາອາເຈນທິນາອາເມຣິກາ ຊາມົວອອສເທຣຍອອ" + - "ສເຕຣເລຍອາຣູບາຫມູ່ເກາະໂອລັນອາເຊີໄບຈານບອດສະເນຍ ແລະ ແຮສໂກວີນາບາບາໂດສບັງກະ" + - "ລາເທດເບວຢຽມເບີກິນາ ຟາໂຊບັງກາເຣຍບາເຣນບູຣຸນດິເບນິນເຊນ ບາເທເລມີເບີມິວດາບຣ" + - "ູໄນໂບລິເວຍຄາຣິບບຽນ ເນເທີແລນບະເລຊີນບາຮາມາສພູຖານເກາະບູເວດບອດສະວານາເບວບາຣ" + - "ຸສເບລີຊແຄນາດາຫມູ່ເກາະໂກໂກສຄອງໂກ - ຄິນຊາຊາສາທາລະນະລັດອາຟຣິກາກາງຄອງໂກ - " + - "ບຣາຊາວິວສະວິດເຊີແລນໂຄຕີ ວົວໝູ່ເກາະຄຸກຈີເລຄາເມຣູນຈີນໂຄລົມເບຍເກາະຄລິບເປີ" + - "ຕັນໂຄສຕາ ຣິກາຄິວບາເຄບ ເວີດຄູຣາຊາວເກາະຄຣິສມາດໄຊປຣັສເຊັກເຊຍເຢຍລະມັນດິເອໂ" + - "ກ ກາເຊຍຈິບູຕິເດນມາກໂດມີນິຄາສາທາລະນະລັດ ໂດມິນິກັນອັລຈິເຣຍເຊວຕາ ແລະເມລິນ" + - "ລາເອກວາດໍເອສໂຕເນຍອີຢິບຊາຮາຣາຕາເວັນຕົກເອຣິເທຣຍສະເປນອີທິໂອເປຍສະຫະພາບຢູໂຣ" + - "ບຟິນແລນຟິຈິຫມູ່ເກາະຟອກແລນໄມໂຄຣນີເຊຍຫມູ່ເກາະແຟໂຣຝຣັ່ງກາບອນສະຫະລາດຊະອະນາ" + - "ຈັກເກຣເນດາຈໍເຈຍເຟຣນຊ໌ ກຸຍອານາເກີນຊີການາຈິບບຣອນທາກຣີນແລນສາທາລະນະລັດແກມເ" + - "ບຍກິນີກົວດາລູບເອຄົວໂທຣຽວ ກີນີກຣີຊໝູ່ເກາະຈໍເຈຍ & ເຊົາ ແຊນວິດກົວເທມາລາກວ" + - "າມກິນີ-ບິສເຊົາກາຍຢານາຮອງກົງ ເຂດປົກຄອງພິເສດ ຈີນໝູ່ເກາະເຮີດ & ແມັກໂດນອລຮ" + - "ອນດູຣັສໂຄຣເອເທຍໄຮຕິຮັງກາຣີໝູ່ເກາະຄານາຣີອິນໂດເນເຊຍໄອຣ໌ແລນອິສຣາເອວເອວ ອອ" + - "ບ ແມນອິນເດຍເຂດແດນອັງກິດໃນມະຫາສະມຸດອິນເດຍອີຣັກອີຣານໄອສແລນອິຕາລີເຈີຊີຈາໄ" + - "ມຄາຈໍແດນຍີ່ປຸ່ນເຄນຢາຄີກິສຖານກຳປູເຈຍຄິຣິບາທິໂຄໂມໂຣສເຊນ ຄິດ ແລະ ເນວິສເກົ" + - "າຫລີເໜືອເກົາຫລີໃຕ້ກູເວດໝູ່ເກາະ ເຄແມນຄາຊັກສະຖານລາວເລບານອນເຊນ ລູເຊຍລິດເທ" + - "ນສະຕາຍສີລັງກາລິເບີເຣຍເລໂຊໂທລິທົວເນຍລຸກຊຳບົວລັດເວຍລິເບຍໂມຣັອກໂຄໂມນາໂຄໂມ" + - "ນໂດວາມອນເຕເນໂກຣເຊນ ມາທິນມາດາກາສກາຫມູ່ເກາະມາແຊວແມຊິໂດເນຍມາລີມຽນມາ (ເບີມ" + - "າ)ມອງໂກເລຍມາເກົ້າ ເຂດປົກຄອງພິເສດ ຈີນຫມູ່ເກາະມາແຊວຕອນເຫນືອມາຕິນີກມົວຣິເ" + - "ທເນຍມອນເຊີຣາດມອນທາມົວຣິຊຽສມັນດິຟມາລາວີເມັກຊິໂກມາເລເຊຍໂມແຊມບິກນາມີເບຍນິ" + - "ວ ຄາເລໂດເນຍນິເຈີເກາະນໍໂຟກໄນຈີເຣຍນິກຄາຣາກົວເນເທີແລນນໍເວເນປານນາອູຣູນີອູເ" + - "ອນິວຊີແລນໂອມານພານາມາເປຣູເຟຣນຊ໌ ໂພລິນີເຊຍປາປົວນິວກີນີຟິລິບປິນປາກິດສະຖານ" + - "ໂປແລນເຊນ ປີແອ ມິເກວລອນໝູ່ເກາະພິດແຄນເພືອໂຕ ຣິໂກດິນແດນ ປາເລສຕິນຽນພອລທູໂກ" + - "ປາລາວພາຣາກວຍກາຕາເຂດຫ່າງໄກໂອຊີເນຍເຣອູນິຍົງໂຣແມເນຍເຊີເບຍຣັດເຊຍຣວັນດາຊາອຸ" + - "ດິ ອາຣາເບຍຫມູ່ເກາະໂຊໂລມອນເຊເຊວເລສຊູດານສະວີເດັນສິງກະໂປເຊນ ເຮເລນາສະໂລເວເ" + - "ນຍສະວາບາ ແລະ ແຢນ ມາເຢນສະໂລວາເກຍເຊຍຣາ ລີໂອນແຊນ ມາຣິໂນເຊນີໂກລໂຊມາລີຊູຣິນ" + - "າມຊູດານໃຕ້ເຊົາທູເມ ແລະ ພຣິນຊິບເອວ ຊໍວາດໍຊິນ ມາເທັນຊີເຣຍສະວາຊິແລນທຣິສຕັ" + - "ນ ດາ ກັນຮາໝູ່ເກາະ ເທີກ ແລະ ໄຄໂຄສຊາດເຂດແດນທາງໃຕ້ຂອຝຮັ່ງໂຕໂກໄທທາຈິກິດສະຖ" + - "ານໂຕເກເລົາທິມໍ-ເລສເຕເທີກເມນິສະຖານຕູນິເຊຍທອງກາເທີຄີທຣິນິແດດ ແລະ ໂທແບໂກຕ" + - "ູວາລູໄຕ້ຫວັນທານຊາເນຍຢູເຄຣນອູການດາໝູ່ເກາະຮອບນອກຂອງສະຫະລັດຯສະຫະປະຊາຊາດສະ" + - "ຫະລັດອູຣຸກວຍອຸສເບກິສະຖານນະຄອນ ວາຕິກັນເຊນ ວິນເຊນ ແລະ ເກຣເນດິນເວເນຊູເອລາ" + - "ໝູ່ເກາະ ບຣິທິຊ ເວີຈິນໝູ່ເກາະ ຢູເອສ ເວີຈິນຫວຽດນາມວານົວຕູວາລລິສ ແລະ ຟູຕູ" + - "ນາຊາມົວໂຄໂຊໂວເຢເມນມາຢັອດອາຟຣິກາໃຕ້ແຊມເບຍຊິມບັບເວຂົງເຂດທີ່ບໍ່ຮູ້ຈັກໂລກອ" + - "າຟຣິກາອາເມລິກາເໜືອອາເມລິກາໃຕ້ໂອຊີອານີອາຟຣິກາຕາເວັນຕົກອາເມລິກາກາງອາຟຣິກ" + - "າຕາເວັນອອກອາຟຣິກາເໜືອອາຟຣິກາກາງອາເມຣິກາພາກເໜືອອາເມລີກາຄາຣິບບຽນອາຊີຕາເວ" + - "ັນອອກອາຊີໄຕ້ອາຊີຕາເວັນອອກສ່ຽງໄຕ້ຢູໂຣບໃຕ້ໂອດສະຕາລີເມລານີເຊຍເຂດໄມໂຄຣເນຊຽ" + - "ນໂພລີນີເຊຍອາຊີອາຊີກາງອາຊີຕາເວັນຕົກຢູໂຣບຢູໂຣບຕາເວັນອອກຢູໂຣບເໜືອຢູໂຣບຕາເ" + - "ວັນຕົກລາຕິນ ອາເມລິກາ" - -var loRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0024, 0x0039, 0x0072, 0x0099, 0x00ce, 0x00e6, 0x00fe, - 0x0113, 0x0128, 0x0146, 0x0161, 0x0189, 0x019e, 0x01b9, 0x01cb, - 0x01f2, 0x0210, 0x024e, 0x0263, 0x0281, 0x0293, 0x02b5, 0x02cd, - 0x02dc, 0x02f1, 0x0300, 0x0322, 0x033a, 0x0349, 0x035e, 0x038f, - 0x03a4, 0x03b9, 0x03c8, 0x03e3, 0x03fe, 0x0416, 0x0425, 0x0437, - 0x045e, 0x0485, 0x04c4, 0x04ee, 0x050f, 0x0525, 0x0543, 0x054f, - 0x0564, 0x056d, 0x0585, 0x05af, 0x05cb, 0x05da, 0x05f0, 0x0605, - 0x0626, 0x0638, 0x064d, 0x0665, 0x0687, 0x0699, 0x06ab, 0x06c3, - // Entry 40 - 7F - 0x0700, 0x0718, 0x0746, 0x075b, 0x0773, 0x0782, 0x07af, 0x07c7, - 0x07d6, 0x07f1, 0x0815, 0x0815, 0x0827, 0x0833, 0x085d, 0x087b, - 0x089f, 0x08ae, 0x08bd, 0x08ed, 0x0902, 0x0911, 0x0939, 0x094b, - 0x0957, 0x0972, 0x0987, 0x09ba, 0x09c6, 0x09de, 0x0a09, 0x0a15, - 0x0a5b, 0x0a76, 0x0a82, 0x0aa4, 0x0ab9, 0x0b00, 0x0b3f, 0x0b57, - 0x0b6f, 0x0b7b, 0x0b90, 0x0bb7, 0x0bd5, 0x0bea, 0x0c02, 0x0c1f, - 0x0c31, 0x0c88, 0x0c97, 0x0ca6, 0x0cb8, 0x0cca, 0x0cd9, 0x0ceb, - 0x0cfa, 0x0d0f, 0x0d1e, 0x0d36, 0x0d4b, 0x0d63, 0x0d78, 0x0da5, - // Entry 80 - BF - 0x0dc6, 0x0de4, 0x0df3, 0x0e18, 0x0e36, 0x0e3f, 0x0e54, 0x0e6d, - 0x0e8e, 0x0ea3, 0x0ebb, 0x0ecd, 0x0ee5, 0x0efd, 0x0f0f, 0x0f1e, - 0x0f36, 0x0f48, 0x0f5d, 0x0f7b, 0x0f94, 0x0faf, 0x0fd6, 0x0ff1, - 0x0ffd, 0x101e, 0x1036, 0x1080, 0x10bf, 0x10d4, 0x10f2, 0x110d, - 0x111c, 0x1134, 0x1146, 0x1158, 0x1170, 0x1185, 0x119d, 0x11b2, - 0x11d7, 0x11e6, 0x1201, 0x1216, 0x1234, 0x124c, 0x1258, 0x1267, - 0x1279, 0x128b, 0x12a3, 0x12b2, 0x12c4, 0x12d0, 0x12fe, 0x1322, - 0x133a, 0x1358, 0x1367, 0x1396, 0x13bd, 0x13dc, 0x140d, 0x1422, - // Entry C0 - FF - 0x1431, 0x1446, 0x1452, 0x1482, 0x149d, 0x14b2, 0x14c4, 0x14d6, - 0x14e8, 0x1510, 0x153d, 0x1555, 0x1564, 0x157c, 0x1591, 0x15ad, - 0x15c8, 0x15fe, 0x1619, 0x1638, 0x1654, 0x1669, 0x167b, 0x1690, - 0x16a8, 0x16e0, 0x16fc, 0x1718, 0x1727, 0x1742, 0x176e, 0x17aa, - 0x17b3, 0x17ec, 0x17f8, 0x17fe, 0x1822, 0x183a, 0x1856, 0x187d, - 0x1892, 0x18a1, 0x18b0, 0x18e5, 0x18f7, 0x190c, 0x1924, 0x1936, - 0x194b, 0x1993, 0x19b4, 0x19c9, 0x19de, 0x1a02, 0x1a27, 0x1a66, - 0x1a84, 0x1abf, 0x1af7, 0x1b0c, 0x1b21, 0x1b50, 0x1b5f, 0x1b71, - // Entry 100 - 13F - 0x1b80, 0x1b92, 0x1bb0, 0x1bc2, 0x1bda, 0x1c10, 0x1c19, 0x1c2e, - 0x1c52, 0x1c73, 0x1c8b, 0x1cbb, 0x1cdc, 0x1d0c, 0x1d2d, 0x1d4b, - 0x1d4b, 0x1d63, 0x1d90, 0x1da8, 0x1dcf, 0x1de4, 0x1e20, 0x1e38, - 0x1e53, 0x1e6e, 0x1e95, 0x1eb0, 0x1ebc, 0x1ed1, 0x1ef8, 0x1f07, - 0x1f31, 0x1f4c, 0x1f76, 0x1f9e, -} // Size: 608 bytes - -const ltRegionStr string = "" + // Size: 3399 bytes - "Dangun Žengimo salaAndoraJungtiniai Arabų EmyrataiAfganistanasAntigva ir" + - " BarbudaAngilijaAlbanijaArmėnijaAngolaAntarktidaArgentinaAmerikos SamoaA" + - "ustrijaAustralijaArubaAlandų SalosAzerbaidžanasBosnija ir HercegovinaBar" + - "badosasBangladešasBelgijaBurkina FasasBulgarijaBahreinasBurundisBeninasS" + - "en BartelemiBermudaBrunėjusBolivijaKaribų NyderlandaiBrazilijaBahamosBut" + - "anasBuvė SalaBotsvanaBaltarusijaBelizasKanadaKokosų (Kilingo) SalosKonga" + - "s-KinšasaCentrinės Afrikos RespublikaKongas-BrazavilisŠveicarijaDramblio" + - " Kaulo KrantasKuko SalosČilėKamerūnasKinijaKolumbijaKlipertono salaKosta" + - " RikaKubaŽaliasis KyšulysKiurasaoKalėdų SalaKiprasČekijaVokietijaDiego G" + - "arsijaDžibutisDanijaDominikaDominikos RespublikaAlžyrasSeuta ir MelilaEk" + - "vadorasEstijaEgiptasVakarų SacharaEritrėjaIspanijaEtiopijaEuropos Sąjung" + - "aSuomijaFidžisFolklando SalosMikronezijaFarerų SalosPrancūzijaGabonasJun" + - "gtinė KaralystėGrenadaGruzijaPrancūzijos GvianaGernsisGanaGibraltarasGre" + - "nlandijaGambijaGvinėjaGvadelupaPusiaujo GvinėjaGraikijaPietų Džordžija i" + - "r Pietų Sandvičo salosGvatemalaGuamasBisau GvinėjaGajanaYpatingasis Admi" + - "nistracinis Kinijos Regionas HonkongasHerdo ir Makdonaldo SalosHondūrasK" + - "roatijaHaitisVengrijaKanarų salosIndonezijaAirijaIzraelisMeno SalaIndija" + - "Indijos Vandenyno Britų SritisIrakasIranasIslandijaItalijaDžersisJamaika" + - "JordanijaJaponijaKenijaKirgizijaKambodžaKiribatisKomoraiSent Kitsas ir N" + - "evisŠiaurės KorėjaPietų KorėjaKuveitasKaimanų SalosKazachstanasLaosasLib" + - "anasSent LusijaLichtenšteinasŠri LankaLiberijaLesotasLietuvaLiuksemburga" + - "sLatvijaLibijaMarokasMonakasMoldovaJuodkalnijaSen MartenasMadagaskarasMa" + - "ršalo SalosMakedonijaMalisMianmaras (Birma)MongolijaYpatingasis Administ" + - "racinis Kinijos Regionas MakaoMarianos Šiaurinės SalosMartinikaMauritani" + - "jaMontseratasMaltaMauricijusMaldyvaiMalavisMeksikaMalaizijaMozambikasNam" + - "ibijaNaujoji KaledonijaNigerisNorfolko salaNigerijaNikaragvaNyderlandaiN" + - "orvegijaNepalasNauruNiujėNaujoji ZelandijaOmanasPanamaPeruPrancūzijos Po" + - "linezijaPapua Naujoji GvinėjaFilipinaiPakistanasLenkijaSen Pjeras ir Mik" + - "elonasPitkerno salosPuerto RikasPalestinos teritorijaPortugalijaPalauPar" + - "agvajusKatarasNuošali OkeanijaReunjonasRumunijaSerbijaRusijaRuandaSaudo " + - "ArabijaSaliamono SalosSeišeliaiSudanasŠvedijaSingapūrasŠv. Elenos SalaSl" + - "ovėnijaSvalbardas ir Janas MajenasSlovakijaSiera LeonėSan MarinasSenegal" + - "asSomalisSurinamasPietų SudanasSan Tomė ir PrinsipėSalvadorasSint Marten" + - "asSirijaSvazilandasTristanas da KunjaTerkso ir Kaikoso SalosČadasPrancūz" + - "ijos Pietų sritysTogasTailandasTadžikijaTokelauRytų TimorasTurkmėnistana" + - "sTunisasTongaTurkijaTrinidadas ir TobagasTuvaluTaivanasTanzanijaUkrainaU" + - "gandaJungtinių Valstijų Mažosios Tolimosios SalosJungtinės TautosJungtin" + - "ės ValstijosUrugvajusUzbekistanasVatikano Miesto ValstybėŠventasis Vinc" + - "entas ir GrenadinaiVenesuelaDidžiosios Britanijos Mergelių SalosJungtini" + - "ų Valstijų Mergelių SalosVietnamasVanuatuVolisas ir FutūnaSamoaKosovasJ" + - "emenasMajotasPietų AfrikaZambijaZimbabvėnežinoma sritispasaulisAfrikaŠia" + - "urės AmerikaPietų AmerikaOkeanijaVakarų AfrikaCentrinė AmerikaRytų Afrik" + - "aŠiaurės AfrikaVidurio AfrikaPietinė AfrikaAmerikaŠiaurinė AmerikaKariba" + - "iRytų AzijaPietų AzijaPietryčių AzijaPietų EuropaAustralazijaMelanezijaM" + - "ikronezijos regionasPolinezijaAzijaCentrinė AzijaVakarų AzijaEuropaRytų " + - "EuropaŠiaurės EuropaVakarų EuropaLotynų Amerika" - -var ltRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0014, 0x001a, 0x0034, 0x0040, 0x0052, 0x005a, 0x0062, - 0x006b, 0x0071, 0x007b, 0x0084, 0x0092, 0x009a, 0x00a4, 0x00a9, - 0x00b6, 0x00c4, 0x00da, 0x00e4, 0x00f0, 0x00f7, 0x0104, 0x010d, - 0x0116, 0x011e, 0x0125, 0x0132, 0x0139, 0x0142, 0x014a, 0x015d, - 0x0166, 0x016d, 0x0174, 0x017e, 0x0186, 0x0191, 0x0198, 0x019e, - 0x01b5, 0x01c4, 0x01e1, 0x01f2, 0x01fd, 0x0213, 0x021d, 0x0223, - 0x022d, 0x0233, 0x023c, 0x024b, 0x0255, 0x0259, 0x026b, 0x0273, - 0x0280, 0x0286, 0x028d, 0x0296, 0x02a3, 0x02ac, 0x02b2, 0x02ba, - // Entry 40 - 7F - 0x02ce, 0x02d6, 0x02e5, 0x02ee, 0x02f4, 0x02fb, 0x030a, 0x0313, - 0x031b, 0x0323, 0x0333, 0x0333, 0x033a, 0x0341, 0x0350, 0x035b, - 0x0368, 0x0373, 0x037a, 0x038e, 0x0395, 0x039c, 0x03af, 0x03b6, - 0x03ba, 0x03c5, 0x03d0, 0x03d7, 0x03df, 0x03e8, 0x03f9, 0x0401, - 0x042d, 0x0436, 0x043c, 0x044a, 0x0450, 0x0486, 0x049f, 0x04a8, - 0x04b0, 0x04b6, 0x04be, 0x04cb, 0x04d5, 0x04db, 0x04e3, 0x04ec, - 0x04f2, 0x0511, 0x0517, 0x051d, 0x0526, 0x052d, 0x0535, 0x053c, - 0x0545, 0x054d, 0x0553, 0x055c, 0x0565, 0x056e, 0x0575, 0x0589, - // Entry 80 - BF - 0x059a, 0x05a8, 0x05b0, 0x05be, 0x05ca, 0x05d0, 0x05d7, 0x05e2, - 0x05f1, 0x05fb, 0x0603, 0x060a, 0x0611, 0x061e, 0x0625, 0x062b, - 0x0632, 0x0639, 0x0640, 0x064b, 0x0657, 0x0663, 0x0671, 0x067b, - 0x0680, 0x0691, 0x069a, 0x06cc, 0x06e6, 0x06ef, 0x06fa, 0x0705, - 0x070a, 0x0714, 0x071c, 0x0723, 0x072a, 0x0733, 0x073d, 0x0745, - 0x0757, 0x075e, 0x076b, 0x0773, 0x077c, 0x0787, 0x0790, 0x0797, - 0x079c, 0x07a2, 0x07b3, 0x07b9, 0x07bf, 0x07c3, 0x07da, 0x07f0, - 0x07f9, 0x0803, 0x080a, 0x0821, 0x082f, 0x083b, 0x0850, 0x085b, - // Entry C0 - FF - 0x0860, 0x086a, 0x0871, 0x0882, 0x088b, 0x0893, 0x089a, 0x08a0, - 0x08a6, 0x08b3, 0x08c2, 0x08cc, 0x08d3, 0x08db, 0x08e6, 0x08f6, - 0x0900, 0x091b, 0x0924, 0x0930, 0x093b, 0x0944, 0x094b, 0x0954, - 0x0962, 0x0978, 0x0982, 0x098f, 0x0995, 0x09a0, 0x09b2, 0x09c9, - 0x09cf, 0x09e9, 0x09ee, 0x09f7, 0x0a01, 0x0a08, 0x0a15, 0x0a24, - 0x0a2b, 0x0a30, 0x0a37, 0x0a4c, 0x0a52, 0x0a5a, 0x0a63, 0x0a6a, - 0x0a70, 0x0a9f, 0x0ab0, 0x0ac4, 0x0acd, 0x0ad9, 0x0af2, 0x0b14, - 0x0b1d, 0x0b43, 0x0b67, 0x0b70, 0x0b77, 0x0b89, 0x0b8e, 0x0b95, - // Entry 100 - 13F - 0x0b9c, 0x0ba3, 0x0bb0, 0x0bb7, 0x0bc0, 0x0bd0, 0x0bd8, 0x0bde, - 0x0bef, 0x0bfd, 0x0c05, 0x0c13, 0x0c24, 0x0c30, 0x0c40, 0x0c4e, - 0x0c5d, 0x0c64, 0x0c76, 0x0c7d, 0x0c88, 0x0c94, 0x0ca5, 0x0cb2, - 0x0cbe, 0x0cc8, 0x0cdd, 0x0ce7, 0x0cec, 0x0cfb, 0x0d08, 0x0d0e, - 0x0d1a, 0x0d2a, 0x0d38, 0x0d47, -} // Size: 608 bytes - -const lvRegionStr string = "" + // Size: 3330 bytes - "Debesbraukšanas salaAndoraApvienotie Arābu EmirātiAfganistānaAntigva un " + - "BarbudaAngiljaAlbānijaArmēnijaAngolaAntarktikaArgentīnaASV SamoaAustrija" + - "AustrālijaArubaOlandes salasAzerbaidžānaBosnija un HercegovinaBarbadosaB" + - "angladešaBeļģijaBurkinafasoBulgārijaBahreinaBurundijaBeninaSenbartelmīBe" + - "rmudu salasBrunejaBolīvijaNīderlandes Karību salasBrazīlijaBahamu salasB" + - "utānaBuvē salaBotsvānaBaltkrievijaBelizaKanādaKokosu (Kīlinga) salasKong" + - "o (Kinšasa)Centrālāfrikas RepublikaKongo (Brazavila)ŠveiceKotdivuāraKuka" + - " salasČīleKamerūnaĶīnaKolumbijaKlipertona salaKostarikaKubaKaboverdeKira" + - "saoZiemsvētku salaKipraČehijaVācijaDjego Garsijas atolsDžibutijaDānijaDo" + - "minikaDominikānaAlžīrijaSeūta un MeliljaEkvadoraIgaunijaĒģipteRietumsahā" + - "raEritrejaSpānijaEtiopijaEiropas SavienībaSomijaFidžiFolklenda salasMikr" + - "onēzijaFēru salasFrancijaGabonaLielbritānijaGrenādaGruzijaFrancijas Gviā" + - "naGērnsijaGanaGibraltārsGrenlandeGambijaGvinejaGvadelupaEkvatoriālā Gvin" + - "ejaGrieķijaDienviddžordžija un Dienvidsendviču salasGvatemalaGuamaGvinej" + - "a-BisavaGajānaĶīnas īpašās pārvaldes apgabals HonkongaHērda sala un Makd" + - "onalda salasHondurasaHorvātijaHaitiUngārijaKanāriju salasIndonēzijaĪrija" + - "IzraēlaMenaIndijaIndijas okeāna Britu teritorijaIrākaIrānaIslandeItālija" + - "DžērsijaJamaikaJordānijaJapānaKenijaKirgizstānaKambodžaKiribatiKomoru sa" + - "lasSentkitsa un NevisaZiemeļkorejaDienvidkorejaKuveitaKaimanu salasKazah" + - "stānaLaosaLibānaSentlūsijaLihtenšteinaŠrilankaLibērijaLesotoLietuvaLukse" + - "mburgaLatvijaLībijaMarokaMonakoMoldovaMelnkalneSenmartēnaMadagaskaraMārš" + - "ala salasMaķedonijaMaliMjanma (Birma)MongolijaĶīnas īpašās pārvaldes apg" + - "abals MakaoZiemeļu Marianas salasMartinikaMauritānijaMontserrataMaltaMau" + - "rīcijaMaldīvijaMalāvijaMeksikaMalaizijaMozambikaNamībijaJaunkaledonijaNi" + - "gēraNorfolkas salaNigērijaNikaragvaNīderlandeNorvēģijaNepālaNauruNiueJau" + - "nzēlandeOmānaPanamaPeruFrancijas PolinēzijaPapua-JaungvinejaFilipīnasPak" + - "istānaPolijaSenpjēra un MikelonaPitkērnas salasPuertorikoPalestīnaPortug" + - "ālePalauParagvajaKataraOkeānijas attālās salasReinjonaRumānijaSerbijaKr" + - "ievijaRuandaSaūda ArābijaZālamana salasSeišelu salasSudānaZviedrijaSinga" + - "pūraSv.Helēnas salaSlovēnijaSvalbāra un Jana Majena salaSlovākijaSjerral" + - "eoneSanmarīnoSenegālaSomālijaSurinamaDienvidsudānaSantome un PrinsipiSal" + - "vadoraSintmārtenaSīrijaSvazilendaTristana da Kuņas salasTērksas un Kaiko" + - "sas salasČadaFrancijas Dienvidjūru teritorijaTogoTaizemeTadžikistānaToke" + - "lauAustrumtimoraTurkmenistānaTunisijaTongaTurcijaTrinidāda un TobāgoTuva" + - "luTaivānaTanzānijaUkrainaUgandaASV Mazās Aizjūras salasApvienoto Nāciju " + - "OrganizācijaAmerikas Savienotās ValstisUrugvajaUzbekistānaVatikānsSentvi" + - "nsenta un GrenadīnasVenecuēlaBritu VirdžīnasASV VirdžīnasVjetnamaVanuatu" + - "Volisa un Futunas salasSamoaKosovaJemenaMajotaDienvidāfrikas RepublikaZa" + - "mbijaZimbabvenezināms reģionspasauleĀfrikaZiemeļamerikaDienvidamerikaOke" + - "ānijaRietumāfrikaCentrālamerikaAustrumāfrikaZiemeļāfrikaVidusāfrikaDien" + - "vidāfrikaAmerikaAmerikas ziemeļu daļaKarību jūras reģionsAustrumāzijaDie" + - "nvidāzijaCentrālaustrumāzijaDienvideiropaAustrālāzijaMelanēzijaMikronēzi" + - "jas reģionsPolinēzijaĀzijaCentrālāzijaRietumāzijaEiropaAustrumeiropaZiem" + - "eļeiropaRietumeiropaLatīņamerika" - -var lvRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0015, 0x001b, 0x0035, 0x0041, 0x0053, 0x005a, 0x0063, - 0x006c, 0x0072, 0x007c, 0x0086, 0x008f, 0x0097, 0x00a2, 0x00a7, - 0x00b4, 0x00c2, 0x00d8, 0x00e1, 0x00ec, 0x00f5, 0x0100, 0x010a, - 0x0112, 0x011b, 0x0121, 0x012d, 0x013a, 0x0141, 0x014a, 0x0164, - 0x016e, 0x017a, 0x0181, 0x018b, 0x0194, 0x01a0, 0x01a6, 0x01ad, - 0x01c4, 0x01d4, 0x01ee, 0x01ff, 0x0206, 0x0211, 0x021b, 0x0221, - 0x022a, 0x0230, 0x0239, 0x0248, 0x0251, 0x0255, 0x025e, 0x0265, - 0x0275, 0x027a, 0x0281, 0x0288, 0x029c, 0x02a6, 0x02ad, 0x02b5, - // Entry 40 - 7F - 0x02c0, 0x02ca, 0x02db, 0x02e3, 0x02eb, 0x02f3, 0x0300, 0x0308, - 0x0310, 0x0318, 0x032a, 0x032a, 0x0330, 0x0336, 0x0345, 0x0351, - 0x035c, 0x0364, 0x036a, 0x0378, 0x0380, 0x0387, 0x0398, 0x03a1, - 0x03a5, 0x03b0, 0x03b9, 0x03c0, 0x03c7, 0x03d0, 0x03e5, 0x03ee, - 0x041a, 0x0423, 0x0428, 0x0436, 0x043d, 0x046b, 0x048a, 0x0493, - 0x049d, 0x04a2, 0x04ab, 0x04ba, 0x04c5, 0x04cb, 0x04d3, 0x04d7, - 0x04dd, 0x04fd, 0x0503, 0x0509, 0x0510, 0x0518, 0x0522, 0x0529, - 0x0533, 0x053a, 0x0540, 0x054c, 0x0555, 0x055d, 0x0569, 0x057c, - // Entry 80 - BF - 0x0589, 0x0596, 0x059d, 0x05aa, 0x05b5, 0x05ba, 0x05c1, 0x05cc, - 0x05d9, 0x05e2, 0x05eb, 0x05f1, 0x05f8, 0x0603, 0x060a, 0x0611, - 0x0617, 0x061d, 0x0624, 0x062d, 0x0638, 0x0643, 0x0652, 0x065d, - 0x0661, 0x066f, 0x0678, 0x06a3, 0x06ba, 0x06c3, 0x06cf, 0x06da, - 0x06df, 0x06e9, 0x06f3, 0x06fc, 0x0703, 0x070c, 0x0715, 0x071e, - 0x072c, 0x0733, 0x0741, 0x074a, 0x0753, 0x075e, 0x0769, 0x0770, - 0x0775, 0x0779, 0x0785, 0x078b, 0x0791, 0x0795, 0x07aa, 0x07bb, - 0x07c5, 0x07cf, 0x07d5, 0x07ea, 0x07fa, 0x0804, 0x080e, 0x0818, - // Entry C0 - FF - 0x081d, 0x0826, 0x082c, 0x0846, 0x084e, 0x0857, 0x085e, 0x0866, - 0x086c, 0x087b, 0x088a, 0x0898, 0x089f, 0x08a8, 0x08b2, 0x08c2, - 0x08cc, 0x08e9, 0x08f3, 0x08fe, 0x0908, 0x0911, 0x091a, 0x0922, - 0x0930, 0x0943, 0x094c, 0x0958, 0x095f, 0x0969, 0x0981, 0x099b, - 0x09a0, 0x09c1, 0x09c5, 0x09cc, 0x09da, 0x09e1, 0x09ee, 0x09fc, - 0x0a04, 0x0a09, 0x0a10, 0x0a25, 0x0a2b, 0x0a33, 0x0a3d, 0x0a44, - 0x0a4a, 0x0a64, 0x0a83, 0x0a9f, 0x0aa7, 0x0ab3, 0x0abc, 0x0ad7, - 0x0ae1, 0x0af2, 0x0b01, 0x0b09, 0x0b10, 0x0b27, 0x0b2c, 0x0b32, - // Entry 100 - 13F - 0x0b38, 0x0b3e, 0x0b57, 0x0b5e, 0x0b66, 0x0b78, 0x0b7f, 0x0b86, - 0x0b94, 0x0ba2, 0x0bab, 0x0bb8, 0x0bc7, 0x0bd5, 0x0be3, 0x0bef, - 0x0bfd, 0x0c04, 0x0c1b, 0x0c32, 0x0c3f, 0x0c4c, 0x0c61, 0x0c6e, - 0x0c7c, 0x0c87, 0x0c9d, 0x0ca8, 0x0cae, 0x0cbc, 0x0cc8, 0x0cce, - 0x0cdb, 0x0ce8, 0x0cf4, 0x0d02, -} // Size: 608 bytes - -const mkRegionStr string = "" + // Size: 6026 bytes - "Остров АсенсионАндораОбединети Арапски ЕмиратиАвганистанАнтигва и Барбуд" + - "аАнгвилаАлбанијаЕрменијаАнголаАнтарктикАргентинаАмериканска СамоаАвстри" + - "јаАвстралијаАрубаОландски ОстровиАзербејџанБосна и ХерцеговинаБарбадосБ" + - "англадешБелгијаБуркина ФасоБугаријаБахреинБурундиБенинСвети ВартоломејБ" + - "ермудиБрунејБоливијаКарипска ХоландијаБразилБахамиБутанОстров БувеБоцва" + - "наБелорусијаБелизеКанадаКокосови (Килиншки) ОстровиКонго - КиншасаЦентр" + - "алноафриканска РепубликаКонго - БразавилШвајцаријаБрегот на Слоновата К" + - "оскаКукови ОстровиЧилеКамерунКинаКолумбијаОстров КлипертонКостарикаКуба" + - "Зелен ’РтКурасаоБожиќен ОстровКипарЧешкаГерманијаДиего ГарсијаЏибутиДан" + - "скаДоминикаДоминиканска РепубликаАлжирСеута и МелиљаЕквадорЕстонијаЕгип" + - "етЗападна СахараЕритрејаШпанијаЕтиопијаЕвропска унијаФинскаФиџиФолкланд" + - "ски ОстровиМикронезијаФарски ОстровиФранцијаГабонОбединето КралствоГрен" + - "адаГрузијаФранцуска ГвајанаГернзиГанаГибралтарГренландГамбијаГвинејаГва" + - "далупеЕкваторска ГвинејаГрцијаЈужна Џорџија и Јужни Сендвички ОстровиГв" + - "атемалаГуамГвинеја-БисауГвајанаХонг Конг С.А.Р КинаОстров Херд и Остров" + - "и МекдоналдХондурасХрватскаХаитиУнгаријаКанарски ОстровиИндонезијаИрска" + - "ИзраелОстров МанИндијаБританска Индоокеанска ТериторијаИракИранИсландИт" + - "алијаЏерсиЈамајкаЈорданЈапонијаКенијаКиргистанКамбоџаКирибатиКоморски О" + - "стровиСвети Кристофер и НевисСеверна КорејаЈужна КорејаКувајтКајмански " + - "ОстровиКазахстанЛаосЛибанСвета ЛуцијаЛихтенштајнШри ЛанкаЛиберијаЛесото" + - "ЛитванијаЛуксембургЛатвијаЛибијаМарокоМонакоМолдавијаЦрна ГораСент Март" + - "инМадагаскарМаршалски ОстровиМакедонијаМалиМјанмар (Бурма)МонголијаМака" + - "о САРСеверни Маријански ОстровиМартиникМавританијаМонсератМалтаМаврициу" + - "сМалдивиМалавиМексикоМалезијаМозамбикНамибијаНова КаледонијаНигерНорфол" + - "шки ОстровНигеријаНикарагваХоландијаНорвешкаНепалНауруНиујеНов ЗеландОм" + - "анПанамаПеруФранцуска ПолинезијаПапуа Нова ГвинејаФилипиниПакистанПолск" + - "аСент Пјер и МикеланПиткернски ОстровиПорторикоПалестински територииПор" + - "тугалијаПалауПарагвајКатарЗависни земји во ОкеанијаРеунионРоманијаСрбиј" + - "аРусијаРуандаСаудиска АрабијаСоломонски ОстровиСејшелиСуданШведскаСинга" + - "пурСвета ЕленаСловенијаСвалбард и Жан МејенСловачкаСиера ЛеонеСан Марин" + - "оСенегалСомалијаСуринамЈужен СуданСао Томе и ПринсипеЕл СалвадорСвети М" + - "артинСиријаСвазилендТристан да КуњаОстрови Туркс и КаикосЧадФранцуски Ј" + - "ужни ТериторииТогоТајландТаџикистанТокелауИсточен Тимор (Тимор Лесте)Ту" + - "ркменистанТунисТонгаТурцијаТринидад и ТобагоТувалуТајванТанзанијаУкраин" + - "аУгандаАмерикански територии во Пацификотобединети нацииСоединети Амери" + - "кански ДржавиУругвајУзбекистанВатиканСвети Винсент и ГренадинитеВенецуе" + - "лаБритански Девствени ОстровиАмерикански Девствени ОстровиВиетнамВануат" + - "уВалис и ФутунаСамоаКосовоЈеменМајотЈужноафриканска РепубликаЗамбијаЗим" + - "бабвеНепознат регионСветАфрикаСеверна АмерикаЈужна АмерикаОкеанијаЗапад" + - "на АфрикаЦентрална АмерикаИсточна АфрикаСеверна АфрикаСредна АфрикаЈужн" + - "а АфрикаАмерикиСеверна континентална АмерикаКарибиИсточна АзијаЈужна Аз" + - "ијаЈугоисточна АзијаЈужна ЕвропаАвстралазијаМеланезијаМикронезиски реги" + - "онПолинезијаАзијаЦентрална АзијаЗападна АзијаЕвропаИсточна ЕвропаСеверн" + - "а ЕвропаЗападна ЕвропаЛатинска Америка" - -var mkRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001d, 0x0029, 0x0059, 0x006d, 0x008d, 0x009b, 0x00ab, - 0x00bb, 0x00c7, 0x00d9, 0x00eb, 0x010c, 0x011c, 0x0130, 0x013a, - 0x0159, 0x016d, 0x0191, 0x01a1, 0x01b3, 0x01c1, 0x01d8, 0x01e8, - 0x01f6, 0x0204, 0x020e, 0x022d, 0x023b, 0x0247, 0x0257, 0x027a, - 0x0286, 0x0292, 0x029c, 0x02b1, 0x02bf, 0x02d3, 0x02df, 0x02eb, - 0x031d, 0x0338, 0x0371, 0x038e, 0x03a2, 0x03d1, 0x03ec, 0x03f4, - 0x0402, 0x040a, 0x041c, 0x043b, 0x044d, 0x0455, 0x0467, 0x0475, - 0x0490, 0x049a, 0x04a4, 0x04b6, 0x04cf, 0x04db, 0x04e7, 0x04f7, - // Entry 40 - 7F - 0x0522, 0x052c, 0x0546, 0x0554, 0x0564, 0x0570, 0x058b, 0x059b, - 0x05a9, 0x05b9, 0x05d4, 0x05d4, 0x05e0, 0x05e8, 0x060d, 0x0623, - 0x063e, 0x064e, 0x0658, 0x067b, 0x0689, 0x0697, 0x06b8, 0x06c4, - 0x06cc, 0x06de, 0x06ee, 0x06fc, 0x070a, 0x071c, 0x073f, 0x074b, - 0x0794, 0x07a6, 0x07ae, 0x07c7, 0x07d5, 0x07f8, 0x0832, 0x0842, - 0x0852, 0x085c, 0x086c, 0x088b, 0x089f, 0x08a9, 0x08b5, 0x08c8, - 0x08d4, 0x0914, 0x091c, 0x0924, 0x0930, 0x093e, 0x0948, 0x0956, - 0x0962, 0x0972, 0x097e, 0x0990, 0x099e, 0x09ae, 0x09cd, 0x09f8, - // Entry 80 - BF - 0x0a13, 0x0a2a, 0x0a36, 0x0a57, 0x0a69, 0x0a71, 0x0a7b, 0x0a92, - 0x0aa8, 0x0ab9, 0x0ac9, 0x0ad5, 0x0ae7, 0x0afb, 0x0b09, 0x0b15, - 0x0b21, 0x0b2d, 0x0b3f, 0x0b50, 0x0b65, 0x0b79, 0x0b9a, 0x0bae, - 0x0bb6, 0x0bd1, 0x0be3, 0x0bf4, 0x0c26, 0x0c36, 0x0c4c, 0x0c5c, - 0x0c66, 0x0c78, 0x0c86, 0x0c92, 0x0ca0, 0x0cb0, 0x0cc0, 0x0cd0, - 0x0ced, 0x0cf7, 0x0d16, 0x0d26, 0x0d38, 0x0d4a, 0x0d5a, 0x0d64, - 0x0d6e, 0x0d78, 0x0d8b, 0x0d93, 0x0d9f, 0x0da7, 0x0dce, 0x0df0, - 0x0e00, 0x0e10, 0x0e1c, 0x0e3f, 0x0e62, 0x0e74, 0x0e9d, 0x0eb3, - // Entry C0 - FF - 0x0ebd, 0x0ecd, 0x0ed7, 0x0f06, 0x0f14, 0x0f24, 0x0f30, 0x0f3c, - 0x0f48, 0x0f67, 0x0f8a, 0x0f98, 0x0fa2, 0x0fb0, 0x0fc0, 0x0fd5, - 0x0fe7, 0x100c, 0x101c, 0x1031, 0x1044, 0x1052, 0x1062, 0x1070, - 0x1085, 0x10a8, 0x10bd, 0x10d4, 0x10e0, 0x10f2, 0x110e, 0x1137, - 0x113d, 0x116d, 0x1175, 0x1183, 0x1197, 0x11a5, 0x11d6, 0x11ee, - 0x11f8, 0x1202, 0x1210, 0x1230, 0x123c, 0x1248, 0x125a, 0x1268, - 0x1274, 0x12b5, 0x12d2, 0x1308, 0x1316, 0x132a, 0x1338, 0x136b, - 0x137d, 0x13b1, 0x13e9, 0x13f7, 0x1405, 0x141f, 0x1429, 0x1435, - // Entry 100 - 13F - 0x143f, 0x1449, 0x147a, 0x1488, 0x1498, 0x14b5, 0x14bd, 0x14c9, - 0x14e6, 0x14ff, 0x150f, 0x152a, 0x154b, 0x1566, 0x1581, 0x159a, - 0x15b1, 0x15bf, 0x15f7, 0x1603, 0x161c, 0x1631, 0x1652, 0x1669, - 0x1681, 0x1695, 0x16ba, 0x16ce, 0x16d8, 0x16f5, 0x170e, 0x171a, - 0x1735, 0x1750, 0x176b, 0x178a, -} // Size: 608 bytes - -const mlRegionStr string = "" + // Size: 9151 bytes - "അസൻഷൻ ദ്വീപ്അന്റോറയുണൈറ്റഡ് അറബ് എമിറൈറ്റ്\u200cസ്അഫ്\u200cഗാനിസ്ഥാൻആൻറി" + - "ഗ്വയും ബർബുഡയുംആൻഗ്വില്ലഅൽബേനിയഅർമേനിയഅംഗോളഅൻറാർട്ടിക്കഅർജൻറീനഅമേരിക്ക" + - "ൻ സമോവഓസ്ട്രിയഓസ്\u200cട്രേലിയഅറൂബഅലൻഡ് ദ്വീപുകൾഅസർബൈജാൻബോസ്നിയയും ഹെർ" + - "സഗോവിനയുംബാർബഡോസ്ബംഗ്ലാദേശ്ബെൽജിയംബുർക്കിനാ ഫാസോബൾഗേറിയബഹ്റിൻബറുണ്ടിബെ" + - "നിൻസെന്റ് ബാർത്തലമിബർമുഡബ്രൂണൈബൊളീവിയകരീബിയൻ നെതർലാൻഡ്സ്ബ്രസീൽബഹാമാസ്ഭ" + - "ൂട്ടാൻബൗവെട്ട് ദ്വീപ്ബോട്സ്വാനബെലറൂസ്ബെലീസ്കാനഡകോക്കസ് (കീലിംഗ്) ദ്വീപ" + - "ുകൾകോംഗോ - കിൻഷാസസെൻട്രൽ ആഫ്രിക്കൻ റിപ്പബ്ലിക്കോംഗോ - ബ്രാസവില്ലിസ്വിറ" + - "്റ്സർലാൻഡ്കോട്ട് ഡി വാർകുക്ക് ദ്വീപുകൾചിലികാമറൂൺചൈനകൊളംബിയക്ലിപ്പെർട്ട" + - "ൻ ദ്വീപ്കോസ്റ്ററിക്കക്യൂബകേപ്പ് വെർദെകുറാകാവോക്രിസ്മസ് ദ്വീപ്സൈപ്രസ്ചെ" + - "ക്കിയജർമനിഡീഗോ ഗ്രാഷ്യദിജിബൗട്ടിഡെൻമാർക്ക്ഡൊമിനിക്കഡൊമിനിക്കൻ റിപ്പബ്ല" + - "ിക്അൾജീരിയസെയൂത്ത ആൻഡ് മെലിയഇക്വഡോർഎസ്റ്റോണിയ\u200dഈജിപ്ത്പശ്ചിമ സഹാറഎ" + - "റിത്രിയസ്\u200cപെയിൻഎത്യോപ്യയൂറോപ്യൻ യൂണിയൻഫിൻലാൻഡ്ഫിജിഫാക്ക്\u200cലാന" + - "്റ് ദ്വീപുകൾമൈക്രോനേഷ്യഫറോ ദ്വീപുകൾഫ്രാൻസ്ഗാബൺയുണൈറ്റഡ് കിംഗ്ഡംഗ്രനേഡജ" + - "ോർജ്ജിയഫ്രഞ്ച് ഗയാനഗേൺസിഘാനജിബ്രാൾട്ടർഗ്രീൻലാൻറ്ഗാംബിയഗിനിയഗ്വാഡലൂപ്പ്" + - "ഇക്വറ്റോറിയൽ ഗിനിയഗ്രീസ്ദക്ഷിണ ജോർജ്ജിയയും ദക്ഷിണ സാൻഡ്\u200cവിച്ച് ദ്" + - "വീപുകളുംഗ്വാട്ടിമാലഗ്വാംഗിനിയ-ബിസൗഗയാനഹോങ്കോങ്ങ് (SAR) ചൈനഹിയേർഡും മക്" + - "\u200cഡൊണാൾഡ് ദ്വീപുകളുംഹോണ്ടുറാസ്ക്രൊയേഷ്യഹെയ്തിഹംഗറികാനറി ദ്വീപുകൾഇന്ത" + - "ോനേഷ്യഅയർലൻഡ്ഇസ്രായേൽഐൽ ഓഫ് മാൻഇന്ത്യബ്രിട്ടീഷ് ഇന്ത്യൻ മഹാസമുദ്ര പ്രദ" + - "േശംഇറാഖ്ഇറാൻഐസ്\u200cലാന്റ്ഇറ്റലിജേഴ്സിജമൈക്കജോർദ്ദാൻജപ്പാൻകെനിയകിർഗിസ" + - "്ഥാൻകംബോഡിയകിരിബാട്ടികോമൊറോസ്സെന്റ് കിറ്റ്\u200cസും നെവിസുംഉത്തരകൊറിയദ" + - "ക്ഷിണകൊറിയകുവൈറ്റ്കേമാൻ ദ്വീപുകൾകസാഖിസ്ഥാൻലാവോസ്ലെബനൻസെൻറ് ലൂസിയലിച്ചൺ" + - "സ്റ്റൈൻശ്രീലങ്കലൈബീരിയലെസോതോലിത്വാനിയലക്സംബർഗ്ലാറ്റ്വിയലിബിയമൊറോക്കൊമൊ" + - "ണാക്കോമൾഡോവമോണ്ടെനെഗ്രോസെൻറ് മാർട്ടിൻമഡഗാസ്കർമാർഷൽ\u200d\u200d ദ്വീപുക" + - "ൾമാസിഡോണിയമാലിമ്യാൻമാർ (ബർമ്മ)മംഗോളിയമക്കാവു (SAR) ചൈനഉത്തര മറിയാനാ ദ്" + - "വീപുകൾമാർട്ടിനിക്ക്മൗറിറ്റാനിയമൊണ്ടെസരത്ത്മാൾട്ടമൗറീഷ്യസ്മാലിദ്വീപ്മലാ" + - "വിമെക്സിക്കോമലേഷ്യമൊസാംബിക്ക്നമീബിയന്യൂ കാലിഡോണിയനൈജർനോർഫോക് ദ്വീപ്നൈജ" + - "ീരിയനിക്കരാഗ്വനെതർലാൻഡ്\u200cസ്നോർവെനേപ്പാൾനൗറുന്യൂയിന്യൂസിലാൻറ്ഒമാൻപന" + - "ാമപെറുഫ്രഞ്ച് പോളിനേഷ്യപാപ്പുവ ന്യൂ ഗിനിയഫിലിപ്പീൻസ്പാക്കിസ്ഥാൻപോളണ്ട്" + - "സെന്റ് പിയറിയും മിക്കലണുംപിറ്റ്\u200cകെയ്\u200cൻ ദ്വീപുകൾപ്യൂർട്ടോ റിക" + - "്കോപാലസ്\u200cതീൻ പ്രദേശങ്ങൾപോർച്ചുഗൽപലാവുപരാഗ്വേഖത്തർദ്വീപസമൂഹംറീയൂണി" + - "യൻറൊമാനിയസെർബിയറഷ്യറുവാണ്ടസൗദി അറേബ്യസോളമൻ\u200d ദ്വീപുകൾസീഷെൽസ്സുഡാൻസ" + - "്വീഡൻസിംഗപ്പുർസെൻറ് ഹെലീനസ്ലോവേനിയസ്വാൽബാഡും ജാൻ മായേനുംസ്ലോവാക്യസിയെറ" + - " ലിയോൺസാൻ മറിനോസെനഗൽസോമാലിയസുരിനാംദക്ഷിണ സുഡാൻസാവോ ടോമും പ്രിൻസിപെയുംഎൽ " + - "സാൽവദോർസിന്റ് മാർട്ടെൻസിറിയസ്വാസിലാൻറ്ട്രസ്റ്റൻ ഡ കൂനടർക്ക്\u200cസും ക" + - "െയ്\u200cക്കോ ദ്വീപുകളുംഛാഡ്ഫ്രഞ്ച് ദക്ഷിണ ഭൂപ്രദേശംടോഗോതായ്\u200cലാൻഡ" + - "്താജിക്കിസ്ഥാൻടോക്കെലൂതിമോർ-ലെസ്റ്റെതുർക്ക്മെനിസ്ഥാൻടുണീഷ്യടോംഗതുർക്കി" + - "ട്രിനിഡാഡും ടുബാഗോയുംടുവാലുതായ്\u200cവാൻടാൻസാനിയഉക്രെയ്\u200cൻഉഗാണ്ടയു" + - ".എസ്. ദ്വീപസമൂഹങ്ങൾഐക്യരാഷ്ട്രസഭഅമേരിക്കൻ ഐക്യനാടുകൾഉറുഗ്വേഉസ്\u200cബെക്" + - "കിസ്ഥാൻവത്തിക്കാൻസെന്റ് വിൻസെന്റും ഗ്രനെഡൈൻസുംവെനിസ്വേലബ്രിട്ടീഷ് വെർജ" + - "ിൻ ദ്വീപുകൾയു.എസ്. വെർജിൻ ദ്വീപുകൾവിയറ്റ്നാംവന്വാതുവാലിസ് ആന്റ് ഫ്യൂച്" + - "യുനസമോവകൊസോവൊയെമൻമയോട്ടിദക്ഷിണാഫ്രിക്കസാംബിയസിംബാബ്\u200cവേഅജ്ഞാത പ്രദ" + - "േശംലോകംആഫ്രിക്കവടക്കേ അമേരിക്കതെക്കേ അമേരിക്കഓഷ്യാനിയപശ്ചിമ ആഫ്രിക്കമദ" + - "്ധ്യഅമേരിക്കകിഴക്കൻ ആഫ്രിക്കഉത്തരാഫ്രിക്കമദ്ധ്യആഫ്രിക്കതെക്കേ ആഫ്രിക്ക" + - "അമേരിക്കകൾവടക്കൻ അമേരിക്കകരീബിയൻകിഴക്കൻ ഏഷ്യതെക്കേ ഏഷ്യതെക്ക്-കിഴക്കൻ " + - "ഏഷ്യതെക്കേ യൂറോപ്പ്ഓസ്\u200cട്രേലിയയും ന്യൂസിലാൻഡുംമെലനേഷ്യമൈക്രോനേഷ്യ" + - "ൻ പ്രദേശംപോളിനേഷ്യഏഷ്യമദ്ധ്യേഷ്യപശ്ചിമേഷ്യയൂറോപ്പ്കിഴക്കൻ യൂറോപ്പ്വടക്" + - "കേ യൂറോപ്പ്പശ്ചിമ യൂറോപ്പ്ലാറ്റിനമേരിക്ക" - -var mlRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0022, 0x0034, 0x0081, 0x00a8, 0x00df, 0x00fa, 0x010f, - 0x0124, 0x0133, 0x0157, 0x016c, 0x0194, 0x01ac, 0x01cd, 0x01d9, - 0x0201, 0x0219, 0x025c, 0x0274, 0x0292, 0x02a7, 0x02cf, 0x02e4, - 0x02f6, 0x030b, 0x031a, 0x0348, 0x0357, 0x0369, 0x037e, 0x03b5, - 0x03c7, 0x03dc, 0x03f1, 0x041c, 0x0437, 0x044c, 0x045e, 0x046a, - 0x04b0, 0x04d4, 0x0527, 0x055a, 0x0587, 0x05aa, 0x05d5, 0x05e1, - 0x05f3, 0x05fc, 0x0611, 0x064b, 0x066f, 0x067e, 0x06a0, 0x06b8, - 0x06e6, 0x06fb, 0x0710, 0x071f, 0x0741, 0x075f, 0x077d, 0x0798, - // Entry 40 - 7F - 0x07d8, 0x07ed, 0x081f, 0x0834, 0x0855, 0x086a, 0x0889, 0x08a1, - 0x08b9, 0x08d1, 0x08fc, 0x08fc, 0x0914, 0x0920, 0x0960, 0x0981, - 0x09a3, 0x09b8, 0x09c4, 0x09f5, 0x0a07, 0x0a1f, 0x0a41, 0x0a50, - 0x0a59, 0x0a7a, 0x0a98, 0x0aaa, 0x0ab9, 0x0ada, 0x0b0e, 0x0b20, - 0x0bab, 0x0bcc, 0x0bdb, 0x0bf7, 0x0c03, 0x0c31, 0x0c8a, 0x0ca8, - 0x0cc3, 0x0cd5, 0x0ce4, 0x0d0c, 0x0d2a, 0x0d3f, 0x0d57, 0x0d71, - 0x0d83, 0x0de9, 0x0df8, 0x0e04, 0x0e22, 0x0e34, 0x0e46, 0x0e58, - 0x0e70, 0x0e82, 0x0e91, 0x0eaf, 0x0ec4, 0x0ee2, 0x0efa, 0x0f41, - // Entry 80 - BF - 0x0f5f, 0x0f80, 0x0f98, 0x0fc0, 0x0fde, 0x0ff0, 0x0fff, 0x101e, - 0x1045, 0x105d, 0x1072, 0x1084, 0x109f, 0x10ba, 0x10d5, 0x10e4, - 0x10fc, 0x1114, 0x1123, 0x1147, 0x116f, 0x1187, 0x11b5, 0x11d0, - 0x11dc, 0x1206, 0x121b, 0x1240, 0x127e, 0x12a5, 0x12c6, 0x12ea, - 0x12fc, 0x1317, 0x1335, 0x1344, 0x1362, 0x1374, 0x1395, 0x13a7, - 0x13cf, 0x13db, 0x1403, 0x1418, 0x1436, 0x145a, 0x1469, 0x147e, - 0x148a, 0x149c, 0x14bd, 0x14c9, 0x14d5, 0x14e1, 0x1512, 0x1544, - 0x1565, 0x1586, 0x159b, 0x15e2, 0x1622, 0x1650, 0x168a, 0x16a5, - // Entry C0 - FF - 0x16b4, 0x16c9, 0x16d8, 0x16f6, 0x170e, 0x1723, 0x1735, 0x1741, - 0x1756, 0x1775, 0x17a0, 0x17b5, 0x17c4, 0x17d6, 0x17f1, 0x1810, - 0x182b, 0x1869, 0x1884, 0x18a3, 0x18bc, 0x18cb, 0x18e0, 0x18f5, - 0x1917, 0x1958, 0x1974, 0x199f, 0x19ae, 0x19cf, 0x19f8, 0x1a51, - 0x1a5d, 0x1aa1, 0x1aad, 0x1acb, 0x1af2, 0x1b0a, 0x1b32, 0x1b62, - 0x1b77, 0x1b83, 0x1b98, 0x1bd5, 0x1be7, 0x1bff, 0x1c17, 0x1c32, - 0x1c44, 0x1c7d, 0x1ca4, 0x1cde, 0x1cf3, 0x1d20, 0x1d3e, 0x1d91, - 0x1dac, 0x1df6, 0x1e33, 0x1e51, 0x1e66, 0x1ea4, 0x1eb0, 0x1ec2, - // Entry 100 - 13F - 0x1ece, 0x1ee3, 0x1f0d, 0x1f1f, 0x1f3d, 0x1f65, 0x1f71, 0x1f89, - 0x1fb4, 0x1fdf, 0x1ff7, 0x2022, 0x204c, 0x207a, 0x20a1, 0x20cb, - 0x20f6, 0x2114, 0x213f, 0x2154, 0x2176, 0x2195, 0x21ca, 0x21f5, - 0x2244, 0x225c, 0x2296, 0x22b1, 0x22bd, 0x22db, 0x22f9, 0x2311, - 0x233f, 0x236a, 0x2395, 0x23bf, -} // Size: 608 bytes - -const mnRegionStr string = "" + // Size: 5529 bytes - "Аскенсион аралАндорраАрабын Нэгдсэн ЭмиратАфганистанАнтигуа ба БарбудаАн" + - "гилаАлбаниАрмениАнголАнтарктикАргентинАмерикийн СамоаАвстриАвстралиАруб" + - "аАландын АрлуудАзербайжанБосни ГерцеговинБарбадосБангладешБелгиБуркина " + - "фасоБолгарБахрейнБурундиБенинСент БартельмиБермудБрунейБоливиКарибын Ни" + - "дерландБразилБагамБутанБуветын арлуудБотсванаБеларусьБелизКанадКокос (К" + - "ийлинг) арлуудКонго-КиншасаТөв Африкийн Бүгд Найрамдах УлсКонго Браззав" + - "ильШвейцариКот д’ИвуарКүүкийн арлуудЧилиКамерунХятадКолумбКлиппертон ар" + - "алКоста РикаКубаКапе ВердеКуракаоЗул сарын аралКипрЧехГерманДиего Гарси" + - "аДжибутиДаниДоминикБүгд Найрамдах Доминикан УлсАлжирСеута ба МелильяЭкв" + - "адорЭстониЕгипетБаруун СахарЭритриИспаниЭтиопЕвропын ХолбооФинландФижиФ" + - "олькландын АрлуудМикронезиФароэ АрлуудФранцГабонИх БританиГренадаГүржФр" + - "анцын ГайанаГернсиГанаГибралтарГренландГамбиГвинейГваделупЭкваторын Гви" + - "нейГрекӨмнөд Жоржиа ба Өмнөд Сэндвичийн АрлуудГватемалГуамГвиней-БисауГ" + - "айанаБНХАУ-ын Тусгай захиргааны бүс Хонг КонгХэрд болон Макдоналд арлуу" + - "дГондурасХорватГаитиУнгарКанарын арлуудИндонезиИрландИзраильМэн АралЭнэ" + - "тхэгБританийн харьяа Энэтхэгийн далай дахь нутаг дэвсгэрүүдИракИранИсла" + - "ндИталиЖерсиЯмайкЙорданЯпонКениКыргызстанКамбожКирибатиКоморосСент-Китт" + - "с ба НевисХойд СолонгосӨмнөд СолонгосКувейтКайманы АрлуудКазахстанЛаосЛ" + - "иванСент ЛюсиаЛихтенштейнШри ЛанкаЛибериЛесотоЛитваЛюксембургЛатвиЛивиМ" + - "ароккоМонакоМолдавМонтенегроСент-МартинМадагаскарМаршаллын арлуудМакедо" + - "нМалиМьянмар (Бурма)МонголБНХАУ-ын Тусгай захиргааны бүс МакаоХойд Мари" + - "аны арлуудМартиникМавританиМонтсерратМальтаМавритусМальдивМалавиМексикМ" + - "алайзМозамбикНамибиШинэ КаледониНигерНорфолк арлуудНигериНикарагуаНидер" + - "ландНорвегиБалбаНауруНиуэШинэ ЗеландОманПанамПеруФранцын ПолинезПапуа Ш" + - "инэ ГвинейФилиппинПакистанПольшСэнт Пьер ба МикелонПиткэрн арлуудПуэрто" + - " РикоПалестины нутаг дэвсгэрүүдПортугальПалауПарагвайКатарНомхон далайг " + - "тойрсон улс орнуудРеюньонРумынСербиОросРуандаСаудын АрабСоломоны Арлууд" + - "СейшелСуданШведСингапурСент ХеленаСловениСвалбард ба Ян МайенСловакСьер" + - "ра-ЛеонеСан-МариноСенегалСомалиСуринамӨмнөд СуданСан-Томе ба ПринсипиЭл" + - "ь СальвадорСинт МартенСириСвазиландТристан да КуньяТурк ба Кайкосын Арл" + - "уудЧадФранцын өмнөд газар нутагТогоТайландТажикистанТокелауТимор-ЛестеТ" + - "уркменистанТунисТонгаТуркТринидад ТобагоТувалуТайваньТанзаниУкраинУганд" + - "аАНУ-ын тойрсон арлуудНэгдсэн Үндэстний БайгууллагаАмерикийн Нэгдсэн Ул" + - "сУругвайУзбекистанВатикан хот улсСэнт Винсэнт ба ГренадинВенесуэлБритан" + - "ийн Виржиний АрлуудАНУ-ын Виржиний АрлуудВьетнамВануатуУоллис ба Футуна" + - "СамоаКосовоЙеменМайоттеӨмнөд Африк тивЗамбиЗимбабвеТодорхойгүй бүсДэлхи" + - "йАфрикХойд АмерикӨмнөд АмерикНомхон далайн орнуудБаруун АфрикТөв Америк" + - "Зүүн АфрикХойд АфрикТөв АфрикӨмнөд АфрикАмерикХойд Америк тивКарибынЗүү" + - "н АзиӨмнөд АзиЗүүн өмнөд АзиӨмнөд ЕвропАвстралиазиМеланезиМикронезийн б" + - "үсПолинезиАзиТөв АзиБаруун АзиЕвропЗүүн ЕвропХойд ЕвропБаруун ЕвропЛати" + - "н Америк" - -var mnRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001b, 0x0029, 0x0051, 0x0065, 0x0087, 0x0093, 0x009f, - 0x00ab, 0x00b5, 0x00c7, 0x00d7, 0x00f4, 0x0100, 0x0110, 0x011a, - 0x0135, 0x0149, 0x0168, 0x0178, 0x018a, 0x0194, 0x01ab, 0x01b7, - 0x01c5, 0x01d3, 0x01dd, 0x01f8, 0x0204, 0x0210, 0x021c, 0x023d, - 0x0249, 0x0253, 0x025d, 0x0278, 0x0288, 0x0298, 0x02a2, 0x02ac, - 0x02d4, 0x02ed, 0x0327, 0x0346, 0x0356, 0x036c, 0x0387, 0x038f, - 0x039d, 0x03a7, 0x03b3, 0x03d0, 0x03e3, 0x03eb, 0x03fe, 0x040c, - 0x0426, 0x042e, 0x0434, 0x0440, 0x0457, 0x0465, 0x046d, 0x047b, - // Entry 40 - 7F - 0x04b0, 0x04ba, 0x04d8, 0x04e6, 0x04f2, 0x04fe, 0x0515, 0x0521, - 0x052d, 0x0537, 0x0552, 0x0552, 0x0560, 0x0568, 0x058b, 0x059d, - 0x05b4, 0x05be, 0x05c8, 0x05db, 0x05e9, 0x05f1, 0x060c, 0x0618, - 0x0620, 0x0632, 0x0642, 0x064c, 0x0658, 0x0668, 0x0687, 0x068f, - 0x06d8, 0x06e8, 0x06f0, 0x0707, 0x0713, 0x075d, 0x0790, 0x07a0, - 0x07ac, 0x07b6, 0x07c0, 0x07db, 0x07eb, 0x07f7, 0x0805, 0x0814, - 0x0822, 0x088a, 0x0892, 0x089a, 0x08a6, 0x08b0, 0x08ba, 0x08c4, - 0x08d0, 0x08d8, 0x08e0, 0x08f4, 0x0900, 0x0910, 0x091e, 0x0941, - // Entry 80 - BF - 0x095a, 0x0975, 0x0981, 0x099c, 0x09ae, 0x09b6, 0x09c0, 0x09d3, - 0x09e9, 0x09fa, 0x0a06, 0x0a12, 0x0a1c, 0x0a30, 0x0a3a, 0x0a42, - 0x0a50, 0x0a5c, 0x0a68, 0x0a7c, 0x0a91, 0x0aa5, 0x0ac4, 0x0ad2, - 0x0ada, 0x0af5, 0x0b01, 0x0b44, 0x0b68, 0x0b78, 0x0b8a, 0x0b9e, - 0x0baa, 0x0bba, 0x0bc8, 0x0bd4, 0x0be0, 0x0bec, 0x0bfc, 0x0c08, - 0x0c21, 0x0c2b, 0x0c46, 0x0c52, 0x0c64, 0x0c76, 0x0c84, 0x0c8e, - 0x0c98, 0x0ca0, 0x0cb5, 0x0cbd, 0x0cc7, 0x0ccf, 0x0cec, 0x0d0c, - 0x0d1c, 0x0d2c, 0x0d36, 0x0d5b, 0x0d76, 0x0d8b, 0x0dbd, 0x0dcf, - // Entry C0 - FF - 0x0dd9, 0x0de9, 0x0df3, 0x0e2f, 0x0e3d, 0x0e47, 0x0e51, 0x0e59, - 0x0e65, 0x0e7a, 0x0e97, 0x0ea3, 0x0ead, 0x0eb5, 0x0ec5, 0x0eda, - 0x0ee8, 0x0f0d, 0x0f19, 0x0f30, 0x0f43, 0x0f51, 0x0f5d, 0x0f6b, - 0x0f80, 0x0fa5, 0x0fbe, 0x0fd3, 0x0fdb, 0x0fed, 0x100b, 0x1036, - 0x103c, 0x106b, 0x1073, 0x1081, 0x1095, 0x10a3, 0x10b8, 0x10d0, - 0x10da, 0x10e4, 0x10ec, 0x1109, 0x1115, 0x1123, 0x1131, 0x113d, - 0x1149, 0x1170, 0x11a8, 0x11d0, 0x11de, 0x11f2, 0x120e, 0x123b, - 0x124b, 0x127b, 0x12a4, 0x12b2, 0x12c0, 0x12de, 0x12e8, 0x12f4, - // Entry 100 - 13F - 0x12fe, 0x130c, 0x1328, 0x1332, 0x1342, 0x135f, 0x136b, 0x1375, - 0x138a, 0x13a1, 0x13c7, 0x13de, 0x13f1, 0x1404, 0x1417, 0x1428, - 0x143d, 0x1449, 0x1465, 0x1473, 0x1482, 0x1493, 0x14ad, 0x14c2, - 0x14d8, 0x14e8, 0x1505, 0x1515, 0x151b, 0x1528, 0x153b, 0x1545, - 0x1558, 0x156b, 0x1582, 0x1599, -} // Size: 608 bytes - -const mrRegionStr string = "" + // Size: 8450 bytes - "अ\u200dॅसेन्शियन बेटअँडोरासंयुक्त अरब अमीरातअफगाणिस्तानअँटिग्वा आणि बर्ब" + - "ुडाअँग्विलाअल्बानियाअर्मेनियाअंगोलाअंटार्क्टिकाअर्जेंटिनाअमेरिकन सामोआ" + - "ऑस्ट्रियाऑस्ट्रेलियाअरुबाअ\u200dॅलँड बेटेअझरबैजानबोस्निया अणि हर्जेगोव" + - "िनाबार्बाडोसबांगलादेशबेल्जियमबुर्किना फासोबल्गेरियाबहारीनबुरुंडीबेनिनस" + - "ेंट बार्थेलेमीबर्मुडाब्रुनेईबोलिव्हियाकॅरिबियन नेदरलँड्सब्राझिलबहामाजभ" + - "ूतानबोउवेट बेटबोट्सवानाबेलारूसबलिझकॅनडाकोकोस (कीलिंग) बेटेकाँगो - किंश" + - "ासाकेंद्रीय अफ्रिकी प्रजासत्ताककाँगो - ब्राझाविलेस्वित्झर्लंडआयव्हरी क" + - "ोस्टकुक बेटेचिलीकॅमेरूनचीनकोलम्बियाक्लिपरटोन बेटकोस्टा रिकाक्यूबाकेप व" + - "्हर्डेक्युरासाओख्रिसमस बेटसायप्रसझेकियाजर्मनीदिएगो गार्सियाजिबौटीडेन्म" + - "ार्कडोमिनिकाडोमिनिकन प्रजासत्ताकअल्जीरियास्यूटा आणि मेलिलाइक्वाडोरएस्ट" + - "ोनियाइजिप्तपश्चिम सहाराएरिट्रियास्पेनइथिओपियायुरोपीय संघफिनलंडफिजीफॉकल" + - "ंड बेटेमायक्रोनेशियाफेरो बेटेफ्रान्सगॅबॉनयुनायटेड किंगडमग्रेनेडाजॉर्जि" + - "याफ्रेंच गयानाग्वेर्नसेघानाजिब्राल्टरग्रीनलंडगाम्बियागिनीग्वाडेलोउपेइक" + - "्वेटोरियल गिनीग्रीसदक्षिण जॉर्जिया आणि दक्षिण सँडविच बेटेग्वाटेमालागुआ" + - "मगिनी-बिसाउगयानाहाँगकाँग एसएआर चीनहर्ड आणि मॅक्डोनाल्ड बेटेहोंडुरासक्र" + - "ोएशियाहैतीहंगेरीकॅनरी बेटेइंडोनेशियाआयर्लंडइस्त्राइलआयल ऑफ मॅनभारतब्रि" + - "टिश हिंदी महासागर क्षेत्रइराकइराणआइसलँडइटलीजर्सीजमैकाजॉर्डनजपानकेनियाक" + - "िरगिझस्तानकंबोडियाकिरीबाटीकोमोरोजसेंट किट्स आणि नेव्हिसउत्तर कोरियादक्" + - "षिण कोरियाकुवेतकेमन बेटेकझाकस्तानलाओसलेबनॉनसेंट ल्यूसियालिक्टेनस्टाइनश" + - "्रीलंकालायबेरियालेसोथोलिथुआनियालक्झेंबर्गलात्वियालिबियामोरोक्कोमोनॅकोम" + - "ोल्डोव्हामोंटेनेग्रोसेंट मार्टिनमादागास्करमार्शल बेटेमॅसेडोनियामालीम्य" + - "ानमार (बर्मा)मंगोलियामकाओ एसएआर चीनउत्तरी मारियाना बेटेमार्टिनिकमॉरिटा" + - "नियामॉन्ट्सेराटमाल्टामॉरिशसमालदीवमलावीमेक्सिकोमलेशियामोझाम्बिकनामिबिया" + - "न्यू कॅलेडोनियानाइजरनॉरफॉक बेटनायजेरियानिकाराग्वानेदरलँडनॉर्वेनेपाळनाउ" + - "रूनीयून्यूझीलंडओमानपनामापेरूफ्रेंच पॉलिनेशियापापुआ न्यू गिनीफिलिपिन्सप" + - "ाकिस्तानपोलंडसेंट पियरे आणि मिक्वेलोनपिटकैर्न बेटेप्युएर्तो रिकोपॅलेस्" + - "टिनियन प्रदेशपोर्तुगालपलाऊपराग्वेकतारआउटलाईंग ओशनियारियुनियनरोमानियासर" + - "्बियारशियारवांडासौदी अरबसोलोमन बेटेसेशेल्ससुदानस्वीडनसिंगापूरसेंट हेले" + - "नास्लोव्हेनियास्वालबर्ड आणि जान मायेनस्लोव्हाकियासिएरा लिओनसॅन मरीनोसे" + - "नेगलसोमालियासुरिनामदक्षिण सुदानसाओ टोम आणि प्रिंसिपेअल साल्वाडोरसिंट म" + - "ार्टेनसीरियास्वाझिलँडट्रिस्टन दा कुन्हाटर्क्स आणि कैकोस बेटेचाडफ्रेंच " + - "दाक्षिणात्य प्रदेशटोगोथायलंडताजिकिस्तानतोकेलाउतिमोर-लेस्तेतुर्कमेनिस्त" + - "ानट्यूनिशियाटोंगातुर्कीत्रिनिदाद आणि टोबॅगोटुवालुतैवानटांझानियायुक्रेन" + - "युगांडायू.एस. आउटलाइंग बेटेसंयुक्त राष्ट्रयुनायटेड स्टेट्सउरुग्वेउझबेक" + - "िस्तानव्हॅटिकन सिटीसेंट व्हिन्सेंट आणि ग्रेनडाइन्सव्हेनेझुएलाब्रिटिश व" + - "्हर्जिन बेटेयू.एस. व्हर्जिन बेटेव्हिएतनामवानुआतुवालिस आणि फ्यूचूनासामो" + - "आकोसोव्होयेमेनमायोट्टेदक्षिण आफ्रिकाझाम्बियाझिम्बाब्वेअज्ञात प्रदेशविश" + - "्वआफ्रिकाउत्तर अमेरिकादक्षिण अमेरिकाओशनियापश्चिम आफ्रिकामध्य अमेरिकापू" + - "र्व आफ्रिकाउत्तर आफ्रिकामध्य आफ्रिकादक्षिणी आफ्रिकाअमेरिकाउत्तरी अमेरि" + - "काकॅरीबियनपूर्व आशियादक्षिण आशियादक्षिण पूर्व आशियादक्षिण युरोपऑस्" + - "\u200dट्रेलेशियामेलानेशियामायक्रोनेशियन प्रदेशपॉलिनेशियाअशियामध्य आशियाप" + - "श्चिम आशियायुरोपपूर्व युरोपउत्तर युरोपपश्चिम युरोपलॅटिन अमेरिका" - -var mrRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x002b, 0x003d, 0x006f, 0x0090, 0x00c8, 0x00e0, 0x00fb, - 0x0116, 0x0128, 0x014c, 0x016a, 0x018f, 0x01aa, 0x01cb, 0x01da, - 0x01f9, 0x0211, 0x0255, 0x0270, 0x028b, 0x02a3, 0x02c8, 0x02e3, - 0x02f5, 0x030a, 0x0319, 0x0344, 0x0359, 0x036e, 0x038c, 0x03c0, - 0x03d5, 0x03e7, 0x03f6, 0x0412, 0x042d, 0x0442, 0x044e, 0x045d, - 0x048e, 0x04b5, 0x0505, 0x0535, 0x0559, 0x057e, 0x0594, 0x05a0, - 0x05b5, 0x05be, 0x05d9, 0x05fe, 0x061d, 0x062f, 0x064e, 0x0669, - 0x0688, 0x069d, 0x06af, 0x06c1, 0x06e9, 0x06fb, 0x0716, 0x072e, - // Entry 40 - 7F - 0x0768, 0x0783, 0x07b2, 0x07ca, 0x07e5, 0x07f7, 0x0819, 0x0834, - 0x0843, 0x085b, 0x087a, 0x087a, 0x088c, 0x0898, 0x08b7, 0x08de, - 0x08f7, 0x090c, 0x091b, 0x0946, 0x095e, 0x0976, 0x0998, 0x09b3, - 0x09bf, 0x09dd, 0x09f5, 0x0a0d, 0x0a19, 0x0a3a, 0x0a68, 0x0a77, - 0x0adf, 0x0afd, 0x0b09, 0x0b25, 0x0b34, 0x0b66, 0x0bab, 0x0bc3, - 0x0bde, 0x0bea, 0x0bfc, 0x0c18, 0x0c36, 0x0c4b, 0x0c66, 0x0c80, - 0x0c8c, 0x0cdd, 0x0ce9, 0x0cf5, 0x0d07, 0x0d13, 0x0d22, 0x0d31, - 0x0d43, 0x0d4f, 0x0d61, 0x0d82, 0x0d9a, 0x0db2, 0x0dc7, 0x0e03, - // Entry 80 - BF - 0x0e25, 0x0e4a, 0x0e59, 0x0e72, 0x0e8d, 0x0e99, 0x0eab, 0x0ed0, - 0x0ef7, 0x0f0f, 0x0f2a, 0x0f3c, 0x0f57, 0x0f75, 0x0f8d, 0x0f9f, - 0x0fb7, 0x0fc9, 0x0fe7, 0x1008, 0x102a, 0x1048, 0x1067, 0x1085, - 0x1091, 0x10bb, 0x10d3, 0x10f9, 0x1131, 0x114c, 0x116a, 0x118b, - 0x119d, 0x11af, 0x11c1, 0x11d0, 0x11e8, 0x11fd, 0x1218, 0x1230, - 0x125b, 0x126a, 0x1286, 0x12a1, 0x12bf, 0x12d4, 0x12e6, 0x12f5, - 0x1304, 0x1310, 0x132b, 0x1337, 0x1346, 0x1352, 0x1383, 0x13ac, - 0x13c7, 0x13e2, 0x13f1, 0x1433, 0x1458, 0x1480, 0x14b7, 0x14d2, - // Entry C0 - FF - 0x14de, 0x14f3, 0x14ff, 0x152a, 0x1542, 0x155a, 0x156f, 0x157e, - 0x1590, 0x15a6, 0x15c5, 0x15da, 0x15e9, 0x15fb, 0x1613, 0x1632, - 0x1656, 0x1695, 0x16b9, 0x16d5, 0x16ee, 0x1700, 0x1718, 0x172d, - 0x174f, 0x1788, 0x17aa, 0x17cc, 0x17de, 0x17f9, 0x182b, 0x1864, - 0x186d, 0x18b4, 0x18c0, 0x18d2, 0x18f3, 0x1908, 0x192a, 0x1954, - 0x1972, 0x1981, 0x1993, 0x19cb, 0x19dd, 0x19ec, 0x1a07, 0x1a1c, - 0x1a31, 0x1a65, 0x1a90, 0x1abe, 0x1ad3, 0x1af4, 0x1b19, 0x1b70, - 0x1b91, 0x1bcc, 0x1c00, 0x1c1b, 0x1c30, 0x1c62, 0x1c71, 0x1c89, - // Entry 100 - 13F - 0x1c98, 0x1cb0, 0x1cd8, 0x1cf0, 0x1d0e, 0x1d33, 0x1d42, 0x1d57, - 0x1d7c, 0x1da4, 0x1db6, 0x1dde, 0x1e00, 0x1e25, 0x1e4a, 0x1e6c, - 0x1e97, 0x1eac, 0x1ed4, 0x1eec, 0x1f0b, 0x1f2d, 0x1f5f, 0x1f81, - 0x1fab, 0x1fc9, 0x2003, 0x2021, 0x2030, 0x204c, 0x206e, 0x207d, - 0x209c, 0x20bb, 0x20dd, 0x2102, -} // Size: 608 bytes - -const msRegionStr string = "" + // Size: 2960 bytes - "Pulau AscensionAndorraEmiriah Arab BersatuAfghanistanAntigua dan Barbuda" + - "AnguillaAlbaniaArmeniaAngolaAntartikaArgentinaSamoa AmerikaAustriaAustra" + - "liaArubaKepulauan AlandAzerbaijanBosnia dan HerzegovinaBarbadosBanglades" + - "hBelgiumBurkina FasoBulgariaBahrainBurundiBeninSaint BarthélemyBermudaBr" + - "uneiBoliviaBelanda CaribbeanBrazilBahamasBhutanPulau BouvetBotswanaBelar" + - "usBelizeKanadaKepulauan Cocos (Keeling)Congo - KinshasaRepublik Afrika T" + - "engahCongo - BrazzavilleSwitzerlandCote d’IvoireKepulauan CookChileCamer" + - "oonChinaColombiaPulau ClippertonCosta RicaCubaCape VerdeCuracaoPulau Kri" + - "smasCyprusCzechiaJermanDiego GarciaDjiboutiDenmarkDominicaRepublik Domin" + - "icaAlgeriaCeuta dan MelillaEcuadorEstoniaMesirSahara BaratEritreaSepanyo" + - "lEthiopiaKesatuan EropahFinlandFijiKepulauan FalklandMicronesiaKepulauan" + - " FaroePerancisGabonUnited KingdomGrenadaGeorgiaGuiana PerancisGuernseyGh" + - "anaGibraltarGreenlandGambiaGuineaGuadeloupeGuinea KhatulistiwaGreeceKepu" + - "lauan Georgia Selatan & Sandwich SelatanGuatemalaGuamGuinea BissauGuyana" + - "Hong Kong SAR ChinaKepulauan Heard & McDonaldHondurasCroatiaHaitiHungary" + - "Kepulauan CanaryIndonesiaIrelandIsraelIsle of ManIndiaWilayah Lautan Hin" + - "di BritishIraqIranIcelandItaliJerseyJamaicaJordanJepunKenyaKyrgyzstanKem" + - "bojaKiribatiComorosSaint Kitts dan NevisKorea UtaraKorea SelatanKuwaitKe" + - "pulauan CaymanKazakhstanLaosLubnanSaint LuciaLiechtensteinSri LankaLiber" + - "iaLesothoLithuaniaLuxembourgLatviaLibyaMaghribiMonacoMoldovaMontenegroSa" + - "int MartinMadagaskarKepulauan MarshallMacedoniaMaliMyanmar (Burma)Mongol" + - "iaMacau SAR ChinaKepulauan Mariana UtaraMartiniqueMauritaniaMontserratMa" + - "ltaMauritiusMaldivesMalawiMexicoMalaysiaMozambiqueNamibiaNew CaledoniaNi" + - "gerPulau NorfolkNigeriaNicaraguaBelandaNorwayNepalNauruNiueNew ZealandOm" + - "anPanamaPeruPolinesia PerancisPapua New GuineaFilipinaPakistanPolandSain" + - "t Pierre dan MiquelonKepulauan PitcairnPuerto RicoWilayah PalestinPortug" + - "alPalauParaguayQatarOceania TerpencilReunionRomaniaSerbiaRusiaRwandaArab" + - " SaudiKepulauan SolomonSeychellesSudanSwedenSingapuraSaint HelenaSloveni" + - "aSvalbard dan Jan MayenSlovakiaSierra LeoneSan MarinoSenegalSomaliaSurin" + - "amSudan SelatanSao Tome dan PrincipeEl SalvadorSint MaartenSyriaSwazilan" + - "dTristan da CunhaKepulauan Turks dan CaicosChadWilayah Selatan PerancisT" + - "ogoThailandTajikistanTokelauTimor-LesteTurkmenistanTunisiaTongaTurkiTrin" + - "idad dan TobagoTuvaluTaiwanTanzaniaUkraineUgandaKepulauan Terpencil A.S." + - "Bangsa-bangsa BersatuAmerika SyarikatUruguayUzbekistanKota VaticanSaint " + - "Vincent dan GrenadinesVenezuelaKepulauan Virgin BritishKepulauan Virgin " + - "A.S.VietnamVanuatuWallis dan FutunaSamoaKosovoYamanMayotteAfrika Selatan" + - "ZambiaZimbabweWilayah Tidak DiketahuiDuniaAfrikaAmerika UtaraAmerika Sel" + - "atanOceaniaAfrika BaratAmerika TengahAfrika TimurAfrika UtaraAfrika Teng" + - "ahSelatan AfrikaAmerikaUtara AmerikaCaribbeanAsia TimurAsia SelatanAsia " + - "TenggaraEropah SelatanAustralasiaMelanesiaWilayah MikronesiaPolinesiaAsi" + - "aAsia TengahAsia BaratEropahEropah TimurEropah UtaraEropah BaratAmerika " + - "Latin" - -var msRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x0016, 0x002a, 0x0035, 0x0048, 0x0050, 0x0057, - 0x005e, 0x0064, 0x006d, 0x0076, 0x0083, 0x008a, 0x0093, 0x0098, - 0x00a7, 0x00b1, 0x00c7, 0x00cf, 0x00d9, 0x00e0, 0x00ec, 0x00f4, - 0x00fb, 0x0102, 0x0107, 0x0118, 0x011f, 0x0125, 0x012c, 0x013d, - 0x0143, 0x014a, 0x0150, 0x015c, 0x0164, 0x016b, 0x0171, 0x0177, - 0x0190, 0x01a0, 0x01b6, 0x01c9, 0x01d4, 0x01e3, 0x01f1, 0x01f6, - 0x01fe, 0x0203, 0x020b, 0x021b, 0x0225, 0x0229, 0x0233, 0x023a, - 0x0247, 0x024d, 0x0254, 0x025a, 0x0266, 0x026e, 0x0275, 0x027d, - // Entry 40 - 7F - 0x028e, 0x0295, 0x02a6, 0x02ad, 0x02b4, 0x02b9, 0x02c5, 0x02cc, - 0x02d4, 0x02dc, 0x02eb, 0x02eb, 0x02f2, 0x02f6, 0x0308, 0x0312, - 0x0321, 0x0329, 0x032e, 0x033c, 0x0343, 0x034a, 0x0359, 0x0361, - 0x0366, 0x036f, 0x0378, 0x037e, 0x0384, 0x038e, 0x03a1, 0x03a7, - 0x03d3, 0x03dc, 0x03e0, 0x03ed, 0x03f3, 0x0406, 0x0420, 0x0428, - 0x042f, 0x0434, 0x043b, 0x044b, 0x0454, 0x045b, 0x0461, 0x046c, - 0x0471, 0x048d, 0x0491, 0x0495, 0x049c, 0x04a1, 0x04a7, 0x04ae, - 0x04b4, 0x04b9, 0x04be, 0x04c8, 0x04cf, 0x04d7, 0x04de, 0x04f3, - // Entry 80 - BF - 0x04fe, 0x050b, 0x0511, 0x0521, 0x052b, 0x052f, 0x0535, 0x0540, - 0x054d, 0x0556, 0x055d, 0x0564, 0x056d, 0x0577, 0x057d, 0x0582, - 0x058a, 0x0590, 0x0597, 0x05a1, 0x05ad, 0x05b7, 0x05c9, 0x05d2, - 0x05d6, 0x05e5, 0x05ed, 0x05fc, 0x0613, 0x061d, 0x0627, 0x0631, - 0x0636, 0x063f, 0x0647, 0x064d, 0x0653, 0x065b, 0x0665, 0x066c, - 0x0679, 0x067e, 0x068b, 0x0692, 0x069b, 0x06a2, 0x06a8, 0x06ad, - 0x06b2, 0x06b6, 0x06c1, 0x06c5, 0x06cb, 0x06cf, 0x06e1, 0x06f1, - 0x06f9, 0x0701, 0x0707, 0x0720, 0x0732, 0x073d, 0x074d, 0x0755, - // Entry C0 - FF - 0x075a, 0x0762, 0x0767, 0x0778, 0x077f, 0x0786, 0x078c, 0x0791, - 0x0797, 0x07a1, 0x07b2, 0x07bc, 0x07c1, 0x07c7, 0x07d0, 0x07dc, - 0x07e4, 0x07fa, 0x0802, 0x080e, 0x0818, 0x081f, 0x0826, 0x082d, - 0x083a, 0x084f, 0x085a, 0x0866, 0x086b, 0x0874, 0x0884, 0x089e, - 0x08a2, 0x08ba, 0x08be, 0x08c6, 0x08d0, 0x08d7, 0x08e2, 0x08ee, - 0x08f5, 0x08fa, 0x08ff, 0x0912, 0x0918, 0x091e, 0x0926, 0x092d, - 0x0933, 0x094b, 0x0960, 0x0970, 0x0977, 0x0981, 0x098d, 0x09a9, - 0x09b2, 0x09ca, 0x09df, 0x09e6, 0x09ed, 0x09fe, 0x0a03, 0x0a09, - // Entry 100 - 13F - 0x0a0e, 0x0a15, 0x0a23, 0x0a29, 0x0a31, 0x0a48, 0x0a4d, 0x0a53, - 0x0a60, 0x0a6f, 0x0a76, 0x0a82, 0x0a90, 0x0a9c, 0x0aa8, 0x0ab5, - 0x0ac3, 0x0aca, 0x0ad7, 0x0ae0, 0x0aea, 0x0af6, 0x0b03, 0x0b11, - 0x0b1c, 0x0b25, 0x0b37, 0x0b40, 0x0b44, 0x0b4f, 0x0b59, 0x0b5f, - 0x0b6b, 0x0b77, 0x0b83, 0x0b90, -} // Size: 608 bytes - -const myRegionStr string = "" + // Size: 9643 bytes - "တက်တော်မူကျွန်းအင်ဒိုရာယူအေအီးအာဖဂန်နစ္စတန်အင်တီဂွါနှင့် ဘာဘူဒါအန်ဂီလာအယ" + - "်လ်ဘေးနီးယားအာမေးနီးယားအင်ဂိုလာအန္တာတိကအာဂျင်တီးနားအမေရိကန် ဆမိုးအားဩစ" + - "တြီးယားဩစတြေးလျအာရူးဗားအာလန်ကျွန်းအဇာဘိုင်ဂျန်ဘော့စနီးယားနှင့် ဟာဇီဂို" + - "ဗီနားဘာဘေးဒိုးစ်ဘင်္ဂလားဒေ့ရှ်ဘယ်လ်ဂျီယမ်ဘာကီးနား ဖားဆိုဘူလ်ဂေးရီးယားဘ" + - "ာရိန်းဘူရွန်ဒီဘီနင်စိန့်ဘာသယ်လ်မီဘာမြူဒါဘရူနိုင်းဘိုလီးဗီးယားကာရစ်ဘီယံ" + - " နယ်သာလန်ဘရာဇီးဘဟားမားဘူတန်ဘူဗက်ကျွန်းဘော့ဆွာနာဘီလာရုဇ်ဘလိဇ်ကနေဒါကိုကိုး" + - "ကျွန်းကွန်ဂိုဗဟို အာဖရိက ပြည်ထောင်စုကွန်ဂို-ဘရာဇာဗီးလ်ဆွစ်ဇာလန်ကို့တ် " + - "ဒီဗွာကွတ် ကျွန်းစုချီလီကင်မရွန်းတရုတ်ကိုလံဘီယာကလစ်ပါတန်ကျွန်းကို့စ်တာရ" + - "ီကာကျူးဘားကိတ်ဗာဒီကျူရေးကိုးစ်ခရစ်စမတ် ကျွန်းဆိုက်ပရပ်စ်ချက်ကီယားဂျာမဏ" + - "ီဒီအဲဂိုဂါစီရာဂျီဘူတီဒိန်းမတ်ဒိုမီနီကာဒိုမီနီကန်အယ်လ်ဂျီးရီးယားဆယ်ဥတာန" + - "ှင့်မယ်လီလ်လာအီကွေဒေါအက်စတိုးနီးယားအီဂျစ်အနောက် ဆာဟာရအီရီထရီးယားစပိန်အ" + - "ီသီယိုးပီးယားဥရောပသမဂ္ဂဖင်လန်ဖီဂျီဖော့ကလန် ကျွန်းစုမိုင်ခရိုနီရှားဖာရိ" + - "ုး ကျွန်းစုများပြင်သစ်ဂါဘွန်ယူနိုက်တက်ကင်းဒမ်းဂရီနေဒါဂျော်ဂျီယာပြင်သစ်" + - " ဂိုင်ယာနာဂွန်းဇီဂါနာဂျီဘရော်လ်တာဂရင်းလန်းဂမ်ဘီရာဂီနီဂွါဒီလုအီကွေတာ ဂီနီ" + - "ဂရိတောင် ဂျော်ဂျီယာ နှင့် တောင် ဆင်းဒဝစ်ဂျ် ကျွန်းစုများဂွါတီမာလာဂူအမ်" + - "ဂီနီ-ဘီစောဂိုင်ယာနာဟောင်ကောင် (တရုတ်ပြည်)ဟတ်ကျွန်းနှင့်မက်ဒေါနယ်ကျွန်း" + - "စုဟွန်ဒူးရပ်စ်ခရိုအေးရှားဟေတီဟန်ဂေရီကနေရီ ကျွန်းစုအင်ဒိုနီးရှားအိုင်ယာ" + - "လန်အစ္စရေးမန်ကျွန်းအိန္ဒိယဗြိတိသျှပိုင် အိန္ဒိယသမုဒ္ဒရာကျွန်းများအီရတ်" + - "အီရန်အိုက်စလန်အီတလီဂျာစီဂျမေကာဂျော်ဒန်ဂျပန်ကင်ညာကာဂျစ္စတန်ကမ္ဘောဒီးယား" + - "ခီရီဘာတီကိုမိုရိုစ်စိန့်ကစ်နှင့်နီဗီစ်မြောက်ကိုရီးယားတောင်ကိုရီးယားကူဝ" + - "ိတ်ကေမန် ကျွန်းစုကာဇက်စတန်လာအိုလက်ဘနွန်စိန့်လူစီယာလစ်တန်စတိန်းသီရိလင်္" + - "ကာလိုက်ဘေးရီးယားလီဆိုသိုလစ်သူယေးနီးယားလူဇင်ဘတ်လတ်ဗီးယားလစ်ဗျားမော်ရိုက" + - "ိုမိုနာကိုမောလ်ဒိုဗာမွန်တီနိဂရိုးစိန့်မာတင်မဒါဂတ်စကားမာရှယ် ကျွန်းစုမက" + - "်စီဒိုးနီးယားမာလီမြန်မာမွန်ဂိုးလီးယားမကာအို (တရုတ်ပြည်)တောင်ပိုင်းမာရီ" + - "အာနာကျွန်းစုမာတီနိခ်မော်ရီတေးနီးယားမောင့်စဲရက်မောလ်တာမောရစ်ရှမော်လ်ဒို" + - "က်မာလာဝီမက္ကဆီကိုမလေးရှားမိုဇမ်ဘစ်နမီးဘီးယားနယူး ကယ်လီဒိုနီးယားနိုင်ဂျ" + - "ာနောဖုတ်ကျွန်းနိုင်ဂျီးရီးယားနီကာရာဂွါနယ်သာလန်နော်ဝေနီပေါနော်ရူးနီဥူအေ" + - "နယူးဇီလန်အိုမန်ပနားမားပီရူးပြင်သစ် ပေါ်လီနီးရှားပါပူအာ နယူးဂီနီဖိလစ်ပိ" + - "ုင်ပါကစ္စတန်ပိုလန်စိန့်ပီအဲရ်နှင့် မီကွီလွန်ပစ်တ်ကိန်းကျွန်းစုပေါ်တိုရ" + - "ီကိုပါလက်စတိုင်း ပိုင်နက်ပေါ်တူဂီပလာအိုပါရာဂွေးကာတာသမုဒ္ဒရာ အပြင်ဘက်ရှ" + - "ိ ကျွန်းနိုင်ငံများဟေညွန်ရိုမေးနီးယားဆားဘီးယားရုရှရဝန်ဒါဆော်ဒီအာရေးဘီး" + - "ယားဆော်လမွန်ကျွန်းစုဆေးရှဲဆူဒန်ဆွီဒင်စင်္ကာပူစိန့်ဟယ်လယ်နာစလိုဗေးနီးယာ" + - "းစဗိုလ်ဘတ်နှင့်ဂျန်မေရန်ဆလိုဗက်ကီးယားဆီယာရာ လီယွန်းဆန်မာရီနိုဆီနီဂေါဆိ" + - "ုမာလီယာဆူရာနမ်တောင် ဆူဒန်ဆောင်တူမေးနှင့် ပရင်စီပီအယ်လ်ဆာဗေးဒိုးစင့်မာတ" + - "င်ဆီးရီးယားဆွာဇီလန်ထရစ္စတန် ဒါ ကွန်ဟာတခ်စ်နှင့်ကာအီကိုစ်ကျွန်းစုချဒ်ပြ" + - "င်သစ် တောင်ပိုင်း ပိုင်နက်များတိုဂိုထိုင်းတာဂျီကစ္စတန်တိုကလောင်အရှေ့တီ" + - "မောတာ့ခ်မင်နစ္စတန်တူနီးရှားတွန်ဂါတူရကီထရီနီဒတ်နှင့် တိုဘက်ဂိုတူဗားလူထိ" + - "ုင်ဝမ်တန်ဇန်းနီးယားယူကရိန်းယူဂန်းဒါးယူနိုက်တက်စတိတ် ကျွန်းနိုင်ငံများက" + - "ုလသမဂ္ဂယူနိုက်တက်စတိတ်ဥရုဂွေးဉဇဘက်ကစ္စတန်ဗာတီကန်စီတီးစိန့်ဗင်းဆင့်နှင့" + - "် ဂရိနေဒိုင်ဗင်နီဇွဲလားဗြိတိသျှ ဗာဂျင်း ကျွန်းစုယူအက်စ် ဗာဂျင်း ကျွန်း" + - "စုဗီယက်နမ်ဗနွားတူဝေါလစ်နှင့် ဖူကျူးနားဆမိုးအားကိုဆိုဗိုယီမင်မာယိုတေးတေ" + - "ာင်အာဖရိကဇမ်ဘီယာဇင်ဘာဘွေမသိ (သို့) မရှိသော ဒေသကမ္ဘာအာဖရိကမြောက် အမေရိက" + - "တိုက်တောင် အမေရိကသမုဒ္ဒရာဒေသအနောက် အာဖရိကဗဟို အမေရိကအရှေ့ အာဖရိကမြောက်" + - " အာဖရိကအလယ် အာဖရိကအာဖရိက တောင်ပိုင်းအမေရိကန်မြောက် အမေရိကကာရစ်ဘီယံအရှေ့အ" + - "ာရှတောင်အာရှအရှေ့တောင်အာရှတောင်ဥရောပဩစတြေးလျနှင့် နယူးဇီလန်မီလာနီးရှား" + - "မိုက်ခရိုနီးရှား ဒေသပိုလီနီရှားအာရှအလယ်အာရှအနောက်အာရှဥရောပအရှေ့ ဥရောပမ" + - "ြောက် ဥရောပအနောက် ဥရောပလက်တင်အမေရိက" - -var myRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x002d, 0x0045, 0x005a, 0x0081, 0x00bb, 0x00d0, 0x00fa, - 0x011b, 0x0133, 0x014b, 0x016f, 0x01a0, 0x01bb, 0x01d3, 0x01eb, - 0x020c, 0x0230, 0x0285, 0x02a6, 0x02d0, 0x02f1, 0x031c, 0x0343, - 0x0358, 0x0370, 0x037f, 0x03a9, 0x03be, 0x03d9, 0x03fd, 0x0431, - 0x0443, 0x0458, 0x0467, 0x0488, 0x04a3, 0x04bb, 0x04ca, 0x04d9, - 0x0500, 0x0515, 0x0556, 0x058a, 0x05a5, 0x05c7, 0x05ec, 0x05fb, - 0x0616, 0x0625, 0x0640, 0x066d, 0x0691, 0x06a6, 0x06be, 0x06e2, - 0x070d, 0x072e, 0x0749, 0x075b, 0x0782, 0x0797, 0x07af, 0x07ca, - // Entry 40 - 7F - 0x07e8, 0x0815, 0x0851, 0x0869, 0x0893, 0x08a5, 0x08c7, 0x08e8, - 0x08f7, 0x0921, 0x093f, 0x093f, 0x0951, 0x0960, 0x0991, 0x09be, - 0x09f5, 0x0a0a, 0x0a1c, 0x0a52, 0x0a67, 0x0a85, 0x0ab6, 0x0acb, - 0x0ad7, 0x0afb, 0x0b16, 0x0b2b, 0x0b37, 0x0b4c, 0x0b6e, 0x0b77, - 0x0c0c, 0x0c27, 0x0c36, 0x0c52, 0x0c6d, 0x0ca9, 0x0d06, 0x0d2a, - 0x0d4b, 0x0d57, 0x0d6c, 0x0d94, 0x0dbb, 0x0dd9, 0x0dee, 0x0e09, - 0x0e1e, 0x0e91, 0x0ea0, 0x0eaf, 0x0eca, 0x0ed9, 0x0ee8, 0x0efa, - 0x0f12, 0x0f21, 0x0f30, 0x0f4e, 0x0f72, 0x0f8a, 0x0fab, 0x0fe4, - // Entry 80 - BF - 0x1011, 0x103b, 0x104d, 0x1075, 0x1090, 0x109f, 0x10b7, 0x10d8, - 0x10fc, 0x111a, 0x1144, 0x115c, 0x1186, 0x119e, 0x11b9, 0x11ce, - 0x11ec, 0x1204, 0x1222, 0x1249, 0x1267, 0x1285, 0x12b0, 0x12dd, - 0x12e9, 0x12fb, 0x1325, 0x1355, 0x13a6, 0x13be, 0x13eb, 0x140c, - 0x1421, 0x1439, 0x145a, 0x146c, 0x1487, 0x149f, 0x14ba, 0x14d8, - 0x150f, 0x1527, 0x154e, 0x157b, 0x1596, 0x15ae, 0x15c0, 0x15cf, - 0x15e4, 0x15f6, 0x1611, 0x1623, 0x1638, 0x1647, 0x1684, 0x16af, - 0x16cd, 0x16e8, 0x16fa, 0x1746, 0x177c, 0x17a0, 0x17dd, 0x17f5, - // Entry C0 - FF - 0x1807, 0x181f, 0x182b, 0x1899, 0x18ab, 0x18cf, 0x18ea, 0x18f6, - 0x1908, 0x193b, 0x196e, 0x1980, 0x198f, 0x19a1, 0x19b9, 0x19e0, - 0x1a07, 0x1a4c, 0x1a73, 0x1a9b, 0x1ab9, 0x1ace, 0x1ae9, 0x1afe, - 0x1b1d, 0x1b63, 0x1b8d, 0x1ba8, 0x1bc3, 0x1bdb, 0x1c0d, 0x1c5e, - 0x1c6a, 0x1cc6, 0x1cd8, 0x1cea, 0x1d0e, 0x1d29, 0x1d47, 0x1d74, - 0x1d8f, 0x1da1, 0x1db0, 0x1df3, 0x1e08, 0x1e20, 0x1e47, 0x1e5f, - 0x1e7a, 0x1edb, 0x1ef3, 0x1f20, 0x1f35, 0x1f59, 0x1f7d, 0x1fd2, - 0x1ff3, 0x203a, 0x207e, 0x2096, 0x20ab, 0x20e8, 0x2100, 0x211b, - // Entry 100 - 13F - 0x212a, 0x2142, 0x2163, 0x2178, 0x2190, 0x21c8, 0x21d7, 0x21e9, - 0x221d, 0x223f, 0x2260, 0x2285, 0x22a4, 0x22c6, 0x22eb, 0x230a, - 0x233e, 0x2356, 0x237b, 0x2396, 0x23b1, 0x23cc, 0x23f6, 0x2414, - 0x2457, 0x2478, 0x24b2, 0x24d3, 0x24df, 0x24f7, 0x2515, 0x2524, - 0x2543, 0x2565, 0x2587, 0x25ab, -} // Size: 608 bytes - -const neRegionStr string = "" + // Size: 9054 bytes - "एस्केन्सन टापुअन्डोर्रासंयुक्त अरब इमिराट्सअफगानिस्तानएन्टिगुआ र बारबुडा" + - "आङ्गुइलाअल्बानियाआर्मेनियाअङ्गोलाअन्टारटिकाअर्जेन्टिनाअमेरिकी समोआअष्ट" + - "्रियाअष्ट्रेलियाआरूबाअलान्ड टापुहरुअजरबैजानबोस्निया एण्ड हर्जगोभिनियाब" + - "ार्बाडोसबङ्गलादेशबेल्जियमबर्किना फासोबुल्गेरियाबहराइनबुरूण्डीबेनिनसेन्" + - "ट बार्थालेमीबर्मुडाब्रुनाइबोलिभियाक्यारिवियन नेदरल्याण्ड्सब्राजिलबहामा" + - "सभुटानबुभेट टापुबोट्स्वानाबेलारूसबेलिजक्यानाडाकोकोस (किलिंग) टापुहरुको" + - "ङ्गो-किन्शासाकेन्द्रीय अफ्रिकी गणतन्त्रकोङ्गो - ब्राज्जाभिल्लेस्विजरल्" + - "याण्डआइभोरी कोस्टकुक टापुहरुचिलीक्यामरूनचीनकोलोम्बियाक्लिप्पेर्टन टापु" + - "कोष्टारिकाक्युबाकेप भर्डेकुराकाओक्रिष्टमस टापुसाइप्रसचेचियाजर्मनीडियगो" + - " गार्सियाडिजिबुटीडेनमार्कडोमिनिकाडोमिनिकन गणतन्त्रअल्जेरियासिउटा र मेलिल" + - "ाइक्वडेरइस्टोनियाइजिप्टपश्चिमी साहाराएरित्रियास्पेनइथियोपियायुरोपियन य" + - "ुनियनफिन्ल्याण्डफिजीफकल्याण्ड टापुहरुमाइक्रोनेसियाफारो टापुहरूफ्रान्सग" + - "ावोनबेलायतग्रेनाडाजर्जियाफ्रान्सेली गायनागुएर्नसेघानाजिब्राल्टारग्रिनल" + - "्याण्डगाम्वियागिनीग्वाडेलुपभू-मध्यीय गिनीग्रिसदक्षिण जर्जिया र दक्षिण " + - "स्यान्डवीच टापुहरूग्वाटेमालागुवामगिनी-बिसाउगुयानाहङकङ चिनिया समाजवादी " + - "स्वायत्त क्षेत्रहर्ड टापु र म्याकडोनाल्ड टापुहरुहन्डुरासक्रोएशियाहैटीह" + - "ङ्गेरीक्यानारी टापुहरूइन्डोनेशियाआयरल्याण्डइजरायलआइज्ले अफ् म्यानभारतब" + - "ेलायती हिन्द महासागर क्षेत्रइराकइरानआइस्ल्याण्डइटालीजर्सीजमाइकाजोर्डनज" + - "ापानकेन्याकिर्गिस्थानकम्बोडियाकिरिबाटीकोमोरोससेन्ट किट्स र नेभिसउत्तर " + - "कोरियादक्षिण कोरियाकुवेतकेयमान टापुकाजाकस्तानलाओसलेबननसेन्ट लुसियालिएख" + - "टेन्स्टाइनश्रीलङ्कालाइबेरियालेसोथोलिथुअनियालक्जेमबर्गलाट्भियालिबियामोर" + - "ोक्कोमोनाकोमाल्डोभामोन्टेनेग्रोसेन्ट मार्टिनमडागास्करमार्शल टापुहरुम्य" + - "ाकेडोनियामालीम्यान्मार (बर्मा)मङ्गोलियामकावो चिनिँया स्वशासित क्षेत्रउ" + - "त्तरी मारिआना टापुमार्टिनिकमाउरिटानियामोन्टसेर्राटमाल्टामाउरिटसमाल्दिभ" + - "्समालावीमेक्सिकोमलेसियामोजाम्बिकनामिबियानयाँ कालेडोनियानाइजरनोरफोल्क ट" + - "ापुनाइजेरियानिकारागुवानेदरल्याण्ड्सनर्वेनेपालनाउरूनियुइन्युजिल्याण्डओम" + - "नपनामापेरूफ्रान्सेली पोलिनेसियापपुआ न्यू गाइनियाफिलिपिन्सपाकिस्तानपोल्" + - "याण्डसेन्ट पिर्रे र मिक्केलोनपिटकाइर्न टापुहरुपुएर्टो रिकोप्यालेस्टनी " + - "भू-भागहरुपोर्चुगलपलाउप्याराग्वेकतारबाह्य ओसनियारियुनियनरोमानियासर्बिया" + - "रूसरवाण्डासाउदी अरबसोलोमोन टापुहरुसेचेलेससुडानस्विडेनसिङ्गापुरसेन्ट हे" + - "लेनास्लोभेनियासभाल्बार्ड र जान मायेनस्लोभाकियासिएर्रा लिओनसान् मारिनोस" + - "ेनेगालसोमालियासुरिनेमदक्षिणी सुडानसाओ टोमे र प्रिन्सिपएल् साल्भाडोरसिन" + - "्ट मार्टेनसिरियास्वाजिल्याण्डट्रिस्टान डा कुन्हातुर्क र काइकोस टापुचाड" + - "फ्रान्सेली दक्षिणी क्षेत्रहरुटोगोथाइल्याण्डताजिकिस्तानतोकेलाउटिमोर-लेस" + - "्टेतुर्कमेनिस्तानट्युनिसियाटोंगाटर्कीत्रिनिडाड एण्ड टोबागोतुभालुताइवान" + - "तान्जानियायुक्रेनयुगाण्डासंयुक्त राज्यका बाह्य टापुहरुसंयुक्त राष्ट्र " + - "संघसंयुक्त राज्यउरूग्वेउज्बेकिस्तानभेटिकन सिटीसेन्ट भिन्सेन्ट र ग्रेना" + - "डिन्सभेनेजुएलाबेलायती भर्जिन टापुहरुसंयुक्त राज्य भर्जिन टापुहरुभिएतना" + - "मभानुआतुवालिस र फुटुनासामोआकोसोवोयेमेनमायोट्टदक्षिण अफ्रिकाजाम्बियाजिम" + - "्बाबेअज्ञात क्षेत्रविश्वअफ्रिकाउत्तर अमेरिकादक्षिण अमेरिकाओसनियापश्चिम" + - "ी अफ्रिकाकेन्द्रीय अमेरिकापूर्वी अफ्रिकाउत्तरी अफ्रिकामध्य अफ्रिकादक्ष" + - "िणी अफ्रिकाअमेरिकासउत्तरी अमेरिकाक्यारिबियनपूर्वी एशियादक्षिणी एशियादक" + - "्षिण पूर्वी एशियादक्षिणी युरोपअष्ट्रालासियामेलानेसियामाइक्रोनेसियाली क" + - "्षेत्रपोलिनेशियाएशियाकेन्द्रीय एशियापश्चिमी एशियायुरोपपूर्वी युरोपउत्त" + - "री युरोपपश्चिमी युरोपल्याटिन अमेरिका" - -var neRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0028, 0x0043, 0x007b, 0x009c, 0x00ce, 0x00e6, 0x0101, - 0x011c, 0x0131, 0x014f, 0x0170, 0x0192, 0x01ad, 0x01ce, 0x01dd, - 0x0205, 0x021d, 0x0267, 0x0282, 0x029d, 0x02b5, 0x02d7, 0x02f5, - 0x0307, 0x031f, 0x032e, 0x035c, 0x0371, 0x0386, 0x039e, 0x03e4, - 0x03f9, 0x040b, 0x041a, 0x0436, 0x0454, 0x0469, 0x0478, 0x0490, - 0x04ca, 0x04f5, 0x053f, 0x057e, 0x05a5, 0x05c7, 0x05e6, 0x05f2, - 0x060a, 0x0613, 0x0631, 0x0662, 0x0680, 0x0692, 0x06ab, 0x06c0, - 0x06e8, 0x06fd, 0x070f, 0x0721, 0x0749, 0x0761, 0x0779, 0x0791, - // Entry 40 - 7F - 0x07c2, 0x07dd, 0x0803, 0x0818, 0x0833, 0x0845, 0x086d, 0x0888, - 0x0897, 0x08b2, 0x08dd, 0x08dd, 0x08fe, 0x090a, 0x093b, 0x0962, - 0x0984, 0x0999, 0x09a8, 0x09ba, 0x09d2, 0x09e7, 0x0a15, 0x0a2d, - 0x0a39, 0x0a5a, 0x0a7e, 0x0a96, 0x0aa2, 0x0abd, 0x0ae3, 0x0af2, - 0x0b66, 0x0b84, 0x0b93, 0x0baf, 0x0bc1, 0x0c28, 0x0c80, 0x0c98, - 0x0cb3, 0x0cbf, 0x0cd4, 0x0d02, 0x0d23, 0x0d41, 0x0d53, 0x0d7f, - 0x0d8b, 0x0ddc, 0x0de8, 0x0df4, 0x0e15, 0x0e24, 0x0e33, 0x0e45, - 0x0e57, 0x0e66, 0x0e78, 0x0e99, 0x0eb4, 0x0ecc, 0x0ee1, 0x0f14, - // Entry 80 - BF - 0x0f36, 0x0f5b, 0x0f6a, 0x0f89, 0x0fa7, 0x0fb3, 0x0fc2, 0x0fe4, - 0x100e, 0x1029, 0x1044, 0x1056, 0x1071, 0x108f, 0x10a7, 0x10b9, - 0x10d1, 0x10e3, 0x10fb, 0x111f, 0x1144, 0x115f, 0x1187, 0x11ab, - 0x11b7, 0x11e4, 0x11ff, 0x1253, 0x1288, 0x12a3, 0x12c4, 0x12e8, - 0x12fa, 0x130f, 0x132a, 0x133c, 0x1354, 0x1369, 0x1384, 0x139c, - 0x13c7, 0x13d6, 0x13fb, 0x1416, 0x1434, 0x145b, 0x146a, 0x1479, - 0x1488, 0x1497, 0x14be, 0x14c7, 0x14d6, 0x14e2, 0x151f, 0x154e, - 0x1569, 0x1584, 0x159f, 0x15e1, 0x1612, 0x1634, 0x166f, 0x1687, - // Entry C0 - FF - 0x1693, 0x16b1, 0x16bd, 0x16df, 0x16f7, 0x170f, 0x1724, 0x172d, - 0x1742, 0x175b, 0x1786, 0x179b, 0x17aa, 0x17bf, 0x17da, 0x17fc, - 0x181a, 0x1856, 0x1874, 0x1896, 0x18b5, 0x18ca, 0x18e2, 0x18f7, - 0x191c, 0x1952, 0x1977, 0x199c, 0x19ae, 0x19d5, 0x1a0a, 0x1a3d, - 0x1a46, 0x1a99, 0x1aa5, 0x1ac3, 0x1ae4, 0x1af9, 0x1b1b, 0x1b45, - 0x1b63, 0x1b72, 0x1b81, 0x1bbc, 0x1bce, 0x1be0, 0x1bfe, 0x1c13, - 0x1c2b, 0x1c7c, 0x1cb1, 0x1cd6, 0x1ceb, 0x1d0f, 0x1d2e, 0x1d7f, - 0x1d9a, 0x1dd8, 0x1e26, 0x1e3b, 0x1e50, 0x1e76, 0x1e85, 0x1e97, - // Entry 100 - 13F - 0x1ea6, 0x1ebb, 0x1ee3, 0x1efb, 0x1f13, 0x1f3b, 0x1f4a, 0x1f5f, - 0x1f84, 0x1fac, 0x1fbe, 0x1fe9, 0x201a, 0x2042, 0x206a, 0x208c, - 0x20b7, 0x20cf, 0x20f7, 0x2115, 0x2137, 0x215c, 0x2191, 0x21b6, - 0x21dd, 0x21fb, 0x223e, 0x225c, 0x226b, 0x2296, 0x22bb, 0x22ca, - 0x22ec, 0x230e, 0x2333, 0x235e, -} // Size: 608 bytes - -const nlRegionStr string = "" + // Size: 3090 bytes - "AscensionAndorraVerenigde Arabische EmiratenAfghanistanAntigua en Barbud" + - "aAnguillaAlbaniëArmeniëAngolaAntarcticaArgentiniëAmerikaans-SamoaOostenr" + - "ijkAustraliëArubaÅlandAzerbeidzjanBosnië en HerzegovinaBarbadosBanglades" + - "hBelgiëBurkina FasoBulgarijeBahreinBurundiBeninSaint-BarthélemyBermudaBr" + - "uneiBoliviaCaribisch NederlandBraziliëBahama’sBhutanBouveteilandBotswana" + - "BelarusBelizeCanadaCocoseilandenCongo-KinshasaCentraal-Afrikaanse Republ" + - "iekCongo-BrazzavilleZwitserlandIvoorkustCookeilandenChiliKameroenChinaCo" + - "lombiaClippertonCosta RicaCubaKaapverdiëCuraçaoChristmaseilandCyprusTsje" + - "chische RepubliekDuitslandDiego GarciaDjiboutiDenemarkenDominicaDominica" + - "anse RepubliekAlgerijeCeuta en MelillaEcuadorEstlandEgypteWestelijke Sah" + - "araEritreaSpanjeEthiopiëEuropese UnieFinlandFijiFalklandeilandenMicrones" + - "iaFaeröerFrankrijkGabonVerenigd KoninkrijkGrenadaGeorgiëFrans-GuyanaGuer" + - "nseyGhanaGibraltarGroenlandGambiaGuineeGuadeloupeEquatoriaal-GuineaGriek" + - "enlandZuid-Georgia en Zuidelijke SandwicheilandenGuatemalaGuamGuinee-Bis" + - "sauGuyanaHongkong SAR van ChinaHeard en McDonaldeilandenHondurasKroatiëH" + - "aïtiHongarijeCanarische EilandenIndonesiëIerlandIsraëlIsle of ManIndiaBr" + - "itse Gebieden in de Indische OceaanIrakIranIJslandItaliëJerseyJamaicaJor" + - "daniëJapanKeniaKirgiziëCambodjaKiribatiComorenSaint Kitts en NevisNoord-" + - "KoreaZuid-KoreaKoeweitKaaimaneilandenKazachstanLaosLibanonSaint LuciaLie" + - "chtensteinSri LankaLiberiaLesothoLitouwenLuxemburgLetlandLibiëMarokkoMon" + - "acoMoldaviëMontenegroSaint-MartinMadagaskarMarshalleilandenMacedoniëMali" + - "Myanmar (Birma)MongoliëMacau SAR van ChinaNoordelijke MarianenMartinique" + - "MauritaniëMontserratMaltaMauritiusMaldivenMalawiMexicoMaleisiëMozambique" + - "NamibiëNieuw-CaledoniëNigerNorfolkNigeriaNicaraguaNederlandNoorwegenNepa" + - "lNauruNiueNieuw-ZeelandOmanPanamaPeruFrans-PolynesiëPapoea-Nieuw-GuineaF" + - "ilipijnenPakistanPolenSaint-Pierre en MiquelonPitcairneilandenPuerto Ric" + - "oPalestijnse gebiedenPortugalPalauParaguayQataroverig OceaniëRéunionRoem" + - "eniëServiëRuslandRwandaSaoedi-ArabiëSalomonseilandenSeychellenSoedanZwed" + - "enSingaporeSint-HelenaSloveniëSpitsbergen en Jan MayenSlowakijeSierra Le" + - "oneSan MarinoSenegalSomaliëSurinameZuid-SoedanSao Tomé en PrincipeEl Sal" + - "vadorSint-MaartenSyriëSwazilandTristan da CunhaTurks- en CaicoseilandenT" + - "sjaadFranse Gebieden in de zuidelijke Indische OceaanTogoThailandTadzjik" + - "istanTokelauOost-TimorTurkmenistanTunesiëTongaTurkijeTrinidad en TobagoT" + - "uvaluTaiwanTanzaniaOekraïneOegandaKleine afgelegen eilanden van de Veren" + - "igde Statenverenigde natiesVerenigde StatenUruguayOezbekistanVaticaansta" + - "dSaint Vincent en de GrenadinesVenezuelaBritse MaagdeneilandenAmerikaans" + - "e MaagdeneilandenVietnamVanuatuWallis en FutunaSamoaKosovoJemenMayotteZu" + - "id-AfrikaZambiaZimbabweonbekend gebiedwereldAfrikaNoord-AmerikaZuid-Amer" + - "ikaOceaniëWest-AfrikaMidden-AmerikaOost-AfrikaNoord-AfrikaCentraal-Afrik" + - "aZuidelijk AfrikaAmerikaNoordelijk AmerikaCaribisch gebiedOost-AziëZuid-" + - "AziëZuidoost-AziëZuid-EuropaAustralaziëMelanesiëMicronesische regioPolyn" + - "esiëAziëCentraal-AziëWest-AziëEuropaOost-EuropaNoord-EuropaWest-EuropaLa" + - "tijns-Amerika" - -var nlRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002c, 0x0037, 0x0049, 0x0051, 0x0059, - 0x0061, 0x0067, 0x0071, 0x007c, 0x008c, 0x0096, 0x00a0, 0x00a5, - 0x00ab, 0x00b7, 0x00cd, 0x00d5, 0x00df, 0x00e6, 0x00f2, 0x00fb, - 0x0102, 0x0109, 0x010e, 0x011f, 0x0126, 0x012c, 0x0133, 0x0146, - 0x014f, 0x0159, 0x015f, 0x016b, 0x0173, 0x017a, 0x0180, 0x0186, - 0x0193, 0x01a1, 0x01be, 0x01cf, 0x01da, 0x01e3, 0x01ef, 0x01f4, - 0x01fc, 0x0201, 0x0209, 0x0213, 0x021d, 0x0221, 0x022c, 0x0234, - 0x0243, 0x0249, 0x025e, 0x0267, 0x0273, 0x027b, 0x0285, 0x028d, - // Entry 40 - 7F - 0x02a3, 0x02ab, 0x02bb, 0x02c2, 0x02c9, 0x02cf, 0x02e0, 0x02e7, - 0x02ed, 0x02f6, 0x0303, 0x0303, 0x030a, 0x030e, 0x031e, 0x0328, - 0x0330, 0x0339, 0x033e, 0x0351, 0x0358, 0x0360, 0x036c, 0x0374, - 0x0379, 0x0382, 0x038b, 0x0391, 0x0397, 0x03a1, 0x03b3, 0x03be, - 0x03e9, 0x03f2, 0x03f6, 0x0403, 0x0409, 0x041f, 0x0438, 0x0440, - 0x0448, 0x044e, 0x0457, 0x046a, 0x0474, 0x047b, 0x0482, 0x048d, - 0x0492, 0x04b7, 0x04bb, 0x04bf, 0x04c6, 0x04cd, 0x04d3, 0x04da, - 0x04e3, 0x04e8, 0x04ed, 0x04f6, 0x04fe, 0x0506, 0x050d, 0x0521, - // Entry 80 - BF - 0x052c, 0x0536, 0x053d, 0x054c, 0x0556, 0x055a, 0x0561, 0x056c, - 0x0579, 0x0582, 0x0589, 0x0590, 0x0598, 0x05a1, 0x05a8, 0x05ae, - 0x05b5, 0x05bb, 0x05c4, 0x05ce, 0x05da, 0x05e4, 0x05f4, 0x05fe, - 0x0602, 0x0611, 0x061a, 0x062d, 0x0641, 0x064b, 0x0656, 0x0660, - 0x0665, 0x066e, 0x0676, 0x067c, 0x0682, 0x068b, 0x0695, 0x069d, - 0x06ad, 0x06b2, 0x06b9, 0x06c0, 0x06c9, 0x06d2, 0x06db, 0x06e0, - 0x06e5, 0x06e9, 0x06f6, 0x06fa, 0x0700, 0x0704, 0x0714, 0x0727, - 0x0731, 0x0739, 0x073e, 0x0756, 0x0766, 0x0771, 0x0785, 0x078d, - // Entry C0 - FF - 0x0792, 0x079a, 0x079f, 0x07ae, 0x07b6, 0x07bf, 0x07c6, 0x07cd, - 0x07d3, 0x07e1, 0x07f1, 0x07fb, 0x0801, 0x0807, 0x0810, 0x081b, - 0x0824, 0x083c, 0x0845, 0x0851, 0x085b, 0x0862, 0x086a, 0x0872, - 0x087d, 0x0892, 0x089d, 0x08a9, 0x08af, 0x08b8, 0x08c8, 0x08e0, - 0x08e6, 0x0916, 0x091a, 0x0922, 0x092e, 0x0935, 0x093f, 0x094b, - 0x0953, 0x0958, 0x095f, 0x0971, 0x0977, 0x097d, 0x0985, 0x098e, - 0x0995, 0x09c6, 0x09d6, 0x09e6, 0x09ed, 0x09f8, 0x0a04, 0x0a22, - 0x0a2b, 0x0a41, 0x0a5c, 0x0a63, 0x0a6a, 0x0a7a, 0x0a7f, 0x0a85, - // Entry 100 - 13F - 0x0a8a, 0x0a91, 0x0a9c, 0x0aa2, 0x0aaa, 0x0ab9, 0x0abf, 0x0ac5, - 0x0ad2, 0x0ade, 0x0ae6, 0x0af1, 0x0aff, 0x0b0a, 0x0b16, 0x0b25, - 0x0b35, 0x0b3c, 0x0b4e, 0x0b5e, 0x0b68, 0x0b72, 0x0b80, 0x0b8b, - 0x0b97, 0x0ba1, 0x0bb4, 0x0bbe, 0x0bc3, 0x0bd1, 0x0bdb, 0x0be1, - 0x0bec, 0x0bf8, 0x0c03, 0x0c12, -} // Size: 608 bytes - -const noRegionStr string = "" + // Size: 2814 bytes - "AscensionAndorraDe forente arabiske emiraterAfghanistanAntigua og Barbud" + - "aAnguillaAlbaniaArmeniaAngolaAntarktisArgentinaAmerikansk SamoaØsterrike" + - "AustraliaArubaÅlandAserbajdsjanBosnia-HercegovinaBarbadosBangladeshBelgi" + - "aBurkina FasoBulgariaBahrainBurundiBeninSaint-BarthélemyBermudaBruneiBol" + - "iviaKaribisk NederlandBrasilBahamasBhutanBouvetøyaBotswanaHviterusslandB" + - "elizeCanadaKokosøyeneKongo-KinshasaDen sentralafrikanske republikkKongo-" + - "BrazzavilleSveitsElfenbenskystenCookøyeneChileKamerunKinaColombiaClipper" + - "tonøyaCosta RicaCubaKapp VerdeCuraçaoChristmasøyaKyprosTsjekkiaTysklandD" + - "iego GarciaDjiboutiDanmarkDominicaDen dominikanske republikkAlgerieCeuta" + - " og MelillaEcuadorEstlandEgyptVest-SaharaEritreaSpaniaEtiopiaEUFinlandFi" + - "jiFalklandsøyeneMikronesiaføderasjonenFærøyeneFrankrikeGabonStorbritanni" + - "aGrenadaGeorgiaFransk GuyanaGuernseyGhanaGibraltarGrønlandGambiaGuineaGu" + - "adeloupeEkvatorial-GuineaHellasSør-Georgia og Sør-SandwichøyeneGuatemala" + - "GuamGuinea-BissauGuyanaHongkong S.A.R. KinaHeard- og McDonaldøyeneHondur" + - "asKroatiaHaitiUngarnKanariøyeneIndonesiaIrlandIsraelManIndiaDet britiske" + - " territoriet i IndiahavetIrakIranIslandItaliaJerseyJamaicaJordanJapanKen" + - "yaKirgisistanKambodsjaKiribatiKomoreneSaint Kitts og NevisNord-KoreaSør-" + - "KoreaKuwaitCaymanøyeneKasakhstanLaosLibanonSt. LuciaLiechtensteinSri Lan" + - "kaLiberiaLesothoLitauenLuxemburgLatviaLibyaMarokkoMonacoMoldovaMontenegr" + - "oSaint-MartinMadagaskarMarshalløyeneMakedoniaMaliMyanmar (Burma)Mongolia" + - "Macao S.A.R. KinaNord-MarianeneMartiniqueMauritaniaMontserratMaltaMaurit" + - "iusMaldiveneMalawiMexicoMalaysiaMosambikNamibiaNy-CaledoniaNigerNorfolkø" + - "yaNigeriaNicaraguaNederlandNorgeNepalNauruNiueNew ZealandOmanPanamaPeruF" + - "ransk PolynesiaPapua Ny-GuineaFilippinenePakistanPolenSt. Pierre og Miqu" + - "elonPitcairnPuerto RicoDet palestinske områdetPortugalPalauParaguayQatar" + - "Ytre OseaniaRéunionRomaniaSerbiaRusslandRwandaSaudi-ArabiaSalomonøyeneSe" + - "ychelleneSudanSverigeSingaporeSt. HelenaSloveniaSvalbard og Jan MayenSlo" + - "vakiaSierra LeoneSan MarinoSenegalSomaliaSurinamSør-SudanSão Tomé og Prí" + - "ncipeEl SalvadorSint MaartenSyriaSwazilandTristan da CunhaTurks- og Caic" + - "osøyeneTsjadDe franske sørterritorierTogoThailandTadsjikistanTokelauØst-" + - "TimorTurkmenistanTunisiaTongaTyrkiaTrinidad og TobagoTuvaluTaiwanTanzani" + - "aUkrainaUgandaUSAs ytre øyerFNUSAUruguayUsbekistanVatikanstatenSt. Vince" + - "nt og GrenadineneVenezuelaDe britiske jomfruøyeneDe amerikanske jomfruøy" + - "eneVietnamVanuatuWallis og FutunaSamoaKosovoJemenMayotteSør-AfrikaZambia" + - "Zimbabweukjent områdeverdenAfrikaNord-AmerikaSør-AmerikaOseaniaVest-Afri" + - "kaMellom-AmerikaØst-AfrikaNord-AfrikaSentral-AfrikaSørlige AfrikaAmerika" + - "Nordlige AmerikaKaribiaØst-AsiaSør-AsiaSørøst-AsiaSør-EuropaAustralasiaM" + - "elanesiaMikronesiaPolynesiaAsiaSentral-AsiaVest-AsiaEuropaØst-EuropaNord" + - "-EuropaVest-EuropaLatin-Amerika" - -var noRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002c, 0x0037, 0x0049, 0x0051, 0x0058, - 0x005f, 0x0065, 0x006e, 0x0077, 0x0087, 0x0091, 0x009a, 0x009f, - 0x00a5, 0x00b1, 0x00c3, 0x00cb, 0x00d5, 0x00db, 0x00e7, 0x00ef, - 0x00f6, 0x00fd, 0x0102, 0x0113, 0x011a, 0x0120, 0x0127, 0x0139, - 0x013f, 0x0146, 0x014c, 0x0156, 0x015e, 0x016b, 0x0171, 0x0177, - 0x0182, 0x0190, 0x01af, 0x01c0, 0x01c6, 0x01d5, 0x01df, 0x01e4, - 0x01eb, 0x01ef, 0x01f7, 0x0205, 0x020f, 0x0213, 0x021d, 0x0225, - 0x0232, 0x0238, 0x0240, 0x0248, 0x0254, 0x025c, 0x0263, 0x026b, - // Entry 40 - 7F - 0x0285, 0x028c, 0x029c, 0x02a3, 0x02aa, 0x02af, 0x02ba, 0x02c1, - 0x02c7, 0x02ce, 0x02d0, 0x02d0, 0x02d7, 0x02db, 0x02ea, 0x0301, - 0x030b, 0x0314, 0x0319, 0x0326, 0x032d, 0x0334, 0x0341, 0x0349, - 0x034e, 0x0357, 0x0360, 0x0366, 0x036c, 0x0376, 0x0387, 0x038d, - 0x03b0, 0x03b9, 0x03bd, 0x03ca, 0x03d0, 0x03e4, 0x03fc, 0x0404, - 0x040b, 0x0410, 0x0416, 0x0422, 0x042b, 0x0431, 0x0437, 0x043a, - 0x043f, 0x0464, 0x0468, 0x046c, 0x0472, 0x0478, 0x047e, 0x0485, - 0x048b, 0x0490, 0x0495, 0x04a0, 0x04a9, 0x04b1, 0x04b9, 0x04cd, - // Entry 80 - BF - 0x04d7, 0x04e1, 0x04e7, 0x04f3, 0x04fd, 0x0501, 0x0508, 0x0511, - 0x051e, 0x0527, 0x052e, 0x0535, 0x053c, 0x0545, 0x054b, 0x0550, - 0x0557, 0x055d, 0x0564, 0x056e, 0x057a, 0x0584, 0x0592, 0x059b, - 0x059f, 0x05ae, 0x05b6, 0x05c7, 0x05d5, 0x05df, 0x05e9, 0x05f3, - 0x05f8, 0x0601, 0x060a, 0x0610, 0x0616, 0x061e, 0x0626, 0x062d, - 0x0639, 0x063e, 0x0649, 0x0650, 0x0659, 0x0662, 0x0667, 0x066c, - 0x0671, 0x0675, 0x0680, 0x0684, 0x068a, 0x068e, 0x069e, 0x06ad, - 0x06b8, 0x06c0, 0x06c5, 0x06db, 0x06e3, 0x06ee, 0x0706, 0x070e, - // Entry C0 - FF - 0x0713, 0x071b, 0x0720, 0x072c, 0x0734, 0x073b, 0x0741, 0x0749, - 0x074f, 0x075b, 0x0768, 0x0773, 0x0778, 0x077f, 0x0788, 0x0792, - 0x079a, 0x07af, 0x07b7, 0x07c3, 0x07cd, 0x07d4, 0x07db, 0x07e2, - 0x07ec, 0x0803, 0x080e, 0x081a, 0x081f, 0x0828, 0x0838, 0x084e, - 0x0853, 0x086d, 0x0871, 0x0879, 0x0885, 0x088c, 0x0896, 0x08a2, - 0x08a9, 0x08ae, 0x08b4, 0x08c6, 0x08cc, 0x08d2, 0x08da, 0x08e1, - 0x08e7, 0x08f6, 0x08f8, 0x08fb, 0x0902, 0x090c, 0x0919, 0x0933, - 0x093c, 0x0954, 0x096f, 0x0976, 0x097d, 0x098d, 0x0992, 0x0998, - // Entry 100 - 13F - 0x099d, 0x09a4, 0x09af, 0x09b5, 0x09bd, 0x09cb, 0x09d1, 0x09d7, - 0x09e3, 0x09ef, 0x09f6, 0x0a01, 0x0a0f, 0x0a1a, 0x0a25, 0x0a33, - 0x0a42, 0x0a49, 0x0a59, 0x0a60, 0x0a69, 0x0a72, 0x0a7f, 0x0a8a, - 0x0a95, 0x0a9e, 0x0aa8, 0x0ab1, 0x0ab5, 0x0ac1, 0x0aca, 0x0ad0, - 0x0adb, 0x0ae6, 0x0af1, 0x0afe, -} // Size: 608 bytes - -const paRegionStr string = "" + // Size: 7700 bytes - "ਅਸੈਂਸ਼ਨ ਟਾਪੂਅੰਡੋਰਾਸੰਯੁਕਤ ਅਰਬ ਅਮੀਰਾਤਅਫ਼ਗਾਨਿਸਤਾਨਐਂਟੀਗੁਆ ਅਤੇ ਬਾਰਬੁਡਾਅੰਗੁਇਲਾ" + - "ਅਲਬਾਨੀਆਅਰਮੀਨੀਆਅੰਗੋਲਾਅੰਟਾਰਕਟਿਕਾਅਰਜਨਟੀਨਾਅਮੈਰੀਕਨ ਸਮੋਆਆਸਟਰੀਆਆਸਟ੍ਰੇਲੀਆਅਰੂਬਾ" + - "ਅਲੈਂਡ ਟਾਪੂਅਜ਼ਰਬਾਈਜਾਨਬੋਸਨੀਆ ਅਤੇ ਹਰਜ਼ੇਗੋਵੀਨਾਬਾਰਬਾਡੋਸਬੰਗਲਾਦੇਸ਼ਬੈਲਜੀਅਮਬੁਰਕ" + - "ੀਨਾ ਫ਼ਾਸੋਬੁਲਗਾਰੀਆਬਹਿਰੀਨਬੁਰੁੰਡੀਬੇਨਿਨਸੇਂਟ ਬਾਰਥੇਲੇਮੀਬਰਮੂਡਾਬਰੂਨੇਈਬੋਲੀਵੀਆਕੈ" + - "ਰੇਬੀਆਈ ਨੀਦਰਲੈਂਡਬ੍ਰਾਜ਼ੀਲਬਹਾਮਾਸਭੂਟਾਨਬੌਵੇਟ ਟਾਪੂਬੋਤਸਵਾਨਾਬੇਲਾਰੂਸਬੇਲੀਜ਼ਕੈਨੇਡ" + - "ਾਕੋਕੋਸ (ਕੀਲਿੰਗ) ਟਾਪੂਕਾਂਗੋ - ਕਿੰਸ਼ਾਸਾਕੇਂਦਰੀ ਅਫ਼ਰੀਕੀ ਗਣਰਾਜਕਾਂਗੋ - ਬ੍ਰਾਜ਼" + - "ਾਵਿਲੇਸਵਿਟਜ਼ਰਲੈਂਡਕੋਟ ਡੀਵੋਆਰਕੁੱਕ ਟਾਪੂਚਿਲੀਕੈਮਰੂਨਚੀਨਕੋਲੰਬੀਆਕਲਿੱਪਰਟਨ ਟਾਪੂਕੋ" + - "ਸਟਾ ਰੀਕਾਕਿਊਬਾਕੇਪ ਵਰਡੇਕੁਰਾਕਾਓਕ੍ਰਿਸਮਿਸ ਟਾਪੂਸਾਇਪ੍ਰਸਚੈਕੀਆਜਰਮਨੀਡੀਇਗੋ ਗਾਰਸੀਆ" + - "ਜ਼ੀਬੂਤੀਡੈਨਮਾਰਕਡੋਮੀਨਿਕਾਡੋਮੀਨਿਕਾਈ ਗਣਰਾਜਅਲਜੀਰੀਆਸਿਓਟਾ ਅਤੇ ਮੇਲਿੱਲਾਇਕਵੇਡੋਰਇਸ" + - "ਟੋਨੀਆਮਿਸਰਪੱਛਮੀ ਸਹਾਰਾਇਰੀਟ੍ਰਿਆਸਪੇਨਇਥੋਪੀਆਯੂਰਪੀ ਸੰਘਫਿਨਲੈਂਡਫ਼ਿਜੀਫ਼ਾਕਲੈਂਡ ਟਾ" + - "ਪੂਮਾਇਕ੍ਰੋਨੇਸ਼ੀਆਫੈਰੋ ਟਾਪੂਫ਼ਰਾਂਸਗਬੋਨਯੂਨਾਈਟਡ ਕਿੰਗਡਮਗ੍ਰੇਨਾਡਾਜਾਰਜੀਆਫਰੈਂਚ ਗੁ" + - "ਇਆਨਾਗਰਨਜੀਘਾਨਾਜਿਬਰਾਲਟਰਗ੍ਰੀਨਲੈਂਡਗੈਂਬੀਆਗਿਨੀਗੁਆਡੇਲੋਪਭੂ-ਖੰਡੀ ਗਿਨੀਗ੍ਰੀਸਦੱਖਣੀ" + - " ਜਾਰਜੀਆ ਅਤੇ ਦੱਖਣੀ ਸੈਂਡਵਿਚ ਟਾਪੂਗੁਆਟੇਮਾਲਾਗੁਆਮਗਿਨੀ-ਬਿਸਾਉਗੁਯਾਨਾਹਾਂਗ ਕਾਂਗ ਐਸਏ" + - "ਆਰ ਚੀਨਹਰਡ ਤੇ ਮੈਕਡੋਨਾਲਡ ਟਾਪੂਹੋਂਡੁਰਸਕਰੋਏਸ਼ੀਆਹੈਤੀਹੰਗਰੀਕੇਨਾਰੀ ਟਾਪੂਇੰਡੋਨੇਸ਼" + - "ੀਆਆਇਰਲੈਂਡਇਜ਼ਰਾਈਲਆਇਲ ਆਫ ਮੈਨਭਾਰਤਬਰਤਾਨਵੀ ਹਿੰਦ ਮਹਾਂਸਾਗਰ ਖਿੱਤਾਇਰਾਕਈਰਾਨਆਈਸਲੈ" + - "ਂਡਇਟਲੀਜਰਸੀਜਮਾਇਕਾਜਾਰਡਨਜਪਾਨਕੀਨੀਆਕਿਰਗਿਜ਼ਸਤਾਨਕੰਬੋਡੀਆਕਿਰਬਾਤੀਕੋਮੋਰੋਸਸੇਂਟ ਕਿਟ" + - "ਸ ਐਂਡ ਨੇਵਿਸਉੱਤਰ ਕੋਰੀਆਦੱਖਣ ਕੋਰੀਆਕੁਵੈਤਕੇਮੈਨ ਟਾਪੂਕਜ਼ਾਖਸਤਾਨਲਾਓਸਲੈਬਨਾਨਸੇਂਟ " + - "ਲੂਸੀਆਲਿਚੇਂਸਟਾਇਨਸ੍ਰੀ ਲੰਕਾਲਾਈਬੀਰੀਆਲੇਸੋਥੋਲਿਥੁਆਨੀਆਲਕਜ਼ਮਬਰਗਲਾਤਵੀਆਲੀਬੀਆਮੋਰੱਕ" + - "ੋਮੋਨਾਕੋਮੋਲਡੋਵਾਮੋਂਟੇਨੇਗਰੋਸੇਂਟ ਮਾਰਟਿਨਮੈਡਾਗਾਸਕਰਮਾਰਸ਼ਲ ਟਾਪੂਮੈਕਡੋਨੀਆਮਾਲੀਮਿਆ" + - "ਂਮਾਰ (ਬਰਮਾ)ਮੰਗੋਲੀਆਮਕਾਉ ਐਸਏਆਰ ਚੀਨਉੱਤਰੀ ਮਾਰੀਆਨਾ ਟਾਪੂਮਾਰਟੀਨਿਕਮੋਰਿਟਾਨੀਆਮੋਂ" + - "ਟਸੇਰਾਤਮਾਲਟਾਮੌਰਿਸ਼ਸਮਾਲਦੀਵਮਲਾਵੀਮੈਕਸੀਕੋਮਲੇਸ਼ੀਆਮੋਜ਼ਾਮਬੀਕਨਾਮੀਬੀਆਨਿਊ ਕੈਲੇਡੋਨ" + - "ੀਆਨਾਈਜਰਨੋਰਫੌਕ ਟਾਪੂਨਾਈਜੀਰੀਆਨਿਕਾਰਾਗੁਆਨੀਦਰਲੈਂਡਨਾਰਵੇਨੇਪਾਲਨਾਉਰੂਨਿਯੂਨਿਊਜ਼ੀਲੈ" + - "ਂਡਓਮਾਨਪਨਾਮਾਪੇਰੂਫਰੈਂਚ ਪੋਲੀਨੇਸ਼ੀਆਪਾਪੂਆ ਨਿਊ ਗਿਨੀਫਿਲੀਪੀਨਜਪਾਕਿਸਤਾਨਪੋਲੈਂਡਸੇਂ" + - "ਟ ਪੀਅਰੇ ਐਂਡ ਮਿਕੇਲਨਪਿਟਕੇਰਨ ਟਾਪੂਪਿਊਰਟੋ ਰਿਕੋਫਿਲੀਸਤੀਨੀ ਇਲਾਕਾਪੁਰਤਗਾਲਪਲਾਉਪੈਰ" + - "ਾਗਵੇਕਤਰਆਊਟਲਾਇੰਗ ਓਸ਼ੀਨੀਆਰਿਯੂਨੀਅਨਰੋਮਾਨੀਆਸਰਬੀਆਰੂਸਰਵਾਂਡਾਸਾਊਦੀ ਅਰਬਸੋਲੋਮਨ ਟਾ" + - "ਪੂਸੇਸ਼ਲਸਸੂਡਾਨਸਵੀਡਨਸਿੰਗਾਪੁਰਸੇਂਟ ਹੇਲੇਨਾਸਲੋਵੇਨੀਆਸਵਾਲਬਰਡ ਅਤੇ ਜਾਨ ਮਾਯੇਨਸਲੋਵ" + - "ਾਕੀਆਸਿਏਰਾ ਲਿਓਨਸੈਨ ਮਰੀਨੋਸੇਨੇਗਲਸੋਮਾਲੀਆਸੂਰੀਨਾਮਦੱਖਣ ਸੁਡਾਨਸਾਓ ਟੋਮ ਅਤੇ ਪ੍ਰਿੰ" + - "ਸੀਪੇਅਲ ਸਲਵਾਡੋਰਸਿੰਟ ਮਾਰਟੀਨਸੀਰੀਆਸਵਾਜ਼ੀਲੈਂਡਟ੍ਰਿਸਟਾਨ ਦਾ ਕੁੰਹਾਟੁਰਕਸ ਅਤੇ ਕੈਕ" + - "ੋਸ ਟਾਪੂਚਾਡਫਰੈਂਚ ਦੱਖਣੀ ਪ੍ਰਦੇਸ਼ਟੋਗੋਥਾਈਲੈਂਡਤਾਜਿਕਿਸਤਾਨਟੋਕੇਲਾਉਤਿਮੋਰ-ਲੇਸਤੇਤੁ" + - "ਰਕਮੇਨਿਸਤਾਨਟਿਊਨੀਸ਼ੀਆਟੌਂਗਾਤੁਰਕੀਟ੍ਰਿਨੀਡਾਡ ਅਤੇ ਟੋਬਾਗੋਟੁਵਾਲੂਤਾਇਵਾਨਤਨਜ਼ਾਨੀਆਯ" + - "ੂਕਰੇਨਯੂਗਾਂਡਾਯੂ.ਐੱਸ. ਦੂਰ-ਦੁਰਾਡੇ ਟਾਪੂਸੰਯੁਕਤ ਰਾਸ਼ਟਰਸੰਯੁਕਤ ਰਾਜਉਰੂਗਵੇਉਜ਼ਬੇਕ" + - "ਿਸਤਾਨਵੈਟੀਕਨ ਸਿਟੀਸੇਂਟ ਵਿਨਸੈਂਟ ਐਂਡ ਗ੍ਰੇਨਾਡੀਨਸਵੇਨੇਜ਼ੂਏਲਾਬ੍ਰਿਟਿਸ਼ ਵਰਜਿਨ ਟਾ" + - "ਪੂਯੂ ਐੱਸ ਵਰਜਿਨ ਟਾਪੂਵੀਅਤਨਾਮਵਾਨੂਆਟੂਵਾਲਿਸ ਅਤੇ ਫੂਟੂਨਾਸਾਮੋਆਕੋਸੋਵੋਯਮਨਮਾਯੋਟੀਦ" + - "ੱਖਣ ਅਫਰੀਕਾਜ਼ਾਮਬੀਆਜ਼ਿੰਬਾਬਵੇਅਣਪਛਾਤਾ ਇਲਾਕਾਸੰਸਾਰਅਫ਼ਰੀਕਾਉੱਤਰ ਅਮਰੀਕਾਦੱਖਣ ਅਮਰ" + - "ੀਕਾਓਸ਼ੇਨੀਆਪੱਛਮੀ ਅਫ਼ਰੀਕਾਕੇਂਦਰੀ ਅਮਰੀਕਾਪੂਰਬੀ ਅਫ਼ਰੀਕਾਉੱਤਰੀ ਅਫ਼ਰੀਕਾਮੱਧ ਅਫ਼ਰ" + - "ੀਕਾਦੱਖਣੀ ਅਫ਼ਰੀਕਾਅਮਰੀਕਾਉੱਤਰੀ ਅਮਰੀਕਾਕੈਰੇਬੀਆਈਪੂਰਬੀ ਏਸ਼ੀਆਦੱਖਣੀ ਏਸ਼ੀਆਦੱਖਣ-ਪ" + - "ੂਰਬੀ ਏਸ਼ੀਆਦੱਖਣੀ ਯੂਰਪਆਸਟਰੇਲੇਸ਼ੀਆਮੇਲਾਨੇਸ਼ੀਆਮਾਇਕ੍ਰੋਨੇਸ਼ੀਆਈ ਇਲਾਕਾਪੋਲੀਨੇਸ਼ੀ" + - "ਆਏਸ਼ੀਆਕੇਂਦਰੀ ਏਸ਼ੀਆਪੱਛਮੀ ਏਸ਼ੀਆਯੂਰਪਪੂਰਬੀ ਯੂਰਪਉੱਤਰੀ ਯੂਰਪਪੱਛਮੀ ਯੂਰਪਲਾਤੀਨੀ " + - "ਅਮਰੀਕਾ" - -var paRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0022, 0x0034, 0x0063, 0x0084, 0x00b9, 0x00ce, 0x00e3, - 0x00f8, 0x010a, 0x0128, 0x0140, 0x0162, 0x0174, 0x018f, 0x019e, - 0x01ba, 0x01d8, 0x0216, 0x022e, 0x0249, 0x025e, 0x0283, 0x029b, - 0x02ad, 0x02c2, 0x02d1, 0x02f9, 0x030b, 0x031d, 0x0332, 0x0363, - 0x037b, 0x038d, 0x039c, 0x03b8, 0x03d0, 0x03e5, 0x03f7, 0x0409, - 0x043a, 0x0464, 0x049c, 0x04cf, 0x04f0, 0x050c, 0x0525, 0x0531, - 0x0543, 0x054c, 0x0561, 0x0586, 0x05a2, 0x05b1, 0x05c7, 0x05dc, - 0x0601, 0x0616, 0x0625, 0x0634, 0x0656, 0x066b, 0x0680, 0x0698, - // Entry 40 - 7F - 0x06c3, 0x06d8, 0x0707, 0x071c, 0x0731, 0x073d, 0x075c, 0x0774, - 0x0780, 0x0792, 0x07ab, 0x07ab, 0x07c0, 0x07cf, 0x07f4, 0x081b, - 0x0834, 0x0846, 0x0852, 0x087a, 0x0892, 0x08a4, 0x08c6, 0x08d5, - 0x08e1, 0x08f9, 0x0914, 0x0926, 0x0932, 0x094a, 0x096a, 0x0979, - 0x09d8, 0x09f3, 0x09ff, 0x0a1b, 0x0a2d, 0x0a60, 0x0a99, 0x0aae, - 0x0ac6, 0x0ad2, 0x0ae1, 0x0b00, 0x0b1e, 0x0b33, 0x0b48, 0x0b62, - 0x0b6e, 0x0bb9, 0x0bc5, 0x0bd1, 0x0be6, 0x0bf2, 0x0bfe, 0x0c10, - 0x0c1f, 0x0c2b, 0x0c3a, 0x0c5b, 0x0c70, 0x0c85, 0x0c9a, 0x0ccd, - // Entry 80 - BF - 0x0ce9, 0x0d05, 0x0d14, 0x0d30, 0x0d4b, 0x0d57, 0x0d69, 0x0d85, - 0x0da3, 0x0dbc, 0x0dd4, 0x0de6, 0x0dfe, 0x0e16, 0x0e28, 0x0e37, - 0x0e49, 0x0e5b, 0x0e70, 0x0e8e, 0x0ead, 0x0ec8, 0x0ee7, 0x0eff, - 0x0f0b, 0x0f2f, 0x0f44, 0x0f6a, 0x0f9c, 0x0fb4, 0x0fcf, 0x0fea, - 0x0ff9, 0x100e, 0x1020, 0x102f, 0x1044, 0x1059, 0x1074, 0x1089, - 0x10ae, 0x10bd, 0x10dc, 0x10f4, 0x110f, 0x1127, 0x1136, 0x1145, - 0x1154, 0x1160, 0x117e, 0x118a, 0x1199, 0x11a5, 0x11d3, 0x11f9, - 0x1211, 0x1229, 0x123b, 0x1274, 0x1296, 0x12b5, 0x12e0, 0x12f5, - // Entry C0 - FF - 0x1301, 0x1316, 0x131f, 0x134d, 0x1365, 0x137a, 0x1389, 0x1392, - 0x13a4, 0x13bd, 0x13dc, 0x13ee, 0x13fd, 0x140c, 0x1424, 0x1443, - 0x145b, 0x1494, 0x14ac, 0x14c8, 0x14e1, 0x14f3, 0x1508, 0x151d, - 0x1539, 0x1572, 0x158e, 0x15ad, 0x15bc, 0x15da, 0x1609, 0x163f, - 0x1648, 0x167d, 0x1689, 0x169e, 0x16bc, 0x16d1, 0x16f0, 0x1714, - 0x172f, 0x173e, 0x174d, 0x1785, 0x1797, 0x17a9, 0x17c1, 0x17d3, - 0x17e8, 0x1823, 0x1848, 0x1864, 0x1876, 0x1897, 0x18b6, 0x1901, - 0x191f, 0x1954, 0x1981, 0x1996, 0x19ab, 0x19d7, 0x19e6, 0x19f8, - // Entry 100 - 13F - 0x1a01, 0x1a13, 0x1a32, 0x1a47, 0x1a62, 0x1a87, 0x1a96, 0x1aab, - 0x1aca, 0x1ae9, 0x1afe, 0x1b23, 0x1b48, 0x1b6d, 0x1b92, 0x1bb1, - 0x1bd6, 0x1be8, 0x1c0a, 0x1c22, 0x1c41, 0x1c60, 0x1c8c, 0x1ca8, - 0x1cc9, 0x1ce7, 0x1d21, 0x1d3f, 0x1d4e, 0x1d70, 0x1d8f, 0x1d9b, - 0x1db7, 0x1dd3, 0x1def, 0x1e14, -} // Size: 608 bytes - -const plRegionStr string = "" + // Size: 3165 bytes - "Wyspa WniebowstąpieniaAndoraZjednoczone Emiraty ArabskieAfganistanAntigu" + - "a i BarbudaAnguillaAlbaniaArmeniaAngolaAntarktykaArgentynaSamoa Amerykań" + - "skieAustriaAustraliaArubaWyspy AlandzkieAzerbejdżanBośnia i HercegowinaB" + - "arbadosBangladeszBelgiaBurkina FasoBułgariaBahrajnBurundiBeninSaint-Bart" + - "hélemyBermudyBruneiBoliwiaNiderlandy KaraibskieBrazyliaBahamyBhutanWyspa" + - " BouvetaBotswanaBiałoruśBelizeKanadaWyspy KokosoweDemokratyczna Republik" + - "a KongaRepublika ŚrodkowoafrykańskaKongoSzwajcariaCôte d’IvoireWyspy Coo" + - "kaChileKamerunChinyKolumbiaClippertonKostarykaKubaRepublika Zielonego Pr" + - "zylądkaCuraçaoWyspa Bożego NarodzeniaCyprCzechyNiemcyDiego GarciaDżibuti" + - "DaniaDominikaDominikanaAlgieriaCeuta i MelillaEkwadorEstoniaEgiptSahara " + - "ZachodniaErytreaHiszpaniaEtiopiaUnia EuropejskaFinlandiaFidżiFalklandyMi" + - "kronezjaWyspy OwczeFrancjaGabonWielka BrytaniaGrenadaGruzjaGujana Francu" + - "skaGuernseyGhanaGibraltarGrenlandiaGambiaGwineaGwadelupaGwinea Równikowa" + - "GrecjaGeorgia Południowa i Sandwich PołudniowyGwatemalaGuamGwinea Bissau" + - "GujanaSRA Hongkong (Chiny)Wyspy Heard i McDonaldaHondurasChorwacjaHaitiW" + - "ęgryWyspy KanaryjskieIndonezjaIrlandiaIzraelWyspa ManIndieBrytyjskie Te" + - "rytorium Oceanu IndyjskiegoIrakIranIslandiaWłochyJerseyJamajkaJordaniaJa" + - "poniaKeniaKirgistanKambodżaKiribatiKomorySaint Kitts i NevisKorea Północ" + - "naKorea PołudniowaKuwejtKajmanyKazachstanLaosLibanSaint LuciaLiechtenste" + - "inSri LankaLiberiaLesothoLitwaLuksemburgŁotwaLibiaMarokoMonakoMołdawiaCz" + - "arnogóraSaint-MartinMadagaskarWyspy MarshallaMacedoniaMaliMjanma (Birma)" + - "MongoliaSRA Makau (Chiny)Mariany PółnocneMartynikaMauretaniaMontserratMa" + - "ltaMauritiusMalediwyMalawiMeksykMalezjaMozambikNamibiaNowa KaledoniaNige" + - "rNorfolkNigeriaNikaraguaHolandiaNorwegiaNepalNauruNiueNowa ZelandiaOmanP" + - "anamaPeruPolinezja FrancuskaPapua-Nowa GwineaFilipinyPakistanPolskaSaint" + - "-Pierre i MiquelonPitcairnPortorykoTerytoria PalestyńskiePortugaliaPalau" + - "ParagwajKatarOceania inneReunionRumuniaSerbiaRosjaRwandaArabia Saudyjska" + - "Wyspy SalomonaSeszeleSudanSzwecjaSingapurWyspa Świętej HelenySłoweniaSva" + - "lbard i Jan MayenSłowacjaSierra LeoneSan MarinoSenegalSomaliaSurinamSuda" + - "n PołudniowyWyspy Świętego Tomasza i KsiążęcaSalwadorSint MaartenSyriaSu" + - "aziTristan da CunhaTurks i CaicosCzadFrancuskie Terytoria Południowe i A" + - "ntarktyczneTogoTajlandiaTadżykistanTokelauTimor WschodniTurkmenistanTune" + - "zjaTongaTurcjaTrynidad i TobagoTuvaluTajwanTanzaniaUkrainaUgandaDalekie " + - "Wyspy Mniejsze Stanów ZjednoczonychOrganizacja Narodów ZjednoczonychStan" + - "y ZjednoczoneUrugwajUzbekistanWatykanSaint Vincent i GrenadynyWenezuelaB" + - "rytyjskie Wyspy DziewiczeWyspy Dziewicze Stanów ZjednoczonychWietnamVanu" + - "atuWallis i FutunaSamoaKosowoJemenMajottaRepublika Południowej AfrykiZam" + - "biaZimbabweNieznany regionświatAfrykaAmeryka PółnocnaAmeryka PołudniowaO" + - "ceaniaAfryka ZachodniaAmeryka ŚrodkowaAfryka WschodniaAfryka PółnocnaAfr" + - "yka ŚrodkowaAfryka PołudniowaAmerykaAmeryka Północna (USA, Kanada)Karaib" + - "yAzja WschodniaAzja PołudniowaAzja Południowo-WschodniaEuropa Południowa" + - "AustralazjaMelanezjaRegion MikronezjiPolinezjaAzjaAzja ŚrodkowaAzja Zach" + - "odniaEuropaEuropa WschodniaEuropa PółnocnaEuropa ZachodniaAmeryka Łacińs" + - "ka" - -var plRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0017, 0x001d, 0x0039, 0x0043, 0x0054, 0x005c, 0x0063, - 0x006a, 0x0070, 0x007a, 0x0083, 0x0096, 0x009d, 0x00a6, 0x00ab, - 0x00ba, 0x00c6, 0x00db, 0x00e3, 0x00ed, 0x00f3, 0x00ff, 0x0108, - 0x010f, 0x0116, 0x011b, 0x012c, 0x0133, 0x0139, 0x0140, 0x0155, - 0x015d, 0x0163, 0x0169, 0x0176, 0x017e, 0x0188, 0x018e, 0x0194, - 0x01a2, 0x01bf, 0x01dd, 0x01e2, 0x01ec, 0x01fc, 0x0207, 0x020c, - 0x0213, 0x0218, 0x0220, 0x022a, 0x0233, 0x0237, 0x0255, 0x025d, - 0x0275, 0x0279, 0x027f, 0x0285, 0x0291, 0x0299, 0x029e, 0x02a6, - // Entry 40 - 7F - 0x02b0, 0x02b8, 0x02c7, 0x02ce, 0x02d5, 0x02da, 0x02ea, 0x02f1, - 0x02fa, 0x0301, 0x0310, 0x0310, 0x0319, 0x031f, 0x0328, 0x0332, - 0x033d, 0x0344, 0x0349, 0x0358, 0x035f, 0x0365, 0x0375, 0x037d, - 0x0382, 0x038b, 0x0395, 0x039b, 0x03a1, 0x03aa, 0x03bb, 0x03c1, - 0x03eb, 0x03f4, 0x03f8, 0x0405, 0x040b, 0x041f, 0x0436, 0x043e, - 0x0447, 0x044c, 0x0452, 0x0463, 0x046c, 0x0474, 0x047a, 0x0483, - 0x0488, 0x04b0, 0x04b4, 0x04b8, 0x04c0, 0x04c7, 0x04cd, 0x04d4, - 0x04dc, 0x04e3, 0x04e8, 0x04f1, 0x04fa, 0x0502, 0x0508, 0x051b, - // Entry 80 - BF - 0x052b, 0x053c, 0x0542, 0x0549, 0x0553, 0x0557, 0x055c, 0x0567, - 0x0574, 0x057d, 0x0584, 0x058b, 0x0590, 0x059a, 0x05a0, 0x05a5, - 0x05ab, 0x05b1, 0x05ba, 0x05c5, 0x05d1, 0x05db, 0x05ea, 0x05f3, - 0x05f7, 0x0605, 0x060d, 0x061e, 0x0630, 0x0639, 0x0643, 0x064d, - 0x0652, 0x065b, 0x0663, 0x0669, 0x066f, 0x0676, 0x067e, 0x0685, - 0x0693, 0x0698, 0x069f, 0x06a6, 0x06af, 0x06b7, 0x06bf, 0x06c4, - 0x06c9, 0x06cd, 0x06da, 0x06de, 0x06e4, 0x06e8, 0x06fb, 0x070c, - 0x0714, 0x071c, 0x0722, 0x0739, 0x0741, 0x074a, 0x0761, 0x076b, - // Entry C0 - FF - 0x0770, 0x0778, 0x077d, 0x0789, 0x0790, 0x0797, 0x079d, 0x07a2, - 0x07a8, 0x07b8, 0x07c6, 0x07cd, 0x07d2, 0x07d9, 0x07e1, 0x07f7, - 0x0800, 0x0814, 0x081d, 0x0829, 0x0833, 0x083a, 0x0841, 0x0848, - 0x0859, 0x087f, 0x0887, 0x0893, 0x0898, 0x089d, 0x08ad, 0x08bb, - 0x08bf, 0x08ee, 0x08f2, 0x08fb, 0x0907, 0x090e, 0x091c, 0x0928, - 0x092f, 0x0934, 0x093a, 0x094b, 0x0951, 0x0957, 0x095f, 0x0966, - 0x096c, 0x0998, 0x09ba, 0x09cb, 0x09d2, 0x09dc, 0x09e3, 0x09fc, - 0x0a05, 0x0a1f, 0x0a44, 0x0a4b, 0x0a52, 0x0a61, 0x0a66, 0x0a6c, - // Entry 100 - 13F - 0x0a71, 0x0a78, 0x0a95, 0x0a9b, 0x0aa3, 0x0ab2, 0x0ab8, 0x0abe, - 0x0ad0, 0x0ae3, 0x0aea, 0x0afa, 0x0b0b, 0x0b1b, 0x0b2c, 0x0b3c, - 0x0b4e, 0x0b55, 0x0b75, 0x0b7c, 0x0b8a, 0x0b9a, 0x0bb4, 0x0bc6, - 0x0bd1, 0x0bda, 0x0beb, 0x0bf4, 0x0bf8, 0x0c06, 0x0c14, 0x0c1a, - 0x0c2a, 0x0c3b, 0x0c4b, 0x0c5d, -} // Size: 608 bytes - -const ptRegionStr string = "" + // Size: 3174 bytes - "Ilha de AscensãoAndorraEmirados Árabes UnidosAfeganistãoAntígua e Barbud" + - "aAnguillaAlbâniaArmêniaAngolaAntártidaArgentinaSamoa AmericanaÁustriaAus" + - "tráliaArubaIlhas ÅlandAzerbaijãoBósnia e HerzegovinaBarbadosBangladeshBé" + - "lgicaBurquina FasoBulgáriaBahreinBurundiBeninSão BartolomeuBermudasBrune" + - "iBolíviaPaíses Baixos CaribenhosBrasilBahamasButãoIlha BouvetBotsuanaBie" + - "lorrússiaBelizeCanadáIlhas Cocos (Keeling)Congo - KinshasaRepública Cent" + - "ro-AfricanaCongo - BrazzavilleSuíçaCosta do MarfimIlhas CookChileRepúbli" + - "ca dos CamarõesChinaColômbiaIlha de ClippertonCosta RicaCubaCabo VerdeCu" + - "raçaoIlha ChristmasChipreTchéquiaAlemanhaDiego GarciaDjibutiDinamarcaDom" + - "inicaRepública DominicanaArgéliaCeuta e MelilhaEquadorEstôniaEgitoSaara " + - "OcidentalEritreiaEspanhaEtiópiaUnião EuropeiaFinlândiaFijiIlhas Malvinas" + - "MicronésiaIlhas FaroeFrançaGabãoReino UnidoGranadaGeórgiaGuiana Francesa" + - "GuernseyGanaGibraltarGroenlândiaGâmbiaGuinéGuadalupeGuiné EquatorialGréc" + - "iaIlhas Geórgia do Sul e Sandwich do SulGuatemalaGuamGuiné-BissauGuianaH" + - "ong Kong, RAE da ChinaIlhas Heard e McDonaldHondurasCroáciaHaitiHungriaI" + - "lhas CanáriasIndonésiaIrlandaIsraelIlha de ManÍndiaTerritório Britânico " + - "do Oceano ÍndicoIraqueIrãIslândiaItáliaJerseyJamaicaJordâniaJapãoQuêniaQ" + - "uirguistãoCambojaQuiribatiComoresSão Cristóvão e NevisCoreia do NorteCor" + - "eia do SulKuwaitIlhas CaymanCazaquistãoLaosLíbanoSanta LúciaLiechtenstei" + - "nSri LankaLibériaLesotoLituâniaLuxemburgoLetôniaLíbiaMarrocosMônacoMoldá" + - "viaMontenegroSão MartinhoMadagascarIlhas MarshallMacedôniaMaliMianmar (B" + - "irmânia)MongóliaMacau, RAE da ChinaIlhas Marianas do NorteMartinicaMauri" + - "tâniaMontserratMaltaMaurícioMaldivasMalawiMéxicoMalásiaMoçambiqueNamíbia" + - "Nova CaledôniaNígerIlha NorfolkNigériaNicaráguaHolandaNoruegaNepalNauruN" + - "iueNova ZelândiaOmãPanamáPeruPolinésia FrancesaPapua-Nova GuinéFilipinas" + - "PaquistãoPolôniaSaint Pierre e MiquelonIlhas PitcairnPorto RicoTerritóri" + - "os palestinosPortugalPalauParaguaiCatarOceania RemotaReuniãoRomêniaSérvi" + - "aRússiaRuandaArábia SauditaIlhas SalomãoSeichelesSudãoSuéciaCingapuraSan" + - "ta HelenaEslovêniaSvalbard e Jan MayenEslováquiaSerra LeoaSan MarinoSene" + - "galSomáliaSurinameSudão do SulSão Tomé e PríncipeEl SalvadorSint Maarten" + - "SíriaSuazilândiaTristão da CunhaIlhas Turks e CaicosChadeTerritórios Fra" + - "nceses do SulTogoTailândiaTajiquistãoTokelauTimor-LesteTurcomenistãoTuní" + - "siaTongaTurquiaTrinidad e TobagoTuvaluTaiwanTanzâniaUcrâniaUgandaIlhas M" + - "enores Distantes dos EUANações UnidasEstados UnidosUruguaiUzbequistãoCid" + - "ade do VaticanoSão Vicente e GranadinasVenezuelaIlhas Virgens Britânicas" + - "Ilhas Virgens dos EUAVietnãVanuatuWallis e FutunaSamoaKosovoIêmenMayotte" + - "África do SulZâmbiaZimbábueRegião desconhecidaMundoÁfricaAmérica do Nor" + - "teAmérica do SulOceaniaÁfrica OcidentalAmérica CentralÁfrica OrientalÁfr" + - "ica do NorteÁfrica CentralÁfrica MeridionalAméricasAmérica SetentrionalC" + - "aribeÁsia OrientalÁsia MeridionalSudeste AsiáticoEuropa MeridionalAustra" + - "lásiaMelanésiaRegião da MicronésiaPolinésiaÁsiaÁsia CentralÁsia Ocidenta" + - "lEuropaEuropa OrientalEuropa SetentrionalEuropa OcidentalAmérica Latina" - -var ptRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0011, 0x0018, 0x002f, 0x003b, 0x004d, 0x0055, 0x005d, - 0x0065, 0x006b, 0x0075, 0x007e, 0x008d, 0x0095, 0x009f, 0x00a4, - 0x00b0, 0x00bb, 0x00d0, 0x00d8, 0x00e2, 0x00ea, 0x00f7, 0x0100, - 0x0107, 0x010e, 0x0113, 0x0122, 0x012a, 0x0130, 0x0138, 0x0151, - 0x0157, 0x015e, 0x0164, 0x016f, 0x0177, 0x0184, 0x018a, 0x0191, - 0x01a6, 0x01b6, 0x01d0, 0x01e3, 0x01ea, 0x01f9, 0x0203, 0x0208, - 0x0220, 0x0225, 0x022e, 0x0240, 0x024a, 0x024e, 0x0258, 0x0260, - 0x026e, 0x0274, 0x027d, 0x0285, 0x0291, 0x0298, 0x02a1, 0x02a9, - // Entry 40 - 7F - 0x02be, 0x02c6, 0x02d5, 0x02dc, 0x02e4, 0x02e9, 0x02f8, 0x0300, - 0x0307, 0x030f, 0x031e, 0x031e, 0x0328, 0x032c, 0x033a, 0x0345, - 0x0350, 0x0357, 0x035d, 0x0368, 0x036f, 0x0377, 0x0386, 0x038e, - 0x0392, 0x039b, 0x03a7, 0x03ae, 0x03b4, 0x03bd, 0x03ce, 0x03d5, - 0x03fc, 0x0405, 0x0409, 0x0416, 0x041c, 0x0433, 0x0449, 0x0451, - 0x0459, 0x045e, 0x0465, 0x0474, 0x047e, 0x0485, 0x048b, 0x0496, - 0x049c, 0x04c4, 0x04ca, 0x04ce, 0x04d7, 0x04de, 0x04e4, 0x04eb, - 0x04f4, 0x04fa, 0x0501, 0x050d, 0x0514, 0x051d, 0x0524, 0x053c, - // Entry 80 - BF - 0x054b, 0x0558, 0x055e, 0x056a, 0x0576, 0x057a, 0x0581, 0x058d, - 0x059a, 0x05a3, 0x05ab, 0x05b1, 0x05ba, 0x05c4, 0x05cc, 0x05d2, - 0x05da, 0x05e1, 0x05ea, 0x05f4, 0x0601, 0x060b, 0x0619, 0x0623, - 0x0627, 0x063a, 0x0643, 0x0656, 0x066d, 0x0676, 0x0681, 0x068b, - 0x0690, 0x0699, 0x06a1, 0x06a7, 0x06ae, 0x06b6, 0x06c1, 0x06c9, - 0x06d8, 0x06de, 0x06ea, 0x06f2, 0x06fc, 0x0703, 0x070a, 0x070f, - 0x0714, 0x0718, 0x0726, 0x072a, 0x0731, 0x0735, 0x0748, 0x0759, - 0x0762, 0x076c, 0x0774, 0x078b, 0x0799, 0x07a3, 0x07ba, 0x07c2, - // Entry C0 - FF - 0x07c7, 0x07cf, 0x07d4, 0x07e2, 0x07ea, 0x07f2, 0x07f9, 0x0800, - 0x0806, 0x0815, 0x0823, 0x082c, 0x0832, 0x0839, 0x0842, 0x084e, - 0x0858, 0x086c, 0x0877, 0x0881, 0x088b, 0x0892, 0x089a, 0x08a2, - 0x08af, 0x08c5, 0x08d0, 0x08dc, 0x08e2, 0x08ee, 0x08ff, 0x0913, - 0x0918, 0x0935, 0x0939, 0x0943, 0x094f, 0x0956, 0x0961, 0x096f, - 0x0977, 0x097c, 0x0983, 0x0994, 0x099a, 0x09a0, 0x09a9, 0x09b1, - 0x09b7, 0x09d6, 0x09e5, 0x09f3, 0x09fa, 0x0a06, 0x0a18, 0x0a31, - 0x0a3a, 0x0a53, 0x0a68, 0x0a6f, 0x0a76, 0x0a85, 0x0a8a, 0x0a90, - // Entry 100 - 13F - 0x0a96, 0x0a9d, 0x0aab, 0x0ab2, 0x0abb, 0x0acf, 0x0ad4, 0x0adb, - 0x0aec, 0x0afb, 0x0b02, 0x0b13, 0x0b23, 0x0b33, 0x0b43, 0x0b52, - 0x0b64, 0x0b6d, 0x0b82, 0x0b88, 0x0b96, 0x0ba6, 0x0bb7, 0x0bc8, - 0x0bd4, 0x0bde, 0x0bf4, 0x0bfe, 0x0c03, 0x0c10, 0x0c1f, 0x0c25, - 0x0c34, 0x0c47, 0x0c57, 0x0c66, -} // Size: 608 bytes - -const ptPTRegionStr string = "" + // Size: 718 bytes - "AnguilaArméniaAlandaBangladecheBarémBenimBaamasIlhas dos Cocos (Keeling)" + - "Congo-KinshasaCongo-BrazzavilleCamarõesCuraçauIlha do NatalRepública Che" + - "caJibutiDomínicaEstóniaIlhas FalklandIlhas FaroéGronelândiaGuameIrãoQuén" + - "iaSão Cristóvão e NevesIlhas CaimãoListenstaineSri LancaLetóniaMónacoMad" + - "agáscarMacedóniaMonserrateMauríciaMaláuiNova CaledóniaPaíses BaixosPolón" + - "iaSão Pedro e MiquelãoTerritórios palestinianosOceânia InsularRoméniaSin" + - "gapuraEslovéniaSão MarinhoSalvadorIlhas Turcas e CaicosToquelauTurquemen" + - "istãoTrindade e TobagoIlhas Menores Afastadas dos EUAUsbequistãoVietname" + - "IémenMaioteZimbabuéOceâniaNorte de ÁfricaÁfrica AustralCaraíbasÁsia do S" + - "ulEuropa do SulEuropa do Norte" - -var ptPTRegionIdx = []uint16{ // 290 elements - // Entry 0 - 3F - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, - 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, - 0x0015, 0x0015, 0x0015, 0x0015, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0026, 0x0026, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, - 0x002b, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, - 0x004a, 0x0058, 0x0058, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, - 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x007a, - 0x0087, 0x0087, 0x0097, 0x0097, 0x0097, 0x009d, 0x009d, 0x00a6, - // Entry 40 - 7F - 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00ae, 0x00ae, 0x00ae, 0x00ae, - 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00bc, 0x00bc, - 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, - 0x00c8, 0x00c8, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, - 0x00d4, 0x00d4, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, - 0x00d9, 0x00d9, 0x00d9, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, - 0x00de, 0x00de, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00fd, - // Entry 80 - BF - 0x00fd, 0x00fd, 0x00fd, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, - 0x0116, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x0127, 0x0127, - 0x0127, 0x012e, 0x012e, 0x012e, 0x012e, 0x0139, 0x0139, 0x0143, - 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x014d, - 0x014d, 0x0156, 0x0156, 0x015d, 0x015d, 0x015d, 0x015d, 0x015d, - 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x017a, 0x017a, 0x017a, - 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, - 0x017a, 0x017a, 0x0182, 0x0198, 0x0198, 0x0198, 0x01b2, 0x01b2, - // Entry C0 - FF - 0x01b2, 0x01b2, 0x01b2, 0x01c2, 0x01c2, 0x01ca, 0x01ca, 0x01ca, - 0x01ca, 0x01ca, 0x01ca, 0x01ca, 0x01ca, 0x01ca, 0x01d3, 0x01d3, - 0x01dd, 0x01dd, 0x01dd, 0x01dd, 0x01e9, 0x01e9, 0x01e9, 0x01e9, - 0x01e9, 0x01e9, 0x01f1, 0x01f1, 0x01f1, 0x01f1, 0x01f1, 0x0206, - 0x0206, 0x0206, 0x0206, 0x0206, 0x0206, 0x020e, 0x020e, 0x021d, - 0x021d, 0x021d, 0x021d, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, - 0x022e, 0x024d, 0x024d, 0x024d, 0x024d, 0x0259, 0x0259, 0x0259, - 0x0259, 0x0259, 0x0259, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, - // Entry 100 - 13F - 0x0267, 0x026d, 0x026d, 0x026d, 0x0276, 0x0276, 0x0276, 0x0276, - 0x0276, 0x0276, 0x027e, 0x027e, 0x027e, 0x027e, 0x028e, 0x028e, - 0x029d, 0x029d, 0x029d, 0x02a6, 0x02a6, 0x02b2, 0x02b2, 0x02bf, - 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x02bf, - 0x02bf, 0x02ce, -} // Size: 604 bytes - -const roRegionStr string = "" + // Size: 3242 bytes - "Insula AscensionAndorraEmiratele Arabe UniteAfganistanAntigua și Barbuda" + - "AnguillaAlbaniaArmeniaAngolaAntarcticaArgentinaSamoa AmericanăAustriaAus" + - "traliaArubaInsulele ÅlandAzerbaidjanBosnia și HerțegovinaBarbadosBanglad" + - "eshBelgiaBurkina FasoBulgariaBahrainBurundiBeninSfântul BartolomeuBermud" + - "aBruneiBoliviaInsulele Caraibe OlandezeBraziliaBahamasBhutanInsula Bouve" + - "tBotswanaBelarusBelizeCanadaInsulele Cocos (Keeling)Congo - KinshasaRepu" + - "blica CentrafricanăCongo - BrazzavilleElvețiaCôte d’IvoireInsulele CookC" + - "hileCamerunChinaColumbiaInsula ClippertonCosta RicaCubaCapul VerdeCuraça" + - "oInsula ChristmasCipruCehiaGermaniaDiego GarciaDjiboutiDanemarcaDominica" + - "Republica DominicanăAlgeriaCeuta și MelillaEcuadorEstoniaEgiptSahara Occ" + - "identalăEritreeaSpaniaEtiopiaUniunea EuropeanăFinlandaFijiInsulele Falkl" + - "andMicroneziaInsulele FeroeFranțaGabonRegatul UnitGrenadaGeorgiaGuyana F" + - "rancezăGuernseyGhanaGibraltarGroenlandaGambiaGuineeaGuadelupaGuineea Ecu" + - "atorialăGreciaGeorgia de Sud și Insulele Sandwich de SudGuatemalaGuamGui" + - "neea-BissauGuyanaR.A.S. Hong Kong a ChineiInsula Heard și Insulele McDon" + - "aldHondurasCroațiaHaitiUngariaInsulele CanareIndoneziaIrlandaIsraelInsul" + - "a ManIndiaTeritoriul Britanic din Oceanul IndianIrakIranIslandaItaliaJer" + - "seyJamaicaIordaniaJaponiaKenyaKârgâzstanCambodgiaKiribatiComoreSaint Kit" + - "ts și NevisCoreea de NordCoreea de SudKuweitInsulele CaymanKazahstanLaos" + - "LibanSfânta LuciaLiechtensteinSri LankaLiberiaLesothoLituaniaLuxemburgLe" + - "toniaLibiaMarocMonacoRepublica MoldovaMuntenegruSfântul MartinMadagascar" + - "Insulele MarshallRepublica MacedoniaMaliMyanmar (Birmania)MongoliaR.A.S." + - " Macao a ChineiInsulele Mariane de NordMartinicaMauritaniaMontserratMalt" + - "aMauritiusMaldiveMalawiMexicMalaysiaMozambicNamibiaNoua CaledonieNigerIn" + - "sula NorfolkNigeriaNicaraguaȚările de JosNorvegiaNepalNauruNiueNoua Zeel" + - "andăOmanPanamaPeruPolinezia FrancezăPapua-Noua GuineeFilipinePakistanPol" + - "oniaSaint-Pierre și MiquelonInsulele PitcairnPuerto RicoTeritoriile Pale" + - "stinienePortugaliaPalauParaguayQatarOceania PerifericăRéunionRomâniaSerb" + - "iaRusiaRwandaArabia SaudităInsulele SolomonSeychellesSudanSuediaSingapor" + - "eSfânta ElenaSloveniaSvalbard și Jan MayenSlovaciaSierra LeoneSan Marino" + - "SenegalSomaliaSurinameSudanul de SudSao Tomé și PríncipeEl SalvadorSint-" + - "MaartenSiriaSwazilandTristan da CunhaInsulele Turks și CaicosCiadTeritor" + - "iile Australe și Antarctice FrancezeTogoThailandaTadjikistanTokelauTimor" + - "ul de EstTurkmenistanTunisiaTongaTurciaTrinidad și TobagoTuvaluTaiwanTan" + - "zaniaUcrainaUgandaInsulele Îndepărtate ale S.U.A.Națiunile UniteStatele " + - "Unite ale AmericiiUruguayUzbekistanStatul Cetății VaticanuluiSaint Vince" + - "nt și GrenadineleVenezuelaInsulele Virgine BritaniceInsulele Virgine Ame" + - "ricaneVietnamVanuatuWallis și FutunaSamoaKosovoYemenMayotteAfrica de Sud" + - "ZambiaZimbabweRegiune necunoscutăLumeAfricaAmerica de NordAmerica de Sud" + - "OceaniaAfrica OccidentalăAmerica CentralăAfrica OrientalăAfrica Septentr" + - "ionalăAfrica CentralăAfrica MeridionalăAmericiAmerica SeptentrionalăCara" + - "ibeAsia OrientalăAsia MeridionalăAsia de Sud-EstEuropa MeridionalăAustra" + - "lasiaMelaneziaRegiunea MicroneziaPolineziaAsiaAsia CentralăAsia Occident" + - "alăEuropaEuropa OrientalăEuropa SeptentrionalăEuropa OccidentalăAmerica " + - "Latină" - -var roRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0017, 0x002c, 0x0036, 0x0049, 0x0051, 0x0058, - 0x005f, 0x0065, 0x006f, 0x0078, 0x0088, 0x008f, 0x0098, 0x009d, - 0x00ac, 0x00b7, 0x00ce, 0x00d6, 0x00e0, 0x00e6, 0x00f2, 0x00fa, - 0x0101, 0x0108, 0x010d, 0x0120, 0x0127, 0x012d, 0x0134, 0x014d, - 0x0155, 0x015c, 0x0162, 0x016f, 0x0177, 0x017e, 0x0184, 0x018a, - 0x01a2, 0x01b2, 0x01ca, 0x01dd, 0x01e5, 0x01f5, 0x0202, 0x0207, - 0x020e, 0x0213, 0x021b, 0x022c, 0x0236, 0x023a, 0x0245, 0x024d, - 0x025d, 0x0262, 0x0267, 0x026f, 0x027b, 0x0283, 0x028c, 0x0294, - // Entry 40 - 7F - 0x02a9, 0x02b0, 0x02c1, 0x02c8, 0x02cf, 0x02d4, 0x02e7, 0x02ef, - 0x02f5, 0x02fc, 0x030e, 0x030e, 0x0316, 0x031a, 0x032b, 0x0335, - 0x0343, 0x034a, 0x034f, 0x035b, 0x0362, 0x0369, 0x0379, 0x0381, - 0x0386, 0x038f, 0x0399, 0x039f, 0x03a6, 0x03af, 0x03c3, 0x03c9, - 0x03f4, 0x03fd, 0x0401, 0x040f, 0x0415, 0x042e, 0x0450, 0x0458, - 0x0460, 0x0465, 0x046c, 0x047b, 0x0484, 0x048b, 0x0491, 0x049b, - 0x04a0, 0x04c6, 0x04ca, 0x04ce, 0x04d5, 0x04db, 0x04e1, 0x04e8, - 0x04f0, 0x04f7, 0x04fc, 0x0508, 0x0511, 0x0519, 0x051f, 0x0534, - // Entry 80 - BF - 0x0542, 0x054f, 0x0555, 0x0564, 0x056d, 0x0571, 0x0576, 0x0583, - 0x0590, 0x0599, 0x05a0, 0x05a7, 0x05af, 0x05b8, 0x05bf, 0x05c4, - 0x05c9, 0x05cf, 0x05e0, 0x05ea, 0x05f9, 0x0603, 0x0614, 0x0627, - 0x062b, 0x063d, 0x0645, 0x065a, 0x0672, 0x067b, 0x0685, 0x068f, - 0x0694, 0x069d, 0x06a4, 0x06aa, 0x06af, 0x06b7, 0x06bf, 0x06c6, - 0x06d4, 0x06d9, 0x06e7, 0x06ee, 0x06f7, 0x0706, 0x070e, 0x0713, - 0x0718, 0x071c, 0x072a, 0x072e, 0x0734, 0x0738, 0x074b, 0x075c, - 0x0764, 0x076c, 0x0773, 0x078c, 0x079d, 0x07a8, 0x07c0, 0x07ca, - // Entry C0 - FF - 0x07cf, 0x07d7, 0x07dc, 0x07ef, 0x07f7, 0x07ff, 0x0805, 0x080a, - 0x0810, 0x081f, 0x082f, 0x0839, 0x083e, 0x0844, 0x084d, 0x085a, - 0x0862, 0x0878, 0x0880, 0x088c, 0x0896, 0x089d, 0x08a4, 0x08ac, - 0x08ba, 0x08d1, 0x08dc, 0x08e8, 0x08ed, 0x08f6, 0x0906, 0x091f, - 0x0923, 0x094f, 0x0953, 0x095c, 0x0967, 0x096e, 0x097c, 0x0988, - 0x098f, 0x0994, 0x099a, 0x09ad, 0x09b3, 0x09b9, 0x09c1, 0x09c8, - 0x09ce, 0x09ef, 0x09ff, 0x0a19, 0x0a20, 0x0a2a, 0x0a46, 0x0a63, - 0x0a6c, 0x0a86, 0x0aa0, 0x0aa7, 0x0aae, 0x0abf, 0x0ac4, 0x0aca, - // Entry 100 - 13F - 0x0acf, 0x0ad6, 0x0ae3, 0x0ae9, 0x0af1, 0x0b05, 0x0b09, 0x0b0f, - 0x0b1e, 0x0b2c, 0x0b33, 0x0b46, 0x0b57, 0x0b68, 0x0b7e, 0x0b8e, - 0x0ba1, 0x0ba8, 0x0bbf, 0x0bc6, 0x0bd5, 0x0be6, 0x0bf5, 0x0c08, - 0x0c13, 0x0c1c, 0x0c2f, 0x0c38, 0x0c3c, 0x0c4a, 0x0c5b, 0x0c61, - 0x0c72, 0x0c88, 0x0c9b, 0x0caa, -} // Size: 608 bytes - -const ruRegionStr string = "" + // Size: 5849 bytes - "о-в ВознесенияАндорраОАЭАфганистанАнтигуа и БарбудаАнгильяАлбанияАрмения" + - "АнголаАнтарктидаАргентинаАмериканское СамоаАвстрияАвстралияАрубаАландск" + - "ие о-ваАзербайджанБосния и ГерцеговинаБарбадосБангладешБельгияБуркина-Ф" + - "асоБолгарияБахрейнБурундиБенинСен-БартелемиБермудыБруней-ДаруссаламБоли" + - "вияБонэйр, Синт-Эстатиус и СабаБразилияБагамыБутано-в БувеБотсванаБелар" + - "усьБелизКанадаКокосовые о-ваКонго - КиншасаЦАРКонго - БраззавильШвейцар" + - "ияКот-д’ИвуарОстрова КукаЧилиКамерунКитайКолумбияо-в КлиппертонКоста-Ри" + - "каКубаКабо-ВердеКюрасаоо-в РождестваКипрЧехияГерманияДиего-ГарсияДжибут" + - "иДанияДоминикаДоминиканская РеспубликаАлжирСеута и МелильяЭквадорЭстони" + - "яЕгипетЗападная СахараЭритреяИспанияЭфиопияЕвропейский союзФинляндияФид" + - "жиФолклендские о-ваФедеративные Штаты МикронезииФарерские о-ваФранцияГа" + - "бонВеликобританияГренадаГрузияФранцузская ГвианаГернсиГанаГибралтарГрен" + - "ландияГамбияГвинеяГваделупаЭкваториальная ГвинеяГрецияЮжная Георгия и Ю" + - "жные Сандвичевы о-ваГватемалаГуамГвинея-БисауГайанаГонконг (специальный" + - " административный район)о-ва Херд и МакдональдГондурасХорватияГаитиВенгр" + - "ияКанарские о-ваИндонезияИрландияИзраильо-в МэнИндияБританская территор" + - "ия в Индийском океанеИракИранИсландияИталияДжерсиЯмайкаИорданияЯпонияКе" + - "нияКиргизияКамбоджаКирибатиКоморыСент-Китс и НевисКНДРРеспублика КореяК" + - "увейтКаймановы о-ваКазахстанЛаосЛиванСент-ЛюсияЛихтенштейнШри-ЛанкаЛибе" + - "рияЛесотоЛитваЛюксембургЛатвияЛивияМароккоМонакоМолдоваЧерногорияСен-Ма" + - "ртенМадагаскарМаршалловы ОстроваМакедонияМалиМьянма (Бирма)МонголияМака" + - "о (специальный административный район)Северные Марианские о-ваМартиника" + - "МавританияМонтсерратМальтаМаврикийМальдивыМалавиМексикаМалайзияМозамбик" + - "НамибияНовая КаледонияНигеро-в НорфолкНигерияНикарагуаНидерландыНорвеги" + - "яНепалНауруНиуэНовая ЗеландияОманПанамаПеруФранцузская ПолинезияПапуа –" + - " Новая ГвинеяФилиппиныПакистанПольшаСен-Пьер и Микелонострова ПиткэрнПуэ" + - "рто-РикоПалестинские территорииПортугалияПалауПарагвайКатарВнешняя Океа" + - "нияРеюньонРумынияСербияРоссияРуандаСаудовская АравияСоломоновы ОстроваС" + - "ейшельские ОстроваСуданШвецияСингапуро-в Св. ЕленыСловенияШпицберген и " + - "Ян-МайенСловакияСьерра-ЛеонеСан-МариноСенегалСомалиСуринамЮжный СуданСа" + - "н-Томе и ПринсипиСальвадорСинт-МартенСирияСвазилендТристан-да-Куньяо-ва" + - " Тёркс и КайкосЧадФранцузские Южные территорииТогоТаиландТаджикистанТоке" + - "лауВосточный ТиморТуркменистанТунисТонгаТурцияТринидад и ТобагоТувалуТа" + - "йваньТанзанияУкраинаУгандаВнешние малые о-ва (США)Организация Объединен" + - "ных НацийСоединенные ШтатыУругвайУзбекистанВатиканСент-Винсент и Гренад" + - "иныВенесуэлаВиргинские о-ва (Британские)Виргинские о-ва (США)ВьетнамВан" + - "уатуУоллис и ФутунаСамоаКосовоЙеменМайоттаЮАРЗамбияЗимбабвеНеизвестный " + - "регионМирАфрикаСеверная АмерикаЮжная АмерикаОкеанияЗападная АфрикаЦентр" + - "альная АмерикаВосточная АфрикаСеверная АфрикаЦентральная АфрикаЮжная Аф" + - "рикаАмерикаСеверная Америка – США и КанадаКарибыВосточная АзияЮжная Ази" + - "яЮго-Восточная АзияЮжная ЕвропаАвстралазияМеланезияМикронезияПолинезияА" + - "зияЦентральная АзияЗападная АзияЕвропаВосточная ЕвропаСеверная ЕвропаЗа" + - "падная ЕвропаЛатинская Америка" - -var ruRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001a, 0x0028, 0x002e, 0x0042, 0x0062, 0x0070, 0x007e, - 0x008c, 0x0098, 0x00ac, 0x00be, 0x00e1, 0x00ef, 0x0101, 0x010b, - 0x0125, 0x013b, 0x0161, 0x0171, 0x0183, 0x0191, 0x01a8, 0x01b8, - 0x01c6, 0x01d4, 0x01de, 0x01f7, 0x0205, 0x0226, 0x0234, 0x0267, - 0x0277, 0x0283, 0x028d, 0x029b, 0x02ab, 0x02bb, 0x02c5, 0x02d1, - 0x02eb, 0x0306, 0x030c, 0x032d, 0x033f, 0x0355, 0x036c, 0x0374, - 0x0382, 0x038c, 0x039c, 0x03b6, 0x03c9, 0x03d1, 0x03e4, 0x03f2, - 0x040a, 0x0412, 0x041c, 0x042c, 0x0443, 0x0451, 0x045b, 0x046b, - // Entry 40 - 7F - 0x049a, 0x04a4, 0x04c0, 0x04ce, 0x04dc, 0x04e8, 0x0505, 0x0513, - 0x0521, 0x052f, 0x054e, 0x054e, 0x0560, 0x056a, 0x058a, 0x05c2, - 0x05dc, 0x05ea, 0x05f4, 0x0610, 0x061e, 0x062a, 0x064d, 0x0659, - 0x0661, 0x0673, 0x0687, 0x0693, 0x069f, 0x06b1, 0x06da, 0x06e6, - 0x072a, 0x073c, 0x0744, 0x075b, 0x0767, 0x07ba, 0x07e2, 0x07f2, - 0x0802, 0x080c, 0x081a, 0x0834, 0x0846, 0x0856, 0x0864, 0x0870, - 0x087a, 0x08c6, 0x08ce, 0x08d6, 0x08e6, 0x08f2, 0x08fe, 0x090a, - 0x091a, 0x0926, 0x0930, 0x0940, 0x0950, 0x0960, 0x096c, 0x098b, - // Entry 80 - BF - 0x0993, 0x09b2, 0x09be, 0x09d8, 0x09ea, 0x09f2, 0x09fc, 0x0a0f, - 0x0a25, 0x0a36, 0x0a44, 0x0a50, 0x0a5a, 0x0a6e, 0x0a7a, 0x0a84, - 0x0a92, 0x0a9e, 0x0aac, 0x0ac0, 0x0ad3, 0x0ae7, 0x0b0a, 0x0b1c, - 0x0b24, 0x0b3d, 0x0b4d, 0x0b9c, 0x0bc9, 0x0bdb, 0x0bef, 0x0c03, - 0x0c0f, 0x0c1f, 0x0c2f, 0x0c3b, 0x0c49, 0x0c59, 0x0c69, 0x0c77, - 0x0c94, 0x0c9e, 0x0cb2, 0x0cc0, 0x0cd2, 0x0ce6, 0x0cf6, 0x0d00, - 0x0d0a, 0x0d12, 0x0d2d, 0x0d35, 0x0d41, 0x0d49, 0x0d72, 0x0d98, - 0x0daa, 0x0dba, 0x0dc6, 0x0de7, 0x0e04, 0x0e19, 0x0e46, 0x0e5a, - // Entry C0 - FF - 0x0e64, 0x0e74, 0x0e7e, 0x0e9b, 0x0ea9, 0x0eb7, 0x0ec3, 0x0ecf, - 0x0edb, 0x0efc, 0x0f1f, 0x0f44, 0x0f4e, 0x0f5a, 0x0f6a, 0x0f80, - 0x0f90, 0x0fb7, 0x0fc7, 0x0fde, 0x0ff1, 0x0fff, 0x100b, 0x1019, - 0x102e, 0x1051, 0x1063, 0x1078, 0x1082, 0x1094, 0x10b2, 0x10d4, - 0x10da, 0x1110, 0x1118, 0x1126, 0x113c, 0x114a, 0x1167, 0x117f, - 0x1189, 0x1193, 0x119f, 0x11bf, 0x11cb, 0x11d9, 0x11e9, 0x11f7, - 0x1203, 0x122d, 0x1267, 0x1288, 0x1296, 0x12aa, 0x12b8, 0x12e5, - 0x12f7, 0x132a, 0x134f, 0x135d, 0x136b, 0x1387, 0x1391, 0x139d, - // Entry 100 - 13F - 0x13a7, 0x13b5, 0x13bb, 0x13c7, 0x13d7, 0x13fa, 0x1400, 0x140c, - 0x142b, 0x1444, 0x1452, 0x146f, 0x1494, 0x14b3, 0x14d0, 0x14f3, - 0x150a, 0x1518, 0x1552, 0x155e, 0x1579, 0x158c, 0x15ae, 0x15c5, - 0x15db, 0x15ed, 0x1601, 0x1613, 0x161b, 0x163a, 0x1653, 0x165f, - 0x167e, 0x169b, 0x16b8, 0x16d9, -} // Size: 608 bytes - -const siRegionStr string = "" + // Size: 9319 bytes - "ඇසෙන්ෂන් දිවයිනඇන්ඩෝරාවඑක්සත් අරාබි එමිර් රාජ්\u200dයයඇෆ්ගනිස්ථානයඇන්ටිග" + - "ුවා සහ බාබියුඩාවඇන්ගුයිලාවඇල්බේනියාවආර්මේනියාවඇන්ගෝලාවඇන්ටාක්ටිකාවආර්ජ" + - "ෙන්ටිනාවඇමරිකානු සැමෝවාවඔස්ට්\u200dරියාවඕස්ට්\u200dරේලියාවඅරුබාවඕලන්ඩ්" + - " දූපත්අසර්බයිජානයබොස්නියාව සහ හර්සගොවීනාවබාර්බඩෝස්බංග්ලාදේශයබෙල්ජියමබර්ක" + - "ිනා ෆාසෝබල්ගේරියාවබහරේන්බුරුන්දිබෙනින්ශාන්ත බර්තලෙමිබර්මියුඩාබෲනායිබොල" + - "ීවියාවකැරිබියානු නෙදර්ලන්තයබ්\u200dරසීලයබහමාස්භූතානයබුවට් දුපත්බොට්ස්ව" + - "ානාබෙලරුස්බෙලීස්කැනඩාවකොකෝස් දූපත්කොංගො - කින්ශාසාමධ්\u200dයම අප්" + - "\u200dරිකානු ජනරජයකොංගො - බ්\u200dරසාවිල්ස්විස්ටර්ලන්තයකෝට් දි අයිවරිකුක" + - "් දූපත්චිලීකැමරූන්චීනයකොළොම්බියාවක්ලීපර්ටන් දූපතකොස්ටරිකාවකියුබාවකේප් " + - "වර්ඩ්කුරකාවෝක්\u200dරිස්මස් දූපතසයිප්\u200dරසයචෙක්ජර්මනියදියාගෝ ගාර්සි" + - "යාජිබුටිඩෙන්මාර්කයඩොමිනිකාවඩොමිනිකා ජනරජයඇල්ජීරියාවසෙයුටා සහ මෙලිල්ලාඉ" + - "ක්වදෝරයඑස්තෝනියාවඊජිප්තුවබටහිර සහරාවඑරිත්\u200dරියාවස්පාඤ්ඤයඉතියෝපියාව" + - "යුරෝපා සංගමයෆින්ලන්තයෆීජීෆෝක්ලන්ත දූපත්මයික්\u200dරොනීසියාවෆැරෝ දූපත්ප" + - "්\u200dරංශයගැබොන්එක්සත් රාජධානියග්\u200dරැනඩාවජෝර්ජියාවප්\u200dරංශ ගයන" + - "ාවගර්න්සියඝානාවජිබ්\u200dරෝල්ටාවග්\u200dරීන්ලන්තයගැම්බියාවගිණියාවග්වෝඩ" + - "ලෝප්සමක ගිනියාවග්\u200dරීසියදකුණු ජෝර්ජියාව සහ දකුණු සැන්ඩ්විච් දූපත්ග" + - "ෝතමාලාවගුවාම්ගිනි බිසව්ගයනාවහොංකොං චීන විශේෂ පරිපාලන කලාපයහර්ඩ් දූපත ස" + - "හ මැක්ඩොනල්ඩ් දූපත්හොන්ඩුරාස්ක්\u200dරොඒෂියාවහයිටිහන්ගේරියාවකැනරි සූපත" + - "්ඉන්දුනීසියාවඅයර්ලන්තයඊශ්\u200dරායලයඅයිල් ඔෆ් මෑන්ඉන්දියාවබ්\u200dරිතා" + - "න්\u200dය ඉන්දීය සාගර බල ප්\u200dරදේශයඉරාකයඉරානයඅයිස්ලන්තයඉතාලියජර්සිජ" + - "ැමෙයිකාවජෝර්දානයජපානයකෙන්යාවකිර්ගිස්තානයකාම්බෝජයකිරිබතිකොමොරෝස්ශාන්ත ක" + - "ිට්ස් සහ නේවිස්උතුරු කොරියාවදකුණු කොරියාවකුවේටයකේමන් දූපත්කසකස්තානයලාඕ" + - "සයලෙබනනයශාන්ත ලුසියාලික්ටන්ස්ටයින්ශ්\u200dරී ලංකාවලයිබීරියාවලෙසතෝලිතුව" + - "ේනියාවලක්ශම්බර්ග්ලැට්වියාවලිබියාවමොරොක්කෝවමොනාකෝවමොල්ඩෝවාවමොන්ටෙනීග්" + - "\u200dරෝශාන්ත මාර්ටින්මැඩගස්කරයමාෂල් දූපත්මැසිඩෝනියාවමාලිමියන්මාරය (බුරු" + - "මය)මොන්ගෝලියාවමකාවු චීන විශේෂ පරිපාලන කලාපයඋතුරු මරියානා දූපත්මර්ටිනික" + - "්මොරිටේනියාවමොන්සෙරාට්මෝල්ටාවමුරුසියමාල දිවයිනමලාවිමෙක්සිකෝවමැලේසියාවම" + - "ොසැම්බික්නැමීබියාවනව කැලිඩෝනියාවනයිජර්නෝෆෝක් දූපතනයිජීරියාවනිකරගුවාවනෙ" + - "දර්ලන්තයනෝර්වේනේපාලයනාවුරුනියූනවසීලන්තයඕමානයපැනමාවපේරුප්\u200dරංශ පොලි" + - "නීසියාවපැපුවා නිව් ගිනියාවපිලිපීනයපාකිස්තානයපෝලන්තයශාන්ත පියරේ සහ මැකෝ" + - "ලන්පිට්කෙය්න් දූපත්පුවර්ටෝ රිකෝපලස්තීන රාජ්\u200dයයපෘතුගාලයපලාවුපැරගුව" + - "ේකටාර්ඈත ඕෂනියාවරීයුනියන්රුමේනියාවසර්බියාවරුසියාවරුවන්ඩාවසෞදි අරාබියසො" + - "ලමන් දූපත්සීශෙල්ස්සූඩානයස්වීඩනයසිංගප්පූරුවශාන්ත හෙලේනාස්ලෝවේනියාවස්වෙල" + - "්බර්ඩ් සහ ජේන් මයේන්ස්ලෝවැකියාවසියරාලියෝන්සැන් මැරිනෝසෙනගාලයසෝමාලියාවස" + - "ුරිනාමයදකුණු සුඩානයසාඕ තෝම් සහ ප්\u200dරින්සිප්එල් සැල්වදෝරයශාන්ත මාර්" + - "ටෙන්සිරියාවස්වාසිලන්තයට්\u200dරිස්ටන් ද කුන්හාටර්ක්ස් සහ කයිකොස් දූපත්" + - "චැච්දකුණු ප්\u200dරංශ දූපත් සමූහයටොගෝතායිලන්තයටජිකිස්තානයටොකලාවුටිමෝර්" + - " - ලෙස්ත්ටර්ක්මෙනිස්ථානයටියුනීසියාවටොංගාතුර්කියට්\u200dරිනිඩෑඩ් සහ ටොබැග" + - "ෝටුවාලූතායිවානයටැන්සානියාවයුක්රේනයඋගන්ඩාවඑක්සත් ජනපද ඈත දූපත්එක්සත් ජා" + - "තීන්එක්සත් ජනපදයඋරුගුවේඋස්බෙකිස්ථානයවතිකානු නගරයශාන්ත වින්සන්ට් සහ ග්" + - "\u200dරෙනඩින්ස්වෙනිසියුලාවබ්\u200dරිතාන්\u200dය වර්ජින් දූපත්ඇමරිකානු වර" + - "්ජින් දූපත්වියට්නාමයවනුවාටුවැලිස් සහ ෆුටුනාසැමෝවාකොසෝවෝයේමනයමයෝට්දකුණු" + - " අප්\u200dරිකාවසැම්බියාවසිම්බාබ්වේහඳුනා නොගත් කළාපයලෝකයඅප්\u200dරිකාවඋතු" + - "රු ඇමෙරිකාවදකුණු ඇමෙරිකාවඕෂනියාවබටහිරදිග අප්\u200dරිකාවමධ්\u200dයම ඇමෙ" + - "රිකාවපෙරදිග අප්\u200dරිකාවඋතුරුදිග අප්\u200dරිකාවමධ්\u200dයම අප්\u200d" + - "රිකාවදකුණුදිග අප්\u200dරිකාවඇමරිකාවඋතුරුදිග ඇමෙරිකාවකැරීබියන්නැගෙනහිර " + - "ආසියාවදකුණු ආසියාවඅග්නිදිග ආසියාවදකුණුදිග යුරෝපයඕස්ට්\u200dරලේෂියාවමෙල" + - "නීසියාවමයික්\u200dරෝනීසියානු කළාපයපොලිනීසියාවආසියාවමධ්\u200dයම ආසියාවබ" + - "ටහිර ආසියාවයුරෝපයනැගෙනහිර යුරෝපයඋතුරු යුරෝපයබටහිර යුරෝපයලතින් ඇමෙරිකාව" - -var siRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x002b, 0x0043, 0x008b, 0x00af, 0x00ed, 0x010b, 0x0129, - 0x0147, 0x015f, 0x0183, 0x01a7, 0x01d5, 0x01f6, 0x021d, 0x022f, - 0x0251, 0x0272, 0x02b6, 0x02d1, 0x02ef, 0x0307, 0x0329, 0x0347, - 0x0359, 0x0371, 0x0383, 0x03ab, 0x03c6, 0x03d8, 0x03f3, 0x0430, - 0x0448, 0x045a, 0x046c, 0x048b, 0x04a9, 0x04be, 0x04d0, 0x04e2, - 0x0504, 0x052e, 0x056f, 0x059f, 0x05c9, 0x05ef, 0x060b, 0x0617, - 0x062c, 0x0638, 0x0659, 0x0684, 0x06a2, 0x06b7, 0x06d3, 0x06e8, - 0x0713, 0x072e, 0x073a, 0x074f, 0x077a, 0x078c, 0x07aa, 0x07c5, - // Entry 40 - 7F - 0x07ed, 0x080b, 0x083d, 0x0855, 0x0873, 0x088b, 0x08aa, 0x08cb, - 0x08e3, 0x0901, 0x0923, 0x0923, 0x093e, 0x094a, 0x0972, 0x099f, - 0x09bb, 0x09d0, 0x09e2, 0x0a0d, 0x0a28, 0x0a43, 0x0a65, 0x0a7d, - 0x0a8c, 0x0ab0, 0x0ad4, 0x0aef, 0x0b04, 0x0b1f, 0x0b3e, 0x0b56, - 0x0bc7, 0x0bdf, 0x0bf1, 0x0c0d, 0x0c1c, 0x0c6e, 0x0cc3, 0x0ce1, - 0x0d02, 0x0d11, 0x0d2f, 0x0d4e, 0x0d72, 0x0d8d, 0x0da8, 0x0dce, - 0x0de6, 0x0e47, 0x0e56, 0x0e65, 0x0e83, 0x0e95, 0x0ea4, 0x0ebf, - 0x0ed7, 0x0ee6, 0x0efb, 0x0f1f, 0x0f37, 0x0f4c, 0x0f64, 0x0fa0, - // Entry 80 - BF - 0x0fc5, 0x0fea, 0x0ffc, 0x101b, 0x1036, 0x1045, 0x1057, 0x1079, - 0x10a3, 0x10c2, 0x10e0, 0x10ef, 0x1110, 0x1131, 0x114c, 0x1161, - 0x117c, 0x1191, 0x11ac, 0x11d3, 0x11fb, 0x1216, 0x1235, 0x1256, - 0x1262, 0x1292, 0x12b3, 0x1302, 0x1337, 0x1352, 0x1373, 0x1391, - 0x13a6, 0x13bb, 0x13d7, 0x13e6, 0x1401, 0x141c, 0x143a, 0x1455, - 0x147d, 0x148f, 0x14ae, 0x14cc, 0x14e7, 0x1505, 0x1517, 0x1529, - 0x153b, 0x1547, 0x1562, 0x1571, 0x1583, 0x158f, 0x15c3, 0x15f8, - 0x1610, 0x162e, 0x1643, 0x167f, 0x16ad, 0x16cf, 0x16fa, 0x1712, - // Entry C0 - FF - 0x1721, 0x1736, 0x1745, 0x1761, 0x177c, 0x1797, 0x17af, 0x17c4, - 0x17dc, 0x17fb, 0x181d, 0x1835, 0x1847, 0x185c, 0x187d, 0x189f, - 0x18c0, 0x1905, 0x1926, 0x1947, 0x1966, 0x197b, 0x1996, 0x19ae, - 0x19d0, 0x1a0f, 0x1a34, 0x1a5c, 0x1a71, 0x1a92, 0x1ac7, 0x1b09, - 0x1b15, 0x1b57, 0x1b63, 0x1b7e, 0x1b9f, 0x1bb4, 0x1bdb, 0x1c08, - 0x1c29, 0x1c38, 0x1c4d, 0x1c88, 0x1c9a, 0x1cb2, 0x1cd3, 0x1ceb, - 0x1d00, 0x1d36, 0x1d5b, 0x1d7d, 0x1d92, 0x1db9, 0x1ddb, 0x1e32, - 0x1e53, 0x1e9a, 0x1ed8, 0x1ef3, 0x1f08, 0x1f34, 0x1f46, 0x1f58, - // Entry 100 - 13F - 0x1f67, 0x1f76, 0x1fa1, 0x1fbc, 0x1fda, 0x2009, 0x2015, 0x2030, - 0x2058, 0x2080, 0x2095, 0x20c9, 0x20f4, 0x2122, 0x2156, 0x2184, - 0x21b8, 0x21cd, 0x21fe, 0x2219, 0x2244, 0x2266, 0x2291, 0x22bc, - 0x22e6, 0x2304, 0x2344, 0x2365, 0x2377, 0x239c, 0x23be, 0x23d0, - 0x23fb, 0x241d, 0x243f, 0x2467, -} // Size: 608 bytes - -const skRegionStr string = "" + // Size: 3216 bytes - "AscensionAndorraSpojené arabské emirátyAfganistanAntigua a BarbudaAnguil" + - "laAlbánskoArménskoAngolaAntarktídaArgentínaAmerická SamoaRakúskoAustráli" + - "aArubaAlandyAzerbajdžanBosna a HercegovinaBarbadosBangladéšBelgickoBurki" + - "na FasoBulharskoBahrajnBurundiBeninSvätý BartolomejBermudyBrunejBolíviaK" + - "aribské HolandskoBrazíliaBahamyBhutánBouvetov ostrovBotswanaBieloruskoBe" + - "lizeKanadaKokosové ostrovyKonžská demokratická republikaStredoafrická re" + - "publikaKonžská republikaŠvajčiarskoPobrežie SlonovinyCookove ostrovyČile" + - "KamerunČínaKolumbiaClippertonKostarikaKubaKapverdyCuraçaoVianočný ostrov" + - "CyprusČeskoNemeckoDiego GarciaDžibutskoDánskoDominikaDominikánska republ" + - "ikaAlžírskoCeuta a MelillaEkvádorEstónskoEgyptZápadná SaharaEritreaŠpani" + - "elskoEtiópiaEurópska úniaFínskoFidžiFalklandyMikronéziaFaerské ostrovyFr" + - "ancúzskoGabonSpojené kráľovstvoGrenadaGruzínskoFrancúzska GuayanaGuernse" + - "yGhanaGibraltárGrónskoGambiaGuineaGuadeloupeRovníková GuineaGréckoJužná " + - "Georgia a Južné Sandwichove ostrovyGuatemalaGuamGuinea-BissauGuayanaHong" + - "kong – OAO ČínyHeardov ostrov a Macdonaldove ostrovyHondurasChorvátskoHa" + - "itiMaďarskoKanárske ostrovyIndonéziaÍrskoIzraelOstrov ManIndiaBritské in" + - "dickooceánske územieIrakIránIslandTalianskoJerseyJamajkaJordánskoJaponsk" + - "oKeňaKirgizskoKambodžaKiribatiKomorySvätý Krištof a NevisSeverná KóreaJu" + - "žná KóreaKuvajtKajmanie ostrovyKazachstanLaosLibanonSvätá LuciaLichtenš" + - "tajnskoSrí LankaLibériaLesothoLitvaLuxemburskoLotyšskoLíbyaMarokoMonakoM" + - "oldavskoČierna HoraSvätý Martin (fr.)MadagaskarMarshallove ostrovyMacedó" + - "nskoMaliMjanmarskoMongolskoMacao – OAO ČínySeverné MariányMartinikMaurit" + - "ániaMontserratMaltaMauríciusMaldivyMalawiMexikoMalajziaMozambikNamíbiaN" + - "ová KaledóniaNigerNorfolkNigériaNikaraguaHolandskoNórskoNepálNauruNiueNo" + - "vý ZélandOmánPanamaPeruFrancúzska PolynéziaPapua Nová GuineaFilipínyPaki" + - "stanPoľskoSaint Pierre a MiquelonPitcairnove ostrovyPortorikoPalestínske" + - " územiaPortugalskoPalauParaguajKatarostatné TichomorieRéunionRumunskoSrb" + - "skoRuskoRwandaSaudská ArábiaŠalamúnove ostrovySeychelySudánŠvédskoSingap" + - "urSvätá HelenaSlovinskoSvalbard a Jan MayenSlovenskoSierra LeoneSan Marí" + - "noSenegalSomálskoSurinamJužný SudánSvätý Tomáš a Princov ostrovSalvádorS" + - "vätý Martin (hol.)SýriaSvazijskoTristan da CunhaTurks a CaicosČadFrancúz" + - "ske južné a antarktické územiaTogoThajskoTadžikistanTokelauVýchodný Timo" + - "rTurkménskoTuniskoTongaTureckoTrinidad a TobagoTuvaluTaiwanTanzániaUkraj" + - "inaUgandaMenšie odľahlé ostrovy USAOSNSpojené štátyUruguajUzbekistanVati" + - "kánSvätý Vincent a GrenadínyVenezuelaBritské Panenské ostrovyAmerické Pa" + - "nenské ostrovyVietnamVanuatuWallis a FutunaSamoaKosovoJemenMayotteJužná " + - "AfrikaZambiaZimbabweneznámy regiónsvetAfrikaSeverná AmerikaJužná Amerika" + - "Oceániazápadná AfrikaStredná Amerikavýchodná Afrikaseverná Afrikastredná" + - " Afrikajužné územia AfrikyAmerikaseverné územia AmerikyKaribikvýchodná Á" + - "ziajužná Áziajuhovýchodná Áziajužná EurópaAustraláziaMelanéziaoblasť Mik" + - "ronéziePolynéziaÁziastredná Áziazápadná ÁziaEurópavýchodná Európaseverná" + - " Európazápadná EurópaLatinská Amerika" - -var skRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x002a, 0x0034, 0x0045, 0x004d, 0x0056, - 0x005f, 0x0065, 0x0070, 0x007a, 0x0089, 0x0091, 0x009b, 0x00a0, - 0x00a6, 0x00b2, 0x00c5, 0x00cd, 0x00d8, 0x00e0, 0x00ec, 0x00f5, - 0x00fc, 0x0103, 0x0108, 0x011a, 0x0121, 0x0127, 0x012f, 0x0142, - 0x014b, 0x0151, 0x0158, 0x0167, 0x016f, 0x0179, 0x017f, 0x0185, - 0x0196, 0x01b7, 0x01cf, 0x01e2, 0x01ef, 0x0202, 0x0211, 0x0216, - 0x021d, 0x0223, 0x022b, 0x0235, 0x023e, 0x0242, 0x024a, 0x0252, - 0x0263, 0x0269, 0x026f, 0x0276, 0x0282, 0x028c, 0x0293, 0x029b, - // Entry 40 - 7F - 0x02b2, 0x02bc, 0x02cb, 0x02d3, 0x02dc, 0x02e1, 0x02f1, 0x02f8, - 0x0303, 0x030b, 0x031a, 0x031a, 0x0321, 0x0327, 0x0330, 0x033b, - 0x034b, 0x0356, 0x035b, 0x0370, 0x0377, 0x0381, 0x0394, 0x039c, - 0x03a1, 0x03ab, 0x03b3, 0x03b9, 0x03bf, 0x03c9, 0x03db, 0x03e2, - 0x040f, 0x0418, 0x041c, 0x0429, 0x0430, 0x0447, 0x046c, 0x0474, - 0x047f, 0x0484, 0x048d, 0x049e, 0x04a8, 0x04ae, 0x04b4, 0x04be, - 0x04c3, 0x04e4, 0x04e8, 0x04ed, 0x04f3, 0x04fc, 0x0502, 0x0509, - 0x0513, 0x051b, 0x0520, 0x0529, 0x0532, 0x053a, 0x0540, 0x0558, - // Entry 80 - BF - 0x0567, 0x0575, 0x057b, 0x058b, 0x0595, 0x0599, 0x05a0, 0x05ad, - 0x05bd, 0x05c7, 0x05cf, 0x05d6, 0x05db, 0x05e6, 0x05ef, 0x05f5, - 0x05fb, 0x0601, 0x060a, 0x0616, 0x062a, 0x0634, 0x0647, 0x0652, - 0x0656, 0x0660, 0x0669, 0x067d, 0x068e, 0x0696, 0x06a1, 0x06ab, - 0x06b0, 0x06ba, 0x06c1, 0x06c7, 0x06cd, 0x06d5, 0x06dd, 0x06e5, - 0x06f5, 0x06fa, 0x0701, 0x0709, 0x0712, 0x071b, 0x0722, 0x0728, - 0x072d, 0x0731, 0x073e, 0x0743, 0x0749, 0x074d, 0x0763, 0x0775, - 0x077e, 0x0786, 0x078d, 0x07a4, 0x07b7, 0x07c0, 0x07d4, 0x07df, - // Entry C0 - FF - 0x07e4, 0x07ec, 0x07f1, 0x0804, 0x080c, 0x0814, 0x081a, 0x081f, - 0x0825, 0x0835, 0x0849, 0x0851, 0x0857, 0x0860, 0x0868, 0x0876, - 0x087f, 0x0893, 0x089c, 0x08a8, 0x08b3, 0x08ba, 0x08c3, 0x08ca, - 0x08d8, 0x08f8, 0x0901, 0x0916, 0x091c, 0x0925, 0x0935, 0x0943, - 0x0947, 0x0971, 0x0975, 0x097c, 0x0988, 0x098f, 0x099f, 0x09aa, - 0x09b1, 0x09b6, 0x09bd, 0x09ce, 0x09d4, 0x09da, 0x09e3, 0x09eb, - 0x09f1, 0x0a0e, 0x0a11, 0x0a21, 0x0a28, 0x0a32, 0x0a3a, 0x0a56, - 0x0a5f, 0x0a79, 0x0a94, 0x0a9b, 0x0aa2, 0x0ab1, 0x0ab6, 0x0abc, - // Entry 100 - 13F - 0x0ac1, 0x0ac8, 0x0ad6, 0x0adc, 0x0ae4, 0x0af4, 0x0af8, 0x0afe, - 0x0b0e, 0x0b1d, 0x0b25, 0x0b35, 0x0b45, 0x0b56, 0x0b65, 0x0b74, - 0x0b8a, 0x0b91, 0x0ba9, 0x0bb0, 0x0bc0, 0x0bcd, 0x0be1, 0x0bf0, - 0x0bfc, 0x0c06, 0x0c19, 0x0c23, 0x0c28, 0x0c36, 0x0c45, 0x0c4c, - 0x0c5e, 0x0c6e, 0x0c7f, 0x0c90, -} // Size: 608 bytes - -const slRegionStr string = "" + // Size: 3201 bytes - "Otok AscensionAndoraZdruženi arabski emiratiAfganistanAntigva in Barbuda" + - "AngvilaAlbanijaArmenijaAngolaAntarktikaArgentinaAmeriška SamoaAvstrijaAv" + - "stralijaArubaÅlandski otokiAzerbajdžanBosna in HercegovinaBarbadosBangla" + - "dešBelgijaBurkina FasoBolgarijaBahrajnBurundiBeninSaint BarthélemyBermud" + - "iBrunejBolivijaNizozemski KaribiBrazilijaBahamiButanBouvetov otokBocvana" + - "BelorusijaBelizeKanadaKokosovi otokiDemokratična republika KongoCentraln" + - "oafriška republikaKongo - BrazzavilleŠvicaSlonokoščena obalaCookovi otok" + - "iČileKamerunKitajskaKolumbijaOtok ClippertonKostarikaKubaZelenortski oto" + - "kiCuraçaoBožični otokCiperČeškaNemčijaDiego GarciaDžibutiDanskaDominikaD" + - "ominikanska republikaAlžirijaCeuta in MelillaEkvadorEstonijaEgiptZahodna" + - " SaharaEritrejaŠpanijaEtiopijaEvropska unijaFinskaFidžiFalklandski otoki" + - "MikronezijaFerski otokiFrancijaGabonZdruženo kraljestvoGrenadaGruzijaFra" + - "ncoska GvajanaGuernseyGanaGibraltarGrenlandijaGambijaGvinejaGvadalupeEkv" + - "atorialna GvinejaGrčijaJužna Georgia in Južni Sandwichevi otokiGvatemala" + - "GuamGvineja BissauGvajanaPosebno administrativno območje LR Kitajske Hon" + - "gkongHeardov otok in McDonaldovi otokiHondurasHrvaškaHaitiMadžarskaKanar" + - "ski otokiIndonezijaIrskaIzraelOtok ManIndijaBritansko ozemlje v Indijske" + - "m oceanuIrakIranIslandijaItalijaJerseyJamajkaJordanijaJaponskaKenijaKirg" + - "izistanKambodžaKiribatiKomoriSaint Kitts in NevisSeverna KorejaJužna Kor" + - "ejaKuvajtKajmanski otokiKazahstanLaosLibanonSaint LuciaLihtenštajnŠrilan" + - "kaLiberijaLesotoLitvaLuksemburgLatvijaLibijaMarokoMonakoMoldavijaČrna go" + - "raSaint MartinMadagaskarMarshallovi otokiMakedonijaMaliMjanmar (Burma)Mo" + - "ngolijaPosebno administrativno območje LR Kitajske MacaoSeverni Mariansk" + - "i otokiMartinikMavretanijaMontserratMaltaMauritiusMaldiviMalaviMehikaMal" + - "ezijaMozambikNamibijaNova KaledonijaNigerNorfolški otokNigerijaNikaragva" + - "NizozemskaNorveškaNepalNauruNiueNova ZelandijaOmanPanamaPeruFrancoska Po" + - "linezijaPapua Nova GvinejaFilipiniPakistanPoljskaSaint Pierre in Miquelo" + - "nPitcairnPortorikoPalestinsko ozemljePortugalskaPalauParagvajKatarOstala" + - " oceanijaReunionRomunijaSrbijaRusijaRuandaSaudova ArabijaSalomonovi otok" + - "iSejšeliSudanŠvedskaSingapurSveta HelenaSlovenijaSvalbard in Jan MayenSl" + - "ovaškaSierra LeoneSan MarinoSenegalSomalijaSurinamJužni SudanSao Tome in" + - " PrincipeSalvadorSint MaartenSirijaSvaziTristan da CunhaOtoki Turks in C" + - "aicosČadFrancosko južno ozemljeTogoTajskaTadžikistanTokelauTimor-LesteTu" + - "rkmenistanTunizijaTongaTurčijaTrinidad in TobagoTuvaluTajvanTanzanijaUkr" + - "ajinaUgandaStranski zunanji otoki Združenih državZdruženi narodiZdružene" + - " države AmerikeUrugvajUzbekistanVatikanSaint Vincent in GrenadineVenezue" + - "laBritanski Deviški otokiAmeriški Deviški otokiVietnamVanuatuWallis in F" + - "utunaSamoaKosovoJemenMayotteJužnoafriška republikaZambijaZimbabveNeznano" + - " ali neveljavno območjeSvetAfrikaSeverna AmerikaJužna AmerikaOceanijaZah" + - "odna AfrikaSrednja AmerikaVzhodna AfrikaSeverna AfrikaSrednja AfrikaJužn" + - "a AfrikaAmerikesevernoameriška celinaKaribiVzhodna AzijaJužna AzijaJugov" + - "zhodna AzijaJužna EvropaAvstralija in Nova ZelandijaMelanezijamikronezij" + - "ska regijaPolinezijaAzijaOsrednja AzijaZahodna AzijaEvropaVzhodna Evropa" + - "Severna EvropaZahodna EvropaLatinska Amerika" - -var slRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000e, 0x0014, 0x002d, 0x0037, 0x0049, 0x0050, 0x0058, - 0x0060, 0x0066, 0x0070, 0x0079, 0x0088, 0x0090, 0x009a, 0x009f, - 0x00ae, 0x00ba, 0x00ce, 0x00d6, 0x00e0, 0x00e7, 0x00f3, 0x00fc, - 0x0103, 0x010a, 0x010f, 0x0120, 0x0127, 0x012d, 0x0135, 0x0146, - 0x014f, 0x0155, 0x015a, 0x0167, 0x016e, 0x0178, 0x017e, 0x0184, - 0x0192, 0x01af, 0x01ca, 0x01dd, 0x01e3, 0x01f7, 0x0204, 0x0209, - 0x0210, 0x0218, 0x0221, 0x0230, 0x0239, 0x023d, 0x024e, 0x0256, - 0x0264, 0x0269, 0x0270, 0x0278, 0x0284, 0x028c, 0x0292, 0x029a, - // Entry 40 - 7F - 0x02b0, 0x02b9, 0x02c9, 0x02d0, 0x02d8, 0x02dd, 0x02eb, 0x02f3, - 0x02fb, 0x0303, 0x0311, 0x0311, 0x0317, 0x031d, 0x032e, 0x0339, - 0x0345, 0x034d, 0x0352, 0x0366, 0x036d, 0x0374, 0x0385, 0x038d, - 0x0391, 0x039a, 0x03a5, 0x03ac, 0x03b3, 0x03bc, 0x03d0, 0x03d7, - 0x0401, 0x040a, 0x040e, 0x041c, 0x0423, 0x0458, 0x0479, 0x0481, - 0x0489, 0x048e, 0x0498, 0x04a6, 0x04b0, 0x04b5, 0x04bb, 0x04c3, - 0x04c9, 0x04ed, 0x04f1, 0x04f5, 0x04fe, 0x0505, 0x050b, 0x0512, - 0x051b, 0x0523, 0x0529, 0x0534, 0x053d, 0x0545, 0x054b, 0x055f, - // Entry 80 - BF - 0x056d, 0x057a, 0x0580, 0x058f, 0x0598, 0x059c, 0x05a3, 0x05ae, - 0x05ba, 0x05c3, 0x05cb, 0x05d1, 0x05d6, 0x05e0, 0x05e7, 0x05ed, - 0x05f3, 0x05f9, 0x0602, 0x060c, 0x0618, 0x0622, 0x0633, 0x063d, - 0x0641, 0x0650, 0x0659, 0x068b, 0x06a2, 0x06aa, 0x06b5, 0x06bf, - 0x06c4, 0x06cd, 0x06d4, 0x06da, 0x06e0, 0x06e8, 0x06f0, 0x06f8, - 0x0707, 0x070c, 0x071b, 0x0723, 0x072c, 0x0736, 0x073f, 0x0744, - 0x0749, 0x074d, 0x075b, 0x075f, 0x0765, 0x0769, 0x077d, 0x078f, - 0x0797, 0x079f, 0x07a6, 0x07be, 0x07c6, 0x07cf, 0x07e2, 0x07ed, - // Entry C0 - FF - 0x07f2, 0x07fa, 0x07ff, 0x080e, 0x0815, 0x081d, 0x0823, 0x0829, - 0x082f, 0x083e, 0x084e, 0x0856, 0x085b, 0x0863, 0x086b, 0x0877, - 0x0880, 0x0895, 0x089e, 0x08aa, 0x08b4, 0x08bb, 0x08c3, 0x08ca, - 0x08d6, 0x08ea, 0x08f2, 0x08fe, 0x0904, 0x0909, 0x0919, 0x092e, - 0x0932, 0x094a, 0x094e, 0x0954, 0x0960, 0x0967, 0x0972, 0x097e, - 0x0986, 0x098b, 0x0993, 0x09a5, 0x09ab, 0x09b1, 0x09ba, 0x09c2, - 0x09c8, 0x09f0, 0x0a00, 0x0a19, 0x0a20, 0x0a2a, 0x0a31, 0x0a4b, - 0x0a54, 0x0a6c, 0x0a84, 0x0a8b, 0x0a92, 0x0aa2, 0x0aa7, 0x0aad, - // Entry 100 - 13F - 0x0ab2, 0x0ab9, 0x0ad1, 0x0ad8, 0x0ae0, 0x0aff, 0x0b03, 0x0b09, - 0x0b18, 0x0b26, 0x0b2e, 0x0b3c, 0x0b4b, 0x0b59, 0x0b67, 0x0b75, - 0x0b82, 0x0b89, 0x0ba0, 0x0ba6, 0x0bb3, 0x0bbf, 0x0bd0, 0x0bdd, - 0x0bf9, 0x0c03, 0x0c17, 0x0c21, 0x0c26, 0x0c34, 0x0c41, 0x0c47, - 0x0c55, 0x0c63, 0x0c71, 0x0c81, -} // Size: 608 bytes - -const sqRegionStr string = "" + // Size: 3064 bytes - "Ishulli AsenshionAndorrëEmiratet e Bashkuara ArabeAfganistanAntigua e Ba" + - "rbudaAnguilëShqipëriArmeniAngolëAntarktikëArgjentinëSamoa AmerikaneAustr" + - "iAustraliArubëIshujt AlandëAzerbajxhanBosnjë-HercegovinëBarbadosBanglade" + - "shBelgjikëBurkina-FasoBullgariBahrejnBurundiBeninShën BartolomeuBermudëB" + - "runeiBoliviKaraibet holandezeBrazilBahamasButanIshulli Bove’BotsvanëBjel" + - "lorusiBelizëKanadaIshujt KokosKongo-KinshasaRepubika e Afrikës QendroreK" + - "ongo-BrazavilëZvicërCôte d’IvoireIshujt KukKiliKamerunKinëKolumbiIshulli" + - " KlipërtonKosta-RikëKubëKepi i GjelbërKuraçaoIshulli i KrishtlindjesQipr" + - "oÇekiGjermaniDiego-GarsiaXhibutiDanimarkëDominikëRepublika DominikaneAlg" + - "jeriTheuta e MelilaEkuadorEstoniEgjiptSaharaja PerëndimoreEritreSpanjëEt" + - "iopiBashkimi EuropianFinlandëFixhiIshujt FalklandMikroneziIshujt FaroeFr" + - "ancëGabonMbretëria e BashkuarGrenadëGjeorgjiGuajana FrancezeGernsejGanëG" + - "jibraltarGrenlandëGambiaGuineGuadalupeGuineja EkuatorialeGreqiXhorxha Ju" + - "gore dhe Ishujt Senduiçë të JugutGuatemalëGuamGuine-BisauGuajanëRVAK i H" + - "ong KongutIshulli Hërd dhe Ishujt MekdonaldHondurasKroaciHaitiHungariIsh" + - "ujt KanarieIndoneziIrlandëIzraelIshulli i ManitIndiTerritori Britanik i " + - "Oqeanit IndianIrakIranIslandëItaliXhersejXhamajkëJordaniJaponiKeniaKirgi" + - "stanKamboxhiaKiribatiKomoreShën Kits dhe NevisKoreja e VeriutKoreja e Ju" + - "gutKuvajtIshujt KajmanKazakistanLaosLibanShën-LuçiaLihtenshtajnSri-Lankë" + - "LiberiLesotoLituaniLuksemburgLetoniLibiMarokMonakoMoldaviMal i ZiShën-Ma" + - "rtinMadagaskarIshujt MarshallMaqedoniMaliMianmar (Burma)MongoliRVAK i Ma" + - "kaosIshujt e Marianës VerioreMartinikëMauritaniMontseratMaltëMauritiusMa" + - "ldiveMalaviMeksikëMalajziMozambikNamibiKaledonia e ReNigerIshulli Norfol" + - "kNigeriNikaraguaHolandëNorvegjiNepalNauruNiueZelandë e ReOmanPanamaPeruP" + - "olinezia FrancezePapua Guineja e ReFilipinePakistanPoloniShën Pier dhe M" + - "ikelonIshujt PitkernPorto-RikoTerritoret PalestinezePortugaliPalauParagu" + - "aiKatarOqeania e Largët (Lindja e Largët)ReunionRumaniSerbiRusiRuandëAra" + - "bia SauditeIshujt SolomonSejshelleSudanSuediSingaporShën-HelenëSlloveniS" + - "valbard e Jan-MajenSllovakiSiera-LeoneSan-MarinoSenegalSomaliSurinamiSud" + - "ani i JugutSao-Tome e PrinsipeSalvadorSint MartenSiriSvazilandëTristan-d" + - "a-KunaIshujt Turks dhe KaikosÇadTerritoret Jugore FrancezeTogoTajlandëTa" + - "xhikistanTokelauTimor-LesteTurkmenistanTuniziTongaTurqiTrinidad e Tobago" + - "TuvaluTajvanTanzaniUkrainëUgandëIshujt periferikë të SHBA-sëkombet e bas" + - "hkuaraShtetet e Bashkuara të AmerikësUruguaiUzbekistanVatikanShën Vincen" + - "t dhe GrenadineVenezuelëIshujt e Virgjër BritanikëIshujt e Virgjër Ameri" + - "kanëVietnamVanuatuUollis e FutunaSamoaKosovëJemenMajotëAfrika e JugutZam" + - "biaZimbabveI panjohurBotaAfrikëAmerika e VeriutAmerika e JugutOqeaniAfri" + - "ka PerëndimoreAmerika QendroreAfrika LindoreAfrika VerioreAfrika e Mesme" + - "Afrika JugoreAmerikëAmerika VerioreKaraibeAzia LindoreAzia JugoreAzia Ju" + - "glindoreEuropa JugoreAustralaziaMelaneziaRajoni MikronezianPolineziaAziA" + - "zia QendroreAzia PerëndimoreEuropëEuropa LindoreEuropa VerioreEuropa Per" + - "ëndimoreAmerika Latine" - -var sqRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0011, 0x0019, 0x0033, 0x003d, 0x004e, 0x0056, 0x005f, - 0x0065, 0x006c, 0x0077, 0x0082, 0x0091, 0x0097, 0x009f, 0x00a5, - 0x00b3, 0x00be, 0x00d2, 0x00da, 0x00e4, 0x00ed, 0x00f9, 0x0101, - 0x0108, 0x010f, 0x0114, 0x0124, 0x012c, 0x0132, 0x0138, 0x014a, - 0x0150, 0x0157, 0x015c, 0x016b, 0x0174, 0x017e, 0x0185, 0x018b, - 0x0197, 0x01a5, 0x01c1, 0x01d1, 0x01d8, 0x01e8, 0x01f2, 0x01f6, - 0x01fd, 0x0202, 0x0209, 0x021b, 0x0226, 0x022b, 0x023a, 0x0242, - 0x0259, 0x025e, 0x0263, 0x026b, 0x0277, 0x027e, 0x0288, 0x0291, - // Entry 40 - 7F - 0x02a5, 0x02ac, 0x02bb, 0x02c2, 0x02c8, 0x02ce, 0x02e3, 0x02e9, - 0x02f0, 0x02f6, 0x0307, 0x0307, 0x0310, 0x0315, 0x0324, 0x032d, - 0x0339, 0x0340, 0x0345, 0x035a, 0x0362, 0x036a, 0x037a, 0x0381, - 0x0386, 0x0390, 0x039a, 0x03a0, 0x03a5, 0x03ae, 0x03c1, 0x03c6, - 0x03f4, 0x03fe, 0x0402, 0x040d, 0x0415, 0x0427, 0x0449, 0x0451, - 0x0457, 0x045c, 0x0463, 0x0471, 0x0479, 0x0481, 0x0487, 0x0496, - 0x049a, 0x04bd, 0x04c1, 0x04c5, 0x04cd, 0x04d2, 0x04d9, 0x04e2, - 0x04e9, 0x04ef, 0x04f4, 0x04fd, 0x0506, 0x050e, 0x0514, 0x0528, - // Entry 80 - BF - 0x0537, 0x0545, 0x054b, 0x0558, 0x0562, 0x0566, 0x056b, 0x0577, - 0x0583, 0x058d, 0x0593, 0x0599, 0x05a0, 0x05aa, 0x05b0, 0x05b4, - 0x05b9, 0x05bf, 0x05c6, 0x05ce, 0x05da, 0x05e4, 0x05f3, 0x05fb, - 0x05ff, 0x060e, 0x0615, 0x0622, 0x063c, 0x0646, 0x064f, 0x0658, - 0x065e, 0x0667, 0x066e, 0x0674, 0x067c, 0x0683, 0x068b, 0x0691, - 0x069f, 0x06a4, 0x06b3, 0x06b9, 0x06c2, 0x06ca, 0x06d2, 0x06d7, - 0x06dc, 0x06e0, 0x06ed, 0x06f1, 0x06f7, 0x06fb, 0x070d, 0x071f, - 0x0727, 0x072f, 0x0735, 0x074b, 0x0759, 0x0763, 0x0779, 0x0782, - // Entry C0 - FF - 0x0787, 0x078f, 0x0794, 0x07b8, 0x07bf, 0x07c5, 0x07ca, 0x07ce, - 0x07d5, 0x07e3, 0x07f1, 0x07fa, 0x07ff, 0x0804, 0x080c, 0x0819, - 0x0821, 0x0835, 0x083d, 0x0848, 0x0852, 0x0859, 0x085f, 0x0867, - 0x0875, 0x0888, 0x0890, 0x089b, 0x089f, 0x08aa, 0x08b9, 0x08d0, - 0x08d4, 0x08ee, 0x08f2, 0x08fb, 0x0906, 0x090d, 0x0918, 0x0924, - 0x092a, 0x092f, 0x0934, 0x0945, 0x094b, 0x0951, 0x0958, 0x0960, - 0x0967, 0x0986, 0x0998, 0x09b9, 0x09c0, 0x09ca, 0x09d1, 0x09ec, - 0x09f6, 0x0a12, 0x0a2e, 0x0a35, 0x0a3c, 0x0a4b, 0x0a50, 0x0a57, - // Entry 100 - 13F - 0x0a5c, 0x0a63, 0x0a71, 0x0a77, 0x0a7f, 0x0a89, 0x0a8d, 0x0a94, - 0x0aa4, 0x0ab3, 0x0ab9, 0x0acc, 0x0adc, 0x0aea, 0x0af8, 0x0b06, - 0x0b13, 0x0b1b, 0x0b2a, 0x0b31, 0x0b3d, 0x0b48, 0x0b57, 0x0b64, - 0x0b6f, 0x0b78, 0x0b8a, 0x0b93, 0x0b96, 0x0ba3, 0x0bb4, 0x0bbb, - 0x0bc9, 0x0bd7, 0x0bea, 0x0bf8, -} // Size: 608 bytes - -const srRegionStr string = "" + // Size: 5976 bytes - "Острво АсенсионАндораУједињени Арапски ЕмиратиАвганистанАнтигва и Барбуд" + - "аАнгвилаАлбанијаЈерменијаАнголаАнтарктикАргентинаАмеричка СамоаАустрија" + - "АустралијаАрубаОландска ОстрваАзербејџанБосна и ХерцеговинаБарбадосБанг" + - "ладешБелгијаБуркина ФасоБугарскаБахреинБурундиБенинСен БартелемиБермуда" + - "БрунејБоливијаКарипска ХоландијаБразилБахамиБутанОстрво БувеБоцванаБело" + - "русијаБелизеКанадаКокосова (Килингова) ОстрваКонго - КиншасаЦентралноаф" + - "ричка РепубликаКонго - БразавилШвајцарскаОбала СлоновачеКукова ОстрваЧи" + - "леКамерунКинаКолумбијаОстрво КлипертонКостарикаКубаЗеленортска ОстрваКу" + - "расаоБожићно ОстрвоКипарЧешкаНемачкаДијего ГарсијаЏибутиДанскаДоминикаД" + - "оминиканска РепубликаАлжирСеута и МелиљаЕквадорЕстонијаЕгипатЗападна Са" + - "хараЕритрејаШпанијаЕтиопијаЕвропска УнијаФинскаФиџиФокландска ОстрваМик" + - "ронезијаФарска ОстрваФранцускаГабонУједињено КраљевствоГренадаГрузијаФр" + - "анцуска ГвајанаГернзиГанаГибралтарГренландГамбијаГвинејаГваделупЕкватор" + - "ијална ГвинејаГрчкаЈужна Џорџија и Јужна Сендвичка ОстрваГватемалаГуамГ" + - "винеја-БисаоГвајанаСАР Хонгконг (Кина)Острво Херд и Мекдоналдова острва" + - "ХондурасХрватскаХаитиМађарскаКанарска ОстрваИндонезијаИрскаИзраелОстрво" + - " МанИндијаБританска територија Индијског океанаИракИранИсландИталијаЏерз" + - "иЈамајкаЈорданЈапанКенијаКиргистанКамбоџаКирибатиКоморска ОстрваСент Ки" + - "тс и НевисСеверна КорејаЈужна КорејаКувајтКајманска ОстрваКазахстанЛаос" + - "ЛибанСвета ЛуцијаЛихтенштајнШри ЛанкаЛиберијаЛесотоЛитванијаЛуксембургЛ" + - "етонијаЛибијаМарокоМонакоМолдавијаЦрна ГораСвети Мартин (Француска)Мада" + - "гаскарМаршалска ОстрваМакедонијаМалиМијанмар (Бурма)МонголијаСАР Макао " + - "(Кина)Северна Маријанска ОстрваМартиникМауританијаМонсератМалтаМаурицију" + - "сМалдивиМалавиМексикоМалезијаМозамбикНамибијаНова КаледонијаНигерОстрво" + - " НорфокНигеријаНикарагваХоландијаНорвешкаНепалНауруНиуеНови ЗеландОманПа" + - "намаПеруФранцуска ПолинезијаПапуа Нова ГвинејаФилипиниПакистанПољскаСен" + - " Пјер и МикелонПиткернПорторикоПалестинске територијеПортугалијаПалауПар" + - "агвајКатарОкеанија (удаљена острва)РеинионРумунијаСрбијаРусијаРуандаСау" + - "дијска АрабијаСоломонска ОстрваСејшелиСуданШведскаСингапурСвета ЈеленаС" + - "ловенијаСвалбард и Јан МајенСловачкаСијера ЛеонеСан МариноСенегалСомали" + - "јаСуринамЈужни СуданСао Томе и ПринципеСалвадорСвети Мартин (Холандија)" + - "СиријаСвазилендТристан да КуњаОстрва Туркс и КаикосЧадФранцуске Јужне Т" + - "ериторијеТогоТајландТаџикистанТокелауИсточни ТиморТуркменистанТунисТонг" + - "аТурскаТринидад и ТобагоТувалуТајванТанзанијаУкрајинаУгандаУдаљена остр" + - "ва САДУједињене нацијеСједињене ДржавеУругвајУзбекистанВатиканСент Винс" + - "ент и ГренадиниВенецуелаБританска Девичанска ОстрваАмеричка Девичанска " + - "ОстрваВијетнамВануатуВалис и ФутунаСамоаКосовоЈеменМајотЈужноафричка Ре" + - "публикаЗамбијаЗимбабвеНепознат регионсветАфрикаСеверноамерички континен" + - "тЈужна АмерикаОкеанијаЗападна АфрикаЦентрална АмерикаИсточна АфрикаСеве" + - "рна АфрикаЦентрална АфрикаЈужна АфрикаСеверна и Јужна АмерикаСеверна Ам" + - "ерикаКарибиИсточна АзијаЈужна АзијаЈугоисточна АзијаЈужна ЕвропаАустрал" + - "ија и Нови ЗеландМеланезијаМикронезијски регионПолинезијаАзијаЦентрална" + - " АзијаЗападна АзијаЕвропаИсточна ЕвропаСеверна ЕвропаЗападна ЕвропаЛатин" + - "ска Америка" - -var srRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001d, 0x0029, 0x0059, 0x006d, 0x008d, 0x009b, 0x00ab, - 0x00bd, 0x00c9, 0x00db, 0x00ed, 0x0108, 0x0118, 0x012c, 0x0136, - 0x0153, 0x0167, 0x018b, 0x019b, 0x01ad, 0x01bb, 0x01d2, 0x01e2, - 0x01f0, 0x01fe, 0x0208, 0x0221, 0x022f, 0x023b, 0x024b, 0x026e, - 0x027a, 0x0286, 0x0290, 0x02a5, 0x02b3, 0x02c7, 0x02d3, 0x02df, - 0x0311, 0x032c, 0x035f, 0x037c, 0x0390, 0x03ad, 0x03c6, 0x03ce, - 0x03dc, 0x03e4, 0x03f6, 0x0415, 0x0427, 0x042f, 0x0452, 0x0460, - 0x047b, 0x0485, 0x048f, 0x049d, 0x04b8, 0x04c4, 0x04d0, 0x04e0, - // Entry 40 - 7F - 0x050b, 0x0515, 0x052f, 0x053d, 0x054d, 0x0559, 0x0574, 0x0584, - 0x0592, 0x05a2, 0x05bd, 0x05bd, 0x05c9, 0x05d1, 0x05f2, 0x0608, - 0x0621, 0x0633, 0x063d, 0x0664, 0x0672, 0x0680, 0x06a1, 0x06ad, - 0x06b5, 0x06c7, 0x06d7, 0x06e5, 0x06f3, 0x0703, 0x072c, 0x0736, - 0x077d, 0x078f, 0x0797, 0x07b0, 0x07be, 0x07e0, 0x081e, 0x082e, - 0x083e, 0x0848, 0x0858, 0x0875, 0x0889, 0x0893, 0x089f, 0x08b2, - 0x08be, 0x0905, 0x090d, 0x0915, 0x0921, 0x092f, 0x0939, 0x0947, - 0x0953, 0x095d, 0x0969, 0x097b, 0x0989, 0x0999, 0x09b6, 0x09d5, - // Entry 80 - BF - 0x09f0, 0x0a07, 0x0a13, 0x0a32, 0x0a44, 0x0a4c, 0x0a56, 0x0a6d, - 0x0a83, 0x0a94, 0x0aa4, 0x0ab0, 0x0ac2, 0x0ad6, 0x0ae6, 0x0af2, - 0x0afe, 0x0b0a, 0x0b1c, 0x0b2d, 0x0b59, 0x0b6d, 0x0b8c, 0x0ba0, - 0x0ba8, 0x0bc5, 0x0bd7, 0x0bf3, 0x0c23, 0x0c33, 0x0c49, 0x0c59, - 0x0c63, 0x0c77, 0x0c85, 0x0c91, 0x0c9f, 0x0caf, 0x0cbf, 0x0ccf, - 0x0cec, 0x0cf6, 0x0d0f, 0x0d1f, 0x0d31, 0x0d43, 0x0d53, 0x0d5d, - 0x0d67, 0x0d6f, 0x0d84, 0x0d8c, 0x0d98, 0x0da0, 0x0dc7, 0x0de9, - 0x0df9, 0x0e09, 0x0e15, 0x0e36, 0x0e44, 0x0e56, 0x0e81, 0x0e97, - // Entry C0 - FF - 0x0ea1, 0x0eb1, 0x0ebb, 0x0ee9, 0x0ef7, 0x0f07, 0x0f13, 0x0f1f, - 0x0f2b, 0x0f4c, 0x0f6d, 0x0f7b, 0x0f85, 0x0f93, 0x0fa3, 0x0fba, - 0x0fcc, 0x0ff1, 0x1001, 0x1018, 0x102b, 0x1039, 0x1049, 0x1057, - 0x106c, 0x108f, 0x109f, 0x10cb, 0x10d7, 0x10e9, 0x1105, 0x112c, - 0x1132, 0x1164, 0x116c, 0x117a, 0x118e, 0x119c, 0x11b5, 0x11cd, - 0x11d7, 0x11e1, 0x11ed, 0x120d, 0x1219, 0x1225, 0x1237, 0x1247, - 0x1253, 0x1275, 0x1294, 0x12b3, 0x12c1, 0x12d5, 0x12e3, 0x1310, - 0x1322, 0x1356, 0x1388, 0x1398, 0x13a6, 0x13c0, 0x13ca, 0x13d6, - // Entry 100 - 13F - 0x13e0, 0x13ea, 0x1415, 0x1423, 0x1433, 0x1450, 0x1458, 0x1464, - 0x1495, 0x14ae, 0x14be, 0x14d9, 0x14fa, 0x1515, 0x1530, 0x154f, - 0x1566, 0x1591, 0x15ae, 0x15ba, 0x15d3, 0x15e8, 0x1609, 0x1620, - 0x164d, 0x1661, 0x1688, 0x169c, 0x16a6, 0x16c3, 0x16dc, 0x16e8, - 0x1703, 0x171e, 0x1739, 0x1758, -} // Size: 608 bytes - -const srLatnRegionStr string = "" + // Size: 3143 bytes - "Ostrvo AsensionAndoraUjedinjeni Arapski EmiratiAvganistanAntigva i Barbu" + - "daAngvilaAlbanijaJermenijaAngolaAntarktikArgentinaAmerička SamoaAustrija" + - "AustralijaArubaOlandska OstrvaAzerbejdžanBosna i HercegovinaBarbadosBang" + - "ladešBelgijaBurkina FasoBugarskaBahreinBurundiBeninSen BartelemiBermudaB" + - "runejBolivijaKaripska HolandijaBrazilBahamiButanOstrvo BuveBocvanaBeloru" + - "sijaBelizeKanadaKokosova (Kilingova) OstrvaKongo - KinšasaCentralnoafrič" + - "ka RepublikaKongo - BrazavilŠvajcarskaObala SlonovačeKukova OstrvaČileKa" + - "merunKinaKolumbijaOstrvo KlipertonKostarikaKubaZelenortska OstrvaKurasao" + - "Božićno OstrvoKiparČeškaNemačkaDijego GarsijaDžibutiDanskaDominikaDomini" + - "kanska RepublikaAlžirSeuta i MeliljaEkvadorEstonijaEgipatZapadna SaharaE" + - "ritrejaŠpanijaEtiopijaEvropska UnijaFinskaFidžiFoklandska OstrvaMikronez" + - "ijaFarska OstrvaFrancuskaGabonUjedinjeno KraljevstvoGrenadaGruzijaFrancu" + - "ska GvajanaGernziGanaGibraltarGrenlandGambijaGvinejaGvadelupEkvatorijaln" + - "a GvinejaGrčkaJužna Džordžija i Južna Sendvička OstrvaGvatemalaGuamGvine" + - "ja-BisaoGvajanaSAR Hongkong (Kina)Ostrvo Herd i Mekdonaldova ostrvaHondu" + - "rasHrvatskaHaitiMađarskaKanarska OstrvaIndonezijaIrskaIzraelOstrvo ManIn" + - "dijaBritanska teritorija Indijskog okeanaIrakIranIslandItalijaDžerziJama" + - "jkaJordanJapanKenijaKirgistanKambodžaKiribatiKomorska OstrvaSent Kits i " + - "NevisSeverna KorejaJužna KorejaKuvajtKajmanska OstrvaKazahstanLaosLibanS" + - "veta LucijaLihtenštajnŠri LankaLiberijaLesotoLitvanijaLuksemburgLetonija" + - "LibijaMarokoMonakoMoldavijaCrna GoraSveti Martin (Francuska)MadagaskarMa" + - "ršalska OstrvaMakedonijaMaliMijanmar (Burma)MongolijaSAR Makao (Kina)Sev" + - "erna Marijanska OstrvaMartinikMauritanijaMonseratMaltaMauricijusMaldiviM" + - "alaviMeksikoMalezijaMozambikNamibijaNova KaledonijaNigerOstrvo NorfokNig" + - "erijaNikaragvaHolandijaNorveškaNepalNauruNiueNovi ZelandOmanPanamaPeruFr" + - "ancuska PolinezijaPapua Nova GvinejaFilipiniPakistanPoljskaSen Pjer i Mi" + - "kelonPitkernPortorikoPalestinske teritorijePortugalijaPalauParagvajKatar" + - "Okeanija (udaljena ostrva)ReinionRumunijaSrbijaRusijaRuandaSaudijska Ara" + - "bijaSolomonska OstrvaSejšeliSudanŠvedskaSingapurSveta JelenaSlovenijaSva" + - "lbard i Jan MajenSlovačkaSijera LeoneSan MarinoSenegalSomalijaSurinamJuž" + - "ni SudanSao Tome i PrincipeSalvadorSveti Martin (Holandija)SirijaSvazile" + - "ndTristan da KunjaOstrva Turks i KaikosČadFrancuske Južne TeritorijeTogo" + - "TajlandTadžikistanTokelauIstočni TimorTurkmenistanTunisTongaTurskaTrinid" + - "ad i TobagoTuvaluTajvanTanzanijaUkrajinaUgandaUdaljena ostrva SADUjedinj" + - "ene nacijeSjedinjene DržaveUrugvajUzbekistanVatikanSent Vinsent i Grenad" + - "iniVenecuelaBritanska Devičanska OstrvaAmerička Devičanska OstrvaVijetna" + - "mVanuatuValis i FutunaSamoaKosovoJemenMajotJužnoafrička RepublikaZambija" + - "ZimbabveNepoznat regionsvetAfrikaSevernoamerički kontinentJužna AmerikaO" + - "keanijaZapadna AfrikaCentralna AmerikaIstočna AfrikaSeverna AfrikaCentra" + - "lna AfrikaJužna AfrikaSeverna i Južna AmerikaSeverna AmerikaKaribiIstočn" + - "a AzijaJužna AzijaJugoistočna AzijaJužna EvropaAustralija i Novi ZelandM" + - "elanezijaMikronezijski regionPolinezijaAzijaCentralna AzijaZapadna Azija" + - "EvropaIstočna EvropaSeverna EvropaZapadna EvropaLatinska Amerika" - -var srLatnRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000f, 0x0015, 0x002f, 0x0039, 0x004a, 0x0051, 0x0059, - 0x0062, 0x0068, 0x0071, 0x007a, 0x0089, 0x0091, 0x009b, 0x00a0, - 0x00af, 0x00bb, 0x00ce, 0x00d6, 0x00e0, 0x00e7, 0x00f3, 0x00fb, - 0x0102, 0x0109, 0x010e, 0x011b, 0x0122, 0x0128, 0x0130, 0x0142, - 0x0148, 0x014e, 0x0153, 0x015e, 0x0165, 0x016f, 0x0175, 0x017b, - 0x0196, 0x01a6, 0x01c1, 0x01d1, 0x01dc, 0x01ec, 0x01f9, 0x01fe, - 0x0205, 0x0209, 0x0212, 0x0222, 0x022b, 0x022f, 0x0241, 0x0248, - 0x0258, 0x025d, 0x0264, 0x026c, 0x027a, 0x0282, 0x0288, 0x0290, - // Entry 40 - 7F - 0x02a6, 0x02ac, 0x02bb, 0x02c2, 0x02ca, 0x02d0, 0x02de, 0x02e6, - 0x02ee, 0x02f6, 0x0304, 0x0304, 0x030a, 0x0310, 0x0321, 0x032c, - 0x0339, 0x0342, 0x0347, 0x035d, 0x0364, 0x036b, 0x037c, 0x0382, - 0x0386, 0x038f, 0x0397, 0x039e, 0x03a5, 0x03ad, 0x03c2, 0x03c8, - 0x03f5, 0x03fe, 0x0402, 0x040f, 0x0416, 0x0429, 0x044a, 0x0452, - 0x045a, 0x045f, 0x0468, 0x0477, 0x0481, 0x0486, 0x048c, 0x0496, - 0x049c, 0x04c1, 0x04c5, 0x04c9, 0x04cf, 0x04d6, 0x04dd, 0x04e4, - 0x04ea, 0x04ef, 0x04f5, 0x04fe, 0x0507, 0x050f, 0x051e, 0x052f, - // Entry 80 - BF - 0x053d, 0x054a, 0x0550, 0x0560, 0x0569, 0x056d, 0x0572, 0x057e, - 0x058a, 0x0594, 0x059c, 0x05a2, 0x05ab, 0x05b5, 0x05bd, 0x05c3, - 0x05c9, 0x05cf, 0x05d8, 0x05e1, 0x05f9, 0x0603, 0x0614, 0x061e, - 0x0622, 0x0632, 0x063b, 0x064b, 0x0664, 0x066c, 0x0677, 0x067f, - 0x0684, 0x068e, 0x0695, 0x069b, 0x06a2, 0x06aa, 0x06b2, 0x06ba, - 0x06c9, 0x06ce, 0x06db, 0x06e3, 0x06ec, 0x06f5, 0x06fe, 0x0703, - 0x0708, 0x070c, 0x0717, 0x071b, 0x0721, 0x0725, 0x0739, 0x074b, - 0x0753, 0x075b, 0x0762, 0x0774, 0x077b, 0x0784, 0x079a, 0x07a5, - // Entry C0 - FF - 0x07aa, 0x07b2, 0x07b7, 0x07d1, 0x07d8, 0x07e0, 0x07e6, 0x07ec, - 0x07f2, 0x0803, 0x0814, 0x081c, 0x0821, 0x0829, 0x0831, 0x083d, - 0x0846, 0x085a, 0x0863, 0x086f, 0x0879, 0x0880, 0x0888, 0x088f, - 0x089b, 0x08ae, 0x08b6, 0x08ce, 0x08d4, 0x08dd, 0x08ed, 0x0902, - 0x0906, 0x0921, 0x0925, 0x092c, 0x0938, 0x093f, 0x094d, 0x0959, - 0x095e, 0x0963, 0x0969, 0x097a, 0x0980, 0x0986, 0x098f, 0x0997, - 0x099d, 0x09b0, 0x09c1, 0x09d3, 0x09da, 0x09e4, 0x09eb, 0x0a03, - 0x0a0c, 0x0a28, 0x0a44, 0x0a4c, 0x0a53, 0x0a61, 0x0a66, 0x0a6c, - // Entry 100 - 13F - 0x0a71, 0x0a76, 0x0a8e, 0x0a95, 0x0a9d, 0x0aac, 0x0ab0, 0x0ab6, - 0x0ad0, 0x0ade, 0x0ae6, 0x0af4, 0x0b05, 0x0b14, 0x0b22, 0x0b32, - 0x0b3f, 0x0b57, 0x0b66, 0x0b6c, 0x0b7a, 0x0b86, 0x0b98, 0x0ba5, - 0x0bbd, 0x0bc7, 0x0bdb, 0x0be5, 0x0bea, 0x0bf9, 0x0c06, 0x0c0c, - 0x0c1b, 0x0c29, 0x0c37, 0x0c47, -} // Size: 608 bytes - -const svRegionStr string = "" + // Size: 2921 bytes - "AscensionAndorraFörenade ArabemiratenAfghanistanAntigua och BarbudaAngui" + - "llaAlbanienArmenienAngolaAntarktisArgentinaAmerikanska SamoaÖsterrikeAus" + - "tralienArubaÅlandAzerbajdzjanBosnien och HercegovinaBarbadosBangladeshBe" + - "lgienBurkina FasoBulgarienBahrainBurundiBeninS:t BarthélemyBermudaBrunei" + - "BoliviaKaribiska NederländernaBrasilienBahamasBhutanBouvetönBotswanaVitr" + - "ysslandBelizeKanadaKokosöarnaKongo-KinshasaCentralafrikanska republikenK" + - "ongo-BrazzavilleSchweizElfenbenskustenCooköarnaChileKamerunKinaColombiaC" + - "lippertonönCosta RicaKubaKap VerdeCuraçaoJulönCypernTjeckienTysklandDieg" + - "o GarciaDjiboutiDanmarkDominicaDominikanska republikenAlgerietCeuta och " + - "MelillaEcuadorEstlandEgyptenVästsaharaEritreaSpanienEtiopienEuropeiska u" + - "nionenFinlandFijiFalklandsöarnaMikronesienFäröarnaFrankrikeGabonStorbrit" + - "annienGrenadaGeorgienFranska GuyanaGuernseyGhanaGibraltarGrönlandGambiaG" + - "uineaGuadeloupeEkvatorialguineaGreklandSydgeorgien och SydsandwichöarnaG" + - "uatemalaGuamGuinea-BissauGuyanaHongkong, S.A.R. KinaHeardön och McDonald" + - "öarnaHondurasKroatienHaitiUngernKanarieöarnaIndonesienIrlandIsraelIsle " + - "of ManIndienBrittiska territoriet i Indiska oceanenIrakIranIslandItalien" + - "JerseyJamaicaJordanienJapanKenyaKirgizistanKambodjaKiribatiKomorernaS:t " + - "Kitts och NevisNordkoreaSydkoreaKuwaitCaymanöarnaKazakstanLaosLibanonS:t" + - " LuciaLiechtensteinSri LankaLiberiaLesothoLitauenLuxemburgLettlandLibyen" + - "MarockoMonacoMoldavienMontenegroSaint-MartinMadagaskarMarshallöarnaMaked" + - "onienMaliMyanmar (Burma)MongolietMacao, S.A.R. KinaNordmarianernaMartini" + - "queMauretanienMontserratMaltaMauritiusMaldivernaMalawiMexikoMalaysiaMoça" + - "mbiqueNamibiaNya KaledonienNigerNorfolkönNigeriaNicaraguaNederländernaNo" + - "rgeNepalNauruNiueNya ZeelandOmanPanamaPeruFranska PolynesienPapua Nya Gu" + - "ineaFilippinernaPakistanPolenS:t Pierre och MiquelonPitcairnöarnaPuerto " + - "RicoPalestinska territoriernaPortugalPalauParaguayQataryttre öar i Ocean" + - "ienRéunionRumänienSerbienRysslandRwandaSaudiarabienSalomonöarnaSeychelle" + - "rnaSudanSverigeSingaporeS:t HelenaSlovenienSvalbard och Jan MayenSlovaki" + - "enSierra LeoneSan MarinoSenegalSomaliaSurinamSydsudanSão Tomé och Prínci" + - "peEl SalvadorSint MaartenSyrienSwazilandTristan da CunhaTurks- och Caico" + - "söarnaTchadFranska sydterritoriernaTogoThailandTadzjikistanTokelauÖsttim" + - "orTurkmenistanTunisienTongaTurkietTrinidad och TobagoTuvaluTaiwanTanzani" + - "aUkrainaUgandaUSA:s yttre öarFörenta NationernaUSAUruguayUzbekistanVatik" + - "anstatenS:t Vincent och GrenadinernaVenezuelaBrittiska JungfruöarnaAmeri" + - "kanska JungfruöarnaVietnamVanuatuWallis- och FutunaöarnaSamoaKosovoJemen" + - "MayotteSydafrikaZambiaZimbabweokänd regionvärldenAfrikaNordamerikaSydame" + - "rikaOceanienVästafrikaCentralamerikaÖstafrikaNordafrikaCentralafrikasödr" + - "a AfrikaNord- och Sydamerikanorra AmerikaKaribienÖstasienSydasienSydosta" + - "sienSydeuropaAustralasienMelanesienMikronesiska öarnaPolynesienAsienCent" + - "ralasienVästasienEuropaÖsteuropaNordeuropaVästeuropaLatinamerika" - -var svRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x0010, 0x0026, 0x0031, 0x0044, 0x004c, 0x0054, - 0x005c, 0x0062, 0x006b, 0x0074, 0x0085, 0x008f, 0x0099, 0x009e, - 0x00a4, 0x00b0, 0x00c7, 0x00cf, 0x00d9, 0x00e0, 0x00ec, 0x00f5, - 0x00fc, 0x0103, 0x0108, 0x0117, 0x011e, 0x0124, 0x012b, 0x0143, - 0x014c, 0x0153, 0x0159, 0x0162, 0x016a, 0x0175, 0x017b, 0x0181, - 0x018c, 0x019a, 0x01b6, 0x01c7, 0x01ce, 0x01dd, 0x01e7, 0x01ec, - 0x01f3, 0x01f7, 0x01ff, 0x020c, 0x0216, 0x021a, 0x0223, 0x022b, - 0x0231, 0x0237, 0x023f, 0x0247, 0x0253, 0x025b, 0x0262, 0x026a, - // Entry 40 - 7F - 0x0281, 0x0289, 0x029a, 0x02a1, 0x02a8, 0x02af, 0x02ba, 0x02c1, - 0x02c8, 0x02d0, 0x02e2, 0x02e2, 0x02e9, 0x02ed, 0x02fc, 0x0307, - 0x0311, 0x031a, 0x031f, 0x032d, 0x0334, 0x033c, 0x034a, 0x0352, - 0x0357, 0x0360, 0x0369, 0x036f, 0x0375, 0x037f, 0x038f, 0x0397, - 0x03b8, 0x03c1, 0x03c5, 0x03d2, 0x03d8, 0x03ed, 0x0408, 0x0410, - 0x0418, 0x041d, 0x0423, 0x0430, 0x043a, 0x0440, 0x0446, 0x0451, - 0x0457, 0x047e, 0x0482, 0x0486, 0x048c, 0x0493, 0x0499, 0x04a0, - 0x04a9, 0x04ae, 0x04b3, 0x04be, 0x04c6, 0x04ce, 0x04d7, 0x04ea, - // Entry 80 - BF - 0x04f3, 0x04fb, 0x0501, 0x050d, 0x0516, 0x051a, 0x0521, 0x052a, - 0x0537, 0x0540, 0x0547, 0x054e, 0x0555, 0x055e, 0x0566, 0x056c, - 0x0573, 0x0579, 0x0582, 0x058c, 0x0598, 0x05a2, 0x05b0, 0x05ba, - 0x05be, 0x05cd, 0x05d6, 0x05e8, 0x05f6, 0x0600, 0x060b, 0x0615, - 0x061a, 0x0623, 0x062d, 0x0633, 0x0639, 0x0641, 0x064c, 0x0653, - 0x0661, 0x0666, 0x0670, 0x0677, 0x0680, 0x068e, 0x0693, 0x0698, - 0x069d, 0x06a1, 0x06ac, 0x06b0, 0x06b6, 0x06ba, 0x06cc, 0x06dc, - 0x06e8, 0x06f0, 0x06f5, 0x070c, 0x071a, 0x0725, 0x073e, 0x0746, - // Entry C0 - FF - 0x074b, 0x0753, 0x0758, 0x076d, 0x0775, 0x077e, 0x0785, 0x078d, - 0x0793, 0x079f, 0x07ac, 0x07b8, 0x07bd, 0x07c4, 0x07cd, 0x07d7, - 0x07e0, 0x07f6, 0x07ff, 0x080b, 0x0815, 0x081c, 0x0823, 0x082a, - 0x0832, 0x084a, 0x0855, 0x0861, 0x0867, 0x0870, 0x0880, 0x0897, - 0x089c, 0x08b4, 0x08b8, 0x08c0, 0x08cc, 0x08d3, 0x08dc, 0x08e8, - 0x08f0, 0x08f5, 0x08fc, 0x090f, 0x0915, 0x091b, 0x0923, 0x092a, - 0x0930, 0x0940, 0x0953, 0x0956, 0x095d, 0x0967, 0x0974, 0x0990, - 0x0999, 0x09b0, 0x09c9, 0x09d0, 0x09d7, 0x09ef, 0x09f4, 0x09fa, - // Entry 100 - 13F - 0x09ff, 0x0a06, 0x0a0f, 0x0a15, 0x0a1d, 0x0a2a, 0x0a32, 0x0a38, - 0x0a43, 0x0a4d, 0x0a55, 0x0a60, 0x0a6e, 0x0a78, 0x0a82, 0x0a8f, - 0x0a9c, 0x0ab0, 0x0abd, 0x0ac5, 0x0ace, 0x0ad6, 0x0ae1, 0x0aea, - 0x0af6, 0x0b00, 0x0b13, 0x0b1d, 0x0b22, 0x0b2e, 0x0b38, 0x0b3e, - 0x0b48, 0x0b52, 0x0b5d, 0x0b69, -} // Size: 608 bytes - -const swRegionStr string = "" + // Size: 3116 bytes - "Kisiwa cha AscensionAndoraFalme za KiarabuAfghanistanAntigua na BarbudaA" + - "nguillaAlbaniaArmeniaAngolaAntaktikaAjentinaSamoa ya MarekaniAustriaAust" + - "raliaArubaVisiwa vya AlandiAzerbaijanBosnia na HezegovinaBabadosiBanglad" + - "eshiUbelgijiBukinafasoBulgariaBahareniBurundiBeninSantabathelemiBermudaB" + - "runeiBoliviaUholanzi ya KaribianiBraziliBahamaBhutanKisiwa cha BouvetBot" + - "swanaBelarusiBelizeKanadaVisiwa vya Cocos (Keeling)Jamhuri ya Kidemokras" + - "ia ya KongoJamhuri ya Afrika ya KatiKongo - BrazzavilleUswisiCôte d’Ivoi" + - "reVisiwa vya CookChileKameruniChinaKolombiaKisiwa cha ClippertonKostarik" + - "aKubaCape VerdeKurakaoKisiwa cha KrismasiCyprusChechiaUjerumaniDiego Gar" + - "ciaJibutiDenmarkDominikaJamhuri ya DominikaAljeriaCeuta na MelillaEkwado" + - "EstoniaMisriSahara MagharibiEritreaHispaniaEthiopiaUmoja wa UlayaUfiniFi" + - "jiVisiwa vya FalklandMikronesiaVisiwa vya FaroeUfaransaGabonUingerezaGre" + - "nadaJojiaGwiyana ya UfaransaGuernseyGhanaJibraltaGrinlandiGambiaGineGuad" + - "eloupeGinekwetaUgirikiJojia Kusini na Visiwa vya Sandwich KusiniGuatemal" + - "aGuamGinebisauGuyanaHong Kong SAR ChinaKisiwa cha Heard na Visiwa vya Mc" + - "DonaldHondurasiKorasiaHaitiHungariaVisiwa vya KanariIndonesiaAyalandiIsr" + - "aeliIsle of ManIndiaEneo la Uingereza katika Bahari HindiIrakiIranAislan" + - "diItaliaJerseyJamaikaJordanJapaniKenyaKirigizistaniKambodiaKiribatiKomor" + - "oSantakitzi na NevisKorea KaskaziniKorea KusiniKuwaitVisiwa vya KaymanKa" + - "zakistaniLaosiLebanonSantalusiaLiechtensteinSri LankaLiberiaLesotoLithua" + - "niaLuxembourgLatviaLibyaMoroccoMonakoMoldovaMontenegroSaint MartinMadaga" + - "skaVisiwa vya MarshallMacedoniaMaliMyanmar (Burma)MongoliaMacau SAR Chin" + - "aVisiwa vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMoris" + - "iMaldivesMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNigerKisiwa cha " + - "NorfolkNigeriaNikaragwaUholanziNorwayNepalNauruNiueNyuzilandiOmanPanamaP" + - "eruPolinesia ya UfaransaPapua New GuineaUfilipinoPakistaniPolandiSantapi" + - "erre na MiquelonVisiwa vya PitcairnPuerto RicoMaeneo ya PalestinaUrenoPa" + - "lauParagwaiQatarOceania ya NjeRiyunioniRomaniaSerbiaUrusiRwandaSaudiaVis" + - "iwa vya SolomonUshelisheliSudanUswidiSingaporeSantahelenaSloveniaSvalbar" + - "d na Jan MayenSlovakiaSiera LeoniSan MarinoSenegaliSomaliaSurinamuSudan " + - "KusiniSão Tomé na PríncipeElsavadoSint MaartenSyriaUswaziTristan da Cunh" + - "aVisiwa vya Turki na KaikoChadMaeneo ya Kusini ya UfaransaTogoTailandiTa" + - "jikistaniTokelauTimor-LesteTurukimenistaniTunisiaTongaUturukiTrinidad na" + - " TobagoTuvaluTaiwanTanzaniaUkraineUgandaVisiwa Vidogo vya Nje vya Mareka" + - "niUmoja wa MataifaMarekaniUrugwaiUzibekistaniVatikaniSantavisenti na Gre" + - "nadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa vya Virgin vya Mare" + - "kaniVietnamVanuatuWalis na FutunaSamoaKosovoYemeniMayotteAfrika KusiniZa" + - "mbiaZimbabweEneo lisilojulikanaDuniaAfrikaAmerika KaskaziniAmerika Kusin" + - "iOceaniaAfrika ya MagharibiAmerika ya KatiAfrika ya MasharikiAfrika ya K" + - "askaziniAfrika ya KatiAfrika ya KusiniAmerikaAmerika ya KaskaziniKaribia" + - "niAsia ya MasharikiAsia ya KusiniAsia ya Kusini MasharikiUlaya ya Kusini" + - "AustralasiaMelanesiaEneo la MikronesiaPolynesiaAsiaAsia ya KatiAsia ya M" + - "agharibiUlayaUlaya ya MasharikiUlaya ya KaskaziniUlaya ya MagharibiAmeri" + - "ka ya Kilatini" - -var swRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0014, 0x001a, 0x002a, 0x0035, 0x0047, 0x004f, 0x0056, - 0x005d, 0x0063, 0x006c, 0x0074, 0x0085, 0x008c, 0x0095, 0x009a, - 0x00ab, 0x00b5, 0x00c9, 0x00d1, 0x00dc, 0x00e4, 0x00ee, 0x00f6, - 0x00fe, 0x0105, 0x010a, 0x0118, 0x011f, 0x0125, 0x012c, 0x0141, - 0x0148, 0x014e, 0x0154, 0x0165, 0x016d, 0x0175, 0x017b, 0x0181, - 0x019b, 0x01bb, 0x01d4, 0x01e7, 0x01ed, 0x01fd, 0x020c, 0x0211, - 0x0219, 0x021e, 0x0226, 0x023b, 0x0244, 0x0248, 0x0252, 0x0259, - 0x026c, 0x0272, 0x0279, 0x0282, 0x028e, 0x0294, 0x029b, 0x02a3, - // Entry 40 - 7F - 0x02b6, 0x02bd, 0x02cd, 0x02d3, 0x02da, 0x02df, 0x02ef, 0x02f6, - 0x02fe, 0x0306, 0x0314, 0x0314, 0x0319, 0x031d, 0x0330, 0x033a, - 0x034a, 0x0352, 0x0357, 0x0360, 0x0367, 0x036c, 0x037f, 0x0387, - 0x038c, 0x0394, 0x039d, 0x03a3, 0x03a7, 0x03b1, 0x03ba, 0x03c1, - 0x03eb, 0x03f4, 0x03f8, 0x0401, 0x0407, 0x041a, 0x0441, 0x044a, - 0x0451, 0x0456, 0x045e, 0x046f, 0x0478, 0x0480, 0x0487, 0x0492, - 0x0497, 0x04bc, 0x04c1, 0x04c5, 0x04cd, 0x04d3, 0x04d9, 0x04e0, - 0x04e6, 0x04ec, 0x04f1, 0x04fe, 0x0506, 0x050e, 0x0514, 0x0527, - // Entry 80 - BF - 0x0536, 0x0542, 0x0548, 0x0559, 0x0564, 0x0569, 0x0570, 0x057a, - 0x0587, 0x0590, 0x0597, 0x059d, 0x05a6, 0x05b0, 0x05b6, 0x05bb, - 0x05c2, 0x05c8, 0x05cf, 0x05d9, 0x05e5, 0x05ee, 0x0601, 0x060a, - 0x060e, 0x061d, 0x0625, 0x0634, 0x0654, 0x065d, 0x0666, 0x0671, - 0x0676, 0x067c, 0x0684, 0x068a, 0x0691, 0x0698, 0x06a0, 0x06a7, - 0x06b3, 0x06b8, 0x06ca, 0x06d1, 0x06da, 0x06e2, 0x06e8, 0x06ed, - 0x06f2, 0x06f6, 0x0700, 0x0704, 0x070a, 0x070e, 0x0723, 0x0733, - 0x073c, 0x0745, 0x074c, 0x0763, 0x0776, 0x0781, 0x0794, 0x0799, - // Entry C0 - FF - 0x079e, 0x07a6, 0x07ab, 0x07b9, 0x07c2, 0x07c9, 0x07cf, 0x07d4, - 0x07da, 0x07e0, 0x07f2, 0x07fd, 0x0802, 0x0808, 0x0811, 0x081c, - 0x0824, 0x0839, 0x0841, 0x084c, 0x0856, 0x085e, 0x0865, 0x086d, - 0x0879, 0x0890, 0x0898, 0x08a4, 0x08a9, 0x08af, 0x08bf, 0x08d8, - 0x08dc, 0x08f8, 0x08fc, 0x0904, 0x090f, 0x0916, 0x0921, 0x0930, - 0x0937, 0x093c, 0x0943, 0x0955, 0x095b, 0x0961, 0x0969, 0x0970, - 0x0976, 0x0998, 0x09a8, 0x09b0, 0x09b7, 0x09c3, 0x09cb, 0x09e4, - 0x09ed, 0x0a0c, 0x0a2a, 0x0a31, 0x0a38, 0x0a47, 0x0a4c, 0x0a52, - // Entry 100 - 13F - 0x0a58, 0x0a5f, 0x0a6c, 0x0a72, 0x0a7a, 0x0a8d, 0x0a92, 0x0a98, - 0x0aa9, 0x0ab7, 0x0abe, 0x0ad1, 0x0ae0, 0x0af3, 0x0b06, 0x0b14, - 0x0b24, 0x0b2b, 0x0b3f, 0x0b48, 0x0b59, 0x0b67, 0x0b7f, 0x0b8e, - 0x0b99, 0x0ba2, 0x0bb4, 0x0bbd, 0x0bc1, 0x0bcd, 0x0bde, 0x0be3, - 0x0bf5, 0x0c07, 0x0c19, 0x0c2c, -} // Size: 608 bytes - -const taRegionStr string = "" + // Size: 9545 bytes - "அஷன்ஷியன் தீவுஅன்டோராஐக்கிய அரபு எமிரேட்ஸ்ஆப்கானிஸ்தான்ஆண்டிகுவா மற்றும்" + - " பார்புடாஅங்குய்லாஅல்பேனியாஅர்மேனியாஅங்கோலாஅண்டார்டிகாஅர்ஜென்டினாஅமெரிக்" + - "க சமோவாஆஸ்திரியாஆஸ்திரேலியாஅரூபாஆலந்து தீவுகள்அசர்பைஜான்போஸ்னியா & ஹெர" + - "்ஸகோவினாபார்படோஸ்பங்களாதேஷ்பெல்ஜியம்புர்கினா ஃபாஸோபல்கேரியாபஹ்ரைன்புரு" + - "ண்டிபெனின்செயின்ட் பார்தேலெமிபெர்முடாபுருனேபொலிவியாகரீபியன் நெதர்லாந்த" + - "ுபிரேசில்பஹாமாஸ்பூடான்பொவேட் தீவுகள்போட்ஸ்வானாபெலாரூஸ்பெலிஸ்கனடாகோகோஸ்" + - " (கீலிங்) தீவுகள்காங்கோ - கின்ஷாசாமத்திய ஆப்ரிக்கக் குடியரசுகாங்கோ - ப்ர" + - "ாஸாவில்லேஸ்விட்சர்லாந்துகோட் தி’வாயர்குக் தீவுகள்சிலிகேமரூன்சீனாகொலம்ப" + - "ியாகிலிப்பர்டன் தீவுகோஸ்டாரிகாகியூபாகேப் வெர்டேகுராகவ்கிறிஸ்துமஸ் தீவு" + - "சைப்ரஸ்செசியாஜெர்மனிடியகோ கார்ஷியாஜிபௌட்டிடென்மார்க்டொமினிகாடொமினிகன் " + - "குடியரசுஅல்ஜீரியாசியூடா & மெலில்லாஈக்வடார்எஸ்டோனியாஎகிப்துமேற்கு சஹாரா" + - "எரிட்ரியாஸ்பெயின்எத்தியோப்பியாஐரோப்பிய யூனியன்பின்லாந்துஃபிஜிஃபாக்லாந்" + - "து தீவுகள்மைக்ரோனேஷியாஃபாரோ தீவுகள்பிரான்ஸ்கேபான்யுனைடெட் கிங்டம்கிரனெ" + - "டாஜார்ஜியாபிரெஞ்சு கயானாகெர்ன்சிகானாஜிப்ரால்டர்கிரீன்லாந்துகாம்பியாகின" + - "ியாக்வாதேலோப்ஈக்வடோரியல் கினியாகிரீஸ்தெற்கு ஜார்ஜியா மற்றும் தெற்கு சா" + - "ண்ட்விச் தீவுகள்கவுதமாலாகுவாம்கினியா-பிஸ்ஸாவ்கயானாஹாங்காங் எஸ்ஏஆர் சீன" + - "ாஹேர்ட் மற்றும் மெக்டொனால்டு தீவுகள்ஹோண்டூராஸ்குரேஷியாஹைட்டிஹங்கேரிகேன" + - "ரி தீவுகள்இந்தோனேசியாஅயர்லாந்துஇஸ்ரேல்ஐல் ஆஃப் மேன்இந்தியாபிரிட்டிஷ் இ" + - "ந்தியப் பெருங்கடல் பிரதேசம்ஈராக்ஈரான்ஐஸ்லாந்துஇத்தாலிஜெர்சிஜமைகாஜோர்டா" + - "ன்ஜப்பான்கென்யாகிர்கிஸ்தான்கம்போடியாகிரிபாட்டிகோமரோஸ்செயின்ட் கிட்ஸ் &" + - " நெவிஸ்வட கொரியாதென் கொரியாகுவைத்கெய்மென் தீவுகள்கஸகஸ்தான்லாவோஸ்லெபனான்ச" + - "ெயின்ட் லூசியாலிச்செண்ஸ்டெய்ன்இலங்கைலைபீரியாலெசோதோலிதுவேனியாலக்ஸ்சம்பர" + - "்க்லாட்வியாலிபியாமொராக்கோமொனாக்கோமால்டோவாமான்டேனெக்ரோசெயின்ட் மார்ட்டீ" + - "ன்மடகாஸ்கர்மார்ஷல் தீவுகள்மாசிடோனியாமாலிமியான்மார் (பர்மா)மங்கோலியாமகா" + - "வ் எஸ்ஏஆர் சீனாவடக்கு மரியானா தீவுகள்மார்டினிக்மௌரிடானியாமாண்ட்செராட்ம" + - "ால்டாமொரிசியஸ்மாலத்தீவுமலாவிமெக்சிகோமலேசியாமொசாம்பிக்நமீபியாநியூ கேலிட" + - "ோனியாநைஜர்நார்ஃபோக் தீவுகள்நைஜீரியாநிகரகுவாநெதர்லாந்துநார்வேநேபாளம்நௌர" + - "ுநியூநியூசிலாந்துஓமன்பனாமாபெருபிரெஞ்சு பாலினேஷியாபப்புவா நியூ கினியாபி" + - "லிப்பைன்ஸ்பாகிஸ்தான்போலந்துசெயின்ட் பியர் & மிக்வேலான்பிட்கெய்ர்ன் தீவ" + - "ுகள்பியூர்டோ ரிகோபாலஸ்தீனிய பிரதேசங்கள்போர்ச்சுக்கல்பாலோபராகுவேகத்தார்" + - "வெளிப்புற ஓஷியானியாரீயூனியன்ருமேனியாசெர்பியாரஷ்யாருவாண்டாசவூதி அரேபியா" + - "சாலமன் தீவுகள்சீஷெல்ஸ்சூடான்ஸ்வீடன்சிங்கப்பூர்செயின்ட் ஹெலெனாஸ்லோவேனிய" + - "ாஸ்வல்பார்டு & ஜான் மேயன்ஸ்லோவாகியாசியாரா லியோன்சான் மரினோசெனெகல்சோமால" + - "ியாசுரினாம்தெற்கு சூடான்சாவ் தோம் & ப்ரின்சிபிஎல் சால்வடார்சின்ட் மார்" + - "டென்சிரியாஸ்வாஸிலாந்துடிரிஸ்டன் டா குன்ஹாடர்க்ஸ் & கைகோஸ் தீவுகள்சாட்ப" + - "ிரெஞ்சு தெற்கு பிரதேசங்கள்டோகோதாய்லாந்துதஜிகிஸ்தான்டோகேலோதைமூர்-லெஸ்தே" + - "துர்க்மெனிஸ்தான்டுனிசியாடோங்காதுருக்கிடிரினிடாட் & டொபாகோதுவாலூதைவான்த" + - "ான்சானியாஉக்ரைன்உகாண்டாயூ.எஸ். வெளிப்புறத் தீவுகள்ஐக்கிய நாடுகள்அமெரிக" + - "்காஉருகுவேஉஸ்பெகிஸ்தான்வாடிகன் நகரம்செயின்ட் வின்சென்ட் & கிரெனடைன்ஸ்வ" + - "ெனிசுலாபிரிட்டீஷ் கன்னித் தீவுகள்யூ.எஸ். கன்னித் தீவுகள்வியட்நாம்வனுவா" + - "ட்டுவாலிஸ் மற்றும் ஃபுடுனாசமோவாகொசோவோஏமன்மயோட்தென் ஆப்பிரிக்காஜாம்பியா" + - "ஜிம்பாப்வேஅறியப்படாத பிரதேசம்உலகம்ஆப்ரிக்காவட அமெரிக்காதென் அமெரிக்காஓ" + - "ஷியானியாமேற்கு ஆப்ரிக்காமத்திய அமெரிக்காகிழக்கு ஆப்ரிக்காவடக்கு ஆப்ரிக" + - "்காமத்திய ஆப்ரிக்காதெற்கு ஆப்ரிக்காஅமெரிக்காஸ்வடக்கு அமெரிக்காகரீபியன்" + - "கிழக்காசியாதெற்காசியாதென்கிழக்காசியாதெற்கு ஐரோப்பாஆஸ்திரலேசியாமெலனேஷிய" + - "ாமைக்ரோ நேஷியா பிரதேசம்பாலினேஷியாஆசியாமத்திய ஆசியாமேற்காசியாஐரோப்பாகிழ" + - "க்கு ஐரோப்பாவடக்கு ஐரோப்பாமேற்கு ஐரோப்பாலத்தீன் அமெரிக்கா" - -var taRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0028, 0x003d, 0x0078, 0x009f, 0x00e9, 0x0104, 0x011f, - 0x013a, 0x014f, 0x0170, 0x0191, 0x01b9, 0x01d4, 0x01f5, 0x0204, - 0x022c, 0x024a, 0x0286, 0x02a1, 0x02bf, 0x02da, 0x0302, 0x031d, - 0x0332, 0x034a, 0x035c, 0x0393, 0x03ab, 0x03bd, 0x03d5, 0x040f, - 0x0427, 0x043c, 0x044e, 0x0476, 0x0494, 0x04ac, 0x04be, 0x04ca, - 0x0507, 0x0534, 0x057e, 0x05b7, 0x05e4, 0x0609, 0x062b, 0x0637, - 0x064c, 0x0658, 0x0673, 0x06a4, 0x06c2, 0x06d4, 0x06f3, 0x0708, - 0x0736, 0x074b, 0x075d, 0x0772, 0x079a, 0x07b2, 0x07d0, 0x07e8, - // Entry 40 - 7F - 0x081c, 0x0837, 0x0864, 0x087c, 0x0897, 0x08ac, 0x08ce, 0x08e9, - 0x0901, 0x0928, 0x0956, 0x0956, 0x0974, 0x0983, 0x09ba, 0x09de, - 0x0a03, 0x0a1b, 0x0a2d, 0x0a5b, 0x0a70, 0x0a88, 0x0ab0, 0x0ac8, - 0x0ad4, 0x0af5, 0x0b19, 0x0b31, 0x0b43, 0x0b61, 0x0b95, 0x0ba7, - 0x0c30, 0x0c48, 0x0c5a, 0x0c85, 0x0c94, 0x0ccf, 0x0d32, 0x0d50, - 0x0d68, 0x0d7a, 0x0d8f, 0x0db4, 0x0dd5, 0x0df3, 0x0e08, 0x0e2b, - 0x0e40, 0x0eaf, 0x0ebe, 0x0ecd, 0x0ee8, 0x0efd, 0x0f0f, 0x0f1e, - 0x0f36, 0x0f4b, 0x0f5d, 0x0f81, 0x0f9c, 0x0fba, 0x0fcf, 0x100f, - // Entry 80 - BF - 0x1028, 0x1047, 0x1059, 0x1087, 0x10a2, 0x10b4, 0x10c9, 0x10f4, - 0x1124, 0x1136, 0x114e, 0x1160, 0x117e, 0x11a5, 0x11bd, 0x11cf, - 0x11e7, 0x11ff, 0x1217, 0x123b, 0x1272, 0x128d, 0x12b8, 0x12d6, - 0x12e2, 0x1312, 0x132d, 0x135f, 0x139d, 0x13bb, 0x13d9, 0x13fd, - 0x140f, 0x142a, 0x1445, 0x1454, 0x146c, 0x1481, 0x149f, 0x14b4, - 0x14df, 0x14ee, 0x151f, 0x1537, 0x154f, 0x1570, 0x1582, 0x1597, - 0x15a3, 0x15af, 0x15d3, 0x15df, 0x15ee, 0x15fa, 0x1631, 0x1666, - 0x168a, 0x16a8, 0x16bd, 0x1706, 0x1740, 0x1765, 0x17a5, 0x17cc, - // Entry C0 - FF - 0x17d8, 0x17ed, 0x1802, 0x1839, 0x1854, 0x186c, 0x1884, 0x1893, - 0x18ab, 0x18d0, 0x18f8, 0x1910, 0x1922, 0x1937, 0x1958, 0x1983, - 0x19a1, 0x19e1, 0x19ff, 0x1a24, 0x1a40, 0x1a55, 0x1a6d, 0x1a85, - 0x1aaa, 0x1ae4, 0x1b09, 0x1b34, 0x1b46, 0x1b6a, 0x1b9f, 0x1bdf, - 0x1beb, 0x1c38, 0x1c44, 0x1c62, 0x1c83, 0x1c95, 0x1cba, 0x1cea, - 0x1d02, 0x1d14, 0x1d2c, 0x1d5f, 0x1d71, 0x1d83, 0x1da1, 0x1db6, - 0x1dcb, 0x1e14, 0x1e3c, 0x1e57, 0x1e6c, 0x1e93, 0x1eb8, 0x1f13, - 0x1f2b, 0x1f75, 0x1fb2, 0x1fcd, 0x1fe8, 0x2026, 0x2035, 0x2047, - // Entry 100 - 13F - 0x2053, 0x2062, 0x2090, 0x20a8, 0x20c6, 0x20fd, 0x210c, 0x2127, - 0x2149, 0x2171, 0x218c, 0x21ba, 0x21e8, 0x2219, 0x2247, 0x2275, - 0x22a3, 0x22c4, 0x22f2, 0x230a, 0x232b, 0x2349, 0x2376, 0x239e, - 0x23c2, 0x23dd, 0x241b, 0x2439, 0x2448, 0x246a, 0x2488, 0x249d, - 0x24c8, 0x24f0, 0x2518, 0x2549, -} // Size: 608 bytes - -const teRegionStr string = "" + // Size: 9307 bytes - "ఎసెషన్ దీవిఅండొర్రాయునైటెడ్ అరబ్ ఎమిరేట్స్ఆఫ్ఘనిస్తాన్ఆంటిగ్వా మరియు బార" + - "్బుడాఆంగవిల్లాఅల్బేనియాఆర్మేనియాఅంగోలాఅంటార్కటికాఅర్జెంటీనాఅమెరికన్ సమ" + - "ోవాఆస్ట్రియాఆస్ట్రేలియాఅరుబాఆలేండ్ దీవులుఅజర్బైజాన్బోస్నియా మరియు హెర్" + - "జెగొవీనాబార్బడోస్బంగ్లాదేశ్బెల్జియంబుర్కినా ఫాసోబల్గేరియాబహ్రెయిన్బురు" + - "ండిబెనిన్సెంట్ బర్తేలెమీబెర్ముడాబ్రూనైబొలీవియాకరీబియన్ నెదర్లాండ్స్బ్ర" + - "ెజిల్బహామాస్భూటాన్బొవెట్ దీవిబోట్స్వానాబెలారస్బెలిజ్కెనడాకోకోస్ (కీలిం" + - "గ్) దీవులుకాంగో- కిన్షాసాసెంట్రల్ ఆఫ్రికన్ రిపబ్లిక్కాంగో- బ్రాజావిల్ల" + - "ిస్విట్జర్లాండ్కోటెడ్ ఐవోయిర్కుక్ దీవులుచిలీకామెరూన్చైనాకొలంబియాక్లిప్" + - "పర్టన్ దీవికోస్టా రికాక్యూబాకేప్ వెర్డేకురాకవోక్రిస్మస్ దీవిసైప్రస్చెక" + - "్\u200cచియజర్మనీడియాగో గార్సియాజిబౌటిడెన్మార్క్డొమెనికాడొమెనికన్ రిపబ్" + - "లిక్అల్జీరియాస్యూటా & మెలిల్లాఈక్వడార్ఎస్టోనియాఈజిప్ట్పడమటి సహారాఎరిట్" + - "రియాస్పెయిన్ఇథియోపియాయూరోపియన్ యూనియన్ఫిన్లాండ్ఫిజీఫాక్\u200cల్యాండ్ ద" + - "ీవులుమైక్రోనేషియాఫారో దీవులుఫ్రాన్స్\u200cగాబన్యునైటెడ్ కింగ్\u200cడమ్" + - "గ్రెనెడాజార్జియాఫ్రెంచ్ గియానాగ్వేర్నసేఘనాజిబ్రాల్టార్గ్రీన్\u200cలాండ" + - "్గాంబియాగినియాగ్వాడేలోప్ఈక్వటోరియల్ గినియాగ్రీస్దక్షిణ జార్జియా & దక్ష" + - "ిణ శాండ్విచ్ దీవులుగ్వాటిమాలగ్వామ్గినియా-బిస్సావ్గయానాహాంకాంగ్ ఎస్ఏఆర్" + - " చైనాహెర్డ్ & మెక్ డొనాల్డ్ దీవులుహోండురాస్క్రోయేషియాహైటిహంగేరీకేనరీ దీవ" + - "ులుఇండోనేషియాఐర్లాండ్ఇజ్రాయిల్ఐల్ ఆఫ్ మాన్భారత దేశంబ్రిటీష్ భారతీయ సము" + - "ద్రపు ప్రాంతంఇరాక్ఇరాన్ఐస్లాండ్ఇటలీజెర్సీజమైకాజోర్డాన్జపాన్కెన్యాకిర్గ" + - "ిజిస్తాన్కంబోడియాకిరిబాటికొమొరోస్సెంట్ కిట్ట్స్ మరియు నెవిస్ఉత్తర కొరి" + - "యాదక్షిణ కొరియాకువైట్కేమాన్ దీవులుకజకస్తాన్లావోస్లెబనాన్సెంట్ లూసియాలి" + - "క్టెస్టేన్శ్రీలంకలైబీరియాలెసోతోలిథువేనియాలక్సంబర్గ్లాత్వియాలిబియామొరాక" + - "ోమొనాకోమోల్డోవామోంటేనేగ్రోసెంట్ మార్టిన్మడగాస్కర్మార్షల్ దీవులుమేసిడోన" + - "ియామాలిమయన్మార్ (బర్మా)మంగోలియామకావు ఎస్ఏఆర్ చైనాఉత్తర మరియానా దీవులుమ" + - "ార్టినిక్మౌరిటేనియామోంట్సేర్రాట్మాల్టామారిషస్మాల్దీవులుమాలావిమెక్సికోమ" + - "లేషియామొజాంబిక్నమీబియాక్రొత్త కాలెడోనియానైజర్నార్ఫోక్ దీవినైజీరియానికర" + - "ాగువానెదర్లాండ్స్నార్వేనేపాల్నౌరునియున్యూజిలాండ్ఒమన్పనామాపెరూఫ్రెంచ్ ప" + - "ోలినిషియాపాపువా న్యు గినియాఫిలిప్పీన్స్పాకిస్తాన్పోలాండ్సెంట్ పియెర్ మ" + - "రియు మికెలాన్పిట్\u200cకెయిర్న్ దీవులుఫ్యూర్టో రికోపాలస్తీనియన్ ప్రాంత" + - "ాలుపోర్చుగల్పలావుపరాగ్వేఖతర్ఒషీనియా బయటున్నవిరియూనియన్రోమానియాసెర్బియా" + - "రష్యారువాండాసౌదీ అరేబియాసోలమన్ దీవులుసీషెల్స్సూడాన్స్వీడన్సింగపూర్సెయి" + - "ంట్ హెలినాస్లోవేనియాస్వాల్బార్డ్ మరియు యాన్ మాయేన్స్లోవేకియాసియెర్రా ల" + - "ియాన్సాన్ మారినోసెనెగల్సోమాలియాసూరినామ్దక్షిణ సూడాన్సావోటోమ్ & ప్రిన్స" + - "ిపేఎల్ సాల్వడోర్సింట్ మార్టెన్సిరియాస్వాజిల్యాండ్ట్రిస్టన్ డ కన్హాతుర్" + - "క్ మరియు కాలికోస్ దీవులుచాద్ఫ్రెంచ్ దక్షిణ ప్రాంతాలుటోగోథాయిలాండ్తజికి" + - "స్తాన్టోకేలావ్టిమోర్-లెస్టెతుర్కమేనిస్తాన్ట్యునీషియాటోంగాటర్కీట్రినిడా" + - "డ్ మరియు టొబాగోటువాలుతైవాన్టాంజానియాఉక్రెయిన్ఉగాండాసంయుక్త రాజ్య అమెరి" + - "కా బయట ఉన్న దీవులుయునైటెడ్ నేషన్స్అమెరికా సంయుక్త రాష్ట్రాలుఊరుగ్వేఉజ్" + - "బెకిస్తాన్వాటికన్ నగరంసెంట్ విన్సెంట్ మరియు గ్రెనడీన్స్వెనుజులాబ్రిటిష" + - "్ వర్జిన్ దీవులుయు.ఎస్. వర్జిన్ దీవులువియత్నాంవనాటువాలిస్ & ఫ్యుత్యునా" + - "సమోవాకొసోవోయెమెన్మాయొట్టిదక్షిణ ఆఫ్రికాజాంబియాజింబాబ్వేతెలియని ప్రాంతం" + - "ప్రపంచంఆఫ్రికాఉత్తర అమెరికాదక్షిణ అమెరికాఓషినియాపశ్చిమ ఆఫ్రికా భూభాగంమ" + - "ధ్యమ అమెరికాతూర్పు ఆఫ్రికాఉత్తర ఆఫ్రికామధ్యమ ఆఫ్రికాదక్షిణ ఆఫ్రికా భూభ" + - "ాగంఅమెరికాస్ఉత్తర అమెరికా భూభాగంకరిబ్బియన్తూర్పు ఆసియాదక్షిణ ఆసియానైరు" + - "తి ఆసియాదక్షిణ యూరోప్ఆస్ట్రేలేసియామెలనేశియమైక్రోనేశియ ప్రాంతంపాలినేషియ" + - "ాఆసియామధ్య ఆసియాపడమటి ఆసియాయూరోప్తూర్పు యూరోప్ఉత్తర యూరోప్పశ్చిమ యూరోప" + - "్లాటిన్ అమెరికా" - -var teRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x001f, 0x0037, 0x0078, 0x009c, 0x00dd, 0x00f8, 0x0113, - 0x012e, 0x0140, 0x0161, 0x017f, 0x01a7, 0x01c2, 0x01e3, 0x01f2, - 0x0217, 0x0235, 0x0282, 0x029d, 0x02bb, 0x02d3, 0x02f8, 0x0313, - 0x032e, 0x0343, 0x0355, 0x0380, 0x0398, 0x03aa, 0x03c2, 0x03ff, - 0x0417, 0x042c, 0x043e, 0x045d, 0x047b, 0x0490, 0x04a2, 0x04b1, - 0x04ee, 0x0517, 0x0564, 0x0599, 0x05c3, 0x05eb, 0x060a, 0x0616, - 0x062e, 0x063a, 0x0652, 0x0683, 0x06a2, 0x06b4, 0x06d3, 0x06e8, - 0x0710, 0x0725, 0x073d, 0x074f, 0x077a, 0x078c, 0x07aa, 0x07c2, - // Entry 40 - 7F - 0x07f9, 0x0814, 0x0841, 0x0859, 0x0874, 0x0889, 0x08a8, 0x08c3, - 0x08db, 0x08f6, 0x0927, 0x0927, 0x0942, 0x094e, 0x0985, 0x09a9, - 0x09c8, 0x09e3, 0x09f2, 0x0a26, 0x0a3e, 0x0a56, 0x0a7e, 0x0a99, - 0x0aa2, 0x0ac6, 0x0aea, 0x0aff, 0x0b11, 0x0b2f, 0x0b63, 0x0b75, - 0x0be4, 0x0bff, 0x0c11, 0x0c3c, 0x0c4b, 0x0c86, 0x0cd3, 0x0cee, - 0x0d0c, 0x0d18, 0x0d2a, 0x0d4c, 0x0d6a, 0x0d82, 0x0d9d, 0x0dbd, - 0x0dd6, 0x0e30, 0x0e3f, 0x0e4e, 0x0e66, 0x0e72, 0x0e84, 0x0e93, - 0x0eab, 0x0eba, 0x0ecc, 0x0ef6, 0x0f0e, 0x0f26, 0x0f3e, 0x0f89, - // Entry 80 - BF - 0x0fab, 0x0fd0, 0x0fe2, 0x1007, 0x1022, 0x1034, 0x1049, 0x106b, - 0x108f, 0x10a4, 0x10bc, 0x10ce, 0x10ec, 0x110a, 0x1122, 0x1134, - 0x1146, 0x1158, 0x1170, 0x1191, 0x11b9, 0x11d4, 0x11fc, 0x121a, - 0x1226, 0x1250, 0x1268, 0x129a, 0x12d2, 0x12f0, 0x130e, 0x1335, - 0x1347, 0x135c, 0x137a, 0x138c, 0x13a4, 0x13b9, 0x13d4, 0x13e9, - 0x141d, 0x142c, 0x1451, 0x1469, 0x1484, 0x14a8, 0x14ba, 0x14cc, - 0x14d8, 0x14e4, 0x1505, 0x1511, 0x1520, 0x152c, 0x1560, 0x1592, - 0x15b6, 0x15d4, 0x15e9, 0x1634, 0x166e, 0x1693, 0x16d3, 0x16ee, - // Entry C0 - FF - 0x16fd, 0x1712, 0x171e, 0x174f, 0x176a, 0x1782, 0x179a, 0x17a9, - 0x17be, 0x17e0, 0x1805, 0x181d, 0x182f, 0x1844, 0x185c, 0x1884, - 0x18a2, 0x18f6, 0x1914, 0x193f, 0x195e, 0x1973, 0x198b, 0x19a3, - 0x19c8, 0x1a01, 0x1a26, 0x1a4e, 0x1a60, 0x1a87, 0x1ab6, 0x1b04, - 0x1b10, 0x1b54, 0x1b60, 0x1b7b, 0x1b9c, 0x1bb4, 0x1bd9, 0x1c06, - 0x1c24, 0x1c33, 0x1c42, 0x1c83, 0x1c95, 0x1ca7, 0x1cc2, 0x1cdd, - 0x1cef, 0x1d54, 0x1d82, 0x1dcc, 0x1de1, 0x1e08, 0x1e2a, 0x1e87, - 0x1e9f, 0x1ee0, 0x1f1a, 0x1f32, 0x1f41, 0x1f74, 0x1f83, 0x1f95, - // Entry 100 - 13F - 0x1fa7, 0x1fbf, 0x1fe7, 0x1ffc, 0x2017, 0x2042, 0x2057, 0x206c, - 0x2091, 0x20b9, 0x20ce, 0x2109, 0x212e, 0x2156, 0x217b, 0x21a0, - 0x21db, 0x21f6, 0x222e, 0x224c, 0x226e, 0x2290, 0x22b2, 0x22d7, - 0x22fe, 0x2316, 0x234d, 0x236b, 0x237a, 0x2396, 0x23b5, 0x23c7, - 0x23ec, 0x240e, 0x2433, 0x245b, -} // Size: 608 bytes - -const thRegionStr string = "" + // Size: 9006 bytes - "เกาะแอสเซนชันอันดอร์ราสหรัฐอาหรับเอมิเรตส์อัฟกานิสถานแอนติกาและบาร์บูดาแ" + - "องกวิลลาแอลเบเนียอาร์เมเนียแองโกลาแอนตาร์กติกาอาร์เจนตินาอเมริกันซามัว" + - "ออสเตรียออสเตรเลียอารูบาหมู่เกาะโอลันด์อาเซอร์ไบจานบอสเนียและเฮอร์เซโก" + - "วีนาบาร์เบโดสบังกลาเทศเบลเยียมบูร์กินาฟาโซบัลแกเรียบาห์เรนบุรุนดีเบนิน" + - "เซนต์บาร์เธเลมีเบอร์มิวดาบรูไนโบลิเวียเนเธอร์แลนด์แคริบเบียนบราซิลบาฮา" + - "มาสภูฏานเกาะบูเวตบอตสวานาเบลารุสเบลีซแคนาดาหมู่เกาะโคโคส (คีลิง)คองโก-" + - "กินชาซาสาธารณรัฐแอฟริกากลางคองโก-บราซซาวิลสวิตเซอร์แลนด์โกตดิวัวร์หมู่" + - "เกาะคุกชิลีแคเมอรูนจีนโคลอมเบียเกาะคลิปเปอร์ตันคอสตาริกาคิวบาเคปเวิร์ด" + - "คูราเซาเกาะคริสต์มาสไซปรัสเช็กเยอรมนีดิเอโกการ์เซียจิบูตีเดนมาร์กโดมิน" + - "ิกาสาธารณรัฐโดมินิกันแอลจีเรียเซวตาและเมลียาเอกวาดอร์เอสโตเนียอียิปต์ซ" + - "าฮาราตะวันตกเอริเทรียสเปนเอธิโอเปียสหภาพยุโรปฟินแลนด์ฟิจิหมู่เกาะฟอล์ก" + - "แลนด์ไมโครนีเซียหมู่เกาะแฟโรฝรั่งเศสกาบองสหราชอาณาจักรเกรเนดาจอร์เจียเ" + - "ฟรนช์เกียนาเกิร์นซีย์กานายิบรอลตาร์กรีนแลนด์แกมเบียกินีกวาเดอลูปอิเควท" + - "อเรียลกินีกรีซเกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิชกัวเตมาลากวมกิน" + - "ี-บิสเซากายอานาเขตปกครองพิเศษฮ่องกงแห่งสาธารณรัฐประชาชนจีนเกาะเฮิร์ดแล" + - "ะหมู่เกาะแมกดอนัลด์ฮอนดูรัสโครเอเชียเฮติฮังการีหมู่เกาะคานารีอินโดนีเซ" + - "ียไอร์แลนด์อิสราเอลเกาะแมนอินเดียบริติชอินเดียนโอเชียนเทร์ริทอรีอิรักอ" + - "ิหร่านไอซ์แลนด์อิตาลีเจอร์ซีย์จาเมกาจอร์แดนญี่ปุ่นเคนยาคีร์กีซสถานกัมพ" + - "ูชาคิริบาสคอโมโรสเซนต์คิตส์และเนวิสเกาหลีเหนือเกาหลีใต้คูเวตหมู่เกาะเค" + - "ย์แมนคาซัคสถานลาวเลบานอนเซนต์ลูเซียลิกเตนสไตน์ศรีลังกาไลบีเรียเลโซโทลิ" + - "ทัวเนียลักเซมเบิร์กลัตเวียลิเบียโมร็อกโกโมนาโกมอลโดวามอนเตเนโกรเซนต์มา" + - "ตินมาดากัสการ์หมู่เกาะมาร์แชลล์มาซิโดเนียมาลีเมียนมาร์ (พม่า)มองโกเลีย" + - "เขตปกครองพิเศษมาเก๊าแห่งสาธารณรัฐประชาชนจีนหมู่เกาะนอร์เทิร์นมาเรียนาม" + - "าร์ตินีกมอริเตเนียมอนต์เซอร์รัตมอลตามอริเชียสมัลดีฟส์มาลาวีเม็กซิโกมาเ" + - "ลเซียโมซัมบิกนามิเบียนิวแคลิโดเนียไนเจอร์เกาะนอร์ฟอล์กไนจีเรียนิการากั" + - "วเนเธอร์แลนด์นอร์เวย์เนปาลนาอูรูนีอูเอนิวซีแลนด์โอมานปานามาเปรูเฟรนช์โ" + - "ปลินีเซียปาปัวนิวกินีฟิลิปปินส์ปากีสถานโปแลนด์แซงปีแยร์และมีเกอลงหมู่เ" + - "กาะพิตแคร์นเปอร์โตริโกดินแดนปาเลสไตน์โปรตุเกสปาเลาปารากวัยกาตาร์เอาต์ไ" + - "ลอิงโอเชียเนียเรอูนียงโรมาเนียเซอร์เบียรัสเซียรวันดาซาอุดีอาระเบียหมู่" + - "เกาะโซโลมอนเซเชลส์ซูดานสวีเดนสิงคโปร์เซนต์เฮเลนาสโลวีเนียสฟาลบาร์และยา" + - "นไมเอนสโลวะเกียเซียร์ราลีโอนซานมารีโนเซเนกัลโซมาเลียซูรินาเมซูดานใต้เซ" + - "าตูเมและปรินซิปีเอลซัลวาดอร์เซนต์มาร์ตินซีเรียสวาซิแลนด์ทริสตัน เดอ คู" + - "นาหมู่เกาะเติกส์และหมู่เกาะเคคอสชาดเฟรนช์เซาเทิร์นเทร์ริทอรีส์โตโกไทยท" + - "าจิกิสถานโตเกเลาติมอร์-เลสเตเติร์กเมนิสถานตูนิเซียตองกาตุรกีตรินิแดดแล" + - "ะโตเบโกตูวาลูไต้หวันแทนซาเนียยูเครนยูกันดาหมู่เกาะรอบนอกของสหรัฐอเมริก" + - "าสหประชาชาติสหรัฐอเมริกาอุรุกวัยอุซเบกิสถานนครวาติกันเซนต์วินเซนต์และเ" + - "กรนาดีนส์เวเนซุเอลาหมู่เกาะบริติชเวอร์จินหมู่เกาะยูเอสเวอร์จินเวียดนาม" + - "วานูอาตูวาลลิสและฟุตูนาซามัวโคโซโวเยเมนมายอตแอฟริกาใต้แซมเบียซิมบับเวภ" + - "ูมิภาคที่ไม่รู้จักโลกแอฟริกาอเมริกาเหนืออเมริกาใต้โอเชียเนียแอฟริกาตะว" + - "ันตกอเมริกากลางแอฟริกาตะวันออกแอฟริกาเหนือแอฟริกากลางแอฟริกาตอนใต้อเมร" + - "ิกาอเมริกาตอนเหนือแคริบเบียนเอเชียตะวันออกเอเชียใต้เอเชียตะวันออกเฉียง" + - "ใต้ยุโรปใต้ออสตราเลเซียเมลานีเซียเขตไมโครนีเซียโปลินีเซียเอเชียเอเชียก" + - "ลางเอเชียตะวันตกยุโรปยุโรปตะวันออกยุโรปเหนือยุโรปตะวันตกละตินอเมริกา" - -var thRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0027, 0x0042, 0x007e, 0x009f, 0x00d5, 0x00f0, 0x010b, - 0x0129, 0x013e, 0x0162, 0x0183, 0x01aa, 0x01c2, 0x01e0, 0x01f2, - 0x021f, 0x0243, 0x0288, 0x02a3, 0x02be, 0x02d6, 0x02fa, 0x0315, - 0x032a, 0x033f, 0x034e, 0x037b, 0x0399, 0x03a8, 0x03c0, 0x0402, - 0x0414, 0x0429, 0x0438, 0x0453, 0x046b, 0x0480, 0x048f, 0x04a1, - 0x04da, 0x04ff, 0x053b, 0x0566, 0x0590, 0x05ae, 0x05cf, 0x05db, - 0x05f3, 0x05fc, 0x0617, 0x0647, 0x0662, 0x0671, 0x068c, 0x06a1, - 0x06c8, 0x06da, 0x06e6, 0x06fb, 0x0725, 0x0737, 0x074f, 0x0767, - // Entry 40 - 7F - 0x079d, 0x07b8, 0x07e2, 0x07fd, 0x0818, 0x082d, 0x0854, 0x086f, - 0x087b, 0x0899, 0x08b7, 0x08b7, 0x08cf, 0x08db, 0x0911, 0x0932, - 0x0956, 0x096e, 0x097d, 0x09a4, 0x09b9, 0x09d1, 0x09f5, 0x0a13, - 0x0a1f, 0x0a3d, 0x0a58, 0x0a6d, 0x0a79, 0x0a94, 0x0ac4, 0x0ad0, - 0x0b4b, 0x0b66, 0x0b6f, 0x0b8e, 0x0ba3, 0x0c24, 0x0c81, 0x0c99, - 0x0cb4, 0x0cc0, 0x0cd5, 0x0cff, 0x0d20, 0x0d3b, 0x0d53, 0x0d68, - 0x0d7d, 0x0dda, 0x0de9, 0x0dfe, 0x0e19, 0x0e2b, 0x0e46, 0x0e58, - 0x0e6d, 0x0e82, 0x0e91, 0x0eb2, 0x0ec7, 0x0edc, 0x0ef1, 0x0f27, - // Entry 80 - BF - 0x0f48, 0x0f63, 0x0f72, 0x0f9f, 0x0fba, 0x0fc3, 0x0fd8, 0x0ff9, - 0x101a, 0x1032, 0x104a, 0x105c, 0x1077, 0x109b, 0x10b0, 0x10c2, - 0x10da, 0x10ec, 0x1101, 0x111f, 0x113d, 0x115e, 0x1191, 0x11af, - 0x11bb, 0x11e5, 0x1200, 0x1281, 0x12cf, 0x12ea, 0x1308, 0x132f, - 0x133e, 0x1359, 0x1371, 0x1383, 0x139b, 0x13b3, 0x13cb, 0x13e3, - 0x140a, 0x141f, 0x1446, 0x145e, 0x1479, 0x149d, 0x14b5, 0x14c4, - 0x14d6, 0x14e8, 0x1506, 0x1515, 0x1527, 0x1533, 0x1563, 0x1587, - 0x15a5, 0x15bd, 0x15d2, 0x160b, 0x163b, 0x165c, 0x1689, 0x16a1, - // Entry C0 - FF - 0x16b0, 0x16c8, 0x16da, 0x1716, 0x172e, 0x1746, 0x1761, 0x1776, - 0x1788, 0x17b2, 0x17df, 0x17f4, 0x1803, 0x1815, 0x182d, 0x184e, - 0x1869, 0x18a2, 0x18bd, 0x18e4, 0x18ff, 0x1914, 0x192c, 0x1944, - 0x195c, 0x1992, 0x19b6, 0x19da, 0x19ec, 0x1a0a, 0x1a36, 0x1a90, - 0x1a99, 0x1aea, 0x1af6, 0x1aff, 0x1b1d, 0x1b32, 0x1b54, 0x1b7e, - 0x1b96, 0x1ba5, 0x1bb4, 0x1be7, 0x1bf9, 0x1c0e, 0x1c29, 0x1c3b, - 0x1c50, 0x1ca7, 0x1cc8, 0x1cec, 0x1d04, 0x1d25, 0x1d43, 0x1d91, - 0x1daf, 0x1df1, 0x1e30, 0x1e48, 0x1e60, 0x1e8d, 0x1e9c, 0x1eae, - // Entry 100 - 13F - 0x1ebd, 0x1ecc, 0x1eea, 0x1eff, 0x1f17, 0x1f50, 0x1f59, 0x1f6e, - 0x1f92, 0x1fb0, 0x1fce, 0x1ff8, 0x2019, 0x2046, 0x206a, 0x208b, - 0x20b2, 0x20c7, 0x20f4, 0x2112, 0x213c, 0x2157, 0x2199, 0x21b1, - 0x21d5, 0x21f3, 0x221d, 0x223b, 0x224d, 0x226b, 0x2292, 0x22a1, - 0x22c8, 0x22e6, 0x230a, 0x232e, -} // Size: 608 bytes - -const trRegionStr string = "" + // Size: 3033 bytes - "Ascension AdasıAndorraBirleşik Arap EmirlikleriAfganistanAntigua ve Barb" + - "udaAnguillaArnavutlukErmenistanAngolaAntarktikaArjantinAmerikan SamoasıA" + - "vusturyaAvustralyaArubaÅland AdalarıAzerbaycanBosna-HersekBarbadosBangla" + - "deşBelçikaBurkina FasoBulgaristanBahreynBurundiBeninSaint BarthelemyBerm" + - "udaBruneiBolivyaKarayip HollandaBrezilyaBahamalarButanBouvet AdasıBotsva" + - "naBelarusBelizeKanadaCocos (Keeling) AdalarıKongo - KinşasaOrta Afrika C" + - "umhuriyetiKongo - BrazavilİsviçreFildişi SahiliCook AdalarıŞiliKamerunÇi" + - "nKolombiyaClipperton AdasıKosta RikaKübaCape VerdeCuraçaoChristmas Adası" + - "KıbrısÇekyaAlmanyaDiego GarciaCibutiDanimarkaDominikaDominik Cumhuriyeti" + - "CezayirSepte ve MelillaEkvadorEstonyaMısırBatı SahraEritreİspanyaEtiyopy" + - "aAvrupa BirliğiFinlandiyaFijiFalkland AdalarıMikronezyaFaroe AdalarıFran" + - "saGabonBirleşik KrallıkGrenadaGürcistanFransız GuyanasıGuernseyGanaCebel" + - "itarıkGrönlandGambiyaGineGuadalupeEkvator GinesiYunanistanGüney Georgia " + - "ve Güney Sandwich AdalarıGuatemalaGuamGine-BissauGuyanaÇin Hong Kong ÖİB" + - "Heard Adası ve McDonald AdalarıHondurasHırvatistanHaitiMacaristanKanarya" + - " AdalarıEndonezyaİrlandaİsrailMan AdasıHindistanBritanya Hint Okyanusu T" + - "opraklarıIrakİranİzlandaİtalyaJerseyJamaikaÜrdünJaponyaKenyaKırgızistanK" + - "amboçyaKiribatiKomorlarSaint Kitts ve NevisKuzey KoreGüney KoreKuveytCay" + - "man AdalarıKazakistanLaosLübnanSaint LuciaLiechtensteinSri LankaLiberyaL" + - "esothoLitvanyaLüksemburgLetonyaLibyaFasMonakoMoldovaKaradağSaint MartinM" + - "adagaskarMarshall AdalarıMakedonyaMaliMyanmar (Burma)MoğolistanÇin Makao" + - " ÖİBKuzey Mariana AdalarıMartinikMoritanyaMontserratMaltaMauritiusMaldiv" + - "lerMalaviMeksikaMalezyaMozambikNamibyaYeni KaledonyaNijerNorfolk AdasıNi" + - "jeryaNikaraguaHollandaNorveçNepalNauruNiueYeni ZelandaUmmanPanamaPeruFra" + - "nsız PolinezyasıPapua Yeni GineFilipinlerPakistanPolonyaSaint Pierre ve " + - "MiquelonPitcairn AdalarıPorto RikoFilistin BölgeleriPortekizPalauParagua" + - "yKatarUzak OkyanusyaRéunionRomanyaSırbistanRusyaRuandaSuudi ArabistanSol" + - "omon AdalarıSeyşellerSudanİsveçSingapurSaint HelenaSlovenyaSvalbard ve J" + - "an MayenSlovakyaSierra LeoneSan MarinoSenegalSomaliSurinamGüney SudanSão" + - " Tomé ve PríncipeEl SalvadorSint MaartenSuriyeSvazilandTristan da CunhaT" + - "urks ve Caicos AdalarıÇadFransız Güney TopraklarıTogoTaylandTacikistanTo" + - "kelauTimor-LesteTürkmenistanTunusTongaTürkiyeTrinidad ve TobagoTuvaluTay" + - "vanTanzanyaUkraynaUgandaABD Uzak AdalarıBirleşmiş MilletlerAmerika Birle" + - "şik DevletleriUruguayÖzbekistanVatikanSaint Vincent ve GrenadinlerVenez" + - "uelaBritanya Virjin AdalarıABD Virjin AdalarıVietnamVanuatuWallis ve Fut" + - "unaSamoaKosovaYemenMayotteGüney AfrikaZambiyaZimbabveBilinmeyen BölgeDün" + - "yaAfrikaKuzey AmerikaGüney AmerikaOkyanusyaBatı AfrikaOrta AmerikaDoğu A" + - "frikaKuzey AfrikaOrta AfrikaAfrika’nın GüneyiAmerikaAmerika’nın KuzeyiKa" + - "rayiplerDoğu AsyaGüney AsyaGüneydoğu AsyaGüney AvrupaAvustralasyaMelanez" + - "yaMikronezya BölgesiPolinezyaAsyaOrta AsyaBatı AsyaAvrupaDoğu AvrupaKuze" + - "y AvrupaBatı AvrupaLatin Amerika" - -var trRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0017, 0x0031, 0x003b, 0x004d, 0x0055, 0x005f, - 0x0069, 0x006f, 0x0079, 0x0081, 0x0092, 0x009b, 0x00a5, 0x00aa, - 0x00b9, 0x00c3, 0x00cf, 0x00d7, 0x00e1, 0x00e9, 0x00f5, 0x0100, - 0x0107, 0x010e, 0x0113, 0x0123, 0x012a, 0x0130, 0x0137, 0x0147, - 0x014f, 0x0158, 0x015d, 0x016a, 0x0172, 0x0179, 0x017f, 0x0185, - 0x019d, 0x01ad, 0x01c4, 0x01d4, 0x01dd, 0x01ec, 0x01f9, 0x01fe, - 0x0205, 0x0209, 0x0212, 0x0223, 0x022d, 0x0232, 0x023c, 0x0244, - 0x0254, 0x025c, 0x0262, 0x0269, 0x0275, 0x027b, 0x0284, 0x028c, - // Entry 40 - 7F - 0x029f, 0x02a6, 0x02b6, 0x02bd, 0x02c4, 0x02cb, 0x02d6, 0x02dc, - 0x02e4, 0x02ec, 0x02fb, 0x02fb, 0x0305, 0x0309, 0x031a, 0x0324, - 0x0332, 0x0338, 0x033d, 0x034f, 0x0356, 0x0360, 0x0372, 0x037a, - 0x037e, 0x038a, 0x0393, 0x039a, 0x039e, 0x03a7, 0x03b5, 0x03bf, - 0x03e9, 0x03f2, 0x03f6, 0x0401, 0x0407, 0x041b, 0x043c, 0x0444, - 0x0450, 0x0455, 0x045f, 0x046f, 0x0478, 0x0480, 0x0487, 0x0491, - 0x049a, 0x04bc, 0x04c0, 0x04c5, 0x04cd, 0x04d4, 0x04da, 0x04e1, - 0x04e8, 0x04ef, 0x04f4, 0x0501, 0x050a, 0x0512, 0x051a, 0x052e, - // Entry 80 - BF - 0x0538, 0x0543, 0x0549, 0x0558, 0x0562, 0x0566, 0x056d, 0x0578, - 0x0585, 0x058e, 0x0595, 0x059c, 0x05a4, 0x05af, 0x05b6, 0x05bb, - 0x05be, 0x05c4, 0x05cb, 0x05d3, 0x05df, 0x05e9, 0x05fa, 0x0603, - 0x0607, 0x0616, 0x0621, 0x0631, 0x0647, 0x064f, 0x0658, 0x0662, - 0x0667, 0x0670, 0x0679, 0x067f, 0x0686, 0x068d, 0x0695, 0x069c, - 0x06aa, 0x06af, 0x06bd, 0x06c4, 0x06cd, 0x06d5, 0x06dc, 0x06e1, - 0x06e6, 0x06ea, 0x06f6, 0x06fb, 0x0701, 0x0705, 0x071a, 0x0729, - 0x0733, 0x073b, 0x0742, 0x075a, 0x076b, 0x0775, 0x0788, 0x0790, - // Entry C0 - FF - 0x0795, 0x079d, 0x07a2, 0x07b0, 0x07b8, 0x07bf, 0x07c9, 0x07ce, - 0x07d4, 0x07e3, 0x07f3, 0x07fd, 0x0802, 0x0809, 0x0811, 0x081d, - 0x0825, 0x083a, 0x0842, 0x084e, 0x0858, 0x085f, 0x0865, 0x086c, - 0x0878, 0x088f, 0x089a, 0x08a6, 0x08ac, 0x08b5, 0x08c5, 0x08dd, - 0x08e1, 0x08fc, 0x0900, 0x0907, 0x0911, 0x0918, 0x0923, 0x0930, - 0x0935, 0x093a, 0x0942, 0x0954, 0x095a, 0x0960, 0x0968, 0x096f, - 0x0975, 0x0986, 0x099b, 0x09b7, 0x09be, 0x09c9, 0x09d0, 0x09ec, - 0x09f5, 0x0a0d, 0x0a20, 0x0a27, 0x0a2e, 0x0a3e, 0x0a43, 0x0a49, - // Entry 100 - 13F - 0x0a4e, 0x0a55, 0x0a62, 0x0a69, 0x0a71, 0x0a82, 0x0a88, 0x0a8e, - 0x0a9b, 0x0aa9, 0x0ab2, 0x0abe, 0x0aca, 0x0ad6, 0x0ae2, 0x0aed, - 0x0b02, 0x0b09, 0x0b1e, 0x0b28, 0x0b32, 0x0b3d, 0x0b4d, 0x0b5a, - 0x0b66, 0x0b6f, 0x0b82, 0x0b8b, 0x0b8f, 0x0b98, 0x0ba2, 0x0ba8, - 0x0bb4, 0x0bc0, 0x0bcc, 0x0bd9, -} // Size: 608 bytes - -const ukRegionStr string = "" + // Size: 6139 bytes - "Острів ВознесінняАндорраОбʼєднані Арабські ЕміратиАфганістанАнтигуа і Ба" + - "рбудаАнгільяАлбаніяВірменіяАнголаАнтарктикаАргентинаАмериканське СамоаА" + - "встріяАвстраліяАрубаАландські островиАзербайджанБоснія і ГерцоговинаБар" + - "бадосБангладешБельгіяБуркіна-ФасоБолгаріяБахрейнБурундіБенінСен-Бартель" + - "міБермудські островиБрунейБолівіяНідерландські Карибські островиБразилі" + - "яБагамські ОстровиБутанОстрів БувеБотсванаБілорусьБелізКанадаКокосові (" + - "Кілінгові) островиКонго – КіншасаЦентральноафриканська РеспублікаКонго " + - "– БраззавільШвейцаріяКот-д’ІвуарОстрови КукаЧиліКамерунКитайКолумбіяОс" + - "трів КліппертонКоста-РикаКубаКабо-ВердеКюрасаоОстрів РіздваКіпрЧехіяНім" + - "еччинаДієго-ГарсіяДжибутіДаніяДомінікаДомініканська РеспублікаАлжирСеут" + - "а і МелільяЕквадорЕстоніяЄгипетЗахідна СахараЕритреяІспаніяЕфіопіяЄвроп" + - "ейський СоюзФінляндіяФіджіФолклендські островиМікронезіяФарерські Остро" + - "виФранціяГабонВелика БританіяГренадаГрузіяФранцузька ГвіанаГернсіГанаГі" + - "бралтарГренландіяГамбіяГвінеяГваделупаЕкваторіальна ГвінеяГреціяПівденн" + - "а Джорджія та Південні Сандвічеві островиГватемалаГуамГвінея-БісауГаяна" + - "Гонконг, О.А.Р. КитаюОстрови Херд і Мак-ДональдГондурасХорватіяГаїтіУго" + - "рщинаКанарські островиІндонезіяІрландіяІзраїльОстрів МенІндіяБританські" + - " території в Індійському океаніІракІранІсландіяІталіяДжерсіЯмайкаЙордані" + - "яЯпоніяКеніяКиргизстанКамбоджаКірибатіКоморські островиСент-Кітс і Неві" + - "сПівнічна КореяПівденна КореяКувейтКайманові островиКазахстанЛаосЛіванС" + - "ент-ЛюсіяЛіхтенштейнШрі-ЛанкаЛіберіяЛесотоЛитваЛюксембургЛатвіяЛівіяМар" + - "оккоМонакоМолдоваЧорногоріяСен-МартенМадагаскарМаршаллові ОстровиМакедо" + - "ніяМаліМʼянма (Бірма)МонголіяМакао, О.А.Р КитаюПівнічні Маріанські Остр" + - "овиМартинікаМавританіяМонтсерратМальтаМаврикійМальдівиМалавіМексикаМала" + - "йзіяМозамбікНамібіяНова КаледоніяНігерОстрів НорфолкНігеріяНікарагуаНід" + - "ерландиНорвегіяНепалНауруНіуеНова ЗеландіяОманПанамаПеруФранцузька Полі" + - "незіяПапуа Нова ГвінеяФіліппіниПакистанПольщаСен-Пʼєр і МікелонОстрови " + - "ПіткернПуерто-РикоПалестинські територіїПортугаліяПалауПарагвайКатарВід" + - "далені острови ОкеаніїРеюньйонРумуніяСербіяРосіяРуандаСаудівська Аравія" + - "Соломонові ОстровиСейшельські ОстровиСуданШвеціяСінгапурОстрів Святої Є" + - "лениСловеніяОстрови Свальбард і Ян-МаєнСловаччинаСьєрра-ЛеонеСан-Марино" + - "СенегалСомаліСуринамПівденний СуданСан-Томе і ПрінсіпіСальвадорСінт-Мар" + - "тенСиріяСвазілендТрістан-да-КуньяОстрови Теркс і КайкосЧадФранцузькі Пі" + - "вденні ТериторіїТогоТаїландТаджикистанТокелауТимор-ЛештіТуркменістанТун" + - "ісТонгаТуреччинаТринідад і ТобагоТувалуТайваньТанзаніяУкраїнаУгандаВідд" + - "алені острови СШАОрганізація Об’єднаних НаційСШАУругвайУзбекистанВатика" + - "нСент-Вінсент і ГренадиниВенесуелаБританські Віргінські островиВіргінсь" + - "кі острови, СШАВʼєтнамВануатуВолліс і ФутунаСамоаКосовоЄменМайоттаПівде" + - "нно-Африканська РеспублікаЗамбіяЗімбабвеНевідомий регіонСвітАфрикаПівні" + - "чна АмерикаПівденна АмерикаОкеаніяЗахідна АфрикаЦентральна АмерикаСхідн" + - "а АфрикаПівнічна АфрикаЦентральна АфрикаПівденна АфрикаАмерикаПівнічна " + - "Америка (регіон)Карибський басейнСхідна АзіяПівденна АзіяПівденно-Східн" + - "а АзіяПівденна ЄвропаАвстралазіяМеланезіяМікронезійський регіонПолінезі" + - "яАзіяЦентральна АзіяЗахідна АзіяЄвропаСхідна ЄвропаПівнічна ЄвропаЗахід" + - "на ЄвропаЛатинська Америка" - -var ukRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0021, 0x002f, 0x0061, 0x0075, 0x0095, 0x00a3, 0x00b1, - 0x00c1, 0x00cd, 0x00e1, 0x00f3, 0x0116, 0x0124, 0x0136, 0x0140, - 0x0161, 0x0177, 0x019d, 0x01ad, 0x01bf, 0x01cd, 0x01e4, 0x01f4, - 0x0202, 0x0210, 0x021a, 0x0233, 0x0256, 0x0262, 0x0270, 0x02ac, - 0x02bc, 0x02dd, 0x02e7, 0x02fc, 0x030c, 0x031c, 0x0326, 0x0332, - 0x0366, 0x0383, 0x03c2, 0x03e5, 0x03f7, 0x040d, 0x0424, 0x042c, - 0x043a, 0x0444, 0x0454, 0x0475, 0x0488, 0x0490, 0x04a3, 0x04b1, - 0x04ca, 0x04d2, 0x04dc, 0x04ee, 0x0505, 0x0513, 0x051d, 0x052d, - // Entry 40 - 7F - 0x055c, 0x0566, 0x0582, 0x0590, 0x059e, 0x05aa, 0x05c5, 0x05d3, - 0x05e1, 0x05ef, 0x0610, 0x0610, 0x0622, 0x062c, 0x0653, 0x0667, - 0x0688, 0x0696, 0x06a0, 0x06bd, 0x06cb, 0x06d7, 0x06f8, 0x0704, - 0x070c, 0x071e, 0x0732, 0x073e, 0x074a, 0x075c, 0x0783, 0x078f, - 0x07ea, 0x07fc, 0x0804, 0x081b, 0x0825, 0x0849, 0x0879, 0x0889, - 0x0899, 0x08a3, 0x08b3, 0x08d4, 0x08e6, 0x08f6, 0x0904, 0x0917, - 0x0921, 0x096f, 0x0977, 0x097f, 0x098f, 0x099b, 0x09a7, 0x09b3, - 0x09c3, 0x09cf, 0x09d9, 0x09ed, 0x09fd, 0x0a0d, 0x0a2e, 0x0a4d, - // Entry 80 - BF - 0x0a68, 0x0a83, 0x0a8f, 0x0ab0, 0x0ac2, 0x0aca, 0x0ad4, 0x0ae7, - 0x0afd, 0x0b0e, 0x0b1c, 0x0b28, 0x0b32, 0x0b46, 0x0b52, 0x0b5c, - 0x0b6a, 0x0b76, 0x0b84, 0x0b98, 0x0bab, 0x0bbf, 0x0be2, 0x0bf4, - 0x0bfc, 0x0c15, 0x0c25, 0x0c44, 0x0c78, 0x0c8a, 0x0c9e, 0x0cb2, - 0x0cbe, 0x0cce, 0x0cde, 0x0cea, 0x0cf8, 0x0d08, 0x0d18, 0x0d26, - 0x0d41, 0x0d4b, 0x0d66, 0x0d74, 0x0d86, 0x0d9a, 0x0daa, 0x0db4, - 0x0dbe, 0x0dc6, 0x0ddf, 0x0de7, 0x0df3, 0x0dfb, 0x0e22, 0x0e42, - 0x0e54, 0x0e64, 0x0e70, 0x0e91, 0x0eae, 0x0ec3, 0x0eee, 0x0f02, - // Entry C0 - FF - 0x0f0c, 0x0f1c, 0x0f26, 0x0f56, 0x0f66, 0x0f74, 0x0f80, 0x0f8a, - 0x0f96, 0x0fb7, 0x0fda, 0x0fff, 0x1009, 0x1015, 0x1025, 0x1049, - 0x1059, 0x108b, 0x109f, 0x10b6, 0x10c9, 0x10d7, 0x10e3, 0x10f1, - 0x110e, 0x1131, 0x1143, 0x1158, 0x1162, 0x1174, 0x1192, 0x11bb, - 0x11c1, 0x11f9, 0x1201, 0x120f, 0x1225, 0x1233, 0x1248, 0x1260, - 0x126a, 0x1274, 0x1286, 0x12a6, 0x12b2, 0x12c0, 0x12d0, 0x12de, - 0x12ea, 0x1312, 0x1349, 0x134f, 0x135d, 0x1371, 0x137f, 0x13ac, - 0x13be, 0x13f6, 0x1421, 0x142f, 0x143d, 0x1459, 0x1463, 0x146f, - // Entry 100 - 13F - 0x1477, 0x1485, 0x14c1, 0x14cd, 0x14dd, 0x14fc, 0x1504, 0x1510, - 0x152f, 0x154e, 0x155c, 0x1577, 0x159a, 0x15b3, 0x15d0, 0x15f1, - 0x160e, 0x161c, 0x164a, 0x166b, 0x1680, 0x1699, 0x16bf, 0x16dc, - 0x16f2, 0x1704, 0x172f, 0x1741, 0x1749, 0x1766, 0x177d, 0x1789, - 0x17a2, 0x17bf, 0x17da, 0x17fb, -} // Size: 608 bytes - -const urRegionStr string = "" + // Size: 5112 bytes - "اسینشن آئلینڈانڈورامتحدہ عرب اماراتافغانستانانٹیگوا اور باربوداانگوئیلاا" + - "لبانیہآرمینیاانگولاانٹارکٹیکاارجنٹیناامریکی ساموآآسٹریاآسٹریلیااروباآلی" + - "نڈ آئلینڈزآذر بائیجانبوسنیا اور ہرزیگووینابارباڈوسبنگلہ دیشبیلجیمبرکینا" + - " فاسوبلغاریہبحرینبرونڈیبیننسینٹ برتھلیمیبرمودابرونائیبولیویاکریبیائی نید" + - "رلینڈزبرازیلبہاماسبھوٹانبؤویٹ آئلینڈبوتسوانابیلاروسبیلائزکینیڈاکوکوس (ک" + - "یلنگ) جزائرکانگو - کنشاساوسط افریقی جمہوریہکانگو - برازاویلےسوئٹزر لینڈ" + - "کوٹ ڈی آئیوریکک آئلینڈزچلیکیمرونچینکولمبیاکلپرٹن آئلینڈکوسٹا ریکاکیوباک" + - "یپ ورڈیکیوراکاؤجزیرہ کرسمسقبرصزکھیاجرمنیڈائجو گارسیاجبوتیڈنمارکڈومنیکاڈ" + - "ومنیکن جمہوریہالجیریاسیئوٹا اور میلیلاایکواڈوراسٹونیامصرمغربی صحارااریٹ" + - "یریاہسپانیہایتھوپیایوروپی یونینفن لینڈفجیفاکلینڈ جزائرمائکرونیشیاجزائر " + - "فاروفرانسگیبونسلطنت متحدہگریناڈاجارجیافرینچ گیاناگوئرنسیگھاناجبل الطارق" + - "گرین لینڈگیمبیاگنیگواڈیلوپاستوائی گیانایونانجنوبی جارجیا اور جنوبی سینڈ" + - "وچ جزائرگواٹے مالاگوامگنی بساؤگیاناہانگ کانگ SAR چینہیرڈ جزیرہ و میکڈول" + - "ینڈ جزائرہونڈاروسکروشیاہیٹیہنگریکینری آئلینڈزانڈونیشیاآئرلینڈاسرائیلآئل" + - " آف مینبھارتبرطانوی بحر ہند کا علاقہعراقایرانآئس لینڈاٹلیجرسیجمائیکااردن" + - "جاپانکینیاکرغزستانکمبوڈیاکریباتیکوموروسسینٹ کٹس اور نیویسشمالی کوریاجنو" + - "بی کوریاکویتکیمین آئلینڈزقازقستانلاؤسلبنانسینٹ لوسیالیشٹنسٹائنسری لنکال" + - "ائبیریالیسوتھولیتھونیالکسمبرگلٹویالیبیامراکشموناکومالدووامونٹے نیگروسین" + - "ٹ مارٹنمڈغاسکرمارشل آئلینڈزمقدونیہمالیمیانمار (برما)منگولیامکاؤ SAR چین" + - "شمالی ماریانا آئلینڈزمارٹینکموریطانیہمونٹسیراٹمالٹاماریشسمالدیپملاویمیک" + - "سیکوملائشیاموزمبیقنامیبیانیو کلیڈونیانائجرنارفوک آئلینڈنائجیریانکاراگوو" + - "انیدر لینڈزناروےنیپالنؤرونیئونیوزی لینڈعمانپانامہپیروفرانسیسی پولینیشیا" + - "پاپوآ نیو گنیفلپائنپاکستانپولینڈسینٹ پیئر اور میکلیئونپٹکائرن جزائرپیور" + - "ٹو ریکوفلسطینی خطےپرتگالپلاؤپیراگوئےقطربیرونی اوشیانیاری یونینرومانیہسر" + - "بیاروسروانڈاسعودی عربسولومن آئلینڈزسشلیزسوڈانسویڈنسنگاپورسینٹ ہیلیناسلو" + - "وینیاسوالبرڈ اور جان ماینسلوواکیہسیئر لیونسان مارینوسینیگلصومالیہسورینا" + - "مجنوبی سوڈانساؤ ٹوم اور پرنسپےال سلواڈورسنٹ مارٹنشامسوازی لینڈٹرسٹن ڈا " + - "کیونہاترکس اور کیکاؤس جزائرچاڈفرانسیسی جنوبی خطےٹوگوتھائی لینڈتاجکستانٹ" + - "وکیلاؤتیمور لیسٹترکمانستانتونسٹونگاترکیترینیداد اور ٹوباگوٹووالوتائیوان" + - "تنزانیہیوکرینیوگنڈاامریکہ سے باہر کے چھوٹے جزائزاقوام متحدہریاستہائے مت" + - "حدہیوروگوئےازبکستانواٹیکن سٹیسینٹ ونسنٹ اور گرینیڈائنزوینزوئیلابرٹش ورج" + - "ن آئلینڈزامریکی ورجن آئلینڈزویتناموینوآٹوویلیز اور فیوٹیوناساموآکوسوووی" + - "منمایوٹجنوبی افریقہزامبیازمبابوےنامعلوم علاقہدنیاافریقہشمالی امریکہجنوب" + - "ی امریکہاوشیانیامغربی افریقہوسطی امریکہمشرقی افریقہشمالی افریقہوسطی افر" + - "یقہجنوبی افریقہ کے علاقہامیریکازشمالی امریکہ کا علاقہکریبیائیمشرقی ایشی" + - "اجنوبی ایشیاجنوب مشرقی ایشیاجنوبی یورپآسٹریلیشیامالینیشیامائکرونیشیائی " + - "علاقہپولینیشیاایشیاوسطی ایشیامغربی ایشیایورپمشرقی یورپشمالی یورپمغربی ی" + - "ورپلاطینی امریکہ" - -var urRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0019, 0x0025, 0x0043, 0x0055, 0x0079, 0x0089, 0x0097, - 0x00a5, 0x00b1, 0x00c5, 0x00d5, 0x00ec, 0x00f8, 0x0108, 0x0112, - 0x012b, 0x0140, 0x0168, 0x0178, 0x0189, 0x0195, 0x01aa, 0x01b8, - 0x01c2, 0x01ce, 0x01d6, 0x01ef, 0x01fb, 0x0209, 0x0217, 0x023a, - 0x0246, 0x0252, 0x025e, 0x0275, 0x0285, 0x0293, 0x029f, 0x02ab, - 0x02cd, 0x02e6, 0x0308, 0x0327, 0x033c, 0x0354, 0x0367, 0x036d, - 0x0379, 0x037f, 0x038d, 0x03a6, 0x03b9, 0x03c3, 0x03d2, 0x03e2, - 0x03f7, 0x03ff, 0x0409, 0x0413, 0x042a, 0x0434, 0x0440, 0x044e, - // Entry 40 - 7F - 0x046b, 0x0479, 0x0499, 0x04a9, 0x04b7, 0x04bd, 0x04d2, 0x04e2, - 0x04f0, 0x0500, 0x0517, 0x0517, 0x0524, 0x052a, 0x0543, 0x0559, - 0x056c, 0x0576, 0x0580, 0x0595, 0x05a3, 0x05af, 0x05c4, 0x05d2, - 0x05dc, 0x05ef, 0x0600, 0x060c, 0x0612, 0x0622, 0x063b, 0x0645, - 0x0686, 0x0699, 0x06a1, 0x06b0, 0x06ba, 0x06d6, 0x070a, 0x071a, - 0x0726, 0x072e, 0x0738, 0x0751, 0x0763, 0x0771, 0x077f, 0x0791, - 0x079b, 0x07c7, 0x07cf, 0x07d9, 0x07e8, 0x07f0, 0x07f8, 0x0806, - 0x080e, 0x0818, 0x0822, 0x0832, 0x0840, 0x084e, 0x085c, 0x087d, - // Entry 80 - BF - 0x0892, 0x08a7, 0x08af, 0x08c8, 0x08d8, 0x08e0, 0x08ea, 0x08fd, - 0x0911, 0x0920, 0x0930, 0x093e, 0x094e, 0x095c, 0x0966, 0x0970, - 0x097a, 0x0986, 0x0994, 0x09a9, 0x09bc, 0x09ca, 0x09e3, 0x09f1, - 0x09f9, 0x0a12, 0x0a20, 0x0a33, 0x0a5b, 0x0a69, 0x0a7b, 0x0a8d, - 0x0a97, 0x0aa3, 0x0aaf, 0x0ab9, 0x0ac7, 0x0ad5, 0x0ae3, 0x0af1, - 0x0b08, 0x0b12, 0x0b2b, 0x0b3b, 0x0b4d, 0x0b60, 0x0b6a, 0x0b74, - 0x0b7c, 0x0b84, 0x0b97, 0x0b9f, 0x0bab, 0x0bb3, 0x0bd6, 0x0bee, - 0x0bfa, 0x0c08, 0x0c14, 0x0c3d, 0x0c56, 0x0c6b, 0x0c80, 0x0c8c, - // Entry C0 - FF - 0x0c94, 0x0ca4, 0x0caa, 0x0cc7, 0x0cd6, 0x0ce4, 0x0cee, 0x0cf4, - 0x0d00, 0x0d11, 0x0d2c, 0x0d36, 0x0d40, 0x0d4a, 0x0d58, 0x0d6d, - 0x0d7d, 0x0da2, 0x0db2, 0x0dc3, 0x0dd6, 0x0de2, 0x0df0, 0x0dfe, - 0x0e13, 0x0e34, 0x0e47, 0x0e58, 0x0e5e, 0x0e71, 0x0e8d, 0x0eb4, - 0x0eba, 0x0edc, 0x0ee4, 0x0ef7, 0x0f07, 0x0f15, 0x0f28, 0x0f3c, - 0x0f44, 0x0f4e, 0x0f56, 0x0f7a, 0x0f86, 0x0f94, 0x0fa2, 0x0fae, - 0x0fba, 0x0fef, 0x1004, 0x1021, 0x1031, 0x1041, 0x1054, 0x1083, - 0x1095, 0x10b5, 0x10d9, 0x10e5, 0x10f3, 0x1115, 0x111f, 0x112b, - // Entry 100 - 13F - 0x1131, 0x113b, 0x1152, 0x115e, 0x116c, 0x1185, 0x118d, 0x1199, - 0x11b0, 0x11c7, 0x11d7, 0x11ee, 0x1203, 0x121a, 0x1231, 0x1246, - 0x126d, 0x127d, 0x12a4, 0x12b4, 0x12c9, 0x12de, 0x12fc, 0x130f, - 0x1323, 0x1335, 0x135a, 0x136c, 0x1376, 0x1389, 0x139e, 0x13a6, - 0x13b9, 0x13cc, 0x13df, 0x13f8, -} // Size: 608 bytes - -const uzRegionStr string = "" + // Size: 3221 bytes - "Me’roj oroliAndorraBirlashgan Arab AmirliklariAfgʻonistonAntigua va Barb" + - "udaAngilyaAlbaniyaArmanistonAngolaAntarktidaArgentinaAmerika SamoasiAvst" + - "riyaAvstraliyaArubaAland orollariOzarbayjonBosniya va GertsegovinaBarbad" + - "osBangladeshBelgiyaBurkina-FasoBolgariyaBahraynBurundiBeninSen-Bartelemi" + - "Bermuda orollariBruneyBoliviyaBoneyr, Sint-Estatius va SabaBraziliyaBaga" + - "ma orollariButanBuve oroliBotsvanaBelarusBelizKanadaKokos (Kiling) oroll" + - "ariKongo – KinshasaMarkaziy Afrika RespublikasiKongo – BrazzavilShveytsa" + - "riyaKot-d’IvuarKuk orollariChiliKamerunXitoyKolumbiyaKlipperton oroliKos" + - "ta-RikaKubaKabo-VerdeKyurasaoRojdestvo oroliKiprChexiyaGermaniyaDiyego-G" + - "arsiyaJibutiDaniyaDominikaDominikan RespublikasiJazoirSeuta va MelilyaEk" + - "vadorEstoniyaMisrG‘arbiy Sahroi KabirEritreyaIspaniyaEfiopiyaYevropa Itt" + - "ifoqiFinlandiyaFijiFolklend orollariMikroneziyaFarer orollariFransiyaGab" + - "onBuyuk BritaniyaGrenadaGruziyaFransuz GvianasiGernsiGanaGibraltarGrenla" + - "ndiyaGambiyaGvineyaGvadelupeEkvatorial GvineyaGretsiyaJanubiy Georgiya v" + - "a Janubiy Sendvich orollariGvatemalaGuamGvineya-BisauGayanaGonkong (Xito" + - "y MMH)Xerd va Makdonald orollariGondurasXorvatiyaGaitiVengriyaKanar orol" + - "lariIndoneziyaIrlandiyaIsroilMen oroliHindistonBritaniyaning Hind okeani" + - "dagi hududiIroqEronIslandiyaItaliyaJersiYamaykaIordaniyaYaponiyaKeniyaQi" + - "rgʻizistonKambodjaKiribatiKomor orollariSent-Kits va NevisShimoliy Korey" + - "aJanubiy KoreyaQuvaytKayman orollariQozogʻistonLaosLivanSent-LyusiyaLixt" + - "enshteynShri-LankaLiberiyaLesotoLitvaLyuksemburgLatviyaLiviyaMarokashMon" + - "akoMoldovaChernogoriyaSent-MartinMadagaskarMarshall orollariMakedoniyaMa" + - "liMyanma (Birma)MongoliyaMakao (Xitoy MMH)Shimoliy Mariana orollariMarti" + - "nikaMavritaniyaMontserratMaltaMavrikiyMaldiv orollariMalaviMeksikaMalayz" + - "iyaMozambikNamibiyaYangi KaledoniyaNigerNorfolk oroliNigeriyaNikaraguaNi" + - "derlandiyaNorvegiyaNepalNauruNiueYangi ZelandiyaUmmonPanamaPeruFransuz P" + - "olineziyasiPapua – Yangi GvineyaFilippinPokistonPolshaSen-Pyer va Mikelo" + - "nPitkern orollariPuerto-RikoFalastin hududiPortugaliyaPalauParagvayQatar" + - "Tashqi OkeaniyaReyunionRuminiyaSerbiyaRossiyaRuandaSaudiya ArabistoniSol" + - "omon orollariSeyshel orollariSudanShvetsiyaSingapurMuqaddas Yelena oroli" + - "SloveniyaSvalbard va Yan-MayenSlovakiyaSyerra-LeoneSan-MarinoSenegalSoma" + - "liSurinamJanubiy SudanSan-Tome va PrinsipiSalvadorSint-MartenSuriyaSvazi" + - "lendTristan-da-KunyaTurks va Kaykos orollariChadFransuz Janubiy hududlar" + - "iTogoTailandTojikistonTokelauTimor-LesteTurkmanistonTunisTongaTurkiyaTri" + - "nidad va TobagoTuvaluTayvanTanzaniyaUkrainaUgandaAQSH yondosh orollariBi" + - "rlashgan Millatlar TashkilotiAmerika Qo‘shma ShtatlariUrugvayOʻzbekiston" + - "VatikanSent-Vinsent va GrenadinVenesuelaBritaniya Virgin orollariAQSH Vi" + - "rgin orollariVyetnamVanuatuUollis va FutunaSamoaKosovoYamanMayottaJanubi" + - "y Afrika RespublikasiZambiyaZimbabveNoma’lum mintaqaDunyoAfrikaShimoliy " + - "AmerikaJanubiy AmerikaOkeaniyaG‘arbiy AfrikaMarkaziy AmerikaSharqiy Afri" + - "kaShimoliy AfrikaMarkaziy AfrikaJanubiy AfrikaAmerikaShimoliy Amerika – " + - "AQSH va KanadaKarib havzasiSharqiy OsiyoJanubiy OsiyoJanubi-sharqiy Osiy" + - "oJanubiy YevropaAvstralaziyaMelaneziyaMikroneziya mintaqasiPolineziyaOsi" + - "yoMarkaziy OsiyoG‘arbiy OsiyoYevropaSharqiy YevropaShimoliy YevropaG‘arb" + - "iy YevropaLotin Amerikasi" - -var uzRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000e, 0x0015, 0x0030, 0x003c, 0x004e, 0x0055, 0x005d, - 0x0067, 0x006d, 0x0077, 0x0080, 0x008f, 0x0097, 0x00a1, 0x00a6, - 0x00b4, 0x00be, 0x00d5, 0x00dd, 0x00e7, 0x00ee, 0x00fa, 0x0103, - 0x010a, 0x0111, 0x0116, 0x0123, 0x0133, 0x0139, 0x0141, 0x015e, - 0x0167, 0x0176, 0x017b, 0x0185, 0x018d, 0x0194, 0x0199, 0x019f, - 0x01b6, 0x01c8, 0x01e4, 0x01f7, 0x0203, 0x0210, 0x021c, 0x0221, - 0x0228, 0x022d, 0x0236, 0x0246, 0x0250, 0x0254, 0x025e, 0x0266, - 0x0275, 0x0279, 0x0280, 0x0289, 0x0297, 0x029d, 0x02a3, 0x02ab, - // Entry 40 - 7F - 0x02c1, 0x02c7, 0x02d7, 0x02de, 0x02e6, 0x02ea, 0x0300, 0x0308, - 0x0310, 0x0318, 0x0328, 0x0328, 0x0332, 0x0336, 0x0347, 0x0352, - 0x0360, 0x0368, 0x036d, 0x037c, 0x0383, 0x038a, 0x039a, 0x03a0, - 0x03a4, 0x03ad, 0x03b8, 0x03bf, 0x03c6, 0x03cf, 0x03e1, 0x03e9, - 0x0416, 0x041f, 0x0423, 0x0430, 0x0436, 0x0449, 0x0463, 0x046b, - 0x0474, 0x0479, 0x0481, 0x048f, 0x0499, 0x04a2, 0x04a8, 0x04b1, - 0x04ba, 0x04de, 0x04e2, 0x04e6, 0x04ef, 0x04f6, 0x04fb, 0x0502, - 0x050b, 0x0513, 0x0519, 0x0526, 0x052e, 0x0536, 0x0544, 0x0556, - // Entry 80 - BF - 0x0565, 0x0573, 0x0579, 0x0588, 0x0594, 0x0598, 0x059d, 0x05a9, - 0x05b5, 0x05bf, 0x05c7, 0x05cd, 0x05d2, 0x05dd, 0x05e4, 0x05ea, - 0x05f2, 0x05f8, 0x05ff, 0x060b, 0x0616, 0x0620, 0x0631, 0x063b, - 0x063f, 0x064d, 0x0656, 0x0667, 0x0680, 0x0689, 0x0694, 0x069e, - 0x06a3, 0x06ab, 0x06ba, 0x06c0, 0x06c7, 0x06d0, 0x06d8, 0x06e0, - 0x06f0, 0x06f5, 0x0702, 0x070a, 0x0713, 0x071f, 0x0728, 0x072d, - 0x0732, 0x0736, 0x0745, 0x074a, 0x0750, 0x0754, 0x0768, 0x077f, - 0x0787, 0x078f, 0x0795, 0x07a8, 0x07b8, 0x07c3, 0x07d2, 0x07dd, - // Entry C0 - FF - 0x07e2, 0x07ea, 0x07ef, 0x07fe, 0x0806, 0x080e, 0x0815, 0x081c, - 0x0822, 0x0834, 0x0844, 0x0854, 0x0859, 0x0862, 0x086a, 0x087f, - 0x0888, 0x089d, 0x08a6, 0x08b2, 0x08bc, 0x08c3, 0x08c9, 0x08d0, - 0x08dd, 0x08f1, 0x08f9, 0x0904, 0x090a, 0x0913, 0x0923, 0x093b, - 0x093f, 0x0958, 0x095c, 0x0963, 0x096d, 0x0974, 0x097f, 0x098b, - 0x0990, 0x0995, 0x099c, 0x09ae, 0x09b4, 0x09ba, 0x09c3, 0x09ca, - 0x09d0, 0x09e5, 0x0a04, 0x0a1f, 0x0a26, 0x0a32, 0x0a39, 0x0a51, - 0x0a5a, 0x0a73, 0x0a87, 0x0a8e, 0x0a95, 0x0aa5, 0x0aaa, 0x0ab0, - // Entry 100 - 13F - 0x0ab5, 0x0abc, 0x0ad7, 0x0ade, 0x0ae6, 0x0af8, 0x0afd, 0x0b03, - 0x0b13, 0x0b22, 0x0b2a, 0x0b3a, 0x0b4a, 0x0b58, 0x0b67, 0x0b76, - 0x0b84, 0x0b8b, 0x0bae, 0x0bbb, 0x0bc8, 0x0bd5, 0x0be9, 0x0bf8, - 0x0c04, 0x0c0e, 0x0c23, 0x0c2d, 0x0c32, 0x0c40, 0x0c4f, 0x0c56, - 0x0c65, 0x0c75, 0x0c86, 0x0c95, -} // Size: 608 bytes - -const viRegionStr string = "" + // Size: 3225 bytes - "Đảo AscensionAndorraCác Tiểu Vương quốc Ả Rập Thống nhấtAfghanistanAntig" + - "ua và BarbudaAnguillaAlbaniaArmeniaAngolaNam CựcArgentinaĐảo Somoa thuộc" + - " MỹÁoAustraliaArubaQuần đảo ÅlandAzerbaijanBosnia và HerzegovinaBarbados" + - "BangladeshBỉBurkina FasoBulgariaBahrainBurundiBeninSt. BarthélemyBermuda" + - "BruneiBoliviaCa-ri-bê Hà LanBrazilBahamasBhutanĐảo BouvetBotswanaBelarus" + - "BelizeCanadaQuần đảo Cocos (Keeling)Congo - KinshasaCộng hòa Trung PhiCo" + - "ngo - BrazzavilleThụy SĩCôte d’IvoireQuần đảo CookChileCameroonTrung Quố" + - "cColombiaĐảo ClippertonCosta RicaCubaCape VerdeCuraçaoĐảo Giáng SinhSípC" + - "zechiaĐứcDiego GarciaDjiboutiĐan MạchDominicaCộng hòa DominicaAlgeriaCeu" + - "ta và MelillaEcuadorEstoniaAi CậpTây SaharaEritreaTây Ban NhaEthiopiaLiê" + - "n Minh Châu ÂuPhần LanFijiQuần đảo FalklandMicronesiaQuần đảo FaroePhápG" + - "abonVương quốc AnhGrenadaGruziaGuiana thuộc PhápGuernseyGhanaGibraltarGr" + - "eenlandGambiaGuineaGuadeloupeGuinea Xích ĐạoHy LạpQuần đảo Nam Georgia v" + - "à Nam SandwichGuatemalaGuamGuinea-BissauGuyanaHồng Kông, Trung QuốcQuần" + - " đảo Heard và McDonaldHondurasCroatiaHaitiHungaryQuần đảo CanaryIndonesi" + - "aIrelandIsraelĐảo ManẤn ĐộLãnh thổ Anh tại Ấn Độ DươngIraqIranIcelandÝJe" + - "rseyJamaicaJordanNhật BảnKenyaKyrgyzstanCampuchiaKiribatiComorosSt. Kitt" + - "s và NevisTriều TiênHàn QuốcKuwaitQuần đảo CaymanKazakhstanLàoLi-băngSt." + - " LuciaLiechtensteinSri LankaLiberiaLesothoLitvaLuxembourgLatviaLibyaMa-r" + - "ốcMonacoMoldovaMontenegroSt. MartinMadagascarQuần đảo MarshallMacedoni" + - "aMaliMyanmar (Miến Điện)Mông CổMacao, Trung QuốcQuần đảo Bắc MarianaMart" + - "iniqueMauritaniaMontserratMaltaMauritiusMaldivesMalawiMexicoMalaysiaMoza" + - "mbiqueNamibiaNew CaledoniaNigerĐảo NorfolkNigeriaNicaraguaHà LanNa UyNep" + - "alNauruNiueNew ZealandOmanPanamaPeruPolynesia thuộc PhápPapua New Guinea" + - "PhilippinesPakistanBa LanSaint Pierre và MiquelonQuần đảo PitcairnPuerto" + - " RicoLãnh thổ PalestineBồ Đào NhaPalauParaguayQatarVùng xa xôi thuộc Châ" + - "u Đại DươngRéunionRomaniaSerbiaNgaRwandaẢ Rập Xê-útQuần đảo SolomonSeych" + - "ellesSudanThụy ĐiểnSingaporeSt. HelenaSloveniaSvalbard và Jan MayenSlova" + - "kiaSierra LeoneSan MarinoSenegalSomaliaSurinameNam SudanSão Tomé và Prín" + - "cipeEl SalvadorSint MaartenSyriaSwazilandTristan da CunhaQuần đảo Turk v" + - "à CaicosChadLãnh thổ phía Nam Thuộc PhápTogoThái LanTajikistanTokelauTi" + - "mor-LesteTurkmenistanTunisiaTongaThổ Nhĩ KỳTrinidad và TobagoTuvaluĐài L" + - "oanTanzaniaUkrainaUgandaCác đảo xa thuộc Hoa KỳLiên hiệp quốcHoa KỳUrugu" + - "ayUzbekistanThành VaticanSt. Vincent và GrenadinesVenezuelaQuần đảo Virg" + - "in thuộc AnhQuần đảo Virgin thuộc MỹViệt NamVanuatuWallis và FutunaSamoa" + - "KosovoYemenMayotteNam PhiZambiaZimbabweVùng không xác địnhThế giớiChâu P" + - "hiBắc MỹNam MỹChâu Đại DươngTây PhiTrung MỹĐông PhiBắc PhiTrung PhiMiền " + - "Nam Châu PhiChâu MỹMiền Bắc Châu MỹCa-ri-bêĐông ÁNam ÁĐông Nam ÁNam ÂuÚc" + - " và New ZealandMelanesiaVùng MicronesianPolynesiaChâu ÁTrung ÁTây ÁChâu " + - "ÂuĐông ÂuBắc ÂuTây ÂuChâu Mỹ La-tinh" - -var viRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0010, 0x0017, 0x004a, 0x0055, 0x0068, 0x0070, 0x0077, - 0x007e, 0x0084, 0x008d, 0x0096, 0x00af, 0x00b2, 0x00bb, 0x00c0, - 0x00d4, 0x00de, 0x00f4, 0x00fc, 0x0106, 0x010a, 0x0116, 0x011e, - 0x0125, 0x012c, 0x0131, 0x0140, 0x0147, 0x014d, 0x0154, 0x0165, - 0x016b, 0x0172, 0x0178, 0x0185, 0x018d, 0x0194, 0x019a, 0x01a0, - 0x01bd, 0x01cd, 0x01e2, 0x01f5, 0x01ff, 0x020f, 0x0221, 0x0226, - 0x022e, 0x023a, 0x0242, 0x0253, 0x025d, 0x0261, 0x026b, 0x0273, - 0x0285, 0x0289, 0x0290, 0x0296, 0x02a2, 0x02aa, 0x02b5, 0x02bd, - // Entry 40 - 7F - 0x02d1, 0x02d8, 0x02e9, 0x02f0, 0x02f7, 0x02ff, 0x030a, 0x0311, - 0x031d, 0x0325, 0x0339, 0x0339, 0x0343, 0x0347, 0x035d, 0x0367, - 0x037a, 0x037f, 0x0384, 0x0396, 0x039d, 0x03a3, 0x03b7, 0x03bf, - 0x03c4, 0x03cd, 0x03d6, 0x03dc, 0x03e2, 0x03ec, 0x03ff, 0x0407, - 0x0431, 0x043a, 0x043e, 0x044b, 0x0451, 0x046b, 0x048b, 0x0493, - 0x049a, 0x049f, 0x04a6, 0x04ba, 0x04c3, 0x04ca, 0x04d0, 0x04da, - 0x04e4, 0x050c, 0x0510, 0x0514, 0x051b, 0x051d, 0x0523, 0x052a, - 0x0530, 0x053c, 0x0541, 0x054b, 0x0554, 0x055c, 0x0563, 0x0576, - // Entry 80 - BF - 0x0583, 0x058e, 0x0594, 0x05a8, 0x05b2, 0x05b6, 0x05be, 0x05c7, - 0x05d4, 0x05dd, 0x05e4, 0x05eb, 0x05f0, 0x05fa, 0x0600, 0x0605, - 0x060d, 0x0613, 0x061a, 0x0624, 0x062e, 0x0638, 0x064e, 0x0657, - 0x065b, 0x0673, 0x067d, 0x0690, 0x06ab, 0x06b5, 0x06bf, 0x06c9, - 0x06ce, 0x06d7, 0x06df, 0x06e5, 0x06eb, 0x06f3, 0x06fd, 0x0704, - 0x0711, 0x0716, 0x0724, 0x072b, 0x0734, 0x073b, 0x0740, 0x0745, - 0x074a, 0x074e, 0x0759, 0x075d, 0x0763, 0x0767, 0x077e, 0x078e, - 0x0799, 0x07a1, 0x07a7, 0x07c0, 0x07d6, 0x07e1, 0x07f6, 0x0804, - // Entry C0 - FF - 0x0809, 0x0811, 0x0816, 0x0840, 0x0848, 0x084f, 0x0855, 0x0858, - 0x085e, 0x086f, 0x0884, 0x088e, 0x0893, 0x08a1, 0x08aa, 0x08b4, - 0x08bc, 0x08d2, 0x08da, 0x08e6, 0x08f0, 0x08f7, 0x08fe, 0x0906, - 0x090f, 0x0927, 0x0932, 0x093e, 0x0943, 0x094c, 0x095c, 0x0979, - 0x097d, 0x09a0, 0x09a4, 0x09ad, 0x09b7, 0x09be, 0x09c9, 0x09d5, - 0x09dc, 0x09e1, 0x09f0, 0x0a03, 0x0a09, 0x0a13, 0x0a1b, 0x0a22, - 0x0a28, 0x0a47, 0x0a5a, 0x0a62, 0x0a69, 0x0a73, 0x0a81, 0x0a9b, - 0x0aa4, 0x0ac4, 0x0ae5, 0x0aef, 0x0af6, 0x0b07, 0x0b0c, 0x0b12, - // Entry 100 - 13F - 0x0b17, 0x0b1e, 0x0b25, 0x0b2b, 0x0b33, 0x0b4c, 0x0b58, 0x0b61, - 0x0b6b, 0x0b73, 0x0b87, 0x0b8f, 0x0b99, 0x0ba3, 0x0bac, 0x0bb5, - 0x0bc9, 0x0bd3, 0x0bea, 0x0bf3, 0x0bfc, 0x0c02, 0x0c0f, 0x0c16, - 0x0c29, 0x0c32, 0x0c43, 0x0c4c, 0x0c54, 0x0c5c, 0x0c63, 0x0c6c, - 0x0c76, 0x0c7f, 0x0c87, 0x0c99, -} // Size: 608 bytes - -const zhRegionStr string = "" + // Size: 3310 bytes - "阿森松岛安道尔阿拉伯联合酋长国阿富汗安提瓜和巴布达安圭拉阿尔巴尼亚亚美尼亚安哥拉南极洲阿根廷美属萨摩亚奥地利澳大利亚阿鲁巴奥兰群岛阿塞拜疆波斯尼" + - "亚和黑塞哥维那巴巴多斯孟加拉国比利时布基纳法索保加利亚巴林布隆迪贝宁圣巴泰勒米百慕大文莱玻利维亚荷属加勒比区巴西巴哈马不丹布韦岛博茨瓦纳白俄" + - "罗斯伯利兹加拿大科科斯(基林)群岛刚果(金)中非共和国刚果(布)瑞士科特迪瓦库克群岛智利喀麦隆中国哥伦比亚克利珀顿岛哥斯达黎加古巴佛得角库拉" + - "索圣诞岛塞浦路斯捷克德国迪戈加西亚岛吉布提丹麦多米尼克多米尼加共和国阿尔及利亚休达及梅利利亚厄瓜多尔爱沙尼亚埃及西撒哈拉厄立特里亚西班牙埃塞" + - "俄比亚欧盟芬兰斐济福克兰群岛密克罗尼西亚法罗群岛法国加蓬英国格林纳达格鲁吉亚法属圭亚那格恩西岛加纳直布罗陀格陵兰冈比亚几内亚瓜德罗普赤道几内" + - "亚希腊南乔治亚和南桑威奇群岛危地马拉关岛几内亚比绍圭亚那中国香港特别行政区赫德岛和麦克唐纳群岛洪都拉斯克罗地亚海地匈牙利加纳利群岛印度尼西亚" + - "爱尔兰以色列马恩岛印度英属印度洋领地伊拉克伊朗冰岛意大利泽西岛牙买加约旦日本肯尼亚吉尔吉斯斯坦柬埔寨基里巴斯科摩罗圣基茨和尼维斯朝鲜韩国科威" + - "特开曼群岛哈萨克斯坦老挝黎巴嫩圣卢西亚列支敦士登斯里兰卡利比里亚莱索托立陶宛卢森堡拉脱维亚利比亚摩洛哥摩纳哥摩尔多瓦黑山圣马丁岛马达加斯加马" + - "绍尔群岛马其顿马里缅甸蒙古中国澳门特别行政区北马里亚纳群岛马提尼克毛里塔尼亚蒙特塞拉特马耳他毛里求斯马尔代夫马拉维墨西哥马来西亚莫桑比克纳米" + - "比亚新喀里多尼亚尼日尔诺福克岛尼日利亚尼加拉瓜荷兰挪威尼泊尔瑙鲁纽埃新西兰阿曼巴拿马秘鲁法属波利尼西亚巴布亚新几内亚菲律宾巴基斯坦波兰圣皮埃" + - "尔和密克隆群岛皮特凯恩群岛波多黎各巴勒斯坦领土葡萄牙帕劳巴拉圭卡塔尔大洋洲边远群岛留尼汪罗马尼亚塞尔维亚俄罗斯卢旺达沙特阿拉伯所罗门群岛塞舌" + - "尔苏丹瑞典新加坡圣赫勒拿斯洛文尼亚斯瓦尔巴和扬马延斯洛伐克塞拉利昂圣马力诺塞内加尔索马里苏里南南苏丹圣多美和普林西比萨尔瓦多荷属圣马丁叙利亚" + - "斯威士兰特里斯坦-达库尼亚群岛特克斯和凯科斯群岛乍得法属南部领地多哥泰国塔吉克斯坦托克劳东帝汶土库曼斯坦突尼斯汤加土耳其特立尼达和多巴哥图瓦" + - "卢台湾坦桑尼亚乌克兰乌干达美国本土外小岛屿联合国美国乌拉圭乌兹别克斯坦梵蒂冈圣文森特和格林纳丁斯委内瑞拉英属维尔京群岛美属维尔京群岛越南瓦努" + - "阿图瓦利斯和富图纳萨摩亚科索沃也门马约特南非赞比亚津巴布韦未知地区世界非洲北美洲南美洲大洋洲西非中美洲东非北非中非南部非洲美洲美洲北部加勒比" + - "地区东亚南亚东南亚南欧澳大拉西亚美拉尼西亚密克罗尼西亚地区玻利尼西亚亚洲中亚西亚欧洲东欧北欧西欧拉丁美洲" - -var zhRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x0015, 0x002d, 0x0036, 0x004b, 0x0054, 0x0063, - 0x006f, 0x0078, 0x0081, 0x008a, 0x0099, 0x00a2, 0x00ae, 0x00b7, - 0x00c3, 0x00cf, 0x00ed, 0x00f9, 0x0105, 0x010e, 0x011d, 0x0129, - 0x012f, 0x0138, 0x013e, 0x014d, 0x0156, 0x015c, 0x0168, 0x017a, - 0x0180, 0x0189, 0x018f, 0x0198, 0x01a4, 0x01b0, 0x01b9, 0x01c2, - 0x01dd, 0x01ec, 0x01fb, 0x020a, 0x0210, 0x021c, 0x0228, 0x022e, - 0x0237, 0x023d, 0x0249, 0x0258, 0x0267, 0x026d, 0x0276, 0x027f, - 0x0288, 0x0294, 0x029a, 0x02a0, 0x02b2, 0x02bb, 0x02c1, 0x02cd, - // Entry 40 - 7F - 0x02e2, 0x02f1, 0x0306, 0x0312, 0x031e, 0x0324, 0x0330, 0x033f, - 0x0348, 0x0357, 0x035d, 0x035d, 0x0363, 0x0369, 0x0378, 0x038a, - 0x0396, 0x039c, 0x03a2, 0x03a8, 0x03b4, 0x03c0, 0x03cf, 0x03db, - 0x03e1, 0x03ed, 0x03f6, 0x03ff, 0x0408, 0x0414, 0x0423, 0x0429, - 0x044a, 0x0456, 0x045c, 0x046b, 0x0474, 0x048f, 0x04ad, 0x04b9, - 0x04c5, 0x04cb, 0x04d4, 0x04e3, 0x04f2, 0x04fb, 0x0504, 0x050d, - 0x0513, 0x0528, 0x0531, 0x0537, 0x053d, 0x0546, 0x054f, 0x0558, - 0x055e, 0x0564, 0x056d, 0x057f, 0x0588, 0x0594, 0x059d, 0x05b2, - // Entry 80 - BF - 0x05b8, 0x05be, 0x05c7, 0x05d3, 0x05e2, 0x05e8, 0x05f1, 0x05fd, - 0x060c, 0x0618, 0x0624, 0x062d, 0x0636, 0x063f, 0x064b, 0x0654, - 0x065d, 0x0666, 0x0672, 0x0678, 0x0684, 0x0693, 0x06a2, 0x06ab, - 0x06b1, 0x06b7, 0x06bd, 0x06d8, 0x06ed, 0x06f9, 0x0708, 0x0717, - 0x0720, 0x072c, 0x0738, 0x0741, 0x074a, 0x0756, 0x0762, 0x076e, - 0x0780, 0x0789, 0x0795, 0x07a1, 0x07ad, 0x07b3, 0x07b9, 0x07c2, - 0x07c8, 0x07ce, 0x07d7, 0x07dd, 0x07e6, 0x07ec, 0x0801, 0x0816, - 0x081f, 0x082b, 0x0831, 0x084f, 0x0861, 0x086d, 0x087f, 0x0888, - // Entry C0 - FF - 0x088e, 0x0897, 0x08a0, 0x08b5, 0x08be, 0x08ca, 0x08d6, 0x08df, - 0x08e8, 0x08f7, 0x0906, 0x090f, 0x0915, 0x091b, 0x0924, 0x0930, - 0x093f, 0x0957, 0x0963, 0x096f, 0x097b, 0x0987, 0x0990, 0x0999, - 0x09a2, 0x09ba, 0x09c6, 0x09d5, 0x09de, 0x09ea, 0x0a09, 0x0a24, - 0x0a2a, 0x0a3c, 0x0a42, 0x0a48, 0x0a57, 0x0a60, 0x0a69, 0x0a78, - 0x0a81, 0x0a87, 0x0a90, 0x0aa8, 0x0ab1, 0x0ab7, 0x0ac3, 0x0acc, - 0x0ad5, 0x0aed, 0x0af6, 0x0afc, 0x0b05, 0x0b17, 0x0b20, 0x0b3e, - 0x0b4a, 0x0b5f, 0x0b74, 0x0b7a, 0x0b86, 0x0b9b, 0x0ba4, 0x0bad, - // Entry 100 - 13F - 0x0bb3, 0x0bbc, 0x0bc2, 0x0bcb, 0x0bd7, 0x0be3, 0x0be9, 0x0bef, - 0x0bf8, 0x0c01, 0x0c0a, 0x0c10, 0x0c19, 0x0c1f, 0x0c25, 0x0c2b, - 0x0c37, 0x0c3d, 0x0c49, 0x0c58, 0x0c5e, 0x0c64, 0x0c6d, 0x0c73, - 0x0c82, 0x0c91, 0x0ca9, 0x0cb8, 0x0cbe, 0x0cc4, 0x0cca, 0x0cd0, - 0x0cd6, 0x0cdc, 0x0ce2, 0x0cee, -} // Size: 608 bytes - -const zhHantRegionStr string = "" + // Size: 3255 bytes - "阿森松島安道爾阿拉伯聯合大公國阿富汗安地卡及巴布達安圭拉阿爾巴尼亞亞美尼亞安哥拉南極洲阿根廷美屬薩摩亞奧地利澳洲荷屬阿魯巴奧蘭群島亞塞拜然波士尼" + - "亞與赫塞哥維納巴貝多孟加拉比利時布吉納法索保加利亞巴林蒲隆地貝南聖巴瑟米百慕達汶萊玻利維亞荷蘭加勒比區巴西巴哈馬不丹布威島波札那白俄羅斯貝里" + - "斯加拿大科科斯(基林)群島剛果(金夏沙)中非共和國剛果(布拉薩)瑞士象牙海岸庫克群島智利喀麥隆中國哥倫比亞克里派頓島哥斯大黎加古巴維德角庫拉" + - "索聖誕島賽普勒斯捷克德國迪亞哥加西亞島吉布地丹麥多米尼克多明尼加共和國阿爾及利亞休達與梅利利亞厄瓜多愛沙尼亞埃及西撒哈拉厄利垂亞西班牙衣索比" + - "亞歐盟芬蘭斐濟福克蘭群島密克羅尼西亞群島法羅群島法國加彭英國格瑞那達喬治亞法屬圭亞那根息迦納直布羅陀格陵蘭甘比亞幾內亞瓜地洛普赤道幾內亞希臘" + - "南喬治亞與南三明治群島瓜地馬拉關島幾內亞比索蓋亞那中國香港特別行政區赫德島和麥克唐納群島宏都拉斯克羅埃西亞海地匈牙利加那利群島印尼愛爾蘭以色" + - "列曼島印度英屬印度洋領地伊拉克伊朗冰島義大利澤西島牙買加約旦日本肯亞吉爾吉斯柬埔寨吉里巴斯葛摩聖克里斯多福及尼維斯北韓南韓科威特開曼群島哈薩" + - "克寮國黎巴嫩聖露西亞列支敦斯登斯里蘭卡賴比瑞亞賴索托立陶宛盧森堡拉脫維亞利比亞摩洛哥摩納哥摩爾多瓦蒙特內哥羅法屬聖馬丁馬達加斯加馬紹爾群島馬" + - "其頓馬利緬甸蒙古中國澳門特別行政區北馬里亞納群島馬丁尼克島茅利塔尼亞蒙哲臘馬爾他模里西斯馬爾地夫馬拉威墨西哥馬來西亞莫三比克納米比亞新喀里多" + - "尼亞尼日諾福克島奈及利亞尼加拉瓜荷蘭挪威尼泊爾諾魯紐埃島紐西蘭阿曼王國巴拿馬秘魯法屬玻里尼西亞巴布亞紐幾內亞菲律賓巴基斯坦波蘭聖皮埃爾和密克" + - "隆群島皮特肯群島波多黎各巴勒斯坦自治區葡萄牙帛琉巴拉圭卡達大洋洲邊疆群島留尼旺羅馬尼亞塞爾維亞俄羅斯盧安達沙烏地阿拉伯索羅門群島塞席爾蘇丹瑞" + - "典新加坡聖赫勒拿島斯洛維尼亞冷岸及央棉斯洛伐克獅子山聖馬利諾塞內加爾索馬利亞蘇利南南蘇丹聖多美普林西比薩爾瓦多荷屬聖馬丁敘利亞史瓦濟蘭特里斯" + - "坦達庫尼亞群島土克斯及開科斯群島查德法屬南方屬地多哥泰國塔吉克托克勞群島東帝汶土庫曼突尼西亞東加土耳其千里達及托巴哥吐瓦魯台灣坦尚尼亞烏克蘭" + - "烏干達美國本土外小島嶼聯合國美國烏拉圭烏茲別克梵蒂岡聖文森及格瑞那丁委內瑞拉英屬維京群島美屬維京群島越南萬那杜瓦利斯群島和富圖那群島薩摩亞科" + - "索沃葉門馬約特南非尚比亞辛巴威未知區域世界非洲北美洲南美洲大洋洲西非中美東非北非中非非洲南部美洲北美加勒比海東亞南亞東南亞南歐澳洲與紐西蘭美" + - "拉尼西亞密克羅尼西亞玻里尼西亞亞洲中亞西亞歐洲東歐北歐西歐拉丁美洲" - -var zhHantRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x000c, 0x0015, 0x002d, 0x0036, 0x004b, 0x0054, 0x0063, - 0x006f, 0x0078, 0x0081, 0x008a, 0x0099, 0x00a2, 0x00a8, 0x00b7, - 0x00c3, 0x00cf, 0x00ed, 0x00f6, 0x00ff, 0x0108, 0x0117, 0x0123, - 0x0129, 0x0132, 0x0138, 0x0144, 0x014d, 0x0153, 0x015f, 0x0171, - 0x0177, 0x0180, 0x0186, 0x018f, 0x0198, 0x01a4, 0x01ad, 0x01b6, - 0x01d1, 0x01e6, 0x01f5, 0x020a, 0x0210, 0x021c, 0x0228, 0x022e, - 0x0237, 0x023d, 0x0249, 0x0258, 0x0267, 0x026d, 0x0276, 0x027f, - 0x0288, 0x0294, 0x029a, 0x02a0, 0x02b5, 0x02be, 0x02c4, 0x02d0, - // Entry 40 - 7F - 0x02e5, 0x02f4, 0x0309, 0x0312, 0x031e, 0x0324, 0x0330, 0x033c, - 0x0345, 0x0351, 0x0357, 0x0357, 0x035d, 0x0363, 0x0372, 0x038a, - 0x0396, 0x039c, 0x03a2, 0x03a8, 0x03b4, 0x03bd, 0x03cc, 0x03d2, - 0x03d8, 0x03e4, 0x03ed, 0x03f6, 0x03ff, 0x040b, 0x041a, 0x0420, - 0x0441, 0x044d, 0x0453, 0x0462, 0x046b, 0x0486, 0x04a4, 0x04b0, - 0x04bf, 0x04c5, 0x04ce, 0x04dd, 0x04e3, 0x04ec, 0x04f5, 0x04fb, - 0x0501, 0x0516, 0x051f, 0x0525, 0x052b, 0x0534, 0x053d, 0x0546, - 0x054c, 0x0552, 0x0558, 0x0564, 0x056d, 0x0579, 0x057f, 0x059d, - // Entry 80 - BF - 0x05a3, 0x05a9, 0x05b2, 0x05be, 0x05c7, 0x05cd, 0x05d6, 0x05e2, - 0x05f1, 0x05fd, 0x0609, 0x0612, 0x061b, 0x0624, 0x0630, 0x0639, - 0x0642, 0x064b, 0x0657, 0x0666, 0x0675, 0x0684, 0x0693, 0x069c, - 0x06a2, 0x06a8, 0x06ae, 0x06c9, 0x06de, 0x06ed, 0x06fc, 0x0705, - 0x070e, 0x071a, 0x0726, 0x072f, 0x0738, 0x0744, 0x0750, 0x075c, - 0x076e, 0x0774, 0x0780, 0x078c, 0x0798, 0x079e, 0x07a4, 0x07ad, - 0x07b3, 0x07bc, 0x07c5, 0x07d1, 0x07da, 0x07e0, 0x07f5, 0x080a, - 0x0813, 0x081f, 0x0825, 0x0843, 0x0852, 0x085e, 0x0873, 0x087c, - // Entry C0 - FF - 0x0882, 0x088b, 0x0891, 0x08a6, 0x08af, 0x08bb, 0x08c7, 0x08d0, - 0x08d9, 0x08eb, 0x08fa, 0x0903, 0x0909, 0x090f, 0x0918, 0x0927, - 0x0936, 0x0945, 0x0951, 0x095a, 0x0966, 0x0972, 0x097e, 0x0987, - 0x0990, 0x09a5, 0x09b1, 0x09c0, 0x09c9, 0x09d5, 0x09f3, 0x0a0e, - 0x0a14, 0x0a26, 0x0a2c, 0x0a32, 0x0a3b, 0x0a4a, 0x0a53, 0x0a5c, - 0x0a68, 0x0a6e, 0x0a77, 0x0a8c, 0x0a95, 0x0a9b, 0x0aa7, 0x0ab0, - 0x0ab9, 0x0ad1, 0x0ada, 0x0ae0, 0x0ae9, 0x0af5, 0x0afe, 0x0b16, - 0x0b22, 0x0b34, 0x0b46, 0x0b4c, 0x0b55, 0x0b76, 0x0b7f, 0x0b88, - // Entry 100 - 13F - 0x0b8e, 0x0b97, 0x0b9d, 0x0ba6, 0x0baf, 0x0bbb, 0x0bc1, 0x0bc7, - 0x0bd0, 0x0bd9, 0x0be2, 0x0be8, 0x0bee, 0x0bf4, 0x0bfa, 0x0c00, - 0x0c0c, 0x0c12, 0x0c18, 0x0c24, 0x0c2a, 0x0c30, 0x0c39, 0x0c3f, - 0x0c51, 0x0c60, 0x0c72, 0x0c81, 0x0c87, 0x0c8d, 0x0c93, 0x0c99, - 0x0c9f, 0x0ca5, 0x0cab, 0x0cb7, -} // Size: 608 bytes - -const zuRegionStr string = "" + // Size: 3561 bytes - "i-Ascension Islandi-Andorrai-United Arab Emiratesi-Afghanistani-Antigua " + - "ne-Barbudai-Anguillai-Albaniai-Armeniai-Angolai-Antarcticai-Argentinai-A" + - "merican Samoai-Austriai-Australiai-Arubai-Åland Islandsi-Azerbaijani-Bos" + - "nia ne-Herzegovinai-Barbadosi-Bangladeshi-Belgiumi-Burkina Fasoi-Bulgari" + - "ai-Bahraini-Burundii-Benini-Saint Barthélemyi-Bermudai-Bruneii-Boliviai-" + - "Caribbean Netherlandsi-Brazili-Bahamasi-Bhutani-Bouvet IslandiBotswanai-" + - "Belarusi-Belizei-Canadai-Cocos (Keeling) Islandsi-Congo - Kinshasai-Cent" + - "ral African Republici-Congo - Brazzavillei-Switzerlandi-Côte d’Ivoirei-C" + - "ook Islandsi-Chilei-Camerooni-Chinai-Colombiai-Clipperton Islandi-Costa " + - "Ricai-Cubai-Cape Verdei-Curaçaoi-Christmas Islandi-Cyprusi-Czechiai-Germ" + - "anyi-Diego Garciai-Djiboutii-Denmarki-Dominicai-Dominican Republici-Alge" + - "riai-Cueta ne-Melillai-Ecuadori-Estoniai-Egypti-Western Saharai-Eritreai" + - "-Spaini-Ethiopiai-European Unioni-Finlandi-Fijii-Falkland Islandsi-Micro" + - "nesiai-Faroe Islandsi-Francei-Gaboni-United Kingdomi-Grenadai-Georgiai-F" + - "rench Guianai-Guernseyi-Ghanai-Gibraltari-Greenlandi-Gambiai-Guineai-Gua" + - "deloupei-Equatorial Guineai-Greecei-South Georgia ne-South Sandwich Isla" + - "ndsi-Guatemalai-Guami-Guinea-Bissaui-Guyanai-Hong Kong SAR Chinai-Heard " + - "Island ne-McDonald Islandsi-Hondurasi-Croatiai-Haitii-Hungaryi-Canary Is" + - "landsi-Indonesiai-Irelandkwa-Israeli-Isle of Mani-Indiai-British Indian " + - "Ocean Territoryi-Iraqi-Irani-Icelandi-Italyi-Jerseyi-Jamaicai-Jordani-Ja" + - "pani-Kenyai-Kyrgyzstani-Cambodiai-Kiribatii-Comorosi-Saint Kitts ne-Nevi" + - "si-North Koreai-South Koreai-Kuwaiti-Cayman Islandsi-Kazakhstani-Laosi-L" + - "ebanoni-Saint Luciai-Liechtensteini-Sri Lankai-LiberiaiLesothoi-Lithuani" + - "ai-Luxembourgi-Latviai-Libyai-Moroccoi-Monacoi-Moldovai-Montenegroi-Sain" + - "t Martini-Madagascari-Marshall Islandsi-MacedoniaiMalii-Myanmar (Burma)i" + - "-Mongoliai-Macau SAR Chinai-Northern Mariana Islandsi-Martiniquei-Maurit" + - "aniai-Montserrati-Maltai-Mauritiusi-MaldivesiMalawii-Mexicoi-Malaysiai-M" + - "ozambiquei-Namibiai-New Caledoniai-Nigeri-Norfolk Islandi-Nigeriai-Nicar" + - "aguai-Netherlandsi-Norwayi-Nepali-Naurui-Niuei-New Zealandi-Omani-Panama" + - "i-Perui-French Polynesiai-Papua New Guineai-Philippinesi-Pakistani-Polan" + - "di-Saint Pierre kanye ne-Miqueloni-Pitcairn Islandsi-Puerto Ricoi-Palest" + - "inian Territoriesi-Portugali-Palaui-Paraguayi-Qatari-Outlying Oceaniai-R" + - "éunioni-Romaniai-Serbiai-Russiai-Rwandai-Saudi Arabiai-Solomon Islandsi" + - "-Seychellesi-Sudani-Swedeni-Singaporei-St. Helenai-Sloveniai-Svalbard ne" + - "-Jan Mayeni-Slovakiai-Sierra Leonei-San Marinoi-Senegali-Somaliai-Surina" + - "mei-South Sudani-São Tomé kanye ne-Príncipei-El Salvadori-Sint Maarteni-" + - "Syriai-Swazilandi-Tristan da Cunhai-Turks ne-Caicos Islandsi-Chadi-Frenc" + - "h Southern Territoriesi-Togoi-Thailandi-Tajikistani-Tokelaui-Timor-Leste" + - "i-Turkmenistani-Tunisiai-Tongai-Turkeyi-Trinidad ne-Tobagoi-Tuvalui-Taiw" + - "ani-Tanzaniai-Ukrainei-Ugandai-U.S. Minor Outlying IslandsI-United Natio" + - "nsi-United Statesi-Uruguayi-Uzbekistani-Vatican Cityi-Saint Vincent ne-G" + - "renadinesi-Venezuelai-British Virgin Islandsi-U.S. Virgin Islandsi-Vietn" + - "ami-Vanuatui-Wallis ne-Futunai-Samoai-Kosovoi-Yemeni-Mayottei-South Afri" + - "cai-ZambiaiZimbabweiSifunda esingaziwaumhlabai-Africai-North Americai-So" + - "uth Americai-Oceaniai-Western Africai-Central Americai-Eastern Africai-N" + - "orthern Africai-Middle Africai-Southern Africai-Americasi-Northern Ameri" + - "cai-Caribbeani-Eastern Asiai-Southern Asiai-South-Eastern Asiai-Southern" + - " Europei-Australasiai-Melanesiai-Micronesian Regioni-Polynesiai-Asiai-Ce" + - "ntral Asiai-Western Asiai-Europei-Eastern Europei-Northern Europei-Weste" + - "rn Europei-Latin America" - -var zuRegionIdx = []uint16{ // 292 elements - // Entry 0 - 3F - 0x0000, 0x0012, 0x001b, 0x0031, 0x003e, 0x0052, 0x005c, 0x0065, - 0x006e, 0x0076, 0x0082, 0x008d, 0x009d, 0x00a6, 0x00b1, 0x00b8, - 0x00c8, 0x00d4, 0x00eb, 0x00f5, 0x0101, 0x010a, 0x0118, 0x0122, - 0x012b, 0x0134, 0x013b, 0x014e, 0x0157, 0x015f, 0x0168, 0x017f, - 0x0187, 0x0190, 0x0198, 0x01a7, 0x01b0, 0x01b9, 0x01c1, 0x01c9, - 0x01e2, 0x01f4, 0x020e, 0x0223, 0x0230, 0x0242, 0x0250, 0x0257, - 0x0261, 0x0268, 0x0272, 0x0285, 0x0291, 0x0297, 0x02a3, 0x02ad, - 0x02bf, 0x02c7, 0x02d0, 0x02d9, 0x02e7, 0x02f1, 0x02fa, 0x0304, - // Entry 40 - 7F - 0x0318, 0x0321, 0x0333, 0x033c, 0x0345, 0x034c, 0x035c, 0x0365, - 0x036c, 0x0376, 0x0386, 0x0386, 0x038f, 0x0395, 0x03a7, 0x03b3, - 0x03c2, 0x03ca, 0x03d1, 0x03e1, 0x03ea, 0x03f3, 0x0402, 0x040c, - 0x0413, 0x041e, 0x0429, 0x0431, 0x0439, 0x0445, 0x0458, 0x0460, - 0x0489, 0x0494, 0x049a, 0x04a9, 0x04b1, 0x04c6, 0x04e8, 0x04f2, - 0x04fb, 0x0502, 0x050b, 0x051b, 0x0526, 0x052f, 0x0539, 0x0546, - 0x054d, 0x056d, 0x0573, 0x0579, 0x0582, 0x0589, 0x0591, 0x059a, - 0x05a2, 0x05a9, 0x05b0, 0x05bc, 0x05c6, 0x05d0, 0x05d9, 0x05ef, - // Entry 80 - BF - 0x05fc, 0x0609, 0x0611, 0x0621, 0x062d, 0x0633, 0x063c, 0x0649, - 0x0658, 0x0663, 0x066c, 0x0674, 0x067f, 0x068b, 0x0693, 0x069a, - 0x06a3, 0x06ab, 0x06b4, 0x06c0, 0x06ce, 0x06da, 0x06ec, 0x06f7, - 0x06fc, 0x070d, 0x0717, 0x0728, 0x0742, 0x074e, 0x075a, 0x0766, - 0x076d, 0x0778, 0x0782, 0x0789, 0x0791, 0x079b, 0x07a7, 0x07b0, - 0x07bf, 0x07c6, 0x07d6, 0x07df, 0x07ea, 0x07f7, 0x07ff, 0x0806, - 0x080d, 0x0813, 0x0820, 0x0826, 0x082e, 0x0834, 0x0846, 0x0858, - 0x0865, 0x086f, 0x0877, 0x0897, 0x08a9, 0x08b6, 0x08cf, 0x08d9, - // Entry C0 - FF - 0x08e0, 0x08ea, 0x08f1, 0x0903, 0x090d, 0x0916, 0x091e, 0x0926, - 0x092e, 0x093c, 0x094d, 0x0959, 0x0960, 0x0968, 0x0973, 0x097f, - 0x0989, 0x09a0, 0x09aa, 0x09b8, 0x09c4, 0x09cd, 0x09d6, 0x09e0, - 0x09ed, 0x0a0c, 0x0a19, 0x0a27, 0x0a2e, 0x0a39, 0x0a4b, 0x0a64, - 0x0a6a, 0x0a87, 0x0a8d, 0x0a97, 0x0aa3, 0x0aac, 0x0ab9, 0x0ac7, - 0x0ad0, 0x0ad7, 0x0adf, 0x0af3, 0x0afb, 0x0b03, 0x0b0d, 0x0b16, - 0x0b1e, 0x0b3b, 0x0b4b, 0x0b5a, 0x0b63, 0x0b6f, 0x0b7d, 0x0b9a, - 0x0ba5, 0x0bbd, 0x0bd2, 0x0bdb, 0x0be4, 0x0bf6, 0x0bfd, 0x0c05, - // Entry 100 - 13F - 0x0c0c, 0x0c15, 0x0c23, 0x0c2b, 0x0c34, 0x0c47, 0x0c4e, 0x0c56, - 0x0c65, 0x0c74, 0x0c7d, 0x0c8d, 0x0c9e, 0x0cae, 0x0cbf, 0x0cce, - 0x0cdf, 0x0ce9, 0x0cfb, 0x0d06, 0x0d14, 0x0d23, 0x0d37, 0x0d48, - 0x0d55, 0x0d60, 0x0d74, 0x0d7f, 0x0d85, 0x0d93, 0x0da1, 0x0da9, - 0x0db9, 0x0dca, 0x0dda, 0x0de9, -} // Size: 608 bytes - -// Total size for region: 846671 bytes (846 KB) - -const numSupported = 252 - -const supported string = "" + // Size: 1065 bytes - "af|agq|ak|am|ar|ar-EG|ar-LY|ar-SA|as|asa|ast|az|az-Cyrl|bas|be|bem|bez|b" + - "g|bm|bn|bn-IN|bo|bo-IN|br|brx|bs|bs-Cyrl|ca|ce|cgg|chr|ckb|cs|cy|da|dav|" + - "de|de-AT|de-CH|de-LU|dje|dsb|dua|dyo|dz|ebu|ee|el|en|en-AU|en-IN|en-NZ|e" + - "o|es|es-419|es-AR|es-BO|es-CL|es-CO|es-CR|es-DO|es-EC|es-GT|es-HN|es-MX|" + - "es-NI|es-PA|es-PE|es-PR|es-PY|es-SV|es-US|es-VE|et|eu|ewo|fa|fa-AF|ff|fi" + - "|fil|fo|fr|fr-BE|fr-CA|fr-CH|fur|fy|ga|gd|gl|gsw|gu|guz|gv|ha|haw|he|hi|" + - "hr|hsb|hu|hy|id|ig|ii|is|it|ja|jgo|jmc|ka|kab|kam|kde|kea|khq|ki|kk|kkj|" + - "kl|kln|km|kn|ko|ko-KP|kok|ks|ksb|ksf|ksh|kw|ky|lag|lb|lg|lkt|ln|lo|lrc|l" + - "t|lu|luo|luy|lv|mas|mer|mfe|mg|mgh|mgo|mk|ml|mn|mr|ms|mt|mua|my|mzn|naq|" + - "nd|ne|nl|nmg|nn|nnh|no|nus|nyn|om|or|os|pa|pa-Arab|pl|prg|ps|pt|pt-PT|qu" + - "|rm|rn|ro|ro-MD|rof|ru|ru-UA|rw|rwk|sah|saq|sbp|se|se-FI|seh|ses|sg|shi|" + - "shi-Latn|si|sk|sl|smn|sn|so|sq|sr|sr-Cyrl-BA|sr-Cyrl-ME|sr-Cyrl-XK|sr-La" + - "tn|sr-Latn-BA|sr-Latn-ME|sr-Latn-XK|sv|sv-FI|sw|sw-CD|sw-KE|ta|te|teo|th" + - "|ti|to|tr|twq|tzm|ug|uk|ur|ur-IN|uz|uz-Arab|uz-Cyrl|vai|vai-Latn|vi|vun|" + - "wae|xog|yav|yi|yo|yo-BJ|yue|zgh|zh|zh-Hant|zh-Hant-HK|zu|" - -// Dictionary entries of frequent languages -var ( - af = Dictionary{ // af - nil, - header{afLangStr, afLangIdx}, - header{afScriptStr, afScriptIdx}, - header{afRegionStr, afRegionIdx}, - } - am = Dictionary{ // am - nil, - header{amLangStr, amLangIdx}, - header{amScriptStr, amScriptIdx}, - header{amRegionStr, amRegionIdx}, - } - ar = Dictionary{ // ar - nil, - header{arLangStr, arLangIdx}, - header{arScriptStr, arScriptIdx}, - header{arRegionStr, arRegionIdx}, - } - az = Dictionary{ // az - nil, - header{azLangStr, azLangIdx}, - header{azScriptStr, azScriptIdx}, - header{azRegionStr, azRegionIdx}, - } - bg = Dictionary{ // bg - nil, - header{bgLangStr, bgLangIdx}, - header{bgScriptStr, bgScriptIdx}, - header{bgRegionStr, bgRegionIdx}, - } - bn = Dictionary{ // bn - nil, - header{bnLangStr, bnLangIdx}, - header{bnScriptStr, bnScriptIdx}, - header{bnRegionStr, bnRegionIdx}, - } - ca = Dictionary{ // ca - nil, - header{caLangStr, caLangIdx}, - header{caScriptStr, caScriptIdx}, - header{caRegionStr, caRegionIdx}, - } - cs = Dictionary{ // cs - nil, - header{csLangStr, csLangIdx}, - header{csScriptStr, csScriptIdx}, - header{csRegionStr, csRegionIdx}, - } - da = Dictionary{ // da - nil, - header{daLangStr, daLangIdx}, - header{daScriptStr, daScriptIdx}, - header{daRegionStr, daRegionIdx}, - } - de = Dictionary{ // de - nil, - header{deLangStr, deLangIdx}, - header{deScriptStr, deScriptIdx}, - header{deRegionStr, deRegionIdx}, - } - el = Dictionary{ // el - nil, - header{elLangStr, elLangIdx}, - header{elScriptStr, elScriptIdx}, - header{elRegionStr, elRegionIdx}, - } - en = Dictionary{ // en - nil, - header{enLangStr, enLangIdx}, - header{enScriptStr, enScriptIdx}, - header{enRegionStr, enRegionIdx}, - } - es = Dictionary{ // es - nil, - header{esLangStr, esLangIdx}, - header{esScriptStr, esScriptIdx}, - header{esRegionStr, esRegionIdx}, - } - es419 = Dictionary{ // es-419 - &es, - header{es419LangStr, es419LangIdx}, - header{es419ScriptStr, es419ScriptIdx}, - header{es419RegionStr, es419RegionIdx}, - } - et = Dictionary{ // et - nil, - header{etLangStr, etLangIdx}, - header{etScriptStr, etScriptIdx}, - header{etRegionStr, etRegionIdx}, - } - fa = Dictionary{ // fa - nil, - header{faLangStr, faLangIdx}, - header{faScriptStr, faScriptIdx}, - header{faRegionStr, faRegionIdx}, - } - fi = Dictionary{ // fi - nil, - header{fiLangStr, fiLangIdx}, - header{fiScriptStr, fiScriptIdx}, - header{fiRegionStr, fiRegionIdx}, - } - fil = Dictionary{ // fil - nil, - header{filLangStr, filLangIdx}, - header{filScriptStr, filScriptIdx}, - header{filRegionStr, filRegionIdx}, - } - fr = Dictionary{ // fr - nil, - header{frLangStr, frLangIdx}, - header{frScriptStr, frScriptIdx}, - header{frRegionStr, frRegionIdx}, - } - frCA = Dictionary{ // fr-CA - &fr, - header{frCALangStr, frCALangIdx}, - header{frCAScriptStr, frCAScriptIdx}, - header{frCARegionStr, frCARegionIdx}, - } - gu = Dictionary{ // gu - nil, - header{guLangStr, guLangIdx}, - header{guScriptStr, guScriptIdx}, - header{guRegionStr, guRegionIdx}, - } - he = Dictionary{ // he - nil, - header{heLangStr, heLangIdx}, - header{heScriptStr, heScriptIdx}, - header{heRegionStr, heRegionIdx}, - } - hi = Dictionary{ // hi - nil, - header{hiLangStr, hiLangIdx}, - header{hiScriptStr, hiScriptIdx}, - header{hiRegionStr, hiRegionIdx}, - } - hr = Dictionary{ // hr - nil, - header{hrLangStr, hrLangIdx}, - header{hrScriptStr, hrScriptIdx}, - header{hrRegionStr, hrRegionIdx}, - } - hu = Dictionary{ // hu - nil, - header{huLangStr, huLangIdx}, - header{huScriptStr, huScriptIdx}, - header{huRegionStr, huRegionIdx}, - } - hy = Dictionary{ // hy - nil, - header{hyLangStr, hyLangIdx}, - header{hyScriptStr, hyScriptIdx}, - header{hyRegionStr, hyRegionIdx}, - } - id = Dictionary{ // id - nil, - header{idLangStr, idLangIdx}, - header{idScriptStr, idScriptIdx}, - header{idRegionStr, idRegionIdx}, - } - is = Dictionary{ // is - nil, - header{isLangStr, isLangIdx}, - header{isScriptStr, isScriptIdx}, - header{isRegionStr, isRegionIdx}, - } - it = Dictionary{ // it - nil, - header{itLangStr, itLangIdx}, - header{itScriptStr, itScriptIdx}, - header{itRegionStr, itRegionIdx}, - } - ja = Dictionary{ // ja - nil, - header{jaLangStr, jaLangIdx}, - header{jaScriptStr, jaScriptIdx}, - header{jaRegionStr, jaRegionIdx}, - } - ka = Dictionary{ // ka - nil, - header{kaLangStr, kaLangIdx}, - header{kaScriptStr, kaScriptIdx}, - header{kaRegionStr, kaRegionIdx}, - } - kk = Dictionary{ // kk - nil, - header{kkLangStr, kkLangIdx}, - header{kkScriptStr, kkScriptIdx}, - header{kkRegionStr, kkRegionIdx}, - } - km = Dictionary{ // km - nil, - header{kmLangStr, kmLangIdx}, - header{kmScriptStr, kmScriptIdx}, - header{kmRegionStr, kmRegionIdx}, - } - kn = Dictionary{ // kn - nil, - header{knLangStr, knLangIdx}, - header{knScriptStr, knScriptIdx}, - header{knRegionStr, knRegionIdx}, - } - ko = Dictionary{ // ko - nil, - header{koLangStr, koLangIdx}, - header{koScriptStr, koScriptIdx}, - header{koRegionStr, koRegionIdx}, - } - ky = Dictionary{ // ky - nil, - header{kyLangStr, kyLangIdx}, - header{kyScriptStr, kyScriptIdx}, - header{kyRegionStr, kyRegionIdx}, - } - lo = Dictionary{ // lo - nil, - header{loLangStr, loLangIdx}, - header{loScriptStr, loScriptIdx}, - header{loRegionStr, loRegionIdx}, - } - lt = Dictionary{ // lt - nil, - header{ltLangStr, ltLangIdx}, - header{ltScriptStr, ltScriptIdx}, - header{ltRegionStr, ltRegionIdx}, - } - lv = Dictionary{ // lv - nil, - header{lvLangStr, lvLangIdx}, - header{lvScriptStr, lvScriptIdx}, - header{lvRegionStr, lvRegionIdx}, - } - mk = Dictionary{ // mk - nil, - header{mkLangStr, mkLangIdx}, - header{mkScriptStr, mkScriptIdx}, - header{mkRegionStr, mkRegionIdx}, - } - ml = Dictionary{ // ml - nil, - header{mlLangStr, mlLangIdx}, - header{mlScriptStr, mlScriptIdx}, - header{mlRegionStr, mlRegionIdx}, - } - mn = Dictionary{ // mn - nil, - header{mnLangStr, mnLangIdx}, - header{mnScriptStr, mnScriptIdx}, - header{mnRegionStr, mnRegionIdx}, - } - mr = Dictionary{ // mr - nil, - header{mrLangStr, mrLangIdx}, - header{mrScriptStr, mrScriptIdx}, - header{mrRegionStr, mrRegionIdx}, - } - ms = Dictionary{ // ms - nil, - header{msLangStr, msLangIdx}, - header{msScriptStr, msScriptIdx}, - header{msRegionStr, msRegionIdx}, - } - my = Dictionary{ // my - nil, - header{myLangStr, myLangIdx}, - header{myScriptStr, myScriptIdx}, - header{myRegionStr, myRegionIdx}, - } - ne = Dictionary{ // ne - nil, - header{neLangStr, neLangIdx}, - header{neScriptStr, neScriptIdx}, - header{neRegionStr, neRegionIdx}, - } - nl = Dictionary{ // nl - nil, - header{nlLangStr, nlLangIdx}, - header{nlScriptStr, nlScriptIdx}, - header{nlRegionStr, nlRegionIdx}, - } - no = Dictionary{ // no - nil, - header{noLangStr, noLangIdx}, - header{noScriptStr, noScriptIdx}, - header{noRegionStr, noRegionIdx}, - } - pa = Dictionary{ // pa - nil, - header{paLangStr, paLangIdx}, - header{paScriptStr, paScriptIdx}, - header{paRegionStr, paRegionIdx}, - } - pl = Dictionary{ // pl - nil, - header{plLangStr, plLangIdx}, - header{plScriptStr, plScriptIdx}, - header{plRegionStr, plRegionIdx}, - } - pt = Dictionary{ // pt - nil, - header{ptLangStr, ptLangIdx}, - header{ptScriptStr, ptScriptIdx}, - header{ptRegionStr, ptRegionIdx}, - } - ptPT = Dictionary{ // pt-PT - &pt, - header{ptPTLangStr, ptPTLangIdx}, - header{ptPTScriptStr, ptPTScriptIdx}, - header{ptPTRegionStr, ptPTRegionIdx}, - } - ro = Dictionary{ // ro - nil, - header{roLangStr, roLangIdx}, - header{roScriptStr, roScriptIdx}, - header{roRegionStr, roRegionIdx}, - } - ru = Dictionary{ // ru - nil, - header{ruLangStr, ruLangIdx}, - header{ruScriptStr, ruScriptIdx}, - header{ruRegionStr, ruRegionIdx}, - } - si = Dictionary{ // si - nil, - header{siLangStr, siLangIdx}, - header{siScriptStr, siScriptIdx}, - header{siRegionStr, siRegionIdx}, - } - sk = Dictionary{ // sk - nil, - header{skLangStr, skLangIdx}, - header{skScriptStr, skScriptIdx}, - header{skRegionStr, skRegionIdx}, - } - sl = Dictionary{ // sl - nil, - header{slLangStr, slLangIdx}, - header{slScriptStr, slScriptIdx}, - header{slRegionStr, slRegionIdx}, - } - sq = Dictionary{ // sq - nil, - header{sqLangStr, sqLangIdx}, - header{sqScriptStr, sqScriptIdx}, - header{sqRegionStr, sqRegionIdx}, - } - sr = Dictionary{ // sr - nil, - header{srLangStr, srLangIdx}, - header{srScriptStr, srScriptIdx}, - header{srRegionStr, srRegionIdx}, - } - srLatn = Dictionary{ // sr-Latn - nil, - header{srLatnLangStr, srLatnLangIdx}, - header{srLatnScriptStr, srLatnScriptIdx}, - header{srLatnRegionStr, srLatnRegionIdx}, - } - sv = Dictionary{ // sv - nil, - header{svLangStr, svLangIdx}, - header{svScriptStr, svScriptIdx}, - header{svRegionStr, svRegionIdx}, - } - sw = Dictionary{ // sw - nil, - header{swLangStr, swLangIdx}, - header{swScriptStr, swScriptIdx}, - header{swRegionStr, swRegionIdx}, - } - ta = Dictionary{ // ta - nil, - header{taLangStr, taLangIdx}, - header{taScriptStr, taScriptIdx}, - header{taRegionStr, taRegionIdx}, - } - te = Dictionary{ // te - nil, - header{teLangStr, teLangIdx}, - header{teScriptStr, teScriptIdx}, - header{teRegionStr, teRegionIdx}, - } - th = Dictionary{ // th - nil, - header{thLangStr, thLangIdx}, - header{thScriptStr, thScriptIdx}, - header{thRegionStr, thRegionIdx}, - } - tr = Dictionary{ // tr - nil, - header{trLangStr, trLangIdx}, - header{trScriptStr, trScriptIdx}, - header{trRegionStr, trRegionIdx}, - } - uk = Dictionary{ // uk - nil, - header{ukLangStr, ukLangIdx}, - header{ukScriptStr, ukScriptIdx}, - header{ukRegionStr, ukRegionIdx}, - } - ur = Dictionary{ // ur - nil, - header{urLangStr, urLangIdx}, - header{urScriptStr, urScriptIdx}, - header{urRegionStr, urRegionIdx}, - } - uz = Dictionary{ // uz - nil, - header{uzLangStr, uzLangIdx}, - header{uzScriptStr, uzScriptIdx}, - header{uzRegionStr, uzRegionIdx}, - } - vi = Dictionary{ // vi - nil, - header{viLangStr, viLangIdx}, - header{viScriptStr, viScriptIdx}, - header{viRegionStr, viRegionIdx}, - } - zh = Dictionary{ // zh - nil, - header{zhLangStr, zhLangIdx}, - header{zhScriptStr, zhScriptIdx}, - header{zhRegionStr, zhRegionIdx}, - } - zhHant = Dictionary{ // zh-Hant - nil, - header{zhHantLangStr, zhHantLangIdx}, - header{zhHantScriptStr, zhHantScriptIdx}, - header{zhHantRegionStr, zhHantRegionIdx}, - } - zu = Dictionary{ // zu - nil, - header{zuLangStr, zuLangIdx}, - header{zuScriptStr, zuScriptIdx}, - header{zuRegionStr, zuRegionIdx}, - } -) - -// Total size for 79 entries: 10112 bytes (10 KB) - -// Number of keys: 217 -var ( - selfIndex = tagIndex{ - "afakamarasazbebgbmbnbobrbscacecscydadedzeeeleneoeseteufafffifofrfygagdgl" + - "gugvhahehihrhuhyidigiiisitjakakikkklkmknkokskwkylblglnloltlulvmgmkml" + - "mnmrmsmtmyndnenlnnnoomorospaplpsptqurmrnrorurwsesgsiskslsnsosqsrsvsw" + - "tatethtitotrugukuruzviyiyozhzu", - "agqasaastbasbembezbrxcggchrckbdavdjedsbduadyoebuewofilfurgswguzhawhsbjgo" + - "jmckabkamkdekeakhqkkjklnkokksbksfkshlaglktlrcluoluymasmermfemghmgomu" + - "amznnaqnnhnusnynprgrofrwksahsaqsbpsehsesshismnteotwqtzmvaivunwaexogy" + - "avyuezgh", - "", - } - selfTagsLong = []string{ // 26 elements - "ar-001", - "az-Cyrl", - "bs-Cyrl", - "de-AT", - "de-CH", - "en-AU", - "en-CA", - "en-GB", - "en-US", - "es-419", - "es-ES", - "es-MX", - "fa-AF", - "fr-CA", - "fr-CH", - "pa-Arab", - "pt-PT", - "ro-MD", - "shi-Latn", - "sr-Latn", - "sw-CD", - "uz-Arab", - "uz-Cyrl", - "vai-Latn", - "zh-Hans", - "zh-Hant", - } -) - -var selfHeaders = [1]header{ - { // mul - "AfrikaansAkanአማርኛالعربيةঅসমীয়াazərbaycanбеларускаябългарскиbamanakanবাং" + - "লাབོད་སྐད་brezhonegbosanskicatalàнохчийнčeštinaCymraegdanskDeutsch" + - "རྫོང་ཁEʋegbeΕλληνικάEnglishesperantoespañoleestieuskaraفارسیPulaar" + - "suomiføroysktfrançaisWest-FryskGaeilgeGàidhliggalegoગુજરાતીGaelgHaus" + - "aעבריתहिन्दीhrvatskimagyarհայերենIndonesiaIgboꆈꌠꉙíslenskaitaliano日本語" + - "ქართულიGikuyuқазақ тіліkalaallisutខ្មែរಕನ್ನಡ한국어کٲشُرkernewekкыргыз" + - "чаLëtzebuergeschLugandalingálaລາວlietuviųTshilubalatviešuMalagasyма" + - "кедонскиമലയാളംмонголमराठीBahasa MelayuMaltiမြန်မာisiNdebeleनेपालीNe" + - "derlandsnynorsknorsk bokmålOromooଓଡ଼ିଆиронਪੰਜਾਬੀpolskiپښتوportuguêsR" + - "unasimirumantschIkirundiromânăрусскийKinyarwandadavvisámegiellaSängö" + - "සිංහලslovenčinaslovenščinachiShonaSoomaalishqipсрпскиsvenskaKiswah" + - "iliதமிழ்తెలుగుไทยትግርኛlea fakatongaTürkçeئۇيغۇرچەукраїнськаاردوo‘zbek" + - "Tiếng ViệtייִדישÈdè Yorùbá中文isiZuluAghemKipareasturianuƁàsàaIchibemb" + - "aHibenaबड़ोRukigaᏣᎳᎩکوردیی ناوەندیKitaitaZarmaciinedolnoserbšćinaduá" + - "lájoolaKĩembuewondoFilipinofurlanSchwiizertüütschEkegusiiʻŌlelo Hawa" + - "iʻihornjoserbšćinaNdaꞌaKimachameTaqbaylitKikambaChimakondekabuverdia" + - "nuKoyra ciinikakɔKalenjinकोंकणीKishambaarikpaKölschKɨlaangiLakȟólʼiy" + - "apiلۊری شومالیDholuoLuluhiaMaaKĩmĩrũkreol morisienMakuametaʼMUNDAŊما" + - "زرونیKhoekhoegowabShwóŋò ngiembɔɔnThok NathRunyankoreprūsiskanKihor" + - "omboKiruwaсаха тылаKisampurIshisangusenaKoyraboro senniⵜⴰⵛⵍⵃⵉⵜanarâš" + - "kielâKitesoTasawaq senniTamaziɣt n laṭlaṣꕙꔤKyivunjoWalserOlusoganuas" + - "ue粵語ⵜⴰⵎⴰⵣⵉⵖⵜالعربية الرسمية الحديثةазәрбајҹанбосанскиÖsterreichische" + - "s DeutschSchweizer HochdeutschAustralian EnglishCanadian EnglishBrit" + - "ish EnglishAmerican Englishespañol latinoamericanoespañol de Españae" + - "spañol de Méxicoدریfrançais canadienfrançais suisseپنجابیportuguês e" + - "uropeumoldoveneascăTashelḥiytsrpskohrvatskiKingwanaاوزبیکўзбекчаVai简" + - "体中文繁體中文", - []uint16{ // 218 elements - // Entry 0 - 3F - 0x0000, 0x0009, 0x000d, 0x0019, 0x0027, 0x003c, 0x0047, 0x005b, - 0x006d, 0x0076, 0x0085, 0x009d, 0x00a6, 0x00ae, 0x00b5, 0x00c3, - 0x00cc, 0x00d3, 0x00d8, 0x00df, 0x00f1, 0x00f8, 0x0108, 0x010f, - 0x0118, 0x0120, 0x0125, 0x012c, 0x0136, 0x013c, 0x0141, 0x014a, - 0x0153, 0x015d, 0x0164, 0x016d, 0x0173, 0x0188, 0x018d, 0x0192, - 0x019c, 0x01ae, 0x01b6, 0x01bc, 0x01ca, 0x01d3, 0x01d7, 0x01e0, - 0x01e9, 0x01f1, 0x01fa, 0x020f, 0x0215, 0x0228, 0x0233, 0x0242, - 0x0251, 0x025a, 0x0264, 0x026c, 0x027c, 0x028b, 0x0292, 0x029a, - // Entry 40 - 7F - 0x02a3, 0x02ac, 0x02b4, 0x02bd, 0x02c5, 0x02d9, 0x02eb, 0x02f7, - 0x0306, 0x0313, 0x0318, 0x032a, 0x0334, 0x0346, 0x0350, 0x0357, - 0x0364, 0x036a, 0x0379, 0x0381, 0x0393, 0x0399, 0x03a1, 0x03ab, - 0x03b3, 0x03bc, 0x03c4, 0x03cc, 0x03da, 0x03e5, 0x03f5, 0x03fc, - 0x040b, 0x0416, 0x0423, 0x042b, 0x0433, 0x0438, 0x0444, 0x044b, - 0x0454, 0x0463, 0x0475, 0x047e, 0x048a, 0x0497, 0x049f, 0x04af, - 0x04c3, 0x04cb, 0x04d3, 0x04e1, 0x04ed, 0x04fb, 0x0501, 0x0508, - 0x050d, 0x0513, 0x051c, 0x0524, 0x052d, 0x0533, 0x053f, 0x0545, - // Entry 80 - BF - 0x054e, 0x0569, 0x0570, 0x057a, 0x058a, 0x0591, 0x0596, 0x059d, - 0x05a3, 0x05ab, 0x05b1, 0x05c3, 0x05cb, 0x05dc, 0x05ed, 0x05f4, - 0x05fd, 0x0606, 0x060d, 0x0617, 0x0623, 0x062e, 0x0633, 0x063b, - 0x064d, 0x0656, 0x065b, 0x0662, 0x066b, 0x067a, 0x068f, 0x0695, - 0x069c, 0x069f, 0x06a8, 0x06b6, 0x06bb, 0x06c1, 0x06c8, 0x06d6, - 0x06e3, 0x06f8, 0x0701, 0x070b, 0x0715, 0x071e, 0x0724, 0x0735, - 0x073d, 0x0746, 0x074a, 0x0759, 0x076e, 0x077c, 0x0782, 0x078f, - 0x07a5, 0x07ab, 0x07b3, 0x07b9, 0x07c0, 0x07c6, 0x07cc, 0x07e4, - // Entry C0 - FF - 0x0810, 0x0824, 0x0834, 0x084d, 0x0862, 0x0874, 0x0884, 0x0893, - 0x08a3, 0x08bb, 0x08ce, 0x08e1, 0x08e7, 0x08f9, 0x0909, 0x0915, - 0x0927, 0x0935, 0x0941, 0x094f, 0x0957, 0x0963, 0x0971, 0x0974, - 0x0980, 0x098c, - }, - }, -} - -// Total size for self: 4040 bytes (4 KB) - -// Total table size 2127659 bytes (2077KiB); checksum: E92D966F diff --git a/vendor/golang.org/x/text/language/testdata/CLDRLocaleMatcherTest.txt b/vendor/golang.org/x/text/language/testdata/CLDRLocaleMatcherTest.txt deleted file mode 100644 index 6568f2d3c..000000000 --- a/vendor/golang.org/x/text/language/testdata/CLDRLocaleMatcherTest.txt +++ /dev/null @@ -1,389 +0,0 @@ -# TODO: this file has not yet been included in the main CLDR release. -# The intent is to verify this file against the Go implementation and then -# correct the cases and add merge in other interesting test cases. -# See TestCLDRCompliance in match_test.go, as well as the list of exceptions -# defined in the map skip below it, for the work in progress. - -# Data-driven test for the XLocaleMatcher. -# Format -# • Everything after "#" is a comment -# • Arguments are separated by ";". They are: - -# supported ; desired ; expected - -# • The supported may have the threshold distance reset as a first item, eg 50, en, fr -# A line starting with @debug will reach a statement in the test code where you can put a breakpoint for debugging -# The test code also supports reformatting this file, by setting the REFORMAT flag. - -################################################## -# testParentLocales - -# es-419, es-AR, and es-MX are in a cluster; es is in a different one - -es-419, es-ES ; es-AR ; es-419 -es-ES, es-419 ; es-AR ; es-419 - -es-419, es ; es-AR ; es-419 -es, es-419 ; es-AR ; es-419 - -es-MX, es ; es-AR ; es-MX -es, es-MX ; es-AR ; es-MX - -# en-GB, en-AU, and en-NZ are in a cluster; en in a different one - -en-GB, en-US ; en-AU ; en-GB -en-US, en-GB ; en-AU ; en-GB - -en-GB, en ; en-AU ; en-GB -en, en-GB ; en-AU ; en-GB - -en-NZ, en-US ; en-AU ; en-NZ -en-US, en-NZ ; en-AU ; en-NZ - -en-NZ, en ; en-AU ; en-NZ -en, en-NZ ; en-AU ; en-NZ - -# pt-AU and pt-PT in one cluster; pt-BR in another - -pt-PT, pt-BR ; pt-AO ; pt-PT -pt-BR, pt-PT ; pt-AO ; pt-PT - -pt-PT, pt ; pt-AO ; pt-PT -pt, pt-PT ; pt-AO ; pt-PT - -zh-MO, zh-TW ; zh-HK ; zh-MO -zh-TW, zh-MO ; zh-HK ; zh-MO - -zh-MO, zh-TW ; zh-HK ; zh-MO -zh-TW, zh-MO ; zh-HK ; zh-MO - -zh-MO, zh-CN ; zh-HK ; zh-MO -zh-CN, zh-MO ; zh-HK ; zh-MO - -zh-MO, zh ; zh-HK ; zh-MO -zh, zh-MO ; zh-HK ; zh-MO - -################################################## -# testChinese - -zh-CN, zh-TW, iw ; zh-Hant-TW ; zh-TW -zh-CN, zh-TW, iw ; zh-Hant ; zh-TW -zh-CN, zh-TW, iw ; zh-TW ; zh-TW -zh-CN, zh-TW, iw ; zh-Hans-CN ; zh-CN -zh-CN, zh-TW, iw ; zh-CN ; zh-CN -zh-CN, zh-TW, iw ; zh ; zh-CN - -################################################## -# testenGB - -fr, en, en-GB, es-419, es-MX, es ; en-NZ ; en-GB -fr, en, en-GB, es-419, es-MX, es ; es-ES ; es -fr, en, en-GB, es-419, es-MX, es ; es-AR ; es-419 -fr, en, en-GB, es-419, es-MX, es ; es-MX ; es-MX - -################################################## -# testFallbacks - -91, en, hi ; sa ; hi - -################################################## -# testBasics - -fr, en-GB, en ; en-GB ; en-GB -fr, en-GB, en ; en ; en -fr, en-GB, en ; fr ; fr -fr, en-GB, en ; ja ; fr # return first if no match - -################################################## -# testFallback - -# check that script fallbacks are handled right - -zh-CN, zh-TW, iw ; zh-Hant ; zh-TW -zh-CN, zh-TW, iw ; zh ; zh-CN -zh-CN, zh-TW, iw ; zh-Hans-CN ; zh-CN -zh-CN, zh-TW, iw ; zh-Hant-HK ; zh-TW -zh-CN, zh-TW, iw ; he-IT ; iw - -################################################## -# testSpecials - -# check that nearby languages are handled - -en, fil, ro, nn ; tl ; fil -en, fil, ro, nn ; mo ; ro -en, fil, ro, nn ; nb ; nn - -# make sure default works - -en, fil, ro, nn ; ja ; en - -################################################## -# testRegionalSpecials - -# verify that en-AU is closer to en-GB than to en (which is en-US) - -en, en-GB, es, es-419 ; es-MX ; es-419 -en, en-GB, es, es-419 ; en-AU ; en-GB -en, en-GB, es, es-419 ; es-ES ; es - -################################################## -# testHK - -# HK and MO are closer to each other for Hant than to TW - -zh, zh-TW, zh-MO ; zh-HK ; zh-MO -zh, zh-TW, zh-HK ; zh-MO ; zh-HK - -################################################## -# testMatch-exact - -# see localeDistance.txt - -################################################## -# testMatch-none - -# see localeDistance.txt - -################################################## -# testMatch-matchOnMazimized - -zh, zh-Hant ; und-TW ; zh-Hant # und-TW should be closer to zh-Hant than to zh -en-Hant-TW, und-TW ; zh-Hant ; und-TW # zh-Hant should be closer to und-TW than to en-Hant-TW -en-Hant-TW, und-TW ; zh ; und-TW # zh should be closer to und-TW than to en-Hant-TW - -################################################## -# testMatchGrandfatheredCode - -fr, i-klingon, en-Latn-US ; en-GB-oed ; en-Latn-US - -################################################## -# testGetBestMatchForList-exactMatch -fr, en-GB, ja, es-ES, es-MX ; ja, de ; ja - -################################################## -# testGetBestMatchForList-simpleVariantMatch -fr, en-GB, ja, es-ES, es-MX ; de, en-US ; en-GB # Intentionally avoiding a perfect-match or two candidates for variant matches. - -# Fallback. - -fr, en-GB, ja, es-ES, es-MX ; de, zh ; fr - -################################################## -# testGetBestMatchForList-matchOnMaximized -# Check that if the preference is maximized already, it works as well. - -en, ja ; ja-Jpan-JP, en-AU ; ja # Match for ja-Jpan-JP (maximized already) - -# ja-JP matches ja on likely subtags, and it's listed first, thus it wins over the second preference en-GB. - -en, ja ; ja-JP, en-US ; ja # Match for ja-Jpan-JP (maximized already) - -# Check that if the preference is maximized already, it works as well. - -en, ja ; ja-Jpan-JP, en-US ; ja # Match for ja-Jpan-JP (maximized already) - -################################################## -# testGetBestMatchForList-noMatchOnMaximized -# Regression test for http://b/5714572 . -# de maximizes to de-DE. Pick the exact match for the secondary language instead. -en, de, fr, ja ; de-CH, fr ; de - -################################################## -# testBestMatchForTraditionalChinese - -# Scenario: An application that only supports Simplified Chinese (and some other languages), -# but does not support Traditional Chinese. zh-Hans-CN could be replaced with zh-CN, zh, or -# zh-Hans, it wouldn't make much of a difference. - -# The script distance (simplified vs. traditional Han) is considered small enough -# to be an acceptable match. The regional difference is considered almost insignificant. - -fr, zh-Hans-CN, en-US ; zh-TW ; zh-Hans-CN -fr, zh-Hans-CN, en-US ; zh-Hant ; zh-Hans-CN - -# For geo-political reasons, you might want to avoid a zh-Hant -> zh-Hans match. -# In this case, if zh-TW, zh-HK or a tag starting with zh-Hant is requested, you can -# change your call to getBestMatch to include a 2nd language preference. -# "en" is a better match since its distance to "en-US" is closer than the distance -# from "zh-TW" to "zh-CN" (script distance). - -fr, zh-Hans-CN, en-US ; zh-TW, en ; en-US -fr, zh-Hans-CN, en-US ; zh-Hant-CN, en, en ; en-US -fr, zh-Hans-CN, en-US ; zh-Hans, en ; zh-Hans-CN - -################################################## -# testUndefined -# When the undefined language doesn't match anything in the list, -# getBestMatch returns the default, as usual. - -it, fr ; und ; it - -# When it *does* occur in the list, bestMatch returns it, as expected. -it, und ; und ; und - -# The unusual part: max("und") = "en-Latn-US", and since matching is based on maximized -# tags, the undefined language would normally match English. But that would produce the -# counterintuitive results that getBestMatch("und", XLocaleMatcher("it,en")) would be "en", and -# getBestMatch("en", XLocaleMatcher("it,und")) would be "und". - -# To avoid that, we change the matcher's definitions of max -# so that max("und")="und". That produces the following, more desirable -# results: - -it, en ; und ; it -it, und ; en ; it - -################################################## -# testGetBestMatch-regionDistance - -es-AR, es ; es-MX ; es-AR -fr, en, en-GB ; en-CA ; en-GB -de-AT, de-DE, de-CH ; de ; de-DE - -################################################## -# testAsymmetry - -mul, nl ; af ; nl # af => nl -mul, af ; nl ; mul # but nl !=> af - -################################################## -# testGetBestMatchForList-matchOnMaximized2 - -# ja-JP matches ja on likely subtags, and it's listed first, thus it wins over the second preference en-GB. - -fr, en-GB, ja, es-ES, es-MX ; ja-JP, en-GB ; ja # Match for ja-JP, with likely region subtag - -# Check that if the preference is maximized already, it works as well. - -fr, en-GB, ja, es-ES, es-MX ; ja-Jpan-JP, en-GB ; ja # Match for ja-Jpan-JP (maximized already) - -################################################## -# testGetBestMatchForList-closeEnoughMatchOnMaximized - -en-GB, en, de, fr, ja ; de-CH, fr ; de -en-GB, en, de, fr, ja ; en-US, ar, nl, de, ja ; en - -################################################## -# testGetBestMatchForPortuguese - -# pt might be supported and not pt-PT - -# European user who prefers Spanish over Brazillian Portuguese as a fallback. - -pt-PT, pt-BR, es, es-419 ; pt-PT, es, pt ; pt-PT -pt-PT, pt, es, es-419 ; pt-PT, es, pt ; pt-PT # pt implicit - -# Brazillian user who prefers South American Spanish over European Portuguese as a fallback. -# The asymmetry between this case and above is because it's "pt-PT" that's missing between the -# matchers as "pt-BR" is a much more common language. - -pt-PT, pt-BR, es, es-419 ; pt, es-419, pt-PT ; pt-BR -pt-PT, pt-BR, es, es-419 ; pt-PT, es, pt ; pt-PT -pt-PT, pt, es, es-419 ; pt-PT, es, pt ; pt-PT -pt-PT, pt, es, es-419 ; pt, es-419, pt-PT ; pt - -pt-BR, es, es-419 ; pt, es-419, pt-PT ; pt-BR - -# Code that adds the user's country can get "pt-US" for a user's language. -# That should fall back to "pt-BR". - -pt-PT, pt-BR, es, es-419 ; pt-US, pt-PT ; pt-BR -pt-PT, pt, es, es-419 ; pt-US, pt-PT, pt ; pt # pt-BR implicit - -################################################## -# testVariantWithScriptMatch 1 and 2 - -fr, en, sv ; en-GB ; en -fr, en, sv ; en-GB ; en -en, sv ; en-GB, sv ; en - -################################################## -# testLongLists - -en, sv ; sv ; sv -af, am, ar, az, be, bg, bn, bs, ca, cs, cy, cy, da, de, el, en, en-GB, es, es-419, et, eu, fa, fi, fil, fr, ga, gl, gu, hi, hr, hu, hy, id, is, it, iw, ja, ka, kk, km, kn, ko, ky, lo, lt, lv, mk, ml, mn, mr, ms, my, ne, nl, no, pa, pl, pt, pt-PT, ro, ru, si, sk, sl, sq, sr, sr-Latn, sv, sw, ta, te, th, tr, uk, ur, uz, vi, zh-CN, zh-TW, zu ; sv ; sv -af, af-NA, af-ZA, agq, agq-CM, ak, ak-GH, am, am-ET, ar, ar-001, ar-AE, ar-BH, ar-DJ, ar-DZ, ar-EG, ar-EH, ar-ER, ar-IL, ar-IQ, ar-JO, ar-KM, ar-KW, ar-LB, ar-LY, ar-MA, ar-MR, ar-OM, ar-PS, ar-QA, ar-SA, ar-SD, ar-SO, ar-SS, ar-SY, ar-TD, ar-TN, ar-YE, as, as-IN, asa, asa-TZ, ast, ast-ES, az, az-Cyrl, az-Cyrl-AZ, az-Latn, az-Latn-AZ, bas, bas-CM, be, be-BY, bem, bem-ZM, bez, bez-TZ, bg, bg-BG, bm, bm-ML, bn, bn-BD, bn-IN, bo, bo-CN, bo-IN, br, br-FR, brx, brx-IN, bs, bs-Cyrl, bs-Cyrl-BA, bs-Latn, bs-Latn-BA, ca, ca-AD, ca-ES, ca-ES-VALENCIA, ca-FR, ca-IT, ce, ce-RU, cgg, cgg-UG, chr, chr-US, ckb, ckb-IQ, ckb-IR, cs, cs-CZ, cu, cu-RU, cy, cy-GB, da, da-DK, da-GL, dav, dav-KE, de, de-AT, de-BE, de-CH, de-DE, de-LI, de-LU, dje, dje-NE, dsb, dsb-DE, dua, dua-CM, dyo, dyo-SN, dz, dz-BT, ebu, ebu-KE, ee, ee-GH, ee-TG, el, el-CY, el-GR, en, en-001, en-150, en-AG, en-AI, en-AS, en-AT, en-AU, en-BB, en-BE, en-BI, en-BM, en-BS, en-BW, en-BZ, en-CA, en-CC, en-CH, en-CK, en-CM, en-CX, en-CY, en-DE, en-DG, en-DK, en-DM, en-ER, en-FI, en-FJ, en-FK, en-FM, en-GB, en-GD, en-GG, en-GH, en-GI, en-GM, en-GU, en-GY, en-HK, en-IE, en-IL, en-IM, en-IN, en-IO, en-JE, en-JM, en-KE, en-KI, en-KN, en-KY, en-LC, en-LR, en-LS, en-MG, en-MH, en-MO, en-MP, en-MS, en-MT, en-MU, en-MW, en-MY, en-NA, en-NF, en-NG, en-NL, en-NR, en-NU, en-NZ, en-PG, en-PH, en-PK, en-PN, en-PR, en-PW, en-RW, en-SB, en-SC, en-SD, en-SE, en-SG, en-SH, en-SI, en-SL, en-SS, en-SX, en-SZ, en-TC, en-TK, en-TO, en-TT, en-TV, en-TZ, en-UG, en-UM, en-US, en-US-POSIX, en-VC, en-VG, en-VI, en-VU, en-WS, en-ZA, en-ZM, en-ZW, eo, eo-001, es, es-419, es-AR, es-BO, es-CL, es-CO, es-CR, es-CU, es-DO, es-EA, es-EC, es-ES, es-GQ, es-GT, es-HN, es-IC, es-MX, es-NI, es-PA, es-PE, es-PH, es-PR, es-PY, es-SV, es-US, es-UY, es-VE, et, et-EE, eu, eu-ES, ewo, ewo-CM, fa, fa-AF, fa-IR, ff, ff-CM, ff-GN, ff-MR, ff-SN, fi, fi-FI, fil, fil-PH, fo, fo-DK, fo-FO, fr, fr-BE, fr-BF, fr-BI, fr-BJ, fr-BL, fr-CA, fr-CD, fr-CF, fr-CG, fr-CH, fr-CI, fr-CM, fr-DJ, fr-DZ, fr-FR, fr-GA, fr-GF, fr-GN, fr-GP, fr-GQ, fr-HT, fr-KM, fr-LU, fr-MA, fr-MC, fr-MF, fr-MG, fr-ML, fr-MQ, fr-MR, fr-MU, fr-NC, fr-NE, fr-PF, fr-PM, fr-RE, fr-RW, fr-SC, fr-SN, fr-SY, fr-TD, fr-TG, fr-TN, fr-VU, fr-WF, fr-YT, fur, fur-IT, fy, fy-NL, ga, ga-IE, gd, gd-GB, gl, gl-ES, gsw, gsw-CH, gsw-FR, gsw-LI, gu, gu-IN, guz, guz-KE, gv, gv-IM, ha, ha-GH, ha-NE, ha-NG, haw, haw-US, he, he-IL, hi, hi-IN, hr, hr-BA, hr-HR, hsb, hsb-DE, hu, hu-HU, hy, hy-AM, id, id-ID, ig, ig-NG, ii, ii-CN, is, is-IS, it, it-CH, it-IT, it-SM, ja, ja-JP, jgo, jgo-CM, jmc, jmc-TZ, ka, ka-GE, kab, kab-DZ, kam, kam-KE, kde, kde-TZ, kea, kea-CV, khq, khq-ML, ki, ki-KE, kk, kk-KZ, kkj, kkj-CM, kl, kl-GL, kln, kln-KE, km, km-KH, kn, kn-IN, ko, ko-KP, ko-KR, kok, kok-IN, ks, ks-IN, ksb, ksb-TZ, ksf, ksf-CM, ksh, ksh-DE, kw, kw-GB, ky, ky-KG, lag, lag-TZ, lb, lb-LU, lg, lg-UG, lkt, lkt-US, ln, ln-AO, ln-CD, ln-CF, ln-CG, lo, lo-LA, lrc, lrc-IQ, lrc-IR, lt, lt-LT, lu, lu-CD, luo, luo-KE, luy, luy-KE, lv, lv-LV, mas, mas-KE, mas-TZ, mer, mer-KE, mfe, mfe-MU, mg, mg-MG, mgh, mgh-MZ, mgo, mgo-CM, mk, mk-MK, ml, ml-IN, mn, mn-MN, mr, mr-IN, ms, ms-BN, ms-MY, ms-SG, mt, mt-MT, mua, mua-CM, my, my-MM, mzn, mzn-IR, naq, naq-NA, nb, nb-NO, nb-SJ, nd, nd-ZW, ne, ne-IN, ne-NP, nl, nl-AW, nl-BE, nl-BQ, nl-CW, nl-NL, nl-SR, nl-SX, nmg, nmg-CM, nn, nn-NO, nnh, nnh-CM, nus, nus-SS, nyn, nyn-UG, om, om-ET, om-KE, or, or-IN, os, os-GE, os-RU, pa, pa-Arab, pa-Arab-PK, pa-Guru, pa-Guru-IN, pl, pl-PL, prg, prg-001, ps, ps-AF, pt, pt-AO, pt-BR, pt-CV, pt-GW, pt-MO, pt-MZ, pt-PT, pt-ST, pt-TL, qu, qu-BO, qu-EC, qu-PE, rm, rm-CH, rn, rn-BI, ro, ro-MD, ro-RO, rof, rof-TZ, root, ru, ru-BY, ru-KG, ru-KZ, ru-MD, ru-RU, ru-UA, rw, rw-RW, rwk, rwk-TZ, sah, sah-RU, saq, saq-KE, sbp, sbp-TZ, se, se-FI, se-NO, se-SE, seh, seh-MZ, ses, ses-ML, sg, sg-CF, shi, shi-Latn, shi-Latn-MA, shi-Tfng, shi-Tfng-MA, si, si-LK, sk, sk-SK, sl, sl-SI, smn, smn-FI, sn, sn-ZW, so, so-DJ, so-ET, so-KE, so-SO, sq, sq-AL, sq-MK, sq-XK, sr, sr-Cyrl, sr-Cyrl-BA, sr-Cyrl-ME, sr-Cyrl-RS, sr-Cyrl-XK, sr-Latn, sr-Latn-BA, sr-Latn-ME, sr-Latn-RS, sr-Latn-XK, sv, sv-AX, sv-FI, sv-SE, sw, sw-CD, sw-KE, sw-TZ, sw-UG, ta, ta-IN, ta-LK, ta-MY, ta-SG, te, te-IN, teo, teo-KE, teo-UG, th, th-TH, ti, ti-ER, ti-ET, tk, tk-TM, to, to-TO, tr, tr-CY, tr-TR, twq, twq-NE, tzm, tzm-MA, ug, ug-CN, uk, uk-UA, ur, ur-IN, ur-PK, uz, uz-Arab, uz-Arab-AF, uz-Cyrl, uz-Cyrl-UZ, uz-Latn, uz-Latn-UZ, vai, vai-Latn, vai-Latn-LR, vai-Vaii, vai-Vaii-LR, vi, vi-VN, vo, vo-001, vun, vun-TZ, wae, wae-CH, xog, xog-UG, yav, yav-CM, yi, yi-001, yo, yo-BJ, yo-NG, zgh, zgh-MA, zh, zh-Hans, zh-Hans-CN, zh-Hans-HK, zh-Hans-MO, zh-Hans-SG, zh-Hant, zh-Hant-HK, zh-Hant-MO, zh-Hant-TW, zu, zu-ZA ; sv ; sv - -################################################## -# test8288 - -it, en ; und ; it -it, en ; und, en ; en - -# examples from -# http://unicode.org/repos/cldr/tags/latest/common/bcp47/ -# http://unicode.org/repos/cldr/tags/latest/common/validity/variant.xml - -################################################## -# testUnHack - -en-NZ, en-IT ; en-US ; en-NZ - -################################################## -# testEmptySupported => null - ; en ; null - -################################################## -# testVariantsAndExtensions -################################################## -# tests the .combine() method - -und, fr ; fr-BE-fonipa ; fr ; fr-BE-fonipa -und, fr-CA ; fr-BE-fonipa ; fr-CA ; fr-BE-fonipa -und, fr-fonupa ; fr-BE-fonipa ; fr-fonupa ; fr-BE-fonipa -und, no ; nn-BE-fonipa ; no ; no-BE-fonipa -und, en-GB-u-sd-gbsct ; en-fonipa-u-nu-Arab-ca-buddhist-t-m0-iso-i0-pinyin ; en-GB-u-sd-gbsct ; en-GB-fonipa-u-nu-Arab-ca-buddhist-t-m0-iso-i0-pinyin - -en-PSCRACK, de-PSCRACK, fr-PSCRACK, pt-PT-PSCRACK ; fr-PSCRACK ; fr-PSCRACK -en-PSCRACK, de-PSCRACK, fr-PSCRACK, pt-PT-PSCRACK ; fr ; fr-PSCRACK -en-PSCRACK, de-PSCRACK, fr-PSCRACK, pt-PT-PSCRACK ; de-CH ; de-PSCRACK - -################################################## -# testClusters -# we favor es-419 over others in cluster. Clusters: es- {ES, MA, EA} {419, AR, MX} - -und, es, es-MA, es-MX, es-419 ; es-AR ; es-419 -und, es-MA, es, es-419, es-MX ; es-AR ; es-419 -und, es, es-MA, es-MX, es-419 ; es-EA ; es -und, es-MA, es, es-419, es-MX ; es-EA ; es - -# of course, fall back to within cluster - -und, es, es-MA, es-MX ; es-AR ; es-MX -und, es-MA, es, es-MX ; es-AR ; es-MX -und, es-MA, es-MX, es-419 ; es-EA ; es-MA -und, es-MA, es-419, es-MX ; es-EA ; es-MA - -# we favor es-GB over others in cluster. Clusters: en- {US, GU, VI} {GB, IN, ZA} - -und, en, en-GU, en-IN, en-GB ; en-ZA ; en-GB -und, en-GU, en, en-GB, en-IN ; en-ZA ; en-GB -und, en, en-GU, en-IN, en-GB ; en-VI ; en -und, en-GU, en, en-GB, en-IN ; en-VI ; en - -# of course, fall back to within cluster - -und, en, en-GU, en-IN ; en-ZA ; en-IN -und, en-GU, en, en-IN ; en-ZA ; en-IN -und, en-GU, en-IN, en-GB ; en-VI ; en-GU -und, en-GU, en-GB, en-IN ; en-VI ; en-GU - -################################################## -# testThreshold -@Threshold=60 - -50, und, fr-CA-fonupa ; fr-BE-fonipa ; fr-CA-fonupa ; fr-BE-fonipa -50, und, fr-Cyrl-CA-fonupa ; fr-BE-fonipa ; fr-Cyrl-CA-fonupa ; fr-Cyrl-BE-fonipa - -@Threshold=-1 # restore - -################################################## -# testScriptFirst -@DistanceOption=SCRIPT_FIRST -@debug - -ru, fr ; zh, pl ; fr -ru, fr ; zh-Cyrl, pl ; ru -hr, en-Cyrl; sr ; en-Cyrl -da, ru, hr; sr ; ru \ No newline at end of file diff --git a/vendor/golang.org/x/text/language/testdata/GoLocaleMatcherTest.txt b/vendor/golang.org/x/text/language/testdata/GoLocaleMatcherTest.txt deleted file mode 100644 index 4f4c6093e..000000000 --- a/vendor/golang.org/x/text/language/testdata/GoLocaleMatcherTest.txt +++ /dev/null @@ -1,226 +0,0 @@ -# basics -fr, en-GB, en ; en-GB ; en-GB -fr, en-GB, en ; en-US ; en -fr, en-GB, en ; fr-FR ; fr -fr, en-GB, en ; ja-JP ; fr - -# script fallbacks -zh-CN, zh-TW, iw ; zh-Hant ; zh-TW -zh-CN, zh-TW, iw ; zh ; zh-CN -zh-CN, zh-TW, iw ; zh-Hans-CN ; zh-CN -zh-CN, zh-TW, iw ; zh-Hant-HK ; zh-TW -zh-CN, zh-TW, iw ; he-IT ; iw ; iw - -# language-specific script fallbacks 1 -en, sr, nl ; sr-Latn ; sr -en, sr, nl ; sh ; sr # different script, but seems okay and is as CLDR suggests -en, sr, nl ; hr ; en -en, sr, nl ; bs ; en -en, sr, nl ; nl-Cyrl ; sr - -# language-specific script fallbacks 2 -en, sh ; sr ; sh -en, sh ; sr-Cyrl ; sh -en, sh ; hr ; sh - -# don't match hr to sr-Latn -en, sr-Latn ; hr ; en - -# both deprecated and not -fil, tl, iw, he ; he-IT ; he -fil, tl, iw, he ; he ; he -fil, tl, iw, he ; iw ; iw -fil, tl, iw, he ; fil-IT ; fil -fil, tl, iw, he ; fil ; fil -fil, tl, iw, he ; tl ; tl - -# nearby languages -en, fil, ro, nn ; tl ; fil -en, fil, ro, nn ; mo ; ro -en, fil, ro, nn ; nb ; nn -en, fil, ro, nn ; ja ; en - -# nearby languages: Nynorsk to Bokmål -en, nb ; nn ; nb - -# nearby languages: Danish does not match nn -en, nn ; da ; en - -# nearby languages: Danish matches no -en, no ; da ; no - -# nearby languages: Danish matches nb -en, nb ; da ; nb - -# prefer matching languages over language variants. -nn, en-GB ; no, en-US ; en-GB -nn, en-GB ; nb, en-US ; en-GB - -# deprecated version is closer than same language with other differences -nl, he, en-GB ; iw, en-US ; he - -# macro equivalent is closer than same language with other differences -nl, zh, en-GB, no ; cmn, en-US ; zh -nl, zh, en-GB, no ; nb, en-US ; no - -# legacy equivalent is closer than same language with other differences -nl, fil, en-GB ; tl, en-US ; fil - -# distinguish near equivalents -en, ro, mo, ro-MD ; ro ; ro -en, ro, mo, ro-MD ; mo ; mo -en, ro, mo, ro-MD ; ro-MD ; ro-MD - -# maximization of legacy -sr-Cyrl, sr-Latn, ro, ro-MD ; sh ; sr-Latn -sr-Cyrl, sr-Latn, ro, ro-MD ; mo ; ro-MD - -# empty - ; fr ; und - ; en ; und - -# private use subtags -fr, en-GB, x-bork, es-ES, es-419 ; x-piglatin ; fr -fr, en-GB, x-bork, es-ES, es-419 ; x-bork ; x-bork - -# grandfathered codes -fr, i-klingon, en-Latn-US ; en-GB-oed ; en-Latn-US -fr, i-klingon, en-Latn-US ; i-klingon ; tlh - - -# simple variant match -fr, en-GB, ja, es-ES, es-MX ; de, en-US ; en-GB -fr, en-GB, ja, es-ES, es-MX ; de, zh ; fr - -# best match for traditional Chinese -fr, zh-Hans-CN, en-US ; zh-TW ; zh-Hans-CN -fr, zh-Hans-CN, en-US ; zh-Hant ; zh-Hans-CN -fr, zh-Hans-CN, en-US ; zh-TW, en ; en-US -fr, zh-Hans-CN, en-US ; zh-Hant-CN, en ; en-US -fr, zh-Hans-CN, en-US ; zh-Hans, en ; zh-Hans-CN - -# more specific script should win in case regions are identical -af, af-Latn, af-Arab ; af ; af -af, af-Latn, af-Arab ; af-ZA ; af -af, af-Latn, af-Arab ; af-Latn-ZA ; af-Latn -af, af-Latn, af-Arab ; af-Latn ; af-Latn - -# more specific region should win -nl, nl-NL, nl-BE ; nl ; nl -nl, nl-NL, nl-BE ; nl-Latn ; nl -nl, nl-NL, nl-BE ; nl-Latn-NL ; nl-NL -nl, nl-NL, nl-BE ; nl-NL ; nl-NL - -# region may replace matched if matched is enclosing -es-419,es ; es-MX ; es-419 ; es-MX -es-419,es ; es-SG ; es - -# more specific region wins over more specific script -nl, nl-Latn, nl-NL, nl-BE ; nl ; nl -nl, nl-Latn, nl-NL, nl-BE ; nl-Latn ; nl-Latn -nl, nl-Latn, nl-NL, nl-BE ; nl-NL ; nl-NL -nl, nl-Latn, nl-NL, nl-BE ; nl-Latn-NL ; nl-NL - -# region distance Portuguese -pt, pt-PT ; pt-ES ; pt-PT - -# if no preferred locale specified, pick top language, not regional -en, fr, fr-CA, fr-CH ; fr-US ; fr #TODO: ; fr-u-rg-US - -# region distance German -de-AT, de-DE, de-CH ; de ; de-DE - -# en-AU is closer to en-GB than to en (which is en-US) -en, en-GB, es-ES, es-419 ; en-AU ; en-GB -en, en-GB, es-ES, es-419 ; es-MX ; es-419 ; es-MX -en, en-GB, es-ES, es-419 ; es-PT ; es-ES - -# undefined -it, fr ; und ; it - -# und does not match en -it, en ; und ; it - -# undefined in priority list -it, und ; und ; und -it, und ; en ; it - -# undefined -it, fr, zh ; und-FR ; fr -it, fr, zh ; und-CN ; zh -it, fr, zh ; und-Hans ; zh -it, fr, zh ; und-Hant ; zh -it, fr, zh ; und-Latn ; it - -# match on maximized tag -fr, en-GB, ja, es-ES, es-MX ; ja-JP, en-GB ; ja -fr, en-GB, ja, es-ES, es-MX ; ja-Jpan-JP, en-GB ; ja - -# pick best maximized tag -ja, ja-Jpan-US, ja-JP, en, ru ; ja-Jpan, ru ; ja -ja, ja-Jpan-US, ja-JP, en, ru ; ja-JP, ru ; ja-JP -ja, ja-Jpan-US, ja-JP, en, ru ; ja-US, ru ; ja-Jpan-US - -# termination: pick best maximized match -ja, ja-Jpan, ja-JP, en, ru ; ja-Jpan-JP, ru ; ja-JP -ja, ja-Jpan, ja-JP, en, ru ; ja-Jpan, ru ; ja-Jpan - -# same language over exact, but distinguish when user is explicit -fr, en-GB, ja, es-ES, es-MX ; ja, de ; ja -en, de, fr, ja ; de-CH, fr ; de # TODO: ; de-u-rg-CH -en-GB, nl ; en, nl ; en-GB -en-GB, nl ; en, nl, en-GB ; nl - -# parent relation preserved -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-150 ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-AU ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-BE ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-GG ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-GI ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-HK ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-IE ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-IM ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-IN ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-JE ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-MT ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-NZ ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-PK ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-SG ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-DE ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; en-MT ; en-GB -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-AR ; es-419 ; es-AR -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-BO ; es-419 ; es-BO -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-CL ; es-419 ; es-CL -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-CO ; es-419 ; es-CO -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-CR ; es-419 ; es-CR -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-CU ; es-419 ; es-CU -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-DO ; es-419 ; es-DO -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-EC ; es-419 ; es-EC -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-GT ; es-419 ; es-GT -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-HN ; es-419 ; es-HN -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-MX ; es-419 ; es-MX -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-NI ; es-419 ; es-NI -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-PA ; es-419 ; es-PA -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-PE ; es-419 ; es-PE -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-PR ; es-419 ; es-PR -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-PT ; es -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-PY ; es-419 ; es-PY -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-SV ; es-419 ; es-SV -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-US ; es-419 -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-UY ; es-419 ; es-UY -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; es-VE ; es-419 ; es-VE -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; pt-AO ; pt-PT -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; pt-CV ; pt-PT -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; pt-GW ; pt-PT -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; pt-MO ; pt-PT -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; pt-MZ ; pt-PT -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; pt-ST ; pt-PT -en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK ; pt-TL ; pt-PT - -# preserve extensions -en, de, sl-nedis ; de-FR-u-co-phonebk ; de ; de-u-co-phonebk -en, de, sl-nedis ; sl-nedis-u-cu-eur ; sl-nedis ; sl-nedis-u-cu-eur -en, de, sl-nedis ; sl-u-cu-eur ; sl-nedis ; sl-nedis-u-cu-eur -en, de, sl-nedis ; sl-HR-nedis-u-cu-eur ; sl-nedis ; sl-nedis-u-cu-eur -en, de, sl-nedis ; de-t-m0-iso-i0-pinyin ; de ; de-t-m0-iso-i0-pinyin - diff --git a/vendor/golang.org/x/text/message/catalog.go b/vendor/golang.org/x/text/message/catalog.go deleted file mode 100644 index 2f65b4bbc..000000000 --- a/vendor/golang.org/x/text/message/catalog.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package message - -// TODO: some types in this file will need to be made public at some time. -// Documentation and method names will reflect this by using the exported name. - -import ( - "golang.org/x/text/language" - "golang.org/x/text/message/catalog" -) - -// DefaultCatalog is used by SetString. -var DefaultCatalog *catalog.Catalog = defaultCatalog - -var defaultCatalog = catalog.New() - -// SetString calls SetString on the initial default Catalog. -func SetString(tag language.Tag, key string, msg string) error { - return defaultCatalog.SetString(tag, key, msg) -} - -// Set calls Set on the initial default Catalog. -func Set(tag language.Tag, key string, msg ...catalog.Message) error { - return defaultCatalog.Set(tag, key, msg...) -} diff --git a/vendor/golang.org/x/text/message/catalog/catalog.go b/vendor/golang.org/x/text/message/catalog/catalog.go deleted file mode 100644 index 957444c10..000000000 --- a/vendor/golang.org/x/text/message/catalog/catalog.go +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package catalog defines collections of translated format strings. -// -// This package mostly defines types for populating catalogs with messages. The -// catmsg package contains further definitions for creating custom message and -// dictionary types as well as packages that use Catalogs. -// -// Package catalog defines various interfaces: Dictionary, Loader, and Message. -// A Dictionary maintains a set of translations of format strings for a single -// language. The Loader interface defines a source of dictionaries. A -// translation of a format string is represented by a Message. -// -// -// Catalogs -// -// A Catalog defines a programmatic interface for setting message translations. -// It maintains a set of per-language dictionaries with translations for a set -// of keys. For message translation to function properly, a translation should -// be defined for each key for each supported language. A dictionary may be -// underspecified, though, if there is a parent language that already defines -// the key. For example, a Dictionary for "en-GB" could leave out entries that -// are identical to those in a dictionary for "en". -// -// -// Messages -// -// A Message is a format string which varies on the value of substitution -// variables. For instance, to indicate the number of results one could want "no -// results" if there are none, "1 result" if there is 1, and "%d results" for -// any other number. Catalog is agnostic to the kind of format strings that are -// used: for instance, messages can follow either the printf-style substitution -// from package fmt or use templates. -// -// A Message does not substitute arguments in the format string. This job is -// reserved for packages that render strings, such as message, that use Catalogs -// to selected string. This separation of concerns allows Catalog to be used to -// store any kind of formatting strings. -// -// -// Selecting messages based on linguistic features of substitution arguments -// -// Messages may vary based on any linguistic features of the argument values. -// The most common one is plural form, but others exist. -// -// Selection messages are provided in packages that provide support for a -// specific linguistic feature. The following snippet uses plural.Select: -// -// catalog.Set(language.English, "You are %d minute(s) late.", -// plural.Select(1, -// "one", "You are 1 minute late.", -// "other", "You are %d minutes late.")) -// -// In this example, a message is stored in the Catalog where one of two messages -// is selected based on the first argument, a number. The first message is -// selected if the argument is singular (identified by the selector "one") and -// the second message is selected in all other cases. The selectors are defined -// by the plural rules defined in CLDR. The selector "other" is special and will -// always match. Each language always defines one of the linguistic categories -// to be "other." For English, singular is "one" and plural is "other". -// -// Selects can be nested. This allows selecting sentences based on features of -// multiple arguments or multiple linguistic properties of a single argument. -// -// -// String interpolation -// -// There is often a lot of commonality between the possible variants of a -// message. For instance, in the example above the word "minute" varies based on -// the plural catogory of the argument, but the rest of the sentence is -// identical. Using interpolation the above message can be rewritten as: -// -// catalog.Set(language.English, "You are %d minute(s) late.", -// catalog.Var("minutes", -// plural.Select(1, "one", "minute", "other", "minutes")), -// catalog.String("You are %[1]d ${minutes} late.")) -// -// Var is defined to return the variable name if the message does not yield a -// match. This allows us to further simplify this snippet to -// -// catalog.Set(language.English, "You are %d minute(s) late.", -// catalog.Var("minutes", plural.Select(1, "one", "minute")), -// catalog.String("You are %d ${minutes} late.")) -// -// Overall this is still only a minor improvement, but things can get a lot more -// unwieldy if more than one linguistic feature is used to determine a message -// variant. Consider the following example: -// -// // argument 1: list of hosts, argument 2: list of guests -// catalog.Set(language.English, "%[1]v invite(s) %[2]v to their party.", -// catalog.Var("their", -// plural.Select(1, -// "one", gender.Select(1, "female", "her", "other", "his"))), -// catalog.Var("invites", plural.Select(1, "one", "invite")) -// catalog.String("%[1]v ${invites} %[2]v to ${their} party.")), -// -// Without variable substitution, this would have to be written as -// -// // argument 1: list of hosts, argument 2: list of guests -// catalog.Set(language.English, "%[1]v invite(s) %[2]v to their party.", -// plural.Select(1, -// "one", gender.Select(1, -// "female", "%[1]v invites %[2]v to her party." -// "other", "%[1]v invites %[2]v to his party."), -// "other", "%[1]v invites %[2]v to their party.") -// -// Not necessarily shorter, but using variables there is less duplication and -// the messages are more maintenance friendly. Moreover, languages may have up -// to six plural forms. This makes the use of variables more welcome. -// -// Different messages using the same inflections can reuse variables by moving -// them to macros. Using macros we can rewrite the message as: -// -// // argument 1: list of hosts, argument 2: list of guests -// catalog.SetString(language.English, "%[1]v invite(s) %[2]v to their party.", -// "%[1]v ${invites(1)} %[2]v to ${their(1)} party.") -// -// Where the following macros were defined separately. -// -// catalog.SetMacro(language.English, "invites", plural.Select(1, "one", "invite")) -// catalog.SetMacro(language.English, "their", plural.Select(1, -// "one", gender.Select(1, "female", "her", "other", "his"))), -// -// Placeholders use parentheses and the arguments to invoke a macro. -// -// -// Looking up messages -// -// Message lookup using Catalogs is typically only done by specialized packages -// and is not something the user should be concerned with. For instance, to -// express the tardiness of a user using the related message we defined earlier, -// the user may use the package message like so: -// -// p := message.NewPrinter(language.English) -// p.Printf("You are %d minute(s) late.", 5) -// -// Which would print: -// You are 5 minutes late. -// -// -// This package is UNDER CONSTRUCTION and its API may change. -package catalog // import "golang.org/x/text/message/catalog" - -// TODO: -// Some way to freeze a catalog. -// - Locking on each lockup turns out to be about 50% of the total running time -// for some of the benchmarks in the message package. -// Consider these: -// - Sequence type to support sequences in user-defined messages. -// - Garbage collection: Remove dictionaries that can no longer be reached -// as other dictionaries have been added that cover all possible keys. - -import ( - "errors" - "fmt" - - "golang.org/x/text/internal/catmsg" - "golang.org/x/text/language" -) - -// A Catalog holds translations for messages for supported languages. -type Catalog struct { - options - - index store - macros store -} - -type options struct{} - -// An Option configures Catalog behavior. -type Option func(*options) - -// TODO: -// // Catalogs specifies one or more sources for a Catalog. -// // Lookups are in order. -// // This can be changed inserting a Catalog used for setting, which implements -// // Loader, used for setting in the chain. -// func Catalogs(d ...Loader) Option { -// return nil -// } -// -// func Delims(start, end string) Option {} -// -// func Dict(tag language.Tag, d ...Dictionary) Option - -// New returns a new Catalog. -func New(opts ...Option) *Catalog { - c := &Catalog{} - for _, o := range opts { - o(&c.options) - } - return c -} - -// Languages returns all languages for which the Catalog contains variants. -func (c *Catalog) Languages() []language.Tag { - return c.index.languages() -} - -// SetString is shorthand for Set(tag, key, String(msg)). -func (c *Catalog) SetString(tag language.Tag, key string, msg string) error { - return c.set(tag, key, &c.index, String(msg)) -} - -// Set sets the translation for the given language and key. -// -// When evaluation this message, the first Message in the sequence to msgs to -// evaluate to a string will be the message returned. -func (c *Catalog) Set(tag language.Tag, key string, msg ...Message) error { - return c.set(tag, key, &c.index, msg...) -} - -// SetMacro defines a Message that may be substituted in another message. -// The arguments to a macro Message are passed as arguments in the -// placeholder the form "${foo(arg1, arg2)}". -func (c *Catalog) SetMacro(tag language.Tag, name string, msg ...Message) error { - return c.set(tag, name, &c.macros, msg...) -} - -// ErrNotFound indicates there was no message for the given key. -var ErrNotFound = errors.New("catalog: message not found") - -// A Message holds a collection of translations for the same phrase that may -// vary based on the values of substitution arguments. -type Message interface { - catmsg.Message -} - -// String specifies a plain message string. It can be used as fallback if no -// other strings match or as a simple standalone message. -// -// It is an error to pass more than one String in a message sequence. -func String(name string) Message { - return catmsg.String(name) -} - -// Var sets a variable that may be substituted in formatting patterns using -// named substitution of the form "${name}". The name argument is used as a -// fallback if the statements do not produce a match. The statement sequence may -// not contain any Var calls. -// -// The name passed to a Var must be unique within message sequence. -func Var(name string, msg ...Message) Message { - return &catmsg.Var{Name: name, Message: firstInSequence(msg)} -} - -// firstInSequence is a message type that prints the first message in the -// sequence that resolves to a match for the given substitution arguments. -type firstInSequence []Message - -func (s firstInSequence) Compile(e *catmsg.Encoder) error { - e.EncodeMessageType(catmsg.First) - err := catmsg.ErrIncomplete - for i, m := range s { - if err == nil { - return fmt.Errorf("catalog: message argument %d is complete and blocks subsequent messages", i-1) - } - err = e.EncodeMessage(m) - } - return err -} - -// Context returns a Context for formatting messages. -// Only one Message may be formatted per context at any given time. -func (c *Catalog) Context(tag language.Tag, r catmsg.Renderer) *Context { - return &Context{ - cat: c, - tag: tag, - dec: catmsg.NewDecoder(tag, r, &dict{&c.macros, tag}), - } -} - -// A Context is used for evaluating Messages. -// Only one Message may be formatted per context at any given time. -type Context struct { - cat *Catalog - tag language.Tag - dec *catmsg.Decoder -} - -// Execute looks up and executes the message with the given key. -// It returns ErrNotFound if no message could be found in the index. -func (c *Context) Execute(key string) error { - data, ok := c.cat.index.lookup(c.tag, key) - if !ok { - return ErrNotFound - } - return c.dec.Execute(data) -} diff --git a/vendor/golang.org/x/text/message/catalog/catalog_test.go b/vendor/golang.org/x/text/message/catalog/catalog_test.go deleted file mode 100644 index 97ab4d88a..000000000 --- a/vendor/golang.org/x/text/message/catalog/catalog_test.go +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package catalog - -import ( - "bytes" - "fmt" - "reflect" - "testing" - - "golang.org/x/text/internal" - "golang.org/x/text/internal/catmsg" - "golang.org/x/text/language" -) - -type entry struct { - tag, key string - msg interface{} -} - -var testCases = []struct { - desc string - cat []entry - lookup []entry -}{{ - desc: "empty catalog", - lookup: []entry{ - {"en", "key", ""}, - {"en", "", ""}, - {"nl", "", ""}, - }, -}, { - desc: "one entry", - cat: []entry{ - {"en", "hello", "Hello!"}, - }, - lookup: []entry{ - {"und", "hello", ""}, - {"nl", "hello", ""}, - {"en", "hello", "Hello!"}, - {"en-US", "hello", "Hello!"}, - {"en-GB", "hello", "Hello!"}, - {"en-oxendict", "hello", "Hello!"}, - {"en-oxendict-u-ms-metric", "hello", "Hello!"}, - }, -}, { - desc: "hierarchical languages", - cat: []entry{ - {"en", "hello", "Hello!"}, - {"en-GB", "hello", "Hellø!"}, - {"en-US", "hello", "Howdy!"}, - {"en", "greetings", "Greetings!"}, - }, - lookup: []entry{ - {"und", "hello", ""}, - {"nl", "hello", ""}, - {"en", "hello", "Hello!"}, - {"en-US", "hello", "Howdy!"}, - {"en-GB", "hello", "Hellø!"}, - {"en-oxendict", "hello", "Hello!"}, - {"en-US-oxendict-u-ms-metric", "hello", "Howdy!"}, - - {"und", "greetings", ""}, - {"nl", "greetings", ""}, - {"en", "greetings", "Greetings!"}, - {"en-US", "greetings", "Greetings!"}, - {"en-GB", "greetings", "Greetings!"}, - {"en-oxendict", "greetings", "Greetings!"}, - {"en-US-oxendict-u-ms-metric", "greetings", "Greetings!"}, - }, -}, { - desc: "variables", - cat: []entry{ - {"en", "hello %s", []Message{ - Var("person", String("Jane")), - String("Hello ${person}!"), - }}, - {"en", "hello error", []Message{ - Var("person", String("Jane")), - noMatchMessage{}, // trigger sequence path. - String("Hello ${person."), - }}, - {"en", "fallback to var value", []Message{ - Var("you", noMatchMessage{}, noMatchMessage{}), - String("Hello ${you}."), - }}, - {"en", "scopes", []Message{ - Var("person1", String("Mark")), - Var("person2", String("Jane")), - Var("couple", - Var("person1", String("Joe")), - String("${person1} and ${person2}")), - String("Hello ${couple}."), - }}, - {"en", "missing var", String("Hello ${missing}.")}, - }, - lookup: []entry{ - {"en", "hello %s", "Hello Jane!"}, - {"en", "hello error", "Hello $!(MISSINGBRACE)"}, - {"en", "fallback to var value", "Hello you."}, - {"en", "scopes", "Hello Joe and Jane."}, - {"en", "missing var", "Hello missing."}, - }, -}, { - desc: "macros", - cat: []entry{ - {"en", "macro1", String("Hello ${macro1(1)}.")}, - {"en", "macro2", String("Hello ${ macro1(2) }!")}, - {"en", "macroWS", String("Hello ${ macro1( 2 ) }!")}, - {"en", "missing", String("Hello ${ missing(1 }.")}, - {"en", "badnum", String("Hello ${ badnum(1b) }.")}, - {"en", "undefined", String("Hello ${ undefined(1) }.")}, - {"en", "macroU", String("Hello ${ macroU(2) }!")}, - }, - lookup: []entry{ - {"en", "macro1", "Hello Joe."}, - {"en", "macro2", "Hello Joe!"}, - {"en-US", "macroWS", "Hello Joe!"}, - {"en-NL", "missing", "Hello $!(MISSINGPAREN)."}, - {"en", "badnum", "Hello $!(BADNUM)."}, - {"en", "undefined", "Hello undefined."}, - {"en", "macroU", "Hello macroU!"}, - }}} - -func initCat(entries []entry) (*Catalog, []language.Tag) { - tags := []language.Tag{} - cat := New() - for _, e := range entries { - tag := language.MustParse(e.tag) - tags = append(tags, tag) - switch msg := e.msg.(type) { - case string: - cat.SetString(tag, e.key, msg) - case Message: - cat.Set(tag, e.key, msg) - case []Message: - cat.Set(tag, e.key, msg...) - } - } - return cat, internal.UniqueTags(tags) -} - -func TestCatalog(t *testing.T) { - for _, tc := range testCases { - t.Run(fmt.Sprintf("%s", tc.desc), func(t *testing.T) { - cat, wantTags := initCat(tc.cat) - cat.SetMacro(language.English, "macro1", String("Joe")) - cat.SetMacro(language.Und, "macro2", String("${macro1(1)}")) - cat.SetMacro(language.English, "macroU", noMatchMessage{}) - - if got := cat.Languages(); !reflect.DeepEqual(got, wantTags) { - t.Errorf("%s:Languages: got %v; want %v", tc.desc, got, wantTags) - } - - for _, e := range tc.lookup { - t.Run(fmt.Sprintf("%s/%s", e.tag, e.key), func(t *testing.T) { - tag := language.MustParse(e.tag) - buf := testRenderer{} - ctx := cat.Context(tag, &buf) - want := e.msg.(string) - err := ctx.Execute(e.key) - gotFound := err != ErrNotFound - wantFound := want != "" - if gotFound != wantFound { - t.Fatalf("err: got %v (%v); want %v", gotFound, err, wantFound) - } - if got := buf.buf.String(); got != want { - t.Errorf("Lookup:\ngot %q\nwant %q", got, want) - } - }) - } - }) - } -} - -type testRenderer struct { - buf bytes.Buffer -} - -func (f *testRenderer) Arg(i int) interface{} { return nil } -func (f *testRenderer) Render(s string) { f.buf.WriteString(s) } - -var msgNoMatch = catmsg.Register("no match", func(d *catmsg.Decoder) bool { - return false // no match -}) - -type noMatchMessage struct{} - -func (noMatchMessage) Compile(e *catmsg.Encoder) error { - e.EncodeMessageType(msgNoMatch) - return catmsg.ErrIncomplete -} diff --git a/vendor/golang.org/x/text/message/catalog/dict.go b/vendor/golang.org/x/text/message/catalog/dict.go deleted file mode 100644 index 1810fabc6..000000000 --- a/vendor/golang.org/x/text/message/catalog/dict.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package catalog - -import ( - "sync" - - "golang.org/x/text/internal" - "golang.org/x/text/internal/catmsg" - "golang.org/x/text/language" -) - -// TODO: -// Dictionary returns a Dictionary that returns the first Message, using the -// given language tag, that matches: -// 1. the last one registered by one of the Set methods -// 2. returned by one of the Loaders -// 3. repeat from 1. using the parent language -// This approach allows messages to be underspecified. -// func (c *Catalog) Dictionary(tag language.Tag) (Dictionary, error) { -// // TODO: verify dictionary exists. -// return &dict{&c.index, tag}, nil -// } - -type dict struct { - s *store - tag language.Tag // TODO: make compact tag. -} - -func (d *dict) Lookup(key string) (data string, ok bool) { - return d.s.lookup(d.tag, key) -} - -func (c *Catalog) set(tag language.Tag, key string, s *store, msg ...Message) error { - data, err := catmsg.Compile(tag, &dict{&c.macros, tag}, firstInSequence(msg)) - - s.mutex.Lock() - defer s.mutex.Unlock() - - m := s.index[tag] - if m == nil { - m = msgMap{} - if s.index == nil { - s.index = map[language.Tag]msgMap{} - } - s.index[tag] = m - } - - m[key] = data - return err -} - -type store struct { - mutex sync.RWMutex - index map[language.Tag]msgMap -} - -type msgMap map[string]string - -func (s *store) lookup(tag language.Tag, key string) (data string, ok bool) { - s.mutex.RLock() - defer s.mutex.RUnlock() - - for ; ; tag = tag.Parent() { - if msgs, ok := s.index[tag]; ok { - if msg, ok := msgs[key]; ok { - return msg, true - } - } - if tag == language.Und { - break - } - } - return "", false -} - -// Languages returns all languages for which the store contains variants. -func (s *store) languages() []language.Tag { - s.mutex.RLock() - defer s.mutex.RUnlock() - - tags := make([]language.Tag, 0, len(s.index)) - for t := range s.index { - tags = append(tags, t) - } - internal.SortTags(tags) - return tags -} diff --git a/vendor/golang.org/x/text/message/doc.go b/vendor/golang.org/x/text/message/doc.go deleted file mode 100644 index 60424a681..000000000 --- a/vendor/golang.org/x/text/message/doc.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package message implements formatted I/O for localized strings with functions -// analogous to the fmt's print functions. It is a drop-in replacement for fmt. -// -// -// Localized Formatting -// -// A format string can be localized by replacing any of the print functions of -// fmt with an equivalent call to a Printer. -// -// p := message.NewPrinter(language.English) -// p.Println(123456.78) // Prints 123,456.78 -// -// p := message.NewPrinter(language.Bengali) -// p.Println(123456.78) // Prints ১,২৩,৪৫৬.৭৮ -// -// Printer currently supports numbers and specialized types for which packages -// exist in x/text. Other builtin types such as time.Time and slices are -// planned. -// -// Format strings largely have the same meaning as with fmt with the following -// notable exceptions: -// - flag # always resorts to fmt for printing -// - verb 'f', 'e', 'g', 'd' use localized formatting unless the '#' flag is -// specified. -// -// See package fmt for more options. -// -// -// Translation -// -// The format strings that are passed to Printf, Sprintf, Fprintf, or Errorf -// are used as keys to look up translations for the specified languages. -// More on how these need to be specified below. -// -// One can use arbitrary keys to distinguish between otherwise ambiguous -// strings: -// p := message.NewPrinter(language.English) -// p.Printf("archive(noun)") // Prints "archive" -// p.Printf("archive(verb)") // Prints "archive" -// -// p := message.NewPrinter(language.German) -// p.Printf("archive(noun)") // Prints "Archiv" -// p.Printf("archive(verb)") // Prints "archivieren" -// -// To retain the fallback functionality, use Key: -// p.Printf(message.Key("archive(noun)", "archive")) -// p.Printf(message.Key("archive(verb)", "archive")) -// -// -// Translation Pipeline -// -// Format strings that contain text need to be translated to support different -// locales. The first step is to extract strings that need to be translated. -// -// 1. Install gotext -// go get -u golang.org/x/text/cmd/gotext -// gotext -help -// -// 2. Mark strings in your source to be translated by using message.Printer, -// instead of the functions of the fmt package. -// -// 3. Extract the strings from your source -// -// gotext extract -// -// The output will be written to the textdata directory. -// -// 4. Send the files for translation -// -// It is planned to support multiple formats, but for now one will have to -// rewrite the JSON output to the desired format. -// -// 5. Inject translations into program -// -// 6. Repeat from 2 -// -// Right now this has to be done programmatically with calls to Set or -// SetString. These functions as well as the methods defined in -// see also package golang.org/x/text/message/catalog can be used to implement -// either dynamic or static loading of messages. -// -// -// Plural and Gender Forms -// -// Translated messages can vary based on the plural and gender forms of -// substitution values. In general, it is up to the translators to provide -// alternative translations for such forms. See the packages in -// golang.org/x/text/feature and golang.org/x/text/message/catalog for more -// information. -// -package message diff --git a/vendor/golang.org/x/text/message/examples_test.go b/vendor/golang.org/x/text/message/examples_test.go deleted file mode 100644 index c73eaf90b..000000000 --- a/vendor/golang.org/x/text/message/examples_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package message_test - -import ( - "net/http" - - "golang.org/x/text/language" - "golang.org/x/text/message" -) - -func Example_http() { - // languages supported by this service: - matcher := language.NewMatcher(message.DefaultCatalog.Languages()) - - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - lang, _ := r.Cookie("lang") - accept := r.Header.Get("Accept-Language") - fallback := "en" - tag, _ := language.MatchStrings(matcher, lang.String(), accept, fallback) - - p := message.NewPrinter(tag) - - p.Fprintln(w, "User language is", tag) - }) -} - -func ExamplePrinter_numbers() { - for _, lang := range []string{"en", "de", "de-CH", "fr", "bn"} { - p := message.NewPrinter(language.Make(lang)) - p.Printf("%-6s %g\n", lang, 123456.78) - } - - // Output: - // en 123,456.78 - // de 123.456,78 - // de-CH 123’456.78 - // fr 123 456,78 - // bn ১,২৩,৪৫৬.৭৮ -} diff --git a/vendor/golang.org/x/text/message/fmt_test.go b/vendor/golang.org/x/text/message/fmt_test.go deleted file mode 100755 index 2110bb532..000000000 --- a/vendor/golang.org/x/text/message/fmt_test.go +++ /dev/null @@ -1,1889 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package message - -import ( - "bytes" - "fmt" - "io" - "math" - "reflect" - "runtime" - "strings" - "testing" - "time" - - "golang.org/x/text/language" -) - -type ( - renamedBool bool - renamedInt int - renamedInt8 int8 - renamedInt16 int16 - renamedInt32 int32 - renamedInt64 int64 - renamedUint uint - renamedUint8 uint8 - renamedUint16 uint16 - renamedUint32 uint32 - renamedUint64 uint64 - renamedUintptr uintptr - renamedString string - renamedBytes []byte - renamedFloat32 float32 - renamedFloat64 float64 - renamedComplex64 complex64 - renamedComplex128 complex128 -) - -func TestFmtInterface(t *testing.T) { - p := NewPrinter(language.Und) - var i1 interface{} - i1 = "abc" - s := p.Sprintf("%s", i1) - if s != "abc" { - t.Errorf(`Sprintf("%%s", empty("abc")) = %q want %q`, s, "abc") - } -} - -var ( - NaN = math.NaN() - posInf = math.Inf(1) - negInf = math.Inf(-1) - - intVar = 0 - - array = [5]int{1, 2, 3, 4, 5} - iarray = [4]interface{}{1, "hello", 2.5, nil} - slice = array[:] - islice = iarray[:] -) - -type A struct { - i int - j uint - s string - x []int -} - -type I int - -func (i I) String() string { - p := NewPrinter(language.Und) - return p.Sprintf("<%d>", int(i)) -} - -type B struct { - I I - j int -} - -type C struct { - i int - B -} - -type F int - -func (f F) Format(s fmt.State, c rune) { - p := NewPrinter(language.Und) - p.Fprintf(s, "<%c=F(%d)>", c, int(f)) -} - -type G int - -func (g G) GoString() string { - p := NewPrinter(language.Und) - return p.Sprintf("GoString(%d)", int(g)) -} - -type S struct { - F F // a struct field that Formats - G G // a struct field that GoStrings -} - -type SI struct { - I interface{} -} - -// P is a type with a String method with pointer receiver for testing %p. -type P int - -var pValue P - -func (p *P) String() string { - return "String(p)" -} - -var barray = [5]renamedUint8{1, 2, 3, 4, 5} -var bslice = barray[:] - -type byteStringer byte - -func (byteStringer) String() string { - return "X" -} - -var byteStringerSlice = []byteStringer{'h', 'e', 'l', 'l', 'o'} - -type byteFormatter byte - -func (byteFormatter) Format(f fmt.State, _ rune) { - p := NewPrinter(language.Und) - p.Fprint(f, "X") -} - -var byteFormatterSlice = []byteFormatter{'h', 'e', 'l', 'l', 'o'} - -var fmtTests = []struct { - fmt string - val interface{} - out string -}{ - // The behavior of the following tests differs from that of the fmt package. - - // Unlike with the fmt package, it is okay to have extra arguments for - // strings without format parameters. This is because it is impossible to - // distinguish between reordered or ordered format strings in this case. - // (For reordered format strings it is okay to not use arguments.) - {"", nil, ""}, - {"", 2, ""}, - {"no args", "hello", "no args"}, - - {"%017091901790959340919092959340919017929593813360", 0, "%!(NOVERB)"}, - {"%184467440737095516170v", 0, "%!(NOVERB)"}, - // Extra argument errors should format without flags set. - {"%010.2", "12345", "%!(NOVERB)"}, - - // Some key other differences, asides from localized values: - // - NaN values should not use affixes; so no signs (CLDR requirement) - // - Infinity uses patterns, so signs may be different (CLDR requirement) - // - The # flag is used to disable localization. - - // All following tests are analogous to those of the fmt package, but with - // localized numbers when appropriate. - {"%d", 12345, "12,345"}, - {"%v", 12345, "12,345"}, - {"%t", true, "true"}, - - // basic string - {"%s", "abc", "abc"}, - {"%q", "abc", `"abc"`}, - {"%x", "abc", "616263"}, - {"%x", "\xff\xf0\x0f\xff", "fff00fff"}, - {"%X", "\xff\xf0\x0f\xff", "FFF00FFF"}, - {"%x", "", ""}, - {"% x", "", ""}, - {"%#x", "", ""}, - {"%# x", "", ""}, - {"%x", "xyz", "78797a"}, - {"%X", "xyz", "78797A"}, - {"% x", "xyz", "78 79 7a"}, - {"% X", "xyz", "78 79 7A"}, - {"%#x", "xyz", "0x78797a"}, - {"%#X", "xyz", "0X78797A"}, - {"%# x", "xyz", "0x78 0x79 0x7a"}, - {"%# X", "xyz", "0X78 0X79 0X7A"}, - - // basic bytes - {"%s", []byte("abc"), "abc"}, - {"%s", [3]byte{'a', 'b', 'c'}, "abc"}, - {"%s", &[3]byte{'a', 'b', 'c'}, "&abc"}, - {"%q", []byte("abc"), `"abc"`}, - {"%x", []byte("abc"), "616263"}, - {"%x", []byte("\xff\xf0\x0f\xff"), "fff00fff"}, - {"%X", []byte("\xff\xf0\x0f\xff"), "FFF00FFF"}, - {"%x", []byte(""), ""}, - {"% x", []byte(""), ""}, - {"%#x", []byte(""), ""}, - {"%# x", []byte(""), ""}, - {"%x", []byte("xyz"), "78797a"}, - {"%X", []byte("xyz"), "78797A"}, - {"% x", []byte("xyz"), "78 79 7a"}, - {"% X", []byte("xyz"), "78 79 7A"}, - {"%#x", []byte("xyz"), "0x78797a"}, - {"%#X", []byte("xyz"), "0X78797A"}, - {"%# x", []byte("xyz"), "0x78 0x79 0x7a"}, - {"%# X", []byte("xyz"), "0X78 0X79 0X7A"}, - - // escaped strings - {"%q", "", `""`}, - {"%#q", "", "``"}, - {"%q", "\"", `"\""`}, - {"%#q", "\"", "`\"`"}, - {"%q", "`", `"` + "`" + `"`}, - {"%#q", "`", `"` + "`" + `"`}, - {"%q", "\n", `"\n"`}, - {"%#q", "\n", `"\n"`}, - {"%q", `\n`, `"\\n"`}, - {"%#q", `\n`, "`\\n`"}, - {"%q", "abc", `"abc"`}, - {"%#q", "abc", "`abc`"}, - {"%q", "日本語", `"日本語"`}, - {"%+q", "日本語", `"\u65e5\u672c\u8a9e"`}, - {"%#q", "日本語", "`日本語`"}, - {"%#+q", "日本語", "`日本語`"}, - {"%q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`}, - {"%+q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`}, - {"%#q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`}, - {"%#+q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`}, - {"%q", "☺", `"☺"`}, - {"% q", "☺", `"☺"`}, // The space modifier should have no effect. - {"%+q", "☺", `"\u263a"`}, - {"%#q", "☺", "`☺`"}, - {"%#+q", "☺", "`☺`"}, - {"%10q", "⌘", ` "⌘"`}, - {"%+10q", "⌘", ` "\u2318"`}, - {"%-10q", "⌘", `"⌘" `}, - {"%+-10q", "⌘", `"\u2318" `}, - {"%010q", "⌘", `0000000"⌘"`}, - {"%+010q", "⌘", `00"\u2318"`}, - {"%-010q", "⌘", `"⌘" `}, // 0 has no effect when - is present. - {"%+-010q", "⌘", `"\u2318" `}, - {"%#8q", "\n", ` "\n"`}, - {"%#+8q", "\r", ` "\r"`}, - {"%#-8q", "\t", "` ` "}, - {"%#+-8q", "\b", `"\b" `}, - {"%q", "abc\xffdef", `"abc\xffdef"`}, - {"%+q", "abc\xffdef", `"abc\xffdef"`}, - {"%#q", "abc\xffdef", `"abc\xffdef"`}, - {"%#+q", "abc\xffdef", `"abc\xffdef"`}, - // Runes that are not printable. - {"%q", "\U0010ffff", `"\U0010ffff"`}, - {"%+q", "\U0010ffff", `"\U0010ffff"`}, - {"%#q", "\U0010ffff", "`􏿿`"}, - {"%#+q", "\U0010ffff", "`􏿿`"}, - // Runes that are not valid. - {"%q", string(0x110000), `"�"`}, - {"%+q", string(0x110000), `"\ufffd"`}, - {"%#q", string(0x110000), "`�`"}, - {"%#+q", string(0x110000), "`�`"}, - - // characters - {"%c", uint('x'), "x"}, - {"%c", 0xe4, "ä"}, - {"%c", 0x672c, "本"}, - {"%c", '日', "日"}, - {"%.0c", '⌘', "⌘"}, // Specifying precision should have no effect. - {"%3c", '⌘', " ⌘"}, - {"%-3c", '⌘', "⌘ "}, - // Runes that are not printable. - {"%c", '\U00000e00', "\u0e00"}, - {"%c", '\U0010ffff', "\U0010ffff"}, - // Runes that are not valid. - {"%c", -1, "�"}, - {"%c", 0xDC80, "�"}, - {"%c", rune(0x110000), "�"}, - {"%c", int64(0xFFFFFFFFF), "�"}, - {"%c", uint64(0xFFFFFFFFF), "�"}, - - // escaped characters - {"%q", uint(0), `'\x00'`}, - {"%+q", uint(0), `'\x00'`}, - {"%q", '"', `'"'`}, - {"%+q", '"', `'"'`}, - {"%q", '\'', `'\''`}, - {"%+q", '\'', `'\''`}, - {"%q", '`', "'`'"}, - {"%+q", '`', "'`'"}, - {"%q", 'x', `'x'`}, - {"%+q", 'x', `'x'`}, - {"%q", 'ÿ', `'ÿ'`}, - {"%+q", 'ÿ', `'\u00ff'`}, - {"%q", '\n', `'\n'`}, - {"%+q", '\n', `'\n'`}, - {"%q", '☺', `'☺'`}, - {"%+q", '☺', `'\u263a'`}, - {"% q", '☺', `'☺'`}, // The space modifier should have no effect. - {"%.0q", '☺', `'☺'`}, // Specifying precision should have no effect. - {"%10q", '⌘', ` '⌘'`}, - {"%+10q", '⌘', ` '\u2318'`}, - {"%-10q", '⌘', `'⌘' `}, - {"%+-10q", '⌘', `'\u2318' `}, - {"%010q", '⌘', `0000000'⌘'`}, - {"%+010q", '⌘', `00'\u2318'`}, - {"%-010q", '⌘', `'⌘' `}, // 0 has no effect when - is present. - {"%+-010q", '⌘', `'\u2318' `}, - // Runes that are not printable. - {"%q", '\U00000e00', `'\u0e00'`}, - {"%q", '\U0010ffff', `'\U0010ffff'`}, - // Runes that are not valid. - {"%q", int32(-1), "%!q(int32=-1)"}, - {"%q", 0xDC80, `'�'`}, - {"%q", rune(0x110000), "%!q(int32=1,114,112)"}, - {"%q", int64(0xFFFFFFFFF), "%!q(int64=68,719,476,735)"}, - {"%q", uint64(0xFFFFFFFFF), "%!q(uint64=68,719,476,735)"}, - - // width - {"%5s", "abc", " abc"}, - {"%2s", "\u263a", " ☺"}, - {"%-5s", "abc", "abc "}, - {"%-8q", "abc", `"abc" `}, - {"%05s", "abc", "00abc"}, - {"%08q", "abc", `000"abc"`}, - {"%5s", "abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz"}, - {"%.5s", "abcdefghijklmnopqrstuvwxyz", "abcde"}, - {"%.0s", "日本語日本語", ""}, - {"%.5s", "日本語日本語", "日本語日本"}, - {"%.10s", "日本語日本語", "日本語日本語"}, - {"%.5s", []byte("日本語日本語"), "日本語日本"}, - {"%.5q", "abcdefghijklmnopqrstuvwxyz", `"abcde"`}, - {"%.5x", "abcdefghijklmnopqrstuvwxyz", "6162636465"}, - {"%.5q", []byte("abcdefghijklmnopqrstuvwxyz"), `"abcde"`}, - {"%.5x", []byte("abcdefghijklmnopqrstuvwxyz"), "6162636465"}, - {"%.3q", "日本語日本語", `"日本語"`}, - {"%.3q", []byte("日本語日本語"), `"日本語"`}, - {"%.1q", "日本語", `"日"`}, - {"%.1q", []byte("日本語"), `"日"`}, - {"%.1x", "日本語", "e6"}, - {"%.1X", []byte("日本語"), "E6"}, - {"%10.1q", "日本語日本語", ` "日"`}, - {"%10v", nil, " <nil>"}, - {"%-10v", nil, "<nil> "}, - - // integers - {"%d", uint(12345), "12,345"}, - {"%d", int(-12345), "-12,345"}, - {"%d", ^uint8(0), "255"}, - {"%d", ^uint16(0), "65,535"}, - {"%d", ^uint32(0), "4,294,967,295"}, - {"%d", ^uint64(0), "18,446,744,073,709,551,615"}, - {"%d", int8(-1 << 7), "-128"}, - {"%d", int16(-1 << 15), "-32,768"}, - {"%d", int32(-1 << 31), "-2,147,483,648"}, - {"%d", int64(-1 << 63), "-9,223,372,036,854,775,808"}, - {"%.d", 0, ""}, - {"%.0d", 0, ""}, - {"%6.0d", 0, " "}, - {"%06.0d", 0, " "}, - {"% d", 12345, " 12,345"}, - {"%+d", 12345, "+12,345"}, - {"%+d", -12345, "-12,345"}, - {"%b", 7, "111"}, - {"%b", -6, "-110"}, - {"%b", ^uint32(0), "11111111111111111111111111111111"}, - {"%b", ^uint64(0), "1111111111111111111111111111111111111111111111111111111111111111"}, - {"%b", int64(-1 << 63), zeroFill("-1", 63, "")}, - {"%o", 01234, "1234"}, - {"%#o", 01234, "01234"}, - {"%o", ^uint32(0), "37777777777"}, - {"%o", ^uint64(0), "1777777777777777777777"}, - {"%#X", 0, "0X0"}, - {"%x", 0x12abcdef, "12abcdef"}, - {"%X", 0x12abcdef, "12ABCDEF"}, - {"%x", ^uint32(0), "ffffffff"}, - {"%X", ^uint64(0), "FFFFFFFFFFFFFFFF"}, - {"%.20b", 7, "00000000000000000111"}, - {"%10d", 12345, " 12,345"}, - {"%10d", -12345, " -12,345"}, - {"%+10d", 12345, " +12,345"}, - {"%010d", 12345, "0,000,012,345"}, - {"%010d", -12345, "-0,000,012,345"}, - {"%20.8d", 1234, " 00,001,234"}, - {"%20.8d", -1234, " -00,001,234"}, - {"%020.8d", 1234, " 00,001,234"}, - {"%020.8d", -1234, " -00,001,234"}, - {"%-20.8d", 1234, "00,001,234 "}, - {"%-20.8d", -1234, "-00,001,234 "}, - {"%-#20.8x", 0x1234abc, "0x01234abc "}, - {"%-#20.8X", 0x1234abc, "0X01234ABC "}, - {"%-#20.8o", 01234, "00001234 "}, - - // Test correct f.intbuf overflow checks. - {"%068d", 1, "00," + strings.Repeat("000,", 21) + "001"}, - {"%068d", -1, "-00," + strings.Repeat("000,", 21) + "001"}, - {"%#.68x", 42, zeroFill("0x", 68, "2a")}, - {"%.68d", -42, "-00," + strings.Repeat("000,", 21) + "042"}, - {"%+.68d", 42, "+00," + strings.Repeat("000,", 21) + "042"}, - {"% .68d", 42, " 00," + strings.Repeat("000,", 21) + "042"}, - {"% +.68d", 42, "+00," + strings.Repeat("000,", 21) + "042"}, - - // unicode format - {"%U", 0, "U+0000"}, - {"%U", -1, "U+FFFFFFFFFFFFFFFF"}, - {"%U", '\n', `U+000A`}, - {"%#U", '\n', `U+000A`}, - {"%+U", 'x', `U+0078`}, // Plus flag should have no effect. - {"%# U", 'x', `U+0078 'x'`}, // Space flag should have no effect. - {"%#.2U", 'x', `U+0078 'x'`}, // Precisions below 4 should print 4 digits. - {"%U", '\u263a', `U+263A`}, - {"%#U", '\u263a', `U+263A '☺'`}, - {"%U", '\U0001D6C2', `U+1D6C2`}, - {"%#U", '\U0001D6C2', `U+1D6C2 '𝛂'`}, - {"%#14.6U", '⌘', " U+002318 '⌘'"}, - {"%#-14.6U", '⌘', "U+002318 '⌘' "}, - {"%#014.6U", '⌘', " U+002318 '⌘'"}, - {"%#-014.6U", '⌘', "U+002318 '⌘' "}, - {"%.68U", uint(42), zeroFill("U+", 68, "2A")}, - {"%#.68U", '日', zeroFill("U+", 68, "65E5") + " '日'"}, - - // floats - {"%+.3e", 0.0, "+0.000\u202f×\u202f10⁰⁰"}, - {"%+.3e", 1.0, "+1.000\u202f×\u202f10⁰⁰"}, - {"%+.3f", -1.0, "-1.000"}, - {"%+.3F", -1.0, "-1.000"}, - {"%+.3F", float32(-1.0), "-1.000"}, - {"%+07.2f", 1.0, "+001.00"}, - {"%+07.2f", -1.0, "-001.00"}, - {"%-07.2f", 1.0, "1.00 "}, - {"%-07.2f", -1.0, "-1.00 "}, - {"%+-07.2f", 1.0, "+1.00 "}, - {"%+-07.2f", -1.0, "-1.00 "}, - {"%-+07.2f", 1.0, "+1.00 "}, - {"%-+07.2f", -1.0, "-1.00 "}, - {"%+10.2f", +1.0, " +1.00"}, - {"%+10.2f", -1.0, " -1.00"}, - {"% .3E", -1.0, "-1.000\u202f×\u202f10⁰⁰"}, - {"% .3e", 1.0, " 1.000\u202f×\u202f10⁰⁰"}, - {"%+.3g", 0.0, "+0"}, - {"%+.3g", 1.0, "+1"}, - {"%+.3g", -1.0, "-1"}, - {"% .3g", -1.0, "-1"}, - {"% .3g", 1.0, " 1"}, - {"%b", float32(1.0), "8388608p-23"}, - {"%b", 1.0, "4503599627370496p-52"}, - // Test sharp flag used with floats. - {"%#g", 1e-323, "1.00000e-323"}, - {"%#g", -1.0, "-1.00000"}, - {"%#g", 1.1, "1.10000"}, - {"%#g", 123456.0, "123456."}, - {"%#g", 1234567.0, "1.234567e+06"}, - {"%#g", 1230000.0, "1.23000e+06"}, - {"%#g", 1000000.0, "1.00000e+06"}, - {"%#.0f", 1.0, "1."}, - {"%#.0e", 1.0, "1.e+00"}, - {"%#.0g", 1.0, "1."}, - {"%#.0g", 1100000.0, "1.e+06"}, - {"%#.4f", 1.0, "1.0000"}, - {"%#.4e", 1.0, "1.0000e+00"}, - {"%#.4g", 1.0, "1.000"}, - {"%#.4g", 100000.0, "1.000e+05"}, - {"%#.0f", 123.0, "123."}, - {"%#.0e", 123.0, "1.e+02"}, - {"%#.0g", 123.0, "1.e+02"}, - {"%#.4f", 123.0, "123.0000"}, - {"%#.4e", 123.0, "1.2300e+02"}, - {"%#.4g", 123.0, "123.0"}, - {"%#.4g", 123000.0, "1.230e+05"}, - {"%#9.4g", 1.0, " 1.000"}, - // The sharp flag has no effect for binary float format. - {"%#b", 1.0, "4503599627370496p-52"}, - // Precision has no effect for binary float format. - {"%.4b", float32(1.0), "8388608p-23"}, - {"%.4b", -1.0, "-4503599627370496p-52"}, - // Test correct f.intbuf boundary checks. - {"%.68f", 1.0, zeroFill("1.", 68, "")}, - {"%.68f", -1.0, zeroFill("-1.", 68, "")}, - // float infinites and NaNs - {"%f", posInf, "∞"}, - {"%.1f", negInf, "-∞"}, - {"% f", NaN, "NaN"}, - {"%20f", posInf, " ∞"}, - {"% 20F", posInf, " ∞"}, - {"% 20e", negInf, " -∞"}, - {"%+20E", negInf, " -∞"}, - {"% +20g", negInf, " -∞"}, - {"%+-20G", posInf, "+∞ "}, - {"%20e", NaN, " NaN"}, - {"% +20E", NaN, " NaN"}, - {"% -20g", NaN, "NaN "}, - {"%+-20G", NaN, "NaN "}, - // Zero padding does not apply to infinities and NaN. - {"%+020e", posInf, " +∞"}, - {"%-020f", negInf, "-∞ "}, - {"%-020E", NaN, "NaN "}, - - // complex values - {"%.f", 0i, "(0+0i)"}, - {"% .f", 0i, "( 0+0i)"}, - {"%+.f", 0i, "(+0+0i)"}, - {"% +.f", 0i, "(+0+0i)"}, - {"%+.3e", 0i, "(+0.000\u202f×\u202f10⁰⁰+0.000\u202f×\u202f10⁰⁰i)"}, - {"%+.3f", 0i, "(+0.000+0.000i)"}, - {"%+.3g", 0i, "(+0+0i)"}, - {"%+.3e", 1 + 2i, "(+1.000\u202f×\u202f10⁰⁰+2.000\u202f×\u202f10⁰⁰i)"}, - {"%+.3f", 1 + 2i, "(+1.000+2.000i)"}, - {"%+.3g", 1 + 2i, "(+1+2i)"}, - {"%.3e", 0i, "(0.000\u202f×\u202f10⁰⁰+0.000\u202f×\u202f10⁰⁰i)"}, - {"%.3f", 0i, "(0.000+0.000i)"}, - {"%.3F", 0i, "(0.000+0.000i)"}, - {"%.3F", complex64(0i), "(0.000+0.000i)"}, - {"%.3g", 0i, "(0+0i)"}, - {"%.3e", 1 + 2i, "(1.000\u202f×\u202f10⁰⁰+2.000\u202f×\u202f10⁰⁰i)"}, - {"%.3f", 1 + 2i, "(1.000+2.000i)"}, - {"%.3g", 1 + 2i, "(1+2i)"}, - {"%.3e", -1 - 2i, "(-1.000\u202f×\u202f10⁰⁰-2.000\u202f×\u202f10⁰⁰i)"}, - {"%.3f", -1 - 2i, "(-1.000-2.000i)"}, - {"%.3g", -1 - 2i, "(-1-2i)"}, - {"% .3E", -1 - 2i, "(-1.000\u202f×\u202f10⁰⁰-2.000\u202f×\u202f10⁰⁰i)"}, - {"%+.3g", 1 + 2i, "(+1+2i)"}, - {"%+.3g", complex64(1 + 2i), "(+1+2i)"}, - {"%#g", 1 + 2i, "(1.00000+2.00000i)"}, - {"%#g", 123456 + 789012i, "(123456.+789012.i)"}, - {"%#g", 1e-10i, "(0.00000+1.00000e-10i)"}, - {"%#g", -1e10 - 1.11e100i, "(-1.00000e+10-1.11000e+100i)"}, - {"%#.0f", 1.23 + 1.0i, "(1.+1.i)"}, - {"%#.0e", 1.23 + 1.0i, "(1.e+00+1.e+00i)"}, - {"%#.0g", 1.23 + 1.0i, "(1.+1.i)"}, - {"%#.0g", 0 + 100000i, "(0.+1.e+05i)"}, - {"%#.0g", 1230000 + 0i, "(1.e+06+0.i)"}, - {"%#.4f", 1 + 1.23i, "(1.0000+1.2300i)"}, - {"%#.4e", 123 + 1i, "(1.2300e+02+1.0000e+00i)"}, - {"%#.4g", 123 + 1.23i, "(123.0+1.230i)"}, - {"%#12.5g", 0 + 100000i, "( 0.0000 +1.0000e+05i)"}, - {"%#12.5g", 1230000 - 0i, "( 1.2300e+06 +0.0000i)"}, - {"%b", 1 + 2i, "(4503599627370496p-52+4503599627370496p-51i)"}, - {"%b", complex64(1 + 2i), "(8388608p-23+8388608p-22i)"}, - // The sharp flag has no effect for binary complex format. - {"%#b", 1 + 2i, "(4503599627370496p-52+4503599627370496p-51i)"}, - // Precision has no effect for binary complex format. - {"%.4b", 1 + 2i, "(4503599627370496p-52+4503599627370496p-51i)"}, - {"%.4b", complex64(1 + 2i), "(8388608p-23+8388608p-22i)"}, - // complex infinites and NaNs - {"%f", complex(posInf, posInf), "(∞+∞i)"}, - {"%f", complex(negInf, negInf), "(-∞-∞i)"}, - {"%f", complex(NaN, NaN), "(NaN+NaNi)"}, - {"%.1f", complex(posInf, posInf), "(∞+∞i)"}, - {"% f", complex(posInf, posInf), "( ∞+∞i)"}, - {"% f", complex(negInf, negInf), "(-∞-∞i)"}, - {"% f", complex(NaN, NaN), "(NaN+NaNi)"}, - {"%8e", complex(posInf, posInf), "( ∞ +∞i)"}, - {"% 8E", complex(posInf, posInf), "( ∞ +∞i)"}, - {"%+8f", complex(negInf, negInf), "( -∞ -∞i)"}, - {"% +8g", complex(negInf, negInf), "( -∞ -∞i)"}, // TODO(g) - {"% -8G", complex(NaN, NaN), "(NaN +NaN i)"}, - {"%+-8b", complex(NaN, NaN), "(+NaN +NaN i)"}, - // Zero padding does not apply to infinities and NaN. - {"%08f", complex(posInf, posInf), "( ∞ +∞i)"}, - {"%-08g", complex(negInf, negInf), "(-∞ -∞ i)"}, - {"%-08G", complex(NaN, NaN), "(NaN +NaN i)"}, - - // old test/fmt_test.go - {"%e", 1.0, "1.000000\u202f×\u202f10⁰⁰"}, - {"%e", 1234.5678e3, "1.234568\u202f×\u202f10⁰⁶"}, - {"%e", 1234.5678e-8, "1.234568\u202f×\u202f10⁻⁰⁵"}, - {"%e", -7.0, "-7.000000\u202f×\u202f10⁰⁰"}, - {"%e", -1e-9, "-1.000000\u202f×\u202f10⁻⁰⁹"}, - {"%f", 1234.5678e3, "1,234,567.800000"}, - {"%f", 1234.5678e-8, "0.000012"}, - {"%f", -7.0, "-7.000000"}, - {"%f", -1e-9, "-0.000000"}, - {"%g", 1234.5678e3, "1.2345678\u202f×\u202f10⁰⁶"}, - {"%g", float32(1234.5678e3), "1.2345678\u202f×\u202f10⁰⁶"}, - {"%g", 1234.5678e-8, "1.2345678\u202f×\u202f10⁻⁰⁵"}, - {"%g", -7.0, "-7"}, - {"%g", -1e-9, "-1\u202f×\u202f10⁻⁰⁹"}, - {"%g", float32(-1e-9), "-1\u202f×\u202f10⁻⁰⁹"}, - {"%E", 1.0, "1.000000\u202f×\u202f10⁰⁰"}, - {"%E", 1234.5678e3, "1.234568\u202f×\u202f10⁰⁶"}, - {"%E", 1234.5678e-8, "1.234568\u202f×\u202f10⁻⁰⁵"}, - {"%E", -7.0, "-7.000000\u202f×\u202f10⁰⁰"}, - {"%E", -1e-9, "-1.000000\u202f×\u202f10⁻⁰⁹"}, - {"%G", 1234.5678e3, "1.2345678\u202f×\u202f10⁰⁶"}, - {"%G", float32(1234.5678e3), "1.2345678\u202f×\u202f10⁰⁶"}, - {"%G", 1234.5678e-8, "1.2345678\u202f×\u202f10⁻⁰⁵"}, - {"%G", -7.0, "-7"}, - {"%G", -1e-9, "-1\u202f×\u202f10⁻⁰⁹"}, - {"%G", float32(-1e-9), "-1\u202f×\u202f10⁻⁰⁹"}, - {"%20.5s", "qwertyuiop", " qwert"}, - {"%.5s", "qwertyuiop", "qwert"}, - {"%-20.5s", "qwertyuiop", "qwert "}, - {"%20c", 'x', " x"}, - {"%-20c", 'x', "x "}, - {"%20.6e", 1.2345e3, " 1.234500\u202f×\u202f10⁰³"}, - {"%20.6e", 1.2345e-3, " 1.234500\u202f×\u202f10⁻⁰³"}, - {"%20e", 1.2345e3, " 1.234500\u202f×\u202f10⁰³"}, - {"%20e", 1.2345e-3, " 1.234500\u202f×\u202f10⁻⁰³"}, - {"%20.8e", 1.2345e3, " 1.23450000\u202f×\u202f10⁰³"}, - {"%20f", 1.23456789e3, " 1,234.567890"}, - {"%20f", 1.23456789e-3, " 0.001235"}, - {"%20f", 12345678901.23456789, "12,345,678,901.234568"}, - {"%-20f", 1.23456789e3, "1,234.567890 "}, - {"%20.8f", 1.23456789e3, " 1,234.56789000"}, - {"%20.8f", 1.23456789e-3, " 0.00123457"}, - {"%g", 1.23456789e3, "1,234.56789"}, - {"%g", 1.23456789e-3, "0.00123456789"}, - {"%g", 1.23456789e20, "1.23456789\u202f×\u202f10²⁰"}, - - // arrays - {"%v", array, "[1 2 3 4 5]"}, - {"%v", iarray, "[1 hello 2.5 <nil>]"}, - {"%v", barray, "[1 2 3 4 5]"}, - {"%v", &array, "&[1 2 3 4 5]"}, - {"%v", &iarray, "&[1 hello 2.5 <nil>]"}, - {"%v", &barray, "&[1 2 3 4 5]"}, - - // slices - {"%v", slice, "[1 2 3 4 5]"}, - {"%v", islice, "[1 hello 2.5 <nil>]"}, - {"%v", bslice, "[1 2 3 4 5]"}, - {"%v", &slice, "&[1 2 3 4 5]"}, - {"%v", &islice, "&[1 hello 2.5 <nil>]"}, - {"%v", &bslice, "&[1 2 3 4 5]"}, - - // byte arrays and slices with %b,%c,%d,%o,%U and %v - {"%b", [3]byte{65, 66, 67}, "[1000001 1000010 1000011]"}, - {"%c", [3]byte{65, 66, 67}, "[A B C]"}, - {"%d", [3]byte{65, 66, 67}, "[65 66 67]"}, - {"%o", [3]byte{65, 66, 67}, "[101 102 103]"}, - {"%U", [3]byte{65, 66, 67}, "[U+0041 U+0042 U+0043]"}, - {"%v", [3]byte{65, 66, 67}, "[65 66 67]"}, - {"%v", [1]byte{123}, "[123]"}, - {"%012v", []byte{}, "[]"}, - {"%#012v", []byte{}, "[]byte{}"}, - {"%6v", []byte{1, 11, 111}, "[ 1 11 111]"}, - {"%06v", []byte{1, 11, 111}, "[000001 000011 000111]"}, - {"%-6v", []byte{1, 11, 111}, "[1 11 111 ]"}, - {"%-06v", []byte{1, 11, 111}, "[1 11 111 ]"}, - {"%#v", []byte{1, 11, 111}, "[]byte{0x1, 0xb, 0x6f}"}, - {"%#6v", []byte{1, 11, 111}, "[]byte{ 0x1, 0xb, 0x6f}"}, - {"%#06v", []byte{1, 11, 111}, "[]byte{0x000001, 0x00000b, 0x00006f}"}, - {"%#-6v", []byte{1, 11, 111}, "[]byte{0x1 , 0xb , 0x6f }"}, - {"%#-06v", []byte{1, 11, 111}, "[]byte{0x1 , 0xb , 0x6f }"}, - // f.space should and f.plus should not have an effect with %v. - {"% v", []byte{1, 11, 111}, "[ 1 11 111]"}, - {"%+v", [3]byte{1, 11, 111}, "[1 11 111]"}, - {"%# -6v", []byte{1, 11, 111}, "[]byte{ 0x1 , 0xb , 0x6f }"}, - {"%#+-6v", [3]byte{1, 11, 111}, "[3]uint8{0x1 , 0xb , 0x6f }"}, - // f.space and f.plus should have an effect with %d. - {"% d", []byte{1, 11, 111}, "[ 1 11 111]"}, - {"%+d", [3]byte{1, 11, 111}, "[+1 +11 +111]"}, - {"%# -6d", []byte{1, 11, 111}, "[ 1 11 111 ]"}, - {"%#+-6d", [3]byte{1, 11, 111}, "[+1 +11 +111 ]"}, - - // floates with %v - {"%v", 1.2345678, "1.2345678"}, - {"%v", float32(1.2345678), "1.2345678"}, - - // complexes with %v - {"%v", 1 + 2i, "(1+2i)"}, - {"%v", complex64(1 + 2i), "(1+2i)"}, - - // structs - {"%v", A{1, 2, "a", []int{1, 2}}, `{1 2 a [1 2]}`}, - {"%+v", A{1, 2, "a", []int{1, 2}}, `{i:1 j:2 s:a x:[1 2]}`}, - - // +v on structs with Stringable items - {"%+v", B{1, 2}, `{I:<1> j:2}`}, - {"%+v", C{1, B{2, 3}}, `{i:1 B:{I:<2> j:3}}`}, - - // other formats on Stringable items - {"%s", I(23), `<23>`}, - {"%q", I(23), `"<23>"`}, - {"%x", I(23), `3c32333e`}, - {"%#x", I(23), `0x3c32333e`}, - {"%# x", I(23), `0x3c 0x32 0x33 0x3e`}, - // Stringer applies only to string formats. - {"%d", I(23), `23`}, - // Stringer applies to the extracted value. - {"%s", reflect.ValueOf(I(23)), `<23>`}, - - // go syntax - {"%#v", A{1, 2, "a", []int{1, 2}}, `message.A{i:1, j:0x2, s:"a", x:[]int{1, 2}}`}, - {"%#v", new(byte), "(*uint8)(0xPTR)"}, - {"%#v", TestFmtInterface, "(func(*testing.T))(0xPTR)"}, - {"%#v", make(chan int), "(chan int)(0xPTR)"}, - {"%#v", uint64(1<<64 - 1), "0xffffffffffffffff"}, - {"%#v", 1000000000, "1000000000"}, - {"%#v", map[string]int{"a": 1}, `map[string]int{"a":1}`}, - {"%#v", map[string]B{"a": {1, 2}}, `map[string]message.B{"a":message.B{I:1, j:2}}`}, - {"%#v", []string{"a", "b"}, `[]string{"a", "b"}`}, - {"%#v", SI{}, `message.SI{I:interface {}(nil)}`}, - {"%#v", []int(nil), `[]int(nil)`}, - {"%#v", []int{}, `[]int{}`}, - {"%#v", array, `[5]int{1, 2, 3, 4, 5}`}, - {"%#v", &array, `&[5]int{1, 2, 3, 4, 5}`}, - {"%#v", iarray, `[4]interface {}{1, "hello", 2.5, interface {}(nil)}`}, - {"%#v", &iarray, `&[4]interface {}{1, "hello", 2.5, interface {}(nil)}`}, - {"%#v", map[int]byte(nil), `map[int]uint8(nil)`}, - {"%#v", map[int]byte{}, `map[int]uint8{}`}, - {"%#v", "foo", `"foo"`}, - {"%#v", barray, `[5]message.renamedUint8{0x1, 0x2, 0x3, 0x4, 0x5}`}, - {"%#v", bslice, `[]message.renamedUint8{0x1, 0x2, 0x3, 0x4, 0x5}`}, - {"%#v", []int32(nil), "[]int32(nil)"}, - {"%#v", 1.2345678, "1.2345678"}, - {"%#v", float32(1.2345678), "1.2345678"}, - // Only print []byte and []uint8 as type []byte if they appear at the top level. - {"%#v", []byte(nil), "[]byte(nil)"}, - {"%#v", []uint8(nil), "[]byte(nil)"}, - {"%#v", []byte{}, "[]byte{}"}, - {"%#v", []uint8{}, "[]byte{}"}, - {"%#v", reflect.ValueOf([]byte{}), "[]uint8{}"}, - {"%#v", reflect.ValueOf([]uint8{}), "[]uint8{}"}, - {"%#v", &[]byte{}, "&[]uint8{}"}, - {"%#v", &[]byte{}, "&[]uint8{}"}, - {"%#v", [3]byte{}, "[3]uint8{0x0, 0x0, 0x0}"}, - {"%#v", [3]uint8{}, "[3]uint8{0x0, 0x0, 0x0}"}, - - // slices with other formats - {"%#x", []int{1, 2, 15}, `[0x1 0x2 0xf]`}, - {"%x", []int{1, 2, 15}, `[1 2 f]`}, - {"%d", []int{1, 2, 15}, `[1 2 15]`}, - {"%d", []byte{1, 2, 15}, `[1 2 15]`}, - {"%q", []string{"a", "b"}, `["a" "b"]`}, - {"% 02x", []byte{1}, "01"}, - {"% 02x", []byte{1, 2, 3}, "01 02 03"}, - - // Padding with byte slices. - {"%2x", []byte{}, " "}, - {"%#2x", []byte{}, " "}, - {"% 02x", []byte{}, "00"}, - {"%# 02x", []byte{}, "00"}, - {"%-2x", []byte{}, " "}, - {"%-02x", []byte{}, " "}, - {"%8x", []byte{0xab}, " ab"}, - {"% 8x", []byte{0xab}, " ab"}, - {"%#8x", []byte{0xab}, " 0xab"}, - {"%# 8x", []byte{0xab}, " 0xab"}, - {"%08x", []byte{0xab}, "000000ab"}, - {"% 08x", []byte{0xab}, "000000ab"}, - {"%#08x", []byte{0xab}, "00000xab"}, - {"%# 08x", []byte{0xab}, "00000xab"}, - {"%10x", []byte{0xab, 0xcd}, " abcd"}, - {"% 10x", []byte{0xab, 0xcd}, " ab cd"}, - {"%#10x", []byte{0xab, 0xcd}, " 0xabcd"}, - {"%# 10x", []byte{0xab, 0xcd}, " 0xab 0xcd"}, - {"%010x", []byte{0xab, 0xcd}, "000000abcd"}, - {"% 010x", []byte{0xab, 0xcd}, "00000ab cd"}, - {"%#010x", []byte{0xab, 0xcd}, "00000xabcd"}, - {"%# 010x", []byte{0xab, 0xcd}, "00xab 0xcd"}, - {"%-10X", []byte{0xab}, "AB "}, - {"% -010X", []byte{0xab}, "AB "}, - {"%#-10X", []byte{0xab, 0xcd}, "0XABCD "}, - {"%# -010X", []byte{0xab, 0xcd}, "0XAB 0XCD "}, - // Same for strings - {"%2x", "", " "}, - {"%#2x", "", " "}, - {"% 02x", "", "00"}, - {"%# 02x", "", "00"}, - {"%-2x", "", " "}, - {"%-02x", "", " "}, - {"%8x", "\xab", " ab"}, - {"% 8x", "\xab", " ab"}, - {"%#8x", "\xab", " 0xab"}, - {"%# 8x", "\xab", " 0xab"}, - {"%08x", "\xab", "000000ab"}, - {"% 08x", "\xab", "000000ab"}, - {"%#08x", "\xab", "00000xab"}, - {"%# 08x", "\xab", "00000xab"}, - {"%10x", "\xab\xcd", " abcd"}, - {"% 10x", "\xab\xcd", " ab cd"}, - {"%#10x", "\xab\xcd", " 0xabcd"}, - {"%# 10x", "\xab\xcd", " 0xab 0xcd"}, - {"%010x", "\xab\xcd", "000000abcd"}, - {"% 010x", "\xab\xcd", "00000ab cd"}, - {"%#010x", "\xab\xcd", "00000xabcd"}, - {"%# 010x", "\xab\xcd", "00xab 0xcd"}, - {"%-10X", "\xab", "AB "}, - {"% -010X", "\xab", "AB "}, - {"%#-10X", "\xab\xcd", "0XABCD "}, - {"%# -010X", "\xab\xcd", "0XAB 0XCD "}, - - // renamings - {"%v", renamedBool(true), "true"}, - {"%d", renamedBool(true), "%!d(message.renamedBool=true)"}, - {"%o", renamedInt(8), "10"}, - {"%d", renamedInt8(-9), "-9"}, - {"%v", renamedInt16(10), "10"}, - {"%v", renamedInt32(-11), "-11"}, - {"%X", renamedInt64(255), "FF"}, - {"%v", renamedUint(13), "13"}, - {"%o", renamedUint8(14), "16"}, - {"%X", renamedUint16(15), "F"}, - {"%d", renamedUint32(16), "16"}, - {"%X", renamedUint64(17), "11"}, - {"%o", renamedUintptr(18), "22"}, - {"%x", renamedString("thing"), "7468696e67"}, - {"%d", renamedBytes([]byte{1, 2, 15}), `[1 2 15]`}, - {"%q", renamedBytes([]byte("hello")), `"hello"`}, - {"%x", []renamedUint8{'h', 'e', 'l', 'l', 'o'}, "68656c6c6f"}, - {"%X", []renamedUint8{'h', 'e', 'l', 'l', 'o'}, "68656C6C6F"}, - {"%s", []renamedUint8{'h', 'e', 'l', 'l', 'o'}, "hello"}, - {"%q", []renamedUint8{'h', 'e', 'l', 'l', 'o'}, `"hello"`}, - {"%v", renamedFloat32(22), "22"}, - {"%v", renamedFloat64(33), "33"}, - {"%v", renamedComplex64(3 + 4i), "(3+4i)"}, - {"%v", renamedComplex128(4 - 3i), "(4-3i)"}, - - // Formatter - {"%x", F(1), "<x=F(1)>"}, - {"%x", G(2), "2"}, - {"%+v", S{F(4), G(5)}, "{F:<v=F(4)> G:5}"}, - - // GoStringer - {"%#v", G(6), "GoString(6)"}, - {"%#v", S{F(7), G(8)}, "message.S{F:<v=F(7)>, G:GoString(8)}"}, - - // %T - {"%T", byte(0), "uint8"}, - {"%T", reflect.ValueOf(nil), "reflect.Value"}, - {"%T", (4 - 3i), "complex128"}, - {"%T", renamedComplex128(4 - 3i), "message.renamedComplex128"}, - {"%T", intVar, "int"}, - {"%6T", &intVar, " *int"}, - {"%10T", nil, " <nil>"}, - {"%-10T", nil, "<nil> "}, - - // %p with pointers - {"%p", (*int)(nil), "0x0"}, - {"%#p", (*int)(nil), "0"}, - {"%p", &intVar, "0xPTR"}, - {"%#p", &intVar, "PTR"}, - {"%p", &array, "0xPTR"}, - {"%p", &slice, "0xPTR"}, - {"%8.2p", (*int)(nil), " 0x00"}, - {"%-20.16p", &intVar, "0xPTR "}, - // %p on non-pointers - {"%p", make(chan int), "0xPTR"}, - {"%p", make(map[int]int), "0xPTR"}, - {"%p", func() {}, "0xPTR"}, - {"%p", 27, "%!p(int=27)"}, // not a pointer at all - {"%p", nil, "%!p(<nil>)"}, // nil on its own has no type ... - {"%#p", nil, "%!p(<nil>)"}, // ... and hence is not a pointer type. - // pointers with specified base - {"%b", &intVar, "PTR_b"}, - {"%d", &intVar, "PTR_d"}, - {"%o", &intVar, "PTR_o"}, - {"%x", &intVar, "PTR_x"}, - {"%X", &intVar, "PTR_X"}, - // %v on pointers - {"%v", nil, "<nil>"}, - {"%#v", nil, "<nil>"}, - {"%v", (*int)(nil), "<nil>"}, - {"%#v", (*int)(nil), "(*int)(nil)"}, - {"%v", &intVar, "0xPTR"}, - {"%#v", &intVar, "(*int)(0xPTR)"}, - {"%8.2v", (*int)(nil), " <nil>"}, - {"%-20.16v", &intVar, "0xPTR "}, - // string method on pointer - {"%s", &pValue, "String(p)"}, // String method... - {"%p", &pValue, "0xPTR"}, // ... is not called with %p. - - // %d on Stringer should give integer if possible - {"%s", time.Time{}.Month(), "January"}, - {"%d", time.Time{}.Month(), "1"}, - - // erroneous things - {"%s %", "hello", "hello %!(NOVERB)"}, - {"%s %.2", "hello", "hello %!(NOVERB)"}, - - // The "<nil>" show up because maps are printed by - // first obtaining a list of keys and then looking up - // each key. Since NaNs can be map keys but cannot - // be fetched directly, the lookup fails and returns a - // zero reflect.Value, which formats as <nil>. - // This test is just to check that it shows the two NaNs at all. - {"%v", map[float64]int{NaN: 1, NaN: 2}, "map[NaN:<nil> NaN:<nil>]"}, - - // Comparison of padding rules with C printf. - /* - C program: - #include <stdio.h> - - char *format[] = { - "[%.2f]", - "[% .2f]", - "[%+.2f]", - "[%7.2f]", - "[% 7.2f]", - "[%+7.2f]", - "[% +7.2f]", - "[%07.2f]", - "[% 07.2f]", - "[%+07.2f]", - "[% +07.2f]" - }; - - int main(void) { - int i; - for(i = 0; i < 11; i++) { - printf("%s: ", format[i]); - printf(format[i], 1.0); - printf(" "); - printf(format[i], -1.0); - printf("\n"); - } - } - - Output: - [%.2f]: [1.00] [-1.00] - [% .2f]: [ 1.00] [-1.00] - [%+.2f]: [+1.00] [-1.00] - [%7.2f]: [ 1.00] [ -1.00] - [% 7.2f]: [ 1.00] [ -1.00] - [%+7.2f]: [ +1.00] [ -1.00] - [% +7.2f]: [ +1.00] [ -1.00] - [%07.2f]: [0001.00] [-001.00] - [% 07.2f]: [ 001.00] [-001.00] - [%+07.2f]: [+001.00] [-001.00] - [% +07.2f]: [+001.00] [-001.00] - - */ - {"%.2f", 1.0, "1.00"}, - {"%.2f", -1.0, "-1.00"}, - {"% .2f", 1.0, " 1.00"}, - {"% .2f", -1.0, "-1.00"}, - {"%+.2f", 1.0, "+1.00"}, - {"%+.2f", -1.0, "-1.00"}, - {"%7.2f", 1.0, " 1.00"}, - {"%7.2f", -1.0, " -1.00"}, - {"% 7.2f", 1.0, " 1.00"}, - {"% 7.2f", -1.0, " -1.00"}, - {"%+7.2f", 1.0, " +1.00"}, - {"%+7.2f", -1.0, " -1.00"}, - {"% +7.2f", 1.0, " +1.00"}, - {"% +7.2f", -1.0, " -1.00"}, - // Padding with 0's indicates minimum number of integer digits minus the - // period, if present, and minus the sign if it is fixed. - // TODO: consider making this number the number of significant digits. - {"%07.2f", 1.0, "0,001.00"}, - {"%07.2f", -1.0, "-0,001.00"}, - {"% 07.2f", 1.0, " 001.00"}, - {"% 07.2f", -1.0, "-001.00"}, - {"%+07.2f", 1.0, "+001.00"}, - {"%+07.2f", -1.0, "-001.00"}, - {"% +07.2f", 1.0, "+001.00"}, - {"% +07.2f", -1.0, "-001.00"}, - - // Complex numbers: exhaustively tested in TestComplexFormatting. - {"%7.2f", 1 + 2i, "( 1.00 +2.00i)"}, - {"%+07.2f", -1 - 2i, "(-001.00-002.00i)"}, - - // Use spaces instead of zero if padding to the right. - {"%0-5s", "abc", "abc "}, - {"%-05.1f", 1.0, "1.0 "}, - - // float and complex formatting should not change the padding width - // for other elements. See issue 14642. - {"%06v", []interface{}{+10.0, 10}, "[000,010 000,010]"}, - {"%06v", []interface{}{-10.0, 10}, "[-000,010 000,010]"}, - {"%06v", []interface{}{+10.0 + 10i, 10}, "[(000,010+00,010i) 000,010]"}, - {"%06v", []interface{}{-10.0 + 10i, 10}, "[(-000,010+00,010i) 000,010]"}, - - // integer formatting should not alter padding for other elements. - {"%03.6v", []interface{}{1, 2.0, "x"}, "[000,001 002 00x]"}, - {"%03.0v", []interface{}{0, 2.0, "x"}, "[ 002 000]"}, - - // Complex fmt used to leave the plus flag set for future entries in the array - // causing +2+0i and +3+0i instead of 2+0i and 3+0i. - {"%v", []complex64{1, 2, 3}, "[(1+0i) (2+0i) (3+0i)]"}, - {"%v", []complex128{1, 2, 3}, "[(1+0i) (2+0i) (3+0i)]"}, - - // Incomplete format specification caused crash. - {"%.", 3, "%!.(int=3)"}, - - // Padding for complex numbers. Has been bad, then fixed, then bad again. - {"%+10.2f", +104.66 + 440.51i, "( +104.66 +440.51i)"}, - {"%+10.2f", -104.66 + 440.51i, "( -104.66 +440.51i)"}, - {"%+10.2f", +104.66 - 440.51i, "( +104.66 -440.51i)"}, - {"%+10.2f", -104.66 - 440.51i, "( -104.66 -440.51i)"}, - {"%010.2f", +104.66 + 440.51i, "(0,000,104.66+000,440.51i)"}, - {"%+010.2f", +104.66 + 440.51i, "(+000,104.66+000,440.51i)"}, - {"%+010.2f", -104.66 + 440.51i, "(-000,104.66+000,440.51i)"}, - {"%+010.2f", +104.66 - 440.51i, "(+000,104.66-000,440.51i)"}, - {"%+010.2f", -104.66 - 440.51i, "(-000,104.66-000,440.51i)"}, - - // []T where type T is a byte with a Stringer method. - {"%v", byteStringerSlice, "[X X X X X]"}, - {"%s", byteStringerSlice, "hello"}, - {"%q", byteStringerSlice, "\"hello\""}, - {"%x", byteStringerSlice, "68656c6c6f"}, - {"%X", byteStringerSlice, "68656C6C6F"}, - {"%#v", byteStringerSlice, "[]message.byteStringer{0x68, 0x65, 0x6c, 0x6c, 0x6f}"}, - - // And the same for Formatter. - {"%v", byteFormatterSlice, "[X X X X X]"}, - {"%s", byteFormatterSlice, "hello"}, - {"%q", byteFormatterSlice, "\"hello\""}, - {"%x", byteFormatterSlice, "68656c6c6f"}, - {"%X", byteFormatterSlice, "68656C6C6F"}, - // This next case seems wrong, but the docs say the Formatter wins here. - {"%#v", byteFormatterSlice, "[]message.byteFormatter{X, X, X, X, X}"}, - - // reflect.Value handled specially in Go 1.5, making it possible to - // see inside non-exported fields (which cannot be accessed with Interface()). - // Issue 8965. - {"%v", reflect.ValueOf(A{}).Field(0).String(), "<int Value>"}, // Equivalent to the old way. - {"%v", reflect.ValueOf(A{}).Field(0), "0"}, // Sees inside the field. - - // verbs apply to the extracted value too. - {"%s", reflect.ValueOf("hello"), "hello"}, - {"%q", reflect.ValueOf("hello"), `"hello"`}, - {"%#04x", reflect.ValueOf(256), "0x0100"}, - - // invalid reflect.Value doesn't crash. - {"%v", reflect.Value{}, "<invalid reflect.Value>"}, - {"%v", &reflect.Value{}, "<invalid Value>"}, - {"%v", SI{reflect.Value{}}, "{<invalid Value>}"}, - - // Tests to check that not supported verbs generate an error string. - {"%☠", nil, "%!☠(<nil>)"}, - {"%☠", interface{}(nil), "%!☠(<nil>)"}, - {"%☠", int(0), "%!☠(int=0)"}, - {"%☠", uint(0), "%!☠(uint=0)"}, - {"%☠", []byte{0, 1}, "[%!☠(uint8=0) %!☠(uint8=1)]"}, - {"%☠", []uint8{0, 1}, "[%!☠(uint8=0) %!☠(uint8=1)]"}, - {"%☠", [1]byte{0}, "[%!☠(uint8=0)]"}, - {"%☠", [1]uint8{0}, "[%!☠(uint8=0)]"}, - {"%☠", "hello", "%!☠(string=hello)"}, - {"%☠", 1.2345678, "%!☠(float64=1.2345678)"}, - {"%☠", float32(1.2345678), "%!☠(float32=1.2345678)"}, - {"%☠", 1.2345678 + 1.2345678i, "%!☠(complex128=(1.2345678+1.2345678i))"}, - {"%☠", complex64(1.2345678 + 1.2345678i), "%!☠(complex64=(1.2345678+1.2345678i))"}, - {"%☠", &intVar, "%!☠(*int=0xPTR)"}, - {"%☠", make(chan int), "%!☠(chan int=0xPTR)"}, - {"%☠", func() {}, "%!☠(func()=0xPTR)"}, - {"%☠", reflect.ValueOf(renamedInt(0)), "%!☠(message.renamedInt=0)"}, - {"%☠", SI{renamedInt(0)}, "{%!☠(message.renamedInt=0)}"}, - {"%☠", &[]interface{}{I(1), G(2)}, "&[%!☠(message.I=1) %!☠(message.G=2)]"}, - {"%☠", SI{&[]interface{}{I(1), G(2)}}, "{%!☠(*[]interface {}=&[1 2])}"}, - {"%☠", reflect.Value{}, "<invalid reflect.Value>"}, - {"%☠", map[float64]int{NaN: 1}, "map[%!☠(float64=NaN):%!☠(<nil>)]"}, -} - -// zeroFill generates zero-filled strings of the specified width. The length -// of the suffix (but not the prefix) is compensated for in the width calculation. -func zeroFill(prefix string, width int, suffix string) string { - return prefix + strings.Repeat("0", width-len(suffix)) + suffix -} - -func TestSprintf(t *testing.T) { - p := NewPrinter(language.Und) - for _, tt := range fmtTests { - t.Run(fmt.Sprint(tt.fmt, "/", tt.val), func(t *testing.T) { - s := p.Sprintf(tt.fmt, tt.val) - i := strings.Index(tt.out, "PTR") - if i >= 0 && i < len(s) { - var pattern, chars string - switch { - case strings.HasPrefix(tt.out[i:], "PTR_b"): - pattern = "PTR_b" - chars = "01" - case strings.HasPrefix(tt.out[i:], "PTR_o"): - pattern = "PTR_o" - chars = "01234567" - case strings.HasPrefix(tt.out[i:], "PTR_d"): - pattern = "PTR_d" - chars = "0123456789" - case strings.HasPrefix(tt.out[i:], "PTR_x"): - pattern = "PTR_x" - chars = "0123456789abcdef" - case strings.HasPrefix(tt.out[i:], "PTR_X"): - pattern = "PTR_X" - chars = "0123456789ABCDEF" - default: - pattern = "PTR" - chars = "0123456789abcdefABCDEF" - } - p := s[:i] + pattern - for j := i; j < len(s); j++ { - if !strings.ContainsRune(chars, rune(s[j])) { - p += s[j:] - break - } - } - s = p - } - if s != tt.out { - if _, ok := tt.val.(string); ok { - // Don't requote the already-quoted strings. - // It's too confusing to read the errors. - t.Errorf("Sprintf(%q, %q) = <%s> want <%s>", tt.fmt, tt.val, s, tt.out) - } else { - t.Errorf("Sprintf(%q, %v) = %q want %q", tt.fmt, tt.val, s, tt.out) - } - } - }) - } -} - -var f float64 - -// TestComplexFormatting checks that a complex always formats to the same -// thing as if done by hand with two singleton prints. -func TestComplexFormatting(t *testing.T) { - var yesNo = []bool{true, false} - var values = []float64{1, 0, -1, posInf, negInf, NaN} - p := NewPrinter(language.Und) - for _, plus := range yesNo { - for _, zero := range yesNo { - for _, space := range yesNo { - for _, char := range "fFeEgG" { - realFmt := "%" - if zero { - realFmt += "0" - } - if space { - realFmt += " " - } - if plus { - realFmt += "+" - } - realFmt += "10.2" - realFmt += string(char) - // Imaginary part always has a sign, so force + and ignore space. - imagFmt := "%" - if zero { - imagFmt += "0" - } - imagFmt += "+" - imagFmt += "10.2" - imagFmt += string(char) - for _, realValue := range values { - for _, imagValue := range values { - one := p.Sprintf(realFmt, complex(realValue, imagValue)) - two := p.Sprintf("("+realFmt+imagFmt+"i)", realValue, imagValue) - if math.IsNaN(imagValue) { - p := len(two) - len("NaNi)") - 1 - if two[p] == ' ' { - two = two[:p] + "+" + two[p+1:] - } else { - two = two[:p+1] + "+" + two[p+1:] - } - } - if one != two { - t.Error(f, one, two) - } - } - } - } - } - } - } -} - -type SE []interface{} // slice of empty; notational compactness. - -var reorderTests = []struct { - format string - args SE - out string -}{ - {"%[1]d", SE{1}, "1"}, - {"%[2]d", SE{2, 1}, "1"}, - {"%[2]d %[1]d", SE{1, 2}, "2 1"}, - {"%[2]*[1]d", SE{2, 5}, " 2"}, - {"%6.2f", SE{12.0}, " 12.00"}, // Explicit version of next line. - {"%[3]*.[2]*[1]f", SE{12.0, 2, 6}, " 12.00"}, - {"%[1]*.[2]*[3]f", SE{6, 2, 12.0}, " 12.00"}, - {"%10f", SE{12.0}, " 12.000000"}, - {"%[1]*[3]f", SE{10, 99, 12.0}, " 12.000000"}, - {"%.6f", SE{12.0}, "12.000000"}, // Explicit version of next line. - {"%.[1]*[3]f", SE{6, 99, 12.0}, "12.000000"}, - {"%6.f", SE{12.0}, " 12"}, // // Explicit version of next line; empty precision means zero. - {"%[1]*.[3]f", SE{6, 3, 12.0}, " 12"}, - // An actual use! Print the same arguments twice. - {"%d %d %d %#[1]o %#o %#o", SE{11, 12, 13}, "11 12 13 013 014 015"}, - - // Erroneous cases. - {"%[d", SE{2, 1}, "%!d(BADINDEX)"}, - {"%]d", SE{2, 1}, "%!](int=2)d%!(EXTRA int=1)"}, - {"%[]d", SE{2, 1}, "%!d(BADINDEX)"}, - {"%[-3]d", SE{2, 1}, "%!d(BADINDEX)"}, - {"%[99]d", SE{2, 1}, "%!d(BADINDEX)"}, - {"%[3]", SE{2, 1}, "%!(NOVERB)"}, - {"%[1].2d", SE{5, 6}, "%!d(BADINDEX)"}, - {"%[1]2d", SE{2, 1}, "%!d(BADINDEX)"}, - {"%3.[2]d", SE{7}, "%!d(BADINDEX)"}, - {"%.[2]d", SE{7}, "%!d(BADINDEX)"}, - {"%d %d %d %#[1]o %#o %#o %#o", SE{11, 12, 13}, "11 12 13 013 014 015 %!o(MISSING)"}, - {"%[5]d %[2]d %d", SE{1, 2, 3}, "%!d(BADINDEX) 2 3"}, - {"%d %[3]d %d", SE{1, 2}, "1 %!d(BADINDEX) 2"}, // Erroneous index does not affect sequence. - {"%.[]", SE{}, "%!](BADINDEX)"}, // Issue 10675 - {"%.-3d", SE{42}, "%!-(int=42)3d"}, // TODO: Should this set return better error messages? - // The following messages are interpreted as if there is no substitution, - // in which case it is okay to have extra arguments. This is different - // semantics from the fmt package. - {"%2147483648d", SE{42}, "%!(NOVERB)"}, - {"%-2147483648d", SE{42}, "%!(NOVERB)"}, - {"%.2147483648d", SE{42}, "%!(NOVERB)"}, -} - -func TestReorder(t *testing.T) { - p := NewPrinter(language.Und) - for _, tc := range reorderTests { - t.Run(fmt.Sprint(tc.format, "/", tc.args), func(t *testing.T) { - s := p.Sprintf(tc.format, tc.args...) - if s != tc.out { - t.Errorf("Sprintf(%q, %v) = %q want %q", tc.format, tc.args, s, tc.out) - } - }) - } -} - -func BenchmarkSprintfPadding(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%16f", 1.0) - } - }) -} - -func BenchmarkSprintfEmpty(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("") - } - }) -} - -func BenchmarkSprintfString(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%s", "hello") - } - }) -} - -func BenchmarkSprintfTruncateString(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%.3s", "日本語日本語日本語") - } - }) -} - -func BenchmarkSprintfQuoteString(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%q", "日本語日本語日本語") - } - }) -} - -func BenchmarkSprintfInt(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%d", 5) - } - }) -} - -func BenchmarkSprintfIntInt(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%d %d", 5, 6) - } - }) -} - -func BenchmarkSprintfPrefixedInt(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("This is some meaningless prefix text that needs to be scanned %d", 6) - } - }) -} - -func BenchmarkSprintfFloat(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%g", 5.23184) - } - }) -} - -func BenchmarkSprintfComplex(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%f", 5.23184+5.23184i) - } - }) -} - -func BenchmarkSprintfBoolean(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%t", true) - } - }) -} - -func BenchmarkSprintfHexString(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("% #x", "0123456789abcdef") - } - }) -} - -func BenchmarkSprintfHexBytes(b *testing.B) { - data := []byte("0123456789abcdef") - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("% #x", data) - } - }) -} - -func BenchmarkSprintfBytes(b *testing.B) { - data := []byte("0123456789abcdef") - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%v", data) - } - }) -} - -func BenchmarkSprintfStringer(b *testing.B) { - stringer := I(12345) - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%v", stringer) - } - }) -} - -func BenchmarkSprintfStructure(b *testing.B) { - s := &[]interface{}{SI{12345}, map[int]string{0: "hello"}} - b.RunParallel(func(pb *testing.PB) { - p := NewPrinter(language.English) - for pb.Next() { - p.Sprintf("%#v", s) - } - }) -} - -func BenchmarkManyArgs(b *testing.B) { - b.RunParallel(func(pb *testing.PB) { - var buf bytes.Buffer - p := NewPrinter(language.English) - for pb.Next() { - buf.Reset() - p.Fprintf(&buf, "%2d/%2d/%2d %d:%d:%d %s %s\n", 3, 4, 5, 11, 12, 13, "hello", "world") - } - }) -} - -func BenchmarkFprintInt(b *testing.B) { - var buf bytes.Buffer - p := NewPrinter(language.English) - for i := 0; i < b.N; i++ { - buf.Reset() - p.Fprint(&buf, 123456) - } -} - -func BenchmarkFprintfBytes(b *testing.B) { - data := []byte(string("0123456789")) - var buf bytes.Buffer - p := NewPrinter(language.English) - for i := 0; i < b.N; i++ { - buf.Reset() - p.Fprintf(&buf, "%s", data) - } -} - -func BenchmarkFprintIntNoAlloc(b *testing.B) { - var x interface{} = 123456 - var buf bytes.Buffer - p := NewPrinter(language.English) - for i := 0; i < b.N; i++ { - buf.Reset() - p.Fprint(&buf, x) - } -} - -var mallocBuf bytes.Buffer -var mallocPointer *int // A pointer so we know the interface value won't allocate. - -var mallocTest = []struct { - count int - desc string - fn func(p *Printer) -}{ - {0, `Sprintf("")`, func(p *Printer) { p.Sprintf("") }}, - {1, `Sprintf("xxx")`, func(p *Printer) { p.Sprintf("xxx") }}, - {2, `Sprintf("%x")`, func(p *Printer) { p.Sprintf("%x", 7) }}, - {2, `Sprintf("%s")`, func(p *Printer) { p.Sprintf("%s", "hello") }}, - {3, `Sprintf("%x %x")`, func(p *Printer) { p.Sprintf("%x %x", 7, 112) }}, - {2, `Sprintf("%g")`, func(p *Printer) { p.Sprintf("%g", float32(3.14159)) }}, // TODO: Can this be 1? - {1, `Fprintf(buf, "%s")`, func(p *Printer) { mallocBuf.Reset(); p.Fprintf(&mallocBuf, "%s", "hello") }}, - // If the interface value doesn't need to allocate, amortized allocation overhead should be zero. - {0, `Fprintf(buf, "%x %x %x")`, func(p *Printer) { - mallocBuf.Reset() - p.Fprintf(&mallocBuf, "%x %x %x", mallocPointer, mallocPointer, mallocPointer) - }}, -} - -var _ bytes.Buffer - -func TestCountMallocs(t *testing.T) { - switch { - case testing.Short(): - t.Skip("skipping malloc count in short mode") - case runtime.GOMAXPROCS(0) > 1: - t.Skip("skipping; GOMAXPROCS>1") - // TODO: detect race detecter enabled. - // case race.Enabled: - // t.Skip("skipping malloc count under race detector") - } - p := NewPrinter(language.English) - for _, mt := range mallocTest { - mallocs := testing.AllocsPerRun(100, func() { mt.fn(p) }) - if got, max := mallocs, float64(mt.count); got > max { - t.Errorf("%s: got %v allocs, want <=%v", mt.desc, got, max) - } - } -} - -type flagPrinter struct{} - -func (flagPrinter) Format(f fmt.State, c rune) { - s := "%" - for i := 0; i < 128; i++ { - if f.Flag(i) { - s += string(i) - } - } - if w, ok := f.Width(); ok { - s += fmt.Sprintf("%d", w) - } - if p, ok := f.Precision(); ok { - s += fmt.Sprintf(".%d", p) - } - s += string(c) - io.WriteString(f, "["+s+"]") -} - -var flagtests = []struct { - in string - out string -}{ - {"%a", "[%a]"}, - {"%-a", "[%-a]"}, - {"%+a", "[%+a]"}, - {"%#a", "[%#a]"}, - {"% a", "[% a]"}, - {"%0a", "[%0a]"}, - {"%1.2a", "[%1.2a]"}, - {"%-1.2a", "[%-1.2a]"}, - {"%+1.2a", "[%+1.2a]"}, - {"%-+1.2a", "[%+-1.2a]"}, - {"%-+1.2abc", "[%+-1.2a]bc"}, - {"%-1.2abc", "[%-1.2a]bc"}, -} - -func TestFlagParser(t *testing.T) { - var flagprinter flagPrinter - for _, tt := range flagtests { - s := NewPrinter(language.Und).Sprintf(tt.in, &flagprinter) - if s != tt.out { - t.Errorf("Sprintf(%q, &flagprinter) => %q, want %q", tt.in, s, tt.out) - } - } -} - -func TestStructPrinter(t *testing.T) { - type T struct { - a string - b string - c int - } - var s T - s.a = "abc" - s.b = "def" - s.c = 123 - var tests = []struct { - fmt string - out string - }{ - {"%v", "{abc def 123}"}, - {"%+v", "{a:abc b:def c:123}"}, - {"%#v", `message.T{a:"abc", b:"def", c:123}`}, - } - p := NewPrinter(language.Und) - for _, tt := range tests { - out := p.Sprintf(tt.fmt, s) - if out != tt.out { - t.Errorf("Sprintf(%q, s) = %#q, want %#q", tt.fmt, out, tt.out) - } - // The same but with a pointer. - out = p.Sprintf(tt.fmt, &s) - if out != "&"+tt.out { - t.Errorf("Sprintf(%q, &s) = %#q, want %#q", tt.fmt, out, "&"+tt.out) - } - } -} - -func TestSlicePrinter(t *testing.T) { - p := NewPrinter(language.Und) - slice := []int{} - s := p.Sprint(slice) - if s != "[]" { - t.Errorf("empty slice printed as %q not %q", s, "[]") - } - slice = []int{1, 2, 3} - s = p.Sprint(slice) - if s != "[1 2 3]" { - t.Errorf("slice: got %q expected %q", s, "[1 2 3]") - } - s = p.Sprint(&slice) - if s != "&[1 2 3]" { - t.Errorf("&slice: got %q expected %q", s, "&[1 2 3]") - } -} - -// presentInMap checks map printing using substrings so we don't depend on the -// print order. -func presentInMap(s string, a []string, t *testing.T) { - for i := 0; i < len(a); i++ { - loc := strings.Index(s, a[i]) - if loc < 0 { - t.Errorf("map print: expected to find %q in %q", a[i], s) - } - // make sure the match ends here - loc += len(a[i]) - if loc >= len(s) || (s[loc] != ' ' && s[loc] != ']') { - t.Errorf("map print: %q not properly terminated in %q", a[i], s) - } - } -} - -func TestMapPrinter(t *testing.T) { - p := NewPrinter(language.Und) - m0 := make(map[int]string) - s := p.Sprint(m0) - if s != "map[]" { - t.Errorf("empty map printed as %q not %q", s, "map[]") - } - m1 := map[int]string{1: "one", 2: "two", 3: "three"} - a := []string{"1:one", "2:two", "3:three"} - presentInMap(p.Sprintf("%v", m1), a, t) - presentInMap(p.Sprint(m1), a, t) - // Pointer to map prints the same but with initial &. - if !strings.HasPrefix(p.Sprint(&m1), "&") { - t.Errorf("no initial & for address of map") - } - presentInMap(p.Sprintf("%v", &m1), a, t) - presentInMap(p.Sprint(&m1), a, t) -} - -func TestEmptyMap(t *testing.T) { - const emptyMapStr = "map[]" - var m map[string]int - p := NewPrinter(language.Und) - s := p.Sprint(m) - if s != emptyMapStr { - t.Errorf("nil map printed as %q not %q", s, emptyMapStr) - } - m = make(map[string]int) - s = p.Sprint(m) - if s != emptyMapStr { - t.Errorf("empty map printed as %q not %q", s, emptyMapStr) - } -} - -// TestBlank checks that Sprint (and hence Print, Fprint) puts spaces in the -// right places, that is, between arg pairs in which neither is a string. -func TestBlank(t *testing.T) { - p := NewPrinter(language.Und) - got := p.Sprint("<", 1, ">:", 1, 2, 3, "!") - expect := "<1>:1 2 3!" - if got != expect { - t.Errorf("got %q expected %q", got, expect) - } -} - -// TestBlankln checks that Sprintln (and hence Println, Fprintln) puts spaces in -// the right places, that is, between all arg pairs. -func TestBlankln(t *testing.T) { - p := NewPrinter(language.Und) - got := p.Sprintln("<", 1, ">:", 1, 2, 3, "!") - expect := "< 1 >: 1 2 3 !\n" - if got != expect { - t.Errorf("got %q expected %q", got, expect) - } -} - -// TestFormatterPrintln checks Formatter with Sprint, Sprintln, Sprintf. -func TestFormatterPrintln(t *testing.T) { - p := NewPrinter(language.Und) - f := F(1) - expect := "<v=F(1)>\n" - s := p.Sprint(f, "\n") - if s != expect { - t.Errorf("Sprint wrong with Formatter: expected %q got %q", expect, s) - } - s = p.Sprintln(f) - if s != expect { - t.Errorf("Sprintln wrong with Formatter: expected %q got %q", expect, s) - } - s = p.Sprintf("%v\n", f) - if s != expect { - t.Errorf("Sprintf wrong with Formatter: expected %q got %q", expect, s) - } -} - -func args(a ...interface{}) []interface{} { return a } - -var startests = []struct { - fmt string - in []interface{} - out string -}{ - {"%*d", args(4, 42), " 42"}, - {"%-*d", args(4, 42), "42 "}, - {"%*d", args(-4, 42), "42 "}, - {"%-*d", args(-4, 42), "42 "}, - {"%.*d", args(4, 42), "0,042"}, - {"%*.*d", args(8, 4, 42), " 0,042"}, - {"%0*d", args(4, 42), "0,042"}, - // Some non-int types for width. (Issue 10732). - {"%0*d", args(uint(4), 42), "0,042"}, - {"%0*d", args(uint64(4), 42), "0,042"}, - {"%0*d", args('\x04', 42), "0,042"}, - {"%0*d", args(uintptr(4), 42), "0,042"}, - - // erroneous - {"%*d", args(nil, 42), "%!(BADWIDTH)42"}, - {"%*d", args(int(1e7), 42), "%!(BADWIDTH)42"}, - {"%*d", args(int(-1e7), 42), "%!(BADWIDTH)42"}, - {"%.*d", args(nil, 42), "%!(BADPREC)42"}, - {"%.*d", args(-1, 42), "%!(BADPREC)42"}, - {"%.*d", args(int(1e7), 42), "%!(BADPREC)42"}, - {"%.*d", args(uint(1e7), 42), "%!(BADPREC)42"}, - {"%.*d", args(uint64(1<<63), 42), "%!(BADPREC)42"}, // Huge negative (-inf). - {"%.*d", args(uint64(1<<64-1), 42), "%!(BADPREC)42"}, // Small negative (-1). - {"%*d", args(5, "foo"), "%!d(string= foo)"}, - {"%*% %d", args(20, 5), "% 5"}, - {"%*", args(4), "%!(NOVERB)"}, -} - -func TestWidthAndPrecision(t *testing.T) { - p := NewPrinter(language.Und) - for i, tt := range startests { - t.Run(fmt.Sprint(tt.fmt, tt.in), func(t *testing.T) { - s := p.Sprintf(tt.fmt, tt.in...) - if s != tt.out { - t.Errorf("#%d: %q: got %q expected %q", i, tt.fmt, s, tt.out) - } - }) - } -} - -// PanicS is a type that panics in String. -type PanicS struct { - message interface{} -} - -// Value receiver. -func (p PanicS) String() string { - panic(p.message) -} - -// PanicGo is a type that panics in GoString. -type PanicGo struct { - message interface{} -} - -// Value receiver. -func (p PanicGo) GoString() string { - panic(p.message) -} - -// PanicF is a type that panics in Format. -type PanicF struct { - message interface{} -} - -// Value receiver. -func (p PanicF) Format(f fmt.State, c rune) { - panic(p.message) -} - -var panictests = []struct { - desc string - fmt string - in interface{} - out string -}{ - // String - {"String", "%s", (*PanicS)(nil), "<nil>"}, // nil pointer special case - {"String", "%s", PanicS{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"}, - {"String", "%s", PanicS{3}, "%!s(PANIC=3)"}, - // GoString - {"GoString", "%#v", (*PanicGo)(nil), "<nil>"}, // nil pointer special case - {"GoString", "%#v", PanicGo{io.ErrUnexpectedEOF}, "%!v(PANIC=unexpected EOF)"}, - {"GoString", "%#v", PanicGo{3}, "%!v(PANIC=3)"}, - // Issue 18282. catchPanic should not clear fmtFlags permanently. - {"Issue 18282", "%#v", []interface{}{PanicGo{3}, PanicGo{3}}, "[]interface {}{%!v(PANIC=3), %!v(PANIC=3)}"}, - // Format - {"Format", "%s", (*PanicF)(nil), "<nil>"}, // nil pointer special case - {"Format", "%s", PanicF{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"}, - {"Format", "%s", PanicF{3}, "%!s(PANIC=3)"}, -} - -func TestPanics(t *testing.T) { - p := NewPrinter(language.Und) - for i, tt := range panictests { - t.Run(fmt.Sprint(tt.desc, "/", tt.fmt, "/", tt.in), func(t *testing.T) { - s := p.Sprintf(tt.fmt, tt.in) - if s != tt.out { - t.Errorf("%d: %q: got %q expected %q", i, tt.fmt, s, tt.out) - } - }) - } -} - -// recurCount tests that erroneous String routine doesn't cause fatal recursion. -var recurCount = 0 - -type Recur struct { - i int - failed *bool -} - -func (r *Recur) String() string { - p := NewPrinter(language.Und) - if recurCount++; recurCount > 10 { - *r.failed = true - return "FAIL" - } - // This will call badVerb. Before the fix, that would cause us to recur into - // this routine to print %!p(value). Now we don't call the user's method - // during an error. - return p.Sprintf("recur@%p value: %d", r, r.i) -} - -func TestBadVerbRecursion(t *testing.T) { - p := NewPrinter(language.Und) - failed := false - r := &Recur{3, &failed} - p.Sprintf("recur@%p value: %d\n", &r, r.i) - if failed { - t.Error("fail with pointer") - } - failed = false - r = &Recur{4, &failed} - p.Sprintf("recur@%p, value: %d\n", r, r.i) - if failed { - t.Error("fail with value") - } -} - -func TestNilDoesNotBecomeTyped(t *testing.T) { - p := NewPrinter(language.Und) - type A struct{} - type B struct{} - var a *A = nil - var b B = B{} - got := p.Sprintf("%s %s %s %s %s", nil, a, nil, b, nil) // go vet should complain about this line. - const expect = "%!s(<nil>) %!s(*message.A=<nil>) %!s(<nil>) {} %!s(<nil>)" - if got != expect { - t.Errorf("expected:\n\t%q\ngot:\n\t%q", expect, got) - } -} - -var formatterFlagTests = []struct { - in string - val interface{} - out string -}{ - // scalar values with the (unused by fmt) 'a' verb. - {"%a", flagPrinter{}, "[%a]"}, - {"%-a", flagPrinter{}, "[%-a]"}, - {"%+a", flagPrinter{}, "[%+a]"}, - {"%#a", flagPrinter{}, "[%#a]"}, - {"% a", flagPrinter{}, "[% a]"}, - {"%0a", flagPrinter{}, "[%0a]"}, - {"%1.2a", flagPrinter{}, "[%1.2a]"}, - {"%-1.2a", flagPrinter{}, "[%-1.2a]"}, - {"%+1.2a", flagPrinter{}, "[%+1.2a]"}, - {"%-+1.2a", flagPrinter{}, "[%+-1.2a]"}, - {"%-+1.2abc", flagPrinter{}, "[%+-1.2a]bc"}, - {"%-1.2abc", flagPrinter{}, "[%-1.2a]bc"}, - - // composite values with the 'a' verb - {"%a", [1]flagPrinter{}, "[[%a]]"}, - {"%-a", [1]flagPrinter{}, "[[%-a]]"}, - {"%+a", [1]flagPrinter{}, "[[%+a]]"}, - {"%#a", [1]flagPrinter{}, "[[%#a]]"}, - {"% a", [1]flagPrinter{}, "[[% a]]"}, - {"%0a", [1]flagPrinter{}, "[[%0a]]"}, - {"%1.2a", [1]flagPrinter{}, "[[%1.2a]]"}, - {"%-1.2a", [1]flagPrinter{}, "[[%-1.2a]]"}, - {"%+1.2a", [1]flagPrinter{}, "[[%+1.2a]]"}, - {"%-+1.2a", [1]flagPrinter{}, "[[%+-1.2a]]"}, - {"%-+1.2abc", [1]flagPrinter{}, "[[%+-1.2a]]bc"}, - {"%-1.2abc", [1]flagPrinter{}, "[[%-1.2a]]bc"}, - - // simple values with the 'v' verb - {"%v", flagPrinter{}, "[%v]"}, - {"%-v", flagPrinter{}, "[%-v]"}, - {"%+v", flagPrinter{}, "[%+v]"}, - {"%#v", flagPrinter{}, "[%#v]"}, - {"% v", flagPrinter{}, "[% v]"}, - {"%0v", flagPrinter{}, "[%0v]"}, - {"%1.2v", flagPrinter{}, "[%1.2v]"}, - {"%-1.2v", flagPrinter{}, "[%-1.2v]"}, - {"%+1.2v", flagPrinter{}, "[%+1.2v]"}, - {"%-+1.2v", flagPrinter{}, "[%+-1.2v]"}, - {"%-+1.2vbc", flagPrinter{}, "[%+-1.2v]bc"}, - {"%-1.2vbc", flagPrinter{}, "[%-1.2v]bc"}, - - // composite values with the 'v' verb. - {"%v", [1]flagPrinter{}, "[[%v]]"}, - {"%-v", [1]flagPrinter{}, "[[%-v]]"}, - {"%+v", [1]flagPrinter{}, "[[%+v]]"}, - {"%#v", [1]flagPrinter{}, "[1]message.flagPrinter{[%#v]}"}, - {"% v", [1]flagPrinter{}, "[[% v]]"}, - {"%0v", [1]flagPrinter{}, "[[%0v]]"}, - {"%1.2v", [1]flagPrinter{}, "[[%1.2v]]"}, - {"%-1.2v", [1]flagPrinter{}, "[[%-1.2v]]"}, - {"%+1.2v", [1]flagPrinter{}, "[[%+1.2v]]"}, - {"%-+1.2v", [1]flagPrinter{}, "[[%+-1.2v]]"}, - {"%-+1.2vbc", [1]flagPrinter{}, "[[%+-1.2v]]bc"}, - {"%-1.2vbc", [1]flagPrinter{}, "[[%-1.2v]]bc"}, -} - -func TestFormatterFlags(t *testing.T) { - p := NewPrinter(language.Und) - for _, tt := range formatterFlagTests { - s := p.Sprintf(tt.in, tt.val) - if s != tt.out { - t.Errorf("Sprintf(%q, %T) = %q, want %q", tt.in, tt.val, s, tt.out) - } - } -} - -func TestParsenum(t *testing.T) { - testCases := []struct { - s string - start, end int - num int - isnum bool - newi int - }{ - {"a123", 0, 4, 0, false, 0}, - {"1234", 1, 1, 0, false, 1}, - {"123a", 0, 4, 123, true, 3}, - {"12a3", 0, 4, 12, true, 2}, - {"1234", 0, 4, 1234, true, 4}, - {"1a234", 1, 3, 0, false, 1}, - } - for _, tt := range testCases { - num, isnum, newi := parsenum(tt.s, tt.start, tt.end) - if num != tt.num || isnum != tt.isnum || newi != tt.newi { - t.Errorf("parsenum(%q, %d, %d) = %d, %v, %d, want %d, %v, %d", tt.s, tt.start, tt.end, num, isnum, newi, tt.num, tt.isnum, tt.newi) - } - } -} diff --git a/vendor/golang.org/x/text/message/format.go b/vendor/golang.org/x/text/message/format.go deleted file mode 100644 index d3340d194..000000000 --- a/vendor/golang.org/x/text/message/format.go +++ /dev/null @@ -1,532 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package message - -import ( - "bytes" - "strconv" - "unicode/utf8" -) - -const ( - ldigits = "0123456789abcdefx" - udigits = "0123456789ABCDEFX" -) - -const ( - signed = true - unsigned = false -) - -// flags placed in a separate struct for easy clearing. -type fmtFlags struct { - widPresent bool - precPresent bool - minus bool - plus bool - sharp bool - space bool - zero bool - - // For the formats %+v %#v, we set the plusV/sharpV flags - // and clear the plus/sharp flags since %+v and %#v are in effect - // different, flagless formats set at the top level. - plusV bool - sharpV bool -} - -// A formatInfo is the raw formatter used by Printf etc. -// It prints into a buffer that must be set up separately. -type formatInfo struct { - buf *bytes.Buffer - - fmtFlags - - wid int // width - prec int // precision - - // intbuf is large enough to store %b of an int64 with a sign and - // avoids padding at the end of the struct on 32 bit architectures. - intbuf [68]byte -} - -func (f *formatInfo) clearflags() { - f.fmtFlags = fmtFlags{} -} - -func (f *formatInfo) init(buf *bytes.Buffer) { - f.buf = buf - f.clearflags() -} - -// writePadding generates n bytes of padding. -func (f *formatInfo) writePadding(n int) { - if n <= 0 { // No padding bytes needed. - return - } - f.buf.Grow(n) - // Decide which byte the padding should be filled with. - padByte := byte(' ') - if f.zero { - padByte = byte('0') - } - // Fill padding with padByte. - for i := 0; i < n; i++ { - f.buf.WriteByte(padByte) // TODO: make more efficient. - } -} - -// pad appends b to f.buf, padded on left (!f.minus) or right (f.minus). -func (f *formatInfo) pad(b []byte) { - if !f.widPresent || f.wid == 0 { - f.buf.Write(b) - return - } - width := f.wid - utf8.RuneCount(b) - if !f.minus { - // left padding - f.writePadding(width) - f.buf.Write(b) - } else { - // right padding - f.buf.Write(b) - f.writePadding(width) - } -} - -// padString appends s to f.buf, padded on left (!f.minus) or right (f.minus). -func (f *formatInfo) padString(s string) { - if !f.widPresent || f.wid == 0 { - f.buf.WriteString(s) - return - } - width := f.wid - utf8.RuneCountInString(s) - if !f.minus { - // left padding - f.writePadding(width) - f.buf.WriteString(s) - } else { - // right padding - f.buf.WriteString(s) - f.writePadding(width) - } -} - -// fmt_boolean formats a boolean. -func (f *formatInfo) fmt_boolean(v bool) { - if v { - f.padString("true") - } else { - f.padString("false") - } -} - -// fmt_unicode formats a uint64 as "U+0078" or with f.sharp set as "U+0078 'x'". -func (f *formatInfo) fmt_unicode(u uint64) { - buf := f.intbuf[0:] - - // With default precision set the maximum needed buf length is 18 - // for formatting -1 with %#U ("U+FFFFFFFFFFFFFFFF") which fits - // into the already allocated intbuf with a capacity of 68 bytes. - prec := 4 - if f.precPresent && f.prec > 4 { - prec = f.prec - // Compute space needed for "U+" , number, " '", character, "'". - width := 2 + prec + 2 + utf8.UTFMax + 1 - if width > len(buf) { - buf = make([]byte, width) - } - } - - // Format into buf, ending at buf[i]. Formatting numbers is easier right-to-left. - i := len(buf) - - // For %#U we want to add a space and a quoted character at the end of the buffer. - if f.sharp && u <= utf8.MaxRune && strconv.IsPrint(rune(u)) { - i-- - buf[i] = '\'' - i -= utf8.RuneLen(rune(u)) - utf8.EncodeRune(buf[i:], rune(u)) - i-- - buf[i] = '\'' - i-- - buf[i] = ' ' - } - // Format the Unicode code point u as a hexadecimal number. - for u >= 16 { - i-- - buf[i] = udigits[u&0xF] - prec-- - u >>= 4 - } - i-- - buf[i] = udigits[u] - prec-- - // Add zeros in front of the number until requested precision is reached. - for prec > 0 { - i-- - buf[i] = '0' - prec-- - } - // Add a leading "U+". - i-- - buf[i] = '+' - i-- - buf[i] = 'U' - - oldZero := f.zero - f.zero = false - f.pad(buf[i:]) - f.zero = oldZero -} - -// fmt_integer formats signed and unsigned integers. -func (f *formatInfo) fmt_integer(u uint64, base int, isSigned bool, digits string) { - negative := isSigned && int64(u) < 0 - if negative { - u = -u - } - - buf := f.intbuf[0:] - // The already allocated f.intbuf with a capacity of 68 bytes - // is large enough for integer formatting when no precision or width is set. - if f.widPresent || f.precPresent { - // Account 3 extra bytes for possible addition of a sign and "0x". - width := 3 + f.wid + f.prec // wid and prec are always positive. - if width > len(buf) { - // We're going to need a bigger boat. - buf = make([]byte, width) - } - } - - // Two ways to ask for extra leading zero digits: %.3d or %03d. - // If both are specified the f.zero flag is ignored and - // padding with spaces is used instead. - prec := 0 - if f.precPresent { - prec = f.prec - // Precision of 0 and value of 0 means "print nothing" but padding. - if prec == 0 && u == 0 { - oldZero := f.zero - f.zero = false - f.writePadding(f.wid) - f.zero = oldZero - return - } - } else if f.zero && f.widPresent { - prec = f.wid - if negative || f.plus || f.space { - prec-- // leave room for sign - } - } - - // Because printing is easier right-to-left: format u into buf, ending at buf[i]. - // We could make things marginally faster by splitting the 32-bit case out - // into a separate block but it's not worth the duplication, so u has 64 bits. - i := len(buf) - // Use constants for the division and modulo for more efficient code. - // Switch cases ordered by popularity. - switch base { - case 10: - for u >= 10 { - i-- - next := u / 10 - buf[i] = byte('0' + u - next*10) - u = next - } - case 16: - for u >= 16 { - i-- - buf[i] = digits[u&0xF] - u >>= 4 - } - case 8: - for u >= 8 { - i-- - buf[i] = byte('0' + u&7) - u >>= 3 - } - case 2: - for u >= 2 { - i-- - buf[i] = byte('0' + u&1) - u >>= 1 - } - default: - panic("fmt: unknown base; can't happen") - } - i-- - buf[i] = digits[u] - for i > 0 && prec > len(buf)-i { - i-- - buf[i] = '0' - } - - // Various prefixes: 0x, -, etc. - if f.sharp { - switch base { - case 8: - if buf[i] != '0' { - i-- - buf[i] = '0' - } - case 16: - // Add a leading 0x or 0X. - i-- - buf[i] = digits[16] - i-- - buf[i] = '0' - } - } - - if negative { - i-- - buf[i] = '-' - } else if f.plus { - i-- - buf[i] = '+' - } else if f.space { - i-- - buf[i] = ' ' - } - - // Left padding with zeros has already been handled like precision earlier - // or the f.zero flag is ignored due to an explicitly set precision. - oldZero := f.zero - f.zero = false - f.pad(buf[i:]) - f.zero = oldZero -} - -// truncate truncates the string to the specified precision, if present. -func (f *formatInfo) truncate(s string) string { - if f.precPresent { - n := f.prec - for i := range s { - n-- - if n < 0 { - return s[:i] - } - } - } - return s -} - -// fmt_s formats a string. -func (f *formatInfo) fmt_s(s string) { - s = f.truncate(s) - f.padString(s) -} - -// fmt_sbx formats a string or byte slice as a hexadecimal encoding of its bytes. -func (f *formatInfo) fmt_sbx(s string, b []byte, digits string) { - length := len(b) - if b == nil { - // No byte slice present. Assume string s should be encoded. - length = len(s) - } - // Set length to not process more bytes than the precision demands. - if f.precPresent && f.prec < length { - length = f.prec - } - // Compute width of the encoding taking into account the f.sharp and f.space flag. - width := 2 * length - if width > 0 { - if f.space { - // Each element encoded by two hexadecimals will get a leading 0x or 0X. - if f.sharp { - width *= 2 - } - // Elements will be separated by a space. - width += length - 1 - } else if f.sharp { - // Only a leading 0x or 0X will be added for the whole string. - width += 2 - } - } else { // The byte slice or string that should be encoded is empty. - if f.widPresent { - f.writePadding(f.wid) - } - return - } - // Handle padding to the left. - if f.widPresent && f.wid > width && !f.minus { - f.writePadding(f.wid - width) - } - // Write the encoding directly into the output buffer. - buf := f.buf - if f.sharp { - // Add leading 0x or 0X. - buf.WriteByte('0') - buf.WriteByte(digits[16]) - } - var c byte - for i := 0; i < length; i++ { - if f.space && i > 0 { - // Separate elements with a space. - buf.WriteByte(' ') - if f.sharp { - // Add leading 0x or 0X for each element. - buf.WriteByte('0') - buf.WriteByte(digits[16]) - } - } - if b != nil { - c = b[i] // Take a byte from the input byte slice. - } else { - c = s[i] // Take a byte from the input string. - } - // Encode each byte as two hexadecimal digits. - buf.WriteByte(digits[c>>4]) - buf.WriteByte(digits[c&0xF]) - } - // Handle padding to the right. - if f.widPresent && f.wid > width && f.minus { - f.writePadding(f.wid - width) - } -} - -// fmt_sx formats a string as a hexadecimal encoding of its bytes. -func (f *formatInfo) fmt_sx(s, digits string) { - f.fmt_sbx(s, nil, digits) -} - -// fmt_bx formats a byte slice as a hexadecimal encoding of its bytes. -func (f *formatInfo) fmt_bx(b []byte, digits string) { - f.fmt_sbx("", b, digits) -} - -// fmt_q formats a string as a double-quoted, escaped Go string constant. -// If f.sharp is set a raw (backquoted) string may be returned instead -// if the string does not contain any control characters other than tab. -func (f *formatInfo) fmt_q(s string) { - s = f.truncate(s) - if f.sharp && strconv.CanBackquote(s) { - f.padString("`" + s + "`") - return - } - buf := f.intbuf[:0] - if f.plus { - f.pad(strconv.AppendQuoteToASCII(buf, s)) - } else { - f.pad(strconv.AppendQuote(buf, s)) - } -} - -// fmt_c formats an integer as a Unicode character. -// If the character is not valid Unicode, it will print '\ufffd'. -func (f *formatInfo) fmt_c(c uint64) { - r := rune(c) - if c > utf8.MaxRune { - r = utf8.RuneError - } - buf := f.intbuf[:0] - w := utf8.EncodeRune(buf[:utf8.UTFMax], r) - f.pad(buf[:w]) -} - -// fmt_qc formats an integer as a single-quoted, escaped Go character constant. -// If the character is not valid Unicode, it will print '\ufffd'. -func (f *formatInfo) fmt_qc(c uint64) { - r := rune(c) - if c > utf8.MaxRune { - r = utf8.RuneError - } - buf := f.intbuf[:0] - if f.plus { - f.pad(strconv.AppendQuoteRuneToASCII(buf, r)) - } else { - f.pad(strconv.AppendQuoteRune(buf, r)) - } -} - -// fmt_float formats a float64. It assumes that verb is a valid format specifier -// for strconv.AppendFloat and therefore fits into a byte. -func (f *formatInfo) fmt_float(v float64, size int, verb rune, prec int) { - // Explicit precision in format specifier overrules default precision. - if f.precPresent { - prec = f.prec - } - // Format number, reserving space for leading + sign if needed. - num := strconv.AppendFloat(f.intbuf[:1], v, byte(verb), prec, size) - if num[1] == '-' || num[1] == '+' { - num = num[1:] - } else { - num[0] = '+' - } - // f.space means to add a leading space instead of a "+" sign unless - // the sign is explicitly asked for by f.plus. - if f.space && num[0] == '+' && !f.plus { - num[0] = ' ' - } - // Special handling for infinities and NaN, - // which don't look like a number so shouldn't be padded with zeros. - if num[1] == 'I' || num[1] == 'N' { - oldZero := f.zero - f.zero = false - // Remove sign before NaN if not asked for. - if num[1] == 'N' && !f.space && !f.plus { - num = num[1:] - } - f.pad(num) - f.zero = oldZero - return - } - // The sharp flag forces printing a decimal point for non-binary formats - // and retains trailing zeros, which we may need to restore. - if f.sharp && verb != 'b' { - digits := 0 - switch verb { - case 'v', 'g', 'G': - digits = prec - // If no precision is set explicitly use a precision of 6. - if digits == -1 { - digits = 6 - } - } - - // Buffer pre-allocated with enough room for - // exponent notations of the form "e+123". - var tailBuf [5]byte - tail := tailBuf[:0] - - hasDecimalPoint := false - // Starting from i = 1 to skip sign at num[0]. - for i := 1; i < len(num); i++ { - switch num[i] { - case '.': - hasDecimalPoint = true - case 'e', 'E': - tail = append(tail, num[i:]...) - num = num[:i] - default: - digits-- - } - } - if !hasDecimalPoint { - num = append(num, '.') - } - for digits > 0 { - num = append(num, '0') - digits-- - } - num = append(num, tail...) - } - // We want a sign if asked for and if the sign is not positive. - if f.plus || num[0] != '+' { - // If we're zero padding to the left we want the sign before the leading zeros. - // Achieve this by writing the sign out and then padding the unsigned number. - if f.zero && f.widPresent && f.wid > len(num) { - f.buf.WriteByte(num[0]) - f.writePadding(f.wid - len(num)) - f.buf.Write(num[1:]) - return - } - f.pad(num) - return - } - // No sign to show and the number is positive; just print the unsigned number. - f.pad(num[1:]) -} diff --git a/vendor/golang.org/x/text/message/message.go b/vendor/golang.org/x/text/message/message.go deleted file mode 100644 index ba4f95ab0..000000000 --- a/vendor/golang.org/x/text/message/message.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package message // import "golang.org/x/text/message" - -import ( - "io" - "os" - - "golang.org/x/text/language" - "golang.org/x/text/message/catalog" -) - -// TODO: allow more than one goroutine per printer. This will allow porting from -// fmt much less error prone. - -// A Printer implements language-specific formatted I/O analogous to the fmt -// package. Only one goroutine may use a Printer at the same time. -type Printer struct { - // Wrap the fields in a hidden type to hide some of the implemented methods. - printer printer - - // NOTE: limiting one goroutine per Printer allows for many optimizations - // and simplifications. We can consider removing this restriction down the - // road if it the benefits do not seem to outweigh the disadvantages. -} - -type options struct { - cat *catalog.Catalog - // TODO: - // - allow %s to print integers in written form (tables are likely too large - // to enable this by default). - // - list behavior - // -} - -// An Option defines an option of a Printer. -type Option func(o *options) - -// Catalog defines the catalog to be used. -func Catalog(c *catalog.Catalog) Option { - return func(o *options) { o.cat = c } -} - -// NewPrinter returns a Printer that formats messages tailored to language t. -func NewPrinter(t language.Tag, opts ...Option) *Printer { - options := &options{ - cat: defaultCatalog, - } - for _, o := range opts { - o(options) - } - p := &Printer{printer{ - tag: t, - }} - p.printer.toDecimal.InitDecimal(t) - p.printer.toScientific.InitScientific(t) - p.printer.catContext = options.cat.Context(t, &p.printer) - return p -} - -// Sprint is like fmt.Sprint, but using language-specific formatting. -func (p *Printer) Sprint(a ...interface{}) string { - p.printer.reset() - p.printer.doPrint(a) - return p.printer.String() -} - -// Fprint is like fmt.Fprint, but using language-specific formatting. -func (p *Printer) Fprint(w io.Writer, a ...interface{}) (n int, err error) { - p.printer.reset() - p.printer.doPrint(a) - n64, err := io.Copy(w, &p.printer.Buffer) - return int(n64), err -} - -// Print is like fmt.Print, but using language-specific formatting. -func (p *Printer) Print(a ...interface{}) (n int, err error) { - return p.Fprint(os.Stdout, a...) -} - -// Sprintln is like fmt.Sprintln, but using language-specific formatting. -func (p *Printer) Sprintln(a ...interface{}) string { - p.printer.reset() - p.printer.doPrintln(a) - return p.printer.String() -} - -// Fprintln is like fmt.Fprintln, but using language-specific formatting. -func (p *Printer) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { - p.printer.reset() - p.printer.doPrintln(a) - n64, err := io.Copy(w, &p.printer.Buffer) - return int(n64), err -} - -// Println is like fmt.Println, but using language-specific formatting. -func (p *Printer) Println(a ...interface{}) (n int, err error) { - return p.Fprintln(os.Stdout, a...) -} - -// Sprintf is like fmt.Sprintf, but using language-specific formatting. -func (p *Printer) Sprintf(key Reference, a ...interface{}) string { - lookupAndFormat(p, key, a) - return p.printer.String() -} - -// Fprintf is like fmt.Fprintf, but using language-specific formatting. -func (p *Printer) Fprintf(w io.Writer, key Reference, a ...interface{}) (n int, err error) { - lookupAndFormat(p, key, a) - return w.Write(p.printer.Bytes()) -} - -// Printf is like fmt.Printf, but using language-specific formatting. -func (p *Printer) Printf(key Reference, a ...interface{}) (n int, err error) { - lookupAndFormat(p, key, a) - return os.Stdout.Write(p.printer.Bytes()) -} - -func lookupAndFormat(p *Printer, r Reference, a []interface{}) { - p.printer.reset() - p.printer.args = a - var id, msg string - switch v := r.(type) { - case string: - id, msg = v, v - case key: - id, msg = v.id, v.fallback - default: - panic("key argument is not a Reference") - } - - if p.printer.catContext.Execute(id) == catalog.ErrNotFound { - if p.printer.catContext.Execute(msg) == catalog.ErrNotFound { - p.printer.Render(msg) - return - } - } -} - -// Arg implements catmsg.Renderer. -func (p *printer) Arg(i int) interface{} { // TODO, also return "ok" bool - i-- - if uint(i) < uint(len(p.args)) { - return p.args[i] - } - return nil -} - -// Render implements catmsg.Renderer. -func (p *printer) Render(msg string) { - p.doPrintf(msg) -} - -// A Reference is a string or a message reference. -type Reference interface { - // TODO: also allow []string -} - -// Key creates a message Reference for a message where the given id is used for -// message lookup and the fallback is returned when no matches are found. -func Key(id string, fallback string) Reference { - return key{id, fallback} -} - -type key struct { - id, fallback string -} diff --git a/vendor/golang.org/x/text/message/message_test.go b/vendor/golang.org/x/text/message/message_test.go deleted file mode 100644 index 091ed3bcb..000000000 --- a/vendor/golang.org/x/text/message/message_test.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package message - -import ( - "bytes" - "fmt" - "io" - "testing" - - "golang.org/x/text/internal" - "golang.org/x/text/internal/format" - "golang.org/x/text/language" - "golang.org/x/text/message/catalog" -) - -type formatFunc func(s fmt.State, v rune) - -func (f formatFunc) Format(s fmt.State, v rune) { f(s, v) } - -func TestBinding(t *testing.T) { - testCases := []struct { - tag string - value interface{} - want string - }{ - {"en", 1, "1"}, - {"en", "2", "2"}, - { // Language is passed. - "en", - formatFunc(func(fs fmt.State, v rune) { - s := fs.(format.State) - io.WriteString(s, s.Language().String()) - }), - "en", - }, - } - for i, tc := range testCases { - p := NewPrinter(language.MustParse(tc.tag)) - if got := p.Sprint(tc.value); got != tc.want { - t.Errorf("%d:%s:Sprint(%v) = %q; want %q", i, tc.tag, tc.value, got, tc.want) - } - var buf bytes.Buffer - p.Fprint(&buf, tc.value) - if got := buf.String(); got != tc.want { - t.Errorf("%d:%s:Fprint(%v) = %q; want %q", i, tc.tag, tc.value, got, tc.want) - } - } -} - -func TestLocalization(t *testing.T) { - type test struct { - tag string - key Reference - args []interface{} - want string - } - args := func(x ...interface{}) []interface{} { return x } - empty := []interface{}{} - joe := []interface{}{"Joe"} - joeAndMary := []interface{}{"Joe", "Mary"} - - testCases := []struct { - desc string - cat []entry - test []test - }{{ - desc: "empty", - test: []test{ - {"en", "key", empty, "key"}, - {"en", "", empty, ""}, - {"nl", "", empty, ""}, - }, - }, { - desc: "hierarchical languages", - cat: []entry{ - {"en", "hello %s", "Hello %s!"}, - {"en-GB", "hello %s", "Hellø %s!"}, - {"en-US", "hello %s", "Howdy %s!"}, - {"en", "greetings %s and %s", "Greetings %s and %s!"}, - }, - test: []test{ - {"und", "hello %s", joe, "hello Joe"}, - {"nl", "hello %s", joe, "hello Joe"}, - {"en", "hello %s", joe, "Hello Joe!"}, - {"en-US", "hello %s", joe, "Howdy Joe!"}, - {"en-GB", "hello %s", joe, "Hellø Joe!"}, - {"en-oxendict", "hello %s", joe, "Hello Joe!"}, - {"en-US-oxendict-u-ms-metric", "hello %s", joe, "Howdy Joe!"}, - - {"und", "greetings %s and %s", joeAndMary, "greetings Joe and Mary"}, - {"nl", "greetings %s and %s", joeAndMary, "greetings Joe and Mary"}, - {"en", "greetings %s and %s", joeAndMary, "Greetings Joe and Mary!"}, - {"en-US", "greetings %s and %s", joeAndMary, "Greetings Joe and Mary!"}, - {"en-GB", "greetings %s and %s", joeAndMary, "Greetings Joe and Mary!"}, - {"en-oxendict", "greetings %s and %s", joeAndMary, "Greetings Joe and Mary!"}, - {"en-US-oxendict-u-ms-metric", "greetings %s and %s", joeAndMary, "Greetings Joe and Mary!"}, - }, - }, { - desc: "references", - cat: []entry{ - {"en", "hello", "Hello!"}, - }, - test: []test{ - {"en", "hello", empty, "Hello!"}, - {"en", Key("hello", "fallback"), empty, "Hello!"}, - {"en", Key("xxx", "fallback"), empty, "fallback"}, - {"und", Key("hello", "fallback"), empty, "fallback"}, - }, - }, { - desc: "zero substitution", // work around limitation of fmt - cat: []entry{ - {"en", "hello %s", "Hello!"}, - {"en", "hi %s and %s", "Hello %[2]s!"}, - }, - test: []test{ - {"en", "hello %s", joe, "Hello!"}, - {"en", "hello %s", joeAndMary, "Hello!"}, - {"en", "hi %s and %s", joeAndMary, "Hello Mary!"}, - // The following tests resolve to the fallback string. - {"und", "hello", joeAndMary, "hello"}, - {"und", "hello %%%%", joeAndMary, "hello %%"}, - {"und", "hello %#%%4.2% ", joeAndMary, "hello %% "}, - {"und", "hello %s", joeAndMary, "hello Joe%!(EXTRA string=Mary)"}, - {"und", "hello %+%%s", joeAndMary, "hello %Joe%!(EXTRA string=Mary)"}, - {"und", "hello %-42%%s ", joeAndMary, "hello %Joe %!(EXTRA string=Mary)"}, - }, - }, { - desc: "number formatting", // work around limitation of fmt - cat: []entry{ - {"und", "files", "%d files left"}, - {"und", "meters", "%.2f meters"}, - {"de", "files", "%d Dateien übrig"}, - }, - test: []test{ - {"en", "meters", args(3000.2), "3,000.20 meters"}, - {"en-u-nu-gujr", "files", args(123456), "૧૨૩,૪૫૬ files left"}, - {"de", "files", args(1234), "1.234 Dateien übrig"}, - {"de-CH", "files", args(1234), "1’234 Dateien übrig"}, - {"de-CH-u-nu-mong", "files", args(1234), "᠑’᠒᠓᠔ Dateien übrig"}, - }, - }} - - for _, tc := range testCases { - cat, _ := initCat(tc.cat) - - for i, pt := range tc.test { - t.Run(fmt.Sprintf("%s:%d", tc.desc, i), func(t *testing.T) { - p := NewPrinter(language.MustParse(pt.tag), Catalog(cat)) - - if got := p.Sprintf(pt.key, pt.args...); got != pt.want { - t.Errorf("Sprintf(%q, %v) = %s; want %s", - pt.key, pt.args, got, pt.want) - return // Next error will likely be the same. - } - - w := &bytes.Buffer{} - p.Fprintf(w, pt.key, pt.args...) - if got := w.String(); got != pt.want { - t.Errorf("Fprintf(%q, %v) = %s; want %s", - pt.key, pt.args, got, pt.want) - } - }) - } - } -} - -type entry struct{ tag, key, msg string } - -func initCat(entries []entry) (*catalog.Catalog, []language.Tag) { - tags := []language.Tag{} - cat := catalog.New() - for _, e := range entries { - tag := language.MustParse(e.tag) - tags = append(tags, tag) - cat.SetString(tag, e.key, e.msg) - } - return cat, internal.UniqueTags(tags) -} diff --git a/vendor/golang.org/x/text/message/print.go b/vendor/golang.org/x/text/message/print.go deleted file mode 100644 index 5819cba2e..000000000 --- a/vendor/golang.org/x/text/message/print.go +++ /dev/null @@ -1,1194 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package message - -import ( - "bytes" - "fmt" // TODO: consider copying interfaces from package fmt to avoid dependency. - "math" - "reflect" - "unicode/utf8" - - "golang.org/x/text/internal/format" - "golang.org/x/text/internal/number" - "golang.org/x/text/language" - "golang.org/x/text/message/catalog" -) - -// Strings for use with buffer.WriteString. -// This is less overhead than using buffer.Write with byte arrays. -const ( - commaSpaceString = ", " - nilAngleString = "<nil>" - nilParenString = "(nil)" - nilString = "nil" - mapString = "map[" - percentBangString = "%!" - missingString = "(MISSING)" - badIndexString = "(BADINDEX)" - panicString = "(PANIC=" - extraString = "%!(EXTRA " - badWidthString = "%!(BADWIDTH)" - badPrecString = "%!(BADPREC)" - noVerbString = "%!(NOVERB)" - - invReflectString = "<invalid reflect.Value>" -) - -// printer is used to store a printer's state. -// It implements "golang.org/x/text/internal/format".State. -type printer struct { - // the context for looking up message translations - catContext *catalog.Context - // the language - tag language.Tag - - // buffer for accumulating output. - bytes.Buffer - - // retain arguments across calls. - args []interface{} - // retain current argument number across calls - argNum int - // arg holds the current item, as an interface{}. - arg interface{} - // value is used instead of arg for reflect values. - value reflect.Value - - // fmt is used to format basic items such as integers or strings. - fmt formatInfo - - // reordered records whether the format string used argument reordering. - reordered bool - // goodArgNum records whether the most recent reordering directive was valid. - goodArgNum bool - // panicking is set by catchPanic to avoid infinite panic, recover, panic, ... recursion. - panicking bool - // erroring is set when printing an error string to guard against calling handleMethods. - erroring bool - - toDecimal number.Formatter - toScientific number.Formatter -} - -func (p *printer) reset() { - p.Buffer.Reset() - p.argNum = 0 - p.reordered = false - p.panicking = false - p.erroring = false - p.fmt.init(&p.Buffer) -} - -// Language implements "golang.org/x/text/internal/format".State. -func (p *printer) Language() language.Tag { return p.tag } - -func (p *printer) Width() (wid int, ok bool) { return p.fmt.wid, p.fmt.widPresent } - -func (p *printer) Precision() (prec int, ok bool) { return p.fmt.prec, p.fmt.precPresent } - -func (p *printer) Flag(b int) bool { - switch b { - case '-': - return p.fmt.minus - case '+': - return p.fmt.plus || p.fmt.plusV - case '#': - return p.fmt.sharp || p.fmt.sharpV - case ' ': - return p.fmt.space - case '0': - return p.fmt.zero - } - return false -} - -// getField gets the i'th field of the struct value. -// If the field is itself is an interface, return a value for -// the thing inside the interface, not the interface itself. -func getField(v reflect.Value, i int) reflect.Value { - val := v.Field(i) - if val.Kind() == reflect.Interface && !val.IsNil() { - val = val.Elem() - } - return val -} - -// tooLarge reports whether the magnitude of the integer is -// too large to be used as a formatting width or precision. -func tooLarge(x int) bool { - const max int = 1e6 - return x > max || x < -max -} - -// parsenum converts ASCII to integer. num is 0 (and isnum is false) if no number present. -func parsenum(s string, start, end int) (num int, isnum bool, newi int) { - if start >= end { - return 0, false, end - } - for newi = start; newi < end && '0' <= s[newi] && s[newi] <= '9'; newi++ { - if tooLarge(num) { - return 0, false, end // Overflow; crazy long number most likely. - } - num = num*10 + int(s[newi]-'0') - isnum = true - } - return -} - -func (p *printer) unknownType(v reflect.Value) { - if !v.IsValid() { - p.WriteString(nilAngleString) - return - } - p.WriteByte('?') - p.WriteString(v.Type().String()) - p.WriteByte('?') -} - -func (p *printer) badVerb(verb rune) { - p.erroring = true - p.WriteString(percentBangString) - p.WriteRune(verb) - p.WriteByte('(') - switch { - case p.arg != nil: - p.WriteString(reflect.TypeOf(p.arg).String()) - p.WriteByte('=') - p.printArg(p.arg, 'v') - case p.value.IsValid(): - p.WriteString(p.value.Type().String()) - p.WriteByte('=') - p.printValue(p.value, 'v', 0) - default: - p.WriteString(nilAngleString) - } - p.WriteByte(')') - p.erroring = false -} - -func (p *printer) fmtBool(v bool, verb rune) { - switch verb { - case 't', 'v': - p.fmt.fmt_boolean(v) - default: - p.badVerb(verb) - } -} - -// fmt0x64 formats a uint64 in hexadecimal and prefixes it with 0x or -// not, as requested, by temporarily setting the sharp flag. -func (p *printer) fmt0x64(v uint64, leading0x bool) { - sharp := p.fmt.sharp - p.fmt.sharp = leading0x - p.fmt.fmt_integer(v, 16, unsigned, ldigits) - p.fmt.sharp = sharp -} - -// fmtInteger formats a signed or unsigned integer. -func (p *printer) fmtInteger(v uint64, isSigned bool, verb rune) { - switch verb { - case 'v': - if p.fmt.sharpV && !isSigned { - p.fmt0x64(v, true) - return - } - fallthrough - case 'd': - if p.fmt.sharp || p.fmt.sharpV { - p.fmt.fmt_integer(v, 10, isSigned, ldigits) - } else { - p.fmtDecimalInt(v, isSigned) - } - case 'b': - p.fmt.fmt_integer(v, 2, isSigned, ldigits) - case 'o': - p.fmt.fmt_integer(v, 8, isSigned, ldigits) - case 'x': - p.fmt.fmt_integer(v, 16, isSigned, ldigits) - case 'X': - p.fmt.fmt_integer(v, 16, isSigned, udigits) - case 'c': - p.fmt.fmt_c(v) - case 'q': - if v <= utf8.MaxRune { - p.fmt.fmt_qc(v) - } else { - p.badVerb(verb) - } - case 'U': - p.fmt.fmt_unicode(v) - default: - p.badVerb(verb) - } -} - -// fmtFloat formats a float. The default precision for each verb -// is specified as last argument in the call to fmt_float. -func (p *printer) fmtFloat(v float64, size int, verb rune) { - switch verb { - case 'b': - p.fmt.fmt_float(v, size, verb, -1) - case 'v': - verb = 'g' - fallthrough - case 'g', 'G': - if p.fmt.sharp || p.fmt.sharpV { - p.fmt.fmt_float(v, size, verb, -1) - } else { - p.fmtVariableFloat(v, size) - } - case 'e', 'E': - if p.fmt.sharp || p.fmt.sharpV { - p.fmt.fmt_float(v, size, verb, 6) - } else { - p.fmtScientific(v, size, 6) - } - case 'f', 'F': - if p.fmt.sharp || p.fmt.sharpV { - p.fmt.fmt_float(v, size, verb, 6) - } else { - p.fmtDecimalFloat(v, size, 6) - } - default: - p.badVerb(verb) - } -} - -func (p *printer) setFlags(f *number.Formatter) { - f.Flags &^= number.ElideSign - if p.fmt.plus || p.fmt.space { - f.Flags |= number.AlwaysSign - if !p.fmt.plus { - f.Flags |= number.ElideSign - } - } else { - f.Flags &^= number.AlwaysSign - } -} - -func (p *printer) updatePadding(f *number.Formatter) { - f.Flags &^= number.PadMask - if p.fmt.minus { - f.Flags |= number.PadAfterSuffix - } else { - f.Flags |= number.PadBeforePrefix - } - f.PadRune = ' ' - f.FormatWidth = uint16(p.fmt.wid) -} - -func (p *printer) initDecimal(minFrac, maxFrac int) { - f := &p.toDecimal - f.MinIntegerDigits = 1 - f.MaxIntegerDigits = 0 - f.MinFractionDigits = uint8(minFrac) - f.MaxFractionDigits = int16(maxFrac) - p.setFlags(f) - f.PadRune = 0 - if p.fmt.widPresent { - if p.fmt.zero { - wid := p.fmt.wid - // Use significant integers for this. - // TODO: this is not the same as width, but so be it. - if f.MinFractionDigits > 0 { - wid -= 1 + int(f.MinFractionDigits) - } - if p.fmt.plus || p.fmt.space { - wid-- - } - if wid > 0 && wid > int(f.MinIntegerDigits) { - f.MinIntegerDigits = uint8(wid) - } - } - p.updatePadding(f) - } -} - -func (p *printer) initScientific(minFrac, maxFrac int) { - f := &p.toScientific - if maxFrac < 0 { - f.SetPrecision(maxFrac) - } else { - f.SetPrecision(maxFrac + 1) - f.MinFractionDigits = uint8(minFrac) - f.MaxFractionDigits = int16(maxFrac) - } - f.MinExponentDigits = 2 - p.setFlags(f) - f.PadRune = 0 - if p.fmt.widPresent { - f.Flags &^= number.PadMask - if p.fmt.zero { - f.PadRune = f.Digit(0) - f.Flags |= number.PadAfterPrefix - } else { - f.PadRune = ' ' - f.Flags |= number.PadBeforePrefix - } - p.updatePadding(f) - } -} - -func (p *printer) fmtDecimalInt(v uint64, isSigned bool) { - var d number.Decimal - - f := &p.toDecimal - if p.fmt.precPresent { - p.setFlags(f) - f.MinIntegerDigits = uint8(p.fmt.prec) - f.MaxIntegerDigits = 0 - f.MinFractionDigits = 0 - f.MaxFractionDigits = 0 - if p.fmt.widPresent { - p.updatePadding(f) - } - } else { - p.initDecimal(0, 0) - } - d.ConvertInt(p.toDecimal.RoundingContext, isSigned, v) - - out := p.toDecimal.Format([]byte(nil), &d) - p.Buffer.Write(out) -} - -func (p *printer) fmtDecimalFloat(v float64, size, prec int) { - var d number.Decimal - if p.fmt.precPresent { - prec = p.fmt.prec - } - p.initDecimal(prec, prec) - d.ConvertFloat(p.toDecimal.RoundingContext, v, size) - - out := p.toDecimal.Format([]byte(nil), &d) - p.Buffer.Write(out) -} - -func (p *printer) fmtVariableFloat(v float64, size int) { - prec := -1 - if p.fmt.precPresent { - prec = p.fmt.prec - } - var d number.Decimal - p.initScientific(0, prec) - d.ConvertFloat(p.toScientific.RoundingContext, v, size) - - // Copy logic of 'g' formatting from strconv. It is simplified a bit as - // we don't have to mind having prec > len(d.Digits). - shortest := prec < 0 - ePrec := prec - if shortest { - prec = len(d.Digits) - ePrec = 6 - } else if prec == 0 { - prec = 1 - ePrec = 1 - } - exp := int(d.Exp) - 1 - if exp < -4 || exp >= ePrec { - p.initScientific(0, prec) - - out := p.toScientific.Format([]byte(nil), &d) - p.Buffer.Write(out) - } else { - if prec > int(d.Exp) { - prec = len(d.Digits) - } - if prec -= int(d.Exp); prec < 0 { - prec = 0 - } - p.initDecimal(0, prec) - - out := p.toDecimal.Format([]byte(nil), &d) - p.Buffer.Write(out) - } -} - -func (p *printer) fmtScientific(v float64, size, prec int) { - var d number.Decimal - if p.fmt.precPresent { - prec = p.fmt.prec - } - p.initScientific(prec, prec) - rc := p.toScientific.RoundingContext - d.ConvertFloat(rc, v, size) - - out := p.toScientific.Format([]byte(nil), &d) - p.Buffer.Write(out) - -} - -// fmtComplex formats a complex number v with -// r = real(v) and j = imag(v) as (r+ji) using -// fmtFloat for r and j formatting. -func (p *printer) fmtComplex(v complex128, size int, verb rune) { - // Make sure any unsupported verbs are found before the - // calls to fmtFloat to not generate an incorrect error string. - switch verb { - case 'v', 'b', 'g', 'G', 'f', 'F', 'e', 'E': - p.WriteByte('(') - p.fmtFloat(real(v), size/2, verb) - // Imaginary part always has a sign. - if math.IsNaN(imag(v)) { - // By CLDR's rules, NaNs do not use patterns or signs. As this code - // relies on AlwaysSign working for imaginary parts, we need to - // manually handle NaNs. - f := &p.toScientific - p.setFlags(f) - p.updatePadding(f) - p.setFlags(f) - nan := f.Symbol(number.SymNan) - extra := 0 - if w, ok := p.Width(); ok { - extra = w - utf8.RuneCountInString(nan) - 1 - } - if f.Flags&number.PadAfterNumber == 0 { - for ; extra > 0; extra-- { - p.WriteRune(f.PadRune) - } - } - p.WriteString(f.Symbol(number.SymPlusSign)) - p.WriteString(nan) - for ; extra > 0; extra-- { - p.WriteRune(f.PadRune) - } - p.WriteString("i)") - return - } - oldPlus := p.fmt.plus - p.fmt.plus = true - p.fmtFloat(imag(v), size/2, verb) - p.WriteString("i)") // TODO: use symbol? - p.fmt.plus = oldPlus - default: - p.badVerb(verb) - } -} - -func (p *printer) fmtString(v string, verb rune) { - switch verb { - case 'v': - if p.fmt.sharpV { - p.fmt.fmt_q(v) - } else { - p.fmt.fmt_s(v) - } - case 's': - p.fmt.fmt_s(v) - case 'x': - p.fmt.fmt_sx(v, ldigits) - case 'X': - p.fmt.fmt_sx(v, udigits) - case 'q': - p.fmt.fmt_q(v) - default: - p.badVerb(verb) - } -} - -func (p *printer) fmtBytes(v []byte, verb rune, typeString string) { - switch verb { - case 'v', 'd': - if p.fmt.sharpV { - p.WriteString(typeString) - if v == nil { - p.WriteString(nilParenString) - return - } - p.WriteByte('{') - for i, c := range v { - if i > 0 { - p.WriteString(commaSpaceString) - } - p.fmt0x64(uint64(c), true) - } - p.WriteByte('}') - } else { - p.WriteByte('[') - for i, c := range v { - if i > 0 { - p.WriteByte(' ') - } - p.fmt.fmt_integer(uint64(c), 10, unsigned, ldigits) - } - p.WriteByte(']') - } - case 's': - p.fmt.fmt_s(string(v)) - case 'x': - p.fmt.fmt_bx(v, ldigits) - case 'X': - p.fmt.fmt_bx(v, udigits) - case 'q': - p.fmt.fmt_q(string(v)) - default: - p.printValue(reflect.ValueOf(v), verb, 0) - } -} - -func (p *printer) fmtPointer(value reflect.Value, verb rune) { - var u uintptr - switch value.Kind() { - case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer: - u = value.Pointer() - default: - p.badVerb(verb) - return - } - - switch verb { - case 'v': - if p.fmt.sharpV { - p.WriteByte('(') - p.WriteString(value.Type().String()) - p.WriteString(")(") - if u == 0 { - p.WriteString(nilString) - } else { - p.fmt0x64(uint64(u), true) - } - p.WriteByte(')') - } else { - if u == 0 { - p.fmt.padString(nilAngleString) - } else { - p.fmt0x64(uint64(u), !p.fmt.sharp) - } - } - case 'p': - p.fmt0x64(uint64(u), !p.fmt.sharp) - case 'b', 'o', 'd', 'x', 'X': - if verb == 'd' { - p.fmt.sharp = true // Print as standard go. TODO: does this make sense? - } - p.fmtInteger(uint64(u), unsigned, verb) - default: - p.badVerb(verb) - } -} - -func (p *printer) catchPanic(arg interface{}, verb rune) { - if err := recover(); err != nil { - // If it's a nil pointer, just say "<nil>". The likeliest causes are a - // Stringer that fails to guard against nil or a nil pointer for a - // value receiver, and in either case, "<nil>" is a nice result. - if v := reflect.ValueOf(arg); v.Kind() == reflect.Ptr && v.IsNil() { - p.WriteString(nilAngleString) - return - } - // Otherwise print a concise panic message. Most of the time the panic - // value will print itself nicely. - if p.panicking { - // Nested panics; the recursion in printArg cannot succeed. - panic(err) - } - - oldFlags := p.fmt.fmtFlags - // For this output we want default behavior. - p.fmt.clearflags() - - p.WriteString(percentBangString) - p.WriteRune(verb) - p.WriteString(panicString) - p.panicking = true - p.printArg(err, 'v') - p.panicking = false - p.WriteByte(')') - - p.fmt.fmtFlags = oldFlags - } -} - -func (p *printer) handleMethods(verb rune) (handled bool) { - if p.erroring { - return - } - // Is it a Formatter? - if formatter, ok := p.arg.(format.Formatter); ok { - handled = true - defer p.catchPanic(p.arg, verb) - formatter.Format(p, verb) - return - } - if formatter, ok := p.arg.(fmt.Formatter); ok { - handled = true - defer p.catchPanic(p.arg, verb) - formatter.Format(p, verb) - return - } - - // If we're doing Go syntax and the argument knows how to supply it, take care of it now. - if p.fmt.sharpV { - if stringer, ok := p.arg.(fmt.GoStringer); ok { - handled = true - defer p.catchPanic(p.arg, verb) - // Print the result of GoString unadorned. - p.fmt.fmt_s(stringer.GoString()) - return - } - } else { - // If a string is acceptable according to the format, see if - // the value satisfies one of the string-valued interfaces. - // Println etc. set verb to %v, which is "stringable". - switch verb { - case 'v', 's', 'x', 'X', 'q': - // Is it an error or Stringer? - // The duplication in the bodies is necessary: - // setting handled and deferring catchPanic - // must happen before calling the method. - switch v := p.arg.(type) { - case error: - handled = true - defer p.catchPanic(p.arg, verb) - p.fmtString(v.Error(), verb) - return - - case fmt.Stringer: - handled = true - defer p.catchPanic(p.arg, verb) - p.fmtString(v.String(), verb) - return - } - } - } - return false -} - -func (p *printer) printArg(arg interface{}, verb rune) { - p.arg = arg - p.value = reflect.Value{} - - if arg == nil { - switch verb { - case 'T', 'v': - p.fmt.padString(nilAngleString) - default: - p.badVerb(verb) - } - return - } - - // Special processing considerations. - // %T (the value's type) and %p (its address) are special; we always do them first. - switch verb { - case 'T': - p.fmt.fmt_s(reflect.TypeOf(arg).String()) - return - case 'p': - p.fmtPointer(reflect.ValueOf(arg), 'p') - return - } - - // Some types can be done without reflection. - switch f := arg.(type) { - case bool: - p.fmtBool(f, verb) - case float32: - p.fmtFloat(float64(f), 32, verb) - case float64: - p.fmtFloat(f, 64, verb) - case complex64: - p.fmtComplex(complex128(f), 64, verb) - case complex128: - p.fmtComplex(f, 128, verb) - case int: - p.fmtInteger(uint64(f), signed, verb) - case int8: - p.fmtInteger(uint64(f), signed, verb) - case int16: - p.fmtInteger(uint64(f), signed, verb) - case int32: - p.fmtInteger(uint64(f), signed, verb) - case int64: - p.fmtInteger(uint64(f), signed, verb) - case uint: - p.fmtInteger(uint64(f), unsigned, verb) - case uint8: - p.fmtInteger(uint64(f), unsigned, verb) - case uint16: - p.fmtInteger(uint64(f), unsigned, verb) - case uint32: - p.fmtInteger(uint64(f), unsigned, verb) - case uint64: - p.fmtInteger(f, unsigned, verb) - case uintptr: - p.fmtInteger(uint64(f), unsigned, verb) - case string: - p.fmtString(f, verb) - case []byte: - p.fmtBytes(f, verb, "[]byte") - case reflect.Value: - // Handle extractable values with special methods - // since printValue does not handle them at depth 0. - if f.IsValid() && f.CanInterface() { - p.arg = f.Interface() - if p.handleMethods(verb) { - return - } - } - p.printValue(f, verb, 0) - default: - // If the type is not simple, it might have methods. - if !p.handleMethods(verb) { - // Need to use reflection, since the type had no - // interface methods that could be used for formatting. - p.printValue(reflect.ValueOf(f), verb, 0) - } - } -} - -// printValue is similar to printArg but starts with a reflect value, not an interface{} value. -// It does not handle 'p' and 'T' verbs because these should have been already handled by printArg. -func (p *printer) printValue(value reflect.Value, verb rune, depth int) { - // Handle values with special methods if not already handled by printArg (depth == 0). - if depth > 0 && value.IsValid() && value.CanInterface() { - p.arg = value.Interface() - if p.handleMethods(verb) { - return - } - } - p.arg = nil - p.value = value - - switch f := value; value.Kind() { - case reflect.Invalid: - if depth == 0 { - p.WriteString(invReflectString) - } else { - switch verb { - case 'v': - p.WriteString(nilAngleString) - default: - p.badVerb(verb) - } - } - case reflect.Bool: - p.fmtBool(f.Bool(), verb) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p.fmtInteger(uint64(f.Int()), signed, verb) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p.fmtInteger(f.Uint(), unsigned, verb) - case reflect.Float32: - p.fmtFloat(f.Float(), 32, verb) - case reflect.Float64: - p.fmtFloat(f.Float(), 64, verb) - case reflect.Complex64: - p.fmtComplex(f.Complex(), 64, verb) - case reflect.Complex128: - p.fmtComplex(f.Complex(), 128, verb) - case reflect.String: - p.fmtString(f.String(), verb) - case reflect.Map: - if p.fmt.sharpV { - p.WriteString(f.Type().String()) - if f.IsNil() { - p.WriteString(nilParenString) - return - } - p.WriteByte('{') - } else { - p.WriteString(mapString) - } - keys := f.MapKeys() - for i, key := range keys { - if i > 0 { - if p.fmt.sharpV { - p.WriteString(commaSpaceString) - } else { - p.WriteByte(' ') - } - } - p.printValue(key, verb, depth+1) - p.WriteByte(':') - p.printValue(f.MapIndex(key), verb, depth+1) - } - if p.fmt.sharpV { - p.WriteByte('}') - } else { - p.WriteByte(']') - } - case reflect.Struct: - if p.fmt.sharpV { - p.WriteString(f.Type().String()) - } - p.WriteByte('{') - for i := 0; i < f.NumField(); i++ { - if i > 0 { - if p.fmt.sharpV { - p.WriteString(commaSpaceString) - } else { - p.WriteByte(' ') - } - } - if p.fmt.plusV || p.fmt.sharpV { - if name := f.Type().Field(i).Name; name != "" { - p.WriteString(name) - p.WriteByte(':') - } - } - p.printValue(getField(f, i), verb, depth+1) - } - p.WriteByte('}') - case reflect.Interface: - value := f.Elem() - if !value.IsValid() { - if p.fmt.sharpV { - p.WriteString(f.Type().String()) - p.WriteString(nilParenString) - } else { - p.WriteString(nilAngleString) - } - } else { - p.printValue(value, verb, depth+1) - } - case reflect.Array, reflect.Slice: - switch verb { - case 's', 'q', 'x', 'X': - // Handle byte and uint8 slices and arrays special for the above verbs. - t := f.Type() - if t.Elem().Kind() == reflect.Uint8 { - var bytes []byte - if f.Kind() == reflect.Slice { - bytes = f.Bytes() - } else if f.CanAddr() { - bytes = f.Slice(0, f.Len()).Bytes() - } else { - // We have an array, but we cannot Slice() a non-addressable array, - // so we build a slice by hand. This is a rare case but it would be nice - // if reflection could help a little more. - bytes = make([]byte, f.Len()) - for i := range bytes { - bytes[i] = byte(f.Index(i).Uint()) - } - } - p.fmtBytes(bytes, verb, t.String()) - return - } - } - if p.fmt.sharpV { - p.WriteString(f.Type().String()) - if f.Kind() == reflect.Slice && f.IsNil() { - p.WriteString(nilParenString) - return - } - p.WriteByte('{') - for i := 0; i < f.Len(); i++ { - if i > 0 { - p.WriteString(commaSpaceString) - } - p.printValue(f.Index(i), verb, depth+1) - } - p.WriteByte('}') - } else { - p.WriteByte('[') - for i := 0; i < f.Len(); i++ { - if i > 0 { - p.WriteByte(' ') - } - p.printValue(f.Index(i), verb, depth+1) - } - p.WriteByte(']') - } - case reflect.Ptr: - // pointer to array or slice or struct? ok at top level - // but not embedded (avoid loops) - if depth == 0 && f.Pointer() != 0 { - switch a := f.Elem(); a.Kind() { - case reflect.Array, reflect.Slice, reflect.Struct, reflect.Map: - p.WriteByte('&') - p.printValue(a, verb, depth+1) - return - } - } - fallthrough - case reflect.Chan, reflect.Func, reflect.UnsafePointer: - p.fmtPointer(f, verb) - default: - p.unknownType(f) - } -} - -// intFromArg gets the argNumth element of a. On return, isInt reports whether the argument has integer type. -func (p *printer) intFromArg() (num int, isInt bool) { - if p.argNum < len(p.args) { - arg := p.args[p.argNum] - num, isInt = arg.(int) // Almost always OK. - if !isInt { - // Work harder. - switch v := reflect.ValueOf(arg); v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - n := v.Int() - if int64(int(n)) == n { - num = int(n) - isInt = true - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - n := v.Uint() - if int64(n) >= 0 && uint64(int(n)) == n { - num = int(n) - isInt = true - } - default: - // Already 0, false. - } - } - p.argNum++ - if tooLarge(num) { - num = 0 - isInt = false - } - } - return -} - -// parseArgNumber returns the value of the bracketed number, minus 1 -// (explicit argument numbers are one-indexed but we want zero-indexed). -// The opening bracket is known to be present at format[0]. -// The returned values are the index, the number of bytes to consume -// up to the closing paren, if present, and whether the number parsed -// ok. The bytes to consume will be 1 if no closing paren is present. -func parseArgNumber(format string) (index int, wid int, ok bool) { - // There must be at least 3 bytes: [n]. - if len(format) < 3 { - return 0, 1, false - } - - // Find closing bracket. - for i := 1; i < len(format); i++ { - if format[i] == ']' { - width, ok, newi := parsenum(format, 1, i) - if !ok || newi != i { - return 0, i + 1, false - } - return width - 1, i + 1, true // arg numbers are one-indexed and skip paren. - } - } - return 0, 1, false -} - -// updateArgNumber returns the next argument to evaluate, which is either the value of the passed-in -// argNum or the value of the bracketed integer that begins format[i:]. It also returns -// the new value of i, that is, the index of the next byte of the format to process. -func (p *printer) updateArgNumber(format string, i int) (newi int, found bool) { - if len(format) <= i || format[i] != '[' { - return i, false - } - p.reordered = true - index, wid, ok := parseArgNumber(format[i:]) - if ok && 0 <= index && index < len(p.args) { - p.argNum = index - return i + wid, true - } - p.goodArgNum = false - return i + wid, ok -} - -func (p *printer) badArgNum(verb rune) { - p.WriteString(percentBangString) - p.WriteRune(verb) - p.WriteString(badIndexString) -} - -func (p *printer) missingArg(verb rune) { - p.WriteString(percentBangString) - p.WriteRune(verb) - p.WriteString(missingString) -} - -func (p *printer) doPrintf(format string) { - end := len(format) - afterIndex := false // previous item in format was an index like [3]. -formatLoop: - for i := 0; i < end; { - p.goodArgNum = true - lasti := i - for i < end && format[i] != '%' { - i++ - } - if i > lasti { - p.WriteString(format[lasti:i]) - } - if i >= end { - // done processing format string - break - } - - // Process one verb - i++ - - // Do we have flags? - p.fmt.clearflags() - simpleFormat: - for ; i < end; i++ { - c := format[i] - switch c { - case '#': - p.fmt.sharp = true - case '0': - p.fmt.zero = !p.fmt.minus // Only allow zero padding to the left. - case '+': - p.fmt.plus = true - case '-': - p.fmt.minus = true - p.fmt.zero = false // Do not pad with zeros to the right. - case ' ': - p.fmt.space = true - default: - // Fast path for common case of ascii lower case simple verbs - // without precision or width or argument indices. - if 'a' <= c && c <= 'z' && p.argNum < len(p.args) { - if c == 'v' { - // Go syntax - p.fmt.sharpV = p.fmt.sharp - p.fmt.sharp = false - // Struct-field syntax - p.fmt.plusV = p.fmt.plus - p.fmt.plus = false - } - p.printArg(p.Arg(p.argNum+1), rune(c)) - p.argNum++ - i++ - continue formatLoop - } - // Format is more complex than simple flags and a verb or is malformed. - break simpleFormat - } - } - - // Do we have an explicit argument index? - i, afterIndex = p.updateArgNumber(format, i) - - // Do we have width? - if i < end && format[i] == '*' { - i++ - p.fmt.wid, p.fmt.widPresent = p.intFromArg() - - if !p.fmt.widPresent { - p.WriteString(badWidthString) - } - - // We have a negative width, so take its value and ensure - // that the minus flag is set - if p.fmt.wid < 0 { - p.fmt.wid = -p.fmt.wid - p.fmt.minus = true - p.fmt.zero = false // Do not pad with zeros to the right. - } - afterIndex = false - } else { - p.fmt.wid, p.fmt.widPresent, i = parsenum(format, i, end) - if afterIndex && p.fmt.widPresent { // "%[3]2d" - p.goodArgNum = false - } - } - - // Do we have precision? - if i+1 < end && format[i] == '.' { - i++ - if afterIndex { // "%[3].2d" - p.goodArgNum = false - } - i, afterIndex = p.updateArgNumber(format, i) - if i < end && format[i] == '*' { - i++ - p.fmt.prec, p.fmt.precPresent = p.intFromArg() - // Negative precision arguments don't make sense - if p.fmt.prec < 0 { - p.fmt.prec = 0 - p.fmt.precPresent = false - } - if !p.fmt.precPresent { - p.WriteString(badPrecString) - } - afterIndex = false - } else { - p.fmt.prec, p.fmt.precPresent, i = parsenum(format, i, end) - if !p.fmt.precPresent { - p.fmt.prec = 0 - p.fmt.precPresent = true - } - } - } - - if !afterIndex { - i, afterIndex = p.updateArgNumber(format, i) - } - - if i >= end { - p.WriteString(noVerbString) - break - } - - verb, w := utf8.DecodeRuneInString(format[i:]) - i += w - - switch { - case verb == '%': // Percent does not absorb operands and ignores f.wid and f.prec. - p.WriteByte('%') - case !p.goodArgNum: - p.badArgNum(verb) - case p.argNum >= len(p.args): // No argument left over to print for the current verb. - p.missingArg(verb) - case verb == 'v': - // Go syntax - p.fmt.sharpV = p.fmt.sharp - p.fmt.sharp = false - // Struct-field syntax - p.fmt.plusV = p.fmt.plus - p.fmt.plus = false - fallthrough - default: - p.printArg(p.args[p.argNum], verb) - p.argNum++ - } - } - - // Check for extra arguments, but only if there was at least one ordered - // argument. Note that this behavior is necessarily different from fmt: - // different variants of messages may opt to drop some or all of the - // arguments. - if !p.reordered && p.argNum < len(p.args) && p.argNum != 0 { - p.fmt.clearflags() - p.WriteString(extraString) - for i, arg := range p.args[p.argNum:] { - if i > 0 { - p.WriteString(commaSpaceString) - } - if arg == nil { - p.WriteString(nilAngleString) - } else { - p.WriteString(reflect.TypeOf(arg).String()) - p.WriteByte('=') - p.printArg(arg, 'v') - } - } - p.WriteByte(')') - } -} - -func (p *printer) doPrint(a []interface{}) { - prevString := false - for argNum, arg := range a { - isString := arg != nil && reflect.TypeOf(arg).Kind() == reflect.String - // Add a space between two non-string arguments. - if argNum > 0 && !isString && !prevString { - p.WriteByte(' ') - } - p.printArg(arg, 'v') - prevString = isString - } -} - -// doPrintln is like doPrint but always adds a space between arguments -// and a newline after the last argument. -func (p *printer) doPrintln(a []interface{}) { - for argNum, arg := range a { - if argNum > 0 { - p.WriteByte(' ') - } - p.printArg(arg, 'v') - } - p.WriteByte('\n') -} diff --git a/vendor/golang.org/x/text/search/index.go b/vendor/golang.org/x/text/search/index.go deleted file mode 100644 index 35de8f5fb..000000000 --- a/vendor/golang.org/x/text/search/index.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Note: this file is identical to the file text/collate/index.go. Both files -// will be removed when the new colltab package is finished and in use. - -package search - -import "golang.org/x/text/internal/colltab" - -const blockSize = 64 - -func getTable(t tableIndex) *colltab.Table { - return &colltab.Table{ - Index: colltab.Trie{ - Index0: mainLookup[:][blockSize*t.lookupOffset:], - Values0: mainValues[:][blockSize*t.valuesOffset:], - Index: mainLookup[:], - Values: mainValues[:], - }, - ExpandElem: mainExpandElem[:], - ContractTries: colltab.ContractTrieSet(mainCTEntries[:]), - ContractElem: mainContractElem[:], - MaxContractLen: 18, - VariableTop: varTop, - } -} - -// tableIndex holds information for constructing a table -// for a certain locale based on the main table. -type tableIndex struct { - lookupOffset uint32 - valuesOffset uint32 -} diff --git a/vendor/golang.org/x/text/search/pattern.go b/vendor/golang.org/x/text/search/pattern.go deleted file mode 100644 index 2497cfd2f..000000000 --- a/vendor/golang.org/x/text/search/pattern.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package search - -import ( - "golang.org/x/text/internal/colltab" -) - -// TODO: handle variable primary weights? - -func (p *Pattern) deleteEmptyElements() { - k := 0 - for _, e := range p.ce { - if !isIgnorable(p.m, e) { - p.ce[k] = e - k++ - } - } - p.ce = p.ce[:k] -} - -func isIgnorable(m *Matcher, e colltab.Elem) bool { - if e.Primary() > 0 { - return false - } - if e.Secondary() > 0 { - if !m.ignoreDiacritics { - return false - } - // Primary value is 0 and ignoreDiacritics is true. In this case we - // ignore the tertiary element, as it only pertains to the modifier. - return true - } - // TODO: further distinguish once we have the new implementation. - if !(m.ignoreWidth || m.ignoreCase) && e.Tertiary() > 0 { - return false - } - // TODO: we ignore the Quaternary level for now. - return true -} - -// TODO: Use a Boyer-Moore-like algorithm (probably Sunday) for searching. - -func (p *Pattern) forwardSearch(it *colltab.Iter) (start, end int) { - for start := 0; it.Next(); it.Reset(start) { - nextStart := it.End() - if end := p.searchOnce(it); end != -1 { - return start, end - } - start = nextStart - } - return -1, -1 -} - -func (p *Pattern) anchoredForwardSearch(it *colltab.Iter) (start, end int) { - if it.Next() { - if end := p.searchOnce(it); end != -1 { - return 0, end - } - } - return -1, -1 -} - -// next advances to the next weight in a pattern. f must return one of the -// weights of a collation element. next will advance to the first non-zero -// weight and return this weight and true if it exists, or 0, false otherwise. -func (p *Pattern) next(i *int, f func(colltab.Elem) int) (weight int, ok bool) { - for *i < len(p.ce) { - v := f(p.ce[*i]) - *i++ - if v != 0 { - // Skip successive ignorable values. - for ; *i < len(p.ce) && f(p.ce[*i]) == 0; *i++ { - } - return v, true - } - } - return 0, false -} - -// TODO: remove this function once Elem is internal and Tertiary returns int. -func tertiary(e colltab.Elem) int { - return int(e.Tertiary()) -} - -// searchOnce tries to match the pattern s.p at the text position i. s.buf needs -// to be filled with collation elements of the first segment, where n is the -// number of source bytes consumed for this segment. It will return the end -// position of the match or -1. -func (p *Pattern) searchOnce(it *colltab.Iter) (end int) { - var pLevel [4]int - - m := p.m - for { - k := 0 - for ; k < it.N; k++ { - if v := it.Elems[k].Primary(); v > 0 { - if w, ok := p.next(&pLevel[0], colltab.Elem.Primary); !ok || v != w { - return -1 - } - } - - if !m.ignoreDiacritics { - if v := it.Elems[k].Secondary(); v > 0 { - if w, ok := p.next(&pLevel[1], colltab.Elem.Secondary); !ok || v != w { - return -1 - } - } - } else if it.Elems[k].Primary() == 0 { - // We ignore tertiary values of collation elements of the - // secondary level. - continue - } - - // TODO: distinguish between case and width. This will be easier to - // implement after we moved to the new collation implementation. - if !m.ignoreWidth && !m.ignoreCase { - if v := it.Elems[k].Tertiary(); v > 0 { - if w, ok := p.next(&pLevel[2], tertiary); !ok || int(v) != w { - return -1 - } - } - } - // TODO: check quaternary weight - } - it.Discard() // Remove the current segment from the buffer. - - // Check for completion. - switch { - // If any of these cases match, we are not at the end. - case pLevel[0] < len(p.ce): - case !m.ignoreDiacritics && pLevel[1] < len(p.ce): - case !(m.ignoreWidth || m.ignoreCase) && pLevel[2] < len(p.ce): - default: - // At this point, both the segment and pattern has matched fully. - // However, the segment may still be have trailing modifiers. - // This can be verified by another call to next. - end = it.End() - if it.Next() && it.Elems[0].Primary() == 0 { - if !m.ignoreDiacritics { - return -1 - } - end = it.End() - } - return end - } - - // Fill the buffer with the next batch of collation elements. - if !it.Next() { - return -1 - } - } -} diff --git a/vendor/golang.org/x/text/search/pattern_test.go b/vendor/golang.org/x/text/search/pattern_test.go deleted file mode 100644 index 931fa6562..000000000 --- a/vendor/golang.org/x/text/search/pattern_test.go +++ /dev/null @@ -1,357 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package search - -import ( - "reflect" - "strings" - "testing" - - "golang.org/x/text/language" -) - -func TestCompile(t *testing.T) { - for i, tc := range []struct { - desc string - pattern string - options []Option - n int - }{{ - desc: "empty", - pattern: "", - n: 0, - }, { - desc: "single", - pattern: "a", - n: 1, - }, { - desc: "keep modifier", - pattern: "a\u0300", // U+0300: COMBINING GRAVE ACCENT - n: 2, - }, { - desc: "remove modifier", - pattern: "a\u0300", // U+0300: COMBINING GRAVE ACCENT - options: []Option{IgnoreDiacritics}, - n: 1, - }, { - desc: "single with double collation element", - pattern: "ä", - n: 2, - }, { - desc: "leading variable", - pattern: " a", - n: 2, - }, { - desc: "trailing variable", - pattern: "aa ", - n: 3, - }, { - desc: "leading and trailing variable", - pattern: " äb ", - n: 5, - }, { - desc: "keep interior variable", - pattern: " ä b ", - n: 6, - }, { - desc: "keep interior variables", - pattern: " b ä ", - n: 7, - }, { - desc: "remove ignoreables (zero-weights across the board)", - pattern: "\u009Db\u009Dä\u009D", // U+009D: OPERATING SYSTEM COMMAND - n: 3, - }} { - m := New(language.Und, tc.options...) - p := m.CompileString(tc.pattern) - if len(p.ce) != tc.n { - t.Errorf("%d:%s: Compile(%+q): got %d; want %d", i, tc.desc, tc.pattern, len(p.ce), tc.n) - } - } -} - -func TestNorm(t *testing.T) { - // U+0300: COMBINING GRAVE ACCENT (CCC=230) - // U+031B: COMBINING HORN (CCC=216) - for _, tc := range []struct { - desc string - a string - b string - want bool // a and b compile into the same pattern? - }{{ - "simple", - "eee\u0300\u031b", - "eee\u031b\u0300", - true, - }, { - "large number of modifiers in pattern", - strings.Repeat("\u0300", 29) + "\u0318", - "\u0318" + strings.Repeat("\u0300", 29), - true, - }, { - "modifier overflow in pattern", - strings.Repeat("\u0300", 30) + "\u0318", - "\u0318" + strings.Repeat("\u0300", 30), - false, - }} { - m := New(language.Und) - a := m.CompileString(tc.a) - b := m.CompileString(tc.b) - if got := reflect.DeepEqual(a, b); got != tc.want { - t.Errorf("Compile(a) == Compile(b) == %v; want %v", got, tc.want) - } - } -} - -func TestForwardSearch(t *testing.T) { - for i, tc := range []struct { - desc string - tag string - options []Option - pattern string - text string - want []int - }{{ - // The semantics of an empty search is to match nothing. - // TODO: change this to be in line with strings.Index? It is quite a - // different beast, so not sure yet. - - desc: "empty pattern and text", - tag: "und", - pattern: "", - text: "", - want: nil, // TODO: consider: []int{0, 0}, - }, { - desc: "non-empty pattern and empty text", - tag: "und", - pattern: " ", - text: "", - want: nil, - }, { - desc: "empty pattern and non-empty text", - tag: "und", - pattern: "", - text: "abc", - want: nil, // TODO: consider: []int{0, 0, 1, 1, 2, 2, 3, 3}, - }, { - // Variable-only patterns. We don't support variables at the moment, - // but verify that, given this, the behavior is indeed as expected. - - desc: "exact match of variable", - tag: "und", - pattern: " ", - text: " ", - want: []int{0, 1}, - }, { - desc: "variables not handled by default", - tag: "und", - pattern: "- ", - text: " -", - want: nil, // Would be (1, 2) for a median match with variable}. - }, { - desc: "multiple subsequent identical variables", - tag: "und", - pattern: " ", - text: " ", - want: []int{0, 1, 1, 2, 2, 3, 3, 4}, - }, { - desc: "text with variables", - tag: "und", - options: []Option{IgnoreDiacritics}, - pattern: "abc", - text: "3 abc 3", - want: []int{2, 5}, - }, { - desc: "pattern with interior variables", - tag: "und", - options: []Option{IgnoreDiacritics}, - pattern: "a b c", - text: "3 a b c abc a b c 3", - want: []int{2, 7}, // Would have 3 matches using variable. - - // TODO: Different variable handling settings. - }, { - // Options. - - desc: "match all levels", - tag: "und", - pattern: "Abc", - text: "abcAbcABCÁbcábc", - want: []int{3, 6}, - }, { - desc: "ignore diacritics in text", - tag: "und", - options: []Option{IgnoreDiacritics}, - pattern: "Abc", - text: "Ábc", - want: []int{0, 4}, - }, { - desc: "ignore diacritics in pattern", - tag: "und", - options: []Option{IgnoreDiacritics}, - pattern: "Ábc", - text: "Abc", - want: []int{0, 3}, - }, { - desc: "ignore diacritics", - tag: "und", - options: []Option{IgnoreDiacritics}, - pattern: "Abc", - text: "abcAbcABCÁbcábc", - want: []int{3, 6, 9, 13}, - }, { - desc: "ignore case", - tag: "und", - options: []Option{IgnoreCase}, - pattern: "Abc", - text: "abcAbcABCÁbcábc", - want: []int{0, 3, 3, 6, 6, 9}, - }, { - desc: "ignore case and diacritics", - tag: "und", - options: []Option{IgnoreCase, IgnoreDiacritics}, - pattern: "Abc", - text: "abcAbcABCÁbcábc", - want: []int{0, 3, 3, 6, 6, 9, 9, 13, 13, 17}, - }, { - desc: "ignore width to fullwidth", - tag: "und", - options: []Option{IgnoreWidth}, - pattern: "abc", - text: "123 \uFF41\uFF42\uFF43 123", // U+FF41-3: FULLWIDTH LATIN SMALL LETTER A-C - want: []int{4, 13}, - }, { - // TODO: distinguish between case and width. - desc: "don't ignore width to fullwidth, ignoring only case", - tag: "und", - options: []Option{IgnoreCase}, - pattern: "abc", - text: "123 \uFF41\uFF42\uFF43 123", // U+FF41-3: FULLWIDTH LATIN SMALL LETTER A-C - want: []int{4, 13}, - }, { - desc: "ignore width to fullwidth and diacritics", - tag: "und", - options: []Option{IgnoreWidth, IgnoreDiacritics}, - pattern: "abc", - text: "123 \uFF41\uFF42\uFF43 123", // U+FF41-3: FULLWIDTH LATIN SMALL LETTER A-C - want: []int{4, 13}, - }, { - desc: "whole grapheme, single rune", - tag: "und", - pattern: "eee", - text: "123 eeé 123", - want: nil, - }, { - // Note: rules on when to apply contractions may, for certain languages, - // differ between search and collation. For example, "ch" is not - // considered a contraction for the purpose of searching in Spanish. - // Therefore, be careful picking this test. - desc: "whole grapheme, contractions", - tag: "da", - pattern: "aba", - // Fails at the primary level, because "aa" is a contraction. - text: "123 abaa 123", - want: []int{}, - }, { - desc: "whole grapheme, trailing modifier", - tag: "und", - pattern: "eee", - text: "123 eee\u0300 123", // U+0300: COMBINING GRAVE ACCENT - want: nil, - }, { - // Language-specific matching. - - desc: "", - tag: "da", - options: []Option{IgnoreCase}, - pattern: "Århus", - text: "AarhusÅrhus Århus ", - want: []int{0, 6, 6, 12, 14, 20}, - }, { - desc: "", - tag: "da", - options: []Option{IgnoreCase}, - pattern: "Aarhus", - text: "Århus Aarhus", - want: []int{0, 6, 7, 13}, - }, { - desc: "", - tag: "en", // Å does not match A for English. - options: []Option{IgnoreCase}, - pattern: "Aarhus", - text: "Århus", - want: nil, - }, { - desc: "ignore modifier in text", - options: []Option{IgnoreDiacritics}, - tag: "und", - pattern: "eee", - text: "123 eee\u0300 123", // U+0300: COMBINING GRAVE ACCENT - want: []int{4, 9}, // Matches on grapheme boundary. - }, { - desc: "ignore multiple modifiers in text", - options: []Option{IgnoreDiacritics}, - tag: "und", - pattern: "eee", - text: "123 eee\u0300\u0300 123", // U+0300: COMBINING GRAVE ACCENT - want: []int{4, 11}, // Matches on grapheme boundary. - }, { - desc: "ignore modifier in pattern", - options: []Option{IgnoreDiacritics}, - tag: "und", - pattern: "eee\u0300", // U+0300: COMBINING GRAVE ACCENT - text: "123 eee 123", - want: []int{4, 7}, - }, { - desc: "ignore multiple modifiers in pattern", - options: []Option{IgnoreDiacritics}, - tag: "und", - pattern: "eee\u0300\u0300", // U+0300: COMBINING GRAVE ACCENT - text: "123 eee 123", - want: []int{4, 7}, - }, { - desc: "match non-normalized pattern", - tag: "und", - // U+0300: COMBINING GRAVE ACCENT (CCC=230) - // U+031B: COMBINING HORN (CCC=216) - pattern: "eee\u0300\u031b", - text: "123 eee\u031b\u0300 123", - want: []int{4, 11}, - }, { - desc: "match non-normalized text", - tag: "und", - // U+0300: COMBINING GRAVE ACCENT (CCC=230) - // U+031B: COMBINING HORN (CCC=216) - pattern: "eee\u031b\u0300", - text: "123 eee\u0300\u031b 123", - want: []int{4, 11}, - }} { - m := New(language.MustParse(tc.tag), tc.options...) - p := m.CompileString(tc.pattern) - for j := 0; j < len(tc.text); { - start, end := p.IndexString(tc.text[j:]) - if start == -1 && end == -1 { - j++ - continue - } - start += j - end += j - j = end - if len(tc.want) == 0 { - t.Errorf("%d:%s: found unexpected result [%d %d]", i, tc.desc, start, end) - break - } - if tc.want[0] != start || tc.want[1] != end { - t.Errorf("%d:%s: got [%d %d]; want %v", i, tc.desc, start, end, tc.want[:2]) - tc.want = tc.want[2:] - break - } - tc.want = tc.want[2:] - } - if len(tc.want) != 0 { - t.Errorf("%d:%s: %d extra results", i, tc.desc, len(tc.want)/2) - } - } -} diff --git a/vendor/golang.org/x/text/search/search.go b/vendor/golang.org/x/text/search/search.go deleted file mode 100644 index 894b6c6c2..000000000 --- a/vendor/golang.org/x/text/search/search.go +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run ../collate/maketables.go -cldr=23 -unicode=6.2.0 -types=search,searchjl -package=search - -// Package search provides language-specific search and string matching. -// -// Natural language matching can be intricate. For example, Danish will insist -// "Århus" and "Aarhus" are the same name and Turkish will match I to ı (note -// the lack of a dot) in a case-insensitive match. This package handles such -// language-specific details. -// -// Text passed to any of the calls in this message does not need to be -// normalized. -package search // import "golang.org/x/text/search" - -import ( - "strings" - - "golang.org/x/text/internal/colltab" - "golang.org/x/text/language" -) - -// An Option configures a Matcher. -type Option func(*Matcher) - -var ( - // WholeWord restricts matches to complete words. The default is to match at - // the character level. - WholeWord Option = nil - - // Exact requires that two strings are their exact equivalent. For example - // å would not match aa in Danish. It overrides any of the ignore options. - Exact Option = nil - - // Loose causes case, diacritics and width to be ignored. - Loose Option = loose - - // IgnoreCase enables case-insensitive search. - IgnoreCase Option = ignoreCase - - // IgnoreDiacritics causes diacritics to be ignored ("ö" == "o"). - IgnoreDiacritics Option = ignoreDiacritics - - // IgnoreWidth equates narrow with wide variants. - IgnoreWidth Option = ignoreWidth -) - -func ignoreDiacritics(m *Matcher) { m.ignoreDiacritics = true } -func ignoreCase(m *Matcher) { m.ignoreCase = true } -func ignoreWidth(m *Matcher) { m.ignoreWidth = true } -func loose(m *Matcher) { - ignoreDiacritics(m) - ignoreCase(m) - ignoreWidth(m) -} - -var ( - // Supported lists the languages for which search differs from its parent. - Supported language.Coverage - - tags []language.Tag -) - -func init() { - ids := strings.Split(availableLocales, ",") - tags = make([]language.Tag, len(ids)) - for i, s := range ids { - tags[i] = language.Raw.MustParse(s) - } - Supported = language.NewCoverage(tags) -} - -// New returns a new Matcher for the given language and options. -func New(t language.Tag, opts ...Option) *Matcher { - m := &Matcher{ - w: getTable(locales[colltab.MatchLang(t, tags)]), - } - for _, f := range opts { - f(m) - } - return m -} - -// A Matcher implements language-specific string matching. -type Matcher struct { - w colltab.Weighter - ignoreCase bool - ignoreWidth bool - ignoreDiacritics bool -} - -// An IndexOption specifies how the Index methods of Pattern or Matcher should -// match the input. -type IndexOption byte - -const ( - // Anchor restricts the search to the start (or end for Backwards) of the - // text. - Anchor IndexOption = 1 << iota - - // Backwards starts the search from the end of the text. - Backwards - - anchorBackwards = Anchor | Backwards -) - -// Index reports the start and end position of the first occurrence of pat in b -// or -1, -1 if pat is not present. -func (m *Matcher) Index(b, pat []byte, opts ...IndexOption) (start, end int) { - // TODO: implement optimized version that does not use a pattern. - return m.Compile(pat).Index(b, opts...) -} - -// IndexString reports the start and end position of the first occurrence of pat -// in s or -1, -1 if pat is not present. -func (m *Matcher) IndexString(s, pat string, opts ...IndexOption) (start, end int) { - // TODO: implement optimized version that does not use a pattern. - return m.CompileString(pat).IndexString(s, opts...) -} - -// Equal reports whether a and b are equivalent. -func (m *Matcher) Equal(a, b []byte) bool { - _, end := m.Index(a, b, Anchor) - return end == len(a) -} - -// EqualString reports whether a and b are equivalent. -func (m *Matcher) EqualString(a, b string) bool { - _, end := m.IndexString(a, b, Anchor) - return end == len(a) -} - -// Compile compiles and returns a pattern that can be used for faster searching. -func (m *Matcher) Compile(b []byte) *Pattern { - p := &Pattern{m: m} - iter := colltab.Iter{Weighter: m.w} - for iter.SetInput(b); iter.Next(); { - } - p.ce = iter.Elems - p.deleteEmptyElements() - return p -} - -// CompileString compiles and returns a pattern that can be used for faster -// searching. -func (m *Matcher) CompileString(s string) *Pattern { - p := &Pattern{m: m} - iter := colltab.Iter{Weighter: m.w} - for iter.SetInputString(s); iter.Next(); { - } - p.ce = iter.Elems - p.deleteEmptyElements() - return p -} - -// A Pattern is a compiled search string. It is safe for concurrent use. -type Pattern struct { - m *Matcher - ce []colltab.Elem -} - -// Design note (TODO remove): -// The cost of retrieving collation elements for each rune, which is used for -// search as well, is not trivial. Also, algorithms like Boyer-Moore and -// Sunday require some additional precomputing. - -// Index reports the start and end position of the first occurrence of p in b -// or -1, -1 if p is not present. -func (p *Pattern) Index(b []byte, opts ...IndexOption) (start, end int) { - // Pick a large enough buffer such that we likely do not need to allocate - // and small enough to not cause too much overhead initializing. - var buf [8]colltab.Elem - - it := &colltab.Iter{ - Weighter: p.m.w, - Elems: buf[:0], - } - it.SetInput(b) - - var optMask IndexOption - for _, o := range opts { - optMask |= o - } - - switch optMask { - case 0: - return p.forwardSearch(it) - case Anchor: - return p.anchoredForwardSearch(it) - case Backwards, anchorBackwards: - panic("TODO: implement") - default: - panic("unrecognized option") - } -} - -// IndexString reports the start and end position of the first occurrence of p -// in s or -1, -1 if p is not present. -func (p *Pattern) IndexString(s string, opts ...IndexOption) (start, end int) { - // Pick a large enough buffer such that we likely do not need to allocate - // and small enough to not cause too much overhead initializing. - var buf [8]colltab.Elem - - it := &colltab.Iter{ - Weighter: p.m.w, - Elems: buf[:0], - } - it.SetInputString(s) - - var optMask IndexOption - for _, o := range opts { - optMask |= o - } - - switch optMask { - case 0: - return p.forwardSearch(it) - case Anchor: - return p.anchoredForwardSearch(it) - case Backwards, anchorBackwards: - panic("TODO: implement") - default: - panic("unrecognized option") - } -} - -// TODO: -// - Maybe IndexAll methods (probably not necessary). -// - Some way to match patterns in a Reader (a bit tricky). -// - Some fold transformer that folds text to comparable text, based on the -// search options. This is a common technique, though very different from the -// collation-based design of this package. It has a somewhat different use -// case, so probably makes sense to support both. Should probably be in a -// different package, though, as it uses completely different kind of tables -// (based on norm, cases, width and range tables.) diff --git a/vendor/golang.org/x/text/search/tables.go b/vendor/golang.org/x/text/search/tables.go deleted file mode 100644 index 72d27b5d4..000000000 --- a/vendor/golang.org/x/text/search/tables.go +++ /dev/null @@ -1,12448 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package search - -// UnicodeVersion is the Unicode version from which the tables in this package are derived. -const UnicodeVersion = "6.2.0" - -// CLDRVersion is the CLDR version from which the tables in this package are derived. -const CLDRVersion = "23" - -var availableLocales = "und,az,bs,ca,cs,da,de,en,en-US,es,fi,fo,fr,he,hr,is,kl,ko,ko-u-co-searchjl,nb,nn,se,sk,sr-Latn,sv,tr" - -const varTop = 0x30e - -var locales = [...]tableIndex{ - { // und - lookupOffset: 0x1a, - valuesOffset: 0x1b4, - }, - { // az - lookupOffset: 0x20, - valuesOffset: 0x1c8, - }, - { // bs - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // ca - lookupOffset: 0x21, - valuesOffset: 0x1da, - }, - { // cs - lookupOffset: 0x23, - valuesOffset: 0x1de, - }, - { // da - lookupOffset: 0x26, - valuesOffset: 0x1e8, - }, - { // de - lookupOffset: 0x28, - valuesOffset: 0x1f2, - }, - { // en - lookupOffset: 0x1a, - valuesOffset: 0x1b4, - }, - { // en-US - lookupOffset: 0x1a, - valuesOffset: 0x1b4, - }, - { // es - lookupOffset: 0x29, - valuesOffset: 0x1f8, - }, - { // fi - lookupOffset: 0x2f, - valuesOffset: 0x1fb, - }, - { // fo - lookupOffset: 0x26, - valuesOffset: 0x1e8, - }, - { // fr - lookupOffset: 0x1a, - valuesOffset: 0x1b4, - }, - { // he - lookupOffset: 0x31, - valuesOffset: 0x20b, - }, - { // hr - lookupOffset: 0x33, - valuesOffset: 0x210, - }, - { // is - lookupOffset: 0x35, - valuesOffset: 0x217, - }, - { // kl - lookupOffset: 0x36, - valuesOffset: 0x221, - }, - { // ko - lookupOffset: 0x38, - valuesOffset: 0x1b4, - }, - { // ko-u-co-searchjl - lookupOffset: 0x3b, - valuesOffset: 0x0, - }, - { // nb - lookupOffset: 0x26, - valuesOffset: 0x22f, - }, - { // nn - lookupOffset: 0x26, - valuesOffset: 0x22f, - }, - { // se - lookupOffset: 0x3e, - valuesOffset: 0x231, - }, - { // sk - lookupOffset: 0x40, - valuesOffset: 0x23d, - }, - { // sr-Latn - lookupOffset: 0x15, - valuesOffset: 0x0, - }, - { // sv - lookupOffset: 0x42, - valuesOffset: 0x244, - }, - { // tr - lookupOffset: 0x48, - valuesOffset: 0x24c, - }, -} - -// mainExpandElem: 10841 entries, 43364 bytes -var mainExpandElem = [10841]uint32{ - // Block 0, offset 0x0 - 0x00000002, 0xAE604702, 0xAE603202, 0x00000002, 0xA000A51A, 0xA000BA1A, - 0x00000002, 0xA000A91A, 0xA000BA1A, 0x00000002, 0xA000AD1A, 0xA000BA1A, - 0x00000002, 0xA000B21A, 0xA000BA1A, 0x00000002, 0xA000B61A, 0xA000BA1A, - 0x00000002, 0xA000BA1A, 0xA000D11A, 0x00000004, 0x0003F484, 0x0029CE84, - 0x0029CC84, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029CE84, - 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029D084, 0x0003F69F, - 0x00000004, 0x0003F484, 0x0029CE84, 0x0029D284, 0x0003F69F, 0x00000004, - 0x0003F484, 0x0029CE84, 0x0029D484, 0x0003F69F, 0x00000004, 0x0003F484, - 0x0029CE84, 0x0029D684, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, - 0x0029D884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029DA84, - 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, - // Block 1, offset 0x40 - 0x0029DC84, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029DE84, - 0x0003F69F, 0x00000004, 0x0003F484, 0x0029D084, 0x0029CC84, 0x0003F69F, - 0x00000004, 0x0003F484, 0x0062AC84, 0x0063A884, 0x0003F69F, 0x00000004, - 0x0003F484, 0x0062B084, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, - 0x0062B284, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062B684, - 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062B884, 0x0063A884, - 0x0003F69F, 0x00000004, 0x0003F484, 0x0062BA84, 0x0063A884, 0x0003F69F, - 0x00000004, 0x0003F484, 0x0062BE84, 0x0063A884, 0x0003F69F, 0x00000004, - 0x0003F484, 0x0062C284, 0x0063A884, 0x0003F69F, 0x00000007, 0x0003F484, - 0x0062C284, 0x0063B884, 0x0062C484, 0x0063B084, 0x00646A84, 0x0003F69F, - 0x00000006, 0x0003F484, 0x0062C284, 0x0063B884, - // Block 2, offset 0x80 - 0x0062D084, 0x0063C284, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C484, - 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C484, 0x0063C284, - 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C884, 0x0063A884, 0x0003F69F, - 0x00000004, 0x0003F484, 0x0062CA84, 0x0063A884, 0x0003F69F, 0x00000004, - 0x0003F484, 0x0062CC84, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, - 0x0062CE84, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062D084, - 0x0063A884, 0x0003F69F, 0x00000004, 0x00050E84, 0x00050E84, 0x00050E84, - 0x00050E9F, 0x00000002, 0x40062C20, 0xAE603202, 0x00000002, 0x40062C20, - 0xAE603502, 0x00000002, 0x40062C20, 0xAE604502, 0x00000002, 0x40063620, - 0xAE603202, 0x00000002, 0x40063620, 0xAE603502, 0x00000002, 0x40063620, - 0xAE604502, 0x00000002, 0x40063820, 0xAE603202, - // Block 3, offset 0xc0 - 0x00000002, 0x40063820, 0xAE603502, 0x00000002, 0x40063820, 0xAE604502, - 0x00000002, 0x40084420, 0xA0105402, 0x00000002, 0x40084620, 0xA0105402, - 0x00000002, 0x40084C20, 0xA0105402, 0x00000002, 0x4008B820, 0xA0105402, - 0x00000002, 0x4008BC20, 0xA0105402, 0x00000002, 0x4008C020, 0xA0105402, - 0x00000002, 0x40091E20, 0xA0105402, 0x00000002, 0x40092620, 0xA0105402, - 0x00000002, 0x40092A20, 0xA0105402, 0x00000002, 0x40094020, 0xA0105402, - 0x00000002, 0x40094220, 0xA0105402, 0x00000002, 0x40094420, 0xA0105402, - 0x00000002, 0x40097820, 0xA0105402, 0x00000002, 0x40097A20, 0xA0105402, - 0x00000004, 0x00098484, 0x00098484, 0x00098484, 0x0009849F, 0x00000002, - 0x40099E20, 0xA0105402, 0x00000002, 0x4009AA20, 0xA0105402, 0x00000002, - 0x4009AC20, 0xA0105402, 0x00000002, 0x4009B020, - // Block 4, offset 0x100 - 0xA0105402, 0x00000002, 0x4009B820, 0xA0105402, 0x00000002, 0x4009DE20, - 0xA0105402, 0x00000002, 0x4009E220, 0xA0105402, 0x00000002, 0x4009E420, - 0xA0105402, 0x00000002, 0x4009F420, 0xA0105402, 0x00000002, 0x4009F620, - 0xA0105402, 0x00000002, 0x4009F820, 0xA0105402, 0x00000002, 0x4009FA20, - 0xA0105402, 0x00000002, 0x4009FC20, 0xA0105402, 0x00000002, 0x4009FE20, - 0xA0105402, 0x00000002, 0x400A0020, 0xA0105402, 0x00000002, 0x400A0220, - 0xA0105402, 0x00000002, 0x400A0820, 0xA0105402, 0x00000002, 0x400A0A20, - 0xA0105402, 0x00000002, 0x400A0C20, 0xA0105402, 0x00000002, 0x400A0E20, - 0xA0105402, 0x00000002, 0x400A1E20, 0xA0105402, 0x00000002, 0x400A2020, - 0xA0105402, 0x00000002, 0x400A4020, 0xA0105402, 0x00000002, 0x400A4C20, - 0xA0105402, 0x00000002, 0x400A4E20, 0xA0105402, - // Block 5, offset 0x140 - 0x00000002, 0x400A5220, 0xA0105402, 0x00000002, 0x400A5820, 0xA0105402, - 0x00000002, 0x400A5A20, 0xA0105402, 0x00000002, 0x400A5C20, 0xA0105402, - 0x00000002, 0x400A5E20, 0xA0105402, 0x00000002, 0x40164620, 0xA0105402, - 0x00000002, 0x4027CE20, 0xA0012802, 0x00000002, 0x4027D020, 0xA0012802, - 0x00000002, 0x4027D420, 0xA0812802, 0x00000002, 0x4027D820, 0xA0812802, - 0x00000002, 0x4029CC20, 0xA0013F02, 0x00000002, 0x4029CC20, 0xA0014002, - 0x00000002, 0x4029CC20, 0xA0014202, 0x00000002, 0x4029CC20, 0xA0014402, - 0x00000002, 0x4029CC20, 0xA0014502, 0x00000002, 0x4029CC20, 0xA0014602, - 0x00000002, 0x4029CC20, 0xA0014702, 0x00000002, 0x4029CC20, 0xA0014802, - 0x00000002, 0x4029CC20, 0xA0014902, 0x00000002, 0x4029CC20, 0xA0014A02, - 0x00000002, 0x4029CC20, 0xA0014B02, 0x00000002, - // Block 6, offset 0x180 - 0x4029CC20, 0xA0014B02, 0x00000002, 0x4029CC20, 0xA0014C02, 0x00000002, - 0x4029CC20, 0xA0014D02, 0x00000002, 0x4029CC20, 0xA0014E02, 0x00000002, - 0x4029CC20, 0xA0014F02, 0x00000002, 0x4029CC20, 0xA0015002, 0x00000002, - 0x4029CC20, 0xA0015102, 0x00000002, 0x4029CC20, 0xA0015202, 0x00000002, - 0x4029CC20, 0xA0015302, 0x00000002, 0x4029CC20, 0xA0015402, 0x00000002, - 0x4029CC20, 0xA0015502, 0x00000002, 0x4029CC20, 0xA0015602, 0x00000002, - 0x0029CC84, 0xA0015604, 0x00000002, 0x4029CC20, 0xA0015702, 0x00000002, - 0x4029CC20, 0xA0015802, 0x00000002, 0x4029CC20, 0xA0015902, 0x00000002, - 0x4029CC20, 0xA0015A02, 0x00000002, 0x4029CC20, 0xA0015B02, 0x00000002, - 0x4029CC20, 0xA0015C02, 0x00000002, 0x4029CC20, 0xA0015D02, 0x00000002, - 0x4029CC20, 0xA0015E02, 0x00000002, 0x4029CC20, - // Block 7, offset 0x1c0 - 0xA0015F02, 0x00000002, 0x4029CC20, 0xA0016002, 0x00000002, 0x4029CC20, - 0xA0016102, 0x00000002, 0x4029CC20, 0xA0016202, 0x00000002, 0x4029CC20, - 0xA0016302, 0x00000002, 0x4029CC20, 0xA0016402, 0x00000002, 0x4029CC20, - 0xA0016502, 0x00000002, 0x4029CC20, 0xA0016602, 0x00000002, 0x4029CC20, - 0xA0016802, 0x00000002, 0x4029CC20, 0xA0017202, 0x00000002, 0x4029CC20, - 0xA0017302, 0x00000002, 0x4029CC20, 0xA0017402, 0x00000003, 0x0029CC9E, - 0x0009589E, 0x0029D29E, 0x00000002, 0x4029CE20, 0xA0013F02, 0x00000002, - 0x4029CE20, 0xA0014002, 0x00000002, 0x4029CE20, 0xA0014102, 0x00000002, - 0x4029CE20, 0xA0014202, 0x00000002, 0x4029CE20, 0xA0014302, 0x00000002, - 0x4029CE20, 0xA0014402, 0x00000002, 0x4029CE20, 0xA0014502, 0x00000002, - 0x4029CE20, 0xA0014602, 0x00000002, 0x4029CE20, - // Block 8, offset 0x200 - 0xA0014702, 0x00000002, 0x4029CE20, 0xA0014802, 0x00000002, 0x4029CE20, - 0xA0014902, 0x00000002, 0x4029CE20, 0xA0014A02, 0x00000002, 0x4029CE20, - 0xA0014B02, 0x00000002, 0x4029CE20, 0xA0014B02, 0x00000002, 0x4029CE20, - 0xA0014B02, 0x00000002, 0x4029CE20, 0xA0014C02, 0x00000002, 0x4029CE20, - 0xA0014D02, 0x00000002, 0x4029CE20, 0xA0014E02, 0x00000002, 0x4029CE20, - 0xA0014F02, 0x00000002, 0x4029CE20, 0xA0015002, 0x00000002, 0x4029CE20, - 0xA0015102, 0x00000002, 0x4029CE20, 0xA0015102, 0x00000002, 0x4029CE20, - 0xA0015202, 0x00000002, 0x4029CE20, 0xA0015302, 0x00000002, 0x4029CE20, - 0xA0015402, 0x00000002, 0x4029CE20, 0xA0015502, 0x00000002, 0x4029CE20, - 0xA0015602, 0x00000002, 0x0029CE84, 0xA0015604, 0x00000002, 0x4029CE20, - 0xA0015702, 0x00000002, 0x4029CE20, 0xA0015802, - // Block 9, offset 0x240 - 0x00000002, 0x4029CE20, 0xA0015902, 0x00000002, 0x4029CE20, 0xA0015A02, - 0x00000002, 0x4029CE20, 0xA0015B02, 0x00000002, 0x4029CE20, 0xA0015C02, - 0x00000002, 0x4029CE20, 0xA0015D02, 0x00000002, 0x4029CE20, 0xA0015E02, - 0x00000002, 0x4029CE20, 0xA0015F02, 0x00000002, 0x4029CE20, 0xA0016002, - 0x00000002, 0x4029CE20, 0xA0016102, 0x00000002, 0x4029CE20, 0xA0016202, - 0x00000002, 0x4029CE20, 0xA0016302, 0x00000002, 0x4029CE20, 0xA0016402, - 0x00000002, 0x4029CE20, 0xA0016502, 0x00000002, 0x4029CE20, 0xA0016602, - 0x00000002, 0x4029CE20, 0xA0016702, 0x00000002, 0x4029CE20, 0xA0016802, - 0x00000002, 0x4029CE20, 0xA0016802, 0x00000002, 0x4029CE20, 0xA0016802, - 0x00000002, 0x4029CE20, 0xA0016802, 0x00000002, 0x4029CE20, 0xA0016A02, - 0x00000002, 0x4029CE20, 0xA0016B02, 0x00000002, - // Block 10, offset 0x280 - 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, - 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, - 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, - 0x4029CE20, 0xA0016D02, 0x00000002, 0x4029CE20, 0xA0016E02, 0x00000002, - 0x4029CE20, 0xA0016F02, 0x00000002, 0x4029CE20, 0xA0017002, 0x00000002, - 0x4029CE20, 0xA0017102, 0x00000002, 0x4029CE20, 0xA0017202, 0x00000002, - 0x4029CE20, 0xA0017302, 0x00000002, 0x4029CE20, 0xA0017402, 0x00000002, - 0x4029CE20, 0xA0017502, 0x00000002, 0x4029CE20, 0xA0017602, 0x00000002, - 0x4029CE20, 0xA0017702, 0x00000004, 0x0029CE9E, 0x0009589E, 0x0029CE9E, - 0x0029CC9E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029D09E, 0x00000003, - 0x0029CE9E, 0x0009589E, 0x0029D29E, 0x00000003, - // Block 11, offset 0x2c0 - 0x0029CE9E, 0x0009589E, 0x0029D49E, 0x00000003, 0x0029CE9E, 0x0009589E, - 0x0029D69E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029D89E, 0x00000003, - 0x0029CE9E, 0x0009589E, 0x0029DA9E, 0x00000003, 0x0029CE9E, 0x0009589E, - 0x0029DC9E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029DE9E, 0x00000002, - 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CC86, 0x00000002, - 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CC86, 0x00000002, - 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CE86, 0x00000002, - 0x0029CE86, 0x0029D086, 0x00000002, 0x0029CE86, 0x0029D286, 0x00000002, - 0x0029CE86, 0x0029D486, 0x00000002, 0x0029CE86, 0x0029D686, 0x00000002, - 0x0029CE86, 0x0029D886, 0x00000002, 0x0029CE86, 0x0029DA86, 0x00000002, - 0x0029CE86, 0x0029DC86, 0x00000002, 0x0029CE86, - // Block 12, offset 0x300 - 0x0029DE86, 0x00000002, 0x4029D020, 0xA0013F02, 0x00000002, 0x4029D020, - 0xA0014002, 0x00000002, 0x4029D020, 0xA0014102, 0x00000002, 0x4029D020, - 0xA0014202, 0x00000002, 0x4029D020, 0xA0014302, 0x00000002, 0x4029D020, - 0xA0014402, 0x00000002, 0x4029D020, 0xA0014502, 0x00000002, 0x4029D020, - 0xA0014602, 0x00000002, 0x4029D020, 0xA0014702, 0x00000002, 0x4029D020, - 0xA0014802, 0x00000002, 0x4029D020, 0xA0014902, 0x00000002, 0x4029D020, - 0xA0014A02, 0x00000002, 0x4029D020, 0xA0014B02, 0x00000002, 0x4029D020, - 0xA0014B02, 0x00000002, 0x4029D020, 0xA0014B02, 0x00000002, 0x4029D020, - 0xA0014C02, 0x00000002, 0x4029D020, 0xA0014D02, 0x00000002, 0x4029D020, - 0xA0014E02, 0x00000002, 0x4029D020, 0xA0014F02, 0x00000002, 0x4029D020, - 0xA0015002, 0x00000002, 0x4029D020, 0xA0015102, - // Block 13, offset 0x340 - 0x00000002, 0x4029D020, 0xA0015202, 0x00000002, 0x4029D020, 0xA0015302, - 0x00000002, 0x4029D020, 0xA0015402, 0x00000002, 0x4029D020, 0xA0015502, - 0x00000002, 0x4029D020, 0xA0015602, 0x00000002, 0x0029D084, 0xA0015604, - 0x00000002, 0x4029D020, 0xA0015702, 0x00000002, 0x4029D020, 0xA0015802, - 0x00000002, 0x4029D020, 0xA0015902, 0x00000002, 0x4029D020, 0xA0015A02, - 0x00000002, 0x4029D020, 0xA0015B02, 0x00000002, 0x4029D020, 0xA0015C02, - 0x00000002, 0x4029D020, 0xA0015D02, 0x00000002, 0x4029D020, 0xA0015E02, - 0x00000002, 0x4029D020, 0xA0015F02, 0x00000002, 0x4029D020, 0xA0016002, - 0x00000002, 0x4029D020, 0xA0016102, 0x00000002, 0x4029D020, 0xA0016202, - 0x00000002, 0x4029D020, 0xA0016302, 0x00000002, 0x4029D020, 0xA0016402, - 0x00000002, 0x4029D020, 0xA0016502, 0x00000002, - // Block 14, offset 0x380 - 0x4029D020, 0xA0016602, 0x00000002, 0x4029D020, 0xA0016702, 0x00000002, - 0x4029D020, 0xA0016802, 0x00000002, 0x4029D020, 0xA0016802, 0x00000002, - 0x4029D020, 0xA0016802, 0x00000002, 0x4029D020, 0xA0016802, 0x00000002, - 0x4029D020, 0xA0016B02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, - 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, - 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, - 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, - 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, - 0x4029D020, 0xA0016E02, 0x00000002, 0x4029D020, 0xA0016F02, 0x00000002, - 0x4029D020, 0xA0017002, 0x00000002, 0x4029D020, 0xA0017102, 0x00000002, - 0x4029D020, 0xA0017202, 0x00000002, 0x4029D020, - // Block 15, offset 0x3c0 - 0xA0017302, 0x00000002, 0x4029D020, 0xA0017402, 0x00000002, 0x4029D020, - 0xA0017502, 0x00000002, 0x4029D020, 0xA0017602, 0x00000002, 0x4029D020, - 0xA0017702, 0x00000003, 0x0029D09E, 0x0009589E, 0x0029D29E, 0x00000003, - 0x0029D09E, 0x0009589E, 0x0029D69E, 0x00000002, 0x0029D086, 0x0029CC86, - 0x00000002, 0x0029D086, 0x0029CC86, 0x00000002, 0x4029D220, 0xA0013F02, - 0x00000002, 0x4029D220, 0xA0014002, 0x00000002, 0x4029D220, 0xA0014102, - 0x00000002, 0x4029D220, 0xA0014202, 0x00000002, 0x4029D220, 0xA0014302, - 0x00000002, 0x4029D220, 0xA0014402, 0x00000002, 0x4029D220, 0xA0014502, - 0x00000002, 0x4029D220, 0xA0014602, 0x00000002, 0x4029D220, 0xA0014702, - 0x00000002, 0x4029D220, 0xA0014802, 0x00000002, 0x4029D220, 0xA0014902, - 0x00000002, 0x4029D220, 0xA0014A02, 0x00000002, - // Block 16, offset 0x400 - 0x4029D220, 0xA0014B02, 0x00000002, 0x4029D220, 0xA0014B02, 0x00000002, - 0x4029D220, 0xA0014B02, 0x00000002, 0x4029D220, 0xA0014C02, 0x00000002, - 0x4029D220, 0xA0014D02, 0x00000002, 0x4029D220, 0xA0014E02, 0x00000002, - 0x4029D220, 0xA0014F02, 0x00000002, 0x4029D220, 0xA0015002, 0x00000002, - 0x4029D220, 0xA0015102, 0x00000002, 0x4029D220, 0xA0015202, 0x00000002, - 0x4029D220, 0xA0015302, 0x00000002, 0x4029D220, 0xA0015402, 0x00000002, - 0x4029D220, 0xA0015502, 0x00000002, 0x4029D220, 0xA0015602, 0x00000002, - 0x0029D284, 0xA0015604, 0x00000002, 0x4029D220, 0xA0015702, 0x00000002, - 0x4029D220, 0xA0015802, 0x00000002, 0x4029D220, 0xA0015902, 0x00000002, - 0x4029D220, 0xA0015A02, 0x00000002, 0x4029D220, 0xA0015B02, 0x00000002, - 0x4029D220, 0xA0015C02, 0x00000002, 0x4029D220, - // Block 17, offset 0x440 - 0xA0015D02, 0x00000002, 0x4029D220, 0xA0015E02, 0x00000002, 0x4029D220, - 0xA0015F02, 0x00000002, 0x4029D220, 0xA0016002, 0x00000002, 0x4029D220, - 0xA0016102, 0x00000002, 0x4029D220, 0xA0016202, 0x00000002, 0x4029D220, - 0xA0016302, 0x00000002, 0x4029D220, 0xA0016402, 0x00000002, 0x4029D220, - 0xA0016502, 0x00000002, 0x4029D220, 0xA0016602, 0x00000002, 0x4029D220, - 0xA0016702, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, - 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, - 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, - 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, - 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, - 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, - // Block 18, offset 0x480 - 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, - 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016E02, - 0x00000002, 0x4029D220, 0xA0016F02, 0x00000002, 0x4029D220, 0xA0017002, - 0x00000002, 0x4029D220, 0xA0017102, 0x00000002, 0x4029D220, 0xA0017202, - 0x00000002, 0x4029D220, 0xA0017302, 0x00000002, 0x4029D220, 0xA0017402, - 0x00000002, 0x4029D220, 0xA0017502, 0x00000002, 0x4029D220, 0xA0017602, - 0x00000002, 0x4029D220, 0xA0017702, 0x00000003, 0x0029D29E, 0x0009589E, - 0x0029D49E, 0x00000003, 0x0029D29E, 0x0009589E, 0x0029D69E, 0x00000003, - 0x0029D29E, 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029D286, 0x0029CC86, - 0x00000002, 0x4029D420, 0xA0013F02, 0x00000002, 0x4029D420, 0xA0014002, - 0x00000002, 0x4029D420, 0xA0014102, 0x00000002, - // Block 19, offset 0x4c0 - 0x4029D420, 0xA0014202, 0x00000002, 0x4029D420, 0xA0014302, 0x00000002, - 0x4029D420, 0xA0014402, 0x00000002, 0x4029D420, 0xA0014502, 0x00000002, - 0x4029D420, 0xA0014602, 0x00000002, 0x4029D420, 0xA0014702, 0x00000002, - 0x4029D420, 0xA0014802, 0x00000002, 0x4029D420, 0xA0014902, 0x00000002, - 0x4029D420, 0xA0014A02, 0x00000002, 0x4029D420, 0xA0014B02, 0x00000002, - 0x4029D420, 0xA0014C02, 0x00000002, 0x4029D420, 0xA0014D02, 0x00000002, - 0x4029D420, 0xA0014E02, 0x00000002, 0x4029D420, 0xA0014F02, 0x00000002, - 0x4029D420, 0xA0015002, 0x00000002, 0x4029D420, 0xA0015102, 0x00000002, - 0x4029D420, 0xA0015202, 0x00000002, 0x4029D420, 0xA0015302, 0x00000002, - 0x4029D420, 0xA0015402, 0x00000002, 0x4029D420, 0xA0015502, 0x00000002, - 0x4029D420, 0xA0015602, 0x00000002, 0x0029D484, - // Block 20, offset 0x500 - 0xA0015604, 0x00000002, 0x4029D420, 0xA0015702, 0x00000002, 0x4029D420, - 0xA0015802, 0x00000002, 0x4029D420, 0xA0015902, 0x00000002, 0x4029D420, - 0xA0015A02, 0x00000002, 0x4029D420, 0xA0015B02, 0x00000002, 0x4029D420, - 0xA0015C02, 0x00000002, 0x4029D420, 0xA0015D02, 0x00000002, 0x4029D420, - 0xA0015E02, 0x00000002, 0x4029D420, 0xA0015F02, 0x00000002, 0x4029D420, - 0xA0016002, 0x00000002, 0x4029D420, 0xA0016102, 0x00000002, 0x4029D420, - 0xA0016202, 0x00000002, 0x4029D420, 0xA0016302, 0x00000002, 0x4029D420, - 0xA0016402, 0x00000002, 0x4029D420, 0xA0016502, 0x00000002, 0x4029D420, - 0xA0016602, 0x00000002, 0x4029D420, 0xA0016702, 0x00000002, 0x4029D420, - 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, - 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - // Block 21, offset 0x540 - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, - 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0017002, - 0x00000002, 0x4029D420, 0xA0017102, 0x00000002, 0x4029D420, 0xA0017202, - 0x00000002, 0x4029D420, 0xA0017302, 0x00000002, 0x4029D420, 0xA0017402, - 0x00000002, 0x4029D420, 0xA0017502, 0x00000002, 0x4029D420, 0xA0017602, - 0x00000002, 0x4029D420, 0xA0017702, 0x00000003, 0x0029D49E, 0x0009589E, - 0x0029D69E, 0x00000002, 0x0029D486, 0x0029CC86, - // Block 22, offset 0x580 - 0x00000002, 0x4029D620, 0xA0013F02, 0x00000002, 0x4029D620, 0xA0014002, - 0x00000002, 0x4029D620, 0xA0014102, 0x00000002, 0x4029D620, 0xA0014202, - 0x00000002, 0x4029D620, 0xA0014302, 0x00000002, 0x4029D620, 0xA0014402, - 0x00000002, 0x4029D620, 0xA0014502, 0x00000002, 0x4029D620, 0xA0014602, - 0x00000002, 0x4029D620, 0xA0014702, 0x00000002, 0x4029D620, 0xA0014802, - 0x00000002, 0x4029D620, 0xA0014902, 0x00000002, 0x4029D620, 0xA0014A02, - 0x00000002, 0x4029D620, 0xA0014B02, 0x00000002, 0x4029D620, 0xA0014C02, - 0x00000002, 0x4029D620, 0xA0014D02, 0x00000002, 0x4029D620, 0xA0014E02, - 0x00000002, 0x4029D620, 0xA0014F02, 0x00000002, 0x4029D620, 0xA0015002, - 0x00000002, 0x4029D620, 0xA0015102, 0x00000002, 0x4029D620, 0xA0015202, - 0x00000002, 0x4029D620, 0xA0015302, 0x00000002, - // Block 23, offset 0x5c0 - 0x4029D620, 0xA0015402, 0x00000002, 0x4029D620, 0xA0015502, 0x00000002, - 0x4029D620, 0xA0015602, 0x00000002, 0x0029D684, 0xA0015604, 0x00000002, - 0x4029D620, 0xA0015702, 0x00000002, 0x4029D620, 0xA0015802, 0x00000002, - 0x4029D620, 0xA0015902, 0x00000002, 0x4029D620, 0xA0015A02, 0x00000002, - 0x4029D620, 0xA0015B02, 0x00000002, 0x4029D620, 0xA0015C02, 0x00000002, - 0x4029D620, 0xA0015D02, 0x00000002, 0x4029D620, 0xA0015E02, 0x00000002, - 0x4029D620, 0xA0015F02, 0x00000002, 0x4029D620, 0xA0016002, 0x00000002, - 0x4029D620, 0xA0016102, 0x00000002, 0x4029D620, 0xA0016202, 0x00000002, - 0x4029D620, 0xA0016302, 0x00000002, 0x4029D620, 0xA0016402, 0x00000002, - 0x4029D620, 0xA0016502, 0x00000002, 0x4029D620, 0xA0016602, 0x00000002, - 0x4029D620, 0xA0016702, 0x00000002, 0x4029D620, - // Block 24, offset 0x600 - 0xA0016802, 0x00000002, 0x4029D620, 0xA0016802, 0x00000002, 0x4029D620, - 0xA0016802, 0x00000002, 0x4029D620, 0xA0016802, 0x00000002, 0x4029D620, - 0xA0016802, 0x00000002, 0x4029D620, 0xA0016A02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, - 0xA0016C02, 0x00000002, 0x4029D620, 0xA0017202, 0x00000002, 0x4029D620, - 0xA0017302, 0x00000002, 0x4029D620, 0xA0017402, 0x00000002, 0x4029D620, - 0xA0017502, 0x00000002, 0x4029D620, 0xA0017702, - // Block 25, offset 0x640 - 0x00000003, 0x0029D69E, 0x0009589E, 0x0029D89E, 0x00000003, 0x0029D69E, - 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029D686, 0x0029CC86, 0x00000002, - 0x4029D820, 0xA0013F02, 0x00000002, 0x4029D820, 0xA0014002, 0x00000002, - 0x4029D820, 0xA0014102, 0x00000002, 0x4029D820, 0xA0014202, 0x00000002, - 0x4029D820, 0xA0014302, 0x00000002, 0x4029D820, 0xA0014402, 0x00000002, - 0x4029D820, 0xA0014502, 0x00000002, 0x4029D820, 0xA0014602, 0x00000002, - 0x4029D820, 0xA0014702, 0x00000002, 0x4029D820, 0xA0014802, 0x00000002, - 0x4029D820, 0xA0014902, 0x00000002, 0x4029D820, 0xA0014A02, 0x00000002, - 0x4029D820, 0xA0014B02, 0x00000002, 0x4029D820, 0xA0014C02, 0x00000002, - 0x4029D820, 0xA0014D02, 0x00000002, 0x4029D820, 0xA0014E02, 0x00000002, - 0x4029D820, 0xA0014F02, 0x00000002, 0x4029D820, - // Block 26, offset 0x680 - 0xA0015002, 0x00000002, 0x4029D820, 0xA0015102, 0x00000002, 0x4029D820, - 0xA0015202, 0x00000002, 0x4029D820, 0xA0015302, 0x00000002, 0x4029D820, - 0xA0015402, 0x00000002, 0x4029D820, 0xA0015502, 0x00000002, 0x4029D820, - 0xA0015602, 0x00000002, 0x0029D884, 0xA0015604, 0x00000002, 0x4029D820, - 0xA0015702, 0x00000002, 0x4029D820, 0xA0015802, 0x00000002, 0x4029D820, - 0xA0015902, 0x00000002, 0x4029D820, 0xA0015A02, 0x00000002, 0x4029D820, - 0xA0015B02, 0x00000002, 0x4029D820, 0xA0015C02, 0x00000002, 0x4029D820, - 0xA0015D02, 0x00000002, 0x4029D820, 0xA0015E02, 0x00000002, 0x4029D820, - 0xA0015F02, 0x00000002, 0x4029D820, 0xA0016002, 0x00000002, 0x4029D820, - 0xA0016102, 0x00000002, 0x4029D820, 0xA0016202, 0x00000002, 0x4029D820, - 0xA0016302, 0x00000002, 0x4029D820, 0xA0016402, - // Block 27, offset 0x6c0 - 0x00000002, 0x4029D820, 0xA0016502, 0x00000002, 0x4029D820, 0xA0016602, - 0x00000002, 0x4029D820, 0xA0016702, 0x00000002, 0x4029D820, 0xA0016902, - 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, - 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, - 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, - 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0017202, - 0x00000002, 0x4029D820, 0xA0017302, 0x00000002, 0x4029D820, 0xA0017402, - 0x00000002, 0x4029D820, 0xA0017502, 0x00000002, 0x4029D820, 0xA0017702, - 0x00000002, 0x0029D886, 0x0029CC86, 0x00000002, 0x4029DA20, 0xA0013F02, - 0x00000002, 0x4029DA20, 0xA0014002, 0x00000002, 0x4029DA20, 0xA0014102, - 0x00000002, 0x4029DA20, 0xA0014202, 0x00000002, - // Block 28, offset 0x700 - 0x4029DA20, 0xA0014302, 0x00000002, 0x4029DA20, 0xA0014402, 0x00000002, - 0x4029DA20, 0xA0014502, 0x00000002, 0x4029DA20, 0xA0014602, 0x00000002, - 0x4029DA20, 0xA0014702, 0x00000002, 0x4029DA20, 0xA0014802, 0x00000002, - 0x4029DA20, 0xA0014902, 0x00000002, 0x4029DA20, 0xA0014A02, 0x00000002, - 0x4029DA20, 0xA0014B02, 0x00000002, 0x4029DA20, 0xA0014C02, 0x00000002, - 0x4029DA20, 0xA0014D02, 0x00000002, 0x4029DA20, 0xA0014E02, 0x00000002, - 0x4029DA20, 0xA0014F02, 0x00000002, 0x4029DA20, 0xA0015002, 0x00000002, - 0x4029DA20, 0xA0015102, 0x00000002, 0x4029DA20, 0xA0015202, 0x00000002, - 0x4029DA20, 0xA0015302, 0x00000002, 0x4029DA20, 0xA0015402, 0x00000002, - 0x4029DA20, 0xA0015502, 0x00000002, 0x4029DA20, 0xA0015602, 0x00000002, - 0x0029DA84, 0xA0015604, 0x00000002, 0x4029DA20, - // Block 29, offset 0x740 - 0xA0015702, 0x00000002, 0x4029DA20, 0xA0015802, 0x00000002, 0x4029DA20, - 0xA0015902, 0x00000002, 0x4029DA20, 0xA0015A02, 0x00000002, 0x4029DA20, - 0xA0015B02, 0x00000002, 0x4029DA20, 0xA0015C02, 0x00000002, 0x4029DA20, - 0xA0015D02, 0x00000002, 0x4029DA20, 0xA0015E02, 0x00000002, 0x4029DA20, - 0xA0015F02, 0x00000002, 0x4029DA20, 0xA0016002, 0x00000002, 0x4029DA20, - 0xA0016102, 0x00000002, 0x4029DA20, 0xA0016202, 0x00000002, 0x4029DA20, - 0xA0016302, 0x00000002, 0x4029DA20, 0xA0016402, 0x00000002, 0x4029DA20, - 0xA0016502, 0x00000002, 0x4029DA20, 0xA0016602, 0x00000002, 0x4029DA20, - 0xA0016702, 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, - 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, - 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, - // Block 30, offset 0x780 - 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, - 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0017202, - 0x00000002, 0x4029DA20, 0xA0017302, 0x00000002, 0x4029DA20, 0xA0017402, - 0x00000002, 0x4029DA20, 0xA0017502, 0x00000002, 0x4029DA20, 0xA0017702, - 0x00000003, 0x0029DA9E, 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029DA86, - 0x0029CC86, 0x00000002, 0x4029DC20, 0xA0013F02, 0x00000002, 0x4029DC20, - 0xA0014002, 0x00000002, 0x4029DC20, 0xA0014102, 0x00000002, 0x4029DC20, - 0xA0014202, 0x00000002, 0x4029DC20, 0xA0014302, 0x00000002, 0x4029DC20, - 0xA0014402, 0x00000002, 0x4029DC20, 0xA0014502, 0x00000002, 0x4029DC20, - 0xA0014602, 0x00000002, 0x4029DC20, 0xA0014702, 0x00000002, 0x4029DC20, - 0xA0014802, 0x00000002, 0x4029DC20, 0xA0014902, - // Block 31, offset 0x7c0 - 0x00000002, 0x4029DC20, 0xA0014A02, 0x00000002, 0x4029DC20, 0xA0014B02, - 0x00000002, 0x4029DC20, 0xA0014C02, 0x00000002, 0x4029DC20, 0xA0014D02, - 0x00000002, 0x4029DC20, 0xA0014E02, 0x00000002, 0x4029DC20, 0xA0014F02, - 0x00000002, 0x4029DC20, 0xA0015002, 0x00000002, 0x4029DC20, 0xA0015102, - 0x00000002, 0x4029DC20, 0xA0015202, 0x00000002, 0x4029DC20, 0xA0015302, - 0x00000002, 0x4029DC20, 0xA0015402, 0x00000002, 0x4029DC20, 0xA0015502, - 0x00000002, 0x4029DC20, 0xA0015602, 0x00000002, 0x0029DC84, 0xA0015604, - 0x00000002, 0x4029DC20, 0xA0015702, 0x00000002, 0x4029DC20, 0xA0015802, - 0x00000002, 0x4029DC20, 0xA0015902, 0x00000002, 0x4029DC20, 0xA0015A02, - 0x00000002, 0x4029DC20, 0xA0015B02, 0x00000002, 0x4029DC20, 0xA0015C02, - 0x00000002, 0x4029DC20, 0xA0015D02, 0x00000002, - // Block 32, offset 0x800 - 0x4029DC20, 0xA0015E02, 0x00000002, 0x4029DC20, 0xA0015F02, 0x00000002, - 0x4029DC20, 0xA0016002, 0x00000002, 0x4029DC20, 0xA0016102, 0x00000002, - 0x4029DC20, 0xA0016202, 0x00000002, 0x4029DC20, 0xA0016302, 0x00000002, - 0x4029DC20, 0xA0016402, 0x00000002, 0x4029DC20, 0xA0016502, 0x00000002, - 0x4029DC20, 0xA0016602, 0x00000002, 0x4029DC20, 0xA0016702, 0x00000002, - 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, - 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, - 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, - 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0017202, 0x00000002, - 0x4029DC20, 0xA0017302, 0x00000002, 0x4029DC20, 0xA0017402, 0x00000002, - 0x4029DC20, 0xA0017502, 0x00000002, 0x4029DC20, - // Block 33, offset 0x840 - 0xA0017702, 0x00000002, 0x0029DC86, 0x0029CC86, 0x00000002, 0x4029DE20, - 0xA0013F02, 0x00000002, 0x4029DE20, 0xA0014002, 0x00000002, 0x4029DE20, - 0xA0014102, 0x00000002, 0x4029DE20, 0xA0014202, 0x00000002, 0x4029DE20, - 0xA0014302, 0x00000002, 0x4029DE20, 0xA0014402, 0x00000002, 0x4029DE20, - 0xA0014502, 0x00000002, 0x4029DE20, 0xA0014602, 0x00000002, 0x4029DE20, - 0xA0014702, 0x00000002, 0x4029DE20, 0xA0014802, 0x00000002, 0x4029DE20, - 0xA0014902, 0x00000002, 0x4029DE20, 0xA0014A02, 0x00000002, 0x4029DE20, - 0xA0014B02, 0x00000002, 0x4029DE20, 0xA0014C02, 0x00000002, 0x4029DE20, - 0xA0014D02, 0x00000002, 0x4029DE20, 0xA0014E02, 0x00000002, 0x4029DE20, - 0xA0014F02, 0x00000002, 0x4029DE20, 0xA0015002, 0x00000002, 0x4029DE20, - 0xA0015102, 0x00000002, 0x4029DE20, 0xA0015202, - // Block 34, offset 0x880 - 0x00000002, 0x4029DE20, 0xA0015302, 0x00000002, 0x4029DE20, 0xA0015402, - 0x00000002, 0x4029DE20, 0xA0015502, 0x00000002, 0x4029DE20, 0xA0015602, - 0x00000002, 0x0029DE84, 0xA0015604, 0x00000002, 0x4029DE20, 0xA0015702, - 0x00000002, 0x4029DE20, 0xA0015802, 0x00000002, 0x4029DE20, 0xA0015902, - 0x00000002, 0x4029DE20, 0xA0015A02, 0x00000002, 0x4029DE20, 0xA0015B02, - 0x00000002, 0x4029DE20, 0xA0015C02, 0x00000002, 0x4029DE20, 0xA0015D02, - 0x00000002, 0x4029DE20, 0xA0015E02, 0x00000002, 0x4029DE20, 0xA0015F02, - 0x00000002, 0x4029DE20, 0xA0016002, 0x00000002, 0x4029DE20, 0xA0016102, - 0x00000002, 0x4029DE20, 0xA0016202, 0x00000002, 0x4029DE20, 0xA0016302, - 0x00000002, 0x4029DE20, 0xA0016402, 0x00000002, 0x4029DE20, 0xA0016502, - 0x00000002, 0x4029DE20, 0xA0016602, 0x00000002, - // Block 35, offset 0x8c0 - 0x4029DE20, 0xA0016702, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, - 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, - 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, - 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, - 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, - 0x4029DE20, 0xA0017202, 0x00000002, 0x4029DE20, 0xA0017302, 0x00000002, - 0x4029DE20, 0xA0017402, 0x00000002, 0x4029DE20, 0xA0017502, 0x00000002, - 0x4029DE20, 0xA0017702, 0x00000002, 0x402BDE20, 0xAE603202, 0x00000002, - 0x002BDE88, 0xAE603202, 0x00000002, 0x402BDE20, 0xAE603502, 0x00000002, - 0x002BDE88, 0xAE603502, 0x00000002, 0x402BDE20, 0xAE603702, 0x00000002, - 0x002BDE88, 0xAE603702, 0x00000003, 0x402BDE20, - // Block 36, offset 0x900 - 0xAE603702, 0xAE603202, 0x00000003, 0x002BDE88, 0xAE603702, 0xAE603202, - 0x00000003, 0x402BDE20, 0xAE603702, 0xAE603502, 0x00000003, 0x002BDE88, - 0xAE603702, 0xAE603502, 0x00000003, 0x402BDE20, 0xAE603702, 0xAE604E02, - 0x00000003, 0x002BDE88, 0xAE603702, 0xAE604E02, 0x00000003, 0x402BDE20, - 0xAE603702, 0xAE606402, 0x00000003, 0x002BDE88, 0xAE603702, 0xAE606402, - 0x00000002, 0x402BDE20, 0xAE603C02, 0x00000002, 0x002BDE88, 0xAE603C02, - 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE603202, 0x00000003, 0x002BDE88, - 0xAE603C02, 0xAE603202, 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE603502, - 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE603502, 0x00000003, 0x402BDE20, - 0xAE603C02, 0xAE604E02, 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE604E02, - 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE606402, - // Block 37, offset 0x940 - 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE606402, 0x00000002, 0x402BDE20, - 0xAE604102, 0x00000002, 0x002BDE88, 0xAE604102, 0x00000002, 0x402BDE20, - 0xAE604302, 0x00000002, 0x002BDE88, 0xAE604302, 0x00000003, 0x402BDE20, - 0xAE604302, 0xAE603202, 0x00000003, 0x002BDE88, 0xAE604302, 0xAE603202, - 0x00000002, 0x402BDE20, 0xAE604702, 0x00000002, 0x002BDE88, 0xAE604702, - 0x00000003, 0x402BDE20, 0xAE604702, 0xAE605B02, 0x00000003, 0x002BDE88, - 0xAE604702, 0xAE605B02, 0x00000002, 0x402BDE20, 0xAE604E02, 0x00000002, - 0x002BDE88, 0xAE604E02, 0x00000002, 0x402BDE20, 0xAE605202, 0x00000002, - 0x002BDE88, 0xAE605202, 0x00000003, 0x402BDE20, 0xAE605202, 0xAE605B02, - 0x00000003, 0x002BDE88, 0xAE605202, 0xAE605B02, 0x00000002, 0x402BDE20, - 0xACA05902, 0x00000002, 0x002BDE88, 0xACA05902, - // Block 38, offset 0x980 - 0x00000002, 0x402BDE20, 0xAE605B02, 0x00000002, 0x002BDE88, 0xAE605B02, - 0x00000002, 0x402BDE20, 0xAE606402, 0x00000002, 0x002BDE88, 0xAE606402, - 0x00000002, 0x402BDE20, 0xAE606502, 0x00000002, 0x002BDE88, 0xAE606502, - 0x00000002, 0x402BDE20, 0xAE606702, 0x00000002, 0x002BDE88, 0xAE606702, - 0x00000002, 0x402BDE20, 0xADC07002, 0x00000002, 0x002BDE88, 0xADC07002, - 0x00000003, 0x402BDE20, 0xADC07002, 0xAE603702, 0x00000003, 0x002BDE88, - 0xADC07002, 0xAE603702, 0x00000003, 0x402BDE20, 0xADC07002, 0xAE603C02, - 0x00000003, 0x002BDE88, 0xADC07002, 0xAE603C02, 0x00000002, 0x402BDE20, - 0xADC07602, 0x00000002, 0x002BDE88, 0xADC07602, 0x00000002, 0x84E615EF, - 0xAE613904, 0x00000004, 0x002BDE9C, 0x0002E49C, 0x002E829C, 0x0002E49C, - 0x00000003, 0x002BDE84, 0x0004E284, 0x002C3A84, - // Block 39, offset 0x9c0 - 0x00000003, 0x002BDE84, 0x0004E284, 0x002FE684, 0x00000003, 0x002BDE8A, - 0x0004E284, 0x002FE68A, 0x00000003, 0x002BDE9D, 0x0009569C, 0x002E829C, - 0x00000002, 0x002BDE84, 0x002BDE84, 0x00000002, 0x002BDE8A, 0x002BDE8A, - 0x00000002, 0x002BDE9D, 0x002C0A9D, 0x00000003, 0x002BDE84, 0xA0013904, - 0x002C9884, 0x00000003, 0x84E615EF, 0xAE613904, 0x84E6164C, 0x00000003, - 0x002BDE8A, 0xA0013904, 0x002C988A, 0x00000003, 0x002BDE94, 0xA0013914, - 0x002C9894, 0x00000004, 0x002BDE84, 0xA0013904, 0x002C9884, 0xAE603202, - 0x00000004, 0x002BDE8A, 0xA0013904, 0x002C988A, 0xAE603202, 0x00000004, - 0x002BDE84, 0xA0013904, 0x002C9884, 0xAE605B02, 0x00000004, 0x002BDE8A, - 0xA0013904, 0x002C988A, 0xAE605B02, 0x00000002, 0x84E615EF, 0x84E61771, - 0x00000002, 0x002BDE84, 0x002EE284, 0x00000002, - // Block 40, offset 0xa00 - 0x002BDE8A, 0x002EE28A, 0x00000002, 0x002BDE84, 0x00306C84, 0x00000002, - 0x002BDE8A, 0x00306C8A, 0x00000002, 0x84E615EF, 0x84E6185F, 0x00000002, - 0x002BDE84, 0x0030BE84, 0x00000002, 0x002BDE8A, 0x0030BE8A, 0x00000003, - 0x002BDE84, 0xA0013904, 0x0030BE84, 0x00000003, 0x002BDE8A, 0xA0013904, - 0x0030BE8A, 0x00000002, 0x002BDE84, 0x00310084, 0x00000002, 0x002BDE8A, - 0x0031008A, 0x00000002, 0x402C0A20, 0xAE605202, 0x00000002, 0x002C0A88, - 0xAE605202, 0x00000002, 0x402C0A20, 0xADC07002, 0x00000002, 0x002C0A88, - 0xADC07002, 0x00000002, 0x402C0A20, 0xADC07B02, 0x00000002, 0x002C0A88, - 0xADC07B02, 0x00000003, 0x002C0A9C, 0x002BDE9C, 0x002F7A9C, 0x00000002, - 0x402C3A20, 0xAE603202, 0x00000002, 0x002C3A88, 0xAE603202, 0x00000002, - 0x402C3A20, 0xAE603C02, 0x00000002, 0x002C3A88, - // Block 41, offset 0xa40 - 0xAE603C02, 0x00000002, 0x402C3A20, 0xAE604102, 0x00000002, 0x002C3A88, - 0xAE604102, 0x00000002, 0x402C3A20, 0xAE605202, 0x00000002, 0x002C3A88, - 0xAE605202, 0x00000002, 0x402C3A20, 0xACA05602, 0x00000002, 0x84E6161D, - 0xAE605604, 0x00000002, 0x002C3A88, 0xACA05602, 0x00000003, 0x402C3A20, - 0xACA05602, 0xAE603202, 0x00000003, 0x002C3A88, 0xACA05602, 0xAE603202, - 0x00000003, 0x002C3A84, 0x0004E284, 0x002EE284, 0x00000003, 0x002C3A84, - 0x0004E284, 0x00306C84, 0x00000004, 0x002C3A9D, 0x0009569C, 0x002DFE9C, - 0x002D229C, 0x00000003, 0x002C3A9C, 0x002BDE9C, 0x002E229C, 0x00000002, - 0x002C3A9D, 0x002E229D, 0x00000003, 0x002C3A9C, 0x002E829C, 0x0029D09C, - 0x00000003, 0x002C3A9C, 0x002E829C, 0x0029D29C, 0x00000003, 0x002C3A9D, - 0x002EE29C, 0x0002E49C, 0x00000004, 0x002C3A9D, - // Block 42, offset 0xa80 - 0x002EE29D, 0x002EE29D, 0x002E229D, 0x00000002, 0x402C6220, 0xAE604102, - 0x00000002, 0x002C6288, 0xAE604102, 0x00000002, 0x402C6220, 0xAE605202, - 0x00000002, 0x002C6288, 0xAE605202, 0x00000002, 0x402C6220, 0xACA05602, - 0x00000002, 0x002C6288, 0xACA05602, 0x00000002, 0x402C6220, 0xADC07002, - 0x00000002, 0x002C6288, 0xADC07002, 0x00000002, 0x402C6220, 0xADC07802, - 0x00000002, 0x002C6288, 0xADC07802, 0x00000002, 0x402C6220, 0xADC07B02, - 0x00000002, 0x002C6288, 0xADC07B02, 0x00000002, 0x402C6220, 0xA0007D02, - 0x00000002, 0x002C6288, 0xA0007D02, 0x00000002, 0x002C6284, 0xA0013904, - 0x00000002, 0x84E61631, 0xAE613904, 0x00000002, 0x002C628A, 0xA0013904, - 0x00000002, 0x84E61631, 0xAE613A04, 0x00000002, 0x002C6284, 0xA0013A04, - 0x00000002, 0x002C628A, 0xA0013A04, 0x00000002, - // Block 43, offset 0xac0 - 0x002C6284, 0x002C0A84, 0x00000003, 0x002C629C, 0x002E829C, 0x0029D09C, - 0x00000003, 0x002C629C, 0x002E829C, 0x0029D29C, 0x00000002, 0x002C6284, - 0x00312A84, 0x00000003, 0x002C6284, 0x00312A84, 0xA0004104, 0x00000003, - 0x002C628A, 0x00312A84, 0xA0004104, 0x00000003, 0x002C628A, 0x00312A8A, - 0xA0004104, 0x00000002, 0x002C6284, 0x00315084, 0x00000002, 0x002C6284, - 0x00316484, 0x00000002, 0x402C9820, 0xAE603202, 0x00000002, 0x002C9888, - 0xAE603202, 0x00000002, 0x402C9820, 0xAE603502, 0x00000002, 0x002C9888, - 0xAE603502, 0x00000002, 0x402C9820, 0xAE603702, 0x00000002, 0x002C9888, - 0xAE603702, 0x00000002, 0x402C9820, 0xAE603C02, 0x00000002, 0x002C9888, - 0xAE603C02, 0x00000003, 0x402C9820, 0xAE603C02, 0xAE603202, 0x00000003, - 0x002C9888, 0xAE603C02, 0xAE603202, 0x00000003, - // Block 44, offset 0xb00 - 0x402C9820, 0xAE603C02, 0xAE603502, 0x00000003, 0x002C9888, 0xAE603C02, - 0xAE603502, 0x00000003, 0x402C9820, 0xAE603C02, 0xAE604E02, 0x00000003, - 0x002C9888, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C9820, 0xAE603C02, - 0xAE606402, 0x00000003, 0x002C9888, 0xAE603C02, 0xAE606402, 0x00000002, - 0x402C9820, 0xAE604102, 0x00000002, 0x002C9888, 0xAE604102, 0x00000002, - 0x402C9820, 0xAE604702, 0x00000002, 0x002C9888, 0xAE604702, 0x00000002, - 0x402C9820, 0xAE604E02, 0x00000002, 0x002C9888, 0xAE604E02, 0x00000002, - 0x402C9820, 0xAE605202, 0x00000002, 0x002C9888, 0xAE605202, 0x00000002, - 0x402C9820, 0xACA05602, 0x00000002, 0x002C9888, 0xACA05602, 0x00000003, - 0x402C9820, 0xACA05602, 0xAE603702, 0x00000003, 0x002C9888, 0xACA05602, - 0xAE603702, 0x00000002, 0x402C9820, 0xACA05902, - // Block 45, offset 0xb40 - 0x00000002, 0x002C9888, 0xACA05902, 0x00000002, 0x402C9820, 0xAE605B02, - 0x00000002, 0x002C9888, 0xAE605B02, 0x00000003, 0x402C9820, 0xAE605B02, - 0xAE603202, 0x00000003, 0x002C9888, 0xAE605B02, 0xAE603202, 0x00000003, - 0x402C9820, 0xAE605B02, 0xAE603502, 0x00000003, 0x002C9888, 0xAE605B02, - 0xAE603502, 0x00000002, 0x402C9820, 0xAE606402, 0x00000002, 0x002C9888, - 0xAE606402, 0x00000002, 0x402C9820, 0xAE606502, 0x00000002, 0x002C9888, - 0xAE606502, 0x00000002, 0x402C9820, 0xAE606702, 0x00000002, 0x002C9888, - 0xAE606702, 0x00000002, 0x402C9820, 0xADC07002, 0x00000002, 0x002C9888, - 0xADC07002, 0x00000003, 0x402C9820, 0xADC07002, 0xAE603C02, 0x00000003, - 0x002C9888, 0xADC07002, 0xAE603C02, 0x00000002, 0x402C9820, 0xADC07802, - 0x00000002, 0x002C9888, 0xADC07802, 0x00000002, - // Block 46, offset 0xb80 - 0x402C9820, 0xADC07A02, 0x00000002, 0x002C9888, 0xADC07A02, 0x00000003, - 0x002C989C, 0x002F7A9C, 0x002D229C, 0x00000002, 0x402D0820, 0xAE605202, - 0x00000002, 0x002D0888, 0xAE605202, 0x00000002, 0x002D0884, 0xA0013A04, - 0x00000002, 0x002D088A, 0xA0013A04, 0x00000003, 0x002D088A, 0x002BDE8A, - 0x0030F68A, 0x00000003, 0x002D0884, 0x002D0884, 0x002D9A84, 0x00000003, - 0x002D0884, 0x002D0884, 0x002E2284, 0x00000002, 0x002D0884, 0x002EDA84, - 0x00000004, 0x002D089D, 0x002F7A9D, 0x002C989D, 0x002C989D, 0x00000002, - 0x402D2220, 0xAE603202, 0x00000002, 0x002D2288, 0xAE603202, 0x00000002, - 0x402D2220, 0xAE603702, 0x00000002, 0x002D2288, 0xAE603702, 0x00000002, - 0x402D2220, 0xAE603C02, 0x00000002, 0x002D2288, 0xAE603C02, 0x00000002, - 0x402D2220, 0xAE604102, 0x00000002, 0x002D2288, - // Block 47, offset 0xbc0 - 0xAE604102, 0x00000002, 0x402D2220, 0xAE605202, 0x00000002, 0x002D2288, - 0xAE605202, 0x00000002, 0x402D2220, 0xACA05602, 0x00000002, 0x002D2288, - 0xACA05602, 0x00000002, 0x402D2220, 0xAE605B02, 0x00000002, 0x002D2288, - 0xAE605B02, 0x00000002, 0x002D2284, 0xA0006104, 0x00000002, 0x002D228A, - 0xA0006104, 0x00000002, 0x002D2284, 0xA0013A04, 0x00000002, 0x002D228A, - 0xA0013A04, 0x00000003, 0x002D229C, 0x002BDE9C, 0x002E229C, 0x00000003, - 0x002D229D, 0x002D689D, 0x00312A9C, 0x00000003, 0x002D229D, 0x002F2C9D, - 0x002BDE9C, 0x00000002, 0x402D6820, 0xAE603C02, 0x00000002, 0x002D6888, - 0xAE603C02, 0x00000002, 0x402D6820, 0xAE604102, 0x00000002, 0x002D6888, - 0xAE604102, 0x00000002, 0x402D6820, 0xAE604702, 0x00000002, 0x002D6888, - 0xAE604702, 0x00000002, 0x402D6820, 0xAE605202, - // Block 48, offset 0xc00 - 0x00000002, 0x002D6888, 0xAE605202, 0x00000002, 0x402D6820, 0xACA05602, - 0x00000002, 0x002D6888, 0xACA05602, 0x00000002, 0x402D6820, 0xADC07002, - 0x00000002, 0x002D6888, 0xADC07002, 0x00000002, 0x402D6820, 0xADC07902, - 0x00000002, 0x002D6888, 0xADC07902, 0x00000002, 0x402D6820, 0xADC07B02, - 0x00000002, 0x402D6820, 0xA0007D02, 0x00000002, 0x002D6888, 0xA0007D02, - 0x00000003, 0x002D689C, 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402D9A20, - 0xAE603202, 0x00000002, 0x002D9A88, 0xAE603202, 0x00000002, 0x402D9A20, - 0xAE603502, 0x00000002, 0x002D9A88, 0xAE603502, 0x00000002, 0x402D9A20, - 0xAE603702, 0x00000002, 0x002D9A88, 0xAE603702, 0x00000002, 0x402D9A20, - 0xAE603C02, 0x00000002, 0x002D9A88, 0xAE603C02, 0x00000002, 0x402D9A20, - 0xAE604102, 0x00000002, 0x002D9A88, 0xAE604102, - // Block 49, offset 0xc40 - 0x00000002, 0x402D9A20, 0xAE604702, 0x00000002, 0x002D9A88, 0xAE604702, - 0x00000003, 0x402D9A20, 0xAE604702, 0xAE603202, 0x00000003, 0x002D9A88, - 0xAE604702, 0xAE603202, 0x00000002, 0x402D9A20, 0xAE604E02, 0x00000002, - 0x002D9A88, 0xAE604E02, 0x00000002, 0x002D9A88, 0xAE605202, 0x00000002, - 0x402D9A20, 0xACA05902, 0x00000002, 0x002D9A88, 0xACA05902, 0x00000002, - 0x402D9A20, 0xAE605B02, 0x00000002, 0x002D9A88, 0xAE605B02, 0x00000002, - 0x402D9A20, 0xAE606402, 0x00000002, 0x002D9A88, 0xAE606402, 0x00000002, - 0x402D9A20, 0xAE606502, 0x00000002, 0x002D9A88, 0xAE606502, 0x00000002, - 0x402D9A20, 0xAE606702, 0x00000002, 0x002D9A88, 0xAE606702, 0x00000002, - 0x402D9A20, 0xADC07002, 0x00000002, 0x002D9A88, 0xADC07002, 0x00000002, - 0x402D9A20, 0xADC07A02, 0x00000002, 0x002D9A88, - // Block 50, offset 0xc80 - 0xADC07A02, 0x00000002, 0x002D9A9D, 0x002C3A9D, 0x00000002, 0x002D9A9D, - 0x002C629D, 0x00000002, 0x402DCC20, 0xAE603C02, 0x00000002, 0x002DCC88, - 0xAE603C02, 0x00000002, 0x402DCC20, 0xAE604102, 0x00000002, 0x402DFE20, - 0xAE603202, 0x00000002, 0x002DFE88, 0xAE603202, 0x00000002, 0x402DFE20, - 0xAE604102, 0x00000002, 0x002DFE88, 0xAE604102, 0x00000002, 0x402DFE20, - 0xACA05602, 0x00000002, 0x002DFE88, 0xACA05602, 0x00000002, 0x002DFE84, - 0xA0006104, 0x00000002, 0x002DFE8A, 0xA0006104, 0x00000002, 0x402DFE20, - 0xADC07002, 0x00000002, 0x002DFE88, 0xADC07002, 0x00000002, 0x402DFE20, - 0xADC07B02, 0x00000002, 0x002DFE88, 0xADC07B02, 0x00000004, 0x002DFE9C, - 0x002C3A9C, 0x002BDE9C, 0x002E229C, 0x00000003, 0x002DFE9C, 0x002D689D, - 0x00312A9C, 0x00000003, 0x002DFE9C, 0x002E829C, - // Block 51, offset 0xcc0 - 0x0029D09C, 0x00000003, 0x002DFE9C, 0x002E829C, 0x0029D29C, 0x00000003, - 0x002DFE9C, 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402E2220, 0xAE603202, - 0x00000002, 0x002E2288, 0xAE603202, 0x00000002, 0x402E2220, 0xAE604102, - 0x00000002, 0x002E2288, 0xAE604102, 0x00000002, 0x402E2220, 0xACA05602, - 0x00000002, 0x002E2288, 0xACA05602, 0x00000002, 0x402E2220, 0xADC07002, - 0x00000002, 0x002E2288, 0xADC07002, 0x00000003, 0x402E2220, 0xADC07002, - 0xAE605B02, 0x00000003, 0x002E2288, 0xADC07002, 0xAE605B02, 0x00000002, - 0x402E2220, 0xADC07802, 0x00000002, 0x002E2288, 0xADC07802, 0x00000002, - 0x402E2220, 0xADC07B02, 0x00000002, 0x002E2288, 0xADC07B02, 0x00000002, - 0x402E2220, 0xA0007D02, 0x00000002, 0x002E2288, 0xA0007D02, 0x00000002, - 0x402E2220, 0xA0013902, 0x00000002, 0x402E2220, - // Block 52, offset 0xd00 - 0xA0013902, 0x00000002, 0x002E2288, 0xA0013902, 0x00000002, 0x002E2288, - 0xA0013902, 0x00000002, 0x002E2284, 0x002E2284, 0x00000002, 0x002E228A, - 0x002E228A, 0x00000003, 0x002E229C, 0x002EE29C, 0x002D229C, 0x00000002, - 0x002E2284, 0x002FE684, 0x00000003, 0x002E229D, 0x00302C9D, 0x002C629D, - 0x00000002, 0x002E2284, 0x00312A84, 0x00000002, 0x402E8220, 0xAE603202, - 0x00000002, 0x002E8288, 0xAE603202, 0x00000002, 0x402E8220, 0xAE605202, - 0x00000002, 0x002E8288, 0xAE605202, 0x00000002, 0x402E8220, 0xADC07002, - 0x00000002, 0x002E8288, 0xADC07002, 0x00000003, 0x002E829C, 0x0009569C, - 0x002FE69C, 0x00000004, 0x002E829C, 0x0009569C, 0x002FE69C, 0x0029D09C, - 0x00000003, 0x002E829D, 0x002D689D, 0x00312A9C, 0x00000003, 0x002E829C, - 0x002D9A9C, 0x002E229C, 0x00000003, 0x002E829C, - // Block 53, offset 0xd40 - 0x002E829C, 0x0029D09C, 0x00000003, 0x002E829C, 0x002E829C, 0x0029D29C, - 0x00000003, 0x002E829C, 0x002EE29C, 0x002E229C, 0x00000003, 0x002E829D, - 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402E9E20, 0xAE603202, 0x00000002, - 0x002E9E88, 0xAE603202, 0x00000002, 0x402E9E20, 0xAE603502, 0x00000002, - 0x002E9E88, 0xAE603502, 0x00000002, 0x402E9E20, 0xAE604102, 0x00000002, - 0x002E9E88, 0xAE604102, 0x00000002, 0x402E9E20, 0xAE604E02, 0x00000002, - 0x002E9E88, 0xAE604E02, 0x00000002, 0x402E9E20, 0xAE605202, 0x00000002, - 0x002E9E88, 0xAE605202, 0x00000002, 0x402E9E20, 0xACA05602, 0x00000002, - 0x002E9E88, 0xACA05602, 0x00000002, 0x002E9E84, 0xA0006104, 0x00000002, - 0x002E9E8A, 0xA0006104, 0x00000002, 0x402E9E20, 0xADC07002, 0x00000002, - 0x002E9E88, 0xADC07002, 0x00000002, 0x402E9E20, - // Block 54, offset 0xd80 - 0xADC07802, 0x00000002, 0x002E9E88, 0xADC07802, 0x00000002, 0x402E9E20, - 0xADC07B02, 0x00000002, 0x002E9E88, 0xADC07B02, 0x00000003, 0x002E9E9D, - 0x002C989D, 0x0030E29D, 0x00000002, 0x002E9E9D, 0x002D229D, 0x00000002, - 0x402EE220, 0xAE603202, 0x00000002, 0x002EE288, 0xAE603202, 0x00000002, - 0x402EE220, 0xAE603502, 0x00000002, 0x002EE288, 0xAE603502, 0x00000002, - 0x402EE220, 0xAE603702, 0x00000002, 0x002EE288, 0xAE603702, 0x00000002, - 0x402EE220, 0xAE603C02, 0x00000002, 0x002EE288, 0xAE603C02, 0x00000003, - 0x402EE220, 0xAE603C02, 0xAE603202, 0x00000003, 0x002EE288, 0xAE603C02, - 0xAE603202, 0x00000003, 0x402EE220, 0xAE603C02, 0xAE603502, 0x00000003, - 0x002EE288, 0xAE603C02, 0xAE603502, 0x00000003, 0x402EE220, 0xAE603C02, - 0xAE604E02, 0x00000003, 0x002EE288, 0xAE603C02, - // Block 55, offset 0xdc0 - 0xAE604E02, 0x00000003, 0x402EE220, 0xAE603C02, 0xAE606402, 0x00000003, - 0x002EE288, 0xAE603C02, 0xAE606402, 0x00000002, 0x402EE220, 0xAE604102, - 0x00000002, 0x002EE288, 0xAE604102, 0x00000002, 0x402EE220, 0xAE604702, - 0x00000002, 0x002EE288, 0xAE604702, 0x00000003, 0x402EE220, 0xAE604702, - 0xAE605B02, 0x00000003, 0x002EE288, 0xAE604702, 0xAE605B02, 0x00000002, - 0x402EE220, 0xAE604D02, 0x00000002, 0x002EE288, 0xAE604D02, 0x00000002, - 0x402EE220, 0xAE604E02, 0x00000002, 0x002EE288, 0xAE604E02, 0x00000003, - 0x402EE220, 0xAE604E02, 0xAE603202, 0x00000003, 0x002EE288, 0xAE604E02, - 0xAE603202, 0x00000003, 0x402EE220, 0xAE604E02, 0xAE604702, 0x00000003, - 0x002EE288, 0xAE604E02, 0xAE604702, 0x00000003, 0x402EE220, 0xAE604E02, - 0xAE605B02, 0x00000003, 0x002EE288, 0xAE604E02, - // Block 56, offset 0xe00 - 0xAE605B02, 0x00000002, 0x402EE220, 0xAE605202, 0x00000002, 0x002EE288, - 0xAE605202, 0x00000003, 0x402EE220, 0xAE605202, 0xAE605B02, 0x00000003, - 0x002EE288, 0xAE605202, 0xAE605B02, 0x00000002, 0x402EE220, 0xA0005402, - 0x00000002, 0x002EE288, 0xA0005402, 0x00000003, 0x402EE220, 0xA0005402, - 0xAE603202, 0x00000003, 0x002EE288, 0xA0005402, 0xAE603202, 0x00000002, - 0x402EE220, 0xACA05902, 0x00000002, 0x002EE288, 0xACA05902, 0x00000003, - 0x402EE220, 0xACA05902, 0xAE605B02, 0x00000003, 0x002EE288, 0xACA05902, - 0xAE605B02, 0x00000002, 0x402EE220, 0xAE605B02, 0x00000002, 0x002EE288, - 0xAE605B02, 0x00000003, 0x402EE220, 0xAE605B02, 0xAE603202, 0x00000003, - 0x002EE288, 0xAE605B02, 0xAE603202, 0x00000003, 0x402EE220, 0xAE605B02, - 0xAE603502, 0x00000003, 0x002EE288, 0xAE605B02, - // Block 57, offset 0xe40 - 0xAE603502, 0x00000002, 0x402EE220, 0xAE606402, 0x00000002, 0x002EE288, - 0xAE606402, 0x00000002, 0x402EE220, 0xAE606502, 0x00000002, 0x002EE288, - 0xAE606502, 0x00000002, 0x402EE220, 0xAE606702, 0x00000002, 0x002EE288, - 0xAE606702, 0x00000002, 0x402EE220, 0xAD806802, 0x00000002, 0x002EE288, - 0xAD806802, 0x00000003, 0x402EE220, 0xAD806802, 0xAE603202, 0x00000003, - 0x002EE288, 0xAD806802, 0xAE603202, 0x00000003, 0x402EE220, 0xAD806802, - 0xAE603502, 0x00000003, 0x002EE288, 0xAD806802, 0xAE603502, 0x00000003, - 0x402EE220, 0xAD806802, 0xAE604E02, 0x00000003, 0x002EE288, 0xAD806802, - 0xAE604E02, 0x00000003, 0x402EE220, 0xAD806802, 0xAE606402, 0x00000003, - 0x002EE288, 0xAD806802, 0xAE606402, 0x00000003, 0x402EE220, 0xAD806802, - 0xADC07002, 0x00000003, 0x002EE288, 0xAD806802, - // Block 58, offset 0xe80 - 0xADC07002, 0x00000002, 0x402EE220, 0xADC07002, 0x00000002, 0x002EE288, - 0xADC07002, 0x00000003, 0x402EE220, 0xADC07002, 0xAE603C02, 0x00000003, - 0x002EE288, 0xADC07002, 0xAE603C02, 0x00000003, 0x002EE284, 0xA0013904, - 0x002C9884, 0x00000003, 0x002EE28A, 0xA0013904, 0x002C988A, 0x00000003, - 0x002EE294, 0xA0013914, 0x002C9894, 0x00000002, 0x002EE29D, 0x002DFE9D, - 0x00000002, 0x002EE284, 0x002EE284, 0x00000002, 0x002EE28A, 0x002EE28A, - 0x00000002, 0x402F2C20, 0xAE603202, 0x00000002, 0x002F2C88, 0xAE603202, - 0x00000002, 0x402F2C20, 0xAE605202, 0x00000002, 0x002F2C88, 0xAE605202, - 0x00000004, 0x002F2C9C, 0x0002E49C, 0x002E829C, 0x0002E49C, 0x00000002, - 0x002F2C9D, 0x002BDE9D, 0x00000003, 0x002F2C9D, 0x002F2C9D, 0x002E829D, - 0x00000003, 0x002F2C9D, 0x002F2C9D, 0x0030BE9D, - // Block 59, offset 0xec0 - 0x00000003, 0x002F2C9D, 0x00302C9D, 0x002C989D, 0x00000002, 0x002F5684, - 0x002F2C84, 0x00000002, 0x402F7A20, 0xAE603202, 0x00000002, 0x002F7A88, - 0xAE603202, 0x00000002, 0x402F7A20, 0xAE604102, 0x00000002, 0x002F7A88, - 0xAE604102, 0x00000002, 0x402F7A20, 0xAE605202, 0x00000002, 0x002F7A88, - 0xAE605202, 0x00000002, 0x402F7A20, 0xACA05602, 0x00000002, 0x002F7A88, - 0xACA05602, 0x00000002, 0x002F7A84, 0xA0006104, 0x00000002, 0x002F7A8A, - 0xA0006104, 0x00000002, 0x402F7A20, 0xAE606502, 0x00000002, 0x002F7A88, - 0xAE606502, 0x00000002, 0x402F7A20, 0xAE606702, 0x00000002, 0x002F7A88, - 0xAE606702, 0x00000002, 0x402F7A20, 0xADC07002, 0x00000002, 0x002F7A88, - 0xADC07002, 0x00000003, 0x402F7A20, 0xADC07002, 0xAE605B02, 0x00000003, - 0x002F7A88, 0xADC07002, 0xAE605B02, 0x00000002, - // Block 60, offset 0xf00 - 0x402F7A20, 0xADC07B02, 0x00000002, 0x002F7A88, 0xADC07B02, 0x00000002, - 0x002F7A84, 0xA0013A04, 0x00000002, 0x002F7A8A, 0xA0013A04, 0x00000003, - 0x002F7A9C, 0x002BDE9C, 0x002C629C, 0x00000005, 0x002F7A9C, 0x002BDE9C, - 0x002C629C, 0x0009569C, 0x002FE69C, 0x00000006, 0x002F7A9C, 0x002BDE9C, - 0x002C629C, 0x0009569C, 0x002FE69C, 0x0029D09C, 0x00000002, 0x402FE620, - 0xAE603202, 0x00000002, 0x002FE688, 0xAE603202, 0x00000003, 0x402FE620, - 0xAE603202, 0xAE605202, 0x00000003, 0x002FE688, 0xAE603202, 0xAE605202, - 0x00000002, 0x402FE620, 0xAE603C02, 0x00000002, 0x002FE688, 0xAE603C02, - 0x00000002, 0x402FE620, 0xAE604102, 0x00000002, 0x002FE688, 0xAE604102, - 0x00000003, 0x402FE620, 0xAE604102, 0xAE605202, 0x00000003, 0x002FE688, - 0xAE604102, 0xAE605202, 0x00000002, 0x402FE620, - // Block 61, offset 0xf40 - 0xAE605202, 0x00000002, 0x002FE688, 0xAE605202, 0x00000002, 0x402FE620, - 0xACA05602, 0x00000002, 0x002FE688, 0xACA05602, 0x00000002, 0x002FE684, - 0xA0006104, 0x00000002, 0x002FE68A, 0xA0006104, 0x00000002, 0x402FE620, - 0xADC07002, 0x00000002, 0x002FE688, 0xADC07002, 0x00000003, 0x402FE620, - 0xADC07002, 0xAE605202, 0x00000003, 0x002FE688, 0xADC07002, 0xAE605202, - 0x00000002, 0x402FE620, 0xADC07702, 0x00000002, 0x002FE688, 0xADC07702, - 0x00000002, 0x002FE684, 0xA0013A04, 0x00000002, 0x84E617F3, 0xAE613A04, - 0x00000002, 0x002FE684, 0xA0013A04, 0x00000002, 0x002FE68A, 0xA0013A04, - 0x00000003, 0x002FE684, 0xA0013A04, 0xAE605202, 0x00000002, 0x002FE69D, - 0x002BDE9D, 0x00000003, 0x002FE69D, 0x002EE29D, 0x002FE69D, 0x00000003, - 0x002FE684, 0xA0013904, 0x002FE684, 0x00000003, - // Block 62, offset 0xf80 - 0x002FE68A, 0xA0013904, 0x002FE68A, 0x00000003, 0x002FE684, 0xA0013A04, - 0x00302C84, 0x00000002, 0x40302C20, 0xAE604102, 0x00000002, 0x00302C88, - 0xAE604102, 0x00000002, 0x40302C20, 0xAE604702, 0x00000002, 0x40302C20, - 0xAE605202, 0x00000002, 0x00302C88, 0xAE605202, 0x00000002, 0x40302C20, - 0xACA05602, 0x00000002, 0x00302C88, 0xACA05602, 0x00000002, 0x40302C20, - 0xADC07002, 0x00000002, 0x00302C88, 0xADC07002, 0x00000002, 0x40302C20, - 0xADC07702, 0x00000002, 0x00302C88, 0xADC07702, 0x00000002, 0x40302C20, - 0xADC07802, 0x00000002, 0x00302C88, 0xADC07802, 0x00000002, 0x40302C20, - 0xADC07B02, 0x00000002, 0x00302C88, 0xADC07B02, 0x00000002, 0x00302C84, - 0xA0013A04, 0x00000002, 0x00302C8A, 0xA0013A04, 0x00000002, 0x00302C84, - 0x002C5684, 0x00000003, 0x00302C8A, 0x002C988A, - // Block 63, offset 0xfc0 - 0x002E228A, 0x00000003, 0x00302C84, 0xA0013904, 0x002D6884, 0x00000003, - 0x00302C9D, 0x002D689D, 0x00312A9C, 0x00000002, 0x00302C84, 0x002FE684, - 0x00000002, 0x00302C84, 0x002FE684, 0x00000002, 0x00302C84, 0x00300884, - 0x00000002, 0x00302C84, 0x00312A84, 0x00000002, 0x00302C8A, 0x00312A84, - 0x00000002, 0x40306C20, 0xAE603202, 0x00000002, 0x00306C88, 0xAE603202, - 0x00000002, 0x40306C20, 0xAE603502, 0x00000002, 0x00306C88, 0xAE603502, - 0x00000002, 0x40306C20, 0xAE603702, 0x00000002, 0x00306C88, 0xAE603702, - 0x00000002, 0x40306C20, 0xAE603C02, 0x00000002, 0x00306C88, 0xAE603C02, - 0x00000002, 0x40306C20, 0xAE604102, 0x00000002, 0x00306C88, 0xAE604102, - 0x00000002, 0x40306C20, 0xAE604302, 0x00000002, 0x00306C88, 0xAE604302, - 0x00000002, 0x40306C20, 0xAE604702, 0x00000002, - // Block 64, offset 0x1000 - 0x00306C88, 0xAE604702, 0x00000003, 0x40306C20, 0xAE604702, 0xAE603202, - 0x00000003, 0x00306C88, 0xAE604702, 0xAE603202, 0x00000003, 0x40306C20, - 0xAE604702, 0xAE603502, 0x00000003, 0x00306C88, 0xAE604702, 0xAE603502, - 0x00000003, 0x40306C20, 0xAE604702, 0xAE604102, 0x00000003, 0x00306C88, - 0xAE604702, 0xAE604102, 0x00000003, 0x40306C20, 0xAE604702, 0xAE605B02, - 0x00000003, 0x00306C88, 0xAE604702, 0xAE605B02, 0x00000002, 0x40306C20, - 0xAE604D02, 0x00000002, 0x00306C88, 0xAE604D02, 0x00000002, 0x40306C20, - 0xAE604E02, 0x00000002, 0x00306C88, 0xAE604E02, 0x00000003, 0x40306C20, - 0xAE604E02, 0xAE603202, 0x00000003, 0x00306C88, 0xAE604E02, 0xAE603202, - 0x00000002, 0x40306C20, 0xACA05902, 0x00000002, 0x00306C88, 0xACA05902, - 0x00000002, 0x40306C20, 0xAE605B02, 0x00000002, - // Block 65, offset 0x1040 - 0x00306C88, 0xAE605B02, 0x00000003, 0x40306C20, 0xAE605B02, 0xAE604702, - 0x00000003, 0x00306C88, 0xAE605B02, 0xAE604702, 0x00000002, 0x40306C20, - 0xAE606402, 0x00000002, 0x00306C88, 0xAE606402, 0x00000002, 0x40306C20, - 0xAE606502, 0x00000002, 0x00306C88, 0xAE606502, 0x00000002, 0x40306C20, - 0xAE606702, 0x00000002, 0x00306C88, 0xAE606702, 0x00000002, 0x40306C20, - 0xAD806802, 0x00000002, 0x00306C88, 0xAD806802, 0x00000003, 0x40306C20, - 0xAD806802, 0xAE603202, 0x00000003, 0x00306C88, 0xAD806802, 0xAE603202, - 0x00000003, 0x40306C20, 0xAD806802, 0xAE603502, 0x00000003, 0x00306C88, - 0xAD806802, 0xAE603502, 0x00000003, 0x40306C20, 0xAD806802, 0xAE604E02, - 0x00000003, 0x00306C88, 0xAD806802, 0xAE604E02, 0x00000003, 0x40306C20, - 0xAD806802, 0xAE606402, 0x00000003, 0x00306C88, - // Block 66, offset 0x1080 - 0xAD806802, 0xAE606402, 0x00000003, 0x40306C20, 0xAD806802, 0xADC07002, - 0x00000003, 0x00306C88, 0xAD806802, 0xADC07002, 0x00000002, 0x40306C20, - 0xADC07002, 0x00000002, 0x00306C88, 0xADC07002, 0x00000002, 0x40306C20, - 0xADC07502, 0x00000002, 0x00306C88, 0xADC07502, 0x00000002, 0x40306C20, - 0xADC07802, 0x00000002, 0x00306C88, 0xADC07802, 0x00000002, 0x40306C20, - 0xADC07A02, 0x00000002, 0x00306C88, 0xADC07A02, 0x00000003, 0x00306C9D, - 0x002F2C9D, 0x0002BA9C, 0x00000002, 0x4030BE20, 0xAE604E02, 0x00000002, - 0x0030BE88, 0xAE604E02, 0x00000002, 0x4030BE20, 0xADC07002, 0x00000002, - 0x0030BE88, 0xADC07002, 0x00000003, 0x0030BE9D, 0x0009569C, 0x002E829C, - 0x00000004, 0x0030BE84, 0x002D9A84, 0x002D9A84, 0x002D9A9F, 0x00000004, - 0x0030BE8A, 0x002D9A8A, 0x002D9A8A, 0x002D9A9F, - // Block 67, offset 0x10c0 - 0x00000002, 0x0030BE9D, 0x002FE69D, 0x00000002, 0x0030BE84, 0x00310084, - 0x00000002, 0x0030BE8A, 0x0031008A, 0x00000002, 0x4030E220, 0xAE603202, - 0x00000002, 0x0030E288, 0xAE603202, 0x00000002, 0x4030E220, 0xAE603502, - 0x00000002, 0x0030E288, 0xAE603502, 0x00000002, 0x4030E220, 0xAE603C02, - 0x00000002, 0x0030E288, 0xAE603C02, 0x00000002, 0x4030E220, 0xAE604302, - 0x00000002, 0x4030E220, 0xAE604702, 0x00000002, 0x0030E288, 0xAE604702, - 0x00000002, 0x4030E220, 0xAE605202, 0x00000002, 0x0030E288, 0xAE605202, - 0x00000002, 0x4030E220, 0xADC07002, 0x00000002, 0x0030E288, 0xADC07002, - 0x00000002, 0x0030E29D, 0x002C3A9D, 0x00000002, 0x4030F620, 0xAE604702, - 0x00000002, 0x0030F688, 0xAE604702, 0x00000002, 0x4030F620, 0xAE605202, - 0x00000002, 0x0030F688, 0xAE605202, 0x00000002, - // Block 68, offset 0x1100 - 0x40310020, 0xAE603202, 0x00000002, 0x00310088, 0xAE603202, 0x00000002, - 0x40310020, 0xAE603502, 0x00000002, 0x00310088, 0xAE603502, 0x00000002, - 0x40310020, 0xAE603C02, 0x00000002, 0x00310088, 0xAE603C02, 0x00000002, - 0x40310020, 0xAE604302, 0x00000002, 0x40310020, 0xAE604702, 0x00000002, - 0x00310088, 0xAE604702, 0x00000002, 0x40310020, 0xAE604E02, 0x00000002, - 0x00310088, 0xAE604E02, 0x00000002, 0x40310020, 0xAE605202, 0x00000002, - 0x00310088, 0xAE605202, 0x00000002, 0x40310020, 0xAE605B02, 0x00000002, - 0x00310088, 0xAE605B02, 0x00000002, 0x40310020, 0xAE606402, 0x00000002, - 0x00310088, 0xAE606402, 0x00000002, 0x40310020, 0xADC07002, 0x00000002, - 0x00310088, 0xADC07002, 0x00000002, 0x40312A20, 0xAE603202, 0x00000002, - 0x00312A88, 0xAE603202, 0x00000002, 0x40312A20, - // Block 69, offset 0x1140 - 0xAE603C02, 0x00000002, 0x00312A88, 0xAE603C02, 0x00000002, 0x40312A20, - 0xAE604102, 0x00000002, 0x00312A88, 0xAE604102, 0x00000002, 0x40312A20, - 0xAE605202, 0x00000002, 0x00312A88, 0xAE605202, 0x00000002, 0x40312A20, - 0xADC07002, 0x00000002, 0x00312A88, 0xADC07002, 0x00000002, 0x40312A20, - 0xADC07B02, 0x00000002, 0x00312A88, 0xADC07B02, 0x00000002, 0x00312A84, - 0x0030E284, 0x00000002, 0x40316420, 0xAE604102, 0x00000002, 0x00316488, - 0xAE604102, 0x00000002, 0x40325220, 0xAE602202, 0x00000002, 0x00325288, - 0xAE602202, 0x00000003, 0x40325220, 0xAE602202, 0xAE603202, 0x00000003, - 0x00325288, 0xAE602202, 0xAE603202, 0x00000004, 0x40325220, 0xAE602202, - 0xAE603202, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602202, 0xAE603202, - 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, - // Block 70, offset 0x1180 - 0xAE603502, 0x00000003, 0x00325288, 0xAE602202, 0xAE603502, 0x00000004, - 0x40325220, 0xAE602202, 0xAE603502, 0xAF007F02, 0x00000004, 0x00325288, - 0xAE602202, 0xAE603502, 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, - 0xAE604502, 0x00000003, 0x00325288, 0xAE602202, 0xAE604502, 0x00000004, - 0x40325220, 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000004, 0x00325288, - 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, - 0xAF007F02, 0x00000003, 0x00325288, 0xAE602202, 0xAF007F02, 0x00000002, - 0x40325220, 0xAE602A02, 0x00000002, 0x00325288, 0xAE602A02, 0x00000003, - 0x40325220, 0xAE602A02, 0xAE603202, 0x00000003, 0x00325288, 0xAE602A02, - 0xAE603202, 0x00000004, 0x40325220, 0xAE602A02, 0xAE603202, 0xAF007F02, - 0x00000004, 0x00325288, 0xAE602A02, 0xAE603202, - // Block 71, offset 0x11c0 - 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAE603502, 0x00000003, - 0x00325288, 0xAE602A02, 0xAE603502, 0x00000004, 0x40325220, 0xAE602A02, - 0xAE603502, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602A02, 0xAE603502, - 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAE604502, 0x00000003, - 0x00325288, 0xAE602A02, 0xAE604502, 0x00000004, 0x40325220, 0xAE602A02, - 0xAE604502, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602A02, 0xAE604502, - 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAF007F02, 0x00000003, - 0x00325288, 0xAE602A02, 0xAF007F02, 0x00000002, 0x40325220, 0xAE603202, - 0x00000002, 0x00325288, 0xAE603202, 0x00000003, 0x40325220, 0xAE603202, - 0xAF007F02, 0x00000002, 0x40325220, 0xAE603502, 0x00000002, 0x00325288, - 0xAE603502, 0x00000003, 0x40325220, 0xAE603502, - // Block 72, offset 0x1200 - 0xAF007F02, 0x00000002, 0x40325220, 0xAE603702, 0x00000002, 0x00325288, - 0xAE603702, 0x00000002, 0x40325220, 0xAE604502, 0x00000003, 0x40325220, - 0xAE604502, 0xAF007F02, 0x00000002, 0x40325220, 0xAE605B02, 0x00000002, - 0x00325288, 0xAE605B02, 0x00000002, 0x40325220, 0xAF007F02, 0x00000002, - 0x00325288, 0xAF007F02, 0x00000002, 0x40325C20, 0xAE602202, 0x00000002, - 0x00325C88, 0xAE602202, 0x00000003, 0x40325C20, 0xAE602202, 0xAE603202, - 0x00000003, 0x00325C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40325C20, - 0xAE602202, 0xAE603502, 0x00000003, 0x00325C88, 0xAE602202, 0xAE603502, - 0x00000002, 0x40325C20, 0xAE602A02, 0x00000002, 0x00325C88, 0xAE602A02, - 0x00000003, 0x40325C20, 0xAE602A02, 0xAE603202, 0x00000003, 0x00325C88, - 0xAE602A02, 0xAE603202, 0x00000003, 0x40325C20, - // Block 73, offset 0x1240 - 0xAE602A02, 0xAE603502, 0x00000003, 0x00325C88, 0xAE602A02, 0xAE603502, - 0x00000002, 0x40325C20, 0xAE603202, 0x00000002, 0x00325C88, 0xAE603202, - 0x00000002, 0x40325C20, 0xAE603502, 0x00000002, 0x00325C88, 0xAE603502, - 0x00000002, 0x40326820, 0xAE602202, 0x00000002, 0x00326888, 0xAE602202, - 0x00000003, 0x40326820, 0xAE602202, 0xAE603202, 0x00000003, 0x00326888, - 0xAE602202, 0xAE603202, 0x00000004, 0x40326820, 0xAE602202, 0xAE603202, - 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, 0xAE603202, 0xAF007F02, - 0x00000003, 0x40326820, 0xAE602202, 0xAE603502, 0x00000003, 0x00326888, - 0xAE602202, 0xAE603502, 0x00000004, 0x40326820, 0xAE602202, 0xAE603502, - 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, 0xAE603502, 0xAF007F02, - 0x00000003, 0x40326820, 0xAE602202, 0xAE604502, - // Block 74, offset 0x1280 - 0x00000003, 0x00326888, 0xAE602202, 0xAE604502, 0x00000004, 0x40326820, - 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, - 0xAE604502, 0xAF007F02, 0x00000003, 0x40326820, 0xAE602202, 0xAF007F02, - 0x00000003, 0x00326888, 0xAE602202, 0xAF007F02, 0x00000002, 0x40326820, - 0xAE602A02, 0x00000002, 0x00326888, 0xAE602A02, 0x00000003, 0x40326820, - 0xAE602A02, 0xAE603202, 0x00000003, 0x00326888, 0xAE602A02, 0xAE603202, - 0x00000004, 0x40326820, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000004, - 0x00326888, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000003, 0x40326820, - 0xAE602A02, 0xAE603502, 0x00000003, 0x00326888, 0xAE602A02, 0xAE603502, - 0x00000004, 0x40326820, 0xAE602A02, 0xAE603502, 0xAF007F02, 0x00000004, - 0x00326888, 0xAE602A02, 0xAE603502, 0xAF007F02, - // Block 75, offset 0x12c0 - 0x00000003, 0x40326820, 0xAE602A02, 0xAE604502, 0x00000003, 0x00326888, - 0xAE602A02, 0xAE604502, 0x00000004, 0x40326820, 0xAE602A02, 0xAE604502, - 0xAF007F02, 0x00000004, 0x00326888, 0xAE602A02, 0xAE604502, 0xAF007F02, - 0x00000003, 0x40326820, 0xAE602A02, 0xAF007F02, 0x00000003, 0x00326888, - 0xAE602A02, 0xAF007F02, 0x00000002, 0x40326820, 0xAE603202, 0x00000002, - 0x00326888, 0xAE603202, 0x00000003, 0x40326820, 0xAE603202, 0xAF007F02, - 0x00000002, 0x40326820, 0xAE603502, 0x00000002, 0x00326888, 0xAE603502, - 0x00000003, 0x40326820, 0xAE603502, 0xAF007F02, 0x00000002, 0x40326820, - 0xAE604502, 0x00000003, 0x40326820, 0xAE604502, 0xAF007F02, 0x00000002, - 0x40326820, 0xAF007F02, 0x00000002, 0x00326888, 0xAF007F02, 0x00000002, - 0x40326C20, 0xAE602202, 0x00000002, 0x00326C88, - // Block 76, offset 0x1300 - 0xAE602202, 0x00000003, 0x40326C20, 0xAE602202, 0xAE603202, 0x00000003, - 0x00326C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40326C20, 0xAE602202, - 0xAE603502, 0x00000003, 0x00326C88, 0xAE602202, 0xAE603502, 0x00000003, - 0x40326C20, 0xAE602202, 0xAE604502, 0x00000003, 0x00326C88, 0xAE602202, - 0xAE604502, 0x00000002, 0x40326C20, 0xAE602A02, 0x00000002, 0x00326C88, - 0xAE602A02, 0x00000003, 0x40326C20, 0xAE602A02, 0xAE603202, 0x00000003, - 0x00326C88, 0xAE602A02, 0xAE603202, 0x00000003, 0x40326C20, 0xAE602A02, - 0xAE603502, 0x00000003, 0x00326C88, 0xAE602A02, 0xAE603502, 0x00000003, - 0x40326C20, 0xAE602A02, 0xAE604502, 0x00000003, 0x00326C88, 0xAE602A02, - 0xAE604502, 0x00000002, 0x40326C20, 0xAE603202, 0x00000002, 0x00326C88, - 0xAE603202, 0x00000002, 0x40326C20, 0xAE603502, - // Block 77, offset 0x1340 - 0x00000002, 0x00326C88, 0xAE603502, 0x00000002, 0x40326C20, 0xAE603702, - 0x00000002, 0x00326C88, 0xAE603702, 0x00000002, 0x40326C20, 0xAE604502, - 0x00000002, 0x40326C20, 0xAE604702, 0x00000002, 0x00326C88, 0xAE604702, - 0x00000003, 0x40326C20, 0xAE604702, 0xAE603202, 0x00000003, 0x40326C20, - 0xAE604702, 0xAE603502, 0x00000003, 0x40326C20, 0xAE604702, 0xAE604502, - 0x00000002, 0x40326C20, 0xAE605B02, 0x00000002, 0x00326C88, 0xAE605B02, - 0x00000003, 0x00327084, 0x00325284, 0x00326C84, 0x00000003, 0x0032708A, - 0x00325284, 0x00326C84, 0x00000002, 0x40327C20, 0xAE602202, 0x00000002, - 0x00327C88, 0xAE602202, 0x00000003, 0x40327C20, 0xAE602202, 0xAE603202, - 0x00000003, 0x00327C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40327C20, - 0xAE602202, 0xAE603502, 0x00000003, 0x00327C88, - // Block 78, offset 0x1380 - 0xAE602202, 0xAE603502, 0x00000002, 0x40327C20, 0xAE602A02, 0x00000002, - 0x00327C88, 0xAE602A02, 0x00000003, 0x40327C20, 0xAE602A02, 0xAE603202, - 0x00000003, 0x00327C88, 0xAE602A02, 0xAE603202, 0x00000003, 0x40327C20, - 0xAE602A02, 0xAE603502, 0x00000003, 0x00327C88, 0xAE602A02, 0xAE603502, - 0x00000002, 0x40327C20, 0xAE603202, 0x00000002, 0x00327C88, 0xAE603202, - 0x00000002, 0x40327C20, 0xAE603502, 0x00000002, 0x00327C88, 0xAE603502, - 0x00000002, 0x40328820, 0xAE602202, 0x00000002, 0x40328820, 0xAE602A02, - 0x00000002, 0x00328888, 0xAE602A02, 0x00000002, 0x40329820, 0xAE602202, - 0x00000003, 0x40329820, 0xAE602202, 0xAE603202, 0x00000003, 0x40329820, - 0xAE602202, 0xAE603502, 0x00000003, 0x40329820, 0xAE602202, 0xAE604502, - 0x00000002, 0x40329820, 0xAE602A02, 0x00000002, - // Block 79, offset 0x13c0 - 0x00329888, 0xAE602A02, 0x00000003, 0x40329820, 0xAE602A02, 0xAE603202, - 0x00000003, 0x00329888, 0xAE602A02, 0xAE603202, 0x00000003, 0x40329820, - 0xAE602A02, 0xAE603502, 0x00000003, 0x00329888, 0xAE602A02, 0xAE603502, - 0x00000003, 0x40329820, 0xAE602A02, 0xAE604502, 0x00000003, 0x00329888, - 0xAE602A02, 0xAE604502, 0x00000002, 0x40329820, 0xAE603202, 0x00000002, - 0x00329888, 0xAE603202, 0x00000002, 0x40329820, 0xAE603502, 0x00000002, - 0x00329888, 0xAE603502, 0x00000002, 0x40329820, 0xAE603702, 0x00000002, - 0x00329888, 0xAE603702, 0x00000002, 0x40329820, 0xAE604502, 0x00000002, - 0x40329820, 0xAE604702, 0x00000002, 0x00329888, 0xAE604702, 0x00000003, - 0x40329820, 0xAE604702, 0xAE603202, 0x00000003, 0x40329820, 0xAE604702, - 0xAE603502, 0x00000003, 0x40329820, 0xAE604702, - // Block 80, offset 0x1400 - 0xAE604502, 0x00000002, 0x40329820, 0xAE605B02, 0x00000002, 0x00329888, - 0xAE605B02, 0x00000002, 0x4032A220, 0xAE602202, 0x00000002, 0x0032A288, - 0xAE602202, 0x00000003, 0x4032A220, 0xAE602202, 0xAE603202, 0x00000003, - 0x0032A288, 0xAE602202, 0xAE603202, 0x00000004, 0x4032A220, 0xAE602202, - 0xAE603202, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602202, 0xAE603202, - 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, 0xAE603502, 0x00000003, - 0x0032A288, 0xAE602202, 0xAE603502, 0x00000004, 0x4032A220, 0xAE602202, - 0xAE603502, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602202, 0xAE603502, - 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, 0xAE604502, 0x00000003, - 0x0032A288, 0xAE602202, 0xAE604502, 0x00000004, 0x4032A220, 0xAE602202, - 0xAE604502, 0xAF007F02, 0x00000004, 0x0032A288, - // Block 81, offset 0x1440 - 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, - 0xAF007F02, 0x00000003, 0x0032A288, 0xAE602202, 0xAF007F02, 0x00000002, - 0x4032A220, 0xAE602A02, 0x00000002, 0x0032A288, 0xAE602A02, 0x00000003, - 0x4032A220, 0xAE602A02, 0xAE603202, 0x00000003, 0x0032A288, 0xAE602A02, - 0xAE603202, 0x00000004, 0x4032A220, 0xAE602A02, 0xAE603202, 0xAF007F02, - 0x00000004, 0x0032A288, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000003, - 0x4032A220, 0xAE602A02, 0xAE603502, 0x00000003, 0x0032A288, 0xAE602A02, - 0xAE603502, 0x00000004, 0x4032A220, 0xAE602A02, 0xAE603502, 0xAF007F02, - 0x00000004, 0x0032A288, 0xAE602A02, 0xAE603502, 0xAF007F02, 0x00000003, - 0x4032A220, 0xAE602A02, 0xAE604502, 0x00000003, 0x0032A288, 0xAE602A02, - 0xAE604502, 0x00000004, 0x4032A220, 0xAE602A02, - // Block 82, offset 0x1480 - 0xAE604502, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602A02, 0xAE604502, - 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602A02, 0xAF007F02, 0x00000003, - 0x0032A288, 0xAE602A02, 0xAF007F02, 0x00000002, 0x4032A220, 0xAE603202, - 0x00000002, 0x0032A288, 0xAE603202, 0x00000003, 0x4032A220, 0xAE603202, - 0xAF007F02, 0x00000002, 0x4032A220, 0xAE603502, 0x00000002, 0x0032A288, - 0xAE603502, 0x00000003, 0x4032A220, 0xAE603502, 0xAF007F02, 0x00000002, - 0x4032A220, 0xAE604502, 0x00000003, 0x4032A220, 0xAE604502, 0xAF007F02, - 0x00000002, 0x4032A220, 0xAF007F02, 0x00000002, 0x0032A288, 0xAF007F02, - 0x00000003, 0x0032C084, 0x0032AA84, 0x0032BE84, 0x00000002, 0x00336284, - 0xA0013A04, 0x00000002, 0x0033628A, 0xA0013A04, 0x00000002, 0x4033B220, - 0xAE603502, 0x00000002, 0x0033B288, 0xAE603502, - // Block 83, offset 0x14c0 - 0x00000002, 0x4033B220, 0xAE604702, 0x00000002, 0x0033B288, 0xAE604702, - 0x00000002, 0x4033CA20, 0xAE603702, 0x00000002, 0x0033CA88, 0xAE603702, - 0x00000002, 0x40341420, 0xAE603502, 0x00000002, 0x00341488, 0xAE603502, - 0x00000002, 0x40341420, 0xAE605B02, 0x00000002, 0x00341488, 0xAE605B02, - 0x00000002, 0x84E61A9D, 0x84E61AA6, 0x00000002, 0x40357220, 0xAE605B02, - 0x00000002, 0x00357288, 0xAE605B02, 0x00000002, 0x40389020, 0xA1108C02, - 0x00000002, 0x40389020, 0xA1208D02, 0x00000002, 0x40389020, 0xA1509202, - 0x00000002, 0x40389220, 0xA1509202, 0x00000002, 0x40389220, 0xA1709502, - 0x00000002, 0x40389420, 0xA1509202, 0x00000002, 0x40389620, 0xA1509202, - 0x00000002, 0x40389820, 0xA1509202, 0x00000002, 0x40389A20, 0xA1308E02, - 0x00000002, 0x40389A20, 0xA1509202, 0x00000002, - // Block 84, offset 0x1500 - 0x00389A84, 0x00389A84, 0x00000002, 0x00389A84, 0x0038A284, 0x00000002, - 0x40389C20, 0xA1509202, 0x00000002, 0x4038A020, 0xA1509202, 0x00000002, - 0x4038A220, 0xA0E08902, 0x00000002, 0x4038A220, 0xA1509202, 0x00000002, - 0x0038A284, 0x0038A284, 0x00000003, 0x0038A284, 0x0038A284, 0xA1108C02, - 0x00000002, 0x4038A420, 0xA1509202, 0x00000002, 0x0038A499, 0xA1509202, - 0x00000002, 0x4038A420, 0xA1709502, 0x00000002, 0x4038A620, 0xA1509202, - 0x00000002, 0x4038A820, 0xA1509202, 0x00000002, 0x4038AA20, 0xA1509202, - 0x00000002, 0x4038AC20, 0xA1509202, 0x00000002, 0x4038B020, 0xA1509202, - 0x00000002, 0x0038B099, 0xA1509202, 0x00000002, 0x4038B020, 0xA1709502, - 0x00000002, 0x4038B220, 0xA1509202, 0x00000002, 0x4038B420, 0xA1509202, - 0x00000002, 0x4038B620, 0xA1509202, 0x00000002, - // Block 85, offset 0x1540 - 0x4038B820, 0xA1909002, 0x00000002, 0x4038B820, 0xA1809102, 0x00000002, - 0x4038B820, 0xA1509202, 0x00000003, 0x4038B820, 0xA1509202, 0xA1909002, - 0x00000003, 0x4038B820, 0xA1509202, 0xA1809102, 0x00000002, 0x4038BA20, - 0xA1509202, 0x00000002, 0x00391C84, 0xA0013A04, 0x00000002, 0x00393099, - 0x00393899, 0x00000002, 0x0039309A, 0x0039389A, 0x00000002, 0x00393097, - 0x00396497, 0x00000002, 0x0039309A, 0x0039649A, 0x00000002, 0x00393097, - 0x00397297, 0x00000002, 0x0039309A, 0x0039729A, 0x00000002, 0x00393097, - 0x00397497, 0x00000002, 0x00393099, 0x0039A499, 0x00000002, 0x00393099, - 0x0039A699, 0x00000002, 0x00393097, 0x003A4E97, 0x00000002, 0x00393098, - 0x003A4E98, 0x00000002, 0x00393099, 0x003A4E99, 0x00000002, 0x0039309A, - 0x003A4E9A, 0x00000002, 0x00393099, 0x003A5699, - // Block 86, offset 0x1580 - 0x00000002, 0x00393097, 0x003A6897, 0x00000002, 0x00393098, 0x003A6898, - 0x00000002, 0x00393099, 0x003A7299, 0x00000002, 0x0039309A, 0x003A729A, - 0x00000002, 0x00393099, 0x003A7499, 0x00000002, 0x0039309A, 0x003A749A, - 0x00000002, 0x00393099, 0x003A7A99, 0x00000002, 0x0039309A, 0x003A7A9A, - 0x00000002, 0x00393099, 0x003A7C99, 0x00000002, 0x0039309A, 0x003A7C9A, - 0x00000002, 0x00393099, 0x003A7E99, 0x00000002, 0x0039309A, 0x003A7E9A, - 0x00000002, 0x00393097, 0x003A8E97, 0x00000002, 0x00393099, 0x003A8E99, - 0x00000002, 0x00393099, 0x003A8E99, 0x00000002, 0x0039309A, 0x003A8E9A, - 0x00000002, 0x0039309A, 0x003A8E9A, 0x00000002, 0x00393099, 0x003A9099, - 0x00000002, 0x0039309A, 0x003A909A, 0x00000002, 0x00393097, 0x003A9897, - 0x00000002, 0x00393099, 0x003A9899, 0x00000002, - // Block 87, offset 0x15c0 - 0x0039309A, 0x003A989A, 0x00000004, 0x0039389A, 0x003A1A9A, 0x00393C9A, - 0x0039A49A, 0x00000004, 0x0039389A, 0x003A409A, 0x003A409A, 0x003A689A, - 0x00000003, 0x00393C99, 0x00397299, 0x003A9099, 0x00000003, 0x00393C99, - 0x00397499, 0x003A9099, 0x00000003, 0x00395697, 0x00396497, 0x003A4E97, - 0x00000003, 0x00395699, 0x00396499, 0x003A8E99, 0x00000003, 0x00395699, - 0x00396499, 0x003A9099, 0x00000003, 0x00395697, 0x00397297, 0x00396497, - 0x00000003, 0x00395699, 0x00397299, 0x00396499, 0x00000003, 0x00395697, - 0x00397297, 0x003A4E97, 0x00000003, 0x00395697, 0x00397497, 0x003A4E97, - 0x00000003, 0x00395699, 0x00397499, 0x003A8E99, 0x00000003, 0x00395699, - 0x00397499, 0x003A9099, 0x00000003, 0x00395697, 0x003A4E97, 0x00396497, - 0x00000003, 0x00395697, 0x003A4E97, 0x00397297, - // Block 88, offset 0x1600 - 0x00000003, 0x00395697, 0x003A4E97, 0x00397497, 0x00000003, 0x00395699, - 0x003A4E99, 0x003A8E99, 0x00000003, 0x00395699, 0x003A4E99, 0x003A9099, - 0x00000003, 0x00396499, 0x00397299, 0x003A8E99, 0x00000003, 0x00396499, - 0x00397299, 0x003A9099, 0x00000008, 0x0039649A, 0x003A409A, 0x0002129A, - 0x0039649A, 0x003A409A, 0x0039389A, 0x003A409A, 0x003A689A, 0x00000003, - 0x00396497, 0x003A4E97, 0x00397297, 0x00000003, 0x00396499, 0x003A4E99, - 0x00397299, 0x00000003, 0x00396499, 0x003A4E99, 0x003A8E99, 0x00000003, - 0x00396499, 0x003A4E99, 0x003A9099, 0x00000003, 0x00397299, 0x00396499, - 0x003A9099, 0x00000003, 0x00397299, 0x003A4E99, 0x003A8E99, 0x00000003, - 0x00397299, 0x003A4E99, 0x003A9099, 0x00000004, 0x0039A49A, 0x0039C69A, - 0x003A749A, 0x003A409A, 0x00000003, 0x0039C697, - // Block 89, offset 0x1640 - 0x00396497, 0x00397297, 0x00000003, 0x0039C699, 0x00396499, 0x003A8E99, - 0x00000003, 0x0039C697, 0x00397297, 0x00396497, 0x00000003, 0x0039C699, - 0x00397499, 0x003A8E99, 0x00000003, 0x0039C699, 0x00397499, 0x003A9099, - 0x00000003, 0x0039C697, 0x003A4E97, 0x00396497, 0x00000003, 0x0039C697, - 0x003A4E97, 0x00397297, 0x00000003, 0x0039C699, 0x003A4E99, 0x00397299, - 0x00000003, 0x0039C697, 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039C699, - 0x003A4E99, 0x003A4E99, 0x00000003, 0x0039C899, 0x00396499, 0x003A9099, - 0x00000003, 0x0039C897, 0x00397297, 0x003A4E97, 0x00000003, 0x0039C899, - 0x00397299, 0x003A4E99, 0x00000003, 0x0039C899, 0x00397299, 0x003A9099, - 0x00000003, 0x0039C897, 0x003A4E97, 0x00397497, 0x00000003, 0x0039C899, - 0x003A4E99, 0x00397499, 0x00000003, 0x0039C897, - // Block 90, offset 0x1680 - 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039C899, 0x003A4E99, 0x003A4E99, - 0x00000003, 0x0039DC97, 0x00397297, 0x00397297, 0x00000003, 0x0039DC99, - 0x00397299, 0x00397299, 0x00000003, 0x0039DC99, 0x00397299, 0x003A9099, - 0x00000004, 0x0039DC9A, 0x003A409A, 0x0039EE9A, 0x003A4E9A, 0x00000003, - 0x0039DC9A, 0x003A409A, 0x003A8E9A, 0x00000012, 0x0039DC9A, 0x003A409A, - 0x003A8E9A, 0x0002129A, 0x0039389A, 0x003A409A, 0x003A409A, 0x003A689A, - 0x0002129A, 0x0039EE9A, 0x003A409A, 0x003A909A, 0x003A689A, 0x0002129A, - 0x003A749A, 0x0039C69A, 0x003A409A, 0x003A4E9A, 0x00000003, 0x0039DC9A, - 0x003A409A, 0x003AAA9A, 0x00000003, 0x0039DC97, 0x003A4E97, 0x003A4E97, - 0x00000003, 0x0039DC99, 0x003A4E99, 0x003A4E99, 0x00000003, 0x0039DE99, - 0x00397299, 0x003A8E99, 0x00000003, 0x0039DE99, - // Block 91, offset 0x16c0 - 0x00397299, 0x003A9099, 0x00000003, 0x0039DE97, 0x00397497, 0x003A4E97, - 0x00000003, 0x0039DE99, 0x00397499, 0x003A4E99, 0x00000003, 0x0039E697, - 0x003A4E97, 0x00397297, 0x00000003, 0x0039E699, 0x003A4E99, 0x00397299, - 0x00000003, 0x0039E697, 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039E699, - 0x003A4E99, 0x003A9099, 0x00000003, 0x0039EE97, 0x00396497, 0x003A4E97, - 0x00000003, 0x0039EE99, 0x00396499, 0x003A4E99, 0x00000004, 0x0039EE9A, - 0x003A409A, 0x003A909A, 0x003A689A, 0x00000003, 0x0039EE97, 0x003A4E97, - 0x003A4E97, 0x00000003, 0x0039EE99, 0x003A4E99, 0x003A4E99, 0x00000003, - 0x0039EE99, 0x003A4E99, 0x003A8E99, 0x00000003, 0x0039EE99, 0x003A4E99, - 0x003A9099, 0x00000003, 0x0039F099, 0x003A4E99, 0x003A4E99, 0x00000003, - 0x0039F099, 0x003A4E99, 0x003A8E99, 0x00000003, - // Block 92, offset 0x1700 - 0x0039F099, 0x003A4E99, 0x003A9099, 0x00000003, 0x0039FC97, 0x00397497, - 0x003A4E97, 0x00000003, 0x0039FC99, 0x00397499, 0x003A4E99, 0x00000003, - 0x0039FC99, 0x003A4E99, 0x003A9099, 0x00000003, 0x003A129A, 0x003A409A, - 0x003AAA9A, 0x00000003, 0x003A1297, 0x003A4E97, 0x00397297, 0x00000003, - 0x003A1299, 0x003A4E99, 0x00397299, 0x00000003, 0x003A1299, 0x003A4E99, - 0x003A4E99, 0x00000003, 0x003A1299, 0x003A4E99, 0x003A9099, 0x00000003, - 0x003A1A97, 0x003A4E97, 0x003A4E97, 0x00000003, 0x003A1A99, 0x003A4E99, - 0x003A4E99, 0x00000003, 0x003A1A99, 0x003A4E99, 0x003A9099, 0x00000002, - 0x003A4099, 0x00391E99, 0x00000002, 0x003A409A, 0x00391E9A, 0x00000002, - 0x003A4099, 0x00392099, 0x00000002, 0x003A409A, 0x0039209A, 0x00000002, - 0x003A4099, 0x00392899, 0x00000002, 0x003A409A, - // Block 93, offset 0x1740 - 0x0039289A, 0x00000003, 0x003A4097, 0x00396497, 0x00396497, 0x00000003, - 0x003A4099, 0x00396499, 0x00396499, 0x00000003, 0x003A4097, 0x00396497, - 0x003A4E97, 0x00000003, 0x003A4099, 0x00396499, 0x003A4E99, 0x00000003, - 0x003A4099, 0x00396499, 0x003A9099, 0x00000003, 0x003A4097, 0x00397297, - 0x003A4E97, 0x00000003, 0x003A4099, 0x00397299, 0x003A4E99, 0x00000003, - 0x003A4099, 0x00397299, 0x003A8E99, 0x00000003, 0x003A4099, 0x00397299, - 0x003A9099, 0x00000003, 0x003A4097, 0x00397497, 0x003A4E97, 0x00000003, - 0x003A4099, 0x00397499, 0x003A4E99, 0x00000003, 0x003A4097, 0x003A4E97, - 0x00397297, 0x00000003, 0x003A4099, 0x003A4E99, 0x00397299, 0x00000003, - 0x003A4099, 0x003A4E99, 0x003A9099, 0x00000002, 0x003A4E84, 0xA0013A04, - 0x00000003, 0x003A4E97, 0x00396497, 0x00397297, - // Block 94, offset 0x1780 - 0x00000003, 0x003A4E97, 0x00396497, 0x00397497, 0x00000003, 0x003A4E97, - 0x00396497, 0x003A4E97, 0x00000003, 0x003A4E99, 0x00396499, 0x003A9099, - 0x00000003, 0x003A4E97, 0x00397297, 0x00396497, 0x00000003, 0x003A4E97, - 0x00397297, 0x003A4E97, 0x00000004, 0x003A4E9A, 0x0039729A, 0x003A4E9A, - 0x0039889A, 0x00000003, 0x003A4E99, 0x00397299, 0x003A9099, 0x00000003, - 0x003A4E97, 0x00397497, 0x00396497, 0x00000003, 0x003A4E97, 0x00397497, - 0x003A4E97, 0x00000003, 0x003A4E99, 0x00397499, 0x003A9099, 0x00000003, - 0x003A4E99, 0x003A4E99, 0x003A9099, 0x00000003, 0x003A5697, 0x00396497, - 0x00397297, 0x00000003, 0x003A5699, 0x00396499, 0x00397299, 0x00000003, - 0x003A5697, 0x00396497, 0x003A4E97, 0x00000003, 0x003A5699, 0x00396499, - 0x003A4E99, 0x00000003, 0x003A5699, 0x00396499, - // Block 95, offset 0x17c0 - 0x003A8E99, 0x00000003, 0x003A5699, 0x00396499, 0x003A9099, 0x00000003, - 0x003A5697, 0x00397297, 0x003A4E97, 0x00000003, 0x003A5699, 0x00397299, - 0x003A8E99, 0x00000003, 0x003A5699, 0x00397299, 0x003A9099, 0x00000003, - 0x003A5699, 0x003A4E99, 0x003A8E99, 0x00000003, 0x003A5699, 0x003A4E99, - 0x003A9099, 0x00000003, 0x003A6897, 0x003A4E97, 0x00396497, 0x00000003, - 0x003A6897, 0x003A4E97, 0x003A4E97, 0x00000002, 0x403A6C20, 0xAE60BE02, - 0x00000002, 0x403A7220, 0xAE60BE02, 0x00000004, 0x003A749A, 0x0039C69A, - 0x003A409A, 0x003A4E9A, 0x00000003, 0x003A9099, 0x00396499, 0x003A9099, - 0x00000003, 0x003A9099, 0x00397299, 0x003A9099, 0x00000003, 0x003A9097, - 0x003A4E97, 0x003A4E97, 0x00000003, 0x003A9099, 0x003A4E99, 0x003A4E99, - 0x00000003, 0x003A9099, 0x003A4E99, 0x003A9099, - // Block 96, offset 0x1800 - 0x00000002, 0x403AAA20, 0xAE60BE02, 0x00000002, 0x003AB284, 0xA0013C04, - 0x00000002, 0x003AB484, 0xA0013A04, 0x00000002, 0x003AB484, 0xA0013C04, - 0x00000002, 0x003AB884, 0xA0013C04, 0x00000002, 0x003AC484, 0xA0013A04, - 0x00000002, 0x003AD884, 0xA0013A04, 0x00000002, 0x003B9484, 0xA0013904, - 0x00000002, 0x003B9684, 0xA0013904, 0x00000002, 0x003B9A84, 0xA0013904, - 0x00000002, 0x403FEC20, 0xA070F102, 0x00000002, 0x403FEE20, 0xA070F102, - 0x00000002, 0x403FF020, 0xA070F102, 0x00000002, 0x403FFC20, 0xA070F102, - 0x00000002, 0x40400A20, 0xA070F102, 0x00000002, 0x40400E20, 0xA070F102, - 0x00000002, 0x40401A20, 0xA070F102, 0x00000002, 0x40401E20, 0xA070F102, - 0x00000002, 0x40402820, 0xA070F102, 0x00000002, 0x40402C20, 0xA070F102, - 0x00000002, 0x40403020, 0xA070F102, 0x00000002, - // Block 97, offset 0x1840 - 0x4040B020, 0xA070F102, 0x00000002, 0x4040B220, 0xA070F102, 0x00000002, - 0x0040B684, 0x0040F884, 0x00000002, 0x4040CA20, 0xA070F102, 0x00000002, - 0x40411620, 0xA070F102, 0x00000002, 0x40411E20, 0xA070F102, 0x00000002, - 0x40412020, 0xA070F102, 0x00000002, 0x40412A20, 0xA070F102, 0x00000002, - 0x40414620, 0xA070F102, 0x00000002, 0x40415420, 0xA070F102, 0x00000002, - 0x40422A20, 0xA070F102, 0x00000002, 0x40422C20, 0xA070F102, 0x00000002, - 0x00442284, 0x00449084, 0x00000002, 0x00443E84, 0x00449084, 0x00000002, - 0x00444884, 0x00449084, 0x00000002, 0x00445884, 0x00449084, 0x00000002, - 0x00445884, 0x00449084, 0x00000002, 0x00445A84, 0x00449084, 0x00000002, - 0x00446684, 0x00449084, 0x00000002, 0x4046AA20, 0xA070F102, 0x00000002, - 0x4046AC20, 0xA070F102, 0x00000002, 0x4046BE20, - // Block 98, offset 0x1880 - 0xA070F102, 0x00000002, 0x40491020, 0x40498420, 0x00000002, 0x40491020, - 0x40498620, 0x00000002, 0x40491020, 0x40498820, 0x00000002, 0x40491020, - 0x40498A20, 0x00000002, 0x40491020, 0x40498C20, 0x00000002, 0x40491220, - 0x40498420, 0x00000002, 0x40491220, 0x40498620, 0x00000002, 0x40491220, - 0x40498820, 0x00000002, 0x40491220, 0x40498A20, 0x00000002, 0x40491220, - 0x40498C20, 0x00000002, 0x40491420, 0x40498420, 0x00000002, 0x40491420, - 0x40498620, 0x00000002, 0x40491420, 0x40498820, 0x00000002, 0x40491420, - 0x40498A20, 0x00000002, 0x40491420, 0x40498C20, 0x00000002, 0x40491620, - 0x40498420, 0x00000002, 0x40491620, 0x40498620, 0x00000002, 0x40491620, - 0x40498820, 0x00000002, 0x40491620, 0x40498A20, 0x00000002, 0x40491620, - 0x40498C20, 0x00000002, 0x40491820, 0x40498420, - // Block 99, offset 0x18c0 - 0x00000002, 0x40491820, 0x40498620, 0x00000002, 0x40491820, 0x40498820, - 0x00000002, 0x40491820, 0x40498A20, 0x00000002, 0x40491820, 0x40498C20, - 0x00000002, 0x40491A20, 0x40498420, 0x00000002, 0x40491A20, 0x40498620, - 0x00000002, 0x40491A20, 0x40498820, 0x00000002, 0x40491A20, 0x40498A20, - 0x00000002, 0x40491A20, 0x40498C20, 0x00000002, 0x40491C20, 0x40498420, - 0x00000002, 0x40491C20, 0x40498620, 0x00000002, 0x40491C20, 0x40498820, - 0x00000002, 0x40491C20, 0x40498A20, 0x00000002, 0x40491C20, 0x40498C20, - 0x00000002, 0x40491E20, 0x40498420, 0x00000002, 0x40491E20, 0x40498620, - 0x00000002, 0x40491E20, 0x40498820, 0x00000002, 0x40491E20, 0x40498A20, - 0x00000002, 0x40491E20, 0x40498C20, 0x00000002, 0x40492020, 0x40498420, - 0x00000002, 0x40492020, 0x40498620, 0x00000002, - // Block 100, offset 0x1900 - 0x40492020, 0x40498820, 0x00000002, 0x40492020, 0x40498A20, 0x00000002, - 0x40492020, 0x40498C20, 0x00000002, 0x40492220, 0x40498420, 0x00000002, - 0x40492220, 0x40498620, 0x00000002, 0x40492220, 0x40498820, 0x00000002, - 0x40492220, 0x40498A20, 0x00000002, 0x40492220, 0x40498C20, 0x00000002, - 0x40492420, 0x40498420, 0x00000002, 0x40492420, 0x40498620, 0x00000002, - 0x40492420, 0x40498820, 0x00000002, 0x40492420, 0x40498A20, 0x00000002, - 0x40492420, 0x40498C20, 0x00000002, 0x40492620, 0x40498420, 0x00000002, - 0x40492620, 0x40498620, 0x00000002, 0x40492620, 0x40498820, 0x00000002, - 0x40492620, 0x40498A20, 0x00000002, 0x40492620, 0x40498C20, 0x00000002, - 0x40492820, 0x40498420, 0x00000002, 0x40492820, 0x40498620, 0x00000002, - 0x40492820, 0x40498820, 0x00000002, 0x40492820, - // Block 101, offset 0x1940 - 0x40498A20, 0x00000002, 0x40492820, 0x40498C20, 0x00000002, 0x40492A20, - 0x40498420, 0x00000002, 0x40492A20, 0x40498620, 0x00000002, 0x40492A20, - 0x40498820, 0x00000002, 0x40492A20, 0x40498A20, 0x00000002, 0x40492A20, - 0x40498C20, 0x00000002, 0x40492C20, 0x40498420, 0x00000002, 0x40492C20, - 0x40498620, 0x00000002, 0x40492C20, 0x40498820, 0x00000002, 0x40492C20, - 0x40498A20, 0x00000002, 0x40492C20, 0x40498C20, 0x00000002, 0x40492E20, - 0x40498420, 0x00000002, 0x40492E20, 0x40498620, 0x00000002, 0x40492E20, - 0x40498820, 0x00000002, 0x40492E20, 0x40498A20, 0x00000002, 0x40492E20, - 0x40498C20, 0x00000002, 0x40493020, 0x40498420, 0x00000002, 0x40493020, - 0x40498620, 0x00000002, 0x40493020, 0x40498820, 0x00000002, 0x40493020, - 0x40498A20, 0x00000002, 0x40493020, 0x40498C20, - // Block 102, offset 0x1980 - 0x00000002, 0x40493220, 0x40498420, 0x00000002, 0x40493220, 0x40498620, - 0x00000002, 0x40493220, 0x40498820, 0x00000002, 0x40493220, 0x40498A20, - 0x00000002, 0x40493220, 0x40498C20, 0x00000002, 0x40493420, 0x40498420, - 0x00000002, 0x40493420, 0x40498620, 0x00000002, 0x40493420, 0x40498820, - 0x00000002, 0x40493420, 0x40498A20, 0x00000002, 0x40493420, 0x40498C20, - 0x00000002, 0x40493620, 0x40498420, 0x00000002, 0x40493620, 0x40498620, - 0x00000002, 0x40493620, 0x40498820, 0x00000002, 0x40493620, 0x40498A20, - 0x00000002, 0x40493620, 0x40498C20, 0x00000002, 0x40493820, 0x40498420, - 0x00000002, 0x40493820, 0x40498620, 0x00000002, 0x40493820, 0x40498820, - 0x00000002, 0x40493820, 0x40498A20, 0x00000002, 0x40493820, 0x40498C20, - 0x00000002, 0x40493A20, 0x40498420, 0x00000002, - // Block 103, offset 0x19c0 - 0x40493A20, 0x40498620, 0x00000002, 0x40493A20, 0x40498820, 0x00000002, - 0x40493A20, 0x40498A20, 0x00000002, 0x40493A20, 0x40498C20, 0x00000002, - 0x40493C20, 0x40498420, 0x00000002, 0x40493C20, 0x40498620, 0x00000002, - 0x40493C20, 0x40498820, 0x00000002, 0x40493C20, 0x40498A20, 0x00000002, - 0x40493C20, 0x40498C20, 0x00000002, 0x40493E20, 0x40498420, 0x00000002, - 0x40493E20, 0x40498620, 0x00000002, 0x40493E20, 0x40498820, 0x00000002, - 0x40493E20, 0x40498A20, 0x00000002, 0x40493E20, 0x40498C20, 0x00000002, - 0x40494020, 0x40498420, 0x00000002, 0x40494020, 0x40498620, 0x00000002, - 0x40494020, 0x40498820, 0x00000002, 0x40494020, 0x40498A20, 0x00000002, - 0x40494020, 0x40498C20, 0x00000002, 0x40494220, 0x40498420, 0x00000002, - 0x40494220, 0x40498620, 0x00000002, 0x40494220, - // Block 104, offset 0x1a00 - 0x40498820, 0x00000002, 0x40494220, 0x40498A20, 0x00000002, 0x40494220, - 0x40498C20, 0x00000002, 0x40494420, 0x40498420, 0x00000002, 0x40494420, - 0x40498620, 0x00000002, 0x40494420, 0x40498820, 0x00000002, 0x40494420, - 0x40498A20, 0x00000002, 0x40494420, 0x40498C20, 0x00000002, 0x40494620, - 0x40498420, 0x00000002, 0x40494620, 0x40498620, 0x00000002, 0x40494620, - 0x40498820, 0x00000002, 0x40494620, 0x40498A20, 0x00000002, 0x40494620, - 0x40498C20, 0x00000002, 0x40494820, 0x40498420, 0x00000002, 0x40494820, - 0x40498620, 0x00000002, 0x40494820, 0x40498820, 0x00000002, 0x40494820, - 0x40498A20, 0x00000002, 0x40494820, 0x40498C20, 0x00000002, 0x40494A20, - 0x40498420, 0x00000002, 0x40494A20, 0x40498620, 0x00000002, 0x40494A20, - 0x40498820, 0x00000002, 0x40494A20, 0x40498A20, - // Block 105, offset 0x1a40 - 0x00000002, 0x40494A20, 0x40498C20, 0x00000002, 0x40494C20, 0x40498420, - 0x00000002, 0x40494C20, 0x40498620, 0x00000002, 0x40494C20, 0x40498820, - 0x00000002, 0x40494C20, 0x40498A20, 0x00000002, 0x40494C20, 0x40498C20, - 0x00000002, 0x40494E20, 0x40498420, 0x00000002, 0x40494E20, 0x40498620, - 0x00000002, 0x40494E20, 0x40498820, 0x00000002, 0x40494E20, 0x40498A20, - 0x00000002, 0x40494E20, 0x40498C20, 0x00000002, 0x40495020, 0x40498420, - 0x00000002, 0x40495020, 0x40498620, 0x00000002, 0x40495020, 0x40498820, - 0x00000002, 0x40495020, 0x40498A20, 0x00000002, 0x40495020, 0x40498C20, - 0x00000002, 0x40495220, 0x40498420, 0x00000002, 0x40495220, 0x40498620, - 0x00000002, 0x40495220, 0x40498820, 0x00000002, 0x40495220, 0x40498A20, - 0x00000002, 0x40495220, 0x40498C20, 0x00000002, - // Block 106, offset 0x1a80 - 0x40495420, 0x40498420, 0x00000002, 0x40495420, 0x40498620, 0x00000002, - 0x40495420, 0x40498820, 0x00000002, 0x40495420, 0x40498A20, 0x00000002, - 0x40495420, 0x40498C20, 0x00000002, 0x40495620, 0x40498420, 0x00000002, - 0x40495620, 0x40498620, 0x00000002, 0x40495620, 0x40498820, 0x00000002, - 0x40495620, 0x40498A20, 0x00000002, 0x40495620, 0x40498C20, 0x00000002, - 0x40495820, 0x40498420, 0x00000002, 0x40495820, 0x40498620, 0x00000002, - 0x40495820, 0x40498820, 0x00000002, 0x40495820, 0x40498A20, 0x00000002, - 0x40495820, 0x40498C20, 0x00000002, 0x40495A20, 0x40498420, 0x00000002, - 0x40495A20, 0x40498620, 0x00000002, 0x40495A20, 0x40498820, 0x00000002, - 0x40495A20, 0x40498A20, 0x00000002, 0x40495A20, 0x40498C20, 0x00000002, - 0x40495C20, 0x40498420, 0x00000002, 0x40495C20, - // Block 107, offset 0x1ac0 - 0x40498620, 0x00000002, 0x40495C20, 0x40498820, 0x00000002, 0x40495C20, - 0x40498A20, 0x00000002, 0x40495C20, 0x40498C20, 0x00000002, 0x40495E20, - 0x40498420, 0x00000002, 0x40495E20, 0x40498620, 0x00000002, 0x40495E20, - 0x40498820, 0x00000002, 0x40495E20, 0x40498A20, 0x00000002, 0x40495E20, - 0x40498C20, 0x00000002, 0x40496020, 0x40498420, 0x00000002, 0x40496020, - 0x40498620, 0x00000002, 0x40496020, 0x40498820, 0x00000002, 0x40496020, - 0x40498A20, 0x00000002, 0x40496020, 0x40498C20, 0x00000002, 0x40496220, - 0x40498420, 0x00000002, 0x40496220, 0x40498620, 0x00000002, 0x40496220, - 0x40498820, 0x00000002, 0x40496220, 0x40498A20, 0x00000002, 0x40496220, - 0x40498C20, 0x00000002, 0x40496420, 0x40498420, 0x00000002, 0x40496420, - 0x40498620, 0x00000002, 0x40496420, 0x40498820, - // Block 108, offset 0x1b00 - 0x00000002, 0x40496420, 0x40498A20, 0x00000002, 0x40496420, 0x40498C20, - 0x00000002, 0x40496620, 0x40498420, 0x00000002, 0x40496620, 0x40498620, - 0x00000002, 0x40496620, 0x40498820, 0x00000002, 0x40496620, 0x40498A20, - 0x00000002, 0x40496620, 0x40498C20, 0x00000002, 0x40496820, 0x40498420, - 0x00000002, 0x40496820, 0x40498620, 0x00000002, 0x40496820, 0x40498820, - 0x00000002, 0x40496820, 0x40498A20, 0x00000002, 0x40496820, 0x40498C20, - 0x00000002, 0x40496A20, 0x40498420, 0x00000002, 0x40496A20, 0x40498620, - 0x00000002, 0x40496A20, 0x40498820, 0x00000002, 0x40496A20, 0x40498A20, - 0x00000002, 0x40496A20, 0x40498C20, 0x00000002, 0x40499020, 0x4049E620, - 0x00000002, 0x40499020, 0x4049E820, 0x00000002, 0x40499020, 0x4049EA20, - 0x00000002, 0x40499020, 0x4049EC20, 0x00000002, - // Block 109, offset 0x1b40 - 0x40499020, 0x4049EE20, 0x00000002, 0x40499220, 0x4049E620, 0x00000002, - 0x40499220, 0x4049E820, 0x00000002, 0x40499220, 0x4049EA20, 0x00000002, - 0x40499220, 0x4049EC20, 0x00000002, 0x40499220, 0x4049EE20, 0x00000002, - 0x40499420, 0x4049E620, 0x00000002, 0x40499420, 0x4049E820, 0x00000002, - 0x40499420, 0x4049EA20, 0x00000002, 0x40499420, 0x4049EC20, 0x00000002, - 0x40499420, 0x4049EE20, 0x00000002, 0x40499620, 0x4049E620, 0x00000002, - 0x40499620, 0x4049E820, 0x00000002, 0x40499620, 0x4049EA20, 0x00000002, - 0x40499620, 0x4049EC20, 0x00000002, 0x40499620, 0x4049EE20, 0x00000002, - 0x40499820, 0x4049E620, 0x00000002, 0x40499820, 0x4049E820, 0x00000002, - 0x40499820, 0x4049EA20, 0x00000002, 0x40499820, 0x4049EC20, 0x00000002, - 0x40499820, 0x4049EE20, 0x00000002, 0x40499A20, - // Block 110, offset 0x1b80 - 0x4049E620, 0x00000002, 0x40499A20, 0x4049E820, 0x00000002, 0x40499A20, - 0x4049EA20, 0x00000002, 0x40499A20, 0x4049EC20, 0x00000002, 0x40499A20, - 0x4049EE20, 0x00000002, 0x40499C20, 0x4049E620, 0x00000002, 0x40499C20, - 0x4049E820, 0x00000002, 0x40499C20, 0x4049EA20, 0x00000002, 0x40499C20, - 0x4049EC20, 0x00000002, 0x40499C20, 0x4049EE20, 0x00000002, 0x40499E20, - 0x4049E620, 0x00000002, 0x40499E20, 0x4049E820, 0x00000002, 0x40499E20, - 0x4049EA20, 0x00000002, 0x40499E20, 0x4049EC20, 0x00000002, 0x40499E20, - 0x4049EE20, 0x00000002, 0x4049A020, 0x4049E620, 0x00000002, 0x4049A020, - 0x4049E820, 0x00000002, 0x4049A020, 0x4049EA20, 0x00000002, 0x4049A020, - 0x4049EC20, 0x00000002, 0x4049A020, 0x4049EE20, 0x00000002, 0x4049A220, - 0x4049E620, 0x00000002, 0x4049A220, 0x4049E820, - // Block 111, offset 0x1bc0 - 0x00000002, 0x4049A220, 0x4049EA20, 0x00000002, 0x4049A220, 0x4049EC20, - 0x00000002, 0x4049A220, 0x4049EE20, 0x00000002, 0x4049A420, 0x4049E620, - 0x00000002, 0x4049A420, 0x4049E820, 0x00000002, 0x4049A420, 0x4049EA20, - 0x00000002, 0x4049A420, 0x4049EC20, 0x00000002, 0x4049A420, 0x4049EE20, - 0x00000002, 0x4049A620, 0x4049E620, 0x00000002, 0x4049A620, 0x4049E820, - 0x00000002, 0x4049A620, 0x4049EA20, 0x00000002, 0x4049A620, 0x4049EC20, - 0x00000002, 0x4049A620, 0x4049EE20, 0x00000002, 0x4049A820, 0x4049E620, - 0x00000002, 0x4049A820, 0x4049E820, 0x00000002, 0x4049A820, 0x4049EA20, - 0x00000002, 0x4049A820, 0x4049EC20, 0x00000002, 0x4049A820, 0x4049EE20, - 0x00000002, 0x4049AA20, 0x4049E620, 0x00000002, 0x4049AA20, 0x4049E820, - 0x00000002, 0x4049AA20, 0x4049EA20, 0x00000002, - // Block 112, offset 0x1c00 - 0x4049AA20, 0x4049EC20, 0x00000002, 0x4049AA20, 0x4049EE20, 0x00000002, - 0x4049AC20, 0x4049E620, 0x00000002, 0x4049AC20, 0x4049E820, 0x00000002, - 0x4049AC20, 0x4049EA20, 0x00000002, 0x4049AC20, 0x4049EC20, 0x00000002, - 0x4049AC20, 0x4049EE20, 0x00000002, 0x4049AE20, 0x4049E620, 0x00000002, - 0x4049AE20, 0x4049E820, 0x00000002, 0x4049AE20, 0x4049EA20, 0x00000002, - 0x4049AE20, 0x4049EC20, 0x00000002, 0x4049AE20, 0x4049EE20, 0x00000002, - 0x4049B020, 0x4049E620, 0x00000002, 0x4049B020, 0x4049E820, 0x00000002, - 0x4049B020, 0x4049EA20, 0x00000002, 0x4049B020, 0x4049EC20, 0x00000002, - 0x4049B020, 0x4049EE20, 0x00000002, 0x4049B220, 0x4049E620, 0x00000002, - 0x4049B220, 0x4049E820, 0x00000002, 0x4049B220, 0x4049EA20, 0x00000002, - 0x4049B220, 0x4049EC20, 0x00000002, 0x4049B220, - // Block 113, offset 0x1c40 - 0x4049EE20, 0x00000002, 0x4049B420, 0x4049E620, 0x00000002, 0x4049B420, - 0x4049E820, 0x00000002, 0x4049B420, 0x4049EA20, 0x00000002, 0x4049B420, - 0x4049EC20, 0x00000002, 0x4049B420, 0x4049EE20, 0x00000002, 0x4049B620, - 0x4049E620, 0x00000002, 0x4049B620, 0x4049E820, 0x00000002, 0x4049B620, - 0x4049EA20, 0x00000002, 0x4049B620, 0x4049EC20, 0x00000002, 0x4049B620, - 0x4049EE20, 0x00000002, 0x4049B820, 0x4049E620, 0x00000002, 0x4049B820, - 0x4049E820, 0x00000002, 0x4049B820, 0x4049EA20, 0x00000002, 0x4049B820, - 0x4049EC20, 0x00000002, 0x4049B820, 0x4049EE20, 0x00000002, 0x4049BA20, - 0x4049E620, 0x00000002, 0x4049BA20, 0x4049E820, 0x00000002, 0x4049BA20, - 0x4049EA20, 0x00000002, 0x4049BA20, 0x4049EC20, 0x00000002, 0x4049BA20, - 0x4049EE20, 0x00000002, 0x4049BC20, 0x4049E620, - // Block 114, offset 0x1c80 - 0x00000002, 0x4049BC20, 0x4049E820, 0x00000002, 0x4049BC20, 0x4049EA20, - 0x00000002, 0x4049BC20, 0x4049EC20, 0x00000002, 0x4049BC20, 0x4049EE20, - 0x00000002, 0x4049BE20, 0x4049E620, 0x00000002, 0x4049BE20, 0x4049E820, - 0x00000002, 0x4049BE20, 0x4049EA20, 0x00000002, 0x4049BE20, 0x4049EC20, - 0x00000002, 0x4049BE20, 0x4049EE20, 0x00000002, 0x4049C020, 0x4049E620, - 0x00000002, 0x4049C020, 0x4049E820, 0x00000002, 0x4049C020, 0x4049EA20, - 0x00000002, 0x4049C020, 0x4049EC20, 0x00000002, 0x4049C020, 0x4049EE20, - 0x00000002, 0x4049C220, 0x4049E620, 0x00000002, 0x4049C220, 0x4049E820, - 0x00000002, 0x4049C220, 0x4049EA20, 0x00000002, 0x4049C220, 0x4049EC20, - 0x00000002, 0x4049C220, 0x4049EE20, 0x00000003, 0x0049C484, 0x0049AC84, - 0x4049E620, 0x00000003, 0x0049C484, 0x0049AC84, - // Block 115, offset 0x1cc0 - 0x4049E820, 0x00000003, 0x0049C484, 0x0049AC84, 0x4049EA20, 0x00000003, - 0x0049C484, 0x0049AC84, 0x4049EC20, 0x00000003, 0x0049C484, 0x0049AC84, - 0x4049EE20, 0x00000003, 0x0049C484, 0x0049BA84, 0x4049E620, 0x00000003, - 0x0049C484, 0x0049BA84, 0x4049E820, 0x00000003, 0x0049C484, 0x0049BA84, - 0x4049EA20, 0x00000003, 0x0049C484, 0x0049BA84, 0x4049EC20, 0x00000003, - 0x0049C484, 0x0049BA84, 0x4049EE20, 0x00000002, 0x4049C420, 0x4049E620, - 0x00000002, 0x4049C420, 0x4049E820, 0x00000002, 0x4049C420, 0x4049EA20, - 0x00000002, 0x4049C420, 0x4049EC20, 0x00000002, 0x4049C420, 0x4049EE20, - 0x00000002, 0x4049C620, 0x4049E620, 0x00000002, 0x4049C620, 0x4049E820, - 0x00000002, 0x4049C620, 0x4049EA20, 0x00000002, 0x4049C620, 0x4049EC20, - 0x00000002, 0x4049C620, 0x4049EE20, 0x00000002, - // Block 116, offset 0x1d00 - 0x4049C820, 0x4049E620, 0x00000002, 0x4049C820, 0x4049E820, 0x00000002, - 0x4049C820, 0x4049EA20, 0x00000002, 0x4049C820, 0x4049EC20, 0x00000002, - 0x4049C820, 0x4049EE20, 0x00000002, 0x4049F020, 0x404A5A20, 0x00000002, - 0x4049F020, 0x404A5C20, 0x00000002, 0x4049F020, 0x404A6220, 0x00000002, - 0x4049F020, 0x404A6620, 0x00000002, 0x4049F020, 0x404A6820, 0x00000002, - 0x4049F220, 0x404A5A20, 0x00000002, 0x4049F220, 0x404A5C20, 0x00000002, - 0x4049F220, 0x404A6220, 0x00000002, 0x4049F220, 0x404A6620, 0x00000002, - 0x4049F220, 0x404A6820, 0x00000002, 0x4049F420, 0x404A5A20, 0x00000002, - 0x4049F420, 0x404A5C20, 0x00000002, 0x4049F420, 0x404A6220, 0x00000002, - 0x4049F420, 0x404A6620, 0x00000002, 0x4049F420, 0x404A6820, 0x00000002, - 0x4049F620, 0x404A5A20, 0x00000002, 0x4049F620, - // Block 117, offset 0x1d40 - 0x404A5C20, 0x00000002, 0x4049F620, 0x404A6220, 0x00000002, 0x4049F620, - 0x404A6620, 0x00000002, 0x4049F620, 0x404A6820, 0x00000002, 0x4049F820, - 0x404A5A20, 0x00000002, 0x4049F820, 0x404A5C20, 0x00000002, 0x4049F820, - 0x404A6220, 0x00000002, 0x4049F820, 0x404A6620, 0x00000002, 0x4049F820, - 0x404A6820, 0x00000002, 0x4049FA20, 0x404A5A20, 0x00000002, 0x4049FA20, - 0x404A5C20, 0x00000002, 0x4049FA20, 0x404A6220, 0x00000002, 0x4049FA20, - 0x404A6620, 0x00000002, 0x4049FA20, 0x404A6820, 0x00000002, 0x4049FC20, - 0x404A5A20, 0x00000002, 0x4049FC20, 0x404A5C20, 0x00000002, 0x4049FC20, - 0x404A6220, 0x00000002, 0x4049FC20, 0x404A6620, 0x00000002, 0x4049FC20, - 0x404A6820, 0x00000002, 0x4049FE20, 0x404A5A20, 0x00000002, 0x4049FE20, - 0x404A5C20, 0x00000002, 0x4049FE20, 0x404A6220, - // Block 118, offset 0x1d80 - 0x00000002, 0x4049FE20, 0x404A6620, 0x00000002, 0x4049FE20, 0x404A6820, - 0x00000002, 0x404A0020, 0x404A5A20, 0x00000002, 0x404A0020, 0x404A5C20, - 0x00000002, 0x404A0020, 0x404A6220, 0x00000002, 0x404A0020, 0x404A6620, - 0x00000002, 0x404A0020, 0x404A6820, 0x00000002, 0x404A0220, 0x404A5A20, - 0x00000002, 0x404A0220, 0x404A5C20, 0x00000002, 0x404A0220, 0x404A6220, - 0x00000002, 0x404A0220, 0x404A6620, 0x00000002, 0x404A0220, 0x404A6820, - 0x00000002, 0x404A0420, 0x404A5A20, 0x00000002, 0x404A0420, 0x404A5C20, - 0x00000002, 0x404A0420, 0x404A6220, 0x00000002, 0x404A0420, 0x404A6620, - 0x00000002, 0x404A0420, 0x404A6820, 0x00000002, 0x404A0620, 0x404A5A20, - 0x00000002, 0x404A0620, 0x404A5C20, 0x00000002, 0x404A0620, 0x404A6220, - 0x00000002, 0x404A0620, 0x404A6620, 0x00000002, - // Block 119, offset 0x1dc0 - 0x404A0620, 0x404A6820, 0x00000002, 0x404A0820, 0x404A5A20, 0x00000002, - 0x404A0820, 0x404A5C20, 0x00000002, 0x404A0820, 0x404A6220, 0x00000002, - 0x404A0820, 0x404A6620, 0x00000002, 0x404A0820, 0x404A6820, 0x00000002, - 0x404A0A20, 0x404A5A20, 0x00000002, 0x404A0A20, 0x404A5C20, 0x00000002, - 0x404A0A20, 0x404A6220, 0x00000002, 0x404A0A20, 0x404A6620, 0x00000002, - 0x404A0A20, 0x404A6820, 0x00000002, 0x404A0C20, 0x404A5A20, 0x00000002, - 0x404A0C20, 0x404A5C20, 0x00000002, 0x404A0C20, 0x404A6220, 0x00000002, - 0x404A0C20, 0x404A6620, 0x00000002, 0x404A0C20, 0x404A6820, 0x00000002, - 0x404A0E20, 0x404A5A20, 0x00000002, 0x404A0E20, 0x404A5C20, 0x00000002, - 0x404A0E20, 0x404A6220, 0x00000002, 0x404A0E20, 0x404A6620, 0x00000002, - 0x404A0E20, 0x404A6820, 0x00000002, 0x404A1020, - // Block 120, offset 0x1e00 - 0x404A5A20, 0x00000002, 0x404A1020, 0x404A5C20, 0x00000002, 0x404A1020, - 0x404A6220, 0x00000002, 0x404A1020, 0x404A6620, 0x00000002, 0x404A1020, - 0x404A6820, 0x00000002, 0x404A1220, 0x404A5A20, 0x00000002, 0x404A1220, - 0x404A5C20, 0x00000002, 0x404A1220, 0x404A6220, 0x00000002, 0x404A1220, - 0x404A6620, 0x00000002, 0x404A1220, 0x404A6820, 0x00000002, 0x404A1420, - 0x404A5A20, 0x00000002, 0x404A1420, 0x404A5C20, 0x00000002, 0x404A1420, - 0x404A6220, 0x00000002, 0x404A1420, 0x404A6620, 0x00000002, 0x404A1420, - 0x404A6820, 0x00000002, 0x404A1620, 0x404A5A20, 0x00000002, 0x404A1620, - 0x404A5C20, 0x00000002, 0x404A1620, 0x404A6220, 0x00000002, 0x404A1620, - 0x404A6620, 0x00000002, 0x404A1620, 0x404A6820, 0x00000002, 0x404A1820, - 0x404A5A20, 0x00000002, 0x404A1820, 0x404A5C20, - // Block 121, offset 0x1e40 - 0x00000002, 0x404A1820, 0x404A6220, 0x00000002, 0x404A1820, 0x404A6620, - 0x00000002, 0x404A1820, 0x404A6820, 0x00000002, 0x404A1A20, 0x404A5A20, - 0x00000002, 0x404A1A20, 0x404A5C20, 0x00000002, 0x404A1A20, 0x404A6220, - 0x00000002, 0x404A1A20, 0x404A6620, 0x00000002, 0x404A1A20, 0x404A6820, - 0x00000002, 0x404A1C20, 0x404A5A20, 0x00000002, 0x404A1C20, 0x404A5C20, - 0x00000002, 0x404A1C20, 0x404A6220, 0x00000002, 0x404A1C20, 0x404A6620, - 0x00000002, 0x404A1C20, 0x404A6820, 0x00000002, 0x404A1E20, 0x404A5A20, - 0x00000002, 0x404A1E20, 0x404A5C20, 0x00000002, 0x404A1E20, 0x404A6220, - 0x00000002, 0x404A1E20, 0x404A6620, 0x00000002, 0x404A1E20, 0x404A6820, - 0x00000002, 0x404A2020, 0x404A5A20, 0x00000002, 0x404A2020, 0x404A5C20, - 0x00000002, 0x404A2020, 0x404A6220, 0x00000002, - // Block 122, offset 0x1e80 - 0x404A2020, 0x404A6620, 0x00000002, 0x404A2020, 0x404A6820, 0x00000002, - 0x404A2220, 0x404A5A20, 0x00000002, 0x404A2220, 0x404A5C20, 0x00000002, - 0x404A2220, 0x404A6220, 0x00000002, 0x404A2220, 0x404A6620, 0x00000002, - 0x404A2220, 0x404A6820, 0x00000002, 0x404A2420, 0x404A5A20, 0x00000002, - 0x404A2420, 0x404A5C20, 0x00000002, 0x404A2420, 0x404A6220, 0x00000002, - 0x404A2420, 0x404A6620, 0x00000002, 0x404A2420, 0x404A6820, 0x00000002, - 0x404A2620, 0x404A5A20, 0x00000002, 0x404A2620, 0x404A5C20, 0x00000002, - 0x404A2620, 0x404A6220, 0x00000002, 0x404A2620, 0x404A6620, 0x00000002, - 0x404A2620, 0x404A6820, 0x00000002, 0x404A2820, 0x404A5A20, 0x00000002, - 0x404A2820, 0x404A5C20, 0x00000002, 0x404A2820, 0x404A6220, 0x00000002, - 0x404A2820, 0x404A6620, 0x00000002, 0x404A2820, - // Block 123, offset 0x1ec0 - 0x404A6820, 0x00000002, 0x404A2A20, 0x404A5A20, 0x00000002, 0x404A2A20, - 0x404A5C20, 0x00000002, 0x404A2A20, 0x404A6220, 0x00000002, 0x404A2A20, - 0x404A6620, 0x00000002, 0x404A2A20, 0x404A6820, 0x00000002, 0x404A2C20, - 0x404A5A20, 0x00000002, 0x404A2C20, 0x404A5C20, 0x00000002, 0x404A2C20, - 0x404A6220, 0x00000002, 0x404A2C20, 0x404A6620, 0x00000002, 0x404A2C20, - 0x404A6820, 0x00000002, 0x404A2E20, 0x404A5A20, 0x00000002, 0x404A2E20, - 0x404A5C20, 0x00000002, 0x404A2E20, 0x404A6220, 0x00000002, 0x404A2E20, - 0x404A6620, 0x00000002, 0x404A2E20, 0x404A6820, 0x00000002, 0x404A3020, - 0x404A5A20, 0x00000002, 0x404A3020, 0x404A5C20, 0x00000002, 0x404A3020, - 0x404A6220, 0x00000002, 0x404A3020, 0x404A6620, 0x00000002, 0x404A3020, - 0x404A6820, 0x00000002, 0x404A3220, 0x404A5A20, - // Block 124, offset 0x1f00 - 0x00000002, 0x404A3220, 0x404A5C20, 0x00000002, 0x404A3220, 0x404A6220, - 0x00000002, 0x404A3220, 0x404A6620, 0x00000002, 0x404A3220, 0x404A6820, - 0x00000002, 0x404A3420, 0x404A5A20, 0x00000002, 0x404A3420, 0x404A5C20, - 0x00000002, 0x404A3420, 0x404A6220, 0x00000002, 0x404A3420, 0x404A6620, - 0x00000002, 0x404A3420, 0x404A6820, 0x00000002, 0x404A3620, 0x404A5A20, - 0x00000002, 0x404A3620, 0x404A5C20, 0x00000002, 0x404A3620, 0x404A6220, - 0x00000002, 0x404A3620, 0x404A6620, 0x00000002, 0x404A3620, 0x404A6820, - 0x00000002, 0x404A3820, 0x404A5A20, 0x00000002, 0x404A3820, 0x404A5C20, - 0x00000002, 0x404A3820, 0x404A6220, 0x00000002, 0x404A3820, 0x404A6620, - 0x00000002, 0x404A3820, 0x404A6820, 0x00000002, 0x404A3A20, 0x404A5A20, - 0x00000002, 0x404A3A20, 0x404A5C20, 0x00000002, - // Block 125, offset 0x1f40 - 0x404A3A20, 0x404A6220, 0x00000002, 0x404A3A20, 0x404A6620, 0x00000002, - 0x404A3A20, 0x404A6820, 0x00000002, 0x404A3C20, 0x404A5A20, 0x00000002, - 0x404A3C20, 0x404A5C20, 0x00000002, 0x404A3C20, 0x404A6220, 0x00000002, - 0x404A3C20, 0x404A6620, 0x00000002, 0x404A3C20, 0x404A6820, 0x00000002, - 0x404A3E20, 0x404A5A20, 0x00000002, 0x404A3E20, 0x404A5C20, 0x00000002, - 0x404A3E20, 0x404A6220, 0x00000002, 0x404A3E20, 0x404A6620, 0x00000002, - 0x404A3E20, 0x404A6820, 0x00000002, 0x404A4020, 0x404A5A20, 0x00000002, - 0x404A4020, 0x404A5C20, 0x00000002, 0x404A4020, 0x404A6220, 0x00000002, - 0x404A4020, 0x404A6620, 0x00000002, 0x404A4020, 0x404A6820, 0x00000002, - 0x404A4220, 0x404A5A20, 0x00000002, 0x404A4220, 0x404A5C20, 0x00000002, - 0x404A4220, 0x404A6220, 0x00000002, 0x404A4220, - // Block 126, offset 0x1f80 - 0x404A6620, 0x00000002, 0x404A4220, 0x404A6820, 0x00000002, 0x404A4420, - 0x404A5A20, 0x00000002, 0x404A4420, 0x404A5C20, 0x00000002, 0x404A4420, - 0x404A6220, 0x00000002, 0x404A4420, 0x404A6620, 0x00000002, 0x404A4420, - 0x404A6820, 0x00000002, 0x404A4620, 0x404A5A20, 0x00000002, 0x404A4620, - 0x404A5C20, 0x00000002, 0x404A4620, 0x404A6220, 0x00000002, 0x404A4620, - 0x404A6620, 0x00000002, 0x404A4620, 0x404A6820, 0x00000002, 0x404A4820, - 0x404A5A20, 0x00000002, 0x404A4820, 0x404A5C20, 0x00000002, 0x404A4820, - 0x404A6220, 0x00000002, 0x404A4820, 0x404A6620, 0x00000002, 0x404A4820, - 0x404A6820, 0x00000002, 0x404A4A20, 0x404A5A20, 0x00000002, 0x404A4A20, - 0x404A5C20, 0x00000002, 0x404A4A20, 0x404A6220, 0x00000002, 0x404A4A20, - 0x404A6620, 0x00000002, 0x404A4A20, 0x404A6820, - // Block 127, offset 0x1fc0 - 0x00000002, 0x404A4C20, 0x404A5A20, 0x00000002, 0x404A4C20, 0x404A5C20, - 0x00000002, 0x404A4C20, 0x404A6220, 0x00000002, 0x404A4C20, 0x404A6620, - 0x00000002, 0x404A4C20, 0x404A6820, 0x00000002, 0x404A4E20, 0x404A5A20, - 0x00000002, 0x404A4E20, 0x404A5C20, 0x00000002, 0x404A4E20, 0x404A6220, - 0x00000002, 0x404A4E20, 0x404A6620, 0x00000002, 0x404A4E20, 0x404A6820, - 0x00000002, 0x404A7620, 0x404AF820, 0x00000002, 0x404A7820, 0x404AF820, - 0x00000002, 0x404A8020, 0x404B0020, 0x00000002, 0x404A8220, 0x404B0020, - 0x00000002, 0x404AA020, 0x404B0020, 0x00000002, 0x404AA220, 0x404B0020, - 0x00000002, 0x404AB020, 0x404B0020, 0x00000002, 0x404AB220, 0x404B0020, - 0x00000002, 0x404AC020, 0x404B0020, 0x00000002, 0x404AC220, 0x404B0020, - 0x00000002, 0x404AD020, 0x404B0020, 0x00000002, - // Block 128, offset 0x2000 - 0x404AD220, 0x404B0020, 0x00000002, 0x004AD684, 0xA0013A04, 0x00000002, - 0x004AE684, 0xA0013A04, 0x00000002, 0x004AE884, 0xA0013A04, 0x00000002, - 0x004AEA84, 0xA0013A04, 0x00000002, 0x404AEA20, 0x8281258D, 0x00000002, - 0x404AEA20, 0x82812591, 0x00000002, 0x404AF020, 0x8281258D, 0x00000002, - 0x404AF020, 0x82812591, 0x00000003, 0x004B0284, 0x004B3084, 0xA000F304, - 0x00000003, 0x004EA684, 0x004F1484, 0x004EA684, 0x00000002, 0x0050AE84, - 0x0050DA84, 0x00000003, 0x0050AE84, 0x0050DA84, 0x0050F084, 0x00000003, - 0x00514E84, 0x00519A84, 0x00514E84, 0x00000002, 0x005ADA84, 0xA0013904, - 0x00000002, 0x005ADC84, 0xA0013904, 0x00000002, 0x005ADC84, 0xA0013A04, - 0x00000002, 0x005ADE84, 0xA0013904, 0x00000002, 0x005ADE84, 0x005ADE84, - 0x00000002, 0x005AE084, 0xA0013904, 0x00000002, - // Block 129, offset 0x2040 - 0x005AE084, 0xA0013A04, 0x00000002, 0x005AE084, 0xA0013C04, 0x00000002, - 0x005AE084, 0xA0013D04, 0x00000002, 0x005AE884, 0xA0013904, 0x00000002, - 0x005AE884, 0xA0013A04, 0x00000002, 0x005AE884, 0xA0013C04, 0x00000002, - 0x005AE884, 0xA0013D04, 0x00000002, 0x005AEC84, 0xA0013904, 0x00000002, - 0x005AEE84, 0xA0013904, 0x00000002, 0x005AEE84, 0xA0013A04, 0x00000002, - 0x005AEE84, 0xA0013C04, 0x00000002, 0x005AF084, 0xA0013904, 0x00000002, - 0x005AF084, 0xA0013A04, 0x00000002, 0x005AF284, 0xA0013904, 0x00000002, - 0x005AF484, 0xA0013904, 0x00000002, 0x005AF684, 0xA0013904, 0x00000002, - 0x005AF684, 0x005B0884, 0x00000002, 0x005AFA84, 0xA0013904, 0x00000002, - 0x005AFE84, 0xA0013904, 0x00000002, 0x005AFE84, 0xA0013A04, 0x00000002, - 0x005AFE84, 0xA0013C04, 0x00000002, 0x005AFE84, - // Block 130, offset 0x2080 - 0xA0013D04, 0x00000002, 0x005AFE84, 0xA0013E04, 0x00000002, 0x005B0084, - 0xA0013904, 0x00000002, 0x005B0084, 0xA0013A04, 0x00000002, 0x005B0284, - 0xA0013904, 0x00000002, 0x005B0284, 0xA0013A04, 0x00000002, 0x005B0684, - 0xA0013904, 0x00000002, 0x005B0684, 0xA0013A04, 0x00000004, 0x005B0684, - 0xA0013904, 0x005B0684, 0xA0013904, 0x00000002, 0x005B0884, 0xA0013904, - 0x00000002, 0x005B0A84, 0xA0013904, 0x00000002, 0x005B2484, 0xA0013904, - 0x00000002, 0x005B2484, 0xA0013A04, 0x00000002, 0x005B2684, 0xA0013904, - 0x00000002, 0x005B2A84, 0xA0013904, 0x00000002, 0x005B3084, 0xA0013904, - 0x00000002, 0x005B3284, 0xA0013904, 0x00000002, 0x005B3484, 0xA0013904, - 0x00000002, 0x005B3684, 0xA0013904, 0x00000002, 0x005B3884, 0xA0013904, - 0x00000002, 0x005B3A84, 0xA0013904, 0x00000002, - // Block 131, offset 0x20c0 - 0x005B3E84, 0xA0013904, 0x00000002, 0x005B4084, 0xA0013904, 0x00000002, - 0x005B4284, 0xA0013904, 0x00000002, 0x005B4484, 0xA0013904, 0x00000002, - 0x005B4684, 0xA0013904, 0x00000002, 0x005B4884, 0xA0013904, 0x00000002, - 0x005B5284, 0xA0013904, 0x00000002, 0x005B5484, 0xA0013904, 0x00000002, - 0x005B5684, 0xA0013904, 0x00000002, 0x005B5884, 0xA0013904, 0x00000002, - 0x005B5C84, 0xA0013904, 0x00000002, 0x005B6484, 0xA0013904, 0x00000002, - 0x005B6684, 0xA0013904, 0x00000002, 0x005B6884, 0xA0013904, 0x00000002, - 0x005B6A84, 0xA0013904, 0x00000002, 0x005B6C84, 0xA0013904, 0x00000002, - 0x005B7484, 0xA0013904, 0x00000002, 0x005B7684, 0xA0013904, 0x00000002, - 0x005B7884, 0xA0013904, 0x00000002, 0x005B7A84, 0xA0013904, 0x00000002, - 0x005B9884, 0x005D9684, 0x00000002, 0x005BBC84, - // Block 132, offset 0x2100 - 0x005D9684, 0x00000002, 0x005BE684, 0x005D9684, 0x00000002, 0x005C0E84, - 0x005D9884, 0x00000002, 0x005C2484, 0x005D9684, 0x00000002, 0x005C3084, - 0x005D9884, 0x00000002, 0x005C3484, 0x005D9884, 0x00000002, 0x005C4084, - 0x005D9684, 0x00000002, 0x005C8A84, 0x005D9684, 0x00000002, 0x005CE884, - 0x005D9684, 0x00000002, 0x005D1684, 0x005D9684, 0x00000002, 0x005D2284, - 0x005D9884, 0x00000002, 0x005D3084, 0x005D9684, 0x00000004, 0x0062C486, - 0x0063C286, 0x0062C286, 0x0063CE86, 0x00000005, 0x0062C886, 0x0063A886, - 0x00648286, 0x0062AC86, 0x0063B886, 0x00000003, 0x0065769C, 0x0027D69C, - 0x0065CA9C, 0x00000005, 0x0065769C, 0x0065AA9C, 0xA001291C, 0x0027D69C, - 0x00659E9C, 0x00000004, 0x0065769C, 0x0065CA9C, 0x0065AE9C, 0x0065769C, - 0x00000005, 0x0065769C, 0x0065D89C, 0x0065B09C, - // Block 133, offset 0x2140 - 0xA001291C, 0x0065769C, 0x00000005, 0x0065789C, 0x0065A29C, 0x0065D89C, - 0x0065869C, 0xA001281C, 0x00000003, 0x0065789C, 0x0065D89C, 0x0065989C, - 0x00000002, 0x00657A8E, 0xA0812802, 0x00000002, 0x00657A91, 0xA0812802, - 0x00000003, 0x00657A9C, 0x0065809C, 0x0065D89C, 0x00000004, 0x00657E9C, - 0x0027D69C, 0x0065829C, 0x0027D69C, 0x00000006, 0x00657E9C, 0x0065909C, - 0x0065869C, 0x0027D69C, 0x00659E9C, 0xA001281C, 0x00000003, 0x0065809C, - 0x0027D69C, 0x0065B89C, 0x00000003, 0x0065809C, 0x0065D89C, 0x0065909C, - 0x00000002, 0x0065828E, 0xA0812802, 0x00000002, 0x00658291, 0xA0812802, - 0x00000003, 0x0065829C, 0x0065789C, 0x0065C89C, 0x00000004, 0x0065829C, - 0x0065C69C, 0x00659A9C, 0x00659E9C, 0x00000004, 0x0065829C, 0x0065CE9C, - 0x0065C89C, 0x0027D69C, 0x00000004, 0x0065829C, - // Block 134, offset 0x2180 - 0xA001281C, 0x0065CE9C, 0x0065D89C, 0x00000004, 0x0065829C, 0xA001281C, - 0x0065D89C, 0x0065B49C, 0x00000002, 0x0065848E, 0xA0812802, 0x00000002, - 0x00658491, 0xA0812802, 0x00000004, 0x0065849C, 0xA001281C, 0x0065829C, - 0xA001281C, 0x00000004, 0x0065849C, 0xA001281C, 0x0065A29C, 0x0027D69C, - 0x00000004, 0x0065849C, 0x0065C09C, 0x0065C89C, 0x0027D69C, 0x00000006, - 0x0065849C, 0xA001281C, 0x0065CA9C, 0x0065969C, 0xA001281C, 0x0027D69C, - 0x00000006, 0x0065849C, 0x0065CE9C, 0x0065869C, 0xA001281C, 0x0065C69C, - 0x0065B89C, 0x00000006, 0x0065849C, 0x0065CE9C, 0x0065BA9C, 0x0027D69C, - 0x00659E9C, 0x0065CA9C, 0x00000005, 0x0065849C, 0x0065CE9C, 0x0065D09C, - 0x00659A9C, 0x00659E9C, 0x00000002, 0x0065868E, 0xA0812802, 0x00000002, - 0x00658691, 0xA0812802, 0x00000004, 0x0065869C, - // Block 135, offset 0x21c0 - 0xA001281C, 0x0065C69C, 0x0065B89C, 0x00000006, 0x0065869C, 0xA001281C, - 0x0065C69C, 0x0065B89C, 0x00659E9C, 0x0065D89C, 0x00000006, 0x0065869C, - 0x0065CA9C, 0x0065929C, 0xA001281C, 0x0065789C, 0x0065CE9C, 0x00000004, - 0x0065869C, 0x0065CE9C, 0x0027D69C, 0x0065A69C, 0x00000002, 0x0065888E, - 0xA0812802, 0x00000002, 0x00658891, 0xA0812802, 0x00000003, 0x0065889C, - 0x0027D69C, 0x0065909C, 0x00000002, 0x00658A8E, 0xA0812802, 0x00000002, - 0x00658A91, 0xA0812802, 0x00000004, 0x00658A9C, 0x0027D69C, 0x0065B29C, - 0xA001291C, 0x00000003, 0x00658A9C, 0x0065CA9C, 0x0065A09C, 0x00000002, - 0x00658C8E, 0xA0812802, 0x00000002, 0x00658C91, 0xA0812802, 0x00000004, - 0x00658C9C, 0x0065789C, 0x0065869C, 0x0065CA9C, 0x00000005, 0x00658C9C, - 0x0065D89C, 0x0065989C, 0x0027D69C, 0x0065B89C, - // Block 136, offset 0x2200 - 0x00000002, 0x00658E8E, 0xA0812802, 0x00000002, 0x00658E91, 0xA0812802, - 0x00000002, 0x00658E84, 0x0065BA84, 0x00000005, 0x00658E9C, 0x0065C89C, - 0x0065D89C, 0x0065869C, 0xA001281C, 0x00000002, 0x0065908E, 0xA0812802, - 0x00000002, 0x00659091, 0xA0812802, 0x00000002, 0x0065928E, 0xA0812802, - 0x00000002, 0x00659291, 0xA0812802, 0x00000003, 0x0065929C, 0x0065D89C, - 0x0065989C, 0x00000003, 0x0065929C, 0x0065D89C, 0x00659E9C, 0x00000002, - 0x0065948E, 0xA0812802, 0x00000002, 0x00659491, 0xA0812802, 0x00000002, - 0x0065968E, 0xA0812802, 0x00000002, 0x00659691, 0xA0812802, 0x00000004, - 0x0065969C, 0xA001281C, 0x0027D69C, 0x0065909C, 0x00000002, 0x0065988E, - 0xA0812802, 0x00000002, 0x00659891, 0xA0812802, 0x00000002, 0x00659A8E, - 0xA0812802, 0x00000002, 0x00659A91, 0xA0812802, - // Block 137, offset 0x2240 - 0x00000002, 0x00659C8E, 0xA0812802, 0x00000002, 0x00659C91, 0xA0812802, - 0x00000003, 0x00659C9C, 0xA001281C, 0x00658E9C, 0x00000002, 0x00659E8E, - 0xA0812802, 0x00000002, 0x00659E91, 0xA0812802, 0x00000003, 0x00659E9C, - 0xA001281C, 0x0065CA9C, 0x00000003, 0x0065A89C, 0x00659A9C, 0x00659E9C, - 0x00000002, 0x0065AA8E, 0xA0812802, 0x00000002, 0x0065AA91, 0xA0812802, - 0x00000002, 0x0065AA8E, 0xA0812902, 0x00000002, 0x0065AA91, 0xA0812902, - 0x00000006, 0x0065AA9C, 0xA001291C, 0x0027D69C, 0x0065929C, 0x0065D89C, - 0x00659E9C, 0x00000004, 0x0065AA9C, 0xA001291C, 0x0027D69C, 0x00659A9C, - 0x00000005, 0x0065AA9C, 0xA001281C, 0x0027D69C, 0x0065CC9C, 0x0065CA9C, - 0x00000003, 0x0065AA9C, 0x0065789C, 0x00659A9C, 0x00000002, 0x0065AC8E, - 0xA0812802, 0x00000002, 0x0065AC91, 0xA0812802, - // Block 138, offset 0x2280 - 0x00000002, 0x0065AC8E, 0xA0812902, 0x00000002, 0x0065AC91, 0xA0812902, - 0x00000006, 0x0065AC9C, 0xA001291C, 0x0065769C, 0x0065909C, 0x00659E9C, - 0x0065CA9C, 0x00000004, 0x0065AC9C, 0xA001291C, 0x0065869C, 0x0065CA9C, - 0x00000003, 0x0065AC9C, 0xA001291C, 0x00658A9C, 0x00000003, 0x0065AC9C, - 0xA001281C, 0x0065CA9C, 0x00000002, 0x0065AE8E, 0xA0812802, 0x00000002, - 0x0065AE91, 0xA0812802, 0x00000002, 0x0065AE8E, 0xA0812902, 0x00000002, - 0x0065AE91, 0xA0812902, 0x00000006, 0x0065AE9C, 0x0065769C, 0x0065C69C, - 0x00659A9C, 0x00659E9C, 0xA001281C, 0x00000004, 0x0065AE9C, 0x0065789C, - 0x0027D69C, 0x00659E9C, 0x00000006, 0x0065AE9C, 0xA001281C, 0x00659A9C, - 0x00658E9C, 0x00657E9C, 0x0065CA9C, 0x00000003, 0x0065AE9C, 0x0065C69C, - 0x0065D89C, 0x00000002, 0x0065B08E, 0xA0812802, - // Block 139, offset 0x22c0 - 0x00000002, 0x0065B091, 0xA0812802, 0x00000002, 0x0065B08E, 0xA0812902, - 0x00000002, 0x0065B091, 0xA0812902, 0x00000005, 0x0065B09C, 0xA001291C, - 0x0027D69C, 0x00658E9C, 0xA001281C, 0x00000004, 0x0065B09C, 0xA001281C, - 0x0027D69C, 0x0065969C, 0x00000005, 0x0065B09C, 0x0065869C, 0x0065969C, - 0x0027D69C, 0x0065CA9C, 0x00000003, 0x0065B09C, 0xA001291C, 0x0065949C, - 0x00000004, 0x0065B09C, 0xA001291C, 0x0065A29C, 0x0065AC9C, 0x00000003, - 0x0065B09C, 0x0065CA9C, 0x00659A9C, 0x00000004, 0x0065B09C, 0xA001291C, - 0x0065D89C, 0x0065909C, 0x00000002, 0x0065B28E, 0xA0812802, 0x00000002, - 0x0065B291, 0xA0812802, 0x00000002, 0x0065B28E, 0xA0812902, 0x00000002, - 0x0065B291, 0xA0812902, 0x00000003, 0x0065B29C, 0x0027D69C, 0x0065CA9C, - 0x00000003, 0x0065B29C, 0x0027D69C, 0x0065D89C, - // Block 140, offset 0x2300 - 0x00000005, 0x0065B29C, 0xA001291C, 0x0065789C, 0x0065D89C, 0x00659E9C, - 0x00000004, 0x0065B29C, 0xA001281C, 0x0065CA9C, 0x00659E9C, 0x00000005, - 0x0065B29C, 0xA001291C, 0x0065D89C, 0x00659E9C, 0xA001281C, 0x00000004, - 0x0065B49C, 0x0065789C, 0x0065869C, 0x0065CE9C, 0x00000003, 0x0065B49C, - 0x0065789C, 0x0065CA9C, 0x00000002, 0x0065B484, 0x00659084, 0x00000003, - 0x0065B49C, 0x00659A9C, 0x0065AA9C, 0x00000003, 0x0065B49C, 0x0065CA9C, - 0x0065869C, 0x00000005, 0x0065B49C, 0x0065D89C, 0x00658E9C, 0x0065C49C, - 0x0065D89C, 0x00000004, 0x0065B69C, 0x0065869C, 0x0065CE9C, 0x0065D89C, - 0x00000006, 0x0065B69C, 0x0065C89C, 0x0065AA9C, 0xA001281C, 0x0027D69C, - 0x0065CA9C, 0x00000004, 0x0065BA9C, 0x0027D69C, 0x00659E9C, 0x0065CA9C, - 0x00000003, 0x0065BA9C, 0x0065829C, 0xA001281C, - // Block 141, offset 0x2340 - 0x00000005, 0x0065BA9C, 0x0065829C, 0xA001281C, 0x00659E9C, 0x0065D89C, - 0x00000004, 0x0065BE9C, 0x0027D69C, 0x00659E9C, 0xA001281C, 0x00000003, - 0x0065BE9C, 0x0027D69C, 0x0065CA9C, 0x00000003, 0x0065C09C, 0x0065769C, - 0x0065D89C, 0x00000004, 0x0065C89C, 0x00659A9C, 0x00659E9C, 0x0065CA9C, - 0x00000005, 0x0065CA9C, 0x0027D69C, 0x0065AE9C, 0xA001281C, 0x0065CA9C, - 0x00000004, 0x0065CA9C, 0x0065AC9C, 0xA001291C, 0x0027D69C, 0x00000006, - 0x0065CC9C, 0x0065D89C, 0x00659E9C, 0x0065889C, 0xA001281C, 0x0065D89C, - 0x00000002, 0x0065D091, 0xA0812802, 0x00000003, 0x0065D09C, 0x00659A9C, - 0x00659E9C, 0x00000002, 0x0065D291, 0xA0812802, 0x00000002, 0x0065D491, - 0xA0812802, 0x00000002, 0x0065D691, 0xA0812802, 0x00000002, 0x0065DA84, - 0xA0013A04, 0x00000002, 0x0065EC84, 0xA0013A04, - // Block 142, offset 0x2380 - 0x00000002, 0x0065F684, 0xA0013A04, 0x00000002, 0x00660684, 0xA0013A04, - 0x00000002, 0x00661284, 0xA0013A04, 0x00000002, 0x00661484, 0xA0013A04, - 0x00000002, 0x00661C84, 0xA0013A04, 0x00000002, 0x00661E84, 0xA0013A04, - 0x00000002, 0x00662284, 0xA0013A04, 0x00000002, 0x00663884, 0xA0013A04, - 0x00000002, 0x00663896, 0xA0013A16, 0x00000002, 0x00663A84, 0xA0013A04, - 0x00000002, 0x00663A84, 0xA0013C04, 0x00000002, 0x0075C284, 0xA0013904, - 0x00000002, 0x00862084, 0xA0013904, 0x00000002, 0x00862284, 0xA0013904, - 0x00000002, 0x00862484, 0xA0013904, 0x00000002, 0x00862684, 0xA0013904, - 0x00000002, 0x00862884, 0xA0013904, 0x00000002, 0x00862A84, 0xA0013904, - 0x00000002, 0x00862C84, 0xA0013904, 0x00000002, 0x00862C84, 0xA0013A04, - 0x00000002, 0x00862E84, 0xA0013904, 0x00000002, - // Block 143, offset 0x23c0 - 0x00863084, 0xA0013904, 0x00000002, 0x00863284, 0xA0013904, 0x00000002, - 0x00863284, 0xA0013A04, 0x00000002, 0x00863484, 0xA0013904, 0x00000002, - 0x00863484, 0xA0013A04, 0x00000002, 0x00863684, 0xA0013904, 0x00000002, - 0x00863684, 0xA0013A04, 0x00000002, 0x00863884, 0xA0013904, 0x00000002, - 0x00863A84, 0xA0013904, 0x00000002, 0x00863C84, 0xA0013904, 0x00000002, - 0x00863E84, 0xA0013904, 0x00000002, 0x00863E84, 0xA0013A04, 0x00000002, - 0x00863E84, 0xA0013C04, 0x00000002, 0x00864084, 0xA0013904, 0x00000002, - 0x00864284, 0xA0013904, 0x00000002, 0x00864484, 0xA0013904, 0x00000002, - 0x00864684, 0xA0013904, 0x00000002, 0x00864684, 0xA0013A04, 0x00000002, - 0x00864884, 0xA0013904, 0x00000002, 0x00864884, 0xA0013A04, 0x00000002, - 0x00864A84, 0xA0013904, 0x00000002, 0x00864C84, - // Block 144, offset 0x2400 - 0xA0013904, 0x00000002, 0x029C6C84, 0xA0013904, 0x00000002, 0x029CB284, - 0xA0013904, 0x00000002, 0x02A30484, 0xA0013904, 0x00000002, 0x02A3C084, - 0xA0013904, 0x00000002, 0x02A40084, 0xA0013904, 0x00000002, 0x02A6B884, - 0xA0013904, 0x00000002, 0x02A6D284, 0xA0013904, 0x00000002, 0x02A70484, - 0xA0013904, 0x00000002, 0x02B81E84, 0xA0013904, 0x00000002, 0x02B81E84, - 0xA0013A04, 0x00000002, 0x02B84484, 0xA0013904, 0x00000002, 0x02B84684, - 0xA0013904, 0x00000002, 0x02BEA084, 0xA0013904, 0x00000002, 0x02BF8684, - 0xA0013904, 0x00000002, 0x02CBCA84, 0xA0013904, 0x00000002, 0x02CE1084, - 0xA0013904, 0x00000004, 0x02D0549C, 0x02BE1E9C, 0x029E349C, 0x02F27C9C, - 0x00000002, 0x02D6F484, 0xA0013904, 0x00000002, 0x02E45684, 0xA0013904, - 0x00000002, 0x02E4B684, 0xA0013904, 0x00000002, - // Block 145, offset 0x2440 - 0x02E71684, 0xA0013904, 0x00000002, 0x02EB1684, 0xA0013904, 0x00000002, - 0x02EDDC84, 0xA0013904, 0x00000002, 0x02F27484, 0xA0013904, 0x00000002, - 0x02F5F284, 0xA0013904, 0x00000002, 0x02FEA484, 0xA0013904, 0x00000002, - 0x02FEA684, 0xA0013904, 0x00000002, 0x02FEA684, 0xA0013A04, 0x00000002, - 0x02FF1484, 0xA0013904, 0x00000002, 0x02FF1484, 0xA0013A04, 0x00000002, - 0x0300FE84, 0xA0013904, 0x00000002, 0x03011284, 0xA0013904, 0x00000002, - 0x0303F884, 0xA0013904, 0x00000002, 0x0304F284, 0xA0013904, 0x00000002, - 0x0304F284, 0xA0013A04, 0x00000002, 0x0313A484, 0xA0013904, 0x00000002, - 0x031B6684, 0xA0013904, 0x00000002, 0x031F6C84, 0xA0013904, 0x00000002, - 0x031F6C84, 0xA0013A04, 0x00000002, 0x03212284, 0xA0013904, 0x00000002, - 0x032C3884, 0xA0013904, 0x00000002, 0x032DD084, - // Block 146, offset 0x2480 - 0xA0013904, 0x00000002, 0x0331C084, 0xA0013904, 0x00000002, 0x03332C84, - 0xA0013904, 0x00000002, 0x03355084, 0xA0013904, 0x00000002, 0x03367884, - 0xA0013904, 0x00000002, 0x033CEA84, 0xA0013904, 0x00000002, 0x033E9484, - 0xA0013904, 0x00000002, 0x033EA484, 0xA0013904, 0x00000002, 0x033F1A84, - 0xA0013904, 0x00000002, 0x033F3884, 0xA0013904, 0x00000002, 0x033F3884, - 0xA0013A04, 0x00000002, 0xA000AD18, 0xA000BA18, 0x00000002, 0xA000B218, - 0xA000BA18, 0x00000002, 0xA000B618, 0xA000BA18, 0x00000002, 0x00393C99, - 0x003A8E99, 0x00000002, 0x00393C9A, 0x003A8E9A, 0x00000002, 0x00395699, - 0x003A8E99, 0x00000002, 0x0039569A, 0x003A8E9A, 0x00000002, 0x00395899, - 0x003A8E99, 0x00000002, 0x0039589A, 0x003A8E9A, 0x00000002, 0x00396499, - 0x003A8E99, 0x00000002, 0x0039649A, 0x003A8E9A, - // Block 147, offset 0x24c0 - 0x00000002, 0x00397299, 0x003A8E99, 0x00000002, 0x0039729A, 0x003A8E9A, - 0x00000002, 0x00397499, 0x003A8E99, 0x00000002, 0x0039749A, 0x003A8E9A, - 0x00000002, 0x0039C699, 0x003A8E99, 0x00000002, 0x0039C69A, 0x003A8E9A, - 0x00000002, 0x0039C899, 0x003A8E99, 0x00000002, 0x0039C89A, 0x003A8E9A, - 0x00000002, 0x0039DC99, 0x003A8E99, 0x00000002, 0x0039DC9A, 0x003A8E9A, - 0x00000002, 0x0039DE99, 0x003A8E99, 0x00000002, 0x0039DE9A, 0x003A8E9A, - 0x00000002, 0x0039E699, 0x003A8E99, 0x00000002, 0x0039E69A, 0x003A8E9A, - 0x00000002, 0x0039EE99, 0x003A8E99, 0x00000002, 0x0039EE9A, 0x003A8E9A, - 0x00000002, 0x0039F099, 0x003A8E99, 0x00000002, 0x0039F09A, 0x003A8E9A, - 0x00000002, 0x0039FC99, 0x003A8E99, 0x00000002, 0x0039FC9A, 0x003A8E9A, - 0x00000002, 0x003A1299, 0x003A8E99, 0x00000002, - // Block 148, offset 0x2500 - 0x003A129A, 0x003A8E9A, 0x00000002, 0x003A1A99, 0x003A8E99, 0x00000002, - 0x003A1A9A, 0x003A8E9A, 0x00000002, 0x003A4099, 0x003A8E99, 0x00000002, - 0x003A409A, 0x003A8E9A, 0x00000002, 0x003A4E9A, 0x003A8E9A, 0x00000002, - 0x003A5699, 0x003A8E99, 0x00000002, 0x003A569A, 0x003A8E9A, 0x00000002, - 0x003A689A, 0x003A8E9A, 0x00000002, 0x003A8E99, 0xA000D119, 0x00000002, - 0x003A8E9A, 0xA000D11A, 0x00000002, 0x003A9099, 0x003A8E99, 0x00000002, - 0x003A909A, 0x003A8E9A, 0x00000002, 0x4062AC20, 0x4062AC20, 0x00000002, - 0x4062AC20, 0x4062BE20, 0x00000002, 0x4062B020, 0x4062C420, 0x00000002, - 0x4062B020, 0x4062D020, 0x00000002, 0x4062B220, 0x4062B220, 0x00000002, - 0x4062B620, 0x4062AC20, 0x00000002, 0x4062B620, 0x4062B820, 0x00000002, - 0x4062B620, 0x4062BA20, 0x00000002, 0x4062B620, - // Block 149, offset 0x2540 - 0x4062BE20, 0x00000002, 0x4062B620, 0x4062CC20, 0x00000002, 0x4062B620, - 0x4062CE20, 0x00000002, 0x4062B620, 0x4062D020, 0x00000002, 0x4062BA20, - 0x4062BA20, 0x00000002, 0x4062BA20, 0x4062BE20, 0x00000002, 0x4062BE20, - 0x4062BE20, 0x00000002, 0x4062C420, 0x4062C420, 0x00000002, 0x4063A820, - 0x4063D020, 0x00000002, 0x4063AC20, 0x4063D020, 0x00000002, 0x4063B020, - 0x4063D020, 0x00000002, 0x4063B420, 0x4063D020, 0x00000002, 0x4063B820, - 0x4063A820, 0x00000003, 0x4063B820, 0x4063A820, 0x4063D020, 0x00000002, - 0x4063B820, 0x4063D020, 0x00000002, 0x4063C220, 0x4063CE20, 0x00000003, - 0x4063C220, 0x4063CE20, 0x4063D020, 0x00000002, 0x4063C220, 0x4063D020, - 0x00000003, 0x0003F484, 0x002D9A8A, 0x0003F69F, 0x00000003, 0x0003F484, - 0x002F5684, 0x0003F69F, 0x00000003, 0x0003F484, - // Block 150, offset 0x2580 - 0x002F568A, 0x0003F69F, 0x00000003, 0x0003F484, 0x0030F684, 0x0003F69F, - 0x00000003, 0x0003F484, 0x0030F68A, 0x0003F69F, 0x00000002, 0x002C0A9D, - 0x002F569C, 0x00000002, 0x402C3C20, 0xAE603202, 0x00000002, 0x002C3C83, - 0xAE603202, 0x00000002, 0x402D6A20, 0xAE604702, 0x00000002, 0x002D6A83, - 0xAE604702, 0x00000002, 0x402D6A20, 0xAE605202, 0x00000002, 0x002D6A83, - 0xAE605202, 0x00000002, 0x002D9883, 0xAE603202, 0x00000002, 0x002D9883, - 0xAE603502, 0x00000002, 0x002D9883, 0xAE603702, 0x00000002, 0x002D9883, - 0xAE603C02, 0x00000002, 0x002D9883, 0xAE604102, 0x00000002, 0x002D9883, - 0xAE604702, 0x00000003, 0x002D9883, 0xAE604702, 0xAE603202, 0x00000002, - 0x002D9883, 0xAE604E02, 0x00000002, 0x002D9883, 0xACA05902, 0x00000002, - 0x002D9883, 0xAE605B02, 0x00000002, 0x002D9883, - // Block 151, offset 0x25c0 - 0xAE606402, 0x00000002, 0x002D9883, 0xAE606502, 0x00000002, 0x002D9883, - 0xAE606702, 0x00000002, 0x002D9883, 0xADC07002, 0x00000002, 0x002D9883, - 0xADC07A02, 0x00000002, 0x002D9A8A, 0x002D9A9F, 0x00000003, 0x002D9A8A, - 0x002D9A8A, 0x002D9A9F, 0x00000002, 0x002D9A8A, 0x002DCC8A, 0x00000002, - 0x002D9A9D, 0x00306C9D, 0x00000002, 0x002D9A8A, 0x0030BE9F, 0x00000002, - 0x002D9A84, 0x0030F69F, 0x00000002, 0x002D9A8A, 0x0030F69F, 0x00000002, - 0x002E229C, 0x0030F69C, 0x00000002, 0x402EE420, 0xAE604E02, 0x00000002, - 0x002EE483, 0xAE604E02, 0x00000002, 0x402EE420, 0xAE605B02, 0x00000002, - 0x002EE483, 0xAE605B02, 0x00000002, 0x40306E20, 0xAE603202, 0x00000002, - 0x00306E83, 0xAE603202, 0x00000002, 0x40306E20, 0xAE603502, 0x00000002, - 0x00306E83, 0xAE603502, 0x00000002, 0x40306E20, - // Block 152, offset 0x2600 - 0xAE604102, 0x00000002, 0x00306E83, 0xAE604102, 0x00000002, 0x40306E20, - 0xAE605B02, 0x00000002, 0x00306E83, 0xAE605B02, 0x00000002, 0x0030BE8A, - 0x002D9A9F, 0x00000003, 0x0030BE8A, 0x002D9A8A, 0x002D9A9F, 0x00000002, - 0x0030F684, 0x002D9A9F, 0x00000002, 0x0030F68A, 0x002D9A9F, 0x00000003, - 0x0030F684, 0x002D9A84, 0x002D9A9F, 0x00000003, 0x0030F68A, 0x002D9A8A, - 0x002D9A9F, 0x00000002, 0x402BE020, 0xAE603702, 0x00000002, 0x002BE083, - 0xAE603702, 0x00000002, 0x402BE020, 0xAE603C02, 0x00000002, 0x002BE083, - 0xAE603C02, 0x00000002, 0x402BE020, 0xAE604302, 0x00000002, 0x002BE083, - 0xAE604302, 0x00000002, 0x402C9A20, 0xAE603C02, 0x00000002, 0x002C9A83, - 0xAE603C02, 0x00000002, 0x402C9A20, 0xAE605B02, 0x00000002, 0x002C9A83, - 0xAE605B02, 0x00000002, 0x402D9C20, 0xAE604702, - // Block 153, offset 0x2640 - 0x00000002, 0x002D9C83, 0xAE604702, 0x00000002, 0x402EE420, 0xAE603C02, - 0x00000002, 0x002EE483, 0xAE603C02, 0x00000002, 0x402EE420, 0xAD806802, - 0x00000002, 0x002EE483, 0xAD806802, 0x00000002, 0x402FE820, 0xAE605202, - 0x00000002, 0x002FE883, 0xAE605202, 0x00000002, 0x40306E20, 0xAE604702, - 0x00000002, 0x00306E83, 0xAE604702, 0x00000002, 0x40306E20, 0xAE604E02, - 0x00000002, 0x00306E83, 0xAE604E02, 0x00000002, 0x40306E20, 0xAD806802, - 0x00000002, 0x00306E83, 0xAD806802, 0x00000002, 0x002C6294, 0xA0013914, - 0x00000002, 0x00302C83, 0x402D6820, 0x00000002, 0x00302C89, 0x002D6888, - 0x00000002, 0x40310021, 0xAE603202, 0x00000002, 0x003100A3, 0xAE603202, - 0x00000002, 0x40310021, 0xAE603502, 0x00000002, 0x003100A3, 0xAE603502, - 0x00000002, 0x40310021, 0xAE604102, 0x00000002, - // Block 154, offset 0x2680 - 0x003100A3, 0xAE604102, 0x00000002, 0x40310021, 0xAE605B02, 0x00000002, - 0x003100A3, 0xAE605B02, 0x00000002, 0x40320C20, 0xAE603202, 0x00000002, - 0x00320C83, 0xAE603202, 0x00000002, 0x40320C20, 0xAE605B02, 0x00000002, - 0x00320C83, 0xAE605B02, 0x00000002, 0x40320C21, 0xAE605B02, 0x00000002, - 0x00320CA3, 0xAE605B02, 0x00000002, 0x40320E20, 0xAE603202, 0x00000002, - 0x00320E83, 0xAE603202, 0x00000002, 0x40320E21, 0xAE604E02, 0x00000002, - 0x00320EA3, 0xAE604E02, 0x00000002, 0x40320E21, 0xAE605B02, 0x00000002, - 0x00320EA3, 0xAE605B02, 0x00000002, 0x40321020, 0xAE603202, 0x00000002, - 0x00321083, 0xAE603202, 0x00000002, 0x402BDE21, 0x002C9888, 0x00000002, - 0x002BDEA3, 0x002C9888, 0x00000003, 0x402BDE21, 0x002C9888, 0xAE605B02, - 0x00000003, 0x002BDEA3, 0x002C9888, 0xAE605B02, - // Block 155, offset 0x26c0 - 0x00000002, 0x402EE221, 0x002C9888, 0x00000002, 0x002EE2A3, 0x002C9888, - 0x00000003, 0x402EE221, 0x002C9888, 0xAE604E02, 0x00000003, 0x002EE2A3, - 0x002C9888, 0xAE604E02, 0x00000003, 0x402EE221, 0x002C9888, 0xAE605B02, - 0x00000003, 0x002EE2A3, 0x002C9888, 0xAE605B02, 0x00000002, 0x40306C21, - 0x002C9888, 0x00000002, 0x00306CA3, 0x002C9888, 0x00000003, 0x40306C21, - 0x002C9888, 0xAE603202, 0x00000003, 0x00306CA3, 0x002C9888, 0xAE603202, - 0x00000003, 0x40306C21, 0x002C9888, 0xAE603502, 0x00000003, 0x00306CA3, - 0x002C9888, 0xAE603502, 0x00000003, 0x40306C21, 0x002C9888, 0xAE604102, - 0x00000003, 0x00306CA3, 0x002C9888, 0xAE604102, 0x00000003, 0x40306C21, - 0x002C9888, 0xAE605B02, 0x00000003, 0x00306CA3, 0x002C9888, 0xAE605B02, - 0x00000003, 0x0003F484, 0x0030E284, 0x0003F69F, - // Block 156, offset 0x2700 - 0x00000003, 0x0003F484, 0x0030E28A, 0x0003F69F, 0x00000002, 0x002DFE9C, - 0x0030E29D, 0x00000002, 0x002E829C, 0x0030E29D, 0x00000002, 0x002E829D, - 0x0030E29D, 0x00000002, 0x002E9E9C, 0x0030E29D, 0x00000002, 0x002F2C9C, - 0x0030E29D, 0x00000002, 0x40302C21, 0x402D6820, 0x00000002, 0x00302CA3, - 0x402D6820, 0x00000002, 0x4030BE21, 0xAE603202, 0x00000002, 0x0030BEA3, - 0xAE603202, 0x00000002, 0x4030BE21, 0xAE603502, 0x00000002, 0x0030BEA3, - 0xAE603502, 0x00000002, 0x4030BE21, 0xAE603C02, 0x00000002, 0x0030BEA3, - 0xAE603C02, 0x00000002, 0x4030BE21, 0xAE604302, 0x00000002, 0x4030BE21, - 0xAE604702, 0x00000002, 0x0030BEA3, 0xAE604702, 0x00000002, 0x4030BE21, - 0xAE605202, 0x00000002, 0x0030BEA3, 0xAE605202, 0x00000002, 0x4030BE21, - 0xADC07002, 0x00000002, 0x0030BEA3, 0xADC07002, - // Block 157, offset 0x2740 - 0x00000002, 0x0030E29D, 0x002C0A9C, 0x00000002, 0x0030E29D, 0x002C3A9D, - 0x00000002, 0x0030E28C, 0x00312A8C, 0x00000002, 0x40320E20, 0xAE605B02, - 0x00000002, 0x00320E83, 0xAE605B02, 0x00000002, 0x40320E21, 0xAE603202, - 0x00000002, 0x00320EA3, 0xAE603202, 0x00000002, 0x40321020, 0xAE605B02, - 0x00000002, 0x00321083, 0xAE605B02, 0x00000002, 0x40321021, 0xAE603202, - 0x00000002, 0x003210A3, 0xAE603202, 0x00000002, 0x40321023, 0xAE603202, - 0x00000002, 0x003210E3, 0xAE603202, 0x00000002, 0x40321023, 0xAE603C02, - 0x00000002, 0x003210E3, 0xAE603C02, 0x00000002, 0x40321023, 0xAE604702, - 0x00000002, 0x003210E3, 0xAE604702, 0x00000002, 0x40321023, 0xAE605B02, - 0x00000002, 0x003210E3, 0xAE605B02, 0x00000002, 0x40321023, 0xAD806802, - 0x00000002, 0x003210E3, 0xAD806802, 0x00000002, - // Block 158, offset 0x2780 - 0x0032769C, 0x0030E29D, 0x00000002, 0x402C3E20, 0xACA05602, 0x00000002, - 0x002C3E83, 0xACA05602, 0x00000002, 0x402C0820, 0xAE603702, 0x00000002, - 0x002C0883, 0xAE603702, 0x00000002, 0x402C0820, 0xAE603C02, 0x00000002, - 0x002C0883, 0xAE603C02, 0x00000002, 0x402D0620, 0xAE603C02, 0x00000002, - 0x002D0683, 0xAE603C02, 0x00000002, 0x402D0620, 0xAE605B02, 0x00000002, - 0x002D0683, 0xAE605B02, 0x00000002, 0x402DCA20, 0xAE604702, 0x00000002, - 0x002DCA83, 0xAE604702, 0x00000002, 0x402F2A20, 0xAE603C02, 0x00000002, - 0x002F2A83, 0xAE603C02, 0x00000002, 0x402F2A20, 0xAE604E02, 0x00000002, - 0x002F2A83, 0xAE604E02, 0x00000002, 0x402F2A20, 0xAE605B02, 0x00000002, - 0x002F2A83, 0xAE605B02, 0x00000002, 0x402F2A20, 0xAD806802, 0x00000002, - 0x002F2A83, 0xAD806802, 0x00000002, 0x4030BC20, - // Block 159, offset 0x27c0 - 0xAE604702, 0x00000002, 0x0030BC83, 0xAE604702, 0x00000002, 0x4030BC20, - 0xAE604E02, 0x00000002, 0x0030BC83, 0xAE604E02, 0x00000002, 0x4030BC20, - 0xAD806802, 0x00000002, 0x0030BC83, 0xAD806802, 0x00000002, 0x40320E20, - 0xAE604E02, 0x00000002, 0x00320E83, 0xAE604E02, 0x00000002, 0x4062AC20, - 0x4062B020, 0x00000002, 0x4062AC20, 0x4062B220, 0x00000002, 0x4062AC20, - 0x4062B620, 0x00000002, 0x4062AC20, 0x4062BA20, 0x00000003, 0x4062AC20, - 0x4062BE20, 0x4062AC20, 0x00000002, 0x4062AC20, 0x4062C820, 0x00000002, - 0x4062AC20, 0x4062CA20, 0x00000002, 0x4062AC20, 0x4062D020, 0x00000002, - 0x4062B020, 0x4062AC20, 0x00000002, 0x4062B020, 0x4062B020, 0x00000002, - 0x4062B020, 0x4062B220, 0x00000002, 0x4062B020, 0x4062BA20, 0x00000002, - 0x4062B020, 0x4062BE20, 0x00000002, 0x4062B020, - // Block 160, offset 0x2800 - 0x4062CC20, 0x00000002, 0x4062B220, 0x4062AC20, 0x00000002, 0x4062B220, - 0x4062B620, 0x00000003, 0x4062B620, 0x4062AC20, 0x4062BE20, 0x00000002, - 0x4062B620, 0x4062B020, 0x00000002, 0x4062B620, 0x4062B220, 0x00000003, - 0x4062B620, 0x4062B220, 0x4062D020, 0x00000002, 0x4062B620, 0x4062B620, - 0x00000003, 0x4062B620, 0x4062B820, 0x4062AC20, 0x00000003, 0x4062B620, - 0x4062B820, 0x4062BE20, 0x00000003, 0x4062B620, 0x4062BA20, 0x4062BE20, - 0x00000003, 0x4062B620, 0x4062BA20, 0x4062C220, 0x00000003, 0x4062B620, - 0x4062BA20, 0x4062D020, 0x00000003, 0x4062B620, 0x4062BE20, 0x4062BE20, - 0x00000002, 0x4062B620, 0x4062C220, 0x00000002, 0x4062B620, 0x4062CA20, - 0x00000002, 0x4062B820, 0x4062AC20, 0x00000002, 0x4062B820, 0x4062B620, - 0x00000002, 0x4062B820, 0x4062BA20, 0x00000002, - // Block 161, offset 0x2840 - 0x4062B820, 0x4062BE20, 0x00000003, 0x4062B820, 0x4062BE20, 0x4062BE20, - 0x00000002, 0x4062B820, 0x4062C220, 0x00000002, 0x4062B820, 0x4062C820, - 0x00000002, 0x4062B820, 0x4062D020, 0x00000002, 0x4062BA20, 0x4062AC20, - 0x00000002, 0x4062BA20, 0x4062B020, 0x00000002, 0x4062BA20, 0x4062B220, - 0x00000002, 0x4062BA20, 0x4062B620, 0x00000003, 0x4062BA20, 0x4062BA20, - 0x4062C220, 0x00000003, 0x4062BA20, 0x4062BE20, 0x4062AC20, 0x00000003, - 0x4062BA20, 0x4062BE20, 0x4062B220, 0x00000003, 0x4062BA20, 0x4062BE20, - 0x4062BA20, 0x00000003, 0x4062BA20, 0x4062BE20, 0x4062BE20, 0x00000003, - 0x4062BA20, 0x4062BE20, 0x4062C420, 0x00000002, 0x4062BA20, 0x4062C220, - 0x00000002, 0x4062BA20, 0x4062C420, 0x00000002, 0x4062BA20, 0x4062C820, - 0x00000002, 0x4062BA20, 0x4062CC20, 0x00000002, - // Block 162, offset 0x2880 - 0x4062BA20, 0x4062CE20, 0x00000002, 0x4062BA20, 0x4062D020, 0x00000002, - 0x4062BE20, 0x4062AC20, 0x00000002, 0x4062BE20, 0x4062B020, 0x00000002, - 0x4062BE20, 0x4062B220, 0x00000002, 0x4062BE20, 0x4062B620, 0x00000002, - 0x4062BE20, 0x4062B820, 0x00000002, 0x4062BE20, 0x4062BA20, 0x00000003, - 0x4062BE20, 0x4062BA20, 0x4062AC20, 0x00000003, 0x4062BE20, 0x4062BE20, - 0x4062BE20, 0x00000002, 0x4062BE20, 0x4062C220, 0x00000002, 0x4062BE20, - 0x4062C420, 0x00000002, 0x4062BE20, 0x4062C820, 0x00000002, 0x4062BE20, - 0x4062CA20, 0x00000002, 0x4062BE20, 0x4062CC20, 0x00000002, 0x4062BE20, - 0x4062CE20, 0x00000002, 0x4062BE20, 0x4062D020, 0x00000002, 0x4062C220, - 0x4062AC20, 0x00000003, 0x4062C220, 0x4062AC20, 0x4062AC20, 0x00000002, - 0x4062C220, 0x4062B220, 0x00000002, 0x4062C220, - // Block 163, offset 0x28c0 - 0x4062B820, 0x00000002, 0x4062C220, 0x4062BA20, 0x00000002, 0x4062C220, - 0x4062BE20, 0x00000002, 0x4062C220, 0x4062C220, 0x00000002, 0x4062C220, - 0x4062C420, 0x00000002, 0x4062C220, 0x4062C820, 0x00000002, 0x4062C220, - 0x4062CA20, 0x00000002, 0x4062C220, 0x4062CC20, 0x00000002, 0x4062C220, - 0x4062CE20, 0x00000002, 0x4062C420, 0x4062C220, 0x00000002, 0x4062C820, - 0x4062CA20, 0x00000002, 0x4062C820, 0x4062D020, 0x00000002, 0x4062CE20, - 0x4062BA20, 0x00000002, 0x4062CE20, 0x4062C220, 0x00000002, 0x4062D020, - 0x4062B020, 0x00000002, 0x4062D020, 0x4062B620, 0x00000002, 0x4062D020, - 0x4062B820, 0x00000002, 0x4062D020, 0x4062BA20, 0x00000002, 0x4062D020, - 0x4062D020, 0x00000002, 0x4063A820, 0x4063B820, 0x00000002, 0x4063A820, - 0x4063C220, 0x00000002, 0x4063A820, 0x4063CC20, - // Block 164, offset 0x2900 - 0x00000002, 0x4063AC20, 0x4063B820, 0x00000002, 0x4063AC20, 0x4063C020, - 0x00000002, 0x4063AC20, 0x4063C220, 0x00000002, 0x4063B020, 0x4063B820, - 0x00000002, 0x4063B020, 0x4063C220, 0x00000002, 0x4063B020, 0x4063CC20, - 0x00000002, 0x4063B420, 0x4063AC20, 0x00000002, 0x4063B420, 0x4063B820, - 0x00000002, 0x4063B420, 0x4063C220, 0x00000002, 0x4063B820, 0x4063AC20, - 0x00000003, 0x4063B820, 0x4063AC20, 0x4063D020, 0x00000002, 0x4063B820, - 0x4063B020, 0x00000003, 0x4063B820, 0x4063B020, 0x4063D020, 0x00000003, - 0x4063B820, 0x4063B420, 0x4063D020, 0x00000002, 0x4063B820, 0x4063B820, - 0x00000002, 0x4063B820, 0x4063C220, 0x00000002, 0x4063C020, 0x4063AC20, - 0x00000003, 0x4063C020, 0x4063AC20, 0x4063D020, 0x00000002, 0x4063C020, - 0x4063B420, 0x00000002, 0x4063C020, 0x4063B820, - // Block 165, offset 0x2940 - 0x00000002, 0x4063C020, 0x4063D020, 0x00000002, 0x4063C220, 0x4063A820, - 0x00000003, 0x4063C220, 0x4063A820, 0x4063D020, 0x00000003, 0x4063C220, - 0x4063B020, 0x4063CC20, 0x00000003, 0x4063C220, 0x4063B420, 0x4063D020, - 0x00000002, 0x4063C220, 0x4063C220, 0x00000002, 0x4063CA20, 0x4063A820, - 0x00000002, 0x4063CA20, 0x4063B020, 0x00000003, 0x4063CA20, 0x4063B020, - 0x4063D020, 0x00000002, 0x4063CA20, 0x4063B420, 0x00000003, 0x4063CA20, - 0x4063B420, 0x4063D020, 0x00000002, 0x4063CA20, 0x4063C220, 0x00000002, - 0x4063CA20, 0x4063D020, 0x00000002, 0x4063CC20, 0x4063C220, 0x00000002, - 0x4063CC20, 0x4063CC20, 0x00000002, 0x4063CE20, 0x4063C220, 0x00000002, - 0x4063D020, 0x4063A820, 0x00000002, 0x4063D020, 0x4063AC20, 0x00000002, - 0x4063D020, 0x4063B820, 0x00000002, 0x4063D020, - // Block 166, offset 0x2980 - 0x4063C220, 0x00000002, 0x4063D020, 0x4063CC20, 0x00000002, 0x0062AC86, - 0x0063A886, 0x00000002, 0x0062B086, 0x0063A886, 0x00000002, 0x0062B286, - 0x0063A886, 0x00000002, 0x0062B686, 0x0063A886, 0x00000002, 0x0062B886, - 0x0063A886, 0x00000002, 0x0062BA86, 0x0063A886, 0x00000002, 0x0062BE86, - 0x0063A886, 0x00000002, 0x0062C286, 0x0063A886, 0x00000002, 0x0062C286, - 0x0063C286, 0x00000002, 0x0062C486, 0x0063A886, 0x00000002, 0x0062C886, - 0x0063A886, 0x00000002, 0x0062CA86, 0x0063A886, 0x00000002, 0x0062CC86, - 0x0063A886, 0x00000002, 0x0062CE86, 0x0063A886, 0x00000002, 0x0062D086, - 0x0063A886, 0x00000002, 0x40302A20, 0xAE605202, 0x00000002, 0x00302A83, - 0xAE605202, 0x00000002, 0x40320820, 0xAE603202, 0x00000002, 0x00320883, - 0xAE603202, 0x00000002, 0x40320A20, 0xAE603202, - // Block 167, offset 0x29c0 - 0x00000002, 0x00320A83, 0xAE603202, 0x00000002, 0x40320A20, 0xAE605B02, - 0x00000002, 0x00320A83, 0xAE605B02, 0x00000002, 0x40320E21, 0xAE603702, - 0x00000002, 0x00320EA3, 0xAE603702, 0x00000002, 0x40320E21, 0xAE603C02, - 0x00000002, 0x00320EA3, 0xAE603C02, 0x00000002, 0x40321022, 0xAE603202, - 0x00000002, 0x003210C3, 0xAE603202, 0x00000002, 0x40321022, 0xAE604702, - 0x00000002, 0x003210C3, 0xAE604702, 0x00000002, 0x40321022, 0xAE605B02, - 0x00000002, 0x003210C3, 0xAE605B02, 0x00000002, 0x40321022, 0xAD806802, - 0x00000002, 0x003210C3, 0xAD806802, 0x00000002, 0x40321023, 0xAE603502, - 0x00000002, 0x003210E3, 0xAE603502, 0x00000002, 0x40321023, 0xAE604E02, - 0x00000002, 0x003210E3, 0xAE604E02, 0x00000002, 0x40321023, 0xAE606402, - 0x00000002, 0x003210E3, 0xAE606402, 0x00000002, - // Block 168, offset 0x2a00 - 0x40321023, 0xADC07002, 0x00000002, 0x003210E3, 0xADC07002, 0x00000002, - 0x40321024, 0xAE605B02, 0x00000002, 0x00321103, 0xAE605B02, 0x00000002, - 0x402BE220, 0xAE605B02, 0x00000002, 0x002BE283, 0xAE605B02, 0x00000002, - 0x402EE620, 0xAE603202, 0x00000002, 0x002EE683, 0xAE603202, 0x00000002, - 0x402EE620, 0xAE603502, 0x00000002, 0x002EE683, 0xAE603502, 0x00000002, - 0x402EE620, 0xAE604E02, 0x00000002, 0x002EE683, 0xAE604E02, 0x00000002, - 0x402EE620, 0xAE606402, 0x00000002, 0x002EE683, 0xAE606402, 0x00000002, - 0x402EE620, 0xADC07002, 0x00000002, 0x002EE683, 0xADC07002, 0x00000002, - 0x0030BE83, 0xAE604E02, 0x00000002, 0x0030BE83, 0xADC07002, 0x00000002, - 0x40321020, 0xAE604E02, 0x00000002, 0x00321083, 0xAE604E02, 0x00000002, - 0x40321024, 0xAE603202, 0x00000002, 0x00321103, - // Block 169, offset 0x2a40 - 0xAE603202, 0x00000002, 0x40321024, 0xAE603502, 0x00000002, 0x00321103, - 0xAE603502, 0x00000002, 0x40321024, 0xAE604E02, 0x00000002, 0x00321103, - 0xAE604E02, 0x00000002, 0x40321024, 0xAE606402, 0x00000002, 0x00321103, - 0xAE606402, 0x00000002, 0x40321024, 0xADC07002, 0x00000002, 0x00321103, - 0xADC07002, -} - -// mainContractElem: 1125 entries, 4500 bytes -var mainContractElem = [1125]uint32{ - // Block 0, offset 0x0 - 0x402E2220, 0xE0000CFB, 0xE0000CFB, 0x002E2288, 0xE0000D01, 0xE0000D01, - 0x40332220, 0x40332A20, 0x40333220, 0x00332288, 0x00332A88, 0x00333288, - 0x40333A20, 0x40334220, 0x00333A88, 0x00334288, 0x40336220, 0x4033A220, - 0x4033A220, 0x00336288, 0x0033A288, 0x0033A288, 0x4033B220, 0x4033BA20, - 0x0033B288, 0x0033BA88, 0x4033CA20, 0x4033D420, 0x0033CA88, 0x0033D488, - 0x4033E420, 0x4033F220, 0x0033E488, 0x0033F288, 0x40341420, 0x40343E20, - 0x40342420, 0x00341488, 0x00343E88, 0x00342488, 0x40342C20, 0x40343620, - 0x00342C88, 0x00343688, 0x4034EE20, 0x4034F620, 0x0034EE88, 0x0034F688, - 0x4034FE20, 0x40350620, 0x0034FE88, 0x00350688, 0x40345020, 0x40356A20, - 0x40356A20, 0x00345088, 0x00356A88, 0x00356A88, 0x40357220, 0x40357A20, - 0x40358220, 0x40358A20, 0x00357288, 0x00357A88, - // Block 1, offset 0x40 - 0x00358288, 0x00358A88, 0x40361820, 0x40362220, 0x00361888, 0x00362288, - 0x40367E20, 0x40368620, 0x00367E88, 0x00368688, 0x4036A820, 0x4036B020, - 0x0036A888, 0x0036B088, 0x40371420, 0x40371C20, 0x00371488, 0x00371C88, - 0x40393820, 0x40391E20, 0x40392020, 0x40392820, 0x403A7420, 0x40392620, - 0x403A9020, 0x40393020, 0x4040F020, 0x4040F420, 0x4040F620, 0x40426E20, - 0x40427220, 0x40427020, 0x40427420, 0x40429020, 0x40429420, 0x4042D020, - 0x4042D620, 0x4042DA20, 0x4042D220, 0x4042D820, 0x40435E20, 0x40436220, - 0x4043E020, 0x4043E220, 0x4043F020, 0x4043F820, 0x4043F620, 0x4043F220, - 0x4043F420, 0x4043F620, 0x4043F820, 0x40448220, 0x40448820, 0x40448C20, - 0x40448420, 0x40448A20, 0x40451E20, 0x40452620, 0x40452020, 0x40452420, - 0x40452820, 0x40452420, 0x40452620, 0x40498420, - // Block 2, offset 0x80 - 0xE0001881, 0xE0001890, 0xE000189F, 0xE00018AE, 0xE00018BD, 0xE00018CC, - 0xE00018DB, 0xE00018EA, 0xE00018F9, 0xE0001908, 0xE0001917, 0xE0001926, - 0xE0001935, 0xE0001944, 0xE0001953, 0xE0001962, 0xE0001971, 0xE0001980, - 0xE000198F, 0xE000199E, 0xE00019AD, 0xE00019BC, 0xE00019CB, 0xE00019DA, - 0xE00019E9, 0xE00019F8, 0xE0001A07, 0xE0001A16, 0xE0001A25, 0xE0001A34, - 0xE0001A43, 0xE0001A52, 0xE0001A61, 0xE0001A70, 0xE0001A7F, 0xE0001A8E, - 0xE0001A9D, 0xE0001AAC, 0xE0001ABB, 0xE0001ACA, 0xE0001AD9, 0xE0001AE8, - 0xE0001AF7, 0xE0001B06, 0xE0001B15, 0xE0001B24, 0x40498620, 0xE0001884, - 0xE0001893, 0xE00018A2, 0xE00018B1, 0xE00018C0, 0xE00018CF, 0xE00018DE, - 0xE00018ED, 0xE00018FC, 0xE000190B, 0xE000191A, 0xE0001929, 0xE0001938, - 0xE0001947, 0xE0001956, 0xE0001965, 0xE0001974, - // Block 3, offset 0xc0 - 0xE0001983, 0xE0001992, 0xE00019A1, 0xE00019B0, 0xE00019BF, 0xE00019CE, - 0xE00019DD, 0xE00019EC, 0xE00019FB, 0xE0001A0A, 0xE0001A19, 0xE0001A28, - 0xE0001A37, 0xE0001A46, 0xE0001A55, 0xE0001A64, 0xE0001A73, 0xE0001A82, - 0xE0001A91, 0xE0001AA0, 0xE0001AAF, 0xE0001ABE, 0xE0001ACD, 0xE0001ADC, - 0xE0001AEB, 0xE0001AFA, 0xE0001B09, 0xE0001B18, 0xE0001B27, 0x40498820, - 0xE0001887, 0xE0001896, 0xE00018A5, 0xE00018B4, 0xE00018C3, 0xE00018D2, - 0xE00018E1, 0xE00018F0, 0xE00018FF, 0xE000190E, 0xE000191D, 0xE000192C, - 0xE000193B, 0xE000194A, 0xE0001959, 0xE0001968, 0xE0001977, 0xE0001986, - 0xE0001995, 0xE00019A4, 0xE00019B3, 0xE00019C2, 0xE00019D1, 0xE00019E0, - 0xE00019EF, 0xE00019FE, 0xE0001A0D, 0xE0001A1C, 0xE0001A2B, 0xE0001A3A, - 0xE0001A49, 0xE0001A58, 0xE0001A67, 0xE0001A76, - // Block 4, offset 0x100 - 0xE0001A85, 0xE0001A94, 0xE0001AA3, 0xE0001AB2, 0xE0001AC1, 0xE0001AD0, - 0xE0001ADF, 0xE0001AEE, 0xE0001AFD, 0xE0001B0C, 0xE0001B1B, 0xE0001B2A, - 0x40498A20, 0xE000188A, 0xE0001899, 0xE00018A8, 0xE00018B7, 0xE00018C6, - 0xE00018D5, 0xE00018E4, 0xE00018F3, 0xE0001902, 0xE0001911, 0xE0001920, - 0xE000192F, 0xE000193E, 0xE000194D, 0xE000195C, 0xE000196B, 0xE000197A, - 0xE0001989, 0xE0001998, 0xE00019A7, 0xE00019B6, 0xE00019C5, 0xE00019D4, - 0xE00019E3, 0xE00019F2, 0xE0001A01, 0xE0001A10, 0xE0001A1F, 0xE0001A2E, - 0xE0001A3D, 0xE0001A4C, 0xE0001A5B, 0xE0001A6A, 0xE0001A79, 0xE0001A88, - 0xE0001A97, 0xE0001AA6, 0xE0001AB5, 0xE0001AC4, 0xE0001AD3, 0xE0001AE2, - 0xE0001AF1, 0xE0001B00, 0xE0001B0F, 0xE0001B1E, 0xE0001B2D, 0x40498C20, - 0xE000188D, 0xE000189C, 0xE00018AB, 0xE00018BA, - // Block 5, offset 0x140 - 0xE00018C9, 0xE00018D8, 0xE00018E7, 0xE00018F6, 0xE0001905, 0xE0001914, - 0xE0001923, 0xE0001932, 0xE0001941, 0xE0001950, 0xE000195F, 0xE000196E, - 0xE000197D, 0xE000198C, 0xE000199B, 0xE00019AA, 0xE00019B9, 0xE00019C8, - 0xE00019D7, 0xE00019E6, 0xE00019F5, 0xE0001A04, 0xE0001A13, 0xE0001A22, - 0xE0001A31, 0xE0001A40, 0xE0001A4F, 0xE0001A5E, 0xE0001A6D, 0xE0001A7C, - 0xE0001A8B, 0xE0001A9A, 0xE0001AA9, 0xE0001AB8, 0xE0001AC7, 0xE0001AD6, - 0xE0001AE5, 0xE0001AF4, 0xE0001B03, 0xE0001B12, 0xE0001B21, 0xE0001B30, - 0xA0010502, 0x40497420, 0x4049E620, 0xE0001B42, 0xE0001B51, 0xE0001B60, - 0xE0001B6F, 0xE0001B7E, 0xE0001B9C, 0xE0001BBA, 0xE0001BC9, 0xE0001BD8, - 0xE0001BE7, 0xE0001BF6, 0xE0001C05, 0xE0001C14, 0xE0001C23, 0xE0001C32, - 0xE0001C41, 0xE0001C50, 0xE0001C5F, 0xE0001C6E, - // Block 6, offset 0x180 - 0xE0001C7D, 0xE0001C8C, 0xE0001C9B, 0xE0001CAA, 0xE0001B8D, 0xE0001CE1, - 0xE0001CF0, 0xE0001CFF, 0xE0001CB9, 0xE0001CCD, 0xE0001B33, 0xE0001BAB, - 0x4049E820, 0xE0001B45, 0xE0001B54, 0xE0001B63, 0xE0001B72, 0xE0001B81, - 0xE0001B9F, 0xE0001BBD, 0xE0001BCC, 0xE0001BDB, 0xE0001BEA, 0xE0001BF9, - 0xE0001C08, 0xE0001C17, 0xE0001C26, 0xE0001C35, 0xE0001C44, 0xE0001C53, - 0xE0001C62, 0xE0001C71, 0xE0001C80, 0xE0001C8F, 0xE0001C9E, 0xE0001CAD, - 0xE0001B90, 0xE0001CE4, 0xE0001CF3, 0xE0001D02, 0xE0001CBD, 0xE0001CD1, - 0xE0001B36, 0xE0001BAE, 0x4049EA20, 0xE0001B48, 0xE0001B57, 0xE0001B66, - 0xE0001B75, 0xE0001B84, 0xE0001BA2, 0xE0001BC0, 0xE0001BCF, 0xE0001BDE, - 0xE0001BED, 0xE0001BFC, 0xE0001C0B, 0xE0001C1A, 0xE0001C29, 0xE0001C38, - 0xE0001C47, 0xE0001C56, 0xE0001C65, 0xE0001C74, - // Block 7, offset 0x1c0 - 0xE0001C83, 0xE0001C92, 0xE0001CA1, 0xE0001CB0, 0xE0001B93, 0xE0001CE7, - 0xE0001CF6, 0xE0001D05, 0xE0001CC1, 0xE0001CD5, 0xE0001B39, 0xE0001BB1, - 0x4049EC20, 0xE0001B4B, 0xE0001B5A, 0xE0001B69, 0xE0001B78, 0xE0001B87, - 0xE0001BA5, 0xE0001BC3, 0xE0001BD2, 0xE0001BE1, 0xE0001BF0, 0xE0001BFF, - 0xE0001C0E, 0xE0001C1D, 0xE0001C2C, 0xE0001C3B, 0xE0001C4A, 0xE0001C59, - 0xE0001C68, 0xE0001C77, 0xE0001C86, 0xE0001C95, 0xE0001CA4, 0xE0001CB3, - 0xE0001B96, 0xE0001CEA, 0xE0001CF9, 0xE0001D08, 0xE0001CC5, 0xE0001CD9, - 0xE0001B3C, 0xE0001BB4, 0x4049EE20, 0xE0001B4E, 0xE0001B5D, 0xE0001B6C, - 0xE0001B7B, 0xE0001B8A, 0xE0001BA8, 0xE0001BC6, 0xE0001BD5, 0xE0001BE4, - 0xE0001BF3, 0xE0001C02, 0xE0001C11, 0xE0001C20, 0xE0001C2F, 0xE0001C3E, - 0xE0001C4D, 0xE0001C5C, 0xE0001C6B, 0xE0001C7A, - // Block 8, offset 0x200 - 0xE0001C89, 0xE0001C98, 0xE0001CA7, 0xE0001CB6, 0xE0001B99, 0xE0001CED, - 0xE0001CFC, 0xE0001D0B, 0xE0001CC9, 0xE0001CDD, 0xE0001B3F, 0xE0001BB7, - 0xA0010B02, 0x4049D220, 0x404A5A20, 0xE0001D0E, 0xE0001D1D, 0xE0001D2C, - 0xE0001D3B, 0xE0001D4A, 0xE0001D59, 0xE0001D68, 0xE0001D77, 0xE0001D86, - 0xE0001D95, 0xE0001DA4, 0xE0001DB3, 0xE0001DC2, 0xE0001DD1, 0xE0001DE0, - 0xE0001DEF, 0xE0001DFE, 0xE0001E0D, 0xE0001E1C, 0xE0001E2B, 0xE0001E3A, - 0xE0001E49, 0xE0001E58, 0xE0001E67, 0xE0001E76, 0xE0001E85, 0xE0001E94, - 0xE0001EA3, 0xE0001EB2, 0xE0001EC1, 0xE0001ED0, 0xE0001EDF, 0xE0001EEE, - 0xE0001EFD, 0xE0001F0C, 0xE0001F1B, 0xE0001F2A, 0xE0001F39, 0xE0001F48, - 0xE0001F57, 0xE0001F66, 0xE0001F75, 0xE0001F84, 0xE0001F93, 0xE0001FA2, - 0xE0001FB1, 0xE0001FC0, 0xE0001FCF, 0x404A5C20, - // Block 9, offset 0x240 - 0xE0001D11, 0xE0001D20, 0xE0001D2F, 0xE0001D3E, 0xE0001D4D, 0xE0001D5C, - 0xE0001D6B, 0xE0001D7A, 0xE0001D89, 0xE0001D98, 0xE0001DA7, 0xE0001DB6, - 0xE0001DC5, 0xE0001DD4, 0xE0001DE3, 0xE0001DF2, 0xE0001E01, 0xE0001E10, - 0xE0001E1F, 0xE0001E2E, 0xE0001E3D, 0xE0001E4C, 0xE0001E5B, 0xE0001E6A, - 0xE0001E79, 0xE0001E88, 0xE0001E97, 0xE0001EA6, 0xE0001EB5, 0xE0001EC4, - 0xE0001ED3, 0xE0001EE2, 0xE0001EF1, 0xE0001F00, 0xE0001F0F, 0xE0001F1E, - 0xE0001F2D, 0xE0001F3C, 0xE0001F4B, 0xE0001F5A, 0xE0001F69, 0xE0001F78, - 0xE0001F87, 0xE0001F96, 0xE0001FA5, 0xE0001FB4, 0xE0001FC3, 0xE0001FD2, - 0x404A6220, 0xE0001D14, 0xE0001D23, 0xE0001D32, 0xE0001D41, 0xE0001D50, - 0xE0001D5F, 0xE0001D6E, 0xE0001D7D, 0xE0001D8C, 0xE0001D9B, 0xE0001DAA, - 0xE0001DB9, 0xE0001DC8, 0xE0001DD7, 0xE0001DE6, - // Block 10, offset 0x280 - 0xE0001DF5, 0xE0001E04, 0xE0001E13, 0xE0001E22, 0xE0001E31, 0xE0001E40, - 0xE0001E4F, 0xE0001E5E, 0xE0001E6D, 0xE0001E7C, 0xE0001E8B, 0xE0001E9A, - 0xE0001EA9, 0xE0001EB8, 0xE0001EC7, 0xE0001ED6, 0xE0001EE5, 0xE0001EF4, - 0xE0001F03, 0xE0001F12, 0xE0001F21, 0xE0001F30, 0xE0001F3F, 0xE0001F4E, - 0xE0001F5D, 0xE0001F6C, 0xE0001F7B, 0xE0001F8A, 0xE0001F99, 0xE0001FA8, - 0xE0001FB7, 0xE0001FC6, 0xE0001FD5, 0x404A6620, 0xE0001D17, 0xE0001D26, - 0xE0001D35, 0xE0001D44, 0xE0001D53, 0xE0001D62, 0xE0001D71, 0xE0001D80, - 0xE0001D8F, 0xE0001D9E, 0xE0001DAD, 0xE0001DBC, 0xE0001DCB, 0xE0001DDA, - 0xE0001DE9, 0xE0001DF8, 0xE0001E07, 0xE0001E16, 0xE0001E25, 0xE0001E34, - 0xE0001E43, 0xE0001E52, 0xE0001E61, 0xE0001E70, 0xE0001E7F, 0xE0001E8E, - 0xE0001E9D, 0xE0001EAC, 0xE0001EBB, 0xE0001ECA, - // Block 11, offset 0x2c0 - 0xE0001ED9, 0xE0001EE8, 0xE0001EF7, 0xE0001F06, 0xE0001F15, 0xE0001F24, - 0xE0001F33, 0xE0001F42, 0xE0001F51, 0xE0001F60, 0xE0001F6F, 0xE0001F7E, - 0xE0001F8D, 0xE0001F9C, 0xE0001FAB, 0xE0001FBA, 0xE0001FC9, 0xE0001FD8, - 0x404A6820, 0xE0001D1A, 0xE0001D29, 0xE0001D38, 0xE0001D47, 0xE0001D56, - 0xE0001D65, 0xE0001D74, 0xE0001D83, 0xE0001D92, 0xE0001DA1, 0xE0001DB0, - 0xE0001DBF, 0xE0001DCE, 0xE0001DDD, 0xE0001DEC, 0xE0001DFB, 0xE0001E0A, - 0xE0001E19, 0xE0001E28, 0xE0001E37, 0xE0001E46, 0xE0001E55, 0xE0001E64, - 0xE0001E73, 0xE0001E82, 0xE0001E91, 0xE0001EA0, 0xE0001EAF, 0xE0001EBE, - 0xE0001ECD, 0xE0001EDC, 0xE0001EEB, 0xE0001EFA, 0xE0001F09, 0xE0001F18, - 0xE0001F27, 0xE0001F36, 0xE0001F45, 0xE0001F54, 0xE0001F63, 0xE0001F72, - 0xE0001F81, 0xE0001F90, 0xE0001F9F, 0xE0001FAE, - // Block 12, offset 0x300 - 0xE0001FBD, 0xE0001FCC, 0xE0001FDB, 0x404AEA20, 0xE000200E, 0xE0002011, - 0x404B2620, 0x404B2420, 0x404B2620, 0x404AF020, 0xE0002014, 0xE0002017, - 0x404B2A20, 0x404B2820, 0x404B2A20, 0x8281258B, 0x8281258D, 0x82812591, - 0x8281258F, 0x404ECA20, 0x404ECC20, 0x404F9C20, 0x404F9620, 0x404F9E20, - 0x404F9820, 0x40522620, 0x40522820, 0x40522A20, 0x40522C20, 0x40522E20, - 0x40523020, 0x40523220, 0x40523420, 0x40523620, 0x40523820, 0x40523E20, - 0x40524020, 0x40529C20, 0x40529E20, 0x4052A020, 0x4052A220, 0x4052A420, - 0x4052A820, 0x4052A620, 0x4052AA20, 0x4052AC20, 0x4052AE20, 0x40094220, - 0x40094420, 0x40393820, 0x40393A21, 0x40393A22, 0x40393A23, 0x403A7420, - 0x403A7621, 0x403A9020, 0x403A9221, 0x402C3A20, 0x402C3C20, 0x002C3A88, - 0x002C3C83, 0x402D2220, 0x402D2420, 0x002D2288, - // Block 13, offset 0x340 - 0x002D2483, 0x002D9883, 0x002D9A83, 0x402EE220, 0x402EE420, 0x002EE288, - 0x002EE483, 0x402FE620, 0x402FE820, 0x002FE688, 0x002FE883, 0x40306C20, - 0x40306E20, 0x00306C88, 0x00306E83, 0x402E2220, 0x402E2420, 0x402E2420, - 0x002E2288, 0x002E2483, 0x002E2483, 0x402BDE20, 0x402BE020, 0x002BDE88, - 0x002BE083, 0x402C6220, 0x402C6420, 0x002C6288, 0x002C6483, 0x402C9820, - 0x402C9A20, 0x402C9C20, 0x002C9888, 0x002C9A83, 0x002C9C83, 0x402D9A20, - 0x402D9C20, 0x002D9A88, 0x002D9C83, 0x402E9E20, 0x402EA020, 0x002E9E88, - 0x002EA083, 0x402F7A20, 0x402F7C20, 0x002F7A88, 0x002F7C83, 0x40302C20, - 0x40302E20, 0x00302C88, 0x00302E83, 0x40306C20, 0x40306E20, 0x40307020, - 0x00306C88, 0x00306E83, 0x00307083, 0x40310020, 0x40310220, 0x00310088, - 0x00310283, 0x40312A20, 0x40312C20, 0x00312A88, - // Block 14, offset 0x380 - 0x00312C83, 0x40306C20, 0x40310021, 0x40310022, 0x00306C88, 0x003100A3, - 0x003100C3, 0x402BDE20, 0x40320C21, 0x40321020, 0x00321084, 0x002BDE88, - 0x00320CA3, 0x00321083, 0x00321086, 0x00321085, 0x402C9820, 0x40320C22, - 0x002C9888, 0x00320CC3, 0x402EE220, 0x40320E21, 0x40320E22, 0x002EE288, - 0x00320EA3, 0x00320EC3, 0x402BDE20, 0xE00026B2, 0x002BDE88, 0xE00026B5, - 0x402EE220, 0xE00026C0, 0x002EE288, 0xE00026C3, 0x40306C20, 0xE00026D6, - 0x00306C88, 0xE00026D9, 0x402BDE20, 0x40320E20, 0x40320C20, 0x002BDE88, - 0x00320E83, 0x00320C83, 0x402EE220, 0x40321023, 0x40321020, 0x40321022, - 0x002EE288, 0x003210E3, 0x00321083, 0x003210C3, 0x402C3A20, 0x402C3E20, - 0x402C3C20, 0x002C3A88, 0x002C3E83, 0x002C3C83, 0x402C6220, 0x402C6420, - 0x402C6420, 0x002C6288, 0x002C6486, 0x002C6484, - // Block 15, offset 0x3c0 - 0x002C6486, 0x002C6484, 0x402E2220, 0xE0000CFB, 0xE0000CFB, 0x402E2420, - 0x002E2288, 0xE0000D01, 0xE0000D01, 0x002E2486, 0x002E2484, 0x002E9E88, - 0x002EA086, 0x002EA084, 0x402BDE20, 0x402C0820, 0x40320C21, 0x40321020, - 0x002BDE88, 0x002C0883, 0x00320CA3, 0x00321083, 0x402C9820, 0x402D0620, - 0x002C9888, 0x002D0683, 0x402D9A20, 0x402DCA20, 0x002D9A88, 0x002DCA83, - 0x402EE220, 0x402F2A20, 0x40320E20, 0x002EE288, 0x002F2A83, 0x00320E83, - 0x40306C20, 0x4030BC20, 0x00306C88, 0x0030BC83, 0x40310020, 0x40312820, - 0x00310088, 0x00312883, 0x002DFE88, 0x002F56A3, 0x402BDE20, 0x40320C21, - 0x40321020, 0x002BDE88, 0x00320CA3, 0x00321083, 0x4062AC20, 0x4062AC21, - 0x4062B220, 0x4062B221, 0x4062BA20, 0x4062BA21, 0x4062BE20, 0x4062BE21, - 0x4062C420, 0x4062C421, 0x402BDE20, 0x40320C21, - // Block 16, offset 0x400 - 0x40321020, 0x40321021, 0x002BDE88, 0x00320CA3, 0x00321083, 0x003210A4, - 0x003210A3, 0x402BDE20, 0x402C0820, 0x40320E21, 0x40320C21, 0x40320E20, - 0x40320C20, 0x002BDE88, 0x002C0883, 0x00320EA3, 0x00320CA3, 0x00320E83, - 0x00320C83, 0x402C3A20, 0x402C5C20, 0x002C3A88, 0x002C5C83, 0x402C5E20, - 0x402C6020, 0x002C5E83, 0x002C6083, 0x402D2220, 0x402D6420, 0x002D2288, - 0x002D6483, 0x402DFE20, 0x402E2020, 0x002DFE88, 0x002E2083, 0x402E9E20, - 0x402EE021, 0x402EE022, 0x002E9E88, 0x002EE0A3, 0x002EE0C3, 0x402FE620, - 0x40302A20, 0x002FE688, 0x00302A83, 0x40312A20, 0x40320620, 0x00312A88, - 0x00320683, 0x402EE220, 0x40321023, 0x40321022, 0x40321020, 0x40321021, - 0x40321024, 0x002EE288, 0x003210E3, 0x003210C3, 0x00321083, 0x003210A3, - 0x00321103, 0x402BDE20, 0x402BE020, 0x402BE220, - // Block 17, offset 0x440 - 0x002BDE88, 0x002BE083, 0x002BE283, 0x402E2220, 0xE0000CFB, 0x402E2420, - 0x402E2620, 0xE0000CFB, 0x002E2288, 0xE0000D01, 0x002E2483, 0x002E2683, - 0xE0000D01, 0x402EE220, 0x402EE420, 0x402EE620, 0x002EE288, 0x002EE483, - 0x002EE683, 0x402F7A20, 0x402F7C20, 0x402F7E20, 0x002F7A88, 0x002F7C83, - 0x002F7E83, 0x402C9820, 0x40320E22, 0x002C9888, 0x00320EC3, 0x402EE220, - 0x40321024, 0x40321020, 0x40321022, 0x002EE288, 0x00321103, 0x00321083, - 0x003210C3, -} - -// mainValues: 37888 entries, 151552 bytes -// Block 2 is the null block. -var mainValues = [37888]uint32{ - // Block 0x0, offset 0x0 - 0x0000: 0xa0000000, 0x0001: 0xa0000000, 0x0002: 0xa0000000, 0x0003: 0xa0000000, - 0x0004: 0xa0000000, 0x0005: 0xa0000000, 0x0006: 0xa0000000, 0x0007: 0xa0000000, - 0x0008: 0xa0000000, 0x0009: 0x40020020, 0x000a: 0x40020220, 0x000b: 0x40020420, - 0x000c: 0x40020620, 0x000d: 0x40020820, 0x000e: 0xa0000000, 0x000f: 0xa0000000, - 0x0010: 0xa0000000, 0x0011: 0xa0000000, 0x0012: 0xa0000000, 0x0013: 0xa0000000, - 0x0014: 0xa0000000, 0x0015: 0xa0000000, 0x0016: 0xa0000000, 0x0017: 0xa0000000, - 0x0018: 0xa0000000, 0x0019: 0xa0000000, 0x001a: 0xa0000000, 0x001b: 0xa0000000, - 0x001c: 0xa0000000, 0x001d: 0xa0000000, 0x001e: 0xa0000000, 0x001f: 0xa0000000, - 0x0020: 0x40021220, 0x0021: 0x4002ba20, 0x0022: 0x4003e020, 0x0023: 0x4004ea20, - 0x0024: 0x4027de20, 0x0025: 0x4004ec20, 0x0026: 0x4004e620, 0x0027: 0x4003d220, - 0x0028: 0x4003f420, 0x0029: 0x4003f620, 0x002a: 0x4004d820, 0x002b: 0x40093820, - 0x002c: 0x40024020, 0x002d: 0x40021a20, 0x002e: 0x4002e420, 0x002f: 0x4004e220, - 0x0030: 0x4029cc20, 0x0031: 0x4029ce20, 0x0032: 0x4029d020, 0x0033: 0x4029d220, - 0x0034: 0x4029d420, 0x0035: 0x4029d620, 0x0036: 0x4029d820, 0x0037: 0x4029da20, - 0x0038: 0x4029dc20, 0x0039: 0x4029de20, 0x003a: 0x40026c20, 0x003b: 0x40026220, - 0x003c: 0x40094020, 0x003d: 0x40094220, 0x003e: 0x40094420, 0x003f: 0x4002c420, - // Block 0x1, offset 0x40 - 0x0040: 0x4004d620, 0x0041: 0x002bde88, 0x0042: 0x002c0a88, 0x0043: 0x002c3a88, - 0x0044: 0x002c6288, 0x0045: 0x002c9888, 0x0046: 0x002d0888, 0x0047: 0x002d2288, - 0x0048: 0x002d6888, 0x0049: 0x002d9a88, 0x004a: 0x002dcc88, 0x004b: 0x002dfe88, - 0x004c: 0xc0030002, 0x004d: 0x002e8288, 0x004e: 0x002e9e88, 0x004f: 0x002ee288, - 0x0050: 0x002f2c88, 0x0051: 0x002f5688, 0x0052: 0x002f7a88, 0x0053: 0x002fe688, - 0x0054: 0x00302c88, 0x0055: 0x00306c88, 0x0056: 0x0030be88, 0x0057: 0x0030e288, - 0x0058: 0x0030f688, 0x0059: 0x00310088, 0x005a: 0x00312a88, 0x005b: 0x4003f820, - 0x005c: 0x4004e420, 0x005d: 0x4003fa20, 0x005e: 0x40062420, 0x005f: 0x40021620, - 0x0060: 0x40061e20, 0x0061: 0x402bde20, 0x0062: 0x402c0a20, 0x0063: 0x402c3a20, - 0x0064: 0x402c6220, 0x0065: 0x402c9820, 0x0066: 0x402d0820, 0x0067: 0x402d2220, - 0x0068: 0x402d6820, 0x0069: 0x402d9a20, 0x006a: 0x402dcc20, 0x006b: 0x402dfe20, - 0x006c: 0xc0000002, 0x006d: 0x402e8220, 0x006e: 0x402e9e20, 0x006f: 0x402ee220, - 0x0070: 0x402f2c20, 0x0071: 0x402f5620, 0x0072: 0x402f7a20, 0x0073: 0x402fe620, - 0x0074: 0x40302c20, 0x0075: 0x40306c20, 0x0076: 0x4030be20, 0x0077: 0x4030e220, - 0x0078: 0x4030f620, 0x0079: 0x40310020, 0x007a: 0x40312a20, 0x007b: 0x4003fc20, - 0x007c: 0x40094820, 0x007d: 0x4003fe20, 0x007e: 0x40094c20, 0x007f: 0xa0000000, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0x00c0: 0xa0000000, 0x00c1: 0xa0000000, 0x00c2: 0xa0000000, 0x00c3: 0xa0000000, - 0x00c4: 0xa0000000, 0x00c5: 0x40020a20, 0x00c6: 0xa0000000, 0x00c7: 0xa0000000, - 0x00c8: 0xa0000000, 0x00c9: 0xa0000000, 0x00ca: 0xa0000000, 0x00cb: 0xa0000000, - 0x00cc: 0xa0000000, 0x00cd: 0xa0000000, 0x00ce: 0xa0000000, 0x00cf: 0xa0000000, - 0x00d0: 0xa0000000, 0x00d1: 0xa0000000, 0x00d2: 0xa0000000, 0x00d3: 0xa0000000, - 0x00d4: 0xa0000000, 0x00d5: 0xa0000000, 0x00d6: 0xa0000000, 0x00d7: 0xa0000000, - 0x00d8: 0xa0000000, 0x00d9: 0xa0000000, 0x00da: 0xa0000000, 0x00db: 0xa0000000, - 0x00dc: 0xa0000000, 0x00dd: 0xa0000000, 0x00de: 0xa0000000, 0x00df: 0xa0000000, - 0x00e0: 0x0002129b, 0x00e1: 0x4002bc20, 0x00e2: 0x4027dc20, 0x00e3: 0x4027e020, - 0x00e4: 0x4027da20, 0x00e5: 0x4027e220, 0x00e6: 0x40094a20, 0x00e7: 0x4004ce20, - 0x00e8: 0x40062c20, 0x00e9: 0x40081820, 0x00ea: 0x002bde94, 0x00eb: 0x4003f020, - 0x00ec: 0x40094620, 0x00ed: 0xa0000000, 0x00ee: 0x40081a20, 0x00ef: 0x40062620, - 0x00f0: 0x40070420, 0x00f1: 0x40093a20, 0x00f2: 0x0029d094, 0x00f3: 0x0029d294, - 0x00f4: 0x40062020, 0x00f5: 0x00327684, 0x00f6: 0x4004d220, 0x00f7: 0x40030620, - 0x00f8: 0x40063220, 0x00f9: 0x0029ce94, 0x00fa: 0x002ee294, 0x00fb: 0x4003f220, - 0x00fc: 0xe00002bf, 0x00fd: 0xe00002b7, 0x00fe: 0xe00004a7, 0x00ff: 0x4002c620, - // Block 0x4, offset 0x100 - 0x0100: 0xe00008f5, 0x0101: 0xe00008ef, 0x0102: 0xe0000921, 0x0103: 0xe0000969, - 0x0104: 0xe000095b, 0x0105: 0xe000094d, 0x0106: 0xe00009dd, 0x0107: 0xe0000a53, - 0x0108: 0xe0000ae8, 0x0109: 0xe0000ae2, 0x010a: 0xe0000af4, 0x010b: 0xe0000b20, - 0x010c: 0xe0000c2b, 0x010d: 0xe0000c25, 0x010e: 0xe0000c37, 0x010f: 0xe0000c43, - 0x0110: 0xe0000ab3, 0x0111: 0xe0000d63, 0x0112: 0xe0000d9a, 0x0113: 0xe0000d94, - 0x0114: 0xe0000da6, 0x0115: 0xe0000de6, 0x0116: 0xe0000dd2, 0x0117: 0x40093e20, - 0x0118: 0xe0000e12, 0x0119: 0xe0000fe1, 0x011a: 0xe0000fdb, 0x011b: 0xe0000fed, - 0x011c: 0xe0000fff, 0x011d: 0xe0001102, 0x011e: 0x00318888, 0x011f: 0xe0000f7b, - 0x0120: 0xe00008f2, 0x0121: 0xe00008ec, 0x0122: 0xe000091e, 0x0123: 0xe0000966, - 0x0124: 0xe0000958, 0x0125: 0xe000094a, 0x0126: 0xe00009d5, 0x0127: 0xe0000a4d, - 0x0128: 0xe0000ae5, 0x0129: 0xe0000adf, 0x012a: 0xe0000af1, 0x012b: 0xe0000b1d, - 0x012c: 0xe0000c28, 0x012d: 0xe0000c22, 0x012e: 0xe0000c34, 0x012f: 0xe0000c40, - 0x0130: 0xe0000aad, 0x0131: 0xe0000d60, 0x0132: 0xe0000d97, 0x0133: 0xe0000d91, - 0x0134: 0xe0000da3, 0x0135: 0xe0000de3, 0x0136: 0xe0000dcf, 0x0137: 0x40093c20, - 0x0138: 0xe0000e0f, 0x0139: 0xe0000fde, 0x013a: 0xe0000fd8, 0x013b: 0xe0000fea, - 0x013c: 0xe0000ffc, 0x013d: 0xe00010ff, 0x013e: 0x40318820, 0x013f: 0xe0001114, - // Block 0x5, offset 0x140 - 0x0140: 0xe0000983, 0x0141: 0xe0000980, 0x0142: 0xe00008fb, 0x0143: 0xe00008f8, - 0x0144: 0xe000097d, 0x0145: 0xe000097a, 0x0146: 0xe0000a38, 0x0147: 0xe0000a35, - 0x0148: 0xe0000a3e, 0x0149: 0xe0000a3b, 0x014a: 0xe0000a4a, 0x014b: 0xe0000a47, - 0x014c: 0xe0000a44, 0x014d: 0xe0000a41, 0x014e: 0xe0000a86, 0x014f: 0xe0000a83, - 0x0150: 0xe0000aaa, 0x0151: 0xe0000aa7, 0x0152: 0xe0000b46, 0x0153: 0xe0000b43, - 0x0154: 0xe0000aee, 0x0155: 0xe0000aeb, 0x0156: 0xe0000b2c, 0x0157: 0xe0000b29, - 0x0158: 0xe0000b40, 0x0159: 0xe0000b3d, 0x015a: 0xe0000b1a, 0x015b: 0xe0000b17, - 0x015c: 0xe0000bb8, 0x015d: 0xe0000bb5, 0x015e: 0xe0000bb2, 0x015f: 0xe0000baf, - 0x0160: 0xe0000bc4, 0x0161: 0xe0000bc1, 0x0162: 0xe0000bca, 0x0163: 0xe0000bc7, - 0x0164: 0xe0000bee, 0x0165: 0xe0000beb, 0x0166: 0xe0000c1b, 0x0167: 0xe0000c18, - 0x0168: 0xe0000c51, 0x0169: 0xe0000c4e, 0x016a: 0xe0000c60, 0x016b: 0xe0000c5d, - 0x016c: 0xe0000c31, 0x016d: 0xe0000c2e, 0x016e: 0xe0000c5a, 0x016f: 0xe0000c57, - 0x0170: 0xe0000c54, 0x0171: 0x402da220, 0x0172: 0xf0000a0a, 0x0173: 0xf0000404, - 0x0174: 0xe0000c8a, 0x0175: 0xe0000c87, 0x0176: 0xe0000c9f, 0x0177: 0xe0000c9c, - 0x0178: 0x402f7220, 0x0179: 0xe0000ccc, 0x017a: 0xe0000cc9, 0x017b: 0xe0000cd8, - 0x017c: 0xe0000cd5, 0x017d: 0xe0000cd2, 0x017e: 0xe0000ccf, 0x017f: 0xe0000d04, - // Block 0x6, offset 0x180 - 0x0180: 0xe0000cfe, 0x0181: 0xe0000cf8, 0x0182: 0xe0000cf5, 0x0183: 0xe0000d51, - 0x0184: 0xe0000d4e, 0x0185: 0xe0000d6f, 0x0186: 0xe0000d6c, 0x0187: 0xe0000d5d, - 0x0188: 0xe0000d5a, 0x0189: 0xf0000404, 0x018a: 0x002eda88, 0x018b: 0x402eda20, - 0x018c: 0xe0000e2e, 0x018d: 0xe0000e2b, 0x018e: 0xe0000da0, 0x018f: 0xe0000d9d, - 0x0190: 0xe0000de0, 0x0191: 0xe0000ddd, 0x0192: 0xe0000e93, 0x0193: 0xe0000e8f, - 0x0194: 0xe0000eca, 0x0195: 0xe0000ec7, 0x0196: 0xe0000edc, 0x0197: 0xe0000ed9, - 0x0198: 0xe0000ed0, 0x0199: 0xe0000ecd, 0x019a: 0xe0000f1f, 0x019b: 0xe0000f1c, - 0x019c: 0xe0000f2d, 0x019d: 0xe0000f2a, 0x019e: 0xe0000f47, 0x019f: 0xe0000f44, - 0x01a0: 0xe0000f33, 0x01a1: 0xe0000f30, 0x01a2: 0xe0000f99, 0x01a3: 0xe0000f96, - 0x01a4: 0xe0000f8a, 0x01a5: 0xe0000f87, 0x01a6: 0x00303688, 0x01a7: 0x40303620, - 0x01a8: 0xe000102b, 0x01a9: 0xe0001028, 0x01aa: 0xe000103f, 0x01ab: 0xe000103c, - 0x01ac: 0xe0000fe7, 0x01ad: 0xe0000fe4, 0x01ae: 0xe0000ff9, 0x01af: 0xe0000ff6, - 0x01b0: 0xe0001025, 0x01b1: 0xe0001022, 0x01b2: 0xe0001039, 0x01b3: 0xe0001036, - 0x01b4: 0xe00010d8, 0x01b5: 0xe00010d5, 0x01b6: 0xe000110e, 0x01b7: 0xe000110b, - 0x01b8: 0xe0001117, 0x01b9: 0xe000113b, 0x01ba: 0xe0001138, 0x01bb: 0xe000114d, - 0x01bc: 0xe000114a, 0x01bd: 0xe0001147, 0x01be: 0xe0001144, 0x01bf: 0xe0000f64, - // Block 0x7, offset 0x1c0 - 0x01c0: 0x402c1a20, 0x01c1: 0x002c2a88, 0x01c2: 0x002c3288, 0x01c3: 0x402c3220, - 0x01c4: 0x0031c488, 0x01c5: 0x4031c420, 0x01c6: 0x002efa88, 0x01c7: 0x002c4e88, - 0x01c8: 0x402c4e20, 0x01c9: 0x002c7288, 0x01ca: 0x002c7a88, 0x01cb: 0x002c8488, - 0x01cc: 0x402c8420, 0x01cd: 0xe000115c, 0x01ce: 0x002cae88, 0x01cf: 0x002cb888, - 0x01d0: 0x002cc288, 0x01d1: 0x002d1688, 0x01d2: 0x402d1620, 0x01d3: 0x002d4488, - 0x01d4: 0x002d5888, 0x01d5: 0x402d7820, 0x01d6: 0x002dc288, 0x01d7: 0x002db688, - 0x01d8: 0x002e0a88, 0x01d9: 0x402e0a20, 0x01da: 0x402e3820, 0x01db: 0x402e7220, - 0x01dc: 0x0030a088, 0x01dd: 0x002eb488, 0x01de: 0x402ebc20, 0x01df: 0x002f1088, - 0x01e0: 0xe0000e56, 0x01e1: 0xe0000e53, 0x01e2: 0x002d6088, 0x01e3: 0x402d6020, - 0x01e4: 0x002f3e88, 0x01e5: 0x402f3e20, 0x01e6: 0x002f8288, 0x01e7: 0x0031b488, - 0x01e8: 0x4031b420, 0x01e9: 0x00300888, 0x01ea: 0x40301220, 0x01eb: 0x40304220, - 0x01ec: 0x00304a88, 0x01ed: 0x40304a20, 0x01ee: 0x00305288, 0x01ef: 0xe000105f, - 0x01f0: 0xe000105c, 0x01f1: 0x0030b488, 0x01f2: 0x0030cc88, 0x01f3: 0x00311888, - 0x01f4: 0x40311820, 0x01f5: 0x00313488, 0x01f6: 0x40313420, 0x01f7: 0x00316488, - 0x01f8: 0x00316e88, 0x01f9: 0x40316e20, 0x01fa: 0x40317820, 0x01fb: 0x4031a620, - 0x01fc: 0x0031bc88, 0x01fd: 0x4031bc20, 0x01fe: 0xe0000fc9, 0x01ff: 0x40319420, - // Block 0x8, offset 0x200 - 0x0200: 0x40321220, 0x0201: 0x40321a20, 0x0202: 0x40322220, 0x0203: 0x40322a20, - 0x0204: 0xe0000ad5, 0x0205: 0xe0000ad1, 0x0206: 0xe0000acd, 0x0207: 0xf0000a0a, - 0x0208: 0xf000040a, 0x0209: 0xf0000404, 0x020a: 0xf0000a0a, 0x020b: 0xf000040a, - 0x020c: 0xf0000404, 0x020d: 0xe0000947, 0x020e: 0xe0000944, 0x020f: 0xe0000c3d, - 0x0210: 0xe0000c3a, 0x0211: 0xe0000dcc, 0x0212: 0xe0000dc9, 0x0213: 0xe0000ff3, - 0x0214: 0xe0000ff0, 0x0215: 0xe000101e, 0x0216: 0xe000101a, 0x0217: 0xe0001006, - 0x0218: 0xe0001002, 0x0219: 0xe0001016, 0x021a: 0xe0001012, 0x021b: 0xe000100e, - 0x021c: 0xe000100a, 0x021d: 0x402cae20, 0x021e: 0xe0000962, 0x021f: 0xe000095e, - 0x0220: 0xe0000976, 0x0221: 0xe0000972, 0x0222: 0xe00009f4, 0x0223: 0xe00009ef, - 0x0224: 0x002d3a88, 0x0225: 0x402d3a20, 0x0226: 0xe0000bbe, 0x0227: 0xe0000bbb, - 0x0228: 0xe0000c99, 0x0229: 0xe0000c96, 0x022a: 0xe0000e20, 0x022b: 0xe0000e1d, - 0x022c: 0xe0000e27, 0x022d: 0xe0000e23, 0x022e: 0xe0001162, 0x022f: 0xe000115f, - 0x0230: 0xe0000c8d, 0x0231: 0xf0000a0a, 0x0232: 0xf000040a, 0x0233: 0xf0000404, - 0x0234: 0xe0000bac, 0x0235: 0xe0000ba9, 0x0236: 0x002d7888, 0x0237: 0x00319488, - 0x0238: 0xe0000d57, 0x0239: 0xe0000d54, 0x023a: 0xe0000954, 0x023b: 0xe0000950, - 0x023c: 0xe00009ea, 0x023d: 0xe00009e5, 0x023e: 0xe0000e19, 0x023f: 0xe0000e15, - // Block 0x9, offset 0x240 - 0x0240: 0xe000098f, 0x0241: 0xe000098c, 0x0242: 0xe0000995, 0x0243: 0xe0000992, - 0x0244: 0xe0000b62, 0x0245: 0xe0000b5f, 0x0246: 0xe0000b68, 0x0247: 0xe0000b65, - 0x0248: 0xe0000c6c, 0x0249: 0xe0000c69, 0x024a: 0xe0000c72, 0x024b: 0xe0000c6f, - 0x024c: 0xe0000e4a, 0x024d: 0xe0000e47, 0x024e: 0xe0000e50, 0x024f: 0xe0000e4d, - 0x0250: 0xe0000ee8, 0x0251: 0xe0000ee5, 0x0252: 0xe0000eee, 0x0253: 0xe0000eeb, - 0x0254: 0xe0001053, 0x0255: 0xe0001050, 0x0256: 0xe0001059, 0x0257: 0xe0001056, - 0x0258: 0xe0000f61, 0x0259: 0xe0000f5e, 0x025a: 0xe0000fa5, 0x025b: 0xe0000fa2, - 0x025c: 0x00312288, 0x025d: 0x40312220, 0x025e: 0xe0000bf4, 0x025f: 0xe0000bf1, - 0x0260: 0x002ebc88, 0x0261: 0x402c8c20, 0x0262: 0x002f2288, 0x0263: 0x402f2220, - 0x0264: 0x00314088, 0x0265: 0x40314020, 0x0266: 0xe000096f, 0x0267: 0xe000096c, - 0x0268: 0xe0000b32, 0x0269: 0xe0000b2f, 0x026a: 0xe0000dd9, 0x026b: 0xe0000dd5, - 0x026c: 0xe0000dfd, 0x026d: 0xe0000df9, 0x026e: 0xe0000e04, 0x026f: 0xe0000e01, - 0x0270: 0xe0000e0b, 0x0271: 0xe0000e07, 0x0272: 0xe0001129, 0x0273: 0xe0001126, - 0x0274: 0x402e5e20, 0x0275: 0x402ed020, 0x0276: 0x40305a20, 0x0277: 0x402dd420, - 0x0278: 0xe0000abf, 0x0279: 0xe0000ec4, 0x027a: 0x002be888, 0x027b: 0x002c4488, - 0x027c: 0x402c4420, 0x027d: 0x002e3888, 0x027e: 0x00303e88, 0x027f: 0x402ffc20, - // Block 0xa, offset 0x280 - 0x0280: 0x40315820, 0x0281: 0x0031d488, 0x0282: 0x4031d420, 0x0283: 0x002c1a88, - 0x0284: 0x00307c88, 0x0285: 0x0030da88, 0x0286: 0x002ca288, 0x0287: 0x402ca220, - 0x0288: 0x002dde88, 0x0289: 0x402dde20, 0x028a: 0x002f6a88, 0x028b: 0x402f6a20, - 0x028c: 0x002f8e88, 0x028d: 0x402f8e20, 0x028e: 0x00311088, 0x028f: 0x40311020, - 0x0290: 0x402bf020, 0x0291: 0x402bf820, 0x0292: 0x402c0220, 0x0293: 0x402c2a20, - 0x0294: 0x402efa20, 0x0295: 0x402c5620, 0x0296: 0x402c7220, 0x0297: 0x402c7a20, - 0x0298: 0x402ccc20, 0x0299: 0x402cb820, 0x029a: 0x402cd420, 0x029b: 0x402cc220, - 0x029c: 0x402cdc20, 0x029d: 0x402ce820, 0x029e: 0x402cf020, 0x029f: 0x402dee20, - 0x02a0: 0x402d4420, 0x02a1: 0x402d2a20, 0x02a2: 0x402d3220, 0x02a3: 0x402d5820, - 0x02a4: 0x402d0020, 0x02a5: 0x40308820, 0x02a6: 0x402d8020, 0x02a7: 0x402d8e20, - 0x02a8: 0x402db620, 0x02a9: 0x402dc220, 0x02aa: 0x402daa20, 0x02ab: 0x402e4220, - 0x02ac: 0x402e4a20, 0x02ad: 0x402e5420, 0x02ae: 0x402e6820, 0x02af: 0x4030a020, - 0x02b0: 0x4030ac20, 0x02b1: 0x402e9020, 0x02b2: 0x402eb420, 0x02b3: 0x402ec820, - 0x02b4: 0x402ea620, 0x02b5: 0x402f1020, 0x02b6: 0x402eee20, 0x02b7: 0x402f1a20, - 0x02b8: 0x402f4c20, 0x02b9: 0x402f9820, 0x02ba: 0x402fa220, 0x02bb: 0x402fac20, - 0x02bc: 0x402fb620, 0x02bd: 0x402fbe20, 0x02be: 0x402fc620, 0x02bf: 0x402fd020, - // Block 0xb, offset 0x2c0 - 0x02c0: 0x402f8220, 0x02c1: 0x402fd820, 0x02c2: 0x402ff420, 0x02c3: 0x40300820, - 0x02c4: 0x402df620, 0x02c5: 0x40301a20, 0x02c6: 0x40302420, 0x02c7: 0x40306420, - 0x02c8: 0x40305220, 0x02c9: 0x40307c20, 0x02ca: 0x4030b420, 0x02cb: 0x4030cc20, - 0x02cc: 0x4030da20, 0x02cd: 0x4030ee20, 0x02ce: 0x402e7a20, 0x02cf: 0x40310820, - 0x02d0: 0x40314820, 0x02d1: 0x40315020, 0x02d2: 0x40316420, 0x02d3: 0x40318020, - 0x02d4: 0x4031cc20, 0x02d5: 0x4031e820, 0x02d6: 0x40320a20, 0x02d7: 0x40323220, - 0x02d8: 0x40323a20, 0x02d9: 0x402c1220, 0x02da: 0x402cf820, 0x02db: 0x402d4c20, - 0x02dc: 0x402d7020, 0x02dd: 0x402de620, 0x02de: 0x402e1a20, 0x02df: 0x402e2a20, - 0x02e0: 0x402f6220, 0x02e1: 0x4031fa20, 0x02e2: 0x40320220, 0x02e3: 0xe0000aca, - 0x02e4: 0xe0000adc, 0x02e5: 0xe0000ad9, 0x02e6: 0xe0000fcc, 0x02e7: 0xe0000fcf, - 0x02e8: 0xe0000fba, 0x02e9: 0xe0000ba1, 0x02ea: 0xe0000d11, 0x02eb: 0xe0000d18, - 0x02ec: 0x40324220, 0x02ed: 0x40324a20, 0x02ee: 0x40309020, 0x02ef: 0x40309820, - 0x02f0: 0x002d6894, 0x02f1: 0x002d8094, 0x02f2: 0x002dcc94, 0x02f3: 0x002f7a94, - 0x02f4: 0x002f9894, 0x02f5: 0x002fac94, 0x02f6: 0x002fd894, 0x02f7: 0x0030e294, - 0x02f8: 0x00310094, 0x02f9: 0x40064020, 0x02fa: 0x40064420, 0x02fb: 0x402d9620, - 0x02fc: 0x4031de20, 0x02fd: 0x402d9820, 0x02fe: 0x4031e220, 0x02ff: 0x4031f020, - // Block 0xc, offset 0x300 - 0x0300: 0x4031dc20, 0x0301: 0x4031f220, 0x0302: 0x40064620, 0x0303: 0x40064820, - 0x0304: 0x40064a20, 0x0305: 0x40064c20, 0x0306: 0x40064e20, 0x0307: 0x40065020, - 0x0308: 0x40065220, 0x0309: 0x40065420, 0x030a: 0x40065620, 0x030b: 0x40065820, - 0x030c: 0x40065a20, 0x030d: 0x40065c20, 0x030e: 0x40065e20, 0x030f: 0x40066020, - 0x0310: 0x4027b220, 0x0311: 0x4027b420, 0x0312: 0x40066220, 0x0313: 0x40066420, - 0x0314: 0x40066620, 0x0315: 0x40066820, 0x0316: 0x40066a20, 0x0317: 0x40066c20, - 0x0318: 0x40062820, 0x0319: 0x40062a20, 0x031a: 0x40062e20, 0x031b: 0x40063420, - 0x031c: 0x40062220, 0x031d: 0x40063020, 0x031e: 0x40066e20, 0x031f: 0x40067020, - 0x0320: 0x002d5894, 0x0321: 0x002e2294, 0x0322: 0x002fe694, 0x0323: 0x0030f694, - 0x0324: 0x0031e894, 0x0325: 0x40067220, 0x0326: 0x40067420, 0x0327: 0x40067620, - 0x0328: 0x40067820, 0x0329: 0x40067a20, 0x032a: 0x40067c20, 0x032b: 0x40067e20, - 0x032c: 0x40068020, 0x032d: 0x40068220, 0x032e: 0x4031e020, 0x032f: 0x40068420, - 0x0330: 0x40068620, 0x0331: 0x40068820, 0x0332: 0x40068a20, 0x0333: 0x40068c20, - 0x0334: 0x40068e20, 0x0335: 0x40069020, 0x0336: 0x40069220, 0x0337: 0x40069420, - 0x0338: 0x40069620, 0x0339: 0x40069820, 0x033a: 0x40069a20, 0x033b: 0x40069c20, - 0x033c: 0x40069e20, 0x033d: 0x4006a020, 0x033e: 0x4006a220, 0x033f: 0x4006a420, - // Block 0xd, offset 0x340 - 0x0340: 0xae603502, 0x0341: 0xae603202, 0x0342: 0xae603c02, 0x0343: 0xae604e02, - 0x0344: 0xae605b02, 0x0345: 0xae606302, 0x0346: 0xae603702, 0x0347: 0xae605202, - 0x0348: 0xae604702, 0x0349: 0xae606402, 0x034a: 0xae604302, 0x034b: 0xae604d02, - 0x034c: 0xae604102, 0x034d: 0xae605f02, 0x034e: 0xae605f02, 0x034f: 0xae606502, - 0x0350: 0xae606602, 0x0351: 0xae606702, 0x0352: 0xae605f02, 0x0353: 0xae602202, - 0x0354: 0xae602a02, 0x0355: 0xae805f02, 0x0356: 0xadc06002, 0x0357: 0xadc06002, - 0x0358: 0xadc06002, 0x0359: 0xadc06002, 0x035a: 0xae805f02, 0x035b: 0xad806802, - 0x035c: 0xadc06002, 0x035d: 0xadc06002, 0x035e: 0xadc06002, 0x035f: 0xadc06002, - 0x0360: 0xadc06002, 0x0361: 0xaca06e02, 0x0362: 0xaca06f02, 0x0363: 0xadc07002, - 0x0364: 0xadc07502, 0x0365: 0xadc07602, 0x0366: 0xadc07702, 0x0367: 0xaca05602, - 0x0368: 0xaca05902, 0x0369: 0xadc06002, 0x036a: 0xadc06002, 0x036b: 0xadc06002, - 0x036c: 0xadc06002, 0x036d: 0xadc07802, 0x036e: 0xadc07902, 0x036f: 0xadc06002, - 0x0370: 0xadc07a02, 0x0371: 0xadc07b02, 0x0372: 0xadc02102, 0x0373: 0xadc06002, - 0x0374: 0xa0107c02, 0x0375: 0xa0107d02, 0x0376: 0xa0106102, 0x0377: 0xa0106102, - 0x0378: 0xa0105402, 0x0379: 0xadc07e02, 0x037a: 0xadc06002, 0x037b: 0xadc06002, - 0x037c: 0xadc06002, 0x037d: 0xae605f02, 0x037e: 0xae605f02, 0x037f: 0xae605f02, - // Block 0xe, offset 0x380 - 0x0380: 0xae603502, 0x0381: 0xae603202, 0x0382: 0xae604502, 0x0383: 0xae602202, - 0x0384: 0xe0000000, 0x0385: 0xaf007f02, 0x0386: 0xae605f02, 0x0387: 0xadc06002, - 0x0388: 0xadc06002, 0x0389: 0xadc06002, 0x038a: 0xae605f02, 0x038b: 0xae605f02, - 0x038c: 0xae605f02, 0x038d: 0xadc06002, 0x038e: 0xadc06002, 0x038f: 0xa0000000, - 0x0390: 0xae605f02, 0x0391: 0xae605f02, 0x0392: 0xae605f02, 0x0393: 0xadc06002, - 0x0394: 0xadc06002, 0x0395: 0xadc06002, 0x0396: 0xadc06002, 0x0397: 0xae605f02, - 0x0398: 0xae808002, 0x0399: 0xadc06002, 0x039a: 0xadc06002, 0x039b: 0xae605f02, - 0x039c: 0xae906002, 0x039d: 0xaea05f02, 0x039e: 0xaea05f02, 0x039f: 0xae906002, - 0x03a0: 0xaea08102, 0x03a1: 0xaea08202, 0x03a2: 0xae906002, 0x03a3: 0x84e615ef, - 0x03a4: 0x84e6164c, 0x03a5: 0x84e616cd, 0x03a6: 0x84e61771, 0x03a7: 0x84e61836, - 0x03a8: 0x84e6161d, 0x03a9: 0x84e61631, 0x03aa: 0x84e616b4, 0x03ab: 0x84e61741, - 0x03ac: 0x84e617bd, 0x03ad: 0x84e61816, 0x03ae: 0x84e6185f, 0x03af: 0x84e6187b, - 0x03b0: 0x00326688, 0x03b1: 0x40326620, 0x03b2: 0x0032a688, 0x03b3: 0x4032a620, - 0x03b4: 0x40064020, 0x03b5: 0x40064220, 0x03b6: 0x00326088, 0x03b7: 0x40326020, - 0x03ba: 0x00326c84, 0x03bb: 0x40329220, - 0x03bc: 0x40329020, 0x03bd: 0x40329420, 0x03be: 0x40026220, - // Block 0xf, offset 0x3c0 - 0x03c4: 0x40062020, 0x03c5: 0xe00000ab, 0x03c6: 0xe00011f0, 0x03c7: 0x40030620, - 0x03c8: 0xe0001249, 0x03c9: 0xe00012dd, 0x03ca: 0xe000133a, - 0x03cc: 0xe000139b, 0x03ce: 0xe00013dd, 0x03cf: 0xe0001492, - 0x03d0: 0xe0001352, 0x03d1: 0x00325288, 0x03d2: 0x00325488, 0x03d3: 0x00325688, - 0x03d4: 0x00325a88, 0x03d5: 0x00325c88, 0x03d6: 0x00326488, 0x03d7: 0x00326888, - 0x03d8: 0x00326a88, 0x03d9: 0x00326c88, 0x03da: 0x00327088, 0x03db: 0x00327288, - 0x03dc: 0x00327688, 0x03dd: 0x00327888, 0x03de: 0x00327a88, 0x03df: 0x00327c88, - 0x03e0: 0x00327e88, 0x03e1: 0x00328888, 0x03e3: 0x00328e88, - 0x03e4: 0x00329688, 0x03e5: 0x00329888, 0x03e6: 0x00329a88, 0x03e7: 0x00329c88, - 0x03e8: 0x00329e88, 0x03e9: 0x0032a288, 0x03ea: 0xe000134f, 0x03eb: 0xe00013f2, - 0x03ec: 0xe00011ed, 0x03ed: 0xe0001246, 0x03ee: 0xe00012da, 0x03ef: 0xe0001337, - 0x03f0: 0xe00013f5, 0x03f1: 0x40325220, 0x03f2: 0x40325420, 0x03f3: 0x40325620, - 0x03f4: 0x40325a20, 0x03f5: 0x40325c20, 0x03f6: 0x40326420, 0x03f7: 0x40326820, - 0x03f8: 0x40326a20, 0x03f9: 0x40326c20, 0x03fa: 0x40327020, 0x03fb: 0x40327220, - 0x03fc: 0x40327620, 0x03fd: 0x40327820, 0x03fe: 0x40327a20, 0x03ff: 0x40327c20, - // Block 0x10, offset 0x400 - 0x0400: 0x40327e20, 0x0401: 0x40328820, 0x0402: 0x00328e99, 0x0403: 0x40328e20, - 0x0404: 0x40329620, 0x0405: 0x40329820, 0x0406: 0x40329a20, 0x0407: 0x40329c20, - 0x0408: 0x40329e20, 0x0409: 0x4032a220, 0x040a: 0xe000134c, 0x040b: 0xe00013ef, - 0x040c: 0xe0001398, 0x040d: 0xe00013da, 0x040e: 0xe000148f, 0x040f: 0xe0001368, - 0x0410: 0x00325484, 0x0411: 0x00326a84, 0x0412: 0x0032988a, 0x0413: 0xf000020a, - 0x0414: 0xf000020a, 0x0415: 0x00329a84, 0x0416: 0x00327e84, 0x0417: 0xe0001364, - 0x0418: 0x00328688, 0x0419: 0x40328620, 0x041a: 0x00326288, 0x041b: 0x40326220, - 0x041c: 0x00325e88, 0x041d: 0x40325e20, 0x041e: 0x00328488, 0x041f: 0x40328420, - 0x0420: 0x0032a488, 0x0421: 0x4032a420, 0x0422: 0x0032e888, 0x0423: 0x4032e820, - 0x0424: 0x0032f288, 0x0425: 0x4032f220, 0x0426: 0x0032f488, 0x0427: 0x4032f420, - 0x0428: 0x0032fa88, 0x0429: 0x4032fa20, 0x042a: 0x00330888, 0x042b: 0x40330820, - 0x042c: 0x00330e88, 0x042d: 0x40330e20, 0x042e: 0x00331688, 0x042f: 0x40331620, - 0x0430: 0x00327084, 0x0431: 0x00328884, 0x0432: 0x00328e84, 0x0433: 0x40326e20, - 0x0434: 0x00326a8a, 0x0435: 0x00325c84, 0x0436: 0x40092e20, 0x0437: 0x0032a888, - 0x0438: 0x4032a820, 0x0439: 0x00328e8a, 0x043a: 0x00328288, 0x043b: 0x40328220, - 0x043c: 0x40328c20, 0x043d: 0x00329288, 0x043e: 0x00329088, 0x043f: 0x00329488, - // Block 0x11, offset 0x440 - 0x0440: 0xe00014bd, 0x0441: 0xe00014c3, 0x0442: 0x00339688, 0x0443: 0x0033a288, - 0x0444: 0x0033c288, 0x0445: 0x0033fc88, 0x0446: 0xc02a0071, 0x0447: 0x00343688, - 0x0448: 0x00344688, 0x0449: 0x00349a88, 0x044a: 0x0034e488, 0x044b: 0x00356288, - 0x044c: 0x00356a88, 0x044d: 0xe00014cf, 0x044e: 0x00357a88, 0x044f: 0x00365488, - 0x0450: 0xc0090041, 0x0451: 0x00335288, 0x0452: 0x00335a88, 0x0453: 0xc0130092, - 0x0454: 0x00338a88, 0x0455: 0xc01800d1, 0x0456: 0xc01c0071, 0x0457: 0xc0200071, - 0x0458: 0xc0250041, 0x0459: 0x00343e88, 0x045a: 0xc0370092, 0x045b: 0x00348488, - 0x045c: 0x0034a888, 0x045d: 0x0034ba88, 0x045e: 0xc02e0071, 0x045f: 0x00350e88, - 0x0460: 0x00352888, 0x0461: 0x00353a88, 0x0462: 0x00354c88, 0x0463: 0xc03e00f1, - 0x0464: 0x0035ac88, 0x0465: 0x0035b488, 0x0466: 0x00360288, 0x0467: 0xc0440071, - 0x0468: 0x00365c88, 0x0469: 0x00366688, 0x046a: 0x00367488, 0x046b: 0xc0480071, - 0x046c: 0x00368e88, 0x046d: 0xc04c0071, 0x046e: 0x0036b888, 0x046f: 0x0036c488, - 0x0470: 0xc0060041, 0x0471: 0x40335220, 0x0472: 0x40335a20, 0x0473: 0xc0100092, - 0x0474: 0x40338a20, 0x0475: 0xc01600d1, 0x0476: 0xc01a0071, 0x0477: 0xc01e0071, - 0x0478: 0xc0220041, 0x0479: 0x40343e20, 0x047a: 0xc0340092, 0x047b: 0x40348420, - 0x047c: 0x4034a820, 0x047d: 0x4034ba20, 0x047e: 0xc02c0071, 0x047f: 0x40350e20, - // Block 0x12, offset 0x480 - 0x0480: 0x40352820, 0x0481: 0x40353a20, 0x0482: 0x40354c20, 0x0483: 0xc03a00f1, - 0x0484: 0x4035ac20, 0x0485: 0x4035b420, 0x0486: 0x40360220, 0x0487: 0xc0420071, - 0x0488: 0x40365c20, 0x0489: 0x40366620, 0x048a: 0x40367420, 0x048b: 0xc0460071, - 0x048c: 0x40368e20, 0x048d: 0xc04a0071, 0x048e: 0x4036b820, 0x048f: 0x4036c420, - 0x0490: 0xe00014ba, 0x0491: 0xe00014c0, 0x0492: 0x40339620, 0x0493: 0x4033a220, - 0x0494: 0x4033c220, 0x0495: 0x4033fc20, 0x0496: 0xc0280071, 0x0497: 0x40343620, - 0x0498: 0x40344620, 0x0499: 0x40349a20, 0x049a: 0x4034e420, 0x049b: 0x40356220, - 0x049c: 0x40356a20, 0x049d: 0xe00014cc, 0x049e: 0x40357a20, 0x049f: 0x40365420, - 0x04a0: 0x0035e088, 0x04a1: 0x4035e020, 0x04a2: 0x00369e88, 0x04a3: 0x40369e20, - 0x04a4: 0x0036ce88, 0x04a5: 0x4036ce20, 0x04a6: 0x0036d688, 0x04a7: 0x4036d620, - 0x04a8: 0x0036ea88, 0x04a9: 0x4036ea20, 0x04aa: 0x0036e088, 0x04ab: 0x4036e020, - 0x04ac: 0x0036f488, 0x04ad: 0x4036f420, 0x04ae: 0x0036fc88, 0x04af: 0x4036fc20, - 0x04b0: 0x00370488, 0x04b1: 0x40370420, 0x04b2: 0x00370c88, 0x04b3: 0x40370c20, - 0x04b4: 0xc0500131, 0x04b5: 0xc04e0131, 0x04b6: 0x00371c88, 0x04b7: 0x40371c20, - 0x04b8: 0x0035a488, 0x04b9: 0x4035a420, 0x04ba: 0x0035fa88, 0x04bb: 0x4035fa20, - 0x04bc: 0x0035f288, 0x04bd: 0x4035f220, 0x04be: 0x0035e888, 0x04bf: 0x4035e820, - // Block 0x13, offset 0x4c0 - 0x04c0: 0x00352088, 0x04c1: 0x40352020, 0x04c2: 0x40070620, 0x04c3: 0xae608302, - 0x04c4: 0xae605f02, 0x04c5: 0xae602a02, 0x04c6: 0xae602202, 0x04c7: 0xae605f02, - 0x04c8: 0xa0000000, 0x04c9: 0xa0000000, 0x04ca: 0x00341c88, 0x04cb: 0x40341c20, - 0x04cc: 0x00369688, 0x04cd: 0x40369620, 0x04ce: 0x00353088, 0x04cf: 0x40353020, - 0x04d0: 0xe00014b7, 0x04d1: 0xe00014b4, 0x04d2: 0x00336a88, 0x04d3: 0x40336a20, - 0x04d4: 0x00337a88, 0x04d5: 0x40337a20, 0x04d6: 0x0033dc88, 0x04d7: 0x4033dc20, - 0x04d8: 0x0033aa88, 0x04d9: 0x4033aa20, 0x04da: 0x00345888, 0x04db: 0x40345820, - 0x04dc: 0x00347888, 0x04dd: 0x40347820, 0x04de: 0x00347088, 0x04df: 0x40347020, - 0x04e0: 0x00346888, 0x04e1: 0x40346820, 0x04e2: 0x0034ca88, 0x04e3: 0x4034ca20, - 0x04e4: 0x0034dc88, 0x04e5: 0x4034dc20, 0x04e6: 0x00351888, 0x04e7: 0x40351820, - 0x04e8: 0x00372688, 0x04e9: 0x40372620, 0x04ea: 0x00354488, 0x04eb: 0x40354420, - 0x04ec: 0x00355888, 0x04ed: 0x40355820, 0x04ee: 0x00359288, 0x04ef: 0x40359220, - 0x04f0: 0x00359a88, 0x04f1: 0x40359a20, 0x04f2: 0x0035cc88, 0x04f3: 0x4035cc20, - 0x04f4: 0x00360e88, 0x04f5: 0x40360e20, 0x04f6: 0x00362a88, 0x04f7: 0x40362a20, - 0x04f8: 0x00363a88, 0x04f9: 0x40363a20, 0x04fa: 0x0035d488, 0x04fb: 0x4035d420, - 0x04fc: 0x00364488, 0x04fd: 0x40364420, 0x04fe: 0x00364c88, 0x04ff: 0x40364c20, - // Block 0x14, offset 0x500 - 0x0500: 0x00373088, 0x0501: 0xe00014c9, 0x0502: 0xe00014c6, 0x0503: 0x00346088, - 0x0504: 0x40346020, 0x0505: 0x00348e88, 0x0506: 0x40348e20, 0x0507: 0x0034d288, - 0x0508: 0x4034d220, 0x0509: 0x0034c288, 0x050a: 0x4034c220, 0x050b: 0x00363288, - 0x050c: 0x40363220, 0x050d: 0x0034b088, 0x050e: 0x4034b020, 0x050f: 0x40373020, - 0x0510: 0x00332a88, 0x0511: 0x40332a20, 0x0512: 0x00333288, 0x0513: 0x40333220, - 0x0514: 0x00334a88, 0x0515: 0x40334a20, 0x0516: 0x0033ba88, 0x0517: 0x4033ba20, - 0x0518: 0xc00e0071, 0x0519: 0xc00c0071, 0x051a: 0x00334288, 0x051b: 0x40334220, - 0x051c: 0x0033d488, 0x051d: 0x4033d420, 0x051e: 0x0033f288, 0x051f: 0x4033f220, - 0x0520: 0x00340688, 0x0521: 0x40340620, 0x0522: 0xe00014d5, 0x0523: 0xe00014d2, - 0x0524: 0x00342488, 0x0525: 0x40342420, 0x0526: 0x0034f688, 0x0527: 0x4034f620, - 0x0528: 0xc0320071, 0x0529: 0xc0300071, 0x052a: 0x00350688, 0x052b: 0x40350620, - 0x052c: 0x0036b088, 0x052d: 0x4036b020, 0x052e: 0xe00014de, 0x052f: 0xe00014db, - 0x0530: 0x00358288, 0x0531: 0x40358220, 0x0532: 0x00358a88, 0x0533: 0x40358a20, - 0x0534: 0x00362288, 0x0535: 0x40362220, 0x0536: 0x00338288, 0x0537: 0x40338220, - 0x0538: 0x00368688, 0x0539: 0x40368620, 0x053a: 0x00337288, 0x053b: 0x40337220, - 0x053c: 0x0035bc88, 0x053d: 0x4035bc20, 0x053e: 0x0035c488, 0x053f: 0x4035c420, - // Block 0x15, offset 0x540 - 0x0540: 0x00339288, 0x0541: 0x40339220, 0x0542: 0x0033a088, 0x0543: 0x4033a020, - 0x0544: 0x0033ee88, 0x0545: 0x4033ee20, 0x0546: 0x00341088, 0x0547: 0x40341020, - 0x0548: 0x0034a488, 0x0549: 0x4034a420, 0x054a: 0x0034ec88, 0x054b: 0x4034ec20, - 0x054c: 0x00354288, 0x054d: 0x40354220, 0x054e: 0x00355688, 0x054f: 0x40355620, - 0x0550: 0x0033f088, 0x0551: 0x4033f020, 0x0552: 0x00349688, 0x0553: 0x40349620, - 0x0554: 0x0034a688, 0x0555: 0x4034a620, 0x0556: 0x00353888, 0x0557: 0x40353820, - 0x0558: 0x0036cc88, 0x0559: 0x4036cc20, 0x055a: 0x00348288, 0x055b: 0x40348220, - 0x055c: 0x00372e88, 0x055d: 0x40372e20, 0x055e: 0x00348088, 0x055f: 0x40348020, - 0x0560: 0x00349888, 0x0561: 0x40349820, 0x0562: 0x0034da88, 0x0563: 0x4034da20, - 0x0564: 0x00351688, 0x0565: 0x40351620, 0x0566: 0x0035dc88, 0x0567: 0x4035dc20, - 0x0571: 0x00384288, 0x0572: 0x00384488, 0x0573: 0x00384688, - 0x0574: 0x00384888, 0x0575: 0x00384a88, 0x0576: 0x00384c88, 0x0577: 0x00384e88, - 0x0578: 0x00385088, 0x0579: 0x00385288, 0x057a: 0x00385488, 0x057b: 0x00385688, - 0x057c: 0x00385888, 0x057d: 0x00385a88, 0x057e: 0x00385c88, 0x057f: 0x00385e88, - // Block 0x16, offset 0x580 - 0x0580: 0x00386088, 0x0581: 0x00386288, 0x0582: 0x00386488, 0x0583: 0x00386688, - 0x0584: 0x00386888, 0x0585: 0x00386a88, 0x0586: 0x00386c88, 0x0587: 0x00386e88, - 0x0588: 0x00387088, 0x0589: 0x00387288, 0x058a: 0x00387488, 0x058b: 0x00387688, - 0x058c: 0x00387888, 0x058d: 0x00387a88, 0x058e: 0x00387c88, 0x058f: 0x00387e88, - 0x0590: 0x00388088, 0x0591: 0x00388288, 0x0592: 0x00388488, 0x0593: 0x00388688, - 0x0594: 0x00388888, 0x0595: 0x00388a88, 0x0596: 0x00388c88, - 0x0599: 0x40388e20, 0x059a: 0x40054e20, 0x059b: 0x40055020, - 0x059c: 0x4002be20, 0x059d: 0x40024620, 0x059e: 0x4002ca20, 0x059f: 0x40055220, - 0x05a1: 0x40384220, 0x05a2: 0x40384420, 0x05a3: 0x40384620, - 0x05a4: 0x40384820, 0x05a5: 0x40384a20, 0x05a6: 0x40384c20, 0x05a7: 0x40384e20, - 0x05a8: 0x40385020, 0x05a9: 0x40385220, 0x05aa: 0x40385420, 0x05ab: 0x40385620, - 0x05ac: 0x40385820, 0x05ad: 0x40385a20, 0x05ae: 0x40385c20, 0x05af: 0x40385e20, - 0x05b0: 0x40386020, 0x05b1: 0x40386220, 0x05b2: 0x40386420, 0x05b3: 0x40386620, - 0x05b4: 0x40386820, 0x05b5: 0x40386a20, 0x05b6: 0x40386c20, 0x05b7: 0x40386e20, - 0x05b8: 0x40387020, 0x05b9: 0x40387220, 0x05ba: 0x40387420, 0x05bb: 0x40387620, - 0x05bc: 0x40387820, 0x05bd: 0x40387a20, 0x05be: 0x40387c20, 0x05bf: 0x40387e20, - // Block 0x17, offset 0x5c0 - 0x05c0: 0x40388020, 0x05c1: 0x40388220, 0x05c2: 0x40388420, 0x05c3: 0x40388620, - 0x05c4: 0x40388820, 0x05c5: 0x40388a20, 0x05c6: 0x40388c20, 0x05c7: 0xf0000404, - 0x05c9: 0x40026e20, 0x05ca: 0x40021c20, - 0x05cf: 0x4027e420, - 0x05d1: 0xadc00000, 0x05d2: 0xae600000, 0x05d3: 0xae600000, - 0x05d4: 0xae600000, 0x05d5: 0xae600000, 0x05d6: 0xadc00000, 0x05d7: 0xae600000, - 0x05d8: 0xae600000, 0x05d9: 0xae600000, 0x05da: 0xade00000, 0x05db: 0xadc00000, - 0x05dc: 0xae600000, 0x05dd: 0xae600000, 0x05de: 0xae600000, 0x05df: 0xae600000, - 0x05e0: 0xae600000, 0x05e1: 0xae600000, 0x05e2: 0xadc00000, 0x05e3: 0xadc00000, - 0x05e4: 0xadc00000, 0x05e5: 0xadc00000, 0x05e6: 0xadc00000, 0x05e7: 0xadc00000, - 0x05e8: 0xae600000, 0x05e9: 0xae600000, 0x05ea: 0xadc00000, 0x05eb: 0xae600000, - 0x05ec: 0xae600000, 0x05ed: 0xade00000, 0x05ee: 0xae400000, 0x05ef: 0xae600000, - 0x05f0: 0xa0a08502, 0x05f1: 0xa0b08602, 0x05f2: 0xa0c08702, 0x05f3: 0xa0d08802, - 0x05f4: 0xa0e08902, 0x05f5: 0xa0f08a02, 0x05f6: 0xa1008b02, 0x05f7: 0xa1108c02, - 0x05f8: 0xa1208d02, 0x05f9: 0xa1308e02, 0x05fa: 0xa1308e02, 0x05fb: 0xa1408f02, - 0x05fc: 0xa1509202, 0x05fd: 0xa1600000, 0x05fe: 0x40055420, 0x05ff: 0xa1709502, - // Block 0x18, offset 0x600 - 0x0600: 0x40055620, 0x0601: 0xa1809102, 0x0602: 0xa1909002, 0x0603: 0x40055820, - 0x0604: 0xae600000, 0x0605: 0xadc00000, 0x0606: 0x40055a20, 0x0607: 0xa1208d02, - 0x0610: 0x40389020, 0x0611: 0x40389220, 0x0612: 0x40389420, 0x0613: 0x40389620, - 0x0614: 0x40389820, 0x0615: 0x40389a20, 0x0616: 0x40389c20, 0x0617: 0x40389e20, - 0x0618: 0x4038a020, 0x0619: 0x4038a220, 0x061a: 0x0038a499, 0x061b: 0x4038a420, - 0x061c: 0x4038a620, 0x061d: 0x0038a899, 0x061e: 0x4038a820, 0x061f: 0x0038aa99, - 0x0620: 0x4038aa20, 0x0621: 0x4038ac20, 0x0622: 0x4038ae20, 0x0623: 0x0038b099, - 0x0624: 0x4038b020, 0x0625: 0x0038b299, 0x0626: 0x4038b220, 0x0627: 0x4038b420, - 0x0628: 0x4038b620, 0x0629: 0x4038b820, 0x062a: 0x4038ba20, - 0x0630: 0xe00014ff, 0x0631: 0xe0001502, 0x0632: 0xe0001511, 0x0633: 0x40055c20, - 0x0634: 0x40055e20, - // Block 0x19, offset 0x640 - 0x0640: 0xa0000000, 0x0641: 0xa0000000, 0x0642: 0xa0000000, 0x0643: 0xa0000000, - 0x0644: 0xa0000000, 0x0646: 0x40096620, 0x0647: 0x40096a20, - 0x0648: 0x40070820, 0x0649: 0x4004f220, 0x064a: 0x4004f620, 0x064b: 0x4027e620, - 0x064c: 0x40024820, 0x064d: 0x40024a20, 0x064e: 0x40070e20, 0x064f: 0x40071020, - 0x0650: 0xae600000, 0x0651: 0xae600000, 0x0652: 0xae600000, 0x0653: 0xae600000, - 0x0654: 0xae600000, 0x0655: 0xae600000, 0x0656: 0xae600000, 0x0657: 0xae600000, - 0x0658: 0xa1e00000, 0x0659: 0xa1f00000, 0x065a: 0xa2000000, 0x065b: 0x40026420, - 0x065e: 0x40027020, 0x065f: 0x4002cc20, - 0x0660: 0x403aa220, 0x0661: 0x40391c20, 0x0662: 0x40391e20, 0x0663: 0x40392020, - 0x0664: 0x40392620, 0x0665: 0x40392820, 0x0666: 0x40393020, 0x0667: 0xc0520151, - 0x0668: 0x40393c20, 0x0669: 0x40395420, 0x066a: 0x40395620, 0x066b: 0x40395820, - 0x066c: 0x40396420, 0x066d: 0x40397220, 0x066e: 0x40397420, 0x066f: 0x40398820, - 0x0670: 0x40398a20, 0x0671: 0x4039a420, 0x0672: 0x4039a620, 0x0673: 0x4039c620, - 0x0674: 0x4039c820, 0x0675: 0x4039dc20, 0x0676: 0x4039de20, 0x0677: 0x4039e620, - 0x0678: 0x4039e820, 0x0679: 0x4039ee20, 0x067a: 0x4039f020, 0x067b: 0x403a3820, - 0x067c: 0x403a3a20, 0x067d: 0x403a9c20, 0x067e: 0x403a9e20, 0x067f: 0x403aa020, - // Block 0x1a, offset 0x680 - 0x0680: 0xa0000000, 0x0681: 0x4039fc20, 0x0682: 0x403a1220, 0x0683: 0x403a1a20, - 0x0684: 0x403a4020, 0x0685: 0x403a4e20, 0x0686: 0x403a5620, 0x0687: 0x403a6820, - 0x0688: 0xc0560171, 0x0689: 0x403a8e20, 0x068a: 0xc0580171, 0x068b: 0xa1b0a202, - 0x068c: 0xa1c0a502, 0x068d: 0xa1d0a902, 0x068e: 0xa1e0ad02, 0x068f: 0xa1f0b202, - 0x0690: 0xa200b602, 0x0691: 0xa210ba02, 0x0692: 0xa220bc02, 0x0693: 0xae60bd02, - 0x0694: 0xae60be02, 0x0695: 0xadc0bf02, 0x0696: 0xadc0c102, 0x0697: 0xae60c202, - 0x0698: 0xae60c302, 0x0699: 0xae60c402, 0x069a: 0xae60c502, 0x069b: 0xae60c602, - 0x069c: 0xadc0c702, 0x069d: 0xae60c802, 0x069e: 0xae60c902, 0x069f: 0xadc0c002, - 0x06a0: 0xe000015e, 0x06a1: 0xe00001e6, 0x06a2: 0xe0000301, 0x06a3: 0xe00003db, - 0x06a4: 0xe00004b6, 0x06a5: 0xe0000580, 0x06a6: 0xe000064b, 0x06a7: 0xe00006f3, - 0x06a8: 0xe000079f, 0x06a9: 0xe0000844, 0x06aa: 0x4004ee20, 0x06ab: 0x40024c20, - 0x06ac: 0x40024e20, 0x06ad: 0x4004de20, 0x06ae: 0x40393a20, 0x06af: 0x403a1020, - 0x06b0: 0xa230d102, 0x06b1: 0x40392420, 0x06b2: 0x40392220, 0x06b3: 0x40392a20, - 0x06b4: 0x00391c84, 0x06b5: 0xf0000404, 0x06b6: 0xf0000404, 0x06b7: 0xf0000404, - 0x06b8: 0xf0000404, 0x06b9: 0x40395a20, 0x06ba: 0x40395c20, 0x06bb: 0x40393e20, - 0x06bc: 0x40395e20, 0x06bd: 0x40396020, 0x06be: 0x40394020, 0x06bf: 0x40396220, - // Block 0x1b, offset 0x6c0 - 0x06c0: 0x40394220, 0x06c1: 0x40397620, 0x06c2: 0x40397820, 0x06c3: 0x40396620, - 0x06c4: 0x40396820, 0x06c5: 0x40397a20, 0x06c6: 0x40396a20, 0x06c7: 0x40396e20, - 0x06c8: 0x40398c20, 0x06c9: 0x40398e20, 0x06ca: 0x40399020, 0x06cb: 0x40399220, - 0x06cc: 0x40399420, 0x06cd: 0x40399620, 0x06ce: 0x40399820, 0x06cf: 0x40399a20, - 0x06d0: 0x40399c20, 0x06d1: 0x4039a820, 0x06d2: 0x4039aa20, 0x06d3: 0x4039ac20, - 0x06d4: 0x4039ae20, 0x06d5: 0x4039b020, 0x06d6: 0x4039b220, 0x06d7: 0x4039b420, - 0x06d8: 0x4039b620, 0x06d9: 0x4039b820, 0x06da: 0x4039ca20, 0x06db: 0x4039cc20, - 0x06dc: 0x4039ce20, 0x06dd: 0x4039e020, 0x06de: 0x4039e220, 0x06df: 0x4039ea20, - 0x06e0: 0x4039f220, 0x06e1: 0x4039fe20, 0x06e2: 0x403a0020, 0x06e3: 0x403a0220, - 0x06e4: 0x403a0420, 0x06e5: 0x403a0820, 0x06e6: 0x403a0a20, 0x06e7: 0x403a1420, - 0x06e8: 0x403a1620, 0x06e9: 0x403a1c20, 0x06ea: 0x403a1e20, 0x06eb: 0x403a2020, - 0x06ec: 0x403a2220, 0x06ed: 0x403a2620, 0x06ee: 0x403a2820, 0x06ef: 0x403a2a20, - 0x06f0: 0x403a2c20, 0x06f1: 0x403a2e20, 0x06f2: 0x403a3020, 0x06f3: 0x403a3220, - 0x06f4: 0x403a3420, 0x06f5: 0x403a4220, 0x06f6: 0x403a4420, 0x06f7: 0x403a4620, - 0x06f8: 0x403a4820, 0x06f9: 0x403a6020, 0x06fa: 0x403a5820, 0x06fb: 0x403a5a20, - 0x06fc: 0x403a5c20, 0x06fd: 0x403a5e20, 0x06fe: 0x403a6a20, 0x06ff: 0x40396c20, - // Block 0x1c, offset 0x700 - 0x0700: 0xe00017e4, 0x0701: 0x403a6c20, 0x0702: 0xe00017e1, 0x0703: 0x403a6e20, - 0x0704: 0x403a7620, 0x0705: 0x403a7820, 0x0706: 0x403a7a20, 0x0707: 0x403a7c20, - 0x0708: 0x403a7e20, 0x0709: 0x403a8020, 0x070a: 0x403a8220, 0x070b: 0x403a8420, - 0x070c: 0x403a9220, 0x070d: 0x403a9420, 0x070e: 0x403a9620, 0x070f: 0x403a8620, - 0x0710: 0x403a9820, 0x0711: 0x403a9a20, 0x0712: 0x403aaa20, 0x0713: 0xe0001800, - 0x0714: 0x4002e820, 0x0715: 0x403a7220, 0x0716: 0xae600000, 0x0717: 0xae600000, - 0x0718: 0xae600000, 0x0719: 0xae600000, 0x071a: 0xae600000, 0x071b: 0xae600000, - 0x071c: 0xae600000, 0x071d: 0xa0000000, 0x071e: 0x40071220, 0x071f: 0xae600000, - 0x0720: 0xae600000, 0x0721: 0xae600000, 0x0722: 0xae600000, 0x0723: 0xadc00000, - 0x0724: 0xae600000, 0x0725: 0x003a7484, 0x0726: 0x003a9084, 0x0727: 0xae600000, - 0x0728: 0xae600000, 0x0729: 0x40071420, 0x072a: 0xadc00000, 0x072b: 0xae600000, - 0x072c: 0xae600000, 0x072d: 0xadc00000, 0x072e: 0x40399e20, 0x072f: 0x4039ba20, - 0x0730: 0xe0000161, 0x0731: 0xe00001e9, 0x0732: 0xe0000304, 0x0733: 0xe00003de, - 0x0734: 0xe00004b9, 0x0735: 0xe0000583, 0x0736: 0xe000064e, 0x0737: 0xe00006f6, - 0x0738: 0xe00007a2, 0x0739: 0xe0000847, 0x073a: 0x4039d020, 0x073b: 0x4039e420, - 0x073c: 0x4039f420, 0x073d: 0xe0001553, 0x073e: 0xe0001779, 0x073f: 0x403a7020, - // Block 0x1d, offset 0x740 - 0x0740: 0x40035c20, 0x0741: 0x4002ea20, 0x0742: 0x4002ec20, 0x0743: 0x40027220, - 0x0744: 0x40027420, 0x0745: 0x40027620, 0x0746: 0x40027820, 0x0747: 0x40027a20, - 0x0748: 0x40027c20, 0x0749: 0x4002ce20, 0x074a: 0x40056020, 0x074b: 0x40056220, - 0x074c: 0x40056420, 0x074d: 0x40056620, 0x074f: 0xa0000000, - 0x0750: 0x403ab020, 0x0751: 0xa240d202, 0x0752: 0x403ab220, 0x0753: 0x403ab420, - 0x0754: 0xe0001806, 0x0755: 0x403ab820, 0x0756: 0x403ab620, 0x0757: 0x403aba20, - 0x0758: 0x403abc20, 0x0759: 0x403abe20, 0x075a: 0x403ac220, 0x075b: 0x403ac420, - 0x075c: 0xe000180f, 0x075d: 0x403ac620, 0x075e: 0x403ac820, 0x075f: 0x403aca20, - 0x0760: 0x403ace20, 0x0761: 0x403ad020, 0x0762: 0x403ad220, 0x0763: 0x403ad420, - 0x0764: 0x003ad499, 0x0765: 0x403ad620, 0x0766: 0x403ad820, 0x0767: 0xe0001812, - 0x0768: 0x403adc20, 0x0769: 0x403ade20, 0x076a: 0x403ae020, 0x076b: 0x403ae220, - 0x076c: 0x403ae420, 0x076d: 0xe0001803, 0x076e: 0xe0001809, 0x076f: 0xe000180c, - 0x0770: 0xae60d302, 0x0771: 0xadc0d402, 0x0772: 0xae60d502, 0x0773: 0xae60d602, - 0x0774: 0xadc0d702, 0x0775: 0xae60d802, 0x0776: 0xae60d902, 0x0777: 0xadc0da02, - 0x0778: 0xadc0db02, 0x0779: 0xadc0dc02, 0x077a: 0xae60dd02, 0x077b: 0xadc0de02, - 0x077c: 0xadc0df02, 0x077d: 0xae60e002, 0x077e: 0xadc0e102, 0x077f: 0xae60e202, - // Block 0x1e, offset 0x780 - 0x0780: 0xae600000, 0x0781: 0xae605f02, 0x0782: 0xadc06002, 0x0783: 0xae600000, - 0x0784: 0xadc00000, 0x0785: 0xae605f02, 0x0786: 0xadc06002, 0x0787: 0xae600000, - 0x0788: 0xadc00000, 0x0789: 0xae600000, 0x078a: 0xae600000, - 0x078d: 0x403ac020, 0x078e: 0x403acc20, 0x078f: 0x403ada20, - 0x0790: 0x40394420, 0x0791: 0x40394620, 0x0792: 0x40394820, 0x0793: 0x40394a20, - 0x0794: 0x40394c20, 0x0795: 0x40394e20, 0x0796: 0x40395220, 0x0797: 0x40397c20, - 0x0798: 0x40397e20, 0x0799: 0x4039a020, 0x079a: 0x4039a220, 0x079b: 0x4039bc20, - 0x079c: 0x4039d220, 0x079d: 0x4039f620, 0x079e: 0x4039f820, 0x079f: 0x4039fa20, - 0x07a0: 0x403a0c20, 0x07a1: 0x403a0e20, 0x07a2: 0x403a3620, 0x07a3: 0x403a3c20, - 0x07a4: 0x403a3e20, 0x07a5: 0x403a5020, 0x07a6: 0x403a5220, 0x07a7: 0x403a6220, - 0x07a8: 0x403a6420, 0x07a9: 0x403a6620, 0x07aa: 0x403a4a20, 0x07ab: 0x4039be20, - 0x07ac: 0x4039c020, 0x07ad: 0x4039d420, 0x07ae: 0x40398020, 0x07af: 0x40398220, - 0x07b0: 0x4039d620, 0x07b1: 0x4039c220, 0x07b2: 0x40398420, 0x07b3: 0x40392c20, - 0x07b4: 0x40392e20, 0x07b5: 0x403aa420, 0x07b6: 0x403aa620, 0x07b7: 0x403aa820, - 0x07b8: 0x403a8820, 0x07b9: 0x403a8a20, 0x07ba: 0x403aac20, 0x07bb: 0x403aae20, - 0x07bc: 0x40398620, 0x07bd: 0x4039d820, 0x07be: 0x4039da20, 0x07bf: 0x403a2420, - // Block 0x1f, offset 0x7c0 - 0x07c0: 0x403b1820, 0x07c1: 0x403b1e20, 0x07c2: 0x403b2020, 0x07c3: 0x403b2220, - 0x07c4: 0x403b2620, 0x07c5: 0x403b2820, 0x07c6: 0x403b2a20, 0x07c7: 0x403b2c20, - 0x07c8: 0x403b3220, 0x07c9: 0x403b3620, 0x07ca: 0x403b3820, 0x07cb: 0x403b3a20, - 0x07cc: 0x403b3e20, 0x07cd: 0x403b4620, 0x07ce: 0x403b4820, 0x07cf: 0x403b4c20, - 0x07d0: 0x403b4e20, 0x07d1: 0x403b5620, 0x07d2: 0x403b5820, 0x07d3: 0x403b5a20, - 0x07d4: 0x403b5c20, 0x07d5: 0x403b5e20, 0x07d6: 0x403b6020, 0x07d7: 0x403b6220, - 0x07d8: 0x403b4020, 0x07d9: 0x403b1a20, 0x07da: 0x403b1c20, 0x07db: 0x403b3c20, - 0x07dc: 0x403b2420, 0x07dd: 0x403b5020, 0x07de: 0x403b5220, 0x07df: 0x403b5420, - 0x07e0: 0x403b4220, 0x07e1: 0x403b4420, 0x07e2: 0x403b2e20, 0x07e3: 0x403b3020, - 0x07e4: 0x403b4a20, 0x07e5: 0x403b3420, 0x07e6: 0x403b6620, 0x07e7: 0x403b6820, - 0x07e8: 0x403b6a20, 0x07e9: 0x403b6c20, 0x07ea: 0x403b6e20, 0x07eb: 0x403b7020, - 0x07ec: 0x403b7220, 0x07ed: 0x403b7420, 0x07ee: 0x403b7620, 0x07ef: 0x403b7820, - 0x07f0: 0x403b7a20, 0x07f1: 0x403b6420, - // Block 0x20, offset 0x800 - 0x0800: 0xe0000164, 0x0801: 0xe00001ef, 0x0802: 0xe000030a, 0x0803: 0xe00003e4, - 0x0804: 0xe00004bf, 0x0805: 0xe0000589, 0x0806: 0xe0000654, 0x0807: 0xe00006fc, - 0x0808: 0xe00007a8, 0x0809: 0xe000084d, 0x080a: 0x403b7c20, 0x080b: 0x403b7e20, - 0x080c: 0x403b8020, 0x080d: 0x403b8220, 0x080e: 0x403b8420, 0x080f: 0x403b8620, - 0x0810: 0x403b8820, 0x0811: 0x403b8a20, 0x0812: 0x403b8c20, 0x0813: 0x403b8e20, - 0x0814: 0x403b9020, 0x0815: 0x403b9220, 0x0816: 0x403b9420, 0x0817: 0x403b9620, - 0x0818: 0x403b9820, 0x0819: 0x403b9a20, 0x081a: 0x403b9c20, 0x081b: 0x403b9e20, - 0x081c: 0x403ba020, 0x081d: 0x403ba220, 0x081e: 0x403ba420, 0x081f: 0x403ba620, - 0x0820: 0x403ba820, 0x0821: 0x403baa20, 0x0822: 0x403bac20, 0x0823: 0x403bae20, - 0x0824: 0x403bb020, 0x0825: 0x403bb220, 0x0826: 0x403bb420, 0x0827: 0x403bb620, - 0x0828: 0xe0001815, 0x0829: 0xe0001818, 0x082a: 0xe000181b, 0x082b: 0xae60e302, - 0x082c: 0xae60e402, 0x082d: 0xae60e502, 0x082e: 0xae60e602, 0x082f: 0xae60e702, - 0x0830: 0xae60e802, 0x0831: 0xae60e902, 0x0832: 0xadc0ea02, 0x0833: 0xae60eb02, - 0x0834: 0x403bb820, 0x0835: 0x403bba20, 0x0836: 0x40073820, 0x0837: 0x40035e20, - 0x0838: 0x40025020, 0x0839: 0x4002c020, 0x083a: 0xa0000000, - // Block 0x21, offset 0x840 - 0x0840: 0x4038e820, 0x0841: 0x4038ea20, 0x0842: 0x4038ec20, 0x0843: 0x4038ee20, - 0x0844: 0x4038f020, 0x0845: 0x4038f220, 0x0846: 0x4038f420, 0x0847: 0x4038f620, - 0x0848: 0x4038f820, 0x0849: 0x4038fa20, 0x084a: 0x4038fc20, 0x084b: 0x4038fe20, - 0x084c: 0x40390020, 0x084d: 0x40390220, 0x084e: 0x40390420, 0x084f: 0x40390620, - 0x0850: 0x40390820, 0x0851: 0x40390a20, 0x0852: 0x40390c20, 0x0853: 0x40390e20, - 0x0854: 0x40391020, 0x0855: 0x40391220, 0x0856: 0x82e61c8a, 0x0857: 0x82e61c8b, - 0x0858: 0xae609f02, 0x0859: 0xae60a002, 0x085a: 0x40391820, 0x085b: 0x82e61c8d, - 0x085c: 0xae609702, 0x085d: 0xae609702, 0x085e: 0xae609802, 0x085f: 0xae609802, - 0x0860: 0xae609802, 0x0861: 0xae609902, 0x0862: 0xae609902, 0x0863: 0xae609902, - 0x0864: 0xa0009a02, 0x0865: 0xae609a02, 0x0866: 0xae609b02, 0x0867: 0xae609b02, - 0x0868: 0xa0009c02, 0x0869: 0xae609c02, 0x086a: 0xae609c02, 0x086b: 0xae609d02, - 0x086c: 0xae609e02, 0x086d: 0xae60a102, - 0x0870: 0x40027e20, 0x0871: 0x40028020, 0x0872: 0x40028220, 0x0873: 0x40028420, - 0x0874: 0x40028620, 0x0875: 0x40028820, 0x0876: 0x40028a20, 0x0877: 0x40028c20, - 0x0878: 0x40028e20, 0x0879: 0x40029020, 0x087a: 0x40029220, 0x087b: 0x40029420, - 0x087c: 0x40029620, 0x087d: 0x40029820, 0x087e: 0x40029a20, - // Block 0x22, offset 0x880 - 0x0880: 0x403ae620, 0x0881: 0x403ae820, 0x0882: 0x403aea20, 0x0883: 0x403aec20, - 0x0884: 0x403aee20, 0x0885: 0x403af020, 0x0886: 0x403af220, 0x0887: 0x403af420, - 0x0888: 0x403af620, 0x0889: 0x403af820, 0x088a: 0x403afa20, 0x088b: 0x403afc20, - 0x088c: 0x403afe20, 0x088d: 0x403b0020, 0x088e: 0x403b0220, 0x088f: 0x403b0420, - 0x0890: 0x403b0620, 0x0891: 0x403b0820, 0x0892: 0x403b0a20, 0x0893: 0x403b0c20, - 0x0894: 0x403b0e20, 0x0895: 0x403b1020, 0x0896: 0x403b1220, 0x0897: 0x403b1420, - 0x0898: 0x403b1620, 0x0899: 0xadc06002, 0x089a: 0xadc06002, 0x089b: 0xadc06002, - 0x089e: 0x40056820, - // Block 0x23, offset 0x8c0 - 0x08e0: 0x40395020, 0x08e2: 0x40397020, 0x08e3: 0x4039ec20, - 0x08e4: 0x403a0620, 0x08e5: 0x403a1820, 0x08e6: 0x403a4c20, 0x08e7: 0x403a5420, - 0x08e8: 0x40393220, 0x08e9: 0x40393420, 0x08ea: 0x4039c420, 0x08eb: 0x403a8c20, - 0x08ec: 0x40393620, - // Block 0x24, offset 0x900 - 0x0924: 0xae60af02, 0x0925: 0xae60b402, 0x0926: 0xadc0b802, 0x0927: 0xae60a402, - 0x0928: 0xae60a802, 0x0929: 0xadc0ac02, 0x092a: 0xae600000, 0x092b: 0xae600000, - 0x092c: 0xae600000, 0x092d: 0xadc00000, 0x092e: 0xadc00000, 0x092f: 0xadc00000, - 0x0930: 0xa1b0a302, 0x0931: 0xa1c0a702, 0x0932: 0xa1d0ab02, 0x0933: 0xae600000, - 0x0934: 0xae60b002, 0x0935: 0xae60b102, 0x0936: 0xadc0b902, 0x0937: 0xae60ca02, - 0x0938: 0xae60cb02, 0x0939: 0xadc0cf02, 0x093a: 0xadc0d002, 0x093b: 0xae60cd02, - 0x093c: 0xae60ce02, 0x093d: 0xae60cc02, 0x093e: 0xae60b502, - // Block 0x25, offset 0x940 - 0x0940: 0xa000f202, 0x0941: 0xa000f202, 0x0942: 0xa000f302, 0x0943: 0xa000f402, - 0x0944: 0x403fbc20, 0x0945: 0x403fbe20, 0x0946: 0x403fc020, 0x0947: 0x403fcc20, - 0x0948: 0x403fce20, 0x0949: 0x403fd020, 0x094a: 0x403fd220, 0x094b: 0x403fd420, - 0x094c: 0x403fd820, 0x094d: 0x403fdc20, 0x094e: 0x403fde20, 0x094f: 0x403fe020, - 0x0950: 0x403fe220, 0x0951: 0x403fe420, 0x0952: 0x403fe620, 0x0953: 0x403fe820, - 0x0954: 0x403fea20, 0x0955: 0x403fec20, 0x0956: 0x403fee20, 0x0957: 0x403ff020, - 0x0958: 0x403ff420, 0x0959: 0x403ff620, 0x095a: 0x403ff820, 0x095b: 0x403ffa20, - 0x095c: 0x403ffc20, 0x095d: 0x40400220, 0x095e: 0x40400420, 0x095f: 0x40400620, - 0x0960: 0x40400820, 0x0961: 0x40400a20, 0x0962: 0x40400e20, 0x0963: 0x40401020, - 0x0964: 0x40401220, 0x0965: 0x40401420, 0x0966: 0x40401620, 0x0967: 0x40401820, - 0x0968: 0x40401a20, 0x0969: 0xe0001830, 0x096a: 0x40401c20, 0x096b: 0x40401e20, - 0x096c: 0x40402020, 0x096d: 0x40402420, 0x096e: 0x40402620, 0x096f: 0x40402820, - 0x0970: 0x40402c20, 0x0971: 0xe0001839, 0x0972: 0x40402e20, 0x0973: 0x40403020, - 0x0974: 0xe000183c, 0x0975: 0x40403220, 0x0976: 0x40403420, 0x0977: 0x40403620, - 0x0978: 0x40403820, 0x0979: 0x40403a20, 0x097a: 0x40404c20, 0x097b: 0x40404e20, - 0x097c: 0xa070f102, 0x097d: 0x40403c20, 0x097e: 0x40404a20, 0x097f: 0x40405620, - // Block 0x26, offset 0x980 - 0x0980: 0x40405820, 0x0981: 0x40405a20, 0x0982: 0x40405c20, 0x0983: 0x40405e20, - 0x0984: 0x40406020, 0x0985: 0x40406620, 0x0986: 0x40406a20, 0x0987: 0x40406c20, - 0x0988: 0x40407020, 0x0989: 0x40407220, 0x098a: 0x40407420, 0x098b: 0x40407620, - 0x098c: 0x40407820, 0x098d: 0x8209203d, 0x098e: 0x40406e20, 0x098f: 0x40405020, - 0x0990: 0x403fb820, 0x0991: 0xae600000, 0x0992: 0xadc00000, 0x0993: 0xae603502, - 0x0994: 0xae603202, 0x0995: 0x40406820, 0x0996: 0x40405220, 0x0997: 0x40405420, - 0x0998: 0xe000181e, 0x0999: 0xe0001821, 0x099a: 0xe0001824, 0x099b: 0xe0001827, - 0x099c: 0xe000182a, 0x099d: 0xe000182d, 0x099e: 0xe0001833, 0x099f: 0xe0001836, - 0x09a0: 0x403fd620, 0x09a1: 0x403fda20, 0x09a2: 0x40406220, 0x09a3: 0x40406420, - 0x09a4: 0x40030c20, 0x09a5: 0x40030e20, 0x09a6: 0xe000016a, 0x09a7: 0xe00001f8, - 0x09a8: 0xe0000313, 0x09a9: 0xe00003ed, 0x09aa: 0xe00004c8, 0x09ab: 0xe0000592, - 0x09ac: 0xe000065d, 0x09ad: 0xe0000705, 0x09ae: 0xe00007b1, 0x09af: 0xe0000856, - 0x09b0: 0x40056c20, 0x09b1: 0x4027b620, 0x09b2: 0x403fba20, 0x09b3: 0x403fc220, - 0x09b4: 0x403fc420, 0x09b5: 0x403fc620, 0x09b6: 0x403fc820, 0x09b7: 0x403fca20, - 0x09b9: 0x403ffe20, 0x09ba: 0x40402a20, 0x09bb: 0x403ff220, - 0x09bc: 0x40400020, 0x09bd: 0x40403e20, 0x09be: 0x40400c20, 0x09bf: 0x40402220, - // Block 0x27, offset 0x9c0 - 0x09c1: 0xa000f202, 0x09c2: 0xa000f302, 0x09c3: 0xa000f402, - 0x09c5: 0x40407c20, 0x09c6: 0x40407e20, 0x09c7: 0x40408020, - 0x09c8: 0x40408220, 0x09c9: 0x40408420, 0x09ca: 0x40408620, 0x09cb: 0x40408820, - 0x09cc: 0x40408c20, 0x09cf: 0x40409020, - 0x09d0: 0x40409220, 0x09d3: 0x40409420, - 0x09d4: 0x40409620, 0x09d5: 0x40409820, 0x09d6: 0x40409a20, 0x09d7: 0x40409c20, - 0x09d8: 0x40409e20, 0x09d9: 0x4040a020, 0x09da: 0x4040a220, 0x09db: 0x4040a420, - 0x09dc: 0x4040a620, 0x09dd: 0x4040a820, 0x09de: 0x4040aa20, 0x09df: 0x4040ac20, - 0x09e0: 0x4040ae20, 0x09e1: 0x4040b020, 0x09e2: 0x4040b220, 0x09e3: 0x4040b420, - 0x09e4: 0x4040b620, 0x09e5: 0x4040b820, 0x09e6: 0x4040ba20, 0x09e7: 0x4040bc20, - 0x09e8: 0x4040be20, 0x09ea: 0x4040c020, 0x09eb: 0x4040c220, - 0x09ec: 0x4040c420, 0x09ed: 0x4040c620, 0x09ee: 0x4040c820, 0x09ef: 0x4040ca20, - 0x09f0: 0x4040cc20, 0x09f2: 0x4040d020, - 0x09f6: 0x4040d420, 0x09f7: 0x4040d620, - 0x09f8: 0x4040d820, 0x09f9: 0x4040da20, - 0x09fc: 0xa070f102, 0x09fd: 0x4040dc20, 0x09fe: 0x4040de20, 0x09ff: 0x4040e020, - // Block 0x28, offset 0xa00 - 0x0a00: 0x4040e220, 0x0a01: 0x4040e420, 0x0a02: 0x4040e620, 0x0a03: 0x4040e820, - 0x0a04: 0x4040ea20, 0x0a07: 0xc05a0191, - 0x0a08: 0x4040f220, 0x0a0b: 0x4040f420, - 0x0a0c: 0x4040f620, 0x0a0d: 0x8209207c, 0x0a0e: 0xe0001845, - 0x0a17: 0x4040fa20, - 0x0a1c: 0xe000183f, 0x0a1d: 0xe0001842, 0x0a1f: 0xe0001848, - 0x0a20: 0x40408a20, 0x0a21: 0x40408e20, 0x0a22: 0x4040ec20, 0x0a23: 0x4040ee20, - 0x0a26: 0xe000016d, 0x0a27: 0xe00001fb, - 0x0a28: 0xe0000316, 0x0a29: 0xe00003f0, 0x0a2a: 0xe00004cb, 0x0a2b: 0xe0000595, - 0x0a2c: 0xe0000660, 0x0a2d: 0xe0000708, 0x0a2e: 0xe00007b4, 0x0a2f: 0xe0000859, - 0x0a30: 0x4040ce20, 0x0a31: 0x4040d220, 0x0a32: 0x4027e820, 0x0a33: 0x4027ea20, - 0x0a34: 0x40283020, 0x0a35: 0x40283220, 0x0a36: 0x40283420, 0x0a37: 0x40283620, - 0x0a38: 0x40283820, 0x0a39: 0x40283a20, 0x0a3a: 0x40073a20, 0x0a3b: 0x4027ec20, - // Block 0x29, offset 0xa40 - 0x0a41: 0xa000f202, 0x0a42: 0xa000f302, 0x0a43: 0xa000f402, - 0x0a45: 0x40410620, 0x0a46: 0x40410820, 0x0a47: 0x40411020, - 0x0a48: 0x40411220, 0x0a49: 0x40410020, 0x0a4a: 0x40410220, - 0x0a4f: 0x40411420, - 0x0a50: 0x40410a20, 0x0a53: 0x40410420, - 0x0a54: 0x40410c20, 0x0a55: 0x40411c20, 0x0a56: 0x40411e20, 0x0a57: 0x40412020, - 0x0a58: 0x40412220, 0x0a59: 0x40412420, 0x0a5a: 0x40412620, 0x0a5b: 0x40412820, - 0x0a5c: 0x40412a20, 0x0a5d: 0x40412c20, 0x0a5e: 0x40412e20, 0x0a5f: 0x40413020, - 0x0a60: 0x40413220, 0x0a61: 0x40413420, 0x0a62: 0x40413620, 0x0a63: 0x40413820, - 0x0a64: 0x40413a20, 0x0a65: 0x40413c20, 0x0a66: 0x40413e20, 0x0a67: 0x40414020, - 0x0a68: 0x40414220, 0x0a6a: 0x40414420, 0x0a6b: 0x40414620, - 0x0a6c: 0x40414820, 0x0a6d: 0x40414a20, 0x0a6e: 0x40414c20, 0x0a6f: 0x40414e20, - 0x0a70: 0x40415220, 0x0a72: 0x40415420, 0x0a73: 0xe000185a, - 0x0a75: 0x40415620, 0x0a76: 0xe000184b, - 0x0a78: 0x40411620, 0x0a79: 0x40411820, - 0x0a7c: 0xa070f102, 0x0a7e: 0x40415a20, 0x0a7f: 0x40415c20, - // Block 0x2a, offset 0xa80 - 0x0a80: 0x40415e20, 0x0a81: 0x40416020, 0x0a82: 0x40416220, - 0x0a87: 0x40416420, - 0x0a88: 0x40416620, 0x0a8b: 0x40416820, - 0x0a8c: 0x40416a20, 0x0a8d: 0x820920b6, - 0x0a91: 0x40411a20, - 0x0a99: 0xe000184e, 0x0a9a: 0xe0001851, 0x0a9b: 0xe0001854, - 0x0a9c: 0x40415820, 0x0a9e: 0xe0001857, - 0x0aa6: 0xe0000170, 0x0aa7: 0xe00001fe, - 0x0aa8: 0xe0000319, 0x0aa9: 0xe00003f3, 0x0aaa: 0xe00004ce, 0x0aab: 0xe0000598, - 0x0aac: 0xe0000663, 0x0aad: 0xe000070b, 0x0aae: 0xe00007b7, 0x0aaf: 0xe000085c, - 0x0ab0: 0xa000f502, 0x0ab1: 0xa000f602, 0x0ab2: 0x40410e20, 0x0ab3: 0x4040fe20, - 0x0ab4: 0x4040fc20, 0x0ab5: 0x40415020, - // Block 0x2b, offset 0xac0 - 0x0ac1: 0xa000f202, 0x0ac2: 0xa000f302, 0x0ac3: 0xa000f402, - 0x0ac5: 0x40417020, 0x0ac6: 0x40417220, 0x0ac7: 0x40417420, - 0x0ac8: 0x40417620, 0x0ac9: 0x40417820, 0x0aca: 0x40417a20, 0x0acb: 0x40417c20, - 0x0acc: 0x40418020, 0x0acd: 0x40418420, 0x0acf: 0x40418620, - 0x0ad0: 0x40418820, 0x0ad1: 0x40418a20, 0x0ad3: 0x40418c20, - 0x0ad4: 0x40418e20, 0x0ad5: 0x40419020, 0x0ad6: 0x40419220, 0x0ad7: 0x40419420, - 0x0ad8: 0x40419620, 0x0ad9: 0x40419820, 0x0ada: 0x40419a20, 0x0adb: 0x40419c20, - 0x0adc: 0x40419e20, 0x0add: 0x4041a020, 0x0ade: 0x4041a220, 0x0adf: 0x4041a420, - 0x0ae0: 0x4041a620, 0x0ae1: 0x4041a820, 0x0ae2: 0x4041aa20, 0x0ae3: 0x4041ac20, - 0x0ae4: 0x4041ae20, 0x0ae5: 0x4041b020, 0x0ae6: 0x4041b220, 0x0ae7: 0x4041b420, - 0x0ae8: 0x4041b620, 0x0aea: 0x4041b820, 0x0aeb: 0x4041ba20, - 0x0aec: 0x4041bc20, 0x0aed: 0x4041be20, 0x0aee: 0x4041c020, 0x0aef: 0x4041c220, - 0x0af0: 0x4041c420, 0x0af2: 0x4041c620, 0x0af3: 0x4041d220, - 0x0af5: 0x4041c820, 0x0af6: 0x4041ca20, 0x0af7: 0x4041cc20, - 0x0af8: 0x4041ce20, 0x0af9: 0x4041d020, - 0x0afc: 0xa070f102, 0x0afd: 0x4041d420, 0x0afe: 0x4041d620, 0x0aff: 0x4041d820, - // Block 0x2c, offset 0xb00 - 0x0b00: 0x4041da20, 0x0b01: 0x4041dc20, 0x0b02: 0x4041de20, 0x0b03: 0x4041e020, - 0x0b04: 0x4041e220, 0x0b05: 0x4041e820, 0x0b07: 0x4041ea20, - 0x0b08: 0x4041ec20, 0x0b09: 0x4041ee20, 0x0b0b: 0x4041f020, - 0x0b0c: 0x4041f220, 0x0b0d: 0x820920fa, - 0x0b10: 0x40416e20, - 0x0b20: 0x40417e20, 0x0b21: 0x40418220, 0x0b22: 0x4041e420, 0x0b23: 0x4041e620, - 0x0b26: 0xe0000173, 0x0b27: 0xe0000201, - 0x0b28: 0xe000031c, 0x0b29: 0xe00003f6, 0x0b2a: 0xe00004d1, 0x0b2b: 0xe000059b, - 0x0b2c: 0xe0000666, 0x0b2d: 0xe000070e, 0x0b2e: 0xe00007ba, 0x0b2f: 0xe000085f, - 0x0b30: 0x40057420, 0x0b31: 0x4027ee20, - // Block 0x2d, offset 0xb40 - 0x0b41: 0xa000f202, 0x0b42: 0xa000f302, 0x0b43: 0xa000f402, - 0x0b45: 0x4041f620, 0x0b46: 0x4041f820, 0x0b47: 0x4041fa20, - 0x0b48: 0x4041fc20, 0x0b49: 0x4041fe20, 0x0b4a: 0x40420020, 0x0b4b: 0x40420220, - 0x0b4c: 0x40420620, 0x0b4f: 0x40420a20, - 0x0b50: 0x40420c20, 0x0b53: 0x40420e20, - 0x0b54: 0x40421020, 0x0b55: 0x40421220, 0x0b56: 0x40421420, 0x0b57: 0x40421620, - 0x0b58: 0x40421820, 0x0b59: 0x40421a20, 0x0b5a: 0x40421c20, 0x0b5b: 0x40421e20, - 0x0b5c: 0x40422020, 0x0b5d: 0x40422220, 0x0b5e: 0x40422420, 0x0b5f: 0x40422620, - 0x0b60: 0x40422820, 0x0b61: 0x40422a20, 0x0b62: 0x40422c20, 0x0b63: 0x40422e20, - 0x0b64: 0x40423020, 0x0b65: 0x40423220, 0x0b66: 0x40423420, 0x0b67: 0x40423620, - 0x0b68: 0x40423820, 0x0b6a: 0x40423a20, 0x0b6b: 0x40423c20, - 0x0b6c: 0x40423e20, 0x0b6d: 0x40424020, 0x0b6e: 0x40424220, 0x0b6f: 0x40424420, - 0x0b70: 0x40424820, 0x0b72: 0x40424a20, 0x0b73: 0x40424c20, - 0x0b75: 0x40424e20, 0x0b76: 0x40425220, 0x0b77: 0x40425420, - 0x0b78: 0x40425620, 0x0b79: 0x40425820, - 0x0b7c: 0xa070f102, 0x0b7d: 0x40425a20, 0x0b7e: 0x40425c20, 0x0b7f: 0x40425e20, - // Block 0x2e, offset 0xb80 - 0x0b80: 0x40426020, 0x0b81: 0x40426220, 0x0b82: 0x40426420, 0x0b83: 0x40426620, - 0x0b84: 0x40426820, 0x0b87: 0xc05d01e1, - 0x0b88: 0x40427020, 0x0b8b: 0x40427220, - 0x0b8c: 0x40427420, 0x0b8d: 0x8209213b, - 0x0b96: 0x40427820, 0x0b97: 0x40427a20, - 0x0b9c: 0xe000185d, 0x0b9d: 0xe0001860, 0x0b9f: 0x40424620, - 0x0ba0: 0x40420420, 0x0ba1: 0x40420820, 0x0ba2: 0x40426a20, 0x0ba3: 0x40426c20, - 0x0ba6: 0xe0000176, 0x0ba7: 0xe0000204, - 0x0ba8: 0xe000031f, 0x0ba9: 0xe00003f9, 0x0baa: 0xe00004d4, 0x0bab: 0xe000059e, - 0x0bac: 0xe0000669, 0x0bad: 0xe0000711, 0x0bae: 0xe00007bd, 0x0baf: 0xe0000862, - 0x0bb0: 0x40073c20, 0x0bb1: 0x40425020, 0x0bb2: 0x40283c20, 0x0bb3: 0x40283e20, - 0x0bb4: 0x40284020, 0x0bb5: 0x40284220, 0x0bb6: 0x40284420, 0x0bb7: 0x40284620, - // Block 0x2f, offset 0xbc0 - 0x0bc2: 0xa000f302, 0x0bc3: 0x40429620, - 0x0bc5: 0x40427e20, 0x0bc6: 0x40428020, 0x0bc7: 0x40428220, - 0x0bc8: 0x40428420, 0x0bc9: 0x40428620, 0x0bca: 0x40428820, - 0x0bce: 0x40428a20, 0x0bcf: 0x40428c20, - 0x0bd0: 0x40428e20, 0x0bd2: 0xc0610231, 0x0bd3: 0x40429220, - 0x0bd4: 0x40429420, 0x0bd5: 0x40429820, - 0x0bd9: 0x40429a20, 0x0bda: 0x40429c20, - 0x0bdc: 0x4042bc20, 0x0bde: 0x40429e20, 0x0bdf: 0x4042a020, - 0x0be3: 0x4042a220, - 0x0be4: 0x4042a420, - 0x0be8: 0x4042a620, 0x0be9: 0x4042ba20, 0x0bea: 0x4042a820, - 0x0bee: 0x4042aa20, 0x0bef: 0x4042ac20, - 0x0bf0: 0x4042ae20, 0x0bf1: 0x4042b820, 0x0bf2: 0x4042b020, 0x0bf3: 0x4042b620, - 0x0bf4: 0x4042b420, 0x0bf5: 0x4042b220, 0x0bf6: 0x4042be20, 0x0bf7: 0x4042c020, - 0x0bf8: 0x4042c220, 0x0bf9: 0x4042c420, - 0x0bfe: 0x4042c620, 0x0bff: 0x4042c820, - // Block 0x30, offset 0xc00 - 0x0c00: 0x4042ca20, 0x0c01: 0x4042cc20, 0x0c02: 0x4042ce20, - 0x0c06: 0xc0630261, 0x0c07: 0xc06602b1, - 0x0c08: 0x4042d420, 0x0c0a: 0x4042d620, 0x0c0b: 0x4042d820, - 0x0c0c: 0x4042da20, 0x0c0d: 0x8209216e, - 0x0c10: 0x40427c20, - 0x0c17: 0x4042de20, - 0x0c26: 0xe0000179, 0x0c27: 0xe0000207, - 0x0c28: 0xe0000322, 0x0c29: 0xe00003fc, 0x0c2a: 0xe00004d7, 0x0c2b: 0xe00005a1, - 0x0c2c: 0xe000066c, 0x0c2d: 0xe0000714, 0x0c2e: 0xe00007c0, 0x0c2f: 0xe0000865, - 0x0c30: 0x40285420, 0x0c31: 0x40285620, 0x0c32: 0x40285820, 0x0c33: 0x40073e20, - 0x0c34: 0x40074020, 0x0c35: 0x40074220, 0x0c36: 0x40074420, 0x0c37: 0x40074620, - 0x0c38: 0x40074820, 0x0c39: 0x4027f220, 0x0c3a: 0x40074a20, - // Block 0x31, offset 0xc40 - 0x0c41: 0xa000f202, 0x0c42: 0xa000f302, 0x0c43: 0xa000f402, - 0x0c45: 0x4042e020, 0x0c46: 0x4042e220, 0x0c47: 0x4042e420, - 0x0c48: 0x4042e620, 0x0c49: 0x4042e820, 0x0c4a: 0x4042ea20, 0x0c4b: 0x4042ec20, - 0x0c4c: 0x4042f020, 0x0c4e: 0x4042f420, 0x0c4f: 0x4042f620, - 0x0c50: 0x4042f820, 0x0c52: 0x4042fa20, 0x0c53: 0x4042fc20, - 0x0c54: 0x4042fe20, 0x0c55: 0x40430020, 0x0c56: 0x40430220, 0x0c57: 0x40430420, - 0x0c58: 0x40430620, 0x0c59: 0x40430820, 0x0c5a: 0x40430a20, 0x0c5b: 0x40430e20, - 0x0c5c: 0x40431020, 0x0c5d: 0x40431420, 0x0c5e: 0x40431620, 0x0c5f: 0x40431820, - 0x0c60: 0x40431a20, 0x0c61: 0x40431c20, 0x0c62: 0x40431e20, 0x0c63: 0x40432020, - 0x0c64: 0x40432220, 0x0c65: 0x40432420, 0x0c66: 0x40432620, 0x0c67: 0x40432820, - 0x0c68: 0x40432a20, 0x0c6a: 0x40432c20, 0x0c6b: 0x40432e20, - 0x0c6c: 0x40433020, 0x0c6d: 0x40433220, 0x0c6e: 0x40433420, 0x0c6f: 0x40433620, - 0x0c70: 0x40433820, 0x0c71: 0x40433a20, 0x0c72: 0x40433c20, 0x0c73: 0x40434820, - 0x0c75: 0x40433e20, 0x0c76: 0x40434020, 0x0c77: 0x40434220, - 0x0c78: 0x40434420, 0x0c79: 0x40434620, - 0x0c7d: 0x40434a20, 0x0c7e: 0x40434c20, 0x0c7f: 0x40434e20, - // Block 0x32, offset 0xc80 - 0x0c80: 0x40435020, 0x0c81: 0x40435220, 0x0c82: 0x40435420, 0x0c83: 0x40435620, - 0x0c84: 0x40435820, 0x0c86: 0xc06802e1, 0x0c87: 0x40436020, - 0x0c88: 0x40436220, 0x0c8a: 0x40436420, 0x0c8b: 0x40436620, - 0x0c8c: 0x40436820, 0x0c8d: 0x820921b5, - 0x0c95: 0x825421b6, 0x0c96: 0x825b21b7, - 0x0c98: 0x40430c20, 0x0c99: 0x40431220, - 0x0ca0: 0x4042ee20, 0x0ca1: 0x4042f220, 0x0ca2: 0x40435a20, 0x0ca3: 0x40435c20, - 0x0ca6: 0xe000017c, 0x0ca7: 0xe000020a, - 0x0ca8: 0xe0000325, 0x0ca9: 0xe00003ff, 0x0caa: 0xe00004da, 0x0cab: 0xe00005a4, - 0x0cac: 0xe000066f, 0x0cad: 0xe0000717, 0x0cae: 0xe00007c3, 0x0caf: 0xe0000868, - 0x0cb8: 0xe000017f, 0x0cb9: 0xe000020d, 0x0cba: 0xe0000328, 0x0cbb: 0xe0000402, - 0x0cbc: 0xe0000210, 0x0cbd: 0xe000032b, 0x0cbe: 0xe0000405, 0x0cbf: 0x40074c20, - // Block 0x33, offset 0xcc0 - 0x0cc2: 0xa000f302, 0x0cc3: 0xa000f402, - 0x0cc5: 0x40437020, 0x0cc6: 0x40437220, 0x0cc7: 0x40437420, - 0x0cc8: 0x40437620, 0x0cc9: 0x40437820, 0x0cca: 0x40437a20, 0x0ccb: 0x40437c20, - 0x0ccc: 0x40438020, 0x0cce: 0x40438420, 0x0ccf: 0x40438620, - 0x0cd0: 0x40438820, 0x0cd2: 0x40438a20, 0x0cd3: 0x40438c20, - 0x0cd4: 0x40438e20, 0x0cd5: 0x40439020, 0x0cd6: 0x40439220, 0x0cd7: 0x40439420, - 0x0cd8: 0x40439620, 0x0cd9: 0x40439820, 0x0cda: 0x40439a20, 0x0cdb: 0x40439c20, - 0x0cdc: 0x40439e20, 0x0cdd: 0x4043a020, 0x0cde: 0x4043a220, 0x0cdf: 0x4043a420, - 0x0ce0: 0x4043a620, 0x0ce1: 0x4043a820, 0x0ce2: 0x4043aa20, 0x0ce3: 0x4043ac20, - 0x0ce4: 0x4043ae20, 0x0ce5: 0x4043b020, 0x0ce6: 0x4043b220, 0x0ce7: 0x4043b420, - 0x0ce8: 0x4043b620, 0x0cea: 0x4043b820, 0x0ceb: 0x4043ba20, - 0x0cec: 0x4043bc20, 0x0ced: 0x4043be20, 0x0cee: 0x4043c020, 0x0cef: 0x4043c220, - 0x0cf0: 0x4043c420, 0x0cf1: 0x4043c620, 0x0cf2: 0x4043c820, 0x0cf3: 0x4043d420, - 0x0cf5: 0x4043ca20, 0x0cf6: 0x4043cc20, 0x0cf7: 0x4043ce20, - 0x0cf8: 0x4043d020, 0x0cf9: 0x4043d220, - 0x0cfc: 0xa070f102, 0x0cfd: 0x4043d820, 0x0cfe: 0x4043de20, 0x0cff: 0xc06a0311, - // Block 0x34, offset 0xd00 - 0x0d00: 0x4043e220, 0x0d01: 0x4043e420, 0x0d02: 0x4043e620, 0x0d03: 0x4043e820, - 0x0d04: 0x4043ea20, 0x0d06: 0xc06c0341, 0x0d07: 0x4043f220, - 0x0d08: 0x4043f420, 0x0d0a: 0xc0710311, 0x0d0b: 0x4043f820, - 0x0d0c: 0x4043fa20, 0x0d0d: 0x820921fe, - 0x0d15: 0x4043fe20, 0x0d16: 0x40440020, - 0x0d1e: 0x4043d620, - 0x0d20: 0x40437e20, 0x0d21: 0x40438220, 0x0d22: 0x4043ec20, 0x0d23: 0x4043ee20, - 0x0d26: 0xe0000182, 0x0d27: 0xe0000213, - 0x0d28: 0xe000032e, 0x0d29: 0xe0000408, 0x0d2a: 0xe00004dd, 0x0d2b: 0xe00005a7, - 0x0d2c: 0xe0000672, 0x0d2d: 0xe000071a, 0x0d2e: 0xe00007c6, 0x0d2f: 0xe000086b, - 0x0d31: 0x4043da20, 0x0d32: 0x4043dc20, - // Block 0x35, offset 0xd40 - 0x0d42: 0xa000f302, 0x0d43: 0xa000f402, - 0x0d45: 0x40440220, 0x0d46: 0x40440420, 0x0d47: 0x40440620, - 0x0d48: 0x40440820, 0x0d49: 0x40440a20, 0x0d4a: 0x40440c20, 0x0d4b: 0x40440e20, - 0x0d4c: 0x40441220, 0x0d4e: 0x40441620, 0x0d4f: 0x40441820, - 0x0d50: 0x40441a20, 0x0d52: 0x40441c20, 0x0d53: 0x40441e20, - 0x0d54: 0x40442020, 0x0d55: 0x40442220, 0x0d56: 0x40442420, 0x0d57: 0x40442620, - 0x0d58: 0x40442820, 0x0d59: 0x40442a20, 0x0d5a: 0x40442c20, 0x0d5b: 0x40442e20, - 0x0d5c: 0x40443020, 0x0d5d: 0x40443220, 0x0d5e: 0x40443420, 0x0d5f: 0x40443620, - 0x0d60: 0x40443820, 0x0d61: 0x40443a20, 0x0d62: 0x40443c20, 0x0d63: 0x40443e20, - 0x0d64: 0x40444020, 0x0d65: 0x40444220, 0x0d66: 0x40444420, 0x0d67: 0x40444620, - 0x0d68: 0x40444820, 0x0d69: 0x40444a20, 0x0d6a: 0x40444c20, 0x0d6b: 0x40444e20, - 0x0d6c: 0x40445020, 0x0d6d: 0x40445220, 0x0d6e: 0x40445420, 0x0d6f: 0x40445620, - 0x0d70: 0x40445820, 0x0d71: 0x40446a20, 0x0d72: 0x40445a20, 0x0d73: 0x40446620, - 0x0d74: 0x40446820, 0x0d75: 0x40445c20, 0x0d76: 0x40445e20, 0x0d77: 0x40446020, - 0x0d78: 0x40446220, 0x0d79: 0x40446420, 0x0d7a: 0x40446c20, - 0x0d7d: 0x40446e20, 0x0d7e: 0x40447020, 0x0d7f: 0x40447220, - // Block 0x36, offset 0xd80 - 0x0d80: 0x40447420, 0x0d81: 0x40447620, 0x0d82: 0x40447820, 0x0d83: 0x40447a20, - 0x0d84: 0x40447c20, 0x0d86: 0xc07303b1, 0x0d87: 0xc0760401, - 0x0d88: 0x40448620, 0x0d8a: 0x40448820, 0x0d8b: 0x40448a20, - 0x0d8c: 0x40448c20, 0x0d8d: 0x82092248, 0x0d8e: 0xe000186c, - 0x0d97: 0x40448e20, - 0x0da0: 0x40441020, 0x0da1: 0x40441420, 0x0da2: 0x40447e20, 0x0da3: 0x40448020, - 0x0da6: 0xe0000185, 0x0da7: 0xe0000216, - 0x0da8: 0xe0000331, 0x0da9: 0xe000040b, 0x0daa: 0xe00004e0, 0x0dab: 0xe00005aa, - 0x0dac: 0xe0000675, 0x0dad: 0xe000071d, 0x0dae: 0xe00007c9, 0x0daf: 0xe000086e, - 0x0db0: 0x40285a20, 0x0db1: 0x40285c20, 0x0db2: 0x40285e20, 0x0db3: 0x40286020, - 0x0db4: 0x40286220, 0x0db5: 0x40286420, - 0x0db9: 0x40074e20, 0x0dba: 0xe0001866, 0x0dbb: 0xe0001869, - 0x0dbc: 0xe000186f, 0x0dbd: 0xe0001872, 0x0dbe: 0xe0001875, 0x0dbf: 0xe0001863, - // Block 0x37, offset 0xdc0 - 0x0dc2: 0xa000f302, 0x0dc3: 0xa000f402, - 0x0dc5: 0x40449220, 0x0dc6: 0x40449420, 0x0dc7: 0x40449620, - 0x0dc8: 0x40449820, 0x0dc9: 0x40449a20, 0x0dca: 0x40449c20, 0x0dcb: 0x40449e20, - 0x0dcc: 0x4044a020, 0x0dcd: 0x4044a220, 0x0dce: 0x4044a420, 0x0dcf: 0x4044a620, - 0x0dd0: 0x4044a820, 0x0dd1: 0x4044aa20, 0x0dd2: 0x4044ac20, 0x0dd3: 0x4044ae20, - 0x0dd4: 0x4044b020, 0x0dd5: 0x4044b220, 0x0dd6: 0x4044b420, - 0x0dda: 0x4044b620, 0x0ddb: 0x4044b820, - 0x0ddc: 0x4044ba20, 0x0ddd: 0x4044bc20, 0x0dde: 0x4044be20, 0x0ddf: 0x4044c020, - 0x0de0: 0x4044c220, 0x0de1: 0x4044c420, 0x0de2: 0x4044c620, 0x0de3: 0x4044c820, - 0x0de4: 0x4044ca20, 0x0de5: 0x4044cc20, 0x0de6: 0x4044ce20, 0x0de7: 0x4044d020, - 0x0de8: 0x4044d220, 0x0de9: 0x4044d420, 0x0dea: 0x4044d620, 0x0deb: 0x4044d820, - 0x0dec: 0x4044da20, 0x0ded: 0x4044dc20, 0x0dee: 0x4044de20, 0x0def: 0x4044e020, - 0x0df0: 0x4044e220, 0x0df1: 0x4044e420, 0x0df3: 0x4044e620, - 0x0df4: 0x4044e820, 0x0df5: 0x4044ea20, 0x0df6: 0x4044ec20, 0x0df7: 0x4044ee20, - 0x0df8: 0x4044f020, 0x0df9: 0x4044f220, 0x0dfa: 0x4044f420, 0x0dfb: 0x4044f620, - 0x0dfd: 0x4044f820, - // Block 0x38, offset 0xe00 - 0x0e00: 0x4044fa20, 0x0e01: 0x4044fc20, 0x0e02: 0x4044fe20, 0x0e03: 0x40450020, - 0x0e04: 0x40450220, 0x0e05: 0x40450420, 0x0e06: 0x40450620, - 0x0e0a: 0x82092295, - 0x0e0f: 0x40450820, - 0x0e10: 0x40450a20, 0x0e11: 0x40450c20, 0x0e12: 0x40450e20, 0x0e13: 0x40451020, - 0x0e14: 0x40451220, 0x0e16: 0x40451420, - 0x0e18: 0x40451620, 0x0e19: 0xc0780431, 0x0e1a: 0x40452020, 0x0e1b: 0x40452220, - 0x0e1c: 0xc07d04b1, 0x0e1d: 0x40452620, 0x0e1e: 0x40452820, 0x0e1f: 0x40451a20, - 0x0e32: 0x40451820, 0x0e33: 0x40451c20, - 0x0e34: 0x40057620, - // Block 0x39, offset 0xe40 - 0x0e41: 0x40491020, 0x0e42: 0x40491220, 0x0e43: 0x40491420, - 0x0e44: 0x40491620, 0x0e45: 0x40491820, 0x0e46: 0x40491a20, 0x0e47: 0x40491c20, - 0x0e48: 0x40491e20, 0x0e49: 0x40492020, 0x0e4a: 0x40492220, 0x0e4b: 0x40492420, - 0x0e4c: 0x40492620, 0x0e4d: 0x40492820, 0x0e4e: 0x40492a20, 0x0e4f: 0x40492c20, - 0x0e50: 0x40492e20, 0x0e51: 0x40493020, 0x0e52: 0x40493220, 0x0e53: 0x40493420, - 0x0e54: 0x40493620, 0x0e55: 0x40493820, 0x0e56: 0x40493a20, 0x0e57: 0x40493c20, - 0x0e58: 0x40493e20, 0x0e59: 0x40494020, 0x0e5a: 0x40494220, 0x0e5b: 0x40494420, - 0x0e5c: 0x40494620, 0x0e5d: 0x40494820, 0x0e5e: 0x40494a20, 0x0e5f: 0x40494c20, - 0x0e60: 0x40494e20, 0x0e61: 0x40495020, 0x0e62: 0x40495220, 0x0e63: 0x40495420, - 0x0e64: 0x40495620, 0x0e65: 0x40495820, 0x0e66: 0x40495a20, 0x0e67: 0x40495c20, - 0x0e68: 0x40495e20, 0x0e69: 0x40496020, 0x0e6a: 0x40496220, 0x0e6b: 0x40496420, - 0x0e6c: 0x40496620, 0x0e6d: 0x40496820, 0x0e6e: 0x40496a20, 0x0e6f: 0x40496c20, - 0x0e70: 0x40496e20, 0x0e71: 0x40497020, 0x0e72: 0x40497220, 0x0e73: 0x40497420, - 0x0e74: 0x40497620, 0x0e75: 0x40497820, 0x0e76: 0x40497a20, 0x0e77: 0x40497c20, - 0x0e78: 0x826724bf, 0x0e79: 0x826724c0, 0x0e7a: 0x820924c1, - 0x0e7f: 0x4027f420, - // Block 0x3a, offset 0xe80 - 0x0e80: 0xc07f04e1, 0x0e81: 0xc0ae04e1, 0x0e82: 0xc0dd04e1, 0x0e83: 0xc10c04e1, - 0x0e84: 0xc13b04e1, 0x0e85: 0x40498e20, 0x0e86: 0x4027b820, 0x0e87: 0xa000ff02, - 0x0e88: 0xa6b10002, 0x0e89: 0xa6b10102, 0x0e8a: 0xa6b10202, 0x0e8b: 0xa6b10302, - 0x0e8c: 0xa0010402, 0x0e8d: 0xc16a0511, 0x0e8e: 0xa000fe02, 0x0e8f: 0x40057820, - 0x0e90: 0xe000019a, 0x0e91: 0xe000022e, 0x0e92: 0xe0000346, 0x0e93: 0xe0000420, - 0x0e94: 0xe00004f5, 0x0e95: 0xe00005bf, 0x0e96: 0xe000068a, 0x0e97: 0xe0000732, - 0x0e98: 0xe00007de, 0x0e99: 0xe0000883, 0x0e9a: 0x40057a20, 0x0e9b: 0x40057c20, - // Block 0x3b, offset 0xec0 - 0x0ec1: 0x40499220, 0x0ec2: 0x40499420, - 0x0ec4: 0x40499620, 0x0ec7: 0x40499820, - 0x0ec8: 0x40499a20, 0x0eca: 0x40499e20, - 0x0ecd: 0x4049a220, - 0x0ed4: 0x4049a420, 0x0ed5: 0x4049a620, 0x0ed6: 0x4049a820, 0x0ed7: 0x4049aa20, - 0x0ed9: 0x4049ac20, 0x0eda: 0x4049ae20, 0x0edb: 0x4049b020, - 0x0edc: 0x4049b220, 0x0edd: 0x4049b420, 0x0ede: 0x4049b620, 0x0edf: 0x4049b820, - 0x0ee1: 0x4049ba20, 0x0ee2: 0x4049bc20, 0x0ee3: 0x4049be20, - 0x0ee5: 0x4049c020, 0x0ee7: 0x4049c220, - 0x0eea: 0x40499c20, 0x0eeb: 0x4049c420, - 0x0eed: 0x4049c620, 0x0eee: 0x4049c820, 0x0eef: 0x4049ca20, - 0x0ef0: 0x4049cc20, 0x0ef1: 0x4049ce20, 0x0ef2: 0x4049d020, 0x0ef3: 0x4049d220, - 0x0ef4: 0x4049d420, 0x0ef5: 0x4049d620, 0x0ef6: 0x4049d820, 0x0ef7: 0x4049da20, - 0x0ef8: 0x827624ee, 0x0ef9: 0x827624ef, 0x0efb: 0x4049e020, - 0x0efc: 0x4049e220, 0x0efd: 0x4049e420, - // Block 0x3c, offset 0xf00 - 0x0f00: 0xc16c0541, 0x0f01: 0xc18c0541, 0x0f02: 0xc1ac0541, 0x0f03: 0xc1cc0541, - 0x0f04: 0xc1ec0541, 0x0f06: 0x4027ba20, - 0x0f08: 0xa7a10602, 0x0f09: 0xa7a10702, 0x0f0a: 0xa7a10802, 0x0f0b: 0xa7a10902, - 0x0f0c: 0xa0010a02, 0x0f0d: 0xc20c0641, - 0x0f10: 0xe000019d, 0x0f11: 0xe0000231, 0x0f12: 0xe0000349, 0x0f13: 0xe0000423, - 0x0f14: 0xe00004f8, 0x0f15: 0xe00005c2, 0x0f16: 0xe000068d, 0x0f17: 0xe0000735, - 0x0f18: 0xe00007e1, 0x0f19: 0xe0000886, - 0x0f1c: 0xf0000404, 0x0f1d: 0xf0000404, 0x0f1e: 0x40499020, 0x0f1f: 0x4049a020, - // Block 0x3d, offset 0xf40 - 0x0f40: 0xe000201a, 0x0f41: 0x40075e20, 0x0f42: 0x40076020, 0x0f43: 0x40076220, - 0x0f44: 0x40058220, 0x0f45: 0x40058420, 0x0f46: 0x40058620, 0x0f47: 0x40058820, - 0x0f48: 0x40058a20, 0x0f49: 0x40058c20, 0x0f4a: 0x40058e20, 0x0f4b: 0x40059420, - 0x0f4c: 0x0005949b, 0x0f4d: 0x40059620, 0x0f4e: 0x40059820, 0x0f4f: 0x40059a20, - 0x0f50: 0x40059c20, 0x0f51: 0x40059e20, 0x0f52: 0x4005a020, 0x0f53: 0x40076420, - 0x0f54: 0x4002aa20, 0x0f55: 0x40076620, 0x0f56: 0x40076820, 0x0f57: 0x40076a20, - 0x0f58: 0xadc00000, 0x0f59: 0xadc00000, 0x0f5a: 0x40076c20, 0x0f5b: 0x40076e20, - 0x0f5c: 0x40077020, 0x0f5d: 0x40077220, 0x0f5e: 0x40077420, 0x0f5f: 0x40077620, - 0x0f60: 0xe00001a0, 0x0f61: 0xe0000234, 0x0f62: 0xe000034c, 0x0f63: 0xe0000426, - 0x0f64: 0xe00004fb, 0x0f65: 0xe00005c5, 0x0f66: 0xe0000690, 0x0f67: 0xe0000738, - 0x0f68: 0xe00007e4, 0x0f69: 0xe0000889, 0x0f6a: 0xe0000237, 0x0f6b: 0xe000034f, - 0x0f6c: 0xe0000429, 0x0f6d: 0xe00004fe, 0x0f6e: 0xe00005c8, 0x0f6f: 0xe0000693, - 0x0f70: 0xe000073b, 0x0f71: 0xe00007e7, 0x0f72: 0xe000088c, 0x0f73: 0xe00001a3, - 0x0f74: 0x40077820, 0x0f75: 0xadc00000, 0x0f76: 0x40077a20, 0x0f77: 0xadc00000, - 0x0f78: 0x40077c20, 0x0f79: 0xad810e02, 0x0f7a: 0x40040020, 0x0f7b: 0x40040220, - 0x0f7c: 0x40040420, 0x0f7d: 0x40040620, 0x0f7e: 0xa0000000, 0x0f7f: 0xa0000000, - // Block 0x3e, offset 0xf80 - 0x0f80: 0x404a7620, 0x0f81: 0x404a7c20, 0x0f82: 0x404a8020, 0x0f83: 0xe0001fe4, - 0x0f84: 0x404a8420, 0x0f85: 0x404a8820, 0x0f86: 0x404a8c20, 0x0f87: 0x404a9020, - 0x0f89: 0x404a9420, 0x0f8a: 0x404a9820, 0x0f8b: 0x404a9c20, - 0x0f8c: 0x404aa020, 0x0f8d: 0xe0001fea, 0x0f8e: 0x404aa420, 0x0f8f: 0x404aa820, - 0x0f90: 0x404aac20, 0x0f91: 0x404ab020, 0x0f92: 0xe0001ff0, 0x0f93: 0x404ab420, - 0x0f94: 0x404ab820, 0x0f95: 0x404abc20, 0x0f96: 0x404ac020, 0x0f97: 0xe0001ff6, - 0x0f98: 0x404ac420, 0x0f99: 0x404ac820, 0x0f9a: 0x404acc20, 0x0f9b: 0x404ad020, - 0x0f9c: 0xe0001ffc, 0x0f9d: 0x404ad420, 0x0f9e: 0x404ad820, 0x0f9f: 0x404adc20, - 0x0fa0: 0x404ae020, 0x0fa1: 0x404ae420, 0x0fa2: 0x404ae820, 0x0fa3: 0x404aee20, - 0x0fa4: 0x404af220, 0x0fa5: 0x404af620, 0x0fa6: 0x404afa20, 0x0fa7: 0x404afe20, - 0x0fa8: 0x404b0220, 0x0fa9: 0xe0001fde, 0x0faa: 0xe0002008, 0x0fab: 0x404a7a20, - 0x0fac: 0x404aec20, - 0x0fb1: 0xc30f0751, 0x0fb2: 0x8282258c, 0x0fb3: 0x8281258d, - 0x0fb4: 0x82842590, 0x0fb5: 0x82812591, 0x0fb6: 0x404b2420, 0x0fb7: 0x404b2620, - 0x0fb8: 0x404b2820, 0x0fb9: 0x404b2a20, 0x0fba: 0x82822596, 0x0fbb: 0x82822597, - 0x0fbc: 0x82822598, 0x0fbd: 0x82822599, 0x0fbe: 0xa000f302, 0x0fbf: 0xa000f402, - // Block 0x3f, offset 0xfc0 - 0x0fc0: 0x8282258e, 0x0fc1: 0x8281258f, 0x0fc2: 0xae600000, 0x0fc3: 0xae600000, - 0x0fc4: 0x8209259a, 0x0fc5: 0x4005a220, 0x0fc6: 0xae600000, 0x0fc7: 0xae600000, - 0x0fc8: 0x404b0620, 0x0fc9: 0x404b0a20, 0x0fca: 0x404b1220, 0x0fcb: 0x404b1420, - 0x0fcc: 0x404b0e20, 0x0fcd: 0x404b0820, 0x0fce: 0x404b0c20, 0x0fcf: 0x404b1020, - 0x0fd0: 0x404a7820, 0x0fd1: 0x404a7e20, 0x0fd2: 0x404a8220, 0x0fd3: 0xe0001fe7, - 0x0fd4: 0x404a8620, 0x0fd5: 0x404a8a20, 0x0fd6: 0x404a8e20, 0x0fd7: 0x404a9220, - 0x0fd9: 0x404a9620, 0x0fda: 0x404a9a20, 0x0fdb: 0x404a9e20, - 0x0fdc: 0x404aa220, 0x0fdd: 0xe0001fed, 0x0fde: 0x404aa620, 0x0fdf: 0x404aaa20, - 0x0fe0: 0x404aae20, 0x0fe1: 0x404ab220, 0x0fe2: 0xe0001ff3, 0x0fe3: 0x404ab620, - 0x0fe4: 0x404aba20, 0x0fe5: 0x404abe20, 0x0fe6: 0x404ac220, 0x0fe7: 0xe0001ff9, - 0x0fe8: 0x404ac620, 0x0fe9: 0x404aca20, 0x0fea: 0x404ace20, 0x0feb: 0x404ad220, - 0x0fec: 0xe0001fff, 0x0fed: 0x404ad620, 0x0fee: 0x404ada20, 0x0fef: 0x404ade20, - 0x0ff0: 0x404ae220, 0x0ff1: 0x404ae620, 0x0ff2: 0xc30306a1, 0x0ff3: 0xc30906a1, - 0x0ff4: 0x404af420, 0x0ff5: 0x404af820, 0x0ff6: 0x404afc20, 0x0ff7: 0x404b0020, - 0x0ff8: 0x404b0420, 0x0ff9: 0xe0001fe1, 0x0ffa: 0xe0002002, 0x0ffb: 0xe0002005, - 0x0ffc: 0xe000200b, 0x0ffe: 0x40077e20, 0x0fff: 0x40078020, - // Block 0x40, offset 0x1000 - 0x1000: 0x40078220, 0x1001: 0x40078420, 0x1002: 0x40078620, 0x1003: 0x40078820, - 0x1004: 0x40078a20, 0x1005: 0x40078c20, 0x1006: 0xadc00000, 0x1007: 0x40078e20, - 0x1008: 0x40079020, 0x1009: 0x40079220, 0x100a: 0x40079420, 0x100b: 0x40079620, - 0x100c: 0x40079820, 0x100e: 0x40079a20, 0x100f: 0x40079c20, - 0x1010: 0x40059020, 0x1011: 0x40059220, 0x1012: 0x4005a420, 0x1013: 0x4005a620, - 0x1014: 0x4005a820, 0x1015: 0x40079e20, 0x1016: 0x4007a020, 0x1017: 0x4007a220, - 0x1018: 0x4007a420, 0x1019: 0x4005aa20, 0x101a: 0x4005ac20, - // Block 0x41, offset 0x1040 - 0x1040: 0x404e1420, 0x1041: 0x404e1820, 0x1042: 0x404e1c20, 0x1043: 0x404e2220, - 0x1044: 0x404e2420, 0x1045: 0x404e2820, 0x1046: 0x404e2e20, 0x1047: 0x404e3220, - 0x1048: 0x404e3a20, 0x1049: 0x404e4220, 0x104a: 0x404e4820, 0x104b: 0x404e4a20, - 0x104c: 0x404e4e20, 0x104d: 0x404e5220, 0x104e: 0x404e5620, 0x104f: 0x404e5a20, - 0x1050: 0x404e5e20, 0x1051: 0x404e6020, 0x1052: 0x404e6220, 0x1053: 0x404e6620, - 0x1054: 0x404e6a20, 0x1055: 0x404e7220, 0x1056: 0x404e7420, 0x1057: 0x404e7e20, - 0x1058: 0x404e8220, 0x1059: 0x404e8420, 0x105a: 0x404e8820, 0x105b: 0x404e8c20, - 0x105c: 0x404e9420, 0x105d: 0x404e9820, 0x105e: 0x404ea620, 0x105f: 0x404eaa20, - 0x1060: 0x404eb620, 0x1061: 0x404ec220, 0x1062: 0x404ec420, 0x1063: 0x404ec620, - 0x1064: 0x404ec820, 0x1065: 0xc31307b1, 0x1066: 0x404ecc20, 0x1067: 0x404ed620, - 0x1068: 0x404ed820, 0x1069: 0x404eda20, 0x106a: 0x404edc20, 0x106b: 0x004ede84, - 0x106c: 0x404ede20, 0x106d: 0x404ee620, 0x106e: 0x404eea20, 0x106f: 0x404eee20, - 0x1070: 0x404ef420, 0x1071: 0x404efe20, 0x1072: 0x404f0620, 0x1073: 0x404eec20, - 0x1074: 0x404f0a20, 0x1075: 0x404f0220, 0x1076: 0xa000f302, 0x1077: 0xa0711202, - 0x1078: 0xa000f402, 0x1079: 0x8209278a, 0x107a: 0x8209278b, 0x107b: 0x404e8a20, - 0x107c: 0x404e9220, 0x107d: 0x404e9a20, 0x107e: 0x404eb020, 0x107f: 0xe000201e, - // Block 0x42, offset 0x1080 - 0x1080: 0xe00001ac, 0x1081: 0xe0000240, 0x1082: 0xe0000358, 0x1083: 0xe0000432, - 0x1084: 0xe0000507, 0x1085: 0xe00005d1, 0x1086: 0xe000069c, 0x1087: 0xe0000744, - 0x1088: 0xe00007f0, 0x1089: 0xe0000895, 0x108a: 0x40032220, 0x108b: 0x40032420, - 0x108c: 0x4005b420, 0x108d: 0x4005b620, 0x108e: 0x4005b820, 0x108f: 0x4005ba20, - 0x1090: 0x404ea020, 0x1091: 0x404ea220, 0x1092: 0x404ece20, 0x1093: 0x404ed020, - 0x1094: 0x404ed220, 0x1095: 0x404ed420, 0x1096: 0x404ef620, 0x1097: 0x404ef820, - 0x1098: 0x404efa20, 0x1099: 0x404efc20, 0x109a: 0x404e2620, 0x109b: 0x404e3c20, - 0x109c: 0x404eb820, 0x109d: 0x404eba20, 0x109e: 0x404e7020, 0x109f: 0x404e8620, - 0x10a0: 0x404e9620, 0x10a1: 0x404e4020, 0x10a2: 0x404f0c20, 0x10a3: 0x404f1820, - 0x10a4: 0x404f1a20, 0x10a5: 0x404ea420, 0x10a6: 0x404ec020, 0x10a7: 0x404f0e20, - 0x10a8: 0x404f1020, 0x10a9: 0x404f1c20, 0x10aa: 0x404f1e20, 0x10ab: 0x404f2020, - 0x10ac: 0x404f2220, 0x10ad: 0x404f2420, 0x10ae: 0x404e5c20, 0x10af: 0x404ebc20, - 0x10b0: 0x404ebe20, 0x10b1: 0x404ee820, 0x10b2: 0x404ee220, 0x10b3: 0x404ef020, - 0x10b4: 0x404ef220, 0x10b5: 0x404e1620, 0x10b6: 0x404e1a20, 0x10b7: 0x404e1e20, - 0x10b8: 0x404e2a20, 0x10b9: 0x404e3620, 0x10ba: 0x404e4420, 0x10bb: 0x404e6420, - 0x10bc: 0x404e6c20, 0x10bd: 0x404e7620, 0x10be: 0x404e7820, 0x10bf: 0x404e8020, - // Block 0x43, offset 0x10c0 - 0x10c0: 0x404e9e20, 0x10c1: 0x404eac20, 0x10c2: 0x404e9c20, 0x10c3: 0x404ee020, - 0x10c4: 0x404f0020, 0x10c5: 0x404f0420, 0x10c6: 0x404f1220, 0x10c7: 0x404f2620, - 0x10c8: 0x404f2a20, 0x10c9: 0x404f2e20, 0x10ca: 0x404f3020, 0x10cb: 0x404f2820, - 0x10cc: 0x404f2c20, 0x10cd: 0xadc11302, 0x10ce: 0x404e7c20, 0x10cf: 0x404f3220, - 0x10d0: 0xe00001af, 0x10d1: 0xe0000243, 0x10d2: 0xe000035b, 0x10d3: 0xe0000435, - 0x10d4: 0xe000050a, 0x10d5: 0xe00005d4, 0x10d6: 0xe000069f, 0x10d7: 0xe0000747, - 0x10d8: 0xe00007f3, 0x10d9: 0xe0000898, 0x10da: 0x404f3420, 0x10db: 0x404f3620, - 0x10dc: 0x404ee420, 0x10dd: 0x404f0820, 0x10de: 0x4007a820, 0x10df: 0x4007aa20, - 0x10e0: 0x00379888, 0x10e1: 0x00379c88, 0x10e2: 0x0037a088, 0x10e3: 0x0037a488, - 0x10e4: 0x0037a888, 0x10e5: 0x0037ac88, 0x10e6: 0x0037b088, 0x10e7: 0x0037b888, - 0x10e8: 0x0037bc88, 0x10e9: 0x0037c088, 0x10ea: 0x0037c488, 0x10eb: 0x0037c888, - 0x10ec: 0x0037cc88, 0x10ed: 0x0037d488, 0x10ee: 0x0037d888, 0x10ef: 0x0037dc88, - 0x10f0: 0x0037e088, 0x10f1: 0x0037e488, 0x10f2: 0x0037e888, 0x10f3: 0x0037f088, - 0x10f4: 0x0037f488, 0x10f5: 0x0037f888, 0x10f6: 0x0037fc88, 0x10f7: 0x00380088, - 0x10f8: 0x00380488, 0x10f9: 0x00380888, 0x10fa: 0x00380c88, 0x10fb: 0x00381088, - 0x10fc: 0x00381488, 0x10fd: 0x00381888, 0x10fe: 0x00381c88, 0x10ff: 0x00382488, - // Block 0x44, offset 0x1100 - 0x1100: 0x00382888, 0x1101: 0x0037b488, 0x1102: 0x0037d088, 0x1103: 0x0037ec88, - 0x1104: 0x00382088, 0x1105: 0x00382c88, 0x1107: 0x00383288, - 0x110d: 0x00383c88, - 0x1110: 0x40379620, 0x1111: 0x40379a20, 0x1112: 0x40379e20, 0x1113: 0x4037a220, - 0x1114: 0x4037a620, 0x1115: 0x4037aa20, 0x1116: 0x4037ae20, 0x1117: 0x4037b620, - 0x1118: 0x4037ba20, 0x1119: 0x4037be20, 0x111a: 0x4037c220, 0x111b: 0x4037c620, - 0x111c: 0x4037ca20, 0x111d: 0x4037d220, 0x111e: 0x4037d620, 0x111f: 0x4037da20, - 0x1120: 0x4037de20, 0x1121: 0x4037e220, 0x1122: 0x4037e620, 0x1123: 0x4037ee20, - 0x1124: 0x4037f220, 0x1125: 0x4037f620, 0x1126: 0x4037fa20, 0x1127: 0x4037fe20, - 0x1128: 0x40380220, 0x1129: 0x40380620, 0x112a: 0x40380a20, 0x112b: 0x40380e20, - 0x112c: 0x40381220, 0x112d: 0x40381620, 0x112e: 0x40381a20, 0x112f: 0x40382220, - 0x1130: 0x40382620, 0x1131: 0x4037b220, 0x1132: 0x4037ce20, 0x1133: 0x4037ea20, - 0x1134: 0x40381e20, 0x1135: 0x40382a20, 0x1136: 0x40382e20, 0x1137: 0x40383020, - 0x1138: 0x40383420, 0x1139: 0x40383620, 0x113a: 0x40383820, 0x113b: 0x40036020, - 0x113c: 0x0037ca94, 0x113d: 0x40383a20, 0x113e: 0x40383e20, 0x113f: 0x40384020, - // Block 0x45, offset 0x1140 - 0x1140: 0x4062ac20, 0x1141: 0x4062ae20, 0x1142: 0x4062b020, 0x1143: 0x4062b220, - 0x1144: 0x4062b420, 0x1145: 0x4062b620, 0x1146: 0x4062b820, 0x1147: 0x4062ba20, - 0x1148: 0x4062bc20, 0x1149: 0x4062be20, 0x114a: 0x4062c020, 0x114b: 0x4062c220, - 0x114c: 0x4062c420, 0x114d: 0x4062c620, 0x114e: 0x4062c820, 0x114f: 0x4062ca20, - 0x1150: 0x4062cc20, 0x1151: 0x4062ce20, 0x1152: 0x4062d020, 0x1153: 0x4062d220, - 0x1154: 0x4062d420, 0x1155: 0x4062d620, 0x1156: 0x4062d820, 0x1157: 0x4062da20, - 0x1158: 0x4062dc20, 0x1159: 0x4062de20, 0x115a: 0x4062e020, 0x115b: 0x4062e220, - 0x115c: 0x4062e420, 0x115d: 0x4062e620, 0x115e: 0x4062e820, 0x115f: 0x4062ea20, - 0x1160: 0x4062ec20, 0x1161: 0x4062ee20, 0x1162: 0x4062f020, 0x1163: 0x4062f220, - 0x1164: 0x4062f420, 0x1165: 0x4062f620, 0x1166: 0x4062f820, 0x1167: 0x4062fa20, - 0x1168: 0x4062fc20, 0x1169: 0x4062fe20, 0x116a: 0x40630020, 0x116b: 0x40630220, - 0x116c: 0x40630420, 0x116d: 0x40630620, 0x116e: 0x40630820, 0x116f: 0x40630a20, - 0x1170: 0x40630c20, 0x1171: 0x40630e20, 0x1172: 0x40631020, 0x1173: 0x40631220, - 0x1174: 0x40631420, 0x1175: 0x40631620, 0x1176: 0x40631820, 0x1177: 0x40631a20, - 0x1178: 0x40631c20, 0x1179: 0x40631e20, 0x117a: 0x40632020, 0x117b: 0x40632220, - 0x117c: 0x40632420, 0x117d: 0x40632620, 0x117e: 0x40632820, 0x117f: 0x40632a20, - // Block 0x46, offset 0x1180 - 0x1180: 0x40632c20, 0x1181: 0x40632e20, 0x1182: 0x40633020, 0x1183: 0x40633220, - 0x1184: 0x40633420, 0x1185: 0x40633620, 0x1186: 0x40633820, 0x1187: 0x40633a20, - 0x1188: 0x40633c20, 0x1189: 0x40633e20, 0x118a: 0x40634020, 0x118b: 0x40634220, - 0x118c: 0x40634420, 0x118d: 0x40634620, 0x118e: 0x40634820, 0x118f: 0x40634a20, - 0x1190: 0x40634c20, 0x1191: 0x40634e20, 0x1192: 0x40635020, 0x1193: 0x40635220, - 0x1194: 0x40635420, 0x1195: 0x40635620, 0x1196: 0x40635820, 0x1197: 0x40635a20, - 0x1198: 0x40635c20, 0x1199: 0x40635e20, 0x119a: 0x40636020, 0x119b: 0x40636220, - 0x119c: 0x40636420, 0x119d: 0x40636620, 0x119e: 0x40636820, 0x119f: 0x4063a420, - 0x11a0: 0x4063a620, 0x11a1: 0x4063a820, 0x11a2: 0x4063aa20, 0x11a3: 0x4063ac20, - 0x11a4: 0x4063ae20, 0x11a5: 0x4063b020, 0x11a6: 0x4063b220, 0x11a7: 0x4063b420, - 0x11a8: 0x4063b620, 0x11a9: 0x4063b820, 0x11aa: 0x4063ba20, 0x11ab: 0x4063bc20, - 0x11ac: 0x4063be20, 0x11ad: 0x4063c020, 0x11ae: 0x4063c220, 0x11af: 0x4063c420, - 0x11b0: 0x4063c620, 0x11b1: 0x4063c820, 0x11b2: 0x4063ca20, 0x11b3: 0x4063cc20, - 0x11b4: 0x4063ce20, 0x11b5: 0x4063d020, 0x11b6: 0x4063d220, 0x11b7: 0x4063d420, - 0x11b8: 0x4063d620, 0x11b9: 0x4063d820, 0x11ba: 0x4063da20, 0x11bb: 0x4063dc20, - 0x11bc: 0x4063de20, 0x11bd: 0x4063e020, 0x11be: 0x4063e220, 0x11bf: 0x4063e420, - // Block 0x47, offset 0x11c0 - 0x11c0: 0x4063e620, 0x11c1: 0x4063e820, 0x11c2: 0x4063ea20, 0x11c3: 0x4063ec20, - 0x11c4: 0x4063ee20, 0x11c5: 0x4063f020, 0x11c6: 0x4063f220, 0x11c7: 0x4063f420, - 0x11c8: 0x4063f620, 0x11c9: 0x4063f820, 0x11ca: 0x4063fa20, 0x11cb: 0x4063fc20, - 0x11cc: 0x4063fe20, 0x11cd: 0x40640020, 0x11ce: 0x40640220, 0x11cf: 0x40640420, - 0x11d0: 0x40640620, 0x11d1: 0x40640820, 0x11d2: 0x40640a20, 0x11d3: 0x40640c20, - 0x11d4: 0x40640e20, 0x11d5: 0x40641020, 0x11d6: 0x40641220, 0x11d7: 0x40641420, - 0x11d8: 0x40641620, 0x11d9: 0x40641820, 0x11da: 0x40641a20, 0x11db: 0x40641c20, - 0x11dc: 0x40641e20, 0x11dd: 0x40642020, 0x11de: 0x40642220, 0x11df: 0x40642420, - 0x11e0: 0x40642620, 0x11e1: 0x40642820, 0x11e2: 0x40642a20, 0x11e3: 0x40642c20, - 0x11e4: 0x40642e20, 0x11e5: 0x40643020, 0x11e6: 0x40643220, 0x11e7: 0x40643420, - 0x11e8: 0x40646420, 0x11e9: 0x40646620, 0x11ea: 0x40646820, 0x11eb: 0x40646a20, - 0x11ec: 0x40646c20, 0x11ed: 0x40646e20, 0x11ee: 0x40647020, 0x11ef: 0x40647220, - 0x11f0: 0x40647420, 0x11f1: 0x40647620, 0x11f2: 0x40647820, 0x11f3: 0x40647a20, - 0x11f4: 0x40647c20, 0x11f5: 0x40647e20, 0x11f6: 0x40648020, 0x11f7: 0x40648220, - 0x11f8: 0x40648420, 0x11f9: 0x40648620, 0x11fa: 0x40648820, 0x11fb: 0x40648a20, - 0x11fc: 0x40648c20, 0x11fd: 0x40648e20, 0x11fe: 0x40649020, 0x11ff: 0x40649220, - // Block 0x48, offset 0x1200 - 0x1200: 0x40649420, 0x1201: 0x40649620, 0x1202: 0x40649820, 0x1203: 0x40649a20, - 0x1204: 0x40649c20, 0x1205: 0x40649e20, 0x1206: 0x4064a020, 0x1207: 0x4064a220, - 0x1208: 0x4064a420, 0x1209: 0x4064a620, 0x120a: 0x4064a820, 0x120b: 0x4064aa20, - 0x120c: 0x4064ac20, 0x120d: 0x4064ae20, 0x120e: 0x4064b020, 0x120f: 0x4064b220, - 0x1210: 0x4064b420, 0x1211: 0x4064b620, 0x1212: 0x4064b820, 0x1213: 0x4064ba20, - 0x1214: 0x4064bc20, 0x1215: 0x4064be20, 0x1216: 0x4064c020, 0x1217: 0x4064c220, - 0x1218: 0x4064c420, 0x1219: 0x4064c620, 0x121a: 0x4064c820, 0x121b: 0x4064ca20, - 0x121c: 0x4064cc20, 0x121d: 0x4064ce20, 0x121e: 0x4064d020, 0x121f: 0x4064d220, - 0x1220: 0x4064d420, 0x1221: 0x4064d620, 0x1222: 0x4064d820, 0x1223: 0x4064da20, - 0x1224: 0x4064dc20, 0x1225: 0x4064de20, 0x1226: 0x4064e020, 0x1227: 0x4064e220, - 0x1228: 0x4064e420, 0x1229: 0x4064e620, 0x122a: 0x4064e820, 0x122b: 0x4064ea20, - 0x122c: 0x4064ec20, 0x122d: 0x4064ee20, 0x122e: 0x4064f020, 0x122f: 0x4064f220, - 0x1230: 0x4064f420, 0x1231: 0x4064f620, 0x1232: 0x4064f820, 0x1233: 0x4064fa20, - 0x1234: 0x4064fc20, 0x1235: 0x4064fe20, 0x1236: 0x40650020, 0x1237: 0x40650220, - 0x1238: 0x40650420, 0x1239: 0x40650620, 0x123a: 0x40650820, 0x123b: 0x40650a20, - 0x123c: 0x40650c20, 0x123d: 0x40650e20, 0x123e: 0x40651020, 0x123f: 0x40651220, - // Block 0x49, offset 0x1240 - 0x1240: 0x403c2e20, 0x1241: 0x403c3020, 0x1242: 0x403c3220, 0x1243: 0x403c3420, - 0x1244: 0x403c3620, 0x1245: 0x403c3820, 0x1246: 0x403c3a20, 0x1247: 0x403c3c20, - 0x1248: 0x403c3e20, 0x1249: 0x403c4020, 0x124a: 0x403c4220, 0x124b: 0x403c4420, - 0x124c: 0x403c4620, 0x124d: 0x403c4820, 0x124e: 0x403c4a20, 0x124f: 0x403c4c20, - 0x1250: 0x403c5020, 0x1251: 0x403c5220, 0x1252: 0x403c5420, 0x1253: 0x403c5620, - 0x1254: 0x403c5820, 0x1255: 0x403c5a20, 0x1256: 0x403c5c20, 0x1257: 0x403c5e20, - 0x1258: 0x403c6020, 0x1259: 0x403c6220, 0x125a: 0x403c6420, 0x125b: 0x403c6620, - 0x125c: 0x403c6820, 0x125d: 0x403c6a20, 0x125e: 0x403c6c20, 0x125f: 0x403c6e20, - 0x1260: 0x403c7a20, 0x1261: 0x403c7c20, 0x1262: 0x403c7e20, 0x1263: 0x403c8020, - 0x1264: 0x403c8220, 0x1265: 0x403c8420, 0x1266: 0x403c8620, 0x1267: 0x403c8820, - 0x1268: 0x403c8a20, 0x1269: 0x403c8c20, 0x126a: 0x403c8e20, 0x126b: 0x403c9020, - 0x126c: 0x403c9220, 0x126d: 0x403c9420, 0x126e: 0x403c9620, 0x126f: 0x403c9820, - 0x1270: 0x403c9c20, 0x1271: 0x403c9e20, 0x1272: 0x403ca020, 0x1273: 0x403ca220, - 0x1274: 0x403ca420, 0x1275: 0x403ca620, 0x1276: 0x403ca820, 0x1277: 0x403caa20, - 0x1278: 0x403cba20, 0x1279: 0x403cbc20, 0x127a: 0x403cbe20, 0x127b: 0x403cc020, - 0x127c: 0x403cc220, 0x127d: 0x403cc420, 0x127e: 0x403cc620, 0x127f: 0x403cc820, - // Block 0x4a, offset 0x1280 - 0x1280: 0x403ccc20, 0x1281: 0x403cce20, 0x1282: 0x403cd020, 0x1283: 0x403cd220, - 0x1284: 0x403cd420, 0x1285: 0x403cd620, 0x1286: 0x403cd820, 0x1287: 0x403cda20, - 0x1288: 0x403cdc20, 0x128a: 0x403cde20, 0x128b: 0x403ce020, - 0x128c: 0x403ce220, 0x128d: 0x403ce420, - 0x1290: 0x403ce620, 0x1291: 0x403ce820, 0x1292: 0x403cea20, 0x1293: 0x403cec20, - 0x1294: 0x403cee20, 0x1295: 0x403cf020, 0x1296: 0x403cf220, - 0x1298: 0x403cf420, 0x129a: 0x403cf620, 0x129b: 0x403cf820, - 0x129c: 0x403cfa20, 0x129d: 0x403cfc20, - 0x12a0: 0x403cfe20, 0x12a1: 0x403d0020, 0x12a2: 0x403d0220, 0x12a3: 0x403d0420, - 0x12a4: 0x403d0620, 0x12a5: 0x403d0820, 0x12a6: 0x403d0a20, 0x12a7: 0x403d0c20, - 0x12a8: 0x403d1820, 0x12a9: 0x403d1a20, 0x12aa: 0x403d1c20, 0x12ab: 0x403d1e20, - 0x12ac: 0x403d2020, 0x12ad: 0x403d2220, 0x12ae: 0x403d2420, 0x12af: 0x403d2620, - 0x12b0: 0x403d2820, 0x12b1: 0x403d2a20, 0x12b2: 0x403d2c20, 0x12b3: 0x403d2e20, - 0x12b4: 0x403d3020, 0x12b5: 0x403d3220, 0x12b6: 0x403d3420, 0x12b7: 0x403d3620, - 0x12b8: 0x403d3a20, 0x12b9: 0x403d3c20, 0x12ba: 0x403d3e20, 0x12bb: 0x403d4020, - 0x12bc: 0x403d4220, 0x12bd: 0x403d4420, 0x12be: 0x403d4620, 0x12bf: 0x403d4820, - // Block 0x4b, offset 0x12c0 - 0x12c0: 0x403d4c20, 0x12c1: 0x403d4e20, 0x12c2: 0x403d5020, 0x12c3: 0x403d5220, - 0x12c4: 0x403d5420, 0x12c5: 0x403d5620, 0x12c6: 0x403d5820, 0x12c7: 0x403d5a20, - 0x12c8: 0x403d5c20, 0x12ca: 0x403d5e20, 0x12cb: 0x403d6020, - 0x12cc: 0x403d6220, 0x12cd: 0x403d6420, - 0x12d0: 0x403d6620, 0x12d1: 0x403d6820, 0x12d2: 0x403d6a20, 0x12d3: 0x403d6c20, - 0x12d4: 0x403d6e20, 0x12d5: 0x403d7020, 0x12d6: 0x403d7220, 0x12d7: 0x403d7420, - 0x12d8: 0x403d7820, 0x12d9: 0x403d7a20, 0x12da: 0x403d7c20, 0x12db: 0x403d7e20, - 0x12dc: 0x403d8020, 0x12dd: 0x403d8220, 0x12de: 0x403d8420, 0x12df: 0x403d8620, - 0x12e0: 0x403d8a20, 0x12e1: 0x403d8c20, 0x12e2: 0x403d8e20, 0x12e3: 0x403d9020, - 0x12e4: 0x403d9220, 0x12e5: 0x403d9420, 0x12e6: 0x403d9620, 0x12e7: 0x403d9820, - 0x12e8: 0x403d9c20, 0x12e9: 0x403d9e20, 0x12ea: 0x403da020, 0x12eb: 0x403da220, - 0x12ec: 0x403da420, 0x12ed: 0x403da620, 0x12ee: 0x403da820, 0x12ef: 0x403daa20, - 0x12f0: 0x403dac20, 0x12f2: 0x403dae20, 0x12f3: 0x403db020, - 0x12f4: 0x403db220, 0x12f5: 0x403db420, - 0x12f8: 0x403db620, 0x12f9: 0x403db820, 0x12fa: 0x403dba20, 0x12fb: 0x403dbc20, - 0x12fc: 0x403dbe20, 0x12fd: 0x403dc020, 0x12fe: 0x403dc220, - // Block 0x4c, offset 0x1300 - 0x1300: 0x403dc420, 0x1302: 0x403dc620, 0x1303: 0x403dc820, - 0x1304: 0x403dca20, 0x1305: 0x403dcc20, - 0x1308: 0x403dce20, 0x1309: 0x403dd020, 0x130a: 0x403dd220, 0x130b: 0x403dd420, - 0x130c: 0x403dd620, 0x130d: 0x403dd820, 0x130e: 0x403dda20, 0x130f: 0x403ddc20, - 0x1310: 0x403dde20, 0x1311: 0x403de020, 0x1312: 0x403de220, 0x1313: 0x403de420, - 0x1314: 0x403de620, 0x1315: 0x403de820, 0x1316: 0x403dea20, - 0x1318: 0x403dec20, 0x1319: 0x403dee20, 0x131a: 0x403df020, 0x131b: 0x403df220, - 0x131c: 0x403df420, 0x131d: 0x403df620, 0x131e: 0x403df820, 0x131f: 0x403dfa20, - 0x1320: 0x403e0a20, 0x1321: 0x403e0c20, 0x1322: 0x403e0e20, 0x1323: 0x403e1020, - 0x1324: 0x403e1220, 0x1325: 0x403e1420, 0x1326: 0x403e1620, 0x1327: 0x403e1820, - 0x1328: 0x403e1a20, 0x1329: 0x403e1c20, 0x132a: 0x403e1e20, 0x132b: 0x403e2020, - 0x132c: 0x403e2220, 0x132d: 0x403e2420, 0x132e: 0x403e2620, 0x132f: 0x403e2820, - 0x1330: 0x403e2a20, 0x1331: 0x403e2c20, 0x1332: 0x403e2e20, 0x1333: 0x403e3020, - 0x1334: 0x403e3220, 0x1335: 0x403e3420, 0x1336: 0x403e3620, 0x1337: 0x403e3820, - 0x1338: 0x403e4820, 0x1339: 0x403e4a20, 0x133a: 0x403e4c20, 0x133b: 0x403e4e20, - 0x133c: 0x403e5020, 0x133d: 0x403e5220, 0x133e: 0x403e5420, 0x133f: 0x403e5620, - // Block 0x4d, offset 0x1340 - 0x1340: 0x403e5a20, 0x1341: 0x403e5c20, 0x1342: 0x403e5e20, 0x1343: 0x403e6020, - 0x1344: 0x403e6220, 0x1345: 0x403e6420, 0x1346: 0x403e6620, 0x1347: 0x403e6820, - 0x1348: 0x403e6c20, 0x1349: 0x403e6e20, 0x134a: 0x403e7020, 0x134b: 0x403e7220, - 0x134c: 0x403e7420, 0x134d: 0x403e7620, 0x134e: 0x403e7820, 0x134f: 0x403e7a20, - 0x1350: 0x403e7c20, 0x1352: 0x403e7e20, 0x1353: 0x403e8020, - 0x1354: 0x403e8220, 0x1355: 0x403e8420, - 0x1358: 0x403e8620, 0x1359: 0x403e8820, 0x135a: 0x403e8a20, 0x135b: 0x403e8c20, - 0x135c: 0x403e8e20, 0x135d: 0x403e9020, 0x135e: 0x403e9220, 0x135f: 0x403e9420, - 0x1360: 0x403e9e20, 0x1361: 0x403ea020, 0x1362: 0x403ea220, 0x1363: 0x403ea420, - 0x1364: 0x403ea620, 0x1365: 0x403ea820, 0x1366: 0x403eaa20, 0x1367: 0x403eac20, - 0x1368: 0x403eb020, 0x1369: 0x403eb220, 0x136a: 0x403eb420, 0x136b: 0x403eb620, - 0x136c: 0x403eb820, 0x136d: 0x403eba20, 0x136e: 0x403ebc20, 0x136f: 0x403ebe20, - 0x1370: 0x403ed020, 0x1371: 0x403ed220, 0x1372: 0x403ed420, 0x1373: 0x403ed620, - 0x1374: 0x403ed820, 0x1375: 0x403eda20, 0x1376: 0x403edc20, 0x1377: 0x403ede20, - 0x1378: 0x403ee220, 0x1379: 0x403ee420, 0x137a: 0x403ee620, 0x137b: 0x403ee820, - 0x137c: 0x403eea20, 0x137d: 0x403eec20, 0x137e: 0x403eee20, 0x137f: 0x403ef020, - // Block 0x4e, offset 0x1380 - 0x1380: 0x403f0020, 0x1381: 0x403f0220, 0x1382: 0x403f0420, 0x1383: 0x403f0620, - 0x1384: 0x403f0820, 0x1385: 0x403f0a20, 0x1386: 0x403f0c20, 0x1387: 0x403f0e20, - 0x1388: 0x403f1020, 0x1389: 0x403f1220, 0x138a: 0x403f1420, 0x138b: 0x403f1620, - 0x138c: 0x403f1820, 0x138d: 0x403f1a20, 0x138e: 0x403f1c20, 0x138f: 0x403f1e20, - 0x1390: 0x403f2820, 0x1391: 0x403f2a20, 0x1392: 0x403f2c20, 0x1393: 0x403f2e20, - 0x1394: 0x403f3020, 0x1395: 0x403f3220, 0x1396: 0x403f3420, 0x1397: 0x403f3620, - 0x1398: 0x403f4220, 0x1399: 0x403f4420, 0x139a: 0x403f4620, - 0x139d: 0xae60ee02, 0x139e: 0xae60ed02, 0x139f: 0xae60ec02, - 0x13a0: 0x40036220, 0x13a1: 0x40029c20, 0x13a2: 0x4002ee20, 0x13a3: 0x40029e20, - 0x13a4: 0x4002a020, 0x13a5: 0x4002a220, 0x13a6: 0x4002a420, 0x13a7: 0x4002d020, - 0x13a8: 0x40036420, 0x13a9: 0xe00001f2, 0x13aa: 0xe000030d, 0x13ab: 0xe00003e7, - 0x13ac: 0xe00004c2, 0x13ad: 0xe000058c, 0x13ae: 0xe0000657, 0x13af: 0xe00006ff, - 0x13b0: 0xe00007ab, 0x13b1: 0xe0000850, 0x13b2: 0x40286620, 0x13b3: 0x40286820, - 0x13b4: 0x40286a20, 0x13b5: 0x40286c20, 0x13b6: 0x40286e20, 0x13b7: 0x40287020, - 0x13b8: 0x40287220, 0x13b9: 0x40287420, 0x13ba: 0x40287620, 0x13bb: 0x40287820, - 0x13bc: 0x40287a20, - // Block 0x4f, offset 0x13c0 - 0x13c0: 0x403c7020, 0x13c1: 0x403c7220, 0x13c2: 0x403c7420, 0x13c3: 0x403c7620, - 0x13c4: 0x403d0e20, 0x13c5: 0x403d1020, 0x13c6: 0x403d1220, 0x13c7: 0x403d1420, - 0x13c8: 0x403f2020, 0x13c9: 0x403f2220, 0x13ca: 0x403f2420, 0x13cb: 0x403f2620, - 0x13cc: 0x403f3820, 0x13cd: 0x403f3a20, 0x13ce: 0x403f3c20, 0x13cf: 0x403f3e20, - 0x13d0: 0x4006a620, 0x13d1: 0x4006a820, 0x13d2: 0x4006aa20, 0x13d3: 0x4006ac20, - 0x13d4: 0x4006ae20, 0x13d5: 0x4006b020, 0x13d6: 0x4006b220, 0x13d7: 0x4006b420, - 0x13d8: 0x4006b620, 0x13d9: 0x4006b820, - 0x13e0: 0x40547620, 0x13e1: 0x40547820, 0x13e2: 0x40547a20, 0x13e3: 0x40547c20, - 0x13e4: 0x40547e20, 0x13e5: 0x40548020, 0x13e6: 0x40548220, 0x13e7: 0x40548420, - 0x13e8: 0x40548620, 0x13e9: 0x40548820, 0x13ea: 0x40548a20, 0x13eb: 0x40548c20, - 0x13ec: 0x40548e20, 0x13ed: 0x40549020, 0x13ee: 0x40549220, 0x13ef: 0x40549420, - 0x13f0: 0x40549620, 0x13f1: 0x40549820, 0x13f2: 0x40549a20, 0x13f3: 0x40549c20, - 0x13f4: 0x40549e20, 0x13f5: 0x4054a020, 0x13f6: 0x4054a220, 0x13f7: 0x4054a420, - 0x13f8: 0x4054a620, 0x13f9: 0x4054a820, 0x13fa: 0x4054aa20, 0x13fb: 0x4054ac20, - 0x13fc: 0x4054ae20, 0x13fd: 0x4054b020, 0x13fe: 0x4054b220, 0x13ff: 0x4054b420, - // Block 0x50, offset 0x1400 - 0x1400: 0x4054b620, 0x1401: 0x4054b820, 0x1402: 0x4054ba20, 0x1403: 0x4054bc20, - 0x1404: 0x4054be20, 0x1405: 0x4054c020, 0x1406: 0x4054c220, 0x1407: 0x4054c420, - 0x1408: 0x4054c620, 0x1409: 0x4054c820, 0x140a: 0x4054ca20, 0x140b: 0x4054cc20, - 0x140c: 0x4054ce20, 0x140d: 0x4054d020, 0x140e: 0x4054d220, 0x140f: 0x4054d420, - 0x1410: 0x4054d620, 0x1411: 0x4054d820, 0x1412: 0x4054da20, 0x1413: 0x4054dc20, - 0x1414: 0x4054de20, 0x1415: 0x4054e020, 0x1416: 0x4054e220, 0x1417: 0x4054e420, - 0x1418: 0x4054e620, 0x1419: 0x4054e820, 0x141a: 0x4054ea20, 0x141b: 0x4054ec20, - 0x141c: 0x4054ee20, 0x141d: 0x4054f020, 0x141e: 0x4054f220, 0x141f: 0x4054f420, - 0x1420: 0x4054f620, 0x1421: 0x4054f820, 0x1422: 0x4054fa20, 0x1423: 0x4054fc20, - 0x1424: 0x4054fe20, 0x1425: 0x40550020, 0x1426: 0x40550220, 0x1427: 0x40550420, - 0x1428: 0x40550620, 0x1429: 0x40550820, 0x142a: 0x40550a20, 0x142b: 0x40550c20, - 0x142c: 0x40550e20, 0x142d: 0x40551020, 0x142e: 0x40551220, 0x142f: 0x40551420, - 0x1430: 0x40551620, 0x1431: 0x40551820, 0x1432: 0x40551a20, 0x1433: 0x40551c20, - 0x1434: 0x40551e20, - // Block 0x51, offset 0x1440 - 0x1440: 0x40021e20, 0x1441: 0x40552020, 0x1442: 0x40552220, 0x1443: 0x40552420, - 0x1444: 0x40552620, 0x1445: 0x40552820, 0x1446: 0x40552a20, 0x1447: 0x40552c20, - 0x1448: 0x40552e20, 0x1449: 0x40553020, 0x144a: 0x40553220, 0x144b: 0x40553420, - 0x144c: 0x40553620, 0x144d: 0x40553820, 0x144e: 0x40553a20, 0x144f: 0x40553c20, - 0x1450: 0x40553e20, 0x1451: 0x40554020, 0x1452: 0x40554220, 0x1453: 0x40554420, - 0x1454: 0x40554620, 0x1455: 0x40554820, 0x1456: 0x40554a20, 0x1457: 0x40554c20, - 0x1458: 0x40554e20, 0x1459: 0x40555020, 0x145a: 0x40555220, 0x145b: 0x40555420, - 0x145c: 0x40555620, 0x145d: 0x40555820, 0x145e: 0x40555a20, 0x145f: 0x40555c20, - 0x1460: 0x40555e20, 0x1461: 0x40556020, 0x1462: 0x40556220, 0x1463: 0x40556420, - 0x1464: 0x40556620, 0x1465: 0x40556820, 0x1466: 0x40556a20, 0x1467: 0x40556c20, - 0x1468: 0x40556e20, 0x1469: 0x40557020, 0x146a: 0x40557220, 0x146b: 0x40557420, - 0x146c: 0x40557620, 0x146d: 0x40557820, 0x146e: 0x40557a20, 0x146f: 0x40557c20, - 0x1470: 0x40557e20, 0x1471: 0x40558020, 0x1472: 0x40558220, 0x1473: 0x40558420, - 0x1474: 0x40558620, 0x1475: 0x40558820, 0x1476: 0x40558a20, 0x1477: 0x40558c20, - 0x1478: 0x40558e20, 0x1479: 0x40559020, 0x147a: 0x40559220, 0x147b: 0x40559420, - 0x147c: 0x40559620, 0x147d: 0x40559820, 0x147e: 0x40559a20, 0x147f: 0x40559c20, - // Block 0x52, offset 0x1480 - 0x1480: 0x40559e20, 0x1481: 0x4055a020, 0x1482: 0x4055a220, 0x1483: 0x4055a420, - 0x1484: 0x4055a620, 0x1485: 0x4055a820, 0x1486: 0x4055aa20, 0x1487: 0x4055ac20, - 0x1488: 0x4055ae20, 0x1489: 0x4055b020, 0x148a: 0x4055b220, 0x148b: 0x4055b420, - 0x148c: 0x4055b620, 0x148d: 0x4055b820, 0x148e: 0x4055ba20, 0x148f: 0x4055bc20, - 0x1490: 0x4055be20, 0x1491: 0x4055c020, 0x1492: 0x4055c220, 0x1493: 0x4055c420, - 0x1494: 0x4055c620, 0x1495: 0x4055c820, 0x1496: 0x4055ca20, 0x1497: 0x4055cc20, - 0x1498: 0x4055ce20, 0x1499: 0x4055d020, 0x149a: 0x4055d220, 0x149b: 0x4055d420, - 0x149c: 0x4055d620, 0x149d: 0x4055d820, 0x149e: 0x4055da20, 0x149f: 0x4055dc20, - 0x14a0: 0x4055de20, 0x14a1: 0x4055e020, 0x14a2: 0x4055e220, 0x14a3: 0x4055e420, - 0x14a4: 0x4055e620, 0x14a5: 0x4055e820, 0x14a6: 0x4055ea20, 0x14a7: 0x4055ec20, - 0x14a8: 0x4055ee20, 0x14a9: 0x4055f020, 0x14aa: 0x4055f220, 0x14ab: 0x4055f420, - 0x14ac: 0x4055f620, 0x14ad: 0x4055f820, 0x14ae: 0x4055fa20, 0x14af: 0x4055fc20, - 0x14b0: 0x4055fe20, 0x14b1: 0x40560020, 0x14b2: 0x40560220, 0x14b3: 0x40560420, - 0x14b4: 0x40560620, 0x14b5: 0x40560820, 0x14b6: 0x40560a20, 0x14b7: 0x40560c20, - 0x14b8: 0x40560e20, 0x14b9: 0x40561020, 0x14ba: 0x40561220, 0x14bb: 0x40561420, - 0x14bc: 0x40561620, 0x14bd: 0x40561820, 0x14be: 0x40561a20, 0x14bf: 0x40561c20, - // Block 0x53, offset 0x14c0 - 0x14c0: 0x40561e20, 0x14c1: 0x40562020, 0x14c2: 0x40562220, 0x14c3: 0x40562420, - 0x14c4: 0x40562620, 0x14c5: 0x40562820, 0x14c6: 0x40562a20, 0x14c7: 0x40562c20, - 0x14c8: 0x40562e20, 0x14c9: 0x40563020, 0x14ca: 0x40563220, 0x14cb: 0x40563420, - 0x14cc: 0x40563620, 0x14cd: 0x40563820, 0x14ce: 0x40563a20, 0x14cf: 0x40563c20, - 0x14d0: 0x40563e20, 0x14d1: 0x40564020, 0x14d2: 0x40564220, 0x14d3: 0x40564420, - 0x14d4: 0x40564620, 0x14d5: 0x40564820, 0x14d6: 0x40564a20, 0x14d7: 0x40564c20, - 0x14d8: 0x40564e20, 0x14d9: 0x40565020, 0x14da: 0x40565220, 0x14db: 0x40565420, - 0x14dc: 0x40565620, 0x14dd: 0x40565820, 0x14de: 0x40565a20, 0x14df: 0x40565c20, - 0x14e0: 0x40565e20, 0x14e1: 0x40566020, 0x14e2: 0x40566220, 0x14e3: 0x40566420, - 0x14e4: 0x40566620, 0x14e5: 0x40566820, 0x14e6: 0x40566a20, 0x14e7: 0x40566c20, - 0x14e8: 0x40566e20, 0x14e9: 0x40567020, 0x14ea: 0x40567220, 0x14eb: 0x40567420, - 0x14ec: 0x40567620, 0x14ed: 0x40567820, 0x14ee: 0x40567a20, 0x14ef: 0x40567c20, - 0x14f0: 0x40567e20, 0x14f1: 0x40568020, 0x14f2: 0x40568220, 0x14f3: 0x40568420, - 0x14f4: 0x40568620, 0x14f5: 0x40568820, 0x14f6: 0x40568a20, 0x14f7: 0x40568c20, - 0x14f8: 0x40568e20, 0x14f9: 0x40569020, 0x14fa: 0x40569220, 0x14fb: 0x40569420, - 0x14fc: 0x40569620, 0x14fd: 0x40569820, 0x14fe: 0x40569a20, 0x14ff: 0x40569c20, - // Block 0x54, offset 0x1500 - 0x1500: 0x40569e20, 0x1501: 0x4056a020, 0x1502: 0x4056a220, 0x1503: 0x4056a420, - 0x1504: 0x4056a620, 0x1505: 0x4056a820, 0x1506: 0x4056aa20, 0x1507: 0x4056ac20, - 0x1508: 0x4056ae20, 0x1509: 0x4056b020, 0x150a: 0x4056b220, 0x150b: 0x4056b420, - 0x150c: 0x4056b620, 0x150d: 0x4056b820, 0x150e: 0x4056ba20, 0x150f: 0x4056bc20, - 0x1510: 0x4056be20, 0x1511: 0x4056c020, 0x1512: 0x4056c220, 0x1513: 0x4056c420, - 0x1514: 0x4056c620, 0x1515: 0x4056c820, 0x1516: 0x4056ca20, 0x1517: 0x4056cc20, - 0x1518: 0x4056ce20, 0x1519: 0x4056d020, 0x151a: 0x4056d220, 0x151b: 0x4056d420, - 0x151c: 0x4056d620, 0x151d: 0x4056d820, 0x151e: 0x4056da20, 0x151f: 0x4056dc20, - 0x1520: 0x4056de20, 0x1521: 0x4056e020, 0x1522: 0x4056e220, 0x1523: 0x4056e420, - 0x1524: 0x4056e620, 0x1525: 0x4056e820, 0x1526: 0x4056ea20, 0x1527: 0x4056ec20, - 0x1528: 0x4056ee20, 0x1529: 0x4056f020, 0x152a: 0x4056f220, 0x152b: 0x4056f420, - 0x152c: 0x4056f620, 0x152d: 0x4056f820, 0x152e: 0x4056fa20, 0x152f: 0x4056fc20, - 0x1530: 0x4056fe20, 0x1531: 0x40570020, 0x1532: 0x40570220, 0x1533: 0x40570420, - 0x1534: 0x40570620, 0x1535: 0x40570820, 0x1536: 0x40570a20, 0x1537: 0x40570c20, - 0x1538: 0x40570e20, 0x1539: 0x40571020, 0x153a: 0x40571220, 0x153b: 0x40571420, - 0x153c: 0x40571620, 0x153d: 0x40571820, 0x153e: 0x40571a20, 0x153f: 0x40571c20, - // Block 0x55, offset 0x1540 - 0x1540: 0x40571e20, 0x1541: 0x40572020, 0x1542: 0x40572220, 0x1543: 0x40572420, - 0x1544: 0x40572620, 0x1545: 0x40572820, 0x1546: 0x40572a20, 0x1547: 0x40572c20, - 0x1548: 0x40572e20, 0x1549: 0x40573020, 0x154a: 0x40573220, 0x154b: 0x40573420, - 0x154c: 0x40573620, 0x154d: 0x40573820, 0x154e: 0x40573a20, 0x154f: 0x40573c20, - 0x1550: 0x40573e20, 0x1551: 0x40574020, 0x1552: 0x40574220, 0x1553: 0x40574420, - 0x1554: 0x40574620, 0x1555: 0x40574820, 0x1556: 0x40574a20, 0x1557: 0x40574c20, - 0x1558: 0x40574e20, 0x1559: 0x40575020, 0x155a: 0x40575220, 0x155b: 0x40575420, - 0x155c: 0x40575620, 0x155d: 0x40575820, 0x155e: 0x40575a20, 0x155f: 0x40575c20, - 0x1560: 0x40575e20, 0x1561: 0x40576020, 0x1562: 0x40576220, 0x1563: 0x40576420, - 0x1564: 0x40576620, 0x1565: 0x40576820, 0x1566: 0x40576a20, 0x1567: 0x40576c20, - 0x1568: 0x40576e20, 0x1569: 0x40577020, 0x156a: 0x40577220, 0x156b: 0x40577420, - 0x156c: 0x40577620, 0x156d: 0x40577820, 0x156e: 0x40577a20, 0x156f: 0x40577c20, - 0x1570: 0x40577e20, 0x1571: 0x40578020, 0x1572: 0x40578220, 0x1573: 0x40578420, - 0x1574: 0x40578620, 0x1575: 0x40578820, 0x1576: 0x40578a20, 0x1577: 0x40578c20, - 0x1578: 0x40578e20, 0x1579: 0x40579020, 0x157a: 0x40579220, 0x157b: 0x40579420, - 0x157c: 0x40579620, 0x157d: 0x40579820, 0x157e: 0x40579a20, 0x157f: 0x40579c20, - // Block 0x56, offset 0x1580 - 0x1580: 0x40579e20, 0x1581: 0x4057a020, 0x1582: 0x4057a220, 0x1583: 0x4057a420, - 0x1584: 0x4057a620, 0x1585: 0x4057a820, 0x1586: 0x4057aa20, 0x1587: 0x4057ac20, - 0x1588: 0x4057ae20, 0x1589: 0x4057b020, 0x158a: 0x4057b220, 0x158b: 0x4057b420, - 0x158c: 0x4057b620, 0x158d: 0x4057b820, 0x158e: 0x4057ba20, 0x158f: 0x4057bc20, - 0x1590: 0x4057be20, 0x1591: 0x4057c020, 0x1592: 0x4057c220, 0x1593: 0x4057c420, - 0x1594: 0x4057c620, 0x1595: 0x4057c820, 0x1596: 0x4057ca20, 0x1597: 0x4057cc20, - 0x1598: 0x4057ce20, 0x1599: 0x4057d020, 0x159a: 0x4057d220, 0x159b: 0x4057d420, - 0x159c: 0x4057d620, 0x159d: 0x4057d820, 0x159e: 0x4057da20, 0x159f: 0x4057dc20, - 0x15a0: 0x4057de20, 0x15a1: 0x4057e020, 0x15a2: 0x4057e220, 0x15a3: 0x4057e420, - 0x15a4: 0x4057e620, 0x15a5: 0x4057e820, 0x15a6: 0x4057ea20, 0x15a7: 0x4057ec20, - 0x15a8: 0x4057ee20, 0x15a9: 0x4057f020, 0x15aa: 0x4057f220, 0x15ab: 0x4057f420, - 0x15ac: 0x4057f620, 0x15ad: 0x4057f820, 0x15ae: 0x4057fa20, 0x15af: 0x4057fc20, - 0x15b0: 0x4057fe20, 0x15b1: 0x40580020, 0x15b2: 0x40580220, 0x15b3: 0x40580420, - 0x15b4: 0x40580620, 0x15b5: 0x40580820, 0x15b6: 0x40580a20, 0x15b7: 0x40580c20, - 0x15b8: 0x40580e20, 0x15b9: 0x40581020, 0x15ba: 0x40581220, 0x15bb: 0x40581420, - 0x15bc: 0x40587a20, 0x15bd: 0x40581620, 0x15be: 0x40581a20, 0x15bf: 0x40581c20, - // Block 0x57, offset 0x15c0 - 0x15c0: 0x40581e20, 0x15c1: 0x40582020, 0x15c2: 0x40582220, 0x15c3: 0x40582420, - 0x15c4: 0x40582620, 0x15c5: 0x40582820, 0x15c6: 0x40582a20, 0x15c7: 0x40582c20, - 0x15c8: 0x40582e20, 0x15c9: 0x40583020, 0x15ca: 0x40583220, 0x15cb: 0x40583420, - 0x15cc: 0x40583620, 0x15cd: 0x40583820, 0x15ce: 0x40583c20, 0x15cf: 0x40583e20, - 0x15d0: 0x40584020, 0x15d1: 0x40584220, 0x15d2: 0x40584420, 0x15d3: 0x40584620, - 0x15d4: 0x40584820, 0x15d5: 0x40584a20, 0x15d6: 0x40585820, 0x15d7: 0x40585a20, - 0x15d8: 0x40585c20, 0x15d9: 0x40585e20, 0x15da: 0x40586020, 0x15db: 0x40586220, - 0x15dc: 0x40586420, 0x15dd: 0x40586620, 0x15de: 0x40586820, 0x15df: 0x40586a20, - 0x15e0: 0x40586c20, 0x15e1: 0x40586e20, 0x15e2: 0x40587020, 0x15e3: 0x40587220, - 0x15e4: 0x40587420, 0x15e5: 0x40587620, 0x15e6: 0x40587820, 0x15e7: 0x40587c20, - 0x15e8: 0x40587e20, 0x15e9: 0x40588020, 0x15ea: 0x40588220, 0x15eb: 0x40588420, - 0x15ec: 0x40588620, 0x15ed: 0x40588820, 0x15ee: 0x40588a20, 0x15ef: 0x40588c20, - 0x15f0: 0x40588e20, 0x15f1: 0x40589020, 0x15f2: 0x40589220, 0x15f3: 0x40589420, - 0x15f4: 0x40589620, 0x15f5: 0x40589820, 0x15f6: 0x40589a20, 0x15f7: 0x40589c20, - 0x15f8: 0x40589e20, 0x15f9: 0x4058a020, 0x15fa: 0x4058a220, 0x15fb: 0x4058a420, - 0x15fc: 0x4058a620, 0x15fd: 0x4058a820, 0x15fe: 0x4058aa20, 0x15ff: 0x4058ac20, - // Block 0x58, offset 0x1600 - 0x1600: 0x4058ae20, 0x1601: 0x4058b020, 0x1602: 0x4058b220, 0x1603: 0x4058b420, - 0x1604: 0x4058b620, 0x1605: 0x4058b820, 0x1606: 0x4058ba20, 0x1607: 0x4058bc20, - 0x1608: 0x4058be20, 0x1609: 0x4058c020, 0x160a: 0x4058c220, 0x160b: 0x4058c420, - 0x160c: 0x4058c620, 0x160d: 0x4058c820, 0x160e: 0x4058ca20, 0x160f: 0x4058cc20, - 0x1610: 0x4058ce20, 0x1611: 0x4058d020, 0x1612: 0x4058d220, 0x1613: 0x4058d420, - 0x1614: 0x4058d620, 0x1615: 0x4058d820, 0x1616: 0x4058da20, 0x1617: 0x4058dc20, - 0x1618: 0x4058de20, 0x1619: 0x4058e020, 0x161a: 0x4058e220, 0x161b: 0x4058e420, - 0x161c: 0x4058e620, 0x161d: 0x4058e820, 0x161e: 0x4058ea20, 0x161f: 0x4058ec20, - 0x1620: 0x4058ee20, 0x1621: 0x4058f020, 0x1622: 0x4058f220, 0x1623: 0x4058f420, - 0x1624: 0x4058f620, 0x1625: 0x4058f820, 0x1626: 0x4058fa20, 0x1627: 0x4058fc20, - 0x1628: 0x4058fe20, 0x1629: 0x40590020, 0x162a: 0x40590220, 0x162b: 0x40590420, - 0x162c: 0x40590620, 0x162d: 0x40590820, 0x162e: 0x40590a20, 0x162f: 0x40590c20, - 0x1630: 0x40590e20, 0x1631: 0x40591020, 0x1632: 0x40591220, 0x1633: 0x40591420, - 0x1634: 0x40591620, 0x1635: 0x40591820, 0x1636: 0x40591a20, 0x1637: 0x40591c20, - 0x1638: 0x40591e20, 0x1639: 0x40592020, 0x163a: 0x40592220, 0x163b: 0x40592420, - 0x163c: 0x40592620, 0x163d: 0x40592820, 0x163e: 0x40592a20, 0x163f: 0x40592c20, - // Block 0x59, offset 0x1640 - 0x1640: 0x40592e20, 0x1641: 0x40593020, 0x1642: 0x40593220, 0x1643: 0x40593420, - 0x1644: 0x40593620, 0x1645: 0x40593820, 0x1646: 0x40593a20, 0x1647: 0x40593c20, - 0x1648: 0x40593e20, 0x1649: 0x40594020, 0x164a: 0x40594220, 0x164b: 0x40594420, - 0x164c: 0x40594620, 0x164d: 0x40594820, 0x164e: 0x40594a20, 0x164f: 0x40594c20, - 0x1650: 0x40594e20, 0x1651: 0x40595020, 0x1652: 0x40595220, 0x1653: 0x40595420, - 0x1654: 0x40595620, 0x1655: 0x40595820, 0x1656: 0x40595a20, 0x1657: 0x40595c20, - 0x1658: 0x40595e20, 0x1659: 0x40596020, 0x165a: 0x40596220, 0x165b: 0x40596420, - 0x165c: 0x40596620, 0x165d: 0x40596820, 0x165e: 0x40596a20, 0x165f: 0x40596c20, - 0x1660: 0x40596e20, 0x1661: 0x40597020, 0x1662: 0x40597220, 0x1663: 0x40597420, - 0x1664: 0x40597620, 0x1665: 0x40597820, 0x1666: 0x40597a20, 0x1667: 0x40597c20, - 0x1668: 0x40597e20, 0x1669: 0x40598020, 0x166a: 0x40598220, 0x166b: 0x40598420, - 0x166c: 0x40598620, 0x166d: 0x40598820, 0x166e: 0x40598a20, 0x166f: 0x40598c20, - 0x1670: 0x40598e20, 0x1671: 0x40599020, 0x1672: 0x40599220, 0x1673: 0x40599420, - 0x1674: 0x40599620, 0x1675: 0x40599820, 0x1676: 0x40599a20, 0x1677: 0x40599c20, - 0x1678: 0x40599e20, 0x1679: 0x4059a020, 0x167a: 0x4059a220, 0x167b: 0x4059a420, - 0x167c: 0x4059a620, 0x167d: 0x4059a820, 0x167e: 0x4059aa20, 0x167f: 0x4059ac20, - // Block 0x5a, offset 0x1680 - 0x1680: 0x4059ae20, 0x1681: 0x4059b020, 0x1682: 0x4059b220, 0x1683: 0x4059b420, - 0x1684: 0x4059b620, 0x1685: 0x4059b820, 0x1686: 0x4059ba20, 0x1687: 0x4059bc20, - 0x1688: 0x4059be20, 0x1689: 0x4059c020, 0x168a: 0x4059c220, 0x168b: 0x4059c420, - 0x168c: 0x4059c620, 0x168d: 0x4059c820, 0x168e: 0x4059ca20, 0x168f: 0x4059cc20, - 0x1690: 0x4059ce20, 0x1691: 0x4059d020, 0x1692: 0x4059d220, 0x1693: 0x4059d420, - 0x1694: 0x4059d620, 0x1695: 0x4059d820, 0x1696: 0x4059da20, 0x1697: 0x4059dc20, - 0x1698: 0x4059de20, 0x1699: 0x4059e020, 0x169a: 0x4059e220, 0x169b: 0x4059e420, - 0x169c: 0x4059e620, 0x169d: 0x4059e820, 0x169e: 0x4059ea20, 0x169f: 0x4059ec20, - 0x16a0: 0x4059ee20, 0x16a1: 0x4059f020, 0x16a2: 0x4059f220, 0x16a3: 0x4059f420, - 0x16a4: 0x4059f620, 0x16a5: 0x4059f820, 0x16a6: 0x4059fa20, 0x16a7: 0x4059fc20, - 0x16a8: 0x4059fe20, 0x16a9: 0x405a0020, 0x16aa: 0x405a0220, 0x16ab: 0x405a0420, - 0x16ac: 0x405a0620, 0x16ad: 0x4005d420, 0x16ae: 0x4002f420, 0x16af: 0x40581820, - 0x16b0: 0x40583a20, 0x16b1: 0x40584c20, 0x16b2: 0x40584e20, 0x16b3: 0x40585020, - 0x16b4: 0x40585220, 0x16b5: 0x40585420, 0x16b6: 0x40585620, 0x16b7: 0x405a0820, - 0x16b8: 0x405a0a20, 0x16b9: 0x405a0c20, 0x16ba: 0x405a0e20, 0x16bb: 0x405a1020, - 0x16bc: 0x405a1220, 0x16bd: 0x405a1420, 0x16be: 0x405a1620, 0x16bf: 0x405a1820, - // Block 0x5b, offset 0x16c0 - 0x16c0: 0x00021284, 0x16c1: 0x405aa620, 0x16c2: 0x405aa820, 0x16c3: 0x405aaa20, - 0x16c4: 0x405aac20, 0x16c5: 0x405aae20, 0x16c6: 0x405ab020, 0x16c7: 0x405ab220, - 0x16c8: 0x405ab420, 0x16c9: 0x405ab620, 0x16ca: 0x405ab820, 0x16cb: 0x405aba20, - 0x16cc: 0x405abc20, 0x16cd: 0x405abe20, 0x16ce: 0x405ac020, 0x16cf: 0x405ac220, - 0x16d0: 0x405ac420, 0x16d1: 0x405ac620, 0x16d2: 0x405ac820, 0x16d3: 0x405aca20, - 0x16d4: 0x405acc20, 0x16d5: 0x405ace20, 0x16d6: 0x405ad020, 0x16d7: 0x405ad220, - 0x16d8: 0x405ad420, 0x16d9: 0x405ad620, 0x16da: 0x405ad820, 0x16db: 0x40040820, - 0x16dc: 0x40040a20, - 0x16e0: 0x405ada20, 0x16e1: 0xe000202d, 0x16e2: 0x405adc20, 0x16e3: 0x405b1420, - 0x16e4: 0xe0002030, 0x16e5: 0xe0002033, 0x16e6: 0x405ade20, 0x16e7: 0xe0002036, - 0x16e8: 0x405ae020, 0x16e9: 0xe000203c, 0x16ea: 0x405b1020, 0x16eb: 0x405b1220, - 0x16ec: 0xe000203f, 0x16ed: 0xe0002042, 0x16ee: 0xe0002045, 0x16ef: 0x405ae220, - 0x16f0: 0x405ae420, 0x16f1: 0x405ae620, 0x16f2: 0x405ae820, 0x16f3: 0xe0002048, - 0x16f4: 0xe000204b, 0x16f5: 0xe000204e, 0x16f6: 0xe0002051, 0x16f7: 0x405aea20, - 0x16f8: 0x405b1a20, 0x16f9: 0x405aec20, 0x16fa: 0x405aee20, 0x16fb: 0xe0002057, - 0x16fc: 0xe000205a, 0x16fd: 0xe000205d, 0x16fe: 0x405af020, 0x16ff: 0xe0002060, - // Block 0x5c, offset 0x1700 - 0x1700: 0xe0002063, 0x1701: 0x405af220, 0x1702: 0xe0002066, 0x1703: 0x405af420, - 0x1704: 0xe0002069, 0x1705: 0x405af620, 0x1706: 0xe000206c, 0x1707: 0x405af820, - 0x1708: 0x405afa20, 0x1709: 0x405afc20, 0x170a: 0x405afe20, 0x170b: 0xe0002075, - 0x170c: 0xe000207b, 0x170d: 0xe000207e, 0x170e: 0xe0002081, 0x170f: 0x405b0020, - 0x1710: 0xe0002084, 0x1711: 0xe0002087, 0x1712: 0x405b0220, 0x1713: 0xe000208a, - 0x1714: 0xe000208d, 0x1715: 0xe0002072, 0x1716: 0x405b0420, 0x1717: 0x405b0620, - 0x1718: 0xe0002090, 0x1719: 0xe0002093, 0x171a: 0x405b0820, 0x171b: 0xe000209b, - 0x171c: 0x405b0a20, 0x171d: 0xe000209e, 0x171e: 0x405b0c20, 0x171f: 0x405b0e20, - 0x1720: 0x405b1620, 0x1721: 0x405b1e20, 0x1722: 0x405b2020, 0x1723: 0x405b1820, - 0x1724: 0x405b1c20, 0x1725: 0x405b2220, 0x1726: 0x405b2420, 0x1727: 0xe00020a1, - 0x1728: 0xe00020a4, 0x1729: 0xe0002054, 0x172a: 0xe0002078, 0x172b: 0x4002b220, - 0x172c: 0x4002b420, 0x172d: 0x4002b620, 0x172e: 0xe000206f, 0x172f: 0xe0002096, - 0x1730: 0xe0002039, - // Block 0x5d, offset 0x1740 - 0x1740: 0x404c7620, 0x1741: 0x404c7820, 0x1742: 0x404c7a20, 0x1743: 0x404c7c20, - 0x1744: 0x404c7e20, 0x1745: 0x404c8020, 0x1746: 0x404c8220, 0x1747: 0x404c8420, - 0x1748: 0x404c8620, 0x1749: 0x404c8820, 0x174a: 0x404c8a20, 0x174b: 0x404c8c20, - 0x174c: 0x404c8e20, 0x174e: 0x404c9020, 0x174f: 0x404c9220, - 0x1750: 0x404c9420, 0x1751: 0x404c9620, 0x1752: 0x404c9820, 0x1753: 0x404c9a20, - 0x1754: 0x8209264e, - 0x1760: 0x404c9e20, 0x1761: 0x404ca020, 0x1762: 0x404ca220, 0x1763: 0x404ca420, - 0x1764: 0x404ca620, 0x1765: 0x404ca820, 0x1766: 0x404caa20, 0x1767: 0x404cac20, - 0x1768: 0x404cae20, 0x1769: 0x404cb020, 0x176a: 0x404cb220, 0x176b: 0x404cb420, - 0x176c: 0x404cb620, 0x176d: 0x404cb820, 0x176e: 0x404cba20, 0x176f: 0x404cbc20, - 0x1770: 0x404cbe20, 0x1771: 0x404cc020, 0x1772: 0x404cc220, 0x1773: 0x404cc420, - 0x1774: 0x82092663, 0x1775: 0x40031c20, 0x1776: 0x40031e20, - // Block 0x5e, offset 0x1780 - 0x1780: 0x404cc820, 0x1781: 0x404cca20, 0x1782: 0x404ccc20, 0x1783: 0x404cce20, - 0x1784: 0x404cd020, 0x1785: 0x404cd220, 0x1786: 0x404cd420, 0x1787: 0x404cd620, - 0x1788: 0x404cd820, 0x1789: 0x404cda20, 0x178a: 0x404cdc20, 0x178b: 0x404cde20, - 0x178c: 0x404ce020, 0x178d: 0x404ce220, 0x178e: 0x404ce420, 0x178f: 0x404ce620, - 0x1790: 0x404ce820, 0x1791: 0x404cea20, 0x1792: 0x404cec20, 0x1793: 0x404cee20, - 0x17a0: 0x404cf020, 0x17a1: 0x404cf220, 0x17a2: 0x404cf420, 0x17a3: 0x404cf620, - 0x17a4: 0x404cf820, 0x17a5: 0x404cfa20, 0x17a6: 0x404cfc20, 0x17a7: 0x404cfe20, - 0x17a8: 0x404d0020, 0x17a9: 0x404d0220, 0x17aa: 0x404d0420, 0x17ab: 0x404d0620, - 0x17ac: 0x404d0820, 0x17ae: 0x404d0a20, 0x17af: 0x404d0c20, - 0x17b0: 0x404d0e20, 0x17b2: 0x404d1020, 0x17b3: 0x404d1220, - // Block 0x5f, offset 0x17c0 - 0x17c0: 0x404fa420, 0x17c1: 0x404fa620, 0x17c2: 0x404fa820, 0x17c3: 0x404faa20, - 0x17c4: 0x404fac20, 0x17c5: 0x404fae20, 0x17c6: 0x404fb020, 0x17c7: 0x404fb220, - 0x17c8: 0x404fb420, 0x17c9: 0x404fb620, 0x17ca: 0x404fb820, 0x17cb: 0x404fba20, - 0x17cc: 0x404fbc20, 0x17cd: 0x404fbe20, 0x17ce: 0x404fc020, 0x17cf: 0x404fc220, - 0x17d0: 0x404fc420, 0x17d1: 0x404fc620, 0x17d2: 0x404fc820, 0x17d3: 0x404fca20, - 0x17d4: 0x404fcc20, 0x17d5: 0x404fce20, 0x17d6: 0x404fd020, 0x17d7: 0x404fd220, - 0x17d8: 0x404fd420, 0x17d9: 0x404fd620, 0x17da: 0x404fd820, 0x17db: 0x404fda20, - 0x17dc: 0x404fdc20, 0x17dd: 0x404fde20, 0x17de: 0x404fe020, 0x17df: 0x404fe220, - 0x17e0: 0x404fe420, 0x17e1: 0x404fe620, 0x17e2: 0x404fe820, 0x17e3: 0x404fec20, - 0x17e4: 0x404fee20, 0x17e5: 0x404ff020, 0x17e6: 0x404ff220, 0x17e7: 0x404ff420, - 0x17e8: 0x404ff620, 0x17e9: 0x404ff820, 0x17ea: 0x404ffa20, 0x17eb: 0x404ffc20, - 0x17ec: 0x404ffe20, 0x17ed: 0x40500020, 0x17ee: 0x40500220, 0x17ef: 0x40500420, - 0x17f0: 0x40500620, 0x17f1: 0x40500820, 0x17f2: 0x40500a20, 0x17f3: 0x40500c20, - 0x17f4: 0xa0000000, 0x17f5: 0xa0000000, 0x17f6: 0x40500e20, 0x17f7: 0x40501020, - 0x17f8: 0x40501220, 0x17f9: 0x40501420, 0x17fa: 0x40501620, 0x17fb: 0x40501820, - 0x17fc: 0x40501a20, 0x17fd: 0x40501c20, 0x17fe: 0x40501e20, 0x17ff: 0x40502020, - // Block 0x60, offset 0x1800 - 0x1800: 0x40502220, 0x1801: 0x40502420, 0x1802: 0x40502620, 0x1803: 0x40502820, - 0x1804: 0x40502a20, 0x1805: 0x40502c20, 0x1806: 0xa000f302, 0x1807: 0xa000f402, - 0x1808: 0xa0011402, 0x1809: 0xa0011502, 0x180a: 0xa0011602, 0x180b: 0xa0005f02, - 0x180c: 0xa0005f02, 0x180d: 0xa0005f02, 0x180e: 0xa0005f02, 0x180f: 0xa0005f02, - 0x1810: 0xa0005f02, 0x1811: 0xa0005f02, 0x1812: 0x82092817, 0x1813: 0xa0000000, - 0x1814: 0x40032620, 0x1815: 0x40032820, 0x1816: 0x4002ac20, 0x1817: 0x4027bc20, - 0x1818: 0x4005bc20, 0x1819: 0x4005be20, 0x181a: 0x4005c020, 0x181b: 0x4027f620, - 0x181c: 0x404fea20, 0x181d: 0xae605f02, - 0x1820: 0xe00001b5, 0x1821: 0xe0000249, 0x1822: 0xe0000361, 0x1823: 0xe000043b, - 0x1824: 0xe0000510, 0x1825: 0xe00005da, 0x1826: 0xe00006a5, 0x1827: 0xe000074d, - 0x1828: 0xe00007f9, 0x1829: 0xe000089e, - 0x1830: 0xe00001b8, 0x1831: 0xe000024c, 0x1832: 0xe0000364, 0x1833: 0xe000043e, - 0x1834: 0xe0000513, 0x1835: 0xe00005dd, 0x1836: 0xe00006a8, 0x1837: 0xe0000750, - 0x1838: 0xe00007fc, 0x1839: 0xe00008a1, - // Block 0x61, offset 0x1840 - 0x1840: 0x40056a20, 0x1841: 0x4002e620, 0x1842: 0x40025220, 0x1843: 0x4002f020, - 0x1844: 0x4002a620, 0x1845: 0x4002a820, 0x1846: 0x40022220, 0x1847: 0x40022420, - 0x1848: 0x40025420, 0x1849: 0x4002f220, 0x184a: 0xa0000000, 0x184b: 0xa0000000, - 0x184c: 0xa0000000, 0x184d: 0xa0000000, 0x184e: 0x40020c20, - 0x1850: 0xe00001c7, 0x1851: 0xe000025b, 0x1852: 0xe0000373, 0x1853: 0xe000044d, - 0x1854: 0xe0000522, 0x1855: 0xe00005ec, 0x1856: 0xe00006b7, 0x1857: 0xe000075f, - 0x1858: 0xe000080b, 0x1859: 0xe00008b0, - 0x1860: 0x40533820, 0x1861: 0x40533c20, 0x1862: 0x40534220, 0x1863: 0x40534e20, - 0x1864: 0x40535220, 0x1865: 0x40535820, 0x1866: 0x40535c20, 0x1867: 0x40536220, - 0x1868: 0x40536420, 0x1869: 0x40536620, 0x186a: 0x40537020, 0x186b: 0x40537420, - 0x186c: 0x40537a20, 0x186d: 0x40537e20, 0x186e: 0x40538820, 0x186f: 0x40538c20, - 0x1870: 0x40538e20, 0x1871: 0x40539020, 0x1872: 0x40539e20, 0x1873: 0x4053a420, - 0x1874: 0x4053aa20, 0x1875: 0x4053b420, 0x1876: 0x4053bc20, 0x1877: 0x4053c220, - 0x1878: 0x4053c620, 0x1879: 0x4053ca20, 0x187a: 0x4053d020, 0x187b: 0x4053da20, - 0x187c: 0x4053dc20, 0x187d: 0x4053e220, 0x187e: 0x4053ea20, 0x187f: 0x4053f020, - // Block 0x62, offset 0x1880 - 0x1880: 0x4053f220, 0x1881: 0x4053f420, 0x1882: 0x4053f620, 0x1883: 0x40533620, - 0x1884: 0x40533e20, 0x1885: 0x40534420, 0x1886: 0x40535020, 0x1887: 0x40535420, - 0x1888: 0x40535a20, 0x1889: 0x40535e20, 0x188a: 0x40536820, 0x188b: 0x40537220, - 0x188c: 0x40537620, 0x188d: 0x40537c20, 0x188e: 0x40538020, 0x188f: 0x40538a20, - 0x1890: 0x4053a020, 0x1891: 0x4053a620, 0x1892: 0x4053ac20, 0x1893: 0x4053b620, - 0x1894: 0x4053de20, 0x1895: 0x4053be20, 0x1896: 0x4053c820, 0x1897: 0x4053d220, - 0x1898: 0x4053e620, 0x1899: 0x4053ec20, 0x189a: 0x4053f820, 0x189b: 0x4053fa20, - 0x189c: 0x4053b020, 0x189d: 0x40534020, 0x189e: 0x40534620, 0x189f: 0x40534c20, - 0x18a0: 0x40536020, 0x18a1: 0x40535620, 0x18a2: 0x40536a20, 0x18a3: 0x4053d420, - 0x18a4: 0x40538220, 0x18a5: 0x40538620, 0x18a6: 0x40537820, 0x18a7: 0x40539220, - 0x18a8: 0x4053a220, 0x18a9: 0x4053a820, 0x18aa: 0x4053b820, 0x18ab: 0x4053cc20, - 0x18ac: 0x4053e820, 0x18ad: 0x4053ee20, 0x18ae: 0x4053e020, 0x18af: 0x4053e420, - 0x18b0: 0x4053fc20, 0x18b1: 0x4053ae20, 0x18b2: 0x4053c020, 0x18b3: 0x40534820, - 0x18b4: 0x4053d620, 0x18b5: 0x4053c420, 0x18b6: 0x4053ce20, 0x18b7: 0x4053ba20, - // Block 0x63, offset 0x18c0 - 0x18c0: 0x40532820, 0x18c1: 0x40532a20, 0x18c2: 0x40532c20, 0x18c3: 0x40532e20, - 0x18c4: 0x40533020, 0x18c5: 0x40533220, 0x18c6: 0x40533420, 0x18c7: 0x40533a20, - 0x18c8: 0x40534a20, 0x18c9: 0x4053d820, 0x18ca: 0x40536c20, 0x18cb: 0x4053b220, - 0x18cc: 0x4053fe20, 0x18cd: 0x40540220, 0x18ce: 0x40540420, 0x18cf: 0x40540820, - 0x18d0: 0x40540a20, 0x18d1: 0x40541020, 0x18d2: 0x40541420, 0x18d3: 0x40541620, - 0x18d4: 0x40541a20, 0x18d5: 0x40541e20, 0x18d6: 0x40542220, 0x18d7: 0x40542420, - 0x18d8: 0x40540c20, 0x18d9: 0x40542020, 0x18da: 0x40538420, 0x18db: 0x40536e20, - 0x18dc: 0x40539420, 0x18dd: 0x40539620, 0x18de: 0x40540020, 0x18df: 0x40540620, - 0x18e0: 0x40540e20, 0x18e1: 0x40541220, 0x18e2: 0x40539820, 0x18e3: 0x40541c20, - 0x18e4: 0x40539a20, 0x18e5: 0x40539c20, 0x18e6: 0x40542620, 0x18e7: 0x40542820, - 0x18e8: 0x40541820, 0x18e9: 0x82e42a16, 0x18ea: 0x40542a20, - 0x18f0: 0x405a1a20, 0x18f1: 0x405a1c20, 0x18f2: 0x405a1e20, 0x18f3: 0x405a2020, - 0x18f4: 0x405a2220, 0x18f5: 0x405a2420, 0x18f6: 0x405a2620, 0x18f7: 0x405a2820, - 0x18f8: 0x405a2a20, 0x18f9: 0x405a2c20, 0x18fa: 0x405a2e20, 0x18fb: 0x405a3020, - 0x18fc: 0x405a3220, 0x18fd: 0x405a3420, 0x18fe: 0x405a3620, 0x18ff: 0x405a3820, - // Block 0x64, offset 0x1900 - 0x1900: 0x405a3a20, 0x1901: 0x405a3c20, 0x1902: 0x405a3e20, 0x1903: 0x405a4020, - 0x1904: 0x405a4220, 0x1905: 0x405a4420, 0x1906: 0x405a4620, 0x1907: 0x405a4820, - 0x1908: 0x405a4a20, 0x1909: 0x405a4c20, 0x190a: 0x405a4e20, 0x190b: 0x405a5020, - 0x190c: 0x405a5220, 0x190d: 0x405a5420, 0x190e: 0x405a5620, 0x190f: 0x405a5820, - 0x1910: 0x405a5a20, 0x1911: 0x405a5c20, 0x1912: 0x405a5e20, 0x1913: 0x405a6020, - 0x1914: 0x405a6220, 0x1915: 0x405a6420, 0x1916: 0x405a6620, 0x1917: 0x405a6820, - 0x1918: 0x405a6a20, 0x1919: 0x405a6c20, 0x191a: 0x405a6e20, 0x191b: 0x405a7020, - 0x191c: 0x405a7220, 0x191d: 0x405a7420, 0x191e: 0x405a7620, 0x191f: 0x405a7820, - 0x1920: 0x405a7a20, 0x1921: 0x405a7c20, 0x1922: 0x405a7e20, 0x1923: 0x405a8020, - 0x1924: 0x405a8220, 0x1925: 0x405a8420, 0x1926: 0x405a8620, 0x1927: 0x405a8820, - 0x1928: 0x405a8a20, 0x1929: 0x405a8c20, 0x192a: 0x405a8e20, 0x192b: 0x405a9020, - 0x192c: 0x405a9220, 0x192d: 0x405a9420, 0x192e: 0x405a9620, 0x192f: 0x405a9820, - 0x1930: 0x405a9a20, 0x1931: 0x405a9c20, 0x1932: 0x405a9e20, 0x1933: 0x405aa020, - 0x1934: 0x405aa220, 0x1935: 0x405aa420, - // Block 0x65, offset 0x1940 - 0x1940: 0x404c1220, 0x1941: 0x404c1420, 0x1942: 0x404c1620, 0x1943: 0x404c1820, - 0x1944: 0x404c1a20, 0x1945: 0x404c1c20, 0x1946: 0x404c1e20, 0x1947: 0x404c2020, - 0x1948: 0x404c2220, 0x1949: 0x404c2420, 0x194a: 0x404c2620, 0x194b: 0x404c2820, - 0x194c: 0x404c2a20, 0x194d: 0x404c2c20, 0x194e: 0x404c2e20, 0x194f: 0x404c3020, - 0x1950: 0x404c3220, 0x1951: 0x404c3420, 0x1952: 0x404c3620, 0x1953: 0x404c3820, - 0x1954: 0x404c3a20, 0x1955: 0x404c3c20, 0x1956: 0x404c3e20, 0x1957: 0x404c4020, - 0x1958: 0x404c4220, 0x1959: 0x404c4420, 0x195a: 0x404c4620, 0x195b: 0x404c4820, - 0x195c: 0x404c4a20, - 0x1960: 0x404c4c20, 0x1961: 0x404c4e20, 0x1962: 0x404c5020, 0x1963: 0x404c5220, - 0x1964: 0x404c5420, 0x1965: 0x404c5620, 0x1966: 0x404c5820, 0x1967: 0x404c5a20, - 0x1968: 0x404c5c20, 0x1969: 0x404c5e20, 0x196a: 0x404c6020, 0x196b: 0x404c6220, - 0x1970: 0x404c6420, 0x1971: 0x404c6620, 0x1972: 0x404c6820, 0x1973: 0x404c6a20, - 0x1974: 0x404c6c20, 0x1975: 0x404c6e20, 0x1976: 0x404c7020, 0x1977: 0x404c7220, - 0x1978: 0x404c7420, 0x1979: 0xade11f02, 0x197a: 0xae612002, 0x197b: 0xadc12102, - // Block 0x66, offset 0x1980 - 0x1980: 0x4007a620, - 0x1984: 0x4002c220, 0x1985: 0x4002d220, 0x1986: 0xe000018e, 0x1987: 0xe000021f, - 0x1988: 0xe000033a, 0x1989: 0xe0000414, 0x198a: 0xe00004e9, 0x198b: 0xe00005b3, - 0x198c: 0xe000067e, 0x198d: 0xe0000726, 0x198e: 0xe00007d2, 0x198f: 0xe0000877, - 0x1990: 0x40503020, 0x1991: 0x40503220, 0x1992: 0x40503420, 0x1993: 0x40503620, - 0x1994: 0x40503820, 0x1995: 0x40503a20, 0x1996: 0x40503c20, 0x1997: 0x40503e20, - 0x1998: 0x40504020, 0x1999: 0x40504220, 0x199a: 0x40504420, 0x199b: 0x40504620, - 0x199c: 0x40504820, 0x199d: 0x40504a20, 0x199e: 0x40504c20, 0x199f: 0x40504e20, - 0x19a0: 0x40505020, 0x19a1: 0x40505220, 0x19a2: 0x40505420, 0x19a3: 0x40505620, - 0x19a4: 0x40505820, 0x19a5: 0x40505a20, 0x19a6: 0x40505c20, 0x19a7: 0x40505e20, - 0x19a8: 0x40506020, 0x19a9: 0x40506220, 0x19aa: 0x40506420, 0x19ab: 0x40506620, - 0x19ac: 0x40506820, 0x19ad: 0x40506a20, - 0x19b0: 0x40506c20, 0x19b1: 0x40506e20, 0x19b2: 0x40507020, 0x19b3: 0x40507220, - 0x19b4: 0x40507420, - // Block 0x67, offset 0x19c0 - 0x19c0: 0x40507620, 0x19c1: 0x40507820, 0x19c2: 0x40507a20, 0x19c3: 0x40507c20, - 0x19c4: 0x40507e20, 0x19c5: 0x40508020, 0x19c6: 0x40508220, 0x19c7: 0x40508420, - 0x19c8: 0x40508620, 0x19c9: 0x40508820, 0x19ca: 0x40508a20, 0x19cb: 0x40508c20, - 0x19cc: 0x40508e20, 0x19cd: 0x40509020, 0x19ce: 0x40509220, 0x19cf: 0x40509420, - 0x19d0: 0x40509620, 0x19d1: 0x40509820, 0x19d2: 0x40509a20, 0x19d3: 0x40509c20, - 0x19d4: 0x40509e20, 0x19d5: 0x4050a020, 0x19d6: 0x4050a220, 0x19d7: 0x4050a420, - 0x19d8: 0x4050a620, 0x19d9: 0x4050a820, 0x19da: 0x4050aa20, 0x19db: 0x4050ac20, - 0x19dc: 0x4050ae20, 0x19dd: 0x4050b020, 0x19de: 0x4050b220, 0x19df: 0x4050b420, - 0x19e0: 0x4050b620, 0x19e1: 0x4050b820, 0x19e2: 0x4050ba20, 0x19e3: 0x4050bc20, - 0x19e4: 0x4050be20, 0x19e5: 0x4050c020, 0x19e6: 0x4050c220, 0x19e7: 0x4050c420, - 0x19e8: 0x4050c620, 0x19e9: 0x4050c820, 0x19ea: 0x4050ca20, 0x19eb: 0x4050cc20, - 0x19f0: 0x4050ce20, 0x19f1: 0x4050d020, 0x19f2: 0x4050d220, 0x19f3: 0x4050d420, - 0x19f4: 0x4050d620, 0x19f5: 0x4050d820, 0x19f6: 0x4050da20, 0x19f7: 0x4050dc20, - 0x19f8: 0x4050de20, 0x19f9: 0x4050e020, 0x19fa: 0x4050e220, 0x19fb: 0x4050e420, - 0x19fc: 0x4050e620, 0x19fd: 0x4050e820, 0x19fe: 0x4050ea20, 0x19ff: 0x4050ec20, - // Block 0x68, offset 0x1a00 - 0x1a00: 0x4050ee20, 0x1a01: 0x4050f020, 0x1a02: 0x4050f220, 0x1a03: 0x4050f420, - 0x1a04: 0x4050f620, 0x1a05: 0x4050f820, 0x1a06: 0x4050fa20, 0x1a07: 0x4050fc20, - 0x1a08: 0x4050fe20, 0x1a09: 0x40510020, - 0x1a10: 0xe0000191, 0x1a11: 0xe0000222, 0x1a12: 0xe000033d, 0x1a13: 0xe0000417, - 0x1a14: 0xe00004ec, 0x1a15: 0xe00005b6, 0x1a16: 0xe0000681, 0x1a17: 0xe0000729, - 0x1a18: 0xe00007d5, 0x1a19: 0xe000087a, 0x1a1a: 0xe0000225, - 0x1a1e: 0xe0002022, 0x1a1f: 0xe0002025, - 0x1a20: 0x4007b220, 0x1a21: 0x4007b420, 0x1a22: 0x4007b620, 0x1a23: 0x4007b820, - 0x1a24: 0x4007ba20, 0x1a25: 0x4007bc20, 0x1a26: 0x4007be20, 0x1a27: 0x4007c020, - 0x1a28: 0x4007c220, 0x1a29: 0x4007c420, 0x1a2a: 0x4007c620, 0x1a2b: 0x4007c820, - 0x1a2c: 0x4007ca20, 0x1a2d: 0x4007cc20, 0x1a2e: 0x4007ce20, 0x1a2f: 0x4007d020, - 0x1a30: 0x4007d220, 0x1a31: 0x4007d420, 0x1a32: 0x4007d620, 0x1a33: 0x4007d820, - 0x1a34: 0x4007da20, 0x1a35: 0x4007dc20, 0x1a36: 0x4007de20, 0x1a37: 0x4007e020, - 0x1a38: 0x4007e220, 0x1a39: 0x4007e420, 0x1a3a: 0x4007e620, 0x1a3b: 0x4007e820, - 0x1a3c: 0x4007ea20, 0x1a3d: 0x4007ec20, 0x1a3e: 0x4007ee20, 0x1a3f: 0x4007f020, - // Block 0x69, offset 0x1a40 - 0x1a40: 0x404d1420, 0x1a41: 0x404d1620, 0x1a42: 0x404d1820, 0x1a43: 0x404d1a20, - 0x1a44: 0x404d1c20, 0x1a45: 0x404d1e20, 0x1a46: 0x404d2020, 0x1a47: 0x404d2220, - 0x1a48: 0x404d2420, 0x1a49: 0x404d2620, 0x1a4a: 0x404d2820, 0x1a4b: 0x404d2a20, - 0x1a4c: 0x404d2c20, 0x1a4d: 0x404d2e20, 0x1a4e: 0x404d3020, 0x1a4f: 0x404d3220, - 0x1a50: 0x404d3420, 0x1a51: 0x404d3620, 0x1a52: 0x404d3820, 0x1a53: 0x404d3a20, - 0x1a54: 0x404d3c20, 0x1a55: 0x404d3e20, 0x1a56: 0x404d4020, 0x1a57: 0x82e626a1, - 0x1a58: 0x82dc26a2, 0x1a59: 0x404d4620, 0x1a5a: 0x404d4820, 0x1a5b: 0x404d4a20, - 0x1a5e: 0x40036620, 0x1a5f: 0x40036820, - 0x1a60: 0x40510220, 0x1a61: 0x40510420, 0x1a62: 0x40510620, 0x1a63: 0x40510820, - 0x1a64: 0x40510a20, 0x1a65: 0x40510c20, 0x1a66: 0x40510e20, 0x1a67: 0x40511020, - 0x1a68: 0x40511220, 0x1a69: 0x40511420, 0x1a6a: 0x40511620, 0x1a6b: 0x40511820, - 0x1a6c: 0x40511a20, 0x1a6d: 0x40511c20, 0x1a6e: 0x40511e20, 0x1a6f: 0x40512020, - 0x1a70: 0x40512220, 0x1a71: 0x40512420, 0x1a72: 0x40512620, 0x1a73: 0x40512820, - 0x1a74: 0x40512a20, 0x1a75: 0x40512c20, 0x1a76: 0x40512e20, 0x1a77: 0x40513020, - 0x1a78: 0x40513220, 0x1a79: 0x40513420, 0x1a7a: 0x40513620, 0x1a7b: 0x40513820, - 0x1a7c: 0x40513a20, 0x1a7d: 0x40513c20, 0x1a7e: 0x40513e20, 0x1a7f: 0x40514020, - // Block 0x6a, offset 0x1a80 - 0x1a80: 0x40514220, 0x1a81: 0x40514420, 0x1a82: 0x40514620, 0x1a83: 0x40514820, - 0x1a84: 0x40514a20, 0x1a85: 0x40514c20, 0x1a86: 0x40514e20, 0x1a87: 0x40515020, - 0x1a88: 0x40515220, 0x1a89: 0x40515420, 0x1a8a: 0x40515620, 0x1a8b: 0x40515820, - 0x1a8c: 0x40515a20, 0x1a8d: 0x40516c20, 0x1a8e: 0x40516e20, 0x1a8f: 0x40517020, - 0x1a90: 0x40517220, 0x1a91: 0x40517420, 0x1a92: 0x40517620, 0x1a93: 0x40515c20, - 0x1a94: 0xe0002029, 0x1a95: 0x40516020, 0x1a96: 0x40516220, 0x1a97: 0x40516420, - 0x1a98: 0x00510e84, 0x1a99: 0x00510e84, 0x1a9a: 0x00513884, 0x1a9b: 0x00513884, - 0x1a9c: 0x40516620, 0x1a9d: 0x40516820, 0x1a9e: 0x40516a20, - 0x1aa0: 0x820928cd, 0x1aa1: 0x40517820, 0x1aa2: 0x40517c20, 0x1aa3: 0x40517e20, - 0x1aa4: 0x00517e84, 0x1aa5: 0x40518020, 0x1aa6: 0x40518220, 0x1aa7: 0x40518420, - 0x1aa8: 0x40518620, 0x1aa9: 0x40518820, 0x1aaa: 0x40518a20, 0x1aab: 0x40515e20, - 0x1aac: 0x40517a20, 0x1aad: 0x40519820, 0x1aae: 0x40518c20, 0x1aaf: 0x40518e20, - 0x1ab0: 0x40519220, 0x1ab1: 0x40519420, 0x1ab2: 0x40519620, 0x1ab3: 0x40519020, - 0x1ab4: 0xa000f302, 0x1ab5: 0xae611702, 0x1ab6: 0xae611802, 0x1ab7: 0xae611902, - 0x1ab8: 0xae611a02, 0x1ab9: 0xae611b02, 0x1aba: 0xae611c02, 0x1abb: 0xae611d02, - 0x1abc: 0xae611e02, 0x1abf: 0xadc00000, - // Block 0x6b, offset 0x1ac0 - 0x1ac0: 0xe0000194, 0x1ac1: 0xe0000228, 0x1ac2: 0xe0000340, 0x1ac3: 0xe000041a, - 0x1ac4: 0xe00004ef, 0x1ac5: 0xe00005b9, 0x1ac6: 0xe0000684, 0x1ac7: 0xe000072c, - 0x1ac8: 0xe00007d8, 0x1ac9: 0xe000087d, - 0x1ad0: 0xe0000197, 0x1ad1: 0xe000022b, 0x1ad2: 0xe0000343, 0x1ad3: 0xe000041d, - 0x1ad4: 0xe00004f2, 0x1ad5: 0xe00005bc, 0x1ad6: 0xe0000687, 0x1ad7: 0xe000072f, - 0x1ad8: 0xe00007db, 0x1ad9: 0xe0000880, - 0x1ae0: 0x4005c220, 0x1ae1: 0x4005c420, 0x1ae2: 0x4005c620, 0x1ae3: 0x4005c820, - 0x1ae4: 0x4005ca20, 0x1ae5: 0x4005cc20, 0x1ae6: 0x4005ce20, 0x1ae7: 0x4027be20, - 0x1ae8: 0x40032a20, 0x1ae9: 0x40032c20, 0x1aea: 0x40032e20, 0x1aeb: 0x40033020, - 0x1aec: 0x4005d020, 0x1aed: 0x4005d220, - // Block 0x6c, offset 0x1b00 - 0x1b00: 0xa000f202, 0x1b01: 0xa000f202, 0x1b02: 0xa000f302, 0x1b03: 0xa000f702, - 0x1b04: 0xa000f402, 0x1b05: 0xc3190821, 0x1b06: 0x40522820, 0x1b07: 0xc31b0821, - 0x1b08: 0x40522c20, 0x1b09: 0xc31d0821, 0x1b0a: 0x40523020, 0x1b0b: 0xc31f0821, - 0x1b0c: 0x40523420, 0x1b0d: 0xc3210821, 0x1b0e: 0x40523820, 0x1b0f: 0x40523a20, - 0x1b10: 0x40523c20, 0x1b11: 0xc3230821, 0x1b12: 0x40524020, 0x1b13: 0x40524220, - 0x1b14: 0x40524820, 0x1b15: 0x40524a20, 0x1b16: 0x40524c20, 0x1b17: 0x40524e20, - 0x1b18: 0x40525020, 0x1b19: 0x40525220, 0x1b1a: 0x40525420, 0x1b1b: 0x40525620, - 0x1b1c: 0x40525820, 0x1b1d: 0x40525a20, 0x1b1e: 0x40525c20, 0x1b1f: 0x40525e20, - 0x1b20: 0x40526020, 0x1b21: 0x40526220, 0x1b22: 0x40526420, 0x1b23: 0x40526820, - 0x1b24: 0x40526a20, 0x1b25: 0x40526c20, 0x1b26: 0x40526e20, 0x1b27: 0x40527020, - 0x1b28: 0x40527420, 0x1b29: 0x40527620, 0x1b2a: 0x40527820, 0x1b2b: 0x40527a20, - 0x1b2c: 0x40527c20, 0x1b2d: 0x40527e20, 0x1b2e: 0x40528020, 0x1b2f: 0x40528220, - 0x1b30: 0x40528620, 0x1b31: 0x40528820, 0x1b32: 0x40528a20, 0x1b33: 0x40529020, - 0x1b34: 0xa070f102, 0x1b35: 0x40529220, 0x1b36: 0x40529420, 0x1b37: 0x40529620, - 0x1b38: 0x40529820, 0x1b39: 0x40529a20, 0x1b3a: 0xc3250821, 0x1b3b: 0x40529e20, - 0x1b3c: 0xc3270821, 0x1b3d: 0x4052a220, 0x1b3e: 0xc3290821, 0x1b3f: 0xc32b0821, - // Block 0x6d, offset 0x1b40 - 0x1b40: 0x4052a820, 0x1b41: 0x4052aa20, 0x1b42: 0xc32d0821, 0x1b43: 0x4052ae20, - 0x1b44: 0x82092958, 0x1b45: 0x40524420, 0x1b46: 0x40524620, 0x1b47: 0x40526620, - 0x1b48: 0x40527220, 0x1b49: 0x40528420, 0x1b4a: 0x40528c20, 0x1b4b: 0x40528e20, - 0x1b50: 0xe00001be, 0x1b51: 0xe0000252, 0x1b52: 0xe000036a, 0x1b53: 0xe0000444, - 0x1b54: 0xe0000519, 0x1b55: 0xe00005e3, 0x1b56: 0xe00006ae, 0x1b57: 0xe0000756, - 0x1b58: 0xe0000802, 0x1b59: 0xe00008a7, 0x1b5a: 0x40036a20, 0x1b5b: 0x40036c20, - 0x1b5c: 0x4002f620, 0x1b5d: 0x4002ae20, 0x1b5e: 0x40033220, 0x1b5f: 0x40033420, - 0x1b60: 0x40022020, 0x1b61: 0x4007f220, 0x1b62: 0x4007f420, 0x1b63: 0x4007f620, - 0x1b64: 0x4007f820, 0x1b65: 0x4007fa20, 0x1b66: 0x4007fc20, 0x1b67: 0x4007fe20, - 0x1b68: 0x40080020, 0x1b69: 0x40080220, 0x1b6a: 0x40080420, 0x1b6b: 0xae600000, - 0x1b6c: 0xadc00000, 0x1b6d: 0xae600000, 0x1b6e: 0xae600000, 0x1b6f: 0xae600000, - 0x1b70: 0xae600000, 0x1b71: 0xae600000, 0x1b72: 0xae600000, 0x1b73: 0xae600000, - 0x1b74: 0x40080620, 0x1b75: 0x40080820, 0x1b76: 0x40080a20, 0x1b77: 0x40080c20, - 0x1b78: 0x40080e20, 0x1b79: 0x40081020, 0x1b7a: 0x40081220, 0x1b7b: 0x40081420, - 0x1b7c: 0x40081620, - // Block 0x6e, offset 0x1b80 - 0x1b80: 0xa000f302, 0x1b81: 0xa000f902, 0x1b82: 0xa000f402, 0x1b83: 0x4047d420, - 0x1b84: 0x4047d620, 0x1b85: 0x4047d820, 0x1b86: 0x4047da20, 0x1b87: 0x4047dc20, - 0x1b88: 0x4047de20, 0x1b89: 0x4047e020, 0x1b8a: 0x4047e220, 0x1b8b: 0x4047e620, - 0x1b8c: 0x4047e820, 0x1b8d: 0x4047ea20, 0x1b8e: 0x4047ec20, 0x1b8f: 0x4047ee20, - 0x1b90: 0x4047f020, 0x1b91: 0x4047f220, 0x1b92: 0x4047f420, 0x1b93: 0x4047f620, - 0x1b94: 0x4047f820, 0x1b95: 0x4047fa20, 0x1b96: 0x4047fc20, 0x1b97: 0x4047fe20, - 0x1b98: 0x40480020, 0x1b99: 0x40480420, 0x1b9a: 0x40480820, 0x1b9b: 0x40480c20, - 0x1b9c: 0x40481220, 0x1b9d: 0x40481820, 0x1b9e: 0x40481c20, 0x1b9f: 0x40481e20, - 0x1ba0: 0x40482220, 0x1ba1: 0x40480a20, 0x1ba2: 0x40480e20, 0x1ba3: 0x40481420, - 0x1ba4: 0x40482420, 0x1ba5: 0x40482620, 0x1ba6: 0x40482820, 0x1ba7: 0x40482a20, - 0x1ba8: 0x40482c20, 0x1ba9: 0x40482e20, 0x1baa: 0x82092418, 0x1bab: 0x82092419, - 0x1bac: 0x40480620, 0x1bad: 0x40481a20, 0x1bae: 0x4047e420, 0x1baf: 0x40482020, - 0x1bb0: 0xe00001c4, 0x1bb1: 0xe0000258, 0x1bb2: 0xe0000370, 0x1bb3: 0xe000044a, - 0x1bb4: 0xe000051f, 0x1bb5: 0xe00005e9, 0x1bb6: 0xe00006b4, 0x1bb7: 0xe000075c, - 0x1bb8: 0xe0000808, 0x1bb9: 0xe00008ad, 0x1bba: 0x0047d484, 0x1bbb: 0x40481020, - 0x1bbc: 0x40481620, 0x1bbd: 0x40480220, 0x1bbe: 0x0047e299, 0x1bbf: 0x00480499, - // Block 0x6f, offset 0x1bc0 - 0x1bc0: 0x404d4c20, 0x1bc1: 0x004d4c84, 0x1bc2: 0x404d4e20, 0x1bc3: 0x004d4e84, - 0x1bc4: 0x004d4e84, 0x1bc5: 0x404d5020, 0x1bc6: 0x004d5084, 0x1bc7: 0x404d5220, - 0x1bc8: 0x004d5284, 0x1bc9: 0x404d5420, 0x1bca: 0x004d5484, 0x1bcb: 0x404d5620, - 0x1bcc: 0x004d5684, 0x1bcd: 0x004d5684, 0x1bce: 0x404d5820, 0x1bcf: 0x004d5884, - 0x1bd0: 0x404d5a20, 0x1bd1: 0x404d5c20, 0x1bd2: 0x404d5e20, 0x1bd3: 0x004d5e84, - 0x1bd4: 0x404d6020, 0x1bd5: 0x004d6084, 0x1bd6: 0x404d6220, 0x1bd7: 0x004d6284, - 0x1bd8: 0x404d6420, 0x1bd9: 0x004d6484, 0x1bda: 0x004d6484, 0x1bdb: 0x404d6620, - 0x1bdc: 0x004d6684, 0x1bdd: 0x404d6820, 0x1bde: 0x404d6a20, 0x1bdf: 0x004d6a84, - 0x1be0: 0x404d6c20, 0x1be1: 0x404d6e20, 0x1be2: 0x404d7020, 0x1be3: 0x404d7220, - 0x1be4: 0x404d7420, 0x1be5: 0x404d7620, 0x1be6: 0xa070f102, 0x1be7: 0x404d7820, - 0x1be8: 0x004d7884, 0x1be9: 0x404d7a20, 0x1bea: 0x404d7c20, 0x1beb: 0x004d7c84, - 0x1bec: 0x404d7e20, 0x1bed: 0x004d7e84, 0x1bee: 0x404d8020, 0x1bef: 0x004d8084, - 0x1bf0: 0x404d8220, 0x1bf1: 0x404d8420, 0x1bf2: 0x820926c3, 0x1bf3: 0x820926c4, - 0x1bfc: 0x4005ec20, 0x1bfd: 0x4005ee20, 0x1bfe: 0x4005f020, 0x1bff: 0x4005f220, - // Block 0x70, offset 0x1c00 - 0x1c00: 0x404b3620, 0x1c01: 0x404b3820, 0x1c02: 0x404b3a20, 0x1c03: 0x404b3c20, - 0x1c04: 0x404b3e20, 0x1c05: 0x404b4020, 0x1c06: 0x404b4220, 0x1c07: 0x404b4420, - 0x1c08: 0x404b4620, 0x1c09: 0x404b4820, 0x1c0a: 0x404b5020, 0x1c0b: 0x404b5220, - 0x1c0c: 0x404b5420, 0x1c0d: 0x404b5620, 0x1c0e: 0x404b5820, 0x1c0f: 0x404b5a20, - 0x1c10: 0x404b5c20, 0x1c11: 0x404b5e20, 0x1c12: 0x404b6020, 0x1c13: 0x404b6220, - 0x1c14: 0x404b6420, 0x1c15: 0x404b6620, 0x1c16: 0x404b6820, 0x1c17: 0x404b6a20, - 0x1c18: 0x404b6c20, 0x1c19: 0x404b6e20, 0x1c1a: 0x404b7020, 0x1c1b: 0x404b7420, - 0x1c1c: 0x404b7820, 0x1c1d: 0x404b7a20, 0x1c1e: 0x404b7c20, 0x1c1f: 0x404b7e20, - 0x1c20: 0x404b8020, 0x1c21: 0x404b8220, 0x1c22: 0x404b8420, 0x1c23: 0x404b8620, - 0x1c24: 0x404b7220, 0x1c25: 0x404b7620, 0x1c26: 0x404b8a20, 0x1c27: 0x404b8c20, - 0x1c28: 0x404b8e20, 0x1c29: 0x404b9020, 0x1c2a: 0x404b9220, 0x1c2b: 0x404b9420, - 0x1c2c: 0x404b9620, 0x1c2d: 0x404b9820, 0x1c2e: 0x404b9a20, 0x1c2f: 0x404b9c20, - 0x1c30: 0x404b9e20, 0x1c31: 0x404ba020, 0x1c32: 0x404ba220, 0x1c33: 0x404ba420, - 0x1c34: 0x404ba620, 0x1c35: 0x404ba820, 0x1c36: 0x404b8820, 0x1c37: 0xa070f102, - 0x1c3b: 0x40031420, - 0x1c3c: 0x40031620, 0x1c3d: 0x4005ae20, 0x1c3e: 0x4005b020, 0x1c3f: 0x4005b220, - // Block 0x71, offset 0x1c40 - 0x1c40: 0xe00001a6, 0x1c41: 0xe000023a, 0x1c42: 0xe0000352, 0x1c43: 0xe000042c, - 0x1c44: 0xe0000501, 0x1c45: 0xe00005cb, 0x1c46: 0xe0000696, 0x1c47: 0xe000073e, - 0x1c48: 0xe00007ea, 0x1c49: 0xe000088f, - 0x1c4d: 0x404b4a20, 0x1c4e: 0x404b4c20, 0x1c4f: 0x404b4e20, - 0x1c50: 0xe00001ca, 0x1c51: 0xe000025e, 0x1c52: 0xe0000376, 0x1c53: 0xe0000450, - 0x1c54: 0xe0000525, 0x1c55: 0xe00005ef, 0x1c56: 0xe00006ba, 0x1c57: 0xe0000762, - 0x1c58: 0xe000080e, 0x1c59: 0xe00008b3, 0x1c5a: 0x40542e20, 0x1c5b: 0x40543020, - 0x1c5c: 0x40543220, 0x1c5d: 0x40543420, 0x1c5e: 0x40543620, 0x1c5f: 0x40543820, - 0x1c60: 0x40543a20, 0x1c61: 0x40543c20, 0x1c62: 0x40543e20, 0x1c63: 0x40544020, - 0x1c64: 0x40544220, 0x1c65: 0x40544420, 0x1c66: 0x40544620, 0x1c67: 0x40544820, - 0x1c68: 0x40544a20, 0x1c69: 0x40544c20, 0x1c6a: 0x40544e20, 0x1c6b: 0x40545020, - 0x1c6c: 0x40545220, 0x1c6d: 0x40545420, 0x1c6e: 0x40545620, 0x1c6f: 0x40545820, - 0x1c70: 0x40545a20, 0x1c71: 0x40545c20, 0x1c72: 0x40545e20, 0x1c73: 0x40546020, - 0x1c74: 0x40546220, 0x1c75: 0x40546420, 0x1c76: 0x40546620, 0x1c77: 0x40546820, - 0x1c78: 0x40546a20, 0x1c79: 0x40546c20, 0x1c7a: 0x40546e20, 0x1c7b: 0x40547020, - 0x1c7c: 0x40547220, 0x1c7d: 0x40547420, 0x1c7e: 0x40035820, 0x1c7f: 0x40035a20, - // Block 0x72, offset 0x1c80 - 0x1c80: 0x4005d620, 0x1c81: 0x4005d820, 0x1c82: 0x4005da20, 0x1c83: 0x4005dc20, - 0x1c84: 0x4005de20, 0x1c85: 0x4005e020, 0x1c86: 0x4005e220, 0x1c87: 0x4005e420, - 0x1c90: 0xae600000, 0x1c91: 0xae600000, 0x1c92: 0xae600000, 0x1c93: 0xa0000000, - 0x1c94: 0xa0100000, 0x1c95: 0xadc00000, 0x1c96: 0xadc00000, 0x1c97: 0xadc00000, - 0x1c98: 0xadc00000, 0x1c99: 0xadc00000, 0x1c9a: 0xae600000, 0x1c9b: 0xae600000, - 0x1c9c: 0xadc00000, 0x1c9d: 0xadc00000, 0x1c9e: 0xadc00000, 0x1c9f: 0xadc00000, - 0x1ca0: 0xae600000, 0x1ca1: 0xa0000000, 0x1ca2: 0xa0100000, 0x1ca3: 0xa0100000, - 0x1ca4: 0xa0100000, 0x1ca5: 0xa0100000, 0x1ca6: 0xa0100000, 0x1ca7: 0xa0100000, - 0x1ca8: 0xa0100000, 0x1ca9: 0x40404020, 0x1caa: 0x00404084, 0x1cab: 0x00404084, - 0x1cac: 0x00404084, 0x1cad: 0xadc0f302, 0x1cae: 0x00404084, 0x1caf: 0x00404084, - 0x1cb0: 0x00404084, 0x1cb1: 0x00404084, 0x1cb2: 0xa000f402, 0x1cb3: 0xa000f402, - 0x1cb4: 0xae600000, 0x1cb5: 0x40404220, 0x1cb6: 0x40404420, - // Block 0x73, offset 0x1cc0 - 0x1cc0: 0x402be620, 0x1cc1: 0x402bec20, 0x1cc2: 0x402bee20, 0x1cc3: 0x402c2420, - 0x1cc4: 0x402c4220, 0x1cc5: 0x402c6a20, 0x1cc6: 0x402c6c20, 0x1cc7: 0x402ca020, - 0x1cc8: 0x402ce620, 0x1cc9: 0x402db420, 0x1cca: 0x402ddc20, 0x1ccb: 0x402e0620, - 0x1ccc: 0x402e3420, 0x1ccd: 0x402e8a20, 0x1cce: 0x402eb020, 0x1ccf: 0x402eea20, - 0x1cd0: 0x402f0220, 0x1cd1: 0x402eec20, 0x1cd2: 0x402f0420, 0x1cd3: 0x402ef820, - 0x1cd4: 0x402ef620, 0x1cd5: 0x402f2a20, 0x1cd6: 0x402f0a20, 0x1cd7: 0x402f0c20, - 0x1cd8: 0x402f3420, 0x1cd9: 0x402f8c20, 0x1cda: 0x402fa020, 0x1cdb: 0x40303420, - 0x1cdc: 0x40307420, 0x1cdd: 0x40307620, 0x1cde: 0x40307820, 0x1cdf: 0x4030aa20, - 0x1ce0: 0x4030c620, 0x1ce1: 0x4030ea20, 0x1ce2: 0x40313220, 0x1ce3: 0x40316c20, - 0x1ce4: 0x4031f420, 0x1ce5: 0x4031f620, 0x1ce6: 0x40325820, 0x1ce7: 0x40327420, - 0x1ce8: 0x40328020, 0x1ce9: 0x40328a20, 0x1cea: 0x4032a020, 0x1ceb: 0x40348c20, - 0x1cec: 0x002bde9d, 0x1ced: 0xe00009e1, 0x1cee: 0x002c0a9d, 0x1cef: 0x402c2220, - 0x1cf0: 0x002c629d, 0x1cf1: 0x002c989d, 0x1cf2: 0x002cae9d, 0x1cf3: 0x002d229d, - 0x1cf4: 0x002d689d, 0x1cf5: 0x002d9a9d, 0x1cf6: 0x002dcc9d, 0x1cf7: 0x002dfe9d, - 0x1cf8: 0x002e229d, 0x1cf9: 0x002e829d, 0x1cfa: 0x002e9e9d, 0x1cfb: 0x402eae20, - 0x1cfc: 0x002ee29d, 0x1cfd: 0x002f229d, 0x1cfe: 0x002f2c9d, 0x1cff: 0x002f7a9d, - // Block 0x74, offset 0x1d00 - 0x1d00: 0x00302c9d, 0x1d01: 0x00306c9d, 0x1d02: 0x0030e29d, 0x1d03: 0x002bde94, - 0x1d04: 0x002bf094, 0x1d05: 0x002bf894, 0x1d06: 0x002bee94, 0x1d07: 0x002c0a94, - 0x1d08: 0x002c6294, 0x1d09: 0x002c9894, 0x1d0a: 0x002cb894, 0x1d0b: 0x002cc294, - 0x1d0c: 0x002ce694, 0x1d0d: 0x002d2294, 0x1d0e: 0x002db494, 0x1d0f: 0x002dfe94, - 0x1d10: 0x002e8294, 0x1d11: 0x002eda94, 0x1d12: 0x002ee294, 0x1d13: 0x002efa94, - 0x1d14: 0x002f0a94, 0x1d15: 0x002f0c94, 0x1d16: 0x002f2c94, 0x1d17: 0x00302c94, - 0x1d18: 0x00306c94, 0x1d19: 0x00307694, 0x1d1a: 0x0030a094, 0x1d1b: 0x0030be94, - 0x1d1c: 0x0031f694, 0x1d1d: 0x00325494, 0x1d1e: 0x00325694, 0x1d1f: 0x00325a94, - 0x1d20: 0x00329a94, 0x1d21: 0x00329c94, 0x1d22: 0x002d9a95, 0x1d23: 0x002f7a95, - 0x1d24: 0x00306c95, 0x1d25: 0x0030be95, 0x1d26: 0x00325495, 0x1d27: 0x00325695, - 0x1d28: 0x00328895, 0x1d29: 0x00329a95, 0x1d2a: 0x00329c95, 0x1d2b: 0x40307a20, - 0x1d2c: 0x402c2620, 0x1d2d: 0x402c6e20, 0x1d2e: 0x402d1220, 0x1d2f: 0x402e8c20, - 0x1d30: 0x402eb220, 0x1d31: 0x402f3a20, 0x1d32: 0x402f9620, 0x1d33: 0x402fce20, - 0x1d34: 0x402ff020, 0x1d35: 0x40304020, 0x1d36: 0x40313c20, 0x1d37: 0x402d5420, - 0x1d38: 0x0034ba94, 0x1d39: 0xe0000bd9, 0x1d3a: 0xe0000fc1, 0x1d3b: 0x402dbe20, - 0x1d3c: 0x402dca20, 0x1d3d: 0x402f3620, 0x1d3e: 0x40308420, 0x1d3f: 0x4030bc20, - // Block 0x75, offset 0x1d40 - 0x1d40: 0x402c2820, 0x1d41: 0x402c7020, 0x1d42: 0x402d1420, 0x1d43: 0x402d4220, - 0x1d44: 0x402e0820, 0x1d45: 0x402e5220, 0x1d46: 0x402e8e20, 0x1d47: 0x402ec620, - 0x1d48: 0x402f3c20, 0x1d49: 0x402faa20, 0x1d4a: 0x402ff220, 0x1d4b: 0x40301020, - 0x1d4c: 0x4030ca20, 0x1d4d: 0x4030fe20, 0x1d4e: 0x40313e20, 0x1d4f: 0x402bea20, - 0x1d50: 0x402c0020, 0x1d51: 0x402c8220, 0x1d52: 0x402caa20, 0x1d53: 0x402cca20, - 0x1d54: 0x402ce420, 0x1d55: 0x402cc020, 0x1d56: 0x402dc020, 0x1d57: 0x402f0620, - 0x1d58: 0x40302220, 0x1d59: 0x40308620, 0x1d5a: 0x40317620, 0x1d5b: 0x002c0294, - 0x1d5c: 0x002c3a94, 0x1d5d: 0x002c5694, 0x1d5e: 0xf0001414, 0x1d5f: 0x002cdc94, - 0x1d60: 0x002d0894, 0x1d61: 0x002dee94, 0x1d62: 0x002d2a94, 0x1d63: 0x00308894, - 0x1d64: 0x002db694, 0x1d65: 0x002dc294, 0x1d66: 0x002daa94, 0x1d67: 0x002dbe94, - 0x1d68: 0x002de694, 0x1d69: 0x002e5494, 0x1d6a: 0x002e5294, 0x1d6b: 0x002e2a94, - 0x1d6c: 0x002e9094, 0x1d6d: 0x0030ac94, 0x1d6e: 0x002eb494, 0x1d6f: 0x002ec894, - 0x1d70: 0x002ea694, 0x1d71: 0x002f1094, 0x1d72: 0x002f4c94, 0x1d73: 0x002ff494, - 0x1d74: 0x00300894, 0x1d75: 0x00304294, 0x1d76: 0x00307c94, 0x1d77: 0x0030b494, - 0x1d78: 0x00307494, 0x1d79: 0x0030cc94, 0x1d7a: 0x0030da94, 0x1d7b: 0x00312a94, - 0x1d7c: 0x00314894, 0x1d7d: 0x00315094, 0x1d7e: 0x00316494, 0x1d7f: 0x00326a94, - // Block 0x76, offset 0x1d80 - 0x1d80: 0xae605f02, 0x1d81: 0xae605f02, 0x1d82: 0xadc06002, 0x1d83: 0xae605f02, - 0x1d84: 0xae605f02, 0x1d85: 0xae605f02, 0x1d86: 0xae605f02, 0x1d87: 0xae605f02, - 0x1d88: 0xae605f02, 0x1d89: 0xae605f02, 0x1d8a: 0x84dc17bd, 0x1d8b: 0xae605f02, - 0x1d8c: 0xae605f02, 0x1d8d: 0xaea05f02, 0x1d8e: 0xad605f02, 0x1d8f: 0xadc06002, - 0x1d90: 0xaca06002, 0x1d91: 0xae605f02, 0x1d92: 0x84e618d1, 0x1d93: 0xe00009b4, - 0x1d94: 0xe00009d9, 0x1d95: 0xe00009f9, 0x1d96: 0xe0000a08, 0x1d97: 0xe0000a50, - 0x1d98: 0xe0000ab6, 0x1d99: 0xe0000ab0, 0x1d9a: 0x84e61691, 0x1d9b: 0x84e61699, - 0x1d9c: 0x84e616ff, 0x1d9d: 0x84e61711, 0x1d9e: 0x84e61715, 0x1d9f: 0x84e61745, - 0x1da0: 0x84e6174f, 0x1da1: 0x84e61753, 0x1da2: 0x84e617c1, 0x1da3: 0x84e617c5, - 0x1da4: 0x84e617f3, 0x1da5: 0xe0000f67, 0x1da6: 0x84e61895, - 0x1dbc: 0xae906002, 0x1dbd: 0xadc06002, 0x1dbe: 0xae605f02, 0x1dbf: 0xadc06002, - // Block 0x77, offset 0x1dc0 - 0x1dc0: 0xe00009b1, 0x1dc1: 0xe00009ae, 0x1dc2: 0xe0000a22, 0x1dc3: 0xe0000a1f, - 0x1dc4: 0xe0000a28, 0x1dc5: 0xe0000a25, 0x1dc6: 0xe0000a2e, 0x1dc7: 0xe0000a2b, - 0x1dc8: 0xe0000a5a, 0x1dc9: 0xe0000a56, 0x1dca: 0xe0000a8c, 0x1dcb: 0xe0000a89, - 0x1dcc: 0xe0000a98, 0x1dcd: 0xe0000a95, 0x1dce: 0xe0000aa4, 0x1dcf: 0xe0000aa1, - 0x1dd0: 0xe0000a92, 0x1dd1: 0xe0000a8f, 0x1dd2: 0xe0000a9e, 0x1dd3: 0xe0000a9b, - 0x1dd4: 0xe0000b55, 0x1dd5: 0xe0000b51, 0x1dd6: 0xe0000b4d, 0x1dd7: 0xe0000b49, - 0x1dd8: 0xe0000b7c, 0x1dd9: 0xe0000b79, 0x1dda: 0xe0000b82, 0x1ddb: 0xe0000b7f, - 0x1ddc: 0xe0000b39, 0x1ddd: 0xe0000b35, 0x1dde: 0xe0000b8c, 0x1ddf: 0xe0000b89, - 0x1de0: 0xe0000bd0, 0x1de1: 0xe0000bcd, 0x1de2: 0xe0000c00, 0x1de3: 0xe0000bfd, - 0x1de4: 0xe0000c0c, 0x1de5: 0xe0000c09, 0x1de6: 0xe0000bfa, 0x1de7: 0xe0000bf7, - 0x1de8: 0xe0000c06, 0x1de9: 0xe0000c03, 0x1dea: 0xe0000c12, 0x1deb: 0xe0000c0f, - 0x1dec: 0xe0000c7e, 0x1ded: 0xe0000c7b, 0x1dee: 0xe0000c4a, 0x1def: 0xe0000c46, - 0x1df0: 0xe0000c93, 0x1df1: 0xe0000c90, 0x1df2: 0xe0000cab, 0x1df3: 0xe0000ca8, - 0x1df4: 0xe0000cb1, 0x1df5: 0xe0000cae, 0x1df6: 0xe0000cde, 0x1df7: 0xe0000cdb, - 0x1df8: 0xe0000ce5, 0x1df9: 0xe0000ce1, 0x1dfa: 0xe0000cf2, 0x1dfb: 0xe0000cef, - 0x1dfc: 0xe0000cec, 0x1dfd: 0xe0000ce9, 0x1dfe: 0xe0000d1e, 0x1dff: 0xe0000d1b, - // Block 0x78, offset 0x1e00 - 0x1e00: 0xe0000d24, 0x1e01: 0xe0000d21, 0x1e02: 0xe0000d2a, 0x1e03: 0xe0000d27, - 0x1e04: 0xe0000d69, 0x1e05: 0xe0000d66, 0x1e06: 0xe0000d7b, 0x1e07: 0xe0000d78, - 0x1e08: 0xe0000d87, 0x1e09: 0xe0000d84, 0x1e0a: 0xe0000d81, 0x1e0b: 0xe0000d7e, - 0x1e0c: 0xe0000ded, 0x1e0d: 0xe0000de9, 0x1e0e: 0xe0000df5, 0x1e0f: 0xe0000df1, - 0x1e10: 0xe0000e3d, 0x1e11: 0xe0000e39, 0x1e12: 0xe0000e35, 0x1e13: 0xe0000e31, - 0x1e14: 0xe0000ea7, 0x1e15: 0xe0000ea4, 0x1e16: 0xe0000ead, 0x1e17: 0xe0000eaa, - 0x1e18: 0xe0000ed6, 0x1e19: 0xe0000ed3, 0x1e1a: 0xe0000ef4, 0x1e1b: 0xe0000ef1, - 0x1e1c: 0xe0000efb, 0x1e1d: 0xe0000ef7, 0x1e1e: 0xe0000f02, 0x1e1f: 0xe0000eff, - 0x1e20: 0xe0000f41, 0x1e21: 0xe0000f3e, 0x1e22: 0xe0000f53, 0x1e23: 0xe0000f50, - 0x1e24: 0xe0000f26, 0x1e25: 0xe0000f22, 0x1e26: 0xe0000f3a, 0x1e27: 0xe0000f36, - 0x1e28: 0xe0000f5a, 0x1e29: 0xe0000f56, 0x1e2a: 0xe0000f93, 0x1e2b: 0xe0000f90, - 0x1e2c: 0xe0000f9f, 0x1e2d: 0xe0000f9c, 0x1e2e: 0xe0000fb1, 0x1e2f: 0xe0000fae, - 0x1e30: 0xe0000fab, 0x1e31: 0xe0000fa8, 0x1e32: 0xe0001093, 0x1e33: 0xe0001090, - 0x1e34: 0xe000109f, 0x1e35: 0xe000109c, 0x1e36: 0xe0001099, 0x1e37: 0xe0001096, - 0x1e38: 0xe0001032, 0x1e39: 0xe000102e, 0x1e3a: 0xe0001046, 0x1e3b: 0xe0001042, - 0x1e3c: 0xe00010a9, 0x1e3d: 0xe00010a6, 0x1e3e: 0xe00010af, 0x1e3f: 0xe00010ac, - // Block 0x79, offset 0x1e40 - 0x1e40: 0xe00010d2, 0x1e41: 0xe00010cf, 0x1e42: 0xe00010cc, 0x1e43: 0xe00010c9, - 0x1e44: 0xe00010e1, 0x1e45: 0xe00010de, 0x1e46: 0xe00010e7, 0x1e47: 0xe00010e4, - 0x1e48: 0xe00010ed, 0x1e49: 0xe00010ea, 0x1e4a: 0xe00010fc, 0x1e4b: 0xe00010f9, - 0x1e4c: 0xe00010f6, 0x1e4d: 0xe00010f3, 0x1e4e: 0xe0001123, 0x1e4f: 0xe0001120, - 0x1e50: 0xe0001141, 0x1e51: 0xe000113e, 0x1e52: 0xe0001153, 0x1e53: 0xe0001150, - 0x1e54: 0xe0001159, 0x1e55: 0xe0001156, 0x1e56: 0xe0000c15, 0x1e57: 0xe0000f8d, - 0x1e58: 0xe00010db, 0x1e59: 0xe0001111, 0x1e5a: 0xf0000404, 0x1e5b: 0xe0000f70, - 0x1e5c: 0x40300420, 0x1e5d: 0x40300620, 0x1e5e: 0xe0000f7f, 0x1e5f: 0x402c9620, - 0x1e60: 0xe000099b, 0x1e61: 0xe0000998, 0x1e62: 0xe0000989, 0x1e63: 0xe0000986, - 0x1e64: 0xe0000928, 0x1e65: 0xe0000924, 0x1e66: 0xe0000930, 0x1e67: 0xe000092c, - 0x1e68: 0xe0000940, 0x1e69: 0xe000093c, 0x1e6a: 0xe0000938, 0x1e6b: 0xe0000934, - 0x1e6c: 0xe00009aa, 0x1e6d: 0xe00009a6, 0x1e6e: 0xe0000902, 0x1e6f: 0xe00008fe, - 0x1e70: 0xe000090a, 0x1e71: 0xe0000906, 0x1e72: 0xe000091a, 0x1e73: 0xe0000916, - 0x1e74: 0xe0000912, 0x1e75: 0xe000090e, 0x1e76: 0xe00009a2, 0x1e77: 0xe000099e, - 0x1e78: 0xe0000b6e, 0x1e79: 0xe0000b6b, 0x1e7a: 0xe0000b5c, 0x1e7b: 0xe0000b59, - 0x1e7c: 0xe0000b26, 0x1e7d: 0xe0000b23, 0x1e7e: 0xe0000afb, 0x1e7f: 0xe0000af7, - // Block 0x7a, offset 0x1e80 - 0x1e80: 0xe0000b03, 0x1e81: 0xe0000aff, 0x1e82: 0xe0000b13, 0x1e83: 0xe0000b0f, - 0x1e84: 0xe0000b0b, 0x1e85: 0xe0000b07, 0x1e86: 0xe0000b75, 0x1e87: 0xe0000b71, - 0x1e88: 0xe0000c66, 0x1e89: 0xe0000c63, 0x1e8a: 0xe0000c78, 0x1e8b: 0xe0000c75, - 0x1e8c: 0xe0000e84, 0x1e8d: 0xe0000e81, 0x1e8e: 0xe0000e44, 0x1e8f: 0xe0000e41, - 0x1e90: 0xe0000dad, 0x1e91: 0xe0000da9, 0x1e92: 0xe0000db5, 0x1e93: 0xe0000db1, - 0x1e94: 0xe0000dc5, 0x1e95: 0xe0000dc1, 0x1e96: 0xe0000dbd, 0x1e97: 0xe0000db9, - 0x1e98: 0xe0000e8b, 0x1e99: 0xe0000e87, 0x1e9a: 0xe0000e5d, 0x1e9b: 0xe0000e59, - 0x1e9c: 0xe0000e65, 0x1e9d: 0xe0000e61, 0x1e9e: 0xe0000e75, 0x1e9f: 0xe0000e71, - 0x1ea0: 0xe0000e6d, 0x1ea1: 0xe0000e69, 0x1ea2: 0xe0000e7d, 0x1ea3: 0xe0000e79, - 0x1ea4: 0xe000108d, 0x1ea5: 0xe000108a, 0x1ea6: 0xe000104d, 0x1ea7: 0xe000104a, - 0x1ea8: 0xe0001066, 0x1ea9: 0xe0001062, 0x1eaa: 0xe000106e, 0x1eab: 0xe000106a, - 0x1eac: 0xe000107e, 0x1ead: 0xe000107a, 0x1eae: 0xe0001076, 0x1eaf: 0xe0001072, - 0x1eb0: 0xe0001086, 0x1eb1: 0xe0001082, 0x1eb2: 0xe0001108, 0x1eb3: 0xe0001105, - 0x1eb4: 0xe0001135, 0x1eb5: 0xe0001132, 0x1eb6: 0xe000112f, 0x1eb7: 0xe000112c, - 0x1eb8: 0xe000111d, 0x1eb9: 0xe000111a, 0x1eba: 0xe0000d0a, 0x1ebb: 0xe0000d07, - 0x1ebc: 0x0030d888, 0x1ebd: 0x4030d820, 0x1ebe: 0x00312088, 0x1ebf: 0x40312020, - // Block 0x7b, offset 0x1ec0 - 0x1ec0: 0xe0001165, 0x1ec1: 0xe00011a9, 0x1ec2: 0xe000117d, 0x1ec3: 0xe00011c1, - 0x1ec4: 0xe000116b, 0x1ec5: 0xe00011af, 0x1ec6: 0xe000118f, 0x1ec7: 0xe00011d3, - 0x1ec8: 0xe0001168, 0x1ec9: 0xe00011ac, 0x1eca: 0xe0001181, 0x1ecb: 0xe00011c5, - 0x1ecc: 0xe000116f, 0x1ecd: 0xe00011b3, 0x1ece: 0xe0001193, 0x1ecf: 0xe00011d7, - 0x1ed0: 0xe000121a, 0x1ed1: 0xe0001230, 0x1ed2: 0xe0001228, 0x1ed3: 0xe000123e, - 0x1ed4: 0xe0001220, 0x1ed5: 0xe0001236, - 0x1ed8: 0xe000121d, 0x1ed9: 0xe0001233, 0x1eda: 0xe000122c, 0x1edb: 0xe0001242, - 0x1edc: 0xe0001224, 0x1edd: 0xe000123a, - 0x1ee0: 0xe0001252, 0x1ee1: 0xe0001296, 0x1ee2: 0xe000126a, 0x1ee3: 0xe00012ae, - 0x1ee4: 0xe0001258, 0x1ee5: 0xe000129c, 0x1ee6: 0xe000127c, 0x1ee7: 0xe00012c0, - 0x1ee8: 0xe0001255, 0x1ee9: 0xe0001299, 0x1eea: 0xe000126e, 0x1eeb: 0xe00012b2, - 0x1eec: 0xe000125c, 0x1eed: 0xe00012a0, 0x1eee: 0xe0001280, 0x1eef: 0xe00012c4, - 0x1ef0: 0xe00012fb, 0x1ef1: 0xe0001319, 0x1ef2: 0xe0001309, 0x1ef3: 0xe0001327, - 0x1ef4: 0xe0001301, 0x1ef5: 0xe000131f, 0x1ef6: 0xe0001311, 0x1ef7: 0xe000132f, - 0x1ef8: 0xe00012fe, 0x1ef9: 0xe000131c, 0x1efa: 0xe000130d, 0x1efb: 0xe000132b, - 0x1efc: 0xe0001305, 0x1efd: 0xe0001323, 0x1efe: 0xe0001315, 0x1eff: 0xe0001333, - // Block 0x7c, offset 0x1f00 - 0x1f00: 0xe000136c, 0x1f01: 0xe0001382, 0x1f02: 0xe000137a, 0x1f03: 0xe0001390, - 0x1f04: 0xe0001372, 0x1f05: 0xe0001388, - 0x1f08: 0xe000136f, 0x1f09: 0xe0001385, 0x1f0a: 0xe000137e, 0x1f0b: 0xe0001394, - 0x1f0c: 0xe0001376, 0x1f0d: 0xe000138c, - 0x1f10: 0xe00013ad, 0x1f11: 0xe00013bc, 0x1f12: 0xe00013b4, 0x1f13: 0xe00013ca, - 0x1f14: 0xe00013b0, 0x1f15: 0xe00013c2, 0x1f16: 0xe00013b8, 0x1f17: 0xe00013d2, - 0x1f19: 0xe00013bf, 0x1f1b: 0xe00013ce, - 0x1f1d: 0xe00013c6, 0x1f1f: 0xe00013d6, - 0x1f20: 0xe0001407, 0x1f21: 0xe000144b, 0x1f22: 0xe000141f, 0x1f23: 0xe0001463, - 0x1f24: 0xe000140d, 0x1f25: 0xe0001451, 0x1f26: 0xe0001431, 0x1f27: 0xe0001475, - 0x1f28: 0xe000140a, 0x1f29: 0xe000144e, 0x1f2a: 0xe0001423, 0x1f2b: 0xe0001467, - 0x1f2c: 0xe0001411, 0x1f2d: 0xe0001455, 0x1f2e: 0xe0001435, 0x1f2f: 0xe0001479, - 0x1f30: 0xe00011f7, 0x1f31: 0xe00011ed, 0x1f32: 0xe000124c, 0x1f33: 0xe0001246, - 0x1f34: 0xe00012e4, 0x1f35: 0xe00012da, 0x1f36: 0xe000133d, 0x1f37: 0xe0001337, - 0x1f38: 0xe000139e, 0x1f39: 0xe0001398, 0x1f3a: 0xe00013e0, 0x1f3b: 0xe00013da, - 0x1f3c: 0xe0001499, 0x1f3d: 0xe000148f, - // Block 0x7d, offset 0x1f40 - 0x1f40: 0xe00011a1, 0x1f41: 0xe00011e5, 0x1f42: 0xe0001185, 0x1f43: 0xe00011c9, - 0x1f44: 0xe0001173, 0x1f45: 0xe00011b7, 0x1f46: 0xe0001197, 0x1f47: 0xe00011db, - 0x1f48: 0xe00011a5, 0x1f49: 0xe00011e9, 0x1f4a: 0xe000118a, 0x1f4b: 0xe00011ce, - 0x1f4c: 0xe0001178, 0x1f4d: 0xe00011bc, 0x1f4e: 0xe000119c, 0x1f4f: 0xe00011e0, - 0x1f50: 0xe000128e, 0x1f51: 0xe00012d2, 0x1f52: 0xe0001272, 0x1f53: 0xe00012b6, - 0x1f54: 0xe0001260, 0x1f55: 0xe00012a4, 0x1f56: 0xe0001284, 0x1f57: 0xe00012c8, - 0x1f58: 0xe0001292, 0x1f59: 0xe00012d6, 0x1f5a: 0xe0001277, 0x1f5b: 0xe00012bb, - 0x1f5c: 0xe0001265, 0x1f5d: 0xe00012a9, 0x1f5e: 0xe0001289, 0x1f5f: 0xe00012cd, - 0x1f60: 0xe0001443, 0x1f61: 0xe0001487, 0x1f62: 0xe0001427, 0x1f63: 0xe000146b, - 0x1f64: 0xe0001415, 0x1f65: 0xe0001459, 0x1f66: 0xe0001439, 0x1f67: 0xe000147d, - 0x1f68: 0xe0001447, 0x1f69: 0xe000148b, 0x1f6a: 0xe000142c, 0x1f6b: 0xe0001470, - 0x1f6c: 0xe000141a, 0x1f6d: 0xe000145e, 0x1f6e: 0xe000143e, 0x1f6f: 0xe0001482, - 0x1f70: 0xe0001201, 0x1f71: 0xe000120e, 0x1f72: 0xe00011fd, 0x1f73: 0xe0001214, - 0x1f74: 0xe00011f3, 0x1f76: 0xe0001207, 0x1f77: 0xe000120a, - 0x1f78: 0xe0001204, 0x1f79: 0xe0001211, 0x1f7a: 0xe00011fa, 0x1f7b: 0xe00011f0, - 0x1f7c: 0xe0001217, 0x1f7d: 0x40063620, 0x1f7e: 0x40326c20, 0x1f7f: 0x40063620, - // Block 0x7e, offset 0x1f80 - 0x1f80: 0x40063a20, 0x1f81: 0xe00000b1, 0x1f82: 0xe00012ea, 0x1f83: 0xe00012f5, - 0x1f84: 0xe00012e0, 0x1f86: 0xe00012ee, 0x1f87: 0xe00012f1, - 0x1f88: 0xe000124f, 0x1f89: 0xe0001249, 0x1f8a: 0xe00012e7, 0x1f8b: 0xe00012dd, - 0x1f8c: 0xe00012f8, 0x1f8d: 0xe00000b7, 0x1f8e: 0xe00000b4, 0x1f8f: 0xe00000ba, - 0x1f90: 0xe0001343, 0x1f91: 0xe000135e, 0x1f92: 0xe0001356, 0x1f93: 0xe0001352, - 0x1f96: 0xe0001349, 0x1f97: 0xe000135a, - 0x1f98: 0xe0001346, 0x1f99: 0xe0001361, 0x1f9a: 0xe0001340, 0x1f9b: 0xe000133a, - 0x1f9d: 0xe00000c0, 0x1f9e: 0xe00000bd, 0x1f9f: 0xe00000c3, - 0x1fa0: 0xe00013e6, 0x1fa1: 0xe0001401, 0x1fa2: 0xe00013f9, 0x1fa3: 0xe00013f5, - 0x1fa4: 0xe00013a4, 0x1fa5: 0xe00013a7, 0x1fa6: 0xe00013ec, 0x1fa7: 0xe00013fd, - 0x1fa8: 0xe00013e9, 0x1fa9: 0xe0001404, 0x1faa: 0xe00013e3, 0x1fab: 0xe00013dd, - 0x1fac: 0xe00013aa, 0x1fad: 0xe00000ae, 0x1fae: 0xe00000ab, 0x1faf: 0x40061e20, - 0x1fb2: 0xe000149f, 0x1fb3: 0xe00014aa, - 0x1fb4: 0xe0001495, 0x1fb6: 0xe00014a3, 0x1fb7: 0xe00014a6, - 0x1fb8: 0xe00013a1, 0x1fb9: 0xe000139b, 0x1fba: 0xe000149c, 0x1fbb: 0xe0001492, - 0x1fbc: 0xe00014ad, 0x1fbd: 0x40062020, 0x1fbe: 0x40063820, - // Block 0x7f, offset 0x1fc0 - 0x1fc0: 0x00021284, 0x1fc1: 0x00021284, 0x1fc2: 0x00021284, 0x1fc3: 0x00021284, - 0x1fc4: 0x00021284, 0x1fc5: 0x00021284, 0x1fc6: 0x00021284, 0x1fc7: 0x0002129b, - 0x1fc8: 0x00021284, 0x1fc9: 0x00021284, 0x1fca: 0x00021284, 0x1fcb: 0xa0000000, - 0x1fcc: 0xa0000000, 0x1fcd: 0xa0000000, 0x1fce: 0xa0000000, 0x1fcf: 0xa0000000, - 0x1fd0: 0x40022620, 0x1fd1: 0x0002269b, 0x1fd2: 0x40022820, 0x1fd3: 0x40022a20, - 0x1fd4: 0x40022c20, 0x1fd5: 0x40022e20, 0x1fd6: 0x4004c420, 0x1fd7: 0x40021820, - 0x1fd8: 0x4003d420, 0x1fd9: 0x4003d620, 0x1fda: 0x4003d820, 0x1fdb: 0x4003da20, - 0x1fdc: 0x4003e220, 0x1fdd: 0x4003e420, 0x1fde: 0x4003e620, 0x1fdf: 0x4003e820, - 0x1fe0: 0x4004f820, 0x1fe1: 0x4004fa20, 0x1fe2: 0x40050220, 0x1fe3: 0x40050420, - 0x1fe4: 0x0002e484, 0x1fe5: 0xf0001f04, 0x1fe6: 0xf0000404, 0x1fe7: 0x40050620, - 0x1fe8: 0x40020e20, 0x1fe9: 0x40021020, 0x1fea: 0xa0000000, 0x1feb: 0xa0000000, - 0x1fec: 0xa0000000, 0x1fed: 0xa0000000, 0x1fee: 0xa0000000, 0x1fef: 0x0002129b, - 0x1ff0: 0x4004f020, 0x1ff1: 0x4004f420, 0x1ff2: 0x40050e20, 0x1ff3: 0xf0001f04, - 0x1ff4: 0xf0000404, 0x1ff5: 0x40051020, 0x1ff6: 0xf0001f04, 0x1ff7: 0xf0000404, - 0x1ff8: 0x40051620, 0x1ff9: 0x4003dc20, 0x1ffa: 0x4003de20, 0x1ffb: 0x40051820, - 0x1ffc: 0xf0001f04, 0x1ffd: 0x4002e020, 0x1ffe: 0x40021420, 0x1fff: 0x40051a20, - // Block 0x80, offset 0x2000 - 0x2000: 0x40051e20, 0x2001: 0x40052220, 0x2002: 0x40052420, 0x2003: 0x40050820, - 0x2004: 0x40095820, 0x2005: 0x40040c20, 0x2006: 0x40040e20, 0x2007: 0xf0001f04, - 0x2008: 0xf0001f04, 0x2009: 0xf0001f04, 0x200a: 0x4004e820, 0x200b: 0x4004d420, - 0x200c: 0x40050a20, 0x200d: 0x40050c20, 0x200e: 0x4004da20, 0x200f: 0x40026620, - 0x2010: 0x40052020, 0x2011: 0x4004dc20, 0x2012: 0x40095020, 0x2013: 0x40023420, - 0x2014: 0x40051c20, 0x2015: 0x40039c20, 0x2016: 0x40039e20, 0x2017: 0xe00000a6, - 0x2018: 0x4003a020, 0x2019: 0x4003a220, 0x201a: 0x4003a420, 0x201b: 0x4003a620, - 0x201c: 0x4003a820, 0x201d: 0x4003aa20, 0x201e: 0x4003ac20, 0x201f: 0x00021284, - 0x2020: 0xa0000000, 0x2021: 0xa0000000, 0x2022: 0xa0000000, 0x2023: 0xa0000000, - 0x2024: 0xa0000000, - 0x202a: 0xa0000000, 0x202b: 0xa0000000, - 0x202c: 0xa0000000, 0x202d: 0xa0000000, 0x202e: 0xa0000000, 0x202f: 0xa0000000, - 0x2030: 0x0029cc94, 0x2031: 0x002d9a94, - 0x2034: 0x0029d494, 0x2035: 0x0029d694, 0x2036: 0x0029d894, 0x2037: 0x0029da94, - 0x2038: 0x0029dc94, 0x2039: 0x0029de94, 0x203a: 0x00093894, 0x203b: 0x00094e94, - 0x203c: 0x00094294, 0x203d: 0x0003f494, 0x203e: 0x0003f694, 0x203f: 0x002e9e94, - // Block 0x81, offset 0x2040 - 0x2040: 0x0029cc95, 0x2041: 0x0029ce95, 0x2042: 0x0029d095, 0x2043: 0x0029d295, - 0x2044: 0x0029d495, 0x2045: 0x0029d695, 0x2046: 0x0029d895, 0x2047: 0x0029da95, - 0x2048: 0x0029dc95, 0x2049: 0x0029de95, 0x204a: 0x00093895, 0x204b: 0x00094e95, - 0x204c: 0x00094295, 0x204d: 0x0003f495, 0x204e: 0x0003f695, - 0x2050: 0x002bde95, 0x2051: 0x002c9895, 0x2052: 0x002ee295, 0x2053: 0x0030f695, - 0x2054: 0x002cb895, 0x2055: 0x002d6895, 0x2056: 0x002dfe95, 0x2057: 0x002e2295, - 0x2058: 0x002e8295, 0x2059: 0x002e9e95, 0x205a: 0x002f2c95, 0x205b: 0x002fe695, - 0x205c: 0x00302c95, - 0x2060: 0x4027f820, 0x2061: 0x4027fa20, 0x2062: 0x4027fc20, 0x2063: 0x4027fe20, - 0x2064: 0x40280020, 0x2065: 0x40280220, 0x2066: 0x40280420, 0x2067: 0x40280620, - 0x2068: 0x40282c20, 0x2069: 0x40280820, 0x206a: 0x40280a20, 0x206b: 0x40280c20, - 0x206c: 0x40280e20, 0x206d: 0x40281020, 0x206e: 0x40281220, 0x206f: 0x40281420, - 0x2070: 0x40281620, 0x2071: 0x40281820, 0x2072: 0x40281a20, 0x2073: 0x40281c20, - 0x2074: 0x40281e20, 0x2075: 0x40282020, 0x2076: 0x40282220, 0x2077: 0x40282420, - 0x2078: 0x40282620, 0x2079: 0x40282820, 0x207a: 0x40282a20, - // Block 0x82, offset 0x2080 - 0x2090: 0xae612a02, 0x2091: 0xae612b02, 0x2092: 0xa0112c02, 0x2093: 0xa0112c02, - 0x2094: 0xae612d02, 0x2095: 0xae612e02, 0x2096: 0xae612f02, 0x2097: 0xae613002, - 0x2098: 0xa0106102, 0x2099: 0xa0106102, 0x209a: 0xa0106102, 0x209b: 0xae613102, - 0x209c: 0xae613202, 0x209d: 0xa0006202, 0x209e: 0xa0006202, 0x209f: 0xa0006202, - 0x20a0: 0xa0006202, 0x20a1: 0xae613302, 0x20a2: 0xa0006202, 0x20a3: 0xa0006202, - 0x20a4: 0xa0006202, 0x20a5: 0xa0106102, 0x20a6: 0xa0113402, 0x20a7: 0xae613502, - 0x20a8: 0xadc13602, 0x20a9: 0xae613702, 0x20aa: 0xa0106102, 0x20ab: 0xa0106102, - 0x20ac: 0xadc06002, 0x20ad: 0xadc06002, 0x20ae: 0xadc06002, 0x20af: 0xadc06002, - 0x20b0: 0xae605f02, - // Block 0x83, offset 0x20c0 - 0x20c0: 0xe00009bc, 0x20c1: 0xe00009c0, 0x20c2: 0x002c3a8b, 0x20c3: 0xf0000a04, - 0x20c4: 0x40081c20, 0x20c5: 0xe0000a5e, 0x20c6: 0xe0000a62, 0x20c7: 0x002cc28a, - 0x20c8: 0x40081e20, 0x20c9: 0xf0000a04, 0x20ca: 0x002d2285, 0x20cb: 0x002d688b, - 0x20cc: 0x002d688b, 0x20cd: 0x002d688b, 0x20ce: 0x002d6885, 0x20cf: 0xf0000202, - 0x20d0: 0x002d9a8b, 0x20d1: 0x002d9a8b, 0x20d2: 0x002e228b, 0x20d3: 0x002e2285, - 0x20d4: 0x40082020, 0x20d5: 0x002e9e8b, 0x20d6: 0xf000040a, 0x20d7: 0x40082220, - 0x20d8: 0x40082420, 0x20d9: 0x002f2c8b, 0x20da: 0x002f568b, 0x20db: 0x002f7a8b, - 0x20dc: 0x002f7a8b, 0x20dd: 0x002f7a8b, 0x20de: 0x40082620, 0x20df: 0x40082820, - 0x20e0: 0xf0001414, 0x20e1: 0xe0000fbd, 0x20e2: 0xf0001414, 0x20e3: 0x40082a20, - 0x20e4: 0x00312a8b, 0x20e5: 0x40082c20, 0x20e6: 0x0032a288, 0x20e7: 0x40082e20, - 0x20e8: 0x00312a8b, 0x20e9: 0x40083020, 0x20ea: 0x002dfe88, 0x20eb: 0xe000094d, - 0x20ec: 0x002c0a8b, 0x20ed: 0x002c3a8b, 0x20ee: 0x40083220, 0x20ef: 0x002c9885, - 0x20f0: 0x002c988b, 0x20f1: 0x002d088b, 0x20f2: 0x002d1e88, 0x20f3: 0x002e828b, - 0x20f4: 0x002ee285, 0x20f5: 0x00389084, 0x20f6: 0x00389284, 0x20f7: 0x00389484, - 0x20f8: 0x00389684, 0x20f9: 0x002d9a85, 0x20fa: 0x40083420, 0x20fb: 0xe0000b95, - 0x20fc: 0x00327e85, 0x20fd: 0x00325685, 0x20fe: 0x0032568b, 0x20ff: 0x00327e8b, - // Block 0x84, offset 0x2100 - 0x2100: 0x00093685, 0x2101: 0x40083620, 0x2102: 0x40083820, 0x2103: 0x40083a20, - 0x2104: 0x40083c20, 0x2105: 0x002c628b, 0x2106: 0x002c6285, 0x2107: 0x002c9885, - 0x2108: 0x002d9a85, 0x2109: 0x002dcc85, 0x210a: 0x40083e20, 0x210b: 0x400a6e20, - 0x210c: 0x40084020, 0x210d: 0xe00009c4, 0x210e: 0x402d1e20, 0x210f: 0x40084220, - 0x2110: 0xe00002cb, 0x2111: 0xe00002d3, 0x2112: 0xe00002b2, 0x2113: 0xe00002bb, - 0x2114: 0xe00003cd, 0x2115: 0xe00002c3, 0x2116: 0xe00003d1, 0x2117: 0xe00004ab, - 0x2118: 0xe0000579, 0x2119: 0xe00002c7, 0x211a: 0xe0000640, 0x211b: 0xe00002cf, - 0x211c: 0xe00004af, 0x211d: 0xe0000644, 0x211e: 0xe0000798, 0x211f: 0xf0001e1e, - 0x2120: 0x002d9a8a, 0x2121: 0xf0001f0a, 0x2122: 0xf0000a0a, 0x2123: 0xf0001f0a, - 0x2124: 0x0030be8a, 0x2125: 0xf0001f0a, 0x2126: 0xf0000a0a, 0x2127: 0xe00010bb, - 0x2128: 0xf0001f0a, 0x2129: 0x0030f68a, 0x212a: 0xf0001f0a, 0x212b: 0xf0000a0a, - 0x212c: 0x002e228a, 0x212d: 0x002c3a8a, 0x212e: 0x002c628a, 0x212f: 0x002e828a, - 0x2130: 0x002d9a84, 0x2131: 0xf0001f04, 0x2132: 0xf0000404, 0x2133: 0xf0001f04, - 0x2134: 0x0030be84, 0x2135: 0xf0001f04, 0x2136: 0xf0000404, 0x2137: 0xe00010b6, - 0x2138: 0xf0001f04, 0x2139: 0x0030f684, 0x213a: 0xf0001f04, 0x213b: 0xf0000404, - 0x213c: 0x002e2284, 0x213d: 0x002c3a84, 0x213e: 0x002c6284, 0x213f: 0x002e8284, - // Block 0x85, offset 0x2140 - 0x2140: 0x40287c20, 0x2141: 0x40287e20, 0x2142: 0x40288020, 0x2143: 0x002c5e88, - 0x2144: 0x402c5e20, 0x2145: 0xe00006c9, 0x2146: 0x40288220, 0x2147: 0x40288420, - 0x2148: 0x40288620, 0x2149: 0xe00001e2, - 0x2150: 0x40084420, 0x2151: 0x40084820, 0x2152: 0x40084620, 0x2153: 0x40084a20, - 0x2154: 0x40084c20, 0x2155: 0x40084e20, 0x2156: 0x40085020, 0x2157: 0x40085220, - 0x2158: 0x40085420, 0x2159: 0x40085620, 0x215a: 0xe00000c6, 0x215b: 0xe00000c9, - 0x215c: 0x40085820, 0x215d: 0x40085a20, 0x215e: 0x40085c20, 0x215f: 0x40085e20, - 0x2160: 0x40086020, 0x2161: 0x40086220, 0x2162: 0x40086420, 0x2163: 0x40086620, - 0x2164: 0x40086820, 0x2165: 0x40086a20, 0x2166: 0x40086c20, 0x2167: 0x40086e20, - 0x2168: 0x40087020, 0x2169: 0x40087220, 0x216a: 0x40087420, 0x216b: 0x40087620, - 0x216c: 0x40087820, 0x216d: 0x40087a20, 0x216e: 0xe00000cc, 0x216f: 0x40087c20, - 0x2170: 0x40087e20, 0x2171: 0x40088020, 0x2172: 0x40088220, 0x2173: 0x40088420, - 0x2174: 0x40088620, 0x2175: 0x40088820, 0x2176: 0x40088a20, 0x2177: 0x40088c20, - 0x2178: 0x40088e20, 0x2179: 0x40089020, 0x217a: 0x40089220, 0x217b: 0x40089420, - 0x217c: 0x40089620, 0x217d: 0x40089820, 0x217e: 0x40089a20, 0x217f: 0x40089c20, - // Block 0x86, offset 0x2180 - 0x2180: 0x40089e20, 0x2181: 0x4008a020, 0x2182: 0x4008a220, 0x2183: 0x4008a420, - 0x2184: 0x4008a620, 0x2185: 0x4008a820, 0x2186: 0x4008aa20, 0x2187: 0x4008ac20, - 0x2188: 0x4008ae20, 0x2189: 0x4008b020, 0x218a: 0x4008b220, 0x218b: 0x4008b420, - 0x218c: 0x4008b620, 0x218d: 0xe00000cf, 0x218e: 0xe00000d5, 0x218f: 0xe00000d2, - 0x2190: 0x4008b820, 0x2191: 0x4008ba20, 0x2192: 0x4008bc20, 0x2193: 0x4008be20, - 0x2194: 0x4008c020, 0x2195: 0x4008c220, 0x2196: 0x4008c420, 0x2197: 0x4008c620, - 0x2198: 0x4008c820, 0x2199: 0x4008ca20, 0x219a: 0x4008cc20, 0x219b: 0x4008ce20, - 0x219c: 0x4008d020, 0x219d: 0x4008d220, 0x219e: 0x4008d420, 0x219f: 0x4008d620, - 0x21a0: 0x4008d820, 0x21a1: 0x4008da20, 0x21a2: 0x4008dc20, 0x21a3: 0x4008de20, - 0x21a4: 0x4008e020, 0x21a5: 0x4008e220, 0x21a6: 0x4008e420, 0x21a7: 0x4008e620, - 0x21a8: 0x4008e820, 0x21a9: 0x4008ea20, 0x21aa: 0x4008ec20, 0x21ab: 0x4008ee20, - 0x21ac: 0x4008f020, 0x21ad: 0x4008f220, 0x21ae: 0x4008f420, 0x21af: 0x4008f620, - 0x21b0: 0x4008f820, 0x21b1: 0x4008fa20, 0x21b2: 0x4008fc20, 0x21b3: 0x4008fe20, - 0x21b4: 0x40090020, 0x21b5: 0x40090220, 0x21b6: 0x40090420, 0x21b7: 0x40090620, - 0x21b8: 0x40090820, 0x21b9: 0x40090a20, 0x21ba: 0x40090c20, 0x21bb: 0x40090e20, - 0x21bc: 0x40091020, 0x21bd: 0x40091220, 0x21be: 0x40091420, 0x21bf: 0x40091620, - // Block 0x87, offset 0x21c0 - 0x21c0: 0x40091820, 0x21c1: 0x40091a20, 0x21c2: 0x40091c20, 0x21c3: 0x40091e20, - 0x21c4: 0xe00000d8, 0x21c5: 0x40092020, 0x21c6: 0x40092220, 0x21c7: 0x40092420, - 0x21c8: 0x40092620, 0x21c9: 0xe00000db, 0x21ca: 0x40092820, 0x21cb: 0x40092a20, - 0x21cc: 0xe00000de, 0x21cd: 0x40092c20, 0x21ce: 0x40093020, 0x21cf: 0x40093220, - 0x21d0: 0x40093420, 0x21d1: 0x40093620, 0x21d2: 0x40094e20, 0x21d3: 0x40095220, - 0x21d4: 0x40095420, 0x21d5: 0x40095620, 0x21d6: 0x40095a20, 0x21d7: 0x40095c20, - 0x21d8: 0x40095e20, 0x21d9: 0x40096020, 0x21da: 0x40096220, 0x21db: 0x40096420, - 0x21dc: 0x40096820, 0x21dd: 0x40096c20, 0x21de: 0x40096e20, 0x21df: 0x40097020, - 0x21e0: 0x40097220, 0x21e1: 0x40097420, 0x21e2: 0x40097620, 0x21e3: 0x40097820, - 0x21e4: 0xe00000ea, 0x21e5: 0x40097a20, 0x21e6: 0xe00000ed, 0x21e7: 0x40097c20, - 0x21e8: 0x40097e20, 0x21e9: 0x40098020, 0x21ea: 0x40098220, 0x21eb: 0x40098420, - 0x21ec: 0xf0001f04, 0x21ed: 0xf0000404, 0x21ee: 0x40098620, 0x21ef: 0xf0001f04, - 0x21f0: 0xf0000404, 0x21f1: 0x40098820, 0x21f2: 0x40098a20, 0x21f3: 0x40098c20, - 0x21f4: 0x40098e20, 0x21f5: 0x40099020, 0x21f6: 0x40099220, 0x21f7: 0x40099420, - 0x21f8: 0x40099620, 0x21f9: 0x40099820, 0x21fa: 0x40099a20, 0x21fb: 0x40099c20, - 0x21fc: 0x40099e20, 0x21fd: 0x4009a020, 0x21fe: 0x4009a220, 0x21ff: 0x4009a420, - // Block 0x88, offset 0x2200 - 0x2200: 0x4009a620, 0x2201: 0xe00000f5, 0x2202: 0x4009a820, 0x2203: 0x4009aa20, - 0x2204: 0xe00000f8, 0x2205: 0x4009ac20, 0x2206: 0x4009ae20, 0x2207: 0xe00000fb, - 0x2208: 0x4009b020, 0x2209: 0xe00000fe, 0x220a: 0x4009b220, 0x220b: 0x4009b420, - 0x220c: 0x4009b620, 0x220d: 0x4009b820, 0x220e: 0x4009ba20, 0x220f: 0x4009bc20, - 0x2210: 0x4009be20, 0x2211: 0x4009c020, 0x2212: 0x4009c220, 0x2213: 0x4009c420, - 0x2214: 0x4009c620, 0x2215: 0x4009c820, 0x2216: 0x4009ca20, 0x2217: 0x4009cc20, - 0x2218: 0x4009ce20, 0x2219: 0x4009d020, 0x221a: 0x4009d220, 0x221b: 0x4009d420, - 0x221c: 0x4009d620, 0x221d: 0x4009d820, 0x221e: 0x4009da20, 0x221f: 0x4009dc20, - 0x2220: 0xe00000e4, 0x2221: 0x4009de20, 0x2222: 0xe0000104, 0x2223: 0x4009e020, - 0x2224: 0x4009e220, 0x2225: 0x4009e420, 0x2226: 0x4009e620, 0x2227: 0x4009e820, - 0x2228: 0x4009ea20, 0x2229: 0x4009ec20, 0x222a: 0x4009ee20, 0x222b: 0x4009f020, - 0x222c: 0x4009f220, 0x222d: 0xe0000101, 0x222e: 0xe00000e1, 0x222f: 0xe00000e7, - 0x2230: 0xe0000107, 0x2231: 0xe000010a, 0x2232: 0x4009f420, 0x2233: 0x4009f620, - 0x2234: 0xe000010d, 0x2235: 0xe0000110, 0x2236: 0x4009f820, 0x2237: 0x4009fa20, - 0x2238: 0xe0000113, 0x2239: 0xe0000116, 0x223a: 0x4009fc20, 0x223b: 0x4009fe20, - 0x223c: 0x400a0020, 0x223d: 0x400a0220, 0x223e: 0x400a0420, 0x223f: 0x400a0620, - // Block 0x89, offset 0x2240 - 0x2240: 0xe0000119, 0x2241: 0xe000011c, 0x2242: 0x400a0820, 0x2243: 0x400a0a20, - 0x2244: 0xe0000125, 0x2245: 0xe0000128, 0x2246: 0x400a0c20, 0x2247: 0x400a0e20, - 0x2248: 0xe000012b, 0x2249: 0xe000012e, 0x224a: 0x400a1020, 0x224b: 0x400a1220, - 0x224c: 0x400a1420, 0x224d: 0x400a1620, 0x224e: 0x400a1820, 0x224f: 0x400a1a20, - 0x2250: 0x400a1c20, 0x2251: 0x400a1e20, 0x2252: 0x400a2020, 0x2253: 0x400a2220, - 0x2254: 0x400a2420, 0x2255: 0x400a2620, 0x2256: 0x400a2820, 0x2257: 0x400a2a20, - 0x2258: 0x400a2c20, 0x2259: 0x400a2e20, 0x225a: 0x400a3020, 0x225b: 0x400a3220, - 0x225c: 0x400a3420, 0x225d: 0x400a3620, 0x225e: 0x400a3820, 0x225f: 0x400a3a20, - 0x2260: 0x400a3c20, 0x2261: 0x400a3e20, 0x2262: 0x400a4020, 0x2263: 0x400a4220, - 0x2264: 0x400a4420, 0x2265: 0x400a4620, 0x2266: 0x400a4820, 0x2267: 0x400a4a20, - 0x2268: 0x400a4c20, 0x2269: 0x400a4e20, 0x226a: 0x400a5020, 0x226b: 0x400a5220, - 0x226c: 0xe0000137, 0x226d: 0xe000013a, 0x226e: 0xe000013d, 0x226f: 0xe0000140, - 0x2270: 0x400a5420, 0x2271: 0x400a5620, 0x2272: 0x400a5820, 0x2273: 0x400a5a20, - 0x2274: 0x400a5c20, 0x2275: 0x400a5e20, 0x2276: 0x400a6020, 0x2277: 0x400a6220, - 0x2278: 0x400a6420, 0x2279: 0x400a6620, 0x227a: 0x400a6820, 0x227b: 0x400a6a20, - 0x227c: 0x400a6c20, 0x227d: 0x400a7020, 0x227e: 0x400a7220, 0x227f: 0x400a7420, - // Block 0x8a, offset 0x2280 - 0x2280: 0x400a7620, 0x2281: 0x400a7820, 0x2282: 0x400a7a20, 0x2283: 0x400a7c20, - 0x2284: 0x400a7e20, 0x2285: 0x400a8020, 0x2286: 0x400a8220, 0x2287: 0x400a8420, - 0x2288: 0x400a8620, 0x2289: 0x400a8820, 0x228a: 0x400a8a20, 0x228b: 0x400a8c20, - 0x228c: 0x400a8e20, 0x228d: 0x400a9020, 0x228e: 0x400a9220, 0x228f: 0x400a9420, - 0x2290: 0x400a9620, 0x2291: 0x400a9820, 0x2292: 0x400a9a20, 0x2293: 0x400a9c20, - 0x2294: 0x400a9e20, 0x2295: 0x400aa020, 0x2296: 0x400aa220, 0x2297: 0x400aa420, - 0x2298: 0x400aa620, 0x2299: 0x400aa820, 0x229a: 0x400aaa20, 0x229b: 0x400aac20, - 0x229c: 0x400aae20, 0x229d: 0x400ab020, 0x229e: 0x400ab220, 0x229f: 0x400ab420, - 0x22a0: 0xe000011f, 0x22a1: 0xe0000122, 0x22a2: 0xe0000131, 0x22a3: 0xe0000134, - 0x22a4: 0x400ab620, 0x22a5: 0x400ab820, 0x22a6: 0x400aba20, 0x22a7: 0x400abc20, - 0x22a8: 0x400abe20, 0x22a9: 0x400ac020, 0x22aa: 0xe0000143, 0x22ab: 0xe0000146, - 0x22ac: 0xe0000149, 0x22ad: 0xe000014c, 0x22ae: 0x400ac220, 0x22af: 0x400ac420, - 0x22b0: 0x400ac620, 0x22b1: 0x400ac820, 0x22b2: 0x400aca20, 0x22b3: 0x400acc20, - 0x22b4: 0x400ace20, 0x22b5: 0x400ad020, 0x22b6: 0x400ad220, 0x22b7: 0x400ad420, - 0x22b8: 0x400ad620, 0x22b9: 0x400ad820, 0x22ba: 0x400ada20, 0x22bb: 0x400adc20, - 0x22bc: 0x400ade20, 0x22bd: 0x400ae020, 0x22be: 0x400ae220, 0x22bf: 0x400ae420, - // Block 0x8b, offset 0x22c0 - 0x22c0: 0x400ae620, 0x22c1: 0x400ae820, 0x22c2: 0x400aea20, 0x22c3: 0x400aec20, - 0x22c4: 0x400aee20, 0x22c5: 0x400af020, 0x22c6: 0x400af220, 0x22c7: 0x400af420, - 0x22c8: 0x400af620, 0x22c9: 0x400af820, 0x22ca: 0x400afa20, 0x22cb: 0x400afc20, - 0x22cc: 0x400afe20, 0x22cd: 0x400b0020, 0x22ce: 0x400b0220, 0x22cf: 0x400b0420, - 0x22d0: 0x400b0620, 0x22d1: 0x400b0820, 0x22d2: 0x400b0a20, 0x22d3: 0x400b0c20, - 0x22d4: 0x400b0e20, 0x22d5: 0x400b1020, 0x22d6: 0x400b1220, 0x22d7: 0x400b1420, - 0x22d8: 0x400b1620, 0x22d9: 0x400b1820, 0x22da: 0x400b1a20, 0x22db: 0x400b1c20, - 0x22dc: 0x400b1e20, 0x22dd: 0x400b2020, 0x22de: 0x400b2220, 0x22df: 0x400b2420, - 0x22e0: 0x400b2620, 0x22e1: 0x400b2820, 0x22e2: 0x400b2a20, 0x22e3: 0x400b2c20, - 0x22e4: 0x400b2e20, 0x22e5: 0x400b3020, 0x22e6: 0x400b3220, 0x22e7: 0x400b3420, - 0x22e8: 0x400b3620, 0x22e9: 0x40049c20, 0x22ea: 0x40049e20, 0x22eb: 0x400b3820, - 0x22ec: 0x400b3a20, 0x22ed: 0x400b3c20, 0x22ee: 0x400b3e20, 0x22ef: 0x400b4020, - 0x22f0: 0x400b4220, 0x22f1: 0x400b4420, 0x22f2: 0x400b4620, 0x22f3: 0x400b4820, - 0x22f4: 0x400b4a20, 0x22f5: 0x400b4c20, 0x22f6: 0x400b4e20, 0x22f7: 0x400b5020, - 0x22f8: 0x400b5220, 0x22f9: 0x400b5420, 0x22fa: 0x400b5620, 0x22fb: 0x400b5820, - 0x22fc: 0x400b5a20, 0x22fd: 0x400b5c20, 0x22fe: 0x400b5e20, 0x22ff: 0x400b6020, - // Block 0x8c, offset 0x2300 - 0x2300: 0x400b6220, 0x2301: 0x400b6420, 0x2302: 0x400b6620, 0x2303: 0x400b6820, - 0x2304: 0x400b6a20, 0x2305: 0x400b6c20, 0x2306: 0x400b6e20, 0x2307: 0x400b7020, - 0x2308: 0x400b7220, 0x2309: 0x400b7420, 0x230a: 0x400b7620, 0x230b: 0x400b7820, - 0x230c: 0x400b7a20, 0x230d: 0x400b7c20, 0x230e: 0x400b7e20, 0x230f: 0x400b8020, - 0x2310: 0x400b8220, 0x2311: 0x400b8420, 0x2312: 0x400b8620, 0x2313: 0x400b8820, - 0x2314: 0x400b8a20, 0x2315: 0x400b8c20, 0x2316: 0x400b8e20, 0x2317: 0x400b9020, - 0x2318: 0x400b9220, 0x2319: 0x400b9420, 0x231a: 0x400b9620, 0x231b: 0x400b9820, - 0x231c: 0x400b9a20, 0x231d: 0x400b9c20, 0x231e: 0x400b9e20, 0x231f: 0x400ba020, - 0x2320: 0x400ba220, 0x2321: 0x400ba420, 0x2322: 0x400ba620, 0x2323: 0x400ba820, - 0x2324: 0x400baa20, 0x2325: 0x400bac20, 0x2326: 0x400bae20, 0x2327: 0x400bb020, - 0x2328: 0x400bb220, 0x2329: 0x400bb420, 0x232a: 0x400bb620, 0x232b: 0x400bb820, - 0x232c: 0x400bba20, 0x232d: 0x400bbc20, 0x232e: 0x400bbe20, 0x232f: 0x400bc020, - 0x2330: 0x400bc220, 0x2331: 0x400bc420, 0x2332: 0x400bc620, 0x2333: 0x400bc820, - 0x2334: 0x400bca20, 0x2335: 0x400bcc20, 0x2336: 0x400bce20, 0x2337: 0x400bd020, - 0x2338: 0x400bd220, 0x2339: 0x400bd420, 0x233a: 0x400bd620, 0x233b: 0x400bd820, - 0x233c: 0x400bda20, 0x233d: 0x400bdc20, 0x233e: 0x400bde20, 0x233f: 0x400be020, - // Block 0x8d, offset 0x2340 - 0x2340: 0x400be220, 0x2341: 0x400be420, 0x2342: 0x400be620, 0x2343: 0x400be820, - 0x2344: 0x400bea20, 0x2345: 0x400bec20, 0x2346: 0x400bee20, 0x2347: 0x400bf020, - 0x2348: 0x400bf220, 0x2349: 0x400bf420, 0x234a: 0x400bf620, 0x234b: 0x400bf820, - 0x234c: 0x400bfa20, 0x234d: 0x400bfc20, 0x234e: 0x400bfe20, 0x234f: 0x400c0020, - 0x2350: 0x400c0220, 0x2351: 0x400c0420, 0x2352: 0x400c0620, 0x2353: 0x400c0820, - 0x2354: 0x400c0a20, 0x2355: 0x400c0c20, 0x2356: 0x400c0e20, 0x2357: 0x400c1020, - 0x2358: 0x400c1220, 0x2359: 0x400c1420, 0x235a: 0x400c1620, 0x235b: 0x400c1820, - 0x235c: 0x400c1a20, 0x235d: 0x400c1c20, 0x235e: 0x400c1e20, 0x235f: 0x400c2020, - 0x2360: 0x400c2220, 0x2361: 0x400c2420, 0x2362: 0x400c2620, 0x2363: 0x400c2820, - 0x2364: 0x400c2a20, 0x2365: 0x400c2c20, 0x2366: 0x400c2e20, 0x2367: 0x400c3020, - 0x2368: 0x400c3220, 0x2369: 0x400c3420, 0x236a: 0x400c3620, 0x236b: 0x400c3820, - 0x236c: 0x400c3a20, 0x236d: 0x400c3c20, 0x236e: 0x400c3e20, 0x236f: 0x400c4020, - 0x2370: 0x400c4220, 0x2371: 0x400c4420, 0x2372: 0x400c4620, 0x2373: 0x400c4820, - 0x2374: 0x400c4a20, 0x2375: 0x400c4c20, 0x2376: 0x400c4e20, 0x2377: 0x400c5020, - 0x2378: 0x400c5220, 0x2379: 0x400c5420, 0x237a: 0x400c5620, 0x237b: 0x400c5820, - 0x237c: 0x400c5a20, 0x237d: 0x400c5c20, 0x237e: 0x400c5e20, 0x237f: 0x400c6020, - // Block 0x8e, offset 0x2380 - 0x2380: 0x400c6220, 0x2381: 0x400c6420, 0x2382: 0x400c6620, 0x2383: 0x400c6820, - 0x2384: 0x400c6a20, 0x2385: 0x400c6c20, 0x2386: 0x400c6e20, 0x2387: 0x400c7020, - 0x2388: 0x400c7220, 0x2389: 0x400c7420, 0x238a: 0x400c7620, 0x238b: 0x400c7820, - 0x238c: 0x400c7a20, 0x238d: 0x400c7c20, 0x238e: 0x400c7e20, 0x238f: 0x400c8020, - 0x2390: 0x400c8220, 0x2391: 0x400c8420, 0x2392: 0x400c8620, 0x2393: 0x400c8820, - 0x2394: 0x400c8a20, 0x2395: 0x400c8c20, 0x2396: 0x400c8e20, 0x2397: 0x400c9020, - 0x2398: 0x400c9220, 0x2399: 0x400c9420, 0x239a: 0x400c9620, 0x239b: 0x400c9820, - 0x239c: 0x400c9a20, 0x239d: 0x400c9c20, 0x239e: 0x400c9e20, 0x239f: 0x400ca020, - 0x23a0: 0x400ca220, 0x23a1: 0x400ca420, 0x23a2: 0x400ca620, 0x23a3: 0x400ca820, - 0x23a4: 0x400caa20, 0x23a5: 0x400cac20, 0x23a6: 0x400cae20, 0x23a7: 0x400cb020, - 0x23a8: 0x400cb220, 0x23a9: 0x400cb420, 0x23aa: 0x400cb620, 0x23ab: 0x400cb820, - 0x23ac: 0x400cba20, 0x23ad: 0x400cbc20, 0x23ae: 0x400cbe20, 0x23af: 0x400cc020, - 0x23b0: 0x400cc220, 0x23b1: 0x400cc420, 0x23b2: 0x400cc620, 0x23b3: 0x400cc820, - // Block 0x8f, offset 0x23c0 - 0x23c0: 0x400cca20, 0x23c1: 0x400ccc20, 0x23c2: 0x400cce20, 0x23c3: 0x400cd020, - 0x23c4: 0x400cd220, 0x23c5: 0x400cd420, 0x23c6: 0x400cd620, 0x23c7: 0x400cd820, - 0x23c8: 0x400cda20, 0x23c9: 0x400cdc20, 0x23ca: 0x400cde20, 0x23cb: 0x400ce020, - 0x23cc: 0x400ce220, 0x23cd: 0x400ce420, 0x23ce: 0x400ce620, 0x23cf: 0x400ce820, - 0x23d0: 0x400cea20, 0x23d1: 0x400cec20, 0x23d2: 0x400cee20, 0x23d3: 0x400cf020, - 0x23d4: 0x400cf220, 0x23d5: 0x400cf420, 0x23d6: 0x400cf620, 0x23d7: 0x400cf820, - 0x23d8: 0x400cfa20, 0x23d9: 0x400cfc20, 0x23da: 0x400cfe20, 0x23db: 0x400d0020, - 0x23dc: 0x400d0220, 0x23dd: 0x400d0420, 0x23de: 0x400d0620, 0x23df: 0x400d0820, - 0x23e0: 0x400d0a20, 0x23e1: 0x400d0c20, 0x23e2: 0x400d0e20, 0x23e3: 0x400d1020, - 0x23e4: 0x400d1220, 0x23e5: 0x400d1420, 0x23e6: 0x400d1620, - // Block 0x90, offset 0x2400 - 0x2400: 0x400d1820, 0x2401: 0x400d1a20, 0x2402: 0x400d1c20, 0x2403: 0x400d1e20, - 0x2404: 0x400d2020, 0x2405: 0x400d2220, 0x2406: 0x400d2420, 0x2407: 0x400d2620, - 0x2408: 0x400d2820, 0x2409: 0x400d2a20, 0x240a: 0x400d2c20, - 0x2420: 0x0029ce86, 0x2421: 0x0029d086, 0x2422: 0x0029d286, 0x2423: 0x0029d486, - 0x2424: 0x0029d686, 0x2425: 0x0029d886, 0x2426: 0x0029da86, 0x2427: 0x0029dc86, - 0x2428: 0x0029de86, 0x2429: 0xf0000606, 0x242a: 0xf0000606, 0x242b: 0xf0000606, - 0x242c: 0xf0000606, 0x242d: 0xf0000606, 0x242e: 0xf0000606, 0x242f: 0xf0000606, - 0x2430: 0xf0000606, 0x2431: 0xf0000606, 0x2432: 0xf0000606, 0x2433: 0xf0000606, - 0x2434: 0xf0000404, 0x2435: 0xf0000404, 0x2436: 0xf0000404, 0x2437: 0xf0000404, - 0x2438: 0xf0000404, 0x2439: 0xf0000404, 0x243a: 0xf0000404, 0x243b: 0xf0000404, - 0x243c: 0xf0000404, 0x243d: 0xe0000015, 0x243e: 0xe000001a, 0x243f: 0xe000001f, - // Block 0x91, offset 0x2440 - 0x2440: 0xe0000024, 0x2441: 0xe0000029, 0x2442: 0xe000002e, 0x2443: 0xe0000033, - 0x2444: 0xe0000038, 0x2445: 0xe000003d, 0x2446: 0xe0000042, 0x2447: 0xe0000047, - 0x2448: 0xf0001f04, 0x2449: 0xf0001f04, 0x244a: 0xf0001f04, 0x244b: 0xf0001f04, - 0x244c: 0xf0001f04, 0x244d: 0xf0001f04, 0x244e: 0xf0001f04, 0x244f: 0xf0001f04, - 0x2450: 0xf0001f04, 0x2451: 0xf0000404, 0x2452: 0xf0000404, 0x2453: 0xf0000404, - 0x2454: 0xf0000404, 0x2455: 0xf0000404, 0x2456: 0xf0000404, 0x2457: 0xf0000404, - 0x2458: 0xf0000404, 0x2459: 0xf0000404, 0x245a: 0xf0000404, 0x245b: 0xf0000404, - 0x245c: 0xf0000404, 0x245d: 0xf0000404, 0x245e: 0xf0000404, 0x245f: 0xf0000404, - 0x2460: 0xf0000404, 0x2461: 0xf0000404, 0x2462: 0xf0000404, 0x2463: 0xf0000404, - 0x2464: 0xf0000404, 0x2465: 0xf0000404, 0x2466: 0xf0000404, 0x2467: 0xf0000404, - 0x2468: 0xf0000404, 0x2469: 0xf0000404, 0x246a: 0xf0000404, 0x246b: 0xf0000404, - 0x246c: 0xf0000404, 0x246d: 0xf0000404, 0x246e: 0xf0000404, 0x246f: 0xf0000404, - 0x2470: 0xf0000404, 0x2471: 0xf0000404, 0x2472: 0xf0000404, 0x2473: 0xf0000404, - 0x2474: 0xf0000404, 0x2475: 0xf0000404, 0x2476: 0x002bde8c, 0x2477: 0x002c0a8c, - 0x2478: 0x002c3a8c, 0x2479: 0x002c628c, 0x247a: 0x002c988c, 0x247b: 0x002d088c, - 0x247c: 0x002d228c, 0x247d: 0x002d688c, 0x247e: 0x002d9a8c, 0x247f: 0x002dcc8c, - // Block 0x92, offset 0x2480 - 0x2480: 0x002dfe8c, 0x2481: 0x002e228c, 0x2482: 0x002e828c, 0x2483: 0x002e9e8c, - 0x2484: 0x002ee28c, 0x2485: 0x002f2c8c, 0x2486: 0x002f568c, 0x2487: 0x002f7a8c, - 0x2488: 0x002fe68c, 0x2489: 0x00302c8c, 0x248a: 0x00306c8c, 0x248b: 0x0030be8c, - 0x248c: 0x0030e28c, 0x248d: 0x0030f68c, 0x248e: 0x0031008c, 0x248f: 0x00312a8c, - 0x2490: 0x002bde86, 0x2491: 0x002c0a86, 0x2492: 0x002c3a86, 0x2493: 0x002c6286, - 0x2494: 0x002c9886, 0x2495: 0x002d0886, 0x2496: 0x002d2286, 0x2497: 0x002d6886, - 0x2498: 0x002d9a86, 0x2499: 0x002dcc86, 0x249a: 0x002dfe86, 0x249b: 0x002e2286, - 0x249c: 0x002e8286, 0x249d: 0x002e9e86, 0x249e: 0x002ee286, 0x249f: 0x002f2c86, - 0x24a0: 0x002f5686, 0x24a1: 0x002f7a86, 0x24a2: 0x002fe686, 0x24a3: 0x00302c86, - 0x24a4: 0x00306c86, 0x24a5: 0x0030be86, 0x24a6: 0x0030e286, 0x24a7: 0x0030f686, - 0x24a8: 0x00310086, 0x24a9: 0x00312a86, 0x24aa: 0x0029cc86, 0x24ab: 0xe00002e6, - 0x24ac: 0xe00002e9, 0x24ad: 0xe00002ec, 0x24ae: 0xe00002ef, 0x24af: 0xe00002f2, - 0x24b0: 0xe00002f5, 0x24b1: 0xe00002f8, 0x24b2: 0xe00002fb, 0x24b3: 0xe00002fe, - 0x24b4: 0xe00003d5, 0x24b5: 0x0029ce86, 0x24b6: 0x0029d086, 0x24b7: 0x0029d286, - 0x24b8: 0x0029d486, 0x24b9: 0x0029d686, 0x24ba: 0x0029d886, 0x24bb: 0x0029da86, - 0x24bc: 0x0029dc86, 0x24bd: 0x0029de86, 0x24be: 0xe00002d7, 0x24bf: 0x0029cc86, - // Block 0x93, offset 0x24c0 - 0x24c0: 0x400d2e20, 0x24c1: 0x400d3020, 0x24c2: 0x400d3220, 0x24c3: 0x400d3420, - 0x24c4: 0x400d3620, 0x24c5: 0x400d3820, 0x24c6: 0x400d3a20, 0x24c7: 0x400d3c20, - 0x24c8: 0x400d3e20, 0x24c9: 0x400d4020, 0x24ca: 0x400d4220, 0x24cb: 0x400d4420, - 0x24cc: 0x400d4620, 0x24cd: 0x400d4820, 0x24ce: 0x400d4a20, 0x24cf: 0x400d4c20, - 0x24d0: 0x400d4e20, 0x24d1: 0x400d5020, 0x24d2: 0x400d5220, 0x24d3: 0x400d5420, - 0x24d4: 0x400d5620, 0x24d5: 0x400d5820, 0x24d6: 0x400d5a20, 0x24d7: 0x400d5c20, - 0x24d8: 0x400d5e20, 0x24d9: 0x400d6020, 0x24da: 0x400d6220, 0x24db: 0x400d6420, - 0x24dc: 0x400d6620, 0x24dd: 0x400d6820, 0x24de: 0x400d6a20, 0x24df: 0x400d6c20, - 0x24e0: 0x400d6e20, 0x24e1: 0x400d7020, 0x24e2: 0x400d7220, 0x24e3: 0x400d7420, - 0x24e4: 0x400d7620, 0x24e5: 0x400d7820, 0x24e6: 0x400d7a20, 0x24e7: 0x400d7c20, - 0x24e8: 0x400d7e20, 0x24e9: 0x400d8020, 0x24ea: 0x400d8220, 0x24eb: 0x400d8420, - 0x24ec: 0x400d8620, 0x24ed: 0x400d8820, 0x24ee: 0x400d8a20, 0x24ef: 0x400d8c20, - 0x24f0: 0x400d8e20, 0x24f1: 0x400d9020, 0x24f2: 0x400d9220, 0x24f3: 0x400d9420, - 0x24f4: 0x400d9620, 0x24f5: 0x400d9820, 0x24f6: 0x400d9a20, 0x24f7: 0x400d9c20, - 0x24f8: 0x400d9e20, 0x24f9: 0x400da020, 0x24fa: 0x400da220, 0x24fb: 0x400da420, - 0x24fc: 0x400da620, 0x24fd: 0x400da820, 0x24fe: 0x400daa20, 0x24ff: 0x400dac20, - // Block 0x94, offset 0x2500 - 0x2500: 0x400dae20, 0x2501: 0x400db020, 0x2502: 0x400db220, 0x2503: 0x400db420, - 0x2504: 0x400db620, 0x2505: 0x400db820, 0x2506: 0x400dba20, 0x2507: 0x400dbc20, - 0x2508: 0x400dbe20, 0x2509: 0x400dc020, 0x250a: 0x400dc220, 0x250b: 0x400dc420, - 0x250c: 0x400dc620, 0x250d: 0x400dc820, 0x250e: 0x400dca20, 0x250f: 0x400dcc20, - 0x2510: 0x400dce20, 0x2511: 0x400dd020, 0x2512: 0x400dd220, 0x2513: 0x400dd420, - 0x2514: 0x400dd620, 0x2515: 0x400dd820, 0x2516: 0x400dda20, 0x2517: 0x400ddc20, - 0x2518: 0x400dde20, 0x2519: 0x400de020, 0x251a: 0x400de220, 0x251b: 0x400de420, - 0x251c: 0x400de620, 0x251d: 0x400de820, 0x251e: 0x400dea20, 0x251f: 0x400dec20, - 0x2520: 0x400dee20, 0x2521: 0x400df020, 0x2522: 0x400df220, 0x2523: 0x400df420, - 0x2524: 0x400df620, 0x2525: 0x400df820, 0x2526: 0x400dfa20, 0x2527: 0x400dfc20, - 0x2528: 0x400dfe20, 0x2529: 0x400e0020, 0x252a: 0x400e0220, 0x252b: 0x400e0420, - 0x252c: 0x400e0620, 0x252d: 0x400e0820, 0x252e: 0x400e0a20, 0x252f: 0x400e0c20, - 0x2530: 0x400e0e20, 0x2531: 0x400e1020, 0x2532: 0x400e1220, 0x2533: 0x400e1420, - 0x2534: 0x400e1620, 0x2535: 0x400e1820, 0x2536: 0x400e1a20, 0x2537: 0x400e1c20, - 0x2538: 0x400e1e20, 0x2539: 0x400e2020, 0x253a: 0x400e2220, 0x253b: 0x400e2420, - 0x253c: 0x400e2620, 0x253d: 0x400e2820, 0x253e: 0x400e2a20, 0x253f: 0x400e2c20, - // Block 0x95, offset 0x2540 - 0x2540: 0x400e2e20, 0x2541: 0x400e3020, 0x2542: 0x400e3220, 0x2543: 0x400e3420, - 0x2544: 0x400e3620, 0x2545: 0x400e3820, 0x2546: 0x400e3a20, 0x2547: 0x400e3c20, - 0x2548: 0x400e3e20, 0x2549: 0x400e4020, 0x254a: 0x400e4220, 0x254b: 0x400e4420, - 0x254c: 0x400e4620, 0x254d: 0x400e4820, 0x254e: 0x400e4a20, 0x254f: 0x400e4c20, - 0x2550: 0x400e4e20, 0x2551: 0x400e5020, 0x2552: 0x400e5220, 0x2553: 0x400e5420, - 0x2554: 0x400e5620, 0x2555: 0x400e5820, 0x2556: 0x400e5a20, 0x2557: 0x400e5c20, - 0x2558: 0x400e5e20, 0x2559: 0x400e6020, 0x255a: 0x400e6220, 0x255b: 0x400e6420, - 0x255c: 0x400e6620, 0x255d: 0x400e6820, 0x255e: 0x400e6a20, 0x255f: 0x400e6c20, - 0x2560: 0x400e6e20, 0x2561: 0x400e7020, 0x2562: 0x400e7220, 0x2563: 0x400e7420, - 0x2564: 0x400e7620, 0x2565: 0x400e7820, 0x2566: 0x400e7a20, 0x2567: 0x400e7c20, - 0x2568: 0x400e7e20, 0x2569: 0x400e8020, 0x256a: 0x400e8220, 0x256b: 0x400e8420, - 0x256c: 0x400e8620, 0x256d: 0x400e8820, 0x256e: 0x400e8a20, 0x256f: 0x400e8c20, - 0x2570: 0x400e8e20, 0x2571: 0x400e9020, 0x2572: 0x400e9220, 0x2573: 0x400e9420, - 0x2574: 0x400e9620, 0x2575: 0x400e9820, 0x2576: 0x400e9a20, 0x2577: 0x400e9c20, - 0x2578: 0x400e9e20, 0x2579: 0x400ea020, 0x257a: 0x400ea220, 0x257b: 0x400ea420, - 0x257c: 0x400ea620, 0x257d: 0x400ea820, 0x257e: 0x400eaa20, 0x257f: 0x400eac20, - // Block 0x96, offset 0x2580 - 0x2580: 0x400eae20, 0x2581: 0x400eb020, 0x2582: 0x400eb220, 0x2583: 0x400eb420, - 0x2584: 0x400eb620, 0x2585: 0x400eb820, 0x2586: 0x400eba20, 0x2587: 0x400ebc20, - 0x2588: 0x400ebe20, 0x2589: 0x400ec020, 0x258a: 0x400ec220, 0x258b: 0x400ec420, - 0x258c: 0x400ec620, 0x258d: 0x400ec820, 0x258e: 0x400eca20, 0x258f: 0x400ecc20, - 0x2590: 0x400ece20, 0x2591: 0x400ed020, 0x2592: 0x400ed220, 0x2593: 0x400ed420, - 0x2594: 0x400ed620, 0x2595: 0x400ed820, 0x2596: 0x400eda20, 0x2597: 0x400edc20, - 0x2598: 0x400ede20, 0x2599: 0x400ee020, 0x259a: 0x400ee220, 0x259b: 0x400ee420, - 0x259c: 0x400ee620, 0x259d: 0x400ee820, 0x259e: 0x400eea20, 0x259f: 0x400eec20, - 0x25a0: 0x400eee20, 0x25a1: 0x400ef020, 0x25a2: 0x400ef220, 0x25a3: 0x400ef420, - 0x25a4: 0x400ef620, 0x25a5: 0x400ef820, 0x25a6: 0x400efa20, 0x25a7: 0x400efc20, - 0x25a8: 0x400efe20, 0x25a9: 0x400f0020, 0x25aa: 0x400f0220, 0x25ab: 0x400f0420, - 0x25ac: 0x400f0620, 0x25ad: 0x400f0820, 0x25ae: 0x400f0a20, 0x25af: 0x400f0c20, - 0x25b0: 0x400f0e20, 0x25b1: 0x400f1020, 0x25b2: 0x400f1220, 0x25b3: 0x400f1420, - 0x25b4: 0x400f1620, 0x25b5: 0x400f1820, 0x25b6: 0x400f1a20, 0x25b7: 0x400f1c20, - 0x25b8: 0x400f1e20, 0x25b9: 0x400f2020, 0x25ba: 0x400f2220, 0x25bb: 0x400f2420, - 0x25bc: 0x400f2620, 0x25bd: 0x400f2820, 0x25be: 0x400f2a20, 0x25bf: 0x400f2c20, - // Block 0x97, offset 0x25c0 - 0x25c0: 0x400f2e20, 0x25c1: 0x400f3020, 0x25c2: 0x400f3220, 0x25c3: 0x400f3420, - 0x25c4: 0x400f3620, 0x25c5: 0x400f3820, 0x25c6: 0x400f3a20, 0x25c7: 0x400f3c20, - 0x25c8: 0x400f3e20, 0x25c9: 0x400f4020, 0x25ca: 0x400f4220, 0x25cb: 0x400f4420, - 0x25cc: 0x400f4620, 0x25cd: 0x400f4820, 0x25ce: 0x400f4a20, 0x25cf: 0x400f4c20, - 0x25d0: 0x400f4e20, 0x25d1: 0x400f5020, 0x25d2: 0x400f5220, 0x25d3: 0x400f5420, - 0x25d4: 0x400f5620, 0x25d5: 0x400f5820, 0x25d6: 0x400f5a20, 0x25d7: 0x400f5c20, - 0x25d8: 0x400f5e20, 0x25d9: 0x400f6020, 0x25da: 0x400f6220, 0x25db: 0x400f6420, - 0x25dc: 0x400f6620, 0x25dd: 0x400f6820, 0x25de: 0x400f6a20, 0x25df: 0x400f6c20, - 0x25e0: 0x400f6e20, 0x25e1: 0x400f7020, 0x25e2: 0x400f7220, 0x25e3: 0x400f7420, - 0x25e4: 0x400f7620, 0x25e5: 0x400f7820, 0x25e6: 0x400f7a20, 0x25e7: 0x400f7c20, - 0x25e8: 0x400f7e20, 0x25e9: 0x400f8020, 0x25ea: 0x400f8220, 0x25eb: 0x400f8420, - 0x25ec: 0x400f8620, 0x25ed: 0x400f8820, 0x25ee: 0x400f8a20, 0x25ef: 0x400f8c20, - 0x25f0: 0x40195220, 0x25f1: 0x40195420, 0x25f2: 0x40195620, 0x25f3: 0x40195820, - 0x25f4: 0x40195a20, 0x25f5: 0x40195c20, 0x25f6: 0x40195e20, 0x25f7: 0x40196020, - 0x25f8: 0x400f8e20, 0x25f9: 0x400f9020, 0x25fa: 0x400f9220, 0x25fb: 0x400f9420, - 0x25fc: 0x400f9620, 0x25fd: 0x400f9820, 0x25fe: 0x400f9a20, 0x25ff: 0x400f9c20, - // Block 0x98, offset 0x2600 - 0x2600: 0x400f9e20, 0x2601: 0x400fa020, 0x2602: 0x400fa220, 0x2603: 0x400fa420, - 0x2604: 0x400fa620, 0x2605: 0x400fa820, 0x2606: 0x400faa20, 0x2607: 0x400fac20, - 0x2608: 0x400fae20, 0x2609: 0x400fb020, 0x260a: 0x400fb220, 0x260b: 0x400fb420, - 0x260c: 0x400fb620, 0x260d: 0x400fb820, 0x260e: 0x400fba20, 0x260f: 0x400fbc20, - 0x2610: 0x400fbe20, 0x2611: 0x400fc020, 0x2612: 0x400fc220, 0x2613: 0x400fc420, - 0x2614: 0x400fc620, 0x2615: 0x400fc820, 0x2616: 0x400fca20, 0x2617: 0x400fcc20, - 0x2618: 0x400fce20, 0x2619: 0x400fd020, 0x261a: 0x400fd220, 0x261b: 0x400fd420, - 0x261c: 0x400fd620, 0x261d: 0x400fd820, 0x261e: 0x400fda20, 0x261f: 0x400fdc20, - 0x2620: 0x400fde20, 0x2621: 0x400fe020, 0x2622: 0x400fe220, 0x2623: 0x400fe420, - 0x2624: 0x400fe620, 0x2625: 0x400fe820, 0x2626: 0x400fea20, 0x2627: 0x400fec20, - 0x2628: 0x400fee20, 0x2629: 0x400ff020, 0x262a: 0x400ff220, 0x262b: 0x400ff420, - 0x262c: 0x400ff620, 0x262d: 0x401dde20, 0x262e: 0x401de020, 0x262f: 0x401de220, - 0x2630: 0x400ff820, 0x2631: 0x400ffa20, 0x2632: 0x400ffc20, 0x2633: 0x400ffe20, - 0x2634: 0x40100020, 0x2635: 0x40100220, 0x2636: 0x40100420, 0x2637: 0x40100620, - 0x2638: 0x40100820, 0x2639: 0x40100a20, 0x263a: 0x40100c20, 0x263b: 0x40100e20, - 0x263c: 0x40101020, 0x263d: 0x40101220, 0x263e: 0x40101420, 0x263f: 0x40101620, - // Block 0x99, offset 0x2640 - 0x2640: 0x40101820, 0x2641: 0x40101a20, 0x2642: 0x40101c20, 0x2643: 0x40101e20, - 0x2644: 0x40102020, 0x2645: 0x40102220, 0x2646: 0x40102420, 0x2647: 0x40102620, - 0x2648: 0x40102820, 0x2649: 0x40102a20, 0x264a: 0x40194620, 0x264b: 0x40194820, - 0x264c: 0x40194a20, 0x264d: 0x40194c20, 0x264e: 0x40194e20, 0x264f: 0x40195020, - 0x2650: 0x40102c20, 0x2651: 0x40102e20, 0x2652: 0x40103020, 0x2653: 0x40103220, - 0x2654: 0x40103420, 0x2655: 0x40103620, 0x2656: 0x40103820, 0x2657: 0x40103a20, - 0x2658: 0x40103c20, 0x2659: 0x40103e20, 0x265a: 0x40104020, 0x265b: 0x40104220, - 0x265c: 0x40104420, 0x265d: 0x40104620, 0x265e: 0x40104820, 0x265f: 0x40104a20, - 0x2660: 0x40104c20, 0x2661: 0x40104e20, 0x2662: 0x40105020, 0x2663: 0x40105220, - 0x2664: 0x40105420, 0x2665: 0x40105620, 0x2666: 0x40105820, 0x2667: 0x40105a20, - 0x2668: 0x40105c20, 0x2669: 0x40105e20, 0x266a: 0x40106020, 0x266b: 0x40106220, - 0x266c: 0x40106420, 0x266d: 0x40106620, 0x266e: 0x40106820, 0x266f: 0x40106a20, - 0x2670: 0x40106c20, 0x2671: 0x40106e20, 0x2672: 0x40107020, 0x2673: 0x40107220, - 0x2674: 0x40107420, 0x2675: 0x40107620, 0x2676: 0x40107820, 0x2677: 0x40107a20, - 0x2678: 0x40107c20, 0x2679: 0x40107e20, 0x267a: 0x40108020, 0x267b: 0x40108220, - 0x267c: 0x40108420, 0x267d: 0x40108620, 0x267e: 0x40108820, 0x267f: 0x40108a20, - // Block 0x9a, offset 0x2680 - 0x2680: 0x40108c20, 0x2681: 0x40108e20, 0x2682: 0x40109020, 0x2683: 0x40109220, - 0x2684: 0x40109420, 0x2685: 0x40109620, 0x2686: 0x40109820, 0x2687: 0x40109a20, - 0x2688: 0x40109c20, 0x2689: 0x40109e20, 0x268a: 0x4010a020, 0x268b: 0x4010a220, - 0x268c: 0x4010a420, 0x268d: 0x4010a620, 0x268e: 0x4010a820, 0x268f: 0x4010aa20, - 0x2690: 0x4010ac20, 0x2691: 0x4010ae20, 0x2692: 0x4010b020, 0x2693: 0x4010b220, - 0x2694: 0x4010b420, 0x2695: 0x4010b620, 0x2696: 0x4010b820, 0x2697: 0x4010ba20, - 0x2698: 0x4010bc20, 0x2699: 0x4010be20, 0x269a: 0x4010c020, 0x269b: 0x4010c220, - 0x269c: 0x4010c420, 0x269d: 0x4010c620, 0x269e: 0x4010c820, 0x269f: 0x4010ca20, - 0x26a0: 0x4010cc20, 0x26a1: 0x4010ce20, 0x26a2: 0x4010d020, 0x26a3: 0x4010d220, - 0x26a4: 0x4010d420, 0x26a5: 0x4010d620, 0x26a6: 0x4010d820, 0x26a7: 0x4010da20, - 0x26a8: 0x4010dc20, 0x26a9: 0x4010de20, 0x26aa: 0x4010e020, 0x26ab: 0x4010e220, - 0x26ac: 0x4010e420, 0x26ad: 0x4010e620, 0x26ae: 0x4010e820, 0x26af: 0x4010ea20, - 0x26b0: 0x4010ec20, 0x26b1: 0x4010ee20, 0x26b2: 0x4010f020, 0x26b3: 0x4010f220, - 0x26b4: 0x4010f420, 0x26b5: 0x4010f620, 0x26b6: 0x4010f820, 0x26b7: 0x4010fa20, - 0x26b8: 0x4010fc20, 0x26b9: 0x4010fe20, 0x26ba: 0x40110020, 0x26bb: 0x40110220, - 0x26bc: 0x40110420, 0x26bd: 0x40110620, 0x26be: 0x40110820, 0x26bf: 0x40110a20, - // Block 0x9b, offset 0x26c0 - 0x26c1: 0x40114020, 0x26c2: 0x40114220, 0x26c3: 0x40114420, - 0x26c4: 0x40114620, 0x26c5: 0x40114820, 0x26c6: 0x40114a20, 0x26c7: 0x40114c20, - 0x26c8: 0x40114e20, 0x26c9: 0x40115020, 0x26ca: 0x40115220, 0x26cb: 0x40115420, - 0x26cc: 0x40115620, 0x26cd: 0x40115820, 0x26ce: 0x40115a20, 0x26cf: 0x40115c20, - 0x26d0: 0x40115e20, 0x26d1: 0x40116020, 0x26d2: 0x40116220, 0x26d3: 0x40116420, - 0x26d4: 0x40116620, 0x26d5: 0x40116820, 0x26d6: 0x40116a20, 0x26d7: 0x40116c20, - 0x26d8: 0x40116e20, 0x26d9: 0x40117020, 0x26da: 0x40117220, 0x26db: 0x40117420, - 0x26dc: 0x40117620, 0x26dd: 0x40117820, 0x26de: 0x40117a20, 0x26df: 0x40117c20, - 0x26e0: 0x40117e20, 0x26e1: 0x40118020, 0x26e2: 0x40118220, 0x26e3: 0x40118420, - 0x26e4: 0x40118620, 0x26e5: 0x40118820, 0x26e6: 0x40118a20, 0x26e7: 0x40118c20, - 0x26e8: 0x40118e20, 0x26e9: 0x40119020, 0x26ea: 0x40119220, 0x26eb: 0x40119420, - 0x26ec: 0x40119620, 0x26ed: 0x40119820, 0x26ee: 0x40119a20, 0x26ef: 0x40119c20, - 0x26f0: 0x40119e20, 0x26f1: 0x4011a020, 0x26f2: 0x4011a220, 0x26f3: 0x4011a420, - 0x26f4: 0x4011a620, 0x26f5: 0x4011a820, 0x26f6: 0x4011aa20, 0x26f7: 0x4011ac20, - 0x26f8: 0x4011ae20, 0x26f9: 0x4011b020, 0x26fa: 0x4011b220, 0x26fb: 0x4011b420, - 0x26fc: 0x4011b620, 0x26fd: 0x4011b820, 0x26fe: 0x4011ba20, 0x26ff: 0x4011bc20, - // Block 0x9c, offset 0x2700 - 0x2700: 0x4011be20, 0x2701: 0x4011c020, 0x2702: 0x4011c220, 0x2703: 0x4011c420, - 0x2704: 0x4011c620, 0x2705: 0x4011c820, 0x2706: 0x4011ca20, 0x2707: 0x4011cc20, - 0x2708: 0x4011ce20, 0x2709: 0x4011d020, 0x270a: 0x4011d220, 0x270b: 0x4011d420, - 0x270c: 0x4011d620, 0x270d: 0x4011d820, 0x270e: 0x4011da20, 0x270f: 0x4011dc20, - 0x2710: 0x4011de20, 0x2711: 0x4011e020, 0x2712: 0x4011e220, 0x2713: 0x4011e420, - 0x2714: 0x4011e620, 0x2715: 0x4011e820, 0x2716: 0x4011ea20, 0x2717: 0x4011ec20, - 0x2718: 0x4011ee20, 0x2719: 0x4011f020, 0x271a: 0x4011f220, 0x271b: 0x4011f420, - 0x271c: 0x4011f620, 0x271d: 0x4011f820, 0x271e: 0x4011fa20, 0x271f: 0x4011fc20, - 0x2720: 0x4011fe20, 0x2721: 0x40120020, 0x2722: 0x40120220, 0x2723: 0x40120420, - 0x2724: 0x40120620, 0x2725: 0x40120820, 0x2726: 0x40120a20, 0x2727: 0x40120c20, - 0x2728: 0x40045820, 0x2729: 0x40045a20, 0x272a: 0x40045c20, 0x272b: 0x40045e20, - 0x272c: 0x40046020, 0x272d: 0x40046220, 0x272e: 0x40046420, 0x272f: 0x40046620, - 0x2730: 0x40046820, 0x2731: 0x40046a20, 0x2732: 0x40046c20, 0x2733: 0x40046e20, - 0x2734: 0x40047020, 0x2735: 0x40047220, 0x2736: 0x0029ce86, 0x2737: 0x0029d086, - 0x2738: 0x0029d286, 0x2739: 0x0029d486, 0x273a: 0x0029d686, 0x273b: 0x0029d886, - 0x273c: 0x0029da86, 0x273d: 0x0029dc86, 0x273e: 0x0029de86, 0x273f: 0xe00002da, - // Block 0x9d, offset 0x2740 - 0x2740: 0x0029ce86, 0x2741: 0x0029d086, 0x2742: 0x0029d286, 0x2743: 0x0029d486, - 0x2744: 0x0029d686, 0x2745: 0x0029d886, 0x2746: 0x0029da86, 0x2747: 0x0029dc86, - 0x2748: 0x0029de86, 0x2749: 0xe00002dd, 0x274a: 0x0029ce86, 0x274b: 0x0029d086, - 0x274c: 0x0029d286, 0x274d: 0x0029d486, 0x274e: 0x0029d686, 0x274f: 0x0029d886, - 0x2750: 0x0029da86, 0x2751: 0x0029dc86, 0x2752: 0x0029de86, 0x2753: 0xe00002e0, - 0x2754: 0x40120e20, 0x2755: 0x40121020, 0x2756: 0x40121220, 0x2757: 0x40121420, - 0x2758: 0x40121620, 0x2759: 0x40121820, 0x275a: 0x40121a20, 0x275b: 0x40121c20, - 0x275c: 0x40121e20, 0x275d: 0x40122020, 0x275e: 0x40122220, 0x275f: 0x40122420, - 0x2760: 0x40122620, 0x2761: 0x40122820, 0x2762: 0x40122a20, 0x2763: 0x40122c20, - 0x2764: 0x40122e20, 0x2765: 0x40123020, 0x2766: 0x40123220, 0x2767: 0x40123420, - 0x2768: 0x40123620, 0x2769: 0x40123820, 0x276a: 0x40123a20, 0x276b: 0x40123c20, - 0x276c: 0x40123e20, 0x276d: 0x40124020, 0x276e: 0x40124220, 0x276f: 0x40124420, - 0x2770: 0x40124620, 0x2771: 0x40124820, 0x2772: 0x40124a20, 0x2773: 0x40124c20, - 0x2774: 0x40124e20, 0x2775: 0x40125020, 0x2776: 0x40125220, 0x2777: 0x40125420, - 0x2778: 0x40125620, 0x2779: 0x40125820, 0x277a: 0x40125a20, 0x277b: 0x40125c20, - 0x277c: 0x40125e20, 0x277d: 0x40126020, 0x277e: 0x40126220, 0x277f: 0x40126420, - // Block 0x9e, offset 0x2780 - 0x2780: 0x40126620, 0x2781: 0x40126820, 0x2782: 0x40126a20, 0x2783: 0x40126c20, - 0x2784: 0x40126e20, 0x2785: 0x40044020, 0x2786: 0x40044220, 0x2787: 0x40127020, - 0x2788: 0x40127220, 0x2789: 0x40127420, 0x278a: 0x40127620, 0x278b: 0x40127820, - 0x278c: 0x40127a20, 0x278d: 0x40127c20, 0x278e: 0x40127e20, 0x278f: 0x40128020, - 0x2790: 0x40128220, 0x2791: 0x40128420, 0x2792: 0x40128620, 0x2793: 0x40128820, - 0x2794: 0x40128a20, 0x2795: 0x40128c20, 0x2796: 0x40128e20, 0x2797: 0x40129020, - 0x2798: 0x40129220, 0x2799: 0x40129420, 0x279a: 0x40129620, 0x279b: 0x40129820, - 0x279c: 0x40129a20, 0x279d: 0x40129c20, 0x279e: 0x40129e20, 0x279f: 0x4012a020, - 0x27a0: 0x4012a220, 0x27a1: 0x4012a420, 0x27a2: 0x4012a620, 0x27a3: 0x4012a820, - 0x27a4: 0x4012aa20, 0x27a5: 0x4012ac20, 0x27a6: 0x40044420, 0x27a7: 0x40044620, - 0x27a8: 0x40044820, 0x27a9: 0x40044a20, 0x27aa: 0x40044c20, 0x27ab: 0x40044e20, - 0x27ac: 0x40045020, 0x27ad: 0x40045220, 0x27ae: 0x40045420, 0x27af: 0x40045620, - 0x27b0: 0x4012ae20, 0x27b1: 0x4012b020, 0x27b2: 0x4012b220, 0x27b3: 0x4012b420, - 0x27b4: 0x4012b620, 0x27b5: 0x4012b820, 0x27b6: 0x4012ba20, 0x27b7: 0x4012bc20, - 0x27b8: 0x4012be20, 0x27b9: 0x4012c020, 0x27ba: 0x4012c220, 0x27bb: 0x4012c420, - 0x27bc: 0x4012c620, 0x27bd: 0x4012c820, 0x27be: 0x4012ca20, 0x27bf: 0x4012cc20, - // Block 0x9f, offset 0x27c0 - 0x27c0: 0x40174620, 0x27c1: 0x40174820, 0x27c2: 0x40174a20, 0x27c3: 0x40174c20, - 0x27c4: 0x40174e20, 0x27c5: 0x40175020, 0x27c6: 0x40175220, 0x27c7: 0x40175420, - 0x27c8: 0x40175620, 0x27c9: 0x40175820, 0x27ca: 0x40175a20, 0x27cb: 0x40175c20, - 0x27cc: 0x40175e20, 0x27cd: 0x40176020, 0x27ce: 0x40176220, 0x27cf: 0x40176420, - 0x27d0: 0x40176620, 0x27d1: 0x40176820, 0x27d2: 0x40176a20, 0x27d3: 0x40176c20, - 0x27d4: 0x40176e20, 0x27d5: 0x40177020, 0x27d6: 0x40177220, 0x27d7: 0x40177420, - 0x27d8: 0x40177620, 0x27d9: 0x40177820, 0x27da: 0x40177a20, 0x27db: 0x40177c20, - 0x27dc: 0x40177e20, 0x27dd: 0x40178020, 0x27de: 0x40178220, 0x27df: 0x40178420, - 0x27e0: 0x40178620, 0x27e1: 0x40178820, 0x27e2: 0x40178a20, 0x27e3: 0x40178c20, - 0x27e4: 0x40178e20, 0x27e5: 0x40179020, 0x27e6: 0x40179220, 0x27e7: 0x40179420, - 0x27e8: 0x40179620, 0x27e9: 0x40179820, 0x27ea: 0x40179a20, 0x27eb: 0x40179c20, - 0x27ec: 0x40179e20, 0x27ed: 0x4017a020, 0x27ee: 0x4017a220, 0x27ef: 0x4017a420, - 0x27f0: 0x4017a620, 0x27f1: 0x4017a820, 0x27f2: 0x4017aa20, 0x27f3: 0x4017ac20, - 0x27f4: 0x4017ae20, 0x27f5: 0x4017b020, 0x27f6: 0x4017b220, 0x27f7: 0x4017b420, - 0x27f8: 0x4017b620, 0x27f9: 0x4017b820, 0x27fa: 0x4017ba20, 0x27fb: 0x4017bc20, - 0x27fc: 0x4017be20, 0x27fd: 0x4017c020, 0x27fe: 0x4017c220, 0x27ff: 0x4017c420, - // Block 0xa0, offset 0x2800 - 0x2800: 0x4017c620, 0x2801: 0x4017c820, 0x2802: 0x4017ca20, 0x2803: 0x4017cc20, - 0x2804: 0x4017ce20, 0x2805: 0x4017d020, 0x2806: 0x4017d220, 0x2807: 0x4017d420, - 0x2808: 0x4017d620, 0x2809: 0x4017d820, 0x280a: 0x4017da20, 0x280b: 0x4017dc20, - 0x280c: 0x4017de20, 0x280d: 0x4017e020, 0x280e: 0x4017e220, 0x280f: 0x4017e420, - 0x2810: 0x4017e620, 0x2811: 0x4017e820, 0x2812: 0x4017ea20, 0x2813: 0x4017ec20, - 0x2814: 0x4017ee20, 0x2815: 0x4017f020, 0x2816: 0x4017f220, 0x2817: 0x4017f420, - 0x2818: 0x4017f620, 0x2819: 0x4017f820, 0x281a: 0x4017fa20, 0x281b: 0x4017fc20, - 0x281c: 0x4017fe20, 0x281d: 0x40180020, 0x281e: 0x40180220, 0x281f: 0x40180420, - 0x2820: 0x40180620, 0x2821: 0x40180820, 0x2822: 0x40180a20, 0x2823: 0x40180c20, - 0x2824: 0x40180e20, 0x2825: 0x40181020, 0x2826: 0x40181220, 0x2827: 0x40181420, - 0x2828: 0x40181620, 0x2829: 0x40181820, 0x282a: 0x40181a20, 0x282b: 0x40181c20, - 0x282c: 0x40181e20, 0x282d: 0x40182020, 0x282e: 0x40182220, 0x282f: 0x40182420, - 0x2830: 0x40182620, 0x2831: 0x40182820, 0x2832: 0x40182a20, 0x2833: 0x40182c20, - 0x2834: 0x40182e20, 0x2835: 0x40183020, 0x2836: 0x40183220, 0x2837: 0x40183420, - 0x2838: 0x40183620, 0x2839: 0x40183820, 0x283a: 0x40183a20, 0x283b: 0x40183c20, - 0x283c: 0x40183e20, 0x283d: 0x40184020, 0x283e: 0x40184220, 0x283f: 0x40184420, - // Block 0xa1, offset 0x2840 - 0x2840: 0x40184620, 0x2841: 0x40184820, 0x2842: 0x40184a20, 0x2843: 0x40184c20, - 0x2844: 0x40184e20, 0x2845: 0x40185020, 0x2846: 0x40185220, 0x2847: 0x40185420, - 0x2848: 0x40185620, 0x2849: 0x40185820, 0x284a: 0x40185a20, 0x284b: 0x40185c20, - 0x284c: 0x40185e20, 0x284d: 0x40186020, 0x284e: 0x40186220, 0x284f: 0x40186420, - 0x2850: 0x40186620, 0x2851: 0x40186820, 0x2852: 0x40186a20, 0x2853: 0x40186c20, - 0x2854: 0x40186e20, 0x2855: 0x40187020, 0x2856: 0x40187220, 0x2857: 0x40187420, - 0x2858: 0x40187620, 0x2859: 0x40187820, 0x285a: 0x40187a20, 0x285b: 0x40187c20, - 0x285c: 0x40187e20, 0x285d: 0x40188020, 0x285e: 0x40188220, 0x285f: 0x40188420, - 0x2860: 0x40188620, 0x2861: 0x40188820, 0x2862: 0x40188a20, 0x2863: 0x40188c20, - 0x2864: 0x40188e20, 0x2865: 0x40189020, 0x2866: 0x40189220, 0x2867: 0x40189420, - 0x2868: 0x40189620, 0x2869: 0x40189820, 0x286a: 0x40189a20, 0x286b: 0x40189c20, - 0x286c: 0x40189e20, 0x286d: 0x4018a020, 0x286e: 0x4018a220, 0x286f: 0x4018a420, - 0x2870: 0x4018a620, 0x2871: 0x4018a820, 0x2872: 0x4018aa20, 0x2873: 0x4018ac20, - 0x2874: 0x4018ae20, 0x2875: 0x4018b020, 0x2876: 0x4018b220, 0x2877: 0x4018b420, - 0x2878: 0x4018b620, 0x2879: 0x4018b820, 0x287a: 0x4018ba20, 0x287b: 0x4018bc20, - 0x287c: 0x4018be20, 0x287d: 0x4018c020, 0x287e: 0x4018c220, 0x287f: 0x4018c420, - // Block 0xa2, offset 0x2880 - 0x2880: 0x4018c620, 0x2881: 0x4018c820, 0x2882: 0x4018ca20, 0x2883: 0x4018cc20, - 0x2884: 0x4018ce20, 0x2885: 0x4018d020, 0x2886: 0x4018d220, 0x2887: 0x4018d420, - 0x2888: 0x4018d620, 0x2889: 0x4018d820, 0x288a: 0x4018da20, 0x288b: 0x4018dc20, - 0x288c: 0x4018de20, 0x288d: 0x4018e020, 0x288e: 0x4018e220, 0x288f: 0x4018e420, - 0x2890: 0x4018e620, 0x2891: 0x4018e820, 0x2892: 0x4018ea20, 0x2893: 0x4018ec20, - 0x2894: 0x4018ee20, 0x2895: 0x4018f020, 0x2896: 0x4018f220, 0x2897: 0x4018f420, - 0x2898: 0x4018f620, 0x2899: 0x4018f820, 0x289a: 0x4018fa20, 0x289b: 0x4018fc20, - 0x289c: 0x4018fe20, 0x289d: 0x40190020, 0x289e: 0x40190220, 0x289f: 0x40190420, - 0x28a0: 0x40190620, 0x28a1: 0x40190820, 0x28a2: 0x40190a20, 0x28a3: 0x40190c20, - 0x28a4: 0x40190e20, 0x28a5: 0x40191020, 0x28a6: 0x40191220, 0x28a7: 0x40191420, - 0x28a8: 0x40191620, 0x28a9: 0x40191820, 0x28aa: 0x40191a20, 0x28ab: 0x40191c20, - 0x28ac: 0x40191e20, 0x28ad: 0x40192020, 0x28ae: 0x40192220, 0x28af: 0x40192420, - 0x28b0: 0x40192620, 0x28b1: 0x40192820, 0x28b2: 0x40192a20, 0x28b3: 0x40192c20, - 0x28b4: 0x40192e20, 0x28b5: 0x40193020, 0x28b6: 0x40193220, 0x28b7: 0x40193420, - 0x28b8: 0x40193620, 0x28b9: 0x40193820, 0x28ba: 0x40193a20, 0x28bb: 0x40193c20, - 0x28bc: 0x40193e20, 0x28bd: 0x40194020, 0x28be: 0x40194220, 0x28bf: 0x40194420, - // Block 0xa3, offset 0x28c0 - 0x28c0: 0x4012ce20, 0x28c1: 0x4012d020, 0x28c2: 0x4012d220, 0x28c3: 0x4012d420, - 0x28c4: 0x4012d620, 0x28c5: 0x4012d820, 0x28c6: 0x4012da20, 0x28c7: 0x4012dc20, - 0x28c8: 0x4012de20, 0x28c9: 0x4012e020, 0x28ca: 0x4012e220, 0x28cb: 0x4012e420, - 0x28cc: 0x4012e620, 0x28cd: 0x4012e820, 0x28ce: 0x4012ea20, 0x28cf: 0x4012ec20, - 0x28d0: 0x4012ee20, 0x28d1: 0x4012f020, 0x28d2: 0x4012f220, 0x28d3: 0x4012f420, - 0x28d4: 0x4012f620, 0x28d5: 0x4012f820, 0x28d6: 0x4012fa20, 0x28d7: 0x4012fc20, - 0x28d8: 0x4012fe20, 0x28d9: 0x40130020, 0x28da: 0x40130220, 0x28db: 0x40130420, - 0x28dc: 0x40130620, 0x28dd: 0x40130820, 0x28de: 0x40130a20, 0x28df: 0x40130c20, - 0x28e0: 0x40130e20, 0x28e1: 0x40131020, 0x28e2: 0x40131220, 0x28e3: 0x40131420, - 0x28e4: 0x40131620, 0x28e5: 0x40131820, 0x28e6: 0x40131a20, 0x28e7: 0x40131c20, - 0x28e8: 0x40131e20, 0x28e9: 0x40132020, 0x28ea: 0x40132220, 0x28eb: 0x40132420, - 0x28ec: 0x40132620, 0x28ed: 0x40132820, 0x28ee: 0x40132a20, 0x28ef: 0x40132c20, - 0x28f0: 0x40132e20, 0x28f1: 0x40133020, 0x28f2: 0x40133220, 0x28f3: 0x40133420, - 0x28f4: 0x40133620, 0x28f5: 0x40133820, 0x28f6: 0x40133a20, 0x28f7: 0x40133c20, - 0x28f8: 0x40133e20, 0x28f9: 0x40134020, 0x28fa: 0x40134220, 0x28fb: 0x40134420, - 0x28fc: 0x40134620, 0x28fd: 0x40134820, 0x28fe: 0x40134a20, 0x28ff: 0x40134c20, - // Block 0xa4, offset 0x2900 - 0x2900: 0x40134e20, 0x2901: 0x40135020, 0x2902: 0x40135220, 0x2903: 0x40135420, - 0x2904: 0x40135620, 0x2905: 0x40135820, 0x2906: 0x40135a20, 0x2907: 0x40135c20, - 0x2908: 0x40135e20, 0x2909: 0x40136020, 0x290a: 0x40136220, 0x290b: 0x40136420, - 0x290c: 0x40136620, 0x290d: 0x40136820, 0x290e: 0x40136a20, 0x290f: 0x40136c20, - 0x2910: 0x40136e20, 0x2911: 0x40137020, 0x2912: 0x40137220, 0x2913: 0x40137420, - 0x2914: 0x40137620, 0x2915: 0x40137820, 0x2916: 0x40137a20, 0x2917: 0x40137c20, - 0x2918: 0x40137e20, 0x2919: 0x40138020, 0x291a: 0x40138220, 0x291b: 0x40138420, - 0x291c: 0x40138620, 0x291d: 0x40138820, 0x291e: 0x40138a20, 0x291f: 0x40138c20, - 0x2920: 0x40138e20, 0x2921: 0x40139020, 0x2922: 0x40139220, 0x2923: 0x40139420, - 0x2924: 0x40139620, 0x2925: 0x40139820, 0x2926: 0x40139a20, 0x2927: 0x40139c20, - 0x2928: 0x40139e20, 0x2929: 0x4013a020, 0x292a: 0x4013a220, 0x292b: 0x4013a420, - 0x292c: 0x4013a620, 0x292d: 0x4013a820, 0x292e: 0x4013aa20, 0x292f: 0x4013ac20, - 0x2930: 0x4013ae20, 0x2931: 0x4013b020, 0x2932: 0x4013b220, 0x2933: 0x4013b420, - 0x2934: 0x4013b620, 0x2935: 0x4013b820, 0x2936: 0x4013ba20, 0x2937: 0x4013bc20, - 0x2938: 0x4013be20, 0x2939: 0x4013c020, 0x293a: 0x4013c220, 0x293b: 0x4013c420, - 0x293c: 0x4013c620, 0x293d: 0x4013c820, 0x293e: 0x4013ca20, 0x293f: 0x4013cc20, - // Block 0xa5, offset 0x2940 - 0x2940: 0x4013ce20, 0x2941: 0x4013d020, 0x2942: 0x4013d220, 0x2943: 0x40041420, - 0x2944: 0x40041620, 0x2945: 0x40041820, 0x2946: 0x40041a20, 0x2947: 0x40041c20, - 0x2948: 0x40041e20, 0x2949: 0x40042020, 0x294a: 0x40042220, 0x294b: 0x40042420, - 0x294c: 0x40042620, 0x294d: 0x40042820, 0x294e: 0x40042a20, 0x294f: 0x40042c20, - 0x2950: 0x40042e20, 0x2951: 0x40043020, 0x2952: 0x40043220, 0x2953: 0x40043420, - 0x2954: 0x40043620, 0x2955: 0x40043820, 0x2956: 0x40043a20, 0x2957: 0x40043c20, - 0x2958: 0x40043e20, 0x2959: 0x4013d420, 0x295a: 0x4013d620, 0x295b: 0x4013d820, - 0x295c: 0x4013da20, 0x295d: 0x4013dc20, 0x295e: 0x4013de20, 0x295f: 0x4013e020, - 0x2960: 0x4013e220, 0x2961: 0x4013e420, 0x2962: 0x4013e620, 0x2963: 0x4013e820, - 0x2964: 0x4013ea20, 0x2965: 0x4013ec20, 0x2966: 0x4013ee20, 0x2967: 0x4013f020, - 0x2968: 0x4013f220, 0x2969: 0x4013f420, 0x296a: 0x4013f620, 0x296b: 0x4013f820, - 0x296c: 0x4013fa20, 0x296d: 0x4013fc20, 0x296e: 0x4013fe20, 0x296f: 0x40140020, - 0x2970: 0x40140220, 0x2971: 0x40140420, 0x2972: 0x40140620, 0x2973: 0x40140820, - 0x2974: 0x40140a20, 0x2975: 0x40140c20, 0x2976: 0x40140e20, 0x2977: 0x40141020, - 0x2978: 0x40141220, 0x2979: 0x40141420, 0x297a: 0x40141620, 0x297b: 0x40141820, - 0x297c: 0x40141a20, 0x297d: 0x40141c20, 0x297e: 0x40141e20, 0x297f: 0x40142020, - // Block 0xa6, offset 0x2980 - 0x2980: 0x40142220, 0x2981: 0x40142420, 0x2982: 0x40142620, 0x2983: 0x40142820, - 0x2984: 0x40142a20, 0x2985: 0x40142c20, 0x2986: 0x40142e20, 0x2987: 0x40143020, - 0x2988: 0x40143220, 0x2989: 0x40143420, 0x298a: 0x40143620, 0x298b: 0x40143820, - 0x298c: 0x40143a20, 0x298d: 0x40143c20, 0x298e: 0x40143e20, 0x298f: 0x40144020, - 0x2990: 0x40144220, 0x2991: 0x40144420, 0x2992: 0x40144620, 0x2993: 0x40144820, - 0x2994: 0x40144a20, 0x2995: 0x40144c20, 0x2996: 0x40144e20, 0x2997: 0x40145020, - 0x2998: 0x4004c620, 0x2999: 0x4004c820, 0x299a: 0x4004ca20, 0x299b: 0x4004cc20, - 0x299c: 0x40145220, 0x299d: 0x40145420, 0x299e: 0x40145620, 0x299f: 0x40145820, - 0x29a0: 0x40145a20, 0x29a1: 0x40145c20, 0x29a2: 0x40145e20, 0x29a3: 0x40146020, - 0x29a4: 0x40146220, 0x29a5: 0x40146420, 0x29a6: 0x40146620, 0x29a7: 0x40146820, - 0x29a8: 0x40146a20, 0x29a9: 0x40146c20, 0x29aa: 0x40146e20, 0x29ab: 0x40147020, - 0x29ac: 0x40147220, 0x29ad: 0x40147420, 0x29ae: 0x40147620, 0x29af: 0x40147820, - 0x29b0: 0x40147a20, 0x29b1: 0x40147c20, 0x29b2: 0x40147e20, 0x29b3: 0x40148020, - 0x29b4: 0x40148220, 0x29b5: 0x40148420, 0x29b6: 0x40148620, 0x29b7: 0x40148820, - 0x29b8: 0x40148a20, 0x29b9: 0x40148c20, 0x29ba: 0x40148e20, 0x29bb: 0x40149020, - 0x29bc: 0x40041020, 0x29bd: 0x40041220, 0x29be: 0x40149220, 0x29bf: 0x40149420, - // Block 0xa7, offset 0x29c0 - 0x29c0: 0x40149620, 0x29c1: 0x40149820, 0x29c2: 0x40149a20, 0x29c3: 0x40149c20, - 0x29c4: 0x40149e20, 0x29c5: 0x4014a020, 0x29c6: 0x4014a220, 0x29c7: 0x4014a420, - 0x29c8: 0x4014a620, 0x29c9: 0x4014a820, 0x29ca: 0x4014aa20, 0x29cb: 0x4014ac20, - 0x29cc: 0xe00000f0, 0x29cd: 0x4014ae20, 0x29ce: 0x4014b020, 0x29cf: 0x4014b220, - 0x29d0: 0x4014b420, 0x29d1: 0x4014b620, 0x29d2: 0x4014b820, 0x29d3: 0x4014ba20, - 0x29d4: 0x4014bc20, 0x29d5: 0x4014be20, 0x29d6: 0x4014c020, 0x29d7: 0x4014c220, - 0x29d8: 0x4014c420, 0x29d9: 0x4014c620, 0x29da: 0x4014c820, 0x29db: 0x4014ca20, - 0x29dc: 0x4014cc20, 0x29dd: 0x4014ce20, 0x29de: 0x4014d020, 0x29df: 0x4014d220, - 0x29e0: 0x4014d420, 0x29e1: 0x4014d620, 0x29e2: 0x4014d820, 0x29e3: 0x4014da20, - 0x29e4: 0x4014dc20, 0x29e5: 0x4014de20, 0x29e6: 0x4014e020, 0x29e7: 0x4014e220, - 0x29e8: 0x4014e420, 0x29e9: 0x4014e620, 0x29ea: 0x4014e820, 0x29eb: 0x4014ea20, - 0x29ec: 0x4014ec20, 0x29ed: 0x4014ee20, 0x29ee: 0x4014f020, 0x29ef: 0x4014f220, - 0x29f0: 0x4014f420, 0x29f1: 0x4014f620, 0x29f2: 0x4014f820, 0x29f3: 0x4014fa20, - 0x29f4: 0x4014fc20, 0x29f5: 0x4014fe20, 0x29f6: 0x40150020, 0x29f7: 0x40150220, - 0x29f8: 0x40150420, 0x29f9: 0x40150620, 0x29fa: 0x40150820, 0x29fb: 0x40150a20, - 0x29fc: 0x40150c20, 0x29fd: 0x40150e20, 0x29fe: 0x40151020, 0x29ff: 0x40151220, - // Block 0xa8, offset 0x2a00 - 0x2a00: 0x40151420, 0x2a01: 0x40151620, 0x2a02: 0x40151820, 0x2a03: 0x40151a20, - 0x2a04: 0x40151c20, 0x2a05: 0x40151e20, 0x2a06: 0x40152020, 0x2a07: 0x40152220, - 0x2a08: 0x40152420, 0x2a09: 0x40152620, 0x2a0a: 0x40152820, 0x2a0b: 0x40152a20, - 0x2a0c: 0x40152c20, 0x2a0d: 0x40152e20, 0x2a0e: 0x40153020, 0x2a0f: 0x40153220, - 0x2a10: 0x40153420, 0x2a11: 0x40153620, 0x2a12: 0x40153820, 0x2a13: 0x40153a20, - 0x2a14: 0x40153c20, 0x2a15: 0x40153e20, 0x2a16: 0x40154020, 0x2a17: 0x40154220, - 0x2a18: 0x40154420, 0x2a19: 0x40154620, 0x2a1a: 0x40154820, 0x2a1b: 0x40154a20, - 0x2a1c: 0x40154c20, 0x2a1d: 0x40154e20, 0x2a1e: 0x40155020, 0x2a1f: 0x40155220, - 0x2a20: 0x40155420, 0x2a21: 0x40155620, 0x2a22: 0x40155820, 0x2a23: 0x40155a20, - 0x2a24: 0x40155c20, 0x2a25: 0x40155e20, 0x2a26: 0x40156020, 0x2a27: 0x40156220, - 0x2a28: 0x40156420, 0x2a29: 0x40156620, 0x2a2a: 0x40156820, 0x2a2b: 0x40156a20, - 0x2a2c: 0x40156c20, 0x2a2d: 0x40156e20, 0x2a2e: 0x40157020, 0x2a2f: 0x40157220, - 0x2a30: 0x40157420, 0x2a31: 0x40157620, 0x2a32: 0x40157820, 0x2a33: 0x40157a20, - 0x2a34: 0xf0000404, 0x2a35: 0xf0001f04, 0x2a36: 0xf0000404, 0x2a37: 0x40157c20, - 0x2a38: 0x40157e20, 0x2a39: 0x40158020, 0x2a3a: 0x40158220, 0x2a3b: 0x40158420, - 0x2a3c: 0x40158620, 0x2a3d: 0x40158820, 0x2a3e: 0x40158a20, 0x2a3f: 0x40158c20, - // Block 0xa9, offset 0x2a40 - 0x2a40: 0x40158e20, 0x2a41: 0x40159020, 0x2a42: 0x40159220, 0x2a43: 0x40159420, - 0x2a44: 0x40159620, 0x2a45: 0x40159820, 0x2a46: 0x40159a20, 0x2a47: 0x40159c20, - 0x2a48: 0x40159e20, 0x2a49: 0x4015a020, 0x2a4a: 0x4015a220, 0x2a4b: 0x4015a420, - 0x2a4c: 0x4015a620, 0x2a4d: 0x4015a820, 0x2a4e: 0x4015aa20, 0x2a4f: 0x4015ac20, - 0x2a50: 0x4015ae20, 0x2a51: 0x4015b020, 0x2a52: 0x4015b220, 0x2a53: 0x4015b420, - 0x2a54: 0x4015b620, 0x2a55: 0x4015b820, 0x2a56: 0x4015ba20, 0x2a57: 0x4015bc20, - 0x2a58: 0x4015be20, 0x2a59: 0x4015c020, 0x2a5a: 0x4015c220, 0x2a5b: 0x4015c420, - 0x2a5c: 0x4015c620, 0x2a5d: 0x4015c820, 0x2a5e: 0x4015ca20, 0x2a5f: 0x4015cc20, - 0x2a60: 0x4015ce20, 0x2a61: 0x4015d020, 0x2a62: 0x4015d220, 0x2a63: 0x4015d420, - 0x2a64: 0x4015d620, 0x2a65: 0x4015d820, 0x2a66: 0x4015da20, 0x2a67: 0x4015dc20, - 0x2a68: 0x4015de20, 0x2a69: 0x4015e020, 0x2a6a: 0x4015e220, 0x2a6b: 0x4015e420, - 0x2a6c: 0x4015e620, 0x2a6d: 0x4015e820, 0x2a6e: 0x4015ea20, 0x2a6f: 0x4015ec20, - 0x2a70: 0x4015ee20, 0x2a71: 0x4015f020, 0x2a72: 0x4015f220, 0x2a73: 0x4015f420, - 0x2a74: 0x4015f620, 0x2a75: 0x4015f820, 0x2a76: 0x4015fa20, 0x2a77: 0x4015fc20, - 0x2a78: 0x4015fe20, 0x2a79: 0x40160020, 0x2a7a: 0x40160220, 0x2a7b: 0x40160420, - 0x2a7c: 0x40160620, 0x2a7d: 0x40160820, 0x2a7e: 0x40160a20, 0x2a7f: 0x40160c20, - // Block 0xaa, offset 0x2a80 - 0x2a80: 0x40160e20, 0x2a81: 0x40161020, 0x2a82: 0x40161220, 0x2a83: 0x40161420, - 0x2a84: 0x40161620, 0x2a85: 0x40161820, 0x2a86: 0x40161a20, 0x2a87: 0x40161c20, - 0x2a88: 0x40161e20, 0x2a89: 0x40162020, 0x2a8a: 0x40162220, 0x2a8b: 0x40162420, - 0x2a8c: 0x40162620, 0x2a8d: 0x40162820, 0x2a8e: 0x40162a20, 0x2a8f: 0x40162c20, - 0x2a90: 0x40162e20, 0x2a91: 0x40163020, 0x2a92: 0x40163220, 0x2a93: 0x40163420, - 0x2a94: 0x40163620, 0x2a95: 0x40163820, 0x2a96: 0x40163a20, 0x2a97: 0x40163c20, - 0x2a98: 0x40163e20, 0x2a99: 0x40164020, 0x2a9a: 0x40164220, 0x2a9b: 0x40164420, - 0x2a9c: 0xe000014f, 0x2a9d: 0x40164620, 0x2a9e: 0x40164820, 0x2a9f: 0x40164a20, - 0x2aa0: 0x40164c20, 0x2aa1: 0x40164e20, 0x2aa2: 0x40165020, 0x2aa3: 0x40165220, - 0x2aa4: 0x40165420, 0x2aa5: 0x40165620, 0x2aa6: 0x40165820, 0x2aa7: 0x40165a20, - 0x2aa8: 0x40165c20, 0x2aa9: 0x40165e20, 0x2aaa: 0x40166020, 0x2aab: 0x40166220, - 0x2aac: 0x40166420, 0x2aad: 0x40166620, 0x2aae: 0x40166820, 0x2aaf: 0x40166a20, - 0x2ab0: 0x40166c20, 0x2ab1: 0x40166e20, 0x2ab2: 0x40167020, 0x2ab3: 0x40167220, - 0x2ab4: 0x40167420, 0x2ab5: 0x40167620, 0x2ab6: 0x40167820, 0x2ab7: 0x40167a20, - 0x2ab8: 0x40167c20, 0x2ab9: 0x40167e20, 0x2aba: 0x40168020, 0x2abb: 0x40168220, - 0x2abc: 0x40168420, 0x2abd: 0x40168620, 0x2abe: 0x40168820, 0x2abf: 0x40168a20, - // Block 0xab, offset 0x2ac0 - 0x2ac0: 0x40168c20, 0x2ac1: 0x40168e20, 0x2ac2: 0x40169020, 0x2ac3: 0x40169220, - 0x2ac4: 0x40169420, 0x2ac5: 0x40169620, 0x2ac6: 0x40169820, 0x2ac7: 0x40169a20, - 0x2ac8: 0x40169c20, 0x2ac9: 0x40169e20, 0x2aca: 0x4016a020, 0x2acb: 0x4016a220, - 0x2acc: 0x4016a420, 0x2acd: 0x4016a620, 0x2ace: 0x4016a820, 0x2acf: 0x4016aa20, - 0x2ad0: 0x4016ac20, 0x2ad1: 0x4016ae20, 0x2ad2: 0x4016b020, 0x2ad3: 0x4016b220, - 0x2ad4: 0x4016b420, 0x2ad5: 0x4016b620, 0x2ad6: 0x4016b820, 0x2ad7: 0x4016ba20, - 0x2ad8: 0x4016bc20, 0x2ad9: 0x4016be20, 0x2ada: 0x4016c020, 0x2adb: 0x4016c220, - 0x2adc: 0x4016c420, 0x2add: 0x4016c620, 0x2ade: 0x4016c820, 0x2adf: 0x4016ca20, - 0x2ae0: 0x4016cc20, 0x2ae1: 0x4016ce20, 0x2ae2: 0x4016d020, 0x2ae3: 0x4016d220, - 0x2ae4: 0x4016d420, 0x2ae5: 0x4016d620, 0x2ae6: 0x4016d820, 0x2ae7: 0x4016da20, - 0x2ae8: 0x4016dc20, 0x2ae9: 0x4016de20, 0x2aea: 0x4016e020, 0x2aeb: 0x4016e220, - 0x2aec: 0x4016e420, 0x2aed: 0x4016e620, 0x2aee: 0x4016e820, 0x2aef: 0x4016ea20, - 0x2af0: 0x4016ec20, 0x2af1: 0x4016ee20, 0x2af2: 0x4016f020, 0x2af3: 0x4016f220, - 0x2af4: 0x4016f420, 0x2af5: 0x4016f620, 0x2af6: 0x4016f820, 0x2af7: 0x4016fa20, - 0x2af8: 0x4016fc20, 0x2af9: 0x4016fe20, 0x2afa: 0x40170020, 0x2afb: 0x40170220, - 0x2afc: 0x40170420, 0x2afd: 0x40170620, 0x2afe: 0x40170820, 0x2aff: 0x40170a20, - // Block 0xac, offset 0x2b00 - 0x2b00: 0x40170c20, 0x2b01: 0x40170e20, 0x2b02: 0x40171020, 0x2b03: 0x40171220, - 0x2b04: 0x40171420, 0x2b05: 0x40171620, 0x2b06: 0x40171820, 0x2b07: 0x40171a20, - 0x2b08: 0x40171c20, 0x2b09: 0x40171e20, 0x2b0a: 0x40172020, 0x2b0b: 0x40172220, - 0x2b0c: 0x40172420, - 0x2b10: 0x40172620, 0x2b11: 0x40172820, 0x2b12: 0x40172a20, 0x2b13: 0x40172c20, - 0x2b14: 0x40172e20, 0x2b15: 0x40173020, 0x2b16: 0x40173220, 0x2b17: 0x40173420, - 0x2b18: 0x40173620, 0x2b19: 0x40173820, - // Block 0xad, offset 0x2b40 - 0x2b40: 0x00373888, 0x2b41: 0x00373a88, 0x2b42: 0x00373c88, 0x2b43: 0x00373e88, - 0x2b44: 0x00374088, 0x2b45: 0x00374288, 0x2b46: 0x00374488, 0x2b47: 0x00374688, - 0x2b48: 0x00374888, 0x2b49: 0x00374a88, 0x2b4a: 0x00374c88, 0x2b4b: 0x00374e88, - 0x2b4c: 0x00375088, 0x2b4d: 0x00375288, 0x2b4e: 0x00375488, 0x2b4f: 0x00375688, - 0x2b50: 0x00375888, 0x2b51: 0x00375a88, 0x2b52: 0x00375c88, 0x2b53: 0x00375e88, - 0x2b54: 0x00376088, 0x2b55: 0x00376288, 0x2b56: 0x00376488, 0x2b57: 0x00376688, - 0x2b58: 0x00376888, 0x2b59: 0x00376a88, 0x2b5a: 0x00376c88, 0x2b5b: 0x00376e88, - 0x2b5c: 0x00377088, 0x2b5d: 0x00377288, 0x2b5e: 0x00377488, 0x2b5f: 0x00377688, - 0x2b60: 0x00377888, 0x2b61: 0x00377a88, 0x2b62: 0x00377c88, 0x2b63: 0x00377e88, - 0x2b64: 0x00378088, 0x2b65: 0x00378288, 0x2b66: 0x00378488, 0x2b67: 0x00378688, - 0x2b68: 0x00378888, 0x2b69: 0x00378a88, 0x2b6a: 0x00378c88, 0x2b6b: 0x00378e88, - 0x2b6c: 0x00379088, 0x2b6d: 0x00379288, 0x2b6e: 0x00379488, - 0x2b70: 0x40373820, 0x2b71: 0x40373a20, 0x2b72: 0x40373c20, 0x2b73: 0x40373e20, - 0x2b74: 0x40374020, 0x2b75: 0x40374220, 0x2b76: 0x40374420, 0x2b77: 0x40374620, - 0x2b78: 0x40374820, 0x2b79: 0x40374a20, 0x2b7a: 0x40374c20, 0x2b7b: 0x40374e20, - 0x2b7c: 0x40375020, 0x2b7d: 0x40375220, 0x2b7e: 0x40375420, 0x2b7f: 0x40375620, - // Block 0xae, offset 0x2b80 - 0x2b80: 0x40375820, 0x2b81: 0x40375a20, 0x2b82: 0x40375c20, 0x2b83: 0x40375e20, - 0x2b84: 0x40376020, 0x2b85: 0x40376220, 0x2b86: 0x40376420, 0x2b87: 0x40376620, - 0x2b88: 0x40376820, 0x2b89: 0x40376a20, 0x2b8a: 0x40376c20, 0x2b8b: 0x40376e20, - 0x2b8c: 0x40377020, 0x2b8d: 0x40377220, 0x2b8e: 0x40377420, 0x2b8f: 0x40377620, - 0x2b90: 0x40377820, 0x2b91: 0x40377a20, 0x2b92: 0x40377c20, 0x2b93: 0x40377e20, - 0x2b94: 0x40378020, 0x2b95: 0x40378220, 0x2b96: 0x40378420, 0x2b97: 0x40378620, - 0x2b98: 0x40378820, 0x2b99: 0x40378a20, 0x2b9a: 0x40378c20, 0x2b9b: 0x40378e20, - 0x2b9c: 0x40379020, 0x2b9d: 0x40379220, 0x2b9e: 0x40379420, - 0x2ba0: 0x002e4088, 0x2ba1: 0x402e4020, 0x2ba2: 0x002e4288, 0x2ba3: 0x002f3688, - 0x2ba4: 0x002fbe88, 0x2ba5: 0x402be820, 0x2ba6: 0x40303e20, 0x2ba7: 0x002d8888, - 0x2ba8: 0x402d8820, 0x2ba9: 0x002e1288, 0x2baa: 0x402e1220, 0x2bab: 0x00316088, - 0x2bac: 0x40316020, 0x2bad: 0x002bf888, 0x2bae: 0x002e9088, 0x2baf: 0x002bf088, - 0x2bb0: 0x002c0288, 0x2bb1: 0x4030d420, 0x2bb2: 0x0030ec88, 0x2bb3: 0x4030ec20, - 0x2bb4: 0x4030d620, 0x2bb5: 0x002d8a88, 0x2bb6: 0x402d8a20, 0x2bb7: 0x402f5420, - 0x2bb8: 0x402cac20, 0x2bb9: 0x402fb420, 0x2bba: 0x402f0e20, 0x2bbb: 0x402cb620, - 0x2bbc: 0x002dcc95, 0x2bbd: 0x0030be9d, 0x2bbe: 0x002ffc88, 0x2bbf: 0x00315888, - // Block 0xaf, offset 0x2bc0 - 0x2bc0: 0x0032aa88, 0x2bc1: 0x4032aa20, 0x2bc2: 0x0032ac88, 0x2bc3: 0x4032ac20, - 0x2bc4: 0x0032ae88, 0x2bc5: 0x4032ae20, 0x2bc6: 0x0032b088, 0x2bc7: 0x4032b020, - 0x2bc8: 0x0032b288, 0x2bc9: 0x4032b220, 0x2bca: 0x0032b688, 0x2bcb: 0x4032b620, - 0x2bcc: 0x0032b888, 0x2bcd: 0x4032b820, 0x2bce: 0x0032ba88, 0x2bcf: 0x4032ba20, - 0x2bd0: 0x0032bc88, 0x2bd1: 0x4032bc20, 0x2bd2: 0x0032be88, 0x2bd3: 0x4032be20, - 0x2bd4: 0x0032c088, 0x2bd5: 0x4032c020, 0x2bd6: 0x0032c488, 0x2bd7: 0x4032c420, - 0x2bd8: 0x0032c688, 0x2bd9: 0x4032c620, 0x2bda: 0x0032c888, 0x2bdb: 0x4032c820, - 0x2bdc: 0x0032ce88, 0x2bdd: 0x4032ce20, 0x2bde: 0x0032d088, 0x2bdf: 0x4032d020, - 0x2be0: 0x0032d288, 0x2be1: 0x4032d220, 0x2be2: 0x0032d488, 0x2be3: 0x4032d420, - 0x2be4: 0x0032d688, 0x2be5: 0x4032d620, 0x2be6: 0x0032d888, 0x2be7: 0x4032d820, - 0x2be8: 0x0032da88, 0x2be9: 0x4032da20, 0x2bea: 0x0032dc88, 0x2beb: 0x4032dc20, - 0x2bec: 0x0032de88, 0x2bed: 0x4032de20, 0x2bee: 0x0032e088, 0x2bef: 0x4032e020, - 0x2bf0: 0x0032e288, 0x2bf1: 0x4032e220, 0x2bf2: 0x00331888, 0x2bf3: 0x40331820, - 0x2bf4: 0x00331a88, 0x2bf5: 0x40331a20, 0x2bf6: 0x0032b488, 0x2bf7: 0x4032b420, - 0x2bf8: 0x0032c288, 0x2bf9: 0x4032c220, 0x2bfa: 0x0032ca88, 0x2bfb: 0x4032ca20, - 0x2bfc: 0x0032cc88, 0x2bfd: 0x4032cc20, 0x2bfe: 0x0032e488, 0x2bff: 0x4032e420, - // Block 0xb0, offset 0x2c00 - 0x2c00: 0x0032e688, 0x2c01: 0x4032e620, 0x2c02: 0x0032ec88, 0x2c03: 0x4032ec20, - 0x2c04: 0x0032ee88, 0x2c05: 0x4032ee20, 0x2c06: 0x0032f088, 0x2c07: 0x4032f020, - 0x2c08: 0x0032f888, 0x2c09: 0x4032f820, 0x2c0a: 0x0032fc88, 0x2c0b: 0x4032fc20, - 0x2c0c: 0x0032fe88, 0x2c0d: 0x4032fe20, 0x2c0e: 0x00330088, 0x2c0f: 0x40330020, - 0x2c10: 0x00330288, 0x2c11: 0x40330220, 0x2c12: 0x00330488, 0x2c13: 0x40330420, - 0x2c14: 0x00330688, 0x2c15: 0x40330620, 0x2c16: 0x00330c88, 0x2c17: 0x40330c20, - 0x2c18: 0x00331088, 0x2c19: 0x40331020, 0x2c1a: 0x00331288, 0x2c1b: 0x40331220, - 0x2c1c: 0x00331488, 0x2c1d: 0x40331420, 0x2c1e: 0x00331c88, 0x2c1f: 0x40331c20, - 0x2c20: 0x00331e88, 0x2c21: 0x40331e20, 0x2c22: 0x00332088, 0x2c23: 0x40332020, - 0x2c24: 0xe00014b0, 0x2c25: 0x40173a20, 0x2c26: 0x40173c20, 0x2c27: 0x40173e20, - 0x2c28: 0x40174020, 0x2c29: 0x40174220, 0x2c2a: 0x40174420, 0x2c2b: 0x0032ea88, - 0x2c2c: 0x4032ea20, 0x2c2d: 0x00330a88, 0x2c2e: 0x40330a20, 0x2c2f: 0xae605f02, - 0x2c30: 0xae602a02, 0x2c31: 0xae602202, 0x2c32: 0x0032f688, 0x2c33: 0x4032f620, - 0x2c39: 0x4002f820, 0x2c3a: 0x4002d420, 0x2c3b: 0x4002d620, - 0x2c3c: 0x4003b620, 0x2c3d: 0x4028b420, 0x2c3e: 0x4002fa20, 0x2c3f: 0x4003b820, - // Block 0xb1, offset 0x2c40 - 0x2c40: 0x40379820, 0x2c41: 0x40379c20, 0x2c42: 0x4037a020, 0x2c43: 0x4037a420, - 0x2c44: 0x4037a820, 0x2c45: 0x4037ac20, 0x2c46: 0x4037b020, 0x2c47: 0x4037b820, - 0x2c48: 0x4037bc20, 0x2c49: 0x4037c020, 0x2c4a: 0x4037c420, 0x2c4b: 0x4037c820, - 0x2c4c: 0x4037cc20, 0x2c4d: 0x4037d420, 0x2c4e: 0x4037d820, 0x2c4f: 0x4037dc20, - 0x2c50: 0x4037e020, 0x2c51: 0x4037e420, 0x2c52: 0x4037e820, 0x2c53: 0x4037f020, - 0x2c54: 0x4037f420, 0x2c55: 0x4037f820, 0x2c56: 0x4037fc20, 0x2c57: 0x40380020, - 0x2c58: 0x40380420, 0x2c59: 0x40380820, 0x2c5a: 0x40380c20, 0x2c5b: 0x40381020, - 0x2c5c: 0x40381420, 0x2c5d: 0x40381820, 0x2c5e: 0x40381c20, 0x2c5f: 0x40382420, - 0x2c60: 0x40382820, 0x2c61: 0x4037b420, 0x2c62: 0x4037d020, 0x2c63: 0x4037ec20, - 0x2c64: 0x40382020, 0x2c65: 0x40382c20, 0x2c67: 0x40383220, - 0x2c6d: 0x40383c20, - 0x2c70: 0x403bbc20, 0x2c71: 0x403bbe20, 0x2c72: 0x403bc020, 0x2c73: 0x403bc220, - 0x2c74: 0x403bc420, 0x2c75: 0x403bc620, 0x2c76: 0x403bc820, 0x2c77: 0x403bca20, - 0x2c78: 0x403bcc20, 0x2c79: 0x403bce20, 0x2c7a: 0x403bd020, 0x2c7b: 0x403bd220, - 0x2c7c: 0x403bd620, 0x2c7d: 0x403bd820, 0x2c7e: 0x403bda20, 0x2c7f: 0x403bdc20, - // Block 0xb2, offset 0x2c80 - 0x2c80: 0x403bde20, 0x2c81: 0x403be020, 0x2c82: 0x403be220, 0x2c83: 0x403be420, - 0x2c84: 0x403be620, 0x2c85: 0x403be820, 0x2c86: 0x403bea20, 0x2c87: 0x403bec20, - 0x2c88: 0x403bee20, 0x2c89: 0x403bf020, 0x2c8a: 0x403bf220, 0x2c8b: 0x403bf420, - 0x2c8c: 0x403bf620, 0x2c8d: 0x403bf820, 0x2c8e: 0x403bfa20, 0x2c8f: 0x403bfc20, - 0x2c90: 0x403bfe20, 0x2c91: 0x403c0020, 0x2c92: 0x403c0220, 0x2c93: 0x403c0420, - 0x2c94: 0x403c0820, 0x2c95: 0x403c0a20, 0x2c96: 0x403c0c20, 0x2c97: 0x403c0e20, - 0x2c98: 0x403c1020, 0x2c99: 0x403c1220, 0x2c9a: 0x403c1420, 0x2c9b: 0x403c1620, - 0x2c9c: 0x403c1820, 0x2c9d: 0x403c1a20, 0x2c9e: 0x403c1c20, 0x2c9f: 0x403c1e20, - 0x2ca0: 0x403c2020, 0x2ca1: 0x403c2220, 0x2ca2: 0x403c2420, 0x2ca3: 0x403c2620, - 0x2ca4: 0x403c2820, 0x2ca5: 0x403c2a20, 0x2ca6: 0x403bd420, 0x2ca7: 0x403c0620, - 0x2caf: 0x403c2c20, - 0x2cb0: 0x4005e620, - 0x2cbf: 0xa0900000, - // Block 0xb3, offset 0x2cc0 - 0x2cc0: 0x403c4e20, 0x2cc1: 0x403c7820, 0x2cc2: 0x403c9a20, 0x2cc3: 0x403cac20, - 0x2cc4: 0x403cca20, 0x2cc5: 0x403d1620, 0x2cc6: 0x403d3820, 0x2cc7: 0x403d4a20, - 0x2cc8: 0x403d7620, 0x2cc9: 0x403d8820, 0x2cca: 0x403d9a20, 0x2ccb: 0x403dfc20, - 0x2ccc: 0x403e3a20, 0x2ccd: 0x403e5820, 0x2cce: 0x403e6a20, 0x2ccf: 0x403eae20, - 0x2cd0: 0x403ec020, 0x2cd1: 0x403ee020, 0x2cd2: 0x403f4020, 0x2cd3: 0x403e9620, - 0x2cd4: 0x403e9820, 0x2cd5: 0x403e9a20, 0x2cd6: 0x403e9c20, - 0x2ce0: 0x403f4820, 0x2ce1: 0x403f4a20, 0x2ce2: 0x403f4c20, 0x2ce3: 0x403f4e20, - 0x2ce4: 0x403f5020, 0x2ce5: 0x403f5220, 0x2ce6: 0x403f5420, - 0x2ce8: 0x403f5620, 0x2ce9: 0x403f5820, 0x2cea: 0x403f5a20, 0x2ceb: 0x403f5c20, - 0x2cec: 0x403f5e20, 0x2ced: 0x403f6020, 0x2cee: 0x403f6220, - 0x2cf0: 0x403f6420, 0x2cf1: 0x403f6620, 0x2cf2: 0x403f6820, 0x2cf3: 0x403f6a20, - 0x2cf4: 0x403f6c20, 0x2cf5: 0x403f6e20, 0x2cf6: 0x403f7020, - 0x2cf8: 0x403f7220, 0x2cf9: 0x403f7420, 0x2cfa: 0x403f7620, 0x2cfb: 0x403f7820, - 0x2cfc: 0x403f7a20, 0x2cfd: 0x403f7c20, 0x2cfe: 0x403f7e20, - // Block 0xb4, offset 0x2d00 - 0x2d00: 0x403f8020, 0x2d01: 0x403f8220, 0x2d02: 0x403f8420, 0x2d03: 0x403f8620, - 0x2d04: 0x403f8820, 0x2d05: 0x403f8a20, 0x2d06: 0x403f8c20, - 0x2d08: 0x403f8e20, 0x2d09: 0x403f9020, 0x2d0a: 0x403f9220, 0x2d0b: 0x403f9420, - 0x2d0c: 0x403f9620, 0x2d0d: 0x403f9820, 0x2d0e: 0x403f9a20, - 0x2d10: 0x403f9c20, 0x2d11: 0x403f9e20, 0x2d12: 0x403fa020, 0x2d13: 0x403fa220, - 0x2d14: 0x403fa420, 0x2d15: 0x403fa620, 0x2d16: 0x403fa820, - 0x2d18: 0x403faa20, 0x2d19: 0x403fac20, 0x2d1a: 0x403fae20, 0x2d1b: 0x403fb020, - 0x2d1c: 0x403fb220, 0x2d1d: 0x403fb420, 0x2d1e: 0x403fb620, - 0x2d20: 0x84e619a9, 0x2d21: 0x84e619ad, 0x2d22: 0x84e619b1, 0x2d23: 0x84e619c5, - 0x2d24: 0x84e619e5, 0x2d25: 0x84e619f2, 0x2d26: 0x84e61a28, 0x2d27: 0x84e61a42, - 0x2d28: 0x84e61a54, 0x2d29: 0x84e61a5d, 0x2d2a: 0x84e61a77, 0x2d2b: 0x84e61a87, - 0x2d2c: 0x84e61a94, 0x2d2d: 0x84e61a9d, 0x2d2e: 0x84e61aa6, 0x2d2f: 0x84e61ada, - 0x2d30: 0x84e61b01, 0x2d31: 0x84e61b0c, 0x2d32: 0x84e61b2e, 0x2d33: 0x84e61b33, - 0x2d34: 0x84e61b86, 0x2d35: 0xe00014d8, 0x2d36: 0x84e61991, 0x2d37: 0x84e619d9, - 0x2d38: 0x84e61a27, 0x2d39: 0x84e61ad1, 0x2d3a: 0x84e61b4f, 0x2d3b: 0x84e61b5c, - 0x2d3c: 0x84e61b61, 0x2d3d: 0x84e61b6b, 0x2d3e: 0x84e61b70, 0x2d3f: 0x84e61b7a, - // Block 0xb5, offset 0x2d40 - 0x2d40: 0x40052620, 0x2d41: 0x40052820, 0x2d42: 0x40047420, 0x2d43: 0x40047620, - 0x2d44: 0x40047820, 0x2d45: 0x40047a20, 0x2d46: 0x40052a20, 0x2d47: 0x40052c20, - 0x2d48: 0x40052e20, 0x2d49: 0x40047c20, 0x2d4a: 0x40047e20, 0x2d4b: 0x40053020, - 0x2d4c: 0x40048020, 0x2d4d: 0x40048220, 0x2d4e: 0x40053220, 0x2d4f: 0x40053420, - 0x2d50: 0x40053620, 0x2d51: 0x40053820, 0x2d52: 0x40053a20, 0x2d53: 0x40053c20, - 0x2d54: 0x40053e20, 0x2d55: 0x40054020, 0x2d56: 0x40054220, 0x2d57: 0x40023620, - 0x2d58: 0x4002e220, 0x2d59: 0x4003ba20, 0x2d5a: 0x40054420, 0x2d5b: 0x40054620, - 0x2d5c: 0x40048420, 0x2d5d: 0x40048620, 0x2d5e: 0x40054820, 0x2d5f: 0x40054a20, - 0x2d60: 0x40048820, 0x2d61: 0x40048a20, 0x2d62: 0x40048c20, 0x2d63: 0x40048e20, - 0x2d64: 0x40049020, 0x2d65: 0x40049220, 0x2d66: 0x40049420, 0x2d67: 0x40049620, - 0x2d68: 0x40049820, 0x2d69: 0x40049a20, 0x2d6a: 0x4003ae20, 0x2d6b: 0x4003b020, - 0x2d6c: 0x4003b220, 0x2d6d: 0x4003b420, 0x2d6e: 0x4002c820, 0x2d6f: 0x40367020, - 0x2d70: 0x4002fc20, 0x2d71: 0x40030820, 0x2d72: 0x40024420, 0x2d73: 0x40030a20, - 0x2d74: 0x40024220, 0x2d75: 0x40026820, 0x2d76: 0x4004fc20, 0x2d77: 0x4004fe20, - 0x2d78: 0x40050020, 0x2d79: 0x4004d020, 0x2d7a: 0x40023020, 0x2d7b: 0x40023220, - // Block 0xb6, offset 0x2d80 - 0x2d80: 0xe0002401, 0x2d81: 0xe0002416, 0x2d82: 0x029cb684, 0x2d83: 0x029cb484, - 0x2d84: 0xe0002404, 0x2d85: 0x029d7684, 0x2d86: 0xe0002407, 0x2d87: 0xe000240a, - 0x2d88: 0xe000240d, 0x2d89: 0x02a40484, 0x2d8a: 0xe0002410, 0x2d8b: 0xe0002413, - 0x2d8c: 0xe0002419, 0x2d8d: 0xe000241c, 0x2d8e: 0xe000241f, 0x2d8f: 0x02b84684, - 0x2d90: 0x02b84484, 0x2d91: 0xe0002422, 0x2d92: 0x02bbe684, 0x2d93: 0x02bcf484, - 0x2d94: 0x02bea284, 0x2d95: 0xe0002425, 0x2d96: 0x02bf8884, 0x2d97: 0xe0002428, - 0x2d98: 0x02c49884, 0x2d99: 0x02ca6a84, 0x2d9b: 0x02cbc284, - 0x2d9c: 0xe000242b, 0x2d9d: 0xe000242e, 0x2d9e: 0xe0002436, 0x2d9f: 0x02d79a84, - 0x2da0: 0x02d82284, 0x2da1: 0x02d86a84, 0x2da2: 0x02d87484, 0x2da3: 0x02e0d884, - 0x2da4: 0x02e45684, 0x2da5: 0xe0002439, 0x2da6: 0x029c5884, 0x2da7: 0xe000243c, - 0x2da8: 0x02e55a84, 0x2da9: 0xe000243f, 0x2daa: 0xe0002442, 0x2dab: 0xe0002445, - 0x2dac: 0xe0002448, 0x2dad: 0x02f27684, 0x2dae: 0xe000244b, 0x2daf: 0x02f9f284, - 0x2db0: 0x02fd3e84, 0x2db1: 0x02fea684, 0x2db2: 0x02fea484, 0x2db3: 0xe0002451, - 0x2db4: 0xe0002454, 0x2db5: 0xe000244e, 0x2db6: 0xe0002457, 0x2db7: 0xe000245a, - 0x2db8: 0x02ff1684, 0x2db9: 0x03000484, 0x2dba: 0x03010084, 0x2dbb: 0xe000245d, - 0x2dbc: 0xe0002460, 0x2dbd: 0xe0002463, 0x2dbe: 0x0304f284, 0x2dbf: 0xe0002466, - // Block 0xb7, offset 0x2dc0 - 0x2dc0: 0xe0002469, 0x2dc1: 0x030c9c84, 0x2dc2: 0x0310c884, 0x2dc3: 0x03130084, - 0x2dc4: 0x0312fe84, 0x2dc5: 0x03138284, 0x2dc6: 0x0313a484, 0x2dc7: 0xe000246c, - 0x2dc8: 0x03174084, 0x2dc9: 0x031a3a84, 0x2dca: 0xe000246f, 0x2dcb: 0x031ecc84, - 0x2dcc: 0x031f6c84, 0x2dcd: 0xe0002472, 0x2dce: 0xe0002475, 0x2dcf: 0xe0002478, - 0x2dd0: 0x03290a84, 0x2dd1: 0x032aee84, 0x2dd2: 0x032af084, 0x2dd3: 0x032afe84, - 0x2dd4: 0x032bd084, 0x2dd5: 0xe000247b, 0x2dd6: 0x032c3a84, 0x2dd7: 0xe000247e, - 0x2dd8: 0x032ea484, 0x2dd9: 0x032fcc84, 0x2dda: 0x0330ea84, 0x2ddb: 0x03319c84, - 0x2ddc: 0x0331bc84, 0x2ddd: 0x0331be84, 0x2dde: 0xe0002481, 0x2ddf: 0x0331c084, - 0x2de0: 0x0332c684, 0x2de1: 0xe0002484, 0x2de2: 0x0334d884, 0x2de3: 0xe0002487, - 0x2de4: 0xe000248a, 0x2de5: 0x0338f884, 0x2de6: 0x033c3e84, 0x2de7: 0xe000248d, - 0x2de8: 0x033d4c84, 0x2de9: 0x033d8884, 0x2dea: 0x033dfc84, 0x2deb: 0xe0002490, - 0x2dec: 0x033ea084, 0x2ded: 0xe0002493, 0x2dee: 0x033efe84, 0x2def: 0xe0002496, - 0x2df0: 0x033f3284, 0x2df1: 0xe0002499, 0x2df2: 0xe000249c, 0x2df3: 0x033f3e84, - // Block 0xb8, offset 0x2e00 - 0x2e00: 0x029c0084, 0x2e01: 0x029c5084, 0x2e02: 0x029c6c84, 0x2e03: 0x029c7e84, - 0x2e04: 0x029cb284, 0x2e05: 0x029d0a84, 0x2e06: 0x029d1884, 0x2e07: 0x029d4084, - 0x2e08: 0x029d7484, 0x2e09: 0x02a27e84, 0x2e0a: 0x02a2ca84, 0x2e0b: 0x02a2d684, - 0x2e0c: 0x02a30484, 0x2e0d: 0x02a32c84, 0x2e0e: 0x02a35684, 0x2e0f: 0x02a3c084, - 0x2e10: 0x02a3ea84, 0x2e11: 0x02a40084, 0x2e12: 0x02a53684, 0x2e13: 0x02a5f284, - 0x2e14: 0x02a62a84, 0x2e15: 0x02a63484, 0x2e16: 0x02a67084, 0x2e17: 0x02a68284, - 0x2e18: 0x02a6b884, 0x2e19: 0x02a6d284, 0x2e1a: 0x02a70484, 0x2e1b: 0x02a76c84, - 0x2e1c: 0x02a79084, 0x2e1d: 0x02a7c684, 0x2e1e: 0x02adae84, 0x2e1f: 0x02ae3e84, - 0x2e20: 0x02b1d684, 0x2e21: 0x02b20484, 0x2e22: 0x02b21484, 0x2e23: 0x02b22a84, - 0x2e24: 0x02b24e84, 0x2e25: 0x02b2e684, 0x2e26: 0x02b6a084, 0x2e27: 0x02b70084, - 0x2e28: 0x02b7f084, 0x2e29: 0x02b81e84, 0x2e2a: 0x02b84484, 0x2e2b: 0x02b87084, - 0x2e2c: 0x02b8dc84, 0x2e2d: 0x02b8e284, 0x2e2e: 0x02bbb684, 0x2e2f: 0x02bbca84, - 0x2e30: 0x02bbe284, 0x2e31: 0x02bbfc84, 0x2e32: 0x02bce484, 0x2e33: 0x02bcf484, - 0x2e34: 0x02bcfe84, 0x2e35: 0x02bde884, 0x2e36: 0x02bdfc84, 0x2e37: 0x02be1684, - 0x2e38: 0x02be2684, 0x2e39: 0x02bea084, 0x2e3a: 0x02bec284, 0x2e3b: 0x02bee684, - 0x2e3c: 0x02bf8684, 0x2e3d: 0x02c41084, 0x2e3e: 0x02c46c84, 0x2e3f: 0x02c49684, - // Block 0xb9, offset 0x2e40 - 0x2e40: 0x02ca5e84, 0x2e41: 0x02ca6884, 0x2e42: 0x02cb0e84, 0x2e43: 0x02cb2e84, - 0x2e44: 0x02cb4884, 0x2e45: 0x02cb7284, 0x2e46: 0x02cbc084, 0x2e47: 0x02cbca84, - 0x2e48: 0x02cde084, 0x2e49: 0x02ce1084, 0x2e4a: 0x02ce5084, 0x2e4b: 0x02d64084, - 0x2e4c: 0x02d6c484, 0x2e4d: 0x02d6f284, 0x2e4e: 0x02d76684, 0x2e4f: 0x02d79684, - 0x2e50: 0x02d7a884, 0x2e51: 0x02d7b684, 0x2e52: 0x02d81e84, 0x2e53: 0x02d82884, - 0x2e54: 0x02d86884, 0x2e55: 0x02e0d684, 0x2e56: 0x02e45484, 0x2e57: 0x02e46c84, - 0x2e58: 0x02e47684, 0x2e59: 0x02e47e84, 0x2e5a: 0x02e48e84, 0x2e5b: 0x02e4b284, - 0x2e5c: 0x02e4b684, 0x2e5d: 0x02e55884, 0x2e5e: 0x02e70884, 0x2e5f: 0x02e71284, - 0x2e60: 0x02e9b884, 0x2e61: 0x02e9cc84, 0x2e62: 0x02ea3084, 0x2e63: 0x02ea3e84, - 0x2e64: 0x02ea5084, 0x2e65: 0x02ea6084, 0x2e66: 0x02eb1684, 0x2e67: 0x02eb2484, - 0x2e68: 0x02ecec84, 0x2e69: 0x02ecfa84, 0x2e6a: 0x02ed5c84, 0x2e6b: 0x02ed7e84, - 0x2e6c: 0x02eddc84, 0x2e6d: 0x02efb684, 0x2e6e: 0x02efc484, 0x2e6f: 0x02efe684, - 0x2e70: 0x02f27484, 0x2e71: 0x02f37084, 0x2e72: 0x02f37c84, 0x2e73: 0x02f4e884, - 0x2e74: 0x02f59684, 0x2e75: 0x02f5f284, 0x2e76: 0x02f8e684, 0x2e77: 0x02f9f084, - 0x2e78: 0x02fe6c84, 0x2e79: 0x02fea284, 0x2e7a: 0x02ff1484, 0x2e7b: 0x02ff7a84, - 0x2e7c: 0x03000284, 0x2e7d: 0x03001884, 0x2e7e: 0x03002484, 0x2e7f: 0x03006684, - // Block 0xba, offset 0x2e80 - 0x2e80: 0x0300fe84, 0x2e81: 0x03011284, 0x2e82: 0x0303c684, 0x2e83: 0x0303d484, - 0x2e84: 0x0303e684, 0x2e85: 0x0303f884, 0x2e86: 0x03041884, 0x2e87: 0x03043684, - 0x2e88: 0x03043e84, 0x2e89: 0x0304dc84, 0x2e8a: 0x0304e484, 0x2e8b: 0x0304f084, - 0x2e8c: 0x030c9a84, 0x2e8d: 0x030cd684, 0x2e8e: 0x03108084, 0x2e8f: 0x03109884, - 0x2e90: 0x0310c684, 0x2e91: 0x0312fc84, 0x2e92: 0x03131684, 0x2e93: 0x0313a484, - 0x2e94: 0x03140084, 0x2e95: 0x03186e84, 0x2e96: 0x03188c84, 0x2e97: 0x0318aa84, - 0x2e98: 0x0318f084, 0x2e99: 0x03193a84, 0x2e9a: 0x031ac884, 0x2e9b: 0x031ae084, - 0x2e9c: 0x031b6684, 0x2e9d: 0x031d5684, 0x2e9e: 0x031d9484, 0x2e9f: 0x031f3684, - 0x2ea0: 0x031f6084, 0x2ea1: 0x031f6a84, 0x2ea2: 0x03212284, 0x2ea3: 0x03229284, - 0x2ea4: 0x03238c84, 0x2ea5: 0x03239884, 0x2ea6: 0x0323a284, 0x2ea7: 0x032aee84, - 0x2ea8: 0x032b0084, 0x2ea9: 0x032c3884, 0x2eaa: 0x032d6c84, 0x2eab: 0x032d7284, - 0x2eac: 0x032dd084, 0x2ead: 0x032ea284, 0x2eae: 0x032ebc84, 0x2eaf: 0x032ec484, - 0x2eb0: 0x032ed284, 0x2eb1: 0x032f9684, 0x2eb2: 0x032fda84, 0x2eb3: 0x032fe684, - 0x2eb4: 0x03300284, 0x2eb5: 0x03315084, 0x2eb6: 0x0331b684, 0x2eb7: 0x0331be84, - 0x2eb8: 0x03332c84, 0x2eb9: 0x03333284, 0x2eba: 0x03335884, 0x2ebb: 0x03355084, - 0x2ebc: 0x0335b084, 0x2ebd: 0x0335be84, 0x2ebe: 0x03364a84, 0x2ebf: 0x03365e84, - // Block 0xbb, offset 0x2ec0 - 0x2ec0: 0x03366484, 0x2ec1: 0x03367884, 0x2ec2: 0x0336b484, 0x2ec3: 0x0339ca84, - 0x2ec4: 0x033cea84, 0x2ec5: 0x033cfe84, 0x2ec6: 0x033d4a84, 0x2ec7: 0x033d7684, - 0x2ec8: 0x033d8684, 0x2ec9: 0x033d9a84, 0x2eca: 0x033da284, 0x2ecb: 0x033df284, - 0x2ecc: 0x033dfa84, 0x2ecd: 0x033e1c84, 0x2ece: 0x033e2684, 0x2ecf: 0x033e4084, - 0x2ed0: 0x033e7684, 0x2ed1: 0x033e9484, 0x2ed2: 0x033ea484, 0x2ed3: 0x033f1a84, - 0x2ed4: 0x033f3884, 0x2ed5: 0x033f4084, - 0x2ef0: 0x40273a20, 0x2ef1: 0x40273c20, 0x2ef2: 0x40273e20, 0x2ef3: 0x40274020, - 0x2ef4: 0x40274220, 0x2ef5: 0x40274420, 0x2ef6: 0x40274620, 0x2ef7: 0x40274820, - 0x2ef8: 0x40274a20, 0x2ef9: 0x40274c20, 0x2efa: 0x40274e20, 0x2efb: 0x40275020, - // Block 0xbc, offset 0x2f00 - 0x2f00: 0x00021283, 0x2f01: 0x40025c20, 0x2f02: 0x40030420, 0x2f03: 0x40051220, - 0x2f04: 0x40279a20, 0x2f05: 0x4027ca20, 0x2f06: 0xe0002206, 0x2f07: 0xe00001d3, - 0x2f08: 0x40049c20, 0x2f09: 0x40049e20, 0x2f0a: 0x4004a020, 0x2f0b: 0x4004a220, - 0x2f0c: 0x4004a420, 0x2f0d: 0x4004a620, 0x2f0e: 0x4004a820, 0x2f0f: 0x4004aa20, - 0x2f10: 0x4004ac20, 0x2f11: 0x4004ae20, 0x2f12: 0x40279c20, 0x2f13: 0x40279e20, - 0x2f14: 0x4004b020, 0x2f15: 0x4004b220, 0x2f16: 0x4004b420, 0x2f17: 0x4004b620, - 0x2f18: 0x4004b820, 0x2f19: 0x4004ba20, 0x2f1a: 0x4004bc20, 0x2f1b: 0x4004be20, - 0x2f1c: 0x40023820, 0x2f1d: 0x4003ea20, 0x2f1e: 0x4003ec20, 0x2f1f: 0x4003ee20, - 0x2f20: 0x4027a020, 0x2f21: 0xe0000267, 0x2f22: 0xe000037f, 0x2f23: 0xe0000459, - 0x2f24: 0xe000052e, 0x2f25: 0xe00005f8, 0x2f26: 0xe00006c3, 0x2f27: 0xe000076b, - 0x2f28: 0xe0000817, 0x2f29: 0xe00008bc, 0x2f2a: 0xada12202, 0x2f2b: 0xae412302, - 0x2f2c: 0xae812402, 0x2f2d: 0xade12502, 0x2f2e: 0xae012602, 0x2f2f: 0xae012702, - 0x2f30: 0x40023a20, 0x2f31: 0x4027ce20, 0x2f32: 0xe0000152, 0x2f33: 0x4027d020, - 0x2f34: 0xe0000155, 0x2f35: 0x4027d220, 0x2f36: 0x00279c84, 0x2f37: 0x4027a220, - 0x2f38: 0x02a68284, 0x2f39: 0x02a68884, 0x2f3a: 0x02a68a84, 0x2f3b: 0x4027cc20, - 0x2f3c: 0xe000231a, 0x2f3d: 0x40051420, 0x2f3e: 0x4027a420, 0x2f3f: 0x4027a620, - // Block 0xbd, offset 0x2f40 - 0x2f41: 0x0065768d, 0x2f42: 0x0065768e, 0x2f43: 0x0065788d, - 0x2f44: 0x0065788e, 0x2f45: 0x00657a8d, 0x2f46: 0x00657a8e, 0x2f47: 0x00657e8d, - 0x2f48: 0x00657e8e, 0x2f49: 0x0065808d, 0x2f4a: 0x0065808e, 0x2f4b: 0x0065828e, - 0x2f4c: 0xe000216a, 0x2f4d: 0x0065848e, 0x2f4e: 0xe0002188, 0x2f4f: 0x0065868e, - 0x2f50: 0xe00021b8, 0x2f51: 0x0065888e, 0x2f52: 0xe00021d6, 0x2f53: 0x00658a8e, - 0x2f54: 0xe00021e0, 0x2f55: 0x00658c8e, 0x2f56: 0xe00021ef, 0x2f57: 0x00658e8e, - 0x2f58: 0xe0002200, 0x2f59: 0x0065908e, 0x2f5a: 0xe000220f, 0x2f5b: 0x0065928e, - 0x2f5c: 0xe0002215, 0x2f5d: 0x0065948e, 0x2f5e: 0xe0002223, 0x2f5f: 0x0065968e, - 0x2f60: 0xe0002229, 0x2f61: 0x0065988e, 0x2f62: 0xe0002234, 0x2f63: 0x00659a8d, - 0x2f64: 0x00659a8e, 0x2f65: 0xe000223a, 0x2f66: 0x00659c8e, 0x2f67: 0xe0002240, - 0x2f68: 0x00659e8e, 0x2f69: 0xe000224a, 0x2f6a: 0x0065a08e, 0x2f6b: 0x0065a28e, - 0x2f6c: 0x0065a48e, 0x2f6d: 0x0065a68e, 0x2f6e: 0x0065a88e, 0x2f6f: 0x0065aa8e, - 0x2f70: 0xe0002258, 0x2f71: 0xe000225e, 0x2f72: 0x0065ac8e, 0x2f73: 0xe000227a, - 0x2f74: 0xe0002280, 0x2f75: 0x0065ae8e, 0x2f76: 0xe000229a, 0x2f77: 0xe00022a0, - 0x2f78: 0x0065b08e, 0x2f79: 0xe00022bd, 0x2f7a: 0xe00022c3, 0x2f7b: 0x0065b28e, - 0x2f7c: 0xe00022ec, 0x2f7d: 0xe00022f2, 0x2f7e: 0x0065b48e, 0x2f7f: 0x0065b68e, - // Block 0xbe, offset 0x2f80 - 0x2f80: 0x0065b88e, 0x2f81: 0x0065ba8e, 0x2f82: 0x0065bc8e, 0x2f83: 0x0065be8d, - 0x2f84: 0x0065be8e, 0x2f85: 0x0065c08d, 0x2f86: 0x0065c08e, 0x2f87: 0x0065c48d, - 0x2f88: 0x0065c48e, 0x2f89: 0x0065c68e, 0x2f8a: 0x0065c88e, 0x2f8b: 0x0065ca8e, - 0x2f8c: 0x0065cc8e, 0x2f8d: 0x0065ce8e, 0x2f8e: 0x0065d08d, 0x2f8f: 0x0065d08e, - 0x2f90: 0x0065d28e, 0x2f91: 0x0065d48e, 0x2f92: 0x0065d68e, 0x2f93: 0x0065d88e, - 0x2f94: 0xe000214c, 0x2f95: 0x0065828d, 0x2f96: 0x0065888d, - 0x2f99: 0xa0812802, 0x2f9a: 0xa0812902, 0x2f9b: 0x40063c20, - 0x2f9c: 0x40063e20, 0x2f9d: 0x4027d420, 0x2f9e: 0xe0000158, 0x2f9f: 0xf0001616, - 0x2fa0: 0x40023c20, 0x2fa1: 0x0065768f, 0x2fa2: 0x00657691, 0x2fa3: 0x0065788f, - 0x2fa4: 0x00657891, 0x2fa5: 0x00657a8f, 0x2fa6: 0x00657a91, 0x2fa7: 0x00657e8f, - 0x2fa8: 0x00657e91, 0x2fa9: 0x0065808f, 0x2faa: 0x00658091, 0x2fab: 0x00658291, - 0x2fac: 0xe000216d, 0x2fad: 0x00658491, 0x2fae: 0xe000218b, 0x2faf: 0x00658691, - 0x2fb0: 0xe00021bb, 0x2fb1: 0x00658891, 0x2fb2: 0xe00021d9, 0x2fb3: 0x00658a91, - 0x2fb4: 0xe00021e3, 0x2fb5: 0x00658c91, 0x2fb6: 0xe00021f2, 0x2fb7: 0x00658e91, - 0x2fb8: 0xe0002203, 0x2fb9: 0x00659091, 0x2fba: 0xe0002212, 0x2fbb: 0x00659291, - 0x2fbc: 0xe0002218, 0x2fbd: 0x00659491, 0x2fbe: 0xe0002226, 0x2fbf: 0x00659691, - // Block 0xbf, offset 0x2fc0 - 0x2fc0: 0xe000222c, 0x2fc1: 0x00659891, 0x2fc2: 0xe0002237, 0x2fc3: 0x00659a8f, - 0x2fc4: 0x00659a91, 0x2fc5: 0xe000223d, 0x2fc6: 0x00659c91, 0x2fc7: 0xe0002243, - 0x2fc8: 0x00659e91, 0x2fc9: 0xe000224d, 0x2fca: 0x0065a091, 0x2fcb: 0x0065a291, - 0x2fcc: 0x0065a491, 0x2fcd: 0x0065a691, 0x2fce: 0x0065a891, 0x2fcf: 0x0065aa91, - 0x2fd0: 0xe000225b, 0x2fd1: 0xe0002261, 0x2fd2: 0x0065ac91, 0x2fd3: 0xe000227d, - 0x2fd4: 0xe0002283, 0x2fd5: 0x0065ae91, 0x2fd6: 0xe000229d, 0x2fd7: 0xe00022a3, - 0x2fd8: 0x0065b091, 0x2fd9: 0xe00022c0, 0x2fda: 0xe00022c6, 0x2fdb: 0x0065b291, - 0x2fdc: 0xe00022ef, 0x2fdd: 0xe00022f5, 0x2fde: 0x0065b491, 0x2fdf: 0x0065b691, - 0x2fe0: 0x0065b891, 0x2fe1: 0x0065ba91, 0x2fe2: 0x0065bc91, 0x2fe3: 0x0065be8f, - 0x2fe4: 0x0065be91, 0x2fe5: 0x0065c08f, 0x2fe6: 0x0065c091, 0x2fe7: 0x0065c48f, - 0x2fe8: 0x0065c491, 0x2fe9: 0x0065c691, 0x2fea: 0x0065c891, 0x2feb: 0x0065ca91, - 0x2fec: 0x0065cc91, 0x2fed: 0x0065ce91, 0x2fee: 0x0065d08f, 0x2fef: 0x0065d091, - 0x2ff0: 0x0065d291, 0x2ff1: 0x0065d491, 0x2ff2: 0x0065d691, 0x2ff3: 0x0065d891, - 0x2ff4: 0xe000214f, 0x2ff5: 0x0065828f, 0x2ff6: 0x0065888f, 0x2ff7: 0xe000236a, - 0x2ff8: 0xe0002371, 0x2ff9: 0xe0002374, 0x2ffa: 0xe0002377, 0x2ffb: 0x40023e20, - 0x2ffc: 0x4027d620, 0x2ffd: 0x4027d820, 0x2ffe: 0xe000015b, 0x2fff: 0xf0001616, - // Block 0xc0, offset 0x3000 - 0x3005: 0x4065da20, 0x3006: 0x4065dc20, 0x3007: 0x4065de20, - 0x3008: 0x4065e020, 0x3009: 0x4065e420, 0x300a: 0x4065e620, 0x300b: 0x4065e820, - 0x300c: 0x4065ea20, 0x300d: 0x4065ec20, 0x300e: 0x4065ee20, 0x300f: 0x4065f420, - 0x3010: 0x4065f620, 0x3011: 0x4065f820, 0x3012: 0x4065fa20, 0x3013: 0x4065fe20, - 0x3014: 0x40660020, 0x3015: 0x40660220, 0x3016: 0x40660420, 0x3017: 0x40660620, - 0x3018: 0x40660820, 0x3019: 0x40660a20, 0x301a: 0x40661220, 0x301b: 0x40661420, - 0x301c: 0x40661820, 0x301d: 0x40661a20, 0x301e: 0x40661e20, 0x301f: 0x40662020, - 0x3020: 0x40662220, 0x3021: 0x40662420, 0x3022: 0x40662620, 0x3023: 0x40662820, - 0x3024: 0x40662a20, 0x3025: 0x40662e20, 0x3026: 0x40663620, 0x3027: 0x40663820, - 0x3028: 0x40663a20, 0x3029: 0x40663c20, 0x302a: 0x4065e220, 0x302b: 0x4065f020, - 0x302c: 0x4065fc20, 0x302d: 0x40663e20, - 0x3031: 0x0062ac84, 0x3032: 0x0062ae84, 0x3033: 0x00646884, - 0x3034: 0x0062b084, 0x3035: 0x00646c84, 0x3036: 0x00646e84, 0x3037: 0x0062b284, - 0x3038: 0x0062b484, 0x3039: 0x0062b684, 0x303a: 0x00647484, 0x303b: 0x00647684, - 0x303c: 0x00647884, 0x303d: 0x00647a84, 0x303e: 0x00647c84, 0x303f: 0x00647e84, - // Block 0xc1, offset 0x3040 - 0x3040: 0x0062e084, 0x3041: 0x0062b884, 0x3042: 0x0062ba84, 0x3043: 0x0062bc84, - 0x3044: 0x0062ee84, 0x3045: 0x0062be84, 0x3046: 0x0062c084, 0x3047: 0x0062c284, - 0x3048: 0x0062c484, 0x3049: 0x0062c684, 0x304a: 0x0062c884, 0x304b: 0x0062ca84, - 0x304c: 0x0062cc84, 0x304d: 0x0062ce84, 0x304e: 0x0062d084, 0x304f: 0x0063a884, - 0x3050: 0x0063aa84, 0x3051: 0x0063ac84, 0x3052: 0x0063ae84, 0x3053: 0x0063b084, - 0x3054: 0x0063b284, 0x3055: 0x0063b484, 0x3056: 0x0063b684, 0x3057: 0x0063b884, - 0x3058: 0x0063ba84, 0x3059: 0x0063bc84, 0x305a: 0x0063be84, 0x305b: 0x0063c084, - 0x305c: 0x0063c284, 0x305d: 0x0063c484, 0x305e: 0x0063c684, 0x305f: 0x0063c884, - 0x3060: 0x0063ca84, 0x3061: 0x0063cc84, 0x3062: 0x0063ce84, 0x3063: 0x0063d084, - 0x3064: 0x0063a684, 0x3065: 0x0062d484, 0x3066: 0x0062d684, 0x3067: 0x0064a284, - 0x3068: 0x0064a484, 0x3069: 0x0064ac84, 0x306a: 0x0064b084, 0x306b: 0x0064ba84, - 0x306c: 0x0064c284, 0x306d: 0x0064c684, 0x306e: 0x0062e484, 0x306f: 0x0064ce84, - 0x3070: 0x0064d284, 0x3071: 0x0062e684, 0x3072: 0x0062e884, 0x3073: 0x0062ec84, - 0x3074: 0x0062f084, 0x3075: 0x0062f284, 0x3076: 0x0062fa84, 0x3077: 0x0062fe84, - 0x3078: 0x00630284, 0x3079: 0x00630484, 0x307a: 0x00630684, 0x307b: 0x00630884, - 0x307c: 0x00630a84, 0x307d: 0x00631084, 0x307e: 0x00631884, 0x307f: 0x00632c84, - // Block 0xc2, offset 0x3080 - 0x3080: 0x00633a84, 0x3081: 0x00634484, 0x3082: 0x0064f684, 0x3083: 0x0064f884, - 0x3084: 0x00635a84, 0x3085: 0x00635c84, 0x3086: 0x00635e84, 0x3087: 0x0063ee84, - 0x3088: 0x0063f084, 0x3089: 0x0063f684, 0x308a: 0x00640884, 0x308b: 0x00640a84, - 0x308c: 0x00640e84, 0x308d: 0x00642284, 0x308e: 0x00642884, - 0x3090: 0x4027a820, 0x3091: 0x4027aa20, 0x3092: 0x029c0094, 0x3093: 0x029d1894, - 0x3094: 0x029c1294, 0x3095: 0x02adb694, 0x3096: 0x029c1494, 0x3097: 0x029c5a94, - 0x3098: 0x029c1694, 0x3099: 0x02ea6494, 0x309a: 0x029cb294, 0x309b: 0x029c3294, - 0x309c: 0x029c0294, 0x309d: 0x02b25294, 0x309e: 0x02ae6094, 0x309f: 0x029d7494, - 0x30a0: 0xe000237a, 0x30a1: 0xe0002383, 0x30a2: 0xe0002380, 0x30a3: 0xe000237d, - 0x30a4: 0x40661c20, 0x30a5: 0xe000238c, 0x30a6: 0x40661620, 0x30a7: 0xe0002389, - 0x30a8: 0xe000239e, 0x30a9: 0xe0002386, 0x30aa: 0xe0002395, 0x30ab: 0xe000239b, - 0x30ac: 0x40663420, 0x30ad: 0x4065f220, 0x30ae: 0xe000238f, 0x30af: 0xe0002392, - 0x30b0: 0x40663020, 0x30b1: 0x40663220, 0x30b2: 0x40662c20, 0x30b3: 0xe0002398, - 0x30b4: 0x0065dc99, 0x30b5: 0x0065e699, 0x30b6: 0x0065ee99, 0x30b7: 0x0065f499, - 0x30b8: 0x40660c20, 0x30b9: 0x40660e20, 0x30ba: 0x40661020, - // Block 0xc3, offset 0x30c0 - 0x30c0: 0x40275220, 0x30c1: 0x40275420, 0x30c2: 0x40275620, 0x30c3: 0x40275820, - 0x30c4: 0x40275a20, 0x30c5: 0x40275c20, 0x30c6: 0x40275e20, 0x30c7: 0x40276020, - 0x30c8: 0x40276220, 0x30c9: 0x40276420, 0x30ca: 0x40276620, 0x30cb: 0x40276820, - 0x30cc: 0x40276a20, 0x30cd: 0x40276c20, 0x30ce: 0x40276e20, 0x30cf: 0x40277020, - 0x30d0: 0x40277220, 0x30d1: 0x40277420, 0x30d2: 0x40277620, 0x30d3: 0x40277820, - 0x30d4: 0x40277a20, 0x30d5: 0x40277c20, 0x30d6: 0x40277e20, 0x30d7: 0x40278020, - 0x30d8: 0x40278220, 0x30d9: 0x40278420, 0x30da: 0x40278620, 0x30db: 0x40278820, - 0x30dc: 0x40278a20, 0x30dd: 0x40278c20, 0x30de: 0x40278e20, 0x30df: 0x40279020, - 0x30e0: 0x40279220, 0x30e1: 0x40279420, 0x30e2: 0x40279620, 0x30e3: 0x40279820, - 0x30f0: 0x0065868f, 0x30f1: 0x00658e8f, 0x30f2: 0x0065908f, 0x30f3: 0x00659e8f, - 0x30f4: 0x0065a48f, 0x30f5: 0x0065aa8f, 0x30f6: 0x0065ac8f, 0x30f7: 0x0065ae8f, - 0x30f8: 0x0065b08f, 0x30f9: 0x0065b28f, 0x30fa: 0x0065b88f, 0x30fb: 0x0065c68f, - 0x30fc: 0x0065c88f, 0x30fd: 0x0065ca8f, 0x30fe: 0x0065cc8f, 0x30ff: 0x0065ce8f, - // Block 0xc4, offset 0x3100 - 0x3100: 0xf0000404, 0x3101: 0xf0000404, 0x3102: 0xf0000404, 0x3103: 0xf0000404, - 0x3104: 0xf0000404, 0x3105: 0xf0000404, 0x3106: 0xf0000404, 0x3107: 0xf0000404, - 0x3108: 0xf0000404, 0x3109: 0xf0000404, 0x310a: 0xf0000404, 0x310b: 0xf0000404, - 0x310c: 0xf0000404, 0x310d: 0xf0000404, 0x310e: 0xe000004c, 0x310f: 0xe0000051, - 0x3110: 0xe0000056, 0x3111: 0xe000005b, 0x3112: 0xe0000060, 0x3113: 0xe0000065, - 0x3114: 0xe000006a, 0x3115: 0xe000006f, 0x3116: 0xe0000083, 0x3117: 0xe000008d, - 0x3118: 0xe0000092, 0x3119: 0xe0000097, 0x311a: 0xe000009c, 0x311b: 0xe00000a1, - 0x311c: 0xe0000088, 0x311d: 0xe0000074, 0x311e: 0xe000007c, - 0x3120: 0xf0000404, 0x3121: 0xf0000404, 0x3122: 0xf0000404, 0x3123: 0xf0000404, - 0x3124: 0xf0000404, 0x3125: 0xf0000404, 0x3126: 0xf0000404, 0x3127: 0xf0000404, - 0x3128: 0xf0000404, 0x3129: 0xf0000404, 0x312a: 0xf0000404, 0x312b: 0xf0000404, - 0x312c: 0xf0000404, 0x312d: 0xf0000404, 0x312e: 0xf0000404, 0x312f: 0xf0000404, - 0x3130: 0xf0000404, 0x3131: 0xf0000404, 0x3132: 0xf0000404, 0x3133: 0xf0000404, - 0x3134: 0xf0000404, 0x3135: 0xf0000404, 0x3136: 0xf0000404, 0x3137: 0xf0000404, - 0x3138: 0xf0000404, 0x3139: 0xf0000404, 0x313a: 0xf0000404, 0x313b: 0xf0000404, - 0x313c: 0xf0000404, 0x313d: 0xf0000404, 0x313e: 0xf0000404, 0x313f: 0xf0000404, - // Block 0xc5, offset 0x3140 - 0x3140: 0xf0000404, 0x3141: 0xf0000404, 0x3142: 0xf0000404, 0x3143: 0xf0000404, - 0x3144: 0x02aa9e86, 0x3145: 0x02bcf886, 0x3146: 0x02cb0e86, 0x3147: 0x02f71e86, - 0x3148: 0xe00002e3, 0x3149: 0xe00003d8, 0x314a: 0xe00004b3, 0x314b: 0xe000057d, - 0x314c: 0xe0000648, 0x314d: 0xe00006f0, 0x314e: 0xe000079c, 0x314f: 0xe0000841, - 0x3150: 0xe0000ec0, 0x3151: 0xf0000606, 0x3152: 0xf0000606, 0x3153: 0xf0000606, - 0x3154: 0xf0000606, 0x3155: 0xf0000606, 0x3156: 0xf0000606, 0x3157: 0xf0000606, - 0x3158: 0xf0000606, 0x3159: 0xf0000606, 0x315a: 0xf0000606, 0x315b: 0xf0000606, - 0x315c: 0xf0000606, 0x315d: 0xf0000606, 0x315e: 0xf0000606, 0x315f: 0xf0000606, - 0x3160: 0x0062ac86, 0x3161: 0x0062b086, 0x3162: 0x0062b286, 0x3163: 0x0062b686, - 0x3164: 0x0062b886, 0x3165: 0x0062ba86, 0x3166: 0x0062be86, 0x3167: 0x0062c286, - 0x3168: 0x0062c486, 0x3169: 0x0062c886, 0x316a: 0x0062ca86, 0x316b: 0x0062cc86, - 0x316c: 0x0062ce86, 0x316d: 0x0062d086, 0x316e: 0xf0000606, 0x316f: 0xf0000606, - 0x3170: 0xf0000606, 0x3171: 0xf0000606, 0x3172: 0xf0000606, 0x3173: 0xf0000606, - 0x3174: 0xf0000606, 0x3175: 0xf0000606, 0x3176: 0xf0000606, 0x3177: 0xf0000606, - 0x3178: 0xf0000606, 0x3179: 0xf0000606, 0x317a: 0xf0000606, 0x317b: 0xf0000606, - 0x317c: 0xe0002127, 0x317d: 0xe0002122, 0x317e: 0xf0000606, 0x317f: 0x4027ac20, - // Block 0xc6, offset 0x3180 - 0x3180: 0x029c0086, 0x3181: 0x029d1886, 0x3182: 0x029c1286, 0x3183: 0x02adb686, - 0x3184: 0x029d2886, 0x3185: 0x02a2da86, 0x3186: 0x029c0686, 0x3187: 0x02a2d686, - 0x3188: 0x029cba86, 0x3189: 0x02a68286, 0x318a: 0x02ce1086, 0x318b: 0x02e0d686, - 0x318c: 0x02d86886, 0x318d: 0x02ce5086, 0x318e: 0x0323a286, 0x318f: 0x02ae3e86, - 0x3190: 0x02cbca86, 0x3191: 0x02d05486, 0x3192: 0x02ce1286, 0x3193: 0x02f27c86, - 0x3194: 0x02a81a86, 0x3195: 0x02e4f286, 0x3196: 0x03194286, 0x3197: 0x02f2ba86, - 0x3198: 0x02a56886, 0x3199: 0x02f3b086, 0x319a: 0x02ea6e86, 0x319b: 0x02b2e686, - 0x319c: 0x0320d286, 0x319d: 0x02a25486, 0x319e: 0x02a6e086, 0x319f: 0x02d9d086, - 0x31a0: 0x03300a86, 0x31a1: 0x029e2286, 0x31a2: 0x02a33286, 0x31a3: 0x02d6c686, - 0x31a4: 0x029c1486, 0x31a5: 0x029c5a86, 0x31a6: 0x029c1686, 0x31a7: 0x02bbcc86, - 0x31a8: 0x02a7e686, 0x31a9: 0x02a67686, 0x31aa: 0x02b72e86, 0x31ab: 0x02b6cc86, - 0x31ac: 0x02edc686, 0x31ad: 0x029e0286, 0x31ae: 0x03198e86, 0x31af: 0x02a6a886, - 0x31b0: 0x02b23886, 0x31b1: 0xf0000606, 0x31b2: 0xf0000606, 0x31b3: 0xf0000606, - 0x31b4: 0xf0000606, 0x31b5: 0xf0000606, 0x31b6: 0xf0000606, 0x31b7: 0xf0000606, - 0x31b8: 0xf0000606, 0x31b9: 0xf0000606, 0x31ba: 0xf0000606, 0x31bb: 0xf0000606, - 0x31bc: 0xf0000606, 0x31bd: 0xf0000606, 0x31be: 0xf0000606, 0x31bf: 0xf0000606, - // Block 0xc7, offset 0x31c0 - 0x31c0: 0xf0001f04, 0x31c1: 0xf0001f04, 0x31c2: 0xf0001f04, 0x31c3: 0xf0001f04, - 0x31c4: 0xf0001f04, 0x31c5: 0xf0001f04, 0x31c6: 0xf0001f04, 0x31c7: 0xf0001f04, - 0x31c8: 0xf0001f04, 0x31c9: 0xf0000404, 0x31ca: 0xf0000404, 0x31cb: 0xf0000404, - 0x31cc: 0xf0001c1d, 0x31cd: 0xe0000b85, 0x31ce: 0xf0001d1c, 0x31cf: 0xe0000d14, - 0x31d0: 0x00657693, 0x31d1: 0x00657893, 0x31d2: 0x00657a93, 0x31d3: 0x00657e93, - 0x31d4: 0x00658093, 0x31d5: 0x00658293, 0x31d6: 0x00658493, 0x31d7: 0x00658693, - 0x31d8: 0x00658893, 0x31d9: 0x00658a93, 0x31da: 0x00658c93, 0x31db: 0x00658e93, - 0x31dc: 0x00659093, 0x31dd: 0x00659293, 0x31de: 0x00659493, 0x31df: 0x00659693, - 0x31e0: 0x00659893, 0x31e1: 0x00659a93, 0x31e2: 0x00659c93, 0x31e3: 0x00659e93, - 0x31e4: 0x0065a093, 0x31e5: 0x0065a293, 0x31e6: 0x0065a493, 0x31e7: 0x0065a693, - 0x31e8: 0x0065a893, 0x31e9: 0x0065aa93, 0x31ea: 0x0065ac93, 0x31eb: 0x0065ae93, - 0x31ec: 0x0065b093, 0x31ed: 0x0065b293, 0x31ee: 0x0065b493, 0x31ef: 0x0065b693, - 0x31f0: 0x0065b893, 0x31f1: 0x0065ba93, 0x31f2: 0x0065bc93, 0x31f3: 0x0065be93, - 0x31f4: 0x0065c093, 0x31f5: 0x0065c493, 0x31f6: 0x0065c693, 0x31f7: 0x0065c893, - 0x31f8: 0x0065ca93, 0x31f9: 0x0065cc93, 0x31fa: 0x0065ce93, 0x31fb: 0x0065d093, - 0x31fc: 0x0065d293, 0x31fd: 0x0065d493, 0x31fe: 0x0065d693, - // Block 0xc8, offset 0x3200 - 0x3200: 0xe0002131, 0x3201: 0xe0002137, 0x3202: 0xe000213c, 0x3203: 0xe000212d, - 0x3204: 0xe0002142, 0x3205: 0xe0002148, 0x3206: 0xe0002152, 0x3207: 0xe000215b, - 0x3208: 0xe0002156, 0x3209: 0xe0002166, 0x320a: 0xe0002162, 0x320b: 0xe0002170, - 0x320c: 0xe0002174, 0x320d: 0xe0002179, 0x320e: 0xe000217e, 0x320f: 0xe0002183, - 0x3210: 0xe000218e, 0x3211: 0xe0002193, 0x3212: 0xe0002198, 0x3213: 0xe000219d, - 0x3214: 0xf0001c1c, 0x3215: 0xe00021a4, 0x3216: 0xe00021ab, 0x3217: 0xe00021b2, - 0x3218: 0xe00021be, 0x3219: 0xe00021c3, 0x321a: 0xe00021ca, 0x321b: 0xe00021d1, - 0x321c: 0xe00021dc, 0x321d: 0xe00021eb, 0x321e: 0xe00021e6, 0x321f: 0xe00021f5, - 0x3220: 0xe00021fa, 0x3221: 0xe0002209, 0x3222: 0xe000221b, 0x3223: 0xe000221f, - 0x3224: 0xe000222f, 0x3225: 0xe0002246, 0x3226: 0xe0002250, 0x3227: 0xf0001c1c, - 0x3228: 0xf0001c1c, 0x3229: 0xe0002254, 0x322a: 0xe0002276, 0x322b: 0xe0002264, - 0x322c: 0xe000226b, 0x322d: 0xe0002270, 0x322e: 0xe0002286, 0x322f: 0xe000228d, - 0x3230: 0xe0002292, 0x3231: 0xe0002296, 0x3232: 0xe00022a6, 0x3233: 0xe00022ad, - 0x3234: 0xe00022b2, 0x3235: 0xe00022b9, 0x3236: 0xe00022d4, 0x3237: 0xe00022da, - 0x3238: 0xe00022de, 0x3239: 0xe00022e3, 0x323a: 0xe00022e7, 0x323b: 0xe00022c9, - 0x323c: 0xe00022cf, 0x323d: 0xe0002300, 0x323e: 0xe0002306, 0x323f: 0xf0001c1c, - // Block 0xc9, offset 0x3240 - 0x3240: 0xe000230b, 0x3241: 0xe00022f8, 0x3242: 0xe00022fc, 0x3243: 0xe0002311, - 0x3244: 0xe0002316, 0x3245: 0xe000231d, 0x3246: 0xe0002321, 0x3247: 0xe0002325, - 0x3248: 0xe000232b, 0x3249: 0xf0001c1c, 0x324a: 0xe0002330, 0x324b: 0xe000233c, - 0x324c: 0xe0002340, 0x324d: 0xe0002337, 0x324e: 0xe0002346, 0x324f: 0xe000234b, - 0x3250: 0xe000234f, 0x3251: 0xe0002353, 0x3252: 0xf0001c1c, 0x3253: 0xe000235e, - 0x3254: 0xe0002358, 0x3255: 0xf0001c1c, 0x3256: 0xe0002363, 0x3257: 0xe000236d, - 0x3258: 0xf0001f04, 0x3259: 0xf0001f04, 0x325a: 0xf0001f04, 0x325b: 0xf0001f04, - 0x325c: 0xf0001f04, 0x325d: 0xf0001f04, 0x325e: 0xf0001f04, 0x325f: 0xf0001f04, - 0x3260: 0xf0001f04, 0x3261: 0xf0001f04, 0x3262: 0xf0000404, 0x3263: 0xf0000404, - 0x3264: 0xf0000404, 0x3265: 0xf0000404, 0x3266: 0xf0000404, 0x3267: 0xf0000404, - 0x3268: 0xf0000404, 0x3269: 0xf0000404, 0x326a: 0xf0000404, 0x326b: 0xf0000404, - 0x326c: 0xf0000404, 0x326d: 0xf0000404, 0x326e: 0xf0000404, 0x326f: 0xf0000404, - 0x3270: 0xf0000404, 0x3271: 0xe0000c1e, 0x3272: 0xf0001c1c, 0x3273: 0xf0001d1d, - 0x3274: 0xe0000a31, 0x3275: 0xf0001d1c, 0x3276: 0xf0001c1c, 0x3277: 0xf0001c1c, - 0x3278: 0xe0000ac2, 0x3279: 0xe0000ac6, 0x327a: 0xf0001d1d, 0x327b: 0xf0001c1c, - 0x327c: 0xf0001c1c, 0x327d: 0xf0001c1c, 0x327e: 0xf0001c1c, 0x327f: 0xe0002431, - // Block 0xca, offset 0x3280 - 0x3280: 0xf0001d1c, 0x3281: 0xf0001d1c, 0x3282: 0xf0001d1c, 0x3283: 0xf0001d1c, - 0x3284: 0xf0001d1c, 0x3285: 0xf0001d1d, 0x3286: 0xf0001d1d, 0x3287: 0xf0001d1d, - 0x3288: 0xe0000a6b, 0x3289: 0xe0000cb4, 0x328a: 0xf0001d1c, 0x328b: 0xf0001d1c, - 0x328c: 0xf0001d1c, 0x328d: 0xf0001c1c, 0x328e: 0xf0001c1c, 0x328f: 0xf0001c1c, - 0x3290: 0xf0001c1d, 0x3291: 0xe0000cb9, 0x3292: 0xe0000d36, 0x3293: 0xe0000be3, - 0x3294: 0xe0000fc5, 0x3295: 0xf0001c1c, 0x3296: 0xf0001c1c, 0x3297: 0xf0001c1c, - 0x3298: 0xf0001c1c, 0x3299: 0xf0001c1c, 0x329a: 0xf0001c1c, 0x329b: 0xf0001c1c, - 0x329c: 0xf0001c1c, 0x329d: 0xf0001c1c, 0x329e: 0xf0001c1c, 0x329f: 0xe0000d3e, - 0x32a0: 0xe0000a72, 0x32a1: 0xf0001c1c, 0x32a2: 0xe0000cbd, 0x32a3: 0xe0000d42, - 0x32a4: 0xe0000a76, 0x32a5: 0xf0001c1c, 0x32a6: 0xe0000cc1, 0x32a7: 0xe0000d2d, - 0x32a8: 0xe0000d31, 0x32a9: 0xf0001c1d, 0x32aa: 0xe0000cc5, 0x32ab: 0xe0000d4a, - 0x32ac: 0xe0000be7, 0x32ad: 0xe0000f0b, 0x32ae: 0xe0000f0f, 0x32af: 0xe0000f15, - 0x32b0: 0xf0001c1c, 0x32b1: 0xf0001c1c, 0x32b2: 0xf0001c1c, 0x32b3: 0xf0001c1c, - 0x32b4: 0xf0001d1c, 0x32b5: 0xf0001d1c, 0x32b6: 0xf0001d1c, 0x32b7: 0xf0001d1c, - 0x32b8: 0xf0001d1c, 0x32b9: 0xf0001d1d, 0x32ba: 0xf0001d1c, 0x32bb: 0xf0001d1c, - 0x32bc: 0xf0001d1c, 0x32bd: 0xf0001d1c, 0x32be: 0xf0001d1c, 0x32bf: 0xf0001d1d, - // Block 0xcb, offset 0x32c0 - 0x32c0: 0xf0001d1c, 0x32c1: 0xf0001d1d, 0x32c2: 0xe00009b7, 0x32c3: 0xf0001c1d, - 0x32c4: 0xf0001c1c, 0x32c5: 0xf0001c1c, 0x32c6: 0xe0000a66, 0x32c7: 0xe0000a7a, - 0x32c8: 0xf0001d1c, 0x32c9: 0xf0001c1d, 0x32ca: 0xf0001c1c, 0x32cb: 0xf0001d1d, - 0x32cc: 0xf0001c1c, 0x32cd: 0xf0001d1d, 0x32ce: 0xf0001d1d, 0x32cf: 0xf0001c1c, - 0x32d0: 0xf0001c1c, 0x32d1: 0xf0001c1c, 0x32d2: 0xe0000d0d, 0x32d3: 0xf0001c1c, - 0x32d4: 0xf0001c1c, 0x32d5: 0xe0000d3a, 0x32d6: 0xe0000d46, 0x32d7: 0xf0001d1d, - 0x32d8: 0xe0000eb0, 0x32d9: 0xe0000eb8, 0x32da: 0xf0001d1d, 0x32db: 0xf0001c1c, - 0x32dc: 0xf0001c1d, 0x32dd: 0xf0001c1d, 0x32de: 0xe00010b2, 0x32df: 0xe00009c8, - 0x32e0: 0xf0001f04, 0x32e1: 0xf0001f04, 0x32e2: 0xf0001f04, 0x32e3: 0xf0001f04, - 0x32e4: 0xf0001f04, 0x32e5: 0xf0001f04, 0x32e6: 0xf0001f04, 0x32e7: 0xf0001f04, - 0x32e8: 0xf0001f04, 0x32e9: 0xf0000404, 0x32ea: 0xf0000404, 0x32eb: 0xf0000404, - 0x32ec: 0xf0000404, 0x32ed: 0xf0000404, 0x32ee: 0xf0000404, 0x32ef: 0xf0000404, - 0x32f0: 0xf0000404, 0x32f1: 0xf0000404, 0x32f2: 0xf0000404, 0x32f3: 0xf0000404, - 0x32f4: 0xf0000404, 0x32f5: 0xf0000404, 0x32f6: 0xf0000404, 0x32f7: 0xf0000404, - 0x32f8: 0xf0000404, 0x32f9: 0xf0000404, 0x32fa: 0xf0000404, 0x32fb: 0xf0000404, - 0x32fc: 0xf0000404, 0x32fd: 0xf0000404, 0x32fe: 0xf0000404, 0x32ff: 0xe0000bdf, - // Block 0xcc, offset 0x3300 - 0x3300: 0x40196220, 0x3301: 0x40196420, 0x3302: 0x40196620, 0x3303: 0x40196820, - 0x3304: 0x40196a20, 0x3305: 0x40196c20, 0x3306: 0x40196e20, 0x3307: 0x40197020, - 0x3308: 0x40197220, 0x3309: 0x40197420, 0x330a: 0x40197620, 0x330b: 0x40197820, - 0x330c: 0x40197a20, 0x330d: 0x40197c20, 0x330e: 0x40197e20, 0x330f: 0x40198020, - 0x3310: 0x40198220, 0x3311: 0x40198420, 0x3312: 0x40198620, 0x3313: 0x40198820, - 0x3314: 0x40198a20, 0x3315: 0x40198c20, 0x3316: 0x40198e20, 0x3317: 0x40199020, - 0x3318: 0x40199220, 0x3319: 0x40199420, 0x331a: 0x40199620, 0x331b: 0x40199820, - 0x331c: 0x40199a20, 0x331d: 0x40199c20, 0x331e: 0x40199e20, 0x331f: 0x4019a020, - 0x3320: 0x4019a220, 0x3321: 0x4019a420, 0x3322: 0x4019a620, 0x3323: 0x4019a820, - 0x3324: 0x4019aa20, 0x3325: 0x4019ac20, 0x3326: 0x4019ae20, 0x3327: 0x4019b020, - 0x3328: 0x4019b220, 0x3329: 0x4019b420, 0x332a: 0x4019b620, 0x332b: 0x4019b820, - 0x332c: 0x4019ba20, 0x332d: 0x4019bc20, 0x332e: 0x4019be20, 0x332f: 0x4019c020, - 0x3330: 0x4019c220, 0x3331: 0x4019c420, 0x3332: 0x4019c620, 0x3333: 0x4019c820, - 0x3334: 0x4019ca20, 0x3335: 0x4019cc20, 0x3336: 0x4019ce20, 0x3337: 0x4019d020, - 0x3338: 0x4019d220, 0x3339: 0x4019d420, 0x333a: 0x4019d620, 0x333b: 0x4019d820, - 0x333c: 0x4019da20, 0x333d: 0x4019dc20, 0x333e: 0x4019de20, 0x333f: 0x4019e020, - // Block 0xcd, offset 0x3340 - 0x3340: 0x40664020, 0x3341: 0x40664220, 0x3342: 0x40664420, 0x3343: 0x40664620, - 0x3344: 0x40664820, 0x3345: 0x40664a20, 0x3346: 0x40664c20, 0x3347: 0x40664e20, - 0x3348: 0x40665020, 0x3349: 0x40665220, 0x334a: 0x40665420, 0x334b: 0x40665620, - 0x334c: 0x40665820, 0x334d: 0x40665a20, 0x334e: 0x40665c20, 0x334f: 0x40665e20, - 0x3350: 0x40666020, 0x3351: 0x40666220, 0x3352: 0x40666420, 0x3353: 0x40666620, - 0x3354: 0x40666820, 0x3355: 0x40666a20, 0x3356: 0x40666c20, 0x3357: 0x40666e20, - 0x3358: 0x40667020, 0x3359: 0x40667220, 0x335a: 0x40667420, 0x335b: 0x40667620, - 0x335c: 0x40667820, 0x335d: 0x40667a20, 0x335e: 0x40667c20, 0x335f: 0x40667e20, - 0x3360: 0x40668020, 0x3361: 0x40668220, 0x3362: 0x40668420, 0x3363: 0x40668620, - 0x3364: 0x40668820, 0x3365: 0x40668a20, 0x3366: 0x40668c20, 0x3367: 0x40668e20, - 0x3368: 0x40669020, 0x3369: 0x40669220, 0x336a: 0x40669420, 0x336b: 0x40669620, - 0x336c: 0x40669820, 0x336d: 0x40669a20, 0x336e: 0x40669c20, 0x336f: 0x40669e20, - 0x3370: 0x4066a020, 0x3371: 0x4066a220, 0x3372: 0x4066a420, 0x3373: 0x4066a620, - 0x3374: 0x4066a820, 0x3375: 0x4066aa20, 0x3376: 0x4066ac20, 0x3377: 0x4066ae20, - 0x3378: 0x4066b020, 0x3379: 0x4066b220, 0x337a: 0x4066b420, 0x337b: 0x4066b620, - 0x337c: 0x4066b820, 0x337d: 0x4066ba20, 0x337e: 0x4066bc20, 0x337f: 0x4066be20, - // Block 0xce, offset 0x3380 - 0x3380: 0x4066c020, 0x3381: 0x4066c220, 0x3382: 0x4066c420, 0x3383: 0x4066c620, - 0x3384: 0x4066c820, 0x3385: 0x4066ca20, 0x3386: 0x4066cc20, 0x3387: 0x4066ce20, - 0x3388: 0x4066d020, 0x3389: 0x4066d220, 0x338a: 0x4066d420, 0x338b: 0x4066d620, - 0x338c: 0x4066d820, 0x338d: 0x4066da20, 0x338e: 0x4066dc20, 0x338f: 0x4066de20, - 0x3390: 0x4066e020, 0x3391: 0x4066e220, 0x3392: 0x4066e420, 0x3393: 0x4066e620, - 0x3394: 0x4066e820, 0x3395: 0x4066ea20, 0x3396: 0x4066ec20, 0x3397: 0x4066ee20, - 0x3398: 0x4066f020, 0x3399: 0x4066f220, 0x339a: 0x4066f420, 0x339b: 0x4066f620, - 0x339c: 0x4066f820, 0x339d: 0x4066fa20, 0x339e: 0x4066fc20, 0x339f: 0x4066fe20, - 0x33a0: 0x40670020, 0x33a1: 0x40670220, 0x33a2: 0x40670420, 0x33a3: 0x40670620, - 0x33a4: 0x40670820, 0x33a5: 0x40670a20, 0x33a6: 0x40670c20, 0x33a7: 0x40670e20, - 0x33a8: 0x40671020, 0x33a9: 0x40671220, 0x33aa: 0x40671420, 0x33ab: 0x40671620, - 0x33ac: 0x40671820, 0x33ad: 0x40671a20, 0x33ae: 0x40671c20, 0x33af: 0x40671e20, - 0x33b0: 0x40672020, 0x33b1: 0x40672220, 0x33b2: 0x40672420, 0x33b3: 0x40672620, - 0x33b4: 0x40672820, 0x33b5: 0x40672a20, 0x33b6: 0x40672c20, 0x33b7: 0x40672e20, - 0x33b8: 0x40673020, 0x33b9: 0x40673220, 0x33ba: 0x40673420, 0x33bb: 0x40673620, - 0x33bc: 0x40673820, 0x33bd: 0x40673a20, 0x33be: 0x40673c20, 0x33bf: 0x40673e20, - // Block 0xcf, offset 0x33c0 - 0x33c0: 0x40674020, 0x33c1: 0x40674220, 0x33c2: 0x40674420, 0x33c3: 0x40674620, - 0x33c4: 0x40674820, 0x33c5: 0x40674a20, 0x33c6: 0x40674c20, 0x33c7: 0x40674e20, - 0x33c8: 0x40675020, 0x33c9: 0x40675220, 0x33ca: 0x40675420, 0x33cb: 0x40675620, - 0x33cc: 0x40675820, 0x33cd: 0x40675a20, 0x33ce: 0x40675c20, 0x33cf: 0x40675e20, - 0x33d0: 0x40676020, 0x33d1: 0x40676220, 0x33d2: 0x40676420, 0x33d3: 0x40676620, - 0x33d4: 0x40676820, 0x33d5: 0x40676a20, 0x33d6: 0x40676c20, 0x33d7: 0x40676e20, - 0x33d8: 0x40677020, 0x33d9: 0x40677220, 0x33da: 0x40677420, 0x33db: 0x40677620, - 0x33dc: 0x40677820, 0x33dd: 0x40677a20, 0x33de: 0x40677c20, 0x33df: 0x40677e20, - 0x33e0: 0x40678020, 0x33e1: 0x40678220, 0x33e2: 0x40678420, 0x33e3: 0x40678620, - 0x33e4: 0x40678820, 0x33e5: 0x40678a20, 0x33e6: 0x40678c20, 0x33e7: 0x40678e20, - 0x33e8: 0x40679020, 0x33e9: 0x40679220, 0x33ea: 0x40679420, 0x33eb: 0x40679620, - 0x33ec: 0x40679820, 0x33ed: 0x40679a20, 0x33ee: 0x40679c20, 0x33ef: 0x40679e20, - 0x33f0: 0x4067a020, 0x33f1: 0x4067a220, 0x33f2: 0x4067a420, 0x33f3: 0x4067a620, - 0x33f4: 0x4067a820, 0x33f5: 0x4067aa20, 0x33f6: 0x4067ac20, 0x33f7: 0x4067ae20, - 0x33f8: 0x4067b020, 0x33f9: 0x4067b220, 0x33fa: 0x4067b420, 0x33fb: 0x4067b620, - 0x33fc: 0x4067b820, 0x33fd: 0x4067ba20, 0x33fe: 0x4067bc20, 0x33ff: 0x4067be20, - // Block 0xd0, offset 0x3400 - 0x3400: 0x4067c020, 0x3401: 0x4067c220, 0x3402: 0x4067c420, 0x3403: 0x4067c620, - 0x3404: 0x4067c820, 0x3405: 0x4067ca20, 0x3406: 0x4067cc20, 0x3407: 0x4067ce20, - 0x3408: 0x4067d020, 0x3409: 0x4067d220, 0x340a: 0x4067d420, 0x340b: 0x4067d620, - 0x340c: 0x4067d820, 0x340d: 0x4067da20, 0x340e: 0x4067dc20, 0x340f: 0x4067de20, - 0x3410: 0x4067e020, 0x3411: 0x4067e220, 0x3412: 0x4067e420, 0x3413: 0x4067e620, - 0x3414: 0x4067e820, 0x3415: 0x4067ea20, 0x3416: 0x4067ec20, 0x3417: 0x4067ee20, - 0x3418: 0x4067f020, 0x3419: 0x4067f220, 0x341a: 0x4067f420, 0x341b: 0x4067f620, - 0x341c: 0x4067f820, 0x341d: 0x4067fa20, 0x341e: 0x4067fc20, 0x341f: 0x4067fe20, - 0x3420: 0x40680020, 0x3421: 0x40680220, 0x3422: 0x40680420, 0x3423: 0x40680620, - 0x3424: 0x40680820, 0x3425: 0x40680a20, 0x3426: 0x40680c20, 0x3427: 0x40680e20, - 0x3428: 0x40681020, 0x3429: 0x40681220, 0x342a: 0x40681420, 0x342b: 0x40681620, - 0x342c: 0x40681820, 0x342d: 0x40681a20, 0x342e: 0x40681c20, 0x342f: 0x40681e20, - 0x3430: 0x40682020, 0x3431: 0x40682220, 0x3432: 0x40682420, 0x3433: 0x40682620, - 0x3434: 0x40682820, 0x3435: 0x40682a20, 0x3436: 0x40682c20, 0x3437: 0x40682e20, - 0x3438: 0x40683020, 0x3439: 0x40683220, 0x343a: 0x40683420, 0x343b: 0x40683620, - 0x343c: 0x40683820, 0x343d: 0x40683a20, 0x343e: 0x40683c20, 0x343f: 0x40683e20, - // Block 0xd1, offset 0x3440 - 0x3440: 0x40684020, 0x3441: 0x40684220, 0x3442: 0x40684420, 0x3443: 0x40684620, - 0x3444: 0x40684820, 0x3445: 0x40684a20, 0x3446: 0x40684c20, 0x3447: 0x40684e20, - 0x3448: 0x40685020, 0x3449: 0x40685220, 0x344a: 0x40685420, 0x344b: 0x40685620, - 0x344c: 0x40685820, 0x344d: 0x40685a20, 0x344e: 0x40685c20, 0x344f: 0x40685e20, - 0x3450: 0x40686020, 0x3451: 0x40686220, 0x3452: 0x40686420, 0x3453: 0x40686620, - 0x3454: 0x40686820, 0x3455: 0x40686a20, 0x3456: 0x40686c20, 0x3457: 0x40686e20, - 0x3458: 0x40687020, 0x3459: 0x40687220, 0x345a: 0x40687420, 0x345b: 0x40687620, - 0x345c: 0x40687820, 0x345d: 0x40687a20, 0x345e: 0x40687c20, 0x345f: 0x40687e20, - 0x3460: 0x40688020, 0x3461: 0x40688220, 0x3462: 0x40688420, 0x3463: 0x40688620, - 0x3464: 0x40688820, 0x3465: 0x40688a20, 0x3466: 0x40688c20, 0x3467: 0x40688e20, - 0x3468: 0x40689020, 0x3469: 0x40689220, 0x346a: 0x40689420, 0x346b: 0x40689620, - 0x346c: 0x40689820, 0x346d: 0x40689a20, 0x346e: 0x40689c20, 0x346f: 0x40689e20, - 0x3470: 0x4068a020, 0x3471: 0x4068a220, 0x3472: 0x4068a420, 0x3473: 0x4068a620, - 0x3474: 0x4068a820, 0x3475: 0x4068aa20, 0x3476: 0x4068ac20, 0x3477: 0x4068ae20, - 0x3478: 0x4068b020, 0x3479: 0x4068b220, 0x347a: 0x4068b420, 0x347b: 0x4068b620, - 0x347c: 0x4068b820, 0x347d: 0x4068ba20, 0x347e: 0x4068bc20, 0x347f: 0x4068be20, - // Block 0xd2, offset 0x3480 - 0x3480: 0x4068c020, 0x3481: 0x4068c220, 0x3482: 0x4068c420, 0x3483: 0x4068c620, - 0x3484: 0x4068c820, 0x3485: 0x4068ca20, 0x3486: 0x4068cc20, 0x3487: 0x4068ce20, - 0x3488: 0x4068d020, 0x3489: 0x4068d220, 0x348a: 0x4068d420, 0x348b: 0x4068d620, - 0x348c: 0x4068d820, 0x348d: 0x4068da20, 0x348e: 0x4068dc20, 0x348f: 0x4068de20, - 0x3490: 0x4068e020, 0x3491: 0x4068e220, 0x3492: 0x4068e420, 0x3493: 0x4068e620, - 0x3494: 0x4068e820, 0x3495: 0x4068ea20, 0x3496: 0x4068ec20, 0x3497: 0x4068ee20, - 0x3498: 0x4068f020, 0x3499: 0x4068f220, 0x349a: 0x4068f420, 0x349b: 0x4068f620, - 0x349c: 0x4068f820, 0x349d: 0x4068fa20, 0x349e: 0x4068fc20, 0x349f: 0x4068fe20, - 0x34a0: 0x40690020, 0x34a1: 0x40690220, 0x34a2: 0x40690420, 0x34a3: 0x40690620, - 0x34a4: 0x40690820, 0x34a5: 0x40690a20, 0x34a6: 0x40690c20, 0x34a7: 0x40690e20, - 0x34a8: 0x40691020, 0x34a9: 0x40691220, 0x34aa: 0x40691420, 0x34ab: 0x40691620, - 0x34ac: 0x40691820, 0x34ad: 0x40691a20, 0x34ae: 0x40691c20, 0x34af: 0x40691e20, - 0x34b0: 0x40692020, 0x34b1: 0x40692220, 0x34b2: 0x40692420, 0x34b3: 0x40692620, - 0x34b4: 0x40692820, 0x34b5: 0x40692a20, 0x34b6: 0x40692c20, 0x34b7: 0x40692e20, - 0x34b8: 0x40693020, 0x34b9: 0x40693220, 0x34ba: 0x40693420, 0x34bb: 0x40693620, - 0x34bc: 0x40693820, 0x34bd: 0x40693a20, 0x34be: 0x40693c20, 0x34bf: 0x40693e20, - // Block 0xd3, offset 0x34c0 - 0x34c0: 0x40694020, 0x34c1: 0x40694220, 0x34c2: 0x40694420, 0x34c3: 0x40694620, - 0x34c4: 0x40694820, 0x34c5: 0x40694a20, 0x34c6: 0x40694c20, 0x34c7: 0x40694e20, - 0x34c8: 0x40695020, 0x34c9: 0x40695220, 0x34ca: 0x40695420, 0x34cb: 0x40695620, - 0x34cc: 0x40695820, 0x34cd: 0x40695a20, 0x34ce: 0x40695c20, 0x34cf: 0x40695e20, - 0x34d0: 0x40696020, 0x34d1: 0x40696220, 0x34d2: 0x40696420, 0x34d3: 0x40696620, - 0x34d4: 0x40696820, 0x34d5: 0x40696a20, 0x34d6: 0x40696c20, 0x34d7: 0x40696e20, - 0x34d8: 0x40697020, 0x34d9: 0x40697220, 0x34da: 0x40697420, 0x34db: 0x40697620, - 0x34dc: 0x40697820, 0x34dd: 0x40697a20, 0x34de: 0x40697c20, 0x34df: 0x40697e20, - 0x34e0: 0x40698020, 0x34e1: 0x40698220, 0x34e2: 0x40698420, 0x34e3: 0x40698620, - 0x34e4: 0x40698820, 0x34e5: 0x40698a20, 0x34e6: 0x40698c20, 0x34e7: 0x40698e20, - 0x34e8: 0x40699020, 0x34e9: 0x40699220, 0x34ea: 0x40699420, 0x34eb: 0x40699620, - 0x34ec: 0x40699820, 0x34ed: 0x40699a20, 0x34ee: 0x40699c20, 0x34ef: 0x40699e20, - 0x34f0: 0x4069a020, 0x34f1: 0x4069a220, 0x34f2: 0x4069a420, 0x34f3: 0x4069a620, - 0x34f4: 0x4069a820, 0x34f5: 0x4069aa20, 0x34f6: 0x4069ac20, 0x34f7: 0x4069ae20, - 0x34f8: 0x4069b020, 0x34f9: 0x4069b220, 0x34fa: 0x4069b420, 0x34fb: 0x4069b620, - 0x34fc: 0x4069b820, 0x34fd: 0x4069ba20, 0x34fe: 0x4069bc20, 0x34ff: 0x4069be20, - // Block 0xd4, offset 0x3500 - 0x3500: 0x4069c020, 0x3501: 0x4069c220, 0x3502: 0x4069c420, 0x3503: 0x4069c620, - 0x3504: 0x4069c820, 0x3505: 0x4069ca20, 0x3506: 0x4069cc20, 0x3507: 0x4069ce20, - 0x3508: 0x4069d020, 0x3509: 0x4069d220, 0x350a: 0x4069d420, 0x350b: 0x4069d620, - 0x350c: 0x4069d820, 0x350d: 0x4069da20, 0x350e: 0x4069dc20, 0x350f: 0x4069de20, - 0x3510: 0x4069e020, 0x3511: 0x4069e220, 0x3512: 0x4069e420, 0x3513: 0x4069e620, - 0x3514: 0x4069e820, 0x3515: 0x4069ea20, 0x3516: 0x4069ec20, 0x3517: 0x4069ee20, - 0x3518: 0x4069f020, 0x3519: 0x4069f220, 0x351a: 0x4069f420, 0x351b: 0x4069f620, - 0x351c: 0x4069f820, 0x351d: 0x4069fa20, 0x351e: 0x4069fc20, 0x351f: 0x4069fe20, - 0x3520: 0x406a0020, 0x3521: 0x406a0220, 0x3522: 0x406a0420, 0x3523: 0x406a0620, - 0x3524: 0x406a0820, 0x3525: 0x406a0a20, 0x3526: 0x406a0c20, 0x3527: 0x406a0e20, - 0x3528: 0x406a1020, 0x3529: 0x406a1220, 0x352a: 0x406a1420, 0x352b: 0x406a1620, - 0x352c: 0x406a1820, 0x352d: 0x406a1a20, 0x352e: 0x406a1c20, 0x352f: 0x406a1e20, - 0x3530: 0x406a2020, 0x3531: 0x406a2220, 0x3532: 0x406a2420, 0x3533: 0x406a2620, - 0x3534: 0x406a2820, 0x3535: 0x406a2a20, 0x3536: 0x406a2c20, 0x3537: 0x406a2e20, - 0x3538: 0x406a3020, 0x3539: 0x406a3220, 0x353a: 0x406a3420, 0x353b: 0x406a3620, - 0x353c: 0x406a3820, 0x353d: 0x406a3a20, 0x353e: 0x406a3c20, 0x353f: 0x406a3e20, - // Block 0xd5, offset 0x3540 - 0x3540: 0x406a4020, 0x3541: 0x406a4220, 0x3542: 0x406a4420, 0x3543: 0x406a4620, - 0x3544: 0x406a4820, 0x3545: 0x406a4a20, 0x3546: 0x406a4c20, 0x3547: 0x406a4e20, - 0x3548: 0x406a5020, 0x3549: 0x406a5220, 0x354a: 0x406a5420, 0x354b: 0x406a5620, - 0x354c: 0x406a5820, 0x354d: 0x406a5a20, 0x354e: 0x406a5c20, 0x354f: 0x406a5e20, - 0x3550: 0x406a6020, 0x3551: 0x406a6220, 0x3552: 0x406a6420, 0x3553: 0x406a6620, - 0x3554: 0x406a6820, 0x3555: 0x406a6a20, 0x3556: 0x406a6c20, 0x3557: 0x406a6e20, - 0x3558: 0x406a7020, 0x3559: 0x406a7220, 0x355a: 0x406a7420, 0x355b: 0x406a7620, - 0x355c: 0x406a7820, 0x355d: 0x406a7a20, 0x355e: 0x406a7c20, 0x355f: 0x406a7e20, - 0x3560: 0x406a8020, 0x3561: 0x406a8220, 0x3562: 0x406a8420, 0x3563: 0x406a8620, - 0x3564: 0x406a8820, 0x3565: 0x406a8a20, 0x3566: 0x406a8c20, 0x3567: 0x406a8e20, - 0x3568: 0x406a9020, 0x3569: 0x406a9220, 0x356a: 0x406a9420, 0x356b: 0x406a9620, - 0x356c: 0x406a9820, 0x356d: 0x406a9a20, 0x356e: 0x406a9c20, 0x356f: 0x406a9e20, - 0x3570: 0x406aa020, 0x3571: 0x406aa220, 0x3572: 0x406aa420, 0x3573: 0x406aa620, - 0x3574: 0x406aa820, 0x3575: 0x406aaa20, 0x3576: 0x406aac20, 0x3577: 0x406aae20, - 0x3578: 0x406ab020, 0x3579: 0x406ab220, 0x357a: 0x406ab420, 0x357b: 0x406ab620, - 0x357c: 0x406ab820, 0x357d: 0x406aba20, 0x357e: 0x406abc20, 0x357f: 0x406abe20, - // Block 0xd6, offset 0x3580 - 0x3580: 0x406ac020, 0x3581: 0x406ac220, 0x3582: 0x406ac420, 0x3583: 0x406ac620, - 0x3584: 0x406ac820, 0x3585: 0x406aca20, 0x3586: 0x406acc20, 0x3587: 0x406ace20, - 0x3588: 0x406ad020, 0x3589: 0x406ad220, 0x358a: 0x406ad420, 0x358b: 0x406ad620, - 0x358c: 0x406ad820, 0x358d: 0x406ada20, 0x358e: 0x406adc20, 0x358f: 0x406ade20, - 0x3590: 0x406ae020, 0x3591: 0x406ae220, 0x3592: 0x406ae420, 0x3593: 0x406ae620, - 0x3594: 0x406ae820, 0x3595: 0x406aea20, 0x3596: 0x406aec20, 0x3597: 0x406aee20, - 0x3598: 0x406af020, 0x3599: 0x406af220, 0x359a: 0x406af420, 0x359b: 0x406af620, - 0x359c: 0x406af820, 0x359d: 0x406afa20, 0x359e: 0x406afc20, 0x359f: 0x406afe20, - 0x35a0: 0x406b0020, 0x35a1: 0x406b0220, 0x35a2: 0x406b0420, 0x35a3: 0x406b0620, - 0x35a4: 0x406b0820, 0x35a5: 0x406b0a20, 0x35a6: 0x406b0c20, 0x35a7: 0x406b0e20, - 0x35a8: 0x406b1020, 0x35a9: 0x406b1220, 0x35aa: 0x406b1420, 0x35ab: 0x406b1620, - 0x35ac: 0x406b1820, 0x35ad: 0x406b1a20, 0x35ae: 0x406b1c20, 0x35af: 0x406b1e20, - 0x35b0: 0x406b2020, 0x35b1: 0x406b2220, 0x35b2: 0x406b2420, 0x35b3: 0x406b2620, - 0x35b4: 0x406b2820, 0x35b5: 0x406b2a20, 0x35b6: 0x406b2c20, 0x35b7: 0x406b2e20, - 0x35b8: 0x406b3020, 0x35b9: 0x406b3220, 0x35ba: 0x406b3420, 0x35bb: 0x406b3620, - 0x35bc: 0x406b3820, 0x35bd: 0x406b3a20, 0x35be: 0x406b3c20, 0x35bf: 0x406b3e20, - // Block 0xd7, offset 0x35c0 - 0x35c0: 0x406b4020, 0x35c1: 0x406b4220, 0x35c2: 0x406b4420, 0x35c3: 0x406b4620, - 0x35c4: 0x406b4820, 0x35c5: 0x406b4a20, 0x35c6: 0x406b4c20, 0x35c7: 0x406b4e20, - 0x35c8: 0x406b5020, 0x35c9: 0x406b5220, 0x35ca: 0x406b5420, 0x35cb: 0x406b5620, - 0x35cc: 0x406b5820, 0x35cd: 0x406b5a20, 0x35ce: 0x406b5c20, 0x35cf: 0x406b5e20, - 0x35d0: 0x406b6020, 0x35d1: 0x406b6220, 0x35d2: 0x406b6420, 0x35d3: 0x406b6620, - 0x35d4: 0x406b6820, 0x35d5: 0x406b6a20, 0x35d6: 0x406b6c20, 0x35d7: 0x406b6e20, - 0x35d8: 0x406b7020, 0x35d9: 0x406b7220, 0x35da: 0x406b7420, 0x35db: 0x406b7620, - 0x35dc: 0x406b7820, 0x35dd: 0x406b7a20, 0x35de: 0x406b7c20, 0x35df: 0x406b7e20, - 0x35e0: 0x406b8020, 0x35e1: 0x406b8220, 0x35e2: 0x406b8420, 0x35e3: 0x406b8620, - 0x35e4: 0x406b8820, 0x35e5: 0x406b8a20, 0x35e6: 0x406b8c20, 0x35e7: 0x406b8e20, - 0x35e8: 0x406b9020, 0x35e9: 0x406b9220, 0x35ea: 0x406b9420, 0x35eb: 0x406b9620, - 0x35ec: 0x406b9820, 0x35ed: 0x406b9a20, 0x35ee: 0x406b9c20, 0x35ef: 0x406b9e20, - 0x35f0: 0x406ba020, 0x35f1: 0x406ba220, 0x35f2: 0x406ba420, 0x35f3: 0x406ba620, - 0x35f4: 0x406ba820, 0x35f5: 0x406baa20, 0x35f6: 0x406bac20, 0x35f7: 0x406bae20, - 0x35f8: 0x406bb020, 0x35f9: 0x406bb220, 0x35fa: 0x406bb420, 0x35fb: 0x406bb620, - 0x35fc: 0x406bb820, 0x35fd: 0x406bba20, 0x35fe: 0x406bbc20, 0x35ff: 0x406bbe20, - // Block 0xd8, offset 0x3600 - 0x3600: 0x406bc020, 0x3601: 0x406bc220, 0x3602: 0x406bc420, 0x3603: 0x406bc620, - 0x3604: 0x406bc820, 0x3605: 0x406bca20, 0x3606: 0x406bcc20, 0x3607: 0x406bce20, - 0x3608: 0x406bd020, 0x3609: 0x406bd220, 0x360a: 0x406bd420, 0x360b: 0x406bd620, - 0x360c: 0x406bd820, 0x360d: 0x406bda20, 0x360e: 0x406bdc20, 0x360f: 0x406bde20, - 0x3610: 0x406be020, 0x3611: 0x406be220, 0x3612: 0x406be420, 0x3613: 0x406be620, - 0x3614: 0x406be820, 0x3615: 0x406bea20, 0x3616: 0x406bec20, 0x3617: 0x406bee20, - 0x3618: 0x406bf020, 0x3619: 0x406bf220, 0x361a: 0x406bf420, 0x361b: 0x406bf620, - 0x361c: 0x406bf820, 0x361d: 0x406bfa20, 0x361e: 0x406bfc20, 0x361f: 0x406bfe20, - 0x3620: 0x406c0020, 0x3621: 0x406c0220, 0x3622: 0x406c0420, 0x3623: 0x406c0620, - 0x3624: 0x406c0820, 0x3625: 0x406c0a20, 0x3626: 0x406c0c20, 0x3627: 0x406c0e20, - 0x3628: 0x406c1020, 0x3629: 0x406c1220, 0x362a: 0x406c1420, 0x362b: 0x406c1620, - 0x362c: 0x406c1820, 0x362d: 0x406c1a20, 0x362e: 0x406c1c20, 0x362f: 0x406c1e20, - 0x3630: 0x406c2020, 0x3631: 0x406c2220, 0x3632: 0x406c2420, 0x3633: 0x406c2620, - 0x3634: 0x406c2820, 0x3635: 0x406c2a20, 0x3636: 0x406c2c20, 0x3637: 0x406c2e20, - 0x3638: 0x406c3020, 0x3639: 0x406c3220, 0x363a: 0x406c3420, 0x363b: 0x406c3620, - 0x363c: 0x406c3820, 0x363d: 0x406c3a20, 0x363e: 0x406c3c20, 0x363f: 0x406c3e20, - // Block 0xd9, offset 0x3640 - 0x3640: 0x406c4020, 0x3641: 0x406c4220, 0x3642: 0x406c4420, 0x3643: 0x406c4620, - 0x3644: 0x406c4820, 0x3645: 0x406c4a20, 0x3646: 0x406c4c20, 0x3647: 0x406c4e20, - 0x3648: 0x406c5020, 0x3649: 0x406c5220, 0x364a: 0x406c5420, 0x364b: 0x406c5620, - 0x364c: 0x406c5820, 0x364d: 0x406c5a20, 0x364e: 0x406c5c20, 0x364f: 0x406c5e20, - 0x3650: 0x406c6020, 0x3651: 0x406c6220, 0x3652: 0x406c6420, 0x3653: 0x406c6620, - 0x3654: 0x406c6820, 0x3655: 0x406c6a20, 0x3656: 0x406c6c20, 0x3657: 0x406c6e20, - 0x3658: 0x406c7020, 0x3659: 0x406c7220, 0x365a: 0x406c7420, 0x365b: 0x406c7620, - 0x365c: 0x406c7820, 0x365d: 0x406c7a20, 0x365e: 0x406c7c20, 0x365f: 0x406c7e20, - 0x3660: 0x406c8020, 0x3661: 0x406c8220, 0x3662: 0x406c8420, 0x3663: 0x406c8620, - 0x3664: 0x406c8820, 0x3665: 0x406c8a20, 0x3666: 0x406c8c20, 0x3667: 0x406c8e20, - 0x3668: 0x406c9020, 0x3669: 0x406c9220, 0x366a: 0x406c9420, 0x366b: 0x406c9620, - 0x366c: 0x406c9820, 0x366d: 0x406c9a20, 0x366e: 0x406c9c20, 0x366f: 0x406c9e20, - 0x3670: 0x406ca020, 0x3671: 0x406ca220, 0x3672: 0x406ca420, 0x3673: 0x406ca620, - 0x3674: 0x406ca820, 0x3675: 0x406caa20, 0x3676: 0x406cac20, 0x3677: 0x406cae20, - 0x3678: 0x406cb020, 0x3679: 0x406cb220, 0x367a: 0x406cb420, 0x367b: 0x406cb620, - 0x367c: 0x406cb820, 0x367d: 0x406cba20, 0x367e: 0x406cbc20, 0x367f: 0x406cbe20, - // Block 0xda, offset 0x3680 - 0x3680: 0x406cc020, 0x3681: 0x406cc220, 0x3682: 0x406cc420, 0x3683: 0x406cc620, - 0x3684: 0x406cc820, 0x3685: 0x406cca20, 0x3686: 0x406ccc20, 0x3687: 0x406cce20, - 0x3688: 0x406cd020, 0x3689: 0x406cd220, 0x368a: 0x406cd420, 0x368b: 0x406cd620, - 0x368c: 0x406cd820, 0x368d: 0x406cda20, 0x368e: 0x406cdc20, 0x368f: 0x406cde20, - 0x3690: 0x406ce020, 0x3691: 0x406ce220, 0x3692: 0x406ce420, 0x3693: 0x406ce620, - 0x3694: 0x406ce820, 0x3695: 0x406cea20, 0x3696: 0x406cec20, 0x3697: 0x406cee20, - 0x3698: 0x406cf020, 0x3699: 0x406cf220, 0x369a: 0x406cf420, 0x369b: 0x406cf620, - 0x369c: 0x406cf820, 0x369d: 0x406cfa20, 0x369e: 0x406cfc20, 0x369f: 0x406cfe20, - 0x36a0: 0x406d0020, 0x36a1: 0x406d0220, 0x36a2: 0x406d0420, 0x36a3: 0x406d0620, - 0x36a4: 0x406d0820, 0x36a5: 0x406d0a20, 0x36a6: 0x406d0c20, 0x36a7: 0x406d0e20, - 0x36a8: 0x406d1020, 0x36a9: 0x406d1220, 0x36aa: 0x406d1420, 0x36ab: 0x406d1620, - 0x36ac: 0x406d1820, 0x36ad: 0x406d1a20, 0x36ae: 0x406d1c20, 0x36af: 0x406d1e20, - 0x36b0: 0x406d2020, 0x36b1: 0x406d2220, 0x36b2: 0x406d2420, 0x36b3: 0x406d2620, - 0x36b4: 0x406d2820, 0x36b5: 0x406d2a20, 0x36b6: 0x406d2c20, 0x36b7: 0x406d2e20, - 0x36b8: 0x406d3020, 0x36b9: 0x406d3220, 0x36ba: 0x406d3420, 0x36bb: 0x406d3620, - 0x36bc: 0x406d3820, 0x36bd: 0x406d3a20, 0x36be: 0x406d3c20, 0x36bf: 0x406d3e20, - // Block 0xdb, offset 0x36c0 - 0x36c0: 0x406d4020, 0x36c1: 0x406d4220, 0x36c2: 0x406d4420, 0x36c3: 0x406d4620, - 0x36c4: 0x406d4820, 0x36c5: 0x406d4a20, 0x36c6: 0x406d4c20, 0x36c7: 0x406d4e20, - 0x36c8: 0x406d5020, 0x36c9: 0x406d5220, 0x36ca: 0x406d5420, 0x36cb: 0x406d5620, - 0x36cc: 0x406d5820, 0x36cd: 0x406d5a20, 0x36ce: 0x406d5c20, 0x36cf: 0x406d5e20, - 0x36d0: 0x406d6020, 0x36d1: 0x406d6220, 0x36d2: 0x406d6420, 0x36d3: 0x406d6620, - 0x36d4: 0x406d6820, 0x36d5: 0x406d6a20, 0x36d6: 0x406d6c20, 0x36d7: 0x406d6e20, - 0x36d8: 0x406d7020, 0x36d9: 0x406d7220, 0x36da: 0x406d7420, 0x36db: 0x406d7620, - 0x36dc: 0x406d7820, 0x36dd: 0x406d7a20, 0x36de: 0x406d7c20, 0x36df: 0x406d7e20, - 0x36e0: 0x406d8020, 0x36e1: 0x406d8220, 0x36e2: 0x406d8420, 0x36e3: 0x406d8620, - 0x36e4: 0x406d8820, 0x36e5: 0x406d8a20, 0x36e6: 0x406d8c20, 0x36e7: 0x406d8e20, - 0x36e8: 0x406d9020, 0x36e9: 0x406d9220, 0x36ea: 0x406d9420, 0x36eb: 0x406d9620, - 0x36ec: 0x406d9820, 0x36ed: 0x406d9a20, 0x36ee: 0x406d9c20, 0x36ef: 0x406d9e20, - 0x36f0: 0x406da020, 0x36f1: 0x406da220, 0x36f2: 0x406da420, 0x36f3: 0x406da620, - 0x36f4: 0x406da820, 0x36f5: 0x406daa20, 0x36f6: 0x406dac20, 0x36f7: 0x406dae20, - 0x36f8: 0x406db020, 0x36f9: 0x406db220, 0x36fa: 0x406db420, 0x36fb: 0x406db620, - 0x36fc: 0x406db820, 0x36fd: 0x406dba20, 0x36fe: 0x406dbc20, 0x36ff: 0x406dbe20, - // Block 0xdc, offset 0x3700 - 0x3700: 0x406dc020, 0x3701: 0x406dc220, 0x3702: 0x406dc420, 0x3703: 0x406dc620, - 0x3704: 0x406dc820, 0x3705: 0x406dca20, 0x3706: 0x406dcc20, 0x3707: 0x406dce20, - 0x3708: 0x406dd020, 0x3709: 0x406dd220, 0x370a: 0x406dd420, 0x370b: 0x406dd620, - 0x370c: 0x406dd820, 0x370d: 0x406dda20, 0x370e: 0x406ddc20, 0x370f: 0x406dde20, - 0x3710: 0x406de020, 0x3711: 0x406de220, 0x3712: 0x406de420, 0x3713: 0x406de620, - 0x3714: 0x406de820, 0x3715: 0x406dea20, 0x3716: 0x406dec20, 0x3717: 0x406dee20, - 0x3718: 0x406df020, 0x3719: 0x406df220, 0x371a: 0x406df420, 0x371b: 0x406df620, - 0x371c: 0x406df820, 0x371d: 0x406dfa20, 0x371e: 0x406dfc20, 0x371f: 0x406dfe20, - 0x3720: 0x406e0020, 0x3721: 0x406e0220, 0x3722: 0x406e0420, 0x3723: 0x406e0620, - 0x3724: 0x406e0820, 0x3725: 0x406e0a20, 0x3726: 0x406e0c20, 0x3727: 0x406e0e20, - 0x3728: 0x406e1020, 0x3729: 0x406e1220, 0x372a: 0x406e1420, 0x372b: 0x406e1620, - 0x372c: 0x406e1820, 0x372d: 0x406e1a20, 0x372e: 0x406e1c20, 0x372f: 0x406e1e20, - 0x3730: 0x406e2020, 0x3731: 0x406e2220, 0x3732: 0x406e2420, 0x3733: 0x406e2620, - 0x3734: 0x406e2820, 0x3735: 0x406e2a20, 0x3736: 0x406e2c20, 0x3737: 0x406e2e20, - 0x3738: 0x406e3020, 0x3739: 0x406e3220, 0x373a: 0x406e3420, 0x373b: 0x406e3620, - 0x373c: 0x406e3820, 0x373d: 0x406e3a20, 0x373e: 0x406e3c20, 0x373f: 0x406e3e20, - // Block 0xdd, offset 0x3740 - 0x3740: 0x406e4020, 0x3741: 0x406e4220, 0x3742: 0x406e4420, 0x3743: 0x406e4620, - 0x3744: 0x406e4820, 0x3745: 0x406e4a20, 0x3746: 0x406e4c20, 0x3747: 0x406e4e20, - 0x3748: 0x406e5020, 0x3749: 0x406e5220, 0x374a: 0x406e5420, 0x374b: 0x406e5620, - 0x374c: 0x406e5820, 0x374d: 0x406e5a20, 0x374e: 0x406e5c20, 0x374f: 0x406e5e20, - 0x3750: 0x406e6020, 0x3751: 0x406e6220, 0x3752: 0x406e6420, 0x3753: 0x406e6620, - 0x3754: 0x406e6820, 0x3755: 0x406e6a20, 0x3756: 0x406e6c20, 0x3757: 0x406e6e20, - 0x3758: 0x406e7020, 0x3759: 0x406e7220, 0x375a: 0x406e7420, 0x375b: 0x406e7620, - 0x375c: 0x406e7820, 0x375d: 0x406e7a20, 0x375e: 0x406e7c20, 0x375f: 0x406e7e20, - 0x3760: 0x406e8020, 0x3761: 0x406e8220, 0x3762: 0x406e8420, 0x3763: 0x406e8620, - 0x3764: 0x406e8820, 0x3765: 0x406e8a20, 0x3766: 0x406e8c20, 0x3767: 0x406e8e20, - 0x3768: 0x406e9020, 0x3769: 0x406e9220, 0x376a: 0x406e9420, 0x376b: 0x406e9620, - 0x376c: 0x406e9820, 0x376d: 0x406e9a20, 0x376e: 0x406e9c20, 0x376f: 0x406e9e20, - 0x3770: 0x406ea020, 0x3771: 0x406ea220, 0x3772: 0x406ea420, 0x3773: 0x406ea620, - 0x3774: 0x406ea820, 0x3775: 0x406eaa20, 0x3776: 0x406eac20, 0x3777: 0x406eae20, - 0x3778: 0x406eb020, 0x3779: 0x406eb220, 0x377a: 0x406eb420, 0x377b: 0x406eb620, - 0x377c: 0x406eb820, 0x377d: 0x406eba20, 0x377e: 0x406ebc20, 0x377f: 0x406ebe20, - // Block 0xde, offset 0x3780 - 0x3780: 0x406ec020, 0x3781: 0x406ec220, 0x3782: 0x406ec420, 0x3783: 0x406ec620, - 0x3784: 0x406ec820, 0x3785: 0x406eca20, 0x3786: 0x406ecc20, 0x3787: 0x406ece20, - 0x3788: 0x406ed020, 0x3789: 0x406ed220, 0x378a: 0x406ed420, 0x378b: 0x406ed620, - 0x378c: 0x406ed820, 0x378d: 0x406eda20, 0x378e: 0x406edc20, 0x378f: 0x406ede20, - 0x3790: 0x406ee020, 0x3791: 0x406ee220, 0x3792: 0x406ee420, 0x3793: 0x406ee620, - 0x3794: 0x406ee820, 0x3795: 0x406eea20, 0x3796: 0x406eec20, 0x3797: 0x406eee20, - 0x3798: 0x406ef020, 0x3799: 0x406ef220, 0x379a: 0x406ef420, 0x379b: 0x406ef620, - 0x379c: 0x406ef820, 0x379d: 0x406efa20, 0x379e: 0x406efc20, 0x379f: 0x406efe20, - 0x37a0: 0x406f0020, 0x37a1: 0x406f0220, 0x37a2: 0x406f0420, 0x37a3: 0x406f0620, - 0x37a4: 0x406f0820, 0x37a5: 0x406f0a20, 0x37a6: 0x406f0c20, 0x37a7: 0x406f0e20, - 0x37a8: 0x406f1020, 0x37a9: 0x406f1220, 0x37aa: 0x406f1420, 0x37ab: 0x406f1620, - 0x37ac: 0x406f1820, 0x37ad: 0x406f1a20, 0x37ae: 0x406f1c20, 0x37af: 0x406f1e20, - 0x37b0: 0x406f2020, 0x37b1: 0x406f2220, 0x37b2: 0x406f2420, 0x37b3: 0x406f2620, - 0x37b4: 0x406f2820, 0x37b5: 0x406f2a20, 0x37b6: 0x406f2c20, 0x37b7: 0x406f2e20, - 0x37b8: 0x406f3020, 0x37b9: 0x406f3220, 0x37ba: 0x406f3420, 0x37bb: 0x406f3620, - 0x37bc: 0x406f3820, 0x37bd: 0x406f3a20, 0x37be: 0x406f3c20, 0x37bf: 0x406f3e20, - // Block 0xdf, offset 0x37c0 - 0x37c0: 0x406f4020, 0x37c1: 0x406f4220, 0x37c2: 0x406f4420, 0x37c3: 0x406f4620, - 0x37c4: 0x406f4820, 0x37c5: 0x406f4a20, 0x37c6: 0x406f4c20, 0x37c7: 0x406f4e20, - 0x37c8: 0x406f5020, 0x37c9: 0x406f5220, 0x37ca: 0x406f5420, 0x37cb: 0x406f5620, - 0x37cc: 0x406f5820, - 0x37d0: 0x401a9020, 0x37d1: 0x401a9220, 0x37d2: 0x401a9420, 0x37d3: 0x401a9620, - 0x37d4: 0x401a9820, 0x37d5: 0x401a9a20, 0x37d6: 0x401a9c20, 0x37d7: 0x401a9e20, - 0x37d8: 0x401aa020, 0x37d9: 0x401aa220, 0x37da: 0x401aa420, 0x37db: 0x401aa620, - 0x37dc: 0x401aa820, 0x37dd: 0x401aaa20, 0x37de: 0x401aac20, 0x37df: 0x401aae20, - 0x37e0: 0x401ab020, 0x37e1: 0x401ab220, 0x37e2: 0x401ab420, 0x37e3: 0x401ab620, - 0x37e4: 0x401ab820, 0x37e5: 0x401aba20, 0x37e6: 0x401abc20, 0x37e7: 0x401abe20, - 0x37e8: 0x401ac020, 0x37e9: 0x401ac220, 0x37ea: 0x401ac420, 0x37eb: 0x401ac620, - 0x37ec: 0x401ac820, 0x37ed: 0x401aca20, 0x37ee: 0x401acc20, 0x37ef: 0x401ace20, - 0x37f0: 0x401ad020, 0x37f1: 0x401ad220, 0x37f2: 0x401ad420, 0x37f3: 0x401ad620, - 0x37f4: 0x401ad820, 0x37f5: 0x401ada20, 0x37f6: 0x401adc20, 0x37f7: 0x401ade20, - 0x37f8: 0x401ae020, 0x37f9: 0x401ae220, 0x37fa: 0x401ae420, 0x37fb: 0x401ae620, - 0x37fc: 0x401ae820, 0x37fd: 0x401aea20, 0x37fe: 0x401aec20, 0x37ff: 0x401aee20, - // Block 0xe0, offset 0x3800 - 0x3800: 0x401af020, 0x3801: 0x401af220, 0x3802: 0x401af420, 0x3803: 0x401af620, - 0x3804: 0x401af820, 0x3805: 0x401afa20, 0x3806: 0x401afc20, - 0x3810: 0x406f6620, 0x3811: 0x406f6820, 0x3812: 0x406f6a20, 0x3813: 0x406f6c20, - 0x3814: 0x406f6e20, 0x3815: 0x406f7020, 0x3816: 0x406f7220, 0x3817: 0x406f7420, - 0x3818: 0x406f7620, 0x3819: 0x406f7820, 0x381a: 0x406f7a20, 0x381b: 0x406f7c20, - 0x381c: 0x406f7e20, 0x381d: 0x406f8020, 0x381e: 0x406f8220, 0x381f: 0x406f8420, - 0x3820: 0x406f8620, 0x3821: 0x406f8820, 0x3822: 0x406f8a20, 0x3823: 0x406f8c20, - 0x3824: 0x406f8e20, 0x3825: 0x406f9020, 0x3826: 0x406f9220, 0x3827: 0x406f9420, - 0x3828: 0x406f9620, 0x3829: 0x406f9820, 0x382a: 0x406f9e20, 0x382b: 0x406f9a20, - 0x382c: 0x406fa020, 0x382d: 0x406f9c20, 0x382e: 0x406fa220, 0x382f: 0x406fa420, - 0x3830: 0x406fa620, 0x3831: 0x406fa820, 0x3832: 0x406faa20, 0x3833: 0x406fac20, - 0x3834: 0x406fae20, 0x3835: 0x406fb020, 0x3836: 0x406fb220, 0x3837: 0x406fb420, - 0x3838: 0x406f5a20, 0x3839: 0x406f5c20, 0x383a: 0x406f5e20, 0x383b: 0x406f6020, - 0x383c: 0x406f6420, 0x383d: 0x406f6220, 0x383e: 0x40025620, 0x383f: 0x4002fe20, - // Block 0xe1, offset 0x3840 - 0x3840: 0x405b8020, 0x3841: 0x405b8220, 0x3842: 0x405b8420, 0x3843: 0x405b8620, - 0x3844: 0x405b8820, 0x3845: 0x405b8a20, 0x3846: 0x405b8c20, 0x3847: 0x405b8e20, - 0x3848: 0x405b9020, 0x3849: 0x405b9220, 0x384a: 0x405b9420, 0x384b: 0x405b9620, - 0x384c: 0x405b9820, 0x384d: 0x405b9a20, 0x384e: 0x405b9c20, 0x384f: 0x405b9e20, - 0x3850: 0x405ba020, 0x3851: 0x405ba220, 0x3852: 0x405ba420, 0x3853: 0x405ba620, - 0x3854: 0x405ba820, 0x3855: 0x405baa20, 0x3856: 0x405bac20, 0x3857: 0x405bae20, - 0x3858: 0x405bb020, 0x3859: 0x405bb220, 0x385a: 0x405bb420, 0x385b: 0x405bb620, - 0x385c: 0x405bb820, 0x385d: 0x405bba20, 0x385e: 0x405bbc20, 0x385f: 0x405bbe20, - 0x3860: 0x405bc020, 0x3861: 0x405bc220, 0x3862: 0x405bc420, 0x3863: 0x405bc620, - 0x3864: 0x405bc820, 0x3865: 0x405bca20, 0x3866: 0x405bcc20, 0x3867: 0x405bce20, - 0x3868: 0x405bd020, 0x3869: 0x405bd220, 0x386a: 0x405bd420, 0x386b: 0x405bd620, - 0x386c: 0x405bd820, 0x386d: 0x405bda20, 0x386e: 0x405bdc20, 0x386f: 0x405bde20, - 0x3870: 0x405be020, 0x3871: 0x405be220, 0x3872: 0x405be420, 0x3873: 0x405be620, - 0x3874: 0x405be820, 0x3875: 0x405bea20, 0x3876: 0x405bec20, 0x3877: 0x405bee20, - 0x3878: 0x405bf020, 0x3879: 0x405bf220, 0x387a: 0x405bf420, 0x387b: 0x405bf620, - 0x387c: 0x405bf820, 0x387d: 0x405bfa20, 0x387e: 0x405bfc20, 0x387f: 0x405bfe20, - // Block 0xe2, offset 0x3880 - 0x3880: 0x405c0020, 0x3881: 0x405c0220, 0x3882: 0x405c0420, 0x3883: 0x405c0620, - 0x3884: 0x405c0820, 0x3885: 0x405c0a20, 0x3886: 0x405c0c20, 0x3887: 0x405c0e20, - 0x3888: 0x405c1020, 0x3889: 0x405c1220, 0x388a: 0x405c1420, 0x388b: 0x405c1620, - 0x388c: 0x405c1820, 0x388d: 0x405c1a20, 0x388e: 0x405c1c20, 0x388f: 0x405c1e20, - 0x3890: 0x405c2020, 0x3891: 0x405c2220, 0x3892: 0x405c2420, 0x3893: 0x405c2620, - 0x3894: 0x405c2820, 0x3895: 0x405c2a20, 0x3896: 0x405c2c20, 0x3897: 0x405c2e20, - 0x3898: 0x405c3020, 0x3899: 0x405c3220, 0x389a: 0x405c3420, 0x389b: 0x405c3620, - 0x389c: 0x405c3820, 0x389d: 0x405c3a20, 0x389e: 0x405c3c20, 0x389f: 0x405c3e20, - 0x38a0: 0x405c4020, 0x38a1: 0x405c4220, 0x38a2: 0x405c4420, 0x38a3: 0x405c4620, - 0x38a4: 0x405c4820, 0x38a5: 0x405c4a20, 0x38a6: 0x405c4c20, 0x38a7: 0x405c4e20, - 0x38a8: 0x405c5020, 0x38a9: 0x405c5220, 0x38aa: 0x405c5420, 0x38ab: 0x405c5620, - 0x38ac: 0x405c5820, 0x38ad: 0x405c5a20, 0x38ae: 0x405c5c20, 0x38af: 0x405c5e20, - 0x38b0: 0x405c6020, 0x38b1: 0x405c6220, 0x38b2: 0x405c6420, 0x38b3: 0x405c6620, - 0x38b4: 0x405c6820, 0x38b5: 0x405c6a20, 0x38b6: 0x405c6c20, 0x38b7: 0x405c6e20, - 0x38b8: 0x405c7020, 0x38b9: 0x405c7220, 0x38ba: 0x405c7420, 0x38bb: 0x405c7620, - 0x38bc: 0x405c7820, 0x38bd: 0x405c7a20, 0x38be: 0x405c7c20, 0x38bf: 0x405c7e20, - // Block 0xe3, offset 0x38c0 - 0x38c0: 0x405c8020, 0x38c1: 0x405c8220, 0x38c2: 0x405c8420, 0x38c3: 0x405c8620, - 0x38c4: 0x405c8820, 0x38c5: 0x405c8a20, 0x38c6: 0x405c8c20, 0x38c7: 0x405c8e20, - 0x38c8: 0x405c9020, 0x38c9: 0x405c9220, 0x38ca: 0x405c9420, 0x38cb: 0x405c9620, - 0x38cc: 0x405c9820, 0x38cd: 0x405c9a20, 0x38ce: 0x405c9c20, 0x38cf: 0x405c9e20, - 0x38d0: 0x405ca020, 0x38d1: 0x405ca220, 0x38d2: 0x405ca420, 0x38d3: 0x405ca620, - 0x38d4: 0x405ca820, 0x38d5: 0x405caa20, 0x38d6: 0x405cac20, 0x38d7: 0x405cae20, - 0x38d8: 0x405cb020, 0x38d9: 0x405cb220, 0x38da: 0x405cb420, 0x38db: 0x405cb620, - 0x38dc: 0x405cb820, 0x38dd: 0x405cba20, 0x38de: 0x405cbc20, 0x38df: 0x405cbe20, - 0x38e0: 0x405cc020, 0x38e1: 0x405cc220, 0x38e2: 0x405cc420, 0x38e3: 0x405cc620, - 0x38e4: 0x405cc820, 0x38e5: 0x405cca20, 0x38e6: 0x405ccc20, 0x38e7: 0x405cce20, - 0x38e8: 0x405cd020, 0x38e9: 0x405cd220, 0x38ea: 0x405cd420, 0x38eb: 0x405cd620, - 0x38ec: 0x405cd820, 0x38ed: 0x405cda20, 0x38ee: 0x405cdc20, 0x38ef: 0x405cde20, - 0x38f0: 0x405ce020, 0x38f1: 0x405ce220, 0x38f2: 0x405ce420, 0x38f3: 0x405ce620, - 0x38f4: 0x405ce820, 0x38f5: 0x405cea20, 0x38f6: 0x405cec20, 0x38f7: 0x405cee20, - 0x38f8: 0x405cf020, 0x38f9: 0x405cf220, 0x38fa: 0x405cf420, 0x38fb: 0x405cf620, - 0x38fc: 0x405cf820, 0x38fd: 0x405cfa20, 0x38fe: 0x405cfc20, 0x38ff: 0x405cfe20, - // Block 0xe4, offset 0x3900 - 0x3900: 0x405d0020, 0x3901: 0x405d0220, 0x3902: 0x405d0420, 0x3903: 0x405d0620, - 0x3904: 0x405d0820, 0x3905: 0x405d0a20, 0x3906: 0x405d0c20, 0x3907: 0x405d0e20, - 0x3908: 0x405d1020, 0x3909: 0x405d1220, 0x390a: 0x405d1420, 0x390b: 0x405d1620, - 0x390c: 0x405d1820, 0x390d: 0x405d1a20, 0x390e: 0x405d1c20, 0x390f: 0x405d1e20, - 0x3910: 0x405d2020, 0x3911: 0x405d2220, 0x3912: 0x405d2420, 0x3913: 0x405d2620, - 0x3914: 0x405d2820, 0x3915: 0x405d2a20, 0x3916: 0x405d2c20, 0x3917: 0x405d2e20, - 0x3918: 0x405d3020, 0x3919: 0x405d3220, 0x391a: 0x405d3420, 0x391b: 0x405d3620, - 0x391c: 0x405d3820, 0x391d: 0x405d3a20, 0x391e: 0x405d3c20, 0x391f: 0x405d3e20, - 0x3920: 0x405d4020, 0x3921: 0x405d4220, 0x3922: 0x405d4420, 0x3923: 0x405d4620, - 0x3924: 0x405d4820, 0x3925: 0x405d4a20, 0x3926: 0x405d4c20, 0x3927: 0x405d4e20, - 0x3928: 0x405d5020, 0x3929: 0x405d5220, 0x392a: 0x405d5420, 0x392b: 0x405d5620, - 0x392c: 0x405d5820, 0x392d: 0x405d5a20, 0x392e: 0x405d5c20, 0x392f: 0x405d5e20, - 0x3930: 0x405d6020, 0x3931: 0x405d6220, 0x3932: 0x405d6420, 0x3933: 0x405d6620, - 0x3934: 0x405d6820, 0x3935: 0x405d6a20, 0x3936: 0x405d6c20, 0x3937: 0x405d6e20, - 0x3938: 0x405d7020, 0x3939: 0x405d7220, 0x393a: 0x405d7420, 0x393b: 0x405d7620, - 0x393c: 0x405d7820, 0x393d: 0x405d7a20, 0x393e: 0x405d7c20, 0x393f: 0x405d7e20, - // Block 0xe5, offset 0x3940 - 0x3940: 0x405d8020, 0x3941: 0x405d8220, 0x3942: 0x405d8420, 0x3943: 0x405d8620, - 0x3944: 0x405d8820, 0x3945: 0x405d8a20, 0x3946: 0x405d8c20, 0x3947: 0x405d8e20, - 0x3948: 0x405d9020, 0x3949: 0x405d9220, 0x394a: 0x405d9420, 0x394b: 0x405d9620, - 0x394c: 0x405d9820, 0x394d: 0x40025820, 0x394e: 0x40030020, 0x394f: 0x4002d820, - 0x3950: 0x005c3084, 0x3951: 0x005c5484, 0x3952: 0x005c8e84, 0x3953: 0xe00020fb, - 0x3954: 0xe00020fe, 0x3955: 0xe0002101, 0x3956: 0xe0002104, 0x3957: 0xe0002107, - 0x3958: 0xe000210a, 0x3959: 0xe000210d, 0x395a: 0xe0002110, 0x395b: 0xe0002113, - 0x395c: 0xe0002116, 0x395d: 0xe0002119, 0x395e: 0xe000211c, 0x395f: 0xe000211f, - 0x3960: 0xe00001cd, 0x3961: 0xe0000261, 0x3962: 0xe0000379, 0x3963: 0xe0000453, - 0x3964: 0xe0000528, 0x3965: 0xe00005f2, 0x3966: 0xe00006bd, 0x3967: 0xe0000765, - 0x3968: 0xe0000811, 0x3969: 0xe00008b6, 0x396a: 0x005c5c84, 0x396b: 0x005d2284, - // Block 0xe6, offset 0x3980 - 0x3980: 0x0033ec88, 0x3981: 0x4033ec20, 0x3982: 0x0033fa88, 0x3983: 0x4033fa20, - 0x3984: 0x00340488, 0x3985: 0x40340420, 0x3986: 0x00343488, 0x3987: 0x40343420, - 0x3988: 0x00344e88, 0x3989: 0x40344e20, 0x398a: 0x0035a288, 0x398b: 0x4035a220, - 0x398c: 0x0035f088, 0x398d: 0x4035f020, 0x398e: 0x00366e88, 0x398f: 0x40366e20, - 0x3990: 0x00367c88, 0x3991: 0x40367c20, 0x3992: 0x0036a688, 0x3993: 0x4036a620, - 0x3994: 0x0036c088, 0x3995: 0x4036c020, 0x3996: 0x0036c288, 0x3997: 0x4036c220, - 0x3998: 0x0036de88, 0x3999: 0x4036de20, 0x399a: 0x0036e888, 0x399b: 0x4036e820, - 0x399c: 0x0036f288, 0x399d: 0x4036f220, 0x399e: 0x00372488, 0x399f: 0x40372420, - 0x39a0: 0x00360a88, 0x39a1: 0x40360a20, 0x39a2: 0x00339e88, 0x39a3: 0x40339e20, - 0x39a4: 0x0034a288, 0x39a5: 0x4034a220, 0x39a6: 0x0034b888, 0x39a7: 0x4034b820, - 0x39a8: 0x0034ee8a, 0x39a9: 0x0034ee84, 0x39aa: 0x0034ee8a, 0x39ab: 0x0034ee84, - 0x39ac: 0x0034ee8a, 0x39ad: 0x0034ee84, 0x39ae: 0x0034ee84, 0x39af: 0xae608402, - 0x39b0: 0xa0000000, 0x39b1: 0xa0000000, 0x39b2: 0xa0000000, 0x39b3: 0x4004e020, - 0x39b4: 0x84e619e1, 0x39b5: 0x84e61a0a, 0x39b6: 0x84e61a1b, 0x39b7: 0x84e61ab9, - 0x39b8: 0x84e61b3a, 0x39b9: 0x84e61b3f, 0x39ba: 0x84e61b47, 0x39bb: 0x84e61af0, - 0x39bc: 0xae605f02, 0x39bd: 0xae605f02, 0x39be: 0x40054c20, 0x39bf: 0x40367220, - // Block 0xe7, offset 0x39c0 - 0x39c0: 0x00339488, 0x39c1: 0x40339420, 0x39c2: 0x00341288, 0x39c3: 0x40341220, - 0x39c4: 0x0033d288, 0x39c5: 0x4033d220, 0x39c6: 0x00364288, 0x39c7: 0x40364220, - 0x39c8: 0x00340e88, 0x39c9: 0x40340e20, 0x39ca: 0x00356088, 0x39cb: 0x40356020, - 0x39cc: 0x00355488, 0x39cd: 0x40355420, 0x39ce: 0x00360c88, 0x39cf: 0x40360c20, - 0x39d0: 0x00361688, 0x39d1: 0x40361620, 0x39d2: 0x00362088, 0x39d3: 0x40362020, - 0x39d4: 0x0035de88, 0x39d5: 0x4035de20, 0x39d6: 0x00366488, 0x39d7: 0x40366420, - 0x39df: 0x84e61b67, - 0x39e0: 0x405d9a20, 0x39e1: 0x405d9c20, 0x39e2: 0x405d9e20, 0x39e3: 0x405da020, - 0x39e4: 0x405da220, 0x39e5: 0x405da420, 0x39e6: 0x405da620, 0x39e7: 0x405da820, - 0x39e8: 0x405daa20, 0x39e9: 0x405dac20, 0x39ea: 0x405dae20, 0x39eb: 0x405db020, - 0x39ec: 0x405db220, 0x39ed: 0x405db420, 0x39ee: 0x405db620, 0x39ef: 0x405db820, - 0x39f0: 0x405dba20, 0x39f1: 0x405dbc20, 0x39f2: 0x405dbe20, 0x39f3: 0x405dc020, - 0x39f4: 0x405dc220, 0x39f5: 0x405dc420, 0x39f6: 0x405dc620, 0x39f7: 0x405dc820, - 0x39f8: 0x405dca20, 0x39f9: 0x405dcc20, 0x39fa: 0x405dce20, 0x39fb: 0x405dd020, - 0x39fc: 0x405dd220, 0x39fd: 0x405dd420, 0x39fe: 0x405dd620, 0x39ff: 0x405dd820, - // Block 0xe8, offset 0x3a00 - 0x3a00: 0x405dda20, 0x3a01: 0x405ddc20, 0x3a02: 0x405dde20, 0x3a03: 0x405de020, - 0x3a04: 0x405de220, 0x3a05: 0x405de420, 0x3a06: 0x405de620, 0x3a07: 0x405de820, - 0x3a08: 0x405dea20, 0x3a09: 0x405dec20, 0x3a0a: 0x405dee20, 0x3a0b: 0x405df020, - 0x3a0c: 0x405df220, 0x3a0d: 0x405df420, 0x3a0e: 0x405df620, 0x3a0f: 0x405df820, - 0x3a10: 0x405dfa20, 0x3a11: 0x405dfc20, 0x3a12: 0x405dfe20, 0x3a13: 0x405e0020, - 0x3a14: 0x405e0220, 0x3a15: 0x405e0420, 0x3a16: 0x405e0620, 0x3a17: 0x405e0820, - 0x3a18: 0x405e0a20, 0x3a19: 0x405e0c20, 0x3a1a: 0x405e0e20, 0x3a1b: 0x405e1020, - 0x3a1c: 0x405e1220, 0x3a1d: 0x405e1420, 0x3a1e: 0x405e1620, 0x3a1f: 0x405e1820, - 0x3a20: 0x405e1a20, 0x3a21: 0x405e1c20, 0x3a22: 0x405e1e20, 0x3a23: 0x405e2020, - 0x3a24: 0x405e2220, 0x3a25: 0x405e2420, 0x3a26: 0x405e2620, 0x3a27: 0x405e2820, - 0x3a28: 0x405e2a20, 0x3a29: 0x405e2c20, 0x3a2a: 0x405e2e20, 0x3a2b: 0x405e3020, - 0x3a2c: 0x405e3220, 0x3a2d: 0x405e3420, 0x3a2e: 0x405e3620, 0x3a2f: 0x405e3820, - 0x3a30: 0xae60ef02, 0x3a31: 0xae60f002, 0x3a32: 0x40038220, 0x3a33: 0x40030220, - 0x3a34: 0x4002b820, 0x3a35: 0x40025a20, 0x3a36: 0x40026a20, 0x3a37: 0x4002da20, - // Block 0xe9, offset 0x3a40 - 0x3a40: 0x4006ba20, 0x3a41: 0x4006bc20, 0x3a42: 0x4006be20, 0x3a43: 0x4006c020, - 0x3a44: 0x4006c220, 0x3a45: 0x4006c420, 0x3a46: 0x4006c620, 0x3a47: 0x4006c820, - 0x3a48: 0x4006ca20, 0x3a49: 0x4006cc20, 0x3a4a: 0x4006ce20, 0x3a4b: 0x4006d020, - 0x3a4c: 0x4006d220, 0x3a4d: 0x4006d420, 0x3a4e: 0x4006d620, 0x3a4f: 0x4006d820, - 0x3a50: 0x4006da20, 0x3a51: 0x4006dc20, 0x3a52: 0x4006de20, 0x3a53: 0x4006e020, - 0x3a54: 0x4006e220, 0x3a55: 0x4006e420, 0x3a56: 0x4006e620, 0x3a57: 0x4006e820, - 0x3a58: 0x4006ea20, 0x3a59: 0x4006ec20, 0x3a5a: 0x4006ee20, 0x3a5b: 0x4006f020, - 0x3a5c: 0x4006f220, 0x3a5d: 0x4006f420, 0x3a5e: 0x4006f620, 0x3a5f: 0x4006f820, - 0x3a60: 0x4006fa20, 0x3a61: 0x4006fc20, 0x3a62: 0x0031e488, 0x3a63: 0x4031e420, - 0x3a64: 0x0031f888, 0x3a65: 0x4031f820, 0x3a66: 0x002d8c88, 0x3a67: 0x402d8c20, - 0x3a68: 0xe0000fd5, 0x3a69: 0xe0000fd2, 0x3a6a: 0x0031ae88, 0x3a6b: 0x4031ae20, - 0x3a6c: 0x0031b088, 0x3a6d: 0x4031b020, 0x3a6e: 0x0031b288, 0x3a6f: 0x4031b220, - 0x3a70: 0x402d1020, 0x3a71: 0x402fee20, 0x3a72: 0xe00009cf, 0x3a73: 0xe00009cc, - 0x3a74: 0xe00009ff, 0x3a75: 0xe00009fc, 0x3a76: 0xe0000a05, 0x3a77: 0xe0000a02, - 0x3a78: 0xe0000a0e, 0x3a79: 0xe0000a0b, 0x3a7a: 0xe0000a15, 0x3a7b: 0xe0000a11, - 0x3a7c: 0xe0000a1c, 0x3a7d: 0xe0000a19, 0x3a7e: 0x002c6088, 0x3a7f: 0x402c6020, - // Block 0xea, offset 0x3a80 - 0x3a80: 0x002e1488, 0x3a81: 0x402e1420, 0x3a82: 0x002e1688, 0x3a83: 0x402e1620, - 0x3a84: 0x002e1888, 0x3a85: 0x402e1820, 0x3a86: 0x002e3288, 0x3a87: 0x402e3220, - 0x3a88: 0x002e3688, 0x3a89: 0x402e3620, 0x3a8a: 0x002f1888, 0x3a8b: 0x402f1820, - 0x3a8c: 0x002f0888, 0x3a8d: 0x402f0820, 0x3a8e: 0xe0000ea1, 0x3a8f: 0xe0000e9e, - 0x3a90: 0x002f3888, 0x3a91: 0x402f3820, 0x3a92: 0x002f4688, 0x3a93: 0x402f4620, - 0x3a94: 0x002f4888, 0x3a95: 0x402f4820, 0x3a96: 0x002f5e88, 0x3a97: 0x402f5e20, - 0x3a98: 0x002f6088, 0x3a99: 0x402f6020, 0x3a9a: 0x002f8a88, 0x3a9b: 0x402f8a20, - 0x3a9c: 0x002fe488, 0x3a9d: 0x402fe420, 0x3a9e: 0x0030c888, 0x3a9f: 0x4030c820, - 0x3aa0: 0xe00010c6, 0x3aa1: 0xe00010c3, 0x3aa2: 0x00316288, 0x3aa3: 0x40316220, - 0x3aa4: 0x00319088, 0x3aa5: 0x40319020, 0x3aa6: 0x00319288, 0x3aa7: 0x40319220, - 0x3aa8: 0x00319c88, 0x3aa9: 0x40319c20, 0x3aaa: 0x00319e88, 0x3aab: 0x40319e20, - 0x3aac: 0x0031a088, 0x3aad: 0x4031a020, 0x3aae: 0x0031a288, 0x3aaf: 0x4031a220, - 0x3ab0: 0x0031a294, 0x3ab1: 0x402c9420, 0x3ab2: 0x402e6620, 0x3ab3: 0x402e9c20, - 0x3ab4: 0x402ed820, 0x3ab5: 0x402fe020, 0x3ab6: 0x402fe220, 0x3ab7: 0x40306220, - 0x3ab8: 0x4031a420, 0x3ab9: 0xe0000abc, 0x3aba: 0xe0000ab9, 0x3abb: 0xe0000b92, - 0x3abc: 0xe0000b8f, 0x3abd: 0xe0000bdc, 0x3abe: 0x002d5688, 0x3abf: 0x402d5620, - // Block 0xeb, offset 0x3ac0 - 0x3ac0: 0x002e7088, 0x3ac1: 0x402e7020, 0x3ac2: 0xe0000f08, 0x3ac3: 0xe0000f05, - 0x3ac4: 0xe0000f6d, 0x3ac5: 0xe0000f6a, 0x3ac6: 0xe0000fb7, 0x3ac7: 0xe0000fb4, - 0x3ac8: 0x4006fe20, 0x3ac9: 0x40070020, 0x3aca: 0x40070220, 0x3acb: 0x0031e688, - 0x3acc: 0x4031e620, 0x3acd: 0x00308888, 0x3ace: 0x402e5c20, - 0x3ad0: 0x002ec488, 0x3ad1: 0x402ec420, 0x3ad2: 0x002c4c88, 0x3ad3: 0x402c4c20, - 0x3ae0: 0xe0000bd6, 0x3ae1: 0xe0000bd3, 0x3ae2: 0xe0000ca5, 0x3ae3: 0xe0000ca2, - 0x3ae4: 0xe0000d75, 0x3ae5: 0xe0000d72, 0x3ae6: 0xe0000ee2, 0x3ae7: 0xe0000edf, - 0x3ae8: 0xe0000f4d, 0x3ae9: 0xe0000f4a, 0x3aea: 0x002d8088, - // Block 0xec, offset 0x3b00 - 0x3b38: 0xf0001414, 0x3b39: 0xe0000e97, 0x3b3a: 0x4030a820, 0x3b3b: 0x402d2020, - 0x3b3c: 0x402f4a20, 0x3b3d: 0x402e9820, 0x3b3e: 0x402db220, 0x3b3f: 0x402e9a20, - // Block 0xed, offset 0x3b40 - 0x3b40: 0x4045aa20, 0x3b41: 0x4045ac20, 0x3b42: 0x4045ae20, 0x3b43: 0x4045b020, - 0x3b44: 0x4045b220, 0x3b45: 0x4045b420, 0x3b46: 0x820922db, 0x3b47: 0x4045b820, - 0x3b48: 0x4045ba20, 0x3b49: 0x4045bc20, 0x3b4a: 0x4045be20, 0x3b4b: 0xa000f302, - 0x3b4c: 0x4045c020, 0x3b4d: 0x4045c220, 0x3b4e: 0x4045c420, 0x3b4f: 0x4045c620, - 0x3b50: 0x4045c820, 0x3b51: 0x4045ca20, 0x3b52: 0x4045cc20, 0x3b53: 0x4045ce20, - 0x3b54: 0x4045d020, 0x3b55: 0x4045d220, 0x3b56: 0x4045d420, 0x3b57: 0x4045d620, - 0x3b58: 0x4045d820, 0x3b59: 0x4045da20, 0x3b5a: 0x4045dc20, 0x3b5b: 0x4045de20, - 0x3b5c: 0x4045e020, 0x3b5d: 0x4045e220, 0x3b5e: 0x4045e420, 0x3b5f: 0x4045e620, - 0x3b60: 0x4045e820, 0x3b61: 0x4045ea20, 0x3b62: 0x4045ec20, 0x3b63: 0x4045ee20, - 0x3b64: 0x4045f020, 0x3b65: 0x4045f220, 0x3b66: 0x4045f420, 0x3b67: 0x4045f620, - 0x3b68: 0x40075020, 0x3b69: 0x40075220, 0x3b6a: 0x40075420, 0x3b6b: 0x40075620, - 0x3b70: 0x40284820, 0x3b71: 0x40284a20, 0x3b72: 0x40284c20, 0x3b73: 0x40284e20, - 0x3b74: 0x40285020, 0x3b75: 0x40285220, 0x3b76: 0x40075820, 0x3b77: 0x40075a20, - 0x3b78: 0x4027f020, 0x3b79: 0x40075c20, - // Block 0xee, offset 0x3b80 - 0x3b80: 0x404baa20, 0x3b81: 0x404bac20, 0x3b82: 0x404bae20, 0x3b83: 0x404bb020, - 0x3b84: 0x404bb220, 0x3b85: 0x404bb420, 0x3b86: 0x404bb620, 0x3b87: 0x404bb820, - 0x3b88: 0x404bc220, 0x3b89: 0x404bc420, 0x3b8a: 0x404bc620, 0x3b8b: 0x404bc820, - 0x3b8c: 0x404bca20, 0x3b8d: 0x404bcc20, 0x3b8e: 0x404bce20, 0x3b8f: 0x404bd020, - 0x3b90: 0x404bd220, 0x3b91: 0x404bd420, 0x3b92: 0x404bd620, 0x3b93: 0x404bd820, - 0x3b94: 0x404bdc20, 0x3b95: 0x404bde20, 0x3b96: 0x404be020, 0x3b97: 0x404be220, - 0x3b98: 0x404be820, 0x3b99: 0x404bee20, 0x3b9a: 0x404bf020, 0x3b9b: 0x404bf420, - 0x3b9c: 0x404bf620, 0x3b9d: 0x404bfc20, 0x3b9e: 0x404c0620, 0x3b9f: 0x404c0820, - 0x3ba0: 0x404c0a20, 0x3ba1: 0x404c0c20, 0x3ba2: 0x404bfe20, 0x3ba3: 0x404c0020, - 0x3ba4: 0x404c0220, 0x3ba5: 0x404c0420, 0x3ba6: 0x404c0e20, 0x3ba7: 0x404bda20, - 0x3ba8: 0x404be420, 0x3ba9: 0x404bba20, 0x3baa: 0x404bbc20, 0x3bab: 0x404bbe20, - 0x3bac: 0x404bc020, 0x3bad: 0x404be620, 0x3bae: 0x404bf220, 0x3baf: 0x404bf820, - 0x3bb0: 0x404bfa20, 0x3bb1: 0x404bea20, 0x3bb2: 0x404bec20, 0x3bb3: 0x404c1020, - 0x3bb4: 0x4005e820, 0x3bb5: 0x4005ea20, 0x3bb6: 0x40031820, 0x3bb7: 0x40031a20, - // Block 0xef, offset 0x3bc0 - 0x3bc0: 0xa000f302, 0x3bc1: 0xa000f402, 0x3bc2: 0x4045f820, 0x3bc3: 0x4045fa20, - 0x3bc4: 0x4045fc20, 0x3bc5: 0x4045fe20, 0x3bc6: 0x40460020, 0x3bc7: 0x40460220, - 0x3bc8: 0x40460420, 0x3bc9: 0x40460620, 0x3bca: 0x40460820, 0x3bcb: 0x40460a20, - 0x3bcc: 0x40460c20, 0x3bcd: 0x40460e20, 0x3bce: 0x40461020, 0x3bcf: 0x40461220, - 0x3bd0: 0x40461420, 0x3bd1: 0x40461620, 0x3bd2: 0x40461820, 0x3bd3: 0x40461a20, - 0x3bd4: 0x40461c20, 0x3bd5: 0x40461e20, 0x3bd6: 0x40462020, 0x3bd7: 0x40462220, - 0x3bd8: 0x40462420, 0x3bd9: 0x40462620, 0x3bda: 0x40462820, 0x3bdb: 0x40462a20, - 0x3bdc: 0x40462c20, 0x3bdd: 0x40462e20, 0x3bde: 0x40463020, 0x3bdf: 0x40463220, - 0x3be0: 0x40463420, 0x3be1: 0x40463620, 0x3be2: 0x40463820, 0x3be3: 0x40463a20, - 0x3be4: 0x40463c20, 0x3be5: 0x40463e20, 0x3be6: 0x40464020, 0x3be7: 0x40464220, - 0x3be8: 0x40464420, 0x3be9: 0x40464620, 0x3bea: 0x40464820, 0x3beb: 0x40464a20, - 0x3bec: 0x40464c20, 0x3bed: 0x40464e20, 0x3bee: 0x40465020, 0x3bef: 0x40465220, - 0x3bf0: 0x40465420, 0x3bf1: 0x40465620, 0x3bf2: 0x40465820, 0x3bf3: 0x40465a20, - 0x3bf4: 0x40465c20, 0x3bf5: 0x40465e20, 0x3bf6: 0x40466020, 0x3bf7: 0x40466220, - 0x3bf8: 0x40466420, 0x3bf9: 0x40466620, 0x3bfa: 0x40466820, 0x3bfb: 0x40466a20, - 0x3bfc: 0x40466c20, 0x3bfd: 0x40466e20, 0x3bfe: 0x40467020, 0x3bff: 0x40467220, - // Block 0xf0, offset 0x3c00 - 0x3c00: 0x40467420, 0x3c01: 0x40467620, 0x3c02: 0x40467820, 0x3c03: 0x40467a20, - 0x3c04: 0x8209233e, - 0x3c0e: 0x40031020, 0x3c0f: 0x40031220, - 0x3c10: 0xe000018b, 0x3c11: 0xe000021c, 0x3c12: 0xe0000337, 0x3c13: 0xe0000411, - 0x3c14: 0xe00004e6, 0x3c15: 0xe00005b0, 0x3c16: 0xe000067b, 0x3c17: 0xe0000723, - 0x3c18: 0xe00007cf, 0x3c19: 0xe0000874, - 0x3c20: 0xae600000, 0x3c21: 0xae600000, 0x3c22: 0xae600000, 0x3c23: 0xae600000, - 0x3c24: 0xae600000, 0x3c25: 0xae600000, 0x3c26: 0xae600000, 0x3c27: 0xae600000, - 0x3c28: 0xae600000, 0x3c29: 0xae600000, 0x3c2a: 0xae600000, 0x3c2b: 0xae600000, - 0x3c2c: 0xae600000, 0x3c2d: 0xae600000, 0x3c2e: 0xae600000, 0x3c2f: 0xae600000, - 0x3c30: 0xae600000, 0x3c31: 0xae600000, 0x3c32: 0x40404620, 0x3c33: 0x00404684, - 0x3c34: 0x00404684, 0x3c35: 0x00404684, 0x3c36: 0x00404684, 0x3c37: 0x00404684, - 0x3c38: 0x40056e20, 0x3c39: 0x40057020, 0x3c3a: 0x40057220, 0x3c3b: 0x40404820, - // Block 0xf1, offset 0x3c40 - 0x3c40: 0xe00001a9, 0x3c41: 0xe000023d, 0x3c42: 0xe0000355, 0x3c43: 0xe000042f, - 0x3c44: 0xe0000504, 0x3c45: 0xe00005ce, 0x3c46: 0xe0000699, 0x3c47: 0xe0000741, - 0x3c48: 0xe00007ed, 0x3c49: 0xe0000892, 0x3c4a: 0x404dd220, 0x3c4b: 0x404dd420, - 0x3c4c: 0x404dd620, 0x3c4d: 0x404dd820, 0x3c4e: 0x404dda20, 0x3c4f: 0x404ddc20, - 0x3c50: 0x404dde20, 0x3c51: 0x404de020, 0x3c52: 0x404de220, 0x3c53: 0x404de420, - 0x3c54: 0x404de620, 0x3c55: 0x404de820, 0x3c56: 0x404dea20, 0x3c57: 0x404dec20, - 0x3c58: 0x404dee20, 0x3c59: 0x404df020, 0x3c5a: 0x404df220, 0x3c5b: 0x404df420, - 0x3c5c: 0x404df620, 0x3c5d: 0x404df820, 0x3c5e: 0x404dfa20, 0x3c5f: 0x404dfc20, - 0x3c60: 0x404dfe20, 0x3c61: 0x404e0020, 0x3c62: 0x404e0220, 0x3c63: 0x404e0420, - 0x3c64: 0x404e0620, 0x3c65: 0x404e0820, 0x3c66: 0x404e0a20, 0x3c67: 0x404e0c20, - 0x3c68: 0x404e0e20, 0x3c69: 0x404e1020, 0x3c6a: 0x404e1220, 0x3c6b: 0xadc10f02, - 0x3c6c: 0xadc11002, 0x3c6d: 0xadc11102, 0x3c6e: 0x4005f420, 0x3c6f: 0x40032020, - 0x3c70: 0x404d8a20, 0x3c71: 0x404d8c20, 0x3c72: 0x404d8e20, 0x3c73: 0x404d9020, - 0x3c74: 0x404d9220, 0x3c75: 0x404d9420, 0x3c76: 0x404d9620, 0x3c77: 0x404d9820, - 0x3c78: 0x404d9a20, 0x3c79: 0x404d9c20, 0x3c7a: 0x404d9e20, 0x3c7b: 0x404da020, - 0x3c7c: 0x404da220, 0x3c7d: 0x404da420, 0x3c7e: 0x404da620, 0x3c7f: 0x404da820, - // Block 0xf2, offset 0x3c80 - 0x3c80: 0x404daa20, 0x3c81: 0x404dac20, 0x3c82: 0x404dae20, 0x3c83: 0x404db020, - 0x3c84: 0x404db220, 0x3c85: 0x404db420, 0x3c86: 0x404db620, 0x3c87: 0x404db820, - 0x3c88: 0x404dba20, 0x3c89: 0x404dbc20, 0x3c8a: 0x404dbe20, 0x3c8b: 0x404dc020, - 0x3c8c: 0x404dc220, 0x3c8d: 0x404dc420, 0x3c8e: 0x404dc620, 0x3c8f: 0x404dc820, - 0x3c90: 0x404dca20, 0x3c91: 0x404dcc20, 0x3c92: 0x404dce20, 0x3c93: 0x820926e8, - 0x3c9f: 0x40038420, - 0x3ca0: 0x40636a20, 0x3ca1: 0x40636c20, 0x3ca2: 0x40636e20, 0x3ca3: 0x40637020, - 0x3ca4: 0x40637220, 0x3ca5: 0x40637420, 0x3ca6: 0x40637620, 0x3ca7: 0x40637820, - 0x3ca8: 0x40637a20, 0x3ca9: 0x40637c20, 0x3caa: 0x40637e20, 0x3cab: 0x40638020, - 0x3cac: 0x40638220, 0x3cad: 0x40638420, 0x3cae: 0x40638620, 0x3caf: 0x40638820, - 0x3cb0: 0x40638a20, 0x3cb1: 0x40638c20, 0x3cb2: 0x40638e20, 0x3cb3: 0x40639020, - 0x3cb4: 0x40639220, 0x3cb5: 0x40639420, 0x3cb6: 0x40639620, 0x3cb7: 0x40639820, - 0x3cb8: 0x40639a20, 0x3cb9: 0x40639c20, 0x3cba: 0x40639e20, 0x3cbb: 0x4063a020, - 0x3cbc: 0x4063a220, - // Block 0xf3, offset 0x3cc0 - 0x3cc0: 0xa000f202, 0x3cc1: 0xa000f302, 0x3cc2: 0xa000f802, 0x3cc3: 0xa000f402, - 0x3cc4: 0x4052b220, 0x3cc5: 0x4052b420, 0x3cc6: 0x4052b620, 0x3cc7: 0x4052b820, - 0x3cc8: 0x4052ba20, 0x3cc9: 0x4052bc20, 0x3cca: 0x4052be20, 0x3ccb: 0x4052c020, - 0x3ccc: 0x4052c220, 0x3ccd: 0x4052c420, 0x3cce: 0x4052c620, 0x3ccf: 0x4052c820, - 0x3cd0: 0x4052ca20, 0x3cd1: 0x4052cc20, 0x3cd2: 0x4052ce20, 0x3cd3: 0x4052d020, - 0x3cd4: 0x4052d220, 0x3cd5: 0x4052d420, 0x3cd6: 0x4052d620, 0x3cd7: 0x4052d820, - 0x3cd8: 0x4052da20, 0x3cd9: 0x4052dc20, 0x3cda: 0x4052de20, 0x3cdb: 0x4052e020, - 0x3cdc: 0x4052e220, 0x3cdd: 0x4052e420, 0x3cde: 0x4052e620, 0x3cdf: 0x4052e820, - 0x3ce0: 0x4052ea20, 0x3ce1: 0x4052ec20, 0x3ce2: 0x4052ee20, 0x3ce3: 0x4052f020, - 0x3ce4: 0x4052f220, 0x3ce5: 0x4052f420, 0x3ce6: 0x4052f620, 0x3ce7: 0x4052f820, - 0x3ce8: 0x4052fa20, 0x3ce9: 0x4052fc20, 0x3cea: 0x4052fe20, 0x3ceb: 0x40530220, - 0x3cec: 0x00530284, 0x3ced: 0x40530620, 0x3cee: 0x40530820, 0x3cef: 0x40530a20, - 0x3cf0: 0x40530c20, 0x3cf1: 0x40530e20, 0x3cf2: 0x40531020, 0x3cf3: 0xa070f102, - 0x3cf4: 0x40531220, 0x3cf5: 0x40532420, 0x3cf6: 0x40531620, 0x3cf7: 0x40531820, - 0x3cf8: 0x40531a20, 0x3cf9: 0x40531c20, 0x3cfa: 0x40532020, 0x3cfb: 0x40532220, - 0x3cfc: 0x40531420, 0x3cfd: 0x40531e20, 0x3cfe: 0x40530020, 0x3cff: 0x40530420, - // Block 0xf4, offset 0x3d00 - 0x3d00: 0x82092993, 0x3d01: 0x40036e20, 0x3d02: 0x40037020, 0x3d03: 0x40037220, - 0x3d04: 0x40037420, 0x3d05: 0x40037620, 0x3d06: 0x40037820, 0x3d07: 0x4002b020, - 0x3d08: 0x40033620, 0x3d09: 0x40033820, 0x3d0a: 0x40037a20, 0x3d0b: 0x40037c20, - 0x3d0c: 0x40037e20, 0x3d0d: 0x40038020, 0x3d0f: 0x4027c020, - 0x3d10: 0xe00001c1, 0x3d11: 0xe0000255, 0x3d12: 0xe000036d, 0x3d13: 0xe0000447, - 0x3d14: 0xe000051c, 0x3d15: 0xe00005e6, 0x3d16: 0xe00006b1, 0x3d17: 0xe0000759, - 0x3d18: 0xe0000805, 0x3d19: 0xe00008aa, - 0x3d1e: 0x4005f620, 0x3d1f: 0x4005f820, - // Block 0xf5, offset 0x3d40 - 0x3d40: 0x40519c20, 0x3d41: 0x40519e20, 0x3d42: 0x4051a020, 0x3d43: 0x4051a220, - 0x3d44: 0x4051a420, 0x3d45: 0x4051a620, 0x3d46: 0x4051a820, 0x3d47: 0x4051aa20, - 0x3d48: 0x4051ac20, 0x3d49: 0x4051ae20, 0x3d4a: 0x4051b020, 0x3d4b: 0x4051b220, - 0x3d4c: 0x4051b420, 0x3d4d: 0x4051b620, 0x3d4e: 0x4051b820, 0x3d4f: 0x4051ba20, - 0x3d50: 0x4051bc20, 0x3d51: 0x4051be20, 0x3d52: 0x4051c020, 0x3d53: 0x4051c220, - 0x3d54: 0x4051c420, 0x3d55: 0x4051c620, 0x3d56: 0x4051c820, 0x3d57: 0x4051ca20, - 0x3d58: 0x4051cc20, 0x3d59: 0x4051ce20, 0x3d5a: 0x4051d020, 0x3d5b: 0x4051d220, - 0x3d5c: 0x4051d420, 0x3d5d: 0x4051d620, 0x3d5e: 0x4051d820, 0x3d5f: 0x4051da20, - 0x3d60: 0x4051dc20, 0x3d61: 0x4051de20, 0x3d62: 0x4051e020, 0x3d63: 0x4051e220, - 0x3d64: 0x4051e420, 0x3d65: 0x4051e620, 0x3d66: 0x4051e820, 0x3d67: 0x4051ea20, - 0x3d68: 0x4051ec20, 0x3d69: 0x4051f620, 0x3d6a: 0x4051f820, 0x3d6b: 0x4051fa20, - 0x3d6c: 0x4051fc20, 0x3d6d: 0x4051fe20, 0x3d6e: 0x40520020, 0x3d6f: 0x40520220, - 0x3d70: 0x40520420, 0x3d71: 0x40520620, 0x3d72: 0x40520820, 0x3d73: 0x4051ee20, - 0x3d74: 0x4051f020, 0x3d75: 0x4051f220, 0x3d76: 0x4051f420, - // Block 0xf6, offset 0x3d80 - 0x3d80: 0x40520a20, 0x3d81: 0x40520c20, 0x3d82: 0x40520e20, 0x3d83: 0x40521020, - 0x3d84: 0x40521220, 0x3d85: 0x40521420, 0x3d86: 0x40521620, 0x3d87: 0x40521820, - 0x3d88: 0x40521a20, 0x3d89: 0x40521c20, 0x3d8a: 0x40521e20, 0x3d8b: 0x40522020, - 0x3d8c: 0x40522220, 0x3d8d: 0x40522420, - 0x3d90: 0xe00001bb, 0x3d91: 0xe000024f, 0x3d92: 0xe0000367, 0x3d93: 0xe0000441, - 0x3d94: 0xe0000516, 0x3d95: 0xe00005e0, 0x3d96: 0xe00006ab, 0x3d97: 0xe0000753, - 0x3d98: 0xe00007ff, 0x3d99: 0xe00008a4, - 0x3d9c: 0x4005fa20, 0x3d9d: 0x40033a20, 0x3d9e: 0x40033c20, 0x3d9f: 0x40033e20, - 0x3da0: 0x404e2020, 0x3da1: 0x404e2c20, 0x3da2: 0x404e3020, 0x3da3: 0x404e3420, - 0x3da4: 0x404e3e20, 0x3da5: 0x404e4620, 0x3da6: 0x404e4c20, 0x3da7: 0x404e5020, - 0x3da8: 0x404e5420, 0x3da9: 0x404e5820, 0x3daa: 0x404e6820, 0x3dab: 0x404e6e20, - 0x3dac: 0x404ea820, 0x3dad: 0x404eae20, 0x3dae: 0x404eb220, 0x3daf: 0x404e7a20, - 0x3db0: 0x4027c220, 0x3db1: 0x404eb420, 0x3db2: 0x404e3820, 0x3db3: 0x404e8e20, - 0x3db4: 0x404f3a20, 0x3db5: 0x404f3c20, 0x3db6: 0x404f3e20, 0x3db7: 0x4007ac20, - 0x3db8: 0x4007ae20, 0x3db9: 0x4007b020, 0x3dba: 0x404e9020, 0x3dbb: 0x404f3820, - // Block 0xf7, offset 0x3dc0 - 0x3dc0: 0x4049f020, 0x3dc1: 0x4049f220, 0x3dc2: 0x4049f420, 0x3dc3: 0x4049f620, - 0x3dc4: 0x4049f820, 0x3dc5: 0x4049fa20, 0x3dc6: 0x4049fc20, 0x3dc7: 0x4049fe20, - 0x3dc8: 0x404a0020, 0x3dc9: 0x404a0220, 0x3dca: 0x404a0420, 0x3dcb: 0x404a0620, - 0x3dcc: 0x404a0820, 0x3dcd: 0x404a0a20, 0x3dce: 0x404a0c20, 0x3dcf: 0x404a0e20, - 0x3dd0: 0x404a1020, 0x3dd1: 0x404a1220, 0x3dd2: 0x404a1420, 0x3dd3: 0x404a1620, - 0x3dd4: 0x404a1820, 0x3dd5: 0x404a1a20, 0x3dd6: 0x404a1c20, 0x3dd7: 0x404a1e20, - 0x3dd8: 0x404a2020, 0x3dd9: 0x404a2220, 0x3dda: 0x404a2420, 0x3ddb: 0x404a2620, - 0x3ddc: 0x404a2820, 0x3ddd: 0x404a2a20, 0x3dde: 0x404a2c20, 0x3ddf: 0x404a2e20, - 0x3de0: 0x404a3020, 0x3de1: 0x404a3220, 0x3de2: 0x404a3420, 0x3de3: 0x404a3620, - 0x3de4: 0x404a3820, 0x3de5: 0x404a3a20, 0x3de6: 0x404a3c20, 0x3de7: 0x404a3e20, - 0x3de8: 0x404a4020, 0x3de9: 0x404a4220, 0x3dea: 0x404a4420, 0x3deb: 0x404a4620, - 0x3dec: 0x404a4820, 0x3ded: 0x404a4a20, 0x3dee: 0x404a4c20, 0x3def: 0x404a4e20, - 0x3df0: 0x82e62528, 0x3df1: 0x404a5220, 0x3df2: 0x82e6252a, 0x3df3: 0x82e6252b, - 0x3df4: 0x82dc252c, 0x3df5: 0xc20e0671, 0x3df6: 0xc23f0671, 0x3df7: 0x82e6252f, - 0x3df8: 0x82e62530, 0x3df9: 0xc2700671, 0x3dfa: 0x404a6420, 0x3dfb: 0xc2a10671, - 0x3dfc: 0xc2d20671, 0x3dfd: 0x404a6a20, 0x3dfe: 0x82e62536, 0x3dff: 0xae610c02, - // Block 0xf8, offset 0x3e00 - 0x3e00: 0x404a6e20, 0x3e01: 0xae610d02, 0x3e02: 0x404a7020, - 0x3e1b: 0x404a7220, - 0x3e1c: 0x404a7420, 0x3e1d: 0x4027c420, 0x3e1e: 0x40057e20, 0x3e1f: 0x40058020, - 0x3e20: 0x40456420, 0x3e21: 0x40456620, 0x3e22: 0x40456820, 0x3e23: 0x40456a20, - 0x3e24: 0x40456c20, 0x3e25: 0x40456e20, 0x3e26: 0x40457020, 0x3e27: 0x40457220, - 0x3e28: 0x40457420, 0x3e29: 0x40457620, 0x3e2a: 0x40457820, 0x3e2b: 0x40458a20, - 0x3e2c: 0x40458c20, 0x3e2d: 0x40458e20, 0x3e2e: 0x40459020, 0x3e2f: 0x40459220, - 0x3e30: 0x40034020, 0x3e31: 0x4002dc20, 0x3e32: 0x40452c20, 0x3e33: 0x4027c620, - 0x3e34: 0x4027c820, 0x3e35: 0x40459420, 0x3e36: 0x820922d4, - // Block 0xf9, offset 0x3e40 - 0x3e41: 0x403cae20, 0x3e42: 0x403cb020, 0x3e43: 0x403cb220, - 0x3e44: 0x403cb420, 0x3e45: 0x403cb620, 0x3e46: 0x403cb820, - 0x3e49: 0x403e3c20, 0x3e4a: 0x403e3e20, 0x3e4b: 0x403e4020, - 0x3e4c: 0x403e4220, 0x3e4d: 0x403e4420, 0x3e4e: 0x403e4620, - 0x3e51: 0x403dfe20, 0x3e52: 0x403e0020, 0x3e53: 0x403e0220, - 0x3e54: 0x403e0420, 0x3e55: 0x403e0620, 0x3e56: 0x403e0820, - 0x3e60: 0x403ec220, 0x3e61: 0x403ec420, 0x3e62: 0x403ec620, 0x3e63: 0x403ec820, - 0x3e64: 0x403eca20, 0x3e65: 0x403ecc20, 0x3e66: 0x403ece20, - 0x3e68: 0x403ef220, 0x3e69: 0x403ef420, 0x3e6a: 0x403ef620, 0x3e6b: 0x403ef820, - 0x3e6c: 0x403efa20, 0x3e6d: 0x403efc20, 0x3e6e: 0x403efe20, - // Block 0xfa, offset 0x3e80 - 0x3e80: 0x40452e20, 0x3e81: 0x40453020, 0x3e82: 0x40453220, 0x3e83: 0x40453420, - 0x3e84: 0x40453620, 0x3e85: 0x40453820, 0x3e86: 0x40453a20, 0x3e87: 0x40453c20, - 0x3e88: 0x40453e20, 0x3e89: 0x40454020, 0x3e8a: 0x40454220, 0x3e8b: 0x40454420, - 0x3e8c: 0x40454620, 0x3e8d: 0x40454820, 0x3e8e: 0x40454a20, 0x3e8f: 0x40454c20, - 0x3e90: 0x40454e20, 0x3e91: 0x40455020, 0x3e92: 0x40455220, 0x3e93: 0x40455420, - 0x3e94: 0x40455620, 0x3e95: 0x40455820, 0x3e96: 0x40455a20, 0x3e97: 0x40455c20, - 0x3e98: 0x40455e20, 0x3e99: 0x40456020, 0x3e9a: 0x40456220, 0x3e9b: 0x40459620, - 0x3e9c: 0x40459820, 0x3e9d: 0x40459a20, 0x3e9e: 0x40459c20, 0x3e9f: 0x40459e20, - 0x3ea0: 0x4045a020, 0x3ea1: 0x4045a220, 0x3ea2: 0x4045a420, 0x3ea3: 0x40457a20, - 0x3ea4: 0x40457c20, 0x3ea5: 0x40457e20, 0x3ea6: 0x40458020, 0x3ea7: 0x40458220, - 0x3ea8: 0x40458420, 0x3ea9: 0x40458620, 0x3eaa: 0x40458820, 0x3eab: 0x40034220, - 0x3eac: 0xa000fa02, 0x3ead: 0x820922d3, - 0x3eb0: 0xe0000188, 0x3eb1: 0xe0000219, 0x3eb2: 0xe0000334, 0x3eb3: 0xe000040e, - 0x3eb4: 0xe00004e3, 0x3eb5: 0xe00005ad, 0x3eb6: 0xe0000678, 0x3eb7: 0xe0000720, - 0x3eb8: 0xe00007cc, 0x3eb9: 0xe0000871, - // Block 0xfb, offset 0x3ec0 - 0x3ef0: 0x40643620, 0x3ef1: 0x40643820, 0x3ef2: 0x40643a20, 0x3ef3: 0x40643c20, - 0x3ef4: 0x40643e20, 0x3ef5: 0x40644020, 0x3ef6: 0x40644220, 0x3ef7: 0x40644420, - 0x3ef8: 0x40644620, 0x3ef9: 0x40644820, 0x3efa: 0x40644a20, 0x3efb: 0x40644c20, - 0x3efc: 0x40644e20, 0x3efd: 0x40645020, 0x3efe: 0x40645220, 0x3eff: 0x40645420, - // Block 0xfc, offset 0x3f00 - 0x3f00: 0x40645620, 0x3f01: 0x40645820, 0x3f02: 0x40645a20, 0x3f03: 0x40645c20, - 0x3f04: 0x40645e20, 0x3f05: 0x40646020, 0x3f06: 0x40646220, - 0x3f0b: 0x40651420, - 0x3f0c: 0x40651620, 0x3f0d: 0x40651820, 0x3f0e: 0x40651a20, 0x3f0f: 0x40651c20, - 0x3f10: 0x40651e20, 0x3f11: 0x40652020, 0x3f12: 0x40652220, 0x3f13: 0x40652420, - 0x3f14: 0x40652620, 0x3f15: 0x40652820, 0x3f16: 0x40652a20, 0x3f17: 0x40652c20, - 0x3f18: 0x40652e20, 0x3f19: 0x40653020, 0x3f1a: 0x40653220, 0x3f1b: 0x40653420, - 0x3f1c: 0x40653620, 0x3f1d: 0x40653820, 0x3f1e: 0x40653a20, 0x3f1f: 0x40653c20, - 0x3f20: 0x40653e20, 0x3f21: 0x40654020, 0x3f22: 0x40654220, 0x3f23: 0x40654420, - 0x3f24: 0x40654620, 0x3f25: 0x40654820, 0x3f26: 0x40654a20, 0x3f27: 0x40654c20, - 0x3f28: 0x40654e20, 0x3f29: 0x40655020, 0x3f2a: 0x40655220, 0x3f2b: 0x40655420, - 0x3f2c: 0x40655620, 0x3f2d: 0x40655820, 0x3f2e: 0x40655a20, 0x3f2f: 0x40655c20, - 0x3f30: 0x40655e20, 0x3f31: 0x40656020, 0x3f32: 0x40656220, 0x3f33: 0x40656420, - 0x3f34: 0x40656620, 0x3f35: 0x40656820, 0x3f36: 0x40656a20, 0x3f37: 0x40656c20, - 0x3f38: 0x40656e20, 0x3f39: 0x40657020, 0x3f3a: 0x40657220, 0x3f3b: 0x40657420, - // Block 0xfd, offset 0x3f40 - 0x3f40: 0x43189020, 0x3f41: 0x42cde820, 0x3f42: 0x431d9420, 0x3f43: 0x43199020, - 0x3f44: 0x42dda220, 0x3f45: 0x429c6420, 0x3f46: 0x42a7ca20, 0x3f47: 0x433f3820, - 0x3f48: 0x433f3820, 0x3f49: 0x42b2a220, 0x3f4a: 0x4323a220, 0x3f4b: 0x42ab0e20, - 0x3f4c: 0x42b29020, 0x3f4d: 0x42c3ec20, 0x3f4e: 0x42ecd220, 0x3f4f: 0x42ff0a20, - 0x3f50: 0x430c7e20, 0x3f51: 0x430f7420, 0x3f52: 0x4311f020, 0x3f53: 0x43211e20, - 0x3f54: 0x42d40420, 0x3f55: 0x42da3620, 0x3f56: 0x42e1b220, 0x3f57: 0x42e7bc20, - 0x3f58: 0x43087a20, 0x3f59: 0x4322d420, 0x3f5a: 0x4333e220, 0x3f5b: 0x429d0420, - 0x3f5c: 0x42a6ea20, 0x3f5d: 0x42d60820, 0x3f5e: 0x42e43620, 0x3f5f: 0x430c5a20, - 0x3f60: 0x433c3c20, 0x3f61: 0x42baa020, 0x3f62: 0x42dfd620, 0x3f63: 0x430b9a20, - 0x3f64: 0x4312c820, 0x3f65: 0x42c59220, 0x3f66: 0x4303b020, 0x3f67: 0x43103e20, - 0x3f68: 0x42bd9420, 0x3f69: 0x42ce2e20, 0x3f6a: 0x42dad420, 0x3f6b: 0x42e5f820, - 0x3f6c: 0x43219c20, 0x3f6d: 0x429f0c20, 0x3f6e: 0x42a36e20, 0x3f6f: 0x42a5bc20, - 0x3f70: 0x42c98820, 0x3f71: 0x42d5a620, 0x3f72: 0x42e42020, 0x3f73: 0x42edce20, - 0x3f74: 0x43000220, 0x3f75: 0x430c0c20, 0x3f76: 0x430cb820, 0x3f77: 0x431bde20, - 0x3f78: 0x432e6420, 0x3f79: 0x4336de20, 0x3f7a: 0x433bf420, 0x3f7b: 0x42f11820, - 0x3f7c: 0x42f2fe20, 0x3f7d: 0x42fb4020, 0x3f7e: 0x43079220, 0x3f7f: 0x43260820, - // Block 0xfe, offset 0x3f80 - 0x3f80: 0x433cfe20, 0x3f81: 0x4315ac20, 0x3f82: 0x42b1be20, 0x3f83: 0x42be0820, - 0x3f84: 0x42f8c020, 0x3f85: 0x4300fc20, 0x3f86: 0x42e4c420, 0x3f87: 0x42f19420, - 0x3f88: 0x43198420, 0x3f89: 0x432dee20, 0x3f8a: 0x42b1b020, 0x3f8b: 0x42b8c420, - 0x3f8c: 0x42d42620, 0x3f8d: 0x42dbb420, 0x3f8e: 0x42de1e20, 0x3f8f: 0x42fa5e20, - 0x3f90: 0x42fc6e20, 0x3f91: 0x432c9620, 0x3f92: 0x42a5a420, 0x3f93: 0x43011620, - 0x3f94: 0x42a3b820, 0x3f95: 0x42a39820, 0x3f96: 0x42f43820, 0x3f97: 0x42fb7c20, - 0x3f98: 0x4307e220, 0x3f99: 0x432cea20, 0x3f9a: 0x43170020, 0x3f9b: 0x42c59e20, - 0x3f9c: 0x42d40420, 0x3f9d: 0x4315fc20, 0x3f9e: 0x429c7220, 0x3f9f: 0x42b7ce20, - 0x3fa0: 0x42c02420, 0x3fa1: 0x42e70e20, 0x3fa2: 0x42eae020, 0x3fa3: 0x42a62e20, - 0x3fa4: 0x42f1f620, 0x3fa5: 0x429f7e20, 0x3fa6: 0x42bf5220, 0x3fa7: 0x429c1a20, - 0x3fa8: 0x42d99820, 0x3fa9: 0x42caf020, 0x3faa: 0x42fa4420, 0x3fab: 0x42a78620, - 0x3fac: 0x42b0bc20, 0x3fad: 0x42ee0220, 0x3fae: 0x43089220, 0x3faf: 0x43155420, - 0x3fb0: 0x42d77420, 0x3fb1: 0x431f6020, 0x3fb2: 0x42d91020, 0x3fb3: 0x42c5fc20, - 0x3fb4: 0x4305ca20, 0x3fb5: 0x42c74020, 0x3fb6: 0x42eaca20, 0x3fb7: 0x429d5c20, - 0x3fb8: 0x42a2d220, 0x3fb9: 0x42a39220, 0x3fba: 0x42d10220, 0x3fbb: 0x42f9ce20, - 0x3fbc: 0x4304de20, 0x3fbd: 0x4315a420, 0x3fbe: 0x43239e20, 0x3fbf: 0x42a5ea20, - // Block 0xff, offset 0x3fc0 - 0x3fc0: 0x42a88420, 0x3fc1: 0x42b2e620, 0x3fc2: 0x42bdd820, 0x3fc3: 0x42cb8a20, - 0x3fc4: 0x42dffc20, 0x3fc5: 0x42f25420, 0x3fc6: 0x432b5a20, 0x3fc7: 0x4334d420, - 0x3fc8: 0x433d2e20, 0x3fc9: 0x433d9c20, 0x3fca: 0x42a53620, 0x3fcb: 0x42cd8c20, - 0x3fcc: 0x42d6ee20, 0x3fcd: 0x431ec420, 0x3fce: 0x42bce820, 0x3fcf: 0x42c32020, - 0x3fd0: 0x42c40020, 0x3fd1: 0x42c93420, 0x3fd2: 0x42de4620, 0x3fd3: 0x42e29220, - 0x3fd4: 0x42e91220, 0x3fd5: 0x42f39420, 0x3fd6: 0x42fbe820, 0x3fd7: 0x4300de20, - 0x3fd8: 0x431e4c20, 0x3fd9: 0x4309dc20, 0x3fda: 0x43204620, 0x3fdb: 0x43269420, - 0x3fdc: 0x42a42e20, 0x3fdd: 0x42a54620, 0x3fde: 0x42a97a20, 0x3fdf: 0x42e19020, - 0x3fe0: 0x43118420, 0x3fe1: 0x43155420, 0x3fe2: 0x42bd9220, 0x3fe3: 0x42bfea20, - 0x3fe4: 0x42c6f620, 0x3fe5: 0x42d75c20, 0x3fe6: 0x42f87c20, 0x3fe7: 0x42e6ea20, - 0x3fe8: 0x429dc820, 0x3fe9: 0x42adf220, 0x3fea: 0x42b7ce20, 0x3feb: 0x42bb7420, - 0x3fec: 0x42c03820, 0x3fed: 0x42e76420, 0x3fee: 0x42e8d220, 0x3fef: 0x42ff3420, - 0x3ff0: 0x43008c20, 0x3ff1: 0x43246820, 0x3ff2: 0x432dec20, 0x3ff3: 0x432e9020, - 0x3ff4: 0x43303020, 0x3ff5: 0x429f1620, 0x3ff6: 0x42f35c20, 0x3ff7: 0x43236820, - 0x3ff8: 0x432d7020, 0x3ff9: 0x42c1c220, 0x3ffa: 0x429d0c20, 0x3ffb: 0x42a1b420, - 0x3ffc: 0x42b7dc20, 0x3ffd: 0x42b87e20, 0x3ffe: 0x42cb3220, 0x3fff: 0x42d40420, - // Block 0x100, offset 0x4000 - 0x4000: 0x42e39c20, 0x4001: 0x42ec8420, 0x4002: 0x4309f820, 0x4003: 0x4320f820, - 0x4004: 0x433f1a20, 0x4005: 0x42cd1020, 0x4006: 0x432c5c20, 0x4007: 0x42a51220, - 0x4008: 0x42cef620, 0x4009: 0x42cfe620, 0x400a: 0x42da8220, 0x400b: 0x42dd3820, - 0x400c: 0x42e81220, 0x400d: 0x42eab220, 0x400e: 0x42f0d620, 0x400f: 0x42fa2020, - 0x4010: 0x4330bc20, 0x4011: 0x42a2da20, 0x4012: 0x42c45c20, 0x4013: 0x432cf020, - 0x4014: 0x42a05620, 0x4015: 0x42ba3220, 0x4016: 0x42dbd420, 0x4017: 0x431e5420, - 0x4018: 0x42bf1620, 0x4019: 0x42c28820, 0x401a: 0x42d02e20, 0x401b: 0x42e70e20, - 0x401c: 0x432d0c20, 0x401d: 0x42a45220, 0x401e: 0x42a81e20, 0x401f: 0x42b8ca20, - 0x4020: 0x42cc2620, 0x4021: 0x42ce9c20, 0x4022: 0x42d15020, 0x4023: 0x42d9ca20, - 0x4024: 0x42e80c20, 0x4025: 0x42ebc420, 0x4026: 0x42fef220, 0x4027: 0x43119e20, - 0x4028: 0x4311c220, 0x4029: 0x43239820, 0x402a: 0x432dc420, 0x402b: 0x42a67e20, - 0x402c: 0x42dd7420, 0x402d: 0x42a83a20, 0x402e: 0x42e3a020, 0x402f: 0x42e93020, - 0x4030: 0x430bf420, 0x4031: 0x432d4620, 0x4032: 0x4338ae20, 0x4033: 0x433d3e20, - 0x4034: 0x42cf2e20, 0x4035: 0x42db9620, 0x4036: 0x4303d020, 0x4037: 0x42f59620, - 0x4038: 0x42f64020, 0x4039: 0x42f92420, 0x403a: 0x42e58020, 0x403b: 0x42e13220, - 0x403c: 0x4316b020, 0x403d: 0x429d8020, 0x403e: 0x43066c20, 0x403f: 0x42a47420, - // Block 0x101, offset 0x4040 - 0x4040: 0x42a40e20, 0x4041: 0x42bd4c20, 0x4042: 0x42c5a620, 0x4043: 0x42f9ac20, - 0x4044: 0x42b70a20, 0x4045: 0x42da3c20, 0x4046: 0x42cd6820, 0x4047: 0x431e7620, - 0x4048: 0x43109820, 0x4049: 0x432c9a20, 0x404a: 0x43131620, 0x404b: 0x42bda620, - 0x404c: 0x42a28020, 0x404d: 0x42ab8020, 0x404e: 0x43f41c20, 0x404f: 0x43f41e20, - 0x4050: 0x42b0b420, 0x4051: 0x43f42220, 0x4052: 0x42cce820, 0x4053: 0x43f42620, - 0x4054: 0x43f42820, 0x4055: 0x42a3bc20, 0x4056: 0x42e65420, 0x4057: 0x42ed9420, - 0x4058: 0x42f27820, 0x4059: 0x42f2bc20, 0x405a: 0x42f2ca20, 0x405b: 0x42f31e20, - 0x405c: 0x432eac20, 0x405d: 0x42f97c20, 0x405e: 0x42ff7a20, 0x405f: 0x43f43e20, - 0x4060: 0x430c2420, 0x4061: 0x43f44220, 0x4062: 0x4315f020, 0x4063: 0x43f44620, - 0x4064: 0x43f44820, 0x4065: 0x43207020, 0x4066: 0x4321fa20, 0x4067: 0x43f44e20, - 0x4068: 0x43f45020, 0x4069: 0x43f45220, 0x406a: 0x4331de20, 0x406b: 0x4331f820, - 0x406c: 0x43325020, 0x406d: 0x433b6820, 0x406e: 0x4321bc20, 0x406f: 0x432d6e20, - 0x4070: 0x429f5c20, 0x4071: 0x42a1ce20, 0x4072: 0x42a29a20, 0x4073: 0x42a59220, - 0x4074: 0x42a5c820, 0x4075: 0x42a6a220, 0x4076: 0x42ab3a20, 0x4077: 0x42ac0c20, - 0x4078: 0x42acd020, 0x4079: 0x42b08020, 0x407a: 0x42b15020, 0x407b: 0x42b8c820, - 0x407c: 0x42b8dc20, 0x407d: 0x42c12820, 0x407e: 0x42c2d020, 0x407f: 0x42c31c20, - // Block 0x102, offset 0x4080 - 0x4080: 0x42c3e420, 0x4081: 0x42ca9e20, 0x4082: 0x42cbc420, 0x4083: 0x42cd2220, - 0x4084: 0x42d10a20, 0x4085: 0x42daee20, 0x4086: 0x42dc3420, 0x4087: 0x42de4420, - 0x4088: 0x42e2dc20, 0x4089: 0x42e45620, 0x408a: 0x42e84420, 0x408b: 0x42f12220, - 0x408c: 0x42f27c20, 0x408d: 0x42f29220, 0x408e: 0x42f29020, 0x408f: 0x42f2a020, - 0x4090: 0x42f2ac20, 0x4091: 0x42f2ba20, 0x4092: 0x42f31a20, 0x4093: 0x42f31c20, - 0x4094: 0x42f48020, 0x4095: 0x42f50220, 0x4096: 0x42f78020, 0x4097: 0x42fbe820, - 0x4098: 0x42fc1220, 0x4099: 0x42fc8220, 0x409a: 0x42fee420, 0x409b: 0x43000a20, - 0x409c: 0x4303da20, 0x409d: 0x4304f220, 0x409e: 0x4304f220, 0x409f: 0x4308ae20, - 0x40a0: 0x43122020, 0x40a1: 0x43132c20, 0x40a2: 0x43160220, 0x40a3: 0x43167220, - 0x40a4: 0x4319a620, 0x40a5: 0x431a1020, 0x40a6: 0x431f6c20, 0x40a7: 0x43207020, - 0x40a8: 0x432dc620, 0x40a9: 0x432ffe20, 0x40aa: 0x43307620, 0x40ab: 0x42c0ea20, - 0x40ac: 0x4885dc20, 0x40ad: 0x43043020, - 0x40b0: 0x429c4c20, 0x40b1: 0x42a36a20, 0x40b2: 0x42a2d020, 0x40b3: 0x429f0020, - 0x40b4: 0x42a28a20, 0x40b5: 0x42a30020, 0x40b6: 0x42a58e20, 0x40b7: 0x42a5f420, - 0x40b8: 0x42ab3a20, 0x40b9: 0x42aaaa20, 0x40ba: 0x42ab3220, 0x40bb: 0x42abc420, - 0x40bc: 0x42b0b420, 0x40bd: 0x42b16620, 0x40be: 0x42b28820, 0x40bf: 0x42b2a820, - // Block 0x103, offset 0x40c0 - 0x40c0: 0x42b4c420, 0x40c1: 0x42b65020, 0x40c2: 0x42bda420, 0x40c3: 0x42bdb220, - 0x40c4: 0x42bed220, 0x40c5: 0x42bf5a20, 0x40c6: 0x42c1b020, 0x40c7: 0x42c29c20, - 0x40c8: 0x42c21020, 0x40c9: 0x42c31c20, 0x40ca: 0x42c2c020, 0x40cb: 0x42c3e420, - 0x40cc: 0x42c46820, 0x40cd: 0x42c78820, 0x40ce: 0x42c83820, 0x40cf: 0x42c8a420, - 0x40d0: 0x42caac20, 0x40d1: 0x42cce820, 0x40d2: 0x42ce2e20, 0x40d3: 0x42ce3620, - 0x40d4: 0x42ceac20, 0x40d5: 0x42d6f220, 0x40d6: 0x42d77420, 0x40d7: 0x42da8220, - 0x40d8: 0x42ddb620, 0x40d9: 0x42dd9620, 0x40da: 0x42de4420, 0x40db: 0x42e03c20, - 0x40dc: 0x42e2dc20, 0x40dd: 0x42ef4e20, 0x40de: 0x42e46a20, 0x40df: 0x42e55e20, - 0x40e0: 0x42e65420, 0x40e1: 0x42e8e220, 0x40e2: 0x42ea0c20, 0x40e3: 0x42ea7620, - 0x40e4: 0x42ec3a20, 0x40e5: 0x42ec3e20, 0x40e6: 0x42ed9420, 0x40e7: 0x42edb620, - 0x40e8: 0x42ede820, 0x40e9: 0x42ee9420, 0x40ea: 0x42ee8020, 0x40eb: 0x42f19820, - 0x40ec: 0x42f56220, 0x40ed: 0x42f78020, 0x40ee: 0x42f8f620, 0x40ef: 0x42fab620, - 0x40f0: 0x42fbe820, 0x40f1: 0x42fe7c20, 0x40f2: 0x43000a20, 0x40f3: 0x4306a420, - 0x40f4: 0x4307de20, 0x40f5: 0x430ef220, 0x40f6: 0x43128220, 0x40f7: 0x43130c20, - 0x40f8: 0x43132c20, 0x40f9: 0x43157e20, 0x40fa: 0x4315f020, 0x40fb: 0x43159620, - 0x40fc: 0x43160220, 0x40fd: 0x4315fc20, 0x40fe: 0x4315da20, 0x40ff: 0x43167220, - // Block 0x104, offset 0x4100 - 0x4100: 0x43171420, 0x4101: 0x431a1020, 0x4102: 0x431e7020, 0x4103: 0x4320e420, - 0x4104: 0x43233220, 0x4105: 0x4324ec20, 0x4106: 0x432cf820, 0x4107: 0x432dc620, - 0x4108: 0x432eac20, 0x4109: 0x432fb620, 0x410a: 0x432ffe20, 0x410b: 0x43301620, - 0x410c: 0x43307620, 0x410d: 0x43362420, 0x410e: 0x433f3820, 0x410f: 0x48509420, - 0x4110: 0x48508820, 0x4111: 0x4867aa20, 0x4112: 0x44773a20, 0x4113: 0x44803020, - 0x4114: 0x44807220, 0x4115: 0x48a49220, 0x4116: 0x48b9a020, 0x4117: 0x48fda620, - 0x4118: 0x433e8620, 0x4119: 0x433f1c20, - // Block 0x105, offset 0x4140 - 0x4140: 0xf0000404, 0x4141: 0xf0000404, 0x4142: 0xf0000404, 0x4143: 0xe0000b99, - 0x4144: 0xe0000b9d, 0x4145: 0xe0000f83, 0x4146: 0xf0000404, - 0x4153: 0xf0000404, - 0x4154: 0xf0000404, 0x4155: 0xf0000404, 0x4156: 0xf0000404, 0x4157: 0xf0000404, - 0x415d: 0xe000150b, 0x415e: 0xa1a09602, 0x415f: 0xe0001514, - 0x4160: 0x0038ae85, 0x4161: 0x00389085, 0x4162: 0x00389685, 0x4163: 0x00389885, - 0x4164: 0x0038a485, 0x4165: 0x0038a685, 0x4166: 0x0038a885, 0x4167: 0x0038b685, - 0x4168: 0x0038ba85, 0x4169: 0x00093885, 0x416a: 0xe0001542, 0x416b: 0xe000153f, - 0x416c: 0xe000154c, 0x416d: 0xe0001548, 0x416e: 0xe00014e1, 0x416f: 0xe00014e4, - 0x4170: 0xe00014e7, 0x4171: 0xe00014ea, 0x4172: 0xe00014f0, 0x4173: 0xe00014f3, - 0x4174: 0xe00014f6, 0x4175: 0xe00014fc, 0x4176: 0xe0001505, - 0x4178: 0xe0001508, 0x4179: 0xe000150e, 0x417a: 0xe000151b, 0x417b: 0xe0001518, - 0x417c: 0xe0001521, 0x417e: 0xe0001524, - // Block 0x106, offset 0x4180 - 0x4180: 0xe0001527, 0x4181: 0xe000152a, 0x4183: 0xe0001530, - 0x4184: 0xe000152d, 0x4186: 0xe0001536, 0x4187: 0xe0001539, - 0x4188: 0xe000153c, 0x4189: 0xe0001545, 0x418a: 0xe0001550, 0x418b: 0xe00014f9, - 0x418c: 0xe00014ed, 0x418d: 0xe000151e, 0x418e: 0xe0001533, 0x418f: 0xf0000404, - 0x4190: 0x0039249a, 0x4191: 0x00392499, 0x4192: 0x00393e9a, 0x4193: 0x00393e99, - 0x4194: 0x00393e97, 0x4195: 0x00393e98, 0x4196: 0x0039409a, 0x4197: 0x00394099, - 0x4198: 0x00394097, 0x4199: 0x00394098, 0x419a: 0x0039429a, 0x419b: 0x00394299, - 0x419c: 0x00394297, 0x419d: 0x00394298, 0x419e: 0x00395c9a, 0x419f: 0x00395c99, - 0x41a0: 0x00395c97, 0x41a1: 0x00395c98, 0x41a2: 0x0039629a, 0x41a3: 0x00396299, - 0x41a4: 0x00396297, 0x41a5: 0x00396298, 0x41a6: 0x00395a9a, 0x41a7: 0x00395a99, - 0x41a8: 0x00395a97, 0x41a9: 0x00395a98, 0x41aa: 0x003a049a, 0x41ab: 0x003a0499, - 0x41ac: 0x003a0497, 0x41ad: 0x003a0498, 0x41ae: 0x003a0a9a, 0x41af: 0x003a0a99, - 0x41b0: 0x003a0a97, 0x41b1: 0x003a0a98, 0x41b2: 0x0039689a, 0x41b3: 0x00396899, - 0x41b4: 0x00396897, 0x41b5: 0x00396898, 0x41b6: 0x0039669a, 0x41b7: 0x00396699, - 0x41b8: 0x00396697, 0x41b9: 0x00396698, 0x41ba: 0x00396a9a, 0x41bb: 0x00396a99, - 0x41bc: 0x00396a97, 0x41bd: 0x00396a98, 0x41be: 0x00396e9a, 0x41bf: 0x00396e99, - // Block 0x107, offset 0x41c0 - 0x41c0: 0x00396e97, 0x41c1: 0x00396e98, 0x41c2: 0x0039969a, 0x41c3: 0x00399699, - 0x41c4: 0x0039949a, 0x41c5: 0x00399499, 0x41c6: 0x0039989a, 0x41c7: 0x00399899, - 0x41c8: 0x00398c9a, 0x41c9: 0x00398c99, 0x41ca: 0x0039b69a, 0x41cb: 0x0039b699, - 0x41cc: 0x0039a89a, 0x41cd: 0x0039a899, 0x41ce: 0x003a1c9a, 0x41cf: 0x003a1c99, - 0x41d0: 0x003a1c97, 0x41d1: 0x003a1c98, 0x41d2: 0x003a2a9a, 0x41d3: 0x003a2a99, - 0x41d4: 0x003a2a97, 0x41d5: 0x003a2a98, 0x41d6: 0x003a329a, 0x41d7: 0x003a3299, - 0x41d8: 0x003a3297, 0x41d9: 0x003a3298, 0x41da: 0x003a2e9a, 0x41db: 0x003a2e99, - 0x41dc: 0x003a2e97, 0x41dd: 0x003a2e98, 0x41de: 0x003a589a, 0x41df: 0x003a5899, - 0x41e0: 0x003a5a9a, 0x41e1: 0x003a5a99, 0x41e2: 0x003a5a97, 0x41e3: 0x003a5a98, - 0x41e4: 0xf0001a1a, 0x41e5: 0xf0001919, 0x41e6: 0x003a6c9a, 0x41e7: 0x003a6c99, - 0x41e8: 0x003a6c97, 0x41e9: 0x003a6c98, 0x41ea: 0x003a6a9a, 0x41eb: 0x003a6a99, - 0x41ec: 0x003a6a97, 0x41ed: 0x003a6a98, 0x41ee: 0x003aaa9a, 0x41ef: 0x003aaa99, - 0x41f0: 0xf0001a1a, 0x41f1: 0xf0001919, 0x41f2: 0x40071820, 0x41f3: 0x40071a20, - 0x41f4: 0x40071c20, 0x41f5: 0x40071e20, 0x41f6: 0x40072020, 0x41f7: 0x40072220, - 0x41f8: 0x40072420, 0x41f9: 0x40072620, 0x41fa: 0x40072820, 0x41fb: 0x40072a20, - 0x41fc: 0x40072c20, 0x41fd: 0x40072e20, 0x41fe: 0x40073020, 0x41ff: 0x40073220, - // Block 0x108, offset 0x4200 - 0x4200: 0x40073420, 0x4201: 0x40073620, - 0x4213: 0x003a269a, - 0x4214: 0x003a2699, 0x4215: 0x003a2697, 0x4216: 0x003a2698, 0x4217: 0x003a7c9a, - 0x4218: 0x003a7c99, 0x4219: 0x003a7a9a, 0x421a: 0x003a7a99, 0x421b: 0x003a7e9a, - 0x421c: 0x003a7e99, 0x421d: 0xf0001a1a, 0x421e: 0x003a849a, 0x421f: 0x003a8499, - 0x4220: 0x003a789a, 0x4221: 0x003a7899, 0x4222: 0x003a809a, 0x4223: 0x003a8099, - 0x4224: 0x003a989a, 0x4225: 0x003a9899, 0x4226: 0x003a9897, 0x4227: 0x003a9898, - 0x4228: 0x003a8e97, 0x4229: 0x003a8e98, 0x422a: 0xe0001559, 0x422b: 0xe0001556, - 0x422c: 0xe0001589, 0x422d: 0xe0001586, 0x422e: 0xe000158f, 0x422f: 0xe000158c, - 0x4230: 0xe000159b, 0x4231: 0xe0001598, 0x4232: 0xe0001595, 0x4233: 0xe0001592, - 0x4234: 0xe00015a1, 0x4235: 0xe000159e, 0x4236: 0xe00015bf, 0x4237: 0xe00015bc, - 0x4238: 0xe00015b9, 0x4239: 0xe00015ad, 0x423a: 0xe00015a7, 0x423b: 0xe00015a4, - 0x423c: 0x003a929a, 0x423d: 0x003a9299, 0x423e: 0x003a9297, 0x423f: 0x003a9298, - // Block 0x109, offset 0x4240 - 0x4240: 0xe000155f, 0x4241: 0xe0001565, 0x4242: 0xe000157a, 0x4243: 0xe00015b0, - 0x4244: 0xe00015b6, 0x4245: 0xf0001a1a, 0x4246: 0xf0001a1a, 0x4247: 0xf0001a1a, - 0x4248: 0xf0001a1a, 0x4249: 0xf0001a1a, 0x424a: 0xf0001a1a, 0x424b: 0xf0001a1a, - 0x424c: 0xf0001a1a, 0x424d: 0xf0001a1a, 0x424e: 0xf0001a1a, 0x424f: 0xf0001a1a, - 0x4250: 0xf0001a1a, 0x4251: 0xf0001a1a, 0x4252: 0xf0001a1a, 0x4253: 0xf0001a1a, - 0x4254: 0xf0001a1a, 0x4255: 0xf0001a1a, 0x4256: 0xf0001a1a, 0x4257: 0xf0001a1a, - 0x4258: 0xf0001a1a, 0x4259: 0xf0001a1a, 0x425a: 0xf0001a1a, 0x425b: 0xf0001a1a, - 0x425c: 0xf0001a1a, 0x425d: 0xf0001a1a, 0x425e: 0xf0001a1a, 0x425f: 0xf0001a1a, - 0x4260: 0xf0001a1a, 0x4261: 0xf0001a1a, 0x4262: 0xf0001a1a, 0x4263: 0xf0001a1a, - 0x4264: 0xf0001a1a, 0x4265: 0xf0001a1a, 0x4266: 0xf0001a1a, 0x4267: 0xf0001a1a, - 0x4268: 0xf0001a1a, 0x4269: 0xf0001a1a, 0x426a: 0xf0001a1a, 0x426b: 0xf0001a1a, - 0x426c: 0xf0001a1a, 0x426d: 0xf0001a1a, 0x426e: 0xf0001a1a, 0x426f: 0xf0001a1a, - 0x4270: 0xf0001a1a, 0x4271: 0xf0001a1a, 0x4272: 0xf0001a1a, 0x4273: 0xf0001a1a, - 0x4274: 0xf0001a1a, 0x4275: 0xf0001a1a, 0x4276: 0xf0001a1a, 0x4277: 0xf0001a1a, - 0x4278: 0xf0001a1a, 0x4279: 0xf0001a1a, 0x427a: 0xf0001a1a, 0x427b: 0xf0001a1a, - 0x427c: 0xf0001a1a, 0x427d: 0xf0001a1a, 0x427e: 0xf0001a1a, 0x427f: 0xf0001a1a, - // Block 0x10a, offset 0x4280 - 0x4280: 0xf0001a1a, 0x4281: 0xf0001a1a, 0x4282: 0xf0001a1a, 0x4283: 0xf0001a1a, - 0x4284: 0xf0001a1a, 0x4285: 0xf0001a1a, 0x4286: 0xf0001a1a, 0x4287: 0xf0001a1a, - 0x4288: 0xf0001a1a, 0x4289: 0xf0001a1a, 0x428a: 0xf0001a1a, 0x428b: 0xf0001a1a, - 0x428c: 0xf0001a1a, 0x428d: 0xf0001a1a, 0x428e: 0xf0001a1a, 0x428f: 0xf0001a1a, - 0x4290: 0xf0001a1a, 0x4291: 0xf0001a1a, 0x4292: 0xf0001a1a, 0x4293: 0xf0001a1a, - 0x4294: 0xf0001a1a, 0x4295: 0xf0001a1a, 0x4296: 0xf0001a1a, 0x4297: 0xf0001a1a, - 0x4298: 0xf0001a1a, 0x4299: 0xf0001a1a, 0x429a: 0xf0001a1a, 0x429b: 0xf0001a1a, - 0x429c: 0xf0001a1a, 0x429d: 0xf0001a1a, 0x429e: 0xe0000003, 0x429f: 0xe0000006, - 0x42a0: 0xe0000009, 0x42a1: 0xe000000c, 0x42a2: 0xe000000f, 0x42a3: 0xe0000012, - 0x42a4: 0xe000156b, 0x42a5: 0xe000156e, 0x42a6: 0xe0001577, 0x42a7: 0xe000157d, - 0x42a8: 0xe00015aa, 0x42a9: 0xe00015b3, 0x42aa: 0xf0001919, 0x42ab: 0xf0001919, - 0x42ac: 0xf0001919, 0x42ad: 0xf0001919, 0x42ae: 0xf0001919, 0x42af: 0xf0001919, - 0x42b0: 0xf0001919, 0x42b1: 0xf0001919, 0x42b2: 0xf0001919, 0x42b3: 0xf0001919, - 0x42b4: 0xf0001919, 0x42b5: 0xf0001919, 0x42b6: 0xf0001919, 0x42b7: 0xf0001919, - 0x42b8: 0xf0001919, 0x42b9: 0xf0001919, 0x42ba: 0xf0001919, 0x42bb: 0xf0001919, - 0x42bc: 0xf0001919, 0x42bd: 0xf0001919, 0x42be: 0xf0001919, 0x42bf: 0xf0001919, - // Block 0x10b, offset 0x42c0 - 0x42c0: 0xf0001919, 0x42c1: 0xf0001919, 0x42c2: 0xf0001919, 0x42c3: 0xf0001919, - 0x42c4: 0xf0001919, 0x42c5: 0xf0001919, 0x42c6: 0xf0001919, 0x42c7: 0xf0001919, - 0x42c8: 0xf0001919, 0x42c9: 0xf0001919, 0x42ca: 0xf0001919, 0x42cb: 0xf0001919, - 0x42cc: 0xf0001919, 0x42cd: 0xf0001919, 0x42ce: 0xf0001919, 0x42cf: 0xf0001919, - 0x42d0: 0xf0001919, 0x42d1: 0xf0001919, 0x42d2: 0xf0001919, 0x42d3: 0xf0001919, - 0x42d4: 0xf0001919, 0x42d5: 0xf0001919, 0x42d6: 0xf0001919, 0x42d7: 0xe000155c, - 0x42d8: 0xe0001562, 0x42d9: 0xe0001568, 0x42da: 0xe0001571, 0x42db: 0xe0001580, - 0x42dc: 0xf0001717, 0x42dd: 0xf0001717, 0x42de: 0xf0001717, 0x42df: 0xf0001717, - 0x42e0: 0xf0001717, 0x42e1: 0xf0001717, 0x42e2: 0xf0001717, 0x42e3: 0xf0001717, - 0x42e4: 0xf0001717, 0x42e5: 0xf0001717, 0x42e6: 0xf0001717, 0x42e7: 0xf0001717, - 0x42e8: 0xf0001717, 0x42e9: 0xf0001717, 0x42ea: 0xf0001717, 0x42eb: 0xf0001717, - 0x42ec: 0xf0001717, 0x42ed: 0xf0001717, 0x42ee: 0xf0001717, 0x42ef: 0xf0001717, - 0x42f0: 0xf0001717, 0x42f1: 0xf0001717, 0x42f2: 0xf0001717, 0x42f3: 0xf0001717, - 0x42f4: 0xf0001717, 0x42f5: 0xf0001717, 0x42f6: 0xf0001717, 0x42f7: 0xf0001717, - 0x42f8: 0xf0001717, 0x42f9: 0xf0001717, 0x42fa: 0xf0001717, 0x42fb: 0xf0001717, - 0x42fc: 0xf0001717, 0x42fd: 0xf0001717, 0x42fe: 0xf0001717, 0x42ff: 0xf0001717, - // Block 0x10c, offset 0x4300 - 0x4300: 0xf0001717, 0x4301: 0xf0001717, 0x4302: 0xf0001717, 0x4303: 0xf0001717, - 0x4304: 0xf0001717, 0x4305: 0xf0001717, 0x4306: 0xf0001717, 0x4307: 0xf0001717, - 0x4308: 0xf0001717, 0x4309: 0xf0001717, 0x430a: 0xf0001717, 0x430b: 0xf0001717, - 0x430c: 0xf0001717, 0x430d: 0xf0001717, 0x430e: 0xf0001717, 0x430f: 0xf0001717, - 0x4310: 0xf0001717, 0x4311: 0xf0001717, 0x4312: 0xf0001717, 0x4313: 0xf0001717, - 0x4314: 0xf0001717, 0x4315: 0xf0001717, 0x4316: 0xf0001717, 0x4317: 0xf0001717, - 0x4318: 0xf0001717, 0x4319: 0xf0001717, 0x431a: 0xf0001717, 0x431b: 0xf0001717, - 0x431c: 0xf0001717, 0x431d: 0xf0001717, 0x431e: 0xf0001717, 0x431f: 0xe0001574, - 0x4320: 0xe0001583, 0x4321: 0xf0001818, 0x4322: 0xf0001818, 0x4323: 0xf0001818, - 0x4324: 0xf0001818, 0x4325: 0xf0001818, 0x4326: 0xf0001818, 0x4327: 0xf0001818, - 0x4328: 0xf0001818, 0x4329: 0xf0001818, 0x432a: 0xf0001818, 0x432b: 0xf0001818, - 0x432c: 0xf0001818, 0x432d: 0xf0001818, 0x432e: 0xf0001818, 0x432f: 0xf0001818, - 0x4330: 0xf0001818, 0x4331: 0xf0001818, 0x4332: 0xf0001818, 0x4333: 0xf0001818, - 0x4334: 0xf0001818, 0x4335: 0xf0001a1a, 0x4336: 0xf0001a1a, 0x4337: 0xf0001a1a, - 0x4338: 0xf0001a1a, 0x4339: 0xf0001a1a, 0x433a: 0xf0001a1a, 0x433b: 0xf0001a1a, - 0x433c: 0xf0001a1a, 0x433d: 0xf0001a1a, 0x433e: 0xf0001a1a, 0x433f: 0xf0001a1a, - // Block 0x10d, offset 0x4340 - 0x4340: 0xf0001a1a, 0x4341: 0xf0001a1a, 0x4342: 0xf0001a1a, 0x4343: 0xf0001a1a, - 0x4344: 0xf0001a1a, 0x4345: 0xf0001a1a, 0x4346: 0xf0001a1a, 0x4347: 0xf0001a1a, - 0x4348: 0xf0001a1a, 0x4349: 0xf0001a1a, 0x434a: 0xf0001a1a, 0x434b: 0xf0001a1a, - 0x434c: 0xf0001a1a, 0x434d: 0xf0001a1a, 0x434e: 0xf0001a1a, 0x434f: 0xf0001a1a, - 0x4350: 0xf0001a1a, 0x4351: 0xf0001919, 0x4352: 0xf0001919, 0x4353: 0xf0001919, - 0x4354: 0xf0001919, 0x4355: 0xf0001919, 0x4356: 0xf0001919, 0x4357: 0xf0001919, - 0x4358: 0xf0001919, 0x4359: 0xf0001919, 0x435a: 0xf0001919, 0x435b: 0xf0001919, - 0x435c: 0xf0001919, 0x435d: 0xf0001919, 0x435e: 0xf0001919, 0x435f: 0xf0001919, - 0x4360: 0xf0001919, 0x4361: 0xf0001919, 0x4362: 0xf0001919, 0x4363: 0xf0001919, - 0x4364: 0xf0001919, 0x4365: 0xf0001919, 0x4366: 0xf0001919, 0x4367: 0xf0001919, - 0x4368: 0xf0001919, 0x4369: 0xf0001919, 0x436a: 0xf0001919, 0x436b: 0xf0001919, - 0x436c: 0xf0001919, 0x436d: 0xf0001717, 0x436e: 0xf0001717, 0x436f: 0xf0001717, - 0x4370: 0xf0001717, 0x4371: 0xf0001717, 0x4372: 0xf0001717, 0x4373: 0xf0001717, - 0x4374: 0xf0001818, 0x4375: 0xf0001818, 0x4376: 0xf0001818, 0x4377: 0xf0001818, - 0x4378: 0xf0001818, 0x4379: 0xf0001818, 0x437a: 0xf0001818, 0x437b: 0xf0001818, - 0x437c: 0xf0001919, 0x437d: 0xf0001a1a, 0x437e: 0x4004c020, 0x437f: 0x4004c220, - // Block 0x10e, offset 0x4380 - 0x4390: 0xe00015d4, 0x4391: 0xe00015e4, 0x4392: 0xe00015e0, 0x4393: 0xe00015e8, - 0x4394: 0xe00015ec, 0x4395: 0xe00015f8, 0x4396: 0xe00015fc, 0x4397: 0xe0001600, - 0x4398: 0xe0001621, 0x4399: 0xe000161d, 0x439a: 0xe0001635, 0x439b: 0xe0001631, - 0x439c: 0xe0001646, 0x439d: 0xe000163e, 0x439e: 0xe0001642, 0x439f: 0xe000165a, - 0x43a0: 0xe0001656, 0x43a1: 0xe0001652, 0x43a2: 0xe0001662, 0x43a3: 0xe000165e, - 0x43a4: 0xe000168a, 0x43a5: 0xe0001686, 0x43a6: 0xe00016b6, 0x43a7: 0xe000166e, - 0x43a8: 0xe000166a, 0x43a9: 0xe0001666, 0x43aa: 0xe000167a, 0x43ab: 0xe0001676, - 0x43ac: 0xe0001682, 0x43ad: 0xe000167e, 0x43ae: 0xe00016ba, 0x43af: 0xe00016c6, - 0x43b0: 0xe00016c2, 0x43b1: 0xe00016ce, 0x43b2: 0xe00016ca, 0x43b3: 0xe00016d2, - 0x43b4: 0xe00016d6, 0x43b5: 0xe00016de, 0x43b6: 0xe00016eb, 0x43b7: 0xe00016e7, - 0x43b8: 0xe00016ef, 0x43b9: 0xe00016f7, 0x43ba: 0xe00016ff, 0x43bb: 0xe00016fb, - 0x43bc: 0xe0001707, 0x43bd: 0xe0001703, 0x43be: 0xe0001717, 0x43bf: 0xe000171b, - // Block 0x10f, offset 0x43c0 - 0x43c0: 0xe0001759, 0x43c1: 0xe0001761, 0x43c2: 0xe000175d, 0x43c3: 0xe0001741, - 0x43c4: 0xe0001745, 0x43c5: 0xe0001769, 0x43c6: 0xe0001765, 0x43c7: 0xe0001771, - 0x43c8: 0xe000176d, 0x43c9: 0xe000178c, 0x43ca: 0xe0001790, 0x43cb: 0xe0001799, - 0x43cc: 0xe000177c, 0x43cd: 0xe0001784, 0x43ce: 0xe000179d, 0x43cf: 0xe00017a1, - 0x43d2: 0xe0001780, 0x43d3: 0xe00017d9, - 0x43d4: 0xe00017dd, 0x43d5: 0xe00017c5, 0x43d6: 0xe00017c9, 0x43d7: 0xe00017b9, - 0x43d8: 0xe00017b5, 0x43d9: 0xe00017bd, 0x43da: 0xe00017d5, 0x43db: 0xe00017d1, - 0x43dc: 0xe00017f8, 0x43dd: 0xe00017f4, 0x43de: 0xe00015d0, 0x43df: 0xe00015dc, - 0x43e0: 0xe00015d8, 0x43e1: 0xe00015f4, 0x43e2: 0xe00015f0, 0x43e3: 0xe0001608, - 0x43e4: 0xe0001604, 0x43e5: 0xe0001629, 0x43e6: 0xe000160c, 0x43e7: 0xe0001625, - 0x43e8: 0xe000164a, 0x43e9: 0xe000168e, 0x43ea: 0xe0001672, 0x43eb: 0xe00016be, - 0x43ec: 0xe0001751, 0x43ed: 0xe0001775, 0x43ee: 0xe00017f0, 0x43ef: 0xe00017ec, - 0x43f0: 0xe00017fc, 0x43f1: 0xe00017a9, 0x43f2: 0xe000171f, 0x43f3: 0xe00017cd, - 0x43f4: 0xe0001713, 0x43f5: 0xe0001755, 0x43f6: 0xe00016f3, 0x43f7: 0xe000172b, - 0x43f8: 0xe00017ad, 0x43f9: 0xe00017a5, 0x43fa: 0xe0001749, 0x43fb: 0xe0001727, - 0x43fc: 0xe000174d, 0x43fd: 0xe00017b1, 0x43fe: 0xe0001610, 0x43ff: 0xe000162d, - // Block 0x110, offset 0x4400 - 0x4400: 0xe0001788, 0x4401: 0xe000170b, 0x4402: 0xe00015cc, 0x4403: 0xe0001723, - 0x4404: 0xe00016da, 0x4405: 0xe00016b2, 0x4406: 0xe000164e, 0x4407: 0xe00017c1, - 0x4430: 0xe00016ae, 0x4431: 0xe000170f, 0x4432: 0xe00015c7, 0x4433: 0xe00015c2, - 0x4434: 0xe0001794, 0x4435: 0xe0001692, 0x4436: 0xe0001639, 0x4437: 0xe00016e2, - 0x4438: 0xe00017e7, 0x4439: 0xe0001697, 0x443a: 0xe000169b, 0x443b: 0xe0001614, - 0x443c: 0x40282e20, 0x443d: 0x40071620, - // Block 0x111, offset 0x4440 - 0x4440: 0xa0000000, 0x4441: 0xa0000000, 0x4442: 0xa0000000, 0x4443: 0xa0000000, - 0x4444: 0xa0000000, 0x4445: 0xa0000000, 0x4446: 0xa0000000, 0x4447: 0xa0000000, - 0x4448: 0xa0000000, 0x4449: 0xa0000000, 0x444a: 0xa0000000, 0x444b: 0xa0000000, - 0x444c: 0xa0000000, 0x444d: 0xa0000000, 0x444e: 0xa0000000, 0x444f: 0xa0000000, - 0x4450: 0x00024096, 0x4451: 0x00025c96, 0x4452: 0x00030496, 0x4453: 0x00026c96, - 0x4454: 0x00026296, 0x4455: 0x0002ba96, 0x4456: 0x0002c496, 0x4457: 0x0004b496, - 0x4458: 0x0004b696, 0x4459: 0xf0001616, - 0x4460: 0xae608202, 0x4461: 0xae600000, 0x4462: 0xae608102, 0x4463: 0xae600000, - 0x4464: 0xae600000, 0x4465: 0xae600000, 0x4466: 0xae600000, - 0x4470: 0xf0001f16, 0x4471: 0x00022c96, 0x4472: 0x00022a96, 0x4473: 0x00021696, - 0x4474: 0x00021696, 0x4475: 0x0003f496, 0x4476: 0x0003f696, 0x4477: 0x0003fc96, - 0x4478: 0x0003fe96, 0x4479: 0x0004b096, 0x447a: 0x0004b296, 0x447b: 0x0004ac96, - 0x447c: 0x0004ae96, 0x447d: 0x0004a096, 0x447e: 0x0004a296, 0x447f: 0x00049c96, - // Block 0x112, offset 0x4480 - 0x4480: 0x00049e96, 0x4481: 0x0004a496, 0x4482: 0x0004a696, 0x4483: 0x0004a896, - 0x4484: 0x0004aa96, 0x4485: 0x40025e20, 0x4486: 0x40026020, 0x4487: 0x0003f896, - 0x4488: 0x0003fa96, 0x4489: 0x00021484, 0x448a: 0x00021484, 0x448b: 0x00021484, - 0x448c: 0x00021484, 0x448d: 0x00021684, 0x448e: 0x00021684, 0x448f: 0x00021684, - 0x4490: 0x0002408f, 0x4491: 0x00025c8f, 0x4492: 0x0002e48f, - 0x4494: 0x0002628f, 0x4495: 0x00026c8f, 0x4496: 0x0002c48f, 0x4497: 0x0002ba8f, - 0x4498: 0x00022c8f, 0x4499: 0x0003f48f, 0x449a: 0x0003f68f, 0x449b: 0x0003fc8f, - 0x449c: 0x0003fe8f, 0x449d: 0x0004b08f, 0x449e: 0x0004b28f, 0x449f: 0x0004ea8f, - 0x44a0: 0x0004e68f, 0x44a1: 0x0004d88f, 0x44a2: 0x0009388f, 0x44a3: 0x00021a8f, - 0x44a4: 0x0009408f, 0x44a5: 0x0009448f, 0x44a6: 0x0009428f, - 0x44a8: 0x0004e48f, 0x44a9: 0x0027de8f, 0x44aa: 0x0004ec8f, 0x44ab: 0x0004d68f, - 0x44b0: 0xa000a21a, 0x44b1: 0xa000a218, 0x44b2: 0xa000a51a, 0x44b3: 0xa0000000, - 0x44b4: 0xa000a91a, 0x44b6: 0xa000ad1a, 0x44b7: 0xa000ad18, - 0x44b8: 0xa000b21a, 0x44b9: 0xa000b218, 0x44ba: 0xa000b61a, 0x44bb: 0xa000b618, - 0x44bc: 0xa000ba1a, 0x44bd: 0xa000ba18, 0x44be: 0xa000bc1a, 0x44bf: 0xa000bc18, - // Block 0x113, offset 0x44c0 - 0x44c0: 0x00391c9a, 0x44c1: 0x00391e9a, 0x44c2: 0x00391e99, 0x44c3: 0x0039209a, - 0x44c4: 0x00392099, 0x44c5: 0x0039269a, 0x44c6: 0x00392699, 0x44c7: 0x0039289a, - 0x44c8: 0x00392899, 0x44c9: 0x0039309a, 0x44ca: 0x00393099, 0x44cb: 0x00393097, - 0x44cc: 0x00393098, 0x44cd: 0x0039389a, 0x44ce: 0x00393899, 0x44cf: 0x00393c9a, - 0x44d0: 0x00393c99, 0x44d1: 0x00393c97, 0x44d2: 0x00393c98, 0x44d3: 0x0039549a, - 0x44d4: 0x00395499, 0x44d5: 0x0039569a, 0x44d6: 0x00395699, 0x44d7: 0x00395697, - 0x44d8: 0x00395698, 0x44d9: 0x0039589a, 0x44da: 0x00395899, 0x44db: 0x00395897, - 0x44dc: 0x00395898, 0x44dd: 0x0039649a, 0x44de: 0x00396499, 0x44df: 0x00396497, - 0x44e0: 0x00396498, 0x44e1: 0x0039729a, 0x44e2: 0x00397299, 0x44e3: 0x00397297, - 0x44e4: 0x00397298, 0x44e5: 0x0039749a, 0x44e6: 0x00397499, 0x44e7: 0x00397497, - 0x44e8: 0x00397498, 0x44e9: 0x0039889a, 0x44ea: 0x00398899, 0x44eb: 0x00398a9a, - 0x44ec: 0x00398a99, 0x44ed: 0x0039a49a, 0x44ee: 0x0039a499, 0x44ef: 0x0039a69a, - 0x44f0: 0x0039a699, 0x44f1: 0x0039c69a, 0x44f2: 0x0039c699, 0x44f3: 0x0039c697, - 0x44f4: 0x0039c698, 0x44f5: 0x0039c89a, 0x44f6: 0x0039c899, 0x44f7: 0x0039c897, - 0x44f8: 0x0039c898, 0x44f9: 0x0039dc9a, 0x44fa: 0x0039dc99, 0x44fb: 0x0039dc97, - 0x44fc: 0x0039dc98, 0x44fd: 0x0039de9a, 0x44fe: 0x0039de99, 0x44ff: 0x0039de97, - // Block 0x114, offset 0x4500 - 0x4500: 0x0039de98, 0x4501: 0x0039e69a, 0x4502: 0x0039e699, 0x4503: 0x0039e697, - 0x4504: 0x0039e698, 0x4505: 0x0039e89a, 0x4506: 0x0039e899, 0x4507: 0x0039e897, - 0x4508: 0x0039e898, 0x4509: 0x0039ee9a, 0x450a: 0x0039ee99, 0x450b: 0x0039ee97, - 0x450c: 0x0039ee98, 0x450d: 0x0039f09a, 0x450e: 0x0039f099, 0x450f: 0x0039f097, - 0x4510: 0x0039f098, 0x4511: 0x0039fc9a, 0x4512: 0x0039fc99, 0x4513: 0x0039fc97, - 0x4514: 0x0039fc98, 0x4515: 0x003a129a, 0x4516: 0x003a1299, 0x4517: 0x003a1297, - 0x4518: 0x003a1298, 0x4519: 0x003a1a9a, 0x451a: 0x003a1a99, 0x451b: 0x003a1a97, - 0x451c: 0x003a1a98, 0x451d: 0x003a409a, 0x451e: 0x003a4099, 0x451f: 0x003a4097, - 0x4520: 0x003a4098, 0x4521: 0x003a4e9a, 0x4522: 0x003a4e99, 0x4523: 0x003a4e97, - 0x4524: 0x003a4e98, 0x4525: 0x003a569a, 0x4526: 0x003a5699, 0x4527: 0x003a5697, - 0x4528: 0x003a5698, 0x4529: 0x003a689a, 0x452a: 0x003a6899, 0x452b: 0x003a6897, - 0x452c: 0x003a6898, 0x452d: 0x003a749a, 0x452e: 0x003a7499, 0x452f: 0x003a8e9a, - 0x4530: 0x003a8e99, 0x4531: 0x003a909a, 0x4532: 0x003a9099, 0x4533: 0x003a9097, - 0x4534: 0x003a9098, 0x4535: 0xe0001732, 0x4536: 0xe000172f, 0x4537: 0xe0001738, - 0x4538: 0xe0001735, 0x4539: 0xe000173e, 0x453a: 0xe000173b, 0x453b: 0xf0001a1a, - 0x453c: 0xf0001919, 0x453f: 0xa0000000, - // Block 0x115, offset 0x4540 - 0x4541: 0x0002ba83, 0x4542: 0x0003e083, 0x4543: 0x0004ea83, - 0x4544: 0x0027de83, 0x4545: 0x0004ec83, 0x4546: 0x0004e683, 0x4547: 0x0003d283, - 0x4548: 0x0003f483, 0x4549: 0x0003f683, 0x454a: 0x0004d883, 0x454b: 0x00093883, - 0x454c: 0x00024083, 0x454d: 0x00021a83, 0x454e: 0x0002e483, 0x454f: 0x0004e283, - 0x4550: 0x0029cc83, 0x4551: 0x0029ce83, 0x4552: 0x0029d083, 0x4553: 0x0029d283, - 0x4554: 0x0029d483, 0x4555: 0x0029d683, 0x4556: 0x0029d883, 0x4557: 0x0029da83, - 0x4558: 0x0029dc83, 0x4559: 0x0029de83, 0x455a: 0x00026c83, 0x455b: 0x00026283, - 0x455c: 0x00094083, 0x455d: 0x00094283, 0x455e: 0x00094483, 0x455f: 0x0002c483, - 0x4560: 0x0004d683, 0x4561: 0x002bde89, 0x4562: 0x002c0a89, 0x4563: 0x002c3a89, - 0x4564: 0x002c6289, 0x4565: 0x002c9889, 0x4566: 0x002d0889, 0x4567: 0x002d2289, - 0x4568: 0x002d6889, 0x4569: 0x002d9a89, 0x456a: 0x002dcc89, 0x456b: 0x002dfe89, - 0x456c: 0x002e2289, 0x456d: 0x002e8289, 0x456e: 0x002e9e89, 0x456f: 0x002ee289, - 0x4570: 0x002f2c89, 0x4571: 0x002f5689, 0x4572: 0x002f7a89, 0x4573: 0x002fe689, - 0x4574: 0x00302c89, 0x4575: 0x00306c89, 0x4576: 0x0030be89, 0x4577: 0x0030e289, - 0x4578: 0x0030f689, 0x4579: 0x00310089, 0x457a: 0x00312a89, 0x457b: 0x0003f883, - 0x457c: 0x0004e483, 0x457d: 0x0003fa83, 0x457e: 0x00062483, 0x457f: 0x00021683, - // Block 0x116, offset 0x4580 - 0x4580: 0x00061e83, 0x4581: 0x002bde83, 0x4582: 0x002c0a83, 0x4583: 0x002c3a83, - 0x4584: 0x002c6283, 0x4585: 0x002c9883, 0x4586: 0x002d0883, 0x4587: 0x002d2283, - 0x4588: 0x002d6883, 0x4589: 0x002d9a83, 0x458a: 0x002dcc83, 0x458b: 0x002dfe83, - 0x458c: 0x002e2283, 0x458d: 0x002e8283, 0x458e: 0x002e9e83, 0x458f: 0x002ee283, - 0x4590: 0x002f2c83, 0x4591: 0x002f5683, 0x4592: 0x002f7a83, 0x4593: 0x002fe683, - 0x4594: 0x00302c83, 0x4595: 0x00306c83, 0x4596: 0x0030be83, 0x4597: 0x0030e283, - 0x4598: 0x0030f683, 0x4599: 0x00310083, 0x459a: 0x00312a83, 0x459b: 0x0003fc83, - 0x459c: 0x00094883, 0x459d: 0x0003fe83, 0x459e: 0x00094c83, 0x459f: 0x00041883, - 0x45a0: 0x00041a83, 0x45a1: 0x00030492, 0x45a2: 0x0004a492, 0x45a3: 0x0004a692, - 0x45a4: 0x00025c92, 0x45a5: 0x00023e92, 0x45a6: 0x0065d692, 0x45a7: 0x00657690, - 0x45a8: 0x00657890, 0x45a9: 0x00657a90, 0x45aa: 0x00657e90, 0x45ab: 0x00658090, - 0x45ac: 0x0065be90, 0x45ad: 0x0065c090, 0x45ae: 0x0065c490, 0x45af: 0x00659a90, - 0x45b0: 0x0027d692, 0x45b1: 0x00657692, 0x45b2: 0x00657892, 0x45b3: 0x00657a92, - 0x45b4: 0x00657e92, 0x45b5: 0x00658092, 0x45b6: 0x00658292, 0x45b7: 0x00658492, - 0x45b8: 0x00658692, 0x45b9: 0x00658892, 0x45ba: 0x00658a92, 0x45bb: 0x00658c92, - 0x45bc: 0x00658e92, 0x45bd: 0x00659092, 0x45be: 0x00659292, 0x45bf: 0x00659492, - // Block 0x117, offset 0x45c0 - 0x45c0: 0x00659692, 0x45c1: 0x00659892, 0x45c2: 0x00659a92, 0x45c3: 0x00659c92, - 0x45c4: 0x00659e92, 0x45c5: 0x0065a092, 0x45c6: 0x0065a292, 0x45c7: 0x0065a492, - 0x45c8: 0x0065a692, 0x45c9: 0x0065a892, 0x45ca: 0x0065aa92, 0x45cb: 0x0065ac92, - 0x45cc: 0x0065ae92, 0x45cd: 0x0065b092, 0x45ce: 0x0065b292, 0x45cf: 0x0065b492, - 0x45d0: 0x0065b692, 0x45d1: 0x0065b892, 0x45d2: 0x0065ba92, 0x45d3: 0x0065bc92, - 0x45d4: 0x0065be92, 0x45d5: 0x0065c092, 0x45d6: 0x0065c492, 0x45d7: 0x0065c692, - 0x45d8: 0x0065c892, 0x45d9: 0x0065ca92, 0x45da: 0x0065cc92, 0x45db: 0x0065ce92, - 0x45dc: 0x0065d092, 0x45dd: 0x0065d892, 0x45de: 0xa0012812, 0x45df: 0xa0012912, - 0x45e0: 0x0063a692, 0x45e1: 0x0062ac92, 0x45e2: 0x0062ae92, 0x45e3: 0x00646892, - 0x45e4: 0x0062b092, 0x45e5: 0x00646c92, 0x45e6: 0x00646e92, 0x45e7: 0x0062b292, - 0x45e8: 0x0062b492, 0x45e9: 0x0062b692, 0x45ea: 0x00647492, 0x45eb: 0x00647692, - 0x45ec: 0x00647892, 0x45ed: 0x00647a92, 0x45ee: 0x00647c92, 0x45ef: 0x00647e92, - 0x45f0: 0x0062e092, 0x45f1: 0x0062b892, 0x45f2: 0x0062ba92, 0x45f3: 0x0062bc92, - 0x45f4: 0x0062ee92, 0x45f5: 0x0062be92, 0x45f6: 0x0062c092, 0x45f7: 0x0062c292, - 0x45f8: 0x0062c492, 0x45f9: 0x0062c692, 0x45fa: 0x0062c892, 0x45fb: 0x0062ca92, - 0x45fc: 0x0062cc92, 0x45fd: 0x0062ce92, 0x45fe: 0x0062d092, - // Block 0x118, offset 0x4600 - 0x4602: 0x0063a892, 0x4603: 0x0063aa92, - 0x4604: 0x0063ac92, 0x4605: 0x0063ae92, 0x4606: 0x0063b092, 0x4607: 0x0063b292, - 0x460a: 0x0063b492, 0x460b: 0x0063b692, - 0x460c: 0x0063b892, 0x460d: 0x0063ba92, 0x460e: 0x0063bc92, 0x460f: 0x0063be92, - 0x4612: 0x0063c092, 0x4613: 0x0063c292, - 0x4614: 0x0063c492, 0x4615: 0x0063c692, 0x4616: 0x0063c892, 0x4617: 0x0063ca92, - 0x461a: 0x0063cc92, 0x461b: 0x0063ce92, - 0x461c: 0x0063d092, - 0x4620: 0x0027dc83, 0x4621: 0x0027e083, 0x4622: 0x00094683, 0x4623: 0x00062683, - 0x4624: 0x00094a83, 0x4625: 0x0027e283, 0x4626: 0x00280883, - 0x4628: 0x000d3292, 0x4629: 0x00084492, 0x462a: 0x00084892, 0x462b: 0x00084692, - 0x462c: 0x00084a92, 0x462d: 0x000e6e92, 0x462e: 0x000ec492, - 0x4639: 0xa0000000, 0x463a: 0xa0000000, 0x463b: 0xa0000000, - 0x463c: 0x4027ae20, 0x463d: 0x4027b020, 0x463e: 0x00000285, 0x463f: 0x2bfffe85, - // Block 0x119, offset 0x4640 - 0x4640: 0x40731a20, 0x4641: 0x40731c20, 0x4642: 0x40731e20, 0x4643: 0x40732020, - 0x4644: 0x40732220, 0x4645: 0x40732420, 0x4646: 0x40732620, 0x4647: 0x40732820, - 0x4648: 0x40732a20, 0x4649: 0x40732c20, 0x464a: 0x40732e20, 0x464b: 0x40733020, - 0x464d: 0x40733220, 0x464e: 0x40733420, 0x464f: 0x40733620, - 0x4650: 0x40733820, 0x4651: 0x40733a20, 0x4652: 0x40733c20, 0x4653: 0x40733e20, - 0x4654: 0x40734020, 0x4655: 0x40734220, 0x4656: 0x40734420, 0x4657: 0x40734620, - 0x4658: 0x40734820, 0x4659: 0x40734a20, 0x465a: 0x40734c20, 0x465b: 0x40734e20, - 0x465c: 0x40735020, 0x465d: 0x40735220, 0x465e: 0x40735420, 0x465f: 0x40735620, - 0x4660: 0x40735820, 0x4661: 0x40735a20, 0x4662: 0x40735c20, 0x4663: 0x40735e20, - 0x4664: 0x40736020, 0x4665: 0x40736220, 0x4666: 0x40736420, - 0x4668: 0x40736620, 0x4669: 0x40736820, 0x466a: 0x40736a20, 0x466b: 0x40736c20, - 0x466c: 0x40736e20, 0x466d: 0x40737020, 0x466e: 0x40737220, 0x466f: 0x40737420, - 0x4670: 0x40737620, 0x4671: 0x40737820, 0x4672: 0x40737a20, 0x4673: 0x40737c20, - 0x4674: 0x40737e20, 0x4675: 0x40738020, 0x4676: 0x40738220, 0x4677: 0x40738420, - 0x4678: 0x40738620, 0x4679: 0x40738820, 0x467a: 0x40738a20, - 0x467c: 0x40738c20, 0x467d: 0x40738e20, 0x467f: 0x40739020, - // Block 0x11a, offset 0x4680 - 0x4680: 0x40739220, 0x4681: 0x40739420, 0x4682: 0x40739620, 0x4683: 0x40739820, - 0x4684: 0x40739a20, 0x4685: 0x40739c20, 0x4686: 0x40739e20, 0x4687: 0x4073a020, - 0x4688: 0x4073a220, 0x4689: 0x4073a420, 0x468a: 0x4073a620, 0x468b: 0x4073a820, - 0x468c: 0x4073aa20, 0x468d: 0x4073ac20, - 0x4690: 0x4073ae20, 0x4691: 0x4073b020, 0x4692: 0x4073b220, 0x4693: 0x4073b420, - 0x4694: 0x4073b620, 0x4695: 0x4073b820, 0x4696: 0x4073ba20, 0x4697: 0x4073bc20, - 0x4698: 0x4073be20, 0x4699: 0x4073c020, 0x469a: 0x4073c220, 0x469b: 0x4073c420, - 0x469c: 0x4073c620, 0x469d: 0x4073c820, - // Block 0x11b, offset 0x46c0 - 0x46c0: 0x4073ca20, 0x46c1: 0x4073cc20, 0x46c2: 0x4073ce20, 0x46c3: 0x4073d020, - 0x46c4: 0x4073d220, 0x46c5: 0x4073d420, 0x46c6: 0x4073d620, 0x46c7: 0x4073d820, - 0x46c8: 0x4073da20, 0x46c9: 0x4073dc20, 0x46ca: 0x4073de20, 0x46cb: 0x4073e020, - 0x46cc: 0x4073e220, 0x46cd: 0x4073e420, 0x46ce: 0x4073e620, 0x46cf: 0x4073e820, - 0x46d0: 0x4073ea20, 0x46d1: 0x4073ec20, 0x46d2: 0x4073ee20, 0x46d3: 0x4073f020, - 0x46d4: 0x4073f220, 0x46d5: 0x4073f420, 0x46d6: 0x4073f620, 0x46d7: 0x4073f820, - 0x46d8: 0x4073fa20, 0x46d9: 0x4073fc20, 0x46da: 0x4073fe20, 0x46db: 0x40740020, - 0x46dc: 0x40740220, 0x46dd: 0x40740420, 0x46de: 0x40740620, 0x46df: 0x40740820, - 0x46e0: 0x40740a20, 0x46e1: 0x40740c20, 0x46e2: 0x40740e20, 0x46e3: 0x40741020, - 0x46e4: 0x40741220, 0x46e5: 0x40741420, 0x46e6: 0x40741620, 0x46e7: 0x40741820, - 0x46e8: 0x40741a20, 0x46e9: 0x40741c20, 0x46ea: 0x40741e20, 0x46eb: 0x40742020, - 0x46ec: 0x40742220, 0x46ed: 0x40742420, 0x46ee: 0x40742620, 0x46ef: 0x40742820, - 0x46f0: 0x40742a20, 0x46f1: 0x40742c20, 0x46f2: 0x40742e20, 0x46f3: 0x40743020, - 0x46f4: 0x40743220, 0x46f5: 0x40743420, 0x46f6: 0x40743620, 0x46f7: 0x40743820, - 0x46f8: 0x40743a20, 0x46f9: 0x40743c20, 0x46fa: 0x40743e20, 0x46fb: 0x40744020, - 0x46fc: 0x40744220, 0x46fd: 0x40744420, 0x46fe: 0x40744620, 0x46ff: 0x40744820, - // Block 0x11c, offset 0x4700 - 0x4700: 0x40744a20, 0x4701: 0x40744c20, 0x4702: 0x40744e20, 0x4703: 0x40745020, - 0x4704: 0x40745220, 0x4705: 0x40745420, 0x4706: 0x40745620, 0x4707: 0x40745820, - 0x4708: 0x40745a20, 0x4709: 0x40745c20, 0x470a: 0x40745e20, 0x470b: 0x40746020, - 0x470c: 0x40746220, 0x470d: 0x40746420, 0x470e: 0x40746620, 0x470f: 0x40746820, - 0x4710: 0x40746a20, 0x4711: 0x40746c20, 0x4712: 0x40746e20, 0x4713: 0x40747020, - 0x4714: 0x40747220, 0x4715: 0x40747420, 0x4716: 0x40747620, 0x4717: 0x40747820, - 0x4718: 0x40747a20, 0x4719: 0x40747c20, 0x471a: 0x40747e20, 0x471b: 0x40748020, - 0x471c: 0x40748220, 0x471d: 0x40748420, 0x471e: 0x40748620, 0x471f: 0x40748820, - 0x4720: 0x40748a20, 0x4721: 0x40748c20, 0x4722: 0x40748e20, 0x4723: 0x40749020, - 0x4724: 0x40749220, 0x4725: 0x40749420, 0x4726: 0x40749620, 0x4727: 0x40749820, - 0x4728: 0x40749a20, 0x4729: 0x40749c20, 0x472a: 0x40749e20, 0x472b: 0x4074a020, - 0x472c: 0x4074a220, 0x472d: 0x4074a420, 0x472e: 0x4074a620, 0x472f: 0x4074a820, - 0x4730: 0x4074aa20, 0x4731: 0x4074ac20, 0x4732: 0x4074ae20, 0x4733: 0x4074b020, - 0x4734: 0x4074b220, 0x4735: 0x4074b420, 0x4736: 0x4074b620, 0x4737: 0x4074b820, - 0x4738: 0x4074ba20, 0x4739: 0x4074bc20, 0x473a: 0x4074be20, - // Block 0x11d, offset 0x4740 - 0x4740: 0x4003be20, 0x4741: 0x4003c020, 0x4742: 0x4003c220, - 0x4747: 0xe000026a, - 0x4748: 0xe0000382, 0x4749: 0xe000045c, 0x474a: 0xe0000531, 0x474b: 0xe00005fb, - 0x474c: 0xe00006c6, 0x474d: 0xe000076e, 0x474e: 0xe000081a, 0x474f: 0xe00008bf, - 0x4750: 0x4028ba20, 0x4751: 0x4028bc20, 0x4752: 0x4028be20, 0x4753: 0x4028c020, - 0x4754: 0x4028c220, 0x4755: 0x4028c420, 0x4756: 0x4028c620, 0x4757: 0x4028c820, - 0x4758: 0x4028ca20, 0x4759: 0x4028cc20, 0x475a: 0x4028ce20, 0x475b: 0x4028d020, - 0x475c: 0x4028d220, 0x475d: 0x4028d420, 0x475e: 0x4028d620, 0x475f: 0x4028d820, - 0x4760: 0x4028da20, 0x4761: 0x4028dc20, 0x4762: 0x4028de20, 0x4763: 0x4028e020, - 0x4764: 0x4028e220, 0x4765: 0x4028e420, 0x4766: 0x4028e620, 0x4767: 0x4028e820, - 0x4768: 0x4028ea20, 0x4769: 0x4028ec20, 0x476a: 0x4028ee20, 0x476b: 0x4028f020, - 0x476c: 0x4028f220, 0x476d: 0x4028f420, 0x476e: 0x4028f620, 0x476f: 0x4028f820, - 0x4770: 0x4028fa20, 0x4771: 0x4028fc20, 0x4772: 0x4028fe20, 0x4773: 0x40290020, - 0x4777: 0x401afe20, - 0x4778: 0x401b0020, 0x4779: 0x401b0220, 0x477a: 0x401b0420, 0x477b: 0x401b0620, - 0x477c: 0x401b0820, 0x477d: 0x401b0a20, 0x477e: 0x401b0c20, 0x477f: 0x401b0e20, - // Block 0x11e, offset 0x4780 - 0x4780: 0x40290220, 0x4781: 0x40290420, 0x4782: 0xe000026d, 0x4783: 0xe00005fe, - 0x4784: 0x40290620, 0x4785: 0x40290820, 0x4786: 0x40290a20, 0x4787: 0x40290c20, - 0x4788: 0xe0000601, 0x4789: 0x40290e20, 0x478a: 0x40291020, 0x478b: 0x40291220, - 0x478c: 0x40291420, 0x478d: 0x40291620, 0x478e: 0x40291820, 0x478f: 0xe0000604, - 0x4790: 0x40291a20, 0x4791: 0x40291c20, 0x4792: 0x40291e20, 0x4793: 0x40292020, - 0x4794: 0x40292220, 0x4795: 0x40292420, 0x4796: 0x40292620, 0x4797: 0x40292820, - 0x4798: 0xe0000270, 0x4799: 0xe0000273, 0x479a: 0xe0000276, 0x479b: 0xe0000385, - 0x479c: 0xe0000388, 0x479d: 0xe000038b, 0x479e: 0xe000038e, 0x479f: 0xe0000607, - 0x47a0: 0x40292a20, 0x47a1: 0x40292c20, 0x47a2: 0x40292e20, 0x47a3: 0x40293020, - 0x47a4: 0x40293220, 0x47a5: 0x40293420, 0x47a6: 0x40293620, 0x47a7: 0x40293820, - 0x47a8: 0x40293a20, 0x47a9: 0x40293c20, 0x47aa: 0x40293e20, 0x47ab: 0x40294020, - 0x47ac: 0x40294220, 0x47ad: 0x40294420, 0x47ae: 0x40294620, 0x47af: 0x40294820, - 0x47b0: 0x40294a20, 0x47b1: 0x40294c20, 0x47b2: 0x40294e20, 0x47b3: 0xe000060a, - 0x47b4: 0x40295020, 0x47b5: 0x40295220, 0x47b6: 0x40295420, 0x47b7: 0x40295620, - 0x47b8: 0x40295820, 0x47b9: 0x401b1020, 0x47ba: 0x401b1220, 0x47bb: 0x401b1420, - 0x47bc: 0x401b1620, 0x47bd: 0x401b1820, 0x47be: 0x401b1a20, 0x47bf: 0x401b1c20, - // Block 0x11f, offset 0x47c0 - 0x47c0: 0x401b1e20, 0x47c1: 0x401b2020, 0x47c2: 0x401b2220, 0x47c3: 0x401b2420, - 0x47c4: 0x401b2620, 0x47c5: 0x401b2820, 0x47c6: 0x401b2a20, 0x47c7: 0x401b2c20, - 0x47c8: 0x401b2e20, 0x47c9: 0x401b3020, 0x47ca: 0xe00001d6, - 0x47d0: 0x401b3220, 0x47d1: 0x401b3420, 0x47d2: 0x401b3620, 0x47d3: 0x401b3820, - 0x47d4: 0x401b3a20, 0x47d5: 0x401b3c20, 0x47d6: 0x401b3e20, 0x47d7: 0x401b4020, - 0x47d8: 0x401b4220, 0x47d9: 0x401b4420, 0x47da: 0x401b4620, 0x47db: 0x401b4820, - // Block 0x120, offset 0x4800 - 0x4810: 0x401b4a20, 0x4811: 0x401b4c20, 0x4812: 0x401b4e20, 0x4813: 0x401b5020, - 0x4814: 0x401b5220, 0x4815: 0x401b5420, 0x4816: 0x401b5620, 0x4817: 0x401b5820, - 0x4818: 0x401b5a20, 0x4819: 0x401b5c20, 0x481a: 0x401b5e20, 0x481b: 0x401b6020, - 0x481c: 0x401b6220, 0x481d: 0x401b6420, 0x481e: 0x401b6620, 0x481f: 0x401b6820, - 0x4820: 0x401b6a20, 0x4821: 0x401b6c20, 0x4822: 0x401b6e20, 0x4823: 0x401b7020, - 0x4824: 0x401b7220, 0x4825: 0x401b7420, 0x4826: 0x401b7620, 0x4827: 0x401b7820, - 0x4828: 0x401b7a20, 0x4829: 0x401b7c20, 0x482a: 0x401b7e20, 0x482b: 0x401b8020, - 0x482c: 0x401b8220, 0x482d: 0x401b8420, 0x482e: 0x401b8620, 0x482f: 0x401b8820, - 0x4830: 0x401b8a20, 0x4831: 0x401b8c20, 0x4832: 0x401b8e20, 0x4833: 0x401b9020, - 0x4834: 0x401b9220, 0x4835: 0x401b9420, 0x4836: 0x401b9620, 0x4837: 0x401b9820, - 0x4838: 0x401b9a20, 0x4839: 0x401b9c20, 0x483a: 0x401b9e20, 0x483b: 0x401ba020, - 0x483c: 0x401ba220, 0x483d: 0xadc13802, - // Block 0x121, offset 0x4840 - 0x4840: 0x4070b820, 0x4841: 0x4070ba20, 0x4842: 0x4070bc20, 0x4843: 0x4070be20, - 0x4844: 0x4070c020, 0x4845: 0x4070c220, 0x4846: 0x4070c420, 0x4847: 0x4070c620, - 0x4848: 0x4070c820, 0x4849: 0x4070ca20, 0x484a: 0x4070cc20, 0x484b: 0x4070ce20, - 0x484c: 0x4070d020, 0x484d: 0x4070d220, 0x484e: 0x4070d420, 0x484f: 0x4070d620, - 0x4850: 0x4070d820, 0x4851: 0x4070da20, 0x4852: 0x4070dc20, 0x4853: 0x4070de20, - 0x4854: 0x4070e020, 0x4855: 0x4070e220, 0x4856: 0x4070e420, 0x4857: 0x4070e620, - 0x4858: 0x4070e820, 0x4859: 0x4070ea20, 0x485a: 0x4070ec20, 0x485b: 0x4070ee20, - 0x485c: 0x4070f020, - 0x4860: 0x4070f220, 0x4861: 0x4070f420, 0x4862: 0x4070f620, 0x4863: 0x4070f820, - 0x4864: 0x4070fa20, 0x4865: 0x4070fc20, 0x4866: 0x4070fe20, 0x4867: 0x40710020, - 0x4868: 0x40710220, 0x4869: 0x40710420, 0x486a: 0x40710620, 0x486b: 0x40710820, - 0x486c: 0x40710a20, 0x486d: 0x40710c20, 0x486e: 0x40710e20, 0x486f: 0x40711020, - 0x4870: 0x40711220, 0x4871: 0x40711420, 0x4872: 0x40711620, 0x4873: 0x40711820, - 0x4874: 0x40711a20, 0x4875: 0x40711c20, 0x4876: 0x40711e20, 0x4877: 0x40712020, - 0x4878: 0x40712220, 0x4879: 0x40712420, 0x487a: 0x40712620, 0x487b: 0x40712820, - 0x487c: 0x40712a20, 0x487d: 0x40712c20, 0x487e: 0x40712e20, 0x487f: 0x40713020, - // Block 0x122, offset 0x4880 - 0x4880: 0x40713220, 0x4881: 0x40713420, 0x4882: 0x40713620, 0x4883: 0x40713820, - 0x4884: 0x40713a20, 0x4885: 0x40713c20, 0x4886: 0x40713e20, 0x4887: 0x40714020, - 0x4888: 0x40714220, 0x4889: 0x40714420, 0x488a: 0x40714620, 0x488b: 0x40714820, - 0x488c: 0x40714a20, 0x488d: 0x40714c20, 0x488e: 0x40714e20, 0x488f: 0x40715020, - 0x4890: 0x40715220, - // Block 0x123, offset 0x48c0 - 0x48c0: 0x40718820, 0x48c1: 0x40718a20, 0x48c2: 0x40718c20, 0x48c3: 0x40718e20, - 0x48c4: 0x40719020, 0x48c5: 0x40719220, 0x48c6: 0x40719420, 0x48c7: 0x40719620, - 0x48c8: 0x40719820, 0x48c9: 0x40719a20, 0x48ca: 0x40719c20, 0x48cb: 0x40719e20, - 0x48cc: 0x4071a020, 0x48cd: 0x4071a220, 0x48ce: 0x4071a420, 0x48cf: 0x4071a620, - 0x48d0: 0x4071a820, 0x48d1: 0x4071aa20, 0x48d2: 0x4071ac20, 0x48d3: 0x4071ae20, - 0x48d4: 0x4071b020, 0x48d5: 0x4071b220, 0x48d6: 0x4071b420, 0x48d7: 0x4071b620, - 0x48d8: 0x4071b820, 0x48d9: 0x4071ba20, 0x48da: 0x4071bc20, 0x48db: 0x4071be20, - 0x48dc: 0x4071c020, 0x48dd: 0x4071c220, 0x48de: 0x4071c420, - 0x48e0: 0xe0000279, 0x48e1: 0xe000060d, 0x48e2: 0x4028b620, 0x48e3: 0x4028b820, - 0x48f0: 0x4071c620, 0x48f1: 0x4071c820, 0x48f2: 0x4071ca20, 0x48f3: 0x4071cc20, - 0x48f4: 0x4071ce20, 0x48f5: 0x4071d020, 0x48f6: 0x4071d220, 0x48f7: 0x4071d420, - 0x48f8: 0x4071d620, 0x48f9: 0x4071d820, 0x48fa: 0x4071da20, 0x48fb: 0x4071dc20, - 0x48fc: 0x4071de20, 0x48fd: 0x4071e020, 0x48fe: 0x4071e220, 0x48ff: 0x4071e420, - // Block 0x124, offset 0x4900 - 0x4900: 0x4071e620, 0x4901: 0x4071e820, 0x4902: 0x4071ea20, 0x4903: 0x4071ec20, - 0x4904: 0x4071ee20, 0x4905: 0x4071f020, 0x4906: 0x4071f220, 0x4907: 0x4071f420, - 0x4908: 0x4071f620, 0x4909: 0x4071f820, 0x490a: 0x4071fa20, - // Block 0x125, offset 0x4940 - 0x4940: 0x40765020, 0x4941: 0x40765220, 0x4942: 0x40765420, 0x4943: 0x40765620, - 0x4944: 0x40765820, 0x4945: 0x40765a20, 0x4946: 0x40765c20, 0x4947: 0x40765e20, - 0x4948: 0x40766020, 0x4949: 0x40766220, 0x494a: 0x40766420, 0x494b: 0x40766620, - 0x494c: 0x40766820, 0x494d: 0x40766a20, 0x494e: 0x40766c20, 0x494f: 0x40766e20, - 0x4950: 0x40767020, 0x4951: 0x40767220, 0x4952: 0x40767420, 0x4953: 0x40767620, - 0x4954: 0x40767820, 0x4955: 0x40767a20, 0x4956: 0x40767c20, 0x4957: 0x40767e20, - 0x4958: 0x40768020, 0x4959: 0x40768220, 0x495a: 0x40768420, 0x495b: 0x40768620, - 0x495c: 0x40768820, 0x495d: 0x40768a20, 0x495f: 0x4003c420, - 0x4960: 0x40768c20, 0x4961: 0x40768e20, 0x4962: 0x40769020, 0x4963: 0x40769220, - 0x4964: 0x40769420, 0x4965: 0x40769620, 0x4966: 0x40769820, 0x4967: 0x40769a20, - 0x4968: 0x40769c20, 0x4969: 0x40769e20, 0x496a: 0x4076a020, 0x496b: 0x4076a220, - 0x496c: 0x4076a420, 0x496d: 0x4076a620, 0x496e: 0x4076a820, 0x496f: 0x4076aa20, - 0x4970: 0x4076ac20, 0x4971: 0x4076ae20, 0x4972: 0x4076b020, 0x4973: 0x4076b220, - 0x4974: 0x4076b420, 0x4975: 0x4076b620, 0x4976: 0x4076b820, 0x4977: 0x4076ba20, - 0x4978: 0x4076bc20, 0x4979: 0x4076be20, 0x497a: 0x4076c020, 0x497b: 0x4076c220, - 0x497c: 0x4076c420, 0x497d: 0x4076c620, 0x497e: 0x4076c820, 0x497f: 0x4076ca20, - // Block 0x126, offset 0x4980 - 0x4980: 0x4076cc20, 0x4981: 0x4076ce20, 0x4982: 0x4076d020, 0x4983: 0x4076d220, - 0x4988: 0x4076d420, 0x4989: 0x4076d620, 0x498a: 0x4076d820, 0x498b: 0x4076da20, - 0x498c: 0x4076dc20, 0x498d: 0x4076de20, 0x498e: 0x4076e020, 0x498f: 0x4076e220, - 0x4990: 0x4003c620, 0x4991: 0xe000027c, 0x4992: 0xe0000391, 0x4993: 0x40295a20, - 0x4994: 0x40295c20, 0x4995: 0x40295e20, - // Block 0x127, offset 0x49c0 - 0x49c0: 0x0071fc88, 0x49c1: 0x0071fe88, 0x49c2: 0x00720088, 0x49c3: 0x00720288, - 0x49c4: 0x00720488, 0x49c5: 0x00720688, 0x49c6: 0x00720888, 0x49c7: 0x00720a88, - 0x49c8: 0x00720c88, 0x49c9: 0x00720e88, 0x49ca: 0x00721088, 0x49cb: 0x00721288, - 0x49cc: 0x00721488, 0x49cd: 0x00721688, 0x49ce: 0x00721888, 0x49cf: 0x00721a88, - 0x49d0: 0x00721c88, 0x49d1: 0x00721e88, 0x49d2: 0x00722088, 0x49d3: 0x00722288, - 0x49d4: 0x00722488, 0x49d5: 0x00722688, 0x49d6: 0x00722888, 0x49d7: 0x00722a88, - 0x49d8: 0x00722c88, 0x49d9: 0x00722e88, 0x49da: 0x00723088, 0x49db: 0x00723288, - 0x49dc: 0x00723488, 0x49dd: 0x00723688, 0x49de: 0x00723888, 0x49df: 0x00723a88, - 0x49e0: 0x00723c88, 0x49e1: 0x00723e88, 0x49e2: 0x00724088, 0x49e3: 0x00724288, - 0x49e4: 0x00724488, 0x49e5: 0x00724688, 0x49e6: 0x00724888, 0x49e7: 0x00724a88, - 0x49e8: 0x4071fc20, 0x49e9: 0x4071fe20, 0x49ea: 0x40720020, 0x49eb: 0x40720220, - 0x49ec: 0x40720420, 0x49ed: 0x40720620, 0x49ee: 0x40720820, 0x49ef: 0x40720a20, - 0x49f0: 0x40720c20, 0x49f1: 0x40720e20, 0x49f2: 0x40721020, 0x49f3: 0x40721220, - 0x49f4: 0x40721420, 0x49f5: 0x40721620, 0x49f6: 0x40721820, 0x49f7: 0x40721a20, - 0x49f8: 0x40721c20, 0x49f9: 0x40721e20, 0x49fa: 0x40722020, 0x49fb: 0x40722220, - 0x49fc: 0x40722420, 0x49fd: 0x40722620, 0x49fe: 0x40722820, 0x49ff: 0x40722a20, - // Block 0x128, offset 0x4a00 - 0x4a00: 0x40722c20, 0x4a01: 0x40722e20, 0x4a02: 0x40723020, 0x4a03: 0x40723220, - 0x4a04: 0x40723420, 0x4a05: 0x40723620, 0x4a06: 0x40723820, 0x4a07: 0x40723a20, - 0x4a08: 0x40723c20, 0x4a09: 0x40723e20, 0x4a0a: 0x40724020, 0x4a0b: 0x40724220, - 0x4a0c: 0x40724420, 0x4a0d: 0x40724620, 0x4a0e: 0x40724820, 0x4a0f: 0x40724a20, - 0x4a10: 0x40724c20, 0x4a11: 0x40724e20, 0x4a12: 0x40725020, 0x4a13: 0x40725220, - 0x4a14: 0x40725420, 0x4a15: 0x40725620, 0x4a16: 0x40725820, 0x4a17: 0x40725a20, - 0x4a18: 0x40725c20, 0x4a19: 0x40725e20, 0x4a1a: 0x40726020, 0x4a1b: 0x40726220, - 0x4a1c: 0x40726420, 0x4a1d: 0x40726620, 0x4a1e: 0x40726820, 0x4a1f: 0x40726a20, - 0x4a20: 0x40726c20, 0x4a21: 0x40726e20, 0x4a22: 0x40727020, 0x4a23: 0x40727220, - 0x4a24: 0x40727420, 0x4a25: 0x40727620, 0x4a26: 0x40727820, 0x4a27: 0x40727a20, - 0x4a28: 0x40727c20, 0x4a29: 0x40727e20, 0x4a2a: 0x40728020, 0x4a2b: 0x40728220, - 0x4a2c: 0x40728420, 0x4a2d: 0x40728620, 0x4a2e: 0x40728820, 0x4a2f: 0x40728a20, - 0x4a30: 0x40728c20, 0x4a31: 0x40728e20, 0x4a32: 0x40729020, 0x4a33: 0x40729220, - 0x4a34: 0x40729420, 0x4a35: 0x40729620, 0x4a36: 0x40729820, 0x4a37: 0x40729a20, - 0x4a38: 0x40729c20, 0x4a39: 0x40729e20, 0x4a3a: 0x4072a020, 0x4a3b: 0x4072a220, - 0x4a3c: 0x4072a420, 0x4a3d: 0x4072a620, 0x4a3e: 0x4072a820, 0x4a3f: 0x4072aa20, - // Block 0x129, offset 0x4a40 - 0x4a40: 0x4072ac20, 0x4a41: 0x4072ae20, 0x4a42: 0x4072b020, 0x4a43: 0x4072b220, - 0x4a44: 0x4072b420, 0x4a45: 0x4072b620, 0x4a46: 0x4072b820, 0x4a47: 0x4072ba20, - 0x4a48: 0x4072bc20, 0x4a49: 0x4072be20, 0x4a4a: 0x4072c020, 0x4a4b: 0x4072c220, - 0x4a4c: 0x4072c420, 0x4a4d: 0x4072c620, 0x4a4e: 0x4072c820, 0x4a4f: 0x4072ca20, - 0x4a50: 0x4072cc20, 0x4a51: 0x4072ce20, 0x4a52: 0x4072d020, 0x4a53: 0x4072d220, - 0x4a54: 0x4072d420, 0x4a55: 0x4072d620, 0x4a56: 0x4072d820, 0x4a57: 0x4072da20, - 0x4a58: 0x4072dc20, 0x4a59: 0x4072de20, 0x4a5a: 0x4072e020, 0x4a5b: 0x4072e220, - 0x4a5c: 0x4072e420, 0x4a5d: 0x4072e620, - 0x4a60: 0xe0000167, 0x4a61: 0xe00001f5, 0x4a62: 0xe0000310, 0x4a63: 0xe00003ea, - 0x4a64: 0xe00004c5, 0x4a65: 0xe000058f, 0x4a66: 0xe000065a, 0x4a67: 0xe0000702, - 0x4a68: 0xe00007ae, 0x4a69: 0xe0000853, - // Block 0x12a, offset 0x4a80 - 0x4a80: 0x4074c020, 0x4a81: 0x4074c220, 0x4a82: 0x4074c420, 0x4a83: 0x4074c620, - 0x4a84: 0x4074c820, 0x4a85: 0x4074ca20, - 0x4a88: 0x4074cc20, 0x4a8a: 0x4074ce20, 0x4a8b: 0x4074d020, - 0x4a8c: 0x4074d220, 0x4a8d: 0x4074d420, 0x4a8e: 0x4074d620, 0x4a8f: 0x4074d820, - 0x4a90: 0x4074da20, 0x4a91: 0x4074dc20, 0x4a92: 0x4074de20, 0x4a93: 0x4074e020, - 0x4a94: 0x4074e220, 0x4a95: 0x4074e420, 0x4a96: 0x4074e620, 0x4a97: 0x4074e820, - 0x4a98: 0x4074ea20, 0x4a99: 0x4074ec20, 0x4a9a: 0x4074ee20, 0x4a9b: 0x4074f020, - 0x4a9c: 0x4074f220, 0x4a9d: 0x4074f420, 0x4a9e: 0x4074f620, 0x4a9f: 0x4074f820, - 0x4aa0: 0x4074fa20, 0x4aa1: 0x4074fc20, 0x4aa2: 0x4074fe20, 0x4aa3: 0x40750020, - 0x4aa4: 0x40750220, 0x4aa5: 0x40750420, 0x4aa6: 0x40750620, 0x4aa7: 0x40750820, - 0x4aa8: 0x40750a20, 0x4aa9: 0x40750c20, 0x4aaa: 0x40750e20, 0x4aab: 0x40751020, - 0x4aac: 0x40751220, 0x4aad: 0x40751420, 0x4aae: 0x40751620, 0x4aaf: 0x40751820, - 0x4ab0: 0x40751a20, 0x4ab1: 0x40751c20, 0x4ab2: 0x40751e20, 0x4ab3: 0x40752020, - 0x4ab4: 0x40752220, 0x4ab5: 0x40752420, 0x4ab7: 0x40752620, - 0x4ab8: 0x40752820, - 0x4abc: 0x40752a20, 0x4abf: 0x40752c20, - // Block 0x12b, offset 0x4ac0 - 0x4ac0: 0x4075d220, 0x4ac1: 0x4075d420, 0x4ac2: 0x4075d620, 0x4ac3: 0x4075d820, - 0x4ac4: 0x4075da20, 0x4ac5: 0x4075dc20, 0x4ac6: 0x4075de20, 0x4ac7: 0x4075e020, - 0x4ac8: 0x4075e220, 0x4ac9: 0x4075e420, 0x4aca: 0x4075e620, 0x4acb: 0x4075e820, - 0x4acc: 0x4075ea20, 0x4acd: 0x4075ec20, 0x4ace: 0x4075ee20, 0x4acf: 0x4075f020, - 0x4ad0: 0x4075f220, 0x4ad1: 0x4075f420, 0x4ad2: 0x4075f620, 0x4ad3: 0x4075f820, - 0x4ad4: 0x4075fa20, 0x4ad5: 0x4075fc20, 0x4ad7: 0x40038620, - 0x4ad8: 0xe0000297, 0x4ad9: 0xe00003b2, 0x4ada: 0xe000048c, 0x4adb: 0x40296820, - 0x4adc: 0x40296a20, 0x4add: 0x40296c20, 0x4ade: 0x40296e20, 0x4adf: 0x40297020, - // Block 0x12c, offset 0x4b00 - 0x4b00: 0x4038bc20, 0x4b01: 0x4038be20, 0x4b02: 0x4038c020, 0x4b03: 0x4038c220, - 0x4b04: 0x4038c420, 0x4b05: 0x4038c620, 0x4b06: 0x4038c820, 0x4b07: 0x4038ca20, - 0x4b08: 0x4038cc20, 0x4b09: 0x4038ce20, 0x4b0a: 0x4038d020, 0x4b0b: 0x4038d220, - 0x4b0c: 0x4038d420, 0x4b0d: 0x4038d620, 0x4b0e: 0x4038d820, 0x4b0f: 0x4038da20, - 0x4b10: 0x4038dc20, 0x4b11: 0x4038de20, 0x4b12: 0x4038e020, 0x4b13: 0x4038e220, - 0x4b14: 0x4038e420, 0x4b15: 0x4038e620, 0x4b16: 0xe0000294, 0x4b17: 0x40296220, - 0x4b18: 0x40296420, 0x4b19: 0x40296620, 0x4b1a: 0xe00003af, 0x4b1b: 0xe0000489, - 0x4b1f: 0x4003c820, - 0x4b20: 0x40715420, 0x4b21: 0x40715620, 0x4b22: 0x40715820, 0x4b23: 0x40715a20, - 0x4b24: 0x40715c20, 0x4b25: 0x40715e20, 0x4b26: 0x40716020, 0x4b27: 0x40716220, - 0x4b28: 0x40716420, 0x4b29: 0x40716620, 0x4b2a: 0x40716820, 0x4b2b: 0x40716a20, - 0x4b2c: 0x40716c20, 0x4b2d: 0x40716e20, 0x4b2e: 0x40717020, 0x4b2f: 0x40717220, - 0x4b30: 0x40717420, 0x4b31: 0x40717620, 0x4b32: 0x40717820, 0x4b33: 0x40717a20, - 0x4b34: 0x40717c20, 0x4b35: 0x40717e20, 0x4b36: 0x40718020, 0x4b37: 0x40718220, - 0x4b38: 0x40718420, 0x4b39: 0x40718620, - 0x4b3f: 0x4003bc20, - // Block 0x12d, offset 0x4b40 - 0x4b40: 0xe00023a4, 0x4b41: 0xe00023a7, 0x4b42: 0xe00023aa, 0x4b43: 0xe00023ad, - 0x4b44: 0xe00023b0, 0x4b45: 0xe00023b3, 0x4b46: 0xe00023b6, 0x4b47: 0xe00023b9, - 0x4b48: 0xe00023bc, 0x4b49: 0xe00023bf, 0x4b4a: 0xe00023c2, 0x4b4b: 0xe00023c5, - 0x4b4c: 0xe00023c8, 0x4b4d: 0xe00023cb, 0x4b4e: 0xe00023ce, 0x4b4f: 0xe00023d1, - 0x4b50: 0xe00023d4, 0x4b51: 0xe00023d7, 0x4b52: 0xe00023da, 0x4b53: 0xe00023e0, - 0x4b54: 0xe00023e3, 0x4b55: 0xe00023e6, 0x4b56: 0xe00023e9, 0x4b57: 0xe00023ec, - 0x4b58: 0xe00023ef, 0x4b59: 0xe00023f2, 0x4b5a: 0xe00023f5, 0x4b5b: 0xe00023f8, - 0x4b5c: 0xe00023fb, 0x4b5d: 0xe00023fe, 0x4b5e: 0x40865220, 0x4b5f: 0x40865420, - 0x4b60: 0x40862020, 0x4b61: 0x40862220, 0x4b62: 0x40862420, 0x4b63: 0x40862620, - 0x4b64: 0x40862820, 0x4b65: 0x40862a20, 0x4b66: 0x40862c20, 0x4b67: 0x40862e20, - 0x4b68: 0x40863020, 0x4b69: 0x40863220, 0x4b6a: 0x40863420, 0x4b6b: 0x40863620, - 0x4b6c: 0x40863820, 0x4b6d: 0x40863a20, 0x4b6e: 0x40863c20, 0x4b6f: 0x40863e20, - 0x4b70: 0xe00023dd, 0x4b71: 0x40864020, 0x4b72: 0x40864220, 0x4b73: 0x40864420, - 0x4b74: 0x40864620, 0x4b75: 0x40864820, 0x4b76: 0x40864a20, 0x4b77: 0x40864c20, - 0x4b7e: 0x40864e20, 0x4b7f: 0x40865020, - // Block 0x12e, offset 0x4b80 - 0x4b80: 0x4048bc20, 0x4b81: 0x4048be20, 0x4b82: 0x4048c020, 0x4b83: 0x4048c220, - 0x4b85: 0x4048c420, 0x4b86: 0x4048c620, - 0x4b8c: 0x4048c820, 0x4b8d: 0xadc06002, 0x4b8e: 0xa000f302, 0x4b8f: 0xae60f402, - 0x4b90: 0x4048ca20, 0x4b91: 0x4048cc20, 0x4b92: 0x4048ce20, 0x4b93: 0x4048d020, - 0x4b95: 0x4048d220, 0x4b96: 0x4048d420, 0x4b97: 0x4048d620, - 0x4b99: 0x4048d820, 0x4b9a: 0x4048da20, 0x4b9b: 0x4048dc20, - 0x4b9c: 0x4048de20, 0x4b9d: 0x4048e020, 0x4b9e: 0x4048e220, 0x4b9f: 0x4048e420, - 0x4ba0: 0x4048e620, 0x4ba1: 0x4048e820, 0x4ba2: 0x4048ea20, 0x4ba3: 0x4048ec20, - 0x4ba4: 0x4048ee20, 0x4ba5: 0x4048f020, 0x4ba6: 0x4048f220, 0x4ba7: 0x4048f420, - 0x4ba8: 0x4048f620, 0x4ba9: 0x4048f820, 0x4baa: 0x4048fa20, 0x4bab: 0x4048fc20, - 0x4bac: 0x4048fe20, 0x4bad: 0x40490020, 0x4bae: 0x40490220, 0x4baf: 0x40490420, - 0x4bb0: 0x40490620, 0x4bb1: 0x40490820, 0x4bb2: 0x40490a20, 0x4bb3: 0x40490c20, - 0x4bb8: 0xae60fb02, 0x4bb9: 0xa010fc02, 0x4bba: 0xadc0fd02, - 0x4bbf: 0x82092487, - // Block 0x12f, offset 0x4bc0 - 0x4bc0: 0xe00002ac, 0x4bc1: 0xe00003c7, 0x4bc2: 0xe00004a1, 0x4bc3: 0xe0000573, - 0x4bc4: 0x40299820, 0x4bc5: 0x40299a20, 0x4bc6: 0x40299c20, 0x4bc7: 0x40299e20, - 0x4bd0: 0x40060620, 0x4bd1: 0x40060820, 0x4bd2: 0x40060a20, 0x4bd3: 0x40060c20, - 0x4bd4: 0x40060e20, 0x4bd5: 0x40061020, 0x4bd6: 0x40034420, 0x4bd7: 0x40034620, - 0x4bd8: 0x40061220, - 0x4be0: 0x40752e20, 0x4be1: 0x40753020, 0x4be2: 0x40753220, 0x4be3: 0x40753420, - 0x4be4: 0x40753620, 0x4be5: 0x40753820, 0x4be6: 0x40753a20, 0x4be7: 0x40753c20, - 0x4be8: 0x40753e20, 0x4be9: 0x40754020, 0x4bea: 0x40754220, 0x4beb: 0x40754420, - 0x4bec: 0x40754620, 0x4bed: 0x40754820, 0x4bee: 0x40754a20, 0x4bef: 0x40754c20, - 0x4bf0: 0x40754e20, 0x4bf1: 0x40755020, 0x4bf2: 0x40755220, 0x4bf3: 0x40755420, - 0x4bf4: 0x40755620, 0x4bf5: 0x40755820, 0x4bf6: 0x40755a20, 0x4bf7: 0x40755c20, - 0x4bf8: 0x40755e20, 0x4bf9: 0x40756020, 0x4bfa: 0x40756220, 0x4bfb: 0x40756420, - 0x4bfc: 0x40756620, 0x4bfd: 0xe0000291, 0x4bfe: 0x40296020, 0x4bff: 0x40061c20, - // Block 0x130, offset 0x4c00 - 0x4c00: 0x40756820, 0x4c01: 0x40756a20, 0x4c02: 0x40756c20, 0x4c03: 0x40756e20, - 0x4c04: 0x40757020, 0x4c05: 0x40757220, 0x4c06: 0x40757420, 0x4c07: 0x40757620, - 0x4c08: 0x40757820, 0x4c09: 0x40757a20, 0x4c0a: 0x40757c20, 0x4c0b: 0x40757e20, - 0x4c0c: 0x40758020, 0x4c0d: 0x40758220, 0x4c0e: 0x40758420, 0x4c0f: 0x40758620, - 0x4c10: 0x40758820, 0x4c11: 0x40758a20, 0x4c12: 0x40758c20, 0x4c13: 0x40758e20, - 0x4c14: 0x40759020, 0x4c15: 0x40759220, 0x4c16: 0x40759420, 0x4c17: 0x40759620, - 0x4c18: 0x40759820, 0x4c19: 0x40759a20, 0x4c1a: 0x40759c20, 0x4c1b: 0x40759e20, - 0x4c1c: 0x4075a020, 0x4c1d: 0x4075a220, 0x4c1e: 0x4075a420, 0x4c1f: 0x4075a620, - 0x4c20: 0x4075a820, 0x4c21: 0x4075aa20, 0x4c22: 0x4075ac20, 0x4c23: 0x4075ae20, - 0x4c24: 0x4075b020, 0x4c25: 0x4075b220, 0x4c26: 0x4075b420, 0x4c27: 0x4075b620, - 0x4c28: 0x4075b820, 0x4c29: 0x4075ba20, 0x4c2a: 0x4075bc20, 0x4c2b: 0x4075be20, - 0x4c2c: 0x4075c020, 0x4c2d: 0x4075c220, 0x4c2e: 0xe00023a1, 0x4c2f: 0x4075c420, - 0x4c30: 0x4075c620, 0x4c31: 0x4075c820, 0x4c32: 0x4075ca20, 0x4c33: 0x4075cc20, - 0x4c34: 0x4075ce20, 0x4c35: 0x4075d020, - 0x4c39: 0x40061420, 0x4c3a: 0x40038820, 0x4c3b: 0x40038a20, - 0x4c3c: 0x40038c20, 0x4c3d: 0x40038e20, 0x4c3e: 0x40039020, 0x4c3f: 0x40039220, - // Block 0x131, offset 0x4c40 - 0x4c40: 0x4075fe20, 0x4c41: 0x40760020, 0x4c42: 0x40760220, 0x4c43: 0x40760420, - 0x4c44: 0x40760620, 0x4c45: 0x40760820, 0x4c46: 0x40760a20, 0x4c47: 0x40760c20, - 0x4c48: 0x40760e20, 0x4c49: 0x40761020, 0x4c4a: 0x40761220, 0x4c4b: 0x40761420, - 0x4c4c: 0x40761620, 0x4c4d: 0x40761820, 0x4c4e: 0x40761a20, 0x4c4f: 0x40761c20, - 0x4c50: 0x40761e20, 0x4c51: 0x40762020, 0x4c52: 0x40762220, 0x4c53: 0x40762420, - 0x4c54: 0x40762620, 0x4c55: 0x40762820, - 0x4c58: 0xe000029a, 0x4c59: 0xe00003b5, 0x4c5a: 0xe000048f, 0x4c5b: 0xe0000561, - 0x4c5c: 0x40297220, 0x4c5d: 0x40297420, 0x4c5e: 0x40297620, 0x4c5f: 0x40297820, - 0x4c60: 0x40762a20, 0x4c61: 0x40762c20, 0x4c62: 0x40762e20, 0x4c63: 0x40763020, - 0x4c64: 0x40763220, 0x4c65: 0x40763420, 0x4c66: 0x40763620, 0x4c67: 0x40763820, - 0x4c68: 0x40763a20, 0x4c69: 0x40763c20, 0x4c6a: 0x40763e20, 0x4c6b: 0x40764020, - 0x4c6c: 0x40764220, 0x4c6d: 0x40764420, 0x4c6e: 0x40764620, 0x4c6f: 0x40764820, - 0x4c70: 0x40764a20, 0x4c71: 0x40764c20, 0x4c72: 0x40764e20, - 0x4c78: 0xe000029d, 0x4c79: 0xe00003b8, 0x4c7a: 0xe0000492, 0x4c7b: 0xe0000564, - 0x4c7c: 0x40297a20, 0x4c7d: 0x40297c20, 0x4c7e: 0x40297e20, 0x4c7f: 0x40298020, - // Block 0x132, offset 0x4c80 - 0x4c80: 0x405b2620, 0x4c81: 0xe00020a7, 0x4c82: 0x405b2820, 0x4c83: 0x405b2a20, - 0x4c84: 0xe00020aa, 0x4c85: 0x405b2c20, 0x4c86: 0x405b2e20, 0x4c87: 0x405b3020, - 0x4c88: 0xe00020ad, 0x4c89: 0x405b3220, 0x4c8a: 0xe00020b0, 0x4c8b: 0x405b3420, - 0x4c8c: 0xe00020b3, 0x4c8d: 0x405b3620, 0x4c8e: 0xe00020b6, 0x4c8f: 0x405b3820, - 0x4c90: 0xe00020b9, 0x4c91: 0x405b3a20, 0x4c92: 0xe00020bc, 0x4c93: 0x405b3c20, - 0x4c94: 0x405b3e20, 0x4c95: 0xe00020bf, 0x4c96: 0x405b4020, 0x4c97: 0xe00020c2, - 0x4c98: 0x405b4220, 0x4c99: 0xe00020c5, 0x4c9a: 0x405b4420, 0x4c9b: 0xe00020c8, - 0x4c9c: 0x405b4620, 0x4c9d: 0xe00020cb, 0x4c9e: 0x405b4820, 0x4c9f: 0xe00020ce, - 0x4ca0: 0x405b4a20, 0x4ca1: 0x405b4c20, 0x4ca2: 0x405b4e20, 0x4ca3: 0x405b5020, - 0x4ca4: 0x405b5220, 0x4ca5: 0xe00020d1, 0x4ca6: 0x405b5420, 0x4ca7: 0xe00020d4, - 0x4ca8: 0x405b5620, 0x4ca9: 0xe00020d7, 0x4caa: 0x405b5820, 0x4cab: 0xe00020da, - 0x4cac: 0x405b5a20, 0x4cad: 0x405b5c20, 0x4cae: 0xe00020dd, 0x4caf: 0x405b5e20, - 0x4cb0: 0x405b6020, 0x4cb1: 0x405b6220, 0x4cb2: 0x405b6420, 0x4cb3: 0xe00020e0, - 0x4cb4: 0x405b6620, 0x4cb5: 0xe00020e3, 0x4cb6: 0x405b6820, 0x4cb7: 0xe00020e6, - 0x4cb8: 0x405b6a20, 0x4cb9: 0xe00020e9, 0x4cba: 0x405b6c20, 0x4cbb: 0xe00020ec, - 0x4cbc: 0x405b6e20, 0x4cbd: 0x405b7020, 0x4cbe: 0x405b7220, 0x4cbf: 0x405b7420, - // Block 0x133, offset 0x4cc0 - 0x4cc0: 0xe00020ef, 0x4cc1: 0x405b7620, 0x4cc2: 0xe00020f2, 0x4cc3: 0x405b7820, - 0x4cc4: 0xe00020f5, 0x4cc5: 0x405b7a20, 0x4cc6: 0xe00020f8, 0x4cc7: 0x405b7c20, - 0x4cc8: 0x405b7e20, - // Block 0x134, offset 0x4d00 - 0x4d20: 0xe00001ec, 0x4d21: 0xe0000307, 0x4d22: 0xe00003e1, 0x4d23: 0xe00004bc, - 0x4d24: 0xe0000586, 0x4d25: 0xe0000651, 0x4d26: 0xe00006f9, 0x4d27: 0xe00007a5, - 0x4d28: 0xe000084a, 0x4d29: 0x40288820, 0x4d2a: 0x40288a20, 0x4d2b: 0x40288c20, - 0x4d2c: 0x40288e20, 0x4d2d: 0x40289020, 0x4d2e: 0x40289220, 0x4d2f: 0x40289420, - 0x4d30: 0x40289620, 0x4d31: 0x40289820, 0x4d32: 0x40289a20, 0x4d33: 0x40289c20, - 0x4d34: 0x40289e20, 0x4d35: 0x4028a020, 0x4d36: 0x4028a220, 0x4d37: 0x4028a420, - 0x4d38: 0x4028a620, 0x4d39: 0x4028a820, 0x4d3a: 0x4028aa20, 0x4d3b: 0x4028ac20, - 0x4d3c: 0x4028ae20, 0x4d3d: 0x4028b020, 0x4d3e: 0x4028b220, - // Block 0x135, offset 0x4d40 - 0x4d40: 0xa000f202, 0x4d41: 0xa000f302, 0x4d42: 0xa000f402, 0x4d43: 0x40489220, - 0x4d44: 0x40489420, 0x4d45: 0x40483420, 0x4d46: 0x40483620, 0x4d47: 0x40483820, - 0x4d48: 0x40483a20, 0x4d49: 0x40483c20, 0x4d4a: 0x40483e20, 0x4d4b: 0x40484020, - 0x4d4c: 0x40484220, 0x4d4d: 0x40484420, 0x4d4e: 0x40484620, 0x4d4f: 0x40484820, - 0x4d50: 0x40484a20, 0x4d51: 0x40484c20, 0x4d52: 0x40484e20, 0x4d53: 0x40485020, - 0x4d54: 0x40485220, 0x4d55: 0x40485420, 0x4d56: 0x40485620, 0x4d57: 0x40485820, - 0x4d58: 0x40485a20, 0x4d59: 0x40485c20, 0x4d5a: 0x40485e20, 0x4d5b: 0x40486020, - 0x4d5c: 0x40486220, 0x4d5d: 0x40486420, 0x4d5e: 0x40486620, 0x4d5f: 0x40486820, - 0x4d60: 0x40486a20, 0x4d61: 0x40486c20, 0x4d62: 0x40486e20, 0x4d63: 0x40487020, - 0x4d64: 0x40487220, 0x4d65: 0x40487420, 0x4d66: 0x40487620, 0x4d67: 0x40487820, - 0x4d68: 0x40487a20, 0x4d69: 0x40487c20, 0x4d6a: 0x40487e20, 0x4d6b: 0x40488020, - 0x4d6c: 0x40488220, 0x4d6d: 0x40488420, 0x4d6e: 0x40488620, 0x4d6f: 0x40488820, - 0x4d70: 0x40488a20, 0x4d71: 0x40488c20, 0x4d72: 0x40488e20, 0x4d73: 0x40489020, - 0x4d74: 0x40489620, 0x4d75: 0x40489820, 0x4d76: 0x40489a20, 0x4d77: 0x40489c20, - 0x4d78: 0x40489e20, 0x4d79: 0x4048a020, 0x4d7a: 0x4048a220, 0x4d7b: 0x4048a420, - 0x4d7c: 0x4048a620, 0x4d7d: 0x4048a820, 0x4d7e: 0x4048aa20, 0x4d7f: 0x4048ac20, - // Block 0x136, offset 0x4d80 - 0x4d80: 0x4048ae20, 0x4d81: 0x4048b020, 0x4d82: 0x4048b220, 0x4d83: 0x4048b420, - 0x4d84: 0x4048b620, 0x4d85: 0x4048b820, 0x4d86: 0x8209245d, 0x4d87: 0x40034820, - 0x4d88: 0x40034a20, 0x4d89: 0x4005fc20, 0x4d8a: 0x4005fe20, 0x4d8b: 0x40060020, - 0x4d8c: 0x40060220, 0x4d8d: 0x40060420, - 0x4d92: 0xe00002a9, 0x4d93: 0xe00003c4, - 0x4d94: 0xe000049e, 0x4d95: 0xe0000570, 0x4d96: 0xe000063a, 0x4d97: 0xe00006ea, - 0x4d98: 0xe0000792, 0x4d99: 0xe000083b, 0x4d9a: 0xe00008e6, 0x4d9b: 0x40298220, - 0x4d9c: 0x40298420, 0x4d9d: 0x40298620, 0x4d9e: 0x40298820, 0x4d9f: 0x40298a20, - 0x4da0: 0x40298c20, 0x4da1: 0x40298e20, 0x4da2: 0x40299020, 0x4da3: 0x40299220, - 0x4da4: 0x40299420, 0x4da5: 0x40299620, 0x4da6: 0xe00001df, 0x4da7: 0xe00002a6, - 0x4da8: 0xe00003c1, 0x4da9: 0xe000049b, 0x4daa: 0xe000056d, 0x4dab: 0xe0000637, - 0x4dac: 0xe00006e7, 0x4dad: 0xe000078f, 0x4dae: 0xe0000838, 0x4daf: 0xe00008e3, - // Block 0x137, offset 0x4dc0 - 0x4dc0: 0xa000f202, 0x4dc1: 0xa000f302, 0x4dc2: 0xa000f402, 0x4dc3: 0x40467e20, - 0x4dc4: 0x40468020, 0x4dc5: 0x40468220, 0x4dc6: 0x40468420, 0x4dc7: 0x40468620, - 0x4dc8: 0x40468820, 0x4dc9: 0x40468a20, 0x4dca: 0x40468c20, 0x4dcb: 0x40468e20, - 0x4dcc: 0x40469020, 0x4dcd: 0x40469220, 0x4dce: 0x40469420, 0x4dcf: 0x40469620, - 0x4dd0: 0x40469820, 0x4dd1: 0x40469a20, 0x4dd2: 0x40469c20, 0x4dd3: 0x40469e20, - 0x4dd4: 0x4046a020, 0x4dd5: 0x4046a220, 0x4dd6: 0x4046a420, 0x4dd7: 0x4046a620, - 0x4dd8: 0x4046a820, 0x4dd9: 0x4046aa20, 0x4dda: 0xe0001878, 0x4ddb: 0x4046ac20, - 0x4ddc: 0xe000187b, 0x4ddd: 0x4046ae20, 0x4dde: 0x4046b020, 0x4ddf: 0x4046b220, - 0x4de0: 0x4046b420, 0x4de1: 0x4046b620, 0x4de2: 0x4046b820, 0x4de3: 0x4046ba20, - 0x4de4: 0x4046bc20, 0x4de5: 0x4046be20, 0x4de6: 0x4046c020, 0x4de7: 0x4046c220, - 0x4de8: 0x4046c420, 0x4de9: 0x4046c620, 0x4dea: 0x4046c820, 0x4deb: 0xe000187e, - 0x4dec: 0x4046ca20, 0x4ded: 0x4046cc20, 0x4dee: 0x4046ce20, 0x4def: 0x4046d020, - 0x4df0: 0x4046d220, 0x4df1: 0x4046d420, 0x4df2: 0x4046d620, 0x4df3: 0x4046d820, - 0x4df4: 0x4046da20, 0x4df5: 0x4046dc20, 0x4df6: 0x4046de20, 0x4df7: 0x4046e020, - 0x4df8: 0x4046e220, 0x4df9: 0x82092372, 0x4dfa: 0xa070f102, 0x4dfb: 0x40061620, - 0x4dfc: 0x40061820, 0x4dfd: 0xa0000000, 0x4dfe: 0x40039420, 0x4dff: 0x40039620, - // Block 0x138, offset 0x4e00 - 0x4e00: 0x40034c20, 0x4e01: 0x40034e20, - 0x4e10: 0x4072e820, 0x4e11: 0x4072ea20, 0x4e12: 0x4072ec20, 0x4e13: 0x4072ee20, - 0x4e14: 0x4072f020, 0x4e15: 0x4072f220, 0x4e16: 0x4072f420, 0x4e17: 0x4072f620, - 0x4e18: 0x4072f820, 0x4e19: 0x4072fa20, 0x4e1a: 0x4072fc20, 0x4e1b: 0x4072fe20, - 0x4e1c: 0x40730020, 0x4e1d: 0x40730220, 0x4e1e: 0x40730420, 0x4e1f: 0x40730620, - 0x4e20: 0x40730820, 0x4e21: 0x40730a20, 0x4e22: 0x40730c20, 0x4e23: 0x40730e20, - 0x4e24: 0x40731020, 0x4e25: 0x40731220, 0x4e26: 0x40731420, 0x4e27: 0x40731620, - 0x4e28: 0x40731820, - 0x4e30: 0xe00001d0, 0x4e31: 0xe0000264, 0x4e32: 0xe000037c, 0x4e33: 0xe0000456, - 0x4e34: 0xe000052b, 0x4e35: 0xe00005f5, 0x4e36: 0xe00006c0, 0x4e37: 0xe0000768, - 0x4e38: 0xe0000814, 0x4e39: 0xe00008b9, - // Block 0x139, offset 0x4e40 - 0x4e40: 0xae60f202, 0x4e41: 0xae60f302, 0x4e42: 0xae60f402, 0x4e43: 0x404f4020, - 0x4e44: 0x404f4220, 0x4e45: 0x404f4420, 0x4e46: 0x404f4620, 0x4e47: 0x404f4820, - 0x4e48: 0x404f4a20, 0x4e49: 0x404f4c20, 0x4e4a: 0x404f4e20, 0x4e4b: 0x404f5020, - 0x4e4c: 0x404f5220, 0x4e4d: 0x404f5420, 0x4e4e: 0x404f5620, 0x4e4f: 0x404f5820, - 0x4e50: 0x404f5a20, 0x4e51: 0x404f5c20, 0x4e52: 0x404f5e20, 0x4e53: 0x404f6020, - 0x4e54: 0x404f6220, 0x4e55: 0x404f6420, 0x4e56: 0x404f6620, 0x4e57: 0x404f6820, - 0x4e58: 0x404f6a20, 0x4e59: 0x404f6c20, 0x4e5a: 0x404f6e20, 0x4e5b: 0x404f7020, - 0x4e5c: 0x404f7220, 0x4e5d: 0x404f7420, 0x4e5e: 0x404f7620, 0x4e5f: 0x404f7820, - 0x4e60: 0x404f7a20, 0x4e61: 0x404f7c20, 0x4e62: 0x404f7e20, 0x4e63: 0x404f8020, - 0x4e64: 0x404f8220, 0x4e65: 0x404f8420, 0x4e66: 0x404f8620, 0x4e67: 0x404f8820, - 0x4e68: 0x404f8a20, 0x4e69: 0x404f8c20, 0x4e6a: 0x404f8e20, 0x4e6b: 0x404f9020, - 0x4e6c: 0x404f9220, 0x4e6d: 0x404f9420, 0x4e6e: 0x404f9620, 0x4e6f: 0x404f9820, - 0x4e70: 0x404f9a20, 0x4e71: 0xc31507e1, 0x4e72: 0xc31707e1, 0x4e73: 0x820927d0, - 0x4e74: 0x820927d1, 0x4e76: 0xe00001b2, 0x4e77: 0xe0000246, - 0x4e78: 0xe000035e, 0x4e79: 0xe0000438, 0x4e7a: 0xe000050d, 0x4e7b: 0xe00005d7, - 0x4e7c: 0xe00006a2, 0x4e7d: 0xe000074a, 0x4e7e: 0xe00007f6, 0x4e7f: 0xe000089b, - // Block 0x13a, offset 0x4e80 - 0x4e80: 0x40039820, 0x4e81: 0x40035020, 0x4e82: 0x40035220, 0x4e83: 0x4002de20, - // Block 0x13b, offset 0x4ec0 - 0x4ec0: 0xa000f202, 0x4ec1: 0xa000f302, 0x4ec2: 0xa000f402, 0x4ec3: 0x4046e820, - 0x4ec4: 0x4046ea20, 0x4ec5: 0x4046ec20, 0x4ec6: 0x4046ee20, 0x4ec7: 0x4046f020, - 0x4ec8: 0x4046f220, 0x4ec9: 0x4046f420, 0x4eca: 0x4046f620, 0x4ecb: 0x4046f820, - 0x4ecc: 0x4046fa20, 0x4ecd: 0x4046fc20, 0x4ece: 0x4046fe20, 0x4ecf: 0x40470020, - 0x4ed0: 0x40470220, 0x4ed1: 0x40470420, 0x4ed2: 0x40470620, 0x4ed3: 0x40470820, - 0x4ed4: 0x40470a20, 0x4ed5: 0x40470c20, 0x4ed6: 0x40470e20, 0x4ed7: 0x40471020, - 0x4ed8: 0x40471220, 0x4ed9: 0x40471420, 0x4eda: 0x40471620, 0x4edb: 0x40471820, - 0x4edc: 0x40471a20, 0x4edd: 0x40471c20, 0x4ede: 0x40471e20, 0x4edf: 0x40472020, - 0x4ee0: 0x40472220, 0x4ee1: 0x40472420, 0x4ee2: 0x40472620, 0x4ee3: 0x40472820, - 0x4ee4: 0x40472a20, 0x4ee5: 0x40472c20, 0x4ee6: 0x40472e20, 0x4ee7: 0x40473020, - 0x4ee8: 0x40473220, 0x4ee9: 0x40473420, 0x4eea: 0x40473620, 0x4eeb: 0x40473820, - 0x4eec: 0x40473a20, 0x4eed: 0x40473c20, 0x4eee: 0x40473e20, 0x4eef: 0x40474020, - 0x4ef0: 0x40474220, 0x4ef1: 0x40474420, 0x4ef2: 0x40474620, 0x4ef3: 0x40474820, - 0x4ef4: 0x40474a20, 0x4ef5: 0x40474c20, 0x4ef6: 0x40474e20, 0x4ef7: 0x40475020, - 0x4ef8: 0x40475220, 0x4ef9: 0x40475420, 0x4efa: 0x40475620, 0x4efb: 0x40475820, - 0x4efc: 0x40475a20, 0x4efd: 0x40475c20, 0x4efe: 0x40475e20, 0x4eff: 0x40476020, - // Block 0x13c, offset 0x4f00 - 0x4f00: 0x820923b1, 0x4f01: 0x40476420, 0x4f02: 0x40476620, 0x4f03: 0x40476820, - 0x4f04: 0x4046e620, 0x4f05: 0x40035420, 0x4f06: 0x40035620, 0x4f07: 0x40061a20, - 0x4f08: 0x40039a20, - 0x4f10: 0xe00001d9, 0x4f11: 0xe00002a0, 0x4f12: 0xe00003bb, 0x4f13: 0xe0000495, - 0x4f14: 0xe0000567, 0x4f15: 0xe0000631, 0x4f16: 0xe00006e1, 0x4f17: 0xe0000789, - 0x4f18: 0xe0000832, 0x4f19: 0xe00008dd, - // Block 0x13d, offset 0x4f40 - 0x4f40: 0x40476a20, 0x4f41: 0x40476c20, 0x4f42: 0x40476e20, 0x4f43: 0x40477020, - 0x4f44: 0x40477220, 0x4f45: 0x40477420, 0x4f46: 0x40477620, 0x4f47: 0x40477820, - 0x4f48: 0x40477a20, 0x4f49: 0x40477c20, 0x4f4a: 0x40478420, 0x4f4b: 0x40478620, - 0x4f4c: 0x40478820, 0x4f4d: 0x40478a20, 0x4f4e: 0x40478c20, 0x4f4f: 0x40478e20, - 0x4f50: 0x40479020, 0x4f51: 0x40479220, 0x4f52: 0x40479420, 0x4f53: 0x40479620, - 0x4f54: 0x40479820, 0x4f55: 0x40479a20, 0x4f56: 0x40479c20, 0x4f57: 0x40479e20, - 0x4f58: 0x4047a020, 0x4f59: 0x4047a220, 0x4f5a: 0x4047a420, 0x4f5b: 0x4047a620, - 0x4f5c: 0x4047a820, 0x4f5d: 0x4047aa20, 0x4f5e: 0x4047ac20, 0x4f5f: 0x4047ae20, - 0x4f60: 0x4047b020, 0x4f61: 0x4047b220, 0x4f62: 0x4047b420, 0x4f63: 0x4047b620, - 0x4f64: 0x4047b820, 0x4f65: 0x4047ba20, 0x4f66: 0x4047bc20, 0x4f67: 0x40478020, - 0x4f68: 0x40477e20, 0x4f69: 0x40478220, 0x4f6a: 0x4047be20, 0x4f6b: 0xa000f302, - 0x4f6c: 0xa000f402, 0x4f6d: 0x4047c020, 0x4f6e: 0x4047c220, 0x4f6f: 0x4047c420, - 0x4f70: 0x4047c620, 0x4f71: 0x4047c820, 0x4f72: 0x4047ca20, 0x4f73: 0x4047cc20, - 0x4f74: 0x4047ce20, 0x4f75: 0x4047d020, 0x4f76: 0x820923e9, 0x4f77: 0xa070f102, - // Block 0x13e, offset 0x4f80 - 0x4f80: 0xe00001dc, 0x4f81: 0xe00002a3, 0x4f82: 0xe00003be, 0x4f83: 0xe0000498, - 0x4f84: 0xe000056a, 0x4f85: 0xe0000634, 0x4f86: 0xe00006e4, 0x4f87: 0xe000078c, - 0x4f88: 0xe0000835, 0x4f89: 0xe00008e0, - // Block 0x13f, offset 0x4fc0 - 0x4fc0: 0x4076e420, 0x4fc1: 0x4076e620, 0x4fc2: 0x4076e820, 0x4fc3: 0x4076ea20, - 0x4fc4: 0x4076ec20, 0x4fc5: 0x4076ee20, 0x4fc6: 0x4076f020, 0x4fc7: 0x4076f220, - 0x4fc8: 0x4076f420, 0x4fc9: 0x4076f620, 0x4fca: 0x4076f820, 0x4fcb: 0x4076fa20, - 0x4fcc: 0x4076fc20, 0x4fcd: 0x4076fe20, 0x4fce: 0x40770020, 0x4fcf: 0x40770220, - 0x4fd0: 0x40770420, 0x4fd1: 0x40770620, 0x4fd2: 0x40770820, 0x4fd3: 0x40770a20, - 0x4fd4: 0x40770c20, 0x4fd5: 0x40770e20, 0x4fd6: 0x40771020, 0x4fd7: 0x40771220, - 0x4fd8: 0x40771420, 0x4fd9: 0x40771620, 0x4fda: 0x40771820, 0x4fdb: 0x40771a20, - 0x4fdc: 0x40771c20, 0x4fdd: 0x40771e20, 0x4fde: 0x40772020, 0x4fdf: 0x40772220, - 0x4fe0: 0x40772420, 0x4fe1: 0x40772620, 0x4fe2: 0x40772820, 0x4fe3: 0x40772a20, - 0x4fe4: 0x40772c20, 0x4fe5: 0x40772e20, 0x4fe6: 0x40773020, 0x4fe7: 0x40773220, - 0x4fe8: 0x40773420, 0x4fe9: 0x40773620, 0x4fea: 0x40773820, 0x4feb: 0x40773a20, - 0x4fec: 0x40773c20, 0x4fed: 0x40773e20, 0x4fee: 0x40774020, 0x4fef: 0x40774220, - 0x4ff0: 0x40774420, 0x4ff1: 0x40774620, 0x4ff2: 0x40774820, 0x4ff3: 0x40774a20, - 0x4ff4: 0x40774c20, 0x4ff5: 0x40774e20, 0x4ff6: 0x40775020, 0x4ff7: 0x40775220, - 0x4ff8: 0x40775420, 0x4ff9: 0x40775620, 0x4ffa: 0x40775820, 0x4ffb: 0x40775a20, - 0x4ffc: 0x40775c20, 0x4ffd: 0x40775e20, 0x4ffe: 0x40776020, 0x4fff: 0x40776220, - // Block 0x140, offset 0x5000 - 0x5000: 0x40776420, 0x5001: 0x40776620, 0x5002: 0x40776820, 0x5003: 0x40776a20, - 0x5004: 0x40776c20, 0x5005: 0x40776e20, 0x5006: 0x40777020, 0x5007: 0x40777220, - 0x5008: 0x40777420, 0x5009: 0x40777620, 0x500a: 0x40777820, 0x500b: 0x40777a20, - 0x500c: 0x40777c20, 0x500d: 0x40777e20, 0x500e: 0x40778020, 0x500f: 0x40778220, - 0x5010: 0x40778420, 0x5011: 0x40778620, 0x5012: 0x40778820, 0x5013: 0x40778a20, - 0x5014: 0x40778c20, 0x5015: 0x40778e20, 0x5016: 0x40779020, 0x5017: 0x40779220, - 0x5018: 0x40779420, 0x5019: 0x40779620, 0x501a: 0x40779820, 0x501b: 0x40779a20, - 0x501c: 0x40779c20, 0x501d: 0x40779e20, 0x501e: 0x4077a020, 0x501f: 0x4077a220, - 0x5020: 0x4077a420, 0x5021: 0x4077a620, 0x5022: 0x4077a820, 0x5023: 0x4077aa20, - 0x5024: 0x4077ac20, 0x5025: 0x4077ae20, 0x5026: 0x4077b020, 0x5027: 0x4077b220, - 0x5028: 0x4077b420, 0x5029: 0x4077b620, 0x502a: 0x4077b820, 0x502b: 0x4077ba20, - 0x502c: 0x4077bc20, 0x502d: 0x4077be20, 0x502e: 0x4077c020, 0x502f: 0x4077c220, - 0x5030: 0x4077c420, 0x5031: 0x4077c620, 0x5032: 0x4077c820, 0x5033: 0x4077ca20, - 0x5034: 0x4077cc20, 0x5035: 0x4077ce20, 0x5036: 0x4077d020, 0x5037: 0x4077d220, - 0x5038: 0x4077d420, 0x5039: 0x4077d620, 0x503a: 0x4077d820, 0x503b: 0x4077da20, - 0x503c: 0x4077dc20, 0x503d: 0x4077de20, 0x503e: 0x4077e020, 0x503f: 0x4077e220, - // Block 0x141, offset 0x5040 - 0x5040: 0x4077e420, 0x5041: 0x4077e620, 0x5042: 0x4077e820, 0x5043: 0x4077ea20, - 0x5044: 0x4077ec20, 0x5045: 0x4077ee20, 0x5046: 0x4077f020, 0x5047: 0x4077f220, - 0x5048: 0x4077f420, 0x5049: 0x4077f620, 0x504a: 0x4077f820, 0x504b: 0x4077fa20, - 0x504c: 0x4077fc20, 0x504d: 0x4077fe20, 0x504e: 0x40780020, 0x504f: 0x40780220, - 0x5050: 0x40780420, 0x5051: 0x40780620, 0x5052: 0x40780820, 0x5053: 0x40780a20, - 0x5054: 0x40780c20, 0x5055: 0x40780e20, 0x5056: 0x40781020, 0x5057: 0x40781220, - 0x5058: 0x40781420, 0x5059: 0x40781620, 0x505a: 0x40781820, 0x505b: 0x40781a20, - 0x505c: 0x40781c20, 0x505d: 0x40781e20, 0x505e: 0x40782020, 0x505f: 0x40782220, - 0x5060: 0x40782420, 0x5061: 0x40782620, 0x5062: 0x40782820, 0x5063: 0x40782a20, - 0x5064: 0x40782c20, 0x5065: 0x40782e20, 0x5066: 0x40783020, 0x5067: 0x40783220, - 0x5068: 0x40783420, 0x5069: 0x40783620, 0x506a: 0x40783820, 0x506b: 0x40783a20, - 0x506c: 0x40783c20, 0x506d: 0x40783e20, 0x506e: 0x40784020, 0x506f: 0x40784220, - 0x5070: 0x40784420, 0x5071: 0x40784620, 0x5072: 0x40784820, 0x5073: 0x40784a20, - 0x5074: 0x40784c20, 0x5075: 0x40784e20, 0x5076: 0x40785020, 0x5077: 0x40785220, - 0x5078: 0x40785420, 0x5079: 0x40785620, 0x507a: 0x40785820, 0x507b: 0x40785a20, - 0x507c: 0x40785c20, 0x507d: 0x40785e20, 0x507e: 0x40786020, 0x507f: 0x40786220, - // Block 0x142, offset 0x5080 - 0x5080: 0x40786420, 0x5081: 0x40786620, 0x5082: 0x40786820, 0x5083: 0x40786a20, - 0x5084: 0x40786c20, 0x5085: 0x40786e20, 0x5086: 0x40787020, 0x5087: 0x40787220, - 0x5088: 0x40787420, 0x5089: 0x40787620, 0x508a: 0x40787820, 0x508b: 0x40787a20, - 0x508c: 0x40787c20, 0x508d: 0x40787e20, 0x508e: 0x40788020, 0x508f: 0x40788220, - 0x5090: 0x40788420, 0x5091: 0x40788620, 0x5092: 0x40788820, 0x5093: 0x40788a20, - 0x5094: 0x40788c20, 0x5095: 0x40788e20, 0x5096: 0x40789020, 0x5097: 0x40789220, - 0x5098: 0x40789420, 0x5099: 0x40789620, 0x509a: 0x40789820, 0x509b: 0x40789a20, - 0x509c: 0x40789c20, 0x509d: 0x40789e20, 0x509e: 0x4078a020, 0x509f: 0x4078a220, - 0x50a0: 0x4078a420, 0x50a1: 0x4078a620, 0x50a2: 0x4078a820, 0x50a3: 0x4078aa20, - 0x50a4: 0x4078ac20, 0x50a5: 0x4078ae20, 0x50a6: 0x4078b020, 0x50a7: 0x4078b220, - 0x50a8: 0x4078b420, 0x50a9: 0x4078b620, 0x50aa: 0x4078b820, 0x50ab: 0x4078ba20, - 0x50ac: 0x4078bc20, 0x50ad: 0x4078be20, 0x50ae: 0x4078c020, 0x50af: 0x4078c220, - 0x50b0: 0x4078c420, 0x50b1: 0x4078c620, 0x50b2: 0x4078c820, 0x50b3: 0x4078ca20, - 0x50b4: 0x4078cc20, 0x50b5: 0x4078ce20, 0x50b6: 0x4078d020, 0x50b7: 0x4078d220, - 0x50b8: 0x4078d420, 0x50b9: 0x4078d620, 0x50ba: 0x4078d820, 0x50bb: 0x4078da20, - 0x50bc: 0x4078dc20, 0x50bd: 0x4078de20, 0x50be: 0x4078e020, 0x50bf: 0x4078e220, - // Block 0x143, offset 0x50c0 - 0x50c0: 0x4078e420, 0x50c1: 0x4078e620, 0x50c2: 0x4078e820, 0x50c3: 0x4078ea20, - 0x50c4: 0x4078ec20, 0x50c5: 0x4078ee20, 0x50c6: 0x4078f020, 0x50c7: 0x4078f220, - 0x50c8: 0x4078f420, 0x50c9: 0x4078f620, 0x50ca: 0x4078f820, 0x50cb: 0x4078fa20, - 0x50cc: 0x4078fc20, 0x50cd: 0x4078fe20, 0x50ce: 0x40790020, 0x50cf: 0x40790220, - 0x50d0: 0x40790420, 0x50d1: 0x40790620, 0x50d2: 0x40790820, 0x50d3: 0x40790a20, - 0x50d4: 0x40790c20, 0x50d5: 0x40790e20, 0x50d6: 0x40791020, 0x50d7: 0x40791220, - 0x50d8: 0x40791420, 0x50d9: 0x40791620, 0x50da: 0x40791820, 0x50db: 0x40791a20, - 0x50dc: 0x40791c20, 0x50dd: 0x40791e20, 0x50de: 0x40792020, 0x50df: 0x40792220, - 0x50e0: 0x40792420, 0x50e1: 0x40792620, 0x50e2: 0x40792820, 0x50e3: 0x40792a20, - 0x50e4: 0x40792c20, 0x50e5: 0x40792e20, 0x50e6: 0x40793020, 0x50e7: 0x40793220, - 0x50e8: 0x40793420, 0x50e9: 0x40793620, 0x50ea: 0x40793820, 0x50eb: 0x40793a20, - 0x50ec: 0x40793c20, 0x50ed: 0x40793e20, 0x50ee: 0x40794020, 0x50ef: 0x40794220, - 0x50f0: 0x40794420, 0x50f1: 0x40794620, 0x50f2: 0x40794820, 0x50f3: 0x40794a20, - 0x50f4: 0x40794c20, 0x50f5: 0x40794e20, 0x50f6: 0x40795020, 0x50f7: 0x40795220, - 0x50f8: 0x40795420, 0x50f9: 0x40795620, 0x50fa: 0x40795820, 0x50fb: 0x40795a20, - 0x50fc: 0x40795c20, 0x50fd: 0x40795e20, 0x50fe: 0x40796020, 0x50ff: 0x40796220, - // Block 0x144, offset 0x5100 - 0x5100: 0x40796420, 0x5101: 0x40796620, 0x5102: 0x40796820, 0x5103: 0x40796a20, - 0x5104: 0x40796c20, 0x5105: 0x40796e20, 0x5106: 0x40797020, 0x5107: 0x40797220, - 0x5108: 0x40797420, 0x5109: 0x40797620, 0x510a: 0x40797820, 0x510b: 0x40797a20, - 0x510c: 0x40797c20, 0x510d: 0x40797e20, 0x510e: 0x40798020, 0x510f: 0x40798220, - 0x5110: 0x40798420, 0x5111: 0x40798620, 0x5112: 0x40798820, 0x5113: 0x40798a20, - 0x5114: 0x40798c20, 0x5115: 0x40798e20, 0x5116: 0x40799020, 0x5117: 0x40799220, - 0x5118: 0x40799420, 0x5119: 0x40799620, 0x511a: 0x40799820, 0x511b: 0x40799a20, - 0x511c: 0x40799c20, 0x511d: 0x40799e20, 0x511e: 0x4079a020, 0x511f: 0x4079a220, - 0x5120: 0x4079a420, 0x5121: 0x4079a620, 0x5122: 0x4079a820, 0x5123: 0x4079aa20, - 0x5124: 0x4079ac20, 0x5125: 0x4079ae20, 0x5126: 0x4079b020, 0x5127: 0x4079b220, - 0x5128: 0x4079b420, 0x5129: 0x4079b620, 0x512a: 0x4079b820, 0x512b: 0x4079ba20, - 0x512c: 0x4079bc20, 0x512d: 0x4079be20, 0x512e: 0x4079c020, 0x512f: 0x4079c220, - 0x5130: 0x4079c420, 0x5131: 0x4079c620, 0x5132: 0x4079c820, 0x5133: 0x4079ca20, - 0x5134: 0x4079cc20, 0x5135: 0x4079ce20, 0x5136: 0x4079d020, 0x5137: 0x4079d220, - 0x5138: 0x4079d420, 0x5139: 0x4079d620, 0x513a: 0x4079d820, 0x513b: 0x4079da20, - 0x513c: 0x4079dc20, 0x513d: 0x4079de20, 0x513e: 0x4079e020, 0x513f: 0x4079e220, - // Block 0x145, offset 0x5140 - 0x5140: 0x4079e420, 0x5141: 0x4079e620, 0x5142: 0x4079e820, 0x5143: 0x4079ea20, - 0x5144: 0x4079ec20, 0x5145: 0x4079ee20, 0x5146: 0x4079f020, 0x5147: 0x4079f220, - 0x5148: 0x4079f420, 0x5149: 0x4079f620, 0x514a: 0x4079f820, 0x514b: 0x4079fa20, - 0x514c: 0x4079fc20, 0x514d: 0x4079fe20, 0x514e: 0x407a0020, 0x514f: 0x407a0220, - 0x5150: 0x407a0420, 0x5151: 0x407a0620, 0x5152: 0x407a0820, 0x5153: 0x407a0a20, - 0x5154: 0x407a0c20, 0x5155: 0x407a0e20, 0x5156: 0x407a1020, 0x5157: 0x407a1220, - 0x5158: 0x407a1420, 0x5159: 0x407a1620, 0x515a: 0x407a1820, 0x515b: 0x407a1a20, - 0x515c: 0x407a1c20, 0x515d: 0x407a1e20, 0x515e: 0x407a2020, 0x515f: 0x407a2220, - 0x5160: 0x407a2420, 0x5161: 0x407a2620, 0x5162: 0x407a2820, 0x5163: 0x407a2a20, - 0x5164: 0x407a2c20, 0x5165: 0x407a2e20, 0x5166: 0x407a3020, 0x5167: 0x407a3220, - 0x5168: 0x407a3420, 0x5169: 0x407a3620, 0x516a: 0x407a3820, 0x516b: 0x407a3a20, - 0x516c: 0x407a3c20, 0x516d: 0x407a3e20, 0x516e: 0x407a4020, 0x516f: 0x407a4220, - 0x5170: 0x407a4420, 0x5171: 0x407a4620, 0x5172: 0x407a4820, 0x5173: 0x407a4a20, - 0x5174: 0x407a4c20, 0x5175: 0x407a4e20, 0x5176: 0x407a5020, 0x5177: 0x407a5220, - 0x5178: 0x407a5420, 0x5179: 0x407a5620, 0x517a: 0x407a5820, 0x517b: 0x407a5a20, - 0x517c: 0x407a5c20, 0x517d: 0x407a5e20, 0x517e: 0x407a6020, 0x517f: 0x407a6220, - // Block 0x146, offset 0x5180 - 0x5180: 0x407a6420, 0x5181: 0x407a6620, 0x5182: 0x407a6820, 0x5183: 0x407a6a20, - 0x5184: 0x407a6c20, 0x5185: 0x407a6e20, 0x5186: 0x407a7020, 0x5187: 0x407a7220, - 0x5188: 0x407a7420, 0x5189: 0x407a7620, 0x518a: 0x407a7820, 0x518b: 0x407a7a20, - 0x518c: 0x407a7c20, 0x518d: 0x407a7e20, 0x518e: 0x407a8020, 0x518f: 0x407a8220, - 0x5190: 0x407a8420, 0x5191: 0x407a8620, 0x5192: 0x407a8820, 0x5193: 0x407a8a20, - 0x5194: 0x407a8c20, 0x5195: 0x407a8e20, 0x5196: 0x407a9020, 0x5197: 0x407a9220, - 0x5198: 0x407a9420, 0x5199: 0x407a9620, 0x519a: 0x407a9820, 0x519b: 0x407a9a20, - 0x519c: 0x407a9c20, 0x519d: 0x407a9e20, 0x519e: 0x407aa020, 0x519f: 0x407aa220, - 0x51a0: 0x407aa420, 0x51a1: 0x407aa620, 0x51a2: 0x407aa820, 0x51a3: 0x407aaa20, - 0x51a4: 0x407aac20, 0x51a5: 0x407aae20, 0x51a6: 0x407ab020, 0x51a7: 0x407ab220, - 0x51a8: 0x407ab420, 0x51a9: 0x407ab620, 0x51aa: 0x407ab820, 0x51ab: 0x407aba20, - 0x51ac: 0x407abc20, 0x51ad: 0x407abe20, 0x51ae: 0x407ac020, 0x51af: 0x407ac220, - 0x51b0: 0x407ac420, 0x51b1: 0x407ac620, 0x51b2: 0x407ac820, 0x51b3: 0x407aca20, - 0x51b4: 0x407acc20, 0x51b5: 0x407ace20, 0x51b6: 0x407ad020, 0x51b7: 0x407ad220, - 0x51b8: 0x407ad420, 0x51b9: 0x407ad620, 0x51ba: 0x407ad820, 0x51bb: 0x407ada20, - 0x51bc: 0x407adc20, 0x51bd: 0x407ade20, 0x51be: 0x407ae020, 0x51bf: 0x407ae220, - // Block 0x147, offset 0x51c0 - 0x51c0: 0x407ae420, 0x51c1: 0x407ae620, 0x51c2: 0x407ae820, 0x51c3: 0x407aea20, - 0x51c4: 0x407aec20, 0x51c5: 0x407aee20, 0x51c6: 0x407af020, 0x51c7: 0x407af220, - 0x51c8: 0x407af420, 0x51c9: 0x407af620, 0x51ca: 0x407af820, 0x51cb: 0x407afa20, - 0x51cc: 0x407afc20, 0x51cd: 0x407afe20, 0x51ce: 0x407b0020, 0x51cf: 0x407b0220, - 0x51d0: 0x407b0420, 0x51d1: 0x407b0620, 0x51d2: 0x407b0820, 0x51d3: 0x407b0a20, - 0x51d4: 0x407b0c20, 0x51d5: 0x407b0e20, 0x51d6: 0x407b1020, 0x51d7: 0x407b1220, - 0x51d8: 0x407b1420, 0x51d9: 0x407b1620, 0x51da: 0x407b1820, 0x51db: 0x407b1a20, - 0x51dc: 0x407b1c20, 0x51dd: 0x407b1e20, 0x51de: 0x407b2020, 0x51df: 0x407b2220, - 0x51e0: 0x407b2420, 0x51e1: 0x407b2620, 0x51e2: 0x407b2820, 0x51e3: 0x407b2a20, - 0x51e4: 0x407b2c20, 0x51e5: 0x407b2e20, 0x51e6: 0x407b3020, 0x51e7: 0x407b3220, - 0x51e8: 0x407b3420, 0x51e9: 0x407b3620, 0x51ea: 0x407b3820, 0x51eb: 0x407b3a20, - 0x51ec: 0x407b3c20, 0x51ed: 0x407b3e20, 0x51ee: 0x407b4020, 0x51ef: 0x407b4220, - 0x51f0: 0x407b4420, 0x51f1: 0x407b4620, 0x51f2: 0x407b4820, 0x51f3: 0x407b4a20, - 0x51f4: 0x407b4c20, 0x51f5: 0x407b4e20, 0x51f6: 0x407b5020, 0x51f7: 0x407b5220, - 0x51f8: 0x407b5420, 0x51f9: 0x407b5620, 0x51fa: 0x407b5820, 0x51fb: 0x407b5a20, - 0x51fc: 0x407b5c20, 0x51fd: 0x407b5e20, 0x51fe: 0x407b6020, 0x51ff: 0x407b6220, - // Block 0x148, offset 0x5200 - 0x5200: 0x407b6420, 0x5201: 0x407b6620, 0x5202: 0x407b6820, 0x5203: 0x407b6a20, - 0x5204: 0x407b6c20, 0x5205: 0x407b6e20, 0x5206: 0x407b7020, 0x5207: 0x407b7220, - 0x5208: 0x407b7420, 0x5209: 0x407b7620, 0x520a: 0x407b7820, 0x520b: 0x407b7a20, - 0x520c: 0x407b7c20, 0x520d: 0x407b7e20, 0x520e: 0x407b8020, 0x520f: 0x407b8220, - 0x5210: 0x407b8420, 0x5211: 0x407b8620, 0x5212: 0x407b8820, 0x5213: 0x407b8a20, - 0x5214: 0x407b8c20, 0x5215: 0x407b8e20, 0x5216: 0x407b9020, 0x5217: 0x407b9220, - 0x5218: 0x407b9420, 0x5219: 0x407b9620, 0x521a: 0x407b9820, 0x521b: 0x407b9a20, - 0x521c: 0x407b9c20, 0x521d: 0x407b9e20, 0x521e: 0x407ba020, 0x521f: 0x407ba220, - 0x5220: 0x407ba420, 0x5221: 0x407ba620, 0x5222: 0x407ba820, 0x5223: 0x407baa20, - 0x5224: 0x407bac20, 0x5225: 0x407bae20, 0x5226: 0x407bb020, 0x5227: 0x407bb220, - 0x5228: 0x407bb420, 0x5229: 0x407bb620, 0x522a: 0x407bb820, 0x522b: 0x407bba20, - 0x522c: 0x407bbc20, 0x522d: 0x407bbe20, 0x522e: 0x407bc020, 0x522f: 0x407bc220, - 0x5230: 0x407bc420, 0x5231: 0x407bc620, 0x5232: 0x407bc820, 0x5233: 0x407bca20, - 0x5234: 0x407bcc20, 0x5235: 0x407bce20, 0x5236: 0x407bd020, 0x5237: 0x407bd220, - 0x5238: 0x407bd420, 0x5239: 0x407bd620, 0x523a: 0x407bd820, 0x523b: 0x407bda20, - 0x523c: 0x407bdc20, 0x523d: 0x407bde20, 0x523e: 0x407be020, 0x523f: 0x407be220, - // Block 0x149, offset 0x5240 - 0x5240: 0x407be420, 0x5241: 0x407be620, 0x5242: 0x407be820, 0x5243: 0x407bea20, - 0x5244: 0x407bec20, 0x5245: 0x407bee20, 0x5246: 0x407bf020, 0x5247: 0x407bf220, - 0x5248: 0x407bf420, 0x5249: 0x407bf620, 0x524a: 0x407bf820, 0x524b: 0x407bfa20, - 0x524c: 0x407bfc20, 0x524d: 0x407bfe20, 0x524e: 0x407c0020, 0x524f: 0x407c0220, - 0x5250: 0x407c0420, 0x5251: 0x407c0620, 0x5252: 0x407c0820, 0x5253: 0x407c0a20, - 0x5254: 0x407c0c20, 0x5255: 0x407c0e20, 0x5256: 0x407c1020, 0x5257: 0x407c1220, - 0x5258: 0x407c1420, 0x5259: 0x407c1620, 0x525a: 0x407c1820, 0x525b: 0x407c1a20, - 0x525c: 0x407c1c20, 0x525d: 0x407c1e20, 0x525e: 0x407c2020, 0x525f: 0x407c2220, - 0x5260: 0x407c2420, 0x5261: 0x407c2620, 0x5262: 0x407c2820, 0x5263: 0x407c2a20, - 0x5264: 0x407c2c20, 0x5265: 0x407c2e20, 0x5266: 0x407c3020, 0x5267: 0x407c3220, - 0x5268: 0x407c3420, 0x5269: 0x407c3620, 0x526a: 0x407c3820, 0x526b: 0x407c3a20, - 0x526c: 0x407c3c20, 0x526d: 0x407c3e20, 0x526e: 0x407c4020, 0x526f: 0x407c4220, - 0x5270: 0x407c4420, 0x5271: 0x407c4620, 0x5272: 0x407c4820, 0x5273: 0x407c4a20, - 0x5274: 0x407c4c20, 0x5275: 0x407c4e20, 0x5276: 0x407c5020, 0x5277: 0x407c5220, - 0x5278: 0x407c5420, 0x5279: 0x407c5620, 0x527a: 0x407c5820, 0x527b: 0x407c5a20, - 0x527c: 0x407c5c20, 0x527d: 0x407c5e20, 0x527e: 0x407c6020, 0x527f: 0x407c6220, - // Block 0x14a, offset 0x5280 - 0x5280: 0x407c6420, 0x5281: 0x407c6620, 0x5282: 0x407c6820, 0x5283: 0x407c6a20, - 0x5284: 0x407c6c20, 0x5285: 0x407c6e20, 0x5286: 0x407c7020, 0x5287: 0x407c7220, - 0x5288: 0x407c7420, 0x5289: 0x407c7620, 0x528a: 0x407c7820, 0x528b: 0x407c7a20, - 0x528c: 0x407c7c20, 0x528d: 0x407c7e20, 0x528e: 0x407c8020, 0x528f: 0x407c8220, - 0x5290: 0x407c8420, 0x5291: 0x407c8620, 0x5292: 0x407c8820, 0x5293: 0x407c8a20, - 0x5294: 0x407c8c20, 0x5295: 0x407c8e20, 0x5296: 0x407c9020, 0x5297: 0x407c9220, - 0x5298: 0x407c9420, 0x5299: 0x407c9620, 0x529a: 0x407c9820, 0x529b: 0x407c9a20, - 0x529c: 0x407c9c20, 0x529d: 0x407c9e20, 0x529e: 0x407ca020, 0x529f: 0x407ca220, - 0x52a0: 0x407ca420, 0x52a1: 0x407ca620, 0x52a2: 0x407ca820, 0x52a3: 0x407caa20, - 0x52a4: 0x407cac20, 0x52a5: 0x407cae20, 0x52a6: 0x407cb020, 0x52a7: 0x407cb220, - 0x52a8: 0x407cb420, 0x52a9: 0x407cb620, 0x52aa: 0x407cb820, 0x52ab: 0x407cba20, - 0x52ac: 0x407cbc20, 0x52ad: 0x407cbe20, 0x52ae: 0x407cc020, 0x52af: 0x407cc220, - 0x52b0: 0x407cc420, 0x52b1: 0x407cc620, 0x52b2: 0x407cc820, 0x52b3: 0x407cca20, - 0x52b4: 0x407ccc20, 0x52b5: 0x407cce20, 0x52b6: 0x407cd020, 0x52b7: 0x407cd220, - 0x52b8: 0x407cd420, 0x52b9: 0x407cd620, 0x52ba: 0x407cd820, 0x52bb: 0x407cda20, - 0x52bc: 0x407cdc20, 0x52bd: 0x407cde20, 0x52be: 0x407ce020, 0x52bf: 0x407ce220, - // Block 0x14b, offset 0x52c0 - 0x52c0: 0x407ce420, 0x52c1: 0x407ce620, 0x52c2: 0x407ce820, 0x52c3: 0x407cea20, - 0x52c4: 0x407cec20, 0x52c5: 0x407cee20, 0x52c6: 0x407cf020, 0x52c7: 0x407cf220, - 0x52c8: 0x407cf420, 0x52c9: 0x407cf620, 0x52ca: 0x407cf820, 0x52cb: 0x407cfa20, - 0x52cc: 0x407cfc20, 0x52cd: 0x407cfe20, 0x52ce: 0x407d0020, 0x52cf: 0x407d0220, - 0x52d0: 0x407d0420, 0x52d1: 0x407d0620, 0x52d2: 0x407d0820, 0x52d3: 0x407d0a20, - 0x52d4: 0x407d0c20, 0x52d5: 0x407d0e20, 0x52d6: 0x407d1020, 0x52d7: 0x407d1220, - 0x52d8: 0x407d1420, 0x52d9: 0x407d1620, 0x52da: 0x407d1820, 0x52db: 0x407d1a20, - 0x52dc: 0x407d1c20, 0x52dd: 0x407d1e20, 0x52de: 0x407d2020, 0x52df: 0x407d2220, - 0x52e0: 0x407d2420, 0x52e1: 0x407d2620, 0x52e2: 0x407d2820, 0x52e3: 0x407d2a20, - 0x52e4: 0x407d2c20, 0x52e5: 0x407d2e20, 0x52e6: 0x407d3020, 0x52e7: 0x407d3220, - 0x52e8: 0x407d3420, 0x52e9: 0x407d3620, 0x52ea: 0x407d3820, 0x52eb: 0x407d3a20, - 0x52ec: 0x407d3c20, 0x52ed: 0x407d3e20, 0x52ee: 0x407d4020, 0x52ef: 0x407d4220, - 0x52f0: 0x407d4420, 0x52f1: 0x407d4620, 0x52f2: 0x407d4820, 0x52f3: 0x407d4a20, - 0x52f4: 0x407d4c20, 0x52f5: 0x407d4e20, 0x52f6: 0x407d5020, 0x52f7: 0x407d5220, - 0x52f8: 0x407d5420, 0x52f9: 0x407d5620, 0x52fa: 0x407d5820, 0x52fb: 0x407d5a20, - 0x52fc: 0x407d5c20, 0x52fd: 0x407d5e20, 0x52fe: 0x407d6020, 0x52ff: 0x407d6220, - // Block 0x14c, offset 0x5300 - 0x5300: 0x407d6420, 0x5301: 0x407d6620, 0x5302: 0x407d6820, 0x5303: 0x407d6a20, - 0x5304: 0x407d6c20, 0x5305: 0x407d6e20, 0x5306: 0x407d7020, 0x5307: 0x407d7220, - 0x5308: 0x407d7420, 0x5309: 0x407d7620, 0x530a: 0x407d7820, 0x530b: 0x407d7a20, - 0x530c: 0x407d7c20, 0x530d: 0x407d7e20, 0x530e: 0x407d8020, 0x530f: 0x407d8220, - 0x5310: 0x407d8420, 0x5311: 0x407d8620, 0x5312: 0x407d8820, 0x5313: 0x407d8a20, - 0x5314: 0x407d8c20, 0x5315: 0x407d8e20, 0x5316: 0x407d9020, 0x5317: 0x407d9220, - 0x5318: 0x407d9420, 0x5319: 0x407d9620, 0x531a: 0x407d9820, 0x531b: 0x407d9a20, - 0x531c: 0x407d9c20, 0x531d: 0x407d9e20, 0x531e: 0x407da020, 0x531f: 0x407da220, - 0x5320: 0x407da420, 0x5321: 0x407da620, 0x5322: 0x407da820, 0x5323: 0x407daa20, - 0x5324: 0x407dac20, 0x5325: 0x407dae20, 0x5326: 0x407db020, 0x5327: 0x407db220, - 0x5328: 0x407db420, 0x5329: 0x407db620, 0x532a: 0x407db820, 0x532b: 0x407dba20, - 0x532c: 0x407dbc20, 0x532d: 0x407dbe20, 0x532e: 0x407dc020, - // Block 0x14d, offset 0x5340 - 0x5340: 0xe0000394, 0x5341: 0xe000045f, 0x5342: 0xe0000534, 0x5343: 0xe0000610, - 0x5344: 0xe00006cc, 0x5345: 0xe0000771, 0x5346: 0xe000081d, 0x5347: 0xe00008c2, - 0x5348: 0xe0000462, 0x5349: 0xe0000537, 0x534a: 0xe0000613, 0x534b: 0xe00006cf, - 0x534c: 0xe0000774, 0x534d: 0xe0000820, 0x534e: 0xe00008c5, 0x534f: 0xe000053a, - 0x5350: 0xe0000616, 0x5351: 0xe00006d2, 0x5352: 0xe0000777, 0x5353: 0xe0000823, - 0x5354: 0xe00008c8, 0x5355: 0xe000027f, 0x5356: 0xe0000397, 0x5357: 0xe0000465, - 0x5358: 0xe000053d, 0x5359: 0xe0000619, 0x535a: 0xe00006d5, 0x535b: 0xe000077a, - 0x535c: 0xe0000826, 0x535d: 0xe00008cb, 0x535e: 0xe0000282, 0x535f: 0xe000039a, - 0x5360: 0xe0000468, 0x5361: 0xe0000540, 0x5362: 0xe000061c, 0x5363: 0xe000039d, - 0x5364: 0xe000046b, 0x5365: 0xe000046e, 0x5366: 0xe0000543, 0x5367: 0xe000061f, - 0x5368: 0xe00006d8, 0x5369: 0xe000077d, 0x536a: 0xe0000829, 0x536b: 0xe00008ce, - 0x536c: 0xe0000285, 0x536d: 0xe00003a0, 0x536e: 0xe0000471, 0x536f: 0xe0000474, - 0x5370: 0xe0000546, 0x5371: 0xe0000622, 0x5372: 0x4029a020, 0x5373: 0x4029a220, - 0x5374: 0xe0000288, 0x5375: 0xe00003a3, 0x5376: 0xe0000477, 0x5377: 0xe000047a, - 0x5378: 0xe0000549, 0x5379: 0xe0000625, 0x537a: 0xe000047d, 0x537b: 0xe0000480, - 0x537c: 0xe000054c, 0x537d: 0xe000054f, 0x537e: 0xe0000552, 0x537f: 0xe0000555, - // Block 0x14e, offset 0x5380 - 0x5380: 0xe00006db, 0x5381: 0xe0000780, 0x5382: 0xe0000783, 0x5383: 0xe0000786, - 0x5384: 0xe000082c, 0x5385: 0xe000082f, 0x5386: 0xe00008d1, 0x5387: 0xe00008d4, - 0x5388: 0xe00008d7, 0x5389: 0xe00008da, 0x538a: 0xe00003a6, 0x538b: 0xe0000483, - 0x538c: 0xe0000558, 0x538d: 0xe0000628, 0x538e: 0xe00006de, 0x538f: 0xe000028b, - 0x5390: 0xe00003a9, 0x5391: 0xe0000486, 0x5392: 0xe000055b, 0x5393: 0xe000055e, - 0x5394: 0xe000062b, 0x5395: 0xe000062e, 0x5396: 0x4029a420, 0x5397: 0x4029a620, - 0x5398: 0xe000028e, 0x5399: 0xe00003ac, 0x539a: 0x4029a820, 0x539b: 0x4029aa20, - 0x539c: 0x4029ac20, 0x539d: 0x4029ae20, 0x539e: 0x4029b020, 0x539f: 0x4029b220, - 0x53a0: 0x4029b420, 0x53a1: 0x4029b620, 0x53a2: 0x4029b820, - 0x53b0: 0x4003ca20, 0x53b1: 0x4003cc20, 0x53b2: 0x4003ce20, 0x53b3: 0x4003d020, - // Block 0x14f, offset 0x53c0 - 0x53c0: 0x407dc220, 0x53c1: 0x407dc420, 0x53c2: 0x407dc620, 0x53c3: 0x407dc820, - 0x53c4: 0x407dca20, 0x53c5: 0x407dcc20, 0x53c6: 0x407dce20, 0x53c7: 0x407dd020, - 0x53c8: 0x407dd220, 0x53c9: 0x407dd420, 0x53ca: 0x407dd620, 0x53cb: 0x407dd820, - 0x53cc: 0x407dda20, 0x53cd: 0x407ddc20, 0x53ce: 0x407dde20, 0x53cf: 0x407de020, - 0x53d0: 0x407de220, 0x53d1: 0x407de420, 0x53d2: 0x407de620, 0x53d3: 0x407de820, - 0x53d4: 0x407dea20, 0x53d5: 0x407dec20, 0x53d6: 0x407dee20, 0x53d7: 0x407df020, - 0x53d8: 0x407df220, 0x53d9: 0x407df420, 0x53da: 0x407df620, 0x53db: 0x407df820, - 0x53dc: 0x407dfa20, 0x53dd: 0x407dfc20, 0x53de: 0x407dfe20, 0x53df: 0x407e0020, - 0x53e0: 0x407e0220, 0x53e1: 0x407e0420, 0x53e2: 0x407e0620, 0x53e3: 0x407e0820, - 0x53e4: 0x407e0a20, 0x53e5: 0x407e0c20, 0x53e6: 0x407e0e20, 0x53e7: 0x407e1020, - 0x53e8: 0x407e1220, 0x53e9: 0x407e1420, 0x53ea: 0x407e1620, 0x53eb: 0x407e1820, - 0x53ec: 0x407e1a20, 0x53ed: 0x407e1c20, 0x53ee: 0x407e1e20, 0x53ef: 0x407e2020, - 0x53f0: 0x407e2220, 0x53f1: 0x407e2420, 0x53f2: 0x407e2620, 0x53f3: 0x407e2820, - 0x53f4: 0x407e2a20, 0x53f5: 0x407e2c20, 0x53f6: 0x407e2e20, 0x53f7: 0x407e3020, - 0x53f8: 0x407e3220, 0x53f9: 0x407e3420, 0x53fa: 0x407e3620, 0x53fb: 0x407e3820, - 0x53fc: 0x407e3a20, 0x53fd: 0x407e3c20, 0x53fe: 0x407e3e20, 0x53ff: 0x407e4020, - // Block 0x150, offset 0x5400 - 0x5400: 0x407e4220, 0x5401: 0x407e4420, 0x5402: 0x407e4620, 0x5403: 0x407e4820, - 0x5404: 0x407e4a20, 0x5405: 0x407e4c20, 0x5406: 0x407e4e20, 0x5407: 0x407e5020, - 0x5408: 0x407e5220, 0x5409: 0x407e5420, 0x540a: 0x407e5620, 0x540b: 0x407e5820, - 0x540c: 0x407e5a20, 0x540d: 0x407e5c20, 0x540e: 0x407e5e20, 0x540f: 0x407e6020, - 0x5410: 0x407e6220, 0x5411: 0x407e6420, 0x5412: 0x407e6620, 0x5413: 0x407e6820, - 0x5414: 0x407e6a20, 0x5415: 0x407e6c20, 0x5416: 0x407e6e20, 0x5417: 0x407e7020, - 0x5418: 0x407e7220, 0x5419: 0x407e7420, 0x541a: 0x407e7620, 0x541b: 0x407e7820, - 0x541c: 0x407e7a20, 0x541d: 0x407e7c20, 0x541e: 0x407e7e20, 0x541f: 0x407e8020, - 0x5420: 0x407e8220, 0x5421: 0x407e8420, 0x5422: 0x407e8620, 0x5423: 0x407e8820, - 0x5424: 0x407e8a20, 0x5425: 0x407e8c20, 0x5426: 0x407e8e20, 0x5427: 0x407e9020, - 0x5428: 0x407e9220, 0x5429: 0x407e9420, 0x542a: 0x407e9620, 0x542b: 0x407e9820, - 0x542c: 0x407e9a20, 0x542d: 0x407e9c20, 0x542e: 0x407e9e20, 0x542f: 0x407ea020, - 0x5430: 0x407ea220, 0x5431: 0x407ea420, 0x5432: 0x407ea620, 0x5433: 0x407ea820, - 0x5434: 0x407eaa20, 0x5435: 0x407eac20, 0x5436: 0x407eae20, 0x5437: 0x407eb020, - 0x5438: 0x407eb220, 0x5439: 0x407eb420, 0x543a: 0x407eb620, 0x543b: 0x407eb820, - 0x543c: 0x407eba20, 0x543d: 0x407ebc20, 0x543e: 0x407ebe20, 0x543f: 0x407ec020, - // Block 0x151, offset 0x5440 - 0x5440: 0x407ec220, 0x5441: 0x407ec420, 0x5442: 0x407ec620, 0x5443: 0x407ec820, - 0x5444: 0x407eca20, 0x5445: 0x407ecc20, 0x5446: 0x407ece20, 0x5447: 0x407ed020, - 0x5448: 0x407ed220, 0x5449: 0x407ed420, 0x544a: 0x407ed620, 0x544b: 0x407ed820, - 0x544c: 0x407eda20, 0x544d: 0x407edc20, 0x544e: 0x407ede20, 0x544f: 0x407ee020, - 0x5450: 0x407ee220, 0x5451: 0x407ee420, 0x5452: 0x407ee620, 0x5453: 0x407ee820, - 0x5454: 0x407eea20, 0x5455: 0x407eec20, 0x5456: 0x407eee20, 0x5457: 0x407ef020, - 0x5458: 0x407ef220, 0x5459: 0x407ef420, 0x545a: 0x407ef620, 0x545b: 0x407ef820, - 0x545c: 0x407efa20, 0x545d: 0x407efc20, 0x545e: 0x407efe20, 0x545f: 0x407f0020, - 0x5460: 0x407f0220, 0x5461: 0x407f0420, 0x5462: 0x407f0620, 0x5463: 0x407f0820, - 0x5464: 0x407f0a20, 0x5465: 0x407f0c20, 0x5466: 0x407f0e20, 0x5467: 0x407f1020, - 0x5468: 0x407f1220, 0x5469: 0x407f1420, 0x546a: 0x407f1620, 0x546b: 0x407f1820, - 0x546c: 0x407f1a20, 0x546d: 0x407f1c20, 0x546e: 0x407f1e20, 0x546f: 0x407f2020, - 0x5470: 0x407f2220, 0x5471: 0x407f2420, 0x5472: 0x407f2620, 0x5473: 0x407f2820, - 0x5474: 0x407f2a20, 0x5475: 0x407f2c20, 0x5476: 0x407f2e20, 0x5477: 0x407f3020, - 0x5478: 0x407f3220, 0x5479: 0x407f3420, 0x547a: 0x407f3620, 0x547b: 0x407f3820, - 0x547c: 0x407f3a20, 0x547d: 0x407f3c20, 0x547e: 0x407f3e20, 0x547f: 0x407f4020, - // Block 0x152, offset 0x5480 - 0x5480: 0x407f4220, 0x5481: 0x407f4420, 0x5482: 0x407f4620, 0x5483: 0x407f4820, - 0x5484: 0x407f4a20, 0x5485: 0x407f4c20, 0x5486: 0x407f4e20, 0x5487: 0x407f5020, - 0x5488: 0x407f5220, 0x5489: 0x407f5420, 0x548a: 0x407f5620, 0x548b: 0x407f5820, - 0x548c: 0x407f5a20, 0x548d: 0x407f5c20, 0x548e: 0x407f5e20, 0x548f: 0x407f6020, - 0x5490: 0x407f6220, 0x5491: 0x407f6420, 0x5492: 0x407f6620, 0x5493: 0x407f6820, - 0x5494: 0x407f6a20, 0x5495: 0x407f6c20, 0x5496: 0x407f6e20, 0x5497: 0x407f7020, - 0x5498: 0x407f7220, 0x5499: 0x407f7420, 0x549a: 0x407f7620, 0x549b: 0x407f7820, - 0x549c: 0x407f7a20, 0x549d: 0x407f7c20, 0x549e: 0x407f7e20, 0x549f: 0x407f8020, - 0x54a0: 0x407f8220, 0x54a1: 0x407f8420, 0x54a2: 0x407f8620, 0x54a3: 0x407f8820, - 0x54a4: 0x407f8a20, 0x54a5: 0x407f8c20, 0x54a6: 0x407f8e20, 0x54a7: 0x407f9020, - 0x54a8: 0x407f9220, 0x54a9: 0x407f9420, 0x54aa: 0x407f9620, 0x54ab: 0x407f9820, - 0x54ac: 0x407f9a20, 0x54ad: 0x407f9c20, 0x54ae: 0x407f9e20, 0x54af: 0x407fa020, - 0x54b0: 0x407fa220, 0x54b1: 0x407fa420, 0x54b2: 0x407fa620, 0x54b3: 0x407fa820, - 0x54b4: 0x407faa20, 0x54b5: 0x407fac20, 0x54b6: 0x407fae20, 0x54b7: 0x407fb020, - 0x54b8: 0x407fb220, 0x54b9: 0x407fb420, 0x54ba: 0x407fb620, 0x54bb: 0x407fb820, - 0x54bc: 0x407fba20, 0x54bd: 0x407fbc20, 0x54be: 0x407fbe20, 0x54bf: 0x407fc020, - // Block 0x153, offset 0x54c0 - 0x54c0: 0x407fc220, 0x54c1: 0x407fc420, 0x54c2: 0x407fc620, 0x54c3: 0x407fc820, - 0x54c4: 0x407fca20, 0x54c5: 0x407fcc20, 0x54c6: 0x407fce20, 0x54c7: 0x407fd020, - 0x54c8: 0x407fd220, 0x54c9: 0x407fd420, 0x54ca: 0x407fd620, 0x54cb: 0x407fd820, - 0x54cc: 0x407fda20, 0x54cd: 0x407fdc20, 0x54ce: 0x407fde20, 0x54cf: 0x407fe020, - 0x54d0: 0x407fe220, 0x54d1: 0x407fe420, 0x54d2: 0x407fe620, 0x54d3: 0x407fe820, - 0x54d4: 0x407fea20, 0x54d5: 0x407fec20, 0x54d6: 0x407fee20, 0x54d7: 0x407ff020, - 0x54d8: 0x407ff220, 0x54d9: 0x407ff420, 0x54da: 0x407ff620, 0x54db: 0x407ff820, - 0x54dc: 0x407ffa20, 0x54dd: 0x407ffc20, 0x54de: 0x407ffe20, 0x54df: 0x40800020, - 0x54e0: 0x40800220, 0x54e1: 0x40800420, 0x54e2: 0x40800620, 0x54e3: 0x40800820, - 0x54e4: 0x40800a20, 0x54e5: 0x40800c20, 0x54e6: 0x40800e20, 0x54e7: 0x40801020, - 0x54e8: 0x40801220, 0x54e9: 0x40801420, 0x54ea: 0x40801620, 0x54eb: 0x40801820, - 0x54ec: 0x40801a20, 0x54ed: 0x40801c20, 0x54ee: 0x40801e20, 0x54ef: 0x40802020, - 0x54f0: 0x40802220, 0x54f1: 0x40802420, 0x54f2: 0x40802620, 0x54f3: 0x40802820, - 0x54f4: 0x40802a20, 0x54f5: 0x40802c20, 0x54f6: 0x40802e20, 0x54f7: 0x40803020, - 0x54f8: 0x40803220, 0x54f9: 0x40803420, 0x54fa: 0x40803620, 0x54fb: 0x40803820, - 0x54fc: 0x40803a20, 0x54fd: 0x40803c20, 0x54fe: 0x40803e20, 0x54ff: 0x40804020, - // Block 0x154, offset 0x5500 - 0x5500: 0x40804220, 0x5501: 0x40804420, 0x5502: 0x40804620, 0x5503: 0x40804820, - 0x5504: 0x40804a20, 0x5505: 0x40804c20, 0x5506: 0x40804e20, 0x5507: 0x40805020, - 0x5508: 0x40805220, 0x5509: 0x40805420, 0x550a: 0x40805620, 0x550b: 0x40805820, - 0x550c: 0x40805a20, 0x550d: 0x40805c20, 0x550e: 0x40805e20, 0x550f: 0x40806020, - 0x5510: 0x40806220, 0x5511: 0x40806420, 0x5512: 0x40806620, 0x5513: 0x40806820, - 0x5514: 0x40806a20, 0x5515: 0x40806c20, 0x5516: 0x40806e20, 0x5517: 0x40807020, - 0x5518: 0x40807220, 0x5519: 0x40807420, 0x551a: 0x40807620, 0x551b: 0x40807820, - 0x551c: 0x40807a20, 0x551d: 0x40807c20, 0x551e: 0x40807e20, 0x551f: 0x40808020, - 0x5520: 0x40808220, 0x5521: 0x40808420, 0x5522: 0x40808620, 0x5523: 0x40808820, - 0x5524: 0x40808a20, 0x5525: 0x40808c20, 0x5526: 0x40808e20, 0x5527: 0x40809020, - 0x5528: 0x40809220, 0x5529: 0x40809420, 0x552a: 0x40809620, 0x552b: 0x40809820, - 0x552c: 0x40809a20, 0x552d: 0x40809c20, 0x552e: 0x40809e20, 0x552f: 0x4080a020, - 0x5530: 0x4080a220, 0x5531: 0x4080a420, 0x5532: 0x4080a620, 0x5533: 0x4080a820, - 0x5534: 0x4080aa20, 0x5535: 0x4080ac20, 0x5536: 0x4080ae20, 0x5537: 0x4080b020, - 0x5538: 0x4080b220, 0x5539: 0x4080b420, 0x553a: 0x4080b620, 0x553b: 0x4080b820, - 0x553c: 0x4080ba20, 0x553d: 0x4080bc20, 0x553e: 0x4080be20, 0x553f: 0x4080c020, - // Block 0x155, offset 0x5540 - 0x5540: 0x4080c220, 0x5541: 0x4080c420, 0x5542: 0x4080c620, 0x5543: 0x4080c820, - 0x5544: 0x4080ca20, 0x5545: 0x4080cc20, 0x5546: 0x4080ce20, 0x5547: 0x4080d020, - 0x5548: 0x4080d220, 0x5549: 0x4080d420, 0x554a: 0x4080d620, 0x554b: 0x4080d820, - 0x554c: 0x4080da20, 0x554d: 0x4080dc20, 0x554e: 0x4080de20, 0x554f: 0x4080e020, - 0x5550: 0x4080e220, 0x5551: 0x4080e420, 0x5552: 0x4080e620, 0x5553: 0x4080e820, - 0x5554: 0x4080ea20, 0x5555: 0x4080ec20, 0x5556: 0x4080ee20, 0x5557: 0x4080f020, - 0x5558: 0x4080f220, 0x5559: 0x4080f420, 0x555a: 0x4080f620, 0x555b: 0x4080f820, - 0x555c: 0x4080fa20, 0x555d: 0x4080fc20, 0x555e: 0x4080fe20, 0x555f: 0x40810020, - 0x5560: 0x40810220, 0x5561: 0x40810420, 0x5562: 0x40810620, 0x5563: 0x40810820, - 0x5564: 0x40810a20, 0x5565: 0x40810c20, 0x5566: 0x40810e20, 0x5567: 0x40811020, - 0x5568: 0x40811220, 0x5569: 0x40811420, 0x556a: 0x40811620, 0x556b: 0x40811820, - 0x556c: 0x40811a20, 0x556d: 0x40811c20, 0x556e: 0x40811e20, 0x556f: 0x40812020, - 0x5570: 0x40812220, 0x5571: 0x40812420, 0x5572: 0x40812620, 0x5573: 0x40812820, - 0x5574: 0x40812a20, 0x5575: 0x40812c20, 0x5576: 0x40812e20, 0x5577: 0x40813020, - 0x5578: 0x40813220, 0x5579: 0x40813420, 0x557a: 0x40813620, 0x557b: 0x40813820, - 0x557c: 0x40813a20, 0x557d: 0x40813c20, 0x557e: 0x40813e20, 0x557f: 0x40814020, - // Block 0x156, offset 0x5580 - 0x5580: 0x40814220, 0x5581: 0x40814420, 0x5582: 0x40814620, 0x5583: 0x40814820, - 0x5584: 0x40814a20, 0x5585: 0x40814c20, 0x5586: 0x40814e20, 0x5587: 0x40815020, - 0x5588: 0x40815220, 0x5589: 0x40815420, 0x558a: 0x40815620, 0x558b: 0x40815820, - 0x558c: 0x40815a20, 0x558d: 0x40815c20, 0x558e: 0x40815e20, 0x558f: 0x40816020, - 0x5590: 0x40816220, 0x5591: 0x40816420, 0x5592: 0x40816620, 0x5593: 0x40816820, - 0x5594: 0x40816a20, 0x5595: 0x40816c20, 0x5596: 0x40816e20, 0x5597: 0x40817020, - 0x5598: 0x40817220, 0x5599: 0x40817420, 0x559a: 0x40817620, 0x559b: 0x40817820, - 0x559c: 0x40817a20, 0x559d: 0x40817c20, 0x559e: 0x40817e20, 0x559f: 0x40818020, - 0x55a0: 0x40818220, 0x55a1: 0x40818420, 0x55a2: 0x40818620, 0x55a3: 0x40818820, - 0x55a4: 0x40818a20, 0x55a5: 0x40818c20, 0x55a6: 0x40818e20, 0x55a7: 0x40819020, - 0x55a8: 0x40819220, 0x55a9: 0x40819420, 0x55aa: 0x40819620, 0x55ab: 0x40819820, - 0x55ac: 0x40819a20, 0x55ad: 0x40819c20, 0x55ae: 0x40819e20, 0x55af: 0x4081a020, - 0x55b0: 0x4081a220, 0x55b1: 0x4081a420, 0x55b2: 0x4081a620, 0x55b3: 0x4081a820, - 0x55b4: 0x4081aa20, 0x55b5: 0x4081ac20, 0x55b6: 0x4081ae20, 0x55b7: 0x4081b020, - 0x55b8: 0x4081b220, 0x55b9: 0x4081b420, 0x55ba: 0x4081b620, 0x55bb: 0x4081b820, - 0x55bc: 0x4081ba20, 0x55bd: 0x4081bc20, 0x55be: 0x4081be20, 0x55bf: 0x4081c020, - // Block 0x157, offset 0x55c0 - 0x55c0: 0x4081c220, 0x55c1: 0x4081c420, 0x55c2: 0x4081c620, 0x55c3: 0x4081c820, - 0x55c4: 0x4081ca20, 0x55c5: 0x4081cc20, 0x55c6: 0x4081ce20, 0x55c7: 0x4081d020, - 0x55c8: 0x4081d220, 0x55c9: 0x4081d420, 0x55ca: 0x4081d620, 0x55cb: 0x4081d820, - 0x55cc: 0x4081da20, 0x55cd: 0x4081dc20, 0x55ce: 0x4081de20, 0x55cf: 0x4081e020, - 0x55d0: 0x4081e220, 0x55d1: 0x4081e420, 0x55d2: 0x4081e620, 0x55d3: 0x4081e820, - 0x55d4: 0x4081ea20, 0x55d5: 0x4081ec20, 0x55d6: 0x4081ee20, 0x55d7: 0x4081f020, - 0x55d8: 0x4081f220, 0x55d9: 0x4081f420, 0x55da: 0x4081f620, 0x55db: 0x4081f820, - 0x55dc: 0x4081fa20, 0x55dd: 0x4081fc20, 0x55de: 0x4081fe20, 0x55df: 0x40820020, - 0x55e0: 0x40820220, 0x55e1: 0x40820420, 0x55e2: 0x40820620, 0x55e3: 0x40820820, - 0x55e4: 0x40820a20, 0x55e5: 0x40820c20, 0x55e6: 0x40820e20, 0x55e7: 0x40821020, - 0x55e8: 0x40821220, 0x55e9: 0x40821420, 0x55ea: 0x40821620, 0x55eb: 0x40821820, - 0x55ec: 0x40821a20, 0x55ed: 0x40821c20, 0x55ee: 0x40821e20, 0x55ef: 0x40822020, - 0x55f0: 0x40822220, 0x55f1: 0x40822420, 0x55f2: 0x40822620, 0x55f3: 0x40822820, - 0x55f4: 0x40822a20, 0x55f5: 0x40822c20, 0x55f6: 0x40822e20, 0x55f7: 0x40823020, - 0x55f8: 0x40823220, 0x55f9: 0x40823420, 0x55fa: 0x40823620, 0x55fb: 0x40823820, - 0x55fc: 0x40823a20, 0x55fd: 0x40823c20, 0x55fe: 0x40823e20, 0x55ff: 0x40824020, - // Block 0x158, offset 0x5600 - 0x5600: 0x40824220, 0x5601: 0x40824420, 0x5602: 0x40824620, 0x5603: 0x40824820, - 0x5604: 0x40824a20, 0x5605: 0x40824c20, 0x5606: 0x40824e20, 0x5607: 0x40825020, - 0x5608: 0x40825220, 0x5609: 0x40825420, 0x560a: 0x40825620, 0x560b: 0x40825820, - 0x560c: 0x40825a20, 0x560d: 0x40825c20, 0x560e: 0x40825e20, 0x560f: 0x40826020, - 0x5610: 0x40826220, 0x5611: 0x40826420, 0x5612: 0x40826620, 0x5613: 0x40826820, - 0x5614: 0x40826a20, 0x5615: 0x40826c20, 0x5616: 0x40826e20, 0x5617: 0x40827020, - 0x5618: 0x40827220, 0x5619: 0x40827420, 0x561a: 0x40827620, 0x561b: 0x40827820, - 0x561c: 0x40827a20, 0x561d: 0x40827c20, 0x561e: 0x40827e20, 0x561f: 0x40828020, - 0x5620: 0x40828220, 0x5621: 0x40828420, 0x5622: 0x40828620, 0x5623: 0x40828820, - 0x5624: 0x40828a20, 0x5625: 0x40828c20, 0x5626: 0x40828e20, 0x5627: 0x40829020, - 0x5628: 0x40829220, 0x5629: 0x40829420, 0x562a: 0x40829620, 0x562b: 0x40829820, - 0x562c: 0x40829a20, 0x562d: 0x40829c20, 0x562e: 0x40829e20, 0x562f: 0x4082a020, - 0x5630: 0x4082a220, 0x5631: 0x4082a420, 0x5632: 0x4082a620, 0x5633: 0x4082a820, - 0x5634: 0x4082aa20, 0x5635: 0x4082ac20, 0x5636: 0x4082ae20, 0x5637: 0x4082b020, - 0x5638: 0x4082b220, 0x5639: 0x4082b420, 0x563a: 0x4082b620, 0x563b: 0x4082b820, - 0x563c: 0x4082ba20, 0x563d: 0x4082bc20, 0x563e: 0x4082be20, 0x563f: 0x4082c020, - // Block 0x159, offset 0x5640 - 0x5640: 0x4082c220, 0x5641: 0x4082c420, 0x5642: 0x4082c620, 0x5643: 0x4082c820, - 0x5644: 0x4082ca20, 0x5645: 0x4082cc20, 0x5646: 0x4082ce20, 0x5647: 0x4082d020, - 0x5648: 0x4082d220, 0x5649: 0x4082d420, 0x564a: 0x4082d620, 0x564b: 0x4082d820, - 0x564c: 0x4082da20, 0x564d: 0x4082dc20, 0x564e: 0x4082de20, 0x564f: 0x4082e020, - 0x5650: 0x4082e220, 0x5651: 0x4082e420, 0x5652: 0x4082e620, 0x5653: 0x4082e820, - 0x5654: 0x4082ea20, 0x5655: 0x4082ec20, 0x5656: 0x4082ee20, 0x5657: 0x4082f020, - 0x5658: 0x4082f220, 0x5659: 0x4082f420, 0x565a: 0x4082f620, 0x565b: 0x4082f820, - 0x565c: 0x4082fa20, 0x565d: 0x4082fc20, 0x565e: 0x4082fe20, 0x565f: 0x40830020, - 0x5660: 0x40830220, 0x5661: 0x40830420, 0x5662: 0x40830620, 0x5663: 0x40830820, - 0x5664: 0x40830a20, 0x5665: 0x40830c20, 0x5666: 0x40830e20, 0x5667: 0x40831020, - 0x5668: 0x40831220, 0x5669: 0x40831420, 0x566a: 0x40831620, 0x566b: 0x40831820, - 0x566c: 0x40831a20, 0x566d: 0x40831c20, 0x566e: 0x40831e20, 0x566f: 0x40832020, - 0x5670: 0x40832220, 0x5671: 0x40832420, 0x5672: 0x40832620, 0x5673: 0x40832820, - 0x5674: 0x40832a20, 0x5675: 0x40832c20, 0x5676: 0x40832e20, 0x5677: 0x40833020, - 0x5678: 0x40833220, 0x5679: 0x40833420, 0x567a: 0x40833620, 0x567b: 0x40833820, - 0x567c: 0x40833a20, 0x567d: 0x40833c20, 0x567e: 0x40833e20, 0x567f: 0x40834020, - // Block 0x15a, offset 0x5680 - 0x5680: 0x40834220, 0x5681: 0x40834420, 0x5682: 0x40834620, 0x5683: 0x40834820, - 0x5684: 0x40834a20, 0x5685: 0x40834c20, 0x5686: 0x40834e20, 0x5687: 0x40835020, - 0x5688: 0x40835220, 0x5689: 0x40835420, 0x568a: 0x40835620, 0x568b: 0x40835820, - 0x568c: 0x40835a20, 0x568d: 0x40835c20, 0x568e: 0x40835e20, 0x568f: 0x40836020, - 0x5690: 0x40836220, 0x5691: 0x40836420, 0x5692: 0x40836620, 0x5693: 0x40836820, - 0x5694: 0x40836a20, 0x5695: 0x40836c20, 0x5696: 0x40836e20, 0x5697: 0x40837020, - 0x5698: 0x40837220, 0x5699: 0x40837420, 0x569a: 0x40837620, 0x569b: 0x40837820, - 0x569c: 0x40837a20, 0x569d: 0x40837c20, 0x569e: 0x40837e20, 0x569f: 0x40838020, - 0x56a0: 0x40838220, 0x56a1: 0x40838420, 0x56a2: 0x40838620, 0x56a3: 0x40838820, - 0x56a4: 0x40838a20, 0x56a5: 0x40838c20, 0x56a6: 0x40838e20, 0x56a7: 0x40839020, - 0x56a8: 0x40839220, 0x56a9: 0x40839420, 0x56aa: 0x40839620, 0x56ab: 0x40839820, - 0x56ac: 0x40839a20, 0x56ad: 0x40839c20, 0x56ae: 0x40839e20, 0x56af: 0x4083a020, - 0x56b0: 0x4083a220, 0x56b1: 0x4083a420, 0x56b2: 0x4083a620, 0x56b3: 0x4083a820, - 0x56b4: 0x4083aa20, 0x56b5: 0x4083ac20, 0x56b6: 0x4083ae20, 0x56b7: 0x4083b020, - 0x56b8: 0x4083b220, 0x56b9: 0x4083b420, 0x56ba: 0x4083b620, 0x56bb: 0x4083b820, - 0x56bc: 0x4083ba20, 0x56bd: 0x4083bc20, 0x56be: 0x4083be20, 0x56bf: 0x4083c020, - // Block 0x15b, offset 0x56c0 - 0x56c0: 0x4083c220, 0x56c1: 0x4083c420, 0x56c2: 0x4083c620, 0x56c3: 0x4083c820, - 0x56c4: 0x4083ca20, 0x56c5: 0x4083cc20, 0x56c6: 0x4083ce20, 0x56c7: 0x4083d020, - 0x56c8: 0x4083d220, 0x56c9: 0x4083d420, 0x56ca: 0x4083d620, 0x56cb: 0x4083d820, - 0x56cc: 0x4083da20, 0x56cd: 0x4083dc20, 0x56ce: 0x4083de20, 0x56cf: 0x4083e020, - 0x56d0: 0x4083e220, 0x56d1: 0x4083e420, 0x56d2: 0x4083e620, 0x56d3: 0x4083e820, - 0x56d4: 0x4083ea20, 0x56d5: 0x4083ec20, 0x56d6: 0x4083ee20, 0x56d7: 0x4083f020, - 0x56d8: 0x4083f220, 0x56d9: 0x4083f420, 0x56da: 0x4083f620, 0x56db: 0x4083f820, - 0x56dc: 0x4083fa20, 0x56dd: 0x4083fc20, 0x56de: 0x4083fe20, 0x56df: 0x40840020, - 0x56e0: 0x40840220, 0x56e1: 0x40840420, 0x56e2: 0x40840620, 0x56e3: 0x40840820, - 0x56e4: 0x40840a20, 0x56e5: 0x40840c20, 0x56e6: 0x40840e20, 0x56e7: 0x40841020, - 0x56e8: 0x40841220, 0x56e9: 0x40841420, 0x56ea: 0x40841620, 0x56eb: 0x40841820, - 0x56ec: 0x40841a20, 0x56ed: 0x40841c20, 0x56ee: 0x40841e20, 0x56ef: 0x40842020, - 0x56f0: 0x40842220, 0x56f1: 0x40842420, 0x56f2: 0x40842620, 0x56f3: 0x40842820, - 0x56f4: 0x40842a20, 0x56f5: 0x40842c20, 0x56f6: 0x40842e20, 0x56f7: 0x40843020, - 0x56f8: 0x40843220, 0x56f9: 0x40843420, 0x56fa: 0x40843620, 0x56fb: 0x40843820, - 0x56fc: 0x40843a20, 0x56fd: 0x40843c20, 0x56fe: 0x40843e20, 0x56ff: 0x40844020, - // Block 0x15c, offset 0x5700 - 0x5700: 0x40844220, 0x5701: 0x40844420, 0x5702: 0x40844620, 0x5703: 0x40844820, - 0x5704: 0x40844a20, 0x5705: 0x40844c20, 0x5706: 0x40844e20, 0x5707: 0x40845020, - 0x5708: 0x40845220, 0x5709: 0x40845420, 0x570a: 0x40845620, 0x570b: 0x40845820, - 0x570c: 0x40845a20, 0x570d: 0x40845c20, 0x570e: 0x40845e20, 0x570f: 0x40846020, - 0x5710: 0x40846220, 0x5711: 0x40846420, 0x5712: 0x40846620, 0x5713: 0x40846820, - 0x5714: 0x40846a20, 0x5715: 0x40846c20, 0x5716: 0x40846e20, 0x5717: 0x40847020, - 0x5718: 0x40847220, 0x5719: 0x40847420, 0x571a: 0x40847620, 0x571b: 0x40847820, - 0x571c: 0x40847a20, 0x571d: 0x40847c20, 0x571e: 0x40847e20, 0x571f: 0x40848020, - 0x5720: 0x40848220, 0x5721: 0x40848420, 0x5722: 0x40848620, 0x5723: 0x40848820, - 0x5724: 0x40848a20, 0x5725: 0x40848c20, 0x5726: 0x40848e20, 0x5727: 0x40849020, - 0x5728: 0x40849220, 0x5729: 0x40849420, 0x572a: 0x40849620, 0x572b: 0x40849820, - 0x572c: 0x40849a20, 0x572d: 0x40849c20, 0x572e: 0x40849e20, 0x572f: 0x4084a020, - 0x5730: 0x4084a220, 0x5731: 0x4084a420, 0x5732: 0x4084a620, 0x5733: 0x4084a820, - 0x5734: 0x4084aa20, 0x5735: 0x4084ac20, 0x5736: 0x4084ae20, 0x5737: 0x4084b020, - 0x5738: 0x4084b220, 0x5739: 0x4084b420, 0x573a: 0x4084b620, 0x573b: 0x4084b820, - 0x573c: 0x4084ba20, 0x573d: 0x4084bc20, 0x573e: 0x4084be20, 0x573f: 0x4084c020, - // Block 0x15d, offset 0x5740 - 0x5740: 0x4084c220, 0x5741: 0x4084c420, 0x5742: 0x4084c620, 0x5743: 0x4084c820, - 0x5744: 0x4084ca20, 0x5745: 0x4084cc20, 0x5746: 0x4084ce20, 0x5747: 0x4084d020, - 0x5748: 0x4084d220, 0x5749: 0x4084d420, 0x574a: 0x4084d620, 0x574b: 0x4084d820, - 0x574c: 0x4084da20, 0x574d: 0x4084dc20, 0x574e: 0x4084de20, 0x574f: 0x4084e020, - 0x5750: 0x4084e220, 0x5751: 0x4084e420, 0x5752: 0x4084e620, 0x5753: 0x4084e820, - 0x5754: 0x4084ea20, 0x5755: 0x4084ec20, 0x5756: 0x4084ee20, 0x5757: 0x4084f020, - 0x5758: 0x4084f220, 0x5759: 0x4084f420, 0x575a: 0x4084f620, 0x575b: 0x4084f820, - 0x575c: 0x4084fa20, 0x575d: 0x4084fc20, 0x575e: 0x4084fe20, 0x575f: 0x40850020, - 0x5760: 0x40850220, 0x5761: 0x40850420, 0x5762: 0x40850620, 0x5763: 0x40850820, - 0x5764: 0x40850a20, 0x5765: 0x40850c20, 0x5766: 0x40850e20, 0x5767: 0x40851020, - 0x5768: 0x40851220, 0x5769: 0x40851420, 0x576a: 0x40851620, 0x576b: 0x40851820, - 0x576c: 0x40851a20, 0x576d: 0x40851c20, 0x576e: 0x40851e20, 0x576f: 0x40852020, - 0x5770: 0x40852220, 0x5771: 0x40852420, 0x5772: 0x40852620, 0x5773: 0x40852820, - 0x5774: 0x40852a20, 0x5775: 0x40852c20, 0x5776: 0x40852e20, 0x5777: 0x40853020, - 0x5778: 0x40853220, 0x5779: 0x40853420, 0x577a: 0x40853620, 0x577b: 0x40853820, - 0x577c: 0x40853a20, 0x577d: 0x40853c20, 0x577e: 0x40853e20, 0x577f: 0x40854020, - // Block 0x15e, offset 0x5780 - 0x5780: 0x40854220, 0x5781: 0x40854420, 0x5782: 0x40854620, 0x5783: 0x40854820, - 0x5784: 0x40854a20, 0x5785: 0x40854c20, 0x5786: 0x40854e20, 0x5787: 0x40855020, - 0x5788: 0x40855220, 0x5789: 0x40855420, 0x578a: 0x40855620, 0x578b: 0x40855820, - 0x578c: 0x40855a20, 0x578d: 0x40855c20, 0x578e: 0x40855e20, 0x578f: 0x40856020, - 0x5790: 0x40856220, 0x5791: 0x40856420, 0x5792: 0x40856620, 0x5793: 0x40856820, - 0x5794: 0x40856a20, 0x5795: 0x40856c20, 0x5796: 0x40856e20, 0x5797: 0x40857020, - 0x5798: 0x40857220, 0x5799: 0x40857420, 0x579a: 0x40857620, 0x579b: 0x40857820, - 0x579c: 0x40857a20, 0x579d: 0x40857c20, 0x579e: 0x40857e20, 0x579f: 0x40858020, - 0x57a0: 0x40858220, 0x57a1: 0x40858420, 0x57a2: 0x40858620, 0x57a3: 0x40858820, - 0x57a4: 0x40858a20, 0x57a5: 0x40858c20, 0x57a6: 0x40858e20, 0x57a7: 0x40859020, - 0x57a8: 0x40859220, 0x57a9: 0x40859420, 0x57aa: 0x40859620, 0x57ab: 0x40859820, - 0x57ac: 0x40859a20, 0x57ad: 0x40859c20, 0x57ae: 0x40859e20, 0x57af: 0x4085a020, - 0x57b0: 0x4085a220, 0x57b1: 0x4085a420, 0x57b2: 0x4085a620, 0x57b3: 0x4085a820, - 0x57b4: 0x4085aa20, 0x57b5: 0x4085ac20, 0x57b6: 0x4085ae20, 0x57b7: 0x4085b020, - 0x57b8: 0x4085b220, 0x57b9: 0x4085b420, 0x57ba: 0x4085b620, 0x57bb: 0x4085b820, - 0x57bc: 0x4085ba20, 0x57bd: 0x4085bc20, 0x57be: 0x4085be20, 0x57bf: 0x4085c020, - // Block 0x15f, offset 0x57c0 - 0x57c0: 0x4085c220, 0x57c1: 0x4085c420, 0x57c2: 0x4085c620, 0x57c3: 0x4085c820, - 0x57c4: 0x4085ca20, 0x57c5: 0x4085cc20, 0x57c6: 0x4085ce20, 0x57c7: 0x4085d020, - 0x57c8: 0x4085d220, 0x57c9: 0x4085d420, 0x57ca: 0x4085d620, 0x57cb: 0x4085d820, - 0x57cc: 0x4085da20, 0x57cd: 0x4085dc20, 0x57ce: 0x4085de20, 0x57cf: 0x4085e020, - 0x57d0: 0x4085e220, 0x57d1: 0x4085e420, 0x57d2: 0x4085e620, 0x57d3: 0x4085e820, - 0x57d4: 0x4085ea20, 0x57d5: 0x4085ec20, 0x57d6: 0x4085ee20, 0x57d7: 0x4085f020, - 0x57d8: 0x4085f220, 0x57d9: 0x4085f420, 0x57da: 0x4085f620, 0x57db: 0x4085f820, - 0x57dc: 0x4085fa20, 0x57dd: 0x4085fc20, 0x57de: 0x4085fe20, 0x57df: 0x40860020, - 0x57e0: 0x40860220, 0x57e1: 0x40860420, 0x57e2: 0x40860620, 0x57e3: 0x40860820, - 0x57e4: 0x40860a20, 0x57e5: 0x40860c20, 0x57e6: 0x40860e20, 0x57e7: 0x40861020, - 0x57e8: 0x40861220, 0x57e9: 0x40861420, 0x57ea: 0x40861620, 0x57eb: 0x40861820, - 0x57ec: 0x40861a20, 0x57ed: 0x40861c20, 0x57ee: 0x40861e20, - // Block 0x160, offset 0x5800 - 0x5800: 0x405e3a20, 0x5801: 0x405e3c20, 0x5802: 0x405e3e20, 0x5803: 0x405e4020, - 0x5804: 0x405e4220, 0x5805: 0x405e4420, 0x5806: 0x405e4620, 0x5807: 0x405e4820, - 0x5808: 0x405e4a20, 0x5809: 0x405e4c20, 0x580a: 0x405e4e20, 0x580b: 0x405e5020, - 0x580c: 0x405e5220, 0x580d: 0x405e5420, 0x580e: 0x405e5620, 0x580f: 0x405e5820, - 0x5810: 0x405e5a20, 0x5811: 0x405e5c20, 0x5812: 0x405e5e20, 0x5813: 0x405e6020, - 0x5814: 0x405e6220, 0x5815: 0x405e6420, 0x5816: 0x405e6620, 0x5817: 0x405e6820, - 0x5818: 0x405e6a20, 0x5819: 0x405e6c20, 0x581a: 0x405e6e20, 0x581b: 0x405e7020, - 0x581c: 0x405e7220, 0x581d: 0x405e7420, 0x581e: 0x405e7620, 0x581f: 0x405e7820, - 0x5820: 0x405e7a20, 0x5821: 0x405e7c20, 0x5822: 0x405e7e20, 0x5823: 0x405e8020, - 0x5824: 0x405e8220, 0x5825: 0x405e8420, 0x5826: 0x405e8620, 0x5827: 0x405e8820, - 0x5828: 0x405e8a20, 0x5829: 0x405e8c20, 0x582a: 0x405e8e20, 0x582b: 0x405e9020, - 0x582c: 0x405e9220, 0x582d: 0x405e9420, 0x582e: 0x405e9620, 0x582f: 0x405e9820, - 0x5830: 0x405e9a20, 0x5831: 0x405e9c20, 0x5832: 0x405e9e20, 0x5833: 0x405ea020, - 0x5834: 0x405ea220, 0x5835: 0x405ea420, 0x5836: 0x405ea620, 0x5837: 0x405ea820, - 0x5838: 0x405eaa20, 0x5839: 0x405eac20, 0x583a: 0x405eae20, 0x583b: 0x405eb020, - 0x583c: 0x405eb220, 0x583d: 0x405eb420, 0x583e: 0x405eb620, 0x583f: 0x405eb820, - // Block 0x161, offset 0x5840 - 0x5840: 0x405eba20, 0x5841: 0x405ebc20, 0x5842: 0x405ebe20, 0x5843: 0x405ec020, - 0x5844: 0x405ec220, 0x5845: 0x405ec420, 0x5846: 0x405ec620, 0x5847: 0x405ec820, - 0x5848: 0x405eca20, 0x5849: 0x405ecc20, 0x584a: 0x405ece20, 0x584b: 0x405ed020, - 0x584c: 0x405ed220, 0x584d: 0x405ed420, 0x584e: 0x405ed620, 0x584f: 0x405ed820, - 0x5850: 0x405eda20, 0x5851: 0x405edc20, 0x5852: 0x405ede20, 0x5853: 0x405ee020, - 0x5854: 0x405ee220, 0x5855: 0x405ee420, 0x5856: 0x405ee620, 0x5857: 0x405ee820, - 0x5858: 0x405eea20, 0x5859: 0x405eec20, 0x585a: 0x405eee20, 0x585b: 0x405ef020, - 0x585c: 0x405ef220, 0x585d: 0x405ef420, 0x585e: 0x405ef620, 0x585f: 0x405ef820, - 0x5860: 0x405efa20, 0x5861: 0x405efc20, 0x5862: 0x405efe20, 0x5863: 0x405f0020, - 0x5864: 0x405f0220, 0x5865: 0x405f0420, 0x5866: 0x405f0620, 0x5867: 0x405f0820, - 0x5868: 0x405f0a20, 0x5869: 0x405f0c20, 0x586a: 0x405f0e20, 0x586b: 0x405f1020, - 0x586c: 0x405f1220, 0x586d: 0x405f1420, 0x586e: 0x405f1620, 0x586f: 0x405f1820, - 0x5870: 0x405f1a20, 0x5871: 0x405f1c20, 0x5872: 0x405f1e20, 0x5873: 0x405f2020, - 0x5874: 0x405f2220, 0x5875: 0x405f2420, 0x5876: 0x405f2620, 0x5877: 0x405f2820, - 0x5878: 0x405f2a20, 0x5879: 0x405f2c20, 0x587a: 0x405f2e20, 0x587b: 0x405f3020, - 0x587c: 0x405f3220, 0x587d: 0x405f3420, 0x587e: 0x405f3620, 0x587f: 0x405f3820, - // Block 0x162, offset 0x5880 - 0x5880: 0x405f3a20, 0x5881: 0x405f3c20, 0x5882: 0x405f3e20, 0x5883: 0x405f4020, - 0x5884: 0x405f4220, 0x5885: 0x405f4420, 0x5886: 0x405f4620, 0x5887: 0x405f4820, - 0x5888: 0x405f4a20, 0x5889: 0x405f4c20, 0x588a: 0x405f4e20, 0x588b: 0x405f5020, - 0x588c: 0x405f5220, 0x588d: 0x405f5420, 0x588e: 0x405f5620, 0x588f: 0x405f5820, - 0x5890: 0x405f5a20, 0x5891: 0x405f5c20, 0x5892: 0x405f5e20, 0x5893: 0x405f6020, - 0x5894: 0x405f6220, 0x5895: 0x405f6420, 0x5896: 0x405f6620, 0x5897: 0x405f6820, - 0x5898: 0x405f6a20, 0x5899: 0x405f6c20, 0x589a: 0x405f6e20, 0x589b: 0x405f7020, - 0x589c: 0x405f7220, 0x589d: 0x405f7420, 0x589e: 0x405f7620, 0x589f: 0x405f7820, - 0x58a0: 0x405f7a20, 0x58a1: 0x405f7c20, 0x58a2: 0x405f7e20, 0x58a3: 0x405f8020, - 0x58a4: 0x405f8220, 0x58a5: 0x405f8420, 0x58a6: 0x405f8620, 0x58a7: 0x405f8820, - 0x58a8: 0x405f8a20, 0x58a9: 0x405f8c20, 0x58aa: 0x405f8e20, 0x58ab: 0x405f9020, - 0x58ac: 0x405f9220, 0x58ad: 0x405f9420, 0x58ae: 0x405f9620, 0x58af: 0x405f9820, - 0x58b0: 0x405f9a20, 0x58b1: 0x405f9c20, 0x58b2: 0x405f9e20, 0x58b3: 0x405fa020, - 0x58b4: 0x405fa220, 0x58b5: 0x405fa420, 0x58b6: 0x405fa620, 0x58b7: 0x405fa820, - 0x58b8: 0x405faa20, 0x58b9: 0x405fac20, 0x58ba: 0x405fae20, 0x58bb: 0x405fb020, - 0x58bc: 0x405fb220, 0x58bd: 0x405fb420, 0x58be: 0x405fb620, 0x58bf: 0x405fb820, - // Block 0x163, offset 0x58c0 - 0x58c0: 0x405fba20, 0x58c1: 0x405fbc20, 0x58c2: 0x405fbe20, 0x58c3: 0x405fc020, - 0x58c4: 0x405fc220, 0x58c5: 0x405fc420, 0x58c6: 0x405fc620, 0x58c7: 0x405fc820, - 0x58c8: 0x405fca20, 0x58c9: 0x405fcc20, 0x58ca: 0x405fce20, 0x58cb: 0x405fd020, - 0x58cc: 0x405fd220, 0x58cd: 0x405fd420, 0x58ce: 0x405fd620, 0x58cf: 0x405fd820, - 0x58d0: 0x405fda20, 0x58d1: 0x405fdc20, 0x58d2: 0x405fde20, 0x58d3: 0x405fe020, - 0x58d4: 0x405fe220, 0x58d5: 0x405fe420, 0x58d6: 0x405fe620, 0x58d7: 0x405fe820, - 0x58d8: 0x405fea20, 0x58d9: 0x405fec20, 0x58da: 0x405fee20, 0x58db: 0x405ff020, - 0x58dc: 0x405ff220, 0x58dd: 0x405ff420, 0x58de: 0x405ff620, 0x58df: 0x405ff820, - 0x58e0: 0x405ffa20, 0x58e1: 0x405ffc20, 0x58e2: 0x405ffe20, 0x58e3: 0x40600020, - 0x58e4: 0x40600220, 0x58e5: 0x40600420, 0x58e6: 0x40600620, 0x58e7: 0x40600820, - 0x58e8: 0x40600a20, 0x58e9: 0x40600c20, 0x58ea: 0x40600e20, 0x58eb: 0x40601020, - 0x58ec: 0x40601220, 0x58ed: 0x40601420, 0x58ee: 0x40601620, 0x58ef: 0x40601820, - 0x58f0: 0x40601a20, 0x58f1: 0x40601c20, 0x58f2: 0x40601e20, 0x58f3: 0x40602020, - 0x58f4: 0x40602220, 0x58f5: 0x40602420, 0x58f6: 0x40602620, 0x58f7: 0x40602820, - 0x58f8: 0x40602a20, 0x58f9: 0x40602c20, 0x58fa: 0x40602e20, 0x58fb: 0x40603020, - 0x58fc: 0x40603220, 0x58fd: 0x40603420, 0x58fe: 0x40603620, 0x58ff: 0x40603820, - // Block 0x164, offset 0x5900 - 0x5900: 0x40603a20, 0x5901: 0x40603c20, 0x5902: 0x40603e20, 0x5903: 0x40604020, - 0x5904: 0x40604220, 0x5905: 0x40604420, 0x5906: 0x40604620, 0x5907: 0x40604820, - 0x5908: 0x40604a20, 0x5909: 0x40604c20, 0x590a: 0x40604e20, 0x590b: 0x40605020, - 0x590c: 0x40605220, 0x590d: 0x40605420, 0x590e: 0x40605620, 0x590f: 0x40605820, - 0x5910: 0x40605a20, 0x5911: 0x40605c20, 0x5912: 0x40605e20, 0x5913: 0x40606020, - 0x5914: 0x40606220, 0x5915: 0x40606420, 0x5916: 0x40606620, 0x5917: 0x40606820, - 0x5918: 0x40606a20, 0x5919: 0x40606c20, 0x591a: 0x40606e20, 0x591b: 0x40607020, - 0x591c: 0x40607220, 0x591d: 0x40607420, 0x591e: 0x40607620, 0x591f: 0x40607820, - 0x5920: 0x40607a20, 0x5921: 0x40607c20, 0x5922: 0x40607e20, 0x5923: 0x40608020, - 0x5924: 0x40608220, 0x5925: 0x40608420, 0x5926: 0x40608620, 0x5927: 0x40608820, - 0x5928: 0x40608a20, 0x5929: 0x40608c20, 0x592a: 0x40608e20, 0x592b: 0x40609020, - 0x592c: 0x40609220, 0x592d: 0x40609420, 0x592e: 0x40609620, 0x592f: 0x40609820, - 0x5930: 0x40609a20, 0x5931: 0x40609c20, 0x5932: 0x40609e20, 0x5933: 0x4060a020, - 0x5934: 0x4060a220, 0x5935: 0x4060a420, 0x5936: 0x4060a620, 0x5937: 0x4060a820, - 0x5938: 0x4060aa20, 0x5939: 0x4060ac20, 0x593a: 0x4060ae20, 0x593b: 0x4060b020, - 0x593c: 0x4060b220, 0x593d: 0x4060b420, 0x593e: 0x4060b620, 0x593f: 0x4060b820, - // Block 0x165, offset 0x5940 - 0x5940: 0x4060ba20, 0x5941: 0x4060bc20, 0x5942: 0x4060be20, 0x5943: 0x4060c020, - 0x5944: 0x4060c220, 0x5945: 0x4060c420, 0x5946: 0x4060c620, 0x5947: 0x4060c820, - 0x5948: 0x4060ca20, 0x5949: 0x4060cc20, 0x594a: 0x4060ce20, 0x594b: 0x4060d020, - 0x594c: 0x4060d220, 0x594d: 0x4060d420, 0x594e: 0x4060d620, 0x594f: 0x4060d820, - 0x5950: 0x4060da20, 0x5951: 0x4060dc20, 0x5952: 0x4060de20, 0x5953: 0x4060e020, - 0x5954: 0x4060e220, 0x5955: 0x4060e420, 0x5956: 0x4060e620, 0x5957: 0x4060e820, - 0x5958: 0x4060ea20, 0x5959: 0x4060ec20, 0x595a: 0x4060ee20, 0x595b: 0x4060f020, - 0x595c: 0x4060f220, 0x595d: 0x4060f420, 0x595e: 0x4060f620, 0x595f: 0x4060f820, - 0x5960: 0x4060fa20, 0x5961: 0x4060fc20, 0x5962: 0x4060fe20, 0x5963: 0x40610020, - 0x5964: 0x40610220, 0x5965: 0x40610420, 0x5966: 0x40610620, 0x5967: 0x40610820, - 0x5968: 0x40610a20, 0x5969: 0x40610c20, 0x596a: 0x40610e20, 0x596b: 0x40611020, - 0x596c: 0x40611220, 0x596d: 0x40611420, 0x596e: 0x40611620, 0x596f: 0x40611820, - 0x5970: 0x40611a20, 0x5971: 0x40611c20, 0x5972: 0x40611e20, 0x5973: 0x40612020, - 0x5974: 0x40612220, 0x5975: 0x40612420, 0x5976: 0x40612620, 0x5977: 0x40612820, - 0x5978: 0x40612a20, 0x5979: 0x40612c20, 0x597a: 0x40612e20, 0x597b: 0x40613020, - 0x597c: 0x40613220, 0x597d: 0x40613420, 0x597e: 0x40613620, 0x597f: 0x40613820, - // Block 0x166, offset 0x5980 - 0x5980: 0x40613a20, 0x5981: 0x40613c20, 0x5982: 0x40613e20, 0x5983: 0x40614020, - 0x5984: 0x40614220, 0x5985: 0x40614420, 0x5986: 0x40614620, 0x5987: 0x40614820, - 0x5988: 0x40614a20, 0x5989: 0x40614c20, 0x598a: 0x40614e20, 0x598b: 0x40615020, - 0x598c: 0x40615220, 0x598d: 0x40615420, 0x598e: 0x40615620, 0x598f: 0x40615820, - 0x5990: 0x40615a20, 0x5991: 0x40615c20, 0x5992: 0x40615e20, 0x5993: 0x40616020, - 0x5994: 0x40616220, 0x5995: 0x40616420, 0x5996: 0x40616620, 0x5997: 0x40616820, - 0x5998: 0x40616a20, 0x5999: 0x40616c20, 0x599a: 0x40616e20, 0x599b: 0x40617020, - 0x599c: 0x40617220, 0x599d: 0x40617420, 0x599e: 0x40617620, 0x599f: 0x40617820, - 0x59a0: 0x40617a20, 0x59a1: 0x40617c20, 0x59a2: 0x40617e20, 0x59a3: 0x40618020, - 0x59a4: 0x40618220, 0x59a5: 0x40618420, 0x59a6: 0x40618620, 0x59a7: 0x40618820, - 0x59a8: 0x40618a20, 0x59a9: 0x40618c20, 0x59aa: 0x40618e20, 0x59ab: 0x40619020, - 0x59ac: 0x40619220, 0x59ad: 0x40619420, 0x59ae: 0x40619620, 0x59af: 0x40619820, - 0x59b0: 0x40619a20, 0x59b1: 0x40619c20, 0x59b2: 0x40619e20, 0x59b3: 0x4061a020, - 0x59b4: 0x4061a220, 0x59b5: 0x4061a420, 0x59b6: 0x4061a620, 0x59b7: 0x4061a820, - 0x59b8: 0x4061aa20, 0x59b9: 0x4061ac20, 0x59ba: 0x4061ae20, 0x59bb: 0x4061b020, - 0x59bc: 0x4061b220, 0x59bd: 0x4061b420, 0x59be: 0x4061b620, 0x59bf: 0x4061b820, - // Block 0x167, offset 0x59c0 - 0x59c0: 0x4061ba20, 0x59c1: 0x4061bc20, 0x59c2: 0x4061be20, 0x59c3: 0x4061c020, - 0x59c4: 0x4061c220, 0x59c5: 0x4061c420, 0x59c6: 0x4061c620, 0x59c7: 0x4061c820, - 0x59c8: 0x4061ca20, 0x59c9: 0x4061cc20, 0x59ca: 0x4061ce20, 0x59cb: 0x4061d020, - 0x59cc: 0x4061d220, 0x59cd: 0x4061d420, 0x59ce: 0x4061d620, 0x59cf: 0x4061d820, - 0x59d0: 0x4061da20, 0x59d1: 0x4061dc20, 0x59d2: 0x4061de20, 0x59d3: 0x4061e020, - 0x59d4: 0x4061e220, 0x59d5: 0x4061e420, 0x59d6: 0x4061e620, 0x59d7: 0x4061e820, - 0x59d8: 0x4061ea20, 0x59d9: 0x4061ec20, 0x59da: 0x4061ee20, 0x59db: 0x4061f020, - 0x59dc: 0x4061f220, 0x59dd: 0x4061f420, 0x59de: 0x4061f620, 0x59df: 0x4061f820, - 0x59e0: 0x4061fa20, 0x59e1: 0x4061fc20, 0x59e2: 0x4061fe20, 0x59e3: 0x40620020, - 0x59e4: 0x40620220, 0x59e5: 0x40620420, 0x59e6: 0x40620620, 0x59e7: 0x40620820, - 0x59e8: 0x40620a20, 0x59e9: 0x40620c20, 0x59ea: 0x40620e20, 0x59eb: 0x40621020, - 0x59ec: 0x40621220, 0x59ed: 0x40621420, 0x59ee: 0x40621620, 0x59ef: 0x40621820, - 0x59f0: 0x40621a20, 0x59f1: 0x40621c20, 0x59f2: 0x40621e20, 0x59f3: 0x40622020, - 0x59f4: 0x40622220, 0x59f5: 0x40622420, 0x59f6: 0x40622620, 0x59f7: 0x40622820, - 0x59f8: 0x40622a20, 0x59f9: 0x40622c20, 0x59fa: 0x40622e20, 0x59fb: 0x40623020, - 0x59fc: 0x40623220, 0x59fd: 0x40623420, 0x59fe: 0x40623620, 0x59ff: 0x40623820, - // Block 0x168, offset 0x5a00 - 0x5a00: 0x40623a20, 0x5a01: 0x40623c20, 0x5a02: 0x40623e20, 0x5a03: 0x40624020, - 0x5a04: 0x40624220, 0x5a05: 0x40624420, 0x5a06: 0x40624620, 0x5a07: 0x40624820, - 0x5a08: 0x40624a20, 0x5a09: 0x40624c20, 0x5a0a: 0x40624e20, 0x5a0b: 0x40625020, - 0x5a0c: 0x40625220, 0x5a0d: 0x40625420, 0x5a0e: 0x40625620, 0x5a0f: 0x40625820, - 0x5a10: 0x40625a20, 0x5a11: 0x40625c20, 0x5a12: 0x40625e20, 0x5a13: 0x40626020, - 0x5a14: 0x40626220, 0x5a15: 0x40626420, 0x5a16: 0x40626620, 0x5a17: 0x40626820, - 0x5a18: 0x40626a20, 0x5a19: 0x40626c20, 0x5a1a: 0x40626e20, 0x5a1b: 0x40627020, - 0x5a1c: 0x40627220, 0x5a1d: 0x40627420, 0x5a1e: 0x40627620, 0x5a1f: 0x40627820, - 0x5a20: 0x40627a20, 0x5a21: 0x40627c20, 0x5a22: 0x40627e20, 0x5a23: 0x40628020, - 0x5a24: 0x40628220, 0x5a25: 0x40628420, 0x5a26: 0x40628620, 0x5a27: 0x40628820, - 0x5a28: 0x40628a20, 0x5a29: 0x40628c20, 0x5a2a: 0x40628e20, 0x5a2b: 0x40629020, - 0x5a2c: 0x40629220, 0x5a2d: 0x40629420, 0x5a2e: 0x40629620, 0x5a2f: 0x40629820, - 0x5a30: 0x40629a20, 0x5a31: 0x40629c20, 0x5a32: 0x40629e20, 0x5a33: 0x4062a020, - 0x5a34: 0x4062a220, 0x5a35: 0x4062a420, 0x5a36: 0x4062a620, 0x5a37: 0x4062a820, - 0x5a38: 0x4062aa20, - // Block 0x169, offset 0x5a40 - 0x5a40: 0x406fb620, 0x5a41: 0x406fb820, 0x5a42: 0x406fba20, 0x5a43: 0x406fbc20, - 0x5a44: 0x406fbe20, 0x5a45: 0x406fc020, 0x5a46: 0x006fbe84, 0x5a47: 0x406fc220, - 0x5a48: 0x406fc420, 0x5a49: 0x406fc620, 0x5a4a: 0x406fc820, 0x5a4b: 0x406fca20, - 0x5a4c: 0x406fcc20, 0x5a4d: 0x406fce20, 0x5a4e: 0x406fd020, 0x5a4f: 0x406fd220, - 0x5a50: 0x406fd420, 0x5a51: 0x406fd620, 0x5a52: 0x406fd820, 0x5a53: 0x006fd484, - 0x5a54: 0x406fda20, 0x5a55: 0x406fdc20, 0x5a56: 0x406fde20, 0x5a57: 0x406fe020, - 0x5a58: 0x406fe220, 0x5a59: 0x406fe420, 0x5a5a: 0x406fe620, 0x5a5b: 0x406fe820, - 0x5a5c: 0x406fea20, 0x5a5d: 0x406fec20, 0x5a5e: 0x406fee20, 0x5a5f: 0x406ff020, - 0x5a60: 0x406ff220, 0x5a61: 0x406ff420, 0x5a62: 0x406ff620, 0x5a63: 0x406ff820, - 0x5a64: 0x406ffa20, 0x5a65: 0x006ff884, 0x5a66: 0x406ffc20, 0x5a67: 0x406ffe20, - 0x5a68: 0x40700020, 0x5a69: 0x40700220, 0x5a6a: 0x40700420, 0x5a6b: 0x40700620, - 0x5a6c: 0x40700820, 0x5a6d: 0x40700a20, 0x5a6e: 0x40700c20, 0x5a6f: 0x40700e20, - 0x5a70: 0x40701020, 0x5a71: 0x40701220, 0x5a72: 0x40701420, 0x5a73: 0x40701620, - 0x5a74: 0x40701820, 0x5a75: 0x40701a20, 0x5a76: 0x40701c20, 0x5a77: 0x40701e20, - 0x5a78: 0x40702020, 0x5a79: 0x40702220, 0x5a7a: 0x40702420, 0x5a7b: 0x40702620, - 0x5a7c: 0x40702820, 0x5a7d: 0x40702a20, 0x5a7e: 0x40702c20, 0x5a7f: 0x00702a84, - // Block 0x16a, offset 0x5a80 - 0x5a80: 0x40702e20, 0x5a81: 0x40703020, 0x5a82: 0x40703220, 0x5a83: 0x40703420, - 0x5a84: 0x40703620, - 0x5a90: 0x40703820, 0x5a91: 0x40703a20, 0x5a92: 0x40703c20, 0x5a93: 0x40703e20, - 0x5a94: 0x40704020, 0x5a95: 0x40704220, 0x5a96: 0x40704420, 0x5a97: 0x40704620, - 0x5a98: 0x40704820, 0x5a99: 0x40704a20, 0x5a9a: 0x40704c20, 0x5a9b: 0x40704e20, - 0x5a9c: 0x40705020, 0x5a9d: 0x40705220, 0x5a9e: 0x40705420, 0x5a9f: 0x40705620, - 0x5aa0: 0x40705820, 0x5aa1: 0x40705a20, 0x5aa2: 0x40705c20, 0x5aa3: 0x40705e20, - 0x5aa4: 0x40706020, 0x5aa5: 0x40706220, 0x5aa6: 0x40706420, 0x5aa7: 0x40706620, - 0x5aa8: 0x40706820, 0x5aa9: 0x40706a20, 0x5aaa: 0x40706c20, 0x5aab: 0x40706e20, - 0x5aac: 0x40707020, 0x5aad: 0x40707220, 0x5aae: 0x40707420, 0x5aaf: 0x40707620, - 0x5ab0: 0x40707820, 0x5ab1: 0x40707a20, 0x5ab2: 0x40707c20, 0x5ab3: 0x40707e20, - 0x5ab4: 0x40708020, 0x5ab5: 0x40708220, 0x5ab6: 0x40708420, 0x5ab7: 0x40708620, - 0x5ab8: 0x40708820, 0x5ab9: 0x40708a20, 0x5aba: 0x40708c20, 0x5abb: 0x40708e20, - 0x5abc: 0x40709020, 0x5abd: 0x40709220, 0x5abe: 0x40709420, - // Block 0x16b, offset 0x5ac0 - 0x5acf: 0x40709620, - 0x5ad0: 0x40709820, 0x5ad1: 0x40709a20, 0x5ad2: 0x40709c20, 0x5ad3: 0x40709e20, - 0x5ad4: 0x4070a020, 0x5ad5: 0x4070a220, 0x5ad6: 0x4070a420, 0x5ad7: 0x4070a620, - 0x5ad8: 0x4070a820, 0x5ad9: 0x4070aa20, 0x5ada: 0x4070ac20, 0x5adb: 0x4070ae20, - 0x5adc: 0x4070b020, 0x5add: 0x4070b220, 0x5ade: 0x4070b420, 0x5adf: 0x4070b620, - // Block 0x16c, offset 0x5b00 - 0x5b00: 0x00657c91, 0x5b01: 0x0065c28e, - // Block 0x16d, offset 0x5b40 - 0x5b40: 0x401ba420, 0x5b41: 0x401ba620, 0x5b42: 0x401ba820, 0x5b43: 0x401baa20, - 0x5b44: 0x401bac20, 0x5b45: 0x401bae20, 0x5b46: 0x401bb020, 0x5b47: 0x401bb220, - 0x5b48: 0x401bb420, 0x5b49: 0x401bb620, 0x5b4a: 0x401bb820, 0x5b4b: 0x401bba20, - 0x5b4c: 0x401bbc20, 0x5b4d: 0x401bbe20, 0x5b4e: 0x401bc020, 0x5b4f: 0x401bc220, - 0x5b50: 0x401bc420, 0x5b51: 0x401bc620, 0x5b52: 0x401bc820, 0x5b53: 0x401bca20, - 0x5b54: 0x401bcc20, 0x5b55: 0x401bce20, 0x5b56: 0x401bd020, 0x5b57: 0x401bd220, - 0x5b58: 0x401bd420, 0x5b59: 0x401bd620, 0x5b5a: 0x401bd820, 0x5b5b: 0x401bda20, - 0x5b5c: 0x401bdc20, 0x5b5d: 0x401bde20, 0x5b5e: 0x401be020, 0x5b5f: 0x401be220, - 0x5b60: 0x401be420, 0x5b61: 0x401be620, 0x5b62: 0x401be820, 0x5b63: 0x401bea20, - 0x5b64: 0x401bec20, 0x5b65: 0x401bee20, 0x5b66: 0x401bf020, 0x5b67: 0x401bf220, - 0x5b68: 0x401bf420, 0x5b69: 0x401bf620, 0x5b6a: 0x401bf820, 0x5b6b: 0x401bfa20, - 0x5b6c: 0x401bfc20, 0x5b6d: 0x401bfe20, 0x5b6e: 0x401c0020, 0x5b6f: 0x401c0220, - 0x5b70: 0x401c0420, 0x5b71: 0x401c0620, 0x5b72: 0x401c0820, 0x5b73: 0x401c0a20, - 0x5b74: 0x401c0c20, 0x5b75: 0x401c0e20, 0x5b76: 0x401c1020, 0x5b77: 0x401c1220, - 0x5b78: 0x401c1420, 0x5b79: 0x401c1620, 0x5b7a: 0x401c1820, 0x5b7b: 0x401c1a20, - 0x5b7c: 0x401c1c20, 0x5b7d: 0x401c1e20, 0x5b7e: 0x401c2020, 0x5b7f: 0x401c2220, - // Block 0x16e, offset 0x5b80 - 0x5b80: 0x401c2420, 0x5b81: 0x401c2620, 0x5b82: 0x401c2820, 0x5b83: 0x401c2a20, - 0x5b84: 0x401c2c20, 0x5b85: 0x401c2e20, 0x5b86: 0x401c3020, 0x5b87: 0x401c3220, - 0x5b88: 0x401c3420, 0x5b89: 0x401c3620, 0x5b8a: 0x401c3820, 0x5b8b: 0x401c3a20, - 0x5b8c: 0x401c3c20, 0x5b8d: 0x401c3e20, 0x5b8e: 0x401c4020, 0x5b8f: 0x401c4220, - 0x5b90: 0x401c4420, 0x5b91: 0x401c4620, 0x5b92: 0x401c4820, 0x5b93: 0x401c4a20, - 0x5b94: 0x401c4c20, 0x5b95: 0x401c4e20, 0x5b96: 0x401c5020, 0x5b97: 0x401c5220, - 0x5b98: 0x401c5420, 0x5b99: 0x401c5620, 0x5b9a: 0x401c5820, 0x5b9b: 0x401c5a20, - 0x5b9c: 0x401c5c20, 0x5b9d: 0x401c5e20, 0x5b9e: 0x401c6020, 0x5b9f: 0x401c6220, - 0x5ba0: 0x401c6420, 0x5ba1: 0x401c6620, 0x5ba2: 0x401c6820, 0x5ba3: 0x401c6a20, - 0x5ba4: 0x401c6c20, 0x5ba5: 0x401c6e20, 0x5ba6: 0x401c7020, 0x5ba7: 0x401c7220, - 0x5ba8: 0x401c7420, 0x5ba9: 0x401c7620, 0x5baa: 0x401c7820, 0x5bab: 0x401c7a20, - 0x5bac: 0x401c7c20, 0x5bad: 0x401c7e20, 0x5bae: 0x401c8020, 0x5baf: 0x401c8220, - 0x5bb0: 0x401c8420, 0x5bb1: 0x401c8620, 0x5bb2: 0x401c8820, 0x5bb3: 0x401c8a20, - 0x5bb4: 0x401c8c20, 0x5bb5: 0x401c8e20, 0x5bb6: 0x401c9020, 0x5bb7: 0x401c9220, - 0x5bb8: 0x401c9420, 0x5bb9: 0x401c9620, 0x5bba: 0x401c9820, 0x5bbb: 0x401c9a20, - 0x5bbc: 0x401c9c20, 0x5bbd: 0x401c9e20, 0x5bbe: 0x401ca020, 0x5bbf: 0x401ca220, - // Block 0x16f, offset 0x5bc0 - 0x5bc0: 0x401ca420, 0x5bc1: 0x401ca620, 0x5bc2: 0x401ca820, 0x5bc3: 0x401caa20, - 0x5bc4: 0x401cac20, 0x5bc5: 0x401cae20, 0x5bc6: 0x401cb020, 0x5bc7: 0x401cb220, - 0x5bc8: 0x401cb420, 0x5bc9: 0x401cb620, 0x5bca: 0x401cb820, 0x5bcb: 0x401cba20, - 0x5bcc: 0x401cbc20, 0x5bcd: 0x401cbe20, 0x5bce: 0x401cc020, 0x5bcf: 0x401cc220, - 0x5bd0: 0x401cc420, 0x5bd1: 0x401cc620, 0x5bd2: 0x401cc820, 0x5bd3: 0x401cca20, - 0x5bd4: 0x401ccc20, 0x5bd5: 0x401cce20, 0x5bd6: 0x401cd020, 0x5bd7: 0x401cd220, - 0x5bd8: 0x401cd420, 0x5bd9: 0x401cd620, 0x5bda: 0x401cd820, 0x5bdb: 0x401cda20, - 0x5bdc: 0x401cdc20, 0x5bdd: 0x401cde20, 0x5bde: 0x401ce020, 0x5bdf: 0x401ce220, - 0x5be0: 0x401ce420, 0x5be1: 0x401ce620, 0x5be2: 0x401ce820, 0x5be3: 0x401cea20, - 0x5be4: 0x401cec20, 0x5be5: 0x401cee20, 0x5be6: 0x401cf020, 0x5be7: 0x401cf220, - 0x5be8: 0x401cf420, 0x5be9: 0x401cf620, 0x5bea: 0x401cf820, 0x5beb: 0x401cfa20, - 0x5bec: 0x401cfc20, 0x5bed: 0x401cfe20, 0x5bee: 0x401d0020, 0x5bef: 0x401d0220, - 0x5bf0: 0x401d0420, 0x5bf1: 0x401d0620, 0x5bf2: 0x401d0820, 0x5bf3: 0x401d0a20, - 0x5bf4: 0x401d0c20, 0x5bf5: 0x401d0e20, 0x5bf6: 0x401d1020, 0x5bf7: 0x401d1220, - 0x5bf8: 0x401d1420, 0x5bf9: 0x401d1620, 0x5bfa: 0x401d1820, 0x5bfb: 0x401d1a20, - 0x5bfc: 0x401d1c20, 0x5bfd: 0x401d1e20, 0x5bfe: 0x401d2020, 0x5bff: 0x401d2220, - // Block 0x170, offset 0x5c00 - 0x5c00: 0x401d2420, 0x5c01: 0x401d2620, 0x5c02: 0x401d2820, 0x5c03: 0x401d2a20, - 0x5c04: 0x401d2c20, 0x5c05: 0x401d2e20, 0x5c06: 0x401d3020, 0x5c07: 0x401d3220, - 0x5c08: 0x401d3420, 0x5c09: 0x401d3620, 0x5c0a: 0x401d3820, 0x5c0b: 0x401d3a20, - 0x5c0c: 0x401d3c20, 0x5c0d: 0x401d3e20, 0x5c0e: 0x401d4020, 0x5c0f: 0x401d4220, - 0x5c10: 0x401d4420, 0x5c11: 0x401d4620, 0x5c12: 0x401d4820, 0x5c13: 0x401d4a20, - 0x5c14: 0x401d4c20, 0x5c15: 0x401d4e20, 0x5c16: 0x401d5020, 0x5c17: 0x401d5220, - 0x5c18: 0x401d5420, 0x5c19: 0x401d5620, 0x5c1a: 0x401d5820, 0x5c1b: 0x401d5a20, - 0x5c1c: 0x401d5c20, 0x5c1d: 0x401d5e20, 0x5c1e: 0x401d6020, 0x5c1f: 0x401d6220, - 0x5c20: 0x401d6420, 0x5c21: 0x401d6620, 0x5c22: 0x401d6820, 0x5c23: 0x401d6a20, - 0x5c24: 0x401d6c20, 0x5c25: 0x401d6e20, 0x5c26: 0x401d7020, 0x5c27: 0x401d7220, - 0x5c28: 0x401d7420, 0x5c29: 0x401d7620, 0x5c2a: 0x401d7820, 0x5c2b: 0x401d7a20, - 0x5c2c: 0x401d7c20, 0x5c2d: 0x401d7e20, 0x5c2e: 0x401d8020, 0x5c2f: 0x401d8220, - 0x5c30: 0x401d8420, 0x5c31: 0x401d8620, 0x5c32: 0x401d8820, 0x5c33: 0x401d8a20, - 0x5c34: 0x401d8c20, 0x5c35: 0x401d8e20, - // Block 0x171, offset 0x5c40 - 0x5c40: 0x401d9020, 0x5c41: 0x401d9220, 0x5c42: 0x401d9420, 0x5c43: 0x401d9620, - 0x5c44: 0x401d9820, 0x5c45: 0x401d9a20, 0x5c46: 0x401d9c20, 0x5c47: 0x401d9e20, - 0x5c48: 0x401da020, 0x5c49: 0x401da220, 0x5c4a: 0x401da420, 0x5c4b: 0x401da620, - 0x5c4c: 0x401da820, 0x5c4d: 0x401daa20, 0x5c4e: 0x401dac20, 0x5c4f: 0x401dae20, - 0x5c50: 0x401db020, 0x5c51: 0x401db220, 0x5c52: 0x401db420, 0x5c53: 0x401db620, - 0x5c54: 0x401db820, 0x5c55: 0x401dba20, 0x5c56: 0x401dbc20, 0x5c57: 0x401dbe20, - 0x5c58: 0x401dc020, 0x5c59: 0x401dc220, 0x5c5a: 0x401dc420, 0x5c5b: 0x401dc620, - 0x5c5c: 0x401dc820, 0x5c5d: 0x401dca20, 0x5c5e: 0x401dcc20, 0x5c5f: 0x401dce20, - 0x5c60: 0x401dd020, 0x5c61: 0x401dd220, 0x5c62: 0x401dd420, 0x5c63: 0x401dd620, - 0x5c64: 0x401dd820, 0x5c65: 0x401dda20, 0x5c66: 0x401ddc20, - 0x5c69: 0x401e0420, 0x5c6a: 0x401de420, 0x5c6b: 0x401de620, - 0x5c6c: 0x401de820, 0x5c6d: 0x401dea20, 0x5c6e: 0x401dec20, 0x5c6f: 0x401dee20, - 0x5c70: 0x401df020, 0x5c71: 0x401df220, 0x5c72: 0x401df420, 0x5c73: 0x401df620, - 0x5c74: 0x401df820, 0x5c75: 0x401dfa20, 0x5c76: 0x401dfc20, 0x5c77: 0x401dfe20, - 0x5c78: 0x401e0020, 0x5c79: 0x401e0220, 0x5c7a: 0x401e0620, 0x5c7b: 0x401e0820, - 0x5c7c: 0x401e0a20, 0x5c7d: 0x401e0c20, 0x5c7e: 0x401e0e20, 0x5c7f: 0x401e1020, - // Block 0x172, offset 0x5c80 - 0x5c80: 0x401e1220, 0x5c81: 0x401e1420, 0x5c82: 0x401e1620, 0x5c83: 0x401e1820, - 0x5c84: 0x401e1a20, 0x5c85: 0x401e1c20, 0x5c86: 0x401e1e20, 0x5c87: 0x401e2020, - 0x5c88: 0x401e2220, 0x5c89: 0x401e2420, 0x5c8a: 0x401e2620, 0x5c8b: 0x401e2820, - 0x5c8c: 0x401e2a20, 0x5c8d: 0x401e2c20, 0x5c8e: 0x401e2e20, 0x5c8f: 0x401e3020, - 0x5c90: 0x401e3220, 0x5c91: 0x401e3420, 0x5c92: 0x401e3620, 0x5c93: 0x401e3820, - 0x5c94: 0x401e3a20, 0x5c95: 0x401e3c20, 0x5c96: 0x401e3e20, 0x5c97: 0x401e4020, - 0x5c98: 0x401e4220, 0x5c99: 0x401e4420, 0x5c9a: 0x401e4620, 0x5c9b: 0x401e4820, - 0x5c9c: 0x401e4a20, 0x5c9d: 0x401e4c20, 0x5c9e: 0x401e4020, 0x5c9f: 0x401e4220, - 0x5ca0: 0x401e4220, 0x5ca1: 0x401e4220, 0x5ca2: 0x401e4220, 0x5ca3: 0x401e4220, - 0x5ca4: 0x401e4220, 0x5ca5: 0xad800000, 0x5ca6: 0xad800000, 0x5ca7: 0xa0100000, - 0x5ca8: 0xa0100000, 0x5ca9: 0xa0100000, 0x5caa: 0x401e4e20, 0x5cab: 0x401e5020, - 0x5cac: 0x401e5220, 0x5cad: 0xae200000, 0x5cae: 0xad800000, 0x5caf: 0xad800000, - 0x5cb0: 0xad800000, 0x5cb1: 0xad800000, 0x5cb2: 0xad800000, 0x5cb3: 0xa0000000, - 0x5cb4: 0xa0000000, 0x5cb5: 0xa0000000, 0x5cb6: 0xa0000000, 0x5cb7: 0xa0000000, - 0x5cb8: 0xa0000000, 0x5cb9: 0xa0000000, 0x5cba: 0xa0000000, 0x5cbb: 0xadc00000, - 0x5cbc: 0xadc00000, 0x5cbd: 0xadc00000, 0x5cbe: 0xadc00000, 0x5cbf: 0xadc00000, - // Block 0x173, offset 0x5cc0 - 0x5cc0: 0xadc00000, 0x5cc1: 0xadc00000, 0x5cc2: 0xadc00000, 0x5cc3: 0x401e5420, - 0x5cc4: 0x401e5620, 0x5cc5: 0xae600000, 0x5cc6: 0xae600000, 0x5cc7: 0xae600000, - 0x5cc8: 0xae600000, 0x5cc9: 0xae600000, 0x5cca: 0xadc00000, 0x5ccb: 0xadc00000, - 0x5ccc: 0x401e5820, 0x5ccd: 0x401e5a20, 0x5cce: 0x401e5c20, 0x5ccf: 0x401e5e20, - 0x5cd0: 0x401e6020, 0x5cd1: 0x401e6220, 0x5cd2: 0x401e6420, 0x5cd3: 0x401e6620, - 0x5cd4: 0x401e6820, 0x5cd5: 0x401e6a20, 0x5cd6: 0x401e6c20, 0x5cd7: 0x401e6e20, - 0x5cd8: 0x401e7020, 0x5cd9: 0x401e7220, 0x5cda: 0x401e7420, 0x5cdb: 0x401e7620, - 0x5cdc: 0x401e7820, 0x5cdd: 0x401e7a20, 0x5cde: 0x401e7c20, 0x5cdf: 0x401e7e20, - 0x5ce0: 0x401e8020, 0x5ce1: 0x401e8220, 0x5ce2: 0x401e8420, 0x5ce3: 0x401e8620, - 0x5ce4: 0x401e8820, 0x5ce5: 0x401e8a20, 0x5ce6: 0x401e8c20, 0x5ce7: 0x401e8e20, - 0x5ce8: 0x401e9020, 0x5ce9: 0x401e9220, 0x5cea: 0xae600000, 0x5ceb: 0xae600000, - 0x5cec: 0xae600000, 0x5ced: 0xae600000, 0x5cee: 0x401e9420, 0x5cef: 0x401e9620, - 0x5cf0: 0x401e9820, 0x5cf1: 0x401e9a20, 0x5cf2: 0x401e9c20, 0x5cf3: 0x401e9e20, - 0x5cf4: 0x401ea020, 0x5cf5: 0x401ea220, 0x5cf6: 0x401ea420, 0x5cf7: 0x401ea620, - 0x5cf8: 0x401ea820, 0x5cf9: 0x401eaa20, 0x5cfa: 0x401eac20, 0x5cfb: 0x401eaa20, - 0x5cfc: 0x401eac20, 0x5cfd: 0x401eaa20, 0x5cfe: 0x401eac20, 0x5cff: 0x401eaa20, - // Block 0x174, offset 0x5d00 - 0x5d00: 0x401eac20, 0x5d01: 0x401eae20, 0x5d02: 0x401eb020, 0x5d03: 0x401eb220, - 0x5d04: 0x401eb420, 0x5d05: 0x401eb620, 0x5d06: 0x401eb820, 0x5d07: 0x401eba20, - 0x5d08: 0x401ebc20, 0x5d09: 0x401ebe20, 0x5d0a: 0x401ec020, 0x5d0b: 0x401ec220, - 0x5d0c: 0x401ec420, 0x5d0d: 0x401ec620, 0x5d0e: 0x401ec820, 0x5d0f: 0x401eca20, - 0x5d10: 0x401ecc20, 0x5d11: 0x401ece20, 0x5d12: 0x401ed020, 0x5d13: 0x401ed220, - 0x5d14: 0x401ed420, 0x5d15: 0x401ed620, 0x5d16: 0x401ed820, 0x5d17: 0x401eda20, - 0x5d18: 0x401edc20, 0x5d19: 0x401ede20, 0x5d1a: 0x401ee020, 0x5d1b: 0x401ee220, - 0x5d1c: 0x401ee420, 0x5d1d: 0x401ee620, - // Block 0x175, offset 0x5d40 - 0x5d40: 0x401ee820, 0x5d41: 0x401eea20, 0x5d42: 0x401eec20, 0x5d43: 0x401eee20, - 0x5d44: 0x401ef020, 0x5d45: 0x401ef220, 0x5d46: 0x401ef420, 0x5d47: 0x401ef620, - 0x5d48: 0x401ef820, 0x5d49: 0x401efa20, 0x5d4a: 0x401efc20, 0x5d4b: 0x401efe20, - 0x5d4c: 0x401f0020, 0x5d4d: 0x401f0220, 0x5d4e: 0x401f0420, 0x5d4f: 0x401f0620, - 0x5d50: 0x401f0820, 0x5d51: 0x401f0a20, 0x5d52: 0x401f0c20, 0x5d53: 0x401f0e20, - 0x5d54: 0x401f1020, 0x5d55: 0x401f1220, 0x5d56: 0x401f1420, 0x5d57: 0x401f1620, - 0x5d58: 0x401f1820, 0x5d59: 0x401f1a20, 0x5d5a: 0x401f1c20, 0x5d5b: 0x401f1e20, - 0x5d5c: 0x401f2020, 0x5d5d: 0x401f2220, 0x5d5e: 0x401f2420, 0x5d5f: 0x401f2620, - 0x5d60: 0x401f2820, 0x5d61: 0x401f2a20, 0x5d62: 0x401f2c20, 0x5d63: 0x401f2e20, - 0x5d64: 0x401f3020, 0x5d65: 0x401f3220, 0x5d66: 0x401f3420, 0x5d67: 0x401f3620, - 0x5d68: 0x401f3820, 0x5d69: 0x401f3a20, 0x5d6a: 0x401f3c20, 0x5d6b: 0x401f3e20, - 0x5d6c: 0x401f4020, 0x5d6d: 0x401f4220, 0x5d6e: 0x401f4420, 0x5d6f: 0x401f4620, - 0x5d70: 0x401f4820, 0x5d71: 0x401f4a20, 0x5d72: 0x401f4c20, 0x5d73: 0x401f4e20, - 0x5d74: 0x401f5020, 0x5d75: 0x401f5220, 0x5d76: 0x401f5420, 0x5d77: 0x401f5620, - 0x5d78: 0x401f5820, 0x5d79: 0x401f5a20, 0x5d7a: 0x401f5c20, 0x5d7b: 0x401f5e20, - 0x5d7c: 0x401f6020, 0x5d7d: 0x401f6220, 0x5d7e: 0x401f6420, 0x5d7f: 0x401f6620, - // Block 0x176, offset 0x5d80 - 0x5d80: 0x401f6820, 0x5d81: 0x401f6a20, 0x5d82: 0xae600000, 0x5d83: 0xae600000, - 0x5d84: 0xae600000, 0x5d85: 0x401f6c20, - // Block 0x177, offset 0x5dc0 - 0x5dc0: 0x4019e220, 0x5dc1: 0x4019e420, 0x5dc2: 0x4019e620, 0x5dc3: 0x4019e820, - 0x5dc4: 0x4019ea20, 0x5dc5: 0x4019ec20, 0x5dc6: 0x4019ee20, 0x5dc7: 0x4019f020, - 0x5dc8: 0x4019f220, 0x5dc9: 0x4019f420, 0x5dca: 0x4019f620, 0x5dcb: 0x4019f820, - 0x5dcc: 0x4019fa20, 0x5dcd: 0x4019fc20, 0x5dce: 0x4019fe20, 0x5dcf: 0x401a0020, - 0x5dd0: 0x401a0220, 0x5dd1: 0x401a0420, 0x5dd2: 0x401a0620, 0x5dd3: 0x401a0820, - 0x5dd4: 0x401a0a20, 0x5dd5: 0x401a0c20, 0x5dd6: 0x401a0e20, 0x5dd7: 0x401a1020, - 0x5dd8: 0x401a1220, 0x5dd9: 0x401a1420, 0x5dda: 0x401a1620, 0x5ddb: 0x401a1820, - 0x5ddc: 0x401a1a20, 0x5ddd: 0x401a1c20, 0x5dde: 0x401a1e20, 0x5ddf: 0x401a2020, - 0x5de0: 0x401a2220, 0x5de1: 0x401a2420, 0x5de2: 0x401a2620, 0x5de3: 0x401a2820, - 0x5de4: 0x401a2a20, 0x5de5: 0x401a2c20, 0x5de6: 0x401a2e20, 0x5de7: 0x401a3020, - 0x5de8: 0x401a3220, 0x5de9: 0x401a3420, 0x5dea: 0x401a3620, 0x5deb: 0x401a3820, - 0x5dec: 0x401a3a20, 0x5ded: 0x401a3c20, 0x5dee: 0x401a3e20, 0x5def: 0x401a4020, - 0x5df0: 0x401a4220, 0x5df1: 0x401a4420, 0x5df2: 0x401a4620, 0x5df3: 0x401a4820, - 0x5df4: 0x401a4a20, 0x5df5: 0x401a4c20, 0x5df6: 0x401a4e20, 0x5df7: 0x401a5020, - 0x5df8: 0x401a5220, 0x5df9: 0x401a5420, 0x5dfa: 0x401a5620, 0x5dfb: 0x401a5820, - 0x5dfc: 0x401a5a20, 0x5dfd: 0x401a5c20, 0x5dfe: 0x401a5e20, 0x5dff: 0x401a6020, - // Block 0x178, offset 0x5e00 - 0x5e00: 0x401a6220, 0x5e01: 0x401a6420, 0x5e02: 0x401a6620, 0x5e03: 0x401a6820, - 0x5e04: 0x401a6a20, 0x5e05: 0x401a6c20, 0x5e06: 0x401a6e20, 0x5e07: 0x401a7020, - 0x5e08: 0x401a7220, 0x5e09: 0x401a7420, 0x5e0a: 0x401a7620, 0x5e0b: 0x401a7820, - 0x5e0c: 0x401a7a20, 0x5e0d: 0x401a7c20, 0x5e0e: 0x401a7e20, 0x5e0f: 0x401a8020, - 0x5e10: 0x401a8220, 0x5e11: 0x401a8420, 0x5e12: 0x401a8620, 0x5e13: 0x401a8820, - 0x5e14: 0x401a8a20, 0x5e15: 0x401a8c20, 0x5e16: 0x401a8e20, - 0x5e20: 0xe00002af, 0x5e21: 0xe00003ca, 0x5e22: 0xe00004a4, 0x5e23: 0xe0000576, - 0x5e24: 0xe000063d, 0x5e25: 0xe00006ed, 0x5e26: 0xe0000795, 0x5e27: 0xe000083e, - 0x5e28: 0xe00008e9, 0x5e29: 0x4029ba20, 0x5e2a: 0x4029bc20, 0x5e2b: 0x4029be20, - 0x5e2c: 0x4029c020, 0x5e2d: 0x4029c220, 0x5e2e: 0x4029c420, 0x5e2f: 0x4029c620, - 0x5e30: 0x4029c820, 0x5e31: 0x4029ca20, - // Block 0x179, offset 0x5e40 - 0x5e40: 0x002bde8b, 0x5e41: 0x002c0a8b, 0x5e42: 0x002c3a8b, 0x5e43: 0x002c628b, - 0x5e44: 0x002c988b, 0x5e45: 0x002d088b, 0x5e46: 0x002d228b, 0x5e47: 0x002d688b, - 0x5e48: 0x002d9a8b, 0x5e49: 0x002dcc8b, 0x5e4a: 0x002dfe8b, 0x5e4b: 0x002e228b, - 0x5e4c: 0x002e828b, 0x5e4d: 0x002e9e8b, 0x5e4e: 0x002ee28b, 0x5e4f: 0x002f2c8b, - 0x5e50: 0x002f568b, 0x5e51: 0x002f7a8b, 0x5e52: 0x002fe68b, 0x5e53: 0x00302c8b, - 0x5e54: 0x00306c8b, 0x5e55: 0x0030be8b, 0x5e56: 0x0030e28b, 0x5e57: 0x0030f68b, - 0x5e58: 0x0031008b, 0x5e59: 0x00312a8b, 0x5e5a: 0x002bde85, 0x5e5b: 0x002c0a85, - 0x5e5c: 0x002c3a85, 0x5e5d: 0x002c6285, 0x5e5e: 0x002c9885, 0x5e5f: 0x002d0885, - 0x5e60: 0x002d2285, 0x5e61: 0x002d6885, 0x5e62: 0x002d9a85, 0x5e63: 0x002dcc85, - 0x5e64: 0x002dfe85, 0x5e65: 0x002e2285, 0x5e66: 0x002e8285, 0x5e67: 0x002e9e85, - 0x5e68: 0x002ee285, 0x5e69: 0x002f2c85, 0x5e6a: 0x002f5685, 0x5e6b: 0x002f7a85, - 0x5e6c: 0x002fe685, 0x5e6d: 0x00302c85, 0x5e6e: 0x00306c85, 0x5e6f: 0x0030be85, - 0x5e70: 0x0030e285, 0x5e71: 0x0030f685, 0x5e72: 0x00310085, 0x5e73: 0x00312a85, - 0x5e74: 0x002bde8b, 0x5e75: 0x002c0a8b, 0x5e76: 0x002c3a8b, 0x5e77: 0x002c628b, - 0x5e78: 0x002c988b, 0x5e79: 0x002d088b, 0x5e7a: 0x002d228b, 0x5e7b: 0x002d688b, - 0x5e7c: 0x002d9a8b, 0x5e7d: 0x002dcc8b, 0x5e7e: 0x002dfe8b, 0x5e7f: 0x002e228b, - // Block 0x17a, offset 0x5e80 - 0x5e80: 0x002e828b, 0x5e81: 0x002e9e8b, 0x5e82: 0x002ee28b, 0x5e83: 0x002f2c8b, - 0x5e84: 0x002f568b, 0x5e85: 0x002f7a8b, 0x5e86: 0x002fe68b, 0x5e87: 0x00302c8b, - 0x5e88: 0x00306c8b, 0x5e89: 0x0030be8b, 0x5e8a: 0x0030e28b, 0x5e8b: 0x0030f68b, - 0x5e8c: 0x0031008b, 0x5e8d: 0x00312a8b, 0x5e8e: 0x002bde85, 0x5e8f: 0x002c0a85, - 0x5e90: 0x002c3a85, 0x5e91: 0x002c6285, 0x5e92: 0x002c9885, 0x5e93: 0x002d0885, - 0x5e94: 0x002d2285, 0x5e96: 0x002d9a85, 0x5e97: 0x002dcc85, - 0x5e98: 0x002dfe85, 0x5e99: 0x002e2285, 0x5e9a: 0x002e8285, 0x5e9b: 0x002e9e85, - 0x5e9c: 0x002ee285, 0x5e9d: 0x002f2c85, 0x5e9e: 0x002f5685, 0x5e9f: 0x002f7a85, - 0x5ea0: 0x002fe685, 0x5ea1: 0x00302c85, 0x5ea2: 0x00306c85, 0x5ea3: 0x0030be85, - 0x5ea4: 0x0030e285, 0x5ea5: 0x0030f685, 0x5ea6: 0x00310085, 0x5ea7: 0x00312a85, - 0x5ea8: 0x002bde8b, 0x5ea9: 0x002c0a8b, 0x5eaa: 0x002c3a8b, 0x5eab: 0x002c628b, - 0x5eac: 0x002c988b, 0x5ead: 0x002d088b, 0x5eae: 0x002d228b, 0x5eaf: 0x002d688b, - 0x5eb0: 0x002d9a8b, 0x5eb1: 0x002dcc8b, 0x5eb2: 0x002dfe8b, 0x5eb3: 0x002e228b, - 0x5eb4: 0x002e828b, 0x5eb5: 0x002e9e8b, 0x5eb6: 0x002ee28b, 0x5eb7: 0x002f2c8b, - 0x5eb8: 0x002f568b, 0x5eb9: 0x002f7a8b, 0x5eba: 0x002fe68b, 0x5ebb: 0x00302c8b, - 0x5ebc: 0x00306c8b, 0x5ebd: 0x0030be8b, 0x5ebe: 0x0030e28b, 0x5ebf: 0x0030f68b, - // Block 0x17b, offset 0x5ec0 - 0x5ec0: 0x0031008b, 0x5ec1: 0x00312a8b, 0x5ec2: 0x002bde85, 0x5ec3: 0x002c0a85, - 0x5ec4: 0x002c3a85, 0x5ec5: 0x002c6285, 0x5ec6: 0x002c9885, 0x5ec7: 0x002d0885, - 0x5ec8: 0x002d2285, 0x5ec9: 0x002d6885, 0x5eca: 0x002d9a85, 0x5ecb: 0x002dcc85, - 0x5ecc: 0x002dfe85, 0x5ecd: 0x002e2285, 0x5ece: 0x002e8285, 0x5ecf: 0x002e9e85, - 0x5ed0: 0x002ee285, 0x5ed1: 0x002f2c85, 0x5ed2: 0x002f5685, 0x5ed3: 0x002f7a85, - 0x5ed4: 0x002fe685, 0x5ed5: 0x00302c85, 0x5ed6: 0x00306c85, 0x5ed7: 0x0030be85, - 0x5ed8: 0x0030e285, 0x5ed9: 0x0030f685, 0x5eda: 0x00310085, 0x5edb: 0x00312a85, - 0x5edc: 0x002bde8b, 0x5ede: 0x002c3a8b, 0x5edf: 0x002c628b, - 0x5ee2: 0x002d228b, - 0x5ee5: 0x002dcc8b, 0x5ee6: 0x002dfe8b, - 0x5ee9: 0x002e9e8b, 0x5eea: 0x002ee28b, 0x5eeb: 0x002f2c8b, - 0x5eec: 0x002f568b, 0x5eee: 0x002fe68b, 0x5eef: 0x00302c8b, - 0x5ef0: 0x00306c8b, 0x5ef1: 0x0030be8b, 0x5ef2: 0x0030e28b, 0x5ef3: 0x0030f68b, - 0x5ef4: 0x0031008b, 0x5ef5: 0x00312a8b, 0x5ef6: 0x002bde85, 0x5ef7: 0x002c0a85, - 0x5ef8: 0x002c3a85, 0x5ef9: 0x002c6285, 0x5efb: 0x002d0885, - 0x5efd: 0x002d6885, 0x5efe: 0x002d9a85, 0x5eff: 0x002dcc85, - // Block 0x17c, offset 0x5f00 - 0x5f00: 0x002dfe85, 0x5f01: 0x002e2285, 0x5f02: 0x002e8285, 0x5f03: 0x002e9e85, - 0x5f05: 0x002f2c85, 0x5f06: 0x002f5685, 0x5f07: 0x002f7a85, - 0x5f08: 0x002fe685, 0x5f09: 0x00302c85, 0x5f0a: 0x00306c85, 0x5f0b: 0x0030be85, - 0x5f0c: 0x0030e285, 0x5f0d: 0x0030f685, 0x5f0e: 0x00310085, 0x5f0f: 0x00312a85, - 0x5f10: 0x002bde8b, 0x5f11: 0x002c0a8b, 0x5f12: 0x002c3a8b, 0x5f13: 0x002c628b, - 0x5f14: 0x002c988b, 0x5f15: 0x002d088b, 0x5f16: 0x002d228b, 0x5f17: 0x002d688b, - 0x5f18: 0x002d9a8b, 0x5f19: 0x002dcc8b, 0x5f1a: 0x002dfe8b, 0x5f1b: 0x002e228b, - 0x5f1c: 0x002e828b, 0x5f1d: 0x002e9e8b, 0x5f1e: 0x002ee28b, 0x5f1f: 0x002f2c8b, - 0x5f20: 0x002f568b, 0x5f21: 0x002f7a8b, 0x5f22: 0x002fe68b, 0x5f23: 0x00302c8b, - 0x5f24: 0x00306c8b, 0x5f25: 0x0030be8b, 0x5f26: 0x0030e28b, 0x5f27: 0x0030f68b, - 0x5f28: 0x0031008b, 0x5f29: 0x00312a8b, 0x5f2a: 0x002bde85, 0x5f2b: 0x002c0a85, - 0x5f2c: 0x002c3a85, 0x5f2d: 0x002c6285, 0x5f2e: 0x002c9885, 0x5f2f: 0x002d0885, - 0x5f30: 0x002d2285, 0x5f31: 0x002d6885, 0x5f32: 0x002d9a85, 0x5f33: 0x002dcc85, - 0x5f34: 0x002dfe85, 0x5f35: 0x002e2285, 0x5f36: 0x002e8285, 0x5f37: 0x002e9e85, - 0x5f38: 0x002ee285, 0x5f39: 0x002f2c85, 0x5f3a: 0x002f5685, 0x5f3b: 0x002f7a85, - 0x5f3c: 0x002fe685, 0x5f3d: 0x00302c85, 0x5f3e: 0x00306c85, 0x5f3f: 0x0030be85, - // Block 0x17d, offset 0x5f40 - 0x5f40: 0x0030e285, 0x5f41: 0x0030f685, 0x5f42: 0x00310085, 0x5f43: 0x00312a85, - 0x5f44: 0x002bde8b, 0x5f45: 0x002c0a8b, 0x5f47: 0x002c628b, - 0x5f48: 0x002c988b, 0x5f49: 0x002d088b, 0x5f4a: 0x002d228b, - 0x5f4d: 0x002dcc8b, 0x5f4e: 0x002dfe8b, 0x5f4f: 0x002e228b, - 0x5f50: 0x002e828b, 0x5f51: 0x002e9e8b, 0x5f52: 0x002ee28b, 0x5f53: 0x002f2c8b, - 0x5f54: 0x002f568b, 0x5f56: 0x002fe68b, 0x5f57: 0x00302c8b, - 0x5f58: 0x00306c8b, 0x5f59: 0x0030be8b, 0x5f5a: 0x0030e28b, 0x5f5b: 0x0030f68b, - 0x5f5c: 0x0031008b, 0x5f5e: 0x002bde85, 0x5f5f: 0x002c0a85, - 0x5f60: 0x002c3a85, 0x5f61: 0x002c6285, 0x5f62: 0x002c9885, 0x5f63: 0x002d0885, - 0x5f64: 0x002d2285, 0x5f65: 0x002d6885, 0x5f66: 0x002d9a85, 0x5f67: 0x002dcc85, - 0x5f68: 0x002dfe85, 0x5f69: 0x002e2285, 0x5f6a: 0x002e8285, 0x5f6b: 0x002e9e85, - 0x5f6c: 0x002ee285, 0x5f6d: 0x002f2c85, 0x5f6e: 0x002f5685, 0x5f6f: 0x002f7a85, - 0x5f70: 0x002fe685, 0x5f71: 0x00302c85, 0x5f72: 0x00306c85, 0x5f73: 0x0030be85, - 0x5f74: 0x0030e285, 0x5f75: 0x0030f685, 0x5f76: 0x00310085, 0x5f77: 0x00312a85, - 0x5f78: 0x002bde8b, 0x5f79: 0x002c0a8b, 0x5f7b: 0x002c628b, - 0x5f7c: 0x002c988b, 0x5f7d: 0x002d088b, 0x5f7e: 0x002d228b, - // Block 0x17e, offset 0x5f80 - 0x5f80: 0x002d9a8b, 0x5f81: 0x002dcc8b, 0x5f82: 0x002dfe8b, 0x5f83: 0x002e228b, - 0x5f84: 0x002e828b, 0x5f86: 0x002ee28b, - 0x5f8a: 0x002fe68b, 0x5f8b: 0x00302c8b, - 0x5f8c: 0x00306c8b, 0x5f8d: 0x0030be8b, 0x5f8e: 0x0030e28b, 0x5f8f: 0x0030f68b, - 0x5f90: 0x0031008b, 0x5f92: 0x002bde85, 0x5f93: 0x002c0a85, - 0x5f94: 0x002c3a85, 0x5f95: 0x002c6285, 0x5f96: 0x002c9885, 0x5f97: 0x002d0885, - 0x5f98: 0x002d2285, 0x5f99: 0x002d6885, 0x5f9a: 0x002d9a85, 0x5f9b: 0x002dcc85, - 0x5f9c: 0x002dfe85, 0x5f9d: 0x002e2285, 0x5f9e: 0x002e8285, 0x5f9f: 0x002e9e85, - 0x5fa0: 0x002ee285, 0x5fa1: 0x002f2c85, 0x5fa2: 0x002f5685, 0x5fa3: 0x002f7a85, - 0x5fa4: 0x002fe685, 0x5fa5: 0x00302c85, 0x5fa6: 0x00306c85, 0x5fa7: 0x0030be85, - 0x5fa8: 0x0030e285, 0x5fa9: 0x0030f685, 0x5faa: 0x00310085, 0x5fab: 0x00312a85, - 0x5fac: 0x002bde8b, 0x5fad: 0x002c0a8b, 0x5fae: 0x002c3a8b, 0x5faf: 0x002c628b, - 0x5fb0: 0x002c988b, 0x5fb1: 0x002d088b, 0x5fb2: 0x002d228b, 0x5fb3: 0x002d688b, - 0x5fb4: 0x002d9a8b, 0x5fb5: 0x002dcc8b, 0x5fb6: 0x002dfe8b, 0x5fb7: 0x002e228b, - 0x5fb8: 0x002e828b, 0x5fb9: 0x002e9e8b, 0x5fba: 0x002ee28b, 0x5fbb: 0x002f2c8b, - 0x5fbc: 0x002f568b, 0x5fbd: 0x002f7a8b, 0x5fbe: 0x002fe68b, 0x5fbf: 0x00302c8b, - // Block 0x17f, offset 0x5fc0 - 0x5fc0: 0x00306c8b, 0x5fc1: 0x0030be8b, 0x5fc2: 0x0030e28b, 0x5fc3: 0x0030f68b, - 0x5fc4: 0x0031008b, 0x5fc5: 0x00312a8b, 0x5fc6: 0x002bde85, 0x5fc7: 0x002c0a85, - 0x5fc8: 0x002c3a85, 0x5fc9: 0x002c6285, 0x5fca: 0x002c9885, 0x5fcb: 0x002d0885, - 0x5fcc: 0x002d2285, 0x5fcd: 0x002d6885, 0x5fce: 0x002d9a85, 0x5fcf: 0x002dcc85, - 0x5fd0: 0x002dfe85, 0x5fd1: 0x002e2285, 0x5fd2: 0x002e8285, 0x5fd3: 0x002e9e85, - 0x5fd4: 0x002ee285, 0x5fd5: 0x002f2c85, 0x5fd6: 0x002f5685, 0x5fd7: 0x002f7a85, - 0x5fd8: 0x002fe685, 0x5fd9: 0x00302c85, 0x5fda: 0x00306c85, 0x5fdb: 0x0030be85, - 0x5fdc: 0x0030e285, 0x5fdd: 0x0030f685, 0x5fde: 0x00310085, 0x5fdf: 0x00312a85, - 0x5fe0: 0x002bde8b, 0x5fe1: 0x002c0a8b, 0x5fe2: 0x002c3a8b, 0x5fe3: 0x002c628b, - 0x5fe4: 0x002c988b, 0x5fe5: 0x002d088b, 0x5fe6: 0x002d228b, 0x5fe7: 0x002d688b, - 0x5fe8: 0x002d9a8b, 0x5fe9: 0x002dcc8b, 0x5fea: 0x002dfe8b, 0x5feb: 0x002e228b, - 0x5fec: 0x002e828b, 0x5fed: 0x002e9e8b, 0x5fee: 0x002ee28b, 0x5fef: 0x002f2c8b, - 0x5ff0: 0x002f568b, 0x5ff1: 0x002f7a8b, 0x5ff2: 0x002fe68b, 0x5ff3: 0x00302c8b, - 0x5ff4: 0x00306c8b, 0x5ff5: 0x0030be8b, 0x5ff6: 0x0030e28b, 0x5ff7: 0x0030f68b, - 0x5ff8: 0x0031008b, 0x5ff9: 0x00312a8b, 0x5ffa: 0x002bde85, 0x5ffb: 0x002c0a85, - 0x5ffc: 0x002c3a85, 0x5ffd: 0x002c6285, 0x5ffe: 0x002c9885, 0x5fff: 0x002d0885, - // Block 0x180, offset 0x6000 - 0x6000: 0x002d2285, 0x6001: 0x002d6885, 0x6002: 0x002d9a85, 0x6003: 0x002dcc85, - 0x6004: 0x002dfe85, 0x6005: 0x002e2285, 0x6006: 0x002e8285, 0x6007: 0x002e9e85, - 0x6008: 0x002ee285, 0x6009: 0x002f2c85, 0x600a: 0x002f5685, 0x600b: 0x002f7a85, - 0x600c: 0x002fe685, 0x600d: 0x00302c85, 0x600e: 0x00306c85, 0x600f: 0x0030be85, - 0x6010: 0x0030e285, 0x6011: 0x0030f685, 0x6012: 0x00310085, 0x6013: 0x00312a85, - 0x6014: 0x002bde8b, 0x6015: 0x002c0a8b, 0x6016: 0x002c3a8b, 0x6017: 0x002c628b, - 0x6018: 0x002c988b, 0x6019: 0x002d088b, 0x601a: 0x002d228b, 0x601b: 0x002d688b, - 0x601c: 0x002d9a8b, 0x601d: 0x002dcc8b, 0x601e: 0x002dfe8b, 0x601f: 0x002e228b, - 0x6020: 0x002e828b, 0x6021: 0x002e9e8b, 0x6022: 0x002ee28b, 0x6023: 0x002f2c8b, - 0x6024: 0x002f568b, 0x6025: 0x002f7a8b, 0x6026: 0x002fe68b, 0x6027: 0x00302c8b, - 0x6028: 0x00306c8b, 0x6029: 0x0030be8b, 0x602a: 0x0030e28b, 0x602b: 0x0030f68b, - 0x602c: 0x0031008b, 0x602d: 0x00312a8b, 0x602e: 0x002bde85, 0x602f: 0x002c0a85, - 0x6030: 0x002c3a85, 0x6031: 0x002c6285, 0x6032: 0x002c9885, 0x6033: 0x002d0885, - 0x6034: 0x002d2285, 0x6035: 0x002d6885, 0x6036: 0x002d9a85, 0x6037: 0x002dcc85, - 0x6038: 0x002dfe85, 0x6039: 0x002e2285, 0x603a: 0x002e8285, 0x603b: 0x002e9e85, - 0x603c: 0x002ee285, 0x603d: 0x002f2c85, 0x603e: 0x002f5685, 0x603f: 0x002f7a85, - // Block 0x181, offset 0x6040 - 0x6040: 0x002fe685, 0x6041: 0x00302c85, 0x6042: 0x00306c85, 0x6043: 0x0030be85, - 0x6044: 0x0030e285, 0x6045: 0x0030f685, 0x6046: 0x00310085, 0x6047: 0x00312a85, - 0x6048: 0x002bde8b, 0x6049: 0x002c0a8b, 0x604a: 0x002c3a8b, 0x604b: 0x002c628b, - 0x604c: 0x002c988b, 0x604d: 0x002d088b, 0x604e: 0x002d228b, 0x604f: 0x002d688b, - 0x6050: 0x002d9a8b, 0x6051: 0x002dcc8b, 0x6052: 0x002dfe8b, 0x6053: 0x002e228b, - 0x6054: 0x002e828b, 0x6055: 0x002e9e8b, 0x6056: 0x002ee28b, 0x6057: 0x002f2c8b, - 0x6058: 0x002f568b, 0x6059: 0x002f7a8b, 0x605a: 0x002fe68b, 0x605b: 0x00302c8b, - 0x605c: 0x00306c8b, 0x605d: 0x0030be8b, 0x605e: 0x0030e28b, 0x605f: 0x0030f68b, - 0x6060: 0x0031008b, 0x6061: 0x00312a8b, 0x6062: 0x002bde85, 0x6063: 0x002c0a85, - 0x6064: 0x002c3a85, 0x6065: 0x002c6285, 0x6066: 0x002c9885, 0x6067: 0x002d0885, - 0x6068: 0x002d2285, 0x6069: 0x002d6885, 0x606a: 0x002d9a85, 0x606b: 0x002dcc85, - 0x606c: 0x002dfe85, 0x606d: 0x002e2285, 0x606e: 0x002e8285, 0x606f: 0x002e9e85, - 0x6070: 0x002ee285, 0x6071: 0x002f2c85, 0x6072: 0x002f5685, 0x6073: 0x002f7a85, - 0x6074: 0x002fe685, 0x6075: 0x00302c85, 0x6076: 0x00306c85, 0x6077: 0x0030be85, - 0x6078: 0x0030e285, 0x6079: 0x0030f685, 0x607a: 0x00310085, 0x607b: 0x00312a85, - 0x607c: 0x002bde8b, 0x607d: 0x002c0a8b, 0x607e: 0x002c3a8b, 0x607f: 0x002c628b, - // Block 0x182, offset 0x6080 - 0x6080: 0x002c988b, 0x6081: 0x002d088b, 0x6082: 0x002d228b, 0x6083: 0x002d688b, - 0x6084: 0x002d9a8b, 0x6085: 0x002dcc8b, 0x6086: 0x002dfe8b, 0x6087: 0x002e228b, - 0x6088: 0x002e828b, 0x6089: 0x002e9e8b, 0x608a: 0x002ee28b, 0x608b: 0x002f2c8b, - 0x608c: 0x002f568b, 0x608d: 0x002f7a8b, 0x608e: 0x002fe68b, 0x608f: 0x00302c8b, - 0x6090: 0x00306c8b, 0x6091: 0x0030be8b, 0x6092: 0x0030e28b, 0x6093: 0x0030f68b, - 0x6094: 0x0031008b, 0x6095: 0x00312a8b, 0x6096: 0x002bde85, 0x6097: 0x002c0a85, - 0x6098: 0x002c3a85, 0x6099: 0x002c6285, 0x609a: 0x002c9885, 0x609b: 0x002d0885, - 0x609c: 0x002d2285, 0x609d: 0x002d6885, 0x609e: 0x002d9a85, 0x609f: 0x002dcc85, - 0x60a0: 0x002dfe85, 0x60a1: 0x002e2285, 0x60a2: 0x002e8285, 0x60a3: 0x002e9e85, - 0x60a4: 0x002ee285, 0x60a5: 0x002f2c85, 0x60a6: 0x002f5685, 0x60a7: 0x002f7a85, - 0x60a8: 0x002fe685, 0x60a9: 0x00302c85, 0x60aa: 0x00306c85, 0x60ab: 0x0030be85, - 0x60ac: 0x0030e285, 0x60ad: 0x0030f685, 0x60ae: 0x00310085, 0x60af: 0x00312a85, - 0x60b0: 0x002bde8b, 0x60b1: 0x002c0a8b, 0x60b2: 0x002c3a8b, 0x60b3: 0x002c628b, - 0x60b4: 0x002c988b, 0x60b5: 0x002d088b, 0x60b6: 0x002d228b, 0x60b7: 0x002d688b, - 0x60b8: 0x002d9a8b, 0x60b9: 0x002dcc8b, 0x60ba: 0x002dfe8b, 0x60bb: 0x002e228b, - 0x60bc: 0x002e828b, 0x60bd: 0x002e9e8b, 0x60be: 0x002ee28b, 0x60bf: 0x002f2c8b, - // Block 0x183, offset 0x60c0 - 0x60c0: 0x002f568b, 0x60c1: 0x002f7a8b, 0x60c2: 0x002fe68b, 0x60c3: 0x00302c8b, - 0x60c4: 0x00306c8b, 0x60c5: 0x0030be8b, 0x60c6: 0x0030e28b, 0x60c7: 0x0030f68b, - 0x60c8: 0x0031008b, 0x60c9: 0x00312a8b, 0x60ca: 0x002bde85, 0x60cb: 0x002c0a85, - 0x60cc: 0x002c3a85, 0x60cd: 0x002c6285, 0x60ce: 0x002c9885, 0x60cf: 0x002d0885, - 0x60d0: 0x002d2285, 0x60d1: 0x002d6885, 0x60d2: 0x002d9a85, 0x60d3: 0x002dcc85, - 0x60d4: 0x002dfe85, 0x60d5: 0x002e2285, 0x60d6: 0x002e8285, 0x60d7: 0x002e9e85, - 0x60d8: 0x002ee285, 0x60d9: 0x002f2c85, 0x60da: 0x002f5685, 0x60db: 0x002f7a85, - 0x60dc: 0x002fe685, 0x60dd: 0x00302c85, 0x60de: 0x00306c85, 0x60df: 0x0030be85, - 0x60e0: 0x0030e285, 0x60e1: 0x0030f685, 0x60e2: 0x00310085, 0x60e3: 0x00312a85, - 0x60e4: 0x002da285, 0x60e5: 0x002dd485, - 0x60e8: 0x0032528b, 0x60e9: 0x0032548b, 0x60ea: 0x0032568b, 0x60eb: 0x00325a8b, - 0x60ec: 0x00325c8b, 0x60ed: 0x0032648b, 0x60ee: 0x0032688b, 0x60ef: 0x00326a8b, - 0x60f0: 0x00326c8b, 0x60f1: 0x0032708b, 0x60f2: 0x0032728b, 0x60f3: 0x0032768b, - 0x60f4: 0x0032788b, 0x60f5: 0x00327a8b, 0x60f6: 0x00327c8b, 0x60f7: 0x00327e8b, - 0x60f8: 0x0032888b, 0x60f9: 0x00326a8b, 0x60fa: 0x00328e8b, 0x60fb: 0x0032968b, - 0x60fc: 0x0032988b, 0x60fd: 0x00329a8b, 0x60fe: 0x00329c8b, 0x60ff: 0x00329e8b, - // Block 0x184, offset 0x6100 - 0x6100: 0x0032a28b, 0x6101: 0x00092485, 0x6102: 0x00325285, 0x6103: 0x00325485, - 0x6104: 0x00325685, 0x6105: 0x00325a85, 0x6106: 0x00325c85, 0x6107: 0x00326485, - 0x6108: 0x00326885, 0x6109: 0x00326a85, 0x610a: 0x00326c85, 0x610b: 0x00327085, - 0x610c: 0x00327285, 0x610d: 0x00327685, 0x610e: 0x00327885, 0x610f: 0x00327a85, - 0x6110: 0x00327c85, 0x6111: 0x00327e85, 0x6112: 0x00328885, 0x6113: 0x00328e85, - 0x6114: 0x00328e85, 0x6115: 0x00329685, 0x6116: 0x00329885, 0x6117: 0x00329a85, - 0x6118: 0x00329c85, 0x6119: 0x00329e85, 0x611a: 0x0032a285, 0x611b: 0x00091c85, - 0x611c: 0x00325c85, 0x611d: 0x00326a85, 0x611e: 0x00327085, 0x611f: 0x00329a85, - 0x6120: 0x00328885, 0x6121: 0x00327e85, 0x6122: 0x0032528b, 0x6123: 0x0032548b, - 0x6124: 0x0032568b, 0x6125: 0x00325a8b, 0x6126: 0x00325c8b, 0x6127: 0x0032648b, - 0x6128: 0x0032688b, 0x6129: 0x00326a8b, 0x612a: 0x00326c8b, 0x612b: 0x0032708b, - 0x612c: 0x0032728b, 0x612d: 0x0032768b, 0x612e: 0x0032788b, 0x612f: 0x00327a8b, - 0x6130: 0x00327c8b, 0x6131: 0x00327e8b, 0x6132: 0x0032888b, 0x6133: 0x00326a8b, - 0x6134: 0x00328e8b, 0x6135: 0x0032968b, 0x6136: 0x0032988b, 0x6137: 0x00329a8b, - 0x6138: 0x00329c8b, 0x6139: 0x00329e8b, 0x613a: 0x0032a28b, 0x613b: 0x00092485, - 0x613c: 0x00325285, 0x613d: 0x00325485, 0x613e: 0x00325685, 0x613f: 0x00325a85, - // Block 0x185, offset 0x6140 - 0x6140: 0x00325c85, 0x6141: 0x00326485, 0x6142: 0x00326885, 0x6143: 0x00326a85, - 0x6144: 0x00326c85, 0x6145: 0x00327085, 0x6146: 0x00327285, 0x6147: 0x00327685, - 0x6148: 0x00327885, 0x6149: 0x00327a85, 0x614a: 0x00327c85, 0x614b: 0x00327e85, - 0x614c: 0x00328885, 0x614d: 0x00328e85, 0x614e: 0x00328e85, 0x614f: 0x00329685, - 0x6150: 0x00329885, 0x6151: 0x00329a85, 0x6152: 0x00329c85, 0x6153: 0x00329e85, - 0x6154: 0x0032a285, 0x6155: 0x00091c85, 0x6156: 0x00325c85, 0x6157: 0x00326a85, - 0x6158: 0x00327085, 0x6159: 0x00329a85, 0x615a: 0x00328885, 0x615b: 0x00327e85, - 0x615c: 0x0032528b, 0x615d: 0x0032548b, 0x615e: 0x0032568b, 0x615f: 0x00325a8b, - 0x6160: 0x00325c8b, 0x6161: 0x0032648b, 0x6162: 0x0032688b, 0x6163: 0x00326a8b, - 0x6164: 0x00326c8b, 0x6165: 0x0032708b, 0x6166: 0x0032728b, 0x6167: 0x0032768b, - 0x6168: 0x0032788b, 0x6169: 0x00327a8b, 0x616a: 0x00327c8b, 0x616b: 0x00327e8b, - 0x616c: 0x0032888b, 0x616d: 0x00326a8b, 0x616e: 0x00328e8b, 0x616f: 0x0032968b, - 0x6170: 0x0032988b, 0x6171: 0x00329a8b, 0x6172: 0x00329c8b, 0x6173: 0x00329e8b, - 0x6174: 0x0032a28b, 0x6175: 0x00092485, 0x6176: 0x00325285, 0x6177: 0x00325485, - 0x6178: 0x00325685, 0x6179: 0x00325a85, 0x617a: 0x00325c85, 0x617b: 0x00326485, - 0x617c: 0x00326885, 0x617d: 0x00326a85, 0x617e: 0x00326c85, 0x617f: 0x00327085, - // Block 0x186, offset 0x6180 - 0x6180: 0x00327285, 0x6181: 0x00327685, 0x6182: 0x00327885, 0x6183: 0x00327a85, - 0x6184: 0x00327c85, 0x6185: 0x00327e85, 0x6186: 0x00328885, 0x6187: 0x00328e85, - 0x6188: 0x00328e85, 0x6189: 0x00329685, 0x618a: 0x00329885, 0x618b: 0x00329a85, - 0x618c: 0x00329c85, 0x618d: 0x00329e85, 0x618e: 0x0032a285, 0x618f: 0x00091c85, - 0x6190: 0x00325c85, 0x6191: 0x00326a85, 0x6192: 0x00327085, 0x6193: 0x00329a85, - 0x6194: 0x00328885, 0x6195: 0x00327e85, 0x6196: 0x0032528b, 0x6197: 0x0032548b, - 0x6198: 0x0032568b, 0x6199: 0x00325a8b, 0x619a: 0x00325c8b, 0x619b: 0x0032648b, - 0x619c: 0x0032688b, 0x619d: 0x00326a8b, 0x619e: 0x00326c8b, 0x619f: 0x0032708b, - 0x61a0: 0x0032728b, 0x61a1: 0x0032768b, 0x61a2: 0x0032788b, 0x61a3: 0x00327a8b, - 0x61a4: 0x00327c8b, 0x61a5: 0x00327e8b, 0x61a6: 0x0032888b, 0x61a7: 0x00326a8b, - 0x61a8: 0x00328e8b, 0x61a9: 0x0032968b, 0x61aa: 0x0032988b, 0x61ab: 0x00329a8b, - 0x61ac: 0x00329c8b, 0x61ad: 0x00329e8b, 0x61ae: 0x0032a28b, 0x61af: 0x00092485, - 0x61b0: 0x00325285, 0x61b1: 0x00325485, 0x61b2: 0x00325685, 0x61b3: 0x00325a85, - 0x61b4: 0x00325c85, 0x61b5: 0x00326485, 0x61b6: 0x00326885, 0x61b7: 0x00326a85, - 0x61b8: 0x00326c85, 0x61b9: 0x00327085, 0x61ba: 0x00327285, 0x61bb: 0x00327685, - 0x61bc: 0x00327885, 0x61bd: 0x00327a85, 0x61be: 0x00327c85, 0x61bf: 0x00327e85, - // Block 0x187, offset 0x61c0 - 0x61c0: 0x00328885, 0x61c1: 0x00328e85, 0x61c2: 0x00328e85, 0x61c3: 0x00329685, - 0x61c4: 0x00329885, 0x61c5: 0x00329a85, 0x61c6: 0x00329c85, 0x61c7: 0x00329e85, - 0x61c8: 0x0032a285, 0x61c9: 0x00091c85, 0x61ca: 0x00325c85, 0x61cb: 0x00326a85, - 0x61cc: 0x00327085, 0x61cd: 0x00329a85, 0x61ce: 0x00328885, 0x61cf: 0x00327e85, - 0x61d0: 0x0032528b, 0x61d1: 0x0032548b, 0x61d2: 0x0032568b, 0x61d3: 0x00325a8b, - 0x61d4: 0x00325c8b, 0x61d5: 0x0032648b, 0x61d6: 0x0032688b, 0x61d7: 0x00326a8b, - 0x61d8: 0x00326c8b, 0x61d9: 0x0032708b, 0x61da: 0x0032728b, 0x61db: 0x0032768b, - 0x61dc: 0x0032788b, 0x61dd: 0x00327a8b, 0x61de: 0x00327c8b, 0x61df: 0x00327e8b, - 0x61e0: 0x0032888b, 0x61e1: 0x00326a8b, 0x61e2: 0x00328e8b, 0x61e3: 0x0032968b, - 0x61e4: 0x0032988b, 0x61e5: 0x00329a8b, 0x61e6: 0x00329c8b, 0x61e7: 0x00329e8b, - 0x61e8: 0x0032a28b, 0x61e9: 0x00092485, 0x61ea: 0x00325285, 0x61eb: 0x00325485, - 0x61ec: 0x00325685, 0x61ed: 0x00325a85, 0x61ee: 0x00325c85, 0x61ef: 0x00326485, - 0x61f0: 0x00326885, 0x61f1: 0x00326a85, 0x61f2: 0x00326c85, 0x61f3: 0x00327085, - 0x61f4: 0x00327285, 0x61f5: 0x00327685, 0x61f6: 0x00327885, 0x61f7: 0x00327a85, - 0x61f8: 0x00327c85, 0x61f9: 0x00327e85, 0x61fa: 0x00328885, 0x61fb: 0x00328e85, - 0x61fc: 0x00328e85, 0x61fd: 0x00329685, 0x61fe: 0x00329885, 0x61ff: 0x00329a85, - // Block 0x188, offset 0x6200 - 0x6200: 0x00329c85, 0x6201: 0x00329e85, 0x6202: 0x0032a285, 0x6203: 0x00091c85, - 0x6204: 0x00325c85, 0x6205: 0x00326a85, 0x6206: 0x00327085, 0x6207: 0x00329a85, - 0x6208: 0x00328885, 0x6209: 0x00327e85, 0x620a: 0x00325e8b, 0x620b: 0x00325e85, - 0x620e: 0x0029cc85, 0x620f: 0x0029ce85, - 0x6210: 0x0029d085, 0x6211: 0x0029d285, 0x6212: 0x0029d485, 0x6213: 0x0029d685, - 0x6214: 0x0029d885, 0x6215: 0x0029da85, 0x6216: 0x0029dc85, 0x6217: 0x0029de85, - 0x6218: 0x0029cc85, 0x6219: 0x0029ce85, 0x621a: 0x0029d085, 0x621b: 0x0029d285, - 0x621c: 0x0029d485, 0x621d: 0x0029d685, 0x621e: 0x0029d885, 0x621f: 0x0029da85, - 0x6220: 0x0029dc85, 0x6221: 0x0029de85, 0x6222: 0x0029cc85, 0x6223: 0x0029ce85, - 0x6224: 0x0029d085, 0x6225: 0x0029d285, 0x6226: 0x0029d485, 0x6227: 0x0029d685, - 0x6228: 0x0029d885, 0x6229: 0x0029da85, 0x622a: 0x0029dc85, 0x622b: 0x0029de85, - 0x622c: 0x0029cc85, 0x622d: 0x0029ce85, 0x622e: 0x0029d085, 0x622f: 0x0029d285, - 0x6230: 0x0029d485, 0x6231: 0x0029d685, 0x6232: 0x0029d885, 0x6233: 0x0029da85, - 0x6234: 0x0029dc85, 0x6235: 0x0029de85, 0x6236: 0x0029cc85, 0x6237: 0x0029ce85, - 0x6238: 0x0029d085, 0x6239: 0x0029d285, 0x623a: 0x0029d485, 0x623b: 0x0029d685, - 0x623c: 0x0029d885, 0x623d: 0x0029da85, 0x623e: 0x0029dc85, 0x623f: 0x0029de85, - // Block 0x189, offset 0x6240 - 0x6240: 0x00393885, 0x6241: 0x00393c85, 0x6242: 0x00396485, 0x6243: 0x00398885, - 0x6245: 0x003a7485, 0x6246: 0x0039a685, 0x6247: 0x00397285, - 0x6248: 0x0039e685, 0x6249: 0x003a9085, 0x624a: 0x003a1a85, 0x624b: 0x003a4085, - 0x624c: 0x003a4e85, 0x624d: 0x003a5685, 0x624e: 0x0039c685, 0x624f: 0x0039ee85, - 0x6250: 0x0039fc85, 0x6251: 0x0039dc85, 0x6252: 0x003a1285, 0x6253: 0x0039a485, - 0x6254: 0x0039c885, 0x6255: 0x00395685, 0x6256: 0x00395885, 0x6257: 0x00397485, - 0x6258: 0x00398a85, 0x6259: 0x0039de85, 0x625a: 0x0039e885, 0x625b: 0x0039f085, - 0x625c: 0x00393a85, 0x625d: 0x003a5885, 0x625e: 0x0039fe85, 0x625f: 0x003a1085, - 0x6261: 0x00393c85, 0x6262: 0x00396485, - 0x6264: 0x003a6885, 0x6267: 0x00397285, - 0x6269: 0x003a9085, 0x626a: 0x003a1a85, 0x626b: 0x003a4085, - 0x626c: 0x003a4e85, 0x626d: 0x003a5685, 0x626e: 0x0039c685, 0x626f: 0x0039ee85, - 0x6270: 0x0039fc85, 0x6271: 0x0039dc85, 0x6272: 0x003a1285, - 0x6274: 0x0039c885, 0x6275: 0x00395685, 0x6276: 0x00395885, 0x6277: 0x00397485, - 0x6279: 0x0039de85, 0x627b: 0x0039f085, - // Block 0x18a, offset 0x6280 - 0x6282: 0x00396485, - 0x6287: 0x00397285, - 0x6289: 0x003a9085, 0x628b: 0x003a4085, - 0x628d: 0x003a5685, 0x628e: 0x0039c685, 0x628f: 0x0039ee85, - 0x6291: 0x0039dc85, 0x6292: 0x003a1285, - 0x6294: 0x0039c885, 0x6297: 0x00397485, - 0x6299: 0x0039de85, 0x629b: 0x0039f085, - 0x629d: 0x003a5885, 0x629f: 0x003a1085, - 0x62a1: 0x00393c85, 0x62a2: 0x00396485, - 0x62a4: 0x003a6885, 0x62a7: 0x00397285, - 0x62a8: 0x0039e685, 0x62a9: 0x003a9085, 0x62aa: 0x003a1a85, - 0x62ac: 0x003a4e85, 0x62ad: 0x003a5685, 0x62ae: 0x0039c685, 0x62af: 0x0039ee85, - 0x62b0: 0x0039fc85, 0x62b1: 0x0039dc85, 0x62b2: 0x003a1285, - 0x62b4: 0x0039c885, 0x62b5: 0x00395685, 0x62b6: 0x00395885, 0x62b7: 0x00397485, - 0x62b9: 0x0039de85, 0x62ba: 0x0039e885, 0x62bb: 0x0039f085, - 0x62bc: 0x00393a85, 0x62be: 0x0039fe85, - // Block 0x18b, offset 0x62c0 - 0x62c0: 0x00393885, 0x62c1: 0x00393c85, 0x62c2: 0x00396485, 0x62c3: 0x00398885, - 0x62c4: 0x003a6885, 0x62c5: 0x003a7485, 0x62c6: 0x0039a685, 0x62c7: 0x00397285, - 0x62c8: 0x0039e685, 0x62c9: 0x003a9085, 0x62cb: 0x003a4085, - 0x62cc: 0x003a4e85, 0x62cd: 0x003a5685, 0x62ce: 0x0039c685, 0x62cf: 0x0039ee85, - 0x62d0: 0x0039fc85, 0x62d1: 0x0039dc85, 0x62d2: 0x003a1285, 0x62d3: 0x0039a485, - 0x62d4: 0x0039c885, 0x62d5: 0x00395685, 0x62d6: 0x00395885, 0x62d7: 0x00397485, - 0x62d8: 0x00398a85, 0x62d9: 0x0039de85, 0x62da: 0x0039e885, 0x62db: 0x0039f085, - 0x62e1: 0x00393c85, 0x62e2: 0x00396485, 0x62e3: 0x00398885, - 0x62e5: 0x003a7485, 0x62e6: 0x0039a685, 0x62e7: 0x00397285, - 0x62e8: 0x0039e685, 0x62e9: 0x003a9085, 0x62eb: 0x003a4085, - 0x62ec: 0x003a4e85, 0x62ed: 0x003a5685, 0x62ee: 0x0039c685, 0x62ef: 0x0039ee85, - 0x62f0: 0x0039fc85, 0x62f1: 0x0039dc85, 0x62f2: 0x003a1285, 0x62f3: 0x0039a485, - 0x62f4: 0x0039c885, 0x62f5: 0x00395685, 0x62f6: 0x00395885, 0x62f7: 0x00397485, - 0x62f8: 0x00398a85, 0x62f9: 0x0039de85, 0x62fa: 0x0039e885, 0x62fb: 0x0039f085, - // Block 0x18c, offset 0x6300 - 0x6330: 0x40070a20, 0x6331: 0x40070c20, - // Block 0x18d, offset 0x6340 - 0x6340: 0x401f6e20, 0x6341: 0x401f7020, 0x6342: 0x401f7220, 0x6343: 0x401f7420, - 0x6344: 0x401f7620, 0x6345: 0x401f7820, 0x6346: 0x401f7a20, 0x6347: 0x401f7c20, - 0x6348: 0x401f7e20, 0x6349: 0x401f8020, 0x634a: 0x401f8220, 0x634b: 0x401f8420, - 0x634c: 0x401f8620, 0x634d: 0x401f8820, 0x634e: 0x401f8a20, 0x634f: 0x401f8c20, - 0x6350: 0x401f8e20, 0x6351: 0x401f9020, 0x6352: 0x401f9220, 0x6353: 0x401f9420, - 0x6354: 0x401f9620, 0x6355: 0x401f9820, 0x6356: 0x401f9a20, 0x6357: 0x401f9c20, - 0x6358: 0x401f9e20, 0x6359: 0x401fa020, 0x635a: 0x401fa220, 0x635b: 0x401fa420, - 0x635c: 0x401fa620, 0x635d: 0x401fa820, 0x635e: 0x401faa20, 0x635f: 0x401fac20, - 0x6360: 0x401fae20, 0x6361: 0x401fb020, 0x6362: 0x401fb220, 0x6363: 0x401fb420, - 0x6364: 0x401fb620, 0x6365: 0x401fb820, 0x6366: 0x401fba20, 0x6367: 0x401fbc20, - 0x6368: 0x401fbe20, 0x6369: 0x401fc020, 0x636a: 0x401fc220, 0x636b: 0x401fc420, - 0x6370: 0x401fc620, 0x6371: 0x401fc820, 0x6372: 0x401fca20, 0x6373: 0x401fcc20, - 0x6374: 0x401fce20, 0x6375: 0x401fd020, 0x6376: 0x401fd220, 0x6377: 0x401fd420, - 0x6378: 0x401fd620, 0x6379: 0x401fd820, 0x637a: 0x401fda20, 0x637b: 0x401fdc20, - 0x637c: 0x401fde20, 0x637d: 0x401fe020, 0x637e: 0x401fe220, 0x637f: 0x401fe420, - // Block 0x18e, offset 0x6380 - 0x6380: 0x401fe620, 0x6381: 0x401fe820, 0x6382: 0x401fea20, 0x6383: 0x401fec20, - 0x6384: 0x401fee20, 0x6385: 0x401ff020, 0x6386: 0x401ff220, 0x6387: 0x401ff420, - 0x6388: 0x401ff620, 0x6389: 0x401ff820, 0x638a: 0x401ffa20, 0x638b: 0x401ffc20, - 0x638c: 0x401ffe20, 0x638d: 0x40200020, 0x638e: 0x40200220, 0x638f: 0x40200420, - 0x6390: 0x40200620, 0x6391: 0x40200820, 0x6392: 0x40200a20, 0x6393: 0x40200c20, - 0x6394: 0x40200e20, 0x6395: 0x40201020, 0x6396: 0x40201220, 0x6397: 0x40201420, - 0x6398: 0x40201620, 0x6399: 0x40201820, 0x639a: 0x40201a20, 0x639b: 0x40201c20, - 0x639c: 0x40201e20, 0x639d: 0x40202020, 0x639e: 0x40202220, 0x639f: 0x40202420, - 0x63a0: 0x40202620, 0x63a1: 0x40202820, 0x63a2: 0x40202a20, 0x63a3: 0x40202c20, - 0x63a4: 0x40202e20, 0x63a5: 0x40203020, 0x63a6: 0x40203220, 0x63a7: 0x40203420, - 0x63a8: 0x40203620, 0x63a9: 0x40203820, 0x63aa: 0x40203a20, 0x63ab: 0x40203c20, - 0x63ac: 0x40203e20, 0x63ad: 0x40204020, 0x63ae: 0x40204220, 0x63af: 0x40204420, - 0x63b0: 0x40204620, 0x63b1: 0x40204820, 0x63b2: 0x40204a20, 0x63b3: 0x40204c20, - 0x63b4: 0x40204e20, 0x63b5: 0x40205020, 0x63b6: 0x40205220, 0x63b7: 0x40205420, - 0x63b8: 0x40205620, 0x63b9: 0x40205820, 0x63ba: 0x40205a20, 0x63bb: 0x40205c20, - 0x63bc: 0x40205e20, 0x63bd: 0x40206020, 0x63be: 0x40206220, 0x63bf: 0x40206420, - // Block 0x18f, offset 0x63c0 - 0x63c0: 0x40206620, 0x63c1: 0x40206820, 0x63c2: 0x40206a20, 0x63c3: 0x40206c20, - 0x63c4: 0x40206e20, 0x63c5: 0x40207020, 0x63c6: 0x40207220, 0x63c7: 0x40207420, - 0x63c8: 0x40207620, 0x63c9: 0x40207820, 0x63ca: 0x40207a20, 0x63cb: 0x40207c20, - 0x63cc: 0x40207e20, 0x63cd: 0x40208020, 0x63ce: 0x40208220, 0x63cf: 0x40208420, - 0x63d0: 0x40208620, 0x63d1: 0x40208820, 0x63d2: 0x40208a20, 0x63d3: 0x40208c20, - 0x63e0: 0x40208e20, 0x63e1: 0x40209020, 0x63e2: 0x40209220, 0x63e3: 0x40209420, - 0x63e4: 0x40209620, 0x63e5: 0x40209820, 0x63e6: 0x40209a20, 0x63e7: 0x40209c20, - 0x63e8: 0x40209e20, 0x63e9: 0x4020a020, 0x63ea: 0x4020a220, 0x63eb: 0x4020a420, - 0x63ec: 0x4020a620, 0x63ed: 0x4020a820, 0x63ee: 0x4020aa20, - 0x63f1: 0x4020ac20, 0x63f2: 0x4020ae20, 0x63f3: 0x4020b020, - 0x63f4: 0x4020b220, 0x63f5: 0x4020b420, 0x63f6: 0x4020b620, 0x63f7: 0x4020b820, - 0x63f8: 0x4020ba20, 0x63f9: 0x4020bc20, 0x63fa: 0x4020be20, 0x63fb: 0x4020c020, - 0x63fc: 0x4020c220, 0x63fd: 0x4020c420, 0x63fe: 0x4020c620, - // Block 0x190, offset 0x6400 - 0x6401: 0x4020c820, 0x6402: 0x4020ca20, 0x6403: 0x4020cc20, - 0x6404: 0x4020ce20, 0x6405: 0x4020d020, 0x6406: 0x4020d220, 0x6407: 0x4020d420, - 0x6408: 0x4020d620, 0x6409: 0x4020d820, 0x640a: 0x4020da20, 0x640b: 0x4020dc20, - 0x640c: 0x4020de20, 0x640d: 0x4020e020, 0x640e: 0x4020e220, 0x640f: 0x4020e420, - 0x6411: 0x4020e620, 0x6412: 0x4020e820, 0x6413: 0x4020ea20, - 0x6414: 0x4020ec20, 0x6415: 0x4020ee20, 0x6416: 0x4020f020, 0x6417: 0x4020f220, - 0x6418: 0x4020f420, 0x6419: 0x4020f620, 0x641a: 0x4020f820, 0x641b: 0x4020fa20, - 0x641c: 0x4020fc20, 0x641d: 0x4020fe20, 0x641e: 0x40210020, 0x641f: 0x40210220, - // Block 0x191, offset 0x6440 - 0x6440: 0xf0001f04, 0x6441: 0xf0001f04, 0x6442: 0xf0001f04, 0x6443: 0xf0001f04, - 0x6444: 0xf0001f04, 0x6445: 0xf0001f04, 0x6446: 0xf0001f04, 0x6447: 0xf0001f04, - 0x6448: 0xf0001f04, 0x6449: 0xf0001f04, 0x644a: 0xf0001f04, - 0x6450: 0xf0000a04, 0x6451: 0xf0000a04, 0x6452: 0xf0000a04, 0x6453: 0xf0000a04, - 0x6454: 0xf0000a04, 0x6455: 0xf0000a04, 0x6456: 0xf0000a04, 0x6457: 0xf0000a04, - 0x6458: 0xf0000a04, 0x6459: 0xf0000a04, 0x645a: 0xf0000a04, 0x645b: 0xf0000a04, - 0x645c: 0xf0000a04, 0x645d: 0xf0000a04, 0x645e: 0xf0000a04, 0x645f: 0xf0000a04, - 0x6460: 0xf0000a04, 0x6461: 0xf0000a04, 0x6462: 0xf0000a04, 0x6463: 0xf0000a04, - 0x6464: 0xf0000a04, 0x6465: 0xf0000a04, 0x6466: 0xf0000a04, 0x6467: 0xf0000a04, - 0x6468: 0xf0000a04, 0x6469: 0xf0000a04, 0x646a: 0xf0000a04, 0x646b: 0x002c3a8c, - 0x646c: 0x002f7a8c, 0x646d: 0xf0000c0c, 0x646e: 0xf0000c0c, - 0x6470: 0x002bde9d, 0x6471: 0x002c0a9d, 0x6472: 0x002c3a9d, 0x6473: 0x002c629d, - 0x6474: 0x002c989d, 0x6475: 0x002d089d, 0x6476: 0x002d229d, 0x6477: 0x002d689d, - 0x6478: 0x002d9a9d, 0x6479: 0x002dcc9d, 0x647a: 0x002dfe9d, 0x647b: 0x002e229d, - 0x647c: 0x002e829d, 0x647d: 0x002e9e9d, 0x647e: 0x002ee29d, 0x647f: 0x002f2c9d, - // Block 0x192, offset 0x6480 - 0x6480: 0x002f569d, 0x6481: 0x002f7a9d, 0x6482: 0x002fe69d, 0x6483: 0x00302c9d, - 0x6484: 0x00306c9d, 0x6485: 0x0030be9d, 0x6486: 0x0030e29d, 0x6487: 0x0030f69d, - 0x6488: 0x0031009d, 0x6489: 0x00312a9d, 0x648a: 0xf0001d1d, 0x648b: 0xf0001d1d, - 0x648c: 0xf0001d1d, 0x648d: 0xf0001d1d, 0x648e: 0xe0000ebc, 0x648f: 0xf0001d1d, - 0x6490: 0x002bde8c, 0x6491: 0x002c0a8c, 0x6492: 0x002c3a8c, 0x6493: 0x002c628c, - 0x6494: 0x002c988c, 0x6495: 0x002d088c, 0x6496: 0x002d228c, 0x6497: 0x002d688c, - 0x6498: 0x002d9a8c, 0x6499: 0x002dcc8c, 0x649a: 0x002dfe8c, 0x649b: 0x002e228c, - 0x649c: 0x002e828c, 0x649d: 0x002e9e8c, 0x649e: 0x002ee28c, 0x649f: 0x002f2c8c, - 0x64a0: 0x002f568c, 0x64a1: 0x002f7a8c, 0x64a2: 0x002fe68c, 0x64a3: 0x00302c8c, - 0x64a4: 0x00306c8c, 0x64a5: 0x0030be8c, 0x64a6: 0x0030e28c, 0x64a7: 0x0030f68c, - 0x64a8: 0x0031008c, 0x64a9: 0x00312a8c, 0x64aa: 0xf0001414, 0x64ab: 0xf0001414, - 0x64b0: 0x002bde9d, 0x64b1: 0x002c0a9d, 0x64b2: 0x002c3a9d, 0x64b3: 0x002c629d, - 0x64b4: 0x002c989d, 0x64b5: 0x002d089d, 0x64b6: 0x002d229d, 0x64b7: 0x002d689d, - 0x64b8: 0x002d9a9d, 0x64b9: 0x002dcc9d, 0x64ba: 0x002dfe9d, 0x64bb: 0x002e229d, - 0x64bc: 0x002e829d, 0x64bd: 0x002e9e9d, 0x64be: 0x002ee29d, 0x64bf: 0x002f2c9d, - // Block 0x193, offset 0x64c0 - 0x64c0: 0x002f569d, 0x64c1: 0x002f7a9d, 0x64c2: 0x002fe69d, 0x64c3: 0x00302c9d, - 0x64c4: 0x00306c9d, 0x64c5: 0x0030be9d, 0x64c6: 0x0030e29d, 0x64c7: 0x0030f69d, - 0x64c8: 0x0031009d, 0x64c9: 0x00312a9d, 0x64ca: 0x002f2c9d, 0x64cb: 0xe0000c81, - 0x64cc: 0xe0000eb5, 0x64cd: 0xe0000f74, 0x64ce: 0xe00009d2, 0x64cf: 0xe00010f0, - 0x64d0: 0xf0001d1d, 0x64d1: 0xe0000a6f, 0x64d2: 0xe0000a7e, 0x64d3: 0xe0000ba4, - 0x64d4: 0xe0000c84, 0x64d5: 0xe0000d8a, 0x64d6: 0xe0000d8e, 0x64d7: 0xe0000e9b, - 0x64d8: 0xe0000f77, 0x64d9: 0xe00010a2, 0x64da: 0xe00010c0, - // Block 0x194, offset 0x6500 - 0x6526: 0x40110c20, 0x6527: 0x40110e20, - 0x6528: 0x40111020, 0x6529: 0x40111220, 0x652a: 0x40111420, 0x652b: 0x40111620, - 0x652c: 0x40111820, 0x652d: 0x40111a20, 0x652e: 0x40111c20, 0x652f: 0x40111e20, - 0x6530: 0x40112020, 0x6531: 0x40112220, 0x6532: 0x40112420, 0x6533: 0x40112620, - 0x6534: 0x40112820, 0x6535: 0x40112a20, 0x6536: 0x40112c20, 0x6537: 0x40112e20, - 0x6538: 0x40113020, 0x6539: 0x40113220, 0x653a: 0x40113420, 0x653b: 0x40113620, - 0x653c: 0x40113820, 0x653d: 0x40113a20, 0x653e: 0x40113c20, 0x653f: 0x40113e20, - // Block 0x195, offset 0x6540 - 0x6540: 0xf0001c1c, 0x6541: 0xf0001c1c, 0x6542: 0x00658c9c, - 0x6550: 0x02c4969c, 0x6551: 0x02b6ae9c, 0x6552: 0x02a7989c, 0x6553: 0xf0001c1c, - 0x6554: 0x029d189c, 0x6555: 0x02b2349c, 0x6556: 0x0313c69c, 0x6557: 0x02b2529c, - 0x6558: 0x029d489c, 0x6559: 0x02cc409c, 0x655a: 0x02e2429c, 0x655b: 0x02cb329c, - 0x655c: 0x02a49a9c, 0x655d: 0x02bf189c, 0x655e: 0x02a31a9c, 0x655f: 0x02cb609c, - 0x6560: 0x02a43a9c, 0x6561: 0x02fa849c, 0x6562: 0x02ea3e9c, 0x6563: 0x0319529c, - 0x6564: 0x02b1e09c, 0x6565: 0x02a8729c, 0x6566: 0x02de289c, 0x6567: 0x02c52a9c, - 0x6568: 0x02c6aa9c, 0x6569: 0x029c009c, 0x656a: 0x029c129c, 0x656b: 0x0320949c, - 0x656c: 0x02bbcc9c, 0x656d: 0x029c5a9c, 0x656e: 0x02a7e69c, 0x656f: 0x02c60e9c, - 0x6570: 0x031ae09c, 0x6571: 0x02c4a69c, 0x6572: 0x02f3029c, 0x6573: 0x02f4f49c, - 0x6574: 0x02a8109c, 0x6575: 0x02dd009c, 0x6576: 0x02ce129c, 0x6577: 0x02ce109c, - 0x6578: 0x02ea669c, 0x6579: 0x02a4e49c, 0x657a: 0x02ab6c9c, - // Block 0x196, offset 0x6580 - 0x6580: 0xf0000404, 0x6581: 0xf0000404, 0x6582: 0xf0000404, 0x6583: 0xf0000404, - 0x6584: 0xf0000404, 0x6585: 0xf0000404, 0x6586: 0xf0000404, 0x6587: 0xf0000404, - 0x6588: 0xf0000404, - 0x6590: 0x02bf2e86, 0x6591: 0x02a7de86, - // Block 0x197, offset 0x65c0 - 0x65c0: 0x40210420, 0x65c1: 0x40210620, 0x65c2: 0x40210820, 0x65c3: 0x40210a20, - 0x65c4: 0x40210c20, 0x65c5: 0x40210e20, 0x65c6: 0x40211020, 0x65c7: 0x40211220, - 0x65c8: 0x40211420, 0x65c9: 0x40211620, 0x65ca: 0x40211820, 0x65cb: 0x40211a20, - 0x65cc: 0x40211c20, 0x65cd: 0x40211e20, 0x65ce: 0x40212020, 0x65cf: 0x40212220, - 0x65d0: 0x40212420, 0x65d1: 0x40212620, 0x65d2: 0x40212820, 0x65d3: 0x40212a20, - 0x65d4: 0x40212c20, 0x65d5: 0x40212e20, 0x65d6: 0x40213020, 0x65d7: 0x40213220, - 0x65d8: 0x40213420, 0x65d9: 0x40213620, 0x65da: 0x40213820, 0x65db: 0x40213a20, - 0x65dc: 0x40213c20, 0x65dd: 0x40213e20, 0x65de: 0x40214020, 0x65df: 0x40214220, - 0x65e0: 0x40214420, - 0x65f0: 0x40214620, 0x65f1: 0x40214820, 0x65f2: 0x40214a20, 0x65f3: 0x40214c20, - 0x65f4: 0x40214e20, 0x65f5: 0x40215020, 0x65f7: 0x40215220, - 0x65f8: 0x40215420, 0x65f9: 0x40215620, 0x65fa: 0x40215820, 0x65fb: 0x40215a20, - 0x65fc: 0x40215c20, 0x65fd: 0x40215e20, 0x65fe: 0x40216020, 0x65ff: 0x40216220, - // Block 0x198, offset 0x6600 - 0x6600: 0x40216420, 0x6601: 0x40216620, 0x6602: 0x40216820, 0x6603: 0x40216a20, - 0x6604: 0x40216c20, 0x6605: 0x40216e20, 0x6606: 0x40217020, 0x6607: 0x40217220, - 0x6608: 0x40217420, 0x6609: 0x40217620, 0x660a: 0x40217820, 0x660b: 0x40217a20, - 0x660c: 0x40217c20, 0x660d: 0x40217e20, 0x660e: 0x40218020, 0x660f: 0x40218220, - 0x6610: 0x40218420, 0x6611: 0x40218620, 0x6612: 0x40218820, 0x6613: 0x40218a20, - 0x6614: 0x40218c20, 0x6615: 0x40218e20, 0x6616: 0x40219020, 0x6617: 0x40219220, - 0x6618: 0x40219420, 0x6619: 0x40219620, 0x661a: 0x40219820, 0x661b: 0x40219a20, - 0x661c: 0x40219c20, 0x661d: 0x40219e20, 0x661e: 0x4021a020, 0x661f: 0x4021a220, - 0x6620: 0x4021a420, 0x6621: 0x4021a620, 0x6622: 0x4021a820, 0x6623: 0x4021aa20, - 0x6624: 0x4021ac20, 0x6625: 0x4021ae20, 0x6626: 0x4021b020, 0x6627: 0x4021b220, - 0x6628: 0x4021b420, 0x6629: 0x4021b620, 0x662a: 0x4021b820, 0x662b: 0x4021ba20, - 0x662c: 0x4021bc20, 0x662d: 0x4021be20, 0x662e: 0x4021c020, 0x662f: 0x4021c220, - 0x6630: 0x4021c420, 0x6631: 0x4021c620, 0x6632: 0x4021c820, 0x6633: 0x4021ca20, - 0x6634: 0x4021cc20, 0x6635: 0x4021ce20, 0x6636: 0x4021d020, 0x6637: 0x4021d220, - 0x6638: 0x4021d420, 0x6639: 0x4021d620, 0x663a: 0x4021d820, 0x663b: 0x4021da20, - 0x663c: 0x4021dc20, - // Block 0x199, offset 0x6640 - 0x6640: 0x4021de20, 0x6641: 0x4021e020, 0x6642: 0x4021e220, 0x6643: 0x4021e420, - 0x6644: 0x4021e620, 0x6645: 0x4021e820, 0x6646: 0x4021ea20, 0x6647: 0x4021ec20, - 0x6648: 0x4021ee20, 0x6649: 0x4021f020, 0x664a: 0x4021f220, 0x664b: 0x4021f420, - 0x664c: 0x4021f620, 0x664d: 0x4021f820, 0x664e: 0x4021fa20, 0x664f: 0x4021fc20, - 0x6650: 0x4021fe20, 0x6651: 0x40220020, 0x6652: 0x40220220, 0x6653: 0x40220420, - 0x6660: 0x40220620, 0x6661: 0x40220820, 0x6662: 0x40220a20, 0x6663: 0x40220c20, - 0x6664: 0x40220e20, 0x6665: 0x40221020, 0x6666: 0x40221220, 0x6667: 0x40221420, - 0x6668: 0x40221620, 0x6669: 0x40221820, 0x666a: 0x40221a20, 0x666b: 0x40221c20, - 0x666c: 0x40221e20, 0x666d: 0x40222020, 0x666e: 0x40222220, 0x666f: 0x40222420, - 0x6670: 0x40222620, 0x6671: 0x40222820, 0x6672: 0x40222a20, 0x6673: 0x40222c20, - 0x6674: 0x40222e20, 0x6675: 0x40223020, 0x6676: 0x40223220, 0x6677: 0x40223420, - 0x6678: 0x40223620, 0x6679: 0x40223820, 0x667a: 0x40223a20, 0x667b: 0x40223c20, - 0x667c: 0x40223e20, 0x667d: 0x40224020, 0x667e: 0x40224220, 0x667f: 0x40224420, - // Block 0x19a, offset 0x6680 - 0x6680: 0x40224620, 0x6681: 0x40224820, 0x6682: 0x40224a20, 0x6683: 0x40224c20, - 0x6684: 0x40224e20, 0x6686: 0x40225020, 0x6687: 0x40225220, - 0x6688: 0x40225420, 0x6689: 0x40225620, 0x668a: 0x40225820, - 0x66a0: 0x40225a20, 0x66a1: 0x40225c20, 0x66a2: 0x40225e20, 0x66a3: 0x40226020, - 0x66a4: 0x40226220, 0x66a5: 0x40226420, 0x66a6: 0x40226620, 0x66a7: 0x40226820, - 0x66a8: 0x40226a20, 0x66a9: 0x40226c20, 0x66aa: 0x40226e20, 0x66ab: 0x40227020, - 0x66ac: 0x40227220, 0x66ad: 0x40227420, 0x66ae: 0x40227620, 0x66af: 0x40227820, - 0x66b0: 0x40227a20, - // Block 0x19b, offset 0x66c0 - 0x66c0: 0x40227c20, 0x66c1: 0x40227e20, 0x66c2: 0x40228020, 0x66c3: 0x40228220, - 0x66c4: 0x40228420, 0x66c5: 0x40228620, 0x66c6: 0x40228820, 0x66c7: 0x40228a20, - 0x66c8: 0x40228c20, 0x66c9: 0x40228e20, 0x66ca: 0x40229020, 0x66cb: 0x40229220, - 0x66cc: 0x40229420, 0x66cd: 0x40229620, 0x66ce: 0x40229820, 0x66cf: 0x40229a20, - 0x66d0: 0x40229c20, 0x66d1: 0x40229e20, 0x66d2: 0x4022a020, 0x66d3: 0x4022a220, - 0x66d4: 0x4022a420, 0x66d5: 0x4022a620, 0x66d6: 0x4022a820, 0x66d7: 0x4022aa20, - 0x66d8: 0x4022ac20, 0x66d9: 0x4022ae20, 0x66da: 0x4022b020, 0x66db: 0x4022b220, - 0x66dc: 0x4022b420, 0x66dd: 0x4022b620, 0x66de: 0x4022b820, 0x66df: 0x4022ba20, - 0x66e0: 0x4022bc20, 0x66e1: 0x4022be20, 0x66e2: 0x4022c020, 0x66e3: 0x4022c220, - 0x66e4: 0x4022c420, 0x66e5: 0x4022c620, 0x66e6: 0x4022c820, 0x66e7: 0x4022ca20, - 0x66e8: 0x4022cc20, 0x66e9: 0x4022ce20, 0x66ea: 0x4022d020, 0x66eb: 0x4022d220, - 0x66ec: 0x4022d420, 0x66ed: 0x4022d620, 0x66ee: 0x4022d820, 0x66ef: 0x4022da20, - 0x66f0: 0x4022dc20, 0x66f1: 0x4022de20, 0x66f2: 0x4022e020, 0x66f3: 0x4022e220, - 0x66f4: 0x4022e420, 0x66f5: 0x4022e620, 0x66f6: 0x4022e820, 0x66f7: 0x4022ea20, - 0x66f8: 0x4022ec20, 0x66f9: 0x4022ee20, 0x66fa: 0x4022f020, 0x66fb: 0x4022f220, - 0x66fc: 0x4022f420, 0x66fd: 0x4022f620, 0x66fe: 0x4022f820, - // Block 0x19c, offset 0x6700 - 0x6700: 0x4022fa20, 0x6702: 0x4022fc20, 0x6703: 0x4022fe20, - 0x6704: 0x40230020, 0x6705: 0x40230220, 0x6706: 0x40230420, 0x6707: 0x40230620, - 0x6708: 0x40230820, 0x6709: 0x40230a20, 0x670a: 0x40230c20, 0x670b: 0x40230e20, - 0x670c: 0x40231020, 0x670d: 0x40231220, 0x670e: 0x40231420, 0x670f: 0x40231620, - 0x6710: 0x40231820, 0x6711: 0x40231a20, 0x6712: 0x40231c20, 0x6713: 0x40231e20, - 0x6714: 0x40232020, 0x6715: 0x40232220, 0x6716: 0x40232420, 0x6717: 0x40232620, - 0x6718: 0x40232820, 0x6719: 0x40232a20, 0x671a: 0x40232c20, 0x671b: 0x40232e20, - 0x671c: 0x40233020, 0x671d: 0x40233220, 0x671e: 0x40233420, 0x671f: 0x40233620, - 0x6720: 0x40233820, 0x6721: 0x40233a20, 0x6722: 0x40233c20, 0x6723: 0x40233e20, - 0x6724: 0x40234020, 0x6725: 0x40234220, 0x6726: 0x40234420, 0x6727: 0x40234620, - 0x6728: 0x40234820, 0x6729: 0x40234a20, 0x672a: 0x40234c20, 0x672b: 0x40234e20, - 0x672c: 0x40235020, 0x672d: 0x40235220, 0x672e: 0x40235420, 0x672f: 0x40235620, - 0x6730: 0x40235820, 0x6731: 0x40235a20, 0x6732: 0x40235c20, 0x6733: 0x40235e20, - 0x6734: 0x40236020, 0x6735: 0x40236220, 0x6736: 0x40236420, 0x6737: 0x40236620, - 0x6738: 0x40236820, 0x6739: 0x40236a20, 0x673a: 0x40236c20, 0x673b: 0x40236e20, - 0x673c: 0x40237020, 0x673d: 0x40237220, 0x673e: 0x40237420, 0x673f: 0x40237620, - // Block 0x19d, offset 0x6740 - 0x6740: 0x40237820, 0x6741: 0x40237a20, 0x6742: 0x40237c20, 0x6743: 0x40237e20, - 0x6744: 0x40238020, 0x6745: 0x40238220, 0x6746: 0x40238420, 0x6747: 0x40238620, - 0x6748: 0x40238820, 0x6749: 0x40238a20, 0x674a: 0x40238c20, 0x674b: 0x40238e20, - 0x674c: 0x40239020, 0x674d: 0x40239220, 0x674e: 0x40239420, 0x674f: 0x40239620, - 0x6750: 0x40239820, 0x6751: 0x40239a20, 0x6752: 0x40239c20, 0x6753: 0x40239e20, - 0x6754: 0x4023a020, 0x6755: 0x4023a220, 0x6756: 0x4023a420, 0x6757: 0x4023a620, - 0x6758: 0x4023a820, 0x6759: 0x4023aa20, 0x675a: 0x4023ac20, 0x675b: 0x4023ae20, - 0x675c: 0x4023b020, 0x675d: 0x4023b220, 0x675e: 0x4023b420, 0x675f: 0x4023b620, - 0x6760: 0x4023b820, 0x6761: 0x4023ba20, 0x6762: 0x4023bc20, 0x6763: 0x4023be20, - 0x6764: 0x4023c020, 0x6765: 0x4023c220, 0x6766: 0x4023c420, 0x6767: 0x4023c620, - 0x6768: 0x4023c820, 0x6769: 0x4023ca20, 0x676a: 0x4023cc20, 0x676b: 0x4023ce20, - 0x676c: 0x4023d020, 0x676d: 0x4023d220, 0x676e: 0x4023d420, 0x676f: 0x4023d620, - 0x6770: 0x4023d820, 0x6771: 0x4023da20, 0x6772: 0x4023dc20, 0x6773: 0x4023de20, - 0x6774: 0x4023e020, 0x6775: 0x4023e220, 0x6776: 0x4023e420, 0x6777: 0x4023e620, - 0x6778: 0x4023e820, 0x6779: 0x4023ea20, 0x677a: 0x4023ec20, 0x677b: 0x4023ee20, - 0x677c: 0x4023f020, 0x677d: 0x4023f220, 0x677e: 0x4023f420, 0x677f: 0x4023f620, - // Block 0x19e, offset 0x6780 - 0x6780: 0x4023f820, 0x6781: 0x4023fa20, 0x6782: 0x4023fc20, 0x6783: 0x4023fe20, - 0x6784: 0x40240020, 0x6785: 0x40240220, 0x6786: 0x40240420, 0x6787: 0x40240620, - 0x6788: 0x40240820, 0x6789: 0x40240a20, 0x678a: 0x40240c20, 0x678b: 0x40240e20, - 0x678c: 0x40241020, 0x678d: 0x40241220, 0x678e: 0x40241420, 0x678f: 0x40241620, - 0x6790: 0x40241820, 0x6791: 0x40241a20, 0x6792: 0x40241c20, 0x6793: 0x40241e20, - 0x6794: 0x40242020, 0x6795: 0x40242220, 0x6796: 0x40242420, 0x6797: 0x40242620, - 0x6798: 0x40242820, 0x6799: 0x40242a20, 0x679a: 0x40242c20, 0x679b: 0x40242e20, - 0x679c: 0x40243020, 0x679d: 0x40243220, 0x679e: 0x40243420, 0x679f: 0x40243620, - 0x67a0: 0x40243820, 0x67a1: 0x40243a20, 0x67a2: 0x40243c20, 0x67a3: 0x40243e20, - 0x67a4: 0x40244020, 0x67a5: 0x40244220, 0x67a6: 0x40244420, 0x67a7: 0x40244620, - 0x67a8: 0x40244820, 0x67a9: 0x40244a20, 0x67aa: 0x40244c20, 0x67ab: 0x40244e20, - 0x67ac: 0x40245020, 0x67ad: 0x40245220, 0x67ae: 0x40245420, 0x67af: 0x40245620, - 0x67b0: 0x40245820, 0x67b1: 0x40245a20, 0x67b2: 0x40245c20, 0x67b3: 0x40245e20, - 0x67b4: 0x40246020, 0x67b5: 0x40246220, 0x67b6: 0x40246420, 0x67b7: 0x40246620, - 0x67b9: 0x40246820, 0x67ba: 0x40246a20, 0x67bb: 0x40246c20, - 0x67bc: 0x40246e20, - // Block 0x19f, offset 0x67c0 - 0x67c0: 0x40247020, 0x67c1: 0x40247220, 0x67c2: 0x40247420, 0x67c3: 0x40247620, - 0x67c4: 0x40247820, 0x67c5: 0x40247a20, 0x67c6: 0x40247c20, 0x67c7: 0x40247e20, - 0x67c8: 0x40248020, 0x67c9: 0x40248220, 0x67ca: 0x40248420, 0x67cb: 0x40248620, - 0x67cc: 0x40248820, 0x67cd: 0x40248a20, 0x67ce: 0x40248c20, 0x67cf: 0x40248e20, - 0x67d0: 0x40249020, 0x67d1: 0x40249220, 0x67d2: 0x40249420, 0x67d3: 0x40249620, - 0x67d4: 0x40249820, 0x67d5: 0x40249a20, 0x67d6: 0x40249c20, 0x67d7: 0x40249e20, - 0x67d8: 0x4024a020, 0x67d9: 0x4024a220, 0x67da: 0x4024a420, 0x67db: 0x4024a620, - 0x67dc: 0x4024a820, 0x67dd: 0x4024aa20, 0x67de: 0x4024ac20, 0x67df: 0x4024ae20, - 0x67e0: 0x4024b020, 0x67e1: 0x4024b220, 0x67e2: 0x4024b420, 0x67e3: 0x4024b620, - 0x67e4: 0x4024b820, 0x67e5: 0x4024ba20, 0x67e6: 0x4024bc20, 0x67e7: 0x4024be20, - 0x67e8: 0x4024c020, 0x67e9: 0x4024c220, 0x67ea: 0x4024c420, 0x67eb: 0x4024c620, - 0x67ec: 0x4024c820, 0x67ed: 0x4024ca20, 0x67ee: 0x4024cc20, 0x67ef: 0x4024ce20, - 0x67f0: 0x4024d020, 0x67f1: 0x4024d220, 0x67f2: 0x4024d420, 0x67f3: 0x4024d620, - 0x67f4: 0x4024d820, 0x67f5: 0x4024da20, 0x67f6: 0x4024dc20, 0x67f7: 0x4024de20, - 0x67f8: 0x4024e020, 0x67f9: 0x4024e220, 0x67fa: 0x4024e420, 0x67fb: 0x4024e620, - 0x67fc: 0x4024e820, 0x67fd: 0x4024ea20, - // Block 0x1a0, offset 0x6800 - 0x6800: 0x4024ec20, 0x6801: 0x4024ee20, 0x6802: 0x4024f020, 0x6803: 0x4024f220, - 0x6810: 0x4024f420, 0x6811: 0x4024f620, 0x6812: 0x4024f820, 0x6813: 0x4024fa20, - 0x6814: 0x4024fc20, 0x6815: 0x4024fe20, 0x6816: 0x40250020, 0x6817: 0x40250220, - 0x6818: 0x40250420, 0x6819: 0x40250620, 0x681a: 0x40250820, 0x681b: 0x40250a20, - 0x681c: 0x40250c20, 0x681d: 0x40250e20, 0x681e: 0x40251020, 0x681f: 0x40251220, - 0x6820: 0x40251420, 0x6821: 0x40251620, 0x6822: 0x40251820, 0x6823: 0x40251a20, - 0x6824: 0x40251c20, 0x6825: 0x40251e20, 0x6826: 0x40252020, 0x6827: 0x40252220, - // Block 0x1a1, offset 0x6840 - 0x687b: 0x40252420, - 0x687c: 0x40252620, 0x687d: 0x40252820, 0x687e: 0x40252a20, 0x687f: 0x40252c20, - // Block 0x1a2, offset 0x6880 - 0x6880: 0x40252e20, 0x6881: 0x40253020, 0x6882: 0x40253220, 0x6883: 0x40253420, - 0x6884: 0x40253620, 0x6885: 0x40253820, 0x6886: 0x40253a20, 0x6887: 0x40253c20, - 0x6888: 0x40253e20, 0x6889: 0x40254020, 0x688a: 0x40254220, 0x688b: 0x40254420, - 0x688c: 0x40254620, 0x688d: 0x40254820, 0x688e: 0x40254a20, 0x688f: 0x40254c20, - 0x6890: 0x40254e20, 0x6891: 0x40255020, 0x6892: 0x40255220, 0x6893: 0x40255420, - 0x6894: 0x40255620, 0x6895: 0x40255820, 0x6896: 0x40255a20, 0x6897: 0x40255c20, - 0x6898: 0x40255e20, 0x6899: 0x40256020, 0x689a: 0x40256220, 0x689b: 0x40256420, - 0x689c: 0x40256620, 0x689d: 0x40256820, 0x689e: 0x40256a20, 0x689f: 0x40256c20, - 0x68a0: 0x40256e20, 0x68a1: 0x40257020, 0x68a2: 0x40257220, 0x68a3: 0x40257420, - 0x68a4: 0x40257620, 0x68a5: 0x40257820, 0x68a6: 0x40257a20, 0x68a7: 0x40257c20, - 0x68a8: 0x40257e20, 0x68a9: 0x40258020, 0x68aa: 0x40258220, 0x68ab: 0x40258420, - 0x68ac: 0x40258620, 0x68ad: 0x40258820, 0x68ae: 0x40258a20, 0x68af: 0x40258c20, - 0x68b0: 0x40258e20, 0x68b1: 0x40259020, 0x68b2: 0x40259220, 0x68b3: 0x40259420, - 0x68b4: 0x40259620, 0x68b5: 0x40259820, 0x68b6: 0x40259a20, 0x68b7: 0x40259c20, - 0x68b8: 0x40259e20, 0x68b9: 0x4025a020, 0x68ba: 0x4025a220, 0x68bb: 0x4025a420, - 0x68bc: 0x4025a620, 0x68bd: 0x4025a820, 0x68be: 0x4025aa20, 0x68bf: 0x4025ac20, - // Block 0x1a3, offset 0x68c0 - 0x68c0: 0x4025ae20, - 0x68c5: 0x4025b020, 0x68c6: 0x4025b220, 0x68c7: 0x4025b420, - 0x68c8: 0x4025b620, 0x68c9: 0x4025b820, 0x68ca: 0x4025ba20, 0x68cb: 0x4025bc20, - 0x68cc: 0x4025be20, 0x68cd: 0x4025c020, 0x68ce: 0x4025c220, 0x68cf: 0x4025c420, - // Block 0x1a4, offset 0x6900 - 0x6900: 0x4025c620, 0x6901: 0x4025c820, 0x6902: 0x4025ca20, 0x6903: 0x4025cc20, - 0x6904: 0x4025ce20, 0x6905: 0x4025d020, 0x6906: 0x4025d220, 0x6907: 0x4025d420, - 0x6908: 0x4025d620, 0x6909: 0x4025d820, 0x690a: 0x4025da20, 0x690b: 0x4025dc20, - 0x690c: 0x4025de20, 0x690d: 0x4025e020, 0x690e: 0x4025e220, 0x690f: 0x4025e420, - 0x6910: 0x4025e620, 0x6911: 0x4025e820, 0x6912: 0x4025ea20, 0x6913: 0x4025ec20, - 0x6914: 0x4025ee20, 0x6915: 0x4025f020, 0x6916: 0x4025f220, 0x6917: 0x4025f420, - 0x6918: 0x4025f620, 0x6919: 0x4025f820, 0x691a: 0x4025fa20, 0x691b: 0x4025fc20, - 0x691c: 0x4025fe20, 0x691d: 0x40260020, 0x691e: 0x40260220, 0x691f: 0x40260420, - 0x6920: 0x40260620, 0x6921: 0x40260820, 0x6922: 0x40260a20, 0x6923: 0x40260c20, - 0x6924: 0x40260e20, 0x6925: 0x40261020, 0x6926: 0x40261220, 0x6927: 0x40261420, - 0x6928: 0x40261620, 0x6929: 0x40261820, 0x692a: 0x40261a20, 0x692b: 0x40261c20, - 0x692c: 0x40261e20, 0x692d: 0x40262020, 0x692e: 0x40262220, 0x692f: 0x40262420, - 0x6930: 0x40262620, 0x6931: 0x40262820, 0x6932: 0x40262a20, 0x6933: 0x40262c20, - 0x6934: 0x40262e20, 0x6935: 0x40263020, 0x6936: 0x40263220, 0x6937: 0x40263420, - 0x6938: 0x40263620, 0x6939: 0x40263820, 0x693a: 0x40263a20, 0x693b: 0x40263c20, - 0x693c: 0x40263e20, 0x693d: 0x40264020, 0x693e: 0x40264220, 0x693f: 0x40264420, - // Block 0x1a5, offset 0x6940 - 0x6940: 0x40264620, 0x6941: 0x40264820, 0x6942: 0x40264a20, 0x6943: 0x40264c20, - 0x6944: 0x40264e20, 0x6945: 0x40265020, - // Block 0x1a6, offset 0x6980 - 0x6980: 0x40265220, 0x6981: 0x40265420, 0x6982: 0x40265620, 0x6983: 0x40265820, - 0x6984: 0x40265a20, 0x6985: 0x40265c20, 0x6986: 0x40265e20, 0x6987: 0x40266020, - 0x6988: 0x40266220, 0x6989: 0x40266420, 0x698a: 0x40266620, 0x698b: 0x40266820, - 0x698c: 0x40266a20, 0x698d: 0x40266c20, 0x698e: 0x40266e20, 0x698f: 0x40267020, - 0x6990: 0x40267220, 0x6991: 0x40267420, 0x6992: 0x40267620, 0x6993: 0x40267820, - 0x6994: 0x40267a20, 0x6995: 0x40267c20, 0x6996: 0x40267e20, 0x6997: 0x40268020, - 0x6998: 0x40268220, 0x6999: 0x40268420, 0x699a: 0x40268620, 0x699b: 0x40268820, - 0x699c: 0x40268a20, 0x699d: 0x40268c20, 0x699e: 0x40268e20, 0x699f: 0x40269020, - 0x69a0: 0x40269220, 0x69a1: 0x40269420, 0x69a2: 0x40269620, 0x69a3: 0x40269820, - 0x69a4: 0x40269a20, 0x69a5: 0x40269c20, 0x69a6: 0x40269e20, 0x69a7: 0x4026a020, - 0x69a8: 0x4026a220, 0x69a9: 0x4026a420, 0x69aa: 0x4026a620, 0x69ab: 0x4026a820, - 0x69ac: 0x4026aa20, 0x69ad: 0x4026ac20, 0x69ae: 0x4026ae20, 0x69af: 0x4026b020, - 0x69b0: 0x4026b220, 0x69b1: 0x4026b420, 0x69b2: 0x4026b620, 0x69b3: 0x4026b820, - 0x69b4: 0x4026ba20, 0x69b5: 0x4026bc20, 0x69b6: 0x4026be20, 0x69b7: 0x4026c020, - 0x69b8: 0x4026c220, 0x69b9: 0x4026c420, 0x69ba: 0x4026c620, 0x69bb: 0x4026c820, - 0x69bc: 0x4026ca20, 0x69bd: 0x4026cc20, 0x69be: 0x4026ce20, 0x69bf: 0x4026d020, - // Block 0x1a7, offset 0x69c0 - 0x69c0: 0x4026d220, 0x69c1: 0x4026d420, 0x69c2: 0x4026d620, 0x69c3: 0x4026d820, - 0x69c4: 0x4026da20, 0x69c5: 0x4026dc20, 0x69c6: 0x4026de20, 0x69c7: 0x4026e020, - 0x69c8: 0x4026e220, 0x69c9: 0x4026e420, 0x69ca: 0x4026e620, 0x69cb: 0x4026e820, - 0x69cc: 0x4026ea20, 0x69cd: 0x4026ec20, 0x69ce: 0x4026ee20, 0x69cf: 0x4026f020, - 0x69d0: 0x4026f220, 0x69d1: 0x4026f420, 0x69d2: 0x4026f620, 0x69d3: 0x4026f820, - 0x69d4: 0x4026fa20, 0x69d5: 0x4026fc20, 0x69d6: 0x4026fe20, 0x69d7: 0x40270020, - 0x69d8: 0x40270220, 0x69d9: 0x40270420, 0x69da: 0x40270620, 0x69db: 0x40270820, - 0x69dc: 0x40270a20, 0x69dd: 0x40270c20, 0x69de: 0x40270e20, 0x69df: 0x40271020, - 0x69e0: 0x40271220, 0x69e1: 0x40271420, 0x69e2: 0x40271620, 0x69e3: 0x40271820, - 0x69e4: 0x40271a20, 0x69e5: 0x40271c20, 0x69e6: 0x40271e20, 0x69e7: 0x40272020, - 0x69e8: 0x40272220, 0x69e9: 0x40272420, 0x69ea: 0x40272620, 0x69eb: 0x40272820, - 0x69ec: 0x40272a20, 0x69ed: 0x40272c20, 0x69ee: 0x40272e20, 0x69ef: 0x40273020, - 0x69f0: 0x40273220, 0x69f1: 0x40273420, 0x69f2: 0x40273620, 0x69f3: 0x40273820, - // Block 0x1a8, offset 0x6a00 - 0x6a00: 0x429c7a20, 0x6a01: 0x429c7020, 0x6a02: 0x429c8220, 0x6a03: 0x48024420, - 0x6a04: 0x429ec020, 0x6a05: 0x429f5c20, 0x6a06: 0x429f7620, 0x6a07: 0x42a00420, - 0x6a08: 0x42a0f420, 0x6a09: 0x42a13220, 0x6a0a: 0x42a1ce20, 0x6a0b: 0x42a19e20, - 0x6a0c: 0x44693c20, 0x6a0d: 0x480c7420, 0x6a0e: 0x42a29a20, 0x6a0f: 0x42a2a820, - 0x6a10: 0x42a2c820, 0x6a11: 0x42a2ee20, 0x6a12: 0x480a3820, 0x6a13: 0x44697220, - 0x6a14: 0x42a2ce20, 0x6a15: 0x42a31a20, 0x6a16: 0x480a9620, 0x6a17: 0x42a32e20, - 0x6a18: 0x42a34820, 0x6a19: 0x429d9820, 0x6a1a: 0x42a35820, 0x6a1b: 0x42a36a20, - 0x6a1c: 0x4923be20, 0x6a1d: 0x42a3ea20, 0x6a1e: 0x42a40620, 0x6a1f: 0x4469be20, - 0x6a20: 0x42a47620, 0x6a21: 0x42a48c20, 0x6a22: 0x42a4e420, 0x6a23: 0x42a4ee20, - 0x6a24: 0x446a2a20, 0x6a25: 0x42a58e20, 0x6a26: 0x42a59220, 0x6a27: 0x42a5c820, - 0x6a28: 0x42a5f420, 0x6a29: 0x42a60a20, 0x6a2a: 0x42a60c20, 0x6a2b: 0x42a62e20, - 0x6a2c: 0x42a69220, 0x6a2d: 0x42a6a220, 0x6a2e: 0x42a6b420, 0x6a2f: 0x42a6e620, - 0x6a30: 0x42a6fa20, 0x6a31: 0x42a6fe20, 0x6a32: 0x42a6fe20, 0x6a33: 0x42a6fe20, - 0x6a34: 0x48145820, 0x6a35: 0x42e0e020, 0x6a36: 0x42a79420, 0x6a37: 0x42a7be20, - 0x6a38: 0x4816c620, 0x6a39: 0x42a7d620, 0x6a3a: 0x42a7e220, 0x6a3b: 0x42a80c20, - 0x6a3c: 0x42a93c20, 0x6a3d: 0x42a87020, 0x6a3e: 0x42a89020, 0x6a3f: 0x42a8d020, - // Block 0x1a9, offset 0x6a40 - 0x6a40: 0x42a94420, 0x6a41: 0x42a9ec20, 0x6a42: 0x42aa2020, 0x6a43: 0x42aaa620, - 0x6a44: 0x42aac620, 0x6a45: 0x42ab0820, 0x6a46: 0x42ab0820, 0x6a47: 0x42ab3220, - 0x6a48: 0x42ab5620, 0x6a49: 0x42ab6620, 0x6a4a: 0x42ab8420, 0x6a4b: 0x42ae2c20, - 0x6a4c: 0x42ac0c20, 0x6a4d: 0x42ae2e20, 0x6a4e: 0x42aca220, 0x6a4f: 0x42ace820, - 0x6a50: 0x42a40e20, 0x6a51: 0x42b1dc20, 0x6a52: 0x42af9c20, 0x6a53: 0x42afe820, - 0x6a54: 0x42b01a20, 0x6a55: 0x42af1620, 0x6a56: 0x42b06420, 0x6a57: 0x42b06220, - 0x6a58: 0x42b15820, 0x6a59: 0x4829c820, 0x6a5a: 0x42b1e420, 0x6a5b: 0x42b1ee20, - 0x6a5c: 0x42b20c20, 0x6a5d: 0x42b23420, 0x6a5e: 0x42b24420, 0x6a5f: 0x42b2c420, - 0x6a60: 0x482d5020, 0x6a61: 0x482dd420, 0x6a62: 0x42b3d820, 0x6a63: 0x42b43620, - 0x6a64: 0x42b44e20, 0x6a65: 0x42b3b020, 0x6a66: 0x42b4cc20, 0x6a67: 0x446ddc20, - 0x6a68: 0x446df820, 0x6a69: 0x42b61020, 0x6a6a: 0x42b67c20, 0x6a6b: 0x42b67c20, - 0x6a6c: 0x48339020, 0x6a6d: 0x42b78620, 0x6a6e: 0x42b7b020, 0x6a6f: 0x42b7ce20, - 0x6a70: 0x42b7e620, 0x6a71: 0x48363020, 0x6a72: 0x42b7fe20, 0x6a73: 0x42b80c20, - 0x6a74: 0x42bea620, 0x6a75: 0x42b84420, 0x6a76: 0x446f0220, 0x6a77: 0x42b8c020, - 0x6a78: 0x42b8dc20, 0x6a79: 0x42b98020, 0x6a7a: 0x42b91a20, 0x6a7b: 0x483bc820, - 0x6a7c: 0x42ba8620, 0x6a7d: 0x483bcc20, 0x6a7e: 0x42badc20, 0x6a7f: 0x42bad620, - // Block 0x1aa, offset 0x6a80 - 0x6a80: 0x42baf820, 0x6a81: 0x42bbc220, 0x6a82: 0x42bbc420, 0x6a83: 0x44705e20, - 0x6a84: 0x42bbfa20, 0x6a85: 0x42bc5020, 0x6a86: 0x42bc7a20, 0x6a87: 0x42bcd220, - 0x6a88: 0x4470c420, 0x6a89: 0x48430620, 0x6a8a: 0x4470f820, 0x6a8b: 0x42bd6020, - 0x6a8c: 0x42bd6620, 0x6a8d: 0x42bd6c20, 0x6a8e: 0x42bd9420, 0x6a8f: 0x49472420, - 0x6a90: 0x42bdfc20, 0x6a91: 0x48466220, 0x6a92: 0x48466220, 0x6a93: 0x43040220, - 0x6a94: 0x42be4420, 0x6a95: 0x42be4420, 0x6a96: 0x44718e20, 0x6a97: 0x48657020, - 0x6a98: 0x48c3b420, 0x6a99: 0x42bec420, 0x6a9a: 0x42bed620, 0x6a9b: 0x4471c620, - 0x6a9c: 0x42bf3420, 0x6a9d: 0x42bf9a20, 0x6a9e: 0x42bfae20, 0x6a9f: 0x42bff220, - 0x6aa0: 0x42c10220, 0x6aa1: 0x44727420, 0x6aa2: 0x44723820, 0x6aa3: 0x42c12820, - 0x6aa4: 0x484da820, 0x6aa5: 0x42c18e20, 0x6aa6: 0x42c29020, 0x6aa7: 0x42c29820, - 0x6aa8: 0x42c29c20, 0x6aa9: 0x42c29820, 0x6aaa: 0x42c2f420, 0x6aab: 0x42c31c20, - 0x6aac: 0x42c36420, 0x6aad: 0x42c34820, 0x6aae: 0x42c35e20, 0x6aaf: 0x42c3bc20, - 0x6ab0: 0x42c3e420, 0x6ab1: 0x42c3ec20, 0x6ab2: 0x42c42020, 0x6ab3: 0x42c43620, - 0x6ab4: 0x42c4ba20, 0x6ab5: 0x42c56220, 0x6ab6: 0x42c5a820, 0x6ab7: 0x42c6a020, - 0x6ab8: 0x48561820, 0x6ab9: 0x42c67a20, 0x6aba: 0x42c5f820, 0x6abb: 0x42c6d020, - 0x6abc: 0x42c70620, 0x6abd: 0x42c7c820, 0x6abe: 0x4857e220, 0x6abf: 0x42c84420, - // Block 0x1ab, offset 0x6ac0 - 0x6ac0: 0x42c78a20, 0x6ac1: 0x42c75220, 0x6ac2: 0x44745c20, 0x6ac3: 0x42c8d220, - 0x6ac4: 0x42c8fc20, 0x6ac5: 0x42c93a20, 0x6ac6: 0x42c8ee20, 0x6ac7: 0x4474d820, - 0x6ac8: 0x42ca9e20, 0x6ac9: 0x42cad820, 0x6aca: 0x48601420, 0x6acb: 0x42cbc620, - 0x6acc: 0x42cdf020, 0x6acd: 0x42cc9220, 0x6ace: 0x44763220, 0x6acf: 0x42cd2220, - 0x6ad0: 0x44761020, 0x6ad1: 0x4475c820, 0x6ad2: 0x42a32420, 0x6ad3: 0x42a32a20, - 0x6ad4: 0x42ce0020, 0x6ad5: 0x42cd3820, 0x6ad6: 0x43015a20, 0x6ad7: 0x4487b220, - 0x6ad8: 0x42ce2e20, 0x6ad9: 0x42ce3620, 0x6ada: 0x42ce4220, 0x6adb: 0x42cebc20, - 0x6adc: 0x42cea620, 0x6add: 0x48678620, 0x6ade: 0x44769220, 0x6adf: 0x42cff420, - 0x6ae0: 0x42cf0a20, 0x6ae1: 0x42d0a420, 0x6ae2: 0x42d10a20, 0x6ae3: 0x4868da20, - 0x6ae4: 0x42d11c20, 0x6ae5: 0x42d03e20, 0x6ae6: 0x42d22820, 0x6ae7: 0x44773a20, - 0x6ae8: 0x42d28420, 0x6ae9: 0x42d34620, 0x6aea: 0x42d3d420, 0x6aeb: 0x42d55020, - 0x6aec: 0x486d4620, 0x6aed: 0x42d5b620, 0x6aee: 0x44783020, 0x6aef: 0x42d64220, - 0x6af0: 0x48714e20, 0x6af1: 0x42d6a820, 0x6af2: 0x44789c20, 0x6af3: 0x42d6e420, - 0x6af4: 0x42d73e20, 0x6af5: 0x42d77420, 0x6af6: 0x42d77620, 0x6af7: 0x48751a20, - 0x6af8: 0x483a1620, 0x6af9: 0x4875f420, 0x6afa: 0x42d89c20, 0x6afb: 0x48797820, - 0x6afc: 0x42d97e20, 0x6afd: 0x42d99a20, 0x6afe: 0x42d8ce20, 0x6aff: 0x42da2c20, - // Block 0x1ac, offset 0x6b00 - 0x6b00: 0x42da7c20, 0x6b01: 0x42daee20, 0x6b02: 0x42da8220, 0x6b03: 0x42dad220, - 0x6b04: 0x42daf020, 0x6b05: 0x42db0a20, 0x6b06: 0x487a3c20, 0x6b07: 0x42da6820, - 0x6b08: 0x42dc5e20, 0x6b09: 0x42dcdc20, 0x6b0a: 0x447a6620, 0x6b0b: 0x42dd9620, - 0x6b0c: 0x42dd8e20, 0x6b0d: 0x487da220, 0x6b0e: 0x42dbf220, 0x6b0f: 0x42dedc20, - 0x6b10: 0x487ebc20, 0x6b11: 0x487f1c20, 0x6b12: 0x42df8c20, 0x6b13: 0x42e07220, - 0x6b14: 0x42e03c20, 0x6b15: 0x42e03620, 0x6b16: 0x447b2c20, 0x6b17: 0x42e09420, - 0x6b18: 0x42e0fa20, 0x6b19: 0x42e0ee20, 0x6b1a: 0x42e15a20, 0x6b1b: 0x480a4a20, - 0x6b1c: 0x42e28a20, 0x6b1d: 0x4884c620, 0x6b1e: 0x42e33820, 0x6b1f: 0x48875620, - 0x6b20: 0x42e45020, 0x6b21: 0x42e46a20, 0x6b22: 0x42e4a020, 0x6b23: 0x488c1020, - 0x6b24: 0x42e50020, 0x6b25: 0x42e52a20, 0x6b26: 0x488e6a20, 0x6b27: 0x48902820, - 0x6b28: 0x42e6f420, 0x6b29: 0x42e71620, 0x6b2a: 0x447d5820, 0x6b2b: 0x42e74a20, - 0x6b2c: 0x447d7020, 0x6b2d: 0x447d7020, 0x6b2e: 0x42e88e20, 0x6b2f: 0x42e8b820, - 0x6b30: 0x42e8e220, 0x6b31: 0x42e90a20, 0x6b32: 0x42e99420, 0x6b33: 0x447e3620, - 0x6b34: 0x42ea4820, 0x6b35: 0x48986c20, 0x6b36: 0x42ea7c20, 0x6b37: 0x48992420, - 0x6b38: 0x42eae020, 0x6b39: 0x48433e20, 0x6b3a: 0x42ec2020, 0x6b3b: 0x489f4220, - 0x6b3c: 0x489f7020, 0x6b3d: 0x48a08820, 0x6b3e: 0x447ff820, 0x6b3f: 0x44801020, - // Block 0x1ad, offset 0x6b40 - 0x6b40: 0x42ede820, 0x6b41: 0x48a1e620, 0x6b42: 0x48a1e420, 0x6b43: 0x48a23220, - 0x6b44: 0x48a26620, 0x6b45: 0x42ee3c20, 0x6b46: 0x42ee3e20, 0x6b47: 0x42ee3e20, - 0x6b48: 0x42ee9420, 0x6b49: 0x44807220, 0x6b4a: 0x42ef1620, 0x6b4b: 0x44808c20, - 0x6b4c: 0x44812c20, 0x6b4d: 0x48a83a20, 0x6b4e: 0x42f09c20, 0x6b4f: 0x42f11820, - 0x6b50: 0x42f19820, 0x6b51: 0x4481c620, 0x6b52: 0x48ac4c20, 0x6b53: 0x42f2ac20, - 0x6b54: 0x48ad3420, 0x6b55: 0x48ad8a20, 0x6b56: 0x42f31e20, 0x6b57: 0x42f3d620, - 0x6b58: 0x44825e20, 0x6b59: 0x42f48020, 0x6b5a: 0x42f49420, 0x6b5b: 0x42f49e20, - 0x6b5c: 0x48b2f820, 0x6b5d: 0x48b54e20, 0x6b5e: 0x48b54e20, 0x6b5f: 0x42f5dc20, - 0x6b60: 0x44840420, 0x6b61: 0x48b75620, 0x6b62: 0x42f78c20, 0x6b63: 0x42f79220, - 0x6b64: 0x44844e20, 0x6b65: 0x48b90020, 0x6b66: 0x42f9a420, 0x6b67: 0x44854020, - 0x6b68: 0x42f9d020, 0x6b69: 0x42f9c620, 0x6b6a: 0x42fa0020, 0x6b6b: 0x48bf0c20, - 0x6b6c: 0x42fac620, 0x6b6d: 0x44860220, 0x6b6e: 0x42fb8e20, 0x6b6f: 0x42fc0420, - 0x6b70: 0x42fc8a20, 0x6b71: 0x44866820, 0x6b72: 0x48c45020, 0x6b73: 0x48c48e20, - 0x6b74: 0x4486b220, 0x6b75: 0x48c5b220, 0x6b76: 0x42fef420, 0x6b77: 0x48c67c20, - 0x6b78: 0x42ff2a20, 0x6b79: 0x42fff420, 0x6b7a: 0x43000a20, 0x6b7b: 0x48c9b420, - 0x6b7c: 0x48ca4620, 0x6b7d: 0x4300c020, 0x6b7e: 0x48cb5020, 0x6b7f: 0x4300e020, - // Block 0x1ae, offset 0x6b80 - 0x6b80: 0x4866be20, 0x6b81: 0x4487aa20, 0x6b82: 0x43016420, 0x6b83: 0x43020620, - 0x6b84: 0x44881620, 0x6b85: 0x43027c20, 0x6b86: 0x42b56a20, 0x6b87: 0x48cf4e20, - 0x6b88: 0x48cf6a20, 0x6b89: 0x48672620, 0x6b8a: 0x48673820, 0x6b8b: 0x43040220, - 0x6b8c: 0x43040820, 0x6b8d: 0x431f3c20, 0x6b8e: 0x4488d620, 0x6b8f: 0x43052220, - 0x6b90: 0x43051620, 0x6b91: 0x43053a20, 0x6b92: 0x42a56620, 0x6b93: 0x43056220, - 0x6b94: 0x43056620, 0x6b95: 0x43057a20, 0x6b96: 0x4305cc20, 0x6b97: 0x48d67820, - 0x6b98: 0x4305ca20, 0x6b99: 0x43063a20, 0x6b9a: 0x4306c620, 0x6b9b: 0x43075a20, - 0x6b9c: 0x43064620, 0x6b9d: 0x43077a20, 0x6b9e: 0x4307ce20, 0x6b9f: 0x4308ae20, - 0x6ba0: 0x4306a620, 0x6ba1: 0x43079420, 0x6ba2: 0x43079820, 0x6ba3: 0x4307b820, - 0x6ba4: 0x48d86c20, 0x6ba5: 0x48dad620, 0x6ba6: 0x48d9aa20, 0x6ba7: 0x448a5620, - 0x6ba8: 0x4309e220, 0x6ba9: 0x4309e620, 0x6baa: 0x430a2c20, 0x6bab: 0x48e79420, - 0x6bac: 0x430ac820, 0x6bad: 0x48de5820, 0x6bae: 0x448aba20, 0x6baf: 0x448ac220, - 0x6bb0: 0x48df6220, 0x6bb1: 0x48e1a420, 0x6bb2: 0x448ad620, 0x6bb3: 0x430ca020, - 0x6bb4: 0x430cb820, 0x6bb5: 0x430cce20, 0x6bb6: 0x430cd220, 0x6bb7: 0x430d5220, - 0x6bb8: 0x430d1020, 0x6bb9: 0x430e1c20, 0x6bba: 0x430dc420, 0x6bbb: 0x430ef220, - 0x6bbc: 0x430e5020, 0x6bbd: 0x430ed620, 0x6bbe: 0x430f0c20, 0x6bbf: 0x448bae20, - // Block 0x1af, offset 0x6bc0 - 0x6bc0: 0x430fc220, 0x6bc1: 0x43100220, 0x6bc2: 0x448bf220, 0x6bc3: 0x4310c020, - 0x6bc4: 0x4310c620, 0x6bc5: 0x48ecce20, 0x6bc6: 0x4311ae20, 0x6bc7: 0x4311bc20, - 0x6bc8: 0x448c6a20, 0x6bc9: 0x4311f420, 0x6bca: 0x44697620, 0x6bcb: 0x48f15c20, - 0x6bcc: 0x48f2cc20, 0x6bcd: 0x448d7c20, 0x6bce: 0x448d8e20, 0x6bcf: 0x43154020, - 0x6bd0: 0x4315da20, 0x6bd1: 0x43171420, 0x6bd2: 0x4318aa20, 0x6bd3: 0x48f95020, - 0x6bd4: 0x43195620, 0x6bd5: 0x43198220, 0x6bd6: 0x431a3620, 0x6bd7: 0x431aee20, - 0x6bd8: 0x48fe5e20, 0x6bd9: 0x48100820, 0x6bda: 0x431b9620, 0x6bdb: 0x431b7820, - 0x6bdc: 0x431be020, 0x6bdd: 0x4811bc20, 0x6bde: 0x431da820, 0x6bdf: 0x431e7020, - 0x6be0: 0x490ba420, 0x6be1: 0x490bda20, 0x6be2: 0x43212820, 0x6be3: 0x4321e220, - 0x6be4: 0x43222220, 0x6be5: 0x490e5c20, 0x6be6: 0x43223620, 0x6be7: 0x43247020, - 0x6be8: 0x4325ae20, 0x6be9: 0x4325b020, 0x6bea: 0x4324f820, 0x6beb: 0x4327f220, - 0x6bec: 0x43282a20, 0x6bed: 0x4917f420, 0x6bee: 0x432b1620, 0x6bef: 0x44932a20, - 0x6bf0: 0x432b6e20, 0x6bf1: 0x491aee20, 0x6bf2: 0x4493cc20, 0x6bf3: 0x432d8620, - 0x6bf4: 0x42bb6420, 0x6bf5: 0x432e4620, 0x6bf6: 0x49228a20, 0x6bf7: 0x49243420, - 0x6bf8: 0x4494dc20, 0x6bf9: 0x4494ec20, 0x6bfa: 0x432fc020, 0x6bfb: 0x49281420, - 0x6bfc: 0x44956420, 0x6bfd: 0x49292c20, 0x6bfe: 0x43301620, 0x6bff: 0x43301620, - // Block 0x1b0, offset 0x6c00 - 0x6c00: 0x43305220, 0x6c01: 0x492b6c20, 0x6c02: 0x4331c420, 0x6c03: 0x44966620, - 0x6c04: 0x43325220, 0x6c05: 0x43334e20, 0x6c06: 0x43338420, 0x6c07: 0x4333fc20, - 0x6c08: 0x44979c20, 0x6c09: 0x49366020, 0x6c0a: 0x43362420, 0x6c0b: 0x43388020, - 0x6c0c: 0x4339fa20, 0x6c0d: 0x44999c20, 0x6c0e: 0x4499da20, 0x6c0f: 0x433ace20, - 0x6c10: 0x49419c20, 0x6c11: 0x4499f020, 0x6c12: 0x49420a20, 0x6c13: 0x49441c20, - 0x6c14: 0x49452220, 0x6c15: 0x433d7620, 0x6c16: 0x449aac20, 0x6c17: 0x433df220, - 0x6c18: 0x433dfc20, 0x6c19: 0x433e0a20, 0x6c1a: 0x433e1e20, 0x6c1b: 0x433e2c20, - 0x6c1c: 0x433e7620, 0x6c1d: 0x494c0020, - // Block 0x1b1, offset 0x6c40 - 0x6c41: 0xa0000000, - 0x6c60: 0xa0000000, 0x6c61: 0xa0000000, 0x6c62: 0xa0000000, 0x6c63: 0xa0000000, - 0x6c64: 0xa0000000, 0x6c65: 0xa0000000, 0x6c66: 0xa0000000, 0x6c67: 0xa0000000, - 0x6c68: 0xa0000000, 0x6c69: 0xa0000000, 0x6c6a: 0xa0000000, 0x6c6b: 0xa0000000, - 0x6c6c: 0xa0000000, 0x6c6d: 0xa0000000, 0x6c6e: 0xa0000000, 0x6c6f: 0xa0000000, - 0x6c70: 0xa0000000, 0x6c71: 0xa0000000, 0x6c72: 0xa0000000, 0x6c73: 0xa0000000, - 0x6c74: 0xa0000000, 0x6c75: 0xa0000000, 0x6c76: 0xa0000000, 0x6c77: 0xa0000000, - 0x6c78: 0xa0000000, 0x6c79: 0xa0000000, 0x6c7a: 0xa0000000, 0x6c7b: 0xa0000000, - 0x6c7c: 0xa0000000, 0x6c7d: 0xa0000000, 0x6c7e: 0xa0000000, 0x6c7f: 0xa0000000, - // Block 0x1b2, offset 0x6c80 - 0x6c80: 0xa0000000, 0x6c81: 0xa0000000, 0x6c82: 0xa0000000, 0x6c83: 0xa0000000, - 0x6c84: 0xa0000000, 0x6c85: 0xa0000000, 0x6c86: 0xa0000000, 0x6c87: 0xa0000000, - 0x6c88: 0xa0000000, 0x6c89: 0xa0000000, 0x6c8a: 0xa0000000, 0x6c8b: 0xa0000000, - 0x6c8c: 0xa0000000, 0x6c8d: 0xa0000000, 0x6c8e: 0xa0000000, 0x6c8f: 0xa0000000, - 0x6c90: 0xa0000000, 0x6c91: 0xa0000000, 0x6c92: 0xa0000000, 0x6c93: 0xa0000000, - 0x6c94: 0xa0000000, 0x6c95: 0xa0000000, 0x6c96: 0xa0000000, 0x6c97: 0xa0000000, - 0x6c98: 0xa0000000, 0x6c99: 0xa0000000, 0x6c9a: 0xa0000000, 0x6c9b: 0xa0000000, - 0x6c9c: 0xa0000000, 0x6c9d: 0xa0000000, 0x6c9e: 0xa0000000, 0x6c9f: 0xa0000000, - 0x6ca0: 0xa0000000, 0x6ca1: 0xa0000000, 0x6ca2: 0xa0000000, 0x6ca3: 0xa0000000, - 0x6ca4: 0xa0000000, 0x6ca5: 0xa0000000, 0x6ca6: 0xa0000000, 0x6ca7: 0xa0000000, - 0x6ca8: 0xa0000000, 0x6ca9: 0xa0000000, 0x6caa: 0xa0000000, 0x6cab: 0xa0000000, - 0x6cac: 0xa0000000, 0x6cad: 0xa0000000, 0x6cae: 0xa0000000, 0x6caf: 0xa0000000, - 0x6cb0: 0xa0000000, 0x6cb1: 0xa0000000, 0x6cb2: 0xa0000000, 0x6cb3: 0xa0000000, - 0x6cb4: 0xa0000000, 0x6cb5: 0xa0000000, 0x6cb6: 0xa0000000, 0x6cb7: 0xa0000000, - 0x6cb8: 0xa0000000, 0x6cb9: 0xa0000000, 0x6cba: 0xa0000000, 0x6cbb: 0xa0000000, - 0x6cbc: 0xa0000000, 0x6cbd: 0xa0000000, 0x6cbe: 0xa0000000, 0x6cbf: 0xa0000000, - // Block 0x1b3, offset 0x6cc0 - 0x6cc0: 0xa0000000, 0x6cc1: 0xa0000000, 0x6cc2: 0xa0000000, 0x6cc3: 0xa0000000, - 0x6cc4: 0xa0000000, 0x6cc5: 0xa0000000, 0x6cc6: 0xa0000000, 0x6cc7: 0xa0000000, - 0x6cc8: 0xa0000000, 0x6cc9: 0xa0000000, 0x6cca: 0xa0000000, 0x6ccb: 0xa0000000, - 0x6ccc: 0xa0000000, 0x6ccd: 0xa0000000, 0x6cce: 0xa0000000, 0x6ccf: 0xa0000000, - 0x6cd0: 0xa0000000, 0x6cd1: 0xa0000000, 0x6cd2: 0xa0000000, 0x6cd3: 0xa0000000, - 0x6cd4: 0xa0000000, 0x6cd5: 0xa0000000, 0x6cd6: 0xa0000000, 0x6cd7: 0xa0000000, - 0x6cd8: 0xa0000000, 0x6cd9: 0xa0000000, 0x6cda: 0xa0000000, 0x6cdb: 0xa0000000, - 0x6cdc: 0xa0000000, 0x6cdd: 0xa0000000, 0x6cde: 0xa0000000, 0x6cdf: 0xa0000000, - 0x6ce0: 0xa0000000, 0x6ce1: 0xa0000000, 0x6ce2: 0xa0000000, 0x6ce3: 0xa0000000, - 0x6ce4: 0xa0000000, 0x6ce5: 0xa0000000, 0x6ce6: 0xa0000000, 0x6ce7: 0xa0000000, - 0x6ce8: 0xa0000000, 0x6ce9: 0xa0000000, 0x6cea: 0xa0000000, 0x6ceb: 0xa0000000, - 0x6cec: 0xa0000000, 0x6ced: 0xa0000000, 0x6cee: 0xa0000000, 0x6cef: 0xa0000000, - // Block 0x1b4, offset 0x6d00 - 0x6d00: 0xa0000000, 0x6d01: 0xa0000000, 0x6d02: 0xa0000000, 0x6d03: 0xa0000000, - 0x6d04: 0xa0000000, 0x6d05: 0xa0000000, 0x6d06: 0xa0000000, 0x6d07: 0xa0000000, - 0x6d08: 0xa0000000, 0x6d09: 0x40020020, 0x6d0a: 0x40020220, 0x6d0b: 0x40020420, - 0x6d0c: 0x40020620, 0x6d0d: 0x40020820, 0x6d0e: 0xa0000000, 0x6d0f: 0xa0000000, - 0x6d10: 0xa0000000, 0x6d11: 0xa0000000, 0x6d12: 0xa0000000, 0x6d13: 0xa0000000, - 0x6d14: 0xa0000000, 0x6d15: 0xa0000000, 0x6d16: 0xa0000000, 0x6d17: 0xa0000000, - 0x6d18: 0xa0000000, 0x6d19: 0xa0000000, 0x6d1a: 0xa0000000, 0x6d1b: 0xa0000000, - 0x6d1c: 0xa0000000, 0x6d1d: 0xa0000000, 0x6d1e: 0xa0000000, 0x6d1f: 0xa0000000, - 0x6d20: 0x40021220, 0x6d21: 0x4002ba20, 0x6d22: 0x4003e020, 0x6d23: 0x4004ea20, - 0x6d24: 0x4027de20, 0x6d25: 0x4004ec20, 0x6d26: 0x4004e620, 0x6d27: 0x4003d220, - 0x6d28: 0x4003f420, 0x6d29: 0x4003f620, 0x6d2a: 0x4004d820, 0x6d2b: 0x40093820, - 0x6d2c: 0x40024020, 0x6d2d: 0x40021a20, 0x6d2e: 0x4002e420, 0x6d2f: 0x4004e220, - 0x6d30: 0x4029cc20, 0x6d31: 0x4029ce20, 0x6d32: 0x4029d020, 0x6d33: 0x4029d220, - 0x6d34: 0x4029d420, 0x6d35: 0x4029d620, 0x6d36: 0x4029d820, 0x6d37: 0x4029da20, - 0x6d38: 0x4029dc20, 0x6d39: 0x4029de20, 0x6d3a: 0x40026c20, 0x6d3b: 0x40026220, - 0x6d3c: 0x40094020, 0x6d3d: 0xc32f0851, 0x6d3e: 0x40094420, 0x6d3f: 0x4002c420, - // Block 0x1b5, offset 0x6d40 - 0x6d40: 0x4004d620, 0x6d41: 0x002bde88, 0x6d42: 0x002c0a88, 0x6d43: 0x002c3a88, - 0x6d44: 0x002c6288, 0x6d45: 0x002c9888, 0x6d46: 0x002d0888, 0x6d47: 0x002d2288, - 0x6d48: 0x002d6888, 0x6d49: 0x002d9a88, 0x6d4a: 0x002dcc88, 0x6d4b: 0x002dfe88, - 0x6d4c: 0xc0030002, 0x6d4d: 0x002e8288, 0x6d4e: 0x002e9e88, 0x6d4f: 0x002ee288, - 0x6d50: 0x002f2c88, 0x6d51: 0x002f5688, 0x6d52: 0x002f7a88, 0x6d53: 0x002fe688, - 0x6d54: 0x00302c88, 0x6d55: 0x00306c88, 0x6d56: 0x0030be88, 0x6d57: 0x0030e288, - 0x6d58: 0x0030f688, 0x6d59: 0x00310088, 0x6d5a: 0x00312a88, 0x6d5b: 0x4003f820, - 0x6d5c: 0x4004e420, 0x6d5d: 0x4003fa20, 0x6d5e: 0x40062420, 0x6d5f: 0x40021620, - 0x6d60: 0x40061e20, 0x6d61: 0x402bde20, 0x6d62: 0x402c0a20, 0x6d63: 0x402c3a20, - 0x6d64: 0x402c6220, 0x6d65: 0x402c9820, 0x6d66: 0x402d0820, 0x6d67: 0x402d2220, - 0x6d68: 0x402d6820, 0x6d69: 0x402d9a20, 0x6d6a: 0x402dcc20, 0x6d6b: 0x402dfe20, - 0x6d6c: 0xc0000002, 0x6d6d: 0x402e8220, 0x6d6e: 0x402e9e20, 0x6d6f: 0x402ee220, - 0x6d70: 0x402f2c20, 0x6d71: 0x402f5620, 0x6d72: 0x402f7a20, 0x6d73: 0x402fe620, - 0x6d74: 0x40302c20, 0x6d75: 0x40306c20, 0x6d76: 0x4030be20, 0x6d77: 0x4030e220, - 0x6d78: 0x4030f620, 0x6d79: 0x40310020, 0x6d7a: 0x40312a20, 0x6d7b: 0x4003fc20, - 0x6d7c: 0x40094820, 0x6d7d: 0x4003fe20, 0x6d7e: 0x40094c20, 0x6d7f: 0xa0000000, - // Block 0x1b6, offset 0x6d80 - 0x6d80: 0x40055620, 0x6d81: 0xa1809102, 0x6d82: 0xa1909002, 0x6d83: 0x40055820, - 0x6d84: 0xae600000, 0x6d85: 0xadc00000, 0x6d86: 0x40055a20, 0x6d87: 0xa1208d02, - 0x6d90: 0x40389020, 0x6d91: 0x40389220, 0x6d92: 0x40389420, 0x6d93: 0x40389620, - 0x6d94: 0x40389820, 0x6d95: 0x40389a20, 0x6d96: 0x40389c20, 0x6d97: 0x40389e20, - 0x6d98: 0x4038a020, 0x6d99: 0x4038a220, 0x6d9a: 0x0038a499, 0x6d9b: 0x4038a420, - 0x6d9c: 0x4038a620, 0x6d9d: 0x0038a899, 0x6d9e: 0x4038a820, 0x6d9f: 0x0038aa99, - 0x6da0: 0x4038aa20, 0x6da1: 0x4038ac20, 0x6da2: 0x4038ae20, 0x6da3: 0x0038b099, - 0x6da4: 0x4038b020, 0x6da5: 0x0038b299, 0x6da6: 0x4038b220, 0x6da7: 0x4038b420, - 0x6da8: 0x4038b620, 0x6da9: 0x4038b820, 0x6daa: 0x4038ba20, - 0x6db0: 0xe00014ff, 0x6db1: 0xe0001502, 0x6db2: 0xe0001511, 0x6db3: 0xa0002102, - 0x6db4: 0xa0002202, - // Block 0x1b7, offset 0x6dc0 - 0x6dc0: 0xa0000000, 0x6dc1: 0xa0000000, 0x6dc2: 0xa0000000, 0x6dc3: 0xa0000000, - 0x6dc4: 0xa0000000, 0x6dc6: 0x40096620, 0x6dc7: 0x40096a20, - 0x6dc8: 0x40070820, 0x6dc9: 0x4004f220, 0x6dca: 0x4004f620, 0x6dcb: 0x4027e620, - 0x6dcc: 0x40024820, 0x6dcd: 0x40024a20, 0x6dce: 0x40070e20, 0x6dcf: 0x40071020, - 0x6dd0: 0xae600000, 0x6dd1: 0xae600000, 0x6dd2: 0xae600000, 0x6dd3: 0xae600000, - 0x6dd4: 0xae600000, 0x6dd5: 0xae600000, 0x6dd6: 0xae600000, 0x6dd7: 0xae600000, - 0x6dd8: 0xa1e00000, 0x6dd9: 0xa1f00000, 0x6dda: 0xa2000000, 0x6ddb: 0x40026420, - 0x6dde: 0x40027020, 0x6ddf: 0x4002cc20, - 0x6de0: 0x403aa220, 0x6de1: 0x40391c20, 0x6de2: 0x40393a21, 0x6de3: 0x40393a22, - 0x6de4: 0x403a7621, 0x6de5: 0x40393a23, 0x6de6: 0x403a9221, 0x6de7: 0xc3310151, - 0x6de8: 0x40393c20, 0x6de9: 0x403a6a21, 0x6dea: 0x40395620, 0x6deb: 0x40395820, - 0x6dec: 0x40396420, 0x6ded: 0x40397220, 0x6dee: 0x40397420, 0x6def: 0x40398820, - 0x6df0: 0x40398a20, 0x6df1: 0x4039a420, 0x6df2: 0x4039a620, 0x6df3: 0x4039c620, - 0x6df4: 0x4039c820, 0x6df5: 0x4039dc20, 0x6df6: 0x4039de20, 0x6df7: 0x4039e620, - 0x6df8: 0x4039e820, 0x6df9: 0x4039ee20, 0x6dfa: 0x4039f020, 0x6dfb: 0x403a3820, - 0x6dfc: 0x403a3a20, 0x6dfd: 0x403a9c20, 0x6dfe: 0x403a9e20, 0x6dff: 0x403aa020, - // Block 0x1b8, offset 0x6e00 - 0x6e00: 0xa0002302, 0x6e01: 0x4039fc20, 0x6e02: 0x403a1220, 0x6e03: 0x403a1a20, - 0x6e04: 0x403a4020, 0x6e05: 0x403a4e20, 0x6e06: 0x403a5620, 0x6e07: 0x403a6820, - 0x6e08: 0xc3350171, 0x6e09: 0x403a9222, 0x6e0a: 0xc3370171, 0x6e0b: 0xa1b0a202, - 0x6e0c: 0xa1c0a502, 0x6e0d: 0xa1d0a902, 0x6e0e: 0xa1e0ad02, 0x6e0f: 0xa1f0b202, - 0x6e10: 0xa200b602, 0x6e11: 0xa210ba02, 0x6e12: 0xa220bc02, 0x6e13: 0xae60bd02, - 0x6e14: 0xae60be02, 0x6e15: 0xadc0bf02, 0x6e16: 0xadc0c102, 0x6e17: 0xae60c202, - 0x6e18: 0xae60c302, 0x6e19: 0xae60c402, 0x6e1a: 0xae60c502, 0x6e1b: 0xae60c602, - 0x6e1c: 0xadc0c702, 0x6e1d: 0xae60c802, 0x6e1e: 0xae60c902, 0x6e1f: 0xadc0c002, - 0x6e20: 0xe000015e, 0x6e21: 0xe00001e6, 0x6e22: 0xe0000301, 0x6e23: 0xe00003db, - 0x6e24: 0xe00004b6, 0x6e25: 0xe0000580, 0x6e26: 0xe000064b, 0x6e27: 0xe00006f3, - 0x6e28: 0xe000079f, 0x6e29: 0xe0000844, 0x6e2a: 0x4004ee20, 0x6e2b: 0x40024c20, - 0x6e2c: 0x40024e20, 0x6e2d: 0x4004de20, 0x6e2e: 0x40393a20, 0x6e2f: 0x403a1020, - 0x6e30: 0xa230d102, 0x6e31: 0x40392420, 0x6e32: 0x40392220, 0x6e33: 0x40392a20, - 0x6e34: 0x00391c84, 0x6e35: 0xf0000404, 0x6e36: 0xf0000404, 0x6e37: 0xf0000404, - 0x6e38: 0xf0000404, 0x6e39: 0x40395a20, 0x6e3a: 0x40395c20, 0x6e3b: 0x40393e20, - 0x6e3c: 0x40395e20, 0x6e3d: 0x40396020, 0x6e3e: 0x40394020, 0x6e3f: 0x40396220, - // Block 0x1b9, offset 0x6e40 - 0x6e40: 0xe00017e4, 0x6e41: 0x403a6c20, 0x6e42: 0xe00017e1, 0x6e43: 0x403a6e20, - 0x6e44: 0x403a7620, 0x6e45: 0x403a7820, 0x6e46: 0x403a7a20, 0x6e47: 0x403a7c20, - 0x6e48: 0x403a7e20, 0x6e49: 0x403a8020, 0x6e4a: 0x403a8220, 0x6e4b: 0x403a8420, - 0x6e4c: 0x403a9220, 0x6e4d: 0x403a9420, 0x6e4e: 0x403a9620, 0x6e4f: 0x403a8620, - 0x6e50: 0x403a9820, 0x6e51: 0x403a9a20, 0x6e52: 0x403aaa20, 0x6e53: 0xe0001800, - 0x6e54: 0x4002e820, 0x6e55: 0x403a7220, 0x6e56: 0xae600000, 0x6e57: 0xae600000, - 0x6e58: 0xae600000, 0x6e59: 0xae600000, 0x6e5a: 0xae600000, 0x6e5b: 0xae600000, - 0x6e5c: 0xae600000, 0x6e5d: 0xa0000000, 0x6e5e: 0x40071220, 0x6e5f: 0xae600000, - 0x6e60: 0xae600000, 0x6e61: 0xae600000, 0x6e62: 0xae600000, 0x6e63: 0xadc00000, - 0x6e64: 0xae600000, 0x6e65: 0x003a7483, 0x6e66: 0x003a9083, 0x6e67: 0xae600000, - 0x6e68: 0xae600000, 0x6e69: 0x40071420, 0x6e6a: 0xadc00000, 0x6e6b: 0xae600000, - 0x6e6c: 0xae600000, 0x6e6d: 0xadc00000, 0x6e6e: 0x40399e20, 0x6e6f: 0x4039ba20, - 0x6e70: 0xe0000161, 0x6e71: 0xe00001e9, 0x6e72: 0xe0000304, 0x6e73: 0xe00003de, - 0x6e74: 0xe00004b9, 0x6e75: 0xe0000583, 0x6e76: 0xe000064e, 0x6e77: 0xe00006f6, - 0x6e78: 0xe00007a2, 0x6e79: 0xe0000847, 0x6e7a: 0x4039d020, 0x6e7b: 0x4039e420, - 0x6e7c: 0x4039f420, 0x6e7d: 0xe0001553, 0x6e7e: 0xe0001779, 0x6e7f: 0x403a7020, - // Block 0x1ba, offset 0x6e80 - 0x6e81: 0x40491020, 0x6e82: 0x40491220, 0x6e83: 0x40491420, - 0x6e84: 0x40491620, 0x6e85: 0x40491820, 0x6e86: 0x40491a20, 0x6e87: 0x40491c20, - 0x6e88: 0x40491e20, 0x6e89: 0x40492020, 0x6e8a: 0x40492220, 0x6e8b: 0x40492420, - 0x6e8c: 0x40492620, 0x6e8d: 0x40492820, 0x6e8e: 0x40492a20, 0x6e8f: 0x40492c20, - 0x6e90: 0x40492e20, 0x6e91: 0x40493020, 0x6e92: 0x40493220, 0x6e93: 0x40493420, - 0x6e94: 0x40493620, 0x6e95: 0x40493820, 0x6e96: 0x40493a20, 0x6e97: 0x40493c20, - 0x6e98: 0x40493e20, 0x6e99: 0x40494020, 0x6e9a: 0x40494220, 0x6e9b: 0x40494420, - 0x6e9c: 0x40494620, 0x6e9d: 0x40494820, 0x6e9e: 0x40494a20, 0x6e9f: 0x40494c20, - 0x6ea0: 0x40494e20, 0x6ea1: 0x40495020, 0x6ea2: 0x40495220, 0x6ea3: 0x40495420, - 0x6ea4: 0x40495620, 0x6ea5: 0x40495820, 0x6ea6: 0x40495a20, 0x6ea7: 0x40495c20, - 0x6ea8: 0x40495e20, 0x6ea9: 0x40496020, 0x6eaa: 0x40496220, 0x6eab: 0x40496420, - 0x6eac: 0x40496620, 0x6ead: 0x40496820, 0x6eae: 0x40496a20, 0x6eaf: 0x40496c20, - 0x6eb0: 0x40496e20, 0x6eb1: 0x40497020, 0x6eb2: 0x40497220, 0x6eb3: 0x40497420, - 0x6eb4: 0x40497620, 0x6eb5: 0x40497820, 0x6eb6: 0x40497a20, 0x6eb7: 0x40497c20, - 0x6eb8: 0x826724bf, 0x6eb9: 0x826724c0, 0x6eba: 0xa0002402, - 0x6ebf: 0x4027f420, - // Block 0x1bb, offset 0x6ec0 - 0x6ec0: 0x4062ac20, 0x6ec1: 0xe0002526, 0x6ec2: 0x4062b020, 0x6ec3: 0x4062b220, - 0x6ec4: 0xe0002532, 0x6ec5: 0x4062b620, 0x6ec6: 0x4062b820, 0x6ec7: 0x4062ba20, - 0x6ec8: 0xe000254a, 0x6ec9: 0x4062be20, 0x6eca: 0xe0002550, 0x6ecb: 0x4062c220, - 0x6ecc: 0x4062c420, 0x6ecd: 0xe0002553, 0x6ece: 0x4062c820, 0x6ecf: 0x4062ca20, - 0x6ed0: 0x4062cc20, 0x6ed1: 0x4062ce20, 0x6ed2: 0x4062d020, 0x6ed3: 0x4062d220, - 0x6ed4: 0x4062d420, 0x6ed5: 0x4062d620, 0x6ed6: 0x4062d820, 0x6ed7: 0x4062da20, - 0x6ed8: 0x4062dc20, 0x6ed9: 0x4062de20, 0x6eda: 0x4062e020, 0x6edb: 0x4062e220, - 0x6edc: 0x4062e420, 0x6edd: 0x4062e620, 0x6ede: 0x4062e820, 0x6edf: 0x4062ea20, - 0x6ee0: 0x4062ec20, 0x6ee1: 0x4062ee20, 0x6ee2: 0x4062f020, 0x6ee3: 0x4062f220, - 0x6ee4: 0x4062f420, 0x6ee5: 0x4062f620, 0x6ee6: 0x4062f820, 0x6ee7: 0x4062fa20, - 0x6ee8: 0x4062fc20, 0x6ee9: 0x4062fe20, 0x6eea: 0x40630020, 0x6eeb: 0x40630220, - 0x6eec: 0x40630420, 0x6eed: 0x40630620, 0x6eee: 0x40630820, 0x6eef: 0x40630a20, - 0x6ef0: 0x40630c20, 0x6ef1: 0x40630e20, 0x6ef2: 0x40631020, 0x6ef3: 0x40631220, - 0x6ef4: 0x40631420, 0x6ef5: 0x40631620, 0x6ef6: 0x40631820, 0x6ef7: 0x40631a20, - 0x6ef8: 0x40631c20, 0x6ef9: 0x40631e20, 0x6efa: 0x40632020, 0x6efb: 0x40632220, - 0x6efc: 0x40632420, 0x6efd: 0x40632620, 0x6efe: 0x40632820, 0x6eff: 0x40632a20, - // Block 0x1bc, offset 0x6f00 - 0x6f00: 0x40632c20, 0x6f01: 0x40632e20, 0x6f02: 0x40633020, 0x6f03: 0x40633220, - 0x6f04: 0x40633420, 0x6f05: 0x40633620, 0x6f06: 0x40633820, 0x6f07: 0x40633a20, - 0x6f08: 0x40633c20, 0x6f09: 0x40633e20, 0x6f0a: 0x40634020, 0x6f0b: 0x40634220, - 0x6f0c: 0x40634420, 0x6f0d: 0x40634620, 0x6f0e: 0x40634820, 0x6f0f: 0x40634a20, - 0x6f10: 0x40634c20, 0x6f11: 0x40634e20, 0x6f12: 0x40635020, 0x6f13: 0x40635220, - 0x6f14: 0x40635420, 0x6f15: 0x40635620, 0x6f16: 0x40635820, 0x6f17: 0x40635a20, - 0x6f18: 0x40635c20, 0x6f19: 0x40635e20, 0x6f1a: 0x40636020, 0x6f1b: 0x40636220, - 0x6f1c: 0x40636420, 0x6f1d: 0x40636620, 0x6f1e: 0x40636820, 0x6f1f: 0x4063a420, - 0x6f20: 0x4063a620, 0x6f21: 0x4063a820, 0x6f22: 0xe0002556, 0x6f23: 0x4063ac20, - 0x6f24: 0xe0002559, 0x6f25: 0x4063b020, 0x6f26: 0xe000255c, 0x6f27: 0x4063b420, - 0x6f28: 0xe000255f, 0x6f29: 0x4063b820, 0x6f2a: 0xe0002562, 0x6f2b: 0xe0002565, - 0x6f2c: 0xe0002569, 0x6f2d: 0x4063c020, 0x6f2e: 0x4063c220, 0x6f2f: 0xe000256c, - 0x6f30: 0xe000256f, 0x6f31: 0xe0002573, 0x6f32: 0x4063ca20, 0x6f33: 0x4063cc20, - 0x6f34: 0x4063ce20, 0x6f35: 0x4063d020, 0x6f36: 0x4063d220, 0x6f37: 0x4063d420, - 0x6f38: 0x4063d620, 0x6f39: 0x4063d820, 0x6f3a: 0x4063da20, 0x6f3b: 0x4063dc20, - 0x6f3c: 0x4063de20, 0x6f3d: 0x4063e020, 0x6f3e: 0x4063e220, 0x6f3f: 0x4063e420, - // Block 0x1bd, offset 0x6f40 - 0x6f40: 0x4063e620, 0x6f41: 0x4063e820, 0x6f42: 0x4063ea20, 0x6f43: 0x4063ec20, - 0x6f44: 0x4063ee20, 0x6f45: 0x4063f020, 0x6f46: 0x4063f220, 0x6f47: 0x4063f420, - 0x6f48: 0x4063f620, 0x6f49: 0x4063f820, 0x6f4a: 0x4063fa20, 0x6f4b: 0x4063fc20, - 0x6f4c: 0x4063fe20, 0x6f4d: 0x40640020, 0x6f4e: 0x40640220, 0x6f4f: 0x40640420, - 0x6f50: 0x40640620, 0x6f51: 0x40640820, 0x6f52: 0x40640a20, 0x6f53: 0x40640c20, - 0x6f54: 0x40640e20, 0x6f55: 0x40641020, 0x6f56: 0x40641220, 0x6f57: 0x40641420, - 0x6f58: 0x40641620, 0x6f59: 0x40641820, 0x6f5a: 0x40641a20, 0x6f5b: 0x40641c20, - 0x6f5c: 0x40641e20, 0x6f5d: 0x40642020, 0x6f5e: 0x40642220, 0x6f5f: 0x40642420, - 0x6f60: 0x40642620, 0x6f61: 0x40642820, 0x6f62: 0x40642a20, 0x6f63: 0x40642c20, - 0x6f64: 0x40642e20, 0x6f65: 0x40643020, 0x6f66: 0x40643220, 0x6f67: 0x40643420, - 0x6f68: 0x4062ac20, 0x6f69: 0xe0002526, 0x6f6a: 0xe0002529, 0x6f6b: 0x4062b020, - 0x6f6c: 0xe000252c, 0x6f6d: 0xe000252f, 0x6f6e: 0x4062b220, 0x6f6f: 0x4062b620, - 0x6f70: 0xe0002535, 0x6f71: 0xe0002538, 0x6f72: 0xe000253b, 0x6f73: 0xe000253e, - 0x6f74: 0xe0002541, 0x6f75: 0xe0002544, 0x6f76: 0xe0002547, 0x6f77: 0x4062b820, - 0x6f78: 0x4062ba20, 0x6f79: 0xe000254d, 0x6f7a: 0x4062be20, 0x6f7b: 0xe0002550, - 0x6f7c: 0x4062c220, 0x6f7d: 0x4062c420, 0x6f7e: 0x4062c820, 0x6f7f: 0x4062ca20, - // Block 0x1be, offset 0x6f80 - 0x6f80: 0x4062cc20, 0x6f81: 0x4062ce20, 0x6f82: 0x4062d020, 0x6f83: 0x40649a20, - 0x6f84: 0x40649c20, 0x6f85: 0x40649e20, 0x6f86: 0x4064a020, 0x6f87: 0x4064a220, - 0x6f88: 0x4064a420, 0x6f89: 0x4064a620, 0x6f8a: 0x4064a820, 0x6f8b: 0x4064aa20, - 0x6f8c: 0x4064ac20, 0x6f8d: 0x4064ae20, 0x6f8e: 0x4064b020, 0x6f8f: 0x4064b220, - 0x6f90: 0x4064b420, 0x6f91: 0x4064b620, 0x6f92: 0x4064b820, 0x6f93: 0x4064ba20, - 0x6f94: 0x4064bc20, 0x6f95: 0x4064be20, 0x6f96: 0x4064c020, 0x6f97: 0x4064c220, - 0x6f98: 0x4064c420, 0x6f99: 0x4064c620, 0x6f9a: 0x4064c820, 0x6f9b: 0x4064ca20, - 0x6f9c: 0x4064cc20, 0x6f9d: 0x4064ce20, 0x6f9e: 0x4064d020, 0x6f9f: 0x4064d220, - 0x6fa0: 0x4064d420, 0x6fa1: 0x4064d620, 0x6fa2: 0x4064d820, 0x6fa3: 0x4064da20, - 0x6fa4: 0x4064dc20, 0x6fa5: 0x4064de20, 0x6fa6: 0x4064e020, 0x6fa7: 0x4064e220, - 0x6fa8: 0x4064e420, 0x6fa9: 0x4064e620, 0x6faa: 0x4064e820, 0x6fab: 0x4064ea20, - 0x6fac: 0x4064ec20, 0x6fad: 0x4064ee20, 0x6fae: 0x4064f020, 0x6faf: 0x4064f220, - 0x6fb0: 0x4064f420, 0x6fb1: 0x4064f620, 0x6fb2: 0x4064f820, 0x6fb3: 0x4064fa20, - 0x6fb4: 0x4064fc20, 0x6fb5: 0x4064fe20, 0x6fb6: 0x40650020, 0x6fb7: 0x40650220, - 0x6fb8: 0x40650420, 0x6fb9: 0x40650620, 0x6fba: 0x40650820, 0x6fbb: 0x40650a20, - 0x6fbc: 0x40650c20, 0x6fbd: 0x40650e20, 0x6fbe: 0x40651020, 0x6fbf: 0x40651220, - // Block 0x1bf, offset 0x6fc0 - 0x6fc0: 0x4009a620, 0x6fc1: 0xe00000f5, 0x6fc2: 0x4009a820, 0x6fc3: 0x4009aa20, - 0x6fc4: 0xe00000f8, 0x6fc5: 0x4009ac20, 0x6fc6: 0x4009ae20, 0x6fc7: 0xe00000fb, - 0x6fc8: 0x4009b020, 0x6fc9: 0xe00000fe, 0x6fca: 0x4009b220, 0x6fcb: 0x4009b420, - 0x6fcc: 0x4009b620, 0x6fcd: 0x4009b820, 0x6fce: 0x4009ba20, 0x6fcf: 0x4009bc20, - 0x6fd0: 0x4009be20, 0x6fd1: 0x4009c020, 0x6fd2: 0x4009c220, 0x6fd3: 0x4009c420, - 0x6fd4: 0x4009c620, 0x6fd5: 0x4009c820, 0x6fd6: 0x4009ca20, 0x6fd7: 0x4009cc20, - 0x6fd8: 0x4009ce20, 0x6fd9: 0x4009d020, 0x6fda: 0x4009d220, 0x6fdb: 0x4009d420, - 0x6fdc: 0x4009d620, 0x6fdd: 0x4009d820, 0x6fde: 0x4009da20, 0x6fdf: 0x4009dc20, - 0x6fe0: 0x40094420, 0x6fe1: 0x4009de20, 0x6fe2: 0xe0000104, 0x6fe3: 0x4009e020, - 0x6fe4: 0x4009e220, 0x6fe5: 0x4009e420, 0x6fe6: 0x4009e620, 0x6fe7: 0x4009e820, - 0x6fe8: 0x4009ea20, 0x6fe9: 0x4009ec20, 0x6fea: 0x4009ee20, 0x6feb: 0x4009f020, - 0x6fec: 0x4009f220, 0x6fed: 0xe0000101, 0x6fee: 0xe00000e1, 0x6fef: 0xe00000e7, - 0x6ff0: 0xe0000107, 0x6ff1: 0xe000010a, 0x6ff2: 0x4009f420, 0x6ff3: 0x4009f620, - 0x6ff4: 0xe000010d, 0x6ff5: 0xe0000110, 0x6ff6: 0x4009f820, 0x6ff7: 0x4009fa20, - 0x6ff8: 0xe0000113, 0x6ff9: 0xe0000116, 0x6ffa: 0x4009fc20, 0x6ffb: 0x4009fe20, - 0x6ffc: 0x400a0020, 0x6ffd: 0x400a0220, 0x6ffe: 0x400a0420, 0x6fff: 0x400a0620, - // Block 0x1c0, offset 0x7000 - 0x7000: 0x40073420, 0x7001: 0x40073620, - 0x7013: 0x003a269a, - 0x7014: 0x003a2699, 0x7015: 0x003a2697, 0x7016: 0x003a2698, 0x7017: 0x003a7c9a, - 0x7018: 0x003a7c99, 0x7019: 0x003a7a9a, 0x701a: 0x003a7a99, 0x701b: 0x003a7e9a, - 0x701c: 0x003a7e99, 0x701d: 0xf0001a1a, 0x701e: 0x003a849a, 0x701f: 0x003a8499, - 0x7020: 0x003a789a, 0x7021: 0x003a7899, 0x7022: 0x003a809a, 0x7023: 0x003a8099, - 0x7024: 0x003a989a, 0x7025: 0x003a9899, 0x7026: 0x003a9897, 0x7027: 0x003a9898, - 0x7028: 0x003a92c3, 0x7029: 0x003a92c4, 0x702a: 0xe0001559, 0x702b: 0xe0001556, - 0x702c: 0xe0001589, 0x702d: 0xe0001586, 0x702e: 0xe000158f, 0x702f: 0xe000158c, - 0x7030: 0xe000159b, 0x7031: 0xe0001598, 0x7032: 0xe0001595, 0x7033: 0xe0001592, - 0x7034: 0xe00015a1, 0x7035: 0xe000159e, 0x7036: 0xe00015bf, 0x7037: 0xe00015bc, - 0x7038: 0xe00015b9, 0x7039: 0xe00015ad, 0x703a: 0xe00015a7, 0x703b: 0xe00015a4, - 0x703c: 0x003a929a, 0x703d: 0x003a9299, 0x703e: 0x003a9297, 0x703f: 0x003a9298, - // Block 0x1c1, offset 0x7040 - 0x7040: 0xe000155f, 0x7041: 0xe0001565, 0x7042: 0xe000157a, 0x7043: 0xe00015b0, - 0x7044: 0xe00015b6, 0x7045: 0xf0001a1a, 0x7046: 0xf0001a1a, 0x7047: 0xf0001a1a, - 0x7048: 0xf0001a1a, 0x7049: 0xe00024ab, 0x704a: 0xf0001a1a, 0x704b: 0xf0001a1a, - 0x704c: 0xf0001a1a, 0x704d: 0xf0001a1a, 0x704e: 0xf0001a1a, 0x704f: 0xe00024b1, - 0x7050: 0xf0001a1a, 0x7051: 0xf0001a1a, 0x7052: 0xf0001a1a, 0x7053: 0xe00024b7, - 0x7054: 0xf0001a1a, 0x7055: 0xf0001a1a, 0x7056: 0xf0001a1a, 0x7057: 0xf0001a1a, - 0x7058: 0xf0001a1a, 0x7059: 0xf0001a1a, 0x705a: 0xf0001a1a, 0x705b: 0xf0001a1a, - 0x705c: 0xf0001a1a, 0x705d: 0xf0001a1a, 0x705e: 0xf0001a1a, 0x705f: 0xf0001a1a, - 0x7060: 0xf0001a1a, 0x7061: 0xf0001a1a, 0x7062: 0xf0001a1a, 0x7063: 0xf0001a1a, - 0x7064: 0xf0001a1a, 0x7065: 0xf0001a1a, 0x7066: 0xf0001a1a, 0x7067: 0xf0001a1a, - 0x7068: 0xf0001a1a, 0x7069: 0xf0001a1a, 0x706a: 0xf0001a1a, 0x706b: 0xf0001a1a, - 0x706c: 0xf0001a1a, 0x706d: 0xf0001a1a, 0x706e: 0xf0001a1a, 0x706f: 0xf0001a1a, - 0x7070: 0xf0001a1a, 0x7071: 0xe00024f9, 0x7072: 0xf0001a1a, 0x7073: 0xf0001a1a, - 0x7074: 0xf0001a1a, 0x7075: 0xe00024ff, 0x7076: 0xf0001a1a, 0x7077: 0xf0001a1a, - 0x7078: 0xf0001a1a, 0x7079: 0xf0001a1a, 0x707a: 0xf0001a1a, 0x707b: 0xf0001a1a, - 0x707c: 0xf0001a1a, 0x707d: 0xe0002505, 0x707e: 0xf0001a1a, 0x707f: 0xf0001a1a, - // Block 0x1c2, offset 0x7080 - 0x7080: 0xf0001a1a, 0x7081: 0xf0001a1a, 0x7082: 0xf0001a1a, 0x7083: 0xe000250b, - 0x7084: 0xf0001a1a, 0x7085: 0xf0001a1a, 0x7086: 0xf0001a1a, 0x7087: 0xf0001a1a, - 0x7088: 0xf0001a1a, 0x7089: 0xe000250e, 0x708a: 0xf0001a1a, 0x708b: 0xf0001a1a, - 0x708c: 0xf0001a1a, 0x708d: 0xf0001a1a, 0x708e: 0xf0001a1a, 0x708f: 0xe0002514, - 0x7090: 0xf0001a1a, 0x7091: 0xf0001a1a, 0x7092: 0xf0001a1a, 0x7093: 0xe0002517, - 0x7094: 0xf0001a1a, 0x7095: 0xf0001a1a, 0x7096: 0xf0001a1a, 0x7097: 0xf0001a1a, - 0x7098: 0xf0001a1a, 0x7099: 0xe0002523, 0x709a: 0xf0001a1a, 0x709b: 0xf0001a1a, - 0x709c: 0xf0001a1a, 0x709d: 0xe000251d, 0x709e: 0xe0000003, 0x709f: 0xe0000006, - 0x70a0: 0xe0000009, 0x70a1: 0xe000000c, 0x70a2: 0xe000000f, 0x70a3: 0xe0000012, - 0x70a4: 0xe000156b, 0x70a5: 0xe000156e, 0x70a6: 0xe0001577, 0x70a7: 0xe000157d, - 0x70a8: 0xe00015aa, 0x70a9: 0xe00015b3, 0x70aa: 0xf0001919, 0x70ab: 0xf0001919, - 0x70ac: 0xf0001919, 0x70ad: 0xf0001919, 0x70ae: 0xe00024a8, 0x70af: 0xf0001919, - 0x70b0: 0xf0001919, 0x70b1: 0xf0001919, 0x70b2: 0xf0001919, 0x70b3: 0xf0001919, - 0x70b4: 0xe00024ae, 0x70b5: 0xf0001919, 0x70b6: 0xf0001919, 0x70b7: 0xf0001919, - 0x70b8: 0xf0001919, 0x70b9: 0xf0001919, 0x70ba: 0xe00024b4, 0x70bb: 0xf0001919, - 0x70bc: 0xe00024f6, 0x70bd: 0xf0001919, 0x70be: 0xe00024fc, 0x70bf: 0xf0001919, - // Block 0x1c3, offset 0x70c0 - 0x70c0: 0xf0001919, 0x70c1: 0xf0001919, 0x70c2: 0xf0001919, 0x70c3: 0xe0002502, - 0x70c4: 0xf0001919, 0x70c5: 0xf0001919, 0x70c6: 0xe0002508, 0x70c7: 0xf0001919, - 0x70c8: 0xf0001919, 0x70c9: 0xf0001919, 0x70ca: 0xf0001919, 0x70cb: 0xf0001919, - 0x70cc: 0xf0001919, 0x70cd: 0xf0001919, 0x70ce: 0xe0002511, 0x70cf: 0xf0001919, - 0x70d0: 0xe000251a, 0x70d1: 0xf0001919, 0x70d2: 0xf0001919, 0x70d3: 0xf0001919, - 0x70d4: 0xf0001919, 0x70d5: 0xe0002520, 0x70d6: 0xf0001919, 0x70d7: 0xe000155c, - 0x70d8: 0xe0001562, 0x70d9: 0xe0001568, 0x70da: 0xe0001571, 0x70db: 0xe0001580, - 0x70dc: 0xf0001717, 0x70dd: 0xf0001717, 0x70de: 0xf0001717, 0x70df: 0xf0001717, - 0x70e0: 0xf0001717, 0x70e1: 0xf0001717, 0x70e2: 0xf0001717, 0x70e3: 0xf0001717, - 0x70e4: 0xf0001717, 0x70e5: 0xf0001717, 0x70e6: 0xf0001717, 0x70e7: 0xf0001717, - 0x70e8: 0xf0001717, 0x70e9: 0xf0001717, 0x70ea: 0xf0001717, 0x70eb: 0xf0001717, - 0x70ec: 0xf0001717, 0x70ed: 0xf0001717, 0x70ee: 0xf0001717, 0x70ef: 0xf0001717, - 0x70f0: 0xf0001717, 0x70f1: 0xf0001717, 0x70f2: 0xf0001717, 0x70f3: 0xf0001717, - 0x70f4: 0xf0001717, 0x70f5: 0xf0001717, 0x70f6: 0xf0001717, 0x70f7: 0xf0001717, - 0x70f8: 0xf0001717, 0x70f9: 0xf0001717, 0x70fa: 0xf0001717, 0x70fb: 0xf0001717, - 0x70fc: 0xf0001717, 0x70fd: 0xf0001717, 0x70fe: 0xf0001717, 0x70ff: 0xf0001717, - // Block 0x1c4, offset 0x7100 - 0x7100: 0xf0001717, 0x7101: 0xf0001717, 0x7102: 0xf0001717, 0x7103: 0xf0001717, - 0x7104: 0xf0001717, 0x7105: 0xf0001717, 0x7106: 0xf0001717, 0x7107: 0xf0001717, - 0x7108: 0xf0001717, 0x7109: 0xf0001717, 0x710a: 0xf0001717, 0x710b: 0xf0001717, - 0x710c: 0xf0001717, 0x710d: 0xf0001717, 0x710e: 0xf0001717, 0x710f: 0xf0001717, - 0x7110: 0xf0001717, 0x7111: 0xf0001717, 0x7112: 0xf0001717, 0x7113: 0xf0001717, - 0x7114: 0xf0001717, 0x7115: 0xf0001717, 0x7116: 0xf0001717, 0x7117: 0xf0001717, - 0x7118: 0xf0001717, 0x7119: 0xf0001717, 0x711a: 0xf0001717, 0x711b: 0xf0001717, - 0x711c: 0xf0001717, 0x711d: 0xf0001717, 0x711e: 0xf0001717, 0x711f: 0xe0001574, - 0x7120: 0xe0001583, 0x7121: 0xf0001818, 0x7122: 0xf0001818, 0x7123: 0xf0001818, - 0x7124: 0xf0001818, 0x7125: 0xf0001818, 0x7126: 0xf0001818, 0x7127: 0xf0001818, - 0x7128: 0xf0001818, 0x7129: 0xf0001818, 0x712a: 0xf0001818, 0x712b: 0xf0001818, - 0x712c: 0xf0001818, 0x712d: 0xf0001818, 0x712e: 0xf0001818, 0x712f: 0xf0001818, - 0x7130: 0xf0001818, 0x7131: 0xf0001818, 0x7132: 0xe000249f, 0x7133: 0xe00024a2, - 0x7134: 0xe00024a5, 0x7135: 0xe00024e7, 0x7136: 0xf0001a1a, 0x7137: 0xe00024ed, - 0x7138: 0xf0001a1a, 0x7139: 0xe00024f3, 0x713a: 0xf0001a1a, 0x713b: 0xe00024cf, - 0x713c: 0xf0001a1a, 0x713d: 0xe00024d5, 0x713e: 0xf0001a1a, 0x713f: 0xe00024c3, - // Block 0x1c5, offset 0x7140 - 0x7140: 0xf0001a1a, 0x7141: 0xe00024bd, 0x7142: 0xf0001a1a, 0x7143: 0xe00024c9, - 0x7144: 0xf0001a1a, 0x7145: 0xe00024db, 0x7146: 0xf0001a1a, 0x7147: 0xe00024e1, - 0x7148: 0xf0001a1a, 0x7149: 0xf0001a1a, 0x714a: 0xf0001a1a, 0x714b: 0xf0001a1a, - 0x714c: 0xf0001a1a, 0x714d: 0xf0001a1a, 0x714e: 0xf0001a1a, 0x714f: 0xf0001a1a, - 0x7150: 0xf0001a1a, 0x7151: 0xe00024e4, 0x7152: 0xf0001919, 0x7153: 0xe00024ea, - 0x7154: 0xf0001919, 0x7155: 0xe00024f0, 0x7156: 0xf0001919, 0x7157: 0xe00024cc, - 0x7158: 0xf0001919, 0x7159: 0xe00024d2, 0x715a: 0xf0001919, 0x715b: 0xe00024c0, - 0x715c: 0xf0001919, 0x715d: 0xe00024ba, 0x715e: 0xf0001919, 0x715f: 0xe00024c6, - 0x7160: 0xf0001919, 0x7161: 0xe00024d8, 0x7162: 0xf0001919, 0x7163: 0xe00024de, - 0x7164: 0xf0001919, 0x7165: 0xf0001919, 0x7166: 0xf0001919, 0x7167: 0xf0001919, - 0x7168: 0xf0001919, 0x7169: 0xf0001919, 0x716a: 0xf0001919, 0x716b: 0xf0001919, - 0x716c: 0xf0001919, 0x716d: 0xf0001717, 0x716e: 0xf0001717, 0x716f: 0xf0001717, - 0x7170: 0xf0001717, 0x7171: 0xf0001717, 0x7172: 0xf0001717, 0x7173: 0xf0001717, - 0x7174: 0xf0001818, 0x7175: 0xf0001818, 0x7176: 0xf0001818, 0x7177: 0xf0001818, - 0x7178: 0xf0001818, 0x7179: 0xf0001818, 0x717a: 0xf0001818, 0x717b: 0xf0001818, - 0x717c: 0xf0001919, 0x717d: 0xf0001a1a, 0x717e: 0x4004c020, 0x717f: 0x4004c220, - // Block 0x1c6, offset 0x7180 - 0x7180: 0x00391c9a, 0x7181: 0x00393aa4, 0x7182: 0x00393aa3, 0x7183: 0x00393ac4, - 0x7184: 0x00393ac3, 0x7185: 0x003a76a4, 0x7186: 0x003a76a3, 0x7187: 0x00393ae4, - 0x7188: 0x00393ae3, 0x7189: 0x003a92a6, 0x718a: 0x003a92a5, 0x718b: 0x003a92a3, - 0x718c: 0x003a92a4, 0x718d: 0x00393884, 0x718e: 0x00393883, 0x718f: 0x00393c9a, - 0x7190: 0x00393c99, 0x7191: 0x00393c97, 0x7192: 0x00393c98, 0x7193: 0x003a6aa4, - 0x7194: 0x003a6aa3, 0x7195: 0x0039569a, 0x7196: 0x00395699, 0x7197: 0x00395697, - 0x7198: 0x00395698, 0x7199: 0x0039589a, 0x719a: 0x00395899, 0x719b: 0x00395897, - 0x719c: 0x00395898, 0x719d: 0x0039649a, 0x719e: 0x00396499, 0x719f: 0x00396497, - 0x71a0: 0x00396498, 0x71a1: 0x0039729a, 0x71a2: 0x00397299, 0x71a3: 0x00397297, - 0x71a4: 0x00397298, 0x71a5: 0x0039749a, 0x71a6: 0x00397499, 0x71a7: 0x00397497, - 0x71a8: 0x00397498, 0x71a9: 0x0039889a, 0x71aa: 0x00398899, 0x71ab: 0x00398a9a, - 0x71ac: 0x00398a99, 0x71ad: 0x0039a49a, 0x71ae: 0x0039a499, 0x71af: 0x0039a69a, - 0x71b0: 0x0039a699, 0x71b1: 0x0039c69a, 0x71b2: 0x0039c699, 0x71b3: 0x0039c697, - 0x71b4: 0x0039c698, 0x71b5: 0x0039c89a, 0x71b6: 0x0039c899, 0x71b7: 0x0039c897, - 0x71b8: 0x0039c898, 0x71b9: 0x0039dc9a, 0x71ba: 0x0039dc99, 0x71bb: 0x0039dc97, - 0x71bc: 0x0039dc98, 0x71bd: 0x0039de9a, 0x71be: 0x0039de99, 0x71bf: 0x0039de97, - // Block 0x1c7, offset 0x71c0 - 0x71c0: 0x0039de98, 0x71c1: 0x0039e69a, 0x71c2: 0x0039e699, 0x71c3: 0x0039e697, - 0x71c4: 0x0039e698, 0x71c5: 0x0039e89a, 0x71c6: 0x0039e899, 0x71c7: 0x0039e897, - 0x71c8: 0x0039e898, 0x71c9: 0x0039ee9a, 0x71ca: 0x0039ee99, 0x71cb: 0x0039ee97, - 0x71cc: 0x0039ee98, 0x71cd: 0x0039f09a, 0x71ce: 0x0039f099, 0x71cf: 0x0039f097, - 0x71d0: 0x0039f098, 0x71d1: 0x0039fc9a, 0x71d2: 0x0039fc99, 0x71d3: 0x0039fc97, - 0x71d4: 0x0039fc98, 0x71d5: 0x003a129a, 0x71d6: 0x003a1299, 0x71d7: 0x003a1297, - 0x71d8: 0x003a1298, 0x71d9: 0x003a1a9a, 0x71da: 0x003a1a99, 0x71db: 0x003a1a97, - 0x71dc: 0x003a1a98, 0x71dd: 0x003a409a, 0x71de: 0x003a4099, 0x71df: 0x003a4097, - 0x71e0: 0x003a4098, 0x71e1: 0x003a4e9a, 0x71e2: 0x003a4e99, 0x71e3: 0x003a4e97, - 0x71e4: 0x003a4e98, 0x71e5: 0x003a569a, 0x71e6: 0x003a5699, 0x71e7: 0x003a5697, - 0x71e8: 0x003a5698, 0x71e9: 0x003a6886, 0x71ea: 0x003a6885, 0x71eb: 0x003a6883, - 0x71ec: 0x003a6884, 0x71ed: 0x003a7485, 0x71ee: 0x003a7484, 0x71ef: 0x003a92c6, - 0x71f0: 0x003a92c5, 0x71f1: 0x003a9087, 0x71f2: 0x003a9086, 0x71f3: 0x003a9084, - 0x71f4: 0x003a9085, 0x71f5: 0xe0001732, 0x71f6: 0xe000172f, 0x71f7: 0xe0001738, - 0x71f8: 0xe0001735, 0x71f9: 0xe000173e, 0x71fa: 0xe000173b, 0x71fb: 0xf0001a1a, - 0x71fc: 0xf0001919, 0x71ff: 0xa0000000, - // Block 0x1c8, offset 0x7200 - 0x7200: 0xa0000000, 0x7201: 0xa0000000, 0x7202: 0xa0000000, 0x7203: 0xa0000000, - 0x7204: 0xa0000000, 0x7205: 0xa0000000, 0x7206: 0xa0000000, 0x7207: 0xa0000000, - 0x7208: 0xa0000000, 0x7209: 0x40020020, 0x720a: 0x40020220, 0x720b: 0x40020420, - 0x720c: 0x40020620, 0x720d: 0x40020820, 0x720e: 0xa0000000, 0x720f: 0xa0000000, - 0x7210: 0xa0000000, 0x7211: 0xa0000000, 0x7212: 0xa0000000, 0x7213: 0xa0000000, - 0x7214: 0xa0000000, 0x7215: 0xa0000000, 0x7216: 0xa0000000, 0x7217: 0xa0000000, - 0x7218: 0xa0000000, 0x7219: 0xa0000000, 0x721a: 0xa0000000, 0x721b: 0xa0000000, - 0x721c: 0xa0000000, 0x721d: 0xa0000000, 0x721e: 0xa0000000, 0x721f: 0xa0000000, - 0x7220: 0x40021220, 0x7221: 0x4002ba20, 0x7222: 0x4003e020, 0x7223: 0x4004ea20, - 0x7224: 0x4027de20, 0x7225: 0x4004ec20, 0x7226: 0x4004e620, 0x7227: 0x4003d220, - 0x7228: 0x4003f420, 0x7229: 0x4003f620, 0x722a: 0x4004d820, 0x722b: 0x40093820, - 0x722c: 0x40024020, 0x722d: 0x40021a20, 0x722e: 0x4002e420, 0x722f: 0x4004e220, - 0x7230: 0x4029cc20, 0x7231: 0x4029ce20, 0x7232: 0x4029d020, 0x7233: 0x4029d220, - 0x7234: 0x4029d420, 0x7235: 0x4029d620, 0x7236: 0x4029d820, 0x7237: 0x4029da20, - 0x7238: 0x4029dc20, 0x7239: 0x4029de20, 0x723a: 0x40026c20, 0x723b: 0x40026220, - 0x723c: 0x40094020, 0x723d: 0xc32f0851, 0x723e: 0x40094420, 0x723f: 0x4002c420, - // Block 0x1c9, offset 0x7240 - 0x7240: 0x4004d620, 0x7241: 0x002bde88, 0x7242: 0x002c0a88, 0x7243: 0xc33b0871, - 0x7244: 0x002c6288, 0x7245: 0x002c9888, 0x7246: 0x002d0888, 0x7247: 0xc33f00d1, - 0x7248: 0x002d6888, 0x7249: 0xc3410891, 0x724a: 0x002dcc88, 0x724b: 0x002dfe88, - 0x724c: 0xc0030002, 0x724d: 0x002e8288, 0x724e: 0x002e9e88, 0x724f: 0xc3450071, - 0x7250: 0x002f2c88, 0x7251: 0x002e0083, 0x7252: 0x002f7a88, 0x7253: 0xc3490871, - 0x7254: 0x00302c88, 0x7255: 0xc34d0071, 0x7256: 0x0030be88, 0x7257: 0x0030e288, - 0x7258: 0x002d6a83, 0x7259: 0x00310088, 0x725a: 0x00312a88, 0x725b: 0x4003f820, - 0x725c: 0x4004e420, 0x725d: 0x4003fa20, 0x725e: 0x40062420, 0x725f: 0x40021620, - 0x7260: 0x40061e20, 0x7261: 0x402bde20, 0x7262: 0x402c0a20, 0x7263: 0xc3390871, - 0x7264: 0x402c6220, 0x7265: 0x402c9820, 0x7266: 0x402d0820, 0x7267: 0xc33d00d1, - 0x7268: 0x402d6820, 0x7269: 0x402d9a20, 0x726a: 0x402dcc20, 0x726b: 0x402dfe20, - 0x726c: 0xc0000002, 0x726d: 0x402e8220, 0x726e: 0x402e9e20, 0x726f: 0xc3430071, - 0x7270: 0x402f2c20, 0x7271: 0x402e0020, 0x7272: 0x402f7a20, 0x7273: 0xc3470871, - 0x7274: 0x40302c20, 0x7275: 0xc34b0071, 0x7276: 0x4030be20, 0x7277: 0x4030e220, - 0x7278: 0x402d6a20, 0x7279: 0x40310020, 0x727a: 0x40312a20, 0x727b: 0x4003fc20, - 0x727c: 0x40094820, 0x727d: 0x4003fe20, 0x727e: 0x40094c20, 0x727f: 0xa0000000, - // Block 0x1ca, offset 0x7280 - 0x7280: 0xe00008f5, 0x7281: 0xe00008ef, 0x7282: 0xe0000921, 0x7283: 0xe0000969, - 0x7284: 0xe000095b, 0x7285: 0xe000094d, 0x7286: 0xe00009dd, 0x7287: 0x002c3c83, - 0x7288: 0xe0000ae8, 0x7289: 0xe0000ae2, 0x728a: 0xe0000af4, 0x728b: 0xe0000b20, - 0x728c: 0xe00025a2, 0x728d: 0xe000259f, 0x728e: 0xe00025a8, 0x728f: 0xe00025ae, - 0x7290: 0xe0000ab3, 0x7291: 0xe0000d63, 0x7292: 0xe0000d9a, 0x7293: 0xe0000d94, - 0x7294: 0xe0000da6, 0x7295: 0xe0000de6, 0x7296: 0x002ee483, 0x7297: 0x40093e20, - 0x7298: 0xe0000e12, 0x7299: 0xe0000fe1, 0x729a: 0xe0000fdb, 0x729b: 0xe0000fed, - 0x729c: 0x00306e83, 0x729d: 0xe0001102, 0x729e: 0x00318888, 0x729f: 0xe0000f7b, - 0x72a0: 0xe00008f2, 0x72a1: 0xe00008ec, 0x72a2: 0xe000091e, 0x72a3: 0xe0000966, - 0x72a4: 0xe0000958, 0x72a5: 0xe000094a, 0x72a6: 0xe00009d5, 0x72a7: 0x402c3c20, - 0x72a8: 0xe0000ae5, 0x72a9: 0xe0000adf, 0x72aa: 0xe0000af1, 0x72ab: 0xe0000b1d, - 0x72ac: 0xe0000c28, 0x72ad: 0xe0000c22, 0x72ae: 0xe0000c34, 0x72af: 0xe0000c40, - 0x72b0: 0xe0000aad, 0x72b1: 0xe0000d60, 0x72b2: 0xe0000d97, 0x72b3: 0xe0000d91, - 0x72b4: 0xe0000da3, 0x72b5: 0xe0000de3, 0x72b6: 0x402ee420, 0x72b7: 0x40093c20, - 0x72b8: 0xe0000e0f, 0x72b9: 0xe0000fde, 0x72ba: 0xe0000fd8, 0x72bb: 0xe0000fea, - 0x72bc: 0x40306e20, 0x72bd: 0xe00010ff, 0x72be: 0x40318820, 0x72bf: 0xe0001114, - // Block 0x1cb, offset 0x72c0 - 0x72c0: 0xe0000983, 0x72c1: 0xe0000980, 0x72c2: 0xe00008fb, 0x72c3: 0xe00008f8, - 0x72c4: 0xe000097d, 0x72c5: 0xe000097a, 0x72c6: 0xe0000a38, 0x72c7: 0xe0000a35, - 0x72c8: 0xe0000a3e, 0x72c9: 0xe0000a3b, 0x72ca: 0xe0000a4a, 0x72cb: 0xe0000a47, - 0x72cc: 0xe0000a44, 0x72cd: 0xe0000a41, 0x72ce: 0xe0000a86, 0x72cf: 0xe0000a83, - 0x72d0: 0xe0000aaa, 0x72d1: 0xe0000aa7, 0x72d2: 0xe0000b46, 0x72d3: 0xe0000b43, - 0x72d4: 0xe0000aee, 0x72d5: 0xe0000aeb, 0x72d6: 0xe0000b2c, 0x72d7: 0xe0000b29, - 0x72d8: 0xe0000b40, 0x72d9: 0xe0000b3d, 0x72da: 0xe0000b1a, 0x72db: 0xe0000b17, - 0x72dc: 0xe0000bb8, 0x72dd: 0xe0000bb5, 0x72de: 0x002d2483, 0x72df: 0x402d2420, - 0x72e0: 0xe0000bc4, 0x72e1: 0xe0000bc1, 0x72e2: 0xe0000bca, 0x72e3: 0xe0000bc7, - 0x72e4: 0xe0000bee, 0x72e5: 0xe0000beb, 0x72e6: 0xe0000c1b, 0x72e7: 0xe0000c18, - 0x72e8: 0xe00025b5, 0x72e9: 0xe0000c4e, 0x72ea: 0xe00025bb, 0x72eb: 0xe0000c5d, - 0x72ec: 0xe00025a5, 0x72ed: 0xe0000c2e, 0x72ee: 0xe00025b8, 0x72ef: 0xe0000c57, - 0x72f0: 0x002d9a83, 0x72f1: 0x402d9820, 0x72f2: 0xe00025d4, 0x72f3: 0xf0000404, - 0x72f4: 0xe0000c8a, 0x72f5: 0xe0000c87, 0x72f6: 0xe0000c9f, 0x72f7: 0xe0000c9c, - 0x72f8: 0x402f7220, 0x72f9: 0xe0000ccc, 0x72fa: 0xe0000cc9, 0x72fb: 0xe0000cd8, - 0x72fc: 0xe0000cd5, 0x72fd: 0xe0000cd2, 0x72fe: 0xe0000ccf, 0x72ff: 0xe0000d04, - // Block 0x1cc, offset 0x7300 - 0x7300: 0xe0000cfe, 0x7301: 0xe0000cf8, 0x7302: 0xe0000cf5, 0x7303: 0xe0000d51, - 0x7304: 0xe0000d4e, 0x7305: 0xe0000d6f, 0x7306: 0xe0000d6c, 0x7307: 0xe0000d5d, - 0x7308: 0xe0000d5a, 0x7309: 0xf0000404, 0x730a: 0x002eda88, 0x730b: 0x402eda20, - 0x730c: 0xe0000e2e, 0x730d: 0xe0000e2b, 0x730e: 0xe0000da0, 0x730f: 0xe0000d9d, - 0x7310: 0xe0000de0, 0x7311: 0xe0000ddd, 0x7312: 0xe0000e93, 0x7313: 0xe0000e8f, - 0x7314: 0xe0000eca, 0x7315: 0xe0000ec7, 0x7316: 0xe0000edc, 0x7317: 0xe0000ed9, - 0x7318: 0xe0000ed0, 0x7319: 0xe0000ecd, 0x731a: 0xe0000f1f, 0x731b: 0xe0000f1c, - 0x731c: 0xe0000f2d, 0x731d: 0xe0000f2a, 0x731e: 0x002fe883, 0x731f: 0x402fe820, - 0x7320: 0xe0000f33, 0x7321: 0xe0000f30, 0x7322: 0xe0000f99, 0x7323: 0xe0000f96, - 0x7324: 0xe0000f8a, 0x7325: 0xe0000f87, 0x7326: 0x00303688, 0x7327: 0x40303620, - 0x7328: 0xe000102b, 0x7329: 0xe0001028, 0x732a: 0xe000103f, 0x732b: 0xe000103c, - 0x732c: 0xe0000fe7, 0x732d: 0xe0000fe4, 0x732e: 0xe0000ff9, 0x732f: 0xe0000ff6, - 0x7330: 0xe0001025, 0x7331: 0xe0001022, 0x7332: 0xe0001039, 0x7333: 0xe0001036, - 0x7334: 0xe00010d8, 0x7335: 0xe00010d5, 0x7336: 0xe000110e, 0x7337: 0xe000110b, - 0x7338: 0xe0001117, 0x7339: 0xe000113b, 0x733a: 0xe0001138, 0x733b: 0xe000114d, - 0x733c: 0xe000114a, 0x733d: 0xe0001147, 0x733e: 0xe0001144, 0x733f: 0xe0000f64, - // Block 0x1cd, offset 0x7340 - 0x7340: 0x402c1a20, 0x7341: 0x002c2a88, 0x7342: 0x002c3288, 0x7343: 0x402c3220, - 0x7344: 0x0031c488, 0x7345: 0x4031c420, 0x7346: 0x002efa88, 0x7347: 0x002c4e88, - 0x7348: 0x402c4e20, 0x7349: 0x002c7288, 0x734a: 0x002c7a88, 0x734b: 0x002c8488, - 0x734c: 0x402c8420, 0x734d: 0xe000115c, 0x734e: 0x002cae88, 0x734f: 0x002c9a83, - 0x7350: 0x002cc288, 0x7351: 0x002d1688, 0x7352: 0x402d1620, 0x7353: 0x002d4488, - 0x7354: 0x002d5888, 0x7355: 0x402d7820, 0x7356: 0x002dc288, 0x7357: 0x002db688, - 0x7358: 0x002e0a88, 0x7359: 0x402e0a20, 0x735a: 0x402e3820, 0x735b: 0x402e7220, - 0x735c: 0x0030a088, 0x735d: 0x002eb488, 0x735e: 0x402ebc20, 0x735f: 0x002f1088, - 0x7360: 0xe0000e56, 0x7361: 0xe0000e53, 0x7362: 0x002d6088, 0x7363: 0x402d6020, - 0x7364: 0x002f3e88, 0x7365: 0x402f3e20, 0x7366: 0x002f8288, 0x7367: 0x0031b488, - 0x7368: 0x4031b420, 0x7369: 0x00300888, 0x736a: 0x40301220, 0x736b: 0x40304220, - 0x736c: 0x00304a88, 0x736d: 0x40304a20, 0x736e: 0x00305288, 0x736f: 0xe000105f, - 0x7370: 0xe000105c, 0x7371: 0x0030b488, 0x7372: 0x0030cc88, 0x7373: 0x00311888, - 0x7374: 0x40311820, 0x7375: 0x00313488, 0x7376: 0x40313420, 0x7377: 0x00316488, - 0x7378: 0x00316e88, 0x7379: 0x40316e20, 0x737a: 0x40317820, 0x737b: 0x4031a620, - 0x737c: 0x0031bc88, 0x737d: 0x4031bc20, 0x737e: 0xe0000fc9, 0x737f: 0x40319420, - // Block 0x1ce, offset 0x7380 - 0x7380: 0x40321220, 0x7381: 0x40321a20, 0x7382: 0x40322220, 0x7383: 0x40322a20, - 0x7384: 0xe0000ad5, 0x7385: 0xe0000ad1, 0x7386: 0xe0000acd, 0x7387: 0xf0000a0a, - 0x7388: 0xf000040a, 0x7389: 0xf0000404, 0x738a: 0xf0000a0a, 0x738b: 0xf000040a, - 0x738c: 0xf0000404, 0x738d: 0xe0000947, 0x738e: 0xe0000944, 0x738f: 0xe00025ab, - 0x7390: 0xe0000c3a, 0x7391: 0xe0000dcc, 0x7392: 0xe0000dc9, 0x7393: 0xe0000ff3, - 0x7394: 0xe0000ff0, 0x7395: 0xe0002607, 0x7396: 0xe0002604, 0x7397: 0xe00025f5, - 0x7398: 0xe00025f2, 0x7399: 0xe0002601, 0x739a: 0xe00025fe, 0x739b: 0xe00025fb, - 0x739c: 0xe00025f8, 0x739d: 0x402cae20, 0x739e: 0xe0000962, 0x739f: 0xe000095e, - 0x73a0: 0xe0000976, 0x73a1: 0xe0000972, 0x73a2: 0xe00009f4, 0x73a3: 0xe00009ef, - 0x73a4: 0x002d3a88, 0x73a5: 0x402d3a20, 0x73a6: 0xe0000bbe, 0x73a7: 0xe0000bbb, - 0x73a8: 0xe0000c99, 0x73a9: 0xe0000c96, 0x73aa: 0xe0000e20, 0x73ab: 0xe0000e1d, - 0x73ac: 0xe0000e27, 0x73ad: 0xe0000e23, 0x73ae: 0xe0001162, 0x73af: 0xe000115f, - 0x73b0: 0xe0000c8d, 0x73b1: 0xf0000a0a, 0x73b2: 0xf000040a, 0x73b3: 0xf0000404, - 0x73b4: 0xe0000bac, 0x73b5: 0xe0000ba9, 0x73b6: 0x002d7888, 0x73b7: 0x00319488, - 0x73b8: 0xe0000d57, 0x73b9: 0xe0000d54, 0x73ba: 0xe0000954, 0x73bb: 0xe0000950, - 0x73bc: 0xe00009ea, 0x73bd: 0xe00009e5, 0x73be: 0xe0000e19, 0x73bf: 0xe0000e15, - // Block 0x1cf, offset 0x73c0 - 0x73c0: 0xe000098f, 0x73c1: 0xe000098c, 0x73c2: 0xe0000995, 0x73c3: 0xe0000992, - 0x73c4: 0xe0000b62, 0x73c5: 0xe0000b5f, 0x73c6: 0xe0000b68, 0x73c7: 0xe0000b65, - 0x73c8: 0xe00025c1, 0x73c9: 0xe0000c69, 0x73ca: 0xe00025c4, 0x73cb: 0xe0000c6f, - 0x73cc: 0xe0000e4a, 0x73cd: 0xe0000e47, 0x73ce: 0xe0000e50, 0x73cf: 0xe0000e4d, - 0x73d0: 0xe0000ee8, 0x73d1: 0xe0000ee5, 0x73d2: 0xe0000eee, 0x73d3: 0xe0000eeb, - 0x73d4: 0xe0001053, 0x73d5: 0xe0001050, 0x73d6: 0xe0001059, 0x73d7: 0xe0001056, - 0x73d8: 0xe0000f61, 0x73d9: 0xe0000f5e, 0x73da: 0xe0000fa5, 0x73db: 0xe0000fa2, - 0x73dc: 0x00312288, 0x73dd: 0x40312220, 0x73de: 0xe0000bf4, 0x73df: 0xe0000bf1, - 0x73e0: 0x002ebc88, 0x73e1: 0x402c8c20, 0x73e2: 0x002f2288, 0x73e3: 0x402f2220, - 0x73e4: 0x00314088, 0x73e5: 0x40314020, 0x73e6: 0xe000096f, 0x73e7: 0xe000096c, - 0x73e8: 0xe0000b32, 0x73e9: 0xe0000b2f, 0x73ea: 0xe00025ef, 0x73eb: 0xe00025ec, - 0x73ec: 0xe0000dfd, 0x73ed: 0xe0000df9, 0x73ee: 0xe0000e04, 0x73ef: 0xe0000e01, - 0x73f0: 0xe0000e0b, 0x73f1: 0xe0000e07, 0x73f2: 0xe0001129, 0x73f3: 0xe0001126, - 0x73f4: 0x402e5e20, 0x73f5: 0x402ed020, 0x73f6: 0x40305a20, 0x73f7: 0x402dd420, - 0x73f8: 0xe0000abf, 0x73f9: 0xe0000ec4, 0x73fa: 0x002be888, 0x73fb: 0x002c4488, - 0x73fc: 0x402c4420, 0x73fd: 0x002e3888, 0x73fe: 0x00303e88, 0x73ff: 0x402ffc20, - // Block 0x1d0, offset 0x7400 - 0x7400: 0x40315820, 0x7401: 0x0031d488, 0x7402: 0x4031d420, 0x7403: 0x002c1a88, - 0x7404: 0x00307c88, 0x7405: 0x0030da88, 0x7406: 0x002ca288, 0x7407: 0x402ca220, - 0x7408: 0x002dde88, 0x7409: 0x402dde20, 0x740a: 0x002f6a88, 0x740b: 0x402f6a20, - 0x740c: 0x002f8e88, 0x740d: 0x402f8e20, 0x740e: 0x00311088, 0x740f: 0x40311020, - 0x7410: 0x402bf020, 0x7411: 0x402bf820, 0x7412: 0x402c0220, 0x7413: 0x402c2a20, - 0x7414: 0x402efa20, 0x7415: 0x402c5620, 0x7416: 0x402c7220, 0x7417: 0x402c7a20, - 0x7418: 0x402ccc20, 0x7419: 0x402c9a20, 0x741a: 0x402cd420, 0x741b: 0x402cc220, - 0x741c: 0x402cdc20, 0x741d: 0x402ce820, 0x741e: 0x402cf020, 0x741f: 0x402dee20, - 0x7420: 0x402d4420, 0x7421: 0x402d2a20, 0x7422: 0x402d3220, 0x7423: 0x402d5820, - 0x7424: 0x402d0020, 0x7425: 0x40308820, 0x7426: 0x402d8020, 0x7427: 0x402d8e20, - 0x7428: 0x402db620, 0x7429: 0x402dc220, 0x742a: 0x402daa20, 0x742b: 0x402e4220, - 0x742c: 0x402e4a20, 0x742d: 0x402e5420, 0x742e: 0x402e6820, 0x742f: 0x4030a020, - 0x7430: 0x4030ac20, 0x7431: 0x402e9020, 0x7432: 0x402eb420, 0x7433: 0x402ec820, - 0x7434: 0x402ea620, 0x7435: 0x402f1020, 0x7436: 0x402eee20, 0x7437: 0x402f1a20, - 0x7438: 0x402f4c20, 0x7439: 0x402f9820, 0x743a: 0x402fa220, 0x743b: 0x402fac20, - 0x743c: 0x402fb620, 0x743d: 0x402fbe20, 0x743e: 0x402fc620, 0x743f: 0x402fd020, - // Block 0x1d1, offset 0x7440 - 0x7440: 0xe00009b1, 0x7441: 0xe00009ae, 0x7442: 0xe0000a22, 0x7443: 0xe0000a1f, - 0x7444: 0xe0000a28, 0x7445: 0xe0000a25, 0x7446: 0xe0000a2e, 0x7447: 0xe0000a2b, - 0x7448: 0xe0002590, 0x7449: 0xe000258d, 0x744a: 0xe0000a8c, 0x744b: 0xe0000a89, - 0x744c: 0xe0000a98, 0x744d: 0xe0000a95, 0x744e: 0xe0000aa4, 0x744f: 0xe0000aa1, - 0x7450: 0xe0000a92, 0x7451: 0xe0000a8f, 0x7452: 0xe0000a9e, 0x7453: 0xe0000a9b, - 0x7454: 0xe0000b55, 0x7455: 0xe0000b51, 0x7456: 0xe0000b4d, 0x7457: 0xe0000b49, - 0x7458: 0xe0000b7c, 0x7459: 0xe0000b79, 0x745a: 0xe0000b82, 0x745b: 0xe0000b7f, - 0x745c: 0xe0000b39, 0x745d: 0xe0000b35, 0x745e: 0xe0000b8c, 0x745f: 0xe0000b89, - 0x7460: 0xe0000bd0, 0x7461: 0xe0000bcd, 0x7462: 0xe0000c00, 0x7463: 0xe0000bfd, - 0x7464: 0xe0000c0c, 0x7465: 0xe0000c09, 0x7466: 0xe0000bfa, 0x7467: 0xe0000bf7, - 0x7468: 0xe0000c06, 0x7469: 0xe0000c03, 0x746a: 0xe0000c12, 0x746b: 0xe0000c0f, - 0x746c: 0xe00025ca, 0x746d: 0xe0000c7b, 0x746e: 0xe00025b1, 0x746f: 0xe0000c46, - 0x7470: 0xe0000c93, 0x7471: 0xe0000c90, 0x7472: 0xe0000cab, 0x7473: 0xe0000ca8, - 0x7474: 0xe0000cb1, 0x7475: 0xe0000cae, 0x7476: 0xe0000cde, 0x7477: 0xe0000cdb, - 0x7478: 0xe0000ce5, 0x7479: 0xe0000ce1, 0x747a: 0xe0000cf2, 0x747b: 0xe0000cef, - 0x747c: 0xe0000cec, 0x747d: 0xe0000ce9, 0x747e: 0xe0000d1e, 0x747f: 0xe0000d1b, - // Block 0x1d2, offset 0x7480 - 0x7480: 0xe0000d24, 0x7481: 0xe0000d21, 0x7482: 0xe0000d2a, 0x7483: 0xe0000d27, - 0x7484: 0xe0000d69, 0x7485: 0xe0000d66, 0x7486: 0xe0000d7b, 0x7487: 0xe0000d78, - 0x7488: 0xe0000d87, 0x7489: 0xe0000d84, 0x748a: 0xe0000d81, 0x748b: 0xe0000d7e, - 0x748c: 0xe0000ded, 0x748d: 0xe0000de9, 0x748e: 0xe00025e9, 0x748f: 0xe00025e6, - 0x7490: 0xe0000e3d, 0x7491: 0xe0000e39, 0x7492: 0xe0000e35, 0x7493: 0xe0000e31, - 0x7494: 0xe0000ea7, 0x7495: 0xe0000ea4, 0x7496: 0xe0000ead, 0x7497: 0xe0000eaa, - 0x7498: 0xe0000ed6, 0x7499: 0xe0000ed3, 0x749a: 0xe0000ef4, 0x749b: 0xe0000ef1, - 0x749c: 0xe0000efb, 0x749d: 0xe0000ef7, 0x749e: 0xe0000f02, 0x749f: 0xe0000eff, - 0x74a0: 0xe0000f41, 0x74a1: 0xe0000f3e, 0x74a2: 0xe0000f53, 0x74a3: 0xe0000f50, - 0x74a4: 0xe0000f26, 0x74a5: 0xe0000f22, 0x74a6: 0xe0000f3a, 0x74a7: 0xe0000f36, - 0x74a8: 0xe0000f5a, 0x74a9: 0xe0000f56, 0x74aa: 0xe0000f93, 0x74ab: 0xe0000f90, - 0x74ac: 0xe0000f9f, 0x74ad: 0xe0000f9c, 0x74ae: 0xe0000fb1, 0x74af: 0xe0000fae, - 0x74b0: 0xe0000fab, 0x74b1: 0xe0000fa8, 0x74b2: 0xe0001093, 0x74b3: 0xe0001090, - 0x74b4: 0xe000109f, 0x74b5: 0xe000109c, 0x74b6: 0xe0001099, 0x74b7: 0xe0001096, - 0x74b8: 0xe0001032, 0x74b9: 0xe000102e, 0x74ba: 0xe0002607, 0x74bb: 0xe0002604, - 0x74bc: 0xe00010a9, 0x74bd: 0xe00010a6, 0x74be: 0xe00010af, 0x74bf: 0xe00010ac, - // Block 0x1d3, offset 0x74c0 - 0x74c0: 0xe00010d2, 0x74c1: 0xe00010cf, 0x74c2: 0xe00010cc, 0x74c3: 0xe00010c9, - 0x74c4: 0xe00010e1, 0x74c5: 0xe00010de, 0x74c6: 0xe00010e7, 0x74c7: 0xe00010e4, - 0x74c8: 0xe00010ed, 0x74c9: 0xe00010ea, 0x74ca: 0xe000259c, 0x74cb: 0xe0002599, - 0x74cc: 0xe0002596, 0x74cd: 0xe0002593, 0x74ce: 0xe0001123, 0x74cf: 0xe0001120, - 0x74d0: 0xe0001141, 0x74d1: 0xe000113e, 0x74d2: 0xe0001153, 0x74d3: 0xe0001150, - 0x74d4: 0xe0001159, 0x74d5: 0xe0001156, 0x74d6: 0xe0000c15, 0x74d7: 0xe0000f8d, - 0x74d8: 0xe00010db, 0x74d9: 0xe0001111, 0x74da: 0xf0000404, 0x74db: 0xe0000f70, - 0x74dc: 0x40300420, 0x74dd: 0x40300620, 0x74de: 0xe0000f7f, 0x74df: 0x402c9620, - 0x74e0: 0xe000099b, 0x74e1: 0xe0000998, 0x74e2: 0xe0000989, 0x74e3: 0xe0000986, - 0x74e4: 0xe0000928, 0x74e5: 0xe0000924, 0x74e6: 0xe0000930, 0x74e7: 0xe000092c, - 0x74e8: 0xe0000940, 0x74e9: 0xe000093c, 0x74ea: 0xe0000938, 0x74eb: 0xe0000934, - 0x74ec: 0xe00009aa, 0x74ed: 0xe00009a6, 0x74ee: 0xe0000902, 0x74ef: 0xe00008fe, - 0x74f0: 0xe000090a, 0x74f1: 0xe0000906, 0x74f2: 0xe000091a, 0x74f3: 0xe0000916, - 0x74f4: 0xe0000912, 0x74f5: 0xe000090e, 0x74f6: 0xe00009a2, 0x74f7: 0xe000099e, - 0x74f8: 0xe0000b6e, 0x74f9: 0xe0000b6b, 0x74fa: 0xe0000b5c, 0x74fb: 0xe0000b59, - 0x74fc: 0xe0000b26, 0x74fd: 0xe0000b23, 0x74fe: 0xe0000afb, 0x74ff: 0xe0000af7, - // Block 0x1d4, offset 0x7500 - 0x7500: 0xe0000b03, 0x7501: 0xe0000aff, 0x7502: 0xe0000b13, 0x7503: 0xe0000b0f, - 0x7504: 0xe0000b0b, 0x7505: 0xe0000b07, 0x7506: 0xe0000b75, 0x7507: 0xe0000b71, - 0x7508: 0xe00025be, 0x7509: 0xe0000c63, 0x750a: 0xe00025c7, 0x750b: 0xe0000c75, - 0x750c: 0xe0000e84, 0x750d: 0xe0000e81, 0x750e: 0xe0000e44, 0x750f: 0xe0000e41, - 0x7510: 0xe0000dad, 0x7511: 0xe0000da9, 0x7512: 0xe0000db5, 0x7513: 0xe0000db1, - 0x7514: 0xe0000dc5, 0x7515: 0xe0000dc1, 0x7516: 0xe0000dbd, 0x7517: 0xe0000db9, - 0x7518: 0xe0000e8b, 0x7519: 0xe0000e87, 0x751a: 0xe0000e5d, 0x751b: 0xe0000e59, - 0x751c: 0xe0000e65, 0x751d: 0xe0000e61, 0x751e: 0xe0000e75, 0x751f: 0xe0000e71, - 0x7520: 0xe0000e6d, 0x7521: 0xe0000e69, 0x7522: 0xe0000e7d, 0x7523: 0xe0000e79, - 0x7524: 0xe000108d, 0x7525: 0xe000108a, 0x7526: 0xe000104d, 0x7527: 0xe000104a, - 0x7528: 0xe0001066, 0x7529: 0xe0001062, 0x752a: 0xe000106e, 0x752b: 0xe000106a, - 0x752c: 0xe000107e, 0x752d: 0xe000107a, 0x752e: 0xe0001076, 0x752f: 0xe0001072, - 0x7530: 0xe0001086, 0x7531: 0xe0001082, 0x7532: 0xe0001108, 0x7533: 0xe0001105, - 0x7534: 0xe0001135, 0x7535: 0xe0001132, 0x7536: 0xe000112f, 0x7537: 0xe000112c, - 0x7538: 0xe000111d, 0x7539: 0xe000111a, 0x753a: 0xe0000d0a, 0x753b: 0xe0000d07, - 0x753c: 0x0030d888, 0x753d: 0x4030d820, 0x753e: 0x00312088, 0x753f: 0x40312020, - // Block 0x1d5, offset 0x7540 - 0x7540: 0x00093685, 0x7541: 0x40083620, 0x7542: 0x40083820, 0x7543: 0x40083a20, - 0x7544: 0x40083c20, 0x7545: 0x002c628b, 0x7546: 0x002c6285, 0x7547: 0x002c9885, - 0x7548: 0x002d9a85, 0x7549: 0x002dcc85, 0x754a: 0x40083e20, 0x754b: 0x400a6e20, - 0x754c: 0x40084020, 0x754d: 0xe00009c4, 0x754e: 0x402d1e20, 0x754f: 0x40084220, - 0x7550: 0xe00002cb, 0x7551: 0xe00002d3, 0x7552: 0xe00002b2, 0x7553: 0xe00002bb, - 0x7554: 0xe00003cd, 0x7555: 0xe00002c3, 0x7556: 0xe00003d1, 0x7557: 0xe00004ab, - 0x7558: 0xe0000579, 0x7559: 0xe00002c7, 0x755a: 0xe0000640, 0x755b: 0xe00002cf, - 0x755c: 0xe00004af, 0x755d: 0xe0000644, 0x755e: 0xe0000798, 0x755f: 0xf0001e1e, - 0x7560: 0x002d9a8a, 0x7561: 0xe00025cd, 0x7562: 0xe00025d0, 0x7563: 0xe00025da, - 0x7564: 0x0030be8a, 0x7565: 0xe000260a, 0x7566: 0xe000260d, 0x7567: 0xe00010bb, - 0x7568: 0xe00025e0, 0x7569: 0x0030f68a, 0x756a: 0xe0002614, 0x756b: 0xe000261b, - 0x756c: 0x002e228a, 0x756d: 0x002c3a8a, 0x756e: 0x002c628a, 0x756f: 0x002e828a, - 0x7570: 0x002d9a84, 0x7571: 0xf0001f04, 0x7572: 0xf0000404, 0x7573: 0xf0001f04, - 0x7574: 0x0030be84, 0x7575: 0xf0001f04, 0x7576: 0xf0000404, 0x7577: 0xe00010b6, - 0x7578: 0xe00025dd, 0x7579: 0x0030f684, 0x757a: 0xe0002611, 0x757b: 0xe0002617, - 0x757c: 0x002e2284, 0x757d: 0x002c3a84, 0x757e: 0x002c6284, 0x757f: 0x002e8284, - // Block 0x1d6, offset 0x7580 - 0x7580: 0xe0000024, 0x7581: 0xe0000029, 0x7582: 0xe000002e, 0x7583: 0xe0000033, - 0x7584: 0xe0000038, 0x7585: 0xe000003d, 0x7586: 0xe0000042, 0x7587: 0xe0000047, - 0x7588: 0xf0001f04, 0x7589: 0xf0001f04, 0x758a: 0xf0001f04, 0x758b: 0xf0001f04, - 0x758c: 0xf0001f04, 0x758d: 0xf0001f04, 0x758e: 0xf0001f04, 0x758f: 0xf0001f04, - 0x7590: 0xf0001f04, 0x7591: 0xf0000404, 0x7592: 0xf0000404, 0x7593: 0xf0000404, - 0x7594: 0xf0000404, 0x7595: 0xf0000404, 0x7596: 0xf0000404, 0x7597: 0xf0000404, - 0x7598: 0xf0000404, 0x7599: 0xf0000404, 0x759a: 0xf0000404, 0x759b: 0xf0000404, - 0x759c: 0xf0000404, 0x759d: 0xf0000404, 0x759e: 0xf0000404, 0x759f: 0xf0000404, - 0x75a0: 0xf0000404, 0x75a1: 0xf0000404, 0x75a2: 0xf0000404, 0x75a3: 0xf0000404, - 0x75a4: 0xf0000404, 0x75a5: 0xf0000404, 0x75a6: 0xf0000404, 0x75a7: 0xf0000404, - 0x75a8: 0xf0000404, 0x75a9: 0xf0000404, 0x75aa: 0xf0000404, 0x75ab: 0xf0000404, - 0x75ac: 0xe000257a, 0x75ad: 0xf0000404, 0x75ae: 0xf0000404, 0x75af: 0xf0000404, - 0x75b0: 0xf0000404, 0x75b1: 0xf0000404, 0x75b2: 0xf0000404, 0x75b3: 0xe0002582, - 0x75b4: 0xf0000404, 0x75b5: 0xf0000404, 0x75b6: 0x002bde8c, 0x75b7: 0x002c0a8c, - 0x75b8: 0x002c3a8c, 0x75b9: 0x002c628c, 0x75ba: 0x002c988c, 0x75bb: 0x002d088c, - 0x75bc: 0x002d228c, 0x75bd: 0x002d688c, 0x75be: 0x002d9a8c, 0x75bf: 0x002dcc8c, - // Block 0x1d7, offset 0x75c0 - 0x75c0: 0xe000230b, 0x75c1: 0xe00022f8, 0x75c2: 0xe00022fc, 0x75c3: 0xe0002311, - 0x75c4: 0xe0002316, 0x75c5: 0xe000231d, 0x75c6: 0xe0002321, 0x75c7: 0xe0002325, - 0x75c8: 0xe000232b, 0x75c9: 0xf0001c1c, 0x75ca: 0xe0002330, 0x75cb: 0xe000233c, - 0x75cc: 0xe0002340, 0x75cd: 0xe0002337, 0x75ce: 0xe0002346, 0x75cf: 0xe000234b, - 0x75d0: 0xe000234f, 0x75d1: 0xe0002353, 0x75d2: 0xf0001c1c, 0x75d3: 0xe000235e, - 0x75d4: 0xe0002358, 0x75d5: 0xf0001c1c, 0x75d6: 0xe0002363, 0x75d7: 0xe000236d, - 0x75d8: 0xf0001f04, 0x75d9: 0xf0001f04, 0x75da: 0xf0001f04, 0x75db: 0xf0001f04, - 0x75dc: 0xf0001f04, 0x75dd: 0xf0001f04, 0x75de: 0xf0001f04, 0x75df: 0xf0001f04, - 0x75e0: 0xf0001f04, 0x75e1: 0xf0001f04, 0x75e2: 0xf0000404, 0x75e3: 0xf0000404, - 0x75e4: 0xf0000404, 0x75e5: 0xf0000404, 0x75e6: 0xf0000404, 0x75e7: 0xf0000404, - 0x75e8: 0xf0000404, 0x75e9: 0xf0000404, 0x75ea: 0xf0000404, 0x75eb: 0xf0000404, - 0x75ec: 0xf0000404, 0x75ed: 0xf0000404, 0x75ee: 0xf0000404, 0x75ef: 0xf0000404, - 0x75f0: 0xf0000404, 0x75f1: 0xe0000c1e, 0x75f2: 0xf0001c1c, 0x75f3: 0xf0001d1d, - 0x75f4: 0xe0000a31, 0x75f5: 0xf0001d1c, 0x75f6: 0xf0001c1c, 0x75f7: 0xf0001c1c, - 0x75f8: 0xe0000ac2, 0x75f9: 0xe0000ac6, 0x75fa: 0xe00025d7, 0x75fb: 0xf0001c1c, - 0x75fc: 0xf0001c1c, 0x75fd: 0xf0001c1c, 0x75fe: 0xf0001c1c, 0x75ff: 0xe0002431, - // Block 0x1d8, offset 0x7600 - 0x7600: 0xf0001d1c, 0x7601: 0xf0001d1d, 0x7602: 0xe00009b7, 0x7603: 0xe000258a, - 0x7604: 0xf0001c1c, 0x7605: 0xf0001c1c, 0x7606: 0xe0000a66, 0x7607: 0xe0000a7a, - 0x7608: 0xf0001d1c, 0x7609: 0xf0001c1d, 0x760a: 0xf0001c1c, 0x760b: 0xf0001d1d, - 0x760c: 0xf0001c1c, 0x760d: 0xf0001d1d, 0x760e: 0xf0001d1d, 0x760f: 0xf0001c1c, - 0x7610: 0xf0001c1c, 0x7611: 0xf0001c1c, 0x7612: 0xe0000d0d, 0x7613: 0xe00025e3, - 0x7614: 0xf0001c1c, 0x7615: 0xe0000d3a, 0x7616: 0xe0000d46, 0x7617: 0xf0001d1d, - 0x7618: 0xe0000eb0, 0x7619: 0xe0000eb8, 0x761a: 0xf0001d1d, 0x761b: 0xf0001c1c, - 0x761c: 0xf0001c1d, 0x761d: 0xf0001c1d, 0x761e: 0xe00010b2, 0x761f: 0xe00009c8, - 0x7620: 0xf0001f04, 0x7621: 0xf0001f04, 0x7622: 0xf0001f04, 0x7623: 0xf0001f04, - 0x7624: 0xf0001f04, 0x7625: 0xf0001f04, 0x7626: 0xf0001f04, 0x7627: 0xf0001f04, - 0x7628: 0xf0001f04, 0x7629: 0xf0000404, 0x762a: 0xf0000404, 0x762b: 0xf0000404, - 0x762c: 0xf0000404, 0x762d: 0xf0000404, 0x762e: 0xf0000404, 0x762f: 0xf0000404, - 0x7630: 0xf0000404, 0x7631: 0xf0000404, 0x7632: 0xf0000404, 0x7633: 0xf0000404, - 0x7634: 0xf0000404, 0x7635: 0xf0000404, 0x7636: 0xf0000404, 0x7637: 0xf0000404, - 0x7638: 0xf0000404, 0x7639: 0xf0000404, 0x763a: 0xf0000404, 0x763b: 0xf0000404, - 0x763c: 0xf0000404, 0x763d: 0xf0000404, 0x763e: 0xf0000404, 0x763f: 0xe0000bdf, - // Block 0x1d9, offset 0x7640 - 0x7640: 0xf0001f04, 0x7641: 0xf0001f04, 0x7642: 0xf0001f04, 0x7643: 0xf0001f04, - 0x7644: 0xf0001f04, 0x7645: 0xf0001f04, 0x7646: 0xf0001f04, 0x7647: 0xf0001f04, - 0x7648: 0xf0001f04, 0x7649: 0xf0001f04, 0x764a: 0xf0001f04, - 0x7650: 0xf0000a04, 0x7651: 0xf0000a04, 0x7652: 0xf0000a04, 0x7653: 0xf0000a04, - 0x7654: 0xf0000a04, 0x7655: 0xf0000a04, 0x7656: 0xf0000a04, 0x7657: 0xf0000a04, - 0x7658: 0xe0002576, 0x7659: 0xf0000a04, 0x765a: 0xf0000a04, 0x765b: 0xf0000a04, - 0x765c: 0xf0000a04, 0x765d: 0xf0000a04, 0x765e: 0xf0000a04, 0x765f: 0xf0000a04, - 0x7660: 0xe000257e, 0x7661: 0xf0000a04, 0x7662: 0xf0000a04, 0x7663: 0xf0000a04, - 0x7664: 0xf0000a04, 0x7665: 0xf0000a04, 0x7666: 0xf0000a04, 0x7667: 0xe0002586, - 0x7668: 0xf0000a04, 0x7669: 0xf0000a04, 0x766a: 0xf0000a04, 0x766b: 0x002c3a8c, - 0x766c: 0x002f7a8c, 0x766d: 0xf0000c0c, 0x766e: 0xf0000c0c, - 0x7670: 0x002bde9d, 0x7671: 0x002c0a9d, 0x7672: 0x002c3a9d, 0x7673: 0x002c629d, - 0x7674: 0x002c989d, 0x7675: 0x002d089d, 0x7676: 0x002d229d, 0x7677: 0x002d689d, - 0x7678: 0x002d9a9d, 0x7679: 0x002dcc9d, 0x767a: 0x002dfe9d, 0x767b: 0x002e229d, - 0x767c: 0x002e829d, 0x767d: 0x002e9e9d, 0x767e: 0x002ee29d, 0x767f: 0x002f2c9d, - // Block 0x1da, offset 0x7680 - 0x7680: 0xa0000000, 0x7681: 0xa0000000, 0x7682: 0xa0000000, 0x7683: 0xa0000000, - 0x7684: 0xa0000000, 0x7685: 0xa0000000, 0x7686: 0xa0000000, 0x7687: 0xa0000000, - 0x7688: 0xa0000000, 0x7689: 0x40020020, 0x768a: 0x40020220, 0x768b: 0x40020420, - 0x768c: 0x40020620, 0x768d: 0x40020820, 0x768e: 0xa0000000, 0x768f: 0xa0000000, - 0x7690: 0xa0000000, 0x7691: 0xa0000000, 0x7692: 0xa0000000, 0x7693: 0xa0000000, - 0x7694: 0xa0000000, 0x7695: 0xa0000000, 0x7696: 0xa0000000, 0x7697: 0xa0000000, - 0x7698: 0xa0000000, 0x7699: 0xa0000000, 0x769a: 0xa0000000, 0x769b: 0xa0000000, - 0x769c: 0xa0000000, 0x769d: 0xa0000000, 0x769e: 0xa0000000, 0x769f: 0xa0000000, - 0x76a0: 0x40021220, 0x76a1: 0x4002ba20, 0x76a2: 0x4003e020, 0x76a3: 0x4004ea20, - 0x76a4: 0x4027de20, 0x76a5: 0x4004ec20, 0x76a6: 0x4004e620, 0x76a7: 0x4003d220, - 0x76a8: 0x4003f420, 0x76a9: 0x4003f620, 0x76aa: 0x4004d820, 0x76ab: 0x40093820, - 0x76ac: 0x40024020, 0x76ad: 0x40021a20, 0x76ae: 0x4002e420, 0x76af: 0x4004e220, - 0x76b0: 0x4029cc20, 0x76b1: 0x4029ce20, 0x76b2: 0x4029d020, 0x76b3: 0x4029d220, - 0x76b4: 0x4029d420, 0x76b5: 0x4029d620, 0x76b6: 0x4029d820, 0x76b7: 0x4029da20, - 0x76b8: 0x4029dc20, 0x76b9: 0x4029de20, 0x76ba: 0x40026c20, 0x76bb: 0x40026220, - 0x76bc: 0x40094020, 0x76bd: 0xc32f0851, 0x76be: 0x40094420, 0x76bf: 0x4002c420, - // Block 0x1db, offset 0x76c0 - 0x76c0: 0x4004d620, 0x76c1: 0x002bde88, 0x76c2: 0x002c0a88, 0x76c3: 0x002c3a88, - 0x76c4: 0x002c6288, 0x76c5: 0x002c9888, 0x76c6: 0x002d0888, 0x76c7: 0x002d2288, - 0x76c8: 0x002d6888, 0x76c9: 0x002d9a88, 0x76ca: 0x002dcc88, 0x76cb: 0x002dfe88, - 0x76cc: 0xc3520002, 0x76cd: 0x002e8288, 0x76ce: 0x002e9e88, 0x76cf: 0x002ee288, - 0x76d0: 0x002f2c88, 0x76d1: 0x002f5688, 0x76d2: 0x002f7a88, 0x76d3: 0x002fe688, - 0x76d4: 0x00302c88, 0x76d5: 0x00306c88, 0x76d6: 0x0030be88, 0x76d7: 0x0030e288, - 0x76d8: 0x0030f688, 0x76d9: 0x00310088, 0x76da: 0x00312a88, 0x76db: 0x4003f820, - 0x76dc: 0x4004e420, 0x76dd: 0x4003fa20, 0x76de: 0x40062420, 0x76df: 0x40021620, - 0x76e0: 0x40061e20, 0x76e1: 0x402bde20, 0x76e2: 0x402c0a20, 0x76e3: 0x402c3a20, - 0x76e4: 0x402c6220, 0x76e5: 0x402c9820, 0x76e6: 0x402d0820, 0x76e7: 0x402d2220, - 0x76e8: 0x402d6820, 0x76e9: 0x402d9a20, 0x76ea: 0x402dcc20, 0x76eb: 0x402dfe20, - 0x76ec: 0xc34f0002, 0x76ed: 0x402e8220, 0x76ee: 0x402e9e20, 0x76ef: 0x402ee220, - 0x76f0: 0x402f2c20, 0x76f1: 0x402f5620, 0x76f2: 0x402f7a20, 0x76f3: 0x402fe620, - 0x76f4: 0x40302c20, 0x76f5: 0x40306c20, 0x76f6: 0x4030be20, 0x76f7: 0x4030e220, - 0x76f8: 0x4030f620, 0x76f9: 0x40310020, 0x76fa: 0x40312a20, 0x76fb: 0x4003fc20, - 0x76fc: 0x40094820, 0x76fd: 0x4003fe20, 0x76fe: 0x40094c20, 0x76ff: 0xa0000000, - // Block 0x1dc, offset 0x7700 - 0x7700: 0xe0000983, 0x7701: 0xe0000980, 0x7702: 0xe00008fb, 0x7703: 0xe00008f8, - 0x7704: 0xe000097d, 0x7705: 0xe000097a, 0x7706: 0xe0000a38, 0x7707: 0xe0000a35, - 0x7708: 0xe0000a3e, 0x7709: 0xe0000a3b, 0x770a: 0xe0000a4a, 0x770b: 0xe0000a47, - 0x770c: 0xe0000a44, 0x770d: 0xe0000a41, 0x770e: 0xe0000a86, 0x770f: 0xe0000a83, - 0x7710: 0xe0000aaa, 0x7711: 0xe0000aa7, 0x7712: 0xe0000b46, 0x7713: 0xe0000b43, - 0x7714: 0xe0000aee, 0x7715: 0xe0000aeb, 0x7716: 0xe0000b2c, 0x7717: 0xe0000b29, - 0x7718: 0xe0000b40, 0x7719: 0xe0000b3d, 0x771a: 0xe0000b1a, 0x771b: 0xe0000b17, - 0x771c: 0xe0000bb8, 0x771d: 0xe0000bb5, 0x771e: 0xe0000bb2, 0x771f: 0xe0000baf, - 0x7720: 0xe0000bc4, 0x7721: 0xe0000bc1, 0x7722: 0xe0000bca, 0x7723: 0xe0000bc7, - 0x7724: 0xe0000bee, 0x7725: 0xe0000beb, 0x7726: 0xe0000c1b, 0x7727: 0xe0000c18, - 0x7728: 0xe0000c51, 0x7729: 0xe0000c4e, 0x772a: 0xe0000c60, 0x772b: 0xe0000c5d, - 0x772c: 0xe0000c31, 0x772d: 0xe0000c2e, 0x772e: 0xe0000c5a, 0x772f: 0xe0000c57, - 0x7730: 0xe0000c54, 0x7731: 0x402da220, 0x7732: 0xf0000a0a, 0x7733: 0xf0000404, - 0x7734: 0xe0000c8a, 0x7735: 0xe0000c87, 0x7736: 0xe0000c9f, 0x7737: 0xe0000c9c, - 0x7738: 0x402f7220, 0x7739: 0xe0000ccc, 0x773a: 0xe0000cc9, 0x773b: 0xe0000cd8, - 0x773c: 0xe0000cd5, 0x773d: 0xe0000cd2, 0x773e: 0xe0000ccf, 0x773f: 0x002e2483, - // Block 0x1dd, offset 0x7740 - 0x7740: 0x402e2420, 0x7741: 0xe0000cf8, 0x7742: 0xe0000cf5, 0x7743: 0xe0000d51, - 0x7744: 0xe0000d4e, 0x7745: 0xe0000d6f, 0x7746: 0xe0000d6c, 0x7747: 0xe0000d5d, - 0x7748: 0xe0000d5a, 0x7749: 0xf0000404, 0x774a: 0x002eda88, 0x774b: 0x402eda20, - 0x774c: 0xe0000e2e, 0x774d: 0xe0000e2b, 0x774e: 0xe0000da0, 0x774f: 0xe0000d9d, - 0x7750: 0xe0000de0, 0x7751: 0xe0000ddd, 0x7752: 0xe0000e93, 0x7753: 0xe0000e8f, - 0x7754: 0xe0000eca, 0x7755: 0xe0000ec7, 0x7756: 0xe0000edc, 0x7757: 0xe0000ed9, - 0x7758: 0xe0000ed0, 0x7759: 0xe0000ecd, 0x775a: 0xe0000f1f, 0x775b: 0xe0000f1c, - 0x775c: 0xe0000f2d, 0x775d: 0xe0000f2a, 0x775e: 0xe0000f47, 0x775f: 0xe0000f44, - 0x7760: 0xe0000f33, 0x7761: 0xe0000f30, 0x7762: 0xe0000f99, 0x7763: 0xe0000f96, - 0x7764: 0xe0000f8a, 0x7765: 0xe0000f87, 0x7766: 0x00303688, 0x7767: 0x40303620, - 0x7768: 0xe000102b, 0x7769: 0xe0001028, 0x776a: 0xe000103f, 0x776b: 0xe000103c, - 0x776c: 0xe0000fe7, 0x776d: 0xe0000fe4, 0x776e: 0xe0000ff9, 0x776f: 0xe0000ff6, - 0x7770: 0xe0001025, 0x7771: 0xe0001022, 0x7772: 0xe0001039, 0x7773: 0xe0001036, - 0x7774: 0xe00010d8, 0x7775: 0xe00010d5, 0x7776: 0xe000110e, 0x7777: 0xe000110b, - 0x7778: 0xe0001117, 0x7779: 0xe000113b, 0x777a: 0xe0001138, 0x777b: 0xe000114d, - 0x777c: 0xe000114a, 0x777d: 0xe0001147, 0x777e: 0xe0001144, 0x777f: 0xe0000f64, - // Block 0x1de, offset 0x7780 - 0x7780: 0xa0000000, 0x7781: 0xa0000000, 0x7782: 0xa0000000, 0x7783: 0xa0000000, - 0x7784: 0xa0000000, 0x7785: 0xa0000000, 0x7786: 0xa0000000, 0x7787: 0xa0000000, - 0x7788: 0xa0000000, 0x7789: 0x40020020, 0x778a: 0x40020220, 0x778b: 0x40020420, - 0x778c: 0x40020620, 0x778d: 0x40020820, 0x778e: 0xa0000000, 0x778f: 0xa0000000, - 0x7790: 0xa0000000, 0x7791: 0xa0000000, 0x7792: 0xa0000000, 0x7793: 0xa0000000, - 0x7794: 0xa0000000, 0x7795: 0xa0000000, 0x7796: 0xa0000000, 0x7797: 0xa0000000, - 0x7798: 0xa0000000, 0x7799: 0xa0000000, 0x779a: 0xa0000000, 0x779b: 0xa0000000, - 0x779c: 0xa0000000, 0x779d: 0xa0000000, 0x779e: 0xa0000000, 0x779f: 0xa0000000, - 0x77a0: 0x40021220, 0x77a1: 0x4002ba20, 0x77a2: 0x4003e020, 0x77a3: 0x4004ea20, - 0x77a4: 0x4027de20, 0x77a5: 0x4004ec20, 0x77a6: 0x4004e620, 0x77a7: 0x4003d220, - 0x77a8: 0x4003f420, 0x77a9: 0x4003f620, 0x77aa: 0x4004d820, 0x77ab: 0x40093820, - 0x77ac: 0x40024020, 0x77ad: 0x40021a20, 0x77ae: 0x4002e420, 0x77af: 0x4004e220, - 0x77b0: 0x4029cc20, 0x77b1: 0x4029ce20, 0x77b2: 0x4029d020, 0x77b3: 0x4029d220, - 0x77b4: 0x4029d420, 0x77b5: 0x4029d620, 0x77b6: 0x4029d820, 0x77b7: 0x4029da20, - 0x77b8: 0x4029dc20, 0x77b9: 0x4029de20, 0x77ba: 0x40026c20, 0x77bb: 0x40026220, - 0x77bc: 0x40094020, 0x77bd: 0xc32f0851, 0x77be: 0x40094420, 0x77bf: 0x4002c420, - // Block 0x1df, offset 0x77c0 - 0x77c0: 0x4004d620, 0x77c1: 0xc35708b1, 0x77c2: 0x002c0a88, 0x77c3: 0xc33b08d1, - 0x77c4: 0xc35b08d1, 0x77c5: 0xc36008f1, 0x77c6: 0x002d0888, 0x77c7: 0x002d2288, - 0x77c8: 0x002d6888, 0x77c9: 0xc36508b1, 0x77ca: 0x002dcc88, 0x77cb: 0x002dfe88, - 0x77cc: 0xc0030002, 0x77cd: 0x002e8288, 0x77ce: 0xc36908d1, 0x77cf: 0xc34508b1, - 0x77d0: 0x002f2c88, 0x77d1: 0x002f5688, 0x77d2: 0xc36d08d1, 0x77d3: 0xc34908d1, - 0x77d4: 0xc37108d1, 0x77d5: 0xc3760921, 0x77d6: 0x0030be88, 0x77d7: 0x0030e288, - 0x77d8: 0x0030f688, 0x77d9: 0xc37b08b1, 0x77da: 0xc37f08d1, 0x77db: 0x4003f820, - 0x77dc: 0x4004e420, 0x77dd: 0x4003fa20, 0x77de: 0x40062420, 0x77df: 0x40021620, - 0x77e0: 0x40061e20, 0x77e1: 0xc35508b1, 0x77e2: 0x402c0a20, 0x77e3: 0xc33908d1, - 0x77e4: 0xc35908d1, 0x77e5: 0xc35d08f1, 0x77e6: 0x402d0820, 0x77e7: 0x402d2220, - 0x77e8: 0x402d6820, 0x77e9: 0xc36308b1, 0x77ea: 0x402dcc20, 0x77eb: 0x402dfe20, - 0x77ec: 0xc0000002, 0x77ed: 0x402e8220, 0x77ee: 0xc36708d1, 0x77ef: 0xc34308b1, - 0x77f0: 0x402f2c20, 0x77f1: 0x402f5620, 0x77f2: 0xc36b08d1, 0x77f3: 0xc34708d1, - 0x77f4: 0xc36f08d1, 0x77f5: 0xc3730921, 0x77f6: 0x4030be20, 0x77f7: 0x4030e220, - 0x77f8: 0x4030f620, 0x77f9: 0xc37908b1, 0x77fa: 0xc37d08d1, 0x77fb: 0x4003fc20, - 0x77fc: 0x40094820, 0x77fd: 0x4003fe20, 0x77fe: 0x40094c20, 0x77ff: 0xa0000000, - // Block 0x1e0, offset 0x7800 - 0x7800: 0xe00008f5, 0x7801: 0x002be083, 0x7802: 0xe0000921, 0x7803: 0xe0000969, - 0x7804: 0xe000095b, 0x7805: 0xe000094d, 0x7806: 0xe00009dd, 0x7807: 0xe0000a53, - 0x7808: 0xe0000ae8, 0x7809: 0x002c9a83, 0x780a: 0xe0000af4, 0x780b: 0xe0000b20, - 0x780c: 0xe0000c2b, 0x780d: 0x002d9c83, 0x780e: 0xe0000c37, 0x780f: 0xe0000c43, - 0x7810: 0xe0000ab3, 0x7811: 0xe0000d63, 0x7812: 0xe0000d9a, 0x7813: 0x002ee483, - 0x7814: 0xe0000da6, 0x7815: 0xe0000de6, 0x7816: 0xe0000dd2, 0x7817: 0x40093e20, - 0x7818: 0xe0000e12, 0x7819: 0xe0000fe1, 0x781a: 0x00306e83, 0x781b: 0xe0000fed, - 0x781c: 0xe0000fff, 0x781d: 0x00310283, 0x781e: 0x00318888, 0x781f: 0xe0000f7b, - 0x7820: 0xe00008f2, 0x7821: 0x402be020, 0x7822: 0xe000091e, 0x7823: 0xe0000966, - 0x7824: 0xe0000958, 0x7825: 0xe000094a, 0x7826: 0xe00009d5, 0x7827: 0xe0000a4d, - 0x7828: 0xe0000ae5, 0x7829: 0x402c9a20, 0x782a: 0xe0000af1, 0x782b: 0xe0000b1d, - 0x782c: 0xe0000c28, 0x782d: 0x402d9c20, 0x782e: 0xe0000c34, 0x782f: 0xe0000c40, - 0x7830: 0xe0000aad, 0x7831: 0xe0000d60, 0x7832: 0xe0000d97, 0x7833: 0x402ee420, - 0x7834: 0xe0000da3, 0x7835: 0xe0000de3, 0x7836: 0xe0000dcf, 0x7837: 0x40093c20, - 0x7838: 0xe0000e0f, 0x7839: 0xe0000fde, 0x783a: 0x40306e20, 0x783b: 0xe0000fea, - 0x783c: 0xe0000ffc, 0x783d: 0x40310220, 0x783e: 0x40318820, 0x783f: 0xe0001114, - // Block 0x1e1, offset 0x7840 - 0x7840: 0xe0000983, 0x7841: 0xe0000980, 0x7842: 0xe00008fb, 0x7843: 0xe00008f8, - 0x7844: 0xe000097d, 0x7845: 0xe000097a, 0x7846: 0xe0000a38, 0x7847: 0xe0000a35, - 0x7848: 0xe0000a3e, 0x7849: 0xe0000a3b, 0x784a: 0xe0000a4a, 0x784b: 0xe0000a47, - 0x784c: 0x002c3c83, 0x784d: 0x402c3c20, 0x784e: 0x002c6483, 0x784f: 0x402c6420, - 0x7850: 0xe0000aaa, 0x7851: 0xe0000aa7, 0x7852: 0xe0000b46, 0x7853: 0xe0000b43, - 0x7854: 0xe0000aee, 0x7855: 0xe0000aeb, 0x7856: 0xe0000b2c, 0x7857: 0xe0000b29, - 0x7858: 0xe0000b40, 0x7859: 0xe0000b3d, 0x785a: 0x002c9c83, 0x785b: 0x402c9c20, - 0x785c: 0xe0000bb8, 0x785d: 0xe0000bb5, 0x785e: 0xe0000bb2, 0x785f: 0xe0000baf, - 0x7860: 0xe0000bc4, 0x7861: 0xe0000bc1, 0x7862: 0xe0000bca, 0x7863: 0xe0000bc7, - 0x7864: 0xe0000bee, 0x7865: 0xe0000beb, 0x7866: 0xe0000c1b, 0x7867: 0xe0000c18, - 0x7868: 0xe0000c51, 0x7869: 0xe0000c4e, 0x786a: 0xe0000c60, 0x786b: 0xe0000c5d, - 0x786c: 0xe0000c31, 0x786d: 0xe0000c2e, 0x786e: 0xe0000c5a, 0x786f: 0xe0000c57, - 0x7870: 0xe0000c54, 0x7871: 0x402da220, 0x7872: 0xf0000a0a, 0x7873: 0xf0000404, - 0x7874: 0xe0000c8a, 0x7875: 0xe0000c87, 0x7876: 0xe0000c9f, 0x7877: 0xe0000c9c, - 0x7878: 0x402f7220, 0x7879: 0xe0000ccc, 0x787a: 0xe0000cc9, 0x787b: 0xe0000cd8, - 0x787c: 0xe0000cd5, 0x787d: 0xe0000cd2, 0x787e: 0xe0000ccf, 0x787f: 0xe0000d04, - // Block 0x1e2, offset 0x7880 - 0x7880: 0xe0000cfe, 0x7881: 0xe0000cf8, 0x7882: 0xe0000cf5, 0x7883: 0xe0000d51, - 0x7884: 0xe0000d4e, 0x7885: 0xe0000d6f, 0x7886: 0xe0000d6c, 0x7887: 0x002ea083, - 0x7888: 0x402ea020, 0x7889: 0xf0000404, 0x788a: 0x002eda88, 0x788b: 0x402eda20, - 0x788c: 0xe0000e2e, 0x788d: 0xe0000e2b, 0x788e: 0xe0000da0, 0x788f: 0xe0000d9d, - 0x7890: 0xe0000de0, 0x7891: 0xe0000ddd, 0x7892: 0xe0000e93, 0x7893: 0xe0000e8f, - 0x7894: 0xe0000eca, 0x7895: 0xe0000ec7, 0x7896: 0xe0000edc, 0x7897: 0xe0000ed9, - 0x7898: 0x002f7c83, 0x7899: 0x402f7c20, 0x789a: 0xe0000f1f, 0x789b: 0xe0000f1c, - 0x789c: 0xe0000f2d, 0x789d: 0xe0000f2a, 0x789e: 0xe0000f47, 0x789f: 0xe0000f44, - 0x78a0: 0x002fe883, 0x78a1: 0x402fe820, 0x78a2: 0xe0000f99, 0x78a3: 0xe0000f96, - 0x78a4: 0x00302e83, 0x78a5: 0x40302e20, 0x78a6: 0x00303688, 0x78a7: 0x40303620, - 0x78a8: 0xe000102b, 0x78a9: 0xe0001028, 0x78aa: 0xe000103f, 0x78ab: 0xe000103c, - 0x78ac: 0xe0000fe7, 0x78ad: 0xe0000fe4, 0x78ae: 0x00307083, 0x78af: 0x40307020, - 0x78b0: 0xe0001025, 0x78b1: 0xe0001022, 0x78b2: 0xe0001039, 0x78b3: 0xe0001036, - 0x78b4: 0xe00010d8, 0x78b5: 0xe00010d5, 0x78b6: 0xe000110e, 0x78b7: 0xe000110b, - 0x78b8: 0xe0001117, 0x78b9: 0xe000113b, 0x78ba: 0xe0001138, 0x78bb: 0xe000114d, - 0x78bc: 0xe000114a, 0x78bd: 0x00312c83, 0x78be: 0x40312c20, 0x78bf: 0xe0000f64, - // Block 0x1e3, offset 0x78c0 - 0x78c0: 0x40321220, 0x78c1: 0x40321a20, 0x78c2: 0x40322220, 0x78c3: 0x40322a20, - 0x78c4: 0xe0000ad5, 0x78c5: 0xe0000ad1, 0x78c6: 0xe0000acd, 0x78c7: 0xf0000a0a, - 0x78c8: 0xf000040a, 0x78c9: 0xf0000404, 0x78ca: 0xf0000a0a, 0x78cb: 0xf000040a, - 0x78cc: 0xf0000404, 0x78cd: 0xe0000947, 0x78ce: 0xe0000944, 0x78cf: 0xe0000c3d, - 0x78d0: 0xe0000c3a, 0x78d1: 0xe0000dcc, 0x78d2: 0xe0000dc9, 0x78d3: 0xe0000ff3, - 0x78d4: 0xe0000ff0, 0x78d5: 0xe000101e, 0x78d6: 0xe000101a, 0x78d7: 0xe0002658, - 0x78d8: 0xe0002655, 0x78d9: 0xe0001016, 0x78da: 0xe0001012, 0x78db: 0xe000100e, - 0x78dc: 0xe000100a, 0x78dd: 0x402cae20, 0x78de: 0xe0000962, 0x78df: 0xe000095e, - 0x78e0: 0xe0000976, 0x78e1: 0xe0000972, 0x78e2: 0xe00009f4, 0x78e3: 0xe00009ef, - 0x78e4: 0x002d3a88, 0x78e5: 0x402d3a20, 0x78e6: 0xe0000bbe, 0x78e7: 0xe0000bbb, - 0x78e8: 0xe0000c99, 0x78e9: 0xe0000c96, 0x78ea: 0xe0000e20, 0x78eb: 0xe0000e1d, - 0x78ec: 0xe0000e27, 0x78ed: 0xe0000e23, 0x78ee: 0xe0001162, 0x78ef: 0xe000115f, - 0x78f0: 0xe0000c8d, 0x78f1: 0xf0000a0a, 0x78f2: 0xf000040a, 0x78f3: 0xf0000404, - 0x78f4: 0xe0000bac, 0x78f5: 0xe0000ba9, 0x78f6: 0x002d7888, 0x78f7: 0x00319488, - 0x78f8: 0xe0000d57, 0x78f9: 0xe0000d54, 0x78fa: 0xe000262e, 0x78fb: 0xe000262b, - 0x78fc: 0xe00009ea, 0x78fd: 0xe00009e5, 0x78fe: 0xe0000e19, 0x78ff: 0xe0000e15, - // Block 0x1e4, offset 0x7900 - 0x7900: 0xe00009b1, 0x7901: 0xe00009ae, 0x7902: 0xe0000a22, 0x7903: 0xe0000a1f, - 0x7904: 0xe0000a28, 0x7905: 0xe0000a25, 0x7906: 0xe0000a2e, 0x7907: 0xe0000a2b, - 0x7908: 0xe0000a5a, 0x7909: 0xe0000a56, 0x790a: 0xe0000a8c, 0x790b: 0xe0000a89, - 0x790c: 0xe0000a98, 0x790d: 0xe0000a95, 0x790e: 0xe0000aa4, 0x790f: 0xe0000aa1, - 0x7910: 0xe0000a92, 0x7911: 0xe0000a8f, 0x7912: 0xe0000a9e, 0x7913: 0xe0000a9b, - 0x7914: 0xe0000b55, 0x7915: 0xe0000b51, 0x7916: 0xe000263a, 0x7917: 0xe0002637, - 0x7918: 0xe0000b7c, 0x7919: 0xe0000b79, 0x791a: 0xe0000b82, 0x791b: 0xe0000b7f, - 0x791c: 0xe0000b39, 0x791d: 0xe0000b35, 0x791e: 0xe0000b8c, 0x791f: 0xe0000b89, - 0x7920: 0xe0000bd0, 0x7921: 0xe0000bcd, 0x7922: 0xe0000c00, 0x7923: 0xe0000bfd, - 0x7924: 0xe0000c0c, 0x7925: 0xe0000c09, 0x7926: 0xe0000bfa, 0x7927: 0xe0000bf7, - 0x7928: 0xe0000c06, 0x7929: 0xe0000c03, 0x792a: 0xe0000c12, 0x792b: 0xe0000c0f, - 0x792c: 0xe0000c7e, 0x792d: 0xe0000c7b, 0x792e: 0xe0002640, 0x792f: 0xe000263d, - 0x7930: 0xe0000c93, 0x7931: 0xe0000c90, 0x7932: 0xe0000cab, 0x7933: 0xe0000ca8, - 0x7934: 0xe0000cb1, 0x7935: 0xe0000cae, 0x7936: 0xe0000cde, 0x7937: 0xe0000cdb, - 0x7938: 0xe0000ce5, 0x7939: 0xe0000ce1, 0x793a: 0xe0000cf2, 0x793b: 0xe0000cef, - 0x793c: 0xe0000cec, 0x793d: 0xe0000ce9, 0x793e: 0xe0000d1e, 0x793f: 0xe0000d1b, - // Block 0x1e5, offset 0x7940 - 0x7940: 0xe0000d24, 0x7941: 0xe0000d21, 0x7942: 0xe0000d2a, 0x7943: 0xe0000d27, - 0x7944: 0xe0000d69, 0x7945: 0xe0000d66, 0x7946: 0xe0000d7b, 0x7947: 0xe0000d78, - 0x7948: 0xe0000d87, 0x7949: 0xe0000d84, 0x794a: 0xe0000d81, 0x794b: 0xe0000d7e, - 0x794c: 0xe00025e9, 0x794d: 0xe00025e6, 0x794e: 0xe0000df5, 0x794f: 0xe0000df1, - 0x7950: 0xe0000e3d, 0x7951: 0xe0000e39, 0x7952: 0xe00025ef, 0x7953: 0xe00025ec, - 0x7954: 0xe0000ea7, 0x7955: 0xe0000ea4, 0x7956: 0xe0000ead, 0x7957: 0xe0000eaa, - 0x7958: 0xe0000ed6, 0x7959: 0xe0000ed3, 0x795a: 0xe0000ef4, 0x795b: 0xe0000ef1, - 0x795c: 0xe0000efb, 0x795d: 0xe0000ef7, 0x795e: 0xe0000f02, 0x795f: 0xe0000eff, - 0x7960: 0xe0000f41, 0x7961: 0xe0000f3e, 0x7962: 0xe0000f53, 0x7963: 0xe0000f50, - 0x7964: 0xe0000f26, 0x7965: 0xe0000f22, 0x7966: 0xe0002652, 0x7967: 0xe000264f, - 0x7968: 0xe0000f5a, 0x7969: 0xe0000f56, 0x796a: 0xe0000f93, 0x796b: 0xe0000f90, - 0x796c: 0xe0000f9f, 0x796d: 0xe0000f9c, 0x796e: 0xe0000fb1, 0x796f: 0xe0000fae, - 0x7970: 0xe0000fab, 0x7971: 0xe0000fa8, 0x7972: 0xe0001093, 0x7973: 0xe0001090, - 0x7974: 0xe000109f, 0x7975: 0xe000109c, 0x7976: 0xe0001099, 0x7977: 0xe0001096, - 0x7978: 0xe000265e, 0x7979: 0xe000265b, 0x797a: 0xe0001046, 0x797b: 0xe0001042, - 0x797c: 0xe00010a9, 0x797d: 0xe00010a6, 0x797e: 0xe00010af, 0x797f: 0xe00010ac, - // Block 0x1e6, offset 0x7980 - 0x7980: 0xe00010d2, 0x7981: 0xe00010cf, 0x7982: 0xe00010cc, 0x7983: 0xe00010c9, - 0x7984: 0xe00010e1, 0x7985: 0xe00010de, 0x7986: 0xe00010e7, 0x7987: 0xe00010e4, - 0x7988: 0xe00010ed, 0x7989: 0xe00010ea, 0x798a: 0xe00010fc, 0x798b: 0xe00010f9, - 0x798c: 0xe00010f6, 0x798d: 0xe00010f3, 0x798e: 0xe0001123, 0x798f: 0xe0001120, - 0x7990: 0xe0001141, 0x7991: 0xe000113e, 0x7992: 0xe0001153, 0x7993: 0xe0001150, - 0x7994: 0xe0001159, 0x7995: 0xe0001156, 0x7996: 0xe0000c15, 0x7997: 0xe0000f8d, - 0x7998: 0xe00010db, 0x7999: 0xe0001111, 0x799a: 0xf0000404, 0x799b: 0xe0000f70, - 0x799c: 0x40300420, 0x799d: 0x40300620, 0x799e: 0xe0000f7f, 0x799f: 0x402c9620, - 0x79a0: 0xe000099b, 0x79a1: 0xe0000998, 0x79a2: 0xe0000989, 0x79a3: 0xe0000986, - 0x79a4: 0xe0002628, 0x79a5: 0xe0002625, 0x79a6: 0xe0000930, 0x79a7: 0xe000092c, - 0x79a8: 0xe0000940, 0x79a9: 0xe000093c, 0x79aa: 0xe0000938, 0x79ab: 0xe0000934, - 0x79ac: 0xe00009aa, 0x79ad: 0xe00009a6, 0x79ae: 0xe0002622, 0x79af: 0xe000261f, - 0x79b0: 0xe000090a, 0x79b1: 0xe0000906, 0x79b2: 0xe000091a, 0x79b3: 0xe0000916, - 0x79b4: 0xe0000912, 0x79b5: 0xe000090e, 0x79b6: 0xe00009a2, 0x79b7: 0xe000099e, - 0x79b8: 0xe0000b6e, 0x79b9: 0xe0000b6b, 0x79ba: 0xe0000b5c, 0x79bb: 0xe0000b59, - 0x79bc: 0xe0000b26, 0x79bd: 0xe0000b23, 0x79be: 0xe0002634, 0x79bf: 0xe0002631, - // Block 0x1e7, offset 0x79c0 - 0x79c0: 0xe0000b03, 0x79c1: 0xe0000aff, 0x79c2: 0xe0000b13, 0x79c3: 0xe0000b0f, - 0x79c4: 0xe0000b0b, 0x79c5: 0xe0000b07, 0x79c6: 0xe0000b75, 0x79c7: 0xe0000b71, - 0x79c8: 0xe0000c66, 0x79c9: 0xe0000c63, 0x79ca: 0xe0000c78, 0x79cb: 0xe0000c75, - 0x79cc: 0xe0000e84, 0x79cd: 0xe0000e81, 0x79ce: 0xe0000e44, 0x79cf: 0xe0000e41, - 0x79d0: 0xe0002646, 0x79d1: 0xe0002643, 0x79d2: 0xe0000db5, 0x79d3: 0xe0000db1, - 0x79d4: 0xe0000dc5, 0x79d5: 0xe0000dc1, 0x79d6: 0xe0000dbd, 0x79d7: 0xe0000db9, - 0x79d8: 0xe0000e8b, 0x79d9: 0xe0000e87, 0x79da: 0xe000264c, 0x79db: 0xe0002649, - 0x79dc: 0xe0000e65, 0x79dd: 0xe0000e61, 0x79de: 0xe0000e75, 0x79df: 0xe0000e71, - 0x79e0: 0xe0000e6d, 0x79e1: 0xe0000e69, 0x79e2: 0xe0000e7d, 0x79e3: 0xe0000e79, - 0x79e4: 0xe000108d, 0x79e5: 0xe000108a, 0x79e6: 0xe000104d, 0x79e7: 0xe000104a, - 0x79e8: 0xe0002664, 0x79e9: 0xe0002661, 0x79ea: 0xe000106e, 0x79eb: 0xe000106a, - 0x79ec: 0xe000107e, 0x79ed: 0xe000107a, 0x79ee: 0xe0001076, 0x79ef: 0xe0001072, - 0x79f0: 0xe0001086, 0x79f1: 0xe0001082, 0x79f2: 0xe0001108, 0x79f3: 0xe0001105, - 0x79f4: 0xe0001135, 0x79f5: 0xe0001132, 0x79f6: 0xe000112f, 0x79f7: 0xe000112c, - 0x79f8: 0xe000111d, 0x79f9: 0xe000111a, 0x79fa: 0xe0000d0a, 0x79fb: 0xe0000d07, - 0x79fc: 0x0030d888, 0x79fd: 0x4030d820, 0x79fe: 0x00312088, 0x79ff: 0x40312020, - // Block 0x1e8, offset 0x7a00 - 0x7a00: 0xa0000000, 0x7a01: 0xa0000000, 0x7a02: 0xa0000000, 0x7a03: 0xa0000000, - 0x7a04: 0xa0000000, 0x7a05: 0xa0000000, 0x7a06: 0xa0000000, 0x7a07: 0xa0000000, - 0x7a08: 0xa0000000, 0x7a09: 0x40020020, 0x7a0a: 0x40020220, 0x7a0b: 0x40020420, - 0x7a0c: 0x40020620, 0x7a0d: 0x40020820, 0x7a0e: 0xa0000000, 0x7a0f: 0xa0000000, - 0x7a10: 0xa0000000, 0x7a11: 0xa0000000, 0x7a12: 0xa0000000, 0x7a13: 0xa0000000, - 0x7a14: 0xa0000000, 0x7a15: 0xa0000000, 0x7a16: 0xa0000000, 0x7a17: 0xa0000000, - 0x7a18: 0xa0000000, 0x7a19: 0xa0000000, 0x7a1a: 0xa0000000, 0x7a1b: 0xa0000000, - 0x7a1c: 0xa0000000, 0x7a1d: 0xa0000000, 0x7a1e: 0xa0000000, 0x7a1f: 0xa0000000, - 0x7a20: 0x40021220, 0x7a21: 0x4002ba20, 0x7a22: 0x4003e020, 0x7a23: 0x4004ea20, - 0x7a24: 0x4027de20, 0x7a25: 0x4004ec20, 0x7a26: 0x4004e620, 0x7a27: 0x4003d220, - 0x7a28: 0x4003f420, 0x7a29: 0x4003f620, 0x7a2a: 0x4004d820, 0x7a2b: 0x40093820, - 0x7a2c: 0x40024020, 0x7a2d: 0x40021a20, 0x7a2e: 0x4002e420, 0x7a2f: 0x4004e220, - 0x7a30: 0x4029cc20, 0x7a31: 0x4029ce20, 0x7a32: 0x4029d020, 0x7a33: 0x4029d220, - 0x7a34: 0x4029d420, 0x7a35: 0x4029d620, 0x7a36: 0x4029d820, 0x7a37: 0x4029da20, - 0x7a38: 0x4029dc20, 0x7a39: 0x4029de20, 0x7a3a: 0x40026c20, 0x7a3b: 0x40026220, - 0x7a3c: 0x40094020, 0x7a3d: 0xc32f0851, 0x7a3e: 0x40094420, 0x7a3f: 0x4002c420, - // Block 0x1e9, offset 0x7a40 - 0x7a40: 0x4004d620, 0x7a41: 0xc38b09c3, 0x7a42: 0x002c0a88, 0x7a43: 0x002c3a88, - 0x7a44: 0x002c6288, 0x7a45: 0xc3920a11, 0x7a46: 0x002d0888, 0x7a47: 0x002d2288, - 0x7a48: 0x002d6888, 0x7a49: 0x002d9a88, 0x7a4a: 0x002dcc88, 0x7a4b: 0x002dfe88, - 0x7a4c: 0xc0030002, 0x7a4d: 0x002e8288, 0x7a4e: 0x002e9e88, 0x7a4f: 0xc3970951, - 0x7a50: 0x002f2c88, 0x7a51: 0x002f5688, 0x7a52: 0x002f7a88, 0x7a53: 0x002fe688, - 0x7a54: 0x00302c88, 0x7a55: 0xc3840951, 0x7a56: 0x0030be88, 0x7a57: 0x0030e288, - 0x7a58: 0x0030f688, 0x7a59: 0x00310088, 0x7a5a: 0x00312a88, 0x7a5b: 0x4003f820, - 0x7a5c: 0x4004e420, 0x7a5d: 0x4003fa20, 0x7a5e: 0x40062420, 0x7a5f: 0x40021620, - 0x7a60: 0x40061e20, 0x7a61: 0xc3870982, 0x7a62: 0x402c0a20, 0x7a63: 0x402c3a20, - 0x7a64: 0x402c6220, 0x7a65: 0xc3900a11, 0x7a66: 0x402d0820, 0x7a67: 0x402d2220, - 0x7a68: 0x402d6820, 0x7a69: 0x402d9a20, 0x7a6a: 0x402dcc20, 0x7a6b: 0x402dfe20, - 0x7a6c: 0xc0000002, 0x7a6d: 0x402e8220, 0x7a6e: 0x402e9e20, 0x7a6f: 0xc3940951, - 0x7a70: 0x402f2c20, 0x7a71: 0x402f5620, 0x7a72: 0x402f7a20, 0x7a73: 0x402fe620, - 0x7a74: 0x40302c20, 0x7a75: 0xc3810951, 0x7a76: 0x4030be20, 0x7a77: 0x4030e220, - 0x7a78: 0x4030f620, 0x7a79: 0x40310020, 0x7a7a: 0x40312a20, 0x7a7b: 0x4003fc20, - 0x7a7c: 0x40094820, 0x7a7d: 0x4003fe20, 0x7a7e: 0x40094c20, 0x7a7f: 0xa0000000, - // Block 0x1ea, offset 0x7a80 - 0x7a80: 0xe00008f5, 0x7a81: 0xe00008ef, 0x7a82: 0xe0000921, 0x7a83: 0xe0000969, - 0x7a84: 0x00320ca3, 0x7a85: 0x00321083, 0x7a86: 0x00320c83, 0x7a87: 0xe0000a53, - 0x7a88: 0xe0000ae8, 0x7a89: 0xe0000ae2, 0x7a8a: 0xe0000af4, 0x7a8b: 0xe0000b20, - 0x7a8c: 0xe0000c2b, 0x7a8d: 0xe0000c25, 0x7a8e: 0xe0000c37, 0x7a8f: 0xe0000c43, - 0x7a90: 0x002c62c3, 0x7a91: 0xe0000d63, 0x7a92: 0xe0000d9a, 0x7a93: 0xe0000d94, - 0x7a94: 0xe0000da6, 0x7a95: 0xe0000de6, 0x7a96: 0x00320ea3, 0x7a97: 0x40093e20, - 0x7a98: 0x00320e83, 0x7a99: 0xe0000fe1, 0x7a9a: 0xe0000fdb, 0x7a9b: 0xe0000fed, - 0x7a9c: 0x003100a3, 0x7a9d: 0xe0001102, 0x7a9e: 0xe000266d, 0x7a9f: 0xe0000f7b, - 0x7aa0: 0xe00008f2, 0x7aa1: 0xe00008ec, 0x7aa2: 0xe000091e, 0x7aa3: 0xe0000966, - 0x7aa4: 0x40320c21, 0x7aa5: 0x40321020, 0x7aa6: 0x40320c20, 0x7aa7: 0xe0000a4d, - 0x7aa8: 0xe0000ae5, 0x7aa9: 0xe0000adf, 0x7aaa: 0xe0000af1, 0x7aab: 0xe0000b1d, - 0x7aac: 0xe0000c28, 0x7aad: 0xe0000c22, 0x7aae: 0xe0000c34, 0x7aaf: 0xe0000c40, - 0x7ab0: 0x402c6222, 0x7ab1: 0xe0000d60, 0x7ab2: 0xe0000d97, 0x7ab3: 0xe0000d91, - 0x7ab4: 0xe0000da3, 0x7ab5: 0xe0000de3, 0x7ab6: 0x40320e21, 0x7ab7: 0x40093c20, - 0x7ab8: 0x40320e20, 0x7ab9: 0xe0000fde, 0x7aba: 0xe0000fd8, 0x7abb: 0xe0000fea, - 0x7abc: 0x40310021, 0x7abd: 0xe00010ff, 0x7abe: 0xe000266a, 0x7abf: 0xe0001114, - // Block 0x1eb, offset 0x7ac0 - 0x7ac0: 0xe0000983, 0x7ac1: 0xe0000980, 0x7ac2: 0xe00008fb, 0x7ac3: 0xe00008f8, - 0x7ac4: 0xe000097d, 0x7ac5: 0xe000097a, 0x7ac6: 0xe0000a38, 0x7ac7: 0xe0000a35, - 0x7ac8: 0xe0000a3e, 0x7ac9: 0xe0000a3b, 0x7aca: 0xe0000a4a, 0x7acb: 0xe0000a47, - 0x7acc: 0xe0000a44, 0x7acd: 0xe0000a41, 0x7ace: 0xe0000a86, 0x7acf: 0xe0000a83, - 0x7ad0: 0x002c62a3, 0x7ad1: 0x402c6221, 0x7ad2: 0xe0000b46, 0x7ad3: 0xe0000b43, - 0x7ad4: 0xe0000aee, 0x7ad5: 0xe0000aeb, 0x7ad6: 0xe0000b2c, 0x7ad7: 0xe0000b29, - 0x7ad8: 0x00320cc3, 0x7ad9: 0x40320c22, 0x7ada: 0xe0000b1a, 0x7adb: 0xe0000b17, - 0x7adc: 0xe0000bb8, 0x7add: 0xe0000bb5, 0x7ade: 0xe0000bb2, 0x7adf: 0xe0000baf, - 0x7ae0: 0xe0000bc4, 0x7ae1: 0xe0000bc1, 0x7ae2: 0xe0000bca, 0x7ae3: 0xe0000bc7, - 0x7ae4: 0xe0000bee, 0x7ae5: 0xe0000beb, 0x7ae6: 0xe0000c1b, 0x7ae7: 0xe0000c18, - 0x7ae8: 0xe0000c51, 0x7ae9: 0xe0000c4e, 0x7aea: 0xe0000c60, 0x7aeb: 0xe0000c5d, - 0x7aec: 0xe0000c31, 0x7aed: 0xe0000c2e, 0x7aee: 0xe0000c5a, 0x7aef: 0xe0000c57, - 0x7af0: 0xe0000c54, 0x7af1: 0x402da220, 0x7af2: 0xf0000a0a, 0x7af3: 0xf0000404, - 0x7af4: 0xe0000c8a, 0x7af5: 0xe0000c87, 0x7af6: 0xe0000c9f, 0x7af7: 0xe0000c9c, - 0x7af8: 0x402f7220, 0x7af9: 0xe0000ccc, 0x7afa: 0xe0000cc9, 0x7afb: 0xe0000cd8, - 0x7afc: 0xe0000cd5, 0x7afd: 0xe0000cd2, 0x7afe: 0xe0000ccf, 0x7aff: 0xe0000d04, - // Block 0x1ec, offset 0x7b00 - 0x7b00: 0xe0000cfe, 0x7b01: 0xe0000cf8, 0x7b02: 0xe0000cf5, 0x7b03: 0xe0000d51, - 0x7b04: 0xe0000d4e, 0x7b05: 0xe0000d6f, 0x7b06: 0xe0000d6c, 0x7b07: 0xe0000d5d, - 0x7b08: 0xe0000d5a, 0x7b09: 0xf0000404, 0x7b0a: 0x002eda88, 0x7b0b: 0x402eda20, - 0x7b0c: 0xe0000e2e, 0x7b0d: 0xe0000e2b, 0x7b0e: 0xe0000da0, 0x7b0f: 0xe0000d9d, - 0x7b10: 0x00320ec3, 0x7b11: 0x40320e22, 0x7b12: 0x00320ee3, 0x7b13: 0x40320e23, - 0x7b14: 0xe0000eca, 0x7b15: 0xe0000ec7, 0x7b16: 0xe0000edc, 0x7b17: 0xe0000ed9, - 0x7b18: 0xe0000ed0, 0x7b19: 0xe0000ecd, 0x7b1a: 0xe0000f1f, 0x7b1b: 0xe0000f1c, - 0x7b1c: 0xe0000f2d, 0x7b1d: 0xe0000f2a, 0x7b1e: 0xe0000f47, 0x7b1f: 0xe0000f44, - 0x7b20: 0xe0000f33, 0x7b21: 0xe0000f30, 0x7b22: 0xe0000f99, 0x7b23: 0xe0000f96, - 0x7b24: 0xe0000f8a, 0x7b25: 0xe0000f87, 0x7b26: 0x00303688, 0x7b27: 0x40303620, - 0x7b28: 0xe000102b, 0x7b29: 0xe0001028, 0x7b2a: 0xe000103f, 0x7b2b: 0xe000103c, - 0x7b2c: 0xe0000fe7, 0x7b2d: 0xe0000fe4, 0x7b2e: 0xe0000ff9, 0x7b2f: 0xe0000ff6, - 0x7b30: 0x003100c3, 0x7b31: 0x40310022, 0x7b32: 0xe0001039, 0x7b33: 0xe0001036, - 0x7b34: 0xe00010d8, 0x7b35: 0xe00010d5, 0x7b36: 0xe000110e, 0x7b37: 0xe000110b, - 0x7b38: 0xe0001117, 0x7b39: 0xe000113b, 0x7b3a: 0xe0001138, 0x7b3b: 0xe000114d, - 0x7b3c: 0xe000114a, 0x7b3d: 0xe0001147, 0x7b3e: 0xe0001144, 0x7b3f: 0xe0000f64, - // Block 0x1ed, offset 0x7b40 - 0x7b40: 0x40321220, 0x7b41: 0x40321a20, 0x7b42: 0x40322220, 0x7b43: 0x40322a20, - 0x7b44: 0xe0000ad5, 0x7b45: 0xe0000ad1, 0x7b46: 0xe0000acd, 0x7b47: 0xf0000a0a, - 0x7b48: 0xf000040a, 0x7b49: 0xf0000404, 0x7b4a: 0xf0000a0a, 0x7b4b: 0xf000040a, - 0x7b4c: 0xf0000404, 0x7b4d: 0xe0000947, 0x7b4e: 0xe0000944, 0x7b4f: 0xe0000c3d, - 0x7b50: 0xe0000c3a, 0x7b51: 0xe0000dcc, 0x7b52: 0xe0000dc9, 0x7b53: 0xe0000ff3, - 0x7b54: 0xe0000ff0, 0x7b55: 0xe0002685, 0x7b56: 0xe0002682, 0x7b57: 0xe0002673, - 0x7b58: 0xe0002670, 0x7b59: 0xe000267f, 0x7b5a: 0xe000267c, 0x7b5b: 0xe0002679, - 0x7b5c: 0xe0002676, 0x7b5d: 0x402cae20, 0x7b5e: 0xe0002697, 0x7b5f: 0xe0002694, - 0x7b60: 0xe0000976, 0x7b61: 0xe0000972, 0x7b62: 0xe0002691, 0x7b63: 0xe000268e, - 0x7b64: 0x002d3a88, 0x7b65: 0x402d3a20, 0x7b66: 0xe0000bbe, 0x7b67: 0xe0000bbb, - 0x7b68: 0xe0000c99, 0x7b69: 0xe0000c96, 0x7b6a: 0xe0000e20, 0x7b6b: 0xe0000e1d, - 0x7b6c: 0xe0000e27, 0x7b6d: 0xe0000e23, 0x7b6e: 0xe0001162, 0x7b6f: 0xe000115f, - 0x7b70: 0xe0000c8d, 0x7b71: 0xf0000a0a, 0x7b72: 0xf000040a, 0x7b73: 0xf0000404, - 0x7b74: 0xe0000bac, 0x7b75: 0xe0000ba9, 0x7b76: 0x002d7888, 0x7b77: 0x00319488, - 0x7b78: 0xe0000d57, 0x7b79: 0xe0000d54, 0x7b7a: 0xe00026af, 0x7b7b: 0xe00026ac, - 0x7b7c: 0xe000268b, 0x7b7d: 0xe0002688, 0x7b7e: 0xe000269d, 0x7b7f: 0xe000269a, - // Block 0x1ee, offset 0x7b80 - 0x7b80: 0xe000098f, 0x7b81: 0xe000098c, 0x7b82: 0xe0000995, 0x7b83: 0xe0000992, - 0x7b84: 0xe0000b62, 0x7b85: 0xe0000b5f, 0x7b86: 0xe0000b68, 0x7b87: 0xe0000b65, - 0x7b88: 0xe0000c6c, 0x7b89: 0xe0000c69, 0x7b8a: 0xe0000c72, 0x7b8b: 0xe0000c6f, - 0x7b8c: 0xe0000e4a, 0x7b8d: 0xe0000e47, 0x7b8e: 0xe0000e50, 0x7b8f: 0xe0000e4d, - 0x7b90: 0xe0000ee8, 0x7b91: 0xe0000ee5, 0x7b92: 0xe0000eee, 0x7b93: 0xe0000eeb, - 0x7b94: 0xe0001053, 0x7b95: 0xe0001050, 0x7b96: 0xe0001059, 0x7b97: 0xe0001056, - 0x7b98: 0xe0000f61, 0x7b99: 0xe0000f5e, 0x7b9a: 0xe0000fa5, 0x7b9b: 0xe0000fa2, - 0x7b9c: 0x00312288, 0x7b9d: 0x40312220, 0x7b9e: 0xe0000bf4, 0x7b9f: 0xe0000bf1, - 0x7ba0: 0x002ebc88, 0x7ba1: 0x402c8c20, 0x7ba2: 0x002f2288, 0x7ba3: 0x402f2220, - 0x7ba4: 0x00314088, 0x7ba5: 0x40314020, 0x7ba6: 0xe000096f, 0x7ba7: 0xe000096c, - 0x7ba8: 0xe0000b32, 0x7ba9: 0xe0000b2f, 0x7baa: 0xe00026a9, 0x7bab: 0xe00026a6, - 0x7bac: 0xe0000dfd, 0x7bad: 0xe0000df9, 0x7bae: 0xe0000e04, 0x7baf: 0xe0000e01, - 0x7bb0: 0xe0000e0b, 0x7bb1: 0xe0000e07, 0x7bb2: 0xe0001129, 0x7bb3: 0xe0001126, - 0x7bb4: 0x402e5e20, 0x7bb5: 0x402ed020, 0x7bb6: 0x40305a20, 0x7bb7: 0x402dd420, - 0x7bb8: 0xe0000abf, 0x7bb9: 0xe0000ec4, 0x7bba: 0x002be888, 0x7bbb: 0x002c4488, - 0x7bbc: 0x402c4420, 0x7bbd: 0x002e3888, 0x7bbe: 0x00303e88, 0x7bbf: 0x402ffc20, - // Block 0x1ef, offset 0x7bc0 - 0x7bc0: 0x402c2820, 0x7bc1: 0x402c7020, 0x7bc2: 0x402d1420, 0x7bc3: 0x402d4220, - 0x7bc4: 0x402e0820, 0x7bc5: 0x402e5220, 0x7bc6: 0x402e8e20, 0x7bc7: 0x402ec620, - 0x7bc8: 0x402f3c20, 0x7bc9: 0x402faa20, 0x7bca: 0x402ff220, 0x7bcb: 0x40301020, - 0x7bcc: 0x4030ca20, 0x7bcd: 0x4030fe20, 0x7bce: 0x40313e20, 0x7bcf: 0x402bea20, - 0x7bd0: 0x402c0020, 0x7bd1: 0x402c8220, 0x7bd2: 0x402caa20, 0x7bd3: 0x402cca20, - 0x7bd4: 0x402ce420, 0x7bd5: 0x402cc020, 0x7bd6: 0x402dc020, 0x7bd7: 0x402f0620, - 0x7bd8: 0x40302220, 0x7bd9: 0x40308620, 0x7bda: 0x40317620, 0x7bdb: 0x002c0294, - 0x7bdc: 0x002c3a94, 0x7bdd: 0x002c5694, 0x7bde: 0xe0002667, 0x7bdf: 0x002cdc94, - 0x7be0: 0x002d0894, 0x7be1: 0x002dee94, 0x7be2: 0x002d2a94, 0x7be3: 0x00308894, - 0x7be4: 0x002db694, 0x7be5: 0x002dc294, 0x7be6: 0x002daa94, 0x7be7: 0x002dbe94, - 0x7be8: 0x002de694, 0x7be9: 0x002e5494, 0x7bea: 0x002e5294, 0x7beb: 0x002e2a94, - 0x7bec: 0x002e9094, 0x7bed: 0x0030ac94, 0x7bee: 0x002eb494, 0x7bef: 0x002ec894, - 0x7bf0: 0x002ea694, 0x7bf1: 0x002f1094, 0x7bf2: 0x002f4c94, 0x7bf3: 0x002ff494, - 0x7bf4: 0x00300894, 0x7bf5: 0x00304294, 0x7bf6: 0x00307c94, 0x7bf7: 0x0030b494, - 0x7bf8: 0x00307494, 0x7bf9: 0x0030cc94, 0x7bfa: 0x0030da94, 0x7bfb: 0x00312a94, - 0x7bfc: 0x00314894, 0x7bfd: 0x00315094, 0x7bfe: 0x00316494, 0x7bff: 0x00326a94, - // Block 0x1f0, offset 0x7c00 - 0x7c00: 0xe0000d24, 0x7c01: 0xe0000d21, 0x7c02: 0xe0000d2a, 0x7c03: 0xe0000d27, - 0x7c04: 0xe0000d69, 0x7c05: 0xe0000d66, 0x7c06: 0xe0000d7b, 0x7c07: 0xe0000d78, - 0x7c08: 0xe0000d87, 0x7c09: 0xe0000d84, 0x7c0a: 0xe0000d81, 0x7c0b: 0xe0000d7e, - 0x7c0c: 0xe0000ded, 0x7c0d: 0xe0000de9, 0x7c0e: 0xe00026a3, 0x7c0f: 0xe00026a0, - 0x7c10: 0xe0000e3d, 0x7c11: 0xe0000e39, 0x7c12: 0xe0000e35, 0x7c13: 0xe0000e31, - 0x7c14: 0xe0000ea7, 0x7c15: 0xe0000ea4, 0x7c16: 0xe0000ead, 0x7c17: 0xe0000eaa, - 0x7c18: 0xe0000ed6, 0x7c19: 0xe0000ed3, 0x7c1a: 0xe0000ef4, 0x7c1b: 0xe0000ef1, - 0x7c1c: 0xe0000efb, 0x7c1d: 0xe0000ef7, 0x7c1e: 0xe0000f02, 0x7c1f: 0xe0000eff, - 0x7c20: 0xe0000f41, 0x7c21: 0xe0000f3e, 0x7c22: 0xe0000f53, 0x7c23: 0xe0000f50, - 0x7c24: 0xe0000f26, 0x7c25: 0xe0000f22, 0x7c26: 0xe0000f3a, 0x7c27: 0xe0000f36, - 0x7c28: 0xe0000f5a, 0x7c29: 0xe0000f56, 0x7c2a: 0xe0000f93, 0x7c2b: 0xe0000f90, - 0x7c2c: 0xe0000f9f, 0x7c2d: 0xe0000f9c, 0x7c2e: 0xe0000fb1, 0x7c2f: 0xe0000fae, - 0x7c30: 0xe0000fab, 0x7c31: 0xe0000fa8, 0x7c32: 0xe0001093, 0x7c33: 0xe0001090, - 0x7c34: 0xe000109f, 0x7c35: 0xe000109c, 0x7c36: 0xe0001099, 0x7c37: 0xe0001096, - 0x7c38: 0xe0001032, 0x7c39: 0xe000102e, 0x7c3a: 0xe0002685, 0x7c3b: 0xe0002682, - 0x7c3c: 0xe00010a9, 0x7c3d: 0xe00010a6, 0x7c3e: 0xe00010af, 0x7c3f: 0xe00010ac, - // Block 0x1f1, offset 0x7c40 - 0x7c40: 0xe00009bc, 0x7c41: 0xe00009c0, 0x7c42: 0x002c3a8b, 0x7c43: 0xf0000a04, - 0x7c44: 0x40081c20, 0x7c45: 0xe0000a5e, 0x7c46: 0xe0000a62, 0x7c47: 0x002cc28a, - 0x7c48: 0x40081e20, 0x7c49: 0xf0000a04, 0x7c4a: 0x002d2285, 0x7c4b: 0x002d688b, - 0x7c4c: 0x002d688b, 0x7c4d: 0x002d688b, 0x7c4e: 0x002d6885, 0x7c4f: 0xf0000202, - 0x7c50: 0x002d9a8b, 0x7c51: 0x002d9a8b, 0x7c52: 0x002e228b, 0x7c53: 0x002e2285, - 0x7c54: 0x40082020, 0x7c55: 0x002e9e8b, 0x7c56: 0xf000040a, 0x7c57: 0x40082220, - 0x7c58: 0x40082420, 0x7c59: 0x002f2c8b, 0x7c5a: 0x002f568b, 0x7c5b: 0x002f7a8b, - 0x7c5c: 0x002f7a8b, 0x7c5d: 0x002f7a8b, 0x7c5e: 0x40082620, 0x7c5f: 0x40082820, - 0x7c60: 0xf0001414, 0x7c61: 0xe0000fbd, 0x7c62: 0xf0001414, 0x7c63: 0x40082a20, - 0x7c64: 0x00312a8b, 0x7c65: 0x40082c20, 0x7c66: 0x0032a288, 0x7c67: 0x40082e20, - 0x7c68: 0x00312a8b, 0x7c69: 0x40083020, 0x7c6a: 0x002dfe88, 0x7c6b: 0x00321083, - 0x7c6c: 0x002c0a8b, 0x7c6d: 0x002c3a8b, 0x7c6e: 0x40083220, 0x7c6f: 0x002c9885, - 0x7c70: 0x002c988b, 0x7c71: 0x002d088b, 0x7c72: 0x002d1e88, 0x7c73: 0x002e828b, - 0x7c74: 0x002ee285, 0x7c75: 0x00389084, 0x7c76: 0x00389284, 0x7c77: 0x00389484, - 0x7c78: 0x00389684, 0x7c79: 0x002d9a85, 0x7c7a: 0x40083420, 0x7c7b: 0xe0000b95, - 0x7c7c: 0x00327e85, 0x7c7d: 0x00325685, 0x7c7e: 0x0032568b, 0x7c7f: 0x00327e8b, - // Block 0x1f2, offset 0x7c80 - 0x7c80: 0xa0000000, 0x7c81: 0xa0000000, 0x7c82: 0xa0000000, 0x7c83: 0xa0000000, - 0x7c84: 0xa0000000, 0x7c85: 0xa0000000, 0x7c86: 0xa0000000, 0x7c87: 0xa0000000, - 0x7c88: 0xa0000000, 0x7c89: 0x40020020, 0x7c8a: 0x40020220, 0x7c8b: 0x40020420, - 0x7c8c: 0x40020620, 0x7c8d: 0x40020820, 0x7c8e: 0xa0000000, 0x7c8f: 0xa0000000, - 0x7c90: 0xa0000000, 0x7c91: 0xa0000000, 0x7c92: 0xa0000000, 0x7c93: 0xa0000000, - 0x7c94: 0xa0000000, 0x7c95: 0xa0000000, 0x7c96: 0xa0000000, 0x7c97: 0xa0000000, - 0x7c98: 0xa0000000, 0x7c99: 0xa0000000, 0x7c9a: 0xa0000000, 0x7c9b: 0xa0000000, - 0x7c9c: 0xa0000000, 0x7c9d: 0xa0000000, 0x7c9e: 0xa0000000, 0x7c9f: 0xa0000000, - 0x7ca0: 0x40021220, 0x7ca1: 0x4002ba20, 0x7ca2: 0x4003e020, 0x7ca3: 0x4004ea20, - 0x7ca4: 0x4027de20, 0x7ca5: 0x4004ec20, 0x7ca6: 0x4004e620, 0x7ca7: 0x4003d220, - 0x7ca8: 0x4003f420, 0x7ca9: 0x4003f620, 0x7caa: 0x4004d820, 0x7cab: 0x40093820, - 0x7cac: 0x40024020, 0x7cad: 0x40021a20, 0x7cae: 0x4002e420, 0x7caf: 0x4004e220, - 0x7cb0: 0x4029cc20, 0x7cb1: 0x4029ce20, 0x7cb2: 0x4029d020, 0x7cb3: 0x4029d220, - 0x7cb4: 0x4029d420, 0x7cb5: 0x4029d620, 0x7cb6: 0x4029d820, 0x7cb7: 0x4029da20, - 0x7cb8: 0x4029dc20, 0x7cb9: 0x4029de20, 0x7cba: 0x40026c20, 0x7cbb: 0x40026220, - 0x7cbc: 0x40094020, 0x7cbd: 0xc32f0851, 0x7cbe: 0x40094420, 0x7cbf: 0x4002c420, - // Block 0x1f3, offset 0x7cc0 - 0x7cc0: 0x4004d620, 0x7cc1: 0xc39c0071, 0x7cc2: 0x002c0a88, 0x7cc3: 0x002c3a88, - 0x7cc4: 0x002c6288, 0x7cc5: 0x002c9888, 0x7cc6: 0x002d0888, 0x7cc7: 0x002d2288, - 0x7cc8: 0x002d6888, 0x7cc9: 0x002d9a88, 0x7cca: 0x002dcc88, 0x7ccb: 0x002dfe88, - 0x7ccc: 0xc0030002, 0x7ccd: 0x002e8288, 0x7cce: 0x002e9e88, 0x7ccf: 0xc3a00071, - 0x7cd0: 0x002f2c88, 0x7cd1: 0x002f5688, 0x7cd2: 0x002f7a88, 0x7cd3: 0x002fe688, - 0x7cd4: 0x00302c88, 0x7cd5: 0xc3a40071, 0x7cd6: 0x0030be88, 0x7cd7: 0x0030e288, - 0x7cd8: 0x0030f688, 0x7cd9: 0x00310088, 0x7cda: 0x00312a88, 0x7cdb: 0x4003f820, - 0x7cdc: 0x4004e420, 0x7cdd: 0x4003fa20, 0x7cde: 0x40062420, 0x7cdf: 0x40021620, - 0x7ce0: 0x40061e20, 0x7ce1: 0xc39a0071, 0x7ce2: 0x402c0a20, 0x7ce3: 0x402c3a20, - 0x7ce4: 0x402c6220, 0x7ce5: 0x402c9820, 0x7ce6: 0x402d0820, 0x7ce7: 0x402d2220, - 0x7ce8: 0x402d6820, 0x7ce9: 0x402d9a20, 0x7cea: 0x402dcc20, 0x7ceb: 0x402dfe20, - 0x7cec: 0xc0000002, 0x7ced: 0x402e8220, 0x7cee: 0x402e9e20, 0x7cef: 0xc39e0071, - 0x7cf0: 0x402f2c20, 0x7cf1: 0x402f5620, 0x7cf2: 0x402f7a20, 0x7cf3: 0x402fe620, - 0x7cf4: 0x40302c20, 0x7cf5: 0xc3a20071, 0x7cf6: 0x4030be20, 0x7cf7: 0x4030e220, - 0x7cf8: 0x4030f620, 0x7cf9: 0x40310020, 0x7cfa: 0x40312a20, 0x7cfb: 0x4003fc20, - 0x7cfc: 0x40094820, 0x7cfd: 0x4003fe20, 0x7cfe: 0x40094c20, 0x7cff: 0xa0000000, - // Block 0x1f4, offset 0x7d00 - 0x7d00: 0xe00008f5, 0x7d01: 0xe00008ef, 0x7d02: 0xe0000921, 0x7d03: 0xe0000969, - 0x7d04: 0xe00026b5, 0x7d05: 0xe000094d, 0x7d06: 0xe00009dd, 0x7d07: 0xe0000a53, - 0x7d08: 0xe0000ae8, 0x7d09: 0xe0000ae2, 0x7d0a: 0xe0000af4, 0x7d0b: 0xe0000b20, - 0x7d0c: 0xe0000c2b, 0x7d0d: 0xe0000c25, 0x7d0e: 0xe0000c37, 0x7d0f: 0xe0000c43, - 0x7d10: 0xe0000ab3, 0x7d11: 0xe0000d63, 0x7d12: 0xe0000d9a, 0x7d13: 0xe0000d94, - 0x7d14: 0xe0000da6, 0x7d15: 0xe0000de6, 0x7d16: 0xe00026c3, 0x7d17: 0x40093e20, - 0x7d18: 0xe0000e12, 0x7d19: 0xe0000fe1, 0x7d1a: 0xe0000fdb, 0x7d1b: 0xe0000fed, - 0x7d1c: 0xe00026d9, 0x7d1d: 0xe0001102, 0x7d1e: 0x00318888, 0x7d1f: 0xe0000f7b, - 0x7d20: 0xe00008f2, 0x7d21: 0xe00008ec, 0x7d22: 0xe000091e, 0x7d23: 0xe0000966, - 0x7d24: 0xe00026b2, 0x7d25: 0xe000094a, 0x7d26: 0xe00009d5, 0x7d27: 0xe0000a4d, - 0x7d28: 0xe0000ae5, 0x7d29: 0xe0000adf, 0x7d2a: 0xe0000af1, 0x7d2b: 0xe0000b1d, - 0x7d2c: 0xe0000c28, 0x7d2d: 0xe0000c22, 0x7d2e: 0xe0000c34, 0x7d2f: 0xe0000c40, - 0x7d30: 0xe0000aad, 0x7d31: 0xe0000d60, 0x7d32: 0xe0000d97, 0x7d33: 0xe0000d91, - 0x7d34: 0xe0000da3, 0x7d35: 0xe0000de3, 0x7d36: 0xe00026c0, 0x7d37: 0x40093c20, - 0x7d38: 0xe0000e0f, 0x7d39: 0xe0000fde, 0x7d3a: 0xe0000fd8, 0x7d3b: 0xe0000fea, - 0x7d3c: 0xe00026d6, 0x7d3d: 0xe00010ff, 0x7d3e: 0x40318820, 0x7d3f: 0xe0001114, - // Block 0x1f5, offset 0x7d40 - 0x7d40: 0x40321220, 0x7d41: 0x40321a20, 0x7d42: 0x40322220, 0x7d43: 0x40322a20, - 0x7d44: 0xe0000ad5, 0x7d45: 0xe0000ad1, 0x7d46: 0xe0000acd, 0x7d47: 0xf0000a0a, - 0x7d48: 0xf000040a, 0x7d49: 0xf0000404, 0x7d4a: 0xf0000a0a, 0x7d4b: 0xf000040a, - 0x7d4c: 0xf0000404, 0x7d4d: 0xe0000947, 0x7d4e: 0xe0000944, 0x7d4f: 0xe0000c3d, - 0x7d50: 0xe0000c3a, 0x7d51: 0xe0000dcc, 0x7d52: 0xe0000dc9, 0x7d53: 0xe0000ff3, - 0x7d54: 0xe0000ff0, 0x7d55: 0xe00026f8, 0x7d56: 0xe00026f4, 0x7d57: 0xe00026e0, - 0x7d58: 0xe00026dc, 0x7d59: 0xe00026f0, 0x7d5a: 0xe00026ec, 0x7d5b: 0xe00026e8, - 0x7d5c: 0xe00026e4, 0x7d5d: 0x402cae20, 0x7d5e: 0xe00026bc, 0x7d5f: 0xe00026b8, - 0x7d60: 0xe0000976, 0x7d61: 0xe0000972, 0x7d62: 0xe00009f4, 0x7d63: 0xe00009ef, - 0x7d64: 0x002d3a88, 0x7d65: 0x402d3a20, 0x7d66: 0xe0000bbe, 0x7d67: 0xe0000bbb, - 0x7d68: 0xe0000c99, 0x7d69: 0xe0000c96, 0x7d6a: 0xe0000e20, 0x7d6b: 0xe0000e1d, - 0x7d6c: 0xe0000e27, 0x7d6d: 0xe0000e23, 0x7d6e: 0xe0001162, 0x7d6f: 0xe000115f, - 0x7d70: 0xe0000c8d, 0x7d71: 0xf0000a0a, 0x7d72: 0xf000040a, 0x7d73: 0xf0000404, - 0x7d74: 0xe0000bac, 0x7d75: 0xe0000ba9, 0x7d76: 0x002d7888, 0x7d77: 0x00319488, - 0x7d78: 0xe0000d57, 0x7d79: 0xe0000d54, 0x7d7a: 0xe0000954, 0x7d7b: 0xe0000950, - 0x7d7c: 0xe00009ea, 0x7d7d: 0xe00009e5, 0x7d7e: 0xe0000e19, 0x7d7f: 0xe0000e15, - // Block 0x1f6, offset 0x7d80 - 0x7d80: 0xe000098f, 0x7d81: 0xe000098c, 0x7d82: 0xe0000995, 0x7d83: 0xe0000992, - 0x7d84: 0xe0000b62, 0x7d85: 0xe0000b5f, 0x7d86: 0xe0000b68, 0x7d87: 0xe0000b65, - 0x7d88: 0xe0000c6c, 0x7d89: 0xe0000c69, 0x7d8a: 0xe0000c72, 0x7d8b: 0xe0000c6f, - 0x7d8c: 0xe0000e4a, 0x7d8d: 0xe0000e47, 0x7d8e: 0xe0000e50, 0x7d8f: 0xe0000e4d, - 0x7d90: 0xe0000ee8, 0x7d91: 0xe0000ee5, 0x7d92: 0xe0000eee, 0x7d93: 0xe0000eeb, - 0x7d94: 0xe0001053, 0x7d95: 0xe0001050, 0x7d96: 0xe0001059, 0x7d97: 0xe0001056, - 0x7d98: 0xe0000f61, 0x7d99: 0xe0000f5e, 0x7d9a: 0xe0000fa5, 0x7d9b: 0xe0000fa2, - 0x7d9c: 0x00312288, 0x7d9d: 0x40312220, 0x7d9e: 0xe0000bf4, 0x7d9f: 0xe0000bf1, - 0x7da0: 0x002ebc88, 0x7da1: 0x402c8c20, 0x7da2: 0x002f2288, 0x7da3: 0x402f2220, - 0x7da4: 0x00314088, 0x7da5: 0x40314020, 0x7da6: 0xe000096f, 0x7da7: 0xe000096c, - 0x7da8: 0xe0000b32, 0x7da9: 0xe0000b2f, 0x7daa: 0xe00026d2, 0x7dab: 0xe00026ce, - 0x7dac: 0xe0000dfd, 0x7dad: 0xe0000df9, 0x7dae: 0xe0000e04, 0x7daf: 0xe0000e01, - 0x7db0: 0xe0000e0b, 0x7db1: 0xe0000e07, 0x7db2: 0xe0001129, 0x7db3: 0xe0001126, - 0x7db4: 0x402e5e20, 0x7db5: 0x402ed020, 0x7db6: 0x40305a20, 0x7db7: 0x402dd420, - 0x7db8: 0xe0000abf, 0x7db9: 0xe0000ec4, 0x7dba: 0x002be888, 0x7dbb: 0x002c4488, - 0x7dbc: 0x402c4420, 0x7dbd: 0x002e3888, 0x7dbe: 0x00303e88, 0x7dbf: 0x402ffc20, - // Block 0x1f7, offset 0x7dc0 - 0x7dc0: 0xe0000d24, 0x7dc1: 0xe0000d21, 0x7dc2: 0xe0000d2a, 0x7dc3: 0xe0000d27, - 0x7dc4: 0xe0000d69, 0x7dc5: 0xe0000d66, 0x7dc6: 0xe0000d7b, 0x7dc7: 0xe0000d78, - 0x7dc8: 0xe0000d87, 0x7dc9: 0xe0000d84, 0x7dca: 0xe0000d81, 0x7dcb: 0xe0000d7e, - 0x7dcc: 0xe0000ded, 0x7dcd: 0xe0000de9, 0x7dce: 0xe00026ca, 0x7dcf: 0xe00026c6, - 0x7dd0: 0xe0000e3d, 0x7dd1: 0xe0000e39, 0x7dd2: 0xe0000e35, 0x7dd3: 0xe0000e31, - 0x7dd4: 0xe0000ea7, 0x7dd5: 0xe0000ea4, 0x7dd6: 0xe0000ead, 0x7dd7: 0xe0000eaa, - 0x7dd8: 0xe0000ed6, 0x7dd9: 0xe0000ed3, 0x7dda: 0xe0000ef4, 0x7ddb: 0xe0000ef1, - 0x7ddc: 0xe0000efb, 0x7ddd: 0xe0000ef7, 0x7dde: 0xe0000f02, 0x7ddf: 0xe0000eff, - 0x7de0: 0xe0000f41, 0x7de1: 0xe0000f3e, 0x7de2: 0xe0000f53, 0x7de3: 0xe0000f50, - 0x7de4: 0xe0000f26, 0x7de5: 0xe0000f22, 0x7de6: 0xe0000f3a, 0x7de7: 0xe0000f36, - 0x7de8: 0xe0000f5a, 0x7de9: 0xe0000f56, 0x7dea: 0xe0000f93, 0x7deb: 0xe0000f90, - 0x7dec: 0xe0000f9f, 0x7ded: 0xe0000f9c, 0x7dee: 0xe0000fb1, 0x7def: 0xe0000fae, - 0x7df0: 0xe0000fab, 0x7df1: 0xe0000fa8, 0x7df2: 0xe0001093, 0x7df3: 0xe0001090, - 0x7df4: 0xe000109f, 0x7df5: 0xe000109c, 0x7df6: 0xe0001099, 0x7df7: 0xe0001096, - 0x7df8: 0xe0001032, 0x7df9: 0xe000102e, 0x7dfa: 0xe00026f8, 0x7dfb: 0xe00026f4, - 0x7dfc: 0xe00010a9, 0x7dfd: 0xe00010a6, 0x7dfe: 0xe00010af, 0x7dff: 0xe00010ac, - // Block 0x1f8, offset 0x7e00 - 0x7e00: 0xa0000000, 0x7e01: 0xa0000000, 0x7e02: 0xa0000000, 0x7e03: 0xa0000000, - 0x7e04: 0xa0000000, 0x7e05: 0xa0000000, 0x7e06: 0xa0000000, 0x7e07: 0xa0000000, - 0x7e08: 0xa0000000, 0x7e09: 0x40020020, 0x7e0a: 0x40020220, 0x7e0b: 0x40020420, - 0x7e0c: 0x40020620, 0x7e0d: 0x40020820, 0x7e0e: 0xa0000000, 0x7e0f: 0xa0000000, - 0x7e10: 0xa0000000, 0x7e11: 0xa0000000, 0x7e12: 0xa0000000, 0x7e13: 0xa0000000, - 0x7e14: 0xa0000000, 0x7e15: 0xa0000000, 0x7e16: 0xa0000000, 0x7e17: 0xa0000000, - 0x7e18: 0xa0000000, 0x7e19: 0xa0000000, 0x7e1a: 0xa0000000, 0x7e1b: 0xa0000000, - 0x7e1c: 0xa0000000, 0x7e1d: 0xa0000000, 0x7e1e: 0xa0000000, 0x7e1f: 0xa0000000, - 0x7e20: 0x40021220, 0x7e21: 0x4002ba20, 0x7e22: 0x4003e020, 0x7e23: 0x4004ea20, - 0x7e24: 0x4027de20, 0x7e25: 0x4004ec20, 0x7e26: 0x4004e620, 0x7e27: 0x4003d220, - 0x7e28: 0x4003f420, 0x7e29: 0x4003f620, 0x7e2a: 0x4004d820, 0x7e2b: 0x40093820, - 0x7e2c: 0x40024020, 0x7e2d: 0x40021a20, 0x7e2e: 0x4002e420, 0x7e2f: 0x4004e220, - 0x7e30: 0x4029cc20, 0x7e31: 0x4029ce20, 0x7e32: 0x4029d020, 0x7e33: 0x4029d220, - 0x7e34: 0x4029d420, 0x7e35: 0x4029d620, 0x7e36: 0x4029d820, 0x7e37: 0x4029da20, - 0x7e38: 0x4029dc20, 0x7e39: 0x4029de20, 0x7e3a: 0x40026c20, 0x7e3b: 0x40026220, - 0x7e3c: 0x40094020, 0x7e3d: 0xc32f0851, 0x7e3e: 0x40094420, 0x7e3f: 0x4002c420, - // Block 0x1f9, offset 0x7e40 - 0x7e40: 0x4004d620, 0x7e41: 0x002bde88, 0x7e42: 0x002c0a88, 0x7e43: 0x002c3a88, - 0x7e44: 0x002c6288, 0x7e45: 0x002c9888, 0x7e46: 0x002d0888, 0x7e47: 0x002d2288, - 0x7e48: 0x002d6888, 0x7e49: 0x002d9a88, 0x7e4a: 0x002dcc88, 0x7e4b: 0x002dfe88, - 0x7e4c: 0xc0030002, 0x7e4d: 0x002e8288, 0x7e4e: 0xc3690a31, 0x7e4f: 0x002ee288, - 0x7e50: 0x002f2c88, 0x7e51: 0x002f5688, 0x7e52: 0x002f7a88, 0x7e53: 0x002fe688, - 0x7e54: 0x00302c88, 0x7e55: 0x00306c88, 0x7e56: 0x0030be88, 0x7e57: 0x0030e288, - 0x7e58: 0x0030f688, 0x7e59: 0x00310088, 0x7e5a: 0x00312a88, 0x7e5b: 0x4003f820, - 0x7e5c: 0x4004e420, 0x7e5d: 0x4003fa20, 0x7e5e: 0x40062420, 0x7e5f: 0x40021620, - 0x7e60: 0x40061e20, 0x7e61: 0x402bde20, 0x7e62: 0x402c0a20, 0x7e63: 0x402c3a20, - 0x7e64: 0x402c6220, 0x7e65: 0x402c9820, 0x7e66: 0x402d0820, 0x7e67: 0x402d2220, - 0x7e68: 0x402d6820, 0x7e69: 0x402d9a20, 0x7e6a: 0x402dcc20, 0x7e6b: 0x402dfe20, - 0x7e6c: 0xc0000002, 0x7e6d: 0x402e8220, 0x7e6e: 0xc3670a31, 0x7e6f: 0x402ee220, - 0x7e70: 0x402f2c20, 0x7e71: 0x402f5620, 0x7e72: 0x402f7a20, 0x7e73: 0x402fe620, - 0x7e74: 0x40302c20, 0x7e75: 0x40306c20, 0x7e76: 0x4030be20, 0x7e77: 0x4030e220, - 0x7e78: 0x4030f620, 0x7e79: 0x40310020, 0x7e7a: 0x40312a20, 0x7e7b: 0x4003fc20, - 0x7e7c: 0x40094820, 0x7e7d: 0x4003fe20, 0x7e7e: 0x40094c20, 0x7e7f: 0xa0000000, - // Block 0x1fa, offset 0x7e80 - 0x7e80: 0xe00008f5, 0x7e81: 0xe00008ef, 0x7e82: 0xe0000921, 0x7e83: 0xe0000969, - 0x7e84: 0xe000095b, 0x7e85: 0xe000094d, 0x7e86: 0xe00009dd, 0x7e87: 0xe0000a53, - 0x7e88: 0xe0000ae8, 0x7e89: 0xe0000ae2, 0x7e8a: 0xe0000af4, 0x7e8b: 0xe0000b20, - 0x7e8c: 0xe0000c2b, 0x7e8d: 0xe0000c25, 0x7e8e: 0xe0000c37, 0x7e8f: 0xe0000c43, - 0x7e90: 0xe0000ab3, 0x7e91: 0x002ea083, 0x7e92: 0xe0000d9a, 0x7e93: 0xe0000d94, - 0x7e94: 0xe0000da6, 0x7e95: 0xe0000de6, 0x7e96: 0xe0000dd2, 0x7e97: 0x40093e20, - 0x7e98: 0xe0000e12, 0x7e99: 0xe0000fe1, 0x7e9a: 0xe0000fdb, 0x7e9b: 0xe0000fed, - 0x7e9c: 0xe0000fff, 0x7e9d: 0xe0001102, 0x7e9e: 0x00318888, 0x7e9f: 0xe0000f7b, - 0x7ea0: 0xe00008f2, 0x7ea1: 0xe00008ec, 0x7ea2: 0xe000091e, 0x7ea3: 0xe0000966, - 0x7ea4: 0xe0000958, 0x7ea5: 0xe000094a, 0x7ea6: 0xe00009d5, 0x7ea7: 0xe0000a4d, - 0x7ea8: 0xe0000ae5, 0x7ea9: 0xe0000adf, 0x7eaa: 0xe0000af1, 0x7eab: 0xe0000b1d, - 0x7eac: 0xe0000c28, 0x7ead: 0xe0000c22, 0x7eae: 0xe0000c34, 0x7eaf: 0xe0000c40, - 0x7eb0: 0xe0000aad, 0x7eb1: 0x402ea020, 0x7eb2: 0xe0000d97, 0x7eb3: 0xe0000d91, - 0x7eb4: 0xe0000da3, 0x7eb5: 0xe0000de3, 0x7eb6: 0xe0000dcf, 0x7eb7: 0x40093c20, - 0x7eb8: 0xe0000e0f, 0x7eb9: 0xe0000fde, 0x7eba: 0xe0000fd8, 0x7ebb: 0xe0000fea, - 0x7ebc: 0xe0000ffc, 0x7ebd: 0xe00010ff, 0x7ebe: 0x40318820, 0x7ebf: 0xe0001114, - // Block 0x1fb, offset 0x7ec0 - 0x7ec0: 0xa0000000, 0x7ec1: 0xa0000000, 0x7ec2: 0xa0000000, 0x7ec3: 0xa0000000, - 0x7ec4: 0xa0000000, 0x7ec5: 0xa0000000, 0x7ec6: 0xa0000000, 0x7ec7: 0xa0000000, - 0x7ec8: 0xa0000000, 0x7ec9: 0x40020020, 0x7eca: 0x40020220, 0x7ecb: 0x40020420, - 0x7ecc: 0x40020620, 0x7ecd: 0x40020820, 0x7ece: 0xa0000000, 0x7ecf: 0xa0000000, - 0x7ed0: 0xa0000000, 0x7ed1: 0xa0000000, 0x7ed2: 0xa0000000, 0x7ed3: 0xa0000000, - 0x7ed4: 0xa0000000, 0x7ed5: 0xa0000000, 0x7ed6: 0xa0000000, 0x7ed7: 0xa0000000, - 0x7ed8: 0xa0000000, 0x7ed9: 0xa0000000, 0x7eda: 0xa0000000, 0x7edb: 0xa0000000, - 0x7edc: 0xa0000000, 0x7edd: 0xa0000000, 0x7ede: 0xa0000000, 0x7edf: 0xa0000000, - 0x7ee0: 0x40021220, 0x7ee1: 0x4002ba20, 0x7ee2: 0x4003e020, 0x7ee3: 0x4004ea20, - 0x7ee4: 0x4027de20, 0x7ee5: 0x4004ec20, 0x7ee6: 0x4004e620, 0x7ee7: 0x4003d220, - 0x7ee8: 0x4003f420, 0x7ee9: 0x4003f620, 0x7eea: 0x4004d820, 0x7eeb: 0x40093820, - 0x7eec: 0x40024020, 0x7eed: 0x40021a20, 0x7eee: 0x4002e420, 0x7eef: 0x4004e220, - 0x7ef0: 0x4029cc20, 0x7ef1: 0x4029ce20, 0x7ef2: 0x4029d020, 0x7ef3: 0x4029d220, - 0x7ef4: 0x4029d420, 0x7ef5: 0x4029d620, 0x7ef6: 0x4029d820, 0x7ef7: 0x4029da20, - 0x7ef8: 0x4029dc20, 0x7ef9: 0x4029de20, 0x7efa: 0x40026c20, 0x7efb: 0x40026220, - 0x7efc: 0x40094020, 0x7efd: 0xc32f0851, 0x7efe: 0x40094420, 0x7eff: 0x4002c420, - // Block 0x1fc, offset 0x7f00 - 0x7f00: 0x4004d620, 0x7f01: 0xc3a90a51, 0x7f02: 0x002c0a88, 0x7f03: 0x002c3a88, - 0x7f04: 0x002c6288, 0x7f05: 0x002c9888, 0x7f06: 0x002d0888, 0x7f07: 0x002d2288, - 0x7f08: 0x002d6888, 0x7f09: 0x002d9a88, 0x7f0a: 0x002dcc88, 0x7f0b: 0x002dfe88, - 0x7f0c: 0xc0030002, 0x7f0d: 0x002e8288, 0x7f0e: 0x002e9e88, 0x7f0f: 0xc3b00a81, - 0x7f10: 0x002f2c88, 0x7f11: 0x002f5688, 0x7f12: 0x002f7a88, 0x7f13: 0x002fe688, - 0x7f14: 0x00302c88, 0x7f15: 0xc3840951, 0x7f16: 0x0030be88, 0x7f17: 0x0030bea3, - 0x7f18: 0x0030f688, 0x7f19: 0x00310088, 0x7f1a: 0x00312a88, 0x7f1b: 0x4003f820, - 0x7f1c: 0x4004e420, 0x7f1d: 0x4003fa20, 0x7f1e: 0x40062420, 0x7f1f: 0x40021620, - 0x7f20: 0x40061e20, 0x7f21: 0xc3a60a51, 0x7f22: 0x402c0a20, 0x7f23: 0x402c3a20, - 0x7f24: 0x402c6220, 0x7f25: 0x402c9820, 0x7f26: 0x402d0820, 0x7f27: 0x402d2220, - 0x7f28: 0x402d6820, 0x7f29: 0x402d9a20, 0x7f2a: 0x402dcc20, 0x7f2b: 0x402dfe20, - 0x7f2c: 0xc0000002, 0x7f2d: 0x402e8220, 0x7f2e: 0x402e9e20, 0x7f2f: 0xc3ac0a81, - 0x7f30: 0x402f2c20, 0x7f31: 0x402f5620, 0x7f32: 0x402f7a20, 0x7f33: 0x402fe620, - 0x7f34: 0x40302c20, 0x7f35: 0xc3810951, 0x7f36: 0x4030be20, 0x7f37: 0x4030be21, - 0x7f38: 0x4030f620, 0x7f39: 0x40310020, 0x7f3a: 0x40312a20, 0x7f3b: 0x4003fc20, - 0x7f3c: 0x40094820, 0x7f3d: 0x4003fe20, 0x7f3e: 0x40094c20, 0x7f3f: 0xa0000000, - // Block 0x1fd, offset 0x7f40 - 0x7f40: 0xe00008f5, 0x7f41: 0xe00008ef, 0x7f42: 0xe0000921, 0x7f43: 0xe0000969, - 0x7f44: 0x00320e83, 0x7f45: 0x00320c83, 0x7f46: 0x00320ea3, 0x7f47: 0xe0000a53, - 0x7f48: 0xe0000ae8, 0x7f49: 0xe0000ae2, 0x7f4a: 0xe0000af4, 0x7f4b: 0xe0000b20, - 0x7f4c: 0xe0000c2b, 0x7f4d: 0xe0000c25, 0x7f4e: 0xe0000c37, 0x7f4f: 0xe0000c43, - 0x7f50: 0x002c62a3, 0x7f51: 0xe0000d63, 0x7f52: 0xe0000d9a, 0x7f53: 0xe0000d94, - 0x7f54: 0xe0000da6, 0x7f55: 0x003210e3, 0x7f56: 0x00321083, 0x7f57: 0x40093e20, - 0x7f58: 0x003210a3, 0x7f59: 0xe0000fe1, 0x7f5a: 0xe0000fdb, 0x7f5b: 0xe0000fed, - 0x7f5c: 0x003100a3, 0x7f5d: 0xe0001102, 0x7f5e: 0xe0002716, 0x7f5f: 0xe0000f7b, - 0x7f60: 0xe00008f2, 0x7f61: 0xe00008ec, 0x7f62: 0xe000091e, 0x7f63: 0xe0000966, - 0x7f64: 0x40320e20, 0x7f65: 0x40320c20, 0x7f66: 0x40320e21, 0x7f67: 0xe0000a4d, - 0x7f68: 0xe0000ae5, 0x7f69: 0xe0000adf, 0x7f6a: 0xe0000af1, 0x7f6b: 0xe0000b1d, - 0x7f6c: 0xe0000c28, 0x7f6d: 0xe0000c22, 0x7f6e: 0xe0000c34, 0x7f6f: 0xe0000c40, - 0x7f70: 0x402c6221, 0x7f71: 0xe0000d60, 0x7f72: 0xe0000d97, 0x7f73: 0xe0000d91, - 0x7f74: 0xe0000da3, 0x7f75: 0x40321023, 0x7f76: 0x40321020, 0x7f77: 0x40093c20, - 0x7f78: 0x40321021, 0x7f79: 0xe0000fde, 0x7f7a: 0xe0000fd8, 0x7f7b: 0xe0000fea, - 0x7f7c: 0x40310021, 0x7f7d: 0xe00010ff, 0x7f7e: 0xe0002713, 0x7f7f: 0xe0001114, - // Block 0x1fe, offset 0x7f80 - 0x7f80: 0xe0000983, 0x7f81: 0xe0000980, 0x7f82: 0xe00008fb, 0x7f83: 0xe00008f8, - 0x7f84: 0xe000097d, 0x7f85: 0xe000097a, 0x7f86: 0xe0000a38, 0x7f87: 0xe0000a35, - 0x7f88: 0xe0000a3e, 0x7f89: 0xe0000a3b, 0x7f8a: 0xe0000a4a, 0x7f8b: 0xe0000a47, - 0x7f8c: 0xe0000a44, 0x7f8d: 0xe0000a41, 0x7f8e: 0xe0000a86, 0x7f8f: 0xe0000a83, - 0x7f90: 0x002c62c3, 0x7f91: 0x402c6222, 0x7f92: 0xe0000b46, 0x7f93: 0xe0000b43, - 0x7f94: 0xe0000aee, 0x7f95: 0xe0000aeb, 0x7f96: 0xe0000b2c, 0x7f97: 0xe0000b29, - 0x7f98: 0xe0000b40, 0x7f99: 0xe0000b3d, 0x7f9a: 0xe0000b1a, 0x7f9b: 0xe0000b17, - 0x7f9c: 0xe0000bb8, 0x7f9d: 0xe0000bb5, 0x7f9e: 0xe0000bb2, 0x7f9f: 0xe0000baf, - 0x7fa0: 0xe0000bc4, 0x7fa1: 0xe0000bc1, 0x7fa2: 0xe0000bca, 0x7fa3: 0xe0000bc7, - 0x7fa4: 0xe0000bee, 0x7fa5: 0xe0000beb, 0x7fa6: 0xe0000c1b, 0x7fa7: 0xe0000c18, - 0x7fa8: 0xe0000c51, 0x7fa9: 0xe0000c4e, 0x7faa: 0xe0000c60, 0x7fab: 0xe0000c5d, - 0x7fac: 0xe0000c31, 0x7fad: 0xe0000c2e, 0x7fae: 0xe0000c5a, 0x7faf: 0xe0000c57, - 0x7fb0: 0xe0000c54, 0x7fb1: 0x402da220, 0x7fb2: 0xf0000a0a, 0x7fb3: 0xf0000404, - 0x7fb4: 0xe0000c8a, 0x7fb5: 0xe0000c87, 0x7fb6: 0xe0000c9f, 0x7fb7: 0xe0000c9c, - 0x7fb8: 0x402f7220, 0x7fb9: 0xe0000ccc, 0x7fba: 0xe0000cc9, 0x7fbb: 0xe0000cd8, - 0x7fbc: 0xe0000cd5, 0x7fbd: 0xe0000cd2, 0x7fbe: 0xe0000ccf, 0x7fbf: 0xe0000d04, - // Block 0x1ff, offset 0x7fc0 - 0x7fc0: 0xe0000cfe, 0x7fc1: 0xe0000cf8, 0x7fc2: 0xe0000cf5, 0x7fc3: 0xe0000d51, - 0x7fc4: 0xe0000d4e, 0x7fc5: 0xe0000d6f, 0x7fc6: 0xe0000d6c, 0x7fc7: 0xe0000d5d, - 0x7fc8: 0xe0000d5a, 0x7fc9: 0xf0000404, 0x7fca: 0x002e9ea3, 0x7fcb: 0x402e9e21, - 0x7fcc: 0xe0000e2e, 0x7fcd: 0xe0000e2b, 0x7fce: 0xe0000da0, 0x7fcf: 0xe0000d9d, - 0x7fd0: 0x003210c3, 0x7fd1: 0x40321022, 0x7fd2: 0x00321103, 0x7fd3: 0x40321024, - 0x7fd4: 0xe0000eca, 0x7fd5: 0xe0000ec7, 0x7fd6: 0xe0000edc, 0x7fd7: 0xe0000ed9, - 0x7fd8: 0xe0000ed0, 0x7fd9: 0xe0000ecd, 0x7fda: 0xe0000f1f, 0x7fdb: 0xe0000f1c, - 0x7fdc: 0xe0000f2d, 0x7fdd: 0xe0000f2a, 0x7fde: 0xe0000f47, 0x7fdf: 0xe0000f44, - 0x7fe0: 0xe0000f33, 0x7fe1: 0xe0000f30, 0x7fe2: 0xe0000f99, 0x7fe3: 0xe0000f96, - 0x7fe4: 0xe0000f8a, 0x7fe5: 0xe0000f87, 0x7fe6: 0x00303688, 0x7fe7: 0x40303620, - 0x7fe8: 0xe000102b, 0x7fe9: 0xe0001028, 0x7fea: 0xe000103f, 0x7feb: 0xe000103c, - 0x7fec: 0xe0000fe7, 0x7fed: 0xe0000fe4, 0x7fee: 0xe0000ff9, 0x7fef: 0xe0000ff6, - 0x7ff0: 0x003100c3, 0x7ff1: 0x40310022, 0x7ff2: 0xe0001039, 0x7ff3: 0xe0001036, - 0x7ff4: 0xe0002728, 0x7ff5: 0xe0002725, 0x7ff6: 0xe000110e, 0x7ff7: 0xe000110b, - 0x7ff8: 0xe0001117, 0x7ff9: 0xe000113b, 0x7ffa: 0xe0001138, 0x7ffb: 0xe000114d, - 0x7ffc: 0xe000114a, 0x7ffd: 0xe0001147, 0x7ffe: 0xe0001144, 0x7fff: 0xe0000f64, - // Block 0x200, offset 0x8000 - 0x8000: 0x40321220, 0x8001: 0x40321a20, 0x8002: 0x40322220, 0x8003: 0x40322a20, - 0x8004: 0xe0000ad5, 0x8005: 0xe0000ad1, 0x8006: 0xe0000acd, 0x8007: 0xf0000a0a, - 0x8008: 0xf000040a, 0x8009: 0xf0000404, 0x800a: 0xf0000a0a, 0x800b: 0xf000040a, - 0x800c: 0xf0000404, 0x800d: 0xe0000947, 0x800e: 0xe0000944, 0x800f: 0xe0000c3d, - 0x8010: 0xe0000c3a, 0x8011: 0xe0000dcc, 0x8012: 0xe0000dc9, 0x8013: 0xe0000ff3, - 0x8014: 0xe0000ff0, 0x8015: 0xe0002685, 0x8016: 0xe0002682, 0x8017: 0xe0002673, - 0x8018: 0xe0002670, 0x8019: 0xe000267f, 0x801a: 0xe000267c, 0x801b: 0xe0002679, - 0x801c: 0xe0002676, 0x801d: 0x402cae20, 0x801e: 0xe000274c, 0x801f: 0xe0002749, - 0x8020: 0xe0000976, 0x8021: 0xe0000972, 0x8022: 0xe00026a9, 0x8023: 0xe00026a6, - 0x8024: 0x002d3a88, 0x8025: 0x402d3a20, 0x8026: 0xe0000bbe, 0x8027: 0xe0000bbb, - 0x8028: 0xe0000c99, 0x8029: 0xe0000c96, 0x802a: 0xe0000e20, 0x802b: 0xe0000e1d, - 0x802c: 0xe0000e27, 0x802d: 0xe0000e23, 0x802e: 0xe0001162, 0x802f: 0xe000115f, - 0x8030: 0xe0000c8d, 0x8031: 0xf0000a0a, 0x8032: 0xf000040a, 0x8033: 0xf0000404, - 0x8034: 0xe0000bac, 0x8035: 0xe0000ba9, 0x8036: 0x002d7888, 0x8037: 0x00319488, - 0x8038: 0xe0000d57, 0x8039: 0xe0000d54, 0x803a: 0xe000268b, 0x803b: 0xe0002688, - 0x803c: 0xe0002752, 0x803d: 0xe000274f, 0x803e: 0xe000275e, 0x803f: 0xe000275b, - // Block 0x201, offset 0x8040 - 0x8040: 0xe000098f, 0x8041: 0xe000098c, 0x8042: 0xe0000995, 0x8043: 0xe0000992, - 0x8044: 0xe0000b62, 0x8045: 0xe0000b5f, 0x8046: 0xe0000b68, 0x8047: 0xe0000b65, - 0x8048: 0xe0000c6c, 0x8049: 0xe0000c69, 0x804a: 0xe0000c72, 0x804b: 0xe0000c6f, - 0x804c: 0xe0000e4a, 0x804d: 0xe0000e47, 0x804e: 0xe0000e50, 0x804f: 0xe0000e4d, - 0x8050: 0xe0000ee8, 0x8051: 0xe0000ee5, 0x8052: 0xe0000eee, 0x8053: 0xe0000eeb, - 0x8054: 0xe0001053, 0x8055: 0xe0001050, 0x8056: 0xe0001059, 0x8057: 0xe0001056, - 0x8058: 0xe0000f61, 0x8059: 0xe0000f5e, 0x805a: 0xe0000fa5, 0x805b: 0xe0000fa2, - 0x805c: 0x00312288, 0x805d: 0x40312220, 0x805e: 0xe0000bf4, 0x805f: 0xe0000bf1, - 0x8060: 0x002ebc88, 0x8061: 0x402c8c20, 0x8062: 0x002f2288, 0x8063: 0x402f2220, - 0x8064: 0x00314088, 0x8065: 0x40314020, 0x8066: 0xe000096f, 0x8067: 0xe000096c, - 0x8068: 0xe0000b32, 0x8069: 0xe0000b2f, 0x806a: 0xe0002758, 0x806b: 0xe0002755, - 0x806c: 0xe0002776, 0x806d: 0xe0002773, 0x806e: 0xe0000e04, 0x806f: 0xe0000e01, - 0x8070: 0xe0000e0b, 0x8071: 0xe0000e07, 0x8072: 0xe0001129, 0x8073: 0xe0001126, - 0x8074: 0x402e5e20, 0x8075: 0x402ed020, 0x8076: 0x40305a20, 0x8077: 0x402dd420, - 0x8078: 0xe0000abf, 0x8079: 0xe0000ec4, 0x807a: 0x002be888, 0x807b: 0x002c4488, - 0x807c: 0x402c4420, 0x807d: 0x002e3888, 0x807e: 0x00303e88, 0x807f: 0x402ffc20, - // Block 0x202, offset 0x8080 - 0x8080: 0xe0000d24, 0x8081: 0xe0000d21, 0x8082: 0xe0000d2a, 0x8083: 0xe0000d27, - 0x8084: 0xe0000d69, 0x8085: 0xe0000d66, 0x8086: 0xe0000d7b, 0x8087: 0xe0000d78, - 0x8088: 0xe0000d87, 0x8089: 0xe0000d84, 0x808a: 0xe0000d81, 0x808b: 0xe0000d7e, - 0x808c: 0xe0002764, 0x808d: 0xe0002761, 0x808e: 0xe0002770, 0x808f: 0xe000276d, - 0x8090: 0xe0000e3d, 0x8091: 0xe0000e39, 0x8092: 0xe0000e35, 0x8093: 0xe0000e31, - 0x8094: 0xe0000ea7, 0x8095: 0xe0000ea4, 0x8096: 0xe0000ead, 0x8097: 0xe0000eaa, - 0x8098: 0xe0000ed6, 0x8099: 0xe0000ed3, 0x809a: 0xe0000ef4, 0x809b: 0xe0000ef1, - 0x809c: 0xe0000efb, 0x809d: 0xe0000ef7, 0x809e: 0xe0000f02, 0x809f: 0xe0000eff, - 0x80a0: 0xe0000f41, 0x80a1: 0xe0000f3e, 0x80a2: 0xe0000f53, 0x80a3: 0xe0000f50, - 0x80a4: 0xe0000f26, 0x80a5: 0xe0000f22, 0x80a6: 0xe0000f3a, 0x80a7: 0xe0000f36, - 0x80a8: 0xe0000f5a, 0x80a9: 0xe0000f56, 0x80aa: 0xe0000f93, 0x80ab: 0xe0000f90, - 0x80ac: 0xe0000f9f, 0x80ad: 0xe0000f9c, 0x80ae: 0xe0000fb1, 0x80af: 0xe0000fae, - 0x80b0: 0xe0000fab, 0x80b1: 0xe0000fa8, 0x80b2: 0xe0001093, 0x80b3: 0xe0001090, - 0x80b4: 0xe000109f, 0x80b5: 0xe000109c, 0x80b6: 0xe0001099, 0x80b7: 0xe0001096, - 0x80b8: 0xe0001032, 0x80b9: 0xe000102e, 0x80ba: 0xe0002685, 0x80bb: 0xe0002682, - 0x80bc: 0xe00010a9, 0x80bd: 0xe00010a6, 0x80be: 0xe00010af, 0x80bf: 0xe00010ac, - // Block 0x203, offset 0x80c0 - 0x80c0: 0xe0002722, 0x80c1: 0xe000271f, 0x80c2: 0xe000271c, 0x80c3: 0xe0002719, - 0x80c4: 0xe0002731, 0x80c5: 0xe000272e, 0x80c6: 0xe0002737, 0x80c7: 0xe0002734, - 0x80c8: 0xe000273d, 0x80c9: 0xe000273a, 0x80ca: 0xe00010fc, 0x80cb: 0xe00010f9, - 0x80cc: 0xe00010f6, 0x80cd: 0xe00010f3, 0x80ce: 0xe0001123, 0x80cf: 0xe0001120, - 0x80d0: 0xe0001141, 0x80d1: 0xe000113e, 0x80d2: 0xe0001153, 0x80d3: 0xe0001150, - 0x80d4: 0xe0001159, 0x80d5: 0xe0001156, 0x80d6: 0xe0000c15, 0x80d7: 0xe0000f8d, - 0x80d8: 0xe000272b, 0x80d9: 0xe0001111, 0x80da: 0xf0000404, 0x80db: 0xe0000f70, - 0x80dc: 0x40300420, 0x80dd: 0x40300620, 0x80de: 0xe0000f7f, 0x80df: 0x402c9620, - 0x80e0: 0xe000099b, 0x80e1: 0xe0000998, 0x80e2: 0xe0000989, 0x80e3: 0xe0000986, - 0x80e4: 0xe0000928, 0x80e5: 0xe0000924, 0x80e6: 0xe0000930, 0x80e7: 0xe000092c, - 0x80e8: 0xe0000940, 0x80e9: 0xe000093c, 0x80ea: 0xe0000938, 0x80eb: 0xe0000934, - 0x80ec: 0xe00009aa, 0x80ed: 0xe00009a6, 0x80ee: 0xe0000902, 0x80ef: 0xe00008fe, - 0x80f0: 0xe000090a, 0x80f1: 0xe0000906, 0x80f2: 0xe000091a, 0x80f3: 0xe0000916, - 0x80f4: 0xe0000912, 0x80f5: 0xe000090e, 0x80f6: 0xe00009a2, 0x80f7: 0xe000099e, - 0x80f8: 0xe0000b6e, 0x80f9: 0xe0000b6b, 0x80fa: 0xe0000b5c, 0x80fb: 0xe0000b59, - 0x80fc: 0xe0000b26, 0x80fd: 0xe0000b23, 0x80fe: 0xe0000afb, 0x80ff: 0xe0000af7, - // Block 0x204, offset 0x8100 - 0x8100: 0xe0000b03, 0x8101: 0xe0000aff, 0x8102: 0xe0000b13, 0x8103: 0xe0000b0f, - 0x8104: 0xe0000b0b, 0x8105: 0xe0000b07, 0x8106: 0xe0000b75, 0x8107: 0xe0000b71, - 0x8108: 0xe0000c66, 0x8109: 0xe0000c63, 0x810a: 0xe0000c78, 0x810b: 0xe0000c75, - 0x810c: 0xe0000e84, 0x810d: 0xe0000e81, 0x810e: 0xe0000e44, 0x810f: 0xe0000e41, - 0x8110: 0xe0000dad, 0x8111: 0xe0000da9, 0x8112: 0xe0000db5, 0x8113: 0xe0000db1, - 0x8114: 0xe0000dc5, 0x8115: 0xe0000dc1, 0x8116: 0xe000276a, 0x8117: 0xe0002767, - 0x8118: 0xe0000e8b, 0x8119: 0xe0000e87, 0x811a: 0xe0000e5d, 0x811b: 0xe0000e59, - 0x811c: 0xe0000e65, 0x811d: 0xe0000e61, 0x811e: 0xe0000e75, 0x811f: 0xe0000e71, - 0x8120: 0xe000277c, 0x8121: 0xe0002779, 0x8122: 0xe0000e7d, 0x8123: 0xe0000e79, - 0x8124: 0xe000108d, 0x8125: 0xe000108a, 0x8126: 0xe000104d, 0x8127: 0xe000104a, - 0x8128: 0xe0001066, 0x8129: 0xe0001062, 0x812a: 0xe000106e, 0x812b: 0xe000106a, - 0x812c: 0xe000107e, 0x812d: 0xe000107a, 0x812e: 0xe0001076, 0x812f: 0xe0001072, - 0x8130: 0xe0001086, 0x8131: 0xe0001082, 0x8132: 0xe0001108, 0x8133: 0xe0001105, - 0x8134: 0xe0001135, 0x8135: 0xe0001132, 0x8136: 0xe000112f, 0x8137: 0xe000112c, - 0x8138: 0xe000111d, 0x8139: 0xe000111a, 0x813a: 0xe0000d0a, 0x813b: 0xe0000d07, - 0x813c: 0x0030d888, 0x813d: 0x4030d820, 0x813e: 0x00312088, 0x813f: 0x40312020, - // Block 0x205, offset 0x8140 - 0x8140: 0xe00009bc, 0x8141: 0xe00009c0, 0x8142: 0x002c3a8b, 0x8143: 0xf0000a04, - 0x8144: 0x40081c20, 0x8145: 0xe0000a5e, 0x8146: 0xe0000a62, 0x8147: 0x002cc28a, - 0x8148: 0x40081e20, 0x8149: 0xf0000a04, 0x814a: 0x002d2285, 0x814b: 0x002d688b, - 0x814c: 0x002d688b, 0x814d: 0x002d688b, 0x814e: 0x002d6885, 0x814f: 0xf0000202, - 0x8150: 0x002d9a8b, 0x8151: 0x002d9a8b, 0x8152: 0x002e228b, 0x8153: 0x002e2285, - 0x8154: 0x40082020, 0x8155: 0x002e9e8b, 0x8156: 0xf000040a, 0x8157: 0x40082220, - 0x8158: 0x40082420, 0x8159: 0x002f2c8b, 0x815a: 0x002f568b, 0x815b: 0x002f7a8b, - 0x815c: 0x002f7a8b, 0x815d: 0x002f7a8b, 0x815e: 0x40082620, 0x815f: 0x40082820, - 0x8160: 0xf0001414, 0x8161: 0xe0000fbd, 0x8162: 0xf0001414, 0x8163: 0x40082a20, - 0x8164: 0x00312a8b, 0x8165: 0x40082c20, 0x8166: 0x0032a288, 0x8167: 0x40082e20, - 0x8168: 0x00312a8b, 0x8169: 0x40083020, 0x816a: 0x002dfe88, 0x816b: 0x00320c83, - 0x816c: 0x002c0a8b, 0x816d: 0x002c3a8b, 0x816e: 0x40083220, 0x816f: 0x002c9885, - 0x8170: 0x002c988b, 0x8171: 0x002d088b, 0x8172: 0x002d1e88, 0x8173: 0x002e828b, - 0x8174: 0x002ee285, 0x8175: 0x00389084, 0x8176: 0x00389284, 0x8177: 0x00389484, - 0x8178: 0x00389684, 0x8179: 0x002d9a85, 0x817a: 0x40083420, 0x817b: 0xe0000b95, - 0x817c: 0x00327e85, 0x817d: 0x00325685, 0x817e: 0x0032568b, 0x817f: 0x00327e8b, - // Block 0x206, offset 0x8180 - 0x8180: 0xe0000024, 0x8181: 0xe0000029, 0x8182: 0xe000002e, 0x8183: 0xe0000033, - 0x8184: 0xe0000038, 0x8185: 0xe000003d, 0x8186: 0xe0000042, 0x8187: 0xe0000047, - 0x8188: 0xf0001f04, 0x8189: 0xf0001f04, 0x818a: 0xf0001f04, 0x818b: 0xf0001f04, - 0x818c: 0xf0001f04, 0x818d: 0xf0001f04, 0x818e: 0xf0001f04, 0x818f: 0xf0001f04, - 0x8190: 0xf0001f04, 0x8191: 0xf0000404, 0x8192: 0xf0000404, 0x8193: 0xf0000404, - 0x8194: 0xf0000404, 0x8195: 0xf0000404, 0x8196: 0xf0000404, 0x8197: 0xf0000404, - 0x8198: 0xf0000404, 0x8199: 0xf0000404, 0x819a: 0xf0000404, 0x819b: 0xf0000404, - 0x819c: 0xf0000404, 0x819d: 0xf0000404, 0x819e: 0xf0000404, 0x819f: 0xf0000404, - 0x81a0: 0xf0000404, 0x81a1: 0xf0000404, 0x81a2: 0xf0000404, 0x81a3: 0xf0000404, - 0x81a4: 0xf0000404, 0x81a5: 0xf0000404, 0x81a6: 0xf0000404, 0x81a7: 0xf0000404, - 0x81a8: 0xf0000404, 0x81a9: 0xf0000404, 0x81aa: 0xf0000404, 0x81ab: 0xf0000404, - 0x81ac: 0xf0000404, 0x81ad: 0xf0000404, 0x81ae: 0xf0000404, 0x81af: 0xf0000404, - 0x81b0: 0xf0000404, 0x81b1: 0xf0000404, 0x81b2: 0xe00026fc, 0x81b3: 0xf0000404, - 0x81b4: 0xf0000404, 0x81b5: 0xf0000404, 0x81b6: 0x002bde8c, 0x81b7: 0x002c0a8c, - 0x81b8: 0x002c3a8c, 0x81b9: 0x002c628c, 0x81ba: 0x002c988c, 0x81bb: 0x002d088c, - 0x81bc: 0x002d228c, 0x81bd: 0x002d688c, 0x81be: 0x002d9a8c, 0x81bf: 0x002dcc8c, - // Block 0x207, offset 0x81c0 - 0x81c0: 0xf0001d1c, 0x81c1: 0xf0001d1c, 0x81c2: 0xf0001d1c, 0x81c3: 0xf0001d1c, - 0x81c4: 0xf0001d1c, 0x81c5: 0xf0001d1d, 0x81c6: 0xf0001d1d, 0x81c7: 0xf0001d1d, - 0x81c8: 0xe0000a6b, 0x81c9: 0xe0000cb4, 0x81ca: 0xf0001d1c, 0x81cb: 0xf0001d1c, - 0x81cc: 0xf0001d1c, 0x81cd: 0xf0001c1c, 0x81ce: 0xf0001c1c, 0x81cf: 0xf0001c1c, - 0x81d0: 0xf0001c1d, 0x81d1: 0xe0000cb9, 0x81d2: 0xe0000d36, 0x81d3: 0xe0000be3, - 0x81d4: 0xe0000fc5, 0x81d5: 0xf0001c1c, 0x81d6: 0xf0001c1c, 0x81d7: 0xf0001c1c, - 0x81d8: 0xf0001c1c, 0x81d9: 0xf0001c1c, 0x81da: 0xf0001c1c, 0x81db: 0xf0001c1c, - 0x81dc: 0xf0001c1c, 0x81dd: 0xf0001c1c, 0x81de: 0xf0001c1c, 0x81df: 0xe0000d3e, - 0x81e0: 0xe0000a72, 0x81e1: 0xf0001c1c, 0x81e2: 0xe0000cbd, 0x81e3: 0xe0000d42, - 0x81e4: 0xe0000a76, 0x81e5: 0xf0001c1c, 0x81e6: 0xe0000cc1, 0x81e7: 0xe0000d2d, - 0x81e8: 0xe0000d31, 0x81e9: 0xf0001c1d, 0x81ea: 0xe0000cc5, 0x81eb: 0xe0000d4a, - 0x81ec: 0xe0000be7, 0x81ed: 0xe0000f0b, 0x81ee: 0xe0000f0f, 0x81ef: 0xe0000f15, - 0x81f0: 0xf0001c1c, 0x81f1: 0xf0001c1c, 0x81f2: 0xf0001c1c, 0x81f3: 0xf0001c1c, - 0x81f4: 0xf0001d1c, 0x81f5: 0xf0001d1c, 0x81f6: 0xf0001d1c, 0x81f7: 0xf0001d1c, - 0x81f8: 0xf0001d1c, 0x81f9: 0xf0001d1d, 0x81fa: 0xe0002710, 0x81fb: 0xe000270d, - 0x81fc: 0xe000277f, 0x81fd: 0xe0002707, 0x81fe: 0xe0002704, 0x81ff: 0xe000270a, - // Block 0x208, offset 0x8200 - 0x8200: 0xf0001d1c, 0x8201: 0xf0001d1d, 0x8202: 0xe00009b7, 0x8203: 0xf0001c1d, - 0x8204: 0xf0001c1c, 0x8205: 0xf0001c1c, 0x8206: 0xe0000a66, 0x8207: 0xe0000a7a, - 0x8208: 0xf0001d1c, 0x8209: 0xf0001c1d, 0x820a: 0xf0001c1c, 0x820b: 0xf0001d1d, - 0x820c: 0xf0001c1c, 0x820d: 0xf0001d1d, 0x820e: 0xf0001d1d, 0x820f: 0xf0001c1c, - 0x8210: 0xf0001c1c, 0x8211: 0xf0001c1c, 0x8212: 0xe0000d0d, 0x8213: 0xf0001c1c, - 0x8214: 0xf0001c1c, 0x8215: 0xe0000d3a, 0x8216: 0xe0000d46, 0x8217: 0xf0001d1d, - 0x8218: 0xe0000eb0, 0x8219: 0xe0000eb8, 0x821a: 0xf0001d1d, 0x821b: 0xf0001c1c, - 0x821c: 0xf0001c1d, 0x821d: 0xe0002740, 0x821e: 0xe00010b2, 0x821f: 0xe00009c8, - 0x8220: 0xf0001f04, 0x8221: 0xf0001f04, 0x8222: 0xf0001f04, 0x8223: 0xf0001f04, - 0x8224: 0xf0001f04, 0x8225: 0xf0001f04, 0x8226: 0xf0001f04, 0x8227: 0xf0001f04, - 0x8228: 0xf0001f04, 0x8229: 0xf0000404, 0x822a: 0xf0000404, 0x822b: 0xf0000404, - 0x822c: 0xf0000404, 0x822d: 0xf0000404, 0x822e: 0xf0000404, 0x822f: 0xf0000404, - 0x8230: 0xf0000404, 0x8231: 0xf0000404, 0x8232: 0xf0000404, 0x8233: 0xf0000404, - 0x8234: 0xf0000404, 0x8235: 0xf0000404, 0x8236: 0xf0000404, 0x8237: 0xf0000404, - 0x8238: 0xf0000404, 0x8239: 0xf0000404, 0x823a: 0xf0000404, 0x823b: 0xf0000404, - 0x823c: 0xf0000404, 0x823d: 0xf0000404, 0x823e: 0xf0000404, 0x823f: 0xe0000bdf, - // Block 0x209, offset 0x8240 - 0x8240: 0xf0001f04, 0x8241: 0xf0001f04, 0x8242: 0xf0001f04, 0x8243: 0xf0001f04, - 0x8244: 0xf0001f04, 0x8245: 0xf0001f04, 0x8246: 0xf0001f04, 0x8247: 0xf0001f04, - 0x8248: 0xf0001f04, 0x8249: 0xf0001f04, 0x824a: 0xf0001f04, - 0x8250: 0xf0000a04, 0x8251: 0xf0000a04, 0x8252: 0xf0000a04, 0x8253: 0xf0000a04, - 0x8254: 0xf0000a04, 0x8255: 0xf0000a04, 0x8256: 0xf0000a04, 0x8257: 0xf0000a04, - 0x8258: 0xf0000a04, 0x8259: 0xf0000a04, 0x825a: 0xf0000a04, 0x825b: 0xf0000a04, - 0x825c: 0xf0000a04, 0x825d: 0xf0000a04, 0x825e: 0xf0000a04, 0x825f: 0xf0000a04, - 0x8260: 0xf0000a04, 0x8261: 0xf0000a04, 0x8262: 0xf0000a04, 0x8263: 0xf0000a04, - 0x8264: 0xf0000a04, 0x8265: 0xf0000a04, 0x8266: 0xe0002700, 0x8267: 0xf0000a04, - 0x8268: 0xf0000a04, 0x8269: 0xf0000a04, 0x826a: 0xf0000a04, 0x826b: 0x002c3a8c, - 0x826c: 0x002f7a8c, 0x826d: 0xf0000c0c, 0x826e: 0xe0002746, - 0x8270: 0x002bde9d, 0x8271: 0x002c0a9d, 0x8272: 0x002c3a9d, 0x8273: 0x002c629d, - 0x8274: 0x002c989d, 0x8275: 0x002d089d, 0x8276: 0x002d229d, 0x8277: 0x002d689d, - 0x8278: 0x002d9a9d, 0x8279: 0x002dcc9d, 0x827a: 0x002dfe9d, 0x827b: 0x002e229d, - 0x827c: 0x002e829d, 0x827d: 0x002e9e9d, 0x827e: 0x002ee29d, 0x827f: 0x002f2c9d, - // Block 0x20a, offset 0x8280 - 0x8280: 0x002f569d, 0x8281: 0x002f7a9d, 0x8282: 0x002fe69d, 0x8283: 0x00302c9d, - 0x8284: 0x00306c9d, 0x8285: 0x0030be9d, 0x8286: 0x0030e29d, 0x8287: 0x0030f69d, - 0x8288: 0x0031009d, 0x8289: 0x00312a9d, 0x828a: 0xf0001d1d, 0x828b: 0xf0001d1d, - 0x828c: 0xf0001d1d, 0x828d: 0xf0001d1d, 0x828e: 0xe0000ebc, 0x828f: 0xe0002743, - 0x8290: 0x002bde8c, 0x8291: 0x002c0a8c, 0x8292: 0x002c3a8c, 0x8293: 0x002c628c, - 0x8294: 0x002c988c, 0x8295: 0x002d088c, 0x8296: 0x002d228c, 0x8297: 0x002d688c, - 0x8298: 0x002d9a8c, 0x8299: 0x002dcc8c, 0x829a: 0x002dfe8c, 0x829b: 0x002e228c, - 0x829c: 0x002e828c, 0x829d: 0x002e9e8c, 0x829e: 0x002ee28c, 0x829f: 0x002f2c8c, - 0x82a0: 0x002f568c, 0x82a1: 0x002f7a8c, 0x82a2: 0x002fe68c, 0x82a3: 0x00302c8c, - 0x82a4: 0x00306c8c, 0x82a5: 0x0030be8c, 0x82a6: 0x0030e28c, 0x82a7: 0x0030f68c, - 0x82a8: 0x0031008c, 0x82a9: 0x00312a8c, 0x82aa: 0xf0001414, 0x82ab: 0xf0001414, - 0x82b0: 0x002bde9d, 0x82b1: 0x002c0a9d, 0x82b2: 0x002c3a9d, 0x82b3: 0x002c629d, - 0x82b4: 0x002c989d, 0x82b5: 0x002d089d, 0x82b6: 0x002d229d, 0x82b7: 0x002d689d, - 0x82b8: 0x002d9a9d, 0x82b9: 0x002dcc9d, 0x82ba: 0x002dfe9d, 0x82bb: 0x002e229d, - 0x82bc: 0x002e829d, 0x82bd: 0x002e9e9d, 0x82be: 0x002ee29d, 0x82bf: 0x002f2c9d, - // Block 0x20b, offset 0x82c0 - 0x82c0: 0xa0000000, 0x82c1: 0xa0000000, 0x82c2: 0xa0000000, 0x82c3: 0xa0000000, - 0x82c4: 0xa0000000, 0x82c5: 0xa0000000, 0x82c6: 0xa0000000, 0x82c7: 0xa0000000, - 0x82c8: 0xa0000000, 0x82c9: 0x40020020, 0x82ca: 0x40020220, 0x82cb: 0x40020420, - 0x82cc: 0x40020620, 0x82cd: 0x40020820, 0x82ce: 0xa0000000, 0x82cf: 0xa0000000, - 0x82d0: 0xa0000000, 0x82d1: 0xa0000000, 0x82d2: 0xa0000000, 0x82d3: 0xa0000000, - 0x82d4: 0xa0000000, 0x82d5: 0xa0000000, 0x82d6: 0xa0000000, 0x82d7: 0xa0000000, - 0x82d8: 0xa0000000, 0x82d9: 0xa0000000, 0x82da: 0xa0000000, 0x82db: 0xa0000000, - 0x82dc: 0xa0000000, 0x82dd: 0xa0000000, 0x82de: 0xa0000000, 0x82df: 0xa0000000, - 0x82e0: 0x40021220, 0x82e1: 0x4002ba20, 0x82e2: 0xa0002402, 0x82e3: 0x4004ea20, - 0x82e4: 0x4027de20, 0x82e5: 0x4004ec20, 0x82e6: 0x4004e620, 0x82e7: 0xa0002202, - 0x82e8: 0x4003f420, 0x82e9: 0x4003f620, 0x82ea: 0x4004d820, 0x82eb: 0x40093820, - 0x82ec: 0x40024020, 0x82ed: 0x40021a20, 0x82ee: 0x4002e420, 0x82ef: 0x4004e220, - 0x82f0: 0x4029cc20, 0x82f1: 0x4029ce20, 0x82f2: 0x4029d020, 0x82f3: 0x4029d220, - 0x82f4: 0x4029d420, 0x82f5: 0x4029d620, 0x82f6: 0x4029d820, 0x82f7: 0x4029da20, - 0x82f8: 0x4029dc20, 0x82f9: 0x4029de20, 0x82fa: 0x40026c20, 0x82fb: 0x40026220, - 0x82fc: 0x40094020, 0x82fd: 0xc32f0851, 0x82fe: 0x40094420, 0x82ff: 0x4002c420, - // Block 0x20c, offset 0x8300 - 0x8300: 0x4004d620, 0x8301: 0x002bde88, 0x8302: 0x002c0a88, 0x8303: 0x002c3a88, - 0x8304: 0x002c6288, 0x8305: 0x002c9888, 0x8306: 0x002d0888, 0x8307: 0x002d2288, - 0x8308: 0x002d6888, 0x8309: 0x002d9a88, 0x830a: 0x002dcc88, 0x830b: 0x002dfe88, - 0x830c: 0xc0030002, 0x830d: 0x002e8288, 0x830e: 0x002e9e88, 0x830f: 0x002ee288, - 0x8310: 0x002f2c88, 0x8311: 0x002f5688, 0x8312: 0x002f7a88, 0x8313: 0x002fe688, - 0x8314: 0x00302c88, 0x8315: 0x00306c88, 0x8316: 0x0030be88, 0x8317: 0x0030e288, - 0x8318: 0x0030f688, 0x8319: 0x00310088, 0x831a: 0x00312a88, 0x831b: 0x4003f820, - 0x831c: 0x4004e420, 0x831d: 0x4003fa20, 0x831e: 0x40062420, 0x831f: 0x40021620, - 0x8320: 0x40061e20, 0x8321: 0x402bde20, 0x8322: 0x402c0a20, 0x8323: 0x402c3a20, - 0x8324: 0x402c6220, 0x8325: 0x402c9820, 0x8326: 0x402d0820, 0x8327: 0x402d2220, - 0x8328: 0x402d6820, 0x8329: 0x402d9a20, 0x832a: 0x402dcc20, 0x832b: 0x402dfe20, - 0x832c: 0xc0000002, 0x832d: 0x402e8220, 0x832e: 0x402e9e20, 0x832f: 0x402ee220, - 0x8330: 0x402f2c20, 0x8331: 0x402f5620, 0x8332: 0x402f7a20, 0x8333: 0x402fe620, - 0x8334: 0x40302c20, 0x8335: 0x40306c20, 0x8336: 0x4030be20, 0x8337: 0x4030e220, - 0x8338: 0x4030f620, 0x8339: 0x40310020, 0x833a: 0x40312a20, 0x833b: 0x4003fc20, - 0x833c: 0x40094820, 0x833d: 0x4003fe20, 0x833e: 0x40094c20, 0x833f: 0xa0000000, - // Block 0x20d, offset 0x8340 - 0x8340: 0x40055620, 0x8341: 0xa1809102, 0x8342: 0xa1909002, 0x8343: 0x40055820, - 0x8344: 0xae600000, 0x8345: 0xadc00000, 0x8346: 0x40055a20, 0x8347: 0xa1208d02, - 0x8350: 0x40389020, 0x8351: 0x40389220, 0x8352: 0x40389420, 0x8353: 0x40389620, - 0x8354: 0x40389820, 0x8355: 0x40389a20, 0x8356: 0x40389c20, 0x8357: 0x40389e20, - 0x8358: 0x4038a020, 0x8359: 0x4038a220, 0x835a: 0x0038a499, 0x835b: 0x4038a420, - 0x835c: 0x4038a620, 0x835d: 0x0038a899, 0x835e: 0x4038a820, 0x835f: 0x0038aa99, - 0x8360: 0x4038aa20, 0x8361: 0x4038ac20, 0x8362: 0x4038ae20, 0x8363: 0x0038b099, - 0x8364: 0x4038b020, 0x8365: 0x0038b299, 0x8366: 0x4038b220, 0x8367: 0x4038b420, - 0x8368: 0x4038b620, 0x8369: 0x4038b820, 0x836a: 0x4038ba20, - 0x8370: 0xe00014ff, 0x8371: 0xe0001502, 0x8372: 0xe0001511, 0x8373: 0xa0002102, - 0x8374: 0xa0002302, - // Block 0x20e, offset 0x8380 - 0x8380: 0xa0002502, 0x8381: 0x4039fc20, 0x8382: 0x403a1220, 0x8383: 0x403a1a20, - 0x8384: 0x403a4020, 0x8385: 0x403a4e20, 0x8386: 0x403a5620, 0x8387: 0x403a6820, - 0x8388: 0xc3350171, 0x8389: 0x403a9222, 0x838a: 0xc3370171, 0x838b: 0xa1b0a202, - 0x838c: 0xa1c0a502, 0x838d: 0xa1d0a902, 0x838e: 0xa1e0ad02, 0x838f: 0xa1f0b202, - 0x8390: 0xa200b602, 0x8391: 0xa210ba02, 0x8392: 0xa220bc02, 0x8393: 0xae60bd02, - 0x8394: 0xae60be02, 0x8395: 0xadc0bf02, 0x8396: 0xadc0c102, 0x8397: 0xae60c202, - 0x8398: 0xae60c302, 0x8399: 0xae60c402, 0x839a: 0xae60c502, 0x839b: 0xae60c602, - 0x839c: 0xadc0c702, 0x839d: 0xae60c802, 0x839e: 0xae60c902, 0x839f: 0xadc0c002, - 0x83a0: 0xe000015e, 0x83a1: 0xe00001e6, 0x83a2: 0xe0000301, 0x83a3: 0xe00003db, - 0x83a4: 0xe00004b6, 0x83a5: 0xe0000580, 0x83a6: 0xe000064b, 0x83a7: 0xe00006f3, - 0x83a8: 0xe000079f, 0x83a9: 0xe0000844, 0x83aa: 0x4004ee20, 0x83ab: 0x40024c20, - 0x83ac: 0x40024e20, 0x83ad: 0x4004de20, 0x83ae: 0x40393a20, 0x83af: 0x403a1020, - 0x83b0: 0xa230d102, 0x83b1: 0x40392420, 0x83b2: 0x40392220, 0x83b3: 0x40392a20, - 0x83b4: 0x00391c84, 0x83b5: 0xf0000404, 0x83b6: 0xf0000404, 0x83b7: 0xf0000404, - 0x83b8: 0xf0000404, 0x83b9: 0x40395a20, 0x83ba: 0x40395c20, 0x83bb: 0x40393e20, - 0x83bc: 0x40395e20, 0x83bd: 0x40396020, 0x83be: 0x40394020, 0x83bf: 0x40396220, - // Block 0x20f, offset 0x83c0 - 0x83c1: 0x40491020, 0x83c2: 0x40491220, 0x83c3: 0x40491420, - 0x83c4: 0x40491620, 0x83c5: 0x40491820, 0x83c6: 0x40491a20, 0x83c7: 0x40491c20, - 0x83c8: 0x40491e20, 0x83c9: 0x40492020, 0x83ca: 0x40492220, 0x83cb: 0x40492420, - 0x83cc: 0x40492620, 0x83cd: 0x40492820, 0x83ce: 0x40492a20, 0x83cf: 0x40492c20, - 0x83d0: 0x40492e20, 0x83d1: 0x40493020, 0x83d2: 0x40493220, 0x83d3: 0x40493420, - 0x83d4: 0x40493620, 0x83d5: 0x40493820, 0x83d6: 0x40493a20, 0x83d7: 0x40493c20, - 0x83d8: 0x40493e20, 0x83d9: 0x40494020, 0x83da: 0x40494220, 0x83db: 0x40494420, - 0x83dc: 0x40494620, 0x83dd: 0x40494820, 0x83de: 0x40494a20, 0x83df: 0x40494c20, - 0x83e0: 0x40494e20, 0x83e1: 0x40495020, 0x83e2: 0x40495220, 0x83e3: 0x40495420, - 0x83e4: 0x40495620, 0x83e5: 0x40495820, 0x83e6: 0x40495a20, 0x83e7: 0x40495c20, - 0x83e8: 0x40495e20, 0x83e9: 0x40496020, 0x83ea: 0x40496220, 0x83eb: 0x40496420, - 0x83ec: 0x40496620, 0x83ed: 0x40496820, 0x83ee: 0x40496a20, 0x83ef: 0x40496c20, - 0x83f0: 0x40496e20, 0x83f1: 0x40497020, 0x83f2: 0x40497220, 0x83f3: 0x40497420, - 0x83f4: 0x40497620, 0x83f5: 0x40497820, 0x83f6: 0x40497a20, 0x83f7: 0x40497c20, - 0x83f8: 0x826724bf, 0x83f9: 0x826724c0, 0x83fa: 0xa0002602, - 0x83ff: 0x4027f420, - // Block 0x210, offset 0x8400 - 0x8400: 0xa0000000, 0x8401: 0xa0000000, 0x8402: 0xa0000000, 0x8403: 0xa0000000, - 0x8404: 0xa0000000, 0x8405: 0xa0000000, 0x8406: 0xa0000000, 0x8407: 0xa0000000, - 0x8408: 0xa0000000, 0x8409: 0x40020020, 0x840a: 0x40020220, 0x840b: 0x40020420, - 0x840c: 0x40020620, 0x840d: 0x40020820, 0x840e: 0xa0000000, 0x840f: 0xa0000000, - 0x8410: 0xa0000000, 0x8411: 0xa0000000, 0x8412: 0xa0000000, 0x8413: 0xa0000000, - 0x8414: 0xa0000000, 0x8415: 0xa0000000, 0x8416: 0xa0000000, 0x8417: 0xa0000000, - 0x8418: 0xa0000000, 0x8419: 0xa0000000, 0x841a: 0xa0000000, 0x841b: 0xa0000000, - 0x841c: 0xa0000000, 0x841d: 0xa0000000, 0x841e: 0xa0000000, 0x841f: 0xa0000000, - 0x8420: 0x40021220, 0x8421: 0x4002ba20, 0x8422: 0x4003e020, 0x8423: 0x4004ea20, - 0x8424: 0x4027de20, 0x8425: 0x4004ec20, 0x8426: 0x4004e620, 0x8427: 0x4003d220, - 0x8428: 0x4003f420, 0x8429: 0x4003f620, 0x842a: 0x4004d820, 0x842b: 0x40093820, - 0x842c: 0x40024020, 0x842d: 0x40021a20, 0x842e: 0x4002e420, 0x842f: 0x4004e220, - 0x8430: 0x4029cc20, 0x8431: 0x4029ce20, 0x8432: 0x4029d020, 0x8433: 0x4029d220, - 0x8434: 0x4029d420, 0x8435: 0x4029d620, 0x8436: 0x4029d820, 0x8437: 0x4029da20, - 0x8438: 0x4029dc20, 0x8439: 0x4029de20, 0x843a: 0x40026c20, 0x843b: 0x40026220, - 0x843c: 0x40094020, 0x843d: 0xc32f0851, 0x843e: 0x40094420, 0x843f: 0x4002c420, - // Block 0x211, offset 0x8440 - 0x8440: 0x4004d620, 0x8441: 0x002bde88, 0x8442: 0x002c0a88, 0x8443: 0xc3b708f1, - 0x8444: 0xc3bd0b13, 0x8445: 0x002c9888, 0x8446: 0x002d0888, 0x8447: 0x002d2288, - 0x8448: 0x002d6888, 0x8449: 0x002d9a88, 0x844a: 0x002dcc88, 0x844b: 0x002dfe88, - 0x844c: 0xc3c60be4, 0x844d: 0x002e8288, 0x844e: 0xc3cb0c52, 0x844f: 0x002ee288, - 0x8450: 0x002f2c88, 0x8451: 0x002f5688, 0x8452: 0x002f7a88, 0x8453: 0xc34908d1, - 0x8454: 0x00302c88, 0x8455: 0x00306c88, 0x8456: 0x0030be88, 0x8457: 0x0030e288, - 0x8458: 0x0030f688, 0x8459: 0x00310088, 0x845a: 0xc37f08d1, 0x845b: 0x4003f820, - 0x845c: 0x4004e420, 0x845d: 0x4003fa20, 0x845e: 0x40062420, 0x845f: 0x40021620, - 0x8460: 0x40061e20, 0x8461: 0x402bde20, 0x8462: 0x402c0a20, 0x8463: 0xc3b408f1, - 0x8464: 0xc3ba0ac2, 0x8465: 0x402c9820, 0x8466: 0x402d0820, 0x8467: 0x402d2220, - 0x8468: 0x402d6820, 0x8469: 0x402d9a20, 0x846a: 0x402dcc20, 0x846b: 0x402dfe20, - 0x846c: 0xc3c20b93, 0x846d: 0x402e8220, 0x846e: 0xc3670c41, 0x846f: 0x402ee220, - 0x8470: 0x402f2c20, 0x8471: 0x402f5620, 0x8472: 0x402f7a20, 0x8473: 0xc34708d1, - 0x8474: 0x40302c20, 0x8475: 0x40306c20, 0x8476: 0x4030be20, 0x8477: 0x4030e220, - 0x8478: 0x4030f620, 0x8479: 0x40310020, 0x847a: 0xc37d08d1, 0x847b: 0x4003fc20, - 0x847c: 0x40094820, 0x847d: 0x4003fe20, 0x847e: 0x40094c20, 0x847f: 0xa0000000, - // Block 0x212, offset 0x8480 - 0x8480: 0xe0000983, 0x8481: 0xe0000980, 0x8482: 0xe00008fb, 0x8483: 0xe00008f8, - 0x8484: 0xe000097d, 0x8485: 0xe000097a, 0x8486: 0x002c3e83, 0x8487: 0x402c3e20, - 0x8488: 0xe0000a3e, 0x8489: 0xe0000a3b, 0x848a: 0xe0000a4a, 0x848b: 0xe0000a47, - 0x848c: 0x002c3c83, 0x848d: 0x402c3c20, 0x848e: 0xe0000a86, 0x848f: 0xe0000a83, - 0x8490: 0x002c6683, 0x8491: 0x402c6620, 0x8492: 0xe0000b46, 0x8493: 0xe0000b43, - 0x8494: 0xe0000aee, 0x8495: 0xe0000aeb, 0x8496: 0xe0000b2c, 0x8497: 0xe0000b29, - 0x8498: 0xe0000b40, 0x8499: 0xe0000b3d, 0x849a: 0xe0000b1a, 0x849b: 0xe0000b17, - 0x849c: 0xe0000bb8, 0x849d: 0xe0000bb5, 0x849e: 0xe0000bb2, 0x849f: 0xe0000baf, - 0x84a0: 0xe0000bc4, 0x84a1: 0xe0000bc1, 0x84a2: 0xe0000bca, 0x84a3: 0xe0000bc7, - 0x84a4: 0xe0000bee, 0x84a5: 0xe0000beb, 0x84a6: 0xe0000c1b, 0x84a7: 0xe0000c18, - 0x84a8: 0xe0000c51, 0x84a9: 0xe0000c4e, 0x84aa: 0xe0000c60, 0x84ab: 0xe0000c5d, - 0x84ac: 0xe0000c31, 0x84ad: 0xe0000c2e, 0x84ae: 0xe0000c5a, 0x84af: 0xe0000c57, - 0x84b0: 0xe0000c54, 0x84b1: 0x402da220, 0x84b2: 0xf0000a0a, 0x84b3: 0xf0000404, - 0x84b4: 0xe0000c8a, 0x84b5: 0xe0000c87, 0x84b6: 0xe0000c9f, 0x84b7: 0xe0000c9c, - 0x84b8: 0x402f7220, 0x84b9: 0xe0000ccc, 0x84ba: 0xe0000cc9, 0x84bb: 0xe0000cd8, - 0x84bc: 0xe0000cd5, 0x84bd: 0xe0000cd2, 0x84be: 0xe0000ccf, 0x84bf: 0xe0000d04, - // Block 0x213, offset 0x84c0 - 0x84c0: 0xe0000cfe, 0x84c1: 0xe0000cf8, 0x84c2: 0xe0000cf5, 0x84c3: 0xe0000d51, - 0x84c4: 0xe0000d4e, 0x84c5: 0xe0000d6f, 0x84c6: 0xe0000d6c, 0x84c7: 0xe0000d5d, - 0x84c8: 0xe0000d5a, 0x84c9: 0xf0000404, 0x84ca: 0x002eda88, 0x84cb: 0x402eda20, - 0x84cc: 0xe0000e2e, 0x84cd: 0xe0000e2b, 0x84ce: 0xe0000da0, 0x84cf: 0xe0000d9d, - 0x84d0: 0xe0000de0, 0x84d1: 0xe0000ddd, 0x84d2: 0xe0000e93, 0x84d3: 0xe0000e8f, - 0x84d4: 0xe0000eca, 0x84d5: 0xe0000ec7, 0x84d6: 0xe0000edc, 0x84d7: 0xe0000ed9, - 0x84d8: 0xe0000ed0, 0x84d9: 0xe0000ecd, 0x84da: 0xe0000f1f, 0x84db: 0xe0000f1c, - 0x84dc: 0xe0000f2d, 0x84dd: 0xe0000f2a, 0x84de: 0xe0000f47, 0x84df: 0xe0000f44, - 0x84e0: 0x002fe883, 0x84e1: 0x402fe820, 0x84e2: 0xe0000f99, 0x84e3: 0xe0000f96, - 0x84e4: 0xe0000f8a, 0x84e5: 0xe0000f87, 0x84e6: 0x00303688, 0x84e7: 0x40303620, - 0x84e8: 0xe000102b, 0x84e9: 0xe0001028, 0x84ea: 0xe000103f, 0x84eb: 0xe000103c, - 0x84ec: 0xe0000fe7, 0x84ed: 0xe0000fe4, 0x84ee: 0xe0000ff9, 0x84ef: 0xe0000ff6, - 0x84f0: 0xe0001025, 0x84f1: 0xe0001022, 0x84f2: 0xe0001039, 0x84f3: 0xe0001036, - 0x84f4: 0xe00010d8, 0x84f5: 0xe00010d5, 0x84f6: 0xe000110e, 0x84f7: 0xe000110b, - 0x84f8: 0xe0001117, 0x84f9: 0xe000113b, 0x84fa: 0xe0001138, 0x84fb: 0xe000114d, - 0x84fc: 0xe000114a, 0x84fd: 0x00312c83, 0x84fe: 0x40312c20, 0x84ff: 0xe0000f64, - // Block 0x214, offset 0x8500 - 0x8500: 0x40321220, 0x8501: 0x40321a20, 0x8502: 0x40322220, 0x8503: 0x40322a20, - 0x8504: 0x002c6487, 0x8505: 0x002c6485, 0x8506: 0x002c6483, 0x8507: 0x002e2487, - 0x8508: 0x002e2485, 0x8509: 0x002e2483, 0x850a: 0x002ea087, 0x850b: 0x002ea085, - 0x850c: 0x002ea083, 0x850d: 0xe0000947, 0x850e: 0xe0000944, 0x850f: 0xe0000c3d, - 0x8510: 0xe0000c3a, 0x8511: 0xe0000dcc, 0x8512: 0xe0000dc9, 0x8513: 0xe0000ff3, - 0x8514: 0xe0000ff0, 0x8515: 0xe000101e, 0x8516: 0xe000101a, 0x8517: 0xe0001006, - 0x8518: 0xe0001002, 0x8519: 0xe0001016, 0x851a: 0xe0001012, 0x851b: 0xe000100e, - 0x851c: 0xe000100a, 0x851d: 0x402cae20, 0x851e: 0xe0000962, 0x851f: 0xe000095e, - 0x8520: 0xe0000976, 0x8521: 0xe0000972, 0x8522: 0xe00009f4, 0x8523: 0xe00009ef, - 0x8524: 0x002d3a88, 0x8525: 0x402d3a20, 0x8526: 0xe0000bbe, 0x8527: 0xe0000bbb, - 0x8528: 0xe0000c99, 0x8529: 0xe0000c96, 0x852a: 0xe0000e20, 0x852b: 0xe0000e1d, - 0x852c: 0xe0000e27, 0x852d: 0xe0000e23, 0x852e: 0xe0001162, 0x852f: 0xe000115f, - 0x8530: 0xe0000c8d, 0x8531: 0xf0000a0a, 0x8532: 0xf000040a, 0x8533: 0xf0000404, - 0x8534: 0xe0000bac, 0x8535: 0xe0000ba9, 0x8536: 0x002d7888, 0x8537: 0x00319488, - 0x8538: 0xe0000d57, 0x8539: 0xe0000d54, 0x853a: 0xe0000954, 0x853b: 0xe0000950, - 0x853c: 0xe00009ea, 0x853d: 0xe00009e5, 0x853e: 0xe0000e19, 0x853f: 0xe0000e15, - // Block 0x215, offset 0x8540 - 0x8540: 0xe00009b1, 0x8541: 0xe00009ae, 0x8542: 0xe0000a22, 0x8543: 0xe0000a1f, - 0x8544: 0xe0000a28, 0x8545: 0xe0000a25, 0x8546: 0xe0000a2e, 0x8547: 0xe0000a2b, - 0x8548: 0xe0002785, 0x8549: 0xe0002782, 0x854a: 0xe0000a8c, 0x854b: 0xe0000a89, - 0x854c: 0xe0000a98, 0x854d: 0xe0000a95, 0x854e: 0xe0000aa4, 0x854f: 0xe0000aa1, - 0x8550: 0xe0000a92, 0x8551: 0xe0000a8f, 0x8552: 0xe0000a9e, 0x8553: 0xe0000a9b, - 0x8554: 0xe0000b55, 0x8555: 0xe0000b51, 0x8556: 0xe0000b4d, 0x8557: 0xe0000b49, - 0x8558: 0xe0000b7c, 0x8559: 0xe0000b79, 0x855a: 0xe0000b82, 0x855b: 0xe0000b7f, - 0x855c: 0xe0000b39, 0x855d: 0xe0000b35, 0x855e: 0xe0000b8c, 0x855f: 0xe0000b89, - 0x8560: 0xe0000bd0, 0x8561: 0xe0000bcd, 0x8562: 0xe0000c00, 0x8563: 0xe0000bfd, - 0x8564: 0xe0000c0c, 0x8565: 0xe0000c09, 0x8566: 0xe0000bfa, 0x8567: 0xe0000bf7, - 0x8568: 0xe0000c06, 0x8569: 0xe0000c03, 0x856a: 0xe0000c12, 0x856b: 0xe0000c0f, - 0x856c: 0xe0000c7e, 0x856d: 0xe0000c7b, 0x856e: 0xe0000c4a, 0x856f: 0xe0000c46, - 0x8570: 0xe0000c93, 0x8571: 0xe0000c90, 0x8572: 0xe0000cab, 0x8573: 0xe0000ca8, - 0x8574: 0xe0000cb1, 0x8575: 0xe0000cae, 0x8576: 0xe0000cde, 0x8577: 0xe0000cdb, - 0x8578: 0xe0000ce5, 0x8579: 0xe0000ce1, 0x857a: 0xe0000cf2, 0x857b: 0xe0000cef, - 0x857c: 0xe0000cec, 0x857d: 0xe0000ce9, 0x857e: 0xe0000d1e, 0x857f: 0xe0000d1b, - // Block 0x216, offset 0x8580 - 0x8580: 0xe0000d24, 0x8581: 0xe0000d21, 0x8582: 0xe0000d2a, 0x8583: 0xe0000d27, - 0x8584: 0xe0000d69, 0x8585: 0xe0000d66, 0x8586: 0xe0000d7b, 0x8587: 0xe0000d78, - 0x8588: 0xe0000d87, 0x8589: 0xe0000d84, 0x858a: 0xe0000d81, 0x858b: 0xe0000d7e, - 0x858c: 0xe0000ded, 0x858d: 0xe0000de9, 0x858e: 0xe0000df5, 0x858f: 0xe0000df1, - 0x8590: 0xe0000e3d, 0x8591: 0xe0000e39, 0x8592: 0xe0000e35, 0x8593: 0xe0000e31, - 0x8594: 0xe0000ea7, 0x8595: 0xe0000ea4, 0x8596: 0xe0000ead, 0x8597: 0xe0000eaa, - 0x8598: 0xe0000ed6, 0x8599: 0xe0000ed3, 0x859a: 0xe0000ef4, 0x859b: 0xe0000ef1, - 0x859c: 0xe0000efb, 0x859d: 0xe0000ef7, 0x859e: 0xe0000f02, 0x859f: 0xe0000eff, - 0x85a0: 0xe0000f41, 0x85a1: 0xe0000f3e, 0x85a2: 0xe0000f53, 0x85a3: 0xe0000f50, - 0x85a4: 0xe0000f26, 0x85a5: 0xe0000f22, 0x85a6: 0xe0002652, 0x85a7: 0xe000264f, - 0x85a8: 0xe0000f5a, 0x85a9: 0xe0000f56, 0x85aa: 0xe0000f93, 0x85ab: 0xe0000f90, - 0x85ac: 0xe0000f9f, 0x85ad: 0xe0000f9c, 0x85ae: 0xe0000fb1, 0x85af: 0xe0000fae, - 0x85b0: 0xe0000fab, 0x85b1: 0xe0000fa8, 0x85b2: 0xe0001093, 0x85b3: 0xe0001090, - 0x85b4: 0xe000109f, 0x85b5: 0xe000109c, 0x85b6: 0xe0001099, 0x85b7: 0xe0001096, - 0x85b8: 0xe0001032, 0x85b9: 0xe000102e, 0x85ba: 0xe0001046, 0x85bb: 0xe0001042, - 0x85bc: 0xe00010a9, 0x85bd: 0xe00010a6, 0x85be: 0xe00010af, 0x85bf: 0xe00010ac, - // Block 0x217, offset 0x85c0 - 0x85c0: 0xa0000000, 0x85c1: 0xa0000000, 0x85c2: 0xa0000000, 0x85c3: 0xa0000000, - 0x85c4: 0xa0000000, 0x85c5: 0xa0000000, 0x85c6: 0xa0000000, 0x85c7: 0xa0000000, - 0x85c8: 0xa0000000, 0x85c9: 0x40020020, 0x85ca: 0x40020220, 0x85cb: 0x40020420, - 0x85cc: 0x40020620, 0x85cd: 0x40020820, 0x85ce: 0xa0000000, 0x85cf: 0xa0000000, - 0x85d0: 0xa0000000, 0x85d1: 0xa0000000, 0x85d2: 0xa0000000, 0x85d3: 0xa0000000, - 0x85d4: 0xa0000000, 0x85d5: 0xa0000000, 0x85d6: 0xa0000000, 0x85d7: 0xa0000000, - 0x85d8: 0xa0000000, 0x85d9: 0xa0000000, 0x85da: 0xa0000000, 0x85db: 0xa0000000, - 0x85dc: 0xa0000000, 0x85dd: 0xa0000000, 0x85de: 0xa0000000, 0x85df: 0xa0000000, - 0x85e0: 0x40021220, 0x85e1: 0x4002ba20, 0x85e2: 0x4003e020, 0x85e3: 0x4004ea20, - 0x85e4: 0x4027de20, 0x85e5: 0x4004ec20, 0x85e6: 0x4004e620, 0x85e7: 0x4003d220, - 0x85e8: 0x4003f420, 0x85e9: 0x4003f620, 0x85ea: 0x4004d820, 0x85eb: 0x40093820, - 0x85ec: 0x40024020, 0x85ed: 0x40021a20, 0x85ee: 0x4002e420, 0x85ef: 0x4004e220, - 0x85f0: 0x4029cc20, 0x85f1: 0x4029ce20, 0x85f2: 0x4029d020, 0x85f3: 0x4029d220, - 0x85f4: 0x4029d420, 0x85f5: 0x4029d620, 0x85f6: 0x4029d820, 0x85f7: 0x4029da20, - 0x85f8: 0x4029dc20, 0x85f9: 0x4029de20, 0x85fa: 0x40026c20, 0x85fb: 0x40026220, - 0x85fc: 0x40094020, 0x85fd: 0xc32f0851, 0x85fe: 0x40094420, 0x85ff: 0x4002c420, - // Block 0x218, offset 0x8600 - 0x8600: 0x4004d620, 0x8601: 0xc3d20c71, 0x8602: 0x002c0a88, 0x8603: 0x002c3a88, - 0x8604: 0x002c6288, 0x8605: 0xc3d808b1, 0x8606: 0x002d0888, 0x8607: 0x002d2288, - 0x8608: 0x002d6888, 0x8609: 0xc3dc08b1, 0x860a: 0x002dcc88, 0x860b: 0x002dfe88, - 0x860c: 0xc0030002, 0x860d: 0x002e8288, 0x860e: 0x002e9e88, 0x860f: 0xc3e10cb1, - 0x8610: 0x002f2c88, 0x8611: 0x002f5688, 0x8612: 0x002f7a88, 0x8613: 0x002fe688, - 0x8614: 0x00302c88, 0x8615: 0xc3e608b1, 0x8616: 0x0030be88, 0x8617: 0x0030e288, - 0x8618: 0x0030f688, 0x8619: 0xc3ea08b1, 0x861a: 0x00312a88, 0x861b: 0x4003f820, - 0x861c: 0x4004e420, 0x861d: 0x4003fa20, 0x861e: 0x40062420, 0x861f: 0x40021620, - 0x8620: 0x40061e20, 0x8621: 0xc3ce0c71, 0x8622: 0x402c0a20, 0x8623: 0x402c3a20, - 0x8624: 0x402c6220, 0x8625: 0xc3d608b1, 0x8626: 0x402d0820, 0x8627: 0x402d2220, - 0x8628: 0x402d6820, 0x8629: 0xc3da08b1, 0x862a: 0x402dcc20, 0x862b: 0x402dfe20, - 0x862c: 0xc0000002, 0x862d: 0x402e8220, 0x862e: 0x402e9e20, 0x862f: 0xc3de0cb1, - 0x8630: 0x402f2c20, 0x8631: 0x402f5620, 0x8632: 0x402f7a20, 0x8633: 0x402fe620, - 0x8634: 0x40302c20, 0x8635: 0xc3e408b1, 0x8636: 0x4030be20, 0x8637: 0x4030e220, - 0x8638: 0x4030f620, 0x8639: 0xc3e808b1, 0x863a: 0x40312a20, 0x863b: 0x4003fc20, - 0x863c: 0x40094820, 0x863d: 0x4003fe20, 0x863e: 0x40094c20, 0x863f: 0xa0000000, - // Block 0x219, offset 0x8640 - 0x8640: 0xe00008f5, 0x8641: 0x002c0883, 0x8642: 0xe0000921, 0x8643: 0xe0000969, - 0x8644: 0x00320ca3, 0x8645: 0x00321083, 0x8646: 0x00320c83, 0x8647: 0xe0000a53, - 0x8648: 0xe0000ae8, 0x8649: 0x002d0683, 0x864a: 0xe0000af4, 0x864b: 0xe0000b20, - 0x864c: 0xe0000c2b, 0x864d: 0x002dca83, 0x864e: 0xe0000c37, 0x864f: 0xe0000c43, - 0x8650: 0x002c6483, 0x8651: 0xe0000d63, 0x8652: 0xe0000d9a, 0x8653: 0x002f2a83, - 0x8654: 0xe0000da6, 0x8655: 0xe0000de6, 0x8656: 0x00320e83, 0x8657: 0x40093e20, - 0x8658: 0x00320ea3, 0x8659: 0xe0000fe1, 0x865a: 0x0030bc83, 0x865b: 0xe0000fed, - 0x865c: 0xe0000fff, 0x865d: 0x00312883, 0x865e: 0x00318888, 0x865f: 0xe0000f7b, - 0x8660: 0xe00008f2, 0x8661: 0x402c0820, 0x8662: 0xe000091e, 0x8663: 0xe0000966, - 0x8664: 0x40320c21, 0x8665: 0x40321020, 0x8666: 0x40320c20, 0x8667: 0xe0000a4d, - 0x8668: 0xe0000ae5, 0x8669: 0x402d0620, 0x866a: 0xe0000af1, 0x866b: 0xe0000b1d, - 0x866c: 0xe0000c28, 0x866d: 0x402dca20, 0x866e: 0xe0000c34, 0x866f: 0xe0000c40, - 0x8670: 0x402c6420, 0x8671: 0xe0000d60, 0x8672: 0xe0000d97, 0x8673: 0x402f2a20, - 0x8674: 0xe0000da3, 0x8675: 0xe0000de3, 0x8676: 0x40320e20, 0x8677: 0x40093c20, - 0x8678: 0x40320e21, 0x8679: 0xe0000fde, 0x867a: 0x4030bc20, 0x867b: 0xe0000fea, - 0x867c: 0xe0000ffc, 0x867d: 0x40312820, 0x867e: 0x40318820, 0x867f: 0xe0001114, - // Block 0x21a, offset 0x8680 - 0x8680: 0xe0000983, 0x8681: 0xe0000980, 0x8682: 0xe00008fb, 0x8683: 0xe00008f8, - 0x8684: 0xe000097d, 0x8685: 0xe000097a, 0x8686: 0xe0000a38, 0x8687: 0xe0000a35, - 0x8688: 0xe0000a3e, 0x8689: 0xe0000a3b, 0x868a: 0xe0000a4a, 0x868b: 0xe0000a47, - 0x868c: 0xe0000a44, 0x868d: 0xe0000a41, 0x868e: 0xe0000a86, 0x868f: 0xe0000a83, - 0x8690: 0x002c62a3, 0x8691: 0x402c6221, 0x8692: 0xe0000b46, 0x8693: 0xe0000b43, - 0x8694: 0xe0000aee, 0x8695: 0xe0000aeb, 0x8696: 0xe0000b2c, 0x8697: 0xe0000b29, - 0x8698: 0xe0000b40, 0x8699: 0xe0000b3d, 0x869a: 0xe0000b1a, 0x869b: 0xe0000b17, - 0x869c: 0xe0000bb8, 0x869d: 0xe0000bb5, 0x869e: 0xe0000bb2, 0x869f: 0xe0000baf, - 0x86a0: 0xe0000bc4, 0x86a1: 0xe0000bc1, 0x86a2: 0xe0000bca, 0x86a3: 0xe0000bc7, - 0x86a4: 0xe0000bee, 0x86a5: 0xe0000beb, 0x86a6: 0xe0000c1b, 0x86a7: 0xe0000c18, - 0x86a8: 0xe0000c51, 0x86a9: 0xe0000c4e, 0x86aa: 0xe0000c60, 0x86ab: 0xe0000c5d, - 0x86ac: 0xe0000c31, 0x86ad: 0xe0000c2e, 0x86ae: 0xe0000c5a, 0x86af: 0xe0000c57, - 0x86b0: 0xe0000c54, 0x86b1: 0x402da220, 0x86b2: 0xf0000a0a, 0x86b3: 0xf0000404, - 0x86b4: 0xe0000c8a, 0x86b5: 0xe0000c87, 0x86b6: 0xe0000c9f, 0x86b7: 0xe0000c9c, - 0x86b8: 0x402f7220, 0x86b9: 0xe0000ccc, 0x86ba: 0xe0000cc9, 0x86bb: 0xe0000cd8, - 0x86bc: 0xe0000cd5, 0x86bd: 0xe0000cd2, 0x86be: 0xe0000ccf, 0x86bf: 0xe0000d04, - // Block 0x21b, offset 0x86c0 - 0x86c0: 0x40321220, 0x86c1: 0x40321a20, 0x86c2: 0x40322220, 0x86c3: 0x40322a20, - 0x86c4: 0xe0000ad5, 0x86c5: 0xe0000ad1, 0x86c6: 0xe0000acd, 0x86c7: 0xf0000a0a, - 0x86c8: 0xf000040a, 0x86c9: 0xf0000404, 0x86ca: 0xf0000a0a, 0x86cb: 0xf000040a, - 0x86cc: 0xf0000404, 0x86cd: 0xe0000947, 0x86ce: 0xe0000944, 0x86cf: 0xe0000c3d, - 0x86d0: 0xe0000c3a, 0x86d1: 0xe0000dcc, 0x86d2: 0xe0000dc9, 0x86d3: 0xe0000ff3, - 0x86d4: 0xe0000ff0, 0x86d5: 0xe000101e, 0x86d6: 0xe000101a, 0x86d7: 0xe00027c1, - 0x86d8: 0xe00027be, 0x86d9: 0xe0001016, 0x86da: 0xe0001012, 0x86db: 0xe000100e, - 0x86dc: 0xe000100a, 0x86dd: 0x402cae20, 0x86de: 0xe0002697, 0x86df: 0xe0002694, - 0x86e0: 0xe0000976, 0x86e1: 0xe0000972, 0x86e2: 0xe0002691, 0x86e3: 0xe000268e, - 0x86e4: 0x002d3a88, 0x86e5: 0x402d3a20, 0x86e6: 0xe0000bbe, 0x86e7: 0xe0000bbb, - 0x86e8: 0xe0000c99, 0x86e9: 0xe0000c96, 0x86ea: 0xe0000e20, 0x86eb: 0xe0000e1d, - 0x86ec: 0xe0000e27, 0x86ed: 0xe0000e23, 0x86ee: 0xe0001162, 0x86ef: 0xe000115f, - 0x86f0: 0xe0000c8d, 0x86f1: 0xf0000a0a, 0x86f2: 0xf000040a, 0x86f3: 0xf0000404, - 0x86f4: 0xe0000bac, 0x86f5: 0xe0000ba9, 0x86f6: 0x002d7888, 0x86f7: 0x00319488, - 0x86f8: 0xe0000d57, 0x86f9: 0xe0000d54, 0x86fa: 0xe00026af, 0x86fb: 0xe00026ac, - 0x86fc: 0xe000268b, 0x86fd: 0xe0002688, 0x86fe: 0xe0002752, 0x86ff: 0xe000274f, - // Block 0x21c, offset 0x8700 - 0x8700: 0xe000098f, 0x8701: 0xe000098c, 0x8702: 0xe0000995, 0x8703: 0xe0000992, - 0x8704: 0xe0000b62, 0x8705: 0xe0000b5f, 0x8706: 0xe0000b68, 0x8707: 0xe0000b65, - 0x8708: 0xe0000c6c, 0x8709: 0xe0000c69, 0x870a: 0xe0000c72, 0x870b: 0xe0000c6f, - 0x870c: 0xe0000e4a, 0x870d: 0xe0000e47, 0x870e: 0xe0000e50, 0x870f: 0xe0000e4d, - 0x8710: 0xe0000ee8, 0x8711: 0xe0000ee5, 0x8712: 0xe0000eee, 0x8713: 0xe0000eeb, - 0x8714: 0xe0001053, 0x8715: 0xe0001050, 0x8716: 0xe0001059, 0x8717: 0xe0001056, - 0x8718: 0xe0000f61, 0x8719: 0xe0000f5e, 0x871a: 0xe0000fa5, 0x871b: 0xe0000fa2, - 0x871c: 0x00312288, 0x871d: 0x40312220, 0x871e: 0xe0000bf4, 0x871f: 0xe0000bf1, - 0x8720: 0x002ebc88, 0x8721: 0x402c8c20, 0x8722: 0x002f2288, 0x8723: 0x402f2220, - 0x8724: 0x00314088, 0x8725: 0x40314020, 0x8726: 0xe000096f, 0x8727: 0xe000096c, - 0x8728: 0xe0000b32, 0x8729: 0xe0000b2f, 0x872a: 0xe000274c, 0x872b: 0xe0002749, - 0x872c: 0xe0000dfd, 0x872d: 0xe0000df9, 0x872e: 0xe0000e04, 0x872f: 0xe0000e01, - 0x8730: 0xe0000e0b, 0x8731: 0xe0000e07, 0x8732: 0xe0001129, 0x8733: 0xe0001126, - 0x8734: 0x402e5e20, 0x8735: 0x402ed020, 0x8736: 0x40305a20, 0x8737: 0x402dd420, - 0x8738: 0xe0000abf, 0x8739: 0xe0000ec4, 0x873a: 0x002be888, 0x873b: 0x002c4488, - 0x873c: 0x402c4420, 0x873d: 0x002e3888, 0x873e: 0x00303e88, 0x873f: 0x402ffc20, - // Block 0x21d, offset 0x8740 - 0x8740: 0xe00009b1, 0x8741: 0xe00009ae, 0x8742: 0xe0000a22, 0x8743: 0xe0000a1f, - 0x8744: 0xe0000a28, 0x8745: 0xe0000a25, 0x8746: 0xe0000a2e, 0x8747: 0xe0000a2b, - 0x8748: 0xe0000a5a, 0x8749: 0xe0000a56, 0x874a: 0xe0000a8c, 0x874b: 0xe0000a89, - 0x874c: 0xe0000a98, 0x874d: 0xe0000a95, 0x874e: 0xe0000aa4, 0x874f: 0xe0000aa1, - 0x8750: 0xe0000a92, 0x8751: 0xe0000a8f, 0x8752: 0xe0000a9e, 0x8753: 0xe0000a9b, - 0x8754: 0xe0000b55, 0x8755: 0xe0000b51, 0x8756: 0xe000279d, 0x8757: 0xe000279a, - 0x8758: 0xe0000b7c, 0x8759: 0xe0000b79, 0x875a: 0xe0000b82, 0x875b: 0xe0000b7f, - 0x875c: 0xe0000b39, 0x875d: 0xe0000b35, 0x875e: 0xe0000b8c, 0x875f: 0xe0000b89, - 0x8760: 0xe0000bd0, 0x8761: 0xe0000bcd, 0x8762: 0xe0000c00, 0x8763: 0xe0000bfd, - 0x8764: 0xe0000c0c, 0x8765: 0xe0000c09, 0x8766: 0xe0000bfa, 0x8767: 0xe0000bf7, - 0x8768: 0xe0000c06, 0x8769: 0xe0000c03, 0x876a: 0xe0000c12, 0x876b: 0xe0000c0f, - 0x876c: 0xe0000c7e, 0x876d: 0xe0000c7b, 0x876e: 0xe00027a3, 0x876f: 0xe00027a0, - 0x8770: 0xe0000c93, 0x8771: 0xe0000c90, 0x8772: 0xe0000cab, 0x8773: 0xe0000ca8, - 0x8774: 0xe0000cb1, 0x8775: 0xe0000cae, 0x8776: 0xe0000cde, 0x8777: 0xe0000cdb, - 0x8778: 0xe0000ce5, 0x8779: 0xe0000ce1, 0x877a: 0xe0000cf2, 0x877b: 0xe0000cef, - 0x877c: 0xe0000cec, 0x877d: 0xe0000ce9, 0x877e: 0xe0000d1e, 0x877f: 0xe0000d1b, - // Block 0x21e, offset 0x8780 - 0x8780: 0xe0000d24, 0x8781: 0xe0000d21, 0x8782: 0xe0000d2a, 0x8783: 0xe0000d27, - 0x8784: 0xe0000d69, 0x8785: 0xe0000d66, 0x8786: 0xe0000d7b, 0x8787: 0xe0000d78, - 0x8788: 0xe0000d87, 0x8789: 0xe0000d84, 0x878a: 0xe0000d81, 0x878b: 0xe0000d7e, - 0x878c: 0xe00027af, 0x878d: 0xe00027ac, 0x878e: 0xe00027d3, 0x878f: 0xe00027d0, - 0x8790: 0xe0000e3d, 0x8791: 0xe0000e39, 0x8792: 0xe00027b5, 0x8793: 0xe00027b2, - 0x8794: 0xe0000ea7, 0x8795: 0xe0000ea4, 0x8796: 0xe0000ead, 0x8797: 0xe0000eaa, - 0x8798: 0xe0000ed6, 0x8799: 0xe0000ed3, 0x879a: 0xe0000ef4, 0x879b: 0xe0000ef1, - 0x879c: 0xe0000efb, 0x879d: 0xe0000ef7, 0x879e: 0xe0000f02, 0x879f: 0xe0000eff, - 0x87a0: 0xe0000f41, 0x87a1: 0xe0000f3e, 0x87a2: 0xe0000f53, 0x87a3: 0xe0000f50, - 0x87a4: 0xe0000f26, 0x87a5: 0xe0000f22, 0x87a6: 0xe0000f3a, 0x87a7: 0xe0000f36, - 0x87a8: 0xe0000f5a, 0x87a9: 0xe0000f56, 0x87aa: 0xe0000f93, 0x87ab: 0xe0000f90, - 0x87ac: 0xe0000f9f, 0x87ad: 0xe0000f9c, 0x87ae: 0xe0000fb1, 0x87af: 0xe0000fae, - 0x87b0: 0xe0000fab, 0x87b1: 0xe0000fa8, 0x87b2: 0xe0001093, 0x87b3: 0xe0001090, - 0x87b4: 0xe000109f, 0x87b5: 0xe000109c, 0x87b6: 0xe0001099, 0x87b7: 0xe0001096, - 0x87b8: 0xe00027c7, 0x87b9: 0xe00027c4, 0x87ba: 0xe0001046, 0x87bb: 0xe0001042, - 0x87bc: 0xe00010a9, 0x87bd: 0xe00010a6, 0x87be: 0xe00010af, 0x87bf: 0xe00010ac, - // Block 0x21f, offset 0x87c0 - 0x87c0: 0xe00010d2, 0x87c1: 0xe00010cf, 0x87c2: 0xe00010cc, 0x87c3: 0xe00010c9, - 0x87c4: 0xe00010e1, 0x87c5: 0xe00010de, 0x87c6: 0xe00010e7, 0x87c7: 0xe00010e4, - 0x87c8: 0xe00010ed, 0x87c9: 0xe00010ea, 0x87ca: 0xe00010fc, 0x87cb: 0xe00010f9, - 0x87cc: 0xe00010f6, 0x87cd: 0xe00010f3, 0x87ce: 0xe0001123, 0x87cf: 0xe0001120, - 0x87d0: 0xe0001141, 0x87d1: 0xe000113e, 0x87d2: 0xe0001153, 0x87d3: 0xe0001150, - 0x87d4: 0xe0001159, 0x87d5: 0xe0001156, 0x87d6: 0xe0000c15, 0x87d7: 0xe0000f8d, - 0x87d8: 0xe00010db, 0x87d9: 0xe0001111, 0x87da: 0xf0000404, 0x87db: 0xe0000f70, - 0x87dc: 0x40300420, 0x87dd: 0x40300620, 0x87de: 0xe0000f7f, 0x87df: 0x402c9620, - 0x87e0: 0xe000099b, 0x87e1: 0xe0000998, 0x87e2: 0xe0000989, 0x87e3: 0xe0000986, - 0x87e4: 0xe0002791, 0x87e5: 0xe000278e, 0x87e6: 0xe0000930, 0x87e7: 0xe000092c, - 0x87e8: 0xe0000940, 0x87e9: 0xe000093c, 0x87ea: 0xe0000938, 0x87eb: 0xe0000934, - 0x87ec: 0xe00009aa, 0x87ed: 0xe00009a6, 0x87ee: 0xe000278b, 0x87ef: 0xe0002788, - 0x87f0: 0xe000090a, 0x87f1: 0xe0000906, 0x87f2: 0xe000091a, 0x87f3: 0xe0000916, - 0x87f4: 0xe0000912, 0x87f5: 0xe000090e, 0x87f6: 0xe00009a2, 0x87f7: 0xe000099e, - 0x87f8: 0xe0000b6e, 0x87f9: 0xe0000b6b, 0x87fa: 0xe0000b5c, 0x87fb: 0xe0000b59, - 0x87fc: 0xe0000b26, 0x87fd: 0xe0000b23, 0x87fe: 0xe0002797, 0x87ff: 0xe0002794, - // Block 0x220, offset 0x8800 - 0x8800: 0xe0000b03, 0x8801: 0xe0000aff, 0x8802: 0xe0000b13, 0x8803: 0xe0000b0f, - 0x8804: 0xe0000b0b, 0x8805: 0xe0000b07, 0x8806: 0xe0000b75, 0x8807: 0xe0000b71, - 0x8808: 0xe0000c66, 0x8809: 0xe0000c63, 0x880a: 0xe0000c78, 0x880b: 0xe0000c75, - 0x880c: 0xe0000e84, 0x880d: 0xe0000e81, 0x880e: 0xe0000e44, 0x880f: 0xe0000e41, - 0x8810: 0xe00027a9, 0x8811: 0xe00027a6, 0x8812: 0xe0000db5, 0x8813: 0xe0000db1, - 0x8814: 0xe0000dc5, 0x8815: 0xe0000dc1, 0x8816: 0xe0000dbd, 0x8817: 0xe0000db9, - 0x8818: 0xe0000e8b, 0x8819: 0xe0000e87, 0x881a: 0xe00027bb, 0x881b: 0xe00027b8, - 0x881c: 0xe0000e65, 0x881d: 0xe0000e61, 0x881e: 0xe0000e75, 0x881f: 0xe0000e71, - 0x8820: 0xe0000e6d, 0x8821: 0xe0000e69, 0x8822: 0xe0000e7d, 0x8823: 0xe0000e79, - 0x8824: 0xe000108d, 0x8825: 0xe000108a, 0x8826: 0xe000104d, 0x8827: 0xe000104a, - 0x8828: 0xe00027cd, 0x8829: 0xe00027ca, 0x882a: 0xe000106e, 0x882b: 0xe000106a, - 0x882c: 0xe000107e, 0x882d: 0xe000107a, 0x882e: 0xe0001076, 0x882f: 0xe0001072, - 0x8830: 0xe0001086, 0x8831: 0xe0001082, 0x8832: 0xe0001108, 0x8833: 0xe0001105, - 0x8834: 0xe0001135, 0x8835: 0xe0001132, 0x8836: 0xe000112f, 0x8837: 0xe000112c, - 0x8838: 0xe000111d, 0x8839: 0xe000111a, 0x883a: 0xe0000d0a, 0x883b: 0xe0000d07, - 0x883c: 0x0030d888, 0x883d: 0x4030d820, 0x883e: 0x00312088, 0x883f: 0x40312020, - // Block 0x221, offset 0x8840 - 0x8840: 0xa0000000, 0x8841: 0xa0000000, 0x8842: 0xa0000000, 0x8843: 0xa0000000, - 0x8844: 0xa0000000, 0x8845: 0xa0000000, 0x8846: 0xa0000000, 0x8847: 0xa0000000, - 0x8848: 0xa0000000, 0x8849: 0x40020020, 0x884a: 0x40020220, 0x884b: 0x40020420, - 0x884c: 0x40020620, 0x884d: 0x40020820, 0x884e: 0xa0000000, 0x884f: 0xa0000000, - 0x8850: 0xa0000000, 0x8851: 0xa0000000, 0x8852: 0xa0000000, 0x8853: 0xa0000000, - 0x8854: 0xa0000000, 0x8855: 0xa0000000, 0x8856: 0xa0000000, 0x8857: 0xa0000000, - 0x8858: 0xa0000000, 0x8859: 0xa0000000, 0x885a: 0xa0000000, 0x885b: 0xa0000000, - 0x885c: 0xa0000000, 0x885d: 0xa0000000, 0x885e: 0xa0000000, 0x885f: 0xa0000000, - 0x8860: 0x40021220, 0x8861: 0x4002ba20, 0x8862: 0x4003e020, 0x8863: 0x4004ea20, - 0x8864: 0x4027de20, 0x8865: 0x4004ec20, 0x8866: 0x4004e620, 0x8867: 0x4003d220, - 0x8868: 0x4003f420, 0x8869: 0x4003f620, 0x886a: 0x4004d820, 0x886b: 0x40093820, - 0x886c: 0x40024020, 0x886d: 0x40021a20, 0x886e: 0x4002e420, 0x886f: 0x4004e220, - 0x8870: 0x4029cc20, 0x8871: 0x4029ce20, 0x8872: 0x4029d020, 0x8873: 0x4029d220, - 0x8874: 0x4029d420, 0x8875: 0x4029d620, 0x8876: 0x4029d820, 0x8877: 0x4029da20, - 0x8878: 0x4029dc20, 0x8879: 0x4029de20, 0x887a: 0x40026c20, 0x887b: 0x40026220, - 0x887c: 0x40094020, 0x887d: 0xc32f0851, 0x887e: 0x40094420, 0x887f: 0x4002c420, - // Block 0x222, offset 0x8880 - 0x8880: 0x4004d620, 0x8881: 0xc3f10a51, 0x8882: 0x002c0a88, 0x8883: 0x002c3a88, - 0x8884: 0x002c6288, 0x8885: 0xc3920a11, 0x8886: 0x002d0888, 0x8887: 0x002d2288, - 0x8888: 0x002d6888, 0x8889: 0x002d9a88, 0x888a: 0x002dcc88, 0x888b: 0xc3ec0ce1, - 0x888c: 0xc0030002, 0x888d: 0x002e8288, 0x888e: 0x002e9e88, 0x888f: 0xc3970951, - 0x8890: 0x002f2c88, 0x8891: 0x002f5688, 0x8892: 0x002f7a88, 0x8893: 0x002fe688, - 0x8894: 0x00302c88, 0x8895: 0xc3840951, 0x8896: 0x0030be88, 0x8897: 0x0030e288, - 0x8898: 0x0030f688, 0x8899: 0x00310088, 0x889a: 0x00312a88, 0x889b: 0x4003f820, - 0x889c: 0x4004e420, 0x889d: 0x4003fa20, 0x889e: 0x40062420, 0x889f: 0x40021620, - 0x88a0: 0x40061e20, 0x88a1: 0xc3ee0a51, 0x88a2: 0x402c0a20, 0x88a3: 0x402c3a20, - 0x88a4: 0x402c6220, 0x88a5: 0xc3900a11, 0x88a6: 0x402d0820, 0x88a7: 0x402d2220, - 0x88a8: 0x402d6820, 0x88a9: 0x402d9a20, 0x88aa: 0x402dcc20, 0x88ab: 0x402dfe20, - 0x88ac: 0xc0000002, 0x88ad: 0x402e8220, 0x88ae: 0x402e9e20, 0x88af: 0xc3940951, - 0x88b0: 0x402f2c20, 0x88b1: 0x402f5620, 0x88b2: 0x402f7a20, 0x88b3: 0x402fe620, - 0x88b4: 0x40302c20, 0x88b5: 0xc3810951, 0x88b6: 0x4030be20, 0x88b7: 0x4030e220, - 0x88b8: 0x4030f620, 0x88b9: 0x40310020, 0x88ba: 0x40312a20, 0x88bb: 0x4003fc20, - 0x88bc: 0x40094820, 0x88bd: 0x4003fe20, 0x88be: 0x40094c20, 0x88bf: 0xa0000000, - // Block 0x223, offset 0x88c0 - 0x88c0: 0xe0000983, 0x88c1: 0xe0000980, 0x88c2: 0xe00008fb, 0x88c3: 0xe00008f8, - 0x88c4: 0xe000097d, 0x88c5: 0xe000097a, 0x88c6: 0xe0000a38, 0x88c7: 0xe0000a35, - 0x88c8: 0xe0000a3e, 0x88c9: 0xe0000a3b, 0x88ca: 0xe0000a4a, 0x88cb: 0xe0000a47, - 0x88cc: 0xe0000a44, 0x88cd: 0xe0000a41, 0x88ce: 0xe0000a86, 0x88cf: 0xe0000a83, - 0x88d0: 0x002c62a3, 0x88d1: 0x402c6221, 0x88d2: 0xe0000b46, 0x88d3: 0xe0000b43, - 0x88d4: 0xe0000aee, 0x88d5: 0xe0000aeb, 0x88d6: 0xe0000b2c, 0x88d7: 0xe0000b29, - 0x88d8: 0x00320cc3, 0x88d9: 0x40320c22, 0x88da: 0xe0000b1a, 0x88db: 0xe0000b17, - 0x88dc: 0xe0000bb8, 0x88dd: 0xe0000bb5, 0x88de: 0xe0000bb2, 0x88df: 0xe0000baf, - 0x88e0: 0xe0000bc4, 0x88e1: 0xe0000bc1, 0x88e2: 0xe0000bca, 0x88e3: 0xe0000bc7, - 0x88e4: 0xe0000bee, 0x88e5: 0xe0000beb, 0x88e6: 0xe0000c1b, 0x88e7: 0xe0000c18, - 0x88e8: 0xe0000c51, 0x88e9: 0xe0000c4e, 0x88ea: 0xe0000c60, 0x88eb: 0xe0000c5d, - 0x88ec: 0xe0000c31, 0x88ed: 0xe0000c2e, 0x88ee: 0xe0000c5a, 0x88ef: 0xe0000c57, - 0x88f0: 0xe0000c54, 0x88f1: 0x402da220, 0x88f2: 0xf0000a0a, 0x88f3: 0xf0000404, - 0x88f4: 0xe0000c8a, 0x88f5: 0xe0000c87, 0x88f6: 0xe0000c9f, 0x88f7: 0xe0000c9c, - 0x88f8: 0x402f5621, 0x88f9: 0xe0000ccc, 0x88fa: 0xe0000cc9, 0x88fb: 0xe0000cd8, - 0x88fc: 0xe0000cd5, 0x88fd: 0xe0000cd2, 0x88fe: 0xe0000ccf, 0x88ff: 0xe0000d04, - // Block 0x224, offset 0x8900 - 0x8900: 0x4062ac20, 0x8901: 0xe0002526, 0x8902: 0x4062b020, 0x8903: 0x4062b220, - 0x8904: 0xe0002532, 0x8905: 0x4062b620, 0x8906: 0x4062b820, 0x8907: 0x4062ba20, - 0x8908: 0xe000254a, 0x8909: 0x4062be20, 0x890a: 0xe0002550, 0x890b: 0x4062c220, - 0x890c: 0x4062c420, 0x890d: 0xe0002553, 0x890e: 0x4062c820, 0x890f: 0x4062ca20, - 0x8910: 0x4062cc20, 0x8911: 0x4062ce20, 0x8912: 0x4062d020, 0x8913: 0xe00027ef, - 0x8914: 0xe00027f2, 0x8915: 0xe00027f5, 0x8916: 0xe00027f8, 0x8917: 0xe0002801, - 0x8918: 0xe000280b, 0x8919: 0xe0002815, 0x891a: 0xe0002547, 0x891b: 0xe0002830, - 0x891c: 0xe000283c, 0x891d: 0xe0002846, 0x891e: 0xe000284f, 0x891f: 0xe0002852, - 0x8920: 0xe0002855, 0x8921: 0xe000254d, 0x8922: 0xe000285f, 0x8923: 0xe0002863, - 0x8924: 0xe0002867, 0x8925: 0xe000286b, 0x8926: 0xe000286f, 0x8927: 0xe0002876, - 0x8928: 0xe0002879, 0x8929: 0xe000287c, 0x892a: 0xe000287f, 0x892b: 0xe0002873, - 0x892c: 0xe000285b, 0x892d: 0xe0002885, 0x892e: 0xe0002888, 0x892f: 0xe000288b, - 0x8930: 0xe000288e, 0x8931: 0xe0002891, 0x8932: 0xe0002894, 0x8933: 0xe0002897, - 0x8934: 0xe000289b, 0x8935: 0xe000289f, 0x8936: 0xe00028a2, 0x8937: 0xe00028a5, - 0x8938: 0xe00028a8, 0x8939: 0xe00028ab, 0x893a: 0xe00028ae, 0x893b: 0xe00028b1, - 0x893c: 0x40632420, 0x893d: 0x40632620, 0x893e: 0x40632820, 0x893f: 0x40632a20, - // Block 0x225, offset 0x8940 - 0x8940: 0x40632c20, 0x8941: 0xe00028b4, 0x8942: 0xe00028bb, 0x8943: 0xe00028be, - 0x8944: 0xe00028c1, 0x8945: 0xe00028c4, 0x8946: 0x40633820, 0x8947: 0xe00028c7, - 0x8948: 0xe00028ca, 0x8949: 0xe00028cd, 0x894a: 0xe00028d3, 0x894b: 0xe00028d6, - 0x894c: 0x40634420, 0x894d: 0xe00028d9, 0x894e: 0x40634820, 0x894f: 0x40634a20, - 0x8950: 0x40634c20, 0x8951: 0x40634e20, 0x8952: 0xe00028dc, 0x8953: 0xe00028df, - 0x8954: 0x40635420, 0x8955: 0x40635620, 0x8956: 0xe00028e2, 0x8957: 0xe00028e5, - 0x8958: 0xe00028f4, 0x8959: 0x40635e20, 0x895a: 0xe00027d9, 0x895b: 0xe00027fb, - 0x895c: 0xe000252c, 0x895d: 0xe000252f, 0x895e: 0xe0002804, 0x895f: 0x4063a420, - 0x8960: 0x4063a620, 0x8961: 0x4063a820, 0x8962: 0xe0002556, 0x8963: 0x4063ac20, - 0x8964: 0xe0002559, 0x8965: 0x4063b020, 0x8966: 0xe000255c, 0x8967: 0x4063b420, - 0x8968: 0xe000255f, 0x8969: 0x4063b820, 0x896a: 0xe0002562, 0x896b: 0xe0002565, - 0x896c: 0xe0002569, 0x896d: 0x4063c020, 0x896e: 0x4063c220, 0x896f: 0xe000256c, - 0x8970: 0xe000256f, 0x8971: 0xe0002573, 0x8972: 0x4063ca20, 0x8973: 0x4063cc20, - 0x8974: 0x4063ce20, 0x8975: 0x4063d020, 0x8976: 0xe00028f7, 0x8977: 0xe00028fa, - 0x8978: 0xe0002900, 0x8979: 0xe0002903, 0x897a: 0xe0002909, 0x897b: 0xe000290c, - 0x897c: 0xe000290f, 0x897d: 0xe0002915, 0x897e: 0xe0002918, 0x897f: 0xe0002922, - // Block 0x226, offset 0x8980 - 0x8980: 0xe0002925, 0x8981: 0xe0002929, 0x8982: 0xe000292d, 0x8983: 0xe0002930, - 0x8984: 0xe0002933, 0x8985: 0xe0002936, 0x8986: 0xe000293a, 0x8987: 0xe000293d, - 0x8988: 0xe0002940, 0x8989: 0xe0002943, 0x898a: 0xe0002946, 0x898b: 0xe000294a, - 0x898c: 0xe000294e, 0x898d: 0xe0002952, 0x898e: 0xe0002955, 0x898f: 0xe0002958, - 0x8990: 0xe000295b, 0x8991: 0xe000295f, 0x8992: 0xe0002962, 0x8993: 0xe0002966, - 0x8994: 0xe0002969, 0x8995: 0xe000296c, 0x8996: 0xe000296f, 0x8997: 0xe0002972, - 0x8998: 0xe0002975, 0x8999: 0xe0002978, 0x899a: 0xe000297b, 0x899b: 0xe000297e, - 0x899c: 0xe0002981, 0x899d: 0x40642020, 0x899e: 0x40642220, 0x899f: 0x40642420, - 0x89a0: 0x40642620, 0x89a1: 0x40642820, 0x89a2: 0x40642a20, 0x89a3: 0xe00028fd, - 0x89a4: 0xe0002906, 0x89a5: 0xe0002912, 0x89a6: 0xe000291b, 0x89a7: 0xe000291e, - 0x89a8: 0x4062ac20, 0x89a9: 0xe0002526, 0x89aa: 0xe0002529, 0x89ab: 0x4062b020, - 0x89ac: 0xe000252c, 0x89ad: 0xe000252f, 0x89ae: 0x4062b220, 0x89af: 0x4062b620, - 0x89b0: 0xe0002535, 0x89b1: 0xe0002538, 0x89b2: 0xe000253b, 0x89b3: 0xe000253e, - 0x89b4: 0xe0002541, 0x89b5: 0xe0002544, 0x89b6: 0xe0002547, 0x89b7: 0x4062b820, - 0x89b8: 0x4062ba20, 0x89b9: 0xe000254d, 0x89ba: 0x4062be20, 0x89bb: 0xe0002550, - 0x89bc: 0x4062c220, 0x89bd: 0x4062c420, 0x89be: 0x4062c820, 0x89bf: 0x4062ca20, - // Block 0x227, offset 0x89c0 - 0x89c0: 0x4062cc20, 0x89c1: 0x4062ce20, 0x89c2: 0x4062d020, 0x89c3: 0xe00027dc, - 0x89c4: 0xe00027e2, 0x89c5: 0xe00027ef, 0x89c6: 0xe00027f5, 0x89c7: 0xe00027fb, - 0x89c8: 0x4064a420, 0x89c9: 0xe00027fe, 0x89ca: 0xe0002801, 0x89cb: 0xe0002804, - 0x89cc: 0xe0002807, 0x89cd: 0xe000280b, 0x89ce: 0xe000280e, 0x89cf: 0xe0002811, - 0x89d0: 0xe0002815, 0x89d1: 0xe0002818, 0x89d2: 0xe000281c, 0x89d3: 0xe0002820, - 0x89d4: 0xe0002828, 0x89d5: 0xe0002824, 0x89d6: 0xe000282c, 0x89d7: 0x4064c220, - 0x89d8: 0xe0002833, 0x89d9: 0x4064c620, 0x89da: 0xe0002836, 0x89db: 0xe0002839, - 0x89dc: 0xe000283c, 0x89dd: 0xe000283f, 0x89de: 0xe0002842, 0x89df: 0x4064d220, - 0x89e0: 0xe0002849, 0x89e1: 0xe000284c, 0x89e2: 0xe0002846, 0x89e3: 0xe0002858, - 0x89e4: 0xe000287f, 0x89e5: 0xe0002882, 0x89e6: 0xe0002873, 0x89e7: 0xe0002885, - 0x89e8: 0xe000288b, 0x89e9: 0xe000288e, 0x89ea: 0xe0002894, 0x89eb: 0x4064ea20, - 0x89ec: 0xe00028b4, 0x89ed: 0xe00028b7, 0x89ee: 0xe00028c7, 0x89ef: 0xe00028d0, - 0x89f0: 0x4064f420, 0x89f1: 0x4064f620, 0x89f2: 0x4064f820, 0x89f3: 0xe00028e2, - 0x89f4: 0xe00028e5, 0x89f5: 0xe00028e8, 0x89f6: 0xe00028eb, 0x89f7: 0xe00028ee, - 0x89f8: 0xe00028f1, 0x89f9: 0x40650620, 0x89fa: 0xe00027d6, 0x89fb: 0xe00027df, - 0x89fc: 0xe00027e6, 0x89fd: 0xe00027e9, 0x89fe: 0xe00027ec, 0x89ff: 0xe00027f2, - // Block 0x228, offset 0x8a00 - 0x8a00: 0xc3f40cf1, 0x8a01: 0x4062ac21, 0x8a02: 0x4062b020, 0x8a03: 0xc3f60d21, - 0x8a04: 0x4062b221, 0x8a05: 0x4062b620, 0x8a06: 0x4062b820, 0x8a07: 0xc3f80d51, - 0x8a08: 0x4062ba21, 0x8a09: 0xc3fa0d81, 0x8a0a: 0x4062be21, 0x8a0b: 0x4062c220, - 0x8a0c: 0xc3fc0db1, 0x8a0d: 0x4062c421, 0x8a0e: 0x4062c820, 0x8a0f: 0x4062ca20, - 0x8a10: 0x4062cc20, 0x8a11: 0x4062ce20, 0x8a12: 0x4062d020, 0x8a13: 0x4062d220, - 0x8a14: 0x4062d420, 0x8a15: 0x4062d620, 0x8a16: 0x4062d820, 0x8a17: 0x4062da20, - 0x8a18: 0x4062dc20, 0x8a19: 0x4062de20, 0x8a1a: 0x4062e020, 0x8a1b: 0x4062e220, - 0x8a1c: 0x4062e420, 0x8a1d: 0x4062e620, 0x8a1e: 0x4062e820, 0x8a1f: 0x4062ea20, - 0x8a20: 0x4062ec20, 0x8a21: 0x4062ee20, 0x8a22: 0x4062f020, 0x8a23: 0x4062f220, - 0x8a24: 0x4062f420, 0x8a25: 0x4062f620, 0x8a26: 0x4062f820, 0x8a27: 0x4062fa20, - 0x8a28: 0x4062fc20, 0x8a29: 0x4062fe20, 0x8a2a: 0x40630020, 0x8a2b: 0x40630220, - 0x8a2c: 0x40630420, 0x8a2d: 0x40630620, 0x8a2e: 0x40630820, 0x8a2f: 0x40630a20, - 0x8a30: 0x40630c20, 0x8a31: 0x40630e20, 0x8a32: 0x40631020, 0x8a33: 0x40631220, - 0x8a34: 0x40631420, 0x8a35: 0x40631620, 0x8a36: 0x40631820, 0x8a37: 0x40631a20, - 0x8a38: 0x40631c20, 0x8a39: 0x40631e20, 0x8a3a: 0x40632020, 0x8a3b: 0x40632220, - 0x8a3c: 0x40632420, 0x8a3d: 0x40632620, 0x8a3e: 0x40632820, 0x8a3f: 0x40632a20, - // Block 0x229, offset 0x8a40 - 0x8a40: 0x40632c20, 0x8a41: 0x40632e20, 0x8a42: 0x40633020, 0x8a43: 0x40633220, - 0x8a44: 0x40633420, 0x8a45: 0x40633620, 0x8a46: 0x40633820, 0x8a47: 0x40633a20, - 0x8a48: 0x40633c20, 0x8a49: 0x40633e20, 0x8a4a: 0x40634020, 0x8a4b: 0x40634220, - 0x8a4c: 0x40634420, 0x8a4d: 0x40634620, 0x8a4e: 0x40634820, 0x8a4f: 0x40634a20, - 0x8a50: 0x40634c20, 0x8a51: 0x40634e20, 0x8a52: 0x40635020, 0x8a53: 0x40635220, - 0x8a54: 0x40635420, 0x8a55: 0x40635620, 0x8a56: 0x40635820, 0x8a57: 0x40635a20, - 0x8a58: 0x40635c20, 0x8a59: 0x40635e20, 0x8a5a: 0x40636020, 0x8a5b: 0x40636220, - 0x8a5c: 0x40636420, 0x8a5d: 0x40636620, 0x8a5e: 0x40636820, 0x8a5f: 0x4063a420, - 0x8a60: 0x4063a620, 0x8a61: 0xa0002502, 0x8a62: 0xa0002602, 0x8a63: 0xa0002702, - 0x8a64: 0xa0002802, 0x8a65: 0xa0002902, 0x8a66: 0xa0002a02, 0x8a67: 0xa0002b02, - 0x8a68: 0xa0002c02, 0x8a69: 0xa0002d02, 0x8a6a: 0xa0002e02, 0x8a6b: 0xa0002f02, - 0x8a6c: 0xa0003002, 0x8a6d: 0xa0003102, 0x8a6e: 0xa0003202, 0x8a6f: 0xa0003302, - 0x8a70: 0xa0003402, 0x8a71: 0xa0003502, 0x8a72: 0xa0003602, 0x8a73: 0xa0003702, - 0x8a74: 0xa0003802, 0x8a75: 0xa0003902, 0x8a76: 0x4063d220, 0x8a77: 0x4063d420, - 0x8a78: 0x4063d620, 0x8a79: 0x4063d820, 0x8a7a: 0x4063da20, 0x8a7b: 0x4063dc20, - 0x8a7c: 0x4063de20, 0x8a7d: 0x4063e020, 0x8a7e: 0x4063e220, 0x8a7f: 0x4063e420, - // Block 0x22a, offset 0x8a80 - 0x8a80: 0x4063e620, 0x8a81: 0x4063e820, 0x8a82: 0x4063ea20, 0x8a83: 0x4063ec20, - 0x8a84: 0x4063ee20, 0x8a85: 0x4063f020, 0x8a86: 0x4063f220, 0x8a87: 0x4063f420, - 0x8a88: 0x4063f620, 0x8a89: 0x4063f820, 0x8a8a: 0x4063fa20, 0x8a8b: 0x4063fc20, - 0x8a8c: 0x4063fe20, 0x8a8d: 0x40640020, 0x8a8e: 0x40640220, 0x8a8f: 0x40640420, - 0x8a90: 0x40640620, 0x8a91: 0x40640820, 0x8a92: 0x40640a20, 0x8a93: 0x40640c20, - 0x8a94: 0x40640e20, 0x8a95: 0x40641020, 0x8a96: 0x40641220, 0x8a97: 0x40641420, - 0x8a98: 0x40641620, 0x8a99: 0x40641820, 0x8a9a: 0x40641a20, 0x8a9b: 0x40641c20, - 0x8a9c: 0x40641e20, 0x8a9d: 0x40642020, 0x8a9e: 0x40642220, 0x8a9f: 0x40642420, - 0x8aa0: 0x40642620, 0x8aa1: 0x40642820, 0x8aa2: 0x40642a20, 0x8aa3: 0x40642c20, - 0x8aa4: 0x40642e20, 0x8aa5: 0x40643020, 0x8aa6: 0x40643220, 0x8aa7: 0x40643420, - 0x8aa8: 0xa0003a02, 0x8aa9: 0xa0003b02, 0x8aaa: 0xa0003c02, 0x8aab: 0xa0003d02, - 0x8aac: 0xa0003e02, 0x8aad: 0xa0003f02, 0x8aae: 0xa0004002, 0x8aaf: 0xa0004102, - 0x8ab0: 0xa0004202, 0x8ab1: 0xa0004302, 0x8ab2: 0xa0004402, 0x8ab3: 0xa0004502, - 0x8ab4: 0xa0004602, 0x8ab5: 0xa0004702, 0x8ab6: 0xa0004802, 0x8ab7: 0xa0004902, - 0x8ab8: 0xa0004a02, 0x8ab9: 0xa0004b02, 0x8aba: 0xa0004c02, 0x8abb: 0xa0004d02, - 0x8abc: 0xa0004e02, 0x8abd: 0xa0004f02, 0x8abe: 0xa0005002, 0x8abf: 0xa0005102, - // Block 0x22b, offset 0x8ac0 - 0x8ac0: 0xa0005202, 0x8ac1: 0xa0005302, 0x8ac2: 0xa0005402, 0x8ac3: 0x40649a20, - 0x8ac4: 0x40649c20, 0x8ac5: 0x40649e20, 0x8ac6: 0x4064a020, 0x8ac7: 0x4064a220, - 0x8ac8: 0x4064a420, 0x8ac9: 0x4064a620, 0x8aca: 0x4064a820, 0x8acb: 0x4064aa20, - 0x8acc: 0x4064ac20, 0x8acd: 0x4064ae20, 0x8ace: 0x4064b020, 0x8acf: 0x4064b220, - 0x8ad0: 0x4064b420, 0x8ad1: 0x4064b620, 0x8ad2: 0x4064b820, 0x8ad3: 0x4064ba20, - 0x8ad4: 0x4064bc20, 0x8ad5: 0x4064be20, 0x8ad6: 0x4064c020, 0x8ad7: 0x4064c220, - 0x8ad8: 0x4064c420, 0x8ad9: 0x4064c620, 0x8ada: 0x4064c820, 0x8adb: 0x4064ca20, - 0x8adc: 0x4064cc20, 0x8add: 0x4064ce20, 0x8ade: 0x4064d020, 0x8adf: 0x4064d220, - 0x8ae0: 0x4064d420, 0x8ae1: 0x4064d620, 0x8ae2: 0x4064d820, 0x8ae3: 0x4064da20, - 0x8ae4: 0x4064dc20, 0x8ae5: 0x4064de20, 0x8ae6: 0x4064e020, 0x8ae7: 0x4064e220, - 0x8ae8: 0x4064e420, 0x8ae9: 0x4064e620, 0x8aea: 0x4064e820, 0x8aeb: 0x4064ea20, - 0x8aec: 0x4064ec20, 0x8aed: 0x4064ee20, 0x8aee: 0x4064f020, 0x8aef: 0x4064f220, - 0x8af0: 0x4064f420, 0x8af1: 0x4064f620, 0x8af2: 0x4064f820, 0x8af3: 0x4064fa20, - 0x8af4: 0x4064fc20, 0x8af5: 0x4064fe20, 0x8af6: 0x40650020, 0x8af7: 0x40650220, - 0x8af8: 0x40650420, 0x8af9: 0x40650620, 0x8afa: 0x40650820, 0x8afb: 0x40650a20, - 0x8afc: 0x40650c20, 0x8afd: 0x40650e20, 0x8afe: 0x40651020, 0x8aff: 0x40651220, - // Block 0x22c, offset 0x8b00 - 0x8b05: 0x4065da20, 0x8b06: 0x4065dc20, 0x8b07: 0x4065de20, - 0x8b08: 0x4065e020, 0x8b09: 0x4065e420, 0x8b0a: 0x4065e620, 0x8b0b: 0x4065e820, - 0x8b0c: 0x4065ea20, 0x8b0d: 0x4065ec20, 0x8b0e: 0x4065ee20, 0x8b0f: 0x4065f420, - 0x8b10: 0x4065f620, 0x8b11: 0x4065f820, 0x8b12: 0x4065fa20, 0x8b13: 0x4065fe20, - 0x8b14: 0x40660020, 0x8b15: 0x40660220, 0x8b16: 0x40660420, 0x8b17: 0x40660620, - 0x8b18: 0x40660820, 0x8b19: 0x40660a20, 0x8b1a: 0x40661220, 0x8b1b: 0x40661420, - 0x8b1c: 0x40661820, 0x8b1d: 0x40661a20, 0x8b1e: 0x40661e20, 0x8b1f: 0x40662020, - 0x8b20: 0x40662220, 0x8b21: 0x40662420, 0x8b22: 0x40662620, 0x8b23: 0x40662820, - 0x8b24: 0x40662a20, 0x8b25: 0x40662e20, 0x8b26: 0x40663620, 0x8b27: 0x40663820, - 0x8b28: 0x40663a20, 0x8b29: 0x40663c20, 0x8b2a: 0x4065e220, 0x8b2b: 0x4065f020, - 0x8b2c: 0x4065fc20, 0x8b2d: 0x40663e20, - 0x8b31: 0x0062ac84, 0x8b32: 0x0062aca3, 0x8b33: 0x00646884, - 0x8b34: 0x0062b084, 0x8b35: 0x00646c84, 0x8b36: 0x00646e84, 0x8b37: 0x0062b284, - 0x8b38: 0x0062b2a3, 0x8b39: 0x0062b684, 0x8b3a: 0x00647484, 0x8b3b: 0x00647684, - 0x8b3c: 0x00647884, 0x8b3d: 0x00647a84, 0x8b3e: 0x00647c84, 0x8b3f: 0x00647e84, - // Block 0x22d, offset 0x8b40 - 0x8b40: 0x0062e084, 0x8b41: 0x0062b884, 0x8b42: 0x0062ba84, 0x8b43: 0x0062baa3, - 0x8b44: 0x0062ee84, 0x8b45: 0x0062be84, 0x8b46: 0x0062bea3, 0x8b47: 0x0062c284, - 0x8b48: 0x0062c484, 0x8b49: 0x0062c4a3, 0x8b4a: 0x0062c884, 0x8b4b: 0x0062ca84, - 0x8b4c: 0x0062cc84, 0x8b4d: 0x0062ce84, 0x8b4e: 0x0062d084, 0x8b4f: 0x0063a884, - 0x8b50: 0x0063aa84, 0x8b51: 0x0063ac84, 0x8b52: 0x0063ae84, 0x8b53: 0x0063b084, - 0x8b54: 0x0063b284, 0x8b55: 0x0063b484, 0x8b56: 0x0063b684, 0x8b57: 0x0063b884, - 0x8b58: 0x0063ba84, 0x8b59: 0x0063bc84, 0x8b5a: 0x0063be84, 0x8b5b: 0x0063c084, - 0x8b5c: 0x0063c284, 0x8b5d: 0x0063c484, 0x8b5e: 0x0063c684, 0x8b5f: 0x0063c884, - 0x8b60: 0x0063ca84, 0x8b61: 0x0063cc84, 0x8b62: 0x0063ce84, 0x8b63: 0x0063d084, - 0x8b64: 0x0063a684, 0x8b65: 0x0062d484, 0x8b66: 0x0062d684, 0x8b67: 0x0064a284, - 0x8b68: 0x0064a484, 0x8b69: 0x0064ac84, 0x8b6a: 0x0064b084, 0x8b6b: 0x0064ba84, - 0x8b6c: 0x0064c284, 0x8b6d: 0x0064c684, 0x8b6e: 0x0062e484, 0x8b6f: 0x0064ce84, - 0x8b70: 0x0064d284, 0x8b71: 0x0062e684, 0x8b72: 0x0062e884, 0x8b73: 0x0062ec84, - 0x8b74: 0x0062f084, 0x8b75: 0x0062f284, 0x8b76: 0x0062fa84, 0x8b77: 0x0062fe84, - 0x8b78: 0x00630284, 0x8b79: 0x00630484, 0x8b7a: 0x00630684, 0x8b7b: 0x00630884, - 0x8b7c: 0x00630a84, 0x8b7d: 0x00631084, 0x8b7e: 0x00631884, 0x8b7f: 0x00632c84, - // Block 0x22e, offset 0x8b80 - 0x8b80: 0xf0000404, 0x8b81: 0xf0000404, 0x8b82: 0xf0000404, 0x8b83: 0xf0000404, - 0x8b84: 0x02aa9e86, 0x8b85: 0x02bcf886, 0x8b86: 0x02cb0e86, 0x8b87: 0x02f71e86, - 0x8b88: 0xe00002e3, 0x8b89: 0xe00003d8, 0x8b8a: 0xe00004b3, 0x8b8b: 0xe000057d, - 0x8b8c: 0xe0000648, 0x8b8d: 0xe00006f0, 0x8b8e: 0xe000079c, 0x8b8f: 0xe0000841, - 0x8b90: 0xe0000ec0, 0x8b91: 0xf0000606, 0x8b92: 0xf0000606, 0x8b93: 0xf0000606, - 0x8b94: 0xf0000606, 0x8b95: 0xf0000606, 0x8b96: 0xf0000606, 0x8b97: 0xf0000606, - 0x8b98: 0xf0000606, 0x8b99: 0xf0000606, 0x8b9a: 0xf0000606, 0x8b9b: 0xf0000606, - 0x8b9c: 0xf0000606, 0x8b9d: 0xf0000606, 0x8b9e: 0xf0000606, 0x8b9f: 0xf0000606, - 0x8ba0: 0x0062ac86, 0x8ba1: 0x0062b086, 0x8ba2: 0x0062b286, 0x8ba3: 0x0062b686, - 0x8ba4: 0x0062b886, 0x8ba5: 0x0062ba86, 0x8ba6: 0x0062be86, 0x8ba7: 0x0062c286, - 0x8ba8: 0x0062c486, 0x8ba9: 0x0062c886, 0x8baa: 0x0062ca86, 0x8bab: 0x0062cc86, - 0x8bac: 0x0062ce86, 0x8bad: 0x0062d086, 0x8bae: 0xe0002984, 0x8baf: 0xe0002987, - 0x8bb0: 0xe000298a, 0x8bb1: 0xe000298d, 0x8bb2: 0xe0002990, 0x8bb3: 0xe0002993, - 0x8bb4: 0xe0002996, 0x8bb5: 0xe0002999, 0x8bb6: 0xe000299f, 0x8bb7: 0xe00029a2, - 0x8bb8: 0xe00029a5, 0x8bb9: 0xe00029a8, 0x8bba: 0xe00029ab, 0x8bbb: 0xe00029ae, - 0x8bbc: 0xe0002127, 0x8bbd: 0xe0002122, 0x8bbe: 0xe000299c, 0x8bbf: 0x4027ac20, - // Block 0x22f, offset 0x8bc0 - 0x8bc0: 0xa0000000, 0x8bc1: 0xa0000000, 0x8bc2: 0xa0000000, 0x8bc3: 0xa0000000, - 0x8bc4: 0xa0000000, 0x8bc5: 0xa0000000, 0x8bc6: 0xa0000000, 0x8bc7: 0xa0000000, - 0x8bc8: 0xa0000000, 0x8bc9: 0x40020020, 0x8bca: 0x40020220, 0x8bcb: 0x40020420, - 0x8bcc: 0x40020620, 0x8bcd: 0x40020820, 0x8bce: 0xa0000000, 0x8bcf: 0xa0000000, - 0x8bd0: 0xa0000000, 0x8bd1: 0xa0000000, 0x8bd2: 0xa0000000, 0x8bd3: 0xa0000000, - 0x8bd4: 0xa0000000, 0x8bd5: 0xa0000000, 0x8bd6: 0xa0000000, 0x8bd7: 0xa0000000, - 0x8bd8: 0xa0000000, 0x8bd9: 0xa0000000, 0x8bda: 0xa0000000, 0x8bdb: 0xa0000000, - 0x8bdc: 0xa0000000, 0x8bdd: 0xa0000000, 0x8bde: 0xa0000000, 0x8bdf: 0xa0000000, - 0x8be0: 0x40021220, 0x8be1: 0x4002ba20, 0x8be2: 0x4003e020, 0x8be3: 0x4004ea20, - 0x8be4: 0x4027de20, 0x8be5: 0x4004ec20, 0x8be6: 0x4004e620, 0x8be7: 0x4003d220, - 0x8be8: 0x4003f420, 0x8be9: 0x4003f620, 0x8bea: 0x4004d820, 0x8beb: 0x40093820, - 0x8bec: 0x40024020, 0x8bed: 0x40021a20, 0x8bee: 0x4002e420, 0x8bef: 0x4004e220, - 0x8bf0: 0x4029cc20, 0x8bf1: 0x4029ce20, 0x8bf2: 0x4029d020, 0x8bf3: 0x4029d220, - 0x8bf4: 0x4029d420, 0x8bf5: 0x4029d620, 0x8bf6: 0x4029d820, 0x8bf7: 0x4029da20, - 0x8bf8: 0x4029dc20, 0x8bf9: 0x4029de20, 0x8bfa: 0x40026c20, 0x8bfb: 0x40026220, - 0x8bfc: 0x40094020, 0x8bfd: 0xc32f0851, 0x8bfe: 0x40094420, 0x8bff: 0x4002c420, - // Block 0x230, offset 0x8c00 - 0x8c00: 0x4004d620, 0x8c01: 0xc40209c3, 0x8c02: 0x002c0a88, 0x8c03: 0x002c3a88, - 0x8c04: 0x002c6288, 0x8c05: 0xc3920a11, 0x8c06: 0x002d0888, 0x8c07: 0x002d2288, - 0x8c08: 0x002d6888, 0x8c09: 0x002d9a88, 0x8c0a: 0x002dcc88, 0x8c0b: 0x002dfe88, - 0x8c0c: 0xc0030002, 0x8c0d: 0x002e8288, 0x8c0e: 0x002e9e88, 0x8c0f: 0xc3970951, - 0x8c10: 0x002f2c88, 0x8c11: 0x002f5688, 0x8c12: 0x002f7a88, 0x8c13: 0x002fe688, - 0x8c14: 0x00302c88, 0x8c15: 0xc3840951, 0x8c16: 0x0030be88, 0x8c17: 0x0030e288, - 0x8c18: 0x0030f688, 0x8c19: 0x00310088, 0x8c1a: 0x00312a88, 0x8c1b: 0x4003f820, - 0x8c1c: 0x4004e420, 0x8c1d: 0x4003fa20, 0x8c1e: 0x40062420, 0x8c1f: 0x40021620, - 0x8c20: 0x40061e20, 0x8c21: 0xc3fe0982, 0x8c22: 0x402c0a20, 0x8c23: 0x402c3a20, - 0x8c24: 0x402c6220, 0x8c25: 0xc3900a11, 0x8c26: 0x402d0820, 0x8c27: 0x402d2220, - 0x8c28: 0x402d6820, 0x8c29: 0x402d9a20, 0x8c2a: 0x402dcc20, 0x8c2b: 0x402dfe20, - 0x8c2c: 0xc0000002, 0x8c2d: 0x402e8220, 0x8c2e: 0x402e9e20, 0x8c2f: 0xc3940951, - 0x8c30: 0x402f2c20, 0x8c31: 0x402f5620, 0x8c32: 0x402f7a20, 0x8c33: 0x402fe620, - 0x8c34: 0x40302c20, 0x8c35: 0xc3810951, 0x8c36: 0x4030be20, 0x8c37: 0x4030e220, - 0x8c38: 0x4030f620, 0x8c39: 0x40310020, 0x8c3a: 0x40312a20, 0x8c3b: 0x4003fc20, - 0x8c3c: 0x40094820, 0x8c3d: 0x4003fe20, 0x8c3e: 0x40094c20, 0x8c3f: 0xa0000000, - // Block 0x231, offset 0x8c40 - 0x8c40: 0xa0000000, 0x8c41: 0xa0000000, 0x8c42: 0xa0000000, 0x8c43: 0xa0000000, - 0x8c44: 0xa0000000, 0x8c45: 0xa0000000, 0x8c46: 0xa0000000, 0x8c47: 0xa0000000, - 0x8c48: 0xa0000000, 0x8c49: 0x40020020, 0x8c4a: 0x40020220, 0x8c4b: 0x40020420, - 0x8c4c: 0x40020620, 0x8c4d: 0x40020820, 0x8c4e: 0xa0000000, 0x8c4f: 0xa0000000, - 0x8c50: 0xa0000000, 0x8c51: 0xa0000000, 0x8c52: 0xa0000000, 0x8c53: 0xa0000000, - 0x8c54: 0xa0000000, 0x8c55: 0xa0000000, 0x8c56: 0xa0000000, 0x8c57: 0xa0000000, - 0x8c58: 0xa0000000, 0x8c59: 0xa0000000, 0x8c5a: 0xa0000000, 0x8c5b: 0xa0000000, - 0x8c5c: 0xa0000000, 0x8c5d: 0xa0000000, 0x8c5e: 0xa0000000, 0x8c5f: 0xa0000000, - 0x8c60: 0x40021220, 0x8c61: 0x4002ba20, 0x8c62: 0x4003e020, 0x8c63: 0x4004ea20, - 0x8c64: 0x4027de20, 0x8c65: 0x4004ec20, 0x8c66: 0x4004e620, 0x8c67: 0x4003d220, - 0x8c68: 0x4003f420, 0x8c69: 0x4003f620, 0x8c6a: 0x4004d820, 0x8c6b: 0x40093820, - 0x8c6c: 0x40024020, 0x8c6d: 0x40021a20, 0x8c6e: 0x4002e420, 0x8c6f: 0x4004e220, - 0x8c70: 0x4029cc20, 0x8c71: 0x4029ce20, 0x8c72: 0x4029d020, 0x8c73: 0x4029d220, - 0x8c74: 0x4029d420, 0x8c75: 0x4029d620, 0x8c76: 0x4029d820, 0x8c77: 0x4029da20, - 0x8c78: 0x4029dc20, 0x8c79: 0x4029de20, 0x8c7a: 0x40026c20, 0x8c7b: 0x40026220, - 0x8c7c: 0x40094020, 0x8c7d: 0xc32f0851, 0x8c7e: 0x40094420, 0x8c7f: 0x4002c420, - // Block 0x232, offset 0x8c80 - 0x8c80: 0x4004d620, 0x8c81: 0xc40d0de1, 0x8c82: 0x002c0a88, 0x8c83: 0xc41508d1, - 0x8c84: 0x002c6288, 0x8c85: 0x002c9888, 0x8c86: 0x002d0888, 0x8c87: 0xc41d08d1, - 0x8c88: 0x002d6888, 0x8c89: 0x002d9a88, 0x8c8a: 0x002dcc88, 0x8c8b: 0xc42108d1, - 0x8c8c: 0xc0030002, 0x8c8d: 0x002e8288, 0x8c8e: 0xc4260e31, 0x8c8f: 0xc4370e61, - 0x8c90: 0x002f2c88, 0x8c91: 0x002f5688, 0x8c92: 0x002f7a88, 0x8c93: 0xc42b08d1, - 0x8c94: 0x00302c88, 0x8c95: 0xc3840951, 0x8c96: 0x0030be88, 0x8c97: 0x0030e288, - 0x8c98: 0x0030f688, 0x8c99: 0x00310088, 0x8c9a: 0xc42f08d1, 0x8c9b: 0x4003f820, - 0x8c9c: 0x4004e420, 0x8c9d: 0x4003fa20, 0x8c9e: 0x40062420, 0x8c9f: 0x40021620, - 0x8ca0: 0x40061e20, 0x8ca1: 0xc4070de1, 0x8ca2: 0x402c0a20, 0x8ca3: 0xc41308d1, - 0x8ca4: 0x402c6220, 0x8ca5: 0x402c9820, 0x8ca6: 0x402d0820, 0x8ca7: 0xc41b08d1, - 0x8ca8: 0x402d6820, 0x8ca9: 0x402d9a20, 0x8caa: 0x402dcc20, 0x8cab: 0xc41f08d1, - 0x8cac: 0xc0000002, 0x8cad: 0x402e8220, 0x8cae: 0xc4230e31, 0x8caf: 0xc4310e61, - 0x8cb0: 0x402f2c20, 0x8cb1: 0x402f5620, 0x8cb2: 0x402f7a20, 0x8cb3: 0xc42908d1, - 0x8cb4: 0x40302c20, 0x8cb5: 0xc3810951, 0x8cb6: 0x4030be20, 0x8cb7: 0x4030e220, - 0x8cb8: 0x4030f620, 0x8cb9: 0x40310020, 0x8cba: 0xc42d08d1, 0x8cbb: 0x4003fc20, - 0x8cbc: 0x40094820, 0x8cbd: 0x4003fe20, 0x8cbe: 0x40094c20, 0x8cbf: 0xa0000000, - // Block 0x233, offset 0x8cc0 - 0x8cc0: 0xe00008f5, 0x8cc1: 0x002c0883, 0x8cc2: 0xe0000921, 0x8cc3: 0x00320ea3, - 0x8cc4: 0x00320e83, 0x8cc5: 0x00320c83, 0x8cc6: 0x00320a83, 0x8cc7: 0xe0000a53, - 0x8cc8: 0xe0000ae8, 0x8cc9: 0xe0000ae2, 0x8cca: 0xe0000af4, 0x8ccb: 0xe0000b20, - 0x8ccc: 0xe0000c2b, 0x8ccd: 0xe0000c25, 0x8cce: 0xe0000c37, 0x8ccf: 0xe0000c43, - 0x8cd0: 0x002c96a3, 0x8cd1: 0x002ee0c3, 0x8cd2: 0xe0000d9a, 0x8cd3: 0xe0000d94, - 0x8cd4: 0x003210e3, 0x8cd5: 0x003210c3, 0x8cd6: 0x00321083, 0x8cd7: 0x40093e20, - 0x8cd8: 0x00320883, 0x8cd9: 0xe0000fe1, 0x8cda: 0xe0000fdb, 0x8cdb: 0xe0000fed, - 0x8cdc: 0x003100a3, 0x8cdd: 0xe0001102, 0x8cde: 0x00306aa3, 0x8cdf: 0xe0000f7b, - 0x8ce0: 0xe00008f2, 0x8ce1: 0x402c0820, 0x8ce2: 0xe000091e, 0x8ce3: 0x40320e21, - 0x8ce4: 0x40320e20, 0x8ce5: 0x40320c20, 0x8ce6: 0x40320a20, 0x8ce7: 0xe0000a4d, - 0x8ce8: 0xe0000ae5, 0x8ce9: 0xe0000adf, 0x8cea: 0xe0000af1, 0x8ceb: 0xe0000b1d, - 0x8cec: 0xe0000c28, 0x8ced: 0xe0000c22, 0x8cee: 0xe0000c34, 0x8cef: 0xe0000c40, - 0x8cf0: 0x402c9621, 0x8cf1: 0x402ee022, 0x8cf2: 0xe0000d97, 0x8cf3: 0xe0000d91, - 0x8cf4: 0x40321023, 0x8cf5: 0x40321022, 0x8cf6: 0x40321020, 0x8cf7: 0x40093c20, - 0x8cf8: 0x40320820, 0x8cf9: 0xe0000fde, 0x8cfa: 0xe0000fd8, 0x8cfb: 0xe0000fea, - 0x8cfc: 0x40310021, 0x8cfd: 0xe00010ff, 0x8cfe: 0x40306a21, 0x8cff: 0xe0001114, - // Block 0x234, offset 0x8d00 - 0x8d00: 0xe0000983, 0x8d01: 0xe0000980, 0x8d02: 0xe00008fb, 0x8d03: 0xe00008f8, - 0x8d04: 0xe000097d, 0x8d05: 0xe000097a, 0x8d06: 0xe0000a38, 0x8d07: 0xe0000a35, - 0x8d08: 0xe0000a3e, 0x8d09: 0xe0000a3b, 0x8d0a: 0xe0000a4a, 0x8d0b: 0xe0000a47, - 0x8d0c: 0x002c5c83, 0x8d0d: 0x402c5c20, 0x8d0e: 0xe0000a86, 0x8d0f: 0xe0000a83, - 0x8d10: 0x002c9683, 0x8d11: 0x402c9620, 0x8d12: 0xe0000b46, 0x8d13: 0xe0000b43, - 0x8d14: 0xe0000aee, 0x8d15: 0xe0000aeb, 0x8d16: 0xe0000b2c, 0x8d17: 0xe0000b29, - 0x8d18: 0xe0000b40, 0x8d19: 0xe0000b3d, 0x8d1a: 0xe0000b1a, 0x8d1b: 0xe0000b17, - 0x8d1c: 0xe0000bb8, 0x8d1d: 0xe0000bb5, 0x8d1e: 0xe0000bb2, 0x8d1f: 0xe0000baf, - 0x8d20: 0xe0000bc4, 0x8d21: 0xe0000bc1, 0x8d22: 0xe0000bca, 0x8d23: 0xe0000bc7, - 0x8d24: 0xe0000bee, 0x8d25: 0xe0000beb, 0x8d26: 0xe0000c1b, 0x8d27: 0xe0000c18, - 0x8d28: 0xe0000c51, 0x8d29: 0xe0000c4e, 0x8d2a: 0xe0000c60, 0x8d2b: 0xe0000c5d, - 0x8d2c: 0xe0000c31, 0x8d2d: 0xe0000c2e, 0x8d2e: 0xe0000c5a, 0x8d2f: 0xe0000c57, - 0x8d30: 0xe0000c54, 0x8d31: 0x402da220, 0x8d32: 0xf0000a0a, 0x8d33: 0xf0000404, - 0x8d34: 0xe0000c8a, 0x8d35: 0xe0000c87, 0x8d36: 0xe0000c9f, 0x8d37: 0xe0000c9c, - 0x8d38: 0x402f7220, 0x8d39: 0xe0000ccc, 0x8d3a: 0xe0000cc9, 0x8d3b: 0xe0000cd8, - 0x8d3c: 0xe0000cd5, 0x8d3d: 0xe0000cd2, 0x8d3e: 0xe0000ccf, 0x8d3f: 0xe0000d04, - // Block 0x235, offset 0x8d40 - 0x8d40: 0xe0000cfe, 0x8d41: 0xe0000cf8, 0x8d42: 0xe0000cf5, 0x8d43: 0x002ee0a3, - 0x8d44: 0x402ee021, 0x8d45: 0xe0000d6f, 0x8d46: 0xe0000d6c, 0x8d47: 0xe0000d5d, - 0x8d48: 0xe0000d5a, 0x8d49: 0xf0000404, 0x8d4a: 0x002ee083, 0x8d4b: 0x402ee020, - 0x8d4c: 0xe0000e2e, 0x8d4d: 0xe0000e2b, 0x8d4e: 0xe0000da0, 0x8d4f: 0xe0000d9d, - 0x8d50: 0x003210a3, 0x8d51: 0x40321021, 0x8d52: 0x003208a3, 0x8d53: 0x40320821, - 0x8d54: 0xe0000eca, 0x8d55: 0xe0000ec7, 0x8d56: 0xe0000edc, 0x8d57: 0xe0000ed9, - 0x8d58: 0xe0000ed0, 0x8d59: 0xe0000ecd, 0x8d5a: 0xe0000f1f, 0x8d5b: 0xe0000f1c, - 0x8d5c: 0xe0000f2d, 0x8d5d: 0xe0000f2a, 0x8d5e: 0xe0000f47, 0x8d5f: 0xe0000f44, - 0x8d60: 0x00302a83, 0x8d61: 0x40302a20, 0x8d62: 0xe0000f99, 0x8d63: 0xe0000f96, - 0x8d64: 0xe0000f8a, 0x8d65: 0xe0000f87, 0x8d66: 0x00306a83, 0x8d67: 0x40306a20, - 0x8d68: 0xe000102b, 0x8d69: 0xe0001028, 0x8d6a: 0xe000103f, 0x8d6b: 0xe000103c, - 0x8d6c: 0xe0000fe7, 0x8d6d: 0xe0000fe4, 0x8d6e: 0xe0000ff9, 0x8d6f: 0xe0000ff6, - 0x8d70: 0x003100c3, 0x8d71: 0x40310022, 0x8d72: 0xe0001039, 0x8d73: 0xe0001036, - 0x8d74: 0xe00010d8, 0x8d75: 0xe00010d5, 0x8d76: 0xe000110e, 0x8d77: 0xe000110b, - 0x8d78: 0xe0001117, 0x8d79: 0xe000113b, 0x8d7a: 0xe0001138, 0x8d7b: 0xe000114d, - 0x8d7c: 0xe000114a, 0x8d7d: 0x00320683, 0x8d7e: 0x40320620, 0x8d7f: 0xe0000f64, - // Block 0x236, offset 0x8d80 - 0x8d80: 0x402c1a20, 0x8d81: 0x002c2a88, 0x8d82: 0x002c3288, 0x8d83: 0x402c3220, - 0x8d84: 0x0031c488, 0x8d85: 0x4031c420, 0x8d86: 0x002efa88, 0x8d87: 0x002c4e88, - 0x8d88: 0x402c4e20, 0x8d89: 0x002c7288, 0x8d8a: 0x002c7a88, 0x8d8b: 0x002c8488, - 0x8d8c: 0x402c8420, 0x8d8d: 0xe000115c, 0x8d8e: 0x002cae88, 0x8d8f: 0x002cb888, - 0x8d90: 0x002cc288, 0x8d91: 0x002d1688, 0x8d92: 0x402d1620, 0x8d93: 0x002d4488, - 0x8d94: 0x002d5888, 0x8d95: 0x402d7820, 0x8d96: 0x002dc288, 0x8d97: 0x002db688, - 0x8d98: 0x002e0a88, 0x8d99: 0x402e0a20, 0x8d9a: 0x402e3820, 0x8d9b: 0x402e7220, - 0x8d9c: 0x0030a088, 0x8d9d: 0x002eb488, 0x8d9e: 0x402ebc20, 0x8d9f: 0x002f1088, - 0x8da0: 0xe0000e56, 0x8da1: 0xe0000e53, 0x8da2: 0x002d6088, 0x8da3: 0x402d6020, - 0x8da4: 0x002f3e88, 0x8da5: 0x402f3e20, 0x8da6: 0x002f8288, 0x8da7: 0x0031b488, - 0x8da8: 0x4031b420, 0x8da9: 0x00300888, 0x8daa: 0x40301220, 0x8dab: 0x40304220, - 0x8dac: 0x00304a88, 0x8dad: 0x40304a20, 0x8dae: 0x00305288, 0x8daf: 0xe000105f, - 0x8db0: 0xe000105c, 0x8db1: 0x0030b488, 0x8db2: 0x0030cc88, 0x8db3: 0x00311888, - 0x8db4: 0x40311820, 0x8db5: 0x00313488, 0x8db6: 0x40313420, 0x8db7: 0xc41908d1, - 0x8db8: 0x00316e88, 0x8db9: 0x40316e20, 0x8dba: 0x40317820, 0x8dbb: 0x4031a620, - 0x8dbc: 0x0031bc88, 0x8dbd: 0x4031bc20, 0x8dbe: 0xe0000fc9, 0x8dbf: 0x40319420, - // Block 0x237, offset 0x8dc0 - 0x8dc0: 0x40321220, 0x8dc1: 0x40321a20, 0x8dc2: 0x40322220, 0x8dc3: 0x40322a20, - 0x8dc4: 0xe0000ad5, 0x8dc5: 0xe0000ad1, 0x8dc6: 0xe0000acd, 0x8dc7: 0xf0000a0a, - 0x8dc8: 0xf000040a, 0x8dc9: 0xf0000404, 0x8dca: 0xf0000a0a, 0x8dcb: 0xf000040a, - 0x8dcc: 0xf0000404, 0x8dcd: 0xe0000947, 0x8dce: 0xe0000944, 0x8dcf: 0xe0000c3d, - 0x8dd0: 0xe0000c3a, 0x8dd1: 0xe0000dcc, 0x8dd2: 0xe0000dc9, 0x8dd3: 0xe0000ff3, - 0x8dd4: 0xe0000ff0, 0x8dd5: 0xe0002685, 0x8dd6: 0xe0002682, 0x8dd7: 0xe0002673, - 0x8dd8: 0xe0002670, 0x8dd9: 0xe000267f, 0x8dda: 0xe000267c, 0x8ddb: 0xe0002679, - 0x8ddc: 0xe0002676, 0x8ddd: 0x402cae20, 0x8dde: 0xe000274c, 0x8ddf: 0xe0002749, - 0x8de0: 0xe0002697, 0x8de1: 0xe0002694, 0x8de2: 0xe00029c6, 0x8de3: 0xe00029c3, - 0x8de4: 0x002d6683, 0x8de5: 0x402d6620, 0x8de6: 0x002d6483, 0x8de7: 0x402d6420, - 0x8de8: 0x002e2083, 0x8de9: 0x402e2020, 0x8dea: 0x00321103, 0x8deb: 0x40321024, - 0x8dec: 0xe0002a08, 0x8ded: 0xe0002a05, 0x8dee: 0x002c6083, 0x8def: 0x402c6020, - 0x8df0: 0xe0000c8d, 0x8df1: 0xf0000a0a, 0x8df2: 0xf000040a, 0x8df3: 0xf0000404, - 0x8df4: 0xe0000bac, 0x8df5: 0xe0000ba9, 0x8df6: 0x002d7888, 0x8df7: 0x00319488, - 0x8df8: 0xe0000d57, 0x8df9: 0xe0000d54, 0x8dfa: 0xe000268b, 0x8dfb: 0xe0002688, - 0x8dfc: 0xe00029c0, 0x8dfd: 0xe00029bd, 0x8dfe: 0xe00029ba, 0x8dff: 0xe00029b7, - // Block 0x238, offset 0x8e00 - 0x8e00: 0xe000098f, 0x8e01: 0xe000098c, 0x8e02: 0xe0000995, 0x8e03: 0xe0000992, - 0x8e04: 0xe0000b62, 0x8e05: 0xe0000b5f, 0x8e06: 0xe0000b68, 0x8e07: 0xe0000b65, - 0x8e08: 0xe0000c6c, 0x8e09: 0xe0000c69, 0x8e0a: 0xe0000c72, 0x8e0b: 0xe0000c6f, - 0x8e0c: 0xe0000e4a, 0x8e0d: 0xe0000e47, 0x8e0e: 0xe0000e50, 0x8e0f: 0xe0000e4d, - 0x8e10: 0xe0000ee8, 0x8e11: 0xe0000ee5, 0x8e12: 0xe0000eee, 0x8e13: 0xe0000eeb, - 0x8e14: 0xe0001053, 0x8e15: 0xe0001050, 0x8e16: 0xe0001059, 0x8e17: 0xe0001056, - 0x8e18: 0xe0000f61, 0x8e19: 0xe0000f5e, 0x8e1a: 0xe0000fa5, 0x8e1b: 0xe0000fa2, - 0x8e1c: 0x00312288, 0x8e1d: 0x40312220, 0x8e1e: 0xe0000bf4, 0x8e1f: 0xe0000bf1, - 0x8e20: 0x002ebc88, 0x8e21: 0x402c8c20, 0x8e22: 0x002f2288, 0x8e23: 0x402f2220, - 0x8e24: 0x00314088, 0x8e25: 0x40314020, 0x8e26: 0x00320ca3, 0x8e27: 0x40320c21, - 0x8e28: 0xe0000b32, 0x8e29: 0xe0000b2f, 0x8e2a: 0xe0002758, 0x8e2b: 0xe0002755, - 0x8e2c: 0xe00029e4, 0x8e2d: 0xe00029e1, 0x8e2e: 0xe0000e04, 0x8e2f: 0xe0000e01, - 0x8e30: 0xe0000e0b, 0x8e31: 0xe0000e07, 0x8e32: 0xe0001129, 0x8e33: 0xe0001126, - 0x8e34: 0x402e5e20, 0x8e35: 0x402ed020, 0x8e36: 0x40305a20, 0x8e37: 0x402dd420, - 0x8e38: 0xe0000abf, 0x8e39: 0xe0000ec4, 0x8e3a: 0x002be888, 0x8e3b: 0x002c4488, - 0x8e3c: 0x402c4420, 0x8e3d: 0x002e3888, 0x8e3e: 0x00303e88, 0x8e3f: 0x402ffc20, - // Block 0x239, offset 0x8e40 - 0x8e40: 0x402f8220, 0x8e41: 0x402fd820, 0x8e42: 0x402ff420, 0x8e43: 0x40300820, - 0x8e44: 0x402df620, 0x8e45: 0x40301a20, 0x8e46: 0x40302420, 0x8e47: 0x40306420, - 0x8e48: 0x40305220, 0x8e49: 0x40307c20, 0x8e4a: 0x4030b420, 0x8e4b: 0x4030cc20, - 0x8e4c: 0x4030da20, 0x8e4d: 0x4030ee20, 0x8e4e: 0x402e7a20, 0x8e4f: 0x40310820, - 0x8e50: 0x40314820, 0x8e51: 0x40315020, 0x8e52: 0xc41708d1, 0x8e53: 0x40318020, - 0x8e54: 0x4031cc20, 0x8e55: 0x4031e820, 0x8e56: 0x40320a20, 0x8e57: 0x40323220, - 0x8e58: 0x40323a20, 0x8e59: 0x402c1220, 0x8e5a: 0x402cf820, 0x8e5b: 0x402d4c20, - 0x8e5c: 0x402d7020, 0x8e5d: 0x402de620, 0x8e5e: 0x402e1a20, 0x8e5f: 0x402e2a20, - 0x8e60: 0x402f6220, 0x8e61: 0x4031fa20, 0x8e62: 0x40320220, 0x8e63: 0xe0000aca, - 0x8e64: 0xe0000adc, 0x8e65: 0xe0000ad9, 0x8e66: 0xe0000fcc, 0x8e67: 0xe0000fcf, - 0x8e68: 0xe0000fba, 0x8e69: 0xe0000ba1, 0x8e6a: 0xe0000d11, 0x8e6b: 0xe0000d18, - 0x8e6c: 0x40324220, 0x8e6d: 0x40324a20, 0x8e6e: 0x40309020, 0x8e6f: 0x40309820, - 0x8e70: 0x002d6894, 0x8e71: 0x002d8094, 0x8e72: 0x002dcc94, 0x8e73: 0x002f7a94, - 0x8e74: 0x002f9894, 0x8e75: 0x002fac94, 0x8e76: 0x002fd894, 0x8e77: 0x0030e294, - 0x8e78: 0x00310094, 0x8e79: 0x40064020, 0x8e7a: 0x40064420, 0x8e7b: 0x402d9620, - 0x8e7c: 0x4031de20, 0x8e7d: 0x402d9820, 0x8e7e: 0x4031e220, 0x8e7f: 0x4031f020, - // Block 0x23a, offset 0x8e80 - 0x8e80: 0xe0000d24, 0x8e81: 0xe0000d21, 0x8e82: 0xe0000d2a, 0x8e83: 0xe0000d27, - 0x8e84: 0xe0000d69, 0x8e85: 0xe0000d66, 0x8e86: 0xe0000d7b, 0x8e87: 0xe0000d78, - 0x8e88: 0xe0000d87, 0x8e89: 0xe0000d84, 0x8e8a: 0xe0000d81, 0x8e8b: 0xe0000d7e, - 0x8e8c: 0xe00029d8, 0x8e8d: 0xe00029d5, 0x8e8e: 0xe00029de, 0x8e8f: 0xe00029db, - 0x8e90: 0xe0000e3d, 0x8e91: 0xe0000e39, 0x8e92: 0xe0000e35, 0x8e93: 0xe0000e31, - 0x8e94: 0xe0000ea7, 0x8e95: 0xe0000ea4, 0x8e96: 0xe0000ead, 0x8e97: 0xe0000eaa, - 0x8e98: 0xe0000ed6, 0x8e99: 0xe0000ed3, 0x8e9a: 0xe0000ef4, 0x8e9b: 0xe0000ef1, - 0x8e9c: 0xe0000efb, 0x8e9d: 0xe0000ef7, 0x8e9e: 0xe0000f02, 0x8e9f: 0xe0000eff, - 0x8ea0: 0xe0000f41, 0x8ea1: 0xe0000f3e, 0x8ea2: 0xe0000f53, 0x8ea3: 0xe0000f50, - 0x8ea4: 0xe0000f26, 0x8ea5: 0xe0000f22, 0x8ea6: 0xe00029b4, 0x8ea7: 0xe00029b1, - 0x8ea8: 0xe0000f5a, 0x8ea9: 0xe0000f56, 0x8eaa: 0xe0000f93, 0x8eab: 0xe0000f90, - 0x8eac: 0xe0000f9f, 0x8ead: 0xe0000f9c, 0x8eae: 0xe0000fb1, 0x8eaf: 0xe0000fae, - 0x8eb0: 0xe0000fab, 0x8eb1: 0xe0000fa8, 0x8eb2: 0xe0001093, 0x8eb3: 0xe0001090, - 0x8eb4: 0xe000109f, 0x8eb5: 0xe000109c, 0x8eb6: 0xe0001099, 0x8eb7: 0xe0001096, - 0x8eb8: 0xe0001032, 0x8eb9: 0xe000102e, 0x8eba: 0xe0002685, 0x8ebb: 0xe0002682, - 0x8ebc: 0xe00010a9, 0x8ebd: 0xe00010a6, 0x8ebe: 0xe00010af, 0x8ebf: 0xe00010ac, - // Block 0x23b, offset 0x8ec0 - 0x8ec0: 0xe00010d2, 0x8ec1: 0xe00010cf, 0x8ec2: 0xe00010cc, 0x8ec3: 0xe00010c9, - 0x8ec4: 0xe00010e1, 0x8ec5: 0xe00010de, 0x8ec6: 0xe00010e7, 0x8ec7: 0xe00010e4, - 0x8ec8: 0xe00010ed, 0x8ec9: 0xe00010ea, 0x8eca: 0xe00010fc, 0x8ecb: 0xe00010f9, - 0x8ecc: 0xe00010f6, 0x8ecd: 0xe00010f3, 0x8ece: 0xe0001123, 0x8ecf: 0xe0001120, - 0x8ed0: 0xe0001141, 0x8ed1: 0xe000113e, 0x8ed2: 0xe0001153, 0x8ed3: 0xe0001150, - 0x8ed4: 0xe0001159, 0x8ed5: 0xe0001156, 0x8ed6: 0xe0000c15, 0x8ed7: 0xe0000f8d, - 0x8ed8: 0xe00010db, 0x8ed9: 0xe0001111, 0x8eda: 0xf0000404, 0x8edb: 0xe0000f70, - 0x8edc: 0x40300420, 0x8edd: 0x40300620, 0x8ede: 0xe0000f7f, 0x8edf: 0x402c9620, - 0x8ee0: 0xe000099b, 0x8ee1: 0xe0000998, 0x8ee2: 0xe0000989, 0x8ee3: 0xe0000986, - 0x8ee4: 0xe0002791, 0x8ee5: 0xe000278e, 0x8ee6: 0xe0000930, 0x8ee7: 0xe000092c, - 0x8ee8: 0xe0000940, 0x8ee9: 0xe000093c, 0x8eea: 0xe00029d2, 0x8eeb: 0xe00029cf, - 0x8eec: 0xe00009aa, 0x8eed: 0xe00009a6, 0x8eee: 0xe000278b, 0x8eef: 0xe0002788, - 0x8ef0: 0xe000090a, 0x8ef1: 0xe0000906, 0x8ef2: 0xe000091a, 0x8ef3: 0xe0000916, - 0x8ef4: 0xe00029cc, 0x8ef5: 0xe00029c9, 0x8ef6: 0xe00009a2, 0x8ef7: 0xe000099e, - 0x8ef8: 0xe0000b6e, 0x8ef9: 0xe0000b6b, 0x8efa: 0xe0000b5c, 0x8efb: 0xe0000b59, - 0x8efc: 0xe0000b26, 0x8efd: 0xe0000b23, 0x8efe: 0xe0000afb, 0x8eff: 0xe0000af7, - // Block 0x23c, offset 0x8f00 - 0x8f00: 0xe0000b03, 0x8f01: 0xe0000aff, 0x8f02: 0xe0000b13, 0x8f03: 0xe0000b0f, - 0x8f04: 0xe0000b0b, 0x8f05: 0xe0000b07, 0x8f06: 0xe0000b75, 0x8f07: 0xe0000b71, - 0x8f08: 0xe0000c66, 0x8f09: 0xe0000c63, 0x8f0a: 0xe0000c78, 0x8f0b: 0xe0000c75, - 0x8f0c: 0xe0000e84, 0x8f0d: 0xe0000e81, 0x8f0e: 0xe0000e44, 0x8f0f: 0xe0000e41, - 0x8f10: 0xe0002764, 0x8f11: 0xe0002761, 0x8f12: 0xe00029f0, 0x8f13: 0xe00029ed, - 0x8f14: 0xe00029fc, 0x8f15: 0xe00029f9, 0x8f16: 0xe00029f6, 0x8f17: 0xe00029f3, - 0x8f18: 0xe0002a02, 0x8f19: 0xe00029ff, 0x8f1a: 0xe0000e5d, 0x8f1b: 0xe0000e59, - 0x8f1c: 0xe0000e65, 0x8f1d: 0xe0000e61, 0x8f1e: 0xe0000e75, 0x8f1f: 0xe0000e71, - 0x8f20: 0xe00029ea, 0x8f21: 0xe00029e7, 0x8f22: 0xe0000e7d, 0x8f23: 0xe0000e79, - 0x8f24: 0xe000108d, 0x8f25: 0xe000108a, 0x8f26: 0xe000104d, 0x8f27: 0xe000104a, - 0x8f28: 0xe0001066, 0x8f29: 0xe0001062, 0x8f2a: 0xe000106e, 0x8f2b: 0xe000106a, - 0x8f2c: 0xe000107e, 0x8f2d: 0xe000107a, 0x8f2e: 0xe0001076, 0x8f2f: 0xe0001072, - 0x8f30: 0xe0001086, 0x8f31: 0xe0001082, 0x8f32: 0xe0001108, 0x8f33: 0xe0001105, - 0x8f34: 0xe0001135, 0x8f35: 0xe0001132, 0x8f36: 0xe000112f, 0x8f37: 0xe000112c, - 0x8f38: 0xe000111d, 0x8f39: 0xe000111a, 0x8f3a: 0xe0000d0a, 0x8f3b: 0xe0000d07, - 0x8f3c: 0x0030d888, 0x8f3d: 0x4030d820, 0x8f3e: 0x00312088, 0x8f3f: 0x40312020, - // Block 0x23d, offset 0x8f40 - 0x8f40: 0xa0000000, 0x8f41: 0xa0000000, 0x8f42: 0xa0000000, 0x8f43: 0xa0000000, - 0x8f44: 0xa0000000, 0x8f45: 0xa0000000, 0x8f46: 0xa0000000, 0x8f47: 0xa0000000, - 0x8f48: 0xa0000000, 0x8f49: 0x40020020, 0x8f4a: 0x40020220, 0x8f4b: 0x40020420, - 0x8f4c: 0x40020620, 0x8f4d: 0x40020820, 0x8f4e: 0xa0000000, 0x8f4f: 0xa0000000, - 0x8f50: 0xa0000000, 0x8f51: 0xa0000000, 0x8f52: 0xa0000000, 0x8f53: 0xa0000000, - 0x8f54: 0xa0000000, 0x8f55: 0xa0000000, 0x8f56: 0xa0000000, 0x8f57: 0xa0000000, - 0x8f58: 0xa0000000, 0x8f59: 0xa0000000, 0x8f5a: 0xa0000000, 0x8f5b: 0xa0000000, - 0x8f5c: 0xa0000000, 0x8f5d: 0xa0000000, 0x8f5e: 0xa0000000, 0x8f5f: 0xa0000000, - 0x8f60: 0x40021220, 0x8f61: 0x4002ba20, 0x8f62: 0x4003e020, 0x8f63: 0x4004ea20, - 0x8f64: 0x4027de20, 0x8f65: 0x4004ec20, 0x8f66: 0x4004e620, 0x8f67: 0x4003d220, - 0x8f68: 0x4003f420, 0x8f69: 0x4003f620, 0x8f6a: 0x4004d820, 0x8f6b: 0x40093820, - 0x8f6c: 0x40024020, 0x8f6d: 0x40021a20, 0x8f6e: 0x4002e420, 0x8f6f: 0x4004e220, - 0x8f70: 0x4029cc20, 0x8f71: 0x4029ce20, 0x8f72: 0x4029d020, 0x8f73: 0x4029d220, - 0x8f74: 0x4029d420, 0x8f75: 0x4029d620, 0x8f76: 0x4029d820, 0x8f77: 0x4029da20, - 0x8f78: 0x4029dc20, 0x8f79: 0x4029de20, 0x8f7a: 0x40026c20, 0x8f7b: 0x40026220, - 0x8f7c: 0x40094020, 0x8f7d: 0xc32f0851, 0x8f7e: 0x40094420, 0x8f7f: 0x4002c420, - // Block 0x23e, offset 0x8f80 - 0x8f80: 0x4004d620, 0x8f81: 0xc4400cb1, 0x8f82: 0x002c0a88, 0x8f83: 0xc33b08d1, - 0x8f84: 0xc35b08d1, 0x8f85: 0xc36008f1, 0x8f86: 0x002d0888, 0x8f87: 0x002d2288, - 0x8f88: 0x002d6888, 0x8f89: 0xc36508b1, 0x8f8a: 0x002dcc88, 0x8f8b: 0x002dfe88, - 0x8f8c: 0xc4480eb3, 0x8f8d: 0x002e8288, 0x8f8e: 0xc36908d1, 0x8f8f: 0xc4500f21, - 0x8f90: 0x002f2c88, 0x8f91: 0x002f5688, 0x8f92: 0xc45608f1, 0x8f93: 0xc34908d1, - 0x8f94: 0xc37108d1, 0x8f95: 0xc3760921, 0x8f96: 0x0030be88, 0x8f97: 0x0030e288, - 0x8f98: 0x0030f688, 0x8f99: 0xc37b08b1, 0x8f9a: 0xc37f08d1, 0x8f9b: 0x4003f820, - 0x8f9c: 0x4004e420, 0x8f9d: 0x4003fa20, 0x8f9e: 0x40062420, 0x8f9f: 0x40021620, - 0x8fa0: 0x40061e20, 0x8fa1: 0xc43d0cb1, 0x8fa2: 0x402c0a20, 0x8fa3: 0xc33908d1, - 0x8fa4: 0xc35908d1, 0x8fa5: 0xc35d08f1, 0x8fa6: 0x402d0820, 0x8fa7: 0x402d2220, - 0x8fa8: 0x402d6820, 0x8fa9: 0xc36308b1, 0x8faa: 0x402dcc20, 0x8fab: 0x402dfe20, - 0x8fac: 0xc4430eb3, 0x8fad: 0x402e8220, 0x8fae: 0xc36708d1, 0x8faf: 0xc44d0f21, - 0x8fb0: 0x402f2c20, 0x8fb1: 0x402f5620, 0x8fb2: 0xc45308f1, 0x8fb3: 0xc34708d1, - 0x8fb4: 0xc36f08d1, 0x8fb5: 0xc3730921, 0x8fb6: 0x4030be20, 0x8fb7: 0x4030e220, - 0x8fb8: 0x4030f620, 0x8fb9: 0xc37908b1, 0x8fba: 0xc37d08d1, 0x8fbb: 0x4003fc20, - 0x8fbc: 0x40094820, 0x8fbd: 0x4003fe20, 0x8fbe: 0x40094c20, 0x8fbf: 0xa0000000, - // Block 0x23f, offset 0x8fc0 - 0x8fc0: 0xe00008f5, 0x8fc1: 0x002be083, 0x8fc2: 0xe0000921, 0x8fc3: 0xe0000969, - 0x8fc4: 0x002be283, 0x8fc5: 0xe000094d, 0x8fc6: 0xe00009dd, 0x8fc7: 0xe0000a53, - 0x8fc8: 0xe0000ae8, 0x8fc9: 0x002c9a83, 0x8fca: 0xe0000af4, 0x8fcb: 0xe0000b20, - 0x8fcc: 0xe0000c2b, 0x8fcd: 0x002d9c83, 0x8fce: 0xe0000c37, 0x8fcf: 0xe0000c43, - 0x8fd0: 0xe0000ab3, 0x8fd1: 0xe0000d63, 0x8fd2: 0xe0000d9a, 0x8fd3: 0x002ee483, - 0x8fd4: 0x002ee683, 0x8fd5: 0xe0000de6, 0x8fd6: 0xe0000dd2, 0x8fd7: 0x40093e20, - 0x8fd8: 0xe0000e12, 0x8fd9: 0xe0000fe1, 0x8fda: 0x00306e83, 0x8fdb: 0xe0000fed, - 0x8fdc: 0xe0000fff, 0x8fdd: 0x00310283, 0x8fde: 0x00318888, 0x8fdf: 0xe0000f7b, - 0x8fe0: 0xe00008f2, 0x8fe1: 0x402be020, 0x8fe2: 0xe000091e, 0x8fe3: 0xe0000966, - 0x8fe4: 0x402be220, 0x8fe5: 0xe000094a, 0x8fe6: 0xe00009d5, 0x8fe7: 0xe0000a4d, - 0x8fe8: 0xe0000ae5, 0x8fe9: 0x402c9a20, 0x8fea: 0xe0000af1, 0x8feb: 0xe0000b1d, - 0x8fec: 0xe0000c28, 0x8fed: 0x402d9c20, 0x8fee: 0xe0000c34, 0x8fef: 0xe0000c40, - 0x8ff0: 0xe0000aad, 0x8ff1: 0xe0000d60, 0x8ff2: 0xe0000d97, 0x8ff3: 0x402ee420, - 0x8ff4: 0x402ee620, 0x8ff5: 0xe0000de3, 0x8ff6: 0xe0000dcf, 0x8ff7: 0x40093c20, - 0x8ff8: 0xe0000e0f, 0x8ff9: 0xe0000fde, 0x8ffa: 0x40306e20, 0x8ffb: 0xe0000fea, - 0x8ffc: 0xe0000ffc, 0x8ffd: 0x40310220, 0x8ffe: 0x40318820, 0x8fff: 0xe0001114, - // Block 0x240, offset 0x9000 - 0x9000: 0xe0000983, 0x9001: 0xe0000980, 0x9002: 0xe00008fb, 0x9003: 0xe00008f8, - 0x9004: 0xe000097d, 0x9005: 0xe000097a, 0x9006: 0xe0000a38, 0x9007: 0xe0000a35, - 0x9008: 0xe0000a3e, 0x9009: 0xe0000a3b, 0x900a: 0xe0000a4a, 0x900b: 0xe0000a47, - 0x900c: 0x002c3c83, 0x900d: 0x402c3c20, 0x900e: 0x002c6483, 0x900f: 0x402c6420, - 0x9010: 0xe0000aaa, 0x9011: 0xe0000aa7, 0x9012: 0xe0000b46, 0x9013: 0xe0000b43, - 0x9014: 0xe0000aee, 0x9015: 0xe0000aeb, 0x9016: 0xe0000b2c, 0x9017: 0xe0000b29, - 0x9018: 0xe0000b40, 0x9019: 0xe0000b3d, 0x901a: 0x002c9c83, 0x901b: 0x402c9c20, - 0x901c: 0xe0000bb8, 0x901d: 0xe0000bb5, 0x901e: 0xe0000bb2, 0x901f: 0xe0000baf, - 0x9020: 0xe0000bc4, 0x9021: 0xe0000bc1, 0x9022: 0xe0000bca, 0x9023: 0xe0000bc7, - 0x9024: 0xe0000bee, 0x9025: 0xe0000beb, 0x9026: 0xe0000c1b, 0x9027: 0xe0000c18, - 0x9028: 0xe0000c51, 0x9029: 0xe0000c4e, 0x902a: 0xe0000c60, 0x902b: 0xe0000c5d, - 0x902c: 0xe0000c31, 0x902d: 0xe0000c2e, 0x902e: 0xe0000c5a, 0x902f: 0xe0000c57, - 0x9030: 0xe0000c54, 0x9031: 0x402da220, 0x9032: 0xf0000a0a, 0x9033: 0xf0000404, - 0x9034: 0xe0000c8a, 0x9035: 0xe0000c87, 0x9036: 0xe0000c9f, 0x9037: 0xe0000c9c, - 0x9038: 0x402f7220, 0x9039: 0x002e2483, 0x903a: 0x402e2420, 0x903b: 0xe0000cd8, - 0x903c: 0xe0000cd5, 0x903d: 0x002e2683, 0x903e: 0x402e2620, 0x903f: 0xe0000d04, - // Block 0x241, offset 0x9040 - 0x9040: 0xe0000cfe, 0x9041: 0xe0000cf8, 0x9042: 0xe0000cf5, 0x9043: 0xe0000d51, - 0x9044: 0xe0000d4e, 0x9045: 0xe0000d6f, 0x9046: 0xe0000d6c, 0x9047: 0x002ea083, - 0x9048: 0x402ea020, 0x9049: 0xf0000404, 0x904a: 0x002eda88, 0x904b: 0x402eda20, - 0x904c: 0xe0000e2e, 0x904d: 0xe0000e2b, 0x904e: 0xe0000da0, 0x904f: 0xe0000d9d, - 0x9050: 0xe0000de0, 0x9051: 0xe0000ddd, 0x9052: 0xe0000e93, 0x9053: 0xe0000e8f, - 0x9054: 0x002f7c83, 0x9055: 0x402f7c20, 0x9056: 0xe0000edc, 0x9057: 0xe0000ed9, - 0x9058: 0x002f7e83, 0x9059: 0x402f7e20, 0x905a: 0xe0000f1f, 0x905b: 0xe0000f1c, - 0x905c: 0xe0000f2d, 0x905d: 0xe0000f2a, 0x905e: 0xe0000f47, 0x905f: 0xe0000f44, - 0x9060: 0x002fe883, 0x9061: 0x402fe820, 0x9062: 0xe0000f99, 0x9063: 0xe0000f96, - 0x9064: 0x00302e83, 0x9065: 0x40302e20, 0x9066: 0x00303688, 0x9067: 0x40303620, - 0x9068: 0xe000102b, 0x9069: 0xe0001028, 0x906a: 0xe000103f, 0x906b: 0xe000103c, - 0x906c: 0xe0000fe7, 0x906d: 0xe0000fe4, 0x906e: 0x00307083, 0x906f: 0x40307020, - 0x9070: 0xe0001025, 0x9071: 0xe0001022, 0x9072: 0xe0001039, 0x9073: 0xe0001036, - 0x9074: 0xe00010d8, 0x9075: 0xe00010d5, 0x9076: 0xe000110e, 0x9077: 0xe000110b, - 0x9078: 0xe0001117, 0x9079: 0xe000113b, 0x907a: 0xe0001138, 0x907b: 0xe000114d, - 0x907c: 0xe000114a, 0x907d: 0x00312c83, 0x907e: 0x40312c20, 0x907f: 0xe0000f64, - // Block 0x242, offset 0x9080 - 0x9080: 0x40321220, 0x9081: 0x40321a20, 0x9082: 0x40322220, 0x9083: 0x40322a20, - 0x9084: 0xe0000ad5, 0x9085: 0xe0000ad1, 0x9086: 0xe0000acd, 0x9087: 0xf0000a0a, - 0x9088: 0xf000040a, 0x9089: 0xf0000404, 0x908a: 0xf0000a0a, 0x908b: 0xf000040a, - 0x908c: 0xf0000404, 0x908d: 0xe0000947, 0x908e: 0xe0000944, 0x908f: 0xe0000c3d, - 0x9090: 0xe0000c3a, 0x9091: 0xe0000dcc, 0x9092: 0xe0000dc9, 0x9093: 0xe0000ff3, - 0x9094: 0xe0000ff0, 0x9095: 0xe000101e, 0x9096: 0xe000101a, 0x9097: 0xe0002658, - 0x9098: 0xe0002655, 0x9099: 0xe0001016, 0x909a: 0xe0001012, 0x909b: 0xe000100e, - 0x909c: 0xe000100a, 0x909d: 0x402cae20, 0x909e: 0xe0002a0e, 0x909f: 0xe0002a0b, - 0x90a0: 0xe0000976, 0x90a1: 0xe0000972, 0x90a2: 0xe00009f4, 0x90a3: 0xe00009ef, - 0x90a4: 0x002d3a88, 0x90a5: 0x402d3a20, 0x90a6: 0xe0000bbe, 0x90a7: 0xe0000bbb, - 0x90a8: 0xe0000c99, 0x90a9: 0xe0000c96, 0x90aa: 0xe0000e20, 0x90ab: 0xe0000e1d, - 0x90ac: 0xe0000e27, 0x90ad: 0xe0000e23, 0x90ae: 0xe0001162, 0x90af: 0xe000115f, - 0x90b0: 0xe0000c8d, 0x90b1: 0xf0000a0a, 0x90b2: 0xf000040a, 0x90b3: 0xf0000404, - 0x90b4: 0xe0000bac, 0x90b5: 0xe0000ba9, 0x90b6: 0x002d7888, 0x90b7: 0x00319488, - 0x90b8: 0xe0000d57, 0x90b9: 0xe0000d54, 0x90ba: 0xe000262e, 0x90bb: 0xe000262b, - 0x90bc: 0xe00009ea, 0x90bd: 0xe00009e5, 0x90be: 0xe0000e19, 0x90bf: 0xe0000e15, - // Block 0x243, offset 0x90c0 - 0x90c0: 0xe0000b03, 0x90c1: 0xe0000aff, 0x90c2: 0xe0000b13, 0x90c3: 0xe0000b0f, - 0x90c4: 0xe0000b0b, 0x90c5: 0xe0000b07, 0x90c6: 0xe0000b75, 0x90c7: 0xe0000b71, - 0x90c8: 0xe0000c66, 0x90c9: 0xe0000c63, 0x90ca: 0xe0000c78, 0x90cb: 0xe0000c75, - 0x90cc: 0xe0000e84, 0x90cd: 0xe0000e81, 0x90ce: 0xe0000e44, 0x90cf: 0xe0000e41, - 0x90d0: 0xe0002a14, 0x90d1: 0xe0002a11, 0x90d2: 0xe0002a1a, 0x90d3: 0xe0002a17, - 0x90d4: 0xe0002a26, 0x90d5: 0xe0002a23, 0x90d6: 0xe0002a20, 0x90d7: 0xe0002a1d, - 0x90d8: 0xe0002a2c, 0x90d9: 0xe0002a29, 0x90da: 0xe000264c, 0x90db: 0xe0002649, - 0x90dc: 0xe0000e65, 0x90dd: 0xe0000e61, 0x90de: 0xe0000e75, 0x90df: 0xe0000e71, - 0x90e0: 0xe0000e6d, 0x90e1: 0xe0000e69, 0x90e2: 0xe0000e7d, 0x90e3: 0xe0000e79, - 0x90e4: 0xe000108d, 0x90e5: 0xe000108a, 0x90e6: 0xe000104d, 0x90e7: 0xe000104a, - 0x90e8: 0xe0002664, 0x90e9: 0xe0002661, 0x90ea: 0xe000106e, 0x90eb: 0xe000106a, - 0x90ec: 0xe000107e, 0x90ed: 0xe000107a, 0x90ee: 0xe0001076, 0x90ef: 0xe0001072, - 0x90f0: 0xe0001086, 0x90f1: 0xe0001082, 0x90f2: 0xe0001108, 0x90f3: 0xe0001105, - 0x90f4: 0xe0001135, 0x90f5: 0xe0001132, 0x90f6: 0xe000112f, 0x90f7: 0xe000112c, - 0x90f8: 0xe000111d, 0x90f9: 0xe000111a, 0x90fa: 0xe0000d0a, 0x90fb: 0xe0000d07, - 0x90fc: 0x0030d888, 0x90fd: 0x4030d820, 0x90fe: 0x00312088, 0x90ff: 0x40312020, - // Block 0x244, offset 0x9100 - 0x9100: 0xa0000000, 0x9101: 0xa0000000, 0x9102: 0xa0000000, 0x9103: 0xa0000000, - 0x9104: 0xa0000000, 0x9105: 0xa0000000, 0x9106: 0xa0000000, 0x9107: 0xa0000000, - 0x9108: 0xa0000000, 0x9109: 0x40020020, 0x910a: 0x40020220, 0x910b: 0x40020420, - 0x910c: 0x40020620, 0x910d: 0x40020820, 0x910e: 0xa0000000, 0x910f: 0xa0000000, - 0x9110: 0xa0000000, 0x9111: 0xa0000000, 0x9112: 0xa0000000, 0x9113: 0xa0000000, - 0x9114: 0xa0000000, 0x9115: 0xa0000000, 0x9116: 0xa0000000, 0x9117: 0xa0000000, - 0x9118: 0xa0000000, 0x9119: 0xa0000000, 0x911a: 0xa0000000, 0x911b: 0xa0000000, - 0x911c: 0xa0000000, 0x911d: 0xa0000000, 0x911e: 0xa0000000, 0x911f: 0xa0000000, - 0x9120: 0x40021220, 0x9121: 0x4002ba20, 0x9122: 0x4003e020, 0x9123: 0x4004ea20, - 0x9124: 0x4027de20, 0x9125: 0x4004ec20, 0x9126: 0x4004e620, 0x9127: 0x4003d220, - 0x9128: 0x4003f420, 0x9129: 0x4003f620, 0x912a: 0x4004d820, 0x912b: 0x40093820, - 0x912c: 0x40024020, 0x912d: 0x40021a20, 0x912e: 0x4002e420, 0x912f: 0x4004e220, - 0x9130: 0x4029cc20, 0x9131: 0x4029ce20, 0x9132: 0x4029d020, 0x9133: 0x4029d220, - 0x9134: 0x4029d420, 0x9135: 0x4029d620, 0x9136: 0x4029d820, 0x9137: 0x4029da20, - 0x9138: 0x4029dc20, 0x9139: 0x4029de20, 0x913a: 0x40026c20, 0x913b: 0x40026220, - 0x913c: 0x40094020, 0x913d: 0xc32f0851, 0x913e: 0x40094420, 0x913f: 0x4002c420, - // Block 0x245, offset 0x9140 - 0x9140: 0x4004d620, 0x9141: 0xc3a90a51, 0x9142: 0x002c0a88, 0x9143: 0x002c3a88, - 0x9144: 0x002c6288, 0x9145: 0xc45b0a11, 0x9146: 0x002d0888, 0x9147: 0x002d2288, - 0x9148: 0x002d6888, 0x9149: 0x002d9a88, 0x914a: 0x002dcc88, 0x914b: 0x002dfe88, - 0x914c: 0xc0030002, 0x914d: 0x002e8288, 0x914e: 0x002e9e88, 0x914f: 0xc4610f41, - 0x9150: 0x002f2c88, 0x9151: 0x002f5688, 0x9152: 0x002f7a88, 0x9153: 0x002fe688, - 0x9154: 0x00302c88, 0x9155: 0xc3840951, 0x9156: 0x0030be83, 0x9157: 0x0030bea3, - 0x9158: 0x0030f688, 0x9159: 0x00310088, 0x915a: 0x00312a88, 0x915b: 0x4003f820, - 0x915c: 0x4004e420, 0x915d: 0x4003fa20, 0x915e: 0x40062420, 0x915f: 0x40021620, - 0x9160: 0x40061e20, 0x9161: 0xc3a60a51, 0x9162: 0x402c0a20, 0x9163: 0x402c3a20, - 0x9164: 0x402c6220, 0x9165: 0xc4590a11, 0x9166: 0x402d0820, 0x9167: 0x402d2220, - 0x9168: 0x402d6820, 0x9169: 0x402d9a20, 0x916a: 0x402dcc20, 0x916b: 0x402dfe20, - 0x916c: 0xc0000002, 0x916d: 0x402e8220, 0x916e: 0x402e9e20, 0x916f: 0xc45d0f41, - 0x9170: 0x402f2c20, 0x9171: 0x402f5620, 0x9172: 0x402f7a20, 0x9173: 0x402fe620, - 0x9174: 0x40302c20, 0x9175: 0xc3810951, 0x9176: 0x4030be20, 0x9177: 0x4030be21, - 0x9178: 0x4030f620, 0x9179: 0x40310020, 0x917a: 0x40312a20, 0x917b: 0x4003fc20, - 0x917c: 0x40094820, 0x917d: 0x4003fe20, 0x917e: 0x40094c20, 0x917f: 0xa0000000, - // Block 0x246, offset 0x9180 - 0x9180: 0xe00008f5, 0x9181: 0xe00008ef, 0x9182: 0xe0000921, 0x9183: 0xe0000969, - 0x9184: 0x00320e83, 0x9185: 0x00320c83, 0x9186: 0x00320ea3, 0x9187: 0xe0000a53, - 0x9188: 0xe0000ae8, 0x9189: 0xe0000ae2, 0x918a: 0xe0000af4, 0x918b: 0xe0000b20, - 0x918c: 0xe0000c2b, 0x918d: 0xe0000c25, 0x918e: 0xe0000c37, 0x918f: 0xe0000c43, - 0x9190: 0x002c62c3, 0x9191: 0xe0000d63, 0x9192: 0xe0000d9a, 0x9193: 0xe0000d94, - 0x9194: 0x00321103, 0x9195: 0xe0000de6, 0x9196: 0x00321083, 0x9197: 0x40093e20, - 0x9198: 0x003210a3, 0x9199: 0xe0000fe1, 0x919a: 0xe0000fdb, 0x919b: 0xe0000fed, - 0x919c: 0x003100a3, 0x919d: 0xe0001102, 0x919e: 0xe000266d, 0x919f: 0xe0000f7b, - 0x91a0: 0xe00008f2, 0x91a1: 0xe00008ec, 0x91a2: 0xe000091e, 0x91a3: 0xe0000966, - 0x91a4: 0x40320e20, 0x91a5: 0x40320c20, 0x91a6: 0x40320e21, 0x91a7: 0xe0000a4d, - 0x91a8: 0xe0000ae5, 0x91a9: 0xe0000adf, 0x91aa: 0xe0000af1, 0x91ab: 0xe0000b1d, - 0x91ac: 0xe0000c28, 0x91ad: 0xe0000c22, 0x91ae: 0xe0000c34, 0x91af: 0xe0000c40, - 0x91b0: 0x402c6222, 0x91b1: 0xe0000d60, 0x91b2: 0xe0000d97, 0x91b3: 0xe0000d91, - 0x91b4: 0x40321024, 0x91b5: 0xe0000de3, 0x91b6: 0x40321020, 0x91b7: 0x40093c20, - 0x91b8: 0x40321021, 0x91b9: 0xe0000fde, 0x91ba: 0xe0000fd8, 0x91bb: 0xe0000fea, - 0x91bc: 0x40310021, 0x91bd: 0xe00010ff, 0x91be: 0xe000266a, 0x91bf: 0xe0001114, - // Block 0x247, offset 0x91c0 - 0x91c0: 0xe0000983, 0x91c1: 0xe0000980, 0x91c2: 0xe00008fb, 0x91c3: 0xe00008f8, - 0x91c4: 0xe000097d, 0x91c5: 0xe000097a, 0x91c6: 0xe0000a38, 0x91c7: 0xe0000a35, - 0x91c8: 0xe0000a3e, 0x91c9: 0xe0000a3b, 0x91ca: 0xe0000a4a, 0x91cb: 0xe0000a47, - 0x91cc: 0xe0000a44, 0x91cd: 0xe0000a41, 0x91ce: 0xe0000a86, 0x91cf: 0xe0000a83, - 0x91d0: 0x002c62a3, 0x91d1: 0x402c6221, 0x91d2: 0xe0000b46, 0x91d3: 0xe0000b43, - 0x91d4: 0xe0000aee, 0x91d5: 0xe0000aeb, 0x91d6: 0xe0000b2c, 0x91d7: 0xe0000b29, - 0x91d8: 0x00320ec3, 0x91d9: 0x40320e22, 0x91da: 0xe0000b1a, 0x91db: 0xe0000b17, - 0x91dc: 0xe0000bb8, 0x91dd: 0xe0000bb5, 0x91de: 0xe0000bb2, 0x91df: 0xe0000baf, - 0x91e0: 0xe0000bc4, 0x91e1: 0xe0000bc1, 0x91e2: 0xe0000bca, 0x91e3: 0xe0000bc7, - 0x91e4: 0xe0000bee, 0x91e5: 0xe0000beb, 0x91e6: 0xe0000c1b, 0x91e7: 0xe0000c18, - 0x91e8: 0xe0000c51, 0x91e9: 0xe0000c4e, 0x91ea: 0xe0000c60, 0x91eb: 0xe0000c5d, - 0x91ec: 0xe0000c31, 0x91ed: 0xe0000c2e, 0x91ee: 0xe0000c5a, 0x91ef: 0xe0000c57, - 0x91f0: 0xe0000c54, 0x91f1: 0x402da220, 0x91f2: 0xf0000a0a, 0x91f3: 0xf0000404, - 0x91f4: 0xe0000c8a, 0x91f5: 0xe0000c87, 0x91f6: 0xe0000c9f, 0x91f7: 0xe0000c9c, - 0x91f8: 0x402f7220, 0x91f9: 0xe0000ccc, 0x91fa: 0xe0000cc9, 0x91fb: 0xe0000cd8, - 0x91fc: 0xe0000cd5, 0x91fd: 0xe0000cd2, 0x91fe: 0xe0000ccf, 0x91ff: 0xe0000d04, - // Block 0x248, offset 0x9200 - 0x9200: 0xe0000cfe, 0x9201: 0xe0000cf8, 0x9202: 0xe0000cf5, 0x9203: 0xe0000d51, - 0x9204: 0xe0000d4e, 0x9205: 0xe0000d6f, 0x9206: 0xe0000d6c, 0x9207: 0xe0000d5d, - 0x9208: 0xe0000d5a, 0x9209: 0xf0000404, 0x920a: 0x002eda88, 0x920b: 0x402eda20, - 0x920c: 0xe0000e2e, 0x920d: 0xe0000e2b, 0x920e: 0xe0000da0, 0x920f: 0xe0000d9d, - 0x9210: 0x003210c3, 0x9211: 0x40321022, 0x9212: 0x003210e3, 0x9213: 0x40321023, - 0x9214: 0xe0000eca, 0x9215: 0xe0000ec7, 0x9216: 0xe0000edc, 0x9217: 0xe0000ed9, - 0x9218: 0xe0000ed0, 0x9219: 0xe0000ecd, 0x921a: 0xe0000f1f, 0x921b: 0xe0000f1c, - 0x921c: 0xe0000f2d, 0x921d: 0xe0000f2a, 0x921e: 0xe0000f47, 0x921f: 0xe0000f44, - 0x9220: 0xe0000f33, 0x9221: 0xe0000f30, 0x9222: 0xe0000f99, 0x9223: 0xe0000f96, - 0x9224: 0xe0000f8a, 0x9225: 0xe0000f87, 0x9226: 0x00303688, 0x9227: 0x40303620, - 0x9228: 0xe000102b, 0x9229: 0xe0001028, 0x922a: 0xe000103f, 0x922b: 0xe000103c, - 0x922c: 0xe0000fe7, 0x922d: 0xe0000fe4, 0x922e: 0xe0000ff9, 0x922f: 0xe0000ff6, - 0x9230: 0x003100c3, 0x9231: 0x40310022, 0x9232: 0xe0001039, 0x9233: 0xe0001036, - 0x9234: 0xe0002728, 0x9235: 0xe0002725, 0x9236: 0xe000110e, 0x9237: 0xe000110b, - 0x9238: 0xe0001117, 0x9239: 0xe000113b, 0x923a: 0xe0001138, 0x923b: 0xe000114d, - 0x923c: 0xe000114a, 0x923d: 0xe0001147, 0x923e: 0xe0001144, 0x923f: 0xe0000f64, - // Block 0x249, offset 0x9240 - 0x9240: 0xe000098f, 0x9241: 0xe000098c, 0x9242: 0xe0000995, 0x9243: 0xe0000992, - 0x9244: 0xe0000b62, 0x9245: 0xe0000b5f, 0x9246: 0xe0000b68, 0x9247: 0xe0000b65, - 0x9248: 0xe0000c6c, 0x9249: 0xe0000c69, 0x924a: 0xe0000c72, 0x924b: 0xe0000c6f, - 0x924c: 0xe0000e4a, 0x924d: 0xe0000e47, 0x924e: 0xe0000e50, 0x924f: 0xe0000e4d, - 0x9250: 0xe0000ee8, 0x9251: 0xe0000ee5, 0x9252: 0xe0000eee, 0x9253: 0xe0000eeb, - 0x9254: 0xe0001053, 0x9255: 0xe0001050, 0x9256: 0xe0001059, 0x9257: 0xe0001056, - 0x9258: 0xe0000f61, 0x9259: 0xe0000f5e, 0x925a: 0xe0000fa5, 0x925b: 0xe0000fa2, - 0x925c: 0x00312288, 0x925d: 0x40312220, 0x925e: 0xe0000bf4, 0x925f: 0xe0000bf1, - 0x9260: 0x002ebc88, 0x9261: 0x402c8c20, 0x9262: 0x002f2288, 0x9263: 0x402f2220, - 0x9264: 0x00314088, 0x9265: 0x40314020, 0x9266: 0xe000096f, 0x9267: 0xe000096c, - 0x9268: 0xe0000b32, 0x9269: 0xe0000b2f, 0x926a: 0xe0002758, 0x926b: 0xe0002755, - 0x926c: 0xe0000dfd, 0x926d: 0xe0000df9, 0x926e: 0xe0000e04, 0x926f: 0xe0000e01, - 0x9270: 0xe0000e0b, 0x9271: 0xe0000e07, 0x9272: 0xe0001129, 0x9273: 0xe0001126, - 0x9274: 0x402e5e20, 0x9275: 0x402ed020, 0x9276: 0x40305a20, 0x9277: 0x402dd420, - 0x9278: 0xe0000abf, 0x9279: 0xe0000ec4, 0x927a: 0x002be888, 0x927b: 0x002c4488, - 0x927c: 0x402c4420, 0x927d: 0x002e3888, 0x927e: 0x00303e88, 0x927f: 0x402ffc20, - // Block 0x24a, offset 0x9280 - 0x9280: 0xe0000d24, 0x9281: 0xe0000d21, 0x9282: 0xe0000d2a, 0x9283: 0xe0000d27, - 0x9284: 0xe0000d69, 0x9285: 0xe0000d66, 0x9286: 0xe0000d7b, 0x9287: 0xe0000d78, - 0x9288: 0xe0000d87, 0x9289: 0xe0000d84, 0x928a: 0xe0000d81, 0x928b: 0xe0000d7e, - 0x928c: 0xe0000ded, 0x928d: 0xe0000de9, 0x928e: 0xe0002a38, 0x928f: 0xe0002a35, - 0x9290: 0xe0000e3d, 0x9291: 0xe0000e39, 0x9292: 0xe0000e35, 0x9293: 0xe0000e31, - 0x9294: 0xe0000ea7, 0x9295: 0xe0000ea4, 0x9296: 0xe0000ead, 0x9297: 0xe0000eaa, - 0x9298: 0xe0000ed6, 0x9299: 0xe0000ed3, 0x929a: 0xe0000ef4, 0x929b: 0xe0000ef1, - 0x929c: 0xe0000efb, 0x929d: 0xe0000ef7, 0x929e: 0xe0000f02, 0x929f: 0xe0000eff, - 0x92a0: 0xe0000f41, 0x92a1: 0xe0000f3e, 0x92a2: 0xe0000f53, 0x92a3: 0xe0000f50, - 0x92a4: 0xe0000f26, 0x92a5: 0xe0000f22, 0x92a6: 0xe0000f3a, 0x92a7: 0xe0000f36, - 0x92a8: 0xe0000f5a, 0x92a9: 0xe0000f56, 0x92aa: 0xe0000f93, 0x92ab: 0xe0000f90, - 0x92ac: 0xe0000f9f, 0x92ad: 0xe0000f9c, 0x92ae: 0xe0000fb1, 0x92af: 0xe0000fae, - 0x92b0: 0xe0000fab, 0x92b1: 0xe0000fa8, 0x92b2: 0xe0001093, 0x92b3: 0xe0001090, - 0x92b4: 0xe000109f, 0x92b5: 0xe000109c, 0x92b6: 0xe0001099, 0x92b7: 0xe0001096, - 0x92b8: 0xe0001032, 0x92b9: 0xe000102e, 0x92ba: 0xe0002685, 0x92bb: 0xe0002682, - 0x92bc: 0xe0002a2f, 0x92bd: 0xe00010a6, 0x92be: 0xe0002a32, 0x92bf: 0xe00010ac, - // Block 0x24b, offset 0x92c0 - 0x92c0: 0xe0000b03, 0x92c1: 0xe0000aff, 0x92c2: 0xe0000b13, 0x92c3: 0xe0000b0f, - 0x92c4: 0xe0000b0b, 0x92c5: 0xe0000b07, 0x92c6: 0xe0000b75, 0x92c7: 0xe0000b71, - 0x92c8: 0xe0000c66, 0x92c9: 0xe0000c63, 0x92ca: 0xe0000c78, 0x92cb: 0xe0000c75, - 0x92cc: 0xe0000e84, 0x92cd: 0xe0000e81, 0x92ce: 0xe0000e44, 0x92cf: 0xe0000e41, - 0x92d0: 0xe0002a3e, 0x92d1: 0xe0002a3b, 0x92d2: 0xe0002a44, 0x92d3: 0xe0002a41, - 0x92d4: 0xe0002a50, 0x92d5: 0xe0002a4d, 0x92d6: 0xe0002a4a, 0x92d7: 0xe0002a47, - 0x92d8: 0xe0002a56, 0x92d9: 0xe0002a53, 0x92da: 0xe0000e5d, 0x92db: 0xe0000e59, - 0x92dc: 0xe0000e65, 0x92dd: 0xe0000e61, 0x92de: 0xe0000e75, 0x92df: 0xe0000e71, - 0x92e0: 0xe0000e6d, 0x92e1: 0xe0000e69, 0x92e2: 0xe0000e7d, 0x92e3: 0xe0000e79, - 0x92e4: 0xe000108d, 0x92e5: 0xe000108a, 0x92e6: 0xe000104d, 0x92e7: 0xe000104a, - 0x92e8: 0xe0001066, 0x92e9: 0xe0001062, 0x92ea: 0xe000106e, 0x92eb: 0xe000106a, - 0x92ec: 0xe000107e, 0x92ed: 0xe000107a, 0x92ee: 0xe0001076, 0x92ef: 0xe0001072, - 0x92f0: 0xe0001086, 0x92f1: 0xe0001082, 0x92f2: 0xe0001108, 0x92f3: 0xe0001105, - 0x92f4: 0xe0001135, 0x92f5: 0xe0001132, 0x92f6: 0xe000112f, 0x92f7: 0xe000112c, - 0x92f8: 0xe000111d, 0x92f9: 0xe000111a, 0x92fa: 0xe0000d0a, 0x92fb: 0xe0000d07, - 0x92fc: 0x0030d888, 0x92fd: 0x4030d820, 0x92fe: 0x00312088, 0x92ff: 0x40312020, - // Block 0x24c, offset 0x9300 - 0x9300: 0xa0000000, 0x9301: 0xa0000000, 0x9302: 0xa0000000, 0x9303: 0xa0000000, - 0x9304: 0xa0000000, 0x9305: 0xa0000000, 0x9306: 0xa0000000, 0x9307: 0xa0000000, - 0x9308: 0xa0000000, 0x9309: 0x40020020, 0x930a: 0x40020220, 0x930b: 0x40020420, - 0x930c: 0x40020620, 0x930d: 0x40020820, 0x930e: 0xa0000000, 0x930f: 0xa0000000, - 0x9310: 0xa0000000, 0x9311: 0xa0000000, 0x9312: 0xa0000000, 0x9313: 0xa0000000, - 0x9314: 0xa0000000, 0x9315: 0xa0000000, 0x9316: 0xa0000000, 0x9317: 0xa0000000, - 0x9318: 0xa0000000, 0x9319: 0xa0000000, 0x931a: 0xa0000000, 0x931b: 0xa0000000, - 0x931c: 0xa0000000, 0x931d: 0xa0000000, 0x931e: 0xa0000000, 0x931f: 0xa0000000, - 0x9320: 0x40021220, 0x9321: 0x4002ba20, 0x9322: 0x4003e020, 0x9323: 0x4004ea20, - 0x9324: 0x4027de20, 0x9325: 0x4004ec20, 0x9326: 0x4004e620, 0x9327: 0x4003d220, - 0x9328: 0x4003f420, 0x9329: 0x4003f620, 0x932a: 0x4004d820, 0x932b: 0x40093820, - 0x932c: 0x40024020, 0x932d: 0x40021a20, 0x932e: 0x4002e420, 0x932f: 0x4004e220, - 0x9330: 0x4029cc20, 0x9331: 0x4029ce20, 0x9332: 0x4029d020, 0x9333: 0x4029d220, - 0x9334: 0x4029d420, 0x9335: 0x4029d620, 0x9336: 0x4029d820, 0x9337: 0x4029da20, - 0x9338: 0x4029dc20, 0x9339: 0x4029de20, 0x933a: 0x40026c20, 0x933b: 0x40026220, - 0x933c: 0x40094020, 0x933d: 0xc32f0851, 0x933e: 0x40094420, 0x933f: 0x4002c420, - // Block 0x24d, offset 0x9340 - 0x9340: 0x4004d620, 0x9341: 0x002bde88, 0x9342: 0x002c0a88, 0x9343: 0xc33b0871, - 0x9344: 0x002c6288, 0x9345: 0x002c9888, 0x9346: 0x002d0888, 0x9347: 0xc33f00d1, - 0x9348: 0x002d6888, 0x9349: 0xc3410891, 0x934a: 0x002dcc88, 0x934b: 0x002dfe88, - 0x934c: 0xc0030002, 0x934d: 0x002e8288, 0x934e: 0x002e9e88, 0x934f: 0xc3450071, - 0x9350: 0x002f2c88, 0x9351: 0x002f5688, 0x9352: 0x002f7a88, 0x9353: 0xc3490871, - 0x9354: 0x00302c88, 0x9355: 0xc34d0071, 0x9356: 0x0030be88, 0x9357: 0x0030e288, - 0x9358: 0x0030f688, 0x9359: 0x00310088, 0x935a: 0x00312a88, 0x935b: 0x4003f820, - 0x935c: 0x4004e420, 0x935d: 0x4003fa20, 0x935e: 0x40062420, 0x935f: 0x40021620, - 0x9360: 0x40061e20, 0x9361: 0x402bde20, 0x9362: 0x402c0a20, 0x9363: 0xc3390871, - 0x9364: 0x402c6220, 0x9365: 0x402c9820, 0x9366: 0x402d0820, 0x9367: 0xc33d00d1, - 0x9368: 0x402d6820, 0x9369: 0x402d9a20, 0x936a: 0x402dcc20, 0x936b: 0x402dfe20, - 0x936c: 0xc0000002, 0x936d: 0x402e8220, 0x936e: 0x402e9e20, 0x936f: 0xc3430071, - 0x9370: 0x402f2c20, 0x9371: 0x402f5620, 0x9372: 0x402f7a20, 0x9373: 0xc3470871, - 0x9374: 0x40302c20, 0x9375: 0xc34b0071, 0x9376: 0x4030be20, 0x9377: 0x4030e220, - 0x9378: 0x4030f620, 0x9379: 0x40310020, 0x937a: 0x40312a20, 0x937b: 0x4003fc20, - 0x937c: 0x40094820, 0x937d: 0x4003fe20, 0x937e: 0x40094c20, 0x937f: 0xa0000000, - // Block 0x24e, offset 0x9380 - 0x9380: 0x00093685, 0x9381: 0x40083620, 0x9382: 0x40083820, 0x9383: 0x40083a20, - 0x9384: 0x40083c20, 0x9385: 0x002c628b, 0x9386: 0x002c6285, 0x9387: 0x002c9885, - 0x9388: 0x002d9a85, 0x9389: 0x002dcc85, 0x938a: 0x40083e20, 0x938b: 0x400a6e20, - 0x938c: 0x40084020, 0x938d: 0xe00009c4, 0x938e: 0x402d1e20, 0x938f: 0x40084220, - 0x9390: 0xe00002cb, 0x9391: 0xe00002d3, 0x9392: 0xe00002b2, 0x9393: 0xe00002bb, - 0x9394: 0xe00003cd, 0x9395: 0xe00002c3, 0x9396: 0xe00003d1, 0x9397: 0xe00004ab, - 0x9398: 0xe0000579, 0x9399: 0xe00002c7, 0x939a: 0xe0000640, 0x939b: 0xe00002cf, - 0x939c: 0xe00004af, 0x939d: 0xe0000644, 0x939e: 0xe0000798, 0x939f: 0xf0001e1e, - 0x93a0: 0x002d9a8a, 0x93a1: 0xe00025cd, 0x93a2: 0xe00025d0, 0x93a3: 0xe00025da, - 0x93a4: 0x0030be8a, 0x93a5: 0xe000260a, 0x93a6: 0xe000260d, 0x93a7: 0xe00010bb, - 0x93a8: 0xe00025e0, 0x93a9: 0x0030f68a, 0x93aa: 0xe0002614, 0x93ab: 0xe000261b, - 0x93ac: 0x002e228a, 0x93ad: 0x002c3a8a, 0x93ae: 0x002c628a, 0x93af: 0x002e828a, - 0x93b0: 0x002d9a84, 0x93b1: 0xf0001f04, 0x93b2: 0xf0000404, 0x93b3: 0xf0001f04, - 0x93b4: 0x0030be84, 0x93b5: 0xf0001f04, 0x93b6: 0xf0000404, 0x93b7: 0xe00010b6, - 0x93b8: 0xf0001f04, 0x93b9: 0x0030f684, 0x93ba: 0xf0001f04, 0x93bb: 0xf0000404, - 0x93bc: 0x002e2284, 0x93bd: 0x002c3a84, 0x93be: 0x002c6284, 0x93bf: 0x002e8284, - // Block 0x24f, offset 0x93c0 - 0x93c0: 0xf0001f04, 0x93c1: 0xf0001f04, 0x93c2: 0xf0001f04, 0x93c3: 0xf0001f04, - 0x93c4: 0xf0001f04, 0x93c5: 0xf0001f04, 0x93c6: 0xf0001f04, 0x93c7: 0xf0001f04, - 0x93c8: 0xf0001f04, 0x93c9: 0xf0001f04, 0x93ca: 0xf0001f04, - 0x93d0: 0xf0000a04, 0x93d1: 0xf0000a04, 0x93d2: 0xf0000a04, 0x93d3: 0xf0000a04, - 0x93d4: 0xf0000a04, 0x93d5: 0xf0000a04, 0x93d6: 0xf0000a04, 0x93d7: 0xf0000a04, - 0x93d8: 0xe0002576, 0x93d9: 0xf0000a04, 0x93da: 0xf0000a04, 0x93db: 0xf0000a04, - 0x93dc: 0xf0000a04, 0x93dd: 0xf0000a04, 0x93de: 0xf0000a04, 0x93df: 0xf0000a04, - 0x93e0: 0xf0000a04, 0x93e1: 0xf0000a04, 0x93e2: 0xf0000a04, 0x93e3: 0xf0000a04, - 0x93e4: 0xf0000a04, 0x93e5: 0xf0000a04, 0x93e6: 0xf0000a04, 0x93e7: 0xf0000a04, - 0x93e8: 0xf0000a04, 0x93e9: 0xf0000a04, 0x93ea: 0xf0000a04, 0x93eb: 0x002c3a8c, - 0x93ec: 0x002f7a8c, 0x93ed: 0xf0000c0c, 0x93ee: 0xf0000c0c, - 0x93f0: 0x002bde9d, 0x93f1: 0x002c0a9d, 0x93f2: 0x002c3a9d, 0x93f3: 0x002c629d, - 0x93f4: 0x002c989d, 0x93f5: 0x002d089d, 0x93f6: 0x002d229d, 0x93f7: 0x002d689d, - 0x93f8: 0x002d9a9d, 0x93f9: 0x002dcc9d, 0x93fa: 0x002dfe9d, 0x93fb: 0x002e229d, - 0x93fc: 0x002e829d, 0x93fd: 0x002e9e9d, 0x93fe: 0x002ee29d, 0x93ff: 0x002f2c9d, -} - -// mainLookup: 4864 entries, 9728 bytes -// Block 0 is the null block. -var mainLookup = [4864]uint16{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0x0e0: 0x1f, 0x0e1: 0x20, 0x0e2: 0x21, 0x0e3: 0x22, 0x0e4: 0x23, 0x0e5: 0x24, 0x0e6: 0x25, 0x0e7: 0x26, - 0x0e8: 0x27, 0x0e9: 0x28, 0x0ea: 0x29, 0x0eb: 0x2a, 0x0ec: 0x2b, 0x0ed: 0x2c, 0x0ee: 0x2d, 0x0ef: 0x2e, - 0x0f0: 0x2f, 0x0f1: 0x30, 0x0f2: 0x31, 0x0f3: 0x32, 0x0f4: 0x33, 0x0f5: 0x34, 0x0f6: 0x35, 0x0f7: 0x36, - 0x0f8: 0x37, 0x0f9: 0x38, 0x0fa: 0x39, 0x0fb: 0x3a, 0x0fc: 0x3b, 0x0fd: 0x3c, 0x0fe: 0x3d, 0x0ff: 0x3e, - // Block 0x4, offset 0x100 - 0x100: 0x3f, 0x101: 0x40, 0x102: 0x41, 0x103: 0x42, 0x104: 0x43, 0x105: 0x44, 0x106: 0x45, 0x107: 0x46, - 0x108: 0x47, 0x109: 0x48, 0x10a: 0x49, 0x10b: 0x4a, 0x10c: 0x4b, 0x10d: 0x4c, 0x10e: 0x4d, 0x10f: 0x4e, - 0x110: 0x4f, 0x111: 0x50, 0x112: 0x51, 0x113: 0x52, 0x114: 0x53, 0x115: 0x54, 0x116: 0x55, 0x117: 0x56, - 0x118: 0x57, 0x119: 0x58, 0x11a: 0x59, 0x11b: 0x5a, 0x11c: 0x5b, 0x11d: 0x5c, 0x11e: 0x5d, 0x11f: 0x5e, - 0x120: 0x5f, 0x121: 0x60, 0x122: 0x61, 0x123: 0x62, 0x124: 0x63, 0x125: 0x64, 0x126: 0x65, 0x127: 0x66, - 0x128: 0x67, 0x129: 0x68, 0x12a: 0x69, 0x12c: 0x6a, 0x12d: 0x6b, 0x12e: 0x6c, 0x12f: 0x6d, - 0x130: 0x6e, 0x131: 0x6f, 0x133: 0x70, 0x134: 0x71, 0x135: 0x72, 0x136: 0x73, 0x137: 0x74, - 0x138: 0x75, 0x139: 0x76, 0x13a: 0x77, 0x13b: 0x78, 0x13c: 0x79, 0x13d: 0x7a, 0x13e: 0x7b, 0x13f: 0x7c, - // Block 0x5, offset 0x140 - 0x140: 0x7d, 0x141: 0x7e, 0x142: 0x7f, 0x143: 0x80, 0x144: 0x81, 0x145: 0x82, 0x146: 0x83, 0x147: 0x84, - 0x148: 0x85, 0x149: 0x86, 0x14a: 0x87, 0x14b: 0x88, 0x14c: 0x89, 0x14d: 0x8a, 0x14e: 0x8b, 0x14f: 0x8c, - 0x150: 0x8d, 0x151: 0x8e, 0x152: 0x8f, 0x153: 0x90, 0x154: 0x91, 0x155: 0x92, 0x156: 0x93, 0x157: 0x94, - 0x158: 0x95, 0x159: 0x96, 0x15a: 0x97, 0x15b: 0x98, 0x15c: 0x99, 0x15d: 0x9a, 0x15e: 0x9b, 0x15f: 0x9c, - 0x160: 0x9d, 0x161: 0x9e, 0x162: 0x9f, 0x163: 0xa0, 0x164: 0xa1, 0x165: 0xa2, 0x166: 0xa3, 0x167: 0xa4, - 0x168: 0xa5, 0x169: 0xa6, 0x16a: 0xa7, 0x16b: 0xa8, 0x16c: 0xa9, 0x16d: 0xaa, - 0x170: 0xab, 0x171: 0xac, 0x172: 0xad, 0x173: 0xae, 0x174: 0xaf, 0x175: 0xb0, 0x176: 0xb1, 0x177: 0xb2, - 0x178: 0xb3, 0x17a: 0xb4, 0x17b: 0xb5, 0x17c: 0xb6, 0x17d: 0xb7, 0x17e: 0xb8, 0x17f: 0xb9, - // Block 0x6, offset 0x180 - 0x180: 0xba, 0x181: 0xbb, 0x182: 0xbc, 0x183: 0xbd, 0x184: 0xbe, 0x185: 0xbf, 0x186: 0xc0, 0x187: 0xc1, - 0x188: 0xc2, 0x189: 0xc3, 0x18a: 0xc4, 0x18b: 0xc5, 0x18c: 0xc6, 0x18d: 0xc7, 0x18e: 0xc8, 0x18f: 0xc9, - // Block 0x7, offset 0x1c0 - 0x1f7: 0xca, - // Block 0x8, offset 0x200 - 0x200: 0xcb, 0x201: 0xcc, 0x202: 0xcd, 0x203: 0xce, 0x204: 0xcf, 0x205: 0xd0, 0x206: 0xd1, 0x207: 0xd2, - 0x208: 0xd3, 0x209: 0xd4, 0x20a: 0xd5, 0x20b: 0xd6, 0x20c: 0xd7, 0x20d: 0xd8, 0x20e: 0xd9, 0x20f: 0xda, - 0x210: 0xdb, 0x211: 0xdc, 0x212: 0xdd, 0x213: 0xde, 0x214: 0xdf, 0x215: 0xe0, 0x216: 0xe1, 0x217: 0xe2, - 0x218: 0xe3, 0x219: 0xe4, 0x21a: 0xe5, 0x21b: 0xe6, 0x21c: 0xe7, 0x21d: 0xe8, 0x21e: 0xe9, 0x21f: 0xea, - 0x220: 0xeb, 0x221: 0xec, 0x222: 0xed, 0x223: 0xee, 0x224: 0xef, 0x225: 0xf0, 0x226: 0xf1, 0x227: 0xf2, - 0x228: 0xf3, 0x229: 0xf4, 0x22a: 0xf5, 0x22b: 0xf6, 0x22c: 0xf7, 0x22f: 0xf8, - // Block 0x9, offset 0x240 - 0x25e: 0xf9, 0x25f: 0xfa, - // Block 0xa, offset 0x280 - 0x2a4: 0xfb, 0x2a5: 0xfc, 0x2a6: 0xfd, 0x2a7: 0xfe, - 0x2a8: 0xff, 0x2a9: 0x100, 0x2aa: 0x101, 0x2ab: 0x102, 0x2ac: 0x103, 0x2ad: 0x104, 0x2ae: 0x105, 0x2af: 0x106, - 0x2b0: 0x107, 0x2b1: 0x108, 0x2b2: 0x109, 0x2b3: 0x10a, 0x2b4: 0x10b, 0x2b5: 0x10c, 0x2b6: 0x10d, 0x2b7: 0x10e, - 0x2b8: 0x10f, 0x2b9: 0x110, 0x2ba: 0x111, 0x2bb: 0x112, 0x2bc: 0x113, 0x2bd: 0x114, 0x2be: 0x115, 0x2bf: 0x116, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x117, 0x2c1: 0x118, 0x2c2: 0x119, 0x2c3: 0x11a, 0x2c4: 0x11b, 0x2c5: 0x11c, 0x2c6: 0x11d, 0x2c7: 0x11e, - 0x2ca: 0x11f, 0x2cb: 0x120, 0x2cc: 0x121, 0x2cd: 0x122, 0x2ce: 0x123, 0x2cf: 0x124, - 0x2d0: 0x125, 0x2d1: 0x126, 0x2d2: 0x127, - 0x2e0: 0x128, 0x2e1: 0x129, 0x2e4: 0x12a, 0x2e6: 0x12b, - 0x2e8: 0x12c, 0x2e9: 0x12d, 0x2ec: 0x12e, 0x2ed: 0x12f, - 0x2f0: 0x130, 0x2f1: 0x131, - 0x2f9: 0x132, - // Block 0xc, offset 0x300 - 0x300: 0x133, 0x301: 0x134, 0x302: 0x135, 0x303: 0x136, 0x304: 0x137, 0x305: 0x138, 0x306: 0x139, 0x307: 0x13a, - 0x31a: 0x13b, 0x31b: 0x13c, - // Block 0xd, offset 0x340 - 0x340: 0x13d, 0x341: 0x13e, 0x342: 0x13f, 0x343: 0x140, 0x344: 0x141, 0x345: 0x142, 0x346: 0x143, 0x347: 0x144, - 0x348: 0x145, 0x349: 0x146, 0x34a: 0x147, 0x34b: 0x148, 0x34c: 0x149, 0x34d: 0x14a, - 0x350: 0x14b, 0x351: 0x14c, - // Block 0xe, offset 0x380 - 0x380: 0x14d, 0x381: 0x14e, 0x382: 0x14f, 0x383: 0x150, 0x384: 0x151, 0x385: 0x152, 0x386: 0x153, 0x387: 0x154, - 0x388: 0x155, 0x389: 0x156, 0x38a: 0x157, 0x38b: 0x158, 0x38c: 0x159, 0x38d: 0x15a, 0x38e: 0x15b, 0x38f: 0x15c, - 0x390: 0x15d, - // Block 0xf, offset 0x3c0 - 0x3e0: 0x15e, 0x3e1: 0x15f, 0x3e2: 0x160, 0x3e3: 0x161, 0x3e4: 0x162, 0x3e5: 0x163, 0x3e6: 0x164, 0x3e7: 0x165, - 0x3e8: 0x166, - 0x3fc: 0x167, 0x3fd: 0x168, 0x3fe: 0x169, - // Block 0x10, offset 0x400 - 0x400: 0x16a, - // Block 0x11, offset 0x440 - 0x440: 0x16b, 0x441: 0x16c, 0x442: 0x16d, 0x443: 0x16e, 0x444: 0x16f, 0x445: 0x170, 0x446: 0x171, 0x447: 0x172, - 0x448: 0x173, 0x449: 0x174, 0x44c: 0x175, 0x44d: 0x176, - 0x450: 0x177, 0x451: 0x178, 0x452: 0x179, 0x453: 0x17a, 0x454: 0x17b, 0x455: 0x17c, 0x456: 0x17d, 0x457: 0x17e, - 0x458: 0x17f, 0x459: 0x180, 0x45a: 0x181, 0x45b: 0x182, 0x45c: 0x183, 0x45d: 0x184, 0x45e: 0x185, 0x45f: 0x186, - // Block 0x12, offset 0x480 - 0x4b8: 0x187, 0x4b9: 0x188, 0x4ba: 0x189, 0x4bb: 0x18a, - // Block 0x13, offset 0x4c0 - 0x4c0: 0x18b, 0x4c1: 0x18c, 0x4c2: 0x18d, 0x4c3: 0x18e, 0x4c4: 0x18f, 0x4c5: 0x190, 0x4c6: 0x191, 0x4c7: 0x192, - 0x4c8: 0x193, 0x4c9: 0x194, 0x4cc: 0x195, 0x4cd: 0x196, 0x4ce: 0x197, 0x4cf: 0x198, - 0x4d0: 0x199, 0x4d1: 0x19a, 0x4d2: 0x19b, 0x4d3: 0x19c, 0x4d4: 0x19d, 0x4d5: 0x19e, 0x4d7: 0x19f, - 0x4d8: 0x1a0, 0x4d9: 0x1a1, 0x4da: 0x1a2, 0x4db: 0x1a3, 0x4dc: 0x1a4, 0x4dd: 0x1a5, - // Block 0x14, offset 0x500 - 0x520: 0x1a6, 0x521: 0x1a7, 0x522: 0x1a8, 0x523: 0x1a9, 0x524: 0x1aa, 0x525: 0x1ab, 0x526: 0x1ac, 0x527: 0x1ad, - 0x528: 0x1ae, - // Block 0x15, offset 0x540 - 0x550: 0x09, 0x551: 0x0a, 0x552: 0x0b, 0x553: 0x0c, 0x556: 0x0d, - 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, - 0x56f: 0x12, - // Block 0x16, offset 0x580 - 0x580: 0x1af, 0x581: 0x1b0, 0x584: 0x1b0, 0x585: 0x1b0, 0x586: 0x1b0, 0x587: 0x1b1, - // Block 0x17, offset 0x5c0 - 0x5e0: 0x14, - // Block 0x18, offset 0x600 - 0x602: 0x01, 0x603: 0x02, 0x604: 0x03, 0x605: 0x04, 0x606: 0x05, 0x607: 0x06, - 0x608: 0x07, 0x609: 0x08, 0x60a: 0x09, 0x60b: 0x0a, 0x60c: 0x0b, 0x60d: 0x0c, 0x60e: 0x0d, 0x60f: 0x0e, - 0x610: 0x0f, 0x611: 0x10, 0x612: 0x11, 0x613: 0x12, 0x614: 0x13, 0x615: 0x14, 0x616: 0x15, 0x617: 0x16, - 0x618: 0x17, 0x619: 0x18, 0x61a: 0x19, 0x61b: 0x1a, 0x61c: 0x1b, 0x61d: 0x1c, 0x61e: 0x1d, 0x61f: 0x1e, - 0x620: 0x01, 0x621: 0x02, 0x622: 0x03, 0x623: 0x04, 0x624: 0x05, - 0x62a: 0x06, 0x62d: 0x07, 0x62f: 0x08, - 0x630: 0x13, 0x633: 0x15, - // Block 0x19, offset 0x640 - 0x660: 0x1f, 0x661: 0x20, 0x662: 0x21, 0x663: 0x22, 0x664: 0x23, 0x665: 0x24, 0x666: 0x25, 0x667: 0x26, - 0x668: 0x27, 0x669: 0x28, 0x66a: 0x29, 0x66b: 0x2a, 0x66c: 0x2b, 0x66d: 0x2c, 0x66e: 0x2d, 0x66f: 0x2e, - 0x670: 0x2f, 0x671: 0x30, 0x672: 0x31, 0x673: 0x32, 0x674: 0x33, 0x675: 0x34, 0x676: 0x35, 0x677: 0x36, - 0x678: 0x1b8, 0x679: 0x38, 0x67a: 0x39, 0x67b: 0x3a, 0x67c: 0x3b, 0x67d: 0x3c, 0x67e: 0x3d, 0x67f: 0x3e, - // Block 0x1a, offset 0x680 - 0x680: 0x3f, 0x681: 0x40, 0x682: 0x41, 0x683: 0x42, 0x684: 0x1b9, 0x685: 0x1ba, 0x686: 0x1bb, 0x687: 0x1bc, - 0x688: 0x47, 0x689: 0x48, 0x68a: 0x49, 0x68b: 0x4a, 0x68c: 0x4b, 0x68d: 0x4c, 0x68e: 0x4d, 0x68f: 0x4e, - 0x690: 0x4f, 0x691: 0x50, 0x692: 0x51, 0x693: 0x52, 0x694: 0x53, 0x695: 0x54, 0x696: 0x55, 0x697: 0x56, - 0x698: 0x57, 0x699: 0x58, 0x69a: 0x59, 0x69b: 0x5a, 0x69c: 0x5b, 0x69d: 0x5c, 0x69e: 0x5d, 0x69f: 0x5e, - 0x6a0: 0x5f, 0x6a1: 0x60, 0x6a2: 0x61, 0x6a3: 0x62, 0x6a4: 0x63, 0x6a5: 0x64, 0x6a6: 0x65, 0x6a7: 0x66, - 0x6a8: 0x67, 0x6a9: 0x68, 0x6aa: 0x69, 0x6ac: 0x6a, 0x6ad: 0x6b, 0x6ae: 0x6c, 0x6af: 0x6d, - 0x6b0: 0x6e, 0x6b1: 0x6f, 0x6b3: 0x70, 0x6b4: 0x71, 0x6b5: 0x72, 0x6b6: 0x73, 0x6b7: 0x74, - 0x6b8: 0x75, 0x6b9: 0x76, 0x6ba: 0x77, 0x6bb: 0x78, 0x6bc: 0x79, 0x6bd: 0x7a, 0x6be: 0x7b, 0x6bf: 0x7c, - // Block 0x1b, offset 0x6c0 - 0x6c0: 0x7d, 0x6c1: 0x7e, 0x6c2: 0x7f, 0x6c3: 0x80, 0x6c4: 0x81, 0x6c5: 0x82, 0x6c6: 0x83, 0x6c7: 0x84, - 0x6c8: 0x85, 0x6c9: 0x1bd, 0x6ca: 0x87, 0x6cb: 0x88, 0x6cc: 0x89, 0x6cd: 0x8a, 0x6ce: 0x8b, 0x6cf: 0x8c, - 0x6d0: 0x8d, 0x6d1: 0x8e, 0x6d2: 0x8f, 0x6d3: 0x90, 0x6d4: 0x91, 0x6d5: 0x92, 0x6d6: 0x93, 0x6d7: 0x94, - 0x6d8: 0x95, 0x6d9: 0x96, 0x6da: 0x97, 0x6db: 0x98, 0x6dc: 0x99, 0x6dd: 0x9a, 0x6de: 0x9b, 0x6df: 0x9c, - 0x6e0: 0x9d, 0x6e1: 0x9e, 0x6e2: 0x9f, 0x6e3: 0xa0, 0x6e4: 0xa1, 0x6e5: 0xa2, 0x6e6: 0xa3, 0x6e7: 0xa4, - 0x6e8: 0xa5, 0x6e9: 0xa6, 0x6ea: 0xa7, 0x6eb: 0xa8, 0x6ec: 0xa9, 0x6ed: 0xaa, - 0x6f0: 0xab, 0x6f1: 0xac, 0x6f2: 0xad, 0x6f3: 0xae, 0x6f4: 0xaf, 0x6f5: 0xb0, 0x6f6: 0xb1, 0x6f7: 0xb2, - 0x6f8: 0xb3, 0x6fa: 0xb4, 0x6fb: 0xb5, 0x6fc: 0xb6, 0x6fd: 0xb7, 0x6fe: 0xb8, 0x6ff: 0xb9, - // Block 0x1c, offset 0x700 - 0x724: 0xfb, 0x725: 0xfc, 0x726: 0xfd, 0x727: 0xfe, - 0x728: 0xff, 0x729: 0x100, 0x72a: 0x101, 0x72b: 0x102, 0x72c: 0x103, 0x72d: 0x104, 0x72e: 0x105, 0x72f: 0x1be, - 0x730: 0x1bf, 0x731: 0x1c0, 0x732: 0x1c1, 0x733: 0x1c2, 0x734: 0x1c3, 0x735: 0x10c, 0x736: 0x10d, 0x737: 0x10e, - 0x738: 0x10f, 0x739: 0x110, 0x73a: 0x1c4, 0x73b: 0x1c5, 0x73c: 0x113, 0x73d: 0x114, 0x73e: 0x115, 0x73f: 0x116, - // Block 0x1d, offset 0x740 - 0x742: 0x01, 0x743: 0x02, 0x744: 0x03, 0x745: 0x04, 0x746: 0x05, 0x747: 0x06, - 0x748: 0x07, 0x749: 0x08, 0x74a: 0x09, 0x74b: 0x0a, 0x74c: 0x0b, 0x74d: 0x0c, 0x74e: 0x0d, 0x74f: 0x0e, - 0x750: 0x0f, 0x751: 0x10, 0x752: 0x11, 0x753: 0x12, 0x754: 0x13, 0x755: 0x14, 0x756: 0x15, 0x757: 0x1b4, - 0x758: 0x1b5, 0x759: 0x1b6, 0x75a: 0x19, 0x75b: 0x1b7, 0x75c: 0x1b, 0x75d: 0x1c, 0x75e: 0x1d, 0x75f: 0x1e, - 0x760: 0x17, 0x761: 0x18, 0x762: 0x19, 0x763: 0x04, 0x764: 0x05, - 0x76a: 0x06, 0x76d: 0x07, 0x76f: 0x1a, - 0x770: 0x13, 0x773: 0x15, - // Block 0x1e, offset 0x780 - 0x780: 0x3f, 0x781: 0x40, 0x782: 0x41, 0x783: 0x42, 0x784: 0x1b9, 0x785: 0x1ba, 0x786: 0x1bb, 0x787: 0x1bc, - 0x788: 0x47, 0x789: 0x48, 0x78a: 0x49, 0x78b: 0x4a, 0x78c: 0x4b, 0x78d: 0x4c, 0x78e: 0x4d, 0x78f: 0x4e, - 0x790: 0x4f, 0x791: 0x50, 0x792: 0x51, 0x793: 0x52, 0x794: 0x53, 0x795: 0x54, 0x796: 0x55, 0x797: 0x56, - 0x798: 0x57, 0x799: 0x58, 0x79a: 0x59, 0x79b: 0x5a, 0x79c: 0x5b, 0x79d: 0x5c, 0x79e: 0x5d, 0x79f: 0x5e, - 0x7a0: 0x5f, 0x7a1: 0x60, 0x7a2: 0x61, 0x7a3: 0x62, 0x7a4: 0x63, 0x7a5: 0x64, 0x7a6: 0x65, 0x7a7: 0x66, - 0x7a8: 0x67, 0x7a9: 0x68, 0x7aa: 0x69, 0x7ac: 0x6a, 0x7ad: 0x6b, 0x7ae: 0x6c, 0x7af: 0x6d, - 0x7b0: 0x6e, 0x7b1: 0x6f, 0x7b3: 0x70, 0x7b4: 0x71, 0x7b5: 0x72, 0x7b6: 0x73, 0x7b7: 0x74, - 0x7b8: 0x1cf, 0x7b9: 0x1d0, 0x7ba: 0x1d1, 0x7bb: 0x1d2, 0x7bc: 0x79, 0x7bd: 0x7a, 0x7be: 0x7b, 0x7bf: 0x7c, - // Block 0x1f, offset 0x7c0 - 0x7c0: 0x7d, 0x7c1: 0x7e, 0x7c2: 0x7f, 0x7c3: 0x80, 0x7c4: 0x81, 0x7c5: 0x1d3, 0x7c6: 0x83, 0x7c7: 0x84, - 0x7c8: 0x85, 0x7c9: 0x1bd, 0x7ca: 0x87, 0x7cb: 0x88, 0x7cc: 0x89, 0x7cd: 0x8a, 0x7ce: 0x8b, 0x7cf: 0x8c, - 0x7d0: 0x8d, 0x7d1: 0x8e, 0x7d2: 0x1d4, 0x7d3: 0x90, 0x7d4: 0x91, 0x7d5: 0x92, 0x7d6: 0x93, 0x7d7: 0x94, - 0x7d8: 0x95, 0x7d9: 0x96, 0x7da: 0x97, 0x7db: 0x98, 0x7dc: 0x99, 0x7dd: 0x9a, 0x7de: 0x9b, 0x7df: 0x9c, - 0x7e0: 0x9d, 0x7e1: 0x9e, 0x7e2: 0x9f, 0x7e3: 0xa0, 0x7e4: 0xa1, 0x7e5: 0xa2, 0x7e6: 0xa3, 0x7e7: 0xa4, - 0x7e8: 0xa5, 0x7e9: 0xa6, 0x7ea: 0xa7, 0x7eb: 0xa8, 0x7ec: 0xa9, 0x7ed: 0xaa, - 0x7f0: 0xab, 0x7f1: 0xac, 0x7f2: 0xad, 0x7f3: 0xae, 0x7f4: 0xaf, 0x7f5: 0xb0, 0x7f6: 0xb1, 0x7f7: 0xb2, - 0x7f8: 0xb3, 0x7fa: 0xb4, 0x7fb: 0xb5, 0x7fc: 0xb6, 0x7fd: 0xb7, 0x7fe: 0xb8, 0x7ff: 0xb9, - // Block 0x20, offset 0x800 - 0x800: 0xba, 0x801: 0xbb, 0x802: 0xbc, 0x803: 0xbd, 0x804: 0xbe, 0x805: 0xbf, 0x806: 0xc0, 0x807: 0xc1, - 0x808: 0xc2, 0x809: 0xc3, 0x80a: 0xc4, 0x80b: 0xc5, 0x80c: 0xc6, 0x80d: 0x1d5, 0x80e: 0xc8, 0x80f: 0x1d6, - // Block 0x21, offset 0x840 - 0x840: 0x18b, 0x841: 0x18c, 0x842: 0x18d, 0x843: 0x18e, 0x844: 0x1d7, 0x845: 0x190, 0x846: 0x191, 0x847: 0x192, - 0x848: 0x193, 0x849: 0x194, 0x84c: 0x195, 0x84d: 0x196, 0x84e: 0x197, 0x84f: 0x198, - 0x850: 0x199, 0x851: 0x19a, 0x852: 0x19b, 0x853: 0x19c, 0x854: 0x19d, 0x855: 0x19e, 0x857: 0x19f, - 0x858: 0x1a0, 0x859: 0x1a1, 0x85a: 0x1a2, 0x85b: 0x1a3, 0x85c: 0x1a4, 0x85d: 0x1a5, - // Block 0x22, offset 0x880 - 0x890: 0x09, 0x891: 0x0a, 0x892: 0x0b, 0x893: 0x0c, 0x896: 0x0d, - 0x89b: 0x0e, 0x89d: 0x0f, 0x89e: 0x10, 0x89f: 0x1f, - 0x8af: 0x12, - // Block 0x23, offset 0x8c0 - 0x8c2: 0x01, 0x8c3: 0x1c8, 0x8c4: 0x1c9, 0x8c5: 0x1ca, 0x8c6: 0x1cb, 0x8c7: 0x1cc, - 0x8c8: 0x1cd, 0x8c9: 0x1ce, 0x8ca: 0x09, 0x8cb: 0x0a, 0x8cc: 0x0b, 0x8cd: 0x0c, 0x8ce: 0x0d, 0x8cf: 0x0e, - 0x8d0: 0x0f, 0x8d1: 0x10, 0x8d2: 0x11, 0x8d3: 0x12, 0x8d4: 0x13, 0x8d5: 0x14, 0x8d6: 0x15, 0x8d7: 0x1b4, - 0x8d8: 0x1b5, 0x8d9: 0x1b6, 0x8da: 0x19, 0x8db: 0x1b7, 0x8dc: 0x1b, 0x8dd: 0x1c, 0x8de: 0x1d, 0x8df: 0x1e, - 0x8e0: 0x17, 0x8e1: 0x1c, 0x8e2: 0x1d, 0x8e3: 0x1e, 0x8e4: 0x05, - 0x8ea: 0x06, 0x8ed: 0x07, 0x8ef: 0x1a, - 0x8f0: 0x20, 0x8f3: 0x15, - // Block 0x24, offset 0x900 - 0x902: 0x01, 0x903: 0x02, 0x904: 0x1da, 0x905: 0x1db, 0x906: 0x05, 0x907: 0x06, - 0x908: 0x07, 0x909: 0x08, 0x90a: 0x09, 0x90b: 0x0a, 0x90c: 0x0b, 0x90d: 0x0c, 0x90e: 0x0d, 0x90f: 0x0e, - 0x910: 0x0f, 0x911: 0x10, 0x912: 0x11, 0x913: 0x12, 0x914: 0x13, 0x915: 0x14, 0x916: 0x15, 0x917: 0x1b4, - 0x918: 0x1b5, 0x919: 0x1b6, 0x91a: 0x19, 0x91b: 0x1b7, 0x91c: 0x1b, 0x91d: 0x1c, 0x91e: 0x1d, 0x91f: 0x1e, - 0x920: 0x17, 0x921: 0x18, 0x922: 0x19, 0x923: 0x04, 0x924: 0x05, - 0x92a: 0x06, 0x92d: 0x07, 0x92f: 0x1a, - 0x930: 0x13, 0x933: 0x15, - // Block 0x25, offset 0x940 - 0x940: 0x3f, 0x941: 0x40, 0x942: 0x41, 0x943: 0x42, 0x944: 0x1b9, 0x945: 0x1ba, 0x946: 0x1bb, 0x947: 0x1bc, - 0x948: 0x47, 0x949: 0x48, 0x94a: 0x49, 0x94b: 0x4a, 0x94c: 0x4b, 0x94d: 0x4c, 0x94e: 0x4d, 0x94f: 0x4e, - 0x950: 0x4f, 0x951: 0x50, 0x952: 0x51, 0x953: 0x52, 0x954: 0x53, 0x955: 0x54, 0x956: 0x55, 0x957: 0x56, - 0x958: 0x57, 0x959: 0x58, 0x95a: 0x59, 0x95b: 0x5a, 0x95c: 0x5b, 0x95d: 0x5c, 0x95e: 0x5d, 0x95f: 0x5e, - 0x960: 0x5f, 0x961: 0x60, 0x962: 0x61, 0x963: 0x62, 0x964: 0x63, 0x965: 0x64, 0x966: 0x65, 0x967: 0x66, - 0x968: 0x67, 0x969: 0x68, 0x96a: 0x69, 0x96c: 0x6a, 0x96d: 0x6b, 0x96e: 0x6c, 0x96f: 0x6d, - 0x970: 0x6e, 0x971: 0x6f, 0x973: 0x70, 0x974: 0x71, 0x975: 0x72, 0x976: 0x73, 0x977: 0x74, - 0x978: 0x1e2, 0x979: 0x1e3, 0x97a: 0x1e4, 0x97b: 0x1e5, 0x97c: 0x79, 0x97d: 0x7a, 0x97e: 0x7b, 0x97f: 0x7c, - // Block 0x26, offset 0x980 - 0x982: 0x01, 0x983: 0x1de, 0x984: 0x1df, 0x985: 0x1e0, 0x986: 0x05, 0x987: 0x1e1, - 0x988: 0x07, 0x989: 0x08, 0x98a: 0x09, 0x98b: 0x0a, 0x98c: 0x0b, 0x98d: 0x0c, 0x98e: 0x0d, 0x98f: 0x0e, - 0x990: 0x0f, 0x991: 0x10, 0x992: 0x11, 0x993: 0x12, 0x994: 0x13, 0x995: 0x14, 0x996: 0x15, 0x997: 0x1b4, - 0x998: 0x1b5, 0x999: 0x1b6, 0x99a: 0x19, 0x99b: 0x1b7, 0x99c: 0x1b, 0x99d: 0x1c, 0x99e: 0x1d, 0x99f: 0x1e, - 0x9a0: 0x17, 0x9a1: 0x23, 0x9a2: 0x19, 0x9a3: 0x04, 0x9a4: 0x05, - 0x9aa: 0x06, 0x9ad: 0x07, 0x9af: 0x1a, - 0x9b0: 0x13, 0x9b3: 0x15, - // Block 0x27, offset 0x9c0 - 0x9c0: 0x3f, 0x9c1: 0x40, 0x9c2: 0x41, 0x9c3: 0x42, 0x9c4: 0x1b9, 0x9c5: 0x1ba, 0x9c6: 0x1bb, 0x9c7: 0x1bc, - 0x9c8: 0x47, 0x9c9: 0x48, 0x9ca: 0x49, 0x9cb: 0x4a, 0x9cc: 0x4b, 0x9cd: 0x4c, 0x9ce: 0x4d, 0x9cf: 0x4e, - 0x9d0: 0x4f, 0x9d1: 0x50, 0x9d2: 0x51, 0x9d3: 0x52, 0x9d4: 0x53, 0x9d5: 0x54, 0x9d6: 0x55, 0x9d7: 0x56, - 0x9d8: 0x57, 0x9d9: 0x58, 0x9da: 0x59, 0x9db: 0x5a, 0x9dc: 0x5b, 0x9dd: 0x5c, 0x9de: 0x5d, 0x9df: 0x5e, - 0x9e0: 0x5f, 0x9e1: 0x60, 0x9e2: 0x61, 0x9e3: 0x62, 0x9e4: 0x63, 0x9e5: 0x64, 0x9e6: 0x65, 0x9e7: 0x66, - 0x9e8: 0x67, 0x9e9: 0x68, 0x9ea: 0x69, 0x9ec: 0x6a, 0x9ed: 0x6b, 0x9ee: 0x6c, 0x9ef: 0x6d, - 0x9f0: 0x6e, 0x9f1: 0x6f, 0x9f3: 0x70, 0x9f4: 0x71, 0x9f5: 0x72, 0x9f6: 0x1ed, 0x9f7: 0x74, - 0x9f8: 0x75, 0x9f9: 0x1ee, 0x9fa: 0x77, 0x9fb: 0x78, 0x9fc: 0x79, 0x9fd: 0x7a, 0x9fe: 0x7b, 0x9ff: 0x7c, - // Block 0x28, offset 0xa00 - 0xa00: 0x7d, 0xa01: 0x7e, 0xa02: 0x7f, 0xa03: 0x80, 0xa04: 0x1ef, 0xa05: 0x82, 0xa06: 0x83, 0xa07: 0x84, - 0xa08: 0x85, 0xa09: 0x1bd, 0xa0a: 0x87, 0xa0b: 0x88, 0xa0c: 0x89, 0xa0d: 0x8a, 0xa0e: 0x8b, 0xa0f: 0x8c, - 0xa10: 0x8d, 0xa11: 0x8e, 0xa12: 0x8f, 0xa13: 0x90, 0xa14: 0x91, 0xa15: 0x92, 0xa16: 0x93, 0xa17: 0x94, - 0xa18: 0x95, 0xa19: 0x96, 0xa1a: 0x97, 0xa1b: 0x98, 0xa1c: 0x99, 0xa1d: 0x9a, 0xa1e: 0x9b, 0xa1f: 0x9c, - 0xa20: 0x9d, 0xa21: 0x9e, 0xa22: 0x9f, 0xa23: 0xa0, 0xa24: 0xa1, 0xa25: 0xa2, 0xa26: 0xa3, 0xa27: 0xa4, - 0xa28: 0xa5, 0xa29: 0xa6, 0xa2a: 0xa7, 0xa2b: 0xa8, 0xa2c: 0xa9, 0xa2d: 0xaa, - 0xa30: 0xab, 0xa31: 0xac, 0xa32: 0xad, 0xa33: 0xae, 0xa34: 0xaf, 0xa35: 0xb0, 0xa36: 0xb1, 0xa37: 0xb2, - 0xa38: 0xb3, 0xa3a: 0xb4, 0xa3b: 0xb5, 0xa3c: 0xb6, 0xa3d: 0xb7, 0xa3e: 0xb8, 0xa3f: 0xb9, - // Block 0x29, offset 0xa40 - 0xa42: 0x01, 0xa43: 0x1e8, 0xa44: 0x1e9, 0xa45: 0x1ea, 0xa46: 0x05, 0xa47: 0x1eb, - 0xa48: 0x1ec, 0xa49: 0x08, 0xa4a: 0x09, 0xa4b: 0x0a, 0xa4c: 0x0b, 0xa4d: 0x0c, 0xa4e: 0x0d, 0xa4f: 0x0e, - 0xa50: 0x0f, 0xa51: 0x10, 0xa52: 0x11, 0xa53: 0x12, 0xa54: 0x13, 0xa55: 0x14, 0xa56: 0x15, 0xa57: 0x1b4, - 0xa58: 0x1b5, 0xa59: 0x1b6, 0xa5a: 0x19, 0xa5b: 0x1b7, 0xa5c: 0x1b, 0xa5d: 0x1c, 0xa5e: 0x1d, 0xa5f: 0x1e, - 0xa60: 0x17, 0xa61: 0x25, 0xa62: 0x26, 0xa63: 0x04, 0xa64: 0x05, - 0xa6a: 0x06, 0xa6d: 0x07, 0xa6f: 0x1a, - 0xa70: 0x13, 0xa73: 0x15, - // Block 0x2a, offset 0xa80 - 0xa80: 0x3f, 0xa81: 0x40, 0xa82: 0x41, 0xa83: 0x42, 0xa84: 0x1b9, 0xa85: 0x1ba, 0xa86: 0x1bb, 0xa87: 0x1bc, - 0xa88: 0x47, 0xa89: 0x48, 0xa8a: 0x49, 0xa8b: 0x4a, 0xa8c: 0x4b, 0xa8d: 0x4c, 0xa8e: 0x4d, 0xa8f: 0x4e, - 0xa90: 0x4f, 0xa91: 0x50, 0xa92: 0x51, 0xa93: 0x52, 0xa94: 0x53, 0xa95: 0x54, 0xa96: 0x55, 0xa97: 0x56, - 0xa98: 0x57, 0xa99: 0x58, 0xa9a: 0x59, 0xa9b: 0x5a, 0xa9c: 0x5b, 0xa9d: 0x5c, 0xa9e: 0x5d, 0xa9f: 0x5e, - 0xaa0: 0x5f, 0xaa1: 0x60, 0xaa2: 0x61, 0xaa3: 0x62, 0xaa4: 0x63, 0xaa5: 0x64, 0xaa6: 0x65, 0xaa7: 0x66, - 0xaa8: 0x67, 0xaa9: 0x68, 0xaaa: 0x69, 0xaac: 0x6a, 0xaad: 0x6b, 0xaae: 0x6c, 0xaaf: 0x6d, - 0xab0: 0x6e, 0xab1: 0x6f, 0xab3: 0x70, 0xab4: 0x71, 0xab5: 0x72, 0xab6: 0x73, 0xab7: 0x74, - 0xab8: 0x75, 0xab9: 0x1f5, 0xaba: 0x77, 0xabb: 0x78, 0xabc: 0x79, 0xabd: 0x7a, 0xabe: 0x7b, 0xabf: 0x7c, - // Block 0x2b, offset 0xac0 - 0xac2: 0x01, 0xac3: 0x1f2, 0xac4: 0x03, 0xac5: 0x04, 0xac6: 0x05, 0xac7: 0x1f3, - 0xac8: 0x1f4, 0xac9: 0x08, 0xaca: 0x09, 0xacb: 0x0a, 0xacc: 0x0b, 0xacd: 0x0c, 0xace: 0x0d, 0xacf: 0x0e, - 0xad0: 0x0f, 0xad1: 0x10, 0xad2: 0x11, 0xad3: 0x12, 0xad4: 0x13, 0xad5: 0x14, 0xad6: 0x15, 0xad7: 0x1b4, - 0xad8: 0x1b5, 0xad9: 0x1b6, 0xada: 0x19, 0xadb: 0x1b7, 0xadc: 0x1b, 0xadd: 0x1c, 0xade: 0x1d, 0xadf: 0x1e, - 0xae0: 0x17, 0xae1: 0x28, 0xae2: 0x19, 0xae3: 0x04, 0xae4: 0x05, - 0xaea: 0x06, 0xaed: 0x07, 0xaef: 0x1a, - 0xaf0: 0x13, 0xaf3: 0x15, - // Block 0x2c, offset 0xb00 - 0xb02: 0x01, 0xb03: 0x1f8, 0xb04: 0x03, 0xb05: 0x04, 0xb06: 0x05, 0xb07: 0x06, - 0xb08: 0x07, 0xb09: 0x08, 0xb0a: 0x09, 0xb0b: 0x0a, 0xb0c: 0x0b, 0xb0d: 0x0c, 0xb0e: 0x0d, 0xb0f: 0x0e, - 0xb10: 0x0f, 0xb11: 0x10, 0xb12: 0x11, 0xb13: 0x12, 0xb14: 0x13, 0xb15: 0x14, 0xb16: 0x15, 0xb17: 0x1b4, - 0xb18: 0x1b5, 0xb19: 0x1b6, 0xb1a: 0x19, 0xb1b: 0x1b7, 0xb1c: 0x1b, 0xb1d: 0x1c, 0xb1e: 0x1d, 0xb1f: 0x1e, - 0xb20: 0x17, 0xb21: 0x18, 0xb22: 0x19, 0xb23: 0x04, 0xb24: 0x05, - 0xb2a: 0x06, 0xb2d: 0x07, 0xb2f: 0x1a, - 0xb30: 0x13, 0xb33: 0x15, - // Block 0x2d, offset 0xb40 - 0xb40: 0x3f, 0xb41: 0x40, 0xb42: 0x41, 0xb43: 0x42, 0xb44: 0x1b9, 0xb45: 0x1ba, 0xb46: 0x1bb, 0xb47: 0x1bc, - 0xb48: 0x47, 0xb49: 0x48, 0xb4a: 0x49, 0xb4b: 0x4a, 0xb4c: 0x4b, 0xb4d: 0x4c, 0xb4e: 0x4d, 0xb4f: 0x4e, - 0xb50: 0x4f, 0xb51: 0x50, 0xb52: 0x51, 0xb53: 0x52, 0xb54: 0x53, 0xb55: 0x54, 0xb56: 0x55, 0xb57: 0x56, - 0xb58: 0x57, 0xb59: 0x58, 0xb5a: 0x59, 0xb5b: 0x5a, 0xb5c: 0x5b, 0xb5d: 0x5c, 0xb5e: 0x5d, 0xb5f: 0x5e, - 0xb60: 0x5f, 0xb61: 0x60, 0xb62: 0x61, 0xb63: 0x62, 0xb64: 0x63, 0xb65: 0x64, 0xb66: 0x65, 0xb67: 0x66, - 0xb68: 0x67, 0xb69: 0x68, 0xb6a: 0x69, 0xb6c: 0x6a, 0xb6d: 0x6b, 0xb6e: 0x6c, 0xb6f: 0x6d, - 0xb70: 0x6e, 0xb71: 0x6f, 0xb73: 0x70, 0xb74: 0x71, 0xb75: 0x72, 0xb76: 0x1ed, 0xb77: 0x74, - 0xb78: 0x75, 0xb79: 0x200, 0xb7a: 0x201, 0xb7b: 0x202, 0xb7c: 0x79, 0xb7d: 0x7a, 0xb7e: 0x7b, 0xb7f: 0x7c, - // Block 0x2e, offset 0xb80 - 0xb80: 0x7d, 0xb81: 0x7e, 0xb82: 0x7f, 0xb83: 0x80, 0xb84: 0x203, 0xb85: 0x82, 0xb86: 0x83, 0xb87: 0x84, - 0xb88: 0x85, 0xb89: 0x1bd, 0xb8a: 0x87, 0xb8b: 0x88, 0xb8c: 0x89, 0xb8d: 0x8a, 0xb8e: 0x8b, 0xb8f: 0x8c, - 0xb90: 0x8d, 0xb91: 0x8e, 0xb92: 0x204, 0xb93: 0x90, 0xb94: 0x91, 0xb95: 0x92, 0xb96: 0x93, 0xb97: 0x94, - 0xb98: 0x95, 0xb99: 0x96, 0xb9a: 0x97, 0xb9b: 0x98, 0xb9c: 0x99, 0xb9d: 0x9a, 0xb9e: 0x9b, 0xb9f: 0x9c, - 0xba0: 0x9d, 0xba1: 0x9e, 0xba2: 0x9f, 0xba3: 0xa0, 0xba4: 0xa1, 0xba5: 0xa2, 0xba6: 0xa3, 0xba7: 0xa4, - 0xba8: 0xa5, 0xba9: 0xa6, 0xbaa: 0xa7, 0xbab: 0xa8, 0xbac: 0xa9, 0xbad: 0xaa, - 0xbb0: 0xab, 0xbb1: 0xac, 0xbb2: 0xad, 0xbb3: 0xae, 0xbb4: 0xaf, 0xbb5: 0xb0, 0xbb6: 0xb1, 0xbb7: 0xb2, - 0xbb8: 0xb3, 0xbba: 0xb4, 0xbbb: 0xb5, 0xbbc: 0xb6, 0xbbd: 0xb7, 0xbbe: 0xb8, 0xbbf: 0xb9, - // Block 0x2f, offset 0xbc0 - 0xbc0: 0xba, 0xbc1: 0xbb, 0xbc2: 0xbc, 0xbc3: 0xbd, 0xbc4: 0xbe, 0xbc5: 0xbf, 0xbc6: 0xc0, 0xbc7: 0xc1, - 0xbc8: 0xc2, 0xbc9: 0xc3, 0xbca: 0xc4, 0xbcb: 0xc5, 0xbcc: 0xc6, 0xbcd: 0xc7, 0xbce: 0x205, 0xbcf: 0x206, - // Block 0x30, offset 0xc00 - 0xc00: 0x18b, 0xc01: 0x18c, 0xc02: 0x18d, 0xc03: 0x18e, 0xc04: 0x207, 0xc05: 0x208, 0xc06: 0x191, 0xc07: 0x192, - 0xc08: 0x193, 0xc09: 0x194, 0xc0c: 0x195, 0xc0d: 0x196, 0xc0e: 0x197, 0xc0f: 0x198, - 0xc10: 0x199, 0xc11: 0x19a, 0xc12: 0x19b, 0xc13: 0x19c, 0xc14: 0x19d, 0xc15: 0x19e, 0xc17: 0x19f, - 0xc18: 0x1a0, 0xc19: 0x1a1, 0xc1a: 0x1a2, 0xc1b: 0x1a3, 0xc1c: 0x1a4, 0xc1d: 0x1a5, - // Block 0x31, offset 0xc40 - 0xc50: 0x09, 0xc51: 0x0a, 0xc52: 0x0b, 0xc53: 0x0c, 0xc56: 0x0d, - 0xc5b: 0x0e, 0xc5d: 0x0f, 0xc5e: 0x10, 0xc5f: 0x2e, - 0xc6f: 0x12, - // Block 0x32, offset 0xc80 - 0xc82: 0x01, 0xc83: 0x1fb, 0xc84: 0x1fc, 0xc85: 0x1fd, 0xc86: 0x05, 0xc87: 0x1fe, - 0xc88: 0x1ff, 0xc89: 0x08, 0xc8a: 0x09, 0xc8b: 0x0a, 0xc8c: 0x0b, 0xc8d: 0x0c, 0xc8e: 0x0d, 0xc8f: 0x0e, - 0xc90: 0x0f, 0xc91: 0x10, 0xc92: 0x11, 0xc93: 0x12, 0xc94: 0x13, 0xc95: 0x14, 0xc96: 0x15, 0xc97: 0x1b4, - 0xc98: 0x1b5, 0xc99: 0x1b6, 0xc9a: 0x19, 0xc9b: 0x1b7, 0xc9c: 0x1b, 0xc9d: 0x1c, 0xc9e: 0x1d, 0xc9f: 0x1e, - 0xca0: 0x17, 0xca1: 0x2b, 0xca2: 0x2c, 0xca3: 0x2d, 0xca4: 0x05, - 0xcaa: 0x06, 0xcad: 0x07, 0xcaf: 0x1a, - 0xcb0: 0x2f, 0xcb3: 0x15, - // Block 0x33, offset 0xcc0 - 0xce0: 0x1f, 0xce1: 0x20, 0xce2: 0x21, 0xce3: 0x22, 0xce4: 0x23, 0xce5: 0x24, 0xce6: 0x25, 0xce7: 0x26, - 0xce8: 0x27, 0xce9: 0x28, 0xcea: 0x29, 0xceb: 0x2a, 0xcec: 0x2b, 0xced: 0x2c, 0xcee: 0x2d, 0xcef: 0x2e, - 0xcf0: 0x2f, 0xcf1: 0x30, 0xcf2: 0x31, 0xcf3: 0x32, 0xcf4: 0x33, 0xcf5: 0x34, 0xcf6: 0x35, 0xcf7: 0x36, - 0xcf8: 0x20d, 0xcf9: 0x38, 0xcfa: 0x39, 0xcfb: 0x3a, 0xcfc: 0x3b, 0xcfd: 0x3c, 0xcfe: 0x3d, 0xcff: 0x3e, - // Block 0x34, offset 0xd00 - 0xd02: 0x01, 0xd03: 0x02, 0xd04: 0x03, 0xd05: 0x04, 0xd06: 0x05, 0xd07: 0x06, - 0xd08: 0x07, 0xd09: 0x08, 0xd0a: 0x09, 0xd0b: 0x0a, 0xd0c: 0x0b, 0xd0d: 0x0c, 0xd0e: 0x0d, 0xd0f: 0x0e, - 0xd10: 0x0f, 0xd11: 0x10, 0xd12: 0x11, 0xd13: 0x12, 0xd14: 0x13, 0xd15: 0x14, 0xd16: 0x15, 0xd17: 0x20b, - 0xd18: 0x1b5, 0xd19: 0x20c, 0xd1a: 0x19, 0xd1b: 0x1b7, 0xd1c: 0x1b, 0xd1d: 0x1c, 0xd1e: 0x1d, 0xd1f: 0x1e, - 0xd20: 0x31, 0xd21: 0x18, 0xd22: 0x19, 0xd23: 0x04, 0xd24: 0x05, - 0xd2a: 0x06, 0xd2d: 0x07, 0xd2f: 0x1a, - 0xd30: 0x13, 0xd33: 0x15, - // Block 0x35, offset 0xd40 - 0xd40: 0x3f, 0xd41: 0x40, 0xd42: 0x41, 0xd43: 0x42, 0xd44: 0x1b9, 0xd45: 0x1ba, 0xd46: 0x1bb, 0xd47: 0x1bc, - 0xd48: 0x47, 0xd49: 0x48, 0xd4a: 0x49, 0xd4b: 0x4a, 0xd4c: 0x4b, 0xd4d: 0x4c, 0xd4e: 0x4d, 0xd4f: 0x4e, - 0xd50: 0x4f, 0xd51: 0x50, 0xd52: 0x51, 0xd53: 0x52, 0xd54: 0x53, 0xd55: 0x54, 0xd56: 0x55, 0xd57: 0x56, - 0xd58: 0x57, 0xd59: 0x58, 0xd5a: 0x59, 0xd5b: 0x5a, 0xd5c: 0x5b, 0xd5d: 0x5c, 0xd5e: 0x5d, 0xd5f: 0x5e, - 0xd60: 0x5f, 0xd61: 0x60, 0xd62: 0x61, 0xd63: 0x62, 0xd64: 0x63, 0xd65: 0x64, 0xd66: 0x65, 0xd67: 0x66, - 0xd68: 0x67, 0xd69: 0x68, 0xd6a: 0x69, 0xd6c: 0x6a, 0xd6d: 0x6b, 0xd6e: 0x6c, 0xd6f: 0x6d, - 0xd70: 0x6e, 0xd71: 0x6f, 0xd73: 0x70, 0xd74: 0x71, 0xd75: 0x72, 0xd76: 0x73, 0xd77: 0x74, - 0xd78: 0x213, 0xd79: 0x214, 0xd7a: 0x77, 0xd7b: 0x78, 0xd7c: 0x79, 0xd7d: 0x7a, 0xd7e: 0x7b, 0xd7f: 0x7c, - // Block 0x36, offset 0xd80 - 0xd82: 0x01, 0xd83: 0x02, 0xd84: 0x210, 0xd85: 0x211, 0xd86: 0x05, 0xd87: 0x212, - 0xd88: 0x07, 0xd89: 0x08, 0xd8a: 0x09, 0xd8b: 0x0a, 0xd8c: 0x0b, 0xd8d: 0x0c, 0xd8e: 0x0d, 0xd8f: 0x0e, - 0xd90: 0x0f, 0xd91: 0x10, 0xd92: 0x11, 0xd93: 0x12, 0xd94: 0x13, 0xd95: 0x14, 0xd96: 0x15, 0xd97: 0x1b4, - 0xd98: 0x1b5, 0xd99: 0x1b6, 0xd9a: 0x19, 0xd9b: 0x1b7, 0xd9c: 0x1b, 0xd9d: 0x1c, 0xd9e: 0x1d, 0xd9f: 0x1e, - 0xda0: 0x17, 0xda1: 0x33, 0xda2: 0x19, 0xda3: 0x04, 0xda4: 0x05, - 0xdaa: 0x06, 0xdad: 0x07, 0xdaf: 0x1a, - 0xdb0: 0x13, 0xdb3: 0x15, - // Block 0x37, offset 0xdc0 - 0xdc0: 0x3f, 0xdc1: 0x40, 0xdc2: 0x41, 0xdc3: 0x42, 0xdc4: 0x1b9, 0xdc5: 0x1ba, 0xdc6: 0x1bb, 0xdc7: 0x1bc, - 0xdc8: 0x47, 0xdc9: 0x48, 0xdca: 0x49, 0xdcb: 0x4a, 0xdcc: 0x4b, 0xdcd: 0x4c, 0xdce: 0x4d, 0xdcf: 0x4e, - 0xdd0: 0x4f, 0xdd1: 0x50, 0xdd2: 0x51, 0xdd3: 0x52, 0xdd4: 0x53, 0xdd5: 0x54, 0xdd6: 0x55, 0xdd7: 0x56, - 0xdd8: 0x57, 0xdd9: 0x58, 0xdda: 0x59, 0xddb: 0x5a, 0xddc: 0x5b, 0xddd: 0x5c, 0xdde: 0x5d, 0xddf: 0x5e, - 0xde0: 0x5f, 0xde1: 0x60, 0xde2: 0x61, 0xde3: 0x62, 0xde4: 0x63, 0xde5: 0x64, 0xde6: 0x65, 0xde7: 0x66, - 0xde8: 0x67, 0xde9: 0x68, 0xdea: 0x69, 0xdec: 0x6a, 0xded: 0x6b, 0xdee: 0x6c, 0xdef: 0x6d, - 0xdf0: 0x6e, 0xdf1: 0x6f, 0xdf3: 0x70, 0xdf4: 0x71, 0xdf5: 0x72, 0xdf6: 0x1ed, 0xdf7: 0x74, - 0xdf8: 0x21b, 0xdf9: 0x21c, 0xdfa: 0x21d, 0xdfb: 0x21e, 0xdfc: 0x79, 0xdfd: 0x7a, 0xdfe: 0x7b, 0xdff: 0x7c, - // Block 0x38, offset 0xe00 - 0xe02: 0x01, 0xe03: 0x217, 0xe04: 0x218, 0xe05: 0x04, 0xe06: 0x05, 0xe07: 0x219, - 0xe08: 0x21a, 0xe09: 0x08, 0xe0a: 0x09, 0xe0b: 0x0a, 0xe0c: 0x0b, 0xe0d: 0x0c, 0xe0e: 0x0d, 0xe0f: 0x0e, - 0xe10: 0x0f, 0xe11: 0x10, 0xe12: 0x11, 0xe13: 0x12, 0xe14: 0x13, 0xe15: 0x14, 0xe16: 0x15, 0xe17: 0x1b4, - 0xe18: 0x1b5, 0xe19: 0x1b6, 0xe1a: 0x19, 0xe1b: 0x1b7, 0xe1c: 0x1b, 0xe1d: 0x1c, 0xe1e: 0x1d, 0xe1f: 0x1e, - 0xe20: 0x17, 0xe21: 0x35, 0xe22: 0x26, 0xe23: 0x04, 0xe24: 0x05, - 0xe2a: 0x06, 0xe2d: 0x07, 0xe2f: 0x1a, - 0xe30: 0x13, 0xe33: 0x15, - // Block 0x39, offset 0xe40 - 0xe42: 0x01, 0xe43: 0x1e8, 0xe44: 0x221, 0xe45: 0x1ea, 0xe46: 0x05, 0xe47: 0x1eb, - 0xe48: 0x1ec, 0xe49: 0x08, 0xe4a: 0x09, 0xe4b: 0x0a, 0xe4c: 0x0b, 0xe4d: 0x0c, 0xe4e: 0x0d, 0xe4f: 0x0e, - 0xe50: 0x0f, 0xe51: 0x10, 0xe52: 0x11, 0xe53: 0x12, 0xe54: 0x13, 0xe55: 0x14, 0xe56: 0x15, 0xe57: 0x1b4, - 0xe58: 0x1b5, 0xe59: 0x1b6, 0xe5a: 0x19, 0xe5b: 0x1b7, 0xe5c: 0x1b, 0xe5d: 0x1c, 0xe5e: 0x1d, 0xe5f: 0x1e, - 0xe60: 0x17, 0xe61: 0x25, 0xe62: 0x26, 0xe63: 0x04, 0xe64: 0x05, - 0xe6a: 0x06, 0xe6d: 0x07, 0xe6f: 0x1a, - 0xe70: 0x13, 0xe73: 0x15, - // Block 0x3a, offset 0xe80 - 0xe80: 0x3f, 0xe81: 0x40, 0xe82: 0x41, 0xe83: 0x42, 0xe84: 0x222, 0xe85: 0x223, 0xe86: 0x224, 0xe87: 0x225, - 0xe88: 0x47, 0xe89: 0x48, 0xe8a: 0x49, 0xe8b: 0x4a, 0xe8c: 0x4b, 0xe8d: 0x4c, 0xe8e: 0x4d, 0xe8f: 0x4e, - 0xe90: 0x4f, 0xe91: 0x50, 0xe92: 0x51, 0xe93: 0x52, 0xe94: 0x53, 0xe95: 0x54, 0xe96: 0x55, 0xe97: 0x56, - 0xe98: 0x57, 0xe99: 0x58, 0xe9a: 0x59, 0xe9b: 0x5a, 0xe9c: 0x5b, 0xe9d: 0x5c, 0xe9e: 0x5d, 0xe9f: 0x5e, - 0xea0: 0x5f, 0xea1: 0x60, 0xea2: 0x61, 0xea3: 0x62, 0xea4: 0x63, 0xea5: 0x64, 0xea6: 0x65, 0xea7: 0x66, - 0xea8: 0x67, 0xea9: 0x68, 0xeaa: 0x69, 0xeac: 0x6a, 0xead: 0x6b, 0xeae: 0x6c, 0xeaf: 0x6d, - 0xeb0: 0x6e, 0xeb1: 0x6f, 0xeb3: 0x70, 0xeb4: 0x71, 0xeb5: 0x72, 0xeb6: 0x73, 0xeb7: 0x74, - 0xeb8: 0x75, 0xeb9: 0x76, 0xeba: 0x77, 0xebb: 0x78, 0xebc: 0x79, 0xebd: 0x7a, 0xebe: 0x7b, 0xebf: 0x7c, - // Block 0x3b, offset 0xec0 - 0xec2: 0x01, 0xec3: 0x02, 0xec4: 0x03, 0xec5: 0x04, 0xec6: 0x05, 0xec7: 0x06, - 0xec8: 0x07, 0xec9: 0x08, 0xeca: 0x09, 0xecb: 0x0a, 0xecc: 0x0b, 0xecd: 0x0c, 0xece: 0x0d, 0xecf: 0x0e, - 0xed0: 0x0f, 0xed1: 0x10, 0xed2: 0x11, 0xed3: 0x12, 0xed4: 0x13, 0xed5: 0x14, 0xed6: 0x15, 0xed7: 0x1b4, - 0xed8: 0x1b5, 0xed9: 0x1b6, 0xeda: 0x19, 0xedb: 0x1b7, 0xedc: 0x1b, 0xedd: 0x1c, 0xede: 0x1d, 0xedf: 0x1e, - 0xee0: 0x17, 0xee1: 0x38, 0xee2: 0x19, 0xee3: 0x04, 0xee4: 0x05, - 0xeea: 0x06, 0xeed: 0x07, 0xeef: 0x1a, - 0xef0: 0x13, 0xef3: 0x15, - // Block 0x3c, offset 0xf00 - 0xf00: 0x3f, 0xf01: 0x40, 0xf02: 0x41, 0xf03: 0x42, 0xf04: 0x226, 0xf05: 0x227, 0xf06: 0x228, 0xf07: 0x229, - 0xf08: 0x47, 0xf09: 0x48, 0xf0a: 0x49, 0xf0b: 0x4a, 0xf0c: 0x4b, 0xf0d: 0x4c, 0xf0e: 0x4d, 0xf0f: 0x4e, - 0xf10: 0x4f, 0xf11: 0x50, 0xf12: 0x51, 0xf13: 0x52, 0xf14: 0x53, 0xf15: 0x54, 0xf16: 0x55, 0xf17: 0x56, - 0xf18: 0x57, 0xf19: 0x58, 0xf1a: 0x59, 0xf1b: 0x5a, 0xf1c: 0x5b, 0xf1d: 0x5c, 0xf1e: 0x5d, 0xf1f: 0x5e, - 0xf20: 0x5f, 0xf21: 0x60, 0xf22: 0x61, 0xf23: 0x62, 0xf24: 0x63, 0xf25: 0x64, 0xf26: 0x65, 0xf27: 0x66, - 0xf28: 0x67, 0xf29: 0x68, 0xf2a: 0x69, 0xf2c: 0x6a, 0xf2d: 0x6b, 0xf2e: 0x6c, 0xf2f: 0x6d, - 0xf30: 0x6e, 0xf31: 0x6f, 0xf33: 0x70, 0xf34: 0x71, 0xf35: 0x72, 0xf36: 0x73, 0xf37: 0x74, - 0xf38: 0x75, 0xf39: 0x76, 0xf3a: 0x77, 0xf3b: 0x78, 0xf3c: 0x79, 0xf3d: 0x7a, 0xf3e: 0x7b, 0xf3f: 0x7c, - // Block 0x3d, offset 0xf40 - 0xf40: 0xba, 0xf41: 0xbb, 0xf42: 0xbc, 0xf43: 0xbd, 0xf44: 0x22a, 0xf45: 0x22b, 0xf46: 0xc0, 0xf47: 0xc1, - 0xf48: 0xc2, 0xf49: 0x22c, 0xf4a: 0xc4, 0xf4b: 0xc5, 0xf4c: 0xc6, 0xf4d: 0xc7, 0xf4e: 0xc8, 0xf4f: 0xc9, - // Block 0x3e, offset 0xf80 - 0xf82: 0x01, 0xf83: 0x02, 0xf84: 0x03, 0xf85: 0x04, 0xf86: 0x05, 0xf87: 0x06, - 0xf88: 0x07, 0xf89: 0x08, 0xf8a: 0x09, 0xf8b: 0x0a, 0xf8c: 0x0b, 0xf8d: 0x0c, 0xf8e: 0x0d, 0xf8f: 0x0e, - 0xf90: 0x0f, 0xf91: 0x10, 0xf92: 0x11, 0xf93: 0x12, 0xf94: 0x13, 0xf95: 0x14, 0xf96: 0x15, 0xf97: 0x1b4, - 0xf98: 0x1b5, 0xf99: 0x1b6, 0xf9a: 0x19, 0xf9b: 0x1b7, 0xf9c: 0x1b, 0xf9d: 0x1c, 0xf9e: 0x1d, 0xf9f: 0x1e, - 0xfa0: 0x17, 0xfa1: 0x3a, 0xfa2: 0x03, 0xfa3: 0x3b, 0xfa4: 0x05, - 0xfaa: 0x06, 0xfad: 0x07, 0xfaf: 0x1a, - 0xfb0: 0x13, 0xfb3: 0x15, - // Block 0x3f, offset 0xfc0 - 0xfc0: 0x3f, 0xfc1: 0x40, 0xfc2: 0x41, 0xfc3: 0x42, 0xfc4: 0x1b9, 0xfc5: 0x1ba, 0xfc6: 0x1bb, 0xfc7: 0x1bc, - 0xfc8: 0x47, 0xfc9: 0x48, 0xfca: 0x49, 0xfcb: 0x4a, 0xfcc: 0x4b, 0xfcd: 0x4c, 0xfce: 0x4d, 0xfcf: 0x4e, - 0xfd0: 0x4f, 0xfd1: 0x50, 0xfd2: 0x51, 0xfd3: 0x52, 0xfd4: 0x53, 0xfd5: 0x54, 0xfd6: 0x55, 0xfd7: 0x56, - 0xfd8: 0x57, 0xfd9: 0x58, 0xfda: 0x59, 0xfdb: 0x5a, 0xfdc: 0x5b, 0xfdd: 0x5c, 0xfde: 0x5d, 0xfdf: 0x5e, - 0xfe0: 0x5f, 0xfe1: 0x60, 0xfe2: 0x61, 0xfe3: 0x62, 0xfe4: 0x63, 0xfe5: 0x64, 0xfe6: 0x65, 0xfe7: 0x66, - 0xfe8: 0x67, 0xfe9: 0x68, 0xfea: 0x69, 0xfec: 0x6a, 0xfed: 0x6b, 0xfee: 0x6c, 0xfef: 0x6d, - 0xff0: 0x6e, 0xff1: 0x6f, 0xff3: 0x70, 0xff4: 0x71, 0xff5: 0x72, 0xff6: 0x1ed, 0xff7: 0x74, - 0xff8: 0x75, 0xff9: 0x238, 0xffa: 0x239, 0xffb: 0x23a, 0xffc: 0x79, 0xffd: 0x7a, 0xffe: 0x7b, 0xfff: 0x7c, - // Block 0x40, offset 0x1000 - 0x1000: 0x7d, 0x1001: 0x7e, 0x1002: 0x7f, 0x1003: 0x80, 0x1004: 0x203, 0x1005: 0x82, 0x1006: 0x83, 0x1007: 0x84, - 0x1008: 0x85, 0x1009: 0x1bd, 0x100a: 0x87, 0x100b: 0x88, 0x100c: 0x89, 0x100d: 0x8a, 0x100e: 0x8b, 0x100f: 0x8c, - 0x1010: 0x8d, 0x1011: 0x8e, 0x1012: 0x8f, 0x1013: 0x90, 0x1014: 0x91, 0x1015: 0x92, 0x1016: 0x93, 0x1017: 0x94, - 0x1018: 0x95, 0x1019: 0x96, 0x101a: 0x97, 0x101b: 0x98, 0x101c: 0x99, 0x101d: 0x9a, 0x101e: 0x9b, 0x101f: 0x9c, - 0x1020: 0x9d, 0x1021: 0x9e, 0x1022: 0x9f, 0x1023: 0xa0, 0x1024: 0xa1, 0x1025: 0xa2, 0x1026: 0xa3, 0x1027: 0xa4, - 0x1028: 0xa5, 0x1029: 0xa6, 0x102a: 0xa7, 0x102b: 0xa8, 0x102c: 0xa9, 0x102d: 0xaa, - 0x1030: 0xab, 0x1031: 0xac, 0x1032: 0xad, 0x1033: 0xae, 0x1034: 0xaf, 0x1035: 0xb0, 0x1036: 0xb1, 0x1037: 0xb2, - 0x1038: 0xb3, 0x103a: 0xb4, 0x103b: 0xb5, 0x103c: 0xb6, 0x103d: 0xb7, 0x103e: 0xb8, 0x103f: 0xb9, - // Block 0x41, offset 0x1040 - 0x1042: 0x01, 0x1043: 0x231, 0x1044: 0x232, 0x1045: 0x233, 0x1046: 0x234, 0x1047: 0x235, - 0x1048: 0x236, 0x1049: 0x08, 0x104a: 0x237, 0x104b: 0x0a, 0x104c: 0x0b, 0x104d: 0x0c, 0x104e: 0x0d, 0x104f: 0x0e, - 0x1050: 0x0f, 0x1051: 0x10, 0x1052: 0x11, 0x1053: 0x12, 0x1054: 0x13, 0x1055: 0x14, 0x1056: 0x15, 0x1057: 0x1b4, - 0x1058: 0x1b5, 0x1059: 0x1b6, 0x105a: 0x19, 0x105b: 0x1b7, 0x105c: 0x1b, 0x105d: 0x1c, 0x105e: 0x1d, 0x105f: 0x1e, - 0x1060: 0x17, 0x1061: 0x3d, 0x1062: 0x3e, 0x1063: 0x04, 0x1064: 0x05, - 0x106a: 0x06, 0x106d: 0x07, 0x106f: 0x1a, - 0x1070: 0x13, 0x1073: 0x15, - // Block 0x42, offset 0x1080 - 0x1080: 0x3f, 0x1081: 0x40, 0x1082: 0x41, 0x1083: 0x42, 0x1084: 0x1b9, 0x1085: 0x1ba, 0x1086: 0x1bb, 0x1087: 0x1bc, - 0x1088: 0x47, 0x1089: 0x48, 0x108a: 0x49, 0x108b: 0x4a, 0x108c: 0x4b, 0x108d: 0x4c, 0x108e: 0x4d, 0x108f: 0x4e, - 0x1090: 0x4f, 0x1091: 0x50, 0x1092: 0x51, 0x1093: 0x52, 0x1094: 0x53, 0x1095: 0x54, 0x1096: 0x55, 0x1097: 0x56, - 0x1098: 0x57, 0x1099: 0x58, 0x109a: 0x59, 0x109b: 0x5a, 0x109c: 0x5b, 0x109d: 0x5c, 0x109e: 0x5d, 0x109f: 0x5e, - 0x10a0: 0x5f, 0x10a1: 0x60, 0x10a2: 0x61, 0x10a3: 0x62, 0x10a4: 0x63, 0x10a5: 0x64, 0x10a6: 0x65, 0x10a7: 0x66, - 0x10a8: 0x67, 0x10a9: 0x68, 0x10aa: 0x69, 0x10ac: 0x6a, 0x10ad: 0x6b, 0x10ae: 0x6c, 0x10af: 0x6d, - 0x10b0: 0x6e, 0x10b1: 0x6f, 0x10b3: 0x70, 0x10b4: 0x71, 0x10b5: 0x72, 0x10b6: 0x73, 0x10b7: 0x74, - 0x10b8: 0x1e2, 0x10b9: 0x1e3, 0x10ba: 0x1e4, 0x10bb: 0x241, 0x10bc: 0x79, 0x10bd: 0x7a, 0x10be: 0x7b, 0x10bf: 0x7c, - // Block 0x43, offset 0x10c0 - 0x10c2: 0x01, 0x10c3: 0x23d, 0x10c4: 0x23e, 0x10c5: 0x23f, 0x10c6: 0x05, 0x10c7: 0x240, - 0x10c8: 0x07, 0x10c9: 0x08, 0x10ca: 0x09, 0x10cb: 0x0a, 0x10cc: 0x0b, 0x10cd: 0x0c, 0x10ce: 0x0d, 0x10cf: 0x0e, - 0x10d0: 0x0f, 0x10d1: 0x10, 0x10d2: 0x11, 0x10d3: 0x12, 0x10d4: 0x13, 0x10d5: 0x14, 0x10d6: 0x15, 0x10d7: 0x1b4, - 0x10d8: 0x1b5, 0x10d9: 0x1b6, 0x10da: 0x19, 0x10db: 0x1b7, 0x10dc: 0x1b, 0x10dd: 0x1c, 0x10de: 0x1d, 0x10df: 0x1e, - 0x10e0: 0x17, 0x10e1: 0x40, 0x10e2: 0x19, 0x10e3: 0x04, 0x10e4: 0x05, - 0x10ea: 0x06, 0x10ed: 0x07, 0x10ef: 0x1a, - 0x10f0: 0x13, 0x10f3: 0x15, - // Block 0x44, offset 0x1100 - 0x1100: 0x3f, 0x1101: 0x40, 0x1102: 0x41, 0x1103: 0x42, 0x1104: 0x1b9, 0x1105: 0x1ba, 0x1106: 0x1bb, 0x1107: 0x1bc, - 0x1108: 0x47, 0x1109: 0x48, 0x110a: 0x49, 0x110b: 0x4a, 0x110c: 0x4b, 0x110d: 0x4c, 0x110e: 0x4d, 0x110f: 0x4e, - 0x1110: 0x4f, 0x1111: 0x50, 0x1112: 0x51, 0x1113: 0x52, 0x1114: 0x53, 0x1115: 0x54, 0x1116: 0x55, 0x1117: 0x56, - 0x1118: 0x57, 0x1119: 0x58, 0x111a: 0x59, 0x111b: 0x5a, 0x111c: 0x5b, 0x111d: 0x5c, 0x111e: 0x5d, 0x111f: 0x5e, - 0x1120: 0x5f, 0x1121: 0x60, 0x1122: 0x61, 0x1123: 0x62, 0x1124: 0x63, 0x1125: 0x64, 0x1126: 0x65, 0x1127: 0x66, - 0x1128: 0x67, 0x1129: 0x68, 0x112a: 0x69, 0x112c: 0x6a, 0x112d: 0x6b, 0x112e: 0x6c, 0x112f: 0x6d, - 0x1130: 0x6e, 0x1131: 0x6f, 0x1133: 0x70, 0x1134: 0x71, 0x1135: 0x72, 0x1136: 0x1ed, 0x1137: 0x74, - 0x1138: 0x75, 0x1139: 0x248, 0x113a: 0x201, 0x113b: 0x249, 0x113c: 0x79, 0x113d: 0x7a, 0x113e: 0x7b, 0x113f: 0x7c, - // Block 0x45, offset 0x1140 - 0x1142: 0x01, 0x1143: 0x244, 0x1144: 0x245, 0x1145: 0x246, 0x1146: 0x05, 0x1147: 0x1fe, - 0x1148: 0x247, 0x1149: 0x08, 0x114a: 0x09, 0x114b: 0x0a, 0x114c: 0x0b, 0x114d: 0x0c, 0x114e: 0x0d, 0x114f: 0x0e, - 0x1150: 0x0f, 0x1151: 0x10, 0x1152: 0x11, 0x1153: 0x12, 0x1154: 0x13, 0x1155: 0x14, 0x1156: 0x15, 0x1157: 0x1b4, - 0x1158: 0x1b5, 0x1159: 0x1b6, 0x115a: 0x19, 0x115b: 0x1b7, 0x115c: 0x1b, 0x115d: 0x1c, 0x115e: 0x1d, 0x115f: 0x1e, - 0x1160: 0x17, 0x1161: 0x42, 0x1162: 0x2c, 0x1163: 0x2d, 0x1164: 0x05, - 0x116a: 0x06, 0x116d: 0x07, 0x116f: 0x1a, - 0x1170: 0x2f, 0x1173: 0x15, - // Block 0x46, offset 0x1180 - 0x1180: 0x3f, 0x1181: 0x40, 0x1182: 0x41, 0x1183: 0x42, 0x1184: 0x1b9, 0x1185: 0x1ba, 0x1186: 0x1bb, 0x1187: 0x1bc, - 0x1188: 0x47, 0x1189: 0x48, 0x118a: 0x49, 0x118b: 0x4a, 0x118c: 0x4b, 0x118d: 0x4c, 0x118e: 0x4d, 0x118f: 0x4e, - 0x1190: 0x4f, 0x1191: 0x50, 0x1192: 0x51, 0x1193: 0x52, 0x1194: 0x53, 0x1195: 0x54, 0x1196: 0x55, 0x1197: 0x56, - 0x1198: 0x57, 0x1199: 0x58, 0x119a: 0x59, 0x119b: 0x5a, 0x119c: 0x5b, 0x119d: 0x5c, 0x119e: 0x5d, 0x119f: 0x5e, - 0x11a0: 0x5f, 0x11a1: 0x60, 0x11a2: 0x61, 0x11a3: 0x62, 0x11a4: 0x63, 0x11a5: 0x64, 0x11a6: 0x65, 0x11a7: 0x66, - 0x11a8: 0x67, 0x11a9: 0x68, 0x11aa: 0x69, 0x11ac: 0x6a, 0x11ad: 0x6b, 0x11ae: 0x6c, 0x11af: 0x6d, - 0x11b0: 0x6e, 0x11b1: 0x6f, 0x11b3: 0x70, 0x11b4: 0x71, 0x11b5: 0x72, 0x11b6: 0x73, 0x11b7: 0x74, - 0x11b8: 0x1cf, 0x11b9: 0x1d0, 0x11ba: 0x77, 0x11bb: 0x1d2, 0x11bc: 0x79, 0x11bd: 0x7a, 0x11be: 0x7b, 0x11bf: 0x7c, - // Block 0x47, offset 0x11c0 - 0x11c0: 0x7d, 0x11c1: 0x7e, 0x11c2: 0x7f, 0x11c3: 0x80, 0x11c4: 0x81, 0x11c5: 0x24c, 0x11c6: 0x83, 0x11c7: 0x84, - 0x11c8: 0x85, 0x11c9: 0x1bd, 0x11ca: 0x87, 0x11cb: 0x88, 0x11cc: 0x89, 0x11cd: 0x8a, 0x11ce: 0x8b, 0x11cf: 0x8c, - 0x11d0: 0x8d, 0x11d1: 0x8e, 0x11d2: 0x8f, 0x11d3: 0x90, 0x11d4: 0x91, 0x11d5: 0x92, 0x11d6: 0x93, 0x11d7: 0x94, - 0x11d8: 0x95, 0x11d9: 0x96, 0x11da: 0x97, 0x11db: 0x98, 0x11dc: 0x99, 0x11dd: 0x9a, 0x11de: 0x9b, 0x11df: 0x9c, - 0x11e0: 0x9d, 0x11e1: 0x9e, 0x11e2: 0x9f, 0x11e3: 0xa0, 0x11e4: 0xa1, 0x11e5: 0xa2, 0x11e6: 0xa3, 0x11e7: 0xa4, - 0x11e8: 0xa5, 0x11e9: 0xa6, 0x11ea: 0xa7, 0x11eb: 0xa8, 0x11ec: 0xa9, 0x11ed: 0xaa, - 0x11f0: 0xab, 0x11f1: 0xac, 0x11f2: 0xad, 0x11f3: 0xae, 0x11f4: 0xaf, 0x11f5: 0xb0, 0x11f6: 0xb1, 0x11f7: 0xb2, - 0x11f8: 0xb3, 0x11fa: 0xb4, 0x11fb: 0xb5, 0x11fc: 0xb6, 0x11fd: 0xb7, 0x11fe: 0xb8, 0x11ff: 0xb9, - // Block 0x48, offset 0x1200 - 0x1200: 0xba, 0x1201: 0xbb, 0x1202: 0xbc, 0x1203: 0xbd, 0x1204: 0xbe, 0x1205: 0xbf, 0x1206: 0xc0, 0x1207: 0xc1, - 0x1208: 0xc2, 0x1209: 0xc3, 0x120a: 0xc4, 0x120b: 0xc5, 0x120c: 0xc6, 0x120d: 0x1d5, 0x120e: 0xc8, 0x120f: 0xc9, - // Block 0x49, offset 0x1240 - 0x1240: 0x18b, 0x1241: 0x18c, 0x1242: 0x18d, 0x1243: 0x18e, 0x1244: 0x24d, 0x1245: 0x190, 0x1246: 0x191, 0x1247: 0x192, - 0x1248: 0x193, 0x1249: 0x194, 0x124c: 0x195, 0x124d: 0x196, 0x124e: 0x197, 0x124f: 0x198, - 0x1250: 0x199, 0x1251: 0x19a, 0x1252: 0x19b, 0x1253: 0x19c, 0x1254: 0x19d, 0x1255: 0x19e, 0x1257: 0x19f, - 0x1258: 0x1a0, 0x1259: 0x1a1, 0x125a: 0x1a2, 0x125b: 0x1a3, 0x125c: 0x1a4, 0x125d: 0x1a5, - // Block 0x4a, offset 0x1280 - 0x1290: 0x09, 0x1291: 0x0a, 0x1292: 0x0b, 0x1293: 0x0c, 0x1296: 0x0d, - 0x129b: 0x0e, 0x129d: 0x0f, 0x129e: 0x10, 0x129f: 0x47, - 0x12af: 0x12, - // Block 0x4b, offset 0x12c0 - 0x12c2: 0x01, 0x12c3: 0x1c8, 0x12c4: 0x1c9, 0x12c5: 0x1ca, 0x12c6: 0x05, 0x12c7: 0x1cc, - 0x12c8: 0x1cd, 0x12c9: 0x08, 0x12ca: 0x09, 0x12cb: 0x0a, 0x12cc: 0x0b, 0x12cd: 0x0c, 0x12ce: 0x0d, 0x12cf: 0x0e, - 0x12d0: 0x0f, 0x12d1: 0x10, 0x12d2: 0x11, 0x12d3: 0x12, 0x12d4: 0x13, 0x12d5: 0x14, 0x12d6: 0x15, 0x12d7: 0x1b4, - 0x12d8: 0x1b5, 0x12d9: 0x1b6, 0x12da: 0x19, 0x12db: 0x1b7, 0x12dc: 0x1b, 0x12dd: 0x1c, 0x12de: 0x1d, 0x12df: 0x1e, - 0x12e0: 0x17, 0x12e1: 0x44, 0x12e2: 0x45, 0x12e3: 0x46, 0x12e4: 0x05, - 0x12ea: 0x06, 0x12ed: 0x07, 0x12ef: 0x1a, - 0x12f0: 0x48, 0x12f3: 0x15, -} - -// mainCTEntries: 248 entries, 992 bytes -var mainCTEntries = [248]struct{ L, H, N, I uint8 }{ - {0xCE, 0x1, 1, 255}, - {0xC2, 0x0, 1, 255}, - {0xB7, 0xB7, 0, 1}, - {0x87, 0x87, 0, 2}, - {0xCC, 0x0, 2, 255}, - {0x88, 0x88, 0, 2}, - {0x86, 0x86, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x88, 0x88, 0, 1}, - {0xCD, 0x1, 1, 255}, - {0xCC, 0x0, 1, 255}, - {0x81, 0x81, 0, 1}, - {0x81, 0x81, 0, 2}, - {0xCC, 0x0, 1, 255}, - {0x86, 0x86, 0, 1}, - {0xCC, 0x0, 3, 255}, - {0x8B, 0x8B, 0, 3}, - {0x88, 0x88, 0, 2}, - {0x86, 0x86, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x8F, 0x8F, 0, 1}, - {0xD9, 0x0, 1, 255}, - {0x93, 0x95, 0, 1}, - {0xD9, 0x0, 1, 255}, - {0x94, 0x94, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xA7, 0x1, 1, 255}, - {0xA6, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0x97, 0x97, 0, 2}, - {0xE0, 0x0, 2, 255}, - {0xAD, 0x1, 1, 255}, - {0xAC, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0x96, 0x97, 0, 2}, - {0xE0, 0x0, 1, 255}, - {0xAF, 0x0, 1, 255}, - {0x97, 0x97, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xAF, 0x1, 1, 255}, - {0xAE, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0x97, 0x97, 0, 2}, - {0xE0, 0x0, 1, 255}, - {0xAE, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB1, 0x0, 1, 255}, - {0x96, 0x96, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB3, 0x0, 1, 255}, - {0x95, 0x95, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB3, 0x0, 2, 255}, - {0x95, 0x96, 0, 3}, - {0x82, 0x0, 1, 2}, - {0xE0, 0x0, 1, 255}, - {0xB3, 0x0, 1, 255}, - {0x95, 0x95, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xB5, 0x1, 1, 255}, - {0xB4, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0x97, 0x97, 0, 2}, - {0xE0, 0x0, 1, 255}, - {0xB4, 0x0, 1, 255}, - {0xBE, 0xBE, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB7, 0x0, 3, 255}, - {0x9F, 0x9F, 0, 4}, - {0x8F, 0x0, 1, 3}, - {0x8A, 0x8A, 0, 2}, - {0xE0, 0x0, 1, 255}, - {0xB7, 0x0, 1, 255}, - {0x8A, 0x8A, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB7, 0x0, 1, 255}, - {0x8A, 0x8A, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB8, 0x0, 1, 255}, - {0x81, 0xAE, 0, 1}, - {0xE0, 0x0, 1, 255}, - {0xB8, 0x0, 1, 255}, - {0xB2, 0xB2, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xBB, 0xC, 1, 255}, - {0xBA, 0x0, 12, 255}, - {0xAD, 0xAE, 0, 26}, - {0xAA, 0xAB, 0, 24}, - {0xA7, 0xA7, 0, 23}, - {0xA5, 0xA5, 0, 22}, - {0xA1, 0xA3, 0, 19}, - {0x99, 0x9F, 0, 12}, - {0x94, 0x97, 0, 8}, - {0x8D, 0x8D, 0, 7}, - {0x8A, 0x8A, 0, 6}, - {0x87, 0x88, 0, 4}, - {0x84, 0x84, 0, 3}, - {0x81, 0x82, 0, 1}, - {0x9C, 0x9F, 0, 28}, - {0xE0, 0x0, 1, 255}, - {0xBA, 0x0, 1, 255}, - {0xB2, 0xB2, 0, 1}, - {0xEA, 0x0, 1, 255}, - {0xAA, 0x0, 1, 255}, - {0x80, 0xAF, 0, 1}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x7, 1, 255}, - {0xBD, 0x0, 1, 255}, - {0xB1, 0x0, 1, 255}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x2, 1, 255}, - {0xBD, 0x0, 2, 255}, - {0xB4, 0xB4, 0, 2}, - {0xB2, 0xB2, 0, 1}, - {0x80, 0x80, 0, 3}, - {0x80, 0x81, 0, 4}, - {0xE0, 0x0, 2, 255}, - {0xBE, 0x2, 1, 255}, - {0xBD, 0x0, 2, 255}, - {0xB4, 0xB4, 0, 2}, - {0xB2, 0xB2, 0, 1}, - {0x80, 0x80, 0, 3}, - {0xE1, 0x0, 1, 255}, - {0x80, 0x0, 1, 255}, - {0xAE, 0xAE, 0, 1}, - {0xF0, 0x0, 1, 255}, - {0x91, 0x0, 1, 255}, - {0x84, 0x0, 1, 255}, - {0xA7, 0xA7, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0xAC, 0x0, 1, 255}, - {0xB5, 0xB5, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0xB8, 0xB8, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0xA7, 0xA7, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x87, 0x87, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x81, 0x81, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x8C, 0x8C, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x8C, 0x8C, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x8A, 0x8A, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x8B, 0x8B, 0, 2}, - {0x88, 0x88, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x61, 0x61, 0, 3}, - {0x8A, 0x8A, 0, 2}, - {0x88, 0x88, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x61, 0x61, 0, 4}, - {0x41, 0x41, 0, 3}, - {0x8A, 0x8A, 0, 2}, - {0x88, 0x88, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0xA8, 0xA8, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x83, 0x83, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x8A, 0x8A, 0, 2}, - {0x88, 0x88, 0, 1}, - {0xCC, 0x0, 3, 255}, - {0x8B, 0x8B, 0, 3}, - {0x88, 0x88, 0, 2}, - {0x83, 0x83, 0, 1}, - {0xC5, 0x2, 1, 255}, - {0x7A, 0x0, 1, 255}, - {0xCC, 0x0, 1, 255}, - {0x8C, 0x8C, 0, 1}, - {0xBE, 0xBE, 0, 2}, - {0xC5, 0x4, 1, 255}, - {0x7A, 0x2, 1, 255}, - {0x5A, 0x0, 1, 255}, - {0xCC, 0x0, 1, 255}, - {0x8C, 0x8C, 0, 1}, - {0xCC, 0x0, 1, 255}, - {0x8C, 0x8C, 0, 2}, - {0xBD, 0xBE, 0, 3}, - {0xCE, 0x1, 1, 255}, - {0xC2, 0x0, 1, 255}, - {0x6A, 0x6A, 0, 3}, - {0xB7, 0xB7, 0, 1}, - {0x87, 0x87, 0, 2}, - {0xCE, 0x1, 1, 255}, - {0xC2, 0x0, 1, 255}, - {0x6A, 0x6A, 0, 4}, - {0x4A, 0x4A, 0, 3}, - {0xB7, 0xB7, 0, 1}, - {0x87, 0x87, 0, 2}, - {0x6A, 0x6A, 0, 1}, - {0x6A, 0x6A, 0, 2}, - {0x4A, 0x4A, 0, 1}, - {0xCC, 0x0, 3, 255}, - {0x8A, 0x8A, 0, 3}, - {0x88, 0x88, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x88, 0x88, 0, 2}, - {0x81, 0x81, 0, 1}, - {0x27, 0x27, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x84, 0x0, 1, 255}, - {0x80, 0x80, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x84, 0x0, 1, 255}, - {0x83, 0x83, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x84, 0x0, 1, 255}, - {0x87, 0x87, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x84, 0x0, 1, 255}, - {0x89, 0x89, 0, 1}, - {0xE1, 0x0, 1, 255}, - {0x84, 0x0, 1, 255}, - {0x8C, 0x8C, 0, 1}, - {0xCC, 0x0, 4, 255}, - {0x8A, 0x8A, 0, 5}, - {0x87, 0x88, 0, 3}, - {0x83, 0x83, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xCC, 0x0, 2, 255}, - {0x83, 0x83, 0, 2}, - {0x81, 0x81, 0, 1}, - {0xCC, 0x0, 4, 255}, - {0xA8, 0xA8, 0, 5}, - {0x8B, 0x8B, 0, 4}, - {0x88, 0x88, 0, 3}, - {0x82, 0x83, 0, 1}, - {0xCE, 0x3, 1, 255}, - {0xCC, 0x1, 2, 255}, - {0xC2, 0x0, 1, 255}, - {0xB7, 0xB7, 0, 1}, - {0x8C, 0x8C, 0, 3}, - {0x81, 0x81, 0, 2}, - {0x87, 0x87, 0, 4}, - {0xCC, 0x0, 1, 255}, - {0x81, 0x82, 0, 1}, - {0xCC, 0x0, 3, 255}, - {0x8B, 0x8B, 0, 3}, - {0x88, 0x88, 0, 2}, - {0x82, 0x82, 0, 1}, -} - -// Total size of mainTable is 210136 bytes diff --git a/vendor/golang.org/x/text/secure/bidirule/bench_test.go b/vendor/golang.org/x/text/secure/bidirule/bench_test.go deleted file mode 100644 index 2db922bfd..000000000 --- a/vendor/golang.org/x/text/secure/bidirule/bench_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bidirule - -import ( - "testing" - - "golang.org/x/text/internal/testtext" -) - -var benchData = []struct{ name, data string }{ - {"ascii", "Scheveningen"}, - {"arabic", "دبي"}, - {"hangul", "다음과"}, -} - -func doBench(b *testing.B, fn func(b *testing.B, data string)) { - for _, d := range benchData { - testtext.Bench(b, d.name, func(b *testing.B) { fn(b, d.data) }) - } -} - -func BenchmarkSpan(b *testing.B) { - r := New() - doBench(b, func(b *testing.B, str string) { - b.SetBytes(int64(len(str))) - data := []byte(str) - for i := 0; i < b.N; i++ { - r.Reset() - r.Span(data, true) - } - }) -} - -func BenchmarkDirectionASCII(b *testing.B) { - doBench(b, func(b *testing.B, str string) { - b.SetBytes(int64(len(str))) - data := []byte(str) - for i := 0; i < b.N; i++ { - Direction(data) - } - }) -} - -func BenchmarkDirectionStringASCII(b *testing.B) { - doBench(b, func(b *testing.B, str string) { - b.SetBytes(int64(len(str))) - for i := 0; i < b.N; i++ { - DirectionString(str) - } - }) -} diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule.go b/vendor/golang.org/x/text/secure/bidirule/bidirule.go deleted file mode 100644 index a7161bdd9..000000000 --- a/vendor/golang.org/x/text/secure/bidirule/bidirule.go +++ /dev/null @@ -1,342 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package bidirule implements the Bidi Rule defined by RFC 5893. -// -// This package is under development. The API may change without notice and -// without preserving backward compatibility. -package bidirule - -import ( - "errors" - "unicode/utf8" - - "golang.org/x/text/transform" - "golang.org/x/text/unicode/bidi" -) - -// This file contains an implementation of RFC 5893: Right-to-Left Scripts for -// Internationalized Domain Names for Applications (IDNA) -// -// A label is an individual component of a domain name. Labels are usually -// shown separated by dots; for example, the domain name "www.example.com" is -// composed of three labels: "www", "example", and "com". -// -// An RTL label is a label that contains at least one character of class R, AL, -// or AN. An LTR label is any label that is not an RTL label. -// -// A "Bidi domain name" is a domain name that contains at least one RTL label. -// -// The following guarantees can be made based on the above: -// -// o In a domain name consisting of only labels that satisfy the rule, -// the requirements of Section 3 are satisfied. Note that even LTR -// labels and pure ASCII labels have to be tested. -// -// o In a domain name consisting of only LDH labels (as defined in the -// Definitions document [RFC5890]) and labels that satisfy the rule, -// the requirements of Section 3 are satisfied as long as a label -// that starts with an ASCII digit does not come after a -// right-to-left label. -// -// No guarantee is given for other combinations. - -// ErrInvalid indicates a label is invalid according to the Bidi Rule. -var ErrInvalid = errors.New("bidirule: failed Bidi Rule") - -type ruleState uint8 - -const ( - ruleInitial ruleState = iota - ruleLTR - ruleLTRFinal - ruleRTL - ruleRTLFinal - ruleInvalid -) - -type ruleTransition struct { - next ruleState - mask uint16 -} - -var transitions = [...][2]ruleTransition{ - // [2.1] The first character must be a character with Bidi property L, R, or - // AL. If it has the R or AL property, it is an RTL label; if it has the L - // property, it is an LTR label. - ruleInitial: { - {ruleLTRFinal, 1 << bidi.L}, - {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL}, - }, - ruleRTL: { - // [2.3] In an RTL label, the end of the label must be a character with - // Bidi property R, AL, EN, or AN, followed by zero or more characters - // with Bidi property NSM. - {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN}, - - // [2.2] In an RTL label, only characters with the Bidi properties R, - // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed. - // We exclude the entries from [2.3] - {ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM}, - }, - ruleRTLFinal: { - // [2.3] In an RTL label, the end of the label must be a character with - // Bidi property R, AL, EN, or AN, followed by zero or more characters - // with Bidi property NSM. - {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN | 1<<bidi.NSM}, - - // [2.2] In an RTL label, only characters with the Bidi properties R, - // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed. - // We exclude the entries from [2.3] and NSM. - {ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN}, - }, - ruleLTR: { - // [2.6] In an LTR label, the end of the label must be a character with - // Bidi property L or EN, followed by zero or more characters with Bidi - // property NSM. - {ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN}, - - // [2.5] In an LTR label, only characters with the Bidi properties L, - // EN, ES, CS, ET, ON, BN, or NSM are allowed. - // We exclude the entries from [2.6]. - {ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM}, - }, - ruleLTRFinal: { - // [2.6] In an LTR label, the end of the label must be a character with - // Bidi property L or EN, followed by zero or more characters with Bidi - // property NSM. - {ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN | 1<<bidi.NSM}, - - // [2.5] In an LTR label, only characters with the Bidi properties L, - // EN, ES, CS, ET, ON, BN, or NSM are allowed. - // We exclude the entries from [2.6]. - {ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN}, - }, - ruleInvalid: { - {ruleInvalid, 0}, - {ruleInvalid, 0}, - }, -} - -// [2.4] In an RTL label, if an EN is present, no AN may be present, and -// vice versa. -const exclusiveRTL = uint16(1<<bidi.EN | 1<<bidi.AN) - -// From RFC 5893 -// An RTL label is a label that contains at least one character of type -// R, AL, or AN. -// -// An LTR label is any label that is not an RTL label. - -// Direction reports the direction of the given label as defined by RFC 5893. -// The Bidi Rule does not have to be applied to labels of the category -// LeftToRight. -func Direction(b []byte) bidi.Direction { - for i := 0; i < len(b); { - e, sz := bidi.Lookup(b[i:]) - if sz == 0 { - i++ - } - c := e.Class() - if c == bidi.R || c == bidi.AL || c == bidi.AN { - return bidi.RightToLeft - } - i += sz - } - return bidi.LeftToRight -} - -// DirectionString reports the direction of the given label as defined by RFC -// 5893. The Bidi Rule does not have to be applied to labels of the category -// LeftToRight. -func DirectionString(s string) bidi.Direction { - for i := 0; i < len(s); { - e, sz := bidi.LookupString(s[i:]) - if sz == 0 { - i++ - } - c := e.Class() - if c == bidi.R || c == bidi.AL || c == bidi.AN { - return bidi.RightToLeft - } - i += sz - } - return bidi.LeftToRight -} - -// Valid reports whether b conforms to the BiDi rule. -func Valid(b []byte) bool { - var t Transformer - if n, ok := t.advance(b); !ok || n < len(b) { - return false - } - return t.isFinal() -} - -// ValidString reports whether s conforms to the BiDi rule. -func ValidString(s string) bool { - var t Transformer - if n, ok := t.advanceString(s); !ok || n < len(s) { - return false - } - return t.isFinal() -} - -// New returns a Transformer that verifies that input adheres to the Bidi Rule. -func New() *Transformer { - return &Transformer{} -} - -// Transformer implements transform.Transform. -type Transformer struct { - state ruleState - hasRTL bool - seen uint16 -} - -// A rule can only be violated for "Bidi Domain names", meaning if one of the -// following categories has been observed. -func (t *Transformer) isRTL() bool { - const isRTL = 1<<bidi.R | 1<<bidi.AL | 1<<bidi.AN - return t.seen&isRTL != 0 -} - -func (t *Transformer) isFinal() bool { - if !t.isRTL() { - return true - } - return t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial -} - -// Reset implements transform.Transformer. -func (t *Transformer) Reset() { *t = Transformer{} } - -// Transform implements transform.Transformer. This Transformer has state and -// needs to be reset between uses. -func (t *Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - if len(dst) < len(src) { - src = src[:len(dst)] - atEOF = false - err = transform.ErrShortDst - } - n, err1 := t.Span(src, atEOF) - copy(dst, src[:n]) - if err == nil || err1 != nil && err1 != transform.ErrShortSrc { - err = err1 - } - return n, n, err -} - -// Span returns the first n bytes of src that conform to the Bidi rule. -func (t *Transformer) Span(src []byte, atEOF bool) (n int, err error) { - if t.state == ruleInvalid && t.isRTL() { - return 0, ErrInvalid - } - n, ok := t.advance(src) - switch { - case !ok: - err = ErrInvalid - case n < len(src): - if !atEOF { - err = transform.ErrShortSrc - break - } - err = ErrInvalid - case !t.isFinal(): - err = ErrInvalid - } - return n, err -} - -// Precomputing the ASCII values decreases running time for the ASCII fast path -// by about 30%. -var asciiTable [128]bidi.Properties - -func init() { - for i := range asciiTable { - p, _ := bidi.LookupRune(rune(i)) - asciiTable[i] = p - } -} - -func (t *Transformer) advance(s []byte) (n int, ok bool) { - var e bidi.Properties - var sz int - for n < len(s) { - if s[n] < utf8.RuneSelf { - e, sz = asciiTable[s[n]], 1 - } else { - e, sz = bidi.Lookup(s[n:]) - if sz <= 1 { - if sz == 1 { - // We always consider invalid UTF-8 to be invalid, even if - // the string has not yet been determined to be RTL. - // TODO: is this correct? - return n, false - } - return n, true // incomplete UTF-8 encoding - } - } - // TODO: using CompactClass would result in noticeable speedup. - // See unicode/bidi/prop.go:Properties.CompactClass. - c := uint16(1 << e.Class()) - t.seen |= c - if t.seen&exclusiveRTL == exclusiveRTL { - t.state = ruleInvalid - return n, false - } - switch tr := transitions[t.state]; { - case tr[0].mask&c != 0: - t.state = tr[0].next - case tr[1].mask&c != 0: - t.state = tr[1].next - default: - t.state = ruleInvalid - if t.isRTL() { - return n, false - } - } - n += sz - } - return n, true -} - -func (t *Transformer) advanceString(s string) (n int, ok bool) { - var e bidi.Properties - var sz int - for n < len(s) { - if s[n] < utf8.RuneSelf { - e, sz = asciiTable[s[n]], 1 - } else { - e, sz = bidi.LookupString(s[n:]) - if sz <= 1 { - if sz == 1 { - return n, false // invalid UTF-8 - } - return n, true // incomplete UTF-8 encoding - } - } - // TODO: using CompactClass results in noticeable speedup. - // See unicode/bidi/prop.go:Properties.CompactClass. - c := uint16(1 << e.Class()) - t.seen |= c - if t.seen&exclusiveRTL == exclusiveRTL { - t.state = ruleInvalid - return n, false - } - switch tr := transitions[t.state]; { - case tr[0].mask&c != 0: - t.state = tr[0].next - case tr[1].mask&c != 0: - t.state = tr[1].next - default: - t.state = ruleInvalid - if t.isRTL() { - return n, false - } - } - n += sz - } - return n, true -} diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule_test.go b/vendor/golang.org/x/text/secure/bidirule/bidirule_test.go deleted file mode 100644 index 0794b3d7d..000000000 --- a/vendor/golang.org/x/text/secure/bidirule/bidirule_test.go +++ /dev/null @@ -1,825 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bidirule - -import ( - "fmt" - "testing" - - "golang.org/x/text/internal/testtext" - "golang.org/x/text/transform" - "golang.org/x/text/unicode/bidi" -) - -const ( - strL = "ABC" // Left to right - most letters in LTR scripts - strR = "עברית" // Right to left - most letters in non-Arabic RTL scripts - strAL = "دبي" // Arabic letters - most letters in the Arabic script - strEN = "123" // European Number (0-9, and Extended Arabic-Indic numbers) - strES = "+-" // European Number Separator (+ and -) - strET = "$" // European Number Terminator (currency symbols, the hash sign, the percent sign and so on) - strAN = "\u0660" // Arabic Number; this encompasses the Arabic-Indic numbers, but not the Extended Arabic-Indic numbers - strCS = "," // Common Number Separator (. , / : et al) - strNSM = "\u0300" // Nonspacing Mark - most combining accents - strBN = "\u200d" // Boundary Neutral - control characters (ZWNJ, ZWJ, and others) - strB = "\u2029" // Paragraph Separator - strS = "\u0009" // Segment Separator - strWS = " " // Whitespace, including the SPACE character - strON = "@" // Other Neutrals, including @, &, parentheses, MIDDLE DOT -) - -type ruleTest struct { - in string - dir bidi.Direction - n int // position at which the rule fails - err error - - // For tests that split the string in two. - pSrc int // number of source bytes to consume first - szDst int // size of destination buffer - nSrc int // source bytes consumed and bytes written - err0 error // error after first run -} - -var testCases = [][]ruleTest{ - // Go-specific rules. - // Invalid UTF-8 is invalid. - 0: []ruleTest{{ - in: "", - dir: bidi.LeftToRight, - }, { - in: "\x80", - dir: bidi.LeftToRight, - err: ErrInvalid, - n: 0, - }, { - in: "\xcc", - dir: bidi.LeftToRight, - err: ErrInvalid, - n: 0, - }, { - in: "abc\x80", - dir: bidi.LeftToRight, - err: ErrInvalid, - n: 3, - }, { - in: "abc\xcc", - dir: bidi.LeftToRight, - err: ErrInvalid, - n: 3, - }, { - in: "abc\xccdef", - dir: bidi.LeftToRight, - err: ErrInvalid, - n: 3, - }, { - in: "\xccdef", - dir: bidi.LeftToRight, - err: ErrInvalid, - n: 0, - }, { - in: strR + "\x80", - dir: bidi.RightToLeft, - err: ErrInvalid, - n: len(strR), - }, { - in: strR + "\xcc", - dir: bidi.RightToLeft, - err: ErrInvalid, - n: len(strR), - }, { - in: strAL + "\xcc" + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: len(strAL), - }, { - in: "\xcc" + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: 0, - }}, - - // Rule 2.1: The first character must be a character with Bidi property L, - // R, or AL. If it has the R or AL property, it is an RTL label; if it has - // the L property, it is an LTR label. - 1: []ruleTest{{ - in: strL, - dir: bidi.LeftToRight, - }, { - in: strR, - dir: bidi.RightToLeft, - }, { - in: strAL, - dir: bidi.RightToLeft, - }, { - in: strAN, - dir: bidi.RightToLeft, - err: ErrInvalid, - }, { - in: strEN, - dir: bidi.LeftToRight, - err: nil, // not an RTL string - }, { - in: strES, - dir: bidi.LeftToRight, - err: nil, // not an RTL string - }, { - in: strET, - dir: bidi.LeftToRight, - err: nil, // not an RTL string - }, { - in: strCS, - dir: bidi.LeftToRight, - err: nil, // not an RTL string - }, { - in: strNSM, - dir: bidi.LeftToRight, - err: nil, // not an RTL string - }, { - in: strBN, - dir: bidi.LeftToRight, - err: nil, // not an RTL string - }, { - in: strB, - dir: bidi.LeftToRight, - err: nil, // not an RTL string - }, { - in: strS, - dir: bidi.LeftToRight, - err: nil, // not an RTL string - }, { - in: strWS, - dir: bidi.LeftToRight, - err: nil, // not an RTL string - }, { - in: strON, - dir: bidi.LeftToRight, - err: nil, // not an RTL string - }, { - in: strEN + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: 3, - }, { - in: strES + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: 2, - }, { - in: strET + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: 1, - }, { - in: strCS + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: 1, - }, { - in: strNSM + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: 2, - }, { - in: strBN + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: 3, - }, { - in: strB + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: 3, - }, { - in: strS + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: 1, - }, { - in: strWS + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: 1, - }, { - in: strON + strR, - dir: bidi.RightToLeft, - err: ErrInvalid, - n: 1, - }}, - - // Rule 2.2: In an RTL label, only characters with the Bidi properties R, - // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed. - 2: []ruleTest{{ - in: strR + strR + strAL, - dir: bidi.RightToLeft, - }, { - in: strR + strAL + strR, - dir: bidi.RightToLeft, - }, { - in: strR + strAN + strAL, - dir: bidi.RightToLeft, - }, { - in: strR + strEN + strR, - dir: bidi.RightToLeft, - }, { - in: strR + strES + strR, - dir: bidi.RightToLeft, - }, { - in: strR + strCS + strR, - dir: bidi.RightToLeft, - }, { - in: strR + strET + strAL, - dir: bidi.RightToLeft, - }, { - in: strR + strON + strR, - dir: bidi.RightToLeft, - }, { - in: strR + strBN + strR, - dir: bidi.RightToLeft, - }, { - in: strR + strNSM + strAL, - dir: bidi.RightToLeft, - }, { - in: strR + strL + strR, - dir: bidi.RightToLeft, - n: len(strR), - err: ErrInvalid, - }, { - in: strR + strB + strR, - dir: bidi.RightToLeft, - n: len(strR), - err: ErrInvalid, - }, { - in: strR + strS + strAL, - dir: bidi.RightToLeft, - n: len(strR), - err: ErrInvalid, - }, { - in: strR + strWS + strAL, - dir: bidi.RightToLeft, - n: len(strR), - err: ErrInvalid, - }, { - in: strAL + strR + strAL, - dir: bidi.RightToLeft, - }, { - in: strAL + strAL + strR, - dir: bidi.RightToLeft, - }, { - in: strAL + strAN + strAL, - dir: bidi.RightToLeft, - }, { - in: strAL + strEN + strR, - dir: bidi.RightToLeft, - }, { - in: strAL + strES + strR, - dir: bidi.RightToLeft, - }, { - in: strAL + strCS + strR, - dir: bidi.RightToLeft, - }, { - in: strAL + strET + strAL, - dir: bidi.RightToLeft, - }, { - in: strAL + strON + strR, - dir: bidi.RightToLeft, - }, { - in: strAL + strBN + strR, - dir: bidi.RightToLeft, - }, { - in: strAL + strNSM + strAL, - dir: bidi.RightToLeft, - }, { - in: strAL + strL + strR, - dir: bidi.RightToLeft, - n: len(strAL), - err: ErrInvalid, - }, { - in: strAL + strB + strR, - dir: bidi.RightToLeft, - n: len(strAL), - err: ErrInvalid, - }, { - in: strAL + strS + strAL, - dir: bidi.RightToLeft, - n: len(strAL), - err: ErrInvalid, - }, { - in: strAL + strWS + strAL, - dir: bidi.RightToLeft, - n: len(strAL), - err: ErrInvalid, - }}, - - // Rule 2.3: In an RTL label, the end of the label must be a character with - // Bidi property R, AL, EN, or AN, followed by zero or more characters with - // Bidi property NSM. - 3: []ruleTest{{ - in: strR + strNSM, - dir: bidi.RightToLeft, - }, { - in: strR + strR, - dir: bidi.RightToLeft, - }, { - in: strR + strAL + strNSM, - dir: bidi.RightToLeft, - }, { - in: strR + strEN + strNSM + strNSM, - dir: bidi.RightToLeft, - }, { - in: strR + strAN, - dir: bidi.RightToLeft, - }, { - in: strR + strES + strNSM, - dir: bidi.RightToLeft, - n: len(strR + strES + strNSM), - err: ErrInvalid, - }, { - in: strR + strCS + strNSM + strNSM, - dir: bidi.RightToLeft, - n: len(strR + strCS + strNSM + strNSM), - err: ErrInvalid, - }, { - in: strR + strET, - dir: bidi.RightToLeft, - n: len(strR + strET), - err: ErrInvalid, - }, { - in: strR + strON + strNSM, - dir: bidi.RightToLeft, - n: len(strR + strON + strNSM), - err: ErrInvalid, - }, { - in: strR + strBN + strNSM + strNSM, - dir: bidi.RightToLeft, - n: len(strR + strBN + strNSM + strNSM), - err: ErrInvalid, - }, { - in: strR + strL + strNSM, - dir: bidi.RightToLeft, - n: len(strR), - err: ErrInvalid, - }, { - in: strR + strB + strNSM + strNSM, - dir: bidi.RightToLeft, - n: len(strR), - err: ErrInvalid, - }, { - in: strR + strS, - dir: bidi.RightToLeft, - n: len(strR), - err: ErrInvalid, - }, { - in: strR + strWS, - dir: bidi.RightToLeft, - n: len(strR), - err: ErrInvalid, - }, { - in: strAL + strNSM, - dir: bidi.RightToLeft, - }, { - in: strAL + strR, - dir: bidi.RightToLeft, - }, { - in: strAL + strAL + strNSM, - dir: bidi.RightToLeft, - }, { - in: strAL + strEN + strNSM + strNSM, - dir: bidi.RightToLeft, - }, { - in: strAL + strAN, - dir: bidi.RightToLeft, - }, { - in: strAL + strES + strNSM, - dir: bidi.RightToLeft, - n: len(strAL + strES + strNSM), - err: ErrInvalid, - }, { - in: strAL + strCS + strNSM + strNSM, - dir: bidi.RightToLeft, - n: len(strAL + strCS + strNSM + strNSM), - err: ErrInvalid, - }, { - in: strAL + strET, - dir: bidi.RightToLeft, - n: len(strAL + strET), - err: ErrInvalid, - }, { - in: strAL + strON + strNSM, - dir: bidi.RightToLeft, - n: len(strAL + strON + strNSM), - err: ErrInvalid, - }, { - in: strAL + strBN + strNSM + strNSM, - dir: bidi.RightToLeft, - n: len(strAL + strBN + strNSM + strNSM), - err: ErrInvalid, - }, { - in: strAL + strL + strNSM, - dir: bidi.RightToLeft, - n: len(strAL), - err: ErrInvalid, - }, { - in: strAL + strB + strNSM + strNSM, - dir: bidi.RightToLeft, - n: len(strAL), - err: ErrInvalid, - }, { - in: strAL + strS, - dir: bidi.RightToLeft, - n: len(strAL), - err: ErrInvalid, - }, { - in: strAL + strWS, - dir: bidi.RightToLeft, - n: len(strAL), - err: ErrInvalid, - }}, - - // Rule 2.4: In an RTL label, if an EN is present, no AN may be present, - // and vice versa. - 4: []ruleTest{{ - in: strR + strEN + strAN, - dir: bidi.RightToLeft, - n: len(strR + strEN), - err: ErrInvalid, - }, { - in: strR + strAN + strEN + strNSM, - dir: bidi.RightToLeft, - n: len(strR + strAN), - err: ErrInvalid, - }, { - in: strAL + strEN + strAN, - dir: bidi.RightToLeft, - n: len(strAL + strEN), - err: ErrInvalid, - }, { - in: strAL + strAN + strEN + strNSM, - dir: bidi.RightToLeft, - n: len(strAL + strAN), - err: ErrInvalid, - }}, - - // Rule 2.5: In an LTR label, only characters with the Bidi properties L, - // EN, ES, CS, ET, ON, BN, or NSM are allowed. - 5: []ruleTest{{ - in: strL + strL + strL, - dir: bidi.LeftToRight, - }, { - in: strL + strEN + strL, - dir: bidi.LeftToRight, - }, { - in: strL + strES + strL, - dir: bidi.LeftToRight, - }, { - in: strL + strCS + strL, - dir: bidi.LeftToRight, - }, { - in: strL + strET + strL, - dir: bidi.LeftToRight, - }, { - in: strL + strON + strL, - dir: bidi.LeftToRight, - }, { - in: strL + strBN + strL, - dir: bidi.LeftToRight, - }, { - in: strL + strNSM + strL, - dir: bidi.LeftToRight, - }, { - in: strL + strR + strL, - dir: bidi.RightToLeft, - n: len(strL), - err: ErrInvalid, - }, { - in: strL + strAL + strL, - dir: bidi.RightToLeft, - n: len(strL), - err: ErrInvalid, - }, { - in: strL + strAN + strL, - dir: bidi.RightToLeft, - n: len(strL), - err: ErrInvalid, - }, { - in: strL + strB + strL, - dir: bidi.LeftToRight, - n: len(strL + strAN + strL), - err: nil, - }, { - in: strL + strB + strL + strR, - dir: bidi.RightToLeft, - n: len(strL + strB + strL), - err: ErrInvalid, - }, { - in: strL + strS + strL, - dir: bidi.LeftToRight, - n: len(strL + strS + strL), - err: nil, - }, { - in: strL + strS + strL + strR, - dir: bidi.RightToLeft, - n: len(strL + strS + strL), - err: ErrInvalid, - }, { - in: strL + strWS + strL, - dir: bidi.LeftToRight, - n: len(strL + strWS + strL), - err: nil, - }, { - in: strL + strWS + strL + strR, - dir: bidi.RightToLeft, - n: len(strL + strWS + strL), - err: ErrInvalid, - }}, - - // Rule 2.6: In an LTR label, the end of the label must be a character with - // Bidi property L or EN, followed by zero or more characters with Bidi - // property NSM. - 6: []ruleTest{{ - in: strL, - dir: bidi.LeftToRight, - }, { - in: strL + strNSM, - dir: bidi.LeftToRight, - }, { - in: strL + strNSM + strNSM, - dir: bidi.LeftToRight, - }, { - in: strL + strEN, - dir: bidi.LeftToRight, - }, { - in: strL + strEN + strNSM, - dir: bidi.LeftToRight, - }, { - in: strL + strEN + strNSM + strNSM, - dir: bidi.LeftToRight, - }, { - in: strL + strES, - dir: bidi.LeftToRight, - n: len(strL + strES), - err: nil, - }, { - in: strL + strES + strR, - dir: bidi.RightToLeft, - n: len(strL + strES), - err: ErrInvalid, - }, { - in: strL + strCS, - dir: bidi.LeftToRight, - n: len(strL + strCS), - err: nil, - }, { - in: strL + strCS + strR, - dir: bidi.RightToLeft, - n: len(strL + strCS), - err: ErrInvalid, - }, { - in: strL + strET, - dir: bidi.LeftToRight, - n: len(strL + strET), - err: nil, - }, { - in: strL + strET + strR, - dir: bidi.RightToLeft, - n: len(strL + strET), - err: ErrInvalid, - }, { - in: strL + strON, - dir: bidi.LeftToRight, - n: len(strL + strON), - err: nil, - }, { - in: strL + strON + strR, - dir: bidi.RightToLeft, - n: len(strL + strON), - err: ErrInvalid, - }, { - in: strL + strBN, - dir: bidi.LeftToRight, - n: len(strL + strBN), - err: nil, - }, { - in: strL + strBN + strR, - dir: bidi.RightToLeft, - n: len(strL + strBN), - err: ErrInvalid, - }, { - in: strL + strR, - dir: bidi.RightToLeft, - n: len(strL), - err: ErrInvalid, - }, { - in: strL + strAL, - dir: bidi.RightToLeft, - n: len(strL), - err: ErrInvalid, - }, { - in: strL + strAN, - dir: bidi.RightToLeft, - n: len(strL), - err: ErrInvalid, - }, { - in: strL + strB, - dir: bidi.LeftToRight, - n: len(strL + strB), - err: nil, - }, { - in: strL + strB + strR, - dir: bidi.RightToLeft, - n: len(strL + strB), - err: ErrInvalid, - }, { - in: strL + strB, - dir: bidi.LeftToRight, - n: len(strL + strB), - err: nil, - }, { - in: strL + strB + strR, - dir: bidi.RightToLeft, - n: len(strL + strB), - err: ErrInvalid, - }, { - in: strL + strB, - dir: bidi.LeftToRight, - n: len(strL + strB), - err: nil, - }, { - in: strL + strB + strR, - dir: bidi.RightToLeft, - n: len(strL + strB), - err: ErrInvalid, - }}, - - // Incremental processing. - 9: []ruleTest{{ - in: "e\u0301", // é - dir: bidi.LeftToRight, - - pSrc: 2, - nSrc: 1, - err0: transform.ErrShortSrc, - }, { - in: "e\u1000f", // é - dir: bidi.LeftToRight, - - pSrc: 3, - nSrc: 1, - err0: transform.ErrShortSrc, - }, { - // Remain invalid once invalid. - in: strR + "ab", - dir: bidi.RightToLeft, - n: len(strR), - err: ErrInvalid, - - pSrc: len(strR) + 1, - nSrc: len(strR), - err0: ErrInvalid, - }, { - // Short destination - in: "abcdefghij", - dir: bidi.LeftToRight, - - pSrc: 10, - szDst: 5, - nSrc: 5, - err0: transform.ErrShortDst, - }, { - // Short destination splitting input rune - in: "e\u0301", - dir: bidi.LeftToRight, - - pSrc: 3, - szDst: 2, - nSrc: 1, - err0: transform.ErrShortDst, - }}, -} - -func init() { - for rule, cases := range testCases { - for i, tc := range cases { - if tc.err == nil { - testCases[rule][i].n = len(tc.in) - } - } - } -} - -func doTests(t *testing.T, fn func(t *testing.T, tc ruleTest)) { - for rule, cases := range testCases { - for i, tc := range cases { - name := fmt.Sprintf("%d/%d:%+q:%s", rule, i, tc.in, tc.in) - testtext.Run(t, name, func(t *testing.T) { - fn(t, tc) - }) - } - } -} - -func TestDirection(t *testing.T) { - doTests(t, func(t *testing.T, tc ruleTest) { - dir := Direction([]byte(tc.in)) - if dir != tc.dir { - t.Errorf("dir was %v; want %v", dir, tc.dir) - } - }) -} - -func TestDirectionString(t *testing.T) { - doTests(t, func(t *testing.T, tc ruleTest) { - dir := DirectionString(tc.in) - if dir != tc.dir { - t.Errorf("dir was %v; want %v", dir, tc.dir) - } - }) -} - -func TestValid(t *testing.T) { - doTests(t, func(t *testing.T, tc ruleTest) { - got := Valid([]byte(tc.in)) - want := tc.err == nil - if got != want { - t.Fatalf("Valid: got %v; want %v", got, want) - } - - got = ValidString(tc.in) - want = tc.err == nil - if got != want { - t.Fatalf("Valid: got %v; want %v", got, want) - } - }) -} - -func TestSpan(t *testing.T) { - doTests(t, func(t *testing.T, tc ruleTest) { - // Skip tests that test for limited destination buffer size. - if tc.szDst > 0 { - return - } - - r := New() - src := []byte(tc.in) - - n, err := r.Span(src[:tc.pSrc], tc.pSrc == len(tc.in)) - if err != tc.err0 { - t.Errorf("err0 was %v; want %v", err, tc.err0) - } - if n != tc.nSrc { - t.Fatalf("nSrc was %d; want %d", n, tc.nSrc) - } - - n, err = r.Span(src[n:], true) - if err != tc.err { - t.Errorf("error was %v; want %v", err, tc.err) - } - if got := n + tc.nSrc; got != tc.n { - t.Errorf("n was %d; want %d", got, tc.n) - } - }) -} - -func TestTransform(t *testing.T) { - doTests(t, func(t *testing.T, tc ruleTest) { - r := New() - - src := []byte(tc.in) - dst := make([]byte, len(tc.in)) - if tc.szDst > 0 { - dst = make([]byte, tc.szDst) - } - - // First transform operates on a zero-length string for most tests. - nDst, nSrc, err := r.Transform(dst, src[:tc.pSrc], tc.pSrc == len(tc.in)) - if err != tc.err0 { - t.Errorf("err0 was %v; want %v", err, tc.err0) - } - if nDst != nSrc { - t.Fatalf("nDst (%d) and nSrc (%d) should match", nDst, nSrc) - } - if nSrc != tc.nSrc { - t.Fatalf("nSrc was %d; want %d", nSrc, tc.nSrc) - } - - dst1 := make([]byte, len(tc.in)) - copy(dst1, dst[:nDst]) - - nDst, nSrc, err = r.Transform(dst1[nDst:], src[nSrc:], true) - if err != tc.err { - t.Errorf("error was %v; want %v", err, tc.err) - } - if nDst != nSrc { - t.Fatalf("nDst (%d) and nSrc (%d) should match", nDst, nSrc) - } - n := nSrc + tc.nSrc - if n != tc.n { - t.Fatalf("n was %d; want %d", n, tc.n) - } - if got, want := string(dst1[:n]), tc.in[:tc.n]; got != want { - t.Errorf("got %+q; want %+q", got, want) - } - }) -} diff --git a/vendor/golang.org/x/text/secure/doc.go b/vendor/golang.org/x/text/secure/doc.go deleted file mode 100644 index e531c3543..000000000 --- a/vendor/golang.org/x/text/secure/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// secure is a repository of text security related packages. -package secure // import "golang.org/x/text/secure" diff --git a/vendor/golang.org/x/text/secure/precis/benchmark_test.go b/vendor/golang.org/x/text/secure/precis/benchmark_test.go deleted file mode 100644 index 6337d0063..000000000 --- a/vendor/golang.org/x/text/secure/precis/benchmark_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7 - -package precis - -import ( - "testing" - - "golang.org/x/text/internal/testtext" -) - -var benchData = []struct{ name, str string }{ - {"ASCII", "Malvolio"}, - {"NotNormalized", "abcdefg\u0301\u031f"}, - {"Arabic", "دبي"}, - {"Hangul", "동일조건변경허락"}, -} - -var benchProfiles = []struct { - name string - p *Profile -}{ - {"FreeForm", NewFreeform()}, - {"Nickname", Nickname}, - {"OpaqueString", OpaqueString}, - {"UsernameCaseMapped", UsernameCaseMapped}, - {"UsernameCasePreserved", UsernameCasePreserved}, -} - -func doBench(b *testing.B, f func(b *testing.B, p *Profile, s string)) { - for _, bp := range benchProfiles { - for _, d := range benchData { - testtext.Bench(b, bp.name+"/"+d.name, func(b *testing.B) { - f(b, bp.p, d.str) - }) - } - } -} - -func BenchmarkString(b *testing.B) { - doBench(b, func(b *testing.B, p *Profile, s string) { - for i := 0; i < b.N; i++ { - p.String(s) - } - }) -} - -func BenchmarkBytes(b *testing.B) { - doBench(b, func(b *testing.B, p *Profile, s string) { - src := []byte(s) - b.ResetTimer() - for i := 0; i < b.N; i++ { - p.Bytes(src) - } - }) -} - -func BenchmarkAppend(b *testing.B) { - doBench(b, func(b *testing.B, p *Profile, s string) { - src := []byte(s) - dst := make([]byte, 0, 4096) - b.ResetTimer() - for i := 0; i < b.N; i++ { - p.Append(dst, src) - } - }) -} - -func BenchmarkTransform(b *testing.B) { - doBench(b, func(b *testing.B, p *Profile, s string) { - src := []byte(s) - dst := make([]byte, 2*len(s)) - t := p.NewTransformer() - b.ResetTimer() - for i := 0; i < b.N; i++ { - t.Transform(dst, src, true) - } - }) -} diff --git a/vendor/golang.org/x/text/secure/precis/class.go b/vendor/golang.org/x/text/secure/precis/class.go deleted file mode 100644 index f6b56413b..000000000 --- a/vendor/golang.org/x/text/secure/precis/class.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package precis - -import ( - "unicode/utf8" -) - -// TODO: Add contextual character rules from Appendix A of RFC5892. - -// A class is a set of characters that match certain derived properties. The -// PRECIS framework defines two classes: The Freeform class and the Identifier -// class. The freeform class should be used for profiles where expressiveness is -// prioritized over safety such as nicknames or passwords. The identifier class -// should be used for profiles where safety is the first priority such as -// addressable network labels and usernames. -type class struct { - validFrom property -} - -// Contains satisfies the runes.Set interface and returns whether the given rune -// is a member of the class. -func (c class) Contains(r rune) bool { - b := make([]byte, 4) - n := utf8.EncodeRune(b, r) - - trieval, _ := dpTrie.lookup(b[:n]) - return c.validFrom <= property(trieval) -} - -var ( - identifier = &class{validFrom: pValid} - freeform = &class{validFrom: idDisOrFreePVal} -) diff --git a/vendor/golang.org/x/text/secure/precis/class_test.go b/vendor/golang.org/x/text/secure/precis/class_test.go deleted file mode 100644 index fbaf6457f..000000000 --- a/vendor/golang.org/x/text/secure/precis/class_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package precis - -import ( - "testing" - - "golang.org/x/text/runes" -) - -// Compile-time regression test to ensure that Class is a Set -var _ runes.Set = (*class)(nil) - -// Ensure that certain characters are (or are not) in the identifer class. -func TestClassContains(t *testing.T) { - tests := []struct { - name string - class *class - allowed []rune - disallowed []rune - }{ - { - name: "Identifier", - class: identifier, - allowed: []rune("Aa0\u0021\u007e\u00df\u3007"), - disallowed: []rune("\u2150\u2100\u2200\u3164\u2190\u2600\u303b\u1e9b"), - }, - { - name: "Freeform", - class: freeform, - allowed: []rune("Aa0\u0021\u007e\u00df\u3007 \u2150\u2100\u2200\u2190\u2600\u1e9b"), - disallowed: []rune("\u3164\u303b"), - }, - } - - for _, rt := range tests { - for _, r := range rt.allowed { - if !rt.class.Contains(r) { - t.Errorf("Class %s should contain %U", rt.name, r) - } - } - for _, r := range rt.disallowed { - if rt.class.Contains(r) { - t.Errorf("Class %s should not contain %U", rt.name, r) - } - } - } -} diff --git a/vendor/golang.org/x/text/secure/precis/context.go b/vendor/golang.org/x/text/secure/precis/context.go deleted file mode 100644 index 2dcaf29d7..000000000 --- a/vendor/golang.org/x/text/secure/precis/context.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package precis - -import "errors" - -// This file contains tables and code related to context rules. - -type catBitmap uint16 - -const ( - // These bits, once set depending on the current value, are never unset. - bJapanese catBitmap = 1 << iota - bArabicIndicDigit - bExtendedArabicIndicDigit - - // These bits are set on each iteration depending on the current value. - bJoinStart - bJoinMid - bJoinEnd - bVirama - bLatinSmallL - bGreek - bHebrew - - // These bits indicated which of the permanent bits need to be set at the - // end of the checks. - bMustHaveJapn - - permanent = bJapanese | bArabicIndicDigit | bExtendedArabicIndicDigit | bMustHaveJapn -) - -const finalShift = 10 - -var errContext = errors.New("precis: contextual rule violated") - -func init() { - // Programmatically set these required bits as, manually setting them seems - // too error prone. - for i, ct := range categoryTransitions { - categoryTransitions[i].keep |= permanent - categoryTransitions[i].accept |= ct.term - } -} - -var categoryTransitions = []struct { - keep catBitmap // mask selecting which bits to keep from the previous state - set catBitmap // mask for which bits to set for this transition - - // These bitmaps are used for rules that require lookahead. - // term&accept == term must be true, which is enforced programmatically. - term catBitmap // bits accepted as termination condition - accept catBitmap // bits that pass, but not sufficient as termination - - // The rule function cannot take a *context as an argument, as it would - // cause the context to escape, adding significant overhead. - rule func(beforeBits catBitmap) (doLookahead bool, err error) -}{ - joiningL: {set: bJoinStart}, - joiningD: {set: bJoinStart | bJoinEnd}, - joiningT: {keep: bJoinStart, set: bJoinMid}, - joiningR: {set: bJoinEnd}, - viramaModifier: {set: bVirama}, - viramaJoinT: {set: bVirama | bJoinMid}, - latinSmallL: {set: bLatinSmallL}, - greek: {set: bGreek}, - greekJoinT: {set: bGreek | bJoinMid}, - hebrew: {set: bHebrew}, - hebrewJoinT: {set: bHebrew | bJoinMid}, - japanese: {set: bJapanese}, - katakanaMiddleDot: {set: bMustHaveJapn}, - - zeroWidthNonJoiner: { - term: bJoinEnd, - accept: bJoinMid, - rule: func(before catBitmap) (doLookAhead bool, err error) { - if before&bVirama != 0 { - return false, nil - } - if before&bJoinStart == 0 { - return false, errContext - } - return true, nil - }, - }, - zeroWidthJoiner: { - rule: func(before catBitmap) (doLookAhead bool, err error) { - if before&bVirama == 0 { - err = errContext - } - return false, err - }, - }, - middleDot: { - term: bLatinSmallL, - rule: func(before catBitmap) (doLookAhead bool, err error) { - if before&bLatinSmallL == 0 { - return false, errContext - } - return true, nil - }, - }, - greekLowerNumeralSign: { - set: bGreek, - term: bGreek, - rule: func(before catBitmap) (doLookAhead bool, err error) { - return true, nil - }, - }, - hebrewPreceding: { - set: bHebrew, - rule: func(before catBitmap) (doLookAhead bool, err error) { - if before&bHebrew == 0 { - err = errContext - } - return false, err - }, - }, - arabicIndicDigit: { - set: bArabicIndicDigit, - rule: func(before catBitmap) (doLookAhead bool, err error) { - if before&bExtendedArabicIndicDigit != 0 { - err = errContext - } - return false, err - }, - }, - extendedArabicIndicDigit: { - set: bExtendedArabicIndicDigit, - rule: func(before catBitmap) (doLookAhead bool, err error) { - if before&bArabicIndicDigit != 0 { - err = errContext - } - return false, err - }, - }, -} diff --git a/vendor/golang.org/x/text/secure/precis/doc.go b/vendor/golang.org/x/text/secure/precis/doc.go deleted file mode 100644 index 48500fe1c..000000000 --- a/vendor/golang.org/x/text/secure/precis/doc.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package precis contains types and functions for the preparation, -// enforcement, and comparison of internationalized strings ("PRECIS") as -// defined in RFC 7564. It also contains several pre-defined profiles for -// passwords, nicknames, and usernames as defined in RFC 7613 and RFC 7700. -// -// BE ADVISED: This package is under construction and the API may change in -// backwards incompatible ways and without notice. -package precis // import "golang.org/x/text/secure/precis" - -//go:generate go run gen.go gen_trieval.go diff --git a/vendor/golang.org/x/text/secure/precis/enforce_test.go b/vendor/golang.org/x/text/secure/precis/enforce_test.go deleted file mode 100644 index d36a9809c..000000000 --- a/vendor/golang.org/x/text/secure/precis/enforce_test.go +++ /dev/null @@ -1,393 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package precis - -import ( - "bytes" - "fmt" - "reflect" - "testing" - - "golang.org/x/text/internal/testtext" - "golang.org/x/text/secure/bidirule" - "golang.org/x/text/transform" -) - -type testCase struct { - input string - output string - err error -} - -var enforceTestCases = []struct { - name string - p *Profile - cases []testCase -}{ - {"Basic", NewFreeform(), []testCase{ - {"e\u0301\u031f", "\u00e9\u031f", nil}, // normalize - }}, - - {"Context Rule 1", NewFreeform(), []testCase{ - // Rule 1: zero-width non-joiner (U+200C) - // From RFC: - // False - // If Canonical_Combining_Class(Before(cp)) .eq. Virama Then True; - // If RegExpMatch((Joining_Type:{L,D})(Joining_Type:T)*\u200C - // (Joining_Type:T)*(Joining_Type:{R,D})) Then True; - // - // Example runes for different joining types: - // Join L: U+A872; PHAGS-PA SUPERFIXED LETTER RA - // Join D: U+062C; HAH WITH DOT BELOW - // Join T: U+0610; ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM - // Join R: U+0627; ALEF - // Virama: U+0A4D; GURMUKHI SIGN VIRAMA - // Virama and Join T: U+0ACD; GUJARATI SIGN VIRAMA - {"\u200c", "", errContext}, - {"\u200ca", "", errContext}, - {"a\u200c", "", errContext}, - {"\u200c\u0627", "", errContext}, // missing JoinStart - {"\u062c\u200c", "", errContext}, // missing JoinEnd - {"\u0610\u200c\u0610\u0627", "", errContext}, // missing JoinStart - {"\u062c\u0610\u200c\u0610", "", errContext}, // missing JoinEnd - - // Variants of: D T* U+200c T* R - {"\u062c\u200c\u0627", "\u062c\u200c\u0627", nil}, - {"\u062c\u0610\u200c\u0610\u0627", "\u062c\u0610\u200c\u0610\u0627", nil}, - {"\u062c\u0610\u0610\u200c\u0610\u0610\u0627", "\u062c\u0610\u0610\u200c\u0610\u0610\u0627", nil}, - {"\u062c\u0610\u200c\u0627", "\u062c\u0610\u200c\u0627", nil}, - {"\u062c\u200c\u0610\u0627", "\u062c\u200c\u0610\u0627", nil}, - - // Variants of: L T* U+200c T* D - {"\ua872\u200c\u062c", "\ua872\u200c\u062c", nil}, - {"\ua872\u0610\u200c\u0610\u062c", "\ua872\u0610\u200c\u0610\u062c", nil}, - {"\ua872\u0610\u0610\u200c\u0610\u0610\u062c", "\ua872\u0610\u0610\u200c\u0610\u0610\u062c", nil}, - {"\ua872\u0610\u200c\u062c", "\ua872\u0610\u200c\u062c", nil}, - {"\ua872\u200c\u0610\u062c", "\ua872\u200c\u0610\u062c", nil}, - - // Virama - {"\u0a4d\u200c", "\u0a4d\u200c", nil}, - {"\ua872\u0a4d\u200c", "\ua872\u0a4d\u200c", nil}, - {"\ua872\u0a4d\u0610\u200c", "", errContext}, - {"\ua872\u0a4d\u0610\u200c", "", errContext}, - - {"\u0acd\u200c", "\u0acd\u200c", nil}, - {"\ua872\u0acd\u200c", "\ua872\u0acd\u200c", nil}, - {"\ua872\u0acd\u0610\u200c", "", errContext}, - {"\ua872\u0acd\u0610\u200c", "", errContext}, - - // Using Virama as join T - {"\ua872\u0acd\u200c\u062c", "\ua872\u0acd\u200c\u062c", nil}, - {"\ua872\u200c\u0acd\u062c", "\ua872\u200c\u0acd\u062c", nil}, - }}, - - {"Context Rule 2", NewFreeform(), []testCase{ - // Rule 2: zero-width joiner (U+200D) - {"\u200d", "", errContext}, - {"\u200da", "", errContext}, - {"a\u200d", "", errContext}, - - {"\u0a4d\u200d", "\u0a4d\u200d", nil}, - {"\ua872\u0a4d\u200d", "\ua872\u0a4d\u200d", nil}, - {"\u0a4da\u200d", "", errContext}, - }}, - - {"Context Rule 3", NewFreeform(), []testCase{ - // Rule 3: middle dot - {"·", "", errContext}, - {"l·", "", errContext}, - {"·l", "", errContext}, - {"a·", "", errContext}, - {"l·a", "", errContext}, - {"a·a", "", errContext}, - {"l·l", "l·l", nil}, - {"al·la", "al·la", nil}, - }}, - - {"Context Rule 4", NewFreeform(), []testCase{ - // Rule 4: Greek lower numeral U+0375 - {"͵", "", errContext}, - {"͵a", "", errContext}, - {"α͵", "", errContext}, - {"͵α", "͵α", nil}, - {"α͵α", "α͵α", nil}, - {"͵͵α", "͵͵α", nil}, // The numeric sign is itself Greek. - {"α͵͵α", "α͵͵α", nil}, - {"α͵͵", "", errContext}, - {"α͵͵a", "", errContext}, - }}, - - {"Context Rule 5+6", NewFreeform(), []testCase{ - // Rule 5+6: Hebrew preceding - // U+05f3: Geresh - {"׳", "", errContext}, - {"׳ה", "", errContext}, - {"a׳b", "", errContext}, - {"ש׳", "ש׳", nil}, // U+05e9 U+05f3 - {"ש׳׳׳", "ש׳׳׳", nil}, // U+05e9 U+05f3 - - // U+05f4: Gershayim - {"״", "", errContext}, - {"״ה", "", errContext}, - {"a״b", "", errContext}, - {"ש״", "ש״", nil}, // U+05e9 U+05f4 - {"ש״״״", "ש״״״", nil}, // U+05e9 U+05f4 - {"aש״״״", "aש״״״", nil}, // U+05e9 U+05f4 - }}, - - {"Context Rule 7", NewFreeform(), []testCase{ - // Rule 7: Katakana middle Dot - {"・", "", errContext}, - {"abc・", "", errContext}, - {"・def", "", errContext}, - {"abc・def", "", errContext}, - {"aヅc・def", "aヅc・def", nil}, - {"abc・dぶf", "abc・dぶf", nil}, - {"⺐bc・def", "⺐bc・def", nil}, - }}, - - {"Context Rule 8+9", NewFreeform(), []testCase{ - // Rule 8+9: Arabic Indic Digit - {"١٢٣٤٥۶", "", errContext}, - {"۱۲۳۴۵٦", "", errContext}, - {"١٢٣٤٥", "١٢٣٤٥", nil}, - {"۱۲۳۴۵", "۱۲۳۴۵", nil}, - }}, - - {"Nickname", Nickname, []testCase{ - {" Swan of Avon ", "Swan of Avon", nil}, - {"", "", errEmptyString}, - {" ", "", errEmptyString}, - {" ", "", errEmptyString}, - {"a\u00A0a\u1680a\u2000a\u2001a\u2002a\u2003a\u2004a\u2005a\u2006a\u2007a\u2008a\u2009a\u200Aa\u202Fa\u205Fa\u3000a", "a a a a a a a a a a a a a a a a a", nil}, - {"Foo", "Foo", nil}, - {"foo", "foo", nil}, - {"Foo Bar", "Foo Bar", nil}, - {"foo bar", "foo bar", nil}, - {"\u03A3", "\u03A3", nil}, - {"\u03C3", "\u03C3", nil}, - // Greek final sigma is left as is (do not fold!) - {"\u03C2", "\u03C2", nil}, - {"\u265A", "♚", nil}, - {"Richard \u2163", "Richard IV", nil}, - {"\u212B", "Å", nil}, - {"\uFB00", "ff", nil}, // because of NFKC - {"שa", "שa", nil}, // no bidi rule - {"동일조건변경허락", "동일조건변경허락", nil}, - }}, - {"OpaqueString", OpaqueString, []testCase{ - {" Swan of Avon ", " Swan of Avon ", nil}, - {"", "", errEmptyString}, - {" ", " ", nil}, - {" ", " ", nil}, - {"a\u00A0a\u1680a\u2000a\u2001a\u2002a\u2003a\u2004a\u2005a\u2006a\u2007a\u2008a\u2009a\u200Aa\u202Fa\u205Fa\u3000a", "a a a a a a a a a a a a a a a a a", nil}, - {"Foo", "Foo", nil}, - {"foo", "foo", nil}, - {"Foo Bar", "Foo Bar", nil}, - {"foo bar", "foo bar", nil}, - {"\u03C3", "\u03C3", nil}, - {"Richard \u2163", "Richard \u2163", nil}, - {"\u212B", "Å", nil}, - {"Jack of \u2666s", "Jack of \u2666s", nil}, - {"my cat is a \u0009by", "", errDisallowedRune}, - {"שa", "שa", nil}, // no bidi rule - }}, - {"UsernameCaseMapped", UsernameCaseMapped, []testCase{ - // TODO: Should this work? - // {UsernameCaseMapped, "", "", errDisallowedRune}, - {"juliet@example.com", "juliet@example.com", nil}, - {"fussball", "fussball", nil}, - {"fu\u00DFball", "fu\u00DFball", nil}, - {"\u03C0", "\u03C0", nil}, - {"\u03A3", "\u03C3", nil}, - {"\u03C3", "\u03C3", nil}, - // Greek final sigma is left as is (do not fold!) - {"\u03C2", "\u03C2", nil}, - {"\u0049", "\u0069", nil}, - {"\u0049", "\u0069", nil}, - {"\u03D2", "", errDisallowedRune}, - {"\u03B0", "\u03B0", nil}, - {"foo bar", "", errDisallowedRune}, - {"♚", "", errDisallowedRune}, - {"\u007E", "~", nil}, - {"a", "a", nil}, - {"!", "!", nil}, - {"²", "", errDisallowedRune}, - {"\t", "", errDisallowedRune}, - {"\n", "", errDisallowedRune}, - {"\u26D6", "", errDisallowedRune}, - {"\u26FF", "", errDisallowedRune}, - {"\uFB00", "", errDisallowedRune}, - {"\u1680", "", errDisallowedRune}, - {" ", "", errDisallowedRune}, - {" ", "", errDisallowedRune}, - {"\u01C5", "", errDisallowedRune}, - {"\u16EE", "", errDisallowedRune}, // Nl RUNIC ARLAUG SYMBOL - {"\u0488", "", errDisallowedRune}, // Me COMBINING CYRILLIC HUNDRED THOUSANDS SIGN - {"\u212B", "\u00e5", nil}, // Angstrom sign, NFC -> U+00E5 - {"A\u030A", "å", nil}, // A + ring - {"\u00C5", "å", nil}, // A with ring - {"\u00E7", "ç", nil}, // c cedille - {"\u0063\u0327", "ç", nil}, // c + cedille - {"\u0158", "ř", nil}, - {"\u0052\u030C", "ř", nil}, - - {"\u1E61", "\u1E61", nil}, // LATIN SMALL LETTER S WITH DOT ABOVE - - // Confusable characters ARE allowed and should NOT be mapped. - {"\u0410", "\u0430", nil}, // CYRILLIC CAPITAL LETTER A - - // Full width should be mapped to the canonical decomposition. - {"AB", "ab", nil}, - {"שc", "", bidirule.ErrInvalid}, // bidi rule - - }}, - {"UsernameCasePreserved", UsernameCasePreserved, []testCase{ - {"ABC", "ABC", nil}, - {"AB", "AB", nil}, - {"שc", "", bidirule.ErrInvalid}, // bidi rule - {"\uFB00", "", errDisallowedRune}, - {"\u212B", "\u00c5", nil}, // Angstrom sign, NFC -> U+00E5 - {"ẛ", "", errDisallowedRune}, // LATIN SMALL LETTER LONG S WITH DOT ABOVE - }}, -} - -func doTests(t *testing.T, fn func(t *testing.T, p *Profile, tc testCase)) { - for _, g := range enforceTestCases { - for i, tc := range g.cases { - name := fmt.Sprintf("%s:%d:%+q", g.name, i, tc.input) - testtext.Run(t, name, func(t *testing.T) { - fn(t, g.p, tc) - }) - } - } -} - -func TestString(t *testing.T) { - doTests(t, func(t *testing.T, p *Profile, tc testCase) { - if e, err := p.String(tc.input); tc.err != err || e != tc.output { - t.Errorf("got %+q (err: %v); want %+q (err: %v)", e, err, tc.output, tc.err) - } - }) -} - -func TestBytes(t *testing.T) { - doTests(t, func(t *testing.T, p *Profile, tc testCase) { - if e, err := p.Bytes([]byte(tc.input)); tc.err != err || string(e) != tc.output { - t.Errorf("got %+q (err: %v); want %+q (err: %v)", string(e), err, tc.output, tc.err) - } - }) - // Test that calling Bytes with something that doesn't transform returns a - // copy. - orig := []byte("hello") - b, _ := NewFreeform().Bytes(orig) - if reflect.ValueOf(b).Pointer() == reflect.ValueOf(orig).Pointer() { - t.Error("original and result are the same slice; should be a copy") - } -} - -func TestAppend(t *testing.T) { - doTests(t, func(t *testing.T, p *Profile, tc testCase) { - if e, err := p.Append(nil, []byte(tc.input)); tc.err != err || string(e) != tc.output { - t.Errorf("got %+q (err: %v); want %+q (err: %v)", string(e), err, tc.output, tc.err) - } - }) -} - -func TestStringMallocs(t *testing.T) { - if n := testtext.AllocsPerRun(100, func() { UsernameCaseMapped.String("helloworld") }); n > 0 { - // TODO: reduce this to 0. - t.Skipf("got %f allocs, want 0", n) - } -} - -func TestAppendMallocs(t *testing.T) { - str := []byte("helloworld") - out := make([]byte, 0, len(str)) - if n := testtext.AllocsPerRun(100, func() { UsernameCaseMapped.Append(out, str) }); n > 0 { - t.Errorf("got %f allocs, want 0", n) - } -} - -func TestTransformMallocs(t *testing.T) { - str := []byte("helloworld") - out := make([]byte, 0, len(str)) - tr := UsernameCaseMapped.NewTransformer() - if n := testtext.AllocsPerRun(100, func() { - tr.Reset() - tr.Transform(out, str, true) - }); n > 0 { - t.Errorf("got %f allocs, want 0", n) - } -} - -func min(a, b int) int { - if a < b { - return a - } - return b -} - -// TestTransformerShortBuffers tests that the precis.Transformer implements the -// spirit, not just the letter (the method signatures), of the -// transform.Transformer interface. -// -// In particular, it tests that, if one or both of the dst or src buffers are -// short, so that multiple Transform calls are required to complete the overall -// transformation, the end result is identical to one Transform call with -// sufficiently long buffers. -func TestTransformerShortBuffers(t *testing.T) { - srcUnit := []byte("a\u0300cce\u0301nts") // NFD normalization form. - wantUnit := []byte("àccénts") // NFC normalization form. - src := bytes.Repeat(srcUnit, 16) - want := bytes.Repeat(wantUnit, 16) - const long = 4096 - dst := make([]byte, long) - - // 5, 7, 9, 11, 13, 16 and 17 are all pair-wise co-prime, which means that - // slicing the dst and src buffers into 5, 7, 13 and 17 byte chunks will - // fall at different places inside the repeated srcUnit's and wantUnit's. - if len(srcUnit) != 11 || len(wantUnit) != 9 || len(src) > long || len(want) > long { - t.Fatal("inconsistent lengths") - } - - tr := NewFreeform().NewTransformer() - for _, deltaD := range []int{5, 7, 13, 17, long} { - loop: - for _, deltaS := range []int{5, 7, 13, 17, long} { - tr.Reset() - d0 := 0 - s0 := 0 - for { - d1 := min(len(dst), d0+deltaD) - s1 := min(len(src), s0+deltaS) - nDst, nSrc, err := tr.Transform(dst[d0:d1:d1], src[s0:s1:s1], s1 == len(src)) - d0 += nDst - s0 += nSrc - if err == nil { - break - } - if err == transform.ErrShortDst || err == transform.ErrShortSrc { - continue - } - t.Errorf("deltaD=%d, deltaS=%d: %v", deltaD, deltaS, err) - continue loop - } - if s0 != len(src) { - t.Errorf("deltaD=%d, deltaS=%d: s0: got %d, want %d", deltaD, deltaS, s0, len(src)) - continue - } - if d0 != len(want) { - t.Errorf("deltaD=%d, deltaS=%d: d0: got %d, want %d", deltaD, deltaS, d0, len(want)) - continue - } - got := dst[:d0] - if !bytes.Equal(got, want) { - t.Errorf("deltaD=%d, deltaS=%d:\ngot %q\nwant %q", deltaD, deltaS, got, want) - continue - } - } - } -} diff --git a/vendor/golang.org/x/text/secure/precis/gen.go b/vendor/golang.org/x/text/secure/precis/gen.go deleted file mode 100644 index dba9004a6..000000000 --- a/vendor/golang.org/x/text/secure/precis/gen.go +++ /dev/null @@ -1,310 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Unicode table generator. -// Data read from the web. - -// +build ignore - -package main - -import ( - "flag" - "log" - "unicode" - "unicode/utf8" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" - "golang.org/x/text/internal/ucd" - "golang.org/x/text/unicode/norm" - "golang.org/x/text/unicode/rangetable" -) - -var outputFile = flag.String("output", "tables.go", "output file for generated tables; default tables.go") - -var assigned, disallowedRunes *unicode.RangeTable - -var runeCategory = map[rune]category{} - -var overrides = map[category]category{ - viramaModifier: viramaJoinT, - greek: greekJoinT, - hebrew: hebrewJoinT, -} - -func setCategory(r rune, cat category) { - if c, ok := runeCategory[r]; ok { - if override, ok := overrides[c]; cat == joiningT && ok { - cat = override - } else { - log.Fatalf("%U: multiple categories for rune (%v and %v)", r, c, cat) - } - } - runeCategory[r] = cat -} - -func init() { - if numCategories > 1<<propShift { - log.Fatalf("Number of categories is %d; may at most be %d", numCategories, 1<<propShift) - } -} - -func main() { - gen.Init() - - // Load data - runes := []rune{} - // PrecisIgnorableProperties: https://tools.ietf.org/html/rfc7564#section-9.13 - ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { - if p.String(1) == "Default_Ignorable_Code_Point" { - runes = append(runes, p.Rune(0)) - } - }) - ucd.Parse(gen.OpenUCDFile("PropList.txt"), func(p *ucd.Parser) { - switch p.String(1) { - case "Noncharacter_Code_Point": - runes = append(runes, p.Rune(0)) - } - }) - // OldHangulJamo: https://tools.ietf.org/html/rfc5892#section-2.9 - ucd.Parse(gen.OpenUCDFile("HangulSyllableType.txt"), func(p *ucd.Parser) { - switch p.String(1) { - case "L", "V", "T": - runes = append(runes, p.Rune(0)) - } - }) - - disallowedRunes = rangetable.New(runes...) - assigned = rangetable.Assigned(unicode.Version) - - // Load category data. - runeCategory['l'] = latinSmallL - ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) { - const cccVirama = 9 - if p.Int(ucd.CanonicalCombiningClass) == cccVirama { - setCategory(p.Rune(0), viramaModifier) - } - }) - ucd.Parse(gen.OpenUCDFile("Scripts.txt"), func(p *ucd.Parser) { - switch p.String(1) { - case "Greek": - setCategory(p.Rune(0), greek) - case "Hebrew": - setCategory(p.Rune(0), hebrew) - case "Hiragana", "Katakana", "Han": - setCategory(p.Rune(0), japanese) - } - }) - - // Set the rule categories associated with exceptions. This overrides any - // previously set categories. The original categories are manually - // reintroduced in the categoryTransitions table. - for r, e := range exceptions { - if e.cat != 0 { - runeCategory[r] = e.cat - } - } - cat := map[string]category{ - "L": joiningL, - "D": joiningD, - "T": joiningT, - - "R": joiningR, - } - ucd.Parse(gen.OpenUCDFile("extracted/DerivedJoiningType.txt"), func(p *ucd.Parser) { - switch v := p.String(1); v { - case "L", "D", "T", "R": - setCategory(p.Rune(0), cat[v]) - } - }) - - writeTables() - gen.Repackage("gen_trieval.go", "trieval.go", "precis") -} - -type exception struct { - prop property - cat category -} - -func init() { - // Programmatically add the Arabic and Indic digits to the exceptions map. - // See comment in the exceptions map below why these are marked disallowed. - for i := rune(0); i <= 9; i++ { - exceptions[0x0660+i] = exception{ - prop: disallowed, - cat: arabicIndicDigit, - } - exceptions[0x06F0+i] = exception{ - prop: disallowed, - cat: extendedArabicIndicDigit, - } - } -} - -// The Exceptions class as defined in RFC 5892 -// https://tools.ietf.org/html/rfc5892#section-2.6 -var exceptions = map[rune]exception{ - 0x00DF: {prop: pValid}, - 0x03C2: {prop: pValid}, - 0x06FD: {prop: pValid}, - 0x06FE: {prop: pValid}, - 0x0F0B: {prop: pValid}, - 0x3007: {prop: pValid}, - - // ContextO|J rules are marked as disallowed, taking a "guilty until proven - // innocent" approach. The main reason for this is that the check for - // whether a context rule should be applied can be moved to the logic for - // handing disallowed runes, taken it off the common path. The exception to - // this rule is for katakanaMiddleDot, as the rule logic is handled without - // using a rule function. - - // ContextJ (Join control) - 0x200C: {prop: disallowed, cat: zeroWidthNonJoiner}, - 0x200D: {prop: disallowed, cat: zeroWidthJoiner}, - - // ContextO - 0x00B7: {prop: disallowed, cat: middleDot}, - 0x0375: {prop: disallowed, cat: greekLowerNumeralSign}, - 0x05F3: {prop: disallowed, cat: hebrewPreceding}, // punctuation Geresh - 0x05F4: {prop: disallowed, cat: hebrewPreceding}, // punctuation Gershayim - 0x30FB: {prop: pValid, cat: katakanaMiddleDot}, - - // These are officially ContextO, but the implementation does not require - // special treatment of these, so we simply mark them as valid. - 0x0660: {prop: pValid}, - 0x0661: {prop: pValid}, - 0x0662: {prop: pValid}, - 0x0663: {prop: pValid}, - 0x0664: {prop: pValid}, - 0x0665: {prop: pValid}, - 0x0666: {prop: pValid}, - 0x0667: {prop: pValid}, - 0x0668: {prop: pValid}, - 0x0669: {prop: pValid}, - 0x06F0: {prop: pValid}, - 0x06F1: {prop: pValid}, - 0x06F2: {prop: pValid}, - 0x06F3: {prop: pValid}, - 0x06F4: {prop: pValid}, - 0x06F5: {prop: pValid}, - 0x06F6: {prop: pValid}, - 0x06F7: {prop: pValid}, - 0x06F8: {prop: pValid}, - 0x06F9: {prop: pValid}, - - 0x0640: {prop: disallowed}, - 0x07FA: {prop: disallowed}, - 0x302E: {prop: disallowed}, - 0x302F: {prop: disallowed}, - 0x3031: {prop: disallowed}, - 0x3032: {prop: disallowed}, - 0x3033: {prop: disallowed}, - 0x3034: {prop: disallowed}, - 0x3035: {prop: disallowed}, - 0x303B: {prop: disallowed}, -} - -// LetterDigits: https://tools.ietf.org/html/rfc5892#section-2.1 -// r in {Ll, Lu, Lo, Nd, Lm, Mn, Mc}. -func isLetterDigits(r rune) bool { - return unicode.In(r, - unicode.Ll, unicode.Lu, unicode.Lm, unicode.Lo, // Letters - unicode.Mn, unicode.Mc, // Modifiers - unicode.Nd, // Digits - ) -} - -func isIdDisAndFreePVal(r rune) bool { - return unicode.In(r, - // OtherLetterDigits: https://tools.ietf.org/html/rfc7564#section-9.18 - // r in in {Lt, Nl, No, Me} - unicode.Lt, unicode.Nl, unicode.No, // Other letters / numbers - unicode.Me, // Modifiers - - // Spaces: https://tools.ietf.org/html/rfc7564#section-9.14 - // r in in {Zs} - unicode.Zs, - - // Symbols: https://tools.ietf.org/html/rfc7564#section-9.15 - // r in {Sm, Sc, Sk, So} - unicode.Sm, unicode.Sc, unicode.Sk, unicode.So, - - // Punctuation: https://tools.ietf.org/html/rfc7564#section-9.16 - // r in {Pc, Pd, Ps, Pe, Pi, Pf, Po} - unicode.Pc, unicode.Pd, unicode.Ps, unicode.Pe, - unicode.Pi, unicode.Pf, unicode.Po, - ) -} - -// HasCompat: https://tools.ietf.org/html/rfc7564#section-9.17 -func hasCompat(r rune) bool { - return !norm.NFKC.IsNormalString(string(r)) -} - -// From https://tools.ietf.org/html/rfc5892: -// -// If .cp. .in. Exceptions Then Exceptions(cp); -// Else If .cp. .in. BackwardCompatible Then BackwardCompatible(cp); -// Else If .cp. .in. Unassigned Then UNASSIGNED; -// Else If .cp. .in. ASCII7 Then PVALID; -// Else If .cp. .in. JoinControl Then CONTEXTJ; -// Else If .cp. .in. OldHangulJamo Then DISALLOWED; -// Else If .cp. .in. PrecisIgnorableProperties Then DISALLOWED; -// Else If .cp. .in. Controls Then DISALLOWED; -// Else If .cp. .in. HasCompat Then ID_DIS or FREE_PVAL; -// Else If .cp. .in. LetterDigits Then PVALID; -// Else If .cp. .in. OtherLetterDigits Then ID_DIS or FREE_PVAL; -// Else If .cp. .in. Spaces Then ID_DIS or FREE_PVAL; -// Else If .cp. .in. Symbols Then ID_DIS or FREE_PVAL; -// Else If .cp. .in. Punctuation Then ID_DIS or FREE_PVAL; -// Else DISALLOWED; - -func writeTables() { - propTrie := triegen.NewTrie("derivedProperties") - w := gen.NewCodeWriter() - defer w.WriteGoFile(*outputFile, "precis") - gen.WriteUnicodeVersion(w) - - // Iterate over all the runes... - for i := rune(0); i < unicode.MaxRune; i++ { - r := rune(i) - - if !utf8.ValidRune(r) { - continue - } - - e, ok := exceptions[i] - p := e.prop - switch { - case ok: - case !unicode.In(r, assigned): - p = unassigned - case r >= 0x0021 && r <= 0x007e: // Is ASCII 7 - p = pValid - case unicode.In(r, disallowedRunes, unicode.Cc): - p = disallowed - case hasCompat(r): - p = idDisOrFreePVal - case isLetterDigits(r): - p = pValid - case isIdDisAndFreePVal(r): - p = idDisOrFreePVal - default: - p = disallowed - } - cat := runeCategory[r] - // Don't set category for runes that are disallowed. - if p == disallowed { - cat = exceptions[r].cat - } - propTrie.Insert(r, uint64(p)|uint64(cat)) - } - sz, err := propTrie.Gen(w) - if err != nil { - log.Fatal(err) - } - w.Size += sz -} diff --git a/vendor/golang.org/x/text/secure/precis/gen_trieval.go b/vendor/golang.org/x/text/secure/precis/gen_trieval.go deleted file mode 100644 index 308510c9a..000000000 --- a/vendor/golang.org/x/text/secure/precis/gen_trieval.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// entry is the entry of a trie table -// 7..6 property (unassigned, disallowed, maybe, valid) -// 5..0 category -type entry uint8 - -const ( - propShift = 6 - propMask = 0xc0 - catMask = 0x3f -) - -func (e entry) property() property { return property(e & propMask) } -func (e entry) category() category { return category(e & catMask) } - -type property uint8 - -// The order of these constants matter. A Profile may consider runes to be -// allowed either from pValid or idDisOrFreePVal. -const ( - unassigned property = iota << propShift - disallowed - idDisOrFreePVal // disallowed for Identifier, pValid for FreeForm - pValid -) - -// compute permutations of all properties and specialCategories. -type category uint8 - -const ( - other category = iota - - // Special rune types - joiningL - joiningD - joiningT - joiningR - viramaModifier - viramaJoinT // Virama + JoiningT - latinSmallL // U+006c - greek - greekJoinT // Greek + JoiningT - hebrew - hebrewJoinT // Hebrew + JoiningT - japanese // hirigana, katakana, han - - // Special rune types associated with contextual rules defined in - // https://tools.ietf.org/html/rfc5892#appendix-A. - // ContextO - zeroWidthNonJoiner // rule 1 - zeroWidthJoiner // rule 2 - // ContextJ - middleDot // rule 3 - greekLowerNumeralSign // rule 4 - hebrewPreceding // rule 5 and 6 - katakanaMiddleDot // rule 7 - arabicIndicDigit // rule 8 - extendedArabicIndicDigit // rule 9 - - numCategories -) diff --git a/vendor/golang.org/x/text/secure/precis/nickname.go b/vendor/golang.org/x/text/secure/precis/nickname.go deleted file mode 100644 index cd54b9e69..000000000 --- a/vendor/golang.org/x/text/secure/precis/nickname.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package precis - -import ( - "unicode" - "unicode/utf8" - - "golang.org/x/text/transform" -) - -type nickAdditionalMapping struct { - // TODO: This transformer needs to be stateless somehow… - notStart bool - prevSpace bool -} - -func (t *nickAdditionalMapping) Reset() { - t.prevSpace = false - t.notStart = false -} - -func (t *nickAdditionalMapping) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - // RFC 7700 §2.1. Rules - // - // 2. Additional Mapping Rule: The additional mapping rule consists of - // the following sub-rules. - // - // 1. Any instances of non-ASCII space MUST be mapped to ASCII - // space (U+0020); a non-ASCII space is any Unicode code point - // having a general category of "Zs", naturally with the - // exception of U+0020. - // - // 2. Any instances of the ASCII space character at the beginning - // or end of a nickname MUST be removed (e.g., "stpeter " is - // mapped to "stpeter"). - // - // 3. Interior sequences of more than one ASCII space character - // MUST be mapped to a single ASCII space character (e.g., - // "St Peter" is mapped to "St Peter"). - - for nSrc < len(src) { - r, size := utf8.DecodeRune(src[nSrc:]) - if size == 0 { // Incomplete UTF-8 encoding - if !atEOF { - return nDst, nSrc, transform.ErrShortSrc - } - size = 1 - } - if unicode.Is(unicode.Zs, r) { - t.prevSpace = true - } else { - if t.prevSpace && t.notStart { - dst[nDst] = ' ' - nDst += 1 - } - if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { - nDst += size - return nDst, nSrc, transform.ErrShortDst - } - nDst += size - t.prevSpace = false - t.notStart = true - } - nSrc += size - } - return nDst, nSrc, nil -} diff --git a/vendor/golang.org/x/text/secure/precis/options.go b/vendor/golang.org/x/text/secure/precis/options.go deleted file mode 100644 index 488f0b1f7..000000000 --- a/vendor/golang.org/x/text/secure/precis/options.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package precis - -import ( - "golang.org/x/text/cases" - "golang.org/x/text/language" - "golang.org/x/text/runes" - "golang.org/x/text/transform" - "golang.org/x/text/unicode/norm" -) - -// An Option is used to define the behavior and rules of a Profile. -type Option func(*options) - -type options struct { - // Preparation options - foldWidth bool - - // Enforcement options - asciiLower bool - cases transform.SpanningTransformer - disallow runes.Set - norm transform.SpanningTransformer - additional []func() transform.SpanningTransformer - width transform.SpanningTransformer - disallowEmpty bool - bidiRule bool - - // Comparison options - ignorecase bool -} - -func getOpts(o ...Option) (res options) { - for _, f := range o { - f(&res) - } - // Using a SpanningTransformer, instead of norm.Form prevents an allocation - // down the road. - if res.norm == nil { - res.norm = norm.NFC - } - return -} - -var ( - // The IgnoreCase option causes the profile to perform a case insensitive - // comparison during the PRECIS comparison step. - IgnoreCase Option = ignoreCase - - // The FoldWidth option causes the profile to map non-canonical wide and - // narrow variants to their decomposition mapping. This is useful for - // profiles that are based on the identifier class which would otherwise - // disallow such characters. - FoldWidth Option = foldWidth - - // The DisallowEmpty option causes the enforcement step to return an error if - // the resulting string would be empty. - DisallowEmpty Option = disallowEmpty - - // The BidiRule option causes the Bidi Rule defined in RFC 5893 to be - // applied. - BidiRule Option = bidiRule -) - -var ( - ignoreCase = func(o *options) { - o.ignorecase = true - } - foldWidth = func(o *options) { - o.foldWidth = true - } - disallowEmpty = func(o *options) { - o.disallowEmpty = true - } - bidiRule = func(o *options) { - o.bidiRule = true - } -) - -// TODO: move this logic to package transform - -type spanWrap struct{ transform.Transformer } - -func (s spanWrap) Span(src []byte, atEOF bool) (n int, err error) { - return 0, transform.ErrEndOfSpan -} - -// TODO: allow different types? For instance: -// func() transform.Transformer -// func() transform.SpanningTransformer -// func([]byte) bool // validation only -// -// Also, would be great if we could detect if a transformer is reentrant. - -// The AdditionalMapping option defines the additional mapping rule for the -// Profile by applying Transformer's in sequence. -func AdditionalMapping(t ...func() transform.Transformer) Option { - return func(o *options) { - for _, f := range t { - sf := func() transform.SpanningTransformer { - return f().(transform.SpanningTransformer) - } - if _, ok := f().(transform.SpanningTransformer); !ok { - sf = func() transform.SpanningTransformer { - return spanWrap{f()} - } - } - o.additional = append(o.additional, sf) - } - } -} - -// The Norm option defines a Profile's normalization rule. Defaults to NFC. -func Norm(f norm.Form) Option { - return func(o *options) { - o.norm = f - } -} - -// The FoldCase option defines a Profile's case mapping rule. Options can be -// provided to determine the type of case folding used. -func FoldCase(opts ...cases.Option) Option { - return func(o *options) { - o.asciiLower = true - o.cases = cases.Fold(opts...) - } -} - -// The LowerCase option defines a Profile's case mapping rule. Options can be -// provided to determine the type of case folding used. -func LowerCase(opts ...cases.Option) Option { - return func(o *options) { - o.asciiLower = true - if len(opts) == 0 { - o.cases = cases.Lower(language.Und, cases.HandleFinalSigma(false)) - return - } - - opts = append([]cases.Option{cases.HandleFinalSigma(false)}, opts...) - o.cases = cases.Lower(language.Und, opts...) - } -} - -// The Disallow option further restricts a Profile's allowed characters beyond -// what is disallowed by the underlying string class. -func Disallow(set runes.Set) Option { - return func(o *options) { - o.disallow = set - } -} diff --git a/vendor/golang.org/x/text/secure/precis/profile.go b/vendor/golang.org/x/text/secure/precis/profile.go deleted file mode 100644 index bf1025338..000000000 --- a/vendor/golang.org/x/text/secure/precis/profile.go +++ /dev/null @@ -1,378 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package precis - -import ( - "bytes" - "errors" - "unicode/utf8" - - "golang.org/x/text/cases" - "golang.org/x/text/language" - "golang.org/x/text/runes" - "golang.org/x/text/secure/bidirule" - "golang.org/x/text/transform" - "golang.org/x/text/width" -) - -var ( - errDisallowedRune = errors.New("precis: disallowed rune encountered") -) - -var dpTrie = newDerivedPropertiesTrie(0) - -// A Profile represents a set of rules for normalizing and validating strings in -// the PRECIS framework. -type Profile struct { - options - class *class -} - -// NewIdentifier creates a new PRECIS profile based on the Identifier string -// class. Profiles created from this class are suitable for use where safety is -// prioritized over expressiveness like network identifiers, user accounts, chat -// rooms, and file names. -func NewIdentifier(opts ...Option) *Profile { - return &Profile{ - options: getOpts(opts...), - class: identifier, - } -} - -// NewFreeform creates a new PRECIS profile based on the Freeform string class. -// Profiles created from this class are suitable for use where expressiveness is -// prioritized over safety like passwords, and display-elements such as -// nicknames in a chat room. -func NewFreeform(opts ...Option) *Profile { - return &Profile{ - options: getOpts(opts...), - class: freeform, - } -} - -// NewTransformer creates a new transform.Transformer that performs the PRECIS -// preparation and enforcement steps on the given UTF-8 encoded bytes. -func (p *Profile) NewTransformer() *Transformer { - var ts []transform.Transformer - - // These transforms are applied in the order defined in - // https://tools.ietf.org/html/rfc7564#section-7 - - if p.options.foldWidth { - ts = append(ts, width.Fold) - } - - for _, f := range p.options.additional { - ts = append(ts, f()) - } - - if p.options.cases != nil { - ts = append(ts, p.options.cases) - } - - ts = append(ts, p.options.norm) - - if p.options.bidiRule { - ts = append(ts, bidirule.New()) - } - - ts = append(ts, &checker{p: p, allowed: p.Allowed()}) - - // TODO: Add the disallow empty rule with a dummy transformer? - - return &Transformer{transform.Chain(ts...)} -} - -var errEmptyString = errors.New("precis: transformation resulted in empty string") - -type buffers struct { - src []byte - buf [2][]byte - next int -} - -func (b *buffers) apply(t transform.SpanningTransformer) (err error) { - n, err := t.Span(b.src, true) - if err != transform.ErrEndOfSpan { - return err - } - x := b.next & 1 - if b.buf[x] == nil { - b.buf[x] = make([]byte, 0, 8+len(b.src)+len(b.src)>>2) - } - span := append(b.buf[x][:0], b.src[:n]...) - b.src, _, err = transform.Append(t, span, b.src[n:]) - b.buf[x] = b.src - b.next++ - return err -} - -// Pre-allocate transformers when possible. In some cases this avoids allocation. -var ( - foldWidthT transform.SpanningTransformer = width.Fold - lowerCaseT transform.SpanningTransformer = cases.Lower(language.Und, cases.HandleFinalSigma(false)) -) - -// TODO: make this a method on profile. - -func (b *buffers) enforce(p *Profile, src []byte, comparing bool) (str []byte, err error) { - b.src = src - - ascii := true - for _, c := range src { - if c >= utf8.RuneSelf { - ascii = false - break - } - } - // ASCII fast path. - if ascii { - for _, f := range p.options.additional { - if err = b.apply(f()); err != nil { - return nil, err - } - } - switch { - case p.options.asciiLower || (comparing && p.options.ignorecase): - for i, c := range b.src { - if 'A' <= c && c <= 'Z' { - b.src[i] = c ^ 1<<5 - } - } - case p.options.cases != nil: - b.apply(p.options.cases) - } - c := checker{p: p} - if _, err := c.span(b.src, true); err != nil { - return nil, err - } - if p.disallow != nil { - for _, c := range b.src { - if p.disallow.Contains(rune(c)) { - return nil, errDisallowedRune - } - } - } - if p.options.disallowEmpty && len(b.src) == 0 { - return nil, errEmptyString - } - return b.src, nil - } - - // These transforms are applied in the order defined in - // https://tools.ietf.org/html/rfc7564#section-7 - - // TODO: allow different width transforms options. - if p.options.foldWidth || (p.options.ignorecase && comparing) { - b.apply(foldWidthT) - } - for _, f := range p.options.additional { - if err = b.apply(f()); err != nil { - return nil, err - } - } - if p.options.cases != nil { - b.apply(p.options.cases) - } - if comparing && p.options.ignorecase { - b.apply(lowerCaseT) - } - b.apply(p.norm) - if p.options.bidiRule && !bidirule.Valid(b.src) { - return nil, bidirule.ErrInvalid - } - c := checker{p: p} - if _, err := c.span(b.src, true); err != nil { - return nil, err - } - if p.disallow != nil { - for i := 0; i < len(b.src); { - r, size := utf8.DecodeRune(b.src[i:]) - if p.disallow.Contains(r) { - return nil, errDisallowedRune - } - i += size - } - } - if p.options.disallowEmpty && len(b.src) == 0 { - return nil, errEmptyString - } - return b.src, nil -} - -// Append appends the result of applying p to src writing the result to dst. -// It returns an error if the input string is invalid. -func (p *Profile) Append(dst, src []byte) ([]byte, error) { - var buf buffers - b, err := buf.enforce(p, src, false) - if err != nil { - return nil, err - } - return append(dst, b...), nil -} - -func processBytes(p *Profile, b []byte, key bool) ([]byte, error) { - var buf buffers - b, err := buf.enforce(p, b, key) - if err != nil { - return nil, err - } - if buf.next == 0 { - c := make([]byte, len(b)) - copy(c, b) - return c, nil - } - return b, nil -} - -// Bytes returns a new byte slice with the result of applying the profile to b. -func (p *Profile) Bytes(b []byte) ([]byte, error) { - return processBytes(p, b, false) -} - -// AppendCompareKey appends the result of applying p to src (including any -// optional rules to make strings comparable or useful in a map key such as -// applying lowercasing) writing the result to dst. It returns an error if the -// input string is invalid. -func (p *Profile) AppendCompareKey(dst, src []byte) ([]byte, error) { - var buf buffers - b, err := buf.enforce(p, src, true) - if err != nil { - return nil, err - } - return append(dst, b...), nil -} - -func processString(p *Profile, s string, key bool) (string, error) { - var buf buffers - b, err := buf.enforce(p, []byte(s), key) - if err != nil { - return "", err - } - return string(b), nil -} - -// String returns a string with the result of applying the profile to s. -func (p *Profile) String(s string) (string, error) { - return processString(p, s, false) -} - -// CompareKey returns a string that can be used for comparison, hashing, or -// collation. -func (p *Profile) CompareKey(s string) (string, error) { - return processString(p, s, true) -} - -// Compare enforces both strings, and then compares them for bit-string identity -// (byte-for-byte equality). If either string cannot be enforced, the comparison -// is false. -func (p *Profile) Compare(a, b string) bool { - var buf buffers - - akey, err := buf.enforce(p, []byte(a), true) - if err != nil { - return false - } - - buf = buffers{} - bkey, err := buf.enforce(p, []byte(b), true) - if err != nil { - return false - } - - return bytes.Compare(akey, bkey) == 0 -} - -// Allowed returns a runes.Set containing every rune that is a member of the -// underlying profile's string class and not disallowed by any profile specific -// rules. -func (p *Profile) Allowed() runes.Set { - if p.options.disallow != nil { - return runes.Predicate(func(r rune) bool { - return p.class.Contains(r) && !p.options.disallow.Contains(r) - }) - } - return p.class -} - -type checker struct { - p *Profile - allowed runes.Set - - beforeBits catBitmap - termBits catBitmap - acceptBits catBitmap -} - -func (c *checker) Reset() { - c.beforeBits = 0 - c.termBits = 0 - c.acceptBits = 0 -} - -func (c *checker) span(src []byte, atEOF bool) (n int, err error) { - for n < len(src) { - e, sz := dpTrie.lookup(src[n:]) - d := categoryTransitions[category(e&catMask)] - if sz == 0 { - if !atEOF { - return n, transform.ErrShortSrc - } - return n, errDisallowedRune - } - doLookAhead := false - if property(e) < c.p.class.validFrom { - if d.rule == nil { - return n, errDisallowedRune - } - doLookAhead, err = d.rule(c.beforeBits) - if err != nil { - return n, err - } - } - c.beforeBits &= d.keep - c.beforeBits |= d.set - if c.termBits != 0 { - // We are currently in an unterminated lookahead. - if c.beforeBits&c.termBits != 0 { - c.termBits = 0 - c.acceptBits = 0 - } else if c.beforeBits&c.acceptBits == 0 { - // Invalid continuation of the unterminated lookahead sequence. - return n, errContext - } - } - if doLookAhead { - if c.termBits != 0 { - // A previous lookahead run has not been terminated yet. - return n, errContext - } - c.termBits = d.term - c.acceptBits = d.accept - } - n += sz - } - if m := c.beforeBits >> finalShift; c.beforeBits&m != m || c.termBits != 0 { - err = errContext - } - return n, err -} - -// TODO: we may get rid of this transform if transform.Chain understands -// something like a Spanner interface. -func (c checker) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - short := false - if len(dst) < len(src) { - src = src[:len(dst)] - atEOF = false - short = true - } - nSrc, err = c.span(src, atEOF) - nDst = copy(dst, src[:nSrc]) - if short && (err == transform.ErrShortSrc || err == nil) { - err = transform.ErrShortDst - } - return nDst, nSrc, err -} diff --git a/vendor/golang.org/x/text/secure/precis/profile_test.go b/vendor/golang.org/x/text/secure/precis/profile_test.go deleted file mode 100644 index 916fc8b6d..000000000 --- a/vendor/golang.org/x/text/secure/precis/profile_test.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package precis - -import ( - "fmt" - "math/rand" - "testing" - "unicode" - - "golang.org/x/text/internal/testtext" - "golang.org/x/text/transform" -) - -// copyOrbit is a Transformer for the sole purpose of testing the apply method, -// testing that apply will always call Span for the prefix of the input that -// remains identical and then call Transform for the remainder. It will produce -// inconsistent output for other usage patterns. -// Provided that copyOrbit is used this way, the first t bytes of the output -// will be identical to the input and the remaining output will be the result -// of calling caseOrbit on the remaining input bytes. -type copyOrbit int - -func (t copyOrbit) Reset() {} -func (t copyOrbit) Span(src []byte, atEOF bool) (n int, err error) { - if int(t) == len(src) { - return int(t), nil - } - return int(t), transform.ErrEndOfSpan -} - -// Transform implements transform.Transformer specifically for testing the apply method. -// See documentation of copyOrbit before using this method. -func (t copyOrbit) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - n := copy(dst, src) - for i, c := range dst[:n] { - dst[i] = orbitCase(c) - } - return n, n, nil -} - -func orbitCase(c byte) byte { - if unicode.IsLower(rune(c)) { - return byte(unicode.ToUpper(rune(c))) - } else { - return byte(unicode.ToLower(rune(c))) - } -} - -func TestBuffers(t *testing.T) { - want := "Those who cannot remember the past are condemned to compute it." - - spans := rand.Perm(len(want) + 1) - - // Compute the result of applying copyOrbit(span) transforms in reverse. - input := []byte(want) - for i := len(spans) - 1; i >= 0; i-- { - for j := spans[i]; j < len(input); j++ { - input[j] = orbitCase(input[j]) - } - } - - // Apply the copyOrbit(span) transforms. - b := buffers{src: input} - for _, n := range spans { - b.apply(copyOrbit(n)) - if n%11 == 0 { - b.apply(transform.Nop) - } - } - if got := string(b.src); got != want { - t.Errorf("got %q; want %q", got, want) - } -} - -type compareTestCase struct { - a string - b string - result bool -} - -var compareTestCases = []struct { - name string - p *Profile - cases []compareTestCase -}{ - {"Nickname", Nickname, []compareTestCase{ - {"a", "b", false}, - {" Swan of Avon ", "swan of avon", true}, - {"Foo", "foo", true}, - {"foo", "foo", true}, - {"Foo Bar", "foo bar", true}, - {"foo bar", "foo bar", true}, - {"\u03A3", "\u03C3", true}, - {"\u03A3", "\u03C2", false}, - {"\u03C3", "\u03C2", false}, - {"Richard \u2163", "richard iv", true}, - {"Å", "å", true}, - {"ff", "ff", true}, // because of NFKC - {"ß", "sS", false}, - - // After applying the Nickname profile, \u00a8 becomes \u0020\u0308, - // however because the nickname profile is not idempotent, applying it again - // to \u0020\u0308 results in \u0308. This behavior is "correct", even if it - // is unexpected. - {"\u00a8", "\u0020\u0308", false}, - {"\u0020\u0308", "\u0308", true}, - }}, -} - -func doCompareTests(t *testing.T, fn func(t *testing.T, p *Profile, tc compareTestCase)) { - for _, g := range compareTestCases { - for i, tc := range g.cases { - name := fmt.Sprintf("%s:%d:%+q", g.name, i, tc.a) - testtext.Run(t, name, func(t *testing.T) { - fn(t, g.p, tc) - }) - } - } -} - -func TestCompare(t *testing.T) { - doCompareTests(t, func(t *testing.T, p *Profile, tc compareTestCase) { - if result := p.Compare(tc.a, tc.b); result != tc.result { - t.Errorf("got %v; want %v", result, tc.result) - } - }) -} - -func TestCompareString(t *testing.T) { - doCompareTests(t, func(t *testing.T, p *Profile, tc compareTestCase) { - a, err := p.CompareKey(tc.a) - if err != nil { - t.Errorf("Unexpected error when creating key: %v", err) - return - } - b, err := p.CompareKey(tc.b) - if err != nil { - t.Errorf("Unexpected error when creating key: %v", err) - return - } - - if result := (a == b); result != tc.result { - t.Errorf("got %v; want %v", result, tc.result) - } - }) -} diff --git a/vendor/golang.org/x/text/secure/precis/profiles.go b/vendor/golang.org/x/text/secure/precis/profiles.go deleted file mode 100644 index 86010025c..000000000 --- a/vendor/golang.org/x/text/secure/precis/profiles.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package precis - -import ( - "unicode" - - "golang.org/x/text/runes" - "golang.org/x/text/transform" - "golang.org/x/text/unicode/norm" -) - -var ( - // Implements the Nickname profile specified in RFC 7700. - // The nickname profile is not idempotent and may need to be applied multiple - // times before being used for comparisons. - Nickname *Profile = nickname - - // Implements the UsernameCaseMapped profile specified in RFC 7613. - UsernameCaseMapped *Profile = usernameCaseMap - - // Implements the UsernameCasePreserved profile specified in RFC 7613. - UsernameCasePreserved *Profile = usernameNoCaseMap - - // Implements the OpaqueString profile defined in RFC 7613 for passwords and other secure labels. - OpaqueString *Profile = opaquestring -) - -var ( - nickname = &Profile{ - options: getOpts( - AdditionalMapping(func() transform.Transformer { - return &nickAdditionalMapping{} - }), - IgnoreCase, - Norm(norm.NFKC), - DisallowEmpty, - ), - class: freeform, - } - usernameCaseMap = &Profile{ - options: getOpts( - FoldWidth, - LowerCase(), - Norm(norm.NFC), - BidiRule, - ), - class: identifier, - } - usernameNoCaseMap = &Profile{ - options: getOpts( - FoldWidth, - Norm(norm.NFC), - BidiRule, - ), - class: identifier, - } - opaquestring = &Profile{ - options: getOpts( - AdditionalMapping(func() transform.Transformer { - return mapSpaces - }), - Norm(norm.NFC), - DisallowEmpty, - ), - class: freeform, - } -) - -// mapSpaces is a shared value of a runes.Map transformer. -var mapSpaces transform.Transformer = runes.Map(func(r rune) rune { - if unicode.Is(unicode.Zs, r) { - return ' ' - } - return r -}) diff --git a/vendor/golang.org/x/text/secure/precis/tables.go b/vendor/golang.org/x/text/secure/precis/tables.go deleted file mode 100644 index 2f550c1ef..000000000 --- a/vendor/golang.org/x/text/secure/precis/tables.go +++ /dev/null @@ -1,3788 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package precis - -// UnicodeVersion is the Unicode version from which the tables in this package are derived. -const UnicodeVersion = "9.0.0" - -// lookup returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *derivedPropertiesTrie) lookup(s []byte) (v uint8, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return derivedPropertiesValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := derivedPropertiesIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := derivedPropertiesIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = derivedPropertiesIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := derivedPropertiesIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = derivedPropertiesIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = derivedPropertiesIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *derivedPropertiesTrie) lookupUnsafe(s []byte) uint8 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return derivedPropertiesValues[c0] - } - i := derivedPropertiesIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// lookupString returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *derivedPropertiesTrie) lookupString(s string) (v uint8, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return derivedPropertiesValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := derivedPropertiesIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := derivedPropertiesIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = derivedPropertiesIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := derivedPropertiesIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = derivedPropertiesIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = derivedPropertiesIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *derivedPropertiesTrie) lookupStringUnsafe(s string) uint8 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return derivedPropertiesValues[c0] - } - i := derivedPropertiesIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// derivedPropertiesTrie. Total size: 25344 bytes (24.75 KiB). Checksum: c5b977d76d42d8a. -type derivedPropertiesTrie struct{} - -func newDerivedPropertiesTrie(i int) *derivedPropertiesTrie { - return &derivedPropertiesTrie{} -} - -// lookupValue determines the type of block n and looks up the value for b. -func (t *derivedPropertiesTrie) lookupValue(n uint32, b byte) uint8 { - switch { - default: - return uint8(derivedPropertiesValues[n<<6+uint32(b)]) - } -} - -// derivedPropertiesValues: 324 blocks, 20736 entries, 20736 bytes -// The third block is the zero block. -var derivedPropertiesValues = [20736]uint8{ - // Block 0x0, offset 0x0 - 0x00: 0x0040, 0x01: 0x0040, 0x02: 0x0040, 0x03: 0x0040, 0x04: 0x0040, 0x05: 0x0040, - 0x06: 0x0040, 0x07: 0x0040, 0x08: 0x0040, 0x09: 0x0040, 0x0a: 0x0040, 0x0b: 0x0040, - 0x0c: 0x0040, 0x0d: 0x0040, 0x0e: 0x0040, 0x0f: 0x0040, 0x10: 0x0040, 0x11: 0x0040, - 0x12: 0x0040, 0x13: 0x0040, 0x14: 0x0040, 0x15: 0x0040, 0x16: 0x0040, 0x17: 0x0040, - 0x18: 0x0040, 0x19: 0x0040, 0x1a: 0x0040, 0x1b: 0x0040, 0x1c: 0x0040, 0x1d: 0x0040, - 0x1e: 0x0040, 0x1f: 0x0040, 0x20: 0x0080, 0x21: 0x00c0, 0x22: 0x00c0, 0x23: 0x00c0, - 0x24: 0x00c0, 0x25: 0x00c0, 0x26: 0x00c0, 0x27: 0x00c0, 0x28: 0x00c0, 0x29: 0x00c0, - 0x2a: 0x00c0, 0x2b: 0x00c0, 0x2c: 0x00c0, 0x2d: 0x00c0, 0x2e: 0x00c0, 0x2f: 0x00c0, - 0x30: 0x00c0, 0x31: 0x00c0, 0x32: 0x00c0, 0x33: 0x00c0, 0x34: 0x00c0, 0x35: 0x00c0, - 0x36: 0x00c0, 0x37: 0x00c0, 0x38: 0x00c0, 0x39: 0x00c0, 0x3a: 0x00c0, 0x3b: 0x00c0, - 0x3c: 0x00c0, 0x3d: 0x00c0, 0x3e: 0x00c0, 0x3f: 0x00c0, - // Block 0x1, offset 0x40 - 0x40: 0x00c0, 0x41: 0x00c0, 0x42: 0x00c0, 0x43: 0x00c0, 0x44: 0x00c0, 0x45: 0x00c0, - 0x46: 0x00c0, 0x47: 0x00c0, 0x48: 0x00c0, 0x49: 0x00c0, 0x4a: 0x00c0, 0x4b: 0x00c0, - 0x4c: 0x00c0, 0x4d: 0x00c0, 0x4e: 0x00c0, 0x4f: 0x00c0, 0x50: 0x00c0, 0x51: 0x00c0, - 0x52: 0x00c0, 0x53: 0x00c0, 0x54: 0x00c0, 0x55: 0x00c0, 0x56: 0x00c0, 0x57: 0x00c0, - 0x58: 0x00c0, 0x59: 0x00c0, 0x5a: 0x00c0, 0x5b: 0x00c0, 0x5c: 0x00c0, 0x5d: 0x00c0, - 0x5e: 0x00c0, 0x5f: 0x00c0, 0x60: 0x00c0, 0x61: 0x00c0, 0x62: 0x00c0, 0x63: 0x00c0, - 0x64: 0x00c0, 0x65: 0x00c0, 0x66: 0x00c0, 0x67: 0x00c0, 0x68: 0x00c0, 0x69: 0x00c0, - 0x6a: 0x00c0, 0x6b: 0x00c0, 0x6c: 0x00c7, 0x6d: 0x00c0, 0x6e: 0x00c0, 0x6f: 0x00c0, - 0x70: 0x00c0, 0x71: 0x00c0, 0x72: 0x00c0, 0x73: 0x00c0, 0x74: 0x00c0, 0x75: 0x00c0, - 0x76: 0x00c0, 0x77: 0x00c0, 0x78: 0x00c0, 0x79: 0x00c0, 0x7a: 0x00c0, 0x7b: 0x00c0, - 0x7c: 0x00c0, 0x7d: 0x00c0, 0x7e: 0x00c0, 0x7f: 0x0040, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, - 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, - 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, - 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, - 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, - 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x0080, 0xe1: 0x0080, 0xe2: 0x0080, 0xe3: 0x0080, - 0xe4: 0x0080, 0xe5: 0x0080, 0xe6: 0x0080, 0xe7: 0x0080, 0xe8: 0x0080, 0xe9: 0x0080, - 0xea: 0x0080, 0xeb: 0x0080, 0xec: 0x0080, 0xed: 0x0040, 0xee: 0x0080, 0xef: 0x0080, - 0xf0: 0x0080, 0xf1: 0x0080, 0xf2: 0x0080, 0xf3: 0x0080, 0xf4: 0x0080, 0xf5: 0x0080, - 0xf6: 0x0080, 0xf7: 0x004f, 0xf8: 0x0080, 0xf9: 0x0080, 0xfa: 0x0080, 0xfb: 0x0080, - 0xfc: 0x0080, 0xfd: 0x0080, 0xfe: 0x0080, 0xff: 0x0080, - // Block 0x4, offset 0x100 - 0x100: 0x00c0, 0x101: 0x00c0, 0x102: 0x00c0, 0x103: 0x00c0, 0x104: 0x00c0, 0x105: 0x00c0, - 0x106: 0x00c0, 0x107: 0x00c0, 0x108: 0x00c0, 0x109: 0x00c0, 0x10a: 0x00c0, 0x10b: 0x00c0, - 0x10c: 0x00c0, 0x10d: 0x00c0, 0x10e: 0x00c0, 0x10f: 0x00c0, 0x110: 0x00c0, 0x111: 0x00c0, - 0x112: 0x00c0, 0x113: 0x00c0, 0x114: 0x00c0, 0x115: 0x00c0, 0x116: 0x00c0, 0x117: 0x0080, - 0x118: 0x00c0, 0x119: 0x00c0, 0x11a: 0x00c0, 0x11b: 0x00c0, 0x11c: 0x00c0, 0x11d: 0x00c0, - 0x11e: 0x00c0, 0x11f: 0x00c0, 0x120: 0x00c0, 0x121: 0x00c0, 0x122: 0x00c0, 0x123: 0x00c0, - 0x124: 0x00c0, 0x125: 0x00c0, 0x126: 0x00c0, 0x127: 0x00c0, 0x128: 0x00c0, 0x129: 0x00c0, - 0x12a: 0x00c0, 0x12b: 0x00c0, 0x12c: 0x00c0, 0x12d: 0x00c0, 0x12e: 0x00c0, 0x12f: 0x00c0, - 0x130: 0x00c0, 0x131: 0x00c0, 0x132: 0x00c0, 0x133: 0x00c0, 0x134: 0x00c0, 0x135: 0x00c0, - 0x136: 0x00c0, 0x137: 0x0080, 0x138: 0x00c0, 0x139: 0x00c0, 0x13a: 0x00c0, 0x13b: 0x00c0, - 0x13c: 0x00c0, 0x13d: 0x00c0, 0x13e: 0x00c0, 0x13f: 0x00c0, - // Block 0x5, offset 0x140 - 0x140: 0x00c0, 0x141: 0x00c0, 0x142: 0x00c0, 0x143: 0x00c0, 0x144: 0x00c0, 0x145: 0x00c0, - 0x146: 0x00c0, 0x147: 0x00c0, 0x148: 0x00c0, 0x149: 0x00c0, 0x14a: 0x00c0, 0x14b: 0x00c0, - 0x14c: 0x00c0, 0x14d: 0x00c0, 0x14e: 0x00c0, 0x14f: 0x00c0, 0x150: 0x00c0, 0x151: 0x00c0, - 0x152: 0x00c0, 0x153: 0x00c0, 0x154: 0x00c0, 0x155: 0x00c0, 0x156: 0x00c0, 0x157: 0x00c0, - 0x158: 0x00c0, 0x159: 0x00c0, 0x15a: 0x00c0, 0x15b: 0x00c0, 0x15c: 0x00c0, 0x15d: 0x00c0, - 0x15e: 0x00c0, 0x15f: 0x00c0, 0x160: 0x00c0, 0x161: 0x00c0, 0x162: 0x00c0, 0x163: 0x00c0, - 0x164: 0x00c0, 0x165: 0x00c0, 0x166: 0x00c0, 0x167: 0x00c0, 0x168: 0x00c0, 0x169: 0x00c0, - 0x16a: 0x00c0, 0x16b: 0x00c0, 0x16c: 0x00c0, 0x16d: 0x00c0, 0x16e: 0x00c0, 0x16f: 0x00c0, - 0x170: 0x00c0, 0x171: 0x00c0, 0x172: 0x0080, 0x173: 0x0080, 0x174: 0x00c0, 0x175: 0x00c0, - 0x176: 0x00c0, 0x177: 0x00c0, 0x178: 0x00c0, 0x179: 0x00c0, 0x17a: 0x00c0, 0x17b: 0x00c0, - 0x17c: 0x00c0, 0x17d: 0x00c0, 0x17e: 0x00c0, 0x17f: 0x0080, - // Block 0x6, offset 0x180 - 0x180: 0x0080, 0x181: 0x00c0, 0x182: 0x00c0, 0x183: 0x00c0, 0x184: 0x00c0, 0x185: 0x00c0, - 0x186: 0x00c0, 0x187: 0x00c0, 0x188: 0x00c0, 0x189: 0x0080, 0x18a: 0x00c0, 0x18b: 0x00c0, - 0x18c: 0x00c0, 0x18d: 0x00c0, 0x18e: 0x00c0, 0x18f: 0x00c0, 0x190: 0x00c0, 0x191: 0x00c0, - 0x192: 0x00c0, 0x193: 0x00c0, 0x194: 0x00c0, 0x195: 0x00c0, 0x196: 0x00c0, 0x197: 0x00c0, - 0x198: 0x00c0, 0x199: 0x00c0, 0x19a: 0x00c0, 0x19b: 0x00c0, 0x19c: 0x00c0, 0x19d: 0x00c0, - 0x19e: 0x00c0, 0x19f: 0x00c0, 0x1a0: 0x00c0, 0x1a1: 0x00c0, 0x1a2: 0x00c0, 0x1a3: 0x00c0, - 0x1a4: 0x00c0, 0x1a5: 0x00c0, 0x1a6: 0x00c0, 0x1a7: 0x00c0, 0x1a8: 0x00c0, 0x1a9: 0x00c0, - 0x1aa: 0x00c0, 0x1ab: 0x00c0, 0x1ac: 0x00c0, 0x1ad: 0x00c0, 0x1ae: 0x00c0, 0x1af: 0x00c0, - 0x1b0: 0x00c0, 0x1b1: 0x00c0, 0x1b2: 0x00c0, 0x1b3: 0x00c0, 0x1b4: 0x00c0, 0x1b5: 0x00c0, - 0x1b6: 0x00c0, 0x1b7: 0x00c0, 0x1b8: 0x00c0, 0x1b9: 0x00c0, 0x1ba: 0x00c0, 0x1bb: 0x00c0, - 0x1bc: 0x00c0, 0x1bd: 0x00c0, 0x1be: 0x00c0, 0x1bf: 0x0080, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x00c0, 0x1c1: 0x00c0, 0x1c2: 0x00c0, 0x1c3: 0x00c0, 0x1c4: 0x00c0, 0x1c5: 0x00c0, - 0x1c6: 0x00c0, 0x1c7: 0x00c0, 0x1c8: 0x00c0, 0x1c9: 0x00c0, 0x1ca: 0x00c0, 0x1cb: 0x00c0, - 0x1cc: 0x00c0, 0x1cd: 0x00c0, 0x1ce: 0x00c0, 0x1cf: 0x00c0, 0x1d0: 0x00c0, 0x1d1: 0x00c0, - 0x1d2: 0x00c0, 0x1d3: 0x00c0, 0x1d4: 0x00c0, 0x1d5: 0x00c0, 0x1d6: 0x00c0, 0x1d7: 0x00c0, - 0x1d8: 0x00c0, 0x1d9: 0x00c0, 0x1da: 0x00c0, 0x1db: 0x00c0, 0x1dc: 0x00c0, 0x1dd: 0x00c0, - 0x1de: 0x00c0, 0x1df: 0x00c0, 0x1e0: 0x00c0, 0x1e1: 0x00c0, 0x1e2: 0x00c0, 0x1e3: 0x00c0, - 0x1e4: 0x00c0, 0x1e5: 0x00c0, 0x1e6: 0x00c0, 0x1e7: 0x00c0, 0x1e8: 0x00c0, 0x1e9: 0x00c0, - 0x1ea: 0x00c0, 0x1eb: 0x00c0, 0x1ec: 0x00c0, 0x1ed: 0x00c0, 0x1ee: 0x00c0, 0x1ef: 0x00c0, - 0x1f0: 0x00c0, 0x1f1: 0x00c0, 0x1f2: 0x00c0, 0x1f3: 0x00c0, 0x1f4: 0x00c0, 0x1f5: 0x00c0, - 0x1f6: 0x00c0, 0x1f7: 0x00c0, 0x1f8: 0x00c0, 0x1f9: 0x00c0, 0x1fa: 0x00c0, 0x1fb: 0x00c0, - 0x1fc: 0x00c0, 0x1fd: 0x00c0, 0x1fe: 0x00c0, 0x1ff: 0x00c0, - // Block 0x8, offset 0x200 - 0x200: 0x00c0, 0x201: 0x00c0, 0x202: 0x00c0, 0x203: 0x00c0, 0x204: 0x0080, 0x205: 0x0080, - 0x206: 0x0080, 0x207: 0x0080, 0x208: 0x0080, 0x209: 0x0080, 0x20a: 0x0080, 0x20b: 0x0080, - 0x20c: 0x0080, 0x20d: 0x00c0, 0x20e: 0x00c0, 0x20f: 0x00c0, 0x210: 0x00c0, 0x211: 0x00c0, - 0x212: 0x00c0, 0x213: 0x00c0, 0x214: 0x00c0, 0x215: 0x00c0, 0x216: 0x00c0, 0x217: 0x00c0, - 0x218: 0x00c0, 0x219: 0x00c0, 0x21a: 0x00c0, 0x21b: 0x00c0, 0x21c: 0x00c0, 0x21d: 0x00c0, - 0x21e: 0x00c0, 0x21f: 0x00c0, 0x220: 0x00c0, 0x221: 0x00c0, 0x222: 0x00c0, 0x223: 0x00c0, - 0x224: 0x00c0, 0x225: 0x00c0, 0x226: 0x00c0, 0x227: 0x00c0, 0x228: 0x00c0, 0x229: 0x00c0, - 0x22a: 0x00c0, 0x22b: 0x00c0, 0x22c: 0x00c0, 0x22d: 0x00c0, 0x22e: 0x00c0, 0x22f: 0x00c0, - 0x230: 0x00c0, 0x231: 0x0080, 0x232: 0x0080, 0x233: 0x0080, 0x234: 0x00c0, 0x235: 0x00c0, - 0x236: 0x00c0, 0x237: 0x00c0, 0x238: 0x00c0, 0x239: 0x00c0, 0x23a: 0x00c0, 0x23b: 0x00c0, - 0x23c: 0x00c0, 0x23d: 0x00c0, 0x23e: 0x00c0, 0x23f: 0x00c0, - // Block 0x9, offset 0x240 - 0x240: 0x00c0, 0x241: 0x00c0, 0x242: 0x00c0, 0x243: 0x00c0, 0x244: 0x00c0, 0x245: 0x00c0, - 0x246: 0x00c0, 0x247: 0x00c0, 0x248: 0x00c0, 0x249: 0x00c0, 0x24a: 0x00c0, 0x24b: 0x00c0, - 0x24c: 0x00c0, 0x24d: 0x00c0, 0x24e: 0x00c0, 0x24f: 0x00c0, 0x250: 0x00c0, 0x251: 0x00c0, - 0x252: 0x00c0, 0x253: 0x00c0, 0x254: 0x00c0, 0x255: 0x00c0, 0x256: 0x00c0, 0x257: 0x00c0, - 0x258: 0x00c0, 0x259: 0x00c0, 0x25a: 0x00c0, 0x25b: 0x00c0, 0x25c: 0x00c0, 0x25d: 0x00c0, - 0x25e: 0x00c0, 0x25f: 0x00c0, 0x260: 0x00c0, 0x261: 0x00c0, 0x262: 0x00c0, 0x263: 0x00c0, - 0x264: 0x00c0, 0x265: 0x00c0, 0x266: 0x00c0, 0x267: 0x00c0, 0x268: 0x00c0, 0x269: 0x00c0, - 0x26a: 0x00c0, 0x26b: 0x00c0, 0x26c: 0x00c0, 0x26d: 0x00c0, 0x26e: 0x00c0, 0x26f: 0x00c0, - 0x270: 0x0080, 0x271: 0x0080, 0x272: 0x0080, 0x273: 0x0080, 0x274: 0x0080, 0x275: 0x0080, - 0x276: 0x0080, 0x277: 0x0080, 0x278: 0x0080, 0x279: 0x00c0, 0x27a: 0x00c0, 0x27b: 0x00c0, - 0x27c: 0x00c0, 0x27d: 0x00c0, 0x27e: 0x00c0, 0x27f: 0x00c0, - // Block 0xa, offset 0x280 - 0x280: 0x00c0, 0x281: 0x00c0, 0x282: 0x0080, 0x283: 0x0080, 0x284: 0x0080, 0x285: 0x0080, - 0x286: 0x00c0, 0x287: 0x00c0, 0x288: 0x00c0, 0x289: 0x00c0, 0x28a: 0x00c0, 0x28b: 0x00c0, - 0x28c: 0x00c0, 0x28d: 0x00c0, 0x28e: 0x00c0, 0x28f: 0x00c0, 0x290: 0x00c0, 0x291: 0x00c0, - 0x292: 0x0080, 0x293: 0x0080, 0x294: 0x0080, 0x295: 0x0080, 0x296: 0x0080, 0x297: 0x0080, - 0x298: 0x0080, 0x299: 0x0080, 0x29a: 0x0080, 0x29b: 0x0080, 0x29c: 0x0080, 0x29d: 0x0080, - 0x29e: 0x0080, 0x29f: 0x0080, 0x2a0: 0x0080, 0x2a1: 0x0080, 0x2a2: 0x0080, 0x2a3: 0x0080, - 0x2a4: 0x0080, 0x2a5: 0x0080, 0x2a6: 0x0080, 0x2a7: 0x0080, 0x2a8: 0x0080, 0x2a9: 0x0080, - 0x2aa: 0x0080, 0x2ab: 0x0080, 0x2ac: 0x00c0, 0x2ad: 0x0080, 0x2ae: 0x00c0, 0x2af: 0x0080, - 0x2b0: 0x0080, 0x2b1: 0x0080, 0x2b2: 0x0080, 0x2b3: 0x0080, 0x2b4: 0x0080, 0x2b5: 0x0080, - 0x2b6: 0x0080, 0x2b7: 0x0080, 0x2b8: 0x0080, 0x2b9: 0x0080, 0x2ba: 0x0080, 0x2bb: 0x0080, - 0x2bc: 0x0080, 0x2bd: 0x0080, 0x2be: 0x0080, 0x2bf: 0x0080, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x00c3, 0x2c1: 0x00c3, 0x2c2: 0x00c3, 0x2c3: 0x00c3, 0x2c4: 0x00c3, 0x2c5: 0x00c3, - 0x2c6: 0x00c3, 0x2c7: 0x00c3, 0x2c8: 0x00c3, 0x2c9: 0x00c3, 0x2ca: 0x00c3, 0x2cb: 0x00c3, - 0x2cc: 0x00c3, 0x2cd: 0x00c3, 0x2ce: 0x00c3, 0x2cf: 0x00c3, 0x2d0: 0x00c3, 0x2d1: 0x00c3, - 0x2d2: 0x00c3, 0x2d3: 0x00c3, 0x2d4: 0x00c3, 0x2d5: 0x00c3, 0x2d6: 0x00c3, 0x2d7: 0x00c3, - 0x2d8: 0x00c3, 0x2d9: 0x00c3, 0x2da: 0x00c3, 0x2db: 0x00c3, 0x2dc: 0x00c3, 0x2dd: 0x00c3, - 0x2de: 0x00c3, 0x2df: 0x00c3, 0x2e0: 0x00c3, 0x2e1: 0x00c3, 0x2e2: 0x00c3, 0x2e3: 0x00c3, - 0x2e4: 0x00c3, 0x2e5: 0x00c3, 0x2e6: 0x00c3, 0x2e7: 0x00c3, 0x2e8: 0x00c3, 0x2e9: 0x00c3, - 0x2ea: 0x00c3, 0x2eb: 0x00c3, 0x2ec: 0x00c3, 0x2ed: 0x00c3, 0x2ee: 0x00c3, 0x2ef: 0x00c3, - 0x2f0: 0x00c3, 0x2f1: 0x00c3, 0x2f2: 0x00c3, 0x2f3: 0x00c3, 0x2f4: 0x00c3, 0x2f5: 0x00c3, - 0x2f6: 0x00c3, 0x2f7: 0x00c3, 0x2f8: 0x00c3, 0x2f9: 0x00c3, 0x2fa: 0x00c3, 0x2fb: 0x00c3, - 0x2fc: 0x00c3, 0x2fd: 0x00c3, 0x2fe: 0x00c3, 0x2ff: 0x00c3, - // Block 0xc, offset 0x300 - 0x300: 0x0083, 0x301: 0x0083, 0x302: 0x00c3, 0x303: 0x0083, 0x304: 0x0083, 0x305: 0x00c3, - 0x306: 0x00c3, 0x307: 0x00c3, 0x308: 0x00c3, 0x309: 0x00c3, 0x30a: 0x00c3, 0x30b: 0x00c3, - 0x30c: 0x00c3, 0x30d: 0x00c3, 0x30e: 0x00c3, 0x30f: 0x0040, 0x310: 0x00c3, 0x311: 0x00c3, - 0x312: 0x00c3, 0x313: 0x00c3, 0x314: 0x00c3, 0x315: 0x00c3, 0x316: 0x00c3, 0x317: 0x00c3, - 0x318: 0x00c3, 0x319: 0x00c3, 0x31a: 0x00c3, 0x31b: 0x00c3, 0x31c: 0x00c3, 0x31d: 0x00c3, - 0x31e: 0x00c3, 0x31f: 0x00c3, 0x320: 0x00c3, 0x321: 0x00c3, 0x322: 0x00c3, 0x323: 0x00c3, - 0x324: 0x00c3, 0x325: 0x00c3, 0x326: 0x00c3, 0x327: 0x00c3, 0x328: 0x00c3, 0x329: 0x00c3, - 0x32a: 0x00c3, 0x32b: 0x00c3, 0x32c: 0x00c3, 0x32d: 0x00c3, 0x32e: 0x00c3, 0x32f: 0x00c3, - 0x330: 0x00c8, 0x331: 0x00c8, 0x332: 0x00c8, 0x333: 0x00c8, 0x334: 0x0080, 0x335: 0x0050, - 0x336: 0x00c8, 0x337: 0x00c8, 0x33a: 0x0088, 0x33b: 0x00c8, - 0x33c: 0x00c8, 0x33d: 0x00c8, 0x33e: 0x0080, 0x33f: 0x00c8, - // Block 0xd, offset 0x340 - 0x344: 0x0088, 0x345: 0x0080, - 0x346: 0x00c8, 0x347: 0x0080, 0x348: 0x00c8, 0x349: 0x00c8, 0x34a: 0x00c8, - 0x34c: 0x00c8, 0x34e: 0x00c8, 0x34f: 0x00c8, 0x350: 0x00c8, 0x351: 0x00c8, - 0x352: 0x00c8, 0x353: 0x00c8, 0x354: 0x00c8, 0x355: 0x00c8, 0x356: 0x00c8, 0x357: 0x00c8, - 0x358: 0x00c8, 0x359: 0x00c8, 0x35a: 0x00c8, 0x35b: 0x00c8, 0x35c: 0x00c8, 0x35d: 0x00c8, - 0x35e: 0x00c8, 0x35f: 0x00c8, 0x360: 0x00c8, 0x361: 0x00c8, 0x363: 0x00c8, - 0x364: 0x00c8, 0x365: 0x00c8, 0x366: 0x00c8, 0x367: 0x00c8, 0x368: 0x00c8, 0x369: 0x00c8, - 0x36a: 0x00c8, 0x36b: 0x00c8, 0x36c: 0x00c8, 0x36d: 0x00c8, 0x36e: 0x00c8, 0x36f: 0x00c8, - 0x370: 0x00c8, 0x371: 0x00c8, 0x372: 0x00c8, 0x373: 0x00c8, 0x374: 0x00c8, 0x375: 0x00c8, - 0x376: 0x00c8, 0x377: 0x00c8, 0x378: 0x00c8, 0x379: 0x00c8, 0x37a: 0x00c8, 0x37b: 0x00c8, - 0x37c: 0x00c8, 0x37d: 0x00c8, 0x37e: 0x00c8, 0x37f: 0x00c8, - // Block 0xe, offset 0x380 - 0x380: 0x00c8, 0x381: 0x00c8, 0x382: 0x00c8, 0x383: 0x00c8, 0x384: 0x00c8, 0x385: 0x00c8, - 0x386: 0x00c8, 0x387: 0x00c8, 0x388: 0x00c8, 0x389: 0x00c8, 0x38a: 0x00c8, 0x38b: 0x00c8, - 0x38c: 0x00c8, 0x38d: 0x00c8, 0x38e: 0x00c8, 0x38f: 0x00c8, 0x390: 0x0088, 0x391: 0x0088, - 0x392: 0x0088, 0x393: 0x0088, 0x394: 0x0088, 0x395: 0x0088, 0x396: 0x0088, 0x397: 0x00c8, - 0x398: 0x00c8, 0x399: 0x00c8, 0x39a: 0x00c8, 0x39b: 0x00c8, 0x39c: 0x00c8, 0x39d: 0x00c8, - 0x39e: 0x00c8, 0x39f: 0x00c8, 0x3a0: 0x00c8, 0x3a1: 0x00c8, 0x3a2: 0x00c0, 0x3a3: 0x00c0, - 0x3a4: 0x00c0, 0x3a5: 0x00c0, 0x3a6: 0x00c0, 0x3a7: 0x00c0, 0x3a8: 0x00c0, 0x3a9: 0x00c0, - 0x3aa: 0x00c0, 0x3ab: 0x00c0, 0x3ac: 0x00c0, 0x3ad: 0x00c0, 0x3ae: 0x00c0, 0x3af: 0x00c0, - 0x3b0: 0x0088, 0x3b1: 0x0088, 0x3b2: 0x0088, 0x3b3: 0x00c8, 0x3b4: 0x0088, 0x3b5: 0x0088, - 0x3b6: 0x0088, 0x3b7: 0x00c8, 0x3b8: 0x00c8, 0x3b9: 0x0088, 0x3ba: 0x00c8, 0x3bb: 0x00c8, - 0x3bc: 0x00c8, 0x3bd: 0x00c8, 0x3be: 0x00c8, 0x3bf: 0x00c8, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x00c0, 0x3c1: 0x00c0, 0x3c2: 0x0080, 0x3c3: 0x00c3, 0x3c4: 0x00c3, 0x3c5: 0x00c3, - 0x3c6: 0x00c3, 0x3c7: 0x00c3, 0x3c8: 0x0083, 0x3c9: 0x0083, 0x3ca: 0x00c0, 0x3cb: 0x00c0, - 0x3cc: 0x00c0, 0x3cd: 0x00c0, 0x3ce: 0x00c0, 0x3cf: 0x00c0, 0x3d0: 0x00c0, 0x3d1: 0x00c0, - 0x3d2: 0x00c0, 0x3d3: 0x00c0, 0x3d4: 0x00c0, 0x3d5: 0x00c0, 0x3d6: 0x00c0, 0x3d7: 0x00c0, - 0x3d8: 0x00c0, 0x3d9: 0x00c0, 0x3da: 0x00c0, 0x3db: 0x00c0, 0x3dc: 0x00c0, 0x3dd: 0x00c0, - 0x3de: 0x00c0, 0x3df: 0x00c0, 0x3e0: 0x00c0, 0x3e1: 0x00c0, 0x3e2: 0x00c0, 0x3e3: 0x00c0, - 0x3e4: 0x00c0, 0x3e5: 0x00c0, 0x3e6: 0x00c0, 0x3e7: 0x00c0, 0x3e8: 0x00c0, 0x3e9: 0x00c0, - 0x3ea: 0x00c0, 0x3eb: 0x00c0, 0x3ec: 0x00c0, 0x3ed: 0x00c0, 0x3ee: 0x00c0, 0x3ef: 0x00c0, - 0x3f0: 0x00c0, 0x3f1: 0x00c0, 0x3f2: 0x00c0, 0x3f3: 0x00c0, 0x3f4: 0x00c0, 0x3f5: 0x00c0, - 0x3f6: 0x00c0, 0x3f7: 0x00c0, 0x3f8: 0x00c0, 0x3f9: 0x00c0, 0x3fa: 0x00c0, 0x3fb: 0x00c0, - 0x3fc: 0x00c0, 0x3fd: 0x00c0, 0x3fe: 0x00c0, 0x3ff: 0x00c0, - // Block 0x10, offset 0x400 - 0x400: 0x00c0, 0x401: 0x00c0, 0x402: 0x00c0, 0x403: 0x00c0, 0x404: 0x00c0, 0x405: 0x00c0, - 0x406: 0x00c0, 0x407: 0x00c0, 0x408: 0x00c0, 0x409: 0x00c0, 0x40a: 0x00c0, 0x40b: 0x00c0, - 0x40c: 0x00c0, 0x40d: 0x00c0, 0x40e: 0x00c0, 0x40f: 0x00c0, 0x410: 0x00c0, 0x411: 0x00c0, - 0x412: 0x00c0, 0x413: 0x00c0, 0x414: 0x00c0, 0x415: 0x00c0, 0x416: 0x00c0, 0x417: 0x00c0, - 0x418: 0x00c0, 0x419: 0x00c0, 0x41a: 0x00c0, 0x41b: 0x00c0, 0x41c: 0x00c0, 0x41d: 0x00c0, - 0x41e: 0x00c0, 0x41f: 0x00c0, 0x420: 0x00c0, 0x421: 0x00c0, 0x422: 0x00c0, 0x423: 0x00c0, - 0x424: 0x00c0, 0x425: 0x00c0, 0x426: 0x00c0, 0x427: 0x00c0, 0x428: 0x00c0, 0x429: 0x00c0, - 0x42a: 0x00c0, 0x42b: 0x00c0, 0x42c: 0x00c0, 0x42d: 0x00c0, 0x42e: 0x00c0, 0x42f: 0x00c0, - 0x431: 0x00c0, 0x432: 0x00c0, 0x433: 0x00c0, 0x434: 0x00c0, 0x435: 0x00c0, - 0x436: 0x00c0, 0x437: 0x00c0, 0x438: 0x00c0, 0x439: 0x00c0, 0x43a: 0x00c0, 0x43b: 0x00c0, - 0x43c: 0x00c0, 0x43d: 0x00c0, 0x43e: 0x00c0, 0x43f: 0x00c0, - // Block 0x11, offset 0x440 - 0x440: 0x00c0, 0x441: 0x00c0, 0x442: 0x00c0, 0x443: 0x00c0, 0x444: 0x00c0, 0x445: 0x00c0, - 0x446: 0x00c0, 0x447: 0x00c0, 0x448: 0x00c0, 0x449: 0x00c0, 0x44a: 0x00c0, 0x44b: 0x00c0, - 0x44c: 0x00c0, 0x44d: 0x00c0, 0x44e: 0x00c0, 0x44f: 0x00c0, 0x450: 0x00c0, 0x451: 0x00c0, - 0x452: 0x00c0, 0x453: 0x00c0, 0x454: 0x00c0, 0x455: 0x00c0, 0x456: 0x00c0, - 0x459: 0x00c0, 0x45a: 0x0080, 0x45b: 0x0080, 0x45c: 0x0080, 0x45d: 0x0080, - 0x45e: 0x0080, 0x45f: 0x0080, 0x461: 0x00c0, 0x462: 0x00c0, 0x463: 0x00c0, - 0x464: 0x00c0, 0x465: 0x00c0, 0x466: 0x00c0, 0x467: 0x00c0, 0x468: 0x00c0, 0x469: 0x00c0, - 0x46a: 0x00c0, 0x46b: 0x00c0, 0x46c: 0x00c0, 0x46d: 0x00c0, 0x46e: 0x00c0, 0x46f: 0x00c0, - 0x470: 0x00c0, 0x471: 0x00c0, 0x472: 0x00c0, 0x473: 0x00c0, 0x474: 0x00c0, 0x475: 0x00c0, - 0x476: 0x00c0, 0x477: 0x00c0, 0x478: 0x00c0, 0x479: 0x00c0, 0x47a: 0x00c0, 0x47b: 0x00c0, - 0x47c: 0x00c0, 0x47d: 0x00c0, 0x47e: 0x00c0, 0x47f: 0x00c0, - // Block 0x12, offset 0x480 - 0x480: 0x00c0, 0x481: 0x00c0, 0x482: 0x00c0, 0x483: 0x00c0, 0x484: 0x00c0, 0x485: 0x00c0, - 0x486: 0x00c0, 0x487: 0x0080, 0x489: 0x0080, 0x48a: 0x0080, - 0x48d: 0x0080, 0x48e: 0x0080, 0x48f: 0x0080, 0x491: 0x00cb, - 0x492: 0x00cb, 0x493: 0x00cb, 0x494: 0x00cb, 0x495: 0x00cb, 0x496: 0x00cb, 0x497: 0x00cb, - 0x498: 0x00cb, 0x499: 0x00cb, 0x49a: 0x00cb, 0x49b: 0x00cb, 0x49c: 0x00cb, 0x49d: 0x00cb, - 0x49e: 0x00cb, 0x49f: 0x00cb, 0x4a0: 0x00cb, 0x4a1: 0x00cb, 0x4a2: 0x00cb, 0x4a3: 0x00cb, - 0x4a4: 0x00cb, 0x4a5: 0x00cb, 0x4a6: 0x00cb, 0x4a7: 0x00cb, 0x4a8: 0x00cb, 0x4a9: 0x00cb, - 0x4aa: 0x00cb, 0x4ab: 0x00cb, 0x4ac: 0x00cb, 0x4ad: 0x00cb, 0x4ae: 0x00cb, 0x4af: 0x00cb, - 0x4b0: 0x00cb, 0x4b1: 0x00cb, 0x4b2: 0x00cb, 0x4b3: 0x00cb, 0x4b4: 0x00cb, 0x4b5: 0x00cb, - 0x4b6: 0x00cb, 0x4b7: 0x00cb, 0x4b8: 0x00cb, 0x4b9: 0x00cb, 0x4ba: 0x00cb, 0x4bb: 0x00cb, - 0x4bc: 0x00cb, 0x4bd: 0x00cb, 0x4be: 0x008a, 0x4bf: 0x00cb, - // Block 0x13, offset 0x4c0 - 0x4c0: 0x008a, 0x4c1: 0x00cb, 0x4c2: 0x00cb, 0x4c3: 0x008a, 0x4c4: 0x00cb, 0x4c5: 0x00cb, - 0x4c6: 0x008a, 0x4c7: 0x00cb, - 0x4d0: 0x00ca, 0x4d1: 0x00ca, - 0x4d2: 0x00ca, 0x4d3: 0x00ca, 0x4d4: 0x00ca, 0x4d5: 0x00ca, 0x4d6: 0x00ca, 0x4d7: 0x00ca, - 0x4d8: 0x00ca, 0x4d9: 0x00ca, 0x4da: 0x00ca, 0x4db: 0x00ca, 0x4dc: 0x00ca, 0x4dd: 0x00ca, - 0x4de: 0x00ca, 0x4df: 0x00ca, 0x4e0: 0x00ca, 0x4e1: 0x00ca, 0x4e2: 0x00ca, 0x4e3: 0x00ca, - 0x4e4: 0x00ca, 0x4e5: 0x00ca, 0x4e6: 0x00ca, 0x4e7: 0x00ca, 0x4e8: 0x00ca, 0x4e9: 0x00ca, - 0x4ea: 0x00ca, - 0x4f0: 0x00ca, 0x4f1: 0x00ca, 0x4f2: 0x00ca, 0x4f3: 0x0051, 0x4f4: 0x0051, - // Block 0x14, offset 0x500 - 0x500: 0x0040, 0x501: 0x0040, 0x502: 0x0040, 0x503: 0x0040, 0x504: 0x0040, 0x505: 0x0040, - 0x506: 0x0080, 0x507: 0x0080, 0x508: 0x0080, 0x509: 0x0080, 0x50a: 0x0080, 0x50b: 0x0080, - 0x50c: 0x0080, 0x50d: 0x0080, 0x50e: 0x0080, 0x50f: 0x0080, 0x510: 0x00c3, 0x511: 0x00c3, - 0x512: 0x00c3, 0x513: 0x00c3, 0x514: 0x00c3, 0x515: 0x00c3, 0x516: 0x00c3, 0x517: 0x00c3, - 0x518: 0x00c3, 0x519: 0x00c3, 0x51a: 0x00c3, 0x51b: 0x0080, 0x51c: 0x0040, - 0x51e: 0x0080, 0x51f: 0x0080, 0x520: 0x00c2, 0x521: 0x00c0, 0x522: 0x00c4, 0x523: 0x00c4, - 0x524: 0x00c4, 0x525: 0x00c4, 0x526: 0x00c2, 0x527: 0x00c4, 0x528: 0x00c2, 0x529: 0x00c4, - 0x52a: 0x00c2, 0x52b: 0x00c2, 0x52c: 0x00c2, 0x52d: 0x00c2, 0x52e: 0x00c2, 0x52f: 0x00c4, - 0x530: 0x00c4, 0x531: 0x00c4, 0x532: 0x00c4, 0x533: 0x00c2, 0x534: 0x00c2, 0x535: 0x00c2, - 0x536: 0x00c2, 0x537: 0x00c2, 0x538: 0x00c2, 0x539: 0x00c2, 0x53a: 0x00c2, 0x53b: 0x00c2, - 0x53c: 0x00c2, 0x53d: 0x00c2, 0x53e: 0x00c2, 0x53f: 0x00c2, - // Block 0x15, offset 0x540 - 0x540: 0x0040, 0x541: 0x00c2, 0x542: 0x00c2, 0x543: 0x00c2, 0x544: 0x00c2, 0x545: 0x00c2, - 0x546: 0x00c2, 0x547: 0x00c2, 0x548: 0x00c4, 0x549: 0x00c2, 0x54a: 0x00c2, 0x54b: 0x00c3, - 0x54c: 0x00c3, 0x54d: 0x00c3, 0x54e: 0x00c3, 0x54f: 0x00c3, 0x550: 0x00c3, 0x551: 0x00c3, - 0x552: 0x00c3, 0x553: 0x00c3, 0x554: 0x00c3, 0x555: 0x00c3, 0x556: 0x00c3, 0x557: 0x00c3, - 0x558: 0x00c3, 0x559: 0x00c3, 0x55a: 0x00c3, 0x55b: 0x00c3, 0x55c: 0x00c3, 0x55d: 0x00c3, - 0x55e: 0x00c3, 0x55f: 0x00c3, 0x560: 0x0053, 0x561: 0x0053, 0x562: 0x0053, 0x563: 0x0053, - 0x564: 0x0053, 0x565: 0x0053, 0x566: 0x0053, 0x567: 0x0053, 0x568: 0x0053, 0x569: 0x0053, - 0x56a: 0x0080, 0x56b: 0x0080, 0x56c: 0x0080, 0x56d: 0x0080, 0x56e: 0x00c2, 0x56f: 0x00c2, - 0x570: 0x00c3, 0x571: 0x00c4, 0x572: 0x00c4, 0x573: 0x00c4, 0x574: 0x00c0, 0x575: 0x0084, - 0x576: 0x0084, 0x577: 0x0084, 0x578: 0x0082, 0x579: 0x00c2, 0x57a: 0x00c2, 0x57b: 0x00c2, - 0x57c: 0x00c2, 0x57d: 0x00c2, 0x57e: 0x00c2, 0x57f: 0x00c2, - // Block 0x16, offset 0x580 - 0x580: 0x00c2, 0x581: 0x00c2, 0x582: 0x00c2, 0x583: 0x00c2, 0x584: 0x00c2, 0x585: 0x00c2, - 0x586: 0x00c2, 0x587: 0x00c2, 0x588: 0x00c4, 0x589: 0x00c4, 0x58a: 0x00c4, 0x58b: 0x00c4, - 0x58c: 0x00c4, 0x58d: 0x00c4, 0x58e: 0x00c4, 0x58f: 0x00c4, 0x590: 0x00c4, 0x591: 0x00c4, - 0x592: 0x00c4, 0x593: 0x00c4, 0x594: 0x00c4, 0x595: 0x00c4, 0x596: 0x00c4, 0x597: 0x00c4, - 0x598: 0x00c4, 0x599: 0x00c4, 0x59a: 0x00c2, 0x59b: 0x00c2, 0x59c: 0x00c2, 0x59d: 0x00c2, - 0x59e: 0x00c2, 0x59f: 0x00c2, 0x5a0: 0x00c2, 0x5a1: 0x00c2, 0x5a2: 0x00c2, 0x5a3: 0x00c2, - 0x5a4: 0x00c2, 0x5a5: 0x00c2, 0x5a6: 0x00c2, 0x5a7: 0x00c2, 0x5a8: 0x00c2, 0x5a9: 0x00c2, - 0x5aa: 0x00c2, 0x5ab: 0x00c2, 0x5ac: 0x00c2, 0x5ad: 0x00c2, 0x5ae: 0x00c2, 0x5af: 0x00c2, - 0x5b0: 0x00c2, 0x5b1: 0x00c2, 0x5b2: 0x00c2, 0x5b3: 0x00c2, 0x5b4: 0x00c2, 0x5b5: 0x00c2, - 0x5b6: 0x00c2, 0x5b7: 0x00c2, 0x5b8: 0x00c2, 0x5b9: 0x00c2, 0x5ba: 0x00c2, 0x5bb: 0x00c2, - 0x5bc: 0x00c2, 0x5bd: 0x00c2, 0x5be: 0x00c2, 0x5bf: 0x00c2, - // Block 0x17, offset 0x5c0 - 0x5c0: 0x00c4, 0x5c1: 0x00c2, 0x5c2: 0x00c2, 0x5c3: 0x00c4, 0x5c4: 0x00c4, 0x5c5: 0x00c4, - 0x5c6: 0x00c4, 0x5c7: 0x00c4, 0x5c8: 0x00c4, 0x5c9: 0x00c4, 0x5ca: 0x00c4, 0x5cb: 0x00c4, - 0x5cc: 0x00c2, 0x5cd: 0x00c4, 0x5ce: 0x00c2, 0x5cf: 0x00c4, 0x5d0: 0x00c2, 0x5d1: 0x00c2, - 0x5d2: 0x00c4, 0x5d3: 0x00c4, 0x5d4: 0x0080, 0x5d5: 0x00c4, 0x5d6: 0x00c3, 0x5d7: 0x00c3, - 0x5d8: 0x00c3, 0x5d9: 0x00c3, 0x5da: 0x00c3, 0x5db: 0x00c3, 0x5dc: 0x00c3, 0x5dd: 0x0040, - 0x5de: 0x0080, 0x5df: 0x00c3, 0x5e0: 0x00c3, 0x5e1: 0x00c3, 0x5e2: 0x00c3, 0x5e3: 0x00c3, - 0x5e4: 0x00c3, 0x5e5: 0x00c0, 0x5e6: 0x00c0, 0x5e7: 0x00c3, 0x5e8: 0x00c3, 0x5e9: 0x0080, - 0x5ea: 0x00c3, 0x5eb: 0x00c3, 0x5ec: 0x00c3, 0x5ed: 0x00c3, 0x5ee: 0x00c4, 0x5ef: 0x00c4, - 0x5f0: 0x0054, 0x5f1: 0x0054, 0x5f2: 0x0054, 0x5f3: 0x0054, 0x5f4: 0x0054, 0x5f5: 0x0054, - 0x5f6: 0x0054, 0x5f7: 0x0054, 0x5f8: 0x0054, 0x5f9: 0x0054, 0x5fa: 0x00c2, 0x5fb: 0x00c2, - 0x5fc: 0x00c2, 0x5fd: 0x00c0, 0x5fe: 0x00c0, 0x5ff: 0x00c2, - // Block 0x18, offset 0x600 - 0x600: 0x0080, 0x601: 0x0080, 0x602: 0x0080, 0x603: 0x0080, 0x604: 0x0080, 0x605: 0x0080, - 0x606: 0x0080, 0x607: 0x0080, 0x608: 0x0080, 0x609: 0x0080, 0x60a: 0x0080, 0x60b: 0x0080, - 0x60c: 0x0080, 0x60d: 0x0080, 0x60f: 0x0040, 0x610: 0x00c4, 0x611: 0x00c3, - 0x612: 0x00c2, 0x613: 0x00c2, 0x614: 0x00c2, 0x615: 0x00c4, 0x616: 0x00c4, 0x617: 0x00c4, - 0x618: 0x00c4, 0x619: 0x00c4, 0x61a: 0x00c2, 0x61b: 0x00c2, 0x61c: 0x00c2, 0x61d: 0x00c2, - 0x61e: 0x00c4, 0x61f: 0x00c2, 0x620: 0x00c2, 0x621: 0x00c2, 0x622: 0x00c2, 0x623: 0x00c2, - 0x624: 0x00c2, 0x625: 0x00c2, 0x626: 0x00c2, 0x627: 0x00c2, 0x628: 0x00c4, 0x629: 0x00c2, - 0x62a: 0x00c4, 0x62b: 0x00c2, 0x62c: 0x00c4, 0x62d: 0x00c2, 0x62e: 0x00c2, 0x62f: 0x00c4, - 0x630: 0x00c3, 0x631: 0x00c3, 0x632: 0x00c3, 0x633: 0x00c3, 0x634: 0x00c3, 0x635: 0x00c3, - 0x636: 0x00c3, 0x637: 0x00c3, 0x638: 0x00c3, 0x639: 0x00c3, 0x63a: 0x00c3, 0x63b: 0x00c3, - 0x63c: 0x00c3, 0x63d: 0x00c3, 0x63e: 0x00c3, 0x63f: 0x00c3, - // Block 0x19, offset 0x640 - 0x640: 0x00c3, 0x641: 0x00c3, 0x642: 0x00c3, 0x643: 0x00c3, 0x644: 0x00c3, 0x645: 0x00c3, - 0x646: 0x00c3, 0x647: 0x00c3, 0x648: 0x00c3, 0x649: 0x00c3, 0x64a: 0x00c3, - 0x64d: 0x00c4, 0x64e: 0x00c2, 0x64f: 0x00c2, 0x650: 0x00c2, 0x651: 0x00c2, - 0x652: 0x00c2, 0x653: 0x00c2, 0x654: 0x00c2, 0x655: 0x00c2, 0x656: 0x00c2, 0x657: 0x00c2, - 0x658: 0x00c2, 0x659: 0x00c4, 0x65a: 0x00c4, 0x65b: 0x00c4, 0x65c: 0x00c2, 0x65d: 0x00c2, - 0x65e: 0x00c2, 0x65f: 0x00c2, 0x660: 0x00c2, 0x661: 0x00c2, 0x662: 0x00c2, 0x663: 0x00c2, - 0x664: 0x00c2, 0x665: 0x00c2, 0x666: 0x00c2, 0x667: 0x00c2, 0x668: 0x00c2, 0x669: 0x00c2, - 0x66a: 0x00c2, 0x66b: 0x00c4, 0x66c: 0x00c4, 0x66d: 0x00c2, 0x66e: 0x00c2, 0x66f: 0x00c2, - 0x670: 0x00c2, 0x671: 0x00c4, 0x672: 0x00c2, 0x673: 0x00c4, 0x674: 0x00c4, 0x675: 0x00c2, - 0x676: 0x00c2, 0x677: 0x00c2, 0x678: 0x00c4, 0x679: 0x00c4, 0x67a: 0x00c2, 0x67b: 0x00c2, - 0x67c: 0x00c2, 0x67d: 0x00c2, 0x67e: 0x00c2, 0x67f: 0x00c2, - // Block 0x1a, offset 0x680 - 0x680: 0x00c0, 0x681: 0x00c0, 0x682: 0x00c0, 0x683: 0x00c0, 0x684: 0x00c0, 0x685: 0x00c0, - 0x686: 0x00c0, 0x687: 0x00c0, 0x688: 0x00c0, 0x689: 0x00c0, 0x68a: 0x00c0, 0x68b: 0x00c0, - 0x68c: 0x00c0, 0x68d: 0x00c0, 0x68e: 0x00c0, 0x68f: 0x00c0, 0x690: 0x00c0, 0x691: 0x00c0, - 0x692: 0x00c0, 0x693: 0x00c0, 0x694: 0x00c0, 0x695: 0x00c0, 0x696: 0x00c0, 0x697: 0x00c0, - 0x698: 0x00c0, 0x699: 0x00c0, 0x69a: 0x00c0, 0x69b: 0x00c0, 0x69c: 0x00c0, 0x69d: 0x00c0, - 0x69e: 0x00c0, 0x69f: 0x00c0, 0x6a0: 0x00c0, 0x6a1: 0x00c0, 0x6a2: 0x00c0, 0x6a3: 0x00c0, - 0x6a4: 0x00c0, 0x6a5: 0x00c0, 0x6a6: 0x00c3, 0x6a7: 0x00c3, 0x6a8: 0x00c3, 0x6a9: 0x00c3, - 0x6aa: 0x00c3, 0x6ab: 0x00c3, 0x6ac: 0x00c3, 0x6ad: 0x00c3, 0x6ae: 0x00c3, 0x6af: 0x00c3, - 0x6b0: 0x00c3, 0x6b1: 0x00c0, - // Block 0x1b, offset 0x6c0 - 0x6c0: 0x00c0, 0x6c1: 0x00c0, 0x6c2: 0x00c0, 0x6c3: 0x00c0, 0x6c4: 0x00c0, 0x6c5: 0x00c0, - 0x6c6: 0x00c0, 0x6c7: 0x00c0, 0x6c8: 0x00c0, 0x6c9: 0x00c0, 0x6ca: 0x00c2, 0x6cb: 0x00c2, - 0x6cc: 0x00c2, 0x6cd: 0x00c2, 0x6ce: 0x00c2, 0x6cf: 0x00c2, 0x6d0: 0x00c2, 0x6d1: 0x00c2, - 0x6d2: 0x00c2, 0x6d3: 0x00c2, 0x6d4: 0x00c2, 0x6d5: 0x00c2, 0x6d6: 0x00c2, 0x6d7: 0x00c2, - 0x6d8: 0x00c2, 0x6d9: 0x00c2, 0x6da: 0x00c2, 0x6db: 0x00c2, 0x6dc: 0x00c2, 0x6dd: 0x00c2, - 0x6de: 0x00c2, 0x6df: 0x00c2, 0x6e0: 0x00c2, 0x6e1: 0x00c2, 0x6e2: 0x00c2, 0x6e3: 0x00c2, - 0x6e4: 0x00c2, 0x6e5: 0x00c2, 0x6e6: 0x00c2, 0x6e7: 0x00c2, 0x6e8: 0x00c2, 0x6e9: 0x00c2, - 0x6ea: 0x00c2, 0x6eb: 0x00c3, 0x6ec: 0x00c3, 0x6ed: 0x00c3, 0x6ee: 0x00c3, 0x6ef: 0x00c3, - 0x6f0: 0x00c3, 0x6f1: 0x00c3, 0x6f2: 0x00c3, 0x6f3: 0x00c3, 0x6f4: 0x00c0, 0x6f5: 0x00c0, - 0x6f6: 0x0080, 0x6f7: 0x0080, 0x6f8: 0x0080, 0x6f9: 0x0080, 0x6fa: 0x0040, - // Block 0x1c, offset 0x700 - 0x700: 0x00c0, 0x701: 0x00c0, 0x702: 0x00c0, 0x703: 0x00c0, 0x704: 0x00c0, 0x705: 0x00c0, - 0x706: 0x00c0, 0x707: 0x00c0, 0x708: 0x00c0, 0x709: 0x00c0, 0x70a: 0x00c0, 0x70b: 0x00c0, - 0x70c: 0x00c0, 0x70d: 0x00c0, 0x70e: 0x00c0, 0x70f: 0x00c0, 0x710: 0x00c0, 0x711: 0x00c0, - 0x712: 0x00c0, 0x713: 0x00c0, 0x714: 0x00c0, 0x715: 0x00c0, 0x716: 0x00c3, 0x717: 0x00c3, - 0x718: 0x00c3, 0x719: 0x00c3, 0x71a: 0x00c0, 0x71b: 0x00c3, 0x71c: 0x00c3, 0x71d: 0x00c3, - 0x71e: 0x00c3, 0x71f: 0x00c3, 0x720: 0x00c3, 0x721: 0x00c3, 0x722: 0x00c3, 0x723: 0x00c3, - 0x724: 0x00c0, 0x725: 0x00c3, 0x726: 0x00c3, 0x727: 0x00c3, 0x728: 0x00c0, 0x729: 0x00c3, - 0x72a: 0x00c3, 0x72b: 0x00c3, 0x72c: 0x00c3, 0x72d: 0x00c3, - 0x730: 0x0080, 0x731: 0x0080, 0x732: 0x0080, 0x733: 0x0080, 0x734: 0x0080, 0x735: 0x0080, - 0x736: 0x0080, 0x737: 0x0080, 0x738: 0x0080, 0x739: 0x0080, 0x73a: 0x0080, 0x73b: 0x0080, - 0x73c: 0x0080, 0x73d: 0x0080, 0x73e: 0x0080, - // Block 0x1d, offset 0x740 - 0x740: 0x00c4, 0x741: 0x00c2, 0x742: 0x00c2, 0x743: 0x00c2, 0x744: 0x00c2, 0x745: 0x00c2, - 0x746: 0x00c4, 0x747: 0x00c4, 0x748: 0x00c2, 0x749: 0x00c4, 0x74a: 0x00c2, 0x74b: 0x00c2, - 0x74c: 0x00c2, 0x74d: 0x00c2, 0x74e: 0x00c2, 0x74f: 0x00c2, 0x750: 0x00c2, 0x751: 0x00c2, - 0x752: 0x00c2, 0x753: 0x00c2, 0x754: 0x00c4, 0x755: 0x00c2, 0x756: 0x00c0, 0x757: 0x00c0, - 0x758: 0x00c0, 0x759: 0x00c3, 0x75a: 0x00c3, 0x75b: 0x00c3, - 0x75e: 0x0080, - // Block 0x1e, offset 0x780 - 0x7a0: 0x00c2, 0x7a1: 0x00c2, 0x7a2: 0x00c2, 0x7a3: 0x00c2, - 0x7a4: 0x00c2, 0x7a5: 0x00c2, 0x7a6: 0x00c2, 0x7a7: 0x00c2, 0x7a8: 0x00c2, 0x7a9: 0x00c2, - 0x7aa: 0x00c4, 0x7ab: 0x00c4, 0x7ac: 0x00c4, 0x7ad: 0x00c0, 0x7ae: 0x00c4, 0x7af: 0x00c2, - 0x7b0: 0x00c2, 0x7b1: 0x00c4, 0x7b2: 0x00c4, 0x7b3: 0x00c2, 0x7b4: 0x00c2, - 0x7b6: 0x00c2, 0x7b7: 0x00c2, 0x7b8: 0x00c2, 0x7b9: 0x00c4, 0x7ba: 0x00c2, 0x7bb: 0x00c2, - 0x7bc: 0x00c2, 0x7bd: 0x00c2, - // Block 0x1f, offset 0x7c0 - 0x7d4: 0x00c3, 0x7d5: 0x00c3, 0x7d6: 0x00c3, 0x7d7: 0x00c3, - 0x7d8: 0x00c3, 0x7d9: 0x00c3, 0x7da: 0x00c3, 0x7db: 0x00c3, 0x7dc: 0x00c3, 0x7dd: 0x00c3, - 0x7de: 0x00c3, 0x7df: 0x00c3, 0x7e0: 0x00c3, 0x7e1: 0x00c3, 0x7e2: 0x0040, 0x7e3: 0x00c3, - 0x7e4: 0x00c3, 0x7e5: 0x00c3, 0x7e6: 0x00c3, 0x7e7: 0x00c3, 0x7e8: 0x00c3, 0x7e9: 0x00c3, - 0x7ea: 0x00c3, 0x7eb: 0x00c3, 0x7ec: 0x00c3, 0x7ed: 0x00c3, 0x7ee: 0x00c3, 0x7ef: 0x00c3, - 0x7f0: 0x00c3, 0x7f1: 0x00c3, 0x7f2: 0x00c3, 0x7f3: 0x00c3, 0x7f4: 0x00c3, 0x7f5: 0x00c3, - 0x7f6: 0x00c3, 0x7f7: 0x00c3, 0x7f8: 0x00c3, 0x7f9: 0x00c3, 0x7fa: 0x00c3, 0x7fb: 0x00c3, - 0x7fc: 0x00c3, 0x7fd: 0x00c3, 0x7fe: 0x00c3, 0x7ff: 0x00c3, - // Block 0x20, offset 0x800 - 0x800: 0x00c3, 0x801: 0x00c3, 0x802: 0x00c3, 0x803: 0x00c0, 0x804: 0x00c0, 0x805: 0x00c0, - 0x806: 0x00c0, 0x807: 0x00c0, 0x808: 0x00c0, 0x809: 0x00c0, 0x80a: 0x00c0, 0x80b: 0x00c0, - 0x80c: 0x00c0, 0x80d: 0x00c0, 0x80e: 0x00c0, 0x80f: 0x00c0, 0x810: 0x00c0, 0x811: 0x00c0, - 0x812: 0x00c0, 0x813: 0x00c0, 0x814: 0x00c0, 0x815: 0x00c0, 0x816: 0x00c0, 0x817: 0x00c0, - 0x818: 0x00c0, 0x819: 0x00c0, 0x81a: 0x00c0, 0x81b: 0x00c0, 0x81c: 0x00c0, 0x81d: 0x00c0, - 0x81e: 0x00c0, 0x81f: 0x00c0, 0x820: 0x00c0, 0x821: 0x00c0, 0x822: 0x00c0, 0x823: 0x00c0, - 0x824: 0x00c0, 0x825: 0x00c0, 0x826: 0x00c0, 0x827: 0x00c0, 0x828: 0x00c0, 0x829: 0x00c0, - 0x82a: 0x00c0, 0x82b: 0x00c0, 0x82c: 0x00c0, 0x82d: 0x00c0, 0x82e: 0x00c0, 0x82f: 0x00c0, - 0x830: 0x00c0, 0x831: 0x00c0, 0x832: 0x00c0, 0x833: 0x00c0, 0x834: 0x00c0, 0x835: 0x00c0, - 0x836: 0x00c0, 0x837: 0x00c0, 0x838: 0x00c0, 0x839: 0x00c0, 0x83a: 0x00c3, 0x83b: 0x00c0, - 0x83c: 0x00c3, 0x83d: 0x00c0, 0x83e: 0x00c0, 0x83f: 0x00c0, - // Block 0x21, offset 0x840 - 0x840: 0x00c0, 0x841: 0x00c3, 0x842: 0x00c3, 0x843: 0x00c3, 0x844: 0x00c3, 0x845: 0x00c3, - 0x846: 0x00c3, 0x847: 0x00c3, 0x848: 0x00c3, 0x849: 0x00c0, 0x84a: 0x00c0, 0x84b: 0x00c0, - 0x84c: 0x00c0, 0x84d: 0x00c6, 0x84e: 0x00c0, 0x84f: 0x00c0, 0x850: 0x00c0, 0x851: 0x00c3, - 0x852: 0x00c3, 0x853: 0x00c3, 0x854: 0x00c3, 0x855: 0x00c3, 0x856: 0x00c3, 0x857: 0x00c3, - 0x858: 0x0080, 0x859: 0x0080, 0x85a: 0x0080, 0x85b: 0x0080, 0x85c: 0x0080, 0x85d: 0x0080, - 0x85e: 0x0080, 0x85f: 0x0080, 0x860: 0x00c0, 0x861: 0x00c0, 0x862: 0x00c3, 0x863: 0x00c3, - 0x864: 0x0080, 0x865: 0x0080, 0x866: 0x00c0, 0x867: 0x00c0, 0x868: 0x00c0, 0x869: 0x00c0, - 0x86a: 0x00c0, 0x86b: 0x00c0, 0x86c: 0x00c0, 0x86d: 0x00c0, 0x86e: 0x00c0, 0x86f: 0x00c0, - 0x870: 0x0080, 0x871: 0x00c0, 0x872: 0x00c0, 0x873: 0x00c0, 0x874: 0x00c0, 0x875: 0x00c0, - 0x876: 0x00c0, 0x877: 0x00c0, 0x878: 0x00c0, 0x879: 0x00c0, 0x87a: 0x00c0, 0x87b: 0x00c0, - 0x87c: 0x00c0, 0x87d: 0x00c0, 0x87e: 0x00c0, 0x87f: 0x00c0, - // Block 0x22, offset 0x880 - 0x880: 0x00c0, 0x881: 0x00c3, 0x882: 0x00c0, 0x883: 0x00c0, 0x885: 0x00c0, - 0x886: 0x00c0, 0x887: 0x00c0, 0x888: 0x00c0, 0x889: 0x00c0, 0x88a: 0x00c0, 0x88b: 0x00c0, - 0x88c: 0x00c0, 0x88f: 0x00c0, 0x890: 0x00c0, - 0x893: 0x00c0, 0x894: 0x00c0, 0x895: 0x00c0, 0x896: 0x00c0, 0x897: 0x00c0, - 0x898: 0x00c0, 0x899: 0x00c0, 0x89a: 0x00c0, 0x89b: 0x00c0, 0x89c: 0x00c0, 0x89d: 0x00c0, - 0x89e: 0x00c0, 0x89f: 0x00c0, 0x8a0: 0x00c0, 0x8a1: 0x00c0, 0x8a2: 0x00c0, 0x8a3: 0x00c0, - 0x8a4: 0x00c0, 0x8a5: 0x00c0, 0x8a6: 0x00c0, 0x8a7: 0x00c0, 0x8a8: 0x00c0, - 0x8aa: 0x00c0, 0x8ab: 0x00c0, 0x8ac: 0x00c0, 0x8ad: 0x00c0, 0x8ae: 0x00c0, 0x8af: 0x00c0, - 0x8b0: 0x00c0, 0x8b2: 0x00c0, - 0x8b6: 0x00c0, 0x8b7: 0x00c0, 0x8b8: 0x00c0, 0x8b9: 0x00c0, - 0x8bc: 0x00c3, 0x8bd: 0x00c0, 0x8be: 0x00c0, 0x8bf: 0x00c0, - // Block 0x23, offset 0x8c0 - 0x8c0: 0x00c0, 0x8c1: 0x00c3, 0x8c2: 0x00c3, 0x8c3: 0x00c3, 0x8c4: 0x00c3, - 0x8c7: 0x00c0, 0x8c8: 0x00c0, 0x8cb: 0x00c0, - 0x8cc: 0x00c0, 0x8cd: 0x00c6, 0x8ce: 0x00c0, - 0x8d7: 0x00c0, - 0x8dc: 0x0080, 0x8dd: 0x0080, - 0x8df: 0x0080, 0x8e0: 0x00c0, 0x8e1: 0x00c0, 0x8e2: 0x00c3, 0x8e3: 0x00c3, - 0x8e6: 0x00c0, 0x8e7: 0x00c0, 0x8e8: 0x00c0, 0x8e9: 0x00c0, - 0x8ea: 0x00c0, 0x8eb: 0x00c0, 0x8ec: 0x00c0, 0x8ed: 0x00c0, 0x8ee: 0x00c0, 0x8ef: 0x00c0, - 0x8f0: 0x00c0, 0x8f1: 0x00c0, 0x8f2: 0x0080, 0x8f3: 0x0080, 0x8f4: 0x0080, 0x8f5: 0x0080, - 0x8f6: 0x0080, 0x8f7: 0x0080, 0x8f8: 0x0080, 0x8f9: 0x0080, 0x8fa: 0x0080, 0x8fb: 0x0080, - // Block 0x24, offset 0x900 - 0x901: 0x00c3, 0x902: 0x00c3, 0x903: 0x00c0, 0x905: 0x00c0, - 0x906: 0x00c0, 0x907: 0x00c0, 0x908: 0x00c0, 0x909: 0x00c0, 0x90a: 0x00c0, - 0x90f: 0x00c0, 0x910: 0x00c0, - 0x913: 0x00c0, 0x914: 0x00c0, 0x915: 0x00c0, 0x916: 0x00c0, 0x917: 0x00c0, - 0x918: 0x00c0, 0x919: 0x00c0, 0x91a: 0x00c0, 0x91b: 0x00c0, 0x91c: 0x00c0, 0x91d: 0x00c0, - 0x91e: 0x00c0, 0x91f: 0x00c0, 0x920: 0x00c0, 0x921: 0x00c0, 0x922: 0x00c0, 0x923: 0x00c0, - 0x924: 0x00c0, 0x925: 0x00c0, 0x926: 0x00c0, 0x927: 0x00c0, 0x928: 0x00c0, - 0x92a: 0x00c0, 0x92b: 0x00c0, 0x92c: 0x00c0, 0x92d: 0x00c0, 0x92e: 0x00c0, 0x92f: 0x00c0, - 0x930: 0x00c0, 0x932: 0x00c0, 0x933: 0x0080, 0x935: 0x00c0, - 0x936: 0x0080, 0x938: 0x00c0, 0x939: 0x00c0, - 0x93c: 0x00c3, 0x93e: 0x00c0, 0x93f: 0x00c0, - // Block 0x25, offset 0x940 - 0x940: 0x00c0, 0x941: 0x00c3, 0x942: 0x00c3, - 0x947: 0x00c3, 0x948: 0x00c3, 0x94b: 0x00c3, - 0x94c: 0x00c3, 0x94d: 0x00c6, 0x951: 0x00c3, - 0x959: 0x0080, 0x95a: 0x0080, 0x95b: 0x0080, 0x95c: 0x00c0, - 0x95e: 0x0080, - 0x966: 0x00c0, 0x967: 0x00c0, 0x968: 0x00c0, 0x969: 0x00c0, - 0x96a: 0x00c0, 0x96b: 0x00c0, 0x96c: 0x00c0, 0x96d: 0x00c0, 0x96e: 0x00c0, 0x96f: 0x00c0, - 0x970: 0x00c3, 0x971: 0x00c3, 0x972: 0x00c0, 0x973: 0x00c0, 0x974: 0x00c0, 0x975: 0x00c3, - // Block 0x26, offset 0x980 - 0x981: 0x00c3, 0x982: 0x00c3, 0x983: 0x00c0, 0x985: 0x00c0, - 0x986: 0x00c0, 0x987: 0x00c0, 0x988: 0x00c0, 0x989: 0x00c0, 0x98a: 0x00c0, 0x98b: 0x00c0, - 0x98c: 0x00c0, 0x98d: 0x00c0, 0x98f: 0x00c0, 0x990: 0x00c0, 0x991: 0x00c0, - 0x993: 0x00c0, 0x994: 0x00c0, 0x995: 0x00c0, 0x996: 0x00c0, 0x997: 0x00c0, - 0x998: 0x00c0, 0x999: 0x00c0, 0x99a: 0x00c0, 0x99b: 0x00c0, 0x99c: 0x00c0, 0x99d: 0x00c0, - 0x99e: 0x00c0, 0x99f: 0x00c0, 0x9a0: 0x00c0, 0x9a1: 0x00c0, 0x9a2: 0x00c0, 0x9a3: 0x00c0, - 0x9a4: 0x00c0, 0x9a5: 0x00c0, 0x9a6: 0x00c0, 0x9a7: 0x00c0, 0x9a8: 0x00c0, - 0x9aa: 0x00c0, 0x9ab: 0x00c0, 0x9ac: 0x00c0, 0x9ad: 0x00c0, 0x9ae: 0x00c0, 0x9af: 0x00c0, - 0x9b0: 0x00c0, 0x9b2: 0x00c0, 0x9b3: 0x00c0, 0x9b5: 0x00c0, - 0x9b6: 0x00c0, 0x9b7: 0x00c0, 0x9b8: 0x00c0, 0x9b9: 0x00c0, - 0x9bc: 0x00c3, 0x9bd: 0x00c0, 0x9be: 0x00c0, 0x9bf: 0x00c0, - // Block 0x27, offset 0x9c0 - 0x9c0: 0x00c0, 0x9c1: 0x00c3, 0x9c2: 0x00c3, 0x9c3: 0x00c3, 0x9c4: 0x00c3, 0x9c5: 0x00c3, - 0x9c7: 0x00c3, 0x9c8: 0x00c3, 0x9c9: 0x00c0, 0x9cb: 0x00c0, - 0x9cc: 0x00c0, 0x9cd: 0x00c6, 0x9d0: 0x00c0, - 0x9e0: 0x00c0, 0x9e1: 0x00c0, 0x9e2: 0x00c3, 0x9e3: 0x00c3, - 0x9e6: 0x00c0, 0x9e7: 0x00c0, 0x9e8: 0x00c0, 0x9e9: 0x00c0, - 0x9ea: 0x00c0, 0x9eb: 0x00c0, 0x9ec: 0x00c0, 0x9ed: 0x00c0, 0x9ee: 0x00c0, 0x9ef: 0x00c0, - 0x9f0: 0x0080, 0x9f1: 0x0080, - 0x9f9: 0x00c0, - // Block 0x28, offset 0xa00 - 0xa01: 0x00c3, 0xa02: 0x00c0, 0xa03: 0x00c0, 0xa05: 0x00c0, - 0xa06: 0x00c0, 0xa07: 0x00c0, 0xa08: 0x00c0, 0xa09: 0x00c0, 0xa0a: 0x00c0, 0xa0b: 0x00c0, - 0xa0c: 0x00c0, 0xa0f: 0x00c0, 0xa10: 0x00c0, - 0xa13: 0x00c0, 0xa14: 0x00c0, 0xa15: 0x00c0, 0xa16: 0x00c0, 0xa17: 0x00c0, - 0xa18: 0x00c0, 0xa19: 0x00c0, 0xa1a: 0x00c0, 0xa1b: 0x00c0, 0xa1c: 0x00c0, 0xa1d: 0x00c0, - 0xa1e: 0x00c0, 0xa1f: 0x00c0, 0xa20: 0x00c0, 0xa21: 0x00c0, 0xa22: 0x00c0, 0xa23: 0x00c0, - 0xa24: 0x00c0, 0xa25: 0x00c0, 0xa26: 0x00c0, 0xa27: 0x00c0, 0xa28: 0x00c0, - 0xa2a: 0x00c0, 0xa2b: 0x00c0, 0xa2c: 0x00c0, 0xa2d: 0x00c0, 0xa2e: 0x00c0, 0xa2f: 0x00c0, - 0xa30: 0x00c0, 0xa32: 0x00c0, 0xa33: 0x00c0, 0xa35: 0x00c0, - 0xa36: 0x00c0, 0xa37: 0x00c0, 0xa38: 0x00c0, 0xa39: 0x00c0, - 0xa3c: 0x00c3, 0xa3d: 0x00c0, 0xa3e: 0x00c0, 0xa3f: 0x00c3, - // Block 0x29, offset 0xa40 - 0xa40: 0x00c0, 0xa41: 0x00c3, 0xa42: 0x00c3, 0xa43: 0x00c3, 0xa44: 0x00c3, - 0xa47: 0x00c0, 0xa48: 0x00c0, 0xa4b: 0x00c0, - 0xa4c: 0x00c0, 0xa4d: 0x00c6, - 0xa56: 0x00c3, 0xa57: 0x00c0, - 0xa5c: 0x0080, 0xa5d: 0x0080, - 0xa5f: 0x00c0, 0xa60: 0x00c0, 0xa61: 0x00c0, 0xa62: 0x00c3, 0xa63: 0x00c3, - 0xa66: 0x00c0, 0xa67: 0x00c0, 0xa68: 0x00c0, 0xa69: 0x00c0, - 0xa6a: 0x00c0, 0xa6b: 0x00c0, 0xa6c: 0x00c0, 0xa6d: 0x00c0, 0xa6e: 0x00c0, 0xa6f: 0x00c0, - 0xa70: 0x0080, 0xa71: 0x00c0, 0xa72: 0x0080, 0xa73: 0x0080, 0xa74: 0x0080, 0xa75: 0x0080, - 0xa76: 0x0080, 0xa77: 0x0080, - // Block 0x2a, offset 0xa80 - 0xa82: 0x00c3, 0xa83: 0x00c0, 0xa85: 0x00c0, - 0xa86: 0x00c0, 0xa87: 0x00c0, 0xa88: 0x00c0, 0xa89: 0x00c0, 0xa8a: 0x00c0, - 0xa8e: 0x00c0, 0xa8f: 0x00c0, 0xa90: 0x00c0, - 0xa92: 0x00c0, 0xa93: 0x00c0, 0xa94: 0x00c0, 0xa95: 0x00c0, - 0xa99: 0x00c0, 0xa9a: 0x00c0, 0xa9c: 0x00c0, - 0xa9e: 0x00c0, 0xa9f: 0x00c0, 0xaa3: 0x00c0, - 0xaa4: 0x00c0, 0xaa8: 0x00c0, 0xaa9: 0x00c0, - 0xaaa: 0x00c0, 0xaae: 0x00c0, 0xaaf: 0x00c0, - 0xab0: 0x00c0, 0xab1: 0x00c0, 0xab2: 0x00c0, 0xab3: 0x00c0, 0xab4: 0x00c0, 0xab5: 0x00c0, - 0xab6: 0x00c0, 0xab7: 0x00c0, 0xab8: 0x00c0, 0xab9: 0x00c0, - 0xabe: 0x00c0, 0xabf: 0x00c0, - // Block 0x2b, offset 0xac0 - 0xac0: 0x00c3, 0xac1: 0x00c0, 0xac2: 0x00c0, - 0xac6: 0x00c0, 0xac7: 0x00c0, 0xac8: 0x00c0, 0xaca: 0x00c0, 0xacb: 0x00c0, - 0xacc: 0x00c0, 0xacd: 0x00c6, 0xad0: 0x00c0, - 0xad7: 0x00c0, - 0xae6: 0x00c0, 0xae7: 0x00c0, 0xae8: 0x00c0, 0xae9: 0x00c0, - 0xaea: 0x00c0, 0xaeb: 0x00c0, 0xaec: 0x00c0, 0xaed: 0x00c0, 0xaee: 0x00c0, 0xaef: 0x00c0, - 0xaf0: 0x0080, 0xaf1: 0x0080, 0xaf2: 0x0080, 0xaf3: 0x0080, 0xaf4: 0x0080, 0xaf5: 0x0080, - 0xaf6: 0x0080, 0xaf7: 0x0080, 0xaf8: 0x0080, 0xaf9: 0x0080, 0xafa: 0x0080, - // Block 0x2c, offset 0xb00 - 0xb00: 0x00c3, 0xb01: 0x00c0, 0xb02: 0x00c0, 0xb03: 0x00c0, 0xb05: 0x00c0, - 0xb06: 0x00c0, 0xb07: 0x00c0, 0xb08: 0x00c0, 0xb09: 0x00c0, 0xb0a: 0x00c0, 0xb0b: 0x00c0, - 0xb0c: 0x00c0, 0xb0e: 0x00c0, 0xb0f: 0x00c0, 0xb10: 0x00c0, - 0xb12: 0x00c0, 0xb13: 0x00c0, 0xb14: 0x00c0, 0xb15: 0x00c0, 0xb16: 0x00c0, 0xb17: 0x00c0, - 0xb18: 0x00c0, 0xb19: 0x00c0, 0xb1a: 0x00c0, 0xb1b: 0x00c0, 0xb1c: 0x00c0, 0xb1d: 0x00c0, - 0xb1e: 0x00c0, 0xb1f: 0x00c0, 0xb20: 0x00c0, 0xb21: 0x00c0, 0xb22: 0x00c0, 0xb23: 0x00c0, - 0xb24: 0x00c0, 0xb25: 0x00c0, 0xb26: 0x00c0, 0xb27: 0x00c0, 0xb28: 0x00c0, - 0xb2a: 0x00c0, 0xb2b: 0x00c0, 0xb2c: 0x00c0, 0xb2d: 0x00c0, 0xb2e: 0x00c0, 0xb2f: 0x00c0, - 0xb30: 0x00c0, 0xb31: 0x00c0, 0xb32: 0x00c0, 0xb33: 0x00c0, 0xb34: 0x00c0, 0xb35: 0x00c0, - 0xb36: 0x00c0, 0xb37: 0x00c0, 0xb38: 0x00c0, 0xb39: 0x00c0, - 0xb3d: 0x00c0, 0xb3e: 0x00c3, 0xb3f: 0x00c3, - // Block 0x2d, offset 0xb40 - 0xb40: 0x00c3, 0xb41: 0x00c0, 0xb42: 0x00c0, 0xb43: 0x00c0, 0xb44: 0x00c0, - 0xb46: 0x00c3, 0xb47: 0x00c3, 0xb48: 0x00c3, 0xb4a: 0x00c3, 0xb4b: 0x00c3, - 0xb4c: 0x00c3, 0xb4d: 0x00c6, - 0xb55: 0x00c3, 0xb56: 0x00c3, - 0xb58: 0x00c0, 0xb59: 0x00c0, 0xb5a: 0x00c0, - 0xb60: 0x00c0, 0xb61: 0x00c0, 0xb62: 0x00c3, 0xb63: 0x00c3, - 0xb66: 0x00c0, 0xb67: 0x00c0, 0xb68: 0x00c0, 0xb69: 0x00c0, - 0xb6a: 0x00c0, 0xb6b: 0x00c0, 0xb6c: 0x00c0, 0xb6d: 0x00c0, 0xb6e: 0x00c0, 0xb6f: 0x00c0, - 0xb78: 0x0080, 0xb79: 0x0080, 0xb7a: 0x0080, 0xb7b: 0x0080, - 0xb7c: 0x0080, 0xb7d: 0x0080, 0xb7e: 0x0080, 0xb7f: 0x0080, - // Block 0x2e, offset 0xb80 - 0xb80: 0x00c0, 0xb81: 0x00c3, 0xb82: 0x00c0, 0xb83: 0x00c0, 0xb85: 0x00c0, - 0xb86: 0x00c0, 0xb87: 0x00c0, 0xb88: 0x00c0, 0xb89: 0x00c0, 0xb8a: 0x00c0, 0xb8b: 0x00c0, - 0xb8c: 0x00c0, 0xb8e: 0x00c0, 0xb8f: 0x00c0, 0xb90: 0x00c0, - 0xb92: 0x00c0, 0xb93: 0x00c0, 0xb94: 0x00c0, 0xb95: 0x00c0, 0xb96: 0x00c0, 0xb97: 0x00c0, - 0xb98: 0x00c0, 0xb99: 0x00c0, 0xb9a: 0x00c0, 0xb9b: 0x00c0, 0xb9c: 0x00c0, 0xb9d: 0x00c0, - 0xb9e: 0x00c0, 0xb9f: 0x00c0, 0xba0: 0x00c0, 0xba1: 0x00c0, 0xba2: 0x00c0, 0xba3: 0x00c0, - 0xba4: 0x00c0, 0xba5: 0x00c0, 0xba6: 0x00c0, 0xba7: 0x00c0, 0xba8: 0x00c0, - 0xbaa: 0x00c0, 0xbab: 0x00c0, 0xbac: 0x00c0, 0xbad: 0x00c0, 0xbae: 0x00c0, 0xbaf: 0x00c0, - 0xbb0: 0x00c0, 0xbb1: 0x00c0, 0xbb2: 0x00c0, 0xbb3: 0x00c0, 0xbb5: 0x00c0, - 0xbb6: 0x00c0, 0xbb7: 0x00c0, 0xbb8: 0x00c0, 0xbb9: 0x00c0, - 0xbbc: 0x00c3, 0xbbd: 0x00c0, 0xbbe: 0x00c0, 0xbbf: 0x00c3, - // Block 0x2f, offset 0xbc0 - 0xbc0: 0x00c0, 0xbc1: 0x00c0, 0xbc2: 0x00c0, 0xbc3: 0x00c0, 0xbc4: 0x00c0, - 0xbc6: 0x00c3, 0xbc7: 0x00c0, 0xbc8: 0x00c0, 0xbca: 0x00c0, 0xbcb: 0x00c0, - 0xbcc: 0x00c3, 0xbcd: 0x00c6, - 0xbd5: 0x00c0, 0xbd6: 0x00c0, - 0xbde: 0x00c0, 0xbe0: 0x00c0, 0xbe1: 0x00c0, 0xbe2: 0x00c3, 0xbe3: 0x00c3, - 0xbe6: 0x00c0, 0xbe7: 0x00c0, 0xbe8: 0x00c0, 0xbe9: 0x00c0, - 0xbea: 0x00c0, 0xbeb: 0x00c0, 0xbec: 0x00c0, 0xbed: 0x00c0, 0xbee: 0x00c0, 0xbef: 0x00c0, - 0xbf1: 0x00c0, 0xbf2: 0x00c0, - // Block 0x30, offset 0xc00 - 0xc01: 0x00c3, 0xc02: 0x00c0, 0xc03: 0x00c0, 0xc05: 0x00c0, - 0xc06: 0x00c0, 0xc07: 0x00c0, 0xc08: 0x00c0, 0xc09: 0x00c0, 0xc0a: 0x00c0, 0xc0b: 0x00c0, - 0xc0c: 0x00c0, 0xc0e: 0x00c0, 0xc0f: 0x00c0, 0xc10: 0x00c0, - 0xc12: 0x00c0, 0xc13: 0x00c0, 0xc14: 0x00c0, 0xc15: 0x00c0, 0xc16: 0x00c0, 0xc17: 0x00c0, - 0xc18: 0x00c0, 0xc19: 0x00c0, 0xc1a: 0x00c0, 0xc1b: 0x00c0, 0xc1c: 0x00c0, 0xc1d: 0x00c0, - 0xc1e: 0x00c0, 0xc1f: 0x00c0, 0xc20: 0x00c0, 0xc21: 0x00c0, 0xc22: 0x00c0, 0xc23: 0x00c0, - 0xc24: 0x00c0, 0xc25: 0x00c0, 0xc26: 0x00c0, 0xc27: 0x00c0, 0xc28: 0x00c0, 0xc29: 0x00c0, - 0xc2a: 0x00c0, 0xc2b: 0x00c0, 0xc2c: 0x00c0, 0xc2d: 0x00c0, 0xc2e: 0x00c0, 0xc2f: 0x00c0, - 0xc30: 0x00c0, 0xc31: 0x00c0, 0xc32: 0x00c0, 0xc33: 0x00c0, 0xc34: 0x00c0, 0xc35: 0x00c0, - 0xc36: 0x00c0, 0xc37: 0x00c0, 0xc38: 0x00c0, 0xc39: 0x00c0, 0xc3a: 0x00c0, - 0xc3d: 0x00c0, 0xc3e: 0x00c0, 0xc3f: 0x00c0, - // Block 0x31, offset 0xc40 - 0xc40: 0x00c0, 0xc41: 0x00c3, 0xc42: 0x00c3, 0xc43: 0x00c3, 0xc44: 0x00c3, - 0xc46: 0x00c0, 0xc47: 0x00c0, 0xc48: 0x00c0, 0xc4a: 0x00c0, 0xc4b: 0x00c0, - 0xc4c: 0x00c0, 0xc4d: 0x00c6, 0xc4e: 0x00c0, 0xc4f: 0x0080, - 0xc54: 0x00c0, 0xc55: 0x00c0, 0xc56: 0x00c0, 0xc57: 0x00c0, - 0xc58: 0x0080, 0xc59: 0x0080, 0xc5a: 0x0080, 0xc5b: 0x0080, 0xc5c: 0x0080, 0xc5d: 0x0080, - 0xc5e: 0x0080, 0xc5f: 0x00c0, 0xc60: 0x00c0, 0xc61: 0x00c0, 0xc62: 0x00c3, 0xc63: 0x00c3, - 0xc66: 0x00c0, 0xc67: 0x00c0, 0xc68: 0x00c0, 0xc69: 0x00c0, - 0xc6a: 0x00c0, 0xc6b: 0x00c0, 0xc6c: 0x00c0, 0xc6d: 0x00c0, 0xc6e: 0x00c0, 0xc6f: 0x00c0, - 0xc70: 0x0080, 0xc71: 0x0080, 0xc72: 0x0080, 0xc73: 0x0080, 0xc74: 0x0080, 0xc75: 0x0080, - 0xc76: 0x0080, 0xc77: 0x0080, 0xc78: 0x0080, 0xc79: 0x0080, 0xc7a: 0x00c0, 0xc7b: 0x00c0, - 0xc7c: 0x00c0, 0xc7d: 0x00c0, 0xc7e: 0x00c0, 0xc7f: 0x00c0, - // Block 0x32, offset 0xc80 - 0xc82: 0x00c0, 0xc83: 0x00c0, 0xc85: 0x00c0, - 0xc86: 0x00c0, 0xc87: 0x00c0, 0xc88: 0x00c0, 0xc89: 0x00c0, 0xc8a: 0x00c0, 0xc8b: 0x00c0, - 0xc8c: 0x00c0, 0xc8d: 0x00c0, 0xc8e: 0x00c0, 0xc8f: 0x00c0, 0xc90: 0x00c0, 0xc91: 0x00c0, - 0xc92: 0x00c0, 0xc93: 0x00c0, 0xc94: 0x00c0, 0xc95: 0x00c0, 0xc96: 0x00c0, - 0xc9a: 0x00c0, 0xc9b: 0x00c0, 0xc9c: 0x00c0, 0xc9d: 0x00c0, - 0xc9e: 0x00c0, 0xc9f: 0x00c0, 0xca0: 0x00c0, 0xca1: 0x00c0, 0xca2: 0x00c0, 0xca3: 0x00c0, - 0xca4: 0x00c0, 0xca5: 0x00c0, 0xca6: 0x00c0, 0xca7: 0x00c0, 0xca8: 0x00c0, 0xca9: 0x00c0, - 0xcaa: 0x00c0, 0xcab: 0x00c0, 0xcac: 0x00c0, 0xcad: 0x00c0, 0xcae: 0x00c0, 0xcaf: 0x00c0, - 0xcb0: 0x00c0, 0xcb1: 0x00c0, 0xcb3: 0x00c0, 0xcb4: 0x00c0, 0xcb5: 0x00c0, - 0xcb6: 0x00c0, 0xcb7: 0x00c0, 0xcb8: 0x00c0, 0xcb9: 0x00c0, 0xcba: 0x00c0, 0xcbb: 0x00c0, - 0xcbd: 0x00c0, - // Block 0x33, offset 0xcc0 - 0xcc0: 0x00c0, 0xcc1: 0x00c0, 0xcc2: 0x00c0, 0xcc3: 0x00c0, 0xcc4: 0x00c0, 0xcc5: 0x00c0, - 0xcc6: 0x00c0, 0xcca: 0x00c6, - 0xccf: 0x00c0, 0xcd0: 0x00c0, 0xcd1: 0x00c0, - 0xcd2: 0x00c3, 0xcd3: 0x00c3, 0xcd4: 0x00c3, 0xcd6: 0x00c3, - 0xcd8: 0x00c0, 0xcd9: 0x00c0, 0xcda: 0x00c0, 0xcdb: 0x00c0, 0xcdc: 0x00c0, 0xcdd: 0x00c0, - 0xcde: 0x00c0, 0xcdf: 0x00c0, - 0xce6: 0x00c0, 0xce7: 0x00c0, 0xce8: 0x00c0, 0xce9: 0x00c0, - 0xcea: 0x00c0, 0xceb: 0x00c0, 0xcec: 0x00c0, 0xced: 0x00c0, 0xcee: 0x00c0, 0xcef: 0x00c0, - 0xcf2: 0x00c0, 0xcf3: 0x00c0, 0xcf4: 0x0080, - // Block 0x34, offset 0xd00 - 0xd01: 0x00c0, 0xd02: 0x00c0, 0xd03: 0x00c0, 0xd04: 0x00c0, 0xd05: 0x00c0, - 0xd06: 0x00c0, 0xd07: 0x00c0, 0xd08: 0x00c0, 0xd09: 0x00c0, 0xd0a: 0x00c0, 0xd0b: 0x00c0, - 0xd0c: 0x00c0, 0xd0d: 0x00c0, 0xd0e: 0x00c0, 0xd0f: 0x00c0, 0xd10: 0x00c0, 0xd11: 0x00c0, - 0xd12: 0x00c0, 0xd13: 0x00c0, 0xd14: 0x00c0, 0xd15: 0x00c0, 0xd16: 0x00c0, 0xd17: 0x00c0, - 0xd18: 0x00c0, 0xd19: 0x00c0, 0xd1a: 0x00c0, 0xd1b: 0x00c0, 0xd1c: 0x00c0, 0xd1d: 0x00c0, - 0xd1e: 0x00c0, 0xd1f: 0x00c0, 0xd20: 0x00c0, 0xd21: 0x00c0, 0xd22: 0x00c0, 0xd23: 0x00c0, - 0xd24: 0x00c0, 0xd25: 0x00c0, 0xd26: 0x00c0, 0xd27: 0x00c0, 0xd28: 0x00c0, 0xd29: 0x00c0, - 0xd2a: 0x00c0, 0xd2b: 0x00c0, 0xd2c: 0x00c0, 0xd2d: 0x00c0, 0xd2e: 0x00c0, 0xd2f: 0x00c0, - 0xd30: 0x00c0, 0xd31: 0x00c3, 0xd32: 0x00c0, 0xd33: 0x0080, 0xd34: 0x00c3, 0xd35: 0x00c3, - 0xd36: 0x00c3, 0xd37: 0x00c3, 0xd38: 0x00c3, 0xd39: 0x00c3, 0xd3a: 0x00c6, - 0xd3f: 0x0080, - // Block 0x35, offset 0xd40 - 0xd40: 0x00c0, 0xd41: 0x00c0, 0xd42: 0x00c0, 0xd43: 0x00c0, 0xd44: 0x00c0, 0xd45: 0x00c0, - 0xd46: 0x00c0, 0xd47: 0x00c3, 0xd48: 0x00c3, 0xd49: 0x00c3, 0xd4a: 0x00c3, 0xd4b: 0x00c3, - 0xd4c: 0x00c3, 0xd4d: 0x00c3, 0xd4e: 0x00c3, 0xd4f: 0x0080, 0xd50: 0x00c0, 0xd51: 0x00c0, - 0xd52: 0x00c0, 0xd53: 0x00c0, 0xd54: 0x00c0, 0xd55: 0x00c0, 0xd56: 0x00c0, 0xd57: 0x00c0, - 0xd58: 0x00c0, 0xd59: 0x00c0, 0xd5a: 0x0080, 0xd5b: 0x0080, - // Block 0x36, offset 0xd80 - 0xd81: 0x00c0, 0xd82: 0x00c0, 0xd84: 0x00c0, - 0xd87: 0x00c0, 0xd88: 0x00c0, 0xd8a: 0x00c0, - 0xd8d: 0x00c0, - 0xd94: 0x00c0, 0xd95: 0x00c0, 0xd96: 0x00c0, 0xd97: 0x00c0, - 0xd99: 0x00c0, 0xd9a: 0x00c0, 0xd9b: 0x00c0, 0xd9c: 0x00c0, 0xd9d: 0x00c0, - 0xd9e: 0x00c0, 0xd9f: 0x00c0, 0xda1: 0x00c0, 0xda2: 0x00c0, 0xda3: 0x00c0, - 0xda5: 0x00c0, 0xda7: 0x00c0, - 0xdaa: 0x00c0, 0xdab: 0x00c0, 0xdad: 0x00c0, 0xdae: 0x00c0, 0xdaf: 0x00c0, - 0xdb0: 0x00c0, 0xdb1: 0x00c3, 0xdb2: 0x00c0, 0xdb3: 0x0080, 0xdb4: 0x00c3, 0xdb5: 0x00c3, - 0xdb6: 0x00c3, 0xdb7: 0x00c3, 0xdb8: 0x00c3, 0xdb9: 0x00c3, 0xdbb: 0x00c3, - 0xdbc: 0x00c3, 0xdbd: 0x00c0, - // Block 0x37, offset 0xdc0 - 0xdc0: 0x00c0, 0xdc1: 0x00c0, 0xdc2: 0x00c0, 0xdc3: 0x00c0, 0xdc4: 0x00c0, - 0xdc6: 0x00c0, 0xdc8: 0x00c3, 0xdc9: 0x00c3, 0xdca: 0x00c3, 0xdcb: 0x00c3, - 0xdcc: 0x00c3, 0xdcd: 0x00c3, 0xdd0: 0x00c0, 0xdd1: 0x00c0, - 0xdd2: 0x00c0, 0xdd3: 0x00c0, 0xdd4: 0x00c0, 0xdd5: 0x00c0, 0xdd6: 0x00c0, 0xdd7: 0x00c0, - 0xdd8: 0x00c0, 0xdd9: 0x00c0, 0xddc: 0x0080, 0xddd: 0x0080, - 0xdde: 0x00c0, 0xddf: 0x00c0, - // Block 0x38, offset 0xe00 - 0xe00: 0x00c0, 0xe01: 0x0080, 0xe02: 0x0080, 0xe03: 0x0080, 0xe04: 0x0080, 0xe05: 0x0080, - 0xe06: 0x0080, 0xe07: 0x0080, 0xe08: 0x0080, 0xe09: 0x0080, 0xe0a: 0x0080, 0xe0b: 0x00c0, - 0xe0c: 0x0080, 0xe0d: 0x0080, 0xe0e: 0x0080, 0xe0f: 0x0080, 0xe10: 0x0080, 0xe11: 0x0080, - 0xe12: 0x0080, 0xe13: 0x0080, 0xe14: 0x0080, 0xe15: 0x0080, 0xe16: 0x0080, 0xe17: 0x0080, - 0xe18: 0x00c3, 0xe19: 0x00c3, 0xe1a: 0x0080, 0xe1b: 0x0080, 0xe1c: 0x0080, 0xe1d: 0x0080, - 0xe1e: 0x0080, 0xe1f: 0x0080, 0xe20: 0x00c0, 0xe21: 0x00c0, 0xe22: 0x00c0, 0xe23: 0x00c0, - 0xe24: 0x00c0, 0xe25: 0x00c0, 0xe26: 0x00c0, 0xe27: 0x00c0, 0xe28: 0x00c0, 0xe29: 0x00c0, - 0xe2a: 0x0080, 0xe2b: 0x0080, 0xe2c: 0x0080, 0xe2d: 0x0080, 0xe2e: 0x0080, 0xe2f: 0x0080, - 0xe30: 0x0080, 0xe31: 0x0080, 0xe32: 0x0080, 0xe33: 0x0080, 0xe34: 0x0080, 0xe35: 0x00c3, - 0xe36: 0x0080, 0xe37: 0x00c3, 0xe38: 0x0080, 0xe39: 0x00c3, 0xe3a: 0x0080, 0xe3b: 0x0080, - 0xe3c: 0x0080, 0xe3d: 0x0080, 0xe3e: 0x00c0, 0xe3f: 0x00c0, - // Block 0x39, offset 0xe40 - 0xe40: 0x00c0, 0xe41: 0x00c0, 0xe42: 0x00c0, 0xe43: 0x0080, 0xe44: 0x00c0, 0xe45: 0x00c0, - 0xe46: 0x00c0, 0xe47: 0x00c0, 0xe49: 0x00c0, 0xe4a: 0x00c0, 0xe4b: 0x00c0, - 0xe4c: 0x00c0, 0xe4d: 0x0080, 0xe4e: 0x00c0, 0xe4f: 0x00c0, 0xe50: 0x00c0, 0xe51: 0x00c0, - 0xe52: 0x0080, 0xe53: 0x00c0, 0xe54: 0x00c0, 0xe55: 0x00c0, 0xe56: 0x00c0, 0xe57: 0x0080, - 0xe58: 0x00c0, 0xe59: 0x00c0, 0xe5a: 0x00c0, 0xe5b: 0x00c0, 0xe5c: 0x0080, 0xe5d: 0x00c0, - 0xe5e: 0x00c0, 0xe5f: 0x00c0, 0xe60: 0x00c0, 0xe61: 0x00c0, 0xe62: 0x00c0, 0xe63: 0x00c0, - 0xe64: 0x00c0, 0xe65: 0x00c0, 0xe66: 0x00c0, 0xe67: 0x00c0, 0xe68: 0x00c0, 0xe69: 0x0080, - 0xe6a: 0x00c0, 0xe6b: 0x00c0, 0xe6c: 0x00c0, - 0xe71: 0x00c3, 0xe72: 0x00c3, 0xe73: 0x0083, 0xe74: 0x00c3, 0xe75: 0x0083, - 0xe76: 0x0083, 0xe77: 0x0083, 0xe78: 0x0083, 0xe79: 0x0083, 0xe7a: 0x00c3, 0xe7b: 0x00c3, - 0xe7c: 0x00c3, 0xe7d: 0x00c3, 0xe7e: 0x00c3, 0xe7f: 0x00c0, - // Block 0x3a, offset 0xe80 - 0xe80: 0x00c3, 0xe81: 0x0083, 0xe82: 0x00c3, 0xe83: 0x00c3, 0xe84: 0x00c6, 0xe85: 0x0080, - 0xe86: 0x00c3, 0xe87: 0x00c3, 0xe88: 0x00c0, 0xe89: 0x00c0, 0xe8a: 0x00c0, 0xe8b: 0x00c0, - 0xe8c: 0x00c0, 0xe8d: 0x00c3, 0xe8e: 0x00c3, 0xe8f: 0x00c3, 0xe90: 0x00c3, 0xe91: 0x00c3, - 0xe92: 0x00c3, 0xe93: 0x0083, 0xe94: 0x00c3, 0xe95: 0x00c3, 0xe96: 0x00c3, 0xe97: 0x00c3, - 0xe99: 0x00c3, 0xe9a: 0x00c3, 0xe9b: 0x00c3, 0xe9c: 0x00c3, 0xe9d: 0x0083, - 0xe9e: 0x00c3, 0xe9f: 0x00c3, 0xea0: 0x00c3, 0xea1: 0x00c3, 0xea2: 0x0083, 0xea3: 0x00c3, - 0xea4: 0x00c3, 0xea5: 0x00c3, 0xea6: 0x00c3, 0xea7: 0x0083, 0xea8: 0x00c3, 0xea9: 0x00c3, - 0xeaa: 0x00c3, 0xeab: 0x00c3, 0xeac: 0x0083, 0xead: 0x00c3, 0xeae: 0x00c3, 0xeaf: 0x00c3, - 0xeb0: 0x00c3, 0xeb1: 0x00c3, 0xeb2: 0x00c3, 0xeb3: 0x00c3, 0xeb4: 0x00c3, 0xeb5: 0x00c3, - 0xeb6: 0x00c3, 0xeb7: 0x00c3, 0xeb8: 0x00c3, 0xeb9: 0x0083, 0xeba: 0x00c3, 0xebb: 0x00c3, - 0xebc: 0x00c3, 0xebe: 0x0080, 0xebf: 0x0080, - // Block 0x3b, offset 0xec0 - 0xec0: 0x0080, 0xec1: 0x0080, 0xec2: 0x0080, 0xec3: 0x0080, 0xec4: 0x0080, 0xec5: 0x0080, - 0xec6: 0x00c3, 0xec7: 0x0080, 0xec8: 0x0080, 0xec9: 0x0080, 0xeca: 0x0080, 0xecb: 0x0080, - 0xecc: 0x0080, 0xece: 0x0080, 0xecf: 0x0080, 0xed0: 0x0080, 0xed1: 0x0080, - 0xed2: 0x0080, 0xed3: 0x0080, 0xed4: 0x0080, 0xed5: 0x0080, 0xed6: 0x0080, 0xed7: 0x0080, - 0xed8: 0x0080, 0xed9: 0x0080, 0xeda: 0x0080, - // Block 0x3c, offset 0xf00 - 0xf00: 0x00c0, 0xf01: 0x00c0, 0xf02: 0x00c0, 0xf03: 0x00c0, 0xf04: 0x00c0, 0xf05: 0x00c0, - 0xf06: 0x00c0, 0xf07: 0x00c0, 0xf08: 0x00c0, 0xf09: 0x00c0, 0xf0a: 0x00c0, 0xf0b: 0x00c0, - 0xf0c: 0x00c0, 0xf0d: 0x00c0, 0xf0e: 0x00c0, 0xf0f: 0x00c0, 0xf10: 0x00c0, 0xf11: 0x00c0, - 0xf12: 0x00c0, 0xf13: 0x00c0, 0xf14: 0x00c0, 0xf15: 0x00c0, 0xf16: 0x00c0, 0xf17: 0x00c0, - 0xf18: 0x00c0, 0xf19: 0x00c0, 0xf1a: 0x00c0, 0xf1b: 0x00c0, 0xf1c: 0x00c0, 0xf1d: 0x00c0, - 0xf1e: 0x00c0, 0xf1f: 0x00c0, 0xf20: 0x00c0, 0xf21: 0x00c0, 0xf22: 0x00c0, 0xf23: 0x00c0, - 0xf24: 0x00c0, 0xf25: 0x00c0, 0xf26: 0x00c0, 0xf27: 0x00c0, 0xf28: 0x00c0, 0xf29: 0x00c0, - 0xf2a: 0x00c0, 0xf2b: 0x00c0, 0xf2c: 0x00c0, 0xf2d: 0x00c3, 0xf2e: 0x00c3, 0xf2f: 0x00c3, - 0xf30: 0x00c3, 0xf31: 0x00c0, 0xf32: 0x00c3, 0xf33: 0x00c3, 0xf34: 0x00c3, 0xf35: 0x00c3, - 0xf36: 0x00c3, 0xf37: 0x00c3, 0xf38: 0x00c0, 0xf39: 0x00c6, 0xf3a: 0x00c6, 0xf3b: 0x00c0, - 0xf3c: 0x00c0, 0xf3d: 0x00c3, 0xf3e: 0x00c3, 0xf3f: 0x00c0, - // Block 0x3d, offset 0xf40 - 0xf40: 0x00c0, 0xf41: 0x00c0, 0xf42: 0x00c0, 0xf43: 0x00c0, 0xf44: 0x00c0, 0xf45: 0x00c0, - 0xf46: 0x00c0, 0xf47: 0x00c0, 0xf48: 0x00c0, 0xf49: 0x00c0, 0xf4a: 0x0080, 0xf4b: 0x0080, - 0xf4c: 0x0080, 0xf4d: 0x0080, 0xf4e: 0x0080, 0xf4f: 0x0080, 0xf50: 0x00c0, 0xf51: 0x00c0, - 0xf52: 0x00c0, 0xf53: 0x00c0, 0xf54: 0x00c0, 0xf55: 0x00c0, 0xf56: 0x00c0, 0xf57: 0x00c0, - 0xf58: 0x00c3, 0xf59: 0x00c3, 0xf5a: 0x00c0, 0xf5b: 0x00c0, 0xf5c: 0x00c0, 0xf5d: 0x00c0, - 0xf5e: 0x00c3, 0xf5f: 0x00c3, 0xf60: 0x00c3, 0xf61: 0x00c0, 0xf62: 0x00c0, 0xf63: 0x00c0, - 0xf64: 0x00c0, 0xf65: 0x00c0, 0xf66: 0x00c0, 0xf67: 0x00c0, 0xf68: 0x00c0, 0xf69: 0x00c0, - 0xf6a: 0x00c0, 0xf6b: 0x00c0, 0xf6c: 0x00c0, 0xf6d: 0x00c0, 0xf6e: 0x00c0, 0xf6f: 0x00c0, - 0xf70: 0x00c0, 0xf71: 0x00c3, 0xf72: 0x00c3, 0xf73: 0x00c3, 0xf74: 0x00c3, 0xf75: 0x00c0, - 0xf76: 0x00c0, 0xf77: 0x00c0, 0xf78: 0x00c0, 0xf79: 0x00c0, 0xf7a: 0x00c0, 0xf7b: 0x00c0, - 0xf7c: 0x00c0, 0xf7d: 0x00c0, 0xf7e: 0x00c0, 0xf7f: 0x00c0, - // Block 0x3e, offset 0xf80 - 0xf80: 0x00c0, 0xf81: 0x00c0, 0xf82: 0x00c3, 0xf83: 0x00c0, 0xf84: 0x00c0, 0xf85: 0x00c3, - 0xf86: 0x00c3, 0xf87: 0x00c0, 0xf88: 0x00c0, 0xf89: 0x00c0, 0xf8a: 0x00c0, 0xf8b: 0x00c0, - 0xf8c: 0x00c0, 0xf8d: 0x00c3, 0xf8e: 0x00c0, 0xf8f: 0x00c0, 0xf90: 0x00c0, 0xf91: 0x00c0, - 0xf92: 0x00c0, 0xf93: 0x00c0, 0xf94: 0x00c0, 0xf95: 0x00c0, 0xf96: 0x00c0, 0xf97: 0x00c0, - 0xf98: 0x00c0, 0xf99: 0x00c0, 0xf9a: 0x00c0, 0xf9b: 0x00c0, 0xf9c: 0x00c0, 0xf9d: 0x00c3, - 0xf9e: 0x0080, 0xf9f: 0x0080, 0xfa0: 0x00c0, 0xfa1: 0x00c0, 0xfa2: 0x00c0, 0xfa3: 0x00c0, - 0xfa4: 0x00c0, 0xfa5: 0x00c0, 0xfa6: 0x00c0, 0xfa7: 0x00c0, 0xfa8: 0x00c0, 0xfa9: 0x00c0, - 0xfaa: 0x00c0, 0xfab: 0x00c0, 0xfac: 0x00c0, 0xfad: 0x00c0, 0xfae: 0x00c0, 0xfaf: 0x00c0, - 0xfb0: 0x00c0, 0xfb1: 0x00c0, 0xfb2: 0x00c0, 0xfb3: 0x00c0, 0xfb4: 0x00c0, 0xfb5: 0x00c0, - 0xfb6: 0x00c0, 0xfb7: 0x00c0, 0xfb8: 0x00c0, 0xfb9: 0x00c0, 0xfba: 0x00c0, 0xfbb: 0x00c0, - 0xfbc: 0x00c0, 0xfbd: 0x00c0, 0xfbe: 0x00c0, 0xfbf: 0x00c0, - // Block 0x3f, offset 0xfc0 - 0xfc0: 0x00c0, 0xfc1: 0x00c0, 0xfc2: 0x00c0, 0xfc3: 0x00c0, 0xfc4: 0x00c0, 0xfc5: 0x00c0, - 0xfc7: 0x00c0, - 0xfcd: 0x00c0, 0xfd0: 0x00c0, 0xfd1: 0x00c0, - 0xfd2: 0x00c0, 0xfd3: 0x00c0, 0xfd4: 0x00c0, 0xfd5: 0x00c0, 0xfd6: 0x00c0, 0xfd7: 0x00c0, - 0xfd8: 0x00c0, 0xfd9: 0x00c0, 0xfda: 0x00c0, 0xfdb: 0x00c0, 0xfdc: 0x00c0, 0xfdd: 0x00c0, - 0xfde: 0x00c0, 0xfdf: 0x00c0, 0xfe0: 0x00c0, 0xfe1: 0x00c0, 0xfe2: 0x00c0, 0xfe3: 0x00c0, - 0xfe4: 0x00c0, 0xfe5: 0x00c0, 0xfe6: 0x00c0, 0xfe7: 0x00c0, 0xfe8: 0x00c0, 0xfe9: 0x00c0, - 0xfea: 0x00c0, 0xfeb: 0x00c0, 0xfec: 0x00c0, 0xfed: 0x00c0, 0xfee: 0x00c0, 0xfef: 0x00c0, - 0xff0: 0x00c0, 0xff1: 0x00c0, 0xff2: 0x00c0, 0xff3: 0x00c0, 0xff4: 0x00c0, 0xff5: 0x00c0, - 0xff6: 0x00c0, 0xff7: 0x00c0, 0xff8: 0x00c0, 0xff9: 0x00c0, 0xffa: 0x00c0, 0xffb: 0x0080, - 0xffc: 0x0080, 0xffd: 0x00c0, 0xffe: 0x00c0, 0xfff: 0x00c0, - // Block 0x40, offset 0x1000 - 0x1000: 0x0040, 0x1001: 0x0040, 0x1002: 0x0040, 0x1003: 0x0040, 0x1004: 0x0040, 0x1005: 0x0040, - 0x1006: 0x0040, 0x1007: 0x0040, 0x1008: 0x0040, 0x1009: 0x0040, 0x100a: 0x0040, 0x100b: 0x0040, - 0x100c: 0x0040, 0x100d: 0x0040, 0x100e: 0x0040, 0x100f: 0x0040, 0x1010: 0x0040, 0x1011: 0x0040, - 0x1012: 0x0040, 0x1013: 0x0040, 0x1014: 0x0040, 0x1015: 0x0040, 0x1016: 0x0040, 0x1017: 0x0040, - 0x1018: 0x0040, 0x1019: 0x0040, 0x101a: 0x0040, 0x101b: 0x0040, 0x101c: 0x0040, 0x101d: 0x0040, - 0x101e: 0x0040, 0x101f: 0x0040, 0x1020: 0x0040, 0x1021: 0x0040, 0x1022: 0x0040, 0x1023: 0x0040, - 0x1024: 0x0040, 0x1025: 0x0040, 0x1026: 0x0040, 0x1027: 0x0040, 0x1028: 0x0040, 0x1029: 0x0040, - 0x102a: 0x0040, 0x102b: 0x0040, 0x102c: 0x0040, 0x102d: 0x0040, 0x102e: 0x0040, 0x102f: 0x0040, - 0x1030: 0x0040, 0x1031: 0x0040, 0x1032: 0x0040, 0x1033: 0x0040, 0x1034: 0x0040, 0x1035: 0x0040, - 0x1036: 0x0040, 0x1037: 0x0040, 0x1038: 0x0040, 0x1039: 0x0040, 0x103a: 0x0040, 0x103b: 0x0040, - 0x103c: 0x0040, 0x103d: 0x0040, 0x103e: 0x0040, 0x103f: 0x0040, - // Block 0x41, offset 0x1040 - 0x1040: 0x00c0, 0x1041: 0x00c0, 0x1042: 0x00c0, 0x1043: 0x00c0, 0x1044: 0x00c0, 0x1045: 0x00c0, - 0x1046: 0x00c0, 0x1047: 0x00c0, 0x1048: 0x00c0, 0x104a: 0x00c0, 0x104b: 0x00c0, - 0x104c: 0x00c0, 0x104d: 0x00c0, 0x1050: 0x00c0, 0x1051: 0x00c0, - 0x1052: 0x00c0, 0x1053: 0x00c0, 0x1054: 0x00c0, 0x1055: 0x00c0, 0x1056: 0x00c0, - 0x1058: 0x00c0, 0x105a: 0x00c0, 0x105b: 0x00c0, 0x105c: 0x00c0, 0x105d: 0x00c0, - 0x1060: 0x00c0, 0x1061: 0x00c0, 0x1062: 0x00c0, 0x1063: 0x00c0, - 0x1064: 0x00c0, 0x1065: 0x00c0, 0x1066: 0x00c0, 0x1067: 0x00c0, 0x1068: 0x00c0, 0x1069: 0x00c0, - 0x106a: 0x00c0, 0x106b: 0x00c0, 0x106c: 0x00c0, 0x106d: 0x00c0, 0x106e: 0x00c0, 0x106f: 0x00c0, - 0x1070: 0x00c0, 0x1071: 0x00c0, 0x1072: 0x00c0, 0x1073: 0x00c0, 0x1074: 0x00c0, 0x1075: 0x00c0, - 0x1076: 0x00c0, 0x1077: 0x00c0, 0x1078: 0x00c0, 0x1079: 0x00c0, 0x107a: 0x00c0, 0x107b: 0x00c0, - 0x107c: 0x00c0, 0x107d: 0x00c0, 0x107e: 0x00c0, 0x107f: 0x00c0, - // Block 0x42, offset 0x1080 - 0x1080: 0x00c0, 0x1081: 0x00c0, 0x1082: 0x00c0, 0x1083: 0x00c0, 0x1084: 0x00c0, 0x1085: 0x00c0, - 0x1086: 0x00c0, 0x1087: 0x00c0, 0x1088: 0x00c0, 0x108a: 0x00c0, 0x108b: 0x00c0, - 0x108c: 0x00c0, 0x108d: 0x00c0, 0x1090: 0x00c0, 0x1091: 0x00c0, - 0x1092: 0x00c0, 0x1093: 0x00c0, 0x1094: 0x00c0, 0x1095: 0x00c0, 0x1096: 0x00c0, 0x1097: 0x00c0, - 0x1098: 0x00c0, 0x1099: 0x00c0, 0x109a: 0x00c0, 0x109b: 0x00c0, 0x109c: 0x00c0, 0x109d: 0x00c0, - 0x109e: 0x00c0, 0x109f: 0x00c0, 0x10a0: 0x00c0, 0x10a1: 0x00c0, 0x10a2: 0x00c0, 0x10a3: 0x00c0, - 0x10a4: 0x00c0, 0x10a5: 0x00c0, 0x10a6: 0x00c0, 0x10a7: 0x00c0, 0x10a8: 0x00c0, 0x10a9: 0x00c0, - 0x10aa: 0x00c0, 0x10ab: 0x00c0, 0x10ac: 0x00c0, 0x10ad: 0x00c0, 0x10ae: 0x00c0, 0x10af: 0x00c0, - 0x10b0: 0x00c0, 0x10b2: 0x00c0, 0x10b3: 0x00c0, 0x10b4: 0x00c0, 0x10b5: 0x00c0, - 0x10b8: 0x00c0, 0x10b9: 0x00c0, 0x10ba: 0x00c0, 0x10bb: 0x00c0, - 0x10bc: 0x00c0, 0x10bd: 0x00c0, 0x10be: 0x00c0, - // Block 0x43, offset 0x10c0 - 0x10c0: 0x00c0, 0x10c2: 0x00c0, 0x10c3: 0x00c0, 0x10c4: 0x00c0, 0x10c5: 0x00c0, - 0x10c8: 0x00c0, 0x10c9: 0x00c0, 0x10ca: 0x00c0, 0x10cb: 0x00c0, - 0x10cc: 0x00c0, 0x10cd: 0x00c0, 0x10ce: 0x00c0, 0x10cf: 0x00c0, 0x10d0: 0x00c0, 0x10d1: 0x00c0, - 0x10d2: 0x00c0, 0x10d3: 0x00c0, 0x10d4: 0x00c0, 0x10d5: 0x00c0, 0x10d6: 0x00c0, - 0x10d8: 0x00c0, 0x10d9: 0x00c0, 0x10da: 0x00c0, 0x10db: 0x00c0, 0x10dc: 0x00c0, 0x10dd: 0x00c0, - 0x10de: 0x00c0, 0x10df: 0x00c0, 0x10e0: 0x00c0, 0x10e1: 0x00c0, 0x10e2: 0x00c0, 0x10e3: 0x00c0, - 0x10e4: 0x00c0, 0x10e5: 0x00c0, 0x10e6: 0x00c0, 0x10e7: 0x00c0, 0x10e8: 0x00c0, 0x10e9: 0x00c0, - 0x10ea: 0x00c0, 0x10eb: 0x00c0, 0x10ec: 0x00c0, 0x10ed: 0x00c0, 0x10ee: 0x00c0, 0x10ef: 0x00c0, - 0x10f0: 0x00c0, 0x10f1: 0x00c0, 0x10f2: 0x00c0, 0x10f3: 0x00c0, 0x10f4: 0x00c0, 0x10f5: 0x00c0, - 0x10f6: 0x00c0, 0x10f7: 0x00c0, 0x10f8: 0x00c0, 0x10f9: 0x00c0, 0x10fa: 0x00c0, 0x10fb: 0x00c0, - 0x10fc: 0x00c0, 0x10fd: 0x00c0, 0x10fe: 0x00c0, 0x10ff: 0x00c0, - // Block 0x44, offset 0x1100 - 0x1100: 0x00c0, 0x1101: 0x00c0, 0x1102: 0x00c0, 0x1103: 0x00c0, 0x1104: 0x00c0, 0x1105: 0x00c0, - 0x1106: 0x00c0, 0x1107: 0x00c0, 0x1108: 0x00c0, 0x1109: 0x00c0, 0x110a: 0x00c0, 0x110b: 0x00c0, - 0x110c: 0x00c0, 0x110d: 0x00c0, 0x110e: 0x00c0, 0x110f: 0x00c0, 0x1110: 0x00c0, - 0x1112: 0x00c0, 0x1113: 0x00c0, 0x1114: 0x00c0, 0x1115: 0x00c0, - 0x1118: 0x00c0, 0x1119: 0x00c0, 0x111a: 0x00c0, 0x111b: 0x00c0, 0x111c: 0x00c0, 0x111d: 0x00c0, - 0x111e: 0x00c0, 0x111f: 0x00c0, 0x1120: 0x00c0, 0x1121: 0x00c0, 0x1122: 0x00c0, 0x1123: 0x00c0, - 0x1124: 0x00c0, 0x1125: 0x00c0, 0x1126: 0x00c0, 0x1127: 0x00c0, 0x1128: 0x00c0, 0x1129: 0x00c0, - 0x112a: 0x00c0, 0x112b: 0x00c0, 0x112c: 0x00c0, 0x112d: 0x00c0, 0x112e: 0x00c0, 0x112f: 0x00c0, - 0x1130: 0x00c0, 0x1131: 0x00c0, 0x1132: 0x00c0, 0x1133: 0x00c0, 0x1134: 0x00c0, 0x1135: 0x00c0, - 0x1136: 0x00c0, 0x1137: 0x00c0, 0x1138: 0x00c0, 0x1139: 0x00c0, 0x113a: 0x00c0, 0x113b: 0x00c0, - 0x113c: 0x00c0, 0x113d: 0x00c0, 0x113e: 0x00c0, 0x113f: 0x00c0, - // Block 0x45, offset 0x1140 - 0x1140: 0x00c0, 0x1141: 0x00c0, 0x1142: 0x00c0, 0x1143: 0x00c0, 0x1144: 0x00c0, 0x1145: 0x00c0, - 0x1146: 0x00c0, 0x1147: 0x00c0, 0x1148: 0x00c0, 0x1149: 0x00c0, 0x114a: 0x00c0, 0x114b: 0x00c0, - 0x114c: 0x00c0, 0x114d: 0x00c0, 0x114e: 0x00c0, 0x114f: 0x00c0, 0x1150: 0x00c0, 0x1151: 0x00c0, - 0x1152: 0x00c0, 0x1153: 0x00c0, 0x1154: 0x00c0, 0x1155: 0x00c0, 0x1156: 0x00c0, 0x1157: 0x00c0, - 0x1158: 0x00c0, 0x1159: 0x00c0, 0x115a: 0x00c0, 0x115d: 0x00c3, - 0x115e: 0x00c3, 0x115f: 0x00c3, 0x1160: 0x0080, 0x1161: 0x0080, 0x1162: 0x0080, 0x1163: 0x0080, - 0x1164: 0x0080, 0x1165: 0x0080, 0x1166: 0x0080, 0x1167: 0x0080, 0x1168: 0x0080, 0x1169: 0x0080, - 0x116a: 0x0080, 0x116b: 0x0080, 0x116c: 0x0080, 0x116d: 0x0080, 0x116e: 0x0080, 0x116f: 0x0080, - 0x1170: 0x0080, 0x1171: 0x0080, 0x1172: 0x0080, 0x1173: 0x0080, 0x1174: 0x0080, 0x1175: 0x0080, - 0x1176: 0x0080, 0x1177: 0x0080, 0x1178: 0x0080, 0x1179: 0x0080, 0x117a: 0x0080, 0x117b: 0x0080, - 0x117c: 0x0080, - // Block 0x46, offset 0x1180 - 0x1180: 0x00c0, 0x1181: 0x00c0, 0x1182: 0x00c0, 0x1183: 0x00c0, 0x1184: 0x00c0, 0x1185: 0x00c0, - 0x1186: 0x00c0, 0x1187: 0x00c0, 0x1188: 0x00c0, 0x1189: 0x00c0, 0x118a: 0x00c0, 0x118b: 0x00c0, - 0x118c: 0x00c0, 0x118d: 0x00c0, 0x118e: 0x00c0, 0x118f: 0x00c0, 0x1190: 0x0080, 0x1191: 0x0080, - 0x1192: 0x0080, 0x1193: 0x0080, 0x1194: 0x0080, 0x1195: 0x0080, 0x1196: 0x0080, 0x1197: 0x0080, - 0x1198: 0x0080, 0x1199: 0x0080, - 0x11a0: 0x00c0, 0x11a1: 0x00c0, 0x11a2: 0x00c0, 0x11a3: 0x00c0, - 0x11a4: 0x00c0, 0x11a5: 0x00c0, 0x11a6: 0x00c0, 0x11a7: 0x00c0, 0x11a8: 0x00c0, 0x11a9: 0x00c0, - 0x11aa: 0x00c0, 0x11ab: 0x00c0, 0x11ac: 0x00c0, 0x11ad: 0x00c0, 0x11ae: 0x00c0, 0x11af: 0x00c0, - 0x11b0: 0x00c0, 0x11b1: 0x00c0, 0x11b2: 0x00c0, 0x11b3: 0x00c0, 0x11b4: 0x00c0, 0x11b5: 0x00c0, - 0x11b6: 0x00c0, 0x11b7: 0x00c0, 0x11b8: 0x00c0, 0x11b9: 0x00c0, 0x11ba: 0x00c0, 0x11bb: 0x00c0, - 0x11bc: 0x00c0, 0x11bd: 0x00c0, 0x11be: 0x00c0, 0x11bf: 0x00c0, - // Block 0x47, offset 0x11c0 - 0x11c0: 0x00c0, 0x11c1: 0x00c0, 0x11c2: 0x00c0, 0x11c3: 0x00c0, 0x11c4: 0x00c0, 0x11c5: 0x00c0, - 0x11c6: 0x00c0, 0x11c7: 0x00c0, 0x11c8: 0x00c0, 0x11c9: 0x00c0, 0x11ca: 0x00c0, 0x11cb: 0x00c0, - 0x11cc: 0x00c0, 0x11cd: 0x00c0, 0x11ce: 0x00c0, 0x11cf: 0x00c0, 0x11d0: 0x00c0, 0x11d1: 0x00c0, - 0x11d2: 0x00c0, 0x11d3: 0x00c0, 0x11d4: 0x00c0, 0x11d5: 0x00c0, 0x11d6: 0x00c0, 0x11d7: 0x00c0, - 0x11d8: 0x00c0, 0x11d9: 0x00c0, 0x11da: 0x00c0, 0x11db: 0x00c0, 0x11dc: 0x00c0, 0x11dd: 0x00c0, - 0x11de: 0x00c0, 0x11df: 0x00c0, 0x11e0: 0x00c0, 0x11e1: 0x00c0, 0x11e2: 0x00c0, 0x11e3: 0x00c0, - 0x11e4: 0x00c0, 0x11e5: 0x00c0, 0x11e6: 0x00c0, 0x11e7: 0x00c0, 0x11e8: 0x00c0, 0x11e9: 0x00c0, - 0x11ea: 0x00c0, 0x11eb: 0x00c0, 0x11ec: 0x00c0, 0x11ed: 0x00c0, 0x11ee: 0x00c0, 0x11ef: 0x00c0, - 0x11f0: 0x00c0, 0x11f1: 0x00c0, 0x11f2: 0x00c0, 0x11f3: 0x00c0, 0x11f4: 0x00c0, 0x11f5: 0x00c0, - 0x11f8: 0x00c0, 0x11f9: 0x00c0, 0x11fa: 0x00c0, 0x11fb: 0x00c0, - 0x11fc: 0x00c0, 0x11fd: 0x00c0, - // Block 0x48, offset 0x1200 - 0x1200: 0x0080, 0x1201: 0x00c0, 0x1202: 0x00c0, 0x1203: 0x00c0, 0x1204: 0x00c0, 0x1205: 0x00c0, - 0x1206: 0x00c0, 0x1207: 0x00c0, 0x1208: 0x00c0, 0x1209: 0x00c0, 0x120a: 0x00c0, 0x120b: 0x00c0, - 0x120c: 0x00c0, 0x120d: 0x00c0, 0x120e: 0x00c0, 0x120f: 0x00c0, 0x1210: 0x00c0, 0x1211: 0x00c0, - 0x1212: 0x00c0, 0x1213: 0x00c0, 0x1214: 0x00c0, 0x1215: 0x00c0, 0x1216: 0x00c0, 0x1217: 0x00c0, - 0x1218: 0x00c0, 0x1219: 0x00c0, 0x121a: 0x00c0, 0x121b: 0x00c0, 0x121c: 0x00c0, 0x121d: 0x00c0, - 0x121e: 0x00c0, 0x121f: 0x00c0, 0x1220: 0x00c0, 0x1221: 0x00c0, 0x1222: 0x00c0, 0x1223: 0x00c0, - 0x1224: 0x00c0, 0x1225: 0x00c0, 0x1226: 0x00c0, 0x1227: 0x00c0, 0x1228: 0x00c0, 0x1229: 0x00c0, - 0x122a: 0x00c0, 0x122b: 0x00c0, 0x122c: 0x00c0, 0x122d: 0x00c0, 0x122e: 0x00c0, 0x122f: 0x00c0, - 0x1230: 0x00c0, 0x1231: 0x00c0, 0x1232: 0x00c0, 0x1233: 0x00c0, 0x1234: 0x00c0, 0x1235: 0x00c0, - 0x1236: 0x00c0, 0x1237: 0x00c0, 0x1238: 0x00c0, 0x1239: 0x00c0, 0x123a: 0x00c0, 0x123b: 0x00c0, - 0x123c: 0x00c0, 0x123d: 0x00c0, 0x123e: 0x00c0, 0x123f: 0x00c0, - // Block 0x49, offset 0x1240 - 0x1240: 0x00c0, 0x1241: 0x00c0, 0x1242: 0x00c0, 0x1243: 0x00c0, 0x1244: 0x00c0, 0x1245: 0x00c0, - 0x1246: 0x00c0, 0x1247: 0x00c0, 0x1248: 0x00c0, 0x1249: 0x00c0, 0x124a: 0x00c0, 0x124b: 0x00c0, - 0x124c: 0x00c0, 0x124d: 0x00c0, 0x124e: 0x00c0, 0x124f: 0x00c0, 0x1250: 0x00c0, 0x1251: 0x00c0, - 0x1252: 0x00c0, 0x1253: 0x00c0, 0x1254: 0x00c0, 0x1255: 0x00c0, 0x1256: 0x00c0, 0x1257: 0x00c0, - 0x1258: 0x00c0, 0x1259: 0x00c0, 0x125a: 0x00c0, 0x125b: 0x00c0, 0x125c: 0x00c0, 0x125d: 0x00c0, - 0x125e: 0x00c0, 0x125f: 0x00c0, 0x1260: 0x00c0, 0x1261: 0x00c0, 0x1262: 0x00c0, 0x1263: 0x00c0, - 0x1264: 0x00c0, 0x1265: 0x00c0, 0x1266: 0x00c0, 0x1267: 0x00c0, 0x1268: 0x00c0, 0x1269: 0x00c0, - 0x126a: 0x00c0, 0x126b: 0x00c0, 0x126c: 0x00c0, 0x126d: 0x0080, 0x126e: 0x0080, 0x126f: 0x00c0, - 0x1270: 0x00c0, 0x1271: 0x00c0, 0x1272: 0x00c0, 0x1273: 0x00c0, 0x1274: 0x00c0, 0x1275: 0x00c0, - 0x1276: 0x00c0, 0x1277: 0x00c0, 0x1278: 0x00c0, 0x1279: 0x00c0, 0x127a: 0x00c0, 0x127b: 0x00c0, - 0x127c: 0x00c0, 0x127d: 0x00c0, 0x127e: 0x00c0, 0x127f: 0x00c0, - // Block 0x4a, offset 0x1280 - 0x1280: 0x0080, 0x1281: 0x00c0, 0x1282: 0x00c0, 0x1283: 0x00c0, 0x1284: 0x00c0, 0x1285: 0x00c0, - 0x1286: 0x00c0, 0x1287: 0x00c0, 0x1288: 0x00c0, 0x1289: 0x00c0, 0x128a: 0x00c0, 0x128b: 0x00c0, - 0x128c: 0x00c0, 0x128d: 0x00c0, 0x128e: 0x00c0, 0x128f: 0x00c0, 0x1290: 0x00c0, 0x1291: 0x00c0, - 0x1292: 0x00c0, 0x1293: 0x00c0, 0x1294: 0x00c0, 0x1295: 0x00c0, 0x1296: 0x00c0, 0x1297: 0x00c0, - 0x1298: 0x00c0, 0x1299: 0x00c0, 0x129a: 0x00c0, 0x129b: 0x0080, 0x129c: 0x0080, - 0x12a0: 0x00c0, 0x12a1: 0x00c0, 0x12a2: 0x00c0, 0x12a3: 0x00c0, - 0x12a4: 0x00c0, 0x12a5: 0x00c0, 0x12a6: 0x00c0, 0x12a7: 0x00c0, 0x12a8: 0x00c0, 0x12a9: 0x00c0, - 0x12aa: 0x00c0, 0x12ab: 0x00c0, 0x12ac: 0x00c0, 0x12ad: 0x00c0, 0x12ae: 0x00c0, 0x12af: 0x00c0, - 0x12b0: 0x00c0, 0x12b1: 0x00c0, 0x12b2: 0x00c0, 0x12b3: 0x00c0, 0x12b4: 0x00c0, 0x12b5: 0x00c0, - 0x12b6: 0x00c0, 0x12b7: 0x00c0, 0x12b8: 0x00c0, 0x12b9: 0x00c0, 0x12ba: 0x00c0, 0x12bb: 0x00c0, - 0x12bc: 0x00c0, 0x12bd: 0x00c0, 0x12be: 0x00c0, 0x12bf: 0x00c0, - // Block 0x4b, offset 0x12c0 - 0x12c0: 0x00c0, 0x12c1: 0x00c0, 0x12c2: 0x00c0, 0x12c3: 0x00c0, 0x12c4: 0x00c0, 0x12c5: 0x00c0, - 0x12c6: 0x00c0, 0x12c7: 0x00c0, 0x12c8: 0x00c0, 0x12c9: 0x00c0, 0x12ca: 0x00c0, 0x12cb: 0x00c0, - 0x12cc: 0x00c0, 0x12cd: 0x00c0, 0x12ce: 0x00c0, 0x12cf: 0x00c0, 0x12d0: 0x00c0, 0x12d1: 0x00c0, - 0x12d2: 0x00c0, 0x12d3: 0x00c0, 0x12d4: 0x00c0, 0x12d5: 0x00c0, 0x12d6: 0x00c0, 0x12d7: 0x00c0, - 0x12d8: 0x00c0, 0x12d9: 0x00c0, 0x12da: 0x00c0, 0x12db: 0x00c0, 0x12dc: 0x00c0, 0x12dd: 0x00c0, - 0x12de: 0x00c0, 0x12df: 0x00c0, 0x12e0: 0x00c0, 0x12e1: 0x00c0, 0x12e2: 0x00c0, 0x12e3: 0x00c0, - 0x12e4: 0x00c0, 0x12e5: 0x00c0, 0x12e6: 0x00c0, 0x12e7: 0x00c0, 0x12e8: 0x00c0, 0x12e9: 0x00c0, - 0x12ea: 0x00c0, 0x12eb: 0x0080, 0x12ec: 0x0080, 0x12ed: 0x0080, 0x12ee: 0x0080, 0x12ef: 0x0080, - 0x12f0: 0x0080, 0x12f1: 0x00c0, 0x12f2: 0x00c0, 0x12f3: 0x00c0, 0x12f4: 0x00c0, 0x12f5: 0x00c0, - 0x12f6: 0x00c0, 0x12f7: 0x00c0, 0x12f8: 0x00c0, - // Block 0x4c, offset 0x1300 - 0x1300: 0x00c0, 0x1301: 0x00c0, 0x1302: 0x00c0, 0x1303: 0x00c0, 0x1304: 0x00c0, 0x1305: 0x00c0, - 0x1306: 0x00c0, 0x1307: 0x00c0, 0x1308: 0x00c0, 0x1309: 0x00c0, 0x130a: 0x00c0, 0x130b: 0x00c0, - 0x130c: 0x00c0, 0x130e: 0x00c0, 0x130f: 0x00c0, 0x1310: 0x00c0, 0x1311: 0x00c0, - 0x1312: 0x00c3, 0x1313: 0x00c3, 0x1314: 0x00c6, - 0x1320: 0x00c0, 0x1321: 0x00c0, 0x1322: 0x00c0, 0x1323: 0x00c0, - 0x1324: 0x00c0, 0x1325: 0x00c0, 0x1326: 0x00c0, 0x1327: 0x00c0, 0x1328: 0x00c0, 0x1329: 0x00c0, - 0x132a: 0x00c0, 0x132b: 0x00c0, 0x132c: 0x00c0, 0x132d: 0x00c0, 0x132e: 0x00c0, 0x132f: 0x00c0, - 0x1330: 0x00c0, 0x1331: 0x00c0, 0x1332: 0x00c3, 0x1333: 0x00c3, 0x1334: 0x00c6, 0x1335: 0x0080, - 0x1336: 0x0080, - // Block 0x4d, offset 0x1340 - 0x1340: 0x00c0, 0x1341: 0x00c0, 0x1342: 0x00c0, 0x1343: 0x00c0, 0x1344: 0x00c0, 0x1345: 0x00c0, - 0x1346: 0x00c0, 0x1347: 0x00c0, 0x1348: 0x00c0, 0x1349: 0x00c0, 0x134a: 0x00c0, 0x134b: 0x00c0, - 0x134c: 0x00c0, 0x134d: 0x00c0, 0x134e: 0x00c0, 0x134f: 0x00c0, 0x1350: 0x00c0, 0x1351: 0x00c0, - 0x1352: 0x00c3, 0x1353: 0x00c3, - 0x1360: 0x00c0, 0x1361: 0x00c0, 0x1362: 0x00c0, 0x1363: 0x00c0, - 0x1364: 0x00c0, 0x1365: 0x00c0, 0x1366: 0x00c0, 0x1367: 0x00c0, 0x1368: 0x00c0, 0x1369: 0x00c0, - 0x136a: 0x00c0, 0x136b: 0x00c0, 0x136c: 0x00c0, 0x136e: 0x00c0, 0x136f: 0x00c0, - 0x1370: 0x00c0, 0x1372: 0x00c3, 0x1373: 0x00c3, - // Block 0x4e, offset 0x1380 - 0x1380: 0x00c0, 0x1381: 0x00c0, 0x1382: 0x00c0, 0x1383: 0x00c0, 0x1384: 0x00c0, 0x1385: 0x00c0, - 0x1386: 0x00c0, 0x1387: 0x00c0, 0x1388: 0x00c0, 0x1389: 0x00c0, 0x138a: 0x00c0, 0x138b: 0x00c0, - 0x138c: 0x00c0, 0x138d: 0x00c0, 0x138e: 0x00c0, 0x138f: 0x00c0, 0x1390: 0x00c0, 0x1391: 0x00c0, - 0x1392: 0x00c0, 0x1393: 0x00c0, 0x1394: 0x00c0, 0x1395: 0x00c0, 0x1396: 0x00c0, 0x1397: 0x00c0, - 0x1398: 0x00c0, 0x1399: 0x00c0, 0x139a: 0x00c0, 0x139b: 0x00c0, 0x139c: 0x00c0, 0x139d: 0x00c0, - 0x139e: 0x00c0, 0x139f: 0x00c0, 0x13a0: 0x00c0, 0x13a1: 0x00c0, 0x13a2: 0x00c0, 0x13a3: 0x00c0, - 0x13a4: 0x00c0, 0x13a5: 0x00c0, 0x13a6: 0x00c0, 0x13a7: 0x00c0, 0x13a8: 0x00c0, 0x13a9: 0x00c0, - 0x13aa: 0x00c0, 0x13ab: 0x00c0, 0x13ac: 0x00c0, 0x13ad: 0x00c0, 0x13ae: 0x00c0, 0x13af: 0x00c0, - 0x13b0: 0x00c0, 0x13b1: 0x00c0, 0x13b2: 0x00c0, 0x13b3: 0x00c0, 0x13b4: 0x0040, 0x13b5: 0x0040, - 0x13b6: 0x00c0, 0x13b7: 0x00c3, 0x13b8: 0x00c3, 0x13b9: 0x00c3, 0x13ba: 0x00c3, 0x13bb: 0x00c3, - 0x13bc: 0x00c3, 0x13bd: 0x00c3, 0x13be: 0x00c0, 0x13bf: 0x00c0, - // Block 0x4f, offset 0x13c0 - 0x13c0: 0x00c0, 0x13c1: 0x00c0, 0x13c2: 0x00c0, 0x13c3: 0x00c0, 0x13c4: 0x00c0, 0x13c5: 0x00c0, - 0x13c6: 0x00c3, 0x13c7: 0x00c0, 0x13c8: 0x00c0, 0x13c9: 0x00c3, 0x13ca: 0x00c3, 0x13cb: 0x00c3, - 0x13cc: 0x00c3, 0x13cd: 0x00c3, 0x13ce: 0x00c3, 0x13cf: 0x00c3, 0x13d0: 0x00c3, 0x13d1: 0x00c3, - 0x13d2: 0x00c6, 0x13d3: 0x00c3, 0x13d4: 0x0080, 0x13d5: 0x0080, 0x13d6: 0x0080, 0x13d7: 0x00c0, - 0x13d8: 0x0080, 0x13d9: 0x0080, 0x13da: 0x0080, 0x13db: 0x0080, 0x13dc: 0x00c0, 0x13dd: 0x00c3, - 0x13e0: 0x00c0, 0x13e1: 0x00c0, 0x13e2: 0x00c0, 0x13e3: 0x00c0, - 0x13e4: 0x00c0, 0x13e5: 0x00c0, 0x13e6: 0x00c0, 0x13e7: 0x00c0, 0x13e8: 0x00c0, 0x13e9: 0x00c0, - 0x13f0: 0x0080, 0x13f1: 0x0080, 0x13f2: 0x0080, 0x13f3: 0x0080, 0x13f4: 0x0080, 0x13f5: 0x0080, - 0x13f6: 0x0080, 0x13f7: 0x0080, 0x13f8: 0x0080, 0x13f9: 0x0080, - // Block 0x50, offset 0x1400 - 0x1400: 0x0080, 0x1401: 0x0080, 0x1402: 0x0080, 0x1403: 0x0080, 0x1404: 0x0080, 0x1405: 0x0080, - 0x1406: 0x0080, 0x1407: 0x0082, 0x1408: 0x0080, 0x1409: 0x0080, 0x140a: 0x0080, 0x140b: 0x0040, - 0x140c: 0x0040, 0x140d: 0x0040, 0x140e: 0x0040, 0x1410: 0x00c0, 0x1411: 0x00c0, - 0x1412: 0x00c0, 0x1413: 0x00c0, 0x1414: 0x00c0, 0x1415: 0x00c0, 0x1416: 0x00c0, 0x1417: 0x00c0, - 0x1418: 0x00c0, 0x1419: 0x00c0, - 0x1420: 0x00c2, 0x1421: 0x00c2, 0x1422: 0x00c2, 0x1423: 0x00c2, - 0x1424: 0x00c2, 0x1425: 0x00c2, 0x1426: 0x00c2, 0x1427: 0x00c2, 0x1428: 0x00c2, 0x1429: 0x00c2, - 0x142a: 0x00c2, 0x142b: 0x00c2, 0x142c: 0x00c2, 0x142d: 0x00c2, 0x142e: 0x00c2, 0x142f: 0x00c2, - 0x1430: 0x00c2, 0x1431: 0x00c2, 0x1432: 0x00c2, 0x1433: 0x00c2, 0x1434: 0x00c2, 0x1435: 0x00c2, - 0x1436: 0x00c2, 0x1437: 0x00c2, 0x1438: 0x00c2, 0x1439: 0x00c2, 0x143a: 0x00c2, 0x143b: 0x00c2, - 0x143c: 0x00c2, 0x143d: 0x00c2, 0x143e: 0x00c2, 0x143f: 0x00c2, - // Block 0x51, offset 0x1440 - 0x1440: 0x00c2, 0x1441: 0x00c2, 0x1442: 0x00c2, 0x1443: 0x00c2, 0x1444: 0x00c2, 0x1445: 0x00c2, - 0x1446: 0x00c2, 0x1447: 0x00c2, 0x1448: 0x00c2, 0x1449: 0x00c2, 0x144a: 0x00c2, 0x144b: 0x00c2, - 0x144c: 0x00c2, 0x144d: 0x00c2, 0x144e: 0x00c2, 0x144f: 0x00c2, 0x1450: 0x00c2, 0x1451: 0x00c2, - 0x1452: 0x00c2, 0x1453: 0x00c2, 0x1454: 0x00c2, 0x1455: 0x00c2, 0x1456: 0x00c2, 0x1457: 0x00c2, - 0x1458: 0x00c2, 0x1459: 0x00c2, 0x145a: 0x00c2, 0x145b: 0x00c2, 0x145c: 0x00c2, 0x145d: 0x00c2, - 0x145e: 0x00c2, 0x145f: 0x00c2, 0x1460: 0x00c2, 0x1461: 0x00c2, 0x1462: 0x00c2, 0x1463: 0x00c2, - 0x1464: 0x00c2, 0x1465: 0x00c2, 0x1466: 0x00c2, 0x1467: 0x00c2, 0x1468: 0x00c2, 0x1469: 0x00c2, - 0x146a: 0x00c2, 0x146b: 0x00c2, 0x146c: 0x00c2, 0x146d: 0x00c2, 0x146e: 0x00c2, 0x146f: 0x00c2, - 0x1470: 0x00c2, 0x1471: 0x00c2, 0x1472: 0x00c2, 0x1473: 0x00c2, 0x1474: 0x00c2, 0x1475: 0x00c2, - 0x1476: 0x00c2, 0x1477: 0x00c2, - // Block 0x52, offset 0x1480 - 0x1480: 0x00c0, 0x1481: 0x00c0, 0x1482: 0x00c0, 0x1483: 0x00c0, 0x1484: 0x00c0, 0x1485: 0x00c3, - 0x1486: 0x00c3, 0x1487: 0x00c2, 0x1488: 0x00c2, 0x1489: 0x00c2, 0x148a: 0x00c2, 0x148b: 0x00c2, - 0x148c: 0x00c2, 0x148d: 0x00c2, 0x148e: 0x00c2, 0x148f: 0x00c2, 0x1490: 0x00c2, 0x1491: 0x00c2, - 0x1492: 0x00c2, 0x1493: 0x00c2, 0x1494: 0x00c2, 0x1495: 0x00c2, 0x1496: 0x00c2, 0x1497: 0x00c2, - 0x1498: 0x00c2, 0x1499: 0x00c2, 0x149a: 0x00c2, 0x149b: 0x00c2, 0x149c: 0x00c2, 0x149d: 0x00c2, - 0x149e: 0x00c2, 0x149f: 0x00c2, 0x14a0: 0x00c2, 0x14a1: 0x00c2, 0x14a2: 0x00c2, 0x14a3: 0x00c2, - 0x14a4: 0x00c2, 0x14a5: 0x00c2, 0x14a6: 0x00c2, 0x14a7: 0x00c2, 0x14a8: 0x00c2, 0x14a9: 0x00c3, - 0x14aa: 0x00c2, - 0x14b0: 0x00c0, 0x14b1: 0x00c0, 0x14b2: 0x00c0, 0x14b3: 0x00c0, 0x14b4: 0x00c0, 0x14b5: 0x00c0, - 0x14b6: 0x00c0, 0x14b7: 0x00c0, 0x14b8: 0x00c0, 0x14b9: 0x00c0, 0x14ba: 0x00c0, 0x14bb: 0x00c0, - 0x14bc: 0x00c0, 0x14bd: 0x00c0, 0x14be: 0x00c0, 0x14bf: 0x00c0, - // Block 0x53, offset 0x14c0 - 0x14c0: 0x00c0, 0x14c1: 0x00c0, 0x14c2: 0x00c0, 0x14c3: 0x00c0, 0x14c4: 0x00c0, 0x14c5: 0x00c0, - 0x14c6: 0x00c0, 0x14c7: 0x00c0, 0x14c8: 0x00c0, 0x14c9: 0x00c0, 0x14ca: 0x00c0, 0x14cb: 0x00c0, - 0x14cc: 0x00c0, 0x14cd: 0x00c0, 0x14ce: 0x00c0, 0x14cf: 0x00c0, 0x14d0: 0x00c0, 0x14d1: 0x00c0, - 0x14d2: 0x00c0, 0x14d3: 0x00c0, 0x14d4: 0x00c0, 0x14d5: 0x00c0, 0x14d6: 0x00c0, 0x14d7: 0x00c0, - 0x14d8: 0x00c0, 0x14d9: 0x00c0, 0x14da: 0x00c0, 0x14db: 0x00c0, 0x14dc: 0x00c0, 0x14dd: 0x00c0, - 0x14de: 0x00c0, 0x14df: 0x00c0, 0x14e0: 0x00c0, 0x14e1: 0x00c0, 0x14e2: 0x00c0, 0x14e3: 0x00c0, - 0x14e4: 0x00c0, 0x14e5: 0x00c0, 0x14e6: 0x00c0, 0x14e7: 0x00c0, 0x14e8: 0x00c0, 0x14e9: 0x00c0, - 0x14ea: 0x00c0, 0x14eb: 0x00c0, 0x14ec: 0x00c0, 0x14ed: 0x00c0, 0x14ee: 0x00c0, 0x14ef: 0x00c0, - 0x14f0: 0x00c0, 0x14f1: 0x00c0, 0x14f2: 0x00c0, 0x14f3: 0x00c0, 0x14f4: 0x00c0, 0x14f5: 0x00c0, - // Block 0x54, offset 0x1500 - 0x1500: 0x00c0, 0x1501: 0x00c0, 0x1502: 0x00c0, 0x1503: 0x00c0, 0x1504: 0x00c0, 0x1505: 0x00c0, - 0x1506: 0x00c0, 0x1507: 0x00c0, 0x1508: 0x00c0, 0x1509: 0x00c0, 0x150a: 0x00c0, 0x150b: 0x00c0, - 0x150c: 0x00c0, 0x150d: 0x00c0, 0x150e: 0x00c0, 0x150f: 0x00c0, 0x1510: 0x00c0, 0x1511: 0x00c0, - 0x1512: 0x00c0, 0x1513: 0x00c0, 0x1514: 0x00c0, 0x1515: 0x00c0, 0x1516: 0x00c0, 0x1517: 0x00c0, - 0x1518: 0x00c0, 0x1519: 0x00c0, 0x151a: 0x00c0, 0x151b: 0x00c0, 0x151c: 0x00c0, 0x151d: 0x00c0, - 0x151e: 0x00c0, 0x1520: 0x00c3, 0x1521: 0x00c3, 0x1522: 0x00c3, 0x1523: 0x00c0, - 0x1524: 0x00c0, 0x1525: 0x00c0, 0x1526: 0x00c0, 0x1527: 0x00c3, 0x1528: 0x00c3, 0x1529: 0x00c0, - 0x152a: 0x00c0, 0x152b: 0x00c0, - 0x1530: 0x00c0, 0x1531: 0x00c0, 0x1532: 0x00c3, 0x1533: 0x00c0, 0x1534: 0x00c0, 0x1535: 0x00c0, - 0x1536: 0x00c0, 0x1537: 0x00c0, 0x1538: 0x00c0, 0x1539: 0x00c3, 0x153a: 0x00c3, 0x153b: 0x00c3, - // Block 0x55, offset 0x1540 - 0x1540: 0x0080, 0x1544: 0x0080, 0x1545: 0x0080, - 0x1546: 0x00c0, 0x1547: 0x00c0, 0x1548: 0x00c0, 0x1549: 0x00c0, 0x154a: 0x00c0, 0x154b: 0x00c0, - 0x154c: 0x00c0, 0x154d: 0x00c0, 0x154e: 0x00c0, 0x154f: 0x00c0, 0x1550: 0x00c0, 0x1551: 0x00c0, - 0x1552: 0x00c0, 0x1553: 0x00c0, 0x1554: 0x00c0, 0x1555: 0x00c0, 0x1556: 0x00c0, 0x1557: 0x00c0, - 0x1558: 0x00c0, 0x1559: 0x00c0, 0x155a: 0x00c0, 0x155b: 0x00c0, 0x155c: 0x00c0, 0x155d: 0x00c0, - 0x155e: 0x00c0, 0x155f: 0x00c0, 0x1560: 0x00c0, 0x1561: 0x00c0, 0x1562: 0x00c0, 0x1563: 0x00c0, - 0x1564: 0x00c0, 0x1565: 0x00c0, 0x1566: 0x00c0, 0x1567: 0x00c0, 0x1568: 0x00c0, 0x1569: 0x00c0, - 0x156a: 0x00c0, 0x156b: 0x00c0, 0x156c: 0x00c0, 0x156d: 0x00c0, - 0x1570: 0x00c0, 0x1571: 0x00c0, 0x1572: 0x00c0, 0x1573: 0x00c0, 0x1574: 0x00c0, - // Block 0x56, offset 0x1580 - 0x1580: 0x00c0, 0x1581: 0x00c0, 0x1582: 0x00c0, 0x1583: 0x00c0, 0x1584: 0x00c0, 0x1585: 0x00c0, - 0x1586: 0x00c0, 0x1587: 0x00c0, 0x1588: 0x00c0, 0x1589: 0x00c0, 0x158a: 0x00c0, 0x158b: 0x00c0, - 0x158c: 0x00c0, 0x158d: 0x00c0, 0x158e: 0x00c0, 0x158f: 0x00c0, 0x1590: 0x00c0, 0x1591: 0x00c0, - 0x1592: 0x00c0, 0x1593: 0x00c0, 0x1594: 0x00c0, 0x1595: 0x00c0, 0x1596: 0x00c0, 0x1597: 0x00c0, - 0x1598: 0x00c0, 0x1599: 0x00c0, 0x159a: 0x00c0, 0x159b: 0x00c0, 0x159c: 0x00c0, 0x159d: 0x00c0, - 0x159e: 0x00c0, 0x159f: 0x00c0, 0x15a0: 0x00c0, 0x15a1: 0x00c0, 0x15a2: 0x00c0, 0x15a3: 0x00c0, - 0x15a4: 0x00c0, 0x15a5: 0x00c0, 0x15a6: 0x00c0, 0x15a7: 0x00c0, 0x15a8: 0x00c0, 0x15a9: 0x00c0, - 0x15aa: 0x00c0, 0x15ab: 0x00c0, - 0x15b0: 0x00c0, 0x15b1: 0x00c0, 0x15b2: 0x00c0, 0x15b3: 0x00c0, 0x15b4: 0x00c0, 0x15b5: 0x00c0, - 0x15b6: 0x00c0, 0x15b7: 0x00c0, 0x15b8: 0x00c0, 0x15b9: 0x00c0, 0x15ba: 0x00c0, 0x15bb: 0x00c0, - 0x15bc: 0x00c0, 0x15bd: 0x00c0, 0x15be: 0x00c0, 0x15bf: 0x00c0, - // Block 0x57, offset 0x15c0 - 0x15c0: 0x00c0, 0x15c1: 0x00c0, 0x15c2: 0x00c0, 0x15c3: 0x00c0, 0x15c4: 0x00c0, 0x15c5: 0x00c0, - 0x15c6: 0x00c0, 0x15c7: 0x00c0, 0x15c8: 0x00c0, 0x15c9: 0x00c0, - 0x15d0: 0x00c0, 0x15d1: 0x00c0, - 0x15d2: 0x00c0, 0x15d3: 0x00c0, 0x15d4: 0x00c0, 0x15d5: 0x00c0, 0x15d6: 0x00c0, 0x15d7: 0x00c0, - 0x15d8: 0x00c0, 0x15d9: 0x00c0, 0x15da: 0x0080, - 0x15de: 0x0080, 0x15df: 0x0080, 0x15e0: 0x0080, 0x15e1: 0x0080, 0x15e2: 0x0080, 0x15e3: 0x0080, - 0x15e4: 0x0080, 0x15e5: 0x0080, 0x15e6: 0x0080, 0x15e7: 0x0080, 0x15e8: 0x0080, 0x15e9: 0x0080, - 0x15ea: 0x0080, 0x15eb: 0x0080, 0x15ec: 0x0080, 0x15ed: 0x0080, 0x15ee: 0x0080, 0x15ef: 0x0080, - 0x15f0: 0x0080, 0x15f1: 0x0080, 0x15f2: 0x0080, 0x15f3: 0x0080, 0x15f4: 0x0080, 0x15f5: 0x0080, - 0x15f6: 0x0080, 0x15f7: 0x0080, 0x15f8: 0x0080, 0x15f9: 0x0080, 0x15fa: 0x0080, 0x15fb: 0x0080, - 0x15fc: 0x0080, 0x15fd: 0x0080, 0x15fe: 0x0080, 0x15ff: 0x0080, - // Block 0x58, offset 0x1600 - 0x1600: 0x00c0, 0x1601: 0x00c0, 0x1602: 0x00c0, 0x1603: 0x00c0, 0x1604: 0x00c0, 0x1605: 0x00c0, - 0x1606: 0x00c0, 0x1607: 0x00c0, 0x1608: 0x00c0, 0x1609: 0x00c0, 0x160a: 0x00c0, 0x160b: 0x00c0, - 0x160c: 0x00c0, 0x160d: 0x00c0, 0x160e: 0x00c0, 0x160f: 0x00c0, 0x1610: 0x00c0, 0x1611: 0x00c0, - 0x1612: 0x00c0, 0x1613: 0x00c0, 0x1614: 0x00c0, 0x1615: 0x00c0, 0x1616: 0x00c0, 0x1617: 0x00c3, - 0x1618: 0x00c3, 0x1619: 0x00c0, 0x161a: 0x00c0, 0x161b: 0x00c3, - 0x161e: 0x0080, 0x161f: 0x0080, 0x1620: 0x00c0, 0x1621: 0x00c0, 0x1622: 0x00c0, 0x1623: 0x00c0, - 0x1624: 0x00c0, 0x1625: 0x00c0, 0x1626: 0x00c0, 0x1627: 0x00c0, 0x1628: 0x00c0, 0x1629: 0x00c0, - 0x162a: 0x00c0, 0x162b: 0x00c0, 0x162c: 0x00c0, 0x162d: 0x00c0, 0x162e: 0x00c0, 0x162f: 0x00c0, - 0x1630: 0x00c0, 0x1631: 0x00c0, 0x1632: 0x00c0, 0x1633: 0x00c0, 0x1634: 0x00c0, 0x1635: 0x00c0, - 0x1636: 0x00c0, 0x1637: 0x00c0, 0x1638: 0x00c0, 0x1639: 0x00c0, 0x163a: 0x00c0, 0x163b: 0x00c0, - 0x163c: 0x00c0, 0x163d: 0x00c0, 0x163e: 0x00c0, 0x163f: 0x00c0, - // Block 0x59, offset 0x1640 - 0x1640: 0x00c0, 0x1641: 0x00c0, 0x1642: 0x00c0, 0x1643: 0x00c0, 0x1644: 0x00c0, 0x1645: 0x00c0, - 0x1646: 0x00c0, 0x1647: 0x00c0, 0x1648: 0x00c0, 0x1649: 0x00c0, 0x164a: 0x00c0, 0x164b: 0x00c0, - 0x164c: 0x00c0, 0x164d: 0x00c0, 0x164e: 0x00c0, 0x164f: 0x00c0, 0x1650: 0x00c0, 0x1651: 0x00c0, - 0x1652: 0x00c0, 0x1653: 0x00c0, 0x1654: 0x00c0, 0x1655: 0x00c0, 0x1656: 0x00c3, 0x1657: 0x00c0, - 0x1658: 0x00c3, 0x1659: 0x00c3, 0x165a: 0x00c3, 0x165b: 0x00c3, 0x165c: 0x00c3, 0x165d: 0x00c3, - 0x165e: 0x00c3, 0x1660: 0x00c6, 0x1661: 0x00c0, 0x1662: 0x00c3, 0x1663: 0x00c0, - 0x1664: 0x00c0, 0x1665: 0x00c3, 0x1666: 0x00c3, 0x1667: 0x00c3, 0x1668: 0x00c3, 0x1669: 0x00c3, - 0x166a: 0x00c3, 0x166b: 0x00c3, 0x166c: 0x00c3, 0x166d: 0x00c0, 0x166e: 0x00c0, 0x166f: 0x00c0, - 0x1670: 0x00c0, 0x1671: 0x00c0, 0x1672: 0x00c0, 0x1673: 0x00c3, 0x1674: 0x00c3, 0x1675: 0x00c3, - 0x1676: 0x00c3, 0x1677: 0x00c3, 0x1678: 0x00c3, 0x1679: 0x00c3, 0x167a: 0x00c3, 0x167b: 0x00c3, - 0x167c: 0x00c3, 0x167f: 0x00c3, - // Block 0x5a, offset 0x1680 - 0x1680: 0x00c0, 0x1681: 0x00c0, 0x1682: 0x00c0, 0x1683: 0x00c0, 0x1684: 0x00c0, 0x1685: 0x00c0, - 0x1686: 0x00c0, 0x1687: 0x00c0, 0x1688: 0x00c0, 0x1689: 0x00c0, - 0x1690: 0x00c0, 0x1691: 0x00c0, - 0x1692: 0x00c0, 0x1693: 0x00c0, 0x1694: 0x00c0, 0x1695: 0x00c0, 0x1696: 0x00c0, 0x1697: 0x00c0, - 0x1698: 0x00c0, 0x1699: 0x00c0, - 0x16a0: 0x0080, 0x16a1: 0x0080, 0x16a2: 0x0080, 0x16a3: 0x0080, - 0x16a4: 0x0080, 0x16a5: 0x0080, 0x16a6: 0x0080, 0x16a7: 0x00c0, 0x16a8: 0x0080, 0x16a9: 0x0080, - 0x16aa: 0x0080, 0x16ab: 0x0080, 0x16ac: 0x0080, 0x16ad: 0x0080, - 0x16b0: 0x00c3, 0x16b1: 0x00c3, 0x16b2: 0x00c3, 0x16b3: 0x00c3, 0x16b4: 0x00c3, 0x16b5: 0x00c3, - 0x16b6: 0x00c3, 0x16b7: 0x00c3, 0x16b8: 0x00c3, 0x16b9: 0x00c3, 0x16ba: 0x00c3, 0x16bb: 0x00c3, - 0x16bc: 0x00c3, 0x16bd: 0x00c3, 0x16be: 0x0083, - // Block 0x5b, offset 0x16c0 - 0x16c0: 0x00c3, 0x16c1: 0x00c3, 0x16c2: 0x00c3, 0x16c3: 0x00c3, 0x16c4: 0x00c0, 0x16c5: 0x00c0, - 0x16c6: 0x00c0, 0x16c7: 0x00c0, 0x16c8: 0x00c0, 0x16c9: 0x00c0, 0x16ca: 0x00c0, 0x16cb: 0x00c0, - 0x16cc: 0x00c0, 0x16cd: 0x00c0, 0x16ce: 0x00c0, 0x16cf: 0x00c0, 0x16d0: 0x00c0, 0x16d1: 0x00c0, - 0x16d2: 0x00c0, 0x16d3: 0x00c0, 0x16d4: 0x00c0, 0x16d5: 0x00c0, 0x16d6: 0x00c0, 0x16d7: 0x00c0, - 0x16d8: 0x00c0, 0x16d9: 0x00c0, 0x16da: 0x00c0, 0x16db: 0x00c0, 0x16dc: 0x00c0, 0x16dd: 0x00c0, - 0x16de: 0x00c0, 0x16df: 0x00c0, 0x16e0: 0x00c0, 0x16e1: 0x00c0, 0x16e2: 0x00c0, 0x16e3: 0x00c0, - 0x16e4: 0x00c0, 0x16e5: 0x00c0, 0x16e6: 0x00c0, 0x16e7: 0x00c0, 0x16e8: 0x00c0, 0x16e9: 0x00c0, - 0x16ea: 0x00c0, 0x16eb: 0x00c0, 0x16ec: 0x00c0, 0x16ed: 0x00c0, 0x16ee: 0x00c0, 0x16ef: 0x00c0, - 0x16f0: 0x00c0, 0x16f1: 0x00c0, 0x16f2: 0x00c0, 0x16f3: 0x00c0, 0x16f4: 0x00c3, 0x16f5: 0x00c0, - 0x16f6: 0x00c3, 0x16f7: 0x00c3, 0x16f8: 0x00c3, 0x16f9: 0x00c3, 0x16fa: 0x00c3, 0x16fb: 0x00c0, - 0x16fc: 0x00c3, 0x16fd: 0x00c0, 0x16fe: 0x00c0, 0x16ff: 0x00c0, - // Block 0x5c, offset 0x1700 - 0x1700: 0x00c0, 0x1701: 0x00c0, 0x1702: 0x00c3, 0x1703: 0x00c0, 0x1704: 0x00c5, 0x1705: 0x00c0, - 0x1706: 0x00c0, 0x1707: 0x00c0, 0x1708: 0x00c0, 0x1709: 0x00c0, 0x170a: 0x00c0, 0x170b: 0x00c0, - 0x1710: 0x00c0, 0x1711: 0x00c0, - 0x1712: 0x00c0, 0x1713: 0x00c0, 0x1714: 0x00c0, 0x1715: 0x00c0, 0x1716: 0x00c0, 0x1717: 0x00c0, - 0x1718: 0x00c0, 0x1719: 0x00c0, 0x171a: 0x0080, 0x171b: 0x0080, 0x171c: 0x0080, 0x171d: 0x0080, - 0x171e: 0x0080, 0x171f: 0x0080, 0x1720: 0x0080, 0x1721: 0x0080, 0x1722: 0x0080, 0x1723: 0x0080, - 0x1724: 0x0080, 0x1725: 0x0080, 0x1726: 0x0080, 0x1727: 0x0080, 0x1728: 0x0080, 0x1729: 0x0080, - 0x172a: 0x0080, 0x172b: 0x00c3, 0x172c: 0x00c3, 0x172d: 0x00c3, 0x172e: 0x00c3, 0x172f: 0x00c3, - 0x1730: 0x00c3, 0x1731: 0x00c3, 0x1732: 0x00c3, 0x1733: 0x00c3, 0x1734: 0x0080, 0x1735: 0x0080, - 0x1736: 0x0080, 0x1737: 0x0080, 0x1738: 0x0080, 0x1739: 0x0080, 0x173a: 0x0080, 0x173b: 0x0080, - 0x173c: 0x0080, - // Block 0x5d, offset 0x1740 - 0x1740: 0x00c3, 0x1741: 0x00c3, 0x1742: 0x00c0, 0x1743: 0x00c0, 0x1744: 0x00c0, 0x1745: 0x00c0, - 0x1746: 0x00c0, 0x1747: 0x00c0, 0x1748: 0x00c0, 0x1749: 0x00c0, 0x174a: 0x00c0, 0x174b: 0x00c0, - 0x174c: 0x00c0, 0x174d: 0x00c0, 0x174e: 0x00c0, 0x174f: 0x00c0, 0x1750: 0x00c0, 0x1751: 0x00c0, - 0x1752: 0x00c0, 0x1753: 0x00c0, 0x1754: 0x00c0, 0x1755: 0x00c0, 0x1756: 0x00c0, 0x1757: 0x00c0, - 0x1758: 0x00c0, 0x1759: 0x00c0, 0x175a: 0x00c0, 0x175b: 0x00c0, 0x175c: 0x00c0, 0x175d: 0x00c0, - 0x175e: 0x00c0, 0x175f: 0x00c0, 0x1760: 0x00c0, 0x1761: 0x00c0, 0x1762: 0x00c3, 0x1763: 0x00c3, - 0x1764: 0x00c3, 0x1765: 0x00c3, 0x1766: 0x00c0, 0x1767: 0x00c0, 0x1768: 0x00c3, 0x1769: 0x00c3, - 0x176a: 0x00c5, 0x176b: 0x00c6, 0x176c: 0x00c3, 0x176d: 0x00c3, 0x176e: 0x00c0, 0x176f: 0x00c0, - 0x1770: 0x00c0, 0x1771: 0x00c0, 0x1772: 0x00c0, 0x1773: 0x00c0, 0x1774: 0x00c0, 0x1775: 0x00c0, - 0x1776: 0x00c0, 0x1777: 0x00c0, 0x1778: 0x00c0, 0x1779: 0x00c0, 0x177a: 0x00c0, 0x177b: 0x00c0, - 0x177c: 0x00c0, 0x177d: 0x00c0, 0x177e: 0x00c0, 0x177f: 0x00c0, - // Block 0x5e, offset 0x1780 - 0x1780: 0x00c0, 0x1781: 0x00c0, 0x1782: 0x00c0, 0x1783: 0x00c0, 0x1784: 0x00c0, 0x1785: 0x00c0, - 0x1786: 0x00c0, 0x1787: 0x00c0, 0x1788: 0x00c0, 0x1789: 0x00c0, 0x178a: 0x00c0, 0x178b: 0x00c0, - 0x178c: 0x00c0, 0x178d: 0x00c0, 0x178e: 0x00c0, 0x178f: 0x00c0, 0x1790: 0x00c0, 0x1791: 0x00c0, - 0x1792: 0x00c0, 0x1793: 0x00c0, 0x1794: 0x00c0, 0x1795: 0x00c0, 0x1796: 0x00c0, 0x1797: 0x00c0, - 0x1798: 0x00c0, 0x1799: 0x00c0, 0x179a: 0x00c0, 0x179b: 0x00c0, 0x179c: 0x00c0, 0x179d: 0x00c0, - 0x179e: 0x00c0, 0x179f: 0x00c0, 0x17a0: 0x00c0, 0x17a1: 0x00c0, 0x17a2: 0x00c0, 0x17a3: 0x00c0, - 0x17a4: 0x00c0, 0x17a5: 0x00c0, 0x17a6: 0x00c3, 0x17a7: 0x00c0, 0x17a8: 0x00c3, 0x17a9: 0x00c3, - 0x17aa: 0x00c0, 0x17ab: 0x00c0, 0x17ac: 0x00c0, 0x17ad: 0x00c3, 0x17ae: 0x00c0, 0x17af: 0x00c3, - 0x17b0: 0x00c3, 0x17b1: 0x00c3, 0x17b2: 0x00c5, 0x17b3: 0x00c5, - 0x17bc: 0x0080, 0x17bd: 0x0080, 0x17be: 0x0080, 0x17bf: 0x0080, - // Block 0x5f, offset 0x17c0 - 0x17c0: 0x00c0, 0x17c1: 0x00c0, 0x17c2: 0x00c0, 0x17c3: 0x00c0, 0x17c4: 0x00c0, 0x17c5: 0x00c0, - 0x17c6: 0x00c0, 0x17c7: 0x00c0, 0x17c8: 0x00c0, 0x17c9: 0x00c0, 0x17ca: 0x00c0, 0x17cb: 0x00c0, - 0x17cc: 0x00c0, 0x17cd: 0x00c0, 0x17ce: 0x00c0, 0x17cf: 0x00c0, 0x17d0: 0x00c0, 0x17d1: 0x00c0, - 0x17d2: 0x00c0, 0x17d3: 0x00c0, 0x17d4: 0x00c0, 0x17d5: 0x00c0, 0x17d6: 0x00c0, 0x17d7: 0x00c0, - 0x17d8: 0x00c0, 0x17d9: 0x00c0, 0x17da: 0x00c0, 0x17db: 0x00c0, 0x17dc: 0x00c0, 0x17dd: 0x00c0, - 0x17de: 0x00c0, 0x17df: 0x00c0, 0x17e0: 0x00c0, 0x17e1: 0x00c0, 0x17e2: 0x00c0, 0x17e3: 0x00c0, - 0x17e4: 0x00c0, 0x17e5: 0x00c0, 0x17e6: 0x00c0, 0x17e7: 0x00c0, 0x17e8: 0x00c0, 0x17e9: 0x00c0, - 0x17ea: 0x00c0, 0x17eb: 0x00c0, 0x17ec: 0x00c3, 0x17ed: 0x00c3, 0x17ee: 0x00c3, 0x17ef: 0x00c3, - 0x17f0: 0x00c3, 0x17f1: 0x00c3, 0x17f2: 0x00c3, 0x17f3: 0x00c3, 0x17f4: 0x00c0, 0x17f5: 0x00c0, - 0x17f6: 0x00c3, 0x17f7: 0x00c3, 0x17fb: 0x0080, - 0x17fc: 0x0080, 0x17fd: 0x0080, 0x17fe: 0x0080, 0x17ff: 0x0080, - // Block 0x60, offset 0x1800 - 0x1800: 0x00c0, 0x1801: 0x00c0, 0x1802: 0x00c0, 0x1803: 0x00c0, 0x1804: 0x00c0, 0x1805: 0x00c0, - 0x1806: 0x00c0, 0x1807: 0x00c0, 0x1808: 0x00c0, 0x1809: 0x00c0, - 0x180d: 0x00c0, 0x180e: 0x00c0, 0x180f: 0x00c0, 0x1810: 0x00c0, 0x1811: 0x00c0, - 0x1812: 0x00c0, 0x1813: 0x00c0, 0x1814: 0x00c0, 0x1815: 0x00c0, 0x1816: 0x00c0, 0x1817: 0x00c0, - 0x1818: 0x00c0, 0x1819: 0x00c0, 0x181a: 0x00c0, 0x181b: 0x00c0, 0x181c: 0x00c0, 0x181d: 0x00c0, - 0x181e: 0x00c0, 0x181f: 0x00c0, 0x1820: 0x00c0, 0x1821: 0x00c0, 0x1822: 0x00c0, 0x1823: 0x00c0, - 0x1824: 0x00c0, 0x1825: 0x00c0, 0x1826: 0x00c0, 0x1827: 0x00c0, 0x1828: 0x00c0, 0x1829: 0x00c0, - 0x182a: 0x00c0, 0x182b: 0x00c0, 0x182c: 0x00c0, 0x182d: 0x00c0, 0x182e: 0x00c0, 0x182f: 0x00c0, - 0x1830: 0x00c0, 0x1831: 0x00c0, 0x1832: 0x00c0, 0x1833: 0x00c0, 0x1834: 0x00c0, 0x1835: 0x00c0, - 0x1836: 0x00c0, 0x1837: 0x00c0, 0x1838: 0x00c0, 0x1839: 0x00c0, 0x183a: 0x00c0, 0x183b: 0x00c0, - 0x183c: 0x00c0, 0x183d: 0x00c0, 0x183e: 0x0080, 0x183f: 0x0080, - // Block 0x61, offset 0x1840 - 0x1840: 0x00c0, 0x1841: 0x00c0, 0x1842: 0x00c0, 0x1843: 0x00c0, 0x1844: 0x00c0, 0x1845: 0x00c0, - 0x1846: 0x00c0, 0x1847: 0x00c0, 0x1848: 0x00c0, - // Block 0x62, offset 0x1880 - 0x1880: 0x0080, 0x1881: 0x0080, 0x1882: 0x0080, 0x1883: 0x0080, 0x1884: 0x0080, 0x1885: 0x0080, - 0x1886: 0x0080, 0x1887: 0x0080, - 0x1890: 0x00c3, 0x1891: 0x00c3, - 0x1892: 0x00c3, 0x1893: 0x0080, 0x1894: 0x00c3, 0x1895: 0x00c3, 0x1896: 0x00c3, 0x1897: 0x00c3, - 0x1898: 0x00c3, 0x1899: 0x00c3, 0x189a: 0x00c3, 0x189b: 0x00c3, 0x189c: 0x00c3, 0x189d: 0x00c3, - 0x189e: 0x00c3, 0x189f: 0x00c3, 0x18a0: 0x00c3, 0x18a1: 0x00c0, 0x18a2: 0x00c3, 0x18a3: 0x00c3, - 0x18a4: 0x00c3, 0x18a5: 0x00c3, 0x18a6: 0x00c3, 0x18a7: 0x00c3, 0x18a8: 0x00c3, 0x18a9: 0x00c0, - 0x18aa: 0x00c0, 0x18ab: 0x00c0, 0x18ac: 0x00c0, 0x18ad: 0x00c3, 0x18ae: 0x00c0, 0x18af: 0x00c0, - 0x18b0: 0x00c0, 0x18b1: 0x00c0, 0x18b2: 0x00c0, 0x18b3: 0x00c0, 0x18b4: 0x00c3, 0x18b5: 0x00c0, - 0x18b6: 0x00c0, 0x18b8: 0x00c3, 0x18b9: 0x00c3, - // Block 0x63, offset 0x18c0 - 0x18c0: 0x00c0, 0x18c1: 0x00c0, 0x18c2: 0x00c0, 0x18c3: 0x00c0, 0x18c4: 0x00c0, 0x18c5: 0x00c0, - 0x18c6: 0x00c0, 0x18c7: 0x00c0, 0x18c8: 0x00c0, 0x18c9: 0x00c0, 0x18ca: 0x00c0, 0x18cb: 0x00c0, - 0x18cc: 0x00c0, 0x18cd: 0x00c0, 0x18ce: 0x00c0, 0x18cf: 0x00c0, 0x18d0: 0x00c0, 0x18d1: 0x00c0, - 0x18d2: 0x00c0, 0x18d3: 0x00c0, 0x18d4: 0x00c0, 0x18d5: 0x00c0, 0x18d6: 0x00c0, 0x18d7: 0x00c0, - 0x18d8: 0x00c0, 0x18d9: 0x00c0, 0x18da: 0x00c0, 0x18db: 0x00c0, 0x18dc: 0x00c0, 0x18dd: 0x00c0, - 0x18de: 0x00c0, 0x18df: 0x00c0, 0x18e0: 0x00c0, 0x18e1: 0x00c0, 0x18e2: 0x00c0, 0x18e3: 0x00c0, - 0x18e4: 0x00c0, 0x18e5: 0x00c0, 0x18e6: 0x00c8, 0x18e7: 0x00c8, 0x18e8: 0x00c8, 0x18e9: 0x00c8, - 0x18ea: 0x00c8, 0x18eb: 0x00c0, 0x18ec: 0x0080, 0x18ed: 0x0080, 0x18ee: 0x0080, 0x18ef: 0x00c0, - 0x18f0: 0x0080, 0x18f1: 0x0080, 0x18f2: 0x0080, 0x18f3: 0x0080, 0x18f4: 0x0080, 0x18f5: 0x0080, - 0x18f6: 0x0080, 0x18f7: 0x0080, 0x18f8: 0x0080, 0x18f9: 0x0080, 0x18fa: 0x0080, 0x18fb: 0x00c0, - 0x18fc: 0x0080, 0x18fd: 0x0080, 0x18fe: 0x0080, 0x18ff: 0x0080, - // Block 0x64, offset 0x1900 - 0x1900: 0x0080, 0x1901: 0x0080, 0x1902: 0x0080, 0x1903: 0x0080, 0x1904: 0x0080, 0x1905: 0x0080, - 0x1906: 0x0080, 0x1907: 0x0080, 0x1908: 0x0080, 0x1909: 0x0080, 0x190a: 0x0080, 0x190b: 0x0080, - 0x190c: 0x0080, 0x190d: 0x0080, 0x190e: 0x00c0, 0x190f: 0x0080, 0x1910: 0x0080, 0x1911: 0x0080, - 0x1912: 0x0080, 0x1913: 0x0080, 0x1914: 0x0080, 0x1915: 0x0080, 0x1916: 0x0080, 0x1917: 0x0080, - 0x1918: 0x0080, 0x1919: 0x0080, 0x191a: 0x0080, 0x191b: 0x0080, 0x191c: 0x0080, 0x191d: 0x0088, - 0x191e: 0x0088, 0x191f: 0x0088, 0x1920: 0x0088, 0x1921: 0x0088, 0x1922: 0x0080, 0x1923: 0x0080, - 0x1924: 0x0080, 0x1925: 0x0080, 0x1926: 0x0088, 0x1927: 0x0088, 0x1928: 0x0088, 0x1929: 0x0088, - 0x192a: 0x0088, 0x192b: 0x00c0, 0x192c: 0x00c0, 0x192d: 0x00c0, 0x192e: 0x00c0, 0x192f: 0x00c0, - 0x1930: 0x00c0, 0x1931: 0x00c0, 0x1932: 0x00c0, 0x1933: 0x00c0, 0x1934: 0x00c0, 0x1935: 0x00c0, - 0x1936: 0x00c0, 0x1937: 0x00c0, 0x1938: 0x0080, 0x1939: 0x00c0, 0x193a: 0x00c0, 0x193b: 0x00c0, - 0x193c: 0x00c0, 0x193d: 0x00c0, 0x193e: 0x00c0, 0x193f: 0x00c0, - // Block 0x65, offset 0x1940 - 0x1940: 0x00c0, 0x1941: 0x00c0, 0x1942: 0x00c0, 0x1943: 0x00c0, 0x1944: 0x00c0, 0x1945: 0x00c0, - 0x1946: 0x00c0, 0x1947: 0x00c0, 0x1948: 0x00c0, 0x1949: 0x00c0, 0x194a: 0x00c0, 0x194b: 0x00c0, - 0x194c: 0x00c0, 0x194d: 0x00c0, 0x194e: 0x00c0, 0x194f: 0x00c0, 0x1950: 0x00c0, 0x1951: 0x00c0, - 0x1952: 0x00c0, 0x1953: 0x00c0, 0x1954: 0x00c0, 0x1955: 0x00c0, 0x1956: 0x00c0, 0x1957: 0x00c0, - 0x1958: 0x00c0, 0x1959: 0x00c0, 0x195a: 0x00c0, 0x195b: 0x0080, 0x195c: 0x0080, 0x195d: 0x0080, - 0x195e: 0x0080, 0x195f: 0x0080, 0x1960: 0x0080, 0x1961: 0x0080, 0x1962: 0x0080, 0x1963: 0x0080, - 0x1964: 0x0080, 0x1965: 0x0080, 0x1966: 0x0080, 0x1967: 0x0080, 0x1968: 0x0080, 0x1969: 0x0080, - 0x196a: 0x0080, 0x196b: 0x0080, 0x196c: 0x0080, 0x196d: 0x0080, 0x196e: 0x0080, 0x196f: 0x0080, - 0x1970: 0x0080, 0x1971: 0x0080, 0x1972: 0x0080, 0x1973: 0x0080, 0x1974: 0x0080, 0x1975: 0x0080, - 0x1976: 0x0080, 0x1977: 0x0080, 0x1978: 0x0080, 0x1979: 0x0080, 0x197a: 0x0080, 0x197b: 0x0080, - 0x197c: 0x0080, 0x197d: 0x0080, 0x197e: 0x0080, 0x197f: 0x0088, - // Block 0x66, offset 0x1980 - 0x1980: 0x00c3, 0x1981: 0x00c3, 0x1982: 0x00c3, 0x1983: 0x00c3, 0x1984: 0x00c3, 0x1985: 0x00c3, - 0x1986: 0x00c3, 0x1987: 0x00c3, 0x1988: 0x00c3, 0x1989: 0x00c3, 0x198a: 0x00c3, 0x198b: 0x00c3, - 0x198c: 0x00c3, 0x198d: 0x00c3, 0x198e: 0x00c3, 0x198f: 0x00c3, 0x1990: 0x00c3, 0x1991: 0x00c3, - 0x1992: 0x00c3, 0x1993: 0x00c3, 0x1994: 0x00c3, 0x1995: 0x00c3, 0x1996: 0x00c3, 0x1997: 0x00c3, - 0x1998: 0x00c3, 0x1999: 0x00c3, 0x199a: 0x00c3, 0x199b: 0x00c3, 0x199c: 0x00c3, 0x199d: 0x00c3, - 0x199e: 0x00c3, 0x199f: 0x00c3, 0x19a0: 0x00c3, 0x19a1: 0x00c3, 0x19a2: 0x00c3, 0x19a3: 0x00c3, - 0x19a4: 0x00c3, 0x19a5: 0x00c3, 0x19a6: 0x00c3, 0x19a7: 0x00c3, 0x19a8: 0x00c3, 0x19a9: 0x00c3, - 0x19aa: 0x00c3, 0x19ab: 0x00c3, 0x19ac: 0x00c3, 0x19ad: 0x00c3, 0x19ae: 0x00c3, 0x19af: 0x00c3, - 0x19b0: 0x00c3, 0x19b1: 0x00c3, 0x19b2: 0x00c3, 0x19b3: 0x00c3, 0x19b4: 0x00c3, 0x19b5: 0x00c3, - 0x19bb: 0x00c3, - 0x19bc: 0x00c3, 0x19bd: 0x00c3, 0x19be: 0x00c3, 0x19bf: 0x00c3, - // Block 0x67, offset 0x19c0 - 0x19c0: 0x00c0, 0x19c1: 0x00c0, 0x19c2: 0x00c0, 0x19c3: 0x00c0, 0x19c4: 0x00c0, 0x19c5: 0x00c0, - 0x19c6: 0x00c0, 0x19c7: 0x00c0, 0x19c8: 0x00c0, 0x19c9: 0x00c0, 0x19ca: 0x00c0, 0x19cb: 0x00c0, - 0x19cc: 0x00c0, 0x19cd: 0x00c0, 0x19ce: 0x00c0, 0x19cf: 0x00c0, 0x19d0: 0x00c0, 0x19d1: 0x00c0, - 0x19d2: 0x00c0, 0x19d3: 0x00c0, 0x19d4: 0x00c0, 0x19d5: 0x00c0, 0x19d6: 0x00c0, 0x19d7: 0x00c0, - 0x19d8: 0x00c0, 0x19d9: 0x00c0, 0x19da: 0x0080, 0x19db: 0x0080, 0x19dc: 0x00c0, 0x19dd: 0x00c0, - 0x19de: 0x00c0, 0x19df: 0x00c0, 0x19e0: 0x00c0, 0x19e1: 0x00c0, 0x19e2: 0x00c0, 0x19e3: 0x00c0, - 0x19e4: 0x00c0, 0x19e5: 0x00c0, 0x19e6: 0x00c0, 0x19e7: 0x00c0, 0x19e8: 0x00c0, 0x19e9: 0x00c0, - 0x19ea: 0x00c0, 0x19eb: 0x00c0, 0x19ec: 0x00c0, 0x19ed: 0x00c0, 0x19ee: 0x00c0, 0x19ef: 0x00c0, - 0x19f0: 0x00c0, 0x19f1: 0x00c0, 0x19f2: 0x00c0, 0x19f3: 0x00c0, 0x19f4: 0x00c0, 0x19f5: 0x00c0, - 0x19f6: 0x00c0, 0x19f7: 0x00c0, 0x19f8: 0x00c0, 0x19f9: 0x00c0, 0x19fa: 0x00c0, 0x19fb: 0x00c0, - 0x19fc: 0x00c0, 0x19fd: 0x00c0, 0x19fe: 0x00c0, 0x19ff: 0x00c0, - // Block 0x68, offset 0x1a00 - 0x1a00: 0x00c8, 0x1a01: 0x00c8, 0x1a02: 0x00c8, 0x1a03: 0x00c8, 0x1a04: 0x00c8, 0x1a05: 0x00c8, - 0x1a06: 0x00c8, 0x1a07: 0x00c8, 0x1a08: 0x00c8, 0x1a09: 0x00c8, 0x1a0a: 0x00c8, 0x1a0b: 0x00c8, - 0x1a0c: 0x00c8, 0x1a0d: 0x00c8, 0x1a0e: 0x00c8, 0x1a0f: 0x00c8, 0x1a10: 0x00c8, 0x1a11: 0x00c8, - 0x1a12: 0x00c8, 0x1a13: 0x00c8, 0x1a14: 0x00c8, 0x1a15: 0x00c8, - 0x1a18: 0x00c8, 0x1a19: 0x00c8, 0x1a1a: 0x00c8, 0x1a1b: 0x00c8, 0x1a1c: 0x00c8, 0x1a1d: 0x00c8, - 0x1a20: 0x00c8, 0x1a21: 0x00c8, 0x1a22: 0x00c8, 0x1a23: 0x00c8, - 0x1a24: 0x00c8, 0x1a25: 0x00c8, 0x1a26: 0x00c8, 0x1a27: 0x00c8, 0x1a28: 0x00c8, 0x1a29: 0x00c8, - 0x1a2a: 0x00c8, 0x1a2b: 0x00c8, 0x1a2c: 0x00c8, 0x1a2d: 0x00c8, 0x1a2e: 0x00c8, 0x1a2f: 0x00c8, - 0x1a30: 0x00c8, 0x1a31: 0x00c8, 0x1a32: 0x00c8, 0x1a33: 0x00c8, 0x1a34: 0x00c8, 0x1a35: 0x00c8, - 0x1a36: 0x00c8, 0x1a37: 0x00c8, 0x1a38: 0x00c8, 0x1a39: 0x00c8, 0x1a3a: 0x00c8, 0x1a3b: 0x00c8, - 0x1a3c: 0x00c8, 0x1a3d: 0x00c8, 0x1a3e: 0x00c8, 0x1a3f: 0x00c8, - // Block 0x69, offset 0x1a40 - 0x1a40: 0x00c8, 0x1a41: 0x00c8, 0x1a42: 0x00c8, 0x1a43: 0x00c8, 0x1a44: 0x00c8, 0x1a45: 0x00c8, - 0x1a48: 0x00c8, 0x1a49: 0x00c8, 0x1a4a: 0x00c8, 0x1a4b: 0x00c8, - 0x1a4c: 0x00c8, 0x1a4d: 0x00c8, 0x1a50: 0x00c8, 0x1a51: 0x00c8, - 0x1a52: 0x00c8, 0x1a53: 0x00c8, 0x1a54: 0x00c8, 0x1a55: 0x00c8, 0x1a56: 0x00c8, 0x1a57: 0x00c8, - 0x1a59: 0x00c8, 0x1a5b: 0x00c8, 0x1a5d: 0x00c8, - 0x1a5f: 0x00c8, 0x1a60: 0x00c8, 0x1a61: 0x00c8, 0x1a62: 0x00c8, 0x1a63: 0x00c8, - 0x1a64: 0x00c8, 0x1a65: 0x00c8, 0x1a66: 0x00c8, 0x1a67: 0x00c8, 0x1a68: 0x00c8, 0x1a69: 0x00c8, - 0x1a6a: 0x00c8, 0x1a6b: 0x00c8, 0x1a6c: 0x00c8, 0x1a6d: 0x00c8, 0x1a6e: 0x00c8, 0x1a6f: 0x00c8, - 0x1a70: 0x00c8, 0x1a71: 0x0088, 0x1a72: 0x00c8, 0x1a73: 0x0088, 0x1a74: 0x00c8, 0x1a75: 0x0088, - 0x1a76: 0x00c8, 0x1a77: 0x0088, 0x1a78: 0x00c8, 0x1a79: 0x0088, 0x1a7a: 0x00c8, 0x1a7b: 0x0088, - 0x1a7c: 0x00c8, 0x1a7d: 0x0088, - // Block 0x6a, offset 0x1a80 - 0x1a80: 0x00c8, 0x1a81: 0x00c8, 0x1a82: 0x00c8, 0x1a83: 0x00c8, 0x1a84: 0x00c8, 0x1a85: 0x00c8, - 0x1a86: 0x00c8, 0x1a87: 0x00c8, 0x1a88: 0x0088, 0x1a89: 0x0088, 0x1a8a: 0x0088, 0x1a8b: 0x0088, - 0x1a8c: 0x0088, 0x1a8d: 0x0088, 0x1a8e: 0x0088, 0x1a8f: 0x0088, 0x1a90: 0x00c8, 0x1a91: 0x00c8, - 0x1a92: 0x00c8, 0x1a93: 0x00c8, 0x1a94: 0x00c8, 0x1a95: 0x00c8, 0x1a96: 0x00c8, 0x1a97: 0x00c8, - 0x1a98: 0x0088, 0x1a99: 0x0088, 0x1a9a: 0x0088, 0x1a9b: 0x0088, 0x1a9c: 0x0088, 0x1a9d: 0x0088, - 0x1a9e: 0x0088, 0x1a9f: 0x0088, 0x1aa0: 0x00c8, 0x1aa1: 0x00c8, 0x1aa2: 0x00c8, 0x1aa3: 0x00c8, - 0x1aa4: 0x00c8, 0x1aa5: 0x00c8, 0x1aa6: 0x00c8, 0x1aa7: 0x00c8, 0x1aa8: 0x0088, 0x1aa9: 0x0088, - 0x1aaa: 0x0088, 0x1aab: 0x0088, 0x1aac: 0x0088, 0x1aad: 0x0088, 0x1aae: 0x0088, 0x1aaf: 0x0088, - 0x1ab0: 0x00c8, 0x1ab1: 0x00c8, 0x1ab2: 0x00c8, 0x1ab3: 0x00c8, 0x1ab4: 0x00c8, - 0x1ab6: 0x00c8, 0x1ab7: 0x00c8, 0x1ab8: 0x00c8, 0x1ab9: 0x00c8, 0x1aba: 0x00c8, 0x1abb: 0x0088, - 0x1abc: 0x0088, 0x1abd: 0x0088, 0x1abe: 0x0088, 0x1abf: 0x0088, - // Block 0x6b, offset 0x1ac0 - 0x1ac0: 0x0088, 0x1ac1: 0x0088, 0x1ac2: 0x00c8, 0x1ac3: 0x00c8, 0x1ac4: 0x00c8, - 0x1ac6: 0x00c8, 0x1ac7: 0x00c8, 0x1ac8: 0x00c8, 0x1ac9: 0x0088, 0x1aca: 0x00c8, 0x1acb: 0x0088, - 0x1acc: 0x0088, 0x1acd: 0x0088, 0x1ace: 0x0088, 0x1acf: 0x0088, 0x1ad0: 0x00c8, 0x1ad1: 0x00c8, - 0x1ad2: 0x00c8, 0x1ad3: 0x0088, 0x1ad6: 0x00c8, 0x1ad7: 0x00c8, - 0x1ad8: 0x00c8, 0x1ad9: 0x00c8, 0x1ada: 0x00c8, 0x1adb: 0x0088, 0x1add: 0x0088, - 0x1ade: 0x0088, 0x1adf: 0x0088, 0x1ae0: 0x00c8, 0x1ae1: 0x00c8, 0x1ae2: 0x00c8, 0x1ae3: 0x0088, - 0x1ae4: 0x00c8, 0x1ae5: 0x00c8, 0x1ae6: 0x00c8, 0x1ae7: 0x00c8, 0x1ae8: 0x00c8, 0x1ae9: 0x00c8, - 0x1aea: 0x00c8, 0x1aeb: 0x0088, 0x1aec: 0x00c8, 0x1aed: 0x0088, 0x1aee: 0x0088, 0x1aef: 0x0088, - 0x1af2: 0x00c8, 0x1af3: 0x00c8, 0x1af4: 0x00c8, - 0x1af6: 0x00c8, 0x1af7: 0x00c8, 0x1af8: 0x00c8, 0x1af9: 0x0088, 0x1afa: 0x00c8, 0x1afb: 0x0088, - 0x1afc: 0x0088, 0x1afd: 0x0088, 0x1afe: 0x0088, - // Block 0x6c, offset 0x1b00 - 0x1b00: 0x0080, 0x1b01: 0x0080, 0x1b02: 0x0080, 0x1b03: 0x0080, 0x1b04: 0x0080, 0x1b05: 0x0080, - 0x1b06: 0x0080, 0x1b07: 0x0080, 0x1b08: 0x0080, 0x1b09: 0x0080, 0x1b0a: 0x0080, 0x1b0b: 0x0040, - 0x1b0c: 0x004d, 0x1b0d: 0x004e, 0x1b0e: 0x0040, 0x1b0f: 0x0040, 0x1b10: 0x0080, 0x1b11: 0x0080, - 0x1b12: 0x0080, 0x1b13: 0x0080, 0x1b14: 0x0080, 0x1b15: 0x0080, 0x1b16: 0x0080, 0x1b17: 0x0080, - 0x1b18: 0x0080, 0x1b19: 0x0080, 0x1b1a: 0x0080, 0x1b1b: 0x0080, 0x1b1c: 0x0080, 0x1b1d: 0x0080, - 0x1b1e: 0x0080, 0x1b1f: 0x0080, 0x1b20: 0x0080, 0x1b21: 0x0080, 0x1b22: 0x0080, 0x1b23: 0x0080, - 0x1b24: 0x0080, 0x1b25: 0x0080, 0x1b26: 0x0080, 0x1b27: 0x0080, 0x1b28: 0x0040, 0x1b29: 0x0040, - 0x1b2a: 0x0040, 0x1b2b: 0x0040, 0x1b2c: 0x0040, 0x1b2d: 0x0040, 0x1b2e: 0x0040, 0x1b2f: 0x0080, - 0x1b30: 0x0080, 0x1b31: 0x0080, 0x1b32: 0x0080, 0x1b33: 0x0080, 0x1b34: 0x0080, 0x1b35: 0x0080, - 0x1b36: 0x0080, 0x1b37: 0x0080, 0x1b38: 0x0080, 0x1b39: 0x0080, 0x1b3a: 0x0080, 0x1b3b: 0x0080, - 0x1b3c: 0x0080, 0x1b3d: 0x0080, 0x1b3e: 0x0080, 0x1b3f: 0x0080, - // Block 0x6d, offset 0x1b40 - 0x1b40: 0x0080, 0x1b41: 0x0080, 0x1b42: 0x0080, 0x1b43: 0x0080, 0x1b44: 0x0080, 0x1b45: 0x0080, - 0x1b46: 0x0080, 0x1b47: 0x0080, 0x1b48: 0x0080, 0x1b49: 0x0080, 0x1b4a: 0x0080, 0x1b4b: 0x0080, - 0x1b4c: 0x0080, 0x1b4d: 0x0080, 0x1b4e: 0x0080, 0x1b4f: 0x0080, 0x1b50: 0x0080, 0x1b51: 0x0080, - 0x1b52: 0x0080, 0x1b53: 0x0080, 0x1b54: 0x0080, 0x1b55: 0x0080, 0x1b56: 0x0080, 0x1b57: 0x0080, - 0x1b58: 0x0080, 0x1b59: 0x0080, 0x1b5a: 0x0080, 0x1b5b: 0x0080, 0x1b5c: 0x0080, 0x1b5d: 0x0080, - 0x1b5e: 0x0080, 0x1b5f: 0x0080, 0x1b60: 0x0040, 0x1b61: 0x0040, 0x1b62: 0x0040, 0x1b63: 0x0040, - 0x1b64: 0x0040, 0x1b66: 0x0040, 0x1b67: 0x0040, 0x1b68: 0x0040, 0x1b69: 0x0040, - 0x1b6a: 0x0040, 0x1b6b: 0x0040, 0x1b6c: 0x0040, 0x1b6d: 0x0040, 0x1b6e: 0x0040, 0x1b6f: 0x0040, - 0x1b70: 0x0080, 0x1b71: 0x0080, 0x1b74: 0x0080, 0x1b75: 0x0080, - 0x1b76: 0x0080, 0x1b77: 0x0080, 0x1b78: 0x0080, 0x1b79: 0x0080, 0x1b7a: 0x0080, 0x1b7b: 0x0080, - 0x1b7c: 0x0080, 0x1b7d: 0x0080, 0x1b7e: 0x0080, 0x1b7f: 0x0080, - // Block 0x6e, offset 0x1b80 - 0x1b80: 0x0080, 0x1b81: 0x0080, 0x1b82: 0x0080, 0x1b83: 0x0080, 0x1b84: 0x0080, 0x1b85: 0x0080, - 0x1b86: 0x0080, 0x1b87: 0x0080, 0x1b88: 0x0080, 0x1b89: 0x0080, 0x1b8a: 0x0080, 0x1b8b: 0x0080, - 0x1b8c: 0x0080, 0x1b8d: 0x0080, 0x1b8e: 0x0080, 0x1b90: 0x0080, 0x1b91: 0x0080, - 0x1b92: 0x0080, 0x1b93: 0x0080, 0x1b94: 0x0080, 0x1b95: 0x0080, 0x1b96: 0x0080, 0x1b97: 0x0080, - 0x1b98: 0x0080, 0x1b99: 0x0080, 0x1b9a: 0x0080, 0x1b9b: 0x0080, 0x1b9c: 0x0080, - 0x1ba0: 0x0080, 0x1ba1: 0x0080, 0x1ba2: 0x0080, 0x1ba3: 0x0080, - 0x1ba4: 0x0080, 0x1ba5: 0x0080, 0x1ba6: 0x0080, 0x1ba7: 0x0080, 0x1ba8: 0x0080, 0x1ba9: 0x0080, - 0x1baa: 0x0080, 0x1bab: 0x0080, 0x1bac: 0x0080, 0x1bad: 0x0080, 0x1bae: 0x0080, 0x1baf: 0x0080, - 0x1bb0: 0x0080, 0x1bb1: 0x0080, 0x1bb2: 0x0080, 0x1bb3: 0x0080, 0x1bb4: 0x0080, 0x1bb5: 0x0080, - 0x1bb6: 0x0080, 0x1bb7: 0x0080, 0x1bb8: 0x0080, 0x1bb9: 0x0080, 0x1bba: 0x0080, 0x1bbb: 0x0080, - 0x1bbc: 0x0080, 0x1bbd: 0x0080, 0x1bbe: 0x0080, - // Block 0x6f, offset 0x1bc0 - 0x1bd0: 0x00c3, 0x1bd1: 0x00c3, - 0x1bd2: 0x00c3, 0x1bd3: 0x00c3, 0x1bd4: 0x00c3, 0x1bd5: 0x00c3, 0x1bd6: 0x00c3, 0x1bd7: 0x00c3, - 0x1bd8: 0x00c3, 0x1bd9: 0x00c3, 0x1bda: 0x00c3, 0x1bdb: 0x00c3, 0x1bdc: 0x00c3, 0x1bdd: 0x0083, - 0x1bde: 0x0083, 0x1bdf: 0x0083, 0x1be0: 0x0083, 0x1be1: 0x00c3, 0x1be2: 0x0083, 0x1be3: 0x0083, - 0x1be4: 0x0083, 0x1be5: 0x00c3, 0x1be6: 0x00c3, 0x1be7: 0x00c3, 0x1be8: 0x00c3, 0x1be9: 0x00c3, - 0x1bea: 0x00c3, 0x1beb: 0x00c3, 0x1bec: 0x00c3, 0x1bed: 0x00c3, 0x1bee: 0x00c3, 0x1bef: 0x00c3, - 0x1bf0: 0x00c3, - // Block 0x70, offset 0x1c00 - 0x1c00: 0x0080, 0x1c01: 0x0080, 0x1c02: 0x0080, 0x1c03: 0x0080, 0x1c04: 0x0080, 0x1c05: 0x0080, - 0x1c06: 0x0080, 0x1c07: 0x0080, 0x1c08: 0x0080, 0x1c09: 0x0080, 0x1c0a: 0x0080, 0x1c0b: 0x0080, - 0x1c0c: 0x0080, 0x1c0d: 0x0080, 0x1c0e: 0x0080, 0x1c0f: 0x0080, 0x1c10: 0x0080, 0x1c11: 0x0080, - 0x1c12: 0x0080, 0x1c13: 0x0080, 0x1c14: 0x0080, 0x1c15: 0x0080, 0x1c16: 0x0080, 0x1c17: 0x0080, - 0x1c18: 0x0080, 0x1c19: 0x0080, 0x1c1a: 0x0080, 0x1c1b: 0x0080, 0x1c1c: 0x0080, 0x1c1d: 0x0080, - 0x1c1e: 0x0080, 0x1c1f: 0x0080, 0x1c20: 0x0080, 0x1c21: 0x0080, 0x1c22: 0x0080, 0x1c23: 0x0080, - 0x1c24: 0x0080, 0x1c25: 0x0080, 0x1c26: 0x0088, 0x1c27: 0x0080, 0x1c28: 0x0080, 0x1c29: 0x0080, - 0x1c2a: 0x0080, 0x1c2b: 0x0080, 0x1c2c: 0x0080, 0x1c2d: 0x0080, 0x1c2e: 0x0080, 0x1c2f: 0x0080, - 0x1c30: 0x0080, 0x1c31: 0x0080, 0x1c32: 0x00c0, 0x1c33: 0x0080, 0x1c34: 0x0080, 0x1c35: 0x0080, - 0x1c36: 0x0080, 0x1c37: 0x0080, 0x1c38: 0x0080, 0x1c39: 0x0080, 0x1c3a: 0x0080, 0x1c3b: 0x0080, - 0x1c3c: 0x0080, 0x1c3d: 0x0080, 0x1c3e: 0x0080, 0x1c3f: 0x0080, - // Block 0x71, offset 0x1c40 - 0x1c40: 0x0080, 0x1c41: 0x0080, 0x1c42: 0x0080, 0x1c43: 0x0080, 0x1c44: 0x0080, 0x1c45: 0x0080, - 0x1c46: 0x0080, 0x1c47: 0x0080, 0x1c48: 0x0080, 0x1c49: 0x0080, 0x1c4a: 0x0080, 0x1c4b: 0x0080, - 0x1c4c: 0x0080, 0x1c4d: 0x0080, 0x1c4e: 0x00c0, 0x1c4f: 0x0080, 0x1c50: 0x0080, 0x1c51: 0x0080, - 0x1c52: 0x0080, 0x1c53: 0x0080, 0x1c54: 0x0080, 0x1c55: 0x0080, 0x1c56: 0x0080, 0x1c57: 0x0080, - 0x1c58: 0x0080, 0x1c59: 0x0080, 0x1c5a: 0x0080, 0x1c5b: 0x0080, 0x1c5c: 0x0080, 0x1c5d: 0x0080, - 0x1c5e: 0x0080, 0x1c5f: 0x0080, 0x1c60: 0x0080, 0x1c61: 0x0080, 0x1c62: 0x0080, 0x1c63: 0x0080, - 0x1c64: 0x0080, 0x1c65: 0x0080, 0x1c66: 0x0080, 0x1c67: 0x0080, 0x1c68: 0x0080, 0x1c69: 0x0080, - 0x1c6a: 0x0080, 0x1c6b: 0x0080, 0x1c6c: 0x0080, 0x1c6d: 0x0080, 0x1c6e: 0x0080, 0x1c6f: 0x0080, - 0x1c70: 0x0080, 0x1c71: 0x0080, 0x1c72: 0x0080, 0x1c73: 0x0080, 0x1c74: 0x0080, 0x1c75: 0x0080, - 0x1c76: 0x0080, 0x1c77: 0x0080, 0x1c78: 0x0080, 0x1c79: 0x0080, 0x1c7a: 0x0080, 0x1c7b: 0x0080, - 0x1c7c: 0x0080, 0x1c7d: 0x0080, 0x1c7e: 0x0080, 0x1c7f: 0x0080, - // Block 0x72, offset 0x1c80 - 0x1c80: 0x0080, 0x1c81: 0x0080, 0x1c82: 0x0080, 0x1c83: 0x00c0, 0x1c84: 0x00c0, 0x1c85: 0x0080, - 0x1c86: 0x0080, 0x1c87: 0x0080, 0x1c88: 0x0080, 0x1c89: 0x0080, 0x1c8a: 0x0080, 0x1c8b: 0x0080, - 0x1c90: 0x0080, 0x1c91: 0x0080, - 0x1c92: 0x0080, 0x1c93: 0x0080, 0x1c94: 0x0080, 0x1c95: 0x0080, 0x1c96: 0x0080, 0x1c97: 0x0080, - 0x1c98: 0x0080, 0x1c99: 0x0080, 0x1c9a: 0x0080, 0x1c9b: 0x0080, 0x1c9c: 0x0080, 0x1c9d: 0x0080, - 0x1c9e: 0x0080, 0x1c9f: 0x0080, 0x1ca0: 0x0080, 0x1ca1: 0x0080, 0x1ca2: 0x0080, 0x1ca3: 0x0080, - 0x1ca4: 0x0080, 0x1ca5: 0x0080, 0x1ca6: 0x0080, 0x1ca7: 0x0080, 0x1ca8: 0x0080, 0x1ca9: 0x0080, - 0x1caa: 0x0080, 0x1cab: 0x0080, 0x1cac: 0x0080, 0x1cad: 0x0080, 0x1cae: 0x0080, 0x1caf: 0x0080, - 0x1cb0: 0x0080, 0x1cb1: 0x0080, 0x1cb2: 0x0080, 0x1cb3: 0x0080, 0x1cb4: 0x0080, 0x1cb5: 0x0080, - 0x1cb6: 0x0080, 0x1cb7: 0x0080, 0x1cb8: 0x0080, 0x1cb9: 0x0080, 0x1cba: 0x0080, 0x1cbb: 0x0080, - 0x1cbc: 0x0080, 0x1cbd: 0x0080, 0x1cbe: 0x0080, 0x1cbf: 0x0080, - // Block 0x73, offset 0x1cc0 - 0x1cc0: 0x0080, 0x1cc1: 0x0080, 0x1cc2: 0x0080, 0x1cc3: 0x0080, 0x1cc4: 0x0080, 0x1cc5: 0x0080, - 0x1cc6: 0x0080, 0x1cc7: 0x0080, 0x1cc8: 0x0080, 0x1cc9: 0x0080, 0x1cca: 0x0080, 0x1ccb: 0x0080, - 0x1ccc: 0x0080, 0x1ccd: 0x0080, 0x1cce: 0x0080, 0x1ccf: 0x0080, 0x1cd0: 0x0080, 0x1cd1: 0x0080, - 0x1cd2: 0x0080, 0x1cd3: 0x0080, 0x1cd4: 0x0080, 0x1cd5: 0x0080, 0x1cd6: 0x0080, 0x1cd7: 0x0080, - 0x1cd8: 0x0080, 0x1cd9: 0x0080, 0x1cda: 0x0080, 0x1cdb: 0x0080, 0x1cdc: 0x0080, 0x1cdd: 0x0080, - 0x1cde: 0x0080, 0x1cdf: 0x0080, 0x1ce0: 0x0080, 0x1ce1: 0x0080, 0x1ce2: 0x0080, 0x1ce3: 0x0080, - 0x1ce4: 0x0080, 0x1ce5: 0x0080, 0x1ce6: 0x0080, 0x1ce7: 0x0080, 0x1ce8: 0x0080, 0x1ce9: 0x0080, - 0x1cea: 0x0080, 0x1ceb: 0x0080, 0x1cec: 0x0080, 0x1ced: 0x0080, 0x1cee: 0x0080, 0x1cef: 0x0080, - 0x1cf0: 0x0080, 0x1cf1: 0x0080, 0x1cf2: 0x0080, 0x1cf3: 0x0080, 0x1cf4: 0x0080, 0x1cf5: 0x0080, - 0x1cf6: 0x0080, 0x1cf7: 0x0080, 0x1cf8: 0x0080, 0x1cf9: 0x0080, 0x1cfa: 0x0080, 0x1cfb: 0x0080, - 0x1cfc: 0x0080, 0x1cfd: 0x0080, 0x1cfe: 0x0080, 0x1cff: 0x0080, - // Block 0x74, offset 0x1d00 - 0x1d00: 0x0080, 0x1d01: 0x0080, 0x1d02: 0x0080, 0x1d03: 0x0080, 0x1d04: 0x0080, 0x1d05: 0x0080, - 0x1d06: 0x0080, 0x1d07: 0x0080, 0x1d08: 0x0080, 0x1d09: 0x0080, 0x1d0a: 0x0080, 0x1d0b: 0x0080, - 0x1d0c: 0x0080, 0x1d0d: 0x0080, 0x1d0e: 0x0080, 0x1d0f: 0x0080, 0x1d10: 0x0080, 0x1d11: 0x0080, - 0x1d12: 0x0080, 0x1d13: 0x0080, 0x1d14: 0x0080, 0x1d15: 0x0080, 0x1d16: 0x0080, 0x1d17: 0x0080, - 0x1d18: 0x0080, 0x1d19: 0x0080, 0x1d1a: 0x0080, 0x1d1b: 0x0080, 0x1d1c: 0x0080, 0x1d1d: 0x0080, - 0x1d1e: 0x0080, 0x1d1f: 0x0080, 0x1d20: 0x0080, 0x1d21: 0x0080, 0x1d22: 0x0080, 0x1d23: 0x0080, - 0x1d24: 0x0080, 0x1d25: 0x0080, 0x1d26: 0x0080, 0x1d27: 0x0080, 0x1d28: 0x0080, 0x1d29: 0x0080, - 0x1d2a: 0x0080, 0x1d2b: 0x0080, 0x1d2c: 0x0080, 0x1d2d: 0x0080, 0x1d2e: 0x0080, 0x1d2f: 0x0080, - 0x1d30: 0x0080, 0x1d31: 0x0080, 0x1d32: 0x0080, 0x1d33: 0x0080, 0x1d34: 0x0080, 0x1d35: 0x0080, - 0x1d36: 0x0080, 0x1d37: 0x0080, 0x1d38: 0x0080, 0x1d39: 0x0080, 0x1d3a: 0x0080, 0x1d3b: 0x0080, - 0x1d3c: 0x0080, 0x1d3d: 0x0080, 0x1d3e: 0x0080, - // Block 0x75, offset 0x1d40 - 0x1d40: 0x0080, 0x1d41: 0x0080, 0x1d42: 0x0080, 0x1d43: 0x0080, 0x1d44: 0x0080, 0x1d45: 0x0080, - 0x1d46: 0x0080, 0x1d47: 0x0080, 0x1d48: 0x0080, 0x1d49: 0x0080, 0x1d4a: 0x0080, 0x1d4b: 0x0080, - 0x1d4c: 0x0080, 0x1d4d: 0x0080, 0x1d4e: 0x0080, 0x1d4f: 0x0080, 0x1d50: 0x0080, 0x1d51: 0x0080, - 0x1d52: 0x0080, 0x1d53: 0x0080, 0x1d54: 0x0080, 0x1d55: 0x0080, 0x1d56: 0x0080, 0x1d57: 0x0080, - 0x1d58: 0x0080, 0x1d59: 0x0080, 0x1d5a: 0x0080, 0x1d5b: 0x0080, 0x1d5c: 0x0080, 0x1d5d: 0x0080, - 0x1d5e: 0x0080, 0x1d5f: 0x0080, 0x1d60: 0x0080, 0x1d61: 0x0080, 0x1d62: 0x0080, 0x1d63: 0x0080, - 0x1d64: 0x0080, 0x1d65: 0x0080, 0x1d66: 0x0080, - // Block 0x76, offset 0x1d80 - 0x1d80: 0x0080, 0x1d81: 0x0080, 0x1d82: 0x0080, 0x1d83: 0x0080, 0x1d84: 0x0080, 0x1d85: 0x0080, - 0x1d86: 0x0080, 0x1d87: 0x0080, 0x1d88: 0x0080, 0x1d89: 0x0080, 0x1d8a: 0x0080, - 0x1da0: 0x0080, 0x1da1: 0x0080, 0x1da2: 0x0080, 0x1da3: 0x0080, - 0x1da4: 0x0080, 0x1da5: 0x0080, 0x1da6: 0x0080, 0x1da7: 0x0080, 0x1da8: 0x0080, 0x1da9: 0x0080, - 0x1daa: 0x0080, 0x1dab: 0x0080, 0x1dac: 0x0080, 0x1dad: 0x0080, 0x1dae: 0x0080, 0x1daf: 0x0080, - 0x1db0: 0x0080, 0x1db1: 0x0080, 0x1db2: 0x0080, 0x1db3: 0x0080, 0x1db4: 0x0080, 0x1db5: 0x0080, - 0x1db6: 0x0080, 0x1db7: 0x0080, 0x1db8: 0x0080, 0x1db9: 0x0080, 0x1dba: 0x0080, 0x1dbb: 0x0080, - 0x1dbc: 0x0080, 0x1dbd: 0x0080, 0x1dbe: 0x0080, 0x1dbf: 0x0080, - // Block 0x77, offset 0x1dc0 - 0x1dc0: 0x0080, 0x1dc1: 0x0080, 0x1dc2: 0x0080, 0x1dc3: 0x0080, 0x1dc4: 0x0080, 0x1dc5: 0x0080, - 0x1dc6: 0x0080, 0x1dc7: 0x0080, 0x1dc8: 0x0080, 0x1dc9: 0x0080, 0x1dca: 0x0080, 0x1dcb: 0x0080, - 0x1dcc: 0x0080, 0x1dcd: 0x0080, 0x1dce: 0x0080, 0x1dcf: 0x0080, 0x1dd0: 0x0080, 0x1dd1: 0x0080, - 0x1dd2: 0x0080, 0x1dd3: 0x0080, 0x1dd4: 0x0080, 0x1dd5: 0x0080, 0x1dd6: 0x0080, 0x1dd7: 0x0080, - 0x1dd8: 0x0080, 0x1dd9: 0x0080, 0x1dda: 0x0080, 0x1ddb: 0x0080, 0x1ddc: 0x0080, 0x1ddd: 0x0080, - 0x1dde: 0x0080, 0x1ddf: 0x0080, 0x1de0: 0x0080, 0x1de1: 0x0080, 0x1de2: 0x0080, 0x1de3: 0x0080, - 0x1de4: 0x0080, 0x1de5: 0x0080, 0x1de6: 0x0080, 0x1de7: 0x0080, 0x1de8: 0x0080, 0x1de9: 0x0080, - 0x1dea: 0x0080, 0x1deb: 0x0080, 0x1dec: 0x0080, 0x1ded: 0x0080, 0x1dee: 0x0080, 0x1def: 0x0080, - 0x1df0: 0x0080, 0x1df1: 0x0080, 0x1df2: 0x0080, 0x1df3: 0x0080, - 0x1df6: 0x0080, 0x1df7: 0x0080, 0x1df8: 0x0080, 0x1df9: 0x0080, 0x1dfa: 0x0080, 0x1dfb: 0x0080, - 0x1dfc: 0x0080, 0x1dfd: 0x0080, 0x1dfe: 0x0080, 0x1dff: 0x0080, - // Block 0x78, offset 0x1e00 - 0x1e00: 0x0080, 0x1e01: 0x0080, 0x1e02: 0x0080, 0x1e03: 0x0080, 0x1e04: 0x0080, 0x1e05: 0x0080, - 0x1e06: 0x0080, 0x1e07: 0x0080, 0x1e08: 0x0080, 0x1e09: 0x0080, 0x1e0a: 0x0080, 0x1e0b: 0x0080, - 0x1e0c: 0x0080, 0x1e0d: 0x0080, 0x1e0e: 0x0080, 0x1e0f: 0x0080, 0x1e10: 0x0080, 0x1e11: 0x0080, - 0x1e12: 0x0080, 0x1e13: 0x0080, 0x1e14: 0x0080, 0x1e15: 0x0080, - 0x1e18: 0x0080, 0x1e19: 0x0080, 0x1e1a: 0x0080, 0x1e1b: 0x0080, 0x1e1c: 0x0080, 0x1e1d: 0x0080, - 0x1e1e: 0x0080, 0x1e1f: 0x0080, 0x1e20: 0x0080, 0x1e21: 0x0080, 0x1e22: 0x0080, 0x1e23: 0x0080, - 0x1e24: 0x0080, 0x1e25: 0x0080, 0x1e26: 0x0080, 0x1e27: 0x0080, 0x1e28: 0x0080, 0x1e29: 0x0080, - 0x1e2a: 0x0080, 0x1e2b: 0x0080, 0x1e2c: 0x0080, 0x1e2d: 0x0080, 0x1e2e: 0x0080, 0x1e2f: 0x0080, - 0x1e30: 0x0080, 0x1e31: 0x0080, 0x1e32: 0x0080, 0x1e33: 0x0080, 0x1e34: 0x0080, 0x1e35: 0x0080, - 0x1e36: 0x0080, 0x1e37: 0x0080, 0x1e38: 0x0080, 0x1e39: 0x0080, - 0x1e3d: 0x0080, 0x1e3e: 0x0080, 0x1e3f: 0x0080, - // Block 0x79, offset 0x1e40 - 0x1e40: 0x0080, 0x1e41: 0x0080, 0x1e42: 0x0080, 0x1e43: 0x0080, 0x1e44: 0x0080, 0x1e45: 0x0080, - 0x1e46: 0x0080, 0x1e47: 0x0080, 0x1e48: 0x0080, 0x1e4a: 0x0080, 0x1e4b: 0x0080, - 0x1e4c: 0x0080, 0x1e4d: 0x0080, 0x1e4e: 0x0080, 0x1e4f: 0x0080, 0x1e50: 0x0080, 0x1e51: 0x0080, - 0x1e6c: 0x0080, 0x1e6d: 0x0080, 0x1e6e: 0x0080, 0x1e6f: 0x0080, - // Block 0x7a, offset 0x1e80 - 0x1e80: 0x00c0, 0x1e81: 0x00c0, 0x1e82: 0x00c0, 0x1e83: 0x00c0, 0x1e84: 0x00c0, 0x1e85: 0x00c0, - 0x1e86: 0x00c0, 0x1e87: 0x00c0, 0x1e88: 0x00c0, 0x1e89: 0x00c0, 0x1e8a: 0x00c0, 0x1e8b: 0x00c0, - 0x1e8c: 0x00c0, 0x1e8d: 0x00c0, 0x1e8e: 0x00c0, 0x1e8f: 0x00c0, 0x1e90: 0x00c0, 0x1e91: 0x00c0, - 0x1e92: 0x00c0, 0x1e93: 0x00c0, 0x1e94: 0x00c0, 0x1e95: 0x00c0, 0x1e96: 0x00c0, 0x1e97: 0x00c0, - 0x1e98: 0x00c0, 0x1e99: 0x00c0, 0x1e9a: 0x00c0, 0x1e9b: 0x00c0, 0x1e9c: 0x00c0, 0x1e9d: 0x00c0, - 0x1e9e: 0x00c0, 0x1e9f: 0x00c0, 0x1ea0: 0x00c0, 0x1ea1: 0x00c0, 0x1ea2: 0x00c0, 0x1ea3: 0x00c0, - 0x1ea4: 0x00c0, 0x1ea5: 0x00c0, 0x1ea6: 0x00c0, 0x1ea7: 0x00c0, 0x1ea8: 0x00c0, 0x1ea9: 0x00c0, - 0x1eaa: 0x00c0, 0x1eab: 0x00c0, 0x1eac: 0x00c0, 0x1ead: 0x00c0, 0x1eae: 0x00c0, - 0x1eb0: 0x00c0, 0x1eb1: 0x00c0, 0x1eb2: 0x00c0, 0x1eb3: 0x00c0, 0x1eb4: 0x00c0, 0x1eb5: 0x00c0, - 0x1eb6: 0x00c0, 0x1eb7: 0x00c0, 0x1eb8: 0x00c0, 0x1eb9: 0x00c0, 0x1eba: 0x00c0, 0x1ebb: 0x00c0, - 0x1ebc: 0x00c0, 0x1ebd: 0x00c0, 0x1ebe: 0x00c0, 0x1ebf: 0x00c0, - // Block 0x7b, offset 0x1ec0 - 0x1ec0: 0x00c0, 0x1ec1: 0x00c0, 0x1ec2: 0x00c0, 0x1ec3: 0x00c0, 0x1ec4: 0x00c0, 0x1ec5: 0x00c0, - 0x1ec6: 0x00c0, 0x1ec7: 0x00c0, 0x1ec8: 0x00c0, 0x1ec9: 0x00c0, 0x1eca: 0x00c0, 0x1ecb: 0x00c0, - 0x1ecc: 0x00c0, 0x1ecd: 0x00c0, 0x1ece: 0x00c0, 0x1ecf: 0x00c0, 0x1ed0: 0x00c0, 0x1ed1: 0x00c0, - 0x1ed2: 0x00c0, 0x1ed3: 0x00c0, 0x1ed4: 0x00c0, 0x1ed5: 0x00c0, 0x1ed6: 0x00c0, 0x1ed7: 0x00c0, - 0x1ed8: 0x00c0, 0x1ed9: 0x00c0, 0x1eda: 0x00c0, 0x1edb: 0x00c0, 0x1edc: 0x00c0, 0x1edd: 0x00c0, - 0x1ede: 0x00c0, 0x1ee0: 0x00c0, 0x1ee1: 0x00c0, 0x1ee2: 0x00c0, 0x1ee3: 0x00c0, - 0x1ee4: 0x00c0, 0x1ee5: 0x00c0, 0x1ee6: 0x00c0, 0x1ee7: 0x00c0, 0x1ee8: 0x00c0, 0x1ee9: 0x00c0, - 0x1eea: 0x00c0, 0x1eeb: 0x00c0, 0x1eec: 0x00c0, 0x1eed: 0x00c0, 0x1eee: 0x00c0, 0x1eef: 0x00c0, - 0x1ef0: 0x00c0, 0x1ef1: 0x00c0, 0x1ef2: 0x00c0, 0x1ef3: 0x00c0, 0x1ef4: 0x00c0, 0x1ef5: 0x00c0, - 0x1ef6: 0x00c0, 0x1ef7: 0x00c0, 0x1ef8: 0x00c0, 0x1ef9: 0x00c0, 0x1efa: 0x00c0, 0x1efb: 0x00c0, - 0x1efc: 0x0080, 0x1efd: 0x0080, 0x1efe: 0x00c0, 0x1eff: 0x00c0, - // Block 0x7c, offset 0x1f00 - 0x1f00: 0x00c0, 0x1f01: 0x00c0, 0x1f02: 0x00c0, 0x1f03: 0x00c0, 0x1f04: 0x00c0, 0x1f05: 0x00c0, - 0x1f06: 0x00c0, 0x1f07: 0x00c0, 0x1f08: 0x00c0, 0x1f09: 0x00c0, 0x1f0a: 0x00c0, 0x1f0b: 0x00c0, - 0x1f0c: 0x00c0, 0x1f0d: 0x00c0, 0x1f0e: 0x00c0, 0x1f0f: 0x00c0, 0x1f10: 0x00c0, 0x1f11: 0x00c0, - 0x1f12: 0x00c0, 0x1f13: 0x00c0, 0x1f14: 0x00c0, 0x1f15: 0x00c0, 0x1f16: 0x00c0, 0x1f17: 0x00c0, - 0x1f18: 0x00c0, 0x1f19: 0x00c0, 0x1f1a: 0x00c0, 0x1f1b: 0x00c0, 0x1f1c: 0x00c0, 0x1f1d: 0x00c0, - 0x1f1e: 0x00c0, 0x1f1f: 0x00c0, 0x1f20: 0x00c0, 0x1f21: 0x00c0, 0x1f22: 0x00c0, 0x1f23: 0x00c0, - 0x1f24: 0x00c0, 0x1f25: 0x0080, 0x1f26: 0x0080, 0x1f27: 0x0080, 0x1f28: 0x0080, 0x1f29: 0x0080, - 0x1f2a: 0x0080, 0x1f2b: 0x00c0, 0x1f2c: 0x00c0, 0x1f2d: 0x00c0, 0x1f2e: 0x00c0, 0x1f2f: 0x00c3, - 0x1f30: 0x00c3, 0x1f31: 0x00c3, 0x1f32: 0x00c0, 0x1f33: 0x00c0, - 0x1f39: 0x0080, 0x1f3a: 0x0080, 0x1f3b: 0x0080, - 0x1f3c: 0x0080, 0x1f3d: 0x0080, 0x1f3e: 0x0080, 0x1f3f: 0x0080, - // Block 0x7d, offset 0x1f40 - 0x1f40: 0x00c0, 0x1f41: 0x00c0, 0x1f42: 0x00c0, 0x1f43: 0x00c0, 0x1f44: 0x00c0, 0x1f45: 0x00c0, - 0x1f46: 0x00c0, 0x1f47: 0x00c0, 0x1f48: 0x00c0, 0x1f49: 0x00c0, 0x1f4a: 0x00c0, 0x1f4b: 0x00c0, - 0x1f4c: 0x00c0, 0x1f4d: 0x00c0, 0x1f4e: 0x00c0, 0x1f4f: 0x00c0, 0x1f50: 0x00c0, 0x1f51: 0x00c0, - 0x1f52: 0x00c0, 0x1f53: 0x00c0, 0x1f54: 0x00c0, 0x1f55: 0x00c0, 0x1f56: 0x00c0, 0x1f57: 0x00c0, - 0x1f58: 0x00c0, 0x1f59: 0x00c0, 0x1f5a: 0x00c0, 0x1f5b: 0x00c0, 0x1f5c: 0x00c0, 0x1f5d: 0x00c0, - 0x1f5e: 0x00c0, 0x1f5f: 0x00c0, 0x1f60: 0x00c0, 0x1f61: 0x00c0, 0x1f62: 0x00c0, 0x1f63: 0x00c0, - 0x1f64: 0x00c0, 0x1f65: 0x00c0, 0x1f67: 0x00c0, - 0x1f6d: 0x00c0, - 0x1f70: 0x00c0, 0x1f71: 0x00c0, 0x1f72: 0x00c0, 0x1f73: 0x00c0, 0x1f74: 0x00c0, 0x1f75: 0x00c0, - 0x1f76: 0x00c0, 0x1f77: 0x00c0, 0x1f78: 0x00c0, 0x1f79: 0x00c0, 0x1f7a: 0x00c0, 0x1f7b: 0x00c0, - 0x1f7c: 0x00c0, 0x1f7d: 0x00c0, 0x1f7e: 0x00c0, 0x1f7f: 0x00c0, - // Block 0x7e, offset 0x1f80 - 0x1f80: 0x00c0, 0x1f81: 0x00c0, 0x1f82: 0x00c0, 0x1f83: 0x00c0, 0x1f84: 0x00c0, 0x1f85: 0x00c0, - 0x1f86: 0x00c0, 0x1f87: 0x00c0, 0x1f88: 0x00c0, 0x1f89: 0x00c0, 0x1f8a: 0x00c0, 0x1f8b: 0x00c0, - 0x1f8c: 0x00c0, 0x1f8d: 0x00c0, 0x1f8e: 0x00c0, 0x1f8f: 0x00c0, 0x1f90: 0x00c0, 0x1f91: 0x00c0, - 0x1f92: 0x00c0, 0x1f93: 0x00c0, 0x1f94: 0x00c0, 0x1f95: 0x00c0, 0x1f96: 0x00c0, 0x1f97: 0x00c0, - 0x1f98: 0x00c0, 0x1f99: 0x00c0, 0x1f9a: 0x00c0, 0x1f9b: 0x00c0, 0x1f9c: 0x00c0, 0x1f9d: 0x00c0, - 0x1f9e: 0x00c0, 0x1f9f: 0x00c0, 0x1fa0: 0x00c0, 0x1fa1: 0x00c0, 0x1fa2: 0x00c0, 0x1fa3: 0x00c0, - 0x1fa4: 0x00c0, 0x1fa5: 0x00c0, 0x1fa6: 0x00c0, 0x1fa7: 0x00c0, - 0x1faf: 0x0080, - 0x1fb0: 0x0080, - 0x1fbf: 0x00c6, - // Block 0x7f, offset 0x1fc0 - 0x1fc0: 0x00c0, 0x1fc1: 0x00c0, 0x1fc2: 0x00c0, 0x1fc3: 0x00c0, 0x1fc4: 0x00c0, 0x1fc5: 0x00c0, - 0x1fc6: 0x00c0, 0x1fc7: 0x00c0, 0x1fc8: 0x00c0, 0x1fc9: 0x00c0, 0x1fca: 0x00c0, 0x1fcb: 0x00c0, - 0x1fcc: 0x00c0, 0x1fcd: 0x00c0, 0x1fce: 0x00c0, 0x1fcf: 0x00c0, 0x1fd0: 0x00c0, 0x1fd1: 0x00c0, - 0x1fd2: 0x00c0, 0x1fd3: 0x00c0, 0x1fd4: 0x00c0, 0x1fd5: 0x00c0, 0x1fd6: 0x00c0, - 0x1fe0: 0x00c0, 0x1fe1: 0x00c0, 0x1fe2: 0x00c0, 0x1fe3: 0x00c0, - 0x1fe4: 0x00c0, 0x1fe5: 0x00c0, 0x1fe6: 0x00c0, 0x1fe8: 0x00c0, 0x1fe9: 0x00c0, - 0x1fea: 0x00c0, 0x1feb: 0x00c0, 0x1fec: 0x00c0, 0x1fed: 0x00c0, 0x1fee: 0x00c0, - 0x1ff0: 0x00c0, 0x1ff1: 0x00c0, 0x1ff2: 0x00c0, 0x1ff3: 0x00c0, 0x1ff4: 0x00c0, 0x1ff5: 0x00c0, - 0x1ff6: 0x00c0, 0x1ff8: 0x00c0, 0x1ff9: 0x00c0, 0x1ffa: 0x00c0, 0x1ffb: 0x00c0, - 0x1ffc: 0x00c0, 0x1ffd: 0x00c0, 0x1ffe: 0x00c0, - // Block 0x80, offset 0x2000 - 0x2000: 0x00c0, 0x2001: 0x00c0, 0x2002: 0x00c0, 0x2003: 0x00c0, 0x2004: 0x00c0, 0x2005: 0x00c0, - 0x2006: 0x00c0, 0x2008: 0x00c0, 0x2009: 0x00c0, 0x200a: 0x00c0, 0x200b: 0x00c0, - 0x200c: 0x00c0, 0x200d: 0x00c0, 0x200e: 0x00c0, 0x2010: 0x00c0, 0x2011: 0x00c0, - 0x2012: 0x00c0, 0x2013: 0x00c0, 0x2014: 0x00c0, 0x2015: 0x00c0, 0x2016: 0x00c0, - 0x2018: 0x00c0, 0x2019: 0x00c0, 0x201a: 0x00c0, 0x201b: 0x00c0, 0x201c: 0x00c0, 0x201d: 0x00c0, - 0x201e: 0x00c0, 0x2020: 0x00c3, 0x2021: 0x00c3, 0x2022: 0x00c3, 0x2023: 0x00c3, - 0x2024: 0x00c3, 0x2025: 0x00c3, 0x2026: 0x00c3, 0x2027: 0x00c3, 0x2028: 0x00c3, 0x2029: 0x00c3, - 0x202a: 0x00c3, 0x202b: 0x00c3, 0x202c: 0x00c3, 0x202d: 0x00c3, 0x202e: 0x00c3, 0x202f: 0x00c3, - 0x2030: 0x00c3, 0x2031: 0x00c3, 0x2032: 0x00c3, 0x2033: 0x00c3, 0x2034: 0x00c3, 0x2035: 0x00c3, - 0x2036: 0x00c3, 0x2037: 0x00c3, 0x2038: 0x00c3, 0x2039: 0x00c3, 0x203a: 0x00c3, 0x203b: 0x00c3, - 0x203c: 0x00c3, 0x203d: 0x00c3, 0x203e: 0x00c3, 0x203f: 0x00c3, - // Block 0x81, offset 0x2040 - 0x2040: 0x0080, 0x2041: 0x0080, 0x2042: 0x0080, 0x2043: 0x0080, 0x2044: 0x0080, 0x2045: 0x0080, - 0x2046: 0x0080, 0x2047: 0x0080, 0x2048: 0x0080, 0x2049: 0x0080, 0x204a: 0x0080, 0x204b: 0x0080, - 0x204c: 0x0080, 0x204d: 0x0080, 0x204e: 0x0080, 0x204f: 0x0080, 0x2050: 0x0080, 0x2051: 0x0080, - 0x2052: 0x0080, 0x2053: 0x0080, 0x2054: 0x0080, 0x2055: 0x0080, 0x2056: 0x0080, 0x2057: 0x0080, - 0x2058: 0x0080, 0x2059: 0x0080, 0x205a: 0x0080, 0x205b: 0x0080, 0x205c: 0x0080, 0x205d: 0x0080, - 0x205e: 0x0080, 0x205f: 0x0080, 0x2060: 0x0080, 0x2061: 0x0080, 0x2062: 0x0080, 0x2063: 0x0080, - 0x2064: 0x0080, 0x2065: 0x0080, 0x2066: 0x0080, 0x2067: 0x0080, 0x2068: 0x0080, 0x2069: 0x0080, - 0x206a: 0x0080, 0x206b: 0x0080, 0x206c: 0x0080, 0x206d: 0x0080, 0x206e: 0x0080, 0x206f: 0x00c0, - 0x2070: 0x0080, 0x2071: 0x0080, 0x2072: 0x0080, 0x2073: 0x0080, 0x2074: 0x0080, 0x2075: 0x0080, - 0x2076: 0x0080, 0x2077: 0x0080, 0x2078: 0x0080, 0x2079: 0x0080, 0x207a: 0x0080, 0x207b: 0x0080, - 0x207c: 0x0080, 0x207d: 0x0080, 0x207e: 0x0080, 0x207f: 0x0080, - // Block 0x82, offset 0x2080 - 0x2080: 0x0080, 0x2081: 0x0080, 0x2082: 0x0080, 0x2083: 0x0080, 0x2084: 0x0080, - // Block 0x83, offset 0x20c0 - 0x20c0: 0x008c, 0x20c1: 0x008c, 0x20c2: 0x008c, 0x20c3: 0x008c, 0x20c4: 0x008c, 0x20c5: 0x008c, - 0x20c6: 0x008c, 0x20c7: 0x008c, 0x20c8: 0x008c, 0x20c9: 0x008c, 0x20ca: 0x008c, 0x20cb: 0x008c, - 0x20cc: 0x008c, 0x20cd: 0x008c, 0x20ce: 0x008c, 0x20cf: 0x008c, 0x20d0: 0x008c, 0x20d1: 0x008c, - 0x20d2: 0x008c, 0x20d3: 0x008c, 0x20d4: 0x008c, 0x20d5: 0x008c, 0x20d6: 0x008c, 0x20d7: 0x008c, - 0x20d8: 0x008c, 0x20d9: 0x008c, 0x20db: 0x008c, 0x20dc: 0x008c, 0x20dd: 0x008c, - 0x20de: 0x008c, 0x20df: 0x008c, 0x20e0: 0x008c, 0x20e1: 0x008c, 0x20e2: 0x008c, 0x20e3: 0x008c, - 0x20e4: 0x008c, 0x20e5: 0x008c, 0x20e6: 0x008c, 0x20e7: 0x008c, 0x20e8: 0x008c, 0x20e9: 0x008c, - 0x20ea: 0x008c, 0x20eb: 0x008c, 0x20ec: 0x008c, 0x20ed: 0x008c, 0x20ee: 0x008c, 0x20ef: 0x008c, - 0x20f0: 0x008c, 0x20f1: 0x008c, 0x20f2: 0x008c, 0x20f3: 0x008c, 0x20f4: 0x008c, 0x20f5: 0x008c, - 0x20f6: 0x008c, 0x20f7: 0x008c, 0x20f8: 0x008c, 0x20f9: 0x008c, 0x20fa: 0x008c, 0x20fb: 0x008c, - 0x20fc: 0x008c, 0x20fd: 0x008c, 0x20fe: 0x008c, 0x20ff: 0x008c, - // Block 0x84, offset 0x2100 - 0x2100: 0x008c, 0x2101: 0x008c, 0x2102: 0x008c, 0x2103: 0x008c, 0x2104: 0x008c, 0x2105: 0x008c, - 0x2106: 0x008c, 0x2107: 0x008c, 0x2108: 0x008c, 0x2109: 0x008c, 0x210a: 0x008c, 0x210b: 0x008c, - 0x210c: 0x008c, 0x210d: 0x008c, 0x210e: 0x008c, 0x210f: 0x008c, 0x2110: 0x008c, 0x2111: 0x008c, - 0x2112: 0x008c, 0x2113: 0x008c, 0x2114: 0x008c, 0x2115: 0x008c, 0x2116: 0x008c, 0x2117: 0x008c, - 0x2118: 0x008c, 0x2119: 0x008c, 0x211a: 0x008c, 0x211b: 0x008c, 0x211c: 0x008c, 0x211d: 0x008c, - 0x211e: 0x008c, 0x211f: 0x008c, 0x2120: 0x008c, 0x2121: 0x008c, 0x2122: 0x008c, 0x2123: 0x008c, - 0x2124: 0x008c, 0x2125: 0x008c, 0x2126: 0x008c, 0x2127: 0x008c, 0x2128: 0x008c, 0x2129: 0x008c, - 0x212a: 0x008c, 0x212b: 0x008c, 0x212c: 0x008c, 0x212d: 0x008c, 0x212e: 0x008c, 0x212f: 0x008c, - 0x2130: 0x008c, 0x2131: 0x008c, 0x2132: 0x008c, 0x2133: 0x008c, - // Block 0x85, offset 0x2140 - 0x2140: 0x008c, 0x2141: 0x008c, 0x2142: 0x008c, 0x2143: 0x008c, 0x2144: 0x008c, 0x2145: 0x008c, - 0x2146: 0x008c, 0x2147: 0x008c, 0x2148: 0x008c, 0x2149: 0x008c, 0x214a: 0x008c, 0x214b: 0x008c, - 0x214c: 0x008c, 0x214d: 0x008c, 0x214e: 0x008c, 0x214f: 0x008c, 0x2150: 0x008c, 0x2151: 0x008c, - 0x2152: 0x008c, 0x2153: 0x008c, 0x2154: 0x008c, 0x2155: 0x008c, 0x2156: 0x008c, 0x2157: 0x008c, - 0x2158: 0x008c, 0x2159: 0x008c, 0x215a: 0x008c, 0x215b: 0x008c, 0x215c: 0x008c, 0x215d: 0x008c, - 0x215e: 0x008c, 0x215f: 0x008c, 0x2160: 0x008c, 0x2161: 0x008c, 0x2162: 0x008c, 0x2163: 0x008c, - 0x2164: 0x008c, 0x2165: 0x008c, 0x2166: 0x008c, 0x2167: 0x008c, 0x2168: 0x008c, 0x2169: 0x008c, - 0x216a: 0x008c, 0x216b: 0x008c, 0x216c: 0x008c, 0x216d: 0x008c, 0x216e: 0x008c, 0x216f: 0x008c, - 0x2170: 0x008c, 0x2171: 0x008c, 0x2172: 0x008c, 0x2173: 0x008c, 0x2174: 0x008c, 0x2175: 0x008c, - 0x2176: 0x008c, 0x2177: 0x008c, 0x2178: 0x008c, 0x2179: 0x008c, 0x217a: 0x008c, 0x217b: 0x008c, - 0x217c: 0x008c, 0x217d: 0x008c, 0x217e: 0x008c, 0x217f: 0x008c, - // Block 0x86, offset 0x2180 - 0x2180: 0x008c, 0x2181: 0x008c, 0x2182: 0x008c, 0x2183: 0x008c, 0x2184: 0x008c, 0x2185: 0x008c, - 0x2186: 0x008c, 0x2187: 0x008c, 0x2188: 0x008c, 0x2189: 0x008c, 0x218a: 0x008c, 0x218b: 0x008c, - 0x218c: 0x008c, 0x218d: 0x008c, 0x218e: 0x008c, 0x218f: 0x008c, 0x2190: 0x008c, 0x2191: 0x008c, - 0x2192: 0x008c, 0x2193: 0x008c, 0x2194: 0x008c, 0x2195: 0x008c, - 0x21b0: 0x0080, 0x21b1: 0x0080, 0x21b2: 0x0080, 0x21b3: 0x0080, 0x21b4: 0x0080, 0x21b5: 0x0080, - 0x21b6: 0x0080, 0x21b7: 0x0080, 0x21b8: 0x0080, 0x21b9: 0x0080, 0x21ba: 0x0080, 0x21bb: 0x0080, - // Block 0x87, offset 0x21c0 - 0x21c0: 0x0080, 0x21c1: 0x0080, 0x21c2: 0x0080, 0x21c3: 0x0080, 0x21c4: 0x0080, 0x21c5: 0x00cc, - 0x21c6: 0x00c0, 0x21c7: 0x00cc, 0x21c8: 0x0080, 0x21c9: 0x0080, 0x21ca: 0x0080, 0x21cb: 0x0080, - 0x21cc: 0x0080, 0x21cd: 0x0080, 0x21ce: 0x0080, 0x21cf: 0x0080, 0x21d0: 0x0080, 0x21d1: 0x0080, - 0x21d2: 0x0080, 0x21d3: 0x0080, 0x21d4: 0x0080, 0x21d5: 0x0080, 0x21d6: 0x0080, 0x21d7: 0x0080, - 0x21d8: 0x0080, 0x21d9: 0x0080, 0x21da: 0x0080, 0x21db: 0x0080, 0x21dc: 0x0080, 0x21dd: 0x0080, - 0x21de: 0x0080, 0x21df: 0x0080, 0x21e0: 0x0080, 0x21e1: 0x008c, 0x21e2: 0x008c, 0x21e3: 0x008c, - 0x21e4: 0x008c, 0x21e5: 0x008c, 0x21e6: 0x008c, 0x21e7: 0x008c, 0x21e8: 0x008c, 0x21e9: 0x008c, - 0x21ea: 0x00c3, 0x21eb: 0x00c3, 0x21ec: 0x00c3, 0x21ed: 0x00c3, 0x21ee: 0x0040, 0x21ef: 0x0040, - 0x21f0: 0x0080, 0x21f1: 0x0040, 0x21f2: 0x0040, 0x21f3: 0x0040, 0x21f4: 0x0040, 0x21f5: 0x0040, - 0x21f6: 0x0080, 0x21f7: 0x0080, 0x21f8: 0x008c, 0x21f9: 0x008c, 0x21fa: 0x008c, 0x21fb: 0x0040, - 0x21fc: 0x00c0, 0x21fd: 0x0080, 0x21fe: 0x0080, 0x21ff: 0x0080, - // Block 0x88, offset 0x2200 - 0x2201: 0x00cc, 0x2202: 0x00cc, 0x2203: 0x00cc, 0x2204: 0x00cc, 0x2205: 0x00cc, - 0x2206: 0x00cc, 0x2207: 0x00cc, 0x2208: 0x00cc, 0x2209: 0x00cc, 0x220a: 0x00cc, 0x220b: 0x00cc, - 0x220c: 0x00cc, 0x220d: 0x00cc, 0x220e: 0x00cc, 0x220f: 0x00cc, 0x2210: 0x00cc, 0x2211: 0x00cc, - 0x2212: 0x00cc, 0x2213: 0x00cc, 0x2214: 0x00cc, 0x2215: 0x00cc, 0x2216: 0x00cc, 0x2217: 0x00cc, - 0x2218: 0x00cc, 0x2219: 0x00cc, 0x221a: 0x00cc, 0x221b: 0x00cc, 0x221c: 0x00cc, 0x221d: 0x00cc, - 0x221e: 0x00cc, 0x221f: 0x00cc, 0x2220: 0x00cc, 0x2221: 0x00cc, 0x2222: 0x00cc, 0x2223: 0x00cc, - 0x2224: 0x00cc, 0x2225: 0x00cc, 0x2226: 0x00cc, 0x2227: 0x00cc, 0x2228: 0x00cc, 0x2229: 0x00cc, - 0x222a: 0x00cc, 0x222b: 0x00cc, 0x222c: 0x00cc, 0x222d: 0x00cc, 0x222e: 0x00cc, 0x222f: 0x00cc, - 0x2230: 0x00cc, 0x2231: 0x00cc, 0x2232: 0x00cc, 0x2233: 0x00cc, 0x2234: 0x00cc, 0x2235: 0x00cc, - 0x2236: 0x00cc, 0x2237: 0x00cc, 0x2238: 0x00cc, 0x2239: 0x00cc, 0x223a: 0x00cc, 0x223b: 0x00cc, - 0x223c: 0x00cc, 0x223d: 0x00cc, 0x223e: 0x00cc, 0x223f: 0x00cc, - // Block 0x89, offset 0x2240 - 0x2240: 0x00cc, 0x2241: 0x00cc, 0x2242: 0x00cc, 0x2243: 0x00cc, 0x2244: 0x00cc, 0x2245: 0x00cc, - 0x2246: 0x00cc, 0x2247: 0x00cc, 0x2248: 0x00cc, 0x2249: 0x00cc, 0x224a: 0x00cc, 0x224b: 0x00cc, - 0x224c: 0x00cc, 0x224d: 0x00cc, 0x224e: 0x00cc, 0x224f: 0x00cc, 0x2250: 0x00cc, 0x2251: 0x00cc, - 0x2252: 0x00cc, 0x2253: 0x00cc, 0x2254: 0x00cc, 0x2255: 0x00cc, 0x2256: 0x00cc, - 0x2259: 0x00c3, 0x225a: 0x00c3, 0x225b: 0x0080, 0x225c: 0x0080, 0x225d: 0x00cc, - 0x225e: 0x00cc, 0x225f: 0x008c, 0x2260: 0x0080, 0x2261: 0x00cc, 0x2262: 0x00cc, 0x2263: 0x00cc, - 0x2264: 0x00cc, 0x2265: 0x00cc, 0x2266: 0x00cc, 0x2267: 0x00cc, 0x2268: 0x00cc, 0x2269: 0x00cc, - 0x226a: 0x00cc, 0x226b: 0x00cc, 0x226c: 0x00cc, 0x226d: 0x00cc, 0x226e: 0x00cc, 0x226f: 0x00cc, - 0x2270: 0x00cc, 0x2271: 0x00cc, 0x2272: 0x00cc, 0x2273: 0x00cc, 0x2274: 0x00cc, 0x2275: 0x00cc, - 0x2276: 0x00cc, 0x2277: 0x00cc, 0x2278: 0x00cc, 0x2279: 0x00cc, 0x227a: 0x00cc, 0x227b: 0x00cc, - 0x227c: 0x00cc, 0x227d: 0x00cc, 0x227e: 0x00cc, 0x227f: 0x00cc, - // Block 0x8a, offset 0x2280 - 0x2280: 0x00cc, 0x2281: 0x00cc, 0x2282: 0x00cc, 0x2283: 0x00cc, 0x2284: 0x00cc, 0x2285: 0x00cc, - 0x2286: 0x00cc, 0x2287: 0x00cc, 0x2288: 0x00cc, 0x2289: 0x00cc, 0x228a: 0x00cc, 0x228b: 0x00cc, - 0x228c: 0x00cc, 0x228d: 0x00cc, 0x228e: 0x00cc, 0x228f: 0x00cc, 0x2290: 0x00cc, 0x2291: 0x00cc, - 0x2292: 0x00cc, 0x2293: 0x00cc, 0x2294: 0x00cc, 0x2295: 0x00cc, 0x2296: 0x00cc, 0x2297: 0x00cc, - 0x2298: 0x00cc, 0x2299: 0x00cc, 0x229a: 0x00cc, 0x229b: 0x00cc, 0x229c: 0x00cc, 0x229d: 0x00cc, - 0x229e: 0x00cc, 0x229f: 0x00cc, 0x22a0: 0x00cc, 0x22a1: 0x00cc, 0x22a2: 0x00cc, 0x22a3: 0x00cc, - 0x22a4: 0x00cc, 0x22a5: 0x00cc, 0x22a6: 0x00cc, 0x22a7: 0x00cc, 0x22a8: 0x00cc, 0x22a9: 0x00cc, - 0x22aa: 0x00cc, 0x22ab: 0x00cc, 0x22ac: 0x00cc, 0x22ad: 0x00cc, 0x22ae: 0x00cc, 0x22af: 0x00cc, - 0x22b0: 0x00cc, 0x22b1: 0x00cc, 0x22b2: 0x00cc, 0x22b3: 0x00cc, 0x22b4: 0x00cc, 0x22b5: 0x00cc, - 0x22b6: 0x00cc, 0x22b7: 0x00cc, 0x22b8: 0x00cc, 0x22b9: 0x00cc, 0x22ba: 0x00cc, 0x22bb: 0x00d2, - 0x22bc: 0x00c0, 0x22bd: 0x00cc, 0x22be: 0x00cc, 0x22bf: 0x008c, - // Block 0x8b, offset 0x22c0 - 0x22c5: 0x00c0, - 0x22c6: 0x00c0, 0x22c7: 0x00c0, 0x22c8: 0x00c0, 0x22c9: 0x00c0, 0x22ca: 0x00c0, 0x22cb: 0x00c0, - 0x22cc: 0x00c0, 0x22cd: 0x00c0, 0x22ce: 0x00c0, 0x22cf: 0x00c0, 0x22d0: 0x00c0, 0x22d1: 0x00c0, - 0x22d2: 0x00c0, 0x22d3: 0x00c0, 0x22d4: 0x00c0, 0x22d5: 0x00c0, 0x22d6: 0x00c0, 0x22d7: 0x00c0, - 0x22d8: 0x00c0, 0x22d9: 0x00c0, 0x22da: 0x00c0, 0x22db: 0x00c0, 0x22dc: 0x00c0, 0x22dd: 0x00c0, - 0x22de: 0x00c0, 0x22df: 0x00c0, 0x22e0: 0x00c0, 0x22e1: 0x00c0, 0x22e2: 0x00c0, 0x22e3: 0x00c0, - 0x22e4: 0x00c0, 0x22e5: 0x00c0, 0x22e6: 0x00c0, 0x22e7: 0x00c0, 0x22e8: 0x00c0, 0x22e9: 0x00c0, - 0x22ea: 0x00c0, 0x22eb: 0x00c0, 0x22ec: 0x00c0, 0x22ed: 0x00c0, - 0x22f1: 0x0080, 0x22f2: 0x0080, 0x22f3: 0x0080, 0x22f4: 0x0080, 0x22f5: 0x0080, - 0x22f6: 0x0080, 0x22f7: 0x0080, 0x22f8: 0x0080, 0x22f9: 0x0080, 0x22fa: 0x0080, 0x22fb: 0x0080, - 0x22fc: 0x0080, 0x22fd: 0x0080, 0x22fe: 0x0080, 0x22ff: 0x0080, - // Block 0x8c, offset 0x2300 - 0x2300: 0x0080, 0x2301: 0x0080, 0x2302: 0x0080, 0x2303: 0x0080, 0x2304: 0x0080, 0x2305: 0x0080, - 0x2306: 0x0080, 0x2307: 0x0080, 0x2308: 0x0080, 0x2309: 0x0080, 0x230a: 0x0080, 0x230b: 0x0080, - 0x230c: 0x0080, 0x230d: 0x0080, 0x230e: 0x0080, 0x230f: 0x0080, 0x2310: 0x0080, 0x2311: 0x0080, - 0x2312: 0x0080, 0x2313: 0x0080, 0x2314: 0x0080, 0x2315: 0x0080, 0x2316: 0x0080, 0x2317: 0x0080, - 0x2318: 0x0080, 0x2319: 0x0080, 0x231a: 0x0080, 0x231b: 0x0080, 0x231c: 0x0080, 0x231d: 0x0080, - 0x231e: 0x0080, 0x231f: 0x0080, 0x2320: 0x0080, 0x2321: 0x0080, 0x2322: 0x0080, 0x2323: 0x0080, - 0x2324: 0x0040, 0x2325: 0x0080, 0x2326: 0x0080, 0x2327: 0x0080, 0x2328: 0x0080, 0x2329: 0x0080, - 0x232a: 0x0080, 0x232b: 0x0080, 0x232c: 0x0080, 0x232d: 0x0080, 0x232e: 0x0080, 0x232f: 0x0080, - 0x2330: 0x0080, 0x2331: 0x0080, 0x2332: 0x0080, 0x2333: 0x0080, 0x2334: 0x0080, 0x2335: 0x0080, - 0x2336: 0x0080, 0x2337: 0x0080, 0x2338: 0x0080, 0x2339: 0x0080, 0x233a: 0x0080, 0x233b: 0x0080, - 0x233c: 0x0080, 0x233d: 0x0080, 0x233e: 0x0080, 0x233f: 0x0080, - // Block 0x8d, offset 0x2340 - 0x2340: 0x0080, 0x2341: 0x0080, 0x2342: 0x0080, 0x2343: 0x0080, 0x2344: 0x0080, 0x2345: 0x0080, - 0x2346: 0x0080, 0x2347: 0x0080, 0x2348: 0x0080, 0x2349: 0x0080, 0x234a: 0x0080, 0x234b: 0x0080, - 0x234c: 0x0080, 0x234d: 0x0080, 0x234e: 0x0080, 0x2350: 0x0080, 0x2351: 0x0080, - 0x2352: 0x0080, 0x2353: 0x0080, 0x2354: 0x0080, 0x2355: 0x0080, 0x2356: 0x0080, 0x2357: 0x0080, - 0x2358: 0x0080, 0x2359: 0x0080, 0x235a: 0x0080, 0x235b: 0x0080, 0x235c: 0x0080, 0x235d: 0x0080, - 0x235e: 0x0080, 0x235f: 0x0080, 0x2360: 0x00c0, 0x2361: 0x00c0, 0x2362: 0x00c0, 0x2363: 0x00c0, - 0x2364: 0x00c0, 0x2365: 0x00c0, 0x2366: 0x00c0, 0x2367: 0x00c0, 0x2368: 0x00c0, 0x2369: 0x00c0, - 0x236a: 0x00c0, 0x236b: 0x00c0, 0x236c: 0x00c0, 0x236d: 0x00c0, 0x236e: 0x00c0, 0x236f: 0x00c0, - 0x2370: 0x00c0, 0x2371: 0x00c0, 0x2372: 0x00c0, 0x2373: 0x00c0, 0x2374: 0x00c0, 0x2375: 0x00c0, - 0x2376: 0x00c0, 0x2377: 0x00c0, 0x2378: 0x00c0, 0x2379: 0x00c0, 0x237a: 0x00c0, - // Block 0x8e, offset 0x2380 - 0x2380: 0x0080, 0x2381: 0x0080, 0x2382: 0x0080, 0x2383: 0x0080, 0x2384: 0x0080, 0x2385: 0x0080, - 0x2386: 0x0080, 0x2387: 0x0080, 0x2388: 0x0080, 0x2389: 0x0080, 0x238a: 0x0080, 0x238b: 0x0080, - 0x238c: 0x0080, 0x238d: 0x0080, 0x238e: 0x0080, 0x238f: 0x0080, 0x2390: 0x0080, 0x2391: 0x0080, - 0x2392: 0x0080, 0x2393: 0x0080, 0x2394: 0x0080, 0x2395: 0x0080, 0x2396: 0x0080, 0x2397: 0x0080, - 0x2398: 0x0080, 0x2399: 0x0080, 0x239a: 0x0080, 0x239b: 0x0080, 0x239c: 0x0080, 0x239d: 0x0080, - 0x239e: 0x0080, 0x239f: 0x0080, 0x23a0: 0x0080, 0x23a1: 0x0080, 0x23a2: 0x0080, 0x23a3: 0x0080, - 0x23b0: 0x00cc, 0x23b1: 0x00cc, 0x23b2: 0x00cc, 0x23b3: 0x00cc, 0x23b4: 0x00cc, 0x23b5: 0x00cc, - 0x23b6: 0x00cc, 0x23b7: 0x00cc, 0x23b8: 0x00cc, 0x23b9: 0x00cc, 0x23ba: 0x00cc, 0x23bb: 0x00cc, - 0x23bc: 0x00cc, 0x23bd: 0x00cc, 0x23be: 0x00cc, 0x23bf: 0x00cc, - // Block 0x8f, offset 0x23c0 - 0x23c0: 0x0080, 0x23c1: 0x0080, 0x23c2: 0x0080, 0x23c3: 0x0080, 0x23c4: 0x0080, 0x23c5: 0x0080, - 0x23c6: 0x0080, 0x23c7: 0x0080, 0x23c8: 0x0080, 0x23c9: 0x0080, 0x23ca: 0x0080, 0x23cb: 0x0080, - 0x23cc: 0x0080, 0x23cd: 0x0080, 0x23ce: 0x0080, 0x23cf: 0x0080, 0x23d0: 0x0080, 0x23d1: 0x0080, - 0x23d2: 0x0080, 0x23d3: 0x0080, 0x23d4: 0x0080, 0x23d5: 0x0080, 0x23d6: 0x0080, 0x23d7: 0x0080, - 0x23d8: 0x0080, 0x23d9: 0x0080, 0x23da: 0x0080, 0x23db: 0x0080, 0x23dc: 0x0080, 0x23dd: 0x0080, - 0x23de: 0x0080, 0x23e0: 0x0080, 0x23e1: 0x0080, 0x23e2: 0x0080, 0x23e3: 0x0080, - 0x23e4: 0x0080, 0x23e5: 0x0080, 0x23e6: 0x0080, 0x23e7: 0x0080, 0x23e8: 0x0080, 0x23e9: 0x0080, - 0x23ea: 0x0080, 0x23eb: 0x0080, 0x23ec: 0x0080, 0x23ed: 0x0080, 0x23ee: 0x0080, 0x23ef: 0x0080, - 0x23f0: 0x0080, 0x23f1: 0x0080, 0x23f2: 0x0080, 0x23f3: 0x0080, 0x23f4: 0x0080, 0x23f5: 0x0080, - 0x23f6: 0x0080, 0x23f7: 0x0080, 0x23f8: 0x0080, 0x23f9: 0x0080, 0x23fa: 0x0080, 0x23fb: 0x0080, - 0x23fc: 0x0080, 0x23fd: 0x0080, 0x23fe: 0x0080, 0x23ff: 0x0080, - // Block 0x90, offset 0x2400 - 0x2400: 0x0080, 0x2401: 0x0080, 0x2402: 0x0080, 0x2403: 0x0080, 0x2404: 0x0080, 0x2405: 0x0080, - 0x2406: 0x0080, 0x2407: 0x0080, 0x2408: 0x0080, 0x2409: 0x0080, 0x240a: 0x0080, 0x240b: 0x0080, - 0x240c: 0x0080, 0x240d: 0x0080, 0x240e: 0x0080, 0x240f: 0x0080, 0x2410: 0x008c, 0x2411: 0x008c, - 0x2412: 0x008c, 0x2413: 0x008c, 0x2414: 0x008c, 0x2415: 0x008c, 0x2416: 0x008c, 0x2417: 0x008c, - 0x2418: 0x008c, 0x2419: 0x008c, 0x241a: 0x008c, 0x241b: 0x008c, 0x241c: 0x008c, 0x241d: 0x008c, - 0x241e: 0x008c, 0x241f: 0x008c, 0x2420: 0x008c, 0x2421: 0x008c, 0x2422: 0x008c, 0x2423: 0x008c, - 0x2424: 0x008c, 0x2425: 0x008c, 0x2426: 0x008c, 0x2427: 0x008c, 0x2428: 0x008c, 0x2429: 0x008c, - 0x242a: 0x008c, 0x242b: 0x008c, 0x242c: 0x008c, 0x242d: 0x008c, 0x242e: 0x008c, 0x242f: 0x008c, - 0x2430: 0x008c, 0x2431: 0x008c, 0x2432: 0x008c, 0x2433: 0x008c, 0x2434: 0x008c, 0x2435: 0x008c, - 0x2436: 0x008c, 0x2437: 0x008c, 0x2438: 0x008c, 0x2439: 0x008c, 0x243a: 0x008c, 0x243b: 0x008c, - 0x243c: 0x008c, 0x243d: 0x008c, 0x243e: 0x008c, - // Block 0x91, offset 0x2440 - 0x2440: 0x008c, 0x2441: 0x008c, 0x2442: 0x008c, 0x2443: 0x008c, 0x2444: 0x008c, 0x2445: 0x008c, - 0x2446: 0x008c, 0x2447: 0x008c, 0x2448: 0x008c, 0x2449: 0x008c, 0x244a: 0x008c, 0x244b: 0x008c, - 0x244c: 0x008c, 0x244d: 0x008c, 0x244e: 0x008c, 0x244f: 0x008c, 0x2450: 0x008c, 0x2451: 0x008c, - 0x2452: 0x008c, 0x2453: 0x008c, 0x2454: 0x008c, 0x2455: 0x008c, 0x2456: 0x008c, 0x2457: 0x008c, - 0x2458: 0x0080, 0x2459: 0x0080, 0x245a: 0x0080, 0x245b: 0x0080, 0x245c: 0x0080, 0x245d: 0x0080, - 0x245e: 0x0080, 0x245f: 0x0080, 0x2460: 0x0080, 0x2461: 0x0080, 0x2462: 0x0080, 0x2463: 0x0080, - 0x2464: 0x0080, 0x2465: 0x0080, 0x2466: 0x0080, 0x2467: 0x0080, 0x2468: 0x0080, 0x2469: 0x0080, - 0x246a: 0x0080, 0x246b: 0x0080, 0x246c: 0x0080, 0x246d: 0x0080, 0x246e: 0x0080, 0x246f: 0x0080, - 0x2470: 0x0080, 0x2471: 0x0080, 0x2472: 0x0080, 0x2473: 0x0080, 0x2474: 0x0080, 0x2475: 0x0080, - 0x2476: 0x0080, 0x2477: 0x0080, 0x2478: 0x0080, 0x2479: 0x0080, 0x247a: 0x0080, 0x247b: 0x0080, - 0x247c: 0x0080, 0x247d: 0x0080, 0x247e: 0x0080, 0x247f: 0x0080, - // Block 0x92, offset 0x2480 - 0x2480: 0x00cc, 0x2481: 0x00cc, 0x2482: 0x00cc, 0x2483: 0x00cc, 0x2484: 0x00cc, 0x2485: 0x00cc, - 0x2486: 0x00cc, 0x2487: 0x00cc, 0x2488: 0x00cc, 0x2489: 0x00cc, 0x248a: 0x00cc, 0x248b: 0x00cc, - 0x248c: 0x00cc, 0x248d: 0x00cc, 0x248e: 0x00cc, 0x248f: 0x00cc, 0x2490: 0x00cc, 0x2491: 0x00cc, - 0x2492: 0x00cc, 0x2493: 0x00cc, 0x2494: 0x00cc, 0x2495: 0x00cc, 0x2496: 0x00cc, 0x2497: 0x00cc, - 0x2498: 0x00cc, 0x2499: 0x00cc, 0x249a: 0x00cc, 0x249b: 0x00cc, 0x249c: 0x00cc, 0x249d: 0x00cc, - 0x249e: 0x00cc, 0x249f: 0x00cc, 0x24a0: 0x00cc, 0x24a1: 0x00cc, 0x24a2: 0x00cc, 0x24a3: 0x00cc, - 0x24a4: 0x00cc, 0x24a5: 0x00cc, 0x24a6: 0x00cc, 0x24a7: 0x00cc, 0x24a8: 0x00cc, 0x24a9: 0x00cc, - 0x24aa: 0x00cc, 0x24ab: 0x00cc, 0x24ac: 0x00cc, 0x24ad: 0x00cc, 0x24ae: 0x00cc, 0x24af: 0x00cc, - 0x24b0: 0x00cc, 0x24b1: 0x00cc, 0x24b2: 0x00cc, 0x24b3: 0x00cc, 0x24b4: 0x00cc, 0x24b5: 0x00cc, - 0x24b6: 0x00cc, 0x24b7: 0x00cc, 0x24b8: 0x00cc, 0x24b9: 0x00cc, 0x24ba: 0x00cc, 0x24bb: 0x00cc, - 0x24bc: 0x00cc, 0x24bd: 0x00cc, 0x24be: 0x00cc, 0x24bf: 0x00cc, - // Block 0x93, offset 0x24c0 - 0x24c0: 0x00cc, 0x24c1: 0x00cc, 0x24c2: 0x00cc, 0x24c3: 0x00cc, 0x24c4: 0x00cc, 0x24c5: 0x00cc, - 0x24c6: 0x00cc, 0x24c7: 0x00cc, 0x24c8: 0x00cc, 0x24c9: 0x00cc, 0x24ca: 0x00cc, 0x24cb: 0x00cc, - 0x24cc: 0x00cc, 0x24cd: 0x00cc, 0x24ce: 0x00cc, 0x24cf: 0x00cc, 0x24d0: 0x00cc, 0x24d1: 0x00cc, - 0x24d2: 0x00cc, 0x24d3: 0x00cc, 0x24d4: 0x00cc, 0x24d5: 0x00cc, 0x24d6: 0x00cc, 0x24d7: 0x00cc, - 0x24d8: 0x00cc, 0x24d9: 0x00cc, 0x24da: 0x00cc, 0x24db: 0x00cc, 0x24dc: 0x00cc, 0x24dd: 0x00cc, - 0x24de: 0x00cc, 0x24df: 0x00cc, 0x24e0: 0x00cc, 0x24e1: 0x00cc, 0x24e2: 0x00cc, 0x24e3: 0x00cc, - 0x24e4: 0x00cc, 0x24e5: 0x00cc, 0x24e6: 0x00cc, 0x24e7: 0x00cc, 0x24e8: 0x00cc, 0x24e9: 0x00cc, - 0x24ea: 0x00cc, 0x24eb: 0x00cc, 0x24ec: 0x00cc, 0x24ed: 0x00cc, 0x24ee: 0x00cc, 0x24ef: 0x00cc, - 0x24f0: 0x00cc, 0x24f1: 0x00cc, 0x24f2: 0x00cc, 0x24f3: 0x00cc, 0x24f4: 0x00cc, 0x24f5: 0x00cc, - // Block 0x94, offset 0x2500 - 0x2500: 0x00cc, 0x2501: 0x00cc, 0x2502: 0x00cc, 0x2503: 0x00cc, 0x2504: 0x00cc, 0x2505: 0x00cc, - 0x2506: 0x00cc, 0x2507: 0x00cc, 0x2508: 0x00cc, 0x2509: 0x00cc, 0x250a: 0x00cc, 0x250b: 0x00cc, - 0x250c: 0x00cc, 0x250d: 0x00cc, 0x250e: 0x00cc, 0x250f: 0x00cc, 0x2510: 0x00cc, 0x2511: 0x00cc, - 0x2512: 0x00cc, 0x2513: 0x00cc, 0x2514: 0x00cc, 0x2515: 0x00cc, - // Block 0x95, offset 0x2540 - 0x2540: 0x00c0, 0x2541: 0x00c0, 0x2542: 0x00c0, 0x2543: 0x00c0, 0x2544: 0x00c0, 0x2545: 0x00c0, - 0x2546: 0x00c0, 0x2547: 0x00c0, 0x2548: 0x00c0, 0x2549: 0x00c0, 0x254a: 0x00c0, 0x254b: 0x00c0, - 0x254c: 0x00c0, 0x2550: 0x0080, 0x2551: 0x0080, - 0x2552: 0x0080, 0x2553: 0x0080, 0x2554: 0x0080, 0x2555: 0x0080, 0x2556: 0x0080, 0x2557: 0x0080, - 0x2558: 0x0080, 0x2559: 0x0080, 0x255a: 0x0080, 0x255b: 0x0080, 0x255c: 0x0080, 0x255d: 0x0080, - 0x255e: 0x0080, 0x255f: 0x0080, 0x2560: 0x0080, 0x2561: 0x0080, 0x2562: 0x0080, 0x2563: 0x0080, - 0x2564: 0x0080, 0x2565: 0x0080, 0x2566: 0x0080, 0x2567: 0x0080, 0x2568: 0x0080, 0x2569: 0x0080, - 0x256a: 0x0080, 0x256b: 0x0080, 0x256c: 0x0080, 0x256d: 0x0080, 0x256e: 0x0080, 0x256f: 0x0080, - 0x2570: 0x0080, 0x2571: 0x0080, 0x2572: 0x0080, 0x2573: 0x0080, 0x2574: 0x0080, 0x2575: 0x0080, - 0x2576: 0x0080, 0x2577: 0x0080, 0x2578: 0x0080, 0x2579: 0x0080, 0x257a: 0x0080, 0x257b: 0x0080, - 0x257c: 0x0080, 0x257d: 0x0080, 0x257e: 0x0080, 0x257f: 0x0080, - // Block 0x96, offset 0x2580 - 0x2580: 0x0080, 0x2581: 0x0080, 0x2582: 0x0080, 0x2583: 0x0080, 0x2584: 0x0080, 0x2585: 0x0080, - 0x2586: 0x0080, - 0x2590: 0x00c0, 0x2591: 0x00c0, - 0x2592: 0x00c0, 0x2593: 0x00c0, 0x2594: 0x00c0, 0x2595: 0x00c0, 0x2596: 0x00c0, 0x2597: 0x00c0, - 0x2598: 0x00c0, 0x2599: 0x00c0, 0x259a: 0x00c0, 0x259b: 0x00c0, 0x259c: 0x00c0, 0x259d: 0x00c0, - 0x259e: 0x00c0, 0x259f: 0x00c0, 0x25a0: 0x00c0, 0x25a1: 0x00c0, 0x25a2: 0x00c0, 0x25a3: 0x00c0, - 0x25a4: 0x00c0, 0x25a5: 0x00c0, 0x25a6: 0x00c0, 0x25a7: 0x00c0, 0x25a8: 0x00c0, 0x25a9: 0x00c0, - 0x25aa: 0x00c0, 0x25ab: 0x00c0, 0x25ac: 0x00c0, 0x25ad: 0x00c0, 0x25ae: 0x00c0, 0x25af: 0x00c0, - 0x25b0: 0x00c0, 0x25b1: 0x00c0, 0x25b2: 0x00c0, 0x25b3: 0x00c0, 0x25b4: 0x00c0, 0x25b5: 0x00c0, - 0x25b6: 0x00c0, 0x25b7: 0x00c0, 0x25b8: 0x00c0, 0x25b9: 0x00c0, 0x25ba: 0x00c0, 0x25bb: 0x00c0, - 0x25bc: 0x00c0, 0x25bd: 0x00c0, 0x25be: 0x0080, 0x25bf: 0x0080, - // Block 0x97, offset 0x25c0 - 0x25c0: 0x00c0, 0x25c1: 0x00c0, 0x25c2: 0x00c0, 0x25c3: 0x00c0, 0x25c4: 0x00c0, 0x25c5: 0x00c0, - 0x25c6: 0x00c0, 0x25c7: 0x00c0, 0x25c8: 0x00c0, 0x25c9: 0x00c0, 0x25ca: 0x00c0, 0x25cb: 0x00c0, - 0x25cc: 0x00c0, 0x25cd: 0x0080, 0x25ce: 0x0080, 0x25cf: 0x0080, 0x25d0: 0x00c0, 0x25d1: 0x00c0, - 0x25d2: 0x00c0, 0x25d3: 0x00c0, 0x25d4: 0x00c0, 0x25d5: 0x00c0, 0x25d6: 0x00c0, 0x25d7: 0x00c0, - 0x25d8: 0x00c0, 0x25d9: 0x00c0, 0x25da: 0x00c0, 0x25db: 0x00c0, 0x25dc: 0x00c0, 0x25dd: 0x00c0, - 0x25de: 0x00c0, 0x25df: 0x00c0, 0x25e0: 0x00c0, 0x25e1: 0x00c0, 0x25e2: 0x00c0, 0x25e3: 0x00c0, - 0x25e4: 0x00c0, 0x25e5: 0x00c0, 0x25e6: 0x00c0, 0x25e7: 0x00c0, 0x25e8: 0x00c0, 0x25e9: 0x00c0, - 0x25ea: 0x00c0, 0x25eb: 0x00c0, - // Block 0x98, offset 0x2600 - 0x2600: 0x00c0, 0x2601: 0x00c0, 0x2602: 0x00c0, 0x2603: 0x00c0, 0x2604: 0x00c0, 0x2605: 0x00c0, - 0x2606: 0x00c0, 0x2607: 0x00c0, 0x2608: 0x00c0, 0x2609: 0x00c0, 0x260a: 0x00c0, 0x260b: 0x00c0, - 0x260c: 0x00c0, 0x260d: 0x00c0, 0x260e: 0x00c0, 0x260f: 0x00c0, 0x2610: 0x00c0, 0x2611: 0x00c0, - 0x2612: 0x00c0, 0x2613: 0x00c0, 0x2614: 0x00c0, 0x2615: 0x00c0, 0x2616: 0x00c0, 0x2617: 0x00c0, - 0x2618: 0x00c0, 0x2619: 0x00c0, 0x261a: 0x00c0, 0x261b: 0x00c0, 0x261c: 0x00c0, 0x261d: 0x00c0, - 0x261e: 0x00c0, 0x261f: 0x00c0, 0x2620: 0x00c0, 0x2621: 0x00c0, 0x2622: 0x00c0, 0x2623: 0x00c0, - 0x2624: 0x00c0, 0x2625: 0x00c0, 0x2626: 0x00c0, 0x2627: 0x00c0, 0x2628: 0x00c0, 0x2629: 0x00c0, - 0x262a: 0x00c0, 0x262b: 0x00c0, 0x262c: 0x00c0, 0x262d: 0x00c0, 0x262e: 0x00c0, 0x262f: 0x00c3, - 0x2630: 0x0083, 0x2631: 0x0083, 0x2632: 0x0083, 0x2633: 0x0080, 0x2634: 0x00c3, 0x2635: 0x00c3, - 0x2636: 0x00c3, 0x2637: 0x00c3, 0x2638: 0x00c3, 0x2639: 0x00c3, 0x263a: 0x00c3, 0x263b: 0x00c3, - 0x263c: 0x00c3, 0x263d: 0x00c3, 0x263e: 0x0080, 0x263f: 0x00c0, - // Block 0x99, offset 0x2640 - 0x2640: 0x00c0, 0x2641: 0x00c0, 0x2642: 0x00c0, 0x2643: 0x00c0, 0x2644: 0x00c0, 0x2645: 0x00c0, - 0x2646: 0x00c0, 0x2647: 0x00c0, 0x2648: 0x00c0, 0x2649: 0x00c0, 0x264a: 0x00c0, 0x264b: 0x00c0, - 0x264c: 0x00c0, 0x264d: 0x00c0, 0x264e: 0x00c0, 0x264f: 0x00c0, 0x2650: 0x00c0, 0x2651: 0x00c0, - 0x2652: 0x00c0, 0x2653: 0x00c0, 0x2654: 0x00c0, 0x2655: 0x00c0, 0x2656: 0x00c0, 0x2657: 0x00c0, - 0x2658: 0x00c0, 0x2659: 0x00c0, 0x265a: 0x00c0, 0x265b: 0x00c0, 0x265c: 0x0080, 0x265d: 0x0080, - 0x265e: 0x00c3, 0x265f: 0x00c3, 0x2660: 0x00c0, 0x2661: 0x00c0, 0x2662: 0x00c0, 0x2663: 0x00c0, - 0x2664: 0x00c0, 0x2665: 0x00c0, 0x2666: 0x00c0, 0x2667: 0x00c0, 0x2668: 0x00c0, 0x2669: 0x00c0, - 0x266a: 0x00c0, 0x266b: 0x00c0, 0x266c: 0x00c0, 0x266d: 0x00c0, 0x266e: 0x00c0, 0x266f: 0x00c0, - 0x2670: 0x00c0, 0x2671: 0x00c0, 0x2672: 0x00c0, 0x2673: 0x00c0, 0x2674: 0x00c0, 0x2675: 0x00c0, - 0x2676: 0x00c0, 0x2677: 0x00c0, 0x2678: 0x00c0, 0x2679: 0x00c0, 0x267a: 0x00c0, 0x267b: 0x00c0, - 0x267c: 0x00c0, 0x267d: 0x00c0, 0x267e: 0x00c0, 0x267f: 0x00c0, - // Block 0x9a, offset 0x2680 - 0x2680: 0x00c0, 0x2681: 0x00c0, 0x2682: 0x00c0, 0x2683: 0x00c0, 0x2684: 0x00c0, 0x2685: 0x00c0, - 0x2686: 0x00c0, 0x2687: 0x00c0, 0x2688: 0x00c0, 0x2689: 0x00c0, 0x268a: 0x00c0, 0x268b: 0x00c0, - 0x268c: 0x00c0, 0x268d: 0x00c0, 0x268e: 0x00c0, 0x268f: 0x00c0, 0x2690: 0x00c0, 0x2691: 0x00c0, - 0x2692: 0x00c0, 0x2693: 0x00c0, 0x2694: 0x00c0, 0x2695: 0x00c0, 0x2696: 0x00c0, 0x2697: 0x00c0, - 0x2698: 0x00c0, 0x2699: 0x00c0, 0x269a: 0x00c0, 0x269b: 0x00c0, 0x269c: 0x00c0, 0x269d: 0x00c0, - 0x269e: 0x00c0, 0x269f: 0x00c0, 0x26a0: 0x00c0, 0x26a1: 0x00c0, 0x26a2: 0x00c0, 0x26a3: 0x00c0, - 0x26a4: 0x00c0, 0x26a5: 0x00c0, 0x26a6: 0x0080, 0x26a7: 0x0080, 0x26a8: 0x0080, 0x26a9: 0x0080, - 0x26aa: 0x0080, 0x26ab: 0x0080, 0x26ac: 0x0080, 0x26ad: 0x0080, 0x26ae: 0x0080, 0x26af: 0x0080, - 0x26b0: 0x00c3, 0x26b1: 0x00c3, 0x26b2: 0x0080, 0x26b3: 0x0080, 0x26b4: 0x0080, 0x26b5: 0x0080, - 0x26b6: 0x0080, 0x26b7: 0x0080, - // Block 0x9b, offset 0x26c0 - 0x26c0: 0x0080, 0x26c1: 0x0080, 0x26c2: 0x0080, 0x26c3: 0x0080, 0x26c4: 0x0080, 0x26c5: 0x0080, - 0x26c6: 0x0080, 0x26c7: 0x0080, 0x26c8: 0x0080, 0x26c9: 0x0080, 0x26ca: 0x0080, 0x26cb: 0x0080, - 0x26cc: 0x0080, 0x26cd: 0x0080, 0x26ce: 0x0080, 0x26cf: 0x0080, 0x26d0: 0x0080, 0x26d1: 0x0080, - 0x26d2: 0x0080, 0x26d3: 0x0080, 0x26d4: 0x0080, 0x26d5: 0x0080, 0x26d6: 0x0080, 0x26d7: 0x00c0, - 0x26d8: 0x00c0, 0x26d9: 0x00c0, 0x26da: 0x00c0, 0x26db: 0x00c0, 0x26dc: 0x00c0, 0x26dd: 0x00c0, - 0x26de: 0x00c0, 0x26df: 0x00c0, 0x26e0: 0x0080, 0x26e1: 0x0080, 0x26e2: 0x00c0, 0x26e3: 0x00c0, - 0x26e4: 0x00c0, 0x26e5: 0x00c0, 0x26e6: 0x00c0, 0x26e7: 0x00c0, 0x26e8: 0x00c0, 0x26e9: 0x00c0, - 0x26ea: 0x00c0, 0x26eb: 0x00c0, 0x26ec: 0x00c0, 0x26ed: 0x00c0, 0x26ee: 0x00c0, 0x26ef: 0x00c0, - 0x26f0: 0x00c0, 0x26f1: 0x00c0, 0x26f2: 0x00c0, 0x26f3: 0x00c0, 0x26f4: 0x00c0, 0x26f5: 0x00c0, - 0x26f6: 0x00c0, 0x26f7: 0x00c0, 0x26f8: 0x00c0, 0x26f9: 0x00c0, 0x26fa: 0x00c0, 0x26fb: 0x00c0, - 0x26fc: 0x00c0, 0x26fd: 0x00c0, 0x26fe: 0x00c0, 0x26ff: 0x00c0, - // Block 0x9c, offset 0x2700 - 0x2700: 0x00c0, 0x2701: 0x00c0, 0x2702: 0x00c0, 0x2703: 0x00c0, 0x2704: 0x00c0, 0x2705: 0x00c0, - 0x2706: 0x00c0, 0x2707: 0x00c0, 0x2708: 0x00c0, 0x2709: 0x00c0, 0x270a: 0x00c0, 0x270b: 0x00c0, - 0x270c: 0x00c0, 0x270d: 0x00c0, 0x270e: 0x00c0, 0x270f: 0x00c0, 0x2710: 0x00c0, 0x2711: 0x00c0, - 0x2712: 0x00c0, 0x2713: 0x00c0, 0x2714: 0x00c0, 0x2715: 0x00c0, 0x2716: 0x00c0, 0x2717: 0x00c0, - 0x2718: 0x00c0, 0x2719: 0x00c0, 0x271a: 0x00c0, 0x271b: 0x00c0, 0x271c: 0x00c0, 0x271d: 0x00c0, - 0x271e: 0x00c0, 0x271f: 0x00c0, 0x2720: 0x00c0, 0x2721: 0x00c0, 0x2722: 0x00c0, 0x2723: 0x00c0, - 0x2724: 0x00c0, 0x2725: 0x00c0, 0x2726: 0x00c0, 0x2727: 0x00c0, 0x2728: 0x00c0, 0x2729: 0x00c0, - 0x272a: 0x00c0, 0x272b: 0x00c0, 0x272c: 0x00c0, 0x272d: 0x00c0, 0x272e: 0x00c0, 0x272f: 0x00c0, - 0x2730: 0x0080, 0x2731: 0x00c0, 0x2732: 0x00c0, 0x2733: 0x00c0, 0x2734: 0x00c0, 0x2735: 0x00c0, - 0x2736: 0x00c0, 0x2737: 0x00c0, 0x2738: 0x00c0, 0x2739: 0x00c0, 0x273a: 0x00c0, 0x273b: 0x00c0, - 0x273c: 0x00c0, 0x273d: 0x00c0, 0x273e: 0x00c0, 0x273f: 0x00c0, - // Block 0x9d, offset 0x2740 - 0x2740: 0x00c0, 0x2741: 0x00c0, 0x2742: 0x00c0, 0x2743: 0x00c0, 0x2744: 0x00c0, 0x2745: 0x00c0, - 0x2746: 0x00c0, 0x2747: 0x00c0, 0x2748: 0x00c0, 0x2749: 0x0080, 0x274a: 0x0080, 0x274b: 0x00c0, - 0x274c: 0x00c0, 0x274d: 0x00c0, 0x274e: 0x00c0, 0x274f: 0x00c0, 0x2750: 0x00c0, 0x2751: 0x00c0, - 0x2752: 0x00c0, 0x2753: 0x00c0, 0x2754: 0x00c0, 0x2755: 0x00c0, 0x2756: 0x00c0, 0x2757: 0x00c0, - 0x2758: 0x00c0, 0x2759: 0x00c0, 0x275a: 0x00c0, 0x275b: 0x00c0, 0x275c: 0x00c0, 0x275d: 0x00c0, - 0x275e: 0x00c0, 0x275f: 0x00c0, 0x2760: 0x00c0, 0x2761: 0x00c0, 0x2762: 0x00c0, 0x2763: 0x00c0, - 0x2764: 0x00c0, 0x2765: 0x00c0, 0x2766: 0x00c0, 0x2767: 0x00c0, 0x2768: 0x00c0, 0x2769: 0x00c0, - 0x276a: 0x00c0, 0x276b: 0x00c0, 0x276c: 0x00c0, 0x276d: 0x00c0, 0x276e: 0x00c0, - 0x2770: 0x00c0, 0x2771: 0x00c0, 0x2772: 0x00c0, 0x2773: 0x00c0, 0x2774: 0x00c0, 0x2775: 0x00c0, - 0x2776: 0x00c0, 0x2777: 0x00c0, - // Block 0x9e, offset 0x2780 - 0x27b7: 0x00c0, 0x27b8: 0x0080, 0x27b9: 0x0080, 0x27ba: 0x00c0, 0x27bb: 0x00c0, - 0x27bc: 0x00c0, 0x27bd: 0x00c0, 0x27be: 0x00c0, 0x27bf: 0x00c0, - // Block 0x9f, offset 0x27c0 - 0x27c0: 0x00c0, 0x27c1: 0x00c0, 0x27c2: 0x00c3, 0x27c3: 0x00c0, 0x27c4: 0x00c0, 0x27c5: 0x00c0, - 0x27c6: 0x00c6, 0x27c7: 0x00c0, 0x27c8: 0x00c0, 0x27c9: 0x00c0, 0x27ca: 0x00c0, 0x27cb: 0x00c3, - 0x27cc: 0x00c0, 0x27cd: 0x00c0, 0x27ce: 0x00c0, 0x27cf: 0x00c0, 0x27d0: 0x00c0, 0x27d1: 0x00c0, - 0x27d2: 0x00c0, 0x27d3: 0x00c0, 0x27d4: 0x00c0, 0x27d5: 0x00c0, 0x27d6: 0x00c0, 0x27d7: 0x00c0, - 0x27d8: 0x00c0, 0x27d9: 0x00c0, 0x27da: 0x00c0, 0x27db: 0x00c0, 0x27dc: 0x00c0, 0x27dd: 0x00c0, - 0x27de: 0x00c0, 0x27df: 0x00c0, 0x27e0: 0x00c0, 0x27e1: 0x00c0, 0x27e2: 0x00c0, 0x27e3: 0x00c0, - 0x27e4: 0x00c0, 0x27e5: 0x00c3, 0x27e6: 0x00c3, 0x27e7: 0x00c0, 0x27e8: 0x0080, 0x27e9: 0x0080, - 0x27ea: 0x0080, 0x27eb: 0x0080, - 0x27f0: 0x0080, 0x27f1: 0x0080, 0x27f2: 0x0080, 0x27f3: 0x0080, 0x27f4: 0x0080, 0x27f5: 0x0080, - 0x27f6: 0x0080, 0x27f7: 0x0080, 0x27f8: 0x0080, 0x27f9: 0x0080, - // Block 0xa0, offset 0x2800 - 0x2800: 0x00c2, 0x2801: 0x00c2, 0x2802: 0x00c2, 0x2803: 0x00c2, 0x2804: 0x00c2, 0x2805: 0x00c2, - 0x2806: 0x00c2, 0x2807: 0x00c2, 0x2808: 0x00c2, 0x2809: 0x00c2, 0x280a: 0x00c2, 0x280b: 0x00c2, - 0x280c: 0x00c2, 0x280d: 0x00c2, 0x280e: 0x00c2, 0x280f: 0x00c2, 0x2810: 0x00c2, 0x2811: 0x00c2, - 0x2812: 0x00c2, 0x2813: 0x00c2, 0x2814: 0x00c2, 0x2815: 0x00c2, 0x2816: 0x00c2, 0x2817: 0x00c2, - 0x2818: 0x00c2, 0x2819: 0x00c2, 0x281a: 0x00c2, 0x281b: 0x00c2, 0x281c: 0x00c2, 0x281d: 0x00c2, - 0x281e: 0x00c2, 0x281f: 0x00c2, 0x2820: 0x00c2, 0x2821: 0x00c2, 0x2822: 0x00c2, 0x2823: 0x00c2, - 0x2824: 0x00c2, 0x2825: 0x00c2, 0x2826: 0x00c2, 0x2827: 0x00c2, 0x2828: 0x00c2, 0x2829: 0x00c2, - 0x282a: 0x00c2, 0x282b: 0x00c2, 0x282c: 0x00c2, 0x282d: 0x00c2, 0x282e: 0x00c2, 0x282f: 0x00c2, - 0x2830: 0x00c2, 0x2831: 0x00c2, 0x2832: 0x00c1, 0x2833: 0x00c0, 0x2834: 0x0080, 0x2835: 0x0080, - 0x2836: 0x0080, 0x2837: 0x0080, - // Block 0xa1, offset 0x2840 - 0x2840: 0x00c0, 0x2841: 0x00c0, 0x2842: 0x00c0, 0x2843: 0x00c0, 0x2844: 0x00c6, 0x2845: 0x00c3, - 0x284e: 0x0080, 0x284f: 0x0080, 0x2850: 0x00c0, 0x2851: 0x00c0, - 0x2852: 0x00c0, 0x2853: 0x00c0, 0x2854: 0x00c0, 0x2855: 0x00c0, 0x2856: 0x00c0, 0x2857: 0x00c0, - 0x2858: 0x00c0, 0x2859: 0x00c0, - 0x2860: 0x00c3, 0x2861: 0x00c3, 0x2862: 0x00c3, 0x2863: 0x00c3, - 0x2864: 0x00c3, 0x2865: 0x00c3, 0x2866: 0x00c3, 0x2867: 0x00c3, 0x2868: 0x00c3, 0x2869: 0x00c3, - 0x286a: 0x00c3, 0x286b: 0x00c3, 0x286c: 0x00c3, 0x286d: 0x00c3, 0x286e: 0x00c3, 0x286f: 0x00c3, - 0x2870: 0x00c3, 0x2871: 0x00c3, 0x2872: 0x00c0, 0x2873: 0x00c0, 0x2874: 0x00c0, 0x2875: 0x00c0, - 0x2876: 0x00c0, 0x2877: 0x00c0, 0x2878: 0x0080, 0x2879: 0x0080, 0x287a: 0x0080, 0x287b: 0x00c0, - 0x287c: 0x0080, 0x287d: 0x00c0, - // Block 0xa2, offset 0x2880 - 0x2880: 0x00c0, 0x2881: 0x00c0, 0x2882: 0x00c0, 0x2883: 0x00c0, 0x2884: 0x00c0, 0x2885: 0x00c0, - 0x2886: 0x00c0, 0x2887: 0x00c0, 0x2888: 0x00c0, 0x2889: 0x00c0, 0x288a: 0x00c0, 0x288b: 0x00c0, - 0x288c: 0x00c0, 0x288d: 0x00c0, 0x288e: 0x00c0, 0x288f: 0x00c0, 0x2890: 0x00c0, 0x2891: 0x00c0, - 0x2892: 0x00c0, 0x2893: 0x00c0, 0x2894: 0x00c0, 0x2895: 0x00c0, 0x2896: 0x00c0, 0x2897: 0x00c0, - 0x2898: 0x00c0, 0x2899: 0x00c0, 0x289a: 0x00c0, 0x289b: 0x00c0, 0x289c: 0x00c0, 0x289d: 0x00c0, - 0x289e: 0x00c0, 0x289f: 0x00c0, 0x28a0: 0x00c0, 0x28a1: 0x00c0, 0x28a2: 0x00c0, 0x28a3: 0x00c0, - 0x28a4: 0x00c0, 0x28a5: 0x00c0, 0x28a6: 0x00c3, 0x28a7: 0x00c3, 0x28a8: 0x00c3, 0x28a9: 0x00c3, - 0x28aa: 0x00c3, 0x28ab: 0x00c3, 0x28ac: 0x00c3, 0x28ad: 0x00c3, 0x28ae: 0x0080, 0x28af: 0x0080, - 0x28b0: 0x00c0, 0x28b1: 0x00c0, 0x28b2: 0x00c0, 0x28b3: 0x00c0, 0x28b4: 0x00c0, 0x28b5: 0x00c0, - 0x28b6: 0x00c0, 0x28b7: 0x00c0, 0x28b8: 0x00c0, 0x28b9: 0x00c0, 0x28ba: 0x00c0, 0x28bb: 0x00c0, - 0x28bc: 0x00c0, 0x28bd: 0x00c0, 0x28be: 0x00c0, 0x28bf: 0x00c0, - // Block 0xa3, offset 0x28c0 - 0x28c0: 0x00c0, 0x28c1: 0x00c0, 0x28c2: 0x00c0, 0x28c3: 0x00c0, 0x28c4: 0x00c0, 0x28c5: 0x00c0, - 0x28c6: 0x00c0, 0x28c7: 0x00c3, 0x28c8: 0x00c3, 0x28c9: 0x00c3, 0x28ca: 0x00c3, 0x28cb: 0x00c3, - 0x28cc: 0x00c3, 0x28cd: 0x00c3, 0x28ce: 0x00c3, 0x28cf: 0x00c3, 0x28d0: 0x00c3, 0x28d1: 0x00c3, - 0x28d2: 0x00c0, 0x28d3: 0x00c5, - 0x28df: 0x0080, 0x28e0: 0x0040, 0x28e1: 0x0040, 0x28e2: 0x0040, 0x28e3: 0x0040, - 0x28e4: 0x0040, 0x28e5: 0x0040, 0x28e6: 0x0040, 0x28e7: 0x0040, 0x28e8: 0x0040, 0x28e9: 0x0040, - 0x28ea: 0x0040, 0x28eb: 0x0040, 0x28ec: 0x0040, 0x28ed: 0x0040, 0x28ee: 0x0040, 0x28ef: 0x0040, - 0x28f0: 0x0040, 0x28f1: 0x0040, 0x28f2: 0x0040, 0x28f3: 0x0040, 0x28f4: 0x0040, 0x28f5: 0x0040, - 0x28f6: 0x0040, 0x28f7: 0x0040, 0x28f8: 0x0040, 0x28f9: 0x0040, 0x28fa: 0x0040, 0x28fb: 0x0040, - 0x28fc: 0x0040, - // Block 0xa4, offset 0x2900 - 0x2900: 0x00c3, 0x2901: 0x00c3, 0x2902: 0x00c3, 0x2903: 0x00c0, 0x2904: 0x00c0, 0x2905: 0x00c0, - 0x2906: 0x00c0, 0x2907: 0x00c0, 0x2908: 0x00c0, 0x2909: 0x00c0, 0x290a: 0x00c0, 0x290b: 0x00c0, - 0x290c: 0x00c0, 0x290d: 0x00c0, 0x290e: 0x00c0, 0x290f: 0x00c0, 0x2910: 0x00c0, 0x2911: 0x00c0, - 0x2912: 0x00c0, 0x2913: 0x00c0, 0x2914: 0x00c0, 0x2915: 0x00c0, 0x2916: 0x00c0, 0x2917: 0x00c0, - 0x2918: 0x00c0, 0x2919: 0x00c0, 0x291a: 0x00c0, 0x291b: 0x00c0, 0x291c: 0x00c0, 0x291d: 0x00c0, - 0x291e: 0x00c0, 0x291f: 0x00c0, 0x2920: 0x00c0, 0x2921: 0x00c0, 0x2922: 0x00c0, 0x2923: 0x00c0, - 0x2924: 0x00c0, 0x2925: 0x00c0, 0x2926: 0x00c0, 0x2927: 0x00c0, 0x2928: 0x00c0, 0x2929: 0x00c0, - 0x292a: 0x00c0, 0x292b: 0x00c0, 0x292c: 0x00c0, 0x292d: 0x00c0, 0x292e: 0x00c0, 0x292f: 0x00c0, - 0x2930: 0x00c0, 0x2931: 0x00c0, 0x2932: 0x00c0, 0x2933: 0x00c3, 0x2934: 0x00c0, 0x2935: 0x00c0, - 0x2936: 0x00c3, 0x2937: 0x00c3, 0x2938: 0x00c3, 0x2939: 0x00c3, 0x293a: 0x00c0, 0x293b: 0x00c0, - 0x293c: 0x00c3, 0x293d: 0x00c0, 0x293e: 0x00c0, 0x293f: 0x00c0, - // Block 0xa5, offset 0x2940 - 0x2940: 0x00c5, 0x2941: 0x0080, 0x2942: 0x0080, 0x2943: 0x0080, 0x2944: 0x0080, 0x2945: 0x0080, - 0x2946: 0x0080, 0x2947: 0x0080, 0x2948: 0x0080, 0x2949: 0x0080, 0x294a: 0x0080, 0x294b: 0x0080, - 0x294c: 0x0080, 0x294d: 0x0080, 0x294f: 0x00c0, 0x2950: 0x00c0, 0x2951: 0x00c0, - 0x2952: 0x00c0, 0x2953: 0x00c0, 0x2954: 0x00c0, 0x2955: 0x00c0, 0x2956: 0x00c0, 0x2957: 0x00c0, - 0x2958: 0x00c0, 0x2959: 0x00c0, - 0x295e: 0x0080, 0x295f: 0x0080, 0x2960: 0x00c0, 0x2961: 0x00c0, 0x2962: 0x00c0, 0x2963: 0x00c0, - 0x2964: 0x00c0, 0x2965: 0x00c3, 0x2966: 0x00c0, 0x2967: 0x00c0, 0x2968: 0x00c0, 0x2969: 0x00c0, - 0x296a: 0x00c0, 0x296b: 0x00c0, 0x296c: 0x00c0, 0x296d: 0x00c0, 0x296e: 0x00c0, 0x296f: 0x00c0, - 0x2970: 0x00c0, 0x2971: 0x00c0, 0x2972: 0x00c0, 0x2973: 0x00c0, 0x2974: 0x00c0, 0x2975: 0x00c0, - 0x2976: 0x00c0, 0x2977: 0x00c0, 0x2978: 0x00c0, 0x2979: 0x00c0, 0x297a: 0x00c0, 0x297b: 0x00c0, - 0x297c: 0x00c0, 0x297d: 0x00c0, 0x297e: 0x00c0, - // Block 0xa6, offset 0x2980 - 0x2980: 0x00c0, 0x2981: 0x00c0, 0x2982: 0x00c0, 0x2983: 0x00c0, 0x2984: 0x00c0, 0x2985: 0x00c0, - 0x2986: 0x00c0, 0x2987: 0x00c0, 0x2988: 0x00c0, 0x2989: 0x00c0, 0x298a: 0x00c0, 0x298b: 0x00c0, - 0x298c: 0x00c0, 0x298d: 0x00c0, 0x298e: 0x00c0, 0x298f: 0x00c0, 0x2990: 0x00c0, 0x2991: 0x00c0, - 0x2992: 0x00c0, 0x2993: 0x00c0, 0x2994: 0x00c0, 0x2995: 0x00c0, 0x2996: 0x00c0, 0x2997: 0x00c0, - 0x2998: 0x00c0, 0x2999: 0x00c0, 0x299a: 0x00c0, 0x299b: 0x00c0, 0x299c: 0x00c0, 0x299d: 0x00c0, - 0x299e: 0x00c0, 0x299f: 0x00c0, 0x29a0: 0x00c0, 0x29a1: 0x00c0, 0x29a2: 0x00c0, 0x29a3: 0x00c0, - 0x29a4: 0x00c0, 0x29a5: 0x00c0, 0x29a6: 0x00c0, 0x29a7: 0x00c0, 0x29a8: 0x00c0, 0x29a9: 0x00c3, - 0x29aa: 0x00c3, 0x29ab: 0x00c3, 0x29ac: 0x00c3, 0x29ad: 0x00c3, 0x29ae: 0x00c3, 0x29af: 0x00c0, - 0x29b0: 0x00c0, 0x29b1: 0x00c3, 0x29b2: 0x00c3, 0x29b3: 0x00c0, 0x29b4: 0x00c0, 0x29b5: 0x00c3, - 0x29b6: 0x00c3, - // Block 0xa7, offset 0x29c0 - 0x29c0: 0x00c0, 0x29c1: 0x00c0, 0x29c2: 0x00c0, 0x29c3: 0x00c3, 0x29c4: 0x00c0, 0x29c5: 0x00c0, - 0x29c6: 0x00c0, 0x29c7: 0x00c0, 0x29c8: 0x00c0, 0x29c9: 0x00c0, 0x29ca: 0x00c0, 0x29cb: 0x00c0, - 0x29cc: 0x00c3, 0x29cd: 0x00c0, 0x29d0: 0x00c0, 0x29d1: 0x00c0, - 0x29d2: 0x00c0, 0x29d3: 0x00c0, 0x29d4: 0x00c0, 0x29d5: 0x00c0, 0x29d6: 0x00c0, 0x29d7: 0x00c0, - 0x29d8: 0x00c0, 0x29d9: 0x00c0, 0x29dc: 0x0080, 0x29dd: 0x0080, - 0x29de: 0x0080, 0x29df: 0x0080, 0x29e0: 0x00c0, 0x29e1: 0x00c0, 0x29e2: 0x00c0, 0x29e3: 0x00c0, - 0x29e4: 0x00c0, 0x29e5: 0x00c0, 0x29e6: 0x00c0, 0x29e7: 0x00c0, 0x29e8: 0x00c0, 0x29e9: 0x00c0, - 0x29ea: 0x00c0, 0x29eb: 0x00c0, 0x29ec: 0x00c0, 0x29ed: 0x00c0, 0x29ee: 0x00c0, 0x29ef: 0x00c0, - 0x29f0: 0x00c0, 0x29f1: 0x00c0, 0x29f2: 0x00c0, 0x29f3: 0x00c0, 0x29f4: 0x00c0, 0x29f5: 0x00c0, - 0x29f6: 0x00c0, 0x29f7: 0x0080, 0x29f8: 0x0080, 0x29f9: 0x0080, 0x29fa: 0x00c0, 0x29fb: 0x00c0, - 0x29fc: 0x00c3, 0x29fd: 0x00c0, 0x29fe: 0x00c0, 0x29ff: 0x00c0, - // Block 0xa8, offset 0x2a00 - 0x2a00: 0x00c0, 0x2a01: 0x00c0, 0x2a02: 0x00c0, 0x2a03: 0x00c0, 0x2a04: 0x00c0, 0x2a05: 0x00c0, - 0x2a06: 0x00c0, 0x2a07: 0x00c0, 0x2a08: 0x00c0, 0x2a09: 0x00c0, 0x2a0a: 0x00c0, 0x2a0b: 0x00c0, - 0x2a0c: 0x00c0, 0x2a0d: 0x00c0, 0x2a0e: 0x00c0, 0x2a0f: 0x00c0, 0x2a10: 0x00c0, 0x2a11: 0x00c0, - 0x2a12: 0x00c0, 0x2a13: 0x00c0, 0x2a14: 0x00c0, 0x2a15: 0x00c0, 0x2a16: 0x00c0, 0x2a17: 0x00c0, - 0x2a18: 0x00c0, 0x2a19: 0x00c0, 0x2a1a: 0x00c0, 0x2a1b: 0x00c0, 0x2a1c: 0x00c0, 0x2a1d: 0x00c0, - 0x2a1e: 0x00c0, 0x2a1f: 0x00c0, 0x2a20: 0x00c0, 0x2a21: 0x00c0, 0x2a22: 0x00c0, 0x2a23: 0x00c0, - 0x2a24: 0x00c0, 0x2a25: 0x00c0, 0x2a26: 0x00c0, 0x2a27: 0x00c0, 0x2a28: 0x00c0, 0x2a29: 0x00c0, - 0x2a2a: 0x00c0, 0x2a2b: 0x00c0, 0x2a2c: 0x00c0, 0x2a2d: 0x00c0, 0x2a2e: 0x00c0, 0x2a2f: 0x00c0, - 0x2a30: 0x00c3, 0x2a31: 0x00c0, 0x2a32: 0x00c3, 0x2a33: 0x00c3, 0x2a34: 0x00c3, 0x2a35: 0x00c0, - 0x2a36: 0x00c0, 0x2a37: 0x00c3, 0x2a38: 0x00c3, 0x2a39: 0x00c0, 0x2a3a: 0x00c0, 0x2a3b: 0x00c0, - 0x2a3c: 0x00c0, 0x2a3d: 0x00c0, 0x2a3e: 0x00c3, 0x2a3f: 0x00c3, - // Block 0xa9, offset 0x2a40 - 0x2a40: 0x00c0, 0x2a41: 0x00c3, 0x2a42: 0x00c0, - 0x2a5b: 0x00c0, 0x2a5c: 0x00c0, 0x2a5d: 0x00c0, - 0x2a5e: 0x0080, 0x2a5f: 0x0080, 0x2a60: 0x00c0, 0x2a61: 0x00c0, 0x2a62: 0x00c0, 0x2a63: 0x00c0, - 0x2a64: 0x00c0, 0x2a65: 0x00c0, 0x2a66: 0x00c0, 0x2a67: 0x00c0, 0x2a68: 0x00c0, 0x2a69: 0x00c0, - 0x2a6a: 0x00c0, 0x2a6b: 0x00c0, 0x2a6c: 0x00c3, 0x2a6d: 0x00c3, 0x2a6e: 0x00c0, 0x2a6f: 0x00c0, - 0x2a70: 0x0080, 0x2a71: 0x0080, 0x2a72: 0x00c0, 0x2a73: 0x00c0, 0x2a74: 0x00c0, 0x2a75: 0x00c0, - 0x2a76: 0x00c6, - // Block 0xaa, offset 0x2a80 - 0x2a81: 0x00c0, 0x2a82: 0x00c0, 0x2a83: 0x00c0, 0x2a84: 0x00c0, 0x2a85: 0x00c0, - 0x2a86: 0x00c0, 0x2a89: 0x00c0, 0x2a8a: 0x00c0, 0x2a8b: 0x00c0, - 0x2a8c: 0x00c0, 0x2a8d: 0x00c0, 0x2a8e: 0x00c0, 0x2a91: 0x00c0, - 0x2a92: 0x00c0, 0x2a93: 0x00c0, 0x2a94: 0x00c0, 0x2a95: 0x00c0, 0x2a96: 0x00c0, - 0x2aa0: 0x00c0, 0x2aa1: 0x00c0, 0x2aa2: 0x00c0, 0x2aa3: 0x00c0, - 0x2aa4: 0x00c0, 0x2aa5: 0x00c0, 0x2aa6: 0x00c0, 0x2aa8: 0x00c0, 0x2aa9: 0x00c0, - 0x2aaa: 0x00c0, 0x2aab: 0x00c0, 0x2aac: 0x00c0, 0x2aad: 0x00c0, 0x2aae: 0x00c0, - 0x2ab0: 0x00c0, 0x2ab1: 0x00c0, 0x2ab2: 0x00c0, 0x2ab3: 0x00c0, 0x2ab4: 0x00c0, 0x2ab5: 0x00c0, - 0x2ab6: 0x00c0, 0x2ab7: 0x00c0, 0x2ab8: 0x00c0, 0x2ab9: 0x00c0, 0x2aba: 0x00c0, 0x2abb: 0x00c0, - 0x2abc: 0x00c0, 0x2abd: 0x00c0, 0x2abe: 0x00c0, 0x2abf: 0x00c0, - // Block 0xab, offset 0x2ac0 - 0x2ac0: 0x00c0, 0x2ac1: 0x00c0, 0x2ac2: 0x00c0, 0x2ac3: 0x00c0, 0x2ac4: 0x00c0, 0x2ac5: 0x00c0, - 0x2ac6: 0x00c0, 0x2ac7: 0x00c0, 0x2ac8: 0x00c0, 0x2ac9: 0x00c0, 0x2aca: 0x00c0, 0x2acb: 0x00c0, - 0x2acc: 0x00c0, 0x2acd: 0x00c0, 0x2ace: 0x00c0, 0x2acf: 0x00c0, 0x2ad0: 0x00c0, 0x2ad1: 0x00c0, - 0x2ad2: 0x00c0, 0x2ad3: 0x00c0, 0x2ad4: 0x00c0, 0x2ad5: 0x00c0, 0x2ad6: 0x00c0, 0x2ad7: 0x00c0, - 0x2ad8: 0x00c0, 0x2ad9: 0x00c0, 0x2ada: 0x00c0, 0x2adb: 0x0080, 0x2adc: 0x0080, 0x2add: 0x0080, - 0x2ade: 0x0080, 0x2adf: 0x0080, 0x2ae0: 0x00c0, 0x2ae1: 0x00c0, 0x2ae2: 0x00c0, 0x2ae3: 0x00c0, - 0x2ae4: 0x00c0, 0x2ae5: 0x00c8, - 0x2af0: 0x00c0, 0x2af1: 0x00c0, 0x2af2: 0x00c0, 0x2af3: 0x00c0, 0x2af4: 0x00c0, 0x2af5: 0x00c0, - 0x2af6: 0x00c0, 0x2af7: 0x00c0, 0x2af8: 0x00c0, 0x2af9: 0x00c0, 0x2afa: 0x00c0, 0x2afb: 0x00c0, - 0x2afc: 0x00c0, 0x2afd: 0x00c0, 0x2afe: 0x00c0, 0x2aff: 0x00c0, - // Block 0xac, offset 0x2b00 - 0x2b00: 0x00c0, 0x2b01: 0x00c0, 0x2b02: 0x00c0, 0x2b03: 0x00c0, 0x2b04: 0x00c0, 0x2b05: 0x00c0, - 0x2b06: 0x00c0, 0x2b07: 0x00c0, 0x2b08: 0x00c0, 0x2b09: 0x00c0, 0x2b0a: 0x00c0, 0x2b0b: 0x00c0, - 0x2b0c: 0x00c0, 0x2b0d: 0x00c0, 0x2b0e: 0x00c0, 0x2b0f: 0x00c0, 0x2b10: 0x00c0, 0x2b11: 0x00c0, - 0x2b12: 0x00c0, 0x2b13: 0x00c0, 0x2b14: 0x00c0, 0x2b15: 0x00c0, 0x2b16: 0x00c0, 0x2b17: 0x00c0, - 0x2b18: 0x00c0, 0x2b19: 0x00c0, 0x2b1a: 0x00c0, 0x2b1b: 0x00c0, 0x2b1c: 0x00c0, 0x2b1d: 0x00c0, - 0x2b1e: 0x00c0, 0x2b1f: 0x00c0, 0x2b20: 0x00c0, 0x2b21: 0x00c0, 0x2b22: 0x00c0, 0x2b23: 0x00c0, - 0x2b24: 0x00c0, 0x2b25: 0x00c3, 0x2b26: 0x00c0, 0x2b27: 0x00c0, 0x2b28: 0x00c3, 0x2b29: 0x00c0, - 0x2b2a: 0x00c0, 0x2b2b: 0x0080, 0x2b2c: 0x00c0, 0x2b2d: 0x00c6, - 0x2b30: 0x00c0, 0x2b31: 0x00c0, 0x2b32: 0x00c0, 0x2b33: 0x00c0, 0x2b34: 0x00c0, 0x2b35: 0x00c0, - 0x2b36: 0x00c0, 0x2b37: 0x00c0, 0x2b38: 0x00c0, 0x2b39: 0x00c0, - // Block 0xad, offset 0x2b40 - 0x2b40: 0x00c0, 0x2b41: 0x00c0, 0x2b42: 0x00c0, 0x2b43: 0x00c0, 0x2b44: 0x00c0, 0x2b45: 0x00c0, - 0x2b46: 0x00c0, 0x2b47: 0x00c0, 0x2b48: 0x00c0, 0x2b49: 0x00c0, 0x2b4a: 0x00c0, 0x2b4b: 0x00c0, - 0x2b4c: 0x00c0, 0x2b4d: 0x00c0, 0x2b4e: 0x00c0, 0x2b4f: 0x00c0, 0x2b50: 0x00c0, 0x2b51: 0x00c0, - 0x2b52: 0x00c0, 0x2b53: 0x00c0, 0x2b54: 0x00c0, 0x2b55: 0x00c0, 0x2b56: 0x00c0, 0x2b57: 0x00c0, - 0x2b58: 0x00c0, 0x2b59: 0x00c0, 0x2b5a: 0x00c0, 0x2b5b: 0x00c0, 0x2b5c: 0x00c0, 0x2b5d: 0x00c0, - 0x2b5e: 0x00c0, 0x2b5f: 0x00c0, 0x2b60: 0x00c0, 0x2b61: 0x00c0, 0x2b62: 0x00c0, 0x2b63: 0x00c0, - 0x2b70: 0x0040, 0x2b71: 0x0040, 0x2b72: 0x0040, 0x2b73: 0x0040, 0x2b74: 0x0040, 0x2b75: 0x0040, - 0x2b76: 0x0040, 0x2b77: 0x0040, 0x2b78: 0x0040, 0x2b79: 0x0040, 0x2b7a: 0x0040, 0x2b7b: 0x0040, - 0x2b7c: 0x0040, 0x2b7d: 0x0040, 0x2b7e: 0x0040, 0x2b7f: 0x0040, - // Block 0xae, offset 0x2b80 - 0x2b80: 0x0040, 0x2b81: 0x0040, 0x2b82: 0x0040, 0x2b83: 0x0040, 0x2b84: 0x0040, 0x2b85: 0x0040, - 0x2b86: 0x0040, 0x2b8b: 0x0040, - 0x2b8c: 0x0040, 0x2b8d: 0x0040, 0x2b8e: 0x0040, 0x2b8f: 0x0040, 0x2b90: 0x0040, 0x2b91: 0x0040, - 0x2b92: 0x0040, 0x2b93: 0x0040, 0x2b94: 0x0040, 0x2b95: 0x0040, 0x2b96: 0x0040, 0x2b97: 0x0040, - 0x2b98: 0x0040, 0x2b99: 0x0040, 0x2b9a: 0x0040, 0x2b9b: 0x0040, 0x2b9c: 0x0040, 0x2b9d: 0x0040, - 0x2b9e: 0x0040, 0x2b9f: 0x0040, 0x2ba0: 0x0040, 0x2ba1: 0x0040, 0x2ba2: 0x0040, 0x2ba3: 0x0040, - 0x2ba4: 0x0040, 0x2ba5: 0x0040, 0x2ba6: 0x0040, 0x2ba7: 0x0040, 0x2ba8: 0x0040, 0x2ba9: 0x0040, - 0x2baa: 0x0040, 0x2bab: 0x0040, 0x2bac: 0x0040, 0x2bad: 0x0040, 0x2bae: 0x0040, 0x2baf: 0x0040, - 0x2bb0: 0x0040, 0x2bb1: 0x0040, 0x2bb2: 0x0040, 0x2bb3: 0x0040, 0x2bb4: 0x0040, 0x2bb5: 0x0040, - 0x2bb6: 0x0040, 0x2bb7: 0x0040, 0x2bb8: 0x0040, 0x2bb9: 0x0040, 0x2bba: 0x0040, 0x2bbb: 0x0040, - // Block 0xaf, offset 0x2bc0 - 0x2bc0: 0x008c, 0x2bc1: 0x008c, 0x2bc2: 0x008c, 0x2bc3: 0x008c, 0x2bc4: 0x008c, 0x2bc5: 0x008c, - 0x2bc6: 0x008c, 0x2bc7: 0x008c, 0x2bc8: 0x008c, 0x2bc9: 0x008c, 0x2bca: 0x008c, 0x2bcb: 0x008c, - 0x2bcc: 0x008c, 0x2bcd: 0x008c, 0x2bce: 0x00cc, 0x2bcf: 0x00cc, 0x2bd0: 0x008c, 0x2bd1: 0x00cc, - 0x2bd2: 0x008c, 0x2bd3: 0x00cc, 0x2bd4: 0x00cc, 0x2bd5: 0x008c, 0x2bd6: 0x008c, 0x2bd7: 0x008c, - 0x2bd8: 0x008c, 0x2bd9: 0x008c, 0x2bda: 0x008c, 0x2bdb: 0x008c, 0x2bdc: 0x008c, 0x2bdd: 0x008c, - 0x2bde: 0x008c, 0x2bdf: 0x00cc, 0x2be0: 0x008c, 0x2be1: 0x00cc, 0x2be2: 0x008c, 0x2be3: 0x00cc, - 0x2be4: 0x00cc, 0x2be5: 0x008c, 0x2be6: 0x008c, 0x2be7: 0x00cc, 0x2be8: 0x00cc, 0x2be9: 0x00cc, - 0x2bea: 0x008c, 0x2beb: 0x008c, 0x2bec: 0x008c, 0x2bed: 0x008c, 0x2bee: 0x008c, 0x2bef: 0x008c, - 0x2bf0: 0x008c, 0x2bf1: 0x008c, 0x2bf2: 0x008c, 0x2bf3: 0x008c, 0x2bf4: 0x008c, 0x2bf5: 0x008c, - 0x2bf6: 0x008c, 0x2bf7: 0x008c, 0x2bf8: 0x008c, 0x2bf9: 0x008c, 0x2bfa: 0x008c, 0x2bfb: 0x008c, - 0x2bfc: 0x008c, 0x2bfd: 0x008c, 0x2bfe: 0x008c, 0x2bff: 0x008c, - // Block 0xb0, offset 0x2c00 - 0x2c00: 0x008c, 0x2c01: 0x008c, 0x2c02: 0x008c, 0x2c03: 0x008c, 0x2c04: 0x008c, 0x2c05: 0x008c, - 0x2c06: 0x008c, 0x2c07: 0x008c, 0x2c08: 0x008c, 0x2c09: 0x008c, 0x2c0a: 0x008c, 0x2c0b: 0x008c, - 0x2c0c: 0x008c, 0x2c0d: 0x008c, 0x2c0e: 0x008c, 0x2c0f: 0x008c, 0x2c10: 0x008c, 0x2c11: 0x008c, - 0x2c12: 0x008c, 0x2c13: 0x008c, 0x2c14: 0x008c, 0x2c15: 0x008c, 0x2c16: 0x008c, 0x2c17: 0x008c, - 0x2c18: 0x008c, 0x2c19: 0x008c, 0x2c1a: 0x008c, 0x2c1b: 0x008c, 0x2c1c: 0x008c, 0x2c1d: 0x008c, - 0x2c1e: 0x008c, 0x2c1f: 0x008c, 0x2c20: 0x008c, 0x2c21: 0x008c, 0x2c22: 0x008c, 0x2c23: 0x008c, - 0x2c24: 0x008c, 0x2c25: 0x008c, 0x2c26: 0x008c, 0x2c27: 0x008c, 0x2c28: 0x008c, 0x2c29: 0x008c, - 0x2c2a: 0x008c, 0x2c2b: 0x008c, 0x2c2c: 0x008c, 0x2c2d: 0x008c, - 0x2c30: 0x008c, 0x2c31: 0x008c, 0x2c32: 0x008c, 0x2c33: 0x008c, 0x2c34: 0x008c, 0x2c35: 0x008c, - 0x2c36: 0x008c, 0x2c37: 0x008c, 0x2c38: 0x008c, 0x2c39: 0x008c, 0x2c3a: 0x008c, 0x2c3b: 0x008c, - 0x2c3c: 0x008c, 0x2c3d: 0x008c, 0x2c3e: 0x008c, 0x2c3f: 0x008c, - // Block 0xb1, offset 0x2c40 - 0x2c40: 0x008c, 0x2c41: 0x008c, 0x2c42: 0x008c, 0x2c43: 0x008c, 0x2c44: 0x008c, 0x2c45: 0x008c, - 0x2c46: 0x008c, 0x2c47: 0x008c, 0x2c48: 0x008c, 0x2c49: 0x008c, 0x2c4a: 0x008c, 0x2c4b: 0x008c, - 0x2c4c: 0x008c, 0x2c4d: 0x008c, 0x2c4e: 0x008c, 0x2c4f: 0x008c, 0x2c50: 0x008c, 0x2c51: 0x008c, - 0x2c52: 0x008c, 0x2c53: 0x008c, 0x2c54: 0x008c, 0x2c55: 0x008c, 0x2c56: 0x008c, 0x2c57: 0x008c, - 0x2c58: 0x008c, 0x2c59: 0x008c, - // Block 0xb2, offset 0x2c80 - 0x2c80: 0x0080, 0x2c81: 0x0080, 0x2c82: 0x0080, 0x2c83: 0x0080, 0x2c84: 0x0080, 0x2c85: 0x0080, - 0x2c86: 0x0080, - 0x2c93: 0x0080, 0x2c94: 0x0080, 0x2c95: 0x0080, 0x2c96: 0x0080, 0x2c97: 0x0080, - 0x2c9d: 0x008a, - 0x2c9e: 0x00cb, 0x2c9f: 0x008a, 0x2ca0: 0x008a, 0x2ca1: 0x008a, 0x2ca2: 0x008a, 0x2ca3: 0x008a, - 0x2ca4: 0x008a, 0x2ca5: 0x008a, 0x2ca6: 0x008a, 0x2ca7: 0x008a, 0x2ca8: 0x008a, 0x2ca9: 0x008a, - 0x2caa: 0x008a, 0x2cab: 0x008a, 0x2cac: 0x008a, 0x2cad: 0x008a, 0x2cae: 0x008a, 0x2caf: 0x008a, - 0x2cb0: 0x008a, 0x2cb1: 0x008a, 0x2cb2: 0x008a, 0x2cb3: 0x008a, 0x2cb4: 0x008a, 0x2cb5: 0x008a, - 0x2cb6: 0x008a, 0x2cb8: 0x008a, 0x2cb9: 0x008a, 0x2cba: 0x008a, 0x2cbb: 0x008a, - 0x2cbc: 0x008a, 0x2cbe: 0x008a, - // Block 0xb3, offset 0x2cc0 - 0x2cc0: 0x008a, 0x2cc1: 0x008a, 0x2cc3: 0x008a, 0x2cc4: 0x008a, - 0x2cc6: 0x008a, 0x2cc7: 0x008a, 0x2cc8: 0x008a, 0x2cc9: 0x008a, 0x2cca: 0x008a, 0x2ccb: 0x008a, - 0x2ccc: 0x008a, 0x2ccd: 0x008a, 0x2cce: 0x008a, 0x2ccf: 0x008a, 0x2cd0: 0x0080, 0x2cd1: 0x0080, - 0x2cd2: 0x0080, 0x2cd3: 0x0080, 0x2cd4: 0x0080, 0x2cd5: 0x0080, 0x2cd6: 0x0080, 0x2cd7: 0x0080, - 0x2cd8: 0x0080, 0x2cd9: 0x0080, 0x2cda: 0x0080, 0x2cdb: 0x0080, 0x2cdc: 0x0080, 0x2cdd: 0x0080, - 0x2cde: 0x0080, 0x2cdf: 0x0080, 0x2ce0: 0x0080, 0x2ce1: 0x0080, 0x2ce2: 0x0080, 0x2ce3: 0x0080, - 0x2ce4: 0x0080, 0x2ce5: 0x0080, 0x2ce6: 0x0080, 0x2ce7: 0x0080, 0x2ce8: 0x0080, 0x2ce9: 0x0080, - 0x2cea: 0x0080, 0x2ceb: 0x0080, 0x2cec: 0x0080, 0x2ced: 0x0080, 0x2cee: 0x0080, 0x2cef: 0x0080, - 0x2cf0: 0x0080, 0x2cf1: 0x0080, 0x2cf2: 0x0080, 0x2cf3: 0x0080, 0x2cf4: 0x0080, 0x2cf5: 0x0080, - 0x2cf6: 0x0080, 0x2cf7: 0x0080, 0x2cf8: 0x0080, 0x2cf9: 0x0080, 0x2cfa: 0x0080, 0x2cfb: 0x0080, - 0x2cfc: 0x0080, 0x2cfd: 0x0080, 0x2cfe: 0x0080, 0x2cff: 0x0080, - // Block 0xb4, offset 0x2d00 - 0x2d00: 0x0080, 0x2d01: 0x0080, - 0x2d13: 0x0080, 0x2d14: 0x0080, 0x2d15: 0x0080, 0x2d16: 0x0080, 0x2d17: 0x0080, - 0x2d18: 0x0080, 0x2d19: 0x0080, 0x2d1a: 0x0080, 0x2d1b: 0x0080, 0x2d1c: 0x0080, 0x2d1d: 0x0080, - 0x2d1e: 0x0080, 0x2d1f: 0x0080, 0x2d20: 0x0080, 0x2d21: 0x0080, 0x2d22: 0x0080, 0x2d23: 0x0080, - 0x2d24: 0x0080, 0x2d25: 0x0080, 0x2d26: 0x0080, 0x2d27: 0x0080, 0x2d28: 0x0080, 0x2d29: 0x0080, - 0x2d2a: 0x0080, 0x2d2b: 0x0080, 0x2d2c: 0x0080, 0x2d2d: 0x0080, 0x2d2e: 0x0080, 0x2d2f: 0x0080, - 0x2d30: 0x0080, 0x2d31: 0x0080, 0x2d32: 0x0080, 0x2d33: 0x0080, 0x2d34: 0x0080, 0x2d35: 0x0080, - 0x2d36: 0x0080, 0x2d37: 0x0080, 0x2d38: 0x0080, 0x2d39: 0x0080, 0x2d3a: 0x0080, 0x2d3b: 0x0080, - 0x2d3c: 0x0080, 0x2d3d: 0x0080, 0x2d3e: 0x0080, 0x2d3f: 0x0080, - // Block 0xb5, offset 0x2d40 - 0x2d50: 0x0080, 0x2d51: 0x0080, - 0x2d52: 0x0080, 0x2d53: 0x0080, 0x2d54: 0x0080, 0x2d55: 0x0080, 0x2d56: 0x0080, 0x2d57: 0x0080, - 0x2d58: 0x0080, 0x2d59: 0x0080, 0x2d5a: 0x0080, 0x2d5b: 0x0080, 0x2d5c: 0x0080, 0x2d5d: 0x0080, - 0x2d5e: 0x0080, 0x2d5f: 0x0080, 0x2d60: 0x0080, 0x2d61: 0x0080, 0x2d62: 0x0080, 0x2d63: 0x0080, - 0x2d64: 0x0080, 0x2d65: 0x0080, 0x2d66: 0x0080, 0x2d67: 0x0080, 0x2d68: 0x0080, 0x2d69: 0x0080, - 0x2d6a: 0x0080, 0x2d6b: 0x0080, 0x2d6c: 0x0080, 0x2d6d: 0x0080, 0x2d6e: 0x0080, 0x2d6f: 0x0080, - 0x2d70: 0x0080, 0x2d71: 0x0080, 0x2d72: 0x0080, 0x2d73: 0x0080, 0x2d74: 0x0080, 0x2d75: 0x0080, - 0x2d76: 0x0080, 0x2d77: 0x0080, 0x2d78: 0x0080, 0x2d79: 0x0080, 0x2d7a: 0x0080, 0x2d7b: 0x0080, - 0x2d7c: 0x0080, 0x2d7d: 0x0080, 0x2d7e: 0x0080, 0x2d7f: 0x0080, - // Block 0xb6, offset 0x2d80 - 0x2d80: 0x0080, 0x2d81: 0x0080, 0x2d82: 0x0080, 0x2d83: 0x0080, 0x2d84: 0x0080, 0x2d85: 0x0080, - 0x2d86: 0x0080, 0x2d87: 0x0080, 0x2d88: 0x0080, 0x2d89: 0x0080, 0x2d8a: 0x0080, 0x2d8b: 0x0080, - 0x2d8c: 0x0080, 0x2d8d: 0x0080, 0x2d8e: 0x0080, 0x2d8f: 0x0080, - 0x2d92: 0x0080, 0x2d93: 0x0080, 0x2d94: 0x0080, 0x2d95: 0x0080, 0x2d96: 0x0080, 0x2d97: 0x0080, - 0x2d98: 0x0080, 0x2d99: 0x0080, 0x2d9a: 0x0080, 0x2d9b: 0x0080, 0x2d9c: 0x0080, 0x2d9d: 0x0080, - 0x2d9e: 0x0080, 0x2d9f: 0x0080, 0x2da0: 0x0080, 0x2da1: 0x0080, 0x2da2: 0x0080, 0x2da3: 0x0080, - 0x2da4: 0x0080, 0x2da5: 0x0080, 0x2da6: 0x0080, 0x2da7: 0x0080, 0x2da8: 0x0080, 0x2da9: 0x0080, - 0x2daa: 0x0080, 0x2dab: 0x0080, 0x2dac: 0x0080, 0x2dad: 0x0080, 0x2dae: 0x0080, 0x2daf: 0x0080, - 0x2db0: 0x0080, 0x2db1: 0x0080, 0x2db2: 0x0080, 0x2db3: 0x0080, 0x2db4: 0x0080, 0x2db5: 0x0080, - 0x2db6: 0x0080, 0x2db7: 0x0080, 0x2db8: 0x0080, 0x2db9: 0x0080, 0x2dba: 0x0080, 0x2dbb: 0x0080, - 0x2dbc: 0x0080, 0x2dbd: 0x0080, 0x2dbe: 0x0080, 0x2dbf: 0x0080, - // Block 0xb7, offset 0x2dc0 - 0x2dc0: 0x0080, 0x2dc1: 0x0080, 0x2dc2: 0x0080, 0x2dc3: 0x0080, 0x2dc4: 0x0080, 0x2dc5: 0x0080, - 0x2dc6: 0x0080, 0x2dc7: 0x0080, - 0x2df0: 0x0080, 0x2df1: 0x0080, 0x2df2: 0x0080, 0x2df3: 0x0080, 0x2df4: 0x0080, 0x2df5: 0x0080, - 0x2df6: 0x0080, 0x2df7: 0x0080, 0x2df8: 0x0080, 0x2df9: 0x0080, 0x2dfa: 0x0080, 0x2dfb: 0x0080, - 0x2dfc: 0x0080, 0x2dfd: 0x0080, - // Block 0xb8, offset 0x2e00 - 0x2e00: 0x0040, 0x2e01: 0x0040, 0x2e02: 0x0040, 0x2e03: 0x0040, 0x2e04: 0x0040, 0x2e05: 0x0040, - 0x2e06: 0x0040, 0x2e07: 0x0040, 0x2e08: 0x0040, 0x2e09: 0x0040, 0x2e0a: 0x0040, 0x2e0b: 0x0040, - 0x2e0c: 0x0040, 0x2e0d: 0x0040, 0x2e0e: 0x0040, 0x2e0f: 0x0040, 0x2e10: 0x0080, 0x2e11: 0x0080, - 0x2e12: 0x0080, 0x2e13: 0x0080, 0x2e14: 0x0080, 0x2e15: 0x0080, 0x2e16: 0x0080, 0x2e17: 0x0080, - 0x2e18: 0x0080, 0x2e19: 0x0080, - 0x2e20: 0x00c3, 0x2e21: 0x00c3, 0x2e22: 0x00c3, 0x2e23: 0x00c3, - 0x2e24: 0x00c3, 0x2e25: 0x00c3, 0x2e26: 0x00c3, 0x2e27: 0x00c3, 0x2e28: 0x00c3, 0x2e29: 0x00c3, - 0x2e2a: 0x00c3, 0x2e2b: 0x00c3, 0x2e2c: 0x00c3, 0x2e2d: 0x00c3, 0x2e2e: 0x00c3, 0x2e2f: 0x00c3, - 0x2e30: 0x0080, 0x2e31: 0x0080, 0x2e32: 0x0080, 0x2e33: 0x0080, 0x2e34: 0x0080, 0x2e35: 0x0080, - 0x2e36: 0x0080, 0x2e37: 0x0080, 0x2e38: 0x0080, 0x2e39: 0x0080, 0x2e3a: 0x0080, 0x2e3b: 0x0080, - 0x2e3c: 0x0080, 0x2e3d: 0x0080, 0x2e3e: 0x0080, 0x2e3f: 0x0080, - // Block 0xb9, offset 0x2e40 - 0x2e40: 0x0080, 0x2e41: 0x0080, 0x2e42: 0x0080, 0x2e43: 0x0080, 0x2e44: 0x0080, 0x2e45: 0x0080, - 0x2e46: 0x0080, 0x2e47: 0x0080, 0x2e48: 0x0080, 0x2e49: 0x0080, 0x2e4a: 0x0080, 0x2e4b: 0x0080, - 0x2e4c: 0x0080, 0x2e4d: 0x0080, 0x2e4e: 0x0080, 0x2e4f: 0x0080, 0x2e50: 0x0080, 0x2e51: 0x0080, - 0x2e52: 0x0080, 0x2e54: 0x0080, 0x2e55: 0x0080, 0x2e56: 0x0080, 0x2e57: 0x0080, - 0x2e58: 0x0080, 0x2e59: 0x0080, 0x2e5a: 0x0080, 0x2e5b: 0x0080, 0x2e5c: 0x0080, 0x2e5d: 0x0080, - 0x2e5e: 0x0080, 0x2e5f: 0x0080, 0x2e60: 0x0080, 0x2e61: 0x0080, 0x2e62: 0x0080, 0x2e63: 0x0080, - 0x2e64: 0x0080, 0x2e65: 0x0080, 0x2e66: 0x0080, 0x2e68: 0x0080, 0x2e69: 0x0080, - 0x2e6a: 0x0080, 0x2e6b: 0x0080, - 0x2e70: 0x0080, 0x2e71: 0x0080, 0x2e72: 0x0080, 0x2e73: 0x00c0, 0x2e74: 0x0080, - 0x2e76: 0x0080, 0x2e77: 0x0080, 0x2e78: 0x0080, 0x2e79: 0x0080, 0x2e7a: 0x0080, 0x2e7b: 0x0080, - 0x2e7c: 0x0080, 0x2e7d: 0x0080, 0x2e7e: 0x0080, 0x2e7f: 0x0080, - // Block 0xba, offset 0x2e80 - 0x2e80: 0x0080, 0x2e81: 0x0080, 0x2e82: 0x0080, 0x2e83: 0x0080, 0x2e84: 0x0080, 0x2e85: 0x0080, - 0x2e86: 0x0080, 0x2e87: 0x0080, 0x2e88: 0x0080, 0x2e89: 0x0080, 0x2e8a: 0x0080, 0x2e8b: 0x0080, - 0x2e8c: 0x0080, 0x2e8d: 0x0080, 0x2e8e: 0x0080, 0x2e8f: 0x0080, 0x2e90: 0x0080, 0x2e91: 0x0080, - 0x2e92: 0x0080, 0x2e93: 0x0080, 0x2e94: 0x0080, 0x2e95: 0x0080, 0x2e96: 0x0080, 0x2e97: 0x0080, - 0x2e98: 0x0080, 0x2e99: 0x0080, 0x2e9a: 0x0080, 0x2e9b: 0x0080, 0x2e9c: 0x0080, 0x2e9d: 0x0080, - 0x2e9e: 0x0080, 0x2e9f: 0x0080, 0x2ea0: 0x0080, 0x2ea1: 0x0080, 0x2ea2: 0x0080, 0x2ea3: 0x0080, - 0x2ea4: 0x0080, 0x2ea5: 0x0080, 0x2ea6: 0x0080, 0x2ea7: 0x0080, 0x2ea8: 0x0080, 0x2ea9: 0x0080, - 0x2eaa: 0x0080, 0x2eab: 0x0080, 0x2eac: 0x0080, 0x2ead: 0x0080, 0x2eae: 0x0080, 0x2eaf: 0x0080, - 0x2eb0: 0x0080, 0x2eb1: 0x0080, 0x2eb2: 0x0080, 0x2eb3: 0x0080, 0x2eb4: 0x0080, 0x2eb5: 0x0080, - 0x2eb6: 0x0080, 0x2eb7: 0x0080, 0x2eb8: 0x0080, 0x2eb9: 0x0080, 0x2eba: 0x0080, 0x2ebb: 0x0080, - 0x2ebc: 0x0080, 0x2ebf: 0x0040, - // Block 0xbb, offset 0x2ec0 - 0x2ec1: 0x0080, 0x2ec2: 0x0080, 0x2ec3: 0x0080, 0x2ec4: 0x0080, 0x2ec5: 0x0080, - 0x2ec6: 0x0080, 0x2ec7: 0x0080, 0x2ec8: 0x0080, 0x2ec9: 0x0080, 0x2eca: 0x0080, 0x2ecb: 0x0080, - 0x2ecc: 0x0080, 0x2ecd: 0x0080, 0x2ece: 0x0080, 0x2ecf: 0x0080, 0x2ed0: 0x0080, 0x2ed1: 0x0080, - 0x2ed2: 0x0080, 0x2ed3: 0x0080, 0x2ed4: 0x0080, 0x2ed5: 0x0080, 0x2ed6: 0x0080, 0x2ed7: 0x0080, - 0x2ed8: 0x0080, 0x2ed9: 0x0080, 0x2eda: 0x0080, 0x2edb: 0x0080, 0x2edc: 0x0080, 0x2edd: 0x0080, - 0x2ede: 0x0080, 0x2edf: 0x0080, 0x2ee0: 0x0080, 0x2ee1: 0x0080, 0x2ee2: 0x0080, 0x2ee3: 0x0080, - 0x2ee4: 0x0080, 0x2ee5: 0x0080, 0x2ee6: 0x0080, 0x2ee7: 0x0080, 0x2ee8: 0x0080, 0x2ee9: 0x0080, - 0x2eea: 0x0080, 0x2eeb: 0x0080, 0x2eec: 0x0080, 0x2eed: 0x0080, 0x2eee: 0x0080, 0x2eef: 0x0080, - 0x2ef0: 0x0080, 0x2ef1: 0x0080, 0x2ef2: 0x0080, 0x2ef3: 0x0080, 0x2ef4: 0x0080, 0x2ef5: 0x0080, - 0x2ef6: 0x0080, 0x2ef7: 0x0080, 0x2ef8: 0x0080, 0x2ef9: 0x0080, 0x2efa: 0x0080, 0x2efb: 0x0080, - 0x2efc: 0x0080, 0x2efd: 0x0080, 0x2efe: 0x0080, 0x2eff: 0x0080, - // Block 0xbc, offset 0x2f00 - 0x2f00: 0x0080, 0x2f01: 0x0080, 0x2f02: 0x0080, 0x2f03: 0x0080, 0x2f04: 0x0080, 0x2f05: 0x0080, - 0x2f06: 0x0080, 0x2f07: 0x0080, 0x2f08: 0x0080, 0x2f09: 0x0080, 0x2f0a: 0x0080, 0x2f0b: 0x0080, - 0x2f0c: 0x0080, 0x2f0d: 0x0080, 0x2f0e: 0x0080, 0x2f0f: 0x0080, 0x2f10: 0x0080, 0x2f11: 0x0080, - 0x2f12: 0x0080, 0x2f13: 0x0080, 0x2f14: 0x0080, 0x2f15: 0x0080, 0x2f16: 0x0080, 0x2f17: 0x0080, - 0x2f18: 0x0080, 0x2f19: 0x0080, 0x2f1a: 0x0080, 0x2f1b: 0x0080, 0x2f1c: 0x0080, 0x2f1d: 0x0080, - 0x2f1e: 0x0080, 0x2f1f: 0x0080, 0x2f20: 0x0080, 0x2f21: 0x0080, 0x2f22: 0x0080, 0x2f23: 0x0080, - 0x2f24: 0x0080, 0x2f25: 0x0080, 0x2f26: 0x008c, 0x2f27: 0x008c, 0x2f28: 0x008c, 0x2f29: 0x008c, - 0x2f2a: 0x008c, 0x2f2b: 0x008c, 0x2f2c: 0x008c, 0x2f2d: 0x008c, 0x2f2e: 0x008c, 0x2f2f: 0x008c, - 0x2f30: 0x0080, 0x2f31: 0x008c, 0x2f32: 0x008c, 0x2f33: 0x008c, 0x2f34: 0x008c, 0x2f35: 0x008c, - 0x2f36: 0x008c, 0x2f37: 0x008c, 0x2f38: 0x008c, 0x2f39: 0x008c, 0x2f3a: 0x008c, 0x2f3b: 0x008c, - 0x2f3c: 0x008c, 0x2f3d: 0x008c, 0x2f3e: 0x008c, 0x2f3f: 0x008c, - // Block 0xbd, offset 0x2f40 - 0x2f40: 0x008c, 0x2f41: 0x008c, 0x2f42: 0x008c, 0x2f43: 0x008c, 0x2f44: 0x008c, 0x2f45: 0x008c, - 0x2f46: 0x008c, 0x2f47: 0x008c, 0x2f48: 0x008c, 0x2f49: 0x008c, 0x2f4a: 0x008c, 0x2f4b: 0x008c, - 0x2f4c: 0x008c, 0x2f4d: 0x008c, 0x2f4e: 0x008c, 0x2f4f: 0x008c, 0x2f50: 0x008c, 0x2f51: 0x008c, - 0x2f52: 0x008c, 0x2f53: 0x008c, 0x2f54: 0x008c, 0x2f55: 0x008c, 0x2f56: 0x008c, 0x2f57: 0x008c, - 0x2f58: 0x008c, 0x2f59: 0x008c, 0x2f5a: 0x008c, 0x2f5b: 0x008c, 0x2f5c: 0x008c, 0x2f5d: 0x008c, - 0x2f5e: 0x0080, 0x2f5f: 0x0080, 0x2f60: 0x0040, 0x2f61: 0x0080, 0x2f62: 0x0080, 0x2f63: 0x0080, - 0x2f64: 0x0080, 0x2f65: 0x0080, 0x2f66: 0x0080, 0x2f67: 0x0080, 0x2f68: 0x0080, 0x2f69: 0x0080, - 0x2f6a: 0x0080, 0x2f6b: 0x0080, 0x2f6c: 0x0080, 0x2f6d: 0x0080, 0x2f6e: 0x0080, 0x2f6f: 0x0080, - 0x2f70: 0x0080, 0x2f71: 0x0080, 0x2f72: 0x0080, 0x2f73: 0x0080, 0x2f74: 0x0080, 0x2f75: 0x0080, - 0x2f76: 0x0080, 0x2f77: 0x0080, 0x2f78: 0x0080, 0x2f79: 0x0080, 0x2f7a: 0x0080, 0x2f7b: 0x0080, - 0x2f7c: 0x0080, 0x2f7d: 0x0080, 0x2f7e: 0x0080, - // Block 0xbe, offset 0x2f80 - 0x2f82: 0x0080, 0x2f83: 0x0080, 0x2f84: 0x0080, 0x2f85: 0x0080, - 0x2f86: 0x0080, 0x2f87: 0x0080, 0x2f8a: 0x0080, 0x2f8b: 0x0080, - 0x2f8c: 0x0080, 0x2f8d: 0x0080, 0x2f8e: 0x0080, 0x2f8f: 0x0080, - 0x2f92: 0x0080, 0x2f93: 0x0080, 0x2f94: 0x0080, 0x2f95: 0x0080, 0x2f96: 0x0080, 0x2f97: 0x0080, - 0x2f9a: 0x0080, 0x2f9b: 0x0080, 0x2f9c: 0x0080, - 0x2fa0: 0x0080, 0x2fa1: 0x0080, 0x2fa2: 0x0080, 0x2fa3: 0x0080, - 0x2fa4: 0x0080, 0x2fa5: 0x0080, 0x2fa6: 0x0080, 0x2fa8: 0x0080, 0x2fa9: 0x0080, - 0x2faa: 0x0080, 0x2fab: 0x0080, 0x2fac: 0x0080, 0x2fad: 0x0080, 0x2fae: 0x0080, - 0x2fb9: 0x0040, 0x2fba: 0x0040, 0x2fbb: 0x0040, - 0x2fbc: 0x0080, 0x2fbd: 0x0080, - // Block 0xbf, offset 0x2fc0 - 0x2fc0: 0x00c0, 0x2fc1: 0x00c0, 0x2fc2: 0x00c0, 0x2fc3: 0x00c0, 0x2fc4: 0x00c0, 0x2fc5: 0x00c0, - 0x2fc6: 0x00c0, 0x2fc7: 0x00c0, 0x2fc8: 0x00c0, 0x2fc9: 0x00c0, 0x2fca: 0x00c0, 0x2fcb: 0x00c0, - 0x2fcd: 0x00c0, 0x2fce: 0x00c0, 0x2fcf: 0x00c0, 0x2fd0: 0x00c0, 0x2fd1: 0x00c0, - 0x2fd2: 0x00c0, 0x2fd3: 0x00c0, 0x2fd4: 0x00c0, 0x2fd5: 0x00c0, 0x2fd6: 0x00c0, 0x2fd7: 0x00c0, - 0x2fd8: 0x00c0, 0x2fd9: 0x00c0, 0x2fda: 0x00c0, 0x2fdb: 0x00c0, 0x2fdc: 0x00c0, 0x2fdd: 0x00c0, - 0x2fde: 0x00c0, 0x2fdf: 0x00c0, 0x2fe0: 0x00c0, 0x2fe1: 0x00c0, 0x2fe2: 0x00c0, 0x2fe3: 0x00c0, - 0x2fe4: 0x00c0, 0x2fe5: 0x00c0, 0x2fe6: 0x00c0, 0x2fe8: 0x00c0, 0x2fe9: 0x00c0, - 0x2fea: 0x00c0, 0x2feb: 0x00c0, 0x2fec: 0x00c0, 0x2fed: 0x00c0, 0x2fee: 0x00c0, 0x2fef: 0x00c0, - 0x2ff0: 0x00c0, 0x2ff1: 0x00c0, 0x2ff2: 0x00c0, 0x2ff3: 0x00c0, 0x2ff4: 0x00c0, 0x2ff5: 0x00c0, - 0x2ff6: 0x00c0, 0x2ff7: 0x00c0, 0x2ff8: 0x00c0, 0x2ff9: 0x00c0, 0x2ffa: 0x00c0, - 0x2ffc: 0x00c0, 0x2ffd: 0x00c0, 0x2fff: 0x00c0, - // Block 0xc0, offset 0x3000 - 0x3000: 0x00c0, 0x3001: 0x00c0, 0x3002: 0x00c0, 0x3003: 0x00c0, 0x3004: 0x00c0, 0x3005: 0x00c0, - 0x3006: 0x00c0, 0x3007: 0x00c0, 0x3008: 0x00c0, 0x3009: 0x00c0, 0x300a: 0x00c0, 0x300b: 0x00c0, - 0x300c: 0x00c0, 0x300d: 0x00c0, 0x3010: 0x00c0, 0x3011: 0x00c0, - 0x3012: 0x00c0, 0x3013: 0x00c0, 0x3014: 0x00c0, 0x3015: 0x00c0, 0x3016: 0x00c0, 0x3017: 0x00c0, - 0x3018: 0x00c0, 0x3019: 0x00c0, 0x301a: 0x00c0, 0x301b: 0x00c0, 0x301c: 0x00c0, 0x301d: 0x00c0, - // Block 0xc1, offset 0x3040 - 0x3040: 0x00c0, 0x3041: 0x00c0, 0x3042: 0x00c0, 0x3043: 0x00c0, 0x3044: 0x00c0, 0x3045: 0x00c0, - 0x3046: 0x00c0, 0x3047: 0x00c0, 0x3048: 0x00c0, 0x3049: 0x00c0, 0x304a: 0x00c0, 0x304b: 0x00c0, - 0x304c: 0x00c0, 0x304d: 0x00c0, 0x304e: 0x00c0, 0x304f: 0x00c0, 0x3050: 0x00c0, 0x3051: 0x00c0, - 0x3052: 0x00c0, 0x3053: 0x00c0, 0x3054: 0x00c0, 0x3055: 0x00c0, 0x3056: 0x00c0, 0x3057: 0x00c0, - 0x3058: 0x00c0, 0x3059: 0x00c0, 0x305a: 0x00c0, 0x305b: 0x00c0, 0x305c: 0x00c0, 0x305d: 0x00c0, - 0x305e: 0x00c0, 0x305f: 0x00c0, 0x3060: 0x00c0, 0x3061: 0x00c0, 0x3062: 0x00c0, 0x3063: 0x00c0, - 0x3064: 0x00c0, 0x3065: 0x00c0, 0x3066: 0x00c0, 0x3067: 0x00c0, 0x3068: 0x00c0, 0x3069: 0x00c0, - 0x306a: 0x00c0, 0x306b: 0x00c0, 0x306c: 0x00c0, 0x306d: 0x00c0, 0x306e: 0x00c0, 0x306f: 0x00c0, - 0x3070: 0x00c0, 0x3071: 0x00c0, 0x3072: 0x00c0, 0x3073: 0x00c0, 0x3074: 0x00c0, 0x3075: 0x00c0, - 0x3076: 0x00c0, 0x3077: 0x00c0, 0x3078: 0x00c0, 0x3079: 0x00c0, 0x307a: 0x00c0, - // Block 0xc2, offset 0x3080 - 0x3080: 0x0080, 0x3081: 0x0080, 0x3082: 0x0080, - 0x3087: 0x0080, 0x3088: 0x0080, 0x3089: 0x0080, 0x308a: 0x0080, 0x308b: 0x0080, - 0x308c: 0x0080, 0x308d: 0x0080, 0x308e: 0x0080, 0x308f: 0x0080, 0x3090: 0x0080, 0x3091: 0x0080, - 0x3092: 0x0080, 0x3093: 0x0080, 0x3094: 0x0080, 0x3095: 0x0080, 0x3096: 0x0080, 0x3097: 0x0080, - 0x3098: 0x0080, 0x3099: 0x0080, 0x309a: 0x0080, 0x309b: 0x0080, 0x309c: 0x0080, 0x309d: 0x0080, - 0x309e: 0x0080, 0x309f: 0x0080, 0x30a0: 0x0080, 0x30a1: 0x0080, 0x30a2: 0x0080, 0x30a3: 0x0080, - 0x30a4: 0x0080, 0x30a5: 0x0080, 0x30a6: 0x0080, 0x30a7: 0x0080, 0x30a8: 0x0080, 0x30a9: 0x0080, - 0x30aa: 0x0080, 0x30ab: 0x0080, 0x30ac: 0x0080, 0x30ad: 0x0080, 0x30ae: 0x0080, 0x30af: 0x0080, - 0x30b0: 0x0080, 0x30b1: 0x0080, 0x30b2: 0x0080, 0x30b3: 0x0080, - 0x30b7: 0x0080, 0x30b8: 0x0080, 0x30b9: 0x0080, 0x30ba: 0x0080, 0x30bb: 0x0080, - 0x30bc: 0x0080, 0x30bd: 0x0080, 0x30be: 0x0080, 0x30bf: 0x0080, - // Block 0xc3, offset 0x30c0 - 0x30c0: 0x0088, 0x30c1: 0x0088, 0x30c2: 0x0088, 0x30c3: 0x0088, 0x30c4: 0x0088, 0x30c5: 0x0088, - 0x30c6: 0x0088, 0x30c7: 0x0088, 0x30c8: 0x0088, 0x30c9: 0x0088, 0x30ca: 0x0088, 0x30cb: 0x0088, - 0x30cc: 0x0088, 0x30cd: 0x0088, 0x30ce: 0x0088, 0x30cf: 0x0088, 0x30d0: 0x0088, 0x30d1: 0x0088, - 0x30d2: 0x0088, 0x30d3: 0x0088, 0x30d4: 0x0088, 0x30d5: 0x0088, 0x30d6: 0x0088, 0x30d7: 0x0088, - 0x30d8: 0x0088, 0x30d9: 0x0088, 0x30da: 0x0088, 0x30db: 0x0088, 0x30dc: 0x0088, 0x30dd: 0x0088, - 0x30de: 0x0088, 0x30df: 0x0088, 0x30e0: 0x0088, 0x30e1: 0x0088, 0x30e2: 0x0088, 0x30e3: 0x0088, - 0x30e4: 0x0088, 0x30e5: 0x0088, 0x30e6: 0x0088, 0x30e7: 0x0088, 0x30e8: 0x0088, 0x30e9: 0x0088, - 0x30ea: 0x0088, 0x30eb: 0x0088, 0x30ec: 0x0088, 0x30ed: 0x0088, 0x30ee: 0x0088, 0x30ef: 0x0088, - 0x30f0: 0x0088, 0x30f1: 0x0088, 0x30f2: 0x0088, 0x30f3: 0x0088, 0x30f4: 0x0088, 0x30f5: 0x0088, - 0x30f6: 0x0088, 0x30f7: 0x0088, 0x30f8: 0x0088, 0x30f9: 0x0088, 0x30fa: 0x0088, 0x30fb: 0x0088, - 0x30fc: 0x0088, 0x30fd: 0x0088, 0x30fe: 0x0088, 0x30ff: 0x0088, - // Block 0xc4, offset 0x3100 - 0x3100: 0x0088, 0x3101: 0x0088, 0x3102: 0x0088, 0x3103: 0x0088, 0x3104: 0x0088, 0x3105: 0x0088, - 0x3106: 0x0088, 0x3107: 0x0088, 0x3108: 0x0088, 0x3109: 0x0088, 0x310a: 0x0088, 0x310b: 0x0088, - 0x310c: 0x0088, 0x310d: 0x0088, 0x310e: 0x0088, 0x3110: 0x0080, 0x3111: 0x0080, - 0x3112: 0x0080, 0x3113: 0x0080, 0x3114: 0x0080, 0x3115: 0x0080, 0x3116: 0x0080, 0x3117: 0x0080, - 0x3118: 0x0080, 0x3119: 0x0080, 0x311a: 0x0080, 0x311b: 0x0080, - 0x3120: 0x0088, - // Block 0xc5, offset 0x3140 - 0x3150: 0x0080, 0x3151: 0x0080, - 0x3152: 0x0080, 0x3153: 0x0080, 0x3154: 0x0080, 0x3155: 0x0080, 0x3156: 0x0080, 0x3157: 0x0080, - 0x3158: 0x0080, 0x3159: 0x0080, 0x315a: 0x0080, 0x315b: 0x0080, 0x315c: 0x0080, 0x315d: 0x0080, - 0x315e: 0x0080, 0x315f: 0x0080, 0x3160: 0x0080, 0x3161: 0x0080, 0x3162: 0x0080, 0x3163: 0x0080, - 0x3164: 0x0080, 0x3165: 0x0080, 0x3166: 0x0080, 0x3167: 0x0080, 0x3168: 0x0080, 0x3169: 0x0080, - 0x316a: 0x0080, 0x316b: 0x0080, 0x316c: 0x0080, 0x316d: 0x0080, 0x316e: 0x0080, 0x316f: 0x0080, - 0x3170: 0x0080, 0x3171: 0x0080, 0x3172: 0x0080, 0x3173: 0x0080, 0x3174: 0x0080, 0x3175: 0x0080, - 0x3176: 0x0080, 0x3177: 0x0080, 0x3178: 0x0080, 0x3179: 0x0080, 0x317a: 0x0080, 0x317b: 0x0080, - 0x317c: 0x0080, 0x317d: 0x00c3, - // Block 0xc6, offset 0x3180 - 0x3180: 0x00c0, 0x3181: 0x00c0, 0x3182: 0x00c0, 0x3183: 0x00c0, 0x3184: 0x00c0, 0x3185: 0x00c0, - 0x3186: 0x00c0, 0x3187: 0x00c0, 0x3188: 0x00c0, 0x3189: 0x00c0, 0x318a: 0x00c0, 0x318b: 0x00c0, - 0x318c: 0x00c0, 0x318d: 0x00c0, 0x318e: 0x00c0, 0x318f: 0x00c0, 0x3190: 0x00c0, 0x3191: 0x00c0, - 0x3192: 0x00c0, 0x3193: 0x00c0, 0x3194: 0x00c0, 0x3195: 0x00c0, 0x3196: 0x00c0, 0x3197: 0x00c0, - 0x3198: 0x00c0, 0x3199: 0x00c0, 0x319a: 0x00c0, 0x319b: 0x00c0, 0x319c: 0x00c0, - 0x31a0: 0x00c0, 0x31a1: 0x00c0, 0x31a2: 0x00c0, 0x31a3: 0x00c0, - 0x31a4: 0x00c0, 0x31a5: 0x00c0, 0x31a6: 0x00c0, 0x31a7: 0x00c0, 0x31a8: 0x00c0, 0x31a9: 0x00c0, - 0x31aa: 0x00c0, 0x31ab: 0x00c0, 0x31ac: 0x00c0, 0x31ad: 0x00c0, 0x31ae: 0x00c0, 0x31af: 0x00c0, - 0x31b0: 0x00c0, 0x31b1: 0x00c0, 0x31b2: 0x00c0, 0x31b3: 0x00c0, 0x31b4: 0x00c0, 0x31b5: 0x00c0, - 0x31b6: 0x00c0, 0x31b7: 0x00c0, 0x31b8: 0x00c0, 0x31b9: 0x00c0, 0x31ba: 0x00c0, 0x31bb: 0x00c0, - 0x31bc: 0x00c0, 0x31bd: 0x00c0, 0x31be: 0x00c0, 0x31bf: 0x00c0, - // Block 0xc7, offset 0x31c0 - 0x31c0: 0x00c0, 0x31c1: 0x00c0, 0x31c2: 0x00c0, 0x31c3: 0x00c0, 0x31c4: 0x00c0, 0x31c5: 0x00c0, - 0x31c6: 0x00c0, 0x31c7: 0x00c0, 0x31c8: 0x00c0, 0x31c9: 0x00c0, 0x31ca: 0x00c0, 0x31cb: 0x00c0, - 0x31cc: 0x00c0, 0x31cd: 0x00c0, 0x31ce: 0x00c0, 0x31cf: 0x00c0, 0x31d0: 0x00c0, - 0x31e0: 0x00c3, 0x31e1: 0x0080, 0x31e2: 0x0080, 0x31e3: 0x0080, - 0x31e4: 0x0080, 0x31e5: 0x0080, 0x31e6: 0x0080, 0x31e7: 0x0080, 0x31e8: 0x0080, 0x31e9: 0x0080, - 0x31ea: 0x0080, 0x31eb: 0x0080, 0x31ec: 0x0080, 0x31ed: 0x0080, 0x31ee: 0x0080, 0x31ef: 0x0080, - 0x31f0: 0x0080, 0x31f1: 0x0080, 0x31f2: 0x0080, 0x31f3: 0x0080, 0x31f4: 0x0080, 0x31f5: 0x0080, - 0x31f6: 0x0080, 0x31f7: 0x0080, 0x31f8: 0x0080, 0x31f9: 0x0080, 0x31fa: 0x0080, 0x31fb: 0x0080, - // Block 0xc8, offset 0x3200 - 0x3200: 0x00c0, 0x3201: 0x00c0, 0x3202: 0x00c0, 0x3203: 0x00c0, 0x3204: 0x00c0, 0x3205: 0x00c0, - 0x3206: 0x00c0, 0x3207: 0x00c0, 0x3208: 0x00c0, 0x3209: 0x00c0, 0x320a: 0x00c0, 0x320b: 0x00c0, - 0x320c: 0x00c0, 0x320d: 0x00c0, 0x320e: 0x00c0, 0x320f: 0x00c0, 0x3210: 0x00c0, 0x3211: 0x00c0, - 0x3212: 0x00c0, 0x3213: 0x00c0, 0x3214: 0x00c0, 0x3215: 0x00c0, 0x3216: 0x00c0, 0x3217: 0x00c0, - 0x3218: 0x00c0, 0x3219: 0x00c0, 0x321a: 0x00c0, 0x321b: 0x00c0, 0x321c: 0x00c0, 0x321d: 0x00c0, - 0x321e: 0x00c0, 0x321f: 0x00c0, 0x3220: 0x0080, 0x3221: 0x0080, 0x3222: 0x0080, 0x3223: 0x0080, - 0x3230: 0x00c0, 0x3231: 0x00c0, 0x3232: 0x00c0, 0x3233: 0x00c0, 0x3234: 0x00c0, 0x3235: 0x00c0, - 0x3236: 0x00c0, 0x3237: 0x00c0, 0x3238: 0x00c0, 0x3239: 0x00c0, 0x323a: 0x00c0, 0x323b: 0x00c0, - 0x323c: 0x00c0, 0x323d: 0x00c0, 0x323e: 0x00c0, 0x323f: 0x00c0, - // Block 0xc9, offset 0x3240 - 0x3240: 0x00c0, 0x3241: 0x0080, 0x3242: 0x00c0, 0x3243: 0x00c0, 0x3244: 0x00c0, 0x3245: 0x00c0, - 0x3246: 0x00c0, 0x3247: 0x00c0, 0x3248: 0x00c0, 0x3249: 0x00c0, 0x324a: 0x0080, - 0x3250: 0x00c0, 0x3251: 0x00c0, - 0x3252: 0x00c0, 0x3253: 0x00c0, 0x3254: 0x00c0, 0x3255: 0x00c0, 0x3256: 0x00c0, 0x3257: 0x00c0, - 0x3258: 0x00c0, 0x3259: 0x00c0, 0x325a: 0x00c0, 0x325b: 0x00c0, 0x325c: 0x00c0, 0x325d: 0x00c0, - 0x325e: 0x00c0, 0x325f: 0x00c0, 0x3260: 0x00c0, 0x3261: 0x00c0, 0x3262: 0x00c0, 0x3263: 0x00c0, - 0x3264: 0x00c0, 0x3265: 0x00c0, 0x3266: 0x00c0, 0x3267: 0x00c0, 0x3268: 0x00c0, 0x3269: 0x00c0, - 0x326a: 0x00c0, 0x326b: 0x00c0, 0x326c: 0x00c0, 0x326d: 0x00c0, 0x326e: 0x00c0, 0x326f: 0x00c0, - 0x3270: 0x00c0, 0x3271: 0x00c0, 0x3272: 0x00c0, 0x3273: 0x00c0, 0x3274: 0x00c0, 0x3275: 0x00c0, - 0x3276: 0x00c3, 0x3277: 0x00c3, 0x3278: 0x00c3, 0x3279: 0x00c3, 0x327a: 0x00c3, - // Block 0xca, offset 0x3280 - 0x3280: 0x00c0, 0x3281: 0x00c0, 0x3282: 0x00c0, 0x3283: 0x00c0, 0x3284: 0x00c0, 0x3285: 0x00c0, - 0x3286: 0x00c0, 0x3287: 0x00c0, 0x3288: 0x00c0, 0x3289: 0x00c0, 0x328a: 0x00c0, 0x328b: 0x00c0, - 0x328c: 0x00c0, 0x328d: 0x00c0, 0x328e: 0x00c0, 0x328f: 0x00c0, 0x3290: 0x00c0, 0x3291: 0x00c0, - 0x3292: 0x00c0, 0x3293: 0x00c0, 0x3294: 0x00c0, 0x3295: 0x00c0, 0x3296: 0x00c0, 0x3297: 0x00c0, - 0x3298: 0x00c0, 0x3299: 0x00c0, 0x329a: 0x00c0, 0x329b: 0x00c0, 0x329c: 0x00c0, 0x329d: 0x00c0, - 0x329f: 0x0080, 0x32a0: 0x00c0, 0x32a1: 0x00c0, 0x32a2: 0x00c0, 0x32a3: 0x00c0, - 0x32a4: 0x00c0, 0x32a5: 0x00c0, 0x32a6: 0x00c0, 0x32a7: 0x00c0, 0x32a8: 0x00c0, 0x32a9: 0x00c0, - 0x32aa: 0x00c0, 0x32ab: 0x00c0, 0x32ac: 0x00c0, 0x32ad: 0x00c0, 0x32ae: 0x00c0, 0x32af: 0x00c0, - 0x32b0: 0x00c0, 0x32b1: 0x00c0, 0x32b2: 0x00c0, 0x32b3: 0x00c0, 0x32b4: 0x00c0, 0x32b5: 0x00c0, - 0x32b6: 0x00c0, 0x32b7: 0x00c0, 0x32b8: 0x00c0, 0x32b9: 0x00c0, 0x32ba: 0x00c0, 0x32bb: 0x00c0, - 0x32bc: 0x00c0, 0x32bd: 0x00c0, 0x32be: 0x00c0, 0x32bf: 0x00c0, - // Block 0xcb, offset 0x32c0 - 0x32c0: 0x00c0, 0x32c1: 0x00c0, 0x32c2: 0x00c0, 0x32c3: 0x00c0, - 0x32c8: 0x00c0, 0x32c9: 0x00c0, 0x32ca: 0x00c0, 0x32cb: 0x00c0, - 0x32cc: 0x00c0, 0x32cd: 0x00c0, 0x32ce: 0x00c0, 0x32cf: 0x00c0, 0x32d0: 0x0080, 0x32d1: 0x0080, - 0x32d2: 0x0080, 0x32d3: 0x0080, 0x32d4: 0x0080, 0x32d5: 0x0080, - // Block 0xcc, offset 0x3300 - 0x3300: 0x00c0, 0x3301: 0x00c0, 0x3302: 0x00c0, 0x3303: 0x00c0, 0x3304: 0x00c0, 0x3305: 0x00c0, - 0x3306: 0x00c0, 0x3307: 0x00c0, 0x3308: 0x00c0, 0x3309: 0x00c0, 0x330a: 0x00c0, 0x330b: 0x00c0, - 0x330c: 0x00c0, 0x330d: 0x00c0, 0x330e: 0x00c0, 0x330f: 0x00c0, 0x3310: 0x00c0, 0x3311: 0x00c0, - 0x3312: 0x00c0, 0x3313: 0x00c0, 0x3314: 0x00c0, 0x3315: 0x00c0, 0x3316: 0x00c0, 0x3317: 0x00c0, - 0x3318: 0x00c0, 0x3319: 0x00c0, 0x331a: 0x00c0, 0x331b: 0x00c0, 0x331c: 0x00c0, 0x331d: 0x00c0, - 0x3320: 0x00c0, 0x3321: 0x00c0, 0x3322: 0x00c0, 0x3323: 0x00c0, - 0x3324: 0x00c0, 0x3325: 0x00c0, 0x3326: 0x00c0, 0x3327: 0x00c0, 0x3328: 0x00c0, 0x3329: 0x00c0, - 0x3330: 0x00c0, 0x3331: 0x00c0, 0x3332: 0x00c0, 0x3333: 0x00c0, 0x3334: 0x00c0, 0x3335: 0x00c0, - 0x3336: 0x00c0, 0x3337: 0x00c0, 0x3338: 0x00c0, 0x3339: 0x00c0, 0x333a: 0x00c0, 0x333b: 0x00c0, - 0x333c: 0x00c0, 0x333d: 0x00c0, 0x333e: 0x00c0, 0x333f: 0x00c0, - // Block 0xcd, offset 0x3340 - 0x3340: 0x00c0, 0x3341: 0x00c0, 0x3342: 0x00c0, 0x3343: 0x00c0, 0x3344: 0x00c0, 0x3345: 0x00c0, - 0x3346: 0x00c0, 0x3347: 0x00c0, 0x3348: 0x00c0, 0x3349: 0x00c0, 0x334a: 0x00c0, 0x334b: 0x00c0, - 0x334c: 0x00c0, 0x334d: 0x00c0, 0x334e: 0x00c0, 0x334f: 0x00c0, 0x3350: 0x00c0, 0x3351: 0x00c0, - 0x3352: 0x00c0, 0x3353: 0x00c0, - 0x3358: 0x00c0, 0x3359: 0x00c0, 0x335a: 0x00c0, 0x335b: 0x00c0, 0x335c: 0x00c0, 0x335d: 0x00c0, - 0x335e: 0x00c0, 0x335f: 0x00c0, 0x3360: 0x00c0, 0x3361: 0x00c0, 0x3362: 0x00c0, 0x3363: 0x00c0, - 0x3364: 0x00c0, 0x3365: 0x00c0, 0x3366: 0x00c0, 0x3367: 0x00c0, 0x3368: 0x00c0, 0x3369: 0x00c0, - 0x336a: 0x00c0, 0x336b: 0x00c0, 0x336c: 0x00c0, 0x336d: 0x00c0, 0x336e: 0x00c0, 0x336f: 0x00c0, - 0x3370: 0x00c0, 0x3371: 0x00c0, 0x3372: 0x00c0, 0x3373: 0x00c0, 0x3374: 0x00c0, 0x3375: 0x00c0, - 0x3376: 0x00c0, 0x3377: 0x00c0, 0x3378: 0x00c0, 0x3379: 0x00c0, 0x337a: 0x00c0, 0x337b: 0x00c0, - // Block 0xce, offset 0x3380 - 0x3380: 0x00c0, 0x3381: 0x00c0, 0x3382: 0x00c0, 0x3383: 0x00c0, 0x3384: 0x00c0, 0x3385: 0x00c0, - 0x3386: 0x00c0, 0x3387: 0x00c0, 0x3388: 0x00c0, 0x3389: 0x00c0, 0x338a: 0x00c0, 0x338b: 0x00c0, - 0x338c: 0x00c0, 0x338d: 0x00c0, 0x338e: 0x00c0, 0x338f: 0x00c0, 0x3390: 0x00c0, 0x3391: 0x00c0, - 0x3392: 0x00c0, 0x3393: 0x00c0, 0x3394: 0x00c0, 0x3395: 0x00c0, 0x3396: 0x00c0, 0x3397: 0x00c0, - 0x3398: 0x00c0, 0x3399: 0x00c0, 0x339a: 0x00c0, 0x339b: 0x00c0, 0x339c: 0x00c0, 0x339d: 0x00c0, - 0x339e: 0x00c0, 0x339f: 0x00c0, 0x33a0: 0x00c0, 0x33a1: 0x00c0, 0x33a2: 0x00c0, 0x33a3: 0x00c0, - 0x33a4: 0x00c0, 0x33a5: 0x00c0, 0x33a6: 0x00c0, 0x33a7: 0x00c0, - 0x33b0: 0x00c0, 0x33b1: 0x00c0, 0x33b2: 0x00c0, 0x33b3: 0x00c0, 0x33b4: 0x00c0, 0x33b5: 0x00c0, - 0x33b6: 0x00c0, 0x33b7: 0x00c0, 0x33b8: 0x00c0, 0x33b9: 0x00c0, 0x33ba: 0x00c0, 0x33bb: 0x00c0, - 0x33bc: 0x00c0, 0x33bd: 0x00c0, 0x33be: 0x00c0, 0x33bf: 0x00c0, - // Block 0xcf, offset 0x33c0 - 0x33c0: 0x00c0, 0x33c1: 0x00c0, 0x33c2: 0x00c0, 0x33c3: 0x00c0, 0x33c4: 0x00c0, 0x33c5: 0x00c0, - 0x33c6: 0x00c0, 0x33c7: 0x00c0, 0x33c8: 0x00c0, 0x33c9: 0x00c0, 0x33ca: 0x00c0, 0x33cb: 0x00c0, - 0x33cc: 0x00c0, 0x33cd: 0x00c0, 0x33ce: 0x00c0, 0x33cf: 0x00c0, 0x33d0: 0x00c0, 0x33d1: 0x00c0, - 0x33d2: 0x00c0, 0x33d3: 0x00c0, 0x33d4: 0x00c0, 0x33d5: 0x00c0, 0x33d6: 0x00c0, 0x33d7: 0x00c0, - 0x33d8: 0x00c0, 0x33d9: 0x00c0, 0x33da: 0x00c0, 0x33db: 0x00c0, 0x33dc: 0x00c0, 0x33dd: 0x00c0, - 0x33de: 0x00c0, 0x33df: 0x00c0, 0x33e0: 0x00c0, 0x33e1: 0x00c0, 0x33e2: 0x00c0, 0x33e3: 0x00c0, - 0x33ef: 0x0080, - // Block 0xd0, offset 0x3400 - 0x3400: 0x00c0, 0x3401: 0x00c0, 0x3402: 0x00c0, 0x3403: 0x00c0, 0x3404: 0x00c0, 0x3405: 0x00c0, - 0x3406: 0x00c0, 0x3407: 0x00c0, 0x3408: 0x00c0, 0x3409: 0x00c0, 0x340a: 0x00c0, 0x340b: 0x00c0, - 0x340c: 0x00c0, 0x340d: 0x00c0, 0x340e: 0x00c0, 0x340f: 0x00c0, 0x3410: 0x00c0, 0x3411: 0x00c0, - 0x3412: 0x00c0, 0x3413: 0x00c0, 0x3414: 0x00c0, 0x3415: 0x00c0, 0x3416: 0x00c0, 0x3417: 0x00c0, - 0x3418: 0x00c0, 0x3419: 0x00c0, 0x341a: 0x00c0, 0x341b: 0x00c0, 0x341c: 0x00c0, 0x341d: 0x00c0, - 0x341e: 0x00c0, 0x341f: 0x00c0, 0x3420: 0x00c0, 0x3421: 0x00c0, 0x3422: 0x00c0, 0x3423: 0x00c0, - 0x3424: 0x00c0, 0x3425: 0x00c0, 0x3426: 0x00c0, 0x3427: 0x00c0, 0x3428: 0x00c0, 0x3429: 0x00c0, - 0x342a: 0x00c0, 0x342b: 0x00c0, 0x342c: 0x00c0, 0x342d: 0x00c0, 0x342e: 0x00c0, 0x342f: 0x00c0, - 0x3430: 0x00c0, 0x3431: 0x00c0, 0x3432: 0x00c0, 0x3433: 0x00c0, 0x3434: 0x00c0, 0x3435: 0x00c0, - 0x3436: 0x00c0, - // Block 0xd1, offset 0x3440 - 0x3440: 0x00c0, 0x3441: 0x00c0, 0x3442: 0x00c0, 0x3443: 0x00c0, 0x3444: 0x00c0, 0x3445: 0x00c0, - 0x3446: 0x00c0, 0x3447: 0x00c0, 0x3448: 0x00c0, 0x3449: 0x00c0, 0x344a: 0x00c0, 0x344b: 0x00c0, - 0x344c: 0x00c0, 0x344d: 0x00c0, 0x344e: 0x00c0, 0x344f: 0x00c0, 0x3450: 0x00c0, 0x3451: 0x00c0, - 0x3452: 0x00c0, 0x3453: 0x00c0, 0x3454: 0x00c0, 0x3455: 0x00c0, - 0x3460: 0x00c0, 0x3461: 0x00c0, 0x3462: 0x00c0, 0x3463: 0x00c0, - 0x3464: 0x00c0, 0x3465: 0x00c0, 0x3466: 0x00c0, 0x3467: 0x00c0, - // Block 0xd2, offset 0x3480 - 0x3480: 0x00c0, 0x3481: 0x00c0, 0x3482: 0x00c0, 0x3483: 0x00c0, 0x3484: 0x00c0, 0x3485: 0x00c0, - 0x3488: 0x00c0, 0x348a: 0x00c0, 0x348b: 0x00c0, - 0x348c: 0x00c0, 0x348d: 0x00c0, 0x348e: 0x00c0, 0x348f: 0x00c0, 0x3490: 0x00c0, 0x3491: 0x00c0, - 0x3492: 0x00c0, 0x3493: 0x00c0, 0x3494: 0x00c0, 0x3495: 0x00c0, 0x3496: 0x00c0, 0x3497: 0x00c0, - 0x3498: 0x00c0, 0x3499: 0x00c0, 0x349a: 0x00c0, 0x349b: 0x00c0, 0x349c: 0x00c0, 0x349d: 0x00c0, - 0x349e: 0x00c0, 0x349f: 0x00c0, 0x34a0: 0x00c0, 0x34a1: 0x00c0, 0x34a2: 0x00c0, 0x34a3: 0x00c0, - 0x34a4: 0x00c0, 0x34a5: 0x00c0, 0x34a6: 0x00c0, 0x34a7: 0x00c0, 0x34a8: 0x00c0, 0x34a9: 0x00c0, - 0x34aa: 0x00c0, 0x34ab: 0x00c0, 0x34ac: 0x00c0, 0x34ad: 0x00c0, 0x34ae: 0x00c0, 0x34af: 0x00c0, - 0x34b0: 0x00c0, 0x34b1: 0x00c0, 0x34b2: 0x00c0, 0x34b3: 0x00c0, 0x34b4: 0x00c0, 0x34b5: 0x00c0, - 0x34b7: 0x00c0, 0x34b8: 0x00c0, - 0x34bc: 0x00c0, 0x34bf: 0x00c0, - // Block 0xd3, offset 0x34c0 - 0x34c0: 0x00c0, 0x34c1: 0x00c0, 0x34c2: 0x00c0, 0x34c3: 0x00c0, 0x34c4: 0x00c0, 0x34c5: 0x00c0, - 0x34c6: 0x00c0, 0x34c7: 0x00c0, 0x34c8: 0x00c0, 0x34c9: 0x00c0, 0x34ca: 0x00c0, 0x34cb: 0x00c0, - 0x34cc: 0x00c0, 0x34cd: 0x00c0, 0x34ce: 0x00c0, 0x34cf: 0x00c0, 0x34d0: 0x00c0, 0x34d1: 0x00c0, - 0x34d2: 0x00c0, 0x34d3: 0x00c0, 0x34d4: 0x00c0, 0x34d5: 0x00c0, 0x34d7: 0x0080, - 0x34d8: 0x0080, 0x34d9: 0x0080, 0x34da: 0x0080, 0x34db: 0x0080, 0x34dc: 0x0080, 0x34dd: 0x0080, - 0x34de: 0x0080, 0x34df: 0x0080, 0x34e0: 0x00c0, 0x34e1: 0x00c0, 0x34e2: 0x00c0, 0x34e3: 0x00c0, - 0x34e4: 0x00c0, 0x34e5: 0x00c0, 0x34e6: 0x00c0, 0x34e7: 0x00c0, 0x34e8: 0x00c0, 0x34e9: 0x00c0, - 0x34ea: 0x00c0, 0x34eb: 0x00c0, 0x34ec: 0x00c0, 0x34ed: 0x00c0, 0x34ee: 0x00c0, 0x34ef: 0x00c0, - 0x34f0: 0x00c0, 0x34f1: 0x00c0, 0x34f2: 0x00c0, 0x34f3: 0x00c0, 0x34f4: 0x00c0, 0x34f5: 0x00c0, - 0x34f6: 0x00c0, 0x34f7: 0x0080, 0x34f8: 0x0080, 0x34f9: 0x0080, 0x34fa: 0x0080, 0x34fb: 0x0080, - 0x34fc: 0x0080, 0x34fd: 0x0080, 0x34fe: 0x0080, 0x34ff: 0x0080, - // Block 0xd4, offset 0x3500 - 0x3500: 0x00c0, 0x3501: 0x00c0, 0x3502: 0x00c0, 0x3503: 0x00c0, 0x3504: 0x00c0, 0x3505: 0x00c0, - 0x3506: 0x00c0, 0x3507: 0x00c0, 0x3508: 0x00c0, 0x3509: 0x00c0, 0x350a: 0x00c0, 0x350b: 0x00c0, - 0x350c: 0x00c0, 0x350d: 0x00c0, 0x350e: 0x00c0, 0x350f: 0x00c0, 0x3510: 0x00c0, 0x3511: 0x00c0, - 0x3512: 0x00c0, 0x3513: 0x00c0, 0x3514: 0x00c0, 0x3515: 0x00c0, 0x3516: 0x00c0, 0x3517: 0x00c0, - 0x3518: 0x00c0, 0x3519: 0x00c0, 0x351a: 0x00c0, 0x351b: 0x00c0, 0x351c: 0x00c0, 0x351d: 0x00c0, - 0x351e: 0x00c0, - 0x3527: 0x0080, 0x3528: 0x0080, 0x3529: 0x0080, - 0x352a: 0x0080, 0x352b: 0x0080, 0x352c: 0x0080, 0x352d: 0x0080, 0x352e: 0x0080, 0x352f: 0x0080, - // Block 0xd5, offset 0x3540 - 0x3560: 0x00c0, 0x3561: 0x00c0, 0x3562: 0x00c0, 0x3563: 0x00c0, - 0x3564: 0x00c0, 0x3565: 0x00c0, 0x3566: 0x00c0, 0x3567: 0x00c0, 0x3568: 0x00c0, 0x3569: 0x00c0, - 0x356a: 0x00c0, 0x356b: 0x00c0, 0x356c: 0x00c0, 0x356d: 0x00c0, 0x356e: 0x00c0, 0x356f: 0x00c0, - 0x3570: 0x00c0, 0x3571: 0x00c0, 0x3572: 0x00c0, 0x3574: 0x00c0, 0x3575: 0x00c0, - 0x357b: 0x0080, - 0x357c: 0x0080, 0x357d: 0x0080, 0x357e: 0x0080, 0x357f: 0x0080, - // Block 0xd6, offset 0x3580 - 0x3580: 0x00c0, 0x3581: 0x00c0, 0x3582: 0x00c0, 0x3583: 0x00c0, 0x3584: 0x00c0, 0x3585: 0x00c0, - 0x3586: 0x00c0, 0x3587: 0x00c0, 0x3588: 0x00c0, 0x3589: 0x00c0, 0x358a: 0x00c0, 0x358b: 0x00c0, - 0x358c: 0x00c0, 0x358d: 0x00c0, 0x358e: 0x00c0, 0x358f: 0x00c0, 0x3590: 0x00c0, 0x3591: 0x00c0, - 0x3592: 0x00c0, 0x3593: 0x00c0, 0x3594: 0x00c0, 0x3595: 0x00c0, 0x3596: 0x0080, 0x3597: 0x0080, - 0x3598: 0x0080, 0x3599: 0x0080, 0x359a: 0x0080, 0x359b: 0x0080, - 0x359f: 0x0080, 0x35a0: 0x00c0, 0x35a1: 0x00c0, 0x35a2: 0x00c0, 0x35a3: 0x00c0, - 0x35a4: 0x00c0, 0x35a5: 0x00c0, 0x35a6: 0x00c0, 0x35a7: 0x00c0, 0x35a8: 0x00c0, 0x35a9: 0x00c0, - 0x35aa: 0x00c0, 0x35ab: 0x00c0, 0x35ac: 0x00c0, 0x35ad: 0x00c0, 0x35ae: 0x00c0, 0x35af: 0x00c0, - 0x35b0: 0x00c0, 0x35b1: 0x00c0, 0x35b2: 0x00c0, 0x35b3: 0x00c0, 0x35b4: 0x00c0, 0x35b5: 0x00c0, - 0x35b6: 0x00c0, 0x35b7: 0x00c0, 0x35b8: 0x00c0, 0x35b9: 0x00c0, - 0x35bf: 0x0080, - // Block 0xd7, offset 0x35c0 - 0x35c0: 0x00c0, 0x35c1: 0x00c0, 0x35c2: 0x00c0, 0x35c3: 0x00c0, 0x35c4: 0x00c0, 0x35c5: 0x00c0, - 0x35c6: 0x00c0, 0x35c7: 0x00c0, 0x35c8: 0x00c0, 0x35c9: 0x00c0, 0x35ca: 0x00c0, 0x35cb: 0x00c0, - 0x35cc: 0x00c0, 0x35cd: 0x00c0, 0x35ce: 0x00c0, 0x35cf: 0x00c0, 0x35d0: 0x00c0, 0x35d1: 0x00c0, - 0x35d2: 0x00c0, 0x35d3: 0x00c0, 0x35d4: 0x00c0, 0x35d5: 0x00c0, 0x35d6: 0x00c0, 0x35d7: 0x00c0, - 0x35d8: 0x00c0, 0x35d9: 0x00c0, 0x35da: 0x00c0, 0x35db: 0x00c0, 0x35dc: 0x00c0, 0x35dd: 0x00c0, - 0x35de: 0x00c0, 0x35df: 0x00c0, 0x35e0: 0x00c0, 0x35e1: 0x00c0, 0x35e2: 0x00c0, 0x35e3: 0x00c0, - 0x35e4: 0x00c0, 0x35e5: 0x00c0, 0x35e6: 0x00c0, 0x35e7: 0x00c0, 0x35e8: 0x00c0, 0x35e9: 0x00c0, - 0x35ea: 0x00c0, 0x35eb: 0x00c0, 0x35ec: 0x00c0, 0x35ed: 0x00c0, 0x35ee: 0x00c0, 0x35ef: 0x00c0, - 0x35f0: 0x00c0, 0x35f1: 0x00c0, 0x35f2: 0x00c0, 0x35f3: 0x00c0, 0x35f4: 0x00c0, 0x35f5: 0x00c0, - 0x35f6: 0x00c0, 0x35f7: 0x00c0, - 0x35fc: 0x0080, 0x35fd: 0x0080, 0x35fe: 0x00c0, 0x35ff: 0x00c0, - // Block 0xd8, offset 0x3600 - 0x3600: 0x00c0, 0x3601: 0x00c3, 0x3602: 0x00c3, 0x3603: 0x00c3, 0x3605: 0x00c3, - 0x3606: 0x00c3, - 0x360c: 0x00c3, 0x360d: 0x00c3, 0x360e: 0x00c3, 0x360f: 0x00c3, 0x3610: 0x00c0, 0x3611: 0x00c0, - 0x3612: 0x00c0, 0x3613: 0x00c0, 0x3615: 0x00c0, 0x3616: 0x00c0, 0x3617: 0x00c0, - 0x3619: 0x00c0, 0x361a: 0x00c0, 0x361b: 0x00c0, 0x361c: 0x00c0, 0x361d: 0x00c0, - 0x361e: 0x00c0, 0x361f: 0x00c0, 0x3620: 0x00c0, 0x3621: 0x00c0, 0x3622: 0x00c0, 0x3623: 0x00c0, - 0x3624: 0x00c0, 0x3625: 0x00c0, 0x3626: 0x00c0, 0x3627: 0x00c0, 0x3628: 0x00c0, 0x3629: 0x00c0, - 0x362a: 0x00c0, 0x362b: 0x00c0, 0x362c: 0x00c0, 0x362d: 0x00c0, 0x362e: 0x00c0, 0x362f: 0x00c0, - 0x3630: 0x00c0, 0x3631: 0x00c0, 0x3632: 0x00c0, 0x3633: 0x00c0, - 0x3638: 0x00c3, 0x3639: 0x00c3, 0x363a: 0x00c3, - 0x363f: 0x00c6, - // Block 0xd9, offset 0x3640 - 0x3640: 0x0080, 0x3641: 0x0080, 0x3642: 0x0080, 0x3643: 0x0080, 0x3644: 0x0080, 0x3645: 0x0080, - 0x3646: 0x0080, 0x3647: 0x0080, - 0x3650: 0x0080, 0x3651: 0x0080, - 0x3652: 0x0080, 0x3653: 0x0080, 0x3654: 0x0080, 0x3655: 0x0080, 0x3656: 0x0080, 0x3657: 0x0080, - 0x3658: 0x0080, - 0x3660: 0x00c0, 0x3661: 0x00c0, 0x3662: 0x00c0, 0x3663: 0x00c0, - 0x3664: 0x00c0, 0x3665: 0x00c0, 0x3666: 0x00c0, 0x3667: 0x00c0, 0x3668: 0x00c0, 0x3669: 0x00c0, - 0x366a: 0x00c0, 0x366b: 0x00c0, 0x366c: 0x00c0, 0x366d: 0x00c0, 0x366e: 0x00c0, 0x366f: 0x00c0, - 0x3670: 0x00c0, 0x3671: 0x00c0, 0x3672: 0x00c0, 0x3673: 0x00c0, 0x3674: 0x00c0, 0x3675: 0x00c0, - 0x3676: 0x00c0, 0x3677: 0x00c0, 0x3678: 0x00c0, 0x3679: 0x00c0, 0x367a: 0x00c0, 0x367b: 0x00c0, - 0x367c: 0x00c0, 0x367d: 0x0080, 0x367e: 0x0080, 0x367f: 0x0080, - // Block 0xda, offset 0x3680 - 0x3680: 0x00c0, 0x3681: 0x00c0, 0x3682: 0x00c0, 0x3683: 0x00c0, 0x3684: 0x00c0, 0x3685: 0x00c0, - 0x3686: 0x00c0, 0x3687: 0x00c0, 0x3688: 0x00c0, 0x3689: 0x00c0, 0x368a: 0x00c0, 0x368b: 0x00c0, - 0x368c: 0x00c0, 0x368d: 0x00c0, 0x368e: 0x00c0, 0x368f: 0x00c0, 0x3690: 0x00c0, 0x3691: 0x00c0, - 0x3692: 0x00c0, 0x3693: 0x00c0, 0x3694: 0x00c0, 0x3695: 0x00c0, 0x3696: 0x00c0, 0x3697: 0x00c0, - 0x3698: 0x00c0, 0x3699: 0x00c0, 0x369a: 0x00c0, 0x369b: 0x00c0, 0x369c: 0x00c0, 0x369d: 0x0080, - 0x369e: 0x0080, 0x369f: 0x0080, - // Block 0xdb, offset 0x36c0 - 0x36c0: 0x00c2, 0x36c1: 0x00c2, 0x36c2: 0x00c2, 0x36c3: 0x00c2, 0x36c4: 0x00c2, 0x36c5: 0x00c4, - 0x36c6: 0x00c0, 0x36c7: 0x00c4, 0x36c8: 0x0080, 0x36c9: 0x00c4, 0x36ca: 0x00c4, 0x36cb: 0x00c0, - 0x36cc: 0x00c0, 0x36cd: 0x00c1, 0x36ce: 0x00c4, 0x36cf: 0x00c4, 0x36d0: 0x00c4, 0x36d1: 0x00c4, - 0x36d2: 0x00c4, 0x36d3: 0x00c2, 0x36d4: 0x00c2, 0x36d5: 0x00c2, 0x36d6: 0x00c2, 0x36d7: 0x00c1, - 0x36d8: 0x00c2, 0x36d9: 0x00c2, 0x36da: 0x00c2, 0x36db: 0x00c2, 0x36dc: 0x00c2, 0x36dd: 0x00c4, - 0x36de: 0x00c2, 0x36df: 0x00c2, 0x36e0: 0x00c2, 0x36e1: 0x00c4, 0x36e2: 0x00c0, 0x36e3: 0x00c0, - 0x36e4: 0x00c4, 0x36e5: 0x00c3, 0x36e6: 0x00c3, - 0x36eb: 0x0082, 0x36ec: 0x0082, 0x36ed: 0x0082, 0x36ee: 0x0082, 0x36ef: 0x0084, - 0x36f0: 0x0080, 0x36f1: 0x0080, 0x36f2: 0x0080, 0x36f3: 0x0080, 0x36f4: 0x0080, 0x36f5: 0x0080, - 0x36f6: 0x0080, - // Block 0xdc, offset 0x3700 - 0x3700: 0x00c0, 0x3701: 0x00c0, 0x3702: 0x00c0, 0x3703: 0x00c0, 0x3704: 0x00c0, 0x3705: 0x00c0, - 0x3706: 0x00c0, 0x3707: 0x00c0, 0x3708: 0x00c0, 0x3709: 0x00c0, 0x370a: 0x00c0, 0x370b: 0x00c0, - 0x370c: 0x00c0, 0x370d: 0x00c0, 0x370e: 0x00c0, 0x370f: 0x00c0, 0x3710: 0x00c0, 0x3711: 0x00c0, - 0x3712: 0x00c0, 0x3713: 0x00c0, 0x3714: 0x00c0, 0x3715: 0x00c0, 0x3716: 0x00c0, 0x3717: 0x00c0, - 0x3718: 0x00c0, 0x3719: 0x00c0, 0x371a: 0x00c0, 0x371b: 0x00c0, 0x371c: 0x00c0, 0x371d: 0x00c0, - 0x371e: 0x00c0, 0x371f: 0x00c0, 0x3720: 0x00c0, 0x3721: 0x00c0, 0x3722: 0x00c0, 0x3723: 0x00c0, - 0x3724: 0x00c0, 0x3725: 0x00c0, 0x3726: 0x00c0, 0x3727: 0x00c0, 0x3728: 0x00c0, 0x3729: 0x00c0, - 0x372a: 0x00c0, 0x372b: 0x00c0, 0x372c: 0x00c0, 0x372d: 0x00c0, 0x372e: 0x00c0, 0x372f: 0x00c0, - 0x3730: 0x00c0, 0x3731: 0x00c0, 0x3732: 0x00c0, 0x3733: 0x00c0, 0x3734: 0x00c0, 0x3735: 0x00c0, - 0x3739: 0x0080, 0x373a: 0x0080, 0x373b: 0x0080, - 0x373c: 0x0080, 0x373d: 0x0080, 0x373e: 0x0080, 0x373f: 0x0080, - // Block 0xdd, offset 0x3740 - 0x3740: 0x00c0, 0x3741: 0x00c0, 0x3742: 0x00c0, 0x3743: 0x00c0, 0x3744: 0x00c0, 0x3745: 0x00c0, - 0x3746: 0x00c0, 0x3747: 0x00c0, 0x3748: 0x00c0, 0x3749: 0x00c0, 0x374a: 0x00c0, 0x374b: 0x00c0, - 0x374c: 0x00c0, 0x374d: 0x00c0, 0x374e: 0x00c0, 0x374f: 0x00c0, 0x3750: 0x00c0, 0x3751: 0x00c0, - 0x3752: 0x00c0, 0x3753: 0x00c0, 0x3754: 0x00c0, 0x3755: 0x00c0, - 0x3758: 0x0080, 0x3759: 0x0080, 0x375a: 0x0080, 0x375b: 0x0080, 0x375c: 0x0080, 0x375d: 0x0080, - 0x375e: 0x0080, 0x375f: 0x0080, 0x3760: 0x00c0, 0x3761: 0x00c0, 0x3762: 0x00c0, 0x3763: 0x00c0, - 0x3764: 0x00c0, 0x3765: 0x00c0, 0x3766: 0x00c0, 0x3767: 0x00c0, 0x3768: 0x00c0, 0x3769: 0x00c0, - 0x376a: 0x00c0, 0x376b: 0x00c0, 0x376c: 0x00c0, 0x376d: 0x00c0, 0x376e: 0x00c0, 0x376f: 0x00c0, - 0x3770: 0x00c0, 0x3771: 0x00c0, 0x3772: 0x00c0, - 0x3778: 0x0080, 0x3779: 0x0080, 0x377a: 0x0080, 0x377b: 0x0080, - 0x377c: 0x0080, 0x377d: 0x0080, 0x377e: 0x0080, 0x377f: 0x0080, - // Block 0xde, offset 0x3780 - 0x3780: 0x00c2, 0x3781: 0x00c4, 0x3782: 0x00c2, 0x3783: 0x00c4, 0x3784: 0x00c4, 0x3785: 0x00c4, - 0x3786: 0x00c2, 0x3787: 0x00c2, 0x3788: 0x00c2, 0x3789: 0x00c4, 0x378a: 0x00c2, 0x378b: 0x00c2, - 0x378c: 0x00c4, 0x378d: 0x00c2, 0x378e: 0x00c4, 0x378f: 0x00c4, 0x3790: 0x00c2, 0x3791: 0x00c4, - 0x3799: 0x0080, 0x379a: 0x0080, 0x379b: 0x0080, 0x379c: 0x0080, - 0x37a9: 0x0084, - 0x37aa: 0x0084, 0x37ab: 0x0084, 0x37ac: 0x0084, 0x37ad: 0x0082, 0x37ae: 0x0082, 0x37af: 0x0080, - // Block 0xdf, offset 0x37c0 - 0x37c0: 0x00c0, 0x37c1: 0x00c0, 0x37c2: 0x00c0, 0x37c3: 0x00c0, 0x37c4: 0x00c0, 0x37c5: 0x00c0, - 0x37c6: 0x00c0, 0x37c7: 0x00c0, 0x37c8: 0x00c0, 0x37c9: 0x00c0, 0x37ca: 0x00c0, 0x37cb: 0x00c0, - 0x37cc: 0x00c0, 0x37cd: 0x00c0, 0x37ce: 0x00c0, 0x37cf: 0x00c0, 0x37d0: 0x00c0, 0x37d1: 0x00c0, - 0x37d2: 0x00c0, 0x37d3: 0x00c0, 0x37d4: 0x00c0, 0x37d5: 0x00c0, 0x37d6: 0x00c0, 0x37d7: 0x00c0, - 0x37d8: 0x00c0, 0x37d9: 0x00c0, 0x37da: 0x00c0, 0x37db: 0x00c0, 0x37dc: 0x00c0, 0x37dd: 0x00c0, - 0x37de: 0x00c0, 0x37df: 0x00c0, 0x37e0: 0x00c0, 0x37e1: 0x00c0, 0x37e2: 0x00c0, 0x37e3: 0x00c0, - 0x37e4: 0x00c0, 0x37e5: 0x00c0, 0x37e6: 0x00c0, 0x37e7: 0x00c0, 0x37e8: 0x00c0, 0x37e9: 0x00c0, - 0x37ea: 0x00c0, 0x37eb: 0x00c0, 0x37ec: 0x00c0, 0x37ed: 0x00c0, 0x37ee: 0x00c0, 0x37ef: 0x00c0, - 0x37f0: 0x00c0, 0x37f1: 0x00c0, 0x37f2: 0x00c0, - // Block 0xe0, offset 0x3800 - 0x3800: 0x00c0, 0x3801: 0x00c0, 0x3802: 0x00c0, 0x3803: 0x00c0, 0x3804: 0x00c0, 0x3805: 0x00c0, - 0x3806: 0x00c0, 0x3807: 0x00c0, 0x3808: 0x00c0, 0x3809: 0x00c0, 0x380a: 0x00c0, 0x380b: 0x00c0, - 0x380c: 0x00c0, 0x380d: 0x00c0, 0x380e: 0x00c0, 0x380f: 0x00c0, 0x3810: 0x00c0, 0x3811: 0x00c0, - 0x3812: 0x00c0, 0x3813: 0x00c0, 0x3814: 0x00c0, 0x3815: 0x00c0, 0x3816: 0x00c0, 0x3817: 0x00c0, - 0x3818: 0x00c0, 0x3819: 0x00c0, 0x381a: 0x00c0, 0x381b: 0x00c0, 0x381c: 0x00c0, 0x381d: 0x00c0, - 0x381e: 0x00c0, 0x381f: 0x00c0, 0x3820: 0x00c0, 0x3821: 0x00c0, 0x3822: 0x00c0, 0x3823: 0x00c0, - 0x3824: 0x00c0, 0x3825: 0x00c0, 0x3826: 0x00c0, 0x3827: 0x00c0, 0x3828: 0x00c0, 0x3829: 0x00c0, - 0x382a: 0x00c0, 0x382b: 0x00c0, 0x382c: 0x00c0, 0x382d: 0x00c0, 0x382e: 0x00c0, 0x382f: 0x00c0, - 0x3830: 0x00c0, 0x3831: 0x00c0, 0x3832: 0x00c0, - 0x383a: 0x0080, 0x383b: 0x0080, - 0x383c: 0x0080, 0x383d: 0x0080, 0x383e: 0x0080, 0x383f: 0x0080, - // Block 0xe1, offset 0x3840 - 0x3860: 0x0080, 0x3861: 0x0080, 0x3862: 0x0080, 0x3863: 0x0080, - 0x3864: 0x0080, 0x3865: 0x0080, 0x3866: 0x0080, 0x3867: 0x0080, 0x3868: 0x0080, 0x3869: 0x0080, - 0x386a: 0x0080, 0x386b: 0x0080, 0x386c: 0x0080, 0x386d: 0x0080, 0x386e: 0x0080, 0x386f: 0x0080, - 0x3870: 0x0080, 0x3871: 0x0080, 0x3872: 0x0080, 0x3873: 0x0080, 0x3874: 0x0080, 0x3875: 0x0080, - 0x3876: 0x0080, 0x3877: 0x0080, 0x3878: 0x0080, 0x3879: 0x0080, 0x387a: 0x0080, 0x387b: 0x0080, - 0x387c: 0x0080, 0x387d: 0x0080, 0x387e: 0x0080, - // Block 0xe2, offset 0x3880 - 0x3880: 0x00c0, 0x3881: 0x00c3, 0x3882: 0x00c0, 0x3883: 0x00c0, 0x3884: 0x00c0, 0x3885: 0x00c0, - 0x3886: 0x00c0, 0x3887: 0x00c0, 0x3888: 0x00c0, 0x3889: 0x00c0, 0x388a: 0x00c0, 0x388b: 0x00c0, - 0x388c: 0x00c0, 0x388d: 0x00c0, 0x388e: 0x00c0, 0x388f: 0x00c0, 0x3890: 0x00c0, 0x3891: 0x00c0, - 0x3892: 0x00c0, 0x3893: 0x00c0, 0x3894: 0x00c0, 0x3895: 0x00c0, 0x3896: 0x00c0, 0x3897: 0x00c0, - 0x3898: 0x00c0, 0x3899: 0x00c0, 0x389a: 0x00c0, 0x389b: 0x00c0, 0x389c: 0x00c0, 0x389d: 0x00c0, - 0x389e: 0x00c0, 0x389f: 0x00c0, 0x38a0: 0x00c0, 0x38a1: 0x00c0, 0x38a2: 0x00c0, 0x38a3: 0x00c0, - 0x38a4: 0x00c0, 0x38a5: 0x00c0, 0x38a6: 0x00c0, 0x38a7: 0x00c0, 0x38a8: 0x00c0, 0x38a9: 0x00c0, - 0x38aa: 0x00c0, 0x38ab: 0x00c0, 0x38ac: 0x00c0, 0x38ad: 0x00c0, 0x38ae: 0x00c0, 0x38af: 0x00c0, - 0x38b0: 0x00c0, 0x38b1: 0x00c0, 0x38b2: 0x00c0, 0x38b3: 0x00c0, 0x38b4: 0x00c0, 0x38b5: 0x00c0, - 0x38b6: 0x00c0, 0x38b7: 0x00c0, 0x38b8: 0x00c3, 0x38b9: 0x00c3, 0x38ba: 0x00c3, 0x38bb: 0x00c3, - 0x38bc: 0x00c3, 0x38bd: 0x00c3, 0x38be: 0x00c3, 0x38bf: 0x00c3, - // Block 0xe3, offset 0x38c0 - 0x38c0: 0x00c3, 0x38c1: 0x00c3, 0x38c2: 0x00c3, 0x38c3: 0x00c3, 0x38c4: 0x00c3, 0x38c5: 0x00c3, - 0x38c6: 0x00c6, 0x38c7: 0x0080, 0x38c8: 0x0080, 0x38c9: 0x0080, 0x38ca: 0x0080, 0x38cb: 0x0080, - 0x38cc: 0x0080, 0x38cd: 0x0080, - 0x38d2: 0x0080, 0x38d3: 0x0080, 0x38d4: 0x0080, 0x38d5: 0x0080, 0x38d6: 0x0080, 0x38d7: 0x0080, - 0x38d8: 0x0080, 0x38d9: 0x0080, 0x38da: 0x0080, 0x38db: 0x0080, 0x38dc: 0x0080, 0x38dd: 0x0080, - 0x38de: 0x0080, 0x38df: 0x0080, 0x38e0: 0x0080, 0x38e1: 0x0080, 0x38e2: 0x0080, 0x38e3: 0x0080, - 0x38e4: 0x0080, 0x38e5: 0x0080, 0x38e6: 0x00c0, 0x38e7: 0x00c0, 0x38e8: 0x00c0, 0x38e9: 0x00c0, - 0x38ea: 0x00c0, 0x38eb: 0x00c0, 0x38ec: 0x00c0, 0x38ed: 0x00c0, 0x38ee: 0x00c0, 0x38ef: 0x00c0, - 0x38ff: 0x00c6, - // Block 0xe4, offset 0x3900 - 0x3900: 0x00c3, 0x3901: 0x00c3, 0x3902: 0x00c0, 0x3903: 0x00c0, 0x3904: 0x00c0, 0x3905: 0x00c0, - 0x3906: 0x00c0, 0x3907: 0x00c0, 0x3908: 0x00c0, 0x3909: 0x00c0, 0x390a: 0x00c0, 0x390b: 0x00c0, - 0x390c: 0x00c0, 0x390d: 0x00c0, 0x390e: 0x00c0, 0x390f: 0x00c0, 0x3910: 0x00c0, 0x3911: 0x00c0, - 0x3912: 0x00c0, 0x3913: 0x00c0, 0x3914: 0x00c0, 0x3915: 0x00c0, 0x3916: 0x00c0, 0x3917: 0x00c0, - 0x3918: 0x00c0, 0x3919: 0x00c0, 0x391a: 0x00c0, 0x391b: 0x00c0, 0x391c: 0x00c0, 0x391d: 0x00c0, - 0x391e: 0x00c0, 0x391f: 0x00c0, 0x3920: 0x00c0, 0x3921: 0x00c0, 0x3922: 0x00c0, 0x3923: 0x00c0, - 0x3924: 0x00c0, 0x3925: 0x00c0, 0x3926: 0x00c0, 0x3927: 0x00c0, 0x3928: 0x00c0, 0x3929: 0x00c0, - 0x392a: 0x00c0, 0x392b: 0x00c0, 0x392c: 0x00c0, 0x392d: 0x00c0, 0x392e: 0x00c0, 0x392f: 0x00c0, - 0x3930: 0x00c0, 0x3931: 0x00c0, 0x3932: 0x00c0, 0x3933: 0x00c3, 0x3934: 0x00c3, 0x3935: 0x00c3, - 0x3936: 0x00c3, 0x3937: 0x00c0, 0x3938: 0x00c0, 0x3939: 0x00c6, 0x393a: 0x00c3, 0x393b: 0x0080, - 0x393c: 0x0080, 0x393d: 0x0040, 0x393e: 0x0080, 0x393f: 0x0080, - // Block 0xe5, offset 0x3940 - 0x3940: 0x0080, 0x3941: 0x0080, - 0x3950: 0x00c0, 0x3951: 0x00c0, - 0x3952: 0x00c0, 0x3953: 0x00c0, 0x3954: 0x00c0, 0x3955: 0x00c0, 0x3956: 0x00c0, 0x3957: 0x00c0, - 0x3958: 0x00c0, 0x3959: 0x00c0, 0x395a: 0x00c0, 0x395b: 0x00c0, 0x395c: 0x00c0, 0x395d: 0x00c0, - 0x395e: 0x00c0, 0x395f: 0x00c0, 0x3960: 0x00c0, 0x3961: 0x00c0, 0x3962: 0x00c0, 0x3963: 0x00c0, - 0x3964: 0x00c0, 0x3965: 0x00c0, 0x3966: 0x00c0, 0x3967: 0x00c0, 0x3968: 0x00c0, - 0x3970: 0x00c0, 0x3971: 0x00c0, 0x3972: 0x00c0, 0x3973: 0x00c0, 0x3974: 0x00c0, 0x3975: 0x00c0, - 0x3976: 0x00c0, 0x3977: 0x00c0, 0x3978: 0x00c0, 0x3979: 0x00c0, - // Block 0xe6, offset 0x3980 - 0x3980: 0x00c3, 0x3981: 0x00c3, 0x3982: 0x00c3, 0x3983: 0x00c0, 0x3984: 0x00c0, 0x3985: 0x00c0, - 0x3986: 0x00c0, 0x3987: 0x00c0, 0x3988: 0x00c0, 0x3989: 0x00c0, 0x398a: 0x00c0, 0x398b: 0x00c0, - 0x398c: 0x00c0, 0x398d: 0x00c0, 0x398e: 0x00c0, 0x398f: 0x00c0, 0x3990: 0x00c0, 0x3991: 0x00c0, - 0x3992: 0x00c0, 0x3993: 0x00c0, 0x3994: 0x00c0, 0x3995: 0x00c0, 0x3996: 0x00c0, 0x3997: 0x00c0, - 0x3998: 0x00c0, 0x3999: 0x00c0, 0x399a: 0x00c0, 0x399b: 0x00c0, 0x399c: 0x00c0, 0x399d: 0x00c0, - 0x399e: 0x00c0, 0x399f: 0x00c0, 0x39a0: 0x00c0, 0x39a1: 0x00c0, 0x39a2: 0x00c0, 0x39a3: 0x00c0, - 0x39a4: 0x00c0, 0x39a5: 0x00c0, 0x39a6: 0x00c0, 0x39a7: 0x00c3, 0x39a8: 0x00c3, 0x39a9: 0x00c3, - 0x39aa: 0x00c3, 0x39ab: 0x00c3, 0x39ac: 0x00c0, 0x39ad: 0x00c3, 0x39ae: 0x00c3, 0x39af: 0x00c3, - 0x39b0: 0x00c3, 0x39b1: 0x00c3, 0x39b2: 0x00c3, 0x39b3: 0x00c6, 0x39b4: 0x00c6, - 0x39b6: 0x00c0, 0x39b7: 0x00c0, 0x39b8: 0x00c0, 0x39b9: 0x00c0, 0x39ba: 0x00c0, 0x39bb: 0x00c0, - 0x39bc: 0x00c0, 0x39bd: 0x00c0, 0x39be: 0x00c0, 0x39bf: 0x00c0, - // Block 0xe7, offset 0x39c0 - 0x39c0: 0x0080, 0x39c1: 0x0080, 0x39c2: 0x0080, 0x39c3: 0x0080, - 0x39d0: 0x00c0, 0x39d1: 0x00c0, - 0x39d2: 0x00c0, 0x39d3: 0x00c0, 0x39d4: 0x00c0, 0x39d5: 0x00c0, 0x39d6: 0x00c0, 0x39d7: 0x00c0, - 0x39d8: 0x00c0, 0x39d9: 0x00c0, 0x39da: 0x00c0, 0x39db: 0x00c0, 0x39dc: 0x00c0, 0x39dd: 0x00c0, - 0x39de: 0x00c0, 0x39df: 0x00c0, 0x39e0: 0x00c0, 0x39e1: 0x00c0, 0x39e2: 0x00c0, 0x39e3: 0x00c0, - 0x39e4: 0x00c0, 0x39e5: 0x00c0, 0x39e6: 0x00c0, 0x39e7: 0x00c0, 0x39e8: 0x00c0, 0x39e9: 0x00c0, - 0x39ea: 0x00c0, 0x39eb: 0x00c0, 0x39ec: 0x00c0, 0x39ed: 0x00c0, 0x39ee: 0x00c0, 0x39ef: 0x00c0, - 0x39f0: 0x00c0, 0x39f1: 0x00c0, 0x39f2: 0x00c0, 0x39f3: 0x00c3, 0x39f4: 0x0080, 0x39f5: 0x0080, - 0x39f6: 0x00c0, - // Block 0xe8, offset 0x3a00 - 0x3a00: 0x00c3, 0x3a01: 0x00c3, 0x3a02: 0x00c0, 0x3a03: 0x00c0, 0x3a04: 0x00c0, 0x3a05: 0x00c0, - 0x3a06: 0x00c0, 0x3a07: 0x00c0, 0x3a08: 0x00c0, 0x3a09: 0x00c0, 0x3a0a: 0x00c0, 0x3a0b: 0x00c0, - 0x3a0c: 0x00c0, 0x3a0d: 0x00c0, 0x3a0e: 0x00c0, 0x3a0f: 0x00c0, 0x3a10: 0x00c0, 0x3a11: 0x00c0, - 0x3a12: 0x00c0, 0x3a13: 0x00c0, 0x3a14: 0x00c0, 0x3a15: 0x00c0, 0x3a16: 0x00c0, 0x3a17: 0x00c0, - 0x3a18: 0x00c0, 0x3a19: 0x00c0, 0x3a1a: 0x00c0, 0x3a1b: 0x00c0, 0x3a1c: 0x00c0, 0x3a1d: 0x00c0, - 0x3a1e: 0x00c0, 0x3a1f: 0x00c0, 0x3a20: 0x00c0, 0x3a21: 0x00c0, 0x3a22: 0x00c0, 0x3a23: 0x00c0, - 0x3a24: 0x00c0, 0x3a25: 0x00c0, 0x3a26: 0x00c0, 0x3a27: 0x00c0, 0x3a28: 0x00c0, 0x3a29: 0x00c0, - 0x3a2a: 0x00c0, 0x3a2b: 0x00c0, 0x3a2c: 0x00c0, 0x3a2d: 0x00c0, 0x3a2e: 0x00c0, 0x3a2f: 0x00c0, - 0x3a30: 0x00c0, 0x3a31: 0x00c0, 0x3a32: 0x00c0, 0x3a33: 0x00c0, 0x3a34: 0x00c0, 0x3a35: 0x00c0, - 0x3a36: 0x00c3, 0x3a37: 0x00c3, 0x3a38: 0x00c3, 0x3a39: 0x00c3, 0x3a3a: 0x00c3, 0x3a3b: 0x00c3, - 0x3a3c: 0x00c3, 0x3a3d: 0x00c3, 0x3a3e: 0x00c3, 0x3a3f: 0x00c0, - // Block 0xe9, offset 0x3a40 - 0x3a40: 0x00c5, 0x3a41: 0x00c0, 0x3a42: 0x00c0, 0x3a43: 0x00c0, 0x3a44: 0x00c0, 0x3a45: 0x0080, - 0x3a46: 0x0080, 0x3a47: 0x0080, 0x3a48: 0x0080, 0x3a49: 0x0080, 0x3a4a: 0x00c3, 0x3a4b: 0x00c3, - 0x3a4c: 0x00c3, 0x3a4d: 0x0080, 0x3a50: 0x00c0, 0x3a51: 0x00c0, - 0x3a52: 0x00c0, 0x3a53: 0x00c0, 0x3a54: 0x00c0, 0x3a55: 0x00c0, 0x3a56: 0x00c0, 0x3a57: 0x00c0, - 0x3a58: 0x00c0, 0x3a59: 0x00c0, 0x3a5a: 0x00c0, 0x3a5b: 0x0080, 0x3a5c: 0x00c0, 0x3a5d: 0x0080, - 0x3a5e: 0x0080, 0x3a5f: 0x0080, 0x3a61: 0x0080, 0x3a62: 0x0080, 0x3a63: 0x0080, - 0x3a64: 0x0080, 0x3a65: 0x0080, 0x3a66: 0x0080, 0x3a67: 0x0080, 0x3a68: 0x0080, 0x3a69: 0x0080, - 0x3a6a: 0x0080, 0x3a6b: 0x0080, 0x3a6c: 0x0080, 0x3a6d: 0x0080, 0x3a6e: 0x0080, 0x3a6f: 0x0080, - 0x3a70: 0x0080, 0x3a71: 0x0080, 0x3a72: 0x0080, 0x3a73: 0x0080, 0x3a74: 0x0080, - // Block 0xea, offset 0x3a80 - 0x3a80: 0x00c0, 0x3a81: 0x00c0, 0x3a82: 0x00c0, 0x3a83: 0x00c0, 0x3a84: 0x00c0, 0x3a85: 0x00c0, - 0x3a86: 0x00c0, 0x3a87: 0x00c0, 0x3a88: 0x00c0, 0x3a89: 0x00c0, 0x3a8a: 0x00c0, 0x3a8b: 0x00c0, - 0x3a8c: 0x00c0, 0x3a8d: 0x00c0, 0x3a8e: 0x00c0, 0x3a8f: 0x00c0, 0x3a90: 0x00c0, 0x3a91: 0x00c0, - 0x3a93: 0x00c0, 0x3a94: 0x00c0, 0x3a95: 0x00c0, 0x3a96: 0x00c0, 0x3a97: 0x00c0, - 0x3a98: 0x00c0, 0x3a99: 0x00c0, 0x3a9a: 0x00c0, 0x3a9b: 0x00c0, 0x3a9c: 0x00c0, 0x3a9d: 0x00c0, - 0x3a9e: 0x00c0, 0x3a9f: 0x00c0, 0x3aa0: 0x00c0, 0x3aa1: 0x00c0, 0x3aa2: 0x00c0, 0x3aa3: 0x00c0, - 0x3aa4: 0x00c0, 0x3aa5: 0x00c0, 0x3aa6: 0x00c0, 0x3aa7: 0x00c0, 0x3aa8: 0x00c0, 0x3aa9: 0x00c0, - 0x3aaa: 0x00c0, 0x3aab: 0x00c0, 0x3aac: 0x00c0, 0x3aad: 0x00c0, 0x3aae: 0x00c0, 0x3aaf: 0x00c3, - 0x3ab0: 0x00c3, 0x3ab1: 0x00c3, 0x3ab2: 0x00c0, 0x3ab3: 0x00c0, 0x3ab4: 0x00c3, 0x3ab5: 0x00c5, - 0x3ab6: 0x00c3, 0x3ab7: 0x00c3, 0x3ab8: 0x0080, 0x3ab9: 0x0080, 0x3aba: 0x0080, 0x3abb: 0x0080, - 0x3abc: 0x0080, 0x3abd: 0x0080, 0x3abe: 0x00c3, - // Block 0xeb, offset 0x3ac0 - 0x3ac0: 0x00c0, 0x3ac1: 0x00c0, 0x3ac2: 0x00c0, 0x3ac3: 0x00c0, 0x3ac4: 0x00c0, 0x3ac5: 0x00c0, - 0x3ac6: 0x00c0, 0x3ac8: 0x00c0, 0x3aca: 0x00c0, 0x3acb: 0x00c0, - 0x3acc: 0x00c0, 0x3acd: 0x00c0, 0x3acf: 0x00c0, 0x3ad0: 0x00c0, 0x3ad1: 0x00c0, - 0x3ad2: 0x00c0, 0x3ad3: 0x00c0, 0x3ad4: 0x00c0, 0x3ad5: 0x00c0, 0x3ad6: 0x00c0, 0x3ad7: 0x00c0, - 0x3ad8: 0x00c0, 0x3ad9: 0x00c0, 0x3ada: 0x00c0, 0x3adb: 0x00c0, 0x3adc: 0x00c0, 0x3add: 0x00c0, - 0x3adf: 0x00c0, 0x3ae0: 0x00c0, 0x3ae1: 0x00c0, 0x3ae2: 0x00c0, 0x3ae3: 0x00c0, - 0x3ae4: 0x00c0, 0x3ae5: 0x00c0, 0x3ae6: 0x00c0, 0x3ae7: 0x00c0, 0x3ae8: 0x00c0, 0x3ae9: 0x0080, - 0x3af0: 0x00c0, 0x3af1: 0x00c0, 0x3af2: 0x00c0, 0x3af3: 0x00c0, 0x3af4: 0x00c0, 0x3af5: 0x00c0, - 0x3af6: 0x00c0, 0x3af7: 0x00c0, 0x3af8: 0x00c0, 0x3af9: 0x00c0, 0x3afa: 0x00c0, 0x3afb: 0x00c0, - 0x3afc: 0x00c0, 0x3afd: 0x00c0, 0x3afe: 0x00c0, 0x3aff: 0x00c0, - // Block 0xec, offset 0x3b00 - 0x3b00: 0x00c0, 0x3b01: 0x00c0, 0x3b02: 0x00c0, 0x3b03: 0x00c0, 0x3b04: 0x00c0, 0x3b05: 0x00c0, - 0x3b06: 0x00c0, 0x3b07: 0x00c0, 0x3b08: 0x00c0, 0x3b09: 0x00c0, 0x3b0a: 0x00c0, 0x3b0b: 0x00c0, - 0x3b0c: 0x00c0, 0x3b0d: 0x00c0, 0x3b0e: 0x00c0, 0x3b0f: 0x00c0, 0x3b10: 0x00c0, 0x3b11: 0x00c0, - 0x3b12: 0x00c0, 0x3b13: 0x00c0, 0x3b14: 0x00c0, 0x3b15: 0x00c0, 0x3b16: 0x00c0, 0x3b17: 0x00c0, - 0x3b18: 0x00c0, 0x3b19: 0x00c0, 0x3b1a: 0x00c0, 0x3b1b: 0x00c0, 0x3b1c: 0x00c0, 0x3b1d: 0x00c0, - 0x3b1e: 0x00c0, 0x3b1f: 0x00c3, 0x3b20: 0x00c0, 0x3b21: 0x00c0, 0x3b22: 0x00c0, 0x3b23: 0x00c3, - 0x3b24: 0x00c3, 0x3b25: 0x00c3, 0x3b26: 0x00c3, 0x3b27: 0x00c3, 0x3b28: 0x00c3, 0x3b29: 0x00c3, - 0x3b2a: 0x00c6, - 0x3b30: 0x00c0, 0x3b31: 0x00c0, 0x3b32: 0x00c0, 0x3b33: 0x00c0, 0x3b34: 0x00c0, 0x3b35: 0x00c0, - 0x3b36: 0x00c0, 0x3b37: 0x00c0, 0x3b38: 0x00c0, 0x3b39: 0x00c0, - // Block 0xed, offset 0x3b40 - 0x3b40: 0x00c3, 0x3b41: 0x00c3, 0x3b42: 0x00c0, 0x3b43: 0x00c0, 0x3b45: 0x00c0, - 0x3b46: 0x00c0, 0x3b47: 0x00c0, 0x3b48: 0x00c0, 0x3b49: 0x00c0, 0x3b4a: 0x00c0, 0x3b4b: 0x00c0, - 0x3b4c: 0x00c0, 0x3b4f: 0x00c0, 0x3b50: 0x00c0, - 0x3b53: 0x00c0, 0x3b54: 0x00c0, 0x3b55: 0x00c0, 0x3b56: 0x00c0, 0x3b57: 0x00c0, - 0x3b58: 0x00c0, 0x3b59: 0x00c0, 0x3b5a: 0x00c0, 0x3b5b: 0x00c0, 0x3b5c: 0x00c0, 0x3b5d: 0x00c0, - 0x3b5e: 0x00c0, 0x3b5f: 0x00c0, 0x3b60: 0x00c0, 0x3b61: 0x00c0, 0x3b62: 0x00c0, 0x3b63: 0x00c0, - 0x3b64: 0x00c0, 0x3b65: 0x00c0, 0x3b66: 0x00c0, 0x3b67: 0x00c0, 0x3b68: 0x00c0, - 0x3b6a: 0x00c0, 0x3b6b: 0x00c0, 0x3b6c: 0x00c0, 0x3b6d: 0x00c0, 0x3b6e: 0x00c0, 0x3b6f: 0x00c0, - 0x3b70: 0x00c0, 0x3b72: 0x00c0, 0x3b73: 0x00c0, 0x3b75: 0x00c0, - 0x3b76: 0x00c0, 0x3b77: 0x00c0, 0x3b78: 0x00c0, 0x3b79: 0x00c0, - 0x3b7c: 0x00c3, 0x3b7d: 0x00c0, 0x3b7e: 0x00c0, 0x3b7f: 0x00c0, - // Block 0xee, offset 0x3b80 - 0x3b80: 0x00c3, 0x3b81: 0x00c0, 0x3b82: 0x00c0, 0x3b83: 0x00c0, 0x3b84: 0x00c0, - 0x3b87: 0x00c0, 0x3b88: 0x00c0, 0x3b8b: 0x00c0, - 0x3b8c: 0x00c0, 0x3b8d: 0x00c5, 0x3b90: 0x00c0, - 0x3b97: 0x00c0, - 0x3b9d: 0x00c0, - 0x3b9e: 0x00c0, 0x3b9f: 0x00c0, 0x3ba0: 0x00c0, 0x3ba1: 0x00c0, 0x3ba2: 0x00c0, 0x3ba3: 0x00c0, - 0x3ba6: 0x00c3, 0x3ba7: 0x00c3, 0x3ba8: 0x00c3, 0x3ba9: 0x00c3, - 0x3baa: 0x00c3, 0x3bab: 0x00c3, 0x3bac: 0x00c3, - 0x3bb0: 0x00c3, 0x3bb1: 0x00c3, 0x3bb2: 0x00c3, 0x3bb3: 0x00c3, 0x3bb4: 0x00c3, - // Block 0xef, offset 0x3bc0 - 0x3bc0: 0x00c0, 0x3bc1: 0x00c0, 0x3bc2: 0x00c0, 0x3bc3: 0x00c0, 0x3bc4: 0x00c0, 0x3bc5: 0x00c0, - 0x3bc6: 0x00c0, 0x3bc7: 0x00c0, 0x3bc8: 0x00c0, 0x3bc9: 0x00c0, 0x3bca: 0x00c0, 0x3bcb: 0x00c0, - 0x3bcc: 0x00c0, 0x3bcd: 0x00c0, 0x3bce: 0x00c0, 0x3bcf: 0x00c0, 0x3bd0: 0x00c0, 0x3bd1: 0x00c0, - 0x3bd2: 0x00c0, 0x3bd3: 0x00c0, 0x3bd4: 0x00c0, 0x3bd5: 0x00c0, 0x3bd6: 0x00c0, 0x3bd7: 0x00c0, - 0x3bd8: 0x00c0, 0x3bd9: 0x00c0, 0x3bda: 0x00c0, 0x3bdb: 0x00c0, 0x3bdc: 0x00c0, 0x3bdd: 0x00c0, - 0x3bde: 0x00c0, 0x3bdf: 0x00c0, 0x3be0: 0x00c0, 0x3be1: 0x00c0, 0x3be2: 0x00c0, 0x3be3: 0x00c0, - 0x3be4: 0x00c0, 0x3be5: 0x00c0, 0x3be6: 0x00c0, 0x3be7: 0x00c0, 0x3be8: 0x00c0, 0x3be9: 0x00c0, - 0x3bea: 0x00c0, 0x3beb: 0x00c0, 0x3bec: 0x00c0, 0x3bed: 0x00c0, 0x3bee: 0x00c0, 0x3bef: 0x00c0, - 0x3bf0: 0x00c0, 0x3bf1: 0x00c0, 0x3bf2: 0x00c0, 0x3bf3: 0x00c0, 0x3bf4: 0x00c0, 0x3bf5: 0x00c0, - 0x3bf6: 0x00c0, 0x3bf7: 0x00c0, 0x3bf8: 0x00c3, 0x3bf9: 0x00c3, 0x3bfa: 0x00c3, 0x3bfb: 0x00c3, - 0x3bfc: 0x00c3, 0x3bfd: 0x00c3, 0x3bfe: 0x00c3, 0x3bff: 0x00c3, - // Block 0xf0, offset 0x3c00 - 0x3c00: 0x00c0, 0x3c01: 0x00c0, 0x3c02: 0x00c6, 0x3c03: 0x00c3, 0x3c04: 0x00c3, 0x3c05: 0x00c0, - 0x3c06: 0x00c3, 0x3c07: 0x00c0, 0x3c08: 0x00c0, 0x3c09: 0x00c0, 0x3c0a: 0x00c0, 0x3c0b: 0x0080, - 0x3c0c: 0x0080, 0x3c0d: 0x0080, 0x3c0e: 0x0080, 0x3c0f: 0x0080, 0x3c10: 0x00c0, 0x3c11: 0x00c0, - 0x3c12: 0x00c0, 0x3c13: 0x00c0, 0x3c14: 0x00c0, 0x3c15: 0x00c0, 0x3c16: 0x00c0, 0x3c17: 0x00c0, - 0x3c18: 0x00c0, 0x3c19: 0x00c0, 0x3c1b: 0x0080, 0x3c1d: 0x0080, - // Block 0xf1, offset 0x3c40 - 0x3c40: 0x00c0, 0x3c41: 0x00c0, 0x3c42: 0x00c0, 0x3c43: 0x00c0, 0x3c44: 0x00c0, 0x3c45: 0x00c0, - 0x3c46: 0x00c0, 0x3c47: 0x00c0, 0x3c48: 0x00c0, 0x3c49: 0x00c0, 0x3c4a: 0x00c0, 0x3c4b: 0x00c0, - 0x3c4c: 0x00c0, 0x3c4d: 0x00c0, 0x3c4e: 0x00c0, 0x3c4f: 0x00c0, 0x3c50: 0x00c0, 0x3c51: 0x00c0, - 0x3c52: 0x00c0, 0x3c53: 0x00c0, 0x3c54: 0x00c0, 0x3c55: 0x00c0, 0x3c56: 0x00c0, 0x3c57: 0x00c0, - 0x3c58: 0x00c0, 0x3c59: 0x00c0, 0x3c5a: 0x00c0, 0x3c5b: 0x00c0, 0x3c5c: 0x00c0, 0x3c5d: 0x00c0, - 0x3c5e: 0x00c0, 0x3c5f: 0x00c0, 0x3c60: 0x00c0, 0x3c61: 0x00c0, 0x3c62: 0x00c0, 0x3c63: 0x00c0, - 0x3c64: 0x00c0, 0x3c65: 0x00c0, 0x3c66: 0x00c0, 0x3c67: 0x00c0, 0x3c68: 0x00c0, 0x3c69: 0x00c0, - 0x3c6a: 0x00c0, 0x3c6b: 0x00c0, 0x3c6c: 0x00c0, 0x3c6d: 0x00c0, 0x3c6e: 0x00c0, 0x3c6f: 0x00c0, - 0x3c70: 0x00c0, 0x3c71: 0x00c0, 0x3c72: 0x00c0, 0x3c73: 0x00c3, 0x3c74: 0x00c3, 0x3c75: 0x00c3, - 0x3c76: 0x00c3, 0x3c77: 0x00c3, 0x3c78: 0x00c3, 0x3c79: 0x00c0, 0x3c7a: 0x00c3, 0x3c7b: 0x00c0, - 0x3c7c: 0x00c0, 0x3c7d: 0x00c0, 0x3c7e: 0x00c0, 0x3c7f: 0x00c3, - // Block 0xf2, offset 0x3c80 - 0x3c80: 0x00c3, 0x3c81: 0x00c0, 0x3c82: 0x00c6, 0x3c83: 0x00c3, 0x3c84: 0x00c0, 0x3c85: 0x00c0, - 0x3c86: 0x0080, 0x3c87: 0x00c0, - 0x3c90: 0x00c0, 0x3c91: 0x00c0, - 0x3c92: 0x00c0, 0x3c93: 0x00c0, 0x3c94: 0x00c0, 0x3c95: 0x00c0, 0x3c96: 0x00c0, 0x3c97: 0x00c0, - 0x3c98: 0x00c0, 0x3c99: 0x00c0, - // Block 0xf3, offset 0x3cc0 - 0x3cc0: 0x00c0, 0x3cc1: 0x00c0, 0x3cc2: 0x00c0, 0x3cc3: 0x00c0, 0x3cc4: 0x00c0, 0x3cc5: 0x00c0, - 0x3cc6: 0x00c0, 0x3cc7: 0x00c0, 0x3cc8: 0x00c0, 0x3cc9: 0x00c0, 0x3cca: 0x00c0, 0x3ccb: 0x00c0, - 0x3ccc: 0x00c0, 0x3ccd: 0x00c0, 0x3cce: 0x00c0, 0x3ccf: 0x00c0, 0x3cd0: 0x00c0, 0x3cd1: 0x00c0, - 0x3cd2: 0x00c0, 0x3cd3: 0x00c0, 0x3cd4: 0x00c0, 0x3cd5: 0x00c0, 0x3cd6: 0x00c0, 0x3cd7: 0x00c0, - 0x3cd8: 0x00c0, 0x3cd9: 0x00c0, 0x3cda: 0x00c0, 0x3cdb: 0x00c0, 0x3cdc: 0x00c0, 0x3cdd: 0x00c0, - 0x3cde: 0x00c0, 0x3cdf: 0x00c0, 0x3ce0: 0x00c0, 0x3ce1: 0x00c0, 0x3ce2: 0x00c0, 0x3ce3: 0x00c0, - 0x3ce4: 0x00c0, 0x3ce5: 0x00c0, 0x3ce6: 0x00c0, 0x3ce7: 0x00c0, 0x3ce8: 0x00c0, 0x3ce9: 0x00c0, - 0x3cea: 0x00c0, 0x3ceb: 0x00c0, 0x3cec: 0x00c0, 0x3ced: 0x00c0, 0x3cee: 0x00c0, 0x3cef: 0x00c0, - 0x3cf0: 0x00c0, 0x3cf1: 0x00c0, 0x3cf2: 0x00c3, 0x3cf3: 0x00c3, 0x3cf4: 0x00c3, 0x3cf5: 0x00c3, - 0x3cf8: 0x00c0, 0x3cf9: 0x00c0, 0x3cfa: 0x00c0, 0x3cfb: 0x00c0, - 0x3cfc: 0x00c3, 0x3cfd: 0x00c3, 0x3cfe: 0x00c0, 0x3cff: 0x00c6, - // Block 0xf4, offset 0x3d00 - 0x3d00: 0x00c3, 0x3d01: 0x0080, 0x3d02: 0x0080, 0x3d03: 0x0080, 0x3d04: 0x0080, 0x3d05: 0x0080, - 0x3d06: 0x0080, 0x3d07: 0x0080, 0x3d08: 0x0080, 0x3d09: 0x0080, 0x3d0a: 0x0080, 0x3d0b: 0x0080, - 0x3d0c: 0x0080, 0x3d0d: 0x0080, 0x3d0e: 0x0080, 0x3d0f: 0x0080, 0x3d10: 0x0080, 0x3d11: 0x0080, - 0x3d12: 0x0080, 0x3d13: 0x0080, 0x3d14: 0x0080, 0x3d15: 0x0080, 0x3d16: 0x0080, 0x3d17: 0x0080, - 0x3d18: 0x00c0, 0x3d19: 0x00c0, 0x3d1a: 0x00c0, 0x3d1b: 0x00c0, 0x3d1c: 0x00c3, 0x3d1d: 0x00c3, - // Block 0xf5, offset 0x3d40 - 0x3d40: 0x00c0, 0x3d41: 0x00c0, 0x3d42: 0x00c0, 0x3d43: 0x00c0, 0x3d44: 0x00c0, 0x3d45: 0x00c0, - 0x3d46: 0x00c0, 0x3d47: 0x00c0, 0x3d48: 0x00c0, 0x3d49: 0x00c0, 0x3d4a: 0x00c0, 0x3d4b: 0x00c0, - 0x3d4c: 0x00c0, 0x3d4d: 0x00c0, 0x3d4e: 0x00c0, 0x3d4f: 0x00c0, 0x3d50: 0x00c0, 0x3d51: 0x00c0, - 0x3d52: 0x00c0, 0x3d53: 0x00c0, 0x3d54: 0x00c0, 0x3d55: 0x00c0, 0x3d56: 0x00c0, 0x3d57: 0x00c0, - 0x3d58: 0x00c0, 0x3d59: 0x00c0, 0x3d5a: 0x00c0, 0x3d5b: 0x00c0, 0x3d5c: 0x00c0, 0x3d5d: 0x00c0, - 0x3d5e: 0x00c0, 0x3d5f: 0x00c0, 0x3d60: 0x00c0, 0x3d61: 0x00c0, 0x3d62: 0x00c0, 0x3d63: 0x00c0, - 0x3d64: 0x00c0, 0x3d65: 0x00c0, 0x3d66: 0x00c0, 0x3d67: 0x00c0, 0x3d68: 0x00c0, 0x3d69: 0x00c0, - 0x3d6a: 0x00c0, 0x3d6b: 0x00c0, 0x3d6c: 0x00c0, 0x3d6d: 0x00c0, 0x3d6e: 0x00c0, 0x3d6f: 0x00c0, - 0x3d70: 0x00c0, 0x3d71: 0x00c0, 0x3d72: 0x00c0, 0x3d73: 0x00c3, 0x3d74: 0x00c3, 0x3d75: 0x00c3, - 0x3d76: 0x00c3, 0x3d77: 0x00c3, 0x3d78: 0x00c3, 0x3d79: 0x00c3, 0x3d7a: 0x00c3, 0x3d7b: 0x00c0, - 0x3d7c: 0x00c0, 0x3d7d: 0x00c3, 0x3d7e: 0x00c0, 0x3d7f: 0x00c6, - // Block 0xf6, offset 0x3d80 - 0x3d80: 0x00c3, 0x3d81: 0x0080, 0x3d82: 0x0080, 0x3d83: 0x0080, 0x3d84: 0x00c0, - 0x3d90: 0x00c0, 0x3d91: 0x00c0, - 0x3d92: 0x00c0, 0x3d93: 0x00c0, 0x3d94: 0x00c0, 0x3d95: 0x00c0, 0x3d96: 0x00c0, 0x3d97: 0x00c0, - 0x3d98: 0x00c0, 0x3d99: 0x00c0, - 0x3da0: 0x0080, 0x3da1: 0x0080, 0x3da2: 0x0080, 0x3da3: 0x0080, - 0x3da4: 0x0080, 0x3da5: 0x0080, 0x3da6: 0x0080, 0x3da7: 0x0080, 0x3da8: 0x0080, 0x3da9: 0x0080, - 0x3daa: 0x0080, 0x3dab: 0x0080, 0x3dac: 0x0080, - // Block 0xf7, offset 0x3dc0 - 0x3dc0: 0x00c0, 0x3dc1: 0x00c0, 0x3dc2: 0x00c0, 0x3dc3: 0x00c0, 0x3dc4: 0x00c0, 0x3dc5: 0x00c0, - 0x3dc6: 0x00c0, 0x3dc7: 0x00c0, 0x3dc8: 0x00c0, 0x3dc9: 0x00c0, 0x3dca: 0x00c0, 0x3dcb: 0x00c0, - 0x3dcc: 0x00c0, 0x3dcd: 0x00c0, 0x3dce: 0x00c0, 0x3dcf: 0x00c0, 0x3dd0: 0x00c0, 0x3dd1: 0x00c0, - 0x3dd2: 0x00c0, 0x3dd3: 0x00c0, 0x3dd4: 0x00c0, 0x3dd5: 0x00c0, 0x3dd6: 0x00c0, 0x3dd7: 0x00c0, - 0x3dd8: 0x00c0, 0x3dd9: 0x00c0, 0x3dda: 0x00c0, 0x3ddb: 0x00c0, 0x3ddc: 0x00c0, 0x3ddd: 0x00c0, - 0x3dde: 0x00c0, 0x3ddf: 0x00c0, 0x3de0: 0x00c0, 0x3de1: 0x00c0, 0x3de2: 0x00c0, 0x3de3: 0x00c0, - 0x3de4: 0x00c0, 0x3de5: 0x00c0, 0x3de6: 0x00c0, 0x3de7: 0x00c0, 0x3de8: 0x00c0, 0x3de9: 0x00c0, - 0x3dea: 0x00c0, 0x3deb: 0x00c3, 0x3dec: 0x00c0, 0x3ded: 0x00c3, 0x3dee: 0x00c0, 0x3def: 0x00c0, - 0x3df0: 0x00c3, 0x3df1: 0x00c3, 0x3df2: 0x00c3, 0x3df3: 0x00c3, 0x3df4: 0x00c3, 0x3df5: 0x00c3, - 0x3df6: 0x00c5, 0x3df7: 0x00c3, - // Block 0xf8, offset 0x3e00 - 0x3e00: 0x00c0, 0x3e01: 0x00c0, 0x3e02: 0x00c0, 0x3e03: 0x00c0, 0x3e04: 0x00c0, 0x3e05: 0x00c0, - 0x3e06: 0x00c0, 0x3e07: 0x00c0, 0x3e08: 0x00c0, 0x3e09: 0x00c0, - // Block 0xf9, offset 0x3e40 - 0x3e40: 0x00c0, 0x3e41: 0x00c0, 0x3e42: 0x00c0, 0x3e43: 0x00c0, 0x3e44: 0x00c0, 0x3e45: 0x00c0, - 0x3e46: 0x00c0, 0x3e47: 0x00c0, 0x3e48: 0x00c0, 0x3e49: 0x00c0, 0x3e4a: 0x00c0, 0x3e4b: 0x00c0, - 0x3e4c: 0x00c0, 0x3e4d: 0x00c0, 0x3e4e: 0x00c0, 0x3e4f: 0x00c0, 0x3e50: 0x00c0, 0x3e51: 0x00c0, - 0x3e52: 0x00c0, 0x3e53: 0x00c0, 0x3e54: 0x00c0, 0x3e55: 0x00c0, 0x3e56: 0x00c0, 0x3e57: 0x00c0, - 0x3e58: 0x00c0, 0x3e59: 0x00c0, 0x3e5d: 0x00c3, - 0x3e5e: 0x00c3, 0x3e5f: 0x00c3, 0x3e60: 0x00c0, 0x3e61: 0x00c0, 0x3e62: 0x00c3, 0x3e63: 0x00c3, - 0x3e64: 0x00c3, 0x3e65: 0x00c3, 0x3e66: 0x00c0, 0x3e67: 0x00c3, 0x3e68: 0x00c3, 0x3e69: 0x00c3, - 0x3e6a: 0x00c3, 0x3e6b: 0x00c6, - 0x3e70: 0x00c0, 0x3e71: 0x00c0, 0x3e72: 0x00c0, 0x3e73: 0x00c0, 0x3e74: 0x00c0, 0x3e75: 0x00c0, - 0x3e76: 0x00c0, 0x3e77: 0x00c0, 0x3e78: 0x00c0, 0x3e79: 0x00c0, 0x3e7a: 0x0080, 0x3e7b: 0x0080, - 0x3e7c: 0x0080, 0x3e7d: 0x0080, 0x3e7e: 0x0080, 0x3e7f: 0x0080, - // Block 0xfa, offset 0x3e80 - 0x3ea0: 0x00c0, 0x3ea1: 0x00c0, 0x3ea2: 0x00c0, 0x3ea3: 0x00c0, - 0x3ea4: 0x00c0, 0x3ea5: 0x00c0, 0x3ea6: 0x00c0, 0x3ea7: 0x00c0, 0x3ea8: 0x00c0, 0x3ea9: 0x00c0, - 0x3eaa: 0x00c0, 0x3eab: 0x00c0, 0x3eac: 0x00c0, 0x3ead: 0x00c0, 0x3eae: 0x00c0, 0x3eaf: 0x00c0, - 0x3eb0: 0x00c0, 0x3eb1: 0x00c0, 0x3eb2: 0x00c0, 0x3eb3: 0x00c0, 0x3eb4: 0x00c0, 0x3eb5: 0x00c0, - 0x3eb6: 0x00c0, 0x3eb7: 0x00c0, 0x3eb8: 0x00c0, 0x3eb9: 0x00c0, 0x3eba: 0x00c0, 0x3ebb: 0x00c0, - 0x3ebc: 0x00c0, 0x3ebd: 0x00c0, 0x3ebe: 0x00c0, 0x3ebf: 0x00c0, - // Block 0xfb, offset 0x3ec0 - 0x3ec0: 0x00c0, 0x3ec1: 0x00c0, 0x3ec2: 0x00c0, 0x3ec3: 0x00c0, 0x3ec4: 0x00c0, 0x3ec5: 0x00c0, - 0x3ec6: 0x00c0, 0x3ec7: 0x00c0, 0x3ec8: 0x00c0, 0x3ec9: 0x00c0, 0x3eca: 0x00c0, 0x3ecb: 0x00c0, - 0x3ecc: 0x00c0, 0x3ecd: 0x00c0, 0x3ece: 0x00c0, 0x3ecf: 0x00c0, 0x3ed0: 0x00c0, 0x3ed1: 0x00c0, - 0x3ed2: 0x00c0, 0x3ed3: 0x00c0, 0x3ed4: 0x00c0, 0x3ed5: 0x00c0, 0x3ed6: 0x00c0, 0x3ed7: 0x00c0, - 0x3ed8: 0x00c0, 0x3ed9: 0x00c0, 0x3eda: 0x00c0, 0x3edb: 0x00c0, 0x3edc: 0x00c0, 0x3edd: 0x00c0, - 0x3ede: 0x00c0, 0x3edf: 0x00c0, 0x3ee0: 0x00c0, 0x3ee1: 0x00c0, 0x3ee2: 0x00c0, 0x3ee3: 0x00c0, - 0x3ee4: 0x00c0, 0x3ee5: 0x00c0, 0x3ee6: 0x00c0, 0x3ee7: 0x00c0, 0x3ee8: 0x00c0, 0x3ee9: 0x00c0, - 0x3eea: 0x0080, 0x3eeb: 0x0080, 0x3eec: 0x0080, 0x3eed: 0x0080, 0x3eee: 0x0080, 0x3eef: 0x0080, - 0x3ef0: 0x0080, 0x3ef1: 0x0080, 0x3ef2: 0x0080, - 0x3eff: 0x00c0, - // Block 0xfc, offset 0x3f00 - 0x3f00: 0x00c0, 0x3f01: 0x00c0, 0x3f02: 0x00c0, 0x3f03: 0x00c0, 0x3f04: 0x00c0, 0x3f05: 0x00c0, - 0x3f06: 0x00c0, 0x3f07: 0x00c0, 0x3f08: 0x00c0, 0x3f09: 0x00c0, 0x3f0a: 0x00c0, 0x3f0b: 0x00c0, - 0x3f0c: 0x00c0, 0x3f0d: 0x00c0, 0x3f0e: 0x00c0, 0x3f0f: 0x00c0, 0x3f10: 0x00c0, 0x3f11: 0x00c0, - 0x3f12: 0x00c0, 0x3f13: 0x00c0, 0x3f14: 0x00c0, 0x3f15: 0x00c0, 0x3f16: 0x00c0, 0x3f17: 0x00c0, - 0x3f18: 0x00c0, 0x3f19: 0x00c0, 0x3f1a: 0x00c0, 0x3f1b: 0x00c0, 0x3f1c: 0x00c0, 0x3f1d: 0x00c0, - 0x3f1e: 0x00c0, 0x3f1f: 0x00c0, 0x3f20: 0x00c0, 0x3f21: 0x00c0, 0x3f22: 0x00c0, 0x3f23: 0x00c0, - 0x3f24: 0x00c0, 0x3f25: 0x00c0, 0x3f26: 0x00c0, 0x3f27: 0x00c0, 0x3f28: 0x00c0, 0x3f29: 0x00c0, - 0x3f2a: 0x00c0, 0x3f2b: 0x00c0, 0x3f2c: 0x00c0, 0x3f2d: 0x00c0, 0x3f2e: 0x00c0, 0x3f2f: 0x00c0, - 0x3f30: 0x00c0, 0x3f31: 0x00c0, 0x3f32: 0x00c0, 0x3f33: 0x00c0, 0x3f34: 0x00c0, 0x3f35: 0x00c0, - 0x3f36: 0x00c0, 0x3f37: 0x00c0, 0x3f38: 0x00c0, - // Block 0xfd, offset 0x3f40 - 0x3f40: 0x00c0, 0x3f41: 0x00c0, 0x3f42: 0x00c0, 0x3f43: 0x00c0, 0x3f44: 0x00c0, 0x3f45: 0x00c0, - 0x3f46: 0x00c0, 0x3f47: 0x00c0, 0x3f48: 0x00c0, 0x3f4a: 0x00c0, 0x3f4b: 0x00c0, - 0x3f4c: 0x00c0, 0x3f4d: 0x00c0, 0x3f4e: 0x00c0, 0x3f4f: 0x00c0, 0x3f50: 0x00c0, 0x3f51: 0x00c0, - 0x3f52: 0x00c0, 0x3f53: 0x00c0, 0x3f54: 0x00c0, 0x3f55: 0x00c0, 0x3f56: 0x00c0, 0x3f57: 0x00c0, - 0x3f58: 0x00c0, 0x3f59: 0x00c0, 0x3f5a: 0x00c0, 0x3f5b: 0x00c0, 0x3f5c: 0x00c0, 0x3f5d: 0x00c0, - 0x3f5e: 0x00c0, 0x3f5f: 0x00c0, 0x3f60: 0x00c0, 0x3f61: 0x00c0, 0x3f62: 0x00c0, 0x3f63: 0x00c0, - 0x3f64: 0x00c0, 0x3f65: 0x00c0, 0x3f66: 0x00c0, 0x3f67: 0x00c0, 0x3f68: 0x00c0, 0x3f69: 0x00c0, - 0x3f6a: 0x00c0, 0x3f6b: 0x00c0, 0x3f6c: 0x00c0, 0x3f6d: 0x00c0, 0x3f6e: 0x00c0, 0x3f6f: 0x00c0, - 0x3f70: 0x00c3, 0x3f71: 0x00c3, 0x3f72: 0x00c3, 0x3f73: 0x00c3, 0x3f74: 0x00c3, 0x3f75: 0x00c3, - 0x3f76: 0x00c3, 0x3f78: 0x00c3, 0x3f79: 0x00c3, 0x3f7a: 0x00c3, 0x3f7b: 0x00c3, - 0x3f7c: 0x00c3, 0x3f7d: 0x00c3, 0x3f7e: 0x00c0, 0x3f7f: 0x00c6, - // Block 0xfe, offset 0x3f80 - 0x3f80: 0x00c0, 0x3f81: 0x0080, 0x3f82: 0x0080, 0x3f83: 0x0080, 0x3f84: 0x0080, 0x3f85: 0x0080, - 0x3f90: 0x00c0, 0x3f91: 0x00c0, - 0x3f92: 0x00c0, 0x3f93: 0x00c0, 0x3f94: 0x00c0, 0x3f95: 0x00c0, 0x3f96: 0x00c0, 0x3f97: 0x00c0, - 0x3f98: 0x00c0, 0x3f99: 0x00c0, 0x3f9a: 0x0080, 0x3f9b: 0x0080, 0x3f9c: 0x0080, 0x3f9d: 0x0080, - 0x3f9e: 0x0080, 0x3f9f: 0x0080, 0x3fa0: 0x0080, 0x3fa1: 0x0080, 0x3fa2: 0x0080, 0x3fa3: 0x0080, - 0x3fa4: 0x0080, 0x3fa5: 0x0080, 0x3fa6: 0x0080, 0x3fa7: 0x0080, 0x3fa8: 0x0080, 0x3fa9: 0x0080, - 0x3faa: 0x0080, 0x3fab: 0x0080, 0x3fac: 0x0080, - 0x3fb0: 0x0080, 0x3fb1: 0x0080, 0x3fb2: 0x00c0, 0x3fb3: 0x00c0, 0x3fb4: 0x00c0, 0x3fb5: 0x00c0, - 0x3fb6: 0x00c0, 0x3fb7: 0x00c0, 0x3fb8: 0x00c0, 0x3fb9: 0x00c0, 0x3fba: 0x00c0, 0x3fbb: 0x00c0, - 0x3fbc: 0x00c0, 0x3fbd: 0x00c0, 0x3fbe: 0x00c0, 0x3fbf: 0x00c0, - // Block 0xff, offset 0x3fc0 - 0x3fc0: 0x00c0, 0x3fc1: 0x00c0, 0x3fc2: 0x00c0, 0x3fc3: 0x00c0, 0x3fc4: 0x00c0, 0x3fc5: 0x00c0, - 0x3fc6: 0x00c0, 0x3fc7: 0x00c0, 0x3fc8: 0x00c0, 0x3fc9: 0x00c0, 0x3fca: 0x00c0, 0x3fcb: 0x00c0, - 0x3fcc: 0x00c0, 0x3fcd: 0x00c0, 0x3fce: 0x00c0, 0x3fcf: 0x00c0, - 0x3fd2: 0x00c3, 0x3fd3: 0x00c3, 0x3fd4: 0x00c3, 0x3fd5: 0x00c3, 0x3fd6: 0x00c3, 0x3fd7: 0x00c3, - 0x3fd8: 0x00c3, 0x3fd9: 0x00c3, 0x3fda: 0x00c3, 0x3fdb: 0x00c3, 0x3fdc: 0x00c3, 0x3fdd: 0x00c3, - 0x3fde: 0x00c3, 0x3fdf: 0x00c3, 0x3fe0: 0x00c3, 0x3fe1: 0x00c3, 0x3fe2: 0x00c3, 0x3fe3: 0x00c3, - 0x3fe4: 0x00c3, 0x3fe5: 0x00c3, 0x3fe6: 0x00c3, 0x3fe7: 0x00c3, 0x3fe9: 0x00c0, - 0x3fea: 0x00c3, 0x3feb: 0x00c3, 0x3fec: 0x00c3, 0x3fed: 0x00c3, 0x3fee: 0x00c3, 0x3fef: 0x00c3, - 0x3ff0: 0x00c3, 0x3ff1: 0x00c0, 0x3ff2: 0x00c3, 0x3ff3: 0x00c3, 0x3ff4: 0x00c0, 0x3ff5: 0x00c3, - 0x3ff6: 0x00c3, - // Block 0x100, offset 0x4000 - 0x4000: 0x00c0, 0x4001: 0x00c0, 0x4002: 0x00c0, 0x4003: 0x00c0, 0x4004: 0x00c0, 0x4005: 0x00c0, - 0x4006: 0x00c0, 0x4007: 0x00c0, 0x4008: 0x00c0, 0x4009: 0x00c0, 0x400a: 0x00c0, 0x400b: 0x00c0, - 0x400c: 0x00c0, 0x400d: 0x00c0, 0x400e: 0x00c0, 0x400f: 0x00c0, 0x4010: 0x00c0, 0x4011: 0x00c0, - 0x4012: 0x00c0, 0x4013: 0x00c0, 0x4014: 0x00c0, 0x4015: 0x00c0, 0x4016: 0x00c0, 0x4017: 0x00c0, - 0x4018: 0x00c0, 0x4019: 0x00c0, - // Block 0x101, offset 0x4040 - 0x4040: 0x0080, 0x4041: 0x0080, 0x4042: 0x0080, 0x4043: 0x0080, 0x4044: 0x0080, 0x4045: 0x0080, - 0x4046: 0x0080, 0x4047: 0x0080, 0x4048: 0x0080, 0x4049: 0x0080, 0x404a: 0x0080, 0x404b: 0x0080, - 0x404c: 0x0080, 0x404d: 0x0080, 0x404e: 0x0080, 0x404f: 0x0080, 0x4050: 0x0080, 0x4051: 0x0080, - 0x4052: 0x0080, 0x4053: 0x0080, 0x4054: 0x0080, 0x4055: 0x0080, 0x4056: 0x0080, 0x4057: 0x0080, - 0x4058: 0x0080, 0x4059: 0x0080, 0x405a: 0x0080, 0x405b: 0x0080, 0x405c: 0x0080, 0x405d: 0x0080, - 0x405e: 0x0080, 0x405f: 0x0080, 0x4060: 0x0080, 0x4061: 0x0080, 0x4062: 0x0080, 0x4063: 0x0080, - 0x4064: 0x0080, 0x4065: 0x0080, 0x4066: 0x0080, 0x4067: 0x0080, 0x4068: 0x0080, 0x4069: 0x0080, - 0x406a: 0x0080, 0x406b: 0x0080, 0x406c: 0x0080, 0x406d: 0x0080, 0x406e: 0x0080, - 0x4070: 0x0080, 0x4071: 0x0080, 0x4072: 0x0080, 0x4073: 0x0080, 0x4074: 0x0080, - // Block 0x102, offset 0x4080 - 0x4080: 0x00c0, 0x4081: 0x00c0, 0x4082: 0x00c0, 0x4083: 0x00c0, - // Block 0x103, offset 0x40c0 - 0x40c0: 0x00c0, 0x40c1: 0x00c0, 0x40c2: 0x00c0, 0x40c3: 0x00c0, 0x40c4: 0x00c0, 0x40c5: 0x00c0, - 0x40c6: 0x00c0, 0x40c7: 0x00c0, 0x40c8: 0x00c0, 0x40c9: 0x00c0, 0x40ca: 0x00c0, 0x40cb: 0x00c0, - 0x40cc: 0x00c0, 0x40cd: 0x00c0, 0x40ce: 0x00c0, 0x40cf: 0x00c0, 0x40d0: 0x00c0, 0x40d1: 0x00c0, - 0x40d2: 0x00c0, 0x40d3: 0x00c0, 0x40d4: 0x00c0, 0x40d5: 0x00c0, 0x40d6: 0x00c0, 0x40d7: 0x00c0, - 0x40d8: 0x00c0, 0x40d9: 0x00c0, 0x40da: 0x00c0, 0x40db: 0x00c0, 0x40dc: 0x00c0, 0x40dd: 0x00c0, - 0x40de: 0x00c0, 0x40df: 0x00c0, 0x40e0: 0x00c0, 0x40e1: 0x00c0, 0x40e2: 0x00c0, 0x40e3: 0x00c0, - 0x40e4: 0x00c0, 0x40e5: 0x00c0, 0x40e6: 0x00c0, 0x40e7: 0x00c0, 0x40e8: 0x00c0, 0x40e9: 0x00c0, - 0x40ea: 0x00c0, 0x40eb: 0x00c0, 0x40ec: 0x00c0, 0x40ed: 0x00c0, 0x40ee: 0x00c0, - // Block 0x104, offset 0x4100 - 0x4100: 0x00c0, 0x4101: 0x00c0, 0x4102: 0x00c0, 0x4103: 0x00c0, 0x4104: 0x00c0, 0x4105: 0x00c0, - 0x4106: 0x00c0, - // Block 0x105, offset 0x4140 - 0x4140: 0x00c0, 0x4141: 0x00c0, 0x4142: 0x00c0, 0x4143: 0x00c0, 0x4144: 0x00c0, 0x4145: 0x00c0, - 0x4146: 0x00c0, 0x4147: 0x00c0, 0x4148: 0x00c0, 0x4149: 0x00c0, 0x414a: 0x00c0, 0x414b: 0x00c0, - 0x414c: 0x00c0, 0x414d: 0x00c0, 0x414e: 0x00c0, 0x414f: 0x00c0, 0x4150: 0x00c0, 0x4151: 0x00c0, - 0x4152: 0x00c0, 0x4153: 0x00c0, 0x4154: 0x00c0, 0x4155: 0x00c0, 0x4156: 0x00c0, 0x4157: 0x00c0, - 0x4158: 0x00c0, 0x4159: 0x00c0, 0x415a: 0x00c0, 0x415b: 0x00c0, 0x415c: 0x00c0, 0x415d: 0x00c0, - 0x415e: 0x00c0, 0x4160: 0x00c0, 0x4161: 0x00c0, 0x4162: 0x00c0, 0x4163: 0x00c0, - 0x4164: 0x00c0, 0x4165: 0x00c0, 0x4166: 0x00c0, 0x4167: 0x00c0, 0x4168: 0x00c0, 0x4169: 0x00c0, - 0x416e: 0x0080, 0x416f: 0x0080, - // Block 0x106, offset 0x4180 - 0x4190: 0x00c0, 0x4191: 0x00c0, - 0x4192: 0x00c0, 0x4193: 0x00c0, 0x4194: 0x00c0, 0x4195: 0x00c0, 0x4196: 0x00c0, 0x4197: 0x00c0, - 0x4198: 0x00c0, 0x4199: 0x00c0, 0x419a: 0x00c0, 0x419b: 0x00c0, 0x419c: 0x00c0, 0x419d: 0x00c0, - 0x419e: 0x00c0, 0x419f: 0x00c0, 0x41a0: 0x00c0, 0x41a1: 0x00c0, 0x41a2: 0x00c0, 0x41a3: 0x00c0, - 0x41a4: 0x00c0, 0x41a5: 0x00c0, 0x41a6: 0x00c0, 0x41a7: 0x00c0, 0x41a8: 0x00c0, 0x41a9: 0x00c0, - 0x41aa: 0x00c0, 0x41ab: 0x00c0, 0x41ac: 0x00c0, 0x41ad: 0x00c0, - 0x41b0: 0x00c3, 0x41b1: 0x00c3, 0x41b2: 0x00c3, 0x41b3: 0x00c3, 0x41b4: 0x00c3, 0x41b5: 0x0080, - // Block 0x107, offset 0x41c0 - 0x41c0: 0x00c0, 0x41c1: 0x00c0, 0x41c2: 0x00c0, 0x41c3: 0x00c0, 0x41c4: 0x00c0, 0x41c5: 0x00c0, - 0x41c6: 0x00c0, 0x41c7: 0x00c0, 0x41c8: 0x00c0, 0x41c9: 0x00c0, 0x41ca: 0x00c0, 0x41cb: 0x00c0, - 0x41cc: 0x00c0, 0x41cd: 0x00c0, 0x41ce: 0x00c0, 0x41cf: 0x00c0, 0x41d0: 0x00c0, 0x41d1: 0x00c0, - 0x41d2: 0x00c0, 0x41d3: 0x00c0, 0x41d4: 0x00c0, 0x41d5: 0x00c0, 0x41d6: 0x00c0, 0x41d7: 0x00c0, - 0x41d8: 0x00c0, 0x41d9: 0x00c0, 0x41da: 0x00c0, 0x41db: 0x00c0, 0x41dc: 0x00c0, 0x41dd: 0x00c0, - 0x41de: 0x00c0, 0x41df: 0x00c0, 0x41e0: 0x00c0, 0x41e1: 0x00c0, 0x41e2: 0x00c0, 0x41e3: 0x00c0, - 0x41e4: 0x00c0, 0x41e5: 0x00c0, 0x41e6: 0x00c0, 0x41e7: 0x00c0, 0x41e8: 0x00c0, 0x41e9: 0x00c0, - 0x41ea: 0x00c0, 0x41eb: 0x00c0, 0x41ec: 0x00c0, 0x41ed: 0x00c0, 0x41ee: 0x00c0, 0x41ef: 0x00c0, - 0x41f0: 0x00c3, 0x41f1: 0x00c3, 0x41f2: 0x00c3, 0x41f3: 0x00c3, 0x41f4: 0x00c3, 0x41f5: 0x00c3, - 0x41f6: 0x00c3, 0x41f7: 0x0080, 0x41f8: 0x0080, 0x41f9: 0x0080, 0x41fa: 0x0080, 0x41fb: 0x0080, - 0x41fc: 0x0080, 0x41fd: 0x0080, 0x41fe: 0x0080, 0x41ff: 0x0080, - // Block 0x108, offset 0x4200 - 0x4200: 0x00c0, 0x4201: 0x00c0, 0x4202: 0x00c0, 0x4203: 0x00c0, 0x4204: 0x0080, 0x4205: 0x0080, - 0x4210: 0x00c0, 0x4211: 0x00c0, - 0x4212: 0x00c0, 0x4213: 0x00c0, 0x4214: 0x00c0, 0x4215: 0x00c0, 0x4216: 0x00c0, 0x4217: 0x00c0, - 0x4218: 0x00c0, 0x4219: 0x00c0, 0x421b: 0x0080, 0x421c: 0x0080, 0x421d: 0x0080, - 0x421e: 0x0080, 0x421f: 0x0080, 0x4220: 0x0080, 0x4221: 0x0080, 0x4223: 0x00c0, - 0x4224: 0x00c0, 0x4225: 0x00c0, 0x4226: 0x00c0, 0x4227: 0x00c0, 0x4228: 0x00c0, 0x4229: 0x00c0, - 0x422a: 0x00c0, 0x422b: 0x00c0, 0x422c: 0x00c0, 0x422d: 0x00c0, 0x422e: 0x00c0, 0x422f: 0x00c0, - 0x4230: 0x00c0, 0x4231: 0x00c0, 0x4232: 0x00c0, 0x4233: 0x00c0, 0x4234: 0x00c0, 0x4235: 0x00c0, - 0x4236: 0x00c0, 0x4237: 0x00c0, - 0x423d: 0x00c0, 0x423e: 0x00c0, 0x423f: 0x00c0, - // Block 0x109, offset 0x4240 - 0x4240: 0x00c0, 0x4241: 0x00c0, 0x4242: 0x00c0, 0x4243: 0x00c0, 0x4244: 0x00c0, 0x4245: 0x00c0, - 0x4246: 0x00c0, 0x4247: 0x00c0, 0x4248: 0x00c0, 0x4249: 0x00c0, 0x424a: 0x00c0, 0x424b: 0x00c0, - 0x424c: 0x00c0, 0x424d: 0x00c0, 0x424e: 0x00c0, 0x424f: 0x00c0, - // Block 0x10a, offset 0x4280 - 0x4280: 0x00c0, 0x4281: 0x00c0, 0x4282: 0x00c0, 0x4283: 0x00c0, 0x4284: 0x00c0, - 0x4290: 0x00c0, 0x4291: 0x00c0, - 0x4292: 0x00c0, 0x4293: 0x00c0, 0x4294: 0x00c0, 0x4295: 0x00c0, 0x4296: 0x00c0, 0x4297: 0x00c0, - 0x4298: 0x00c0, 0x4299: 0x00c0, 0x429a: 0x00c0, 0x429b: 0x00c0, 0x429c: 0x00c0, 0x429d: 0x00c0, - 0x429e: 0x00c0, 0x429f: 0x00c0, 0x42a0: 0x00c0, 0x42a1: 0x00c0, 0x42a2: 0x00c0, 0x42a3: 0x00c0, - 0x42a4: 0x00c0, 0x42a5: 0x00c0, 0x42a6: 0x00c0, 0x42a7: 0x00c0, 0x42a8: 0x00c0, 0x42a9: 0x00c0, - 0x42aa: 0x00c0, 0x42ab: 0x00c0, 0x42ac: 0x00c0, 0x42ad: 0x00c0, 0x42ae: 0x00c0, 0x42af: 0x00c0, - 0x42b0: 0x00c0, 0x42b1: 0x00c0, 0x42b2: 0x00c0, 0x42b3: 0x00c0, 0x42b4: 0x00c0, 0x42b5: 0x00c0, - 0x42b6: 0x00c0, 0x42b7: 0x00c0, 0x42b8: 0x00c0, 0x42b9: 0x00c0, 0x42ba: 0x00c0, 0x42bb: 0x00c0, - 0x42bc: 0x00c0, 0x42bd: 0x00c0, 0x42be: 0x00c0, - // Block 0x10b, offset 0x42c0 - 0x42cf: 0x00c3, 0x42d0: 0x00c3, 0x42d1: 0x00c3, - 0x42d2: 0x00c3, 0x42d3: 0x00c0, 0x42d4: 0x00c0, 0x42d5: 0x00c0, 0x42d6: 0x00c0, 0x42d7: 0x00c0, - 0x42d8: 0x00c0, 0x42d9: 0x00c0, 0x42da: 0x00c0, 0x42db: 0x00c0, 0x42dc: 0x00c0, 0x42dd: 0x00c0, - 0x42de: 0x00c0, 0x42df: 0x00c0, - // Block 0x10c, offset 0x4300 - 0x4320: 0x00c0, - // Block 0x10d, offset 0x4340 - 0x4340: 0x00c0, 0x4341: 0x00c0, 0x4342: 0x00c0, 0x4343: 0x00c0, 0x4344: 0x00c0, 0x4345: 0x00c0, - 0x4346: 0x00c0, 0x4347: 0x00c0, 0x4348: 0x00c0, 0x4349: 0x00c0, 0x434a: 0x00c0, 0x434b: 0x00c0, - 0x434c: 0x00c0, 0x434d: 0x00c0, 0x434e: 0x00c0, 0x434f: 0x00c0, 0x4350: 0x00c0, 0x4351: 0x00c0, - 0x4352: 0x00c0, 0x4353: 0x00c0, 0x4354: 0x00c0, 0x4355: 0x00c0, 0x4356: 0x00c0, 0x4357: 0x00c0, - 0x4358: 0x00c0, 0x4359: 0x00c0, 0x435a: 0x00c0, 0x435b: 0x00c0, 0x435c: 0x00c0, 0x435d: 0x00c0, - 0x435e: 0x00c0, 0x435f: 0x00c0, 0x4360: 0x00c0, 0x4361: 0x00c0, 0x4362: 0x00c0, 0x4363: 0x00c0, - 0x4364: 0x00c0, 0x4365: 0x00c0, 0x4366: 0x00c0, 0x4367: 0x00c0, 0x4368: 0x00c0, 0x4369: 0x00c0, - 0x436a: 0x00c0, 0x436b: 0x00c0, 0x436c: 0x00c0, - // Block 0x10e, offset 0x4380 - 0x4380: 0x00cc, 0x4381: 0x00cc, - // Block 0x10f, offset 0x43c0 - 0x43c0: 0x00c0, 0x43c1: 0x00c0, 0x43c2: 0x00c0, 0x43c3: 0x00c0, 0x43c4: 0x00c0, 0x43c5: 0x00c0, - 0x43c6: 0x00c0, 0x43c7: 0x00c0, 0x43c8: 0x00c0, 0x43c9: 0x00c0, 0x43ca: 0x00c0, 0x43cb: 0x00c0, - 0x43cc: 0x00c0, 0x43cd: 0x00c0, 0x43ce: 0x00c0, 0x43cf: 0x00c0, 0x43d0: 0x00c0, 0x43d1: 0x00c0, - 0x43d2: 0x00c0, 0x43d3: 0x00c0, 0x43d4: 0x00c0, 0x43d5: 0x00c0, 0x43d6: 0x00c0, 0x43d7: 0x00c0, - 0x43d8: 0x00c0, 0x43d9: 0x00c0, 0x43da: 0x00c0, 0x43db: 0x00c0, 0x43dc: 0x00c0, 0x43dd: 0x00c0, - 0x43de: 0x00c0, 0x43df: 0x00c0, 0x43e0: 0x00c0, 0x43e1: 0x00c0, 0x43e2: 0x00c0, 0x43e3: 0x00c0, - 0x43e4: 0x00c0, 0x43e5: 0x00c0, 0x43e6: 0x00c0, 0x43e7: 0x00c0, 0x43e8: 0x00c0, 0x43e9: 0x00c0, - 0x43ea: 0x00c0, - 0x43f0: 0x00c0, 0x43f1: 0x00c0, 0x43f2: 0x00c0, 0x43f3: 0x00c0, 0x43f4: 0x00c0, 0x43f5: 0x00c0, - 0x43f6: 0x00c0, 0x43f7: 0x00c0, 0x43f8: 0x00c0, 0x43f9: 0x00c0, 0x43fa: 0x00c0, 0x43fb: 0x00c0, - 0x43fc: 0x00c0, - // Block 0x110, offset 0x4400 - 0x4400: 0x00c0, 0x4401: 0x00c0, 0x4402: 0x00c0, 0x4403: 0x00c0, 0x4404: 0x00c0, 0x4405: 0x00c0, - 0x4406: 0x00c0, 0x4407: 0x00c0, 0x4408: 0x00c0, - 0x4410: 0x00c0, 0x4411: 0x00c0, - 0x4412: 0x00c0, 0x4413: 0x00c0, 0x4414: 0x00c0, 0x4415: 0x00c0, 0x4416: 0x00c0, 0x4417: 0x00c0, - 0x4418: 0x00c0, 0x4419: 0x00c0, 0x441c: 0x0080, 0x441d: 0x00c3, - 0x441e: 0x00c3, 0x441f: 0x0080, 0x4420: 0x0040, 0x4421: 0x0040, 0x4422: 0x0040, 0x4423: 0x0040, - // Block 0x111, offset 0x4440 - 0x4440: 0x0080, 0x4441: 0x0080, 0x4442: 0x0080, 0x4443: 0x0080, 0x4444: 0x0080, 0x4445: 0x0080, - 0x4446: 0x0080, 0x4447: 0x0080, 0x4448: 0x0080, 0x4449: 0x0080, 0x444a: 0x0080, 0x444b: 0x0080, - 0x444c: 0x0080, 0x444d: 0x0080, 0x444e: 0x0080, 0x444f: 0x0080, 0x4450: 0x0080, 0x4451: 0x0080, - 0x4452: 0x0080, 0x4453: 0x0080, 0x4454: 0x0080, 0x4455: 0x0080, 0x4456: 0x0080, 0x4457: 0x0080, - 0x4458: 0x0080, 0x4459: 0x0080, 0x445a: 0x0080, 0x445b: 0x0080, 0x445c: 0x0080, 0x445d: 0x0080, - 0x445e: 0x0080, 0x445f: 0x0080, 0x4460: 0x0080, 0x4461: 0x0080, 0x4462: 0x0080, 0x4463: 0x0080, - 0x4464: 0x0080, 0x4465: 0x0080, 0x4466: 0x0080, 0x4467: 0x0080, 0x4468: 0x0080, 0x4469: 0x0080, - 0x446a: 0x0080, 0x446b: 0x0080, 0x446c: 0x0080, 0x446d: 0x0080, 0x446e: 0x0080, 0x446f: 0x0080, - 0x4470: 0x0080, 0x4471: 0x0080, 0x4472: 0x0080, 0x4473: 0x0080, 0x4474: 0x0080, 0x4475: 0x0080, - // Block 0x112, offset 0x4480 - 0x4480: 0x0080, 0x4481: 0x0080, 0x4482: 0x0080, 0x4483: 0x0080, 0x4484: 0x0080, 0x4485: 0x0080, - 0x4486: 0x0080, 0x4487: 0x0080, 0x4488: 0x0080, 0x4489: 0x0080, 0x448a: 0x0080, 0x448b: 0x0080, - 0x448c: 0x0080, 0x448d: 0x0080, 0x448e: 0x0080, 0x448f: 0x0080, 0x4490: 0x0080, 0x4491: 0x0080, - 0x4492: 0x0080, 0x4493: 0x0080, 0x4494: 0x0080, 0x4495: 0x0080, 0x4496: 0x0080, 0x4497: 0x0080, - 0x4498: 0x0080, 0x4499: 0x0080, 0x449a: 0x0080, 0x449b: 0x0080, 0x449c: 0x0080, 0x449d: 0x0080, - 0x449e: 0x0080, 0x449f: 0x0080, 0x44a0: 0x0080, 0x44a1: 0x0080, 0x44a2: 0x0080, 0x44a3: 0x0080, - 0x44a4: 0x0080, 0x44a5: 0x0080, 0x44a6: 0x0080, 0x44a9: 0x0080, - 0x44aa: 0x0080, 0x44ab: 0x0080, 0x44ac: 0x0080, 0x44ad: 0x0080, 0x44ae: 0x0080, 0x44af: 0x0080, - 0x44b0: 0x0080, 0x44b1: 0x0080, 0x44b2: 0x0080, 0x44b3: 0x0080, 0x44b4: 0x0080, 0x44b5: 0x0080, - 0x44b6: 0x0080, 0x44b7: 0x0080, 0x44b8: 0x0080, 0x44b9: 0x0080, 0x44ba: 0x0080, 0x44bb: 0x0080, - 0x44bc: 0x0080, 0x44bd: 0x0080, 0x44be: 0x0080, 0x44bf: 0x0080, - // Block 0x113, offset 0x44c0 - 0x44c0: 0x0080, 0x44c1: 0x0080, 0x44c2: 0x0080, 0x44c3: 0x0080, 0x44c4: 0x0080, 0x44c5: 0x0080, - 0x44c6: 0x0080, 0x44c7: 0x0080, 0x44c8: 0x0080, 0x44c9: 0x0080, 0x44ca: 0x0080, 0x44cb: 0x0080, - 0x44cc: 0x0080, 0x44cd: 0x0080, 0x44ce: 0x0080, 0x44cf: 0x0080, 0x44d0: 0x0080, 0x44d1: 0x0080, - 0x44d2: 0x0080, 0x44d3: 0x0080, 0x44d4: 0x0080, 0x44d5: 0x0080, 0x44d6: 0x0080, 0x44d7: 0x0080, - 0x44d8: 0x0080, 0x44d9: 0x0080, 0x44da: 0x0080, 0x44db: 0x0080, 0x44dc: 0x0080, 0x44dd: 0x0080, - 0x44de: 0x0080, 0x44df: 0x0080, 0x44e0: 0x0080, 0x44e1: 0x0080, 0x44e2: 0x0080, 0x44e3: 0x0080, - 0x44e4: 0x0080, 0x44e5: 0x00c0, 0x44e6: 0x00c0, 0x44e7: 0x00c3, 0x44e8: 0x00c3, 0x44e9: 0x00c3, - 0x44ea: 0x0080, 0x44eb: 0x0080, 0x44ec: 0x0080, 0x44ed: 0x00c0, 0x44ee: 0x00c0, 0x44ef: 0x00c0, - 0x44f0: 0x00c0, 0x44f1: 0x00c0, 0x44f2: 0x00c0, 0x44f3: 0x0040, 0x44f4: 0x0040, 0x44f5: 0x0040, - 0x44f6: 0x0040, 0x44f7: 0x0040, 0x44f8: 0x0040, 0x44f9: 0x0040, 0x44fa: 0x0040, 0x44fb: 0x00c3, - 0x44fc: 0x00c3, 0x44fd: 0x00c3, 0x44fe: 0x00c3, 0x44ff: 0x00c3, - // Block 0x114, offset 0x4500 - 0x4500: 0x00c3, 0x4501: 0x00c3, 0x4502: 0x00c3, 0x4503: 0x0080, 0x4504: 0x0080, 0x4505: 0x00c3, - 0x4506: 0x00c3, 0x4507: 0x00c3, 0x4508: 0x00c3, 0x4509: 0x00c3, 0x450a: 0x00c3, 0x450b: 0x00c3, - 0x450c: 0x0080, 0x450d: 0x0080, 0x450e: 0x0080, 0x450f: 0x0080, 0x4510: 0x0080, 0x4511: 0x0080, - 0x4512: 0x0080, 0x4513: 0x0080, 0x4514: 0x0080, 0x4515: 0x0080, 0x4516: 0x0080, 0x4517: 0x0080, - 0x4518: 0x0080, 0x4519: 0x0080, 0x451a: 0x0080, 0x451b: 0x0080, 0x451c: 0x0080, 0x451d: 0x0080, - 0x451e: 0x0080, 0x451f: 0x0080, 0x4520: 0x0080, 0x4521: 0x0080, 0x4522: 0x0080, 0x4523: 0x0080, - 0x4524: 0x0080, 0x4525: 0x0080, 0x4526: 0x0080, 0x4527: 0x0080, 0x4528: 0x0080, 0x4529: 0x0080, - 0x452a: 0x00c3, 0x452b: 0x00c3, 0x452c: 0x00c3, 0x452d: 0x00c3, 0x452e: 0x0080, 0x452f: 0x0080, - 0x4530: 0x0080, 0x4531: 0x0080, 0x4532: 0x0080, 0x4533: 0x0080, 0x4534: 0x0080, 0x4535: 0x0080, - 0x4536: 0x0080, 0x4537: 0x0080, 0x4538: 0x0080, 0x4539: 0x0080, 0x453a: 0x0080, 0x453b: 0x0080, - 0x453c: 0x0080, 0x453d: 0x0080, 0x453e: 0x0080, 0x453f: 0x0080, - // Block 0x115, offset 0x4540 - 0x4540: 0x0080, 0x4541: 0x0080, 0x4542: 0x0080, 0x4543: 0x0080, 0x4544: 0x0080, 0x4545: 0x0080, - 0x4546: 0x0080, 0x4547: 0x0080, 0x4548: 0x0080, 0x4549: 0x0080, 0x454a: 0x0080, 0x454b: 0x0080, - 0x454c: 0x0080, 0x454d: 0x0080, 0x454e: 0x0080, 0x454f: 0x0080, 0x4550: 0x0080, 0x4551: 0x0080, - 0x4552: 0x0080, 0x4553: 0x0080, 0x4554: 0x0080, 0x4555: 0x0080, 0x4556: 0x0080, 0x4557: 0x0080, - 0x4558: 0x0080, 0x4559: 0x0080, 0x455a: 0x0080, 0x455b: 0x0080, 0x455c: 0x0080, 0x455d: 0x0080, - 0x455e: 0x0080, 0x455f: 0x0080, 0x4560: 0x0080, 0x4561: 0x0080, 0x4562: 0x0080, 0x4563: 0x0080, - 0x4564: 0x0080, 0x4565: 0x0080, 0x4566: 0x0080, 0x4567: 0x0080, 0x4568: 0x0080, - // Block 0x116, offset 0x4580 - 0x4580: 0x0088, 0x4581: 0x0088, 0x4582: 0x00c9, 0x4583: 0x00c9, 0x4584: 0x00c9, 0x4585: 0x0088, - // Block 0x117, offset 0x45c0 - 0x45c0: 0x0080, 0x45c1: 0x0080, 0x45c2: 0x0080, 0x45c3: 0x0080, 0x45c4: 0x0080, 0x45c5: 0x0080, - 0x45c6: 0x0080, 0x45c7: 0x0080, 0x45c8: 0x0080, 0x45c9: 0x0080, 0x45ca: 0x0080, 0x45cb: 0x0080, - 0x45cc: 0x0080, 0x45cd: 0x0080, 0x45ce: 0x0080, 0x45cf: 0x0080, 0x45d0: 0x0080, 0x45d1: 0x0080, - 0x45d2: 0x0080, 0x45d3: 0x0080, 0x45d4: 0x0080, 0x45d5: 0x0080, 0x45d6: 0x0080, - 0x45e0: 0x0080, 0x45e1: 0x0080, 0x45e2: 0x0080, 0x45e3: 0x0080, - 0x45e4: 0x0080, 0x45e5: 0x0080, 0x45e6: 0x0080, 0x45e7: 0x0080, 0x45e8: 0x0080, 0x45e9: 0x0080, - 0x45ea: 0x0080, 0x45eb: 0x0080, 0x45ec: 0x0080, 0x45ed: 0x0080, 0x45ee: 0x0080, 0x45ef: 0x0080, - 0x45f0: 0x0080, 0x45f1: 0x0080, - // Block 0x118, offset 0x4600 - 0x4600: 0x0080, 0x4601: 0x0080, 0x4602: 0x0080, 0x4603: 0x0080, 0x4604: 0x0080, 0x4605: 0x0080, - 0x4606: 0x0080, 0x4607: 0x0080, 0x4608: 0x0080, 0x4609: 0x0080, 0x460a: 0x0080, 0x460b: 0x0080, - 0x460c: 0x0080, 0x460d: 0x0080, 0x460e: 0x0080, 0x460f: 0x0080, 0x4610: 0x0080, 0x4611: 0x0080, - 0x4612: 0x0080, 0x4613: 0x0080, 0x4614: 0x0080, 0x4616: 0x0080, 0x4617: 0x0080, - 0x4618: 0x0080, 0x4619: 0x0080, 0x461a: 0x0080, 0x461b: 0x0080, 0x461c: 0x0080, 0x461d: 0x0080, - 0x461e: 0x0080, 0x461f: 0x0080, 0x4620: 0x0080, 0x4621: 0x0080, 0x4622: 0x0080, 0x4623: 0x0080, - 0x4624: 0x0080, 0x4625: 0x0080, 0x4626: 0x0080, 0x4627: 0x0080, 0x4628: 0x0080, 0x4629: 0x0080, - 0x462a: 0x0080, 0x462b: 0x0080, 0x462c: 0x0080, 0x462d: 0x0080, 0x462e: 0x0080, 0x462f: 0x0080, - 0x4630: 0x0080, 0x4631: 0x0080, 0x4632: 0x0080, 0x4633: 0x0080, 0x4634: 0x0080, 0x4635: 0x0080, - 0x4636: 0x0080, 0x4637: 0x0080, 0x4638: 0x0080, 0x4639: 0x0080, 0x463a: 0x0080, 0x463b: 0x0080, - 0x463c: 0x0080, 0x463d: 0x0080, 0x463e: 0x0080, 0x463f: 0x0080, - // Block 0x119, offset 0x4640 - 0x4640: 0x0080, 0x4641: 0x0080, 0x4642: 0x0080, 0x4643: 0x0080, 0x4644: 0x0080, 0x4645: 0x0080, - 0x4646: 0x0080, 0x4647: 0x0080, 0x4648: 0x0080, 0x4649: 0x0080, 0x464a: 0x0080, 0x464b: 0x0080, - 0x464c: 0x0080, 0x464d: 0x0080, 0x464e: 0x0080, 0x464f: 0x0080, 0x4650: 0x0080, 0x4651: 0x0080, - 0x4652: 0x0080, 0x4653: 0x0080, 0x4654: 0x0080, 0x4655: 0x0080, 0x4656: 0x0080, 0x4657: 0x0080, - 0x4658: 0x0080, 0x4659: 0x0080, 0x465a: 0x0080, 0x465b: 0x0080, 0x465c: 0x0080, - 0x465e: 0x0080, 0x465f: 0x0080, 0x4662: 0x0080, - 0x4665: 0x0080, 0x4666: 0x0080, 0x4669: 0x0080, - 0x466a: 0x0080, 0x466b: 0x0080, 0x466c: 0x0080, 0x466e: 0x0080, 0x466f: 0x0080, - 0x4670: 0x0080, 0x4671: 0x0080, 0x4672: 0x0080, 0x4673: 0x0080, 0x4674: 0x0080, 0x4675: 0x0080, - 0x4676: 0x0080, 0x4677: 0x0080, 0x4678: 0x0080, 0x4679: 0x0080, 0x467b: 0x0080, - 0x467d: 0x0080, 0x467e: 0x0080, 0x467f: 0x0080, - // Block 0x11a, offset 0x4680 - 0x4680: 0x0080, 0x4681: 0x0080, 0x4682: 0x0080, 0x4683: 0x0080, 0x4685: 0x0080, - 0x4686: 0x0080, 0x4687: 0x0080, 0x4688: 0x0080, 0x4689: 0x0080, 0x468a: 0x0080, 0x468b: 0x0080, - 0x468c: 0x0080, 0x468d: 0x0080, 0x468e: 0x0080, 0x468f: 0x0080, 0x4690: 0x0080, 0x4691: 0x0080, - 0x4692: 0x0080, 0x4693: 0x0080, 0x4694: 0x0080, 0x4695: 0x0080, 0x4696: 0x0080, 0x4697: 0x0080, - 0x4698: 0x0080, 0x4699: 0x0080, 0x469a: 0x0080, 0x469b: 0x0080, 0x469c: 0x0080, 0x469d: 0x0080, - 0x469e: 0x0080, 0x469f: 0x0080, 0x46a0: 0x0080, 0x46a1: 0x0080, 0x46a2: 0x0080, 0x46a3: 0x0080, - 0x46a4: 0x0080, 0x46a5: 0x0080, 0x46a6: 0x0080, 0x46a7: 0x0080, 0x46a8: 0x0080, 0x46a9: 0x0080, - 0x46aa: 0x0080, 0x46ab: 0x0080, 0x46ac: 0x0080, 0x46ad: 0x0080, 0x46ae: 0x0080, 0x46af: 0x0080, - 0x46b0: 0x0080, 0x46b1: 0x0080, 0x46b2: 0x0080, 0x46b3: 0x0080, 0x46b4: 0x0080, 0x46b5: 0x0080, - 0x46b6: 0x0080, 0x46b7: 0x0080, 0x46b8: 0x0080, 0x46b9: 0x0080, 0x46ba: 0x0080, 0x46bb: 0x0080, - 0x46bc: 0x0080, 0x46bd: 0x0080, 0x46be: 0x0080, 0x46bf: 0x0080, - // Block 0x11b, offset 0x46c0 - 0x46c0: 0x0080, 0x46c1: 0x0080, 0x46c2: 0x0080, 0x46c3: 0x0080, 0x46c4: 0x0080, 0x46c5: 0x0080, - 0x46c7: 0x0080, 0x46c8: 0x0080, 0x46c9: 0x0080, 0x46ca: 0x0080, - 0x46cd: 0x0080, 0x46ce: 0x0080, 0x46cf: 0x0080, 0x46d0: 0x0080, 0x46d1: 0x0080, - 0x46d2: 0x0080, 0x46d3: 0x0080, 0x46d4: 0x0080, 0x46d6: 0x0080, 0x46d7: 0x0080, - 0x46d8: 0x0080, 0x46d9: 0x0080, 0x46da: 0x0080, 0x46db: 0x0080, 0x46dc: 0x0080, - 0x46de: 0x0080, 0x46df: 0x0080, 0x46e0: 0x0080, 0x46e1: 0x0080, 0x46e2: 0x0080, 0x46e3: 0x0080, - 0x46e4: 0x0080, 0x46e5: 0x0080, 0x46e6: 0x0080, 0x46e7: 0x0080, 0x46e8: 0x0080, 0x46e9: 0x0080, - 0x46ea: 0x0080, 0x46eb: 0x0080, 0x46ec: 0x0080, 0x46ed: 0x0080, 0x46ee: 0x0080, 0x46ef: 0x0080, - 0x46f0: 0x0080, 0x46f1: 0x0080, 0x46f2: 0x0080, 0x46f3: 0x0080, 0x46f4: 0x0080, 0x46f5: 0x0080, - 0x46f6: 0x0080, 0x46f7: 0x0080, 0x46f8: 0x0080, 0x46f9: 0x0080, 0x46fb: 0x0080, - 0x46fc: 0x0080, 0x46fd: 0x0080, 0x46fe: 0x0080, - // Block 0x11c, offset 0x4700 - 0x4700: 0x0080, 0x4701: 0x0080, 0x4702: 0x0080, 0x4703: 0x0080, 0x4704: 0x0080, - 0x4706: 0x0080, 0x470a: 0x0080, 0x470b: 0x0080, - 0x470c: 0x0080, 0x470d: 0x0080, 0x470e: 0x0080, 0x470f: 0x0080, 0x4710: 0x0080, - 0x4712: 0x0080, 0x4713: 0x0080, 0x4714: 0x0080, 0x4715: 0x0080, 0x4716: 0x0080, 0x4717: 0x0080, - 0x4718: 0x0080, 0x4719: 0x0080, 0x471a: 0x0080, 0x471b: 0x0080, 0x471c: 0x0080, 0x471d: 0x0080, - 0x471e: 0x0080, 0x471f: 0x0080, 0x4720: 0x0080, 0x4721: 0x0080, 0x4722: 0x0080, 0x4723: 0x0080, - 0x4724: 0x0080, 0x4725: 0x0080, 0x4726: 0x0080, 0x4727: 0x0080, 0x4728: 0x0080, 0x4729: 0x0080, - 0x472a: 0x0080, 0x472b: 0x0080, 0x472c: 0x0080, 0x472d: 0x0080, 0x472e: 0x0080, 0x472f: 0x0080, - 0x4730: 0x0080, 0x4731: 0x0080, 0x4732: 0x0080, 0x4733: 0x0080, 0x4734: 0x0080, 0x4735: 0x0080, - 0x4736: 0x0080, 0x4737: 0x0080, 0x4738: 0x0080, 0x4739: 0x0080, 0x473a: 0x0080, 0x473b: 0x0080, - 0x473c: 0x0080, 0x473d: 0x0080, 0x473e: 0x0080, 0x473f: 0x0080, - // Block 0x11d, offset 0x4740 - 0x4740: 0x0080, 0x4741: 0x0080, 0x4742: 0x0080, 0x4743: 0x0080, 0x4744: 0x0080, 0x4745: 0x0080, - 0x4746: 0x0080, 0x4747: 0x0080, 0x4748: 0x0080, 0x4749: 0x0080, 0x474a: 0x0080, 0x474b: 0x0080, - 0x474c: 0x0080, 0x474d: 0x0080, 0x474e: 0x0080, 0x474f: 0x0080, 0x4750: 0x0080, 0x4751: 0x0080, - 0x4752: 0x0080, 0x4753: 0x0080, 0x4754: 0x0080, 0x4755: 0x0080, 0x4756: 0x0080, 0x4757: 0x0080, - 0x4758: 0x0080, 0x4759: 0x0080, 0x475a: 0x0080, 0x475b: 0x0080, 0x475c: 0x0080, 0x475d: 0x0080, - 0x475e: 0x0080, 0x475f: 0x0080, 0x4760: 0x0080, 0x4761: 0x0080, 0x4762: 0x0080, 0x4763: 0x0080, - 0x4764: 0x0080, 0x4765: 0x0080, 0x4768: 0x0080, 0x4769: 0x0080, - 0x476a: 0x0080, 0x476b: 0x0080, 0x476c: 0x0080, 0x476d: 0x0080, 0x476e: 0x0080, 0x476f: 0x0080, - 0x4770: 0x0080, 0x4771: 0x0080, 0x4772: 0x0080, 0x4773: 0x0080, 0x4774: 0x0080, 0x4775: 0x0080, - 0x4776: 0x0080, 0x4777: 0x0080, 0x4778: 0x0080, 0x4779: 0x0080, 0x477a: 0x0080, 0x477b: 0x0080, - 0x477c: 0x0080, 0x477d: 0x0080, 0x477e: 0x0080, 0x477f: 0x0080, - // Block 0x11e, offset 0x4780 - 0x4780: 0x0080, 0x4781: 0x0080, 0x4782: 0x0080, 0x4783: 0x0080, 0x4784: 0x0080, 0x4785: 0x0080, - 0x4786: 0x0080, 0x4787: 0x0080, 0x4788: 0x0080, 0x4789: 0x0080, 0x478a: 0x0080, 0x478b: 0x0080, - 0x478e: 0x0080, 0x478f: 0x0080, 0x4790: 0x0080, 0x4791: 0x0080, - 0x4792: 0x0080, 0x4793: 0x0080, 0x4794: 0x0080, 0x4795: 0x0080, 0x4796: 0x0080, 0x4797: 0x0080, - 0x4798: 0x0080, 0x4799: 0x0080, 0x479a: 0x0080, 0x479b: 0x0080, 0x479c: 0x0080, 0x479d: 0x0080, - 0x479e: 0x0080, 0x479f: 0x0080, 0x47a0: 0x0080, 0x47a1: 0x0080, 0x47a2: 0x0080, 0x47a3: 0x0080, - 0x47a4: 0x0080, 0x47a5: 0x0080, 0x47a6: 0x0080, 0x47a7: 0x0080, 0x47a8: 0x0080, 0x47a9: 0x0080, - 0x47aa: 0x0080, 0x47ab: 0x0080, 0x47ac: 0x0080, 0x47ad: 0x0080, 0x47ae: 0x0080, 0x47af: 0x0080, - 0x47b0: 0x0080, 0x47b1: 0x0080, 0x47b2: 0x0080, 0x47b3: 0x0080, 0x47b4: 0x0080, 0x47b5: 0x0080, - 0x47b6: 0x0080, 0x47b7: 0x0080, 0x47b8: 0x0080, 0x47b9: 0x0080, 0x47ba: 0x0080, 0x47bb: 0x0080, - 0x47bc: 0x0080, 0x47bd: 0x0080, 0x47be: 0x0080, 0x47bf: 0x0080, - // Block 0x11f, offset 0x47c0 - 0x47c0: 0x00c3, 0x47c1: 0x00c3, 0x47c2: 0x00c3, 0x47c3: 0x00c3, 0x47c4: 0x00c3, 0x47c5: 0x00c3, - 0x47c6: 0x00c3, 0x47c7: 0x00c3, 0x47c8: 0x00c3, 0x47c9: 0x00c3, 0x47ca: 0x00c3, 0x47cb: 0x00c3, - 0x47cc: 0x00c3, 0x47cd: 0x00c3, 0x47ce: 0x00c3, 0x47cf: 0x00c3, 0x47d0: 0x00c3, 0x47d1: 0x00c3, - 0x47d2: 0x00c3, 0x47d3: 0x00c3, 0x47d4: 0x00c3, 0x47d5: 0x00c3, 0x47d6: 0x00c3, 0x47d7: 0x00c3, - 0x47d8: 0x00c3, 0x47d9: 0x00c3, 0x47da: 0x00c3, 0x47db: 0x00c3, 0x47dc: 0x00c3, 0x47dd: 0x00c3, - 0x47de: 0x00c3, 0x47df: 0x00c3, 0x47e0: 0x00c3, 0x47e1: 0x00c3, 0x47e2: 0x00c3, 0x47e3: 0x00c3, - 0x47e4: 0x00c3, 0x47e5: 0x00c3, 0x47e6: 0x00c3, 0x47e7: 0x00c3, 0x47e8: 0x00c3, 0x47e9: 0x00c3, - 0x47ea: 0x00c3, 0x47eb: 0x00c3, 0x47ec: 0x00c3, 0x47ed: 0x00c3, 0x47ee: 0x00c3, 0x47ef: 0x00c3, - 0x47f0: 0x00c3, 0x47f1: 0x00c3, 0x47f2: 0x00c3, 0x47f3: 0x00c3, 0x47f4: 0x00c3, 0x47f5: 0x00c3, - 0x47f6: 0x00c3, 0x47f7: 0x0080, 0x47f8: 0x0080, 0x47f9: 0x0080, 0x47fa: 0x0080, 0x47fb: 0x00c3, - 0x47fc: 0x00c3, 0x47fd: 0x00c3, 0x47fe: 0x00c3, 0x47ff: 0x00c3, - // Block 0x120, offset 0x4800 - 0x4800: 0x00c3, 0x4801: 0x00c3, 0x4802: 0x00c3, 0x4803: 0x00c3, 0x4804: 0x00c3, 0x4805: 0x00c3, - 0x4806: 0x00c3, 0x4807: 0x00c3, 0x4808: 0x00c3, 0x4809: 0x00c3, 0x480a: 0x00c3, 0x480b: 0x00c3, - 0x480c: 0x00c3, 0x480d: 0x00c3, 0x480e: 0x00c3, 0x480f: 0x00c3, 0x4810: 0x00c3, 0x4811: 0x00c3, - 0x4812: 0x00c3, 0x4813: 0x00c3, 0x4814: 0x00c3, 0x4815: 0x00c3, 0x4816: 0x00c3, 0x4817: 0x00c3, - 0x4818: 0x00c3, 0x4819: 0x00c3, 0x481a: 0x00c3, 0x481b: 0x00c3, 0x481c: 0x00c3, 0x481d: 0x00c3, - 0x481e: 0x00c3, 0x481f: 0x00c3, 0x4820: 0x00c3, 0x4821: 0x00c3, 0x4822: 0x00c3, 0x4823: 0x00c3, - 0x4824: 0x00c3, 0x4825: 0x00c3, 0x4826: 0x00c3, 0x4827: 0x00c3, 0x4828: 0x00c3, 0x4829: 0x00c3, - 0x482a: 0x00c3, 0x482b: 0x00c3, 0x482c: 0x00c3, 0x482d: 0x0080, 0x482e: 0x0080, 0x482f: 0x0080, - 0x4830: 0x0080, 0x4831: 0x0080, 0x4832: 0x0080, 0x4833: 0x0080, 0x4834: 0x0080, 0x4835: 0x00c3, - 0x4836: 0x0080, 0x4837: 0x0080, 0x4838: 0x0080, 0x4839: 0x0080, 0x483a: 0x0080, 0x483b: 0x0080, - 0x483c: 0x0080, 0x483d: 0x0080, 0x483e: 0x0080, 0x483f: 0x0080, - // Block 0x121, offset 0x4840 - 0x4840: 0x0080, 0x4841: 0x0080, 0x4842: 0x0080, 0x4843: 0x0080, 0x4844: 0x00c3, 0x4845: 0x0080, - 0x4846: 0x0080, 0x4847: 0x0080, 0x4848: 0x0080, 0x4849: 0x0080, 0x484a: 0x0080, 0x484b: 0x0080, - 0x485b: 0x00c3, 0x485c: 0x00c3, 0x485d: 0x00c3, - 0x485e: 0x00c3, 0x485f: 0x00c3, 0x4861: 0x00c3, 0x4862: 0x00c3, 0x4863: 0x00c3, - 0x4864: 0x00c3, 0x4865: 0x00c3, 0x4866: 0x00c3, 0x4867: 0x00c3, 0x4868: 0x00c3, 0x4869: 0x00c3, - 0x486a: 0x00c3, 0x486b: 0x00c3, 0x486c: 0x00c3, 0x486d: 0x00c3, 0x486e: 0x00c3, 0x486f: 0x00c3, - // Block 0x122, offset 0x4880 - 0x4880: 0x00c3, 0x4881: 0x00c3, 0x4882: 0x00c3, 0x4883: 0x00c3, 0x4884: 0x00c3, 0x4885: 0x00c3, - 0x4886: 0x00c3, 0x4888: 0x00c3, 0x4889: 0x00c3, 0x488a: 0x00c3, 0x488b: 0x00c3, - 0x488c: 0x00c3, 0x488d: 0x00c3, 0x488e: 0x00c3, 0x488f: 0x00c3, 0x4890: 0x00c3, 0x4891: 0x00c3, - 0x4892: 0x00c3, 0x4893: 0x00c3, 0x4894: 0x00c3, 0x4895: 0x00c3, 0x4896: 0x00c3, 0x4897: 0x00c3, - 0x4898: 0x00c3, 0x489b: 0x00c3, 0x489c: 0x00c3, 0x489d: 0x00c3, - 0x489e: 0x00c3, 0x489f: 0x00c3, 0x48a0: 0x00c3, 0x48a1: 0x00c3, 0x48a3: 0x00c3, - 0x48a4: 0x00c3, 0x48a6: 0x00c3, 0x48a7: 0x00c3, 0x48a8: 0x00c3, 0x48a9: 0x00c3, - 0x48aa: 0x00c3, - // Block 0x123, offset 0x48c0 - 0x48c0: 0x00c0, 0x48c1: 0x00c0, 0x48c2: 0x00c0, 0x48c3: 0x00c0, 0x48c4: 0x00c0, - 0x48c7: 0x0080, 0x48c8: 0x0080, 0x48c9: 0x0080, 0x48ca: 0x0080, 0x48cb: 0x0080, - 0x48cc: 0x0080, 0x48cd: 0x0080, 0x48ce: 0x0080, 0x48cf: 0x0080, 0x48d0: 0x00c3, 0x48d1: 0x00c3, - 0x48d2: 0x00c3, 0x48d3: 0x00c3, 0x48d4: 0x00c3, 0x48d5: 0x00c3, 0x48d6: 0x00c3, - // Block 0x124, offset 0x4900 - 0x4900: 0x00c2, 0x4901: 0x00c2, 0x4902: 0x00c2, 0x4903: 0x00c2, 0x4904: 0x00c2, 0x4905: 0x00c2, - 0x4906: 0x00c2, 0x4907: 0x00c2, 0x4908: 0x00c2, 0x4909: 0x00c2, 0x490a: 0x00c2, 0x490b: 0x00c2, - 0x490c: 0x00c2, 0x490d: 0x00c2, 0x490e: 0x00c2, 0x490f: 0x00c2, 0x4910: 0x00c2, 0x4911: 0x00c2, - 0x4912: 0x00c2, 0x4913: 0x00c2, 0x4914: 0x00c2, 0x4915: 0x00c2, 0x4916: 0x00c2, 0x4917: 0x00c2, - 0x4918: 0x00c2, 0x4919: 0x00c2, 0x491a: 0x00c2, 0x491b: 0x00c2, 0x491c: 0x00c2, 0x491d: 0x00c2, - 0x491e: 0x00c2, 0x491f: 0x00c2, 0x4920: 0x00c2, 0x4921: 0x00c2, 0x4922: 0x00c2, 0x4923: 0x00c2, - 0x4924: 0x00c2, 0x4925: 0x00c2, 0x4926: 0x00c2, 0x4927: 0x00c2, 0x4928: 0x00c2, 0x4929: 0x00c2, - 0x492a: 0x00c2, 0x492b: 0x00c2, 0x492c: 0x00c2, 0x492d: 0x00c2, 0x492e: 0x00c2, 0x492f: 0x00c2, - 0x4930: 0x00c2, 0x4931: 0x00c2, 0x4932: 0x00c2, 0x4933: 0x00c2, 0x4934: 0x00c2, 0x4935: 0x00c2, - 0x4936: 0x00c2, 0x4937: 0x00c2, 0x4938: 0x00c2, 0x4939: 0x00c2, 0x493a: 0x00c2, 0x493b: 0x00c2, - 0x493c: 0x00c2, 0x493d: 0x00c2, 0x493e: 0x00c2, 0x493f: 0x00c2, - // Block 0x125, offset 0x4940 - 0x4940: 0x00c2, 0x4941: 0x00c2, 0x4942: 0x00c2, 0x4943: 0x00c2, 0x4944: 0x00c3, 0x4945: 0x00c3, - 0x4946: 0x00c3, 0x4947: 0x00c3, 0x4948: 0x00c3, 0x4949: 0x00c3, 0x494a: 0x00c3, - 0x4950: 0x00c0, 0x4951: 0x00c0, - 0x4952: 0x00c0, 0x4953: 0x00c0, 0x4954: 0x00c0, 0x4955: 0x00c0, 0x4956: 0x00c0, 0x4957: 0x00c0, - 0x4958: 0x00c0, 0x4959: 0x00c0, - 0x495e: 0x0080, 0x495f: 0x0080, - // Block 0x126, offset 0x4980 - 0x4980: 0x0080, 0x4981: 0x0080, 0x4982: 0x0080, 0x4983: 0x0080, 0x4985: 0x0080, - 0x4986: 0x0080, 0x4987: 0x0080, 0x4988: 0x0080, 0x4989: 0x0080, 0x498a: 0x0080, 0x498b: 0x0080, - 0x498c: 0x0080, 0x498d: 0x0080, 0x498e: 0x0080, 0x498f: 0x0080, 0x4990: 0x0080, 0x4991: 0x0080, - 0x4992: 0x0080, 0x4993: 0x0080, 0x4994: 0x0080, 0x4995: 0x0080, 0x4996: 0x0080, 0x4997: 0x0080, - 0x4998: 0x0080, 0x4999: 0x0080, 0x499a: 0x0080, 0x499b: 0x0080, 0x499c: 0x0080, 0x499d: 0x0080, - 0x499e: 0x0080, 0x499f: 0x0080, 0x49a1: 0x0080, 0x49a2: 0x0080, - 0x49a4: 0x0080, 0x49a7: 0x0080, 0x49a9: 0x0080, - 0x49aa: 0x0080, 0x49ab: 0x0080, 0x49ac: 0x0080, 0x49ad: 0x0080, 0x49ae: 0x0080, 0x49af: 0x0080, - 0x49b0: 0x0080, 0x49b1: 0x0080, 0x49b2: 0x0080, 0x49b4: 0x0080, 0x49b5: 0x0080, - 0x49b6: 0x0080, 0x49b7: 0x0080, 0x49b9: 0x0080, 0x49bb: 0x0080, - // Block 0x127, offset 0x49c0 - 0x49c2: 0x0080, - 0x49c7: 0x0080, 0x49c9: 0x0080, 0x49cb: 0x0080, - 0x49cd: 0x0080, 0x49ce: 0x0080, 0x49cf: 0x0080, 0x49d1: 0x0080, - 0x49d2: 0x0080, 0x49d4: 0x0080, 0x49d7: 0x0080, - 0x49d9: 0x0080, 0x49db: 0x0080, 0x49dd: 0x0080, - 0x49df: 0x0080, 0x49e1: 0x0080, 0x49e2: 0x0080, - 0x49e4: 0x0080, 0x49e7: 0x0080, 0x49e8: 0x0080, 0x49e9: 0x0080, - 0x49ea: 0x0080, 0x49ec: 0x0080, 0x49ed: 0x0080, 0x49ee: 0x0080, 0x49ef: 0x0080, - 0x49f0: 0x0080, 0x49f1: 0x0080, 0x49f2: 0x0080, 0x49f4: 0x0080, 0x49f5: 0x0080, - 0x49f6: 0x0080, 0x49f7: 0x0080, 0x49f9: 0x0080, 0x49fa: 0x0080, 0x49fb: 0x0080, - 0x49fc: 0x0080, 0x49fe: 0x0080, - // Block 0x128, offset 0x4a00 - 0x4a00: 0x0080, 0x4a01: 0x0080, 0x4a02: 0x0080, 0x4a03: 0x0080, 0x4a04: 0x0080, 0x4a05: 0x0080, - 0x4a06: 0x0080, 0x4a07: 0x0080, 0x4a08: 0x0080, 0x4a09: 0x0080, 0x4a0b: 0x0080, - 0x4a0c: 0x0080, 0x4a0d: 0x0080, 0x4a0e: 0x0080, 0x4a0f: 0x0080, 0x4a10: 0x0080, 0x4a11: 0x0080, - 0x4a12: 0x0080, 0x4a13: 0x0080, 0x4a14: 0x0080, 0x4a15: 0x0080, 0x4a16: 0x0080, 0x4a17: 0x0080, - 0x4a18: 0x0080, 0x4a19: 0x0080, 0x4a1a: 0x0080, 0x4a1b: 0x0080, - 0x4a21: 0x0080, 0x4a22: 0x0080, 0x4a23: 0x0080, - 0x4a25: 0x0080, 0x4a26: 0x0080, 0x4a27: 0x0080, 0x4a28: 0x0080, 0x4a29: 0x0080, - 0x4a2b: 0x0080, 0x4a2c: 0x0080, 0x4a2d: 0x0080, 0x4a2e: 0x0080, 0x4a2f: 0x0080, - 0x4a30: 0x0080, 0x4a31: 0x0080, 0x4a32: 0x0080, 0x4a33: 0x0080, 0x4a34: 0x0080, 0x4a35: 0x0080, - 0x4a36: 0x0080, 0x4a37: 0x0080, 0x4a38: 0x0080, 0x4a39: 0x0080, 0x4a3a: 0x0080, 0x4a3b: 0x0080, - // Block 0x129, offset 0x4a40 - 0x4a70: 0x0080, 0x4a71: 0x0080, - // Block 0x12a, offset 0x4a80 - 0x4a80: 0x0080, 0x4a81: 0x0080, 0x4a82: 0x0080, 0x4a83: 0x0080, 0x4a84: 0x0080, 0x4a85: 0x0080, - 0x4a86: 0x0080, 0x4a87: 0x0080, 0x4a88: 0x0080, 0x4a89: 0x0080, 0x4a8a: 0x0080, 0x4a8b: 0x0080, - 0x4a8c: 0x0080, 0x4a8d: 0x0080, 0x4a8e: 0x0080, 0x4a8f: 0x0080, 0x4a90: 0x0080, 0x4a91: 0x0080, - 0x4a92: 0x0080, 0x4a93: 0x0080, 0x4a94: 0x0080, 0x4a95: 0x0080, 0x4a96: 0x0080, 0x4a97: 0x0080, - 0x4a98: 0x0080, 0x4a99: 0x0080, 0x4a9a: 0x0080, 0x4a9b: 0x0080, 0x4a9c: 0x0080, 0x4a9d: 0x0080, - 0x4a9e: 0x0080, 0x4a9f: 0x0080, 0x4aa0: 0x0080, 0x4aa1: 0x0080, 0x4aa2: 0x0080, 0x4aa3: 0x0080, - 0x4aa4: 0x0080, 0x4aa5: 0x0080, 0x4aa6: 0x0080, 0x4aa7: 0x0080, 0x4aa8: 0x0080, 0x4aa9: 0x0080, - 0x4aaa: 0x0080, 0x4aab: 0x0080, - 0x4ab0: 0x0080, 0x4ab1: 0x0080, 0x4ab2: 0x0080, 0x4ab3: 0x0080, 0x4ab4: 0x0080, 0x4ab5: 0x0080, - 0x4ab6: 0x0080, 0x4ab7: 0x0080, 0x4ab8: 0x0080, 0x4ab9: 0x0080, 0x4aba: 0x0080, 0x4abb: 0x0080, - 0x4abc: 0x0080, 0x4abd: 0x0080, 0x4abe: 0x0080, 0x4abf: 0x0080, - // Block 0x12b, offset 0x4ac0 - 0x4ac0: 0x0080, 0x4ac1: 0x0080, 0x4ac2: 0x0080, 0x4ac3: 0x0080, 0x4ac4: 0x0080, 0x4ac5: 0x0080, - 0x4ac6: 0x0080, 0x4ac7: 0x0080, 0x4ac8: 0x0080, 0x4ac9: 0x0080, 0x4aca: 0x0080, 0x4acb: 0x0080, - 0x4acc: 0x0080, 0x4acd: 0x0080, 0x4ace: 0x0080, 0x4acf: 0x0080, 0x4ad0: 0x0080, 0x4ad1: 0x0080, - 0x4ad2: 0x0080, 0x4ad3: 0x0080, - 0x4ae0: 0x0080, 0x4ae1: 0x0080, 0x4ae2: 0x0080, 0x4ae3: 0x0080, - 0x4ae4: 0x0080, 0x4ae5: 0x0080, 0x4ae6: 0x0080, 0x4ae7: 0x0080, 0x4ae8: 0x0080, 0x4ae9: 0x0080, - 0x4aea: 0x0080, 0x4aeb: 0x0080, 0x4aec: 0x0080, 0x4aed: 0x0080, 0x4aee: 0x0080, - 0x4af1: 0x0080, 0x4af2: 0x0080, 0x4af3: 0x0080, 0x4af4: 0x0080, 0x4af5: 0x0080, - 0x4af6: 0x0080, 0x4af7: 0x0080, 0x4af8: 0x0080, 0x4af9: 0x0080, 0x4afa: 0x0080, 0x4afb: 0x0080, - 0x4afc: 0x0080, 0x4afd: 0x0080, 0x4afe: 0x0080, 0x4aff: 0x0080, - // Block 0x12c, offset 0x4b00 - 0x4b01: 0x0080, 0x4b02: 0x0080, 0x4b03: 0x0080, 0x4b04: 0x0080, 0x4b05: 0x0080, - 0x4b06: 0x0080, 0x4b07: 0x0080, 0x4b08: 0x0080, 0x4b09: 0x0080, 0x4b0a: 0x0080, 0x4b0b: 0x0080, - 0x4b0c: 0x0080, 0x4b0d: 0x0080, 0x4b0e: 0x0080, 0x4b0f: 0x0080, 0x4b11: 0x0080, - 0x4b12: 0x0080, 0x4b13: 0x0080, 0x4b14: 0x0080, 0x4b15: 0x0080, 0x4b16: 0x0080, 0x4b17: 0x0080, - 0x4b18: 0x0080, 0x4b19: 0x0080, 0x4b1a: 0x0080, 0x4b1b: 0x0080, 0x4b1c: 0x0080, 0x4b1d: 0x0080, - 0x4b1e: 0x0080, 0x4b1f: 0x0080, 0x4b20: 0x0080, 0x4b21: 0x0080, 0x4b22: 0x0080, 0x4b23: 0x0080, - 0x4b24: 0x0080, 0x4b25: 0x0080, 0x4b26: 0x0080, 0x4b27: 0x0080, 0x4b28: 0x0080, 0x4b29: 0x0080, - 0x4b2a: 0x0080, 0x4b2b: 0x0080, 0x4b2c: 0x0080, 0x4b2d: 0x0080, 0x4b2e: 0x0080, 0x4b2f: 0x0080, - 0x4b30: 0x0080, 0x4b31: 0x0080, 0x4b32: 0x0080, 0x4b33: 0x0080, 0x4b34: 0x0080, 0x4b35: 0x0080, - // Block 0x12d, offset 0x4b40 - 0x4b40: 0x0080, 0x4b41: 0x0080, 0x4b42: 0x0080, 0x4b43: 0x0080, 0x4b44: 0x0080, 0x4b45: 0x0080, - 0x4b46: 0x0080, 0x4b47: 0x0080, 0x4b48: 0x0080, 0x4b49: 0x0080, 0x4b4a: 0x0080, 0x4b4b: 0x0080, - 0x4b4c: 0x0080, 0x4b50: 0x0080, 0x4b51: 0x0080, - 0x4b52: 0x0080, 0x4b53: 0x0080, 0x4b54: 0x0080, 0x4b55: 0x0080, 0x4b56: 0x0080, 0x4b57: 0x0080, - 0x4b58: 0x0080, 0x4b59: 0x0080, 0x4b5a: 0x0080, 0x4b5b: 0x0080, 0x4b5c: 0x0080, 0x4b5d: 0x0080, - 0x4b5e: 0x0080, 0x4b5f: 0x0080, 0x4b60: 0x0080, 0x4b61: 0x0080, 0x4b62: 0x0080, 0x4b63: 0x0080, - 0x4b64: 0x0080, 0x4b65: 0x0080, 0x4b66: 0x0080, 0x4b67: 0x0080, 0x4b68: 0x0080, 0x4b69: 0x0080, - 0x4b6a: 0x0080, 0x4b6b: 0x0080, 0x4b6c: 0x0080, 0x4b6d: 0x0080, 0x4b6e: 0x0080, - 0x4b70: 0x0080, 0x4b71: 0x0080, 0x4b72: 0x0080, 0x4b73: 0x0080, 0x4b74: 0x0080, 0x4b75: 0x0080, - 0x4b76: 0x0080, 0x4b77: 0x0080, 0x4b78: 0x0080, 0x4b79: 0x0080, 0x4b7a: 0x0080, 0x4b7b: 0x0080, - 0x4b7c: 0x0080, 0x4b7d: 0x0080, 0x4b7e: 0x0080, 0x4b7f: 0x0080, - // Block 0x12e, offset 0x4b80 - 0x4b80: 0x0080, 0x4b81: 0x0080, 0x4b82: 0x0080, 0x4b83: 0x0080, 0x4b84: 0x0080, 0x4b85: 0x0080, - 0x4b86: 0x0080, 0x4b87: 0x0080, 0x4b88: 0x0080, 0x4b89: 0x0080, 0x4b8a: 0x0080, 0x4b8b: 0x0080, - 0x4b8c: 0x0080, 0x4b8d: 0x0080, 0x4b8e: 0x0080, 0x4b8f: 0x0080, 0x4b90: 0x0080, 0x4b91: 0x0080, - 0x4b92: 0x0080, 0x4b93: 0x0080, 0x4b94: 0x0080, 0x4b95: 0x0080, 0x4b96: 0x0080, 0x4b97: 0x0080, - 0x4b98: 0x0080, 0x4b99: 0x0080, 0x4b9a: 0x0080, 0x4b9b: 0x0080, 0x4b9c: 0x0080, 0x4b9d: 0x0080, - 0x4b9e: 0x0080, 0x4b9f: 0x0080, 0x4ba0: 0x0080, 0x4ba1: 0x0080, 0x4ba2: 0x0080, 0x4ba3: 0x0080, - 0x4ba4: 0x0080, 0x4ba5: 0x0080, 0x4ba6: 0x0080, 0x4ba7: 0x0080, 0x4ba8: 0x0080, 0x4ba9: 0x0080, - 0x4baa: 0x0080, 0x4bab: 0x0080, 0x4bac: 0x0080, - // Block 0x12f, offset 0x4bc0 - 0x4be6: 0x0080, 0x4be7: 0x0080, 0x4be8: 0x0080, 0x4be9: 0x0080, - 0x4bea: 0x0080, 0x4beb: 0x0080, 0x4bec: 0x0080, 0x4bed: 0x0080, 0x4bee: 0x0080, 0x4bef: 0x0080, - 0x4bf0: 0x0080, 0x4bf1: 0x0080, 0x4bf2: 0x0080, 0x4bf3: 0x0080, 0x4bf4: 0x0080, 0x4bf5: 0x0080, - 0x4bf6: 0x0080, 0x4bf7: 0x0080, 0x4bf8: 0x0080, 0x4bf9: 0x0080, 0x4bfa: 0x0080, 0x4bfb: 0x0080, - 0x4bfc: 0x0080, 0x4bfd: 0x0080, 0x4bfe: 0x0080, 0x4bff: 0x0080, - // Block 0x130, offset 0x4c00 - 0x4c00: 0x008c, 0x4c01: 0x0080, 0x4c02: 0x0080, - 0x4c10: 0x0080, 0x4c11: 0x0080, - 0x4c12: 0x0080, 0x4c13: 0x0080, 0x4c14: 0x0080, 0x4c15: 0x0080, 0x4c16: 0x0080, 0x4c17: 0x0080, - 0x4c18: 0x0080, 0x4c19: 0x0080, 0x4c1a: 0x0080, 0x4c1b: 0x0080, 0x4c1c: 0x0080, 0x4c1d: 0x0080, - 0x4c1e: 0x0080, 0x4c1f: 0x0080, 0x4c20: 0x0080, 0x4c21: 0x0080, 0x4c22: 0x0080, 0x4c23: 0x0080, - 0x4c24: 0x0080, 0x4c25: 0x0080, 0x4c26: 0x0080, 0x4c27: 0x0080, 0x4c28: 0x0080, 0x4c29: 0x0080, - 0x4c2a: 0x0080, 0x4c2b: 0x0080, 0x4c2c: 0x0080, 0x4c2d: 0x0080, 0x4c2e: 0x0080, 0x4c2f: 0x0080, - 0x4c30: 0x0080, 0x4c31: 0x0080, 0x4c32: 0x0080, 0x4c33: 0x0080, 0x4c34: 0x0080, 0x4c35: 0x0080, - 0x4c36: 0x0080, 0x4c37: 0x0080, 0x4c38: 0x0080, 0x4c39: 0x0080, 0x4c3a: 0x0080, 0x4c3b: 0x0080, - // Block 0x131, offset 0x4c40 - 0x4c40: 0x0080, 0x4c41: 0x0080, 0x4c42: 0x0080, 0x4c43: 0x0080, 0x4c44: 0x0080, 0x4c45: 0x0080, - 0x4c46: 0x0080, 0x4c47: 0x0080, 0x4c48: 0x0080, - 0x4c50: 0x0080, 0x4c51: 0x0080, - // Block 0x132, offset 0x4c80 - 0x4c80: 0x0080, 0x4c81: 0x0080, 0x4c82: 0x0080, 0x4c83: 0x0080, 0x4c84: 0x0080, 0x4c85: 0x0080, - 0x4c86: 0x0080, 0x4c87: 0x0080, 0x4c88: 0x0080, 0x4c89: 0x0080, 0x4c8a: 0x0080, 0x4c8b: 0x0080, - 0x4c8c: 0x0080, 0x4c8d: 0x0080, 0x4c8e: 0x0080, 0x4c8f: 0x0080, 0x4c90: 0x0080, 0x4c91: 0x0080, - 0x4c92: 0x0080, - 0x4ca0: 0x0080, 0x4ca1: 0x0080, 0x4ca2: 0x0080, 0x4ca3: 0x0080, - 0x4ca4: 0x0080, 0x4ca5: 0x0080, 0x4ca6: 0x0080, 0x4ca7: 0x0080, 0x4ca8: 0x0080, 0x4ca9: 0x0080, - 0x4caa: 0x0080, 0x4cab: 0x0080, 0x4cac: 0x0080, - 0x4cb0: 0x0080, 0x4cb1: 0x0080, 0x4cb2: 0x0080, 0x4cb3: 0x0080, 0x4cb4: 0x0080, 0x4cb5: 0x0080, - 0x4cb6: 0x0080, - // Block 0x133, offset 0x4cc0 - 0x4cc0: 0x0080, 0x4cc1: 0x0080, 0x4cc2: 0x0080, 0x4cc3: 0x0080, 0x4cc4: 0x0080, 0x4cc5: 0x0080, - 0x4cc6: 0x0080, 0x4cc7: 0x0080, 0x4cc8: 0x0080, 0x4cc9: 0x0080, 0x4cca: 0x0080, 0x4ccb: 0x0080, - 0x4ccc: 0x0080, 0x4ccd: 0x0080, 0x4cce: 0x0080, 0x4ccf: 0x0080, 0x4cd0: 0x0080, 0x4cd1: 0x0080, - 0x4cd2: 0x0080, 0x4cd3: 0x0080, 0x4cd4: 0x0080, 0x4cd5: 0x0080, 0x4cd6: 0x0080, 0x4cd7: 0x0080, - 0x4cd8: 0x0080, 0x4cd9: 0x0080, 0x4cda: 0x0080, 0x4cdb: 0x0080, 0x4cdc: 0x0080, 0x4cdd: 0x0080, - 0x4cde: 0x0080, 0x4cdf: 0x0080, 0x4ce0: 0x0080, 0x4ce1: 0x0080, 0x4ce2: 0x0080, 0x4ce3: 0x0080, - 0x4ce4: 0x0080, 0x4ce5: 0x0080, 0x4ce6: 0x0080, 0x4ce7: 0x0080, 0x4ce8: 0x0080, 0x4ce9: 0x0080, - 0x4cea: 0x0080, 0x4ceb: 0x0080, 0x4cec: 0x0080, 0x4ced: 0x0080, 0x4cee: 0x0080, 0x4cef: 0x0080, - 0x4cf0: 0x0080, 0x4cf1: 0x0080, 0x4cf2: 0x0080, 0x4cf3: 0x0080, - // Block 0x134, offset 0x4d00 - 0x4d00: 0x0080, 0x4d01: 0x0080, 0x4d02: 0x0080, 0x4d03: 0x0080, 0x4d04: 0x0080, 0x4d05: 0x0080, - 0x4d06: 0x0080, 0x4d07: 0x0080, 0x4d08: 0x0080, 0x4d09: 0x0080, 0x4d0a: 0x0080, 0x4d0b: 0x0080, - 0x4d0c: 0x0080, 0x4d0d: 0x0080, 0x4d0e: 0x0080, 0x4d0f: 0x0080, 0x4d10: 0x0080, 0x4d11: 0x0080, - 0x4d12: 0x0080, 0x4d13: 0x0080, 0x4d14: 0x0080, - // Block 0x135, offset 0x4d40 - 0x4d40: 0x0080, 0x4d41: 0x0080, 0x4d42: 0x0080, 0x4d43: 0x0080, 0x4d44: 0x0080, 0x4d45: 0x0080, - 0x4d46: 0x0080, 0x4d47: 0x0080, 0x4d48: 0x0080, 0x4d49: 0x0080, 0x4d4a: 0x0080, 0x4d4b: 0x0080, - 0x4d50: 0x0080, 0x4d51: 0x0080, - 0x4d52: 0x0080, 0x4d53: 0x0080, 0x4d54: 0x0080, 0x4d55: 0x0080, 0x4d56: 0x0080, 0x4d57: 0x0080, - 0x4d58: 0x0080, 0x4d59: 0x0080, 0x4d5a: 0x0080, 0x4d5b: 0x0080, 0x4d5c: 0x0080, 0x4d5d: 0x0080, - 0x4d5e: 0x0080, 0x4d5f: 0x0080, 0x4d60: 0x0080, 0x4d61: 0x0080, 0x4d62: 0x0080, 0x4d63: 0x0080, - 0x4d64: 0x0080, 0x4d65: 0x0080, 0x4d66: 0x0080, 0x4d67: 0x0080, 0x4d68: 0x0080, 0x4d69: 0x0080, - 0x4d6a: 0x0080, 0x4d6b: 0x0080, 0x4d6c: 0x0080, 0x4d6d: 0x0080, 0x4d6e: 0x0080, 0x4d6f: 0x0080, - 0x4d70: 0x0080, 0x4d71: 0x0080, 0x4d72: 0x0080, 0x4d73: 0x0080, 0x4d74: 0x0080, 0x4d75: 0x0080, - 0x4d76: 0x0080, 0x4d77: 0x0080, 0x4d78: 0x0080, 0x4d79: 0x0080, 0x4d7a: 0x0080, 0x4d7b: 0x0080, - 0x4d7c: 0x0080, 0x4d7d: 0x0080, 0x4d7e: 0x0080, 0x4d7f: 0x0080, - // Block 0x136, offset 0x4d80 - 0x4d80: 0x0080, 0x4d81: 0x0080, 0x4d82: 0x0080, 0x4d83: 0x0080, 0x4d84: 0x0080, 0x4d85: 0x0080, - 0x4d86: 0x0080, 0x4d87: 0x0080, - 0x4d90: 0x0080, 0x4d91: 0x0080, - 0x4d92: 0x0080, 0x4d93: 0x0080, 0x4d94: 0x0080, 0x4d95: 0x0080, 0x4d96: 0x0080, 0x4d97: 0x0080, - 0x4d98: 0x0080, 0x4d99: 0x0080, - 0x4da0: 0x0080, 0x4da1: 0x0080, 0x4da2: 0x0080, 0x4da3: 0x0080, - 0x4da4: 0x0080, 0x4da5: 0x0080, 0x4da6: 0x0080, 0x4da7: 0x0080, 0x4da8: 0x0080, 0x4da9: 0x0080, - 0x4daa: 0x0080, 0x4dab: 0x0080, 0x4dac: 0x0080, 0x4dad: 0x0080, 0x4dae: 0x0080, 0x4daf: 0x0080, - 0x4db0: 0x0080, 0x4db1: 0x0080, 0x4db2: 0x0080, 0x4db3: 0x0080, 0x4db4: 0x0080, 0x4db5: 0x0080, - 0x4db6: 0x0080, 0x4db7: 0x0080, 0x4db8: 0x0080, 0x4db9: 0x0080, 0x4dba: 0x0080, 0x4dbb: 0x0080, - 0x4dbc: 0x0080, 0x4dbd: 0x0080, 0x4dbe: 0x0080, 0x4dbf: 0x0080, - // Block 0x137, offset 0x4dc0 - 0x4dc0: 0x0080, 0x4dc1: 0x0080, 0x4dc2: 0x0080, 0x4dc3: 0x0080, 0x4dc4: 0x0080, 0x4dc5: 0x0080, - 0x4dc6: 0x0080, 0x4dc7: 0x0080, - 0x4dd0: 0x0080, 0x4dd1: 0x0080, - 0x4dd2: 0x0080, 0x4dd3: 0x0080, 0x4dd4: 0x0080, 0x4dd5: 0x0080, 0x4dd6: 0x0080, 0x4dd7: 0x0080, - 0x4dd8: 0x0080, 0x4dd9: 0x0080, 0x4dda: 0x0080, 0x4ddb: 0x0080, 0x4ddc: 0x0080, 0x4ddd: 0x0080, - 0x4dde: 0x0080, 0x4ddf: 0x0080, 0x4de0: 0x0080, 0x4de1: 0x0080, 0x4de2: 0x0080, 0x4de3: 0x0080, - 0x4de4: 0x0080, 0x4de5: 0x0080, 0x4de6: 0x0080, 0x4de7: 0x0080, 0x4de8: 0x0080, 0x4de9: 0x0080, - 0x4dea: 0x0080, 0x4deb: 0x0080, 0x4dec: 0x0080, 0x4ded: 0x0080, - // Block 0x138, offset 0x4e00 - 0x4e10: 0x0080, 0x4e11: 0x0080, - 0x4e12: 0x0080, 0x4e13: 0x0080, 0x4e14: 0x0080, 0x4e15: 0x0080, 0x4e16: 0x0080, 0x4e17: 0x0080, - 0x4e18: 0x0080, 0x4e19: 0x0080, 0x4e1a: 0x0080, 0x4e1b: 0x0080, 0x4e1c: 0x0080, 0x4e1d: 0x0080, - 0x4e1e: 0x0080, 0x4e20: 0x0080, 0x4e21: 0x0080, 0x4e22: 0x0080, 0x4e23: 0x0080, - 0x4e24: 0x0080, 0x4e25: 0x0080, 0x4e26: 0x0080, 0x4e27: 0x0080, - 0x4e30: 0x0080, 0x4e33: 0x0080, 0x4e34: 0x0080, 0x4e35: 0x0080, - 0x4e36: 0x0080, 0x4e37: 0x0080, 0x4e38: 0x0080, 0x4e39: 0x0080, 0x4e3a: 0x0080, 0x4e3b: 0x0080, - 0x4e3c: 0x0080, 0x4e3d: 0x0080, 0x4e3e: 0x0080, - // Block 0x139, offset 0x4e40 - 0x4e40: 0x0080, 0x4e41: 0x0080, 0x4e42: 0x0080, 0x4e43: 0x0080, 0x4e44: 0x0080, 0x4e45: 0x0080, - 0x4e46: 0x0080, 0x4e47: 0x0080, 0x4e48: 0x0080, 0x4e49: 0x0080, 0x4e4a: 0x0080, 0x4e4b: 0x0080, - 0x4e50: 0x0080, 0x4e51: 0x0080, - 0x4e52: 0x0080, 0x4e53: 0x0080, 0x4e54: 0x0080, 0x4e55: 0x0080, 0x4e56: 0x0080, 0x4e57: 0x0080, - 0x4e58: 0x0080, 0x4e59: 0x0080, 0x4e5a: 0x0080, 0x4e5b: 0x0080, 0x4e5c: 0x0080, 0x4e5d: 0x0080, - 0x4e5e: 0x0080, - // Block 0x13a, offset 0x4e80 - 0x4e80: 0x0080, 0x4e81: 0x0080, 0x4e82: 0x0080, 0x4e83: 0x0080, 0x4e84: 0x0080, 0x4e85: 0x0080, - 0x4e86: 0x0080, 0x4e87: 0x0080, 0x4e88: 0x0080, 0x4e89: 0x0080, 0x4e8a: 0x0080, 0x4e8b: 0x0080, - 0x4e8c: 0x0080, 0x4e8d: 0x0080, 0x4e8e: 0x0080, 0x4e8f: 0x0080, 0x4e90: 0x0080, 0x4e91: 0x0080, - // Block 0x13b, offset 0x4ec0 - 0x4ec0: 0x0080, - // Block 0x13c, offset 0x4f00 - 0x4f00: 0x00cc, 0x4f01: 0x00cc, 0x4f02: 0x00cc, 0x4f03: 0x00cc, 0x4f04: 0x00cc, 0x4f05: 0x00cc, - 0x4f06: 0x00cc, 0x4f07: 0x00cc, 0x4f08: 0x00cc, 0x4f09: 0x00cc, 0x4f0a: 0x00cc, 0x4f0b: 0x00cc, - 0x4f0c: 0x00cc, 0x4f0d: 0x00cc, 0x4f0e: 0x00cc, 0x4f0f: 0x00cc, 0x4f10: 0x00cc, 0x4f11: 0x00cc, - 0x4f12: 0x00cc, 0x4f13: 0x00cc, 0x4f14: 0x00cc, 0x4f15: 0x00cc, 0x4f16: 0x00cc, - // Block 0x13d, offset 0x4f40 - 0x4f40: 0x00cc, 0x4f41: 0x00cc, 0x4f42: 0x00cc, 0x4f43: 0x00cc, 0x4f44: 0x00cc, 0x4f45: 0x00cc, - 0x4f46: 0x00cc, 0x4f47: 0x00cc, 0x4f48: 0x00cc, 0x4f49: 0x00cc, 0x4f4a: 0x00cc, 0x4f4b: 0x00cc, - 0x4f4c: 0x00cc, 0x4f4d: 0x00cc, 0x4f4e: 0x00cc, 0x4f4f: 0x00cc, 0x4f50: 0x00cc, 0x4f51: 0x00cc, - 0x4f52: 0x00cc, 0x4f53: 0x00cc, 0x4f54: 0x00cc, 0x4f55: 0x00cc, 0x4f56: 0x00cc, 0x4f57: 0x00cc, - 0x4f58: 0x00cc, 0x4f59: 0x00cc, 0x4f5a: 0x00cc, 0x4f5b: 0x00cc, 0x4f5c: 0x00cc, 0x4f5d: 0x00cc, - 0x4f5e: 0x00cc, 0x4f5f: 0x00cc, 0x4f60: 0x00cc, 0x4f61: 0x00cc, 0x4f62: 0x00cc, 0x4f63: 0x00cc, - 0x4f64: 0x00cc, 0x4f65: 0x00cc, 0x4f66: 0x00cc, 0x4f67: 0x00cc, 0x4f68: 0x00cc, 0x4f69: 0x00cc, - 0x4f6a: 0x00cc, 0x4f6b: 0x00cc, 0x4f6c: 0x00cc, 0x4f6d: 0x00cc, 0x4f6e: 0x00cc, 0x4f6f: 0x00cc, - 0x4f70: 0x00cc, 0x4f71: 0x00cc, 0x4f72: 0x00cc, 0x4f73: 0x00cc, 0x4f74: 0x00cc, - // Block 0x13e, offset 0x4f80 - 0x4f80: 0x00cc, 0x4f81: 0x00cc, 0x4f82: 0x00cc, 0x4f83: 0x00cc, 0x4f84: 0x00cc, 0x4f85: 0x00cc, - 0x4f86: 0x00cc, 0x4f87: 0x00cc, 0x4f88: 0x00cc, 0x4f89: 0x00cc, 0x4f8a: 0x00cc, 0x4f8b: 0x00cc, - 0x4f8c: 0x00cc, 0x4f8d: 0x00cc, 0x4f8e: 0x00cc, 0x4f8f: 0x00cc, 0x4f90: 0x00cc, 0x4f91: 0x00cc, - 0x4f92: 0x00cc, 0x4f93: 0x00cc, 0x4f94: 0x00cc, 0x4f95: 0x00cc, 0x4f96: 0x00cc, 0x4f97: 0x00cc, - 0x4f98: 0x00cc, 0x4f99: 0x00cc, 0x4f9a: 0x00cc, 0x4f9b: 0x00cc, 0x4f9c: 0x00cc, 0x4f9d: 0x00cc, - 0x4fa0: 0x00cc, 0x4fa1: 0x00cc, 0x4fa2: 0x00cc, 0x4fa3: 0x00cc, - 0x4fa4: 0x00cc, 0x4fa5: 0x00cc, 0x4fa6: 0x00cc, 0x4fa7: 0x00cc, 0x4fa8: 0x00cc, 0x4fa9: 0x00cc, - 0x4faa: 0x00cc, 0x4fab: 0x00cc, 0x4fac: 0x00cc, 0x4fad: 0x00cc, 0x4fae: 0x00cc, 0x4faf: 0x00cc, - 0x4fb0: 0x00cc, 0x4fb1: 0x00cc, 0x4fb2: 0x00cc, 0x4fb3: 0x00cc, 0x4fb4: 0x00cc, 0x4fb5: 0x00cc, - 0x4fb6: 0x00cc, 0x4fb7: 0x00cc, 0x4fb8: 0x00cc, 0x4fb9: 0x00cc, 0x4fba: 0x00cc, 0x4fbb: 0x00cc, - 0x4fbc: 0x00cc, 0x4fbd: 0x00cc, 0x4fbe: 0x00cc, 0x4fbf: 0x00cc, - // Block 0x13f, offset 0x4fc0 - 0x4fc0: 0x00cc, 0x4fc1: 0x00cc, 0x4fc2: 0x00cc, 0x4fc3: 0x00cc, 0x4fc4: 0x00cc, 0x4fc5: 0x00cc, - 0x4fc6: 0x00cc, 0x4fc7: 0x00cc, 0x4fc8: 0x00cc, 0x4fc9: 0x00cc, 0x4fca: 0x00cc, 0x4fcb: 0x00cc, - 0x4fcc: 0x00cc, 0x4fcd: 0x00cc, 0x4fce: 0x00cc, 0x4fcf: 0x00cc, 0x4fd0: 0x00cc, 0x4fd1: 0x00cc, - 0x4fd2: 0x00cc, 0x4fd3: 0x00cc, 0x4fd4: 0x00cc, 0x4fd5: 0x00cc, 0x4fd6: 0x00cc, 0x4fd7: 0x00cc, - 0x4fd8: 0x00cc, 0x4fd9: 0x00cc, 0x4fda: 0x00cc, 0x4fdb: 0x00cc, 0x4fdc: 0x00cc, 0x4fdd: 0x00cc, - 0x4fde: 0x00cc, 0x4fdf: 0x00cc, 0x4fe0: 0x00cc, 0x4fe1: 0x00cc, - // Block 0x140, offset 0x5000 - 0x5000: 0x008c, 0x5001: 0x008c, 0x5002: 0x008c, 0x5003: 0x008c, 0x5004: 0x008c, 0x5005: 0x008c, - 0x5006: 0x008c, 0x5007: 0x008c, 0x5008: 0x008c, 0x5009: 0x008c, 0x500a: 0x008c, 0x500b: 0x008c, - 0x500c: 0x008c, 0x500d: 0x008c, 0x500e: 0x008c, 0x500f: 0x008c, 0x5010: 0x008c, 0x5011: 0x008c, - 0x5012: 0x008c, 0x5013: 0x008c, 0x5014: 0x008c, 0x5015: 0x008c, 0x5016: 0x008c, 0x5017: 0x008c, - 0x5018: 0x008c, 0x5019: 0x008c, 0x501a: 0x008c, 0x501b: 0x008c, 0x501c: 0x008c, 0x501d: 0x008c, - // Block 0x141, offset 0x5040 - 0x5041: 0x0040, - 0x5060: 0x0040, 0x5061: 0x0040, 0x5062: 0x0040, 0x5063: 0x0040, - 0x5064: 0x0040, 0x5065: 0x0040, 0x5066: 0x0040, 0x5067: 0x0040, 0x5068: 0x0040, 0x5069: 0x0040, - 0x506a: 0x0040, 0x506b: 0x0040, 0x506c: 0x0040, 0x506d: 0x0040, 0x506e: 0x0040, 0x506f: 0x0040, - 0x5070: 0x0040, 0x5071: 0x0040, 0x5072: 0x0040, 0x5073: 0x0040, 0x5074: 0x0040, 0x5075: 0x0040, - 0x5076: 0x0040, 0x5077: 0x0040, 0x5078: 0x0040, 0x5079: 0x0040, 0x507a: 0x0040, 0x507b: 0x0040, - 0x507c: 0x0040, 0x507d: 0x0040, 0x507e: 0x0040, 0x507f: 0x0040, - // Block 0x142, offset 0x5080 - 0x5080: 0x0040, 0x5081: 0x0040, 0x5082: 0x0040, 0x5083: 0x0040, 0x5084: 0x0040, 0x5085: 0x0040, - 0x5086: 0x0040, 0x5087: 0x0040, 0x5088: 0x0040, 0x5089: 0x0040, 0x508a: 0x0040, 0x508b: 0x0040, - 0x508c: 0x0040, 0x508d: 0x0040, 0x508e: 0x0040, 0x508f: 0x0040, 0x5090: 0x0040, 0x5091: 0x0040, - 0x5092: 0x0040, 0x5093: 0x0040, 0x5094: 0x0040, 0x5095: 0x0040, 0x5096: 0x0040, 0x5097: 0x0040, - 0x5098: 0x0040, 0x5099: 0x0040, 0x509a: 0x0040, 0x509b: 0x0040, 0x509c: 0x0040, 0x509d: 0x0040, - 0x509e: 0x0040, 0x509f: 0x0040, 0x50a0: 0x0040, 0x50a1: 0x0040, 0x50a2: 0x0040, 0x50a3: 0x0040, - 0x50a4: 0x0040, 0x50a5: 0x0040, 0x50a6: 0x0040, 0x50a7: 0x0040, 0x50a8: 0x0040, 0x50a9: 0x0040, - 0x50aa: 0x0040, 0x50ab: 0x0040, 0x50ac: 0x0040, 0x50ad: 0x0040, 0x50ae: 0x0040, 0x50af: 0x0040, - // Block 0x143, offset 0x50c0 - 0x50c0: 0x0040, 0x50c1: 0x0040, 0x50c2: 0x0040, 0x50c3: 0x0040, 0x50c4: 0x0040, 0x50c5: 0x0040, - 0x50c6: 0x0040, 0x50c7: 0x0040, 0x50c8: 0x0040, 0x50c9: 0x0040, 0x50ca: 0x0040, 0x50cb: 0x0040, - 0x50cc: 0x0040, 0x50cd: 0x0040, 0x50ce: 0x0040, 0x50cf: 0x0040, 0x50d0: 0x0040, 0x50d1: 0x0040, - 0x50d2: 0x0040, 0x50d3: 0x0040, 0x50d4: 0x0040, 0x50d5: 0x0040, 0x50d6: 0x0040, 0x50d7: 0x0040, - 0x50d8: 0x0040, 0x50d9: 0x0040, 0x50da: 0x0040, 0x50db: 0x0040, 0x50dc: 0x0040, 0x50dd: 0x0040, - 0x50de: 0x0040, 0x50df: 0x0040, 0x50e0: 0x0040, 0x50e1: 0x0040, 0x50e2: 0x0040, 0x50e3: 0x0040, - 0x50e4: 0x0040, 0x50e5: 0x0040, 0x50e6: 0x0040, 0x50e7: 0x0040, 0x50e8: 0x0040, 0x50e9: 0x0040, - 0x50ea: 0x0040, 0x50eb: 0x0040, 0x50ec: 0x0040, 0x50ed: 0x0040, 0x50ee: 0x0040, 0x50ef: 0x0040, - 0x50f0: 0x0040, 0x50f1: 0x0040, 0x50f2: 0x0040, 0x50f3: 0x0040, 0x50f4: 0x0040, 0x50f5: 0x0040, - 0x50f6: 0x0040, 0x50f7: 0x0040, 0x50f8: 0x0040, 0x50f9: 0x0040, 0x50fa: 0x0040, 0x50fb: 0x0040, - 0x50fc: 0x0040, 0x50fd: 0x0040, -} - -// derivedPropertiesIndex: 36 blocks, 2304 entries, 4608 bytes -// Block 0 is the zero block. -var derivedPropertiesIndex = [2304]uint16{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc6: 0x05, 0xc7: 0x06, - 0xc8: 0x05, 0xc9: 0x05, 0xca: 0x07, 0xcb: 0x08, 0xcc: 0x09, 0xcd: 0x0a, 0xce: 0x0b, 0xcf: 0x0c, - 0xd0: 0x05, 0xd1: 0x05, 0xd2: 0x0d, 0xd3: 0x05, 0xd4: 0x0e, 0xd5: 0x0f, 0xd6: 0x10, 0xd7: 0x11, - 0xd8: 0x12, 0xd9: 0x13, 0xda: 0x14, 0xdb: 0x15, 0xdc: 0x16, 0xdd: 0x17, 0xde: 0x18, 0xdf: 0x19, - 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, - 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x0a, 0xec: 0x0a, 0xed: 0x0b, 0xee: 0x0c, 0xef: 0x0d, - 0xf0: 0x1d, 0xf3: 0x20, 0xf4: 0x21, - // Block 0x4, offset 0x100 - 0x120: 0x1a, 0x121: 0x1b, 0x122: 0x1c, 0x123: 0x1d, 0x124: 0x1e, 0x125: 0x1f, 0x126: 0x20, 0x127: 0x21, - 0x128: 0x22, 0x129: 0x23, 0x12a: 0x24, 0x12b: 0x25, 0x12c: 0x26, 0x12d: 0x27, 0x12e: 0x28, 0x12f: 0x29, - 0x130: 0x2a, 0x131: 0x2b, 0x132: 0x2c, 0x133: 0x2d, 0x134: 0x2e, 0x135: 0x2f, 0x136: 0x30, 0x137: 0x31, - 0x138: 0x32, 0x139: 0x33, 0x13a: 0x34, 0x13b: 0x35, 0x13c: 0x36, 0x13d: 0x37, 0x13e: 0x38, 0x13f: 0x39, - // Block 0x5, offset 0x140 - 0x140: 0x3a, 0x141: 0x3b, 0x142: 0x3c, 0x143: 0x3d, 0x144: 0x3e, 0x145: 0x3e, 0x146: 0x3e, 0x147: 0x3e, - 0x148: 0x05, 0x149: 0x3f, 0x14a: 0x40, 0x14b: 0x41, 0x14c: 0x42, 0x14d: 0x43, 0x14e: 0x44, 0x14f: 0x45, - 0x150: 0x46, 0x151: 0x05, 0x152: 0x05, 0x153: 0x05, 0x154: 0x05, 0x155: 0x05, 0x156: 0x05, 0x157: 0x05, - 0x158: 0x05, 0x159: 0x47, 0x15a: 0x48, 0x15b: 0x49, 0x15c: 0x4a, 0x15d: 0x4b, 0x15e: 0x4c, 0x15f: 0x4d, - 0x160: 0x4e, 0x161: 0x4f, 0x162: 0x50, 0x163: 0x51, 0x164: 0x52, 0x165: 0x53, 0x166: 0x54, 0x167: 0x55, - 0x168: 0x56, 0x169: 0x57, 0x16a: 0x58, 0x16c: 0x59, 0x16d: 0x5a, 0x16e: 0x5b, 0x16f: 0x5c, - 0x170: 0x5d, 0x171: 0x5e, 0x172: 0x5f, 0x173: 0x60, 0x174: 0x61, 0x175: 0x62, 0x176: 0x63, 0x177: 0x64, - 0x178: 0x05, 0x179: 0x05, 0x17a: 0x65, 0x17b: 0x05, 0x17c: 0x66, 0x17d: 0x67, 0x17e: 0x68, 0x17f: 0x69, - // Block 0x6, offset 0x180 - 0x180: 0x6a, 0x181: 0x6b, 0x182: 0x6c, 0x183: 0x6d, 0x184: 0x6e, 0x185: 0x6f, 0x186: 0x70, 0x187: 0x71, - 0x188: 0x71, 0x189: 0x71, 0x18a: 0x71, 0x18b: 0x71, 0x18c: 0x71, 0x18d: 0x71, 0x18e: 0x71, 0x18f: 0x72, - 0x190: 0x73, 0x191: 0x74, 0x192: 0x71, 0x193: 0x71, 0x194: 0x71, 0x195: 0x71, 0x196: 0x71, 0x197: 0x71, - 0x198: 0x71, 0x199: 0x71, 0x19a: 0x71, 0x19b: 0x71, 0x19c: 0x71, 0x19d: 0x71, 0x19e: 0x71, 0x19f: 0x71, - 0x1a0: 0x71, 0x1a1: 0x71, 0x1a2: 0x71, 0x1a3: 0x71, 0x1a4: 0x71, 0x1a5: 0x71, 0x1a6: 0x71, 0x1a7: 0x71, - 0x1a8: 0x71, 0x1a9: 0x71, 0x1aa: 0x71, 0x1ab: 0x71, 0x1ac: 0x71, 0x1ad: 0x75, 0x1ae: 0x76, 0x1af: 0x77, - 0x1b0: 0x78, 0x1b1: 0x79, 0x1b2: 0x05, 0x1b3: 0x7a, 0x1b4: 0x7b, 0x1b5: 0x7c, 0x1b6: 0x7d, 0x1b7: 0x7e, - 0x1b8: 0x7f, 0x1b9: 0x80, 0x1ba: 0x81, 0x1bb: 0x82, 0x1bc: 0x83, 0x1bd: 0x83, 0x1be: 0x83, 0x1bf: 0x84, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x85, 0x1c1: 0x86, 0x1c2: 0x87, 0x1c3: 0x88, 0x1c4: 0x89, 0x1c5: 0x8a, 0x1c6: 0x8b, 0x1c7: 0x8c, - 0x1c8: 0x8d, 0x1c9: 0x71, 0x1ca: 0x71, 0x1cb: 0x8e, 0x1cc: 0x83, 0x1cd: 0x8f, 0x1ce: 0x71, 0x1cf: 0x71, - 0x1d0: 0x90, 0x1d1: 0x90, 0x1d2: 0x90, 0x1d3: 0x90, 0x1d4: 0x90, 0x1d5: 0x90, 0x1d6: 0x90, 0x1d7: 0x90, - 0x1d8: 0x90, 0x1d9: 0x90, 0x1da: 0x90, 0x1db: 0x90, 0x1dc: 0x90, 0x1dd: 0x90, 0x1de: 0x90, 0x1df: 0x90, - 0x1e0: 0x90, 0x1e1: 0x90, 0x1e2: 0x90, 0x1e3: 0x90, 0x1e4: 0x90, 0x1e5: 0x90, 0x1e6: 0x90, 0x1e7: 0x90, - 0x1e8: 0x90, 0x1e9: 0x90, 0x1ea: 0x90, 0x1eb: 0x90, 0x1ec: 0x90, 0x1ed: 0x90, 0x1ee: 0x90, 0x1ef: 0x90, - 0x1f0: 0x90, 0x1f1: 0x90, 0x1f2: 0x90, 0x1f3: 0x90, 0x1f4: 0x90, 0x1f5: 0x90, 0x1f6: 0x90, 0x1f7: 0x90, - 0x1f8: 0x90, 0x1f9: 0x90, 0x1fa: 0x90, 0x1fb: 0x90, 0x1fc: 0x90, 0x1fd: 0x90, 0x1fe: 0x90, 0x1ff: 0x90, - // Block 0x8, offset 0x200 - 0x200: 0x90, 0x201: 0x90, 0x202: 0x90, 0x203: 0x90, 0x204: 0x90, 0x205: 0x90, 0x206: 0x90, 0x207: 0x90, - 0x208: 0x90, 0x209: 0x90, 0x20a: 0x90, 0x20b: 0x90, 0x20c: 0x90, 0x20d: 0x90, 0x20e: 0x90, 0x20f: 0x90, - 0x210: 0x90, 0x211: 0x90, 0x212: 0x90, 0x213: 0x90, 0x214: 0x90, 0x215: 0x90, 0x216: 0x90, 0x217: 0x90, - 0x218: 0x90, 0x219: 0x90, 0x21a: 0x90, 0x21b: 0x90, 0x21c: 0x90, 0x21d: 0x90, 0x21e: 0x90, 0x21f: 0x90, - 0x220: 0x90, 0x221: 0x90, 0x222: 0x90, 0x223: 0x90, 0x224: 0x90, 0x225: 0x90, 0x226: 0x90, 0x227: 0x90, - 0x228: 0x90, 0x229: 0x90, 0x22a: 0x90, 0x22b: 0x90, 0x22c: 0x90, 0x22d: 0x90, 0x22e: 0x90, 0x22f: 0x90, - 0x230: 0x90, 0x231: 0x90, 0x232: 0x90, 0x233: 0x90, 0x234: 0x90, 0x235: 0x90, 0x236: 0x91, 0x237: 0x71, - 0x238: 0x90, 0x239: 0x90, 0x23a: 0x90, 0x23b: 0x90, 0x23c: 0x90, 0x23d: 0x90, 0x23e: 0x90, 0x23f: 0x90, - // Block 0x9, offset 0x240 - 0x240: 0x90, 0x241: 0x90, 0x242: 0x90, 0x243: 0x90, 0x244: 0x90, 0x245: 0x90, 0x246: 0x90, 0x247: 0x90, - 0x248: 0x90, 0x249: 0x90, 0x24a: 0x90, 0x24b: 0x90, 0x24c: 0x90, 0x24d: 0x90, 0x24e: 0x90, 0x24f: 0x90, - 0x250: 0x90, 0x251: 0x90, 0x252: 0x90, 0x253: 0x90, 0x254: 0x90, 0x255: 0x90, 0x256: 0x90, 0x257: 0x90, - 0x258: 0x90, 0x259: 0x90, 0x25a: 0x90, 0x25b: 0x90, 0x25c: 0x90, 0x25d: 0x90, 0x25e: 0x90, 0x25f: 0x90, - 0x260: 0x90, 0x261: 0x90, 0x262: 0x90, 0x263: 0x90, 0x264: 0x90, 0x265: 0x90, 0x266: 0x90, 0x267: 0x90, - 0x268: 0x90, 0x269: 0x90, 0x26a: 0x90, 0x26b: 0x90, 0x26c: 0x90, 0x26d: 0x90, 0x26e: 0x90, 0x26f: 0x90, - 0x270: 0x90, 0x271: 0x90, 0x272: 0x90, 0x273: 0x90, 0x274: 0x90, 0x275: 0x90, 0x276: 0x90, 0x277: 0x90, - 0x278: 0x90, 0x279: 0x90, 0x27a: 0x90, 0x27b: 0x90, 0x27c: 0x90, 0x27d: 0x90, 0x27e: 0x90, 0x27f: 0x90, - // Block 0xa, offset 0x280 - 0x280: 0x90, 0x281: 0x90, 0x282: 0x90, 0x283: 0x90, 0x284: 0x90, 0x285: 0x90, 0x286: 0x90, 0x287: 0x90, - 0x288: 0x90, 0x289: 0x90, 0x28a: 0x90, 0x28b: 0x90, 0x28c: 0x90, 0x28d: 0x90, 0x28e: 0x90, 0x28f: 0x90, - 0x290: 0x90, 0x291: 0x90, 0x292: 0x90, 0x293: 0x90, 0x294: 0x90, 0x295: 0x90, 0x296: 0x90, 0x297: 0x90, - 0x298: 0x90, 0x299: 0x90, 0x29a: 0x90, 0x29b: 0x90, 0x29c: 0x90, 0x29d: 0x90, 0x29e: 0x90, 0x29f: 0x90, - 0x2a0: 0x90, 0x2a1: 0x90, 0x2a2: 0x90, 0x2a3: 0x90, 0x2a4: 0x90, 0x2a5: 0x90, 0x2a6: 0x90, 0x2a7: 0x90, - 0x2a8: 0x90, 0x2a9: 0x90, 0x2aa: 0x90, 0x2ab: 0x90, 0x2ac: 0x90, 0x2ad: 0x90, 0x2ae: 0x90, 0x2af: 0x90, - 0x2b0: 0x90, 0x2b1: 0x90, 0x2b2: 0x90, 0x2b3: 0x90, 0x2b4: 0x90, 0x2b5: 0x90, 0x2b6: 0x90, 0x2b7: 0x90, - 0x2b8: 0x90, 0x2b9: 0x90, 0x2ba: 0x90, 0x2bb: 0x90, 0x2bc: 0x90, 0x2bd: 0x90, 0x2be: 0x90, 0x2bf: 0x92, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x05, 0x2c1: 0x05, 0x2c2: 0x05, 0x2c3: 0x05, 0x2c4: 0x05, 0x2c5: 0x05, 0x2c6: 0x05, 0x2c7: 0x05, - 0x2c8: 0x05, 0x2c9: 0x05, 0x2ca: 0x05, 0x2cb: 0x05, 0x2cc: 0x05, 0x2cd: 0x05, 0x2ce: 0x05, 0x2cf: 0x05, - 0x2d0: 0x05, 0x2d1: 0x05, 0x2d2: 0x93, 0x2d3: 0x94, 0x2d4: 0x05, 0x2d5: 0x05, 0x2d6: 0x05, 0x2d7: 0x05, - 0x2d8: 0x95, 0x2d9: 0x96, 0x2da: 0x97, 0x2db: 0x98, 0x2dc: 0x99, 0x2dd: 0x9a, 0x2de: 0x9b, 0x2df: 0x9c, - 0x2e0: 0x9d, 0x2e1: 0x9e, 0x2e2: 0x05, 0x2e3: 0x9f, 0x2e4: 0xa0, 0x2e5: 0xa1, 0x2e6: 0xa2, 0x2e7: 0xa3, - 0x2e8: 0xa4, 0x2e9: 0xa5, 0x2ea: 0xa6, 0x2eb: 0xa7, 0x2ec: 0xa8, 0x2ed: 0xa9, 0x2ee: 0x05, 0x2ef: 0xaa, - 0x2f0: 0x05, 0x2f1: 0x05, 0x2f2: 0x05, 0x2f3: 0x05, 0x2f4: 0x05, 0x2f5: 0x05, 0x2f6: 0x05, 0x2f7: 0x05, - 0x2f8: 0x05, 0x2f9: 0x05, 0x2fa: 0x05, 0x2fb: 0x05, 0x2fc: 0x05, 0x2fd: 0x05, 0x2fe: 0x05, 0x2ff: 0x05, - // Block 0xc, offset 0x300 - 0x300: 0x05, 0x301: 0x05, 0x302: 0x05, 0x303: 0x05, 0x304: 0x05, 0x305: 0x05, 0x306: 0x05, 0x307: 0x05, - 0x308: 0x05, 0x309: 0x05, 0x30a: 0x05, 0x30b: 0x05, 0x30c: 0x05, 0x30d: 0x05, 0x30e: 0x05, 0x30f: 0x05, - 0x310: 0x05, 0x311: 0x05, 0x312: 0x05, 0x313: 0x05, 0x314: 0x05, 0x315: 0x05, 0x316: 0x05, 0x317: 0x05, - 0x318: 0x05, 0x319: 0x05, 0x31a: 0x05, 0x31b: 0x05, 0x31c: 0x05, 0x31d: 0x05, 0x31e: 0x05, 0x31f: 0x05, - 0x320: 0x05, 0x321: 0x05, 0x322: 0x05, 0x323: 0x05, 0x324: 0x05, 0x325: 0x05, 0x326: 0x05, 0x327: 0x05, - 0x328: 0x05, 0x329: 0x05, 0x32a: 0x05, 0x32b: 0x05, 0x32c: 0x05, 0x32d: 0x05, 0x32e: 0x05, 0x32f: 0x05, - 0x330: 0x05, 0x331: 0x05, 0x332: 0x05, 0x333: 0x05, 0x334: 0x05, 0x335: 0x05, 0x336: 0x05, 0x337: 0x05, - 0x338: 0x05, 0x339: 0x05, 0x33a: 0x05, 0x33b: 0x05, 0x33c: 0x05, 0x33d: 0x05, 0x33e: 0x05, 0x33f: 0x05, - // Block 0xd, offset 0x340 - 0x340: 0x05, 0x341: 0x05, 0x342: 0x05, 0x343: 0x05, 0x344: 0x05, 0x345: 0x05, 0x346: 0x05, 0x347: 0x05, - 0x348: 0x05, 0x349: 0x05, 0x34a: 0x05, 0x34b: 0x05, 0x34c: 0x05, 0x34d: 0x05, 0x34e: 0x05, 0x34f: 0x05, - 0x350: 0x05, 0x351: 0x05, 0x352: 0x05, 0x353: 0x05, 0x354: 0x05, 0x355: 0x05, 0x356: 0x05, 0x357: 0x05, - 0x358: 0x05, 0x359: 0x05, 0x35a: 0x05, 0x35b: 0x05, 0x35c: 0x05, 0x35d: 0x05, 0x35e: 0xab, 0x35f: 0xac, - // Block 0xe, offset 0x380 - 0x380: 0x3e, 0x381: 0x3e, 0x382: 0x3e, 0x383: 0x3e, 0x384: 0x3e, 0x385: 0x3e, 0x386: 0x3e, 0x387: 0x3e, - 0x388: 0x3e, 0x389: 0x3e, 0x38a: 0x3e, 0x38b: 0x3e, 0x38c: 0x3e, 0x38d: 0x3e, 0x38e: 0x3e, 0x38f: 0x3e, - 0x390: 0x3e, 0x391: 0x3e, 0x392: 0x3e, 0x393: 0x3e, 0x394: 0x3e, 0x395: 0x3e, 0x396: 0x3e, 0x397: 0x3e, - 0x398: 0x3e, 0x399: 0x3e, 0x39a: 0x3e, 0x39b: 0x3e, 0x39c: 0x3e, 0x39d: 0x3e, 0x39e: 0x3e, 0x39f: 0x3e, - 0x3a0: 0x3e, 0x3a1: 0x3e, 0x3a2: 0x3e, 0x3a3: 0x3e, 0x3a4: 0x3e, 0x3a5: 0x3e, 0x3a6: 0x3e, 0x3a7: 0x3e, - 0x3a8: 0x3e, 0x3a9: 0x3e, 0x3aa: 0x3e, 0x3ab: 0x3e, 0x3ac: 0x3e, 0x3ad: 0x3e, 0x3ae: 0x3e, 0x3af: 0x3e, - 0x3b0: 0x3e, 0x3b1: 0x3e, 0x3b2: 0x3e, 0x3b3: 0x3e, 0x3b4: 0x3e, 0x3b5: 0x3e, 0x3b6: 0x3e, 0x3b7: 0x3e, - 0x3b8: 0x3e, 0x3b9: 0x3e, 0x3ba: 0x3e, 0x3bb: 0x3e, 0x3bc: 0x3e, 0x3bd: 0x3e, 0x3be: 0x3e, 0x3bf: 0x3e, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x3e, 0x3c1: 0x3e, 0x3c2: 0x3e, 0x3c3: 0x3e, 0x3c4: 0x3e, 0x3c5: 0x3e, 0x3c6: 0x3e, 0x3c7: 0x3e, - 0x3c8: 0x3e, 0x3c9: 0x3e, 0x3ca: 0x3e, 0x3cb: 0x3e, 0x3cc: 0x3e, 0x3cd: 0x3e, 0x3ce: 0x3e, 0x3cf: 0x3e, - 0x3d0: 0x3e, 0x3d1: 0x3e, 0x3d2: 0x3e, 0x3d3: 0x3e, 0x3d4: 0x3e, 0x3d5: 0x3e, 0x3d6: 0x3e, 0x3d7: 0x3e, - 0x3d8: 0x3e, 0x3d9: 0x3e, 0x3da: 0x3e, 0x3db: 0x3e, 0x3dc: 0x3e, 0x3dd: 0x3e, 0x3de: 0x3e, 0x3df: 0x3e, - 0x3e0: 0x3e, 0x3e1: 0x3e, 0x3e2: 0x3e, 0x3e3: 0x3e, 0x3e4: 0x83, 0x3e5: 0x83, 0x3e6: 0x83, 0x3e7: 0x83, - 0x3e8: 0xad, 0x3e9: 0xae, 0x3ea: 0x83, 0x3eb: 0xaf, 0x3ec: 0xb0, 0x3ed: 0xb1, 0x3ee: 0x71, 0x3ef: 0xb2, - 0x3f0: 0x71, 0x3f1: 0x71, 0x3f2: 0x71, 0x3f3: 0x71, 0x3f4: 0x71, 0x3f5: 0xb3, 0x3f6: 0xb4, 0x3f7: 0xb5, - 0x3f8: 0xb6, 0x3f9: 0xb7, 0x3fa: 0x71, 0x3fb: 0xb8, 0x3fc: 0xb9, 0x3fd: 0xba, 0x3fe: 0xbb, 0x3ff: 0xbc, - // Block 0x10, offset 0x400 - 0x400: 0xbd, 0x401: 0xbe, 0x402: 0x05, 0x403: 0xbf, 0x404: 0xc0, 0x405: 0xc1, 0x406: 0xc2, 0x407: 0xc3, - 0x40a: 0xc4, 0x40b: 0xc5, 0x40c: 0xc6, 0x40d: 0xc7, 0x40e: 0xc8, 0x40f: 0xc9, - 0x410: 0x05, 0x411: 0x05, 0x412: 0xca, 0x413: 0xcb, 0x414: 0xcc, 0x415: 0xcd, - 0x418: 0x05, 0x419: 0x05, 0x41a: 0x05, 0x41b: 0x05, 0x41c: 0xce, 0x41d: 0xcf, - 0x420: 0xd0, 0x421: 0xd1, 0x422: 0xd2, 0x423: 0xd3, 0x424: 0xd4, 0x426: 0xd5, 0x427: 0xb4, - 0x428: 0xd6, 0x429: 0xd7, 0x42a: 0xd8, 0x42b: 0xd9, 0x42c: 0xda, 0x42d: 0xdb, 0x42e: 0xdc, - 0x430: 0x05, 0x431: 0x5f, 0x432: 0xdd, 0x433: 0xde, - 0x439: 0xdf, - // Block 0x11, offset 0x440 - 0x440: 0xe0, 0x441: 0xe1, 0x442: 0xe2, 0x443: 0xe3, 0x444: 0xe4, 0x445: 0xe5, 0x446: 0xe6, 0x447: 0xe7, - 0x448: 0xe8, 0x44a: 0xe9, 0x44b: 0xea, 0x44c: 0xeb, 0x44d: 0xec, - 0x450: 0xed, 0x451: 0xee, 0x452: 0xef, 0x453: 0xf0, 0x456: 0xf1, 0x457: 0xf2, - 0x458: 0xf3, 0x459: 0xf4, 0x45a: 0xf5, 0x45b: 0xf6, 0x45c: 0xf7, - 0x462: 0xf8, 0x463: 0xf9, - 0x46b: 0xfa, - 0x470: 0xfb, 0x471: 0xfc, 0x472: 0xfd, - // Block 0x12, offset 0x480 - 0x480: 0x05, 0x481: 0x05, 0x482: 0x05, 0x483: 0x05, 0x484: 0x05, 0x485: 0x05, 0x486: 0x05, 0x487: 0x05, - 0x488: 0x05, 0x489: 0x05, 0x48a: 0x05, 0x48b: 0x05, 0x48c: 0x05, 0x48d: 0x05, 0x48e: 0xfe, - 0x490: 0x71, 0x491: 0xff, 0x492: 0x05, 0x493: 0x05, 0x494: 0x05, 0x495: 0x100, - // Block 0x13, offset 0x4c0 - 0x4c0: 0x05, 0x4c1: 0x05, 0x4c2: 0x05, 0x4c3: 0x05, 0x4c4: 0x05, 0x4c5: 0x05, 0x4c6: 0x05, 0x4c7: 0x05, - 0x4c8: 0x05, 0x4c9: 0x05, 0x4ca: 0x05, 0x4cb: 0x05, 0x4cc: 0x05, 0x4cd: 0x05, 0x4ce: 0x05, 0x4cf: 0x05, - 0x4d0: 0x101, - // Block 0x14, offset 0x500 - 0x510: 0x05, 0x511: 0x05, 0x512: 0x05, 0x513: 0x05, 0x514: 0x05, 0x515: 0x05, 0x516: 0x05, 0x517: 0x05, - 0x518: 0x05, 0x519: 0x102, - // Block 0x15, offset 0x540 - 0x560: 0x05, 0x561: 0x05, 0x562: 0x05, 0x563: 0x05, 0x564: 0x05, 0x565: 0x05, 0x566: 0x05, 0x567: 0x05, - 0x568: 0xfa, 0x569: 0x103, 0x56b: 0x104, 0x56c: 0x105, 0x56d: 0x106, 0x56e: 0x107, - 0x57c: 0x05, 0x57d: 0x108, 0x57e: 0x109, 0x57f: 0x10a, - // Block 0x16, offset 0x580 - 0x580: 0x05, 0x581: 0x05, 0x582: 0x05, 0x583: 0x05, 0x584: 0x05, 0x585: 0x05, 0x586: 0x05, 0x587: 0x05, - 0x588: 0x05, 0x589: 0x05, 0x58a: 0x05, 0x58b: 0x05, 0x58c: 0x05, 0x58d: 0x05, 0x58e: 0x05, 0x58f: 0x05, - 0x590: 0x05, 0x591: 0x05, 0x592: 0x05, 0x593: 0x05, 0x594: 0x05, 0x595: 0x05, 0x596: 0x05, 0x597: 0x05, - 0x598: 0x05, 0x599: 0x05, 0x59a: 0x05, 0x59b: 0x05, 0x59c: 0x05, 0x59d: 0x05, 0x59e: 0x05, 0x59f: 0x10b, - 0x5a0: 0x05, 0x5a1: 0x05, 0x5a2: 0x05, 0x5a3: 0x05, 0x5a4: 0x05, 0x5a5: 0x05, 0x5a6: 0x05, 0x5a7: 0x05, - 0x5a8: 0x05, 0x5a9: 0x05, 0x5aa: 0x05, 0x5ab: 0xdd, - // Block 0x17, offset 0x5c0 - 0x5c0: 0x10c, - 0x5f0: 0x05, 0x5f1: 0x10d, 0x5f2: 0x10e, - // Block 0x18, offset 0x600 - 0x600: 0x71, 0x601: 0x71, 0x602: 0x71, 0x603: 0x10f, 0x604: 0x110, 0x605: 0x111, 0x606: 0x112, 0x607: 0x113, - 0x608: 0xc1, 0x609: 0x114, 0x60c: 0x71, 0x60d: 0x115, - 0x610: 0x71, 0x611: 0x116, 0x612: 0x117, 0x613: 0x118, 0x614: 0x119, 0x615: 0x11a, 0x616: 0x71, 0x617: 0x71, - 0x618: 0x71, 0x619: 0x71, 0x61a: 0x11b, 0x61b: 0x71, 0x61c: 0x71, 0x61d: 0x71, 0x61e: 0x71, 0x61f: 0x11c, - 0x620: 0x71, 0x621: 0x71, 0x622: 0x71, 0x623: 0x71, 0x624: 0x71, 0x625: 0x71, 0x626: 0x71, 0x627: 0x71, - 0x628: 0x11d, 0x629: 0x11e, 0x62a: 0x11f, - // Block 0x19, offset 0x640 - 0x640: 0x120, - 0x660: 0x05, 0x661: 0x05, 0x662: 0x05, 0x663: 0x121, 0x664: 0x122, 0x665: 0x123, - 0x678: 0x124, 0x679: 0x125, 0x67a: 0x126, 0x67b: 0x127, - // Block 0x1a, offset 0x680 - 0x680: 0x128, 0x681: 0x71, 0x682: 0x129, 0x683: 0x12a, 0x684: 0x12b, 0x685: 0x128, 0x686: 0x12c, 0x687: 0x12d, - 0x688: 0x12e, 0x689: 0x12f, 0x68c: 0x71, 0x68d: 0x71, 0x68e: 0x71, 0x68f: 0x71, - 0x690: 0x71, 0x691: 0x71, 0x692: 0x71, 0x693: 0x71, 0x694: 0x71, 0x695: 0x71, 0x696: 0x71, 0x697: 0x71, - 0x698: 0x71, 0x699: 0x71, 0x69a: 0x71, 0x69b: 0x130, 0x69c: 0x71, 0x69d: 0x131, 0x69e: 0x71, 0x69f: 0x132, - 0x6a0: 0x133, 0x6a1: 0x134, 0x6a2: 0x135, 0x6a4: 0x136, 0x6a5: 0x137, 0x6a6: 0x138, 0x6a7: 0x139, - // Block 0x1b, offset 0x6c0 - 0x6c0: 0x90, 0x6c1: 0x90, 0x6c2: 0x90, 0x6c3: 0x90, 0x6c4: 0x90, 0x6c5: 0x90, 0x6c6: 0x90, 0x6c7: 0x90, - 0x6c8: 0x90, 0x6c9: 0x90, 0x6ca: 0x90, 0x6cb: 0x90, 0x6cc: 0x90, 0x6cd: 0x90, 0x6ce: 0x90, 0x6cf: 0x90, - 0x6d0: 0x90, 0x6d1: 0x90, 0x6d2: 0x90, 0x6d3: 0x90, 0x6d4: 0x90, 0x6d5: 0x90, 0x6d6: 0x90, 0x6d7: 0x90, - 0x6d8: 0x90, 0x6d9: 0x90, 0x6da: 0x90, 0x6db: 0x13a, 0x6dc: 0x90, 0x6dd: 0x90, 0x6de: 0x90, 0x6df: 0x90, - 0x6e0: 0x90, 0x6e1: 0x90, 0x6e2: 0x90, 0x6e3: 0x90, 0x6e4: 0x90, 0x6e5: 0x90, 0x6e6: 0x90, 0x6e7: 0x90, - 0x6e8: 0x90, 0x6e9: 0x90, 0x6ea: 0x90, 0x6eb: 0x90, 0x6ec: 0x90, 0x6ed: 0x90, 0x6ee: 0x90, 0x6ef: 0x90, - 0x6f0: 0x90, 0x6f1: 0x90, 0x6f2: 0x90, 0x6f3: 0x90, 0x6f4: 0x90, 0x6f5: 0x90, 0x6f6: 0x90, 0x6f7: 0x90, - 0x6f8: 0x90, 0x6f9: 0x90, 0x6fa: 0x90, 0x6fb: 0x90, 0x6fc: 0x90, 0x6fd: 0x90, 0x6fe: 0x90, 0x6ff: 0x90, - // Block 0x1c, offset 0x700 - 0x700: 0x90, 0x701: 0x90, 0x702: 0x90, 0x703: 0x90, 0x704: 0x90, 0x705: 0x90, 0x706: 0x90, 0x707: 0x90, - 0x708: 0x90, 0x709: 0x90, 0x70a: 0x90, 0x70b: 0x90, 0x70c: 0x90, 0x70d: 0x90, 0x70e: 0x90, 0x70f: 0x90, - 0x710: 0x90, 0x711: 0x90, 0x712: 0x90, 0x713: 0x90, 0x714: 0x90, 0x715: 0x90, 0x716: 0x90, 0x717: 0x90, - 0x718: 0x90, 0x719: 0x90, 0x71a: 0x90, 0x71b: 0x90, 0x71c: 0x13b, 0x71d: 0x90, 0x71e: 0x90, 0x71f: 0x90, - 0x720: 0x13c, 0x721: 0x90, 0x722: 0x90, 0x723: 0x90, 0x724: 0x90, 0x725: 0x90, 0x726: 0x90, 0x727: 0x90, - 0x728: 0x90, 0x729: 0x90, 0x72a: 0x90, 0x72b: 0x90, 0x72c: 0x90, 0x72d: 0x90, 0x72e: 0x90, 0x72f: 0x90, - 0x730: 0x90, 0x731: 0x90, 0x732: 0x90, 0x733: 0x90, 0x734: 0x90, 0x735: 0x90, 0x736: 0x90, 0x737: 0x90, - 0x738: 0x90, 0x739: 0x90, 0x73a: 0x90, 0x73b: 0x90, 0x73c: 0x90, 0x73d: 0x90, 0x73e: 0x90, 0x73f: 0x90, - // Block 0x1d, offset 0x740 - 0x740: 0x90, 0x741: 0x90, 0x742: 0x90, 0x743: 0x90, 0x744: 0x90, 0x745: 0x90, 0x746: 0x90, 0x747: 0x90, - 0x748: 0x90, 0x749: 0x90, 0x74a: 0x90, 0x74b: 0x90, 0x74c: 0x90, 0x74d: 0x90, 0x74e: 0x90, 0x74f: 0x90, - 0x750: 0x90, 0x751: 0x90, 0x752: 0x90, 0x753: 0x90, 0x754: 0x90, 0x755: 0x90, 0x756: 0x90, 0x757: 0x90, - 0x758: 0x90, 0x759: 0x90, 0x75a: 0x90, 0x75b: 0x90, 0x75c: 0x90, 0x75d: 0x90, 0x75e: 0x90, 0x75f: 0x90, - 0x760: 0x90, 0x761: 0x90, 0x762: 0x90, 0x763: 0x90, 0x764: 0x90, 0x765: 0x90, 0x766: 0x90, 0x767: 0x90, - 0x768: 0x90, 0x769: 0x90, 0x76a: 0x90, 0x76b: 0x90, 0x76c: 0x90, 0x76d: 0x90, 0x76e: 0x90, 0x76f: 0x90, - 0x770: 0x90, 0x771: 0x90, 0x772: 0x90, 0x773: 0x90, 0x774: 0x90, 0x775: 0x90, 0x776: 0x90, 0x777: 0x90, - 0x778: 0x90, 0x779: 0x90, 0x77a: 0x13d, - // Block 0x1e, offset 0x780 - 0x7a0: 0x83, 0x7a1: 0x83, 0x7a2: 0x83, 0x7a3: 0x83, 0x7a4: 0x83, 0x7a5: 0x83, 0x7a6: 0x83, 0x7a7: 0x83, - 0x7a8: 0x13e, - // Block 0x1f, offset 0x7c0 - 0x7d0: 0x0e, 0x7d1: 0x0f, 0x7d2: 0x10, 0x7d3: 0x11, 0x7d4: 0x12, 0x7d6: 0x13, 0x7d7: 0x0a, - 0x7d8: 0x14, 0x7db: 0x15, 0x7dd: 0x16, 0x7de: 0x17, 0x7df: 0x18, - 0x7e0: 0x07, 0x7e1: 0x07, 0x7e2: 0x07, 0x7e3: 0x07, 0x7e4: 0x07, 0x7e5: 0x07, 0x7e6: 0x07, 0x7e7: 0x07, - 0x7e8: 0x07, 0x7e9: 0x07, 0x7ea: 0x19, 0x7eb: 0x1a, 0x7ec: 0x1b, 0x7ef: 0x1c, - // Block 0x20, offset 0x800 - 0x800: 0x13f, 0x801: 0x3e, 0x804: 0x3e, 0x805: 0x3e, 0x806: 0x3e, 0x807: 0x140, - // Block 0x21, offset 0x840 - 0x840: 0x3e, 0x841: 0x3e, 0x842: 0x3e, 0x843: 0x3e, 0x844: 0x3e, 0x845: 0x3e, 0x846: 0x3e, 0x847: 0x3e, - 0x848: 0x3e, 0x849: 0x3e, 0x84a: 0x3e, 0x84b: 0x3e, 0x84c: 0x3e, 0x84d: 0x3e, 0x84e: 0x3e, 0x84f: 0x3e, - 0x850: 0x3e, 0x851: 0x3e, 0x852: 0x3e, 0x853: 0x3e, 0x854: 0x3e, 0x855: 0x3e, 0x856: 0x3e, 0x857: 0x3e, - 0x858: 0x3e, 0x859: 0x3e, 0x85a: 0x3e, 0x85b: 0x3e, 0x85c: 0x3e, 0x85d: 0x3e, 0x85e: 0x3e, 0x85f: 0x3e, - 0x860: 0x3e, 0x861: 0x3e, 0x862: 0x3e, 0x863: 0x3e, 0x864: 0x3e, 0x865: 0x3e, 0x866: 0x3e, 0x867: 0x3e, - 0x868: 0x3e, 0x869: 0x3e, 0x86a: 0x3e, 0x86b: 0x3e, 0x86c: 0x3e, 0x86d: 0x3e, 0x86e: 0x3e, 0x86f: 0x3e, - 0x870: 0x3e, 0x871: 0x3e, 0x872: 0x3e, 0x873: 0x3e, 0x874: 0x3e, 0x875: 0x3e, 0x876: 0x3e, 0x877: 0x3e, - 0x878: 0x3e, 0x879: 0x3e, 0x87a: 0x3e, 0x87b: 0x3e, 0x87c: 0x3e, 0x87d: 0x3e, 0x87e: 0x3e, 0x87f: 0x141, - // Block 0x22, offset 0x880 - 0x8a0: 0x1e, - 0x8b0: 0x0c, 0x8b1: 0x0c, 0x8b2: 0x0c, 0x8b3: 0x0c, 0x8b4: 0x0c, 0x8b5: 0x0c, 0x8b6: 0x0c, 0x8b7: 0x0c, - 0x8b8: 0x0c, 0x8b9: 0x0c, 0x8ba: 0x0c, 0x8bb: 0x0c, 0x8bc: 0x0c, 0x8bd: 0x0c, 0x8be: 0x0c, 0x8bf: 0x1f, - // Block 0x23, offset 0x8c0 - 0x8c0: 0x0c, 0x8c1: 0x0c, 0x8c2: 0x0c, 0x8c3: 0x0c, 0x8c4: 0x0c, 0x8c5: 0x0c, 0x8c6: 0x0c, 0x8c7: 0x0c, - 0x8c8: 0x0c, 0x8c9: 0x0c, 0x8ca: 0x0c, 0x8cb: 0x0c, 0x8cc: 0x0c, 0x8cd: 0x0c, 0x8ce: 0x0c, 0x8cf: 0x1f, -} - -// Total table size 25344 bytes (24KiB); checksum: 811C9DC5 diff --git a/vendor/golang.org/x/text/secure/precis/tables_test.go b/vendor/golang.org/x/text/secure/precis/tables_test.go deleted file mode 100644 index 67f5b40c6..000000000 --- a/vendor/golang.org/x/text/secure/precis/tables_test.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package precis - -import ( - "testing" - "unicode" - "unicode/utf8" - - "golang.org/x/text/runes" - "golang.org/x/text/unicode/rangetable" -) - -type tableTest struct { - rangeTable *unicode.RangeTable - prop property -} - -var exceptions = runes.Predicate(func(r rune) bool { - switch uint32(r) { - case 0x00DF, 0x03C2, 0x06FD, 0x06FE, 0x0F0B, 0x3007, 0x00B7, 0x0375, 0x05F3, - 0x05F4, 0x30FB, 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, - 0x0667, 0x0668, 0x0669, 0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4, 0x06F5, - 0x06F6, 0x06F7, 0x06F8, 0x06F9, 0x0640, 0x07FA, 0x302E, 0x302F, 0x3031, - 0x3032, 0x3033, 0x3034, 0x3035, 0x303B: - return true - default: - return false - } -}) - -// Ensure that certain properties were generated correctly. -func TestTable(t *testing.T) { - tests := []tableTest{ - tableTest{ - rangetable.Merge( - unicode.Lt, unicode.Nl, unicode.No, // Other letter digits - unicode.Me, // Modifiers - unicode.Zs, // Spaces - unicode.So, // Symbols - unicode.Pi, unicode.Pf, // Punctuation - ), - idDisOrFreePVal, - }, - tableTest{ - rangetable.New(0x30000, 0x30101, 0xDFFFF), - unassigned, - }, - } - - assigned := rangetable.Assigned(UnicodeVersion) - - for _, test := range tests { - rangetable.Visit(test.rangeTable, func(r rune) { - if !unicode.In(r, assigned) { - return - } - b := make([]byte, 4) - n := utf8.EncodeRune(b, r) - trieval, _ := dpTrie.lookup(b[:n]) - p := entry(trieval).property() - if p != test.prop && !exceptions.Contains(r) { - t.Errorf("%U: got %+x; want %+x", r, test.prop, p) - } - }) - } -} diff --git a/vendor/golang.org/x/text/secure/precis/transformer.go b/vendor/golang.org/x/text/secure/precis/transformer.go deleted file mode 100644 index 97ce5e757..000000000 --- a/vendor/golang.org/x/text/secure/precis/transformer.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package precis - -import "golang.org/x/text/transform" - -// Transformer implements the transform.Transformer interface. -type Transformer struct { - t transform.Transformer -} - -// Reset implements the transform.Transformer interface. -func (t Transformer) Reset() { t.t.Reset() } - -// Transform implements the transform.Transformer interface. -func (t Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - return t.t.Transform(dst, src, atEOF) -} - -// Bytes returns a new byte slice with the result of applying t to b. -func (t Transformer) Bytes(b []byte) []byte { - b, _, _ = transform.Bytes(t, b) - return b -} - -// String returns a string with the result of applying t to s. -func (t Transformer) String(s string) string { - s, _, _ = transform.String(t, s) - return s -} diff --git a/vendor/golang.org/x/text/secure/precis/trieval.go b/vendor/golang.org/x/text/secure/precis/trieval.go deleted file mode 100644 index 4833f9622..000000000 --- a/vendor/golang.org/x/text/secure/precis/trieval.go +++ /dev/null @@ -1,64 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package precis - -// entry is the entry of a trie table -// 7..6 property (unassigned, disallowed, maybe, valid) -// 5..0 category -type entry uint8 - -const ( - propShift = 6 - propMask = 0xc0 - catMask = 0x3f -) - -func (e entry) property() property { return property(e & propMask) } -func (e entry) category() category { return category(e & catMask) } - -type property uint8 - -// The order of these constants matter. A Profile may consider runes to be -// allowed either from pValid or idDisOrFreePVal. -const ( - unassigned property = iota << propShift - disallowed - idDisOrFreePVal // disallowed for Identifier, pValid for FreeForm - pValid -) - -// compute permutations of all properties and specialCategories. -type category uint8 - -const ( - other category = iota - - // Special rune types - joiningL - joiningD - joiningT - joiningR - viramaModifier - viramaJoinT // Virama + JoiningT - latinSmallL // U+006c - greek - greekJoinT // Greek + JoiningT - hebrew - hebrewJoinT // Hebrew + JoiningT - japanese // hirigana, katakana, han - - // Special rune types associated with contextual rules defined in - // https://tools.ietf.org/html/rfc5892#appendix-A. - // ContextO - zeroWidthNonJoiner // rule 1 - zeroWidthJoiner // rule 2 - // ContextJ - middleDot // rule 3 - greekLowerNumeralSign // rule 4 - hebrewPreceding // rule 5 and 6 - katakanaMiddleDot // rule 7 - arabicIndicDigit // rule 8 - extendedArabicIndicDigit // rule 9 - - numCategories -) diff --git a/vendor/golang.org/x/text/unicode/bidi/bidi.go b/vendor/golang.org/x/text/unicode/bidi/bidi.go deleted file mode 100644 index 3fc4a6252..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/bidi.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go gen_trieval.go gen_ranges.go - -// Package bidi contains functionality for bidirectional text support. -// -// See http://www.unicode.org/reports/tr9. -// -// NOTE: UNDER CONSTRUCTION. This API may change in backwards incompatible ways -// and without notice. -package bidi // import "golang.org/x/text/unicode/bidi" - -// TODO: -// The following functionality would not be hard to implement, but hinges on -// the definition of a Segmenter interface. For now this is up to the user. -// - Iterate over paragraphs -// - Segmenter to iterate over runs directly from a given text. -// Also: -// - Transformer for reordering? -// - Transformer (validator, really) for Bidi Rule. - -// This API tries to avoid dealing with embedding levels for now. Under the hood -// these will be computed, but the question is to which extent the user should -// know they exist. We should at some point allow the user to specify an -// embedding hierarchy, though. - -// A Direction indicates the overall flow of text. -type Direction int - -const ( - // LeftToRight indicates the text contains no right-to-left characters and - // that either there are some left-to-right characters or the option - // DefaultDirection(LeftToRight) was passed. - LeftToRight Direction = iota - - // RightToLeft indicates the text contains no left-to-right characters and - // that either there are some right-to-left characters or the option - // DefaultDirection(RightToLeft) was passed. - RightToLeft - - // Mixed indicates text contains both left-to-right and right-to-left - // characters. - Mixed - - // Neutral means that text contains no left-to-right and right-to-left - // characters and that no default direction has been set. - Neutral -) - -type options struct{} - -// An Option is an option for Bidi processing. -type Option func(*options) - -// ICU allows the user to define embedding levels. This may be used, for example, -// to use hierarchical structure of markup languages to define embeddings. -// The following option may be a way to expose this functionality in this API. -// // LevelFunc sets a function that associates nesting levels with the given text. -// // The levels function will be called with monotonically increasing values for p. -// func LevelFunc(levels func(p int) int) Option { -// panic("unimplemented") -// } - -// DefaultDirection sets the default direction for a Paragraph. The direction is -// overridden if the text contains directional characters. -func DefaultDirection(d Direction) Option { - panic("unimplemented") -} - -// A Paragraph holds a single Paragraph for Bidi processing. -type Paragraph struct { - // buffers -} - -// SetBytes configures p for the given paragraph text. It replaces text -// previously set by SetBytes or SetString. If b contains a paragraph separator -// it will only process the first paragraph and report the number of bytes -// consumed from b including this separator. Error may be non-nil if options are -// given. -func (p *Paragraph) SetBytes(b []byte, opts ...Option) (n int, err error) { - panic("unimplemented") -} - -// SetString configures p for the given paragraph text. It replaces text -// previously set by SetBytes or SetString. If b contains a paragraph separator -// it will only process the first paragraph and report the number of bytes -// consumed from b including this separator. Error may be non-nil if options are -// given. -func (p *Paragraph) SetString(s string, opts ...Option) (n int, err error) { - panic("unimplemented") -} - -// IsLeftToRight reports whether the principle direction of rendering for this -// paragraphs is left-to-right. If this returns false, the principle direction -// of rendering is right-to-left. -func (p *Paragraph) IsLeftToRight() bool { - panic("unimplemented") -} - -// Direction returns the direction of the text of this paragraph. -// -// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral. -func (p *Paragraph) Direction() Direction { - panic("unimplemented") -} - -// RunAt reports the Run at the given position of the input text. -// -// This method can be used for computing line breaks on paragraphs. -func (p *Paragraph) RunAt(pos int) Run { - panic("unimplemented") -} - -// Order computes the visual ordering of all the runs in a Paragraph. -func (p *Paragraph) Order() (Ordering, error) { - panic("unimplemented") -} - -// Line computes the visual ordering of runs for a single line starting and -// ending at the given positions in the original text. -func (p *Paragraph) Line(start, end int) (Ordering, error) { - panic("unimplemented") -} - -// An Ordering holds the computed visual order of runs of a Paragraph. Calling -// SetBytes or SetString on the originating Paragraph invalidates an Ordering. -// The methods of an Ordering should only be called by one goroutine at a time. -type Ordering struct{} - -// Direction reports the directionality of the runs. -// -// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral. -func (o *Ordering) Direction() Direction { - panic("unimplemented") -} - -// NumRuns returns the number of runs. -func (o *Ordering) NumRuns() int { - panic("unimplemented") -} - -// Run returns the ith run within the ordering. -func (o *Ordering) Run(i int) Run { - panic("unimplemented") -} - -// TODO: perhaps with options. -// // Reorder creates a reader that reads the runes in visual order per character. -// // Modifiers remain after the runes they modify. -// func (l *Runs) Reorder() io.Reader { -// panic("unimplemented") -// } - -// A Run is a continuous sequence of characters of a single direction. -type Run struct { -} - -// String returns the text of the run in its original order. -func (r *Run) String() string { - panic("unimplemented") -} - -// Bytes returns the text of the run in its original order. -func (r *Run) Bytes() []byte { - panic("unimplemented") -} - -// TODO: methods for -// - Display order -// - headers and footers -// - bracket replacement. - -// Direction reports the direction of the run. -func (r *Run) Direction() Direction { - panic("unimplemented") -} - -// Position of the Run within the text passed to SetBytes or SetString of the -// originating Paragraph value. -func (r *Run) Pos() (start, end int) { - panic("unimplemented") -} - -// AppendReverse reverses the order of characters of in, appends them to out, -// and returns the result. Modifiers will still follow the runes they modify. -// Brackets are replaced with their counterparts. -func AppendReverse(out, in []byte) []byte { - panic("unimplemented") -} - -// ReverseString reverses the order of characters in s and returns a new string. -// Modifiers will still follow the runes they modify. Brackets are replaced with -// their counterparts. -func ReverseString(s string) string { - panic("unimplemented") -} diff --git a/vendor/golang.org/x/text/unicode/bidi/bracket.go b/vendor/golang.org/x/text/unicode/bidi/bracket.go deleted file mode 100644 index 601e25920..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/bracket.go +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bidi - -import ( - "container/list" - "fmt" - "sort" -) - -// This file contains a port of the reference implementation of the -// Bidi Parentheses Algorithm: -// http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/BidiPBAReference.java -// -// The implementation in this file covers definitions BD14-BD16 and rule N0 -// of UAX#9. -// -// Some preprocessing is done for each rune before data is passed to this -// algorithm: -// - opening and closing brackets are identified -// - a bracket pair type, like '(' and ')' is assigned a unique identifier that -// is identical for the opening and closing bracket. It is left to do these -// mappings. -// - The BPA algorithm requires that bracket characters that are canonical -// equivalents of each other be able to be substituted for each other. -// It is the responsibility of the caller to do this canonicalization. -// -// In implementing BD16, this implementation departs slightly from the "logical" -// algorithm defined in UAX#9. In particular, the stack referenced there -// supports operations that go beyond a "basic" stack. An equivalent -// implementation based on a linked list is used here. - -// Bidi_Paired_Bracket_Type -// BD14. An opening paired bracket is a character whose -// Bidi_Paired_Bracket_Type property value is Open. -// -// BD15. A closing paired bracket is a character whose -// Bidi_Paired_Bracket_Type property value is Close. -type bracketType byte - -const ( - bpNone bracketType = iota - bpOpen - bpClose -) - -// bracketPair holds a pair of index values for opening and closing bracket -// location of a bracket pair. -type bracketPair struct { - opener int - closer int -} - -func (b *bracketPair) String() string { - return fmt.Sprintf("(%v, %v)", b.opener, b.closer) -} - -// bracketPairs is a slice of bracketPairs with a sort.Interface implementation. -type bracketPairs []bracketPair - -func (b bracketPairs) Len() int { return len(b) } -func (b bracketPairs) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b bracketPairs) Less(i, j int) bool { return b[i].opener < b[j].opener } - -// resolvePairedBrackets runs the paired bracket part of the UBA algorithm. -// -// For each rune, it takes the indexes into the original string, the class the -// bracket type (in pairTypes) and the bracket identifier (pairValues). It also -// takes the direction type for the start-of-sentence and the embedding level. -// -// The identifiers for bracket types are the rune of the canonicalized opening -// bracket for brackets (open or close) or 0 for runes that are not brackets. -func resolvePairedBrackets(s *isolatingRunSequence) { - p := bracketPairer{ - sos: s.sos, - openers: list.New(), - codesIsolatedRun: s.types, - indexes: s.indexes, - } - dirEmbed := L - if s.level&1 != 0 { - dirEmbed = R - } - p.locateBrackets(s.p.pairTypes, s.p.pairValues) - p.resolveBrackets(dirEmbed, s.p.initialTypes) -} - -type bracketPairer struct { - sos Class // direction corresponding to start of sequence - - // The following is a restatement of BD 16 using non-algorithmic language. - // - // A bracket pair is a pair of characters consisting of an opening - // paired bracket and a closing paired bracket such that the - // Bidi_Paired_Bracket property value of the former equals the latter, - // subject to the following constraints. - // - both characters of a pair occur in the same isolating run sequence - // - the closing character of a pair follows the opening character - // - any bracket character can belong at most to one pair, the earliest possible one - // - any bracket character not part of a pair is treated like an ordinary character - // - pairs may nest properly, but their spans may not overlap otherwise - - // Bracket characters with canonical decompositions are supposed to be - // treated as if they had been normalized, to allow normalized and non- - // normalized text to give the same result. In this implementation that step - // is pushed out to the caller. The caller has to ensure that the pairValue - // slices contain the rune of the opening bracket after normalization for - // any opening or closing bracket. - - openers *list.List // list of positions for opening brackets - - // bracket pair positions sorted by location of opening bracket - pairPositions bracketPairs - - codesIsolatedRun []Class // directional bidi codes for an isolated run - indexes []int // array of index values into the original string - -} - -// matchOpener reports whether characters at given positions form a matching -// bracket pair. -func (p *bracketPairer) matchOpener(pairValues []rune, opener, closer int) bool { - return pairValues[p.indexes[opener]] == pairValues[p.indexes[closer]] -} - -const maxPairingDepth = 63 - -// locateBrackets locates matching bracket pairs according to BD16. -// -// This implementation uses a linked list instead of a stack, because, while -// elements are added at the front (like a push) they are not generally removed -// in atomic 'pop' operations, reducing the benefit of the stack archetype. -func (p *bracketPairer) locateBrackets(pairTypes []bracketType, pairValues []rune) { - // traverse the run - // do that explicitly (not in a for-each) so we can record position - for i, index := range p.indexes { - - // look at the bracket type for each character - if pairTypes[index] == bpNone || p.codesIsolatedRun[i] != ON { - // continue scanning - continue - } - switch pairTypes[index] { - case bpOpen: - // check if maximum pairing depth reached - if p.openers.Len() == maxPairingDepth { - p.openers.Init() - return - } - // remember opener location, most recent first - p.openers.PushFront(i) - - case bpClose: - // see if there is a match - count := 0 - for elem := p.openers.Front(); elem != nil; elem = elem.Next() { - count++ - opener := elem.Value.(int) - if p.matchOpener(pairValues, opener, i) { - // if the opener matches, add nested pair to the ordered list - p.pairPositions = append(p.pairPositions, bracketPair{opener, i}) - // remove up to and including matched opener - for ; count > 0; count-- { - p.openers.Remove(p.openers.Front()) - } - break - } - } - sort.Sort(p.pairPositions) - // if we get here, the closing bracket matched no openers - // and gets ignored - } - } -} - -// Bracket pairs within an isolating run sequence are processed as units so -// that both the opening and the closing paired bracket in a pair resolve to -// the same direction. -// -// N0. Process bracket pairs in an isolating run sequence sequentially in -// the logical order of the text positions of the opening paired brackets -// using the logic given below. Within this scope, bidirectional types EN -// and AN are treated as R. -// -// Identify the bracket pairs in the current isolating run sequence -// according to BD16. For each bracket-pair element in the list of pairs of -// text positions: -// -// a Inspect the bidirectional types of the characters enclosed within the -// bracket pair. -// -// b If any strong type (either L or R) matching the embedding direction is -// found, set the type for both brackets in the pair to match the embedding -// direction. -// -// o [ e ] o -> o e e e o -// -// o [ o e ] -> o e o e e -// -// o [ NI e ] -> o e NI e e -// -// c Otherwise, if a strong type (opposite the embedding direction) is -// found, test for adjacent strong types as follows: 1 First, check -// backwards before the opening paired bracket until the first strong type -// (L, R, or sos) is found. If that first preceding strong type is opposite -// the embedding direction, then set the type for both brackets in the pair -// to that type. 2 Otherwise, set the type for both brackets in the pair to -// the embedding direction. -// -// o [ o ] e -> o o o o e -// -// o [ o NI ] o -> o o o NI o o -// -// e [ o ] o -> e e o e o -// -// e [ o ] e -> e e o e e -// -// e ( o [ o ] NI ) e -> e e o o o o NI e e -// -// d Otherwise, do not set the type for the current bracket pair. Note that -// if the enclosed text contains no strong types the paired brackets will -// both resolve to the same level when resolved individually using rules N1 -// and N2. -// -// e ( NI ) o -> e ( NI ) o - -// getStrongTypeN0 maps character's directional code to strong type as required -// by rule N0. -// -// TODO: have separate type for "strong" directionality. -func (p *bracketPairer) getStrongTypeN0(index int) Class { - switch p.codesIsolatedRun[index] { - // in the scope of N0, number types are treated as R - case EN, AN, AL, R: - return R - case L: - return L - default: - return ON - } -} - -// classifyPairContent reports the strong types contained inside a Bracket Pair, -// assuming the given embedding direction. -// -// It returns ON if no strong type is found. If a single strong type is found, -// it returns this this type. Otherwise it returns the embedding direction. -// -// TODO: use separate type for "strong" directionality. -func (p *bracketPairer) classifyPairContent(loc bracketPair, dirEmbed Class) Class { - dirOpposite := ON - for i := loc.opener + 1; i < loc.closer; i++ { - dir := p.getStrongTypeN0(i) - if dir == ON { - continue - } - if dir == dirEmbed { - return dir // type matching embedding direction found - } - dirOpposite = dir - } - // return ON if no strong type found, or class opposite to dirEmbed - return dirOpposite -} - -// classBeforePair determines which strong types are present before a Bracket -// Pair. Return R or L if strong type found, otherwise ON. -func (p *bracketPairer) classBeforePair(loc bracketPair) Class { - for i := loc.opener - 1; i >= 0; i-- { - if dir := p.getStrongTypeN0(i); dir != ON { - return dir - } - } - // no strong types found, return sos - return p.sos -} - -// assignBracketType implements rule N0 for a single bracket pair. -func (p *bracketPairer) assignBracketType(loc bracketPair, dirEmbed Class, initialTypes []Class) { - // rule "N0, a", inspect contents of pair - dirPair := p.classifyPairContent(loc, dirEmbed) - - // dirPair is now L, R, or N (no strong type found) - - // the following logical tests are performed out of order compared to - // the statement of the rules but yield the same results - if dirPair == ON { - return // case "d" - nothing to do - } - - if dirPair != dirEmbed { - // case "c": strong type found, opposite - check before (c.1) - dirPair = p.classBeforePair(loc) - if dirPair == dirEmbed || dirPair == ON { - // no strong opposite type found before - use embedding (c.2) - dirPair = dirEmbed - } - } - // else: case "b", strong type found matching embedding, - // no explicit action needed, as dirPair is already set to embedding - // direction - - // set the bracket types to the type found - p.setBracketsToType(loc, dirPair, initialTypes) -} - -func (p *bracketPairer) setBracketsToType(loc bracketPair, dirPair Class, initialTypes []Class) { - p.codesIsolatedRun[loc.opener] = dirPair - p.codesIsolatedRun[loc.closer] = dirPair - - for i := loc.opener + 1; i < loc.closer; i++ { - index := p.indexes[i] - if initialTypes[index] != NSM { - break - } - p.codesIsolatedRun[i] = dirPair - } - - for i := loc.closer + 1; i < len(p.indexes); i++ { - index := p.indexes[i] - if initialTypes[index] != NSM { - break - } - p.codesIsolatedRun[i] = dirPair - } -} - -// resolveBrackets implements rule N0 for a list of pairs. -func (p *bracketPairer) resolveBrackets(dirEmbed Class, initialTypes []Class) { - for _, loc := range p.pairPositions { - p.assignBracketType(loc, dirEmbed, initialTypes) - } -} diff --git a/vendor/golang.org/x/text/unicode/bidi/core.go b/vendor/golang.org/x/text/unicode/bidi/core.go deleted file mode 100644 index d4c1399f0..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/core.go +++ /dev/null @@ -1,1058 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bidi - -import "log" - -// This implementation is a port based on the reference implementation found at: -// http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/ -// -// described in Unicode Bidirectional Algorithm (UAX #9). -// -// Input: -// There are two levels of input to the algorithm, since clients may prefer to -// supply some information from out-of-band sources rather than relying on the -// default behavior. -// -// - Bidi class array -// - Bidi class array, with externally supplied base line direction -// -// Output: -// Output is separated into several stages: -// -// - levels array over entire paragraph -// - reordering array over entire paragraph -// - levels array over line -// - reordering array over line -// -// Note that for conformance to the Unicode Bidirectional Algorithm, -// implementations are only required to generate correct reordering and -// character directionality (odd or even levels) over a line. Generating -// identical level arrays over a line is not required. Bidi explicit format -// codes (LRE, RLE, LRO, RLO, PDF) and BN can be assigned arbitrary levels and -// positions as long as the rest of the input is properly reordered. -// -// As the algorithm is defined to operate on a single paragraph at a time, this -// implementation is written to handle single paragraphs. Thus rule P1 is -// presumed by this implementation-- the data provided to the implementation is -// assumed to be a single paragraph, and either contains no 'B' codes, or a -// single 'B' code at the end of the input. 'B' is allowed as input to -// illustrate how the algorithm assigns it a level. -// -// Also note that rules L3 and L4 depend on the rendering engine that uses the -// result of the bidi algorithm. This implementation assumes that the rendering -// engine expects combining marks in visual order (e.g. to the left of their -// base character in RTL runs) and that it adjusts the glyphs used to render -// mirrored characters that are in RTL runs so that they render appropriately. - -// level is the embedding level of a character. Even embedding levels indicate -// left-to-right order and odd levels indicate right-to-left order. The special -// level of -1 is reserved for undefined order. -type level int8 - -const implicitLevel level = -1 - -// in returns if x is equal to any of the values in set. -func (c Class) in(set ...Class) bool { - for _, s := range set { - if c == s { - return true - } - } - return false -} - -// A paragraph contains the state of a paragraph. -type paragraph struct { - initialTypes []Class - - // Arrays of properties needed for paired bracket evaluation in N0 - pairTypes []bracketType // paired Bracket types for paragraph - pairValues []rune // rune for opening bracket or pbOpen and pbClose; 0 for pbNone - - embeddingLevel level // default: = implicitLevel; - - // at the paragraph levels - resultTypes []Class - resultLevels []level - - // Index of matching PDI for isolate initiator characters. For other - // characters, the value of matchingPDI will be set to -1. For isolate - // initiators with no matching PDI, matchingPDI will be set to the length of - // the input string. - matchingPDI []int - - // Index of matching isolate initiator for PDI characters. For other - // characters, and for PDIs with no matching isolate initiator, the value of - // matchingIsolateInitiator will be set to -1. - matchingIsolateInitiator []int -} - -// newParagraph initializes a paragraph. The user needs to supply a few arrays -// corresponding to the preprocessed text input. The types correspond to the -// Unicode BiDi classes for each rune. pairTypes indicates the bracket type for -// each rune. pairValues provides a unique bracket class identifier for each -// rune (suggested is the rune of the open bracket for opening and matching -// close brackets, after normalization). The embedding levels are optional, but -// may be supplied to encode embedding levels of styled text. -// -// TODO: return an error. -func newParagraph(types []Class, pairTypes []bracketType, pairValues []rune, levels level) *paragraph { - validateTypes(types) - validatePbTypes(pairTypes) - validatePbValues(pairValues, pairTypes) - validateParagraphEmbeddingLevel(levels) - - p := ¶graph{ - initialTypes: append([]Class(nil), types...), - embeddingLevel: levels, - - pairTypes: pairTypes, - pairValues: pairValues, - - resultTypes: append([]Class(nil), types...), - } - p.run() - return p -} - -func (p *paragraph) Len() int { return len(p.initialTypes) } - -// The algorithm. Does not include line-based processing (Rules L1, L2). -// These are applied later in the line-based phase of the algorithm. -func (p *paragraph) run() { - p.determineMatchingIsolates() - - // 1) determining the paragraph level - // Rule P1 is the requirement for entering this algorithm. - // Rules P2, P3. - // If no externally supplied paragraph embedding level, use default. - if p.embeddingLevel == implicitLevel { - p.embeddingLevel = p.determineParagraphEmbeddingLevel(0, p.Len()) - } - - // Initialize result levels to paragraph embedding level. - p.resultLevels = make([]level, p.Len()) - setLevels(p.resultLevels, p.embeddingLevel) - - // 2) Explicit levels and directions - // Rules X1-X8. - p.determineExplicitEmbeddingLevels() - - // Rule X9. - // We do not remove the embeddings, the overrides, the PDFs, and the BNs - // from the string explicitly. But they are not copied into isolating run - // sequences when they are created, so they are removed for all - // practical purposes. - - // Rule X10. - // Run remainder of algorithm one isolating run sequence at a time - for _, seq := range p.determineIsolatingRunSequences() { - // 3) resolving weak types - // Rules W1-W7. - seq.resolveWeakTypes() - - // 4a) resolving paired brackets - // Rule N0 - resolvePairedBrackets(seq) - - // 4b) resolving neutral types - // Rules N1-N3. - seq.resolveNeutralTypes() - - // 5) resolving implicit embedding levels - // Rules I1, I2. - seq.resolveImplicitLevels() - - // Apply the computed levels and types - seq.applyLevelsAndTypes() - } - - // Assign appropriate levels to 'hide' LREs, RLEs, LROs, RLOs, PDFs, and - // BNs. This is for convenience, so the resulting level array will have - // a value for every character. - p.assignLevelsToCharactersRemovedByX9() -} - -// determineMatchingIsolates determines the matching PDI for each isolate -// initiator and vice versa. -// -// Definition BD9. -// -// At the end of this function: -// -// - The member variable matchingPDI is set to point to the index of the -// matching PDI character for each isolate initiator character. If there is -// no matching PDI, it is set to the length of the input text. For other -// characters, it is set to -1. -// - The member variable matchingIsolateInitiator is set to point to the -// index of the matching isolate initiator character for each PDI character. -// If there is no matching isolate initiator, or the character is not a PDI, -// it is set to -1. -func (p *paragraph) determineMatchingIsolates() { - p.matchingPDI = make([]int, p.Len()) - p.matchingIsolateInitiator = make([]int, p.Len()) - - for i := range p.matchingIsolateInitiator { - p.matchingIsolateInitiator[i] = -1 - } - - for i := range p.matchingPDI { - p.matchingPDI[i] = -1 - - if t := p.resultTypes[i]; t.in(LRI, RLI, FSI) { - depthCounter := 1 - for j := i + 1; j < p.Len(); j++ { - if u := p.resultTypes[j]; u.in(LRI, RLI, FSI) { - depthCounter++ - } else if u == PDI { - if depthCounter--; depthCounter == 0 { - p.matchingPDI[i] = j - p.matchingIsolateInitiator[j] = i - break - } - } - } - if p.matchingPDI[i] == -1 { - p.matchingPDI[i] = p.Len() - } - } - } -} - -// determineParagraphEmbeddingLevel reports the resolved paragraph direction of -// the substring limited by the given range [start, end). -// -// Determines the paragraph level based on rules P2, P3. This is also used -// in rule X5c to find if an FSI should resolve to LRI or RLI. -func (p *paragraph) determineParagraphEmbeddingLevel(start, end int) level { - var strongType Class = unknownClass - - // Rule P2. - for i := start; i < end; i++ { - if t := p.resultTypes[i]; t.in(L, AL, R) { - strongType = t - break - } else if t.in(FSI, LRI, RLI) { - i = p.matchingPDI[i] // skip over to the matching PDI - if i > end { - log.Panic("assert (i <= end)") - } - } - } - // Rule P3. - switch strongType { - case unknownClass: // none found - // default embedding level when no strong types found is 0. - return 0 - case L: - return 0 - default: // AL, R - return 1 - } -} - -const maxDepth = 125 - -// This stack will store the embedding levels and override and isolated -// statuses -type directionalStatusStack struct { - stackCounter int - embeddingLevelStack [maxDepth + 1]level - overrideStatusStack [maxDepth + 1]Class - isolateStatusStack [maxDepth + 1]bool -} - -func (s *directionalStatusStack) empty() { s.stackCounter = 0 } -func (s *directionalStatusStack) pop() { s.stackCounter-- } -func (s *directionalStatusStack) depth() int { return s.stackCounter } - -func (s *directionalStatusStack) push(level level, overrideStatus Class, isolateStatus bool) { - s.embeddingLevelStack[s.stackCounter] = level - s.overrideStatusStack[s.stackCounter] = overrideStatus - s.isolateStatusStack[s.stackCounter] = isolateStatus - s.stackCounter++ -} - -func (s *directionalStatusStack) lastEmbeddingLevel() level { - return s.embeddingLevelStack[s.stackCounter-1] -} - -func (s *directionalStatusStack) lastDirectionalOverrideStatus() Class { - return s.overrideStatusStack[s.stackCounter-1] -} - -func (s *directionalStatusStack) lastDirectionalIsolateStatus() bool { - return s.isolateStatusStack[s.stackCounter-1] -} - -// Determine explicit levels using rules X1 - X8 -func (p *paragraph) determineExplicitEmbeddingLevels() { - var stack directionalStatusStack - var overflowIsolateCount, overflowEmbeddingCount, validIsolateCount int - - // Rule X1. - stack.push(p.embeddingLevel, ON, false) - - for i, t := range p.resultTypes { - // Rules X2, X3, X4, X5, X5a, X5b, X5c - switch t { - case RLE, LRE, RLO, LRO, RLI, LRI, FSI: - isIsolate := t.in(RLI, LRI, FSI) - isRTL := t.in(RLE, RLO, RLI) - - // override if this is an FSI that resolves to RLI - if t == FSI { - isRTL = (p.determineParagraphEmbeddingLevel(i+1, p.matchingPDI[i]) == 1) - } - if isIsolate { - p.resultLevels[i] = stack.lastEmbeddingLevel() - if stack.lastDirectionalOverrideStatus() != ON { - p.resultTypes[i] = stack.lastDirectionalOverrideStatus() - } - } - - var newLevel level - if isRTL { - // least greater odd - newLevel = (stack.lastEmbeddingLevel() + 1) | 1 - } else { - // least greater even - newLevel = (stack.lastEmbeddingLevel() + 2) &^ 1 - } - - if newLevel <= maxDepth && overflowIsolateCount == 0 && overflowEmbeddingCount == 0 { - if isIsolate { - validIsolateCount++ - } - // Push new embedding level, override status, and isolated - // status. - // No check for valid stack counter, since the level check - // suffices. - switch t { - case LRO: - stack.push(newLevel, L, isIsolate) - case RLO: - stack.push(newLevel, R, isIsolate) - default: - stack.push(newLevel, ON, isIsolate) - } - // Not really part of the spec - if !isIsolate { - p.resultLevels[i] = newLevel - } - } else { - // This is an invalid explicit formatting character, - // so apply the "Otherwise" part of rules X2-X5b. - if isIsolate { - overflowIsolateCount++ - } else { // !isIsolate - if overflowIsolateCount == 0 { - overflowEmbeddingCount++ - } - } - } - - // Rule X6a - case PDI: - if overflowIsolateCount > 0 { - overflowIsolateCount-- - } else if validIsolateCount == 0 { - // do nothing - } else { - overflowEmbeddingCount = 0 - for !stack.lastDirectionalIsolateStatus() { - stack.pop() - } - stack.pop() - validIsolateCount-- - } - p.resultLevels[i] = stack.lastEmbeddingLevel() - - // Rule X7 - case PDF: - // Not really part of the spec - p.resultLevels[i] = stack.lastEmbeddingLevel() - - if overflowIsolateCount > 0 { - // do nothing - } else if overflowEmbeddingCount > 0 { - overflowEmbeddingCount-- - } else if !stack.lastDirectionalIsolateStatus() && stack.depth() >= 2 { - stack.pop() - } - - case B: // paragraph separator. - // Rule X8. - - // These values are reset for clarity, in this implementation B - // can only occur as the last code in the array. - stack.empty() - overflowIsolateCount = 0 - overflowEmbeddingCount = 0 - validIsolateCount = 0 - p.resultLevels[i] = p.embeddingLevel - - default: - p.resultLevels[i] = stack.lastEmbeddingLevel() - if stack.lastDirectionalOverrideStatus() != ON { - p.resultTypes[i] = stack.lastDirectionalOverrideStatus() - } - } - } -} - -type isolatingRunSequence struct { - p *paragraph - - indexes []int // indexes to the original string - - types []Class // type of each character using the index - resolvedLevels []level // resolved levels after application of rules - level level - sos, eos Class -} - -func (i *isolatingRunSequence) Len() int { return len(i.indexes) } - -func maxLevel(a, b level) level { - if a > b { - return a - } - return b -} - -// Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types, -// either L or R, for each isolating run sequence. -func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence { - length := len(indexes) - types := make([]Class, length) - for i, x := range indexes { - types[i] = p.resultTypes[x] - } - - // assign level, sos and eos - prevChar := indexes[0] - 1 - for prevChar >= 0 && isRemovedByX9(p.initialTypes[prevChar]) { - prevChar-- - } - prevLevel := p.embeddingLevel - if prevChar >= 0 { - prevLevel = p.resultLevels[prevChar] - } - - var succLevel level - lastType := types[length-1] - if lastType.in(LRI, RLI, FSI) { - succLevel = p.embeddingLevel - } else { - // the first character after the end of run sequence - limit := indexes[length-1] + 1 - for ; limit < p.Len() && isRemovedByX9(p.initialTypes[limit]); limit++ { - - } - succLevel = p.embeddingLevel - if limit < p.Len() { - succLevel = p.resultLevels[limit] - } - } - level := p.resultLevels[indexes[0]] - return &isolatingRunSequence{ - p: p, - indexes: indexes, - types: types, - level: level, - sos: typeForLevel(maxLevel(prevLevel, level)), - eos: typeForLevel(maxLevel(succLevel, level)), - } -} - -// Resolving weak types Rules W1-W7. -// -// Note that some weak types (EN, AN) remain after this processing is -// complete. -func (s *isolatingRunSequence) resolveWeakTypes() { - - // on entry, only these types remain - s.assertOnly(L, R, AL, EN, ES, ET, AN, CS, B, S, WS, ON, NSM, LRI, RLI, FSI, PDI) - - // Rule W1. - // Changes all NSMs. - preceedingCharacterType := s.sos - for i, t := range s.types { - if t == NSM { - s.types[i] = preceedingCharacterType - } else { - if t.in(LRI, RLI, FSI, PDI) { - preceedingCharacterType = ON - } - preceedingCharacterType = t - } - } - - // Rule W2. - // EN does not change at the start of the run, because sos != AL. - for i, t := range s.types { - if t == EN { - for j := i - 1; j >= 0; j-- { - if t := s.types[j]; t.in(L, R, AL) { - if t == AL { - s.types[i] = AN - } - break - } - } - } - } - - // Rule W3. - for i, t := range s.types { - if t == AL { - s.types[i] = R - } - } - - // Rule W4. - // Since there must be values on both sides for this rule to have an - // effect, the scan skips the first and last value. - // - // Although the scan proceeds left to right, and changes the type - // values in a way that would appear to affect the computations - // later in the scan, there is actually no problem. A change in the - // current value can only affect the value to its immediate right, - // and only affect it if it is ES or CS. But the current value can - // only change if the value to its right is not ES or CS. Thus - // either the current value will not change, or its change will have - // no effect on the remainder of the analysis. - - for i := 1; i < s.Len()-1; i++ { - t := s.types[i] - if t == ES || t == CS { - prevSepType := s.types[i-1] - succSepType := s.types[i+1] - if prevSepType == EN && succSepType == EN { - s.types[i] = EN - } else if s.types[i] == CS && prevSepType == AN && succSepType == AN { - s.types[i] = AN - } - } - } - - // Rule W5. - for i, t := range s.types { - if t == ET { - // locate end of sequence - runStart := i - runEnd := s.findRunLimit(runStart, ET) - - // check values at ends of sequence - t := s.sos - if runStart > 0 { - t = s.types[runStart-1] - } - if t != EN { - t = s.eos - if runEnd < len(s.types) { - t = s.types[runEnd] - } - } - if t == EN { - setTypes(s.types[runStart:runEnd], EN) - } - // continue at end of sequence - i = runEnd - } - } - - // Rule W6. - for i, t := range s.types { - if t.in(ES, ET, CS) { - s.types[i] = ON - } - } - - // Rule W7. - for i, t := range s.types { - if t == EN { - // set default if we reach start of run - prevStrongType := s.sos - for j := i - 1; j >= 0; j-- { - t = s.types[j] - if t == L || t == R { // AL's have been changed to R - prevStrongType = t - break - } - } - if prevStrongType == L { - s.types[i] = L - } - } - } -} - -// 6) resolving neutral types Rules N1-N2. -func (s *isolatingRunSequence) resolveNeutralTypes() { - - // on entry, only these types can be in resultTypes - s.assertOnly(L, R, EN, AN, B, S, WS, ON, RLI, LRI, FSI, PDI) - - for i, t := range s.types { - switch t { - case WS, ON, B, S, RLI, LRI, FSI, PDI: - // find bounds of run of neutrals - runStart := i - runEnd := s.findRunLimit(runStart, B, S, WS, ON, RLI, LRI, FSI, PDI) - - // determine effective types at ends of run - var leadType, trailType Class - - // Note that the character found can only be L, R, AN, or - // EN. - if runStart == 0 { - leadType = s.sos - } else { - leadType = s.types[runStart-1] - if leadType.in(AN, EN) { - leadType = R - } - } - if runEnd == len(s.types) { - trailType = s.eos - } else { - trailType = s.types[runEnd] - if trailType.in(AN, EN) { - trailType = R - } - } - - var resolvedType Class - if leadType == trailType { - // Rule N1. - resolvedType = leadType - } else { - // Rule N2. - // Notice the embedding level of the run is used, not - // the paragraph embedding level. - resolvedType = typeForLevel(s.level) - } - - setTypes(s.types[runStart:runEnd], resolvedType) - - // skip over run of (former) neutrals - i = runEnd - } - } -} - -func setLevels(levels []level, newLevel level) { - for i := range levels { - levels[i] = newLevel - } -} - -func setTypes(types []Class, newType Class) { - for i := range types { - types[i] = newType - } -} - -// 7) resolving implicit embedding levels Rules I1, I2. -func (s *isolatingRunSequence) resolveImplicitLevels() { - - // on entry, only these types can be in resultTypes - s.assertOnly(L, R, EN, AN) - - s.resolvedLevels = make([]level, len(s.types)) - setLevels(s.resolvedLevels, s.level) - - if (s.level & 1) == 0 { // even level - for i, t := range s.types { - // Rule I1. - if t == L { - // no change - } else if t == R { - s.resolvedLevels[i] += 1 - } else { // t == AN || t == EN - s.resolvedLevels[i] += 2 - } - } - } else { // odd level - for i, t := range s.types { - // Rule I2. - if t == R { - // no change - } else { // t == L || t == AN || t == EN - s.resolvedLevels[i] += 1 - } - } - } -} - -// Applies the levels and types resolved in rules W1-I2 to the -// resultLevels array. -func (s *isolatingRunSequence) applyLevelsAndTypes() { - for i, x := range s.indexes { - s.p.resultTypes[x] = s.types[i] - s.p.resultLevels[x] = s.resolvedLevels[i] - } -} - -// Return the limit of the run consisting only of the types in validSet -// starting at index. This checks the value at index, and will return -// index if that value is not in validSet. -func (s *isolatingRunSequence) findRunLimit(index int, validSet ...Class) int { -loop: - for ; index < len(s.types); index++ { - t := s.types[index] - for _, valid := range validSet { - if t == valid { - continue loop - } - } - return index // didn't find a match in validSet - } - return len(s.types) -} - -// Algorithm validation. Assert that all values in types are in the -// provided set. -func (s *isolatingRunSequence) assertOnly(codes ...Class) { -loop: - for i, t := range s.types { - for _, c := range codes { - if t == c { - continue loop - } - } - log.Panicf("invalid bidi code %v present in assertOnly at position %d", t, s.indexes[i]) - } -} - -// determineLevelRuns returns an array of level runs. Each level run is -// described as an array of indexes into the input string. -// -// Determines the level runs. Rule X9 will be applied in determining the -// runs, in the way that makes sure the characters that are supposed to be -// removed are not included in the runs. -func (p *paragraph) determineLevelRuns() [][]int { - run := []int{} - allRuns := [][]int{} - currentLevel := implicitLevel - - for i := range p.initialTypes { - if !isRemovedByX9(p.initialTypes[i]) { - if p.resultLevels[i] != currentLevel { - // we just encountered a new run; wrap up last run - if currentLevel >= 0 { // only wrap it up if there was a run - allRuns = append(allRuns, run) - run = nil - } - // Start new run - currentLevel = p.resultLevels[i] - } - run = append(run, i) - } - } - // Wrap up the final run, if any - if len(run) > 0 { - allRuns = append(allRuns, run) - } - return allRuns -} - -// Definition BD13. Determine isolating run sequences. -func (p *paragraph) determineIsolatingRunSequences() []*isolatingRunSequence { - levelRuns := p.determineLevelRuns() - - // Compute the run that each character belongs to - runForCharacter := make([]int, p.Len()) - for i, run := range levelRuns { - for _, index := range run { - runForCharacter[index] = i - } - } - - sequences := []*isolatingRunSequence{} - - var currentRunSequence []int - - for _, run := range levelRuns { - first := run[0] - if p.initialTypes[first] != PDI || p.matchingIsolateInitiator[first] == -1 { - currentRunSequence = nil - // int run = i; - for { - // Copy this level run into currentRunSequence - currentRunSequence = append(currentRunSequence, run...) - - last := currentRunSequence[len(currentRunSequence)-1] - lastT := p.initialTypes[last] - if lastT.in(LRI, RLI, FSI) && p.matchingPDI[last] != p.Len() { - run = levelRuns[runForCharacter[p.matchingPDI[last]]] - } else { - break - } - } - sequences = append(sequences, p.isolatingRunSequence(currentRunSequence)) - } - } - return sequences -} - -// Assign level information to characters removed by rule X9. This is for -// ease of relating the level information to the original input data. Note -// that the levels assigned to these codes are arbitrary, they're chosen so -// as to avoid breaking level runs. -func (p *paragraph) assignLevelsToCharactersRemovedByX9() { - for i, t := range p.initialTypes { - if t.in(LRE, RLE, LRO, RLO, PDF, BN) { - p.resultTypes[i] = t - p.resultLevels[i] = -1 - } - } - // now propagate forward the levels information (could have - // propagated backward, the main thing is not to introduce a level - // break where one doesn't already exist). - - if p.resultLevels[0] == -1 { - p.resultLevels[0] = p.embeddingLevel - } - for i := 1; i < len(p.initialTypes); i++ { - if p.resultLevels[i] == -1 { - p.resultLevels[i] = p.resultLevels[i-1] - } - } - // Embedding information is for informational purposes only so need not be - // adjusted. -} - -// -// Output -// - -// getLevels computes levels array breaking lines at offsets in linebreaks. -// Rule L1. -// -// The linebreaks array must include at least one value. The values must be -// in strictly increasing order (no duplicates) between 1 and the length of -// the text, inclusive. The last value must be the length of the text. -func (p *paragraph) getLevels(linebreaks []int) []level { - // Note that since the previous processing has removed all - // P, S, and WS values from resultTypes, the values referred to - // in these rules are the initial types, before any processing - // has been applied (including processing of overrides). - // - // This example implementation has reinserted explicit format codes - // and BN, in order that the levels array correspond to the - // initial text. Their final placement is not normative. - // These codes are treated like WS in this implementation, - // so they don't interrupt sequences of WS. - - validateLineBreaks(linebreaks, p.Len()) - - result := append([]level(nil), p.resultLevels...) - - // don't worry about linebreaks since if there is a break within - // a series of WS values preceding S, the linebreak itself - // causes the reset. - for i, t := range p.initialTypes { - if t.in(B, S) { - // Rule L1, clauses one and two. - result[i] = p.embeddingLevel - - // Rule L1, clause three. - for j := i - 1; j >= 0; j-- { - if isWhitespace(p.initialTypes[j]) { // including format codes - result[j] = p.embeddingLevel - } else { - break - } - } - } - } - - // Rule L1, clause four. - start := 0 - for _, limit := range linebreaks { - for j := limit - 1; j >= start; j-- { - if isWhitespace(p.initialTypes[j]) { // including format codes - result[j] = p.embeddingLevel - } else { - break - } - } - start = limit - } - - return result -} - -// getReordering returns the reordering of lines from a visual index to a -// logical index for line breaks at the given offsets. -// -// Lines are concatenated from left to right. So for example, the fifth -// character from the left on the third line is -// -// getReordering(linebreaks)[linebreaks[1] + 4] -// -// (linebreaks[1] is the position after the last character of the second -// line, which is also the index of the first character on the third line, -// and adding four gets the fifth character from the left). -// -// The linebreaks array must include at least one value. The values must be -// in strictly increasing order (no duplicates) between 1 and the length of -// the text, inclusive. The last value must be the length of the text. -func (p *paragraph) getReordering(linebreaks []int) []int { - validateLineBreaks(linebreaks, p.Len()) - - return computeMultilineReordering(p.getLevels(linebreaks), linebreaks) -} - -// Return multiline reordering array for a given level array. Reordering -// does not occur across a line break. -func computeMultilineReordering(levels []level, linebreaks []int) []int { - result := make([]int, len(levels)) - - start := 0 - for _, limit := range linebreaks { - tempLevels := make([]level, limit-start) - copy(tempLevels, levels[start:]) - - for j, order := range computeReordering(tempLevels) { - result[start+j] = order + start - } - start = limit - } - return result -} - -// Return reordering array for a given level array. This reorders a single -// line. The reordering is a visual to logical map. For example, the -// leftmost char is string.charAt(order[0]). Rule L2. -func computeReordering(levels []level) []int { - result := make([]int, len(levels)) - // initialize order - for i := range result { - result[i] = i - } - - // locate highest level found on line. - // Note the rules say text, but no reordering across line bounds is - // performed, so this is sufficient. - highestLevel := level(0) - lowestOddLevel := level(maxDepth + 2) - for _, level := range levels { - if level > highestLevel { - highestLevel = level - } - if level&1 != 0 && level < lowestOddLevel { - lowestOddLevel = level - } - } - - for level := highestLevel; level >= lowestOddLevel; level-- { - for i := 0; i < len(levels); i++ { - if levels[i] >= level { - // find range of text at or above this level - start := i - limit := i + 1 - for limit < len(levels) && levels[limit] >= level { - limit++ - } - - for j, k := start, limit-1; j < k; j, k = j+1, k-1 { - result[j], result[k] = result[k], result[j] - } - // skip to end of level run - i = limit - } - } - } - - return result -} - -// isWhitespace reports whether the type is considered a whitespace type for the -// line break rules. -func isWhitespace(c Class) bool { - switch c { - case LRE, RLE, LRO, RLO, PDF, LRI, RLI, FSI, PDI, BN, WS: - return true - } - return false -} - -// isRemovedByX9 reports whether the type is one of the types removed in X9. -func isRemovedByX9(c Class) bool { - switch c { - case LRE, RLE, LRO, RLO, PDF, BN: - return true - } - return false -} - -// typeForLevel reports the strong type (L or R) corresponding to the level. -func typeForLevel(level level) Class { - if (level & 0x1) == 0 { - return L - } - return R -} - -// TODO: change validation to not panic - -func validateTypes(types []Class) { - if len(types) == 0 { - log.Panic("types is null") - } - for i, t := range types[:len(types)-1] { - if t == B { - log.Panicf("B type before end of paragraph at index: %d", i) - } - } -} - -func validateParagraphEmbeddingLevel(embeddingLevel level) { - if embeddingLevel != implicitLevel && - embeddingLevel != 0 && - embeddingLevel != 1 { - log.Panicf("illegal paragraph embedding level: %d", embeddingLevel) - } -} - -func validateLineBreaks(linebreaks []int, textLength int) { - prev := 0 - for i, next := range linebreaks { - if next <= prev { - log.Panicf("bad linebreak: %d at index: %d", next, i) - } - prev = next - } - if prev != textLength { - log.Panicf("last linebreak was %d, want %d", prev, textLength) - } -} - -func validatePbTypes(pairTypes []bracketType) { - if len(pairTypes) == 0 { - log.Panic("pairTypes is null") - } - for i, pt := range pairTypes { - switch pt { - case bpNone, bpOpen, bpClose: - default: - log.Panicf("illegal pairType value at %d: %v", i, pairTypes[i]) - } - } -} - -func validatePbValues(pairValues []rune, pairTypes []bracketType) { - if pairValues == nil { - log.Panic("pairValues is null") - } - if len(pairTypes) != len(pairValues) { - log.Panic("pairTypes is different length from pairValues") - } -} diff --git a/vendor/golang.org/x/text/unicode/bidi/core_test.go b/vendor/golang.org/x/text/unicode/bidi/core_test.go deleted file mode 100644 index f28d386c8..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/core_test.go +++ /dev/null @@ -1,224 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bidi - -import ( - "flag" - "fmt" - "log" - "strconv" - "strings" - "testing" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/testtext" - "golang.org/x/text/internal/ucd" - "golang.org/x/text/unicode/norm" -) - -var testLevels = flag.Bool("levels", false, "enable testing of levels") - -// TestBidiCore performs the tests in BidiTest.txt. -// See http://www.unicode.org/Public/UCD/latest/ucd/BidiTest.txt. -func TestBidiCore(t *testing.T) { - testtext.SkipIfNotLong(t) - - r := gen.OpenUCDFile("BidiTest.txt") - defer r.Close() - - var wantLevels, wantOrder []string - p := ucd.New(r, ucd.Part(func(p *ucd.Parser) { - s := strings.Split(p.String(0), ":") - switch s[0] { - case "Levels": - wantLevels = strings.Fields(s[1]) - case "Reorder": - wantOrder = strings.Fields(s[1]) - default: - log.Fatalf("Unknown part %q.", s[0]) - } - })) - - for p.Next() { - types := []Class{} - for _, s := range p.Strings(0) { - types = append(types, bidiClass[s]) - } - // We ignore the bracketing part of the algorithm. - pairTypes := make([]bracketType, len(types)) - pairValues := make([]rune, len(types)) - - for i := uint(0); i < 3; i++ { - if p.Uint(1)&(1<<i) == 0 { - continue - } - lev := level(int(i) - 1) - par := newParagraph(types, pairTypes, pairValues, lev) - - if *testLevels { - levels := par.getLevels([]int{len(types)}) - for i, s := range wantLevels { - if s == "x" { - continue - } - l, _ := strconv.ParseUint(s, 10, 8) - if level(l)&1 != levels[i]&1 { - t.Errorf("%s:%d:levels: got %v; want %v", p.String(0), lev, levels, wantLevels) - break - } - } - } - - order := par.getReordering([]int{len(types)}) - gotOrder := filterOrder(types, order) - if got, want := fmt.Sprint(gotOrder), fmt.Sprint(wantOrder); got != want { - t.Errorf("%s:%d:order: got %v; want %v\noriginal %v", p.String(0), lev, got, want, order) - } - } - } - if err := p.Err(); err != nil { - log.Fatal(err) - } -} - -var removeClasses = map[Class]bool{ - LRO: true, - RLO: true, - RLE: true, - LRE: true, - PDF: true, - BN: true, -} - -// TestBidiCharacters performs the tests in BidiCharacterTest.txt. -// See http://www.unicode.org/Public/UCD/latest/ucd/BidiCharacterTest.txt -func TestBidiCharacters(t *testing.T) { - testtext.SkipIfNotLong(t) - - ucd.Parse(gen.OpenUCDFile("BidiCharacterTest.txt"), func(p *ucd.Parser) { - var ( - types []Class - pairTypes []bracketType - pairValues []rune - parLevel level - - wantLevel = level(p.Int(2)) - wantLevels = p.Strings(3) - wantVisualOrder = p.Strings(4) - ) - - switch l := p.Int(1); l { - case 0, 1: - parLevel = level(l) - case 2: - parLevel = implicitLevel - default: - // Spec says to ignore unknown parts. - } - - runes := p.Runes(0) - - for _, r := range runes { - // Assign the bracket type. - if d := norm.NFKD.PropertiesString(string(r)).Decomposition(); d != nil { - r = []rune(string(d))[0] - } - p, _ := LookupRune(r) - - // Assign the class for this rune. - types = append(types, p.Class()) - - switch { - case !p.IsBracket(): - pairTypes = append(pairTypes, bpNone) - pairValues = append(pairValues, 0) - case p.IsOpeningBracket(): - pairTypes = append(pairTypes, bpOpen) - pairValues = append(pairValues, r) - default: - pairTypes = append(pairTypes, bpClose) - pairValues = append(pairValues, p.reverseBracket(r)) - } - } - par := newParagraph(types, pairTypes, pairValues, parLevel) - - // Test results: - if got := par.embeddingLevel; got != wantLevel { - t.Errorf("%v:level: got %d; want %d", string(runes), got, wantLevel) - } - - if *testLevels { - gotLevels := getLevelStrings(types, par.getLevels([]int{len(types)})) - if got, want := fmt.Sprint(gotLevels), fmt.Sprint(wantLevels); got != want { - t.Errorf("%04X %q:%d: got %v; want %v\nval: %x\npair: %v", runes, string(runes), parLevel, got, want, pairValues, pairTypes) - } - } - - order := par.getReordering([]int{len(types)}) - order = filterOrder(types, order) - if got, want := fmt.Sprint(order), fmt.Sprint(wantVisualOrder); got != want { - t.Errorf("%04X %q:%d: got %v; want %v\ngot order: %s", runes, string(runes), parLevel, got, want, reorder(runes, order)) - } - }) -} - -func getLevelStrings(cl []Class, levels []level) []string { - var results []string - for i, l := range levels { - if !removeClasses[cl[i]] { - results = append(results, fmt.Sprint(l)) - } else { - results = append(results, "x") - } - } - return results -} - -func filterOrder(cl []Class, order []int) []int { - no := []int{} - for _, o := range order { - if !removeClasses[cl[o]] { - no = append(no, o) - } - } - return no -} - -func reorder(r []rune, order []int) string { - nr := make([]rune, len(order)) - for i, o := range order { - nr[i] = r[o] - } - return string(nr) -} - -// bidiClass names and codes taken from class "bc" in -// http://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt -var bidiClass = map[string]Class{ - "AL": AL, // classArabicLetter, - "AN": AN, // classArabicNumber, - "B": B, // classParagraphSeparator, - "BN": BN, // classBoundaryNeutral, - "CS": CS, // classCommonSeparator, - "EN": EN, // classEuropeanNumber, - "ES": ES, // classEuropeanSeparator, - "ET": ET, // classEuropeanTerminator, - "L": L, // classLeftToRight, - "NSM": NSM, // classNonspacingMark, - "ON": ON, // classOtherNeutral, - "R": R, // classRightToLeft, - "S": S, // classSegmentSeparator, - "WS": WS, // classWhiteSpace, - - "LRO": LRO, // classLeftToRightOverride, - "RLO": RLO, // classRightToLeftOverride, - "LRE": LRE, // classLeftToRightEmbedding, - "RLE": RLE, // classRightToLeftEmbedding, - "PDF": PDF, // classPopDirectionalFormat, - "LRI": LRI, // classLeftToRightIsolate, - "RLI": RLI, // classRightToLeftIsolate, - "FSI": FSI, // classFirstStrongIsolate, - "PDI": PDI, // classPopDirectionalIsolate, -} diff --git a/vendor/golang.org/x/text/unicode/bidi/gen.go b/vendor/golang.org/x/text/unicode/bidi/gen.go deleted file mode 100644 index 040f3013d..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/gen.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "flag" - "log" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" - "golang.org/x/text/internal/ucd" -) - -var outputFile = flag.String("out", "tables.go", "output file") - -func main() { - gen.Init() - gen.Repackage("gen_trieval.go", "trieval.go", "bidi") - gen.Repackage("gen_ranges.go", "ranges_test.go", "bidi") - - genTables() -} - -// bidiClass names and codes taken from class "bc" in -// http://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt -var bidiClass = map[string]Class{ - "AL": AL, // ArabicLetter - "AN": AN, // ArabicNumber - "B": B, // ParagraphSeparator - "BN": BN, // BoundaryNeutral - "CS": CS, // CommonSeparator - "EN": EN, // EuropeanNumber - "ES": ES, // EuropeanSeparator - "ET": ET, // EuropeanTerminator - "L": L, // LeftToRight - "NSM": NSM, // NonspacingMark - "ON": ON, // OtherNeutral - "R": R, // RightToLeft - "S": S, // SegmentSeparator - "WS": WS, // WhiteSpace - - "FSI": Control, - "PDF": Control, - "PDI": Control, - "LRE": Control, - "LRI": Control, - "LRO": Control, - "RLE": Control, - "RLI": Control, - "RLO": Control, -} - -func genTables() { - if numClass > 0x0F { - log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass) - } - w := gen.NewCodeWriter() - defer w.WriteGoFile(*outputFile, "bidi") - - gen.WriteUnicodeVersion(w) - - t := triegen.NewTrie("bidi") - - // Build data about bracket mapping. These bits need to be or-ed with - // any other bits. - orMask := map[rune]uint64{} - - xorMap := map[rune]int{} - xorMasks := []rune{0} // First value is no-op. - - ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) { - r1 := p.Rune(0) - r2 := p.Rune(1) - xor := r1 ^ r2 - if _, ok := xorMap[xor]; !ok { - xorMap[xor] = len(xorMasks) - xorMasks = append(xorMasks, xor) - } - entry := uint64(xorMap[xor]) << xorMaskShift - switch p.String(2) { - case "o": - entry |= openMask - case "c", "n": - default: - log.Fatalf("Unknown bracket class %q.", p.String(2)) - } - orMask[r1] = entry - }) - - w.WriteComment(` - xorMasks contains masks to be xor-ed with brackets to get the reverse - version.`) - w.WriteVar("xorMasks", xorMasks) - - done := map[rune]bool{} - - insert := func(r rune, c Class) { - if !done[r] { - t.Insert(r, orMask[r]|uint64(c)) - done[r] = true - } - } - - // Insert the derived BiDi properties. - ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - class, ok := bidiClass[p.String(1)] - if !ok { - log.Fatalf("%U: Unknown BiDi class %q", r, p.String(1)) - } - insert(r, class) - }) - visitDefaults(insert) - - // TODO: use sparse blocks. This would reduce table size considerably - // from the looks of it. - - sz, err := t.Gen(w) - if err != nil { - log.Fatal(err) - } - w.Size += sz -} - -// dummy values to make methods in gen_common compile. The real versions -// will be generated by this file to tables.go. -var ( - xorMasks []rune -) diff --git a/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go b/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go deleted file mode 100644 index 51bd68fa7..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "unicode" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/ucd" - "golang.org/x/text/unicode/rangetable" -) - -// These tables are hand-extracted from: -// http://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedBidiClass.txt -func visitDefaults(fn func(r rune, c Class)) { - // first write default values for ranges listed above. - visitRunes(fn, AL, []rune{ - 0x0600, 0x07BF, // Arabic - 0x08A0, 0x08FF, // Arabic Extended-A - 0xFB50, 0xFDCF, // Arabic Presentation Forms - 0xFDF0, 0xFDFF, - 0xFE70, 0xFEFF, - 0x0001EE00, 0x0001EEFF, // Arabic Mathematical Alpha Symbols - }) - visitRunes(fn, R, []rune{ - 0x0590, 0x05FF, // Hebrew - 0x07C0, 0x089F, // Nko et al. - 0xFB1D, 0xFB4F, - 0x00010800, 0x00010FFF, // Cypriot Syllabary et. al. - 0x0001E800, 0x0001EDFF, - 0x0001EF00, 0x0001EFFF, - }) - visitRunes(fn, ET, []rune{ // European Terminator - 0x20A0, 0x20Cf, // Currency symbols - }) - rangetable.Visit(unicode.Noncharacter_Code_Point, func(r rune) { - fn(r, BN) // Boundary Neutral - }) - ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { - if p.String(1) == "Default_Ignorable_Code_Point" { - fn(p.Rune(0), BN) // Boundary Neutral - } - }) -} - -func visitRunes(fn func(r rune, c Class), c Class, runes []rune) { - for i := 0; i < len(runes); i += 2 { - lo, hi := runes[i], runes[i+1] - for j := lo; j <= hi; j++ { - fn(j, c) - } - } -} diff --git a/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go b/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go deleted file mode 100644 index 9cb994289..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// Class is the Unicode BiDi class. Each rune has a single class. -type Class uint - -const ( - L Class = iota // LeftToRight - R // RightToLeft - EN // EuropeanNumber - ES // EuropeanSeparator - ET // EuropeanTerminator - AN // ArabicNumber - CS // CommonSeparator - B // ParagraphSeparator - S // SegmentSeparator - WS // WhiteSpace - ON // OtherNeutral - BN // BoundaryNeutral - NSM // NonspacingMark - AL // ArabicLetter - Control // Control LRO - PDI - - numClass - - LRO // LeftToRightOverride - RLO // RightToLeftOverride - LRE // LeftToRightEmbedding - RLE // RightToLeftEmbedding - PDF // PopDirectionalFormat - LRI // LeftToRightIsolate - RLI // RightToLeftIsolate - FSI // FirstStrongIsolate - PDI // PopDirectionalIsolate - - unknownClass = ^Class(0) -) - -var controlToClass = map[rune]Class{ - 0x202D: LRO, // LeftToRightOverride, - 0x202E: RLO, // RightToLeftOverride, - 0x202A: LRE, // LeftToRightEmbedding, - 0x202B: RLE, // RightToLeftEmbedding, - 0x202C: PDF, // PopDirectionalFormat, - 0x2066: LRI, // LeftToRightIsolate, - 0x2067: RLI, // RightToLeftIsolate, - 0x2068: FSI, // FirstStrongIsolate, - 0x2069: PDI, // PopDirectionalIsolate, -} - -// A trie entry has the following bits: -// 7..5 XOR mask for brackets -// 4 1: Bracket open, 0: Bracket close -// 3..0 Class type - -const ( - openMask = 0x10 - xorMaskShift = 5 -) diff --git a/vendor/golang.org/x/text/unicode/bidi/prop.go b/vendor/golang.org/x/text/unicode/bidi/prop.go deleted file mode 100644 index 7c9484e1f..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/prop.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bidi - -import "unicode/utf8" - -// Properties provides access to BiDi properties of runes. -type Properties struct { - entry uint8 - last uint8 -} - -var trie = newBidiTrie(0) - -// TODO: using this for bidirule reduces the running time by about 5%. Consider -// if this is worth exposing or if we can find a way to speed up the Class -// method. -// -// // CompactClass is like Class, but maps all of the BiDi control classes -// // (LRO, RLO, LRE, RLE, PDF, LRI, RLI, FSI, PDI) to the class Control. -// func (p Properties) CompactClass() Class { -// return Class(p.entry & 0x0F) -// } - -// Class returns the Bidi class for p. -func (p Properties) Class() Class { - c := Class(p.entry & 0x0F) - if c == Control { - c = controlByteToClass[p.last&0xF] - } - return c -} - -// IsBracket reports whether the rune is a bracket. -func (p Properties) IsBracket() bool { return p.entry&0xF0 != 0 } - -// IsOpeningBracket reports whether the rune is an opening bracket. -// IsBracket must return true. -func (p Properties) IsOpeningBracket() bool { return p.entry&openMask != 0 } - -// TODO: find a better API and expose. -func (p Properties) reverseBracket(r rune) rune { - return xorMasks[p.entry>>xorMaskShift] ^ r -} - -var controlByteToClass = [16]Class{ - 0xD: LRO, // U+202D LeftToRightOverride, - 0xE: RLO, // U+202E RightToLeftOverride, - 0xA: LRE, // U+202A LeftToRightEmbedding, - 0xB: RLE, // U+202B RightToLeftEmbedding, - 0xC: PDF, // U+202C PopDirectionalFormat, - 0x6: LRI, // U+2066 LeftToRightIsolate, - 0x7: RLI, // U+2067 RightToLeftIsolate, - 0x8: FSI, // U+2068 FirstStrongIsolate, - 0x9: PDI, // U+2069 PopDirectionalIsolate, -} - -// LookupRune returns properties for r. -func LookupRune(r rune) (p Properties, size int) { - var buf [4]byte - n := utf8.EncodeRune(buf[:], r) - return Lookup(buf[:n]) -} - -// TODO: these lookup methods are based on the generated trie code. The returned -// sizes have slightly different semantics from the generated code, in that it -// always returns size==1 for an illegal UTF-8 byte (instead of the length -// of the maximum invalid subsequence). Most Transformers, like unicode/norm, -// leave invalid UTF-8 untouched, in which case it has performance benefits to -// do so (without changing the semantics). Bidi requires the semantics used here -// for the bidirule implementation to be compatible with the Go semantics. -// They ultimately should perhaps be adopted by all trie implementations, for -// convenience sake. -// This unrolled code also boosts performance of the secure/bidirule package by -// about 30%. -// So, to remove this code: -// - add option to trie generator to define return type. -// - always return 1 byte size for ill-formed UTF-8 runes. - -// Lookup returns properties for the first rune in s and the width in bytes of -// its encoding. The size will be 0 if s does not hold enough bytes to complete -// the encoding. -func Lookup(s []byte) (p Properties, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return Properties{entry: bidiValues[c0]}, 1 - case c0 < 0xC2: - return Properties{}, 1 - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return Properties{}, 1 - } - o = uint32(i)<<6 + uint32(c2) - i = bidiIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4 - } - // Illegal rune - return Properties{}, 1 -} - -// LookupString returns properties for the first rune in s and the width in -// bytes of its encoding. The size will be 0 if s does not hold enough bytes to -// complete the encoding. -func LookupString(s string) (p Properties, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return Properties{entry: bidiValues[c0]}, 1 - case c0 < 0xC2: - return Properties{}, 1 - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c1)}, 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return Properties{}, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return Properties{}, 1 - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return Properties{}, 1 - } - o = uint32(i)<<6 + uint32(c2) - i = bidiIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return Properties{}, 1 - } - return Properties{entry: trie.lookupValue(uint32(i), c3)}, 4 - } - // Illegal rune - return Properties{}, 1 -} diff --git a/vendor/golang.org/x/text/unicode/bidi/ranges_test.go b/vendor/golang.org/x/text/unicode/bidi/ranges_test.go deleted file mode 100644 index bfaecd502..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/ranges_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package bidi - -import ( - "unicode" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/ucd" - "golang.org/x/text/unicode/rangetable" -) - -// These tables are hand-extracted from: -// http://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedBidiClass.txt -func visitDefaults(fn func(r rune, c Class)) { - // first write default values for ranges listed above. - visitRunes(fn, AL, []rune{ - 0x0600, 0x07BF, // Arabic - 0x08A0, 0x08FF, // Arabic Extended-A - 0xFB50, 0xFDCF, // Arabic Presentation Forms - 0xFDF0, 0xFDFF, - 0xFE70, 0xFEFF, - 0x0001EE00, 0x0001EEFF, // Arabic Mathematical Alpha Symbols - }) - visitRunes(fn, R, []rune{ - 0x0590, 0x05FF, // Hebrew - 0x07C0, 0x089F, // Nko et al. - 0xFB1D, 0xFB4F, - 0x00010800, 0x00010FFF, // Cypriot Syllabary et. al. - 0x0001E800, 0x0001EDFF, - 0x0001EF00, 0x0001EFFF, - }) - visitRunes(fn, ET, []rune{ // European Terminator - 0x20A0, 0x20Cf, // Currency symbols - }) - rangetable.Visit(unicode.Noncharacter_Code_Point, func(r rune) { - fn(r, BN) // Boundary Neutral - }) - ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { - if p.String(1) == "Default_Ignorable_Code_Point" { - fn(p.Rune(0), BN) // Boundary Neutral - } - }) -} - -func visitRunes(fn func(r rune, c Class), c Class, runes []rune) { - for i := 0; i < len(runes); i += 2 { - lo, hi := runes[i], runes[i+1] - for j := lo; j <= hi; j++ { - fn(j, c) - } - } -} diff --git a/vendor/golang.org/x/text/unicode/bidi/tables.go b/vendor/golang.org/x/text/unicode/bidi/tables.go deleted file mode 100644 index 7212d5add..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/tables.go +++ /dev/null @@ -1,1779 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package bidi - -// UnicodeVersion is the Unicode version from which the tables in this package are derived. -const UnicodeVersion = "9.0.0" - -// xorMasks contains masks to be xor-ed with brackets to get the reverse -// version. -var xorMasks = []int32{ // 8 elements - 0, 1, 6, 7, 3, 15, 29, 63, -} // Size: 56 bytes - -// lookup returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return bidiValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = bidiIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return bidiValues[c0] - } - i := bidiIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = bidiIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = bidiIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// lookupString returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return bidiValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := bidiIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = bidiIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = bidiIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return bidiValues[c0] - } - i := bidiIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = bidiIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = bidiIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// bidiTrie. Total size: 15744 bytes (15.38 KiB). Checksum: b4c3b70954803b86. -type bidiTrie struct{} - -func newBidiTrie(i int) *bidiTrie { - return &bidiTrie{} -} - -// lookupValue determines the type of block n and looks up the value for b. -func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { - switch { - default: - return uint8(bidiValues[n<<6+uint32(b)]) - } -} - -// bidiValues: 222 blocks, 14208 entries, 14208 bytes -// The third block is the zero block. -var bidiValues = [14208]uint8{ - // Block 0x0, offset 0x0 - 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, - 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, - 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, - 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, - 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, - 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, - 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, - 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, - 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, - 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, - 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, - // Block 0x1, offset 0x40 - 0x40: 0x000a, - 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, - 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, - 0x7b: 0x005a, - 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, - 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, - 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, - 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, - 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, - 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, - 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, - 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, - 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, - 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, - 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, - // Block 0x4, offset 0x100 - 0x117: 0x000a, - 0x137: 0x000a, - // Block 0x5, offset 0x140 - 0x179: 0x000a, 0x17a: 0x000a, - // Block 0x6, offset 0x180 - 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, - 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, - 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, - 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, - 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, - 0x19e: 0x000a, 0x19f: 0x000a, - 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, - 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, - 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, - 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, - 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, - 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, - 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, - 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, - 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, - 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, - 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, - 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, - 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, - 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, - 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, - // Block 0x8, offset 0x200 - 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, - 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, - 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, - 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, - 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, - 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, - 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, - 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, - 0x234: 0x000a, 0x235: 0x000a, - 0x23e: 0x000a, - // Block 0x9, offset 0x240 - 0x244: 0x000a, 0x245: 0x000a, - 0x247: 0x000a, - // Block 0xa, offset 0x280 - 0x2b6: 0x000a, - // Block 0xb, offset 0x2c0 - 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, - 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, - // Block 0xc, offset 0x300 - 0x30a: 0x000a, - 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, - 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, - 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, - 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, - 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, - 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, - 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, - 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, - 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, - // Block 0xd, offset 0x340 - 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, - 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, - 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, - 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, - 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, - 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, - 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, - 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, - 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, - 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, - 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, - // Block 0xe, offset 0x380 - 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, - 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, - 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, - 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, - 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, - 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, - 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, - 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, - 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, - 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, - 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, - 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, - 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, - 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, - 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, - 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, - 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, - 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, - 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, - 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, - 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, - // Block 0x10, offset 0x400 - 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, - 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, - 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, - 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, - 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, - 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, - 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, - 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, - 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, - 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, - 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, - // Block 0x11, offset 0x440 - 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, - 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, - 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, - 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, - 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, - 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, - 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, - 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, - 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, - 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, - 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, - // Block 0x12, offset 0x480 - 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, - 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, - 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, - 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, - 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, - 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, - 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, - 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, - 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, - 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, - 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, - // Block 0x13, offset 0x4c0 - 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, - 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, - 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, - 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, - 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, - 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, - 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, - 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, - 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, - 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, - 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, - // Block 0x14, offset 0x500 - 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, - 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, - 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, - 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, - 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, - 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, - 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, - 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, - 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, - 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, - 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, - // Block 0x15, offset 0x540 - 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, - 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, - 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, - 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, - 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, - 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, - 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, - 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, - 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, - 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, - 0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001, - // Block 0x16, offset 0x580 - 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, - 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, - 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, - 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, - 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, - 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, - 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, - 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, - 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, - 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, - 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, - // Block 0x17, offset 0x5c0 - 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, - 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, - 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, - 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, - 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, - 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x0001, 0x5e1: 0x0001, 0x5e2: 0x0001, 0x5e3: 0x0001, - 0x5e4: 0x0001, 0x5e5: 0x0001, 0x5e6: 0x0001, 0x5e7: 0x0001, 0x5e8: 0x0001, 0x5e9: 0x0001, - 0x5ea: 0x0001, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001, - 0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001, - 0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001, - 0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001, - // Block 0x18, offset 0x600 - 0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001, - 0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001, - 0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001, - 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, - 0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001, - 0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, - 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, - 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, - 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, - 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, - 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, - // Block 0x19, offset 0x640 - 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, - 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d, - 0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d, - 0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, - 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, - 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, - 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, - 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, - 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, - 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, - 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, - // Block 0x1a, offset 0x680 - 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, - 0x6ba: 0x000c, - 0x6bc: 0x000c, - // Block 0x1b, offset 0x6c0 - 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, - 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, - 0x6cd: 0x000c, 0x6d1: 0x000c, - 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, - 0x6e2: 0x000c, 0x6e3: 0x000c, - // Block 0x1c, offset 0x700 - 0x701: 0x000c, - 0x73c: 0x000c, - // Block 0x1d, offset 0x740 - 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, - 0x74d: 0x000c, - 0x762: 0x000c, 0x763: 0x000c, - 0x772: 0x0004, 0x773: 0x0004, - 0x77b: 0x0004, - // Block 0x1e, offset 0x780 - 0x781: 0x000c, 0x782: 0x000c, - 0x7bc: 0x000c, - // Block 0x1f, offset 0x7c0 - 0x7c1: 0x000c, 0x7c2: 0x000c, - 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, - 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, - 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, - // Block 0x20, offset 0x800 - 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, - 0x807: 0x000c, 0x808: 0x000c, - 0x80d: 0x000c, - 0x822: 0x000c, 0x823: 0x000c, - 0x831: 0x0004, - // Block 0x21, offset 0x840 - 0x841: 0x000c, - 0x87c: 0x000c, 0x87f: 0x000c, - // Block 0x22, offset 0x880 - 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, - 0x88d: 0x000c, - 0x896: 0x000c, - 0x8a2: 0x000c, 0x8a3: 0x000c, - // Block 0x23, offset 0x8c0 - 0x8c2: 0x000c, - // Block 0x24, offset 0x900 - 0x900: 0x000c, - 0x90d: 0x000c, - 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, - 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, - // Block 0x25, offset 0x940 - 0x940: 0x000c, - 0x97e: 0x000c, 0x97f: 0x000c, - // Block 0x26, offset 0x980 - 0x980: 0x000c, - 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, - 0x98c: 0x000c, 0x98d: 0x000c, - 0x995: 0x000c, 0x996: 0x000c, - 0x9a2: 0x000c, 0x9a3: 0x000c, - 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, - 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, - // Block 0x27, offset 0x9c0 - 0x9cc: 0x000c, 0x9cd: 0x000c, - 0x9e2: 0x000c, 0x9e3: 0x000c, - // Block 0x28, offset 0xa00 - 0xa01: 0x000c, - // Block 0x29, offset 0xa40 - 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, - 0xa4d: 0x000c, - 0xa62: 0x000c, 0xa63: 0x000c, - // Block 0x2a, offset 0xa80 - 0xa8a: 0x000c, - 0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c, - // Block 0x2b, offset 0xac0 - 0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c, - 0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c, - 0xaff: 0x0004, - // Block 0x2c, offset 0xb00 - 0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c, - 0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c, - // Block 0x2d, offset 0xb40 - 0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c, - 0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c, - 0xb7c: 0x000c, - // Block 0x2e, offset 0xb80 - 0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c, - 0xb8c: 0x000c, 0xb8d: 0x000c, - // Block 0x2f, offset 0xbc0 - 0xbd8: 0x000c, 0xbd9: 0x000c, - 0xbf5: 0x000c, - 0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a, - 0xbfc: 0x003a, 0xbfd: 0x002a, - // Block 0x30, offset 0xc00 - 0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c, - 0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c, - 0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c, - // Block 0x31, offset 0xc40 - 0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c, - 0xc46: 0x000c, 0xc47: 0x000c, - 0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c, - 0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c, - 0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c, - 0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c, - 0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c, - 0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c, - 0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, - 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, - 0xc7c: 0x000c, - // Block 0x32, offset 0xc80 - 0xc86: 0x000c, - // Block 0x33, offset 0xcc0 - 0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c, - 0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c, - 0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c, - 0xcfd: 0x000c, 0xcfe: 0x000c, - // Block 0x34, offset 0xd00 - 0xd18: 0x000c, 0xd19: 0x000c, - 0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c, - 0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, - // Block 0x35, offset 0xd40 - 0xd42: 0x000c, 0xd45: 0x000c, - 0xd46: 0x000c, - 0xd4d: 0x000c, - 0xd5d: 0x000c, - // Block 0x36, offset 0xd80 - 0xd9d: 0x000c, - 0xd9e: 0x000c, 0xd9f: 0x000c, - // Block 0x37, offset 0xdc0 - 0xdd0: 0x000a, 0xdd1: 0x000a, - 0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a, - 0xdd8: 0x000a, 0xdd9: 0x000a, - // Block 0x38, offset 0xe00 - 0xe00: 0x000a, - // Block 0x39, offset 0xe40 - 0xe40: 0x0009, - 0xe5b: 0x007a, 0xe5c: 0x006a, - // Block 0x3a, offset 0xe80 - 0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c, - 0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c, - // Block 0x3b, offset 0xec0 - 0xed2: 0x000c, 0xed3: 0x000c, - 0xef2: 0x000c, 0xef3: 0x000c, - // Block 0x3c, offset 0xf00 - 0xf34: 0x000c, 0xf35: 0x000c, - 0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c, - 0xf3c: 0x000c, 0xf3d: 0x000c, - // Block 0x3d, offset 0xf40 - 0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c, - 0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c, - 0xf52: 0x000c, 0xf53: 0x000c, - 0xf5b: 0x0004, 0xf5d: 0x000c, - 0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a, - 0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a, - // Block 0x3e, offset 0xf80 - 0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a, - 0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c, - 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b, - // Block 0x3f, offset 0xfc0 - 0xfc5: 0x000c, - 0xfc6: 0x000c, - 0xfe9: 0x000c, - // Block 0x40, offset 0x1000 - 0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c, - 0x1027: 0x000c, 0x1028: 0x000c, - 0x1032: 0x000c, - 0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c, - // Block 0x41, offset 0x1040 - 0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a, - // Block 0x42, offset 0x1080 - 0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a, - 0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a, - 0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a, - 0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a, - 0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a, - 0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a, - // Block 0x43, offset 0x10c0 - 0x10d7: 0x000c, - 0x10d8: 0x000c, 0x10db: 0x000c, - // Block 0x44, offset 0x1100 - 0x1116: 0x000c, - 0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c, - 0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c, - 0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c, - 0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c, - 0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c, - 0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c, - 0x113c: 0x000c, 0x113f: 0x000c, - // Block 0x45, offset 0x1140 - 0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, - 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, - 0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c, - // Block 0x46, offset 0x1180 - 0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c, - 0x11b4: 0x000c, - 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, - 0x11bc: 0x000c, - // Block 0x47, offset 0x11c0 - 0x11c2: 0x000c, - 0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c, - 0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c, - // Block 0x48, offset 0x1200 - 0x1200: 0x000c, 0x1201: 0x000c, - 0x1222: 0x000c, 0x1223: 0x000c, - 0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c, - 0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c, - // Block 0x49, offset 0x1240 - 0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c, - 0x126d: 0x000c, 0x126f: 0x000c, - 0x1270: 0x000c, 0x1271: 0x000c, - // Block 0x4a, offset 0x1280 - 0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c, - 0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c, - 0x12b6: 0x000c, 0x12b7: 0x000c, - // Block 0x4b, offset 0x12c0 - 0x12d0: 0x000c, 0x12d1: 0x000c, - 0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c, - 0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c, - 0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c, - 0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c, - 0x12ed: 0x000c, - 0x12f4: 0x000c, - 0x12f8: 0x000c, 0x12f9: 0x000c, - // Block 0x4c, offset 0x1300 - 0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c, - 0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c, - 0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c, - 0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c, - 0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c, - 0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c, - 0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c, - 0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, - 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c, - 0x133b: 0x000c, - 0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c, - // Block 0x4d, offset 0x1340 - 0x137d: 0x000a, 0x137f: 0x000a, - // Block 0x4e, offset 0x1380 - 0x1380: 0x000a, 0x1381: 0x000a, - 0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a, - 0x139d: 0x000a, - 0x139e: 0x000a, 0x139f: 0x000a, - 0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a, - 0x13bd: 0x000a, 0x13be: 0x000a, - // Block 0x4f, offset 0x13c0 - 0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009, - 0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b, - 0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a, - 0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a, - 0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a, - 0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a, - 0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007, - 0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006, - 0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a, - 0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a, - 0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a, - // Block 0x50, offset 0x1400 - 0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a, - 0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a, - 0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a, - 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, - 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, - 0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b, - 0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e, - 0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b, - 0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002, - 0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003, - 0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a, - // Block 0x51, offset 0x1440 - 0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002, - 0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003, - 0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a, - 0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004, - 0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004, - 0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004, - 0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004, - 0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004, - 0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004, - // Block 0x52, offset 0x1480 - 0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004, - 0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004, - 0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c, - 0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c, - 0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c, - 0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c, - 0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c, - 0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c, - 0x14b0: 0x000c, - // Block 0x53, offset 0x14c0 - 0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a, - 0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a, - 0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a, - 0x14d8: 0x000a, - 0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a, - 0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a, - 0x14ee: 0x0004, - 0x14fa: 0x000a, 0x14fb: 0x000a, - // Block 0x54, offset 0x1500 - 0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, - 0x150a: 0x000a, 0x150b: 0x000a, - 0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a, - 0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, - 0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a, - 0x151e: 0x000a, 0x151f: 0x000a, - // Block 0x55, offset 0x1540 - 0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a, - 0x1550: 0x000a, 0x1551: 0x000a, - 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, - 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, - 0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a, - 0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a, - 0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a, - 0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a, - 0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a, - 0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a, - // Block 0x56, offset 0x1580 - 0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a, - 0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, - 0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a, - 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, - 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, - 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, - 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, - 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, - 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, - 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, - 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, - // Block 0x57, offset 0x15c0 - 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, - 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, - 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, - 0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, - 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, - 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, - 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, - 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, - 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, - 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, - 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, - // Block 0x58, offset 0x1600 - 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, - 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a, - 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, - 0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, - 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, - 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, - 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a, - 0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, - 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, - // Block 0x59, offset 0x1640 - 0x167b: 0x000a, - 0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a, - // Block 0x5a, offset 0x1680 - 0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a, - 0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a, - 0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a, - 0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a, - 0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a, - 0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a, - 0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a, - 0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a, - 0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a, - 0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a, - 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, - // Block 0x5b, offset 0x16c0 - 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, - 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, - 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, - 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, - 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, - 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, - 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a, - 0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a, - 0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a, - 0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a, - 0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a, - // Block 0x5c, offset 0x1700 - 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, - 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a, - 0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a, - 0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a, - 0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a, - 0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, - 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, - // Block 0x5d, offset 0x1740 - 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, - 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a, - 0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a, - 0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a, - 0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a, - 0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a, - 0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a, - 0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a, - // Block 0x5e, offset 0x1780 - 0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a, - 0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002, - 0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002, - 0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002, - 0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002, - // Block 0x5f, offset 0x17c0 - 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, - 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, - 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, - 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, - // Block 0x60, offset 0x1800 - 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, - 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, - 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, - 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, - 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, - 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, - 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a, - 0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a, - 0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a, - 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, - 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, - // Block 0x61, offset 0x1840 - 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a, - 0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, - 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, - 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, - 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, - 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, - 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a, - 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, - 0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a, - 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, - 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, - // Block 0x62, offset 0x1880 - 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a, - 0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a, - 0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a, - 0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a, - 0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, - 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, - 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a, - 0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a, - 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, - 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, - 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, - // Block 0x63, offset 0x18c0 - 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a, - 0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a, - 0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a, - 0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba, - 0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a, - 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, - 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, - 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, - 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, - 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, - 0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a, - // Block 0x64, offset 0x1900 - 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, - 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, - 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, - 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, - 0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a, - 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, - 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, - 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, - 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a, - 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, - 0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a, - // Block 0x65, offset 0x1940 - 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, - 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, - 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, - 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a, - 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, - 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, - 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, - 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, - 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, - 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a, - 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, - // Block 0x66, offset 0x1980 - 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, - 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, - 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, - 0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, - 0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a, - 0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a, - 0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a, - 0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, - 0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a, - 0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, - 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a, - // Block 0x67, offset 0x19c0 - 0x19c0: 0x000a, 0x19c1: 0x000a, 0x19c2: 0x000a, 0x19c3: 0x000a, 0x19c4: 0x000a, 0x19c5: 0x000a, - 0x19c6: 0x000a, 0x19c7: 0x000a, 0x19c8: 0x000a, 0x19ca: 0x000a, 0x19cb: 0x000a, - 0x19cc: 0x000a, 0x19cd: 0x000a, 0x19ce: 0x000a, 0x19cf: 0x000a, 0x19d0: 0x000a, 0x19d1: 0x000a, - 0x19ec: 0x000a, 0x19ed: 0x000a, 0x19ee: 0x000a, 0x19ef: 0x000a, - // Block 0x68, offset 0x1a00 - 0x1a25: 0x000a, 0x1a26: 0x000a, 0x1a27: 0x000a, 0x1a28: 0x000a, 0x1a29: 0x000a, - 0x1a2a: 0x000a, 0x1a2f: 0x000c, - 0x1a30: 0x000c, 0x1a31: 0x000c, - 0x1a39: 0x000a, 0x1a3a: 0x000a, 0x1a3b: 0x000a, - 0x1a3c: 0x000a, 0x1a3d: 0x000a, 0x1a3e: 0x000a, 0x1a3f: 0x000a, - // Block 0x69, offset 0x1a40 - 0x1a7f: 0x000c, - // Block 0x6a, offset 0x1a80 - 0x1aa0: 0x000c, 0x1aa1: 0x000c, 0x1aa2: 0x000c, 0x1aa3: 0x000c, - 0x1aa4: 0x000c, 0x1aa5: 0x000c, 0x1aa6: 0x000c, 0x1aa7: 0x000c, 0x1aa8: 0x000c, 0x1aa9: 0x000c, - 0x1aaa: 0x000c, 0x1aab: 0x000c, 0x1aac: 0x000c, 0x1aad: 0x000c, 0x1aae: 0x000c, 0x1aaf: 0x000c, - 0x1ab0: 0x000c, 0x1ab1: 0x000c, 0x1ab2: 0x000c, 0x1ab3: 0x000c, 0x1ab4: 0x000c, 0x1ab5: 0x000c, - 0x1ab6: 0x000c, 0x1ab7: 0x000c, 0x1ab8: 0x000c, 0x1ab9: 0x000c, 0x1aba: 0x000c, 0x1abb: 0x000c, - 0x1abc: 0x000c, 0x1abd: 0x000c, 0x1abe: 0x000c, 0x1abf: 0x000c, - // Block 0x6b, offset 0x1ac0 - 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, - 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a, - 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a, - 0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x000a, 0x1ad6: 0x000a, 0x1ad7: 0x000a, - 0x1ad8: 0x000a, 0x1ad9: 0x000a, 0x1ada: 0x000a, 0x1adb: 0x000a, 0x1adc: 0x000a, 0x1add: 0x000a, - 0x1ade: 0x000a, 0x1adf: 0x000a, 0x1ae0: 0x000a, 0x1ae1: 0x000a, 0x1ae2: 0x003a, 0x1ae3: 0x002a, - 0x1ae4: 0x003a, 0x1ae5: 0x002a, 0x1ae6: 0x003a, 0x1ae7: 0x002a, 0x1ae8: 0x003a, 0x1ae9: 0x002a, - 0x1aea: 0x000a, 0x1aeb: 0x000a, 0x1aec: 0x000a, 0x1aed: 0x000a, 0x1aee: 0x000a, 0x1aef: 0x000a, - 0x1af0: 0x000a, 0x1af1: 0x000a, 0x1af2: 0x000a, 0x1af3: 0x000a, 0x1af4: 0x000a, 0x1af5: 0x000a, - 0x1af6: 0x000a, 0x1af7: 0x000a, 0x1af8: 0x000a, 0x1af9: 0x000a, 0x1afa: 0x000a, 0x1afb: 0x000a, - 0x1afc: 0x000a, 0x1afd: 0x000a, 0x1afe: 0x000a, 0x1aff: 0x000a, - // Block 0x6c, offset 0x1b00 - 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, - // Block 0x6d, offset 0x1b40 - 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, - 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, - 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, - 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, - 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, - 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, - 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, - 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, - 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, 0x1b74: 0x000a, 0x1b75: 0x000a, - 0x1b76: 0x000a, 0x1b77: 0x000a, 0x1b78: 0x000a, 0x1b79: 0x000a, 0x1b7a: 0x000a, 0x1b7b: 0x000a, - 0x1b7c: 0x000a, 0x1b7d: 0x000a, 0x1b7e: 0x000a, 0x1b7f: 0x000a, - // Block 0x6e, offset 0x1b80 - 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, - 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, - 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, - 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, 0x1b96: 0x000a, 0x1b97: 0x000a, - 0x1b98: 0x000a, 0x1b99: 0x000a, 0x1b9a: 0x000a, 0x1b9b: 0x000a, 0x1b9c: 0x000a, 0x1b9d: 0x000a, - 0x1b9e: 0x000a, 0x1b9f: 0x000a, 0x1ba0: 0x000a, 0x1ba1: 0x000a, 0x1ba2: 0x000a, 0x1ba3: 0x000a, - 0x1ba4: 0x000a, 0x1ba5: 0x000a, 0x1ba6: 0x000a, 0x1ba7: 0x000a, 0x1ba8: 0x000a, 0x1ba9: 0x000a, - 0x1baa: 0x000a, 0x1bab: 0x000a, 0x1bac: 0x000a, 0x1bad: 0x000a, 0x1bae: 0x000a, 0x1baf: 0x000a, - 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, - // Block 0x6f, offset 0x1bc0 - 0x1bc0: 0x000a, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, 0x1bc5: 0x000a, - 0x1bc6: 0x000a, 0x1bc7: 0x000a, 0x1bc8: 0x000a, 0x1bc9: 0x000a, 0x1bca: 0x000a, 0x1bcb: 0x000a, - 0x1bcc: 0x000a, 0x1bcd: 0x000a, 0x1bce: 0x000a, 0x1bcf: 0x000a, 0x1bd0: 0x000a, 0x1bd1: 0x000a, - 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x000a, 0x1bd5: 0x000a, - 0x1bf0: 0x000a, 0x1bf1: 0x000a, 0x1bf2: 0x000a, 0x1bf3: 0x000a, 0x1bf4: 0x000a, 0x1bf5: 0x000a, - 0x1bf6: 0x000a, 0x1bf7: 0x000a, 0x1bf8: 0x000a, 0x1bf9: 0x000a, 0x1bfa: 0x000a, 0x1bfb: 0x000a, - // Block 0x70, offset 0x1c00 - 0x1c00: 0x0009, 0x1c01: 0x000a, 0x1c02: 0x000a, 0x1c03: 0x000a, 0x1c04: 0x000a, - 0x1c08: 0x003a, 0x1c09: 0x002a, 0x1c0a: 0x003a, 0x1c0b: 0x002a, - 0x1c0c: 0x003a, 0x1c0d: 0x002a, 0x1c0e: 0x003a, 0x1c0f: 0x002a, 0x1c10: 0x003a, 0x1c11: 0x002a, - 0x1c12: 0x000a, 0x1c13: 0x000a, 0x1c14: 0x003a, 0x1c15: 0x002a, 0x1c16: 0x003a, 0x1c17: 0x002a, - 0x1c18: 0x003a, 0x1c19: 0x002a, 0x1c1a: 0x003a, 0x1c1b: 0x002a, 0x1c1c: 0x000a, 0x1c1d: 0x000a, - 0x1c1e: 0x000a, 0x1c1f: 0x000a, 0x1c20: 0x000a, - 0x1c2a: 0x000c, 0x1c2b: 0x000c, 0x1c2c: 0x000c, 0x1c2d: 0x000c, - 0x1c30: 0x000a, - 0x1c36: 0x000a, 0x1c37: 0x000a, - 0x1c3d: 0x000a, 0x1c3e: 0x000a, 0x1c3f: 0x000a, - // Block 0x71, offset 0x1c40 - 0x1c59: 0x000c, 0x1c5a: 0x000c, 0x1c5b: 0x000a, 0x1c5c: 0x000a, - 0x1c60: 0x000a, - // Block 0x72, offset 0x1c80 - 0x1cbb: 0x000a, - // Block 0x73, offset 0x1cc0 - 0x1cc0: 0x000a, 0x1cc1: 0x000a, 0x1cc2: 0x000a, 0x1cc3: 0x000a, 0x1cc4: 0x000a, 0x1cc5: 0x000a, - 0x1cc6: 0x000a, 0x1cc7: 0x000a, 0x1cc8: 0x000a, 0x1cc9: 0x000a, 0x1cca: 0x000a, 0x1ccb: 0x000a, - 0x1ccc: 0x000a, 0x1ccd: 0x000a, 0x1cce: 0x000a, 0x1ccf: 0x000a, 0x1cd0: 0x000a, 0x1cd1: 0x000a, - 0x1cd2: 0x000a, 0x1cd3: 0x000a, 0x1cd4: 0x000a, 0x1cd5: 0x000a, 0x1cd6: 0x000a, 0x1cd7: 0x000a, - 0x1cd8: 0x000a, 0x1cd9: 0x000a, 0x1cda: 0x000a, 0x1cdb: 0x000a, 0x1cdc: 0x000a, 0x1cdd: 0x000a, - 0x1cde: 0x000a, 0x1cdf: 0x000a, 0x1ce0: 0x000a, 0x1ce1: 0x000a, 0x1ce2: 0x000a, 0x1ce3: 0x000a, - // Block 0x74, offset 0x1d00 - 0x1d1d: 0x000a, - 0x1d1e: 0x000a, - // Block 0x75, offset 0x1d40 - 0x1d50: 0x000a, 0x1d51: 0x000a, - 0x1d52: 0x000a, 0x1d53: 0x000a, 0x1d54: 0x000a, 0x1d55: 0x000a, 0x1d56: 0x000a, 0x1d57: 0x000a, - 0x1d58: 0x000a, 0x1d59: 0x000a, 0x1d5a: 0x000a, 0x1d5b: 0x000a, 0x1d5c: 0x000a, 0x1d5d: 0x000a, - 0x1d5e: 0x000a, 0x1d5f: 0x000a, - 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, - // Block 0x76, offset 0x1d80 - 0x1db1: 0x000a, 0x1db2: 0x000a, 0x1db3: 0x000a, 0x1db4: 0x000a, 0x1db5: 0x000a, - 0x1db6: 0x000a, 0x1db7: 0x000a, 0x1db8: 0x000a, 0x1db9: 0x000a, 0x1dba: 0x000a, 0x1dbb: 0x000a, - 0x1dbc: 0x000a, 0x1dbd: 0x000a, 0x1dbe: 0x000a, 0x1dbf: 0x000a, - // Block 0x77, offset 0x1dc0 - 0x1dcc: 0x000a, 0x1dcd: 0x000a, 0x1dce: 0x000a, 0x1dcf: 0x000a, - // Block 0x78, offset 0x1e00 - 0x1e37: 0x000a, 0x1e38: 0x000a, 0x1e39: 0x000a, 0x1e3a: 0x000a, - // Block 0x79, offset 0x1e40 - 0x1e5e: 0x000a, 0x1e5f: 0x000a, - 0x1e7f: 0x000a, - // Block 0x7a, offset 0x1e80 - 0x1e90: 0x000a, 0x1e91: 0x000a, - 0x1e92: 0x000a, 0x1e93: 0x000a, 0x1e94: 0x000a, 0x1e95: 0x000a, 0x1e96: 0x000a, 0x1e97: 0x000a, - 0x1e98: 0x000a, 0x1e99: 0x000a, 0x1e9a: 0x000a, 0x1e9b: 0x000a, 0x1e9c: 0x000a, 0x1e9d: 0x000a, - 0x1e9e: 0x000a, 0x1e9f: 0x000a, 0x1ea0: 0x000a, 0x1ea1: 0x000a, 0x1ea2: 0x000a, 0x1ea3: 0x000a, - 0x1ea4: 0x000a, 0x1ea5: 0x000a, 0x1ea6: 0x000a, 0x1ea7: 0x000a, 0x1ea8: 0x000a, 0x1ea9: 0x000a, - 0x1eaa: 0x000a, 0x1eab: 0x000a, 0x1eac: 0x000a, 0x1ead: 0x000a, 0x1eae: 0x000a, 0x1eaf: 0x000a, - 0x1eb0: 0x000a, 0x1eb1: 0x000a, 0x1eb2: 0x000a, 0x1eb3: 0x000a, 0x1eb4: 0x000a, 0x1eb5: 0x000a, - 0x1eb6: 0x000a, 0x1eb7: 0x000a, 0x1eb8: 0x000a, 0x1eb9: 0x000a, 0x1eba: 0x000a, 0x1ebb: 0x000a, - 0x1ebc: 0x000a, 0x1ebd: 0x000a, 0x1ebe: 0x000a, 0x1ebf: 0x000a, - // Block 0x7b, offset 0x1ec0 - 0x1ec0: 0x000a, 0x1ec1: 0x000a, 0x1ec2: 0x000a, 0x1ec3: 0x000a, 0x1ec4: 0x000a, 0x1ec5: 0x000a, - 0x1ec6: 0x000a, - // Block 0x7c, offset 0x1f00 - 0x1f0d: 0x000a, 0x1f0e: 0x000a, 0x1f0f: 0x000a, - // Block 0x7d, offset 0x1f40 - 0x1f6f: 0x000c, - 0x1f70: 0x000c, 0x1f71: 0x000c, 0x1f72: 0x000c, 0x1f73: 0x000a, 0x1f74: 0x000c, 0x1f75: 0x000c, - 0x1f76: 0x000c, 0x1f77: 0x000c, 0x1f78: 0x000c, 0x1f79: 0x000c, 0x1f7a: 0x000c, 0x1f7b: 0x000c, - 0x1f7c: 0x000c, 0x1f7d: 0x000c, 0x1f7e: 0x000a, 0x1f7f: 0x000a, - // Block 0x7e, offset 0x1f80 - 0x1f9e: 0x000c, 0x1f9f: 0x000c, - // Block 0x7f, offset 0x1fc0 - 0x1ff0: 0x000c, 0x1ff1: 0x000c, - // Block 0x80, offset 0x2000 - 0x2000: 0x000a, 0x2001: 0x000a, 0x2002: 0x000a, 0x2003: 0x000a, 0x2004: 0x000a, 0x2005: 0x000a, - 0x2006: 0x000a, 0x2007: 0x000a, 0x2008: 0x000a, 0x2009: 0x000a, 0x200a: 0x000a, 0x200b: 0x000a, - 0x200c: 0x000a, 0x200d: 0x000a, 0x200e: 0x000a, 0x200f: 0x000a, 0x2010: 0x000a, 0x2011: 0x000a, - 0x2012: 0x000a, 0x2013: 0x000a, 0x2014: 0x000a, 0x2015: 0x000a, 0x2016: 0x000a, 0x2017: 0x000a, - 0x2018: 0x000a, 0x2019: 0x000a, 0x201a: 0x000a, 0x201b: 0x000a, 0x201c: 0x000a, 0x201d: 0x000a, - 0x201e: 0x000a, 0x201f: 0x000a, 0x2020: 0x000a, 0x2021: 0x000a, - // Block 0x81, offset 0x2040 - 0x2048: 0x000a, - // Block 0x82, offset 0x2080 - 0x2082: 0x000c, - 0x2086: 0x000c, 0x208b: 0x000c, - 0x20a5: 0x000c, 0x20a6: 0x000c, 0x20a8: 0x000a, 0x20a9: 0x000a, - 0x20aa: 0x000a, 0x20ab: 0x000a, - 0x20b8: 0x0004, 0x20b9: 0x0004, - // Block 0x83, offset 0x20c0 - 0x20f4: 0x000a, 0x20f5: 0x000a, - 0x20f6: 0x000a, 0x20f7: 0x000a, - // Block 0x84, offset 0x2100 - 0x2104: 0x000c, 0x2105: 0x000c, - 0x2120: 0x000c, 0x2121: 0x000c, 0x2122: 0x000c, 0x2123: 0x000c, - 0x2124: 0x000c, 0x2125: 0x000c, 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, - 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, 0x212e: 0x000c, 0x212f: 0x000c, - 0x2130: 0x000c, 0x2131: 0x000c, - // Block 0x85, offset 0x2140 - 0x2166: 0x000c, 0x2167: 0x000c, 0x2168: 0x000c, 0x2169: 0x000c, - 0x216a: 0x000c, 0x216b: 0x000c, 0x216c: 0x000c, 0x216d: 0x000c, - // Block 0x86, offset 0x2180 - 0x2187: 0x000c, 0x2188: 0x000c, 0x2189: 0x000c, 0x218a: 0x000c, 0x218b: 0x000c, - 0x218c: 0x000c, 0x218d: 0x000c, 0x218e: 0x000c, 0x218f: 0x000c, 0x2190: 0x000c, 0x2191: 0x000c, - // Block 0x87, offset 0x21c0 - 0x21c0: 0x000c, 0x21c1: 0x000c, 0x21c2: 0x000c, - 0x21f3: 0x000c, - 0x21f6: 0x000c, 0x21f7: 0x000c, 0x21f8: 0x000c, 0x21f9: 0x000c, - 0x21fc: 0x000c, - // Block 0x88, offset 0x2200 - 0x2225: 0x000c, - // Block 0x89, offset 0x2240 - 0x2269: 0x000c, - 0x226a: 0x000c, 0x226b: 0x000c, 0x226c: 0x000c, 0x226d: 0x000c, 0x226e: 0x000c, - 0x2271: 0x000c, 0x2272: 0x000c, 0x2275: 0x000c, - 0x2276: 0x000c, - // Block 0x8a, offset 0x2280 - 0x2283: 0x000c, - 0x228c: 0x000c, - 0x22bc: 0x000c, - // Block 0x8b, offset 0x22c0 - 0x22f0: 0x000c, 0x22f2: 0x000c, 0x22f3: 0x000c, 0x22f4: 0x000c, - 0x22f7: 0x000c, 0x22f8: 0x000c, - 0x22fe: 0x000c, 0x22ff: 0x000c, - // Block 0x8c, offset 0x2300 - 0x2301: 0x000c, - 0x232c: 0x000c, 0x232d: 0x000c, - 0x2336: 0x000c, - // Block 0x8d, offset 0x2340 - 0x2365: 0x000c, 0x2368: 0x000c, - 0x236d: 0x000c, - // Block 0x8e, offset 0x2380 - 0x239d: 0x0001, - 0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001, - 0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003, - 0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001, - 0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001, - 0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001, - 0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001, - // Block 0x8f, offset 0x23c0 - 0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001, - 0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001, - 0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d, - 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, - 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, - 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, - 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, - 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, - 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, - 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, - 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d, - // Block 0x90, offset 0x2400 - 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, - 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, - 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d, - 0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d, - 0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d, - 0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d, - 0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d, - 0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d, - 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, - 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, - 0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a, - // Block 0x91, offset 0x2440 - 0x2440: 0x000d, 0x2441: 0x000d, 0x2442: 0x000d, 0x2443: 0x000d, 0x2444: 0x000d, 0x2445: 0x000d, - 0x2446: 0x000d, 0x2447: 0x000d, 0x2448: 0x000d, 0x2449: 0x000d, 0x244a: 0x000d, 0x244b: 0x000d, - 0x244c: 0x000d, 0x244d: 0x000d, 0x244e: 0x000d, 0x244f: 0x000d, 0x2450: 0x000b, 0x2451: 0x000b, - 0x2452: 0x000b, 0x2453: 0x000b, 0x2454: 0x000b, 0x2455: 0x000b, 0x2456: 0x000b, 0x2457: 0x000b, - 0x2458: 0x000b, 0x2459: 0x000b, 0x245a: 0x000b, 0x245b: 0x000b, 0x245c: 0x000b, 0x245d: 0x000b, - 0x245e: 0x000b, 0x245f: 0x000b, 0x2460: 0x000b, 0x2461: 0x000b, 0x2462: 0x000b, 0x2463: 0x000b, - 0x2464: 0x000b, 0x2465: 0x000b, 0x2466: 0x000b, 0x2467: 0x000b, 0x2468: 0x000b, 0x2469: 0x000b, - 0x246a: 0x000b, 0x246b: 0x000b, 0x246c: 0x000b, 0x246d: 0x000b, 0x246e: 0x000b, 0x246f: 0x000b, - 0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d, - 0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d, - 0x247c: 0x000d, 0x247d: 0x000a, 0x247e: 0x000d, 0x247f: 0x000d, - // Block 0x92, offset 0x2480 - 0x2480: 0x000c, 0x2481: 0x000c, 0x2482: 0x000c, 0x2483: 0x000c, 0x2484: 0x000c, 0x2485: 0x000c, - 0x2486: 0x000c, 0x2487: 0x000c, 0x2488: 0x000c, 0x2489: 0x000c, 0x248a: 0x000c, 0x248b: 0x000c, - 0x248c: 0x000c, 0x248d: 0x000c, 0x248e: 0x000c, 0x248f: 0x000c, 0x2490: 0x000a, 0x2491: 0x000a, - 0x2492: 0x000a, 0x2493: 0x000a, 0x2494: 0x000a, 0x2495: 0x000a, 0x2496: 0x000a, 0x2497: 0x000a, - 0x2498: 0x000a, 0x2499: 0x000a, - 0x24a0: 0x000c, 0x24a1: 0x000c, 0x24a2: 0x000c, 0x24a3: 0x000c, - 0x24a4: 0x000c, 0x24a5: 0x000c, 0x24a6: 0x000c, 0x24a7: 0x000c, 0x24a8: 0x000c, 0x24a9: 0x000c, - 0x24aa: 0x000c, 0x24ab: 0x000c, 0x24ac: 0x000c, 0x24ad: 0x000c, 0x24ae: 0x000c, 0x24af: 0x000c, - 0x24b0: 0x000a, 0x24b1: 0x000a, 0x24b2: 0x000a, 0x24b3: 0x000a, 0x24b4: 0x000a, 0x24b5: 0x000a, - 0x24b6: 0x000a, 0x24b7: 0x000a, 0x24b8: 0x000a, 0x24b9: 0x000a, 0x24ba: 0x000a, 0x24bb: 0x000a, - 0x24bc: 0x000a, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a, - // Block 0x93, offset 0x24c0 - 0x24c0: 0x000a, 0x24c1: 0x000a, 0x24c2: 0x000a, 0x24c3: 0x000a, 0x24c4: 0x000a, 0x24c5: 0x000a, - 0x24c6: 0x000a, 0x24c7: 0x000a, 0x24c8: 0x000a, 0x24c9: 0x000a, 0x24ca: 0x000a, 0x24cb: 0x000a, - 0x24cc: 0x000a, 0x24cd: 0x000a, 0x24ce: 0x000a, 0x24cf: 0x000a, 0x24d0: 0x0006, 0x24d1: 0x000a, - 0x24d2: 0x0006, 0x24d4: 0x000a, 0x24d5: 0x0006, 0x24d6: 0x000a, 0x24d7: 0x000a, - 0x24d8: 0x000a, 0x24d9: 0x009a, 0x24da: 0x008a, 0x24db: 0x007a, 0x24dc: 0x006a, 0x24dd: 0x009a, - 0x24de: 0x008a, 0x24df: 0x0004, 0x24e0: 0x000a, 0x24e1: 0x000a, 0x24e2: 0x0003, 0x24e3: 0x0003, - 0x24e4: 0x000a, 0x24e5: 0x000a, 0x24e6: 0x000a, 0x24e8: 0x000a, 0x24e9: 0x0004, - 0x24ea: 0x0004, 0x24eb: 0x000a, - 0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d, - 0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d, - 0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000d, - // Block 0x94, offset 0x2500 - 0x2500: 0x000d, 0x2501: 0x000d, 0x2502: 0x000d, 0x2503: 0x000d, 0x2504: 0x000d, 0x2505: 0x000d, - 0x2506: 0x000d, 0x2507: 0x000d, 0x2508: 0x000d, 0x2509: 0x000d, 0x250a: 0x000d, 0x250b: 0x000d, - 0x250c: 0x000d, 0x250d: 0x000d, 0x250e: 0x000d, 0x250f: 0x000d, 0x2510: 0x000d, 0x2511: 0x000d, - 0x2512: 0x000d, 0x2513: 0x000d, 0x2514: 0x000d, 0x2515: 0x000d, 0x2516: 0x000d, 0x2517: 0x000d, - 0x2518: 0x000d, 0x2519: 0x000d, 0x251a: 0x000d, 0x251b: 0x000d, 0x251c: 0x000d, 0x251d: 0x000d, - 0x251e: 0x000d, 0x251f: 0x000d, 0x2520: 0x000d, 0x2521: 0x000d, 0x2522: 0x000d, 0x2523: 0x000d, - 0x2524: 0x000d, 0x2525: 0x000d, 0x2526: 0x000d, 0x2527: 0x000d, 0x2528: 0x000d, 0x2529: 0x000d, - 0x252a: 0x000d, 0x252b: 0x000d, 0x252c: 0x000d, 0x252d: 0x000d, 0x252e: 0x000d, 0x252f: 0x000d, - 0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d, - 0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d, - 0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000b, - // Block 0x95, offset 0x2540 - 0x2541: 0x000a, 0x2542: 0x000a, 0x2543: 0x0004, 0x2544: 0x0004, 0x2545: 0x0004, - 0x2546: 0x000a, 0x2547: 0x000a, 0x2548: 0x003a, 0x2549: 0x002a, 0x254a: 0x000a, 0x254b: 0x0003, - 0x254c: 0x0006, 0x254d: 0x0003, 0x254e: 0x0006, 0x254f: 0x0006, 0x2550: 0x0002, 0x2551: 0x0002, - 0x2552: 0x0002, 0x2553: 0x0002, 0x2554: 0x0002, 0x2555: 0x0002, 0x2556: 0x0002, 0x2557: 0x0002, - 0x2558: 0x0002, 0x2559: 0x0002, 0x255a: 0x0006, 0x255b: 0x000a, 0x255c: 0x000a, 0x255d: 0x000a, - 0x255e: 0x000a, 0x255f: 0x000a, 0x2560: 0x000a, - 0x257b: 0x005a, - 0x257c: 0x000a, 0x257d: 0x004a, 0x257e: 0x000a, 0x257f: 0x000a, - // Block 0x96, offset 0x2580 - 0x2580: 0x000a, - 0x259b: 0x005a, 0x259c: 0x000a, 0x259d: 0x004a, - 0x259e: 0x000a, 0x259f: 0x00fa, 0x25a0: 0x00ea, 0x25a1: 0x000a, 0x25a2: 0x003a, 0x25a3: 0x002a, - 0x25a4: 0x000a, 0x25a5: 0x000a, - // Block 0x97, offset 0x25c0 - 0x25e0: 0x0004, 0x25e1: 0x0004, 0x25e2: 0x000a, 0x25e3: 0x000a, - 0x25e4: 0x000a, 0x25e5: 0x0004, 0x25e6: 0x0004, 0x25e8: 0x000a, 0x25e9: 0x000a, - 0x25ea: 0x000a, 0x25eb: 0x000a, 0x25ec: 0x000a, 0x25ed: 0x000a, 0x25ee: 0x000a, - 0x25f0: 0x000b, 0x25f1: 0x000b, 0x25f2: 0x000b, 0x25f3: 0x000b, 0x25f4: 0x000b, 0x25f5: 0x000b, - 0x25f6: 0x000b, 0x25f7: 0x000b, 0x25f8: 0x000b, 0x25f9: 0x000a, 0x25fa: 0x000a, 0x25fb: 0x000a, - 0x25fc: 0x000a, 0x25fd: 0x000a, 0x25fe: 0x000b, 0x25ff: 0x000b, - // Block 0x98, offset 0x2600 - 0x2601: 0x000a, - // Block 0x99, offset 0x2640 - 0x2640: 0x000a, 0x2641: 0x000a, 0x2642: 0x000a, 0x2643: 0x000a, 0x2644: 0x000a, 0x2645: 0x000a, - 0x2646: 0x000a, 0x2647: 0x000a, 0x2648: 0x000a, 0x2649: 0x000a, 0x264a: 0x000a, 0x264b: 0x000a, - 0x264c: 0x000a, 0x2650: 0x000a, 0x2651: 0x000a, - 0x2652: 0x000a, 0x2653: 0x000a, 0x2654: 0x000a, 0x2655: 0x000a, 0x2656: 0x000a, 0x2657: 0x000a, - 0x2658: 0x000a, 0x2659: 0x000a, 0x265a: 0x000a, 0x265b: 0x000a, - 0x2660: 0x000a, - // Block 0x9a, offset 0x2680 - 0x26bd: 0x000c, - // Block 0x9b, offset 0x26c0 - 0x26e0: 0x000c, 0x26e1: 0x0002, 0x26e2: 0x0002, 0x26e3: 0x0002, - 0x26e4: 0x0002, 0x26e5: 0x0002, 0x26e6: 0x0002, 0x26e7: 0x0002, 0x26e8: 0x0002, 0x26e9: 0x0002, - 0x26ea: 0x0002, 0x26eb: 0x0002, 0x26ec: 0x0002, 0x26ed: 0x0002, 0x26ee: 0x0002, 0x26ef: 0x0002, - 0x26f0: 0x0002, 0x26f1: 0x0002, 0x26f2: 0x0002, 0x26f3: 0x0002, 0x26f4: 0x0002, 0x26f5: 0x0002, - 0x26f6: 0x0002, 0x26f7: 0x0002, 0x26f8: 0x0002, 0x26f9: 0x0002, 0x26fa: 0x0002, 0x26fb: 0x0002, - // Block 0x9c, offset 0x2700 - 0x2736: 0x000c, 0x2737: 0x000c, 0x2738: 0x000c, 0x2739: 0x000c, 0x273a: 0x000c, - // Block 0x9d, offset 0x2740 - 0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001, - 0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001, - 0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001, - 0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001, - 0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001, - 0x275e: 0x0001, 0x275f: 0x0001, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001, - 0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001, - 0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001, - 0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001, - 0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001, - 0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001, - // Block 0x9e, offset 0x2780 - 0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001, - 0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, - 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001, - 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, - 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, - 0x279e: 0x0001, 0x279f: 0x000a, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, - 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, - 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, - 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, - 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001, - 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001, - // Block 0x9f, offset 0x27c0 - 0x27c0: 0x0001, 0x27c1: 0x000c, 0x27c2: 0x000c, 0x27c3: 0x000c, 0x27c4: 0x0001, 0x27c5: 0x000c, - 0x27c6: 0x000c, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, - 0x27cc: 0x000c, 0x27cd: 0x000c, 0x27ce: 0x000c, 0x27cf: 0x000c, 0x27d0: 0x0001, 0x27d1: 0x0001, - 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, - 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, - 0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, - 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, - 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, - 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, - 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x000c, 0x27f9: 0x000c, 0x27fa: 0x000c, 0x27fb: 0x0001, - 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x000c, - // Block 0xa0, offset 0x2800 - 0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001, - 0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, - 0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001, - 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, - 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, - 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, - 0x2824: 0x0001, 0x2825: 0x000c, 0x2826: 0x000c, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, - 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, - 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, - 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x0001, 0x283a: 0x0001, 0x283b: 0x0001, - 0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x0001, - // Block 0xa1, offset 0x2840 - 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, - 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, - 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, - 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, - 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, - 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001, - 0x2864: 0x0001, 0x2865: 0x0001, 0x2866: 0x0001, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001, - 0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001, - 0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001, - 0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x000a, 0x287a: 0x000a, 0x287b: 0x000a, - 0x287c: 0x000a, 0x287d: 0x000a, 0x287e: 0x000a, 0x287f: 0x000a, - // Block 0xa2, offset 0x2880 - 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001, - 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001, - 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001, - 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001, - 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001, - 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0005, 0x28a1: 0x0005, 0x28a2: 0x0005, 0x28a3: 0x0005, - 0x28a4: 0x0005, 0x28a5: 0x0005, 0x28a6: 0x0005, 0x28a7: 0x0005, 0x28a8: 0x0005, 0x28a9: 0x0005, - 0x28aa: 0x0005, 0x28ab: 0x0005, 0x28ac: 0x0005, 0x28ad: 0x0005, 0x28ae: 0x0005, 0x28af: 0x0005, - 0x28b0: 0x0005, 0x28b1: 0x0005, 0x28b2: 0x0005, 0x28b3: 0x0005, 0x28b4: 0x0005, 0x28b5: 0x0005, - 0x28b6: 0x0005, 0x28b7: 0x0005, 0x28b8: 0x0005, 0x28b9: 0x0005, 0x28ba: 0x0005, 0x28bb: 0x0005, - 0x28bc: 0x0005, 0x28bd: 0x0005, 0x28be: 0x0005, 0x28bf: 0x0001, - // Block 0xa3, offset 0x28c0 - 0x28c1: 0x000c, - 0x28f8: 0x000c, 0x28f9: 0x000c, 0x28fa: 0x000c, 0x28fb: 0x000c, - 0x28fc: 0x000c, 0x28fd: 0x000c, 0x28fe: 0x000c, 0x28ff: 0x000c, - // Block 0xa4, offset 0x2900 - 0x2900: 0x000c, 0x2901: 0x000c, 0x2902: 0x000c, 0x2903: 0x000c, 0x2904: 0x000c, 0x2905: 0x000c, - 0x2906: 0x000c, - 0x2912: 0x000a, 0x2913: 0x000a, 0x2914: 0x000a, 0x2915: 0x000a, 0x2916: 0x000a, 0x2917: 0x000a, - 0x2918: 0x000a, 0x2919: 0x000a, 0x291a: 0x000a, 0x291b: 0x000a, 0x291c: 0x000a, 0x291d: 0x000a, - 0x291e: 0x000a, 0x291f: 0x000a, 0x2920: 0x000a, 0x2921: 0x000a, 0x2922: 0x000a, 0x2923: 0x000a, - 0x2924: 0x000a, 0x2925: 0x000a, - 0x293f: 0x000c, - // Block 0xa5, offset 0x2940 - 0x2940: 0x000c, 0x2941: 0x000c, - 0x2973: 0x000c, 0x2974: 0x000c, 0x2975: 0x000c, - 0x2976: 0x000c, 0x2979: 0x000c, 0x297a: 0x000c, - // Block 0xa6, offset 0x2980 - 0x2980: 0x000c, 0x2981: 0x000c, 0x2982: 0x000c, - 0x29a7: 0x000c, 0x29a8: 0x000c, 0x29a9: 0x000c, - 0x29aa: 0x000c, 0x29ab: 0x000c, 0x29ad: 0x000c, 0x29ae: 0x000c, 0x29af: 0x000c, - 0x29b0: 0x000c, 0x29b1: 0x000c, 0x29b2: 0x000c, 0x29b3: 0x000c, 0x29b4: 0x000c, - // Block 0xa7, offset 0x29c0 - 0x29f3: 0x000c, - // Block 0xa8, offset 0x2a00 - 0x2a00: 0x000c, 0x2a01: 0x000c, - 0x2a36: 0x000c, 0x2a37: 0x000c, 0x2a38: 0x000c, 0x2a39: 0x000c, 0x2a3a: 0x000c, 0x2a3b: 0x000c, - 0x2a3c: 0x000c, 0x2a3d: 0x000c, 0x2a3e: 0x000c, - // Block 0xa9, offset 0x2a40 - 0x2a4a: 0x000c, 0x2a4b: 0x000c, - 0x2a4c: 0x000c, - // Block 0xaa, offset 0x2a80 - 0x2aaf: 0x000c, - 0x2ab0: 0x000c, 0x2ab1: 0x000c, 0x2ab4: 0x000c, - 0x2ab6: 0x000c, 0x2ab7: 0x000c, - 0x2abe: 0x000c, - // Block 0xab, offset 0x2ac0 - 0x2adf: 0x000c, 0x2ae3: 0x000c, - 0x2ae4: 0x000c, 0x2ae5: 0x000c, 0x2ae6: 0x000c, 0x2ae7: 0x000c, 0x2ae8: 0x000c, 0x2ae9: 0x000c, - 0x2aea: 0x000c, - // Block 0xac, offset 0x2b00 - 0x2b00: 0x000c, 0x2b01: 0x000c, - 0x2b3c: 0x000c, - // Block 0xad, offset 0x2b40 - 0x2b40: 0x000c, - 0x2b66: 0x000c, 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c, - 0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6c: 0x000c, - 0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c, - // Block 0xae, offset 0x2b80 - 0x2bb8: 0x000c, 0x2bb9: 0x000c, 0x2bba: 0x000c, 0x2bbb: 0x000c, - 0x2bbc: 0x000c, 0x2bbd: 0x000c, 0x2bbe: 0x000c, 0x2bbf: 0x000c, - // Block 0xaf, offset 0x2bc0 - 0x2bc2: 0x000c, 0x2bc3: 0x000c, 0x2bc4: 0x000c, - 0x2bc6: 0x000c, - // Block 0xb0, offset 0x2c00 - 0x2c33: 0x000c, 0x2c34: 0x000c, 0x2c35: 0x000c, - 0x2c36: 0x000c, 0x2c37: 0x000c, 0x2c38: 0x000c, 0x2c3a: 0x000c, - 0x2c3f: 0x000c, - // Block 0xb1, offset 0x2c40 - 0x2c40: 0x000c, 0x2c42: 0x000c, 0x2c43: 0x000c, - // Block 0xb2, offset 0x2c80 - 0x2cb2: 0x000c, 0x2cb3: 0x000c, 0x2cb4: 0x000c, 0x2cb5: 0x000c, - 0x2cbc: 0x000c, 0x2cbd: 0x000c, 0x2cbf: 0x000c, - // Block 0xb3, offset 0x2cc0 - 0x2cc0: 0x000c, - 0x2cdc: 0x000c, 0x2cdd: 0x000c, - // Block 0xb4, offset 0x2d00 - 0x2d33: 0x000c, 0x2d34: 0x000c, 0x2d35: 0x000c, - 0x2d36: 0x000c, 0x2d37: 0x000c, 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c, - 0x2d3d: 0x000c, 0x2d3f: 0x000c, - // Block 0xb5, offset 0x2d40 - 0x2d40: 0x000c, - 0x2d60: 0x000a, 0x2d61: 0x000a, 0x2d62: 0x000a, 0x2d63: 0x000a, - 0x2d64: 0x000a, 0x2d65: 0x000a, 0x2d66: 0x000a, 0x2d67: 0x000a, 0x2d68: 0x000a, 0x2d69: 0x000a, - 0x2d6a: 0x000a, 0x2d6b: 0x000a, 0x2d6c: 0x000a, - // Block 0xb6, offset 0x2d80 - 0x2dab: 0x000c, 0x2dad: 0x000c, - 0x2db0: 0x000c, 0x2db1: 0x000c, 0x2db2: 0x000c, 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c, - 0x2db7: 0x000c, - // Block 0xb7, offset 0x2dc0 - 0x2ddd: 0x000c, - 0x2dde: 0x000c, 0x2ddf: 0x000c, 0x2de2: 0x000c, 0x2de3: 0x000c, - 0x2de4: 0x000c, 0x2de5: 0x000c, 0x2de7: 0x000c, 0x2de8: 0x000c, 0x2de9: 0x000c, - 0x2dea: 0x000c, 0x2deb: 0x000c, - // Block 0xb8, offset 0x2e00 - 0x2e30: 0x000c, 0x2e31: 0x000c, 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c, - 0x2e36: 0x000c, 0x2e38: 0x000c, 0x2e39: 0x000c, 0x2e3a: 0x000c, 0x2e3b: 0x000c, - 0x2e3c: 0x000c, 0x2e3d: 0x000c, - // Block 0xb9, offset 0x2e40 - 0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c, 0x2e57: 0x000c, - 0x2e58: 0x000c, 0x2e59: 0x000c, 0x2e5a: 0x000c, 0x2e5b: 0x000c, 0x2e5c: 0x000c, 0x2e5d: 0x000c, - 0x2e5e: 0x000c, 0x2e5f: 0x000c, 0x2e60: 0x000c, 0x2e61: 0x000c, 0x2e62: 0x000c, 0x2e63: 0x000c, - 0x2e64: 0x000c, 0x2e65: 0x000c, 0x2e66: 0x000c, 0x2e67: 0x000c, - 0x2e6a: 0x000c, 0x2e6b: 0x000c, 0x2e6c: 0x000c, 0x2e6d: 0x000c, 0x2e6e: 0x000c, 0x2e6f: 0x000c, - 0x2e70: 0x000c, 0x2e72: 0x000c, 0x2e73: 0x000c, 0x2e75: 0x000c, - 0x2e76: 0x000c, - // Block 0xba, offset 0x2e80 - 0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c, - // Block 0xbb, offset 0x2ec0 - 0x2ef0: 0x000c, 0x2ef1: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef4: 0x000c, 0x2ef5: 0x000c, - 0x2ef6: 0x000c, - // Block 0xbc, offset 0x2f00 - 0x2f0f: 0x000c, 0x2f10: 0x000c, 0x2f11: 0x000c, - 0x2f12: 0x000c, - // Block 0xbd, offset 0x2f40 - 0x2f5d: 0x000c, - 0x2f5e: 0x000c, 0x2f60: 0x000b, 0x2f61: 0x000b, 0x2f62: 0x000b, 0x2f63: 0x000b, - // Block 0xbe, offset 0x2f80 - 0x2fa7: 0x000c, 0x2fa8: 0x000c, 0x2fa9: 0x000c, - 0x2fb3: 0x000b, 0x2fb4: 0x000b, 0x2fb5: 0x000b, - 0x2fb6: 0x000b, 0x2fb7: 0x000b, 0x2fb8: 0x000b, 0x2fb9: 0x000b, 0x2fba: 0x000b, 0x2fbb: 0x000c, - 0x2fbc: 0x000c, 0x2fbd: 0x000c, 0x2fbe: 0x000c, 0x2fbf: 0x000c, - // Block 0xbf, offset 0x2fc0 - 0x2fc0: 0x000c, 0x2fc1: 0x000c, 0x2fc2: 0x000c, 0x2fc5: 0x000c, - 0x2fc6: 0x000c, 0x2fc7: 0x000c, 0x2fc8: 0x000c, 0x2fc9: 0x000c, 0x2fca: 0x000c, 0x2fcb: 0x000c, - 0x2fea: 0x000c, 0x2feb: 0x000c, 0x2fec: 0x000c, 0x2fed: 0x000c, - // Block 0xc0, offset 0x3000 - 0x3000: 0x000a, 0x3001: 0x000a, 0x3002: 0x000c, 0x3003: 0x000c, 0x3004: 0x000c, 0x3005: 0x000a, - // Block 0xc1, offset 0x3040 - 0x3040: 0x000a, 0x3041: 0x000a, 0x3042: 0x000a, 0x3043: 0x000a, 0x3044: 0x000a, 0x3045: 0x000a, - 0x3046: 0x000a, 0x3047: 0x000a, 0x3048: 0x000a, 0x3049: 0x000a, 0x304a: 0x000a, 0x304b: 0x000a, - 0x304c: 0x000a, 0x304d: 0x000a, 0x304e: 0x000a, 0x304f: 0x000a, 0x3050: 0x000a, 0x3051: 0x000a, - 0x3052: 0x000a, 0x3053: 0x000a, 0x3054: 0x000a, 0x3055: 0x000a, 0x3056: 0x000a, - // Block 0xc2, offset 0x3080 - 0x309b: 0x000a, - // Block 0xc3, offset 0x30c0 - 0x30d5: 0x000a, - // Block 0xc4, offset 0x3100 - 0x310f: 0x000a, - // Block 0xc5, offset 0x3140 - 0x3149: 0x000a, - // Block 0xc6, offset 0x3180 - 0x3183: 0x000a, - 0x318e: 0x0002, 0x318f: 0x0002, 0x3190: 0x0002, 0x3191: 0x0002, - 0x3192: 0x0002, 0x3193: 0x0002, 0x3194: 0x0002, 0x3195: 0x0002, 0x3196: 0x0002, 0x3197: 0x0002, - 0x3198: 0x0002, 0x3199: 0x0002, 0x319a: 0x0002, 0x319b: 0x0002, 0x319c: 0x0002, 0x319d: 0x0002, - 0x319e: 0x0002, 0x319f: 0x0002, 0x31a0: 0x0002, 0x31a1: 0x0002, 0x31a2: 0x0002, 0x31a3: 0x0002, - 0x31a4: 0x0002, 0x31a5: 0x0002, 0x31a6: 0x0002, 0x31a7: 0x0002, 0x31a8: 0x0002, 0x31a9: 0x0002, - 0x31aa: 0x0002, 0x31ab: 0x0002, 0x31ac: 0x0002, 0x31ad: 0x0002, 0x31ae: 0x0002, 0x31af: 0x0002, - 0x31b0: 0x0002, 0x31b1: 0x0002, 0x31b2: 0x0002, 0x31b3: 0x0002, 0x31b4: 0x0002, 0x31b5: 0x0002, - 0x31b6: 0x0002, 0x31b7: 0x0002, 0x31b8: 0x0002, 0x31b9: 0x0002, 0x31ba: 0x0002, 0x31bb: 0x0002, - 0x31bc: 0x0002, 0x31bd: 0x0002, 0x31be: 0x0002, 0x31bf: 0x0002, - // Block 0xc7, offset 0x31c0 - 0x31c0: 0x000c, 0x31c1: 0x000c, 0x31c2: 0x000c, 0x31c3: 0x000c, 0x31c4: 0x000c, 0x31c5: 0x000c, - 0x31c6: 0x000c, 0x31c7: 0x000c, 0x31c8: 0x000c, 0x31c9: 0x000c, 0x31ca: 0x000c, 0x31cb: 0x000c, - 0x31cc: 0x000c, 0x31cd: 0x000c, 0x31ce: 0x000c, 0x31cf: 0x000c, 0x31d0: 0x000c, 0x31d1: 0x000c, - 0x31d2: 0x000c, 0x31d3: 0x000c, 0x31d4: 0x000c, 0x31d5: 0x000c, 0x31d6: 0x000c, 0x31d7: 0x000c, - 0x31d8: 0x000c, 0x31d9: 0x000c, 0x31da: 0x000c, 0x31db: 0x000c, 0x31dc: 0x000c, 0x31dd: 0x000c, - 0x31de: 0x000c, 0x31df: 0x000c, 0x31e0: 0x000c, 0x31e1: 0x000c, 0x31e2: 0x000c, 0x31e3: 0x000c, - 0x31e4: 0x000c, 0x31e5: 0x000c, 0x31e6: 0x000c, 0x31e7: 0x000c, 0x31e8: 0x000c, 0x31e9: 0x000c, - 0x31ea: 0x000c, 0x31eb: 0x000c, 0x31ec: 0x000c, 0x31ed: 0x000c, 0x31ee: 0x000c, 0x31ef: 0x000c, - 0x31f0: 0x000c, 0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c, - 0x31f6: 0x000c, 0x31fb: 0x000c, - 0x31fc: 0x000c, 0x31fd: 0x000c, 0x31fe: 0x000c, 0x31ff: 0x000c, - // Block 0xc8, offset 0x3200 - 0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c, - 0x3206: 0x000c, 0x3207: 0x000c, 0x3208: 0x000c, 0x3209: 0x000c, 0x320a: 0x000c, 0x320b: 0x000c, - 0x320c: 0x000c, 0x320d: 0x000c, 0x320e: 0x000c, 0x320f: 0x000c, 0x3210: 0x000c, 0x3211: 0x000c, - 0x3212: 0x000c, 0x3213: 0x000c, 0x3214: 0x000c, 0x3215: 0x000c, 0x3216: 0x000c, 0x3217: 0x000c, - 0x3218: 0x000c, 0x3219: 0x000c, 0x321a: 0x000c, 0x321b: 0x000c, 0x321c: 0x000c, 0x321d: 0x000c, - 0x321e: 0x000c, 0x321f: 0x000c, 0x3220: 0x000c, 0x3221: 0x000c, 0x3222: 0x000c, 0x3223: 0x000c, - 0x3224: 0x000c, 0x3225: 0x000c, 0x3226: 0x000c, 0x3227: 0x000c, 0x3228: 0x000c, 0x3229: 0x000c, - 0x322a: 0x000c, 0x322b: 0x000c, 0x322c: 0x000c, - 0x3235: 0x000c, - // Block 0xc9, offset 0x3240 - 0x3244: 0x000c, - 0x325b: 0x000c, 0x325c: 0x000c, 0x325d: 0x000c, - 0x325e: 0x000c, 0x325f: 0x000c, 0x3261: 0x000c, 0x3262: 0x000c, 0x3263: 0x000c, - 0x3264: 0x000c, 0x3265: 0x000c, 0x3266: 0x000c, 0x3267: 0x000c, 0x3268: 0x000c, 0x3269: 0x000c, - 0x326a: 0x000c, 0x326b: 0x000c, 0x326c: 0x000c, 0x326d: 0x000c, 0x326e: 0x000c, 0x326f: 0x000c, - // Block 0xca, offset 0x3280 - 0x3280: 0x000c, 0x3281: 0x000c, 0x3282: 0x000c, 0x3283: 0x000c, 0x3284: 0x000c, 0x3285: 0x000c, - 0x3286: 0x000c, 0x3288: 0x000c, 0x3289: 0x000c, 0x328a: 0x000c, 0x328b: 0x000c, - 0x328c: 0x000c, 0x328d: 0x000c, 0x328e: 0x000c, 0x328f: 0x000c, 0x3290: 0x000c, 0x3291: 0x000c, - 0x3292: 0x000c, 0x3293: 0x000c, 0x3294: 0x000c, 0x3295: 0x000c, 0x3296: 0x000c, 0x3297: 0x000c, - 0x3298: 0x000c, 0x329b: 0x000c, 0x329c: 0x000c, 0x329d: 0x000c, - 0x329e: 0x000c, 0x329f: 0x000c, 0x32a0: 0x000c, 0x32a1: 0x000c, 0x32a3: 0x000c, - 0x32a4: 0x000c, 0x32a6: 0x000c, 0x32a7: 0x000c, 0x32a8: 0x000c, 0x32a9: 0x000c, - 0x32aa: 0x000c, - // Block 0xcb, offset 0x32c0 - 0x32c0: 0x0001, 0x32c1: 0x0001, 0x32c2: 0x0001, 0x32c3: 0x0001, 0x32c4: 0x0001, 0x32c5: 0x0001, - 0x32c6: 0x0001, 0x32c7: 0x0001, 0x32c8: 0x0001, 0x32c9: 0x0001, 0x32ca: 0x0001, 0x32cb: 0x0001, - 0x32cc: 0x0001, 0x32cd: 0x0001, 0x32ce: 0x0001, 0x32cf: 0x0001, 0x32d0: 0x000c, 0x32d1: 0x000c, - 0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x0001, - 0x32d8: 0x0001, 0x32d9: 0x0001, 0x32da: 0x0001, 0x32db: 0x0001, 0x32dc: 0x0001, 0x32dd: 0x0001, - 0x32de: 0x0001, 0x32df: 0x0001, 0x32e0: 0x0001, 0x32e1: 0x0001, 0x32e2: 0x0001, 0x32e3: 0x0001, - 0x32e4: 0x0001, 0x32e5: 0x0001, 0x32e6: 0x0001, 0x32e7: 0x0001, 0x32e8: 0x0001, 0x32e9: 0x0001, - 0x32ea: 0x0001, 0x32eb: 0x0001, 0x32ec: 0x0001, 0x32ed: 0x0001, 0x32ee: 0x0001, 0x32ef: 0x0001, - 0x32f0: 0x0001, 0x32f1: 0x0001, 0x32f2: 0x0001, 0x32f3: 0x0001, 0x32f4: 0x0001, 0x32f5: 0x0001, - 0x32f6: 0x0001, 0x32f7: 0x0001, 0x32f8: 0x0001, 0x32f9: 0x0001, 0x32fa: 0x0001, 0x32fb: 0x0001, - 0x32fc: 0x0001, 0x32fd: 0x0001, 0x32fe: 0x0001, 0x32ff: 0x0001, - // Block 0xcc, offset 0x3300 - 0x3300: 0x0001, 0x3301: 0x0001, 0x3302: 0x0001, 0x3303: 0x0001, 0x3304: 0x000c, 0x3305: 0x000c, - 0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x0001, - 0x330c: 0x0001, 0x330d: 0x0001, 0x330e: 0x0001, 0x330f: 0x0001, 0x3310: 0x0001, 0x3311: 0x0001, - 0x3312: 0x0001, 0x3313: 0x0001, 0x3314: 0x0001, 0x3315: 0x0001, 0x3316: 0x0001, 0x3317: 0x0001, - 0x3318: 0x0001, 0x3319: 0x0001, 0x331a: 0x0001, 0x331b: 0x0001, 0x331c: 0x0001, 0x331d: 0x0001, - 0x331e: 0x0001, 0x331f: 0x0001, 0x3320: 0x0001, 0x3321: 0x0001, 0x3322: 0x0001, 0x3323: 0x0001, - 0x3324: 0x0001, 0x3325: 0x0001, 0x3326: 0x0001, 0x3327: 0x0001, 0x3328: 0x0001, 0x3329: 0x0001, - 0x332a: 0x0001, 0x332b: 0x0001, 0x332c: 0x0001, 0x332d: 0x0001, 0x332e: 0x0001, 0x332f: 0x0001, - 0x3330: 0x0001, 0x3331: 0x0001, 0x3332: 0x0001, 0x3333: 0x0001, 0x3334: 0x0001, 0x3335: 0x0001, - 0x3336: 0x0001, 0x3337: 0x0001, 0x3338: 0x0001, 0x3339: 0x0001, 0x333a: 0x0001, 0x333b: 0x0001, - 0x333c: 0x0001, 0x333d: 0x0001, 0x333e: 0x0001, 0x333f: 0x0001, - // Block 0xcd, offset 0x3340 - 0x3340: 0x000d, 0x3341: 0x000d, 0x3342: 0x000d, 0x3343: 0x000d, 0x3344: 0x000d, 0x3345: 0x000d, - 0x3346: 0x000d, 0x3347: 0x000d, 0x3348: 0x000d, 0x3349: 0x000d, 0x334a: 0x000d, 0x334b: 0x000d, - 0x334c: 0x000d, 0x334d: 0x000d, 0x334e: 0x000d, 0x334f: 0x000d, 0x3350: 0x000d, 0x3351: 0x000d, - 0x3352: 0x000d, 0x3353: 0x000d, 0x3354: 0x000d, 0x3355: 0x000d, 0x3356: 0x000d, 0x3357: 0x000d, - 0x3358: 0x000d, 0x3359: 0x000d, 0x335a: 0x000d, 0x335b: 0x000d, 0x335c: 0x000d, 0x335d: 0x000d, - 0x335e: 0x000d, 0x335f: 0x000d, 0x3360: 0x000d, 0x3361: 0x000d, 0x3362: 0x000d, 0x3363: 0x000d, - 0x3364: 0x000d, 0x3365: 0x000d, 0x3366: 0x000d, 0x3367: 0x000d, 0x3368: 0x000d, 0x3369: 0x000d, - 0x336a: 0x000d, 0x336b: 0x000d, 0x336c: 0x000d, 0x336d: 0x000d, 0x336e: 0x000d, 0x336f: 0x000d, - 0x3370: 0x000a, 0x3371: 0x000a, 0x3372: 0x000d, 0x3373: 0x000d, 0x3374: 0x000d, 0x3375: 0x000d, - 0x3376: 0x000d, 0x3377: 0x000d, 0x3378: 0x000d, 0x3379: 0x000d, 0x337a: 0x000d, 0x337b: 0x000d, - 0x337c: 0x000d, 0x337d: 0x000d, 0x337e: 0x000d, 0x337f: 0x000d, - // Block 0xce, offset 0x3380 - 0x3380: 0x000a, 0x3381: 0x000a, 0x3382: 0x000a, 0x3383: 0x000a, 0x3384: 0x000a, 0x3385: 0x000a, - 0x3386: 0x000a, 0x3387: 0x000a, 0x3388: 0x000a, 0x3389: 0x000a, 0x338a: 0x000a, 0x338b: 0x000a, - 0x338c: 0x000a, 0x338d: 0x000a, 0x338e: 0x000a, 0x338f: 0x000a, 0x3390: 0x000a, 0x3391: 0x000a, - 0x3392: 0x000a, 0x3393: 0x000a, 0x3394: 0x000a, 0x3395: 0x000a, 0x3396: 0x000a, 0x3397: 0x000a, - 0x3398: 0x000a, 0x3399: 0x000a, 0x339a: 0x000a, 0x339b: 0x000a, 0x339c: 0x000a, 0x339d: 0x000a, - 0x339e: 0x000a, 0x339f: 0x000a, 0x33a0: 0x000a, 0x33a1: 0x000a, 0x33a2: 0x000a, 0x33a3: 0x000a, - 0x33a4: 0x000a, 0x33a5: 0x000a, 0x33a6: 0x000a, 0x33a7: 0x000a, 0x33a8: 0x000a, 0x33a9: 0x000a, - 0x33aa: 0x000a, 0x33ab: 0x000a, - 0x33b0: 0x000a, 0x33b1: 0x000a, 0x33b2: 0x000a, 0x33b3: 0x000a, 0x33b4: 0x000a, 0x33b5: 0x000a, - 0x33b6: 0x000a, 0x33b7: 0x000a, 0x33b8: 0x000a, 0x33b9: 0x000a, 0x33ba: 0x000a, 0x33bb: 0x000a, - 0x33bc: 0x000a, 0x33bd: 0x000a, 0x33be: 0x000a, 0x33bf: 0x000a, - // Block 0xcf, offset 0x33c0 - 0x33c0: 0x000a, 0x33c1: 0x000a, 0x33c2: 0x000a, 0x33c3: 0x000a, 0x33c4: 0x000a, 0x33c5: 0x000a, - 0x33c6: 0x000a, 0x33c7: 0x000a, 0x33c8: 0x000a, 0x33c9: 0x000a, 0x33ca: 0x000a, 0x33cb: 0x000a, - 0x33cc: 0x000a, 0x33cd: 0x000a, 0x33ce: 0x000a, 0x33cf: 0x000a, 0x33d0: 0x000a, 0x33d1: 0x000a, - 0x33d2: 0x000a, 0x33d3: 0x000a, - 0x33e0: 0x000a, 0x33e1: 0x000a, 0x33e2: 0x000a, 0x33e3: 0x000a, - 0x33e4: 0x000a, 0x33e5: 0x000a, 0x33e6: 0x000a, 0x33e7: 0x000a, 0x33e8: 0x000a, 0x33e9: 0x000a, - 0x33ea: 0x000a, 0x33eb: 0x000a, 0x33ec: 0x000a, 0x33ed: 0x000a, 0x33ee: 0x000a, - 0x33f1: 0x000a, 0x33f2: 0x000a, 0x33f3: 0x000a, 0x33f4: 0x000a, 0x33f5: 0x000a, - 0x33f6: 0x000a, 0x33f7: 0x000a, 0x33f8: 0x000a, 0x33f9: 0x000a, 0x33fa: 0x000a, 0x33fb: 0x000a, - 0x33fc: 0x000a, 0x33fd: 0x000a, 0x33fe: 0x000a, 0x33ff: 0x000a, - // Block 0xd0, offset 0x3400 - 0x3401: 0x000a, 0x3402: 0x000a, 0x3403: 0x000a, 0x3404: 0x000a, 0x3405: 0x000a, - 0x3406: 0x000a, 0x3407: 0x000a, 0x3408: 0x000a, 0x3409: 0x000a, 0x340a: 0x000a, 0x340b: 0x000a, - 0x340c: 0x000a, 0x340d: 0x000a, 0x340e: 0x000a, 0x340f: 0x000a, 0x3411: 0x000a, - 0x3412: 0x000a, 0x3413: 0x000a, 0x3414: 0x000a, 0x3415: 0x000a, 0x3416: 0x000a, 0x3417: 0x000a, - 0x3418: 0x000a, 0x3419: 0x000a, 0x341a: 0x000a, 0x341b: 0x000a, 0x341c: 0x000a, 0x341d: 0x000a, - 0x341e: 0x000a, 0x341f: 0x000a, 0x3420: 0x000a, 0x3421: 0x000a, 0x3422: 0x000a, 0x3423: 0x000a, - 0x3424: 0x000a, 0x3425: 0x000a, 0x3426: 0x000a, 0x3427: 0x000a, 0x3428: 0x000a, 0x3429: 0x000a, - 0x342a: 0x000a, 0x342b: 0x000a, 0x342c: 0x000a, 0x342d: 0x000a, 0x342e: 0x000a, 0x342f: 0x000a, - 0x3430: 0x000a, 0x3431: 0x000a, 0x3432: 0x000a, 0x3433: 0x000a, 0x3434: 0x000a, 0x3435: 0x000a, - // Block 0xd1, offset 0x3440 - 0x3440: 0x0002, 0x3441: 0x0002, 0x3442: 0x0002, 0x3443: 0x0002, 0x3444: 0x0002, 0x3445: 0x0002, - 0x3446: 0x0002, 0x3447: 0x0002, 0x3448: 0x0002, 0x3449: 0x0002, 0x344a: 0x0002, 0x344b: 0x000a, - 0x344c: 0x000a, - // Block 0xd2, offset 0x3480 - 0x34aa: 0x000a, 0x34ab: 0x000a, - // Block 0xd3, offset 0x34c0 - 0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a, - 0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a, - 0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a, - 0x34d2: 0x000a, - 0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a, - 0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a, - 0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a, - 0x34f0: 0x000a, 0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a, - 0x34f6: 0x000a, - // Block 0xd4, offset 0x3500 - 0x3500: 0x000a, 0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a, - 0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a, - 0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3510: 0x000a, 0x3511: 0x000a, - 0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a, - // Block 0xd5, offset 0x3540 - 0x3540: 0x000a, 0x3541: 0x000a, 0x3542: 0x000a, 0x3543: 0x000a, 0x3544: 0x000a, 0x3545: 0x000a, - 0x3546: 0x000a, 0x3547: 0x000a, 0x3548: 0x000a, 0x3549: 0x000a, 0x354a: 0x000a, 0x354b: 0x000a, - 0x3550: 0x000a, 0x3551: 0x000a, - 0x3552: 0x000a, 0x3553: 0x000a, 0x3554: 0x000a, 0x3555: 0x000a, 0x3556: 0x000a, 0x3557: 0x000a, - 0x3558: 0x000a, 0x3559: 0x000a, 0x355a: 0x000a, 0x355b: 0x000a, 0x355c: 0x000a, 0x355d: 0x000a, - 0x355e: 0x000a, 0x355f: 0x000a, 0x3560: 0x000a, 0x3561: 0x000a, 0x3562: 0x000a, 0x3563: 0x000a, - 0x3564: 0x000a, 0x3565: 0x000a, 0x3566: 0x000a, 0x3567: 0x000a, 0x3568: 0x000a, 0x3569: 0x000a, - 0x356a: 0x000a, 0x356b: 0x000a, 0x356c: 0x000a, 0x356d: 0x000a, 0x356e: 0x000a, 0x356f: 0x000a, - 0x3570: 0x000a, 0x3571: 0x000a, 0x3572: 0x000a, 0x3573: 0x000a, 0x3574: 0x000a, 0x3575: 0x000a, - 0x3576: 0x000a, 0x3577: 0x000a, 0x3578: 0x000a, 0x3579: 0x000a, 0x357a: 0x000a, 0x357b: 0x000a, - 0x357c: 0x000a, 0x357d: 0x000a, 0x357e: 0x000a, 0x357f: 0x000a, - // Block 0xd6, offset 0x3580 - 0x3580: 0x000a, 0x3581: 0x000a, 0x3582: 0x000a, 0x3583: 0x000a, 0x3584: 0x000a, 0x3585: 0x000a, - 0x3586: 0x000a, 0x3587: 0x000a, - 0x3590: 0x000a, 0x3591: 0x000a, - 0x3592: 0x000a, 0x3593: 0x000a, 0x3594: 0x000a, 0x3595: 0x000a, 0x3596: 0x000a, 0x3597: 0x000a, - 0x3598: 0x000a, 0x3599: 0x000a, - 0x35a0: 0x000a, 0x35a1: 0x000a, 0x35a2: 0x000a, 0x35a3: 0x000a, - 0x35a4: 0x000a, 0x35a5: 0x000a, 0x35a6: 0x000a, 0x35a7: 0x000a, 0x35a8: 0x000a, 0x35a9: 0x000a, - 0x35aa: 0x000a, 0x35ab: 0x000a, 0x35ac: 0x000a, 0x35ad: 0x000a, 0x35ae: 0x000a, 0x35af: 0x000a, - 0x35b0: 0x000a, 0x35b1: 0x000a, 0x35b2: 0x000a, 0x35b3: 0x000a, 0x35b4: 0x000a, 0x35b5: 0x000a, - 0x35b6: 0x000a, 0x35b7: 0x000a, 0x35b8: 0x000a, 0x35b9: 0x000a, 0x35ba: 0x000a, 0x35bb: 0x000a, - 0x35bc: 0x000a, 0x35bd: 0x000a, 0x35be: 0x000a, 0x35bf: 0x000a, - // Block 0xd7, offset 0x35c0 - 0x35c0: 0x000a, 0x35c1: 0x000a, 0x35c2: 0x000a, 0x35c3: 0x000a, 0x35c4: 0x000a, 0x35c5: 0x000a, - 0x35c6: 0x000a, 0x35c7: 0x000a, - 0x35d0: 0x000a, 0x35d1: 0x000a, - 0x35d2: 0x000a, 0x35d3: 0x000a, 0x35d4: 0x000a, 0x35d5: 0x000a, 0x35d6: 0x000a, 0x35d7: 0x000a, - 0x35d8: 0x000a, 0x35d9: 0x000a, 0x35da: 0x000a, 0x35db: 0x000a, 0x35dc: 0x000a, 0x35dd: 0x000a, - 0x35de: 0x000a, 0x35df: 0x000a, 0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a, - 0x35e4: 0x000a, 0x35e5: 0x000a, 0x35e6: 0x000a, 0x35e7: 0x000a, 0x35e8: 0x000a, 0x35e9: 0x000a, - 0x35ea: 0x000a, 0x35eb: 0x000a, 0x35ec: 0x000a, 0x35ed: 0x000a, - // Block 0xd8, offset 0x3600 - 0x3610: 0x000a, 0x3611: 0x000a, - 0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a, 0x3615: 0x000a, 0x3616: 0x000a, 0x3617: 0x000a, - 0x3618: 0x000a, 0x3619: 0x000a, 0x361a: 0x000a, 0x361b: 0x000a, 0x361c: 0x000a, 0x361d: 0x000a, - 0x361e: 0x000a, 0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a, - 0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a, - 0x3630: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a, - 0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a, 0x3639: 0x000a, 0x363a: 0x000a, 0x363b: 0x000a, - 0x363c: 0x000a, 0x363d: 0x000a, 0x363e: 0x000a, - // Block 0xd9, offset 0x3640 - 0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a, - 0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a, - 0x3650: 0x000a, 0x3651: 0x000a, - 0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a, 0x3655: 0x000a, 0x3656: 0x000a, 0x3657: 0x000a, - 0x3658: 0x000a, 0x3659: 0x000a, 0x365a: 0x000a, 0x365b: 0x000a, 0x365c: 0x000a, 0x365d: 0x000a, - 0x365e: 0x000a, - // Block 0xda, offset 0x3680 - 0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a, - 0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a, - 0x368c: 0x000a, 0x368d: 0x000a, 0x368e: 0x000a, 0x368f: 0x000a, 0x3690: 0x000a, 0x3691: 0x000a, - // Block 0xdb, offset 0x36c0 - 0x36fe: 0x000b, 0x36ff: 0x000b, - // Block 0xdc, offset 0x3700 - 0x3700: 0x000b, 0x3701: 0x000b, 0x3702: 0x000b, 0x3703: 0x000b, 0x3704: 0x000b, 0x3705: 0x000b, - 0x3706: 0x000b, 0x3707: 0x000b, 0x3708: 0x000b, 0x3709: 0x000b, 0x370a: 0x000b, 0x370b: 0x000b, - 0x370c: 0x000b, 0x370d: 0x000b, 0x370e: 0x000b, 0x370f: 0x000b, 0x3710: 0x000b, 0x3711: 0x000b, - 0x3712: 0x000b, 0x3713: 0x000b, 0x3714: 0x000b, 0x3715: 0x000b, 0x3716: 0x000b, 0x3717: 0x000b, - 0x3718: 0x000b, 0x3719: 0x000b, 0x371a: 0x000b, 0x371b: 0x000b, 0x371c: 0x000b, 0x371d: 0x000b, - 0x371e: 0x000b, 0x371f: 0x000b, 0x3720: 0x000b, 0x3721: 0x000b, 0x3722: 0x000b, 0x3723: 0x000b, - 0x3724: 0x000b, 0x3725: 0x000b, 0x3726: 0x000b, 0x3727: 0x000b, 0x3728: 0x000b, 0x3729: 0x000b, - 0x372a: 0x000b, 0x372b: 0x000b, 0x372c: 0x000b, 0x372d: 0x000b, 0x372e: 0x000b, 0x372f: 0x000b, - 0x3730: 0x000b, 0x3731: 0x000b, 0x3732: 0x000b, 0x3733: 0x000b, 0x3734: 0x000b, 0x3735: 0x000b, - 0x3736: 0x000b, 0x3737: 0x000b, 0x3738: 0x000b, 0x3739: 0x000b, 0x373a: 0x000b, 0x373b: 0x000b, - 0x373c: 0x000b, 0x373d: 0x000b, 0x373e: 0x000b, 0x373f: 0x000b, - // Block 0xdd, offset 0x3740 - 0x3740: 0x000c, 0x3741: 0x000c, 0x3742: 0x000c, 0x3743: 0x000c, 0x3744: 0x000c, 0x3745: 0x000c, - 0x3746: 0x000c, 0x3747: 0x000c, 0x3748: 0x000c, 0x3749: 0x000c, 0x374a: 0x000c, 0x374b: 0x000c, - 0x374c: 0x000c, 0x374d: 0x000c, 0x374e: 0x000c, 0x374f: 0x000c, 0x3750: 0x000c, 0x3751: 0x000c, - 0x3752: 0x000c, 0x3753: 0x000c, 0x3754: 0x000c, 0x3755: 0x000c, 0x3756: 0x000c, 0x3757: 0x000c, - 0x3758: 0x000c, 0x3759: 0x000c, 0x375a: 0x000c, 0x375b: 0x000c, 0x375c: 0x000c, 0x375d: 0x000c, - 0x375e: 0x000c, 0x375f: 0x000c, 0x3760: 0x000c, 0x3761: 0x000c, 0x3762: 0x000c, 0x3763: 0x000c, - 0x3764: 0x000c, 0x3765: 0x000c, 0x3766: 0x000c, 0x3767: 0x000c, 0x3768: 0x000c, 0x3769: 0x000c, - 0x376a: 0x000c, 0x376b: 0x000c, 0x376c: 0x000c, 0x376d: 0x000c, 0x376e: 0x000c, 0x376f: 0x000c, - 0x3770: 0x000b, 0x3771: 0x000b, 0x3772: 0x000b, 0x3773: 0x000b, 0x3774: 0x000b, 0x3775: 0x000b, - 0x3776: 0x000b, 0x3777: 0x000b, 0x3778: 0x000b, 0x3779: 0x000b, 0x377a: 0x000b, 0x377b: 0x000b, - 0x377c: 0x000b, 0x377d: 0x000b, 0x377e: 0x000b, 0x377f: 0x000b, -} - -// bidiIndex: 24 blocks, 1536 entries, 1536 bytes -// Block 0 is the zero block. -var bidiIndex = [1536]uint8{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc2: 0x01, 0xc3: 0x02, - 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, - 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, - 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, - 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, - 0xea: 0x07, 0xef: 0x08, - 0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15, - // Block 0x4, offset 0x100 - 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, - 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, - 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28, - 0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30, - // Block 0x5, offset 0x140 - 0x140: 0x31, 0x141: 0x32, 0x142: 0x33, - 0x14d: 0x34, 0x14e: 0x35, - 0x150: 0x36, - 0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b, - 0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40, - 0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47, - 0x170: 0x48, 0x173: 0x49, 0x177: 0x4a, - 0x17e: 0x4b, 0x17f: 0x4c, - // Block 0x6, offset 0x180 - 0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54, - 0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x59, - 0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54, - 0x198: 0x54, 0x199: 0x54, 0x19a: 0x5e, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5f, 0x19e: 0x54, 0x19f: 0x60, - 0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x61, 0x1a7: 0x62, - 0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x65, - 0x1b3: 0x66, 0x1b5: 0x67, 0x1b7: 0x68, - 0x1b8: 0x69, 0x1b9: 0x6a, 0x1ba: 0x6b, 0x1bb: 0x6c, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6d, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x6e, 0x1c2: 0x6f, 0x1c3: 0x70, 0x1c7: 0x71, - 0x1c8: 0x72, 0x1c9: 0x73, 0x1ca: 0x74, 0x1cb: 0x75, 0x1cd: 0x76, 0x1cf: 0x77, - // Block 0x8, offset 0x200 - 0x237: 0x54, - // Block 0x9, offset 0x240 - 0x252: 0x78, 0x253: 0x79, - 0x258: 0x7a, 0x259: 0x7b, 0x25a: 0x7c, 0x25b: 0x7d, 0x25c: 0x7e, 0x25e: 0x7f, - 0x260: 0x80, 0x261: 0x81, 0x263: 0x82, 0x264: 0x83, 0x265: 0x84, 0x266: 0x85, 0x267: 0x86, - 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26f: 0x8b, - // Block 0xa, offset 0x280 - 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e, - 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8f, - 0x2b8: 0x90, 0x2b9: 0x91, 0x2ba: 0x0e, 0x2bb: 0x92, 0x2bc: 0x93, 0x2bd: 0x94, 0x2bf: 0x95, - // Block 0xb, offset 0x2c0 - 0x2c4: 0x96, 0x2c5: 0x54, 0x2c6: 0x97, 0x2c7: 0x98, - 0x2cb: 0x99, 0x2cd: 0x9a, - 0x2e0: 0x9b, 0x2e1: 0x9b, 0x2e2: 0x9b, 0x2e3: 0x9b, 0x2e4: 0x9c, 0x2e5: 0x9b, 0x2e6: 0x9b, 0x2e7: 0x9b, - 0x2e8: 0x9d, 0x2e9: 0x9b, 0x2ea: 0x9b, 0x2eb: 0x9e, 0x2ec: 0x9f, 0x2ed: 0x9b, 0x2ee: 0x9b, 0x2ef: 0x9b, - 0x2f0: 0x9b, 0x2f1: 0x9b, 0x2f2: 0x9b, 0x2f3: 0x9b, 0x2f4: 0x9b, 0x2f5: 0x9b, 0x2f6: 0x9b, 0x2f7: 0x9b, - 0x2f8: 0x9b, 0x2f9: 0xa0, 0x2fa: 0x9b, 0x2fb: 0x9b, 0x2fc: 0x9b, 0x2fd: 0x9b, 0x2fe: 0x9b, 0x2ff: 0x9b, - // Block 0xc, offset 0x300 - 0x300: 0xa1, 0x301: 0xa2, 0x302: 0xa3, 0x304: 0xa4, 0x305: 0xa5, 0x306: 0xa6, 0x307: 0xa7, - 0x308: 0xa8, 0x30b: 0xa9, 0x30c: 0xaa, 0x30d: 0xab, - 0x310: 0xac, 0x311: 0xad, 0x312: 0xae, 0x313: 0xaf, 0x316: 0xb0, 0x317: 0xb1, - 0x318: 0xb2, 0x319: 0xb3, 0x31a: 0xb4, 0x31c: 0xb5, - 0x330: 0xb6, 0x332: 0xb7, - // Block 0xd, offset 0x340 - 0x36b: 0xb8, 0x36c: 0xb9, - 0x37e: 0xba, - // Block 0xe, offset 0x380 - 0x3b2: 0xbb, - // Block 0xf, offset 0x3c0 - 0x3c5: 0xbc, 0x3c6: 0xbd, - 0x3c8: 0x54, 0x3c9: 0xbe, 0x3cc: 0x54, 0x3cd: 0xbf, - 0x3db: 0xc0, 0x3dc: 0xc1, 0x3dd: 0xc2, 0x3de: 0xc3, 0x3df: 0xc4, - 0x3e8: 0xc5, 0x3e9: 0xc6, 0x3ea: 0xc7, - // Block 0x10, offset 0x400 - 0x400: 0xc8, - 0x420: 0x9b, 0x421: 0x9b, 0x422: 0x9b, 0x423: 0xc9, 0x424: 0x9b, 0x425: 0xca, 0x426: 0x9b, 0x427: 0x9b, - 0x428: 0x9b, 0x429: 0x9b, 0x42a: 0x9b, 0x42b: 0x9b, 0x42c: 0x9b, 0x42d: 0x9b, 0x42e: 0x9b, 0x42f: 0x9b, - 0x430: 0x9b, 0x431: 0x9b, 0x432: 0x9b, 0x433: 0x9b, 0x434: 0x9b, 0x435: 0x9b, 0x436: 0x9b, 0x437: 0x9b, - 0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcb, 0x43c: 0x9b, 0x43d: 0x9b, 0x43e: 0x9b, 0x43f: 0x9b, - // Block 0x11, offset 0x440 - 0x440: 0xcc, 0x441: 0x54, 0x442: 0xcd, 0x443: 0xce, 0x444: 0xcf, 0x445: 0xd0, - 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54, - 0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54, - 0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd1, 0x45c: 0x54, 0x45d: 0x6c, 0x45e: 0x54, 0x45f: 0xd2, - 0x460: 0xd3, 0x461: 0xd4, 0x462: 0xd5, 0x464: 0xd6, 0x465: 0xd7, 0x466: 0xd8, 0x467: 0x36, - 0x47f: 0xd9, - // Block 0x12, offset 0x480 - 0x4bf: 0xd9, - // Block 0x13, offset 0x4c0 - 0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b, - 0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f, - 0x4ef: 0x10, - 0x4ff: 0x10, - // Block 0x14, offset 0x500 - 0x50f: 0x10, - 0x51f: 0x10, - 0x52f: 0x10, - 0x53f: 0x10, - // Block 0x15, offset 0x540 - 0x540: 0xda, 0x541: 0xda, 0x542: 0xda, 0x543: 0xda, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xdb, - 0x548: 0xda, 0x549: 0xda, 0x54a: 0xda, 0x54b: 0xda, 0x54c: 0xda, 0x54d: 0xda, 0x54e: 0xda, 0x54f: 0xda, - 0x550: 0xda, 0x551: 0xda, 0x552: 0xda, 0x553: 0xda, 0x554: 0xda, 0x555: 0xda, 0x556: 0xda, 0x557: 0xda, - 0x558: 0xda, 0x559: 0xda, 0x55a: 0xda, 0x55b: 0xda, 0x55c: 0xda, 0x55d: 0xda, 0x55e: 0xda, 0x55f: 0xda, - 0x560: 0xda, 0x561: 0xda, 0x562: 0xda, 0x563: 0xda, 0x564: 0xda, 0x565: 0xda, 0x566: 0xda, 0x567: 0xda, - 0x568: 0xda, 0x569: 0xda, 0x56a: 0xda, 0x56b: 0xda, 0x56c: 0xda, 0x56d: 0xda, 0x56e: 0xda, 0x56f: 0xda, - 0x570: 0xda, 0x571: 0xda, 0x572: 0xda, 0x573: 0xda, 0x574: 0xda, 0x575: 0xda, 0x576: 0xda, 0x577: 0xda, - 0x578: 0xda, 0x579: 0xda, 0x57a: 0xda, 0x57b: 0xda, 0x57c: 0xda, 0x57d: 0xda, 0x57e: 0xda, 0x57f: 0xda, - // Block 0x16, offset 0x580 - 0x58f: 0x10, - 0x59f: 0x10, - 0x5a0: 0x13, - 0x5af: 0x10, - 0x5bf: 0x10, - // Block 0x17, offset 0x5c0 - 0x5cf: 0x10, -} - -// Total table size 15800 bytes (15KiB); checksum: F50EF68C diff --git a/vendor/golang.org/x/text/unicode/bidi/tables_test.go b/vendor/golang.org/x/text/unicode/bidi/tables_test.go deleted file mode 100644 index 356a4a58d..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/tables_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bidi - -import ( - "testing" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/testtext" - "golang.org/x/text/internal/ucd" -) - -var labels = []string{ - AL: "AL", - AN: "AN", - B: "B", - BN: "BN", - CS: "CS", - EN: "EN", - ES: "ES", - ET: "ET", - L: "L", - NSM: "NSM", - ON: "ON", - R: "R", - S: "S", - WS: "WS", - - LRO: "LRO", - RLO: "RLO", - LRE: "LRE", - RLE: "RLE", - PDF: "PDF", - LRI: "LRI", - RLI: "RLI", - FSI: "FSI", - PDI: "PDI", -} - -func TestTables(t *testing.T) { - testtext.SkipIfNotLong(t) - - ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) { - r1 := p.Rune(0) - want := p.Rune(1) - - e, _ := LookupRune(r1) - if got := e.reverseBracket(r1); got != want { - t.Errorf("Reverse(%U) = %U; want %U", r1, got, want) - } - }) - - done := map[rune]bool{} - test := func(name string, r rune, want string) { - str := string(r) - e, _ := LookupString(str) - if got := labels[e.Class()]; got != want { - t.Errorf("%s:%U: got %s; want %s", name, r, got, want) - } - if e2, sz := LookupRune(r); e != e2 || sz != len(str) { - t.Errorf("LookupRune(%U) = %v, %d; want %v, %d", r, e2, e, sz, len(str)) - } - if e2, sz := Lookup([]byte(str)); e != e2 || sz != len(str) { - t.Errorf("Lookup(%U) = %v, %d; want %v, %d", r, e2, e, sz, len(str)) - } - done[r] = true - } - - // Insert the derived BiDi properties. - ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - test("derived", r, p.String(1)) - }) - visitDefaults(func(r rune, c Class) { - if !done[r] { - test("default", r, labels[c]) - } - }) - -} diff --git a/vendor/golang.org/x/text/unicode/bidi/trieval.go b/vendor/golang.org/x/text/unicode/bidi/trieval.go deleted file mode 100644 index 4c459c4b7..000000000 --- a/vendor/golang.org/x/text/unicode/bidi/trieval.go +++ /dev/null @@ -1,60 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package bidi - -// Class is the Unicode BiDi class. Each rune has a single class. -type Class uint - -const ( - L Class = iota // LeftToRight - R // RightToLeft - EN // EuropeanNumber - ES // EuropeanSeparator - ET // EuropeanTerminator - AN // ArabicNumber - CS // CommonSeparator - B // ParagraphSeparator - S // SegmentSeparator - WS // WhiteSpace - ON // OtherNeutral - BN // BoundaryNeutral - NSM // NonspacingMark - AL // ArabicLetter - Control // Control LRO - PDI - - numClass - - LRO // LeftToRightOverride - RLO // RightToLeftOverride - LRE // LeftToRightEmbedding - RLE // RightToLeftEmbedding - PDF // PopDirectionalFormat - LRI // LeftToRightIsolate - RLI // RightToLeftIsolate - FSI // FirstStrongIsolate - PDI // PopDirectionalIsolate - - unknownClass = ^Class(0) -) - -var controlToClass = map[rune]Class{ - 0x202D: LRO, // LeftToRightOverride, - 0x202E: RLO, // RightToLeftOverride, - 0x202A: LRE, // LeftToRightEmbedding, - 0x202B: RLE, // RightToLeftEmbedding, - 0x202C: PDF, // PopDirectionalFormat, - 0x2066: LRI, // LeftToRightIsolate, - 0x2067: RLI, // RightToLeftIsolate, - 0x2068: FSI, // FirstStrongIsolate, - 0x2069: PDI, // PopDirectionalIsolate, -} - -// A trie entry has the following bits: -// 7..5 XOR mask for brackets -// 4 1: Bracket open, 0: Bracket close -// 3..0 Class type - -const ( - openMask = 0x10 - xorMaskShift = 5 -) diff --git a/vendor/golang.org/x/text/unicode/rangetable/gen.go b/vendor/golang.org/x/text/unicode/rangetable/gen.go deleted file mode 100644 index bea49dda1..000000000 --- a/vendor/golang.org/x/text/unicode/rangetable/gen.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "bytes" - "flag" - "fmt" - "io" - "log" - "reflect" - "sort" - "strings" - "unicode" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/ucd" - "golang.org/x/text/unicode/rangetable" -) - -var versionList = flag.String("versions", "", - "list of versions for which to generate RangeTables") - -const bootstrapMessage = `No versions specified. -To bootstrap the code generation, run: - go run gen.go --versions=4.1.0,5.0.0,6.0.0,6.1.0,6.2.0,6.3.0,7.0.0 - -and ensure that the latest versions are included by checking: - http://www.unicode.org/Public/` - -func getVersions() []string { - if *versionList == "" { - log.Fatal(bootstrapMessage) - } - - versions := strings.Split(*versionList, ",") - sort.Strings(versions) - - // Ensure that at least the current version is included. - for _, v := range versions { - if v == gen.UnicodeVersion() { - return versions - } - } - - versions = append(versions, gen.UnicodeVersion()) - sort.Strings(versions) - return versions -} - -func main() { - gen.Init() - - versions := getVersions() - - w := &bytes.Buffer{} - - fmt.Fprintf(w, "//go:generate go run gen.go --versions=%s\n\n", strings.Join(versions, ",")) - fmt.Fprintf(w, "import \"unicode\"\n\n") - - vstr := func(s string) string { return strings.Replace(s, ".", "_", -1) } - - fmt.Fprintf(w, "var assigned = map[string]*unicode.RangeTable{\n") - for _, v := range versions { - fmt.Fprintf(w, "\t%q: assigned%s,\n", v, vstr(v)) - } - fmt.Fprintf(w, "}\n\n") - - var size int - for _, v := range versions { - assigned := []rune{} - - r := gen.Open("http://www.unicode.org/Public/", "", v+"/ucd/UnicodeData.txt") - ucd.Parse(r, func(p *ucd.Parser) { - assigned = append(assigned, p.Rune(0)) - }) - - rt := rangetable.New(assigned...) - sz := int(reflect.TypeOf(unicode.RangeTable{}).Size()) - sz += int(reflect.TypeOf(unicode.Range16{}).Size()) * len(rt.R16) - sz += int(reflect.TypeOf(unicode.Range32{}).Size()) * len(rt.R32) - - fmt.Fprintf(w, "// size %d bytes (%d KiB)\n", sz, sz/1024) - fmt.Fprintf(w, "var assigned%s = ", vstr(v)) - print(w, rt) - - size += sz - } - - fmt.Fprintf(w, "// Total size %d bytes (%d KiB)\n", size, size/1024) - - gen.WriteGoFile("tables.go", "rangetable", w.Bytes()) -} - -func print(w io.Writer, rt *unicode.RangeTable) { - fmt.Fprintln(w, "&unicode.RangeTable{") - fmt.Fprintln(w, "\tR16: []unicode.Range16{") - for _, r := range rt.R16 { - fmt.Fprintf(w, "\t\t{%#04x, %#04x, %d},\n", r.Lo, r.Hi, r.Stride) - } - fmt.Fprintln(w, "\t},") - fmt.Fprintln(w, "\tR32: []unicode.Range32{") - for _, r := range rt.R32 { - fmt.Fprintf(w, "\t\t{%#08x, %#08x, %d},\n", r.Lo, r.Hi, r.Stride) - } - fmt.Fprintln(w, "\t},") - fmt.Fprintf(w, "\tLatinOffset: %d,\n", rt.LatinOffset) - fmt.Fprintf(w, "}\n\n") -} diff --git a/vendor/golang.org/x/text/unicode/rangetable/merge.go b/vendor/golang.org/x/text/unicode/rangetable/merge.go deleted file mode 100644 index ea2a0803e..000000000 --- a/vendor/golang.org/x/text/unicode/rangetable/merge.go +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package rangetable - -import ( - "unicode" -) - -// atEnd is used to mark a completed iteration. -const atEnd = unicode.MaxRune + 1 - -// Merge returns a new RangeTable that is the union of the given tables. -// It can also be used to compact user-created RangeTables. The entries in -// R16 and R32 for any given RangeTable should be sorted and non-overlapping. -// -// A lookup in the resulting table can be several times faster than using In -// directly on the ranges. Merge is an expensive operation, however, and only -// makes sense if one intends to use the result for more than a couple of -// hundred lookups. -func Merge(ranges ...*unicode.RangeTable) *unicode.RangeTable { - rt := &unicode.RangeTable{} - if len(ranges) == 0 { - return rt - } - - iter := tablesIter(make([]tableIndex, len(ranges))) - - for i, t := range ranges { - iter[i] = tableIndex{t, 0, atEnd} - if len(t.R16) > 0 { - iter[i].next = rune(t.R16[0].Lo) - } - } - - if r0 := iter.next16(); r0.Stride != 0 { - for { - r1 := iter.next16() - if r1.Stride == 0 { - rt.R16 = append(rt.R16, r0) - break - } - stride := r1.Lo - r0.Hi - if (r1.Lo == r1.Hi || stride == r1.Stride) && (r0.Lo == r0.Hi || stride == r0.Stride) { - // Fully merge the next range into the previous one. - r0.Hi, r0.Stride = r1.Hi, stride - continue - } else if stride == r0.Stride { - // Move the first element of r1 to r0. This may eliminate an - // entry. - r0.Hi = r1.Lo - r0.Stride = stride - r1.Lo = r1.Lo + r1.Stride - if r1.Lo > r1.Hi { - continue - } - } - rt.R16 = append(rt.R16, r0) - r0 = r1 - } - } - - for i, t := range ranges { - iter[i] = tableIndex{t, 0, atEnd} - if len(t.R32) > 0 { - iter[i].next = rune(t.R32[0].Lo) - } - } - - if r0 := iter.next32(); r0.Stride != 0 { - for { - r1 := iter.next32() - if r1.Stride == 0 { - rt.R32 = append(rt.R32, r0) - break - } - stride := r1.Lo - r0.Hi - if (r1.Lo == r1.Hi || stride == r1.Stride) && (r0.Lo == r0.Hi || stride == r0.Stride) { - // Fully merge the next range into the previous one. - r0.Hi, r0.Stride = r1.Hi, stride - continue - } else if stride == r0.Stride { - // Move the first element of r1 to r0. This may eliminate an - // entry. - r0.Hi = r1.Lo - r1.Lo = r1.Lo + r1.Stride - if r1.Lo > r1.Hi { - continue - } - } - rt.R32 = append(rt.R32, r0) - r0 = r1 - } - } - - for i := 0; i < len(rt.R16) && rt.R16[i].Hi <= unicode.MaxLatin1; i++ { - rt.LatinOffset = i + 1 - } - - return rt -} - -type tableIndex struct { - t *unicode.RangeTable - p uint32 - next rune -} - -type tablesIter []tableIndex - -// sortIter does an insertion sort using the next field of tableIndex. Insertion -// sort is a good sorting algorithm for this case. -func sortIter(t []tableIndex) { - for i := range t { - for j := i; j > 0 && t[j-1].next > t[j].next; j-- { - t[j], t[j-1] = t[j-1], t[j] - } - } -} - -// next16 finds the ranged to be added to the table. If ranges overlap between -// multiple tables it clips the result to a non-overlapping range if the -// elements are not fully subsumed. It returns a zero range if there are no more -// ranges. -func (ti tablesIter) next16() unicode.Range16 { - sortIter(ti) - - t0 := ti[0] - if t0.next == atEnd { - return unicode.Range16{} - } - r0 := t0.t.R16[t0.p] - r0.Lo = uint16(t0.next) - - // We restrict the Hi of the current range if it overlaps with another range. - for i := range ti { - tn := ti[i] - // Since our tableIndices are sorted by next, we can break if the there - // is no overlap. The first value of a next range can always be merged - // into the current one, so we can break in case of equality as well. - if rune(r0.Hi) <= tn.next { - break - } - rn := tn.t.R16[tn.p] - rn.Lo = uint16(tn.next) - - // Limit r0.Hi based on next ranges in list, but allow it to overlap - // with ranges as long as it subsumes it. - m := (rn.Lo - r0.Lo) % r0.Stride - if m == 0 && (rn.Stride == r0.Stride || rn.Lo == rn.Hi) { - // Overlap, take the min of the two Hi values: for simplicity's sake - // we only process one range at a time. - if r0.Hi > rn.Hi { - r0.Hi = rn.Hi - } - } else { - // Not a compatible stride. Set to the last possible value before - // rn.Lo, but ensure there is at least one value. - if x := rn.Lo - m; r0.Lo <= x { - r0.Hi = x - } - break - } - } - - // Update the next values for each table. - for i := range ti { - tn := &ti[i] - if rune(r0.Hi) < tn.next { - break - } - rn := tn.t.R16[tn.p] - stride := rune(rn.Stride) - tn.next += stride * (1 + ((rune(r0.Hi) - tn.next) / stride)) - if rune(rn.Hi) < tn.next { - if tn.p++; int(tn.p) == len(tn.t.R16) { - tn.next = atEnd - } else { - tn.next = rune(tn.t.R16[tn.p].Lo) - } - } - } - - if r0.Lo == r0.Hi { - r0.Stride = 1 - } - - return r0 -} - -// next32 finds the ranged to be added to the table. If ranges overlap between -// multiple tables it clips the result to a non-overlapping range if the -// elements are not fully subsumed. It returns a zero range if there are no more -// ranges. -func (ti tablesIter) next32() unicode.Range32 { - sortIter(ti) - - t0 := ti[0] - if t0.next == atEnd { - return unicode.Range32{} - } - r0 := t0.t.R32[t0.p] - r0.Lo = uint32(t0.next) - - // We restrict the Hi of the current range if it overlaps with another range. - for i := range ti { - tn := ti[i] - // Since our tableIndices are sorted by next, we can break if the there - // is no overlap. The first value of a next range can always be merged - // into the current one, so we can break in case of equality as well. - if rune(r0.Hi) <= tn.next { - break - } - rn := tn.t.R32[tn.p] - rn.Lo = uint32(tn.next) - - // Limit r0.Hi based on next ranges in list, but allow it to overlap - // with ranges as long as it subsumes it. - m := (rn.Lo - r0.Lo) % r0.Stride - if m == 0 && (rn.Stride == r0.Stride || rn.Lo == rn.Hi) { - // Overlap, take the min of the two Hi values: for simplicity's sake - // we only process one range at a time. - if r0.Hi > rn.Hi { - r0.Hi = rn.Hi - } - } else { - // Not a compatible stride. Set to the last possible value before - // rn.Lo, but ensure there is at least one value. - if x := rn.Lo - m; r0.Lo <= x { - r0.Hi = x - } - break - } - } - - // Update the next values for each table. - for i := range ti { - tn := &ti[i] - if rune(r0.Hi) < tn.next { - break - } - rn := tn.t.R32[tn.p] - stride := rune(rn.Stride) - tn.next += stride * (1 + ((rune(r0.Hi) - tn.next) / stride)) - if rune(rn.Hi) < tn.next { - if tn.p++; int(tn.p) == len(tn.t.R32) { - tn.next = atEnd - } else { - tn.next = rune(tn.t.R32[tn.p].Lo) - } - } - } - - if r0.Lo == r0.Hi { - r0.Stride = 1 - } - - return r0 -} diff --git a/vendor/golang.org/x/text/unicode/rangetable/merge_test.go b/vendor/golang.org/x/text/unicode/rangetable/merge_test.go deleted file mode 100644 index 93ed0fcad..000000000 --- a/vendor/golang.org/x/text/unicode/rangetable/merge_test.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package rangetable - -import ( - "testing" - "unicode" -) - -var ( - maxRuneTable = &unicode.RangeTable{ - R32: []unicode.Range32{ - {unicode.MaxRune, unicode.MaxRune, 1}, - }, - } - - overlap1 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x100, 0xfffc, 4}, - }, - R32: []unicode.Range32{ - {0x100000, 0x10fffc, 4}, - }, - } - - overlap2 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x101, 0xfffd, 4}, - }, - R32: []unicode.Range32{ - {0x100001, 0x10fffd, 3}, - }, - } - - // The following table should be compacted into two entries for R16 and R32. - optimize = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x1, 0x1, 1}, - {0x2, 0x2, 1}, - {0x3, 0x3, 1}, - {0x5, 0x5, 1}, - {0x7, 0x7, 1}, - {0x9, 0x9, 1}, - {0xb, 0xf, 2}, - }, - R32: []unicode.Range32{ - {0x10001, 0x10001, 1}, - {0x10002, 0x10002, 1}, - {0x10003, 0x10003, 1}, - {0x10005, 0x10005, 1}, - {0x10007, 0x10007, 1}, - {0x10009, 0x10009, 1}, - {0x1000b, 0x1000f, 2}, - }, - } -) - -func TestMerge(t *testing.T) { - for i, tt := range [][]*unicode.RangeTable{ - {unicode.Cc, unicode.Cf}, - {unicode.L, unicode.Ll}, - {unicode.L, unicode.Ll, unicode.Lu}, - {unicode.Ll, unicode.Lu}, - {unicode.M}, - unicode.GraphicRanges, - cased, - - // Merge R16 only and R32 only and vice versa. - {unicode.Khmer, unicode.Khudawadi}, - {unicode.Imperial_Aramaic, unicode.Radical}, - - // Merge with empty. - {&unicode.RangeTable{}}, - {&unicode.RangeTable{}, &unicode.RangeTable{}}, - {&unicode.RangeTable{}, &unicode.RangeTable{}, &unicode.RangeTable{}}, - {&unicode.RangeTable{}, unicode.Hiragana}, - {unicode.Inherited, &unicode.RangeTable{}}, - {&unicode.RangeTable{}, unicode.Hanunoo, &unicode.RangeTable{}}, - - // Hypothetical tables. - {maxRuneTable}, - {overlap1, overlap2}, - - // Optimization - {optimize}, - } { - rt := Merge(tt...) - for r := rune(0); r <= unicode.MaxRune; r++ { - if got, want := unicode.Is(rt, r), unicode.In(r, tt...); got != want { - t.Fatalf("%d:%U: got %v; want %v", i, r, got, want) - } - } - // Test optimization and correctness for R16. - for k := 0; k < len(rt.R16)-1; k++ { - if lo, hi := rt.R16[k].Lo, rt.R16[k].Hi; lo > hi { - t.Errorf("%d: Lo (%x) > Hi (%x)", i, lo, hi) - } - if hi, lo := rt.R16[k].Hi, rt.R16[k+1].Lo; hi >= lo { - t.Errorf("%d: Hi (%x) >= next Lo (%x)", i, hi, lo) - } - if rt.R16[k].Hi+rt.R16[k].Stride == rt.R16[k+1].Lo { - t.Errorf("%d: missed optimization for R16 at %d between %X and %x", - i, k, rt.R16[k], rt.R16[k+1]) - } - } - // Test optimization and correctness for R32. - for k := 0; k < len(rt.R32)-1; k++ { - if lo, hi := rt.R32[k].Lo, rt.R32[k].Hi; lo > hi { - t.Errorf("%d: Lo (%x) > Hi (%x)", i, lo, hi) - } - if hi, lo := rt.R32[k].Hi, rt.R32[k+1].Lo; hi >= lo { - t.Errorf("%d: Hi (%x) >= next Lo (%x)", i, hi, lo) - } - if rt.R32[k].Hi+rt.R32[k].Stride == rt.R32[k+1].Lo { - t.Errorf("%d: missed optimization for R32 at %d between %X and %X", - i, k, rt.R32[k], rt.R32[k+1]) - } - } - } -} - -const runes = "Hello World in 2015!,\U0010fffd" - -func BenchmarkNotMerged(t *testing.B) { - for i := 0; i < t.N; i++ { - for _, r := range runes { - unicode.In(r, unicode.GraphicRanges...) - } - } -} - -func BenchmarkMerged(t *testing.B) { - rt := Merge(unicode.GraphicRanges...) - - for i := 0; i < t.N; i++ { - for _, r := range runes { - unicode.Is(rt, r) - } - } -} - -var cased = []*unicode.RangeTable{ - unicode.Lower, - unicode.Upper, - unicode.Title, - unicode.Other_Lowercase, - unicode.Other_Uppercase, -} - -func BenchmarkNotMergedCased(t *testing.B) { - for i := 0; i < t.N; i++ { - for _, r := range runes { - unicode.In(r, cased...) - } - } -} - -func BenchmarkMergedCased(t *testing.B) { - // This reduces len(R16) from 243 to 82 and len(R32) from 65 to 35 for - // Unicode 7.0.0. - rt := Merge(cased...) - - for i := 0; i < t.N; i++ { - for _, r := range runes { - unicode.Is(rt, r) - } - } -} - -func BenchmarkInit(t *testing.B) { - for i := 0; i < t.N; i++ { - Merge(cased...) - Merge(unicode.GraphicRanges...) - } -} - -func BenchmarkInit2(t *testing.B) { - // Hypothetical near-worst-case performance. - for i := 0; i < t.N; i++ { - Merge(overlap1, overlap2) - } -} diff --git a/vendor/golang.org/x/text/unicode/rangetable/rangetable.go b/vendor/golang.org/x/text/unicode/rangetable/rangetable.go deleted file mode 100644 index 187882cc3..000000000 --- a/vendor/golang.org/x/text/unicode/rangetable/rangetable.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package rangetable provides utilities for creating and inspecting -// unicode.RangeTables. -package rangetable - -import ( - "sort" - "unicode" -) - -// New creates a RangeTable from the given runes, which may contain duplicates. -func New(r ...rune) *unicode.RangeTable { - if len(r) == 0 { - return &unicode.RangeTable{} - } - - sort.Sort(byRune(r)) - - // Remove duplicates. - k := 1 - for i := 1; i < len(r); i++ { - if r[k-1] != r[i] { - r[k] = r[i] - k++ - } - } - - var rt unicode.RangeTable - for _, r := range r[:k] { - if r <= 0xFFFF { - rt.R16 = append(rt.R16, unicode.Range16{Lo: uint16(r), Hi: uint16(r), Stride: 1}) - } else { - rt.R32 = append(rt.R32, unicode.Range32{Lo: uint32(r), Hi: uint32(r), Stride: 1}) - } - } - - // Optimize RangeTable. - return Merge(&rt) -} - -type byRune []rune - -func (r byRune) Len() int { return len(r) } -func (r byRune) Swap(i, j int) { r[i], r[j] = r[j], r[i] } -func (r byRune) Less(i, j int) bool { return r[i] < r[j] } - -// Visit visits all runes in the given RangeTable in order, calling fn for each. -func Visit(rt *unicode.RangeTable, fn func(rune)) { - for _, r16 := range rt.R16 { - for r := rune(r16.Lo); r <= rune(r16.Hi); r += rune(r16.Stride) { - fn(r) - } - } - for _, r32 := range rt.R32 { - for r := rune(r32.Lo); r <= rune(r32.Hi); r += rune(r32.Stride) { - fn(r) - } - } -} - -// Assigned returns a RangeTable with all assigned code points for a given -// Unicode version. This includes graphic, format, control, and private-use -// characters. It returns nil if the data for the given version is not -// available. -func Assigned(version string) *unicode.RangeTable { - return assigned[version] -} diff --git a/vendor/golang.org/x/text/unicode/rangetable/rangetable_test.go b/vendor/golang.org/x/text/unicode/rangetable/rangetable_test.go deleted file mode 100644 index 5a355aa35..000000000 --- a/vendor/golang.org/x/text/unicode/rangetable/rangetable_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package rangetable - -import ( - "reflect" - "testing" - "unicode" -) - -var ( - empty = &unicode.RangeTable{} - many = &unicode.RangeTable{ - R16: []unicode.Range16{{0, 0xffff, 5}}, - R32: []unicode.Range32{{0x10004, 0x10009, 5}}, - LatinOffset: 0, - } -) - -func TestVisit(t *testing.T) { - Visit(empty, func(got rune) { - t.Error("call from empty RangeTable") - }) - - var want rune - Visit(many, func(got rune) { - if got != want { - t.Errorf("got %U; want %U", got, want) - } - want += 5 - }) - if want -= 5; want != 0x10009 { - t.Errorf("last run was %U; want U+10009", want) - } -} - -func TestNew(t *testing.T) { - for i, rt := range []*unicode.RangeTable{ - empty, - unicode.Co, - unicode.Letter, - unicode.ASCII_Hex_Digit, - many, - maxRuneTable, - } { - var got, want []rune - Visit(rt, func(r rune) { - want = append(want, r) - }) - Visit(New(want...), func(r rune) { - got = append(got, r) - }) - if !reflect.DeepEqual(got, want) { - t.Errorf("%d:\ngot %v;\nwant %v", i, got, want) - } - } -} diff --git a/vendor/golang.org/x/text/unicode/rangetable/tables.go b/vendor/golang.org/x/text/unicode/rangetable/tables.go deleted file mode 100644 index 61c989b4c..000000000 --- a/vendor/golang.org/x/text/unicode/rangetable/tables.go +++ /dev/null @@ -1,5735 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package rangetable - -//go:generate go run gen.go --versions=4.1.0,5.0.0,5.1.0,5.2.0,6.0.0,6.1.0,6.2.0,6.3.0,7.0.0,8.0.0,9.0.0 - -import "unicode" - -var assigned = map[string]*unicode.RangeTable{ - "4.1.0": assigned4_1_0, - "5.0.0": assigned5_0_0, - "5.1.0": assigned5_1_0, - "5.2.0": assigned5_2_0, - "6.0.0": assigned6_0_0, - "6.1.0": assigned6_1_0, - "6.2.0": assigned6_2_0, - "6.3.0": assigned6_3_0, - "7.0.0": assigned7_0_0, - "8.0.0": assigned8_0_0, - "9.0.0": assigned9_0_0, -} - -// size 2924 bytes (2 KiB) -var assigned4_1_0 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x0000, 0x0241, 1}, - {0x0250, 0x036f, 1}, - {0x0374, 0x0375, 1}, - {0x037a, 0x037e, 4}, - {0x0384, 0x038a, 1}, - {0x038c, 0x038e, 2}, - {0x038f, 0x03a1, 1}, - {0x03a3, 0x03ce, 1}, - {0x03d0, 0x0486, 1}, - {0x0488, 0x04ce, 1}, - {0x04d0, 0x04f9, 1}, - {0x0500, 0x050f, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x055f, 1}, - {0x0561, 0x0587, 1}, - {0x0589, 0x058a, 1}, - {0x0591, 0x05b9, 1}, - {0x05bb, 0x05c7, 1}, - {0x05d0, 0x05ea, 1}, - {0x05f0, 0x05f4, 1}, - {0x0600, 0x0603, 1}, - {0x060b, 0x0615, 1}, - {0x061b, 0x061e, 3}, - {0x061f, 0x0621, 2}, - {0x0622, 0x063a, 1}, - {0x0640, 0x065e, 1}, - {0x0660, 0x070d, 1}, - {0x070f, 0x074a, 1}, - {0x074d, 0x076d, 1}, - {0x0780, 0x07b1, 1}, - {0x0901, 0x0939, 1}, - {0x093c, 0x094d, 1}, - {0x0950, 0x0954, 1}, - {0x0958, 0x0970, 1}, - {0x097d, 0x0981, 4}, - {0x0982, 0x0983, 1}, - {0x0985, 0x098c, 1}, - {0x098f, 0x0990, 1}, - {0x0993, 0x09a8, 1}, - {0x09aa, 0x09b0, 1}, - {0x09b2, 0x09b6, 4}, - {0x09b7, 0x09b9, 1}, - {0x09bc, 0x09c4, 1}, - {0x09c7, 0x09c8, 1}, - {0x09cb, 0x09ce, 1}, - {0x09d7, 0x09dc, 5}, - {0x09dd, 0x09df, 2}, - {0x09e0, 0x09e3, 1}, - {0x09e6, 0x09fa, 1}, - {0x0a01, 0x0a03, 1}, - {0x0a05, 0x0a0a, 1}, - {0x0a0f, 0x0a10, 1}, - {0x0a13, 0x0a28, 1}, - {0x0a2a, 0x0a30, 1}, - {0x0a32, 0x0a33, 1}, - {0x0a35, 0x0a36, 1}, - {0x0a38, 0x0a39, 1}, - {0x0a3c, 0x0a3e, 2}, - {0x0a3f, 0x0a42, 1}, - {0x0a47, 0x0a48, 1}, - {0x0a4b, 0x0a4d, 1}, - {0x0a59, 0x0a5c, 1}, - {0x0a5e, 0x0a66, 8}, - {0x0a67, 0x0a74, 1}, - {0x0a81, 0x0a83, 1}, - {0x0a85, 0x0a8d, 1}, - {0x0a8f, 0x0a91, 1}, - {0x0a93, 0x0aa8, 1}, - {0x0aaa, 0x0ab0, 1}, - {0x0ab2, 0x0ab3, 1}, - {0x0ab5, 0x0ab9, 1}, - {0x0abc, 0x0ac5, 1}, - {0x0ac7, 0x0ac9, 1}, - {0x0acb, 0x0acd, 1}, - {0x0ad0, 0x0ae0, 16}, - {0x0ae1, 0x0ae3, 1}, - {0x0ae6, 0x0aef, 1}, - {0x0af1, 0x0b01, 16}, - {0x0b02, 0x0b03, 1}, - {0x0b05, 0x0b0c, 1}, - {0x0b0f, 0x0b10, 1}, - {0x0b13, 0x0b28, 1}, - {0x0b2a, 0x0b30, 1}, - {0x0b32, 0x0b33, 1}, - {0x0b35, 0x0b39, 1}, - {0x0b3c, 0x0b43, 1}, - {0x0b47, 0x0b48, 1}, - {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, - {0x0b5c, 0x0b5d, 1}, - {0x0b5f, 0x0b61, 1}, - {0x0b66, 0x0b71, 1}, - {0x0b82, 0x0b83, 1}, - {0x0b85, 0x0b8a, 1}, - {0x0b8e, 0x0b90, 1}, - {0x0b92, 0x0b95, 1}, - {0x0b99, 0x0b9a, 1}, - {0x0b9c, 0x0b9e, 2}, - {0x0b9f, 0x0ba3, 4}, - {0x0ba4, 0x0ba8, 4}, - {0x0ba9, 0x0baa, 1}, - {0x0bae, 0x0bb9, 1}, - {0x0bbe, 0x0bc2, 1}, - {0x0bc6, 0x0bc8, 1}, - {0x0bca, 0x0bcd, 1}, - {0x0bd7, 0x0be6, 15}, - {0x0be7, 0x0bfa, 1}, - {0x0c01, 0x0c03, 1}, - {0x0c05, 0x0c0c, 1}, - {0x0c0e, 0x0c10, 1}, - {0x0c12, 0x0c28, 1}, - {0x0c2a, 0x0c33, 1}, - {0x0c35, 0x0c39, 1}, - {0x0c3e, 0x0c44, 1}, - {0x0c46, 0x0c48, 1}, - {0x0c4a, 0x0c4d, 1}, - {0x0c55, 0x0c56, 1}, - {0x0c60, 0x0c61, 1}, - {0x0c66, 0x0c6f, 1}, - {0x0c82, 0x0c83, 1}, - {0x0c85, 0x0c8c, 1}, - {0x0c8e, 0x0c90, 1}, - {0x0c92, 0x0ca8, 1}, - {0x0caa, 0x0cb3, 1}, - {0x0cb5, 0x0cb9, 1}, - {0x0cbc, 0x0cc4, 1}, - {0x0cc6, 0x0cc8, 1}, - {0x0cca, 0x0ccd, 1}, - {0x0cd5, 0x0cd6, 1}, - {0x0cde, 0x0ce0, 2}, - {0x0ce1, 0x0ce6, 5}, - {0x0ce7, 0x0cef, 1}, - {0x0d02, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, - {0x0d0e, 0x0d10, 1}, - {0x0d12, 0x0d28, 1}, - {0x0d2a, 0x0d39, 1}, - {0x0d3e, 0x0d43, 1}, - {0x0d46, 0x0d48, 1}, - {0x0d4a, 0x0d4d, 1}, - {0x0d57, 0x0d60, 9}, - {0x0d61, 0x0d66, 5}, - {0x0d67, 0x0d6f, 1}, - {0x0d82, 0x0d83, 1}, - {0x0d85, 0x0d96, 1}, - {0x0d9a, 0x0db1, 1}, - {0x0db3, 0x0dbb, 1}, - {0x0dbd, 0x0dc0, 3}, - {0x0dc1, 0x0dc6, 1}, - {0x0dca, 0x0dcf, 5}, - {0x0dd0, 0x0dd4, 1}, - {0x0dd6, 0x0dd8, 2}, - {0x0dd9, 0x0ddf, 1}, - {0x0df2, 0x0df4, 1}, - {0x0e01, 0x0e3a, 1}, - {0x0e3f, 0x0e5b, 1}, - {0x0e81, 0x0e82, 1}, - {0x0e84, 0x0e87, 3}, - {0x0e88, 0x0e8a, 2}, - {0x0e8d, 0x0e94, 7}, - {0x0e95, 0x0e97, 1}, - {0x0e99, 0x0e9f, 1}, - {0x0ea1, 0x0ea3, 1}, - {0x0ea5, 0x0ea7, 2}, - {0x0eaa, 0x0eab, 1}, - {0x0ead, 0x0eb9, 1}, - {0x0ebb, 0x0ebd, 1}, - {0x0ec0, 0x0ec4, 1}, - {0x0ec6, 0x0ec8, 2}, - {0x0ec9, 0x0ecd, 1}, - {0x0ed0, 0x0ed9, 1}, - {0x0edc, 0x0edd, 1}, - {0x0f00, 0x0f47, 1}, - {0x0f49, 0x0f6a, 1}, - {0x0f71, 0x0f8b, 1}, - {0x0f90, 0x0f97, 1}, - {0x0f99, 0x0fbc, 1}, - {0x0fbe, 0x0fcc, 1}, - {0x0fcf, 0x0fd1, 1}, - {0x1000, 0x1021, 1}, - {0x1023, 0x1027, 1}, - {0x1029, 0x102a, 1}, - {0x102c, 0x1032, 1}, - {0x1036, 0x1039, 1}, - {0x1040, 0x1059, 1}, - {0x10a0, 0x10c5, 1}, - {0x10d0, 0x10fc, 1}, - {0x1100, 0x1159, 1}, - {0x115f, 0x11a2, 1}, - {0x11a8, 0x11f9, 1}, - {0x1200, 0x1248, 1}, - {0x124a, 0x124d, 1}, - {0x1250, 0x1256, 1}, - {0x1258, 0x125a, 2}, - {0x125b, 0x125d, 1}, - {0x1260, 0x1288, 1}, - {0x128a, 0x128d, 1}, - {0x1290, 0x12b0, 1}, - {0x12b2, 0x12b5, 1}, - {0x12b8, 0x12be, 1}, - {0x12c0, 0x12c2, 2}, - {0x12c3, 0x12c5, 1}, - {0x12c8, 0x12d6, 1}, - {0x12d8, 0x1310, 1}, - {0x1312, 0x1315, 1}, - {0x1318, 0x135a, 1}, - {0x135f, 0x137c, 1}, - {0x1380, 0x1399, 1}, - {0x13a0, 0x13f4, 1}, - {0x1401, 0x1676, 1}, - {0x1680, 0x169c, 1}, - {0x16a0, 0x16f0, 1}, - {0x1700, 0x170c, 1}, - {0x170e, 0x1714, 1}, - {0x1720, 0x1736, 1}, - {0x1740, 0x1753, 1}, - {0x1760, 0x176c, 1}, - {0x176e, 0x1770, 1}, - {0x1772, 0x1773, 1}, - {0x1780, 0x17dd, 1}, - {0x17e0, 0x17e9, 1}, - {0x17f0, 0x17f9, 1}, - {0x1800, 0x180e, 1}, - {0x1810, 0x1819, 1}, - {0x1820, 0x1877, 1}, - {0x1880, 0x18a9, 1}, - {0x1900, 0x191c, 1}, - {0x1920, 0x192b, 1}, - {0x1930, 0x193b, 1}, - {0x1940, 0x1944, 4}, - {0x1945, 0x196d, 1}, - {0x1970, 0x1974, 1}, - {0x1980, 0x19a9, 1}, - {0x19b0, 0x19c9, 1}, - {0x19d0, 0x19d9, 1}, - {0x19de, 0x1a1b, 1}, - {0x1a1e, 0x1a1f, 1}, - {0x1d00, 0x1dc3, 1}, - {0x1e00, 0x1e9b, 1}, - {0x1ea0, 0x1ef9, 1}, - {0x1f00, 0x1f15, 1}, - {0x1f18, 0x1f1d, 1}, - {0x1f20, 0x1f45, 1}, - {0x1f48, 0x1f4d, 1}, - {0x1f50, 0x1f57, 1}, - {0x1f59, 0x1f5f, 2}, - {0x1f60, 0x1f7d, 1}, - {0x1f80, 0x1fb4, 1}, - {0x1fb6, 0x1fc4, 1}, - {0x1fc6, 0x1fd3, 1}, - {0x1fd6, 0x1fdb, 1}, - {0x1fdd, 0x1fef, 1}, - {0x1ff2, 0x1ff4, 1}, - {0x1ff6, 0x1ffe, 1}, - {0x2000, 0x2063, 1}, - {0x206a, 0x2071, 1}, - {0x2074, 0x208e, 1}, - {0x2090, 0x2094, 1}, - {0x20a0, 0x20b5, 1}, - {0x20d0, 0x20eb, 1}, - {0x2100, 0x214c, 1}, - {0x2153, 0x2183, 1}, - {0x2190, 0x23db, 1}, - {0x2400, 0x2426, 1}, - {0x2440, 0x244a, 1}, - {0x2460, 0x269c, 1}, - {0x26a0, 0x26b1, 1}, - {0x2701, 0x2704, 1}, - {0x2706, 0x2709, 1}, - {0x270c, 0x2727, 1}, - {0x2729, 0x274b, 1}, - {0x274d, 0x274f, 2}, - {0x2750, 0x2752, 1}, - {0x2756, 0x2758, 2}, - {0x2759, 0x275e, 1}, - {0x2761, 0x2794, 1}, - {0x2798, 0x27af, 1}, - {0x27b1, 0x27be, 1}, - {0x27c0, 0x27c6, 1}, - {0x27d0, 0x27eb, 1}, - {0x27f0, 0x2b13, 1}, - {0x2c00, 0x2c2e, 1}, - {0x2c30, 0x2c5e, 1}, - {0x2c80, 0x2cea, 1}, - {0x2cf9, 0x2d25, 1}, - {0x2d30, 0x2d65, 1}, - {0x2d6f, 0x2d80, 17}, - {0x2d81, 0x2d96, 1}, - {0x2da0, 0x2da6, 1}, - {0x2da8, 0x2dae, 1}, - {0x2db0, 0x2db6, 1}, - {0x2db8, 0x2dbe, 1}, - {0x2dc0, 0x2dc6, 1}, - {0x2dc8, 0x2dce, 1}, - {0x2dd0, 0x2dd6, 1}, - {0x2dd8, 0x2dde, 1}, - {0x2e00, 0x2e17, 1}, - {0x2e1c, 0x2e1d, 1}, - {0x2e80, 0x2e99, 1}, - {0x2e9b, 0x2ef3, 1}, - {0x2f00, 0x2fd5, 1}, - {0x2ff0, 0x2ffb, 1}, - {0x3000, 0x303f, 1}, - {0x3041, 0x3096, 1}, - {0x3099, 0x30ff, 1}, - {0x3105, 0x312c, 1}, - {0x3131, 0x318e, 1}, - {0x3190, 0x31b7, 1}, - {0x31c0, 0x31cf, 1}, - {0x31f0, 0x321e, 1}, - {0x3220, 0x3243, 1}, - {0x3250, 0x32fe, 1}, - {0x3300, 0x4db5, 1}, - {0x4dc0, 0x9fbb, 1}, - {0xa000, 0xa48c, 1}, - {0xa490, 0xa4c6, 1}, - {0xa700, 0xa716, 1}, - {0xa800, 0xa82b, 1}, - {0xac00, 0xd7a3, 1}, - {0xd800, 0xfa2d, 1}, - {0xfa30, 0xfa6a, 1}, - {0xfa70, 0xfad9, 1}, - {0xfb00, 0xfb06, 1}, - {0xfb13, 0xfb17, 1}, - {0xfb1d, 0xfb36, 1}, - {0xfb38, 0xfb3c, 1}, - {0xfb3e, 0xfb40, 2}, - {0xfb41, 0xfb43, 2}, - {0xfb44, 0xfb46, 2}, - {0xfb47, 0xfbb1, 1}, - {0xfbd3, 0xfd3f, 1}, - {0xfd50, 0xfd8f, 1}, - {0xfd92, 0xfdc7, 1}, - {0xfdf0, 0xfdfd, 1}, - {0xfe00, 0xfe19, 1}, - {0xfe20, 0xfe23, 1}, - {0xfe30, 0xfe52, 1}, - {0xfe54, 0xfe66, 1}, - {0xfe68, 0xfe6b, 1}, - {0xfe70, 0xfe74, 1}, - {0xfe76, 0xfefc, 1}, - {0xfeff, 0xff01, 2}, - {0xff02, 0xffbe, 1}, - {0xffc2, 0xffc7, 1}, - {0xffca, 0xffcf, 1}, - {0xffd2, 0xffd7, 1}, - {0xffda, 0xffdc, 1}, - {0xffe0, 0xffe6, 1}, - {0xffe8, 0xffee, 1}, - {0xfff9, 0xfffd, 1}, - }, - R32: []unicode.Range32{ - {0x00010000, 0x0001000b, 1}, - {0x0001000d, 0x00010026, 1}, - {0x00010028, 0x0001003a, 1}, - {0x0001003c, 0x0001003d, 1}, - {0x0001003f, 0x0001004d, 1}, - {0x00010050, 0x0001005d, 1}, - {0x00010080, 0x000100fa, 1}, - {0x00010100, 0x00010102, 1}, - {0x00010107, 0x00010133, 1}, - {0x00010137, 0x0001018a, 1}, - {0x00010300, 0x0001031e, 1}, - {0x00010320, 0x00010323, 1}, - {0x00010330, 0x0001034a, 1}, - {0x00010380, 0x0001039d, 1}, - {0x0001039f, 0x000103c3, 1}, - {0x000103c8, 0x000103d5, 1}, - {0x00010400, 0x0001049d, 1}, - {0x000104a0, 0x000104a9, 1}, - {0x00010800, 0x00010805, 1}, - {0x00010808, 0x0001080a, 2}, - {0x0001080b, 0x00010835, 1}, - {0x00010837, 0x00010838, 1}, - {0x0001083c, 0x0001083f, 3}, - {0x00010a00, 0x00010a03, 1}, - {0x00010a05, 0x00010a06, 1}, - {0x00010a0c, 0x00010a13, 1}, - {0x00010a15, 0x00010a17, 1}, - {0x00010a19, 0x00010a33, 1}, - {0x00010a38, 0x00010a3a, 1}, - {0x00010a3f, 0x00010a47, 1}, - {0x00010a50, 0x00010a58, 1}, - {0x0001d000, 0x0001d0f5, 1}, - {0x0001d100, 0x0001d126, 1}, - {0x0001d12a, 0x0001d1dd, 1}, - {0x0001d200, 0x0001d245, 1}, - {0x0001d300, 0x0001d356, 1}, - {0x0001d400, 0x0001d454, 1}, - {0x0001d456, 0x0001d49c, 1}, - {0x0001d49e, 0x0001d49f, 1}, - {0x0001d4a2, 0x0001d4a5, 3}, - {0x0001d4a6, 0x0001d4a9, 3}, - {0x0001d4aa, 0x0001d4ac, 1}, - {0x0001d4ae, 0x0001d4b9, 1}, - {0x0001d4bb, 0x0001d4bd, 2}, - {0x0001d4be, 0x0001d4c3, 1}, - {0x0001d4c5, 0x0001d505, 1}, - {0x0001d507, 0x0001d50a, 1}, - {0x0001d50d, 0x0001d514, 1}, - {0x0001d516, 0x0001d51c, 1}, - {0x0001d51e, 0x0001d539, 1}, - {0x0001d53b, 0x0001d53e, 1}, - {0x0001d540, 0x0001d544, 1}, - {0x0001d546, 0x0001d54a, 4}, - {0x0001d54b, 0x0001d550, 1}, - {0x0001d552, 0x0001d6a5, 1}, - {0x0001d6a8, 0x0001d7c9, 1}, - {0x0001d7ce, 0x0001d7ff, 1}, - {0x00020000, 0x0002a6d6, 1}, - {0x0002f800, 0x0002fa1d, 1}, - {0x000e0001, 0x000e0020, 31}, - {0x000e0021, 0x000e007f, 1}, - {0x000e0100, 0x000e01ef, 1}, - {0x000f0000, 0x000ffffd, 1}, - {0x00100000, 0x0010fffd, 1}, - }, - LatinOffset: 0, -} - -// size 3026 bytes (2 KiB) -var assigned5_0_0 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x0000, 0x036f, 1}, - {0x0374, 0x0375, 1}, - {0x037a, 0x037e, 1}, - {0x0384, 0x038a, 1}, - {0x038c, 0x038e, 2}, - {0x038f, 0x03a1, 1}, - {0x03a3, 0x03ce, 1}, - {0x03d0, 0x0486, 1}, - {0x0488, 0x0513, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x055f, 1}, - {0x0561, 0x0587, 1}, - {0x0589, 0x058a, 1}, - {0x0591, 0x05c7, 1}, - {0x05d0, 0x05ea, 1}, - {0x05f0, 0x05f4, 1}, - {0x0600, 0x0603, 1}, - {0x060b, 0x0615, 1}, - {0x061b, 0x061e, 3}, - {0x061f, 0x0621, 2}, - {0x0622, 0x063a, 1}, - {0x0640, 0x065e, 1}, - {0x0660, 0x070d, 1}, - {0x070f, 0x074a, 1}, - {0x074d, 0x076d, 1}, - {0x0780, 0x07b1, 1}, - {0x07c0, 0x07fa, 1}, - {0x0901, 0x0939, 1}, - {0x093c, 0x094d, 1}, - {0x0950, 0x0954, 1}, - {0x0958, 0x0970, 1}, - {0x097b, 0x097f, 1}, - {0x0981, 0x0983, 1}, - {0x0985, 0x098c, 1}, - {0x098f, 0x0990, 1}, - {0x0993, 0x09a8, 1}, - {0x09aa, 0x09b0, 1}, - {0x09b2, 0x09b6, 4}, - {0x09b7, 0x09b9, 1}, - {0x09bc, 0x09c4, 1}, - {0x09c7, 0x09c8, 1}, - {0x09cb, 0x09ce, 1}, - {0x09d7, 0x09dc, 5}, - {0x09dd, 0x09df, 2}, - {0x09e0, 0x09e3, 1}, - {0x09e6, 0x09fa, 1}, - {0x0a01, 0x0a03, 1}, - {0x0a05, 0x0a0a, 1}, - {0x0a0f, 0x0a10, 1}, - {0x0a13, 0x0a28, 1}, - {0x0a2a, 0x0a30, 1}, - {0x0a32, 0x0a33, 1}, - {0x0a35, 0x0a36, 1}, - {0x0a38, 0x0a39, 1}, - {0x0a3c, 0x0a3e, 2}, - {0x0a3f, 0x0a42, 1}, - {0x0a47, 0x0a48, 1}, - {0x0a4b, 0x0a4d, 1}, - {0x0a59, 0x0a5c, 1}, - {0x0a5e, 0x0a66, 8}, - {0x0a67, 0x0a74, 1}, - {0x0a81, 0x0a83, 1}, - {0x0a85, 0x0a8d, 1}, - {0x0a8f, 0x0a91, 1}, - {0x0a93, 0x0aa8, 1}, - {0x0aaa, 0x0ab0, 1}, - {0x0ab2, 0x0ab3, 1}, - {0x0ab5, 0x0ab9, 1}, - {0x0abc, 0x0ac5, 1}, - {0x0ac7, 0x0ac9, 1}, - {0x0acb, 0x0acd, 1}, - {0x0ad0, 0x0ae0, 16}, - {0x0ae1, 0x0ae3, 1}, - {0x0ae6, 0x0aef, 1}, - {0x0af1, 0x0b01, 16}, - {0x0b02, 0x0b03, 1}, - {0x0b05, 0x0b0c, 1}, - {0x0b0f, 0x0b10, 1}, - {0x0b13, 0x0b28, 1}, - {0x0b2a, 0x0b30, 1}, - {0x0b32, 0x0b33, 1}, - {0x0b35, 0x0b39, 1}, - {0x0b3c, 0x0b43, 1}, - {0x0b47, 0x0b48, 1}, - {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, - {0x0b5c, 0x0b5d, 1}, - {0x0b5f, 0x0b61, 1}, - {0x0b66, 0x0b71, 1}, - {0x0b82, 0x0b83, 1}, - {0x0b85, 0x0b8a, 1}, - {0x0b8e, 0x0b90, 1}, - {0x0b92, 0x0b95, 1}, - {0x0b99, 0x0b9a, 1}, - {0x0b9c, 0x0b9e, 2}, - {0x0b9f, 0x0ba3, 4}, - {0x0ba4, 0x0ba8, 4}, - {0x0ba9, 0x0baa, 1}, - {0x0bae, 0x0bb9, 1}, - {0x0bbe, 0x0bc2, 1}, - {0x0bc6, 0x0bc8, 1}, - {0x0bca, 0x0bcd, 1}, - {0x0bd7, 0x0be6, 15}, - {0x0be7, 0x0bfa, 1}, - {0x0c01, 0x0c03, 1}, - {0x0c05, 0x0c0c, 1}, - {0x0c0e, 0x0c10, 1}, - {0x0c12, 0x0c28, 1}, - {0x0c2a, 0x0c33, 1}, - {0x0c35, 0x0c39, 1}, - {0x0c3e, 0x0c44, 1}, - {0x0c46, 0x0c48, 1}, - {0x0c4a, 0x0c4d, 1}, - {0x0c55, 0x0c56, 1}, - {0x0c60, 0x0c61, 1}, - {0x0c66, 0x0c6f, 1}, - {0x0c82, 0x0c83, 1}, - {0x0c85, 0x0c8c, 1}, - {0x0c8e, 0x0c90, 1}, - {0x0c92, 0x0ca8, 1}, - {0x0caa, 0x0cb3, 1}, - {0x0cb5, 0x0cb9, 1}, - {0x0cbc, 0x0cc4, 1}, - {0x0cc6, 0x0cc8, 1}, - {0x0cca, 0x0ccd, 1}, - {0x0cd5, 0x0cd6, 1}, - {0x0cde, 0x0ce0, 2}, - {0x0ce1, 0x0ce3, 1}, - {0x0ce6, 0x0cef, 1}, - {0x0cf1, 0x0cf2, 1}, - {0x0d02, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, - {0x0d0e, 0x0d10, 1}, - {0x0d12, 0x0d28, 1}, - {0x0d2a, 0x0d39, 1}, - {0x0d3e, 0x0d43, 1}, - {0x0d46, 0x0d48, 1}, - {0x0d4a, 0x0d4d, 1}, - {0x0d57, 0x0d60, 9}, - {0x0d61, 0x0d66, 5}, - {0x0d67, 0x0d6f, 1}, - {0x0d82, 0x0d83, 1}, - {0x0d85, 0x0d96, 1}, - {0x0d9a, 0x0db1, 1}, - {0x0db3, 0x0dbb, 1}, - {0x0dbd, 0x0dc0, 3}, - {0x0dc1, 0x0dc6, 1}, - {0x0dca, 0x0dcf, 5}, - {0x0dd0, 0x0dd4, 1}, - {0x0dd6, 0x0dd8, 2}, - {0x0dd9, 0x0ddf, 1}, - {0x0df2, 0x0df4, 1}, - {0x0e01, 0x0e3a, 1}, - {0x0e3f, 0x0e5b, 1}, - {0x0e81, 0x0e82, 1}, - {0x0e84, 0x0e87, 3}, - {0x0e88, 0x0e8a, 2}, - {0x0e8d, 0x0e94, 7}, - {0x0e95, 0x0e97, 1}, - {0x0e99, 0x0e9f, 1}, - {0x0ea1, 0x0ea3, 1}, - {0x0ea5, 0x0ea7, 2}, - {0x0eaa, 0x0eab, 1}, - {0x0ead, 0x0eb9, 1}, - {0x0ebb, 0x0ebd, 1}, - {0x0ec0, 0x0ec4, 1}, - {0x0ec6, 0x0ec8, 2}, - {0x0ec9, 0x0ecd, 1}, - {0x0ed0, 0x0ed9, 1}, - {0x0edc, 0x0edd, 1}, - {0x0f00, 0x0f47, 1}, - {0x0f49, 0x0f6a, 1}, - {0x0f71, 0x0f8b, 1}, - {0x0f90, 0x0f97, 1}, - {0x0f99, 0x0fbc, 1}, - {0x0fbe, 0x0fcc, 1}, - {0x0fcf, 0x0fd1, 1}, - {0x1000, 0x1021, 1}, - {0x1023, 0x1027, 1}, - {0x1029, 0x102a, 1}, - {0x102c, 0x1032, 1}, - {0x1036, 0x1039, 1}, - {0x1040, 0x1059, 1}, - {0x10a0, 0x10c5, 1}, - {0x10d0, 0x10fc, 1}, - {0x1100, 0x1159, 1}, - {0x115f, 0x11a2, 1}, - {0x11a8, 0x11f9, 1}, - {0x1200, 0x1248, 1}, - {0x124a, 0x124d, 1}, - {0x1250, 0x1256, 1}, - {0x1258, 0x125a, 2}, - {0x125b, 0x125d, 1}, - {0x1260, 0x1288, 1}, - {0x128a, 0x128d, 1}, - {0x1290, 0x12b0, 1}, - {0x12b2, 0x12b5, 1}, - {0x12b8, 0x12be, 1}, - {0x12c0, 0x12c2, 2}, - {0x12c3, 0x12c5, 1}, - {0x12c8, 0x12d6, 1}, - {0x12d8, 0x1310, 1}, - {0x1312, 0x1315, 1}, - {0x1318, 0x135a, 1}, - {0x135f, 0x137c, 1}, - {0x1380, 0x1399, 1}, - {0x13a0, 0x13f4, 1}, - {0x1401, 0x1676, 1}, - {0x1680, 0x169c, 1}, - {0x16a0, 0x16f0, 1}, - {0x1700, 0x170c, 1}, - {0x170e, 0x1714, 1}, - {0x1720, 0x1736, 1}, - {0x1740, 0x1753, 1}, - {0x1760, 0x176c, 1}, - {0x176e, 0x1770, 1}, - {0x1772, 0x1773, 1}, - {0x1780, 0x17dd, 1}, - {0x17e0, 0x17e9, 1}, - {0x17f0, 0x17f9, 1}, - {0x1800, 0x180e, 1}, - {0x1810, 0x1819, 1}, - {0x1820, 0x1877, 1}, - {0x1880, 0x18a9, 1}, - {0x1900, 0x191c, 1}, - {0x1920, 0x192b, 1}, - {0x1930, 0x193b, 1}, - {0x1940, 0x1944, 4}, - {0x1945, 0x196d, 1}, - {0x1970, 0x1974, 1}, - {0x1980, 0x19a9, 1}, - {0x19b0, 0x19c9, 1}, - {0x19d0, 0x19d9, 1}, - {0x19de, 0x1a1b, 1}, - {0x1a1e, 0x1a1f, 1}, - {0x1b00, 0x1b4b, 1}, - {0x1b50, 0x1b7c, 1}, - {0x1d00, 0x1dca, 1}, - {0x1dfe, 0x1e9b, 1}, - {0x1ea0, 0x1ef9, 1}, - {0x1f00, 0x1f15, 1}, - {0x1f18, 0x1f1d, 1}, - {0x1f20, 0x1f45, 1}, - {0x1f48, 0x1f4d, 1}, - {0x1f50, 0x1f57, 1}, - {0x1f59, 0x1f5f, 2}, - {0x1f60, 0x1f7d, 1}, - {0x1f80, 0x1fb4, 1}, - {0x1fb6, 0x1fc4, 1}, - {0x1fc6, 0x1fd3, 1}, - {0x1fd6, 0x1fdb, 1}, - {0x1fdd, 0x1fef, 1}, - {0x1ff2, 0x1ff4, 1}, - {0x1ff6, 0x1ffe, 1}, - {0x2000, 0x2063, 1}, - {0x206a, 0x2071, 1}, - {0x2074, 0x208e, 1}, - {0x2090, 0x2094, 1}, - {0x20a0, 0x20b5, 1}, - {0x20d0, 0x20ef, 1}, - {0x2100, 0x214e, 1}, - {0x2153, 0x2184, 1}, - {0x2190, 0x23e7, 1}, - {0x2400, 0x2426, 1}, - {0x2440, 0x244a, 1}, - {0x2460, 0x269c, 1}, - {0x26a0, 0x26b2, 1}, - {0x2701, 0x2704, 1}, - {0x2706, 0x2709, 1}, - {0x270c, 0x2727, 1}, - {0x2729, 0x274b, 1}, - {0x274d, 0x274f, 2}, - {0x2750, 0x2752, 1}, - {0x2756, 0x2758, 2}, - {0x2759, 0x275e, 1}, - {0x2761, 0x2794, 1}, - {0x2798, 0x27af, 1}, - {0x27b1, 0x27be, 1}, - {0x27c0, 0x27ca, 1}, - {0x27d0, 0x27eb, 1}, - {0x27f0, 0x2b1a, 1}, - {0x2b20, 0x2b23, 1}, - {0x2c00, 0x2c2e, 1}, - {0x2c30, 0x2c5e, 1}, - {0x2c60, 0x2c6c, 1}, - {0x2c74, 0x2c77, 1}, - {0x2c80, 0x2cea, 1}, - {0x2cf9, 0x2d25, 1}, - {0x2d30, 0x2d65, 1}, - {0x2d6f, 0x2d80, 17}, - {0x2d81, 0x2d96, 1}, - {0x2da0, 0x2da6, 1}, - {0x2da8, 0x2dae, 1}, - {0x2db0, 0x2db6, 1}, - {0x2db8, 0x2dbe, 1}, - {0x2dc0, 0x2dc6, 1}, - {0x2dc8, 0x2dce, 1}, - {0x2dd0, 0x2dd6, 1}, - {0x2dd8, 0x2dde, 1}, - {0x2e00, 0x2e17, 1}, - {0x2e1c, 0x2e1d, 1}, - {0x2e80, 0x2e99, 1}, - {0x2e9b, 0x2ef3, 1}, - {0x2f00, 0x2fd5, 1}, - {0x2ff0, 0x2ffb, 1}, - {0x3000, 0x303f, 1}, - {0x3041, 0x3096, 1}, - {0x3099, 0x30ff, 1}, - {0x3105, 0x312c, 1}, - {0x3131, 0x318e, 1}, - {0x3190, 0x31b7, 1}, - {0x31c0, 0x31cf, 1}, - {0x31f0, 0x321e, 1}, - {0x3220, 0x3243, 1}, - {0x3250, 0x32fe, 1}, - {0x3300, 0x4db5, 1}, - {0x4dc0, 0x9fbb, 1}, - {0xa000, 0xa48c, 1}, - {0xa490, 0xa4c6, 1}, - {0xa700, 0xa71a, 1}, - {0xa720, 0xa721, 1}, - {0xa800, 0xa82b, 1}, - {0xa840, 0xa877, 1}, - {0xac00, 0xd7a3, 1}, - {0xd800, 0xfa2d, 1}, - {0xfa30, 0xfa6a, 1}, - {0xfa70, 0xfad9, 1}, - {0xfb00, 0xfb06, 1}, - {0xfb13, 0xfb17, 1}, - {0xfb1d, 0xfb36, 1}, - {0xfb38, 0xfb3c, 1}, - {0xfb3e, 0xfb40, 2}, - {0xfb41, 0xfb43, 2}, - {0xfb44, 0xfb46, 2}, - {0xfb47, 0xfbb1, 1}, - {0xfbd3, 0xfd3f, 1}, - {0xfd50, 0xfd8f, 1}, - {0xfd92, 0xfdc7, 1}, - {0xfdf0, 0xfdfd, 1}, - {0xfe00, 0xfe19, 1}, - {0xfe20, 0xfe23, 1}, - {0xfe30, 0xfe52, 1}, - {0xfe54, 0xfe66, 1}, - {0xfe68, 0xfe6b, 1}, - {0xfe70, 0xfe74, 1}, - {0xfe76, 0xfefc, 1}, - {0xfeff, 0xff01, 2}, - {0xff02, 0xffbe, 1}, - {0xffc2, 0xffc7, 1}, - {0xffca, 0xffcf, 1}, - {0xffd2, 0xffd7, 1}, - {0xffda, 0xffdc, 1}, - {0xffe0, 0xffe6, 1}, - {0xffe8, 0xffee, 1}, - {0xfff9, 0xfffd, 1}, - }, - R32: []unicode.Range32{ - {0x00010000, 0x0001000b, 1}, - {0x0001000d, 0x00010026, 1}, - {0x00010028, 0x0001003a, 1}, - {0x0001003c, 0x0001003d, 1}, - {0x0001003f, 0x0001004d, 1}, - {0x00010050, 0x0001005d, 1}, - {0x00010080, 0x000100fa, 1}, - {0x00010100, 0x00010102, 1}, - {0x00010107, 0x00010133, 1}, - {0x00010137, 0x0001018a, 1}, - {0x00010300, 0x0001031e, 1}, - {0x00010320, 0x00010323, 1}, - {0x00010330, 0x0001034a, 1}, - {0x00010380, 0x0001039d, 1}, - {0x0001039f, 0x000103c3, 1}, - {0x000103c8, 0x000103d5, 1}, - {0x00010400, 0x0001049d, 1}, - {0x000104a0, 0x000104a9, 1}, - {0x00010800, 0x00010805, 1}, - {0x00010808, 0x0001080a, 2}, - {0x0001080b, 0x00010835, 1}, - {0x00010837, 0x00010838, 1}, - {0x0001083c, 0x0001083f, 3}, - {0x00010900, 0x00010919, 1}, - {0x0001091f, 0x00010a00, 225}, - {0x00010a01, 0x00010a03, 1}, - {0x00010a05, 0x00010a06, 1}, - {0x00010a0c, 0x00010a13, 1}, - {0x00010a15, 0x00010a17, 1}, - {0x00010a19, 0x00010a33, 1}, - {0x00010a38, 0x00010a3a, 1}, - {0x00010a3f, 0x00010a47, 1}, - {0x00010a50, 0x00010a58, 1}, - {0x00012000, 0x0001236e, 1}, - {0x00012400, 0x00012462, 1}, - {0x00012470, 0x00012473, 1}, - {0x0001d000, 0x0001d0f5, 1}, - {0x0001d100, 0x0001d126, 1}, - {0x0001d12a, 0x0001d1dd, 1}, - {0x0001d200, 0x0001d245, 1}, - {0x0001d300, 0x0001d356, 1}, - {0x0001d360, 0x0001d371, 1}, - {0x0001d400, 0x0001d454, 1}, - {0x0001d456, 0x0001d49c, 1}, - {0x0001d49e, 0x0001d49f, 1}, - {0x0001d4a2, 0x0001d4a5, 3}, - {0x0001d4a6, 0x0001d4a9, 3}, - {0x0001d4aa, 0x0001d4ac, 1}, - {0x0001d4ae, 0x0001d4b9, 1}, - {0x0001d4bb, 0x0001d4bd, 2}, - {0x0001d4be, 0x0001d4c3, 1}, - {0x0001d4c5, 0x0001d505, 1}, - {0x0001d507, 0x0001d50a, 1}, - {0x0001d50d, 0x0001d514, 1}, - {0x0001d516, 0x0001d51c, 1}, - {0x0001d51e, 0x0001d539, 1}, - {0x0001d53b, 0x0001d53e, 1}, - {0x0001d540, 0x0001d544, 1}, - {0x0001d546, 0x0001d54a, 4}, - {0x0001d54b, 0x0001d550, 1}, - {0x0001d552, 0x0001d6a5, 1}, - {0x0001d6a8, 0x0001d7cb, 1}, - {0x0001d7ce, 0x0001d7ff, 1}, - {0x00020000, 0x0002a6d6, 1}, - {0x0002f800, 0x0002fa1d, 1}, - {0x000e0001, 0x000e0020, 31}, - {0x000e0021, 0x000e007f, 1}, - {0x000e0100, 0x000e01ef, 1}, - {0x000f0000, 0x000ffffd, 1}, - {0x00100000, 0x0010fffd, 1}, - }, - LatinOffset: 0, -} - -// size 3152 bytes (3 KiB) -var assigned5_1_0 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x0000, 0x0377, 1}, - {0x037a, 0x037e, 1}, - {0x0384, 0x038a, 1}, - {0x038c, 0x038e, 2}, - {0x038f, 0x03a1, 1}, - {0x03a3, 0x0523, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x055f, 1}, - {0x0561, 0x0587, 1}, - {0x0589, 0x058a, 1}, - {0x0591, 0x05c7, 1}, - {0x05d0, 0x05ea, 1}, - {0x05f0, 0x05f4, 1}, - {0x0600, 0x0603, 1}, - {0x0606, 0x061b, 1}, - {0x061e, 0x061f, 1}, - {0x0621, 0x065e, 1}, - {0x0660, 0x070d, 1}, - {0x070f, 0x074a, 1}, - {0x074d, 0x07b1, 1}, - {0x07c0, 0x07fa, 1}, - {0x0901, 0x0939, 1}, - {0x093c, 0x094d, 1}, - {0x0950, 0x0954, 1}, - {0x0958, 0x0972, 1}, - {0x097b, 0x097f, 1}, - {0x0981, 0x0983, 1}, - {0x0985, 0x098c, 1}, - {0x098f, 0x0990, 1}, - {0x0993, 0x09a8, 1}, - {0x09aa, 0x09b0, 1}, - {0x09b2, 0x09b6, 4}, - {0x09b7, 0x09b9, 1}, - {0x09bc, 0x09c4, 1}, - {0x09c7, 0x09c8, 1}, - {0x09cb, 0x09ce, 1}, - {0x09d7, 0x09dc, 5}, - {0x09dd, 0x09df, 2}, - {0x09e0, 0x09e3, 1}, - {0x09e6, 0x09fa, 1}, - {0x0a01, 0x0a03, 1}, - {0x0a05, 0x0a0a, 1}, - {0x0a0f, 0x0a10, 1}, - {0x0a13, 0x0a28, 1}, - {0x0a2a, 0x0a30, 1}, - {0x0a32, 0x0a33, 1}, - {0x0a35, 0x0a36, 1}, - {0x0a38, 0x0a39, 1}, - {0x0a3c, 0x0a3e, 2}, - {0x0a3f, 0x0a42, 1}, - {0x0a47, 0x0a48, 1}, - {0x0a4b, 0x0a4d, 1}, - {0x0a51, 0x0a59, 8}, - {0x0a5a, 0x0a5c, 1}, - {0x0a5e, 0x0a66, 8}, - {0x0a67, 0x0a75, 1}, - {0x0a81, 0x0a83, 1}, - {0x0a85, 0x0a8d, 1}, - {0x0a8f, 0x0a91, 1}, - {0x0a93, 0x0aa8, 1}, - {0x0aaa, 0x0ab0, 1}, - {0x0ab2, 0x0ab3, 1}, - {0x0ab5, 0x0ab9, 1}, - {0x0abc, 0x0ac5, 1}, - {0x0ac7, 0x0ac9, 1}, - {0x0acb, 0x0acd, 1}, - {0x0ad0, 0x0ae0, 16}, - {0x0ae1, 0x0ae3, 1}, - {0x0ae6, 0x0aef, 1}, - {0x0af1, 0x0b01, 16}, - {0x0b02, 0x0b03, 1}, - {0x0b05, 0x0b0c, 1}, - {0x0b0f, 0x0b10, 1}, - {0x0b13, 0x0b28, 1}, - {0x0b2a, 0x0b30, 1}, - {0x0b32, 0x0b33, 1}, - {0x0b35, 0x0b39, 1}, - {0x0b3c, 0x0b44, 1}, - {0x0b47, 0x0b48, 1}, - {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, - {0x0b5c, 0x0b5d, 1}, - {0x0b5f, 0x0b63, 1}, - {0x0b66, 0x0b71, 1}, - {0x0b82, 0x0b83, 1}, - {0x0b85, 0x0b8a, 1}, - {0x0b8e, 0x0b90, 1}, - {0x0b92, 0x0b95, 1}, - {0x0b99, 0x0b9a, 1}, - {0x0b9c, 0x0b9e, 2}, - {0x0b9f, 0x0ba3, 4}, - {0x0ba4, 0x0ba8, 4}, - {0x0ba9, 0x0baa, 1}, - {0x0bae, 0x0bb9, 1}, - {0x0bbe, 0x0bc2, 1}, - {0x0bc6, 0x0bc8, 1}, - {0x0bca, 0x0bcd, 1}, - {0x0bd0, 0x0bd7, 7}, - {0x0be6, 0x0bfa, 1}, - {0x0c01, 0x0c03, 1}, - {0x0c05, 0x0c0c, 1}, - {0x0c0e, 0x0c10, 1}, - {0x0c12, 0x0c28, 1}, - {0x0c2a, 0x0c33, 1}, - {0x0c35, 0x0c39, 1}, - {0x0c3d, 0x0c44, 1}, - {0x0c46, 0x0c48, 1}, - {0x0c4a, 0x0c4d, 1}, - {0x0c55, 0x0c56, 1}, - {0x0c58, 0x0c59, 1}, - {0x0c60, 0x0c63, 1}, - {0x0c66, 0x0c6f, 1}, - {0x0c78, 0x0c7f, 1}, - {0x0c82, 0x0c83, 1}, - {0x0c85, 0x0c8c, 1}, - {0x0c8e, 0x0c90, 1}, - {0x0c92, 0x0ca8, 1}, - {0x0caa, 0x0cb3, 1}, - {0x0cb5, 0x0cb9, 1}, - {0x0cbc, 0x0cc4, 1}, - {0x0cc6, 0x0cc8, 1}, - {0x0cca, 0x0ccd, 1}, - {0x0cd5, 0x0cd6, 1}, - {0x0cde, 0x0ce0, 2}, - {0x0ce1, 0x0ce3, 1}, - {0x0ce6, 0x0cef, 1}, - {0x0cf1, 0x0cf2, 1}, - {0x0d02, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, - {0x0d0e, 0x0d10, 1}, - {0x0d12, 0x0d28, 1}, - {0x0d2a, 0x0d39, 1}, - {0x0d3d, 0x0d44, 1}, - {0x0d46, 0x0d48, 1}, - {0x0d4a, 0x0d4d, 1}, - {0x0d57, 0x0d60, 9}, - {0x0d61, 0x0d63, 1}, - {0x0d66, 0x0d75, 1}, - {0x0d79, 0x0d7f, 1}, - {0x0d82, 0x0d83, 1}, - {0x0d85, 0x0d96, 1}, - {0x0d9a, 0x0db1, 1}, - {0x0db3, 0x0dbb, 1}, - {0x0dbd, 0x0dc0, 3}, - {0x0dc1, 0x0dc6, 1}, - {0x0dca, 0x0dcf, 5}, - {0x0dd0, 0x0dd4, 1}, - {0x0dd6, 0x0dd8, 2}, - {0x0dd9, 0x0ddf, 1}, - {0x0df2, 0x0df4, 1}, - {0x0e01, 0x0e3a, 1}, - {0x0e3f, 0x0e5b, 1}, - {0x0e81, 0x0e82, 1}, - {0x0e84, 0x0e87, 3}, - {0x0e88, 0x0e8a, 2}, - {0x0e8d, 0x0e94, 7}, - {0x0e95, 0x0e97, 1}, - {0x0e99, 0x0e9f, 1}, - {0x0ea1, 0x0ea3, 1}, - {0x0ea5, 0x0ea7, 2}, - {0x0eaa, 0x0eab, 1}, - {0x0ead, 0x0eb9, 1}, - {0x0ebb, 0x0ebd, 1}, - {0x0ec0, 0x0ec4, 1}, - {0x0ec6, 0x0ec8, 2}, - {0x0ec9, 0x0ecd, 1}, - {0x0ed0, 0x0ed9, 1}, - {0x0edc, 0x0edd, 1}, - {0x0f00, 0x0f47, 1}, - {0x0f49, 0x0f6c, 1}, - {0x0f71, 0x0f8b, 1}, - {0x0f90, 0x0f97, 1}, - {0x0f99, 0x0fbc, 1}, - {0x0fbe, 0x0fcc, 1}, - {0x0fce, 0x0fd4, 1}, - {0x1000, 0x1099, 1}, - {0x109e, 0x10c5, 1}, - {0x10d0, 0x10fc, 1}, - {0x1100, 0x1159, 1}, - {0x115f, 0x11a2, 1}, - {0x11a8, 0x11f9, 1}, - {0x1200, 0x1248, 1}, - {0x124a, 0x124d, 1}, - {0x1250, 0x1256, 1}, - {0x1258, 0x125a, 2}, - {0x125b, 0x125d, 1}, - {0x1260, 0x1288, 1}, - {0x128a, 0x128d, 1}, - {0x1290, 0x12b0, 1}, - {0x12b2, 0x12b5, 1}, - {0x12b8, 0x12be, 1}, - {0x12c0, 0x12c2, 2}, - {0x12c3, 0x12c5, 1}, - {0x12c8, 0x12d6, 1}, - {0x12d8, 0x1310, 1}, - {0x1312, 0x1315, 1}, - {0x1318, 0x135a, 1}, - {0x135f, 0x137c, 1}, - {0x1380, 0x1399, 1}, - {0x13a0, 0x13f4, 1}, - {0x1401, 0x1676, 1}, - {0x1680, 0x169c, 1}, - {0x16a0, 0x16f0, 1}, - {0x1700, 0x170c, 1}, - {0x170e, 0x1714, 1}, - {0x1720, 0x1736, 1}, - {0x1740, 0x1753, 1}, - {0x1760, 0x176c, 1}, - {0x176e, 0x1770, 1}, - {0x1772, 0x1773, 1}, - {0x1780, 0x17dd, 1}, - {0x17e0, 0x17e9, 1}, - {0x17f0, 0x17f9, 1}, - {0x1800, 0x180e, 1}, - {0x1810, 0x1819, 1}, - {0x1820, 0x1877, 1}, - {0x1880, 0x18aa, 1}, - {0x1900, 0x191c, 1}, - {0x1920, 0x192b, 1}, - {0x1930, 0x193b, 1}, - {0x1940, 0x1944, 4}, - {0x1945, 0x196d, 1}, - {0x1970, 0x1974, 1}, - {0x1980, 0x19a9, 1}, - {0x19b0, 0x19c9, 1}, - {0x19d0, 0x19d9, 1}, - {0x19de, 0x1a1b, 1}, - {0x1a1e, 0x1a1f, 1}, - {0x1b00, 0x1b4b, 1}, - {0x1b50, 0x1b7c, 1}, - {0x1b80, 0x1baa, 1}, - {0x1bae, 0x1bb9, 1}, - {0x1c00, 0x1c37, 1}, - {0x1c3b, 0x1c49, 1}, - {0x1c4d, 0x1c7f, 1}, - {0x1d00, 0x1de6, 1}, - {0x1dfe, 0x1f15, 1}, - {0x1f18, 0x1f1d, 1}, - {0x1f20, 0x1f45, 1}, - {0x1f48, 0x1f4d, 1}, - {0x1f50, 0x1f57, 1}, - {0x1f59, 0x1f5f, 2}, - {0x1f60, 0x1f7d, 1}, - {0x1f80, 0x1fb4, 1}, - {0x1fb6, 0x1fc4, 1}, - {0x1fc6, 0x1fd3, 1}, - {0x1fd6, 0x1fdb, 1}, - {0x1fdd, 0x1fef, 1}, - {0x1ff2, 0x1ff4, 1}, - {0x1ff6, 0x1ffe, 1}, - {0x2000, 0x2064, 1}, - {0x206a, 0x2071, 1}, - {0x2074, 0x208e, 1}, - {0x2090, 0x2094, 1}, - {0x20a0, 0x20b5, 1}, - {0x20d0, 0x20f0, 1}, - {0x2100, 0x214f, 1}, - {0x2153, 0x2188, 1}, - {0x2190, 0x23e7, 1}, - {0x2400, 0x2426, 1}, - {0x2440, 0x244a, 1}, - {0x2460, 0x269d, 1}, - {0x26a0, 0x26bc, 1}, - {0x26c0, 0x26c3, 1}, - {0x2701, 0x2704, 1}, - {0x2706, 0x2709, 1}, - {0x270c, 0x2727, 1}, - {0x2729, 0x274b, 1}, - {0x274d, 0x274f, 2}, - {0x2750, 0x2752, 1}, - {0x2756, 0x2758, 2}, - {0x2759, 0x275e, 1}, - {0x2761, 0x2794, 1}, - {0x2798, 0x27af, 1}, - {0x27b1, 0x27be, 1}, - {0x27c0, 0x27ca, 1}, - {0x27cc, 0x27d0, 4}, - {0x27d1, 0x2b4c, 1}, - {0x2b50, 0x2b54, 1}, - {0x2c00, 0x2c2e, 1}, - {0x2c30, 0x2c5e, 1}, - {0x2c60, 0x2c6f, 1}, - {0x2c71, 0x2c7d, 1}, - {0x2c80, 0x2cea, 1}, - {0x2cf9, 0x2d25, 1}, - {0x2d30, 0x2d65, 1}, - {0x2d6f, 0x2d80, 17}, - {0x2d81, 0x2d96, 1}, - {0x2da0, 0x2da6, 1}, - {0x2da8, 0x2dae, 1}, - {0x2db0, 0x2db6, 1}, - {0x2db8, 0x2dbe, 1}, - {0x2dc0, 0x2dc6, 1}, - {0x2dc8, 0x2dce, 1}, - {0x2dd0, 0x2dd6, 1}, - {0x2dd8, 0x2dde, 1}, - {0x2de0, 0x2e30, 1}, - {0x2e80, 0x2e99, 1}, - {0x2e9b, 0x2ef3, 1}, - {0x2f00, 0x2fd5, 1}, - {0x2ff0, 0x2ffb, 1}, - {0x3000, 0x303f, 1}, - {0x3041, 0x3096, 1}, - {0x3099, 0x30ff, 1}, - {0x3105, 0x312d, 1}, - {0x3131, 0x318e, 1}, - {0x3190, 0x31b7, 1}, - {0x31c0, 0x31e3, 1}, - {0x31f0, 0x321e, 1}, - {0x3220, 0x3243, 1}, - {0x3250, 0x32fe, 1}, - {0x3300, 0x4db5, 1}, - {0x4dc0, 0x9fc3, 1}, - {0xa000, 0xa48c, 1}, - {0xa490, 0xa4c6, 1}, - {0xa500, 0xa62b, 1}, - {0xa640, 0xa65f, 1}, - {0xa662, 0xa673, 1}, - {0xa67c, 0xa697, 1}, - {0xa700, 0xa78c, 1}, - {0xa7fb, 0xa82b, 1}, - {0xa840, 0xa877, 1}, - {0xa880, 0xa8c4, 1}, - {0xa8ce, 0xa8d9, 1}, - {0xa900, 0xa953, 1}, - {0xa95f, 0xaa00, 161}, - {0xaa01, 0xaa36, 1}, - {0xaa40, 0xaa4d, 1}, - {0xaa50, 0xaa59, 1}, - {0xaa5c, 0xaa5f, 1}, - {0xac00, 0xd7a3, 1}, - {0xd800, 0xfa2d, 1}, - {0xfa30, 0xfa6a, 1}, - {0xfa70, 0xfad9, 1}, - {0xfb00, 0xfb06, 1}, - {0xfb13, 0xfb17, 1}, - {0xfb1d, 0xfb36, 1}, - {0xfb38, 0xfb3c, 1}, - {0xfb3e, 0xfb40, 2}, - {0xfb41, 0xfb43, 2}, - {0xfb44, 0xfb46, 2}, - {0xfb47, 0xfbb1, 1}, - {0xfbd3, 0xfd3f, 1}, - {0xfd50, 0xfd8f, 1}, - {0xfd92, 0xfdc7, 1}, - {0xfdf0, 0xfdfd, 1}, - {0xfe00, 0xfe19, 1}, - {0xfe20, 0xfe26, 1}, - {0xfe30, 0xfe52, 1}, - {0xfe54, 0xfe66, 1}, - {0xfe68, 0xfe6b, 1}, - {0xfe70, 0xfe74, 1}, - {0xfe76, 0xfefc, 1}, - {0xfeff, 0xff01, 2}, - {0xff02, 0xffbe, 1}, - {0xffc2, 0xffc7, 1}, - {0xffca, 0xffcf, 1}, - {0xffd2, 0xffd7, 1}, - {0xffda, 0xffdc, 1}, - {0xffe0, 0xffe6, 1}, - {0xffe8, 0xffee, 1}, - {0xfff9, 0xfffd, 1}, - }, - R32: []unicode.Range32{ - {0x00010000, 0x0001000b, 1}, - {0x0001000d, 0x00010026, 1}, - {0x00010028, 0x0001003a, 1}, - {0x0001003c, 0x0001003d, 1}, - {0x0001003f, 0x0001004d, 1}, - {0x00010050, 0x0001005d, 1}, - {0x00010080, 0x000100fa, 1}, - {0x00010100, 0x00010102, 1}, - {0x00010107, 0x00010133, 1}, - {0x00010137, 0x0001018a, 1}, - {0x00010190, 0x0001019b, 1}, - {0x000101d0, 0x000101fd, 1}, - {0x00010280, 0x0001029c, 1}, - {0x000102a0, 0x000102d0, 1}, - {0x00010300, 0x0001031e, 1}, - {0x00010320, 0x00010323, 1}, - {0x00010330, 0x0001034a, 1}, - {0x00010380, 0x0001039d, 1}, - {0x0001039f, 0x000103c3, 1}, - {0x000103c8, 0x000103d5, 1}, - {0x00010400, 0x0001049d, 1}, - {0x000104a0, 0x000104a9, 1}, - {0x00010800, 0x00010805, 1}, - {0x00010808, 0x0001080a, 2}, - {0x0001080b, 0x00010835, 1}, - {0x00010837, 0x00010838, 1}, - {0x0001083c, 0x0001083f, 3}, - {0x00010900, 0x00010919, 1}, - {0x0001091f, 0x00010939, 1}, - {0x0001093f, 0x00010a00, 193}, - {0x00010a01, 0x00010a03, 1}, - {0x00010a05, 0x00010a06, 1}, - {0x00010a0c, 0x00010a13, 1}, - {0x00010a15, 0x00010a17, 1}, - {0x00010a19, 0x00010a33, 1}, - {0x00010a38, 0x00010a3a, 1}, - {0x00010a3f, 0x00010a47, 1}, - {0x00010a50, 0x00010a58, 1}, - {0x00012000, 0x0001236e, 1}, - {0x00012400, 0x00012462, 1}, - {0x00012470, 0x00012473, 1}, - {0x0001d000, 0x0001d0f5, 1}, - {0x0001d100, 0x0001d126, 1}, - {0x0001d129, 0x0001d1dd, 1}, - {0x0001d200, 0x0001d245, 1}, - {0x0001d300, 0x0001d356, 1}, - {0x0001d360, 0x0001d371, 1}, - {0x0001d400, 0x0001d454, 1}, - {0x0001d456, 0x0001d49c, 1}, - {0x0001d49e, 0x0001d49f, 1}, - {0x0001d4a2, 0x0001d4a5, 3}, - {0x0001d4a6, 0x0001d4a9, 3}, - {0x0001d4aa, 0x0001d4ac, 1}, - {0x0001d4ae, 0x0001d4b9, 1}, - {0x0001d4bb, 0x0001d4bd, 2}, - {0x0001d4be, 0x0001d4c3, 1}, - {0x0001d4c5, 0x0001d505, 1}, - {0x0001d507, 0x0001d50a, 1}, - {0x0001d50d, 0x0001d514, 1}, - {0x0001d516, 0x0001d51c, 1}, - {0x0001d51e, 0x0001d539, 1}, - {0x0001d53b, 0x0001d53e, 1}, - {0x0001d540, 0x0001d544, 1}, - {0x0001d546, 0x0001d54a, 4}, - {0x0001d54b, 0x0001d550, 1}, - {0x0001d552, 0x0001d6a5, 1}, - {0x0001d6a8, 0x0001d7cb, 1}, - {0x0001d7ce, 0x0001d7ff, 1}, - {0x0001f000, 0x0001f02b, 1}, - {0x0001f030, 0x0001f093, 1}, - {0x00020000, 0x0002a6d6, 1}, - {0x0002f800, 0x0002fa1d, 1}, - {0x000e0001, 0x000e0020, 31}, - {0x000e0021, 0x000e007f, 1}, - {0x000e0100, 0x000e01ef, 1}, - {0x000f0000, 0x000ffffd, 1}, - {0x00100000, 0x0010fffd, 1}, - }, - LatinOffset: 0, -} - -// size 3518 bytes (3 KiB) -var assigned5_2_0 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x0000, 0x0377, 1}, - {0x037a, 0x037e, 1}, - {0x0384, 0x038a, 1}, - {0x038c, 0x038e, 2}, - {0x038f, 0x03a1, 1}, - {0x03a3, 0x0525, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x055f, 1}, - {0x0561, 0x0587, 1}, - {0x0589, 0x058a, 1}, - {0x0591, 0x05c7, 1}, - {0x05d0, 0x05ea, 1}, - {0x05f0, 0x05f4, 1}, - {0x0600, 0x0603, 1}, - {0x0606, 0x061b, 1}, - {0x061e, 0x061f, 1}, - {0x0621, 0x065e, 1}, - {0x0660, 0x070d, 1}, - {0x070f, 0x074a, 1}, - {0x074d, 0x07b1, 1}, - {0x07c0, 0x07fa, 1}, - {0x0800, 0x082d, 1}, - {0x0830, 0x083e, 1}, - {0x0900, 0x0939, 1}, - {0x093c, 0x094e, 1}, - {0x0950, 0x0955, 1}, - {0x0958, 0x0972, 1}, - {0x0979, 0x097f, 1}, - {0x0981, 0x0983, 1}, - {0x0985, 0x098c, 1}, - {0x098f, 0x0990, 1}, - {0x0993, 0x09a8, 1}, - {0x09aa, 0x09b0, 1}, - {0x09b2, 0x09b6, 4}, - {0x09b7, 0x09b9, 1}, - {0x09bc, 0x09c4, 1}, - {0x09c7, 0x09c8, 1}, - {0x09cb, 0x09ce, 1}, - {0x09d7, 0x09dc, 5}, - {0x09dd, 0x09df, 2}, - {0x09e0, 0x09e3, 1}, - {0x09e6, 0x09fb, 1}, - {0x0a01, 0x0a03, 1}, - {0x0a05, 0x0a0a, 1}, - {0x0a0f, 0x0a10, 1}, - {0x0a13, 0x0a28, 1}, - {0x0a2a, 0x0a30, 1}, - {0x0a32, 0x0a33, 1}, - {0x0a35, 0x0a36, 1}, - {0x0a38, 0x0a39, 1}, - {0x0a3c, 0x0a3e, 2}, - {0x0a3f, 0x0a42, 1}, - {0x0a47, 0x0a48, 1}, - {0x0a4b, 0x0a4d, 1}, - {0x0a51, 0x0a59, 8}, - {0x0a5a, 0x0a5c, 1}, - {0x0a5e, 0x0a66, 8}, - {0x0a67, 0x0a75, 1}, - {0x0a81, 0x0a83, 1}, - {0x0a85, 0x0a8d, 1}, - {0x0a8f, 0x0a91, 1}, - {0x0a93, 0x0aa8, 1}, - {0x0aaa, 0x0ab0, 1}, - {0x0ab2, 0x0ab3, 1}, - {0x0ab5, 0x0ab9, 1}, - {0x0abc, 0x0ac5, 1}, - {0x0ac7, 0x0ac9, 1}, - {0x0acb, 0x0acd, 1}, - {0x0ad0, 0x0ae0, 16}, - {0x0ae1, 0x0ae3, 1}, - {0x0ae6, 0x0aef, 1}, - {0x0af1, 0x0b01, 16}, - {0x0b02, 0x0b03, 1}, - {0x0b05, 0x0b0c, 1}, - {0x0b0f, 0x0b10, 1}, - {0x0b13, 0x0b28, 1}, - {0x0b2a, 0x0b30, 1}, - {0x0b32, 0x0b33, 1}, - {0x0b35, 0x0b39, 1}, - {0x0b3c, 0x0b44, 1}, - {0x0b47, 0x0b48, 1}, - {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, - {0x0b5c, 0x0b5d, 1}, - {0x0b5f, 0x0b63, 1}, - {0x0b66, 0x0b71, 1}, - {0x0b82, 0x0b83, 1}, - {0x0b85, 0x0b8a, 1}, - {0x0b8e, 0x0b90, 1}, - {0x0b92, 0x0b95, 1}, - {0x0b99, 0x0b9a, 1}, - {0x0b9c, 0x0b9e, 2}, - {0x0b9f, 0x0ba3, 4}, - {0x0ba4, 0x0ba8, 4}, - {0x0ba9, 0x0baa, 1}, - {0x0bae, 0x0bb9, 1}, - {0x0bbe, 0x0bc2, 1}, - {0x0bc6, 0x0bc8, 1}, - {0x0bca, 0x0bcd, 1}, - {0x0bd0, 0x0bd7, 7}, - {0x0be6, 0x0bfa, 1}, - {0x0c01, 0x0c03, 1}, - {0x0c05, 0x0c0c, 1}, - {0x0c0e, 0x0c10, 1}, - {0x0c12, 0x0c28, 1}, - {0x0c2a, 0x0c33, 1}, - {0x0c35, 0x0c39, 1}, - {0x0c3d, 0x0c44, 1}, - {0x0c46, 0x0c48, 1}, - {0x0c4a, 0x0c4d, 1}, - {0x0c55, 0x0c56, 1}, - {0x0c58, 0x0c59, 1}, - {0x0c60, 0x0c63, 1}, - {0x0c66, 0x0c6f, 1}, - {0x0c78, 0x0c7f, 1}, - {0x0c82, 0x0c83, 1}, - {0x0c85, 0x0c8c, 1}, - {0x0c8e, 0x0c90, 1}, - {0x0c92, 0x0ca8, 1}, - {0x0caa, 0x0cb3, 1}, - {0x0cb5, 0x0cb9, 1}, - {0x0cbc, 0x0cc4, 1}, - {0x0cc6, 0x0cc8, 1}, - {0x0cca, 0x0ccd, 1}, - {0x0cd5, 0x0cd6, 1}, - {0x0cde, 0x0ce0, 2}, - {0x0ce1, 0x0ce3, 1}, - {0x0ce6, 0x0cef, 1}, - {0x0cf1, 0x0cf2, 1}, - {0x0d02, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, - {0x0d0e, 0x0d10, 1}, - {0x0d12, 0x0d28, 1}, - {0x0d2a, 0x0d39, 1}, - {0x0d3d, 0x0d44, 1}, - {0x0d46, 0x0d48, 1}, - {0x0d4a, 0x0d4d, 1}, - {0x0d57, 0x0d60, 9}, - {0x0d61, 0x0d63, 1}, - {0x0d66, 0x0d75, 1}, - {0x0d79, 0x0d7f, 1}, - {0x0d82, 0x0d83, 1}, - {0x0d85, 0x0d96, 1}, - {0x0d9a, 0x0db1, 1}, - {0x0db3, 0x0dbb, 1}, - {0x0dbd, 0x0dc0, 3}, - {0x0dc1, 0x0dc6, 1}, - {0x0dca, 0x0dcf, 5}, - {0x0dd0, 0x0dd4, 1}, - {0x0dd6, 0x0dd8, 2}, - {0x0dd9, 0x0ddf, 1}, - {0x0df2, 0x0df4, 1}, - {0x0e01, 0x0e3a, 1}, - {0x0e3f, 0x0e5b, 1}, - {0x0e81, 0x0e82, 1}, - {0x0e84, 0x0e87, 3}, - {0x0e88, 0x0e8a, 2}, - {0x0e8d, 0x0e94, 7}, - {0x0e95, 0x0e97, 1}, - {0x0e99, 0x0e9f, 1}, - {0x0ea1, 0x0ea3, 1}, - {0x0ea5, 0x0ea7, 2}, - {0x0eaa, 0x0eab, 1}, - {0x0ead, 0x0eb9, 1}, - {0x0ebb, 0x0ebd, 1}, - {0x0ec0, 0x0ec4, 1}, - {0x0ec6, 0x0ec8, 2}, - {0x0ec9, 0x0ecd, 1}, - {0x0ed0, 0x0ed9, 1}, - {0x0edc, 0x0edd, 1}, - {0x0f00, 0x0f47, 1}, - {0x0f49, 0x0f6c, 1}, - {0x0f71, 0x0f8b, 1}, - {0x0f90, 0x0f97, 1}, - {0x0f99, 0x0fbc, 1}, - {0x0fbe, 0x0fcc, 1}, - {0x0fce, 0x0fd8, 1}, - {0x1000, 0x10c5, 1}, - {0x10d0, 0x10fc, 1}, - {0x1100, 0x1248, 1}, - {0x124a, 0x124d, 1}, - {0x1250, 0x1256, 1}, - {0x1258, 0x125a, 2}, - {0x125b, 0x125d, 1}, - {0x1260, 0x1288, 1}, - {0x128a, 0x128d, 1}, - {0x1290, 0x12b0, 1}, - {0x12b2, 0x12b5, 1}, - {0x12b8, 0x12be, 1}, - {0x12c0, 0x12c2, 2}, - {0x12c3, 0x12c5, 1}, - {0x12c8, 0x12d6, 1}, - {0x12d8, 0x1310, 1}, - {0x1312, 0x1315, 1}, - {0x1318, 0x135a, 1}, - {0x135f, 0x137c, 1}, - {0x1380, 0x1399, 1}, - {0x13a0, 0x13f4, 1}, - {0x1400, 0x169c, 1}, - {0x16a0, 0x16f0, 1}, - {0x1700, 0x170c, 1}, - {0x170e, 0x1714, 1}, - {0x1720, 0x1736, 1}, - {0x1740, 0x1753, 1}, - {0x1760, 0x176c, 1}, - {0x176e, 0x1770, 1}, - {0x1772, 0x1773, 1}, - {0x1780, 0x17dd, 1}, - {0x17e0, 0x17e9, 1}, - {0x17f0, 0x17f9, 1}, - {0x1800, 0x180e, 1}, - {0x1810, 0x1819, 1}, - {0x1820, 0x1877, 1}, - {0x1880, 0x18aa, 1}, - {0x18b0, 0x18f5, 1}, - {0x1900, 0x191c, 1}, - {0x1920, 0x192b, 1}, - {0x1930, 0x193b, 1}, - {0x1940, 0x1944, 4}, - {0x1945, 0x196d, 1}, - {0x1970, 0x1974, 1}, - {0x1980, 0x19ab, 1}, - {0x19b0, 0x19c9, 1}, - {0x19d0, 0x19da, 1}, - {0x19de, 0x1a1b, 1}, - {0x1a1e, 0x1a5e, 1}, - {0x1a60, 0x1a7c, 1}, - {0x1a7f, 0x1a89, 1}, - {0x1a90, 0x1a99, 1}, - {0x1aa0, 0x1aad, 1}, - {0x1b00, 0x1b4b, 1}, - {0x1b50, 0x1b7c, 1}, - {0x1b80, 0x1baa, 1}, - {0x1bae, 0x1bb9, 1}, - {0x1c00, 0x1c37, 1}, - {0x1c3b, 0x1c49, 1}, - {0x1c4d, 0x1c7f, 1}, - {0x1cd0, 0x1cf2, 1}, - {0x1d00, 0x1de6, 1}, - {0x1dfd, 0x1f15, 1}, - {0x1f18, 0x1f1d, 1}, - {0x1f20, 0x1f45, 1}, - {0x1f48, 0x1f4d, 1}, - {0x1f50, 0x1f57, 1}, - {0x1f59, 0x1f5f, 2}, - {0x1f60, 0x1f7d, 1}, - {0x1f80, 0x1fb4, 1}, - {0x1fb6, 0x1fc4, 1}, - {0x1fc6, 0x1fd3, 1}, - {0x1fd6, 0x1fdb, 1}, - {0x1fdd, 0x1fef, 1}, - {0x1ff2, 0x1ff4, 1}, - {0x1ff6, 0x1ffe, 1}, - {0x2000, 0x2064, 1}, - {0x206a, 0x2071, 1}, - {0x2074, 0x208e, 1}, - {0x2090, 0x2094, 1}, - {0x20a0, 0x20b8, 1}, - {0x20d0, 0x20f0, 1}, - {0x2100, 0x2189, 1}, - {0x2190, 0x23e8, 1}, - {0x2400, 0x2426, 1}, - {0x2440, 0x244a, 1}, - {0x2460, 0x26cd, 1}, - {0x26cf, 0x26e1, 1}, - {0x26e3, 0x26e8, 5}, - {0x26e9, 0x26ff, 1}, - {0x2701, 0x2704, 1}, - {0x2706, 0x2709, 1}, - {0x270c, 0x2727, 1}, - {0x2729, 0x274b, 1}, - {0x274d, 0x274f, 2}, - {0x2750, 0x2752, 1}, - {0x2756, 0x275e, 1}, - {0x2761, 0x2794, 1}, - {0x2798, 0x27af, 1}, - {0x27b1, 0x27be, 1}, - {0x27c0, 0x27ca, 1}, - {0x27cc, 0x27d0, 4}, - {0x27d1, 0x2b4c, 1}, - {0x2b50, 0x2b59, 1}, - {0x2c00, 0x2c2e, 1}, - {0x2c30, 0x2c5e, 1}, - {0x2c60, 0x2cf1, 1}, - {0x2cf9, 0x2d25, 1}, - {0x2d30, 0x2d65, 1}, - {0x2d6f, 0x2d80, 17}, - {0x2d81, 0x2d96, 1}, - {0x2da0, 0x2da6, 1}, - {0x2da8, 0x2dae, 1}, - {0x2db0, 0x2db6, 1}, - {0x2db8, 0x2dbe, 1}, - {0x2dc0, 0x2dc6, 1}, - {0x2dc8, 0x2dce, 1}, - {0x2dd0, 0x2dd6, 1}, - {0x2dd8, 0x2dde, 1}, - {0x2de0, 0x2e31, 1}, - {0x2e80, 0x2e99, 1}, - {0x2e9b, 0x2ef3, 1}, - {0x2f00, 0x2fd5, 1}, - {0x2ff0, 0x2ffb, 1}, - {0x3000, 0x303f, 1}, - {0x3041, 0x3096, 1}, - {0x3099, 0x30ff, 1}, - {0x3105, 0x312d, 1}, - {0x3131, 0x318e, 1}, - {0x3190, 0x31b7, 1}, - {0x31c0, 0x31e3, 1}, - {0x31f0, 0x321e, 1}, - {0x3220, 0x32fe, 1}, - {0x3300, 0x4db5, 1}, - {0x4dc0, 0x9fcb, 1}, - {0xa000, 0xa48c, 1}, - {0xa490, 0xa4c6, 1}, - {0xa4d0, 0xa62b, 1}, - {0xa640, 0xa65f, 1}, - {0xa662, 0xa673, 1}, - {0xa67c, 0xa697, 1}, - {0xa6a0, 0xa6f7, 1}, - {0xa700, 0xa78c, 1}, - {0xa7fb, 0xa82b, 1}, - {0xa830, 0xa839, 1}, - {0xa840, 0xa877, 1}, - {0xa880, 0xa8c4, 1}, - {0xa8ce, 0xa8d9, 1}, - {0xa8e0, 0xa8fb, 1}, - {0xa900, 0xa953, 1}, - {0xa95f, 0xa97c, 1}, - {0xa980, 0xa9cd, 1}, - {0xa9cf, 0xa9d9, 1}, - {0xa9de, 0xa9df, 1}, - {0xaa00, 0xaa36, 1}, - {0xaa40, 0xaa4d, 1}, - {0xaa50, 0xaa59, 1}, - {0xaa5c, 0xaa7b, 1}, - {0xaa80, 0xaac2, 1}, - {0xaadb, 0xaadf, 1}, - {0xabc0, 0xabed, 1}, - {0xabf0, 0xabf9, 1}, - {0xac00, 0xd7a3, 1}, - {0xd7b0, 0xd7c6, 1}, - {0xd7cb, 0xd7fb, 1}, - {0xd800, 0xfa2d, 1}, - {0xfa30, 0xfa6d, 1}, - {0xfa70, 0xfad9, 1}, - {0xfb00, 0xfb06, 1}, - {0xfb13, 0xfb17, 1}, - {0xfb1d, 0xfb36, 1}, - {0xfb38, 0xfb3c, 1}, - {0xfb3e, 0xfb40, 2}, - {0xfb41, 0xfb43, 2}, - {0xfb44, 0xfb46, 2}, - {0xfb47, 0xfbb1, 1}, - {0xfbd3, 0xfd3f, 1}, - {0xfd50, 0xfd8f, 1}, - {0xfd92, 0xfdc7, 1}, - {0xfdf0, 0xfdfd, 1}, - {0xfe00, 0xfe19, 1}, - {0xfe20, 0xfe26, 1}, - {0xfe30, 0xfe52, 1}, - {0xfe54, 0xfe66, 1}, - {0xfe68, 0xfe6b, 1}, - {0xfe70, 0xfe74, 1}, - {0xfe76, 0xfefc, 1}, - {0xfeff, 0xff01, 2}, - {0xff02, 0xffbe, 1}, - {0xffc2, 0xffc7, 1}, - {0xffca, 0xffcf, 1}, - {0xffd2, 0xffd7, 1}, - {0xffda, 0xffdc, 1}, - {0xffe0, 0xffe6, 1}, - {0xffe8, 0xffee, 1}, - {0xfff9, 0xfffd, 1}, - }, - R32: []unicode.Range32{ - {0x00010000, 0x0001000b, 1}, - {0x0001000d, 0x00010026, 1}, - {0x00010028, 0x0001003a, 1}, - {0x0001003c, 0x0001003d, 1}, - {0x0001003f, 0x0001004d, 1}, - {0x00010050, 0x0001005d, 1}, - {0x00010080, 0x000100fa, 1}, - {0x00010100, 0x00010102, 1}, - {0x00010107, 0x00010133, 1}, - {0x00010137, 0x0001018a, 1}, - {0x00010190, 0x0001019b, 1}, - {0x000101d0, 0x000101fd, 1}, - {0x00010280, 0x0001029c, 1}, - {0x000102a0, 0x000102d0, 1}, - {0x00010300, 0x0001031e, 1}, - {0x00010320, 0x00010323, 1}, - {0x00010330, 0x0001034a, 1}, - {0x00010380, 0x0001039d, 1}, - {0x0001039f, 0x000103c3, 1}, - {0x000103c8, 0x000103d5, 1}, - {0x00010400, 0x0001049d, 1}, - {0x000104a0, 0x000104a9, 1}, - {0x00010800, 0x00010805, 1}, - {0x00010808, 0x0001080a, 2}, - {0x0001080b, 0x00010835, 1}, - {0x00010837, 0x00010838, 1}, - {0x0001083c, 0x0001083f, 3}, - {0x00010840, 0x00010855, 1}, - {0x00010857, 0x0001085f, 1}, - {0x00010900, 0x0001091b, 1}, - {0x0001091f, 0x00010939, 1}, - {0x0001093f, 0x00010a00, 193}, - {0x00010a01, 0x00010a03, 1}, - {0x00010a05, 0x00010a06, 1}, - {0x00010a0c, 0x00010a13, 1}, - {0x00010a15, 0x00010a17, 1}, - {0x00010a19, 0x00010a33, 1}, - {0x00010a38, 0x00010a3a, 1}, - {0x00010a3f, 0x00010a47, 1}, - {0x00010a50, 0x00010a58, 1}, - {0x00010a60, 0x00010a7f, 1}, - {0x00010b00, 0x00010b35, 1}, - {0x00010b39, 0x00010b55, 1}, - {0x00010b58, 0x00010b72, 1}, - {0x00010b78, 0x00010b7f, 1}, - {0x00010c00, 0x00010c48, 1}, - {0x00010e60, 0x00010e7e, 1}, - {0x00011080, 0x000110c1, 1}, - {0x00012000, 0x0001236e, 1}, - {0x00012400, 0x00012462, 1}, - {0x00012470, 0x00012473, 1}, - {0x00013000, 0x0001342e, 1}, - {0x0001d000, 0x0001d0f5, 1}, - {0x0001d100, 0x0001d126, 1}, - {0x0001d129, 0x0001d1dd, 1}, - {0x0001d200, 0x0001d245, 1}, - {0x0001d300, 0x0001d356, 1}, - {0x0001d360, 0x0001d371, 1}, - {0x0001d400, 0x0001d454, 1}, - {0x0001d456, 0x0001d49c, 1}, - {0x0001d49e, 0x0001d49f, 1}, - {0x0001d4a2, 0x0001d4a5, 3}, - {0x0001d4a6, 0x0001d4a9, 3}, - {0x0001d4aa, 0x0001d4ac, 1}, - {0x0001d4ae, 0x0001d4b9, 1}, - {0x0001d4bb, 0x0001d4bd, 2}, - {0x0001d4be, 0x0001d4c3, 1}, - {0x0001d4c5, 0x0001d505, 1}, - {0x0001d507, 0x0001d50a, 1}, - {0x0001d50d, 0x0001d514, 1}, - {0x0001d516, 0x0001d51c, 1}, - {0x0001d51e, 0x0001d539, 1}, - {0x0001d53b, 0x0001d53e, 1}, - {0x0001d540, 0x0001d544, 1}, - {0x0001d546, 0x0001d54a, 4}, - {0x0001d54b, 0x0001d550, 1}, - {0x0001d552, 0x0001d6a5, 1}, - {0x0001d6a8, 0x0001d7cb, 1}, - {0x0001d7ce, 0x0001d7ff, 1}, - {0x0001f000, 0x0001f02b, 1}, - {0x0001f030, 0x0001f093, 1}, - {0x0001f100, 0x0001f10a, 1}, - {0x0001f110, 0x0001f12e, 1}, - {0x0001f131, 0x0001f13d, 12}, - {0x0001f13f, 0x0001f142, 3}, - {0x0001f146, 0x0001f14a, 4}, - {0x0001f14b, 0x0001f14e, 1}, - {0x0001f157, 0x0001f15f, 8}, - {0x0001f179, 0x0001f17b, 2}, - {0x0001f17c, 0x0001f17f, 3}, - {0x0001f18a, 0x0001f18d, 1}, - {0x0001f190, 0x0001f200, 112}, - {0x0001f210, 0x0001f231, 1}, - {0x0001f240, 0x0001f248, 1}, - {0x00020000, 0x0002a6d6, 1}, - {0x0002a700, 0x0002b734, 1}, - {0x0002f800, 0x0002fa1d, 1}, - {0x000e0001, 0x000e0020, 31}, - {0x000e0021, 0x000e007f, 1}, - {0x000e0100, 0x000e01ef, 1}, - {0x000f0000, 0x000ffffd, 1}, - {0x00100000, 0x0010fffd, 1}, - }, - LatinOffset: 0, -} - -// size 3812 bytes (3 KiB) -var assigned6_0_0 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x0000, 0x0377, 1}, - {0x037a, 0x037e, 1}, - {0x0384, 0x038a, 1}, - {0x038c, 0x038e, 2}, - {0x038f, 0x03a1, 1}, - {0x03a3, 0x0527, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x055f, 1}, - {0x0561, 0x0587, 1}, - {0x0589, 0x058a, 1}, - {0x0591, 0x05c7, 1}, - {0x05d0, 0x05ea, 1}, - {0x05f0, 0x05f4, 1}, - {0x0600, 0x0603, 1}, - {0x0606, 0x061b, 1}, - {0x061e, 0x070d, 1}, - {0x070f, 0x074a, 1}, - {0x074d, 0x07b1, 1}, - {0x07c0, 0x07fa, 1}, - {0x0800, 0x082d, 1}, - {0x0830, 0x083e, 1}, - {0x0840, 0x085b, 1}, - {0x085e, 0x0900, 162}, - {0x0901, 0x0977, 1}, - {0x0979, 0x097f, 1}, - {0x0981, 0x0983, 1}, - {0x0985, 0x098c, 1}, - {0x098f, 0x0990, 1}, - {0x0993, 0x09a8, 1}, - {0x09aa, 0x09b0, 1}, - {0x09b2, 0x09b6, 4}, - {0x09b7, 0x09b9, 1}, - {0x09bc, 0x09c4, 1}, - {0x09c7, 0x09c8, 1}, - {0x09cb, 0x09ce, 1}, - {0x09d7, 0x09dc, 5}, - {0x09dd, 0x09df, 2}, - {0x09e0, 0x09e3, 1}, - {0x09e6, 0x09fb, 1}, - {0x0a01, 0x0a03, 1}, - {0x0a05, 0x0a0a, 1}, - {0x0a0f, 0x0a10, 1}, - {0x0a13, 0x0a28, 1}, - {0x0a2a, 0x0a30, 1}, - {0x0a32, 0x0a33, 1}, - {0x0a35, 0x0a36, 1}, - {0x0a38, 0x0a39, 1}, - {0x0a3c, 0x0a3e, 2}, - {0x0a3f, 0x0a42, 1}, - {0x0a47, 0x0a48, 1}, - {0x0a4b, 0x0a4d, 1}, - {0x0a51, 0x0a59, 8}, - {0x0a5a, 0x0a5c, 1}, - {0x0a5e, 0x0a66, 8}, - {0x0a67, 0x0a75, 1}, - {0x0a81, 0x0a83, 1}, - {0x0a85, 0x0a8d, 1}, - {0x0a8f, 0x0a91, 1}, - {0x0a93, 0x0aa8, 1}, - {0x0aaa, 0x0ab0, 1}, - {0x0ab2, 0x0ab3, 1}, - {0x0ab5, 0x0ab9, 1}, - {0x0abc, 0x0ac5, 1}, - {0x0ac7, 0x0ac9, 1}, - {0x0acb, 0x0acd, 1}, - {0x0ad0, 0x0ae0, 16}, - {0x0ae1, 0x0ae3, 1}, - {0x0ae6, 0x0aef, 1}, - {0x0af1, 0x0b01, 16}, - {0x0b02, 0x0b03, 1}, - {0x0b05, 0x0b0c, 1}, - {0x0b0f, 0x0b10, 1}, - {0x0b13, 0x0b28, 1}, - {0x0b2a, 0x0b30, 1}, - {0x0b32, 0x0b33, 1}, - {0x0b35, 0x0b39, 1}, - {0x0b3c, 0x0b44, 1}, - {0x0b47, 0x0b48, 1}, - {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, - {0x0b5c, 0x0b5d, 1}, - {0x0b5f, 0x0b63, 1}, - {0x0b66, 0x0b77, 1}, - {0x0b82, 0x0b83, 1}, - {0x0b85, 0x0b8a, 1}, - {0x0b8e, 0x0b90, 1}, - {0x0b92, 0x0b95, 1}, - {0x0b99, 0x0b9a, 1}, - {0x0b9c, 0x0b9e, 2}, - {0x0b9f, 0x0ba3, 4}, - {0x0ba4, 0x0ba8, 4}, - {0x0ba9, 0x0baa, 1}, - {0x0bae, 0x0bb9, 1}, - {0x0bbe, 0x0bc2, 1}, - {0x0bc6, 0x0bc8, 1}, - {0x0bca, 0x0bcd, 1}, - {0x0bd0, 0x0bd7, 7}, - {0x0be6, 0x0bfa, 1}, - {0x0c01, 0x0c03, 1}, - {0x0c05, 0x0c0c, 1}, - {0x0c0e, 0x0c10, 1}, - {0x0c12, 0x0c28, 1}, - {0x0c2a, 0x0c33, 1}, - {0x0c35, 0x0c39, 1}, - {0x0c3d, 0x0c44, 1}, - {0x0c46, 0x0c48, 1}, - {0x0c4a, 0x0c4d, 1}, - {0x0c55, 0x0c56, 1}, - {0x0c58, 0x0c59, 1}, - {0x0c60, 0x0c63, 1}, - {0x0c66, 0x0c6f, 1}, - {0x0c78, 0x0c7f, 1}, - {0x0c82, 0x0c83, 1}, - {0x0c85, 0x0c8c, 1}, - {0x0c8e, 0x0c90, 1}, - {0x0c92, 0x0ca8, 1}, - {0x0caa, 0x0cb3, 1}, - {0x0cb5, 0x0cb9, 1}, - {0x0cbc, 0x0cc4, 1}, - {0x0cc6, 0x0cc8, 1}, - {0x0cca, 0x0ccd, 1}, - {0x0cd5, 0x0cd6, 1}, - {0x0cde, 0x0ce0, 2}, - {0x0ce1, 0x0ce3, 1}, - {0x0ce6, 0x0cef, 1}, - {0x0cf1, 0x0cf2, 1}, - {0x0d02, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, - {0x0d0e, 0x0d10, 1}, - {0x0d12, 0x0d3a, 1}, - {0x0d3d, 0x0d44, 1}, - {0x0d46, 0x0d48, 1}, - {0x0d4a, 0x0d4e, 1}, - {0x0d57, 0x0d60, 9}, - {0x0d61, 0x0d63, 1}, - {0x0d66, 0x0d75, 1}, - {0x0d79, 0x0d7f, 1}, - {0x0d82, 0x0d83, 1}, - {0x0d85, 0x0d96, 1}, - {0x0d9a, 0x0db1, 1}, - {0x0db3, 0x0dbb, 1}, - {0x0dbd, 0x0dc0, 3}, - {0x0dc1, 0x0dc6, 1}, - {0x0dca, 0x0dcf, 5}, - {0x0dd0, 0x0dd4, 1}, - {0x0dd6, 0x0dd8, 2}, - {0x0dd9, 0x0ddf, 1}, - {0x0df2, 0x0df4, 1}, - {0x0e01, 0x0e3a, 1}, - {0x0e3f, 0x0e5b, 1}, - {0x0e81, 0x0e82, 1}, - {0x0e84, 0x0e87, 3}, - {0x0e88, 0x0e8a, 2}, - {0x0e8d, 0x0e94, 7}, - {0x0e95, 0x0e97, 1}, - {0x0e99, 0x0e9f, 1}, - {0x0ea1, 0x0ea3, 1}, - {0x0ea5, 0x0ea7, 2}, - {0x0eaa, 0x0eab, 1}, - {0x0ead, 0x0eb9, 1}, - {0x0ebb, 0x0ebd, 1}, - {0x0ec0, 0x0ec4, 1}, - {0x0ec6, 0x0ec8, 2}, - {0x0ec9, 0x0ecd, 1}, - {0x0ed0, 0x0ed9, 1}, - {0x0edc, 0x0edd, 1}, - {0x0f00, 0x0f47, 1}, - {0x0f49, 0x0f6c, 1}, - {0x0f71, 0x0f97, 1}, - {0x0f99, 0x0fbc, 1}, - {0x0fbe, 0x0fcc, 1}, - {0x0fce, 0x0fda, 1}, - {0x1000, 0x10c5, 1}, - {0x10d0, 0x10fc, 1}, - {0x1100, 0x1248, 1}, - {0x124a, 0x124d, 1}, - {0x1250, 0x1256, 1}, - {0x1258, 0x125a, 2}, - {0x125b, 0x125d, 1}, - {0x1260, 0x1288, 1}, - {0x128a, 0x128d, 1}, - {0x1290, 0x12b0, 1}, - {0x12b2, 0x12b5, 1}, - {0x12b8, 0x12be, 1}, - {0x12c0, 0x12c2, 2}, - {0x12c3, 0x12c5, 1}, - {0x12c8, 0x12d6, 1}, - {0x12d8, 0x1310, 1}, - {0x1312, 0x1315, 1}, - {0x1318, 0x135a, 1}, - {0x135d, 0x137c, 1}, - {0x1380, 0x1399, 1}, - {0x13a0, 0x13f4, 1}, - {0x1400, 0x169c, 1}, - {0x16a0, 0x16f0, 1}, - {0x1700, 0x170c, 1}, - {0x170e, 0x1714, 1}, - {0x1720, 0x1736, 1}, - {0x1740, 0x1753, 1}, - {0x1760, 0x176c, 1}, - {0x176e, 0x1770, 1}, - {0x1772, 0x1773, 1}, - {0x1780, 0x17dd, 1}, - {0x17e0, 0x17e9, 1}, - {0x17f0, 0x17f9, 1}, - {0x1800, 0x180e, 1}, - {0x1810, 0x1819, 1}, - {0x1820, 0x1877, 1}, - {0x1880, 0x18aa, 1}, - {0x18b0, 0x18f5, 1}, - {0x1900, 0x191c, 1}, - {0x1920, 0x192b, 1}, - {0x1930, 0x193b, 1}, - {0x1940, 0x1944, 4}, - {0x1945, 0x196d, 1}, - {0x1970, 0x1974, 1}, - {0x1980, 0x19ab, 1}, - {0x19b0, 0x19c9, 1}, - {0x19d0, 0x19da, 1}, - {0x19de, 0x1a1b, 1}, - {0x1a1e, 0x1a5e, 1}, - {0x1a60, 0x1a7c, 1}, - {0x1a7f, 0x1a89, 1}, - {0x1a90, 0x1a99, 1}, - {0x1aa0, 0x1aad, 1}, - {0x1b00, 0x1b4b, 1}, - {0x1b50, 0x1b7c, 1}, - {0x1b80, 0x1baa, 1}, - {0x1bae, 0x1bb9, 1}, - {0x1bc0, 0x1bf3, 1}, - {0x1bfc, 0x1c37, 1}, - {0x1c3b, 0x1c49, 1}, - {0x1c4d, 0x1c7f, 1}, - {0x1cd0, 0x1cf2, 1}, - {0x1d00, 0x1de6, 1}, - {0x1dfc, 0x1f15, 1}, - {0x1f18, 0x1f1d, 1}, - {0x1f20, 0x1f45, 1}, - {0x1f48, 0x1f4d, 1}, - {0x1f50, 0x1f57, 1}, - {0x1f59, 0x1f5f, 2}, - {0x1f60, 0x1f7d, 1}, - {0x1f80, 0x1fb4, 1}, - {0x1fb6, 0x1fc4, 1}, - {0x1fc6, 0x1fd3, 1}, - {0x1fd6, 0x1fdb, 1}, - {0x1fdd, 0x1fef, 1}, - {0x1ff2, 0x1ff4, 1}, - {0x1ff6, 0x1ffe, 1}, - {0x2000, 0x2064, 1}, - {0x206a, 0x2071, 1}, - {0x2074, 0x208e, 1}, - {0x2090, 0x209c, 1}, - {0x20a0, 0x20b9, 1}, - {0x20d0, 0x20f0, 1}, - {0x2100, 0x2189, 1}, - {0x2190, 0x23f3, 1}, - {0x2400, 0x2426, 1}, - {0x2440, 0x244a, 1}, - {0x2460, 0x26ff, 1}, - {0x2701, 0x27ca, 1}, - {0x27cc, 0x27ce, 2}, - {0x27cf, 0x2b4c, 1}, - {0x2b50, 0x2b59, 1}, - {0x2c00, 0x2c2e, 1}, - {0x2c30, 0x2c5e, 1}, - {0x2c60, 0x2cf1, 1}, - {0x2cf9, 0x2d25, 1}, - {0x2d30, 0x2d65, 1}, - {0x2d6f, 0x2d70, 1}, - {0x2d7f, 0x2d96, 1}, - {0x2da0, 0x2da6, 1}, - {0x2da8, 0x2dae, 1}, - {0x2db0, 0x2db6, 1}, - {0x2db8, 0x2dbe, 1}, - {0x2dc0, 0x2dc6, 1}, - {0x2dc8, 0x2dce, 1}, - {0x2dd0, 0x2dd6, 1}, - {0x2dd8, 0x2dde, 1}, - {0x2de0, 0x2e31, 1}, - {0x2e80, 0x2e99, 1}, - {0x2e9b, 0x2ef3, 1}, - {0x2f00, 0x2fd5, 1}, - {0x2ff0, 0x2ffb, 1}, - {0x3000, 0x303f, 1}, - {0x3041, 0x3096, 1}, - {0x3099, 0x30ff, 1}, - {0x3105, 0x312d, 1}, - {0x3131, 0x318e, 1}, - {0x3190, 0x31ba, 1}, - {0x31c0, 0x31e3, 1}, - {0x31f0, 0x321e, 1}, - {0x3220, 0x32fe, 1}, - {0x3300, 0x4db5, 1}, - {0x4dc0, 0x9fcb, 1}, - {0xa000, 0xa48c, 1}, - {0xa490, 0xa4c6, 1}, - {0xa4d0, 0xa62b, 1}, - {0xa640, 0xa673, 1}, - {0xa67c, 0xa697, 1}, - {0xa6a0, 0xa6f7, 1}, - {0xa700, 0xa78e, 1}, - {0xa790, 0xa791, 1}, - {0xa7a0, 0xa7a9, 1}, - {0xa7fa, 0xa82b, 1}, - {0xa830, 0xa839, 1}, - {0xa840, 0xa877, 1}, - {0xa880, 0xa8c4, 1}, - {0xa8ce, 0xa8d9, 1}, - {0xa8e0, 0xa8fb, 1}, - {0xa900, 0xa953, 1}, - {0xa95f, 0xa97c, 1}, - {0xa980, 0xa9cd, 1}, - {0xa9cf, 0xa9d9, 1}, - {0xa9de, 0xa9df, 1}, - {0xaa00, 0xaa36, 1}, - {0xaa40, 0xaa4d, 1}, - {0xaa50, 0xaa59, 1}, - {0xaa5c, 0xaa7b, 1}, - {0xaa80, 0xaac2, 1}, - {0xaadb, 0xaadf, 1}, - {0xab01, 0xab06, 1}, - {0xab09, 0xab0e, 1}, - {0xab11, 0xab16, 1}, - {0xab20, 0xab26, 1}, - {0xab28, 0xab2e, 1}, - {0xabc0, 0xabed, 1}, - {0xabf0, 0xabf9, 1}, - {0xac00, 0xd7a3, 1}, - {0xd7b0, 0xd7c6, 1}, - {0xd7cb, 0xd7fb, 1}, - {0xd800, 0xfa2d, 1}, - {0xfa30, 0xfa6d, 1}, - {0xfa70, 0xfad9, 1}, - {0xfb00, 0xfb06, 1}, - {0xfb13, 0xfb17, 1}, - {0xfb1d, 0xfb36, 1}, - {0xfb38, 0xfb3c, 1}, - {0xfb3e, 0xfb40, 2}, - {0xfb41, 0xfb43, 2}, - {0xfb44, 0xfb46, 2}, - {0xfb47, 0xfbc1, 1}, - {0xfbd3, 0xfd3f, 1}, - {0xfd50, 0xfd8f, 1}, - {0xfd92, 0xfdc7, 1}, - {0xfdf0, 0xfdfd, 1}, - {0xfe00, 0xfe19, 1}, - {0xfe20, 0xfe26, 1}, - {0xfe30, 0xfe52, 1}, - {0xfe54, 0xfe66, 1}, - {0xfe68, 0xfe6b, 1}, - {0xfe70, 0xfe74, 1}, - {0xfe76, 0xfefc, 1}, - {0xfeff, 0xff01, 2}, - {0xff02, 0xffbe, 1}, - {0xffc2, 0xffc7, 1}, - {0xffca, 0xffcf, 1}, - {0xffd2, 0xffd7, 1}, - {0xffda, 0xffdc, 1}, - {0xffe0, 0xffe6, 1}, - {0xffe8, 0xffee, 1}, - {0xfff9, 0xfffd, 1}, - }, - R32: []unicode.Range32{ - {0x00010000, 0x0001000b, 1}, - {0x0001000d, 0x00010026, 1}, - {0x00010028, 0x0001003a, 1}, - {0x0001003c, 0x0001003d, 1}, - {0x0001003f, 0x0001004d, 1}, - {0x00010050, 0x0001005d, 1}, - {0x00010080, 0x000100fa, 1}, - {0x00010100, 0x00010102, 1}, - {0x00010107, 0x00010133, 1}, - {0x00010137, 0x0001018a, 1}, - {0x00010190, 0x0001019b, 1}, - {0x000101d0, 0x000101fd, 1}, - {0x00010280, 0x0001029c, 1}, - {0x000102a0, 0x000102d0, 1}, - {0x00010300, 0x0001031e, 1}, - {0x00010320, 0x00010323, 1}, - {0x00010330, 0x0001034a, 1}, - {0x00010380, 0x0001039d, 1}, - {0x0001039f, 0x000103c3, 1}, - {0x000103c8, 0x000103d5, 1}, - {0x00010400, 0x0001049d, 1}, - {0x000104a0, 0x000104a9, 1}, - {0x00010800, 0x00010805, 1}, - {0x00010808, 0x0001080a, 2}, - {0x0001080b, 0x00010835, 1}, - {0x00010837, 0x00010838, 1}, - {0x0001083c, 0x0001083f, 3}, - {0x00010840, 0x00010855, 1}, - {0x00010857, 0x0001085f, 1}, - {0x00010900, 0x0001091b, 1}, - {0x0001091f, 0x00010939, 1}, - {0x0001093f, 0x00010a00, 193}, - {0x00010a01, 0x00010a03, 1}, - {0x00010a05, 0x00010a06, 1}, - {0x00010a0c, 0x00010a13, 1}, - {0x00010a15, 0x00010a17, 1}, - {0x00010a19, 0x00010a33, 1}, - {0x00010a38, 0x00010a3a, 1}, - {0x00010a3f, 0x00010a47, 1}, - {0x00010a50, 0x00010a58, 1}, - {0x00010a60, 0x00010a7f, 1}, - {0x00010b00, 0x00010b35, 1}, - {0x00010b39, 0x00010b55, 1}, - {0x00010b58, 0x00010b72, 1}, - {0x00010b78, 0x00010b7f, 1}, - {0x00010c00, 0x00010c48, 1}, - {0x00010e60, 0x00010e7e, 1}, - {0x00011000, 0x0001104d, 1}, - {0x00011052, 0x0001106f, 1}, - {0x00011080, 0x000110c1, 1}, - {0x00012000, 0x0001236e, 1}, - {0x00012400, 0x00012462, 1}, - {0x00012470, 0x00012473, 1}, - {0x00013000, 0x0001342e, 1}, - {0x00016800, 0x00016a38, 1}, - {0x0001b000, 0x0001b001, 1}, - {0x0001d000, 0x0001d0f5, 1}, - {0x0001d100, 0x0001d126, 1}, - {0x0001d129, 0x0001d1dd, 1}, - {0x0001d200, 0x0001d245, 1}, - {0x0001d300, 0x0001d356, 1}, - {0x0001d360, 0x0001d371, 1}, - {0x0001d400, 0x0001d454, 1}, - {0x0001d456, 0x0001d49c, 1}, - {0x0001d49e, 0x0001d49f, 1}, - {0x0001d4a2, 0x0001d4a5, 3}, - {0x0001d4a6, 0x0001d4a9, 3}, - {0x0001d4aa, 0x0001d4ac, 1}, - {0x0001d4ae, 0x0001d4b9, 1}, - {0x0001d4bb, 0x0001d4bd, 2}, - {0x0001d4be, 0x0001d4c3, 1}, - {0x0001d4c5, 0x0001d505, 1}, - {0x0001d507, 0x0001d50a, 1}, - {0x0001d50d, 0x0001d514, 1}, - {0x0001d516, 0x0001d51c, 1}, - {0x0001d51e, 0x0001d539, 1}, - {0x0001d53b, 0x0001d53e, 1}, - {0x0001d540, 0x0001d544, 1}, - {0x0001d546, 0x0001d54a, 4}, - {0x0001d54b, 0x0001d550, 1}, - {0x0001d552, 0x0001d6a5, 1}, - {0x0001d6a8, 0x0001d7cb, 1}, - {0x0001d7ce, 0x0001d7ff, 1}, - {0x0001f000, 0x0001f02b, 1}, - {0x0001f030, 0x0001f093, 1}, - {0x0001f0a0, 0x0001f0ae, 1}, - {0x0001f0b1, 0x0001f0be, 1}, - {0x0001f0c1, 0x0001f0cf, 1}, - {0x0001f0d1, 0x0001f0df, 1}, - {0x0001f100, 0x0001f10a, 1}, - {0x0001f110, 0x0001f12e, 1}, - {0x0001f130, 0x0001f169, 1}, - {0x0001f170, 0x0001f19a, 1}, - {0x0001f1e6, 0x0001f202, 1}, - {0x0001f210, 0x0001f23a, 1}, - {0x0001f240, 0x0001f248, 1}, - {0x0001f250, 0x0001f251, 1}, - {0x0001f300, 0x0001f320, 1}, - {0x0001f330, 0x0001f335, 1}, - {0x0001f337, 0x0001f37c, 1}, - {0x0001f380, 0x0001f393, 1}, - {0x0001f3a0, 0x0001f3c4, 1}, - {0x0001f3c6, 0x0001f3ca, 1}, - {0x0001f3e0, 0x0001f3f0, 1}, - {0x0001f400, 0x0001f43e, 1}, - {0x0001f440, 0x0001f442, 2}, - {0x0001f443, 0x0001f4f7, 1}, - {0x0001f4f9, 0x0001f4fc, 1}, - {0x0001f500, 0x0001f53d, 1}, - {0x0001f550, 0x0001f567, 1}, - {0x0001f5fb, 0x0001f5ff, 1}, - {0x0001f601, 0x0001f610, 1}, - {0x0001f612, 0x0001f614, 1}, - {0x0001f616, 0x0001f61c, 2}, - {0x0001f61d, 0x0001f61e, 1}, - {0x0001f620, 0x0001f625, 1}, - {0x0001f628, 0x0001f62b, 1}, - {0x0001f62d, 0x0001f630, 3}, - {0x0001f631, 0x0001f633, 1}, - {0x0001f635, 0x0001f640, 1}, - {0x0001f645, 0x0001f64f, 1}, - {0x0001f680, 0x0001f6c5, 1}, - {0x0001f700, 0x0001f773, 1}, - {0x00020000, 0x0002a6d6, 1}, - {0x0002a700, 0x0002b734, 1}, - {0x0002b740, 0x0002b81d, 1}, - {0x0002f800, 0x0002fa1d, 1}, - {0x000e0001, 0x000e0020, 31}, - {0x000e0021, 0x000e007f, 1}, - {0x000e0100, 0x000e01ef, 1}, - {0x000f0000, 0x000ffffd, 1}, - {0x00100000, 0x0010fffd, 1}, - }, - LatinOffset: 0, -} - -// size 4160 bytes (4 KiB) -var assigned6_1_0 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x0000, 0x0377, 1}, - {0x037a, 0x037e, 1}, - {0x0384, 0x038a, 1}, - {0x038c, 0x038e, 2}, - {0x038f, 0x03a1, 1}, - {0x03a3, 0x0527, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x055f, 1}, - {0x0561, 0x0587, 1}, - {0x0589, 0x058a, 1}, - {0x058f, 0x0591, 2}, - {0x0592, 0x05c7, 1}, - {0x05d0, 0x05ea, 1}, - {0x05f0, 0x05f4, 1}, - {0x0600, 0x0604, 1}, - {0x0606, 0x061b, 1}, - {0x061e, 0x070d, 1}, - {0x070f, 0x074a, 1}, - {0x074d, 0x07b1, 1}, - {0x07c0, 0x07fa, 1}, - {0x0800, 0x082d, 1}, - {0x0830, 0x083e, 1}, - {0x0840, 0x085b, 1}, - {0x085e, 0x08a0, 66}, - {0x08a2, 0x08ac, 1}, - {0x08e4, 0x08fe, 1}, - {0x0900, 0x0977, 1}, - {0x0979, 0x097f, 1}, - {0x0981, 0x0983, 1}, - {0x0985, 0x098c, 1}, - {0x098f, 0x0990, 1}, - {0x0993, 0x09a8, 1}, - {0x09aa, 0x09b0, 1}, - {0x09b2, 0x09b6, 4}, - {0x09b7, 0x09b9, 1}, - {0x09bc, 0x09c4, 1}, - {0x09c7, 0x09c8, 1}, - {0x09cb, 0x09ce, 1}, - {0x09d7, 0x09dc, 5}, - {0x09dd, 0x09df, 2}, - {0x09e0, 0x09e3, 1}, - {0x09e6, 0x09fb, 1}, - {0x0a01, 0x0a03, 1}, - {0x0a05, 0x0a0a, 1}, - {0x0a0f, 0x0a10, 1}, - {0x0a13, 0x0a28, 1}, - {0x0a2a, 0x0a30, 1}, - {0x0a32, 0x0a33, 1}, - {0x0a35, 0x0a36, 1}, - {0x0a38, 0x0a39, 1}, - {0x0a3c, 0x0a3e, 2}, - {0x0a3f, 0x0a42, 1}, - {0x0a47, 0x0a48, 1}, - {0x0a4b, 0x0a4d, 1}, - {0x0a51, 0x0a59, 8}, - {0x0a5a, 0x0a5c, 1}, - {0x0a5e, 0x0a66, 8}, - {0x0a67, 0x0a75, 1}, - {0x0a81, 0x0a83, 1}, - {0x0a85, 0x0a8d, 1}, - {0x0a8f, 0x0a91, 1}, - {0x0a93, 0x0aa8, 1}, - {0x0aaa, 0x0ab0, 1}, - {0x0ab2, 0x0ab3, 1}, - {0x0ab5, 0x0ab9, 1}, - {0x0abc, 0x0ac5, 1}, - {0x0ac7, 0x0ac9, 1}, - {0x0acb, 0x0acd, 1}, - {0x0ad0, 0x0ae0, 16}, - {0x0ae1, 0x0ae3, 1}, - {0x0ae6, 0x0af1, 1}, - {0x0b01, 0x0b03, 1}, - {0x0b05, 0x0b0c, 1}, - {0x0b0f, 0x0b10, 1}, - {0x0b13, 0x0b28, 1}, - {0x0b2a, 0x0b30, 1}, - {0x0b32, 0x0b33, 1}, - {0x0b35, 0x0b39, 1}, - {0x0b3c, 0x0b44, 1}, - {0x0b47, 0x0b48, 1}, - {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, - {0x0b5c, 0x0b5d, 1}, - {0x0b5f, 0x0b63, 1}, - {0x0b66, 0x0b77, 1}, - {0x0b82, 0x0b83, 1}, - {0x0b85, 0x0b8a, 1}, - {0x0b8e, 0x0b90, 1}, - {0x0b92, 0x0b95, 1}, - {0x0b99, 0x0b9a, 1}, - {0x0b9c, 0x0b9e, 2}, - {0x0b9f, 0x0ba3, 4}, - {0x0ba4, 0x0ba8, 4}, - {0x0ba9, 0x0baa, 1}, - {0x0bae, 0x0bb9, 1}, - {0x0bbe, 0x0bc2, 1}, - {0x0bc6, 0x0bc8, 1}, - {0x0bca, 0x0bcd, 1}, - {0x0bd0, 0x0bd7, 7}, - {0x0be6, 0x0bfa, 1}, - {0x0c01, 0x0c03, 1}, - {0x0c05, 0x0c0c, 1}, - {0x0c0e, 0x0c10, 1}, - {0x0c12, 0x0c28, 1}, - {0x0c2a, 0x0c33, 1}, - {0x0c35, 0x0c39, 1}, - {0x0c3d, 0x0c44, 1}, - {0x0c46, 0x0c48, 1}, - {0x0c4a, 0x0c4d, 1}, - {0x0c55, 0x0c56, 1}, - {0x0c58, 0x0c59, 1}, - {0x0c60, 0x0c63, 1}, - {0x0c66, 0x0c6f, 1}, - {0x0c78, 0x0c7f, 1}, - {0x0c82, 0x0c83, 1}, - {0x0c85, 0x0c8c, 1}, - {0x0c8e, 0x0c90, 1}, - {0x0c92, 0x0ca8, 1}, - {0x0caa, 0x0cb3, 1}, - {0x0cb5, 0x0cb9, 1}, - {0x0cbc, 0x0cc4, 1}, - {0x0cc6, 0x0cc8, 1}, - {0x0cca, 0x0ccd, 1}, - {0x0cd5, 0x0cd6, 1}, - {0x0cde, 0x0ce0, 2}, - {0x0ce1, 0x0ce3, 1}, - {0x0ce6, 0x0cef, 1}, - {0x0cf1, 0x0cf2, 1}, - {0x0d02, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, - {0x0d0e, 0x0d10, 1}, - {0x0d12, 0x0d3a, 1}, - {0x0d3d, 0x0d44, 1}, - {0x0d46, 0x0d48, 1}, - {0x0d4a, 0x0d4e, 1}, - {0x0d57, 0x0d60, 9}, - {0x0d61, 0x0d63, 1}, - {0x0d66, 0x0d75, 1}, - {0x0d79, 0x0d7f, 1}, - {0x0d82, 0x0d83, 1}, - {0x0d85, 0x0d96, 1}, - {0x0d9a, 0x0db1, 1}, - {0x0db3, 0x0dbb, 1}, - {0x0dbd, 0x0dc0, 3}, - {0x0dc1, 0x0dc6, 1}, - {0x0dca, 0x0dcf, 5}, - {0x0dd0, 0x0dd4, 1}, - {0x0dd6, 0x0dd8, 2}, - {0x0dd9, 0x0ddf, 1}, - {0x0df2, 0x0df4, 1}, - {0x0e01, 0x0e3a, 1}, - {0x0e3f, 0x0e5b, 1}, - {0x0e81, 0x0e82, 1}, - {0x0e84, 0x0e87, 3}, - {0x0e88, 0x0e8a, 2}, - {0x0e8d, 0x0e94, 7}, - {0x0e95, 0x0e97, 1}, - {0x0e99, 0x0e9f, 1}, - {0x0ea1, 0x0ea3, 1}, - {0x0ea5, 0x0ea7, 2}, - {0x0eaa, 0x0eab, 1}, - {0x0ead, 0x0eb9, 1}, - {0x0ebb, 0x0ebd, 1}, - {0x0ec0, 0x0ec4, 1}, - {0x0ec6, 0x0ec8, 2}, - {0x0ec9, 0x0ecd, 1}, - {0x0ed0, 0x0ed9, 1}, - {0x0edc, 0x0edf, 1}, - {0x0f00, 0x0f47, 1}, - {0x0f49, 0x0f6c, 1}, - {0x0f71, 0x0f97, 1}, - {0x0f99, 0x0fbc, 1}, - {0x0fbe, 0x0fcc, 1}, - {0x0fce, 0x0fda, 1}, - {0x1000, 0x10c5, 1}, - {0x10c7, 0x10cd, 6}, - {0x10d0, 0x1248, 1}, - {0x124a, 0x124d, 1}, - {0x1250, 0x1256, 1}, - {0x1258, 0x125a, 2}, - {0x125b, 0x125d, 1}, - {0x1260, 0x1288, 1}, - {0x128a, 0x128d, 1}, - {0x1290, 0x12b0, 1}, - {0x12b2, 0x12b5, 1}, - {0x12b8, 0x12be, 1}, - {0x12c0, 0x12c2, 2}, - {0x12c3, 0x12c5, 1}, - {0x12c8, 0x12d6, 1}, - {0x12d8, 0x1310, 1}, - {0x1312, 0x1315, 1}, - {0x1318, 0x135a, 1}, - {0x135d, 0x137c, 1}, - {0x1380, 0x1399, 1}, - {0x13a0, 0x13f4, 1}, - {0x1400, 0x169c, 1}, - {0x16a0, 0x16f0, 1}, - {0x1700, 0x170c, 1}, - {0x170e, 0x1714, 1}, - {0x1720, 0x1736, 1}, - {0x1740, 0x1753, 1}, - {0x1760, 0x176c, 1}, - {0x176e, 0x1770, 1}, - {0x1772, 0x1773, 1}, - {0x1780, 0x17dd, 1}, - {0x17e0, 0x17e9, 1}, - {0x17f0, 0x17f9, 1}, - {0x1800, 0x180e, 1}, - {0x1810, 0x1819, 1}, - {0x1820, 0x1877, 1}, - {0x1880, 0x18aa, 1}, - {0x18b0, 0x18f5, 1}, - {0x1900, 0x191c, 1}, - {0x1920, 0x192b, 1}, - {0x1930, 0x193b, 1}, - {0x1940, 0x1944, 4}, - {0x1945, 0x196d, 1}, - {0x1970, 0x1974, 1}, - {0x1980, 0x19ab, 1}, - {0x19b0, 0x19c9, 1}, - {0x19d0, 0x19da, 1}, - {0x19de, 0x1a1b, 1}, - {0x1a1e, 0x1a5e, 1}, - {0x1a60, 0x1a7c, 1}, - {0x1a7f, 0x1a89, 1}, - {0x1a90, 0x1a99, 1}, - {0x1aa0, 0x1aad, 1}, - {0x1b00, 0x1b4b, 1}, - {0x1b50, 0x1b7c, 1}, - {0x1b80, 0x1bf3, 1}, - {0x1bfc, 0x1c37, 1}, - {0x1c3b, 0x1c49, 1}, - {0x1c4d, 0x1c7f, 1}, - {0x1cc0, 0x1cc7, 1}, - {0x1cd0, 0x1cf6, 1}, - {0x1d00, 0x1de6, 1}, - {0x1dfc, 0x1f15, 1}, - {0x1f18, 0x1f1d, 1}, - {0x1f20, 0x1f45, 1}, - {0x1f48, 0x1f4d, 1}, - {0x1f50, 0x1f57, 1}, - {0x1f59, 0x1f5f, 2}, - {0x1f60, 0x1f7d, 1}, - {0x1f80, 0x1fb4, 1}, - {0x1fb6, 0x1fc4, 1}, - {0x1fc6, 0x1fd3, 1}, - {0x1fd6, 0x1fdb, 1}, - {0x1fdd, 0x1fef, 1}, - {0x1ff2, 0x1ff4, 1}, - {0x1ff6, 0x1ffe, 1}, - {0x2000, 0x2064, 1}, - {0x206a, 0x2071, 1}, - {0x2074, 0x208e, 1}, - {0x2090, 0x209c, 1}, - {0x20a0, 0x20b9, 1}, - {0x20d0, 0x20f0, 1}, - {0x2100, 0x2189, 1}, - {0x2190, 0x23f3, 1}, - {0x2400, 0x2426, 1}, - {0x2440, 0x244a, 1}, - {0x2460, 0x26ff, 1}, - {0x2701, 0x2b4c, 1}, - {0x2b50, 0x2b59, 1}, - {0x2c00, 0x2c2e, 1}, - {0x2c30, 0x2c5e, 1}, - {0x2c60, 0x2cf3, 1}, - {0x2cf9, 0x2d25, 1}, - {0x2d27, 0x2d2d, 6}, - {0x2d30, 0x2d67, 1}, - {0x2d6f, 0x2d70, 1}, - {0x2d7f, 0x2d96, 1}, - {0x2da0, 0x2da6, 1}, - {0x2da8, 0x2dae, 1}, - {0x2db0, 0x2db6, 1}, - {0x2db8, 0x2dbe, 1}, - {0x2dc0, 0x2dc6, 1}, - {0x2dc8, 0x2dce, 1}, - {0x2dd0, 0x2dd6, 1}, - {0x2dd8, 0x2dde, 1}, - {0x2de0, 0x2e3b, 1}, - {0x2e80, 0x2e99, 1}, - {0x2e9b, 0x2ef3, 1}, - {0x2f00, 0x2fd5, 1}, - {0x2ff0, 0x2ffb, 1}, - {0x3000, 0x303f, 1}, - {0x3041, 0x3096, 1}, - {0x3099, 0x30ff, 1}, - {0x3105, 0x312d, 1}, - {0x3131, 0x318e, 1}, - {0x3190, 0x31ba, 1}, - {0x31c0, 0x31e3, 1}, - {0x31f0, 0x321e, 1}, - {0x3220, 0x32fe, 1}, - {0x3300, 0x4db5, 1}, - {0x4dc0, 0x9fcc, 1}, - {0xa000, 0xa48c, 1}, - {0xa490, 0xa4c6, 1}, - {0xa4d0, 0xa62b, 1}, - {0xa640, 0xa697, 1}, - {0xa69f, 0xa6f7, 1}, - {0xa700, 0xa78e, 1}, - {0xa790, 0xa793, 1}, - {0xa7a0, 0xa7aa, 1}, - {0xa7f8, 0xa82b, 1}, - {0xa830, 0xa839, 1}, - {0xa840, 0xa877, 1}, - {0xa880, 0xa8c4, 1}, - {0xa8ce, 0xa8d9, 1}, - {0xa8e0, 0xa8fb, 1}, - {0xa900, 0xa953, 1}, - {0xa95f, 0xa97c, 1}, - {0xa980, 0xa9cd, 1}, - {0xa9cf, 0xa9d9, 1}, - {0xa9de, 0xa9df, 1}, - {0xaa00, 0xaa36, 1}, - {0xaa40, 0xaa4d, 1}, - {0xaa50, 0xaa59, 1}, - {0xaa5c, 0xaa7b, 1}, - {0xaa80, 0xaac2, 1}, - {0xaadb, 0xaaf6, 1}, - {0xab01, 0xab06, 1}, - {0xab09, 0xab0e, 1}, - {0xab11, 0xab16, 1}, - {0xab20, 0xab26, 1}, - {0xab28, 0xab2e, 1}, - {0xabc0, 0xabed, 1}, - {0xabf0, 0xabf9, 1}, - {0xac00, 0xd7a3, 1}, - {0xd7b0, 0xd7c6, 1}, - {0xd7cb, 0xd7fb, 1}, - {0xd800, 0xfa6d, 1}, - {0xfa70, 0xfad9, 1}, - {0xfb00, 0xfb06, 1}, - {0xfb13, 0xfb17, 1}, - {0xfb1d, 0xfb36, 1}, - {0xfb38, 0xfb3c, 1}, - {0xfb3e, 0xfb40, 2}, - {0xfb41, 0xfb43, 2}, - {0xfb44, 0xfb46, 2}, - {0xfb47, 0xfbc1, 1}, - {0xfbd3, 0xfd3f, 1}, - {0xfd50, 0xfd8f, 1}, - {0xfd92, 0xfdc7, 1}, - {0xfdf0, 0xfdfd, 1}, - {0xfe00, 0xfe19, 1}, - {0xfe20, 0xfe26, 1}, - {0xfe30, 0xfe52, 1}, - {0xfe54, 0xfe66, 1}, - {0xfe68, 0xfe6b, 1}, - {0xfe70, 0xfe74, 1}, - {0xfe76, 0xfefc, 1}, - {0xfeff, 0xff01, 2}, - {0xff02, 0xffbe, 1}, - {0xffc2, 0xffc7, 1}, - {0xffca, 0xffcf, 1}, - {0xffd2, 0xffd7, 1}, - {0xffda, 0xffdc, 1}, - {0xffe0, 0xffe6, 1}, - {0xffe8, 0xffee, 1}, - {0xfff9, 0xfffd, 1}, - }, - R32: []unicode.Range32{ - {0x00010000, 0x0001000b, 1}, - {0x0001000d, 0x00010026, 1}, - {0x00010028, 0x0001003a, 1}, - {0x0001003c, 0x0001003d, 1}, - {0x0001003f, 0x0001004d, 1}, - {0x00010050, 0x0001005d, 1}, - {0x00010080, 0x000100fa, 1}, - {0x00010100, 0x00010102, 1}, - {0x00010107, 0x00010133, 1}, - {0x00010137, 0x0001018a, 1}, - {0x00010190, 0x0001019b, 1}, - {0x000101d0, 0x000101fd, 1}, - {0x00010280, 0x0001029c, 1}, - {0x000102a0, 0x000102d0, 1}, - {0x00010300, 0x0001031e, 1}, - {0x00010320, 0x00010323, 1}, - {0x00010330, 0x0001034a, 1}, - {0x00010380, 0x0001039d, 1}, - {0x0001039f, 0x000103c3, 1}, - {0x000103c8, 0x000103d5, 1}, - {0x00010400, 0x0001049d, 1}, - {0x000104a0, 0x000104a9, 1}, - {0x00010800, 0x00010805, 1}, - {0x00010808, 0x0001080a, 2}, - {0x0001080b, 0x00010835, 1}, - {0x00010837, 0x00010838, 1}, - {0x0001083c, 0x0001083f, 3}, - {0x00010840, 0x00010855, 1}, - {0x00010857, 0x0001085f, 1}, - {0x00010900, 0x0001091b, 1}, - {0x0001091f, 0x00010939, 1}, - {0x0001093f, 0x00010980, 65}, - {0x00010981, 0x000109b7, 1}, - {0x000109be, 0x000109bf, 1}, - {0x00010a00, 0x00010a03, 1}, - {0x00010a05, 0x00010a06, 1}, - {0x00010a0c, 0x00010a13, 1}, - {0x00010a15, 0x00010a17, 1}, - {0x00010a19, 0x00010a33, 1}, - {0x00010a38, 0x00010a3a, 1}, - {0x00010a3f, 0x00010a47, 1}, - {0x00010a50, 0x00010a58, 1}, - {0x00010a60, 0x00010a7f, 1}, - {0x00010b00, 0x00010b35, 1}, - {0x00010b39, 0x00010b55, 1}, - {0x00010b58, 0x00010b72, 1}, - {0x00010b78, 0x00010b7f, 1}, - {0x00010c00, 0x00010c48, 1}, - {0x00010e60, 0x00010e7e, 1}, - {0x00011000, 0x0001104d, 1}, - {0x00011052, 0x0001106f, 1}, - {0x00011080, 0x000110c1, 1}, - {0x000110d0, 0x000110e8, 1}, - {0x000110f0, 0x000110f9, 1}, - {0x00011100, 0x00011134, 1}, - {0x00011136, 0x00011143, 1}, - {0x00011180, 0x000111c8, 1}, - {0x000111d0, 0x000111d9, 1}, - {0x00011680, 0x000116b7, 1}, - {0x000116c0, 0x000116c9, 1}, - {0x00012000, 0x0001236e, 1}, - {0x00012400, 0x00012462, 1}, - {0x00012470, 0x00012473, 1}, - {0x00013000, 0x0001342e, 1}, - {0x00016800, 0x00016a38, 1}, - {0x00016f00, 0x00016f44, 1}, - {0x00016f50, 0x00016f7e, 1}, - {0x00016f8f, 0x00016f9f, 1}, - {0x0001b000, 0x0001b001, 1}, - {0x0001d000, 0x0001d0f5, 1}, - {0x0001d100, 0x0001d126, 1}, - {0x0001d129, 0x0001d1dd, 1}, - {0x0001d200, 0x0001d245, 1}, - {0x0001d300, 0x0001d356, 1}, - {0x0001d360, 0x0001d371, 1}, - {0x0001d400, 0x0001d454, 1}, - {0x0001d456, 0x0001d49c, 1}, - {0x0001d49e, 0x0001d49f, 1}, - {0x0001d4a2, 0x0001d4a5, 3}, - {0x0001d4a6, 0x0001d4a9, 3}, - {0x0001d4aa, 0x0001d4ac, 1}, - {0x0001d4ae, 0x0001d4b9, 1}, - {0x0001d4bb, 0x0001d4bd, 2}, - {0x0001d4be, 0x0001d4c3, 1}, - {0x0001d4c5, 0x0001d505, 1}, - {0x0001d507, 0x0001d50a, 1}, - {0x0001d50d, 0x0001d514, 1}, - {0x0001d516, 0x0001d51c, 1}, - {0x0001d51e, 0x0001d539, 1}, - {0x0001d53b, 0x0001d53e, 1}, - {0x0001d540, 0x0001d544, 1}, - {0x0001d546, 0x0001d54a, 4}, - {0x0001d54b, 0x0001d550, 1}, - {0x0001d552, 0x0001d6a5, 1}, - {0x0001d6a8, 0x0001d7cb, 1}, - {0x0001d7ce, 0x0001d7ff, 1}, - {0x0001ee00, 0x0001ee03, 1}, - {0x0001ee05, 0x0001ee1f, 1}, - {0x0001ee21, 0x0001ee22, 1}, - {0x0001ee24, 0x0001ee27, 3}, - {0x0001ee29, 0x0001ee32, 1}, - {0x0001ee34, 0x0001ee37, 1}, - {0x0001ee39, 0x0001ee3b, 2}, - {0x0001ee42, 0x0001ee47, 5}, - {0x0001ee49, 0x0001ee4d, 2}, - {0x0001ee4e, 0x0001ee4f, 1}, - {0x0001ee51, 0x0001ee52, 1}, - {0x0001ee54, 0x0001ee57, 3}, - {0x0001ee59, 0x0001ee61, 2}, - {0x0001ee62, 0x0001ee64, 2}, - {0x0001ee67, 0x0001ee6a, 1}, - {0x0001ee6c, 0x0001ee72, 1}, - {0x0001ee74, 0x0001ee77, 1}, - {0x0001ee79, 0x0001ee7c, 1}, - {0x0001ee7e, 0x0001ee80, 2}, - {0x0001ee81, 0x0001ee89, 1}, - {0x0001ee8b, 0x0001ee9b, 1}, - {0x0001eea1, 0x0001eea3, 1}, - {0x0001eea5, 0x0001eea9, 1}, - {0x0001eeab, 0x0001eebb, 1}, - {0x0001eef0, 0x0001eef1, 1}, - {0x0001f000, 0x0001f02b, 1}, - {0x0001f030, 0x0001f093, 1}, - {0x0001f0a0, 0x0001f0ae, 1}, - {0x0001f0b1, 0x0001f0be, 1}, - {0x0001f0c1, 0x0001f0cf, 1}, - {0x0001f0d1, 0x0001f0df, 1}, - {0x0001f100, 0x0001f10a, 1}, - {0x0001f110, 0x0001f12e, 1}, - {0x0001f130, 0x0001f16b, 1}, - {0x0001f170, 0x0001f19a, 1}, - {0x0001f1e6, 0x0001f202, 1}, - {0x0001f210, 0x0001f23a, 1}, - {0x0001f240, 0x0001f248, 1}, - {0x0001f250, 0x0001f251, 1}, - {0x0001f300, 0x0001f320, 1}, - {0x0001f330, 0x0001f335, 1}, - {0x0001f337, 0x0001f37c, 1}, - {0x0001f380, 0x0001f393, 1}, - {0x0001f3a0, 0x0001f3c4, 1}, - {0x0001f3c6, 0x0001f3ca, 1}, - {0x0001f3e0, 0x0001f3f0, 1}, - {0x0001f400, 0x0001f43e, 1}, - {0x0001f440, 0x0001f442, 2}, - {0x0001f443, 0x0001f4f7, 1}, - {0x0001f4f9, 0x0001f4fc, 1}, - {0x0001f500, 0x0001f53d, 1}, - {0x0001f540, 0x0001f543, 1}, - {0x0001f550, 0x0001f567, 1}, - {0x0001f5fb, 0x0001f640, 1}, - {0x0001f645, 0x0001f64f, 1}, - {0x0001f680, 0x0001f6c5, 1}, - {0x0001f700, 0x0001f773, 1}, - {0x00020000, 0x0002a6d6, 1}, - {0x0002a700, 0x0002b734, 1}, - {0x0002b740, 0x0002b81d, 1}, - {0x0002f800, 0x0002fa1d, 1}, - {0x000e0001, 0x000e0020, 31}, - {0x000e0021, 0x000e007f, 1}, - {0x000e0100, 0x000e01ef, 1}, - {0x000f0000, 0x000ffffd, 1}, - {0x00100000, 0x0010fffd, 1}, - }, - LatinOffset: 0, -} - -// size 4160 bytes (4 KiB) -var assigned6_2_0 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x0000, 0x0377, 1}, - {0x037a, 0x037e, 1}, - {0x0384, 0x038a, 1}, - {0x038c, 0x038e, 2}, - {0x038f, 0x03a1, 1}, - {0x03a3, 0x0527, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x055f, 1}, - {0x0561, 0x0587, 1}, - {0x0589, 0x058a, 1}, - {0x058f, 0x0591, 2}, - {0x0592, 0x05c7, 1}, - {0x05d0, 0x05ea, 1}, - {0x05f0, 0x05f4, 1}, - {0x0600, 0x0604, 1}, - {0x0606, 0x061b, 1}, - {0x061e, 0x070d, 1}, - {0x070f, 0x074a, 1}, - {0x074d, 0x07b1, 1}, - {0x07c0, 0x07fa, 1}, - {0x0800, 0x082d, 1}, - {0x0830, 0x083e, 1}, - {0x0840, 0x085b, 1}, - {0x085e, 0x08a0, 66}, - {0x08a2, 0x08ac, 1}, - {0x08e4, 0x08fe, 1}, - {0x0900, 0x0977, 1}, - {0x0979, 0x097f, 1}, - {0x0981, 0x0983, 1}, - {0x0985, 0x098c, 1}, - {0x098f, 0x0990, 1}, - {0x0993, 0x09a8, 1}, - {0x09aa, 0x09b0, 1}, - {0x09b2, 0x09b6, 4}, - {0x09b7, 0x09b9, 1}, - {0x09bc, 0x09c4, 1}, - {0x09c7, 0x09c8, 1}, - {0x09cb, 0x09ce, 1}, - {0x09d7, 0x09dc, 5}, - {0x09dd, 0x09df, 2}, - {0x09e0, 0x09e3, 1}, - {0x09e6, 0x09fb, 1}, - {0x0a01, 0x0a03, 1}, - {0x0a05, 0x0a0a, 1}, - {0x0a0f, 0x0a10, 1}, - {0x0a13, 0x0a28, 1}, - {0x0a2a, 0x0a30, 1}, - {0x0a32, 0x0a33, 1}, - {0x0a35, 0x0a36, 1}, - {0x0a38, 0x0a39, 1}, - {0x0a3c, 0x0a3e, 2}, - {0x0a3f, 0x0a42, 1}, - {0x0a47, 0x0a48, 1}, - {0x0a4b, 0x0a4d, 1}, - {0x0a51, 0x0a59, 8}, - {0x0a5a, 0x0a5c, 1}, - {0x0a5e, 0x0a66, 8}, - {0x0a67, 0x0a75, 1}, - {0x0a81, 0x0a83, 1}, - {0x0a85, 0x0a8d, 1}, - {0x0a8f, 0x0a91, 1}, - {0x0a93, 0x0aa8, 1}, - {0x0aaa, 0x0ab0, 1}, - {0x0ab2, 0x0ab3, 1}, - {0x0ab5, 0x0ab9, 1}, - {0x0abc, 0x0ac5, 1}, - {0x0ac7, 0x0ac9, 1}, - {0x0acb, 0x0acd, 1}, - {0x0ad0, 0x0ae0, 16}, - {0x0ae1, 0x0ae3, 1}, - {0x0ae6, 0x0af1, 1}, - {0x0b01, 0x0b03, 1}, - {0x0b05, 0x0b0c, 1}, - {0x0b0f, 0x0b10, 1}, - {0x0b13, 0x0b28, 1}, - {0x0b2a, 0x0b30, 1}, - {0x0b32, 0x0b33, 1}, - {0x0b35, 0x0b39, 1}, - {0x0b3c, 0x0b44, 1}, - {0x0b47, 0x0b48, 1}, - {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, - {0x0b5c, 0x0b5d, 1}, - {0x0b5f, 0x0b63, 1}, - {0x0b66, 0x0b77, 1}, - {0x0b82, 0x0b83, 1}, - {0x0b85, 0x0b8a, 1}, - {0x0b8e, 0x0b90, 1}, - {0x0b92, 0x0b95, 1}, - {0x0b99, 0x0b9a, 1}, - {0x0b9c, 0x0b9e, 2}, - {0x0b9f, 0x0ba3, 4}, - {0x0ba4, 0x0ba8, 4}, - {0x0ba9, 0x0baa, 1}, - {0x0bae, 0x0bb9, 1}, - {0x0bbe, 0x0bc2, 1}, - {0x0bc6, 0x0bc8, 1}, - {0x0bca, 0x0bcd, 1}, - {0x0bd0, 0x0bd7, 7}, - {0x0be6, 0x0bfa, 1}, - {0x0c01, 0x0c03, 1}, - {0x0c05, 0x0c0c, 1}, - {0x0c0e, 0x0c10, 1}, - {0x0c12, 0x0c28, 1}, - {0x0c2a, 0x0c33, 1}, - {0x0c35, 0x0c39, 1}, - {0x0c3d, 0x0c44, 1}, - {0x0c46, 0x0c48, 1}, - {0x0c4a, 0x0c4d, 1}, - {0x0c55, 0x0c56, 1}, - {0x0c58, 0x0c59, 1}, - {0x0c60, 0x0c63, 1}, - {0x0c66, 0x0c6f, 1}, - {0x0c78, 0x0c7f, 1}, - {0x0c82, 0x0c83, 1}, - {0x0c85, 0x0c8c, 1}, - {0x0c8e, 0x0c90, 1}, - {0x0c92, 0x0ca8, 1}, - {0x0caa, 0x0cb3, 1}, - {0x0cb5, 0x0cb9, 1}, - {0x0cbc, 0x0cc4, 1}, - {0x0cc6, 0x0cc8, 1}, - {0x0cca, 0x0ccd, 1}, - {0x0cd5, 0x0cd6, 1}, - {0x0cde, 0x0ce0, 2}, - {0x0ce1, 0x0ce3, 1}, - {0x0ce6, 0x0cef, 1}, - {0x0cf1, 0x0cf2, 1}, - {0x0d02, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, - {0x0d0e, 0x0d10, 1}, - {0x0d12, 0x0d3a, 1}, - {0x0d3d, 0x0d44, 1}, - {0x0d46, 0x0d48, 1}, - {0x0d4a, 0x0d4e, 1}, - {0x0d57, 0x0d60, 9}, - {0x0d61, 0x0d63, 1}, - {0x0d66, 0x0d75, 1}, - {0x0d79, 0x0d7f, 1}, - {0x0d82, 0x0d83, 1}, - {0x0d85, 0x0d96, 1}, - {0x0d9a, 0x0db1, 1}, - {0x0db3, 0x0dbb, 1}, - {0x0dbd, 0x0dc0, 3}, - {0x0dc1, 0x0dc6, 1}, - {0x0dca, 0x0dcf, 5}, - {0x0dd0, 0x0dd4, 1}, - {0x0dd6, 0x0dd8, 2}, - {0x0dd9, 0x0ddf, 1}, - {0x0df2, 0x0df4, 1}, - {0x0e01, 0x0e3a, 1}, - {0x0e3f, 0x0e5b, 1}, - {0x0e81, 0x0e82, 1}, - {0x0e84, 0x0e87, 3}, - {0x0e88, 0x0e8a, 2}, - {0x0e8d, 0x0e94, 7}, - {0x0e95, 0x0e97, 1}, - {0x0e99, 0x0e9f, 1}, - {0x0ea1, 0x0ea3, 1}, - {0x0ea5, 0x0ea7, 2}, - {0x0eaa, 0x0eab, 1}, - {0x0ead, 0x0eb9, 1}, - {0x0ebb, 0x0ebd, 1}, - {0x0ec0, 0x0ec4, 1}, - {0x0ec6, 0x0ec8, 2}, - {0x0ec9, 0x0ecd, 1}, - {0x0ed0, 0x0ed9, 1}, - {0x0edc, 0x0edf, 1}, - {0x0f00, 0x0f47, 1}, - {0x0f49, 0x0f6c, 1}, - {0x0f71, 0x0f97, 1}, - {0x0f99, 0x0fbc, 1}, - {0x0fbe, 0x0fcc, 1}, - {0x0fce, 0x0fda, 1}, - {0x1000, 0x10c5, 1}, - {0x10c7, 0x10cd, 6}, - {0x10d0, 0x1248, 1}, - {0x124a, 0x124d, 1}, - {0x1250, 0x1256, 1}, - {0x1258, 0x125a, 2}, - {0x125b, 0x125d, 1}, - {0x1260, 0x1288, 1}, - {0x128a, 0x128d, 1}, - {0x1290, 0x12b0, 1}, - {0x12b2, 0x12b5, 1}, - {0x12b8, 0x12be, 1}, - {0x12c0, 0x12c2, 2}, - {0x12c3, 0x12c5, 1}, - {0x12c8, 0x12d6, 1}, - {0x12d8, 0x1310, 1}, - {0x1312, 0x1315, 1}, - {0x1318, 0x135a, 1}, - {0x135d, 0x137c, 1}, - {0x1380, 0x1399, 1}, - {0x13a0, 0x13f4, 1}, - {0x1400, 0x169c, 1}, - {0x16a0, 0x16f0, 1}, - {0x1700, 0x170c, 1}, - {0x170e, 0x1714, 1}, - {0x1720, 0x1736, 1}, - {0x1740, 0x1753, 1}, - {0x1760, 0x176c, 1}, - {0x176e, 0x1770, 1}, - {0x1772, 0x1773, 1}, - {0x1780, 0x17dd, 1}, - {0x17e0, 0x17e9, 1}, - {0x17f0, 0x17f9, 1}, - {0x1800, 0x180e, 1}, - {0x1810, 0x1819, 1}, - {0x1820, 0x1877, 1}, - {0x1880, 0x18aa, 1}, - {0x18b0, 0x18f5, 1}, - {0x1900, 0x191c, 1}, - {0x1920, 0x192b, 1}, - {0x1930, 0x193b, 1}, - {0x1940, 0x1944, 4}, - {0x1945, 0x196d, 1}, - {0x1970, 0x1974, 1}, - {0x1980, 0x19ab, 1}, - {0x19b0, 0x19c9, 1}, - {0x19d0, 0x19da, 1}, - {0x19de, 0x1a1b, 1}, - {0x1a1e, 0x1a5e, 1}, - {0x1a60, 0x1a7c, 1}, - {0x1a7f, 0x1a89, 1}, - {0x1a90, 0x1a99, 1}, - {0x1aa0, 0x1aad, 1}, - {0x1b00, 0x1b4b, 1}, - {0x1b50, 0x1b7c, 1}, - {0x1b80, 0x1bf3, 1}, - {0x1bfc, 0x1c37, 1}, - {0x1c3b, 0x1c49, 1}, - {0x1c4d, 0x1c7f, 1}, - {0x1cc0, 0x1cc7, 1}, - {0x1cd0, 0x1cf6, 1}, - {0x1d00, 0x1de6, 1}, - {0x1dfc, 0x1f15, 1}, - {0x1f18, 0x1f1d, 1}, - {0x1f20, 0x1f45, 1}, - {0x1f48, 0x1f4d, 1}, - {0x1f50, 0x1f57, 1}, - {0x1f59, 0x1f5f, 2}, - {0x1f60, 0x1f7d, 1}, - {0x1f80, 0x1fb4, 1}, - {0x1fb6, 0x1fc4, 1}, - {0x1fc6, 0x1fd3, 1}, - {0x1fd6, 0x1fdb, 1}, - {0x1fdd, 0x1fef, 1}, - {0x1ff2, 0x1ff4, 1}, - {0x1ff6, 0x1ffe, 1}, - {0x2000, 0x2064, 1}, - {0x206a, 0x2071, 1}, - {0x2074, 0x208e, 1}, - {0x2090, 0x209c, 1}, - {0x20a0, 0x20ba, 1}, - {0x20d0, 0x20f0, 1}, - {0x2100, 0x2189, 1}, - {0x2190, 0x23f3, 1}, - {0x2400, 0x2426, 1}, - {0x2440, 0x244a, 1}, - {0x2460, 0x26ff, 1}, - {0x2701, 0x2b4c, 1}, - {0x2b50, 0x2b59, 1}, - {0x2c00, 0x2c2e, 1}, - {0x2c30, 0x2c5e, 1}, - {0x2c60, 0x2cf3, 1}, - {0x2cf9, 0x2d25, 1}, - {0x2d27, 0x2d2d, 6}, - {0x2d30, 0x2d67, 1}, - {0x2d6f, 0x2d70, 1}, - {0x2d7f, 0x2d96, 1}, - {0x2da0, 0x2da6, 1}, - {0x2da8, 0x2dae, 1}, - {0x2db0, 0x2db6, 1}, - {0x2db8, 0x2dbe, 1}, - {0x2dc0, 0x2dc6, 1}, - {0x2dc8, 0x2dce, 1}, - {0x2dd0, 0x2dd6, 1}, - {0x2dd8, 0x2dde, 1}, - {0x2de0, 0x2e3b, 1}, - {0x2e80, 0x2e99, 1}, - {0x2e9b, 0x2ef3, 1}, - {0x2f00, 0x2fd5, 1}, - {0x2ff0, 0x2ffb, 1}, - {0x3000, 0x303f, 1}, - {0x3041, 0x3096, 1}, - {0x3099, 0x30ff, 1}, - {0x3105, 0x312d, 1}, - {0x3131, 0x318e, 1}, - {0x3190, 0x31ba, 1}, - {0x31c0, 0x31e3, 1}, - {0x31f0, 0x321e, 1}, - {0x3220, 0x32fe, 1}, - {0x3300, 0x4db5, 1}, - {0x4dc0, 0x9fcc, 1}, - {0xa000, 0xa48c, 1}, - {0xa490, 0xa4c6, 1}, - {0xa4d0, 0xa62b, 1}, - {0xa640, 0xa697, 1}, - {0xa69f, 0xa6f7, 1}, - {0xa700, 0xa78e, 1}, - {0xa790, 0xa793, 1}, - {0xa7a0, 0xa7aa, 1}, - {0xa7f8, 0xa82b, 1}, - {0xa830, 0xa839, 1}, - {0xa840, 0xa877, 1}, - {0xa880, 0xa8c4, 1}, - {0xa8ce, 0xa8d9, 1}, - {0xa8e0, 0xa8fb, 1}, - {0xa900, 0xa953, 1}, - {0xa95f, 0xa97c, 1}, - {0xa980, 0xa9cd, 1}, - {0xa9cf, 0xa9d9, 1}, - {0xa9de, 0xa9df, 1}, - {0xaa00, 0xaa36, 1}, - {0xaa40, 0xaa4d, 1}, - {0xaa50, 0xaa59, 1}, - {0xaa5c, 0xaa7b, 1}, - {0xaa80, 0xaac2, 1}, - {0xaadb, 0xaaf6, 1}, - {0xab01, 0xab06, 1}, - {0xab09, 0xab0e, 1}, - {0xab11, 0xab16, 1}, - {0xab20, 0xab26, 1}, - {0xab28, 0xab2e, 1}, - {0xabc0, 0xabed, 1}, - {0xabf0, 0xabf9, 1}, - {0xac00, 0xd7a3, 1}, - {0xd7b0, 0xd7c6, 1}, - {0xd7cb, 0xd7fb, 1}, - {0xd800, 0xfa6d, 1}, - {0xfa70, 0xfad9, 1}, - {0xfb00, 0xfb06, 1}, - {0xfb13, 0xfb17, 1}, - {0xfb1d, 0xfb36, 1}, - {0xfb38, 0xfb3c, 1}, - {0xfb3e, 0xfb40, 2}, - {0xfb41, 0xfb43, 2}, - {0xfb44, 0xfb46, 2}, - {0xfb47, 0xfbc1, 1}, - {0xfbd3, 0xfd3f, 1}, - {0xfd50, 0xfd8f, 1}, - {0xfd92, 0xfdc7, 1}, - {0xfdf0, 0xfdfd, 1}, - {0xfe00, 0xfe19, 1}, - {0xfe20, 0xfe26, 1}, - {0xfe30, 0xfe52, 1}, - {0xfe54, 0xfe66, 1}, - {0xfe68, 0xfe6b, 1}, - {0xfe70, 0xfe74, 1}, - {0xfe76, 0xfefc, 1}, - {0xfeff, 0xff01, 2}, - {0xff02, 0xffbe, 1}, - {0xffc2, 0xffc7, 1}, - {0xffca, 0xffcf, 1}, - {0xffd2, 0xffd7, 1}, - {0xffda, 0xffdc, 1}, - {0xffe0, 0xffe6, 1}, - {0xffe8, 0xffee, 1}, - {0xfff9, 0xfffd, 1}, - }, - R32: []unicode.Range32{ - {0x00010000, 0x0001000b, 1}, - {0x0001000d, 0x00010026, 1}, - {0x00010028, 0x0001003a, 1}, - {0x0001003c, 0x0001003d, 1}, - {0x0001003f, 0x0001004d, 1}, - {0x00010050, 0x0001005d, 1}, - {0x00010080, 0x000100fa, 1}, - {0x00010100, 0x00010102, 1}, - {0x00010107, 0x00010133, 1}, - {0x00010137, 0x0001018a, 1}, - {0x00010190, 0x0001019b, 1}, - {0x000101d0, 0x000101fd, 1}, - {0x00010280, 0x0001029c, 1}, - {0x000102a0, 0x000102d0, 1}, - {0x00010300, 0x0001031e, 1}, - {0x00010320, 0x00010323, 1}, - {0x00010330, 0x0001034a, 1}, - {0x00010380, 0x0001039d, 1}, - {0x0001039f, 0x000103c3, 1}, - {0x000103c8, 0x000103d5, 1}, - {0x00010400, 0x0001049d, 1}, - {0x000104a0, 0x000104a9, 1}, - {0x00010800, 0x00010805, 1}, - {0x00010808, 0x0001080a, 2}, - {0x0001080b, 0x00010835, 1}, - {0x00010837, 0x00010838, 1}, - {0x0001083c, 0x0001083f, 3}, - {0x00010840, 0x00010855, 1}, - {0x00010857, 0x0001085f, 1}, - {0x00010900, 0x0001091b, 1}, - {0x0001091f, 0x00010939, 1}, - {0x0001093f, 0x00010980, 65}, - {0x00010981, 0x000109b7, 1}, - {0x000109be, 0x000109bf, 1}, - {0x00010a00, 0x00010a03, 1}, - {0x00010a05, 0x00010a06, 1}, - {0x00010a0c, 0x00010a13, 1}, - {0x00010a15, 0x00010a17, 1}, - {0x00010a19, 0x00010a33, 1}, - {0x00010a38, 0x00010a3a, 1}, - {0x00010a3f, 0x00010a47, 1}, - {0x00010a50, 0x00010a58, 1}, - {0x00010a60, 0x00010a7f, 1}, - {0x00010b00, 0x00010b35, 1}, - {0x00010b39, 0x00010b55, 1}, - {0x00010b58, 0x00010b72, 1}, - {0x00010b78, 0x00010b7f, 1}, - {0x00010c00, 0x00010c48, 1}, - {0x00010e60, 0x00010e7e, 1}, - {0x00011000, 0x0001104d, 1}, - {0x00011052, 0x0001106f, 1}, - {0x00011080, 0x000110c1, 1}, - {0x000110d0, 0x000110e8, 1}, - {0x000110f0, 0x000110f9, 1}, - {0x00011100, 0x00011134, 1}, - {0x00011136, 0x00011143, 1}, - {0x00011180, 0x000111c8, 1}, - {0x000111d0, 0x000111d9, 1}, - {0x00011680, 0x000116b7, 1}, - {0x000116c0, 0x000116c9, 1}, - {0x00012000, 0x0001236e, 1}, - {0x00012400, 0x00012462, 1}, - {0x00012470, 0x00012473, 1}, - {0x00013000, 0x0001342e, 1}, - {0x00016800, 0x00016a38, 1}, - {0x00016f00, 0x00016f44, 1}, - {0x00016f50, 0x00016f7e, 1}, - {0x00016f8f, 0x00016f9f, 1}, - {0x0001b000, 0x0001b001, 1}, - {0x0001d000, 0x0001d0f5, 1}, - {0x0001d100, 0x0001d126, 1}, - {0x0001d129, 0x0001d1dd, 1}, - {0x0001d200, 0x0001d245, 1}, - {0x0001d300, 0x0001d356, 1}, - {0x0001d360, 0x0001d371, 1}, - {0x0001d400, 0x0001d454, 1}, - {0x0001d456, 0x0001d49c, 1}, - {0x0001d49e, 0x0001d49f, 1}, - {0x0001d4a2, 0x0001d4a5, 3}, - {0x0001d4a6, 0x0001d4a9, 3}, - {0x0001d4aa, 0x0001d4ac, 1}, - {0x0001d4ae, 0x0001d4b9, 1}, - {0x0001d4bb, 0x0001d4bd, 2}, - {0x0001d4be, 0x0001d4c3, 1}, - {0x0001d4c5, 0x0001d505, 1}, - {0x0001d507, 0x0001d50a, 1}, - {0x0001d50d, 0x0001d514, 1}, - {0x0001d516, 0x0001d51c, 1}, - {0x0001d51e, 0x0001d539, 1}, - {0x0001d53b, 0x0001d53e, 1}, - {0x0001d540, 0x0001d544, 1}, - {0x0001d546, 0x0001d54a, 4}, - {0x0001d54b, 0x0001d550, 1}, - {0x0001d552, 0x0001d6a5, 1}, - {0x0001d6a8, 0x0001d7cb, 1}, - {0x0001d7ce, 0x0001d7ff, 1}, - {0x0001ee00, 0x0001ee03, 1}, - {0x0001ee05, 0x0001ee1f, 1}, - {0x0001ee21, 0x0001ee22, 1}, - {0x0001ee24, 0x0001ee27, 3}, - {0x0001ee29, 0x0001ee32, 1}, - {0x0001ee34, 0x0001ee37, 1}, - {0x0001ee39, 0x0001ee3b, 2}, - {0x0001ee42, 0x0001ee47, 5}, - {0x0001ee49, 0x0001ee4d, 2}, - {0x0001ee4e, 0x0001ee4f, 1}, - {0x0001ee51, 0x0001ee52, 1}, - {0x0001ee54, 0x0001ee57, 3}, - {0x0001ee59, 0x0001ee61, 2}, - {0x0001ee62, 0x0001ee64, 2}, - {0x0001ee67, 0x0001ee6a, 1}, - {0x0001ee6c, 0x0001ee72, 1}, - {0x0001ee74, 0x0001ee77, 1}, - {0x0001ee79, 0x0001ee7c, 1}, - {0x0001ee7e, 0x0001ee80, 2}, - {0x0001ee81, 0x0001ee89, 1}, - {0x0001ee8b, 0x0001ee9b, 1}, - {0x0001eea1, 0x0001eea3, 1}, - {0x0001eea5, 0x0001eea9, 1}, - {0x0001eeab, 0x0001eebb, 1}, - {0x0001eef0, 0x0001eef1, 1}, - {0x0001f000, 0x0001f02b, 1}, - {0x0001f030, 0x0001f093, 1}, - {0x0001f0a0, 0x0001f0ae, 1}, - {0x0001f0b1, 0x0001f0be, 1}, - {0x0001f0c1, 0x0001f0cf, 1}, - {0x0001f0d1, 0x0001f0df, 1}, - {0x0001f100, 0x0001f10a, 1}, - {0x0001f110, 0x0001f12e, 1}, - {0x0001f130, 0x0001f16b, 1}, - {0x0001f170, 0x0001f19a, 1}, - {0x0001f1e6, 0x0001f202, 1}, - {0x0001f210, 0x0001f23a, 1}, - {0x0001f240, 0x0001f248, 1}, - {0x0001f250, 0x0001f251, 1}, - {0x0001f300, 0x0001f320, 1}, - {0x0001f330, 0x0001f335, 1}, - {0x0001f337, 0x0001f37c, 1}, - {0x0001f380, 0x0001f393, 1}, - {0x0001f3a0, 0x0001f3c4, 1}, - {0x0001f3c6, 0x0001f3ca, 1}, - {0x0001f3e0, 0x0001f3f0, 1}, - {0x0001f400, 0x0001f43e, 1}, - {0x0001f440, 0x0001f442, 2}, - {0x0001f443, 0x0001f4f7, 1}, - {0x0001f4f9, 0x0001f4fc, 1}, - {0x0001f500, 0x0001f53d, 1}, - {0x0001f540, 0x0001f543, 1}, - {0x0001f550, 0x0001f567, 1}, - {0x0001f5fb, 0x0001f640, 1}, - {0x0001f645, 0x0001f64f, 1}, - {0x0001f680, 0x0001f6c5, 1}, - {0x0001f700, 0x0001f773, 1}, - {0x00020000, 0x0002a6d6, 1}, - {0x0002a700, 0x0002b734, 1}, - {0x0002b740, 0x0002b81d, 1}, - {0x0002f800, 0x0002fa1d, 1}, - {0x000e0001, 0x000e0020, 31}, - {0x000e0021, 0x000e007f, 1}, - {0x000e0100, 0x000e01ef, 1}, - {0x000f0000, 0x000ffffd, 1}, - {0x00100000, 0x0010fffd, 1}, - }, - LatinOffset: 0, -} - -// size 4160 bytes (4 KiB) -var assigned6_3_0 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x0000, 0x0377, 1}, - {0x037a, 0x037e, 1}, - {0x0384, 0x038a, 1}, - {0x038c, 0x038e, 2}, - {0x038f, 0x03a1, 1}, - {0x03a3, 0x0527, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x055f, 1}, - {0x0561, 0x0587, 1}, - {0x0589, 0x058a, 1}, - {0x058f, 0x0591, 2}, - {0x0592, 0x05c7, 1}, - {0x05d0, 0x05ea, 1}, - {0x05f0, 0x05f4, 1}, - {0x0600, 0x0604, 1}, - {0x0606, 0x061c, 1}, - {0x061e, 0x070d, 1}, - {0x070f, 0x074a, 1}, - {0x074d, 0x07b1, 1}, - {0x07c0, 0x07fa, 1}, - {0x0800, 0x082d, 1}, - {0x0830, 0x083e, 1}, - {0x0840, 0x085b, 1}, - {0x085e, 0x08a0, 66}, - {0x08a2, 0x08ac, 1}, - {0x08e4, 0x08fe, 1}, - {0x0900, 0x0977, 1}, - {0x0979, 0x097f, 1}, - {0x0981, 0x0983, 1}, - {0x0985, 0x098c, 1}, - {0x098f, 0x0990, 1}, - {0x0993, 0x09a8, 1}, - {0x09aa, 0x09b0, 1}, - {0x09b2, 0x09b6, 4}, - {0x09b7, 0x09b9, 1}, - {0x09bc, 0x09c4, 1}, - {0x09c7, 0x09c8, 1}, - {0x09cb, 0x09ce, 1}, - {0x09d7, 0x09dc, 5}, - {0x09dd, 0x09df, 2}, - {0x09e0, 0x09e3, 1}, - {0x09e6, 0x09fb, 1}, - {0x0a01, 0x0a03, 1}, - {0x0a05, 0x0a0a, 1}, - {0x0a0f, 0x0a10, 1}, - {0x0a13, 0x0a28, 1}, - {0x0a2a, 0x0a30, 1}, - {0x0a32, 0x0a33, 1}, - {0x0a35, 0x0a36, 1}, - {0x0a38, 0x0a39, 1}, - {0x0a3c, 0x0a3e, 2}, - {0x0a3f, 0x0a42, 1}, - {0x0a47, 0x0a48, 1}, - {0x0a4b, 0x0a4d, 1}, - {0x0a51, 0x0a59, 8}, - {0x0a5a, 0x0a5c, 1}, - {0x0a5e, 0x0a66, 8}, - {0x0a67, 0x0a75, 1}, - {0x0a81, 0x0a83, 1}, - {0x0a85, 0x0a8d, 1}, - {0x0a8f, 0x0a91, 1}, - {0x0a93, 0x0aa8, 1}, - {0x0aaa, 0x0ab0, 1}, - {0x0ab2, 0x0ab3, 1}, - {0x0ab5, 0x0ab9, 1}, - {0x0abc, 0x0ac5, 1}, - {0x0ac7, 0x0ac9, 1}, - {0x0acb, 0x0acd, 1}, - {0x0ad0, 0x0ae0, 16}, - {0x0ae1, 0x0ae3, 1}, - {0x0ae6, 0x0af1, 1}, - {0x0b01, 0x0b03, 1}, - {0x0b05, 0x0b0c, 1}, - {0x0b0f, 0x0b10, 1}, - {0x0b13, 0x0b28, 1}, - {0x0b2a, 0x0b30, 1}, - {0x0b32, 0x0b33, 1}, - {0x0b35, 0x0b39, 1}, - {0x0b3c, 0x0b44, 1}, - {0x0b47, 0x0b48, 1}, - {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, - {0x0b5c, 0x0b5d, 1}, - {0x0b5f, 0x0b63, 1}, - {0x0b66, 0x0b77, 1}, - {0x0b82, 0x0b83, 1}, - {0x0b85, 0x0b8a, 1}, - {0x0b8e, 0x0b90, 1}, - {0x0b92, 0x0b95, 1}, - {0x0b99, 0x0b9a, 1}, - {0x0b9c, 0x0b9e, 2}, - {0x0b9f, 0x0ba3, 4}, - {0x0ba4, 0x0ba8, 4}, - {0x0ba9, 0x0baa, 1}, - {0x0bae, 0x0bb9, 1}, - {0x0bbe, 0x0bc2, 1}, - {0x0bc6, 0x0bc8, 1}, - {0x0bca, 0x0bcd, 1}, - {0x0bd0, 0x0bd7, 7}, - {0x0be6, 0x0bfa, 1}, - {0x0c01, 0x0c03, 1}, - {0x0c05, 0x0c0c, 1}, - {0x0c0e, 0x0c10, 1}, - {0x0c12, 0x0c28, 1}, - {0x0c2a, 0x0c33, 1}, - {0x0c35, 0x0c39, 1}, - {0x0c3d, 0x0c44, 1}, - {0x0c46, 0x0c48, 1}, - {0x0c4a, 0x0c4d, 1}, - {0x0c55, 0x0c56, 1}, - {0x0c58, 0x0c59, 1}, - {0x0c60, 0x0c63, 1}, - {0x0c66, 0x0c6f, 1}, - {0x0c78, 0x0c7f, 1}, - {0x0c82, 0x0c83, 1}, - {0x0c85, 0x0c8c, 1}, - {0x0c8e, 0x0c90, 1}, - {0x0c92, 0x0ca8, 1}, - {0x0caa, 0x0cb3, 1}, - {0x0cb5, 0x0cb9, 1}, - {0x0cbc, 0x0cc4, 1}, - {0x0cc6, 0x0cc8, 1}, - {0x0cca, 0x0ccd, 1}, - {0x0cd5, 0x0cd6, 1}, - {0x0cde, 0x0ce0, 2}, - {0x0ce1, 0x0ce3, 1}, - {0x0ce6, 0x0cef, 1}, - {0x0cf1, 0x0cf2, 1}, - {0x0d02, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, - {0x0d0e, 0x0d10, 1}, - {0x0d12, 0x0d3a, 1}, - {0x0d3d, 0x0d44, 1}, - {0x0d46, 0x0d48, 1}, - {0x0d4a, 0x0d4e, 1}, - {0x0d57, 0x0d60, 9}, - {0x0d61, 0x0d63, 1}, - {0x0d66, 0x0d75, 1}, - {0x0d79, 0x0d7f, 1}, - {0x0d82, 0x0d83, 1}, - {0x0d85, 0x0d96, 1}, - {0x0d9a, 0x0db1, 1}, - {0x0db3, 0x0dbb, 1}, - {0x0dbd, 0x0dc0, 3}, - {0x0dc1, 0x0dc6, 1}, - {0x0dca, 0x0dcf, 5}, - {0x0dd0, 0x0dd4, 1}, - {0x0dd6, 0x0dd8, 2}, - {0x0dd9, 0x0ddf, 1}, - {0x0df2, 0x0df4, 1}, - {0x0e01, 0x0e3a, 1}, - {0x0e3f, 0x0e5b, 1}, - {0x0e81, 0x0e82, 1}, - {0x0e84, 0x0e87, 3}, - {0x0e88, 0x0e8a, 2}, - {0x0e8d, 0x0e94, 7}, - {0x0e95, 0x0e97, 1}, - {0x0e99, 0x0e9f, 1}, - {0x0ea1, 0x0ea3, 1}, - {0x0ea5, 0x0ea7, 2}, - {0x0eaa, 0x0eab, 1}, - {0x0ead, 0x0eb9, 1}, - {0x0ebb, 0x0ebd, 1}, - {0x0ec0, 0x0ec4, 1}, - {0x0ec6, 0x0ec8, 2}, - {0x0ec9, 0x0ecd, 1}, - {0x0ed0, 0x0ed9, 1}, - {0x0edc, 0x0edf, 1}, - {0x0f00, 0x0f47, 1}, - {0x0f49, 0x0f6c, 1}, - {0x0f71, 0x0f97, 1}, - {0x0f99, 0x0fbc, 1}, - {0x0fbe, 0x0fcc, 1}, - {0x0fce, 0x0fda, 1}, - {0x1000, 0x10c5, 1}, - {0x10c7, 0x10cd, 6}, - {0x10d0, 0x1248, 1}, - {0x124a, 0x124d, 1}, - {0x1250, 0x1256, 1}, - {0x1258, 0x125a, 2}, - {0x125b, 0x125d, 1}, - {0x1260, 0x1288, 1}, - {0x128a, 0x128d, 1}, - {0x1290, 0x12b0, 1}, - {0x12b2, 0x12b5, 1}, - {0x12b8, 0x12be, 1}, - {0x12c0, 0x12c2, 2}, - {0x12c3, 0x12c5, 1}, - {0x12c8, 0x12d6, 1}, - {0x12d8, 0x1310, 1}, - {0x1312, 0x1315, 1}, - {0x1318, 0x135a, 1}, - {0x135d, 0x137c, 1}, - {0x1380, 0x1399, 1}, - {0x13a0, 0x13f4, 1}, - {0x1400, 0x169c, 1}, - {0x16a0, 0x16f0, 1}, - {0x1700, 0x170c, 1}, - {0x170e, 0x1714, 1}, - {0x1720, 0x1736, 1}, - {0x1740, 0x1753, 1}, - {0x1760, 0x176c, 1}, - {0x176e, 0x1770, 1}, - {0x1772, 0x1773, 1}, - {0x1780, 0x17dd, 1}, - {0x17e0, 0x17e9, 1}, - {0x17f0, 0x17f9, 1}, - {0x1800, 0x180e, 1}, - {0x1810, 0x1819, 1}, - {0x1820, 0x1877, 1}, - {0x1880, 0x18aa, 1}, - {0x18b0, 0x18f5, 1}, - {0x1900, 0x191c, 1}, - {0x1920, 0x192b, 1}, - {0x1930, 0x193b, 1}, - {0x1940, 0x1944, 4}, - {0x1945, 0x196d, 1}, - {0x1970, 0x1974, 1}, - {0x1980, 0x19ab, 1}, - {0x19b0, 0x19c9, 1}, - {0x19d0, 0x19da, 1}, - {0x19de, 0x1a1b, 1}, - {0x1a1e, 0x1a5e, 1}, - {0x1a60, 0x1a7c, 1}, - {0x1a7f, 0x1a89, 1}, - {0x1a90, 0x1a99, 1}, - {0x1aa0, 0x1aad, 1}, - {0x1b00, 0x1b4b, 1}, - {0x1b50, 0x1b7c, 1}, - {0x1b80, 0x1bf3, 1}, - {0x1bfc, 0x1c37, 1}, - {0x1c3b, 0x1c49, 1}, - {0x1c4d, 0x1c7f, 1}, - {0x1cc0, 0x1cc7, 1}, - {0x1cd0, 0x1cf6, 1}, - {0x1d00, 0x1de6, 1}, - {0x1dfc, 0x1f15, 1}, - {0x1f18, 0x1f1d, 1}, - {0x1f20, 0x1f45, 1}, - {0x1f48, 0x1f4d, 1}, - {0x1f50, 0x1f57, 1}, - {0x1f59, 0x1f5f, 2}, - {0x1f60, 0x1f7d, 1}, - {0x1f80, 0x1fb4, 1}, - {0x1fb6, 0x1fc4, 1}, - {0x1fc6, 0x1fd3, 1}, - {0x1fd6, 0x1fdb, 1}, - {0x1fdd, 0x1fef, 1}, - {0x1ff2, 0x1ff4, 1}, - {0x1ff6, 0x1ffe, 1}, - {0x2000, 0x2064, 1}, - {0x2066, 0x2071, 1}, - {0x2074, 0x208e, 1}, - {0x2090, 0x209c, 1}, - {0x20a0, 0x20ba, 1}, - {0x20d0, 0x20f0, 1}, - {0x2100, 0x2189, 1}, - {0x2190, 0x23f3, 1}, - {0x2400, 0x2426, 1}, - {0x2440, 0x244a, 1}, - {0x2460, 0x26ff, 1}, - {0x2701, 0x2b4c, 1}, - {0x2b50, 0x2b59, 1}, - {0x2c00, 0x2c2e, 1}, - {0x2c30, 0x2c5e, 1}, - {0x2c60, 0x2cf3, 1}, - {0x2cf9, 0x2d25, 1}, - {0x2d27, 0x2d2d, 6}, - {0x2d30, 0x2d67, 1}, - {0x2d6f, 0x2d70, 1}, - {0x2d7f, 0x2d96, 1}, - {0x2da0, 0x2da6, 1}, - {0x2da8, 0x2dae, 1}, - {0x2db0, 0x2db6, 1}, - {0x2db8, 0x2dbe, 1}, - {0x2dc0, 0x2dc6, 1}, - {0x2dc8, 0x2dce, 1}, - {0x2dd0, 0x2dd6, 1}, - {0x2dd8, 0x2dde, 1}, - {0x2de0, 0x2e3b, 1}, - {0x2e80, 0x2e99, 1}, - {0x2e9b, 0x2ef3, 1}, - {0x2f00, 0x2fd5, 1}, - {0x2ff0, 0x2ffb, 1}, - {0x3000, 0x303f, 1}, - {0x3041, 0x3096, 1}, - {0x3099, 0x30ff, 1}, - {0x3105, 0x312d, 1}, - {0x3131, 0x318e, 1}, - {0x3190, 0x31ba, 1}, - {0x31c0, 0x31e3, 1}, - {0x31f0, 0x321e, 1}, - {0x3220, 0x32fe, 1}, - {0x3300, 0x4db5, 1}, - {0x4dc0, 0x9fcc, 1}, - {0xa000, 0xa48c, 1}, - {0xa490, 0xa4c6, 1}, - {0xa4d0, 0xa62b, 1}, - {0xa640, 0xa697, 1}, - {0xa69f, 0xa6f7, 1}, - {0xa700, 0xa78e, 1}, - {0xa790, 0xa793, 1}, - {0xa7a0, 0xa7aa, 1}, - {0xa7f8, 0xa82b, 1}, - {0xa830, 0xa839, 1}, - {0xa840, 0xa877, 1}, - {0xa880, 0xa8c4, 1}, - {0xa8ce, 0xa8d9, 1}, - {0xa8e0, 0xa8fb, 1}, - {0xa900, 0xa953, 1}, - {0xa95f, 0xa97c, 1}, - {0xa980, 0xa9cd, 1}, - {0xa9cf, 0xa9d9, 1}, - {0xa9de, 0xa9df, 1}, - {0xaa00, 0xaa36, 1}, - {0xaa40, 0xaa4d, 1}, - {0xaa50, 0xaa59, 1}, - {0xaa5c, 0xaa7b, 1}, - {0xaa80, 0xaac2, 1}, - {0xaadb, 0xaaf6, 1}, - {0xab01, 0xab06, 1}, - {0xab09, 0xab0e, 1}, - {0xab11, 0xab16, 1}, - {0xab20, 0xab26, 1}, - {0xab28, 0xab2e, 1}, - {0xabc0, 0xabed, 1}, - {0xabf0, 0xabf9, 1}, - {0xac00, 0xd7a3, 1}, - {0xd7b0, 0xd7c6, 1}, - {0xd7cb, 0xd7fb, 1}, - {0xd800, 0xfa6d, 1}, - {0xfa70, 0xfad9, 1}, - {0xfb00, 0xfb06, 1}, - {0xfb13, 0xfb17, 1}, - {0xfb1d, 0xfb36, 1}, - {0xfb38, 0xfb3c, 1}, - {0xfb3e, 0xfb40, 2}, - {0xfb41, 0xfb43, 2}, - {0xfb44, 0xfb46, 2}, - {0xfb47, 0xfbc1, 1}, - {0xfbd3, 0xfd3f, 1}, - {0xfd50, 0xfd8f, 1}, - {0xfd92, 0xfdc7, 1}, - {0xfdf0, 0xfdfd, 1}, - {0xfe00, 0xfe19, 1}, - {0xfe20, 0xfe26, 1}, - {0xfe30, 0xfe52, 1}, - {0xfe54, 0xfe66, 1}, - {0xfe68, 0xfe6b, 1}, - {0xfe70, 0xfe74, 1}, - {0xfe76, 0xfefc, 1}, - {0xfeff, 0xff01, 2}, - {0xff02, 0xffbe, 1}, - {0xffc2, 0xffc7, 1}, - {0xffca, 0xffcf, 1}, - {0xffd2, 0xffd7, 1}, - {0xffda, 0xffdc, 1}, - {0xffe0, 0xffe6, 1}, - {0xffe8, 0xffee, 1}, - {0xfff9, 0xfffd, 1}, - }, - R32: []unicode.Range32{ - {0x00010000, 0x0001000b, 1}, - {0x0001000d, 0x00010026, 1}, - {0x00010028, 0x0001003a, 1}, - {0x0001003c, 0x0001003d, 1}, - {0x0001003f, 0x0001004d, 1}, - {0x00010050, 0x0001005d, 1}, - {0x00010080, 0x000100fa, 1}, - {0x00010100, 0x00010102, 1}, - {0x00010107, 0x00010133, 1}, - {0x00010137, 0x0001018a, 1}, - {0x00010190, 0x0001019b, 1}, - {0x000101d0, 0x000101fd, 1}, - {0x00010280, 0x0001029c, 1}, - {0x000102a0, 0x000102d0, 1}, - {0x00010300, 0x0001031e, 1}, - {0x00010320, 0x00010323, 1}, - {0x00010330, 0x0001034a, 1}, - {0x00010380, 0x0001039d, 1}, - {0x0001039f, 0x000103c3, 1}, - {0x000103c8, 0x000103d5, 1}, - {0x00010400, 0x0001049d, 1}, - {0x000104a0, 0x000104a9, 1}, - {0x00010800, 0x00010805, 1}, - {0x00010808, 0x0001080a, 2}, - {0x0001080b, 0x00010835, 1}, - {0x00010837, 0x00010838, 1}, - {0x0001083c, 0x0001083f, 3}, - {0x00010840, 0x00010855, 1}, - {0x00010857, 0x0001085f, 1}, - {0x00010900, 0x0001091b, 1}, - {0x0001091f, 0x00010939, 1}, - {0x0001093f, 0x00010980, 65}, - {0x00010981, 0x000109b7, 1}, - {0x000109be, 0x000109bf, 1}, - {0x00010a00, 0x00010a03, 1}, - {0x00010a05, 0x00010a06, 1}, - {0x00010a0c, 0x00010a13, 1}, - {0x00010a15, 0x00010a17, 1}, - {0x00010a19, 0x00010a33, 1}, - {0x00010a38, 0x00010a3a, 1}, - {0x00010a3f, 0x00010a47, 1}, - {0x00010a50, 0x00010a58, 1}, - {0x00010a60, 0x00010a7f, 1}, - {0x00010b00, 0x00010b35, 1}, - {0x00010b39, 0x00010b55, 1}, - {0x00010b58, 0x00010b72, 1}, - {0x00010b78, 0x00010b7f, 1}, - {0x00010c00, 0x00010c48, 1}, - {0x00010e60, 0x00010e7e, 1}, - {0x00011000, 0x0001104d, 1}, - {0x00011052, 0x0001106f, 1}, - {0x00011080, 0x000110c1, 1}, - {0x000110d0, 0x000110e8, 1}, - {0x000110f0, 0x000110f9, 1}, - {0x00011100, 0x00011134, 1}, - {0x00011136, 0x00011143, 1}, - {0x00011180, 0x000111c8, 1}, - {0x000111d0, 0x000111d9, 1}, - {0x00011680, 0x000116b7, 1}, - {0x000116c0, 0x000116c9, 1}, - {0x00012000, 0x0001236e, 1}, - {0x00012400, 0x00012462, 1}, - {0x00012470, 0x00012473, 1}, - {0x00013000, 0x0001342e, 1}, - {0x00016800, 0x00016a38, 1}, - {0x00016f00, 0x00016f44, 1}, - {0x00016f50, 0x00016f7e, 1}, - {0x00016f8f, 0x00016f9f, 1}, - {0x0001b000, 0x0001b001, 1}, - {0x0001d000, 0x0001d0f5, 1}, - {0x0001d100, 0x0001d126, 1}, - {0x0001d129, 0x0001d1dd, 1}, - {0x0001d200, 0x0001d245, 1}, - {0x0001d300, 0x0001d356, 1}, - {0x0001d360, 0x0001d371, 1}, - {0x0001d400, 0x0001d454, 1}, - {0x0001d456, 0x0001d49c, 1}, - {0x0001d49e, 0x0001d49f, 1}, - {0x0001d4a2, 0x0001d4a5, 3}, - {0x0001d4a6, 0x0001d4a9, 3}, - {0x0001d4aa, 0x0001d4ac, 1}, - {0x0001d4ae, 0x0001d4b9, 1}, - {0x0001d4bb, 0x0001d4bd, 2}, - {0x0001d4be, 0x0001d4c3, 1}, - {0x0001d4c5, 0x0001d505, 1}, - {0x0001d507, 0x0001d50a, 1}, - {0x0001d50d, 0x0001d514, 1}, - {0x0001d516, 0x0001d51c, 1}, - {0x0001d51e, 0x0001d539, 1}, - {0x0001d53b, 0x0001d53e, 1}, - {0x0001d540, 0x0001d544, 1}, - {0x0001d546, 0x0001d54a, 4}, - {0x0001d54b, 0x0001d550, 1}, - {0x0001d552, 0x0001d6a5, 1}, - {0x0001d6a8, 0x0001d7cb, 1}, - {0x0001d7ce, 0x0001d7ff, 1}, - {0x0001ee00, 0x0001ee03, 1}, - {0x0001ee05, 0x0001ee1f, 1}, - {0x0001ee21, 0x0001ee22, 1}, - {0x0001ee24, 0x0001ee27, 3}, - {0x0001ee29, 0x0001ee32, 1}, - {0x0001ee34, 0x0001ee37, 1}, - {0x0001ee39, 0x0001ee3b, 2}, - {0x0001ee42, 0x0001ee47, 5}, - {0x0001ee49, 0x0001ee4d, 2}, - {0x0001ee4e, 0x0001ee4f, 1}, - {0x0001ee51, 0x0001ee52, 1}, - {0x0001ee54, 0x0001ee57, 3}, - {0x0001ee59, 0x0001ee61, 2}, - {0x0001ee62, 0x0001ee64, 2}, - {0x0001ee67, 0x0001ee6a, 1}, - {0x0001ee6c, 0x0001ee72, 1}, - {0x0001ee74, 0x0001ee77, 1}, - {0x0001ee79, 0x0001ee7c, 1}, - {0x0001ee7e, 0x0001ee80, 2}, - {0x0001ee81, 0x0001ee89, 1}, - {0x0001ee8b, 0x0001ee9b, 1}, - {0x0001eea1, 0x0001eea3, 1}, - {0x0001eea5, 0x0001eea9, 1}, - {0x0001eeab, 0x0001eebb, 1}, - {0x0001eef0, 0x0001eef1, 1}, - {0x0001f000, 0x0001f02b, 1}, - {0x0001f030, 0x0001f093, 1}, - {0x0001f0a0, 0x0001f0ae, 1}, - {0x0001f0b1, 0x0001f0be, 1}, - {0x0001f0c1, 0x0001f0cf, 1}, - {0x0001f0d1, 0x0001f0df, 1}, - {0x0001f100, 0x0001f10a, 1}, - {0x0001f110, 0x0001f12e, 1}, - {0x0001f130, 0x0001f16b, 1}, - {0x0001f170, 0x0001f19a, 1}, - {0x0001f1e6, 0x0001f202, 1}, - {0x0001f210, 0x0001f23a, 1}, - {0x0001f240, 0x0001f248, 1}, - {0x0001f250, 0x0001f251, 1}, - {0x0001f300, 0x0001f320, 1}, - {0x0001f330, 0x0001f335, 1}, - {0x0001f337, 0x0001f37c, 1}, - {0x0001f380, 0x0001f393, 1}, - {0x0001f3a0, 0x0001f3c4, 1}, - {0x0001f3c6, 0x0001f3ca, 1}, - {0x0001f3e0, 0x0001f3f0, 1}, - {0x0001f400, 0x0001f43e, 1}, - {0x0001f440, 0x0001f442, 2}, - {0x0001f443, 0x0001f4f7, 1}, - {0x0001f4f9, 0x0001f4fc, 1}, - {0x0001f500, 0x0001f53d, 1}, - {0x0001f540, 0x0001f543, 1}, - {0x0001f550, 0x0001f567, 1}, - {0x0001f5fb, 0x0001f640, 1}, - {0x0001f645, 0x0001f64f, 1}, - {0x0001f680, 0x0001f6c5, 1}, - {0x0001f700, 0x0001f773, 1}, - {0x00020000, 0x0002a6d6, 1}, - {0x0002a700, 0x0002b734, 1}, - {0x0002b740, 0x0002b81d, 1}, - {0x0002f800, 0x0002fa1d, 1}, - {0x000e0001, 0x000e0020, 31}, - {0x000e0021, 0x000e007f, 1}, - {0x000e0100, 0x000e01ef, 1}, - {0x000f0000, 0x000ffffd, 1}, - {0x00100000, 0x0010fffd, 1}, - }, - LatinOffset: 0, -} - -// size 4898 bytes (4 KiB) -var assigned7_0_0 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x0000, 0x0377, 1}, - {0x037a, 0x037f, 1}, - {0x0384, 0x038a, 1}, - {0x038c, 0x038e, 2}, - {0x038f, 0x03a1, 1}, - {0x03a3, 0x052f, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x055f, 1}, - {0x0561, 0x0587, 1}, - {0x0589, 0x058a, 1}, - {0x058d, 0x058f, 1}, - {0x0591, 0x05c7, 1}, - {0x05d0, 0x05ea, 1}, - {0x05f0, 0x05f4, 1}, - {0x0600, 0x061c, 1}, - {0x061e, 0x070d, 1}, - {0x070f, 0x074a, 1}, - {0x074d, 0x07b1, 1}, - {0x07c0, 0x07fa, 1}, - {0x0800, 0x082d, 1}, - {0x0830, 0x083e, 1}, - {0x0840, 0x085b, 1}, - {0x085e, 0x08a0, 66}, - {0x08a1, 0x08b2, 1}, - {0x08e4, 0x0983, 1}, - {0x0985, 0x098c, 1}, - {0x098f, 0x0990, 1}, - {0x0993, 0x09a8, 1}, - {0x09aa, 0x09b0, 1}, - {0x09b2, 0x09b6, 4}, - {0x09b7, 0x09b9, 1}, - {0x09bc, 0x09c4, 1}, - {0x09c7, 0x09c8, 1}, - {0x09cb, 0x09ce, 1}, - {0x09d7, 0x09dc, 5}, - {0x09dd, 0x09df, 2}, - {0x09e0, 0x09e3, 1}, - {0x09e6, 0x09fb, 1}, - {0x0a01, 0x0a03, 1}, - {0x0a05, 0x0a0a, 1}, - {0x0a0f, 0x0a10, 1}, - {0x0a13, 0x0a28, 1}, - {0x0a2a, 0x0a30, 1}, - {0x0a32, 0x0a33, 1}, - {0x0a35, 0x0a36, 1}, - {0x0a38, 0x0a39, 1}, - {0x0a3c, 0x0a3e, 2}, - {0x0a3f, 0x0a42, 1}, - {0x0a47, 0x0a48, 1}, - {0x0a4b, 0x0a4d, 1}, - {0x0a51, 0x0a59, 8}, - {0x0a5a, 0x0a5c, 1}, - {0x0a5e, 0x0a66, 8}, - {0x0a67, 0x0a75, 1}, - {0x0a81, 0x0a83, 1}, - {0x0a85, 0x0a8d, 1}, - {0x0a8f, 0x0a91, 1}, - {0x0a93, 0x0aa8, 1}, - {0x0aaa, 0x0ab0, 1}, - {0x0ab2, 0x0ab3, 1}, - {0x0ab5, 0x0ab9, 1}, - {0x0abc, 0x0ac5, 1}, - {0x0ac7, 0x0ac9, 1}, - {0x0acb, 0x0acd, 1}, - {0x0ad0, 0x0ae0, 16}, - {0x0ae1, 0x0ae3, 1}, - {0x0ae6, 0x0af1, 1}, - {0x0b01, 0x0b03, 1}, - {0x0b05, 0x0b0c, 1}, - {0x0b0f, 0x0b10, 1}, - {0x0b13, 0x0b28, 1}, - {0x0b2a, 0x0b30, 1}, - {0x0b32, 0x0b33, 1}, - {0x0b35, 0x0b39, 1}, - {0x0b3c, 0x0b44, 1}, - {0x0b47, 0x0b48, 1}, - {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, - {0x0b5c, 0x0b5d, 1}, - {0x0b5f, 0x0b63, 1}, - {0x0b66, 0x0b77, 1}, - {0x0b82, 0x0b83, 1}, - {0x0b85, 0x0b8a, 1}, - {0x0b8e, 0x0b90, 1}, - {0x0b92, 0x0b95, 1}, - {0x0b99, 0x0b9a, 1}, - {0x0b9c, 0x0b9e, 2}, - {0x0b9f, 0x0ba3, 4}, - {0x0ba4, 0x0ba8, 4}, - {0x0ba9, 0x0baa, 1}, - {0x0bae, 0x0bb9, 1}, - {0x0bbe, 0x0bc2, 1}, - {0x0bc6, 0x0bc8, 1}, - {0x0bca, 0x0bcd, 1}, - {0x0bd0, 0x0bd7, 7}, - {0x0be6, 0x0bfa, 1}, - {0x0c00, 0x0c03, 1}, - {0x0c05, 0x0c0c, 1}, - {0x0c0e, 0x0c10, 1}, - {0x0c12, 0x0c28, 1}, - {0x0c2a, 0x0c39, 1}, - {0x0c3d, 0x0c44, 1}, - {0x0c46, 0x0c48, 1}, - {0x0c4a, 0x0c4d, 1}, - {0x0c55, 0x0c56, 1}, - {0x0c58, 0x0c59, 1}, - {0x0c60, 0x0c63, 1}, - {0x0c66, 0x0c6f, 1}, - {0x0c78, 0x0c7f, 1}, - {0x0c81, 0x0c83, 1}, - {0x0c85, 0x0c8c, 1}, - {0x0c8e, 0x0c90, 1}, - {0x0c92, 0x0ca8, 1}, - {0x0caa, 0x0cb3, 1}, - {0x0cb5, 0x0cb9, 1}, - {0x0cbc, 0x0cc4, 1}, - {0x0cc6, 0x0cc8, 1}, - {0x0cca, 0x0ccd, 1}, - {0x0cd5, 0x0cd6, 1}, - {0x0cde, 0x0ce0, 2}, - {0x0ce1, 0x0ce3, 1}, - {0x0ce6, 0x0cef, 1}, - {0x0cf1, 0x0cf2, 1}, - {0x0d01, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, - {0x0d0e, 0x0d10, 1}, - {0x0d12, 0x0d3a, 1}, - {0x0d3d, 0x0d44, 1}, - {0x0d46, 0x0d48, 1}, - {0x0d4a, 0x0d4e, 1}, - {0x0d57, 0x0d60, 9}, - {0x0d61, 0x0d63, 1}, - {0x0d66, 0x0d75, 1}, - {0x0d79, 0x0d7f, 1}, - {0x0d82, 0x0d83, 1}, - {0x0d85, 0x0d96, 1}, - {0x0d9a, 0x0db1, 1}, - {0x0db3, 0x0dbb, 1}, - {0x0dbd, 0x0dc0, 3}, - {0x0dc1, 0x0dc6, 1}, - {0x0dca, 0x0dcf, 5}, - {0x0dd0, 0x0dd4, 1}, - {0x0dd6, 0x0dd8, 2}, - {0x0dd9, 0x0ddf, 1}, - {0x0de6, 0x0def, 1}, - {0x0df2, 0x0df4, 1}, - {0x0e01, 0x0e3a, 1}, - {0x0e3f, 0x0e5b, 1}, - {0x0e81, 0x0e82, 1}, - {0x0e84, 0x0e87, 3}, - {0x0e88, 0x0e8a, 2}, - {0x0e8d, 0x0e94, 7}, - {0x0e95, 0x0e97, 1}, - {0x0e99, 0x0e9f, 1}, - {0x0ea1, 0x0ea3, 1}, - {0x0ea5, 0x0ea7, 2}, - {0x0eaa, 0x0eab, 1}, - {0x0ead, 0x0eb9, 1}, - {0x0ebb, 0x0ebd, 1}, - {0x0ec0, 0x0ec4, 1}, - {0x0ec6, 0x0ec8, 2}, - {0x0ec9, 0x0ecd, 1}, - {0x0ed0, 0x0ed9, 1}, - {0x0edc, 0x0edf, 1}, - {0x0f00, 0x0f47, 1}, - {0x0f49, 0x0f6c, 1}, - {0x0f71, 0x0f97, 1}, - {0x0f99, 0x0fbc, 1}, - {0x0fbe, 0x0fcc, 1}, - {0x0fce, 0x0fda, 1}, - {0x1000, 0x10c5, 1}, - {0x10c7, 0x10cd, 6}, - {0x10d0, 0x1248, 1}, - {0x124a, 0x124d, 1}, - {0x1250, 0x1256, 1}, - {0x1258, 0x125a, 2}, - {0x125b, 0x125d, 1}, - {0x1260, 0x1288, 1}, - {0x128a, 0x128d, 1}, - {0x1290, 0x12b0, 1}, - {0x12b2, 0x12b5, 1}, - {0x12b8, 0x12be, 1}, - {0x12c0, 0x12c2, 2}, - {0x12c3, 0x12c5, 1}, - {0x12c8, 0x12d6, 1}, - {0x12d8, 0x1310, 1}, - {0x1312, 0x1315, 1}, - {0x1318, 0x135a, 1}, - {0x135d, 0x137c, 1}, - {0x1380, 0x1399, 1}, - {0x13a0, 0x13f4, 1}, - {0x1400, 0x169c, 1}, - {0x16a0, 0x16f8, 1}, - {0x1700, 0x170c, 1}, - {0x170e, 0x1714, 1}, - {0x1720, 0x1736, 1}, - {0x1740, 0x1753, 1}, - {0x1760, 0x176c, 1}, - {0x176e, 0x1770, 1}, - {0x1772, 0x1773, 1}, - {0x1780, 0x17dd, 1}, - {0x17e0, 0x17e9, 1}, - {0x17f0, 0x17f9, 1}, - {0x1800, 0x180e, 1}, - {0x1810, 0x1819, 1}, - {0x1820, 0x1877, 1}, - {0x1880, 0x18aa, 1}, - {0x18b0, 0x18f5, 1}, - {0x1900, 0x191e, 1}, - {0x1920, 0x192b, 1}, - {0x1930, 0x193b, 1}, - {0x1940, 0x1944, 4}, - {0x1945, 0x196d, 1}, - {0x1970, 0x1974, 1}, - {0x1980, 0x19ab, 1}, - {0x19b0, 0x19c9, 1}, - {0x19d0, 0x19da, 1}, - {0x19de, 0x1a1b, 1}, - {0x1a1e, 0x1a5e, 1}, - {0x1a60, 0x1a7c, 1}, - {0x1a7f, 0x1a89, 1}, - {0x1a90, 0x1a99, 1}, - {0x1aa0, 0x1aad, 1}, - {0x1ab0, 0x1abe, 1}, - {0x1b00, 0x1b4b, 1}, - {0x1b50, 0x1b7c, 1}, - {0x1b80, 0x1bf3, 1}, - {0x1bfc, 0x1c37, 1}, - {0x1c3b, 0x1c49, 1}, - {0x1c4d, 0x1c7f, 1}, - {0x1cc0, 0x1cc7, 1}, - {0x1cd0, 0x1cf6, 1}, - {0x1cf8, 0x1cf9, 1}, - {0x1d00, 0x1df5, 1}, - {0x1dfc, 0x1f15, 1}, - {0x1f18, 0x1f1d, 1}, - {0x1f20, 0x1f45, 1}, - {0x1f48, 0x1f4d, 1}, - {0x1f50, 0x1f57, 1}, - {0x1f59, 0x1f5f, 2}, - {0x1f60, 0x1f7d, 1}, - {0x1f80, 0x1fb4, 1}, - {0x1fb6, 0x1fc4, 1}, - {0x1fc6, 0x1fd3, 1}, - {0x1fd6, 0x1fdb, 1}, - {0x1fdd, 0x1fef, 1}, - {0x1ff2, 0x1ff4, 1}, - {0x1ff6, 0x1ffe, 1}, - {0x2000, 0x2064, 1}, - {0x2066, 0x2071, 1}, - {0x2074, 0x208e, 1}, - {0x2090, 0x209c, 1}, - {0x20a0, 0x20bd, 1}, - {0x20d0, 0x20f0, 1}, - {0x2100, 0x2189, 1}, - {0x2190, 0x23fa, 1}, - {0x2400, 0x2426, 1}, - {0x2440, 0x244a, 1}, - {0x2460, 0x2b73, 1}, - {0x2b76, 0x2b95, 1}, - {0x2b98, 0x2bb9, 1}, - {0x2bbd, 0x2bc8, 1}, - {0x2bca, 0x2bd1, 1}, - {0x2c00, 0x2c2e, 1}, - {0x2c30, 0x2c5e, 1}, - {0x2c60, 0x2cf3, 1}, - {0x2cf9, 0x2d25, 1}, - {0x2d27, 0x2d2d, 6}, - {0x2d30, 0x2d67, 1}, - {0x2d6f, 0x2d70, 1}, - {0x2d7f, 0x2d96, 1}, - {0x2da0, 0x2da6, 1}, - {0x2da8, 0x2dae, 1}, - {0x2db0, 0x2db6, 1}, - {0x2db8, 0x2dbe, 1}, - {0x2dc0, 0x2dc6, 1}, - {0x2dc8, 0x2dce, 1}, - {0x2dd0, 0x2dd6, 1}, - {0x2dd8, 0x2dde, 1}, - {0x2de0, 0x2e42, 1}, - {0x2e80, 0x2e99, 1}, - {0x2e9b, 0x2ef3, 1}, - {0x2f00, 0x2fd5, 1}, - {0x2ff0, 0x2ffb, 1}, - {0x3000, 0x303f, 1}, - {0x3041, 0x3096, 1}, - {0x3099, 0x30ff, 1}, - {0x3105, 0x312d, 1}, - {0x3131, 0x318e, 1}, - {0x3190, 0x31ba, 1}, - {0x31c0, 0x31e3, 1}, - {0x31f0, 0x321e, 1}, - {0x3220, 0x32fe, 1}, - {0x3300, 0x4db5, 1}, - {0x4dc0, 0x9fcc, 1}, - {0xa000, 0xa48c, 1}, - {0xa490, 0xa4c6, 1}, - {0xa4d0, 0xa62b, 1}, - {0xa640, 0xa69d, 1}, - {0xa69f, 0xa6f7, 1}, - {0xa700, 0xa78e, 1}, - {0xa790, 0xa7ad, 1}, - {0xa7b0, 0xa7b1, 1}, - {0xa7f7, 0xa82b, 1}, - {0xa830, 0xa839, 1}, - {0xa840, 0xa877, 1}, - {0xa880, 0xa8c4, 1}, - {0xa8ce, 0xa8d9, 1}, - {0xa8e0, 0xa8fb, 1}, - {0xa900, 0xa953, 1}, - {0xa95f, 0xa97c, 1}, - {0xa980, 0xa9cd, 1}, - {0xa9cf, 0xa9d9, 1}, - {0xa9de, 0xa9fe, 1}, - {0xaa00, 0xaa36, 1}, - {0xaa40, 0xaa4d, 1}, - {0xaa50, 0xaa59, 1}, - {0xaa5c, 0xaac2, 1}, - {0xaadb, 0xaaf6, 1}, - {0xab01, 0xab06, 1}, - {0xab09, 0xab0e, 1}, - {0xab11, 0xab16, 1}, - {0xab20, 0xab26, 1}, - {0xab28, 0xab2e, 1}, - {0xab30, 0xab5f, 1}, - {0xab64, 0xab65, 1}, - {0xabc0, 0xabed, 1}, - {0xabf0, 0xabf9, 1}, - {0xac00, 0xd7a3, 1}, - {0xd7b0, 0xd7c6, 1}, - {0xd7cb, 0xd7fb, 1}, - {0xd800, 0xfa6d, 1}, - {0xfa70, 0xfad9, 1}, - {0xfb00, 0xfb06, 1}, - {0xfb13, 0xfb17, 1}, - {0xfb1d, 0xfb36, 1}, - {0xfb38, 0xfb3c, 1}, - {0xfb3e, 0xfb40, 2}, - {0xfb41, 0xfb43, 2}, - {0xfb44, 0xfb46, 2}, - {0xfb47, 0xfbc1, 1}, - {0xfbd3, 0xfd3f, 1}, - {0xfd50, 0xfd8f, 1}, - {0xfd92, 0xfdc7, 1}, - {0xfdf0, 0xfdfd, 1}, - {0xfe00, 0xfe19, 1}, - {0xfe20, 0xfe2d, 1}, - {0xfe30, 0xfe52, 1}, - {0xfe54, 0xfe66, 1}, - {0xfe68, 0xfe6b, 1}, - {0xfe70, 0xfe74, 1}, - {0xfe76, 0xfefc, 1}, - {0xfeff, 0xff01, 2}, - {0xff02, 0xffbe, 1}, - {0xffc2, 0xffc7, 1}, - {0xffca, 0xffcf, 1}, - {0xffd2, 0xffd7, 1}, - {0xffda, 0xffdc, 1}, - {0xffe0, 0xffe6, 1}, - {0xffe8, 0xffee, 1}, - {0xfff9, 0xfffd, 1}, - }, - R32: []unicode.Range32{ - {0x00010000, 0x0001000b, 1}, - {0x0001000d, 0x00010026, 1}, - {0x00010028, 0x0001003a, 1}, - {0x0001003c, 0x0001003d, 1}, - {0x0001003f, 0x0001004d, 1}, - {0x00010050, 0x0001005d, 1}, - {0x00010080, 0x000100fa, 1}, - {0x00010100, 0x00010102, 1}, - {0x00010107, 0x00010133, 1}, - {0x00010137, 0x0001018c, 1}, - {0x00010190, 0x0001019b, 1}, - {0x000101a0, 0x000101d0, 48}, - {0x000101d1, 0x000101fd, 1}, - {0x00010280, 0x0001029c, 1}, - {0x000102a0, 0x000102d0, 1}, - {0x000102e0, 0x000102fb, 1}, - {0x00010300, 0x00010323, 1}, - {0x00010330, 0x0001034a, 1}, - {0x00010350, 0x0001037a, 1}, - {0x00010380, 0x0001039d, 1}, - {0x0001039f, 0x000103c3, 1}, - {0x000103c8, 0x000103d5, 1}, - {0x00010400, 0x0001049d, 1}, - {0x000104a0, 0x000104a9, 1}, - {0x00010500, 0x00010527, 1}, - {0x00010530, 0x00010563, 1}, - {0x0001056f, 0x00010600, 145}, - {0x00010601, 0x00010736, 1}, - {0x00010740, 0x00010755, 1}, - {0x00010760, 0x00010767, 1}, - {0x00010800, 0x00010805, 1}, - {0x00010808, 0x0001080a, 2}, - {0x0001080b, 0x00010835, 1}, - {0x00010837, 0x00010838, 1}, - {0x0001083c, 0x0001083f, 3}, - {0x00010840, 0x00010855, 1}, - {0x00010857, 0x0001089e, 1}, - {0x000108a7, 0x000108af, 1}, - {0x00010900, 0x0001091b, 1}, - {0x0001091f, 0x00010939, 1}, - {0x0001093f, 0x00010980, 65}, - {0x00010981, 0x000109b7, 1}, - {0x000109be, 0x000109bf, 1}, - {0x00010a00, 0x00010a03, 1}, - {0x00010a05, 0x00010a06, 1}, - {0x00010a0c, 0x00010a13, 1}, - {0x00010a15, 0x00010a17, 1}, - {0x00010a19, 0x00010a33, 1}, - {0x00010a38, 0x00010a3a, 1}, - {0x00010a3f, 0x00010a47, 1}, - {0x00010a50, 0x00010a58, 1}, - {0x00010a60, 0x00010a9f, 1}, - {0x00010ac0, 0x00010ae6, 1}, - {0x00010aeb, 0x00010af6, 1}, - {0x00010b00, 0x00010b35, 1}, - {0x00010b39, 0x00010b55, 1}, - {0x00010b58, 0x00010b72, 1}, - {0x00010b78, 0x00010b91, 1}, - {0x00010b99, 0x00010b9c, 1}, - {0x00010ba9, 0x00010baf, 1}, - {0x00010c00, 0x00010c48, 1}, - {0x00010e60, 0x00010e7e, 1}, - {0x00011000, 0x0001104d, 1}, - {0x00011052, 0x0001106f, 1}, - {0x0001107f, 0x000110c1, 1}, - {0x000110d0, 0x000110e8, 1}, - {0x000110f0, 0x000110f9, 1}, - {0x00011100, 0x00011134, 1}, - {0x00011136, 0x00011143, 1}, - {0x00011150, 0x00011176, 1}, - {0x00011180, 0x000111c8, 1}, - {0x000111cd, 0x000111d0, 3}, - {0x000111d1, 0x000111da, 1}, - {0x000111e1, 0x000111f4, 1}, - {0x00011200, 0x00011211, 1}, - {0x00011213, 0x0001123d, 1}, - {0x000112b0, 0x000112ea, 1}, - {0x000112f0, 0x000112f9, 1}, - {0x00011301, 0x00011303, 1}, - {0x00011305, 0x0001130c, 1}, - {0x0001130f, 0x00011310, 1}, - {0x00011313, 0x00011328, 1}, - {0x0001132a, 0x00011330, 1}, - {0x00011332, 0x00011333, 1}, - {0x00011335, 0x00011339, 1}, - {0x0001133c, 0x00011344, 1}, - {0x00011347, 0x00011348, 1}, - {0x0001134b, 0x0001134d, 1}, - {0x00011357, 0x0001135d, 6}, - {0x0001135e, 0x00011363, 1}, - {0x00011366, 0x0001136c, 1}, - {0x00011370, 0x00011374, 1}, - {0x00011480, 0x000114c7, 1}, - {0x000114d0, 0x000114d9, 1}, - {0x00011580, 0x000115b5, 1}, - {0x000115b8, 0x000115c9, 1}, - {0x00011600, 0x00011644, 1}, - {0x00011650, 0x00011659, 1}, - {0x00011680, 0x000116b7, 1}, - {0x000116c0, 0x000116c9, 1}, - {0x000118a0, 0x000118f2, 1}, - {0x000118ff, 0x00011ac0, 449}, - {0x00011ac1, 0x00011af8, 1}, - {0x00012000, 0x00012398, 1}, - {0x00012400, 0x0001246e, 1}, - {0x00012470, 0x00012474, 1}, - {0x00013000, 0x0001342e, 1}, - {0x00016800, 0x00016a38, 1}, - {0x00016a40, 0x00016a5e, 1}, - {0x00016a60, 0x00016a69, 1}, - {0x00016a6e, 0x00016a6f, 1}, - {0x00016ad0, 0x00016aed, 1}, - {0x00016af0, 0x00016af5, 1}, - {0x00016b00, 0x00016b45, 1}, - {0x00016b50, 0x00016b59, 1}, - {0x00016b5b, 0x00016b61, 1}, - {0x00016b63, 0x00016b77, 1}, - {0x00016b7d, 0x00016b8f, 1}, - {0x00016f00, 0x00016f44, 1}, - {0x00016f50, 0x00016f7e, 1}, - {0x00016f8f, 0x00016f9f, 1}, - {0x0001b000, 0x0001b001, 1}, - {0x0001bc00, 0x0001bc6a, 1}, - {0x0001bc70, 0x0001bc7c, 1}, - {0x0001bc80, 0x0001bc88, 1}, - {0x0001bc90, 0x0001bc99, 1}, - {0x0001bc9c, 0x0001bca3, 1}, - {0x0001d000, 0x0001d0f5, 1}, - {0x0001d100, 0x0001d126, 1}, - {0x0001d129, 0x0001d1dd, 1}, - {0x0001d200, 0x0001d245, 1}, - {0x0001d300, 0x0001d356, 1}, - {0x0001d360, 0x0001d371, 1}, - {0x0001d400, 0x0001d454, 1}, - {0x0001d456, 0x0001d49c, 1}, - {0x0001d49e, 0x0001d49f, 1}, - {0x0001d4a2, 0x0001d4a5, 3}, - {0x0001d4a6, 0x0001d4a9, 3}, - {0x0001d4aa, 0x0001d4ac, 1}, - {0x0001d4ae, 0x0001d4b9, 1}, - {0x0001d4bb, 0x0001d4bd, 2}, - {0x0001d4be, 0x0001d4c3, 1}, - {0x0001d4c5, 0x0001d505, 1}, - {0x0001d507, 0x0001d50a, 1}, - {0x0001d50d, 0x0001d514, 1}, - {0x0001d516, 0x0001d51c, 1}, - {0x0001d51e, 0x0001d539, 1}, - {0x0001d53b, 0x0001d53e, 1}, - {0x0001d540, 0x0001d544, 1}, - {0x0001d546, 0x0001d54a, 4}, - {0x0001d54b, 0x0001d550, 1}, - {0x0001d552, 0x0001d6a5, 1}, - {0x0001d6a8, 0x0001d7cb, 1}, - {0x0001d7ce, 0x0001d7ff, 1}, - {0x0001e800, 0x0001e8c4, 1}, - {0x0001e8c7, 0x0001e8d6, 1}, - {0x0001ee00, 0x0001ee03, 1}, - {0x0001ee05, 0x0001ee1f, 1}, - {0x0001ee21, 0x0001ee22, 1}, - {0x0001ee24, 0x0001ee27, 3}, - {0x0001ee29, 0x0001ee32, 1}, - {0x0001ee34, 0x0001ee37, 1}, - {0x0001ee39, 0x0001ee3b, 2}, - {0x0001ee42, 0x0001ee47, 5}, - {0x0001ee49, 0x0001ee4d, 2}, - {0x0001ee4e, 0x0001ee4f, 1}, - {0x0001ee51, 0x0001ee52, 1}, - {0x0001ee54, 0x0001ee57, 3}, - {0x0001ee59, 0x0001ee61, 2}, - {0x0001ee62, 0x0001ee64, 2}, - {0x0001ee67, 0x0001ee6a, 1}, - {0x0001ee6c, 0x0001ee72, 1}, - {0x0001ee74, 0x0001ee77, 1}, - {0x0001ee79, 0x0001ee7c, 1}, - {0x0001ee7e, 0x0001ee80, 2}, - {0x0001ee81, 0x0001ee89, 1}, - {0x0001ee8b, 0x0001ee9b, 1}, - {0x0001eea1, 0x0001eea3, 1}, - {0x0001eea5, 0x0001eea9, 1}, - {0x0001eeab, 0x0001eebb, 1}, - {0x0001eef0, 0x0001eef1, 1}, - {0x0001f000, 0x0001f02b, 1}, - {0x0001f030, 0x0001f093, 1}, - {0x0001f0a0, 0x0001f0ae, 1}, - {0x0001f0b1, 0x0001f0bf, 1}, - {0x0001f0c1, 0x0001f0cf, 1}, - {0x0001f0d1, 0x0001f0f5, 1}, - {0x0001f100, 0x0001f10c, 1}, - {0x0001f110, 0x0001f12e, 1}, - {0x0001f130, 0x0001f16b, 1}, - {0x0001f170, 0x0001f19a, 1}, - {0x0001f1e6, 0x0001f202, 1}, - {0x0001f210, 0x0001f23a, 1}, - {0x0001f240, 0x0001f248, 1}, - {0x0001f250, 0x0001f251, 1}, - {0x0001f300, 0x0001f32c, 1}, - {0x0001f330, 0x0001f37d, 1}, - {0x0001f380, 0x0001f3ce, 1}, - {0x0001f3d4, 0x0001f3f7, 1}, - {0x0001f400, 0x0001f4fe, 1}, - {0x0001f500, 0x0001f54a, 1}, - {0x0001f550, 0x0001f579, 1}, - {0x0001f57b, 0x0001f5a3, 1}, - {0x0001f5a5, 0x0001f642, 1}, - {0x0001f645, 0x0001f6cf, 1}, - {0x0001f6e0, 0x0001f6ec, 1}, - {0x0001f6f0, 0x0001f6f3, 1}, - {0x0001f700, 0x0001f773, 1}, - {0x0001f780, 0x0001f7d4, 1}, - {0x0001f800, 0x0001f80b, 1}, - {0x0001f810, 0x0001f847, 1}, - {0x0001f850, 0x0001f859, 1}, - {0x0001f860, 0x0001f887, 1}, - {0x0001f890, 0x0001f8ad, 1}, - {0x00020000, 0x0002a6d6, 1}, - {0x0002a700, 0x0002b734, 1}, - {0x0002b740, 0x0002b81d, 1}, - {0x0002f800, 0x0002fa1d, 1}, - {0x000e0001, 0x000e0020, 31}, - {0x000e0021, 0x000e007f, 1}, - {0x000e0100, 0x000e01ef, 1}, - {0x000f0000, 0x000ffffd, 1}, - {0x00100000, 0x0010fffd, 1}, - }, - LatinOffset: 0, -} - -// size 5048 bytes (4 KiB) -var assigned8_0_0 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x0000, 0x0377, 1}, - {0x037a, 0x037f, 1}, - {0x0384, 0x038a, 1}, - {0x038c, 0x038e, 2}, - {0x038f, 0x03a1, 1}, - {0x03a3, 0x052f, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x055f, 1}, - {0x0561, 0x0587, 1}, - {0x0589, 0x058a, 1}, - {0x058d, 0x058f, 1}, - {0x0591, 0x05c7, 1}, - {0x05d0, 0x05ea, 1}, - {0x05f0, 0x05f4, 1}, - {0x0600, 0x061c, 1}, - {0x061e, 0x070d, 1}, - {0x070f, 0x074a, 1}, - {0x074d, 0x07b1, 1}, - {0x07c0, 0x07fa, 1}, - {0x0800, 0x082d, 1}, - {0x0830, 0x083e, 1}, - {0x0840, 0x085b, 1}, - {0x085e, 0x08a0, 66}, - {0x08a1, 0x08b4, 1}, - {0x08e3, 0x0983, 1}, - {0x0985, 0x098c, 1}, - {0x098f, 0x0990, 1}, - {0x0993, 0x09a8, 1}, - {0x09aa, 0x09b0, 1}, - {0x09b2, 0x09b6, 4}, - {0x09b7, 0x09b9, 1}, - {0x09bc, 0x09c4, 1}, - {0x09c7, 0x09c8, 1}, - {0x09cb, 0x09ce, 1}, - {0x09d7, 0x09dc, 5}, - {0x09dd, 0x09df, 2}, - {0x09e0, 0x09e3, 1}, - {0x09e6, 0x09fb, 1}, - {0x0a01, 0x0a03, 1}, - {0x0a05, 0x0a0a, 1}, - {0x0a0f, 0x0a10, 1}, - {0x0a13, 0x0a28, 1}, - {0x0a2a, 0x0a30, 1}, - {0x0a32, 0x0a33, 1}, - {0x0a35, 0x0a36, 1}, - {0x0a38, 0x0a39, 1}, - {0x0a3c, 0x0a3e, 2}, - {0x0a3f, 0x0a42, 1}, - {0x0a47, 0x0a48, 1}, - {0x0a4b, 0x0a4d, 1}, - {0x0a51, 0x0a59, 8}, - {0x0a5a, 0x0a5c, 1}, - {0x0a5e, 0x0a66, 8}, - {0x0a67, 0x0a75, 1}, - {0x0a81, 0x0a83, 1}, - {0x0a85, 0x0a8d, 1}, - {0x0a8f, 0x0a91, 1}, - {0x0a93, 0x0aa8, 1}, - {0x0aaa, 0x0ab0, 1}, - {0x0ab2, 0x0ab3, 1}, - {0x0ab5, 0x0ab9, 1}, - {0x0abc, 0x0ac5, 1}, - {0x0ac7, 0x0ac9, 1}, - {0x0acb, 0x0acd, 1}, - {0x0ad0, 0x0ae0, 16}, - {0x0ae1, 0x0ae3, 1}, - {0x0ae6, 0x0af1, 1}, - {0x0af9, 0x0b01, 8}, - {0x0b02, 0x0b03, 1}, - {0x0b05, 0x0b0c, 1}, - {0x0b0f, 0x0b10, 1}, - {0x0b13, 0x0b28, 1}, - {0x0b2a, 0x0b30, 1}, - {0x0b32, 0x0b33, 1}, - {0x0b35, 0x0b39, 1}, - {0x0b3c, 0x0b44, 1}, - {0x0b47, 0x0b48, 1}, - {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, - {0x0b5c, 0x0b5d, 1}, - {0x0b5f, 0x0b63, 1}, - {0x0b66, 0x0b77, 1}, - {0x0b82, 0x0b83, 1}, - {0x0b85, 0x0b8a, 1}, - {0x0b8e, 0x0b90, 1}, - {0x0b92, 0x0b95, 1}, - {0x0b99, 0x0b9a, 1}, - {0x0b9c, 0x0b9e, 2}, - {0x0b9f, 0x0ba3, 4}, - {0x0ba4, 0x0ba8, 4}, - {0x0ba9, 0x0baa, 1}, - {0x0bae, 0x0bb9, 1}, - {0x0bbe, 0x0bc2, 1}, - {0x0bc6, 0x0bc8, 1}, - {0x0bca, 0x0bcd, 1}, - {0x0bd0, 0x0bd7, 7}, - {0x0be6, 0x0bfa, 1}, - {0x0c00, 0x0c03, 1}, - {0x0c05, 0x0c0c, 1}, - {0x0c0e, 0x0c10, 1}, - {0x0c12, 0x0c28, 1}, - {0x0c2a, 0x0c39, 1}, - {0x0c3d, 0x0c44, 1}, - {0x0c46, 0x0c48, 1}, - {0x0c4a, 0x0c4d, 1}, - {0x0c55, 0x0c56, 1}, - {0x0c58, 0x0c5a, 1}, - {0x0c60, 0x0c63, 1}, - {0x0c66, 0x0c6f, 1}, - {0x0c78, 0x0c7f, 1}, - {0x0c81, 0x0c83, 1}, - {0x0c85, 0x0c8c, 1}, - {0x0c8e, 0x0c90, 1}, - {0x0c92, 0x0ca8, 1}, - {0x0caa, 0x0cb3, 1}, - {0x0cb5, 0x0cb9, 1}, - {0x0cbc, 0x0cc4, 1}, - {0x0cc6, 0x0cc8, 1}, - {0x0cca, 0x0ccd, 1}, - {0x0cd5, 0x0cd6, 1}, - {0x0cde, 0x0ce0, 2}, - {0x0ce1, 0x0ce3, 1}, - {0x0ce6, 0x0cef, 1}, - {0x0cf1, 0x0cf2, 1}, - {0x0d01, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, - {0x0d0e, 0x0d10, 1}, - {0x0d12, 0x0d3a, 1}, - {0x0d3d, 0x0d44, 1}, - {0x0d46, 0x0d48, 1}, - {0x0d4a, 0x0d4e, 1}, - {0x0d57, 0x0d5f, 8}, - {0x0d60, 0x0d63, 1}, - {0x0d66, 0x0d75, 1}, - {0x0d79, 0x0d7f, 1}, - {0x0d82, 0x0d83, 1}, - {0x0d85, 0x0d96, 1}, - {0x0d9a, 0x0db1, 1}, - {0x0db3, 0x0dbb, 1}, - {0x0dbd, 0x0dc0, 3}, - {0x0dc1, 0x0dc6, 1}, - {0x0dca, 0x0dcf, 5}, - {0x0dd0, 0x0dd4, 1}, - {0x0dd6, 0x0dd8, 2}, - {0x0dd9, 0x0ddf, 1}, - {0x0de6, 0x0def, 1}, - {0x0df2, 0x0df4, 1}, - {0x0e01, 0x0e3a, 1}, - {0x0e3f, 0x0e5b, 1}, - {0x0e81, 0x0e82, 1}, - {0x0e84, 0x0e87, 3}, - {0x0e88, 0x0e8a, 2}, - {0x0e8d, 0x0e94, 7}, - {0x0e95, 0x0e97, 1}, - {0x0e99, 0x0e9f, 1}, - {0x0ea1, 0x0ea3, 1}, - {0x0ea5, 0x0ea7, 2}, - {0x0eaa, 0x0eab, 1}, - {0x0ead, 0x0eb9, 1}, - {0x0ebb, 0x0ebd, 1}, - {0x0ec0, 0x0ec4, 1}, - {0x0ec6, 0x0ec8, 2}, - {0x0ec9, 0x0ecd, 1}, - {0x0ed0, 0x0ed9, 1}, - {0x0edc, 0x0edf, 1}, - {0x0f00, 0x0f47, 1}, - {0x0f49, 0x0f6c, 1}, - {0x0f71, 0x0f97, 1}, - {0x0f99, 0x0fbc, 1}, - {0x0fbe, 0x0fcc, 1}, - {0x0fce, 0x0fda, 1}, - {0x1000, 0x10c5, 1}, - {0x10c7, 0x10cd, 6}, - {0x10d0, 0x1248, 1}, - {0x124a, 0x124d, 1}, - {0x1250, 0x1256, 1}, - {0x1258, 0x125a, 2}, - {0x125b, 0x125d, 1}, - {0x1260, 0x1288, 1}, - {0x128a, 0x128d, 1}, - {0x1290, 0x12b0, 1}, - {0x12b2, 0x12b5, 1}, - {0x12b8, 0x12be, 1}, - {0x12c0, 0x12c2, 2}, - {0x12c3, 0x12c5, 1}, - {0x12c8, 0x12d6, 1}, - {0x12d8, 0x1310, 1}, - {0x1312, 0x1315, 1}, - {0x1318, 0x135a, 1}, - {0x135d, 0x137c, 1}, - {0x1380, 0x1399, 1}, - {0x13a0, 0x13f5, 1}, - {0x13f8, 0x13fd, 1}, - {0x1400, 0x169c, 1}, - {0x16a0, 0x16f8, 1}, - {0x1700, 0x170c, 1}, - {0x170e, 0x1714, 1}, - {0x1720, 0x1736, 1}, - {0x1740, 0x1753, 1}, - {0x1760, 0x176c, 1}, - {0x176e, 0x1770, 1}, - {0x1772, 0x1773, 1}, - {0x1780, 0x17dd, 1}, - {0x17e0, 0x17e9, 1}, - {0x17f0, 0x17f9, 1}, - {0x1800, 0x180e, 1}, - {0x1810, 0x1819, 1}, - {0x1820, 0x1877, 1}, - {0x1880, 0x18aa, 1}, - {0x18b0, 0x18f5, 1}, - {0x1900, 0x191e, 1}, - {0x1920, 0x192b, 1}, - {0x1930, 0x193b, 1}, - {0x1940, 0x1944, 4}, - {0x1945, 0x196d, 1}, - {0x1970, 0x1974, 1}, - {0x1980, 0x19ab, 1}, - {0x19b0, 0x19c9, 1}, - {0x19d0, 0x19da, 1}, - {0x19de, 0x1a1b, 1}, - {0x1a1e, 0x1a5e, 1}, - {0x1a60, 0x1a7c, 1}, - {0x1a7f, 0x1a89, 1}, - {0x1a90, 0x1a99, 1}, - {0x1aa0, 0x1aad, 1}, - {0x1ab0, 0x1abe, 1}, - {0x1b00, 0x1b4b, 1}, - {0x1b50, 0x1b7c, 1}, - {0x1b80, 0x1bf3, 1}, - {0x1bfc, 0x1c37, 1}, - {0x1c3b, 0x1c49, 1}, - {0x1c4d, 0x1c7f, 1}, - {0x1cc0, 0x1cc7, 1}, - {0x1cd0, 0x1cf6, 1}, - {0x1cf8, 0x1cf9, 1}, - {0x1d00, 0x1df5, 1}, - {0x1dfc, 0x1f15, 1}, - {0x1f18, 0x1f1d, 1}, - {0x1f20, 0x1f45, 1}, - {0x1f48, 0x1f4d, 1}, - {0x1f50, 0x1f57, 1}, - {0x1f59, 0x1f5f, 2}, - {0x1f60, 0x1f7d, 1}, - {0x1f80, 0x1fb4, 1}, - {0x1fb6, 0x1fc4, 1}, - {0x1fc6, 0x1fd3, 1}, - {0x1fd6, 0x1fdb, 1}, - {0x1fdd, 0x1fef, 1}, - {0x1ff2, 0x1ff4, 1}, - {0x1ff6, 0x1ffe, 1}, - {0x2000, 0x2064, 1}, - {0x2066, 0x2071, 1}, - {0x2074, 0x208e, 1}, - {0x2090, 0x209c, 1}, - {0x20a0, 0x20be, 1}, - {0x20d0, 0x20f0, 1}, - {0x2100, 0x218b, 1}, - {0x2190, 0x23fa, 1}, - {0x2400, 0x2426, 1}, - {0x2440, 0x244a, 1}, - {0x2460, 0x2b73, 1}, - {0x2b76, 0x2b95, 1}, - {0x2b98, 0x2bb9, 1}, - {0x2bbd, 0x2bc8, 1}, - {0x2bca, 0x2bd1, 1}, - {0x2bec, 0x2bef, 1}, - {0x2c00, 0x2c2e, 1}, - {0x2c30, 0x2c5e, 1}, - {0x2c60, 0x2cf3, 1}, - {0x2cf9, 0x2d25, 1}, - {0x2d27, 0x2d2d, 6}, - {0x2d30, 0x2d67, 1}, - {0x2d6f, 0x2d70, 1}, - {0x2d7f, 0x2d96, 1}, - {0x2da0, 0x2da6, 1}, - {0x2da8, 0x2dae, 1}, - {0x2db0, 0x2db6, 1}, - {0x2db8, 0x2dbe, 1}, - {0x2dc0, 0x2dc6, 1}, - {0x2dc8, 0x2dce, 1}, - {0x2dd0, 0x2dd6, 1}, - {0x2dd8, 0x2dde, 1}, - {0x2de0, 0x2e42, 1}, - {0x2e80, 0x2e99, 1}, - {0x2e9b, 0x2ef3, 1}, - {0x2f00, 0x2fd5, 1}, - {0x2ff0, 0x2ffb, 1}, - {0x3000, 0x303f, 1}, - {0x3041, 0x3096, 1}, - {0x3099, 0x30ff, 1}, - {0x3105, 0x312d, 1}, - {0x3131, 0x318e, 1}, - {0x3190, 0x31ba, 1}, - {0x31c0, 0x31e3, 1}, - {0x31f0, 0x321e, 1}, - {0x3220, 0x32fe, 1}, - {0x3300, 0x4db5, 1}, - {0x4dc0, 0x9fd5, 1}, - {0xa000, 0xa48c, 1}, - {0xa490, 0xa4c6, 1}, - {0xa4d0, 0xa62b, 1}, - {0xa640, 0xa6f7, 1}, - {0xa700, 0xa7ad, 1}, - {0xa7b0, 0xa7b7, 1}, - {0xa7f7, 0xa82b, 1}, - {0xa830, 0xa839, 1}, - {0xa840, 0xa877, 1}, - {0xa880, 0xa8c4, 1}, - {0xa8ce, 0xa8d9, 1}, - {0xa8e0, 0xa8fd, 1}, - {0xa900, 0xa953, 1}, - {0xa95f, 0xa97c, 1}, - {0xa980, 0xa9cd, 1}, - {0xa9cf, 0xa9d9, 1}, - {0xa9de, 0xa9fe, 1}, - {0xaa00, 0xaa36, 1}, - {0xaa40, 0xaa4d, 1}, - {0xaa50, 0xaa59, 1}, - {0xaa5c, 0xaac2, 1}, - {0xaadb, 0xaaf6, 1}, - {0xab01, 0xab06, 1}, - {0xab09, 0xab0e, 1}, - {0xab11, 0xab16, 1}, - {0xab20, 0xab26, 1}, - {0xab28, 0xab2e, 1}, - {0xab30, 0xab65, 1}, - {0xab70, 0xabed, 1}, - {0xabf0, 0xabf9, 1}, - {0xac00, 0xd7a3, 1}, - {0xd7b0, 0xd7c6, 1}, - {0xd7cb, 0xd7fb, 1}, - {0xd800, 0xfa6d, 1}, - {0xfa70, 0xfad9, 1}, - {0xfb00, 0xfb06, 1}, - {0xfb13, 0xfb17, 1}, - {0xfb1d, 0xfb36, 1}, - {0xfb38, 0xfb3c, 1}, - {0xfb3e, 0xfb40, 2}, - {0xfb41, 0xfb43, 2}, - {0xfb44, 0xfb46, 2}, - {0xfb47, 0xfbc1, 1}, - {0xfbd3, 0xfd3f, 1}, - {0xfd50, 0xfd8f, 1}, - {0xfd92, 0xfdc7, 1}, - {0xfdf0, 0xfdfd, 1}, - {0xfe00, 0xfe19, 1}, - {0xfe20, 0xfe52, 1}, - {0xfe54, 0xfe66, 1}, - {0xfe68, 0xfe6b, 1}, - {0xfe70, 0xfe74, 1}, - {0xfe76, 0xfefc, 1}, - {0xfeff, 0xff01, 2}, - {0xff02, 0xffbe, 1}, - {0xffc2, 0xffc7, 1}, - {0xffca, 0xffcf, 1}, - {0xffd2, 0xffd7, 1}, - {0xffda, 0xffdc, 1}, - {0xffe0, 0xffe6, 1}, - {0xffe8, 0xffee, 1}, - {0xfff9, 0xfffd, 1}, - }, - R32: []unicode.Range32{ - {0x00010000, 0x0001000b, 1}, - {0x0001000d, 0x00010026, 1}, - {0x00010028, 0x0001003a, 1}, - {0x0001003c, 0x0001003d, 1}, - {0x0001003f, 0x0001004d, 1}, - {0x00010050, 0x0001005d, 1}, - {0x00010080, 0x000100fa, 1}, - {0x00010100, 0x00010102, 1}, - {0x00010107, 0x00010133, 1}, - {0x00010137, 0x0001018c, 1}, - {0x00010190, 0x0001019b, 1}, - {0x000101a0, 0x000101d0, 48}, - {0x000101d1, 0x000101fd, 1}, - {0x00010280, 0x0001029c, 1}, - {0x000102a0, 0x000102d0, 1}, - {0x000102e0, 0x000102fb, 1}, - {0x00010300, 0x00010323, 1}, - {0x00010330, 0x0001034a, 1}, - {0x00010350, 0x0001037a, 1}, - {0x00010380, 0x0001039d, 1}, - {0x0001039f, 0x000103c3, 1}, - {0x000103c8, 0x000103d5, 1}, - {0x00010400, 0x0001049d, 1}, - {0x000104a0, 0x000104a9, 1}, - {0x00010500, 0x00010527, 1}, - {0x00010530, 0x00010563, 1}, - {0x0001056f, 0x00010600, 145}, - {0x00010601, 0x00010736, 1}, - {0x00010740, 0x00010755, 1}, - {0x00010760, 0x00010767, 1}, - {0x00010800, 0x00010805, 1}, - {0x00010808, 0x0001080a, 2}, - {0x0001080b, 0x00010835, 1}, - {0x00010837, 0x00010838, 1}, - {0x0001083c, 0x0001083f, 3}, - {0x00010840, 0x00010855, 1}, - {0x00010857, 0x0001089e, 1}, - {0x000108a7, 0x000108af, 1}, - {0x000108e0, 0x000108f2, 1}, - {0x000108f4, 0x000108f5, 1}, - {0x000108fb, 0x0001091b, 1}, - {0x0001091f, 0x00010939, 1}, - {0x0001093f, 0x00010980, 65}, - {0x00010981, 0x000109b7, 1}, - {0x000109bc, 0x000109cf, 1}, - {0x000109d2, 0x00010a03, 1}, - {0x00010a05, 0x00010a06, 1}, - {0x00010a0c, 0x00010a13, 1}, - {0x00010a15, 0x00010a17, 1}, - {0x00010a19, 0x00010a33, 1}, - {0x00010a38, 0x00010a3a, 1}, - {0x00010a3f, 0x00010a47, 1}, - {0x00010a50, 0x00010a58, 1}, - {0x00010a60, 0x00010a9f, 1}, - {0x00010ac0, 0x00010ae6, 1}, - {0x00010aeb, 0x00010af6, 1}, - {0x00010b00, 0x00010b35, 1}, - {0x00010b39, 0x00010b55, 1}, - {0x00010b58, 0x00010b72, 1}, - {0x00010b78, 0x00010b91, 1}, - {0x00010b99, 0x00010b9c, 1}, - {0x00010ba9, 0x00010baf, 1}, - {0x00010c00, 0x00010c48, 1}, - {0x00010c80, 0x00010cb2, 1}, - {0x00010cc0, 0x00010cf2, 1}, - {0x00010cfa, 0x00010cff, 1}, - {0x00010e60, 0x00010e7e, 1}, - {0x00011000, 0x0001104d, 1}, - {0x00011052, 0x0001106f, 1}, - {0x0001107f, 0x000110c1, 1}, - {0x000110d0, 0x000110e8, 1}, - {0x000110f0, 0x000110f9, 1}, - {0x00011100, 0x00011134, 1}, - {0x00011136, 0x00011143, 1}, - {0x00011150, 0x00011176, 1}, - {0x00011180, 0x000111cd, 1}, - {0x000111d0, 0x000111df, 1}, - {0x000111e1, 0x000111f4, 1}, - {0x00011200, 0x00011211, 1}, - {0x00011213, 0x0001123d, 1}, - {0x00011280, 0x00011286, 1}, - {0x00011288, 0x0001128a, 2}, - {0x0001128b, 0x0001128d, 1}, - {0x0001128f, 0x0001129d, 1}, - {0x0001129f, 0x000112a9, 1}, - {0x000112b0, 0x000112ea, 1}, - {0x000112f0, 0x000112f9, 1}, - {0x00011300, 0x00011303, 1}, - {0x00011305, 0x0001130c, 1}, - {0x0001130f, 0x00011310, 1}, - {0x00011313, 0x00011328, 1}, - {0x0001132a, 0x00011330, 1}, - {0x00011332, 0x00011333, 1}, - {0x00011335, 0x00011339, 1}, - {0x0001133c, 0x00011344, 1}, - {0x00011347, 0x00011348, 1}, - {0x0001134b, 0x0001134d, 1}, - {0x00011350, 0x00011357, 7}, - {0x0001135d, 0x00011363, 1}, - {0x00011366, 0x0001136c, 1}, - {0x00011370, 0x00011374, 1}, - {0x00011480, 0x000114c7, 1}, - {0x000114d0, 0x000114d9, 1}, - {0x00011580, 0x000115b5, 1}, - {0x000115b8, 0x000115dd, 1}, - {0x00011600, 0x00011644, 1}, - {0x00011650, 0x00011659, 1}, - {0x00011680, 0x000116b7, 1}, - {0x000116c0, 0x000116c9, 1}, - {0x00011700, 0x00011719, 1}, - {0x0001171d, 0x0001172b, 1}, - {0x00011730, 0x0001173f, 1}, - {0x000118a0, 0x000118f2, 1}, - {0x000118ff, 0x00011ac0, 449}, - {0x00011ac1, 0x00011af8, 1}, - {0x00012000, 0x00012399, 1}, - {0x00012400, 0x0001246e, 1}, - {0x00012470, 0x00012474, 1}, - {0x00012480, 0x00012543, 1}, - {0x00013000, 0x0001342e, 1}, - {0x00014400, 0x00014646, 1}, - {0x00016800, 0x00016a38, 1}, - {0x00016a40, 0x00016a5e, 1}, - {0x00016a60, 0x00016a69, 1}, - {0x00016a6e, 0x00016a6f, 1}, - {0x00016ad0, 0x00016aed, 1}, - {0x00016af0, 0x00016af5, 1}, - {0x00016b00, 0x00016b45, 1}, - {0x00016b50, 0x00016b59, 1}, - {0x00016b5b, 0x00016b61, 1}, - {0x00016b63, 0x00016b77, 1}, - {0x00016b7d, 0x00016b8f, 1}, - {0x00016f00, 0x00016f44, 1}, - {0x00016f50, 0x00016f7e, 1}, - {0x00016f8f, 0x00016f9f, 1}, - {0x0001b000, 0x0001b001, 1}, - {0x0001bc00, 0x0001bc6a, 1}, - {0x0001bc70, 0x0001bc7c, 1}, - {0x0001bc80, 0x0001bc88, 1}, - {0x0001bc90, 0x0001bc99, 1}, - {0x0001bc9c, 0x0001bca3, 1}, - {0x0001d000, 0x0001d0f5, 1}, - {0x0001d100, 0x0001d126, 1}, - {0x0001d129, 0x0001d1e8, 1}, - {0x0001d200, 0x0001d245, 1}, - {0x0001d300, 0x0001d356, 1}, - {0x0001d360, 0x0001d371, 1}, - {0x0001d400, 0x0001d454, 1}, - {0x0001d456, 0x0001d49c, 1}, - {0x0001d49e, 0x0001d49f, 1}, - {0x0001d4a2, 0x0001d4a5, 3}, - {0x0001d4a6, 0x0001d4a9, 3}, - {0x0001d4aa, 0x0001d4ac, 1}, - {0x0001d4ae, 0x0001d4b9, 1}, - {0x0001d4bb, 0x0001d4bd, 2}, - {0x0001d4be, 0x0001d4c3, 1}, - {0x0001d4c5, 0x0001d505, 1}, - {0x0001d507, 0x0001d50a, 1}, - {0x0001d50d, 0x0001d514, 1}, - {0x0001d516, 0x0001d51c, 1}, - {0x0001d51e, 0x0001d539, 1}, - {0x0001d53b, 0x0001d53e, 1}, - {0x0001d540, 0x0001d544, 1}, - {0x0001d546, 0x0001d54a, 4}, - {0x0001d54b, 0x0001d550, 1}, - {0x0001d552, 0x0001d6a5, 1}, - {0x0001d6a8, 0x0001d7cb, 1}, - {0x0001d7ce, 0x0001da8b, 1}, - {0x0001da9b, 0x0001da9f, 1}, - {0x0001daa1, 0x0001daaf, 1}, - {0x0001e800, 0x0001e8c4, 1}, - {0x0001e8c7, 0x0001e8d6, 1}, - {0x0001ee00, 0x0001ee03, 1}, - {0x0001ee05, 0x0001ee1f, 1}, - {0x0001ee21, 0x0001ee22, 1}, - {0x0001ee24, 0x0001ee27, 3}, - {0x0001ee29, 0x0001ee32, 1}, - {0x0001ee34, 0x0001ee37, 1}, - {0x0001ee39, 0x0001ee3b, 2}, - {0x0001ee42, 0x0001ee47, 5}, - {0x0001ee49, 0x0001ee4d, 2}, - {0x0001ee4e, 0x0001ee4f, 1}, - {0x0001ee51, 0x0001ee52, 1}, - {0x0001ee54, 0x0001ee57, 3}, - {0x0001ee59, 0x0001ee61, 2}, - {0x0001ee62, 0x0001ee64, 2}, - {0x0001ee67, 0x0001ee6a, 1}, - {0x0001ee6c, 0x0001ee72, 1}, - {0x0001ee74, 0x0001ee77, 1}, - {0x0001ee79, 0x0001ee7c, 1}, - {0x0001ee7e, 0x0001ee80, 2}, - {0x0001ee81, 0x0001ee89, 1}, - {0x0001ee8b, 0x0001ee9b, 1}, - {0x0001eea1, 0x0001eea3, 1}, - {0x0001eea5, 0x0001eea9, 1}, - {0x0001eeab, 0x0001eebb, 1}, - {0x0001eef0, 0x0001eef1, 1}, - {0x0001f000, 0x0001f02b, 1}, - {0x0001f030, 0x0001f093, 1}, - {0x0001f0a0, 0x0001f0ae, 1}, - {0x0001f0b1, 0x0001f0bf, 1}, - {0x0001f0c1, 0x0001f0cf, 1}, - {0x0001f0d1, 0x0001f0f5, 1}, - {0x0001f100, 0x0001f10c, 1}, - {0x0001f110, 0x0001f12e, 1}, - {0x0001f130, 0x0001f16b, 1}, - {0x0001f170, 0x0001f19a, 1}, - {0x0001f1e6, 0x0001f202, 1}, - {0x0001f210, 0x0001f23a, 1}, - {0x0001f240, 0x0001f248, 1}, - {0x0001f250, 0x0001f251, 1}, - {0x0001f300, 0x0001f579, 1}, - {0x0001f57b, 0x0001f5a3, 1}, - {0x0001f5a5, 0x0001f6d0, 1}, - {0x0001f6e0, 0x0001f6ec, 1}, - {0x0001f6f0, 0x0001f6f3, 1}, - {0x0001f700, 0x0001f773, 1}, - {0x0001f780, 0x0001f7d4, 1}, - {0x0001f800, 0x0001f80b, 1}, - {0x0001f810, 0x0001f847, 1}, - {0x0001f850, 0x0001f859, 1}, - {0x0001f860, 0x0001f887, 1}, - {0x0001f890, 0x0001f8ad, 1}, - {0x0001f910, 0x0001f918, 1}, - {0x0001f980, 0x0001f984, 1}, - {0x0001f9c0, 0x00020000, 1600}, - {0x00020001, 0x0002a6d6, 1}, - {0x0002a700, 0x0002b734, 1}, - {0x0002b740, 0x0002b81d, 1}, - {0x0002b820, 0x0002cea1, 1}, - {0x0002f800, 0x0002fa1d, 1}, - {0x000e0001, 0x000e0020, 31}, - {0x000e0021, 0x000e007f, 1}, - {0x000e0100, 0x000e01ef, 1}, - {0x000f0000, 0x000ffffd, 1}, - {0x00100000, 0x0010fffd, 1}, - }, - LatinOffset: 0, -} - -// size 5348 bytes (5 KiB) -var assigned9_0_0 = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x0000, 0x0377, 1}, - {0x037a, 0x037f, 1}, - {0x0384, 0x038a, 1}, - {0x038c, 0x038e, 2}, - {0x038f, 0x03a1, 1}, - {0x03a3, 0x052f, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x055f, 1}, - {0x0561, 0x0587, 1}, - {0x0589, 0x058a, 1}, - {0x058d, 0x058f, 1}, - {0x0591, 0x05c7, 1}, - {0x05d0, 0x05ea, 1}, - {0x05f0, 0x05f4, 1}, - {0x0600, 0x061c, 1}, - {0x061e, 0x070d, 1}, - {0x070f, 0x074a, 1}, - {0x074d, 0x07b1, 1}, - {0x07c0, 0x07fa, 1}, - {0x0800, 0x082d, 1}, - {0x0830, 0x083e, 1}, - {0x0840, 0x085b, 1}, - {0x085e, 0x08a0, 66}, - {0x08a1, 0x08b4, 1}, - {0x08b6, 0x08bd, 1}, - {0x08d4, 0x0983, 1}, - {0x0985, 0x098c, 1}, - {0x098f, 0x0990, 1}, - {0x0993, 0x09a8, 1}, - {0x09aa, 0x09b0, 1}, - {0x09b2, 0x09b6, 4}, - {0x09b7, 0x09b9, 1}, - {0x09bc, 0x09c4, 1}, - {0x09c7, 0x09c8, 1}, - {0x09cb, 0x09ce, 1}, - {0x09d7, 0x09dc, 5}, - {0x09dd, 0x09df, 2}, - {0x09e0, 0x09e3, 1}, - {0x09e6, 0x09fb, 1}, - {0x0a01, 0x0a03, 1}, - {0x0a05, 0x0a0a, 1}, - {0x0a0f, 0x0a10, 1}, - {0x0a13, 0x0a28, 1}, - {0x0a2a, 0x0a30, 1}, - {0x0a32, 0x0a33, 1}, - {0x0a35, 0x0a36, 1}, - {0x0a38, 0x0a39, 1}, - {0x0a3c, 0x0a3e, 2}, - {0x0a3f, 0x0a42, 1}, - {0x0a47, 0x0a48, 1}, - {0x0a4b, 0x0a4d, 1}, - {0x0a51, 0x0a59, 8}, - {0x0a5a, 0x0a5c, 1}, - {0x0a5e, 0x0a66, 8}, - {0x0a67, 0x0a75, 1}, - {0x0a81, 0x0a83, 1}, - {0x0a85, 0x0a8d, 1}, - {0x0a8f, 0x0a91, 1}, - {0x0a93, 0x0aa8, 1}, - {0x0aaa, 0x0ab0, 1}, - {0x0ab2, 0x0ab3, 1}, - {0x0ab5, 0x0ab9, 1}, - {0x0abc, 0x0ac5, 1}, - {0x0ac7, 0x0ac9, 1}, - {0x0acb, 0x0acd, 1}, - {0x0ad0, 0x0ae0, 16}, - {0x0ae1, 0x0ae3, 1}, - {0x0ae6, 0x0af1, 1}, - {0x0af9, 0x0b01, 8}, - {0x0b02, 0x0b03, 1}, - {0x0b05, 0x0b0c, 1}, - {0x0b0f, 0x0b10, 1}, - {0x0b13, 0x0b28, 1}, - {0x0b2a, 0x0b30, 1}, - {0x0b32, 0x0b33, 1}, - {0x0b35, 0x0b39, 1}, - {0x0b3c, 0x0b44, 1}, - {0x0b47, 0x0b48, 1}, - {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, - {0x0b5c, 0x0b5d, 1}, - {0x0b5f, 0x0b63, 1}, - {0x0b66, 0x0b77, 1}, - {0x0b82, 0x0b83, 1}, - {0x0b85, 0x0b8a, 1}, - {0x0b8e, 0x0b90, 1}, - {0x0b92, 0x0b95, 1}, - {0x0b99, 0x0b9a, 1}, - {0x0b9c, 0x0b9e, 2}, - {0x0b9f, 0x0ba3, 4}, - {0x0ba4, 0x0ba8, 4}, - {0x0ba9, 0x0baa, 1}, - {0x0bae, 0x0bb9, 1}, - {0x0bbe, 0x0bc2, 1}, - {0x0bc6, 0x0bc8, 1}, - {0x0bca, 0x0bcd, 1}, - {0x0bd0, 0x0bd7, 7}, - {0x0be6, 0x0bfa, 1}, - {0x0c00, 0x0c03, 1}, - {0x0c05, 0x0c0c, 1}, - {0x0c0e, 0x0c10, 1}, - {0x0c12, 0x0c28, 1}, - {0x0c2a, 0x0c39, 1}, - {0x0c3d, 0x0c44, 1}, - {0x0c46, 0x0c48, 1}, - {0x0c4a, 0x0c4d, 1}, - {0x0c55, 0x0c56, 1}, - {0x0c58, 0x0c5a, 1}, - {0x0c60, 0x0c63, 1}, - {0x0c66, 0x0c6f, 1}, - {0x0c78, 0x0c83, 1}, - {0x0c85, 0x0c8c, 1}, - {0x0c8e, 0x0c90, 1}, - {0x0c92, 0x0ca8, 1}, - {0x0caa, 0x0cb3, 1}, - {0x0cb5, 0x0cb9, 1}, - {0x0cbc, 0x0cc4, 1}, - {0x0cc6, 0x0cc8, 1}, - {0x0cca, 0x0ccd, 1}, - {0x0cd5, 0x0cd6, 1}, - {0x0cde, 0x0ce0, 2}, - {0x0ce1, 0x0ce3, 1}, - {0x0ce6, 0x0cef, 1}, - {0x0cf1, 0x0cf2, 1}, - {0x0d01, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, - {0x0d0e, 0x0d10, 1}, - {0x0d12, 0x0d3a, 1}, - {0x0d3d, 0x0d44, 1}, - {0x0d46, 0x0d48, 1}, - {0x0d4a, 0x0d4f, 1}, - {0x0d54, 0x0d63, 1}, - {0x0d66, 0x0d7f, 1}, - {0x0d82, 0x0d83, 1}, - {0x0d85, 0x0d96, 1}, - {0x0d9a, 0x0db1, 1}, - {0x0db3, 0x0dbb, 1}, - {0x0dbd, 0x0dc0, 3}, - {0x0dc1, 0x0dc6, 1}, - {0x0dca, 0x0dcf, 5}, - {0x0dd0, 0x0dd4, 1}, - {0x0dd6, 0x0dd8, 2}, - {0x0dd9, 0x0ddf, 1}, - {0x0de6, 0x0def, 1}, - {0x0df2, 0x0df4, 1}, - {0x0e01, 0x0e3a, 1}, - {0x0e3f, 0x0e5b, 1}, - {0x0e81, 0x0e82, 1}, - {0x0e84, 0x0e87, 3}, - {0x0e88, 0x0e8a, 2}, - {0x0e8d, 0x0e94, 7}, - {0x0e95, 0x0e97, 1}, - {0x0e99, 0x0e9f, 1}, - {0x0ea1, 0x0ea3, 1}, - {0x0ea5, 0x0ea7, 2}, - {0x0eaa, 0x0eab, 1}, - {0x0ead, 0x0eb9, 1}, - {0x0ebb, 0x0ebd, 1}, - {0x0ec0, 0x0ec4, 1}, - {0x0ec6, 0x0ec8, 2}, - {0x0ec9, 0x0ecd, 1}, - {0x0ed0, 0x0ed9, 1}, - {0x0edc, 0x0edf, 1}, - {0x0f00, 0x0f47, 1}, - {0x0f49, 0x0f6c, 1}, - {0x0f71, 0x0f97, 1}, - {0x0f99, 0x0fbc, 1}, - {0x0fbe, 0x0fcc, 1}, - {0x0fce, 0x0fda, 1}, - {0x1000, 0x10c5, 1}, - {0x10c7, 0x10cd, 6}, - {0x10d0, 0x1248, 1}, - {0x124a, 0x124d, 1}, - {0x1250, 0x1256, 1}, - {0x1258, 0x125a, 2}, - {0x125b, 0x125d, 1}, - {0x1260, 0x1288, 1}, - {0x128a, 0x128d, 1}, - {0x1290, 0x12b0, 1}, - {0x12b2, 0x12b5, 1}, - {0x12b8, 0x12be, 1}, - {0x12c0, 0x12c2, 2}, - {0x12c3, 0x12c5, 1}, - {0x12c8, 0x12d6, 1}, - {0x12d8, 0x1310, 1}, - {0x1312, 0x1315, 1}, - {0x1318, 0x135a, 1}, - {0x135d, 0x137c, 1}, - {0x1380, 0x1399, 1}, - {0x13a0, 0x13f5, 1}, - {0x13f8, 0x13fd, 1}, - {0x1400, 0x169c, 1}, - {0x16a0, 0x16f8, 1}, - {0x1700, 0x170c, 1}, - {0x170e, 0x1714, 1}, - {0x1720, 0x1736, 1}, - {0x1740, 0x1753, 1}, - {0x1760, 0x176c, 1}, - {0x176e, 0x1770, 1}, - {0x1772, 0x1773, 1}, - {0x1780, 0x17dd, 1}, - {0x17e0, 0x17e9, 1}, - {0x17f0, 0x17f9, 1}, - {0x1800, 0x180e, 1}, - {0x1810, 0x1819, 1}, - {0x1820, 0x1877, 1}, - {0x1880, 0x18aa, 1}, - {0x18b0, 0x18f5, 1}, - {0x1900, 0x191e, 1}, - {0x1920, 0x192b, 1}, - {0x1930, 0x193b, 1}, - {0x1940, 0x1944, 4}, - {0x1945, 0x196d, 1}, - {0x1970, 0x1974, 1}, - {0x1980, 0x19ab, 1}, - {0x19b0, 0x19c9, 1}, - {0x19d0, 0x19da, 1}, - {0x19de, 0x1a1b, 1}, - {0x1a1e, 0x1a5e, 1}, - {0x1a60, 0x1a7c, 1}, - {0x1a7f, 0x1a89, 1}, - {0x1a90, 0x1a99, 1}, - {0x1aa0, 0x1aad, 1}, - {0x1ab0, 0x1abe, 1}, - {0x1b00, 0x1b4b, 1}, - {0x1b50, 0x1b7c, 1}, - {0x1b80, 0x1bf3, 1}, - {0x1bfc, 0x1c37, 1}, - {0x1c3b, 0x1c49, 1}, - {0x1c4d, 0x1c88, 1}, - {0x1cc0, 0x1cc7, 1}, - {0x1cd0, 0x1cf6, 1}, - {0x1cf8, 0x1cf9, 1}, - {0x1d00, 0x1df5, 1}, - {0x1dfb, 0x1f15, 1}, - {0x1f18, 0x1f1d, 1}, - {0x1f20, 0x1f45, 1}, - {0x1f48, 0x1f4d, 1}, - {0x1f50, 0x1f57, 1}, - {0x1f59, 0x1f5f, 2}, - {0x1f60, 0x1f7d, 1}, - {0x1f80, 0x1fb4, 1}, - {0x1fb6, 0x1fc4, 1}, - {0x1fc6, 0x1fd3, 1}, - {0x1fd6, 0x1fdb, 1}, - {0x1fdd, 0x1fef, 1}, - {0x1ff2, 0x1ff4, 1}, - {0x1ff6, 0x1ffe, 1}, - {0x2000, 0x2064, 1}, - {0x2066, 0x2071, 1}, - {0x2074, 0x208e, 1}, - {0x2090, 0x209c, 1}, - {0x20a0, 0x20be, 1}, - {0x20d0, 0x20f0, 1}, - {0x2100, 0x218b, 1}, - {0x2190, 0x23fe, 1}, - {0x2400, 0x2426, 1}, - {0x2440, 0x244a, 1}, - {0x2460, 0x2b73, 1}, - {0x2b76, 0x2b95, 1}, - {0x2b98, 0x2bb9, 1}, - {0x2bbd, 0x2bc8, 1}, - {0x2bca, 0x2bd1, 1}, - {0x2bec, 0x2bef, 1}, - {0x2c00, 0x2c2e, 1}, - {0x2c30, 0x2c5e, 1}, - {0x2c60, 0x2cf3, 1}, - {0x2cf9, 0x2d25, 1}, - {0x2d27, 0x2d2d, 6}, - {0x2d30, 0x2d67, 1}, - {0x2d6f, 0x2d70, 1}, - {0x2d7f, 0x2d96, 1}, - {0x2da0, 0x2da6, 1}, - {0x2da8, 0x2dae, 1}, - {0x2db0, 0x2db6, 1}, - {0x2db8, 0x2dbe, 1}, - {0x2dc0, 0x2dc6, 1}, - {0x2dc8, 0x2dce, 1}, - {0x2dd0, 0x2dd6, 1}, - {0x2dd8, 0x2dde, 1}, - {0x2de0, 0x2e44, 1}, - {0x2e80, 0x2e99, 1}, - {0x2e9b, 0x2ef3, 1}, - {0x2f00, 0x2fd5, 1}, - {0x2ff0, 0x2ffb, 1}, - {0x3000, 0x303f, 1}, - {0x3041, 0x3096, 1}, - {0x3099, 0x30ff, 1}, - {0x3105, 0x312d, 1}, - {0x3131, 0x318e, 1}, - {0x3190, 0x31ba, 1}, - {0x31c0, 0x31e3, 1}, - {0x31f0, 0x321e, 1}, - {0x3220, 0x32fe, 1}, - {0x3300, 0x4db5, 1}, - {0x4dc0, 0x9fd5, 1}, - {0xa000, 0xa48c, 1}, - {0xa490, 0xa4c6, 1}, - {0xa4d0, 0xa62b, 1}, - {0xa640, 0xa6f7, 1}, - {0xa700, 0xa7ae, 1}, - {0xa7b0, 0xa7b7, 1}, - {0xa7f7, 0xa82b, 1}, - {0xa830, 0xa839, 1}, - {0xa840, 0xa877, 1}, - {0xa880, 0xa8c5, 1}, - {0xa8ce, 0xa8d9, 1}, - {0xa8e0, 0xa8fd, 1}, - {0xa900, 0xa953, 1}, - {0xa95f, 0xa97c, 1}, - {0xa980, 0xa9cd, 1}, - {0xa9cf, 0xa9d9, 1}, - {0xa9de, 0xa9fe, 1}, - {0xaa00, 0xaa36, 1}, - {0xaa40, 0xaa4d, 1}, - {0xaa50, 0xaa59, 1}, - {0xaa5c, 0xaac2, 1}, - {0xaadb, 0xaaf6, 1}, - {0xab01, 0xab06, 1}, - {0xab09, 0xab0e, 1}, - {0xab11, 0xab16, 1}, - {0xab20, 0xab26, 1}, - {0xab28, 0xab2e, 1}, - {0xab30, 0xab65, 1}, - {0xab70, 0xabed, 1}, - {0xabf0, 0xabf9, 1}, - {0xac00, 0xd7a3, 1}, - {0xd7b0, 0xd7c6, 1}, - {0xd7cb, 0xd7fb, 1}, - {0xd800, 0xfa6d, 1}, - {0xfa70, 0xfad9, 1}, - {0xfb00, 0xfb06, 1}, - {0xfb13, 0xfb17, 1}, - {0xfb1d, 0xfb36, 1}, - {0xfb38, 0xfb3c, 1}, - {0xfb3e, 0xfb40, 2}, - {0xfb41, 0xfb43, 2}, - {0xfb44, 0xfb46, 2}, - {0xfb47, 0xfbc1, 1}, - {0xfbd3, 0xfd3f, 1}, - {0xfd50, 0xfd8f, 1}, - {0xfd92, 0xfdc7, 1}, - {0xfdf0, 0xfdfd, 1}, - {0xfe00, 0xfe19, 1}, - {0xfe20, 0xfe52, 1}, - {0xfe54, 0xfe66, 1}, - {0xfe68, 0xfe6b, 1}, - {0xfe70, 0xfe74, 1}, - {0xfe76, 0xfefc, 1}, - {0xfeff, 0xff01, 2}, - {0xff02, 0xffbe, 1}, - {0xffc2, 0xffc7, 1}, - {0xffca, 0xffcf, 1}, - {0xffd2, 0xffd7, 1}, - {0xffda, 0xffdc, 1}, - {0xffe0, 0xffe6, 1}, - {0xffe8, 0xffee, 1}, - {0xfff9, 0xfffd, 1}, - }, - R32: []unicode.Range32{ - {0x00010000, 0x0001000b, 1}, - {0x0001000d, 0x00010026, 1}, - {0x00010028, 0x0001003a, 1}, - {0x0001003c, 0x0001003d, 1}, - {0x0001003f, 0x0001004d, 1}, - {0x00010050, 0x0001005d, 1}, - {0x00010080, 0x000100fa, 1}, - {0x00010100, 0x00010102, 1}, - {0x00010107, 0x00010133, 1}, - {0x00010137, 0x0001018e, 1}, - {0x00010190, 0x0001019b, 1}, - {0x000101a0, 0x000101d0, 48}, - {0x000101d1, 0x000101fd, 1}, - {0x00010280, 0x0001029c, 1}, - {0x000102a0, 0x000102d0, 1}, - {0x000102e0, 0x000102fb, 1}, - {0x00010300, 0x00010323, 1}, - {0x00010330, 0x0001034a, 1}, - {0x00010350, 0x0001037a, 1}, - {0x00010380, 0x0001039d, 1}, - {0x0001039f, 0x000103c3, 1}, - {0x000103c8, 0x000103d5, 1}, - {0x00010400, 0x0001049d, 1}, - {0x000104a0, 0x000104a9, 1}, - {0x000104b0, 0x000104d3, 1}, - {0x000104d8, 0x000104fb, 1}, - {0x00010500, 0x00010527, 1}, - {0x00010530, 0x00010563, 1}, - {0x0001056f, 0x00010600, 145}, - {0x00010601, 0x00010736, 1}, - {0x00010740, 0x00010755, 1}, - {0x00010760, 0x00010767, 1}, - {0x00010800, 0x00010805, 1}, - {0x00010808, 0x0001080a, 2}, - {0x0001080b, 0x00010835, 1}, - {0x00010837, 0x00010838, 1}, - {0x0001083c, 0x0001083f, 3}, - {0x00010840, 0x00010855, 1}, - {0x00010857, 0x0001089e, 1}, - {0x000108a7, 0x000108af, 1}, - {0x000108e0, 0x000108f2, 1}, - {0x000108f4, 0x000108f5, 1}, - {0x000108fb, 0x0001091b, 1}, - {0x0001091f, 0x00010939, 1}, - {0x0001093f, 0x00010980, 65}, - {0x00010981, 0x000109b7, 1}, - {0x000109bc, 0x000109cf, 1}, - {0x000109d2, 0x00010a03, 1}, - {0x00010a05, 0x00010a06, 1}, - {0x00010a0c, 0x00010a13, 1}, - {0x00010a15, 0x00010a17, 1}, - {0x00010a19, 0x00010a33, 1}, - {0x00010a38, 0x00010a3a, 1}, - {0x00010a3f, 0x00010a47, 1}, - {0x00010a50, 0x00010a58, 1}, - {0x00010a60, 0x00010a9f, 1}, - {0x00010ac0, 0x00010ae6, 1}, - {0x00010aeb, 0x00010af6, 1}, - {0x00010b00, 0x00010b35, 1}, - {0x00010b39, 0x00010b55, 1}, - {0x00010b58, 0x00010b72, 1}, - {0x00010b78, 0x00010b91, 1}, - {0x00010b99, 0x00010b9c, 1}, - {0x00010ba9, 0x00010baf, 1}, - {0x00010c00, 0x00010c48, 1}, - {0x00010c80, 0x00010cb2, 1}, - {0x00010cc0, 0x00010cf2, 1}, - {0x00010cfa, 0x00010cff, 1}, - {0x00010e60, 0x00010e7e, 1}, - {0x00011000, 0x0001104d, 1}, - {0x00011052, 0x0001106f, 1}, - {0x0001107f, 0x000110c1, 1}, - {0x000110d0, 0x000110e8, 1}, - {0x000110f0, 0x000110f9, 1}, - {0x00011100, 0x00011134, 1}, - {0x00011136, 0x00011143, 1}, - {0x00011150, 0x00011176, 1}, - {0x00011180, 0x000111cd, 1}, - {0x000111d0, 0x000111df, 1}, - {0x000111e1, 0x000111f4, 1}, - {0x00011200, 0x00011211, 1}, - {0x00011213, 0x0001123e, 1}, - {0x00011280, 0x00011286, 1}, - {0x00011288, 0x0001128a, 2}, - {0x0001128b, 0x0001128d, 1}, - {0x0001128f, 0x0001129d, 1}, - {0x0001129f, 0x000112a9, 1}, - {0x000112b0, 0x000112ea, 1}, - {0x000112f0, 0x000112f9, 1}, - {0x00011300, 0x00011303, 1}, - {0x00011305, 0x0001130c, 1}, - {0x0001130f, 0x00011310, 1}, - {0x00011313, 0x00011328, 1}, - {0x0001132a, 0x00011330, 1}, - {0x00011332, 0x00011333, 1}, - {0x00011335, 0x00011339, 1}, - {0x0001133c, 0x00011344, 1}, - {0x00011347, 0x00011348, 1}, - {0x0001134b, 0x0001134d, 1}, - {0x00011350, 0x00011357, 7}, - {0x0001135d, 0x00011363, 1}, - {0x00011366, 0x0001136c, 1}, - {0x00011370, 0x00011374, 1}, - {0x00011400, 0x00011459, 1}, - {0x0001145b, 0x0001145d, 2}, - {0x00011480, 0x000114c7, 1}, - {0x000114d0, 0x000114d9, 1}, - {0x00011580, 0x000115b5, 1}, - {0x000115b8, 0x000115dd, 1}, - {0x00011600, 0x00011644, 1}, - {0x00011650, 0x00011659, 1}, - {0x00011660, 0x0001166c, 1}, - {0x00011680, 0x000116b7, 1}, - {0x000116c0, 0x000116c9, 1}, - {0x00011700, 0x00011719, 1}, - {0x0001171d, 0x0001172b, 1}, - {0x00011730, 0x0001173f, 1}, - {0x000118a0, 0x000118f2, 1}, - {0x000118ff, 0x00011ac0, 449}, - {0x00011ac1, 0x00011af8, 1}, - {0x00011c00, 0x00011c08, 1}, - {0x00011c0a, 0x00011c36, 1}, - {0x00011c38, 0x00011c45, 1}, - {0x00011c50, 0x00011c6c, 1}, - {0x00011c70, 0x00011c8f, 1}, - {0x00011c92, 0x00011ca7, 1}, - {0x00011ca9, 0x00011cb6, 1}, - {0x00012000, 0x00012399, 1}, - {0x00012400, 0x0001246e, 1}, - {0x00012470, 0x00012474, 1}, - {0x00012480, 0x00012543, 1}, - {0x00013000, 0x0001342e, 1}, - {0x00014400, 0x00014646, 1}, - {0x00016800, 0x00016a38, 1}, - {0x00016a40, 0x00016a5e, 1}, - {0x00016a60, 0x00016a69, 1}, - {0x00016a6e, 0x00016a6f, 1}, - {0x00016ad0, 0x00016aed, 1}, - {0x00016af0, 0x00016af5, 1}, - {0x00016b00, 0x00016b45, 1}, - {0x00016b50, 0x00016b59, 1}, - {0x00016b5b, 0x00016b61, 1}, - {0x00016b63, 0x00016b77, 1}, - {0x00016b7d, 0x00016b8f, 1}, - {0x00016f00, 0x00016f44, 1}, - {0x00016f50, 0x00016f7e, 1}, - {0x00016f8f, 0x00016f9f, 1}, - {0x00016fe0, 0x00017000, 32}, - {0x00017001, 0x000187ec, 1}, - {0x00018800, 0x00018af2, 1}, - {0x0001b000, 0x0001b001, 1}, - {0x0001bc00, 0x0001bc6a, 1}, - {0x0001bc70, 0x0001bc7c, 1}, - {0x0001bc80, 0x0001bc88, 1}, - {0x0001bc90, 0x0001bc99, 1}, - {0x0001bc9c, 0x0001bca3, 1}, - {0x0001d000, 0x0001d0f5, 1}, - {0x0001d100, 0x0001d126, 1}, - {0x0001d129, 0x0001d1e8, 1}, - {0x0001d200, 0x0001d245, 1}, - {0x0001d300, 0x0001d356, 1}, - {0x0001d360, 0x0001d371, 1}, - {0x0001d400, 0x0001d454, 1}, - {0x0001d456, 0x0001d49c, 1}, - {0x0001d49e, 0x0001d49f, 1}, - {0x0001d4a2, 0x0001d4a5, 3}, - {0x0001d4a6, 0x0001d4a9, 3}, - {0x0001d4aa, 0x0001d4ac, 1}, - {0x0001d4ae, 0x0001d4b9, 1}, - {0x0001d4bb, 0x0001d4bd, 2}, - {0x0001d4be, 0x0001d4c3, 1}, - {0x0001d4c5, 0x0001d505, 1}, - {0x0001d507, 0x0001d50a, 1}, - {0x0001d50d, 0x0001d514, 1}, - {0x0001d516, 0x0001d51c, 1}, - {0x0001d51e, 0x0001d539, 1}, - {0x0001d53b, 0x0001d53e, 1}, - {0x0001d540, 0x0001d544, 1}, - {0x0001d546, 0x0001d54a, 4}, - {0x0001d54b, 0x0001d550, 1}, - {0x0001d552, 0x0001d6a5, 1}, - {0x0001d6a8, 0x0001d7cb, 1}, - {0x0001d7ce, 0x0001da8b, 1}, - {0x0001da9b, 0x0001da9f, 1}, - {0x0001daa1, 0x0001daaf, 1}, - {0x0001e000, 0x0001e006, 1}, - {0x0001e008, 0x0001e018, 1}, - {0x0001e01b, 0x0001e021, 1}, - {0x0001e023, 0x0001e024, 1}, - {0x0001e026, 0x0001e02a, 1}, - {0x0001e800, 0x0001e8c4, 1}, - {0x0001e8c7, 0x0001e8d6, 1}, - {0x0001e900, 0x0001e94a, 1}, - {0x0001e950, 0x0001e959, 1}, - {0x0001e95e, 0x0001e95f, 1}, - {0x0001ee00, 0x0001ee03, 1}, - {0x0001ee05, 0x0001ee1f, 1}, - {0x0001ee21, 0x0001ee22, 1}, - {0x0001ee24, 0x0001ee27, 3}, - {0x0001ee29, 0x0001ee32, 1}, - {0x0001ee34, 0x0001ee37, 1}, - {0x0001ee39, 0x0001ee3b, 2}, - {0x0001ee42, 0x0001ee47, 5}, - {0x0001ee49, 0x0001ee4d, 2}, - {0x0001ee4e, 0x0001ee4f, 1}, - {0x0001ee51, 0x0001ee52, 1}, - {0x0001ee54, 0x0001ee57, 3}, - {0x0001ee59, 0x0001ee61, 2}, - {0x0001ee62, 0x0001ee64, 2}, - {0x0001ee67, 0x0001ee6a, 1}, - {0x0001ee6c, 0x0001ee72, 1}, - {0x0001ee74, 0x0001ee77, 1}, - {0x0001ee79, 0x0001ee7c, 1}, - {0x0001ee7e, 0x0001ee80, 2}, - {0x0001ee81, 0x0001ee89, 1}, - {0x0001ee8b, 0x0001ee9b, 1}, - {0x0001eea1, 0x0001eea3, 1}, - {0x0001eea5, 0x0001eea9, 1}, - {0x0001eeab, 0x0001eebb, 1}, - {0x0001eef0, 0x0001eef1, 1}, - {0x0001f000, 0x0001f02b, 1}, - {0x0001f030, 0x0001f093, 1}, - {0x0001f0a0, 0x0001f0ae, 1}, - {0x0001f0b1, 0x0001f0bf, 1}, - {0x0001f0c1, 0x0001f0cf, 1}, - {0x0001f0d1, 0x0001f0f5, 1}, - {0x0001f100, 0x0001f10c, 1}, - {0x0001f110, 0x0001f12e, 1}, - {0x0001f130, 0x0001f16b, 1}, - {0x0001f170, 0x0001f1ac, 1}, - {0x0001f1e6, 0x0001f202, 1}, - {0x0001f210, 0x0001f23b, 1}, - {0x0001f240, 0x0001f248, 1}, - {0x0001f250, 0x0001f251, 1}, - {0x0001f300, 0x0001f6d2, 1}, - {0x0001f6e0, 0x0001f6ec, 1}, - {0x0001f6f0, 0x0001f6f6, 1}, - {0x0001f700, 0x0001f773, 1}, - {0x0001f780, 0x0001f7d4, 1}, - {0x0001f800, 0x0001f80b, 1}, - {0x0001f810, 0x0001f847, 1}, - {0x0001f850, 0x0001f859, 1}, - {0x0001f860, 0x0001f887, 1}, - {0x0001f890, 0x0001f8ad, 1}, - {0x0001f910, 0x0001f91e, 1}, - {0x0001f920, 0x0001f927, 1}, - {0x0001f930, 0x0001f933, 3}, - {0x0001f934, 0x0001f93e, 1}, - {0x0001f940, 0x0001f94b, 1}, - {0x0001f950, 0x0001f95e, 1}, - {0x0001f980, 0x0001f991, 1}, - {0x0001f9c0, 0x00020000, 1600}, - {0x00020001, 0x0002a6d6, 1}, - {0x0002a700, 0x0002b734, 1}, - {0x0002b740, 0x0002b81d, 1}, - {0x0002b820, 0x0002cea1, 1}, - {0x0002f800, 0x0002fa1d, 1}, - {0x000e0001, 0x000e0020, 31}, - {0x000e0021, 0x000e007f, 1}, - {0x000e0100, 0x000e01ef, 1}, - {0x000f0000, 0x000ffffd, 1}, - {0x00100000, 0x0010fffd, 1}, - }, - LatinOffset: 0, -} - -// Total size 44206 bytes (43 KiB) diff --git a/vendor/golang.org/x/text/unicode/runenames/bits.go b/vendor/golang.org/x/text/unicode/runenames/bits.go deleted file mode 100644 index 48cc2c05c..000000000 --- a/vendor/golang.org/x/text/unicode/runenames/bits.go +++ /dev/null @@ -1,59 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package runenames - -// This file contains code common to gen.go and the package code. - -// The mapping from rune to string (i.e. offset and length in the data string) -// is encoded as a two level table. The first level maps from contiguous rune -// ranges [runeOffset, runeOffset+runeLength) to entries. Entries are either -// direct (for repeated names such as "<CJK Ideograph>") or indirect (for runs -// of unique names such as "SPACE", "EXCLAMATION MARK", "QUOTATION MARK", ...). -// -// Each first level table element is 64 bits. The runeOffset (21 bits) and -// runeLength (16 bits) take the 37 high bits. The entry takes the 27 low bits, -// with directness encoded in the least significant bit. -// -// A direct entry encodes a dataOffset (18 bits) and dataLength (8 bits) in the -// data string. 18 bits is too short to encode the entire data string's length, -// but the data string's contents are arranged so that all of the few direct -// entries' offsets come before all of the many indirect entries' offsets. -// -// An indirect entry encodes a dataBase (10 bits) and a table1Offset (16 bits). -// The table1Offset is the start of a range in the second level table. The -// length of that range is the same as the runeLength. -// -// Each second level table element is 16 bits, an index into data, relative to -// a bias equal to (dataBase << dataBaseUnit). That (bias + index) is the -// (dataOffset + dataLength) in the data string. The dataOffset is implied by -// the previous table element (with the same implicit bias). - -const ( - bitsRuneOffset = 21 - bitsRuneLength = 16 - bitsDataOffset = 18 - bitsDataLength = 8 - bitsDirect = 1 - - bitsDataBase = 10 - bitsTable1Offset = 16 - - shiftRuneOffset = 0 + bitsDirect + bitsDataLength + bitsDataOffset + bitsRuneLength - shiftRuneLength = 0 + bitsDirect + bitsDataLength + bitsDataOffset - shiftDataOffset = 0 + bitsDirect + bitsDataLength - shiftDataLength = 0 + bitsDirect - shiftDirect = 0 - - shiftDataBase = 0 + bitsDirect + bitsTable1Offset - shiftTable1Offset = 0 + bitsDirect - - maskRuneLength = 1<<bitsRuneLength - 1 - maskDataOffset = 1<<bitsDataOffset - 1 - maskDataLength = 1<<bitsDataLength - 1 - maskDirect = 1<<bitsDirect - 1 - - maskDataBase = 1<<bitsDataBase - 1 - maskTable1Offset = 1<<bitsTable1Offset - 1 - - dataBaseUnit = 10 -) diff --git a/vendor/golang.org/x/text/unicode/runenames/example_test.go b/vendor/golang.org/x/text/unicode/runenames/example_test.go deleted file mode 100644 index 3bb44fd31..000000000 --- a/vendor/golang.org/x/text/unicode/runenames/example_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package runenames_test - -import ( - "fmt" - - "golang.org/x/text/unicode/runenames" -) - -func Example() { - runes := []rune{ - -1, - '\U00000000', - '\U0000001f', - '\U00000020', - '\U00000021', - '\U00000041', - '\U0000007e', - '\U0000007f', - '\U00000080', - '\U000000e0', - - '\U0000037f', - '\U00000380', - '\U00000381', - '\U00000382', - '\U00000383', - '\U00000384', - '\U00000385', - '\U00000386', - '\U000007c0', - - '\U00002603', - '\U000033ff', - '\U00003400', - '\U00003401', - '\U00003402', - '\U00004dc0', - - '\U00009fd5', - '\U00009fd6', - '\U00009fff', - '\U0000a000', - 0xdc00, // '\U0000dc00' (Low Surrogate) is an invalid Go literal. - '\U0000f800', - '\U0000fffc', - '\U0000fffd', - '\U0000fffe', - '\U0000ffff', - - '\U00010000', - '\U0001f574', - '\U0002fa1d', - '\U0002fa1e', - '\U000e0100', - '\U000e01ef', - '\U000e01f0', - '\U00100000', - '\U0010fffd', - '\U0010fffe', - '\U0010ffff', - } - - for _, r := range runes { - fmt.Printf("%08x %q\n", r, runenames.Name(r)) - } - - // Output: - // -0000001 "" - // 00000000 "<control>" - // 0000001f "<control>" - // 00000020 "SPACE" - // 00000021 "EXCLAMATION MARK" - // 00000041 "LATIN CAPITAL LETTER A" - // 0000007e "TILDE" - // 0000007f "<control>" - // 00000080 "<control>" - // 000000e0 "LATIN SMALL LETTER A WITH GRAVE" - // 0000037f "GREEK CAPITAL LETTER YOT" - // 00000380 "" - // 00000381 "" - // 00000382 "" - // 00000383 "" - // 00000384 "GREEK TONOS" - // 00000385 "GREEK DIALYTIKA TONOS" - // 00000386 "GREEK CAPITAL LETTER ALPHA WITH TONOS" - // 000007c0 "NKO DIGIT ZERO" - // 00002603 "SNOWMAN" - // 000033ff "SQUARE GAL" - // 00003400 "<CJK Ideograph Extension A>" - // 00003401 "<CJK Ideograph Extension A>" - // 00003402 "<CJK Ideograph Extension A>" - // 00004dc0 "HEXAGRAM FOR THE CREATIVE HEAVEN" - // 00009fd5 "<CJK Ideograph>" - // 00009fd6 "" - // 00009fff "" - // 0000a000 "YI SYLLABLE IT" - // 0000dc00 "<Low Surrogate>" - // 0000f800 "<Private Use>" - // 0000fffc "OBJECT REPLACEMENT CHARACTER" - // 0000fffd "REPLACEMENT CHARACTER" - // 0000fffe "" - // 0000ffff "" - // 00010000 "LINEAR B SYLLABLE B008 A" - // 0001f574 "MAN IN BUSINESS SUIT LEVITATING" - // 0002fa1d "CJK COMPATIBILITY IDEOGRAPH-2FA1D" - // 0002fa1e "" - // 000e0100 "VARIATION SELECTOR-17" - // 000e01ef "VARIATION SELECTOR-256" - // 000e01f0 "" - // 00100000 "<Plane 16 Private Use>" - // 0010fffd "<Plane 16 Private Use>" - // 0010fffe "" - // 0010ffff "" -} diff --git a/vendor/golang.org/x/text/unicode/runenames/gen.go b/vendor/golang.org/x/text/unicode/runenames/gen.go deleted file mode 100644 index 7e373a54c..000000000 --- a/vendor/golang.org/x/text/unicode/runenames/gen.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "log" - "strings" - "unicode" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/ucd" -) - -// snippet is a slice of data; data is the concatenation of all of the names. -type snippet struct { - offset int - length int - s string -} - -func makeTable0EntryDirect(rOffset, rLength, dOffset, dLength int) uint64 { - if rOffset >= 1<<bitsRuneOffset { - log.Fatalf("makeTable0EntryDirect: rOffset %d is too large", rOffset) - } - if rLength >= 1<<bitsRuneLength { - log.Fatalf("makeTable0EntryDirect: rLength %d is too large", rLength) - } - if dOffset >= 1<<bitsDataOffset { - log.Fatalf("makeTable0EntryDirect: dOffset %d is too large", dOffset) - } - if dLength >= 1<<bitsRuneLength { - log.Fatalf("makeTable0EntryDirect: dLength %d is too large", dLength) - } - return uint64(rOffset)<<shiftRuneOffset | - uint64(rLength)<<shiftRuneLength | - uint64(dOffset)<<shiftDataOffset | - uint64(dLength)<<shiftDataLength | - 1 // Direct bit. -} - -func makeTable0EntryIndirect(rOffset, rLength, dBase, t1Offset int) uint64 { - if rOffset >= 1<<bitsRuneOffset { - log.Fatalf("makeTable0EntryIndirect: rOffset %d is too large", rOffset) - } - if rLength >= 1<<bitsRuneLength { - log.Fatalf("makeTable0EntryIndirect: rLength %d is too large", rLength) - } - if dBase >= 1<<bitsDataBase { - log.Fatalf("makeTable0EntryIndirect: dBase %d is too large", dBase) - } - if t1Offset >= 1<<bitsTable1Offset { - log.Fatalf("makeTable0EntryIndirect: t1Offset %d is too large", t1Offset) - } - return uint64(rOffset)<<shiftRuneOffset | - uint64(rLength)<<shiftRuneLength | - uint64(dBase)<<shiftDataBase | - uint64(t1Offset)<<shiftTable1Offset | - 0 // Direct bit. -} - -func makeTable1Entry(x int) uint16 { - if x < 0 || 0xffff < x { - log.Fatalf("makeTable1Entry: entry %d is out of range", x) - } - return uint16(x) -} - -var ( - data []byte - snippets = make([]snippet, 1+unicode.MaxRune) -) - -func main() { - gen.Init() - - names, counts := parse() - appendRepeatNames(names, counts) - appendUniqueNames(names, counts) - - table0, table1 := makeTables() - - gen.Repackage("gen_bits.go", "bits.go", "runenames") - - w := gen.NewCodeWriter() - w.WriteVar("table0", table0) - w.WriteVar("table1", table1) - w.WriteConst("data", string(data)) - w.WriteGoFile("tables.go", "runenames") -} - -func parse() (names []string, counts map[string]int) { - names = make([]string, 1+unicode.MaxRune) - counts = map[string]int{} - ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) { - r, s := p.Rune(0), p.String(ucd.Name) - if s == "" { - return - } - if s[0] == '<' { - const first = ", First>" - if i := strings.Index(s, first); i >= 0 { - s = s[:i] + ">" - } - } - names[r] = s - counts[s]++ - }) - return names, counts -} - -func appendRepeatNames(names []string, counts map[string]int) { - alreadySeen := map[string]snippet{} - for r, s := range names { - if s == "" || counts[s] == 1 { - continue - } - if s[0] != '<' { - log.Fatalf("Repeated name %q does not start with a '<'", s) - } - - if z, ok := alreadySeen[s]; ok { - snippets[r] = z - continue - } - - z := snippet{ - offset: len(data), - length: len(s), - s: s, - } - data = append(data, s...) - snippets[r] = z - alreadySeen[s] = z - } -} - -func appendUniqueNames(names []string, counts map[string]int) { - for r, s := range names { - if s == "" || counts[s] != 1 { - continue - } - if s[0] == '<' { - log.Fatalf("Unique name %q starts with a '<'", s) - } - - z := snippet{ - offset: len(data), - length: len(s), - s: s, - } - data = append(data, s...) - snippets[r] = z - } -} - -func makeTables() (table0 []uint64, table1 []uint16) { - for i := 0; i < len(snippets); { - zi := snippets[i] - if zi == (snippet{}) { - i++ - continue - } - - // Look for repeat names. If we have one, we only need a table0 entry. - j := i + 1 - for ; j < len(snippets) && zi == snippets[j]; j++ { - } - if j > i+1 { - table0 = append(table0, makeTable0EntryDirect(i, j-i, zi.offset, zi.length)) - i = j - continue - } - - // Otherwise, we have a run of unique names. We need one table0 entry - // and two or more table1 entries. - base := zi.offset &^ (1<<dataBaseUnit - 1) - t1Offset := len(table1) + 1 - table1 = append(table1, makeTable1Entry(zi.offset-base)) - table1 = append(table1, makeTable1Entry(zi.offset+zi.length-base)) - for ; j < len(snippets) && snippets[j] != (snippet{}); j++ { - zj := snippets[j] - if data[zj.offset] == '<' { - break - } - table1 = append(table1, makeTable1Entry(zj.offset+zj.length-base)) - } - table0 = append(table0, makeTable0EntryIndirect(i, j-i, base>>dataBaseUnit, t1Offset)) - i = j - } - return table0, table1 -} diff --git a/vendor/golang.org/x/text/unicode/runenames/gen_bits.go b/vendor/golang.org/x/text/unicode/runenames/gen_bits.go deleted file mode 100644 index e80fada56..000000000 --- a/vendor/golang.org/x/text/unicode/runenames/gen_bits.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This file contains code common to gen.go and the package code. - -// The mapping from rune to string (i.e. offset and length in the data string) -// is encoded as a two level table. The first level maps from contiguous rune -// ranges [runeOffset, runeOffset+runeLength) to entries. Entries are either -// direct (for repeated names such as "<CJK Ideograph>") or indirect (for runs -// of unique names such as "SPACE", "EXCLAMATION MARK", "QUOTATION MARK", ...). -// -// Each first level table element is 64 bits. The runeOffset (21 bits) and -// runeLength (16 bits) take the 37 high bits. The entry takes the 27 low bits, -// with directness encoded in the least significant bit. -// -// A direct entry encodes a dataOffset (18 bits) and dataLength (8 bits) in the -// data string. 18 bits is too short to encode the entire data string's length, -// but the data string's contents are arranged so that all of the few direct -// entries' offsets come before all of the many indirect entries' offsets. -// -// An indirect entry encodes a dataBase (10 bits) and a table1Offset (16 bits). -// The table1Offset is the start of a range in the second level table. The -// length of that range is the same as the runeLength. -// -// Each second level table element is 16 bits, an index into data, relative to -// a bias equal to (dataBase << dataBaseUnit). That (bias + index) is the -// (dataOffset + dataLength) in the data string. The dataOffset is implied by -// the previous table element (with the same implicit bias). - -const ( - bitsRuneOffset = 21 - bitsRuneLength = 16 - bitsDataOffset = 18 - bitsDataLength = 8 - bitsDirect = 1 - - bitsDataBase = 10 - bitsTable1Offset = 16 - - shiftRuneOffset = 0 + bitsDirect + bitsDataLength + bitsDataOffset + bitsRuneLength - shiftRuneLength = 0 + bitsDirect + bitsDataLength + bitsDataOffset - shiftDataOffset = 0 + bitsDirect + bitsDataLength - shiftDataLength = 0 + bitsDirect - shiftDirect = 0 - - shiftDataBase = 0 + bitsDirect + bitsTable1Offset - shiftTable1Offset = 0 + bitsDirect - - maskRuneLength = 1<<bitsRuneLength - 1 - maskDataOffset = 1<<bitsDataOffset - 1 - maskDataLength = 1<<bitsDataLength - 1 - maskDirect = 1<<bitsDirect - 1 - - maskDataBase = 1<<bitsDataBase - 1 - maskTable1Offset = 1<<bitsTable1Offset - 1 - - dataBaseUnit = 10 -) diff --git a/vendor/golang.org/x/text/unicode/runenames/runenames.go b/vendor/golang.org/x/text/unicode/runenames/runenames.go deleted file mode 100644 index 3154a2256..000000000 --- a/vendor/golang.org/x/text/unicode/runenames/runenames.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go gen_bits.go - -// Package runenames provides rune names from the Unicode Character Database. -// For example, the name for '\u0100' is "LATIN CAPITAL LETTER A WITH MACRON". -// -// See http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt -package runenames - -import ( - "sort" -) - -// Name returns the name for r. -func Name(r rune) string { - i := sort.Search(len(table0), func(j int) bool { - e := table0[j] - rOffset := rune(e >> shiftRuneOffset) - return r < rOffset - }) - if i == 0 { - return "" - } - - e := table0[i-1] - rOffset := rune(e >> shiftRuneOffset) - rLength := rune(e>>shiftRuneLength) & maskRuneLength - if r >= rOffset+rLength { - return "" - } - - if (e>>shiftDirect)&maskDirect != 0 { - o := int(e>>shiftDataOffset) & maskDataOffset - n := int(e>>shiftDataLength) & maskDataLength - return data[o : o+n] - } - - base := uint32(e>>shiftDataBase) & maskDataBase - base <<= dataBaseUnit - j := rune(e>>shiftTable1Offset) & maskTable1Offset - j += r - rOffset - d0 := base + uint32(table1[j-1]) // dataOffset - d1 := base + uint32(table1[j-0]) // dataOffset + dataLength - return data[d0:d1] -} diff --git a/vendor/golang.org/x/text/unicode/runenames/runenames_test.go b/vendor/golang.org/x/text/unicode/runenames/runenames_test.go deleted file mode 100644 index 6a2d2b607..000000000 --- a/vendor/golang.org/x/text/unicode/runenames/runenames_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package runenames - -import ( - "strings" - "testing" - "unicode" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/testtext" - "golang.org/x/text/internal/ucd" -) - -func TestName(t *testing.T) { - testtext.SkipIfNotLong(t) - - wants := make([]string, 1+unicode.MaxRune) - ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) { - r, s := p.Rune(0), p.String(ucd.Name) - if s == "" { - return - } - if s[0] == '<' { - const first = ", First>" - if i := strings.Index(s, first); i >= 0 { - s = s[:i] + ">" - } - } - wants[r] = s - }) - - nErrors := 0 - for r, want := range wants { - got := Name(rune(r)) - if got != want { - t.Errorf("r=%#08x: got %q, want %q", r, got, want) - nErrors++ - if nErrors == 100 { - t.Fatal("too many errors") - } - } - } -} diff --git a/vendor/golang.org/x/text/unicode/runenames/tables.go b/vendor/golang.org/x/text/unicode/runenames/tables.go deleted file mode 100644 index 99c4926d4..000000000 --- a/vendor/golang.org/x/text/unicode/runenames/tables.go +++ /dev/null @@ -1,15514 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package runenames - -var table0 = []uint64{ // 647 elements - // Entry 0 - 1F - 0x0000000100000013, 0x00010002f8000002, 0x0003f80108000013, 0x00050016c00200c2, - 0x001bd000302e0674, 0x001c2000382e0682, 0x001c600008300692, 0x001c7000a0300696, - 0x001d180c683006c0, 0x00298801304809dc, 0x002ac800384a0a2a, 0x002b0801384a0a3a, - 0x002c4800104c0a8a, 0x002c6800184c0a90, 0x002c8801b84e0a98, 0x002e8000d8500b08, - 0x002f800028500b40, 0x00300000e8500b4c, 0x0030f00780520b88, 0x00387801e05e0d6a, - 0x003a680328600de4, 0x003e0001d8680eb0, 0x00400001706a0f28, 0x00418000786c0f86, - 0x00420000e06c0fa6, 0x0042f000086e0fe0, 0x00450000a86e0fe4, 0x0045b000406e1010, - 0x0046a00580701022, 0x004c280040781184, 0x004c780010781196, 0x004c9800b078119c, - // Entry 20 - 3F - 0x004d5000387811ca, 0x004d9000087811da, 0x004db000207a11de, 0x004de000487a11e8, - 0x004e3800107a11fc, 0x004e5800207a1202, 0x004eb800087a120c, 0x004ee000107a1210, - 0x004ef800287a1216, 0x004f3000b07a1222, 0x00500800187c1250, 0x00502800307c1258, - 0x00507800107c1266, 0x00509800b07c126c, 0x00515000387c129a, 0x00519000107c12aa, - 0x0051a800107c12b0, 0x0051c000107c12b6, 0x0051e000087c12bc, 0x0051f000287c12c0, - 0x00523800107e12cc, 0x00525800187e12d2, 0x00528800087e12da, 0x0052c800207e12de, - 0x0052f000087e12e8, 0x00533000807e12ec, 0x00540800187e130e, 0x00542800487e1316, - 0x00547800187e132a, 0x00549800b07e1332, 0x0055500038801360, 0x0055900010801370, - // Entry 40 - 5F - 0x0055a80028801376, 0x0055e00050801382, 0x0056380018801398, 0x00565800188013a0, - 0x00568000088013a8, 0x00570000208013ac, 0x00573000608013b6, 0x0057c800088213d0, - 0x00580800188213d4, 0x00582800408213dc, 0x00587800108213ee, 0x00589800b08213f4, - 0x0059500038821422, 0x0059900010821432, 0x0059a80028821438, 0x0059e00048821444, - 0x005a380010841458, 0x005a58001884145e, 0x005ab00010841466, 0x005ae0001084146c, - 0x005af80028841472, 0x005b30009084147e, 0x005c1000108414a4, 0x005c2800308414aa, - 0x005c7000188414b8, 0x005c9000208414c0, 0x005cc800108414ca, 0x005ce000088614d0, - 0x005cf000108614d4, 0x005d1800108614da, 0x005d4000188614e0, 0x005d7000608614e8, - // Entry 60 - 7F - 0x005df00028861502, 0x005e30001886150e, 0x005e500020861516, 0x005e800008861520, - 0x005eb80008861524, 0x005f3000a8861528, 0x0060000020861554, 0x006028004088155e, - 0x0060700018881570, 0x00609000b8881578, 0x00615000808815a8, 0x0061e800408815ca, - 0x00623000188815dc, 0x00625000208a15e4, 0x0062a800108a15ee, 0x0062c000188a15f4, - 0x00630000208a15fc, 0x00633000508a1606, 0x0063c000608a161c, 0x00642800408a1636, - 0x00647000188c1648, 0x00649000b88c1650, 0x00655000508c1680, 0x0065a800288c1696, - 0x0065e000488c16a2, 0x00663000188c16b6, 0x00665000208e16be, 0x0066a800108e16c8, - 0x0066f000088e16ce, 0x00670000208e16d2, 0x00673000508e16dc, 0x00678800108e16f2, - // Entry 80 - 9F - 0x00680800188e16f8, 0x00682800408e1700, 0x00687000188e1712, 0x00689001488e171a, - 0x0069e8004090176e, 0x006a300018901780, 0x006a500030901788, 0x006aa00080901796, - 0x006b3000d09217b8, 0x006c1000109417ee, 0x006c2800909417f4, 0x006cd000c094181a, - 0x006d98004896184c, 0x006de80008961860, 0x006e000038961864, 0x006e500008961874, - 0x006e780030961878, 0x006eb00008961886, 0x006ec0004096188a, 0x006f30005098189c, - 0x006f9000189818b2, 0x00700801d09818ba, 0x0071f800e89a1930, 0x00740800109c196c, - 0x00742000089c1972, 0x00743800109c1976, 0x00745000089c197c, 0x00746800089c1980, - 0x0074a000209c1984, 0x0074c800389c198e, 0x00750800189c199e, 0x00752800089c19a6, - // Entry A0 - BF - 0x00753800089c19aa, 0x00755000109c19ae, 0x00756800689c19b4, 0x0075d800189e19d0, - 0x00760000289e19d8, 0x00763000089e19e4, 0x00764000309e19e8, 0x00768000509e19f6, - 0x0076e000209e1a0c, 0x00780002409e1a16, 0x007a480120a21aa8, 0x007b880138a21af2, - 0x007cc80120a41b42, 0x007df00078a61b8c, 0x007e700068a81bac, 0x0080000630a81bc8, - 0x0086380008b21d56, 0x0086680008b21d5a, 0x0086800bc8b21d5e, 0x0092500020c42052, - 0x0092800038c4205c, 0x0092c00008c4206c, 0x0092d00020c42070, 0x0093000148c4207a, - 0x0094500020c620ce, 0x0094800108c620d8, 0x0095900020c8211c, 0x0095c00038c82126, - 0x0096000008c82136, 0x0096100020c8213a, 0x0096400078c82144, 0x0096c001c8ca2164, - // Entry C0 - DF - 0x0098900020cc21d8, 0x0098c00218cc21e2, 0x009ae80100ce226a, 0x009c0000d0d022ac, - 0x009d0002b0d022e2, 0x009fc00030d42390, 0x00a00014e8d4239e, 0x00b50002c8f828da, - 0x00b8000068fc298e, 0x00b8700038fc29aa, 0x00b90000b8fc29ba, 0x00ba0000a0fc29ea, - 0x00bb000068fe2a14, 0x00bb700018fe2a30, 0x00bb900010fe2a38, 0x00bc0002f0fe2a3e, - 0x00bf000051022afc, 0x00bf800051022b12, 0x00c0000079022b28, 0x00c0800051042b48, - 0x00c10002c1042b5e, 0x00c4000159082c10, 0x00c58002310a2c68, 0x00c80000f90e2cf6, - 0x00c90000610e2d36, 0x00c9800061102d50, 0x00ca000009102d6a, 0x00ca200151102d6e, - 0x00cb800029102dc4, 0x00cc000161122dd0, 0x00cd8000d1142e2a, 0x00ce800059142e60, - // Entry E0 - FF - 0x00cef001f1162e78, 0x00d0f00209182ef6, 0x00d30000e91a2f7a, 0x00d3f800591c2fb6, - 0x00d48000511c2fce, 0x00d50000711c2fe4, 0x00d58000791e3002, 0x00d80002611e3022, - 0x00da8001692230bc, 0x00dc0003a1243118, 0x00dfe001e12a3202, 0x00e1d800792c327c, - 0x00e26801e12c329c, 0x00e60000412e3316, 0x00e6800139303328, 0x00e7c00011323378, - 0x00e80007b132337e, 0x00efd808d940356c, 0x00f8c000315637a4, 0x00f90001315837b2, - 0x00fa4000315a3800, 0x00fa8000415c380e, 0x00fac800095c3820, 0x00fad800095c3824, - 0x00fae800095c3828, 0x00faf800f95c382c, 0x00fc0001a95e386c, 0x00fdb000796638d8, - 0x00fe3000716638f8, 0x00feb00031683916, 0x00fee80099683924, 0x00ff90001968394c, - // Entry 100 - 11F - 0x00ffb000496a3954, 0x01000003296a3968, 0x01033000616e3a34, 0x0103a000d96e3a4e, - 0x01048000696e3a86, 0x01050000f9703aa2, 0x0106800109703ae2, 0x0108000461723b26, - 0x010c801379783c40, 0x0120000139944120, 0x0122000059964170, 0x01230038a1964188, - 0x015bb00101fa4fb2, 0x015cc00111fc4ff4, 0x015de80061fe503a, 0x015e500042005054, - 0x015f600022005066, 0x016000017a005070, 0x016180017a0250d0, 0x01630004a2065130, - 0x0167c8016a0e525a, 0x016938000a1052b6, 0x016968000a1052ba, 0x01698001c21052be, - 0x016b780012145330, 0x016bf800c2145336, 0x016d00003a145368, 0x016d40003a145378, - 0x016d80003a145388, 0x016dc0003a165398, 0x016e00003a1653a8, 0x016e40003a1653b8, - // Entry 120 - 13F - 0x016e80003a1653c8, 0x016ec0003a1653d8, 0x016f00032a1653e8, 0x01740000d21c54b4, - 0x0174d802ca1c54ea, 0x01780006b220559e, 0x017f80006228574c, 0x01800002022a5766, - 0x01820802b22e57e8, 0x0184c8033a305896, 0x018828014a345966, 0x01898802f23659ba, - 0x018c80015a3a5a78, 0x018e0001223c5ad0, 0x018f80017a3c5b1a, 0x01910006fa405b7a, - 0x01980008024a5d3a, 0x01a000cdb0001237, 0x026e000202545f3c, 0x0270028eb000481f, - 0x050000246a565fbe, 0x05248001ba7a68da, 0x0526800ae27c694a, 0x05320005c2866c04, - 0x053800057a8e6d76, 0x053d8000429a6ed6, 0x053fb801aa9a6ee8, 0x05418000529e6f54, - 0x05420001c29e6f6a, 0x0544000232a06fdc, 0x0546700062a4706a, 0x05470000f2a47084, - // Entry 140 - 15F - 0x05480002a2a670c2, 0x054af800f2a8716c, 0x054c000272aa71aa, 0x054e78005aae7248, - 0x054ef0010aae7260, 0x05500001bab072a4, 0x0552000072b27314, 0x0552800052b27332, - 0x0552e0033ab27348, 0x0556d800e2b67418, 0x0558080032b87452, 0x0558480032b87460, - 0x0558880032b8746e, 0x055900003ab8747c, 0x055940003aba748c, 0x05598001b2ba749c, - 0x055b8003f2be750a, 0x055f800052c47608, 0x0560015d20006623, 0x06bd8000bac4761e, - 0x06be58018ac4764e, 0x06c0001c00008841, 0x06dc00040000c839, 0x06e000200001001f, - 0x070000c800011e1b, 0x07c8000b72c876b2, 0x07d3800352de7990, 0x07d800003ae67a66, - 0x07d898002ae67a76, 0x07d8e800d2e67a82, 0x07d9c0002ae87ab8, 0x07d9f0000ae87ac4, - // Entry 160 - 17F - 0x07da000012e87ac8, 0x07da180012e87ace, 0x07da3003e2e87ad4, 0x07de980b6af07bce, - 0x07ea800203107eaa, 0x07ec9001b3167f2c, 0x07ef8000731c7f9a, 0x07f00000d31c7fb8, - 0x07f100019b1e7fee, 0x07f2a0009b228056, 0x07f340002322807e, 0x07f380002b228088, - 0x07f3b0043b228094, 0x07f7f8000b2c81a4, 0x07f80805f32c81a8, 0x07fe100033368326, - 0x07fe500033368334, 0x07fe900033368342, 0x07fed0001b368350, 0x07ff00003b388358, - 0x07ff40003b388368, 0x07ffc8002b388378, 0x0800000063388384, 0x08006800d338839e, - 0x080140009b3a83d4, 0x0801e000133a83fc, 0x0801f8007b3a8402, 0x08028000733c8422, - 0x08040003db3c8440, 0x080800001b428538, 0x080838016b428540, 0x0809b802c344859c, - // Entry 180 - 19F - 0x080c8000634a864e, 0x080d00000b4a8668, 0x080e8001734a866c, 0x08140000eb4c86ca, - 0x081500018b4e8706, 0x08170000e350876a, 0x08180001235087a4, 0x08198000db5287ee, - 0x081a80015b528826, 0x081c0000f354887e, 0x081cf8012b5688bc, 0x081e400073588908, - 0x08200004f3588926, 0x08250000535e8a64, 0x0825800123608a7a, 0x0826c00123608ac4, - 0x0828000143628b0e, 0x08298001a3648b60, 0x082b78000b668bca, 0x08300009bb668bce, - 0x083a0000b3728e3e, 0x083b000043728e6c, 0x0840000033748e7e, 0x084040000b748e8c, - 0x0840500163748e90, 0x0841b80013768eea, 0x0841e0000b768ef0, 0x0841f800bb768ef4, - 0x0842b80243768f24, 0x084538004b7a8fb6, 0x084700009b7a8fca, 0x0847a000137a8ff2, - // Entry 1A0 - 1BF - 0x0847d8010b7a8ff8, 0x0848f800db7c903c, 0x0849f8000b7e9074, 0x084c0001c37e9078, - 0x084de000a38090ea, 0x084e900193829114, 0x085028001386917a, 0x0850600043869180, - 0x0850a8001b869192, 0x0850c800db86919a, 0x0851c0001b8691d2, 0x0851f8004b8891da, - 0x085280004b8891ee, 0x0853000203889202, 0x085600013b8c9284, 0x08575800638e92d4, - 0x08580001b38e92ee, 0x0859c800eb90935c, 0x085ac000db929398, 0x085bc000d39493d0, - 0x085cc80023969406, 0x085d48003b969410, 0x086000024b969420, 0x086400019b9a94b4, - 0x086600019b9e951c, 0x0867d00033a09584, 0x08730000fba09592, 0x0880000273a295d2, - 0x08829000f3a49670, 0x0883f8021ba696ae, 0x08868000cba89736, 0x0887800053a8976a, - // Entry 1C0 - 1DF - 0x08880001abaa9780, 0x0889b00073ac97ec, 0x088a80013bac980a, 0x088c000273ae985a, - 0x088e800083b098f8, 0x088f0800a3b0991a, 0x0890000093b29944, 0x0890980163b2996a, - 0x089400003bb499c4, 0x089440000bb499d4, 0x0894500023b499d8, 0x089478007bb499e2, - 0x0894f8005bb49a02, 0x08958001dbb69a1a, 0x0897800053b89a92, 0x0898000023b89aa8, - 0x0898280043b89ab2, 0x0898780013b89ac4, 0x08989800b3b89aca, 0x089950003bba9af8, - 0x0899900013ba9b08, 0x0899a8002bba9b0e, 0x0899e0004bba9b1a, 0x089a380013ba9b2e, - 0x089a58001bba9b34, 0x089a80000bba9b3c, 0x089ab8000bba9b40, 0x089ae8003bba9b44, - 0x089b30003bba9b54, 0x089b80002bbc9b64, 0x08a00002d3bc9b70, 0x08a2d8000bbe9c26, - // Entry 1E0 - 1FF - 0x08a2e8000bbe9c2a, 0x08a4000243be9c2e, 0x08a6800053c09cc0, 0x08ac0001b3c29cd6, - 0x08adc00133c49d44, 0x08b000022bc69d92, 0x08b2800053c89e1e, 0x08b300006bc89e34, - 0x08b40001c3c89e50, 0x08b6000053ca9ec2, 0x08b80000d3cc9ed8, 0x08b8e8007bcc9f0e, - 0x08b9800083cc9f2e, 0x08c500029bcc9f50, 0x08c7f8000bd29ff8, 0x08d60001cbd29ffc, - 0x08e000004bd4a070, 0x08e050016bd4a084, 0x08e1c00073d6a0e0, 0x08e28000ebd6a0fe, - 0x08e3800103d8a13a, 0x08e49000b3daa17c, 0x08e5480073daa1aa, 0x0900001cd3dca1c8, - 0x092000037c0ca8fe, 0x092380002c14a9de, 0x092400062414a9ea, 0x098000217c20ab74, - 0x0a2000123c52b3d4, 0x0b400011cc70b864, 0x0b520000fc8cbcd8, 0x0b530000548ebd18, - // Entry 200 - 21F - 0x0b537000148ebd2e, 0x0b568000f48ebd34, 0x0b578000348ebd72, 0x0b580002348ebd80, - 0x0b5a80005492be0e, 0x0b5ad8003c92be24, 0x0b5b1800ac94be34, 0x0b5be8009c94be60, - 0x0b7800022c96be88, 0x0b7a80017c98bf14, 0x0b7c78008c9abf74, 0x0b7f00000c9abf98, - 0x0b8000bf68013825, 0x0c4000179c9abf9c, 0x0d80000014b8c584, 0x0de000035cb8c58a, - 0x0de380006cbcc662, 0x0de400004cbcc67e, 0x0de4800054bec692, 0x0de4e00044bec6a8, - 0x0e800007b4bec6ba, 0x0e8800013cd2c8a8, 0x0e89480604d4c8f8, 0x0e90000234e0ca7a, - 0x0e980002bce4cb08, 0x0e9b000094e8cbb8, 0x0ea00002ace8cbde, 0x0ea2b0023ceecc8a, - 0x0ea4f00014f2cd1a, 0x0ea510000cf2cd20, 0x0ea5280014f2cd24, 0x0ea5480024f2cd2a, - // Entry 220 - 23F - 0x0ea5700064f2cd34, 0x0ea5d8000cf2cd4e, 0x0ea5e8003cf2cd52, 0x0ea628020cf4cd62, - 0x0ea8380024f8cde6, 0x0ea8680044f8cdf0, 0x0ea8b0003cf8ce02, 0x0ea8f000e4f8ce12, - 0x0ea9d80024face4c, 0x0eaa00002cface56, 0x0eaa30000cface62, 0x0eaa50003cface66, - 0x0eaa900aa4face76, 0x0eb540092512d120, 0x0ebe7015f528d36a, 0x0ed4d8002d60d8e8, - 0x0ed508007d60d8f4, 0x0f0000003d62d914, 0x0f0040008d62d924, 0x0f00d8003d64d948, - 0x0f0118001564d958, 0x0f0130002d64d95e, 0x0f4000062d64d96a, 0x0f4638008570daf6, - 0x0f4800025d70db18, 0x0f4a80005574dbb0, 0x0f4af0001574dbc6, 0x0f7000002574dbcc, - 0x0f702800dd74dbd6, 0x0f7108001576dc0e, 0x0f7120000d76dc14, 0x0f7138000d76dc18, - // Entry 240 - 25F - 0x0f7148005576dc1c, 0x0f71a0002576dc32, 0x0f71c8000d78dc3c, 0x0f71d8000d78dc40, - 0x0f7210000d78dc44, 0x0f7238000d78dc48, 0x0f7248000d78dc4c, 0x0f7258000d78dc50, - 0x0f7268001d78dc54, 0x0f7288001578dc5c, 0x0f72a0000d78dc62, 0x0f72b8000d78dc66, - 0x0f72c8000d78dc6a, 0x0f72d8000d78dc6e, 0x0f72e8000d78dc72, 0x0f72f8000d78dc76, - 0x0f7308001578dc7a, 0x0f7320000d78dc80, 0x0f7338002578dc84, 0x0f7360003d78dc8e, - 0x0f73a000257adc9e, 0x0f73c800257adca8, 0x0f73f0000d7adcb2, 0x0f740000557adcb6, - 0x0f7458008d7adccc, 0x0f7508001d7cdcf0, 0x0f7528002d7cdcf8, 0x0f7558008d7cdd04, - 0x0f778000157edd28, 0x0f800001657edd2e, 0x0f8180032580dd88, 0x0f8500007d84de52, - // Entry 260 - 27F - 0x0f8588007d86de72, 0x0f8608007d86de92, 0x0f8688012d88deb2, 0x0f8800006d88defe, - 0x0f888000fd8adf1a, 0x0f898001e58cdf5a, 0x0f8b8001ed90dfd4, 0x0f8f3000ed92e050, - 0x0f9080016594e08c, 0x0f9200004d98e0e6, 0x0f9280001598e0fa, 0x0f98001e9d98e100, - 0x0fb700006db8e8a8, 0x0fb780003db8e8c4, 0x0fb80003a5b8e8d4, 0x0fbc0002adbee9be, - 0x0fc0000065c4ea6a, 0x0fc08001c5c4ea84, 0x0fc2800055c8eaf6, 0x0fc3000145caeb0c, - 0x0fc48000f5cceb5e, 0x0fc880007dceeb9c, 0x0fc9000045ceebbc, 0x0fc980000dd0ebce, - 0x0fc9980065d0ebd2, 0x0fca000065d0ebec, 0x0fca80007dd0ec06, 0x0fcc000095d0ec26, - 0x0fce00000dd0ec4c, 0x10000536b8015c37, 0x15380081a8019237, 0x15ba0006f001c837, - // Entry 280 - 29F - 0x15c100b41001fe37, 0x17c00010f5d0ec50, 0x700008000df4f08e, 0x7001000305f4f092, - 0x7008000785f8f154, 0x780007fff002342d, 0x800007fff002602d, -} // Size: 5200 bytes - -var table1 = []uint16{ // 31130 elements - // Entry 0 - 3F - 0x0146, 0x014b, 0x015b, 0x0169, 0x0174, 0x017f, 0x018b, 0x0194, - 0x019e, 0x01ae, 0x01bf, 0x01c7, 0x01d0, 0x01d5, 0x01e1, 0x01ea, - 0x01f1, 0x01fb, 0x0204, 0x020d, 0x0218, 0x0222, 0x022c, 0x0235, - 0x0240, 0x024b, 0x0255, 0x025a, 0x0263, 0x0271, 0x027c, 0x028d, - 0x029a, 0x02a7, 0x02bd, 0x02d3, 0x02e9, 0x02ff, 0x0315, 0x032b, - 0x0341, 0x0357, 0x036d, 0x0383, 0x0399, 0x03af, 0x03c5, 0x03db, - 0x03f1, 0x0407, 0x041d, 0x0433, 0x0449, 0x045f, 0x0475, 0x048b, - 0x04a1, 0x04b7, 0x04cd, 0x04e3, 0x04f6, 0x0505, 0x0519, 0x052a, - // Entry 40 - 7F - 0x0532, 0x053e, 0x0552, 0x0566, 0x057a, 0x058e, 0x05a2, 0x05b6, - 0x05ca, 0x05de, 0x05f2, 0x0606, 0x061a, 0x062e, 0x0642, 0x0656, - 0x066a, 0x067e, 0x0692, 0x06a6, 0x06ba, 0x06ce, 0x06e2, 0x06f6, - 0x070a, 0x071e, 0x0732, 0x0746, 0x0758, 0x0765, 0x0778, 0x077d, - 0x037d, 0x038b, 0x03a4, 0x03ad, 0x03b7, 0x03c4, 0x03cc, 0x03d6, - 0x03e2, 0x03eb, 0x03f9, 0x0413, 0x043c, 0x0444, 0x044f, 0x045e, - 0x0464, 0x046f, 0x047e, 0x048d, 0x049e, 0x04aa, 0x04b4, 0x04c0, - 0x04ca, 0x04d1, 0x04e0, 0x04fb, 0x0525, 0x0540, 0x0558, 0x0576, - // Entry 80 - BF - 0x058c, 0x05ad, 0x05ce, 0x05f4, 0x0615, 0x063a, 0x0660, 0x0677, - 0x069a, 0x06bb, 0x06dc, 0x0702, 0x0727, 0x0748, 0x0769, 0x078f, - 0x07b4, 0x07cc, 0x07ed, 0x080e, 0x082f, 0x0855, 0x0876, 0x089b, - 0x08ae, 0x08d0, 0x08f1, 0x0912, 0x0938, 0x095d, 0x097e, 0x0998, - 0x09b2, 0x09d1, 0x09f0, 0x0a14, 0x0a33, 0x0a56, 0x0a7a, 0x0a8f, - 0x0ab0, 0x0acf, 0x0aee, 0x0b12, 0x0b35, 0x0b54, 0x0b73, 0x0b97, - 0x0bba, 0x0bd0, 0x0bef, 0x0c0e, 0x0c2d, 0x0c51, 0x0c70, 0x0c93, - 0x0ca0, 0x0cc0, 0x0cdf, 0x0cfe, 0x0d22, 0x0d45, 0x0d64, 0x0d7c, - // Entry C0 - FF - 0x0d9f, 0x0dc1, 0x0de1, 0x0e02, 0x0e21, 0x0e43, 0x0e63, 0x0e84, - 0x0ea3, 0x0ec9, 0x0eed, 0x0f12, 0x0f35, 0x0f56, 0x0f75, 0x0f96, - 0x0fb5, 0x0fd7, 0x0ff7, 0x1019, 0x1039, 0x105a, 0x1079, 0x109e, - 0x10c1, 0x10e3, 0x1103, 0x1124, 0x1143, 0x1169, 0x118d, 0x11ae, - 0x11cd, 0x11f2, 0x1215, 0x1238, 0x1259, 0x127f, 0x12a3, 0x12c5, - 0x12e5, 0x1306, 0x1325, 0x1347, 0x1367, 0x1388, 0x13a7, 0x13c9, - 0x13e9, 0x140e, 0x142a, 0x1443, 0x145a, 0x1480, 0x14a4, 0x14c7, - 0x14e8, 0x14fe, 0x151f, 0x153e, 0x1561, 0x1582, 0x15a3, 0x15c2, - // Entry 100 - 13F - 0x15e8, 0x160c, 0x162e, 0x164e, 0x166f, 0x168e, 0x16b1, 0x16d2, - 0x16f3, 0x1712, 0x173d, 0x1755, 0x176b, 0x178d, 0x17ad, 0x17ce, - 0x17ed, 0x1815, 0x183b, 0x1854, 0x186b, 0x188c, 0x18ab, 0x18ce, - 0x18ef, 0x1910, 0x192f, 0x1950, 0x196f, 0x1995, 0x19b9, 0x19dc, - 0x19fd, 0x1a1e, 0x1a3d, 0x1a60, 0x1a81, 0x1aa2, 0x1ac1, 0x1ae3, - 0x1b03, 0x1b24, 0x1b43, 0x1b65, 0x1b85, 0x1ba6, 0x1bc5, 0x1beb, - 0x1c0f, 0x1c37, 0x1c5d, 0x1c7f, 0x1c9f, 0x1cc5, 0x1ce9, 0x1d0f, - 0x1d33, 0x1d58, 0x1d79, 0x1d98, 0x1dbd, 0x1de0, 0x1e01, 0x1e20, - // Entry 140 - 17F - 0x1e39, 0x1e59, 0x1e79, 0x1e9b, 0x1ebb, 0x1ed8, 0x1ef3, 0x1f0e, - 0x1f2e, 0x1f4c, 0x1f6a, 0x1f8a, 0x1fac, 0x1fcc, 0x1feb, 0x200a, - 0x2024, 0x203f, 0x205f, 0x207d, 0x209d, 0x20b7, 0x20cc, 0x20e5, - 0x2107, 0x2127, 0x2145, 0x2162, 0x2187, 0x21a4, 0x21c9, 0x21f1, - 0x2219, 0x2239, 0x2257, 0x226e, 0x2283, 0x22a3, 0x22c1, 0x22d0, - 0x22ed, 0x2308, 0x2320, 0x233e, 0x2364, 0x2384, 0x23a2, 0x23cc, - 0x23ec, 0x240a, 0x2426, 0x2446, 0x2466, 0x2484, 0x24a6, 0x24c6, - 0x24de, 0x24ff, 0x251e, 0x253e, 0x255a, 0x2578, 0x2594, 0x25c2, - // Entry 180 - 1BF - 0x25d3, 0x25ec, 0x2606, 0x2621, 0x263d, 0x265f, 0x2694, 0x26b4, - 0x26cb, 0x26f5, 0x270a, 0x2721, 0x274b, 0x2760, 0x2781, 0x27a0, - 0x27c1, 0x27e0, 0x2801, 0x2820, 0x2841, 0x2860, 0x2890, 0x28be, - 0x28ed, 0x291a, 0x2949, 0x2976, 0x29a5, 0x29d2, 0x29ed, 0x2a1d, - 0x2a4b, 0x2a7b, 0x2aa9, 0x2acc, 0x2aed, 0x2b0f, 0x2b2f, 0x2b50, - 0x2b6f, 0x2b90, 0x2baf, 0x2bd1, 0x2bf1, 0x2c1e, 0x2c49, 0x2c6c, - 0x2c8d, 0x2cac, 0x2cc3, 0x2ced, 0x2d02, 0x2d23, 0x2d42, 0x2d5c, - 0x2d75, 0x2d96, 0x2db5, 0x2de5, 0x2e13, 0x2e35, 0x2e55, 0x2e81, - // Entry 1C0 - 1FF - 0x2eab, 0x2ed3, 0x2ef9, 0x2f23, 0x2f4b, 0x2f73, 0x2f99, 0x2fc3, - 0x2feb, 0x3013, 0x3039, 0x3063, 0x308b, 0x30b3, 0x30d9, 0x3103, - 0x312b, 0x3153, 0x3179, 0x31a3, 0x31cb, 0x31f3, 0x3219, 0x3243, - 0x326b, 0x3292, 0x32b7, 0x32de, 0x3303, 0x331c, 0x3333, 0x3354, - 0x3373, 0x339d, 0x33bb, 0x33d2, 0x33e7, 0x3407, 0x3425, 0x344a, - 0x346d, 0x3490, 0x34b1, 0x34e1, 0x350f, 0x353b, 0x3565, 0x358a, - 0x35ad, 0x35dd, 0x360b, 0x362d, 0x364d, 0x366b, 0x3689, 0x36a7, - 0x36c3, 0x36e0, 0x36fd, 0x371f, 0x3741, 0x3761, 0x3780, 0x37ab, - // Entry 200 - 23F - 0x37cf, 0x37f3, 0x3814, 0x3833, 0x3855, 0x386f, 0x388c, 0x38ae, - 0x38ce, 0x38f0, 0x3910, 0x393b, 0x395e, 0x3980, 0x39a0, 0x39c2, - 0x39e2, 0x39fd, 0x3a15, 0x3a34, 0x3a52, 0x3a6b, 0x3a89, 0x3aa7, - 0x3ac5, 0x3ae2, 0x3afa, 0x3b1c, 0x3b35, 0x3b57, 0x3b83, 0x3bac, - 0x3bd4, 0x3bf2, 0x3c0d, 0x3c29, 0x3c41, 0x3c5d, 0x3c78, 0x3c96, - 0x3cb7, 0x3cd7, 0x3cee, 0x3d0a, 0x3d30, 0x3d4e, 0x3d76, 0x3d8d, - 0x3da8, 0x3dd1, 0x3def, 0x3e12, 0x3e3a, 0x3e56, 0x3e71, 0x3e8e, - 0x3ead, 0x3ec3, 0x3ede, 0x3f07, 0x3f2c, 0x3f4e, 0x3f6c, 0x3f8e, - // Entry 240 - 27F - 0x3fb9, 0x3fd5, 0x3ffa, 0x4018, 0x402e, 0x405f, 0x4084, 0x40a4, - 0x40bf, 0x40e7, 0x40ff, 0x4119, 0x4137, 0x4152, 0x416d, 0x4188, - 0x41a4, 0x41cc, 0x41ea, 0x4200, 0x4220, 0x4239, 0x4261, 0x4283, - 0x429b, 0x42b6, 0x42d2, 0x42f2, 0x4318, 0x4334, 0x435a, 0x4375, - 0x4391, 0x43af, 0x43d4, 0x4402, 0x441f, 0x443e, 0x4465, 0x4482, - 0x44a1, 0x44c8, 0x44e7, 0x4504, 0x4521, 0x4541, 0x4561, 0x458a, - 0x45bc, 0x45d3, 0x45f4, 0x460b, 0x4622, 0x4640, 0x4668, 0x4690, - 0x46a7, 0x46be, 0x46d3, 0x46ef, 0x470b, 0x4725, 0x4743, 0x4762, - // Entry 280 - 2BF - 0x4780, 0x479c, 0x47c1, 0x47df, 0x47fe, 0x481a, 0x4838, 0x4859, - 0x485e, 0x487b, 0x4891, 0x48ad, 0x48c9, 0x48ea, 0x4904, 0x4924, - 0x4944, 0x4964, 0x4989, 0x49b0, 0x49d6, 0x49ed, 0x4a06, 0x4a1f, - 0x4a39, 0x4a3e, 0x4a47, 0x4a51, 0x4a57, 0x4a62, 0x4a75, 0x4a90, - 0x4aac, 0x4ac7, 0x4ade, 0x4af5, 0x4b0c, 0x4b37, 0x4b5a, 0x4b77, - 0x4b93, 0x4baf, 0x4bd1, 0x4bf8, 0x4c20, 0x4c37, 0x4c52, 0x4c73, - 0x4c95, 0x4cb5, 0x4cd7, 0x4cfa, 0x4d12, 0x4d35, 0x4d5f, 0x4d89, - 0x4da2, 0x4dbe, 0x4ddd, 0x4dfa, 0x4e18, 0x4e34, 0x4e49, 0x4e63, - // Entry 2C0 - 2FF - 0x4e81, 0x4e97, 0x4ead, 0x4ec8, 0x4ed7, 0x4ee7, 0x4ef9, 0x4f08, - 0x4f1b, 0x4f2e, 0x4f42, 0x4f56, 0x4f73, 0x4f82, 0x4f9f, 0x4fc3, - 0x4fe0, 0x4ff5, 0x500d, 0x5029, 0x503e, 0x505c, 0x5077, 0x5093, - 0x50af, 0x50c8, 0x50e2, 0x50fc, 0x510a, 0x5128, 0x513f, 0x5158, - 0x5171, 0x518b, 0x51ab, 0x51c9, 0x51dc, 0x51f5, 0x5209, 0x521e, - 0x522f, 0x523f, 0x525c, 0x5272, 0x5296, 0x52ab, 0x52cc, 0x52e1, - 0x52ff, 0x5314, 0x532a, 0x533c, 0x5355, 0x536c, 0x538a, 0x53a7, - 0x53c6, 0x53e4, 0x5403, 0x5422, 0x5438, 0x544f, 0x5460, 0x5478, - // Entry 300 - 33F - 0x5491, 0x54aa, 0x54c3, 0x54de, 0x54f5, 0x5514, 0x5531, 0x5547, - 0x5562, 0x5586, 0x55a0, 0x55b9, 0x55d3, 0x55f2, 0x5612, 0x562f, - 0x5648, 0x5667, 0x5685, 0x5696, 0x56a7, 0x56c5, 0x56e4, 0x5714, - 0x5733, 0x574c, 0x5764, 0x577f, 0x5795, 0x57b1, 0x57c7, 0x57de, - 0x57fb, 0x5811, 0x5830, 0x5857, 0x5875, 0x5893, 0x58b1, 0x58cf, - 0x58ed, 0x590b, 0x5929, 0x5947, 0x5965, 0x5983, 0x59a1, 0x59bf, - 0x59dd, 0x59f6, 0x5a0d, 0x5a2f, 0x5a4f, 0x5a61, 0x5a79, 0x5aa0, - 0x5ac5, 0x02c5, 0x02d8, 0x0300, 0x0326, 0x0355, 0x0368, 0x0380, - // Entry 340 - 37F - 0x0380, 0x038b, 0x03a0, 0x03c5, 0x03d5, 0x03fc, 0x041f, 0x0443, - 0x0043, 0x006a, 0x006a, 0x0091, 0x00b6, 0x00e6, 0x0100, 0x0119, - 0x0133, 0x014d, 0x0169, 0x0182, 0x019a, 0x01b4, 0x01cd, 0x01e7, - 0x0201, 0x0218, 0x022f, 0x0246, 0x0262, 0x0279, 0x0291, 0x0291, - 0x02ab, 0x02c3, 0x02df, 0x02f7, 0x030f, 0x0327, 0x0341, 0x0369, - 0x0394, 0x03b7, 0x03dc, 0x03fd, 0x041f, 0x0452, 0x046a, 0x0481, - 0x0499, 0x04b1, 0x04cb, 0x04e2, 0x04f8, 0x0510, 0x0527, 0x053f, - 0x0557, 0x056c, 0x0581, 0x0596, 0x05b0, 0x05c5, 0x05db, 0x05f9, - // Entry 380 - 3BF - 0x0611, 0x0627, 0x0641, 0x0657, 0x066d, 0x0683, 0x069b, 0x06c1, - 0x06ea, 0x070f, 0x0734, 0x0757, 0x076f, 0x0780, 0x0792, 0x07b0, - 0x07d8, 0x0804, 0x0814, 0x0823, 0x0833, 0x084d, 0x086d, 0x0880, - 0x0899, 0x08ad, 0x08c7, 0x08d9, 0x08f1, 0x0903, 0x091b, 0x0935, - 0x094d, 0x0966, 0x097d, 0x0997, 0x09af, 0x09c9, 0x09e1, 0x09fd, - 0x0a17, 0x0a32, 0x0a4b, 0x0a64, 0x0a7b, 0x0a8d, 0x0a9d, 0x0ab6, - 0x0ac6, 0x0ae0, 0x0afb, 0x0b1f, 0x0b37, 0x0b4d, 0x0b6e, 0x0b86, - 0x0b9c, 0x0bb8, 0x0be2, 0x0c0a, 0x0c3b, 0x0c60, 0x0c7a, 0x0c95, - // Entry 3C0 - 3FF - 0x0cb0, 0x0cd4, 0x0cef, 0x0d1f, 0x0d39, 0x0d53, 0x0d6e, 0x0d89, - 0x0da5, 0x0dc0, 0x0de4, 0x0e03, 0x0e1f, 0x0e38, 0x0e52, 0x0e6c, - 0x0e87, 0x0ea1, 0x0ebb, 0x0ed6, 0x0ef0, 0x0f09, 0x0f28, 0x0f42, - 0x0f5c, 0x0f76, 0x0f90, 0x0fa9, 0x0fc3, 0x0fdd, 0x0ff7, 0x1011, - 0x102a, 0x1044, 0x105e, 0x1079, 0x1094, 0x10af, 0x10cc, 0x10ed, - 0x1109, 0x112a, 0x1143, 0x115d, 0x1177, 0x118e, 0x11a6, 0x11be, - 0x11d7, 0x11ef, 0x1207, 0x1220, 0x1238, 0x124f, 0x126c, 0x1284, - 0x129c, 0x12b4, 0x12cc, 0x12e3, 0x12fb, 0x1313, 0x132b, 0x1343, - // Entry 400 - 43F - 0x135a, 0x1372, 0x138a, 0x13a3, 0x13bc, 0x13d5, 0x13f0, 0x140f, - 0x1429, 0x1448, 0x145f, 0x1477, 0x148f, 0x14b2, 0x14ca, 0x14e3, - 0x14fc, 0x151e, 0x1537, 0x1565, 0x157d, 0x1595, 0x15ae, 0x15c7, - 0x15e1, 0x15fa, 0x161c, 0x1639, 0x1653, 0x1670, 0x168b, 0x16a6, - 0x16bf, 0x16e1, 0x1701, 0x1723, 0x1743, 0x176e, 0x1797, 0x17b6, - 0x17d3, 0x17fb, 0x1821, 0x183c, 0x1855, 0x1870, 0x1889, 0x18a5, - 0x18bf, 0x18de, 0x18fb, 0x1933, 0x1969, 0x1983, 0x199b, 0x19be, - 0x19df, 0x1a07, 0x1a2d, 0x1a47, 0x1a5f, 0x1a7c, 0x1a97, 0x1aae, - // Entry 440 - 47F - 0x1ac6, 0x1ae7, 0x1b08, 0x1b29, 0x1b44, 0x1b6d, 0x1b8d, 0x1bb6, - 0x1bdd, 0x1c02, 0x1c25, 0x1c49, 0x1c6b, 0x1c92, 0x1cb7, 0x1cde, - 0x1d03, 0x1d2f, 0x1d59, 0x1d83, 0x1dab, 0x1dd4, 0x1dfb, 0x1e24, - 0x1e4b, 0x1e7a, 0x1ea7, 0x1ecd, 0x1ef1, 0x1f13, 0x1f33, 0x1f5c, - 0x1f83, 0x1fa3, 0x1fc1, 0x1fec, 0x2015, 0x2039, 0x205b, 0x2084, - 0x20ab, 0x20d4, 0x20fb, 0x211d, 0x213d, 0x216b, 0x2197, 0x21c0, - 0x21e7, 0x2207, 0x2225, 0x224f, 0x2277, 0x22a7, 0x22d5, 0x22f1, - 0x230b, 0x2330, 0x2353, 0x2387, 0x23b9, 0x23d1, 0x23f7, 0x241b, - // Entry 480 - 4BF - 0x243f, 0x2461, 0x2485, 0x24a7, 0x24cb, 0x24ed, 0x2511, 0x2533, - 0x2559, 0x257d, 0x25a1, 0x25c3, 0x25e1, 0x2605, 0x2627, 0x264f, - 0x2675, 0x2693, 0x26af, 0x26d4, 0x26f7, 0x2714, 0x272f, 0x275b, - 0x2785, 0x27af, 0x27d7, 0x2800, 0x2827, 0x284c, 0x286f, 0x2894, - 0x28b7, 0x28df, 0x2905, 0x292d, 0x2953, 0x2973, 0x2991, 0x29c0, - 0x29ed, 0x2a15, 0x2a3b, 0x2a60, 0x2a83, 0x2aab, 0x2ad1, 0x2afc, - 0x2b25, 0x2b4f, 0x2b77, 0x2ba1, 0x2bc9, 0x2bf4, 0x2c1d, 0x2c4d, - 0x2c7b, 0x2c9f, 0x2cc1, 0x2ce7, 0x2d0b, 0x2d2a, 0x2d47, 0x2d67, - // Entry 4C0 - 4FF - 0x2d85, 0x2da5, 0x2dc3, 0x2de4, 0x2e03, 0x2e23, 0x2e41, 0x2e61, - 0x2e7f, 0x2e9f, 0x2ebd, 0x2edd, 0x2efb, 0x2f1e, 0x2f3f, 0x2f63, - 0x2f85, 0x2fa0, 0x2fb9, 0x2fd4, 0x2fed, 0x3008, 0x3021, 0x303b, - 0x3053, 0x306d, 0x3085, 0x30a5, 0x30c3, 0x30ee, 0x3117, 0x3142, - 0x316b, 0x3194, 0x31bb, 0x31e6, 0x320f, 0x3238, 0x325f, 0x327c, - 0x3297, 0x32b3, 0x32cd, 0x32f6, 0x331d, 0x031d, 0x0338, 0x0353, - 0x036e, 0x0388, 0x03a3, 0x03bd, 0x03d7, 0x03f1, 0x040b, 0x0426, - 0x0441, 0x045d, 0x0478, 0x0492, 0x04ad, 0x04c7, 0x04e1, 0x04fd, - // Entry 500 - 53F - 0x0519, 0x0534, 0x054e, 0x0569, 0x0584, 0x059e, 0x05b9, 0x05d4, - 0x05f0, 0x060a, 0x0625, 0x0640, 0x065c, 0x0677, 0x0691, 0x06ad, - 0x06c9, 0x06e4, 0x06fe, 0x0719, 0x0319, 0x0340, 0x0353, 0x0369, - 0x0382, 0x0390, 0x03a6, 0x03c0, 0x03c0, 0x03d9, 0x03f2, 0x040b, - 0x0423, 0x043c, 0x0454, 0x046c, 0x0484, 0x049c, 0x04b5, 0x04ce, - 0x04e8, 0x0501, 0x0519, 0x0532, 0x054a, 0x0562, 0x057c, 0x0596, - 0x05af, 0x05c7, 0x05e0, 0x05f9, 0x0611, 0x062a, 0x0643, 0x065d, - 0x0675, 0x068e, 0x06a7, 0x06c1, 0x06da, 0x06f2, 0x070c, 0x0726, - // Entry 540 - 57F - 0x073f, 0x0757, 0x0770, 0x0790, 0x0390, 0x03a2, 0x03b1, 0x03b1, - 0x03d4, 0x03f6, 0x0408, 0x0008, 0x001d, 0x0030, 0x0048, 0x0061, - 0x007a, 0x008e, 0x00a1, 0x00b4, 0x00c8, 0x00db, 0x00ee, 0x0102, - 0x011d, 0x0134, 0x014d, 0x0169, 0x017c, 0x0196, 0x01a9, 0x01bf, - 0x01d3, 0x01ee, 0x0201, 0x0214, 0x0230, 0x024c, 0x025d, 0x026f, - 0x0281, 0x0294, 0x02ad, 0x02bf, 0x02d7, 0x02ef, 0x0308, 0x031a, - 0x032c, 0x033e, 0x0350, 0x0363, 0x0375, 0x0395, 0x03a8, 0x03c4, - 0x03d6, 0x03ee, 0x03ff, 0x0417, 0x042c, 0x0440, 0x045c, 0x0471, - // Entry 580 - 5BF - 0x0486, 0x04a4, 0x04bd, 0x00bd, 0x00cf, 0x00e0, 0x00f3, 0x0106, - 0x0116, 0x0127, 0x013a, 0x014b, 0x015c, 0x016d, 0x0184, 0x0195, - 0x01a8, 0x01bf, 0x01d0, 0x01e7, 0x01f8, 0x020c, 0x021e, 0x0234, - 0x0244, 0x025d, 0x0270, 0x0281, 0x0293, 0x02a5, 0x02b6, 0x02b6, - 0x02d8, 0x02f7, 0x0319, 0x0332, 0x034e, 0x034e, 0x0360, 0x0371, - 0x0387, 0x0398, 0x03aa, 0x03c2, 0x03d8, 0x03f0, 0x03fa, 0x0415, - 0x0437, 0x0443, 0x044f, 0x0464, 0x047c, 0x048d, 0x04b5, 0x04d0, - 0x04ee, 0x050b, 0x0520, 0x0535, 0x0566, 0x057c, 0x058e, 0x05a0, - // Entry 5C0 - 5FF - 0x05b2, 0x05c2, 0x05d4, 0x01d4, 0x01f6, 0x020a, 0x0224, 0x0237, - 0x025a, 0x027d, 0x029f, 0x02c2, 0x02e4, 0x02f6, 0x0307, 0x0320, - 0x0331, 0x0343, 0x0355, 0x0366, 0x0378, 0x0389, 0x039b, 0x03ac, - 0x03be, 0x03d0, 0x03e3, 0x03f4, 0x0405, 0x0416, 0x0427, 0x0438, - 0x044b, 0x0472, 0x049b, 0x04c2, 0x04ed, 0x051a, 0x0528, 0x0539, - 0x054a, 0x055b, 0x056c, 0x057e, 0x0590, 0x05a1, 0x05b2, 0x05cc, - 0x05dd, 0x05ec, 0x05fb, 0x060a, 0x0616, 0x0622, 0x062e, 0x063b, - 0x0647, 0x065a, 0x066c, 0x067e, 0x0693, 0x06a8, 0x06bf, 0x06ce, - // Entry 600 - 63F - 0x06ed, 0x0715, 0x0730, 0x0745, 0x075f, 0x0776, 0x078d, 0x07a3, - 0x07b9, 0x07d1, 0x07e8, 0x07ff, 0x0815, 0x082d, 0x0845, 0x085c, - 0x086f, 0x0887, 0x08a1, 0x08b9, 0x08d2, 0x08eb, 0x0909, 0x0921, - 0x0949, 0x0971, 0x0989, 0x09a6, 0x09c2, 0x09e2, 0x09fe, 0x0a10, - 0x0a24, 0x0a36, 0x0a51, 0x0a82, 0x0a93, 0x0aa6, 0x0ab9, 0x0adb, - 0x0b09, 0x0b1b, 0x0b2d, 0x0b54, 0x0b67, 0x0b7c, 0x0b8e, 0x0ba9, - 0x0bc9, 0x0bf7, 0x0c0a, 0x0c1e, 0x0c2f, 0x0c60, 0x0c86, 0x0c98, - 0x0cb6, 0x0cd1, 0x0cf1, 0x0d15, 0x0d43, 0x0d68, 0x0d79, 0x0d9f, - // Entry 640 - 67F - 0x0dce, 0x0df6, 0x0e33, 0x0e58, 0x0e7f, 0x0ea6, 0x0ecd, 0x0ee6, - 0x0f0c, 0x0f2c, 0x0f3d, 0x0f64, 0x0f77, 0x0f97, 0x0fbe, 0x0fd1, - 0x0fe8, 0x1003, 0x1023, 0x1033, 0x105a, 0x106b, 0x1086, 0x1099, - 0x10be, 0x10d0, 0x10f7, 0x1115, 0x1135, 0x115c, 0x1183, 0x11a4, - 0x11bd, 0x11d0, 0x11ec, 0x1214, 0x1231, 0x1253, 0x1273, 0x1289, - 0x12b0, 0x12ce, 0x12e9, 0x1301, 0x1311, 0x1320, 0x1330, 0x1348, - 0x136d, 0x137d, 0x1394, 0x13af, 0x13cd, 0x13ed, 0x13fc, 0x1423, - 0x143b, 0x1464, 0x1474, 0x1484, 0x14bd, 0x14f6, 0x1519, 0x1533, - // Entry 680 - 6BF - 0x1549, 0x1565, 0x157b, 0x158d, 0x15a8, 0x15c6, 0x15f0, 0x1616, - 0x163a, 0x164f, 0x1666, 0x1676, 0x1686, 0x169b, 0x16b1, 0x16c7, - 0x16e3, 0x1700, 0x172b, 0x1740, 0x1761, 0x1782, 0x17a2, 0x17c1, - 0x17e0, 0x1801, 0x1821, 0x1841, 0x1860, 0x1881, 0x18a2, 0x18c2, - 0x18e4, 0x1904, 0x1926, 0x1942, 0x1965, 0x1986, 0x199d, 0x19b9, - 0x19d3, 0x19eb, 0x1a01, 0x1a18, 0x1a30, 0x1a49, 0x1a6d, 0x1a90, - 0x1aa2, 0x1ab8, 0x1ad1, 0x1aeb, 0x02eb, 0x0303, 0x0316, 0x0335, - 0x0347, 0x035a, 0x0376, 0x038a, 0x03ab, 0x03bb, 0x03cc, 0x03de, - // Entry 6C0 - 6FF - 0x03f0, 0x0402, 0x041d, 0x042f, 0x0444, 0x0456, 0x046a, 0x047b, - 0x048c, 0x04a1, 0x04bc, 0x04cb, 0x04db, 0x04f4, 0x0507, 0x0519, - 0x052b, 0x053d, 0x054e, 0x0569, 0x0585, 0x05a2, 0x05b5, 0x05c8, - 0x05dc, 0x05ef, 0x0602, 0x0616, 0x0628, 0x063a, 0x0658, 0x0673, - 0x0685, 0x0697, 0x06b0, 0x06c2, 0x06d4, 0x06e0, 0x06f3, 0x0703, - 0x0712, 0x0730, 0x074e, 0x0765, 0x077c, 0x0795, 0x07ae, 0x07ba, - 0x07c8, 0x03c8, 0x03e3, 0x03fe, 0x0416, 0x044a, 0x047f, 0x04b7, - 0x0502, 0x0535, 0x0562, 0x0580, 0x05a5, 0x05dd, 0x061b, 0x0648, - // Entry 700 - 73F - 0x0665, 0x068c, 0x06b1, 0x06eb, 0x071b, 0x0740, 0x0778, 0x079a, - 0x07c3, 0x07fd, 0x081e, 0x083f, 0x0865, 0x0886, 0x08a5, 0x08bf, - 0x08ef, 0x0911, 0x0942, 0x0976, 0x09b1, 0x09ed, 0x0a28, 0x0a5c, - 0x0a99, 0x0ad8, 0x0b1a, 0x0b5e, 0x0ba1, 0x0bdd, 0x0c1b, 0x0c5e, - 0x0ca3, 0x0ce0, 0x0d1e, 0x0d40, 0x0d65, 0x0d76, 0x0d8d, 0x0da0, - 0x0db1, 0x0dc2, 0x0dd9, 0x0dec, 0x0dff, 0x0e12, 0x0e25, 0x0e38, - 0x0e4c, 0x0e5e, 0x0e71, 0x0e84, 0x0e9b, 0x0eae, 0x0ec4, 0x0eda, - 0x0ef0, 0x0f01, 0x0f17, 0x0f2d, 0x0f44, 0x0f56, 0x0f68, 0x0f7a, - // Entry 740 - 77F - 0x0f8e, 0x0f9f, 0x0fb3, 0x0fc7, 0x0fdb, 0x0feb, 0x0ffb, 0x100d, - 0x1021, 0x1034, 0x1047, 0x1055, 0x1065, 0x1073, 0x1083, 0x1091, - 0x10a1, 0x10af, 0x10bf, 0x10cd, 0x10dd, 0x10e9, 0x10fa, 0x00fa, - 0x0108, 0x0115, 0x0122, 0x0131, 0x013f, 0x014d, 0x015a, 0x0169, - 0x0178, 0x0186, 0x0192, 0x019f, 0x01ab, 0x01b7, 0x01c3, 0x01d0, - 0x01dc, 0x01f1, 0x01fd, 0x020a, 0x0217, 0x0224, 0x0231, 0x023f, - 0x024c, 0x0259, 0x0267, 0x0274, 0x0282, 0x028f, 0x029c, 0x02a9, - 0x02bd, 0x02ca, 0x02d8, 0x02e5, 0x02f2, 0x02ff, 0x030c, 0x0321, - // Entry 780 - 7BF - 0x0333, 0x0346, 0x0358, 0x0375, 0x0391, 0x03b0, 0x03d2, 0x03ee, - 0x0409, 0x0427, 0x0446, 0x0464, 0x047c, 0x0493, 0x04a7, 0x04bc, - 0x04c5, 0x04d9, 0x04e7, 0x00e7, 0x00fc, 0x0110, 0x0126, 0x013c, - 0x014f, 0x0163, 0x0177, 0x018a, 0x019e, 0x01b2, 0x01c7, 0x01dd, - 0x01f1, 0x0205, 0x021d, 0x0230, 0x0243, 0x025b, 0x026f, 0x0284, - 0x0299, 0x02ae, 0x02bf, 0x02d5, 0x02ed, 0x0302, 0x032a, 0x0347, - 0x0362, 0x0378, 0x0398, 0x03b4, 0x03cb, 0x03ea, 0x0405, 0x041b, - 0x043c, 0x0458, 0x0473, 0x0489, 0x04a4, 0x04bf, 0x04d5, 0x04eb, - // Entry 7C0 - 7FF - 0x0505, 0x051b, 0x011b, 0x0138, 0x0154, 0x016f, 0x0188, 0x01a4, - 0x01c4, 0x01df, 0x0202, 0x021d, 0x0238, 0x0252, 0x026c, 0x0289, - 0x02ab, 0x02c7, 0x02c7, 0x02db, 0x02ec, 0x02fd, 0x030e, 0x031f, - 0x0335, 0x0346, 0x0357, 0x0369, 0x037c, 0x038d, 0x039e, 0x03af, - 0x03c0, 0x03d1, 0x03e2, 0x03f3, 0x0405, 0x0416, 0x0427, 0x0439, - 0x044a, 0x0461, 0x0473, 0x0485, 0x049d, 0x04b6, 0x04cd, 0x00cd, - 0x00e0, 0x00e0, 0x0104, 0x0126, 0x014c, 0x0171, 0x01a6, 0x01c6, - 0x01e7, 0x020f, 0x0244, 0x0277, 0x0292, 0x02b3, 0x02cd, 0x02e3, - // Entry 800 - 83F - 0x030a, 0x0331, 0x0357, 0x0371, 0x0399, 0x03c0, 0x03e0, 0x03e0, - 0x0407, 0x042e, 0x0454, 0x047b, 0x04b5, 0x04ce, 0x04e7, 0x0501, - 0x0101, 0x011e, 0x0133, 0x0148, 0x015d, 0x017e, 0x019e, 0x01c1, - 0x01e0, 0x01fe, 0x021a, 0x0234, 0x0250, 0x0271, 0x028d, 0x02a8, - 0x02c1, 0x02d3, 0x02e5, 0x02f7, 0x030c, 0x0321, 0x0336, 0x034f, - 0x0369, 0x037f, 0x0398, 0x03b2, 0x03c8, 0x03dc, 0x03f0, 0x0404, - 0x0419, 0x042f, 0x044a, 0x0465, 0x0480, 0x049c, 0x04b7, 0x04d3, - 0x04f6, 0x0522, 0x0547, 0x055c, 0x057c, 0x05a0, 0x05bb, 0x05d3, - // Entry 840 - 87F - 0x05ea, 0x0603, 0x0616, 0x062a, 0x063d, 0x0651, 0x0664, 0x0678, - 0x0693, 0x06ae, 0x06c8, 0x06e1, 0x06f4, 0x0708, 0x0722, 0x073b, - 0x074e, 0x0762, 0x0776, 0x078b, 0x079f, 0x07b4, 0x07c9, 0x07dd, - 0x07f2, 0x0806, 0x081b, 0x0830, 0x0845, 0x085b, 0x0870, 0x0886, - 0x089b, 0x08af, 0x08c4, 0x08d8, 0x08ed, 0x0901, 0x0917, 0x092b, - 0x0940, 0x0954, 0x0969, 0x097d, 0x0991, 0x09a5, 0x09ba, 0x09ce, - 0x09e3, 0x09f9, 0x0a0d, 0x0a22, 0x0a37, 0x0a4b, 0x0a5f, 0x0a77, - 0x0a90, 0x0aa5, 0x0abd, 0x0ad5, 0x0aec, 0x0b04, 0x0b1b, 0x0b33, - // Entry 880 - 8BF - 0x0b52, 0x0b72, 0x0b90, 0x0bad, 0x0bc4, 0x0bdc, 0x0bfa, 0x0c17, - 0x0c2e, 0x0c46, 0x0c5c, 0x0c81, 0x0c99, 0x0ca6, 0x0cc3, 0x0ce2, - 0x0cf9, 0x0d10, 0x0d33, 0x0d4b, 0x0d64, 0x0d78, 0x0d8e, 0x0da4, - 0x0db8, 0x0dcf, 0x0de4, 0x0df8, 0x0e0d, 0x0e29, 0x0e45, 0x0e64, - 0x0e84, 0x0e94, 0x0eab, 0x0ec0, 0x0ed4, 0x0ee8, 0x0efe, 0x0f13, - 0x0f28, 0x0f3c, 0x0f52, 0x0f68, 0x0f7d, 0x0f99, 0x0fb9, 0x0fd3, - 0x0fe7, 0x0ffc, 0x1010, 0x1024, 0x1039, 0x1056, 0x106b, 0x1085, - 0x109a, 0x10af, 0x10cd, 0x10e3, 0x10f8, 0x1104, 0x111c, 0x1131, - // Entry 8C0 - 8FF - 0x1145, 0x0145, 0x0155, 0x0166, 0x0176, 0x0187, 0x0197, 0x01a8, - 0x01c0, 0x01d8, 0x01d8, 0x01e8, 0x01f9, 0x01f9, 0x0209, 0x021a, - 0x022b, 0x023d, 0x024e, 0x0260, 0x0272, 0x0283, 0x0295, 0x02a6, - 0x02b8, 0x02ca, 0x02dc, 0x02ef, 0x0301, 0x0314, 0x0326, 0x0337, - 0x0349, 0x035a, 0x036c, 0x037d, 0x037d, 0x038e, 0x03a0, 0x03b1, - 0x03c3, 0x03d4, 0x03e5, 0x03f6, 0x03f6, 0x0407, 0x0007, 0x0019, - 0x002b, 0x003c, 0x004d, 0x004d, 0x005f, 0x0074, 0x0089, 0x009d, - 0x00b2, 0x00c6, 0x00db, 0x00f7, 0x0114, 0x0114, 0x0128, 0x013d, - // Entry 900 - 93F - 0x013d, 0x0151, 0x0166, 0x0179, 0x0191, 0x0191, 0x01a7, 0x01a7, - 0x01b9, 0x01cb, 0x01cb, 0x01dd, 0x01f6, 0x020f, 0x022b, 0x0248, - 0x0248, 0x025a, 0x026b, 0x027c, 0x028f, 0x02a1, 0x02b3, 0x02c4, - 0x02d7, 0x02ea, 0x02fc, 0x0322, 0x0347, 0x0359, 0x036b, 0x0389, - 0x03a7, 0x03c7, 0x03e6, 0x041e, 0x0442, 0x0450, 0x0462, 0x0062, - 0x007a, 0x008d, 0x00a2, 0x00a2, 0x00b3, 0x00c5, 0x00d6, 0x00e8, - 0x00f9, 0x010b, 0x010b, 0x011d, 0x012f, 0x012f, 0x0141, 0x0153, - 0x0165, 0x0178, 0x018a, 0x019d, 0x01b0, 0x01c2, 0x01d5, 0x01e7, - // Entry 940 - 97F - 0x01fa, 0x020d, 0x0220, 0x0234, 0x0247, 0x025b, 0x026e, 0x0280, - 0x0293, 0x02a5, 0x02b8, 0x02ca, 0x02ca, 0x02dc, 0x02ef, 0x0301, - 0x0314, 0x0326, 0x0338, 0x034a, 0x034a, 0x035c, 0x036f, 0x036f, - 0x0381, 0x0394, 0x0394, 0x03a6, 0x03b8, 0x03b8, 0x03cb, 0x03cb, - 0x03e1, 0x03f6, 0x040c, 0x0421, 0x0437, 0x0037, 0x004d, 0x0063, - 0x0063, 0x0079, 0x008f, 0x00a3, 0x00a3, 0x00b6, 0x00b6, 0x00ca, - 0x00de, 0x00f0, 0x0103, 0x0103, 0x0115, 0x0115, 0x0128, 0x013a, - 0x014c, 0x0160, 0x0173, 0x0186, 0x0198, 0x01ac, 0x01c0, 0x01d3, - // Entry 980 - 9BF - 0x01e1, 0x01ef, 0x01fb, 0x0207, 0x0218, 0x022c, 0x022c, 0x0245, - 0x025b, 0x0270, 0x0270, 0x0281, 0x0293, 0x02a4, 0x02b6, 0x02c7, - 0x02d9, 0x02f2, 0x030b, 0x0322, 0x0322, 0x0333, 0x0345, 0x035c, - 0x035c, 0x036d, 0x037f, 0x0391, 0x03a4, 0x03b6, 0x03c9, 0x03dc, - 0x03ee, 0x0401, 0x0413, 0x0426, 0x0439, 0x044c, 0x0460, 0x0473, - 0x0487, 0x049a, 0x04ac, 0x04bf, 0x04d1, 0x04e4, 0x04f6, 0x00f6, - 0x0108, 0x011b, 0x012d, 0x0140, 0x0152, 0x0164, 0x0176, 0x0176, - 0x0188, 0x019b, 0x019b, 0x01ad, 0x01c0, 0x01d3, 0x01e5, 0x01f7, - // Entry 9C0 - 9FF - 0x01f7, 0x020a, 0x0220, 0x0236, 0x024b, 0x0261, 0x0276, 0x028c, - 0x02a9, 0x02c7, 0x02e3, 0x02e3, 0x02f8, 0x030e, 0x032a, 0x032a, - 0x033f, 0x0355, 0x0369, 0x0369, 0x0374, 0x0374, 0x038e, 0x03a8, - 0x03c5, 0x03e3, 0x03e3, 0x03f6, 0x0408, 0x041a, 0x042e, 0x0441, - 0x0454, 0x0466, 0x047a, 0x048e, 0x04a1, 0x04bb, 0x04ce, 0x00ce, - 0x00e1, 0x00e1, 0x00f7, 0x010a, 0x011c, 0x011c, 0x012a, 0x0139, - 0x0147, 0x0156, 0x0164, 0x0173, 0x0189, 0x019f, 0x019f, 0x01ad, - 0x01bc, 0x01bc, 0x01ca, 0x01d9, 0x01e8, 0x01f8, 0x0207, 0x0217, - // Entry A00 - A3F - 0x0227, 0x0236, 0x0246, 0x0255, 0x0265, 0x0275, 0x0285, 0x0296, - 0x02a6, 0x02b7, 0x02c7, 0x02d6, 0x02e6, 0x02f5, 0x0305, 0x0314, - 0x0314, 0x0323, 0x0333, 0x0342, 0x0352, 0x0361, 0x0370, 0x037f, - 0x037f, 0x038e, 0x039e, 0x039e, 0x03ad, 0x03bd, 0x03cd, 0x03dc, - 0x03eb, 0x03eb, 0x03fb, 0x040e, 0x0421, 0x0433, 0x0446, 0x0458, - 0x046b, 0x0485, 0x04a0, 0x00a0, 0x00b2, 0x00c5, 0x00c5, 0x00d7, - 0x00ea, 0x00fb, 0x00fb, 0x010f, 0x0123, 0x0123, 0x0133, 0x0143, - 0x0143, 0x0153, 0x016a, 0x0181, 0x019b, 0x01b6, 0x01b6, 0x01c6, - // Entry A40 - A7F - 0x01d5, 0x01e4, 0x01f5, 0x0205, 0x0215, 0x0224, 0x0235, 0x0246, - 0x0256, 0x0262, 0x0271, 0x028b, 0x02a2, 0x02bf, 0x02db, 0x02f4, - 0x0313, 0x0313, 0x0326, 0x0338, 0x0338, 0x0346, 0x0355, 0x0363, - 0x0372, 0x0380, 0x038f, 0x038f, 0x039d, 0x03ac, 0x03bb, 0x03bb, - 0x03c9, 0x03d8, 0x03e7, 0x03f6, 0x03f6, 0x0406, 0x0415, 0x0015, - 0x0024, 0x0024, 0x0034, 0x0044, 0x0044, 0x0054, 0x0063, 0x0063, - 0x0072, 0x0083, 0x0092, 0x0092, 0x00a1, 0x00b0, 0x00bf, 0x00cf, - 0x00de, 0x00ee, 0x00ff, 0x010e, 0x011e, 0x012e, 0x013d, 0x014c, - // Entry A80 - ABF - 0x014c, 0x015f, 0x0171, 0x0184, 0x0196, 0x01a9, 0x01a9, 0x01bb, - 0x01ce, 0x01e1, 0x01e1, 0x01f3, 0x0206, 0x0219, 0x022a, 0x022a, - 0x0232, 0x0232, 0x0246, 0x0246, 0x0256, 0x0265, 0x0274, 0x0285, - 0x0295, 0x02a5, 0x02b4, 0x02c5, 0x02d6, 0x02e6, 0x02f6, 0x030e, - 0x0327, 0x0335, 0x0345, 0x0354, 0x0364, 0x0375, 0x0388, 0x0398, - 0x03a9, 0x03a9, 0x03d0, 0x03e7, 0x03fb, 0x040e, 0x000e, 0x001d, - 0x002d, 0x003c, 0x004c, 0x005b, 0x006b, 0x0082, 0x0099, 0x0099, - 0x00a8, 0x00b8, 0x00c8, 0x00c8, 0x00d7, 0x00e7, 0x00f7, 0x0107, - // Entry AC0 - AFF - 0x0118, 0x0128, 0x0139, 0x014a, 0x015a, 0x016b, 0x017b, 0x018c, - 0x019d, 0x01ae, 0x01c0, 0x01d1, 0x01e3, 0x01f4, 0x0204, 0x0215, - 0x0225, 0x0236, 0x0246, 0x0246, 0x0256, 0x0267, 0x0277, 0x0288, - 0x0298, 0x02a8, 0x02b8, 0x02c9, 0x02d9, 0x02ea, 0x02fc, 0x030c, - 0x031d, 0x032e, 0x033e, 0x034e, 0x034e, 0x0362, 0x0376, 0x0389, - 0x039d, 0x03b0, 0x03c4, 0x03df, 0x03fb, 0x03fb, 0x040e, 0x0422, - 0x0436, 0x0036, 0x0049, 0x005d, 0x0071, 0x0083, 0x0083, 0x0095, - 0x00aa, 0x00aa, 0x00bb, 0x00cc, 0x00de, 0x00de, 0x00f6, 0x010e, - // Entry B00 - B3F - 0x0129, 0x0145, 0x0145, 0x0156, 0x0166, 0x0176, 0x0188, 0x0199, - 0x01aa, 0x01ba, 0x01cc, 0x01de, 0x01ef, 0x01ef, 0x0220, 0x0250, - 0x0280, 0x02b2, 0x02e3, 0x0314, 0x0347, 0x0358, 0x0378, 0x0390, - 0x03a5, 0x03b9, 0x03b9, 0x03c9, 0x03da, 0x03ea, 0x03fb, 0x040b, - 0x041c, 0x0434, 0x044c, 0x004c, 0x005c, 0x006d, 0x007e, 0x007e, - 0x008e, 0x009f, 0x00b0, 0x00c1, 0x00d3, 0x00e4, 0x00f6, 0x0108, - 0x0119, 0x012b, 0x013c, 0x014e, 0x0160, 0x0172, 0x0185, 0x0197, - 0x01aa, 0x01bc, 0x01cd, 0x01df, 0x01f0, 0x0202, 0x0213, 0x0213, - // Entry B40 - B7F - 0x0224, 0x0236, 0x0247, 0x0259, 0x026a, 0x027b, 0x028c, 0x029e, - 0x02af, 0x02c1, 0x02c1, 0x02d2, 0x02e4, 0x02f6, 0x0307, 0x0318, - 0x0318, 0x032a, 0x033f, 0x0354, 0x0368, 0x037d, 0x0391, 0x03a6, - 0x03c2, 0x03df, 0x03df, 0x03f3, 0x0408, 0x041d, 0x001d, 0x0031, - 0x0046, 0x005b, 0x006e, 0x006e, 0x0081, 0x0097, 0x0097, 0x00a8, - 0x00a8, 0x00c1, 0x00da, 0x00f6, 0x0113, 0x0113, 0x0125, 0x0136, - 0x0147, 0x015a, 0x016c, 0x017e, 0x018f, 0x01a2, 0x01b5, 0x01c7, - 0x01c7, 0x01df, 0x01f7, 0x01f7, 0x0211, 0x0228, 0x023e, 0x023e, - // Entry B80 - BBF - 0x0250, 0x0263, 0x0275, 0x0288, 0x029a, 0x02ad, 0x02c7, 0x02e1, - 0x02e1, 0x02f3, 0x0306, 0x0319, 0x0319, 0x032b, 0x033e, 0x0351, - 0x0364, 0x0378, 0x038b, 0x039f, 0x03b3, 0x03c6, 0x03da, 0x03ed, - 0x0401, 0x0415, 0x0429, 0x043e, 0x0452, 0x0467, 0x047b, 0x048e, - 0x04a2, 0x04b5, 0x04c9, 0x04dc, 0x04f1, 0x0504, 0x0518, 0x052b, - 0x053f, 0x0552, 0x0565, 0x0578, 0x058c, 0x059f, 0x05b3, 0x05c8, - 0x05db, 0x05ef, 0x0603, 0x0616, 0x0629, 0x063e, 0x023e, 0x0255, - 0x026c, 0x0282, 0x0299, 0x02af, 0x02c6, 0x02e4, 0x0303, 0x0303, - // Entry BC0 - BFF - 0x0319, 0x0330, 0x0347, 0x0347, 0x035d, 0x0374, 0x038b, 0x03a0, - 0x03b9, 0x03cc, 0x03cc, 0x03e5, 0x03fe, 0x0419, 0x0431, 0x0460, - 0x047f, 0x04a2, 0x04c2, 0x04de, 0x0501, 0x051d, 0x0538, 0x0553, - 0x056e, 0x058c, 0x05ab, 0x01ab, 0x01bf, 0x01d2, 0x01e5, 0x01fa, - 0x020e, 0x0222, 0x0235, 0x024a, 0x025f, 0x0273, 0x0287, 0x02a3, - 0x02c0, 0x02de, 0x02f9, 0x031a, 0x033a, 0x0357, 0x037a, 0x038d, - 0x03a7, 0x03c0, 0x03da, 0x03f3, 0x040d, 0x0426, 0x0026, 0x003d, - 0x0053, 0x0053, 0x0068, 0x007e, 0x0094, 0x00ab, 0x00c0, 0x00d6, - // Entry C00 - C3F - 0x00eb, 0x0101, 0x0118, 0x0130, 0x0147, 0x015f, 0x0174, 0x018a, - 0x01a0, 0x01b5, 0x01cb, 0x01e1, 0x01e1, 0x0202, 0x0224, 0x0245, - 0x0267, 0x0288, 0x02a6, 0x02c7, 0x02e9, 0x030a, 0x032c, 0x034d, - 0x0378, 0x0396, 0x03b8, 0x03db, 0x03fd, 0x0420, 0x0440, 0x045f, - 0x0480, 0x04a2, 0x04c3, 0x04e5, 0x0503, 0x0103, 0x0121, 0x0142, - 0x0164, 0x0185, 0x01a7, 0x01bd, 0x01d8, 0x01ee, 0x0204, 0x0204, - 0x0222, 0x0222, 0x0238, 0x0256, 0x0276, 0x0294, 0x02aa, 0x02ca, - 0x02e0, 0x02e0, 0x02f6, 0x02f6, 0x0313, 0x0336, 0x0358, 0x0379, - // Entry C40 - C7F - 0x0399, 0x03bb, 0x03bb, 0x03dc, 0x03dc, 0x03fb, 0x0415, 0x0434, - 0x0451, 0x047a, 0x04a8, 0x04d2, 0x04f0, 0x00f0, 0x0107, 0x011d, - 0x0133, 0x014b, 0x0162, 0x0179, 0x018f, 0x01a7, 0x01bf, 0x01d6, - 0x01d6, 0x01fa, 0x021d, 0x023b, 0x023b, 0x0250, 0x0267, 0x027f, - 0x0297, 0x02ae, 0x02c8, 0x02de, 0x02f5, 0x030d, 0x0325, 0x0339, - 0x0350, 0x0366, 0x037d, 0x0394, 0x03ab, 0x03c8, 0x03e2, 0x03f7, - 0x040c, 0x0421, 0x0439, 0x0452, 0x046a, 0x047e, 0x0496, 0x04ab, - 0x04c3, 0x04d7, 0x04ee, 0x0503, 0x051d, 0x0531, 0x0546, 0x055b, - // Entry C80 - CBF - 0x056c, 0x0582, 0x0593, 0x05a9, 0x05bf, 0x05d5, 0x05ea, 0x05ff, - 0x0616, 0x062a, 0x0642, 0x065a, 0x066f, 0x068a, 0x06a0, 0x06b6, - 0x06cb, 0x06e1, 0x06f7, 0x070e, 0x0723, 0x0739, 0x074f, 0x034f, - 0x0368, 0x037d, 0x0393, 0x03a8, 0x03c6, 0x03e5, 0x03ff, 0x0416, - 0x042e, 0x0443, 0x0459, 0x046f, 0x048a, 0x04a4, 0x04bb, 0x04d2, - 0x04e8, 0x04f7, 0x0505, 0x0513, 0x0523, 0x0532, 0x0541, 0x054f, - 0x055f, 0x056f, 0x057e, 0x0597, 0x05ac, 0x01ac, 0x01b9, 0x01cc, - 0x01cc, 0x01de, 0x01de, 0x01ec, 0x01f9, 0x01f9, 0x020a, 0x020a, - // Entry CC0 - CFF - 0x0218, 0x0218, 0x0225, 0x0232, 0x0245, 0x0257, 0x0257, 0x0264, - 0x0271, 0x027e, 0x0291, 0x02a2, 0x02b4, 0x02c6, 0x02c6, 0x02d3, - 0x02e0, 0x02f2, 0x02f2, 0x0304, 0x0304, 0x0311, 0x0311, 0x0323, - 0x0335, 0x0335, 0x0341, 0x0352, 0x035e, 0x036e, 0x0384, 0x0395, - 0x03a6, 0x03b6, 0x03c7, 0x03d7, 0x03e8, 0x03f8, 0x0409, 0x0009, - 0x001f, 0x0034, 0x004a, 0x004a, 0x005a, 0x006b, 0x007b, 0x008c, - 0x009d, 0x009d, 0x00a6, 0x00a6, 0x00b5, 0x00c5, 0x00d4, 0x00e7, - 0x00fc, 0x0109, 0x0109, 0x0117, 0x0124, 0x0131, 0x0140, 0x014e, - // Entry D00 - D3F - 0x015c, 0x0169, 0x0178, 0x0187, 0x0195, 0x0195, 0x019e, 0x01a7, - 0x01b9, 0x01cc, 0x01cc, 0x01df, 0x0204, 0x022e, 0x0259, 0x027d, - 0x02a1, 0x02c8, 0x02ea, 0x0301, 0x031b, 0x0339, 0x0359, 0x037b, - 0x038c, 0x03a2, 0x03b9, 0x03d5, 0x03f6, 0x0411, 0x043b, 0x0452, - 0x0472, 0x0492, 0x04c1, 0x04e4, 0x050a, 0x0525, 0x0541, 0x055c, - 0x0576, 0x0591, 0x05b0, 0x05c2, 0x05d3, 0x05e4, 0x05f7, 0x0609, - 0x061b, 0x062c, 0x063f, 0x0652, 0x0664, 0x067a, 0x0690, 0x06a8, - 0x06bf, 0x06d6, 0x06ec, 0x0704, 0x071c, 0x0733, 0x074a, 0x0762, - // Entry D40 - D7F - 0x0781, 0x07ac, 0x07ce, 0x07e2, 0x07f8, 0x0813, 0x082e, 0x0849, - 0x0864, 0x087a, 0x0890, 0x08a1, 0x08b3, 0x08c4, 0x08d6, 0x08e8, - 0x08f9, 0x090b, 0x091c, 0x011c, 0x012e, 0x0140, 0x0153, 0x0165, - 0x0178, 0x018a, 0x019b, 0x01ad, 0x01be, 0x01d0, 0x01e1, 0x01f2, - 0x0204, 0x0215, 0x0227, 0x0238, 0x024a, 0x025d, 0x026f, 0x0282, - 0x0293, 0x02a5, 0x02b6, 0x02c7, 0x02d8, 0x02e9, 0x02fa, 0x030c, - 0x031e, 0x032f, 0x0340, 0x0350, 0x0363, 0x037f, 0x0391, 0x03a3, - 0x03a3, 0x03b8, 0x03cc, 0x03e1, 0x03f5, 0x040a, 0x0426, 0x0443, - // Entry D80 - DBF - 0x045f, 0x047c, 0x0490, 0x04a5, 0x04b9, 0x04ce, 0x04e9, 0x04ff, - 0x051c, 0x053a, 0x0555, 0x056a, 0x057e, 0x0591, 0x05a7, 0x05be, - 0x05d6, 0x05eb, 0x0607, 0x0623, 0x0641, 0x0663, 0x0682, 0x06aa, - 0x06c5, 0x06e1, 0x06fc, 0x0718, 0x0734, 0x074f, 0x076b, 0x0786, - 0x0386, 0x03a2, 0x03be, 0x03db, 0x03f7, 0x0414, 0x0430, 0x044b, - 0x0467, 0x0482, 0x049e, 0x04b9, 0x04d4, 0x04f0, 0x050b, 0x0527, - 0x0542, 0x055e, 0x057b, 0x0597, 0x05b4, 0x05cf, 0x05eb, 0x0606, - 0x0621, 0x063c, 0x0657, 0x0672, 0x068e, 0x06aa, 0x06c5, 0x06e0, - // Entry DC0 - DFF - 0x06fa, 0x0717, 0x073d, 0x0763, 0x0789, 0x0389, 0x039a, 0x03b8, - 0x03dc, 0x0400, 0x0423, 0x0447, 0x045d, 0x0473, 0x048c, 0x04ac, - 0x04c2, 0x04d7, 0x04f8, 0x0519, 0x053a, 0x013a, 0x0159, 0x0173, - 0x0197, 0x01ba, 0x01d1, 0x0201, 0x0231, 0x0249, 0x0260, 0x0282, - 0x02a3, 0x02c3, 0x02e4, 0x02e4, 0x02f5, 0x0307, 0x0318, 0x032a, - 0x033c, 0x034d, 0x035f, 0x0370, 0x0382, 0x0394, 0x03a7, 0x03b9, - 0x03cc, 0x03de, 0x03f1, 0x0403, 0x0414, 0x0426, 0x0437, 0x0449, - 0x045a, 0x046b, 0x047d, 0x048e, 0x04a0, 0x04b1, 0x04c2, 0x04d3, - // Entry E00 - E3F - 0x04e4, 0x04f5, 0x0506, 0x0517, 0x0529, 0x0539, 0x054e, 0x055e, - 0x056f, 0x057f, 0x0590, 0x05a0, 0x05b4, 0x05c4, 0x05d5, 0x05ef, - 0x0604, 0x0618, 0x062d, 0x0641, 0x0656, 0x066a, 0x067f, 0x0698, - 0x06b0, 0x06ca, 0x06df, 0x06f5, 0x0709, 0x071c, 0x072d, 0x074d, - 0x076d, 0x078d, 0x07ad, 0x07c4, 0x07d6, 0x07e7, 0x07f8, 0x080b, - 0x081d, 0x082f, 0x0840, 0x0853, 0x0866, 0x0878, 0x0893, 0x08a7, - 0x08be, 0x08d6, 0x08f3, 0x090a, 0x091c, 0x092e, 0x0946, 0x095f, - 0x0977, 0x0990, 0x09ac, 0x09c9, 0x09e5, 0x0a02, 0x0a18, 0x0a2e, - // Entry E40 - E7F - 0x0a44, 0x0a5a, 0x0a7e, 0x0aa2, 0x0ac6, 0x0ae3, 0x0b03, 0x0b25, - 0x0b48, 0x0b6c, 0x0b90, 0x0bb7, 0x0bde, 0x0c03, 0x0c28, 0x0c4d, - 0x0c72, 0x0c97, 0x0cbb, 0x0cdf, 0x0d04, 0x0d23, 0x0d3e, 0x0d58, - 0x0d73, 0x0d89, 0x0da0, 0x0db6, 0x0dcc, 0x0de2, 0x0df9, 0x0e0f, - 0x0e25, 0x0e3c, 0x0e52, 0x0e68, 0x0e7f, 0x0e95, 0x0eba, 0x0ed4, - 0x0eed, 0x0f0c, 0x0f2b, 0x0f43, 0x0f5b, 0x0f73, 0x0f8b, 0x0fab, - 0x0fcb, 0x0ff2, 0x1011, 0x1032, 0x1049, 0x105f, 0x1075, 0x108d, - 0x10a4, 0x10bb, 0x10d1, 0x10e9, 0x1101, 0x1118, 0x1132, 0x114c, - // Entry E80 - EBF - 0x1166, 0x1181, 0x1198, 0x11b7, 0x11d1, 0x11ec, 0x1207, 0x1222, - 0x123c, 0x1257, 0x1272, 0x128d, 0x12a7, 0x12c2, 0x12dd, 0x12f8, - 0x1313, 0x132d, 0x1348, 0x1364, 0x137f, 0x139a, 0x13b5, 0x13cf, - 0x13eb, 0x1407, 0x1423, 0x143e, 0x145a, 0x1476, 0x1491, 0x14ac, - 0x14c7, 0x14e3, 0x14fe, 0x151a, 0x1535, 0x154f, 0x156a, 0x1584, - 0x159f, 0x15ba, 0x01ba, 0x01d4, 0x01d4, 0x01ef, 0x01ef, 0x0201, - 0x0214, 0x0227, 0x023a, 0x024c, 0x025f, 0x0272, 0x0285, 0x0297, - 0x02aa, 0x02bd, 0x02d0, 0x02e3, 0x02f5, 0x0308, 0x031c, 0x032f, - // Entry EC0 - EFF - 0x0342, 0x0355, 0x0367, 0x037b, 0x038f, 0x03a3, 0x03b6, 0x03ca, - 0x03de, 0x03f1, 0x0404, 0x0417, 0x042b, 0x043e, 0x0452, 0x0465, - 0x0477, 0x048a, 0x049c, 0x04af, 0x04c2, 0x04d4, 0x04e6, 0x04fb, - 0x0515, 0x0528, 0x0544, 0x0560, 0x0573, 0x058c, 0x05a7, 0x05bd, - 0x05d8, 0x05ed, 0x0603, 0x061e, 0x0633, 0x0648, 0x065d, 0x0677, - 0x068b, 0x06a4, 0x06b9, 0x06ce, 0x06e8, 0x06ff, 0x0716, 0x072d, - 0x0744, 0x0759, 0x0775, 0x078f, 0x07ab, 0x07c6, 0x07e3, 0x07fe, - 0x0818, 0x0833, 0x0850, 0x086b, 0x0888, 0x08a4, 0x08bf, 0x08db, - // Entry F00 - F3F - 0x08f5, 0x0916, 0x0937, 0x0957, 0x0976, 0x0996, 0x09b1, 0x09ce, - 0x09eb, 0x0a08, 0x0a25, 0x0a47, 0x0a62, 0x0a7c, 0x0a97, 0x0ab1, - 0x0acb, 0x0ae5, 0x0b06, 0x0b24, 0x0b3e, 0x0b58, 0x0b74, 0x0b90, - 0x0bac, 0x0bc8, 0x0be2, 0x0bfe, 0x0c1f, 0x0c3e, 0x0c62, 0x0c79, - 0x0c95, 0x0cb1, 0x0ccc, 0x0ce7, 0x0d01, 0x0d1e, 0x0d38, 0x0d53, - 0x0d70, 0x0d8d, 0x0daa, 0x0dc2, 0x0ddd, 0x0dfa, 0x0e1c, 0x0e3c, - 0x0e61, 0x0e80, 0x0e9d, 0x0ebc, 0x0ede, 0x0efb, 0x0f1a, 0x0f34, - 0x0f4f, 0x0f6c, 0x0f86, 0x0fa1, 0x0fbc, 0x0fd8, 0x0fee, 0x1005, - // Entry F40 - F7F - 0x1017, 0x102a, 0x103d, 0x1051, 0x1064, 0x1076, 0x108a, 0x109d, - 0x10af, 0x10c2, 0x10d6, 0x10e9, 0x10fc, 0x110e, 0x1122, 0x1135, - 0x1148, 0x115b, 0x116e, 0x1181, 0x1193, 0x11a7, 0x11bb, 0x11d0, - 0x11e6, 0x11fb, 0x1210, 0x1226, 0x123c, 0x1252, 0x1267, 0x127b, - 0x1290, 0x12a4, 0x12b8, 0x12ce, 0x12e5, 0x12fc, 0x1311, 0x1326, - 0x133a, 0x134f, 0x1367, 0x137c, 0x1390, 0x13a5, 0x13bb, 0x13d0, - 0x13e7, 0x13fd, 0x1412, 0x1427, 0x143c, 0x1452, 0x1467, 0x147b, - 0x1490, 0x14a4, 0x14b8, 0x14cd, 0x14e5, 0x14fb, 0x1514, 0x152c, - // Entry F80 - FBF - 0x1544, 0x155f, 0x1574, 0x1589, 0x15a0, 0x15b5, 0x15cb, 0x15e2, - 0x15fe, 0x161a, 0x1630, 0x164c, 0x1668, 0x167f, 0x1695, 0x16b2, - 0x16ce, 0x16ea, 0x1705, 0x1723, 0x1741, 0x175d, 0x1773, 0x1789, - 0x17a4, 0x17b9, 0x17d3, 0x17e9, 0x17ff, 0x1817, 0x182f, 0x1847, - 0x185f, 0x1875, 0x1892, 0x18b5, 0x18d2, 0x18ef, 0x190a, 0x1928, - 0x1946, 0x1964, 0x1981, 0x19a3, 0x19bf, 0x19dc, 0x19ff, 0x1a1a, - 0x1a3d, 0x1a5e, 0x1a7f, 0x1aa1, 0x1ac5, 0x1ae5, 0x1b03, 0x1b21, - 0x1b43, 0x1b60, 0x1b7c, 0x1b98, 0x1bb3, 0x1bd3, 0x1bf1, 0x1c0f, - // Entry FC0 - FFF - 0x1c2b, 0x1c49, 0x1c65, 0x1c83, 0x1c9f, 0x1cbd, 0x1cd9, 0x1cf5, - 0x1d10, 0x1d2b, 0x1d43, 0x1d60, 0x1d82, 0x1d9d, 0x1dbb, 0x1dd4, - 0x1df2, 0x1e13, 0x1e31, 0x1e51, 0x1e6d, 0x1e89, 0x1ea5, 0x1ec1, - 0x1edd, 0x1efa, 0x1f17, 0x1f36, 0x1f55, 0x1f72, 0x1f8d, 0x1fa1, - 0x1fb5, 0x1fc9, 0x1fde, 0x1ff3, 0x2007, 0x201b, 0x2030, 0x2044, - 0x2058, 0x206c, 0x2081, 0x2096, 0x20aa, 0x20be, 0x20d3, 0x20e8, - 0x20fd, 0x2112, 0x2128, 0x213e, 0x2153, 0x2168, 0x217e, 0x2192, - 0x21a6, 0x21ba, 0x21cf, 0x21e4, 0x21f8, 0x220c, 0x2221, 0x2236, - // Entry 1000 - 103F - 0x224b, 0x2260, 0x2276, 0x228c, 0x22a1, 0x22b6, 0x22cc, 0x22e0, - 0x22f4, 0x2308, 0x231d, 0x2332, 0x2346, 0x235a, 0x236f, 0x2383, - 0x2397, 0x23ab, 0x23c0, 0x23d5, 0x23e9, 0x23fd, 0x2412, 0x2427, - 0x243c, 0x2451, 0x2467, 0x247d, 0x2492, 0x24a7, 0x24bd, 0x24d1, - 0x24e5, 0x24f9, 0x250e, 0x2523, 0x2537, 0x254b, 0x2560, 0x2575, - 0x0175, 0x018a, 0x01a0, 0x01b6, 0x01cb, 0x01cb, 0x01e0, 0x01f5, - 0x020a, 0x0220, 0x0236, 0x024b, 0x0260, 0x0260, 0x0276, 0x0276, - 0x028c, 0x02a3, 0x02ba, 0x02d0, 0x02d0, 0x02e4, 0x02f8, 0x030c, - // Entry 1040 - 107F - 0x0321, 0x0336, 0x034a, 0x035e, 0x0373, 0x0387, 0x039b, 0x03af, - 0x03c4, 0x03d9, 0x03ed, 0x0401, 0x0416, 0x042a, 0x043e, 0x0452, - 0x0467, 0x047c, 0x0490, 0x04a4, 0x04b9, 0x04cd, 0x04e1, 0x04f5, - 0x050a, 0x051f, 0x0533, 0x0547, 0x055c, 0x0570, 0x0584, 0x0598, - 0x05ad, 0x05c2, 0x05d6, 0x05ea, 0x05ff, 0x0614, 0x0214, 0x0229, - 0x023f, 0x0255, 0x026a, 0x026a, 0x027e, 0x0292, 0x02a6, 0x02bb, - 0x02d0, 0x02e4, 0x02f8, 0x030d, 0x0322, 0x0337, 0x034c, 0x0362, - 0x0378, 0x038d, 0x03a2, 0x03b8, 0x03d3, 0x03ee, 0x0409, 0x0425, - // Entry 1080 - 10BF - 0x0441, 0x045c, 0x0477, 0x0493, 0x04a7, 0x04bb, 0x04cf, 0x04e4, - 0x04f9, 0x050d, 0x0521, 0x0536, 0x054b, 0x014b, 0x0160, 0x0176, - 0x018c, 0x01a1, 0x01a1, 0x01b6, 0x01cb, 0x01e0, 0x01f6, 0x020c, - 0x0221, 0x0236, 0x0236, 0x024c, 0x024c, 0x0262, 0x0279, 0x0290, - 0x02a6, 0x02a6, 0x02ba, 0x02ce, 0x02e2, 0x02f7, 0x030c, 0x0320, - 0x0334, 0x0349, 0x0367, 0x0385, 0x03a3, 0x03c2, 0x03e1, 0x03ff, - 0x041d, 0x001d, 0x0031, 0x0045, 0x0059, 0x006e, 0x0083, 0x0097, - 0x00ab, 0x00c0, 0x00d5, 0x00ea, 0x00ff, 0x0115, 0x012b, 0x0140, - // Entry 10C0 - 10FF - 0x0155, 0x016b, 0x017f, 0x0193, 0x01a7, 0x01bc, 0x01d1, 0x01e5, - 0x01f9, 0x020e, 0x0222, 0x0236, 0x024a, 0x025f, 0x0274, 0x0288, - 0x029c, 0x02b1, 0x02c6, 0x02db, 0x02f0, 0x0306, 0x031c, 0x0331, - 0x0346, 0x035c, 0x0370, 0x0384, 0x0398, 0x03ad, 0x03c2, 0x03d6, - 0x03ea, 0x03ff, 0x0413, 0x0427, 0x043b, 0x0450, 0x0465, 0x0479, - 0x048d, 0x04a2, 0x04b7, 0x00b7, 0x00cc, 0x00e2, 0x00f8, 0x010d, - 0x010d, 0x0122, 0x0137, 0x014c, 0x0162, 0x0178, 0x018d, 0x01a2, - 0x01b9, 0x01ce, 0x01e3, 0x01f8, 0x020e, 0x0224, 0x0239, 0x024e, - // Entry 1100 - 113F - 0x0264, 0x0279, 0x028e, 0x02a3, 0x02b9, 0x02cf, 0x02e4, 0x02f9, - 0x030f, 0x0324, 0x0339, 0x034e, 0x0364, 0x037a, 0x038f, 0x03a4, - 0x03ba, 0x03cf, 0x03e4, 0x03f9, 0x040f, 0x0425, 0x043a, 0x044f, - 0x0465, 0x047a, 0x048f, 0x04a4, 0x04ba, 0x04d0, 0x04e5, 0x04fa, - 0x0510, 0x0524, 0x0538, 0x054c, 0x0561, 0x0576, 0x058a, 0x059e, - 0x05b3, 0x05c7, 0x05db, 0x05ef, 0x0604, 0x0619, 0x062d, 0x0641, - 0x0656, 0x066b, 0x0680, 0x0695, 0x0295, 0x02c8, 0x02ec, 0x030e, - 0x0323, 0x0335, 0x0347, 0x0355, 0x0367, 0x0375, 0x038b, 0x03a1, - // Entry 1140 - 117F - 0x03bd, 0x03cf, 0x03e1, 0x03f5, 0x0408, 0x041b, 0x042d, 0x0441, - 0x0455, 0x0468, 0x047b, 0x0491, 0x04a7, 0x04bc, 0x04d1, 0x04e6, - 0x04fd, 0x0513, 0x0529, 0x0540, 0x055c, 0x015c, 0x017b, 0x0190, - 0x01a6, 0x01bb, 0x01da, 0x01ef, 0x0205, 0x021a, 0x0239, 0x024e, - 0x0264, 0x0279, 0x0298, 0x02ad, 0x02c3, 0x02d8, 0x02f1, 0x030a, - 0x0324, 0x0344, 0x035d, 0x0376, 0x0390, 0x03a9, 0x03c8, 0x03e0, - 0x03e0, 0x03f1, 0x0402, 0x0413, 0x0424, 0x0435, 0x0446, 0x0458, - 0x046a, 0x047c, 0x048e, 0x04a0, 0x04b2, 0x04c4, 0x04d6, 0x04e8, - // Entry 1180 - 11BF - 0x04fa, 0x050c, 0x051e, 0x0530, 0x0542, 0x0554, 0x0566, 0x0578, - 0x058a, 0x059c, 0x05ae, 0x05c0, 0x05d2, 0x05e4, 0x05f6, 0x0608, - 0x061b, 0x062e, 0x0640, 0x0652, 0x0664, 0x0676, 0x0688, 0x069b, - 0x06ae, 0x06c1, 0x06d4, 0x06e7, 0x06fa, 0x070c, 0x071d, 0x072f, - 0x0741, 0x0753, 0x0765, 0x0777, 0x0789, 0x079b, 0x07ad, 0x07bf, - 0x07d1, 0x07e3, 0x07f5, 0x0807, 0x0819, 0x082c, 0x083f, 0x0852, - 0x0865, 0x0878, 0x088b, 0x089e, 0x08b1, 0x08c4, 0x08d7, 0x08ea, - 0x08fd, 0x0910, 0x0922, 0x0934, 0x0946, 0x0958, 0x096a, 0x097c, - // Entry 11C0 - 11FF - 0x098e, 0x09a0, 0x09b2, 0x09c4, 0x09d6, 0x09e8, 0x09fa, 0x01fa, - 0x0212, 0x022a, 0x0242, 0x025a, 0x0272, 0x028a, 0x028a, 0x02a3, - 0x02b7, 0x02cd, 0x02e1, 0x02f6, 0x030a, 0x031f, 0x033b, 0x0358, - 0x0374, 0x0388, 0x039d, 0x03b2, 0x03d1, 0x03e6, 0x0405, 0x041b, - 0x043b, 0x0450, 0x046f, 0x0485, 0x04a5, 0x04c3, 0x04d8, 0x04f7, - 0x050d, 0x052d, 0x054b, 0x0560, 0x057b, 0x059a, 0x05b8, 0x05d6, - 0x05ff, 0x0625, 0x064d, 0x066a, 0x068f, 0x06c5, 0x06e8, 0x0718, - 0x0735, 0x0757, 0x076c, 0x0781, 0x0796, 0x07ab, 0x07c0, 0x07d7, - // Entry 1200 - 123F - 0x07ec, 0x0802, 0x0817, 0x082d, 0x084a, 0x0868, 0x0885, 0x089a, - 0x08b0, 0x08c6, 0x08e6, 0x08fc, 0x091c, 0x0933, 0x0954, 0x096a, - 0x098a, 0x09a1, 0x09c2, 0x09d8, 0x09f8, 0x0a0f, 0x0a30, 0x0a4e, - 0x0a62, 0x0a80, 0x0a9c, 0x0ab1, 0x0ac8, 0x0add, 0x0af3, 0x0b08, - 0x0b1e, 0x0b3b, 0x0b59, 0x0b76, 0x0b8b, 0x0ba1, 0x0bb7, 0x0bd7, - 0x0bed, 0x0c0d, 0x0c24, 0x0c45, 0x0c5b, 0x0c7b, 0x0c92, 0x0cb3, - 0x0cc9, 0x0ce9, 0x0d00, 0x0d21, 0x0d40, 0x0d54, 0x0d6a, 0x0d80, - 0x0d96, 0x0dac, 0x0dc1, 0x0dd8, 0x0ded, 0x0e03, 0x0e18, 0x0e2e, - // Entry 1240 - 127F - 0x0e4b, 0x0e60, 0x0e76, 0x0e8c, 0x0eac, 0x0ec2, 0x0ee2, 0x0ef9, - 0x0f1a, 0x0f30, 0x0f50, 0x0f67, 0x0f88, 0x0f9e, 0x0fbe, 0x0fd5, - 0x0ff6, 0x1015, 0x1029, 0x103e, 0x1061, 0x1084, 0x10a7, 0x10ca, - 0x10df, 0x10f6, 0x110b, 0x1121, 0x1136, 0x114c, 0x1169, 0x117e, - 0x1194, 0x11aa, 0x11ca, 0x11e0, 0x1200, 0x1217, 0x1238, 0x124e, - 0x126e, 0x1285, 0x12a6, 0x12bc, 0x12dc, 0x12f3, 0x1314, 0x1333, - 0x1347, 0x1363, 0x1378, 0x138f, 0x13a4, 0x13ba, 0x13cf, 0x13e5, - 0x1402, 0x1417, 0x142d, 0x1443, 0x1463, 0x1479, 0x1499, 0x14b0, - // Entry 1280 - 12BF - 0x14d1, 0x14e7, 0x1507, 0x151e, 0x153f, 0x1555, 0x1575, 0x158c, - 0x15ad, 0x15cc, 0x15e0, 0x15fe, 0x1613, 0x1632, 0x164d, 0x1662, - 0x1679, 0x168e, 0x16a4, 0x16b9, 0x16cf, 0x16ec, 0x1701, 0x1717, - 0x172d, 0x174d, 0x1763, 0x1783, 0x179a, 0x17bb, 0x17da, 0x17ee, - 0x180b, 0x1820, 0x1835, 0x184c, 0x1861, 0x1877, 0x188c, 0x18a2, - 0x18bf, 0x18d4, 0x18ea, 0x1900, 0x1920, 0x1936, 0x1956, 0x196d, - 0x198e, 0x19a4, 0x19c4, 0x19db, 0x19fc, 0x1a12, 0x1a32, 0x1a49, - 0x1a6a, 0x1a7e, 0x1a9c, 0x1ab7, 0x1acc, 0x1ae3, 0x1af8, 0x1b0e, - // Entry 12C0 - 12FF - 0x1b23, 0x1b39, 0x1b56, 0x1b6b, 0x1b81, 0x1b97, 0x1bb7, 0x1bcd, - 0x1bed, 0x1c04, 0x1c25, 0x1c3b, 0x1c5b, 0x1c72, 0x1c93, 0x1ca9, - 0x1cc9, 0x1ce0, 0x1d01, 0x1d20, 0x1d34, 0x1d53, 0x1d68, 0x1d86, - 0x1da6, 0x1dc4, 0x1de2, 0x1e01, 0x1e20, 0x1e3f, 0x1e5e, 0x1e74, - 0x1e8a, 0x1ea1, 0x1eb7, 0x1ece, 0x1ee4, 0x1efb, 0x1f12, 0x1f33, - 0x1f4a, 0x1f6b, 0x1f83, 0x1fa5, 0x1fbc, 0x1fdd, 0x1ff5, 0x2017, - 0x202e, 0x204f, 0x2067, 0x2089, 0x209e, 0x20b3, 0x20ca, 0x20df, - 0x20f5, 0x210a, 0x2120, 0x213d, 0x2152, 0x2168, 0x217e, 0x219e, - // Entry 1300 - 133F - 0x21b4, 0x21d4, 0x21eb, 0x220c, 0x2222, 0x2242, 0x2259, 0x227a, - 0x2290, 0x22b0, 0x22c7, 0x22e8, 0x2307, 0x231b, 0x233a, 0x2358, - 0x2374, 0x2389, 0x23a5, 0x23c4, 0x23db, 0x23f0, 0x2406, 0x241b, - 0x2431, 0x2450, 0x2465, 0x247b, 0x249a, 0x24b1, 0x24d2, 0x24e6, - 0x2504, 0x251f, 0x2534, 0x254b, 0x2560, 0x2576, 0x258b, 0x25a1, - 0x25b6, 0x25cc, 0x25e3, 0x2604, 0x2618, 0x262e, 0x264b, 0x2661, - 0x267e, 0x2695, 0x26b3, 0x26c9, 0x26e0, 0x26f6, 0x270d, 0x2725, - 0x2747, 0x275c, 0x2773, 0x278a, 0x27a1, 0x27b8, 0x27ce, 0x27e4, - // Entry 1340 - 137F - 0x27fa, 0x2810, 0x2826, 0x2843, 0x2860, 0x287e, 0x289b, 0x28b9, - 0x28d6, 0x28f4, 0x2910, 0x292c, 0x2941, 0x2958, 0x296d, 0x2983, - 0x2998, 0x29ae, 0x29c3, 0x29d9, 0x29ed, 0x2a04, 0x2a1b, 0x2a32, - 0x2a49, 0x2a68, 0x2a87, 0x2aa6, 0x2ac5, 0x2add, 0x2af3, 0x2b0a, - 0x2b20, 0x2b37, 0x2b4d, 0x2b64, 0x2b79, 0x2b8f, 0x2bac, 0x2bc9, - 0x2be6, 0x2c03, 0x2c24, 0x2c45, 0x2c66, 0x2c87, 0x2ca7, 0x2cbd, - 0x2cd4, 0x2cea, 0x2d01, 0x2d17, 0x2d2e, 0x2d43, 0x2d61, 0x2d7f, - 0x2d9e, 0x2dbc, 0x2ddb, 0x2df9, 0x2e18, 0x2e35, 0x2e51, 0x2e6f, - // Entry 1380 - 13BF - 0x2e8d, 0x2eab, 0x2ec9, 0x2ee8, 0x2f07, 0x2f26, 0x2f45, 0x2f64, - 0x2f83, 0x2fa2, 0x2fc1, 0x2fe0, 0x2fff, 0x301e, 0x303d, 0x3059, - 0x3075, 0x3091, 0x30ad, 0x30cb, 0x30e9, 0x3107, 0x3126, 0x3144, - 0x3162, 0x317f, 0x319c, 0x31b9, 0x31d7, 0x31f4, 0x3211, 0x322e, - 0x324b, 0x3268, 0x3286, 0x32a3, 0x32c0, 0x32de, 0x32fc, 0x331a, - 0x3339, 0x3357, 0x3375, 0x3393, 0x33b1, 0x33cf, 0x33ee, 0x340c, - 0x342a, 0x3448, 0x3466, 0x3484, 0x34a3, 0x34c1, 0x34df, 0x34fc, - 0x3519, 0x3536, 0x3554, 0x3571, 0x358e, 0x35aa, 0x35c7, 0x35e4, - // Entry 13C0 - 13FF - 0x3601, 0x361f, 0x363c, 0x3659, 0x3677, 0x3695, 0x36b3, 0x36d2, - 0x36f0, 0x370e, 0x372c, 0x374a, 0x3768, 0x3787, 0x37a5, 0x37c3, - 0x37e0, 0x37fd, 0x381a, 0x3837, 0x3855, 0x3872, 0x388f, 0x38ac, - 0x38c9, 0x38e6, 0x3904, 0x3921, 0x393e, 0x395b, 0x3978, 0x3995, - 0x39b3, 0x39d0, 0x39ed, 0x3a0a, 0x3a26, 0x3a43, 0x3a60, 0x3a7e, - 0x3a9b, 0x3ab7, 0x3ad4, 0x3af2, 0x3b10, 0x3b2e, 0x3b4d, 0x3b6b, - 0x3b89, 0x3ba6, 0x3bc3, 0x3be0, 0x3bfe, 0x3c1b, 0x3c38, 0x3c56, - 0x3c74, 0x3c92, 0x3cb1, 0x3ccf, 0x3ced, 0x3d0b, 0x3d29, 0x3d47, - // Entry 1400 - 143F - 0x3d66, 0x3d84, 0x3da2, 0x3dc1, 0x3de0, 0x3dff, 0x3e1f, 0x3e3e, - 0x3e5d, 0x3e7b, 0x3e99, 0x3eb7, 0x3ed6, 0x3ef4, 0x3f12, 0x3f2f, - 0x3f4c, 0x3f69, 0x3f87, 0x3fa4, 0x3fc1, 0x3fdd, 0x4001, 0x401f, - 0x403d, 0x405b, 0x407a, 0x4098, 0x40b6, 0x40d3, 0x40f0, 0x410d, - 0x412b, 0x4148, 0x4165, 0x4183, 0x41a1, 0x41bf, 0x41de, 0x41fc, - 0x421a, 0x4237, 0x4255, 0x4273, 0x4291, 0x42b0, 0x42ce, 0x42ec, - 0x430a, 0x4328, 0x4346, 0x4365, 0x4383, 0x43a1, 0x43c0, 0x43df, - 0x43fe, 0x441e, 0x443d, 0x445c, 0x4477, 0x4493, 0x44a9, 0x44c0, - // Entry 1440 - 147F - 0x44d7, 0x44ef, 0x4506, 0x451e, 0x4535, 0x454d, 0x4570, 0x4592, - 0x45b5, 0x45d7, 0x45fa, 0x461c, 0x463f, 0x4665, 0x4683, 0x4693, - 0x46a5, 0x46b6, 0x46c8, 0x46d9, 0x46ea, 0x46fb, 0x470c, 0x471e, - 0x472f, 0x4741, 0x4752, 0x4763, 0x4777, 0x478a, 0x479b, 0x47ac, - 0x47bc, 0x47cb, 0x47df, 0x47f3, 0x4807, 0x4816, 0x482b, 0x483c, - 0x4854, 0x4866, 0x4878, 0x4893, 0x0093, 0x00ae, 0x00bc, 0x00d2, - 0x00e1, 0x00ef, 0x00fd, 0x011e, 0x012e, 0x0142, 0x0153, 0x0164, - 0x0175, 0x0193, 0x01b0, 0x01be, 0x01cd, 0x01dc, 0x01f9, 0x020b, - // Entry 1480 - 14BF - 0x021b, 0x022e, 0x023c, 0x024c, 0x0264, 0x0274, 0x028d, 0x02a2, - 0x02b6, 0x02d7, 0x02f7, 0x0315, 0x0333, 0x0348, 0x0362, 0x0370, - 0x0384, 0x0394, 0x03b2, 0x03ce, 0x03e3, 0x03ff, 0x0417, 0x042c, - 0x0450, 0x046d, 0x047b, 0x0489, 0x04a5, 0x04c2, 0x04d0, 0x04f5, - 0x0516, 0x052b, 0x053e, 0x0555, 0x056e, 0x058d, 0x05ab, 0x05ca, - 0x05df, 0x05f2, 0x0602, 0x061b, 0x0637, 0x0647, 0x0657, 0x066b, - 0x067c, 0x068e, 0x069f, 0x06ba, 0x06d4, 0x06ed, 0x06fb, 0x0709, - 0x0721, 0x073b, 0x0752, 0x0765, 0x077a, 0x078f, 0x079d, 0x07ac, - // Entry 14C0 - 14FF - 0x07bb, 0x07d8, 0x07f5, 0x0812, 0x082f, 0x084e, 0x004e, 0x005e, - 0x006e, 0x007e, 0x008f, 0x00a0, 0x00b2, 0x00c3, 0x00d4, 0x00e5, - 0x00f6, 0x0107, 0x0118, 0x0129, 0x0129, 0x013a, 0x014b, 0x015c, - 0x016d, 0x0181, 0x0195, 0x01a8, 0x01a8, 0x01b8, 0x01c8, 0x01d8, - 0x01e9, 0x01fa, 0x020c, 0x021d, 0x022e, 0x023f, 0x0250, 0x0261, - 0x0272, 0x0283, 0x0294, 0x02a5, 0x02b6, 0x02c7, 0x02d8, 0x02ec, - 0x0300, 0x0315, 0x0332, 0x034f, 0x034f, 0x035d, 0x036b, 0x0379, - 0x0388, 0x0397, 0x03a7, 0x03b6, 0x03c5, 0x03d4, 0x03e3, 0x03f2, - // Entry 1500 - 153F - 0x0401, 0x0410, 0x041f, 0x042e, 0x043d, 0x044c, 0x045b, 0x046d, - 0x047f, 0x007f, 0x0090, 0x00a1, 0x00b2, 0x00c4, 0x00d6, 0x00e9, - 0x00fb, 0x010d, 0x011f, 0x0131, 0x0143, 0x0155, 0x0167, 0x0167, - 0x0179, 0x018b, 0x019d, 0x019d, 0x01b2, 0x01c7, 0x01c7, 0x01d6, - 0x01e6, 0x01f5, 0x0205, 0x0215, 0x0224, 0x0234, 0x0243, 0x0253, - 0x0263, 0x0272, 0x0283, 0x0292, 0x02a3, 0x02b3, 0x02c2, 0x02d2, - 0x02e1, 0x02f1, 0x0300, 0x030f, 0x031f, 0x032e, 0x033e, 0x034d, - 0x035c, 0x036b, 0x037a, 0x0389, 0x0399, 0x03a9, 0x03b8, 0x03c7, - // Entry 1540 - 157F - 0x03d6, 0x03e5, 0x0400, 0x041b, 0x0435, 0x0450, 0x046a, 0x0485, - 0x04a0, 0x04bc, 0x04d6, 0x04f1, 0x050b, 0x0526, 0x0540, 0x055b, - 0x057f, 0x05a3, 0x05be, 0x05d5, 0x05ec, 0x05ff, 0x0611, 0x0624, - 0x0636, 0x0649, 0x065b, 0x066e, 0x0681, 0x0694, 0x06a7, 0x06ba, - 0x06cc, 0x06df, 0x06f2, 0x0705, 0x0718, 0x072a, 0x073c, 0x0754, - 0x076a, 0x077c, 0x078d, 0x079d, 0x07b3, 0x07c5, 0x07d5, 0x07ed, - 0x07fe, 0x080e, 0x0823, 0x0832, 0x0847, 0x0861, 0x0873, 0x0884, - 0x089a, 0x08ac, 0x08c6, 0x08de, 0x08f1, 0x00f1, 0x0101, 0x0110, - // Entry 1580 - 15BF - 0x011f, 0x0130, 0x0140, 0x0150, 0x015f, 0x0170, 0x0181, 0x0191, - 0x0191, 0x01ab, 0x01c6, 0x01e0, 0x01fa, 0x0215, 0x0230, 0x0250, - 0x026f, 0x028e, 0x02ae, 0x02ae, 0x02bd, 0x02cf, 0x02de, 0x02f1, - 0x0300, 0x0313, 0x032d, 0x0354, 0x036a, 0x0384, 0x0394, 0x03b9, - 0x03de, 0x0405, 0x041e, 0x001e, 0x0032, 0x0045, 0x0058, 0x006d, - 0x0081, 0x0095, 0x00a8, 0x00bd, 0x00d2, 0x00e6, 0x00e6, 0x00f8, - 0x010a, 0x011c, 0x012e, 0x0140, 0x0153, 0x0166, 0x0179, 0x018c, - 0x01a0, 0x01b3, 0x01c6, 0x01d9, 0x01ec, 0x01ff, 0x0212, 0x0225, - // Entry 15C0 - 15FF - 0x0239, 0x024c, 0x025f, 0x0273, 0x0286, 0x0299, 0x02ac, 0x02bf, - 0x02d2, 0x02e5, 0x02f9, 0x030d, 0x0320, 0x0334, 0x0348, 0x035c, - 0x0370, 0x0384, 0x03a9, 0x03c0, 0x03d7, 0x03ee, 0x0405, 0x041d, - 0x0435, 0x044e, 0x0466, 0x047e, 0x0496, 0x04ae, 0x04c6, 0x04de, - 0x04f6, 0x050f, 0x0527, 0x0540, 0x0558, 0x0570, 0x0588, 0x05a1, - 0x05ba, 0x05d3, 0x05ec, 0x0605, 0x061c, 0x0633, 0x064b, 0x0663, - 0x067a, 0x0693, 0x06ab, 0x06c3, 0x06db, 0x06f3, 0x070c, 0x0724, - 0x073c, 0x0754, 0x076c, 0x0785, 0x079e, 0x07b7, 0x07cf, 0x07e8, - // Entry 1600 - 163F - 0x0801, 0x081a, 0x0833, 0x084d, 0x0867, 0x0881, 0x089c, 0x009c, - 0x00c2, 0x00e7, 0x0107, 0x0128, 0x0152, 0x0172, 0x0198, 0x01b3, - 0x01ce, 0x01ea, 0x0207, 0x0223, 0x0240, 0x025e, 0x027b, 0x0298, - 0x02b4, 0x02d0, 0x02ec, 0x0309, 0x0326, 0x0343, 0x035f, 0x037b, - 0x039c, 0x03be, 0x03e2, 0x0406, 0x0429, 0x044d, 0x0471, 0x0496, - 0x04b9, 0x04dd, 0x0501, 0x0525, 0x0549, 0x056c, 0x058c, 0x05ad, - 0x05d1, 0x05f2, 0x0616, 0x0216, 0x022b, 0x0240, 0x0256, 0x026c, - 0x0282, 0x0298, 0x02af, 0x02c5, 0x02db, 0x02f2, 0x0308, 0x031e, - // Entry 1640 - 167F - 0x0334, 0x034a, 0x0360, 0x0376, 0x038d, 0x03a4, 0x03bc, 0x03d2, - 0x03e8, 0x03fe, 0x0414, 0x0432, 0x0449, 0x0468, 0x047e, 0x049c, - 0x04b3, 0x04d2, 0x04e9, 0x04ff, 0x0516, 0x052c, 0x0543, 0x0559, - 0x0575, 0x0591, 0x05ad, 0x05c9, 0x05e5, 0x0601, 0x061d, 0x063a, - 0x0656, 0x0672, 0x0695, 0x06b8, 0x06d5, 0x06f5, 0x0715, 0x072c, - 0x0743, 0x075b, 0x0773, 0x078b, 0x07a3, 0x07bb, 0x07d9, 0x07f7, - 0x0814, 0x0832, 0x0855, 0x0873, 0x0891, 0x08ae, 0x08cc, 0x08ec, - 0x090c, 0x092f, 0x012f, 0x0149, 0x0158, 0x0168, 0x0177, 0x0187, - // Entry 1680 - 16BF - 0x0197, 0x01a6, 0x01b6, 0x01c5, 0x01d5, 0x01e5, 0x01f4, 0x0204, - 0x0213, 0x0223, 0x0232, 0x0241, 0x0251, 0x0260, 0x0270, 0x027f, - 0x028e, 0x029d, 0x02ac, 0x02bb, 0x02cb, 0x02db, 0x02ea, 0x02f9, - 0x030a, 0x031a, 0x031a, 0x032c, 0x033e, 0x0350, 0x0363, 0x0376, - 0x0389, 0x039c, 0x03ae, 0x03c0, 0x03d9, 0x03f2, 0x040b, 0x000b, - 0x0020, 0x0036, 0x0051, 0x0066, 0x007b, 0x0090, 0x00a5, 0x00ba, - 0x00cf, 0x00e3, 0x00f7, 0x0106, 0x0106, 0x0114, 0x0114, 0x012a, - 0x013d, 0x014d, 0x015c, 0x016b, 0x017c, 0x018c, 0x019c, 0x01ab, - // Entry 16C0 - 16FF - 0x01bc, 0x01cd, 0x01dd, 0x01ed, 0x01fd, 0x020e, 0x021f, 0x022f, - 0x023f, 0x024f, 0x0260, 0x0270, 0x0280, 0x0291, 0x02a1, 0x02b1, - 0x02c1, 0x02d1, 0x02e1, 0x02f2, 0x0304, 0x0314, 0x0323, 0x0332, - 0x0342, 0x0352, 0x0361, 0x0371, 0x0380, 0x0390, 0x039f, 0x03b0, - 0x03c0, 0x03c0, 0x03d4, 0x03e8, 0x03fc, 0x0410, 0x0424, 0x0024, - 0x003e, 0x0057, 0x0071, 0x008b, 0x00a6, 0x00bf, 0x00d8, 0x00f2, - 0x010d, 0x0127, 0x0141, 0x015b, 0x0174, 0x018d, 0x01a7, 0x01c2, - 0x01dc, 0x01f5, 0x020f, 0x0228, 0x0242, 0x025d, 0x0277, 0x0290, - // Entry 1700 - 173F - 0x02aa, 0x02c3, 0x02dd, 0x02f7, 0x0311, 0x032a, 0x0343, 0x035c, - 0x0376, 0x0390, 0x03aa, 0x03c3, 0x03dc, 0x03f5, 0x0410, 0x042b, - 0x0445, 0x045f, 0x047a, 0x0494, 0x0094, 0x00ba, 0x00d3, 0x00ec, - 0x0104, 0x011d, 0x0135, 0x014e, 0x0166, 0x017f, 0x0198, 0x01b1, - 0x01cb, 0x01e4, 0x01fd, 0x0217, 0x0231, 0x024a, 0x0264, 0x027f, - 0x0299, 0x02b3, 0x02cd, 0x02e7, 0x0301, 0x0318, 0x032f, 0x032f, - 0x0345, 0x035a, 0x036f, 0x0386, 0x039c, 0x03b2, 0x03c7, 0x03de, - 0x03f5, 0x040b, 0x0425, 0x0025, 0x0039, 0x004e, 0x0065, 0x007b, - // Entry 1740 - 177F - 0x0090, 0x00a5, 0x00bb, 0x00d1, 0x00ec, 0x0106, 0x0120, 0x013b, - 0x0150, 0x016a, 0x0183, 0x019c, 0x01b6, 0x01d0, 0x01e6, 0x01fb, - 0x020f, 0x0223, 0x0238, 0x024d, 0x0267, 0x0280, 0x0299, 0x02b3, - 0x02c7, 0x02e0, 0x02f8, 0x0310, 0x0329, 0x0342, 0x0354, 0x0366, - 0x0379, 0x038d, 0x039f, 0x03b1, 0x03c3, 0x03d6, 0x03e8, 0x03fa, - 0x040c, 0x041f, 0x0431, 0x0443, 0x0456, 0x046a, 0x047c, 0x048e, - 0x04a0, 0x04b2, 0x04c4, 0x04d5, 0x04e7, 0x04fc, 0x0511, 0x0526, - 0x053b, 0x0551, 0x0151, 0x0161, 0x0178, 0x018f, 0x01a7, 0x01bf, - // Entry 1780 - 17BF - 0x01d5, 0x01ec, 0x0203, 0x0216, 0x022d, 0x0245, 0x025b, 0x0271, - 0x0288, 0x029b, 0x02af, 0x02c9, 0x02db, 0x02f4, 0x0308, 0x031f, - 0x0337, 0x034d, 0x0364, 0x0376, 0x0388, 0x039f, 0x03b7, 0x03ce, - 0x03e4, 0x03fa, 0x0411, 0x0423, 0x0439, 0x0450, 0x0462, 0x0475, - 0x0487, 0x049a, 0x04ac, 0x04c4, 0x04dc, 0x04f3, 0x050a, 0x051d, - 0x052e, 0x0544, 0x0555, 0x0567, 0x0578, 0x058a, 0x059c, 0x05ae, - 0x05c1, 0x05d9, 0x05fa, 0x061b, 0x063e, 0x0658, 0x0679, 0x0697, - 0x06c3, 0x06dd, 0x06f7, 0x0711, 0x0311, 0x0324, 0x0339, 0x0354, - // Entry 17C0 - 17FF - 0x036a, 0x0385, 0x039a, 0x03b0, 0x03c6, 0x03dd, 0x03f2, 0x0408, - 0x041d, 0x0439, 0x044f, 0x0464, 0x047a, 0x0490, 0x04a6, 0x04c1, - 0x04dd, 0x04f3, 0x0507, 0x051b, 0x0535, 0x054f, 0x0569, 0x057e, - 0x0593, 0x05b0, 0x01b0, 0x01d4, 0x01ec, 0x0203, 0x021a, 0x0233, - 0x024b, 0x0263, 0x027a, 0x0293, 0x02ac, 0x02c4, 0x02c4, 0x02dc, - 0x02f3, 0x030a, 0x0323, 0x033b, 0x0353, 0x036a, 0x0383, 0x039c, - 0x03b4, 0x03b4, 0x03c7, 0x03de, 0x03f1, 0x0403, 0x0414, 0x0428, - 0x044b, 0x0462, 0x0474, 0x0489, 0x049e, 0x04b6, 0x04c8, 0x04db, - // Entry 1800 - 183F - 0x00db, 0x00fe, 0x0116, 0x0128, 0x0141, 0x0155, 0x0168, 0x0183, - 0x019c, 0x01bc, 0x01e7, 0x0213, 0x022e, 0x0250, 0x026b, 0x0288, - 0x0288, 0x029f, 0x02b7, 0x02ca, 0x02de, 0x02f1, 0x0306, 0x0322, - 0x0337, 0x0353, 0x0368, 0x0384, 0x039b, 0x03b9, 0x03d1, 0x03f0, - 0x0405, 0x041b, 0x0430, 0x044c, 0x045e, 0x047a, 0x048c, 0x04a3, - 0x04b6, 0x04c8, 0x04df, 0x04f1, 0x0508, 0x051b, 0x0533, 0x0555, - 0x0577, 0x0599, 0x05b2, 0x05c4, 0x05db, 0x05ed, 0x0604, 0x0616, - 0x0628, 0x0640, 0x0652, 0x066c, 0x067e, 0x0690, 0x06a2, 0x06b4, - // Entry 1840 - 187F - 0x06c6, 0x06dd, 0x06f4, 0x0706, 0x0718, 0x072d, 0x0747, 0x075e, - 0x077a, 0x0792, 0x07af, 0x07ca, 0x07ec, 0x0808, 0x082b, 0x0845, - 0x0864, 0x0885, 0x08ab, 0x08c4, 0x08e4, 0x08f6, 0x090f, 0x0929, - 0x0943, 0x095b, 0x0973, 0x098c, 0x09a8, 0x01a8, 0x01bb, 0x01cd, - 0x01df, 0x01f3, 0x0206, 0x0219, 0x022b, 0x023f, 0x0253, 0x0266, - 0x0274, 0x0283, 0x0291, 0x02a9, 0x02bc, 0x02d2, 0x02e3, 0x02ff, - 0x031b, 0x0337, 0x0353, 0x0376, 0x0392, 0x03af, 0x03cc, 0x03e9, - 0x040a, 0x0431, 0x0458, 0x0480, 0x04a8, 0x04d1, 0x0506, 0x053b, - // Entry 1880 - 18BF - 0x0562, 0x0588, 0x05b3, 0x05de, 0x060b, 0x0638, 0x0663, 0x068e, - 0x06bb, 0x06e8, 0x0713, 0x0313, 0x032a, 0x0342, 0x035a, 0x036c, - 0x037e, 0x0390, 0x03a3, 0x03b5, 0x03c7, 0x03da, 0x03ed, 0x0400, - 0x0413, 0x0427, 0x043a, 0x044d, 0x0460, 0x0474, 0x0487, 0x049a, - 0x04ad, 0x04c0, 0x04d3, 0x04e6, 0x04f9, 0x050c, 0x051f, 0x0532, - 0x0545, 0x0558, 0x056b, 0x057e, 0x0591, 0x05b3, 0x05d4, 0x05f4, - 0x0611, 0x062d, 0x064c, 0x0669, 0x0685, 0x06a4, 0x06ba, 0x06cf, - 0x06f3, 0x0717, 0x072b, 0x073f, 0x0753, 0x0766, 0x0779, 0x078e, - // Entry 18C0 - 18FF - 0x07a2, 0x07b6, 0x07c9, 0x07de, 0x07f3, 0x0807, 0x0819, 0x082d, - 0x0841, 0x0855, 0x086d, 0x0885, 0x0893, 0x08ac, 0x08bb, 0x08d5, - 0x08ef, 0x08fe, 0x0912, 0x0921, 0x093b, 0x094a, 0x0964, 0x0973, - 0x098d, 0x09a3, 0x09b2, 0x09cc, 0x09db, 0x09ea, 0x09f9, 0x0a13, - 0x0a22, 0x0a3c, 0x0a54, 0x0a6c, 0x0a7b, 0x0a95, 0x0aaf, 0x0abe, - 0x0ad8, 0x0ae8, 0x0af7, 0x0b11, 0x0b21, 0x0b30, 0x0b40, 0x0b50, - 0x0b5e, 0x0b6c, 0x0b7c, 0x0b8e, 0x0ba7, 0x0bba, 0x0bcc, 0x0be3, - 0x0bf5, 0x0c0c, 0x0c1e, 0x0c42, 0x0c59, 0x0c6f, 0x0c7d, 0x0c8d, - // Entry 1900 - 193F - 0x008d, 0x00a8, 0x00c5, 0x00dd, 0x00f8, 0x0108, 0x0119, 0x012a, - 0x013a, 0x014b, 0x015c, 0x016c, 0x017d, 0x018d, 0x019e, 0x01ae, - 0x01bf, 0x01cf, 0x01df, 0x01ef, 0x0200, 0x0211, 0x0221, 0x0232, - 0x0242, 0x0253, 0x0263, 0x0274, 0x0285, 0x0297, 0x02a8, 0x02b8, - 0x02c8, 0x02d8, 0x02e8, 0x02f9, 0x0309, 0x0319, 0x032a, 0x033a, - 0x0349, 0x0363, 0x037d, 0x0391, 0x03a4, 0x03b7, 0x03cb, 0x03de, - 0x03f2, 0x0405, 0x041c, 0x0433, 0x044a, 0x0461, 0x0478, 0x048f, - 0x04a6, 0x04c3, 0x04dd, 0x04ec, 0x04fd, 0x00fd, 0x0116, 0x013b, - // Entry 1940 - 197F - 0x0154, 0x0174, 0x018d, 0x019e, 0x01ae, 0x01be, 0x01d0, 0x01e1, - 0x01f2, 0x0202, 0x0214, 0x0226, 0x0237, 0x0237, 0x0248, 0x025a, - 0x026b, 0x027e, 0x0290, 0x02a2, 0x02b6, 0x02c9, 0x02dc, 0x02ee, - 0x0302, 0x0316, 0x0329, 0x033b, 0x034d, 0x035f, 0x0372, 0x0384, - 0x0397, 0x03aa, 0x03bd, 0x03d0, 0x03e3, 0x03f5, 0x0407, 0x0419, - 0x042c, 0x043e, 0x0450, 0x0462, 0x0474, 0x0487, 0x0499, 0x04ab, - 0x04bd, 0x04d0, 0x04e2, 0x04f5, 0x0507, 0x051a, 0x052c, 0x053e, - 0x0550, 0x0563, 0x057c, 0x0598, 0x05a6, 0x05b7, 0x05c4, 0x05df, - // Entry 1980 - 19BF - 0x0601, 0x0621, 0x0645, 0x0663, 0x0680, 0x069d, 0x06c2, 0x06e6, - 0x0704, 0x0726, 0x0326, 0x0347, 0x036b, 0x038e, 0x03af, 0x03d6, - 0x03fc, 0x0422, 0x0448, 0x0048, 0x005b, 0x006b, 0x007d, 0x0091, - 0x00b6, 0x00ea, 0x0113, 0x0144, 0x015b, 0x0196, 0x01af, 0x01c8, - 0x01e3, 0x01f7, 0x0210, 0x022b, 0x025b, 0x0286, 0x02a0, 0x02b9, - 0x02db, 0x02f6, 0x031a, 0x033d, 0x0362, 0x0382, 0x03a2, 0x03c1, - 0x03ea, 0x03fb, 0x041c, 0x0434, 0x0453, 0x0475, 0x048c, 0x04ab, - 0x04c2, 0x04d8, 0x04ee, 0x00ee, 0x0103, 0x011f, 0x011f, 0x013b, - // Entry 19C0 - 19FF - 0x0158, 0x0174, 0x0197, 0x01b3, 0x01cf, 0x01ed, 0x0209, 0x0229, - 0x0244, 0x0260, 0x027c, 0x02a4, 0x02c0, 0x02e5, 0x0301, 0x0322, - 0x033f, 0x0361, 0x038a, 0x03a6, 0x03c3, 0x03e0, 0x0400, 0x041c, - 0x0441, 0x0464, 0x0480, 0x049c, 0x04b9, 0x04e2, 0x0506, 0x0522, - 0x053e, 0x055a, 0x0578, 0x059d, 0x05ad, 0x05cd, 0x05ed, 0x060a, - 0x0628, 0x0646, 0x0666, 0x067f, 0x0699, 0x06b2, 0x06d2, 0x06eb, - 0x0704, 0x0726, 0x073f, 0x0758, 0x0771, 0x078a, 0x07a3, 0x07bc, - 0x07d5, 0x07ee, 0x0810, 0x0829, 0x0843, 0x085c, 0x0875, 0x088e, - // Entry 1A00 - 1A3F - 0x08a7, 0x08c0, 0x08d7, 0x08f5, 0x0910, 0x092f, 0x0946, 0x095d, - 0x0974, 0x098f, 0x09ab, 0x09ce, 0x09e5, 0x0a03, 0x0a1a, 0x0a31, - 0x0a4a, 0x0a61, 0x0a7d, 0x0a9d, 0x0ac0, 0x0ad7, 0x0aee, 0x0b05, - 0x0b25, 0x0b43, 0x0b5a, 0x0b73, 0x0b8d, 0x0bae, 0x0bc9, 0x0be8, - 0x0c01, 0x0c1f, 0x0c3d, 0x0c5b, 0x0c79, 0x0c9a, 0x0cbc, 0x0cdc, - 0x0cfc, 0x0d1c, 0x0d31, 0x0d57, 0x0d7d, 0x0da3, 0x0dc9, 0x0def, - 0x0e15, 0x0e3b, 0x0e6e, 0x0e94, 0x0eba, 0x0ee0, 0x0efb, 0x0f16, - 0x0f32, 0x0f5a, 0x0f82, 0x0fa5, 0x0fc5, 0x0fed, 0x1013, 0x1039, - // Entry 1A40 - 1A7F - 0x105f, 0x1085, 0x10ab, 0x10d1, 0x10f7, 0x111d, 0x1143, 0x1169, - 0x118f, 0x11b5, 0x11dd, 0x1203, 0x1229, 0x124f, 0x1277, 0x12a3, - 0x12ca, 0x12f2, 0x131f, 0x1355, 0x1381, 0x13a9, 0x13d6, 0x1400, - 0x1428, 0x1452, 0x1474, 0x148b, 0x14ac, 0x14c5, 0x14ea, 0x1501, - 0x152c, 0x154a, 0x1568, 0x158b, 0x15a5, 0x15c4, 0x15ef, 0x1618, - 0x1643, 0x166c, 0x168b, 0x16ac, 0x16d8, 0x16fe, 0x1729, 0x1748, - 0x1766, 0x177f, 0x17a0, 0x17b9, 0x17e2, 0x17fd, 0x181a, 0x1839, - 0x185a, 0x1878, 0x188f, 0x18ba, 0x18db, 0x18f4, 0x190f, 0x192c, - // Entry 1A80 - 1ABF - 0x1949, 0x195e, 0x1977, 0x198d, 0x19a3, 0x19b9, 0x19cf, 0x19ea, - 0x1a05, 0x1a29, 0x1a3f, 0x1a55, 0x1a76, 0x1a8c, 0x1aa2, 0x1ab4, - 0x1ac6, 0x1ad8, 0x1b0b, 0x1b2a, 0x1b49, 0x1b68, 0x1b8e, 0x1bb4, - 0x1bd4, 0x1bf2, 0x1c18, 0x1c36, 0x1c54, 0x1c7a, 0x1ca0, 0x1cbe, - 0x1ce4, 0x1d0a, 0x1d30, 0x1d4e, 0x1d71, 0x1d8f, 0x1db1, 0x1dcf, - 0x1df0, 0x1e12, 0x1e30, 0x1e67, 0x1ea6, 0x1ec4, 0x1ee4, 0x1f23, - 0x1f41, 0x1f6e, 0x1f9b, 0x1fc8, 0x1fdf, 0x03df, 0x03f6, 0x041b, - 0x043a, 0x0458, 0x048a, 0x04b0, 0x04d4, 0x04f9, 0x051c, 0x0541, - // Entry 1AC0 - 1AFF - 0x0564, 0x058a, 0x05ae, 0x05db, 0x0606, 0x062b, 0x064e, 0x0673, - 0x0696, 0x06bc, 0x06e0, 0x0703, 0x0724, 0x0750, 0x077a, 0x07a6, - 0x07d0, 0x07fc, 0x0826, 0x0852, 0x087c, 0x08a3, 0x08c8, 0x08f5, - 0x0920, 0x0945, 0x0968, 0x098a, 0x09aa, 0x09cf, 0x09f2, 0x0a17, - 0x0a3a, 0x0a5f, 0x0a82, 0x0aa5, 0x0ac6, 0x0aed, 0x0b12, 0x0b39, - 0x0b5e, 0x0b8d, 0x0bba, 0x0bdb, 0x0bfa, 0x0c1f, 0x0c42, 0x0c68, - 0x0c8c, 0x0cb1, 0x0cd4, 0x0d04, 0x0d32, 0x0d58, 0x0d7c, 0x0da8, - 0x0dd2, 0x0df3, 0x0e12, 0x0e37, 0x0e5a, 0x0e7f, 0x0ea2, 0x0ec7, - // Entry 1B00 - 1B3F - 0x0eea, 0x0f0f, 0x0f32, 0x0f58, 0x0f7c, 0x0fa8, 0x0fd2, 0x0ffd, - 0x1026, 0x1055, 0x1082, 0x10ae, 0x10d8, 0x1104, 0x112e, 0x114f, - 0x116e, 0x1193, 0x11b6, 0x11db, 0x11fe, 0x1223, 0x1246, 0x1276, - 0x12a4, 0x12ca, 0x12ee, 0x1313, 0x1336, 0x135b, 0x137e, 0x13ad, - 0x13da, 0x1409, 0x1436, 0x1469, 0x149a, 0x14bf, 0x14e2, 0x1507, - 0x152a, 0x1550, 0x1574, 0x15a0, 0x15ca, 0x15f5, 0x161e, 0x1645, - 0x166a, 0x1696, 0x16c0, 0x16eb, 0x1714, 0x1744, 0x1772, 0x1793, - 0x17b2, 0x17d7, 0x17fa, 0x181b, 0x183a, 0x185b, 0x187a, 0x189f, - // Entry 1B40 - 1B7F - 0x18c2, 0x18e7, 0x190a, 0x192f, 0x1952, 0x1977, 0x199a, 0x19bf, - 0x19e2, 0x1a07, 0x1a2a, 0x1a50, 0x1a74, 0x1a99, 0x1abc, 0x1ae2, - 0x1b06, 0x1b2a, 0x1b4d, 0x1b71, 0x1b95, 0x1bbe, 0x1be6, 0x1c14, - 0x1c3e, 0x1c5a, 0x1c72, 0x1c97, 0x1cba, 0x1ce0, 0x1d04, 0x1d34, - 0x1d62, 0x1d92, 0x1dc0, 0x1df5, 0x1e28, 0x1e58, 0x1e86, 0x1eba, - 0x1eec, 0x1f17, 0x1f40, 0x1f6b, 0x1f94, 0x1fc4, 0x1ff2, 0x201d, - 0x2046, 0x2075, 0x20a2, 0x20c7, 0x20ea, 0x2110, 0x2134, 0x2155, - 0x2174, 0x21a4, 0x21d2, 0x2202, 0x2230, 0x2265, 0x2298, 0x22c8, - // Entry 1B80 - 1BBF - 0x22f6, 0x232a, 0x235c, 0x2382, 0x23a6, 0x23cb, 0x23ee, 0x2413, - 0x2436, 0x245c, 0x2480, 0x24b0, 0x24de, 0x250e, 0x253c, 0x2571, - 0x25a4, 0x25d4, 0x2602, 0x2636, 0x2668, 0x2692, 0x26ba, 0x26e4, - 0x270c, 0x273b, 0x2768, 0x2792, 0x27ba, 0x27e8, 0x2814, 0x2839, - 0x285c, 0x2882, 0x28a6, 0x28d0, 0x28f8, 0x2922, 0x294a, 0x2979, - 0x29a6, 0x29d0, 0x29f8, 0x2a26, 0x2a52, 0x2a73, 0x2a92, 0x2ab7, - 0x2ada, 0x2b00, 0x2b24, 0x2b45, 0x2b64, 0x2b88, 0x2baa, 0x2bcd, - 0x2bee, 0x2c0e, 0x2c2c, 0x2c4f, 0x2c72, 0x2c9f, 0x2ccc, 0x2cf8, - // Entry 1BC0 - 1BFF - 0x2d24, 0x2d57, 0x2d8a, 0x2daf, 0x2dd4, 0x2e03, 0x2e32, 0x2e60, - 0x2e8e, 0x2ec3, 0x2ef8, 0x2f1d, 0x2f42, 0x2f71, 0x2fa0, 0x2fce, - 0x2ffc, 0x03fc, 0x0423, 0x044a, 0x047b, 0x04ac, 0x04dc, 0x050c, - 0x010c, 0x012d, 0x014e, 0x0179, 0x01a4, 0x01ce, 0x01f8, 0x0229, - 0x025a, 0x027d, 0x02a0, 0x02cd, 0x02fa, 0x0326, 0x0352, 0x0385, - 0x03b8, 0x03da, 0x03fc, 0x0428, 0x0454, 0x047f, 0x04aa, 0x04dc, - 0x050e, 0x0532, 0x0556, 0x0584, 0x05b2, 0x05df, 0x060c, 0x0640, - 0x0674, 0x0699, 0x06be, 0x06ed, 0x071c, 0x074a, 0x0778, 0x0378, - // Entry 1C00 - 1C3F - 0x039f, 0x03c6, 0x03f7, 0x0428, 0x0458, 0x0488, 0x0088, 0x00ad, - 0x00d2, 0x0101, 0x0130, 0x015e, 0x018c, 0x01c1, 0x01f6, 0x01f6, - 0x021d, 0x021d, 0x024e, 0x024e, 0x027e, 0x027e, 0x02b5, 0x02d8, - 0x02fb, 0x0328, 0x0355, 0x0381, 0x03ad, 0x03e0, 0x0413, 0x0438, - 0x045d, 0x048c, 0x04bb, 0x04e9, 0x0517, 0x054c, 0x0581, 0x05a4, - 0x05c6, 0x05eb, 0x060f, 0x0630, 0x0650, 0x0672, 0x0693, 0x06b8, - 0x06dc, 0x0701, 0x0725, 0x0748, 0x076a, 0x036a, 0x039f, 0x03d4, - 0x0413, 0x0452, 0x0490, 0x04ce, 0x0513, 0x0558, 0x0590, 0x05c8, - // Entry 1C40 - 1C7F - 0x060a, 0x064c, 0x068d, 0x06ce, 0x0716, 0x075e, 0x0791, 0x07c4, - 0x0801, 0x083e, 0x087a, 0x08b6, 0x08f9, 0x093c, 0x0972, 0x09a8, - 0x09e8, 0x0a28, 0x0a67, 0x0aa6, 0x0aec, 0x0b32, 0x0b67, 0x0b9c, - 0x0bdb, 0x0c1a, 0x0c58, 0x0c96, 0x0cdb, 0x0d20, 0x0d58, 0x0d90, - 0x0dd2, 0x0e14, 0x0e55, 0x0e96, 0x0ede, 0x0f26, 0x0f4a, 0x0f6e, - 0x0fa3, 0x0fce, 0x1002, 0x0002, 0x002b, 0x0066, 0x008c, 0x00b2, - 0x00d7, 0x00fb, 0x0129, 0x0136, 0x014a, 0x0155, 0x0166, 0x0185, - 0x01b8, 0x01e1, 0x0213, 0x0213, 0x023a, 0x0273, 0x029a, 0x02c0, - // Entry 1C80 - 1CBF - 0x02e3, 0x0305, 0x0331, 0x0346, 0x035a, 0x0375, 0x0398, 0x03bb, - 0x03eb, 0x041a, 0x001a, 0x0042, 0x0078, 0x009d, 0x00c2, 0x00e6, - 0x0109, 0x0109, 0x011e, 0x0132, 0x014d, 0x0173, 0x0199, 0x01cc, - 0x01fe, 0x021f, 0x0240, 0x026b, 0x02a4, 0x02cc, 0x02f4, 0x031b, - 0x0341, 0x0364, 0x037d, 0x0395, 0x03a0, 0x03a0, 0x03d5, 0x0400, - 0x0434, 0x0034, 0x005d, 0x0098, 0x00bf, 0x00e5, 0x010a, 0x012e, - 0x015c, 0x0166, 0x0171, 0x0171, 0x0178, 0x017f, 0x0187, 0x018f, - 0x01a1, 0x01b2, 0x01c2, 0x01ce, 0x01df, 0x01e9, 0x01f3, 0x0203, - // Entry 1CC0 - 1CFF - 0x0218, 0x0229, 0x023b, 0x024d, 0x0253, 0x0266, 0x0271, 0x0278, - 0x027f, 0x028d, 0x02a1, 0x02b0, 0x02ca, 0x02e5, 0x0300, 0x0325, - 0x033f, 0x035a, 0x0375, 0x039a, 0x03a0, 0x03ad, 0x03b3, 0x03c4, - 0x03d2, 0x03e0, 0x03f3, 0x0404, 0x0412, 0x0425, 0x043c, 0x0453, - 0x046d, 0x0483, 0x0499, 0x04ae, 0x04bc, 0x04d1, 0x04d6, 0x04e2, - 0x04ee, 0x04fc, 0x0511, 0x0526, 0x052b, 0x0554, 0x057e, 0x058c, - 0x05a3, 0x05ae, 0x05b6, 0x05be, 0x05cb, 0x05e0, 0x05e8, 0x05f5, - 0x0603, 0x0621, 0x0640, 0x0654, 0x066d, 0x0686, 0x0696, 0x06ab, - // Entry 1D00 - 1D3F - 0x06c1, 0x06d8, 0x06e4, 0x06f6, 0x06fe, 0x071e, 0x0733, 0x073d, - 0x074e, 0x0765, 0x077a, 0x0789, 0x079d, 0x07b1, 0x07c4, 0x07d1, - 0x07dd, 0x07e5, 0x07f7, 0x0810, 0x081b, 0x082f, 0x083e, 0x0851, - 0x085f, 0x005f, 0x0074, 0x0089, 0x009d, 0x00b4, 0x00ce, 0x00e9, - 0x0104, 0x0120, 0x0135, 0x0149, 0x0159, 0x0179, 0x0179, 0x0189, - 0x0199, 0x01a8, 0x01b9, 0x01ca, 0x01da, 0x01ef, 0x0200, 0x0217, - 0x0233, 0x0250, 0x0270, 0x027e, 0x028b, 0x0298, 0x02a7, 0x02b5, - 0x02c3, 0x02d0, 0x02df, 0x02ee, 0x02fc, 0x030f, 0x031e, 0x0333, - // Entry 1D40 - 1D7F - 0x034d, 0x0368, 0x0368, 0x0386, 0x03a4, 0x03c2, 0x03e0, 0x0402, - 0x0420, 0x043e, 0x045c, 0x047a, 0x0498, 0x04b6, 0x04d4, 0x04f2, - 0x00f2, 0x0104, 0x010e, 0x011b, 0x012c, 0x0135, 0x013e, 0x0148, - 0x0153, 0x015d, 0x0165, 0x0174, 0x017d, 0x0186, 0x018e, 0x0199, - 0x01a5, 0x01b6, 0x01bf, 0x01cb, 0x01d7, 0x01e3, 0x01ec, 0x01ff, - 0x020c, 0x0216, 0x0227, 0x0238, 0x0248, 0x0252, 0x025c, 0x0265, - 0x0265, 0x0281, 0x029e, 0x02c2, 0x02e7, 0x030a, 0x0329, 0x0343, - 0x035e, 0x0374, 0x0394, 0x03b8, 0x03d2, 0x03eb, 0x0405, 0x041f, - // Entry 1D80 - 1DBF - 0x043a, 0x045e, 0x047e, 0x0498, 0x04b2, 0x04de, 0x04ff, 0x0527, - 0x053f, 0x0558, 0x0573, 0x0594, 0x05b9, 0x05e9, 0x0618, 0x0632, - 0x064d, 0x0665, 0x0265, 0x026f, 0x0287, 0x029e, 0x02ac, 0x02be, - 0x02c5, 0x02cd, 0x02db, 0x02e2, 0x02f3, 0x0301, 0x0311, 0x0327, - 0x033e, 0x034d, 0x0368, 0x0378, 0x038e, 0x039e, 0x03ac, 0x03ba, - 0x03d1, 0x03dc, 0x03f5, 0x0405, 0x041c, 0x0433, 0x0443, 0x0459, - 0x0470, 0x0481, 0x0489, 0x0495, 0x04a3, 0x04b2, 0x04ba, 0x04d1, - 0x04db, 0x04e3, 0x04f4, 0x050a, 0x0528, 0x0533, 0x0540, 0x0550, - // Entry 1DC0 - 1DFF - 0x0566, 0x0576, 0x0584, 0x0594, 0x05a4, 0x05b4, 0x05c4, 0x05d2, - 0x05dd, 0x05e7, 0x05f3, 0x05ff, 0x0611, 0x0622, 0x0630, 0x0646, - 0x065f, 0x067a, 0x0692, 0x06af, 0x06ca, 0x06e5, 0x0702, 0x071d, - 0x073b, 0x0757, 0x0773, 0x078f, 0x07ab, 0x07b8, 0x07c8, 0x07d0, - 0x07dc, 0x07ea, 0x0805, 0x0820, 0x0839, 0x0852, 0x086b, 0x0885, - 0x089e, 0x08b8, 0x08d4, 0x08ef, 0x0908, 0x0923, 0x093d, 0x095a, - 0x0976, 0x0993, 0x09a9, 0x09ba, 0x09cb, 0x09de, 0x09f0, 0x0a02, - 0x0a13, 0x0a26, 0x0a39, 0x0a4b, 0x0a5c, 0x0a70, 0x0a84, 0x0a97, - // Entry 1E00 - 1E3F - 0x0ab0, 0x0aca, 0x0ae4, 0x0afb, 0x0b12, 0x0b2b, 0x0b43, 0x0b5b, - 0x0b72, 0x0b8b, 0x0ba4, 0x0bbc, 0x0bd3, 0x0bed, 0x0c07, 0x0c20, - 0x0c3f, 0x0c5f, 0x0c7f, 0x0c9d, 0x0cb8, 0x0cd2, 0x0cf4, 0x0d11, - 0x0d2c, 0x0d4a, 0x0d66, 0x0d88, 0x0da3, 0x0db3, 0x0dc5, 0x01c5, - 0x01d4, 0x01e1, 0x01f1, 0x0200, 0x0210, 0x021d, 0x022d, 0x023d, - 0x024d, 0x025d, 0x0278, 0x0294, 0x02a8, 0x02bd, 0x02d7, 0x02ef, - 0x030a, 0x0324, 0x033d, 0x0357, 0x036f, 0x0385, 0x039e, 0x03b6, - 0x03cd, 0x03e6, 0x0400, 0x0419, 0x0433, 0x0448, 0x0464, 0x047a, - // Entry 1E40 - 1E7F - 0x049a, 0x04bb, 0x04dd, 0x0500, 0x0526, 0x054b, 0x056d, 0x058b, - 0x05a7, 0x05da, 0x05f9, 0x0614, 0x0637, 0x065c, 0x0680, 0x06a3, - 0x06c7, 0x06ed, 0x0713, 0x0738, 0x075d, 0x0787, 0x07ac, 0x07c3, - 0x07d8, 0x07f0, 0x0807, 0x0830, 0x0859, 0x087b, 0x089e, 0x08c1, - 0x08d7, 0x08eb, 0x0902, 0x0918, 0x092f, 0x0943, 0x095a, 0x0971, - 0x0988, 0x099f, 0x09b5, 0x09cc, 0x09e4, 0x09fd, 0x0a1d, 0x0a3f, - 0x0a55, 0x0a69, 0x0a80, 0x0a96, 0x0aac, 0x0ac3, 0x0ad8, 0x0aeb, - 0x0b01, 0x0b16, 0x0b32, 0x0b51, 0x0b84, 0x0bb5, 0x0bcf, 0x0bf5, - // Entry 1E80 - 1EBF - 0x0c15, 0x0c2f, 0x0c49, 0x0c5c, 0x0c79, 0x0ca3, 0x0cba, 0x0cde, - 0x0d03, 0x0d28, 0x0d53, 0x0d7f, 0x0dab, 0x0dc6, 0x0de2, 0x0dfe, - 0x0e05, 0x0e0f, 0x0e23, 0x0e2f, 0x0e43, 0x0e4c, 0x0e55, 0x0e5a, - 0x0e64, 0x0e75, 0x0e85, 0x0e97, 0x0eb1, 0x0ec9, 0x0ed5, 0x0ee2, - 0x0ef1, 0x0f00, 0x0f0a, 0x0f1c, 0x0f24, 0x0f32, 0x0f3b, 0x0f4c, - 0x0f59, 0x0f68, 0x0f73, 0x0f7c, 0x0f87, 0x0f96, 0x0f9e, 0x0fa9, - 0x0fae, 0x0fbc, 0x0fcb, 0x0fd2, 0x0fe1, 0x0fec, 0x0ffb, 0x1006, - 0x1010, 0x101c, 0x1021, 0x1029, 0x1038, 0x1047, 0x1057, 0x1067, - // Entry 1EC0 - 1EFF - 0x1076, 0x1088, 0x10a2, 0x10c0, 0x10c9, 0x10d0, 0x10d5, 0x10df, - 0x10e8, 0x10ee, 0x1102, 0x110c, 0x111a, 0x1128, 0x1137, 0x1140, - 0x114e, 0x1157, 0x1162, 0x1179, 0x1194, 0x11aa, 0x11d1, 0x11fc, - 0x120b, 0x121e, 0x1236, 0x1242, 0x124e, 0x125b, 0x1276, 0x1288, - 0x129c, 0x12b2, 0x12d8, 0x12fa, 0x1306, 0x1312, 0x1322, 0x132f, - 0x133d, 0x1346, 0x1354, 0x135f, 0x136d, 0x1383, 0x138e, 0x13a1, - 0x13ad, 0x13b9, 0x13c9, 0x13df, 0x13f4, 0x140c, 0x1423, 0x143d, - 0x1457, 0x1474, 0x1482, 0x1493, 0x149a, 0x14ab, 0x14b8, 0x14c8, - // Entry 1F00 - 1F3F - 0x14e6, 0x1507, 0x1521, 0x153e, 0x1561, 0x1587, 0x15a0, 0x15b9, - 0x15db, 0x15fd, 0x1605, 0x160d, 0x1621, 0x1635, 0x164e, 0x1667, - 0x1677, 0x1687, 0x1690, 0x169b, 0x16aa, 0x16bb, 0x16d0, 0x16e7, - 0x1707, 0x1729, 0x1744, 0x1761, 0x1769, 0x1780, 0x178e, 0x179d, - 0x17af, 0x17ca, 0x17e8, 0x17f2, 0x17fc, 0x1808, 0x1815, 0x1822, - 0x1838, 0x184c, 0x1861, 0x187a, 0x1888, 0x1894, 0x18a0, 0x18ad, - 0x18ba, 0x18ce, 0x18d8, 0x18e1, 0x18ea, 0x18f1, 0x18fa, 0x1900, - 0x1904, 0x190a, 0x192d, 0x1957, 0x1965, 0x196d, 0x197b, 0x19ad, - // Entry 1F40 - 1F7F - 0x19c4, 0x19db, 0x19ed, 0x1a08, 0x1a26, 0x1a4d, 0x1a58, 0x1a60, - 0x1a68, 0x1a82, 0x1a8d, 0x1a90, 0x1a94, 0x1a97, 0x1aab, 0x1ab9, - 0x1aca, 0x1ada, 0x1aec, 0x1af7, 0x1b07, 0x1b13, 0x1b20, 0x1b2e, - 0x1b34, 0x1b59, 0x1b7f, 0x1b96, 0x1bae, 0x1bc3, 0x1bd3, 0x1be4, - 0x1bf1, 0x1c00, 0x1c13, 0x1c1f, 0x1c28, 0x1c3d, 0x1c4f, 0x1c64, - 0x1c77, 0x1c8d, 0x1caf, 0x1cd1, 0x1ce6, 0x1cfe, 0x1d12, 0x1d26, - 0x1d3f, 0x1d58, 0x1d77, 0x1d99, 0x1db8, 0x1dda, 0x1df9, 0x1e1b, - 0x1e39, 0x1e57, 0x1e6d, 0x1e90, 0x1eb2, 0x1ede, 0x1eef, 0x1f0a, - // Entry 1F80 - 1FBF - 0x1f24, 0x1f40, 0x1f66, 0x1f9e, 0x1fdc, 0x1ff5, 0x200c, 0x2029, - 0x2041, 0x2067, 0x208b, 0x20c1, 0x20fd, 0x2112, 0x212d, 0x2146, - 0x2153, 0x2161, 0x2166, 0x2172, 0x2180, 0x218a, 0x2195, 0x219e, - 0x21aa, 0x21b7, 0x21c1, 0x21cc, 0x21dd, 0x21ed, 0x21fb, 0x2208, - 0x2219, 0x2227, 0x222a, 0x2231, 0x2237, 0x2249, 0x225b, 0x226a, - 0x2280, 0x228f, 0x2294, 0x229d, 0x22ac, 0x22bc, 0x22ce, 0x22e1, - 0x22f2, 0x2306, 0x230b, 0x2310, 0x2338, 0x2342, 0x2354, 0x2368, - 0x2370, 0x238b, 0x23a7, 0x23b8, 0x23c4, 0x23d0, 0x23e2, 0x23ea, - // Entry 1FC0 - 1FFF - 0x23f6, 0x2406, 0x2413, 0x2418, 0x2423, 0x242e, 0x244a, 0x246b, - 0x248b, 0x24ac, 0x24ce, 0x24ec, 0x250d, 0x252f, 0x254f, 0x256e, - 0x2591, 0x25b1, 0x25d5, 0x25f9, 0x2620, 0x2644, 0x2669, 0x2693, - 0x26be, 0x26e4, 0x270c, 0x272d, 0x2752, 0x2772, 0x2795, 0x27b7, - 0x27df, 0x2804, 0x2823, 0x2846, 0x2864, 0x2885, 0x28a9, 0x28d3, - 0x28f7, 0x291b, 0x2941, 0x2963, 0x2988, 0x29a9, 0x29c9, 0x29ea, - 0x2a0a, 0x2a31, 0x2a54, 0x2a78, 0x2a9b, 0x2ac1, 0x2ae6, 0x2b0b, - 0x2b30, 0x2b5c, 0x2b7b, 0x2b9a, 0x2bb5, 0x2bd6, 0x2bfe, 0x2c22, - // Entry 2000 - 203F - 0x2c45, 0x2c6b, 0x2c8f, 0x2ca9, 0x2cc2, 0x2cdd, 0x2d01, 0x2d27, - 0x2d4a, 0x2d6e, 0x2d89, 0x2d97, 0x2dbe, 0x2dd1, 0x2ddc, 0x2df9, - 0x2e09, 0x2e24, 0x2e42, 0x2e51, 0x2e63, 0x2e89, 0x2e95, 0x2eab, - 0x2eb6, 0x2ed7, 0x2eec, 0x2f0e, 0x2f19, 0x2f2a, 0x2f3b, 0x2f5c, - 0x2f7d, 0x2f9c, 0x2fb9, 0x2fd7, 0x2fef, 0x3009, 0x3025, 0x3032, - 0x303b, 0x304e, 0x3061, 0x307c, 0x3096, 0x30b1, 0x30cd, 0x30e8, - 0x3104, 0x3124, 0x3141, 0x3161, 0x3182, 0x31a0, 0x31c1, 0x31de, - 0x31fd, 0x321a, 0x3231, 0x324f, 0x326f, 0x328d, 0x329f, 0x32b8, - // Entry 2040 - 207F - 0x32e7, 0x3316, 0x3323, 0x3333, 0x3345, 0x335a, 0x3387, 0x339c, - 0x33b2, 0x33c9, 0x33df, 0x33f5, 0x340b, 0x3421, 0x344e, 0x347e, - 0x34a9, 0x34df, 0x3513, 0x3540, 0x3578, 0x35ae, 0x35d6, 0x360a, - 0x363c, 0x3666, 0x368e, 0x36ba, 0x36e9, 0x36f4, 0x3701, 0x370d, - 0x3724, 0x3732, 0x374a, 0x3762, 0x377f, 0x379c, 0x37b6, 0x37c6, - 0x37d8, 0x37ea, 0x37f6, 0x37fa, 0x3809, 0x381b, 0x382c, 0x3840, - 0x385a, 0x3877, 0x3886, 0x389e, 0x38aa, 0x38b2, 0x38bc, 0x38d3, - 0x38ea, 0x390e, 0x3931, 0x3952, 0x3975, 0x39ab, 0x39e0, 0x3a16, - // Entry 2080 - 20BF - 0x3a21, 0x3a2a, 0x3a35, 0x3a50, 0x3a73, 0x3a97, 0x3ab8, 0x3adb, - 0x3aee, 0x3b03, 0x3b1a, 0x3b26, 0x3b39, 0x3b48, 0x3b5a, 0x035a, - 0x0369, 0x0384, 0x039c, 0x03b2, 0x03d0, 0x03e2, 0x03f8, 0x0407, - 0x041b, 0x043b, 0x044f, 0x046d, 0x0481, 0x049b, 0x04af, 0x04c2, - 0x04dd, 0x04fa, 0x0517, 0x0536, 0x0554, 0x0573, 0x058e, 0x05b2, - 0x05c3, 0x05db, 0x05f0, 0x0601, 0x061a, 0x0634, 0x064f, 0x0668, - 0x0678, 0x0689, 0x0695, 0x069d, 0x06af, 0x06c9, 0x06e7, 0x02e7, - 0x02ef, 0x02f8, 0x0300, 0x0311, 0x0320, 0x032b, 0x0349, 0x035c, - // Entry 20C0 - 20FF - 0x0364, 0x037f, 0x0393, 0x0393, 0x03a4, 0x03b5, 0x03c8, 0x03da, - 0x03ec, 0x03fd, 0x0410, 0x0423, 0x0435, 0x0447, 0x045c, 0x0471, - 0x0488, 0x049f, 0x04b5, 0x04cb, 0x04e3, 0x04fa, 0x0511, 0x0526, - 0x053d, 0x0554, 0x056d, 0x0585, 0x059d, 0x05b4, 0x05cd, 0x05e6, - 0x05fe, 0x0616, 0x0631, 0x064c, 0x0669, 0x0686, 0x06a2, 0x06be, - 0x06dc, 0x06f9, 0x0716, 0x0731, 0x0744, 0x0757, 0x076c, 0x0780, - 0x0794, 0x07a7, 0x07bc, 0x07d1, 0x07e5, 0x07f9, 0x0810, 0x0827, - 0x0840, 0x0859, 0x0871, 0x0889, 0x08a3, 0x08bc, 0x08d5, 0x08ec, - // Entry 2100 - 213F - 0x090e, 0x0930, 0x0952, 0x0974, 0x0996, 0x09b8, 0x09da, 0x09fc, - 0x0a1e, 0x0a40, 0x0a62, 0x0a84, 0x0aa6, 0x0ac8, 0x0aea, 0x0b0c, - 0x0b2e, 0x0b50, 0x0b72, 0x0b94, 0x0bb6, 0x0bd8, 0x0bfa, 0x0c1c, - 0x0c3e, 0x0c60, 0x0c7e, 0x0c9c, 0x0cba, 0x0cd8, 0x0cf6, 0x0d14, - 0x0d32, 0x0d50, 0x0d6e, 0x0d8c, 0x0daa, 0x0dc8, 0x0de6, 0x0e04, - 0x0e22, 0x0e40, 0x0e5e, 0x0e7c, 0x0e9a, 0x0eb8, 0x0ed6, 0x0ef4, - 0x0f12, 0x0f30, 0x0f4e, 0x0f6c, 0x0f88, 0x0fa4, 0x0fc0, 0x0fdc, - 0x0ff8, 0x1014, 0x1030, 0x104c, 0x1068, 0x1084, 0x10a0, 0x10bc, - // Entry 2140 - 217F - 0x10d8, 0x10f4, 0x1110, 0x112c, 0x1148, 0x1164, 0x1180, 0x119c, - 0x11b8, 0x11d4, 0x11f0, 0x120c, 0x1228, 0x1244, 0x1256, 0x1274, - 0x1292, 0x12b2, 0x12d2, 0x12f1, 0x1310, 0x1331, 0x1351, 0x1371, - 0x138f, 0x13a7, 0x13bf, 0x13d9, 0x13f2, 0x140b, 0x1423, 0x143d, - 0x1457, 0x1470, 0x1489, 0x14a4, 0x14c1, 0x14de, 0x14f9, 0x1514, - 0x153d, 0x1566, 0x158d, 0x15b4, 0x15e0, 0x160c, 0x1636, 0x1660, - 0x1681, 0x16a8, 0x16cf, 0x16f0, 0x1710, 0x1736, 0x175c, 0x177c, - 0x179b, 0x17c0, 0x17e5, 0x1804, 0x1822, 0x1846, 0x186a, 0x1888, - // Entry 2180 - 21BF - 0x18ad, 0x18d8, 0x1902, 0x192c, 0x1957, 0x1981, 0x19ab, 0x19d0, - 0x19f4, 0x1a1e, 0x1a47, 0x1a70, 0x1a9a, 0x1ac3, 0x1aec, 0x1b10, - 0x1b36, 0x1b62, 0x1b8e, 0x1bba, 0x1be6, 0x1c12, 0x1c3e, 0x1c64, - 0x1c88, 0x1cb2, 0x1cdc, 0x1d06, 0x1d30, 0x1d5a, 0x1d84, 0x1da8, - 0x1dd2, 0x1e02, 0x1e32, 0x1e62, 0x1e91, 0x1ec0, 0x1ef0, 0x1f1f, - 0x1f4e, 0x1f7d, 0x1fac, 0x1fdb, 0x200a, 0x203a, 0x206a, 0x2094, - 0x20bd, 0x20e6, 0x210d, 0x2134, 0x2152, 0x216e, 0x2197, 0x21c0, - 0x21e2, 0x220a, 0x2232, 0x2253, 0x227a, 0x22a1, 0x22c1, 0x22e7, - // Entry 21C0 - 21FF - 0x230d, 0x232c, 0x2359, 0x2386, 0x23ac, 0x23d8, 0x2404, 0x2429, - 0x2457, 0x2485, 0x24ac, 0x24d8, 0x2504, 0x2529, 0x255b, 0x258d, - 0x25b8, 0x25dd, 0x2601, 0x2623, 0x2646, 0x267b, 0x26b0, 0x26d1, - 0x26e8, 0x26fd, 0x2715, 0x272c, 0x2743, 0x2758, 0x2770, 0x2787, - 0x27ae, 0x27d2, 0x27f9, 0x281d, 0x282d, 0x2843, 0x285a, 0x2873, - 0x2883, 0x289b, 0x28b5, 0x28ce, 0x28d8, 0x28f0, 0x2909, 0x2920, - 0x292f, 0x2947, 0x295d, 0x2972, 0x2982, 0x298d, 0x2999, 0x29a3, - 0x29b9, 0x29cf, 0x29e2, 0x29f6, 0x2a09, 0x2a3b, 0x2a5e, 0x2a90, - // Entry 2200 - 223F - 0x2ac3, 0x2ad7, 0x2afa, 0x2b2d, 0x2b39, 0x2b45, 0x2b66, 0x2b90, - 0x2bab, 0x2bc4, 0x2bea, 0x2c14, 0x2c3e, 0x2c62, 0x2c74, 0x2c86, - 0x2c95, 0x2ca4, 0x2cbc, 0x2cd4, 0x2ce7, 0x2cfa, 0x2d14, 0x2d2e, - 0x2d4e, 0x2d6e, 0x2d8b, 0x2da8, 0x2dcb, 0x2dee, 0x2e0a, 0x2e26, - 0x2e42, 0x2e5e, 0x2e80, 0x2ea2, 0x2ebe, 0x2eda, 0x2efc, 0x2f1e, - 0x2f39, 0x2f54, 0x2f61, 0x2f6e, 0x2f9a, 0x2fa1, 0x2fa8, 0x2fb4, - 0x2fc1, 0x2fda, 0x2fe2, 0x2fee, 0x3009, 0x3025, 0x3041, 0x305d, - 0x3083, 0x30b0, 0x30c6, 0x30dd, 0x30eb, 0x30ff, 0x311e, 0x313d, - // Entry 2240 - 227F - 0x315d, 0x317e, 0x319f, 0x31bf, 0x31d0, 0x31e1, 0x31fb, 0x3214, - 0x322d, 0x3247, 0x3253, 0x326e, 0x328a, 0x32b4, 0x32df, 0x3308, - 0x332b, 0x3354, 0x337e, 0x338a, 0x33af, 0x33d4, 0x33fa, 0x3420, - 0x3445, 0x346a, 0x3490, 0x34b6, 0x34c9, 0x34dd, 0x34f0, 0x3503, - 0x3516, 0x352f, 0x3548, 0x355c, 0x356f, 0x3574, 0x357c, 0x3583, - 0x3588, 0x3592, 0x359c, 0x35a5, 0x35b1, 0x35b4, 0x35c2, 0x35d1, - 0x35dc, 0x35e6, 0x35f5, 0x3604, 0x360e, 0x3623, 0x3634, 0x363b, - 0x3653, 0x365f, 0x3670, 0x3681, 0x3689, 0x36ad, 0x36c6, 0x36e0, - // Entry 2280 - 22BF - 0x36f9, 0x3710, 0x372a, 0x3743, 0x3757, 0x3763, 0x3773, 0x3781, - 0x3789, 0x378d, 0x379b, 0x37a2, 0x37b3, 0x37c5, 0x37d6, 0x37e2, - 0x37ec, 0x37fd, 0x3809, 0x3811, 0x3823, 0x3833, 0x3843, 0x3856, - 0x3866, 0x3877, 0x388b, 0x389c, 0x38ab, 0x38be, 0x38d0, 0x38e2, - 0x38f5, 0x3907, 0x3918, 0x391f, 0x392a, 0x392f, 0x3938, 0x393f, - 0x3945, 0x394b, 0x3952, 0x3957, 0x395c, 0x3962, 0x3968, 0x396e, - 0x3971, 0x3976, 0x397b, 0x3983, 0x398e, 0x3997, 0x399f, 0x39a5, - 0x39b5, 0x39c6, 0x39d6, 0x39e8, 0x39fa, 0x3a0a, 0x3a1a, 0x3a2b, - // Entry 22C0 - 22FF - 0x3a3b, 0x3a4d, 0x3a5f, 0x3a6f, 0x3a7f, 0x3a8f, 0x3aa1, 0x3ab0, - 0x3ac0, 0x3ad0, 0x3ae2, 0x3af1, 0x3afc, 0x3b08, 0x3b13, 0x3b26, - 0x3b3c, 0x3b4b, 0x3b5d, 0x3b6d, 0x3b7e, 0x3b8f, 0x3ba9, 0x3bcd, - 0x3bf1, 0x3c15, 0x3c39, 0x3c5d, 0x3c81, 0x3ca5, 0x3ccb, 0x3ceb, - 0x3d00, 0x3d1f, 0x3d33, 0x3d44, 0x3d4e, 0x3d58, 0x3d62, 0x3d6c, - 0x3d76, 0x3d80, 0x3d9b, 0x3db5, 0x3dd6, 0x3df6, 0x3e07, 0x3e17, - 0x3e2e, 0x3e43, 0x3e59, 0x3e6f, 0x3e79, 0x3e83, 0x3e92, 0x3e98, - 0x3ea6, 0x3eba, 0x3ec0, 0x3ec7, 0x3ecd, 0x3ed1, 0x3ee0, 0x3eeb, - // Entry 2300 - 233F - 0x3ef7, 0x3f0a, 0x3f26, 0x3f41, 0x3f4d, 0x3f5e, 0x3f71, 0x3f82, - 0x3fa2, 0x3fb6, 0x3fcb, 0x3ff4, 0x4012, 0x4032, 0x4045, 0x4058, - 0x4071, 0x4080, 0x408e, 0x40aa, 0x40b0, 0x40bb, 0x40c1, 0x40c6, - 0x40cc, 0x40d0, 0x40d5, 0x40db, 0x40ec, 0x40f3, 0x40fe, 0x4106, - 0x4114, 0x411f, 0x4127, 0x4132, 0x4144, 0x4157, 0x4169, 0x417c, - 0x4190, 0x41a0, 0x41a4, 0x41b1, 0x41c7, 0x41df, 0x41f7, 0x420e, - 0x421c, 0x4228, 0x4231, 0x4235, 0x4240, 0x4257, 0x426d, 0x4273, - 0x427b, 0x429d, 0x42bb, 0x42d9, 0x42ee, 0x4303, 0x4312, 0x4334, - // Entry 2340 - 237F - 0x4345, 0x4354, 0x4384, 0x438f, 0x43a6, 0x43bd, 0x43db, 0x4406, - 0x440f, 0x4430, 0x4450, 0x4462, 0x4477, 0x4484, 0x448a, 0x4490, - 0x449d, 0x44ad, 0x44be, 0x44d7, 0x44df, 0x44f1, 0x44f9, 0x4505, - 0x450a, 0x4512, 0x4525, 0x452a, 0x4533, 0x4543, 0x4547, 0x455b, - 0x4575, 0x457e, 0x4591, 0x45bf, 0x45d4, 0x45e8, 0x45f6, 0x460a, - 0x4618, 0x462e, 0x4645, 0x464f, 0x4657, 0x465f, 0x466a, 0x4675, - 0x4681, 0x468d, 0x469f, 0x46a5, 0x46b7, 0x46c0, 0x46c9, 0x46d3, - 0x46e3, 0x46f3, 0x4709, 0x4711, 0x471f, 0x4733, 0x4744, 0x4755, - // Entry 2380 - 23BF - 0x476c, 0x4777, 0x4791, 0x47a5, 0x47b2, 0x47bf, 0x47dc, 0x47f8, - 0x481a, 0x4833, 0x484a, 0x4861, 0x4869, 0x4883, 0x4895, 0x48ab, - 0x48c2, 0x48d5, 0x48ee, 0x48fb, 0x490e, 0x491c, 0x4930, 0x4945, - 0x495d, 0x4978, 0x498e, 0x49b2, 0x49dc, 0x49f5, 0x4a0d, 0x4a25, - 0x4a49, 0x4a67, 0x4a8c, 0x4a9a, 0x4aa8, 0x4ace, 0x4af4, 0x4b1b, - 0x4b24, 0x4b3e, 0x4b55, 0x4b5c, 0x4b69, 0x4b80, 0x4ba8, 0x4bd6, - 0x4be0, 0x4bf5, 0x4c10, 0x4c36, 0x4c5c, 0x4c7d, 0x4c9e, 0x4cba, - 0x4cd6, 0x4cf5, 0x4d10, 0x4d2d, 0x4d3f, 0x4d52, 0x4d64, 0x4d95, - // Entry 23C0 - 23FF - 0x4dbf, 0x4df0, 0x4e1a, 0x4e48, 0x4e76, 0x4e99, 0x4eb8, 0x4edd, - 0x4eee, 0x4f0e, 0x4f1a, 0x4f35, 0x4f55, 0x4f76, 0x4fa0, 0x4fcb, - 0x4ff6, 0x5022, 0x5053, 0x5085, 0x50af, 0x50da, 0x5104, 0x512f, - 0x5151, 0x5174, 0x5196, 0x51b8, 0x51dc, 0x51ff, 0x5222, 0x5244, - 0x5268, 0x528c, 0x52af, 0x52d2, 0x52f6, 0x531a, 0x5340, 0x5365, - 0x538a, 0x53ae, 0x53d4, 0x53fa, 0x541f, 0x5444, 0x5471, 0x549e, - 0x54cd, 0x54fb, 0x5529, 0x5556, 0x5585, 0x55b4, 0x55e2, 0x5610, - 0x5632, 0x5641, 0x5651, 0x5664, 0x567a, 0x5690, 0x56a6, 0x56c5, - // Entry 2400 - 243F - 0x56e8, 0x5708, 0x572e, 0x5755, 0x5782, 0x5798, 0x57c0, 0x57eb, - 0x5805, 0x5836, 0x5865, 0x5881, 0x58ad, 0x58d0, 0x58f2, 0x591d, - 0x5949, 0x597a, 0x59ab, 0x59de, 0x59e8, 0x5a1b, 0x5a3f, 0x5a5f, - 0x5a7f, 0x5a9f, 0x5abf, 0x5ae5, 0x5b0b, 0x5b31, 0x5b51, 0x5b78, - 0x5b95, 0x5bb8, 0x5bd6, 0x5be7, 0x5bfe, 0x5c2c, 0x5c39, 0x5c44, - 0x5c51, 0x5c6c, 0x5c88, 0x5c9a, 0x5cba, 0x5cd4, 0x5cf7, 0x5d13, - 0x5d20, 0x5d3d, 0x5d50, 0x5d62, 0x5d80, 0x5d8c, 0x5da6, 0x5dc1, - 0x5ddb, 0x5dea, 0x5dfa, 0x5e09, 0x5e16, 0x5e25, 0x5e44, 0x5e57, - // Entry 2440 - 247F - 0x5e64, 0x5e73, 0x5e81, 0x5e9a, 0x5ebc, 0x5ed7, 0x5f06, 0x5f36, - 0x5f56, 0x5f77, 0x5f9d, 0x5fc4, 0x5fe3, 0x6003, 0x6029, 0x6050, - 0x607e, 0x60ad, 0x60d4, 0x60fc, 0x6113, 0x612c, 0x614d, 0x616a, - 0x6187, 0x619b, 0x61b0, 0x61c5, 0x61e0, 0x61fc, 0x6218, 0x6235, - 0x6253, 0x6277, 0x629c, 0x62ba, 0x62cf, 0x62e5, 0x62fb, 0x6312, - 0x6328, 0x633f, 0x6356, 0x636e, 0x6384, 0x639b, 0x63b2, 0x63ca, - 0x63e1, 0x63f9, 0x6411, 0x642a, 0x6440, 0x6457, 0x646e, 0x6486, - 0x649d, 0x64b5, 0x64cd, 0x64e6, 0x64fd, 0x6515, 0x652d, 0x6546, - // Entry 2480 - 24BF - 0x655e, 0x6577, 0x6590, 0x65aa, 0x65c0, 0x65d7, 0x65ee, 0x6606, - 0x661d, 0x6635, 0x664d, 0x6666, 0x667d, 0x6695, 0x66ad, 0x66c6, - 0x66de, 0x66f7, 0x6710, 0x672a, 0x6741, 0x6759, 0x6771, 0x678a, - 0x67a2, 0x67bb, 0x67d4, 0x67ee, 0x6806, 0x681f, 0x6838, 0x6852, - 0x686b, 0x6885, 0x689f, 0x68ba, 0x68d0, 0x68e7, 0x68fe, 0x6916, - 0x692d, 0x6945, 0x695d, 0x6976, 0x698d, 0x69a5, 0x69bd, 0x69d6, - 0x69ee, 0x6a07, 0x6a20, 0x6a3a, 0x6a51, 0x6a69, 0x6a81, 0x6a9a, - 0x6ab2, 0x6acb, 0x6ae4, 0x6afe, 0x6b16, 0x6b2f, 0x6b48, 0x6b62, - // Entry 24C0 - 24FF - 0x6b7b, 0x6b95, 0x6baf, 0x6bca, 0x6be1, 0x6bf9, 0x6c11, 0x6c2a, - 0x6c42, 0x6c5b, 0x6c74, 0x6c8e, 0x6ca6, 0x6cbf, 0x6cd8, 0x6cf2, - 0x6d0b, 0x6d25, 0x6d3f, 0x6d5a, 0x6d72, 0x6d8b, 0x6da4, 0x6dbe, - 0x6dd7, 0x6df1, 0x6e0b, 0x6e26, 0x6e3f, 0x6e59, 0x6e73, 0x6e8e, - 0x6ea8, 0x6ec3, 0x6ede, 0x6efa, 0x6f10, 0x6f27, 0x6f3e, 0x6f56, - 0x6f6d, 0x6f85, 0x6f9d, 0x6fb6, 0x6fcd, 0x6fe5, 0x6ffd, 0x7016, - 0x702e, 0x7047, 0x7060, 0x707a, 0x7091, 0x70a9, 0x70c1, 0x70da, - 0x70f2, 0x710b, 0x7124, 0x713e, 0x7156, 0x716f, 0x7188, 0x71a2, - // Entry 2500 - 253F - 0x71bb, 0x71d5, 0x71ef, 0x720a, 0x7221, 0x7239, 0x7251, 0x726a, - 0x7282, 0x729b, 0x72b4, 0x72ce, 0x72e6, 0x72ff, 0x7318, 0x7332, - 0x734b, 0x7365, 0x737f, 0x739a, 0x73b2, 0x73cb, 0x73e4, 0x73fe, - 0x7417, 0x7431, 0x744b, 0x7466, 0x747f, 0x7499, 0x74b3, 0x74ce, - 0x74e8, 0x7503, 0x751e, 0x753a, 0x7551, 0x7569, 0x7581, 0x759a, - 0x75b2, 0x75cb, 0x75e4, 0x75fe, 0x7616, 0x762f, 0x7648, 0x7662, - 0x767b, 0x7695, 0x76af, 0x76ca, 0x76e2, 0x76fb, 0x7714, 0x772e, - 0x7747, 0x7761, 0x777b, 0x7796, 0x77af, 0x77c9, 0x77e3, 0x77fe, - // Entry 2540 - 257F - 0x7818, 0x7833, 0x784e, 0x786a, 0x7882, 0x789b, 0x78b4, 0x78ce, - 0x78e7, 0x7901, 0x791b, 0x7936, 0x794f, 0x7969, 0x7983, 0x799e, - 0x79b8, 0x79d3, 0x79ee, 0x7a0a, 0x7a23, 0x7a3d, 0x7a57, 0x7a72, - 0x7a8c, 0x7aa7, 0x7ac2, 0x7ade, 0x7af8, 0x7b13, 0x7b2e, 0x7b4a, - 0x7b65, 0x7b81, 0x7b9d, 0x7bba, 0x7bea, 0x7c21, 0x7c4c, 0x7c78, - 0x7ca4, 0x7cc8, 0x7ce7, 0x7d07, 0x7d2d, 0x7d51, 0x7d65, 0x7d7b, - 0x7d96, 0x7db2, 0x7dcd, 0x7de9, 0x7e10, 0x7e31, 0x7e45, 0x7e5b, - 0x7e8a, 0x7ec0, 0x7ee5, 0x7f1f, 0x7f60, 0x7f74, 0x7f89, 0x7fa4, - // Entry 2580 - 25BF - 0x7fc0, 0x7fe0, 0x8001, 0x802a, 0x8054, 0x8073, 0x8092, 0x80ac, - 0x80c6, 0x80e0, 0x80fa, 0x811f, 0x8144, 0x8169, 0x818e, 0x81b7, - 0x81e0, 0x820a, 0x8234, 0x825e, 0x8287, 0x82b1, 0x82db, 0x82fd, - 0x832b, 0x835b, 0x838a, 0x83ba, 0x83d8, 0x83f9, 0x8414, 0x8432, - 0x8454, 0x8479, 0x84a1, 0x84cc, 0x84ed, 0x850a, 0x8536, 0x8562, - 0x858e, 0x85ae, 0x85cd, 0x85e7, 0x860c, 0x8636, 0x865a, 0x867e, - 0x86a2, 0x86c6, 0x86e8, 0x870d, 0x8733, 0x8756, 0x877b, 0x87a1, - 0x87c7, 0x87ef, 0x8816, 0x883e, 0x8863, 0x888a, 0x88b1, 0x88d9, - // Entry 25C0 - 25FF - 0x8901, 0x892b, 0x8954, 0x897e, 0x89a5, 0x89ce, 0x8a13, 0x8a58, - 0x8a9f, 0x8ae8, 0x8b2c, 0x8b74, 0x8bb8, 0x8c00, 0x8c2e, 0x8c5e, - 0x8c8d, 0x8cbe, 0x8d05, 0x8d4c, 0x8d70, 0x8d92, 0x8db7, 0x8ddb, - 0x8e00, 0x8e26, 0x8e45, 0x8e66, 0x8e89, 0x8ea6, 0x8ec4, 0x8ee2, - 0x8ef0, 0x8eff, 0x8f0b, 0x8f19, 0x8f36, 0x8f45, 0x8f5a, 0x8f72, - 0x8f8b, 0x8fa1, 0x8fb8, 0x8fd5, 0x8ff3, 0x9012, 0x9032, 0x9053, - 0x9075, 0x90a0, 0x90cf, 0x90fd, 0x9129, 0x9144, 0x9160, 0x917a, - 0x9198, 0x91bc, 0x91de, 0x91ff, 0x9221, 0x922d, 0x9241, 0x925c, - // Entry 2600 - 263F - 0x927b, 0x9298, 0x92ab, 0x92b6, 0x92d2, 0x92ec, 0x92f8, 0x9306, - 0x9319, 0x9335, 0x934d, 0x9367, 0x93a9, 0x93ea, 0x942e, 0x9471, - 0x94b3, 0x94f4, 0x9538, 0x957b, 0x958d, 0x95a3, 0x95c4, 0x95e4, - 0x9603, 0x961d, 0x9631, 0x9641, 0x9658, 0x966d, 0x96b2, 0x96cc, - 0x96f7, 0x970e, 0x9722, 0x9730, 0x9741, 0x9755, 0x977a, 0x97a9, - 0x97c6, 0x97e4, 0x97f4, 0x9808, 0x9816, 0x9828, 0x983f, 0x9855, - 0x9862, 0x9880, 0x98a2, 0x98c3, 0x98e5, 0x9900, 0x991c, 0x9928, - 0x9942, 0x995d, 0x996c, 0x997b, 0x998c, 0x999e, 0x99b6, 0x99cf, - // Entry 2640 - 267F - 0x99e2, 0x99f3, 0x9a15, 0x9a2a, 0x9a47, 0x9a53, 0x9a62, 0x9a82, - 0x9ab3, 0x9ad4, 0x9ae0, 0x9aed, 0x9b18, 0x9b44, 0x9b61, 0x9b6e, - 0x9b8a, 0x9ba6, 0x9bbf, 0x9bd8, 0x9bf2, 0x9c0c, 0x9c25, 0x9c3e, - 0x9c4a, 0x9c62, 0x9c76, 0x9c9c, 0x9ca7, 0x9cba, 0x9cc5, 0x9cd0, - 0x9cf2, 0x9d15, 0x9d19, 0x9d1d, 0x9d37, 0x9d52, 0x9d6e, 0x9d8b, - 0x9da9, 0x9dcb, 0x9de6, 0x9dfe, 0x9e15, 0x9e29, 0x9e37, 0x9e4e, - 0x9e69, 0x9e7d, 0x9e98, 0x9eb3, 0x9ec7, 0x9ee0, 0x9f12, 0x9f45, - 0x9f6c, 0x9f8c, 0x9fa8, 0x9fcf, 0x9fe7, 0xa001, 0xa014, 0xa029, - // Entry 2680 - 26BF - 0xa03f, 0xa043, 0xa05f, 0xa07c, 0xa094, 0xa0b0, 0xa0d1, 0xa0f7, - 0xa111, 0xa129, 0xa143, 0xa15f, 0xa17c, 0xa197, 0xa1b0, 0xa1cc, - 0xa1e7, 0xa204, 0xa222, 0xa239, 0xa25b, 0xa27c, 0xa2a1, 0xa2ae, - 0xa2d5, 0xa2fd, 0xa32f, 0xa353, 0xa368, 0xa37d, 0xa393, 0xa3b2, - 0xa3c2, 0xa3dc, 0xa3fd, 0xa416, 0xa42b, 0xa440, 0xa452, 0xa46b, - 0xa488, 0xa49d, 0xa4b5, 0xa4cd, 0xa4ef, 0xa511, 0xa533, 0xa563, - 0xa57b, 0xa59a, 0xa5b4, 0xa5c7, 0xa5f1, 0xa60b, 0xa624, 0xa636, - 0xa647, 0xa663, 0xa67e, 0xa68e, 0xa69f, 0xa6c1, 0xa6dd, 0xa6f8, - // Entry 26C0 - 26FF - 0xa718, 0xa737, 0xa756, 0xa76f, 0xa78f, 0xa7a6, 0xa7c4, 0xa7e3, - 0xa804, 0xa824, 0xa83e, 0xa856, 0xa887, 0xa8b8, 0xa8d5, 0xa8f4, - 0xa909, 0xa921, 0xa935, 0xa95b, 0xa97a, 0xa995, 0xa9b0, 0xa9d0, - 0xa9e2, 0xa9fe, 0xaa1c, 0xaa4e, 0xaa6d, 0xaa89, 0xaaa8, 0xaaca, - 0xaaef, 0xab0c, 0xab2c, 0xab59, 0xab89, 0xabb5, 0xabe4, 0xac16, - 0xac4a, 0xac62, 0xac7d, 0xaca3, 0xaccc, 0xace9, 0xad09, 0xad3d, - 0xad71, 0xad91, 0xadb4, 0xadde, 0xae08, 0xae3c, 0xae70, 0xaeb4, - 0xaef8, 0xaf15, 0xaf35, 0xaf62, 0xaf92, 0xafb3, 0xafd7, 0xb000, - // Entry 2700 - 273F - 0xb02c, 0xb040, 0xb057, 0xb080, 0xb0ac, 0xb0c3, 0xb0dd, 0xb102, - 0xb124, 0xb141, 0xb15a, 0xb176, 0xb1a3, 0xb1d3, 0xb1df, 0xb1ea, - 0xb202, 0xb219, 0xb235, 0xb25b, 0xb281, 0xb2a8, 0xb2cf, 0xb2e9, - 0xb303, 0xb31e, 0xb339, 0xb357, 0xb375, 0xb397, 0xb3b9, 0xb3c8, - 0xb3d7, 0xb3e6, 0xb3f7, 0xb412, 0xb42f, 0xb454, 0xb47b, 0xb49f, - 0xb4c5, 0xb4e0, 0xb4fd, 0xb51b, 0xb53b, 0xb55a, 0xb57b, 0xb597, - 0xb5b5, 0xb5d2, 0xb5f0, 0xb5fd, 0xb60c, 0xb625, 0xb640, 0xb655, - 0xb66a, 0xb67d, 0xb694, 0xb6aa, 0xb6d8, 0xb6f4, 0xb70a, 0xb722, - // Entry 2740 - 277F - 0xb729, 0xb733, 0xb742, 0xb751, 0xb75e, 0xb772, 0xb795, 0xb7b7, - 0xb7d9, 0xb802, 0xb82f, 0xb84b, 0xb866, 0xb889, 0xb899, 0xb8a7, - 0xb8bd, 0xb8dc, 0xb908, 0xb927, 0xb946, 0xb961, 0xb980, 0xb99c, - 0xb9bf, 0xb9e9, 0xb9fe, 0xba15, 0xba2f, 0xba58, 0xba84, 0xbaa2, - 0xbac4, 0xbadb, 0xbaed, 0xbb05, 0xbb1b, 0xbb31, 0xbb47, 0xbb5d, - 0xbb73, 0xbb88, 0xbb9b, 0xbbb0, 0xbbc6, 0xbbdc, 0xbbf2, 0xbc08, - 0xbc1e, 0xbc31, 0xbc54, 0xbc75, 0xbc97, 0xbcb7, 0xbcd1, 0xbcee, - 0xbd19, 0xbd43, 0xbd5f, 0xbd7c, 0xbd97, 0xbdb5, 0xbdc2, 0xbdd4, - // Entry 2780 - 27BF - 0xbde6, 0xbdfd, 0xbe14, 0xbe22, 0xbe30, 0xbe3d, 0xbe4a, 0xbe62, - 0xbe74, 0xbe88, 0xbe9c, 0xbeb0, 0xbec4, 0xbed7, 0xbeea, 0xbefd, - 0xbf15, 0xbf2d, 0xbf43, 0xbf59, 0xbf75, 0xbf8b, 0xbfa7, 0xbfc4, - 0xbff3, 0xc029, 0xc04c, 0xc072, 0xc092, 0xc0c0, 0xc0f5, 0xc119, - 0xc152, 0xc192, 0xc1ab, 0xc1cc, 0xc1ed, 0xc219, 0xc246, 0xc26b, - 0xc28c, 0xc2a5, 0xc2bf, 0xc2ec, 0xc31a, 0xc33e, 0xc363, 0xc38f, - 0xc3bc, 0xc3e2, 0xc3fb, 0xc418, 0xc429, 0xc439, 0xc449, 0xc466, - 0xc483, 0xc495, 0xc4b0, 0xc4cf, 0xc4db, 0xc4f0, 0xc514, 0xc53c, - // Entry 27C0 - 27FF - 0xc564, 0xc590, 0xc5bd, 0xc5f0, 0xc60f, 0xc62c, 0xc64c, 0xc66b, - 0xc68b, 0xc6a8, 0xc6c8, 0xc6e8, 0xc708, 0xc728, 0xc74e, 0xc772, - 0xc799, 0xc7bf, 0xc7ea, 0xc819, 0xc83f, 0xc863, 0xc88a, 0xc8b0, - 0x00b0, 0x00d7, 0x00fe, 0x0125, 0x014c, 0x0189, 0x01c4, 0x0202, - 0x023f, 0x0251, 0x0261, 0x02a6, 0x02f0, 0x0335, 0x037f, 0x03a6, - 0x03cb, 0x03f3, 0x041a, 0x043d, 0x045e, 0x0482, 0x04a5, 0x04d7, - 0x050a, 0x053b, 0x056b, 0x0576, 0x0582, 0x058e, 0x059b, 0x05c4, - 0x05da, 0x01da, 0x020d, 0x0240, 0x0274, 0x02a8, 0x02cd, 0x02f0, - // Entry 2800 - 283F - 0x0316, 0x033b, 0x0372, 0x03aa, 0x03df, 0x0415, 0x044a, 0x0480, - 0x04b7, 0x04ef, 0x0519, 0x0544, 0x056c, 0x0595, 0x05bd, 0x05e6, - 0x0610, 0x063b, 0x0651, 0x0668, 0x067c, 0x0691, 0x06a5, 0x06ba, - 0x06d0, 0x06e7, 0x0717, 0x0736, 0x0336, 0x034d, 0x0356, 0x0364, - 0x0378, 0x038d, 0x03a2, 0x03ba, 0x03c7, 0x03f0, 0x041b, 0x0446, - 0x0472, 0x0072, 0x0087, 0x009f, 0x00bc, 0x00e1, 0x00f8, 0x0117, - 0x0130, 0x0140, 0x0140, 0x0173, 0x01a4, 0x01d8, 0x020b, 0x020b, - 0x0228, 0x0246, 0x0264, 0x0285, 0x02a4, 0x02c3, 0x02e4, 0x0303, - // Entry 2840 - 287F - 0x0323, 0x0341, 0x0367, 0x0382, 0x03a2, 0x03c0, 0x03e1, 0x0402, - 0x0421, 0x043e, 0x045e, 0x047d, 0x049c, 0x04bc, 0x04d9, 0x04f8, - 0x0516, 0x0533, 0x054f, 0x056d, 0x058a, 0x05aa, 0x05c7, 0x05e5, - 0x0603, 0x0621, 0x0645, 0x0661, 0x0684, 0x06b1, 0x06cd, 0x06f8, - 0x0719, 0x0742, 0x0760, 0x0781, 0x07a2, 0x07c8, 0x07f2, 0x03f2, - 0x040d, 0x0429, 0x0445, 0x0464, 0x0481, 0x049e, 0x04bd, 0x04da, - 0x04f8, 0x0514, 0x0538, 0x0551, 0x056f, 0x058b, 0x05aa, 0x05c9, - 0x05e6, 0x0601, 0x061f, 0x063c, 0x0659, 0x0677, 0x0692, 0x06af, - // Entry 2880 - 28BF - 0x06cb, 0x06e6, 0x0700, 0x071c, 0x0737, 0x0755, 0x0770, 0x078c, - 0x07a8, 0x07c4, 0x07e6, 0x0800, 0x0821, 0x084c, 0x0866, 0x088f, - 0x08ae, 0x08d5, 0x08f1, 0x0910, 0x092f, 0x0953, 0x097b, 0x017b, - 0x01a1, 0x01c5, 0x01ed, 0x020f, 0x022f, 0x024f, 0x0278, 0x029d, - 0x02c0, 0x02e5, 0x0308, 0x032d, 0x0350, 0x036a, 0x038a, 0x03a7, - 0x03c8, 0x03ec, 0x040c, 0x042a, 0x0448, 0x0463, 0x047c, 0x049b, - 0x04ba, 0x04df, 0x0508, 0x052b, 0x0549, 0x0562, 0x0588, 0x05ae, - 0x05c8, 0x05e0, 0x05fa, 0x0612, 0x062d, 0x0646, 0x0661, 0x067a, - // Entry 28C0 - 28FF - 0x0693, 0x06aa, 0x06c3, 0x06da, 0x06f4, 0x070c, 0x0726, 0x073e, - 0x075a, 0x0774, 0x078f, 0x07a8, 0x07c2, 0x07da, 0x07f5, 0x080e, - 0x0826, 0x083c, 0x0854, 0x086a, 0x0883, 0x089a, 0x08b1, 0x08c6, - 0x08de, 0x08f4, 0x090c, 0x0922, 0x093c, 0x0954, 0x096d, 0x0984, - 0x099c, 0x09b2, 0x09ca, 0x09e0, 0x09f9, 0x0a10, 0x0a29, 0x0a40, - 0x0a59, 0x0a70, 0x0a94, 0x0ab6, 0x0ada, 0x0afc, 0x0b23, 0x0b48, - 0x0b6c, 0x0b8e, 0x0bb0, 0x0bd0, 0x0bf6, 0x0c1a, 0x0c3e, 0x0c60, - 0x0c7b, 0x0c94, 0x0cb6, 0x0cd6, 0x0cfb, 0x0d1e, 0x0d42, 0x0d64, - // Entry 2900 - 293F - 0x0d87, 0x0da8, 0x0dcc, 0x0dee, 0x0e13, 0x0e36, 0x0e59, 0x0e7a, - 0x0e9b, 0x0eba, 0x0ede, 0x0f00, 0x0f24, 0x0f46, 0x0f6d, 0x0f92, - 0x0fb6, 0x0fd8, 0x0ffe, 0x1022, 0x1048, 0x106c, 0x1090, 0x10b2, - 0x10d6, 0x10f8, 0x111c, 0x113e, 0x114f, 0x1162, 0x1175, 0x118a, - 0x119e, 0x11b2, 0x11ca, 0x11f2, 0x1218, 0x1242, 0x126a, 0x1283, - 0x12a2, 0x12c1, 0x12e4, 0x1305, 0x0305, 0x0320, 0x0346, 0x036e, - 0x038d, 0x03a5, 0x03b5, 0x03d1, 0x03e9, 0x0402, 0x041b, 0x0434, - 0x044c, 0x0465, 0x047e, 0x0497, 0x04af, 0x04c8, 0x04e1, 0x04fa, - // Entry 2940 - 297F - 0x0513, 0x052b, 0x0544, 0x055e, 0x0577, 0x0590, 0x05a9, 0x05c1, - 0x05db, 0x05f5, 0x060f, 0x0628, 0x0642, 0x065c, 0x0675, 0x068e, - 0x06a7, 0x06c1, 0x06da, 0x06f4, 0x070d, 0x0725, 0x073e, 0x0756, - 0x076f, 0x0788, 0x0388, 0x03a0, 0x03a0, 0x03b9, 0x03b9, 0x03cb, - 0x03de, 0x03f2, 0x0405, 0x041a, 0x043c, 0x044f, 0x0462, 0x0476, - 0x048a, 0x049f, 0x04b2, 0x04c5, 0x04d8, 0x04f2, 0x0507, 0x051a, - 0x053c, 0x0556, 0x056a, 0x057d, 0x0591, 0x05ac, 0x05bf, 0x05d9, - 0x05eb, 0x05ff, 0x061b, 0x0636, 0x0649, 0x065c, 0x066f, 0x068a, - // Entry 2980 - 29BF - 0x06a5, 0x06b8, 0x06ca, 0x06dd, 0x06f1, 0x0705, 0x0720, 0x0739, - 0x074c, 0x0760, 0x0774, 0x0787, 0x079b, 0x07af, 0x07c3, 0x07d6, - 0x07e9, 0x07fc, 0x080f, 0x082d, 0x0841, 0x0853, 0x0865, 0x0065, - 0x0090, 0x00a7, 0x00a7, 0x00c0, 0x00d5, 0x00ea, 0x00ff, 0x0114, - 0x012a, 0x013f, 0x0154, 0x0169, 0x017e, 0x0194, 0x01b0, 0x01c5, - 0x01da, 0x01f0, 0x0205, 0x021b, 0x0231, 0x0247, 0x025c, 0x0272, - 0x0288, 0x029f, 0x02b5, 0x02b5, 0x02ca, 0x02df, 0x02f4, 0x030a, - 0x0320, 0x0335, 0x034a, 0x034a, 0x035f, 0x0374, 0x0389, 0x039f, - // Entry 29C0 - 29FF - 0x03b5, 0x03ca, 0x03df, 0x03df, 0x03f4, 0x0409, 0x041e, 0x0434, - 0x044a, 0x045f, 0x0474, 0x0074, 0x008a, 0x00a0, 0x00b6, 0x00cd, - 0x00e4, 0x00fa, 0x0110, 0x0110, 0x0125, 0x013a, 0x014f, 0x0165, - 0x017b, 0x0190, 0x01a5, 0x01a5, 0x01ba, 0x01cf, 0x01e4, 0x01fa, - 0x0210, 0x0225, 0x023a, 0x023a, 0x024f, 0x0264, 0x0279, 0x028f, - 0x02a5, 0x02ba, 0x02cf, 0x02cf, 0x02e4, 0x02f9, 0x030e, 0x0324, - 0x033a, 0x034f, 0x0364, 0x0364, 0x0380, 0x039c, 0x03b9, 0x03d5, - 0x03f2, 0x040e, 0x042a, 0x0446, 0x0462, 0x047e, 0x0499, 0x04b5, - // Entry 2A00 - 2A3F - 0x04d1, 0x04ed, 0x0509, 0x0525, 0x0542, 0x055f, 0x057c, 0x059b, - 0x05b9, 0x05d8, 0x05f3, 0x060f, 0x062e, 0x0654, 0x0671, 0x068d, - 0x06b1, 0x06d5, 0x06f6, 0x0720, 0x073f, 0x0765, 0x077e, 0x0798, - 0x07b8, 0x07d9, 0x07f4, 0x0816, 0x0831, 0x084b, 0x0866, 0x0873, - 0x088f, 0x08ac, 0x08bd, 0x08c8, 0x08da, 0x08f5, 0x0901, 0x090e, - 0x091e, 0x092c, 0x0947, 0x095c, 0x0970, 0x097b, 0x0990, 0x09a5, - 0x09c0, 0x09dc, 0x09f0, 0x0a04, 0x0a20, 0x0a3d, 0x0a52, 0x0a68, - 0x0a80, 0x0a99, 0x0ab0, 0x0ac8, 0x0adf, 0x0af7, 0x0b18, 0x0b39, - // Entry 2A40 - 2A7F - 0x0b55, 0x0b62, 0x0b78, 0x0b86, 0x0b90, 0x0ba9, 0x0bb5, 0x0bbf, - 0x0bcb, 0x0bdb, 0x0bf1, 0x0c08, 0x0c15, 0x0c2a, 0x0c35, 0x0c42, - 0x0c58, 0x0c69, 0x0c7d, 0x0c86, 0x0c93, 0x0ca1, 0x0cc5, 0x0cda, - 0x0cf0, 0x00f0, 0x0102, 0x0113, 0x0129, 0x013f, 0x0157, 0x0169, - 0x0178, 0x0189, 0x019e, 0x01b3, 0x01c9, 0x01d9, 0x01ee, 0x0203, - 0x0217, 0x022b, 0x0241, 0x0256, 0x0267, 0x0279, 0x028e, 0x02a3, - 0x02b8, 0x02cd, 0x02dd, 0x02ec, 0x02ec, 0x02fd, 0x030c, 0x031c, - 0x032d, 0x033f, 0x0353, 0x0368, 0x037d, 0x038d, 0x03a0, 0x03b3, - // Entry 2A80 - 2ABF - 0x03d9, 0x03e8, 0x03f7, 0x0407, 0x0420, 0x042f, 0x0445, 0x045b, - 0x046d, 0x047d, 0x049a, 0x04ad, 0x04c0, 0x04d5, 0x04e9, 0x04f9, - 0x050a, 0x0519, 0x0528, 0x0537, 0x054c, 0x0561, 0x0571, 0x0583, - 0x0598, 0x05ad, 0x05c4, 0x05d5, 0x05e8, 0x05fc, 0x0610, 0x062c, - 0x0647, 0x0657, 0x0676, 0x0694, 0x06a4, 0x06c1, 0x06dc, 0x06f0, - 0x0704, 0x0714, 0x0731, 0x0745, 0x0759, 0x0776, 0x0793, 0x07a8, - 0x07bd, 0x07cd, 0x07dd, 0x0804, 0x0821, 0x083e, 0x085a, 0x086d, - 0x0880, 0x0895, 0x08b1, 0x08c1, 0x08df, 0x08ef, 0x0900, 0x091d, - // Entry 2AC0 - 2AFF - 0x093a, 0x0957, 0x0973, 0x0990, 0x09ad, 0x09ca, 0x09e7, 0x0a05, - 0x0a23, 0x0a42, 0x0a61, 0x0a73, 0x0a92, 0x0ab1, 0x02b1, 0x02c3, - 0x02d6, 0x02e8, 0x02fc, 0x0311, 0x0324, 0x0336, 0x0348, 0x035a, - 0x036d, 0x0381, 0x0395, 0x03ac, 0x03c0, 0x03d2, 0x03e6, 0x03fd, - 0x0411, 0x0425, 0x0438, 0x044c, 0x0469, 0x0488, 0x049a, 0x04b3, - 0x04c6, 0x04da, 0x04f0, 0x0504, 0x0518, 0x0530, 0x0544, 0x055a, - 0x056b, 0x0583, 0x0599, 0x05ab, 0x05bf, 0x05d3, 0x05e6, 0x05f9, - 0x060d, 0x0620, 0x0635, 0x064a, 0x0661, 0x0675, 0x0688, 0x069e, - // Entry 2B00 - 2B3F - 0x06b3, 0x06c5, 0x06e0, 0x06fb, 0x0715, 0x072d, 0x0741, 0x0753, - 0x0767, 0x077d, 0x0790, 0x07a4, 0x07ba, 0x07cd, 0x07e0, 0x07f5, - 0x0807, 0x081c, 0x0831, 0x0843, 0x0858, 0x086a, 0x087c, 0x088e, - 0x08a1, 0x08b4, 0x08c7, 0x08da, 0x08ee, 0x0903, 0x0918, 0x092e, - 0x0940, 0x0953, 0x0967, 0x097b, 0x098e, 0x09a1, 0x09b6, 0x09cd, - 0x09eb, 0x09ff, 0x0a12, 0x0a24, 0x0a36, 0x0a4d, 0x0a60, 0x0a74, - 0x0a87, 0x0a9b, 0x0aae, 0x0ac0, 0x0ad4, 0x0af0, 0x0b07, 0x0b21, - 0x0b35, 0x0b48, 0x0b5b, 0x0b6d, 0x0b81, 0x0b95, 0x0ba9, 0x0bbe, - // Entry 2B40 - 2B7F - 0x0bd2, 0x0be6, 0x0bf9, 0x0c0d, 0x0c22, 0x0c35, 0x0c48, 0x0c5a, - 0x0c6c, 0x0c80, 0x0c96, 0x0ca8, 0x0cba, 0x0ccd, 0x0cdf, 0x0cf3, - 0x0d06, 0x0d1d, 0x0d30, 0x0d45, 0x0d5a, 0x0d6f, 0x0d84, 0x0d97, - 0x0dae, 0x0dc2, 0x0dd6, 0x0dea, 0x0dff, 0x0e13, 0x0e30, 0x0e46, - 0x0e59, 0x0e6b, 0x0e7e, 0x0e93, 0x0ea8, 0x0ebb, 0x0ecd, 0x0ee2, - 0x0ef6, 0x0f08, 0x0f1a, 0x0f2d, 0x0f40, 0x0f53, 0x0f68, 0x0f7e, - 0x0f91, 0x0fa4, 0x0fb7, 0x0fd1, 0x0fe7, 0x0ffa, 0x100d, 0x1020, - 0x1034, 0x1048, 0x1068, 0x107b, 0x108e, 0x10a2, 0x10b5, 0x10cb, - // Entry 2B80 - 2BBF - 0x10e8, 0x10fb, 0x110f, 0x1122, 0x1135, 0x1147, 0x1159, 0x116c, - 0x1183, 0x1197, 0x11aa, 0x11bd, 0x11d0, 0x11e4, 0x1203, 0x121a, - 0x122e, 0x1241, 0x1254, 0x1267, 0x127a, 0x128e, 0x12a1, 0x12b6, - 0x12cb, 0x12df, 0x12f8, 0x130b, 0x1320, 0x1333, 0x1345, 0x1358, - 0x136b, 0x137f, 0x1394, 0x13a9, 0x13bd, 0x03bd, 0x03ec, 0x041c, - 0x0456, 0x0491, 0x04c0, 0x04f5, 0x052a, 0x055e, 0x0598, 0x05d3, - 0x060d, 0x0637, 0x0237, 0x0248, 0x0259, 0x026e, 0x0278, 0x029b, - 0x02b5, 0x02cd, 0x02e4, 0x02f6, 0x0309, 0x0322, 0x033c, 0x034f, - // Entry 2BC0 - 2BFF - 0x0363, 0x037c, 0x0396, 0x03b3, 0x03d1, 0x03dc, 0x03e5, 0x0400, - 0x041c, 0x0439, 0x0457, 0x0478, 0x049a, 0x04b3, 0x04cd, 0x04d6, - 0x04fa, 0x0515, 0x0534, 0x0544, 0x0558, 0x056c, 0x0582, 0x0597, - 0x05ac, 0x05c0, 0x05d6, 0x05ec, 0x0601, 0x061c, 0x0638, 0x0657, - 0x0675, 0x0690, 0x06ab, 0x06b4, 0x06cd, 0x06f8, 0x071c, 0x0752, - 0x0776, 0x0789, 0x07b9, 0x07cd, 0x07e4, 0x07fb, 0x081e, 0x0827, - 0x083c, 0x085b, 0x0876, 0x0076, 0x008d, 0x009e, 0x00b5, 0x00c6, - 0x00dd, 0x00ee, 0x0105, 0x0116, 0x012d, 0x013e, 0x0150, 0x0162, - // Entry 2C00 - 2C3F - 0x0174, 0x0186, 0x0198, 0x01aa, 0x01bc, 0x01ce, 0x01e0, 0x01f2, - 0x0204, 0x0216, 0x0228, 0x023a, 0x024c, 0x025e, 0x0270, 0x0282, - 0x0294, 0x02a6, 0x02b8, 0x02ca, 0x02dc, 0x02ee, 0x0306, 0x0318, - 0x032a, 0x033c, 0x034e, 0x0360, 0x0372, 0x0384, 0x0396, 0x03a8, - 0x03ba, 0x03cc, 0x03de, 0x03f0, 0x0402, 0x0414, 0x0426, 0x0438, - 0x044a, 0x045c, 0x046e, 0x0480, 0x0492, 0x04a4, 0x04b6, 0x04c8, - 0x04da, 0x04ec, 0x04fe, 0x0510, 0x0522, 0x0534, 0x054c, 0x055e, - 0x0576, 0x0588, 0x05a0, 0x05b2, 0x05c4, 0x05d6, 0x05e8, 0x05fa, - // Entry 2C40 - 2C7F - 0x060c, 0x0624, 0x0636, 0x0648, 0x065a, 0x066c, 0x067d, 0x068f, - 0x06a7, 0x06bf, 0x02bf, 0x02ec, 0x031e, 0x0341, 0x0369, 0x0380, - 0x039e, 0x03b3, 0x03d2, 0x03e9, 0x03fa, 0x0411, 0x0422, 0x0439, - 0x044a, 0x0461, 0x0472, 0x0489, 0x049a, 0x04ac, 0x04be, 0x04d0, - 0x04e2, 0x04f4, 0x0506, 0x0518, 0x052a, 0x053c, 0x054e, 0x0560, - 0x0572, 0x0584, 0x0596, 0x05a8, 0x05ba, 0x05cc, 0x05de, 0x05f0, - 0x0602, 0x0614, 0x0626, 0x0638, 0x064a, 0x0662, 0x0674, 0x0686, - 0x0698, 0x06aa, 0x06bc, 0x06ce, 0x06e0, 0x06f2, 0x0704, 0x0716, - // Entry 2C80 - 2CBF - 0x0728, 0x073a, 0x074c, 0x075e, 0x0770, 0x0782, 0x0794, 0x07a6, - 0x07b8, 0x07ca, 0x07dc, 0x07ee, 0x0800, 0x0812, 0x0824, 0x0836, - 0x0848, 0x085a, 0x086c, 0x087e, 0x0890, 0x08a8, 0x08ba, 0x08d2, - 0x08e4, 0x08fc, 0x090e, 0x0920, 0x0932, 0x0944, 0x0956, 0x0968, - 0x0980, 0x0992, 0x09a4, 0x09b6, 0x09c8, 0x09d9, 0x09eb, 0x0a03, - 0x0a1b, 0x0a2d, 0x0a3f, 0x0a51, 0x0a63, 0x0a76, 0x0a9c, 0x0ab3, - 0x0ad1, 0x0ae6, 0x02e6, 0x02f7, 0x0308, 0x0319, 0x032a, 0x033b, - 0x034c, 0x035d, 0x036e, 0x037f, 0x0390, 0x03a1, 0x03b2, 0x03c3, - // Entry 2CC0 - 2CFF - 0x03d4, 0x03e6, 0x03f8, 0x040a, 0x041b, 0x042c, 0x043d, 0x044e, - 0x045f, 0x0470, 0x0481, 0x0493, 0x04a5, 0x04b7, 0x04c9, 0x04db, - 0x04ed, 0x04ff, 0x0512, 0x0525, 0x0537, 0x0548, 0x0559, 0x056b, - 0x057c, 0x058e, 0x05a0, 0x05b2, 0x01b2, 0x01c6, 0x01df, 0x01f8, - 0x020b, 0x0224, 0x023d, 0x0251, 0x026a, 0x027d, 0x0297, 0x02b0, - 0x02c9, 0x02e1, 0x02fc, 0x0317, 0x0330, 0x0343, 0x0356, 0x036e, - 0x0386, 0x0398, 0x03af, 0x03c2, 0x03d5, 0x03ed, 0x0402, 0x0417, - 0x042c, 0x0441, 0x0454, 0x0463, 0x0473, 0x0483, 0x0494, 0x04a4, - // Entry 2D00 - 2D3F - 0x04b3, 0x04c4, 0x04d4, 0x04e3, 0x04f3, 0x0504, 0x0514, 0x0524, - 0x0533, 0x0544, 0x0554, 0x0564, 0x0574, 0x0584, 0x0594, 0x05a3, - 0x05b0, 0x05c8, 0x05e2, 0x05fa, 0x0615, 0x0634, 0x064e, 0x066c, - 0x0687, 0x06a6, 0x06bf, 0x06d7, 0x06f2, 0x070d, 0x0727, 0x0741, - 0x0760, 0x077f, 0x0798, 0x07b3, 0x07ce, 0x07ee, 0x0807, 0x081f, - 0x0838, 0x0850, 0x0868, 0x087d, 0x0895, 0x08ab, 0x08c6, 0x08e4, - 0x0901, 0x0919, 0x0932, 0x0945, 0x0959, 0x096b, 0x097f, 0x0992, - 0x09a4, 0x09b7, 0x09cb, 0x01cb, 0x01ee, 0x0211, 0x0230, 0x024f, - // Entry 2D40 - 2D7F - 0x0270, 0x0290, 0x02af, 0x02d1, 0x02f3, 0x0314, 0x0336, 0x0357, - 0x0379, 0x039b, 0x03bc, 0x03db, 0x03ed, 0x03ff, 0x0411, 0x0423, - 0x0435, 0x0448, 0x045a, 0x046d, 0x047f, 0x0492, 0x04a5, 0x04b8, - 0x04ca, 0x04dd, 0x04f1, 0x0505, 0x0517, 0x0529, 0x053c, 0x0550, - 0x0567, 0x057e, 0x0595, 0x05ac, 0x05be, 0x05d0, 0x05e2, 0x01e2, - 0x01ee, 0x01fb, 0x0208, 0x0216, 0x0223, 0x0231, 0x023f, 0x024c, - 0x025b, 0x026a, 0x0278, 0x0287, 0x0296, 0x02a4, 0x02b3, 0x02bf, - 0x02cb, 0x02d7, 0x02e3, 0x02f0, 0x02fc, 0x0309, 0x0316, 0x0323, - // Entry 2D80 - 2DBF - 0x0331, 0x033e, 0x034b, 0x0358, 0x0365, 0x0372, 0x0380, 0x038e, - 0x039d, 0x03ad, 0x03ba, 0x03c6, 0x03c6, 0x03de, 0x03f6, 0x040e, - 0x0426, 0x043e, 0x0456, 0x046e, 0x0486, 0x049e, 0x04b6, 0x04ce, - 0x04e6, 0x04fe, 0x0516, 0x052e, 0x0546, 0x0561, 0x057b, 0x0596, - 0x05b0, 0x05ca, 0x05e4, 0x05fd, 0x0617, 0x0631, 0x064d, 0x0669, - 0x0685, 0x06a1, 0x06bb, 0x06d8, 0x06f4, 0x0711, 0x072d, 0x0749, - 0x0765, 0x0780, 0x079c, 0x07b8, 0x07d6, 0x07f4, 0x0812, 0x0830, - 0x084c, 0x0868, 0x088c, 0x08af, 0x00af, 0x00ca, 0x00e5, 0x0102, - // Entry 2DC0 - 2DFF - 0x011e, 0x013a, 0x0155, 0x0172, 0x018f, 0x01ab, 0x01c6, 0x01e2, - 0x01fe, 0x021b, 0x0237, 0x0254, 0x0271, 0x028c, 0x02a9, 0x02c5, - 0x02e4, 0x0300, 0x031f, 0x0340, 0x0366, 0x0383, 0x03a4, 0x03c0, - 0x03dd, 0x03fe, 0x0420, 0x0440, 0x0460, 0x0480, 0x049c, 0x04b8, - 0x04d5, 0x04ef, 0x050d, 0x0525, 0x053b, 0x055d, 0x0582, 0x05a7, - 0x05cb, 0x05ef, 0x0613, 0x0639, 0x065e, 0x066e, 0x0687, 0x06a0, - 0x06bb, 0x06d5, 0x06ef, 0x0708, 0x0723, 0x073e, 0x0758, 0x076d, - 0x0786, 0x079f, 0x07ba, 0x07d4, 0x07ee, 0x0803, 0x0817, 0x082c, - // Entry 2E00 - 2E3F - 0x0840, 0x0854, 0x0868, 0x087b, 0x088f, 0x08a3, 0x08b9, 0x08cf, - 0x08e5, 0x08fb, 0x090f, 0x0926, 0x093c, 0x0953, 0x0969, 0x097f, - 0x0995, 0x09aa, 0x09c0, 0x09d6, 0x09ee, 0x0a06, 0x0a1e, 0x0a36, - 0x0a4c, 0x0a6b, 0x0a89, 0x0a9f, 0x0ab5, 0x0aca, 0x0adf, 0x0af6, - 0x0b0c, 0x0b22, 0x0b37, 0x0b4e, 0x0b65, 0x0b7b, 0x0b90, 0x0ba6, - 0x0bbc, 0x0bd3, 0x0be9, 0x0c00, 0x0c17, 0x0c2c, 0x0c43, 0x0c59, - 0x0c72, 0x0c88, 0x0ca1, 0x0cbc, 0x0cdc, 0x0cf3, 0x0d0b, 0x0d21, - 0x0d39, 0x0d53, 0x0d6e, 0x0d85, 0x0da0, 0x0db6, 0x0dcc, 0x0de2, - // Entry 2E40 - 2E7F - 0x0dfb, 0x0e11, 0x0e29, 0x0e3e, 0x0e54, 0x0e6b, 0x0e85, 0x0e9f, - 0x0eb6, 0x0ed1, 0x0eed, 0x0f07, 0x0f21, 0x0f38, 0x0f51, 0x0f6c, - 0x0f87, 0x0fa1, 0x0fb5, 0x0fcd, 0x0fe5, 0x0fff, 0x1018, 0x1031, - 0x1049, 0x1063, 0x107d, 0x1096, 0x10aa, 0x10d2, 0x10fb, 0x1121, - 0x1147, 0x116b, 0x1190, 0x11b5, 0x11dc, 0x1206, 0x122e, 0x1257, - 0x1280, 0x1289, 0x1293, 0x129c, 0x12b2, 0x12c4, 0x12d6, 0x12e8, - 0x12fa, 0x130c, 0x131f, 0x1332, 0x1345, 0x1358, 0x136b, 0x137e, - 0x1391, 0x13a4, 0x13b7, 0x13ca, 0x13dd, 0x13f0, 0x1403, 0x1416, - // Entry 2E80 - 2EBF - 0x1429, 0x143c, 0x144f, 0x1462, 0x1475, 0x1488, 0x149b, 0x14ae, - 0x14c1, 0x14d4, 0x14e7, 0x14fa, 0x150d, 0x1520, 0x1533, 0x1546, - 0x1559, 0x156c, 0x157f, 0x1592, 0x15a5, 0x15b8, 0x15cb, 0x15de, - 0x15f1, 0x1604, 0x1617, 0x162a, 0x022a, 0x0237, 0x0244, 0x0250, - 0x025b, 0x0268, 0x0273, 0x027d, 0x028c, 0x0298, 0x02a3, 0x02ae, - 0x02ba, 0x02c8, 0x02d6, 0x02e2, 0x02ee, 0x02f9, 0x0305, 0x0312, - 0x0320, 0x032b, 0x033c, 0x034e, 0x035e, 0x036b, 0x037b, 0x038b, - 0x0399, 0x03a5, 0x03b2, 0x03be, 0x03cc, 0x03db, 0x03e9, 0x03f5, - // Entry 2EC0 - 2EFF - 0x0401, 0x040d, 0x0418, 0x0423, 0x042d, 0x0438, 0x0444, 0x0450, - 0x045f, 0x046b, 0x0479, 0x0489, 0x0496, 0x04a1, 0x04ac, 0x04bb, - 0x04c8, 0x04d7, 0x04e3, 0x04f3, 0x04fe, 0x050b, 0x0518, 0x0524, - 0x0530, 0x053c, 0x0549, 0x0556, 0x0560, 0x056c, 0x0578, 0x0583, - 0x0591, 0x059d, 0x05a9, 0x05b6, 0x05c4, 0x05d2, 0x05dd, 0x05ed, - 0x05f8, 0x0606, 0x0614, 0x0620, 0x062c, 0x0637, 0x0645, 0x0650, - 0x065c, 0x066a, 0x0675, 0x0684, 0x0690, 0x06ba, 0x06e3, 0x070c, - 0x0737, 0x0761, 0x078b, 0x07b4, 0x07df, 0x080a, 0x0834, 0x085d, - // Entry 2F00 - 2F3F - 0x0889, 0x08b5, 0x08e3, 0x0911, 0x093e, 0x096b, 0x099a, 0x09c8, - 0x09f6, 0x0a22, 0x0a52, 0x0a82, 0x0ab4, 0x0ae5, 0x0aef, 0x0af8, - 0x0b01, 0x0b0b, 0x0b14, 0x0b1d, 0x0b26, 0x0b37, 0x0b46, 0x0b4f, - 0x0b65, 0x0b7b, 0x0b92, 0x0ba7, 0x0bb9, 0x0bc7, 0x0bd0, 0x0bdb, - 0x0be4, 0x0bed, 0x0bf6, 0x0bff, 0x0c08, 0x0c12, 0x0c1d, 0x0c26, - 0x0c2f, 0x0c3a, 0x0c45, 0x0c4e, 0x0c57, 0x0c60, 0x0c6a, 0x0c74, - 0x0c7e, 0x0c88, 0x0c93, 0x0c9c, 0x0ca5, 0x0cae, 0x0cb7, 0x0cc0, - 0x0ccb, 0x0cd4, 0x0cdd, 0x0ce6, 0x0cf7, 0x0d08, 0x0d18, 0x0d29, - // Entry 2F40 - 2F7F - 0x0d38, 0x0d47, 0x0d55, 0x0d64, 0x0d73, 0x0d8a, 0x0d93, 0x0d9d, - 0x0da7, 0x0db1, 0x0dbb, 0x0dcc, 0x0de5, 0x0dee, 0x0df7, 0x0e02, - 0x0e0b, 0x0e14, 0x0e1d, 0x0e28, 0x0e31, 0x0e3a, 0x0e48, 0x0e51, - 0x0e5a, 0x0e65, 0x0e6e, 0x0e77, 0x0e85, 0x0e91, 0x0e9d, 0x0ea6, - 0x0eaf, 0x0eb8, 0x0ec1, 0x0ed1, 0x0eda, 0x0ee3, 0x0eec, 0x0ef5, - 0x0efe, 0x0f07, 0x0f10, 0x0f21, 0x0f2a, 0x0f33, 0x0f3c, 0x0f46, - 0x0f4f, 0x0f5e, 0x0f68, 0x0f72, 0x0f7b, 0x0f84, 0x0f8e, 0x0f97, - 0x0fa0, 0x0fa9, 0x0fb2, 0x0fc1, 0x0fd0, 0x0ff8, 0x1020, 0x104a, - // Entry 2F80 - 2FBF - 0x1073, 0x109c, 0x10c4, 0x10ee, 0x1118, 0x1141, 0x1169, 0x1194, - 0x11bf, 0x11ec, 0x1219, 0x1245, 0x1271, 0x129f, 0x12cc, 0x12f9, - 0x1324, 0x1353, 0x1382, 0x13b3, 0x13e3, 0x1413, 0x1442, 0x1473, - 0x14a4, 0x14d4, 0x14ff, 0x152e, 0x1538, 0x0138, 0x0158, 0x0178, - 0x01a0, 0x01bb, 0x01cf, 0x01e4, 0x01f9, 0x0216, 0x022f, 0x0244, - 0x0256, 0x026d, 0x0284, 0x02a1, 0x02b5, 0x02cc, 0x02e2, 0x0302, - 0x0317, 0x0331, 0x034c, 0x035e, 0x037a, 0x038d, 0x03a3, 0x03bc, - 0x03d6, 0x03f6, 0x0414, 0x0432, 0x0448, 0x045d, 0x0471, 0x0489, - // Entry 2FC0 - 2FFF - 0x049e, 0x04c1, 0x04d8, 0x04ef, 0x0507, 0x051f, 0x0534, 0x0549, - 0x0562, 0x057d, 0x059c, 0x05b7, 0x05ce, 0x05e3, 0x05fa, 0x0613, - 0x0634, 0x065b, 0x0673, 0x0693, 0x06a9, 0x06c2, 0x06de, 0x06fa, - 0x0711, 0x0728, 0x0740, 0x0760, 0x077d, 0x079b, 0x039b, 0x03a9, - 0x03b7, 0x03c4, 0x03d2, 0x03e1, 0x03f0, 0x03fe, 0x040d, 0x041b, - 0x0429, 0x0436, 0x0444, 0x0453, 0x0461, 0x0470, 0x047e, 0x048c, - 0x0499, 0x04a7, 0x04b5, 0x04c2, 0x04d0, 0x04df, 0x04ee, 0x04fc, - 0x050b, 0x051b, 0x052b, 0x053a, 0x054a, 0x0559, 0x0568, 0x0576, - // Entry 3000 - 303F - 0x0585, 0x0595, 0x05a4, 0x05b4, 0x05c3, 0x05d2, 0x05e0, 0x05ef, - 0x05fe, 0x060c, 0x061b, 0x062a, 0x0639, 0x0647, 0x0656, 0x0666, - 0x0675, 0x0684, 0x0693, 0x06a1, 0x06b0, 0x06c0, 0x06cf, 0x06de, - 0x06ed, 0x06fb, 0x070a, 0x071a, 0x0729, 0x0739, 0x0748, 0x0757, - 0x0765, 0x0774, 0x0784, 0x0793, 0x07a3, 0x07b2, 0x07c1, 0x07cf, - 0x07de, 0x07ed, 0x07fc, 0x080a, 0x0819, 0x0829, 0x0838, 0x0847, - 0x0856, 0x0864, 0x0873, 0x0883, 0x0892, 0x08a2, 0x08b2, 0x08c1, - 0x08d1, 0x08e2, 0x08f3, 0x0903, 0x0914, 0x0924, 0x0934, 0x0943, - // Entry 3040 - 307F - 0x0953, 0x0964, 0x0974, 0x0985, 0x0995, 0x09a5, 0x09b4, 0x09c4, - 0x09d4, 0x09e3, 0x09f3, 0x0a03, 0x0a13, 0x0a22, 0x0a32, 0x0a43, - 0x0a53, 0x0a63, 0x0a73, 0x0a82, 0x0a92, 0x0aa2, 0x0ab2, 0x0ac1, - 0x0ad1, 0x0ae2, 0x0af2, 0x0b03, 0x0b13, 0x0b23, 0x0b32, 0x0b42, - 0x0b52, 0x0b62, 0x0b71, 0x0b81, 0x0b91, 0x0ba1, 0x0bb0, 0x0bc0, - 0x0bd1, 0x0be1, 0x0bf1, 0x0c01, 0x0c10, 0x0c20, 0x0c31, 0x0c41, - 0x0c51, 0x0c61, 0x0c70, 0x0c80, 0x0c91, 0x0ca1, 0x0cb2, 0x0cc2, - 0x0cd2, 0x0ce1, 0x0cf1, 0x0d02, 0x0d12, 0x0d23, 0x0d33, 0x0d43, - // Entry 3080 - 30BF - 0x0d52, 0x0d62, 0x0d72, 0x0d82, 0x0d91, 0x0da1, 0x0db2, 0x0dc2, - 0x0dd2, 0x0de1, 0x0df1, 0x0e02, 0x0e12, 0x0e21, 0x0e30, 0x0e3e, - 0x0e4d, 0x0e5d, 0x0e6c, 0x0e7c, 0x0e8b, 0x0e9a, 0x0ea8, 0x0eb7, - 0x0ec7, 0x0ed7, 0x0ee6, 0x0ef6, 0x0f05, 0x0f14, 0x0f22, 0x0f31, - 0x0f40, 0x0f4e, 0x0f5d, 0x0f6c, 0x0f7a, 0x0f89, 0x0f99, 0x0fa8, - 0x0fb7, 0x0fc6, 0x0fd4, 0x0fe3, 0x0ff2, 0x1001, 0x100f, 0x101e, - 0x102d, 0x103c, 0x104a, 0x1059, 0x1068, 0x1076, 0x1085, 0x1094, - 0x10a3, 0x10b1, 0x10c0, 0x10d0, 0x10df, 0x10ee, 0x10fd, 0x110b, - // Entry 30C0 - 30FF - 0x111a, 0x1129, 0x1138, 0x1146, 0x1155, 0x1165, 0x1175, 0x1184, - 0x1194, 0x11a3, 0x11b2, 0x11c0, 0x11cf, 0x11de, 0x11ed, 0x11fb, - 0x120a, 0x1219, 0x1228, 0x1237, 0x1246, 0x1254, 0x1263, 0x1273, - 0x1282, 0x1291, 0x12a0, 0x12ae, 0x12bd, 0x12cd, 0x12dc, 0x12eb, - 0x12fa, 0x1308, 0x1317, 0x1327, 0x1336, 0x1346, 0x1355, 0x1364, - 0x1372, 0x1381, 0x1391, 0x13a0, 0x13af, 0x13be, 0x13cc, 0x13db, - 0x13ea, 0x13f8, 0x1407, 0x1416, 0x1425, 0x1433, 0x1442, 0x1452, - 0x1461, 0x1470, 0x147f, 0x148d, 0x149c, 0x14ac, 0x14bb, 0x14cb, - // Entry 3100 - 313F - 0x14da, 0x14e9, 0x14f7, 0x1506, 0x1516, 0x1526, 0x1535, 0x1545, - 0x1554, 0x1563, 0x1571, 0x1580, 0x158f, 0x159d, 0x15ac, 0x15bb, - 0x15ca, 0x15d8, 0x15e7, 0x15f7, 0x1606, 0x1616, 0x1626, 0x1635, - 0x1645, 0x1656, 0x1666, 0x1677, 0x1687, 0x1697, 0x16a6, 0x16b6, - 0x16c7, 0x16d7, 0x16e8, 0x16f8, 0x1708, 0x1717, 0x1727, 0x1737, - 0x1746, 0x1756, 0x1766, 0x1776, 0x1785, 0x1795, 0x17a6, 0x17b6, - 0x17c6, 0x17d6, 0x17e5, 0x17f5, 0x1806, 0x1816, 0x1826, 0x1836, - 0x1845, 0x1855, 0x1865, 0x1875, 0x1884, 0x1894, 0x18a4, 0x18b3, - // Entry 3140 - 317F - 0x18c3, 0x18d3, 0x18e3, 0x18f2, 0x1902, 0x1913, 0x1923, 0x1933, - 0x1943, 0x1952, 0x1962, 0x1973, 0x1984, 0x1994, 0x19a5, 0x19b5, - 0x19c5, 0x19d4, 0x19e4, 0x19f5, 0x1a05, 0x1a15, 0x1a25, 0x1a35, - 0x1a45, 0x1a54, 0x1a64, 0x1a74, 0x1a83, 0x1a92, 0x1aa0, 0x1aaf, - 0x1abf, 0x1ace, 0x1ade, 0x1aed, 0x1afb, 0x1b0a, 0x1b1a, 0x1b29, - 0x1b39, 0x1b48, 0x1b57, 0x1b65, 0x1b74, 0x1b83, 0x1b91, 0x1ba0, - 0x1baf, 0x1bbe, 0x1bcc, 0x1bdb, 0x1beb, 0x1bfa, 0x1c0a, 0x1c1a, - 0x1c29, 0x1c39, 0x1c4a, 0x1c5a, 0x1c6b, 0x1c7b, 0x1c8b, 0x1c9a, - // Entry 3180 - 31BF - 0x1caa, 0x1cbb, 0x1ccb, 0x1cdc, 0x1cec, 0x1cfb, 0x1d0b, 0x1d1b, - 0x1d2a, 0x1d3a, 0x1d4a, 0x1d5a, 0x1d69, 0x1d79, 0x1d8a, 0x1d9a, - 0x1daa, 0x1dba, 0x1dc9, 0x1dd9, 0x1dea, 0x1dfa, 0x1e09, 0x1e18, - 0x1e26, 0x1e35, 0x1e45, 0x1e55, 0x1e64, 0x1e74, 0x1e83, 0x1e92, - 0x1ea0, 0x1eaf, 0x1ebf, 0x1ecf, 0x1ede, 0x1eee, 0x1efd, 0x1f0c, - 0x1f1a, 0x1f29, 0x1f38, 0x1f46, 0x1f55, 0x1f64, 0x1f73, 0x1f81, - 0x1f90, 0x1fa0, 0x1faf, 0x1fbe, 0x1fcd, 0x1fdb, 0x1fea, 0x1ffa, - 0x2009, 0x2018, 0x2027, 0x2035, 0x2044, 0x2054, 0x2064, 0x2073, - // Entry 31C0 - 31FF - 0x2083, 0x2092, 0x20a1, 0x20af, 0x20be, 0x20ce, 0x20de, 0x20ed, - 0x20fd, 0x210c, 0x211b, 0x2129, 0x2138, 0x2147, 0x2156, 0x2164, - 0x2173, 0x2182, 0x2191, 0x219f, 0x21ae, 0x21be, 0x21cd, 0x21dc, - 0x21eb, 0x21f9, 0x2208, 0x2218, 0x2227, 0x2237, 0x2246, 0x2255, - 0x2263, 0x2272, 0x2282, 0x2291, 0x22a1, 0x22b0, 0x22bf, 0x22cd, - 0x22dc, 0x22eb, 0x22fa, 0x2308, 0x2317, 0x2326, 0x2335, 0x2343, - 0x2352, 0x2362, 0x2371, 0x2381, 0x2391, 0x23a0, 0x23b1, 0x23c1, - 0x23d2, 0x23e2, 0x23f2, 0x2401, 0x2411, 0x2422, 0x2433, 0x2443, - // Entry 3200 - 323F - 0x2454, 0x2464, 0x2474, 0x2483, 0x2493, 0x24a3, 0x24b3, 0x24c2, - 0x24d2, 0x24e2, 0x24f2, 0x2501, 0x2511, 0x2522, 0x2532, 0x2543, - 0x2553, 0x2563, 0x2573, 0x2582, 0x2592, 0x25a3, 0x25b3, 0x25c4, - 0x25d4, 0x25e4, 0x25f3, 0x2603, 0x2613, 0x2622, 0x2632, 0x2642, - 0x2652, 0x2661, 0x2671, 0x2682, 0x2692, 0x26a2, 0x26b2, 0x26c1, - 0x26d1, 0x26e2, 0x26f3, 0x2703, 0x2714, 0x2724, 0x2734, 0x2743, - 0x2753, 0x2764, 0x2775, 0x2785, 0x2796, 0x27a6, 0x27b6, 0x27c5, - 0x27d5, 0x27e5, 0x27f4, 0x2804, 0x2815, 0x2825, 0x2836, 0x2846, - // Entry 3240 - 327F - 0x2856, 0x2865, 0x2875, 0x2886, 0x2897, 0x28a7, 0x28b7, 0x28c7, - 0x28d6, 0x28e6, 0x28f6, 0x2905, 0x2915, 0x2924, 0x2934, 0x2943, - 0x2952, 0x2961, 0x296f, 0x297e, 0x298e, 0x299e, 0x29ad, 0x29bd, - 0x29cc, 0x29db, 0x29e9, 0x29f8, 0x2a07, 0x2a15, 0x2a24, 0x2a33, - 0x2a42, 0x2a50, 0x2a5f, 0x2a6f, 0x2a7e, 0x2a8e, 0x2a9d, 0x2aab, - 0x2aba, 0x2ac9, 0x2ad7, 0x2ae6, 0x2af5, 0x2b04, 0x2b12, 0x2b21, - 0x2b31, 0x2b40, 0x2b50, 0x2b5f, 0x2b6e, 0x2b7c, 0x2b8b, 0x2b9b, - 0x2baa, 0x2bba, 0x2bc9, 0x2bd8, 0x2be6, 0x2bf5, 0x2c04, 0x2c12, - // Entry 3280 - 32BF - 0x2c21, 0x2c30, 0x2c3f, 0x2c4d, 0x2c5c, 0x2c6c, 0x2c7b, 0x2c8a, - 0x2c99, 0x2ca7, 0x2cb6, 0x2cc6, 0x2cd5, 0x2ce4, 0x2cf3, 0x2d01, - 0x2d10, 0x2d20, 0x2d30, 0x2d3f, 0x2d4f, 0x2d5e, 0x2d6d, 0x2d7b, - 0x2d8a, 0x2d9a, 0x2da9, 0x2db9, 0x2dc8, 0x2dd7, 0x2de5, 0x2df4, - 0x2e03, 0x2e11, 0x2e20, 0x2e2f, 0x2e3e, 0x2e4c, 0x2e5b, 0x2e6b, - 0x2e7a, 0x2e89, 0x2e98, 0x2ea6, 0x2eb5, 0x2ec5, 0x2ed4, 0x2ee4, - 0x2ef4, 0x2f03, 0x2f13, 0x2f24, 0x2f35, 0x2f45, 0x2f56, 0x2f66, - 0x2f76, 0x2f85, 0x2f95, 0x2fa5, 0x2fb4, 0x2fc4, 0x2fd4, 0x2fe3, - // Entry 32C0 - 32FF - 0x2ff3, 0x3003, 0x3012, 0x3022, 0x3033, 0x3043, 0x3053, 0x3063, - 0x3072, 0x3082, 0x3093, 0x30a3, 0x30b3, 0x30c3, 0x30d2, 0x30e2, - 0x30f3, 0x3103, 0x3114, 0x3124, 0x3134, 0x3143, 0x3153, 0x3164, - 0x3174, 0x3184, 0x3194, 0x31a4, 0x31b3, 0x31c3, 0x31d2, 0x31e2, - 0x31f3, 0x3203, 0x3213, 0x3223, 0x3232, 0x3242, 0x3253, 0x3263, - 0x3272, 0x3281, 0x328f, 0x329e, 0x32ae, 0x32bd, 0x32cd, 0x32dc, - 0x32eb, 0x32f9, 0x3308, 0x3318, 0x3327, 0x3337, 0x3346, 0x3355, - 0x3363, 0x3372, 0x3381, 0x338f, 0x339e, 0x33ad, 0x33bc, 0x33ca, - // Entry 3300 - 333F - 0x33d9, 0x33e9, 0x33f8, 0x3407, 0x3416, 0x3424, 0x3433, 0x3443, - 0x3452, 0x3462, 0x3472, 0x3481, 0x3491, 0x34a2, 0x34b2, 0x34c3, - 0x34d3, 0x34e3, 0x34f2, 0x3502, 0x3512, 0x3522, 0x3531, 0x3541, - 0x3551, 0x3560, 0x3570, 0x3580, 0x3590, 0x359f, 0x35af, 0x35bf, - 0x35cf, 0x35de, 0x35ee, 0x35ff, 0x360f, 0x361f, 0x362f, 0x363e, - 0x364e, 0x365f, 0x366f, 0x3680, 0x3690, 0x36a0, 0x36af, 0x36bf, - 0x36cf, 0x36df, 0x36ee, 0x36fe, 0x370e, 0x371e, 0x372d, 0x373d, - 0x374e, 0x375e, 0x376e, 0x377e, 0x378d, 0x379d, 0x37ae, 0x37be, - // Entry 3340 - 337F - 0x37ce, 0x37de, 0x37ed, 0x37fd, 0x380e, 0x381f, 0x382f, 0x3840, - 0x3850, 0x3860, 0x386f, 0x387f, 0x388f, 0x389f, 0x38ae, 0x38be, - 0x38ce, 0x38dd, 0x38ed, 0x38fe, 0x390e, 0x391e, 0x392e, 0x393d, - 0x394d, 0x395e, 0x396e, 0x397e, 0x398d, 0x399e, 0x39ae, 0x39be, - 0x39ce, 0x39dd, 0x39ed, 0x39fd, 0x3a0d, 0x3a1c, 0x3a2c, 0x3a3c, - 0x3a4c, 0x3a5b, 0x3a6b, 0x3a7c, 0x3a8c, 0x3a9c, 0x3aac, 0x3abb, - 0x3acb, 0x3adc, 0x3aec, 0x3afc, 0x3b0c, 0x3b1b, 0x3b2b, 0x3b3b, - 0x3b4a, 0x3b5a, 0x3b6a, 0x3b7a, 0x3b89, 0x3b99, 0x3ba9, 0x3bb9, - // Entry 3380 - 33BF - 0x3bc8, 0x3bd8, 0x3be9, 0x3bf9, 0x3c09, 0x3c19, 0x3c28, 0x3c38, - 0x3c49, 0x3c59, 0x3c69, 0x3c79, 0x3c88, 0x3c98, 0x3ca9, 0x3cb9, - 0x3cca, 0x3cda, 0x3cea, 0x3cf9, 0x3d09, 0x3d19, 0x3d29, 0x3d38, - 0x3d48, 0x3d58, 0x3d68, 0x3d77, 0x3d87, 0x3d98, 0x3da8, 0x3db8, - 0x3dc8, 0x3dd7, 0x3de7, 0x3df8, 0x3e08, 0x3e17, 0x3e26, 0x3e34, - 0x3e43, 0x3e53, 0x3e62, 0x3e72, 0x3e81, 0x3e90, 0x3e9e, 0x3ead, - 0x3ebc, 0x3eca, 0x3ed9, 0x3ee8, 0x3ef7, 0x3f05, 0x3f14, 0x3f24, - 0x3f33, 0x3f42, 0x3f51, 0x3f5f, 0x3f6e, 0x3f7e, 0x3f8d, 0x3f9c, - // Entry 33C0 - 33FF - 0x3fab, 0x3fb9, 0x3fc8, 0x3fd8, 0x3fe8, 0x3ff7, 0x4007, 0x4017, - 0x4027, 0x4036, 0x4046, 0x4055, 0x4064, 0x4072, 0x4081, 0x4090, - 0x409f, 0x40ad, 0x40bc, 0x40cc, 0x40db, 0x40ea, 0x40f9, 0x4107, - 0x4116, 0x4126, 0x4135, 0x4144, 0x4153, 0x4161, 0x4170, 0x4180, - 0x4190, 0x419f, 0x41af, 0x41bf, 0x41cf, 0x41de, 0x41ee, 0x41fd, - 0x420c, 0x421a, 0x4229, 0x4238, 0x4247, 0x4255, 0x4264, 0x4274, - 0x4283, 0x4292, 0x42a1, 0x42af, 0x42be, 0x42ce, 0x42dd, 0x42ed, - 0x42fd, 0x430c, 0x431c, 0x432d, 0x433e, 0x434e, 0x435f, 0x4370, - // Entry 3400 - 343F - 0x4380, 0x4391, 0x43a1, 0x43b1, 0x43c0, 0x43d0, 0x43e0, 0x43f0, - 0x43ff, 0x440f, 0x4420, 0x4430, 0x4440, 0x4450, 0x445f, 0x446f, - 0x447f, 0x448f, 0x449e, 0x44ae, 0x44bf, 0x44d0, 0x44e0, 0x44f1, - 0x4502, 0x4512, 0x4522, 0x4532, 0x4541, 0x4551, 0x4561, 0x4570, - 0x4580, 0x4591, 0x45a1, 0x45b1, 0x45c1, 0x45d0, 0x45e0, 0x45f1, - 0x4601, 0x4611, 0x4621, 0x4630, 0x4640, 0x4651, 0x4662, 0x4672, - 0x4683, 0x4694, 0x46a4, 0x46b5, 0x46c5, 0x46d5, 0x46e4, 0x46f4, - 0x4704, 0x4714, 0x4723, 0x4733, 0x4742, 0x4751, 0x475f, 0x476e, - // Entry 3440 - 347F - 0x477e, 0x478e, 0x479d, 0x47ad, 0x47bd, 0x47cc, 0x47db, 0x47ea, - 0x47f8, 0x4807, 0x4816, 0x4825, 0x4833, 0x4842, 0x4852, 0x4861, - 0x4870, 0x487f, 0x488d, 0x489c, 0x48ac, 0x48bc, 0x48cb, 0x48db, - 0x48eb, 0x48fb, 0x490a, 0x491a, 0x4929, 0x4938, 0x4946, 0x4955, - 0x4964, 0x4973, 0x4981, 0x4990, 0x49a0, 0x49af, 0x49be, 0x49cd, - 0x49db, 0x49ea, 0x49fa, 0x4a09, 0x0209, 0x0217, 0x0224, 0x0232, - 0x0241, 0x024f, 0x025d, 0x026c, 0x027a, 0x0287, 0x0296, 0x02a4, - 0x02b3, 0x02c1, 0x02ce, 0x02dc, 0x02eb, 0x02f9, 0x0306, 0x0314, - // Entry 3480 - 34BF - 0x0322, 0x0331, 0x033f, 0x034e, 0x035d, 0x036a, 0x0377, 0x0386, - 0x0394, 0x03a2, 0x03b0, 0x03be, 0x03cc, 0x03da, 0x03e8, 0x03f5, - 0x0402, 0x0411, 0x041f, 0x042d, 0x043c, 0x0449, 0x0456, 0x0465, - 0x0473, 0x0480, 0x048f, 0x049d, 0x04ac, 0x04bb, 0x04c9, 0x04d8, - 0x04e6, 0x04f6, 0x0505, 0x0512, 0x0112, 0x0120, 0x012e, 0x013d, - 0x014b, 0x0159, 0x0168, 0x0176, 0x0184, 0x0193, 0x01a1, 0x01af, - 0x01be, 0x01cd, 0x01dc, 0x01ec, 0x01fa, 0x0208, 0x0216, 0x0224, - 0x0233, 0x0241, 0x0250, 0x025e, 0x026c, 0x027b, 0x0289, 0x0297, - // Entry 34C0 - 34FF - 0x02a6, 0x02b4, 0x02c3, 0x02d0, 0x02de, 0x02eb, 0x02f9, 0x0306, - 0x0313, 0x0320, 0x032e, 0x033c, 0x034a, 0x0361, 0x0377, 0x038f, - 0x03a6, 0x03bd, 0x03d5, 0x03eb, 0x0405, 0x0414, 0x0424, 0x0434, - 0x0444, 0x0455, 0x0465, 0x0476, 0x0486, 0x0497, 0x04a8, 0x04ba, - 0x04cb, 0x04db, 0x04eb, 0x04fb, 0x050c, 0x051d, 0x052f, 0x053f, - 0x054f, 0x055f, 0x0570, 0x0580, 0x0591, 0x05a1, 0x05b2, 0x05c2, - 0x05d2, 0x05e3, 0x05f3, 0x0603, 0x0615, 0x0625, 0x0635, 0x0645, - 0x0656, 0x0664, 0x0673, 0x0682, 0x0692, 0x06a1, 0x06b1, 0x06c0, - // Entry 3500 - 353F - 0x06d0, 0x06df, 0x06ef, 0x06ff, 0x0710, 0x0720, 0x072f, 0x073e, - 0x074d, 0x075d, 0x076d, 0x077e, 0x078d, 0x079c, 0x07ab, 0x07bb, - 0x07ca, 0x07da, 0x07e9, 0x07f9, 0x0808, 0x0817, 0x0827, 0x0836, - 0x0845, 0x0856, 0x0865, 0x0874, 0x0883, 0x0893, 0x08a1, 0x08b0, - 0x08c1, 0x08d0, 0x08e0, 0x08ef, 0x08ff, 0x090e, 0x091e, 0x092d, - 0x093d, 0x094d, 0x095e, 0x096f, 0x097f, 0x098e, 0x099d, 0x09ac, - 0x09bc, 0x09cc, 0x09dd, 0x09ec, 0x09fb, 0x0a0a, 0x0a1a, 0x0a29, - 0x0a39, 0x0a48, 0x0a58, 0x0a67, 0x0a76, 0x0a86, 0x0a95, 0x0aa4, - // Entry 3540 - 357F - 0x0ab4, 0x0ac5, 0x0ad4, 0x0ae3, 0x0af2, 0x0b02, 0x0b11, 0x0b21, - 0x0b31, 0x0b41, 0x0b52, 0x0b62, 0x0b73, 0x0b83, 0x0b94, 0x0ba5, - 0x0bb7, 0x0bc8, 0x0bd8, 0x0be8, 0x0bf8, 0x0c09, 0x0c1a, 0x0c2c, - 0x0c3c, 0x0c4c, 0x0c5c, 0x0c6d, 0x0c7d, 0x0c8e, 0x0c9e, 0x0caf, - 0x0cbf, 0x0ccf, 0x0ce0, 0x0cf0, 0x0d00, 0x0d12, 0x0d22, 0x0d32, - 0x0d42, 0x0d53, 0x0d61, 0x0d70, 0x0d7f, 0x0d8f, 0x0d9e, 0x0dae, - 0x0dbd, 0x0dcd, 0x0ddc, 0x0dec, 0x0dfc, 0x0e0d, 0x0e1d, 0x0e2c, - 0x0e3b, 0x0e4a, 0x0e5a, 0x0e6a, 0x0e7b, 0x0e8a, 0x0e99, 0x0ea8, - // Entry 3580 - 35BF - 0x0eb8, 0x0ec7, 0x0ed7, 0x0ee6, 0x0ef6, 0x0f05, 0x0f14, 0x0f24, - 0x0f33, 0x0f42, 0x0f53, 0x0f62, 0x0f71, 0x0f80, 0x0f90, 0x0f9e, - 0x0fad, 0x0fbe, 0x0fcd, 0x0fdd, 0x0fec, 0x0ffc, 0x100b, 0x101b, - 0x102a, 0x103a, 0x104a, 0x105b, 0x106b, 0x107c, 0x108b, 0x109a, - 0x10a9, 0x10b9, 0x10c9, 0x10da, 0x10e9, 0x10f8, 0x1107, 0x1117, - 0x1126, 0x1136, 0x1145, 0x1155, 0x1164, 0x1173, 0x1183, 0x1192, - 0x11a1, 0x11b2, 0x11c1, 0x11d0, 0x11df, 0x11ef, 0x11fd, 0x120c, - 0x121d, 0x122c, 0x123c, 0x124b, 0x125b, 0x126a, 0x127a, 0x1289, - // Entry 35C0 - 35FF - 0x1299, 0x12a9, 0x12ba, 0x12cb, 0x12db, 0x12ec, 0x12fb, 0x130a, - 0x1319, 0x1329, 0x1339, 0x134a, 0x1359, 0x1368, 0x1377, 0x1387, - 0x1396, 0x13a6, 0x13b5, 0x13c5, 0x13d4, 0x13e3, 0x13f3, 0x1402, - 0x1411, 0x1422, 0x1434, 0x1443, 0x1453, 0x1462, 0x1471, 0x1481, - 0x1490, 0x14a7, 0x14b0, 0x14bd, 0x14ce, 0x14e3, 0x14f8, 0x150e, - 0x151e, 0x152e, 0x153d, 0x154b, 0x155a, 0x1568, 0x1576, 0x1585, - 0x1595, 0x15a4, 0x15b3, 0x15c2, 0x15d1, 0x15df, 0x15ec, 0x15f9, - 0x1608, 0x1616, 0x1624, 0x1631, 0x1640, 0x164f, 0x165d, 0x1672, - // Entry 3600 - 363F - 0x1687, 0x0287, 0x02a5, 0x02c1, 0x02de, 0x02f9, 0x031d, 0x033f, - 0x035b, 0x0375, 0x0392, 0x03ad, 0x03d1, 0x03f3, 0x0416, 0x0437, - 0x045a, 0x047b, 0x04a5, 0x04cd, 0x04f1, 0x0513, 0x0536, 0x0557, - 0x0579, 0x0599, 0x05c2, 0x05e9, 0x060c, 0x062d, 0x065f, 0x068f, - 0x06a9, 0x06c1, 0x06e5, 0x0707, 0x0726, 0x0743, 0x0762, 0x077f, - 0x079e, 0x07bb, 0x07de, 0x07ff, 0x0822, 0x0843, 0x086d, 0x0895, - 0x08b2, 0x08ca, 0x08ee, 0x0916, 0x093f, 0x0950, 0x0976, 0x0991, - 0x09ad, 0x09c8, 0x09eb, 0x0a09, 0x0a2c, 0x0a4b, 0x0a64, 0x0a7e, - // Entry 3640 - 367F - 0x0a8d, 0x0a9d, 0x0ab8, 0x0ad1, 0x0aed, 0x0b07, 0x0b23, 0x0b3d, - 0x0b59, 0x0b73, 0x0b8f, 0x0ba9, 0x0bd4, 0x0bfd, 0x0c18, 0x0c31, - 0x0c4d, 0x0c67, 0x0c83, 0x0c9d, 0x0cb9, 0x0cd3, 0x0cee, 0x0d07, - 0x0d23, 0x0d3d, 0x0d5d, 0x0d7b, 0x0d9c, 0x0dbb, 0x0ddd, 0x0dff, - 0x0e1b, 0x0e3f, 0x0e4d, 0x0e5c, 0x0e6a, 0x0e79, 0x0e88, 0x0e98, - 0x0ea8, 0x0eb6, 0x0ec6, 0x0ed4, 0x0ee3, 0x0ef2, 0x0f02, 0x0f13, - 0x0f25, 0x0f37, 0x0f47, 0x0f58, 0x0f6a, 0x0f78, 0x0f88, 0x0f97, - 0x0fa8, 0x0fb7, 0x0fc9, 0x0fda, 0x0feb, 0x0ffb, 0x100c, 0x101b, - // Entry 3680 - 36BF - 0x102d, 0x103d, 0x104d, 0x105d, 0x106c, 0x107d, 0x108e, 0x109f, - 0x10b0, 0x10c1, 0x10d1, 0x10e1, 0x10f1, 0x1101, 0x1110, 0x111f, - 0x112e, 0x113d, 0x114e, 0x115e, 0x116e, 0x1182, 0x1193, 0x11a3, - 0x11b3, 0x11c4, 0x11d3, 0x11e3, 0x11f2, 0x1201, 0x1210, 0x121f, - 0x122f, 0x123e, 0x124f, 0x125f, 0x126f, 0x127e, 0x128d, 0x129c, - 0x12ab, 0x12bc, 0x12cc, 0x12dc, 0x12ec, 0x12fd, 0x130f, 0x1322, - 0x1334, 0x1347, 0x1363, 0x1381, 0x138e, 0x139d, 0x13a8, 0x13b3, - 0x13c2, 0x13d5, 0x03d5, 0x03fa, 0x0420, 0x0446, 0x046d, 0x0490, - // Entry 36C0 - 36FF - 0x04b4, 0x04d7, 0x04fb, 0x0525, 0x0549, 0x056c, 0x058f, 0x05b8, - 0x05ec, 0x061a, 0x0647, 0x0674, 0x06a7, 0x06d4, 0x06fb, 0x0721, - 0x0747, 0x0773, 0x0793, 0x07ac, 0x07ce, 0x07f6, 0x0815, 0x0836, - 0x085d, 0x088d, 0x08ba, 0x08de, 0x0901, 0x0928, 0x094d, 0x0973, - 0x0997, 0x09b0, 0x09c7, 0x09de, 0x09f3, 0x0a10, 0x0a2b, 0x0a49, - 0x0a65, 0x0a8e, 0x0ab5, 0x0ad1, 0x0aed, 0x0b04, 0x0b19, 0x0b30, - 0x0b45, 0x0b5c, 0x0b71, 0x0b88, 0x0b9d, 0x0bc8, 0x0bf1, 0x0c08, - 0x0c1d, 0x0c45, 0x0c6b, 0x0c8d, 0x0cad, 0x0cd8, 0x0d01, 0x0d37, - // Entry 3700 - 373F - 0x0d6b, 0x0d88, 0x0da3, 0x0dca, 0x0def, 0x0e1e, 0x0e4b, 0x0e6b, - 0x0e89, 0x0ea0, 0x0eb5, 0x0ee9, 0x0f1b, 0x0f3f, 0x0f61, 0x0f8a, - 0x0fb1, 0x0fe5, 0x1017, 0x1042, 0x106b, 0x1089, 0x10a5, 0x10c5, - 0x10e3, 0x110e, 0x1137, 0x114e, 0x1163, 0x1184, 0x11a3, 0x11c9, - 0x11ed, 0x1225, 0x125b, 0x1274, 0x128b, 0x12a2, 0x12b7, 0x12ce, - 0x12e3, 0x12fb, 0x1311, 0x1323, 0x1339, 0x134f, 0x1365, 0x137b, - 0x1391, 0x13af, 0x13c5, 0x13da, 0x13f8, 0x1414, 0x1432, 0x144e, - 0x146c, 0x1491, 0x14b4, 0x14d1, 0x14ec, 0x150a, 0x1526, 0x1544, - // Entry 3740 - 377F - 0x1560, 0x157e, 0x159a, 0x15bf, 0x15d4, 0x15f5, 0x1612, 0x162d, - 0x164a, 0x167b, 0x1697, 0x16bc, 0x16df, 0x16fe, 0x171b, 0x1741, - 0x1767, 0x178b, 0x17ad, 0x17cf, 0x17ef, 0x180e, 0x182b, 0x184a, - 0x1867, 0x1886, 0x18a3, 0x18cd, 0x18f5, 0x191f, 0x1947, 0x1971, - 0x1999, 0x19c3, 0x19eb, 0x1a15, 0x1a3d, 0x1a5d, 0x1a81, 0x1a9e, - 0x1abe, 0x1ae2, 0x02e2, 0x02ff, 0x031c, 0x0344, 0x035c, 0x0375, - 0x038c, 0x03a6, 0x03be, 0x03be, 0x03e0, 0x0405, 0x0426, 0x0449, - 0x046b, 0x048d, 0x04af, 0x04ce, 0x04ef, 0x0504, 0x0519, 0x0533, - // Entry 3780 - 37BF - 0x0548, 0x055d, 0x0572, 0x058b, 0x05a1, 0x05b8, 0x05ce, 0x05e5, - 0x05ff, 0x0615, 0x062c, 0x0642, 0x0659, 0x0670, 0x0688, 0x069f, - 0x06b7, 0x06cd, 0x06e4, 0x06fa, 0x0711, 0x0727, 0x073d, 0x0754, - 0x076a, 0x0781, 0x0797, 0x07ad, 0x07c3, 0x07da, 0x07f0, 0x0806, - 0x081f, 0x0838, 0x0851, 0x086a, 0x0884, 0x089e, 0x08b8, 0x08d2, - 0x08ec, 0x00ec, 0x010c, 0x0129, 0x014c, 0x016e, 0x018d, 0x01b2, - 0x01ca, 0x01e6, 0x01fc, 0x0215, 0x0215, 0x0227, 0x023a, 0x024c, - 0x025f, 0x0271, 0x0284, 0x0296, 0x02a9, 0x02bb, 0x02ce, 0x02e0, - // Entry 37C0 - 37FF - 0x02f2, 0x0304, 0x0317, 0x0329, 0x033b, 0x034e, 0x0362, 0x0375, - 0x0387, 0x039a, 0x03ac, 0x03c3, 0x03d5, 0x03e7, 0x03f9, 0x040c, - 0x041e, 0x0430, 0x0441, 0x0452, 0x0463, 0x0474, 0x0485, 0x0497, - 0x04a9, 0x04bb, 0x04ce, 0x04e0, 0x04fc, 0x0518, 0x052b, 0x053f, - 0x0552, 0x0565, 0x0581, 0x059e, 0x05b7, 0x05d3, 0x05ef, 0x060c, - 0x0627, 0x0640, 0x0659, 0x066b, 0x0684, 0x0284, 0x029c, 0x02b3, - 0x02c6, 0x02da, 0x02ed, 0x0301, 0x0314, 0x0328, 0x0343, 0x035f, - 0x037a, 0x0396, 0x03a9, 0x03bd, 0x03d1, 0x03e4, 0x03f8, 0x040c, - // Entry 3800 - 383F - 0x0420, 0x0435, 0x0449, 0x045e, 0x0473, 0x0487, 0x049c, 0x04b0, - 0x04c5, 0x04da, 0x04ef, 0x0505, 0x051a, 0x0530, 0x0545, 0x0559, - 0x056e, 0x0582, 0x0597, 0x05ab, 0x05bf, 0x05d4, 0x05e8, 0x05fd, - 0x0611, 0x0625, 0x0639, 0x064d, 0x0661, 0x0676, 0x068b, 0x069f, - 0x06b3, 0x06c8, 0x06e7, 0x06ff, 0x0716, 0x072e, 0x0745, 0x075d, - 0x077c, 0x079c, 0x07bb, 0x07db, 0x07f2, 0x080a, 0x0822, 0x0839, - 0x0851, 0x0869, 0x087f, 0x089a, 0x009a, 0x00aa, 0x00c1, 0x00d6, - 0x00ea, 0x00fe, 0x0114, 0x0129, 0x013e, 0x0152, 0x0168, 0x017e, - // Entry 3840 - 387F - 0x0193, 0x0193, 0x01b2, 0x01d0, 0x01ee, 0x020e, 0x022d, 0x024c, - 0x026a, 0x028a, 0x02aa, 0x02c9, 0x02e6, 0x0303, 0x0321, 0x033f, - 0x035d, 0x037b, 0x0399, 0x03bb, 0x03de, 0x0400, 0x0429, 0x0448, - 0x0469, 0x048d, 0x04a5, 0x04ba, 0x04ca, 0x04df, 0x04f6, 0x0508, - 0x0108, 0x011b, 0x012d, 0x013f, 0x0153, 0x0166, 0x0179, 0x018b, - 0x019f, 0x01b3, 0x01c6, 0x01d8, 0x01eb, 0x01fd, 0x0210, 0x0222, - 0x0235, 0x0247, 0x025a, 0x026c, 0x027f, 0x0291, 0x02a3, 0x02b6, - 0x02c8, 0x02da, 0x02ec, 0x02fe, 0x0310, 0x0322, 0x0334, 0x0347, - // Entry 3880 - 38BF - 0x0359, 0x036b, 0x037d, 0x038e, 0x03a0, 0x03b1, 0x03c3, 0x03d4, - 0x03e4, 0x03f4, 0x0405, 0x0415, 0x0429, 0x043c, 0x0456, 0x0467, - 0x0479, 0x0489, 0x0499, 0x04aa, 0x04ba, 0x04ca, 0x04da, 0x04ea, - 0x04fa, 0x050a, 0x051a, 0x052a, 0x053b, 0x054b, 0x055b, 0x056b, - 0x057b, 0x058b, 0x059b, 0x05ac, 0x05be, 0x05cf, 0x05e1, 0x05f0, - 0x0603, 0x0616, 0x0629, 0x063d, 0x0650, 0x0664, 0x0678, 0x068c, - 0x06a4, 0x06bb, 0x06d2, 0x06e9, 0x06f6, 0x02f6, 0x0309, 0x0325, - 0x0341, 0x035c, 0x0378, 0x0394, 0x03b5, 0x03d1, 0x03f2, 0x040d, - // Entry 38C0 - 38FF - 0x0428, 0x0448, 0x046b, 0x0485, 0x04a0, 0x04bd, 0x04d9, 0x04f5, - 0x050f, 0x0531, 0x054e, 0x0569, 0x0588, 0x05a3, 0x05be, 0x05de, - 0x05fa, 0x0617, 0x0631, 0x0651, 0x0251, 0x0268, 0x027b, 0x028e, - 0x02a3, 0x02b4, 0x02ca, 0x02db, 0x02ed, 0x02fe, 0x0316, 0x032f, - 0x0350, 0x0361, 0x0373, 0x0384, 0x0396, 0x03ae, 0x03c6, 0x03d8, - 0x03f0, 0x0403, 0x0415, 0x042d, 0x043f, 0x0458, 0x0474, 0x0487, - 0x049a, 0x04b7, 0x04ca, 0x04e7, 0x04ff, 0x0511, 0x0529, 0x053b, - 0x0557, 0x0569, 0x057b, 0x0593, 0x05a5, 0x05bd, 0x05cf, 0x05e1, - // Entry 3900 - 393F - 0x05f3, 0x060b, 0x061d, 0x062f, 0x0647, 0x0663, 0x0675, 0x0687, - 0x069f, 0x06b9, 0x06d3, 0x06eb, 0x0709, 0x0721, 0x0740, 0x075a, - 0x0778, 0x0791, 0x07ae, 0x07cd, 0x07ea, 0x07fa, 0x0811, 0x0829, - 0x083c, 0x084f, 0x0862, 0x0875, 0x088a, 0x089e, 0x08b2, 0x08c4, - 0x08db, 0x08f0, 0x090c, 0x010c, 0x0120, 0x0133, 0x0145, 0x0157, - 0x016b, 0x017e, 0x0191, 0x01a3, 0x01b7, 0x01cb, 0x01de, 0x01de, - 0x01f9, 0x0210, 0x0227, 0x023e, 0x0255, 0x026c, 0x0283, 0x0298, - 0x02c2, 0x02de, 0x02f9, 0x0314, 0x0330, 0x034b, 0x0367, 0x0383, - // Entry 3940 - 397F - 0x03a0, 0x03bc, 0x03d8, 0x03f3, 0x040e, 0x042b, 0x0447, 0x0463, - 0x047e, 0x049b, 0x04b8, 0x04d4, 0x04f0, 0x050b, 0x0527, 0x0542, - 0x055e, 0x015e, 0x016b, 0x0178, 0x0185, 0x0192, 0x01a0, 0x01ad, - 0x01bb, 0x01ca, 0x01d8, 0x01e7, 0x01f7, 0x0206, 0x0215, 0x0225, - 0x0233, 0x0242, 0x0252, 0x0261, 0x0271, 0x027f, 0x028e, 0x029c, - 0x02ab, 0x02ba, 0x02c8, 0x02d7, 0x02e5, 0x02f4, 0x0303, 0x0311, - 0x0320, 0x032f, 0x033d, 0x034c, 0x035a, 0x0368, 0x0376, 0x0384, - 0x0393, 0x03a1, 0x03af, 0x03c1, 0x03d2, 0x03e4, 0x03f6, 0x0407, - // Entry 3980 - 39BF - 0x0419, 0x042a, 0x043c, 0x044e, 0x0460, 0x0476, 0x048c, 0x04a2, - 0x04b8, 0x00b8, 0x00cb, 0x00de, 0x00f2, 0x010e, 0x0122, 0x0135, - 0x0148, 0x015b, 0x016e, 0x0181, 0x0194, 0x01a8, 0x01c3, 0x01de, - 0x01de, 0x01ed, 0x01fb, 0x0209, 0x0219, 0x0228, 0x0237, 0x0245, - 0x0255, 0x0265, 0x0274, 0x0274, 0x028b, 0x02a1, 0x02be, 0x02db, - 0x02f3, 0x030b, 0x0324, 0x033c, 0x0355, 0x036e, 0x0387, 0x03a1, - 0x03ba, 0x03d4, 0x03ed, 0x0405, 0x041d, 0x0435, 0x044e, 0x0466, - 0x0492, 0x04aa, 0x04c2, 0x04da, 0x04f5, 0x050f, 0x0529, 0x0549, - // Entry 39C0 - 39FF - 0x0561, 0x0579, 0x0590, 0x05ab, 0x05c8, 0x05e5, 0x0604, 0x0623, - 0x0639, 0x0650, 0x0667, 0x067f, 0x0697, 0x06b0, 0x06c6, 0x06dd, - 0x06f4, 0x070c, 0x0722, 0x0739, 0x0750, 0x0768, 0x077e, 0x0795, - 0x07ac, 0x07c4, 0x07da, 0x07f1, 0x0807, 0x081e, 0x0835, 0x084d, - 0x0863, 0x087a, 0x0890, 0x08a7, 0x08bd, 0x08d4, 0x08eb, 0x0903, - 0x0919, 0x0930, 0x0946, 0x095d, 0x0973, 0x098a, 0x09a0, 0x09b7, - 0x09cd, 0x09e4, 0x09fa, 0x0a11, 0x0a27, 0x0a3e, 0x0a53, 0x0a69, - 0x0a7a, 0x0a8b, 0x0a9b, 0x0aac, 0x0abc, 0x0acc, 0x0adc, 0x0aed, - // Entry 3A00 - 3A3F - 0x0afe, 0x0b10, 0x0b21, 0x0b33, 0x0b44, 0x0b55, 0x0b66, 0x0b7a, - 0x0b91, 0x0ba6, 0x0bbc, 0x03bc, 0x03cf, 0x03e4, 0x03f7, 0x040d, - 0x0424, 0x0439, 0x044e, 0x0465, 0x047c, 0x0493, 0x04ab, 0x04c2, - 0x04da, 0x04f1, 0x0508, 0x051f, 0x0539, 0x0553, 0x056e, 0x0588, - 0x05a3, 0x05b8, 0x05d1, 0x05e2, 0x0607, 0x0628, 0x0647, 0x065a, - 0x025a, 0x0270, 0x0286, 0x029d, 0x02b4, 0x02ca, 0x02e0, 0x02e0, - 0x02f6, 0x030c, 0x0323, 0x033a, 0x0350, 0x0366, 0x0366, 0x037b, - 0x0390, 0x03a6, 0x03bc, 0x03d1, 0x03e6, 0x03e6, 0x03fd, 0x0414, - // Entry 3A40 - 3A7F - 0x042b, 0x0443, 0x045b, 0x0472, 0x0489, 0x0089, 0x009e, 0x00b3, - 0x00c8, 0x00de, 0x00f4, 0x0109, 0x011e, 0x011e, 0x013d, 0x0160, - 0x0180, 0x019b, 0x01bd, 0x01d7, 0x0204, 0x022d, 0x025a, 0x027f, - 0x02a5, 0x02cb, 0x02f3, 0x0313, 0x033f, 0x0364, 0x0382, 0x03aa, - 0x03dd, 0x03ff, 0x042d, 0x0449, 0x0474, 0x0497, 0x04b2, 0x04d8, - 0x0505, 0x0520, 0x0545, 0x0564, 0x058d, 0x05ba, 0x05cf, 0x05eb, - 0x060e, 0x0624, 0x064e, 0x0678, 0x06a0, 0x06c7, 0x0701, 0x0733, - 0x075c, 0x077e, 0x0798, 0x07c4, 0x07ed, 0x0813, 0x082f, 0x084c, - // Entry 3A80 - 3ABF - 0x0866, 0x087b, 0x089c, 0x08bc, 0x00bc, 0x00d3, 0x00ea, 0x0101, - 0x0118, 0x012f, 0x0146, 0x015e, 0x0176, 0x018e, 0x01a6, 0x01be, - 0x01d6, 0x01ee, 0x0206, 0x021e, 0x0236, 0x024e, 0x0266, 0x027e, - 0x0296, 0x02ae, 0x02c6, 0x02de, 0x02f6, 0x030e, 0x0326, 0x033e, - 0x0356, 0x036e, 0x0386, 0x039e, 0x03b7, 0x03d0, 0x03e8, 0x0400, - 0x0418, 0x0430, 0x0448, 0x0461, 0x047a, 0x0493, 0x04ac, 0x04c5, - 0x04de, 0x04f6, 0x050d, 0x0525, 0x053d, 0x0555, 0x056d, 0x0585, - 0x059d, 0x05b5, 0x05cd, 0x05e5, 0x05fd, 0x0615, 0x062d, 0x0645, - // Entry 3AC0 - 3AFF - 0x065d, 0x0676, 0x068f, 0x06a8, 0x06c1, 0x06da, 0x06f3, 0x070c, - 0x0725, 0x073e, 0x0757, 0x0770, 0x0789, 0x07a2, 0x07ba, 0x07d2, - 0x07ea, 0x0802, 0x081a, 0x0832, 0x084a, 0x0861, 0x0878, 0x088f, - 0x08a6, 0x08bc, 0x08d2, 0x08ea, 0x0901, 0x0919, 0x0931, 0x0949, - 0x0960, 0x0978, 0x098f, 0x09a5, 0x09ba, 0x09d2, 0x09eb, 0x0a02, - 0x0a1a, 0x0a31, 0x0a47, 0x0a5e, 0x0a75, 0x0a8d, 0x0aa5, 0x0abd, - 0x0adb, 0x0af9, 0x0b17, 0x0b34, 0x0b51, 0x0b6f, 0x0b8e, 0x0baa, - 0x0bc6, 0x0be2, 0x0bfe, 0x0c1b, 0x0c39, 0x0c55, 0x0c74, 0x0c90, - // Entry 3B00 - 3B3F - 0x0ca5, 0x0cba, 0x0cd0, 0x00d0, 0x00e7, 0x00fd, 0x0113, 0x012b, - 0x0142, 0x0159, 0x016f, 0x0187, 0x019f, 0x01b6, 0x01b6, 0x01cc, - 0x01e2, 0x01f7, 0x020d, 0x0223, 0x0239, 0x024f, 0x0265, 0x027a, - 0x028f, 0x02a5, 0x02ba, 0x02cf, 0x02e6, 0x02fc, 0x0312, 0x0327, - 0x033d, 0x0352, 0x0367, 0x037b, 0x0393, 0x03ab, 0x03ab, 0x03c7, - 0x03e5, 0x0401, 0x0423, 0x0440, 0x045c, 0x047f, 0x049c, 0x04bb, - 0x04da, 0x04fc, 0x051f, 0x0542, 0x0564, 0x0587, 0x05ab, 0x05ca, - 0x05f2, 0x0610, 0x062c, 0x064d, 0x0668, 0x0689, 0x06a5, 0x06c2, - // Entry 3B40 - 3B7F - 0x06e6, 0x0702, 0x071d, 0x073f, 0x075b, 0x0779, 0x0794, 0x07b7, - 0x07d8, 0x07f9, 0x0816, 0x0831, 0x084e, 0x086b, 0x0886, 0x08a4, - 0x08ca, 0x08e9, 0x0908, 0x0924, 0x0945, 0x0960, 0x097d, 0x099d, - 0x019d, 0x01bd, 0x01dd, 0x01fd, 0x021d, 0x023d, 0x025d, 0x027d, - 0x029d, 0x02bd, 0x02dd, 0x02fd, 0x031d, 0x033d, 0x035d, 0x037d, - 0x039d, 0x03bd, 0x03dd, 0x03fd, 0x041d, 0x043d, 0x045d, 0x047d, - 0x049d, 0x04bd, 0x04dd, 0x04fd, 0x051d, 0x053d, 0x055d, 0x057d, - 0x059d, 0x05bd, 0x05dd, 0x05fd, 0x061d, 0x063d, 0x065d, 0x067d, - // Entry 3B80 - 3BBF - 0x069d, 0x06bd, 0x06dd, 0x06fd, 0x071d, 0x073d, 0x075d, 0x077d, - 0x079d, 0x07bd, 0x07dd, 0x07fd, 0x081d, 0x083d, 0x085d, 0x087d, - 0x089d, 0x08bd, 0x08dd, 0x08fd, 0x091d, 0x093d, 0x095d, 0x097d, - 0x099d, 0x09bd, 0x09dd, 0x09fd, 0x0a1d, 0x0a3d, 0x0a5d, 0x0a7d, - 0x0a9d, 0x0abd, 0x0add, 0x0afd, 0x0b1d, 0x0b3d, 0x0b5d, 0x0b7d, - 0x0b9d, 0x0bbd, 0x0bdd, 0x0bfd, 0x0c1d, 0x0c3d, 0x0c5d, 0x0c7d, - 0x0c9d, 0x0cbd, 0x0cdd, 0x0cfd, 0x0d1d, 0x0d3d, 0x0d5d, 0x0d7d, - 0x0d9d, 0x0dbd, 0x0ddd, 0x0dfd, 0x0e1d, 0x0e3d, 0x0e5d, 0x0e7d, - // Entry 3BC0 - 3BFF - 0x0e9d, 0x0ebd, 0x0edd, 0x0efd, 0x0f1d, 0x0f3d, 0x0f5d, 0x0f7d, - 0x0f9d, 0x0fbd, 0x0fdd, 0x0ffd, 0x101d, 0x103d, 0x105d, 0x107d, - 0x109d, 0x10bd, 0x10dd, 0x10fd, 0x111d, 0x113d, 0x115d, 0x117d, - 0x119d, 0x11bd, 0x11dd, 0x11fd, 0x121d, 0x123d, 0x125d, 0x127d, - 0x129d, 0x12bd, 0x12dd, 0x12fd, 0x131d, 0x133d, 0x135d, 0x137d, - 0x139d, 0x13bd, 0x13dd, 0x13fd, 0x141d, 0x143d, 0x145d, 0x147d, - 0x149d, 0x14bd, 0x14dd, 0x14fd, 0x151d, 0x153d, 0x155d, 0x157d, - 0x159d, 0x15bd, 0x15dd, 0x15fd, 0x161d, 0x163d, 0x165d, 0x167d, - // Entry 3C00 - 3C3F - 0x169d, 0x16bd, 0x16dd, 0x16fd, 0x171d, 0x173d, 0x175d, 0x177d, - 0x179d, 0x17bd, 0x17dd, 0x17fd, 0x181d, 0x183d, 0x185d, 0x187d, - 0x189d, 0x18bd, 0x18dd, 0x18fd, 0x191d, 0x193d, 0x195d, 0x197d, - 0x199d, 0x19bd, 0x19dd, 0x19fd, 0x1a1d, 0x1a3d, 0x1a5d, 0x1a7d, - 0x1a9d, 0x1abd, 0x1add, 0x1afd, 0x1b1d, 0x1b3d, 0x1b5d, 0x1b7d, - 0x1b9d, 0x1bbd, 0x1bdd, 0x1bfd, 0x1c1d, 0x1c3d, 0x1c5d, 0x1c7d, - 0x1c9d, 0x1cbd, 0x1cdd, 0x1cfd, 0x1d1d, 0x1d3d, 0x1d5d, 0x1d7d, - 0x1d9d, 0x1dbd, 0x1ddd, 0x1dfd, 0x1e1d, 0x1e3d, 0x1e5d, 0x1e7d, - // Entry 3C40 - 3C7F - 0x1e9d, 0x1ebd, 0x1edd, 0x1efd, 0x1f1d, 0x1f3d, 0x1f5d, 0x1f7d, - 0x1f9d, 0x1fbd, 0x1fdd, 0x1ffd, 0x201d, 0x203d, 0x205d, 0x207d, - 0x209d, 0x20bd, 0x20dd, 0x20fd, 0x211d, 0x213d, 0x215d, 0x217d, - 0x219d, 0x21bd, 0x21dd, 0x21fd, 0x221d, 0x223d, 0x225d, 0x227d, - 0x229d, 0x22bd, 0x22dd, 0x22fd, 0x231d, 0x233d, 0x235d, 0x237d, - 0x239d, 0x23bd, 0x23dd, 0x23fd, 0x241d, 0x243d, 0x245d, 0x247d, - 0x249d, 0x24bd, 0x24dd, 0x24fd, 0x251d, 0x253d, 0x255d, 0x257d, - 0x259d, 0x25bd, 0x25dd, 0x25fd, 0x261d, 0x263d, 0x265d, 0x267d, - // Entry 3C80 - 3CBF - 0x269d, 0x26bd, 0x26dd, 0x26fd, 0x271d, 0x273d, 0x275d, 0x277d, - 0x279d, 0x27bd, 0x27dd, 0x27fd, 0x281d, 0x283d, 0x285d, 0x287d, - 0x289d, 0x28bd, 0x28dd, 0x28fd, 0x291d, 0x293d, 0x295d, 0x297d, - 0x299d, 0x29bd, 0x29dd, 0x29fd, 0x2a1d, 0x2a3d, 0x2a5d, 0x2a7d, - 0x2a9d, 0x2abd, 0x2add, 0x2afd, 0x2b1d, 0x2b3d, 0x2b5d, 0x2b7d, - 0x2b9d, 0x2bbd, 0x2bdd, 0x2bfd, 0x2c1d, 0x2c3d, 0x2c5d, 0x2c7d, - 0x2c9d, 0x2cbd, 0x2cdd, 0x2cfd, 0x2d1d, 0x2d3d, 0x2d5d, 0x2d7d, - 0x2d9d, 0x2dbd, 0x2ddd, 0x2dfd, 0x2e1d, 0x2e3d, 0x2e5d, 0x2e7d, - // Entry 3CC0 - 3CFF - 0x2e9d, 0x2ebd, 0x2edd, 0x2efd, 0x2f1d, 0x2f3d, 0x2f5d, 0x035d, - 0x037d, 0x039d, 0x03bd, 0x03dd, 0x03fd, 0x041d, 0x043d, 0x045d, - 0x047d, 0x049d, 0x04bd, 0x04dd, 0x04fd, 0x051d, 0x053d, 0x055d, - 0x057d, 0x059d, 0x05bd, 0x05dd, 0x05fd, 0x061d, 0x063d, 0x065d, - 0x067d, 0x069d, 0x06bd, 0x06dd, 0x06fd, 0x071d, 0x073d, 0x075d, - 0x077d, 0x079d, 0x07bd, 0x07dd, 0x07fd, 0x081d, 0x083d, 0x085d, - 0x087d, 0x089d, 0x08bd, 0x08dd, 0x08fd, 0x091d, 0x093d, 0x095d, - 0x097d, 0x099d, 0x09bd, 0x09dd, 0x09fd, 0x0a1d, 0x0a3d, 0x0a5d, - // Entry 3D00 - 3D3F - 0x0a7d, 0x0a9d, 0x0abd, 0x0add, 0x0afd, 0x0b1d, 0x0b3d, 0x0b5d, - 0x0b7d, 0x0b9d, 0x0bbd, 0x0bdd, 0x0bfd, 0x0c1d, 0x0c3d, 0x0c5d, - 0x0c7d, 0x0c9d, 0x0cbd, 0x0cdd, 0x0cfd, 0x0d1d, 0x0d3d, 0x0d5d, - 0x0d7d, 0x0d9d, 0x0dbd, 0x0ddd, 0x0dfd, 0x0e1d, 0x0e3d, 0x0e5d, - 0x0e7d, 0x0e9d, 0x0ebd, 0x0edd, 0x0efd, 0x0f1d, 0x0f3d, 0x0f5d, - 0x0f7d, 0x0f9d, 0x0fbd, 0x0fdd, 0x0ffd, 0x101d, 0x103d, 0x105d, - 0x107d, 0x109d, 0x009d, 0x00b4, 0x00cb, 0x00e2, 0x00fa, 0x0112, - 0x012f, 0x0146, 0x0146, 0x0165, 0x0184, 0x01a3, 0x01c2, 0x01e1, - // Entry 3D40 - 3D7F - 0x01e1, 0x01fd, 0x021e, 0x0243, 0x0261, 0x0278, 0x0290, 0x02a5, - 0x02bb, 0x02d3, 0x02ef, 0x0306, 0x031c, 0x033f, 0x035f, 0x037e, - 0x03a9, 0x03d3, 0x03f0, 0x040e, 0x042b, 0x0448, 0x0467, 0x0486, - 0x04a1, 0x04be, 0x04dd, 0x00dd, 0x00fa, 0x0117, 0x013a, 0x0157, - 0x0176, 0x0176, 0x0193, 0x0193, 0x01b0, 0x01d0, 0x01d0, 0x01f2, - 0x020e, 0x020e, 0x022d, 0x024a, 0x0268, 0x0286, 0x02a3, 0x02bf, - 0x02da, 0x02f5, 0x030f, 0x0329, 0x034f, 0x0372, 0x0392, 0x03af, - 0x03ce, 0x03ec, 0x040b, 0x0427, 0x0445, 0x0462, 0x0483, 0x04a1, - // Entry 3D80 - 3DBF - 0x04c1, 0x04e0, 0x0502, 0x0521, 0x0542, 0x0562, 0x0583, 0x05a1, - 0x05c1, 0x05e0, 0x0600, 0x061d, 0x063c, 0x065a, 0x0679, 0x0695, - 0x06b3, 0x06d0, 0x06f1, 0x070f, 0x072f, 0x074e, 0x076e, 0x078b, - 0x07aa, 0x07c8, 0x07e8, 0x0805, 0x0824, 0x0842, 0x0863, 0x0881, - 0x08a1, 0x08c0, 0x08e3, 0x0903, 0x0925, 0x0946, 0x0968, 0x0987, - 0x09a8, 0x09c6, 0x09e5, 0x0a01, 0x0a21, 0x0a3e, 0x0a5d, 0x0a79, - 0x0a99, 0x0ab6, 0x0ad7, 0x0af5, 0x0b15, 0x0b34, 0x0b53, 0x0b6f, - 0x0b8d, 0x0baa, 0x0bca, 0x0be7, 0x0c06, 0x0c24, 0x0c45, 0x0c63, - // Entry 3DC0 - 3DFF - 0x0c83, 0x0ca2, 0x0cc9, 0x0ced, 0x0d0e, 0x0d2c, 0x0d4c, 0x0d6b, - 0x0d99, 0x0dc4, 0x0de8, 0x0e09, 0x0e2c, 0x0e4e, 0x0e79, 0x0ea1, - 0x0ecb, 0x0ef4, 0x0f1a, 0x0f3d, 0x0f74, 0x0fa8, 0x0fbf, 0x0fd6, - 0x0ff2, 0x100e, 0x102c, 0x104a, 0x107b, 0x10ac, 0x10c9, 0x10e6, - 0x110d, 0x1134, 0x115b, 0x116d, 0x118a, 0x11a7, 0x01a7, 0x01c5, - 0x01e0, 0x01fd, 0x0219, 0x0236, 0x0250, 0x026e, 0x0289, 0x02a7, - 0x02c2, 0x02f0, 0x030e, 0x0329, 0x034f, 0x0372, 0x0398, 0x03bb, - 0x03d8, 0x03f2, 0x040e, 0x0429, 0x0466, 0x04a2, 0x04de, 0x0517, - // Entry 3E00 - 3E3F - 0x0551, 0x0588, 0x05c3, 0x05fb, 0x0634, 0x066a, 0x06a4, 0x06db, - 0x0715, 0x074c, 0x0785, 0x07bb, 0x07f3, 0x0846, 0x0896, 0x08e8, - 0x090d, 0x092f, 0x0953, 0x0976, 0x09b2, 0x09ed, 0x0a29, 0x0a6d, - 0x0aa8, 0x0ad3, 0x0afd, 0x0b28, 0x0b53, 0x0b86, 0x0bb0, 0x0bdb, - 0x0c05, 0x0c30, 0x0c5b, 0x0c8e, 0x0cb8, 0x0ce4, 0x0d10, 0x0d44, - 0x0d6f, 0x0d9a, 0x0dc6, 0x0df1, 0x0e1c, 0x0e48, 0x0e73, 0x0e9f, - 0x0ecb, 0x0ef6, 0x0f22, 0x0f4e, 0x0f78, 0x0fa3, 0x0fce, 0x0ff8, - 0x1023, 0x104e, 0x1078, 0x10a3, 0x10ce, 0x10f9, 0x1124, 0x1151, - // Entry 3E40 - 3E7F - 0x117e, 0x11a9, 0x11d3, 0x11fe, 0x1229, 0x125c, 0x1286, 0x12b0, - 0x12db, 0x130e, 0x1338, 0x1363, 0x138e, 0x13b8, 0x13e3, 0x140d, - 0x1438, 0x146b, 0x1495, 0x14c0, 0x14ea, 0x1515, 0x1540, 0x1573, - 0x159d, 0x15c9, 0x15f4, 0x1620, 0x164c, 0x1680, 0x16ab, 0x16d7, - 0x1702, 0x172e, 0x175a, 0x178e, 0x17b9, 0x17e4, 0x180f, 0x1842, - 0x186c, 0x1897, 0x18c1, 0x18ec, 0x1917, 0x194a, 0x1974, 0x19ac, - 0x19e3, 0x1a23, 0x1a55, 0x1a87, 0x1ab6, 0x1ae5, 0x1b14, 0x1b4e, - 0x1b86, 0x1bbf, 0x1bf8, 0x1c31, 0x1c72, 0x1caa, 0x1cd1, 0x1cf9, - // Entry 3E80 - 3EBF - 0x1d21, 0x1d49, 0x1d79, 0x1da0, 0x1dc7, 0x1def, 0x1e17, 0x1e3f, - 0x1e6f, 0x1e96, 0x1ebe, 0x1ee7, 0x1f10, 0x1f39, 0x1f6a, 0x1f92, - 0x1fc2, 0x1fe9, 0x2019, 0x2040, 0x2068, 0x208f, 0x20b7, 0x20e7, - 0x210e, 0x2136, 0x2166, 0x218d, 0x21b6, 0x21df, 0x2207, 0x2230, - 0x2259, 0x2282, 0x22b3, 0x22db, 0x2318, 0x233f, 0x2367, 0x238f, - 0x23b7, 0x23e7, 0x240e, 0x2449, 0x2483, 0x24be, 0x24f9, 0x2533, - 0x255d, 0x2586, 0x25b0, 0x25da, 0x2603, 0x262d, 0x2656, 0x2680, - 0x26aa, 0x26d3, 0x26fe, 0x2728, 0x2753, 0x277d, 0x27a7, 0x27d2, - // Entry 3EC0 - 3EFF - 0x27fd, 0x2828, 0x2852, 0x287d, 0x28a8, 0x28d1, 0x28fb, 0x2925, - 0x294f, 0x2978, 0x29a2, 0x29cc, 0x29f5, 0x2a1f, 0x2a49, 0x2a73, - 0x2a9f, 0x2acb, 0x2af5, 0x2b1e, 0x2b48, 0x2b72, 0x2b9b, 0x2bc5, - 0x2bef, 0x2c18, 0x2c42, 0x2c6b, 0x2c95, 0x2cbf, 0x2ce8, 0x2d12, - 0x2d3c, 0x2d65, 0x2d90, 0x2dba, 0x2de5, 0x2e10, 0x2e3b, 0x2e65, - 0x2e90, 0x2ebb, 0x2ee5, 0x2f0f, 0x2f39, 0x2f6f, 0x2f99, 0x2fc2, - 0x2fec, 0x3016, 0x303f, 0x3079, 0x30b2, 0x30db, 0x3103, 0x312c, - 0x3154, 0x317e, 0x31a7, 0x31d1, 0x31fa, 0x3225, 0x324f, 0x3277, - // Entry 3F00 - 3F3F - 0x32a0, 0x32c9, 0x32f3, 0x331c, 0x3345, 0x336d, 0x339a, 0x33c7, - 0x33f4, 0x3427, 0x3451, 0x3484, 0x34ae, 0x34e3, 0x350f, 0x3543, - 0x356e, 0x35a3, 0x35cf, 0x3602, 0x362c, 0x3660, 0x368b, 0x36bf, - 0x36ea, 0x371d, 0x3747, 0x377a, 0x37a4, 0x37d1, 0x37fd, 0x382a, - 0x3857, 0x3883, 0x38ae, 0x38d8, 0x3902, 0x3932, 0x3959, 0x3989, - 0x39b0, 0x39e2, 0x3a0b, 0x3a3c, 0x3a64, 0x3a96, 0x3abf, 0x3aef, - 0x3b16, 0x3b47, 0x3b6f, 0x3ba0, 0x3bc8, 0x3bf8, 0x3c1f, 0x3c4f, - 0x3c76, 0x3ca0, 0x3cc9, 0x3cf3, 0x3d1d, 0x3d46, 0x3d6e, 0x3d95, - // Entry 3F40 - 3F7F - 0x3dbc, 0x3de8, 0x3e13, 0x3e3f, 0x3e6b, 0x3e95, 0x3ec0, 0x3eea, - 0x3f14, 0x3f3d, 0x3f67, 0x3f92, 0x3fbc, 0x3fe7, 0x4010, 0x4039, - 0x4066, 0x4096, 0x40ad, 0x40c5, 0x00c5, 0x00f9, 0x012a, 0x015d, - 0x0190, 0x01c4, 0x01f8, 0x022b, 0x025f, 0x0291, 0x02c5, 0x02f6, - 0x0330, 0x0364, 0x0398, 0x03d3, 0x0405, 0x0439, 0x046e, 0x04a1, - 0x04d6, 0x0506, 0x0538, 0x056a, 0x059d, 0x05d2, 0x0605, 0x0639, - 0x066f, 0x06a3, 0x06d9, 0x0712, 0x0744, 0x0778, 0x07a9, 0x07dc, - 0x0810, 0x0841, 0x0873, 0x08a5, 0x08d9, 0x0913, 0x0947, 0x097a, - // Entry 3F80 - 3FBF - 0x09b6, 0x09e8, 0x0a1c, 0x0a4d, 0x0a7f, 0x0ab0, 0x0ae0, 0x0b19, - 0x0b4d, 0x0b7f, 0x0bb1, 0x0be5, 0x0c16, 0x0c49, 0x0c7d, 0x0cb1, - 0x0ce2, 0x0d16, 0x0d4b, 0x0d80, 0x0db5, 0x01b5, 0x01ea, 0x021e, - 0x0252, 0x0286, 0x02c0, 0x02f3, 0x0328, 0x0363, 0x0395, 0x03d0, - 0x0402, 0x0436, 0x0467, 0x0498, 0x04d2, 0x0503, 0x053d, 0x056e, - 0x05a8, 0x05da, 0x0614, 0x064f, 0x068a, 0x06ba, 0x06ec, 0x071c, - 0x074d, 0x077e, 0x07ae, 0x07df, 0x0810, 0x0842, 0x0873, 0x08a4, - 0x08d7, 0x090a, 0x093b, 0x096c, 0x09a0, 0x09d2, 0x0a06, 0x0a38, - // Entry 3FC0 - 3FFF - 0x0a6a, 0x0a9c, 0x0acd, 0x0afe, 0x0b30, 0x0b61, 0x0b91, 0x0bc5, - 0x0bf9, 0x0c2d, 0x0c5f, 0x0c91, 0x0091, 0x00ce, 0x010a, 0x012d, - 0x0150, 0x0176, 0x0199, 0x01bd, 0x01e1, 0x0207, 0x022a, 0x0255, - 0x0274, 0x027d, 0x02aa, 0x02aa, 0x02be, 0x02d2, 0x02e6, 0x02fa, - 0x030e, 0x0322, 0x0336, 0x034a, 0x035e, 0x0373, 0x0388, 0x039d, - 0x03b2, 0x03c7, 0x03dc, 0x03f1, 0x0415, 0x0445, 0x0479, 0x049d, - 0x04c5, 0x04f4, 0x0520, 0x055c, 0x0599, 0x05cb, 0x01cb, 0x01e7, - 0x0204, 0x0224, 0x0245, 0x025f, 0x027a, 0x0295, 0x02b7, 0x02da, - // Entry 4000 - 403F - 0x02f9, 0x0319, 0x0339, 0x035a, 0x037b, 0x039d, 0x03c0, 0x03ed, - 0x0413, 0x0439, 0x0460, 0x048c, 0x04bb, 0x04eb, 0x051c, 0x054e, - 0x0588, 0x05c3, 0x05ff, 0x063c, 0x0674, 0x06ad, 0x06de, 0x0710, - 0x0742, 0x0775, 0x07ad, 0x07e6, 0x07f0, 0x0800, 0x0832, 0x0865, - 0x0874, 0x0887, 0x0894, 0x08a8, 0x08b7, 0x08ca, 0x08d7, 0x08e2, - 0x08f9, 0x0908, 0x0108, 0x0117, 0x0122, 0x0135, 0x014b, 0x0158, - 0x016e, 0x0185, 0x019d, 0x01b6, 0x01d7, 0x01f9, 0x020a, 0x0219, - 0x0227, 0x0236, 0x0248, 0x025c, 0x0273, 0x0284, 0x0284, 0x0299, - // Entry 4040 - 407F - 0x02aa, 0x02bc, 0x02cf, 0x02cf, 0x02ec, 0x030e, 0x032b, 0x033f, - 0x035c, 0x035c, 0x0376, 0x038e, 0x03a8, 0x03c0, 0x03da, 0x03f2, - 0x040d, 0x0426, 0x0440, 0x0458, 0x0479, 0x04aa, 0x04d8, 0x0509, - 0x0537, 0x0567, 0x0594, 0x05c5, 0x05f3, 0x0623, 0x0650, 0x067f, - 0x06ad, 0x06cd, 0x06ea, 0x0709, 0x0725, 0x0743, 0x0760, 0x0787, - 0x07ab, 0x07ca, 0x07e6, 0x0804, 0x0821, 0x0841, 0x085e, 0x087d, - 0x089b, 0x08bb, 0x08d8, 0x08f7, 0x0915, 0x0934, 0x0950, 0x096e, - 0x098b, 0x09ab, 0x09c8, 0x09e7, 0x0a05, 0x0a24, 0x0a40, 0x0a60, - // Entry 4080 - 40BF - 0x0a7d, 0x0a9c, 0x0ab8, 0x0ad8, 0x0af5, 0x0b15, 0x0b32, 0x0b51, - 0x0b6f, 0x0b90, 0x0bae, 0x0bce, 0x0bed, 0x0c0c, 0x0c28, 0x0c46, - 0x0c63, 0x0c82, 0x0c9e, 0x0cbc, 0x0cd9, 0x0cf8, 0x0d14, 0x0d32, - 0x0d4f, 0x0d6e, 0x0d8a, 0x0da8, 0x0dc5, 0x0de4, 0x0e00, 0x0e1e, - 0x0e3b, 0x0e5c, 0x0e7a, 0x0e9a, 0x0eb9, 0x0ed8, 0x0ef4, 0x0f12, - 0x0f2f, 0x0f4e, 0x0f6a, 0x0f88, 0x0fa5, 0x0fc4, 0x0fe0, 0x0ffe, - 0x101b, 0x103a, 0x1056, 0x1074, 0x1091, 0x10b1, 0x10ce, 0x10ed, - 0x110b, 0x112b, 0x1148, 0x1167, 0x1185, 0x11a4, 0x11c0, 0x11de, - // Entry 40C0 - 40FF - 0x11fb, 0x121a, 0x1236, 0x125e, 0x1283, 0x12a2, 0x12be, 0x12dc, - 0x12f9, 0x1335, 0x136e, 0x13aa, 0x13e3, 0x141f, 0x1458, 0x1483, - 0x14ab, 0x00ab, 0x00c4, 0x00c4, 0x00de, 0x00f6, 0x010b, 0x0120, - 0x0136, 0x0149, 0x015d, 0x0177, 0x0192, 0x01a4, 0x01b7, 0x01c6, - 0x01dc, 0x01ef, 0x0200, 0x0214, 0x0227, 0x023a, 0x024f, 0x0263, - 0x0277, 0x028a, 0x029f, 0x02b4, 0x02c8, 0x02d7, 0x02ea, 0x0302, - 0x0317, 0x0332, 0x0349, 0x0360, 0x0380, 0x03a0, 0x03c0, 0x03e0, - 0x0400, 0x0420, 0x0440, 0x0460, 0x0480, 0x04a0, 0x04c0, 0x04e0, - // Entry 4100 - 413F - 0x0500, 0x0520, 0x0540, 0x0560, 0x0580, 0x05a0, 0x05c0, 0x05e0, - 0x0600, 0x0620, 0x0640, 0x0660, 0x0680, 0x06a0, 0x06bd, 0x06d6, - 0x06f4, 0x070f, 0x0721, 0x0737, 0x0755, 0x0773, 0x0791, 0x07af, - 0x07cd, 0x07eb, 0x0809, 0x0827, 0x0845, 0x0863, 0x0881, 0x089f, - 0x08bd, 0x08db, 0x08f9, 0x0917, 0x0935, 0x0953, 0x0971, 0x098f, - 0x09ad, 0x09cb, 0x09e9, 0x0a07, 0x0a25, 0x0a43, 0x0a5f, 0x0a76, - 0x0a93, 0x0aa2, 0x0ac2, 0x0ae3, 0x0b02, 0x0b1f, 0x0b3d, 0x0b58, - 0x0b75, 0x0b91, 0x0bb2, 0x0bd3, 0x0bf4, 0x0c15, 0x0c36, 0x0c58, - // Entry 4140 - 417F - 0x0c7a, 0x0c9c, 0x0cbe, 0x0cee, 0x0d09, 0x0d24, 0x0d3f, 0x0d5a, - 0x0d75, 0x0d91, 0x0dad, 0x0dc9, 0x0de5, 0x0e01, 0x0e1d, 0x0e39, - 0x0e55, 0x0e71, 0x0e8d, 0x0ea9, 0x0ec5, 0x0ee1, 0x0efd, 0x0f19, - 0x0f35, 0x0f51, 0x0f6d, 0x0f89, 0x0fa5, 0x0fc1, 0x0fdd, 0x0ff9, - 0x1015, 0x1031, 0x104d, 0x1069, 0x1085, 0x10a1, 0x10bd, 0x10d9, - 0x10f5, 0x1111, 0x112d, 0x1149, 0x1165, 0x1181, 0x119d, 0x11b9, - 0x11d4, 0x11f8, 0x1221, 0x1238, 0x1256, 0x1279, 0x129c, 0x12b9, - 0x12dc, 0x12ff, 0x131d, 0x1340, 0x135d, 0x1381, 0x13a4, 0x13c7, - // Entry 4180 - 41BF - 0x13e9, 0x140e, 0x1433, 0x1456, 0x1473, 0x1490, 0x14b2, 0x14d4, - 0x14f0, 0x1511, 0x152e, 0x154b, 0x156d, 0x158c, 0x15ab, 0x15ca, - 0x15e9, 0x1606, 0x0206, 0x021f, 0x0239, 0x0253, 0x026e, 0x0288, - 0x02a1, 0x02a1, 0x02bc, 0x02d6, 0x02ef, 0x0309, 0x0324, 0x033e, - 0x033e, 0x0358, 0x0371, 0x038c, 0x03a6, 0x03c0, 0x03da, 0x03da, - 0x03f4, 0x040e, 0x0427, 0x0027, 0x003a, 0x004e, 0x0060, 0x0070, - 0x0084, 0x0096, 0x00a8, 0x00a8, 0x00c6, 0x00df, 0x00f6, 0x0110, - 0x0129, 0x013f, 0x0155, 0x0155, 0x0172, 0x0192, 0x01b3, 0x01cf, - // Entry 41C0 - 41FF - 0x01e4, 0x01e4, 0x01fc, 0x0214, 0x022c, 0x0244, 0x025c, 0x0275, - 0x028e, 0x02a7, 0x02c0, 0x02d9, 0x02f2, 0x030b, 0x030b, 0x0324, - 0x033d, 0x0356, 0x036f, 0x0388, 0x03a1, 0x03ba, 0x03d3, 0x03ec, - 0x0405, 0x041e, 0x0437, 0x0450, 0x0469, 0x0482, 0x049b, 0x04b4, - 0x04cd, 0x04e6, 0x04ff, 0x0518, 0x0531, 0x054a, 0x0563, 0x057c, - 0x0595, 0x0195, 0x01ae, 0x01c7, 0x01e0, 0x01f9, 0x0212, 0x022b, - 0x0244, 0x025d, 0x0276, 0x028f, 0x02a8, 0x02c1, 0x02da, 0x02f3, - 0x030c, 0x0325, 0x033e, 0x0357, 0x0370, 0x0370, 0x0389, 0x03a2, - // Entry 4200 - 423F - 0x03a2, 0x03bb, 0x03d4, 0x03ed, 0x0406, 0x0420, 0x043a, 0x0454, - 0x046e, 0x0488, 0x04a2, 0x04bc, 0x04d6, 0x04f0, 0x050a, 0x0524, - 0x0124, 0x0138, 0x014c, 0x0160, 0x0174, 0x0188, 0x019c, 0x01b0, - 0x01c4, 0x01d8, 0x01ec, 0x0200, 0x0214, 0x0228, 0x023c, 0x023c, - 0x0256, 0x0272, 0x028d, 0x02a9, 0x02c5, 0x02e5, 0x0300, 0x031b, - 0x033b, 0x035a, 0x0375, 0x0391, 0x03ac, 0x03c8, 0x03e4, 0x0401, - 0x041d, 0x0439, 0x0457, 0x0472, 0x048f, 0x04a9, 0x04c4, 0x04da, - 0x04f6, 0x0511, 0x052e, 0x0549, 0x055f, 0x057a, 0x0590, 0x05a6, - // Entry 4240 - 427F - 0x05c1, 0x05d7, 0x05ed, 0x0603, 0x061f, 0x0635, 0x064b, 0x0667, - 0x067d, 0x0693, 0x06b1, 0x06ce, 0x06e4, 0x06fa, 0x0710, 0x0726, - 0x073c, 0x0752, 0x0768, 0x077e, 0x0794, 0x07b0, 0x07c6, 0x07e1, - 0x07f7, 0x080d, 0x0823, 0x0839, 0x084f, 0x0865, 0x087b, 0x0891, - 0x08a7, 0x08bd, 0x08d3, 0x08f0, 0x0910, 0x092e, 0x094a, 0x0966, - 0x097c, 0x0998, 0x09ae, 0x09c4, 0x09ea, 0x0a08, 0x0a2c, 0x0a48, - 0x0a5e, 0x0a74, 0x0a90, 0x0aa6, 0x0abc, 0x0ad2, 0x0ae8, 0x0afe, - 0x0b19, 0x0b2f, 0x0b45, 0x0b5b, 0x0b71, 0x0b87, 0x0ba4, 0x0bc1, - // Entry 4280 - 42BF - 0x0bde, 0x0bfb, 0x0c18, 0x0c35, 0x0c52, 0x0c6f, 0x0c8c, 0x0ca9, - 0x0cc6, 0x0ce3, 0x0d00, 0x0d1d, 0x0d3a, 0x0d57, 0x0d74, 0x0d91, - 0x0dae, 0x0dcb, 0x0de8, 0x0e05, 0x0e22, 0x0e3f, 0x0e5c, 0x0e79, - 0x0e96, 0x0eb3, 0x0ed0, 0x02d0, 0x02ea, 0x0303, 0x0314, 0x0314, - 0x0325, 0x0336, 0x0349, 0x035b, 0x036d, 0x037e, 0x0391, 0x03a4, - 0x03b6, 0x03c7, 0x03db, 0x03ef, 0x0402, 0x0415, 0x0428, 0x043d, - 0x0451, 0x0465, 0x047e, 0x0497, 0x04b2, 0x04cc, 0x04e6, 0x04ff, - 0x051a, 0x0535, 0x054f, 0x0569, 0x0583, 0x059f, 0x05ba, 0x05d5, - // Entry 42C0 - 42FF - 0x05ef, 0x060b, 0x0627, 0x0642, 0x065c, 0x0679, 0x0696, 0x06b2, - 0x06ce, 0x06ea, 0x0708, 0x0725, 0x0742, 0x0342, 0x0359, 0x0374, - 0x0390, 0x03ab, 0x03c7, 0x03e7, 0x040a, 0x0427, 0x0443, 0x0465, - 0x0484, 0x04a6, 0x04c1, 0x04dd, 0x0500, 0x0524, 0x0549, 0x056c, - 0x058e, 0x05b2, 0x05dc, 0x0607, 0x0632, 0x065e, 0x0681, 0x06a3, - 0x06c7, 0x06f1, 0x071c, 0x0747, 0x0772, 0x079f, 0x07be, 0x07e3, - 0x0800, 0x081f, 0x083e, 0x085b, 0x0881, 0x08a9, 0x08c9, 0x08e8, - 0x0916, 0x0935, 0x0953, 0x0970, 0x0990, 0x09b1, 0x09e1, 0x0a02, - // Entry 4300 - 433F - 0x0a21, 0x0a46, 0x0a6d, 0x0a95, 0x0abd, 0x0ae3, 0x0b0a, 0x0b2e, - 0x0b54, 0x0b7b, 0x0b9d, 0x0bc1, 0x0bd4, 0x0bf6, 0x0c0b, 0x0c24, - 0x0c33, 0x0c44, 0x0c56, 0x0c65, 0x0c79, 0x0c8f, 0x0ca4, 0x0cb9, - 0x0ccc, 0x0ce3, 0x0cf3, 0x0d04, 0x0d15, 0x0d26, 0x0d37, 0x0d48, - 0x0d60, 0x0d6f, 0x0d85, 0x0d98, 0x0dac, 0x0db8, 0x01b8, 0x01ca, - 0x01da, 0x01ed, 0x01ff, 0x0219, 0x022b, 0x023e, 0x0252, 0x0267, - 0x027b, 0x0288, 0x029c, 0x029c, 0x02b0, 0x02b0, 0x02cd, 0x02eb, - 0x030b, 0x0325, 0x033d, 0x0355, 0x036e, 0x0389, 0x03a1, 0x03b9, - // Entry 4340 - 437F - 0x03cf, 0x03e8, 0x03ff, 0x041a, 0x0434, 0x044a, 0x0460, 0x047c, - 0x049e, 0x04b7, 0x04ce, 0x04e6, 0x04ff, 0x0519, 0x0530, 0x0547, - 0x055e, 0x057a, 0x0590, 0x05a6, 0x05be, 0x05d5, 0x05ed, 0x0603, - 0x0620, 0x0637, 0x0651, 0x066b, 0x0682, 0x069c, 0x06b4, 0x06cd, - 0x06e8, 0x0704, 0x0720, 0x074b, 0x034b, 0x035a, 0x0369, 0x0378, - 0x0388, 0x0397, 0x03a6, 0x03b5, 0x03c4, 0x03d3, 0x03e3, 0x03f2, - 0x0401, 0x0410, 0x041f, 0x042e, 0x043d, 0x044d, 0x045d, 0x046c, - 0x047b, 0x048b, 0x049a, 0x04a9, 0x04b8, 0x04c8, 0x04d8, 0x04e8, - // Entry 4380 - 43BF - 0x04f7, 0x0506, 0x0106, 0x0115, 0x0125, 0x0134, 0x0143, 0x0154, - 0x0163, 0x0173, 0x0183, 0x0192, 0x01a1, 0x01b0, 0x01bf, 0x01cf, - 0x01de, 0x01ee, 0x01ff, 0x020e, 0x0220, 0x022f, 0x023f, 0x024e, - 0x025d, 0x026e, 0x027d, 0x028d, 0x029c, 0x02ab, 0x02bd, 0x02cc, - 0x02dc, 0x02ec, 0x02fc, 0x030b, 0x031b, 0x032b, 0x033c, 0x034c, - 0x035c, 0x036e, 0x037e, 0x0390, 0x03a0, 0x03b0, 0x03c1, 0x03d2, - 0x03e3, 0x03f4, 0x0404, 0x0416, 0x0016, 0x0031, 0x0047, 0x005d, - 0x0075, 0x008c, 0x00a3, 0x00b9, 0x00d1, 0x00e9, 0x0100, 0x0117, - // Entry 43C0 - 43FF - 0x0131, 0x014b, 0x0164, 0x017d, 0x0196, 0x01b1, 0x01cb, 0x01e5, - 0x0204, 0x0223, 0x0244, 0x0264, 0x0284, 0x02a3, 0x02c4, 0x02e5, - 0x0305, 0x0305, 0x0318, 0x032c, 0x0340, 0x0354, 0x0367, 0x037b, - 0x038f, 0x03a3, 0x03b8, 0x03cb, 0x03df, 0x03f3, 0x0407, 0x041b, - 0x0430, 0x0443, 0x0457, 0x046c, 0x0480, 0x0494, 0x04a8, 0x04bc, - 0x04cf, 0x04e4, 0x04f9, 0x050e, 0x0522, 0x0537, 0x054c, 0x0560, - 0x0574, 0x0589, 0x059f, 0x05b6, 0x05cc, 0x05e4, 0x01e4, 0x01f6, - 0x020b, 0x021d, 0x022f, 0x0243, 0x0259, 0x026b, 0x027d, 0x0291, - // Entry 4400 - 443F - 0x02a2, 0x02b5, 0x02c8, 0x02db, 0x02ef, 0x0300, 0x0312, 0x0328, - 0x033c, 0x034f, 0x0362, 0x0375, 0x0388, 0x039b, 0x03ae, 0x03c1, - 0x03d4, 0x03ee, 0x03ee, 0x0402, 0x0417, 0x042c, 0x0441, 0x0454, - 0x046a, 0x0481, 0x0497, 0x04ae, 0x04c1, 0x04d7, 0x04ec, 0x0503, - 0x051a, 0x0530, 0x0546, 0x055b, 0x0570, 0x0585, 0x0598, 0x05af, - 0x05c6, 0x05df, 0x05f4, 0x060a, 0x061d, 0x0631, 0x0645, 0x0659, - 0x066f, 0x0684, 0x0699, 0x06af, 0x06c4, 0x06d8, 0x06ec, 0x0700, - 0x0714, 0x0732, 0x0751, 0x0771, 0x0792, 0x07b1, 0x03b1, 0x03c5, - // Entry 4440 - 447F - 0x03d9, 0x03ee, 0x0401, 0x0416, 0x0428, 0x043a, 0x044e, 0x0462, - 0x0475, 0x0488, 0x049b, 0x04af, 0x04c4, 0x04d7, 0x04eb, 0x04fe, - 0x0510, 0x0525, 0x0538, 0x054a, 0x055e, 0x0572, 0x0587, 0x059d, - 0x05b2, 0x05c4, 0x05d5, 0x05e6, 0x05f9, 0x01f9, 0x020e, 0x0220, - 0x0232, 0x0244, 0x0257, 0x026a, 0x027d, 0x0290, 0x02a3, 0x02b6, - 0x02c9, 0x02dc, 0x02ef, 0x0302, 0x0315, 0x0328, 0x033b, 0x034f, - 0x0362, 0x0375, 0x0388, 0x039b, 0x03ae, 0x03c1, 0x03d4, 0x03e7, - 0x03fa, 0x040d, 0x0420, 0x0433, 0x0446, 0x0459, 0x046c, 0x047f, - // Entry 4480 - 44BF - 0x0493, 0x04a7, 0x04ba, 0x00ba, 0x00d5, 0x00f2, 0x010f, 0x012c, - 0x0146, 0x0162, 0x0177, 0x018f, 0x01a7, 0x01bd, 0x01d3, 0x01e9, - 0x0202, 0x021c, 0x021c, 0x0239, 0x0256, 0x0273, 0x0291, 0x02ae, - 0x02cc, 0x02ea, 0x0308, 0x0326, 0x0345, 0x0363, 0x0382, 0x039b, - 0x03b4, 0x03cd, 0x03e7, 0x03ff, 0x0419, 0x0433, 0x044d, 0x0467, - 0x0482, 0x049c, 0x04b6, 0x04d0, 0x04e9, 0x0503, 0x051d, 0x0538, - 0x0551, 0x056b, 0x0585, 0x05a0, 0x05b9, 0x05d2, 0x05eb, 0x0604, - 0x061e, 0x0637, 0x0650, 0x066b, 0x0686, 0x06a1, 0x06bd, 0x06d8, - // Entry 44C0 - 44FF - 0x06f4, 0x0710, 0x072c, 0x0748, 0x0765, 0x0781, 0x079e, 0x07b5, - 0x07cc, 0x07e3, 0x07fb, 0x0811, 0x0829, 0x0841, 0x0859, 0x0871, - 0x088a, 0x08a2, 0x08ba, 0x08d2, 0x08e9, 0x0901, 0x0919, 0x0932, - 0x0949, 0x0961, 0x0979, 0x0992, 0x09a9, 0x09c0, 0x09d7, 0x09ee, - 0x0a06, 0x0a1d, 0x0a34, 0x0a47, 0x0a59, 0x0a6c, 0x0a7e, 0x0a92, - 0x0aa3, 0x0ab6, 0x0acb, 0x0add, 0x0af0, 0x0b02, 0x0b15, 0x0b27, - 0x0b39, 0x0b4c, 0x0b5e, 0x0b74, 0x0b88, 0x0b9a, 0x0bae, 0x0bc1, - 0x0bd4, 0x0be5, 0x0bf7, 0x0c09, 0x0c1b, 0x0c2c, 0x0c3f, 0x0c51, - // Entry 4500 - 453F - 0x0c62, 0x0c75, 0x0c87, 0x0c99, 0x0cab, 0x0cbd, 0x0cce, 0x0ce0, - 0x0cf3, 0x0d05, 0x0d17, 0x0d29, 0x0d3a, 0x0d4c, 0x0d5e, 0x0d72, - 0x0d84, 0x0d96, 0x0da8, 0x0dbb, 0x0dcc, 0x0ddd, 0x0dee, 0x0dff, - 0x0e11, 0x0e24, 0x0e35, 0x0e46, 0x0e5a, 0x0e6c, 0x0e7f, 0x0e90, - 0x0ea1, 0x0eb4, 0x0ec7, 0x0eda, 0x0eed, 0x0f00, 0x0f12, 0x0f23, - 0x0f34, 0x0f44, 0x0f54, 0x0f64, 0x0f74, 0x0f84, 0x0f95, 0x0fa6, - 0x0fb7, 0x03b7, 0x03c9, 0x03da, 0x03eb, 0x03fe, 0x0410, 0x0422, - 0x0433, 0x0446, 0x0459, 0x046b, 0x006b, 0x0081, 0x0098, 0x00b0, - // Entry 4540 - 457F - 0x00c7, 0x00df, 0x00f7, 0x0111, 0x0127, 0x013f, 0x0156, 0x016e, - 0x0184, 0x019b, 0x01b4, 0x01cc, 0x01e3, 0x01fa, 0x0211, 0x0227, - 0x023f, 0x0256, 0x026f, 0x0286, 0x029e, 0x02b5, 0x02ce, 0x02e6, - 0x0300, 0x0319, 0x0331, 0x0347, 0x035e, 0x0376, 0x038e, 0x03a5, - 0x03bd, 0x03bd, 0x03d1, 0x03e6, 0x03fc, 0x0411, 0x0427, 0x043d, - 0x0455, 0x0469, 0x047f, 0x0494, 0x04aa, 0x04be, 0x04d3, 0x04ea, - 0x0500, 0x0515, 0x052a, 0x053f, 0x0553, 0x0569, 0x057e, 0x0595, - 0x05aa, 0x05c0, 0x05d5, 0x05ec, 0x0602, 0x061a, 0x0631, 0x0647, - // Entry 4580 - 45BF - 0x065b, 0x0670, 0x0686, 0x069c, 0x06b1, 0x06c7, 0x02c7, 0x02d7, - 0x02e8, 0x02f9, 0x030b, 0x031c, 0x032e, 0x0340, 0x0351, 0x0361, - 0x0372, 0x0383, 0x0395, 0x03a6, 0x03b6, 0x03c7, 0x03d8, 0x03e9, - 0x03fb, 0x040c, 0x041d, 0x042e, 0x0440, 0x0450, 0x0461, 0x0472, - 0x0483, 0x0495, 0x04a6, 0x04b8, 0x04c9, 0x04db, 0x04eb, 0x04fc, - 0x050d, 0x051d, 0x052e, 0x0540, 0x0552, 0x0567, 0x0579, 0x0179, - 0x0196, 0x01b3, 0x01d0, 0x01ed, 0x0209, 0x0227, 0x0244, 0x0262, - 0x027f, 0x029c, 0x02ba, 0x02d7, 0x02f4, 0x0311, 0x032e, 0x034c, - // Entry 45C0 - 45FF - 0x036a, 0x0388, 0x03a5, 0x03c3, 0x03e0, 0x03fe, 0x041c, 0x0439, - 0x0456, 0x0474, 0x0491, 0x04af, 0x04cc, 0x04e9, 0x0507, 0x0526, - 0x0544, 0x0562, 0x057e, 0x059c, 0x05b9, 0x05d7, 0x05f5, 0x0612, - 0x0631, 0x064e, 0x066c, 0x068a, 0x06a8, 0x06c6, 0x06e3, 0x0701, - 0x071f, 0x073d, 0x075b, 0x0778, 0x0378, 0x0398, 0x0398, 0x03ab, - 0x03be, 0x03d1, 0x03e4, 0x03f7, 0x040a, 0x041d, 0x0430, 0x0443, - 0x0456, 0x0469, 0x047c, 0x048f, 0x04a2, 0x04b5, 0x04c8, 0x04dc, - 0x04f0, 0x0503, 0x0517, 0x052b, 0x053e, 0x0552, 0x0565, 0x0578, - // Entry 4600 - 463F - 0x058b, 0x059e, 0x05b1, 0x05c4, 0x05d7, 0x05ea, 0x05fd, 0x0610, - 0x0623, 0x0636, 0x0649, 0x065c, 0x066f, 0x0682, 0x0695, 0x06a8, - 0x06bb, 0x06ce, 0x06e1, 0x06f4, 0x0707, 0x071a, 0x072d, 0x0740, - 0x0753, 0x0766, 0x0779, 0x078c, 0x079f, 0x07b2, 0x07c5, 0x07d8, - 0x07eb, 0x07fe, 0x0811, 0x0824, 0x0837, 0x084a, 0x085d, 0x0870, - 0x0883, 0x0896, 0x08a9, 0x08bc, 0x08cf, 0x08e2, 0x08f8, 0x090b, - 0x091e, 0x0931, 0x0944, 0x0957, 0x096b, 0x097f, 0x0992, 0x09a5, - 0x09b8, 0x09cb, 0x09de, 0x09f1, 0x0a03, 0x0a15, 0x0a27, 0x0a39, - // Entry 4640 - 467F - 0x0a4b, 0x0a5d, 0x0a6f, 0x0a81, 0x0a94, 0x0aa7, 0x0aba, 0x0acc, - 0x0ade, 0x0af0, 0x0b03, 0x0b16, 0x0b29, 0x0b3b, 0x0b4d, 0x0b5f, - 0x0b71, 0x0b83, 0x0b95, 0x0ba7, 0x0bb9, 0x0bcb, 0x0bdd, 0x0bef, - 0x0c01, 0x0c13, 0x0c25, 0x0c37, 0x0c49, 0x0c5b, 0x0c6d, 0x0c7f, - 0x0c91, 0x0ca3, 0x0cb5, 0x0cc7, 0x0cd9, 0x0ceb, 0x0cfd, 0x0d0f, - 0x0d21, 0x0d33, 0x0d45, 0x0d57, 0x0d69, 0x0d7b, 0x0d8d, 0x0d9f, - 0x0db1, 0x0dc3, 0x0dd5, 0x0de7, 0x0df9, 0x0e0b, 0x0e1d, 0x0e2f, - 0x0e41, 0x0e53, 0x0e65, 0x0e77, 0x0e89, 0x0e9b, 0x0ead, 0x0ebf, - // Entry 4680 - 46BF - 0x0ed1, 0x0ee3, 0x0ef5, 0x0f07, 0x0f19, 0x0f2b, 0x0f3d, 0x0f53, - 0x0f69, 0x0f7f, 0x0f95, 0x0fab, 0x0fc1, 0x0fd7, 0x0fed, 0x1003, - 0x1019, 0x102f, 0x1045, 0x105b, 0x1071, 0x1087, 0x109d, 0x10b3, - 0x10c9, 0x10df, 0x10f1, 0x1103, 0x1115, 0x1127, 0x1139, 0x114b, - 0x115d, 0x116f, 0x1181, 0x1193, 0x11a5, 0x11b7, 0x11c9, 0x11db, - 0x11ed, 0x11ff, 0x1211, 0x1223, 0x1235, 0x1247, 0x1259, 0x126b, - 0x127d, 0x128f, 0x12a1, 0x12b3, 0x12c5, 0x12d7, 0x12e9, 0x12fb, - 0x130d, 0x131f, 0x1331, 0x1343, 0x1355, 0x1367, 0x1379, 0x138b, - // Entry 46C0 - 46FF - 0x139d, 0x13af, 0x13c1, 0x13d3, 0x13e5, 0x13f7, 0x1409, 0x141b, - 0x142d, 0x143f, 0x1451, 0x1463, 0x1475, 0x1487, 0x1499, 0x14ab, - 0x14bd, 0x14cf, 0x14e1, 0x14f3, 0x1505, 0x1517, 0x1529, 0x153b, - 0x154d, 0x155f, 0x1571, 0x1583, 0x1595, 0x15a7, 0x15b9, 0x15cb, - 0x15dd, 0x15ef, 0x1601, 0x1613, 0x1625, 0x1637, 0x1649, 0x165b, - 0x166d, 0x167f, 0x1691, 0x16a3, 0x16b5, 0x16c7, 0x16d9, 0x16eb, - 0x16fd, 0x170f, 0x1721, 0x1733, 0x1745, 0x1757, 0x1769, 0x177b, - 0x178d, 0x179f, 0x17b1, 0x17c3, 0x17d5, 0x17e7, 0x17f9, 0x180b, - // Entry 4700 - 473F - 0x181d, 0x182f, 0x1841, 0x1853, 0x1865, 0x1877, 0x1889, 0x189b, - 0x18ad, 0x18bf, 0x18d1, 0x18e3, 0x18f5, 0x1907, 0x1919, 0x192b, - 0x193d, 0x194f, 0x1961, 0x1973, 0x1985, 0x1997, 0x19a9, 0x19bb, - 0x19cd, 0x19df, 0x19f1, 0x1a03, 0x1a15, 0x1a27, 0x0227, 0x023b, - 0x024f, 0x0263, 0x0277, 0x028b, 0x029f, 0x02b3, 0x02c7, 0x02db, - 0x02f2, 0x0309, 0x0320, 0x0337, 0x034b, 0x035f, 0x0373, 0x038b, - 0x03a1, 0x03b6, 0x03cb, 0x03e2, 0x03f7, 0x03f7, 0x0409, 0x041b, - 0x042d, 0x043f, 0x0451, 0x0463, 0x0475, 0x0487, 0x0087, 0x0099, - // Entry 4740 - 477F - 0x00ab, 0x00bd, 0x00cf, 0x00e1, 0x00f4, 0x00f4, 0x0107, 0x0107, - 0x011a, 0x012d, 0x0140, 0x0153, 0x0166, 0x0179, 0x018c, 0x019f, - 0x01b2, 0x01c5, 0x01d8, 0x01eb, 0x01fe, 0x0211, 0x0224, 0x0237, - 0x024a, 0x025d, 0x0270, 0x0283, 0x0296, 0x02a9, 0x02bc, 0x02cf, - 0x02e2, 0x02f5, 0x0308, 0x031b, 0x032e, 0x0341, 0x0354, 0x0367, - 0x037a, 0x038d, 0x03a0, 0x03b3, 0x03c6, 0x03d9, 0x03ec, 0x03ff, - 0x0412, 0x0425, 0x0438, 0x044b, 0x004b, 0x005e, 0x0071, 0x0071, - 0x0084, 0x0084, 0x0097, 0x00b4, 0x00d0, 0x00ed, 0x010b, 0x0125, - // Entry 4780 - 47BF - 0x0140, 0x015d, 0x0179, 0x0195, 0x01b1, 0x01cd, 0x01eb, 0x0206, - 0x0221, 0x023f, 0x025b, 0x0275, 0x0292, 0x02ae, 0x02ca, 0x02e6, - 0x0301, 0x0301, 0x031e, 0x0339, 0x0354, 0x0371, 0x038c, 0x03aa, - 0x03cd, 0x03f1, 0x0415, 0x042b, 0x0440, 0x0456, 0x046d, 0x0480, - 0x0494, 0x04aa, 0x04bf, 0x04d4, 0x04e9, 0x04fe, 0x0515, 0x0529, - 0x0543, 0x0557, 0x056e, 0x0583, 0x0596, 0x05ac, 0x05c1, 0x05d6, - 0x05eb, 0x05ff, 0x061e, 0x063e, 0x0652, 0x0666, 0x067c, 0x0691, - 0x06a6, 0x06ba, 0x06d1, 0x06ed, 0x0703, 0x071e, 0x0733, 0x0749, - // Entry 47C0 - 47FF - 0x0760, 0x0779, 0x078c, 0x07a0, 0x07b6, 0x07cb, 0x07e0, 0x07fb, - 0x0810, 0x082b, 0x0840, 0x085d, 0x0874, 0x088e, 0x08a2, 0x08bc, - 0x08d0, 0x08e7, 0x08fc, 0x090f, 0x0925, 0x093a, 0x094f, 0x096a, - 0x097f, 0x0993, 0x0193, 0x01a7, 0x01bb, 0x01d1, 0x01e6, 0x0205, - 0x021a, 0x022e, 0x0245, 0x0261, 0x0261, 0x0274, 0x0286, 0x0299, - 0x02b2, 0x02c2, 0x02d3, 0x02e5, 0x02f7, 0x0309, 0x031b, 0x032d, - 0x0341, 0x0352, 0x0363, 0x0377, 0x0388, 0x0398, 0x03ab, 0x03bd, - 0x03bd, 0x03cf, 0x03e0, 0x03e0, 0x03f1, 0x0403, 0x0414, 0x0428, - // Entry 4800 - 483F - 0x0441, 0x0456, 0x046b, 0x0481, 0x0497, 0x04ab, 0x04c0, 0x04d5, - 0x04ea, 0x04ff, 0x0514, 0x0529, 0x053f, 0x0554, 0x0569, 0x057f, - 0x0594, 0x05a8, 0x05be, 0x05d3, 0x05e9, 0x05ff, 0x0614, 0x0629, - 0x063e, 0x0656, 0x0673, 0x0688, 0x069f, 0x029f, 0x02b8, 0x02c7, - 0x02d6, 0x02e5, 0x02f4, 0x0303, 0x0312, 0x0321, 0x0330, 0x033f, - 0x034e, 0x035d, 0x036c, 0x037b, 0x038a, 0x039a, 0x03a9, 0x03b8, - 0x03c7, 0x03d6, 0x03e5, 0x03f5, 0x0405, 0x0415, 0x0425, 0x0435, - 0x0444, 0x0044, 0x005a, 0x005a, 0x0078, 0x0096, 0x00b4, 0x00d2, - // Entry 4840 - 487F - 0x00f1, 0x0110, 0x012f, 0x0150, 0x016f, 0x018e, 0x01ad, 0x01ce, - 0x01ed, 0x020e, 0x022d, 0x024e, 0x026d, 0x028d, 0x02ad, 0x02cc, - 0x02ed, 0x030c, 0x032b, 0x034a, 0x0369, 0x038a, 0x03a9, 0x03ca, - 0x03e9, 0x0408, 0x0429, 0x044c, 0x0465, 0x047e, 0x0497, 0x04b0, - 0x04ca, 0x04e4, 0x04fe, 0x0518, 0x0532, 0x054c, 0x0566, 0x0580, - 0x059a, 0x05b5, 0x05d0, 0x05ea, 0x060c, 0x0626, 0x0640, 0x065a, - 0x0674, 0x068e, 0x06a8, 0x06c2, 0x02c2, 0x02eb, 0x030d, 0x032a, - 0x0347, 0x0362, 0x037d, 0x039a, 0x03b6, 0x03d2, 0x03ed, 0x040a, - // Entry 4880 - 48BF - 0x0427, 0x0443, 0x045e, 0x047c, 0x049a, 0x04b7, 0x04d4, 0x04f1, - 0x0510, 0x0110, 0x0133, 0x0156, 0x017b, 0x019f, 0x01c3, 0x01e6, - 0x020b, 0x0230, 0x0254, 0x0278, 0x029c, 0x02c2, 0x02e7, 0x030c, - 0x0330, 0x0356, 0x037c, 0x03a1, 0x03c5, 0x03ec, 0x0413, 0x0439, - 0x045f, 0x0485, 0x04ad, 0x04d4, 0x04fb, 0x0527, 0x0553, 0x0581, - 0x05ae, 0x05db, 0x0607, 0x0635, 0x0663, 0x0690, 0x06b5, 0x06db, - 0x0703, 0x072a, 0x0751, 0x0777, 0x079f, 0x07c7, 0x07ee, 0x0814, - 0x0827, 0x083e, 0x0855, 0x0874, 0x0074, 0x008b, 0x00a2, 0x00a2, - // Entry 48C0 - 48FF - 0x00be, 0x00df, 0x00f7, 0x010e, 0x0122, 0x0137, 0x014b, 0x0160, - 0x0160, 0x0174, 0x0189, 0x019d, 0x019d, 0x01b2, 0x01c7, 0x01dd, - 0x01f2, 0x0208, 0x021d, 0x0231, 0x0246, 0x025a, 0x026f, 0x0283, - 0x0297, 0x02ac, 0x02c0, 0x02d5, 0x02e9, 0x02fd, 0x0311, 0x0325, - 0x0339, 0x034e, 0x0363, 0x0377, 0x038b, 0x039f, 0x03b4, 0x03cb, - 0x03cb, 0x03e4, 0x03f9, 0x0412, 0x0012, 0x0023, 0x0037, 0x004b, - 0x0061, 0x0076, 0x008b, 0x00a3, 0x00c0, 0x00de, 0x00de, 0x00f8, - 0x011b, 0x0138, 0x015b, 0x017a, 0x0196, 0x01b2, 0x01d5, 0x01f1, - // Entry 4900 - 493F - 0x01f1, 0x020c, 0x022b, 0x0248, 0x0264, 0x0281, 0x029d, 0x02ba, - 0x02d7, 0x02f4, 0x0310, 0x032c, 0x0349, 0x0365, 0x0383, 0x03a1, - 0x03c0, 0x03db, 0x03f8, 0x0414, 0x0433, 0x0451, 0x0470, 0x048e, - 0x04ab, 0x04c8, 0x04e8, 0x0505, 0x0522, 0x0540, 0x055c, 0x057a, - 0x059d, 0x05b9, 0x05d5, 0x05f1, 0x060e, 0x062a, 0x0646, 0x0663, - 0x067f, 0x069b, 0x06b7, 0x06d4, 0x06f0, 0x070d, 0x072a, 0x0746, - 0x0763, 0x077f, 0x079c, 0x07b8, 0x07d4, 0x07f1, 0x080d, 0x082b, - 0x0847, 0x0864, 0x0881, 0x089d, 0x08ba, 0x08d6, 0x08f2, 0x090e, - // Entry 4940 - 497F - 0x092d, 0x012d, 0x0144, 0x015a, 0x0171, 0x0188, 0x01a0, 0x01b8, - 0x01cc, 0x01e1, 0x01f3, 0x020a, 0x0222, 0x0239, 0x0251, 0x0267, - 0x027d, 0x0293, 0x02a9, 0x02bf, 0x02d6, 0x02ee, 0x0307, 0x0320, - 0x0335, 0x034a, 0x0362, 0x0378, 0x038f, 0x03a3, 0x03b7, 0x03ce, - 0x03e4, 0x03fa, 0x0411, 0x0427, 0x043d, 0x0454, 0x0469, 0x048b, - 0x04ad, 0x00ad, 0x00c2, 0x00d8, 0x00ed, 0x0105, 0x0122, 0x013d, - 0x015b, 0x0187, 0x01ac, 0x01c6, 0x01e5, 0x0207, 0x0207, 0x0217, - 0x0228, 0x0239, 0x024b, 0x025c, 0x026e, 0x027f, 0x0291, 0x02a1, - // Entry 4980 - 49BF - 0x02b2, 0x02c2, 0x02d3, 0x02e3, 0x02f4, 0x0304, 0x0315, 0x0326, - 0x0337, 0x0349, 0x035b, 0x036c, 0x037e, 0x0390, 0x03a1, 0x03b2, - 0x03c3, 0x03d5, 0x03e6, 0x03f8, 0x040a, 0x041b, 0x042c, 0x043d, - 0x044f, 0x0461, 0x0474, 0x0487, 0x0498, 0x04aa, 0x04bc, 0x04cd, - 0x04df, 0x04f1, 0x0502, 0x0513, 0x0524, 0x0535, 0x0546, 0x0557, - 0x0569, 0x057b, 0x058e, 0x05a1, 0x05b2, 0x01b2, 0x01cb, 0x01f1, - 0x0218, 0x023f, 0x0266, 0x028f, 0x02b8, 0x02db, 0x02fd, 0x0320, - 0x0344, 0x0364, 0x0385, 0x03a8, 0x03ca, 0x03ec, 0x040e, 0x0430, - // Entry 49C0 - 49FF - 0x0454, 0x0475, 0x0496, 0x04ba, 0x04dc, 0x04fc, 0x051f, 0x0541, - 0x0563, 0x0585, 0x05a6, 0x01a6, 0x01c7, 0x01e8, 0x020b, 0x022d, - 0x024e, 0x0272, 0x029b, 0x02c5, 0x02e7, 0x0308, 0x032a, 0x034d, - 0x036c, 0x0396, 0x03b8, 0x03d9, 0x03fa, 0x041b, 0x043c, 0x045f, - 0x0484, 0x04a4, 0x04c7, 0x04e6, 0x0508, 0x0529, 0x0549, 0x0149, - 0x0169, 0x0189, 0x01ab, 0x01cc, 0x01ec, 0x020f, 0x0237, 0x0260, - 0x027c, 0x0297, 0x02b3, 0x02d0, 0x02e9, 0x030d, 0x0329, 0x0344, - 0x035f, 0x037a, 0x0397, 0x03b6, 0x03d0, 0x03ed, 0x0406, 0x0422, - // Entry 4A00 - 4A3F - 0x043d, 0x0457, 0x0057, 0x0073, 0x0096, 0x00ba, 0x00dc, 0x00dc, - 0x00f6, 0x0110, 0x012c, 0x0147, 0x0161, 0x017e, 0x01a0, 0x01a0, - 0x01ba, 0x01d5, 0x01f1, 0x020b, 0x0226, 0x0241, 0x025b, 0x0276, - 0x0292, 0x02ad, 0x02c9, 0x02e5, 0x0302, 0x031d, 0x0339, 0x0355, - 0x0372, 0x038d, 0x03a9, 0x03c5, 0x03e0, 0x03fc, 0x0417, 0x0433, - 0x044f, 0x046c, 0x0488, 0x04a5, 0x04c1, 0x04de, 0x04f9, 0x0515, - 0x0531, 0x054d, 0x0568, 0x0583, 0x059f, 0x05bc, 0x05d8, 0x05f5, - 0x0611, 0x062e, 0x064a, 0x0667, 0x0684, 0x06a0, 0x06be, 0x06d9, - // Entry 4A40 - 4A7F - 0x06f4, 0x070f, 0x072a, 0x0746, 0x0761, 0x077d, 0x0798, 0x07b4, - 0x07cf, 0x07eb, 0x0806, 0x0822, 0x083e, 0x0859, 0x0875, 0x0891, - 0x08ae, 0x08ca, 0x08e7, 0x0902, 0x091e, 0x093a, 0x0957, 0x0972, - 0x098f, 0x018f, 0x01ad, 0x01cc, 0x01eb, 0x020b, 0x022a, 0x024a, - 0x026a, 0x0289, 0x02a9, 0x02c7, 0x02eb, 0x030a, 0x0329, 0x0348, - 0x0368, 0x0387, 0x03a5, 0x03c4, 0x03e3, 0x0402, 0x0421, 0x0441, - 0x0460, 0x0480, 0x049f, 0x04be, 0x04de, 0x04fc, 0x051b, 0x0545, - 0x056e, 0x058e, 0x05ad, 0x05cd, 0x05ec, 0x0611, 0x0630, 0x0650, - // Entry 4A80 - 4ABF - 0x066f, 0x068f, 0x06af, 0x06cf, 0x06ed, 0x070c, 0x0736, 0x075f, - 0x077e, 0x079d, 0x07bd, 0x07e9, 0x0808, 0x0008, 0x0024, 0x0041, - 0x005e, 0x007c, 0x0099, 0x00b7, 0x00d5, 0x00f2, 0x0110, 0x012c, - 0x014e, 0x016b, 0x0188, 0x01a5, 0x01c3, 0x01e0, 0x01fc, 0x0219, - 0x0236, 0x0253, 0x0270, 0x028e, 0x02ab, 0x02c9, 0x02e6, 0x0303, - 0x0321, 0x033d, 0x035a, 0x0382, 0x03a9, 0x03c7, 0x03e4, 0x0402, - 0x041f, 0x0442, 0x045f, 0x047d, 0x049a, 0x04b8, 0x04d6, 0x04f4, - 0x0510, 0x052d, 0x0555, 0x057c, 0x0599, 0x05b6, 0x05d4, 0x05fe, - // Entry 4AC0 - 4AFF - 0x061b, 0x021b, 0x0233, 0x024c, 0x0264, 0x027e, 0x029e, 0x02bf, - 0x02bf, 0x02cd, 0x02db, 0x02eb, 0x02fa, 0x0309, 0x0317, 0x0327, - 0x0337, 0x0346, 0x0355, 0x0367, 0x0379, 0x038a, 0x039b, 0x03ac, - 0x03bf, 0x03d1, 0x03e3, 0x03fa, 0x0411, 0x042a, 0x0442, 0x045a, - 0x0471, 0x048a, 0x04a3, 0x04bb, 0x04d1, 0x04ea, 0x0501, 0x0519, - 0x0119, 0x0130, 0x0144, 0x0157, 0x016e, 0x0185, 0x0194, 0x01a4, - 0x01b3, 0x01c3, 0x01d2, 0x01e2, 0x01f9, 0x0211, 0x0228, 0x0240, - 0x024f, 0x025f, 0x026e, 0x027e, 0x028e, 0x029f, 0x02af, 0x02c0, - // Entry 4B00 - 4B3F - 0x02d1, 0x02e1, 0x02f2, 0x0302, 0x0313, 0x0324, 0x0335, 0x0347, - 0x0358, 0x036a, 0x037b, 0x038b, 0x039c, 0x03ac, 0x03bd, 0x03cd, - 0x03dd, 0x03ee, 0x03fe, 0x040f, 0x041f, 0x042f, 0x043f, 0x044f, - 0x045f, 0x0470, 0x0481, 0x0491, 0x04a1, 0x04b2, 0x04ce, 0x04e9, - 0x0505, 0x0519, 0x0539, 0x054c, 0x0560, 0x0573, 0x0587, 0x05a2, - 0x05be, 0x05d9, 0x05f5, 0x0608, 0x061c, 0x062f, 0x0643, 0x0650, - 0x065c, 0x066f, 0x0685, 0x06a2, 0x06b9, 0x06d8, 0x06f0, 0x02f0, - 0x0301, 0x0312, 0x0325, 0x0337, 0x0349, 0x035a, 0x036d, 0x0380, - // Entry 4B40 - 4B7F - 0x0392, 0x03a3, 0x03b7, 0x03cb, 0x03de, 0x03f1, 0x0404, 0x0419, - 0x042d, 0x0441, 0x045a, 0x0474, 0x0485, 0x0495, 0x04a5, 0x04b7, - 0x04c8, 0x04d9, 0x04e9, 0x04fb, 0x050d, 0x051e, 0x011e, 0x0132, - 0x0149, 0x015d, 0x0170, 0x017f, 0x018f, 0x019e, 0x01ae, 0x01bd, - 0x01cd, 0x01dc, 0x01ec, 0x01fb, 0x020b, 0x021b, 0x022c, 0x023c, - 0x024d, 0x025e, 0x026e, 0x027f, 0x028f, 0x02a0, 0x02b1, 0x02c2, - 0x02d4, 0x02e5, 0x02f8, 0x030a, 0x031b, 0x032c, 0x033c, 0x034d, - 0x035d, 0x036e, 0x037e, 0x038e, 0x039f, 0x03af, 0x03c0, 0x03d0, - // Entry 4B80 - 4BBF - 0x03e0, 0x03f0, 0x0400, 0x0410, 0x0421, 0x0432, 0x0442, 0x0452, - 0x0466, 0x0479, 0x048d, 0x04a0, 0x04b4, 0x04c7, 0x04db, 0x04ee, - 0x0502, 0x0514, 0x0525, 0x053d, 0x0554, 0x0566, 0x0579, 0x0593, - 0x059f, 0x05b2, 0x01b2, 0x01c9, 0x01e0, 0x01f7, 0x020e, 0x0225, - 0x023c, 0x0253, 0x026b, 0x0282, 0x0299, 0x02b0, 0x02c7, 0x02de, - 0x02f5, 0x030c, 0x0323, 0x033a, 0x0352, 0x0368, 0x037f, 0x0395, - 0x03ab, 0x03c1, 0x03d7, 0x03ee, 0x03ee, 0x0405, 0x041b, 0x0431, - 0x0449, 0x0460, 0x0477, 0x048d, 0x04a5, 0x04bd, 0x04d4, 0x00d4, - // Entry 4BC0 - 4BFF - 0x00eb, 0x00ff, 0x0112, 0x0122, 0x0131, 0x0140, 0x014f, 0x0160, - 0x0172, 0x0183, 0x0195, 0x01a7, 0x01b8, 0x01ca, 0x01db, 0x01ed, - 0x01ff, 0x0211, 0x0224, 0x0236, 0x0249, 0x025b, 0x026c, 0x027e, - 0x028f, 0x02a1, 0x02b2, 0x02c3, 0x02d5, 0x02e6, 0x02f8, 0x0309, - 0x031b, 0x032c, 0x033d, 0x034e, 0x035f, 0x0370, 0x0381, 0x0394, - 0x03a7, 0x03bb, 0x03ce, 0x03e2, 0x03f5, 0x0409, 0x041c, 0x0430, - 0x0444, 0x0451, 0x045f, 0x046c, 0x047a, 0x007a, 0x008b, 0x009b, - 0x00ab, 0x00bd, 0x00ce, 0x00df, 0x00ef, 0x0101, 0x0113, 0x0124, - // Entry 4C00 - 4C3F - 0x0137, 0x0143, 0x0156, 0x016a, 0x016a, 0x017b, 0x018c, 0x019d, - 0x01ae, 0x01bf, 0x01d1, 0x01e4, 0x01f6, 0x0209, 0x021b, 0x022e, - 0x0240, 0x0253, 0x0266, 0x0279, 0x028d, 0x02a0, 0x02b4, 0x02c7, - 0x02d9, 0x02ec, 0x02fe, 0x0311, 0x0323, 0x0335, 0x0348, 0x035a, - 0x036d, 0x037f, 0x0391, 0x03a3, 0x03b5, 0x03c7, 0x03d9, 0x03ec, - 0x03ff, 0x0419, 0x042e, 0x0444, 0x0044, 0x005c, 0x0071, 0x0085, - 0x0095, 0x00a6, 0x00b6, 0x00c7, 0x00d7, 0x00e8, 0x0100, 0x0119, - 0x0131, 0x014a, 0x015a, 0x016b, 0x017b, 0x018c, 0x019d, 0x01af, - // Entry 4C40 - 4C7F - 0x01c0, 0x01d2, 0x01e4, 0x01f5, 0x0207, 0x0218, 0x022a, 0x023c, - 0x024e, 0x0261, 0x0273, 0x0286, 0x0298, 0x02a9, 0x02bb, 0x02cc, - 0x02de, 0x02ef, 0x0300, 0x0312, 0x0323, 0x0335, 0x0346, 0x0357, - 0x0368, 0x0379, 0x038b, 0x039c, 0x03ae, 0x03c0, 0x03d1, 0x03e2, - 0x03f7, 0x040b, 0x0420, 0x0434, 0x0449, 0x0465, 0x0482, 0x049e, - 0x04bb, 0x04cf, 0x04e4, 0x04f8, 0x050d, 0x0520, 0x0535, 0x054d, - 0x0565, 0x056f, 0x057c, 0x0590, 0x05a9, 0x05ba, 0x05cd, 0x05df, - 0x05fa, 0x0618, 0x062a, 0x022a, 0x023c, 0x024d, 0x025e, 0x0271, - // Entry 4C80 - 4CBF - 0x0283, 0x0295, 0x02a6, 0x02b9, 0x02cc, 0x02de, 0x02ea, 0x02fe, - 0x0310, 0x0329, 0x033f, 0x0355, 0x0355, 0x036e, 0x0387, 0x03a2, - 0x03bc, 0x03d6, 0x03ef, 0x040a, 0x0425, 0x043f, 0x0459, 0x0476, - 0x0493, 0x04af, 0x04cb, 0x04e7, 0x0505, 0x0522, 0x053f, 0x0561, - 0x0584, 0x0184, 0x0193, 0x01a3, 0x01b2, 0x01c1, 0x01d0, 0x01e0, - 0x01ef, 0x01ff, 0x020f, 0x0220, 0x0230, 0x0241, 0x0252, 0x0263, - 0x0273, 0x0284, 0x0294, 0x02a5, 0x02a5, 0x02b6, 0x02c7, 0x02d9, - 0x02ea, 0x02fc, 0x030d, 0x031d, 0x032e, 0x033e, 0x0350, 0x0361, - // Entry 4CC0 - 4CFF - 0x0371, 0x0381, 0x0392, 0x03a2, 0x03b3, 0x03c4, 0x03d4, 0x03e4, - 0x03f4, 0x0404, 0x0414, 0x0424, 0x0434, 0x0445, 0x0459, 0x046c, - 0x0480, 0x0493, 0x04a6, 0x04ba, 0x04cd, 0x04e1, 0x04f5, 0x0507, - 0x0518, 0x052a, 0x0536, 0x0549, 0x055e, 0x0571, 0x058b, 0x05a3, - 0x05b4, 0x01b4, 0x01c4, 0x01d4, 0x01e4, 0x01f4, 0x0205, 0x0217, - 0x0228, 0x0228, 0x023a, 0x023a, 0x024b, 0x025d, 0x026e, 0x0280, - 0x0280, 0x0292, 0x02a4, 0x02b7, 0x02c9, 0x02dc, 0x02ef, 0x0301, - 0x0312, 0x0324, 0x0335, 0x0347, 0x0358, 0x0369, 0x037b, 0x038c, - // Entry 4D00 - 4D3F - 0x038c, 0x039e, 0x03af, 0x03c0, 0x03d1, 0x03e2, 0x03f3, 0x0404, - 0x0415, 0x0427, 0x0439, 0x044d, 0x004d, 0x005f, 0x0072, 0x0084, - 0x0097, 0x00a9, 0x00bc, 0x00ce, 0x00e1, 0x00f3, 0x0106, 0x0119, - 0x012d, 0x0140, 0x0154, 0x0168, 0x017c, 0x018f, 0x01a3, 0x01b6, - 0x01ca, 0x01de, 0x01f2, 0x0206, 0x021b, 0x022f, 0x0244, 0x0258, - 0x026d, 0x0281, 0x0294, 0x02a8, 0x02bb, 0x02cf, 0x02e2, 0x02f5, - 0x0309, 0x031c, 0x0330, 0x0344, 0x0357, 0x036a, 0x037d, 0x0390, - 0x03a3, 0x03b7, 0x03ca, 0x03dd, 0x03f4, 0x040b, 0x0421, 0x0438, - // Entry 4D40 - 4D7F - 0x044e, 0x0465, 0x047b, 0x0492, 0x04a8, 0x04bf, 0x04d3, 0x04e8, - 0x00e8, 0x00fc, 0x010f, 0x0122, 0x0137, 0x014b, 0x015f, 0x0172, - 0x0187, 0x019c, 0x01b0, 0x01b0, 0x01d5, 0x01ed, 0x0202, 0x0216, - 0x0216, 0x0226, 0x0237, 0x0247, 0x0258, 0x0268, 0x0279, 0x0291, - 0x02a9, 0x02a9, 0x02ba, 0x02cb, 0x02cb, 0x02dc, 0x02ed, 0x02fe, - 0x0310, 0x0321, 0x0333, 0x0345, 0x0356, 0x0368, 0x0379, 0x038b, - 0x039d, 0x03af, 0x03c2, 0x03d4, 0x03e7, 0x03f9, 0x040a, 0x041c, - 0x042d, 0x043f, 0x0450, 0x0050, 0x0061, 0x0073, 0x0084, 0x0096, - // Entry 4D80 - 4DBF - 0x00a7, 0x00b8, 0x00c9, 0x00c9, 0x00da, 0x00ec, 0x00ec, 0x00fd, - 0x010f, 0x0121, 0x0132, 0x0143, 0x0143, 0x0155, 0x016a, 0x017f, - 0x0193, 0x01a8, 0x01bc, 0x01d1, 0x01ed, 0x020a, 0x020a, 0x021f, - 0x0234, 0x0234, 0x0249, 0x025e, 0x0271, 0x0271, 0x027b, 0x027b, - 0x0291, 0x0291, 0x02a3, 0x02c0, 0x02e4, 0x02fd, 0x0316, 0x0332, - 0x034f, 0x034f, 0x036b, 0x0386, 0x03a1, 0x03be, 0x03da, 0x03f6, - 0x0411, 0x0011, 0x002b, 0x0046, 0x0061, 0x007c, 0x0097, 0x0097, - 0x00a4, 0x00b2, 0x00bf, 0x00cd, 0x00da, 0x00e8, 0x00fd, 0x0113, - // Entry 4DC0 - 4DFF - 0x0128, 0x013e, 0x014b, 0x0159, 0x0166, 0x0174, 0x0182, 0x0191, - 0x019f, 0x01ae, 0x01bd, 0x01cd, 0x01db, 0x01ea, 0x01f8, 0x0207, - 0x0216, 0x0226, 0x0235, 0x0245, 0x0254, 0x0264, 0x0273, 0x0281, - 0x0290, 0x029e, 0x02ad, 0x02bb, 0x02ca, 0x02d8, 0x02e7, 0x02f5, - 0x0304, 0x0312, 0x0321, 0x032f, 0x033d, 0x034c, 0x035a, 0x0369, - 0x0377, 0x0386, 0x0395, 0x03a3, 0x03b1, 0x03c3, 0x03d4, 0x03e6, - 0x03f7, 0x0409, 0x0422, 0x043c, 0x0455, 0x046f, 0x0480, 0x0492, - 0x04a3, 0x04b5, 0x04c5, 0x04da, 0x04ec, 0x04fd, 0x050c, 0x051e, - // Entry 4E00 - 4E3F - 0x0536, 0x053d, 0x0548, 0x0552, 0x0563, 0x056d, 0x057c, 0x0592, - 0x05a1, 0x05af, 0x05bd, 0x05cd, 0x05dc, 0x05eb, 0x05f9, 0x0609, - 0x0619, 0x0628, 0x0228, 0x023d, 0x023d, 0x0250, 0x0250, 0x025c, - 0x026c, 0x027d, 0x028d, 0x029e, 0x02ae, 0x02bf, 0x02d7, 0x02f0, - 0x0308, 0x0321, 0x0331, 0x0342, 0x0352, 0x0363, 0x0374, 0x0386, - 0x0397, 0x03a9, 0x03bb, 0x03cc, 0x03de, 0x03ef, 0x0401, 0x0413, - 0x0425, 0x0438, 0x044a, 0x045d, 0x046f, 0x0480, 0x0492, 0x04a3, - 0x04b5, 0x04c6, 0x04d7, 0x04e9, 0x04fa, 0x050c, 0x051d, 0x052e, - // Entry 4E40 - 4E7F - 0x053f, 0x0550, 0x0561, 0x0573, 0x0585, 0x0596, 0x05a7, 0x05bc, - 0x05d0, 0x05e5, 0x05f9, 0x060e, 0x062a, 0x0647, 0x0663, 0x0680, - 0x0694, 0x06ae, 0x06c3, 0x06d7, 0x06f1, 0x0706, 0x071e, 0x0733, - 0x0747, 0x075a, 0x076c, 0x0781, 0x078e, 0x07a7, 0x07b1, 0x03b1, - 0x03c3, 0x03d4, 0x03e5, 0x03f8, 0x040a, 0x041c, 0x042d, 0x0440, - 0x0453, 0x0465, 0x0065, 0x0075, 0x0086, 0x0096, 0x00a7, 0x00b7, - 0x00c8, 0x00e0, 0x00f9, 0x0111, 0x012a, 0x013a, 0x014b, 0x015b, - 0x016c, 0x017d, 0x018f, 0x01a0, 0x01b2, 0x01c4, 0x01d5, 0x01e7, - // Entry 4E80 - 4EBF - 0x01f8, 0x020a, 0x021c, 0x022e, 0x0241, 0x0253, 0x0266, 0x0278, - 0x0289, 0x029b, 0x02ac, 0x02be, 0x02cf, 0x02e0, 0x02f2, 0x0303, - 0x0315, 0x0326, 0x0337, 0x0348, 0x0359, 0x036a, 0x037c, 0x038e, - 0x039f, 0x03b0, 0x03c5, 0x03d9, 0x03ee, 0x0402, 0x0417, 0x0433, - 0x0450, 0x0050, 0x0064, 0x0079, 0x008d, 0x00a2, 0x00ba, 0x00cf, - 0x00e3, 0x00f6, 0x0108, 0x011c, 0x0129, 0x013d, 0x0152, 0x0167, - 0x0180, 0x0199, 0x01b2, 0x01ca, 0x0202, 0x0238, 0x026b, 0x02a5, - 0x02df, 0x02ff, 0x0329, 0x0353, 0x037d, 0x03aa, 0x03d6, 0x0400, - // Entry 4EC0 - 4EFF - 0x0434, 0x0469, 0x0490, 0x04b5, 0x04db, 0x04f5, 0x0513, 0x0532, - 0x0132, 0x013f, 0x014d, 0x015a, 0x0168, 0x0175, 0x0183, 0x0198, - 0x01ae, 0x01c3, 0x01d9, 0x01e6, 0x01f4, 0x0201, 0x020f, 0x021d, - 0x022c, 0x023a, 0x0249, 0x0258, 0x0266, 0x0275, 0x0283, 0x0292, - 0x02a1, 0x02b0, 0x02c0, 0x02cf, 0x02df, 0x02ee, 0x02fc, 0x030b, - 0x0319, 0x0328, 0x0336, 0x0344, 0x0353, 0x0361, 0x0370, 0x037e, - 0x038c, 0x039a, 0x03a8, 0x03b6, 0x03c5, 0x03d4, 0x03e2, 0x03f0, - 0x03ff, 0x0411, 0x0422, 0x0434, 0x0445, 0x0457, 0x0470, 0x048a, - // Entry 4F00 - 4F3F - 0x04a3, 0x04bd, 0x04ce, 0x04e0, 0x04f1, 0x0503, 0x0515, 0x0526, - 0x0536, 0x054b, 0x0555, 0x0566, 0x057c, 0x058a, 0x018a, 0x0199, - 0x01a7, 0x01b5, 0x01c5, 0x01d4, 0x01e3, 0x01f1, 0x0201, 0x0211, - 0x0220, 0x0220, 0x023d, 0x0254, 0x0278, 0x029c, 0x02c0, 0x02e5, - 0x0311, 0x0329, 0x0356, 0x036b, 0x038e, 0x03b8, 0x03e9, 0x03e9, - 0x03f7, 0x0406, 0x0414, 0x0423, 0x0431, 0x0440, 0x044e, 0x045d, - 0x046b, 0x047a, 0x0489, 0x0499, 0x04a8, 0x04b8, 0x04c8, 0x04d7, - 0x04e7, 0x04f6, 0x0506, 0x0516, 0x0526, 0x0537, 0x0547, 0x0558, - // Entry 4F40 - 4F7F - 0x0568, 0x0577, 0x0587, 0x0596, 0x05a6, 0x05b5, 0x05c4, 0x05d4, - 0x05e3, 0x05f3, 0x0602, 0x0611, 0x0620, 0x062f, 0x063e, 0x064e, - 0x065d, 0x066c, 0x067c, 0x068f, 0x06a1, 0x06b4, 0x06c6, 0x06d9, - 0x06eb, 0x06fe, 0x0710, 0x0723, 0x0735, 0x0748, 0x0759, 0x0769, - 0x0369, 0x0379, 0x0388, 0x0397, 0x03a8, 0x03b8, 0x03c8, 0x03d7, - 0x03e8, 0x03f9, 0x0409, 0x0009, 0x0017, 0x0026, 0x0035, 0x0043, - 0x0051, 0x0069, 0x0077, 0x0086, 0x0094, 0x00a2, 0x00b0, 0x00bf, - 0x00ce, 0x00dc, 0x00ea, 0x00f8, 0x0107, 0x0115, 0x0122, 0x0130, - // Entry 4F80 - 4FBF - 0x013f, 0x014d, 0x0165, 0x0174, 0x0183, 0x0192, 0x0192, 0x01af, - 0x01cc, 0x01f2, 0x0203, 0x0215, 0x0226, 0x0238, 0x0249, 0x025b, - 0x026c, 0x027e, 0x028f, 0x02a1, 0x02b3, 0x02c3, 0x02c3, 0x02d2, - 0x02e0, 0x02ee, 0x02fe, 0x030d, 0x031c, 0x032a, 0x033a, 0x034a, - 0x0359, 0x0368, 0x037a, 0x0391, 0x03a2, 0x03b1, 0x03bf, 0x03bf, - 0x03de, 0x03fa, 0x0417, 0x0434, 0x0451, 0x046e, 0x048b, 0x04a8, - 0x04c4, 0x04e0, 0x04fe, 0x051b, 0x0538, 0x0556, 0x0574, 0x0591, - 0x05af, 0x05cd, 0x05eb, 0x060a, 0x0627, 0x0644, 0x0661, 0x067e, - // Entry 4FC0 - 4FFF - 0x069b, 0x06ba, 0x06d9, 0x06f8, 0x0716, 0x0735, 0x0753, 0x0772, - 0x078f, 0x07a9, 0x07c4, 0x07df, 0x07fa, 0x0815, 0x0830, 0x084b, - 0x0865, 0x087f, 0x089b, 0x08b6, 0x08d1, 0x08ed, 0x0909, 0x0924, - 0x0940, 0x095c, 0x0978, 0x0995, 0x09b0, 0x09cb, 0x09e6, 0x0a01, - 0x0a1c, 0x0a39, 0x0a56, 0x0a73, 0x0a8f, 0x0aac, 0x0ac8, 0x0ae5, - 0x0afb, 0x0b10, 0x0b25, 0x0b3c, 0x0b52, 0x0b68, 0x0b7d, 0x0b94, - 0x0bab, 0x0bc1, 0x0bd7, 0x0bf0, 0x0c09, 0x0c21, 0x0c39, 0x0c51, - 0x0c6b, 0x0c84, 0x0c9d, 0x009d, 0x00ab, 0x00ab, 0x00c0, 0x00d5, - // Entry 5000 - 503F - 0x00ea, 0x00ff, 0x0114, 0x0129, 0x013e, 0x0154, 0x0169, 0x017e, - 0x0194, 0x01a9, 0x01be, 0x01d3, 0x01e8, 0x01fe, 0x0213, 0x0229, - 0x023e, 0x0253, 0x0269, 0x027d, 0x0291, 0x02a5, 0x02b9, 0x02cd, - 0x02e2, 0x02f7, 0x0311, 0x032b, 0x0345, 0x035f, 0x0379, 0x0393, - 0x03ad, 0x03c8, 0x03e2, 0x03fe, 0x0415, 0x0434, 0x0456, 0x0473, - 0x0498, 0x04b4, 0x04cb, 0x04ed, 0x050a, 0x0524, 0x0544, 0x0569, - 0x0589, 0x05aa, 0x05c6, 0x05de, 0x0605, 0x0627, 0x0645, 0x0245, - 0x0257, 0x026a, 0x027c, 0x028f, 0x02a1, 0x02b4, 0x02ce, 0x02e9, - // Entry 5040 - 507F - 0x0303, 0x0303, 0x0315, 0x0328, 0x033a, 0x034d, 0x0360, 0x0374, - 0x0387, 0x039b, 0x03af, 0x03c2, 0x03d6, 0x03e9, 0x03fd, 0x0411, - 0x0425, 0x043a, 0x044e, 0x0463, 0x0477, 0x048a, 0x049e, 0x04b1, - 0x04c5, 0x04d8, 0x04eb, 0x04ff, 0x0512, 0x0526, 0x0539, 0x054c, - 0x055f, 0x0572, 0x0585, 0x0599, 0x05ad, 0x05c0, 0x05d3, 0x05ea, - 0x0600, 0x0617, 0x062d, 0x0644, 0x0662, 0x0681, 0x069f, 0x029f, - 0x02b5, 0x02cc, 0x02e2, 0x02f9, 0x0313, 0x032a, 0x0340, 0x0355, - 0x036c, 0x037b, 0x0391, 0x03a9, 0x03bf, 0x03d5, 0x03d5, 0x03e9, - // Entry 5080 - 50BF - 0x03fc, 0x040f, 0x0424, 0x0438, 0x044c, 0x045f, 0x0474, 0x0489, - 0x049d, 0x04b1, 0x04c5, 0x04db, 0x04f0, 0x0505, 0x0519, 0x052f, - 0x0545, 0x055a, 0x056e, 0x0585, 0x059c, 0x05b2, 0x05c8, 0x05de, - 0x05f6, 0x060d, 0x0624, 0x0640, 0x0240, 0x0251, 0x0262, 0x0273, - 0x0285, 0x0296, 0x02a8, 0x02b9, 0x02cb, 0x02dc, 0x02ee, 0x02ff, - 0x0311, 0x0322, 0x0333, 0x0344, 0x0356, 0x0367, 0x0378, 0x038a, - 0x039d, 0x03af, 0x03c0, 0x03d2, 0x03e3, 0x03f4, 0x0405, 0x0416, - 0x0427, 0x0439, 0x044a, 0x045b, 0x046b, 0x006b, 0x0086, 0x00a2, - // Entry 50C0 - 50FF - 0x00bd, 0x00d9, 0x00f4, 0x0110, 0x012b, 0x0147, 0x0162, 0x017e, - 0x0199, 0x01b4, 0x01cf, 0x01eb, 0x0206, 0x0221, 0x023d, 0x025a, - 0x0276, 0x0291, 0x02ad, 0x02c8, 0x02c8, 0x02e3, 0x02fe, 0x0319, - 0x0335, 0x0350, 0x036b, 0x0385, 0x039a, 0x03ae, 0x03c2, 0x03d6, - 0x03ea, 0x03ff, 0x0417, 0x0017, 0x0027, 0x003f, 0x0059, 0x0079, - 0x0092, 0x00ac, 0x00cd, 0x00e8, 0x0102, 0x0113, 0x0124, 0x0140, - 0x0161, 0x017c, 0x019d, 0x01b7, 0x01d7, 0x01f3, 0x0210, 0x022d, - 0x0254, 0x026a, 0x027c, 0x029a, 0x02bc, 0x02df, 0x02fc, 0x0319, - // Entry 5100 - 513F - 0x032a, 0x033b, 0x0358, 0x037f, 0x0390, 0x03aa, 0x03c6, 0x03e2, - 0x03fc, 0x0418, 0x0432, 0x044d, 0x0468, 0x047b, 0x048f, 0x04a2, - 0x04bf, 0x04d0, 0x04e9, 0x0506, 0x0537, 0x055a, 0x056e, 0x0581, - 0x0594, 0x05b1, 0x05c5, 0x05d9, 0x05eb, 0x0607, 0x0623, 0x0660, - 0x0684, 0x06c7, 0x06da, 0x06ef, 0x0700, 0x0712, 0x0725, 0x073a, - 0x074c, 0x0767, 0x077b, 0x078d, 0x07a1, 0x07b2, 0x07cb, 0x07e6, - 0x0806, 0x0817, 0x0833, 0x084f, 0x086c, 0x0880, 0x089f, 0x08b1, - 0x08c4, 0x08d5, 0x08e7, 0x0912, 0x0936, 0x095b, 0x097d, 0x099f, - // Entry 5140 - 517F - 0x09cb, 0x09ed, 0x0a11, 0x0a34, 0x0a56, 0x0a78, 0x0aa2, 0x0ac5, - 0x0ae7, 0x0b09, 0x0b36, 0x0b59, 0x0b7b, 0x0ba7, 0x0bc9, 0x0bed, - 0x0c19, 0x0c3c, 0x0c4e, 0x0c60, 0x0c74, 0x0c88, 0x0c99, 0x0cab, - 0x0cbd, 0x0cd9, 0x0cec, 0x0cfe, 0x0d23, 0x0d36, 0x0d47, 0x0d60, - 0x0d76, 0x0d8f, 0x0da1, 0x0dbe, 0x0dd1, 0x0de3, 0x0df7, 0x0e09, - 0x0e1b, 0x0e2e, 0x0e46, 0x0e63, 0x0e76, 0x0e89, 0x0e99, 0x0eb3, - 0x0ed7, 0x0ee8, 0x0f11, 0x0f2c, 0x0f46, 0x0f61, 0x0f7c, 0x0f95, - 0x0fa8, 0x0fbb, 0x0fcc, 0x0fdd, 0x0ff9, 0x101a, 0x1034, 0x1051, - // Entry 5180 - 51BF - 0x106e, 0x1087, 0x109a, 0x10ae, 0x10c1, 0x10d4, 0x10ef, 0x1113, - 0x1141, 0x115d, 0x117a, 0x119d, 0x11c5, 0x11e1, 0x1202, 0x1224, - 0x1244, 0x126c, 0x1289, 0x12a5, 0x12cc, 0x12e8, 0x1304, 0x1320, - 0x133c, 0x134d, 0x1363, 0x1375, 0x139f, 0x13c1, 0x13e4, 0x140e, - 0x1429, 0x1445, 0x146b, 0x1487, 0x14ab, 0x14c7, 0x14eb, 0x1506, - 0x1521, 0x1547, 0x1563, 0x157e, 0x15a1, 0x15bc, 0x15e7, 0x1609, - 0x1625, 0x1640, 0x165c, 0x167f, 0x16a4, 0x16d1, 0x16ed, 0x1711, - 0x1734, 0x1751, 0x1772, 0x179f, 0x17bb, 0x17da, 0x17f6, 0x181b, - // Entry 51C0 - 51FF - 0x183f, 0x185a, 0x187d, 0x1898, 0x18b4, 0x18d9, 0x18f4, 0x1910, - 0x192c, 0x1948, 0x196d, 0x198a, 0x19a6, 0x19c3, 0x19dd, 0x19f8, - 0x1a1b, 0x1a36, 0x1a49, 0x1a6a, 0x1a7c, 0x1aa4, 0x1ab6, 0x1ae2, - 0x1af6, 0x1b08, 0x1b1a, 0x1b2d, 0x1b45, 0x1b62, 0x1b83, 0x1b95, - 0x1ba8, 0x1bbd, 0x1bd3, 0x1bf3, 0x1c04, 0x1c1d, 0x1c36, 0x1c53, - 0x1c65, 0x1c80, 0x1c9f, 0x1cb3, 0x1cc6, 0x1cde, 0x1cf1, 0x1d15, - 0x1d38, 0x1d55, 0x1d7a, 0x1d96, 0x1daa, 0x1dbd, 0x1dde, 0x1dfb, - 0x1e19, 0x1e31, 0x1e42, 0x1e5f, 0x1e71, 0x1e8d, 0x1eb8, 0x1ed4, - // Entry 5200 - 523F - 0x1efa, 0x1f11, 0x1f23, 0x1f46, 0x1f62, 0x1f83, 0x1f95, 0x1fa7, - 0x1fc3, 0x1fd5, 0x1fe8, 0x1ffc, 0x2011, 0x2022, 0x2038, 0x204e, - 0x2060, 0x2071, 0x208c, 0x20a8, 0x20c3, 0x20df, 0x20fa, 0x2115, - 0x2130, 0x214b, 0x2164, 0x2175, 0x2188, 0x21a4, 0x21c1, 0x21e1, - 0x21ff, 0x221b, 0x222e, 0x223e, 0x2250, 0x2261, 0x2274, 0x2295, - 0x22ba, 0x22cb, 0x22dd, 0x22f3, 0x2308, 0x233d, 0x2354, 0x2365, - 0x2386, 0x2398, 0x23a9, 0x23c5, 0x23e2, 0x23ff, 0x2418, 0x242b, - 0x243c, 0x244d, 0x245f, 0x2470, 0x2489, 0x24a3, 0x24c6, 0x24e2, - // Entry 5240 - 527F - 0x24fd, 0x251a, 0x2535, 0x254f, 0x256c, 0x2588, 0x25a2, 0x25bd, - 0x25de, 0x25f9, 0x2625, 0x263f, 0x265b, 0x2680, 0x26aa, 0x26c4, - 0x26e0, 0x26fb, 0x2715, 0x2730, 0x274a, 0x2765, 0x277f, 0x2799, - 0x27b3, 0x27d5, 0x27f7, 0x2819, 0x2833, 0x2858, 0x2872, 0x288d, - 0x28a7, 0x28c1, 0x28db, 0x28f6, 0x2911, 0x292c, 0x2948, 0x2963, - 0x297e, 0x299b, 0x29b6, 0x29cf, 0x29e9, 0x2a03, 0x2a28, 0x2a43, - 0x2a5d, 0x2a6f, 0x2a8e, 0x2aa0, 0x2ab3, 0x2ac6, 0x2ad9, 0x2aec, - 0x2b09, 0x2b1b, 0x2b3c, 0x2b4e, 0x2b6a, 0x2b89, 0x2b9c, 0x2baf, - // Entry 5280 - 52BF - 0x2bc4, 0x2bfa, 0x2c3c, 0x2c50, 0x2c61, 0x2c7c, 0x2c95, 0x2caf, - 0x2cc1, 0x2cd3, 0x2ce7, 0x2cfa, 0x2d0f, 0x2d30, 0x2d41, 0x2d7b, - 0x2d8d, 0x2d9f, 0x2dbe, 0x2dd0, 0x2de2, 0x2df9, 0x2e0b, 0x2e1d, - 0x2e3c, 0x2e51, 0x2e66, 0x2e77, 0x2e8b, 0x2ea7, 0x2ed3, 0x2ef8, - 0x2f1d, 0x2f3a, 0x2f57, 0x2f7f, 0x2f9d, 0x2fba, 0x2fd8, 0x2ff5, - 0x3012, 0x3030, 0x304e, 0x3075, 0x3092, 0x30b0, 0x30d7, 0x30fa, - 0x3117, 0x313c, 0x3161, 0x317e, 0x319c, 0x31ba, 0x31d8, 0x3205, - 0x3225, 0x3244, 0x3261, 0x327f, 0x329c, 0x32c1, 0x32e0, 0x32fd, - // Entry 52C0 - 52FF - 0x3324, 0x3359, 0x3388, 0x33a7, 0x33d0, 0x33ee, 0x340c, 0x342b, - 0x345f, 0x347b, 0x349e, 0x34c8, 0x34ee, 0x350b, 0x3529, 0x3545, - 0x3559, 0x3577, 0x359e, 0x35b7, 0x35e4, 0x35f9, 0x360b, 0x3627, - 0x3639, 0x3655, 0x3679, 0x368a, 0x369c, 0x36b1, 0x36c4, 0x36d5, - 0x36f0, 0x3702, 0x371d, 0x3739, 0x3756, 0x3778, 0x379a, 0x37bf, - 0x37da, 0x37f7, 0x3814, 0x383a, 0x3855, 0x3879, 0x3897, 0x38ba, - 0x38d5, 0x38f0, 0x3914, 0x3939, 0x3956, 0x396d, 0x398c, 0x39ab, - 0x39c5, 0x39df, 0x39f1, 0x3a05, 0x3a24, 0x3a47, 0x3a63, 0x3a75, - // Entry 5300 - 533F - 0x3a87, 0x3a99, 0x3ab4, 0x3adc, 0x3aed, 0x3b09, 0x3b1f, 0x3b31, - 0x3b43, 0x3b55, 0x3b68, 0x3b7c, 0x3b8d, 0x3b9f, 0x3bb0, 0x3bc2, - 0x3bd3, 0x3bec, 0x3bfe, 0x3c15, 0x3c2a, 0x3c3f, 0x3c52, 0x3c6d, - 0x3c8a, 0x3ca6, 0x3cc3, 0x3cf0, 0x3d11, 0x3d25, 0x3d41, 0x3d65, - 0x3d82, 0x3d9b, 0x3dac, 0x3dbe, 0x3dd1, 0x3ded, 0x3e0f, 0x3e30, - 0x3e44, 0x3e5e, 0x3e70, 0x3e83, 0x3e94, 0x3ead, 0x3ec7, 0x3ee0, - 0x3ef1, 0x3f0a, 0x3f1c, 0x3f2e, 0x3f50, 0x3f7b, 0x3f90, 0x3fae, - 0x3fcd, 0x3ff5, 0x4014, 0x4041, 0x405f, 0x407e, 0x409d, 0x40c6, - // Entry 5340 - 537F - 0x40ee, 0x411f, 0x4146, 0x4165, 0x4179, 0x418a, 0x419d, 0x41af, - 0x41d1, 0x41f4, 0x4216, 0x4251, 0x4273, 0x428a, 0x42a5, 0x42c4, - 0x42f4, 0x4308, 0x432d, 0x434e, 0x4370, 0x4392, 0x43b9, 0x43dc, - 0x43fd, 0x441e, 0x4442, 0x4463, 0x4487, 0x44ad, 0x44be, 0x44d0, - 0x44e2, 0x44f4, 0x4508, 0x4519, 0x4532, 0x454c, 0x4566, 0x4580, - 0x4599, 0x45b2, 0x45cc, 0x45e5, 0x45ff, 0x461c, 0x4630, 0x464e, - 0x466b, 0x4688, 0x46ab, 0x46bc, 0x46ce, 0x46df, 0x46f0, 0x4701, - 0x471b, 0x472d, 0x4747, 0x4762, 0x477e, 0x4799, 0x47b5, 0x47d1, - // Entry 5380 - 53BF - 0x47ed, 0x4808, 0x4824, 0x4840, 0x485d, 0x4879, 0x4894, 0x48af, - 0x48ca, 0x48e5, 0x4901, 0x491c, 0x4933, 0x4945, 0x4968, 0x497d, - 0x498f, 0x49a1, 0x49b4, 0x49cf, 0x49ec, 0x4a0a, 0x4a26, 0x4a44, - 0x4a61, 0x4a7c, 0x4a9e, 0x4ab1, 0x4ac5, 0x4ad9, 0x4aeb, 0x4b00, - 0x4b35, 0x4b6a, 0x4b7e, 0x4b91, 0x4ba5, 0x4bba, 0x4bd1, 0x4be4, - 0x4bff, 0x4c1b, 0x4c2e, 0x4c49, 0x4c66, 0x4c85, 0x4ca2, 0x4cbf, - 0x4cdc, 0x4cfe, 0x4d1e, 0x4d3b, 0x4d58, 0x4d75, 0x4d8a, 0x4d9d, - 0x4db5, 0x4ddf, 0x4df3, 0x4e05, 0x4e29, 0x4e3c, 0x4e51, 0x4e62, - // Entry 53C0 - 53FF - 0x4e78, 0x4e8a, 0x4e9d, 0x4ebf, 0x4ed2, 0x4ee6, 0x4ef7, 0x4f10, - 0x4f22, 0x4f35, 0x4f49, 0x4f5b, 0x4f70, 0x4f82, 0x4f95, 0x4fa6, - 0x4fc0, 0x4fda, 0x4ff4, 0x500a, 0x501c, 0x5051, 0x506b, 0x507d, - 0x5098, 0x50b4, 0x50d0, 0x50ec, 0x5109, 0x5124, 0x5137, 0x5149, - 0x515a, 0x5170, 0x5181, 0x5197, 0x51a9, 0x51bb, 0x51d8, 0x51f3, - 0x5228, 0x5239, 0x524c, 0x525e, 0x5270, 0x5282, 0x52a8, 0x52b8, - 0x52cc, 0x52e0, 0x530f, 0x5333, 0x5365, 0x5376, 0x5387, 0x5398, - 0x53b0, 0x53cb, 0x53e5, 0x540c, 0x5438, 0x544e, 0x5467, 0x548a, - // Entry 5400 - 543F - 0x549d, 0x54ae, 0x54cb, 0x54ed, 0x5509, 0x5522, 0x5536, 0x5549, - 0x5569, 0x5585, 0x5596, 0x55ac, 0x55bd, 0x55da, 0x55f3, 0x5605, - 0x5627, 0x5649, 0x5664, 0x567f, 0x569b, 0x56b6, 0x56da, 0x56fd, - 0x570f, 0x5721, 0x5734, 0x5746, 0x5760, 0x577f, 0x579b, 0x57b7, - 0x57d2, 0x57ee, 0x5810, 0x582c, 0x5847, 0x5862, 0x587e, 0x5899, - 0x58b5, 0x58d0, 0x58ec, 0x5908, 0x5923, 0x593f, 0x595c, 0x5977, - 0x599a, 0x59b5, 0x59d3, 0x59e7, 0x5a03, 0x5a15, 0x5a2f, 0x5a4a, - 0x5a66, 0x5a83, 0x5a96, 0x5aa9, 0x5abe, 0x5ad2, 0x5ae4, 0x5b03, - // Entry 5440 - 547F - 0x5b15, 0x5b26, 0x5b3c, 0x5b5f, 0x5b71, 0x5b84, 0x5b96, 0x5ba7, - 0x5bc0, 0x5bd2, 0x5be4, 0x5c00, 0x5c12, 0x5c25, 0x5c36, 0x5c48, - 0x5c62, 0x5c76, 0x5c88, 0x5ca2, 0x5cbd, 0x5cd7, 0x5cf4, 0x5d20, - 0x5d33, 0x5d4f, 0x5d6b, 0x5d88, 0x5da5, 0x5dd0, 0x5ded, 0x5e00, - 0x5e12, 0x5e25, 0x5e42, 0x5e5e, 0x5e7a, 0x5e95, 0x5eba, 0x5ed5, - 0x5eef, 0x5f0b, 0x5f25, 0x5f40, 0x5f5d, 0x5f81, 0x5fa7, 0x5fc3, - 0x5fd6, 0x5ff3, 0x6005, 0x6017, 0x602a, 0x6049, 0x6067, 0x6091, - 0x60ae, 0x60c1, 0x60e2, 0x60f4, 0x610e, 0x6120, 0x0120, 0x013e, - // Entry 5480 - 54BF - 0x015e, 0x017d, 0x019c, 0x01ba, 0x01da, 0x01fa, 0x0219, 0x023a, - 0x025a, 0x027a, 0x0299, 0x02ba, 0x02db, 0x02fb, 0x0318, 0x0335, - 0x0351, 0x036f, 0x038d, 0x03aa, 0x03ca, 0x03ea, 0x040c, 0x042d, - 0x044e, 0x046e, 0x0490, 0x04b2, 0x04d3, 0x04f3, 0x0513, 0x0535, - 0x0556, 0x0577, 0x0597, 0x05b9, 0x05e8, 0x0609, 0x062a, 0x064a, - 0x066c, 0x068e, 0x06af, 0x06cf, 0x06ef, 0x0711, 0x0740, 0x0761, - 0x0782, 0x07b2, 0x07e1, 0x0800, 0x081f, 0x0840, 0x086e, 0x088e, - 0x08ae, 0x08dd, 0x090c, 0x093a, 0x0969, 0x0999, 0x09c9, 0x09f5, - // Entry 54C0 - 54FF - 0x0a24, 0x0a54, 0x0a84, 0x0ab2, 0x0ae1, 0x0b10, 0x0b40, 0x0b70, - 0x0ba1, 0x0bc4, 0x0be9, 0x0c0d, 0x0c31, 0x0c54, 0x0c73, 0x0c92, - 0x0cb3, 0x0cd3, 0x0d00, 0x0d20, 0x0d4d, 0x0d6d, 0x0d8d, 0x0dad, - 0x0dcd, 0x0df2, 0x0e18, 0x0e3f, 0x0e6e, 0x0e9e, 0x0ec3, 0x0ee9, - 0x0f16, 0x0f45, 0x0f6b, 0x0f8e, 0x0fb6, 0x0fdf, 0x1003, 0x1027, - 0x1051, 0x107b, 0x10a4, 0x10cf, 0x10fa, 0x1124, 0x0124, 0x0158, - 0x0181, 0x01aa, 0x01d6, 0x0203, 0x0203, 0x0223, 0x023f, 0x025b, - 0x027d, 0x029c, 0x02ba, 0x02d8, 0x02fb, 0x0317, 0x0333, 0x034f, - // Entry 5500 - 553F - 0x036d, 0x0389, 0x03a7, 0x03c3, 0x03e7, 0x0403, 0x041f, 0x043d, - 0x0458, 0x0473, 0x0495, 0x04b2, 0x04cd, 0x04e8, 0x0509, 0x0528, - 0x0544, 0x0563, 0x058e, 0x05ae, 0x05ca, 0x05f0, 0x0616, 0x0633, - 0x064f, 0x066a, 0x0685, 0x06a0, 0x06bc, 0x06dc, 0x06f7, 0x0712, - 0x0728, 0x0749, 0x076e, 0x0792, 0x07bc, 0x07e0, 0x0805, 0x0829, - 0x084e, 0x0872, 0x088e, 0x08ad, 0x08ce, 0x08f9, 0x0922, 0x093f, - 0x095a, 0x097e, 0x09a2, 0x09c4, 0x09ef, 0x0a0b, 0x0a31, 0x0a4d, - 0x0a6a, 0x0a85, 0x0aa8, 0x0acb, 0x0ae8, 0x0b05, 0x0b2f, 0x0b4d, - // Entry 5540 - 557F - 0x0b79, 0x0b9a, 0x0bc1, 0x0bdc, 0x0c09, 0x0c23, 0x0c3d, 0x0c5a, - 0x0c74, 0x0c99, 0x0caf, 0x0cc5, 0x0cdb, 0x0cf1, 0x0d07, 0x0d1d, - 0x0d33, 0x0d5b, 0x0d71, 0x0d94, 0x0daa, 0x0dc0, 0x0dd6, 0x0dec, - 0x0e02, 0x0e18, 0x0e2e, 0x0e44, 0x0e5a, 0x0e70, 0x0e86, 0x0e9c, - 0x0eb2, 0x0ec8, 0x0ede, 0x0ef4, 0x0f0a, 0x0f20, 0x0f36, 0x0f55, - 0x0f75, 0x0f9e, 0x0fd0, 0x0ff7, 0x100d, 0x1023, 0x1039, 0x104f, - 0x1065, 0x107b, 0x1091, 0x10a7, 0x10bd, 0x10d3, 0x10e9, 0x1109, - 0x1129, 0x1154, 0x1174, 0x1193, 0x11b3, 0x11d2, 0x11f1, 0x1210, - // Entry 5580 - 55BF - 0x1232, 0x1248, 0x125e, 0x127e, 0x129d, 0x12bd, 0x12e2, 0x1301, - 0x1333, 0x135d, 0x137c, 0x139e, 0x13b4, 0x13ca, 0x13eb, 0x1408, - 0x1424, 0x1440, 0x146e, 0x148b, 0x14a5, 0x14cb, 0x14f2, 0x1516, - 0x1536, 0x1555, 0x1573, 0x1594, 0x15b7, 0x15d7, 0x15ff, 0x161c, - 0x1640, 0x1661, 0x1681, 0x169c, 0x16c0, 0x16dd, 0x16f5, 0x1710, - 0x172c, 0x1748, 0x1763, 0x1788, 0x17ac, 0x17c8, 0x17e4, 0x1806, - 0x1829, 0x1844, 0x185f, 0x187d, 0x189d, 0x18b9, 0x18cb, 0x18ed, - 0x1915, 0x0115, 0x012d, 0x0145, 0x015d, 0x0175, 0x018d, 0x01a6, - // Entry 55C0 - 55FF - 0x01be, 0x01d7, 0x01f0, 0x0208, 0x0220, 0x0238, 0x0250, 0x0268, - 0x0280, 0x0298, 0x02b0, 0x02c9, 0x02e1, 0x02f9, 0x0311, 0x032a, - 0x0342, 0x035a, 0x0372, 0x038a, 0x03a2, 0x03ba, 0x03d2, 0x03ea, - 0x0402, 0x041a, 0x0432, 0x044a, 0x0462, 0x047a, 0x0492, 0x04ab, - 0x04c3, 0x04db, 0x04f3, 0x050b, 0x0523, 0x053b, 0x0553, 0x056b, - 0x0584, 0x059c, 0x05b4, 0x05cd, 0x05e5, 0x05fe, 0x0616, 0x062e, - 0x0647, 0x065f, 0x0677, 0x068f, 0x06a7, 0x06bf, 0x06d7, 0x06ef, - 0x0707, 0x071f, 0x0737, 0x074f, 0x0767, 0x077f, 0x0797, 0x07af, - // Entry 5600 - 563F - 0x07c7, 0x07df, 0x07f7, 0x080f, 0x0827, 0x083f, 0x0857, 0x086f, - 0x0887, 0x089f, 0x08b7, 0x08cf, 0x08e7, 0x08ff, 0x0917, 0x0930, - 0x0948, 0x0960, 0x0978, 0x0990, 0x09a8, 0x09c0, 0x09d9, 0x09f2, - 0x0a0b, 0x0a23, 0x0a3b, 0x0a53, 0x0a6b, 0x0a83, 0x0a9b, 0x0ab3, - 0x0acb, 0x0ae4, 0x0afc, 0x0b14, 0x0b2c, 0x0b44, 0x0b5c, 0x0b74, - 0x0b8c, 0x0ba4, 0x0bbc, 0x0bd4, 0x0bec, 0x0c04, 0x0c1c, 0x0c34, - 0x0c4c, 0x0c64, 0x0c7c, 0x0c94, 0x0cac, 0x0cc4, 0x0cdc, 0x0cf4, - 0x0d0d, 0x0d25, 0x0d3d, 0x0d55, 0x0d6d, 0x0d85, 0x0d9d, 0x0db5, - // Entry 5640 - 567F - 0x0dcd, 0x0de5, 0x0dfd, 0x0e15, 0x0e2d, 0x0e45, 0x0e5d, 0x0e75, - 0x0e8d, 0x0ea5, 0x0ebd, 0x0ed5, 0x0eee, 0x0f06, 0x0f1e, 0x0f36, - 0x0f4e, 0x0f67, 0x0f7f, 0x0f97, 0x0faf, 0x0fc8, 0x0fe0, 0x0ff8, - 0x1010, 0x1028, 0x1040, 0x1058, 0x1070, 0x1088, 0x10a0, 0x10b8, - 0x10d0, 0x10e8, 0x1101, 0x1119, 0x1131, 0x114a, 0x1162, 0x117a, - 0x1193, 0x11ac, 0x11c5, 0x11de, 0x11f7, 0x1210, 0x1229, 0x1242, - 0x125b, 0x1273, 0x128b, 0x12a4, 0x12bc, 0x12d4, 0x12ed, 0x1305, - 0x131d, 0x1335, 0x134d, 0x1365, 0x137d, 0x1395, 0x13ad, 0x13c5, - // Entry 5680 - 56BF - 0x13dd, 0x13f5, 0x140d, 0x1425, 0x143e, 0x1457, 0x1470, 0x1489, - 0x14a2, 0x14bb, 0x14d4, 0x14ed, 0x1505, 0x151d, 0x1535, 0x154d, - 0x1565, 0x157d, 0x1595, 0x15ad, 0x15c6, 0x15de, 0x15f7, 0x160f, - 0x1627, 0x163f, 0x1657, 0x166f, 0x1687, 0x169f, 0x16b8, 0x16d0, - 0x16e9, 0x1701, 0x1719, 0x1731, 0x174a, 0x1762, 0x177a, 0x1792, - 0x17aa, 0x17c2, 0x17da, 0x17f2, 0x180a, 0x1823, 0x183b, 0x1853, - 0x186b, 0x1883, 0x189b, 0x18b3, 0x18cc, 0x18e4, 0x18fc, 0x1914, - 0x192c, 0x1945, 0x195d, 0x1975, 0x198d, 0x19a5, 0x19bd, 0x19d5, - // Entry 56C0 - 56FF - 0x19ed, 0x1a05, 0x1a1d, 0x1a35, 0x1a4d, 0x1a65, 0x1a7e, 0x1a96, - 0x1aae, 0x1ac6, 0x1ade, 0x1af6, 0x1b0e, 0x1b26, 0x1b3e, 0x1b57, - 0x1b6f, 0x1b87, 0x1b9f, 0x1bb7, 0x1bcf, 0x1be7, 0x1bff, 0x1c17, - 0x1c2f, 0x1c47, 0x1c60, 0x1c78, 0x1c90, 0x1ca8, 0x1cc0, 0x1cd8, - 0x1cf0, 0x1d09, 0x1d21, 0x1d3a, 0x1d52, 0x1d6a, 0x1d82, 0x1d9a, - 0x1db2, 0x1dca, 0x1de2, 0x1dfb, 0x1e13, 0x1e2c, 0x1e44, 0x1e5d, - 0x1e75, 0x1e8d, 0x1ea5, 0x1ebd, 0x1ed6, 0x1eef, 0x1f08, 0x1f20, - 0x1f38, 0x1f50, 0x1f68, 0x1f80, 0x1f98, 0x1fb0, 0x1fc8, 0x1fe1, - // Entry 5700 - 573F - 0x1ff9, 0x2012, 0x202b, 0x2043, 0x205b, 0x2073, 0x208b, 0x20a4, - 0x20bc, 0x20d4, 0x20ec, 0x2104, 0x211c, 0x2134, 0x214c, 0x2164, - 0x217c, 0x2195, 0x21ad, 0x21c5, 0x21dd, 0x21f5, 0x220d, 0x2225, - 0x223e, 0x2256, 0x226e, 0x2286, 0x229e, 0x22b6, 0x22ce, 0x22e6, - 0x22fe, 0x2316, 0x232e, 0x2347, 0x235f, 0x2378, 0x2390, 0x23a8, - 0x23c0, 0x23d8, 0x23f0, 0x2408, 0x2421, 0x2439, 0x2451, 0x246a, - 0x2482, 0x249a, 0x24b2, 0x24ca, 0x24e2, 0x24fa, 0x2512, 0x252a, - 0x2542, 0x255a, 0x2572, 0x258a, 0x25a2, 0x25ba, 0x25d2, 0x25eb, - // Entry 5740 - 577F - 0x2603, 0x261b, 0x2633, 0x264b, 0x2663, 0x267b, 0x2693, 0x26ac, - 0x26c4, 0x26dc, 0x26f4, 0x270c, 0x2725, 0x273d, 0x2756, 0x276e, - 0x2787, 0x279f, 0x27b7, 0x27cf, 0x27e7, 0x27ff, 0x2817, 0x282f, - 0x2847, 0x285f, 0x2877, 0x288f, 0x28a7, 0x28bf, 0x28d7, 0x28f0, - 0x2908, 0x2920, 0x2938, 0x2950, 0x2969, 0x2981, 0x2999, 0x29b1, - 0x29ca, 0x29e3, 0x29fb, 0x2a13, 0x2a2c, 0x2a44, 0x2a5c, 0x2a74, - 0x2a8c, 0x2aa4, 0x2abc, 0x2ad4, 0x2aed, 0x2b05, 0x2b1d, 0x2b36, - 0x2b4f, 0x2b68, 0x2b81, 0x2b9a, 0x2bb3, 0x2bcc, 0x2be5, 0x2bfd, - // Entry 5780 - 57BF - 0x2c15, 0x2c2d, 0x2c46, 0x2c5e, 0x2c77, 0x2c8f, 0x2ca8, 0x2cc0, - 0x2cd8, 0x2cf0, 0x2d08, 0x2d20, 0x2d39, 0x2d51, 0x2d69, 0x2d82, - 0x2d9a, 0x2db2, 0x2dca, 0x2de2, 0x2dfb, 0x2e13, 0x2e2b, 0x2e43, - 0x2e5c, 0x2e74, 0x2e8c, 0x2ea5, 0x2ebe, 0x2ed6, 0x2eee, 0x2f06, - 0x2f1e, 0x2f36, 0x2f4e, 0x2f66, 0x2f7f, 0x2f97, 0x2faf, 0x2fc7, - 0x2fdf, 0x2ff7, 0x300f, 0x3027, 0x303f, 0x3057, 0x306f, 0x3087, - 0x309f, 0x30b7, 0x30cf, 0x30e7, 0x30ff, 0x3117, 0x312f, 0x3147, - 0x315f, 0x3177, 0x318f, 0x31a8, 0x31c1, 0x31d9, 0x31f1, 0x3209, - // Entry 57C0 - 57FF - 0x3221, 0x3239, 0x3251, 0x3269, 0x3282, 0x329a, 0x32b2, 0x32ca, - 0x32e2, 0x32fa, 0x3312, 0x332a, 0x3342, 0x335b, 0x3373, 0x338c, - 0x33a4, 0x33bd, 0x33d5, 0x33ed, 0x3406, 0x341e, 0x3436, 0x344e, - 0x3466, 0x347e, 0x3497, 0x34b0, 0x34c9, 0x34e2, 0x34fb, 0x3515, - 0x352e, 0x3547, 0x3560, 0x3579, 0x3592, 0x35ab, 0x35c4, 0x35dd, - 0x35f6, 0x360f, 0x3628, 0x3641, 0x365b, 0x3674, 0x368d, 0x36a6, - 0x36bf, 0x36d8, 0x36f1, 0x370a, 0x3723, 0x373c, 0x3755, 0x376e, - 0x3787, 0x37a0, 0x37ba, 0x37d3, 0x37ed, 0x3806, 0x381f, 0x3838, - // Entry 5800 - 583F - 0x3851, 0x386a, 0x3883, 0x389c, 0x38b6, 0x38cf, 0x38e8, 0x3901, - 0x391a, 0x3934, 0x394c, 0x3965, 0x397d, 0x3995, 0x39ad, 0x39c5, - 0x39de, 0x39f6, 0x3a0f, 0x3a28, 0x3a41, 0x3a5a, 0x3a73, 0x3a8c, - 0x3aa4, 0x3abc, 0x3ad4, 0x3aec, 0x3b05, 0x3b1e, 0x3b37, 0x3b4f, - 0x3b67, 0x3b7f, 0x3b97, 0x3baf, 0x3bc7, 0x3bdf, 0x3bf7, 0x3c0f, - 0x3c28, 0x3c40, 0x3c59, 0x3c71, 0x3c89, 0x3ca1, 0x3cb9, 0x3cd2, - 0x3cea, 0x3d03, 0x3d1b, 0x3d33, 0x3d4b, 0x3d63, 0x3d7c, 0x3d94, - 0x3dad, 0x3dc5, 0x3ddd, 0x3df5, 0x3e0e, 0x3e26, 0x3e3e, 0x3e56, - // Entry 5840 - 587F - 0x3e6f, 0x3e88, 0x3ea1, 0x3eba, 0x3ed2, 0x3eea, 0x3f02, 0x3f1a, - 0x3f32, 0x3f4a, 0x3f62, 0x3f7a, 0x3f92, 0x3faa, 0x3fc2, 0x3fda, - 0x3ff2, 0x400a, 0x4023, 0x403c, 0x4054, 0x406c, 0x4085, 0x409d, - 0x40b5, 0x40ce, 0x40e6, 0x40fe, 0x4116, 0x412e, 0x4146, 0x415e, - 0x4176, 0x418e, 0x41a6, 0x41be, 0x41d6, 0x41ee, 0x4206, 0x421e, - 0x4236, 0x424e, 0x4266, 0x427f, 0x4297, 0x42b0, 0x42c9, 0x42e1, - 0x42f9, 0x4311, 0x4329, 0x4341, 0x4359, 0x4371, 0x438a, 0x43a2, - 0x43ba, 0x43d2, 0x43ea, 0x4402, 0x441a, 0x4433, 0x444b, 0x4463, - // Entry 5880 - 58BF - 0x447b, 0x4493, 0x44ab, 0x44c3, 0x44db, 0x44f3, 0x450b, 0x4523, - 0x453b, 0x4553, 0x456b, 0x4583, 0x459b, 0x45b4, 0x45cc, 0x45e4, - 0x45fc, 0x4614, 0x462d, 0x4645, 0x465d, 0x4675, 0x468d, 0x46a5, - 0x46bd, 0x46d5, 0x46ed, 0x4706, 0x471f, 0x4737, 0x474f, 0x4767, - 0x4780, 0x4798, 0x47b0, 0x47c8, 0x47e0, 0x47f8, 0x4810, 0x4828, - 0x4840, 0x4858, 0x4871, 0x488a, 0x48a2, 0x48ba, 0x48d2, 0x48ea, - 0x4902, 0x491a, 0x4932, 0x494a, 0x4962, 0x497b, 0x4993, 0x49ab, - 0x49c3, 0x49db, 0x49f3, 0x4a0b, 0x4a23, 0x4a3b, 0x4a53, 0x4a6b, - // Entry 58C0 - 58FF - 0x4a83, 0x4a9b, 0x4ab3, 0x4acb, 0x4ae4, 0x4afc, 0x4b14, 0x4b2c, - 0x4b44, 0x4b5d, 0x4b75, 0x4b8e, 0x4ba6, 0x4bbf, 0x4bd7, 0x4bef, - 0x4c08, 0x4c20, 0x4c38, 0x4c50, 0x4c68, 0x4c80, 0x4c99, 0x4cb1, - 0x4cc9, 0x4ce1, 0x4cf9, 0x4d11, 0x4d29, 0x4d41, 0x4d59, 0x4d71, - 0x4d89, 0x4da1, 0x4db9, 0x4dd1, 0x4de9, 0x4e01, 0x4e19, 0x4e32, - 0x4e4a, 0x4e63, 0x4e7b, 0x4e93, 0x4eab, 0x4ec3, 0x4edb, 0x4ef3, - 0x4f0b, 0x4f23, 0x4f3b, 0x4f54, 0x4f6d, 0x4f85, 0x4f9d, 0x4fb5, - 0x4fcd, 0x4fe5, 0x4ffd, 0x5015, 0x502d, 0x5045, 0x505d, 0x5075, - // Entry 5900 - 593F - 0x508d, 0x50a5, 0x50bd, 0x50d5, 0x50ed, 0x5105, 0x511e, 0x5136, - 0x514e, 0x5166, 0x517e, 0x5196, 0x51ae, 0x51c7, 0x51df, 0x51f7, - 0x520f, 0x5228, 0x5240, 0x5258, 0x5270, 0x5288, 0x52a0, 0x52b8, - 0x52d0, 0x52e8, 0x5300, 0x5318, 0x5330, 0x5349, 0x5362, 0x537b, - 0x5394, 0x53ad, 0x53c6, 0x53df, 0x53f8, 0x5411, 0x5429, 0x5442, - 0x545a, 0x5472, 0x548a, 0x54a2, 0x54ba, 0x54d3, 0x54ec, 0x5504, - 0x551c, 0x5534, 0x554c, 0x5565, 0x557e, 0x5597, 0x55af, 0x55c8, - 0x55e1, 0x55f9, 0x5611, 0x5629, 0x5641, 0x5659, 0x5671, 0x5689, - // Entry 5940 - 597F - 0x56a1, 0x56ba, 0x56d3, 0x56ec, 0x5705, 0x571e, 0x5737, 0x5750, - 0x5769, 0x5782, 0x579b, 0x57b4, 0x57cd, 0x57e5, 0x57fd, 0x5815, - 0x582e, 0x5846, 0x585e, 0x5876, 0x588e, 0x58a6, 0x58bf, 0x58d7, - 0x58f0, 0x5908, 0x5921, 0x5939, 0x5952, 0x596a, 0x5982, 0x599b, - 0x59b3, 0x59cb, 0x59e3, 0x59fb, 0x5a14, 0x5a2c, 0x5a44, 0x5a5c, - 0x5a75, 0x5a8d, 0x5aa5, 0x5abd, 0x5ad6, 0x5aee, 0x5b06, 0x5b1e, - 0x5b36, 0x5b4e, 0x5b66, 0x5b7f, 0x5b97, 0x5bb0, 0x5bc8, 0x5be0, - 0x5bf8, 0x5c10, 0x5c29, 0x5c41, 0x5c59, 0x5c71, 0x5c8a, 0x5ca2, - // Entry 5980 - 59BF - 0x5cbb, 0x5cd3, 0x5ceb, 0x5d03, 0x5d1b, 0x5d33, 0x5d4b, 0x5d64, - 0x5d7c, 0x5d94, 0x5dac, 0x5dc4, 0x5ddc, 0x5df5, 0x5e0e, 0x5e26, - 0x5e3e, 0x5e57, 0x5e6f, 0x5e87, 0x5ea0, 0x5eb8, 0x5ed1, 0x5ee9, - 0x5f01, 0x5f19, 0x5f31, 0x5f49, 0x5f61, 0x5f79, 0x5f91, 0x5fa9, - 0x5fc2, 0x5fdb, 0x5ff4, 0x600d, 0x6025, 0x603e, 0x6057, 0x606f, - 0x6088, 0x60a0, 0x60b9, 0x60d1, 0x60e9, 0x6101, 0x6119, 0x6131, - 0x6149, 0x6161, 0x6179, 0x6191, 0x61a9, 0x61c2, 0x61db, 0x61f4, - 0x620d, 0x6226, 0x623f, 0x6258, 0x6271, 0x628a, 0x62a2, 0x62bb, - // Entry 59C0 - 59FF - 0x62d4, 0x62ed, 0x6306, 0x631f, 0x6338, 0x6351, 0x636a, 0x6383, - 0x639c, 0x63b5, 0x63ce, 0x63e7, 0x6400, 0x6419, 0x6433, 0x644d, - 0x6466, 0x647f, 0x6498, 0x64b1, 0x64ca, 0x64e3, 0x64fc, 0x6515, - 0x652e, 0x6547, 0x6560, 0x6579, 0x6592, 0x65ab, 0x65c4, 0x65dd, - 0x65f6, 0x660f, 0x6628, 0x6641, 0x665a, 0x6673, 0x668c, 0x66a5, - 0x66be, 0x02be, 0x02d7, 0x02f0, 0x0309, 0x0322, 0x033b, 0x0354, - 0x036d, 0x0386, 0x039f, 0x03b8, 0x03d2, 0x03eb, 0x0404, 0x041d, - 0x0436, 0x044f, 0x0468, 0x0481, 0x049a, 0x04b3, 0x04cc, 0x04e5, - // Entry 5A00 - 5A3F - 0x04fe, 0x0517, 0x0530, 0x0549, 0x0562, 0x057c, 0x0595, 0x05ae, - 0x05c7, 0x05e0, 0x05f9, 0x0612, 0x062b, 0x0644, 0x065d, 0x0676, - 0x068f, 0x06a8, 0x06c1, 0x06db, 0x06f4, 0x070d, 0x0727, 0x0740, - 0x0759, 0x0772, 0x078b, 0x07a5, 0x07be, 0x07d8, 0x07f2, 0x080b, - 0x0824, 0x083d, 0x0856, 0x086f, 0x0888, 0x08a1, 0x08ba, 0x08d3, - 0x08ec, 0x0905, 0x091e, 0x0937, 0x0950, 0x0969, 0x0982, 0x099b, - 0x09b4, 0x09cd, 0x09e6, 0x0a00, 0x0a1a, 0x0a34, 0x0a4d, 0x0a66, - 0x0a7f, 0x0a98, 0x0ab1, 0x0aca, 0x0ae3, 0x0afc, 0x0b15, 0x0b2e, - // Entry 5A40 - 5A7F - 0x0b47, 0x0b60, 0x0b79, 0x0b92, 0x0bab, 0x0bc4, 0x0bdd, 0x0bf6, - 0x0c0f, 0x0c28, 0x0c41, 0x0c5a, 0x0c73, 0x0c8c, 0x0ca5, 0x0cbe, - 0x0cd7, 0x0cf0, 0x0d09, 0x0d22, 0x0d3b, 0x0d55, 0x0d6e, 0x0d88, - 0x0da1, 0x0dba, 0x0dd4, 0x0ded, 0x0e07, 0x0e20, 0x0e3a, 0x0e53, - 0x0e6c, 0x0e86, 0x0ea0, 0x0eba, 0x0ed3, 0x0eed, 0x0f07, 0x0f20, - 0x0f39, 0x0f53, 0x0f6d, 0x0f87, 0x0fa0, 0x0fb9, 0x0fd2, 0x0fec, - 0x1006, 0x101f, 0x1038, 0x1051, 0x106a, 0x1083, 0x109d, 0x10b6, - 0x10cf, 0x10e8, 0x1101, 0x111a, 0x1133, 0x114c, 0x1165, 0x117e, - // Entry 5A80 - 5ABF - 0x1197, 0x11b1, 0x11ca, 0x11e3, 0x11fc, 0x1215, 0x122e, 0x1247, - 0x1260, 0x1279, 0x1292, 0x12ab, 0x12c5, 0x12de, 0x12f7, 0x1310, - 0x1329, 0x1342, 0x135b, 0x1374, 0x138d, 0x13a6, 0x13bf, 0x13d8, - 0x13f1, 0x140a, 0x1423, 0x143c, 0x1455, 0x146e, 0x1487, 0x14a0, - 0x14b9, 0x14d2, 0x14eb, 0x1504, 0x151d, 0x1536, 0x154f, 0x1568, - 0x1581, 0x159a, 0x15b3, 0x15cc, 0x15e5, 0x15fe, 0x1617, 0x1630, - 0x1649, 0x1662, 0x167b, 0x1694, 0x16ad, 0x16c6, 0x16df, 0x16f8, - 0x1711, 0x172a, 0x1743, 0x175c, 0x1775, 0x178e, 0x17a7, 0x17c0, - // Entry 5AC0 - 5AFF - 0x17d9, 0x17f2, 0x180b, 0x1824, 0x183d, 0x1856, 0x186f, 0x1888, - 0x18a1, 0x18ba, 0x18d3, 0x18ec, 0x1905, 0x191e, 0x1937, 0x1950, - 0x196a, 0x1984, 0x199d, 0x19b6, 0x19cf, 0x19e8, 0x1a01, 0x1a1b, - 0x1a34, 0x1a4d, 0x1a67, 0x1a80, 0x1a99, 0x1ab2, 0x1acb, 0x1ae4, - 0x1afd, 0x1b17, 0x1b30, 0x1b4a, 0x1b63, 0x1b7c, 0x1b95, 0x1bae, - 0x1bc7, 0x1be0, 0x1bf9, 0x1c12, 0x1c2b, 0x1c44, 0x1c5d, 0x1c77, - 0x1c90, 0x1ca9, 0x1cc2, 0x1cdb, 0x1cf4, 0x1d0d, 0x1d26, 0x1d3f, - 0x1d58, 0x1d71, 0x1d8a, 0x1da3, 0x1dbc, 0x1dd5, 0x1dee, 0x1e07, - // Entry 5B00 - 5B3F - 0x1e20, 0x1e39, 0x1e52, 0x1e6b, 0x1e84, 0x1e9d, 0x1eb6, 0x1ecf, - 0x1ee8, 0x1f01, 0x1f1a, 0x1f33, 0x1f4c, 0x1f65, 0x1f7e, 0x1f97, - 0x1fb0, 0x1fc9, 0x1fe2, 0x1ffb, 0x2014, 0x202d, 0x2046, 0x205f, - 0x2079, 0x2092, 0x20ab, 0x20c4, 0x20dd, 0x20f6, 0x210f, 0x2128, - 0x2141, 0x215a, 0x2173, 0x218c, 0x21a5, 0x21be, 0x21d7, 0x21f0, - 0x2209, 0x2222, 0x223b, 0x2254, 0x226d, 0x2286, 0x229f, 0x22b9, - 0x22d2, 0x22eb, 0x2304, 0x231d, 0x2336, 0x2350, 0x2369, 0x2382, - 0x239b, 0x23b4, 0x23cd, 0x23e7, 0x2400, 0x2419, 0x2432, 0x244b, - // Entry 5B40 - 5B7F - 0x2464, 0x247d, 0x2496, 0x24af, 0x24c8, 0x24e1, 0x24fb, 0x2514, - 0x252d, 0x2546, 0x255f, 0x2578, 0x2591, 0x25aa, 0x25c3, 0x25dc, - 0x25f5, 0x260e, 0x2627, 0x2640, 0x2659, 0x2672, 0x268b, 0x26a4, - 0x26bd, 0x26d6, 0x26ef, 0x2709, 0x2722, 0x273b, 0x2755, 0x276f, - 0x2789, 0x27a2, 0x27bb, 0x27d4, 0x27ed, 0x2807, 0x2821, 0x283b, - 0x2854, 0x286d, 0x2886, 0x289f, 0x28b8, 0x28d1, 0x28ea, 0x2903, - 0x291c, 0x2935, 0x294e, 0x2967, 0x2980, 0x2999, 0x29b2, 0x29cb, - 0x29e4, 0x29fd, 0x2a16, 0x2a2f, 0x2a48, 0x2a61, 0x2a7a, 0x2a94, - // Entry 5B80 - 5BBF - 0x2aad, 0x2ac6, 0x2adf, 0x2af8, 0x2b11, 0x2b2b, 0x2b44, 0x2b5d, - 0x2b76, 0x2b8f, 0x2ba9, 0x2bc2, 0x2bdb, 0x2bf4, 0x2c0e, 0x2c27, - 0x2c40, 0x2c59, 0x2c72, 0x2c8b, 0x2ca4, 0x2cbd, 0x2cd6, 0x2cef, - 0x2d08, 0x2d22, 0x2d3b, 0x2d5d, 0x2d77, 0x2d90, 0x2da9, 0x2dc2, - 0x2ddc, 0x2df5, 0x2e0e, 0x2e27, 0x2e40, 0x2e59, 0x2e72, 0x2e91, - 0x2eaa, 0x2ec3, 0x2edc, 0x2ef5, 0x2f0e, 0x2f27, 0x2f40, 0x2f59, - 0x2f72, 0x2f8b, 0x2fa4, 0x2fbd, 0x2fd6, 0x2fef, 0x3008, 0x3021, - 0x304e, 0x307a, 0x3093, 0x30ac, 0x30c5, 0x30de, 0x30f7, 0x3110, - // Entry 5BC0 - 5BFF - 0x3129, 0x3142, 0x315b, 0x3174, 0x318d, 0x31a6, 0x31bf, 0x31d8, - 0x31f1, 0x320a, 0x3223, 0x323c, 0x3255, 0x326e, 0x3287, 0x32a0, - 0x32b9, 0x32d2, 0x32eb, 0x3304, 0x331d, 0x3336, 0x334f, 0x3368, - 0x3381, 0x339a, 0x33b3, 0x33cc, 0x33e5, 0x33fe, 0x3417, 0x3430, - 0x3449, 0x3462, 0x347c, 0x3495, 0x34ae, 0x34c7, 0x34e0, 0x34f9, - 0x3512, 0x352b, 0x3545, 0x355e, 0x3577, 0x3590, 0x35a9, 0x35c2, - 0x35db, 0x35f4, 0x360d, 0x3626, 0x363f, 0x3658, 0x3671, 0x368a, - 0x36a3, 0x36bc, 0x36d5, 0x36ee, 0x3707, 0x3720, 0x3739, 0x3752, - // Entry 5C00 - 5C3F - 0x376b, 0x3784, 0x379d, 0x37b6, 0x37cf, 0x37e8, 0x3801, 0x381a, - 0x3833, 0x384c, 0x3865, 0x387e, 0x3897, 0x38b0, 0x38c9, 0x38e2, - 0x38fb, 0x3914, 0x392d, 0x3946, 0x395f, 0x3978, 0x3991, 0x39aa, - 0x39c3, 0x39dc, 0x39f5, 0x3a0e, 0x3a27, 0x3a40, 0x3a59, 0x3a72, - 0x3a8b, 0x3aa4, 0x3abd, 0x3ad6, 0x3aef, 0x3b08, 0x3b21, 0x3b3a, - 0x3b53, 0x3b6c, 0x3b85, 0x3b9e, 0x3bb7, 0x3bd0, 0x3be9, 0x3c02, - 0x3c1b, 0x001b, 0x003a, 0x0058, 0x0081, 0x00a7, 0x00c4, 0x00e3, - 0x0101, 0x011e, 0x0140, 0x016b, 0x0193, 0x01b2, 0x01d0, 0x01eb, - // Entry 5C40 - 5C7F - 0x0208, 0x0224, 0x0243, 0x025f, 0x027b, 0x029a, 0x02b5, 0x02cd, - 0x02ec, 0x0306, 0x0322, 0x0340, 0x035c, 0x0377, 0x0395, 0x03b1, - 0x03d2, 0x03f0, 0x040e, 0x042f, 0x044d, 0x0466, 0x0481, 0x04a2, - 0x04be, 0x04d7, 0x04f7, 0x0518, 0x0530, 0x054d, 0x0566, 0x057e, - 0x0598, 0x05b2, 0x05cd, 0x05eb, 0x0606, 0x061e, 0x063f, 0x0658, - 0x0674, 0x068d, 0x06a8, 0x06c1, 0x06d9, 0x06f2, 0x070a, 0x0728, - 0x0743, 0x075c, 0x077f, 0x07a3, 0x07be, 0x07da, 0x07f6, 0x0810, - 0x082a, 0x0843, 0x085e, 0x0877, 0x0892, 0x08aa, 0x08c3, 0x08de, - // Entry 5C80 - 5CBF - 0x08f7, 0x090f, 0x0927, 0x0940, 0x0958, 0x096f, 0x0987, 0x099f, - 0x09b8, 0x09d3, 0x09f4, 0x0a0d, 0x0a28, 0x0a46, 0x0a65, 0x0a7f, - 0x0a9a, 0x0ab6, 0x0ace, 0x0ae9, 0x0b0b, 0x0b2e, 0x0b4f, 0x0b6c, - 0x0b8c, 0x0ba4, 0x0bc1, 0x0bdf, 0x0bfd, 0x0c1d, 0x0c3e, 0x0c5c, - 0x0c77, 0x0c94, 0x0cb0, 0x0ccb, 0x0ce5, 0x0cfe, 0x0d1f, 0x0d3d, - 0x0d57, 0x0d73, 0x0d8c, 0x0da5, 0x0dc0, 0x0de1, 0x0dfc, 0x0e14, - 0x0e2f, 0x0e4c, 0x0e68, 0x0e84, 0x0ea4, 0x0ebd, 0x0ed7, 0x0eef, - 0x0f0a, 0x0f2a, 0x0f47, 0x0f5f, 0x0f7a, 0x0f93, 0x0faa, 0x0fc2, - // Entry 5CC0 - 5CFF - 0x0fdb, 0x0ffc, 0x1014, 0x102c, 0x1049, 0x1063, 0x1081, 0x109b, - 0x10b6, 0x10d3, 0x10ed, 0x1113, 0x1130, 0x114a, 0x1166, 0x1181, - 0x11a7, 0x11c6, 0x11df, 0x11fa, 0x1218, 0x1232, 0x124b, 0x1267, - 0x1280, 0x1299, 0x12b4, 0x12cc, 0x12e5, 0x12ff, 0x131b, 0x1335, - 0x1352, 0x136c, 0x138d, 0x13a6, 0x13c3, 0x13e2, 0x13fb, 0x1416, - 0x142e, 0x144b, 0x1467, 0x1484, 0x14a0, 0x14ba, 0x14d2, 0x14ec, - 0x1504, 0x151e, 0x1537, 0x1554, 0x156f, 0x1586, 0x15a0, 0x15b8, - 0x15d4, 0x15f3, 0x160e, 0x1626, 0x163f, 0x1659, 0x1674, 0x168b, - // Entry 5D00 - 5D3F - 0x16a3, 0x16bc, 0x16d5, 0x16ed, 0x1709, 0x1722, 0x173b, 0x175c, - 0x1775, 0x178e, 0x17ab, 0x17c3, 0x17dc, 0x17f6, 0x1811, 0x1829, - 0x1844, 0x185f, 0x187b, 0x1895, 0x18ae, 0x18ce, 0x18e8, 0x1902, - 0x191b, 0x1934, 0x194d, 0x1969, 0x1989, 0x19a2, 0x19ba, 0x19d2, - 0x19ea, 0x1a02, 0x1a1a, 0x1a33, 0x1a4b, 0x1a63, 0x1a7c, 0x1a96, - 0x1aaf, 0x1ac9, 0x1ae3, 0x1b00, 0x1b19, 0x1b33, 0x1b4d, 0x1b66, - 0x1b80, 0x1b9f, 0x1bb8, 0x1bd3, 0x1bec, 0x1c04, 0x1c1c, 0x1c38, - 0x1c51, 0x1c69, 0x1c83, 0x1c9d, 0x1cb9, 0x1cd2, 0x1ced, 0x1d05, - // Entry 5D40 - 5D7F - 0x1d21, 0x1d41, 0x1d5d, 0x1d74, 0x1d8d, 0x1da8, 0x1dc6, 0x1ddf, - 0x1dfb, 0x1e16, 0x1e2f, 0x1e48, 0x1e63, 0x1e7c, 0x1e97, 0x1eaf, - 0x1ec7, 0x1ee2, 0x1efb, 0x1f15, 0x1f2e, 0x1f49, 0x1f61, 0x1f7b, - 0x1f94, 0x1fad, 0x1fc7, 0x1fe4, 0x1fff, 0x201a, 0x2033, 0x204b, - 0x2066, 0x207f, 0x2097, 0x20b2, 0x20cc, 0x20e8, 0x2101, 0x2119, - 0x2132, 0x214b, 0x2165, 0x217e, 0x2196, 0x21b1, 0x21cc, 0x21e5, - 0x21fe, 0x2216, 0x222f, 0x2248, 0x2264, 0x227e, 0x2297, 0x22b2, - 0x22cc, 0x22e6, 0x2301, 0x2318, 0x2334, 0x234c, 0x2364, 0x237c, - // Entry 5D80 - 5DBF - 0x2394, 0x23ae, 0x23c8, 0x23de, 0x23f6, 0x240d, 0x2426, 0x2440, - 0x2459, 0x2470, 0x2488, 0x24a1, 0x24b9, 0x24d0, 0x24e9, 0x2501, - 0x251a, 0x2532, 0x254f, 0x2566, 0x257f, 0x259e, 0x25b6, 0x25ce, - 0x25e7, 0x2600, 0x261a, 0x2632, 0x264a, 0x2663, 0x267b, 0x2693, - 0x26ab, 0x26c6, 0x26df, 0x26f8, 0x2710, 0x2729, 0x2743, 0x275b, - 0x2773, 0x2790, 0x27a9, 0x27c1, 0x27da, 0x27f2, 0x280d, 0x2826, - 0x283f, 0x285a, 0x2873, 0x288d, 0x28a8, 0x28c2, 0x28db, 0x28f3, - 0x290f, 0x2928, 0x2942, 0x295f, 0x297b, 0x2993, 0x29ac, 0x29c8, - // Entry 5DC0 - 5DFF - 0x29e1, 0x2a00, 0x2a18, 0x2a30, 0x2a52, 0x2a76, 0x2a8f, 0x2aa9, - 0x2ac2, 0x2adc, 0x2af3, 0x2b0d, 0x2b27, 0x2b41, 0x2b5c, 0x2b76, - 0x2b8f, 0x2ba8, 0x2bbf, 0x2bd8, 0x2bf4, 0x2c11, 0x2c2d, 0x2c47, - 0x2c60, 0x2c79, 0x2c92, 0x2cab, 0x2cc3, 0x2cdc, 0x2cf4, 0x2d14, - 0x2d2c, 0x2d46, 0x2d60, 0x2d7a, 0x2d93, 0x2dae, 0x2dc6, 0x2de0, - 0x2dfa, 0x2e12, 0x2e2a, 0x2e46, 0x2e5f, 0x2e76, 0x2e8f, 0x2ea8, - 0x2ec1, 0x2edd, 0x2efd, 0x2f16, 0x2f2f, 0x2f48, 0x2f61, 0x2f79, - 0x2f92, 0x2fad, 0x2fc6, 0x2fde, 0x2ff7, 0x3011, 0x3029, 0x3042, - // Entry 5E00 - 5E3F - 0x305b, 0x3076, 0x3090, 0x30ae, 0x30ca, 0x30e2, 0x30fb, 0x3111, - 0x3129, 0x313f, 0x3155, 0x316d, 0x318b, 0x31a3, 0x31bb, 0x31dd, - 0x31f6, 0x320f, 0x3229, 0x3243, 0x3264, 0x3282, 0x329a, 0x32b2, - 0x32cb, 0x32e4, 0x3303, 0x331b, 0x3333, 0x334b, 0x3363, 0x337a, - 0x3391, 0x33aa, 0x33c2, 0x33dd, 0x33f5, 0x340d, 0x3426, 0x3444, - 0x345b, 0x3472, 0x348a, 0x34a1, 0x34b9, 0x34d0, 0x34e8, 0x3500, - 0x3517, 0x352f, 0x3547, 0x355f, 0x3578, 0x358f, 0x35a5, 0x35bc, - 0x35d3, 0x35eb, 0x3603, 0x361b, 0x3632, 0x364a, 0x3663, 0x367d, - // Entry 5E40 - 5E7F - 0x3695, 0x36ae, 0x36c8, 0x36de, 0x36f6, 0x370f, 0x3726, 0x373f, - 0x3758, 0x3770, 0x3789, 0x37a0, 0x37ba, 0x37d2, 0x37ea, 0x3801, - 0x381a, 0x3833, 0x384c, 0x3864, 0x387c, 0x3893, 0x38aa, 0x38c3, - 0x38db, 0x38f7, 0x3910, 0x3928, 0x3941, 0x3959, 0x3970, 0x3987, - 0x399f, 0x39b6, 0x39cf, 0x39e7, 0x39fe, 0x3a15, 0x3a2e, 0x3a46, - 0x3a5e, 0x3a78, 0x3a91, 0x0291, 0x029e, 0x02ac, 0x02b9, 0x02c7, - 0x02d4, 0x02e1, 0x02ed, 0x02fb, 0x030a, 0x0318, 0x0326, 0x0334, - 0x0344, 0x0351, 0x0360, 0x036e, 0x037b, 0x0388, 0x0394, 0x03a1, - // Entry 5E80 - 5EBF - 0x03af, 0x03be, 0x03cb, 0x03d8, 0x03e4, 0x03f1, 0x03ff, 0x040c, - 0x041a, 0x0427, 0x0435, 0x0035, 0x0043, 0x0050, 0x005d, 0x006c, - 0x007a, 0x0088, 0x0095, 0x00a4, 0x00b3, 0x00c1, 0x00c1, 0x00ca, - 0x00da, 0x00da, 0x00ef, 0x0102, 0x0115, 0x0128, 0x013c, 0x0150, - 0x0164, 0x0179, 0x018e, 0x01a1, 0x01b6, 0x01c9, 0x01dc, 0x01f0, - 0x0203, 0x0216, 0x022a, 0x023d, 0x0250, 0x0263, 0x0278, 0x028b, - 0x02a1, 0x02b3, 0x02c5, 0x02d8, 0x02ea, 0x02fd, 0x030f, 0x0321, - 0x0321, 0x033e, 0x035a, 0x0376, 0x0396, 0x03b7, 0x03ca, 0x03ca, - // Entry 5EC0 - 5EFF - 0x03e1, 0x03f8, 0x040e, 0x0424, 0x043b, 0x0452, 0x0468, 0x047e, - 0x0494, 0x04aa, 0x04c1, 0x04d8, 0x04ef, 0x0506, 0x051d, 0x0534, - 0x054b, 0x0562, 0x0578, 0x058e, 0x05a5, 0x05bc, 0x05d2, 0x05e8, - 0x05fe, 0x0614, 0x062b, 0x0642, 0x065c, 0x0678, 0x0692, 0x06ac, - 0x06c7, 0x06e1, 0x06fc, 0x0717, 0x0731, 0x074c, 0x0766, 0x0781, - 0x079d, 0x07b8, 0x07d4, 0x07f0, 0x080a, 0x0823, 0x083d, 0x0857, - 0x0870, 0x0888, 0x08a1, 0x08bb, 0x08d5, 0x08ee, 0x0908, 0x0922, - 0x0942, 0x095d, 0x0978, 0x0992, 0x09af, 0x09ca, 0x09e5, 0x0a01, - // Entry 5F00 - 5F3F - 0x0a1b, 0x0a36, 0x0a50, 0x0a68, 0x0a7e, 0x0a9c, 0x029c, 0x02b3, - 0x02c9, 0x02df, 0x02f7, 0x030e, 0x0325, 0x033b, 0x0353, 0x036b, - 0x0382, 0x0382, 0x039a, 0x03b6, 0x03d7, 0x03f3, 0x0417, 0x0437, - 0x0454, 0x0054, 0x006d, 0x0083, 0x0098, 0x00b9, 0x00d3, 0x00e9, - 0x00ff, 0x0115, 0x012b, 0x013f, 0x015c, 0x0178, 0x018d, 0x01a2, - 0x01b7, 0x01df, 0x0200, 0x021a, 0x0239, 0x0257, 0x0275, 0x0275, - 0x0292, 0x02ad, 0x02c7, 0x02e2, 0x02fe, 0x0318, 0x0333, 0x034e, - 0x0369, 0x0384, 0x039f, 0x03ba, 0x03d4, 0x03ee, 0x0408, 0x0422, - // Entry 5F40 - 5F7F - 0x043d, 0x0457, 0x0471, 0x0071, 0x007f, 0x008d, 0x009e, 0x00ad, - 0x00bb, 0x00ca, 0x00e0, 0x00ee, 0x00fc, 0x010b, 0x0119, 0x0127, - 0x0139, 0x014a, 0x0159, 0x0168, 0x0176, 0x0185, 0x0197, 0x01ad, - 0x01bc, 0x01cc, 0x01da, 0x01e9, 0x01f8, 0x0208, 0x0218, 0x0228, - 0x0239, 0x024a, 0x0258, 0x0266, 0x0277, 0x0285, 0x0294, 0x02a3, - 0x02b3, 0x02ca, 0x02d8, 0x02e6, 0x02f5, 0x0305, 0x0315, 0x0325, - 0x0334, 0x0344, 0x0354, 0x0364, 0x0377, 0x038a, 0x03a3, 0x03b2, - 0x03c1, 0x03d0, 0x03e0, 0x03ef, 0x03fe, 0x0410, 0x041e, 0x042c, - // Entry 5F80 - 5FBF - 0x043b, 0x044a, 0x045a, 0x0471, 0x0481, 0x0492, 0x04a0, 0x04ae, - 0x04bd, 0x00bd, 0x00d5, 0x00e9, 0x0103, 0x0120, 0x0131, 0x0143, - 0x0156, 0x0168, 0x017b, 0x018c, 0x019e, 0x01b0, 0x01c1, 0x01d2, - 0x01e4, 0x01f7, 0x020a, 0x021b, 0x022d, 0x0240, 0x0254, 0x0266, - 0x0278, 0x028a, 0x029c, 0x02af, 0x02c0, 0x02d2, 0x02e5, 0x02f9, - 0x030b, 0x031e, 0x0331, 0x0342, 0x0354, 0x0366, 0x0379, 0x038c, - 0x03a7, 0x03b9, 0x03d3, 0x03e5, 0x03f7, 0x0409, 0x041b, 0x042c, - 0x043e, 0x003e, 0x004d, 0x0060, 0x006f, 0x007e, 0x0090, 0x00a2, - // Entry 5FC0 - 5FFF - 0x00b4, 0x00c6, 0x00d8, 0x00ea, 0x00fc, 0x0117, 0x0132, 0x014d, - 0x0168, 0x0183, 0x019e, 0x019e, 0x01b3, 0x01b3, 0x01c7, 0x01db, - 0x01ef, 0x0203, 0x0217, 0x022b, 0x023f, 0x0253, 0x0267, 0x027b, - 0x028f, 0x02a3, 0x02b7, 0x02cb, 0x02df, 0x02f3, 0x0307, 0x031b, - 0x032f, 0x0343, 0x0357, 0x036b, 0x037f, 0x0393, 0x03a7, 0x03bb, - 0x03cf, 0x03e3, 0x03f7, 0x040b, 0x041f, 0x0433, 0x0447, 0x045b, - 0x046f, 0x0483, 0x0497, 0x04ab, 0x04bf, 0x04d3, 0x04e7, 0x04fb, - 0x050f, 0x0523, 0x0537, 0x054b, 0x055f, 0x0573, 0x0587, 0x059b, - // Entry 6000 - 603F - 0x05af, 0x05c3, 0x05d7, 0x05eb, 0x05ff, 0x0613, 0x0627, 0x063b, - 0x064f, 0x0663, 0x0677, 0x068b, 0x069f, 0x06b3, 0x06c7, 0x06db, - 0x06ef, 0x0703, 0x0717, 0x072b, 0x073f, 0x0753, 0x0767, 0x077b, - 0x078f, 0x07a3, 0x07b7, 0x07cb, 0x07df, 0x07f3, 0x0807, 0x081b, - 0x082f, 0x0843, 0x0857, 0x086b, 0x087f, 0x0893, 0x08a7, 0x08bb, - 0x08cf, 0x08e3, 0x08f7, 0x090b, 0x091f, 0x0933, 0x0947, 0x095b, - 0x096f, 0x0983, 0x0997, 0x09ab, 0x09bf, 0x09d3, 0x09e7, 0x09fb, - 0x0a0f, 0x0a23, 0x0a37, 0x0a4b, 0x0a5f, 0x0a73, 0x0a87, 0x0a9b, - // Entry 6040 - 607F - 0x0aaf, 0x0ac3, 0x0ad7, 0x0aeb, 0x0aff, 0x0b13, 0x0b27, 0x0b3b, - 0x0b4f, 0x0b63, 0x0b77, 0x0b8b, 0x0b9f, 0x0bb3, 0x0bc7, 0x0bdb, - 0x0bef, 0x0c03, 0x0c17, 0x0c2b, 0x0c3f, 0x0c53, 0x0c67, 0x0c7b, - 0x0c8f, 0x0ca3, 0x0cb7, 0x0ccb, 0x0cdf, 0x0cf3, 0x0d07, 0x0d1b, - 0x0d2f, 0x0d43, 0x0d57, 0x0d6b, 0x0d7f, 0x0d93, 0x0da7, 0x0dbb, - 0x0dcf, 0x0de3, 0x0df7, 0x0e0b, 0x0e1f, 0x0e33, 0x0e47, 0x0e5b, - 0x0e6f, 0x0e83, 0x0e97, 0x0eab, 0x0ebf, 0x0ed3, 0x0ee7, 0x0efb, - 0x0f0f, 0x0f23, 0x0f37, 0x0f4b, 0x0f5f, 0x0f73, 0x0f87, 0x0f9b, - // Entry 6080 - 60BF - 0x0faf, 0x0fc3, 0x0fd7, 0x0feb, 0x0fff, 0x1013, 0x1027, 0x103b, - 0x104f, 0x1063, 0x1077, 0x108b, 0x109f, 0x10b3, 0x10c7, 0x10db, - 0x10ef, 0x1103, 0x1117, 0x112b, 0x113f, 0x1153, 0x1167, 0x117b, - 0x118f, 0x11a3, 0x11b7, 0x11cb, 0x11df, 0x11f3, 0x1207, 0x121b, - 0x122f, 0x1243, 0x1257, 0x126b, 0x127f, 0x1293, 0x12a7, 0x12bb, - 0x12cf, 0x12e3, 0x12f7, 0x130b, 0x131f, 0x1333, 0x1347, 0x135b, - 0x136f, 0x1383, 0x1397, 0x13ab, 0x13bf, 0x13d3, 0x13e7, 0x13fb, - 0x140f, 0x1423, 0x1437, 0x144b, 0x145f, 0x1473, 0x1487, 0x149b, - // Entry 60C0 - 60FF - 0x14af, 0x14c3, 0x14d7, 0x14eb, 0x14ff, 0x1513, 0x1527, 0x153b, - 0x154f, 0x1563, 0x1577, 0x158b, 0x159f, 0x15b3, 0x15c7, 0x15db, - 0x15ef, 0x1603, 0x1617, 0x162b, 0x163f, 0x1653, 0x1667, 0x167b, - 0x168f, 0x16a3, 0x16b7, 0x16cb, 0x16df, 0x16f3, 0x1707, 0x171b, - 0x172f, 0x1743, 0x1757, 0x176b, 0x177f, 0x1793, 0x17a7, 0x17bb, - 0x17cf, 0x17e3, 0x17f7, 0x180b, 0x181f, 0x1833, 0x1847, 0x185b, - 0x186f, 0x1883, 0x1897, 0x18ab, 0x18bf, 0x18d3, 0x18e7, 0x18fb, - 0x190f, 0x1923, 0x1937, 0x194b, 0x195f, 0x1973, 0x1987, 0x199b, - // Entry 6100 - 613F - 0x19af, 0x19c3, 0x19d7, 0x19eb, 0x19ff, 0x1a13, 0x1a27, 0x1a3b, - 0x1a4f, 0x1a63, 0x1a77, 0x1a8b, 0x1a9f, 0x1ab3, 0x1ac7, 0x1adb, - 0x1aef, 0x1b03, 0x1b17, 0x1b2b, 0x1b3f, 0x1b53, 0x1b67, 0x1b7b, - 0x1b8f, 0x1ba3, 0x1bb7, 0x1bcb, 0x1bdf, 0x1bf3, 0x1c07, 0x1c1b, - 0x1c2f, 0x1c43, 0x1c57, 0x1c6b, 0x1c7f, 0x1c93, 0x1ca7, 0x1cbb, - 0x1ccf, 0x1ce3, 0x1cf7, 0x1d0b, 0x1d1f, 0x1d33, 0x1d47, 0x1d5b, - 0x1d6f, 0x1d83, 0x1d97, 0x1dab, 0x1dbf, 0x1dd3, 0x1de7, 0x1dfb, - 0x1e0f, 0x1e23, 0x1e37, 0x1e4b, 0x1e5f, 0x1e73, 0x1e87, 0x1e9b, - // Entry 6140 - 617F - 0x1eaf, 0x1ec3, 0x1ed7, 0x1eeb, 0x1eff, 0x1f13, 0x1f27, 0x1f3b, - 0x1f4f, 0x1f63, 0x1f77, 0x1f8b, 0x1f9f, 0x1fb3, 0x1fc7, 0x1fdb, - 0x1fef, 0x2003, 0x2017, 0x202b, 0x203f, 0x2053, 0x2067, 0x207b, - 0x208f, 0x20a3, 0x20b7, 0x20cb, 0x20df, 0x20f3, 0x2107, 0x211b, - 0x212f, 0x2143, 0x2157, 0x216b, 0x217f, 0x2193, 0x21a7, 0x21bb, - 0x21cf, 0x21e3, 0x21f7, 0x220b, 0x221f, 0x2233, 0x2247, 0x225b, - 0x226f, 0x2283, 0x2297, 0x22ab, 0x22bf, 0x22d3, 0x22e7, 0x22fb, - 0x230f, 0x2323, 0x2337, 0x234b, 0x235f, 0x2373, 0x2387, 0x239b, - // Entry 6180 - 61BF - 0x23af, 0x23c3, 0x23d7, 0x23eb, 0x23ff, 0x2413, 0x2427, 0x243b, - 0x244f, 0x2463, 0x2477, 0x248b, 0x249f, 0x24b3, 0x24c7, 0x24db, - 0x24ef, 0x2503, 0x2517, 0x252b, 0x253f, 0x2553, 0x2567, 0x257b, - 0x258f, 0x25a3, 0x25b7, 0x25cb, 0x25df, 0x25f3, 0x2607, 0x261b, - 0x262f, 0x2643, 0x2657, 0x266b, 0x267f, 0x2693, 0x26a7, 0x26bb, - 0x26cf, 0x26e3, 0x26f7, 0x270b, 0x271f, 0x2733, 0x2747, 0x275b, - 0x276f, 0x2783, 0x2797, 0x27ab, 0x27bf, 0x27d3, 0x27e7, 0x27fb, - 0x280f, 0x2823, 0x2837, 0x284b, 0x285f, 0x2873, 0x2887, 0x289b, - // Entry 61C0 - 61FF - 0x28af, 0x28c3, 0x28d7, 0x28eb, 0x28ff, 0x2913, 0x2927, 0x293b, - 0x294f, 0x2963, 0x2977, 0x298b, 0x299f, 0x29b3, 0x29c7, 0x29db, - 0x29ef, 0x2a03, 0x2a17, 0x2a2b, 0x2a3f, 0x2a53, 0x2a67, 0x2a7b, - 0x2a8f, 0x2aa3, 0x2ab7, 0x2acb, 0x2adf, 0x2af3, 0x2b07, 0x2b1b, - 0x2b2f, 0x2b43, 0x2b57, 0x2b6b, 0x2b7f, 0x2b93, 0x2ba7, 0x2bbb, - 0x2bcf, 0x2be3, 0x2bf7, 0x2c0b, 0x2c1f, 0x2c33, 0x2c47, 0x2c5b, - 0x2c6f, 0x2c83, 0x2c97, 0x2cab, 0x2cbf, 0x2cd3, 0x2ce7, 0x2cfb, - 0x2d0f, 0x2d23, 0x2d37, 0x2d4b, 0x2d5f, 0x2d73, 0x2d87, 0x2d9b, - // Entry 6200 - 623F - 0x2daf, 0x2dc3, 0x2dd7, 0x2deb, 0x2dff, 0x2e13, 0x2e27, 0x2e3b, - 0x2e4f, 0x2e63, 0x2e77, 0x2e8b, 0x2e9f, 0x2eb3, 0x2ec7, 0x2edb, - 0x2eef, 0x2f03, 0x2f17, 0x2f2b, 0x2f3f, 0x2f53, 0x2f67, 0x2f7b, - 0x2f8f, 0x2fa3, 0x2fb7, 0x2fcb, 0x2fdf, 0x2ff3, 0x3007, 0x301b, - 0x302f, 0x3043, 0x3057, 0x306b, 0x307f, 0x3093, 0x30a7, 0x30bb, - 0x30cf, 0x30e3, 0x30f7, 0x310b, 0x311f, 0x3133, 0x3147, 0x315b, - 0x316f, 0x3183, 0x3197, 0x31ab, 0x31bf, 0x31d3, 0x31e7, 0x31fb, - 0x320f, 0x3223, 0x3237, 0x324b, 0x325f, 0x3273, 0x3287, 0x329b, - // Entry 6240 - 627F - 0x32af, 0x32c3, 0x32d7, 0x32eb, 0x32ff, 0x3313, 0x3327, 0x333b, - 0x334f, 0x3363, 0x3377, 0x338b, 0x339f, 0x33b3, 0x33c7, 0x33db, - 0x33ef, 0x3403, 0x3417, 0x342b, 0x343f, 0x3453, 0x3467, 0x347b, - 0x348f, 0x34a3, 0x34b7, 0x34cb, 0x34df, 0x34f3, 0x3507, 0x351b, - 0x352f, 0x3543, 0x3557, 0x356b, 0x357f, 0x3593, 0x35a7, 0x35bb, - 0x35cf, 0x35e3, 0x35f7, 0x360b, 0x361f, 0x3633, 0x3647, 0x365b, - 0x366f, 0x3683, 0x3697, 0x36ab, 0x36bf, 0x36d3, 0x36e7, 0x36fb, - 0x370f, 0x3723, 0x3737, 0x374b, 0x375f, 0x3773, 0x3787, 0x379b, - // Entry 6280 - 62BF - 0x37af, 0x37c3, 0x37d7, 0x37eb, 0x37ff, 0x3813, 0x3827, 0x383b, - 0x384f, 0x3863, 0x3877, 0x388b, 0x389f, 0x38b3, 0x38c7, 0x38db, - 0x38ef, 0x3903, 0x3917, 0x392b, 0x393f, 0x3953, 0x3967, 0x397b, - 0x398f, 0x39a3, 0x39b7, 0x39cb, 0x39df, 0x39f3, 0x3a07, 0x3a1b, - 0x3a2f, 0x3a43, 0x3a57, 0x3a6b, 0x3a7f, 0x3a93, 0x3aa7, 0x3abb, - 0x3acf, 0x3ae3, 0x3af7, 0x3b0b, 0x3b1f, 0x3b33, 0x3b47, 0x3b5b, - 0x3b6f, 0x3b83, 0x3b97, 0x3bab, 0x3bbf, 0x3bd3, 0x3be7, 0x3bfb, - 0x3c0f, 0x3c23, 0x3c37, 0x3c4b, 0x3c5f, 0x3c73, 0x3c87, 0x3c9b, - // Entry 62C0 - 62FF - 0x3caf, 0x00af, 0x00c8, 0x00e2, 0x00e2, 0x00f3, 0x0104, 0x0115, - 0x0126, 0x0137, 0x0148, 0x0159, 0x016a, 0x017b, 0x018c, 0x019d, - 0x01ae, 0x01c1, 0x01d4, 0x01e7, 0x01fa, 0x020d, 0x021f, 0x0237, - 0x0249, 0x025b, 0x0272, 0x0284, 0x0296, 0x02a8, 0x02b9, 0x02ca, - 0x02db, 0x02ec, 0x02ff, 0x0312, 0x0325, 0x0338, 0x0352, 0x036c, - 0x0386, 0x03b2, 0x03cc, 0x03ec, 0x03ff, 0x0412, 0x0425, 0x0438, - 0x044d, 0x0462, 0x0477, 0x048c, 0x04a8, 0x04bb, 0x04d0, 0x04e3, - 0x04f8, 0x050b, 0x0520, 0x0533, 0x0548, 0x0559, 0x056b, 0x057e, - // Entry 6300 - 633F - 0x0591, 0x05a4, 0x05b9, 0x05ce, 0x05e1, 0x05f6, 0x0607, 0x061f, - 0x0631, 0x0642, 0x0655, 0x0666, 0x0677, 0x0689, 0x06a0, 0x06b2, - 0x06c4, 0x06dc, 0x06f6, 0x070e, 0x0724, 0x0736, 0x0747, 0x0759, - 0x076b, 0x077e, 0x0794, 0x07ae, 0x07c0, 0x07d7, 0x07ea, 0x07fc, - 0x080e, 0x0820, 0x0832, 0x0844, 0x0857, 0x086a, 0x0881, 0x0898, - 0x08af, 0x08c6, 0x08df, 0x08f8, 0x0910, 0x0928, 0x0940, 0x0959, - 0x0159, 0x017e, 0x01a2, 0x01c8, 0x01ea, 0x020c, 0x022f, 0x024d, - 0x0279, 0x0298, 0x02b4, 0x02d2, 0x02f0, 0x0314, 0x0314, 0x032d, - // Entry 6340 - 637F - 0x034c, 0x0365, 0x0383, 0x039a, 0x03b4, 0x03cc, 0x03e4, 0x0400, - 0x0000, 0x0018, 0x0036, 0x004e, 0x006b, 0x0081, 0x009a, 0x00b1, - 0x00c8, 0x00e3, 0x00fb, 0x00fb, 0x0115, 0x0133, 0x0147, 0x016d, - 0x018c, 0x01af, 0x01c9, 0x01e1, 0x01e1, 0x01ff, 0x021e, 0x0242, - 0x026c, 0x0290, 0x02bb, 0x02e0, 0x0301, 0x0323, 0x0347, 0x0369, - 0x0391, 0x03b2, 0x03dc, 0x0404, 0x0423, 0x0445, 0x0468, 0x0491, - 0x04b1, 0x04cf, 0x04f7, 0x051f, 0x053e, 0x055f, 0x057d, 0x05a3, - 0x05cc, 0x05f7, 0x0618, 0x0639, 0x0662, 0x068a, 0x06b3, 0x06dd, - // Entry 6380 - 63BF - 0x06fe, 0x071d, 0x073b, 0x0763, 0x0783, 0x07a8, 0x07c7, 0x07f0, - 0x081d, 0x0848, 0x0866, 0x0884, 0x08a0, 0x08bd, 0x08dd, 0x08ff, - 0x0925, 0x094d, 0x096f, 0x0999, 0x09c1, 0x09e2, 0x0a04, 0x0a25, - 0x0a4f, 0x0a6f, 0x0a9c, 0x0ac9, 0x0ae9, 0x0b06, 0x0b26, 0x0b4c, - 0x0b72, 0x0b97, 0x0bbc, 0x0bdd, 0x0c00, 0x0c22, 0x0c42, 0x0c63, - 0x0c8b, 0x0cb3, 0x0cd8, 0x0d02, 0x0d2a, 0x0d49, 0x0d70, 0x0da1, - 0x0dc1, 0x0de9, 0x0e09, 0x0e29, 0x0e4d, 0x0e70, 0x0e93, 0x0eb9, - 0x0ed8, 0x0efb, 0x0f1b, 0x0f43, 0x0f6b, 0x0f96, 0x0fb6, 0x0fde, - // Entry 63C0 - 63FF - 0x1003, 0x1026, 0x104a, 0x1068, 0x108d, 0x10ae, 0x10d1, 0x10f6, - 0x111f, 0x1147, 0x116e, 0x1199, 0x11c5, 0x11ec, 0x1214, 0x123b, - 0x1261, 0x128e, 0x12b4, 0x12dc, 0x1304, 0x1329, 0x1352, 0x1374, - 0x1396, 0x13b8, 0x13d9, 0x13f9, 0x141c, 0x1443, 0x146c, 0x1491, - 0x14b5, 0x14da, 0x14f7, 0x1515, 0x1534, 0x1555, 0x1575, 0x15a1, - 0x15cc, 0x15f9, 0x1629, 0x1658, 0x167f, 0x16b5, 0x16e8, 0x1709, - 0x1746, 0x1782, 0x17b7, 0x17d9, 0x17f7, 0x181a, 0x183a, 0x1862, - 0x1889, 0x18ac, 0x18d1, 0x18f4, 0x1918, 0x1940, 0x1969, 0x1997, - // Entry 6400 - 643F - 0x19ca, 0x19fa, 0x1a2f, 0x1a5d, 0x1a88, 0x1ab8, 0x1af0, 0x1b1f, - 0x1b4e, 0x1b7e, 0x1bb2, 0x1be0, 0x1c0d, 0x1c38, 0x1c65, 0x1c97, - 0x1ccf, 0x1cfb, 0x1d28, 0x1d57, 0x1d78, 0x1d9b, 0x1dd2, 0x1dfe, - 0x1e2c, 0x1e56, 0x1e82, 0x1eb5, 0x1ee1, 0x1f0d, 0x1f3e, 0x1f6e, - 0x1fa5, 0x1fde, 0x2012, 0x2047, 0x206d, 0x2091, 0x20b6, 0x20db, - 0x2111, 0x2145, 0x2170, 0x219b, 0x21c8, 0x21f9, 0x2235, 0x226a, - 0x22a2, 0x22d3, 0x230f, 0x2344, 0x237c, 0x23a2, 0x23c8, 0x23f4, - 0x2421, 0x2448, 0x2471, 0x249a, 0x24cb, 0x24fd, 0x2531, 0x2559, - // Entry 6440 - 647F - 0x2589, 0x25ba, 0x25ed, 0x2611, 0x2636, 0x2655, 0x2678, 0x269c, - 0x26bf, 0x26e2, 0x2705, 0x2728, 0x274b, 0x2776, 0x279f, 0x27ca, - 0x27f3, 0x2817, 0x283f, 0x003f, 0x005c, 0x0079, 0x0095, 0x00b9, - 0x00d6, 0x00f2, 0x0111, 0x0131, 0x014b, 0x0163, 0x0179, 0x018d, - 0x01a0, 0x01c0, 0x01e0, 0x0200, 0x0216, 0x0232, 0x024c, 0x0262, - 0x0276, 0x028c, 0x02a9, 0x02c6, 0x02e5, 0x0303, 0x0321, 0x033e, - 0x0361, 0x0385, 0x039a, 0x03bb, 0x03dd, 0x03f2, 0x0407, 0x0428, - 0x044a, 0x0464, 0x047e, 0x007e, 0x00a2, 0x00bd, 0x00d7, 0x00ed, - // Entry 6480 - 64BF - 0x0105, 0x011e, 0x0139, 0x0150, 0x0169, 0x018a, 0x01aa, 0x01c4, - 0x01db, 0x01f5, 0x0210, 0x0230, 0x0251, 0x026a, 0x0283, 0x029b, - 0x02b6, 0x02d0, 0x02ed, 0x030e, 0x032e, 0x035b, 0x0374, 0x0390, - 0x03b0, 0x03d4, 0x03f8, 0x0421, 0x044a, 0x0475, 0x04a0, 0x04cc, - 0x04f8, 0x0523, 0x054e, 0x057d, 0x05ac, 0x05ce, 0x05f0, 0x0621, - 0x0652, 0x0675, 0x0691, 0x06ae, 0x06ca, 0x06ef, 0x0714, 0x0728, - 0x0741, 0x0759, 0x0774, 0x078e, 0x07ab, 0x07cc, 0x07ec, 0x0819, - 0x0836, 0x0860, 0x0882, 0x08a4, 0x08c6, 0x08e7, 0x0908, 0x0929, - // Entry 64C0 - 64FF - 0x0952, 0x0971, 0x0990, 0x09af, 0x09ce, 0x09ed, 0x0a06, 0x0a1d, - 0x0a35, 0x0a4b, 0x0a64, 0x0a7b, 0x0a96, 0x0aaf, 0x0ace, 0x0aef, - 0x0b0e, 0x0b34, 0x0b54, 0x0b7d, 0x0ba5, 0x0bc3, 0x0bdf, 0x0bfd, - 0x0c1a, 0x0c36, 0x0c53, 0x0c71, 0x0c8e, 0x0cb4, 0x0cda, 0x0cf4, - 0x0d09, 0x0d19, 0x0d2d, 0x0d41, 0x0d55, 0x0d6d, 0x0d87, 0x0da6, - 0x0dc8, 0x0dd9, 0x0dec, 0x0e08, 0x0e21, 0x0e37, 0x0e57, 0x0e77, - 0x0e97, 0x0eb7, 0x0ed7, 0x0ef7, 0x0f17, 0x0f37, 0x0f57, 0x0f78, - 0x0f99, 0x0fb3, 0x0fcd, 0x0fe9, 0x1004, 0x1025, 0x1044, 0x1065, - // Entry 6500 - 653F - 0x108c, 0x10a5, 0x10c1, 0x10df, 0x10fa, 0x1117, 0x1136, 0x1149, - 0x1160, 0x1175, 0x1189, 0x119e, 0x11bd, 0x11dc, 0x11f1, 0x120c, - 0x122b, 0x124a, 0x1263, 0x127c, 0x129e, 0x12c2, 0x12dc, 0x12fa, - 0x1314, 0x1332, 0x1369, 0x13a2, 0x13e6, 0x141f, 0x145a, 0x14a2, - 0x14ea, 0x1532, 0x1546, 0x1565, 0x1584, 0x159b, 0x15af, 0x15c5, - 0x15da, 0x15f2, 0x1609, 0x1620, 0x1638, 0x1657, 0x1676, 0x1697, - 0x16b4, 0x16d0, 0x16f2, 0x1712, 0x1737, 0x1757, 0x1776, 0x17a2, - 0x17cc, 0x17f7, 0x1820, 0x183f, 0x003f, 0x005c, 0x0079, 0x0096, - // Entry 6540 - 657F - 0x00b3, 0x00d0, 0x00ed, 0x010a, 0x0127, 0x0144, 0x0162, 0x0180, - 0x019e, 0x01bc, 0x01da, 0x01f8, 0x0216, 0x0234, 0x0252, 0x0270, - 0x028e, 0x02ac, 0x02ca, 0x02e8, 0x0306, 0x0324, 0x0342, 0x0360, - 0x037e, 0x039c, 0x03c0, 0x03e4, 0x0408, 0x042c, 0x0450, 0x0474, - 0x0499, 0x04be, 0x04e3, 0x0508, 0x052d, 0x0552, 0x0577, 0x059c, - 0x05c1, 0x05e6, 0x060b, 0x0630, 0x0655, 0x067a, 0x069f, 0x06c4, - 0x06e9, 0x070e, 0x0733, 0x0758, 0x077d, 0x07a2, 0x07c7, 0x07ec, - 0x0811, 0x0836, 0x085b, 0x0880, 0x08a5, 0x08ca, 0x08ef, 0x090e, - // Entry 6580 - 65BF - 0x092f, 0x0950, 0x0964, 0x0164, 0x0176, 0x018f, 0x01a5, 0x01be, - 0x01d6, 0x01e6, 0x01fa, 0x0213, 0x0226, 0x023b, 0x0256, 0x026f, - 0x0283, 0x029b, 0x02b6, 0x02df, 0x02f7, 0x0311, 0x0327, 0x0340, - 0x0353, 0x0368, 0x0382, 0x0397, 0x03ae, 0x03c3, 0x03d8, 0x03f0, - 0x0402, 0x0413, 0x042b, 0x0442, 0x0456, 0x046a, 0x0484, 0x04a1, - 0x04b6, 0x04ca, 0x04e1, 0x04f6, 0x050d, 0x0523, 0x0537, 0x054d, - 0x0564, 0x057e, 0x0594, 0x05af, 0x05c7, 0x05da, 0x05f1, 0x060a, - 0x061f, 0x0633, 0x0647, 0x0668, 0x067f, 0x0694, 0x06aa, 0x06bd, - // Entry 65C0 - 65FF - 0x06d7, 0x06f1, 0x070a, 0x0724, 0x0739, 0x0753, 0x076e, 0x0781, - 0x0794, 0x07a9, 0x07bc, 0x07d3, 0x07ea, 0x07ff, 0x0817, 0x082e, - 0x0844, 0x085a, 0x0872, 0x0887, 0x089c, 0x08b5, 0x08cd, 0x08e7, - 0x0901, 0x0918, 0x092f, 0x012f, 0x014a, 0x0165, 0x0182, 0x019e, - 0x01ba, 0x01d5, 0x01f2, 0x020f, 0x022b, 0x0246, 0x0261, 0x027e, - 0x029a, 0x02b6, 0x02d1, 0x02ee, 0x030b, 0x0327, 0x0327, 0x0342, - 0x035d, 0x0378, 0x0393, 0x03ae, 0x03c9, 0x03e4, 0x03ff, 0x041a, - 0x0435, 0x0450, 0x046b, 0x0486, 0x04a1, 0x04bc, 0x04d7, 0x04f2, - // Entry 6600 - 663F - 0x050d, 0x0528, 0x0543, 0x055e, 0x0579, 0x0594, 0x05af, 0x05ca, - 0x05e5, 0x05fe, 0x0617, 0x0630, 0x0649, 0x0662, 0x067b, 0x0694, - 0x06ad, 0x06c6, 0x06df, 0x06f8, 0x0711, 0x072a, 0x0743, 0x075c, - 0x0775, 0x078e, 0x07a7, 0x07c0, 0x07d9, 0x07f2, 0x080b, 0x0824, - 0x083d, 0x0856, 0x086f, 0x088c, 0x08a9, 0x08c6, 0x08e3, 0x0900, - 0x091d, 0x093a, 0x0957, 0x0974, 0x0991, 0x09ae, 0x09cb, 0x09e8, - 0x0a05, 0x0a22, 0x0a3f, 0x0a5c, 0x0a79, 0x0a96, 0x0ab3, 0x0ad0, - 0x0aed, 0x0b0a, 0x0b27, 0x0b44, 0x0b61, 0x0b7c, 0x0b97, 0x0bb2, - // Entry 6640 - 667F - 0x0bcd, 0x0be8, 0x0c03, 0x0c1e, 0x001e, 0x0039, 0x0054, 0x006f, - 0x008a, 0x00a5, 0x00c0, 0x00db, 0x00f6, 0x0111, 0x012c, 0x0147, - 0x0162, 0x017d, 0x0198, 0x01b3, 0x01ce, 0x01e9, 0x0204, 0x0226, - 0x0248, 0x026a, 0x028c, 0x02ae, 0x02d0, 0x02f2, 0x0314, 0x0336, - 0x0358, 0x037a, 0x039c, 0x03be, 0x03e0, 0x0402, 0x0424, 0x0446, - 0x0468, 0x048a, 0x04ac, 0x04ce, 0x04f0, 0x0512, 0x0534, 0x0556, - 0x0578, 0x0598, 0x05b8, 0x05d8, 0x05f8, 0x0618, 0x0638, 0x0658, - 0x0678, 0x0698, 0x06b8, 0x06d8, 0x06f8, 0x0718, 0x0738, 0x0758, - // Entry 6680 - 66BF - 0x0778, 0x0798, 0x07b8, 0x07d8, 0x07f8, 0x0818, 0x0838, 0x0858, - 0x0878, 0x0898, 0x08b8, 0x08d5, 0x00d5, 0x00f2, 0x010f, 0x010f, - 0x012c, 0x012c, 0x0149, 0x0166, 0x0166, 0x0183, 0x01a0, 0x01bd, - 0x01da, 0x01da, 0x01f7, 0x0214, 0x0231, 0x024e, 0x026b, 0x0288, - 0x02a5, 0x02c2, 0x02dd, 0x02f8, 0x0313, 0x032e, 0x032e, 0x0349, - 0x0349, 0x0364, 0x037f, 0x039a, 0x03b5, 0x03d0, 0x03eb, 0x0406, - 0x0006, 0x0021, 0x003c, 0x0057, 0x0072, 0x008d, 0x00a8, 0x00c3, - 0x00de, 0x00f9, 0x0114, 0x012f, 0x0151, 0x0173, 0x0195, 0x01b7, - // Entry 66C0 - 66FF - 0x01d9, 0x01fb, 0x021d, 0x023f, 0x0261, 0x0283, 0x02a5, 0x02c7, - 0x02e9, 0x030b, 0x032d, 0x034f, 0x0371, 0x0393, 0x03b5, 0x03d7, - 0x03f9, 0x041b, 0x043d, 0x045f, 0x0481, 0x04a3, 0x04c3, 0x04e3, - 0x0503, 0x0523, 0x0543, 0x0563, 0x0583, 0x05a3, 0x05c3, 0x05e3, - 0x0603, 0x0623, 0x0643, 0x0663, 0x0683, 0x06a3, 0x06c3, 0x06e3, - 0x0703, 0x0723, 0x0743, 0x0763, 0x0783, 0x07a3, 0x07c3, 0x07e3, - 0x0801, 0x081f, 0x001f, 0x003d, 0x005b, 0x0079, 0x0097, 0x0097, - 0x00b5, 0x00d3, 0x00f1, 0x010f, 0x012d, 0x014b, 0x0169, 0x0187, - // Entry 6700 - 673F - 0x0187, 0x01a5, 0x01c3, 0x01e1, 0x01ff, 0x021d, 0x023b, 0x0259, - 0x0259, 0x0275, 0x0291, 0x02ad, 0x02c9, 0x02e5, 0x0301, 0x031d, - 0x0339, 0x0355, 0x0371, 0x038d, 0x03a9, 0x03c5, 0x03e1, 0x03fd, - 0x0419, 0x0435, 0x0451, 0x046d, 0x0489, 0x04a5, 0x04c1, 0x04dd, - 0x04f9, 0x0515, 0x0531, 0x0555, 0x0579, 0x0179, 0x019d, 0x01c1, - 0x01e5, 0x0209, 0x0209, 0x022d, 0x0251, 0x0275, 0x0299, 0x02bd, - 0x02bd, 0x02e1, 0x02e1, 0x0305, 0x0329, 0x034d, 0x0371, 0x0395, - 0x03b9, 0x03dd, 0x03dd, 0x03ff, 0x0421, 0x0443, 0x0465, 0x0487, - // Entry 6740 - 677F - 0x04a9, 0x04cb, 0x04ed, 0x050f, 0x0531, 0x0553, 0x0575, 0x0597, - 0x05b9, 0x05db, 0x05fd, 0x061f, 0x0641, 0x0663, 0x0685, 0x06a7, - 0x06c9, 0x06eb, 0x070d, 0x072f, 0x0751, 0x0774, 0x0797, 0x07ba, - 0x07dd, 0x0800, 0x0823, 0x0846, 0x0869, 0x088c, 0x08af, 0x08d2, - 0x08f5, 0x0918, 0x093b, 0x095e, 0x0981, 0x09a4, 0x09c7, 0x09ea, - 0x0a0d, 0x0a30, 0x0a53, 0x0a76, 0x0a99, 0x0abc, 0x0adf, 0x0b00, - 0x0b21, 0x0b42, 0x0b63, 0x0b84, 0x0ba5, 0x0bc6, 0x0be7, 0x0c08, - 0x0c29, 0x0c4a, 0x0c6b, 0x0c8c, 0x0cad, 0x0cce, 0x0cef, 0x0d10, - // Entry 6780 - 67BF - 0x0d31, 0x0d52, 0x0d73, 0x0d94, 0x0db5, 0x0dd6, 0x0df7, 0x0e18, - 0x0e39, 0x0e5a, 0x0e7b, 0x0e9c, 0x0ebd, 0x0ede, 0x0eff, 0x0f20, - 0x0f41, 0x0f62, 0x0f83, 0x0fa4, 0x0fc5, 0x0fe6, 0x1007, 0x1028, - 0x1049, 0x106a, 0x108b, 0x10ac, 0x10cd, 0x10ee, 0x110f, 0x1130, - 0x1151, 0x1172, 0x1193, 0x11b2, 0x11d1, 0x11f0, 0x120f, 0x122e, - 0x124d, 0x126c, 0x128b, 0x12aa, 0x12c9, 0x12e8, 0x1307, 0x1326, - 0x1345, 0x1364, 0x1383, 0x13a2, 0x13c1, 0x13e0, 0x13ff, 0x141e, - 0x143d, 0x145c, 0x147b, 0x149a, 0x14b9, 0x14df, 0x1505, 0x152b, - // Entry 67C0 - 67FF - 0x1551, 0x1577, 0x159d, 0x15c3, 0x15e9, 0x160f, 0x1635, 0x165b, - 0x1681, 0x16a7, 0x16cd, 0x16f3, 0x1719, 0x173f, 0x1765, 0x178b, - 0x17b1, 0x17d7, 0x17fd, 0x1823, 0x1849, 0x186f, 0x1895, 0x18b9, - 0x18dd, 0x1901, 0x1925, 0x1949, 0x196d, 0x1991, 0x19b5, 0x19d9, - 0x19fd, 0x1a21, 0x1a45, 0x1a69, 0x1a8d, 0x1ab1, 0x1ad5, 0x1af9, - 0x1b1d, 0x1b41, 0x1b65, 0x1b89, 0x1bad, 0x1bd1, 0x1bf5, 0x1c19, - 0x1c3d, 0x1c65, 0x1c8d, 0x1cb5, 0x1cdd, 0x1d05, 0x1d2d, 0x1d55, - 0x1d7d, 0x1da5, 0x1dcd, 0x1df5, 0x1e1d, 0x1e45, 0x1e6d, 0x1e95, - // Entry 6800 - 683F - 0x1ebd, 0x1ee5, 0x1f0d, 0x1f35, 0x1f5d, 0x1f85, 0x1fad, 0x1fd5, - 0x1ffd, 0x2025, 0x204d, 0x2073, 0x2099, 0x20bf, 0x20e5, 0x210b, - 0x2131, 0x2157, 0x217d, 0x21a3, 0x21c9, 0x21ef, 0x2215, 0x223b, - 0x2261, 0x2287, 0x22ad, 0x22d3, 0x22f9, 0x231f, 0x2345, 0x236b, - 0x2391, 0x23b7, 0x23dd, 0x2403, 0x2429, 0x2456, 0x2483, 0x24b0, - 0x24dd, 0x250a, 0x2537, 0x2564, 0x2591, 0x25be, 0x25eb, 0x2618, - 0x2645, 0x2672, 0x269f, 0x26cc, 0x26f9, 0x2726, 0x2753, 0x2780, - 0x27ad, 0x27da, 0x2807, 0x2834, 0x2861, 0x288e, 0x28bb, 0x28e6, - // Entry 6840 - 687F - 0x2911, 0x293c, 0x2967, 0x2992, 0x29bd, 0x29e8, 0x2a13, 0x2a3e, - 0x2a69, 0x2a94, 0x2abf, 0x2aea, 0x2b15, 0x2b40, 0x2b6b, 0x2b96, - 0x2bc1, 0x2bec, 0x2c17, 0x2c42, 0x2c6d, 0x2c98, 0x2cc3, 0x2cee, - 0x2d19, 0x2d39, 0x2d59, 0x2d79, 0x2d99, 0x2db9, 0x2dd9, 0x2df9, - 0x2e19, 0x2e39, 0x2e59, 0x2e79, 0x2e99, 0x2eb9, 0x2ed9, 0x2ef9, - 0x2f19, 0x2f39, 0x2f59, 0x2f79, 0x2f99, 0x2fb9, 0x2fd9, 0x2ff9, - 0x3019, 0x3039, 0x3059, 0x3077, 0x3095, 0x30b3, 0x30d1, 0x30ef, - 0x310d, 0x312b, 0x3149, 0x3167, 0x3185, 0x31a3, 0x31c1, 0x31df, - // Entry 6880 - 68BF - 0x31fd, 0x321b, 0x3239, 0x3257, 0x3275, 0x3293, 0x32b1, 0x32cf, - 0x32ed, 0x330b, 0x3329, 0x3347, 0x3365, 0x3388, 0x33ab, 0x03ab, - 0x03ca, 0x03e8, 0x0407, 0x0426, 0x0447, 0x0465, 0x0482, 0x04a1, - 0x04bf, 0x04de, 0x04fd, 0x0519, 0x0535, 0x0551, 0x0572, 0x058e, - 0x05ab, 0x05d1, 0x05f0, 0x060d, 0x062e, 0x064b, 0x0668, 0x0685, - 0x06a4, 0x06bb, 0x06d8, 0x06f4, 0x0711, 0x072e, 0x074d, 0x0769, - 0x0784, 0x07a1, 0x07bd, 0x07da, 0x07f7, 0x0811, 0x082b, 0x0845, - 0x0864, 0x087e, 0x0899, 0x08bc, 0x08d9, 0x08f4, 0x0913, 0x092e, - // Entry 68C0 - 68FF - 0x0949, 0x0964, 0x0981, 0x09a7, 0x09c7, 0x09e5, 0x0a03, 0x0a1f, - 0x0a3b, 0x0a56, 0x0a77, 0x0a97, 0x0ab8, 0x0ad9, 0x0afc, 0x0b1c, - 0x0b3b, 0x0b5c, 0x0b7c, 0x0b9d, 0x0bbe, 0x0bdc, 0x0bfa, 0x0c18, - 0x0c3b, 0x0c59, 0x0c78, 0x0ca0, 0x0cc1, 0x0ce0, 0x0d03, 0x0d22, - 0x0d41, 0x0d60, 0x0d81, 0x0d9a, 0x0db9, 0x0dd7, 0x0df6, 0x0e15, - 0x0e36, 0x0e54, 0x0e71, 0x0e90, 0x0eae, 0x0ecd, 0x0eec, 0x0f08, - 0x0f24, 0x0f40, 0x0f61, 0x0f7d, 0x0f9a, 0x0fbf, 0x0fde, 0x0ffb, - 0x101c, 0x1039, 0x1056, 0x1073, 0x1092, 0x10ba, 0x10dc, 0x10fc, - // Entry 6900 - 693F - 0x111c, 0x113a, 0x1158, 0x1175, 0x119b, 0x11c0, 0x11e6, 0x120c, - 0x1234, 0x1259, 0x127d, 0x12a3, 0x12c8, 0x12ee, 0x1314, 0x1337, - 0x135a, 0x137d, 0x13a5, 0x13c8, 0x13ec, 0x1419, 0x143f, 0x1463, - 0x148b, 0x14af, 0x14d3, 0x14f7, 0x151d, 0x153b, 0x155f, 0x1582, - 0x15a6, 0x15ca, 0x15f0, 0x1613, 0x1635, 0x1659, 0x167c, 0x16a0, - 0x16c4, 0x16e5, 0x1706, 0x1727, 0x174d, 0x176e, 0x1790, 0x17ba, - 0x17de, 0x1800, 0x1826, 0x1848, 0x186a, 0x188c, 0x18b0, 0x18dd, - 0x1904, 0x1929, 0x194e, 0x1971, 0x1994, 0x19b6, 0x19e0, 0x1a09, - // Entry 6940 - 697F - 0x1a33, 0x1a5d, 0x1a89, 0x1ab2, 0x1ada, 0x1b04, 0x1b2d, 0x1b57, - 0x1b81, 0x1ba8, 0x1bcf, 0x1bf6, 0x1c22, 0x1c49, 0x1c71, 0x1ca2, - 0x1ccc, 0x1cf4, 0x1d20, 0x1d48, 0x1d70, 0x1d98, 0x1dc2, 0x1de4, - 0x1e0c, 0x1e33, 0x1e5b, 0x1e83, 0x1ead, 0x1ed4, 0x1efa, 0x1f22, - 0x1f49, 0x1f71, 0x1f99, 0x1fbe, 0x1fe3, 0x2008, 0x2032, 0x2057, - 0x207d, 0x20ab, 0x20d3, 0x20f9, 0x2123, 0x2149, 0x216f, 0x2195, - 0x21bd, 0x21ee, 0x2219, 0x2242, 0x226b, 0x2292, 0x22b9, 0x22df, - 0x2310, 0x2340, 0x2371, 0x23a2, 0x23d5, 0x2405, 0x2434, 0x2465, - // Entry 6980 - 69BF - 0x2495, 0x24c6, 0x24f7, 0x2525, 0x2553, 0x2581, 0x25b4, 0x25e2, - 0x2611, 0x2649, 0x267a, 0x26a9, 0x26dc, 0x270b, 0x273a, 0x2769, - 0x279a, 0x27c3, 0x27f2, 0x2820, 0x284f, 0x287e, 0x28af, 0x28dd, - 0x290a, 0x2939, 0x2967, 0x2996, 0x29c5, 0x29f1, 0x2a1d, 0x2a49, - 0x2a7a, 0x2aa6, 0x2ad3, 0x2b08, 0x2b37, 0x2b64, 0x2b95, 0x2bc2, - 0x2bef, 0x2c1c, 0x2c4b, 0x2c83, 0x2cb5, 0x2ce5, 0x2d15, 0x2d43, - 0x2d71, 0x2d9e, 0x2dbf, 0x2dde, 0x01de, 0x01fa, 0x0215, 0x0230, - 0x024d, 0x0269, 0x0285, 0x02a0, 0x02bd, 0x02da, 0x02f6, 0x031b, - // Entry 69C0 - 69FF - 0x033f, 0x0363, 0x0389, 0x03ae, 0x03d3, 0x03f7, 0x041d, 0x0443, - 0x0468, 0x048a, 0x04ab, 0x04cc, 0x04ef, 0x0511, 0x0533, 0x0554, - 0x0577, 0x059a, 0x05bc, 0x05e3, 0x0609, 0x062f, 0x0657, 0x067e, - 0x06a5, 0x06cb, 0x06f3, 0x071b, 0x0742, 0x0763, 0x0783, 0x07a3, - 0x07c5, 0x07e6, 0x0807, 0x0827, 0x0849, 0x086b, 0x088c, 0x08a7, - 0x08c4, 0x08de, 0x08f9, 0x0915, 0x0931, 0x0951, 0x0973, 0x099f, - 0x09c9, 0x09eb, 0x0a0d, 0x0a33, 0x0a56, 0x0a78, 0x0a9c, 0x0ac3, - 0x0af5, 0x0b1e, 0x0b4a, 0x0b76, 0x0ba2, 0x0bd9, 0x0c11, 0x0c44, - // Entry 6A00 - 6A3F - 0x0c77, 0x0ca1, 0x0ccd, 0x0cf9, 0x0d25, 0x0d4d, 0x0d77, 0x0dad, - 0x0de3, 0x0e10, 0x0e4b, 0x0e82, 0x0ebe, 0x0ef5, 0x0f2f, 0x0f5e, - 0x0f8e, 0x0fbd, 0x0fec, 0x1025, 0x105c, 0x109d, 0x10d9, 0x110b, - 0x113d, 0x117b, 0x11b0, 0x11ea, 0x122b, 0x125d, 0x128f, 0x12c2, - 0x12f9, 0x132f, 0x1364, 0x1397, 0x13d0, 0x1403, 0x1432, 0x1468, - 0x14a3, 0x14d5, 0x150b, 0x152d, 0x1554, 0x157d, 0x15a9, 0x15db, - 0x1607, 0x1638, 0x1665, 0x168e, 0x16bc, 0x16ef, 0x1727, 0x1755, - 0x1788, 0x17bf, 0x17e7, 0x1814, 0x1843, 0x186c, 0x189c, 0x18d7, - // Entry 6A40 - 6A7F - 0x1910, 0x1925, 0x194f, 0x1969, 0x1989, 0x19ae, 0x19ce, 0x19f1, - 0x1a1d, 0x1a3f, 0x1a6c, 0x1a9e, 0x1ac0, 0x1ad5, 0x1af5, 0x1b13, - 0x1b36, 0x1b54, 0x1b69, 0x1b82, 0x1b96, 0x1bba, 0x1bd9, 0x1bfb, - 0x1c18, 0x1c3f, 0x1c61, 0x1c7f, 0x1c98, 0x1caf, 0x1cc4, 0x1ce4, - 0x1d02, 0x1d25, 0x1d40, 0x1d69, 0x1d7f, 0x1d9b, 0x1dc1, 0x1de2, - 0x1e06, 0x1e25, 0x1e55, 0x1e85, 0x1e9b, 0x1ec2, 0x1eeb, 0x1f13, - 0x1f3b, 0x1f58, 0x1f84, 0x1fb5, 0x1fe7, 0x2008, 0x2039, 0x2068, - 0x2098, 0x20b7, 0x20e2, 0x2103, 0x2122, 0x2142, 0x216d, 0x218e, - // Entry 6A80 - 6ABF - 0x21b8, 0x21da, 0x21fd, 0x2225, 0x224e, 0x2287, 0x22bc, 0x22de, - 0x2302, 0x2325, 0x2348, 0x2371, 0x239c, 0x23c6, 0x23e1, 0x240b, - 0x243a, 0x246b, 0x248a, 0x24c2, 0x24fb, 0x2518, 0x2541, 0x2562, - 0x2585, 0x25a6, 0x25c8, 0x25e9, 0x2614, 0x2645, 0x2665, 0x2685, - 0x26a5, 0x26cc, 0x26f5, 0x2723, 0x274e, 0x2778, 0x27a5, 0x27cb, - 0x27f3, 0x281f, 0x2847, 0x2868, 0x2885, 0x28a4, 0x28c5, 0x28f0, - 0x291a, 0x293c, 0x2965, 0x2988, 0x29b0, 0x29da, 0x2a09, 0x2a30, - 0x2a59, 0x2a86, 0x2ab2, 0x2adb, 0x2b0a, 0x2b3c, 0x2b73, 0x2ba9, - // Entry 6AC0 - 6AFF - 0x2bde, 0x2c10, 0x2c33, 0x2c59, 0x2c80, 0x2cb5, 0x2ceb, 0x2d1c, - 0x2d4d, 0x2d7d, 0x2daf, 0x2de7, 0x2e1b, 0x2e41, 0x2e6b, 0x2e9f, - 0x2ed3, 0x2f06, 0x2f2e, 0x2f4e, 0x2f73, 0x2f9a, 0x2fc2, 0x2fe4, - 0x300c, 0x3032, 0x3057, 0x3079, 0x3094, 0x30b4, 0x30dd, 0x3107, - 0x312c, 0x314f, 0x317f, 0x31ae, 0x31dd, 0x320a, 0x3236, 0x3265, - 0x3293, 0x32c8, 0x32dd, 0x32f7, 0x330f, 0x3329, 0x3342, 0x335a, - 0x3374, 0x338d, 0x33a6, 0x33c1, 0x33db, 0x33f3, 0x340d, 0x3426, - 0x343c, 0x3454, 0x346b, 0x3486, 0x34a1, 0x34c1, 0x34e1, 0x3503, - // Entry 6B00 - 6B3F - 0x3525, 0x3543, 0x3561, 0x357f, 0x359f, 0x35bf, 0x35db, 0x3600, - 0x3628, 0x3650, 0x3678, 0x36a2, 0x36d6, 0x370a, 0x373a, 0x3767, - 0x3795, 0x37c9, 0x37fe, 0x3832, 0x3868, 0x3898, 0x38c6, 0x38f6, - 0x3927, 0x3963, 0x3987, 0x39be, 0x39ee, 0x3a1f, 0x3a5b, 0x3a84, - 0x3aae, 0x3ad7, 0x3b02, 0x3b2e, 0x3b59, 0x3b87, 0x3bb1, 0x3bdc, - 0x3c06, 0x3c2e, 0x3c57, 0x3c7f, 0x3caa, 0x3cd6, 0x3d01, 0x3d2b, - 0x3d56, 0x3d80, 0x3db6, 0x3dec, 0x3e27, 0x3e5e, 0x3e95, 0x3ed1, - 0x3ef5, 0x3f23, 0x3f51, 0x3f7f, 0x3fa7, 0x3fd0, 0x3ff8, 0x4022, - // Entry 6B40 - 6B7F - 0x404d, 0x4079, 0x40a4, 0x40d1, 0x4101, 0x4132, 0x4162, 0x4194, - 0x41c7, 0x41fb, 0x422e, 0x4263, 0x4298, 0x42ce, 0x4303, 0x433a, - 0x436b, 0x439a, 0x43cb, 0x43fd, 0x443a, 0x445f, 0x4497, 0x44c8, - 0x4503, 0x4540, 0x4564, 0x4590, 0x45bd, 0x45e9, 0x460e, 0x4637, - 0x4661, 0x468a, 0x46b6, 0x46e3, 0x470f, 0x473a, 0x4766, 0x4791, - 0x47c9, 0x4801, 0x483e, 0x4875, 0x48ac, 0x48e8, 0x490d, 0x493f, - 0x4972, 0x49a4, 0x49d8, 0x4a0e, 0x4a45, 0x4a7b, 0x4ab3, 0x4af2, - 0x4b32, 0x4b5b, 0x4b85, 0x4bae, 0x4bd7, 0x4c01, 0x4c2a, 0x4c5a, - // Entry 6B80 - 6BBF - 0x4c90, 0x4cc7, 0x4cfd, 0x4d33, 0x4d6a, 0x4da0, 0x4dd2, 0x4e03, - 0x4e35, 0x4e5a, 0x4e7f, 0x4ea7, 0x4ecd, 0x4f04, 0x4f3a, 0x4f70, - 0x4fa6, 0x4fde, 0x5016, 0x5053, 0x5085, 0x50b6, 0x50e7, 0x5118, - 0x514b, 0x517e, 0x51b6, 0x51ed, 0x5225, 0x525c, 0x5297, 0x52d2, - 0x5313, 0x5354, 0x5395, 0x53d6, 0x5417, 0x5458, 0x5499, 0x54da, - 0x5514, 0x554e, 0x5584, 0x55ba, 0x55f5, 0x562e, 0x5667, 0x56a6, - 0x56e5, 0x572b, 0x5771, 0x57b0, 0x57ef, 0x582e, 0x586d, 0x58a5, - 0x58dd, 0x5911, 0x5945, 0x597e, 0x59a9, 0x59d5, 0x5a00, 0x5a2d, - // Entry 6BC0 - 6BFF - 0x5a5b, 0x5a85, 0x5aaf, 0x5ad9, 0x5b03, 0x5b2d, 0x5b53, 0x5b79, - 0x5ba4, 0x5bd4, 0x5c0a, 0x5c41, 0x5c77, 0x5cae, 0x5cf2, 0x5d37, - 0x5d7b, 0x5dbf, 0x5e04, 0x5e48, 0x5e80, 0x5eb8, 0x5ef8, 0x5f38, - 0x5f6c, 0x5fa0, 0x5fe2, 0x6024, 0x6047, 0x606a, 0x6082, 0x609a, - 0x60b3, 0x60ce, 0x60ee, 0x611a, 0x613e, 0x6159, 0x6169, 0x617d, - 0x61a9, 0x61d1, 0x61fe, 0x6227, 0x6251, 0x6271, 0x62a9, 0x62dc, - 0x6317, 0x6337, 0x635c, 0x637e, 0x63a6, 0x63ce, 0x63f4, 0x641a, - 0x6436, 0x6452, 0x646f, 0x6484, 0x649d, 0x64b4, 0x64d0, 0x64ee, - // Entry 6C00 - 6C3F - 0x6508, 0x6522, 0x653e, 0x6560, 0x6574, 0x658c, 0x65a6, 0x65c6, - 0x65ec, 0x6619, 0x664b, 0x6672, 0x66a0, 0x66d3, 0x66f7, 0x671c, - 0x6742, 0x675b, 0x6775, 0x678e, 0x67ab, 0x67ca, 0x67e6, 0x67f6, - 0x680e, 0x6826, 0x683f, 0x6857, 0x6872, 0x688c, 0x68b0, 0x68d4, - 0x68ed, 0x6906, 0x6926, 0x6946, 0x6966, 0x697d, 0x699d, 0x69b9, - 0x69d0, 0x69f0, 0x6a0c, 0x6a29, 0x6a47, 0x6a66, 0x6a81, 0x6aa5, - 0x6ac5, 0x6ae5, 0x6b0e, 0x6b33, 0x6b49, 0x6b67, 0x6b86, 0x6b9d, - 0x6bbc, 0x6bda, 0x6bfb, 0x6c1b, 0x6c3b, 0x6c54, 0x6c75, 0x6c96, - // Entry 6C40 - 6C7F - 0x6cb9, 0x6cd8, 0x6cfb, 0x6d27, 0x6d4e, 0x6d74, 0x6d9a, 0x6dc0, - 0x6dd1, 0x6deb, 0x6e06, 0x6e2a, 0x6e43, 0x6e65, 0x6e80, 0x6ea2, - 0x6ec5, 0x6ed5, 0x6ee5, 0x6efb, 0x6f19, 0x6f3b, 0x6f62, 0x6f8a, - 0x6fb1, 0x6fdd, 0x7004, 0x7029, 0x7057, 0x7073, 0x708c, 0x70a5, - 0x70be, 0x70d7, 0x70f0, 0x7109, 0x7122, 0x7134, 0x7158, 0x717d, - 0x7198, 0x71b2, 0x71cc, 0x71ea, 0x7204, 0x7225, 0x7236, 0x724b, - 0x7260, 0x7271, 0x7288, 0x0288, 0x02a3, 0x02be, 0x02d9, 0x02f4, - 0x030f, 0x030f, 0x032e, 0x034d, 0x036c, 0x038b, 0x03aa, 0x03c9, - // Entry 6C80 - 6CBF - 0x03e8, 0x0407, 0x0427, 0x0447, 0x0467, 0x0487, 0x04a7, 0x04c7, - 0x04e7, 0x00e7, 0x0106, 0x0126, 0x0146, 0x0169, 0x018a, 0x01ab, - 0x01ce, 0x01ce, 0x01f0, 0x0210, 0x0238, 0x0255, 0x0277, 0x0297, - 0x02ba, 0x02dd, 0x02fe, 0x031d, 0x033f, 0x0360, 0x0381, 0x03a3, - 0x03c2, 0x03e3, 0x0403, 0x0003, 0x0023, 0x0042, 0x0064, 0x0083, - 0x00a3, 0x00c3, 0x00e3, 0x00e3, 0x0101, 0x0126, 0x0126, 0x0144, - 0x0171, 0x0194, 0x01bf, 0x01df, 0x01df, 0x01fd, 0x021b, 0x0239, - 0x0258, 0x0276, 0x0295, 0x02b3, 0x02d2, 0x02f0, 0x030e, 0x032c, - // Entry 6CC0 - 6CFF - 0x034b, 0x0369, 0x0388, 0x03a6, 0x03c5, 0x03e4, 0x0403, 0x0422, - 0x0441, 0x0460, 0x047f, 0x049e, 0x04bd, 0x04dc, 0x04fc, 0x051c, - 0x053a, 0x0558, 0x0576, 0x0595, 0x05b3, 0x05d2, 0x05f0, 0x060d, - 0x062a, 0x0647, 0x0665, 0x0682, 0x06a0, 0x06bd, 0x06db, 0x06f9, - 0x0717, 0x0735, 0x0753, 0x0771, 0x078f, 0x07ad, 0x07cc, 0x07ea, - 0x0809, 0x0827, 0x0846, 0x0864, 0x0882, 0x08a0, 0x08bf, 0x08dd, - 0x08fc, 0x091a, 0x093d, 0x095b, 0x0979, 0x0997, 0x09b6, 0x09d5, - 0x09f3, 0x0a11, 0x0a2f, 0x0a4d, 0x0a6c, 0x0a8a, 0x0aa9, 0x0ac7, - // Entry 6D00 - 6D3F - 0x0ae5, 0x0b03, 0x0b21, 0x0b40, 0x0b5e, 0x0b7d, 0x0b9b, 0x0bbe, - 0x0bdc, 0x0bfa, 0x0c18, 0x0c37, 0x0c55, 0x0c74, 0x0c92, 0x0cb0, - 0x0cce, 0x0cec, 0x0d0b, 0x0d29, 0x0d48, 0x0d66, 0x0d85, 0x0da4, - 0x0dc3, 0x0de2, 0x0e01, 0x0e20, 0x0e3f, 0x0e5d, 0x0e7b, 0x0e99, - 0x0eb8, 0x0ed6, 0x0ef5, 0x0f13, 0x0f33, 0x0f53, 0x0f72, 0x0f91, - 0x0fb0, 0x0fcf, 0x0fee, 0x100e, 0x102e, 0x104e, 0x106e, 0x108f, - 0x10af, 0x10d0, 0x10f0, 0x1111, 0x1132, 0x1157, 0x117d, 0x11a2, - 0x11c0, 0x11de, 0x11fc, 0x121b, 0x123b, 0x125b, 0x127b, 0x129b, - // Entry 6D40 - 6D7F - 0x12bc, 0x12da, 0x12f8, 0x1316, 0x1335, 0x1353, 0x1372, 0x1390, - 0x13af, 0x13ce, 0x13ed, 0x140d, 0x142d, 0x144c, 0x146c, 0x148b, - 0x14ab, 0x14cf, 0x14f4, 0x1518, 0x1537, 0x1556, 0x1575, 0x1595, - 0x15b4, 0x15d4, 0x15f3, 0x1612, 0x1631, 0x1650, 0x1670, 0x168f, - 0x16af, 0x16ce, 0x16ec, 0x170b, 0x172a, 0x1749, 0x1769, 0x1788, - 0x17a8, 0x17c7, 0x17e6, 0x1805, 0x1825, 0x1845, 0x1863, 0x1881, - 0x189f, 0x18be, 0x18dc, 0x18fb, 0x1919, 0x1939, 0x1959, 0x1979, - 0x1999, 0x19b9, 0x01b9, 0x01d0, 0x01e7, 0x0200, 0x0218, 0x0230, - // Entry 6D80 - 6DBF - 0x0247, 0x0260, 0x0279, 0x0291, 0x02b5, 0x02d8, 0x02ff, 0x0327, - 0x0353, 0x0383, 0x03aa, 0x03aa, 0x03c3, 0x03dd, 0x03f6, 0x040f, - 0x0426, 0x0445, 0x045c, 0x0474, 0x048b, 0x04a1, 0x04b8, 0x04ce, - 0x04e4, 0x04fc, 0x0514, 0x052c, 0x0544, 0x055c, 0x0573, 0x0589, - 0x05a2, 0x05ba, 0x05d1, 0x05ea, 0x0601, 0x0619, 0x0630, 0x0648, - 0x065f, 0x0677, 0x068f, 0x06a7, 0x06bf, 0x06d7, 0x06ee, 0x0706, - 0x071d, 0x0734, 0x0749, 0x0766, 0x077b, 0x0791, 0x07a6, 0x07ba, - 0x07cf, 0x07e3, 0x07f7, 0x080d, 0x0823, 0x0839, 0x084f, 0x0865, - // Entry 6DC0 - 6DFF - 0x087a, 0x088e, 0x08a5, 0x08bb, 0x08d0, 0x08e7, 0x08fc, 0x0912, - 0x0927, 0x093d, 0x0952, 0x0968, 0x097e, 0x0994, 0x09aa, 0x09c0, - 0x09d5, 0x09eb, 0x0a00, 0x0a0b, 0x0a23, 0x0a44, 0x0a4f, 0x024f, - 0x025f, 0x026e, 0x027d, 0x028e, 0x029e, 0x02ae, 0x02bd, 0x02ce, - 0x02df, 0x02ef, 0x02ef, 0x030d, 0x0328, 0x0328, 0x0340, 0x0357, - 0x036f, 0x0386, 0x0386, 0x039d, 0x03b5, 0x03cc, 0x03e3, 0x03fa, - 0x0411, 0x0428, 0x0440, 0x0458, 0x0470, 0x0487, 0x049e, 0x04b5, - 0x04cc, 0x04e3, 0x04fc, 0x0513, 0x052b, 0x0543, 0x055b, 0x0572, - // Entry 6E00 - 6E3F - 0x0589, 0x05a2, 0x05c1, 0x05e1, 0x0600, 0x061f, 0x021f, 0x023e, - 0x025e, 0x025e, 0x027d, 0x027d, 0x029c, 0x029c, 0x02bb, 0x02da, - 0x02f9, 0x0319, 0x0339, 0x0359, 0x0378, 0x0397, 0x03b6, 0x03d5, - 0x03d5, 0x03f6, 0x0415, 0x0435, 0x0455, 0x0055, 0x0074, 0x0074, - 0x0095, 0x0095, 0x00b4, 0x00b4, 0x00d2, 0x00d2, 0x00f0, 0x00f0, - 0x010e, 0x010e, 0x012d, 0x014c, 0x016a, 0x016a, 0x0188, 0x01a6, - 0x01a6, 0x01c6, 0x01c6, 0x01e5, 0x01e5, 0x0203, 0x0203, 0x0223, - 0x0223, 0x024a, 0x024a, 0x0270, 0x0270, 0x0291, 0x02b3, 0x02b3, - // Entry 6E40 - 6E7F - 0x02d4, 0x02d4, 0x02f5, 0x0316, 0x0337, 0x0358, 0x0358, 0x037a, - 0x039c, 0x03be, 0x03df, 0x0400, 0x0421, 0x0442, 0x0042, 0x0065, - 0x0086, 0x00a8, 0x00ca, 0x00ca, 0x00eb, 0x010c, 0x012f, 0x0158, - 0x0158, 0x0181, 0x0181, 0x01a0, 0x01be, 0x01dd, 0x01fb, 0x0219, - 0x0237, 0x0256, 0x0274, 0x0292, 0x02b0, 0x02b0, 0x02ce, 0x02ed, - 0x030c, 0x032b, 0x0349, 0x0367, 0x0385, 0x03a3, 0x03c1, 0x03e1, - 0x03ff, 0x041e, 0x043d, 0x045c, 0x047a, 0x0498, 0x04b8, 0x00b8, - 0x00dd, 0x0103, 0x0128, 0x0128, 0x014d, 0x0173, 0x0198, 0x01bd, - // Entry 6E80 - 6EBF - 0x01e2, 0x01e2, 0x0207, 0x022d, 0x0253, 0x0279, 0x029e, 0x02c3, - 0x02e8, 0x030d, 0x0332, 0x0359, 0x037e, 0x03a4, 0x03ca, 0x03f0, - 0x0415, 0x043a, 0x0461, 0x0061, 0x0098, 0x00c1, 0x00c1, 0x00d7, - 0x00ee, 0x0104, 0x011b, 0x0132, 0x014b, 0x0164, 0x0182, 0x01a0, - 0x01c0, 0x01df, 0x01fe, 0x021c, 0x023c, 0x025c, 0x027b, 0x0296, - 0x02b1, 0x02ce, 0x02ea, 0x0306, 0x0321, 0x033e, 0x035b, 0x0377, - 0x0392, 0x03ad, 0x03ca, 0x03e6, 0x0402, 0x041d, 0x043a, 0x0457, - 0x0473, 0x0484, 0x0497, 0x04aa, 0x04c4, 0x04d7, 0x04ea, 0x04fd, - // Entry 6EC0 - 6EFF - 0x0510, 0x0522, 0x0533, 0x0133, 0x014e, 0x016a, 0x0186, 0x01a2, - 0x01be, 0x01da, 0x01f6, 0x0212, 0x022e, 0x024a, 0x0266, 0x0282, - 0x029e, 0x02ba, 0x02d6, 0x02f2, 0x030e, 0x032a, 0x0346, 0x0362, - 0x037e, 0x039a, 0x03b6, 0x03d2, 0x03ee, 0x040a, 0x0426, 0x0442, - 0x045e, 0x047a, 0x0496, 0x04b2, 0x04ce, 0x04ea, 0x0506, 0x0522, - 0x053e, 0x055a, 0x0576, 0x0592, 0x05ae, 0x05ca, 0x05e6, 0x0602, - 0x061e, 0x063a, 0x0656, 0x0672, 0x068e, 0x06aa, 0x06c3, 0x06dd, - 0x06f7, 0x0711, 0x072b, 0x0745, 0x075f, 0x0779, 0x0793, 0x07ad, - // Entry 6F00 - 6F3F - 0x07c7, 0x07e1, 0x07fb, 0x0815, 0x082f, 0x0849, 0x0863, 0x087d, - 0x0897, 0x08b1, 0x08cb, 0x08e5, 0x08ff, 0x0919, 0x0933, 0x094d, - 0x0967, 0x0981, 0x099b, 0x09b5, 0x09cf, 0x09e9, 0x0a03, 0x0a1d, - 0x0a37, 0x0a51, 0x0a6b, 0x0a85, 0x0a9f, 0x0ab9, 0x0ad3, 0x0aed, - 0x0b07, 0x0b21, 0x0b3b, 0x0b55, 0x0b6f, 0x0b89, 0x0ba3, 0x0bbd, - 0x03bd, 0x03ce, 0x03e8, 0x0402, 0x041e, 0x0439, 0x0454, 0x046e, - 0x048a, 0x04a6, 0x04c1, 0x04db, 0x04f6, 0x0513, 0x052f, 0x054a, - 0x014a, 0x0164, 0x017e, 0x019a, 0x01b5, 0x01d0, 0x01ea, 0x0206, - // Entry 6F40 - 6F7F - 0x0222, 0x023d, 0x0257, 0x0272, 0x028f, 0x02ab, 0x02c6, 0x02dc, - 0x02dc, 0x02f8, 0x0314, 0x0332, 0x034f, 0x036c, 0x0388, 0x03a6, - 0x03c4, 0x03e1, 0x03fd, 0x041a, 0x0439, 0x0457, 0x0474, 0x048c, - 0x008c, 0x00a5, 0x00be, 0x00d9, 0x00f3, 0x010d, 0x0126, 0x0141, - 0x015c, 0x0176, 0x018f, 0x01a9, 0x01c5, 0x01e0, 0x01fa, 0x0212, - 0x0223, 0x0237, 0x024b, 0x025f, 0x0273, 0x0287, 0x029b, 0x02af, - 0x02c3, 0x02d7, 0x02ec, 0x0301, 0x0316, 0x032b, 0x0340, 0x0355, - 0x036a, 0x037f, 0x0394, 0x03a9, 0x03be, 0x03d3, 0x03d3, 0x03e7, - // Entry 6F80 - 6FBF - 0x03f7, 0x0406, 0x0415, 0x0426, 0x0436, 0x0446, 0x0455, 0x0466, - 0x0477, 0x0487, 0x04ac, 0x04da, 0x00da, 0x00fe, 0x0122, 0x0146, - 0x016a, 0x018e, 0x01b2, 0x01d6, 0x01fa, 0x021e, 0x0242, 0x0266, - 0x028a, 0x02ae, 0x02d2, 0x02f6, 0x031a, 0x033e, 0x0362, 0x0386, - 0x03aa, 0x03ce, 0x03f2, 0x0416, 0x043a, 0x045e, 0x0482, 0x04b1, - 0x04d6, 0x04fb, 0x0505, 0x050f, 0x010f, 0x012d, 0x014b, 0x0169, - 0x0187, 0x01a5, 0x01c3, 0x01e1, 0x01ff, 0x021d, 0x023b, 0x0259, - 0x0277, 0x0295, 0x02b3, 0x02d1, 0x02ef, 0x030d, 0x032b, 0x0349, - // Entry 6FC0 - 6FFF - 0x0367, 0x0385, 0x03a3, 0x03c1, 0x03df, 0x03fd, 0x041b, 0x0425, - 0x042f, 0x0439, 0x0443, 0x044e, 0x0458, 0x047f, 0x04a6, 0x04cd, - 0x04f4, 0x051b, 0x0542, 0x0569, 0x0590, 0x05b7, 0x05de, 0x0605, - 0x062c, 0x0653, 0x067a, 0x06a1, 0x06c8, 0x06ef, 0x0716, 0x073d, - 0x0764, 0x078b, 0x07b2, 0x07d9, 0x0800, 0x0827, 0x084e, 0x085c, - 0x086a, 0x006a, 0x0091, 0x00b8, 0x00df, 0x0106, 0x012d, 0x0154, - 0x017b, 0x01a2, 0x01c9, 0x01f0, 0x0217, 0x023e, 0x0265, 0x028c, - 0x02b3, 0x02da, 0x0301, 0x0328, 0x034f, 0x0376, 0x039d, 0x03c4, - // Entry 7000 - 703F - 0x03eb, 0x0412, 0x0439, 0x0460, 0x048f, 0x04a2, 0x04b5, 0x04c8, - 0x04db, 0x04ee, 0x04f7, 0x0501, 0x050d, 0x0519, 0x0523, 0x052e, - 0x0538, 0x0542, 0x054d, 0x056d, 0x0577, 0x0586, 0x059b, 0x05a8, - 0x05b6, 0x05c5, 0x05db, 0x05f2, 0x060e, 0x061d, 0x0639, 0x0655, - 0x065f, 0x066a, 0x0678, 0x0688, 0x0693, 0x069e, 0x06a9, 0x02a9, - 0x02cb, 0x02ed, 0x030f, 0x0331, 0x0353, 0x0375, 0x0397, 0x03b9, - 0x03db, 0x03fd, 0x041f, 0x0441, 0x0463, 0x0485, 0x04a7, 0x04c9, - 0x04eb, 0x050d, 0x052f, 0x0551, 0x0573, 0x0595, 0x05b7, 0x05d9, - // Entry 7040 - 707F - 0x05fb, 0x061d, 0x0631, 0x0646, 0x0659, 0x0259, 0x027b, 0x029d, - 0x02bf, 0x02d2, 0x02f4, 0x0316, 0x0338, 0x035a, 0x037c, 0x039e, - 0x03c0, 0x03e2, 0x0404, 0x0426, 0x0448, 0x046a, 0x048c, 0x04ae, - 0x04d0, 0x04f2, 0x0514, 0x0536, 0x0558, 0x057a, 0x059c, 0x05be, - 0x05e0, 0x0602, 0x0624, 0x0646, 0x0668, 0x068a, 0x06ac, 0x06ce, - 0x06f0, 0x0712, 0x0734, 0x0756, 0x0778, 0x079a, 0x07bc, 0x07de, - 0x0800, 0x0822, 0x0022, 0x0055, 0x0088, 0x00bb, 0x00ee, 0x0121, - 0x0154, 0x0187, 0x01ba, 0x01ed, 0x01ed, 0x0208, 0x0220, 0x0220, - // Entry 7080 - 70BF - 0x0227, 0x022c, 0x023b, 0x024b, 0x0261, 0x0268, 0x0279, 0x028e, - 0x0295, 0x02a4, 0x02ae, 0x02b5, 0x02be, 0x02d7, 0x02eb, 0x0305, - 0x0319, 0x0328, 0x0343, 0x035c, 0x0376, 0x0386, 0x03a0, 0x03b8, - 0x03d3, 0x03e0, 0x03f2, 0x040e, 0x0429, 0x043c, 0x0449, 0x0455, - 0x0462, 0x046d, 0x047a, 0x0483, 0x049d, 0x04b3, 0x04d3, 0x04e2, - 0x04f1, 0x0505, 0x0517, 0x051a, 0x052b, 0x0532, 0x0536, 0x053d, - 0x0545, 0x054d, 0x055b, 0x0569, 0x0572, 0x0578, 0x0582, 0x0587, - 0x0595, 0x0599, 0x05a1, 0x05aa, 0x05b1, 0x05bd, 0x05c8, 0x05cc, - // Entry 70C0 - 70FF - 0x05dc, 0x05e6, 0x05f1, 0x0608, 0x0610, 0x0616, 0x061f, 0x0625, - 0x062a, 0x0634, 0x063d, 0x0642, 0x0648, 0x0651, 0x065a, 0x0665, - 0x0669, 0x066e, 0x0676, 0x0680, 0x0689, 0x0697, 0x06a3, 0x06ae, - 0x06ba, 0x06c3, 0x06ce, 0x06dc, 0x06e9, 0x06f2, 0x06f7, 0x0703, - 0x0717, 0x071c, 0x0720, 0x0725, 0x0731, 0x074c, 0x075a, 0x0764, - 0x076d, 0x0775, 0x077b, 0x0788, 0x078d, 0x0795, 0x079c, 0x07a5, - 0x07ae, 0x07b7, 0x07c2, 0x07c9, 0x07d7, 0x07ec, 0x07ff, 0x0809, - 0x0817, 0x0825, 0x082d, 0x083f, 0x084a, 0x0863, 0x087b, 0x0882, - // Entry 7100 - 713F - 0x0888, 0x0897, 0x08a4, 0x08b2, 0x08c0, 0x08d0, 0x08d9, 0x08ea, - 0x08f1, 0x08fd, 0x090a, 0x0917, 0x0924, 0x0933, 0x0941, 0x094e, - 0x0958, 0x096d, 0x097b, 0x0989, 0x09a3, 0x09b5, 0x09c3, 0x09d2, - 0x09ed, 0x09fe, 0x0a0a, 0x0a17, 0x0a35, 0x0a54, 0x0a5f, 0x0a70, - 0x0a7e, 0x0a8a, 0x0a98, 0x0aad, 0x0ab7, 0x0ac3, 0x0ac9, 0x0ad2, - 0x0ae0, 0x0ae7, 0x0af2, 0x0af8, 0x0b05, 0x0b14, 0x0b1e, 0x0b28, - 0x0b34, 0x0b3d, 0x0b45, 0x0b4c, 0x0b60, 0x0b6c, 0x0b82, 0x0b8b, - 0x0b91, 0x0ba1, 0x0ba8, 0x0bae, 0x0bbb, 0x0bd2, 0x0be9, 0x0bf9, - // Entry 7140 - 717F - 0x0c0c, 0x0c1a, 0x0c25, 0x0c2b, 0x0c31, 0x0c3d, 0x0c43, 0x0c4f, - 0x0c60, 0x0c6e, 0x0c75, 0x0c82, 0x0c88, 0x0c99, 0x0ca3, 0x0cb7, - 0x0cc1, 0x0cdc, 0x0cf5, 0x0d11, 0x0d25, 0x0d2c, 0x0d3f, 0x0d54, - 0x0d63, 0x0d6c, 0x0d83, 0x0d95, 0x0d9b, 0x0da8, 0x0db5, 0x0dbc, - 0x0dca, 0x0ddb, 0x0dea, 0x0dfe, 0x0e12, 0x0e1a, 0x0e1e, 0x0e36, - 0x0e3b, 0x0e45, 0x0e56, 0x0e5c, 0x0e6c, 0x0e73, 0x0e82, 0x0e91, - 0x0ea0, 0x0ead, 0x0eba, 0x0ecb, 0x0edc, 0x0ee3, 0x0ef0, 0x0ef5, - 0x0f16, 0x0f23, 0x0f2a, 0x0f4d, 0x0f6e, 0x0f8f, 0x0fb0, 0x0fd1, - // Entry 7180 - 71BF - 0x0fd4, 0x0fd9, 0x0fdb, 0x0fe8, 0x0feb, 0x0ff0, 0x0ff7, 0x0ffd, - 0x1000, 0x1006, 0x100f, 0x1014, 0x1019, 0x101e, 0x1023, 0x1026, - 0x102a, 0x102f, 0x1035, 0x103c, 0x1043, 0x1046, 0x1049, 0x104d, - 0x1055, 0x105c, 0x1068, 0x106b, 0x106e, 0x1076, 0x1081, 0x1085, - 0x1092, 0x109a, 0x10a0, 0x10ae, 0x10b8, 0x10cf, 0x10d3, 0x10da, - 0x10df, 0x10e5, 0x10f4, 0x1102, 0x1109, 0x1113, 0x111b, 0x1125, - 0x1130, 0x1138, 0x1143, 0x1151, 0x115b, 0x1166, 0x116e, 0x1176, - 0x117f, 0x118b, 0x1194, 0x119d, 0x11a7, 0x11af, 0x11b9, 0x11c1, - // Entry 71C0 - 71FF - 0x11c5, 0x11c8, 0x11cb, 0x11cf, 0x11d4, 0x11da, 0x11fa, 0x121c, - 0x123e, 0x1261, 0x1271, 0x1281, 0x128d, 0x129b, 0x12ab, 0x12be, - 0x12cd, 0x12d2, 0x12dc, 0x12e6, 0x12ed, 0x12f4, 0x12f9, 0x12fe, - 0x1304, 0x130a, 0x1318, 0x131d, 0x1324, 0x1329, 0x1332, 0x133f, - 0x134f, 0x135c, 0x1368, 0x1372, 0x1384, 0x1397, 0x139a, 0x139e, - 0x13a1, 0x13a6, 0x13ac, 0x13c7, 0x13dc, 0x13f3, 0x1401, 0x1416, - 0x1425, 0x143b, 0x144e, 0x145d, 0x1466, 0x1471, 0x1475, 0x1488, - 0x1490, 0x149d, 0x14ac, 0x14b1, 0x14bb, 0x14d1, 0x14de, 0x14e1, - // Entry 7200 - 723F - 0x14e6, 0x14fd, 0x1506, 0x150c, 0x1514, 0x151f, 0x152b, 0x1532, - 0x153d, 0x1544, 0x1548, 0x1551, 0x155c, 0x1560, 0x1569, 0x156d, - 0x1574, 0x1585, 0x158c, 0x1599, 0x15a5, 0x15af, 0x15be, 0x15cb, - 0x15db, 0x15e5, 0x15f0, 0x15fc, 0x1608, 0x1619, 0x1629, 0x1639, - 0x1658, 0x166b, 0x1677, 0x167b, 0x168a, 0x169a, 0x16b0, 0x16b7, - 0x16c2, 0x16cd, 0x16da, 0x16e6, 0x16f4, 0x1703, 0x170f, 0x1724, - 0x172d, 0x173e, 0x174f, 0x175a, 0x1770, 0x1789, 0x17a0, 0x17b8, - 0x17c8, 0x17ed, 0x17f1, 0x1802, 0x180b, 0x1813, 0x181e, 0x182a, - // Entry 7240 - 727F - 0x182d, 0x1838, 0x1848, 0x1856, 0x1864, 0x186c, 0x187d, 0x1887, - 0x189f, 0x18b9, 0x18c2, 0x18cb, 0x18d2, 0x18df, 0x18e8, 0x18f6, - 0x1906, 0x1913, 0x1919, 0x1921, 0x193f, 0x194a, 0x1953, 0x195d, - 0x1966, 0x1971, 0x1976, 0x1980, 0x1986, 0x198a, 0x199c, 0x19a1, - 0x19ac, 0x19bd, 0x19d7, 0x19e9, 0x19f4, 0x19fe, 0x1a05, 0x1a12, - 0x1a23, 0x1a46, 0x1a66, 0x1a85, 0x1aa2, 0x1ac0, 0x1ac7, 0x1ad2, - 0x1adb, 0x1ae7, 0x1b11, 0x1b1f, 0x1b2f, 0x1b3f, 0x1b50, 0x1b56, - 0x1b67, 0x1b73, 0x1b7d, 0x1b82, 0x1b8f, 0x1b9d, 0x1bac, 0x1bb8, - // Entry 7280 - 72BF - 0x1bd1, 0x1c06, 0x1c54, 0x1c86, 0x1cbc, 0x1cd1, 0x1ce7, 0x1d07, - 0x1d0e, 0x1d29, 0x1d47, 0x1d4e, 0x1d5b, 0x1d79, 0x1d98, 0x1da9, - 0x1dbd, 0x1dc0, 0x1dc4, 0x1dcd, 0x1dd1, 0x1dee, 0x1df6, 0x1e01, - 0x1e0d, 0x1e2c, 0x1e4a, 0x1e7e, 0x1e9e, 0x1eba, 0x1ed6, 0x1ee0, - 0x1f06, 0x1f2a, 0x1f42, 0x1f5a, 0x1f78, 0x1f7c, 0x1f8a, 0x1f90, - 0x1f96, 0x1fa2, 0x1fa7, 0x1fad, 0x1fb7, 0x1fc0, 0x1fcc, 0x1fec, - 0x2008, 0x2016, 0x2029, 0x203c, 0x204c, 0x205d, 0x2071, 0x2083, - 0x2097, 0x20a9, 0x20c1, 0x20db, 0x20f9, 0x2119, 0x213a, 0x215b, - // Entry 72C0 - 72FF - 0x216f, 0x2192, 0x219e, 0x21c5, 0x21ed, 0x2205, 0x2216, 0x2227, - 0x2233, 0x223c, 0x2249, 0x224e, 0x2254, 0x225d, 0x2277, 0x2286, - 0x229b, 0x22b0, 0x22c7, 0x22dd, 0x22f3, 0x2308, 0x231f, 0x2336, - 0x234c, 0x2361, 0x2379, 0x2391, 0x23a6, 0x23bb, 0x23d2, 0x23e8, - 0x23fe, 0x2413, 0x242a, 0x2441, 0x2457, 0x246c, 0x2484, 0x249c, - 0x24a9, 0x24ca, 0x24ee, 0x24f6, 0x250f, 0x251b, 0x251f, 0x2525, - 0x2536, 0x2550, 0x2559, 0x255d, 0x257c, 0x2589, 0x2598, 0x259e, - 0x25a8, 0x25b0, 0x25bb, 0x25d7, 0x25f3, 0x2610, 0x2629, 0x2642, - // Entry 7300 - 733F - 0x265b, 0x2671, 0x2681, 0x2691, 0x26a8, 0x26b7, 0x26d0, 0x26e1, - 0x26ee, 0x26ff, 0x2717, 0x272e, 0x2743, 0x2754, 0x2765, 0x2778, - 0x2798, 0x27c1, 0x27d8, 0x27f1, 0x2806, 0x282f, 0x2864, 0x2887, - 0x28a9, 0x28cc, 0x28ee, 0x2911, 0x2933, 0x2956, 0x2976, 0x2998, - 0x29b8, 0x29da, 0x29fa, 0x2a1c, 0x2a27, 0x2a37, 0x2a49, 0x2a62, - 0x2a69, 0x2a7a, 0x2a96, 0x2ab2, 0x2ac8, 0x2ad6, 0x2ae4, 0x2af4, - 0x2b04, 0x2b16, 0x2b1f, 0x2b34, 0x2b3d, 0x2b43, 0x2b4f, 0x2b57, - 0x2b68, 0x2b7a, 0x2b98, 0x2bad, 0x2bbf, 0x2bcf, 0x2bde, 0x2bea, - // Entry 7340 - 737F - 0x2bf0, 0x2bfb, 0x2c0e, 0x2c1b, 0x2c27, 0x2c31, 0x2c40, 0x2c4e, - 0x2c52, 0x2c5b, 0x2c63, 0x2c71, 0x2c7b, 0x2c86, 0x2c8e, 0x2c92, - 0x2c97, 0x2ca2, 0x2cb1, 0x2cc4, 0x2cd2, 0x2cda, 0x2ce2, 0x2ce9, - 0x2d13, 0x2d21, 0x2d3a, 0x2d53, 0x2d5e, 0x2d65, 0x2d78, 0x2d8e, - 0x2d99, 0x2da5, 0x2da9, 0x2dc4, 0x2dd4, 0x2de4, 0x2df3, 0x2e03, - 0x2e15, 0x2e28, 0x2e3a, 0x2e4e, 0x2e61, 0x2e75, 0x2e86, 0x2e98, - 0x2ea3, 0x2eb8, 0x2ec6, 0x2edc, 0x2eeb, 0x2f03, 0x2f17, 0x2f34, - 0x2f44, 0x2f5e, 0x2f67, 0x2f71, 0x2f7c, 0x2f8d, 0x2fa0, 0x2fa5, - // Entry 7380 - 73BF - 0x2fb2, 0x2fd1, 0x2fe7, 0x3003, 0x3030, 0x305b, 0x308f, 0x30a5, - 0x30bc, 0x30c8, 0x30e6, 0x3103, 0x3110, 0x3133, 0x314f, 0x315c, - 0x3168, 0x317b, 0x3188, 0x319c, 0x31a8, 0x31b5, 0x31c4, 0x31d0, - 0x31e4, 0x3202, 0x321f, 0x3239, 0x3263, 0x3295, 0x32a6, 0x32b2, - 0x32bc, 0x32c8, 0x32d3, 0x32e3, 0x32fc, 0x331a, 0x3337, 0x3345, - 0x3351, 0x335b, 0x3366, 0x3370, 0x337e, 0x3390, 0x33a4, 0x33af, - 0x33d2, 0x33e8, 0x33f7, 0x3403, 0x3410, 0x341a, 0x342c, 0x3442, - 0x3465, 0x347f, 0x349f, 0x34c6, 0x34dd, 0x34fe, 0x350e, 0x351d, - // Entry 73C0 - 73FF - 0x352b, 0x3541, 0x3556, 0x3566, 0x357c, 0x3595, 0x35a9, 0x35bd, - 0x35cf, 0x35e2, 0x35f6, 0x3613, 0x363b, 0x364a, 0x3662, 0x367a, - 0x3692, 0x36aa, 0x36c2, 0x36da, 0x36f9, 0x3718, 0x3737, 0x3756, - 0x3773, 0x3790, 0x37ad, 0x37ca, 0x37ed, 0x3810, 0x3833, 0x3856, - 0x386d, 0x3884, 0x389b, 0x38b2, 0x38cf, 0x38ec, 0x3909, 0x3926, - 0x3942, 0x396e, 0x3989, 0x39b4, 0x39c4, 0x39d2, 0x39e3, 0x39f3, - 0x3a0e, 0x3a2f, 0x3a48, 0x3a67, 0x3a7f, 0x3a97, 0x3ad3, 0x3b08, - 0x3b41, 0x3b5b, 0x3b7a, 0x3b9f, 0x3bb1, 0x3bcb, 0x3bd8, 0x3bed, - // Entry 7400 - 743F - 0x3bf3, 0x3bfd, 0x3c0d, 0x3c18, 0x3c28, 0x3c49, 0x3c4e, 0x3c53, - 0x3c5d, 0x3c64, 0x3c68, 0x3c70, 0x3c73, 0x3c7f, 0x3c89, 0x3c91, - 0x3c98, 0x3ca1, 0x3cac, 0x3cb6, 0x3cc9, 0x3ccd, 0x3cda, 0x3ce4, - 0x3cf7, 0x3d0b, 0x3d19, 0x3d2a, 0x3d31, 0x3d39, 0x3d49, 0x3d5b, - 0x3d6c, 0x3d7a, 0x3d7e, 0x3d85, 0x3d8e, 0x3da6, 0x3dbc, 0x3dcd, - 0x3de8, 0x3dff, 0x3e03, 0x3e10, 0x3e1e, 0x3e2f, 0x3e4d, 0x3e61, - 0x3e75, 0x3e8d, 0x3e94, 0x3e9f, 0x3ea8, 0x3eba, 0x3ec4, 0x3ed2, - 0x3ee3, 0x3eee, 0x3efb, 0x3f03, 0x3f0e, 0x3f14, 0x3f20, 0x3f26, - // Entry 7440 - 747F - 0x3f2a, 0x3f31, 0x3f41, 0x3f48, 0x3f55, 0x3f61, 0x3f7e, 0x3f8d, - 0x3fa7, 0x3fb2, 0x3fbe, 0x3fcc, 0x3fe2, 0x3fef, 0x3ffb, 0x3ffe, - 0x400e, 0x401c, 0x402c, 0x002c, 0x003d, 0x0043, 0x004b, 0x0053, - 0x0060, 0x006a, 0x0087, 0x009b, 0x00b5, 0x00c3, 0x00de, 0x00f0, - 0x0101, 0x0101, 0x010a, 0x011e, 0x012f, 0x013d, 0x0144, 0x0151, - 0x0156, 0x0156, 0x0178, 0x0191, 0x01ab, 0x01c6, 0x01e1, 0x0201, - 0x0221, 0x0243, 0x0263, 0x0285, 0x02a2, 0x02c1, 0x02e0, 0x02fc, - 0x0325, 0x0347, 0x036e, 0x0397, 0x03c0, 0x03de, 0x03f8, 0x0413, - // Entry 7480 - 74BF - 0x0430, 0x044f, 0x046e, 0x048f, 0x04a9, 0x04c5, 0x04e3, 0x0503, - 0x0527, 0x054c, 0x056c, 0x0591, 0x05ba, 0x05e0, 0x0608, 0x0630, - 0x0660, 0x0691, 0x06b0, 0x06cd, 0x06eb, 0x070d, 0x0738, 0x075e, - 0x0791, 0x07ba, 0x07e3, 0x080e, 0x082b, 0x084a, 0x0869, 0x0888, - 0x08a4, 0x08c2, 0x08e1, 0x0903, 0x0920, 0x093d, 0x095c, 0x097d, - 0x099e, 0x09ba, 0x09d8, 0x09f8, 0x0a13, 0x0a30, 0x0a4d, 0x0a67, - 0x0a80, 0x0a9c, 0x0aba, 0x0ad3, 0x0aec, 0x0b08, 0x0b22, 0x0b3d, - 0x0b60, 0x0b85, 0x0ba3, 0x0bc0, 0x0be5, 0x0c04, 0x0c1e, 0x0c39, - // Entry 74C0 - 74FF - 0x0c59, 0x0c74, 0x0c93, 0x0cae, 0x0cd2, 0x0cef, 0x0d1a, 0x0d47, - 0x0d68, 0x0d89, 0x0da6, 0x0dc4, 0x0de4, 0x0e00, 0x0e22, 0x0e40, - 0x0e60, 0x0e80, 0x0ea0, 0x0ec0, 0x0edd, 0x0eff, 0x0f24, 0x0f40, - 0x0f5a, 0x0f75, 0x0f94, 0x0faf, 0x0fce, 0x0fee, 0x03ee, 0x041a, - 0x0444, 0x0471, 0x049d, 0x04b8, 0x04d0, 0x04e1, 0x04f3, 0x050a, - 0x0526, 0x0550, 0x055c, 0x056d, 0x0588, 0x059a, 0x05ad, 0x05be, - 0x05d0, 0x05e7, 0x0603, 0x0632, 0x065d, 0x066a, 0x067c, 0x0694, - 0x06ae, 0x06df, 0x070c, 0x071a, 0x072c, 0x0744, 0x075e, 0x078a, - // Entry 7500 - 753F - 0x079a, 0x07ab, 0x07bd, 0x07cd, 0x07e2, 0x07f8, 0x0813, 0x081f, - 0x082c, 0x083a, 0x0846, 0x0853, 0x0865, 0x087c, 0x0896, 0x08b1, - 0x08ca, 0x08e4, 0x0903, 0x0927, 0x0940, 0x095a, 0x0972, 0x098b, - 0x09a9, 0x09cc, 0x09e7, 0x0a03, 0x0a1d, 0x0a38, 0x0a58, 0x0a76, - 0x0a95, 0x0aad, 0x0acf, 0x0aec, 0x0b0a, 0x0b21, 0x0b42, 0x0b6a, - 0x0b87, 0x0ba4, 0x0bc1, 0x0bdd, 0x0bf6, 0x0c15, 0x0c33, 0x0c56, - 0x0c77, 0x0c96, 0x0cb5, 0x0cd7, 0x00d7, 0x0104, 0x012f, 0x015d, - 0x018a, 0x01b8, 0x01e4, 0x0213, 0x0241, 0x026e, 0x0299, 0x02c7, - // Entry 7540 - 757F - 0x02f4, 0x02f4, 0x0324, 0x0352, 0x0383, 0x03b3, 0x03dd, 0x0405, - 0x0430, 0x045a, 0x048a, 0x04b8, 0x04e9, 0x0519, 0x054f, 0x0583, - 0x05ba, 0x05f0, 0x0621, 0x0650, 0x0682, 0x06b3, 0x06e4, 0x0713, - 0x0745, 0x0776, 0x07a5, 0x07d2, 0x0802, 0x0831, 0x0861, 0x088f, - 0x08c0, 0x08f0, 0x0925, 0x0958, 0x098e, 0x09c3, 0x09de, 0x09f7, - 0x0a13, 0x0a2e, 0x0a45, 0x0a5a, 0x0a72, 0x0a89, 0x0aa3, 0x0abb, - 0x0ad6, 0x0af0, 0x0b10, 0x0b2e, 0x0b4f, 0x0b6f, 0x0b84, 0x0b97, - 0x0bad, 0x0bc2, 0x03c2, 0x03dc, 0x03f4, 0x040f, 0x0429, 0x0444, - // Entry 7580 - 75BF - 0x045f, 0x047a, 0x0495, 0x04b0, 0x04c8, 0x00c8, 0x00ee, 0x0112, - 0x0139, 0x015f, 0x0186, 0x01ad, 0x01d4, 0x01fb, 0x021b, 0x0239, - 0x025a, 0x027a, 0x029b, 0x02bc, 0x02dd, 0x02fe, 0x0325, 0x034a, - 0x0372, 0x0399, 0x03c1, 0x03e9, 0x0411, 0x0439, 0x045f, 0x0483, - 0x04aa, 0x04d0, 0x04f7, 0x051e, 0x0545, 0x056c, 0x0597, 0x05c0, - 0x05ec, 0x0617, 0x0643, 0x066f, 0x069b, 0x06c7, 0x02c7, 0x02e3, - 0x02fd, 0x031a, 0x0336, 0x0365, 0x0392, 0x03c2, 0x03f1, 0x0412, - 0x0431, 0x0453, 0x0474, 0x048f, 0x04b1, 0x04d1, 0x04f2, 0x0515, - // Entry 75C0 - 75FF - 0x0539, 0x0559, 0x057a, 0x059b, 0x05be, 0x05e0, 0x0602, 0x062c, - 0x0657, 0x0682, 0x06ae, 0x06c9, 0x06eb, 0x02eb, 0x02fc, 0x030c, - 0x0321, 0x032a, 0x0337, 0x034d, 0x0357, 0x0363, 0x0374, 0x0380, - 0x0393, 0x03a3, 0x03b4, 0x03bd, 0x03e7, 0x03e7, 0x03fb, 0x0405, - 0x0413, 0x0430, 0x043d, 0x0447, 0x0450, 0x045d, 0x005d, 0x006b, - 0x006b, 0x0071, 0x0077, 0x0084, 0x0094, 0x0099, 0x00af, 0x00b7, - 0x00bd, 0x00ce, 0x00d7, 0x00e1, 0x00e9, 0x00e9, 0x00f6, 0x010a, - 0x011a, 0x0127, 0x012c, 0x0134, 0x0139, 0x014a, 0x015c, 0x016d, - // Entry 7600 - 763F - 0x0179, 0x018d, 0x018d, 0x0196, 0x019d, 0x01a5, 0x01aa, 0x01b0, - 0x01b6, 0x01c4, 0x01cf, 0x01e2, 0x01f3, 0x01f6, 0x0203, 0x020a, - 0x0213, 0x021b, 0x021b, 0x021f, 0x0228, 0x0230, 0x0236, 0x0242, - 0x0247, 0x024b, 0x024e, 0x0253, 0x0256, 0x025e, 0x0267, 0x026b, - 0x0272, 0x0278, 0x0282, 0x0288, 0x028d, 0x028d, 0x0299, 0x0299, - 0x02ba, 0x02db, 0x02fc, 0x031d, 0x033e, 0x035f, 0x0380, 0x03a1, - 0x03c2, 0x03e3, 0x0404, 0x0425, 0x0446, 0x0467, 0x0488, 0x04a9, - 0x04ca, 0x04eb, 0x050c, 0x052d, 0x054e, 0x056f, 0x0590, 0x05b1, - // Entry 7640 - 767F - 0x05d2, 0x05f3, 0x0614, 0x0635, 0x0656, 0x0677, 0x0698, 0x06b9, - 0x06da, 0x06fb, 0x071c, 0x073d, 0x075e, 0x077f, 0x07a0, 0x07c1, - 0x07e2, 0x0803, 0x0824, 0x0845, 0x0866, 0x0887, 0x08a8, 0x08c9, - 0x08ea, 0x090b, 0x092c, 0x094d, 0x096e, 0x098f, 0x09b0, 0x09d1, - 0x09f2, 0x0a13, 0x0a34, 0x0a55, 0x0a76, 0x0a97, 0x0ab8, 0x0ad9, - 0x0afa, 0x0b1b, 0x0b3c, 0x0b5d, 0x0b7e, 0x0b9f, 0x0bc0, 0x0be1, - 0x0c02, 0x0c23, 0x0c44, 0x0c65, 0x0c86, 0x0ca7, 0x0cc8, 0x0ce9, - 0x0d0a, 0x0d2b, 0x0d4c, 0x0d6d, 0x0d8e, 0x0daf, 0x0dd0, 0x0df1, - // Entry 7680 - 76BF - 0x0e12, 0x0e33, 0x0e54, 0x0e75, 0x0e96, 0x0eb7, 0x0ed8, 0x0ef9, - 0x0f1a, 0x0f3b, 0x0f5c, 0x0f7d, 0x0f9e, 0x0fbf, 0x0fe0, 0x1001, - 0x1022, 0x1043, 0x1064, 0x1085, 0x10a6, 0x10c7, 0x10e8, 0x1109, - 0x112a, 0x114b, 0x116c, 0x118d, 0x11ae, 0x11cf, 0x11f0, 0x1211, - 0x1232, 0x1253, 0x1274, 0x1295, 0x12b6, 0x12d7, 0x12f8, 0x1319, - 0x133a, 0x135b, 0x137c, 0x139d, 0x13be, 0x13df, 0x1400, 0x1421, - 0x1442, 0x1463, 0x1484, 0x14a5, 0x14c6, 0x14e7, 0x1508, 0x1529, - 0x154a, 0x156b, 0x158c, 0x15ad, 0x15ce, 0x15ef, 0x1610, 0x1631, - // Entry 76C0 - 76FF - 0x1652, 0x1673, 0x1694, 0x16b5, 0x16d6, 0x16f7, 0x1718, 0x1739, - 0x175a, 0x177b, 0x179c, 0x17bd, 0x17de, 0x17ff, 0x1820, 0x1841, - 0x1862, 0x1883, 0x18a4, 0x18c5, 0x18e6, 0x1907, 0x1928, 0x1949, - 0x196a, 0x198b, 0x19ac, 0x19cd, 0x19ee, 0x1a0f, 0x1a30, 0x1a51, - 0x1a72, 0x1a93, 0x1ab4, 0x1ad5, 0x1af6, 0x1b17, 0x1b38, 0x1b59, - 0x1b7a, 0x1b9b, 0x1bbc, 0x1bdd, 0x1bfe, 0x1c1f, 0x1c40, 0x1c61, - 0x1c82, 0x1ca3, 0x1cc4, 0x1ce5, 0x1d06, 0x1d27, 0x1d48, 0x1d69, - 0x1d8a, 0x1dab, 0x1dcc, 0x1ded, 0x1e0e, 0x1e2f, 0x1e50, 0x1e71, - // Entry 7700 - 773F - 0x1e92, 0x1eb3, 0x1ed4, 0x1ef5, 0x1f16, 0x1f37, 0x1f58, 0x1f79, - 0x1f9a, 0x1fbb, 0x1fdc, 0x1ffd, 0x201e, 0x203f, 0x2060, 0x2081, - 0x20a2, 0x20c3, 0x20e4, 0x2105, 0x2126, 0x2147, 0x2168, 0x2189, - 0x21aa, 0x21cb, 0x21ec, 0x220d, 0x222e, 0x224f, 0x2270, 0x2291, - 0x22b2, 0x22d3, 0x22f4, 0x2315, 0x2336, 0x2357, 0x2378, 0x2399, - 0x23ba, 0x23db, 0x23fc, 0x241d, 0x243e, 0x245f, 0x2480, 0x24a1, - 0x24c2, 0x24e3, 0x2504, 0x2525, 0x2546, 0x2567, 0x2588, 0x25a9, - 0x25ca, 0x25eb, 0x260c, 0x262d, 0x264e, 0x266f, 0x2690, 0x26b1, - // Entry 7740 - 777F - 0x26d2, 0x26f3, 0x2714, 0x2735, 0x2756, 0x2777, 0x2798, 0x27b9, - 0x27da, 0x27fb, 0x281c, 0x283d, 0x285e, 0x287f, 0x28a0, 0x28c1, - 0x28e2, 0x2903, 0x2924, 0x2945, 0x2966, 0x2987, 0x29a8, 0x29c9, - 0x29ea, 0x2a0b, 0x2a2c, 0x2a4d, 0x2a6e, 0x2a8f, 0x2ab0, 0x2ad1, - 0x2af2, 0x2b13, 0x2b34, 0x2b55, 0x2b76, 0x2b97, 0x2bb8, 0x2bd9, - 0x2bfa, 0x2c1b, 0x2c3c, 0x2c5d, 0x2c7e, 0x2c9f, 0x2cc0, 0x2ce1, - 0x2d02, 0x2d23, 0x2d44, 0x2d65, 0x2d86, 0x2da7, 0x2dc8, 0x2de9, - 0x2e0a, 0x2e2b, 0x2e4c, 0x2e6d, 0x2e8e, 0x2eaf, 0x2ed0, 0x2ef1, - // Entry 7780 - 77BF - 0x2f12, 0x2f33, 0x2f54, 0x2f75, 0x2f96, 0x2fb7, 0x2fd8, 0x2ff9, - 0x301a, 0x303b, 0x305c, 0x307d, 0x309e, 0x30bf, 0x30e0, 0x3101, - 0x3122, 0x3143, 0x3164, 0x3185, 0x31a6, 0x31c7, 0x31e8, 0x3209, - 0x322a, 0x324b, 0x326c, 0x328d, 0x32ae, 0x32cf, 0x32f0, 0x3311, - 0x3332, 0x3353, 0x3374, 0x3395, 0x33b6, 0x33d7, 0x33f8, 0x3419, - 0x343a, 0x345b, 0x347c, 0x349d, 0x34be, 0x34df, 0x3500, 0x3521, - 0x3542, 0x3563, 0x3584, 0x35a5, 0x35c6, 0x35e7, 0x3608, 0x3629, - 0x364a, 0x366b, 0x368c, 0x36ad, 0x36ce, 0x36ef, 0x3710, 0x3731, - // Entry 77C0 - 77FF - 0x3752, 0x3773, 0x3794, 0x37b5, 0x37d6, 0x37f7, 0x3818, 0x3839, - 0x385a, 0x387b, 0x389c, 0x38bd, 0x38de, 0x38ff, 0x3920, 0x3941, - 0x3962, 0x3983, 0x39a4, 0x39c5, 0x39e6, 0x3a07, 0x3a28, 0x3a49, - 0x3a6a, 0x3a8b, 0x3aac, 0x3acd, 0x3aee, 0x3b0f, 0x3b30, 0x3b51, - 0x3b72, 0x3b93, 0x3bb4, 0x3bd5, 0x3bf6, 0x3c17, 0x3c38, 0x3c59, - 0x3c7a, 0x3c9b, 0x3cbc, 0x3cdd, 0x3cfe, 0x3d1f, 0x3d40, 0x3d61, - 0x3d82, 0x3da3, 0x3dc4, 0x3de5, 0x3e06, 0x3e27, 0x3e48, 0x3e69, - 0x3e8a, 0x3eab, 0x3ecc, 0x3eed, 0x3f0e, 0x3f2f, 0x3f50, 0x3f71, - // Entry 7800 - 783F - 0x3f92, 0x3fb3, 0x3fd4, 0x3ff5, 0x4016, 0x4037, 0x4058, 0x4079, - 0x409a, 0x40bb, 0x40dc, 0x40fd, 0x411e, 0x413f, 0x4160, 0x4181, - 0x41a2, 0x41c3, 0x41e4, 0x4205, 0x4226, 0x4247, 0x4268, 0x4289, - 0x42aa, 0x42cb, 0x42ec, 0x430d, 0x432e, 0x434f, 0x4370, 0x4391, - 0x43b2, 0x43d3, 0x43f4, 0x4415, 0x4436, 0x4457, 0x4478, 0x4499, - 0x44ba, 0x44db, 0x44fc, 0x451d, 0x453e, 0x455f, 0x4580, 0x45a1, - 0x45c2, 0x45e3, 0x4604, 0x4625, 0x4646, 0x4667, 0x4688, 0x46a9, - 0x46ca, 0x46eb, 0x470c, 0x472d, 0x474e, 0x476f, 0x4790, 0x47b1, - // Entry 7840 - 787F - 0x47d2, 0x47f3, 0x4814, 0x4835, 0x4856, 0x4877, 0x0077, 0x0083, - 0x0083, 0x008c, 0x00a0, 0x00b2, 0x00c1, 0x00d0, 0x00e0, 0x00ed, - 0x00fb, 0x010f, 0x0124, 0x0130, 0x013d, 0x0146, 0x0156, 0x0163, - 0x016e, 0x017c, 0x0189, 0x0196, 0x01a5, 0x01b3, 0x01c1, 0x01ce, - 0x01dd, 0x01ec, 0x01fa, 0x0203, 0x0210, 0x0222, 0x0231, 0x0246, - 0x0257, 0x0268, 0x0282, 0x029c, 0x02b6, 0x02d0, 0x02ea, 0x0304, - 0x031e, 0x0338, 0x0352, 0x036c, 0x0386, 0x03a0, 0x03ba, 0x03d4, - 0x03ee, 0x0408, 0x0422, 0x043c, 0x0456, 0x0470, 0x048a, 0x04a4, - // Entry 7880 - 78BF - 0x04be, 0x04d8, 0x04f2, 0x050c, 0x0523, 0x0536, 0x054e, 0x0563, - 0x056f, 0x057f, 0x0597, 0x05af, 0x05c7, 0x05df, 0x05f7, 0x060f, - 0x0627, 0x063f, 0x0657, 0x066f, 0x0687, 0x069f, 0x06b7, 0x06cf, - 0x06e7, 0x06ff, 0x0717, 0x072f, 0x0747, 0x075f, 0x0777, 0x078f, - 0x07a7, 0x07bf, 0x07d7, 0x07ef, 0x0805, 0x0816, 0x082d, 0x0836, - 0x0840, 0x0040, 0x0055, 0x006a, 0x007f, 0x0094, 0x00a9, 0x00be, - 0x00d3, 0x00e8, 0x00fd, 0x0112, 0x0127, 0x013c, 0x0151, 0x0166, - 0x017b, 0x0190, 0x01a5, 0x01ba, 0x01cf, 0x01e4, 0x01f9, 0x020e, - // Entry 78C0 - 78FF - 0x0223, 0x0238, 0x024d, 0x0262, 0x0277, 0x028c, 0x02a1, 0x02b6, - 0x02cb, 0x02e0, 0x02f5, 0x030a, 0x031f, 0x0334, 0x0349, 0x035e, - 0x0373, 0x0388, 0x039d, 0x03b2, 0x03c7, 0x03dc, 0x03f1, 0x0406, - 0x041b, 0x0430, 0x0445, 0x045a, 0x046f, 0x0484, 0x0499, 0x04ae, - 0x04c3, 0x04d8, 0x04ed, 0x0502, 0x0517, 0x052c, 0x0541, 0x0556, - 0x056b, 0x0580, 0x0595, 0x05aa, 0x05bf, 0x05d4, 0x05e9, 0x05fe, - 0x0613, 0x0628, 0x063d, 0x0652, 0x0667, 0x067c, 0x0691, 0x06a6, - 0x06bb, 0x06d0, 0x06e5, 0x06fa, 0x070f, 0x0725, 0x073b, 0x0751, - // Entry 7900 - 793F - 0x0767, 0x077d, 0x0793, 0x07a9, 0x07bf, 0x07d5, 0x07eb, 0x0801, - 0x0817, 0x082d, 0x0843, 0x0859, 0x086f, 0x0885, 0x089b, 0x08b1, - 0x08c7, 0x08dd, 0x08f3, 0x0909, 0x091f, 0x0935, 0x094b, 0x0961, - 0x0977, 0x098d, 0x09a3, 0x09b9, 0x09cf, 0x09e5, 0x09fb, 0x0a11, - 0x0a27, 0x0a3d, 0x0a53, 0x0a69, 0x0a7f, 0x0a95, 0x0aab, 0x0ac1, - 0x0ad7, 0x0aed, 0x0b03, 0x0b19, 0x0b2f, 0x0b45, 0x0b5b, 0x0b71, - 0x0b87, 0x0b9d, 0x0bb3, 0x0bc9, 0x0bdf, 0x0bf5, 0x0c0b, 0x0c21, - 0x0c37, 0x0c4d, 0x0c63, 0x0c79, 0x0c8f, 0x0ca5, 0x0cbb, 0x0cd1, - // Entry 7940 - 797F - 0x0ce7, 0x0cfd, 0x0d13, 0x0d29, 0x0d3f, 0x0d55, 0x0d6b, 0x0d81, - 0x0d97, 0x0dad, 0x0dc3, 0x0dd9, 0x0def, 0x0e05, 0x0e1b, 0x0e31, - 0x0e47, 0x0e5d, 0x0e73, 0x0e89, 0x0e9f, 0x0eb5, 0x0ecb, 0x0ee1, - 0x0ef7, 0x0f0d, 0x0f23, 0x0f39, 0x0f4f, 0x0f65, 0x0f7b, 0x0f91, - 0x0fa7, 0x0fbd, 0x0fd3, 0x0fe9, 0x0fff, 0x1015, 0x102b, 0x1041, - 0x1057, 0x106d, 0x1083, 0x1099, 0x10af, 0x10c5, 0x10db, 0x10f1, - 0x1107, 0x111d, 0x1133, 0x1149, 0x115f, 0x1175, 0x118b, 0x11a1, - 0x11b7, 0x11cd, 0x11e3, 0x11f9, 0x120f, 0x1225, 0x123b, 0x1251, - // Entry 7980 - 79BF - 0x1267, 0x127d, 0x1293, 0x12a9, 0x12bf, 0x12d5, 0x12eb, 0x1301, - 0x1317, 0x132d, 0x1343, 0x1359, 0x136f, 0x1385, 0x139b, 0x13b1, - 0x13c7, 0x13dd, 0x13f3, 0x1409, 0x141f, 0x1435, 0x144b, 0x1461, - 0x1477, 0x148d, -} // Size: 62284 bytes - -const data string = ("" + // Size: 787597 bytes; the redundant, explicit parens are for https://golang.org/issue/18078 - "<control><CJK Ideograph Extension A><CJK Ideograph><Hangul Syllable><Non" + - " Private Use High Surrogate><Private Use High Surrogate><Low Surrogate><" + - "Private Use><Tangut Ideograph><CJK Ideograph Extension B><CJK Ideograph " + - "Extension C><CJK Ideograph Extension D><CJK Ideograph Extension E><Plane" + - " 15 Private Use><Plane 16 Private Use>SPACEEXCLAMATION MARKQUOTATION MAR" + - "KNUMBER SIGNDOLLAR SIGNPERCENT SIGNAMPERSANDAPOSTROPHELEFT PARENTHESISRI" + - "GHT PARENTHESISASTERISKPLUS SIGNCOMMAHYPHEN-MINUSFULL STOPSOLIDUSDIGIT Z" + - "ERODIGIT ONEDIGIT TWODIGIT THREEDIGIT FOURDIGIT FIVEDIGIT SIXDIGIT SEVEN" + - "DIGIT EIGHTDIGIT NINECOLONSEMICOLONLESS-THAN SIGNEQUALS SIGNGREATER-THAN" + - " SIGNQUESTION MARKCOMMERCIAL ATLATIN CAPITAL LETTER ALATIN CAPITAL LETTE" + - "R BLATIN CAPITAL LETTER CLATIN CAPITAL LETTER DLATIN CAPITAL LETTER ELAT" + - "IN CAPITAL LETTER FLATIN CAPITAL LETTER GLATIN CAPITAL LETTER HLATIN CAP" + - "ITAL LETTER ILATIN CAPITAL LETTER JLATIN CAPITAL LETTER KLATIN CAPITAL L" + - "ETTER LLATIN CAPITAL LETTER MLATIN CAPITAL LETTER NLATIN CAPITAL LETTER " + - "OLATIN CAPITAL LETTER PLATIN CAPITAL LETTER QLATIN CAPITAL LETTER RLATIN" + - " CAPITAL LETTER SLATIN CAPITAL LETTER TLATIN CAPITAL LETTER ULATIN CAPIT" + - "AL LETTER VLATIN CAPITAL LETTER WLATIN CAPITAL LETTER XLATIN CAPITAL LET" + - "TER YLATIN CAPITAL LETTER ZLEFT SQUARE BRACKETREVERSE SOLIDUSRIGHT SQUAR" + - "E BRACKETCIRCUMFLEX ACCENTLOW LINEGRAVE ACCENTLATIN SMALL LETTER ALATIN " + - "SMALL LETTER BLATIN SMALL LETTER CLATIN SMALL LETTER DLATIN SMALL LETTER" + - " ELATIN SMALL LETTER FLATIN SMALL LETTER GLATIN SMALL LETTER HLATIN SMAL" + - "L LETTER ILATIN SMALL LETTER JLATIN SMALL LETTER KLATIN SMALL LETTER LLA" + - "TIN SMALL LETTER MLATIN SMALL LETTER NLATIN SMALL LETTER OLATIN SMALL LE" + - "TTER PLATIN SMALL LETTER QLATIN SMALL LETTER RLATIN SMALL LETTER SLATIN " + - "SMALL LETTER TLATIN SMALL LETTER ULATIN SMALL LETTER VLATIN SMALL LETTER" + - " WLATIN SMALL LETTER XLATIN SMALL LETTER YLATIN SMALL LETTER ZLEFT CURLY" + - " BRACKETVERTICAL LINERIGHT CURLY BRACKETTILDENO-BREAK SPACEINVERTED EXCL" + - "AMATION MARKCENT SIGNPOUND SIGNCURRENCY SIGNYEN SIGNBROKEN BARSECTION SI" + - "GNDIAERESISCOPYRIGHT SIGNFEMININE ORDINAL INDICATORLEFT-POINTING DOUBLE " + - "ANGLE QUOTATION MARKNOT SIGNSOFT HYPHENREGISTERED SIGNMACRONDEGREE SIGNP" + - "LUS-MINUS SIGNSUPERSCRIPT TWOSUPERSCRIPT THREEACUTE ACCENTMICRO SIGNPILC" + - "ROW SIGNMIDDLE DOTCEDILLASUPERSCRIPT ONEMASCULINE ORDINAL INDICATORRIGHT" + - "-POINTING DOUBLE ANGLE QUOTATION MARKVULGAR FRACTION ONE QUARTERVULGAR F" + - "RACTION ONE HALFVULGAR FRACTION THREE QUARTERSINVERTED QUESTION MARKLATI" + - "N CAPITAL LETTER A WITH GRAVELATIN CAPITAL LETTER A WITH ACUTELATIN CAPI" + - "TAL LETTER A WITH CIRCUMFLEXLATIN CAPITAL LETTER A WITH TILDELATIN CAPIT" + - "AL LETTER A WITH DIAERESISLATIN CAPITAL LETTER A WITH RING ABOVELATIN CA" + - "PITAL LETTER AELATIN CAPITAL LETTER C WITH CEDILLALATIN CAPITAL LETTER E" + - " WITH GRAVELATIN CAPITAL LETTER E WITH ACUTELATIN CAPITAL LETTER E WITH " + - "CIRCUMFLEXLATIN CAPITAL LETTER E WITH DIAERESISLATIN CAPITAL LETTER I WI" + - "TH GRAVELATIN CAPITAL LETTER I WITH ACUTELATIN CAPITAL LETTER I WITH CIR" + - "CUMFLEXLATIN CAPITAL LETTER I WITH DIAERESISLATIN CAPITAL LETTER ETHLATI" + - "N CAPITAL LETTER N WITH TILDELATIN CAPITAL LETTER O WITH GRAVELATIN CAPI" + - "TAL LETTER O WITH ACUTELATIN CAPITAL LETTER O WITH CIRCUMFLEXLATIN CAPIT" + - "AL LETTER O WITH TILDELATIN CAPITAL LETTER O WITH DIAERESISMULTIPLICATIO" + - "N SIGNLATIN CAPITAL LETTER O WITH STROKELATIN CAPITAL LETTER U WITH GRAV" + - "ELATIN CAPITAL LETTER U WITH ACUTELATIN CAPITAL LETTER U WITH CIRCUMFLEX" + - "LATIN CAPITAL LETTER U WITH DIAERESISLATIN CAPITAL LETTER Y WITH ACUTELA" + - "TIN CAPITAL LETTER THORNLATIN SMALL LETTER SHARP SLATIN SMALL LETTER A W" + - "ITH GRAVELATIN SMALL LETTER A WITH ACUTELATIN SMALL LETTER A WITH CIRCUM" + - "FLEXLATIN SMALL LETTER A WITH TILDELATIN SMALL LETTER A WITH DIAERESISLA" + - "TIN SMALL LETTER A WITH RING ABOVELATIN SMALL LETTER AELATIN SMALL LETTE" + - "R C WITH CEDILLALATIN SMALL LETTER E WITH GRAVELATIN SMALL LETTER E WITH" + - " ACUTELATIN SMALL LETTER E WITH CIRCUMFLEXLATIN SMALL LETTER E WITH DIAE" + - "RESISLATIN SMALL LETTER I WITH GRAVELATIN SMALL LETTER I WITH ACUTELATIN" + - " SMALL LETTER I WITH CIRCUMFLEXLATIN SMALL LETTER I WITH DIAERESISLATIN " + - "SMALL LETTER ETHLATIN SMALL LETTER N WITH TILDELATIN SMALL LETTER O WITH" + - " GRAVELATIN SMALL LETTER O WITH ACUTELATIN SMALL LETTER O WITH CIRCUMFLE" + - "XLATIN SMALL LETTER O WITH TILDELATIN SMALL LETTER O WITH DIAERESISDIVIS" + - "ION SIGNLATIN SMALL LETTER O WITH STROKELATIN SMALL LETTER U WITH GRAVEL" + - "ATIN SMALL LETTER U WITH ACUTELATIN SMALL LETTER U WITH CIRCUMFLEXLATIN " + - "SMALL LETTER U WITH DIAERESISLATIN SMALL LETTER Y WITH ACUTELATIN SMALL " + - "LETTER THORNLATIN SMALL LETTER Y WITH DIAERESISLATIN CAPITAL LETTER A WI") + ("" + - "TH MACRONLATIN SMALL LETTER A WITH MACRONLATIN CAPITAL LETTER A WITH BRE" + - "VELATIN SMALL LETTER A WITH BREVELATIN CAPITAL LETTER A WITH OGONEKLATIN" + - " SMALL LETTER A WITH OGONEKLATIN CAPITAL LETTER C WITH ACUTELATIN SMALL " + - "LETTER C WITH ACUTELATIN CAPITAL LETTER C WITH CIRCUMFLEXLATIN SMALL LET" + - "TER C WITH CIRCUMFLEXLATIN CAPITAL LETTER C WITH DOT ABOVELATIN SMALL LE" + - "TTER C WITH DOT ABOVELATIN CAPITAL LETTER C WITH CARONLATIN SMALL LETTER" + - " C WITH CARONLATIN CAPITAL LETTER D WITH CARONLATIN SMALL LETTER D WITH " + - "CARONLATIN CAPITAL LETTER D WITH STROKELATIN SMALL LETTER D WITH STROKEL" + - "ATIN CAPITAL LETTER E WITH MACRONLATIN SMALL LETTER E WITH MACRONLATIN C" + - "APITAL LETTER E WITH BREVELATIN SMALL LETTER E WITH BREVELATIN CAPITAL L" + - "ETTER E WITH DOT ABOVELATIN SMALL LETTER E WITH DOT ABOVELATIN CAPITAL L" + - "ETTER E WITH OGONEKLATIN SMALL LETTER E WITH OGONEKLATIN CAPITAL LETTER " + - "E WITH CARONLATIN SMALL LETTER E WITH CARONLATIN CAPITAL LETTER G WITH C" + - "IRCUMFLEXLATIN SMALL LETTER G WITH CIRCUMFLEXLATIN CAPITAL LETTER G WITH" + - " BREVELATIN SMALL LETTER G WITH BREVELATIN CAPITAL LETTER G WITH DOT ABO" + - "VELATIN SMALL LETTER G WITH DOT ABOVELATIN CAPITAL LETTER G WITH CEDILLA" + - "LATIN SMALL LETTER G WITH CEDILLALATIN CAPITAL LETTER H WITH CIRCUMFLEXL" + - "ATIN SMALL LETTER H WITH CIRCUMFLEXLATIN CAPITAL LETTER H WITH STROKELAT" + - "IN SMALL LETTER H WITH STROKELATIN CAPITAL LETTER I WITH TILDELATIN SMAL" + - "L LETTER I WITH TILDELATIN CAPITAL LETTER I WITH MACRONLATIN SMALL LETTE" + - "R I WITH MACRONLATIN CAPITAL LETTER I WITH BREVELATIN SMALL LETTER I WIT" + - "H BREVELATIN CAPITAL LETTER I WITH OGONEKLATIN SMALL LETTER I WITH OGONE" + - "KLATIN CAPITAL LETTER I WITH DOT ABOVELATIN SMALL LETTER DOTLESS ILATIN " + - "CAPITAL LIGATURE IJLATIN SMALL LIGATURE IJLATIN CAPITAL LETTER J WITH CI" + - "RCUMFLEXLATIN SMALL LETTER J WITH CIRCUMFLEXLATIN CAPITAL LETTER K WITH " + - "CEDILLALATIN SMALL LETTER K WITH CEDILLALATIN SMALL LETTER KRALATIN CAPI" + - "TAL LETTER L WITH ACUTELATIN SMALL LETTER L WITH ACUTELATIN CAPITAL LETT" + - "ER L WITH CEDILLALATIN SMALL LETTER L WITH CEDILLALATIN CAPITAL LETTER L" + - " WITH CARONLATIN SMALL LETTER L WITH CARONLATIN CAPITAL LETTER L WITH MI" + - "DDLE DOTLATIN SMALL LETTER L WITH MIDDLE DOTLATIN CAPITAL LETTER L WITH " + - "STROKELATIN SMALL LETTER L WITH STROKELATIN CAPITAL LETTER N WITH ACUTEL" + - "ATIN SMALL LETTER N WITH ACUTELATIN CAPITAL LETTER N WITH CEDILLALATIN S" + - "MALL LETTER N WITH CEDILLALATIN CAPITAL LETTER N WITH CARONLATIN SMALL L" + - "ETTER N WITH CARONLATIN SMALL LETTER N PRECEDED BY APOSTROPHELATIN CAPIT" + - "AL LETTER ENGLATIN SMALL LETTER ENGLATIN CAPITAL LETTER O WITH MACRONLAT" + - "IN SMALL LETTER O WITH MACRONLATIN CAPITAL LETTER O WITH BREVELATIN SMAL" + - "L LETTER O WITH BREVELATIN CAPITAL LETTER O WITH DOUBLE ACUTELATIN SMALL" + - " LETTER O WITH DOUBLE ACUTELATIN CAPITAL LIGATURE OELATIN SMALL LIGATURE" + - " OELATIN CAPITAL LETTER R WITH ACUTELATIN SMALL LETTER R WITH ACUTELATIN" + - " CAPITAL LETTER R WITH CEDILLALATIN SMALL LETTER R WITH CEDILLALATIN CAP" + - "ITAL LETTER R WITH CARONLATIN SMALL LETTER R WITH CARONLATIN CAPITAL LET" + - "TER S WITH ACUTELATIN SMALL LETTER S WITH ACUTELATIN CAPITAL LETTER S WI" + - "TH CIRCUMFLEXLATIN SMALL LETTER S WITH CIRCUMFLEXLATIN CAPITAL LETTER S " + - "WITH CEDILLALATIN SMALL LETTER S WITH CEDILLALATIN CAPITAL LETTER S WITH" + - " CARONLATIN SMALL LETTER S WITH CARONLATIN CAPITAL LETTER T WITH CEDILLA" + - "LATIN SMALL LETTER T WITH CEDILLALATIN CAPITAL LETTER T WITH CARONLATIN " + - "SMALL LETTER T WITH CARONLATIN CAPITAL LETTER T WITH STROKELATIN SMALL L" + - "ETTER T WITH STROKELATIN CAPITAL LETTER U WITH TILDELATIN SMALL LETTER U" + - " WITH TILDELATIN CAPITAL LETTER U WITH MACRONLATIN SMALL LETTER U WITH M" + - "ACRONLATIN CAPITAL LETTER U WITH BREVELATIN SMALL LETTER U WITH BREVELAT" + - "IN CAPITAL LETTER U WITH RING ABOVELATIN SMALL LETTER U WITH RING ABOVEL" + - "ATIN CAPITAL LETTER U WITH DOUBLE ACUTELATIN SMALL LETTER U WITH DOUBLE " + - "ACUTELATIN CAPITAL LETTER U WITH OGONEKLATIN SMALL LETTER U WITH OGONEKL" + - "ATIN CAPITAL LETTER W WITH CIRCUMFLEXLATIN SMALL LETTER W WITH CIRCUMFLE" + - "XLATIN CAPITAL LETTER Y WITH CIRCUMFLEXLATIN SMALL LETTER Y WITH CIRCUMF" + - "LEXLATIN CAPITAL LETTER Y WITH DIAERESISLATIN CAPITAL LETTER Z WITH ACUT" + - "ELATIN SMALL LETTER Z WITH ACUTELATIN CAPITAL LETTER Z WITH DOT ABOVELAT" + - "IN SMALL LETTER Z WITH DOT ABOVELATIN CAPITAL LETTER Z WITH CARONLATIN S" + - "MALL LETTER Z WITH CARONLATIN SMALL LETTER LONG SLATIN SMALL LETTER B WI" + - "TH STROKELATIN CAPITAL LETTER B WITH HOOKLATIN CAPITAL LETTER B WITH TOP" + - "BARLATIN SMALL LETTER B WITH TOPBARLATIN CAPITAL LETTER TONE SIXLATIN SM" + - "ALL LETTER TONE SIXLATIN CAPITAL LETTER OPEN OLATIN CAPITAL LETTER C WIT" + - "H HOOKLATIN SMALL LETTER C WITH HOOKLATIN CAPITAL LETTER AFRICAN DLATIN " + - "CAPITAL LETTER D WITH HOOKLATIN CAPITAL LETTER D WITH TOPBARLATIN SMALL ") + ("" + - "LETTER D WITH TOPBARLATIN SMALL LETTER TURNED DELTALATIN CAPITAL LETTER " + - "REVERSED ELATIN CAPITAL LETTER SCHWALATIN CAPITAL LETTER OPEN ELATIN CAP" + - "ITAL LETTER F WITH HOOKLATIN SMALL LETTER F WITH HOOKLATIN CAPITAL LETTE" + - "R G WITH HOOKLATIN CAPITAL LETTER GAMMALATIN SMALL LETTER HVLATIN CAPITA" + - "L LETTER IOTALATIN CAPITAL LETTER I WITH STROKELATIN CAPITAL LETTER K WI" + - "TH HOOKLATIN SMALL LETTER K WITH HOOKLATIN SMALL LETTER L WITH BARLATIN " + - "SMALL LETTER LAMBDA WITH STROKELATIN CAPITAL LETTER TURNED MLATIN CAPITA" + - "L LETTER N WITH LEFT HOOKLATIN SMALL LETTER N WITH LONG RIGHT LEGLATIN C" + - "APITAL LETTER O WITH MIDDLE TILDELATIN CAPITAL LETTER O WITH HORNLATIN S" + - "MALL LETTER O WITH HORNLATIN CAPITAL LETTER OILATIN SMALL LETTER OILATIN" + - " CAPITAL LETTER P WITH HOOKLATIN SMALL LETTER P WITH HOOKLATIN LETTER YR" + - "LATIN CAPITAL LETTER TONE TWOLATIN SMALL LETTER TONE TWOLATIN CAPITAL LE" + - "TTER ESHLATIN LETTER REVERSED ESH LOOPLATIN SMALL LETTER T WITH PALATAL " + - "HOOKLATIN CAPITAL LETTER T WITH HOOKLATIN SMALL LETTER T WITH HOOKLATIN " + - "CAPITAL LETTER T WITH RETROFLEX HOOKLATIN CAPITAL LETTER U WITH HORNLATI" + - "N SMALL LETTER U WITH HORNLATIN CAPITAL LETTER UPSILONLATIN CAPITAL LETT" + - "ER V WITH HOOKLATIN CAPITAL LETTER Y WITH HOOKLATIN SMALL LETTER Y WITH " + - "HOOKLATIN CAPITAL LETTER Z WITH STROKELATIN SMALL LETTER Z WITH STROKELA" + - "TIN CAPITAL LETTER EZHLATIN CAPITAL LETTER EZH REVERSEDLATIN SMALL LETTE" + - "R EZH REVERSEDLATIN SMALL LETTER EZH WITH TAILLATIN LETTER TWO WITH STRO" + - "KELATIN CAPITAL LETTER TONE FIVELATIN SMALL LETTER TONE FIVELATIN LETTER" + - " INVERTED GLOTTAL STOP WITH STROKELATIN LETTER WYNNLATIN LETTER DENTAL C" + - "LICKLATIN LETTER LATERAL CLICKLATIN LETTER ALVEOLAR CLICKLATIN LETTER RE" + - "TROFLEX CLICKLATIN CAPITAL LETTER DZ WITH CARONLATIN CAPITAL LETTER D WI" + - "TH SMALL LETTER Z WITH CARONLATIN SMALL LETTER DZ WITH CARONLATIN CAPITA" + - "L LETTER LJLATIN CAPITAL LETTER L WITH SMALL LETTER JLATIN SMALL LETTER " + - "LJLATIN CAPITAL LETTER NJLATIN CAPITAL LETTER N WITH SMALL LETTER JLATIN" + - " SMALL LETTER NJLATIN CAPITAL LETTER A WITH CARONLATIN SMALL LETTER A WI" + - "TH CARONLATIN CAPITAL LETTER I WITH CARONLATIN SMALL LETTER I WITH CARON" + - "LATIN CAPITAL LETTER O WITH CARONLATIN SMALL LETTER O WITH CARONLATIN CA" + - "PITAL LETTER U WITH CARONLATIN SMALL LETTER U WITH CARONLATIN CAPITAL LE" + - "TTER U WITH DIAERESIS AND MACRONLATIN SMALL LETTER U WITH DIAERESIS AND " + - "MACRONLATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTELATIN SMALL LETTER " + - "U WITH DIAERESIS AND ACUTELATIN CAPITAL LETTER U WITH DIAERESIS AND CARO" + - "NLATIN SMALL LETTER U WITH DIAERESIS AND CARONLATIN CAPITAL LETTER U WIT" + - "H DIAERESIS AND GRAVELATIN SMALL LETTER U WITH DIAERESIS AND GRAVELATIN " + - "SMALL LETTER TURNED ELATIN CAPITAL LETTER A WITH DIAERESIS AND MACRONLAT" + - "IN SMALL LETTER A WITH DIAERESIS AND MACRONLATIN CAPITAL LETTER A WITH D" + - "OT ABOVE AND MACRONLATIN SMALL LETTER A WITH DOT ABOVE AND MACRONLATIN C" + - "APITAL LETTER AE WITH MACRONLATIN SMALL LETTER AE WITH MACRONLATIN CAPIT" + - "AL LETTER G WITH STROKELATIN SMALL LETTER G WITH STROKELATIN CAPITAL LET" + - "TER G WITH CARONLATIN SMALL LETTER G WITH CARONLATIN CAPITAL LETTER K WI" + - "TH CARONLATIN SMALL LETTER K WITH CARONLATIN CAPITAL LETTER O WITH OGONE" + - "KLATIN SMALL LETTER O WITH OGONEKLATIN CAPITAL LETTER O WITH OGONEK AND " + - "MACRONLATIN SMALL LETTER O WITH OGONEK AND MACRONLATIN CAPITAL LETTER EZ" + - "H WITH CARONLATIN SMALL LETTER EZH WITH CARONLATIN SMALL LETTER J WITH C" + - "ARONLATIN CAPITAL LETTER DZLATIN CAPITAL LETTER D WITH SMALL LETTER ZLAT" + - "IN SMALL LETTER DZLATIN CAPITAL LETTER G WITH ACUTELATIN SMALL LETTER G " + - "WITH ACUTELATIN CAPITAL LETTER HWAIRLATIN CAPITAL LETTER WYNNLATIN CAPIT" + - "AL LETTER N WITH GRAVELATIN SMALL LETTER N WITH GRAVELATIN CAPITAL LETTE" + - "R A WITH RING ABOVE AND ACUTELATIN SMALL LETTER A WITH RING ABOVE AND AC" + - "UTELATIN CAPITAL LETTER AE WITH ACUTELATIN SMALL LETTER AE WITH ACUTELAT" + - "IN CAPITAL LETTER O WITH STROKE AND ACUTELATIN SMALL LETTER O WITH STROK" + - "E AND ACUTELATIN CAPITAL LETTER A WITH DOUBLE GRAVELATIN SMALL LETTER A " + - "WITH DOUBLE GRAVELATIN CAPITAL LETTER A WITH INVERTED BREVELATIN SMALL L" + - "ETTER A WITH INVERTED BREVELATIN CAPITAL LETTER E WITH DOUBLE GRAVELATIN" + - " SMALL LETTER E WITH DOUBLE GRAVELATIN CAPITAL LETTER E WITH INVERTED BR" + - "EVELATIN SMALL LETTER E WITH INVERTED BREVELATIN CAPITAL LETTER I WITH D" + - "OUBLE GRAVELATIN SMALL LETTER I WITH DOUBLE GRAVELATIN CAPITAL LETTER I " + - "WITH INVERTED BREVELATIN SMALL LETTER I WITH INVERTED BREVELATIN CAPITAL" + - " LETTER O WITH DOUBLE GRAVELATIN SMALL LETTER O WITH DOUBLE GRAVELATIN C" + - "APITAL LETTER O WITH INVERTED BREVELATIN SMALL LETTER O WITH INVERTED BR" + - "EVELATIN CAPITAL LETTER R WITH DOUBLE GRAVELATIN SMALL LETTER R WITH DOU" + - "BLE GRAVELATIN CAPITAL LETTER R WITH INVERTED BREVELATIN SMALL LETTER R ") + ("" + - "WITH INVERTED BREVELATIN CAPITAL LETTER U WITH DOUBLE GRAVELATIN SMALL L" + - "ETTER U WITH DOUBLE GRAVELATIN CAPITAL LETTER U WITH INVERTED BREVELATIN" + - " SMALL LETTER U WITH INVERTED BREVELATIN CAPITAL LETTER S WITH COMMA BEL" + - "OWLATIN SMALL LETTER S WITH COMMA BELOWLATIN CAPITAL LETTER T WITH COMMA" + - " BELOWLATIN SMALL LETTER T WITH COMMA BELOWLATIN CAPITAL LETTER YOGHLATI" + - "N SMALL LETTER YOGHLATIN CAPITAL LETTER H WITH CARONLATIN SMALL LETTER H" + - " WITH CARONLATIN CAPITAL LETTER N WITH LONG RIGHT LEGLATIN SMALL LETTER " + - "D WITH CURLLATIN CAPITAL LETTER OULATIN SMALL LETTER OULATIN CAPITAL LET" + - "TER Z WITH HOOKLATIN SMALL LETTER Z WITH HOOKLATIN CAPITAL LETTER A WITH" + - " DOT ABOVELATIN SMALL LETTER A WITH DOT ABOVELATIN CAPITAL LETTER E WITH" + - " CEDILLALATIN SMALL LETTER E WITH CEDILLALATIN CAPITAL LETTER O WITH DIA" + - "ERESIS AND MACRONLATIN SMALL LETTER O WITH DIAERESIS AND MACRONLATIN CAP" + - "ITAL LETTER O WITH TILDE AND MACRONLATIN SMALL LETTER O WITH TILDE AND M" + - "ACRONLATIN CAPITAL LETTER O WITH DOT ABOVELATIN SMALL LETTER O WITH DOT " + - "ABOVELATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRONLATIN SMALL LETTER " + - "O WITH DOT ABOVE AND MACRONLATIN CAPITAL LETTER Y WITH MACRONLATIN SMALL" + - " LETTER Y WITH MACRONLATIN SMALL LETTER L WITH CURLLATIN SMALL LETTER N " + - "WITH CURLLATIN SMALL LETTER T WITH CURLLATIN SMALL LETTER DOTLESS JLATIN" + - " SMALL LETTER DB DIGRAPHLATIN SMALL LETTER QP DIGRAPHLATIN CAPITAL LETTE" + - "R A WITH STROKELATIN CAPITAL LETTER C WITH STROKELATIN SMALL LETTER C WI" + - "TH STROKELATIN CAPITAL LETTER L WITH BARLATIN CAPITAL LETTER T WITH DIAG" + - "ONAL STROKELATIN SMALL LETTER S WITH SWASH TAILLATIN SMALL LETTER Z WITH" + - " SWASH TAILLATIN CAPITAL LETTER GLOTTAL STOPLATIN SMALL LETTER GLOTTAL S" + - "TOPLATIN CAPITAL LETTER B WITH STROKELATIN CAPITAL LETTER U BARLATIN CAP" + - "ITAL LETTER TURNED VLATIN CAPITAL LETTER E WITH STROKELATIN SMALL LETTER" + - " E WITH STROKELATIN CAPITAL LETTER J WITH STROKELATIN SMALL LETTER J WIT" + - "H STROKELATIN CAPITAL LETTER SMALL Q WITH HOOK TAILLATIN SMALL LETTER Q " + - "WITH HOOK TAILLATIN CAPITAL LETTER R WITH STROKELATIN SMALL LETTER R WIT" + - "H STROKELATIN CAPITAL LETTER Y WITH STROKELATIN SMALL LETTER Y WITH STRO" + - "KELATIN SMALL LETTER TURNED ALATIN SMALL LETTER ALPHALATIN SMALL LETTER " + - "TURNED ALPHALATIN SMALL LETTER B WITH HOOKLATIN SMALL LETTER OPEN OLATIN" + - " SMALL LETTER C WITH CURLLATIN SMALL LETTER D WITH TAILLATIN SMALL LETTE" + - "R D WITH HOOKLATIN SMALL LETTER REVERSED ELATIN SMALL LETTER SCHWALATIN " + - "SMALL LETTER SCHWA WITH HOOKLATIN SMALL LETTER OPEN ELATIN SMALL LETTER " + - "REVERSED OPEN ELATIN SMALL LETTER REVERSED OPEN E WITH HOOKLATIN SMALL L" + - "ETTER CLOSED REVERSED OPEN ELATIN SMALL LETTER DOTLESS J WITH STROKELATI" + - "N SMALL LETTER G WITH HOOKLATIN SMALL LETTER SCRIPT GLATIN LETTER SMALL " + - "CAPITAL GLATIN SMALL LETTER GAMMALATIN SMALL LETTER RAMS HORNLATIN SMALL" + - " LETTER TURNED HLATIN SMALL LETTER H WITH HOOKLATIN SMALL LETTER HENG WI" + - "TH HOOKLATIN SMALL LETTER I WITH STROKELATIN SMALL LETTER IOTALATIN LETT" + - "ER SMALL CAPITAL ILATIN SMALL LETTER L WITH MIDDLE TILDELATIN SMALL LETT" + - "ER L WITH BELTLATIN SMALL LETTER L WITH RETROFLEX HOOKLATIN SMALL LETTER" + - " LEZHLATIN SMALL LETTER TURNED MLATIN SMALL LETTER TURNED M WITH LONG LE" + - "GLATIN SMALL LETTER M WITH HOOKLATIN SMALL LETTER N WITH LEFT HOOKLATIN " + - "SMALL LETTER N WITH RETROFLEX HOOKLATIN LETTER SMALL CAPITAL NLATIN SMAL" + - "L LETTER BARRED OLATIN LETTER SMALL CAPITAL OELATIN SMALL LETTER CLOSED " + - "OMEGALATIN SMALL LETTER PHILATIN SMALL LETTER TURNED RLATIN SMALL LETTER" + - " TURNED R WITH LONG LEGLATIN SMALL LETTER TURNED R WITH HOOKLATIN SMALL " + - "LETTER R WITH LONG LEGLATIN SMALL LETTER R WITH TAILLATIN SMALL LETTER R" + - " WITH FISHHOOKLATIN SMALL LETTER REVERSED R WITH FISHHOOKLATIN LETTER SM" + - "ALL CAPITAL RLATIN LETTER SMALL CAPITAL INVERTED RLATIN SMALL LETTER S W" + - "ITH HOOKLATIN SMALL LETTER ESHLATIN SMALL LETTER DOTLESS J WITH STROKE A" + - "ND HOOKLATIN SMALL LETTER SQUAT REVERSED ESHLATIN SMALL LETTER ESH WITH " + - "CURLLATIN SMALL LETTER TURNED TLATIN SMALL LETTER T WITH RETROFLEX HOOKL" + - "ATIN SMALL LETTER U BARLATIN SMALL LETTER UPSILONLATIN SMALL LETTER V WI" + - "TH HOOKLATIN SMALL LETTER TURNED VLATIN SMALL LETTER TURNED WLATIN SMALL" + - " LETTER TURNED YLATIN LETTER SMALL CAPITAL YLATIN SMALL LETTER Z WITH RE" + - "TROFLEX HOOKLATIN SMALL LETTER Z WITH CURLLATIN SMALL LETTER EZHLATIN SM" + - "ALL LETTER EZH WITH CURLLATIN LETTER GLOTTAL STOPLATIN LETTER PHARYNGEAL" + - " VOICED FRICATIVELATIN LETTER INVERTED GLOTTAL STOPLATIN LETTER STRETCHE" + - "D CLATIN LETTER BILABIAL CLICKLATIN LETTER SMALL CAPITAL BLATIN SMALL LE" + - "TTER CLOSED OPEN ELATIN LETTER SMALL CAPITAL G WITH HOOKLATIN LETTER SMA" + - "LL CAPITAL HLATIN SMALL LETTER J WITH CROSSED-TAILLATIN SMALL LETTER TUR" + - "NED KLATIN LETTER SMALL CAPITAL LLATIN SMALL LETTER Q WITH HOOKLATIN LET") + ("" + - "TER GLOTTAL STOP WITH STROKELATIN LETTER REVERSED GLOTTAL STOP WITH STRO" + - "KELATIN SMALL LETTER DZ DIGRAPHLATIN SMALL LETTER DEZH DIGRAPHLATIN SMAL" + - "L LETTER DZ DIGRAPH WITH CURLLATIN SMALL LETTER TS DIGRAPHLATIN SMALL LE" + - "TTER TESH DIGRAPHLATIN SMALL LETTER TC DIGRAPH WITH CURLLATIN SMALL LETT" + - "ER FENG DIGRAPHLATIN SMALL LETTER LS DIGRAPHLATIN SMALL LETTER LZ DIGRAP" + - "HLATIN LETTER BILABIAL PERCUSSIVELATIN LETTER BIDENTAL PERCUSSIVELATIN S" + - "MALL LETTER TURNED H WITH FISHHOOKLATIN SMALL LETTER TURNED H WITH FISHH" + - "OOK AND TAILMODIFIER LETTER SMALL HMODIFIER LETTER SMALL H WITH HOOKMODI" + - "FIER LETTER SMALL JMODIFIER LETTER SMALL RMODIFIER LETTER SMALL TURNED R" + - "MODIFIER LETTER SMALL TURNED R WITH HOOKMODIFIER LETTER SMALL CAPITAL IN" + - "VERTED RMODIFIER LETTER SMALL WMODIFIER LETTER SMALL YMODIFIER LETTER PR" + - "IMEMODIFIER LETTER DOUBLE PRIMEMODIFIER LETTER TURNED COMMAMODIFIER LETT" + - "ER APOSTROPHEMODIFIER LETTER REVERSED COMMAMODIFIER LETTER RIGHT HALF RI" + - "NGMODIFIER LETTER LEFT HALF RINGMODIFIER LETTER GLOTTAL STOPMODIFIER LET" + - "TER REVERSED GLOTTAL STOPMODIFIER LETTER LEFT ARROWHEADMODIFIER LETTER R" + - "IGHT ARROWHEADMODIFIER LETTER UP ARROWHEADMODIFIER LETTER DOWN ARROWHEAD" + - "MODIFIER LETTER CIRCUMFLEX ACCENTCARONMODIFIER LETTER VERTICAL LINEMODIF" + - "IER LETTER MACRONMODIFIER LETTER ACUTE ACCENTMODIFIER LETTER GRAVE ACCEN" + - "TMODIFIER LETTER LOW VERTICAL LINEMODIFIER LETTER LOW MACRONMODIFIER LET" + - "TER LOW GRAVE ACCENTMODIFIER LETTER LOW ACUTE ACCENTMODIFIER LETTER TRIA" + - "NGULAR COLONMODIFIER LETTER HALF TRIANGULAR COLONMODIFIER LETTER CENTRED" + - " RIGHT HALF RINGMODIFIER LETTER CENTRED LEFT HALF RINGMODIFIER LETTER UP" + - " TACKMODIFIER LETTER DOWN TACKMODIFIER LETTER PLUS SIGNMODIFIER LETTER M" + - "INUS SIGNBREVEDOT ABOVERING ABOVEOGONEKSMALL TILDEDOUBLE ACUTE ACCENTMOD" + - "IFIER LETTER RHOTIC HOOKMODIFIER LETTER CROSS ACCENTMODIFIER LETTER SMAL" + - "L GAMMAMODIFIER LETTER SMALL LMODIFIER LETTER SMALL SMODIFIER LETTER SMA" + - "LL XMODIFIER LETTER SMALL REVERSED GLOTTAL STOPMODIFIER LETTER EXTRA-HIG" + - "H TONE BARMODIFIER LETTER HIGH TONE BARMODIFIER LETTER MID TONE BARMODIF" + - "IER LETTER LOW TONE BARMODIFIER LETTER EXTRA-LOW TONE BARMODIFIER LETTER" + - " YIN DEPARTING TONE MARKMODIFIER LETTER YANG DEPARTING TONE MARKMODIFIER" + - " LETTER VOICINGMODIFIER LETTER UNASPIRATEDMODIFIER LETTER DOUBLE APOSTRO" + - "PHEMODIFIER LETTER LOW DOWN ARROWHEADMODIFIER LETTER LOW UP ARROWHEADMOD" + - "IFIER LETTER LOW LEFT ARROWHEADMODIFIER LETTER LOW RIGHT ARROWHEADMODIFI" + - "ER LETTER LOW RINGMODIFIER LETTER MIDDLE GRAVE ACCENTMODIFIER LETTER MID" + - "DLE DOUBLE GRAVE ACCENTMODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENTMODIFIE" + - "R LETTER LOW TILDEMODIFIER LETTER RAISED COLONMODIFIER LETTER BEGIN HIGH" + - " TONEMODIFIER LETTER END HIGH TONEMODIFIER LETTER BEGIN LOW TONEMODIFIER" + - " LETTER END LOW TONEMODIFIER LETTER SHELFMODIFIER LETTER OPEN SHELFMODIF" + - "IER LETTER LOW LEFT ARROWCOMBINING GRAVE ACCENTCOMBINING ACUTE ACCENTCOM" + - "BINING CIRCUMFLEX ACCENTCOMBINING TILDECOMBINING MACRONCOMBINING OVERLIN" + - "ECOMBINING BREVECOMBINING DOT ABOVECOMBINING DIAERESISCOMBINING HOOK ABO" + - "VECOMBINING RING ABOVECOMBINING DOUBLE ACUTE ACCENTCOMBINING CARONCOMBIN" + - "ING VERTICAL LINE ABOVECOMBINING DOUBLE VERTICAL LINE ABOVECOMBINING DOU" + - "BLE GRAVE ACCENTCOMBINING CANDRABINDUCOMBINING INVERTED BREVECOMBINING T" + - "URNED COMMA ABOVECOMBINING COMMA ABOVECOMBINING REVERSED COMMA ABOVECOMB" + - "INING COMMA ABOVE RIGHTCOMBINING GRAVE ACCENT BELOWCOMBINING ACUTE ACCEN" + - "T BELOWCOMBINING LEFT TACK BELOWCOMBINING RIGHT TACK BELOWCOMBINING LEFT" + - " ANGLE ABOVECOMBINING HORNCOMBINING LEFT HALF RING BELOWCOMBINING UP TAC" + - "K BELOWCOMBINING DOWN TACK BELOWCOMBINING PLUS SIGN BELOWCOMBINING MINUS" + - " SIGN BELOWCOMBINING PALATALIZED HOOK BELOWCOMBINING RETROFLEX HOOK BELO" + - "WCOMBINING DOT BELOWCOMBINING DIAERESIS BELOWCOMBINING RING BELOWCOMBINI" + - "NG COMMA BELOWCOMBINING CEDILLACOMBINING OGONEKCOMBINING VERTICAL LINE B" + - "ELOWCOMBINING BRIDGE BELOWCOMBINING INVERTED DOUBLE ARCH BELOWCOMBINING " + - "CARON BELOWCOMBINING CIRCUMFLEX ACCENT BELOWCOMBINING BREVE BELOWCOMBINI" + - "NG INVERTED BREVE BELOWCOMBINING TILDE BELOWCOMBINING MACRON BELOWCOMBIN" + - "ING LOW LINECOMBINING DOUBLE LOW LINECOMBINING TILDE OVERLAYCOMBINING SH" + - "ORT STROKE OVERLAYCOMBINING LONG STROKE OVERLAYCOMBINING SHORT SOLIDUS O" + - "VERLAYCOMBINING LONG SOLIDUS OVERLAYCOMBINING RIGHT HALF RING BELOWCOMBI" + - "NING INVERTED BRIDGE BELOWCOMBINING SQUARE BELOWCOMBINING SEAGULL BELOWC" + - "OMBINING X ABOVECOMBINING VERTICAL TILDECOMBINING DOUBLE OVERLINECOMBINI" + - "NG GRAVE TONE MARKCOMBINING ACUTE TONE MARKCOMBINING GREEK PERISPOMENICO" + - "MBINING GREEK KORONISCOMBINING GREEK DIALYTIKA TONOSCOMBINING GREEK YPOG" + - "EGRAMMENICOMBINING BRIDGE ABOVECOMBINING EQUALS SIGN BELOWCOMBINING DOUB" + - "LE VERTICAL LINE BELOWCOMBINING LEFT ANGLE BELOWCOMBINING NOT TILDE ABOV") + ("" + - "ECOMBINING HOMOTHETIC ABOVECOMBINING ALMOST EQUAL TO ABOVECOMBINING LEFT" + - " RIGHT ARROW BELOWCOMBINING UPWARDS ARROW BELOWCOMBINING GRAPHEME JOINER" + - "COMBINING RIGHT ARROWHEAD ABOVECOMBINING LEFT HALF RING ABOVECOMBINING F" + - "ERMATACOMBINING X BELOWCOMBINING LEFT ARROWHEAD BELOWCOMBINING RIGHT ARR" + - "OWHEAD BELOWCOMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOWCOMBINING RI" + - "GHT HALF RING ABOVECOMBINING DOT ABOVE RIGHTCOMBINING ASTERISK BELOWCOMB" + - "INING DOUBLE RING BELOWCOMBINING ZIGZAG ABOVECOMBINING DOUBLE BREVE BELO" + - "WCOMBINING DOUBLE BREVECOMBINING DOUBLE MACRONCOMBINING DOUBLE MACRON BE" + - "LOWCOMBINING DOUBLE TILDECOMBINING DOUBLE INVERTED BREVECOMBINING DOUBLE" + - " RIGHTWARDS ARROW BELOWCOMBINING LATIN SMALL LETTER ACOMBINING LATIN SMA" + - "LL LETTER ECOMBINING LATIN SMALL LETTER ICOMBINING LATIN SMALL LETTER OC" + - "OMBINING LATIN SMALL LETTER UCOMBINING LATIN SMALL LETTER CCOMBINING LAT" + - "IN SMALL LETTER DCOMBINING LATIN SMALL LETTER HCOMBINING LATIN SMALL LET" + - "TER MCOMBINING LATIN SMALL LETTER RCOMBINING LATIN SMALL LETTER TCOMBINI" + - "NG LATIN SMALL LETTER VCOMBINING LATIN SMALL LETTER XGREEK CAPITAL LETTE" + - "R HETAGREEK SMALL LETTER HETAGREEK CAPITAL LETTER ARCHAIC SAMPIGREEK SMA" + - "LL LETTER ARCHAIC SAMPIGREEK NUMERAL SIGNGREEK LOWER NUMERAL SIGNGREEK C" + - "APITAL LETTER PAMPHYLIAN DIGAMMAGREEK SMALL LETTER PAMPHYLIAN DIGAMMAGRE" + - "EK YPOGEGRAMMENIGREEK SMALL REVERSED LUNATE SIGMA SYMBOLGREEK SMALL DOTT" + - "ED LUNATE SIGMA SYMBOLGREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOLGRE" + - "EK QUESTION MARKGREEK CAPITAL LETTER YOTGREEK TONOSGREEK DIALYTIKA TONOS" + - "GREEK CAPITAL LETTER ALPHA WITH TONOSGREEK ANO TELEIAGREEK CAPITAL LETTE" + - "R EPSILON WITH TONOSGREEK CAPITAL LETTER ETA WITH TONOSGREEK CAPITAL LET" + - "TER IOTA WITH TONOSGREEK CAPITAL LETTER OMICRON WITH TONOSGREEK CAPITAL " + - "LETTER UPSILON WITH TONOSGREEK CAPITAL LETTER OMEGA WITH TONOSGREEK SMAL" + - "L LETTER IOTA WITH DIALYTIKA AND TONOSGREEK CAPITAL LETTER ALPHAGREEK CA" + - "PITAL LETTER BETAGREEK CAPITAL LETTER GAMMAGREEK CAPITAL LETTER DELTAGRE" + - "EK CAPITAL LETTER EPSILONGREEK CAPITAL LETTER ZETAGREEK CAPITAL LETTER E" + - "TAGREEK CAPITAL LETTER THETAGREEK CAPITAL LETTER IOTAGREEK CAPITAL LETTE" + - "R KAPPAGREEK CAPITAL LETTER LAMDAGREEK CAPITAL LETTER MUGREEK CAPITAL LE" + - "TTER NUGREEK CAPITAL LETTER XIGREEK CAPITAL LETTER OMICRONGREEK CAPITAL " + - "LETTER PIGREEK CAPITAL LETTER RHOGREEK CAPITAL LETTER SIGMAGREEK CAPITAL" + - " LETTER TAUGREEK CAPITAL LETTER UPSILONGREEK CAPITAL LETTER PHIGREEK CAP" + - "ITAL LETTER CHIGREEK CAPITAL LETTER PSIGREEK CAPITAL LETTER OMEGAGREEK C" + - "APITAL LETTER IOTA WITH DIALYTIKAGREEK CAPITAL LETTER UPSILON WITH DIALY" + - "TIKAGREEK SMALL LETTER ALPHA WITH TONOSGREEK SMALL LETTER EPSILON WITH T" + - "ONOSGREEK SMALL LETTER ETA WITH TONOSGREEK SMALL LETTER IOTA WITH TONOSG" + - "REEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOSGREEK SMALL LETTER ALP" + - "HAGREEK SMALL LETTER BETAGREEK SMALL LETTER GAMMAGREEK SMALL LETTER DELT" + - "AGREEK SMALL LETTER EPSILONGREEK SMALL LETTER ZETAGREEK SMALL LETTER ETA" + - "GREEK SMALL LETTER THETAGREEK SMALL LETTER IOTAGREEK SMALL LETTER KAPPAG" + - "REEK SMALL LETTER LAMDAGREEK SMALL LETTER MUGREEK SMALL LETTER NUGREEK S" + - "MALL LETTER XIGREEK SMALL LETTER OMICRONGREEK SMALL LETTER PIGREEK SMALL" + - " LETTER RHOGREEK SMALL LETTER FINAL SIGMAGREEK SMALL LETTER SIGMAGREEK S" + - "MALL LETTER TAUGREEK SMALL LETTER UPSILONGREEK SMALL LETTER PHIGREEK SMA" + - "LL LETTER CHIGREEK SMALL LETTER PSIGREEK SMALL LETTER OMEGAGREEK SMALL L" + - "ETTER IOTA WITH DIALYTIKAGREEK SMALL LETTER UPSILON WITH DIALYTIKAGREEK " + - "SMALL LETTER OMICRON WITH TONOSGREEK SMALL LETTER UPSILON WITH TONOSGREE" + - "K SMALL LETTER OMEGA WITH TONOSGREEK CAPITAL KAI SYMBOLGREEK BETA SYMBOL" + - "GREEK THETA SYMBOLGREEK UPSILON WITH HOOK SYMBOLGREEK UPSILON WITH ACUTE" + - " AND HOOK SYMBOLGREEK UPSILON WITH DIAERESIS AND HOOK SYMBOLGREEK PHI SY" + - "MBOLGREEK PI SYMBOLGREEK KAI SYMBOLGREEK LETTER ARCHAIC KOPPAGREEK SMALL" + - " LETTER ARCHAIC KOPPAGREEK LETTER STIGMAGREEK SMALL LETTER STIGMAGREEK L" + - "ETTER DIGAMMAGREEK SMALL LETTER DIGAMMAGREEK LETTER KOPPAGREEK SMALL LET" + - "TER KOPPAGREEK LETTER SAMPIGREEK SMALL LETTER SAMPICOPTIC CAPITAL LETTER" + - " SHEICOPTIC SMALL LETTER SHEICOPTIC CAPITAL LETTER FEICOPTIC SMALL LETTE" + - "R FEICOPTIC CAPITAL LETTER KHEICOPTIC SMALL LETTER KHEICOPTIC CAPITAL LE" + - "TTER HORICOPTIC SMALL LETTER HORICOPTIC CAPITAL LETTER GANGIACOPTIC SMAL" + - "L LETTER GANGIACOPTIC CAPITAL LETTER SHIMACOPTIC SMALL LETTER SHIMACOPTI" + - "C CAPITAL LETTER DEICOPTIC SMALL LETTER DEIGREEK KAPPA SYMBOLGREEK RHO S" + - "YMBOLGREEK LUNATE SIGMA SYMBOLGREEK LETTER YOTGREEK CAPITAL THETA SYMBOL" + - "GREEK LUNATE EPSILON SYMBOLGREEK REVERSED LUNATE EPSILON SYMBOLGREEK CAP" + - "ITAL LETTER SHOGREEK SMALL LETTER SHOGREEK CAPITAL LUNATE SIGMA SYMBOLGR" + - "EEK CAPITAL LETTER SANGREEK SMALL LETTER SANGREEK RHO WITH STROKE SYMBOL") + ("" + - "GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOLGREEK CAPITAL DOTTED LUNATE SI" + - "GMA SYMBOLGREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOLCYRILLIC CAPI" + - "TAL LETTER IE WITH GRAVECYRILLIC CAPITAL LETTER IOCYRILLIC CAPITAL LETTE" + - "R DJECYRILLIC CAPITAL LETTER GJECYRILLIC CAPITAL LETTER UKRAINIAN IECYRI" + - "LLIC CAPITAL LETTER DZECYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN IC" + - "YRILLIC CAPITAL LETTER YICYRILLIC CAPITAL LETTER JECYRILLIC CAPITAL LETT" + - "ER LJECYRILLIC CAPITAL LETTER NJECYRILLIC CAPITAL LETTER TSHECYRILLIC CA" + - "PITAL LETTER KJECYRILLIC CAPITAL LETTER I WITH GRAVECYRILLIC CAPITAL LET" + - "TER SHORT UCYRILLIC CAPITAL LETTER DZHECYRILLIC CAPITAL LETTER ACYRILLIC" + - " CAPITAL LETTER BECYRILLIC CAPITAL LETTER VECYRILLIC CAPITAL LETTER GHEC" + - "YRILLIC CAPITAL LETTER DECYRILLIC CAPITAL LETTER IECYRILLIC CAPITAL LETT" + - "ER ZHECYRILLIC CAPITAL LETTER ZECYRILLIC CAPITAL LETTER ICYRILLIC CAPITA" + - "L LETTER SHORT ICYRILLIC CAPITAL LETTER KACYRILLIC CAPITAL LETTER ELCYRI" + - "LLIC CAPITAL LETTER EMCYRILLIC CAPITAL LETTER ENCYRILLIC CAPITAL LETTER " + - "OCYRILLIC CAPITAL LETTER PECYRILLIC CAPITAL LETTER ERCYRILLIC CAPITAL LE" + - "TTER ESCYRILLIC CAPITAL LETTER TECYRILLIC CAPITAL LETTER UCYRILLIC CAPIT" + - "AL LETTER EFCYRILLIC CAPITAL LETTER HACYRILLIC CAPITAL LETTER TSECYRILLI" + - "C CAPITAL LETTER CHECYRILLIC CAPITAL LETTER SHACYRILLIC CAPITAL LETTER S" + - "HCHACYRILLIC CAPITAL LETTER HARD SIGNCYRILLIC CAPITAL LETTER YERUCYRILLI" + - "C CAPITAL LETTER SOFT SIGNCYRILLIC CAPITAL LETTER ECYRILLIC CAPITAL LETT" + - "ER YUCYRILLIC CAPITAL LETTER YACYRILLIC SMALL LETTER ACYRILLIC SMALL LET" + - "TER BECYRILLIC SMALL LETTER VECYRILLIC SMALL LETTER GHECYRILLIC SMALL LE" + - "TTER DECYRILLIC SMALL LETTER IECYRILLIC SMALL LETTER ZHECYRILLIC SMALL L" + - "ETTER ZECYRILLIC SMALL LETTER ICYRILLIC SMALL LETTER SHORT ICYRILLIC SMA" + - "LL LETTER KACYRILLIC SMALL LETTER ELCYRILLIC SMALL LETTER EMCYRILLIC SMA" + - "LL LETTER ENCYRILLIC SMALL LETTER OCYRILLIC SMALL LETTER PECYRILLIC SMAL" + - "L LETTER ERCYRILLIC SMALL LETTER ESCYRILLIC SMALL LETTER TECYRILLIC SMAL" + - "L LETTER UCYRILLIC SMALL LETTER EFCYRILLIC SMALL LETTER HACYRILLIC SMALL" + - " LETTER TSECYRILLIC SMALL LETTER CHECYRILLIC SMALL LETTER SHACYRILLIC SM" + - "ALL LETTER SHCHACYRILLIC SMALL LETTER HARD SIGNCYRILLIC SMALL LETTER YER" + - "UCYRILLIC SMALL LETTER SOFT SIGNCYRILLIC SMALL LETTER ECYRILLIC SMALL LE" + - "TTER YUCYRILLIC SMALL LETTER YACYRILLIC SMALL LETTER IE WITH GRAVECYRILL" + - "IC SMALL LETTER IOCYRILLIC SMALL LETTER DJECYRILLIC SMALL LETTER GJECYRI" + - "LLIC SMALL LETTER UKRAINIAN IECYRILLIC SMALL LETTER DZECYRILLIC SMALL LE" + - "TTER BYELORUSSIAN-UKRAINIAN ICYRILLIC SMALL LETTER YICYRILLIC SMALL LETT" + - "ER JECYRILLIC SMALL LETTER LJECYRILLIC SMALL LETTER NJECYRILLIC SMALL LE" + - "TTER TSHECYRILLIC SMALL LETTER KJECYRILLIC SMALL LETTER I WITH GRAVECYRI" + - "LLIC SMALL LETTER SHORT UCYRILLIC SMALL LETTER DZHECYRILLIC CAPITAL LETT" + - "ER OMEGACYRILLIC SMALL LETTER OMEGACYRILLIC CAPITAL LETTER YATCYRILLIC S" + - "MALL LETTER YATCYRILLIC CAPITAL LETTER IOTIFIED ECYRILLIC SMALL LETTER I" + - "OTIFIED ECYRILLIC CAPITAL LETTER LITTLE YUSCYRILLIC SMALL LETTER LITTLE " + - "YUSCYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUSCYRILLIC SMALL LETTER IOTI" + - "FIED LITTLE YUSCYRILLIC CAPITAL LETTER BIG YUSCYRILLIC SMALL LETTER BIG " + - "YUSCYRILLIC CAPITAL LETTER IOTIFIED BIG YUSCYRILLIC SMALL LETTER IOTIFIE" + - "D BIG YUSCYRILLIC CAPITAL LETTER KSICYRILLIC SMALL LETTER KSICYRILLIC CA" + - "PITAL LETTER PSICYRILLIC SMALL LETTER PSICYRILLIC CAPITAL LETTER FITACYR" + - "ILLIC SMALL LETTER FITACYRILLIC CAPITAL LETTER IZHITSACYRILLIC SMALL LET" + - "TER IZHITSACYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENTCYRIL" + - "LIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENTCYRILLIC CAPITAL LETTER" + - " UKCYRILLIC SMALL LETTER UKCYRILLIC CAPITAL LETTER ROUND OMEGACYRILLIC S" + - "MALL LETTER ROUND OMEGACYRILLIC CAPITAL LETTER OMEGA WITH TITLOCYRILLIC " + - "SMALL LETTER OMEGA WITH TITLOCYRILLIC CAPITAL LETTER OTCYRILLIC SMALL LE" + - "TTER OTCYRILLIC CAPITAL LETTER KOPPACYRILLIC SMALL LETTER KOPPACYRILLIC " + - "THOUSANDS SIGNCOMBINING CYRILLIC TITLOCOMBINING CYRILLIC PALATALIZATIONC" + - "OMBINING CYRILLIC DASIA PNEUMATACOMBINING CYRILLIC PSILI PNEUMATACOMBINI" + - "NG CYRILLIC POKRYTIECOMBINING CYRILLIC HUNDRED THOUSANDS SIGNCOMBINING C" + - "YRILLIC MILLIONS SIGNCYRILLIC CAPITAL LETTER SHORT I WITH TAILCYRILLIC S" + - "MALL LETTER SHORT I WITH TAILCYRILLIC CAPITAL LETTER SEMISOFT SIGNCYRILL" + - "IC SMALL LETTER SEMISOFT SIGNCYRILLIC CAPITAL LETTER ER WITH TICKCYRILLI" + - "C SMALL LETTER ER WITH TICKCYRILLIC CAPITAL LETTER GHE WITH UPTURNCYRILL" + - "IC SMALL LETTER GHE WITH UPTURNCYRILLIC CAPITAL LETTER GHE WITH STROKECY" + - "RILLIC SMALL LETTER GHE WITH STROKECYRILLIC CAPITAL LETTER GHE WITH MIDD" + - "LE HOOKCYRILLIC SMALL LETTER GHE WITH MIDDLE HOOKCYRILLIC CAPITAL LETTER" + - " ZHE WITH DESCENDERCYRILLIC SMALL LETTER ZHE WITH DESCENDERCYRILLIC CAPI") + ("" + - "TAL LETTER ZE WITH DESCENDERCYRILLIC SMALL LETTER ZE WITH DESCENDERCYRIL" + - "LIC CAPITAL LETTER KA WITH DESCENDERCYRILLIC SMALL LETTER KA WITH DESCEN" + - "DERCYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKECYRILLIC SMALL LETTER " + - "KA WITH VERTICAL STROKECYRILLIC CAPITAL LETTER KA WITH STROKECYRILLIC SM" + - "ALL LETTER KA WITH STROKECYRILLIC CAPITAL LETTER BASHKIR KACYRILLIC SMAL" + - "L LETTER BASHKIR KACYRILLIC CAPITAL LETTER EN WITH DESCENDERCYRILLIC SMA" + - "LL LETTER EN WITH DESCENDERCYRILLIC CAPITAL LIGATURE EN GHECYRILLIC SMAL" + - "L LIGATURE EN GHECYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOKCYRILLIC SMA" + - "LL LETTER PE WITH MIDDLE HOOKCYRILLIC CAPITAL LETTER ABKHASIAN HACYRILLI" + - "C SMALL LETTER ABKHASIAN HACYRILLIC CAPITAL LETTER ES WITH DESCENDERCYRI" + - "LLIC SMALL LETTER ES WITH DESCENDERCYRILLIC CAPITAL LETTER TE WITH DESCE" + - "NDERCYRILLIC SMALL LETTER TE WITH DESCENDERCYRILLIC CAPITAL LETTER STRAI" + - "GHT UCYRILLIC SMALL LETTER STRAIGHT UCYRILLIC CAPITAL LETTER STRAIGHT U " + - "WITH STROKECYRILLIC SMALL LETTER STRAIGHT U WITH STROKECYRILLIC CAPITAL " + - "LETTER HA WITH DESCENDERCYRILLIC SMALL LETTER HA WITH DESCENDERCYRILLIC " + - "CAPITAL LIGATURE TE TSECYRILLIC SMALL LIGATURE TE TSECYRILLIC CAPITAL LE" + - "TTER CHE WITH DESCENDERCYRILLIC SMALL LETTER CHE WITH DESCENDERCYRILLIC " + - "CAPITAL LETTER CHE WITH VERTICAL STROKECYRILLIC SMALL LETTER CHE WITH VE" + - "RTICAL STROKECYRILLIC CAPITAL LETTER SHHACYRILLIC SMALL LETTER SHHACYRIL" + - "LIC CAPITAL LETTER ABKHASIAN CHECYRILLIC SMALL LETTER ABKHASIAN CHECYRIL" + - "LIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDERCYRILLIC SMALL LETTER ABK" + - "HASIAN CHE WITH DESCENDERCYRILLIC LETTER PALOCHKACYRILLIC CAPITAL LETTER" + - " ZHE WITH BREVECYRILLIC SMALL LETTER ZHE WITH BREVECYRILLIC CAPITAL LETT" + - "ER KA WITH HOOKCYRILLIC SMALL LETTER KA WITH HOOKCYRILLIC CAPITAL LETTER" + - " EL WITH TAILCYRILLIC SMALL LETTER EL WITH TAILCYRILLIC CAPITAL LETTER E" + - "N WITH HOOKCYRILLIC SMALL LETTER EN WITH HOOKCYRILLIC CAPITAL LETTER EN " + - "WITH TAILCYRILLIC SMALL LETTER EN WITH TAILCYRILLIC CAPITAL LETTER KHAKA" + - "SSIAN CHECYRILLIC SMALL LETTER KHAKASSIAN CHECYRILLIC CAPITAL LETTER EM " + - "WITH TAILCYRILLIC SMALL LETTER EM WITH TAILCYRILLIC SMALL LETTER PALOCHK" + - "ACYRILLIC CAPITAL LETTER A WITH BREVECYRILLIC SMALL LETTER A WITH BREVEC" + - "YRILLIC CAPITAL LETTER A WITH DIAERESISCYRILLIC SMALL LETTER A WITH DIAE" + - "RESISCYRILLIC CAPITAL LIGATURE A IECYRILLIC SMALL LIGATURE A IECYRILLIC " + - "CAPITAL LETTER IE WITH BREVECYRILLIC SMALL LETTER IE WITH BREVECYRILLIC " + - "CAPITAL LETTER SCHWACYRILLIC SMALL LETTER SCHWACYRILLIC CAPITAL LETTER S" + - "CHWA WITH DIAERESISCYRILLIC SMALL LETTER SCHWA WITH DIAERESISCYRILLIC CA" + - "PITAL LETTER ZHE WITH DIAERESISCYRILLIC SMALL LETTER ZHE WITH DIAERESISC" + - "YRILLIC CAPITAL LETTER ZE WITH DIAERESISCYRILLIC SMALL LETTER ZE WITH DI" + - "AERESISCYRILLIC CAPITAL LETTER ABKHASIAN DZECYRILLIC SMALL LETTER ABKHAS" + - "IAN DZECYRILLIC CAPITAL LETTER I WITH MACRONCYRILLIC SMALL LETTER I WITH" + - " MACRONCYRILLIC CAPITAL LETTER I WITH DIAERESISCYRILLIC SMALL LETTER I W" + - "ITH DIAERESISCYRILLIC CAPITAL LETTER O WITH DIAERESISCYRILLIC SMALL LETT" + - "ER O WITH DIAERESISCYRILLIC CAPITAL LETTER BARRED OCYRILLIC SMALL LETTER" + - " BARRED OCYRILLIC CAPITAL LETTER BARRED O WITH DIAERESISCYRILLIC SMALL L" + - "ETTER BARRED O WITH DIAERESISCYRILLIC CAPITAL LETTER E WITH DIAERESISCYR" + - "ILLIC SMALL LETTER E WITH DIAERESISCYRILLIC CAPITAL LETTER U WITH MACRON" + - "CYRILLIC SMALL LETTER U WITH MACRONCYRILLIC CAPITAL LETTER U WITH DIAERE" + - "SISCYRILLIC SMALL LETTER U WITH DIAERESISCYRILLIC CAPITAL LETTER U WITH " + - "DOUBLE ACUTECYRILLIC SMALL LETTER U WITH DOUBLE ACUTECYRILLIC CAPITAL LE" + - "TTER CHE WITH DIAERESISCYRILLIC SMALL LETTER CHE WITH DIAERESISCYRILLIC " + - "CAPITAL LETTER GHE WITH DESCENDERCYRILLIC SMALL LETTER GHE WITH DESCENDE" + - "RCYRILLIC CAPITAL LETTER YERU WITH DIAERESISCYRILLIC SMALL LETTER YERU W" + - "ITH DIAERESISCYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOKCYRILLIC SM" + - "ALL LETTER GHE WITH STROKE AND HOOKCYRILLIC CAPITAL LETTER HA WITH HOOKC" + - "YRILLIC SMALL LETTER HA WITH HOOKCYRILLIC CAPITAL LETTER HA WITH STROKEC" + - "YRILLIC SMALL LETTER HA WITH STROKECYRILLIC CAPITAL LETTER KOMI DECYRILL" + - "IC SMALL LETTER KOMI DECYRILLIC CAPITAL LETTER KOMI DJECYRILLIC SMALL LE" + - "TTER KOMI DJECYRILLIC CAPITAL LETTER KOMI ZJECYRILLIC SMALL LETTER KOMI " + - "ZJECYRILLIC CAPITAL LETTER KOMI DZJECYRILLIC SMALL LETTER KOMI DZJECYRIL" + - "LIC CAPITAL LETTER KOMI LJECYRILLIC SMALL LETTER KOMI LJECYRILLIC CAPITA" + - "L LETTER KOMI NJECYRILLIC SMALL LETTER KOMI NJECYRILLIC CAPITAL LETTER K" + - "OMI SJECYRILLIC SMALL LETTER KOMI SJECYRILLIC CAPITAL LETTER KOMI TJECYR" + - "ILLIC SMALL LETTER KOMI TJECYRILLIC CAPITAL LETTER REVERSED ZECYRILLIC S" + - "MALL LETTER REVERSED ZECYRILLIC CAPITAL LETTER EL WITH HOOKCYRILLIC SMAL" + - "L LETTER EL WITH HOOKCYRILLIC CAPITAL LETTER LHACYRILLIC SMALL LETTER LH") + ("" + - "ACYRILLIC CAPITAL LETTER RHACYRILLIC SMALL LETTER RHACYRILLIC CAPITAL LE" + - "TTER YAECYRILLIC SMALL LETTER YAECYRILLIC CAPITAL LETTER QACYRILLIC SMAL" + - "L LETTER QACYRILLIC CAPITAL LETTER WECYRILLIC SMALL LETTER WECYRILLIC CA" + - "PITAL LETTER ALEUT KACYRILLIC SMALL LETTER ALEUT KACYRILLIC CAPITAL LETT" + - "ER EL WITH MIDDLE HOOKCYRILLIC SMALL LETTER EL WITH MIDDLE HOOKCYRILLIC " + - "CAPITAL LETTER EN WITH MIDDLE HOOKCYRILLIC SMALL LETTER EN WITH MIDDLE H" + - "OOKCYRILLIC CAPITAL LETTER PE WITH DESCENDERCYRILLIC SMALL LETTER PE WIT" + - "H DESCENDERCYRILLIC CAPITAL LETTER SHHA WITH DESCENDERCYRILLIC SMALL LET" + - "TER SHHA WITH DESCENDERCYRILLIC CAPITAL LETTER EN WITH LEFT HOOKCYRILLIC" + - " SMALL LETTER EN WITH LEFT HOOKCYRILLIC CAPITAL LETTER DZZHECYRILLIC SMA" + - "LL LETTER DZZHECYRILLIC CAPITAL LETTER DCHECYRILLIC SMALL LETTER DCHECYR" + - "ILLIC CAPITAL LETTER EL WITH DESCENDERCYRILLIC SMALL LETTER EL WITH DESC" + - "ENDERARMENIAN CAPITAL LETTER AYBARMENIAN CAPITAL LETTER BENARMENIAN CAPI" + - "TAL LETTER GIMARMENIAN CAPITAL LETTER DAARMENIAN CAPITAL LETTER ECHARMEN" + - "IAN CAPITAL LETTER ZAARMENIAN CAPITAL LETTER EHARMENIAN CAPITAL LETTER E" + - "TARMENIAN CAPITAL LETTER TOARMENIAN CAPITAL LETTER ZHEARMENIAN CAPITAL L" + - "ETTER INIARMENIAN CAPITAL LETTER LIWNARMENIAN CAPITAL LETTER XEHARMENIAN" + - " CAPITAL LETTER CAARMENIAN CAPITAL LETTER KENARMENIAN CAPITAL LETTER HOA" + - "RMENIAN CAPITAL LETTER JAARMENIAN CAPITAL LETTER GHADARMENIAN CAPITAL LE" + - "TTER CHEHARMENIAN CAPITAL LETTER MENARMENIAN CAPITAL LETTER YIARMENIAN C" + - "APITAL LETTER NOWARMENIAN CAPITAL LETTER SHAARMENIAN CAPITAL LETTER VOAR" + - "MENIAN CAPITAL LETTER CHAARMENIAN CAPITAL LETTER PEHARMENIAN CAPITAL LET" + - "TER JHEHARMENIAN CAPITAL LETTER RAARMENIAN CAPITAL LETTER SEHARMENIAN CA" + - "PITAL LETTER VEWARMENIAN CAPITAL LETTER TIWNARMENIAN CAPITAL LETTER REHA" + - "RMENIAN CAPITAL LETTER COARMENIAN CAPITAL LETTER YIWNARMENIAN CAPITAL LE" + - "TTER PIWRARMENIAN CAPITAL LETTER KEHARMENIAN CAPITAL LETTER OHARMENIAN C" + - "APITAL LETTER FEHARMENIAN MODIFIER LETTER LEFT HALF RINGARMENIAN APOSTRO" + - "PHEARMENIAN EMPHASIS MARKARMENIAN EXCLAMATION MARKARMENIAN COMMAARMENIAN" + - " QUESTION MARKARMENIAN ABBREVIATION MARKARMENIAN SMALL LETTER AYBARMENIA" + - "N SMALL LETTER BENARMENIAN SMALL LETTER GIMARMENIAN SMALL LETTER DAARMEN" + - "IAN SMALL LETTER ECHARMENIAN SMALL LETTER ZAARMENIAN SMALL LETTER EHARME" + - "NIAN SMALL LETTER ETARMENIAN SMALL LETTER TOARMENIAN SMALL LETTER ZHEARM" + - "ENIAN SMALL LETTER INIARMENIAN SMALL LETTER LIWNARMENIAN SMALL LETTER XE" + - "HARMENIAN SMALL LETTER CAARMENIAN SMALL LETTER KENARMENIAN SMALL LETTER " + - "HOARMENIAN SMALL LETTER JAARMENIAN SMALL LETTER GHADARMENIAN SMALL LETTE" + - "R CHEHARMENIAN SMALL LETTER MENARMENIAN SMALL LETTER YIARMENIAN SMALL LE" + - "TTER NOWARMENIAN SMALL LETTER SHAARMENIAN SMALL LETTER VOARMENIAN SMALL " + - "LETTER CHAARMENIAN SMALL LETTER PEHARMENIAN SMALL LETTER JHEHARMENIAN SM" + - "ALL LETTER RAARMENIAN SMALL LETTER SEHARMENIAN SMALL LETTER VEWARMENIAN " + - "SMALL LETTER TIWNARMENIAN SMALL LETTER REHARMENIAN SMALL LETTER COARMENI" + - "AN SMALL LETTER YIWNARMENIAN SMALL LETTER PIWRARMENIAN SMALL LETTER KEHA" + - "RMENIAN SMALL LETTER OHARMENIAN SMALL LETTER FEHARMENIAN SMALL LIGATURE " + - "ECH YIWNARMENIAN FULL STOPARMENIAN HYPHENRIGHT-FACING ARMENIAN ETERNITY " + - "SIGNLEFT-FACING ARMENIAN ETERNITY SIGNARMENIAN DRAM SIGNHEBREW ACCENT ET" + - "NAHTAHEBREW ACCENT SEGOLHEBREW ACCENT SHALSHELETHEBREW ACCENT ZAQEF QATA" + - "NHEBREW ACCENT ZAQEF GADOLHEBREW ACCENT TIPEHAHEBREW ACCENT REVIAHEBREW " + - "ACCENT ZARQAHEBREW ACCENT PASHTAHEBREW ACCENT YETIVHEBREW ACCENT TEVIRHE" + - "BREW ACCENT GERESHHEBREW ACCENT GERESH MUQDAMHEBREW ACCENT GERSHAYIMHEBR" + - "EW ACCENT QARNEY PARAHEBREW ACCENT TELISHA GEDOLAHEBREW ACCENT PAZERHEBR" + - "EW ACCENT ATNAH HAFUKHHEBREW ACCENT MUNAHHEBREW ACCENT MAHAPAKHHEBREW AC" + - "CENT MERKHAHEBREW ACCENT MERKHA KEFULAHEBREW ACCENT DARGAHEBREW ACCENT Q" + - "ADMAHEBREW ACCENT TELISHA QETANAHEBREW ACCENT YERAH BEN YOMOHEBREW ACCEN" + - "T OLEHEBREW ACCENT ILUYHEBREW ACCENT DEHIHEBREW ACCENT ZINORHEBREW MARK " + - "MASORA CIRCLEHEBREW POINT SHEVAHEBREW POINT HATAF SEGOLHEBREW POINT HATA" + - "F PATAHHEBREW POINT HATAF QAMATSHEBREW POINT HIRIQHEBREW POINT TSEREHEBR" + - "EW POINT SEGOLHEBREW POINT PATAHHEBREW POINT QAMATSHEBREW POINT HOLAMHEB" + - "REW POINT HOLAM HASER FOR VAVHEBREW POINT QUBUTSHEBREW POINT DAGESH OR M" + - "APIQHEBREW POINT METEGHEBREW PUNCTUATION MAQAFHEBREW POINT RAFEHEBREW PU" + - "NCTUATION PASEQHEBREW POINT SHIN DOTHEBREW POINT SIN DOTHEBREW PUNCTUATI" + - "ON SOF PASUQHEBREW MARK UPPER DOTHEBREW MARK LOWER DOTHEBREW PUNCTUATION" + - " NUN HAFUKHAHEBREW POINT QAMATS QATANHEBREW LETTER ALEFHEBREW LETTER BET" + - "HEBREW LETTER GIMELHEBREW LETTER DALETHEBREW LETTER HEHEBREW LETTER VAVH" + - "EBREW LETTER ZAYINHEBREW LETTER HETHEBREW LETTER TETHEBREW LETTER YODHEB" + - "REW LETTER FINAL KAFHEBREW LETTER KAFHEBREW LETTER LAMEDHEBREW LETTER FI") + ("" + - "NAL MEMHEBREW LETTER MEMHEBREW LETTER FINAL NUNHEBREW LETTER NUNHEBREW L" + - "ETTER SAMEKHHEBREW LETTER AYINHEBREW LETTER FINAL PEHEBREW LETTER PEHEBR" + - "EW LETTER FINAL TSADIHEBREW LETTER TSADIHEBREW LETTER QOFHEBREW LETTER R" + - "ESHHEBREW LETTER SHINHEBREW LETTER TAVHEBREW LIGATURE YIDDISH DOUBLE VAV" + - "HEBREW LIGATURE YIDDISH VAV YODHEBREW LIGATURE YIDDISH DOUBLE YODHEBREW " + - "PUNCTUATION GERESHHEBREW PUNCTUATION GERSHAYIMARABIC NUMBER SIGNARABIC S" + - "IGN SANAHARABIC FOOTNOTE MARKERARABIC SIGN SAFHAARABIC SIGN SAMVATARABIC" + - " NUMBER MARK ABOVEARABIC-INDIC CUBE ROOTARABIC-INDIC FOURTH ROOTARABIC R" + - "AYARABIC-INDIC PER MILLE SIGNARABIC-INDIC PER TEN THOUSAND SIGNAFGHANI S" + - "IGNARABIC COMMAARABIC DATE SEPARATORARABIC POETIC VERSE SIGNARABIC SIGN " + - "MISRAARABIC SIGN SALLALLAHOU ALAYHE WASSALLAMARABIC SIGN ALAYHE ASSALLAM" + - "ARABIC SIGN RAHMATULLAH ALAYHEARABIC SIGN RADI ALLAHOU ANHUARABIC SIGN T" + - "AKHALLUSARABIC SMALL HIGH TAHARABIC SMALL HIGH LIGATURE ALEF WITH LAM WI" + - "TH YEHARABIC SMALL HIGH ZAINARABIC SMALL FATHAARABIC SMALL DAMMAARABIC S" + - "MALL KASRAARABIC SEMICOLONARABIC LETTER MARKARABIC TRIPLE DOT PUNCTUATIO" + - "N MARKARABIC QUESTION MARKARABIC LETTER KASHMIRI YEHARABIC LETTER HAMZAA" + - "RABIC LETTER ALEF WITH MADDA ABOVEARABIC LETTER ALEF WITH HAMZA ABOVEARA" + - "BIC LETTER WAW WITH HAMZA ABOVEARABIC LETTER ALEF WITH HAMZA BELOWARABIC" + - " LETTER YEH WITH HAMZA ABOVEARABIC LETTER ALEFARABIC LETTER BEHARABIC LE" + - "TTER TEH MARBUTAARABIC LETTER TEHARABIC LETTER THEHARABIC LETTER JEEMARA" + - "BIC LETTER HAHARABIC LETTER KHAHARABIC LETTER DALARABIC LETTER THALARABI" + - "C LETTER REHARABIC LETTER ZAINARABIC LETTER SEENARABIC LETTER SHEENARABI" + - "C LETTER SADARABIC LETTER DADARABIC LETTER TAHARABIC LETTER ZAHARABIC LE" + - "TTER AINARABIC LETTER GHAINARABIC LETTER KEHEH WITH TWO DOTS ABOVEARABIC" + - " LETTER KEHEH WITH THREE DOTS BELOWARABIC LETTER FARSI YEH WITH INVERTED" + - " VARABIC LETTER FARSI YEH WITH TWO DOTS ABOVEARABIC LETTER FARSI YEH WIT" + - "H THREE DOTS ABOVEARABIC TATWEELARABIC LETTER FEHARABIC LETTER QAFARABIC" + - " LETTER KAFARABIC LETTER LAMARABIC LETTER MEEMARABIC LETTER NOONARABIC L" + - "ETTER HEHARABIC LETTER WAWARABIC LETTER ALEF MAKSURAARABIC LETTER YEHARA" + - "BIC FATHATANARABIC DAMMATANARABIC KASRATANARABIC FATHAARABIC DAMMAARABIC" + - " KASRAARABIC SHADDAARABIC SUKUNARABIC MADDAH ABOVEARABIC HAMZA ABOVEARAB" + - "IC HAMZA BELOWARABIC SUBSCRIPT ALEFARABIC INVERTED DAMMAARABIC MARK NOON" + - " GHUNNAARABIC ZWARAKAYARABIC VOWEL SIGN SMALL V ABOVEARABIC VOWEL SIGN I" + - "NVERTED SMALL V ABOVEARABIC VOWEL SIGN DOT BELOWARABIC REVERSED DAMMAARA" + - "BIC FATHA WITH TWO DOTSARABIC WAVY HAMZA BELOWARABIC-INDIC DIGIT ZEROARA" + - "BIC-INDIC DIGIT ONEARABIC-INDIC DIGIT TWOARABIC-INDIC DIGIT THREEARABIC-" + - "INDIC DIGIT FOURARABIC-INDIC DIGIT FIVEARABIC-INDIC DIGIT SIXARABIC-INDI" + - "C DIGIT SEVENARABIC-INDIC DIGIT EIGHTARABIC-INDIC DIGIT NINEARABIC PERCE" + - "NT SIGNARABIC DECIMAL SEPARATORARABIC THOUSANDS SEPARATORARABIC FIVE POI" + - "NTED STARARABIC LETTER DOTLESS BEHARABIC LETTER DOTLESS QAFARABIC LETTER" + - " SUPERSCRIPT ALEFARABIC LETTER ALEF WASLAARABIC LETTER ALEF WITH WAVY HA" + - "MZA ABOVEARABIC LETTER ALEF WITH WAVY HAMZA BELOWARABIC LETTER HIGH HAMZ" + - "AARABIC LETTER HIGH HAMZA ALEFARABIC LETTER HIGH HAMZA WAWARABIC LETTER " + - "U WITH HAMZA ABOVEARABIC LETTER HIGH HAMZA YEHARABIC LETTER TTEHARABIC L" + - "ETTER TTEHEHARABIC LETTER BEEHARABIC LETTER TEH WITH RINGARABIC LETTER T" + - "EH WITH THREE DOTS ABOVE DOWNWARDSARABIC LETTER PEHARABIC LETTER TEHEHAR" + - "ABIC LETTER BEHEHARABIC LETTER HAH WITH HAMZA ABOVEARABIC LETTER HAH WIT" + - "H TWO DOTS VERTICAL ABOVEARABIC LETTER NYEHARABIC LETTER DYEHARABIC LETT" + - "ER HAH WITH THREE DOTS ABOVEARABIC LETTER TCHEHARABIC LETTER TCHEHEHARAB" + - "IC LETTER DDALARABIC LETTER DAL WITH RINGARABIC LETTER DAL WITH DOT BELO" + - "WARABIC LETTER DAL WITH DOT BELOW AND SMALL TAHARABIC LETTER DAHALARABIC" + - " LETTER DDAHALARABIC LETTER DULARABIC LETTER DAL WITH THREE DOTS ABOVE D" + - "OWNWARDSARABIC LETTER DAL WITH FOUR DOTS ABOVEARABIC LETTER RREHARABIC L" + - "ETTER REH WITH SMALL VARABIC LETTER REH WITH RINGARABIC LETTER REH WITH " + - "DOT BELOWARABIC LETTER REH WITH SMALL V BELOWARABIC LETTER REH WITH DOT " + - "BELOW AND DOT ABOVEARABIC LETTER REH WITH TWO DOTS ABOVEARABIC LETTER JE" + - "HARABIC LETTER REH WITH FOUR DOTS ABOVEARABIC LETTER SEEN WITH DOT BELOW" + - " AND DOT ABOVEARABIC LETTER SEEN WITH THREE DOTS BELOWARABIC LETTER SEEN" + - " WITH THREE DOTS BELOW AND THREE DOTS ABOVEARABIC LETTER SAD WITH TWO DO" + - "TS BELOWARABIC LETTER SAD WITH THREE DOTS ABOVEARABIC LETTER TAH WITH TH" + - "REE DOTS ABOVEARABIC LETTER AIN WITH THREE DOTS ABOVEARABIC LETTER DOTLE" + - "SS FEHARABIC LETTER FEH WITH DOT MOVED BELOWARABIC LETTER FEH WITH DOT B" + - "ELOWARABIC LETTER VEHARABIC LETTER FEH WITH THREE DOTS BELOWARABIC LETTE" + - "R PEHEHARABIC LETTER QAF WITH DOT ABOVEARABIC LETTER QAF WITH THREE DOTS") + ("" + - " ABOVEARABIC LETTER KEHEHARABIC LETTER SWASH KAFARABIC LETTER KAF WITH R" + - "INGARABIC LETTER KAF WITH DOT ABOVEARABIC LETTER NGARABIC LETTER KAF WIT" + - "H THREE DOTS BELOWARABIC LETTER GAFARABIC LETTER GAF WITH RINGARABIC LET" + - "TER NGOEHARABIC LETTER GAF WITH TWO DOTS BELOWARABIC LETTER GUEHARABIC L" + - "ETTER GAF WITH THREE DOTS ABOVEARABIC LETTER LAM WITH SMALL VARABIC LETT" + - "ER LAM WITH DOT ABOVEARABIC LETTER LAM WITH THREE DOTS ABOVEARABIC LETTE" + - "R LAM WITH THREE DOTS BELOWARABIC LETTER NOON WITH DOT BELOWARABIC LETTE" + - "R NOON GHUNNAARABIC LETTER RNOONARABIC LETTER NOON WITH RINGARABIC LETTE" + - "R NOON WITH THREE DOTS ABOVEARABIC LETTER HEH DOACHASHMEEARABIC LETTER T" + - "CHEH WITH DOT ABOVEARABIC LETTER HEH WITH YEH ABOVEARABIC LETTER HEH GOA" + - "LARABIC LETTER HEH GOAL WITH HAMZA ABOVEARABIC LETTER TEH MARBUTA GOALAR" + - "ABIC LETTER WAW WITH RINGARABIC LETTER KIRGHIZ OEARABIC LETTER OEARABIC " + - "LETTER UARABIC LETTER YUARABIC LETTER KIRGHIZ YUARABIC LETTER WAW WITH T" + - "WO DOTS ABOVEARABIC LETTER VEARABIC LETTER FARSI YEHARABIC LETTER YEH WI" + - "TH TAILARABIC LETTER YEH WITH SMALL VARABIC LETTER WAW WITH DOT ABOVEARA" + - "BIC LETTER EARABIC LETTER YEH WITH THREE DOTS BELOWARABIC LETTER YEH BAR" + - "REEARABIC LETTER YEH BARREE WITH HAMZA ABOVEARABIC FULL STOPARABIC LETTE" + - "R AEARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURAARABIC SMAL" + - "L HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURAARABIC SMALL HIGH MEEM INI" + - "TIAL FORMARABIC SMALL HIGH LAM ALEFARABIC SMALL HIGH JEEMARABIC SMALL HI" + - "GH THREE DOTSARABIC SMALL HIGH SEENARABIC END OF AYAHARABIC START OF RUB" + - " EL HIZBARABIC SMALL HIGH ROUNDED ZEROARABIC SMALL HIGH UPRIGHT RECTANGU" + - "LAR ZEROARABIC SMALL HIGH DOTLESS HEAD OF KHAHARABIC SMALL HIGH MEEM ISO" + - "LATED FORMARABIC SMALL LOW SEENARABIC SMALL HIGH MADDAARABIC SMALL WAWAR" + - "ABIC SMALL YEHARABIC SMALL HIGH YEHARABIC SMALL HIGH NOONARABIC PLACE OF" + - " SAJDAHARABIC EMPTY CENTRE LOW STOPARABIC EMPTY CENTRE HIGH STOPARABIC R" + - "OUNDED HIGH STOP WITH FILLED CENTREARABIC SMALL LOW MEEMARABIC LETTER DA" + - "L WITH INVERTED VARABIC LETTER REH WITH INVERTED VEXTENDED ARABIC-INDIC " + - "DIGIT ZEROEXTENDED ARABIC-INDIC DIGIT ONEEXTENDED ARABIC-INDIC DIGIT TWO" + - "EXTENDED ARABIC-INDIC DIGIT THREEEXTENDED ARABIC-INDIC DIGIT FOUREXTENDE" + - "D ARABIC-INDIC DIGIT FIVEEXTENDED ARABIC-INDIC DIGIT SIXEXTENDED ARABIC-" + - "INDIC DIGIT SEVENEXTENDED ARABIC-INDIC DIGIT EIGHTEXTENDED ARABIC-INDIC " + - "DIGIT NINEARABIC LETTER SHEEN WITH DOT BELOWARABIC LETTER DAD WITH DOT B" + - "ELOWARABIC LETTER GHAIN WITH DOT BELOWARABIC SIGN SINDHI AMPERSANDARABIC" + - " SIGN SINDHI POSTPOSITION MENARABIC LETTER HEH WITH INVERTED VSYRIAC END" + - " OF PARAGRAPHSYRIAC SUPRALINEAR FULL STOPSYRIAC SUBLINEAR FULL STOPSYRIA" + - "C SUPRALINEAR COLONSYRIAC SUBLINEAR COLONSYRIAC HORIZONTAL COLONSYRIAC C" + - "OLON SKEWED LEFTSYRIAC COLON SKEWED RIGHTSYRIAC SUPRALINEAR COLON SKEWED" + - " LEFTSYRIAC SUBLINEAR COLON SKEWED RIGHTSYRIAC CONTRACTIONSYRIAC HARKLEA" + - "N OBELUSSYRIAC HARKLEAN METOBELUSSYRIAC HARKLEAN ASTERISCUSSYRIAC ABBREV" + - "IATION MARKSYRIAC LETTER ALAPHSYRIAC LETTER SUPERSCRIPT ALAPHSYRIAC LETT" + - "ER BETHSYRIAC LETTER GAMALSYRIAC LETTER GAMAL GARSHUNISYRIAC LETTER DALA" + - "THSYRIAC LETTER DOTLESS DALATH RISHSYRIAC LETTER HESYRIAC LETTER WAWSYRI" + - "AC LETTER ZAINSYRIAC LETTER HETHSYRIAC LETTER TETHSYRIAC LETTER TETH GAR" + - "SHUNISYRIAC LETTER YUDHSYRIAC LETTER YUDH HESYRIAC LETTER KAPHSYRIAC LET" + - "TER LAMADHSYRIAC LETTER MIMSYRIAC LETTER NUNSYRIAC LETTER SEMKATHSYRIAC " + - "LETTER FINAL SEMKATHSYRIAC LETTER ESYRIAC LETTER PESYRIAC LETTER REVERSE" + - "D PESYRIAC LETTER SADHESYRIAC LETTER QAPHSYRIAC LETTER RISHSYRIAC LETTER" + - " SHINSYRIAC LETTER TAWSYRIAC LETTER PERSIAN BHETHSYRIAC LETTER PERSIAN G" + - "HAMALSYRIAC LETTER PERSIAN DHALATHSYRIAC PTHAHA ABOVESYRIAC PTHAHA BELOW" + - "SYRIAC PTHAHA DOTTEDSYRIAC ZQAPHA ABOVESYRIAC ZQAPHA BELOWSYRIAC ZQAPHA " + - "DOTTEDSYRIAC RBASA ABOVESYRIAC RBASA BELOWSYRIAC DOTTED ZLAMA HORIZONTAL" + - "SYRIAC DOTTED ZLAMA ANGULARSYRIAC HBASA ABOVESYRIAC HBASA BELOWSYRIAC HB" + - "ASA-ESASA DOTTEDSYRIAC ESASA ABOVESYRIAC ESASA BELOWSYRIAC RWAHASYRIAC F" + - "EMININE DOTSYRIAC QUSHSHAYASYRIAC RUKKAKHASYRIAC TWO VERTICAL DOTS ABOVE" + - "SYRIAC TWO VERTICAL DOTS BELOWSYRIAC THREE DOTS ABOVESYRIAC THREE DOTS B" + - "ELOWSYRIAC OBLIQUE LINE ABOVESYRIAC OBLIQUE LINE BELOWSYRIAC MUSICSYRIAC" + - " BARREKHSYRIAC LETTER SOGDIAN ZHAINSYRIAC LETTER SOGDIAN KHAPHSYRIAC LET" + - "TER SOGDIAN FEARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOWARABIC" + - " LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVEARABIC LETTER BEH WITH TH" + - "REE DOTS POINTING UPWARDS BELOWARABIC LETTER BEH WITH THREE DOTS POINTIN" + - "G UPWARDS BELOW AND TWO DOTS ABOVEARABIC LETTER BEH WITH TWO DOTS BELOW " + - "AND DOT ABOVEARABIC LETTER BEH WITH INVERTED SMALL V BELOWARABIC LETTER " + - "BEH WITH SMALL VARABIC LETTER HAH WITH TWO DOTS ABOVEARABIC LETTER HAH W") + ("" + - "ITH THREE DOTS POINTING UPWARDS BELOWARABIC LETTER DAL WITH TWO DOTS VER" + - "TICALLY BELOW AND SMALL TAHARABIC LETTER DAL WITH INVERTED SMALL V BELOW" + - "ARABIC LETTER REH WITH STROKEARABIC LETTER SEEN WITH FOUR DOTS ABOVEARAB" + - "IC LETTER AIN WITH TWO DOTS ABOVEARABIC LETTER AIN WITH THREE DOTS POINT" + - "ING DOWNWARDS ABOVEARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVEARABI" + - "C LETTER FEH WITH TWO DOTS BELOWARABIC LETTER FEH WITH THREE DOTS POINTI" + - "NG UPWARDS BELOWARABIC LETTER KEHEH WITH DOT ABOVEARABIC LETTER KEHEH WI" + - "TH THREE DOTS ABOVEARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS " + - "BELOWARABIC LETTER MEEM WITH DOT ABOVEARABIC LETTER MEEM WITH DOT BELOWA" + - "RABIC LETTER NOON WITH TWO DOTS BELOWARABIC LETTER NOON WITH SMALL TAHAR" + - "ABIC LETTER NOON WITH SMALL VARABIC LETTER LAM WITH BARARABIC LETTER REH" + - " WITH TWO DOTS VERTICALLY ABOVEARABIC LETTER REH WITH HAMZA ABOVEARABIC " + - "LETTER SEEN WITH TWO DOTS VERTICALLY ABOVEARABIC LETTER HAH WITH SMALL A" + - "RABIC LETTER TAH BELOWARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND" + - " TWO DOTSARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTSARA" + - "BIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTSARABIC LETTER HA" + - "H WITH SMALL ARABIC LETTER TAH ABOVEARABIC LETTER ALEF WITH EXTENDED ARA" + - "BIC-INDIC DIGIT TWO ABOVEARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC D" + - "IGIT THREE ABOVEARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT" + - " TWO ABOVEARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE" + - " ABOVEARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELO" + - "WARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVEARABIC LETT" + - "ER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVEARABIC LETTER YEH BAR" + - "REE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVEARABIC LETTER YEH BARREE W" + - "ITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVEARABIC LETTER HAH WITH EXTEND" + - "ED ARABIC-INDIC DIGIT FOUR BELOWARABIC LETTER SEEN WITH EXTENDED ARABIC-" + - "INDIC DIGIT FOUR ABOVEARABIC LETTER SEEN WITH INVERTED VARABIC LETTER KA" + - "F WITH TWO DOTS ABOVETHAANA LETTER HAATHAANA LETTER SHAVIYANITHAANA LETT" + - "ER NOONUTHAANA LETTER RAATHAANA LETTER BAATHAANA LETTER LHAVIYANITHAANA " + - "LETTER KAAFUTHAANA LETTER ALIFUTHAANA LETTER VAAVUTHAANA LETTER MEEMUTHA" + - "ANA LETTER FAAFUTHAANA LETTER DHAALUTHAANA LETTER THAATHAANA LETTER LAAM" + - "UTHAANA LETTER GAAFUTHAANA LETTER GNAVIYANITHAANA LETTER SEENUTHAANA LET" + - "TER DAVIYANITHAANA LETTER ZAVIYANITHAANA LETTER TAVIYANITHAANA LETTER YA" + - "ATHAANA LETTER PAVIYANITHAANA LETTER JAVIYANITHAANA LETTER CHAVIYANITHAA" + - "NA LETTER TTAATHAANA LETTER HHAATHAANA LETTER KHAATHAANA LETTER THAALUTH" + - "AANA LETTER ZAATHAANA LETTER SHEENUTHAANA LETTER SAADHUTHAANA LETTER DAA" + - "DHUTHAANA LETTER TOTHAANA LETTER ZOTHAANA LETTER AINUTHAANA LETTER GHAIN" + - "UTHAANA LETTER QAAFUTHAANA LETTER WAAVUTHAANA ABAFILITHAANA AABAAFILITHA" + - "ANA IBIFILITHAANA EEBEEFILITHAANA UBUFILITHAANA OOBOOFILITHAANA EBEFILIT" + - "HAANA EYBEYFILITHAANA OBOFILITHAANA OABOAFILITHAANA SUKUNTHAANA LETTER N" + - "AANKO DIGIT ZERONKO DIGIT ONENKO DIGIT TWONKO DIGIT THREENKO DIGIT FOURN" + - "KO DIGIT FIVENKO DIGIT SIXNKO DIGIT SEVENNKO DIGIT EIGHTNKO DIGIT NINENK" + - "O LETTER ANKO LETTER EENKO LETTER INKO LETTER ENKO LETTER UNKO LETTER OO" + - "NKO LETTER ONKO LETTER DAGBASINNANKO LETTER NNKO LETTER BANKO LETTER PAN" + - "KO LETTER TANKO LETTER JANKO LETTER CHANKO LETTER DANKO LETTER RANKO LET" + - "TER RRANKO LETTER SANKO LETTER GBANKO LETTER FANKO LETTER KANKO LETTER L" + - "ANKO LETTER NA WOLOSONKO LETTER MANKO LETTER NYANKO LETTER NANKO LETTER " + - "HANKO LETTER WANKO LETTER YANKO LETTER NYA WOLOSONKO LETTER JONA JANKO L" + - "ETTER JONA CHANKO LETTER JONA RANKO COMBINING SHORT HIGH TONENKO COMBINI" + - "NG SHORT LOW TONENKO COMBINING SHORT RISING TONENKO COMBINING LONG DESCE" + - "NDING TONENKO COMBINING LONG HIGH TONENKO COMBINING LONG LOW TONENKO COM" + - "BINING LONG RISING TONENKO COMBINING NASALIZATION MARKNKO COMBINING DOUB" + - "LE DOT ABOVENKO HIGH TONE APOSTROPHENKO LOW TONE APOSTROPHENKO SYMBOL OO" + - " DENNENNKO SYMBOL GBAKURUNENNKO COMMANKO EXCLAMATION MARKNKO LAJANYALANS" + - "AMARITAN LETTER ALAFSAMARITAN LETTER BITSAMARITAN LETTER GAMANSAMARITAN " + - "LETTER DALATSAMARITAN LETTER IYSAMARITAN LETTER BAASAMARITAN LETTER ZENS" + - "AMARITAN LETTER ITSAMARITAN LETTER TITSAMARITAN LETTER YUTSAMARITAN LETT" + - "ER KAAFSAMARITAN LETTER LABATSAMARITAN LETTER MIMSAMARITAN LETTER NUNSAM" + - "ARITAN LETTER SINGAATSAMARITAN LETTER INSAMARITAN LETTER FISAMARITAN LET" + - "TER TSAADIYSAMARITAN LETTER QUFSAMARITAN LETTER RISHSAMARITAN LETTER SHA" + - "NSAMARITAN LETTER TAAFSAMARITAN MARK INSAMARITAN MARK IN-ALAFSAMARITAN M" + - "ARK OCCLUSIONSAMARITAN MARK DAGESHSAMARITAN MODIFIER LETTER EPENTHETIC Y" + - "UTSAMARITAN MARK EPENTHETIC YUTSAMARITAN VOWEL SIGN LONG ESAMARITAN VOWE" + - "L SIGN ESAMARITAN VOWEL SIGN OVERLONG AASAMARITAN VOWEL SIGN LONG AASAMA") + ("" + - "RITAN VOWEL SIGN AASAMARITAN VOWEL SIGN OVERLONG ASAMARITAN VOWEL SIGN L" + - "ONG ASAMARITAN VOWEL SIGN ASAMARITAN MODIFIER LETTER SHORT ASAMARITAN VO" + - "WEL SIGN SHORT ASAMARITAN VOWEL SIGN LONG USAMARITAN VOWEL SIGN USAMARIT" + - "AN MODIFIER LETTER ISAMARITAN VOWEL SIGN LONG ISAMARITAN VOWEL SIGN ISAM" + - "ARITAN VOWEL SIGN OSAMARITAN VOWEL SIGN SUKUNSAMARITAN MARK NEQUDAASAMAR" + - "ITAN PUNCTUATION NEQUDAASAMARITAN PUNCTUATION AFSAAQSAMARITAN PUNCTUATIO" + - "N ANGEDSAMARITAN PUNCTUATION BAUSAMARITAN PUNCTUATION ATMAAUSAMARITAN PU" + - "NCTUATION SHIYYAALAASAMARITAN ABBREVIATION MARKSAMARITAN PUNCTUATION MEL" + - "ODIC QITSASAMARITAN PUNCTUATION ZIQAASAMARITAN PUNCTUATION QITSASAMARITA" + - "N PUNCTUATION ZAEFSAMARITAN PUNCTUATION TURUSAMARITAN PUNCTUATION ARKAAN" + - "USAMARITAN PUNCTUATION SOF MASHFAATSAMARITAN PUNCTUATION ANNAAUMANDAIC L" + - "ETTER HALQAMANDAIC LETTER ABMANDAIC LETTER AGMANDAIC LETTER ADMANDAIC LE" + - "TTER AHMANDAIC LETTER USHENNAMANDAIC LETTER AZMANDAIC LETTER ITMANDAIC L" + - "ETTER ATTMANDAIC LETTER AKSAMANDAIC LETTER AKMANDAIC LETTER ALMANDAIC LE" + - "TTER AMMANDAIC LETTER ANMANDAIC LETTER ASMANDAIC LETTER INMANDAIC LETTER" + - " APMANDAIC LETTER ASZMANDAIC LETTER AQMANDAIC LETTER ARMANDAIC LETTER AS" + - "HMANDAIC LETTER ATMANDAIC LETTER DUSHENNAMANDAIC LETTER KADMANDAIC LETTE" + - "R AINMANDAIC AFFRICATION MARKMANDAIC VOCALIZATION MARKMANDAIC GEMINATION" + - " MARKMANDAIC PUNCTUATIONARABIC LETTER BEH WITH SMALL V BELOWARABIC LETTE" + - "R BEH WITH HAMZA ABOVEARABIC LETTER JEEM WITH TWO DOTS ABOVEARABIC LETTE" + - "R TAH WITH TWO DOTS ABOVEARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS" + - " ABOVEARABIC LETTER QAF WITH DOT BELOWARABIC LETTER LAM WITH DOUBLE BARA" + - "RABIC LETTER MEEM WITH THREE DOTS ABOVEARABIC LETTER YEH WITH TWO DOTS B" + - "ELOW AND HAMZA ABOVEARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVEA" + - "RABIC LETTER REH WITH LOOPARABIC LETTER WAW WITH DOT WITHINARABIC LETTER" + - " ROHINGYA YEHARABIC LETTER LOW ALEFARABIC LETTER DAL WITH THREE DOTS BEL" + - "OWARABIC LETTER SAD WITH THREE DOTS BELOWARABIC LETTER GAF WITH INVERTED" + - " STROKEARABIC LETTER STRAIGHT WAWARABIC LETTER ZAIN WITH INVERTED V ABOV" + - "EARABIC LETTER AIN WITH THREE DOTS BELOWARABIC LETTER KAF WITH DOT BELOW" + - "ARABIC LETTER BEH WITH SMALL MEEM ABOVEARABIC LETTER PEH WITH SMALL MEEM" + - " ABOVEARABIC LETTER TEH WITH SMALL TEH ABOVEARABIC LETTER REH WITH SMALL" + - " NOON ABOVEARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVEARA" + - "BIC LETTER AFRICAN FEHARABIC LETTER AFRICAN QAFARABIC LETTER AFRICAN NOO" + - "NARABIC SMALL HIGH WORD AR-RUBARABIC SMALL HIGH SADARABIC SMALL HIGH AIN" + - "ARABIC SMALL HIGH QAFARABIC SMALL HIGH NOON WITH KASRAARABIC SMALL LOW N" + - "OON WITH KASRAARABIC SMALL HIGH WORD ATH-THALATHAARABIC SMALL HIGH WORD " + - "AS-SAJDAARABIC SMALL HIGH WORD AN-NISFARABIC SMALL HIGH WORD SAKTAARABIC" + - " SMALL HIGH WORD QIFARABIC SMALL HIGH WORD WAQFAARABIC SMALL HIGH FOOTNO" + - "TE MARKERARABIC SMALL HIGH SIGN SAFHAARABIC DISPUTED END OF AYAHARABIC T" + - "URNED DAMMA BELOWARABIC CURLY FATHAARABIC CURLY DAMMAARABIC CURLY KASRAA" + - "RABIC CURLY FATHATANARABIC CURLY DAMMATANARABIC CURLY KASRATANARABIC TON" + - "E ONE DOT ABOVEARABIC TONE TWO DOTS ABOVEARABIC TONE LOOP ABOVEARABIC TO" + - "NE ONE DOT BELOWARABIC TONE TWO DOTS BELOWARABIC TONE LOOP BELOWARABIC O" + - "PEN FATHATANARABIC OPEN DAMMATANARABIC OPEN KASRATANARABIC SMALL HIGH WA" + - "WARABIC FATHA WITH RINGARABIC FATHA WITH DOT ABOVEARABIC KASRA WITH DOT " + - "BELOWARABIC LEFT ARROWHEAD ABOVEARABIC RIGHT ARROWHEAD ABOVEARABIC LEFT " + - "ARROWHEAD BELOWARABIC RIGHT ARROWHEAD BELOWARABIC DOUBLE RIGHT ARROWHEAD" + - " ABOVEARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOTARABIC RIGHT ARROWHEAD" + - " ABOVE WITH DOTARABIC DAMMA WITH DOTARABIC MARK SIDEWAYS NOON GHUNNADEVA" + - "NAGARI SIGN INVERTED CANDRABINDUDEVANAGARI SIGN CANDRABINDUDEVANAGARI SI" + - "GN ANUSVARADEVANAGARI SIGN VISARGADEVANAGARI LETTER SHORT ADEVANAGARI LE" + - "TTER ADEVANAGARI LETTER AADEVANAGARI LETTER IDEVANAGARI LETTER IIDEVANAG" + - "ARI LETTER UDEVANAGARI LETTER UUDEVANAGARI LETTER VOCALIC RDEVANAGARI LE" + - "TTER VOCALIC LDEVANAGARI LETTER CANDRA EDEVANAGARI LETTER SHORT EDEVANAG" + - "ARI LETTER EDEVANAGARI LETTER AIDEVANAGARI LETTER CANDRA ODEVANAGARI LET" + - "TER SHORT ODEVANAGARI LETTER ODEVANAGARI LETTER AUDEVANAGARI LETTER KADE" + - "VANAGARI LETTER KHADEVANAGARI LETTER GADEVANAGARI LETTER GHADEVANAGARI L" + - "ETTER NGADEVANAGARI LETTER CADEVANAGARI LETTER CHADEVANAGARI LETTER JADE" + - "VANAGARI LETTER JHADEVANAGARI LETTER NYADEVANAGARI LETTER TTADEVANAGARI " + - "LETTER TTHADEVANAGARI LETTER DDADEVANAGARI LETTER DDHADEVANAGARI LETTER " + - "NNADEVANAGARI LETTER TADEVANAGARI LETTER THADEVANAGARI LETTER DADEVANAGA" + - "RI LETTER DHADEVANAGARI LETTER NADEVANAGARI LETTER NNNADEVANAGARI LETTER" + - " PADEVANAGARI LETTER PHADEVANAGARI LETTER BADEVANAGARI LETTER BHADEVANAG" + - "ARI LETTER MADEVANAGARI LETTER YADEVANAGARI LETTER RADEVANAGARI LETTER R") + ("" + - "RADEVANAGARI LETTER LADEVANAGARI LETTER LLADEVANAGARI LETTER LLLADEVANAG" + - "ARI LETTER VADEVANAGARI LETTER SHADEVANAGARI LETTER SSADEVANAGARI LETTER" + - " SADEVANAGARI LETTER HADEVANAGARI VOWEL SIGN OEDEVANAGARI VOWEL SIGN OOE" + - "DEVANAGARI SIGN NUKTADEVANAGARI SIGN AVAGRAHADEVANAGARI VOWEL SIGN AADEV" + - "ANAGARI VOWEL SIGN IDEVANAGARI VOWEL SIGN IIDEVANAGARI VOWEL SIGN UDEVAN" + - "AGARI VOWEL SIGN UUDEVANAGARI VOWEL SIGN VOCALIC RDEVANAGARI VOWEL SIGN " + - "VOCALIC RRDEVANAGARI VOWEL SIGN CANDRA EDEVANAGARI VOWEL SIGN SHORT EDEV" + - "ANAGARI VOWEL SIGN EDEVANAGARI VOWEL SIGN AIDEVANAGARI VOWEL SIGN CANDRA" + - " ODEVANAGARI VOWEL SIGN SHORT ODEVANAGARI VOWEL SIGN ODEVANAGARI VOWEL S" + - "IGN AUDEVANAGARI SIGN VIRAMADEVANAGARI VOWEL SIGN PRISHTHAMATRA EDEVANAG" + - "ARI VOWEL SIGN AWDEVANAGARI OMDEVANAGARI STRESS SIGN UDATTADEVANAGARI ST" + - "RESS SIGN ANUDATTADEVANAGARI GRAVE ACCENTDEVANAGARI ACUTE ACCENTDEVANAGA" + - "RI VOWEL SIGN CANDRA LONG EDEVANAGARI VOWEL SIGN UEDEVANAGARI VOWEL SIGN" + - " UUEDEVANAGARI LETTER QADEVANAGARI LETTER KHHADEVANAGARI LETTER GHHADEVA" + - "NAGARI LETTER ZADEVANAGARI LETTER DDDHADEVANAGARI LETTER RHADEVANAGARI L" + - "ETTER FADEVANAGARI LETTER YYADEVANAGARI LETTER VOCALIC RRDEVANAGARI LETT" + - "ER VOCALIC LLDEVANAGARI VOWEL SIGN VOCALIC LDEVANAGARI VOWEL SIGN VOCALI" + - "C LLDEVANAGARI DANDADEVANAGARI DOUBLE DANDADEVANAGARI DIGIT ZERODEVANAGA" + - "RI DIGIT ONEDEVANAGARI DIGIT TWODEVANAGARI DIGIT THREEDEVANAGARI DIGIT F" + - "OURDEVANAGARI DIGIT FIVEDEVANAGARI DIGIT SIXDEVANAGARI DIGIT SEVENDEVANA" + - "GARI DIGIT EIGHTDEVANAGARI DIGIT NINEDEVANAGARI ABBREVIATION SIGNDEVANAG" + - "ARI SIGN HIGH SPACING DOTDEVANAGARI LETTER CANDRA ADEVANAGARI LETTER OED" + - "EVANAGARI LETTER OOEDEVANAGARI LETTER AWDEVANAGARI LETTER UEDEVANAGARI L" + - "ETTER UUEDEVANAGARI LETTER MARWARI DDADEVANAGARI LETTER ZHADEVANAGARI LE" + - "TTER HEAVY YADEVANAGARI LETTER GGADEVANAGARI LETTER JJADEVANAGARI LETTER" + - " GLOTTAL STOPDEVANAGARI LETTER DDDADEVANAGARI LETTER BBABENGALI ANJIBENG" + - "ALI SIGN CANDRABINDUBENGALI SIGN ANUSVARABENGALI SIGN VISARGABENGALI LET" + - "TER ABENGALI LETTER AABENGALI LETTER IBENGALI LETTER IIBENGALI LETTER UB" + - "ENGALI LETTER UUBENGALI LETTER VOCALIC RBENGALI LETTER VOCALIC LBENGALI " + - "LETTER EBENGALI LETTER AIBENGALI LETTER OBENGALI LETTER AUBENGALI LETTER" + - " KABENGALI LETTER KHABENGALI LETTER GABENGALI LETTER GHABENGALI LETTER N" + - "GABENGALI LETTER CABENGALI LETTER CHABENGALI LETTER JABENGALI LETTER JHA" + - "BENGALI LETTER NYABENGALI LETTER TTABENGALI LETTER TTHABENGALI LETTER DD" + - "ABENGALI LETTER DDHABENGALI LETTER NNABENGALI LETTER TABENGALI LETTER TH" + - "ABENGALI LETTER DABENGALI LETTER DHABENGALI LETTER NABENGALI LETTER PABE" + - "NGALI LETTER PHABENGALI LETTER BABENGALI LETTER BHABENGALI LETTER MABENG" + - "ALI LETTER YABENGALI LETTER RABENGALI LETTER LABENGALI LETTER SHABENGALI" + - " LETTER SSABENGALI LETTER SABENGALI LETTER HABENGALI SIGN NUKTABENGALI S" + - "IGN AVAGRAHABENGALI VOWEL SIGN AABENGALI VOWEL SIGN IBENGALI VOWEL SIGN " + - "IIBENGALI VOWEL SIGN UBENGALI VOWEL SIGN UUBENGALI VOWEL SIGN VOCALIC RB" + - "ENGALI VOWEL SIGN VOCALIC RRBENGALI VOWEL SIGN EBENGALI VOWEL SIGN AIBEN" + - "GALI VOWEL SIGN OBENGALI VOWEL SIGN AUBENGALI SIGN VIRAMABENGALI LETTER " + - "KHANDA TABENGALI AU LENGTH MARKBENGALI LETTER RRABENGALI LETTER RHABENGA" + - "LI LETTER YYABENGALI LETTER VOCALIC RRBENGALI LETTER VOCALIC LLBENGALI V" + - "OWEL SIGN VOCALIC LBENGALI VOWEL SIGN VOCALIC LLBENGALI DIGIT ZEROBENGAL" + - "I DIGIT ONEBENGALI DIGIT TWOBENGALI DIGIT THREEBENGALI DIGIT FOURBENGALI" + - " DIGIT FIVEBENGALI DIGIT SIXBENGALI DIGIT SEVENBENGALI DIGIT EIGHTBENGAL" + - "I DIGIT NINEBENGALI LETTER RA WITH MIDDLE DIAGONALBENGALI LETTER RA WITH" + - " LOWER DIAGONALBENGALI RUPEE MARKBENGALI RUPEE SIGNBENGALI CURRENCY NUME" + - "RATOR ONEBENGALI CURRENCY NUMERATOR TWOBENGALI CURRENCY NUMERATOR THREEB" + - "ENGALI CURRENCY NUMERATOR FOURBENGALI CURRENCY NUMERATOR ONE LESS THAN T" + - "HE DENOMINATORBENGALI CURRENCY DENOMINATOR SIXTEENBENGALI ISSHARBENGALI " + - "GANDA MARKGURMUKHI SIGN ADAK BINDIGURMUKHI SIGN BINDIGURMUKHI SIGN VISAR" + - "GAGURMUKHI LETTER AGURMUKHI LETTER AAGURMUKHI LETTER IGURMUKHI LETTER II" + - "GURMUKHI LETTER UGURMUKHI LETTER UUGURMUKHI LETTER EEGURMUKHI LETTER AIG" + - "URMUKHI LETTER OOGURMUKHI LETTER AUGURMUKHI LETTER KAGURMUKHI LETTER KHA" + - "GURMUKHI LETTER GAGURMUKHI LETTER GHAGURMUKHI LETTER NGAGURMUKHI LETTER " + - "CAGURMUKHI LETTER CHAGURMUKHI LETTER JAGURMUKHI LETTER JHAGURMUKHI LETTE" + - "R NYAGURMUKHI LETTER TTAGURMUKHI LETTER TTHAGURMUKHI LETTER DDAGURMUKHI " + - "LETTER DDHAGURMUKHI LETTER NNAGURMUKHI LETTER TAGURMUKHI LETTER THAGURMU" + - "KHI LETTER DAGURMUKHI LETTER DHAGURMUKHI LETTER NAGURMUKHI LETTER PAGURM" + - "UKHI LETTER PHAGURMUKHI LETTER BAGURMUKHI LETTER BHAGURMUKHI LETTER MAGU" + - "RMUKHI LETTER YAGURMUKHI LETTER RAGURMUKHI LETTER LAGURMUKHI LETTER LLAG" + - "URMUKHI LETTER VAGURMUKHI LETTER SHAGURMUKHI LETTER SAGURMUKHI LETTER HA") + ("" + - "GURMUKHI SIGN NUKTAGURMUKHI VOWEL SIGN AAGURMUKHI VOWEL SIGN IGURMUKHI V" + - "OWEL SIGN IIGURMUKHI VOWEL SIGN UGURMUKHI VOWEL SIGN UUGURMUKHI VOWEL SI" + - "GN EEGURMUKHI VOWEL SIGN AIGURMUKHI VOWEL SIGN OOGURMUKHI VOWEL SIGN AUG" + - "URMUKHI SIGN VIRAMAGURMUKHI SIGN UDAATGURMUKHI LETTER KHHAGURMUKHI LETTE" + - "R GHHAGURMUKHI LETTER ZAGURMUKHI LETTER RRAGURMUKHI LETTER FAGURMUKHI DI" + - "GIT ZEROGURMUKHI DIGIT ONEGURMUKHI DIGIT TWOGURMUKHI DIGIT THREEGURMUKHI" + - " DIGIT FOURGURMUKHI DIGIT FIVEGURMUKHI DIGIT SIXGURMUKHI DIGIT SEVENGURM" + - "UKHI DIGIT EIGHTGURMUKHI DIGIT NINEGURMUKHI TIPPIGURMUKHI ADDAKGURMUKHI " + - "IRIGURMUKHI URAGURMUKHI EK ONKARGURMUKHI SIGN YAKASHGUJARATI SIGN CANDRA" + - "BINDUGUJARATI SIGN ANUSVARAGUJARATI SIGN VISARGAGUJARATI LETTER AGUJARAT" + - "I LETTER AAGUJARATI LETTER IGUJARATI LETTER IIGUJARATI LETTER UGUJARATI " + - "LETTER UUGUJARATI LETTER VOCALIC RGUJARATI LETTER VOCALIC LGUJARATI VOWE" + - "L CANDRA EGUJARATI LETTER EGUJARATI LETTER AIGUJARATI VOWEL CANDRA OGUJA" + - "RATI LETTER OGUJARATI LETTER AUGUJARATI LETTER KAGUJARATI LETTER KHAGUJA" + - "RATI LETTER GAGUJARATI LETTER GHAGUJARATI LETTER NGAGUJARATI LETTER CAGU" + - "JARATI LETTER CHAGUJARATI LETTER JAGUJARATI LETTER JHAGUJARATI LETTER NY" + - "AGUJARATI LETTER TTAGUJARATI LETTER TTHAGUJARATI LETTER DDAGUJARATI LETT" + - "ER DDHAGUJARATI LETTER NNAGUJARATI LETTER TAGUJARATI LETTER THAGUJARATI " + - "LETTER DAGUJARATI LETTER DHAGUJARATI LETTER NAGUJARATI LETTER PAGUJARATI" + - " LETTER PHAGUJARATI LETTER BAGUJARATI LETTER BHAGUJARATI LETTER MAGUJARA" + - "TI LETTER YAGUJARATI LETTER RAGUJARATI LETTER LAGUJARATI LETTER LLAGUJAR" + - "ATI LETTER VAGUJARATI LETTER SHAGUJARATI LETTER SSAGUJARATI LETTER SAGUJ" + - "ARATI LETTER HAGUJARATI SIGN NUKTAGUJARATI SIGN AVAGRAHAGUJARATI VOWEL S" + - "IGN AAGUJARATI VOWEL SIGN IGUJARATI VOWEL SIGN IIGUJARATI VOWEL SIGN UGU" + - "JARATI VOWEL SIGN UUGUJARATI VOWEL SIGN VOCALIC RGUJARATI VOWEL SIGN VOC" + - "ALIC RRGUJARATI VOWEL SIGN CANDRA EGUJARATI VOWEL SIGN EGUJARATI VOWEL S" + - "IGN AIGUJARATI VOWEL SIGN CANDRA OGUJARATI VOWEL SIGN OGUJARATI VOWEL SI" + - "GN AUGUJARATI SIGN VIRAMAGUJARATI OMGUJARATI LETTER VOCALIC RRGUJARATI L" + - "ETTER VOCALIC LLGUJARATI VOWEL SIGN VOCALIC LGUJARATI VOWEL SIGN VOCALIC" + - " LLGUJARATI DIGIT ZEROGUJARATI DIGIT ONEGUJARATI DIGIT TWOGUJARATI DIGIT" + - " THREEGUJARATI DIGIT FOURGUJARATI DIGIT FIVEGUJARATI DIGIT SIXGUJARATI D" + - "IGIT SEVENGUJARATI DIGIT EIGHTGUJARATI DIGIT NINEGUJARATI ABBREVIATION S" + - "IGNGUJARATI RUPEE SIGNGUJARATI LETTER ZHAORIYA SIGN CANDRABINDUORIYA SIG" + - "N ANUSVARAORIYA SIGN VISARGAORIYA LETTER AORIYA LETTER AAORIYA LETTER IO" + - "RIYA LETTER IIORIYA LETTER UORIYA LETTER UUORIYA LETTER VOCALIC RORIYA L" + - "ETTER VOCALIC LORIYA LETTER EORIYA LETTER AIORIYA LETTER OORIYA LETTER A" + - "UORIYA LETTER KAORIYA LETTER KHAORIYA LETTER GAORIYA LETTER GHAORIYA LET" + - "TER NGAORIYA LETTER CAORIYA LETTER CHAORIYA LETTER JAORIYA LETTER JHAORI" + - "YA LETTER NYAORIYA LETTER TTAORIYA LETTER TTHAORIYA LETTER DDAORIYA LETT" + - "ER DDHAORIYA LETTER NNAORIYA LETTER TAORIYA LETTER THAORIYA LETTER DAORI" + - "YA LETTER DHAORIYA LETTER NAORIYA LETTER PAORIYA LETTER PHAORIYA LETTER " + - "BAORIYA LETTER BHAORIYA LETTER MAORIYA LETTER YAORIYA LETTER RAORIYA LET" + - "TER LAORIYA LETTER LLAORIYA LETTER VAORIYA LETTER SHAORIYA LETTER SSAORI" + - "YA LETTER SAORIYA LETTER HAORIYA SIGN NUKTAORIYA SIGN AVAGRAHAORIYA VOWE" + - "L SIGN AAORIYA VOWEL SIGN IORIYA VOWEL SIGN IIORIYA VOWEL SIGN UORIYA VO" + - "WEL SIGN UUORIYA VOWEL SIGN VOCALIC RORIYA VOWEL SIGN VOCALIC RRORIYA VO" + - "WEL SIGN EORIYA VOWEL SIGN AIORIYA VOWEL SIGN OORIYA VOWEL SIGN AUORIYA " + - "SIGN VIRAMAORIYA AI LENGTH MARKORIYA AU LENGTH MARKORIYA LETTER RRAORIYA" + - " LETTER RHAORIYA LETTER YYAORIYA LETTER VOCALIC RRORIYA LETTER VOCALIC L" + - "LORIYA VOWEL SIGN VOCALIC LORIYA VOWEL SIGN VOCALIC LLORIYA DIGIT ZEROOR" + - "IYA DIGIT ONEORIYA DIGIT TWOORIYA DIGIT THREEORIYA DIGIT FOURORIYA DIGIT" + - " FIVEORIYA DIGIT SIXORIYA DIGIT SEVENORIYA DIGIT EIGHTORIYA DIGIT NINEOR" + - "IYA ISSHARORIYA LETTER WAORIYA FRACTION ONE QUARTERORIYA FRACTION ONE HA" + - "LFORIYA FRACTION THREE QUARTERSORIYA FRACTION ONE SIXTEENTHORIYA FRACTIO" + - "N ONE EIGHTHORIYA FRACTION THREE SIXTEENTHSTAMIL SIGN ANUSVARATAMIL SIGN" + - " VISARGATAMIL LETTER ATAMIL LETTER AATAMIL LETTER ITAMIL LETTER IITAMIL " + - "LETTER UTAMIL LETTER UUTAMIL LETTER ETAMIL LETTER EETAMIL LETTER AITAMIL" + - " LETTER OTAMIL LETTER OOTAMIL LETTER AUTAMIL LETTER KATAMIL LETTER NGATA" + - "MIL LETTER CATAMIL LETTER JATAMIL LETTER NYATAMIL LETTER TTATAMIL LETTER" + - " NNATAMIL LETTER TATAMIL LETTER NATAMIL LETTER NNNATAMIL LETTER PATAMIL " + - "LETTER MATAMIL LETTER YATAMIL LETTER RATAMIL LETTER RRATAMIL LETTER LATA" + - "MIL LETTER LLATAMIL LETTER LLLATAMIL LETTER VATAMIL LETTER SHATAMIL LETT" + - "ER SSATAMIL LETTER SATAMIL LETTER HATAMIL VOWEL SIGN AATAMIL VOWEL SIGN " + - "ITAMIL VOWEL SIGN IITAMIL VOWEL SIGN UTAMIL VOWEL SIGN UUTAMIL VOWEL SIG") + ("" + - "N ETAMIL VOWEL SIGN EETAMIL VOWEL SIGN AITAMIL VOWEL SIGN OTAMIL VOWEL S" + - "IGN OOTAMIL VOWEL SIGN AUTAMIL SIGN VIRAMATAMIL OMTAMIL AU LENGTH MARKTA" + - "MIL DIGIT ZEROTAMIL DIGIT ONETAMIL DIGIT TWOTAMIL DIGIT THREETAMIL DIGIT" + - " FOURTAMIL DIGIT FIVETAMIL DIGIT SIXTAMIL DIGIT SEVENTAMIL DIGIT EIGHTTA" + - "MIL DIGIT NINETAMIL NUMBER TENTAMIL NUMBER ONE HUNDREDTAMIL NUMBER ONE T" + - "HOUSANDTAMIL DAY SIGNTAMIL MONTH SIGNTAMIL YEAR SIGNTAMIL DEBIT SIGNTAMI" + - "L CREDIT SIGNTAMIL AS ABOVE SIGNTAMIL RUPEE SIGNTAMIL NUMBER SIGNTELUGU " + - "SIGN COMBINING CANDRABINDU ABOVETELUGU SIGN CANDRABINDUTELUGU SIGN ANUSV" + - "ARATELUGU SIGN VISARGATELUGU LETTER ATELUGU LETTER AATELUGU LETTER ITELU" + - "GU LETTER IITELUGU LETTER UTELUGU LETTER UUTELUGU LETTER VOCALIC RTELUGU" + - " LETTER VOCALIC LTELUGU LETTER ETELUGU LETTER EETELUGU LETTER AITELUGU L" + - "ETTER OTELUGU LETTER OOTELUGU LETTER AUTELUGU LETTER KATELUGU LETTER KHA" + - "TELUGU LETTER GATELUGU LETTER GHATELUGU LETTER NGATELUGU LETTER CATELUGU" + - " LETTER CHATELUGU LETTER JATELUGU LETTER JHATELUGU LETTER NYATELUGU LETT" + - "ER TTATELUGU LETTER TTHATELUGU LETTER DDATELUGU LETTER DDHATELUGU LETTER" + - " NNATELUGU LETTER TATELUGU LETTER THATELUGU LETTER DATELUGU LETTER DHATE" + - "LUGU LETTER NATELUGU LETTER PATELUGU LETTER PHATELUGU LETTER BATELUGU LE" + - "TTER BHATELUGU LETTER MATELUGU LETTER YATELUGU LETTER RATELUGU LETTER RR" + - "ATELUGU LETTER LATELUGU LETTER LLATELUGU LETTER LLLATELUGU LETTER VATELU" + - "GU LETTER SHATELUGU LETTER SSATELUGU LETTER SATELUGU LETTER HATELUGU SIG" + - "N AVAGRAHATELUGU VOWEL SIGN AATELUGU VOWEL SIGN ITELUGU VOWEL SIGN IITEL" + - "UGU VOWEL SIGN UTELUGU VOWEL SIGN UUTELUGU VOWEL SIGN VOCALIC RTELUGU VO" + - "WEL SIGN VOCALIC RRTELUGU VOWEL SIGN ETELUGU VOWEL SIGN EETELUGU VOWEL S" + - "IGN AITELUGU VOWEL SIGN OTELUGU VOWEL SIGN OOTELUGU VOWEL SIGN AUTELUGU " + - "SIGN VIRAMATELUGU LENGTH MARKTELUGU AI LENGTH MARKTELUGU LETTER TSATELUG" + - "U LETTER DZATELUGU LETTER RRRATELUGU LETTER VOCALIC RRTELUGU LETTER VOCA" + - "LIC LLTELUGU VOWEL SIGN VOCALIC LTELUGU VOWEL SIGN VOCALIC LLTELUGU DIGI" + - "T ZEROTELUGU DIGIT ONETELUGU DIGIT TWOTELUGU DIGIT THREETELUGU DIGIT FOU" + - "RTELUGU DIGIT FIVETELUGU DIGIT SIXTELUGU DIGIT SEVENTELUGU DIGIT EIGHTTE" + - "LUGU DIGIT NINETELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOURTELUGU F" + - "RACTION DIGIT ONE FOR ODD POWERS OF FOURTELUGU FRACTION DIGIT TWO FOR OD" + - "D POWERS OF FOURTELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOURTELUGU" + - " FRACTION DIGIT ONE FOR EVEN POWERS OF FOURTELUGU FRACTION DIGIT TWO FOR" + - " EVEN POWERS OF FOURTELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOURT" + - "ELUGU SIGN TUUMUKANNADA SIGN SPACING CANDRABINDUKANNADA SIGN CANDRABINDU" + - "KANNADA SIGN ANUSVARAKANNADA SIGN VISARGAKANNADA LETTER AKANNADA LETTER " + - "AAKANNADA LETTER IKANNADA LETTER IIKANNADA LETTER UKANNADA LETTER UUKANN" + - "ADA LETTER VOCALIC RKANNADA LETTER VOCALIC LKANNADA LETTER EKANNADA LETT" + - "ER EEKANNADA LETTER AIKANNADA LETTER OKANNADA LETTER OOKANNADA LETTER AU" + - "KANNADA LETTER KAKANNADA LETTER KHAKANNADA LETTER GAKANNADA LETTER GHAKA" + - "NNADA LETTER NGAKANNADA LETTER CAKANNADA LETTER CHAKANNADA LETTER JAKANN" + - "ADA LETTER JHAKANNADA LETTER NYAKANNADA LETTER TTAKANNADA LETTER TTHAKAN" + - "NADA LETTER DDAKANNADA LETTER DDHAKANNADA LETTER NNAKANNADA LETTER TAKAN" + - "NADA LETTER THAKANNADA LETTER DAKANNADA LETTER DHAKANNADA LETTER NAKANNA" + - "DA LETTER PAKANNADA LETTER PHAKANNADA LETTER BAKANNADA LETTER BHAKANNADA" + - " LETTER MAKANNADA LETTER YAKANNADA LETTER RAKANNADA LETTER RRAKANNADA LE" + - "TTER LAKANNADA LETTER LLAKANNADA LETTER VAKANNADA LETTER SHAKANNADA LETT" + - "ER SSAKANNADA LETTER SAKANNADA LETTER HAKANNADA SIGN NUKTAKANNADA SIGN A" + - "VAGRAHAKANNADA VOWEL SIGN AAKANNADA VOWEL SIGN IKANNADA VOWEL SIGN IIKAN" + - "NADA VOWEL SIGN UKANNADA VOWEL SIGN UUKANNADA VOWEL SIGN VOCALIC RKANNAD" + - "A VOWEL SIGN VOCALIC RRKANNADA VOWEL SIGN EKANNADA VOWEL SIGN EEKANNADA " + - "VOWEL SIGN AIKANNADA VOWEL SIGN OKANNADA VOWEL SIGN OOKANNADA VOWEL SIGN" + - " AUKANNADA SIGN VIRAMAKANNADA LENGTH MARKKANNADA AI LENGTH MARKKANNADA L" + - "ETTER FAKANNADA LETTER VOCALIC RRKANNADA LETTER VOCALIC LLKANNADA VOWEL " + - "SIGN VOCALIC LKANNADA VOWEL SIGN VOCALIC LLKANNADA DIGIT ZEROKANNADA DIG" + - "IT ONEKANNADA DIGIT TWOKANNADA DIGIT THREEKANNADA DIGIT FOURKANNADA DIGI" + - "T FIVEKANNADA DIGIT SIXKANNADA DIGIT SEVENKANNADA DIGIT EIGHTKANNADA DIG" + - "IT NINEKANNADA SIGN JIHVAMULIYAKANNADA SIGN UPADHMANIYAMALAYALAM SIGN CA" + - "NDRABINDUMALAYALAM SIGN ANUSVARAMALAYALAM SIGN VISARGAMALAYALAM LETTER A" + - "MALAYALAM LETTER AAMALAYALAM LETTER IMALAYALAM LETTER IIMALAYALAM LETTER" + - " UMALAYALAM LETTER UUMALAYALAM LETTER VOCALIC RMALAYALAM LETTER VOCALIC " + - "LMALAYALAM LETTER EMALAYALAM LETTER EEMALAYALAM LETTER AIMALAYALAM LETTE" + - "R OMALAYALAM LETTER OOMALAYALAM LETTER AUMALAYALAM LETTER KAMALAYALAM LE" + - "TTER KHAMALAYALAM LETTER GAMALAYALAM LETTER GHAMALAYALAM LETTER NGAMALAY") + ("" + - "ALAM LETTER CAMALAYALAM LETTER CHAMALAYALAM LETTER JAMALAYALAM LETTER JH" + - "AMALAYALAM LETTER NYAMALAYALAM LETTER TTAMALAYALAM LETTER TTHAMALAYALAM " + - "LETTER DDAMALAYALAM LETTER DDHAMALAYALAM LETTER NNAMALAYALAM LETTER TAMA" + - "LAYALAM LETTER THAMALAYALAM LETTER DAMALAYALAM LETTER DHAMALAYALAM LETTE" + - "R NAMALAYALAM LETTER NNNAMALAYALAM LETTER PAMALAYALAM LETTER PHAMALAYALA" + - "M LETTER BAMALAYALAM LETTER BHAMALAYALAM LETTER MAMALAYALAM LETTER YAMAL" + - "AYALAM LETTER RAMALAYALAM LETTER RRAMALAYALAM LETTER LAMALAYALAM LETTER " + - "LLAMALAYALAM LETTER LLLAMALAYALAM LETTER VAMALAYALAM LETTER SHAMALAYALAM" + - " LETTER SSAMALAYALAM LETTER SAMALAYALAM LETTER HAMALAYALAM LETTER TTTAMA" + - "LAYALAM SIGN AVAGRAHAMALAYALAM VOWEL SIGN AAMALAYALAM VOWEL SIGN IMALAYA" + - "LAM VOWEL SIGN IIMALAYALAM VOWEL SIGN UMALAYALAM VOWEL SIGN UUMALAYALAM " + - "VOWEL SIGN VOCALIC RMALAYALAM VOWEL SIGN VOCALIC RRMALAYALAM VOWEL SIGN " + - "EMALAYALAM VOWEL SIGN EEMALAYALAM VOWEL SIGN AIMALAYALAM VOWEL SIGN OMAL" + - "AYALAM VOWEL SIGN OOMALAYALAM VOWEL SIGN AUMALAYALAM SIGN VIRAMAMALAYALA" + - "M LETTER DOT REPHMALAYALAM SIGN PARAMALAYALAM LETTER CHILLU MMALAYALAM L" + - "ETTER CHILLU YMALAYALAM LETTER CHILLU LLLMALAYALAM AU LENGTH MARKMALAYAL" + - "AM FRACTION ONE ONE-HUNDRED-AND-SIXTIETHMALAYALAM FRACTION ONE FORTIETHM" + - "ALAYALAM FRACTION THREE EIGHTIETHSMALAYALAM FRACTION ONE TWENTIETHMALAYA" + - "LAM FRACTION ONE TENTHMALAYALAM FRACTION THREE TWENTIETHSMALAYALAM FRACT" + - "ION ONE FIFTHMALAYALAM LETTER ARCHAIC IIMALAYALAM LETTER VOCALIC RRMALAY" + - "ALAM LETTER VOCALIC LLMALAYALAM VOWEL SIGN VOCALIC LMALAYALAM VOWEL SIGN" + - " VOCALIC LLMALAYALAM DIGIT ZEROMALAYALAM DIGIT ONEMALAYALAM DIGIT TWOMAL" + - "AYALAM DIGIT THREEMALAYALAM DIGIT FOURMALAYALAM DIGIT FIVEMALAYALAM DIGI" + - "T SIXMALAYALAM DIGIT SEVENMALAYALAM DIGIT EIGHTMALAYALAM DIGIT NINEMALAY" + - "ALAM NUMBER TENMALAYALAM NUMBER ONE HUNDREDMALAYALAM NUMBER ONE THOUSAND" + - "MALAYALAM FRACTION ONE QUARTERMALAYALAM FRACTION ONE HALFMALAYALAM FRACT" + - "ION THREE QUARTERSMALAYALAM FRACTION ONE SIXTEENTHMALAYALAM FRACTION ONE" + - " EIGHTHMALAYALAM FRACTION THREE SIXTEENTHSMALAYALAM DATE MARKMALAYALAM L" + - "ETTER CHILLU NNMALAYALAM LETTER CHILLU NMALAYALAM LETTER CHILLU RRMALAYA" + - "LAM LETTER CHILLU LMALAYALAM LETTER CHILLU LLMALAYALAM LETTER CHILLU KSI" + - "NHALA SIGN ANUSVARAYASINHALA SIGN VISARGAYASINHALA LETTER AYANNASINHALA " + - "LETTER AAYANNASINHALA LETTER AEYANNASINHALA LETTER AEEYANNASINHALA LETTE" + - "R IYANNASINHALA LETTER IIYANNASINHALA LETTER UYANNASINHALA LETTER UUYANN" + - "ASINHALA LETTER IRUYANNASINHALA LETTER IRUUYANNASINHALA LETTER ILUYANNAS" + - "INHALA LETTER ILUUYANNASINHALA LETTER EYANNASINHALA LETTER EEYANNASINHAL" + - "A LETTER AIYANNASINHALA LETTER OYANNASINHALA LETTER OOYANNASINHALA LETTE" + - "R AUYANNASINHALA LETTER ALPAPRAANA KAYANNASINHALA LETTER MAHAAPRAANA KAY" + - "ANNASINHALA LETTER ALPAPRAANA GAYANNASINHALA LETTER MAHAAPRAANA GAYANNAS" + - "INHALA LETTER KANTAJA NAASIKYAYASINHALA LETTER SANYAKA GAYANNASINHALA LE" + - "TTER ALPAPRAANA CAYANNASINHALA LETTER MAHAAPRAANA CAYANNASINHALA LETTER " + - "ALPAPRAANA JAYANNASINHALA LETTER MAHAAPRAANA JAYANNASINHALA LETTER TAALU" + - "JA NAASIKYAYASINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYASINHALA LETTER S" + - "ANYAKA JAYANNASINHALA LETTER ALPAPRAANA TTAYANNASINHALA LETTER MAHAAPRAA" + - "NA TTAYANNASINHALA LETTER ALPAPRAANA DDAYANNASINHALA LETTER MAHAAPRAANA " + - "DDAYANNASINHALA LETTER MUURDHAJA NAYANNASINHALA LETTER SANYAKA DDAYANNAS" + - "INHALA LETTER ALPAPRAANA TAYANNASINHALA LETTER MAHAAPRAANA TAYANNASINHAL" + - "A LETTER ALPAPRAANA DAYANNASINHALA LETTER MAHAAPRAANA DAYANNASINHALA LET" + - "TER DANTAJA NAYANNASINHALA LETTER SANYAKA DAYANNASINHALA LETTER ALPAPRAA" + - "NA PAYANNASINHALA LETTER MAHAAPRAANA PAYANNASINHALA LETTER ALPAPRAANA BA" + - "YANNASINHALA LETTER MAHAAPRAANA BAYANNASINHALA LETTER MAYANNASINHALA LET" + - "TER AMBA BAYANNASINHALA LETTER YAYANNASINHALA LETTER RAYANNASINHALA LETT" + - "ER DANTAJA LAYANNASINHALA LETTER VAYANNASINHALA LETTER TAALUJA SAYANNASI" + - "NHALA LETTER MUURDHAJA SAYANNASINHALA LETTER DANTAJA SAYANNASINHALA LETT" + - "ER HAYANNASINHALA LETTER MUURDHAJA LAYANNASINHALA LETTER FAYANNASINHALA " + - "SIGN AL-LAKUNASINHALA VOWEL SIGN AELA-PILLASINHALA VOWEL SIGN KETTI AEDA" + - "-PILLASINHALA VOWEL SIGN DIGA AEDA-PILLASINHALA VOWEL SIGN KETTI IS-PILL" + - "ASINHALA VOWEL SIGN DIGA IS-PILLASINHALA VOWEL SIGN KETTI PAA-PILLASINHA" + - "LA VOWEL SIGN DIGA PAA-PILLASINHALA VOWEL SIGN GAETTA-PILLASINHALA VOWEL" + - " SIGN KOMBUVASINHALA VOWEL SIGN DIGA KOMBUVASINHALA VOWEL SIGN KOMBU DEK" + - "ASINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLASINHALA VOWEL SIGN KOMBUVA HAA" + - " DIGA AELA-PILLASINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTASINHALA VOWEL " + - "SIGN GAYANUKITTASINHALA LITH DIGIT ZEROSINHALA LITH DIGIT ONESINHALA LIT" + - "H DIGIT TWOSINHALA LITH DIGIT THREESINHALA LITH DIGIT FOURSINHALA LITH D" + - "IGIT FIVESINHALA LITH DIGIT SIXSINHALA LITH DIGIT SEVENSINHALA LITH DIGI") + ("" + - "T EIGHTSINHALA LITH DIGIT NINESINHALA VOWEL SIGN DIGA GAETTA-PILLASINHAL" + - "A VOWEL SIGN DIGA GAYANUKITTASINHALA PUNCTUATION KUNDDALIYATHAI CHARACTE" + - "R KO KAITHAI CHARACTER KHO KHAITHAI CHARACTER KHO KHUATTHAI CHARACTER KH" + - "O KHWAITHAI CHARACTER KHO KHONTHAI CHARACTER KHO RAKHANGTHAI CHARACTER N" + - "GO NGUTHAI CHARACTER CHO CHANTHAI CHARACTER CHO CHINGTHAI CHARACTER CHO " + - "CHANGTHAI CHARACTER SO SOTHAI CHARACTER CHO CHOETHAI CHARACTER YO YINGTH" + - "AI CHARACTER DO CHADATHAI CHARACTER TO PATAKTHAI CHARACTER THO THANTHAI " + - "CHARACTER THO NANGMONTHOTHAI CHARACTER THO PHUTHAOTHAI CHARACTER NO NENT" + - "HAI CHARACTER DO DEKTHAI CHARACTER TO TAOTHAI CHARACTER THO THUNGTHAI CH" + - "ARACTER THO THAHANTHAI CHARACTER THO THONGTHAI CHARACTER NO NUTHAI CHARA" + - "CTER BO BAIMAITHAI CHARACTER PO PLATHAI CHARACTER PHO PHUNGTHAI CHARACTE" + - "R FO FATHAI CHARACTER PHO PHANTHAI CHARACTER FO FANTHAI CHARACTER PHO SA" + - "MPHAOTHAI CHARACTER MO MATHAI CHARACTER YO YAKTHAI CHARACTER RO RUATHAI " + - "CHARACTER RUTHAI CHARACTER LO LINGTHAI CHARACTER LUTHAI CHARACTER WO WAE" + - "NTHAI CHARACTER SO SALATHAI CHARACTER SO RUSITHAI CHARACTER SO SUATHAI C" + - "HARACTER HO HIPTHAI CHARACTER LO CHULATHAI CHARACTER O ANGTHAI CHARACTER" + - " HO NOKHUKTHAI CHARACTER PAIYANNOITHAI CHARACTER SARA ATHAI CHARACTER MA" + - "I HAN-AKATTHAI CHARACTER SARA AATHAI CHARACTER SARA AMTHAI CHARACTER SAR" + - "A ITHAI CHARACTER SARA IITHAI CHARACTER SARA UETHAI CHARACTER SARA UEETH" + - "AI CHARACTER SARA UTHAI CHARACTER SARA UUTHAI CHARACTER PHINTHUTHAI CURR" + - "ENCY SYMBOL BAHTTHAI CHARACTER SARA ETHAI CHARACTER SARA AETHAI CHARACTE" + - "R SARA OTHAI CHARACTER SARA AI MAIMUANTHAI CHARACTER SARA AI MAIMALAITHA" + - "I CHARACTER LAKKHANGYAOTHAI CHARACTER MAIYAMOKTHAI CHARACTER MAITAIKHUTH" + - "AI CHARACTER MAI EKTHAI CHARACTER MAI THOTHAI CHARACTER MAI TRITHAI CHAR" + - "ACTER MAI CHATTAWATHAI CHARACTER THANTHAKHATTHAI CHARACTER NIKHAHITTHAI " + - "CHARACTER YAMAKKANTHAI CHARACTER FONGMANTHAI DIGIT ZEROTHAI DIGIT ONETHA" + - "I DIGIT TWOTHAI DIGIT THREETHAI DIGIT FOURTHAI DIGIT FIVETHAI DIGIT SIXT" + - "HAI DIGIT SEVENTHAI DIGIT EIGHTTHAI DIGIT NINETHAI CHARACTER ANGKHANKHUT" + - "HAI CHARACTER KHOMUTLAO LETTER KOLAO LETTER KHO SUNGLAO LETTER KHO TAMLA" + - "O LETTER NGOLAO LETTER COLAO LETTER SO TAMLAO LETTER NYOLAO LETTER DOLAO" + - " LETTER TOLAO LETTER THO SUNGLAO LETTER THO TAMLAO LETTER NOLAO LETTER B" + - "OLAO LETTER POLAO LETTER PHO SUNGLAO LETTER FO TAMLAO LETTER PHO TAMLAO " + - "LETTER FO SUNGLAO LETTER MOLAO LETTER YOLAO LETTER LO LINGLAO LETTER LO " + - "LOOTLAO LETTER WOLAO LETTER SO SUNGLAO LETTER HO SUNGLAO LETTER OLAO LET" + - "TER HO TAMLAO ELLIPSISLAO VOWEL SIGN ALAO VOWEL SIGN MAI KANLAO VOWEL SI" + - "GN AALAO VOWEL SIGN AMLAO VOWEL SIGN ILAO VOWEL SIGN IILAO VOWEL SIGN YL" + - "AO VOWEL SIGN YYLAO VOWEL SIGN ULAO VOWEL SIGN UULAO VOWEL SIGN MAI KONL" + - "AO SEMIVOWEL SIGN LOLAO SEMIVOWEL SIGN NYOLAO VOWEL SIGN ELAO VOWEL SIGN" + - " EILAO VOWEL SIGN OLAO VOWEL SIGN AYLAO VOWEL SIGN AILAO KO LALAO TONE M" + - "AI EKLAO TONE MAI THOLAO TONE MAI TILAO TONE MAI CATAWALAO CANCELLATION " + - "MARKLAO NIGGAHITALAO DIGIT ZEROLAO DIGIT ONELAO DIGIT TWOLAO DIGIT THREE" + - "LAO DIGIT FOURLAO DIGIT FIVELAO DIGIT SIXLAO DIGIT SEVENLAO DIGIT EIGHTL" + - "AO DIGIT NINELAO HO NOLAO HO MOLAO LETTER KHMU GOLAO LETTER KHMU NYOTIBE" + - "TAN SYLLABLE OMTIBETAN MARK GTER YIG MGO TRUNCATED ATIBETAN MARK GTER YI" + - "G MGO -UM RNAM BCAD MATIBETAN MARK GTER YIG MGO -UM GTER TSHEG MATIBETAN" + - " MARK INITIAL YIG MGO MDUN MATIBETAN MARK CLOSING YIG MGO SGAB MATIBETAN" + - " MARK CARET YIG MGO PHUR SHAD MATIBETAN MARK YIG MGO TSHEG SHAD MATIBETA" + - "N MARK SBRUL SHADTIBETAN MARK BSKUR YIG MGOTIBETAN MARK BKA- SHOG YIG MG" + - "OTIBETAN MARK INTERSYLLABIC TSHEGTIBETAN MARK DELIMITER TSHEG BSTARTIBET" + - "AN MARK SHADTIBETAN MARK NYIS SHADTIBETAN MARK TSHEG SHADTIBETAN MARK NY" + - "IS TSHEG SHADTIBETAN MARK RIN CHEN SPUNGS SHADTIBETAN MARK RGYA GRAM SHA" + - "DTIBETAN MARK CARET -DZUD RTAGS ME LONG CANTIBETAN MARK GTER TSHEGTIBETA" + - "N LOGOTYPE SIGN CHAD RTAGSTIBETAN LOGOTYPE SIGN LHAG RTAGSTIBETAN ASTROL" + - "OGICAL SIGN SGRA GCAN -CHAR RTAGSTIBETAN ASTROLOGICAL SIGN -KHYUD PATIBE" + - "TAN ASTROLOGICAL SIGN SDONG TSHUGSTIBETAN SIGN RDEL DKAR GCIGTIBETAN SIG" + - "N RDEL DKAR GNYISTIBETAN SIGN RDEL DKAR GSUMTIBETAN SIGN RDEL NAG GCIGTI" + - "BETAN SIGN RDEL NAG GNYISTIBETAN SIGN RDEL DKAR RDEL NAGTIBETAN DIGIT ZE" + - "ROTIBETAN DIGIT ONETIBETAN DIGIT TWOTIBETAN DIGIT THREETIBETAN DIGIT FOU" + - "RTIBETAN DIGIT FIVETIBETAN DIGIT SIXTIBETAN DIGIT SEVENTIBETAN DIGIT EIG" + - "HTTIBETAN DIGIT NINETIBETAN DIGIT HALF ONETIBETAN DIGIT HALF TWOTIBETAN " + - "DIGIT HALF THREETIBETAN DIGIT HALF FOURTIBETAN DIGIT HALF FIVETIBETAN DI" + - "GIT HALF SIXTIBETAN DIGIT HALF SEVENTIBETAN DIGIT HALF EIGHTTIBETAN DIGI" + - "T HALF NINETIBETAN DIGIT HALF ZEROTIBETAN MARK BSDUS RTAGSTIBETAN MARK N" + - "GAS BZUNG NYI ZLATIBETAN MARK CARET -DZUD RTAGS BZHI MIG CANTIBETAN MARK") + ("" + - " NGAS BZUNG SGOR RTAGSTIBETAN MARK CHE MGOTIBETAN MARK TSA -PHRUTIBETAN " + - "MARK GUG RTAGS GYONTIBETAN MARK GUG RTAGS GYASTIBETAN MARK ANG KHANG GYO" + - "NTIBETAN MARK ANG KHANG GYASTIBETAN SIGN YAR TSHESTIBETAN SIGN MAR TSHES" + - "TIBETAN LETTER KATIBETAN LETTER KHATIBETAN LETTER GATIBETAN LETTER GHATI" + - "BETAN LETTER NGATIBETAN LETTER CATIBETAN LETTER CHATIBETAN LETTER JATIBE" + - "TAN LETTER NYATIBETAN LETTER TTATIBETAN LETTER TTHATIBETAN LETTER DDATIB" + - "ETAN LETTER DDHATIBETAN LETTER NNATIBETAN LETTER TATIBETAN LETTER THATIB" + - "ETAN LETTER DATIBETAN LETTER DHATIBETAN LETTER NATIBETAN LETTER PATIBETA" + - "N LETTER PHATIBETAN LETTER BATIBETAN LETTER BHATIBETAN LETTER MATIBETAN " + - "LETTER TSATIBETAN LETTER TSHATIBETAN LETTER DZATIBETAN LETTER DZHATIBETA" + - "N LETTER WATIBETAN LETTER ZHATIBETAN LETTER ZATIBETAN LETTER -ATIBETAN L" + - "ETTER YATIBETAN LETTER RATIBETAN LETTER LATIBETAN LETTER SHATIBETAN LETT" + - "ER SSATIBETAN LETTER SATIBETAN LETTER HATIBETAN LETTER ATIBETAN LETTER K" + - "SSATIBETAN LETTER FIXED-FORM RATIBETAN LETTER KKATIBETAN LETTER RRATIBET" + - "AN VOWEL SIGN AATIBETAN VOWEL SIGN ITIBETAN VOWEL SIGN IITIBETAN VOWEL S" + - "IGN UTIBETAN VOWEL SIGN UUTIBETAN VOWEL SIGN VOCALIC RTIBETAN VOWEL SIGN" + - " VOCALIC RRTIBETAN VOWEL SIGN VOCALIC LTIBETAN VOWEL SIGN VOCALIC LLTIBE" + - "TAN VOWEL SIGN ETIBETAN VOWEL SIGN EETIBETAN VOWEL SIGN OTIBETAN VOWEL S" + - "IGN OOTIBETAN SIGN RJES SU NGA ROTIBETAN SIGN RNAM BCADTIBETAN VOWEL SIG" + - "N REVERSED ITIBETAN VOWEL SIGN REVERSED IITIBETAN SIGN NYI ZLA NAA DATIB" + - "ETAN SIGN SNA LDANTIBETAN MARK HALANTATIBETAN MARK PALUTATIBETAN SIGN LC" + - "I RTAGSTIBETAN SIGN YANG RTAGSTIBETAN SIGN LCE TSA CANTIBETAN SIGN MCHU " + - "CANTIBETAN SIGN GRU CAN RGYINGSTIBETAN SIGN GRU MED RGYINGSTIBETAN SIGN " + - "INVERTED MCHU CANTIBETAN SUBJOINED SIGN LCE TSA CANTIBETAN SUBJOINED SIG" + - "N MCHU CANTIBETAN SUBJOINED SIGN INVERTED MCHU CANTIBETAN SUBJOINED LETT" + - "ER KATIBETAN SUBJOINED LETTER KHATIBETAN SUBJOINED LETTER GATIBETAN SUBJ" + - "OINED LETTER GHATIBETAN SUBJOINED LETTER NGATIBETAN SUBJOINED LETTER CAT" + - "IBETAN SUBJOINED LETTER CHATIBETAN SUBJOINED LETTER JATIBETAN SUBJOINED " + - "LETTER NYATIBETAN SUBJOINED LETTER TTATIBETAN SUBJOINED LETTER TTHATIBET" + - "AN SUBJOINED LETTER DDATIBETAN SUBJOINED LETTER DDHATIBETAN SUBJOINED LE" + - "TTER NNATIBETAN SUBJOINED LETTER TATIBETAN SUBJOINED LETTER THATIBETAN S" + - "UBJOINED LETTER DATIBETAN SUBJOINED LETTER DHATIBETAN SUBJOINED LETTER N" + - "ATIBETAN SUBJOINED LETTER PATIBETAN SUBJOINED LETTER PHATIBETAN SUBJOINE" + - "D LETTER BATIBETAN SUBJOINED LETTER BHATIBETAN SUBJOINED LETTER MATIBETA" + - "N SUBJOINED LETTER TSATIBETAN SUBJOINED LETTER TSHATIBETAN SUBJOINED LET" + - "TER DZATIBETAN SUBJOINED LETTER DZHATIBETAN SUBJOINED LETTER WATIBETAN S" + - "UBJOINED LETTER ZHATIBETAN SUBJOINED LETTER ZATIBETAN SUBJOINED LETTER -" + - "ATIBETAN SUBJOINED LETTER YATIBETAN SUBJOINED LETTER RATIBETAN SUBJOINED" + - " LETTER LATIBETAN SUBJOINED LETTER SHATIBETAN SUBJOINED LETTER SSATIBETA" + - "N SUBJOINED LETTER SATIBETAN SUBJOINED LETTER HATIBETAN SUBJOINED LETTER" + - " ATIBETAN SUBJOINED LETTER KSSATIBETAN SUBJOINED LETTER FIXED-FORM WATIB" + - "ETAN SUBJOINED LETTER FIXED-FORM YATIBETAN SUBJOINED LETTER FIXED-FORM R" + - "ATIBETAN KU RU KHATIBETAN KU RU KHA BZHI MIG CANTIBETAN CANTILLATION SIG" + - "N HEAVY BEATTIBETAN CANTILLATION SIGN LIGHT BEATTIBETAN CANTILLATION SIG" + - "N CANG TE-UTIBETAN CANTILLATION SIGN SBUB -CHALTIBETAN SYMBOL DRIL BUTIB" + - "ETAN SYMBOL RDO RJETIBETAN SYMBOL PADMA GDANTIBETAN SYMBOL RDO RJE RGYA " + - "GRAMTIBETAN SYMBOL PHUR PATIBETAN SYMBOL NOR BUTIBETAN SYMBOL NOR BU NYI" + - "S -KHYILTIBETAN SYMBOL NOR BU GSUM -KHYILTIBETAN SYMBOL NOR BU BZHI -KHY" + - "ILTIBETAN SIGN RDEL NAG RDEL DKARTIBETAN SIGN RDEL NAG GSUMTIBETAN MARK " + - "BSKA- SHOG GI MGO RGYANTIBETAN MARK MNYAM YIG GI MGO RGYANTIBETAN MARK N" + - "YIS TSHEGTIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MATIBETAN MARK CL" + - "OSING BRDA RNYING YIG MGO SGAB MARIGHT-FACING SVASTI SIGNLEFT-FACING SVA" + - "STI SIGNRIGHT-FACING SVASTI SIGN WITH DOTSLEFT-FACING SVASTI SIGN WITH D" + - "OTSTIBETAN MARK LEADING MCHAN RTAGSTIBETAN MARK TRAILING MCHAN RTAGSMYAN" + - "MAR LETTER KAMYANMAR LETTER KHAMYANMAR LETTER GAMYANMAR LETTER GHAMYANMA" + - "R LETTER NGAMYANMAR LETTER CAMYANMAR LETTER CHAMYANMAR LETTER JAMYANMAR " + - "LETTER JHAMYANMAR LETTER NYAMYANMAR LETTER NNYAMYANMAR LETTER TTAMYANMAR" + - " LETTER TTHAMYANMAR LETTER DDAMYANMAR LETTER DDHAMYANMAR LETTER NNAMYANM" + - "AR LETTER TAMYANMAR LETTER THAMYANMAR LETTER DAMYANMAR LETTER DHAMYANMAR" + - " LETTER NAMYANMAR LETTER PAMYANMAR LETTER PHAMYANMAR LETTER BAMYANMAR LE" + - "TTER BHAMYANMAR LETTER MAMYANMAR LETTER YAMYANMAR LETTER RAMYANMAR LETTE" + - "R LAMYANMAR LETTER WAMYANMAR LETTER SAMYANMAR LETTER HAMYANMAR LETTER LL" + - "AMYANMAR LETTER AMYANMAR LETTER SHAN AMYANMAR LETTER IMYANMAR LETTER IIM" + - "YANMAR LETTER UMYANMAR LETTER UUMYANMAR LETTER EMYANMAR LETTER MON EMYAN") + ("" + - "MAR LETTER OMYANMAR LETTER AUMYANMAR VOWEL SIGN TALL AAMYANMAR VOWEL SIG" + - "N AAMYANMAR VOWEL SIGN IMYANMAR VOWEL SIGN IIMYANMAR VOWEL SIGN UMYANMAR" + - " VOWEL SIGN UUMYANMAR VOWEL SIGN EMYANMAR VOWEL SIGN AIMYANMAR VOWEL SIG" + - "N MON IIMYANMAR VOWEL SIGN MON OMYANMAR VOWEL SIGN E ABOVEMYANMAR SIGN A" + - "NUSVARAMYANMAR SIGN DOT BELOWMYANMAR SIGN VISARGAMYANMAR SIGN VIRAMAMYAN" + - "MAR SIGN ASATMYANMAR CONSONANT SIGN MEDIAL YAMYANMAR CONSONANT SIGN MEDI" + - "AL RAMYANMAR CONSONANT SIGN MEDIAL WAMYANMAR CONSONANT SIGN MEDIAL HAMYA" + - "NMAR LETTER GREAT SAMYANMAR DIGIT ZEROMYANMAR DIGIT ONEMYANMAR DIGIT TWO" + - "MYANMAR DIGIT THREEMYANMAR DIGIT FOURMYANMAR DIGIT FIVEMYANMAR DIGIT SIX" + - "MYANMAR DIGIT SEVENMYANMAR DIGIT EIGHTMYANMAR DIGIT NINEMYANMAR SIGN LIT" + - "TLE SECTIONMYANMAR SIGN SECTIONMYANMAR SYMBOL LOCATIVEMYANMAR SYMBOL COM" + - "PLETEDMYANMAR SYMBOL AFOREMENTIONEDMYANMAR SYMBOL GENITIVEMYANMAR LETTER" + - " SHAMYANMAR LETTER SSAMYANMAR LETTER VOCALIC RMYANMAR LETTER VOCALIC RRM" + - "YANMAR LETTER VOCALIC LMYANMAR LETTER VOCALIC LLMYANMAR VOWEL SIGN VOCAL" + - "IC RMYANMAR VOWEL SIGN VOCALIC RRMYANMAR VOWEL SIGN VOCALIC LMYANMAR VOW" + - "EL SIGN VOCALIC LLMYANMAR LETTER MON NGAMYANMAR LETTER MON JHAMYANMAR LE" + - "TTER MON BBAMYANMAR LETTER MON BBEMYANMAR CONSONANT SIGN MON MEDIAL NAMY" + - "ANMAR CONSONANT SIGN MON MEDIAL MAMYANMAR CONSONANT SIGN MON MEDIAL LAMY" + - "ANMAR LETTER SGAW KAREN SHAMYANMAR VOWEL SIGN SGAW KAREN EUMYANMAR TONE " + - "MARK SGAW KAREN HATHIMYANMAR TONE MARK SGAW KAREN KE PHOMYANMAR LETTER W" + - "ESTERN PWO KAREN THAMYANMAR LETTER WESTERN PWO KAREN PWAMYANMAR VOWEL SI" + - "GN WESTERN PWO KAREN EUMYANMAR VOWEL SIGN WESTERN PWO KAREN UEMYANMAR SI" + - "GN WESTERN PWO KAREN TONE-1MYANMAR SIGN WESTERN PWO KAREN TONE-2MYANMAR " + - "SIGN WESTERN PWO KAREN TONE-3MYANMAR SIGN WESTERN PWO KAREN TONE-4MYANMA" + - "R SIGN WESTERN PWO KAREN TONE-5MYANMAR LETTER EASTERN PWO KAREN NNAMYANM" + - "AR LETTER EASTERN PWO KAREN YWAMYANMAR LETTER EASTERN PWO KAREN GHWAMYAN" + - "MAR VOWEL SIGN GEBA KAREN IMYANMAR VOWEL SIGN KAYAH OEMYANMAR VOWEL SIGN" + - " KAYAH UMYANMAR VOWEL SIGN KAYAH EEMYANMAR LETTER SHAN KAMYANMAR LETTER " + - "SHAN KHAMYANMAR LETTER SHAN GAMYANMAR LETTER SHAN CAMYANMAR LETTER SHAN " + - "ZAMYANMAR LETTER SHAN NYAMYANMAR LETTER SHAN DAMYANMAR LETTER SHAN NAMYA" + - "NMAR LETTER SHAN PHAMYANMAR LETTER SHAN FAMYANMAR LETTER SHAN BAMYANMAR " + - "LETTER SHAN THAMYANMAR LETTER SHAN HAMYANMAR CONSONANT SIGN SHAN MEDIAL " + - "WAMYANMAR VOWEL SIGN SHAN AAMYANMAR VOWEL SIGN SHAN EMYANMAR VOWEL SIGN " + - "SHAN E ABOVEMYANMAR VOWEL SIGN SHAN FINAL YMYANMAR SIGN SHAN TONE-2MYANM" + - "AR SIGN SHAN TONE-3MYANMAR SIGN SHAN TONE-5MYANMAR SIGN SHAN TONE-6MYANM" + - "AR SIGN SHAN COUNCIL TONE-2MYANMAR SIGN SHAN COUNCIL TONE-3MYANMAR SIGN " + - "SHAN COUNCIL EMPHATIC TONEMYANMAR LETTER RUMAI PALAUNG FAMYANMAR SIGN RU" + - "MAI PALAUNG TONE-5MYANMAR SHAN DIGIT ZEROMYANMAR SHAN DIGIT ONEMYANMAR S" + - "HAN DIGIT TWOMYANMAR SHAN DIGIT THREEMYANMAR SHAN DIGIT FOURMYANMAR SHAN" + - " DIGIT FIVEMYANMAR SHAN DIGIT SIXMYANMAR SHAN DIGIT SEVENMYANMAR SHAN DI" + - "GIT EIGHTMYANMAR SHAN DIGIT NINEMYANMAR SIGN KHAMTI TONE-1MYANMAR SIGN K" + - "HAMTI TONE-3MYANMAR VOWEL SIGN AITON AMYANMAR VOWEL SIGN AITON AIMYANMAR" + - " SYMBOL SHAN ONEMYANMAR SYMBOL SHAN EXCLAMATIONGEORGIAN CAPITAL LETTER A" + - "NGEORGIAN CAPITAL LETTER BANGEORGIAN CAPITAL LETTER GANGEORGIAN CAPITAL " + - "LETTER DONGEORGIAN CAPITAL LETTER ENGEORGIAN CAPITAL LETTER VINGEORGIAN " + - "CAPITAL LETTER ZENGEORGIAN CAPITAL LETTER TANGEORGIAN CAPITAL LETTER ING" + - "EORGIAN CAPITAL LETTER KANGEORGIAN CAPITAL LETTER LASGEORGIAN CAPITAL LE" + - "TTER MANGEORGIAN CAPITAL LETTER NARGEORGIAN CAPITAL LETTER ONGEORGIAN CA" + - "PITAL LETTER PARGEORGIAN CAPITAL LETTER ZHARGEORGIAN CAPITAL LETTER RAEG" + - "EORGIAN CAPITAL LETTER SANGEORGIAN CAPITAL LETTER TARGEORGIAN CAPITAL LE" + - "TTER UNGEORGIAN CAPITAL LETTER PHARGEORGIAN CAPITAL LETTER KHARGEORGIAN " + - "CAPITAL LETTER GHANGEORGIAN CAPITAL LETTER QARGEORGIAN CAPITAL LETTER SH" + - "INGEORGIAN CAPITAL LETTER CHINGEORGIAN CAPITAL LETTER CANGEORGIAN CAPITA" + - "L LETTER JILGEORGIAN CAPITAL LETTER CILGEORGIAN CAPITAL LETTER CHARGEORG" + - "IAN CAPITAL LETTER XANGEORGIAN CAPITAL LETTER JHANGEORGIAN CAPITAL LETTE" + - "R HAEGEORGIAN CAPITAL LETTER HEGEORGIAN CAPITAL LETTER HIEGEORGIAN CAPIT" + - "AL LETTER WEGEORGIAN CAPITAL LETTER HARGEORGIAN CAPITAL LETTER HOEGEORGI" + - "AN CAPITAL LETTER YNGEORGIAN CAPITAL LETTER AENGEORGIAN LETTER ANGEORGIA" + - "N LETTER BANGEORGIAN LETTER GANGEORGIAN LETTER DONGEORGIAN LETTER ENGEOR" + - "GIAN LETTER VINGEORGIAN LETTER ZENGEORGIAN LETTER TANGEORGIAN LETTER ING" + - "EORGIAN LETTER KANGEORGIAN LETTER LASGEORGIAN LETTER MANGEORGIAN LETTER " + - "NARGEORGIAN LETTER ONGEORGIAN LETTER PARGEORGIAN LETTER ZHARGEORGIAN LET" + - "TER RAEGEORGIAN LETTER SANGEORGIAN LETTER TARGEORGIAN LETTER UNGEORGIAN " + - "LETTER PHARGEORGIAN LETTER KHARGEORGIAN LETTER GHANGEORGIAN LETTER QARGE") + ("" + - "ORGIAN LETTER SHINGEORGIAN LETTER CHINGEORGIAN LETTER CANGEORGIAN LETTER" + - " JILGEORGIAN LETTER CILGEORGIAN LETTER CHARGEORGIAN LETTER XANGEORGIAN L" + - "ETTER JHANGEORGIAN LETTER HAEGEORGIAN LETTER HEGEORGIAN LETTER HIEGEORGI" + - "AN LETTER WEGEORGIAN LETTER HARGEORGIAN LETTER HOEGEORGIAN LETTER FIGEOR" + - "GIAN LETTER YNGEORGIAN LETTER ELIFIGEORGIAN LETTER TURNED GANGEORGIAN LE" + - "TTER AINGEORGIAN PARAGRAPH SEPARATORMODIFIER LETTER GEORGIAN NARGEORGIAN" + - " LETTER AENGEORGIAN LETTER HARD SIGNGEORGIAN LETTER LABIAL SIGNHANGUL CH" + - "OSEONG KIYEOKHANGUL CHOSEONG SSANGKIYEOKHANGUL CHOSEONG NIEUNHANGUL CHOS" + - "EONG TIKEUTHANGUL CHOSEONG SSANGTIKEUTHANGUL CHOSEONG RIEULHANGUL CHOSEO" + - "NG MIEUMHANGUL CHOSEONG PIEUPHANGUL CHOSEONG SSANGPIEUPHANGUL CHOSEONG S" + - "IOSHANGUL CHOSEONG SSANGSIOSHANGUL CHOSEONG IEUNGHANGUL CHOSEONG CIEUCHA" + - "NGUL CHOSEONG SSANGCIEUCHANGUL CHOSEONG CHIEUCHHANGUL CHOSEONG KHIEUKHHA" + - "NGUL CHOSEONG THIEUTHHANGUL CHOSEONG PHIEUPHHANGUL CHOSEONG HIEUHHANGUL " + - "CHOSEONG NIEUN-KIYEOKHANGUL CHOSEONG SSANGNIEUNHANGUL CHOSEONG NIEUN-TIK" + - "EUTHANGUL CHOSEONG NIEUN-PIEUPHANGUL CHOSEONG TIKEUT-KIYEOKHANGUL CHOSEO" + - "NG RIEUL-NIEUNHANGUL CHOSEONG SSANGRIEULHANGUL CHOSEONG RIEUL-HIEUHHANGU" + - "L CHOSEONG KAPYEOUNRIEULHANGUL CHOSEONG MIEUM-PIEUPHANGUL CHOSEONG KAPYE" + - "OUNMIEUMHANGUL CHOSEONG PIEUP-KIYEOKHANGUL CHOSEONG PIEUP-NIEUNHANGUL CH" + - "OSEONG PIEUP-TIKEUTHANGUL CHOSEONG PIEUP-SIOSHANGUL CHOSEONG PIEUP-SIOS-" + - "KIYEOKHANGUL CHOSEONG PIEUP-SIOS-TIKEUTHANGUL CHOSEONG PIEUP-SIOS-PIEUPH" + - "ANGUL CHOSEONG PIEUP-SSANGSIOSHANGUL CHOSEONG PIEUP-SIOS-CIEUCHANGUL CHO" + - "SEONG PIEUP-CIEUCHANGUL CHOSEONG PIEUP-CHIEUCHHANGUL CHOSEONG PIEUP-THIE" + - "UTHHANGUL CHOSEONG PIEUP-PHIEUPHHANGUL CHOSEONG KAPYEOUNPIEUPHANGUL CHOS" + - "EONG KAPYEOUNSSANGPIEUPHANGUL CHOSEONG SIOS-KIYEOKHANGUL CHOSEONG SIOS-N" + - "IEUNHANGUL CHOSEONG SIOS-TIKEUTHANGUL CHOSEONG SIOS-RIEULHANGUL CHOSEONG" + - " SIOS-MIEUMHANGUL CHOSEONG SIOS-PIEUPHANGUL CHOSEONG SIOS-PIEUP-KIYEOKHA" + - "NGUL CHOSEONG SIOS-SSANGSIOSHANGUL CHOSEONG SIOS-IEUNGHANGUL CHOSEONG SI" + - "OS-CIEUCHANGUL CHOSEONG SIOS-CHIEUCHHANGUL CHOSEONG SIOS-KHIEUKHHANGUL C" + - "HOSEONG SIOS-THIEUTHHANGUL CHOSEONG SIOS-PHIEUPHHANGUL CHOSEONG SIOS-HIE" + - "UHHANGUL CHOSEONG CHITUEUMSIOSHANGUL CHOSEONG CHITUEUMSSANGSIOSHANGUL CH" + - "OSEONG CEONGCHIEUMSIOSHANGUL CHOSEONG CEONGCHIEUMSSANGSIOSHANGUL CHOSEON" + - "G PANSIOSHANGUL CHOSEONG IEUNG-KIYEOKHANGUL CHOSEONG IEUNG-TIKEUTHANGUL " + - "CHOSEONG IEUNG-MIEUMHANGUL CHOSEONG IEUNG-PIEUPHANGUL CHOSEONG IEUNG-SIO" + - "SHANGUL CHOSEONG IEUNG-PANSIOSHANGUL CHOSEONG SSANGIEUNGHANGUL CHOSEONG " + - "IEUNG-CIEUCHANGUL CHOSEONG IEUNG-CHIEUCHHANGUL CHOSEONG IEUNG-THIEUTHHAN" + - "GUL CHOSEONG IEUNG-PHIEUPHHANGUL CHOSEONG YESIEUNGHANGUL CHOSEONG CIEUC-" + - "IEUNGHANGUL CHOSEONG CHITUEUMCIEUCHANGUL CHOSEONG CHITUEUMSSANGCIEUCHANG" + - "UL CHOSEONG CEONGCHIEUMCIEUCHANGUL CHOSEONG CEONGCHIEUMSSANGCIEUCHANGUL " + - "CHOSEONG CHIEUCH-KHIEUKHHANGUL CHOSEONG CHIEUCH-HIEUHHANGUL CHOSEONG CHI" + - "TUEUMCHIEUCHHANGUL CHOSEONG CEONGCHIEUMCHIEUCHHANGUL CHOSEONG PHIEUPH-PI" + - "EUPHANGUL CHOSEONG KAPYEOUNPHIEUPHHANGUL CHOSEONG SSANGHIEUHHANGUL CHOSE" + - "ONG YEORINHIEUHHANGUL CHOSEONG KIYEOK-TIKEUTHANGUL CHOSEONG NIEUN-SIOSHA" + - "NGUL CHOSEONG NIEUN-CIEUCHANGUL CHOSEONG NIEUN-HIEUHHANGUL CHOSEONG TIKE" + - "UT-RIEULHANGUL CHOSEONG FILLERHANGUL JUNGSEONG FILLERHANGUL JUNGSEONG AH" + - "ANGUL JUNGSEONG AEHANGUL JUNGSEONG YAHANGUL JUNGSEONG YAEHANGUL JUNGSEON" + - "G EOHANGUL JUNGSEONG EHANGUL JUNGSEONG YEOHANGUL JUNGSEONG YEHANGUL JUNG" + - "SEONG OHANGUL JUNGSEONG WAHANGUL JUNGSEONG WAEHANGUL JUNGSEONG OEHANGUL " + - "JUNGSEONG YOHANGUL JUNGSEONG UHANGUL JUNGSEONG WEOHANGUL JUNGSEONG WEHAN" + - "GUL JUNGSEONG WIHANGUL JUNGSEONG YUHANGUL JUNGSEONG EUHANGUL JUNGSEONG Y" + - "IHANGUL JUNGSEONG IHANGUL JUNGSEONG A-OHANGUL JUNGSEONG A-UHANGUL JUNGSE" + - "ONG YA-OHANGUL JUNGSEONG YA-YOHANGUL JUNGSEONG EO-OHANGUL JUNGSEONG EO-U" + - "HANGUL JUNGSEONG EO-EUHANGUL JUNGSEONG YEO-OHANGUL JUNGSEONG YEO-UHANGUL" + - " JUNGSEONG O-EOHANGUL JUNGSEONG O-EHANGUL JUNGSEONG O-YEHANGUL JUNGSEONG" + - " O-OHANGUL JUNGSEONG O-UHANGUL JUNGSEONG YO-YAHANGUL JUNGSEONG YO-YAEHAN" + - "GUL JUNGSEONG YO-YEOHANGUL JUNGSEONG YO-OHANGUL JUNGSEONG YO-IHANGUL JUN" + - "GSEONG U-AHANGUL JUNGSEONG U-AEHANGUL JUNGSEONG U-EO-EUHANGUL JUNGSEONG " + - "U-YEHANGUL JUNGSEONG U-UHANGUL JUNGSEONG YU-AHANGUL JUNGSEONG YU-EOHANGU" + - "L JUNGSEONG YU-EHANGUL JUNGSEONG YU-YEOHANGUL JUNGSEONG YU-YEHANGUL JUNG" + - "SEONG YU-UHANGUL JUNGSEONG YU-IHANGUL JUNGSEONG EU-UHANGUL JUNGSEONG EU-" + - "EUHANGUL JUNGSEONG YI-UHANGUL JUNGSEONG I-AHANGUL JUNGSEONG I-YAHANGUL J" + - "UNGSEONG I-OHANGUL JUNGSEONG I-UHANGUL JUNGSEONG I-EUHANGUL JUNGSEONG I-" + - "ARAEAHANGUL JUNGSEONG ARAEAHANGUL JUNGSEONG ARAEA-EOHANGUL JUNGSEONG ARA" + - "EA-UHANGUL JUNGSEONG ARAEA-IHANGUL JUNGSEONG SSANGARAEAHANGUL JUNGSEONG " + - "A-EUHANGUL JUNGSEONG YA-UHANGUL JUNGSEONG YEO-YAHANGUL JUNGSEONG O-YAHAN") + ("" + - "GUL JUNGSEONG O-YAEHANGUL JONGSEONG KIYEOKHANGUL JONGSEONG SSANGKIYEOKHA" + - "NGUL JONGSEONG KIYEOK-SIOSHANGUL JONGSEONG NIEUNHANGUL JONGSEONG NIEUN-C" + - "IEUCHANGUL JONGSEONG NIEUN-HIEUHHANGUL JONGSEONG TIKEUTHANGUL JONGSEONG " + - "RIEULHANGUL JONGSEONG RIEUL-KIYEOKHANGUL JONGSEONG RIEUL-MIEUMHANGUL JON" + - "GSEONG RIEUL-PIEUPHANGUL JONGSEONG RIEUL-SIOSHANGUL JONGSEONG RIEUL-THIE" + - "UTHHANGUL JONGSEONG RIEUL-PHIEUPHHANGUL JONGSEONG RIEUL-HIEUHHANGUL JONG" + - "SEONG MIEUMHANGUL JONGSEONG PIEUPHANGUL JONGSEONG PIEUP-SIOSHANGUL JONGS" + - "EONG SIOSHANGUL JONGSEONG SSANGSIOSHANGUL JONGSEONG IEUNGHANGUL JONGSEON" + - "G CIEUCHANGUL JONGSEONG CHIEUCHHANGUL JONGSEONG KHIEUKHHANGUL JONGSEONG " + - "THIEUTHHANGUL JONGSEONG PHIEUPHHANGUL JONGSEONG HIEUHHANGUL JONGSEONG KI" + - "YEOK-RIEULHANGUL JONGSEONG KIYEOK-SIOS-KIYEOKHANGUL JONGSEONG NIEUN-KIYE" + - "OKHANGUL JONGSEONG NIEUN-TIKEUTHANGUL JONGSEONG NIEUN-SIOSHANGUL JONGSEO" + - "NG NIEUN-PANSIOSHANGUL JONGSEONG NIEUN-THIEUTHHANGUL JONGSEONG TIKEUT-KI" + - "YEOKHANGUL JONGSEONG TIKEUT-RIEULHANGUL JONGSEONG RIEUL-KIYEOK-SIOSHANGU" + - "L JONGSEONG RIEUL-NIEUNHANGUL JONGSEONG RIEUL-TIKEUTHANGUL JONGSEONG RIE" + - "UL-TIKEUT-HIEUHHANGUL JONGSEONG SSANGRIEULHANGUL JONGSEONG RIEUL-MIEUM-K" + - "IYEOKHANGUL JONGSEONG RIEUL-MIEUM-SIOSHANGUL JONGSEONG RIEUL-PIEUP-SIOSH" + - "ANGUL JONGSEONG RIEUL-PIEUP-HIEUHHANGUL JONGSEONG RIEUL-KAPYEOUNPIEUPHAN" + - "GUL JONGSEONG RIEUL-SSANGSIOSHANGUL JONGSEONG RIEUL-PANSIOSHANGUL JONGSE" + - "ONG RIEUL-KHIEUKHHANGUL JONGSEONG RIEUL-YEORINHIEUHHANGUL JONGSEONG MIEU" + - "M-KIYEOKHANGUL JONGSEONG MIEUM-RIEULHANGUL JONGSEONG MIEUM-PIEUPHANGUL J" + - "ONGSEONG MIEUM-SIOSHANGUL JONGSEONG MIEUM-SSANGSIOSHANGUL JONGSEONG MIEU" + - "M-PANSIOSHANGUL JONGSEONG MIEUM-CHIEUCHHANGUL JONGSEONG MIEUM-HIEUHHANGU" + - "L JONGSEONG KAPYEOUNMIEUMHANGUL JONGSEONG PIEUP-RIEULHANGUL JONGSEONG PI" + - "EUP-PHIEUPHHANGUL JONGSEONG PIEUP-HIEUHHANGUL JONGSEONG KAPYEOUNPIEUPHAN" + - "GUL JONGSEONG SIOS-KIYEOKHANGUL JONGSEONG SIOS-TIKEUTHANGUL JONGSEONG SI" + - "OS-RIEULHANGUL JONGSEONG SIOS-PIEUPHANGUL JONGSEONG PANSIOSHANGUL JONGSE" + - "ONG IEUNG-KIYEOKHANGUL JONGSEONG IEUNG-SSANGKIYEOKHANGUL JONGSEONG SSANG" + - "IEUNGHANGUL JONGSEONG IEUNG-KHIEUKHHANGUL JONGSEONG YESIEUNGHANGUL JONGS" + - "EONG YESIEUNG-SIOSHANGUL JONGSEONG YESIEUNG-PANSIOSHANGUL JONGSEONG PHIE" + - "UPH-PIEUPHANGUL JONGSEONG KAPYEOUNPHIEUPHHANGUL JONGSEONG HIEUH-NIEUNHAN" + - "GUL JONGSEONG HIEUH-RIEULHANGUL JONGSEONG HIEUH-MIEUMHANGUL JONGSEONG HI" + - "EUH-PIEUPHANGUL JONGSEONG YEORINHIEUHHANGUL JONGSEONG KIYEOK-NIEUNHANGUL" + - " JONGSEONG KIYEOK-PIEUPHANGUL JONGSEONG KIYEOK-CHIEUCHHANGUL JONGSEONG K" + - "IYEOK-KHIEUKHHANGUL JONGSEONG KIYEOK-HIEUHHANGUL JONGSEONG SSANGNIEUNETH" + - "IOPIC SYLLABLE HAETHIOPIC SYLLABLE HUETHIOPIC SYLLABLE HIETHIOPIC SYLLAB" + - "LE HAAETHIOPIC SYLLABLE HEEETHIOPIC SYLLABLE HEETHIOPIC SYLLABLE HOETHIO" + - "PIC SYLLABLE HOAETHIOPIC SYLLABLE LAETHIOPIC SYLLABLE LUETHIOPIC SYLLABL" + - "E LIETHIOPIC SYLLABLE LAAETHIOPIC SYLLABLE LEEETHIOPIC SYLLABLE LEETHIOP" + - "IC SYLLABLE LOETHIOPIC SYLLABLE LWAETHIOPIC SYLLABLE HHAETHIOPIC SYLLABL" + - "E HHUETHIOPIC SYLLABLE HHIETHIOPIC SYLLABLE HHAAETHIOPIC SYLLABLE HHEEET" + - "HIOPIC SYLLABLE HHEETHIOPIC SYLLABLE HHOETHIOPIC SYLLABLE HHWAETHIOPIC S" + - "YLLABLE MAETHIOPIC SYLLABLE MUETHIOPIC SYLLABLE MIETHIOPIC SYLLABLE MAAE" + - "THIOPIC SYLLABLE MEEETHIOPIC SYLLABLE MEETHIOPIC SYLLABLE MOETHIOPIC SYL" + - "LABLE MWAETHIOPIC SYLLABLE SZAETHIOPIC SYLLABLE SZUETHIOPIC SYLLABLE SZI" + - "ETHIOPIC SYLLABLE SZAAETHIOPIC SYLLABLE SZEEETHIOPIC SYLLABLE SZEETHIOPI" + - "C SYLLABLE SZOETHIOPIC SYLLABLE SZWAETHIOPIC SYLLABLE RAETHIOPIC SYLLABL" + - "E RUETHIOPIC SYLLABLE RIETHIOPIC SYLLABLE RAAETHIOPIC SYLLABLE REEETHIOP" + - "IC SYLLABLE REETHIOPIC SYLLABLE ROETHIOPIC SYLLABLE RWAETHIOPIC SYLLABLE" + - " SAETHIOPIC SYLLABLE SUETHIOPIC SYLLABLE SIETHIOPIC SYLLABLE SAAETHIOPIC" + - " SYLLABLE SEEETHIOPIC SYLLABLE SEETHIOPIC SYLLABLE SOETHIOPIC SYLLABLE S" + - "WAETHIOPIC SYLLABLE SHAETHIOPIC SYLLABLE SHUETHIOPIC SYLLABLE SHIETHIOPI" + - "C SYLLABLE SHAAETHIOPIC SYLLABLE SHEEETHIOPIC SYLLABLE SHEETHIOPIC SYLLA" + - "BLE SHOETHIOPIC SYLLABLE SHWAETHIOPIC SYLLABLE QAETHIOPIC SYLLABLE QUETH" + - "IOPIC SYLLABLE QIETHIOPIC SYLLABLE QAAETHIOPIC SYLLABLE QEEETHIOPIC SYLL" + - "ABLE QEETHIOPIC SYLLABLE QOETHIOPIC SYLLABLE QOAETHIOPIC SYLLABLE QWAETH" + - "IOPIC SYLLABLE QWIETHIOPIC SYLLABLE QWAAETHIOPIC SYLLABLE QWEEETHIOPIC S" + - "YLLABLE QWEETHIOPIC SYLLABLE QHAETHIOPIC SYLLABLE QHUETHIOPIC SYLLABLE Q" + - "HIETHIOPIC SYLLABLE QHAAETHIOPIC SYLLABLE QHEEETHIOPIC SYLLABLE QHEETHIO" + - "PIC SYLLABLE QHOETHIOPIC SYLLABLE QHWAETHIOPIC SYLLABLE QHWIETHIOPIC SYL" + - "LABLE QHWAAETHIOPIC SYLLABLE QHWEEETHIOPIC SYLLABLE QHWEETHIOPIC SYLLABL" + - "E BAETHIOPIC SYLLABLE BUETHIOPIC SYLLABLE BIETHIOPIC SYLLABLE BAAETHIOPI" + - "C SYLLABLE BEEETHIOPIC SYLLABLE BEETHIOPIC SYLLABLE BOETHIOPIC SYLLABLE " + - "BWAETHIOPIC SYLLABLE VAETHIOPIC SYLLABLE VUETHIOPIC SYLLABLE VIETHIOPIC ") + ("" + - "SYLLABLE VAAETHIOPIC SYLLABLE VEEETHIOPIC SYLLABLE VEETHIOPIC SYLLABLE V" + - "OETHIOPIC SYLLABLE VWAETHIOPIC SYLLABLE TAETHIOPIC SYLLABLE TUETHIOPIC S" + - "YLLABLE TIETHIOPIC SYLLABLE TAAETHIOPIC SYLLABLE TEEETHIOPIC SYLLABLE TE" + - "ETHIOPIC SYLLABLE TOETHIOPIC SYLLABLE TWAETHIOPIC SYLLABLE CAETHIOPIC SY" + - "LLABLE CUETHIOPIC SYLLABLE CIETHIOPIC SYLLABLE CAAETHIOPIC SYLLABLE CEEE" + - "THIOPIC SYLLABLE CEETHIOPIC SYLLABLE COETHIOPIC SYLLABLE CWAETHIOPIC SYL" + - "LABLE XAETHIOPIC SYLLABLE XUETHIOPIC SYLLABLE XIETHIOPIC SYLLABLE XAAETH" + - "IOPIC SYLLABLE XEEETHIOPIC SYLLABLE XEETHIOPIC SYLLABLE XOETHIOPIC SYLLA" + - "BLE XOAETHIOPIC SYLLABLE XWAETHIOPIC SYLLABLE XWIETHIOPIC SYLLABLE XWAAE" + - "THIOPIC SYLLABLE XWEEETHIOPIC SYLLABLE XWEETHIOPIC SYLLABLE NAETHIOPIC S" + - "YLLABLE NUETHIOPIC SYLLABLE NIETHIOPIC SYLLABLE NAAETHIOPIC SYLLABLE NEE" + - "ETHIOPIC SYLLABLE NEETHIOPIC SYLLABLE NOETHIOPIC SYLLABLE NWAETHIOPIC SY" + - "LLABLE NYAETHIOPIC SYLLABLE NYUETHIOPIC SYLLABLE NYIETHIOPIC SYLLABLE NY" + - "AAETHIOPIC SYLLABLE NYEEETHIOPIC SYLLABLE NYEETHIOPIC SYLLABLE NYOETHIOP" + - "IC SYLLABLE NYWAETHIOPIC SYLLABLE GLOTTAL AETHIOPIC SYLLABLE GLOTTAL UET" + - "HIOPIC SYLLABLE GLOTTAL IETHIOPIC SYLLABLE GLOTTAL AAETHIOPIC SYLLABLE G" + - "LOTTAL EEETHIOPIC SYLLABLE GLOTTAL EETHIOPIC SYLLABLE GLOTTAL OETHIOPIC " + - "SYLLABLE GLOTTAL WAETHIOPIC SYLLABLE KAETHIOPIC SYLLABLE KUETHIOPIC SYLL" + - "ABLE KIETHIOPIC SYLLABLE KAAETHIOPIC SYLLABLE KEEETHIOPIC SYLLABLE KEETH" + - "IOPIC SYLLABLE KOETHIOPIC SYLLABLE KOAETHIOPIC SYLLABLE KWAETHIOPIC SYLL" + - "ABLE KWIETHIOPIC SYLLABLE KWAAETHIOPIC SYLLABLE KWEEETHIOPIC SYLLABLE KW" + - "EETHIOPIC SYLLABLE KXAETHIOPIC SYLLABLE KXUETHIOPIC SYLLABLE KXIETHIOPIC" + - " SYLLABLE KXAAETHIOPIC SYLLABLE KXEEETHIOPIC SYLLABLE KXEETHIOPIC SYLLAB" + - "LE KXOETHIOPIC SYLLABLE KXWAETHIOPIC SYLLABLE KXWIETHIOPIC SYLLABLE KXWA" + - "AETHIOPIC SYLLABLE KXWEEETHIOPIC SYLLABLE KXWEETHIOPIC SYLLABLE WAETHIOP" + - "IC SYLLABLE WUETHIOPIC SYLLABLE WIETHIOPIC SYLLABLE WAAETHIOPIC SYLLABLE" + - " WEEETHIOPIC SYLLABLE WEETHIOPIC SYLLABLE WOETHIOPIC SYLLABLE WOAETHIOPI" + - "C SYLLABLE PHARYNGEAL AETHIOPIC SYLLABLE PHARYNGEAL UETHIOPIC SYLLABLE P" + - "HARYNGEAL IETHIOPIC SYLLABLE PHARYNGEAL AAETHIOPIC SYLLABLE PHARYNGEAL E" + - "EETHIOPIC SYLLABLE PHARYNGEAL EETHIOPIC SYLLABLE PHARYNGEAL OETHIOPIC SY" + - "LLABLE ZAETHIOPIC SYLLABLE ZUETHIOPIC SYLLABLE ZIETHIOPIC SYLLABLE ZAAET" + - "HIOPIC SYLLABLE ZEEETHIOPIC SYLLABLE ZEETHIOPIC SYLLABLE ZOETHIOPIC SYLL" + - "ABLE ZWAETHIOPIC SYLLABLE ZHAETHIOPIC SYLLABLE ZHUETHIOPIC SYLLABLE ZHIE" + - "THIOPIC SYLLABLE ZHAAETHIOPIC SYLLABLE ZHEEETHIOPIC SYLLABLE ZHEETHIOPIC" + - " SYLLABLE ZHOETHIOPIC SYLLABLE ZHWAETHIOPIC SYLLABLE YAETHIOPIC SYLLABLE" + - " YUETHIOPIC SYLLABLE YIETHIOPIC SYLLABLE YAAETHIOPIC SYLLABLE YEEETHIOPI" + - "C SYLLABLE YEETHIOPIC SYLLABLE YOETHIOPIC SYLLABLE YOAETHIOPIC SYLLABLE " + - "DAETHIOPIC SYLLABLE DUETHIOPIC SYLLABLE DIETHIOPIC SYLLABLE DAAETHIOPIC " + - "SYLLABLE DEEETHIOPIC SYLLABLE DEETHIOPIC SYLLABLE DOETHIOPIC SYLLABLE DW" + - "AETHIOPIC SYLLABLE DDAETHIOPIC SYLLABLE DDUETHIOPIC SYLLABLE DDIETHIOPIC" + - " SYLLABLE DDAAETHIOPIC SYLLABLE DDEEETHIOPIC SYLLABLE DDEETHIOPIC SYLLAB" + - "LE DDOETHIOPIC SYLLABLE DDWAETHIOPIC SYLLABLE JAETHIOPIC SYLLABLE JUETHI" + - "OPIC SYLLABLE JIETHIOPIC SYLLABLE JAAETHIOPIC SYLLABLE JEEETHIOPIC SYLLA" + - "BLE JEETHIOPIC SYLLABLE JOETHIOPIC SYLLABLE JWAETHIOPIC SYLLABLE GAETHIO" + - "PIC SYLLABLE GUETHIOPIC SYLLABLE GIETHIOPIC SYLLABLE GAAETHIOPIC SYLLABL" + - "E GEEETHIOPIC SYLLABLE GEETHIOPIC SYLLABLE GOETHIOPIC SYLLABLE GOAETHIOP" + - "IC SYLLABLE GWAETHIOPIC SYLLABLE GWIETHIOPIC SYLLABLE GWAAETHIOPIC SYLLA" + - "BLE GWEEETHIOPIC SYLLABLE GWEETHIOPIC SYLLABLE GGAETHIOPIC SYLLABLE GGUE" + - "THIOPIC SYLLABLE GGIETHIOPIC SYLLABLE GGAAETHIOPIC SYLLABLE GGEEETHIOPIC" + - " SYLLABLE GGEETHIOPIC SYLLABLE GGOETHIOPIC SYLLABLE GGWAAETHIOPIC SYLLAB" + - "LE THAETHIOPIC SYLLABLE THUETHIOPIC SYLLABLE THIETHIOPIC SYLLABLE THAAET" + - "HIOPIC SYLLABLE THEEETHIOPIC SYLLABLE THEETHIOPIC SYLLABLE THOETHIOPIC S" + - "YLLABLE THWAETHIOPIC SYLLABLE CHAETHIOPIC SYLLABLE CHUETHIOPIC SYLLABLE " + - "CHIETHIOPIC SYLLABLE CHAAETHIOPIC SYLLABLE CHEEETHIOPIC SYLLABLE CHEETHI" + - "OPIC SYLLABLE CHOETHIOPIC SYLLABLE CHWAETHIOPIC SYLLABLE PHAETHIOPIC SYL" + - "LABLE PHUETHIOPIC SYLLABLE PHIETHIOPIC SYLLABLE PHAAETHIOPIC SYLLABLE PH" + - "EEETHIOPIC SYLLABLE PHEETHIOPIC SYLLABLE PHOETHIOPIC SYLLABLE PHWAETHIOP" + - "IC SYLLABLE TSAETHIOPIC SYLLABLE TSUETHIOPIC SYLLABLE TSIETHIOPIC SYLLAB" + - "LE TSAAETHIOPIC SYLLABLE TSEEETHIOPIC SYLLABLE TSEETHIOPIC SYLLABLE TSOE" + - "THIOPIC SYLLABLE TSWAETHIOPIC SYLLABLE TZAETHIOPIC SYLLABLE TZUETHIOPIC " + - "SYLLABLE TZIETHIOPIC SYLLABLE TZAAETHIOPIC SYLLABLE TZEEETHIOPIC SYLLABL" + - "E TZEETHIOPIC SYLLABLE TZOETHIOPIC SYLLABLE TZOAETHIOPIC SYLLABLE FAETHI" + - "OPIC SYLLABLE FUETHIOPIC SYLLABLE FIETHIOPIC SYLLABLE FAAETHIOPIC SYLLAB" + - "LE FEEETHIOPIC SYLLABLE FEETHIOPIC SYLLABLE FOETHIOPIC SYLLABLE FWAETHIO") + ("" + - "PIC SYLLABLE PAETHIOPIC SYLLABLE PUETHIOPIC SYLLABLE PIETHIOPIC SYLLABLE" + - " PAAETHIOPIC SYLLABLE PEEETHIOPIC SYLLABLE PEETHIOPIC SYLLABLE POETHIOPI" + - "C SYLLABLE PWAETHIOPIC SYLLABLE RYAETHIOPIC SYLLABLE MYAETHIOPIC SYLLABL" + - "E FYAETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARKETHIOPIC COMBINI" + - "NG VOWEL LENGTH MARKETHIOPIC COMBINING GEMINATION MARKETHIOPIC SECTION M" + - "ARKETHIOPIC WORDSPACEETHIOPIC FULL STOPETHIOPIC COMMAETHIOPIC SEMICOLONE" + - "THIOPIC COLONETHIOPIC PREFACE COLONETHIOPIC QUESTION MARKETHIOPIC PARAGR" + - "APH SEPARATORETHIOPIC DIGIT ONEETHIOPIC DIGIT TWOETHIOPIC DIGIT THREEETH" + - "IOPIC DIGIT FOURETHIOPIC DIGIT FIVEETHIOPIC DIGIT SIXETHIOPIC DIGIT SEVE" + - "NETHIOPIC DIGIT EIGHTETHIOPIC DIGIT NINEETHIOPIC NUMBER TENETHIOPIC NUMB" + - "ER TWENTYETHIOPIC NUMBER THIRTYETHIOPIC NUMBER FORTYETHIOPIC NUMBER FIFT" + - "YETHIOPIC NUMBER SIXTYETHIOPIC NUMBER SEVENTYETHIOPIC NUMBER EIGHTYETHIO" + - "PIC NUMBER NINETYETHIOPIC NUMBER HUNDREDETHIOPIC NUMBER TEN THOUSANDETHI" + - "OPIC SYLLABLE SEBATBEIT MWAETHIOPIC SYLLABLE MWIETHIOPIC SYLLABLE MWEEET" + - "HIOPIC SYLLABLE MWEETHIOPIC SYLLABLE SEBATBEIT BWAETHIOPIC SYLLABLE BWIE" + - "THIOPIC SYLLABLE BWEEETHIOPIC SYLLABLE BWEETHIOPIC SYLLABLE SEBATBEIT FW" + - "AETHIOPIC SYLLABLE FWIETHIOPIC SYLLABLE FWEEETHIOPIC SYLLABLE FWEETHIOPI" + - "C SYLLABLE SEBATBEIT PWAETHIOPIC SYLLABLE PWIETHIOPIC SYLLABLE PWEEETHIO" + - "PIC SYLLABLE PWEETHIOPIC TONAL MARK YIZETETHIOPIC TONAL MARK DERETETHIOP" + - "IC TONAL MARK RIKRIKETHIOPIC TONAL MARK SHORT RIKRIKETHIOPIC TONAL MARK " + - "DIFATETHIOPIC TONAL MARK KENATETHIOPIC TONAL MARK CHIRETETHIOPIC TONAL M" + - "ARK HIDETETHIOPIC TONAL MARK DERET-HIDETETHIOPIC TONAL MARK KURTCHEROKEE" + - " LETTER ACHEROKEE LETTER ECHEROKEE LETTER ICHEROKEE LETTER OCHEROKEE LET" + - "TER UCHEROKEE LETTER VCHEROKEE LETTER GACHEROKEE LETTER KACHEROKEE LETTE" + - "R GECHEROKEE LETTER GICHEROKEE LETTER GOCHEROKEE LETTER GUCHEROKEE LETTE" + - "R GVCHEROKEE LETTER HACHEROKEE LETTER HECHEROKEE LETTER HICHEROKEE LETTE" + - "R HOCHEROKEE LETTER HUCHEROKEE LETTER HVCHEROKEE LETTER LACHEROKEE LETTE" + - "R LECHEROKEE LETTER LICHEROKEE LETTER LOCHEROKEE LETTER LUCHEROKEE LETTE" + - "R LVCHEROKEE LETTER MACHEROKEE LETTER MECHEROKEE LETTER MICHEROKEE LETTE" + - "R MOCHEROKEE LETTER MUCHEROKEE LETTER NACHEROKEE LETTER HNACHEROKEE LETT" + - "ER NAHCHEROKEE LETTER NECHEROKEE LETTER NICHEROKEE LETTER NOCHEROKEE LET" + - "TER NUCHEROKEE LETTER NVCHEROKEE LETTER QUACHEROKEE LETTER QUECHEROKEE L" + - "ETTER QUICHEROKEE LETTER QUOCHEROKEE LETTER QUUCHEROKEE LETTER QUVCHEROK" + - "EE LETTER SACHEROKEE LETTER SCHEROKEE LETTER SECHEROKEE LETTER SICHEROKE" + - "E LETTER SOCHEROKEE LETTER SUCHEROKEE LETTER SVCHEROKEE LETTER DACHEROKE" + - "E LETTER TACHEROKEE LETTER DECHEROKEE LETTER TECHEROKEE LETTER DICHEROKE" + - "E LETTER TICHEROKEE LETTER DOCHEROKEE LETTER DUCHEROKEE LETTER DVCHEROKE" + - "E LETTER DLACHEROKEE LETTER TLACHEROKEE LETTER TLECHEROKEE LETTER TLICHE" + - "ROKEE LETTER TLOCHEROKEE LETTER TLUCHEROKEE LETTER TLVCHEROKEE LETTER TS" + - "ACHEROKEE LETTER TSECHEROKEE LETTER TSICHEROKEE LETTER TSOCHEROKEE LETTE" + - "R TSUCHEROKEE LETTER TSVCHEROKEE LETTER WACHEROKEE LETTER WECHEROKEE LET" + - "TER WICHEROKEE LETTER WOCHEROKEE LETTER WUCHEROKEE LETTER WVCHEROKEE LET" + - "TER YACHEROKEE LETTER YECHEROKEE LETTER YICHEROKEE LETTER YOCHEROKEE LET" + - "TER YUCHEROKEE LETTER YVCHEROKEE LETTER MVCHEROKEE SMALL LETTER YECHEROK" + - "EE SMALL LETTER YICHEROKEE SMALL LETTER YOCHEROKEE SMALL LETTER YUCHEROK" + - "EE SMALL LETTER YVCHEROKEE SMALL LETTER MVCANADIAN SYLLABICS HYPHENCANAD" + - "IAN SYLLABICS ECANADIAN SYLLABICS AAICANADIAN SYLLABICS ICANADIAN SYLLAB" + - "ICS IICANADIAN SYLLABICS OCANADIAN SYLLABICS OOCANADIAN SYLLABICS Y-CREE" + - " OOCANADIAN SYLLABICS CARRIER EECANADIAN SYLLABICS CARRIER ICANADIAN SYL" + - "LABICS ACANADIAN SYLLABICS AACANADIAN SYLLABICS WECANADIAN SYLLABICS WES" + - "T-CREE WECANADIAN SYLLABICS WICANADIAN SYLLABICS WEST-CREE WICANADIAN SY" + - "LLABICS WIICANADIAN SYLLABICS WEST-CREE WIICANADIAN SYLLABICS WOCANADIAN" + - " SYLLABICS WEST-CREE WOCANADIAN SYLLABICS WOOCANADIAN SYLLABICS WEST-CRE" + - "E WOOCANADIAN SYLLABICS NASKAPI WOOCANADIAN SYLLABICS WACANADIAN SYLLABI" + - "CS WEST-CREE WACANADIAN SYLLABICS WAACANADIAN SYLLABICS WEST-CREE WAACAN" + - "ADIAN SYLLABICS NASKAPI WAACANADIAN SYLLABICS AICANADIAN SYLLABICS Y-CRE" + - "E WCANADIAN SYLLABICS GLOTTAL STOPCANADIAN SYLLABICS FINAL ACUTECANADIAN" + - " SYLLABICS FINAL GRAVECANADIAN SYLLABICS FINAL BOTTOM HALF RINGCANADIAN " + - "SYLLABICS FINAL TOP HALF RINGCANADIAN SYLLABICS FINAL RIGHT HALF RINGCAN" + - "ADIAN SYLLABICS FINAL RINGCANADIAN SYLLABICS FINAL DOUBLE ACUTECANADIAN " + - "SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKESCANADIAN SYLLABICS FINAL MI" + - "DDLE DOTCANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKECANADIAN SYLLABI" + - "CS FINAL PLUSCANADIAN SYLLABICS FINAL DOWN TACKCANADIAN SYLLABICS ENCANA" + - "DIAN SYLLABICS INCANADIAN SYLLABICS ONCANADIAN SYLLABICS ANCANADIAN SYLL") + ("" + - "ABICS PECANADIAN SYLLABICS PAAICANADIAN SYLLABICS PICANADIAN SYLLABICS P" + - "IICANADIAN SYLLABICS POCANADIAN SYLLABICS POOCANADIAN SYLLABICS Y-CREE P" + - "OOCANADIAN SYLLABICS CARRIER HEECANADIAN SYLLABICS CARRIER HICANADIAN SY" + - "LLABICS PACANADIAN SYLLABICS PAACANADIAN SYLLABICS PWECANADIAN SYLLABICS" + - " WEST-CREE PWECANADIAN SYLLABICS PWICANADIAN SYLLABICS WEST-CREE PWICANA" + - "DIAN SYLLABICS PWIICANADIAN SYLLABICS WEST-CREE PWIICANADIAN SYLLABICS P" + - "WOCANADIAN SYLLABICS WEST-CREE PWOCANADIAN SYLLABICS PWOOCANADIAN SYLLAB" + - "ICS WEST-CREE PWOOCANADIAN SYLLABICS PWACANADIAN SYLLABICS WEST-CREE PWA" + - "CANADIAN SYLLABICS PWAACANADIAN SYLLABICS WEST-CREE PWAACANADIAN SYLLABI" + - "CS Y-CREE PWAACANADIAN SYLLABICS PCANADIAN SYLLABICS WEST-CREE PCANADIAN" + - " SYLLABICS CARRIER HCANADIAN SYLLABICS TECANADIAN SYLLABICS TAAICANADIAN" + - " SYLLABICS TICANADIAN SYLLABICS TIICANADIAN SYLLABICS TOCANADIAN SYLLABI" + - "CS TOOCANADIAN SYLLABICS Y-CREE TOOCANADIAN SYLLABICS CARRIER DEECANADIA" + - "N SYLLABICS CARRIER DICANADIAN SYLLABICS TACANADIAN SYLLABICS TAACANADIA" + - "N SYLLABICS TWECANADIAN SYLLABICS WEST-CREE TWECANADIAN SYLLABICS TWICAN" + - "ADIAN SYLLABICS WEST-CREE TWICANADIAN SYLLABICS TWIICANADIAN SYLLABICS W" + - "EST-CREE TWIICANADIAN SYLLABICS TWOCANADIAN SYLLABICS WEST-CREE TWOCANAD" + - "IAN SYLLABICS TWOOCANADIAN SYLLABICS WEST-CREE TWOOCANADIAN SYLLABICS TW" + - "ACANADIAN SYLLABICS WEST-CREE TWACANADIAN SYLLABICS TWAACANADIAN SYLLABI" + - "CS WEST-CREE TWAACANADIAN SYLLABICS NASKAPI TWAACANADIAN SYLLABICS TCANA" + - "DIAN SYLLABICS TTECANADIAN SYLLABICS TTICANADIAN SYLLABICS TTOCANADIAN S" + - "YLLABICS TTACANADIAN SYLLABICS KECANADIAN SYLLABICS KAAICANADIAN SYLLABI" + - "CS KICANADIAN SYLLABICS KIICANADIAN SYLLABICS KOCANADIAN SYLLABICS KOOCA" + - "NADIAN SYLLABICS Y-CREE KOOCANADIAN SYLLABICS KACANADIAN SYLLABICS KAACA" + - "NADIAN SYLLABICS KWECANADIAN SYLLABICS WEST-CREE KWECANADIAN SYLLABICS K" + - "WICANADIAN SYLLABICS WEST-CREE KWICANADIAN SYLLABICS KWIICANADIAN SYLLAB" + - "ICS WEST-CREE KWIICANADIAN SYLLABICS KWOCANADIAN SYLLABICS WEST-CREE KWO" + - "CANADIAN SYLLABICS KWOOCANADIAN SYLLABICS WEST-CREE KWOOCANADIAN SYLLABI" + - "CS KWACANADIAN SYLLABICS WEST-CREE KWACANADIAN SYLLABICS KWAACANADIAN SY" + - "LLABICS WEST-CREE KWAACANADIAN SYLLABICS NASKAPI KWAACANADIAN SYLLABICS " + - "KCANADIAN SYLLABICS KWCANADIAN SYLLABICS SOUTH-SLAVEY KEHCANADIAN SYLLAB" + - "ICS SOUTH-SLAVEY KIHCANADIAN SYLLABICS SOUTH-SLAVEY KOHCANADIAN SYLLABIC" + - "S SOUTH-SLAVEY KAHCANADIAN SYLLABICS CECANADIAN SYLLABICS CAAICANADIAN S" + - "YLLABICS CICANADIAN SYLLABICS CIICANADIAN SYLLABICS COCANADIAN SYLLABICS" + - " COOCANADIAN SYLLABICS Y-CREE COOCANADIAN SYLLABICS CACANADIAN SYLLABICS" + - " CAACANADIAN SYLLABICS CWECANADIAN SYLLABICS WEST-CREE CWECANADIAN SYLLA" + - "BICS CWICANADIAN SYLLABICS WEST-CREE CWICANADIAN SYLLABICS CWIICANADIAN " + - "SYLLABICS WEST-CREE CWIICANADIAN SYLLABICS CWOCANADIAN SYLLABICS WEST-CR" + - "EE CWOCANADIAN SYLLABICS CWOOCANADIAN SYLLABICS WEST-CREE CWOOCANADIAN S" + - "YLLABICS CWACANADIAN SYLLABICS WEST-CREE CWACANADIAN SYLLABICS CWAACANAD" + - "IAN SYLLABICS WEST-CREE CWAACANADIAN SYLLABICS NASKAPI CWAACANADIAN SYLL" + - "ABICS CCANADIAN SYLLABICS SAYISI THCANADIAN SYLLABICS MECANADIAN SYLLABI" + - "CS MAAICANADIAN SYLLABICS MICANADIAN SYLLABICS MIICANADIAN SYLLABICS MOC" + - "ANADIAN SYLLABICS MOOCANADIAN SYLLABICS Y-CREE MOOCANADIAN SYLLABICS MAC" + - "ANADIAN SYLLABICS MAACANADIAN SYLLABICS MWECANADIAN SYLLABICS WEST-CREE " + - "MWECANADIAN SYLLABICS MWICANADIAN SYLLABICS WEST-CREE MWICANADIAN SYLLAB" + - "ICS MWIICANADIAN SYLLABICS WEST-CREE MWIICANADIAN SYLLABICS MWOCANADIAN " + - "SYLLABICS WEST-CREE MWOCANADIAN SYLLABICS MWOOCANADIAN SYLLABICS WEST-CR" + - "EE MWOOCANADIAN SYLLABICS MWACANADIAN SYLLABICS WEST-CREE MWACANADIAN SY" + - "LLABICS MWAACANADIAN SYLLABICS WEST-CREE MWAACANADIAN SYLLABICS NASKAPI " + - "MWAACANADIAN SYLLABICS MCANADIAN SYLLABICS WEST-CREE MCANADIAN SYLLABICS" + - " MHCANADIAN SYLLABICS ATHAPASCAN MCANADIAN SYLLABICS SAYISI MCANADIAN SY" + - "LLABICS NECANADIAN SYLLABICS NAAICANADIAN SYLLABICS NICANADIAN SYLLABICS" + - " NIICANADIAN SYLLABICS NOCANADIAN SYLLABICS NOOCANADIAN SYLLABICS Y-CREE" + - " NOOCANADIAN SYLLABICS NACANADIAN SYLLABICS NAACANADIAN SYLLABICS NWECAN" + - "ADIAN SYLLABICS WEST-CREE NWECANADIAN SYLLABICS NWACANADIAN SYLLABICS WE" + - "ST-CREE NWACANADIAN SYLLABICS NWAACANADIAN SYLLABICS WEST-CREE NWAACANAD" + - "IAN SYLLABICS NASKAPI NWAACANADIAN SYLLABICS NCANADIAN SYLLABICS CARRIER" + - " NGCANADIAN SYLLABICS NHCANADIAN SYLLABICS LECANADIAN SYLLABICS LAAICANA" + - "DIAN SYLLABICS LICANADIAN SYLLABICS LIICANADIAN SYLLABICS LOCANADIAN SYL" + - "LABICS LOOCANADIAN SYLLABICS Y-CREE LOOCANADIAN SYLLABICS LACANADIAN SYL" + - "LABICS LAACANADIAN SYLLABICS LWECANADIAN SYLLABICS WEST-CREE LWECANADIAN" + - " SYLLABICS LWICANADIAN SYLLABICS WEST-CREE LWICANADIAN SYLLABICS LWIICAN" + - "ADIAN SYLLABICS WEST-CREE LWIICANADIAN SYLLABICS LWOCANADIAN SYLLABICS W") + ("" + - "EST-CREE LWOCANADIAN SYLLABICS LWOOCANADIAN SYLLABICS WEST-CREE LWOOCANA" + - "DIAN SYLLABICS LWACANADIAN SYLLABICS WEST-CREE LWACANADIAN SYLLABICS LWA" + - "ACANADIAN SYLLABICS WEST-CREE LWAACANADIAN SYLLABICS LCANADIAN SYLLABICS" + - " WEST-CREE LCANADIAN SYLLABICS MEDIAL LCANADIAN SYLLABICS SECANADIAN SYL" + - "LABICS SAAICANADIAN SYLLABICS SICANADIAN SYLLABICS SIICANADIAN SYLLABICS" + - " SOCANADIAN SYLLABICS SOOCANADIAN SYLLABICS Y-CREE SOOCANADIAN SYLLABICS" + - " SACANADIAN SYLLABICS SAACANADIAN SYLLABICS SWECANADIAN SYLLABICS WEST-C" + - "REE SWECANADIAN SYLLABICS SWICANADIAN SYLLABICS WEST-CREE SWICANADIAN SY" + - "LLABICS SWIICANADIAN SYLLABICS WEST-CREE SWIICANADIAN SYLLABICS SWOCANAD" + - "IAN SYLLABICS WEST-CREE SWOCANADIAN SYLLABICS SWOOCANADIAN SYLLABICS WES" + - "T-CREE SWOOCANADIAN SYLLABICS SWACANADIAN SYLLABICS WEST-CREE SWACANADIA" + - "N SYLLABICS SWAACANADIAN SYLLABICS WEST-CREE SWAACANADIAN SYLLABICS NASK" + - "API SWAACANADIAN SYLLABICS SCANADIAN SYLLABICS ATHAPASCAN SCANADIAN SYLL" + - "ABICS SWCANADIAN SYLLABICS BLACKFOOT SCANADIAN SYLLABICS MOOSE-CREE SKCA" + - "NADIAN SYLLABICS NASKAPI SKWCANADIAN SYLLABICS NASKAPI S-WCANADIAN SYLLA" + - "BICS NASKAPI SPWACANADIAN SYLLABICS NASKAPI STWACANADIAN SYLLABICS NASKA" + - "PI SKWACANADIAN SYLLABICS NASKAPI SCWACANADIAN SYLLABICS SHECANADIAN SYL" + - "LABICS SHICANADIAN SYLLABICS SHIICANADIAN SYLLABICS SHOCANADIAN SYLLABIC" + - "S SHOOCANADIAN SYLLABICS SHACANADIAN SYLLABICS SHAACANADIAN SYLLABICS SH" + - "WECANADIAN SYLLABICS WEST-CREE SHWECANADIAN SYLLABICS SHWICANADIAN SYLLA" + - "BICS WEST-CREE SHWICANADIAN SYLLABICS SHWIICANADIAN SYLLABICS WEST-CREE " + - "SHWIICANADIAN SYLLABICS SHWOCANADIAN SYLLABICS WEST-CREE SHWOCANADIAN SY" + - "LLABICS SHWOOCANADIAN SYLLABICS WEST-CREE SHWOOCANADIAN SYLLABICS SHWACA" + - "NADIAN SYLLABICS WEST-CREE SHWACANADIAN SYLLABICS SHWAACANADIAN SYLLABIC" + - "S WEST-CREE SHWAACANADIAN SYLLABICS SHCANADIAN SYLLABICS YECANADIAN SYLL" + - "ABICS YAAICANADIAN SYLLABICS YICANADIAN SYLLABICS YIICANADIAN SYLLABICS " + - "YOCANADIAN SYLLABICS YOOCANADIAN SYLLABICS Y-CREE YOOCANADIAN SYLLABICS " + - "YACANADIAN SYLLABICS YAACANADIAN SYLLABICS YWECANADIAN SYLLABICS WEST-CR" + - "EE YWECANADIAN SYLLABICS YWICANADIAN SYLLABICS WEST-CREE YWICANADIAN SYL" + - "LABICS YWIICANADIAN SYLLABICS WEST-CREE YWIICANADIAN SYLLABICS YWOCANADI" + - "AN SYLLABICS WEST-CREE YWOCANADIAN SYLLABICS YWOOCANADIAN SYLLABICS WEST" + - "-CREE YWOOCANADIAN SYLLABICS YWACANADIAN SYLLABICS WEST-CREE YWACANADIAN" + - " SYLLABICS YWAACANADIAN SYLLABICS WEST-CREE YWAACANADIAN SYLLABICS NASKA" + - "PI YWAACANADIAN SYLLABICS YCANADIAN SYLLABICS BIBLE-CREE YCANADIAN SYLLA" + - "BICS WEST-CREE YCANADIAN SYLLABICS SAYISI YICANADIAN SYLLABICS RECANADIA" + - "N SYLLABICS R-CREE RECANADIAN SYLLABICS WEST-CREE LECANADIAN SYLLABICS R" + - "AAICANADIAN SYLLABICS RICANADIAN SYLLABICS RIICANADIAN SYLLABICS ROCANAD" + - "IAN SYLLABICS ROOCANADIAN SYLLABICS WEST-CREE LOCANADIAN SYLLABICS RACAN" + - "ADIAN SYLLABICS RAACANADIAN SYLLABICS WEST-CREE LACANADIAN SYLLABICS RWA" + - "ACANADIAN SYLLABICS WEST-CREE RWAACANADIAN SYLLABICS RCANADIAN SYLLABICS" + - " WEST-CREE RCANADIAN SYLLABICS MEDIAL RCANADIAN SYLLABICS FECANADIAN SYL" + - "LABICS FAAICANADIAN SYLLABICS FICANADIAN SYLLABICS FIICANADIAN SYLLABICS" + - " FOCANADIAN SYLLABICS FOOCANADIAN SYLLABICS FACANADIAN SYLLABICS FAACANA" + - "DIAN SYLLABICS FWAACANADIAN SYLLABICS WEST-CREE FWAACANADIAN SYLLABICS F" + - "CANADIAN SYLLABICS THECANADIAN SYLLABICS N-CREE THECANADIAN SYLLABICS TH" + - "ICANADIAN SYLLABICS N-CREE THICANADIAN SYLLABICS THIICANADIAN SYLLABICS " + - "N-CREE THIICANADIAN SYLLABICS THOCANADIAN SYLLABICS THOOCANADIAN SYLLABI" + - "CS THACANADIAN SYLLABICS THAACANADIAN SYLLABICS THWAACANADIAN SYLLABICS " + - "WEST-CREE THWAACANADIAN SYLLABICS THCANADIAN SYLLABICS TTHECANADIAN SYLL" + - "ABICS TTHICANADIAN SYLLABICS TTHOCANADIAN SYLLABICS TTHACANADIAN SYLLABI" + - "CS TTHCANADIAN SYLLABICS TYECANADIAN SYLLABICS TYICANADIAN SYLLABICS TYO" + - "CANADIAN SYLLABICS TYACANADIAN SYLLABICS NUNAVIK HECANADIAN SYLLABICS NU" + - "NAVIK HICANADIAN SYLLABICS NUNAVIK HIICANADIAN SYLLABICS NUNAVIK HOCANAD" + - "IAN SYLLABICS NUNAVIK HOOCANADIAN SYLLABICS NUNAVIK HACANADIAN SYLLABICS" + - " NUNAVIK HAACANADIAN SYLLABICS NUNAVIK HCANADIAN SYLLABICS NUNAVUT HCANA" + - "DIAN SYLLABICS HKCANADIAN SYLLABICS QAAICANADIAN SYLLABICS QICANADIAN SY" + - "LLABICS QIICANADIAN SYLLABICS QOCANADIAN SYLLABICS QOOCANADIAN SYLLABICS" + - " QACANADIAN SYLLABICS QAACANADIAN SYLLABICS QCANADIAN SYLLABICS TLHECANA" + - "DIAN SYLLABICS TLHICANADIAN SYLLABICS TLHOCANADIAN SYLLABICS TLHACANADIA" + - "N SYLLABICS WEST-CREE RECANADIAN SYLLABICS WEST-CREE RICANADIAN SYLLABIC" + - "S WEST-CREE ROCANADIAN SYLLABICS WEST-CREE RACANADIAN SYLLABICS NGAAICAN" + - "ADIAN SYLLABICS NGICANADIAN SYLLABICS NGIICANADIAN SYLLABICS NGOCANADIAN" + - " SYLLABICS NGOOCANADIAN SYLLABICS NGACANADIAN SYLLABICS NGAACANADIAN SYL" + - "LABICS NGCANADIAN SYLLABICS NNGCANADIAN SYLLABICS SAYISI SHECANADIAN SYL") + ("" + - "LABICS SAYISI SHICANADIAN SYLLABICS SAYISI SHOCANADIAN SYLLABICS SAYISI " + - "SHACANADIAN SYLLABICS WOODS-CREE THECANADIAN SYLLABICS WOODS-CREE THICAN" + - "ADIAN SYLLABICS WOODS-CREE THOCANADIAN SYLLABICS WOODS-CREE THACANADIAN " + - "SYLLABICS WOODS-CREE THCANADIAN SYLLABICS LHICANADIAN SYLLABICS LHIICANA" + - "DIAN SYLLABICS LHOCANADIAN SYLLABICS LHOOCANADIAN SYLLABICS LHACANADIAN " + - "SYLLABICS LHAACANADIAN SYLLABICS LHCANADIAN SYLLABICS TH-CREE THECANADIA" + - "N SYLLABICS TH-CREE THICANADIAN SYLLABICS TH-CREE THIICANADIAN SYLLABICS" + - " TH-CREE THOCANADIAN SYLLABICS TH-CREE THOOCANADIAN SYLLABICS TH-CREE TH" + - "ACANADIAN SYLLABICS TH-CREE THAACANADIAN SYLLABICS TH-CREE THCANADIAN SY" + - "LLABICS AIVILIK BCANADIAN SYLLABICS BLACKFOOT ECANADIAN SYLLABICS BLACKF" + - "OOT ICANADIAN SYLLABICS BLACKFOOT OCANADIAN SYLLABICS BLACKFOOT ACANADIA" + - "N SYLLABICS BLACKFOOT WECANADIAN SYLLABICS BLACKFOOT WICANADIAN SYLLABIC" + - "S BLACKFOOT WOCANADIAN SYLLABICS BLACKFOOT WACANADIAN SYLLABICS BLACKFOO" + - "T NECANADIAN SYLLABICS BLACKFOOT NICANADIAN SYLLABICS BLACKFOOT NOCANADI" + - "AN SYLLABICS BLACKFOOT NACANADIAN SYLLABICS BLACKFOOT KECANADIAN SYLLABI" + - "CS BLACKFOOT KICANADIAN SYLLABICS BLACKFOOT KOCANADIAN SYLLABICS BLACKFO" + - "OT KACANADIAN SYLLABICS SAYISI HECANADIAN SYLLABICS SAYISI HICANADIAN SY" + - "LLABICS SAYISI HOCANADIAN SYLLABICS SAYISI HACANADIAN SYLLABICS CARRIER " + - "GHUCANADIAN SYLLABICS CARRIER GHOCANADIAN SYLLABICS CARRIER GHECANADIAN " + - "SYLLABICS CARRIER GHEECANADIAN SYLLABICS CARRIER GHICANADIAN SYLLABICS C" + - "ARRIER GHACANADIAN SYLLABICS CARRIER RUCANADIAN SYLLABICS CARRIER ROCANA" + - "DIAN SYLLABICS CARRIER RECANADIAN SYLLABICS CARRIER REECANADIAN SYLLABIC" + - "S CARRIER RICANADIAN SYLLABICS CARRIER RACANADIAN SYLLABICS CARRIER WUCA" + - "NADIAN SYLLABICS CARRIER WOCANADIAN SYLLABICS CARRIER WECANADIAN SYLLABI" + - "CS CARRIER WEECANADIAN SYLLABICS CARRIER WICANADIAN SYLLABICS CARRIER WA" + - "CANADIAN SYLLABICS CARRIER HWUCANADIAN SYLLABICS CARRIER HWOCANADIAN SYL" + - "LABICS CARRIER HWECANADIAN SYLLABICS CARRIER HWEECANADIAN SYLLABICS CARR" + - "IER HWICANADIAN SYLLABICS CARRIER HWACANADIAN SYLLABICS CARRIER THUCANAD" + - "IAN SYLLABICS CARRIER THOCANADIAN SYLLABICS CARRIER THECANADIAN SYLLABIC" + - "S CARRIER THEECANADIAN SYLLABICS CARRIER THICANADIAN SYLLABICS CARRIER T" + - "HACANADIAN SYLLABICS CARRIER TTUCANADIAN SYLLABICS CARRIER TTOCANADIAN S" + - "YLLABICS CARRIER TTECANADIAN SYLLABICS CARRIER TTEECANADIAN SYLLABICS CA" + - "RRIER TTICANADIAN SYLLABICS CARRIER TTACANADIAN SYLLABICS CARRIER PUCANA" + - "DIAN SYLLABICS CARRIER POCANADIAN SYLLABICS CARRIER PECANADIAN SYLLABICS" + - " CARRIER PEECANADIAN SYLLABICS CARRIER PICANADIAN SYLLABICS CARRIER PACA" + - "NADIAN SYLLABICS CARRIER PCANADIAN SYLLABICS CARRIER GUCANADIAN SYLLABIC" + - "S CARRIER GOCANADIAN SYLLABICS CARRIER GECANADIAN SYLLABICS CARRIER GEEC" + - "ANADIAN SYLLABICS CARRIER GICANADIAN SYLLABICS CARRIER GACANADIAN SYLLAB" + - "ICS CARRIER KHUCANADIAN SYLLABICS CARRIER KHOCANADIAN SYLLABICS CARRIER " + - "KHECANADIAN SYLLABICS CARRIER KHEECANADIAN SYLLABICS CARRIER KHICANADIAN" + - " SYLLABICS CARRIER KHACANADIAN SYLLABICS CARRIER KKUCANADIAN SYLLABICS C" + - "ARRIER KKOCANADIAN SYLLABICS CARRIER KKECANADIAN SYLLABICS CARRIER KKEEC" + - "ANADIAN SYLLABICS CARRIER KKICANADIAN SYLLABICS CARRIER KKACANADIAN SYLL" + - "ABICS CARRIER KKCANADIAN SYLLABICS CARRIER NUCANADIAN SYLLABICS CARRIER " + - "NOCANADIAN SYLLABICS CARRIER NECANADIAN SYLLABICS CARRIER NEECANADIAN SY" + - "LLABICS CARRIER NICANADIAN SYLLABICS CARRIER NACANADIAN SYLLABICS CARRIE" + - "R MUCANADIAN SYLLABICS CARRIER MOCANADIAN SYLLABICS CARRIER MECANADIAN S" + - "YLLABICS CARRIER MEECANADIAN SYLLABICS CARRIER MICANADIAN SYLLABICS CARR" + - "IER MACANADIAN SYLLABICS CARRIER YUCANADIAN SYLLABICS CARRIER YOCANADIAN" + - " SYLLABICS CARRIER YECANADIAN SYLLABICS CARRIER YEECANADIAN SYLLABICS CA" + - "RRIER YICANADIAN SYLLABICS CARRIER YACANADIAN SYLLABICS CARRIER JUCANADI" + - "AN SYLLABICS SAYISI JUCANADIAN SYLLABICS CARRIER JOCANADIAN SYLLABICS CA" + - "RRIER JECANADIAN SYLLABICS CARRIER JEECANADIAN SYLLABICS CARRIER JICANAD" + - "IAN SYLLABICS SAYISI JICANADIAN SYLLABICS CARRIER JACANADIAN SYLLABICS C" + - "ARRIER JJUCANADIAN SYLLABICS CARRIER JJOCANADIAN SYLLABICS CARRIER JJECA" + - "NADIAN SYLLABICS CARRIER JJEECANADIAN SYLLABICS CARRIER JJICANADIAN SYLL" + - "ABICS CARRIER JJACANADIAN SYLLABICS CARRIER LUCANADIAN SYLLABICS CARRIER" + - " LOCANADIAN SYLLABICS CARRIER LECANADIAN SYLLABICS CARRIER LEECANADIAN S" + - "YLLABICS CARRIER LICANADIAN SYLLABICS CARRIER LACANADIAN SYLLABICS CARRI" + - "ER DLUCANADIAN SYLLABICS CARRIER DLOCANADIAN SYLLABICS CARRIER DLECANADI" + - "AN SYLLABICS CARRIER DLEECANADIAN SYLLABICS CARRIER DLICANADIAN SYLLABIC" + - "S CARRIER DLACANADIAN SYLLABICS CARRIER LHUCANADIAN SYLLABICS CARRIER LH" + - "OCANADIAN SYLLABICS CARRIER LHECANADIAN SYLLABICS CARRIER LHEECANADIAN S" + - "YLLABICS CARRIER LHICANADIAN SYLLABICS CARRIER LHACANADIAN SYLLABICS CAR") + ("" + - "RIER TLHUCANADIAN SYLLABICS CARRIER TLHOCANADIAN SYLLABICS CARRIER TLHEC" + - "ANADIAN SYLLABICS CARRIER TLHEECANADIAN SYLLABICS CARRIER TLHICANADIAN S" + - "YLLABICS CARRIER TLHACANADIAN SYLLABICS CARRIER TLUCANADIAN SYLLABICS CA" + - "RRIER TLOCANADIAN SYLLABICS CARRIER TLECANADIAN SYLLABICS CARRIER TLEECA" + - "NADIAN SYLLABICS CARRIER TLICANADIAN SYLLABICS CARRIER TLACANADIAN SYLLA" + - "BICS CARRIER ZUCANADIAN SYLLABICS CARRIER ZOCANADIAN SYLLABICS CARRIER Z" + - "ECANADIAN SYLLABICS CARRIER ZEECANADIAN SYLLABICS CARRIER ZICANADIAN SYL" + - "LABICS CARRIER ZACANADIAN SYLLABICS CARRIER ZCANADIAN SYLLABICS CARRIER " + - "INITIAL ZCANADIAN SYLLABICS CARRIER DZUCANADIAN SYLLABICS CARRIER DZOCAN" + - "ADIAN SYLLABICS CARRIER DZECANADIAN SYLLABICS CARRIER DZEECANADIAN SYLLA" + - "BICS CARRIER DZICANADIAN SYLLABICS CARRIER DZACANADIAN SYLLABICS CARRIER" + - " SUCANADIAN SYLLABICS CARRIER SOCANADIAN SYLLABICS CARRIER SECANADIAN SY" + - "LLABICS CARRIER SEECANADIAN SYLLABICS CARRIER SICANADIAN SYLLABICS CARRI" + - "ER SACANADIAN SYLLABICS CARRIER SHUCANADIAN SYLLABICS CARRIER SHOCANADIA" + - "N SYLLABICS CARRIER SHECANADIAN SYLLABICS CARRIER SHEECANADIAN SYLLABICS" + - " CARRIER SHICANADIAN SYLLABICS CARRIER SHACANADIAN SYLLABICS CARRIER SHC" + - "ANADIAN SYLLABICS CARRIER TSUCANADIAN SYLLABICS CARRIER TSOCANADIAN SYLL" + - "ABICS CARRIER TSECANADIAN SYLLABICS CARRIER TSEECANADIAN SYLLABICS CARRI" + - "ER TSICANADIAN SYLLABICS CARRIER TSACANADIAN SYLLABICS CARRIER CHUCANADI" + - "AN SYLLABICS CARRIER CHOCANADIAN SYLLABICS CARRIER CHECANADIAN SYLLABICS" + - " CARRIER CHEECANADIAN SYLLABICS CARRIER CHICANADIAN SYLLABICS CARRIER CH" + - "ACANADIAN SYLLABICS CARRIER TTSUCANADIAN SYLLABICS CARRIER TTSOCANADIAN " + - "SYLLABICS CARRIER TTSECANADIAN SYLLABICS CARRIER TTSEECANADIAN SYLLABICS" + - " CARRIER TTSICANADIAN SYLLABICS CARRIER TTSACANADIAN SYLLABICS CHI SIGNC" + - "ANADIAN SYLLABICS FULL STOPCANADIAN SYLLABICS QAICANADIAN SYLLABICS NGAI" + - "CANADIAN SYLLABICS NNGICANADIAN SYLLABICS NNGIICANADIAN SYLLABICS NNGOCA" + - "NADIAN SYLLABICS NNGOOCANADIAN SYLLABICS NNGACANADIAN SYLLABICS NNGAACAN" + - "ADIAN SYLLABICS WOODS-CREE THWEECANADIAN SYLLABICS WOODS-CREE THWICANADI" + - "AN SYLLABICS WOODS-CREE THWIICANADIAN SYLLABICS WOODS-CREE THWOCANADIAN " + - "SYLLABICS WOODS-CREE THWOOCANADIAN SYLLABICS WOODS-CREE THWACANADIAN SYL" + - "LABICS WOODS-CREE THWAACANADIAN SYLLABICS WOODS-CREE FINAL THCANADIAN SY" + - "LLABICS BLACKFOOT WOGHAM SPACE MARKOGHAM LETTER BEITHOGHAM LETTER LUISOG" + - "HAM LETTER FEARNOGHAM LETTER SAILOGHAM LETTER NIONOGHAM LETTER UATHOGHAM" + - " LETTER DAIROGHAM LETTER TINNEOGHAM LETTER COLLOGHAM LETTER CEIRTOGHAM L" + - "ETTER MUINOGHAM LETTER GORTOGHAM LETTER NGEADALOGHAM LETTER STRAIFOGHAM " + - "LETTER RUISOGHAM LETTER AILMOGHAM LETTER ONNOGHAM LETTER UROGHAM LETTER " + - "EADHADHOGHAM LETTER IODHADHOGHAM LETTER EABHADHOGHAM LETTER OROGHAM LETT" + - "ER UILLEANNOGHAM LETTER IFINOGHAM LETTER EAMHANCHOLLOGHAM LETTER PEITHOG" + - "HAM FEATHER MARKOGHAM REVERSED FEATHER MARKRUNIC LETTER FEHU FEOH FE FRU" + - "NIC LETTER VRUNIC LETTER URUZ UR URUNIC LETTER YRRUNIC LETTER YRUNIC LET" + - "TER WRUNIC LETTER THURISAZ THURS THORNRUNIC LETTER ETHRUNIC LETTER ANSUZ" + - " ARUNIC LETTER OS ORUNIC LETTER AC ARUNIC LETTER AESCRUNIC LETTER LONG-B" + - "RANCH-OSS ORUNIC LETTER SHORT-TWIG-OSS ORUNIC LETTER ORUNIC LETTER OERUN" + - "IC LETTER ONRUNIC LETTER RAIDO RAD REID RRUNIC LETTER KAUNARUNIC LETTER " + - "CENRUNIC LETTER KAUN KRUNIC LETTER GRUNIC LETTER ENGRUNIC LETTER GEBO GY" + - "FU GRUNIC LETTER GARRUNIC LETTER WUNJO WYNN WRUNIC LETTER HAGLAZ HRUNIC " + - "LETTER HAEGL HRUNIC LETTER LONG-BRANCH-HAGALL HRUNIC LETTER SHORT-TWIG-H" + - "AGALL HRUNIC LETTER NAUDIZ NYD NAUD NRUNIC LETTER SHORT-TWIG-NAUD NRUNIC" + - " LETTER DOTTED-NRUNIC LETTER ISAZ IS ISS IRUNIC LETTER ERUNIC LETTER JER" + - "AN JRUNIC LETTER GERRUNIC LETTER LONG-BRANCH-AR AERUNIC LETTER SHORT-TWI" + - "G-AR ARUNIC LETTER IWAZ EOHRUNIC LETTER PERTHO PEORTH PRUNIC LETTER ALGI" + - "Z EOLHXRUNIC LETTER SOWILO SRUNIC LETTER SIGEL LONG-BRANCH-SOL SRUNIC LE" + - "TTER SHORT-TWIG-SOL SRUNIC LETTER CRUNIC LETTER ZRUNIC LETTER TIWAZ TIR " + - "TYR TRUNIC LETTER SHORT-TWIG-TYR TRUNIC LETTER DRUNIC LETTER BERKANAN BE" + - "ORC BJARKAN BRUNIC LETTER SHORT-TWIG-BJARKAN BRUNIC LETTER DOTTED-PRUNIC" + - " LETTER OPEN-PRUNIC LETTER EHWAZ EH ERUNIC LETTER MANNAZ MAN MRUNIC LETT" + - "ER LONG-BRANCH-MADR MRUNIC LETTER SHORT-TWIG-MADR MRUNIC LETTER LAUKAZ L" + - "AGU LOGR LRUNIC LETTER DOTTED-LRUNIC LETTER INGWAZRUNIC LETTER INGRUNIC " + - "LETTER DAGAZ DAEG DRUNIC LETTER OTHALAN ETHEL ORUNIC LETTER EARRUNIC LET" + - "TER IORRUNIC LETTER CWEORTHRUNIC LETTER CALCRUNIC LETTER CEALCRUNIC LETT" + - "ER STANRUNIC LETTER LONG-BRANCH-YRRUNIC LETTER SHORT-TWIG-YRRUNIC LETTER" + - " ICELANDIC-YRRUNIC LETTER QRUNIC LETTER XRUNIC SINGLE PUNCTUATIONRUNIC M" + - "ULTIPLE PUNCTUATIONRUNIC CROSS PUNCTUATIONRUNIC ARLAUG SYMBOLRUNIC TVIMA" + - "DUR SYMBOLRUNIC BELGTHOR SYMBOLRUNIC LETTER KRUNIC LETTER SHRUNIC LETTER") + ("" + - " OORUNIC LETTER FRANKS CASKET OSRUNIC LETTER FRANKS CASKET ISRUNIC LETTE" + - "R FRANKS CASKET EHRUNIC LETTER FRANKS CASKET ACRUNIC LETTER FRANKS CASKE" + - "T AESCTAGALOG LETTER ATAGALOG LETTER ITAGALOG LETTER UTAGALOG LETTER KAT" + - "AGALOG LETTER GATAGALOG LETTER NGATAGALOG LETTER TATAGALOG LETTER DATAGA" + - "LOG LETTER NATAGALOG LETTER PATAGALOG LETTER BATAGALOG LETTER MATAGALOG " + - "LETTER YATAGALOG LETTER LATAGALOG LETTER WATAGALOG LETTER SATAGALOG LETT" + - "ER HATAGALOG VOWEL SIGN ITAGALOG VOWEL SIGN UTAGALOG SIGN VIRAMAHANUNOO " + - "LETTER AHANUNOO LETTER IHANUNOO LETTER UHANUNOO LETTER KAHANUNOO LETTER " + - "GAHANUNOO LETTER NGAHANUNOO LETTER TAHANUNOO LETTER DAHANUNOO LETTER NAH" + - "ANUNOO LETTER PAHANUNOO LETTER BAHANUNOO LETTER MAHANUNOO LETTER YAHANUN" + - "OO LETTER RAHANUNOO LETTER LAHANUNOO LETTER WAHANUNOO LETTER SAHANUNOO L" + - "ETTER HAHANUNOO VOWEL SIGN IHANUNOO VOWEL SIGN UHANUNOO SIGN PAMUDPODPHI" + - "LIPPINE SINGLE PUNCTUATIONPHILIPPINE DOUBLE PUNCTUATIONBUHID LETTER ABUH" + - "ID LETTER IBUHID LETTER UBUHID LETTER KABUHID LETTER GABUHID LETTER NGAB" + - "UHID LETTER TABUHID LETTER DABUHID LETTER NABUHID LETTER PABUHID LETTER " + - "BABUHID LETTER MABUHID LETTER YABUHID LETTER RABUHID LETTER LABUHID LETT" + - "ER WABUHID LETTER SABUHID LETTER HABUHID VOWEL SIGN IBUHID VOWEL SIGN UT" + - "AGBANWA LETTER ATAGBANWA LETTER ITAGBANWA LETTER UTAGBANWA LETTER KATAGB" + - "ANWA LETTER GATAGBANWA LETTER NGATAGBANWA LETTER TATAGBANWA LETTER DATAG" + - "BANWA LETTER NATAGBANWA LETTER PATAGBANWA LETTER BATAGBANWA LETTER MATAG" + - "BANWA LETTER YATAGBANWA LETTER LATAGBANWA LETTER WATAGBANWA LETTER SATAG" + - "BANWA VOWEL SIGN ITAGBANWA VOWEL SIGN UKHMER LETTER KAKHMER LETTER KHAKH" + - "MER LETTER KOKHMER LETTER KHOKHMER LETTER NGOKHMER LETTER CAKHMER LETTER" + - " CHAKHMER LETTER COKHMER LETTER CHOKHMER LETTER NYOKHMER LETTER DAKHMER " + - "LETTER TTHAKHMER LETTER DOKHMER LETTER TTHOKHMER LETTER NNOKHMER LETTER " + - "TAKHMER LETTER THAKHMER LETTER TOKHMER LETTER THOKHMER LETTER NOKHMER LE" + - "TTER BAKHMER LETTER PHAKHMER LETTER POKHMER LETTER PHOKHMER LETTER MOKHM" + - "ER LETTER YOKHMER LETTER ROKHMER LETTER LOKHMER LETTER VOKHMER LETTER SH" + - "AKHMER LETTER SSOKHMER LETTER SAKHMER LETTER HAKHMER LETTER LAKHMER LETT" + - "ER QAKHMER INDEPENDENT VOWEL QAQKHMER INDEPENDENT VOWEL QAAKHMER INDEPEN" + - "DENT VOWEL QIKHMER INDEPENDENT VOWEL QIIKHMER INDEPENDENT VOWEL QUKHMER " + - "INDEPENDENT VOWEL QUKKHMER INDEPENDENT VOWEL QUUKHMER INDEPENDENT VOWEL " + - "QUUVKHMER INDEPENDENT VOWEL RYKHMER INDEPENDENT VOWEL RYYKHMER INDEPENDE" + - "NT VOWEL LYKHMER INDEPENDENT VOWEL LYYKHMER INDEPENDENT VOWEL QEKHMER IN" + - "DEPENDENT VOWEL QAIKHMER INDEPENDENT VOWEL QOO TYPE ONEKHMER INDEPENDENT" + - " VOWEL QOO TYPE TWOKHMER INDEPENDENT VOWEL QAUKHMER VOWEL INHERENT AQKHM" + - "ER VOWEL INHERENT AAKHMER VOWEL SIGN AAKHMER VOWEL SIGN IKHMER VOWEL SIG" + - "N IIKHMER VOWEL SIGN YKHMER VOWEL SIGN YYKHMER VOWEL SIGN UKHMER VOWEL S" + - "IGN UUKHMER VOWEL SIGN UAKHMER VOWEL SIGN OEKHMER VOWEL SIGN YAKHMER VOW" + - "EL SIGN IEKHMER VOWEL SIGN EKHMER VOWEL SIGN AEKHMER VOWEL SIGN AIKHMER " + - "VOWEL SIGN OOKHMER VOWEL SIGN AUKHMER SIGN NIKAHITKHMER SIGN REAHMUKKHME" + - "R SIGN YUUKALEAPINTUKHMER SIGN MUUSIKATOANKHMER SIGN TRIISAPKHMER SIGN B" + - "ANTOCKHMER SIGN ROBATKHMER SIGN TOANDAKHIATKHMER SIGN KAKABATKHMER SIGN " + - "AHSDAKHMER SIGN SAMYOK SANNYAKHMER SIGN VIRIAMKHMER SIGN COENGKHMER SIGN" + - " BATHAMASATKHMER SIGN KHANKHMER SIGN BARIYOOSANKHMER SIGN CAMNUC PII KUU" + - "HKHMER SIGN LEK TOOKHMER SIGN BEYYALKHMER SIGN PHNAEK MUANKHMER SIGN KOO" + - "MUUTKHMER CURRENCY SYMBOL RIELKHMER SIGN AVAKRAHASANYAKHMER SIGN ATTHACA" + - "NKHMER DIGIT ZEROKHMER DIGIT ONEKHMER DIGIT TWOKHMER DIGIT THREEKHMER DI" + - "GIT FOURKHMER DIGIT FIVEKHMER DIGIT SIXKHMER DIGIT SEVENKHMER DIGIT EIGH" + - "TKHMER DIGIT NINEKHMER SYMBOL LEK ATTAK SONKHMER SYMBOL LEK ATTAK MUOYKH" + - "MER SYMBOL LEK ATTAK PIIKHMER SYMBOL LEK ATTAK BEIKHMER SYMBOL LEK ATTAK" + - " BUONKHMER SYMBOL LEK ATTAK PRAMKHMER SYMBOL LEK ATTAK PRAM-MUOYKHMER SY" + - "MBOL LEK ATTAK PRAM-PIIKHMER SYMBOL LEK ATTAK PRAM-BEIKHMER SYMBOL LEK A" + - "TTAK PRAM-BUONMONGOLIAN BIRGAMONGOLIAN ELLIPSISMONGOLIAN COMMAMONGOLIAN " + - "FULL STOPMONGOLIAN COLONMONGOLIAN FOUR DOTSMONGOLIAN TODO SOFT HYPHENMON" + - "GOLIAN SIBE SYLLABLE BOUNDARY MARKERMONGOLIAN MANCHU COMMAMONGOLIAN MANC" + - "HU FULL STOPMONGOLIAN NIRUGUMONGOLIAN FREE VARIATION SELECTOR ONEMONGOLI" + - "AN FREE VARIATION SELECTOR TWOMONGOLIAN FREE VARIATION SELECTOR THREEMON" + - "GOLIAN VOWEL SEPARATORMONGOLIAN DIGIT ZEROMONGOLIAN DIGIT ONEMONGOLIAN D" + - "IGIT TWOMONGOLIAN DIGIT THREEMONGOLIAN DIGIT FOURMONGOLIAN DIGIT FIVEMON" + - "GOLIAN DIGIT SIXMONGOLIAN DIGIT SEVENMONGOLIAN DIGIT EIGHTMONGOLIAN DIGI" + - "T NINEMONGOLIAN LETTER AMONGOLIAN LETTER EMONGOLIAN LETTER IMONGOLIAN LE" + - "TTER OMONGOLIAN LETTER UMONGOLIAN LETTER OEMONGOLIAN LETTER UEMONGOLIAN " + - "LETTER EEMONGOLIAN LETTER NAMONGOLIAN LETTER ANGMONGOLIAN LETTER BAMONGO") + ("" + - "LIAN LETTER PAMONGOLIAN LETTER QAMONGOLIAN LETTER GAMONGOLIAN LETTER MAM" + - "ONGOLIAN LETTER LAMONGOLIAN LETTER SAMONGOLIAN LETTER SHAMONGOLIAN LETTE" + - "R TAMONGOLIAN LETTER DAMONGOLIAN LETTER CHAMONGOLIAN LETTER JAMONGOLIAN " + - "LETTER YAMONGOLIAN LETTER RAMONGOLIAN LETTER WAMONGOLIAN LETTER FAMONGOL" + - "IAN LETTER KAMONGOLIAN LETTER KHAMONGOLIAN LETTER TSAMONGOLIAN LETTER ZA" + - "MONGOLIAN LETTER HAAMONGOLIAN LETTER ZRAMONGOLIAN LETTER LHAMONGOLIAN LE" + - "TTER ZHIMONGOLIAN LETTER CHIMONGOLIAN LETTER TODO LONG VOWEL SIGNMONGOLI" + - "AN LETTER TODO EMONGOLIAN LETTER TODO IMONGOLIAN LETTER TODO OMONGOLIAN " + - "LETTER TODO UMONGOLIAN LETTER TODO OEMONGOLIAN LETTER TODO UEMONGOLIAN L" + - "ETTER TODO ANGMONGOLIAN LETTER TODO BAMONGOLIAN LETTER TODO PAMONGOLIAN " + - "LETTER TODO QAMONGOLIAN LETTER TODO GAMONGOLIAN LETTER TODO MAMONGOLIAN " + - "LETTER TODO TAMONGOLIAN LETTER TODO DAMONGOLIAN LETTER TODO CHAMONGOLIAN" + - " LETTER TODO JAMONGOLIAN LETTER TODO TSAMONGOLIAN LETTER TODO YAMONGOLIA" + - "N LETTER TODO WAMONGOLIAN LETTER TODO KAMONGOLIAN LETTER TODO GAAMONGOLI" + - "AN LETTER TODO HAAMONGOLIAN LETTER TODO JIAMONGOLIAN LETTER TODO NIAMONG" + - "OLIAN LETTER TODO DZAMONGOLIAN LETTER SIBE EMONGOLIAN LETTER SIBE IMONGO" + - "LIAN LETTER SIBE IYMONGOLIAN LETTER SIBE UEMONGOLIAN LETTER SIBE UMONGOL" + - "IAN LETTER SIBE ANGMONGOLIAN LETTER SIBE KAMONGOLIAN LETTER SIBE GAMONGO" + - "LIAN LETTER SIBE HAMONGOLIAN LETTER SIBE PAMONGOLIAN LETTER SIBE SHAMONG" + - "OLIAN LETTER SIBE TAMONGOLIAN LETTER SIBE DAMONGOLIAN LETTER SIBE JAMONG" + - "OLIAN LETTER SIBE FAMONGOLIAN LETTER SIBE GAAMONGOLIAN LETTER SIBE HAAMO" + - "NGOLIAN LETTER SIBE TSAMONGOLIAN LETTER SIBE ZAMONGOLIAN LETTER SIBE RAA" + - "MONGOLIAN LETTER SIBE CHAMONGOLIAN LETTER SIBE ZHAMONGOLIAN LETTER MANCH" + - "U IMONGOLIAN LETTER MANCHU KAMONGOLIAN LETTER MANCHU RAMONGOLIAN LETTER " + - "MANCHU FAMONGOLIAN LETTER MANCHU ZHAMONGOLIAN LETTER ALI GALI ANUSVARA O" + - "NEMONGOLIAN LETTER ALI GALI VISARGA ONEMONGOLIAN LETTER ALI GALI DAMARUM" + - "ONGOLIAN LETTER ALI GALI UBADAMAMONGOLIAN LETTER ALI GALI INVERTED UBADA" + - "MAMONGOLIAN LETTER ALI GALI BALUDAMONGOLIAN LETTER ALI GALI THREE BALUDA" + - "MONGOLIAN LETTER ALI GALI AMONGOLIAN LETTER ALI GALI IMONGOLIAN LETTER A" + - "LI GALI KAMONGOLIAN LETTER ALI GALI NGAMONGOLIAN LETTER ALI GALI CAMONGO" + - "LIAN LETTER ALI GALI TTAMONGOLIAN LETTER ALI GALI TTHAMONGOLIAN LETTER A" + - "LI GALI DDAMONGOLIAN LETTER ALI GALI NNAMONGOLIAN LETTER ALI GALI TAMONG" + - "OLIAN LETTER ALI GALI DAMONGOLIAN LETTER ALI GALI PAMONGOLIAN LETTER ALI" + - " GALI PHAMONGOLIAN LETTER ALI GALI SSAMONGOLIAN LETTER ALI GALI ZHAMONGO" + - "LIAN LETTER ALI GALI ZAMONGOLIAN LETTER ALI GALI AHMONGOLIAN LETTER TODO" + - " ALI GALI TAMONGOLIAN LETTER TODO ALI GALI ZHAMONGOLIAN LETTER MANCHU AL" + - "I GALI GHAMONGOLIAN LETTER MANCHU ALI GALI NGAMONGOLIAN LETTER MANCHU AL" + - "I GALI CAMONGOLIAN LETTER MANCHU ALI GALI JHAMONGOLIAN LETTER MANCHU ALI" + - " GALI TTAMONGOLIAN LETTER MANCHU ALI GALI DDHAMONGOLIAN LETTER MANCHU AL" + - "I GALI TAMONGOLIAN LETTER MANCHU ALI GALI DHAMONGOLIAN LETTER MANCHU ALI" + - " GALI SSAMONGOLIAN LETTER MANCHU ALI GALI CYAMONGOLIAN LETTER MANCHU ALI" + - " GALI ZHAMONGOLIAN LETTER MANCHU ALI GALI ZAMONGOLIAN LETTER ALI GALI HA" + - "LF UMONGOLIAN LETTER ALI GALI HALF YAMONGOLIAN LETTER MANCHU ALI GALI BH" + - "AMONGOLIAN LETTER ALI GALI DAGALGAMONGOLIAN LETTER MANCHU ALI GALI LHACA" + - "NADIAN SYLLABICS OYCANADIAN SYLLABICS AYCANADIAN SYLLABICS AAYCANADIAN S" + - "YLLABICS WAYCANADIAN SYLLABICS POYCANADIAN SYLLABICS PAYCANADIAN SYLLABI" + - "CS PWOYCANADIAN SYLLABICS TAYCANADIAN SYLLABICS KAYCANADIAN SYLLABICS KW" + - "AYCANADIAN SYLLABICS MAYCANADIAN SYLLABICS NOYCANADIAN SYLLABICS NAYCANA" + - "DIAN SYLLABICS LAYCANADIAN SYLLABICS SOYCANADIAN SYLLABICS SAYCANADIAN S" + - "YLLABICS SHOYCANADIAN SYLLABICS SHAYCANADIAN SYLLABICS SHWOYCANADIAN SYL" + - "LABICS YOYCANADIAN SYLLABICS YAYCANADIAN SYLLABICS RAYCANADIAN SYLLABICS" + - " NWICANADIAN SYLLABICS OJIBWAY NWICANADIAN SYLLABICS NWIICANADIAN SYLLAB" + - "ICS OJIBWAY NWIICANADIAN SYLLABICS NWOCANADIAN SYLLABICS OJIBWAY NWOCANA" + - "DIAN SYLLABICS NWOOCANADIAN SYLLABICS OJIBWAY NWOOCANADIAN SYLLABICS RWE" + - "ECANADIAN SYLLABICS RWICANADIAN SYLLABICS RWIICANADIAN SYLLABICS RWOCANA" + - "DIAN SYLLABICS RWOOCANADIAN SYLLABICS RWACANADIAN SYLLABICS OJIBWAY PCAN" + - "ADIAN SYLLABICS OJIBWAY TCANADIAN SYLLABICS OJIBWAY KCANADIAN SYLLABICS " + - "OJIBWAY CCANADIAN SYLLABICS OJIBWAY MCANADIAN SYLLABICS OJIBWAY NCANADIA" + - "N SYLLABICS OJIBWAY SCANADIAN SYLLABICS OJIBWAY SHCANADIAN SYLLABICS EAS" + - "TERN WCANADIAN SYLLABICS WESTERN WCANADIAN SYLLABICS FINAL SMALL RINGCAN" + - "ADIAN SYLLABICS FINAL RAISED DOTCANADIAN SYLLABICS R-CREE RWECANADIAN SY" + - "LLABICS WEST-CREE LOOCANADIAN SYLLABICS WEST-CREE LAACANADIAN SYLLABICS " + - "THWECANADIAN SYLLABICS THWACANADIAN SYLLABICS TTHWECANADIAN SYLLABICS TT" + - "HOOCANADIAN SYLLABICS TTHAACANADIAN SYLLABICS TLHWECANADIAN SYLLABICS TL") + ("" + - "HOOCANADIAN SYLLABICS SAYISI SHWECANADIAN SYLLABICS SAYISI SHOOCANADIAN " + - "SYLLABICS SAYISI HOOCANADIAN SYLLABICS CARRIER GWUCANADIAN SYLLABICS CAR" + - "RIER DENE GEECANADIAN SYLLABICS CARRIER GAACANADIAN SYLLABICS CARRIER GW" + - "ACANADIAN SYLLABICS SAYISI JUUCANADIAN SYLLABICS CARRIER JWACANADIAN SYL" + - "LABICS BEAVER DENE LCANADIAN SYLLABICS BEAVER DENE RCANADIAN SYLLABICS C" + - "ARRIER DENTAL SLIMBU VOWEL-CARRIER LETTERLIMBU LETTER KALIMBU LETTER KHA" + - "LIMBU LETTER GALIMBU LETTER GHALIMBU LETTER NGALIMBU LETTER CALIMBU LETT" + - "ER CHALIMBU LETTER JALIMBU LETTER JHALIMBU LETTER YANLIMBU LETTER TALIMB" + - "U LETTER THALIMBU LETTER DALIMBU LETTER DHALIMBU LETTER NALIMBU LETTER P" + - "ALIMBU LETTER PHALIMBU LETTER BALIMBU LETTER BHALIMBU LETTER MALIMBU LET" + - "TER YALIMBU LETTER RALIMBU LETTER LALIMBU LETTER WALIMBU LETTER SHALIMBU" + - " LETTER SSALIMBU LETTER SALIMBU LETTER HALIMBU LETTER GYANLIMBU LETTER T" + - "RALIMBU VOWEL SIGN ALIMBU VOWEL SIGN ILIMBU VOWEL SIGN ULIMBU VOWEL SIGN" + - " EELIMBU VOWEL SIGN AILIMBU VOWEL SIGN OOLIMBU VOWEL SIGN AULIMBU VOWEL " + - "SIGN ELIMBU VOWEL SIGN OLIMBU SUBJOINED LETTER YALIMBU SUBJOINED LETTER " + - "RALIMBU SUBJOINED LETTER WALIMBU SMALL LETTER KALIMBU SMALL LETTER NGALI" + - "MBU SMALL LETTER ANUSVARALIMBU SMALL LETTER TALIMBU SMALL LETTER NALIMBU" + - " SMALL LETTER PALIMBU SMALL LETTER MALIMBU SMALL LETTER RALIMBU SMALL LE" + - "TTER LALIMBU SIGN MUKPHRENGLIMBU SIGN KEMPHRENGLIMBU SIGN SA-ILIMBU SIGN" + - " LOOLIMBU EXCLAMATION MARKLIMBU QUESTION MARKLIMBU DIGIT ZEROLIMBU DIGIT" + - " ONELIMBU DIGIT TWOLIMBU DIGIT THREELIMBU DIGIT FOURLIMBU DIGIT FIVELIMB" + - "U DIGIT SIXLIMBU DIGIT SEVENLIMBU DIGIT EIGHTLIMBU DIGIT NINETAI LE LETT" + - "ER KATAI LE LETTER XATAI LE LETTER NGATAI LE LETTER TSATAI LE LETTER SAT" + - "AI LE LETTER YATAI LE LETTER TATAI LE LETTER THATAI LE LETTER LATAI LE L" + - "ETTER PATAI LE LETTER PHATAI LE LETTER MATAI LE LETTER FATAI LE LETTER V" + - "ATAI LE LETTER HATAI LE LETTER QATAI LE LETTER KHATAI LE LETTER TSHATAI " + - "LE LETTER NATAI LE LETTER ATAI LE LETTER ITAI LE LETTER EETAI LE LETTER " + - "EHTAI LE LETTER UTAI LE LETTER OOTAI LE LETTER OTAI LE LETTER UETAI LE L" + - "ETTER ETAI LE LETTER AUETAI LE LETTER AITAI LE LETTER TONE-2TAI LE LETTE" + - "R TONE-3TAI LE LETTER TONE-4TAI LE LETTER TONE-5TAI LE LETTER TONE-6NEW " + - "TAI LUE LETTER HIGH QANEW TAI LUE LETTER LOW QANEW TAI LUE LETTER HIGH K" + - "ANEW TAI LUE LETTER HIGH XANEW TAI LUE LETTER HIGH NGANEW TAI LUE LETTER" + - " LOW KANEW TAI LUE LETTER LOW XANEW TAI LUE LETTER LOW NGANEW TAI LUE LE" + - "TTER HIGH TSANEW TAI LUE LETTER HIGH SANEW TAI LUE LETTER HIGH YANEW TAI" + - " LUE LETTER LOW TSANEW TAI LUE LETTER LOW SANEW TAI LUE LETTER LOW YANEW" + - " TAI LUE LETTER HIGH TANEW TAI LUE LETTER HIGH THANEW TAI LUE LETTER HIG" + - "H NANEW TAI LUE LETTER LOW TANEW TAI LUE LETTER LOW THANEW TAI LUE LETTE" + - "R LOW NANEW TAI LUE LETTER HIGH PANEW TAI LUE LETTER HIGH PHANEW TAI LUE" + - " LETTER HIGH MANEW TAI LUE LETTER LOW PANEW TAI LUE LETTER LOW PHANEW TA" + - "I LUE LETTER LOW MANEW TAI LUE LETTER HIGH FANEW TAI LUE LETTER HIGH VAN" + - "EW TAI LUE LETTER HIGH LANEW TAI LUE LETTER LOW FANEW TAI LUE LETTER LOW" + - " VANEW TAI LUE LETTER LOW LANEW TAI LUE LETTER HIGH HANEW TAI LUE LETTER" + - " HIGH DANEW TAI LUE LETTER HIGH BANEW TAI LUE LETTER LOW HANEW TAI LUE L" + - "ETTER LOW DANEW TAI LUE LETTER LOW BANEW TAI LUE LETTER HIGH KVANEW TAI " + - "LUE LETTER HIGH XVANEW TAI LUE LETTER LOW KVANEW TAI LUE LETTER LOW XVAN" + - "EW TAI LUE LETTER HIGH SUANEW TAI LUE LETTER LOW SUANEW TAI LUE VOWEL SI" + - "GN VOWEL SHORTENERNEW TAI LUE VOWEL SIGN AANEW TAI LUE VOWEL SIGN IINEW " + - "TAI LUE VOWEL SIGN UNEW TAI LUE VOWEL SIGN UUNEW TAI LUE VOWEL SIGN ENEW" + - " TAI LUE VOWEL SIGN AENEW TAI LUE VOWEL SIGN ONEW TAI LUE VOWEL SIGN OAN" + - "EW TAI LUE VOWEL SIGN UENEW TAI LUE VOWEL SIGN AYNEW TAI LUE VOWEL SIGN " + - "AAYNEW TAI LUE VOWEL SIGN UYNEW TAI LUE VOWEL SIGN OYNEW TAI LUE VOWEL S" + - "IGN OAYNEW TAI LUE VOWEL SIGN UEYNEW TAI LUE VOWEL SIGN IYNEW TAI LUE LE" + - "TTER FINAL VNEW TAI LUE LETTER FINAL NGNEW TAI LUE LETTER FINAL NNEW TAI" + - " LUE LETTER FINAL MNEW TAI LUE LETTER FINAL KNEW TAI LUE LETTER FINAL DN" + - "EW TAI LUE LETTER FINAL BNEW TAI LUE TONE MARK-1NEW TAI LUE TONE MARK-2N" + - "EW TAI LUE DIGIT ZERONEW TAI LUE DIGIT ONENEW TAI LUE DIGIT TWONEW TAI L" + - "UE DIGIT THREENEW TAI LUE DIGIT FOURNEW TAI LUE DIGIT FIVENEW TAI LUE DI" + - "GIT SIXNEW TAI LUE DIGIT SEVENNEW TAI LUE DIGIT EIGHTNEW TAI LUE DIGIT N" + - "INENEW TAI LUE THAM DIGIT ONENEW TAI LUE SIGN LAENEW TAI LUE SIGN LAEVKH" + - "MER SYMBOL PATHAMASATKHMER SYMBOL MUOY KOETKHMER SYMBOL PII KOETKHMER SY" + - "MBOL BEI KOETKHMER SYMBOL BUON KOETKHMER SYMBOL PRAM KOETKHMER SYMBOL PR" + - "AM-MUOY KOETKHMER SYMBOL PRAM-PII KOETKHMER SYMBOL PRAM-BEI KOETKHMER SY" + - "MBOL PRAM-BUON KOETKHMER SYMBOL DAP KOETKHMER SYMBOL DAP-MUOY KOETKHMER " + - "SYMBOL DAP-PII KOETKHMER SYMBOL DAP-BEI KOETKHMER SYMBOL DAP-BUON KOETKH") + ("" + - "MER SYMBOL DAP-PRAM KOETKHMER SYMBOL TUTEYASATKHMER SYMBOL MUOY ROCKHMER" + - " SYMBOL PII ROCKHMER SYMBOL BEI ROCKHMER SYMBOL BUON ROCKHMER SYMBOL PRA" + - "M ROCKHMER SYMBOL PRAM-MUOY ROCKHMER SYMBOL PRAM-PII ROCKHMER SYMBOL PRA" + - "M-BEI ROCKHMER SYMBOL PRAM-BUON ROCKHMER SYMBOL DAP ROCKHMER SYMBOL DAP-" + - "MUOY ROCKHMER SYMBOL DAP-PII ROCKHMER SYMBOL DAP-BEI ROCKHMER SYMBOL DAP" + - "-BUON ROCKHMER SYMBOL DAP-PRAM ROCBUGINESE LETTER KABUGINESE LETTER GABU" + - "GINESE LETTER NGABUGINESE LETTER NGKABUGINESE LETTER PABUGINESE LETTER B" + - "ABUGINESE LETTER MABUGINESE LETTER MPABUGINESE LETTER TABUGINESE LETTER " + - "DABUGINESE LETTER NABUGINESE LETTER NRABUGINESE LETTER CABUGINESE LETTER" + - " JABUGINESE LETTER NYABUGINESE LETTER NYCABUGINESE LETTER YABUGINESE LET" + - "TER RABUGINESE LETTER LABUGINESE LETTER VABUGINESE LETTER SABUGINESE LET" + - "TER ABUGINESE LETTER HABUGINESE VOWEL SIGN IBUGINESE VOWEL SIGN UBUGINES" + - "E VOWEL SIGN EBUGINESE VOWEL SIGN OBUGINESE VOWEL SIGN AEBUGINESE PALLAW" + - "ABUGINESE END OF SECTIONTAI THAM LETTER HIGH KATAI THAM LETTER HIGH KHAT" + - "AI THAM LETTER HIGH KXATAI THAM LETTER LOW KATAI THAM LETTER LOW KXATAI " + - "THAM LETTER LOW KHATAI THAM LETTER NGATAI THAM LETTER HIGH CATAI THAM LE" + - "TTER HIGH CHATAI THAM LETTER LOW CATAI THAM LETTER LOW SATAI THAM LETTER" + - " LOW CHATAI THAM LETTER NYATAI THAM LETTER RATATAI THAM LETTER HIGH RATH" + - "ATAI THAM LETTER DATAI THAM LETTER LOW RATHATAI THAM LETTER RANATAI THAM" + - " LETTER HIGH TATAI THAM LETTER HIGH THATAI THAM LETTER LOW TATAI THAM LE" + - "TTER LOW THATAI THAM LETTER NATAI THAM LETTER BATAI THAM LETTER HIGH PAT" + - "AI THAM LETTER HIGH PHATAI THAM LETTER HIGH FATAI THAM LETTER LOW PATAI " + - "THAM LETTER LOW FATAI THAM LETTER LOW PHATAI THAM LETTER MATAI THAM LETT" + - "ER LOW YATAI THAM LETTER HIGH YATAI THAM LETTER RATAI THAM LETTER RUETAI" + - " THAM LETTER LATAI THAM LETTER LUETAI THAM LETTER WATAI THAM LETTER HIGH" + - " SHATAI THAM LETTER HIGH SSATAI THAM LETTER HIGH SATAI THAM LETTER HIGH " + - "HATAI THAM LETTER LLATAI THAM LETTER ATAI THAM LETTER LOW HATAI THAM LET" + - "TER ITAI THAM LETTER IITAI THAM LETTER UTAI THAM LETTER UUTAI THAM LETTE" + - "R EETAI THAM LETTER OOTAI THAM LETTER LAETAI THAM LETTER GREAT SATAI THA" + - "M CONSONANT SIGN MEDIAL RATAI THAM CONSONANT SIGN MEDIAL LATAI THAM CONS" + - "ONANT SIGN LA TANG LAITAI THAM SIGN MAI KANG LAITAI THAM CONSONANT SIGN " + - "FINAL NGATAI THAM CONSONANT SIGN LOW PATAI THAM CONSONANT SIGN HIGH RATH" + - "A OR LOW PATAI THAM CONSONANT SIGN MATAI THAM CONSONANT SIGN BATAI THAM " + - "CONSONANT SIGN SATAI THAM SIGN SAKOTTAI THAM VOWEL SIGN ATAI THAM VOWEL " + - "SIGN MAI SATTAI THAM VOWEL SIGN AATAI THAM VOWEL SIGN TALL AATAI THAM VO" + - "WEL SIGN ITAI THAM VOWEL SIGN IITAI THAM VOWEL SIGN UETAI THAM VOWEL SIG" + - "N UUETAI THAM VOWEL SIGN UTAI THAM VOWEL SIGN UUTAI THAM VOWEL SIGN OTAI" + - " THAM VOWEL SIGN OA BELOWTAI THAM VOWEL SIGN OYTAI THAM VOWEL SIGN ETAI " + - "THAM VOWEL SIGN AETAI THAM VOWEL SIGN OOTAI THAM VOWEL SIGN AITAI THAM V" + - "OWEL SIGN THAM AITAI THAM VOWEL SIGN OA ABOVETAI THAM SIGN MAI KANGTAI T" + - "HAM SIGN TONE-1TAI THAM SIGN TONE-2TAI THAM SIGN KHUEN TONE-3TAI THAM SI" + - "GN KHUEN TONE-4TAI THAM SIGN KHUEN TONE-5TAI THAM SIGN RA HAAMTAI THAM S" + - "IGN MAI SAMTAI THAM SIGN KHUEN-LUE KARANTAI THAM COMBINING CRYPTOGRAMMIC" + - " DOTTAI THAM HORA DIGIT ZEROTAI THAM HORA DIGIT ONETAI THAM HORA DIGIT T" + - "WOTAI THAM HORA DIGIT THREETAI THAM HORA DIGIT FOURTAI THAM HORA DIGIT F" + - "IVETAI THAM HORA DIGIT SIXTAI THAM HORA DIGIT SEVENTAI THAM HORA DIGIT E" + - "IGHTTAI THAM HORA DIGIT NINETAI THAM THAM DIGIT ZEROTAI THAM THAM DIGIT " + - "ONETAI THAM THAM DIGIT TWOTAI THAM THAM DIGIT THREETAI THAM THAM DIGIT F" + - "OURTAI THAM THAM DIGIT FIVETAI THAM THAM DIGIT SIXTAI THAM THAM DIGIT SE" + - "VENTAI THAM THAM DIGIT EIGHTTAI THAM THAM DIGIT NINETAI THAM SIGN WIANGT" + - "AI THAM SIGN WIANGWAAKTAI THAM SIGN SAWANTAI THAM SIGN KEOWTAI THAM SIGN" + - " HOYTAI THAM SIGN DOKMAITAI THAM SIGN REVERSED ROTATED RANATAI THAM SIGN" + - " MAI YAMOKTAI THAM SIGN KAANTAI THAM SIGN KAANKUUTAI THAM SIGN SATKAANTA" + - "I THAM SIGN SATKAANKUUTAI THAM SIGN HANGTAI THAM SIGN CAANGCOMBINING DOU" + - "BLED CIRCUMFLEX ACCENTCOMBINING DIAERESIS-RINGCOMBINING INFINITYCOMBININ" + - "G DOWNWARDS ARROWCOMBINING TRIPLE DOTCOMBINING X-X BELOWCOMBINING WIGGLY" + - " LINE BELOWCOMBINING OPEN MARK BELOWCOMBINING DOUBLE OPEN MARK BELOWCOMB" + - "INING LIGHT CENTRALIZATION STROKE BELOWCOMBINING STRONG CENTRALIZATION S" + - "TROKE BELOWCOMBINING PARENTHESES ABOVECOMBINING DOUBLE PARENTHESES ABOVE" + - "COMBINING PARENTHESES BELOWCOMBINING PARENTHESES OVERLAYBALINESE SIGN UL" + - "U RICEMBALINESE SIGN ULU CANDRABALINESE SIGN CECEKBALINESE SIGN SURANGBA" + - "LINESE SIGN BISAHBALINESE LETTER AKARABALINESE LETTER AKARA TEDUNGBALINE" + - "SE LETTER IKARABALINESE LETTER IKARA TEDUNGBALINESE LETTER UKARABALINESE" + - " LETTER UKARA TEDUNGBALINESE LETTER RA REPABALINESE LETTER RA REPA TEDUN") + ("" + - "GBALINESE LETTER LA LENGABALINESE LETTER LA LENGA TEDUNGBALINESE LETTER " + - "EKARABALINESE LETTER AIKARABALINESE LETTER OKARABALINESE LETTER OKARA TE" + - "DUNGBALINESE LETTER KABALINESE LETTER KA MAHAPRANABALINESE LETTER GABALI" + - "NESE LETTER GA GORABALINESE LETTER NGABALINESE LETTER CABALINESE LETTER " + - "CA LACABALINESE LETTER JABALINESE LETTER JA JERABALINESE LETTER NYABALIN" + - "ESE LETTER TA LATIKBALINESE LETTER TA MURDA MAHAPRANABALINESE LETTER DA " + - "MURDA ALPAPRANABALINESE LETTER DA MURDA MAHAPRANABALINESE LETTER NA RAMB" + - "ATBALINESE LETTER TABALINESE LETTER TA TAWABALINESE LETTER DABALINESE LE" + - "TTER DA MADUBALINESE LETTER NABALINESE LETTER PABALINESE LETTER PA KAPAL" + - "BALINESE LETTER BABALINESE LETTER BA KEMBANGBALINESE LETTER MABALINESE L" + - "ETTER YABALINESE LETTER RABALINESE LETTER LABALINESE LETTER WABALINESE L" + - "ETTER SA SAGABALINESE LETTER SA SAPABALINESE LETTER SABALINESE LETTER HA" + - "BALINESE SIGN REREKANBALINESE VOWEL SIGN TEDUNGBALINESE VOWEL SIGN ULUBA" + - "LINESE VOWEL SIGN ULU SARIBALINESE VOWEL SIGN SUKUBALINESE VOWEL SIGN SU" + - "KU ILUTBALINESE VOWEL SIGN RA REPABALINESE VOWEL SIGN RA REPA TEDUNGBALI" + - "NESE VOWEL SIGN LA LENGABALINESE VOWEL SIGN LA LENGA TEDUNGBALINESE VOWE" + - "L SIGN TALINGBALINESE VOWEL SIGN TALING REPABALINESE VOWEL SIGN TALING T" + - "EDUNGBALINESE VOWEL SIGN TALING REPA TEDUNGBALINESE VOWEL SIGN PEPETBALI" + - "NESE VOWEL SIGN PEPET TEDUNGBALINESE ADEG ADEGBALINESE LETTER KAF SASAKB" + - "ALINESE LETTER KHOT SASAKBALINESE LETTER TZIR SASAKBALINESE LETTER EF SA" + - "SAKBALINESE LETTER VE SASAKBALINESE LETTER ZAL SASAKBALINESE LETTER ASYU" + - "RA SASAKBALINESE DIGIT ZEROBALINESE DIGIT ONEBALINESE DIGIT TWOBALINESE " + - "DIGIT THREEBALINESE DIGIT FOURBALINESE DIGIT FIVEBALINESE DIGIT SIXBALIN" + - "ESE DIGIT SEVENBALINESE DIGIT EIGHTBALINESE DIGIT NINEBALINESE PANTIBALI" + - "NESE PAMADABALINESE WINDUBALINESE CARIK PAMUNGKAHBALINESE CARIK SIKIBALI" + - "NESE CARIK PARERENBALINESE PAMENENGBALINESE MUSICAL SYMBOL DONGBALINESE " + - "MUSICAL SYMBOL DENGBALINESE MUSICAL SYMBOL DUNGBALINESE MUSICAL SYMBOL D" + - "ANGBALINESE MUSICAL SYMBOL DANG SURANGBALINESE MUSICAL SYMBOL DINGBALINE" + - "SE MUSICAL SYMBOL DAENGBALINESE MUSICAL SYMBOL DEUNGBALINESE MUSICAL SYM" + - "BOL DAINGBALINESE MUSICAL SYMBOL DANG GEDEBALINESE MUSICAL SYMBOL COMBIN" + - "ING TEGEHBALINESE MUSICAL SYMBOL COMBINING ENDEPBALINESE MUSICAL SYMBOL " + - "COMBINING KEMPULBALINESE MUSICAL SYMBOL COMBINING KEMPLIBALINESE MUSICAL" + - " SYMBOL COMBINING JEGOGANBALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH J" + - "EGOGANBALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGANBALINESE MUSI" + - "CAL SYMBOL COMBINING BENDEBALINESE MUSICAL SYMBOL COMBINING GONGBALINESE" + - " MUSICAL SYMBOL RIGHT-HAND OPEN DUGBALINESE MUSICAL SYMBOL RIGHT-HAND OP" + - "EN DAGBALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUKBALINESE MUSICAL SYMB" + - "OL RIGHT-HAND CLOSED TAKBALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANGBALIN" + - "ESE MUSICAL SYMBOL LEFT-HAND OPEN PUNGBALINESE MUSICAL SYMBOL LEFT-HAND " + - "CLOSED PLAKBALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUKBALINESE MUSICAL" + - " SYMBOL LEFT-HAND OPEN PINGSUNDANESE SIGN PANYECEKSUNDANESE SIGN PANGLAY" + - "ARSUNDANESE SIGN PANGWISADSUNDANESE LETTER ASUNDANESE LETTER ISUNDANESE " + - "LETTER USUNDANESE LETTER AESUNDANESE LETTER OSUNDANESE LETTER ESUNDANESE" + - " LETTER EUSUNDANESE LETTER KASUNDANESE LETTER QASUNDANESE LETTER GASUNDA" + - "NESE LETTER NGASUNDANESE LETTER CASUNDANESE LETTER JASUNDANESE LETTER ZA" + - "SUNDANESE LETTER NYASUNDANESE LETTER TASUNDANESE LETTER DASUNDANESE LETT" + - "ER NASUNDANESE LETTER PASUNDANESE LETTER FASUNDANESE LETTER VASUNDANESE " + - "LETTER BASUNDANESE LETTER MASUNDANESE LETTER YASUNDANESE LETTER RASUNDAN" + - "ESE LETTER LASUNDANESE LETTER WASUNDANESE LETTER SASUNDANESE LETTER XASU" + - "NDANESE LETTER HASUNDANESE CONSONANT SIGN PAMINGKALSUNDANESE CONSONANT S" + - "IGN PANYAKRASUNDANESE CONSONANT SIGN PANYIKUSUNDANESE VOWEL SIGN PANGHUL" + - "USUNDANESE VOWEL SIGN PANYUKUSUNDANESE VOWEL SIGN PANAELAENGSUNDANESE VO" + - "WEL SIGN PANOLONGSUNDANESE VOWEL SIGN PAMEPETSUNDANESE VOWEL SIGN PANEUL" + - "EUNGSUNDANESE SIGN PAMAAEHSUNDANESE SIGN VIRAMASUNDANESE CONSONANT SIGN " + - "PASANGAN MASUNDANESE CONSONANT SIGN PASANGAN WASUNDANESE LETTER KHASUNDA" + - "NESE LETTER SYASUNDANESE DIGIT ZEROSUNDANESE DIGIT ONESUNDANESE DIGIT TW" + - "OSUNDANESE DIGIT THREESUNDANESE DIGIT FOURSUNDANESE DIGIT FIVESUNDANESE " + - "DIGIT SIXSUNDANESE DIGIT SEVENSUNDANESE DIGIT EIGHTSUNDANESE DIGIT NINES" + - "UNDANESE AVAGRAHASUNDANESE LETTER REUSUNDANESE LETTER LEUSUNDANESE LETTE" + - "R BHASUNDANESE LETTER FINAL KSUNDANESE LETTER FINAL MBATAK LETTER ABATAK" + - " LETTER SIMALUNGUN ABATAK LETTER HABATAK LETTER SIMALUNGUN HABATAK LETTE" + - "R MANDAILING HABATAK LETTER BABATAK LETTER KARO BABATAK LETTER PABATAK L" + - "ETTER SIMALUNGUN PABATAK LETTER NABATAK LETTER MANDAILING NABATAK LETTER" + - " WABATAK LETTER SIMALUNGUN WABATAK LETTER PAKPAK WABATAK LETTER GABATAK ") + ("" + - "LETTER SIMALUNGUN GABATAK LETTER JABATAK LETTER DABATAK LETTER RABATAK L" + - "ETTER SIMALUNGUN RABATAK LETTER MABATAK LETTER SIMALUNGUN MABATAK LETTER" + - " SOUTHERN TABATAK LETTER NORTHERN TABATAK LETTER SABATAK LETTER SIMALUNG" + - "UN SABATAK LETTER MANDAILING SABATAK LETTER YABATAK LETTER SIMALUNGUN YA" + - "BATAK LETTER NGABATAK LETTER LABATAK LETTER SIMALUNGUN LABATAK LETTER NY" + - "ABATAK LETTER CABATAK LETTER NDABATAK LETTER MBABATAK LETTER IBATAK LETT" + - "ER UBATAK SIGN TOMPIBATAK VOWEL SIGN EBATAK VOWEL SIGN PAKPAK EBATAK VOW" + - "EL SIGN EEBATAK VOWEL SIGN IBATAK VOWEL SIGN KARO IBATAK VOWEL SIGN OBAT" + - "AK VOWEL SIGN KARO OBATAK VOWEL SIGN UBATAK VOWEL SIGN U FOR SIMALUNGUN " + - "SABATAK CONSONANT SIGN NGBATAK CONSONANT SIGN HBATAK PANGOLATBATAK PANON" + - "GONANBATAK SYMBOL BINDU NA METEKBATAK SYMBOL BINDU PINARBORASBATAK SYMBO" + - "L BINDU JUDULBATAK SYMBOL BINDU PANGOLATLEPCHA LETTER KALEPCHA LETTER KL" + - "ALEPCHA LETTER KHALEPCHA LETTER GALEPCHA LETTER GLALEPCHA LETTER NGALEPC" + - "HA LETTER CALEPCHA LETTER CHALEPCHA LETTER JALEPCHA LETTER NYALEPCHA LET" + - "TER TALEPCHA LETTER THALEPCHA LETTER DALEPCHA LETTER NALEPCHA LETTER PAL" + - "EPCHA LETTER PLALEPCHA LETTER PHALEPCHA LETTER FALEPCHA LETTER FLALEPCHA" + - " LETTER BALEPCHA LETTER BLALEPCHA LETTER MALEPCHA LETTER MLALEPCHA LETTE" + - "R TSALEPCHA LETTER TSHALEPCHA LETTER DZALEPCHA LETTER YALEPCHA LETTER RA" + - "LEPCHA LETTER LALEPCHA LETTER HALEPCHA LETTER HLALEPCHA LETTER VALEPCHA " + - "LETTER SALEPCHA LETTER SHALEPCHA LETTER WALEPCHA LETTER ALEPCHA SUBJOINE" + - "D LETTER YALEPCHA SUBJOINED LETTER RALEPCHA VOWEL SIGN AALEPCHA VOWEL SI" + - "GN ILEPCHA VOWEL SIGN OLEPCHA VOWEL SIGN OOLEPCHA VOWEL SIGN ULEPCHA VOW" + - "EL SIGN UULEPCHA VOWEL SIGN ELEPCHA CONSONANT SIGN KLEPCHA CONSONANT SIG" + - "N MLEPCHA CONSONANT SIGN LLEPCHA CONSONANT SIGN NLEPCHA CONSONANT SIGN P" + - "LEPCHA CONSONANT SIGN RLEPCHA CONSONANT SIGN TLEPCHA CONSONANT SIGN NYIN" + - "-DOLEPCHA CONSONANT SIGN KANGLEPCHA SIGN RANLEPCHA SIGN NUKTALEPCHA PUNC" + - "TUATION TA-ROLLEPCHA PUNCTUATION NYET THYOOM TA-ROLLEPCHA PUNCTUATION CE" + - "R-WALEPCHA PUNCTUATION TSHOOK CER-WALEPCHA PUNCTUATION TSHOOKLEPCHA DIGI" + - "T ZEROLEPCHA DIGIT ONELEPCHA DIGIT TWOLEPCHA DIGIT THREELEPCHA DIGIT FOU" + - "RLEPCHA DIGIT FIVELEPCHA DIGIT SIXLEPCHA DIGIT SEVENLEPCHA DIGIT EIGHTLE" + - "PCHA DIGIT NINELEPCHA LETTER TTALEPCHA LETTER TTHALEPCHA LETTER DDAOL CH" + - "IKI DIGIT ZEROOL CHIKI DIGIT ONEOL CHIKI DIGIT TWOOL CHIKI DIGIT THREEOL" + - " CHIKI DIGIT FOUROL CHIKI DIGIT FIVEOL CHIKI DIGIT SIXOL CHIKI DIGIT SEV" + - "ENOL CHIKI DIGIT EIGHTOL CHIKI DIGIT NINEOL CHIKI LETTER LAOL CHIKI LETT" + - "ER ATOL CHIKI LETTER AGOL CHIKI LETTER ANGOL CHIKI LETTER ALOL CHIKI LET" + - "TER LAAOL CHIKI LETTER AAKOL CHIKI LETTER AAJOL CHIKI LETTER AAMOL CHIKI" + - " LETTER AAWOL CHIKI LETTER LIOL CHIKI LETTER ISOL CHIKI LETTER IHOL CHIK" + - "I LETTER INYOL CHIKI LETTER IROL CHIKI LETTER LUOL CHIKI LETTER UCOL CHI" + - "KI LETTER UDOL CHIKI LETTER UNNOL CHIKI LETTER UYOL CHIKI LETTER LEOL CH" + - "IKI LETTER EPOL CHIKI LETTER EDDOL CHIKI LETTER ENOL CHIKI LETTER ERROL " + - "CHIKI LETTER LOOL CHIKI LETTER OTTOL CHIKI LETTER OBOL CHIKI LETTER OVOL" + - " CHIKI LETTER OHOL CHIKI MU TTUDDAGOL CHIKI GAAHLAA TTUDDAAGOL CHIKI MU-" + - "GAAHLAA TTUDDAAGOL CHIKI RELAAOL CHIKI PHAARKAAOL CHIKI AHADOL CHIKI PUN" + - "CTUATION MUCAADOL CHIKI PUNCTUATION DOUBLE MUCAADCYRILLIC SMALL LETTER R" + - "OUNDED VECYRILLIC SMALL LETTER LONG-LEGGED DECYRILLIC SMALL LETTER NARRO" + - "W OCYRILLIC SMALL LETTER WIDE ESCYRILLIC SMALL LETTER TALL TECYRILLIC SM" + - "ALL LETTER THREE-LEGGED TECYRILLIC SMALL LETTER TALL HARD SIGNCYRILLIC S" + - "MALL LETTER TALL YATCYRILLIC SMALL LETTER UNBLENDED UKSUNDANESE PUNCTUAT" + - "ION BINDU SURYASUNDANESE PUNCTUATION BINDU PANGLONGSUNDANESE PUNCTUATION" + - " BINDU PURNAMASUNDANESE PUNCTUATION BINDU CAKRASUNDANESE PUNCTUATION BIN" + - "DU LEU SATANGASUNDANESE PUNCTUATION BINDU KA SATANGASUNDANESE PUNCTUATIO" + - "N BINDU DA SATANGASUNDANESE PUNCTUATION BINDU BA SATANGAVEDIC TONE KARSH" + - "ANAVEDIC TONE SHARAVEDIC TONE PRENKHAVEDIC SIGN NIHSHVASAVEDIC SIGN YAJU" + - "RVEDIC MIDLINE SVARITAVEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARI" + - "TAVEDIC TONE YAJURVEDIC INDEPENDENT SVARITAVEDIC TONE YAJURVEDIC KATHAKA" + - " INDEPENDENT SVARITAVEDIC TONE CANDRA BELOWVEDIC TONE YAJURVEDIC KATHAKA" + - " INDEPENDENT SVARITA SCHROEDERVEDIC TONE DOUBLE SVARITAVEDIC TONE TRIPLE" + - " SVARITAVEDIC TONE KATHAKA ANUDATTAVEDIC TONE DOT BELOWVEDIC TONE TWO DO" + - "TS BELOWVEDIC TONE THREE DOTS BELOWVEDIC TONE RIGVEDIC KASHMIRI INDEPEND" + - "ENT SVARITAVEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITAVEDIC SIGN VISARGA" + - " SVARITAVEDIC SIGN VISARGA UDATTAVEDIC SIGN REVERSED VISARGA UDATTAVEDIC" + - " SIGN VISARGA ANUDATTAVEDIC SIGN REVERSED VISARGA ANUDATTAVEDIC SIGN VIS" + - "ARGA UDATTA WITH TAILVEDIC SIGN VISARGA ANUDATTA WITH TAILVEDIC SIGN ANU" + - "SVARA ANTARGOMUKHAVEDIC SIGN ANUSVARA BAHIRGOMUKHAVEDIC SIGN ANUSVARA VA") + ("" + - "MAGOMUKHAVEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAILVEDIC SIGN TIRYAKVEDIC" + - " SIGN HEXIFORM LONG ANUSVARAVEDIC SIGN LONG ANUSVARAVEDIC SIGN RTHANG LO" + - "NG ANUSVARAVEDIC SIGN ANUSVARA UBHAYATO MUKHAVEDIC SIGN ARDHAVISARGAVEDI" + - "C SIGN ROTATED ARDHAVISARGAVEDIC TONE CANDRA ABOVEVEDIC SIGN JIHVAMULIYA" + - "VEDIC SIGN UPADHMANIYAVEDIC TONE RING ABOVEVEDIC TONE DOUBLE RING ABOVEL" + - "ATIN LETTER SMALL CAPITAL ALATIN LETTER SMALL CAPITAL AELATIN SMALL LETT" + - "ER TURNED AELATIN LETTER SMALL CAPITAL BARRED BLATIN LETTER SMALL CAPITA" + - "L CLATIN LETTER SMALL CAPITAL DLATIN LETTER SMALL CAPITAL ETHLATIN LETTE" + - "R SMALL CAPITAL ELATIN SMALL LETTER TURNED OPEN ELATIN SMALL LETTER TURN" + - "ED ILATIN LETTER SMALL CAPITAL JLATIN LETTER SMALL CAPITAL KLATIN LETTER" + - " SMALL CAPITAL L WITH STROKELATIN LETTER SMALL CAPITAL MLATIN LETTER SMA" + - "LL CAPITAL REVERSED NLATIN LETTER SMALL CAPITAL OLATIN LETTER SMALL CAPI" + - "TAL OPEN OLATIN SMALL LETTER SIDEWAYS OLATIN SMALL LETTER SIDEWAYS OPEN " + - "OLATIN SMALL LETTER SIDEWAYS O WITH STROKELATIN SMALL LETTER TURNED OELA" + - "TIN LETTER SMALL CAPITAL OULATIN SMALL LETTER TOP HALF OLATIN SMALL LETT" + - "ER BOTTOM HALF OLATIN LETTER SMALL CAPITAL PLATIN LETTER SMALL CAPITAL R" + - "EVERSED RLATIN LETTER SMALL CAPITAL TURNED RLATIN LETTER SMALL CAPITAL T" + - "LATIN LETTER SMALL CAPITAL ULATIN SMALL LETTER SIDEWAYS ULATIN SMALL LET" + - "TER SIDEWAYS DIAERESIZED ULATIN SMALL LETTER SIDEWAYS TURNED MLATIN LETT" + - "ER SMALL CAPITAL VLATIN LETTER SMALL CAPITAL WLATIN LETTER SMALL CAPITAL" + - " ZLATIN LETTER SMALL CAPITAL EZHLATIN LETTER VOICED LARYNGEAL SPIRANTLAT" + - "IN LETTER AINGREEK LETTER SMALL CAPITAL GAMMAGREEK LETTER SMALL CAPITAL " + - "LAMDAGREEK LETTER SMALL CAPITAL PIGREEK LETTER SMALL CAPITAL RHOGREEK LE" + - "TTER SMALL CAPITAL PSICYRILLIC LETTER SMALL CAPITAL ELMODIFIER LETTER CA" + - "PITAL AMODIFIER LETTER CAPITAL AEMODIFIER LETTER CAPITAL BMODIFIER LETTE" + - "R CAPITAL BARRED BMODIFIER LETTER CAPITAL DMODIFIER LETTER CAPITAL EMODI" + - "FIER LETTER CAPITAL REVERSED EMODIFIER LETTER CAPITAL GMODIFIER LETTER C" + - "APITAL HMODIFIER LETTER CAPITAL IMODIFIER LETTER CAPITAL JMODIFIER LETTE" + - "R CAPITAL KMODIFIER LETTER CAPITAL LMODIFIER LETTER CAPITAL MMODIFIER LE" + - "TTER CAPITAL NMODIFIER LETTER CAPITAL REVERSED NMODIFIER LETTER CAPITAL " + - "OMODIFIER LETTER CAPITAL OUMODIFIER LETTER CAPITAL PMODIFIER LETTER CAPI" + - "TAL RMODIFIER LETTER CAPITAL TMODIFIER LETTER CAPITAL UMODIFIER LETTER C" + - "APITAL WMODIFIER LETTER SMALL AMODIFIER LETTER SMALL TURNED AMODIFIER LE" + - "TTER SMALL ALPHAMODIFIER LETTER SMALL TURNED AEMODIFIER LETTER SMALL BMO" + - "DIFIER LETTER SMALL DMODIFIER LETTER SMALL EMODIFIER LETTER SMALL SCHWAM" + - "ODIFIER LETTER SMALL OPEN EMODIFIER LETTER SMALL TURNED OPEN EMODIFIER L" + - "ETTER SMALL GMODIFIER LETTER SMALL TURNED IMODIFIER LETTER SMALL KMODIFI" + - "ER LETTER SMALL MMODIFIER LETTER SMALL ENGMODIFIER LETTER SMALL OMODIFIE" + - "R LETTER SMALL OPEN OMODIFIER LETTER SMALL TOP HALF OMODIFIER LETTER SMA" + - "LL BOTTOM HALF OMODIFIER LETTER SMALL PMODIFIER LETTER SMALL TMODIFIER L" + - "ETTER SMALL UMODIFIER LETTER SMALL SIDEWAYS UMODIFIER LETTER SMALL TURNE" + - "D MMODIFIER LETTER SMALL VMODIFIER LETTER SMALL AINMODIFIER LETTER SMALL" + - " BETAMODIFIER LETTER SMALL GREEK GAMMAMODIFIER LETTER SMALL DELTAMODIFIE" + - "R LETTER SMALL GREEK PHIMODIFIER LETTER SMALL CHILATIN SUBSCRIPT SMALL L" + - "ETTER ILATIN SUBSCRIPT SMALL LETTER RLATIN SUBSCRIPT SMALL LETTER ULATIN" + - " SUBSCRIPT SMALL LETTER VGREEK SUBSCRIPT SMALL LETTER BETAGREEK SUBSCRIP" + - "T SMALL LETTER GAMMAGREEK SUBSCRIPT SMALL LETTER RHOGREEK SUBSCRIPT SMAL" + - "L LETTER PHIGREEK SUBSCRIPT SMALL LETTER CHILATIN SMALL LETTER UELATIN S" + - "MALL LETTER B WITH MIDDLE TILDELATIN SMALL LETTER D WITH MIDDLE TILDELAT" + - "IN SMALL LETTER F WITH MIDDLE TILDELATIN SMALL LETTER M WITH MIDDLE TILD" + - "ELATIN SMALL LETTER N WITH MIDDLE TILDELATIN SMALL LETTER P WITH MIDDLE " + - "TILDELATIN SMALL LETTER R WITH MIDDLE TILDELATIN SMALL LETTER R WITH FIS" + - "HHOOK AND MIDDLE TILDELATIN SMALL LETTER S WITH MIDDLE TILDELATIN SMALL " + - "LETTER T WITH MIDDLE TILDELATIN SMALL LETTER Z WITH MIDDLE TILDELATIN SM" + - "ALL LETTER TURNED GMODIFIER LETTER CYRILLIC ENLATIN SMALL LETTER INSULAR" + - " GLATIN SMALL LETTER TH WITH STRIKETHROUGHLATIN SMALL CAPITAL LETTER I W" + - "ITH STROKELATIN SMALL LETTER IOTA WITH STROKELATIN SMALL LETTER P WITH S" + - "TROKELATIN SMALL CAPITAL LETTER U WITH STROKELATIN SMALL LETTER UPSILON " + - "WITH STROKELATIN SMALL LETTER B WITH PALATAL HOOKLATIN SMALL LETTER D WI" + - "TH PALATAL HOOKLATIN SMALL LETTER F WITH PALATAL HOOKLATIN SMALL LETTER " + - "G WITH PALATAL HOOKLATIN SMALL LETTER K WITH PALATAL HOOKLATIN SMALL LET" + - "TER L WITH PALATAL HOOKLATIN SMALL LETTER M WITH PALATAL HOOKLATIN SMALL" + - " LETTER N WITH PALATAL HOOKLATIN SMALL LETTER P WITH PALATAL HOOKLATIN S" + - "MALL LETTER R WITH PALATAL HOOKLATIN SMALL LETTER S WITH PALATAL HOOKLAT") + ("" + - "IN SMALL LETTER ESH WITH PALATAL HOOKLATIN SMALL LETTER V WITH PALATAL H" + - "OOKLATIN SMALL LETTER X WITH PALATAL HOOKLATIN SMALL LETTER Z WITH PALAT" + - "AL HOOKLATIN SMALL LETTER A WITH RETROFLEX HOOKLATIN SMALL LETTER ALPHA " + - "WITH RETROFLEX HOOKLATIN SMALL LETTER D WITH HOOK AND TAILLATIN SMALL LE" + - "TTER E WITH RETROFLEX HOOKLATIN SMALL LETTER OPEN E WITH RETROFLEX HOOKL" + - "ATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOKLATIN SMALL LETTER " + - "SCHWA WITH RETROFLEX HOOKLATIN SMALL LETTER I WITH RETROFLEX HOOKLATIN S" + - "MALL LETTER OPEN O WITH RETROFLEX HOOKLATIN SMALL LETTER ESH WITH RETROF" + - "LEX HOOKLATIN SMALL LETTER U WITH RETROFLEX HOOKLATIN SMALL LETTER EZH W" + - "ITH RETROFLEX HOOKMODIFIER LETTER SMALL TURNED ALPHAMODIFIER LETTER SMAL" + - "L CMODIFIER LETTER SMALL C WITH CURLMODIFIER LETTER SMALL ETHMODIFIER LE" + - "TTER SMALL REVERSED OPEN EMODIFIER LETTER SMALL FMODIFIER LETTER SMALL D" + - "OTLESS J WITH STROKEMODIFIER LETTER SMALL SCRIPT GMODIFIER LETTER SMALL " + - "TURNED HMODIFIER LETTER SMALL I WITH STROKEMODIFIER LETTER SMALL IOTAMOD" + - "IFIER LETTER SMALL CAPITAL IMODIFIER LETTER SMALL CAPITAL I WITH STROKEM" + - "ODIFIER LETTER SMALL J WITH CROSSED-TAILMODIFIER LETTER SMALL L WITH RET" + - "ROFLEX HOOKMODIFIER LETTER SMALL L WITH PALATAL HOOKMODIFIER LETTER SMAL" + - "L CAPITAL LMODIFIER LETTER SMALL M WITH HOOKMODIFIER LETTER SMALL TURNED" + - " M WITH LONG LEGMODIFIER LETTER SMALL N WITH LEFT HOOKMODIFIER LETTER SM" + - "ALL N WITH RETROFLEX HOOKMODIFIER LETTER SMALL CAPITAL NMODIFIER LETTER " + - "SMALL BARRED OMODIFIER LETTER SMALL PHIMODIFIER LETTER SMALL S WITH HOOK" + - "MODIFIER LETTER SMALL ESHMODIFIER LETTER SMALL T WITH PALATAL HOOKMODIFI" + - "ER LETTER SMALL U BARMODIFIER LETTER SMALL UPSILONMODIFIER LETTER SMALL " + - "CAPITAL UMODIFIER LETTER SMALL V WITH HOOKMODIFIER LETTER SMALL TURNED V" + - "MODIFIER LETTER SMALL ZMODIFIER LETTER SMALL Z WITH RETROFLEX HOOKMODIFI" + - "ER LETTER SMALL Z WITH CURLMODIFIER LETTER SMALL EZHMODIFIER LETTER SMAL" + - "L THETACOMBINING DOTTED GRAVE ACCENTCOMBINING DOTTED ACUTE ACCENTCOMBINI" + - "NG SNAKE BELOWCOMBINING SUSPENSION MARKCOMBINING MACRON-ACUTECOMBINING G" + - "RAVE-MACRONCOMBINING MACRON-GRAVECOMBINING ACUTE-MACRONCOMBINING GRAVE-A" + - "CUTE-GRAVECOMBINING ACUTE-GRAVE-ACUTECOMBINING LATIN SMALL LETTER R BELO" + - "WCOMBINING BREVE-MACRONCOMBINING MACRON-BREVECOMBINING DOUBLE CIRCUMFLEX" + - " ABOVECOMBINING OGONEK ABOVECOMBINING ZIGZAG BELOWCOMBINING IS BELOWCOMB" + - "INING UR ABOVECOMBINING US ABOVECOMBINING LATIN SMALL LETTER FLATTENED O" + - "PEN A ABOVECOMBINING LATIN SMALL LETTER AECOMBINING LATIN SMALL LETTER A" + - "OCOMBINING LATIN SMALL LETTER AVCOMBINING LATIN SMALL LETTER C CEDILLACO" + - "MBINING LATIN SMALL LETTER INSULAR DCOMBINING LATIN SMALL LETTER ETHCOMB" + - "INING LATIN SMALL LETTER GCOMBINING LATIN LETTER SMALL CAPITAL GCOMBININ" + - "G LATIN SMALL LETTER KCOMBINING LATIN SMALL LETTER LCOMBINING LATIN LETT" + - "ER SMALL CAPITAL LCOMBINING LATIN LETTER SMALL CAPITAL MCOMBINING LATIN " + - "SMALL LETTER NCOMBINING LATIN LETTER SMALL CAPITAL NCOMBINING LATIN LETT" + - "ER SMALL CAPITAL RCOMBINING LATIN SMALL LETTER R ROTUNDACOMBINING LATIN " + - "SMALL LETTER SCOMBINING LATIN SMALL LETTER LONG SCOMBINING LATIN SMALL L" + - "ETTER ZCOMBINING LATIN SMALL LETTER ALPHACOMBINING LATIN SMALL LETTER BC" + - "OMBINING LATIN SMALL LETTER BETACOMBINING LATIN SMALL LETTER SCHWACOMBIN" + - "ING LATIN SMALL LETTER FCOMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDL" + - "E TILDECOMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKECO" + - "MBINING LATIN SMALL LETTER PCOMBINING LATIN SMALL LETTER ESHCOMBINING LA" + - "TIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKECOMBINING LATIN SMALL" + - " LETTER WCOMBINING LATIN SMALL LETTER A WITH DIAERESISCOMBINING LATIN SM" + - "ALL LETTER O WITH DIAERESISCOMBINING LATIN SMALL LETTER U WITH DIAERESIS" + - "COMBINING UP TACK ABOVECOMBINING DELETION MARKCOMBINING DOUBLE INVERTED " + - "BREVE BELOWCOMBINING ALMOST EQUAL TO BELOWCOMBINING LEFT ARROWHEAD ABOVE" + - "COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOWLATIN CAPITAL LETTER A" + - " WITH RING BELOWLATIN SMALL LETTER A WITH RING BELOWLATIN CAPITAL LETTER" + - " B WITH DOT ABOVELATIN SMALL LETTER B WITH DOT ABOVELATIN CAPITAL LETTER" + - " B WITH DOT BELOWLATIN SMALL LETTER B WITH DOT BELOWLATIN CAPITAL LETTER" + - " B WITH LINE BELOWLATIN SMALL LETTER B WITH LINE BELOWLATIN CAPITAL LETT" + - "ER C WITH CEDILLA AND ACUTELATIN SMALL LETTER C WITH CEDILLA AND ACUTELA" + - "TIN CAPITAL LETTER D WITH DOT ABOVELATIN SMALL LETTER D WITH DOT ABOVELA" + - "TIN CAPITAL LETTER D WITH DOT BELOWLATIN SMALL LETTER D WITH DOT BELOWLA" + - "TIN CAPITAL LETTER D WITH LINE BELOWLATIN SMALL LETTER D WITH LINE BELOW" + - "LATIN CAPITAL LETTER D WITH CEDILLALATIN SMALL LETTER D WITH CEDILLALATI" + - "N CAPITAL LETTER D WITH CIRCUMFLEX BELOWLATIN SMALL LETTER D WITH CIRCUM" + - "FLEX BELOWLATIN CAPITAL LETTER E WITH MACRON AND GRAVELATIN SMALL LETTER") + ("" + - " E WITH MACRON AND GRAVELATIN CAPITAL LETTER E WITH MACRON AND ACUTELATI" + - "N SMALL LETTER E WITH MACRON AND ACUTELATIN CAPITAL LETTER E WITH CIRCUM" + - "FLEX BELOWLATIN SMALL LETTER E WITH CIRCUMFLEX BELOWLATIN CAPITAL LETTER" + - " E WITH TILDE BELOWLATIN SMALL LETTER E WITH TILDE BELOWLATIN CAPITAL LE" + - "TTER E WITH CEDILLA AND BREVELATIN SMALL LETTER E WITH CEDILLA AND BREVE" + - "LATIN CAPITAL LETTER F WITH DOT ABOVELATIN SMALL LETTER F WITH DOT ABOVE" + - "LATIN CAPITAL LETTER G WITH MACRONLATIN SMALL LETTER G WITH MACRONLATIN " + - "CAPITAL LETTER H WITH DOT ABOVELATIN SMALL LETTER H WITH DOT ABOVELATIN " + - "CAPITAL LETTER H WITH DOT BELOWLATIN SMALL LETTER H WITH DOT BELOWLATIN " + - "CAPITAL LETTER H WITH DIAERESISLATIN SMALL LETTER H WITH DIAERESISLATIN " + - "CAPITAL LETTER H WITH CEDILLALATIN SMALL LETTER H WITH CEDILLALATIN CAPI" + - "TAL LETTER H WITH BREVE BELOWLATIN SMALL LETTER H WITH BREVE BELOWLATIN " + - "CAPITAL LETTER I WITH TILDE BELOWLATIN SMALL LETTER I WITH TILDE BELOWLA" + - "TIN CAPITAL LETTER I WITH DIAERESIS AND ACUTELATIN SMALL LETTER I WITH D" + - "IAERESIS AND ACUTELATIN CAPITAL LETTER K WITH ACUTELATIN SMALL LETTER K " + - "WITH ACUTELATIN CAPITAL LETTER K WITH DOT BELOWLATIN SMALL LETTER K WITH" + - " DOT BELOWLATIN CAPITAL LETTER K WITH LINE BELOWLATIN SMALL LETTER K WIT" + - "H LINE BELOWLATIN CAPITAL LETTER L WITH DOT BELOWLATIN SMALL LETTER L WI" + - "TH DOT BELOWLATIN CAPITAL LETTER L WITH DOT BELOW AND MACRONLATIN SMALL " + - "LETTER L WITH DOT BELOW AND MACRONLATIN CAPITAL LETTER L WITH LINE BELOW" + - "LATIN SMALL LETTER L WITH LINE BELOWLATIN CAPITAL LETTER L WITH CIRCUMFL" + - "EX BELOWLATIN SMALL LETTER L WITH CIRCUMFLEX BELOWLATIN CAPITAL LETTER M" + - " WITH ACUTELATIN SMALL LETTER M WITH ACUTELATIN CAPITAL LETTER M WITH DO" + - "T ABOVELATIN SMALL LETTER M WITH DOT ABOVELATIN CAPITAL LETTER M WITH DO" + - "T BELOWLATIN SMALL LETTER M WITH DOT BELOWLATIN CAPITAL LETTER N WITH DO" + - "T ABOVELATIN SMALL LETTER N WITH DOT ABOVELATIN CAPITAL LETTER N WITH DO" + - "T BELOWLATIN SMALL LETTER N WITH DOT BELOWLATIN CAPITAL LETTER N WITH LI" + - "NE BELOWLATIN SMALL LETTER N WITH LINE BELOWLATIN CAPITAL LETTER N WITH " + - "CIRCUMFLEX BELOWLATIN SMALL LETTER N WITH CIRCUMFLEX BELOWLATIN CAPITAL " + - "LETTER O WITH TILDE AND ACUTELATIN SMALL LETTER O WITH TILDE AND ACUTELA" + - "TIN CAPITAL LETTER O WITH TILDE AND DIAERESISLATIN SMALL LETTER O WITH T" + - "ILDE AND DIAERESISLATIN CAPITAL LETTER O WITH MACRON AND GRAVELATIN SMAL" + - "L LETTER O WITH MACRON AND GRAVELATIN CAPITAL LETTER O WITH MACRON AND A" + - "CUTELATIN SMALL LETTER O WITH MACRON AND ACUTELATIN CAPITAL LETTER P WIT" + - "H ACUTELATIN SMALL LETTER P WITH ACUTELATIN CAPITAL LETTER P WITH DOT AB" + - "OVELATIN SMALL LETTER P WITH DOT ABOVELATIN CAPITAL LETTER R WITH DOT AB" + - "OVELATIN SMALL LETTER R WITH DOT ABOVELATIN CAPITAL LETTER R WITH DOT BE" + - "LOWLATIN SMALL LETTER R WITH DOT BELOWLATIN CAPITAL LETTER R WITH DOT BE" + - "LOW AND MACRONLATIN SMALL LETTER R WITH DOT BELOW AND MACRONLATIN CAPITA" + - "L LETTER R WITH LINE BELOWLATIN SMALL LETTER R WITH LINE BELOWLATIN CAPI" + - "TAL LETTER S WITH DOT ABOVELATIN SMALL LETTER S WITH DOT ABOVELATIN CAPI" + - "TAL LETTER S WITH DOT BELOWLATIN SMALL LETTER S WITH DOT BELOWLATIN CAPI" + - "TAL LETTER S WITH ACUTE AND DOT ABOVELATIN SMALL LETTER S WITH ACUTE AND" + - " DOT ABOVELATIN CAPITAL LETTER S WITH CARON AND DOT ABOVELATIN SMALL LET" + - "TER S WITH CARON AND DOT ABOVELATIN CAPITAL LETTER S WITH DOT BELOW AND " + - "DOT ABOVELATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVELATIN CAPITAL " + - "LETTER T WITH DOT ABOVELATIN SMALL LETTER T WITH DOT ABOVELATIN CAPITAL " + - "LETTER T WITH DOT BELOWLATIN SMALL LETTER T WITH DOT BELOWLATIN CAPITAL " + - "LETTER T WITH LINE BELOWLATIN SMALL LETTER T WITH LINE BELOWLATIN CAPITA" + - "L LETTER T WITH CIRCUMFLEX BELOWLATIN SMALL LETTER T WITH CIRCUMFLEX BEL" + - "OWLATIN CAPITAL LETTER U WITH DIAERESIS BELOWLATIN SMALL LETTER U WITH D" + - "IAERESIS BELOWLATIN CAPITAL LETTER U WITH TILDE BELOWLATIN SMALL LETTER " + - "U WITH TILDE BELOWLATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOWLATIN SMAL" + - "L LETTER U WITH CIRCUMFLEX BELOWLATIN CAPITAL LETTER U WITH TILDE AND AC" + - "UTELATIN SMALL LETTER U WITH TILDE AND ACUTELATIN CAPITAL LETTER U WITH " + - "MACRON AND DIAERESISLATIN SMALL LETTER U WITH MACRON AND DIAERESISLATIN " + - "CAPITAL LETTER V WITH TILDELATIN SMALL LETTER V WITH TILDELATIN CAPITAL " + - "LETTER V WITH DOT BELOWLATIN SMALL LETTER V WITH DOT BELOWLATIN CAPITAL " + - "LETTER W WITH GRAVELATIN SMALL LETTER W WITH GRAVELATIN CAPITAL LETTER W" + - " WITH ACUTELATIN SMALL LETTER W WITH ACUTELATIN CAPITAL LETTER W WITH DI" + - "AERESISLATIN SMALL LETTER W WITH DIAERESISLATIN CAPITAL LETTER W WITH DO" + - "T ABOVELATIN SMALL LETTER W WITH DOT ABOVELATIN CAPITAL LETTER W WITH DO" + - "T BELOWLATIN SMALL LETTER W WITH DOT BELOWLATIN CAPITAL LETTER X WITH DO" + - "T ABOVELATIN SMALL LETTER X WITH DOT ABOVELATIN CAPITAL LETTER X WITH DI") + ("" + - "AERESISLATIN SMALL LETTER X WITH DIAERESISLATIN CAPITAL LETTER Y WITH DO" + - "T ABOVELATIN SMALL LETTER Y WITH DOT ABOVELATIN CAPITAL LETTER Z WITH CI" + - "RCUMFLEXLATIN SMALL LETTER Z WITH CIRCUMFLEXLATIN CAPITAL LETTER Z WITH " + - "DOT BELOWLATIN SMALL LETTER Z WITH DOT BELOWLATIN CAPITAL LETTER Z WITH " + - "LINE BELOWLATIN SMALL LETTER Z WITH LINE BELOWLATIN SMALL LETTER H WITH " + - "LINE BELOWLATIN SMALL LETTER T WITH DIAERESISLATIN SMALL LETTER W WITH R" + - "ING ABOVELATIN SMALL LETTER Y WITH RING ABOVELATIN SMALL LETTER A WITH R" + - "IGHT HALF RINGLATIN SMALL LETTER LONG S WITH DOT ABOVELATIN SMALL LETTER" + - " LONG S WITH DIAGONAL STROKELATIN SMALL LETTER LONG S WITH HIGH STROKELA" + - "TIN CAPITAL LETTER SHARP SLATIN SMALL LETTER DELTALATIN CAPITAL LETTER A" + - " WITH DOT BELOWLATIN SMALL LETTER A WITH DOT BELOWLATIN CAPITAL LETTER A" + - " WITH HOOK ABOVELATIN SMALL LETTER A WITH HOOK ABOVELATIN CAPITAL LETTER" + - " A WITH CIRCUMFLEX AND ACUTELATIN SMALL LETTER A WITH CIRCUMFLEX AND ACU" + - "TELATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVELATIN SMALL LETTER A W" + - "ITH CIRCUMFLEX AND GRAVELATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK " + - "ABOVELATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVELATIN CAPITAL LE" + - "TTER A WITH CIRCUMFLEX AND TILDELATIN SMALL LETTER A WITH CIRCUMFLEX AND" + - " TILDELATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOWLATIN SMALL LE" + - "TTER A WITH CIRCUMFLEX AND DOT BELOWLATIN CAPITAL LETTER A WITH BREVE AN" + - "D ACUTELATIN SMALL LETTER A WITH BREVE AND ACUTELATIN CAPITAL LETTER A W" + - "ITH BREVE AND GRAVELATIN SMALL LETTER A WITH BREVE AND GRAVELATIN CAPITA" + - "L LETTER A WITH BREVE AND HOOK ABOVELATIN SMALL LETTER A WITH BREVE AND " + - "HOOK ABOVELATIN CAPITAL LETTER A WITH BREVE AND TILDELATIN SMALL LETTER " + - "A WITH BREVE AND TILDELATIN CAPITAL LETTER A WITH BREVE AND DOT BELOWLAT" + - "IN SMALL LETTER A WITH BREVE AND DOT BELOWLATIN CAPITAL LETTER E WITH DO" + - "T BELOWLATIN SMALL LETTER E WITH DOT BELOWLATIN CAPITAL LETTER E WITH HO" + - "OK ABOVELATIN SMALL LETTER E WITH HOOK ABOVELATIN CAPITAL LETTER E WITH " + - "TILDELATIN SMALL LETTER E WITH TILDELATIN CAPITAL LETTER E WITH CIRCUMFL" + - "EX AND ACUTELATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTELATIN CAPITAL " + - "LETTER E WITH CIRCUMFLEX AND GRAVELATIN SMALL LETTER E WITH CIRCUMFLEX A" + - "ND GRAVELATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVELATIN SMALL" + - " LETTER E WITH CIRCUMFLEX AND HOOK ABOVELATIN CAPITAL LETTER E WITH CIRC" + - "UMFLEX AND TILDELATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDELATIN CAPI" + - "TAL LETTER E WITH CIRCUMFLEX AND DOT BELOWLATIN SMALL LETTER E WITH CIRC" + - "UMFLEX AND DOT BELOWLATIN CAPITAL LETTER I WITH HOOK ABOVELATIN SMALL LE" + - "TTER I WITH HOOK ABOVELATIN CAPITAL LETTER I WITH DOT BELOWLATIN SMALL L" + - "ETTER I WITH DOT BELOWLATIN CAPITAL LETTER O WITH DOT BELOWLATIN SMALL L" + - "ETTER O WITH DOT BELOWLATIN CAPITAL LETTER O WITH HOOK ABOVELATIN SMALL " + - "LETTER O WITH HOOK ABOVELATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE" + - "LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTELATIN CAPITAL LETTER O WIT" + - "H CIRCUMFLEX AND GRAVELATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVELATI" + - "N CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVELATIN SMALL LETTER O WI" + - "TH CIRCUMFLEX AND HOOK ABOVELATIN CAPITAL LETTER O WITH CIRCUMFLEX AND T" + - "ILDELATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDELATIN CAPITAL LETTER O" + - " WITH CIRCUMFLEX AND DOT BELOWLATIN SMALL LETTER O WITH CIRCUMFLEX AND D" + - "OT BELOWLATIN CAPITAL LETTER O WITH HORN AND ACUTELATIN SMALL LETTER O W" + - "ITH HORN AND ACUTELATIN CAPITAL LETTER O WITH HORN AND GRAVELATIN SMALL " + - "LETTER O WITH HORN AND GRAVELATIN CAPITAL LETTER O WITH HORN AND HOOK AB" + - "OVELATIN SMALL LETTER O WITH HORN AND HOOK ABOVELATIN CAPITAL LETTER O W" + - "ITH HORN AND TILDELATIN SMALL LETTER O WITH HORN AND TILDELATIN CAPITAL " + - "LETTER O WITH HORN AND DOT BELOWLATIN SMALL LETTER O WITH HORN AND DOT B" + - "ELOWLATIN CAPITAL LETTER U WITH DOT BELOWLATIN SMALL LETTER U WITH DOT B" + - "ELOWLATIN CAPITAL LETTER U WITH HOOK ABOVELATIN SMALL LETTER U WITH HOOK" + - " ABOVELATIN CAPITAL LETTER U WITH HORN AND ACUTELATIN SMALL LETTER U WIT" + - "H HORN AND ACUTELATIN CAPITAL LETTER U WITH HORN AND GRAVELATIN SMALL LE" + - "TTER U WITH HORN AND GRAVELATIN CAPITAL LETTER U WITH HORN AND HOOK ABOV" + - "ELATIN SMALL LETTER U WITH HORN AND HOOK ABOVELATIN CAPITAL LETTER U WIT" + - "H HORN AND TILDELATIN SMALL LETTER U WITH HORN AND TILDELATIN CAPITAL LE" + - "TTER U WITH HORN AND DOT BELOWLATIN SMALL LETTER U WITH HORN AND DOT BEL" + - "OWLATIN CAPITAL LETTER Y WITH GRAVELATIN SMALL LETTER Y WITH GRAVELATIN " + - "CAPITAL LETTER Y WITH DOT BELOWLATIN SMALL LETTER Y WITH DOT BELOWLATIN " + - "CAPITAL LETTER Y WITH HOOK ABOVELATIN SMALL LETTER Y WITH HOOK ABOVELATI" + - "N CAPITAL LETTER Y WITH TILDELATIN SMALL LETTER Y WITH TILDELATIN CAPITA" + - "L LETTER MIDDLE-WELSH LLLATIN SMALL LETTER MIDDLE-WELSH LLLATIN CAPITAL ") + ("" + - "LETTER MIDDLE-WELSH VLATIN SMALL LETTER MIDDLE-WELSH VLATIN CAPITAL LETT" + - "ER Y WITH LOOPLATIN SMALL LETTER Y WITH LOOPGREEK SMALL LETTER ALPHA WIT" + - "H PSILIGREEK SMALL LETTER ALPHA WITH DASIAGREEK SMALL LETTER ALPHA WITH " + - "PSILI AND VARIAGREEK SMALL LETTER ALPHA WITH DASIA AND VARIAGREEK SMALL " + - "LETTER ALPHA WITH PSILI AND OXIAGREEK SMALL LETTER ALPHA WITH DASIA AND " + - "OXIAGREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENIGREEK SMALL LETTE" + - "R ALPHA WITH DASIA AND PERISPOMENIGREEK CAPITAL LETTER ALPHA WITH PSILIG" + - "REEK CAPITAL LETTER ALPHA WITH DASIAGREEK CAPITAL LETTER ALPHA WITH PSIL" + - "I AND VARIAGREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIAGREEK CAPITAL " + - "LETTER ALPHA WITH PSILI AND OXIAGREEK CAPITAL LETTER ALPHA WITH DASIA AN" + - "D OXIAGREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENIGREEK CAPITAL" + - " LETTER ALPHA WITH DASIA AND PERISPOMENIGREEK SMALL LETTER EPSILON WITH " + - "PSILIGREEK SMALL LETTER EPSILON WITH DASIAGREEK SMALL LETTER EPSILON WIT" + - "H PSILI AND VARIAGREEK SMALL LETTER EPSILON WITH DASIA AND VARIAGREEK SM" + - "ALL LETTER EPSILON WITH PSILI AND OXIAGREEK SMALL LETTER EPSILON WITH DA" + - "SIA AND OXIAGREEK CAPITAL LETTER EPSILON WITH PSILIGREEK CAPITAL LETTER " + - "EPSILON WITH DASIAGREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIAGREEK" + - " CAPITAL LETTER EPSILON WITH DASIA AND VARIAGREEK CAPITAL LETTER EPSILON" + - " WITH PSILI AND OXIAGREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIAGREE" + - "K SMALL LETTER ETA WITH PSILIGREEK SMALL LETTER ETA WITH DASIAGREEK SMAL" + - "L LETTER ETA WITH PSILI AND VARIAGREEK SMALL LETTER ETA WITH DASIA AND V" + - "ARIAGREEK SMALL LETTER ETA WITH PSILI AND OXIAGREEK SMALL LETTER ETA WIT" + - "H DASIA AND OXIAGREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENIGREEK S" + - "MALL LETTER ETA WITH DASIA AND PERISPOMENIGREEK CAPITAL LETTER ETA WITH " + - "PSILIGREEK CAPITAL LETTER ETA WITH DASIAGREEK CAPITAL LETTER ETA WITH PS" + - "ILI AND VARIAGREEK CAPITAL LETTER ETA WITH DASIA AND VARIAGREEK CAPITAL " + - "LETTER ETA WITH PSILI AND OXIAGREEK CAPITAL LETTER ETA WITH DASIA AND OX" + - "IAGREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENIGREEK CAPITAL LETTE" + - "R ETA WITH DASIA AND PERISPOMENIGREEK SMALL LETTER IOTA WITH PSILIGREEK " + - "SMALL LETTER IOTA WITH DASIAGREEK SMALL LETTER IOTA WITH PSILI AND VARIA" + - "GREEK SMALL LETTER IOTA WITH DASIA AND VARIAGREEK SMALL LETTER IOTA WITH" + - " PSILI AND OXIAGREEK SMALL LETTER IOTA WITH DASIA AND OXIAGREEK SMALL LE" + - "TTER IOTA WITH PSILI AND PERISPOMENIGREEK SMALL LETTER IOTA WITH DASIA A" + - "ND PERISPOMENIGREEK CAPITAL LETTER IOTA WITH PSILIGREEK CAPITAL LETTER I" + - "OTA WITH DASIAGREEK CAPITAL LETTER IOTA WITH PSILI AND VARIAGREEK CAPITA" + - "L LETTER IOTA WITH DASIA AND VARIAGREEK CAPITAL LETTER IOTA WITH PSILI A" + - "ND OXIAGREEK CAPITAL LETTER IOTA WITH DASIA AND OXIAGREEK CAPITAL LETTER" + - " IOTA WITH PSILI AND PERISPOMENIGREEK CAPITAL LETTER IOTA WITH DASIA AND" + - " PERISPOMENIGREEK SMALL LETTER OMICRON WITH PSILIGREEK SMALL LETTER OMIC" + - "RON WITH DASIAGREEK SMALL LETTER OMICRON WITH PSILI AND VARIAGREEK SMALL" + - " LETTER OMICRON WITH DASIA AND VARIAGREEK SMALL LETTER OMICRON WITH PSIL" + - "I AND OXIAGREEK SMALL LETTER OMICRON WITH DASIA AND OXIAGREEK CAPITAL LE" + - "TTER OMICRON WITH PSILIGREEK CAPITAL LETTER OMICRON WITH DASIAGREEK CAPI" + - "TAL LETTER OMICRON WITH PSILI AND VARIAGREEK CAPITAL LETTER OMICRON WITH" + - " DASIA AND VARIAGREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIAGREEK CA" + - "PITAL LETTER OMICRON WITH DASIA AND OXIAGREEK SMALL LETTER UPSILON WITH " + - "PSILIGREEK SMALL LETTER UPSILON WITH DASIAGREEK SMALL LETTER UPSILON WIT" + - "H PSILI AND VARIAGREEK SMALL LETTER UPSILON WITH DASIA AND VARIAGREEK SM" + - "ALL LETTER UPSILON WITH PSILI AND OXIAGREEK SMALL LETTER UPSILON WITH DA" + - "SIA AND OXIAGREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENIGREEK S" + - "MALL LETTER UPSILON WITH DASIA AND PERISPOMENIGREEK CAPITAL LETTER UPSIL" + - "ON WITH DASIAGREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIAGREEK CAPI" + - "TAL LETTER UPSILON WITH DASIA AND OXIAGREEK CAPITAL LETTER UPSILON WITH " + - "DASIA AND PERISPOMENIGREEK SMALL LETTER OMEGA WITH PSILIGREEK SMALL LETT" + - "ER OMEGA WITH DASIAGREEK SMALL LETTER OMEGA WITH PSILI AND VARIAGREEK SM" + - "ALL LETTER OMEGA WITH DASIA AND VARIAGREEK SMALL LETTER OMEGA WITH PSILI" + - " AND OXIAGREEK SMALL LETTER OMEGA WITH DASIA AND OXIAGREEK SMALL LETTER " + - "OMEGA WITH PSILI AND PERISPOMENIGREEK SMALL LETTER OMEGA WITH DASIA AND " + - "PERISPOMENIGREEK CAPITAL LETTER OMEGA WITH PSILIGREEK CAPITAL LETTER OME" + - "GA WITH DASIAGREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIAGREEK CAPITA" + - "L LETTER OMEGA WITH DASIA AND VARIAGREEK CAPITAL LETTER OMEGA WITH PSILI" + - " AND OXIAGREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIAGREEK CAPITAL LET" + - "TER OMEGA WITH PSILI AND PERISPOMENIGREEK CAPITAL LETTER OMEGA WITH DASI" + - "A AND PERISPOMENIGREEK SMALL LETTER ALPHA WITH VARIAGREEK SMALL LETTER A") + ("" + - "LPHA WITH OXIAGREEK SMALL LETTER EPSILON WITH VARIAGREEK SMALL LETTER EP" + - "SILON WITH OXIAGREEK SMALL LETTER ETA WITH VARIAGREEK SMALL LETTER ETA W" + - "ITH OXIAGREEK SMALL LETTER IOTA WITH VARIAGREEK SMALL LETTER IOTA WITH O" + - "XIAGREEK SMALL LETTER OMICRON WITH VARIAGREEK SMALL LETTER OMICRON WITH " + - "OXIAGREEK SMALL LETTER UPSILON WITH VARIAGREEK SMALL LETTER UPSILON WITH" + - " OXIAGREEK SMALL LETTER OMEGA WITH VARIAGREEK SMALL LETTER OMEGA WITH OX" + - "IAGREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENIGREEK SMALL LETTE" + - "R ALPHA WITH DASIA AND YPOGEGRAMMENIGREEK SMALL LETTER ALPHA WITH PSILI " + - "AND VARIA AND YPOGEGRAMMENIGREEK SMALL LETTER ALPHA WITH DASIA AND VARIA" + - " AND YPOGEGRAMMENIGREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGE" + - "GRAMMENIGREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENIGR" + - "EEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENIGREEK" + - " SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENIGREEK CA" + - "PITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENIGREEK CAPITAL LETTER ALP" + - "HA WITH DASIA AND PROSGEGRAMMENIGREEK CAPITAL LETTER ALPHA WITH PSILI AN" + - "D VARIA AND PROSGEGRAMMENIGREEK CAPITAL LETTER ALPHA WITH DASIA AND VARI" + - "A AND PROSGEGRAMMENIGREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND P" + - "ROSGEGRAMMENIGREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGR" + - "AMMENIGREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGR" + - "AMMENIGREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGR" + - "AMMENIGREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENIGREEK SMALL LET" + - "TER ETA WITH DASIA AND YPOGEGRAMMENIGREEK SMALL LETTER ETA WITH PSILI AN" + - "D VARIA AND YPOGEGRAMMENIGREEK SMALL LETTER ETA WITH DASIA AND VARIA AND" + - " YPOGEGRAMMENIGREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMME" + - "NIGREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENIGREEK SMAL" + - "L LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENIGREEK SMALL LET" + - "TER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENIGREEK CAPITAL LETTER" + - " ETA WITH PSILI AND PROSGEGRAMMENIGREEK CAPITAL LETTER ETA WITH DASIA AN" + - "D PROSGEGRAMMENIGREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGE" + - "GRAMMENIGREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI" + - "GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENIGREEK CAP" + - "ITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENIGREEK CAPITAL LETT" + - "ER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENIGREEK CAPITAL LETTER" + - " ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENIGREEK SMALL LETTER OME" + - "GA WITH PSILI AND YPOGEGRAMMENIGREEK SMALL LETTER OMEGA WITH DASIA AND Y" + - "POGEGRAMMENIGREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMM" + - "ENIGREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENIGREEK " + - "SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENIGREEK SMALL LETT" + - "ER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENIGREEK SMALL LETTER OMEGA W" + - "ITH PSILI AND PERISPOMENI AND YPOGEGRAMMENIGREEK SMALL LETTER OMEGA WITH" + - " DASIA AND PERISPOMENI AND YPOGEGRAMMENIGREEK CAPITAL LETTER OMEGA WITH " + - "PSILI AND PROSGEGRAMMENIGREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGE" + - "GRAMMENIGREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMME" + - "NIGREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENIGREE" + - "K CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENIGREEK CAPIT" + - "AL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENIGREEK CAPITAL LETT" + - "ER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENIGREEK CAPITAL LETT" + - "ER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENIGREEK SMALL LETTER" + - " ALPHA WITH VRACHYGREEK SMALL LETTER ALPHA WITH MACRONGREEK SMALL LETTER" + - " ALPHA WITH VARIA AND YPOGEGRAMMENIGREEK SMALL LETTER ALPHA WITH YPOGEGR" + - "AMMENIGREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENIGREEK SMALL LE" + - "TTER ALPHA WITH PERISPOMENIGREEK SMALL LETTER ALPHA WITH PERISPOMENI AND" + - " YPOGEGRAMMENIGREEK CAPITAL LETTER ALPHA WITH VRACHYGREEK CAPITAL LETTER" + - " ALPHA WITH MACRONGREEK CAPITAL LETTER ALPHA WITH VARIAGREEK CAPITAL LET" + - "TER ALPHA WITH OXIAGREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENIGREEK K" + - "ORONISGREEK PROSGEGRAMMENIGREEK PSILIGREEK PERISPOMENIGREEK DIALYTIKA AN" + - "D PERISPOMENIGREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENIGREEK SM" + - "ALL LETTER ETA WITH YPOGEGRAMMENIGREEK SMALL LETTER ETA WITH OXIA AND YP" + - "OGEGRAMMENIGREEK SMALL LETTER ETA WITH PERISPOMENIGREEK SMALL LETTER ETA" + - " WITH PERISPOMENI AND YPOGEGRAMMENIGREEK CAPITAL LETTER EPSILON WITH VAR" + - "IAGREEK CAPITAL LETTER EPSILON WITH OXIAGREEK CAPITAL LETTER ETA WITH VA" + - "RIAGREEK CAPITAL LETTER ETA WITH OXIAGREEK CAPITAL LETTER ETA WITH PROSG" + - "EGRAMMENIGREEK PSILI AND VARIAGREEK PSILI AND OXIAGREEK PSILI AND PERISP" + - "OMENIGREEK SMALL LETTER IOTA WITH VRACHYGREEK SMALL LETTER IOTA WITH MAC") + ("" + - "RONGREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIAGREEK SMALL LETTER IO" + - "TA WITH DIALYTIKA AND OXIAGREEK SMALL LETTER IOTA WITH PERISPOMENIGREEK " + - "SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENIGREEK CAPITAL LETTER IOT" + - "A WITH VRACHYGREEK CAPITAL LETTER IOTA WITH MACRONGREEK CAPITAL LETTER I" + - "OTA WITH VARIAGREEK CAPITAL LETTER IOTA WITH OXIAGREEK DASIA AND VARIAGR" + - "EEK DASIA AND OXIAGREEK DASIA AND PERISPOMENIGREEK SMALL LETTER UPSILON " + - "WITH VRACHYGREEK SMALL LETTER UPSILON WITH MACRONGREEK SMALL LETTER UPSI" + - "LON WITH DIALYTIKA AND VARIAGREEK SMALL LETTER UPSILON WITH DIALYTIKA AN" + - "D OXIAGREEK SMALL LETTER RHO WITH PSILIGREEK SMALL LETTER RHO WITH DASIA" + - "GREEK SMALL LETTER UPSILON WITH PERISPOMENIGREEK SMALL LETTER UPSILON WI" + - "TH DIALYTIKA AND PERISPOMENIGREEK CAPITAL LETTER UPSILON WITH VRACHYGREE" + - "K CAPITAL LETTER UPSILON WITH MACRONGREEK CAPITAL LETTER UPSILON WITH VA" + - "RIAGREEK CAPITAL LETTER UPSILON WITH OXIAGREEK CAPITAL LETTER RHO WITH D" + - "ASIAGREEK DIALYTIKA AND VARIAGREEK DIALYTIKA AND OXIAGREEK VARIAGREEK SM" + - "ALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENIGREEK SMALL LETTER OMEGA WI" + - "TH YPOGEGRAMMENIGREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENIGREE" + - "K SMALL LETTER OMEGA WITH PERISPOMENIGREEK SMALL LETTER OMEGA WITH PERIS" + - "POMENI AND YPOGEGRAMMENIGREEK CAPITAL LETTER OMICRON WITH VARIAGREEK CAP" + - "ITAL LETTER OMICRON WITH OXIAGREEK CAPITAL LETTER OMEGA WITH VARIAGREEK " + - "CAPITAL LETTER OMEGA WITH OXIAGREEK CAPITAL LETTER OMEGA WITH PROSGEGRAM" + - "MENIGREEK OXIAGREEK DASIAEN QUADEM QUADEN SPACEEM SPACETHREE-PER-EM SPAC" + - "EFOUR-PER-EM SPACESIX-PER-EM SPACEFIGURE SPACEPUNCTUATION SPACETHIN SPAC" + - "EHAIR SPACEZERO WIDTH SPACEZERO WIDTH NON-JOINERZERO WIDTH JOINERLEFT-TO" + - "-RIGHT MARKRIGHT-TO-LEFT MARKHYPHENNON-BREAKING HYPHENFIGURE DASHEN DASH" + - "EM DASHHORIZONTAL BARDOUBLE VERTICAL LINEDOUBLE LOW LINELEFT SINGLE QUOT" + - "ATION MARKRIGHT SINGLE QUOTATION MARKSINGLE LOW-9 QUOTATION MARKSINGLE H" + - "IGH-REVERSED-9 QUOTATION MARKLEFT DOUBLE QUOTATION MARKRIGHT DOUBLE QUOT" + - "ATION MARKDOUBLE LOW-9 QUOTATION MARKDOUBLE HIGH-REVERSED-9 QUOTATION MA" + - "RKDAGGERDOUBLE DAGGERBULLETTRIANGULAR BULLETONE DOT LEADERTWO DOT LEADER" + - "HORIZONTAL ELLIPSISHYPHENATION POINTLINE SEPARATORPARAGRAPH SEPARATORLEF" + - "T-TO-RIGHT EMBEDDINGRIGHT-TO-LEFT EMBEDDINGPOP DIRECTIONAL FORMATTINGLEF" + - "T-TO-RIGHT OVERRIDERIGHT-TO-LEFT OVERRIDENARROW NO-BREAK SPACEPER MILLE " + - "SIGNPER TEN THOUSAND SIGNPRIMEDOUBLE PRIMETRIPLE PRIMEREVERSED PRIMEREVE" + - "RSED DOUBLE PRIMEREVERSED TRIPLE PRIMECARETSINGLE LEFT-POINTING ANGLE QU" + - "OTATION MARKSINGLE RIGHT-POINTING ANGLE QUOTATION MARKREFERENCE MARKDOUB" + - "LE EXCLAMATION MARKINTERROBANGOVERLINEUNDERTIECHARACTER TIECARET INSERTI" + - "ON POINTASTERISMHYPHEN BULLETFRACTION SLASHLEFT SQUARE BRACKET WITH QUIL" + - "LRIGHT SQUARE BRACKET WITH QUILLDOUBLE QUESTION MARKQUESTION EXCLAMATION" + - " MARKEXCLAMATION QUESTION MARKTIRONIAN SIGN ETREVERSED PILCROW SIGNBLACK" + - " LEFTWARDS BULLETBLACK RIGHTWARDS BULLETLOW ASTERISKREVERSED SEMICOLONCL" + - "OSE UPTWO ASTERISKS ALIGNED VERTICALLYCOMMERCIAL MINUS SIGNSWUNG DASHINV" + - "ERTED UNDERTIEFLOWER PUNCTUATION MARKTHREE DOT PUNCTUATIONQUADRUPLE PRIM" + - "EFOUR DOT PUNCTUATIONFIVE DOT PUNCTUATIONTWO DOT PUNCTUATIONFOUR DOT MAR" + - "KDOTTED CROSSTRICOLONVERTICAL FOUR DOTSMEDIUM MATHEMATICAL SPACEWORD JOI" + - "NERFUNCTION APPLICATIONINVISIBLE TIMESINVISIBLE SEPARATORINVISIBLE PLUSL" + - "EFT-TO-RIGHT ISOLATERIGHT-TO-LEFT ISOLATEFIRST STRONG ISOLATEPOP DIRECTI" + - "ONAL ISOLATEINHIBIT SYMMETRIC SWAPPINGACTIVATE SYMMETRIC SWAPPINGINHIBIT" + - " ARABIC FORM SHAPINGACTIVATE ARABIC FORM SHAPINGNATIONAL DIGIT SHAPESNOM" + - "INAL DIGIT SHAPESSUPERSCRIPT ZEROSUPERSCRIPT LATIN SMALL LETTER ISUPERSC" + - "RIPT FOURSUPERSCRIPT FIVESUPERSCRIPT SIXSUPERSCRIPT SEVENSUPERSCRIPT EIG" + - "HTSUPERSCRIPT NINESUPERSCRIPT PLUS SIGNSUPERSCRIPT MINUSSUPERSCRIPT EQUA" + - "LS SIGNSUPERSCRIPT LEFT PARENTHESISSUPERSCRIPT RIGHT PARENTHESISSUPERSCR" + - "IPT LATIN SMALL LETTER NSUBSCRIPT ZEROSUBSCRIPT ONESUBSCRIPT TWOSUBSCRIP" + - "T THREESUBSCRIPT FOURSUBSCRIPT FIVESUBSCRIPT SIXSUBSCRIPT SEVENSUBSCRIPT" + - " EIGHTSUBSCRIPT NINESUBSCRIPT PLUS SIGNSUBSCRIPT MINUSSUBSCRIPT EQUALS S" + - "IGNSUBSCRIPT LEFT PARENTHESISSUBSCRIPT RIGHT PARENTHESISLATIN SUBSCRIPT " + - "SMALL LETTER ALATIN SUBSCRIPT SMALL LETTER ELATIN SUBSCRIPT SMALL LETTER" + - " OLATIN SUBSCRIPT SMALL LETTER XLATIN SUBSCRIPT SMALL LETTER SCHWALATIN " + - "SUBSCRIPT SMALL LETTER HLATIN SUBSCRIPT SMALL LETTER KLATIN SUBSCRIPT SM" + - "ALL LETTER LLATIN SUBSCRIPT SMALL LETTER MLATIN SUBSCRIPT SMALL LETTER N" + - "LATIN SUBSCRIPT SMALL LETTER PLATIN SUBSCRIPT SMALL LETTER SLATIN SUBSCR" + - "IPT SMALL LETTER TEURO-CURRENCY SIGNCOLON SIGNCRUZEIRO SIGNFRENCH FRANC " + - "SIGNLIRA SIGNMILL SIGNNAIRA SIGNPESETA SIGNRUPEE SIGNWON SIGNNEW SHEQEL " + - "SIGNDONG SIGNEURO SIGNKIP SIGNTUGRIK SIGNDRACHMA SIGNGERMAN PENNY SIGNPE") + ("" + - "SO SIGNGUARANI SIGNAUSTRAL SIGNHRYVNIA SIGNCEDI SIGNLIVRE TOURNOIS SIGNS" + - "PESMILO SIGNTENGE SIGNINDIAN RUPEE SIGNTURKISH LIRA SIGNNORDIC MARK SIGN" + - "MANAT SIGNRUBLE SIGNLARI SIGNCOMBINING LEFT HARPOON ABOVECOMBINING RIGHT" + - " HARPOON ABOVECOMBINING LONG VERTICAL LINE OVERLAYCOMBINING SHORT VERTIC" + - "AL LINE OVERLAYCOMBINING ANTICLOCKWISE ARROW ABOVECOMBINING CLOCKWISE AR" + - "ROW ABOVECOMBINING LEFT ARROW ABOVECOMBINING RIGHT ARROW ABOVECOMBINING " + - "RING OVERLAYCOMBINING CLOCKWISE RING OVERLAYCOMBINING ANTICLOCKWISE RING" + - " OVERLAYCOMBINING THREE DOTS ABOVECOMBINING FOUR DOTS ABOVECOMBINING ENC" + - "LOSING CIRCLECOMBINING ENCLOSING SQUARECOMBINING ENCLOSING DIAMONDCOMBIN" + - "ING ENCLOSING CIRCLE BACKSLASHCOMBINING LEFT RIGHT ARROW ABOVECOMBINING " + - "ENCLOSING SCREENCOMBINING ENCLOSING KEYCAPCOMBINING ENCLOSING UPWARD POI" + - "NTING TRIANGLECOMBINING REVERSE SOLIDUS OVERLAYCOMBINING DOUBLE VERTICAL" + - " STROKE OVERLAYCOMBINING ANNUITY SYMBOLCOMBINING TRIPLE UNDERDOTCOMBININ" + - "G WIDE BRIDGE ABOVECOMBINING LEFTWARDS ARROW OVERLAYCOMBINING LONG DOUBL" + - "E SOLIDUS OVERLAYCOMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDSCOMBINI" + - "NG LEFTWARDS HARPOON WITH BARB DOWNWARDSCOMBINING LEFT ARROW BELOWCOMBIN" + - "ING RIGHT ARROW BELOWCOMBINING ASTERISK ABOVEACCOUNT OFADDRESSED TO THE " + - "SUBJECTDOUBLE-STRUCK CAPITAL CDEGREE CELSIUSCENTRE LINE SYMBOLCARE OFCAD" + - "A UNAEULER CONSTANTSCRUPLEDEGREE FAHRENHEITSCRIPT SMALL GSCRIPT CAPITAL " + - "HBLACK-LETTER CAPITAL HDOUBLE-STRUCK CAPITAL HPLANCK CONSTANTPLANCK CONS" + - "TANT OVER TWO PISCRIPT CAPITAL IBLACK-LETTER CAPITAL ISCRIPT CAPITAL LSC" + - "RIPT SMALL LL B BAR SYMBOLDOUBLE-STRUCK CAPITAL NNUMERO SIGNSOUND RECORD" + - "ING COPYRIGHTSCRIPT CAPITAL PDOUBLE-STRUCK CAPITAL PDOUBLE-STRUCK CAPITA" + - "L QSCRIPT CAPITAL RBLACK-LETTER CAPITAL RDOUBLE-STRUCK CAPITAL RPRESCRIP" + - "TION TAKERESPONSESERVICE MARKTELEPHONE SIGNTRADE MARK SIGNVERSICLEDOUBLE" + - "-STRUCK CAPITAL ZOUNCE SIGNOHM SIGNINVERTED OHM SIGNBLACK-LETTER CAPITAL" + - " ZTURNED GREEK SMALL LETTER IOTAKELVIN SIGNANGSTROM SIGNSCRIPT CAPITAL B" + - "BLACK-LETTER CAPITAL CESTIMATED SYMBOLSCRIPT SMALL ESCRIPT CAPITAL ESCRI" + - "PT CAPITAL FTURNED CAPITAL FSCRIPT CAPITAL MSCRIPT SMALL OALEF SYMBOLBET" + - " SYMBOLGIMEL SYMBOLDALET SYMBOLINFORMATION SOURCEROTATED CAPITAL QFACSIM" + - "ILE SIGNDOUBLE-STRUCK SMALL PIDOUBLE-STRUCK SMALL GAMMADOUBLE-STRUCK CAP" + - "ITAL GAMMADOUBLE-STRUCK CAPITAL PIDOUBLE-STRUCK N-ARY SUMMATIONTURNED SA" + - "NS-SERIF CAPITAL GTURNED SANS-SERIF CAPITAL LREVERSED SANS-SERIF CAPITAL" + - " LTURNED SANS-SERIF CAPITAL YDOUBLE-STRUCK ITALIC CAPITAL DDOUBLE-STRUCK" + - " ITALIC SMALL DDOUBLE-STRUCK ITALIC SMALL EDOUBLE-STRUCK ITALIC SMALL ID" + - "OUBLE-STRUCK ITALIC SMALL JPROPERTY LINETURNED AMPERSANDPER SIGNAKTIESEL" + - "SKABTURNED SMALL FSYMBOL FOR SAMARITAN SOURCEVULGAR FRACTION ONE SEVENTH" + - "VULGAR FRACTION ONE NINTHVULGAR FRACTION ONE TENTHVULGAR FRACTION ONE TH" + - "IRDVULGAR FRACTION TWO THIRDSVULGAR FRACTION ONE FIFTHVULGAR FRACTION TW" + - "O FIFTHSVULGAR FRACTION THREE FIFTHSVULGAR FRACTION FOUR FIFTHSVULGAR FR" + - "ACTION ONE SIXTHVULGAR FRACTION FIVE SIXTHSVULGAR FRACTION ONE EIGHTHVUL" + - "GAR FRACTION THREE EIGHTHSVULGAR FRACTION FIVE EIGHTHSVULGAR FRACTION SE" + - "VEN EIGHTHSFRACTION NUMERATOR ONEROMAN NUMERAL ONEROMAN NUMERAL TWOROMAN" + - " NUMERAL THREEROMAN NUMERAL FOURROMAN NUMERAL FIVEROMAN NUMERAL SIXROMAN" + - " NUMERAL SEVENROMAN NUMERAL EIGHTROMAN NUMERAL NINEROMAN NUMERAL TENROMA" + - "N NUMERAL ELEVENROMAN NUMERAL TWELVEROMAN NUMERAL FIFTYROMAN NUMERAL ONE" + - " HUNDREDROMAN NUMERAL FIVE HUNDREDROMAN NUMERAL ONE THOUSANDSMALL ROMAN " + - "NUMERAL ONESMALL ROMAN NUMERAL TWOSMALL ROMAN NUMERAL THREESMALL ROMAN N" + - "UMERAL FOURSMALL ROMAN NUMERAL FIVESMALL ROMAN NUMERAL SIXSMALL ROMAN NU" + - "MERAL SEVENSMALL ROMAN NUMERAL EIGHTSMALL ROMAN NUMERAL NINESMALL ROMAN " + - "NUMERAL TENSMALL ROMAN NUMERAL ELEVENSMALL ROMAN NUMERAL TWELVESMALL ROM" + - "AN NUMERAL FIFTYSMALL ROMAN NUMERAL ONE HUNDREDSMALL ROMAN NUMERAL FIVE " + - "HUNDREDSMALL ROMAN NUMERAL ONE THOUSANDROMAN NUMERAL ONE THOUSAND C DROM" + - "AN NUMERAL FIVE THOUSANDROMAN NUMERAL TEN THOUSANDROMAN NUMERAL REVERSED" + - " ONE HUNDREDLATIN SMALL LETTER REVERSED CROMAN NUMERAL SIX LATE FORMROMA" + - "N NUMERAL FIFTY EARLY FORMROMAN NUMERAL FIFTY THOUSANDROMAN NUMERAL ONE " + - "HUNDRED THOUSANDVULGAR FRACTION ZERO THIRDSTURNED DIGIT TWOTURNED DIGIT " + - "THREELEFTWARDS ARROWUPWARDS ARROWRIGHTWARDS ARROWDOWNWARDS ARROWLEFT RIG" + - "HT ARROWUP DOWN ARROWNORTH WEST ARROWNORTH EAST ARROWSOUTH EAST ARROWSOU" + - "TH WEST ARROWLEFTWARDS ARROW WITH STROKERIGHTWARDS ARROW WITH STROKELEFT" + - "WARDS WAVE ARROWRIGHTWARDS WAVE ARROWLEFTWARDS TWO HEADED ARROWUPWARDS T" + - "WO HEADED ARROWRIGHTWARDS TWO HEADED ARROWDOWNWARDS TWO HEADED ARROWLEFT" + - "WARDS ARROW WITH TAILRIGHTWARDS ARROW WITH TAILLEFTWARDS ARROW FROM BARU" + - "PWARDS ARROW FROM BARRIGHTWARDS ARROW FROM BARDOWNWARDS ARROW FROM BARUP") + ("" + - " DOWN ARROW WITH BASELEFTWARDS ARROW WITH HOOKRIGHTWARDS ARROW WITH HOOK" + - "LEFTWARDS ARROW WITH LOOPRIGHTWARDS ARROW WITH LOOPLEFT RIGHT WAVE ARROW" + - "LEFT RIGHT ARROW WITH STROKEDOWNWARDS ZIGZAG ARROWUPWARDS ARROW WITH TIP" + - " LEFTWARDSUPWARDS ARROW WITH TIP RIGHTWARDSDOWNWARDS ARROW WITH TIP LEFT" + - "WARDSDOWNWARDS ARROW WITH TIP RIGHTWARDSRIGHTWARDS ARROW WITH CORNER DOW" + - "NWARDSDOWNWARDS ARROW WITH CORNER LEFTWARDSANTICLOCKWISE TOP SEMICIRCLE " + - "ARROWCLOCKWISE TOP SEMICIRCLE ARROWNORTH WEST ARROW TO LONG BARLEFTWARDS" + - " ARROW TO BAR OVER RIGHTWARDS ARROW TO BARANTICLOCKWISE OPEN CIRCLE ARRO" + - "WCLOCKWISE OPEN CIRCLE ARROWLEFTWARDS HARPOON WITH BARB UPWARDSLEFTWARDS" + - " HARPOON WITH BARB DOWNWARDSUPWARDS HARPOON WITH BARB RIGHTWARDSUPWARDS " + - "HARPOON WITH BARB LEFTWARDSRIGHTWARDS HARPOON WITH BARB UPWARDSRIGHTWARD" + - "S HARPOON WITH BARB DOWNWARDSDOWNWARDS HARPOON WITH BARB RIGHTWARDSDOWNW" + - "ARDS HARPOON WITH BARB LEFTWARDSRIGHTWARDS ARROW OVER LEFTWARDS ARROWUPW" + - "ARDS ARROW LEFTWARDS OF DOWNWARDS ARROWLEFTWARDS ARROW OVER RIGHTWARDS A" + - "RROWLEFTWARDS PAIRED ARROWSUPWARDS PAIRED ARROWSRIGHTWARDS PAIRED ARROWS" + - "DOWNWARDS PAIRED ARROWSLEFTWARDS HARPOON OVER RIGHTWARDS HARPOONRIGHTWAR" + - "DS HARPOON OVER LEFTWARDS HARPOONLEFTWARDS DOUBLE ARROW WITH STROKELEFT " + - "RIGHT DOUBLE ARROW WITH STROKERIGHTWARDS DOUBLE ARROW WITH STROKELEFTWAR" + - "DS DOUBLE ARROWUPWARDS DOUBLE ARROWRIGHTWARDS DOUBLE ARROWDOWNWARDS DOUB" + - "LE ARROWLEFT RIGHT DOUBLE ARROWUP DOWN DOUBLE ARROWNORTH WEST DOUBLE ARR" + - "OWNORTH EAST DOUBLE ARROWSOUTH EAST DOUBLE ARROWSOUTH WEST DOUBLE ARROWL" + - "EFTWARDS TRIPLE ARROWRIGHTWARDS TRIPLE ARROWLEFTWARDS SQUIGGLE ARROWRIGH" + - "TWARDS SQUIGGLE ARROWUPWARDS ARROW WITH DOUBLE STROKEDOWNWARDS ARROW WIT" + - "H DOUBLE STROKELEFTWARDS DASHED ARROWUPWARDS DASHED ARROWRIGHTWARDS DASH" + - "ED ARROWDOWNWARDS DASHED ARROWLEFTWARDS ARROW TO BARRIGHTWARDS ARROW TO " + - "BARLEFTWARDS WHITE ARROWUPWARDS WHITE ARROWRIGHTWARDS WHITE ARROWDOWNWAR" + - "DS WHITE ARROWUPWARDS WHITE ARROW FROM BARUPWARDS WHITE ARROW ON PEDESTA" + - "LUPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BARUPWARDS WHITE ARROW " + - "ON PEDESTAL WITH VERTICAL BARUPWARDS WHITE DOUBLE ARROWUPWARDS WHITE DOU" + - "BLE ARROW ON PEDESTALRIGHTWARDS WHITE ARROW FROM WALLNORTH WEST ARROW TO" + - " CORNERSOUTH EAST ARROW TO CORNERUP DOWN WHITE ARROWRIGHT ARROW WITH SMA" + - "LL CIRCLEDOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROWTHREE RIGHTWARDS ARRO" + - "WSLEFTWARDS ARROW WITH VERTICAL STROKERIGHTWARDS ARROW WITH VERTICAL STR" + - "OKELEFT RIGHT ARROW WITH VERTICAL STROKELEFTWARDS ARROW WITH DOUBLE VERT" + - "ICAL STROKERIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKELEFT RIGHT ARROW " + - "WITH DOUBLE VERTICAL STROKELEFTWARDS OPEN-HEADED ARROWRIGHTWARDS OPEN-HE" + - "ADED ARROWLEFT RIGHT OPEN-HEADED ARROWFOR ALLCOMPLEMENTPARTIAL DIFFERENT" + - "IALTHERE EXISTSTHERE DOES NOT EXISTEMPTY SETINCREMENTNABLAELEMENT OFNOT " + - "AN ELEMENT OFSMALL ELEMENT OFCONTAINS AS MEMBERDOES NOT CONTAIN AS MEMBE" + - "RSMALL CONTAINS AS MEMBEREND OF PROOFN-ARY PRODUCTN-ARY COPRODUCTN-ARY S" + - "UMMATIONMINUS SIGNMINUS-OR-PLUS SIGNDOT PLUSDIVISION SLASHSET MINUSASTER" + - "ISK OPERATORRING OPERATORBULLET OPERATORSQUARE ROOTCUBE ROOTFOURTH ROOTP" + - "ROPORTIONAL TOINFINITYRIGHT ANGLEANGLEMEASURED ANGLESPHERICAL ANGLEDIVID" + - "ESDOES NOT DIVIDEPARALLEL TONOT PARALLEL TOLOGICAL ANDLOGICAL ORINTERSEC" + - "TIONUNIONINTEGRALDOUBLE INTEGRALTRIPLE INTEGRALCONTOUR INTEGRALSURFACE I" + - "NTEGRALVOLUME INTEGRALCLOCKWISE INTEGRALCLOCKWISE CONTOUR INTEGRALANTICL" + - "OCKWISE CONTOUR INTEGRALTHEREFOREBECAUSERATIOPROPORTIONDOT MINUSEXCESSGE" + - "OMETRIC PROPORTIONHOMOTHETICTILDE OPERATORREVERSED TILDEINVERTED LAZY SS" + - "INE WAVEWREATH PRODUCTNOT TILDEMINUS TILDEASYMPTOTICALLY EQUAL TONOT ASY" + - "MPTOTICALLY EQUAL TOAPPROXIMATELY EQUAL TOAPPROXIMATELY BUT NOT ACTUALLY" + - " EQUAL TONEITHER APPROXIMATELY NOR ACTUALLY EQUAL TOALMOST EQUAL TONOT A" + - "LMOST EQUAL TOALMOST EQUAL OR EQUAL TOTRIPLE TILDEALL EQUAL TOEQUIVALENT" + - " TOGEOMETRICALLY EQUIVALENT TODIFFERENCE BETWEENAPPROACHES THE LIMITGEOM" + - "ETRICALLY EQUAL TOAPPROXIMATELY EQUAL TO OR THE IMAGE OFIMAGE OF OR APPR" + - "OXIMATELY EQUAL TOCOLON EQUALSEQUALS COLONRING IN EQUAL TORING EQUAL TOC" + - "ORRESPONDS TOESTIMATESEQUIANGULAR TOSTAR EQUALSDELTA EQUAL TOEQUAL TO BY" + - " DEFINITIONMEASURED BYQUESTIONED EQUAL TONOT EQUAL TOIDENTICAL TONOT IDE" + - "NTICAL TOSTRICTLY EQUIVALENT TOLESS-THAN OR EQUAL TOGREATER-THAN OR EQUA" + - "L TOLESS-THAN OVER EQUAL TOGREATER-THAN OVER EQUAL TOLESS-THAN BUT NOT E" + - "QUAL TOGREATER-THAN BUT NOT EQUAL TOMUCH LESS-THANMUCH GREATER-THANBETWE" + - "ENNOT EQUIVALENT TONOT LESS-THANNOT GREATER-THANNEITHER LESS-THAN NOR EQ" + - "UAL TONEITHER GREATER-THAN NOR EQUAL TOLESS-THAN OR EQUIVALENT TOGREATER" + - "-THAN OR EQUIVALENT TONEITHER LESS-THAN NOR EQUIVALENT TONEITHER GREATER" + - "-THAN NOR EQUIVALENT TOLESS-THAN OR GREATER-THANGREATER-THAN OR LESS-THA") + ("" + - "NNEITHER LESS-THAN NOR GREATER-THANNEITHER GREATER-THAN NOR LESS-THANPRE" + - "CEDESSUCCEEDSPRECEDES OR EQUAL TOSUCCEEDS OR EQUAL TOPRECEDES OR EQUIVAL" + - "ENT TOSUCCEEDS OR EQUIVALENT TODOES NOT PRECEDEDOES NOT SUCCEEDSUBSET OF" + - "SUPERSET OFNOT A SUBSET OFNOT A SUPERSET OFSUBSET OF OR EQUAL TOSUPERSET" + - " OF OR EQUAL TONEITHER A SUBSET OF NOR EQUAL TONEITHER A SUPERSET OF NOR" + - " EQUAL TOSUBSET OF WITH NOT EQUAL TOSUPERSET OF WITH NOT EQUAL TOMULTISE" + - "TMULTISET MULTIPLICATIONMULTISET UNIONSQUARE IMAGE OFSQUARE ORIGINAL OFS" + - "QUARE IMAGE OF OR EQUAL TOSQUARE ORIGINAL OF OR EQUAL TOSQUARE CAPSQUARE" + - " CUPCIRCLED PLUSCIRCLED MINUSCIRCLED TIMESCIRCLED DIVISION SLASHCIRCLED " + - "DOT OPERATORCIRCLED RING OPERATORCIRCLED ASTERISK OPERATORCIRCLED EQUALS" + - "CIRCLED DASHSQUARED PLUSSQUARED MINUSSQUARED TIMESSQUARED DOT OPERATORRI" + - "GHT TACKLEFT TACKDOWN TACKUP TACKASSERTIONMODELSTRUEFORCESTRIPLE VERTICA" + - "L BAR RIGHT TURNSTILEDOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILEDOES NOT " + - "PROVENOT TRUEDOES NOT FORCENEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURN" + - "STILEPRECEDES UNDER RELATIONSUCCEEDS UNDER RELATIONNORMAL SUBGROUP OFCON" + - "TAINS AS NORMAL SUBGROUPNORMAL SUBGROUP OF OR EQUAL TOCONTAINS AS NORMAL" + - " SUBGROUP OR EQUAL TOORIGINAL OFIMAGE OFMULTIMAPHERMITIAN CONJUGATE MATR" + - "IXINTERCALATEXORNANDNORRIGHT ANGLE WITH ARCRIGHT TRIANGLEN-ARY LOGICAL A" + - "NDN-ARY LOGICAL ORN-ARY INTERSECTIONN-ARY UNIONDIAMOND OPERATORDOT OPERA" + - "TORSTAR OPERATORDIVISION TIMESBOWTIELEFT NORMAL FACTOR SEMIDIRECT PRODUC" + - "TRIGHT NORMAL FACTOR SEMIDIRECT PRODUCTLEFT SEMIDIRECT PRODUCTRIGHT SEMI" + - "DIRECT PRODUCTREVERSED TILDE EQUALSCURLY LOGICAL ORCURLY LOGICAL ANDDOUB" + - "LE SUBSETDOUBLE SUPERSETDOUBLE INTERSECTIONDOUBLE UNIONPITCHFORKEQUAL AN" + - "D PARALLEL TOLESS-THAN WITH DOTGREATER-THAN WITH DOTVERY MUCH LESS-THANV" + - "ERY MUCH GREATER-THANLESS-THAN EQUAL TO OR GREATER-THANGREATER-THAN EQUA" + - "L TO OR LESS-THANEQUAL TO OR LESS-THANEQUAL TO OR GREATER-THANEQUAL TO O" + - "R PRECEDESEQUAL TO OR SUCCEEDSDOES NOT PRECEDE OR EQUALDOES NOT SUCCEED " + - "OR EQUALNOT SQUARE IMAGE OF OR EQUAL TONOT SQUARE ORIGINAL OF OR EQUAL T" + - "OSQUARE IMAGE OF OR NOT EQUAL TOSQUARE ORIGINAL OF OR NOT EQUAL TOLESS-T" + - "HAN BUT NOT EQUIVALENT TOGREATER-THAN BUT NOT EQUIVALENT TOPRECEDES BUT " + - "NOT EQUIVALENT TOSUCCEEDS BUT NOT EQUIVALENT TONOT NORMAL SUBGROUP OFDOE" + - "S NOT CONTAIN AS NORMAL SUBGROUPNOT NORMAL SUBGROUP OF OR EQUAL TODOES N" + - "OT CONTAIN AS NORMAL SUBGROUP OR EQUALVERTICAL ELLIPSISMIDLINE HORIZONTA" + - "L ELLIPSISUP RIGHT DIAGONAL ELLIPSISDOWN RIGHT DIAGONAL ELLIPSISELEMENT " + - "OF WITH LONG HORIZONTAL STROKEELEMENT OF WITH VERTICAL BAR AT END OF HOR" + - "IZONTAL STROKESMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL ST" + - "ROKEELEMENT OF WITH DOT ABOVEELEMENT OF WITH OVERBARSMALL ELEMENT OF WIT" + - "H OVERBARELEMENT OF WITH UNDERBARELEMENT OF WITH TWO HORIZONTAL STROKESC" + - "ONTAINS WITH LONG HORIZONTAL STROKECONTAINS WITH VERTICAL BAR AT END OF " + - "HORIZONTAL STROKESMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL S" + - "TROKECONTAINS WITH OVERBARSMALL CONTAINS WITH OVERBARZ NOTATION BAG MEMB" + - "ERSHIPDIAMETER SIGNELECTRIC ARROWHOUSEUP ARROWHEADDOWN ARROWHEADPROJECTI" + - "VEPERSPECTIVEWAVY LINELEFT CEILINGRIGHT CEILINGLEFT FLOORRIGHT FLOORBOTT" + - "OM RIGHT CROPBOTTOM LEFT CROPTOP RIGHT CROPTOP LEFT CROPREVERSED NOT SIG" + - "NSQUARE LOZENGEARCSEGMENTSECTORTELEPHONE RECORDERPOSITION INDICATORVIEWD" + - "ATA SQUAREPLACE OF INTEREST SIGNTURNED NOT SIGNWATCHHOURGLASSTOP LEFT CO" + - "RNERTOP RIGHT CORNERBOTTOM LEFT CORNERBOTTOM RIGHT CORNERTOP HALF INTEGR" + - "ALBOTTOM HALF INTEGRALFROWNSMILEUP ARROWHEAD BETWEEN TWO HORIZONTAL BARS" + - "OPTION KEYERASE TO THE RIGHTX IN A RECTANGLE BOXKEYBOARDLEFT-POINTING AN" + - "GLE BRACKETRIGHT-POINTING ANGLE BRACKETERASE TO THE LEFTBENZENE RINGCYLI" + - "NDRICITYALL AROUND-PROFILESYMMETRYTOTAL RUNOUTDIMENSION ORIGINCONICAL TA" + - "PERSLOPECOUNTERBORECOUNTERSINKAPL FUNCTIONAL SYMBOL I-BEAMAPL FUNCTIONAL" + - " SYMBOL SQUISH QUADAPL FUNCTIONAL SYMBOL QUAD EQUALAPL FUNCTIONAL SYMBOL" + - " QUAD DIVIDEAPL FUNCTIONAL SYMBOL QUAD DIAMONDAPL FUNCTIONAL SYMBOL QUAD" + - " JOTAPL FUNCTIONAL SYMBOL QUAD CIRCLEAPL FUNCTIONAL SYMBOL CIRCLE STILEA" + - "PL FUNCTIONAL SYMBOL CIRCLE JOTAPL FUNCTIONAL SYMBOL SLASH BARAPL FUNCTI" + - "ONAL SYMBOL BACKSLASH BARAPL FUNCTIONAL SYMBOL QUAD SLASHAPL FUNCTIONAL " + - "SYMBOL QUAD BACKSLASHAPL FUNCTIONAL SYMBOL QUAD LESS-THANAPL FUNCTIONAL " + - "SYMBOL QUAD GREATER-THANAPL FUNCTIONAL SYMBOL LEFTWARDS VANEAPL FUNCTION" + - "AL SYMBOL RIGHTWARDS VANEAPL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROWAPL F" + - "UNCTIONAL SYMBOL QUAD RIGHTWARDS ARROWAPL FUNCTIONAL SYMBOL CIRCLE BACKS" + - "LASHAPL FUNCTIONAL SYMBOL DOWN TACK UNDERBARAPL FUNCTIONAL SYMBOL DELTA " + - "STILEAPL FUNCTIONAL SYMBOL QUAD DOWN CARETAPL FUNCTIONAL SYMBOL QUAD DEL" + - "TAAPL FUNCTIONAL SYMBOL DOWN TACK JOTAPL FUNCTIONAL SYMBOL UPWARDS VANEA") + ("" + - "PL FUNCTIONAL SYMBOL QUAD UPWARDS ARROWAPL FUNCTIONAL SYMBOL UP TACK OVE" + - "RBARAPL FUNCTIONAL SYMBOL DEL STILEAPL FUNCTIONAL SYMBOL QUAD UP CARETAP" + - "L FUNCTIONAL SYMBOL QUAD DELAPL FUNCTIONAL SYMBOL UP TACK JOTAPL FUNCTIO" + - "NAL SYMBOL DOWNWARDS VANEAPL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROWAPL F" + - "UNCTIONAL SYMBOL QUOTE UNDERBARAPL FUNCTIONAL SYMBOL DELTA UNDERBARAPL F" + - "UNCTIONAL SYMBOL DIAMOND UNDERBARAPL FUNCTIONAL SYMBOL JOT UNDERBARAPL F" + - "UNCTIONAL SYMBOL CIRCLE UNDERBARAPL FUNCTIONAL SYMBOL UP SHOE JOTAPL FUN" + - "CTIONAL SYMBOL QUOTE QUADAPL FUNCTIONAL SYMBOL CIRCLE STARAPL FUNCTIONAL" + - " SYMBOL QUAD COLONAPL FUNCTIONAL SYMBOL UP TACK DIAERESISAPL FUNCTIONAL " + - "SYMBOL DEL DIAERESISAPL FUNCTIONAL SYMBOL STAR DIAERESISAPL FUNCTIONAL S" + - "YMBOL JOT DIAERESISAPL FUNCTIONAL SYMBOL CIRCLE DIAERESISAPL FUNCTIONAL " + - "SYMBOL DOWN SHOE STILEAPL FUNCTIONAL SYMBOL LEFT SHOE STILEAPL FUNCTIONA" + - "L SYMBOL TILDE DIAERESISAPL FUNCTIONAL SYMBOL GREATER-THAN DIAERESISAPL " + - "FUNCTIONAL SYMBOL COMMA BARAPL FUNCTIONAL SYMBOL DEL TILDEAPL FUNCTIONAL" + - " SYMBOL ZILDEAPL FUNCTIONAL SYMBOL STILE TILDEAPL FUNCTIONAL SYMBOL SEMI" + - "COLON UNDERBARAPL FUNCTIONAL SYMBOL QUAD NOT EQUALAPL FUNCTIONAL SYMBOL " + - "QUAD QUESTIONAPL FUNCTIONAL SYMBOL DOWN CARET TILDEAPL FUNCTIONAL SYMBOL" + - " UP CARET TILDEAPL FUNCTIONAL SYMBOL IOTAAPL FUNCTIONAL SYMBOL RHOAPL FU" + - "NCTIONAL SYMBOL OMEGAAPL FUNCTIONAL SYMBOL ALPHA UNDERBARAPL FUNCTIONAL " + - "SYMBOL EPSILON UNDERBARAPL FUNCTIONAL SYMBOL IOTA UNDERBARAPL FUNCTIONAL" + - " SYMBOL OMEGA UNDERBARAPL FUNCTIONAL SYMBOL ALPHANOT CHECK MARKRIGHT ANG" + - "LE WITH DOWNWARDS ZIGZAG ARROWSHOULDERED OPEN BOXBELL SYMBOLVERTICAL LIN" + - "E WITH MIDDLE DOTINSERTION SYMBOLCONTINUOUS UNDERLINE SYMBOLDISCONTINUOU" + - "S UNDERLINE SYMBOLEMPHASIS SYMBOLCOMPOSITION SYMBOLWHITE SQUARE WITH CEN" + - "TRE VERTICAL LINEENTER SYMBOLALTERNATIVE KEY SYMBOLHELM SYMBOLCIRCLED HO" + - "RIZONTAL BAR WITH NOTCHCIRCLED TRIANGLE DOWNBROKEN CIRCLE WITH NORTHWEST" + - " ARROWUNDO SYMBOLMONOSTABLE SYMBOLHYSTERESIS SYMBOLOPEN-CIRCUIT-OUTPUT H" + - "-TYPE SYMBOLOPEN-CIRCUIT-OUTPUT L-TYPE SYMBOLPASSIVE-PULL-DOWN-OUTPUT SY" + - "MBOLPASSIVE-PULL-UP-OUTPUT SYMBOLDIRECT CURRENT SYMBOL FORM TWOSOFTWARE-" + - "FUNCTION SYMBOLAPL FUNCTIONAL SYMBOL QUADDECIMAL SEPARATOR KEY SYMBOLPRE" + - "VIOUS PAGENEXT PAGEPRINT SCREEN SYMBOLCLEAR SCREEN SYMBOLLEFT PARENTHESI" + - "S UPPER HOOKLEFT PARENTHESIS EXTENSIONLEFT PARENTHESIS LOWER HOOKRIGHT P" + - "ARENTHESIS UPPER HOOKRIGHT PARENTHESIS EXTENSIONRIGHT PARENTHESIS LOWER " + - "HOOKLEFT SQUARE BRACKET UPPER CORNERLEFT SQUARE BRACKET EXTENSIONLEFT SQ" + - "UARE BRACKET LOWER CORNERRIGHT SQUARE BRACKET UPPER CORNERRIGHT SQUARE B" + - "RACKET EXTENSIONRIGHT SQUARE BRACKET LOWER CORNERLEFT CURLY BRACKET UPPE" + - "R HOOKLEFT CURLY BRACKET MIDDLE PIECELEFT CURLY BRACKET LOWER HOOKCURLY " + - "BRACKET EXTENSIONRIGHT CURLY BRACKET UPPER HOOKRIGHT CURLY BRACKET MIDDL" + - "E PIECERIGHT CURLY BRACKET LOWER HOOKINTEGRAL EXTENSIONHORIZONTAL LINE E" + - "XTENSIONUPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTIONUPPER RIGHT OR LO" + - "WER LEFT CURLY BRACKET SECTIONSUMMATION TOPSUMMATION BOTTOMTOP SQUARE BR" + - "ACKETBOTTOM SQUARE BRACKETBOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKETR" + - "ADICAL SYMBOL BOTTOMLEFT VERTICAL BOX LINERIGHT VERTICAL BOX LINEHORIZON" + - "TAL SCAN LINE-1HORIZONTAL SCAN LINE-3HORIZONTAL SCAN LINE-7HORIZONTAL SC" + - "AN LINE-9DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHTDENTISTRY SYMBOL L" + - "IGHT VERTICAL AND BOTTOM RIGHTDENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCL" + - "EDENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLEDENTISTRY SYMBOL " + - "LIGHT UP AND HORIZONTAL WITH CIRCLEDENTISTRY SYMBOL LIGHT VERTICAL WITH " + - "TRIANGLEDENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLEDENTISTR" + - "Y SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLEDENTISTRY SYMBOL LIGHT VER" + - "TICAL AND WAVEDENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVEDENTIS" + - "TRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVEDENTISTRY SYMBOL LIGHT DOWN " + - "AND HORIZONTALDENTISTRY SYMBOL LIGHT UP AND HORIZONTALDENTISTRY SYMBOL L" + - "IGHT VERTICAL AND TOP LEFTDENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEF" + - "TSQUARE FOOTRETURN SYMBOLEJECT SYMBOLVERTICAL LINE EXTENSIONMETRICAL BRE" + - "VEMETRICAL LONG OVER SHORTMETRICAL SHORT OVER LONGMETRICAL LONG OVER TWO" + - " SHORTSMETRICAL TWO SHORTS OVER LONGMETRICAL TWO SHORTS JOINEDMETRICAL T" + - "RISEMEMETRICAL TETRASEMEMETRICAL PENTASEMEEARTH GROUNDFUSETOP PARENTHESI" + - "SBOTTOM PARENTHESISTOP CURLY BRACKETBOTTOM CURLY BRACKETTOP TORTOISE SHE" + - "LL BRACKETBOTTOM TORTOISE SHELL BRACKETWHITE TRAPEZIUMBENZENE RING WITH " + - "CIRCLESTRAIGHTNESSFLATNESSAC CURRENTELECTRICAL INTERSECTIONDECIMAL EXPON" + - "ENT SYMBOLBLACK RIGHT-POINTING DOUBLE TRIANGLEBLACK LEFT-POINTING DOUBLE" + - " TRIANGLEBLACK UP-POINTING DOUBLE TRIANGLEBLACK DOWN-POINTING DOUBLE TRI" + - "ANGLEBLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BARBLACK LEFT-PO") + ("" + - "INTING DOUBLE TRIANGLE WITH VERTICAL BARBLACK RIGHT-POINTING TRIANGLE WI" + - "TH DOUBLE VERTICAL BARALARM CLOCKSTOPWATCHTIMER CLOCKHOURGLASS WITH FLOW" + - "ING SANDBLACK MEDIUM LEFT-POINTING TRIANGLEBLACK MEDIUM RIGHT-POINTING T" + - "RIANGLEBLACK MEDIUM UP-POINTING TRIANGLEBLACK MEDIUM DOWN-POINTING TRIAN" + - "GLEDOUBLE VERTICAL BARBLACK SQUARE FOR STOPBLACK CIRCLE FOR RECORDPOWER " + - "SYMBOLPOWER ON-OFF SYMBOLPOWER ON SYMBOLPOWER SLEEP SYMBOLSYMBOL FOR NUL" + - "LSYMBOL FOR START OF HEADINGSYMBOL FOR START OF TEXTSYMBOL FOR END OF TE" + - "XTSYMBOL FOR END OF TRANSMISSIONSYMBOL FOR ENQUIRYSYMBOL FOR ACKNOWLEDGE" + - "SYMBOL FOR BELLSYMBOL FOR BACKSPACESYMBOL FOR HORIZONTAL TABULATIONSYMBO" + - "L FOR LINE FEEDSYMBOL FOR VERTICAL TABULATIONSYMBOL FOR FORM FEEDSYMBOL " + - "FOR CARRIAGE RETURNSYMBOL FOR SHIFT OUTSYMBOL FOR SHIFT INSYMBOL FOR DAT" + - "A LINK ESCAPESYMBOL FOR DEVICE CONTROL ONESYMBOL FOR DEVICE CONTROL TWOS" + - "YMBOL FOR DEVICE CONTROL THREESYMBOL FOR DEVICE CONTROL FOURSYMBOL FOR N" + - "EGATIVE ACKNOWLEDGESYMBOL FOR SYNCHRONOUS IDLESYMBOL FOR END OF TRANSMIS" + - "SION BLOCKSYMBOL FOR CANCELSYMBOL FOR END OF MEDIUMSYMBOL FOR SUBSTITUTE" + - "SYMBOL FOR ESCAPESYMBOL FOR FILE SEPARATORSYMBOL FOR GROUP SEPARATORSYMB" + - "OL FOR RECORD SEPARATORSYMBOL FOR UNIT SEPARATORSYMBOL FOR SPACESYMBOL F" + - "OR DELETEBLANK SYMBOLOPEN BOXSYMBOL FOR NEWLINESYMBOL FOR DELETE FORM TW" + - "OSYMBOL FOR SUBSTITUTE FORM TWOOCR HOOKOCR CHAIROCR FORKOCR INVERTED FOR" + - "KOCR BELT BUCKLEOCR BOW TIEOCR BRANCH BANK IDENTIFICATIONOCR AMOUNT OF C" + - "HECKOCR DASHOCR CUSTOMER ACCOUNT NUMBEROCR DOUBLE BACKSLASHCIRCLED DIGIT" + - " ONECIRCLED DIGIT TWOCIRCLED DIGIT THREECIRCLED DIGIT FOURCIRCLED DIGIT " + - "FIVECIRCLED DIGIT SIXCIRCLED DIGIT SEVENCIRCLED DIGIT EIGHTCIRCLED DIGIT" + - " NINECIRCLED NUMBER TENCIRCLED NUMBER ELEVENCIRCLED NUMBER TWELVECIRCLED" + - " NUMBER THIRTEENCIRCLED NUMBER FOURTEENCIRCLED NUMBER FIFTEENCIRCLED NUM" + - "BER SIXTEENCIRCLED NUMBER SEVENTEENCIRCLED NUMBER EIGHTEENCIRCLED NUMBER" + - " NINETEENCIRCLED NUMBER TWENTYPARENTHESIZED DIGIT ONEPARENTHESIZED DIGIT" + - " TWOPARENTHESIZED DIGIT THREEPARENTHESIZED DIGIT FOURPARENTHESIZED DIGIT" + - " FIVEPARENTHESIZED DIGIT SIXPARENTHESIZED DIGIT SEVENPARENTHESIZED DIGIT" + - " EIGHTPARENTHESIZED DIGIT NINEPARENTHESIZED NUMBER TENPARENTHESIZED NUMB" + - "ER ELEVENPARENTHESIZED NUMBER TWELVEPARENTHESIZED NUMBER THIRTEENPARENTH" + - "ESIZED NUMBER FOURTEENPARENTHESIZED NUMBER FIFTEENPARENTHESIZED NUMBER S" + - "IXTEENPARENTHESIZED NUMBER SEVENTEENPARENTHESIZED NUMBER EIGHTEENPARENTH" + - "ESIZED NUMBER NINETEENPARENTHESIZED NUMBER TWENTYDIGIT ONE FULL STOPDIGI" + - "T TWO FULL STOPDIGIT THREE FULL STOPDIGIT FOUR FULL STOPDIGIT FIVE FULL " + - "STOPDIGIT SIX FULL STOPDIGIT SEVEN FULL STOPDIGIT EIGHT FULL STOPDIGIT N" + - "INE FULL STOPNUMBER TEN FULL STOPNUMBER ELEVEN FULL STOPNUMBER TWELVE FU" + - "LL STOPNUMBER THIRTEEN FULL STOPNUMBER FOURTEEN FULL STOPNUMBER FIFTEEN " + - "FULL STOPNUMBER SIXTEEN FULL STOPNUMBER SEVENTEEN FULL STOPNUMBER EIGHTE" + - "EN FULL STOPNUMBER NINETEEN FULL STOPNUMBER TWENTY FULL STOPPARENTHESIZE" + - "D LATIN SMALL LETTER APARENTHESIZED LATIN SMALL LETTER BPARENTHESIZED LA" + - "TIN SMALL LETTER CPARENTHESIZED LATIN SMALL LETTER DPARENTHESIZED LATIN " + - "SMALL LETTER EPARENTHESIZED LATIN SMALL LETTER FPARENTHESIZED LATIN SMAL" + - "L LETTER GPARENTHESIZED LATIN SMALL LETTER HPARENTHESIZED LATIN SMALL LE" + - "TTER IPARENTHESIZED LATIN SMALL LETTER JPARENTHESIZED LATIN SMALL LETTER" + - " KPARENTHESIZED LATIN SMALL LETTER LPARENTHESIZED LATIN SMALL LETTER MPA" + - "RENTHESIZED LATIN SMALL LETTER NPARENTHESIZED LATIN SMALL LETTER OPARENT" + - "HESIZED LATIN SMALL LETTER PPARENTHESIZED LATIN SMALL LETTER QPARENTHESI" + - "ZED LATIN SMALL LETTER RPARENTHESIZED LATIN SMALL LETTER SPARENTHESIZED " + - "LATIN SMALL LETTER TPARENTHESIZED LATIN SMALL LETTER UPARENTHESIZED LATI" + - "N SMALL LETTER VPARENTHESIZED LATIN SMALL LETTER WPARENTHESIZED LATIN SM" + - "ALL LETTER XPARENTHESIZED LATIN SMALL LETTER YPARENTHESIZED LATIN SMALL " + - "LETTER ZCIRCLED LATIN CAPITAL LETTER ACIRCLED LATIN CAPITAL LETTER BCIRC" + - "LED LATIN CAPITAL LETTER CCIRCLED LATIN CAPITAL LETTER DCIRCLED LATIN CA" + - "PITAL LETTER ECIRCLED LATIN CAPITAL LETTER FCIRCLED LATIN CAPITAL LETTER" + - " GCIRCLED LATIN CAPITAL LETTER HCIRCLED LATIN CAPITAL LETTER ICIRCLED LA" + - "TIN CAPITAL LETTER JCIRCLED LATIN CAPITAL LETTER KCIRCLED LATIN CAPITAL " + - "LETTER LCIRCLED LATIN CAPITAL LETTER MCIRCLED LATIN CAPITAL LETTER NCIRC" + - "LED LATIN CAPITAL LETTER OCIRCLED LATIN CAPITAL LETTER PCIRCLED LATIN CA" + - "PITAL LETTER QCIRCLED LATIN CAPITAL LETTER RCIRCLED LATIN CAPITAL LETTER" + - " SCIRCLED LATIN CAPITAL LETTER TCIRCLED LATIN CAPITAL LETTER UCIRCLED LA" + - "TIN CAPITAL LETTER VCIRCLED LATIN CAPITAL LETTER WCIRCLED LATIN CAPITAL " + - "LETTER XCIRCLED LATIN CAPITAL LETTER YCIRCLED LATIN CAPITAL LETTER ZCIRC" + - "LED LATIN SMALL LETTER ACIRCLED LATIN SMALL LETTER BCIRCLED LATIN SMALL ") + ("" + - "LETTER CCIRCLED LATIN SMALL LETTER DCIRCLED LATIN SMALL LETTER ECIRCLED " + - "LATIN SMALL LETTER FCIRCLED LATIN SMALL LETTER GCIRCLED LATIN SMALL LETT" + - "ER HCIRCLED LATIN SMALL LETTER ICIRCLED LATIN SMALL LETTER JCIRCLED LATI" + - "N SMALL LETTER KCIRCLED LATIN SMALL LETTER LCIRCLED LATIN SMALL LETTER M" + - "CIRCLED LATIN SMALL LETTER NCIRCLED LATIN SMALL LETTER OCIRCLED LATIN SM" + - "ALL LETTER PCIRCLED LATIN SMALL LETTER QCIRCLED LATIN SMALL LETTER RCIRC" + - "LED LATIN SMALL LETTER SCIRCLED LATIN SMALL LETTER TCIRCLED LATIN SMALL " + - "LETTER UCIRCLED LATIN SMALL LETTER VCIRCLED LATIN SMALL LETTER WCIRCLED " + - "LATIN SMALL LETTER XCIRCLED LATIN SMALL LETTER YCIRCLED LATIN SMALL LETT" + - "ER ZCIRCLED DIGIT ZERONEGATIVE CIRCLED NUMBER ELEVENNEGATIVE CIRCLED NUM" + - "BER TWELVENEGATIVE CIRCLED NUMBER THIRTEENNEGATIVE CIRCLED NUMBER FOURTE" + - "ENNEGATIVE CIRCLED NUMBER FIFTEENNEGATIVE CIRCLED NUMBER SIXTEENNEGATIVE" + - " CIRCLED NUMBER SEVENTEENNEGATIVE CIRCLED NUMBER EIGHTEENNEGATIVE CIRCLE" + - "D NUMBER NINETEENNEGATIVE CIRCLED NUMBER TWENTYDOUBLE CIRCLED DIGIT ONED" + - "OUBLE CIRCLED DIGIT TWODOUBLE CIRCLED DIGIT THREEDOUBLE CIRCLED DIGIT FO" + - "URDOUBLE CIRCLED DIGIT FIVEDOUBLE CIRCLED DIGIT SIXDOUBLE CIRCLED DIGIT " + - "SEVENDOUBLE CIRCLED DIGIT EIGHTDOUBLE CIRCLED DIGIT NINEDOUBLE CIRCLED N" + - "UMBER TENNEGATIVE CIRCLED DIGIT ZEROBOX DRAWINGS LIGHT HORIZONTALBOX DRA" + - "WINGS HEAVY HORIZONTALBOX DRAWINGS LIGHT VERTICALBOX DRAWINGS HEAVY VERT" + - "ICALBOX DRAWINGS LIGHT TRIPLE DASH HORIZONTALBOX DRAWINGS HEAVY TRIPLE D" + - "ASH HORIZONTALBOX DRAWINGS LIGHT TRIPLE DASH VERTICALBOX DRAWINGS HEAVY " + - "TRIPLE DASH VERTICALBOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTALBOX DRAW" + - "INGS HEAVY QUADRUPLE DASH HORIZONTALBOX DRAWINGS LIGHT QUADRUPLE DASH VE" + - "RTICALBOX DRAWINGS HEAVY QUADRUPLE DASH VERTICALBOX DRAWINGS LIGHT DOWN " + - "AND RIGHTBOX DRAWINGS DOWN LIGHT AND RIGHT HEAVYBOX DRAWINGS DOWN HEAVY " + - "AND RIGHT LIGHTBOX DRAWINGS HEAVY DOWN AND RIGHTBOX DRAWINGS LIGHT DOWN " + - "AND LEFTBOX DRAWINGS DOWN LIGHT AND LEFT HEAVYBOX DRAWINGS DOWN HEAVY AN" + - "D LEFT LIGHTBOX DRAWINGS HEAVY DOWN AND LEFTBOX DRAWINGS LIGHT UP AND RI" + - "GHTBOX DRAWINGS UP LIGHT AND RIGHT HEAVYBOX DRAWINGS UP HEAVY AND RIGHT " + - "LIGHTBOX DRAWINGS HEAVY UP AND RIGHTBOX DRAWINGS LIGHT UP AND LEFTBOX DR" + - "AWINGS UP LIGHT AND LEFT HEAVYBOX DRAWINGS UP HEAVY AND LEFT LIGHTBOX DR" + - "AWINGS HEAVY UP AND LEFTBOX DRAWINGS LIGHT VERTICAL AND RIGHTBOX DRAWING" + - "S VERTICAL LIGHT AND RIGHT HEAVYBOX DRAWINGS UP HEAVY AND RIGHT DOWN LIG" + - "HTBOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHTBOX DRAWINGS VERTICAL HEAVY " + - "AND RIGHT LIGHTBOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVYBOX DRAWINGS UP" + - " LIGHT AND RIGHT DOWN HEAVYBOX DRAWINGS HEAVY VERTICAL AND RIGHTBOX DRAW" + - "INGS LIGHT VERTICAL AND LEFTBOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVYBO" + - "X DRAWINGS UP HEAVY AND LEFT DOWN LIGHTBOX DRAWINGS DOWN HEAVY AND LEFT " + - "UP LIGHTBOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHTBOX DRAWINGS DOWN LIGH" + - "T AND LEFT UP HEAVYBOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVYBOX DRAWINGS" + - " HEAVY VERTICAL AND LEFTBOX DRAWINGS LIGHT DOWN AND HORIZONTALBOX DRAWIN" + - "GS LEFT HEAVY AND RIGHT DOWN LIGHTBOX DRAWINGS RIGHT HEAVY AND LEFT DOWN" + - " LIGHTBOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVYBOX DRAWINGS DOWN HEAV" + - "Y AND HORIZONTAL LIGHTBOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVYBOX DR" + - "AWINGS LEFT LIGHT AND RIGHT DOWN HEAVYBOX DRAWINGS HEAVY DOWN AND HORIZO" + - "NTALBOX DRAWINGS LIGHT UP AND HORIZONTALBOX DRAWINGS LEFT HEAVY AND RIGH" + - "T UP LIGHTBOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHTBOX DRAWINGS UP LIGH" + - "T AND HORIZONTAL HEAVYBOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHTBOX DRAW" + - "INGS RIGHT LIGHT AND LEFT UP HEAVYBOX DRAWINGS LEFT LIGHT AND RIGHT UP H" + - "EAVYBOX DRAWINGS HEAVY UP AND HORIZONTALBOX DRAWINGS LIGHT VERTICAL AND " + - "HORIZONTALBOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHTBOX DRAWINGS R" + - "IGHT HEAVY AND LEFT VERTICAL LIGHTBOX DRAWINGS VERTICAL LIGHT AND HORIZO" + - "NTAL HEAVYBOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHTBOX DRAWINGS DO" + - "WN HEAVY AND UP HORIZONTAL LIGHTBOX DRAWINGS VERTICAL HEAVY AND HORIZONT" + - "AL LIGHTBOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHTBOX DRAWINGS RIGH" + - "T UP HEAVY AND LEFT DOWN LIGHTBOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP " + - "LIGHTBOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHTBOX DRAWINGS DOWN LI" + - "GHT AND UP HORIZONTAL HEAVYBOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEA" + - "VYBOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVYBOX DRAWINGS LEFT LIGH" + - "T AND RIGHT VERTICAL HEAVYBOX DRAWINGS HEAVY VERTICAL AND HORIZONTALBOX " + - "DRAWINGS LIGHT DOUBLE DASH HORIZONTALBOX DRAWINGS HEAVY DOUBLE DASH HORI" + - "ZONTALBOX DRAWINGS LIGHT DOUBLE DASH VERTICALBOX DRAWINGS HEAVY DOUBLE D" + - "ASH VERTICALBOX DRAWINGS DOUBLE HORIZONTALBOX DRAWINGS DOUBLE VERTICALBO" + - "X DRAWINGS DOWN SINGLE AND RIGHT DOUBLEBOX DRAWINGS DOWN DOUBLE AND RIGH") + ("" + - "T SINGLEBOX DRAWINGS DOUBLE DOWN AND RIGHTBOX DRAWINGS DOWN SINGLE AND L" + - "EFT DOUBLEBOX DRAWINGS DOWN DOUBLE AND LEFT SINGLEBOX DRAWINGS DOUBLE DO" + - "WN AND LEFTBOX DRAWINGS UP SINGLE AND RIGHT DOUBLEBOX DRAWINGS UP DOUBLE" + - " AND RIGHT SINGLEBOX DRAWINGS DOUBLE UP AND RIGHTBOX DRAWINGS UP SINGLE " + - "AND LEFT DOUBLEBOX DRAWINGS UP DOUBLE AND LEFT SINGLEBOX DRAWINGS DOUBLE" + - " UP AND LEFTBOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLEBOX DRAWINGS VE" + - "RTICAL DOUBLE AND RIGHT SINGLEBOX DRAWINGS DOUBLE VERTICAL AND RIGHTBOX " + - "DRAWINGS VERTICAL SINGLE AND LEFT DOUBLEBOX DRAWINGS VERTICAL DOUBLE AND" + - " LEFT SINGLEBOX DRAWINGS DOUBLE VERTICAL AND LEFTBOX DRAWINGS DOWN SINGL" + - "E AND HORIZONTAL DOUBLEBOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLEBOX" + - " DRAWINGS DOUBLE DOWN AND HORIZONTALBOX DRAWINGS UP SINGLE AND HORIZONTA" + - "L DOUBLEBOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLEBOX DRAWINGS DOUBLE " + - "UP AND HORIZONTALBOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLEBOX D" + - "RAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLEBOX DRAWINGS DOUBLE VERTICA" + - "L AND HORIZONTALBOX DRAWINGS LIGHT ARC DOWN AND RIGHTBOX DRAWINGS LIGHT " + - "ARC DOWN AND LEFTBOX DRAWINGS LIGHT ARC UP AND LEFTBOX DRAWINGS LIGHT AR" + - "C UP AND RIGHTBOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFTBOX D" + - "RAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHTBOX DRAWINGS LIGHT DIAGO" + - "NAL CROSSBOX DRAWINGS LIGHT LEFTBOX DRAWINGS LIGHT UPBOX DRAWINGS LIGHT " + - "RIGHTBOX DRAWINGS LIGHT DOWNBOX DRAWINGS HEAVY LEFTBOX DRAWINGS HEAVY UP" + - "BOX DRAWINGS HEAVY RIGHTBOX DRAWINGS HEAVY DOWNBOX DRAWINGS LIGHT LEFT A" + - "ND HEAVY RIGHTBOX DRAWINGS LIGHT UP AND HEAVY DOWNBOX DRAWINGS HEAVY LEF" + - "T AND LIGHT RIGHTBOX DRAWINGS HEAVY UP AND LIGHT DOWNUPPER HALF BLOCKLOW" + - "ER ONE EIGHTH BLOCKLOWER ONE QUARTER BLOCKLOWER THREE EIGHTHS BLOCKLOWER" + - " HALF BLOCKLOWER FIVE EIGHTHS BLOCKLOWER THREE QUARTERS BLOCKLOWER SEVEN" + - " EIGHTHS BLOCKFULL BLOCKLEFT SEVEN EIGHTHS BLOCKLEFT THREE QUARTERS BLOC" + - "KLEFT FIVE EIGHTHS BLOCKLEFT HALF BLOCKLEFT THREE EIGHTHS BLOCKLEFT ONE " + - "QUARTER BLOCKLEFT ONE EIGHTH BLOCKRIGHT HALF BLOCKLIGHT SHADEMEDIUM SHAD" + - "EDARK SHADEUPPER ONE EIGHTH BLOCKRIGHT ONE EIGHTH BLOCKQUADRANT LOWER LE" + - "FTQUADRANT LOWER RIGHTQUADRANT UPPER LEFTQUADRANT UPPER LEFT AND LOWER L" + - "EFT AND LOWER RIGHTQUADRANT UPPER LEFT AND LOWER RIGHTQUADRANT UPPER LEF" + - "T AND UPPER RIGHT AND LOWER LEFTQUADRANT UPPER LEFT AND UPPER RIGHT AND " + - "LOWER RIGHTQUADRANT UPPER RIGHTQUADRANT UPPER RIGHT AND LOWER LEFTQUADRA" + - "NT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHTBLACK SQUAREWHITE SQUAREWHI" + - "TE SQUARE WITH ROUNDED CORNERSWHITE SQUARE CONTAINING BLACK SMALL SQUARE" + - "SQUARE WITH HORIZONTAL FILLSQUARE WITH VERTICAL FILLSQUARE WITH ORTHOGON" + - "AL CROSSHATCH FILLSQUARE WITH UPPER LEFT TO LOWER RIGHT FILLSQUARE WITH " + - "UPPER RIGHT TO LOWER LEFT FILLSQUARE WITH DIAGONAL CROSSHATCH FILLBLACK " + - "SMALL SQUAREWHITE SMALL SQUAREBLACK RECTANGLEWHITE RECTANGLEBLACK VERTIC" + - "AL RECTANGLEWHITE VERTICAL RECTANGLEBLACK PARALLELOGRAMWHITE PARALLELOGR" + - "AMBLACK UP-POINTING TRIANGLEWHITE UP-POINTING TRIANGLEBLACK UP-POINTING " + - "SMALL TRIANGLEWHITE UP-POINTING SMALL TRIANGLEBLACK RIGHT-POINTING TRIAN" + - "GLEWHITE RIGHT-POINTING TRIANGLEBLACK RIGHT-POINTING SMALL TRIANGLEWHITE" + - " RIGHT-POINTING SMALL TRIANGLEBLACK RIGHT-POINTING POINTERWHITE RIGHT-PO" + - "INTING POINTERBLACK DOWN-POINTING TRIANGLEWHITE DOWN-POINTING TRIANGLEBL" + - "ACK DOWN-POINTING SMALL TRIANGLEWHITE DOWN-POINTING SMALL TRIANGLEBLACK " + - "LEFT-POINTING TRIANGLEWHITE LEFT-POINTING TRIANGLEBLACK LEFT-POINTING SM" + - "ALL TRIANGLEWHITE LEFT-POINTING SMALL TRIANGLEBLACK LEFT-POINTING POINTE" + - "RWHITE LEFT-POINTING POINTERBLACK DIAMONDWHITE DIAMONDWHITE DIAMOND CONT" + - "AINING BLACK SMALL DIAMONDFISHEYELOZENGEWHITE CIRCLEDOTTED CIRCLECIRCLE " + - "WITH VERTICAL FILLBULLSEYEBLACK CIRCLECIRCLE WITH LEFT HALF BLACKCIRCLE " + - "WITH RIGHT HALF BLACKCIRCLE WITH LOWER HALF BLACKCIRCLE WITH UPPER HALF " + - "BLACKCIRCLE WITH UPPER RIGHT QUADRANT BLACKCIRCLE WITH ALL BUT UPPER LEF" + - "T QUADRANT BLACKLEFT HALF BLACK CIRCLERIGHT HALF BLACK CIRCLEINVERSE BUL" + - "LETINVERSE WHITE CIRCLEUPPER HALF INVERSE WHITE CIRCLELOWER HALF INVERSE" + - " WHITE CIRCLEUPPER LEFT QUADRANT CIRCULAR ARCUPPER RIGHT QUADRANT CIRCUL" + - "AR ARCLOWER RIGHT QUADRANT CIRCULAR ARCLOWER LEFT QUADRANT CIRCULAR ARCU" + - "PPER HALF CIRCLELOWER HALF CIRCLEBLACK LOWER RIGHT TRIANGLEBLACK LOWER L" + - "EFT TRIANGLEBLACK UPPER LEFT TRIANGLEBLACK UPPER RIGHT TRIANGLEWHITE BUL" + - "LETSQUARE WITH LEFT HALF BLACKSQUARE WITH RIGHT HALF BLACKSQUARE WITH UP" + - "PER LEFT DIAGONAL HALF BLACKSQUARE WITH LOWER RIGHT DIAGONAL HALF BLACKW" + - "HITE SQUARE WITH VERTICAL BISECTING LINEWHITE UP-POINTING TRIANGLE WITH " + - "DOTUP-POINTING TRIANGLE WITH LEFT HALF BLACKUP-POINTING TRIANGLE WITH RI" + - "GHT HALF BLACKLARGE CIRCLEWHITE SQUARE WITH UPPER LEFT QUADRANTWHITE SQU") + ("" + - "ARE WITH LOWER LEFT QUADRANTWHITE SQUARE WITH LOWER RIGHT QUADRANTWHITE " + - "SQUARE WITH UPPER RIGHT QUADRANTWHITE CIRCLE WITH UPPER LEFT QUADRANTWHI" + - "TE CIRCLE WITH LOWER LEFT QUADRANTWHITE CIRCLE WITH LOWER RIGHT QUADRANT" + - "WHITE CIRCLE WITH UPPER RIGHT QUADRANTUPPER LEFT TRIANGLEUPPER RIGHT TRI" + - "ANGLELOWER LEFT TRIANGLEWHITE MEDIUM SQUAREBLACK MEDIUM SQUAREWHITE MEDI" + - "UM SMALL SQUAREBLACK MEDIUM SMALL SQUARELOWER RIGHT TRIANGLEBLACK SUN WI" + - "TH RAYSCLOUDUMBRELLASNOWMANCOMETBLACK STARWHITE STARLIGHTNINGTHUNDERSTOR" + - "MSUNASCENDING NODEDESCENDING NODECONJUNCTIONOPPOSITIONBLACK TELEPHONEWHI" + - "TE TELEPHONEBALLOT BOXBALLOT BOX WITH CHECKBALLOT BOX WITH XSALTIREUMBRE" + - "LLA WITH RAIN DROPSHOT BEVERAGEWHITE SHOGI PIECEBLACK SHOGI PIECESHAMROC" + - "KREVERSED ROTATED FLORAL HEART BULLETBLACK LEFT POINTING INDEXBLACK RIGH" + - "T POINTING INDEXWHITE LEFT POINTING INDEXWHITE UP POINTING INDEXWHITE RI" + - "GHT POINTING INDEXWHITE DOWN POINTING INDEXSKULL AND CROSSBONESCAUTION S" + - "IGNRADIOACTIVE SIGNBIOHAZARD SIGNCADUCEUSANKHORTHODOX CROSSCHI RHOCROSS " + - "OF LORRAINECROSS OF JERUSALEMSTAR AND CRESCENTFARSI SYMBOLADI SHAKTIHAMM" + - "ER AND SICKLEPEACE SYMBOLYIN YANGTRIGRAM FOR HEAVENTRIGRAM FOR LAKETRIGR" + - "AM FOR FIRETRIGRAM FOR THUNDERTRIGRAM FOR WINDTRIGRAM FOR WATERTRIGRAM F" + - "OR MOUNTAINTRIGRAM FOR EARTHWHEEL OF DHARMAWHITE FROWNING FACEWHITE SMIL" + - "ING FACEBLACK SMILING FACEWHITE SUN WITH RAYSFIRST QUARTER MOONLAST QUAR" + - "TER MOONMERCURYFEMALE SIGNEARTHMALE SIGNJUPITERSATURNURANUSNEPTUNEPLUTOA" + - "RIESTAURUSGEMINICANCERLEOVIRGOLIBRASCORPIUSSAGITTARIUSCAPRICORNAQUARIUSP" + - "ISCESWHITE CHESS KINGWHITE CHESS QUEENWHITE CHESS ROOKWHITE CHESS BISHOP" + - "WHITE CHESS KNIGHTWHITE CHESS PAWNBLACK CHESS KINGBLACK CHESS QUEENBLACK" + - " CHESS ROOKBLACK CHESS BISHOPBLACK CHESS KNIGHTBLACK CHESS PAWNBLACK SPA" + - "DE SUITWHITE HEART SUITWHITE DIAMOND SUITBLACK CLUB SUITWHITE SPADE SUIT" + - "BLACK HEART SUITBLACK DIAMOND SUITWHITE CLUB SUITHOT SPRINGSQUARTER NOTE" + - "EIGHTH NOTEBEAMED EIGHTH NOTESBEAMED SIXTEENTH NOTESMUSIC FLAT SIGNMUSIC" + - " NATURAL SIGNMUSIC SHARP SIGNWEST SYRIAC CROSSEAST SYRIAC CROSSUNIVERSAL" + - " RECYCLING SYMBOLRECYCLING SYMBOL FOR TYPE-1 PLASTICSRECYCLING SYMBOL FO" + - "R TYPE-2 PLASTICSRECYCLING SYMBOL FOR TYPE-3 PLASTICSRECYCLING SYMBOL FO" + - "R TYPE-4 PLASTICSRECYCLING SYMBOL FOR TYPE-5 PLASTICSRECYCLING SYMBOL FO" + - "R TYPE-6 PLASTICSRECYCLING SYMBOL FOR TYPE-7 PLASTICSRECYCLING SYMBOL FO" + - "R GENERIC MATERIALSBLACK UNIVERSAL RECYCLING SYMBOLRECYCLED PAPER SYMBOL" + - "PARTIALLY-RECYCLED PAPER SYMBOLPERMANENT PAPER SIGNWHEELCHAIR SYMBOLDIE " + - "FACE-1DIE FACE-2DIE FACE-3DIE FACE-4DIE FACE-5DIE FACE-6WHITE CIRCLE WIT" + - "H DOT RIGHTWHITE CIRCLE WITH TWO DOTSBLACK CIRCLE WITH WHITE DOT RIGHTBL" + - "ACK CIRCLE WITH TWO WHITE DOTSMONOGRAM FOR YANGMONOGRAM FOR YINDIGRAM FO" + - "R GREATER YANGDIGRAM FOR LESSER YINDIGRAM FOR LESSER YANGDIGRAM FOR GREA" + - "TER YINWHITE FLAGBLACK FLAGHAMMER AND PICKANCHORCROSSED SWORDSSTAFF OF A" + - "ESCULAPIUSSCALESALEMBICFLOWERGEARSTAFF OF HERMESATOM SYMBOLFLEUR-DE-LISO" + - "UTLINED WHITE STARTHREE LINES CONVERGING RIGHTTHREE LINES CONVERGING LEF" + - "TWARNING SIGNHIGH VOLTAGE SIGNDOUBLED FEMALE SIGNDOUBLED MALE SIGNINTERL" + - "OCKED FEMALE AND MALE SIGNMALE AND FEMALE SIGNMALE WITH STROKE SIGNMALE " + - "WITH STROKE AND MALE AND FEMALE SIGNVERTICAL MALE WITH STROKE SIGNHORIZO" + - "NTAL MALE WITH STROKE SIGNMEDIUM WHITE CIRCLEMEDIUM BLACK CIRCLEMEDIUM S" + - "MALL WHITE CIRCLEMARRIAGE SYMBOLDIVORCE SYMBOLUNMARRIED PARTNERSHIP SYMB" + - "OLCOFFINFUNERAL URNNEUTERCERESPALLASJUNOVESTACHIRONBLACK MOON LILITHSEXT" + - "ILESEMISEXTILEQUINCUNXSESQUIQUADRATESOCCER BALLBASEBALLSQUARED KEYWHITE " + - "DRAUGHTS MANWHITE DRAUGHTS KINGBLACK DRAUGHTS MANBLACK DRAUGHTS KINGSNOW" + - "MAN WITHOUT SNOWSUN BEHIND CLOUDRAINBLACK SNOWMANTHUNDER CLOUD AND RAINT" + - "URNED WHITE SHOGI PIECETURNED BLACK SHOGI PIECEWHITE DIAMOND IN SQUARECR" + - "OSSING LANESDISABLED CAROPHIUCHUSPICKCAR SLIDINGHELMET WITH WHITE CROSSC" + - "IRCLED CROSSING LANESCHAINSNO ENTRYALTERNATE ONE-WAY LEFT WAY TRAFFICBLA" + - "CK TWO-WAY LEFT WAY TRAFFICWHITE TWO-WAY LEFT WAY TRAFFICBLACK LEFT LANE" + - " MERGEWHITE LEFT LANE MERGEDRIVE SLOW SIGNHEAVY WHITE DOWN-POINTING TRIA" + - "NGLELEFT CLOSED ENTRYSQUARED SALTIREFALLING DIAGONAL IN WHITE CIRCLE IN " + - "BLACK SQUAREBLACK TRUCKRESTRICTED LEFT ENTRY-1RESTRICTED LEFT ENTRY-2AST" + - "RONOMICAL SYMBOL FOR URANUSHEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVEPE" + - "NTAGRAMRIGHT-HANDED INTERLACED PENTAGRAMLEFT-HANDED INTERLACED PENTAGRAM" + - "INVERTED PENTAGRAMBLACK CROSS ON SHIELDSHINTO SHRINECHURCHCASTLEHISTORIC" + - " SITEGEAR WITHOUT HUBGEAR WITH HANDLESMAP SYMBOL FOR LIGHTHOUSEMOUNTAINU" + - "MBRELLA ON GROUNDFOUNTAINFLAG IN HOLEFERRYSAILBOATSQUARE FOUR CORNERSSKI" + - "ERICE SKATEPERSON WITH BALLTENTJAPANESE BANK SYMBOLHEADSTONE GRAVEYARD S" + - "YMBOLFUEL PUMPCUP ON BLACK SQUAREWHITE FLAG WITH HORIZONTAL MIDDLE BLACK") + ("" + - " STRIPEBLACK SAFETY SCISSORSUPPER BLADE SCISSORSBLACK SCISSORSLOWER BLAD" + - "E SCISSORSWHITE SCISSORSWHITE HEAVY CHECK MARKTELEPHONE LOCATION SIGNTAP" + - "E DRIVEAIRPLANEENVELOPERAISED FISTRAISED HANDVICTORY HANDWRITING HANDLOW" + - "ER RIGHT PENCILPENCILUPPER RIGHT PENCILWHITE NIBBLACK NIBCHECK MARKHEAVY" + - " CHECK MARKMULTIPLICATION XHEAVY MULTIPLICATION XBALLOT XHEAVY BALLOT XO" + - "UTLINED GREEK CROSSHEAVY GREEK CROSSOPEN CENTRE CROSSHEAVY OPEN CENTRE C" + - "ROSSLATIN CROSSSHADOWED WHITE LATIN CROSSOUTLINED LATIN CROSSMALTESE CRO" + - "SSSTAR OF DAVIDFOUR TEARDROP-SPOKED ASTERISKFOUR BALLOON-SPOKED ASTERISK" + - "HEAVY FOUR BALLOON-SPOKED ASTERISKFOUR CLUB-SPOKED ASTERISKBLACK FOUR PO" + - "INTED STARWHITE FOUR POINTED STARSPARKLESSTRESS OUTLINED WHITE STARCIRCL" + - "ED WHITE STAROPEN CENTRE BLACK STARBLACK CENTRE WHITE STAROUTLINED BLACK" + - " STARHEAVY OUTLINED BLACK STARPINWHEEL STARSHADOWED WHITE STARHEAVY ASTE" + - "RISKOPEN CENTRE ASTERISKEIGHT SPOKED ASTERISKEIGHT POINTED BLACK STAREIG" + - "HT POINTED PINWHEEL STARSIX POINTED BLACK STAREIGHT POINTED RECTILINEAR " + - "BLACK STARHEAVY EIGHT POINTED RECTILINEAR BLACK STARTWELVE POINTED BLACK" + - " STARSIXTEEN POINTED ASTERISKTEARDROP-SPOKED ASTERISKOPEN CENTRE TEARDRO" + - "P-SPOKED ASTERISKHEAVY TEARDROP-SPOKED ASTERISKSIX PETALLED BLACK AND WH" + - "ITE FLORETTEBLACK FLORETTEWHITE FLORETTEEIGHT PETALLED OUTLINED BLACK FL" + - "ORETTECIRCLED OPEN CENTRE EIGHT POINTED STARHEAVY TEARDROP-SPOKED PINWHE" + - "EL ASTERISKSNOWFLAKETIGHT TRIFOLIATE SNOWFLAKEHEAVY CHEVRON SNOWFLAKESPA" + - "RKLEHEAVY SPARKLEBALLOON-SPOKED ASTERISKEIGHT TEARDROP-SPOKED PROPELLER " + - "ASTERISKHEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISKCROSS MARKSHADOWED" + - " WHITE CIRCLENEGATIVE SQUARED CROSS MARKLOWER RIGHT DROP-SHADOWED WHITE " + - "SQUAREUPPER RIGHT DROP-SHADOWED WHITE SQUARELOWER RIGHT SHADOWED WHITE S" + - "QUAREUPPER RIGHT SHADOWED WHITE SQUAREBLACK QUESTION MARK ORNAMENTWHITE " + - "QUESTION MARK ORNAMENTWHITE EXCLAMATION MARK ORNAMENTBLACK DIAMOND MINUS" + - " WHITE XHEAVY EXCLAMATION MARK SYMBOLLIGHT VERTICAL BARMEDIUM VERTICAL B" + - "ARHEAVY VERTICAL BARHEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENTHEA" + - "VY SINGLE COMMA QUOTATION MARK ORNAMENTHEAVY DOUBLE TURNED COMMA QUOTATI" + - "ON MARK ORNAMENTHEAVY DOUBLE COMMA QUOTATION MARK ORNAMENTHEAVY LOW SING" + - "LE COMMA QUOTATION MARK ORNAMENTHEAVY LOW DOUBLE COMMA QUOTATION MARK OR" + - "NAMENTCURVED STEM PARAGRAPH SIGN ORNAMENTHEAVY EXCLAMATION MARK ORNAMENT" + - "HEAVY HEART EXCLAMATION MARK ORNAMENTHEAVY BLACK HEARTROTATED HEAVY BLAC" + - "K HEART BULLETFLORAL HEARTROTATED FLORAL HEART BULLETMEDIUM LEFT PARENTH" + - "ESIS ORNAMENTMEDIUM RIGHT PARENTHESIS ORNAMENTMEDIUM FLATTENED LEFT PARE" + - "NTHESIS ORNAMENTMEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENTMEDIUM LEFT-P" + - "OINTING ANGLE BRACKET ORNAMENTMEDIUM RIGHT-POINTING ANGLE BRACKET ORNAME" + - "NTHEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENTHEAVY RIGHT-POINTING " + - "ANGLE QUOTATION MARK ORNAMENTHEAVY LEFT-POINTING ANGLE BRACKET ORNAMENTH" + - "EAVY RIGHT-POINTING ANGLE BRACKET ORNAMENTLIGHT LEFT TORTOISE SHELL BRAC" + - "KET ORNAMENTLIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENTMEDIUM LEFT CURLY" + - " BRACKET ORNAMENTMEDIUM RIGHT CURLY BRACKET ORNAMENTDINGBAT NEGATIVE CIR" + - "CLED DIGIT ONEDINGBAT NEGATIVE CIRCLED DIGIT TWODINGBAT NEGATIVE CIRCLED" + - " DIGIT THREEDINGBAT NEGATIVE CIRCLED DIGIT FOURDINGBAT NEGATIVE CIRCLED " + - "DIGIT FIVEDINGBAT NEGATIVE CIRCLED DIGIT SIXDINGBAT NEGATIVE CIRCLED DIG" + - "IT SEVENDINGBAT NEGATIVE CIRCLED DIGIT EIGHTDINGBAT NEGATIVE CIRCLED DIG" + - "IT NINEDINGBAT NEGATIVE CIRCLED NUMBER TENDINGBAT CIRCLED SANS-SERIF DIG" + - "IT ONEDINGBAT CIRCLED SANS-SERIF DIGIT TWODINGBAT CIRCLED SANS-SERIF DIG" + - "IT THREEDINGBAT CIRCLED SANS-SERIF DIGIT FOURDINGBAT CIRCLED SANS-SERIF " + - "DIGIT FIVEDINGBAT CIRCLED SANS-SERIF DIGIT SIXDINGBAT CIRCLED SANS-SERIF" + - " DIGIT SEVENDINGBAT CIRCLED SANS-SERIF DIGIT EIGHTDINGBAT CIRCLED SANS-S" + - "ERIF DIGIT NINEDINGBAT CIRCLED SANS-SERIF NUMBER TENDINGBAT NEGATIVE CIR" + - "CLED SANS-SERIF DIGIT ONEDINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWODI" + - "NGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREEDINGBAT NEGATIVE CIRCLED SA" + - "NS-SERIF DIGIT FOURDINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVEDINGBAT" + - " NEGATIVE CIRCLED SANS-SERIF DIGIT SIXDINGBAT NEGATIVE CIRCLED SANS-SERI" + - "F DIGIT SEVENDINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHTDINGBAT NEGA" + - "TIVE CIRCLED SANS-SERIF DIGIT NINEDINGBAT NEGATIVE CIRCLED SANS-SERIF NU" + - "MBER TENHEAVY WIDE-HEADED RIGHTWARDS ARROWHEAVY PLUS SIGNHEAVY MINUS SIG" + - "NHEAVY DIVISION SIGNHEAVY SOUTH EAST ARROWHEAVY RIGHTWARDS ARROWHEAVY NO" + - "RTH EAST ARROWDRAFTING POINT RIGHTWARDS ARROWHEAVY ROUND-TIPPED RIGHTWAR" + - "DS ARROWTRIANGLE-HEADED RIGHTWARDS ARROWHEAVY TRIANGLE-HEADED RIGHTWARDS" + - " ARROWDASHED TRIANGLE-HEADED RIGHTWARDS ARROWHEAVY DASHED TRIANGLE-HEADE" + - "D RIGHTWARDS ARROWBLACK RIGHTWARDS ARROWTHREE-D TOP-LIGHTED RIGHTWARDS A") + ("" + - "RROWHEADTHREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEADBLACK RIGHTWARDS ARRO" + - "WHEADHEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROWHEAVY BLACK CURVED" + - " UPWARDS AND RIGHTWARDS ARROWSQUAT BLACK RIGHTWARDS ARROWHEAVY CONCAVE-P" + - "OINTED BLACK RIGHTWARDS ARROWRIGHT-SHADED WHITE RIGHTWARDS ARROWLEFT-SHA" + - "DED WHITE RIGHTWARDS ARROWBACK-TILTED SHADOWED WHITE RIGHTWARDS ARROWFRO" + - "NT-TILTED SHADOWED WHITE RIGHTWARDS ARROWHEAVY LOWER RIGHT-SHADOWED WHIT" + - "E RIGHTWARDS ARROWHEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROWNOTCH" + - "ED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROWCURLY LOOPNOTCHED UPPER RI" + - "GHT-SHADOWED WHITE RIGHTWARDS ARROWCIRCLED HEAVY WHITE RIGHTWARDS ARROWW" + - "HITE-FEATHERED RIGHTWARDS ARROWBLACK-FEATHERED SOUTH EAST ARROWBLACK-FEA" + - "THERED RIGHTWARDS ARROWBLACK-FEATHERED NORTH EAST ARROWHEAVY BLACK-FEATH" + - "ERED SOUTH EAST ARROWHEAVY BLACK-FEATHERED RIGHTWARDS ARROWHEAVY BLACK-F" + - "EATHERED NORTH EAST ARROWTEARDROP-BARBED RIGHTWARDS ARROWHEAVY TEARDROP-" + - "SHANKED RIGHTWARDS ARROWWEDGE-TAILED RIGHTWARDS ARROWHEAVY WEDGE-TAILED " + - "RIGHTWARDS ARROWOPEN-OUTLINED RIGHTWARDS ARROWDOUBLE CURLY LOOPTHREE DIM" + - "ENSIONAL ANGLEWHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLEPERPENDICULA" + - "ROPEN SUBSETOPEN SUPERSETLEFT S-SHAPED BAG DELIMITERRIGHT S-SHAPED BAG D" + - "ELIMITEROR WITH DOT INSIDEREVERSE SOLIDUS PRECEDING SUBSETSUPERSET PRECE" + - "DING SOLIDUSVERTICAL BAR WITH HORIZONTAL STROKEMATHEMATICAL RISING DIAGO" + - "NALLONG DIVISIONMATHEMATICAL FALLING DIAGONALSQUARED LOGICAL ANDSQUARED " + - "LOGICAL ORWHITE DIAMOND WITH CENTRED DOTAND WITH DOTELEMENT OF OPENING U" + - "PWARDSLOWER RIGHT CORNER WITH DOTUPPER LEFT CORNER WITH DOTLEFT OUTER JO" + - "INRIGHT OUTER JOINFULL OUTER JOINLARGE UP TACKLARGE DOWN TACKLEFT AND RI" + - "GHT DOUBLE TURNSTILELEFT AND RIGHT TACKLEFT MULTIMAPLONG RIGHT TACKLONG " + - "LEFT TACKUP TACK WITH CIRCLE ABOVELOZENGE DIVIDED BY HORIZONTAL RULEWHIT" + - "E CONCAVE-SIDED DIAMONDWHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICKWH" + - "ITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICKWHITE SQUARE WITH LEFTWARD" + - "S TICKWHITE SQUARE WITH RIGHTWARDS TICKMATHEMATICAL LEFT WHITE SQUARE BR" + - "ACKETMATHEMATICAL RIGHT WHITE SQUARE BRACKETMATHEMATICAL LEFT ANGLE BRAC" + - "KETMATHEMATICAL RIGHT ANGLE BRACKETMATHEMATICAL LEFT DOUBLE ANGLE BRACKE" + - "TMATHEMATICAL RIGHT DOUBLE ANGLE BRACKETMATHEMATICAL LEFT WHITE TORTOISE" + - " SHELL BRACKETMATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKETMATHEMATICA" + - "L LEFT FLATTENED PARENTHESISMATHEMATICAL RIGHT FLATTENED PARENTHESISUPWA" + - "RDS QUADRUPLE ARROWDOWNWARDS QUADRUPLE ARROWANTICLOCKWISE GAPPED CIRCLE " + - "ARROWCLOCKWISE GAPPED CIRCLE ARROWRIGHT ARROW WITH CIRCLED PLUSLONG LEFT" + - "WARDS ARROWLONG RIGHTWARDS ARROWLONG LEFT RIGHT ARROWLONG LEFTWARDS DOUB" + - "LE ARROWLONG RIGHTWARDS DOUBLE ARROWLONG LEFT RIGHT DOUBLE ARROWLONG LEF" + - "TWARDS ARROW FROM BARLONG RIGHTWARDS ARROW FROM BARLONG LEFTWARDS DOUBLE" + - " ARROW FROM BARLONG RIGHTWARDS DOUBLE ARROW FROM BARLONG RIGHTWARDS SQUI" + - "GGLE ARROWBRAILLE PATTERN BLANKBRAILLE PATTERN DOTS-1BRAILLE PATTERN DOT" + - "S-2BRAILLE PATTERN DOTS-12BRAILLE PATTERN DOTS-3BRAILLE PATTERN DOTS-13B" + - "RAILLE PATTERN DOTS-23BRAILLE PATTERN DOTS-123BRAILLE PATTERN DOTS-4BRAI" + - "LLE PATTERN DOTS-14BRAILLE PATTERN DOTS-24BRAILLE PATTERN DOTS-124BRAILL" + - "E PATTERN DOTS-34BRAILLE PATTERN DOTS-134BRAILLE PATTERN DOTS-234BRAILLE" + - " PATTERN DOTS-1234BRAILLE PATTERN DOTS-5BRAILLE PATTERN DOTS-15BRAILLE P" + - "ATTERN DOTS-25BRAILLE PATTERN DOTS-125BRAILLE PATTERN DOTS-35BRAILLE PAT" + - "TERN DOTS-135BRAILLE PATTERN DOTS-235BRAILLE PATTERN DOTS-1235BRAILLE PA" + - "TTERN DOTS-45BRAILLE PATTERN DOTS-145BRAILLE PATTERN DOTS-245BRAILLE PAT" + - "TERN DOTS-1245BRAILLE PATTERN DOTS-345BRAILLE PATTERN DOTS-1345BRAILLE P" + - "ATTERN DOTS-2345BRAILLE PATTERN DOTS-12345BRAILLE PATTERN DOTS-6BRAILLE " + - "PATTERN DOTS-16BRAILLE PATTERN DOTS-26BRAILLE PATTERN DOTS-126BRAILLE PA" + - "TTERN DOTS-36BRAILLE PATTERN DOTS-136BRAILLE PATTERN DOTS-236BRAILLE PAT" + - "TERN DOTS-1236BRAILLE PATTERN DOTS-46BRAILLE PATTERN DOTS-146BRAILLE PAT" + - "TERN DOTS-246BRAILLE PATTERN DOTS-1246BRAILLE PATTERN DOTS-346BRAILLE PA" + - "TTERN DOTS-1346BRAILLE PATTERN DOTS-2346BRAILLE PATTERN DOTS-12346BRAILL" + - "E PATTERN DOTS-56BRAILLE PATTERN DOTS-156BRAILLE PATTERN DOTS-256BRAILLE" + - " PATTERN DOTS-1256BRAILLE PATTERN DOTS-356BRAILLE PATTERN DOTS-1356BRAIL" + - "LE PATTERN DOTS-2356BRAILLE PATTERN DOTS-12356BRAILLE PATTERN DOTS-456BR" + - "AILLE PATTERN DOTS-1456BRAILLE PATTERN DOTS-2456BRAILLE PATTERN DOTS-124" + - "56BRAILLE PATTERN DOTS-3456BRAILLE PATTERN DOTS-13456BRAILLE PATTERN DOT" + - "S-23456BRAILLE PATTERN DOTS-123456BRAILLE PATTERN DOTS-7BRAILLE PATTERN " + - "DOTS-17BRAILLE PATTERN DOTS-27BRAILLE PATTERN DOTS-127BRAILLE PATTERN DO" + - "TS-37BRAILLE PATTERN DOTS-137BRAILLE PATTERN DOTS-237BRAILLE PATTERN DOT" + - "S-1237BRAILLE PATTERN DOTS-47BRAILLE PATTERN DOTS-147BRAILLE PATTERN DOT") + ("" + - "S-247BRAILLE PATTERN DOTS-1247BRAILLE PATTERN DOTS-347BRAILLE PATTERN DO" + - "TS-1347BRAILLE PATTERN DOTS-2347BRAILLE PATTERN DOTS-12347BRAILLE PATTER" + - "N DOTS-57BRAILLE PATTERN DOTS-157BRAILLE PATTERN DOTS-257BRAILLE PATTERN" + - " DOTS-1257BRAILLE PATTERN DOTS-357BRAILLE PATTERN DOTS-1357BRAILLE PATTE" + - "RN DOTS-2357BRAILLE PATTERN DOTS-12357BRAILLE PATTERN DOTS-457BRAILLE PA" + - "TTERN DOTS-1457BRAILLE PATTERN DOTS-2457BRAILLE PATTERN DOTS-12457BRAILL" + - "E PATTERN DOTS-3457BRAILLE PATTERN DOTS-13457BRAILLE PATTERN DOTS-23457B" + - "RAILLE PATTERN DOTS-123457BRAILLE PATTERN DOTS-67BRAILLE PATTERN DOTS-16" + - "7BRAILLE PATTERN DOTS-267BRAILLE PATTERN DOTS-1267BRAILLE PATTERN DOTS-3" + - "67BRAILLE PATTERN DOTS-1367BRAILLE PATTERN DOTS-2367BRAILLE PATTERN DOTS" + - "-12367BRAILLE PATTERN DOTS-467BRAILLE PATTERN DOTS-1467BRAILLE PATTERN D" + - "OTS-2467BRAILLE PATTERN DOTS-12467BRAILLE PATTERN DOTS-3467BRAILLE PATTE" + - "RN DOTS-13467BRAILLE PATTERN DOTS-23467BRAILLE PATTERN DOTS-123467BRAILL" + - "E PATTERN DOTS-567BRAILLE PATTERN DOTS-1567BRAILLE PATTERN DOTS-2567BRAI" + - "LLE PATTERN DOTS-12567BRAILLE PATTERN DOTS-3567BRAILLE PATTERN DOTS-1356" + - "7BRAILLE PATTERN DOTS-23567BRAILLE PATTERN DOTS-123567BRAILLE PATTERN DO" + - "TS-4567BRAILLE PATTERN DOTS-14567BRAILLE PATTERN DOTS-24567BRAILLE PATTE" + - "RN DOTS-124567BRAILLE PATTERN DOTS-34567BRAILLE PATTERN DOTS-134567BRAIL" + - "LE PATTERN DOTS-234567BRAILLE PATTERN DOTS-1234567BRAILLE PATTERN DOTS-8" + - "BRAILLE PATTERN DOTS-18BRAILLE PATTERN DOTS-28BRAILLE PATTERN DOTS-128BR" + - "AILLE PATTERN DOTS-38BRAILLE PATTERN DOTS-138BRAILLE PATTERN DOTS-238BRA" + - "ILLE PATTERN DOTS-1238BRAILLE PATTERN DOTS-48BRAILLE PATTERN DOTS-148BRA" + - "ILLE PATTERN DOTS-248BRAILLE PATTERN DOTS-1248BRAILLE PATTERN DOTS-348BR" + - "AILLE PATTERN DOTS-1348BRAILLE PATTERN DOTS-2348BRAILLE PATTERN DOTS-123" + - "48BRAILLE PATTERN DOTS-58BRAILLE PATTERN DOTS-158BRAILLE PATTERN DOTS-25" + - "8BRAILLE PATTERN DOTS-1258BRAILLE PATTERN DOTS-358BRAILLE PATTERN DOTS-1" + - "358BRAILLE PATTERN DOTS-2358BRAILLE PATTERN DOTS-12358BRAILLE PATTERN DO" + - "TS-458BRAILLE PATTERN DOTS-1458BRAILLE PATTERN DOTS-2458BRAILLE PATTERN " + - "DOTS-12458BRAILLE PATTERN DOTS-3458BRAILLE PATTERN DOTS-13458BRAILLE PAT" + - "TERN DOTS-23458BRAILLE PATTERN DOTS-123458BRAILLE PATTERN DOTS-68BRAILLE" + - " PATTERN DOTS-168BRAILLE PATTERN DOTS-268BRAILLE PATTERN DOTS-1268BRAILL" + - "E PATTERN DOTS-368BRAILLE PATTERN DOTS-1368BRAILLE PATTERN DOTS-2368BRAI" + - "LLE PATTERN DOTS-12368BRAILLE PATTERN DOTS-468BRAILLE PATTERN DOTS-1468B" + - "RAILLE PATTERN DOTS-2468BRAILLE PATTERN DOTS-12468BRAILLE PATTERN DOTS-3" + - "468BRAILLE PATTERN DOTS-13468BRAILLE PATTERN DOTS-23468BRAILLE PATTERN D" + - "OTS-123468BRAILLE PATTERN DOTS-568BRAILLE PATTERN DOTS-1568BRAILLE PATTE" + - "RN DOTS-2568BRAILLE PATTERN DOTS-12568BRAILLE PATTERN DOTS-3568BRAILLE P" + - "ATTERN DOTS-13568BRAILLE PATTERN DOTS-23568BRAILLE PATTERN DOTS-123568BR" + - "AILLE PATTERN DOTS-4568BRAILLE PATTERN DOTS-14568BRAILLE PATTERN DOTS-24" + - "568BRAILLE PATTERN DOTS-124568BRAILLE PATTERN DOTS-34568BRAILLE PATTERN " + - "DOTS-134568BRAILLE PATTERN DOTS-234568BRAILLE PATTERN DOTS-1234568BRAILL" + - "E PATTERN DOTS-78BRAILLE PATTERN DOTS-178BRAILLE PATTERN DOTS-278BRAILLE" + - " PATTERN DOTS-1278BRAILLE PATTERN DOTS-378BRAILLE PATTERN DOTS-1378BRAIL" + - "LE PATTERN DOTS-2378BRAILLE PATTERN DOTS-12378BRAILLE PATTERN DOTS-478BR" + - "AILLE PATTERN DOTS-1478BRAILLE PATTERN DOTS-2478BRAILLE PATTERN DOTS-124" + - "78BRAILLE PATTERN DOTS-3478BRAILLE PATTERN DOTS-13478BRAILLE PATTERN DOT" + - "S-23478BRAILLE PATTERN DOTS-123478BRAILLE PATTERN DOTS-578BRAILLE PATTER" + - "N DOTS-1578BRAILLE PATTERN DOTS-2578BRAILLE PATTERN DOTS-12578BRAILLE PA" + - "TTERN DOTS-3578BRAILLE PATTERN DOTS-13578BRAILLE PATTERN DOTS-23578BRAIL" + - "LE PATTERN DOTS-123578BRAILLE PATTERN DOTS-4578BRAILLE PATTERN DOTS-1457" + - "8BRAILLE PATTERN DOTS-24578BRAILLE PATTERN DOTS-124578BRAILLE PATTERN DO" + - "TS-34578BRAILLE PATTERN DOTS-134578BRAILLE PATTERN DOTS-234578BRAILLE PA" + - "TTERN DOTS-1234578BRAILLE PATTERN DOTS-678BRAILLE PATTERN DOTS-1678BRAIL" + - "LE PATTERN DOTS-2678BRAILLE PATTERN DOTS-12678BRAILLE PATTERN DOTS-3678B" + - "RAILLE PATTERN DOTS-13678BRAILLE PATTERN DOTS-23678BRAILLE PATTERN DOTS-" + - "123678BRAILLE PATTERN DOTS-4678BRAILLE PATTERN DOTS-14678BRAILLE PATTERN" + - " DOTS-24678BRAILLE PATTERN DOTS-124678BRAILLE PATTERN DOTS-34678BRAILLE " + - "PATTERN DOTS-134678BRAILLE PATTERN DOTS-234678BRAILLE PATTERN DOTS-12346" + - "78BRAILLE PATTERN DOTS-5678BRAILLE PATTERN DOTS-15678BRAILLE PATTERN DOT" + - "S-25678BRAILLE PATTERN DOTS-125678BRAILLE PATTERN DOTS-35678BRAILLE PATT" + - "ERN DOTS-135678BRAILLE PATTERN DOTS-235678BRAILLE PATTERN DOTS-1235678BR" + - "AILLE PATTERN DOTS-45678BRAILLE PATTERN DOTS-145678BRAILLE PATTERN DOTS-" + - "245678BRAILLE PATTERN DOTS-1245678BRAILLE PATTERN DOTS-345678BRAILLE PAT" + - "TERN DOTS-1345678BRAILLE PATTERN DOTS-2345678BRAILLE PATTERN DOTS-123456") + ("" + - "78RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKERIGHTWARDS TWO-HEADED " + - "ARROW WITH DOUBLE VERTICAL STROKELEFTWARDS DOUBLE ARROW WITH VERTICAL ST" + - "ROKERIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKELEFT RIGHT DOUBLE ARROW " + - "WITH VERTICAL STROKERIGHTWARDS TWO-HEADED ARROW FROM BARLEFTWARDS DOUBLE" + - " ARROW FROM BARRIGHTWARDS DOUBLE ARROW FROM BARDOWNWARDS ARROW WITH HORI" + - "ZONTAL STROKEUPWARDS ARROW WITH HORIZONTAL STROKEUPWARDS TRIPLE ARROWDOW" + - "NWARDS TRIPLE ARROWLEFTWARDS DOUBLE DASH ARROWRIGHTWARDS DOUBLE DASH ARR" + - "OWLEFTWARDS TRIPLE DASH ARROWRIGHTWARDS TRIPLE DASH ARROWRIGHTWARDS TWO-" + - "HEADED TRIPLE DASH ARROWRIGHTWARDS ARROW WITH DOTTED STEMUPWARDS ARROW T" + - "O BARDOWNWARDS ARROW TO BARRIGHTWARDS ARROW WITH TAIL WITH VERTICAL STRO" + - "KERIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKERIGHTWARDS TWO-H" + - "EADED ARROW WITH TAILRIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL" + - " STROKERIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE" + - "LEFTWARDS ARROW-TAILRIGHTWARDS ARROW-TAILLEFTWARDS DOUBLE ARROW-TAILRIGH" + - "TWARDS DOUBLE ARROW-TAILLEFTWARDS ARROW TO BLACK DIAMONDRIGHTWARDS ARROW" + - " TO BLACK DIAMONDLEFTWARDS ARROW FROM BAR TO BLACK DIAMONDRIGHTWARDS ARR" + - "OW FROM BAR TO BLACK DIAMONDNORTH WEST AND SOUTH EAST ARROWNORTH EAST AN" + - "D SOUTH WEST ARROWNORTH WEST ARROW WITH HOOKNORTH EAST ARROW WITH HOOKSO" + - "UTH EAST ARROW WITH HOOKSOUTH WEST ARROW WITH HOOKNORTH WEST ARROW AND N" + - "ORTH EAST ARROWNORTH EAST ARROW AND SOUTH EAST ARROWSOUTH EAST ARROW AND" + - " SOUTH WEST ARROWSOUTH WEST ARROW AND NORTH WEST ARROWRISING DIAGONAL CR" + - "OSSING FALLING DIAGONALFALLING DIAGONAL CROSSING RISING DIAGONALSOUTH EA" + - "ST ARROW CROSSING NORTH EAST ARROWNORTH EAST ARROW CROSSING SOUTH EAST A" + - "RROWFALLING DIAGONAL CROSSING NORTH EAST ARROWRISING DIAGONAL CROSSING S" + - "OUTH EAST ARROWNORTH EAST ARROW CROSSING NORTH WEST ARROWNORTH WEST ARRO" + - "W CROSSING NORTH EAST ARROWWAVE ARROW POINTING DIRECTLY RIGHTARROW POINT" + - "ING RIGHTWARDS THEN CURVING UPWARDSARROW POINTING RIGHTWARDS THEN CURVIN" + - "G DOWNWARDSARROW POINTING DOWNWARDS THEN CURVING LEFTWARDSARROW POINTING" + - " DOWNWARDS THEN CURVING RIGHTWARDSRIGHT-SIDE ARC CLOCKWISE ARROWLEFT-SID" + - "E ARC ANTICLOCKWISE ARROWTOP ARC ANTICLOCKWISE ARROWBOTTOM ARC ANTICLOCK" + - "WISE ARROWTOP ARC CLOCKWISE ARROW WITH MINUSTOP ARC ANTICLOCKWISE ARROW " + - "WITH PLUSLOWER RIGHT SEMICIRCULAR CLOCKWISE ARROWLOWER LEFT SEMICIRCULAR" + - " ANTICLOCKWISE ARROWANTICLOCKWISE CLOSED CIRCLE ARROWCLOCKWISE CLOSED CI" + - "RCLE ARROWRIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROWLEFTWARDS ARROW AB" + - "OVE SHORT RIGHTWARDS ARROWSHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROWRI" + - "GHTWARDS ARROW WITH PLUS BELOWLEFTWARDS ARROW WITH PLUS BELOWRIGHTWARDS " + - "ARROW THROUGH XLEFT RIGHT ARROW THROUGH SMALL CIRCLEUPWARDS TWO-HEADED A" + - "RROW FROM SMALL CIRCLELEFT BARB UP RIGHT BARB DOWN HARPOONLEFT BARB DOWN" + - " RIGHT BARB UP HARPOONUP BARB RIGHT DOWN BARB LEFT HARPOONUP BARB LEFT D" + - "OWN BARB RIGHT HARPOONLEFT BARB UP RIGHT BARB UP HARPOONUP BARB RIGHT DO" + - "WN BARB RIGHT HARPOONLEFT BARB DOWN RIGHT BARB DOWN HARPOONUP BARB LEFT " + - "DOWN BARB LEFT HARPOONLEFTWARDS HARPOON WITH BARB UP TO BARRIGHTWARDS HA" + - "RPOON WITH BARB UP TO BARUPWARDS HARPOON WITH BARB RIGHT TO BARDOWNWARDS" + - " HARPOON WITH BARB RIGHT TO BARLEFTWARDS HARPOON WITH BARB DOWN TO BARRI" + - "GHTWARDS HARPOON WITH BARB DOWN TO BARUPWARDS HARPOON WITH BARB LEFT TO " + - "BARDOWNWARDS HARPOON WITH BARB LEFT TO BARLEFTWARDS HARPOON WITH BARB UP" + - " FROM BARRIGHTWARDS HARPOON WITH BARB UP FROM BARUPWARDS HARPOON WITH BA" + - "RB RIGHT FROM BARDOWNWARDS HARPOON WITH BARB RIGHT FROM BARLEFTWARDS HAR" + - "POON WITH BARB DOWN FROM BARRIGHTWARDS HARPOON WITH BARB DOWN FROM BARUP" + - "WARDS HARPOON WITH BARB LEFT FROM BARDOWNWARDS HARPOON WITH BARB LEFT FR" + - "OM BARLEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB D" + - "OWNUPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT" + - "RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWND" + - "OWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT" + - "LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UPLEFT" + - "WARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWNRIGH" + - "TWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UPRIGHTWAR" + - "DS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWNLEFTWARD" + - "S HARPOON WITH BARB UP ABOVE LONG DASHLEFTWARDS HARPOON WITH BARB DOWN B" + - "ELOW LONG DASHRIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASHRIGHTWARDS " + - "HARPOON WITH BARB DOWN BELOW LONG DASHUPWARDS HARPOON WITH BARB LEFT BES" + - "IDE DOWNWARDS HARPOON WITH BARB RIGHTDOWNWARDS HARPOON WITH BARB LEFT BE" + - "SIDE UPWARDS HARPOON WITH BARB RIGHTRIGHT DOUBLE ARROW WITH ROUNDED HEAD" + - "EQUALS SIGN ABOVE RIGHTWARDS ARROWTILDE OPERATOR ABOVE RIGHTWARDS ARROWL") + ("" + - "EFTWARDS ARROW ABOVE TILDE OPERATORRIGHTWARDS ARROW ABOVE TILDE OPERATOR" + - "RIGHTWARDS ARROW ABOVE ALMOST EQUAL TOLESS-THAN ABOVE LEFTWARDS ARROWLEF" + - "TWARDS ARROW THROUGH LESS-THANGREATER-THAN ABOVE RIGHTWARDS ARROWSUBSET " + - "ABOVE RIGHTWARDS ARROWLEFTWARDS ARROW THROUGH SUBSETSUPERSET ABOVE LEFTW" + - "ARDS ARROWLEFT FISH TAILRIGHT FISH TAILUP FISH TAILDOWN FISH TAILTRIPLE " + - "VERTICAL BAR DELIMITERZ NOTATION SPOTZ NOTATION TYPE COLONLEFT WHITE CUR" + - "LY BRACKETRIGHT WHITE CURLY BRACKETLEFT WHITE PARENTHESISRIGHT WHITE PAR" + - "ENTHESISZ NOTATION LEFT IMAGE BRACKETZ NOTATION RIGHT IMAGE BRACKETZ NOT" + - "ATION LEFT BINDING BRACKETZ NOTATION RIGHT BINDING BRACKETLEFT SQUARE BR" + - "ACKET WITH UNDERBARRIGHT SQUARE BRACKET WITH UNDERBARLEFT SQUARE BRACKET" + - " WITH TICK IN TOP CORNERRIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNERL" + - "EFT SQUARE BRACKET WITH TICK IN BOTTOM CORNERRIGHT SQUARE BRACKET WITH T" + - "ICK IN TOP CORNERLEFT ANGLE BRACKET WITH DOTRIGHT ANGLE BRACKET WITH DOT" + - "LEFT ARC LESS-THAN BRACKETRIGHT ARC GREATER-THAN BRACKETDOUBLE LEFT ARC " + - "GREATER-THAN BRACKETDOUBLE RIGHT ARC LESS-THAN BRACKETLEFT BLACK TORTOIS" + - "E SHELL BRACKETRIGHT BLACK TORTOISE SHELL BRACKETDOTTED FENCEVERTICAL ZI" + - "GZAG LINEMEASURED ANGLE OPENING LEFTRIGHT ANGLE VARIANT WITH SQUAREMEASU" + - "RED RIGHT ANGLE WITH DOTANGLE WITH S INSIDEACUTE ANGLESPHERICAL ANGLE OP" + - "ENING LEFTSPHERICAL ANGLE OPENING UPTURNED ANGLEREVERSED ANGLEANGLE WITH" + - " UNDERBARREVERSED ANGLE WITH UNDERBAROBLIQUE ANGLE OPENING UPOBLIQUE ANG" + - "LE OPENING DOWNMEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP " + - "AND RIGHTMEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LE" + - "FTMEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHTME" + - "ASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFTMEASURE" + - "D ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UPMEASURED ANGL" + - "E WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UPMEASURED ANGLE WITH " + - "OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWNMEASURED ANGLE WITH OPEN" + - " ARM ENDING IN ARROW POINTING LEFT AND DOWNREVERSED EMPTY SETEMPTY SET W" + - "ITH OVERBAREMPTY SET WITH SMALL CIRCLE ABOVEEMPTY SET WITH RIGHT ARROW A" + - "BOVEEMPTY SET WITH LEFT ARROW ABOVECIRCLE WITH HORIZONTAL BARCIRCLED VER" + - "TICAL BARCIRCLED PARALLELCIRCLED REVERSE SOLIDUSCIRCLED PERPENDICULARCIR" + - "CLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BARCIRCLE" + - " WITH SUPERIMPOSED XCIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGNUP ARROW " + - "THROUGH CIRCLECIRCLED WHITE BULLETCIRCLED BULLETCIRCLED LESS-THANCIRCLED" + - " GREATER-THANCIRCLE WITH SMALL CIRCLE TO THE RIGHTCIRCLE WITH TWO HORIZO" + - "NTAL STROKES TO THE RIGHTSQUARED RISING DIAGONAL SLASHSQUARED FALLING DI" + - "AGONAL SLASHSQUARED ASTERISKSQUARED SMALL CIRCLESQUARED SQUARETWO JOINED" + - " SQUARESTRIANGLE WITH DOT ABOVETRIANGLE WITH UNDERBARS IN TRIANGLETRIANG" + - "LE WITH SERIFS AT BOTTOMRIGHT TRIANGLE ABOVE LEFT TRIANGLELEFT TRIANGLE " + - "BESIDE VERTICAL BARVERTICAL BAR BESIDE RIGHT TRIANGLEBOWTIE WITH LEFT HA" + - "LF BLACKBOWTIE WITH RIGHT HALF BLACKBLACK BOWTIETIMES WITH LEFT HALF BLA" + - "CKTIMES WITH RIGHT HALF BLACKWHITE HOURGLASSBLACK HOURGLASSLEFT WIGGLY F" + - "ENCERIGHT WIGGLY FENCELEFT DOUBLE WIGGLY FENCERIGHT DOUBLE WIGGLY FENCEI" + - "NCOMPLETE INFINITYTIE OVER INFINITYINFINITY NEGATED WITH VERTICAL BARDOU" + - "BLE-ENDED MULTIMAPSQUARE WITH CONTOURED OUTLINEINCREASES ASSHUFFLE PRODU" + - "CTEQUALS SIGN AND SLANTED PARALLELEQUALS SIGN AND SLANTED PARALLEL WITH " + - "TILDE ABOVEIDENTICAL TO AND SLANTED PARALLELGLEICH STARKTHERMODYNAMICDOW" + - "N-POINTING TRIANGLE WITH LEFT HALF BLACKDOWN-POINTING TRIANGLE WITH RIGH" + - "T HALF BLACKBLACK DIAMOND WITH DOWN ARROWBLACK LOZENGEWHITE CIRCLE WITH " + - "DOWN ARROWBLACK CIRCLE WITH DOWN ARROWERROR-BARRED WHITE SQUAREERROR-BAR" + - "RED BLACK SQUAREERROR-BARRED WHITE DIAMONDERROR-BARRED BLACK DIAMONDERRO" + - "R-BARRED WHITE CIRCLEERROR-BARRED BLACK CIRCLERULE-DELAYEDREVERSE SOLIDU" + - "S OPERATORSOLIDUS WITH OVERBARREVERSE SOLIDUS WITH HORIZONTAL STROKEBIG " + - "SOLIDUSBIG REVERSE SOLIDUSDOUBLE PLUSTRIPLE PLUSLEFT-POINTING CURVED ANG" + - "LE BRACKETRIGHT-POINTING CURVED ANGLE BRACKETTINYMINYN-ARY CIRCLED DOT O" + - "PERATORN-ARY CIRCLED PLUS OPERATORN-ARY CIRCLED TIMES OPERATORN-ARY UNIO" + - "N OPERATOR WITH DOTN-ARY UNION OPERATOR WITH PLUSN-ARY SQUARE INTERSECTI" + - "ON OPERATORN-ARY SQUARE UNION OPERATORTWO LOGICAL AND OPERATORTWO LOGICA" + - "L OR OPERATORN-ARY TIMES OPERATORMODULO TWO SUMSUMMATION WITH INTEGRALQU" + - "ADRUPLE INTEGRAL OPERATORFINITE PART INTEGRALINTEGRAL WITH DOUBLE STROKE" + - "INTEGRAL AVERAGE WITH SLASHCIRCULATION FUNCTIONANTICLOCKWISE INTEGRATION" + - "LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLELINE INTEGRATION WITH " + - "SEMICIRCULAR PATH AROUND POLELINE INTEGRATION NOT INCLUDING THE POLEINTE" + - "GRAL AROUND A POINT OPERATORQUATERNION INTEGRAL OPERATORINTEGRAL WITH LE") + ("" + - "FTWARDS ARROW WITH HOOKINTEGRAL WITH TIMES SIGNINTEGRAL WITH INTERSECTIO" + - "NINTEGRAL WITH UNIONINTEGRAL WITH OVERBARINTEGRAL WITH UNDERBARJOINLARGE" + - " LEFT TRIANGLE OPERATORZ NOTATION SCHEMA COMPOSITIONZ NOTATION SCHEMA PI" + - "PINGZ NOTATION SCHEMA PROJECTIONPLUS SIGN WITH SMALL CIRCLE ABOVEPLUS SI" + - "GN WITH CIRCUMFLEX ACCENT ABOVEPLUS SIGN WITH TILDE ABOVEPLUS SIGN WITH " + - "DOT BELOWPLUS SIGN WITH TILDE BELOWPLUS SIGN WITH SUBSCRIPT TWOPLUS SIGN" + - " WITH BLACK TRIANGLEMINUS SIGN WITH COMMA ABOVEMINUS SIGN WITH DOT BELOW" + - "MINUS SIGN WITH FALLING DOTSMINUS SIGN WITH RISING DOTSPLUS SIGN IN LEFT" + - " HALF CIRCLEPLUS SIGN IN RIGHT HALF CIRCLEVECTOR OR CROSS PRODUCTMULTIPL" + - "ICATION SIGN WITH DOT ABOVEMULTIPLICATION SIGN WITH UNDERBARSEMIDIRECT P" + - "RODUCT WITH BOTTOM CLOSEDSMASH PRODUCTMULTIPLICATION SIGN IN LEFT HALF C" + - "IRCLEMULTIPLICATION SIGN IN RIGHT HALF CIRCLECIRCLED MULTIPLICATION SIGN" + - " WITH CIRCUMFLEX ACCENTMULTIPLICATION SIGN IN DOUBLE CIRCLECIRCLED DIVIS" + - "ION SIGNPLUS SIGN IN TRIANGLEMINUS SIGN IN TRIANGLEMULTIPLICATION SIGN I" + - "N TRIANGLEINTERIOR PRODUCTRIGHTHAND INTERIOR PRODUCTZ NOTATION RELATIONA" + - "L COMPOSITIONAMALGAMATION OR COPRODUCTINTERSECTION WITH DOTUNION WITH MI" + - "NUS SIGNUNION WITH OVERBARINTERSECTION WITH OVERBARINTERSECTION WITH LOG" + - "ICAL ANDUNION WITH LOGICAL ORUNION ABOVE INTERSECTIONINTERSECTION ABOVE " + - "UNIONUNION ABOVE BAR ABOVE INTERSECTIONINTERSECTION ABOVE BAR ABOVE UNIO" + - "NUNION BESIDE AND JOINED WITH UNIONINTERSECTION BESIDE AND JOINED WITH I" + - "NTERSECTIONCLOSED UNION WITH SERIFSCLOSED INTERSECTION WITH SERIFSDOUBLE" + - " SQUARE INTERSECTIONDOUBLE SQUARE UNIONCLOSED UNION WITH SERIFS AND SMAS" + - "H PRODUCTLOGICAL AND WITH DOT ABOVELOGICAL OR WITH DOT ABOVEDOUBLE LOGIC" + - "AL ANDDOUBLE LOGICAL ORTWO INTERSECTING LOGICAL ANDTWO INTERSECTING LOGI" + - "CAL ORSLOPING LARGE ORSLOPING LARGE ANDLOGICAL OR OVERLAPPING LOGICAL AN" + - "DLOGICAL AND WITH MIDDLE STEMLOGICAL OR WITH MIDDLE STEMLOGICAL AND WITH" + - " HORIZONTAL DASHLOGICAL OR WITH HORIZONTAL DASHLOGICAL AND WITH DOUBLE O" + - "VERBARLOGICAL AND WITH UNDERBARLOGICAL AND WITH DOUBLE UNDERBARSMALL VEE" + - " WITH UNDERBARLOGICAL OR WITH DOUBLE OVERBARLOGICAL OR WITH DOUBLE UNDER" + - "BARZ NOTATION DOMAIN ANTIRESTRICTIONZ NOTATION RANGE ANTIRESTRICTIONEQUA" + - "LS SIGN WITH DOT BELOWIDENTICAL WITH DOT ABOVETRIPLE HORIZONTAL BAR WITH" + - " DOUBLE VERTICAL STROKETRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE" + - "TILDE OPERATOR WITH DOT ABOVETILDE OPERATOR WITH RISING DOTSSIMILAR MINU" + - "S SIMILARCONGRUENT WITH DOT ABOVEEQUALS WITH ASTERISKALMOST EQUAL TO WIT" + - "H CIRCUMFLEX ACCENTAPPROXIMATELY EQUAL OR EQUAL TOEQUALS SIGN ABOVE PLUS" + - " SIGNPLUS SIGN ABOVE EQUALS SIGNEQUALS SIGN ABOVE TILDE OPERATORDOUBLE C" + - "OLON EQUALTWO CONSECUTIVE EQUALS SIGNSTHREE CONSECUTIVE EQUALS SIGNSEQUA" + - "LS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOWEQUIVALENT WITH FOUR DOTS " + - "ABOVELESS-THAN WITH CIRCLE INSIDEGREATER-THAN WITH CIRCLE INSIDELESS-THA" + - "N WITH QUESTION MARK ABOVEGREATER-THAN WITH QUESTION MARK ABOVELESS-THAN" + - " OR SLANTED EQUAL TOGREATER-THAN OR SLANTED EQUAL TOLESS-THAN OR SLANTED" + - " EQUAL TO WITH DOT INSIDEGREATER-THAN OR SLANTED EQUAL TO WITH DOT INSID" + - "ELESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVEGREATER-THAN OR SLANTED EQU" + - "AL TO WITH DOT ABOVELESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHTGR" + - "EATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFTLESS-THAN OR APPROXIMA" + - "TEGREATER-THAN OR APPROXIMATELESS-THAN AND SINGLE-LINE NOT EQUAL TOGREAT" + - "ER-THAN AND SINGLE-LINE NOT EQUAL TOLESS-THAN AND NOT APPROXIMATEGREATER" + - "-THAN AND NOT APPROXIMATELESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER" + - "-THANGREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THANLESS-THAN ABOVE" + - " SIMILAR OR EQUALGREATER-THAN ABOVE SIMILAR OR EQUALLESS-THAN ABOVE SIMI" + - "LAR ABOVE GREATER-THANGREATER-THAN ABOVE SIMILAR ABOVE LESS-THANLESS-THA" + - "N ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUALGREATER-THAN ABOVE LESS-THAN" + - " ABOVE DOUBLE-LINE EQUALLESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN" + - " ABOVE SLANTED EQUALGREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABO" + - "VE SLANTED EQUALSLANTED EQUAL TO OR LESS-THANSLANTED EQUAL TO OR GREATER" + - "-THANSLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDESLANTED EQUAL TO OR GR" + - "EATER-THAN WITH DOT INSIDEDOUBLE-LINE EQUAL TO OR LESS-THANDOUBLE-LINE E" + - "QUAL TO OR GREATER-THANDOUBLE-LINE SLANTED EQUAL TO OR LESS-THANDOUBLE-L" + - "INE SLANTED EQUAL TO OR GREATER-THANSIMILAR OR LESS-THANSIMILAR OR GREAT" + - "ER-THANSIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGNSIMILAR ABOVE GREATER-TH" + - "AN ABOVE EQUALS SIGNDOUBLE NESTED LESS-THANDOUBLE NESTED GREATER-THANDOU" + - "BLE NESTED LESS-THAN WITH UNDERBARGREATER-THAN OVERLAPPING LESS-THANGREA" + - "TER-THAN BESIDE LESS-THANLESS-THAN CLOSED BY CURVEGREATER-THAN CLOSED BY" + - " CURVELESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUALGREATER-THAN CLOSED B") + ("" + - "Y CURVE ABOVE SLANTED EQUALSMALLER THANLARGER THANSMALLER THAN OR EQUAL " + - "TOLARGER THAN OR EQUAL TOEQUALS SIGN WITH BUMPY ABOVEPRECEDES ABOVE SING" + - "LE-LINE EQUALS SIGNSUCCEEDS ABOVE SINGLE-LINE EQUALS SIGNPRECEDES ABOVE " + - "SINGLE-LINE NOT EQUAL TOSUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TOPRECEDES " + - "ABOVE EQUALS SIGNSUCCEEDS ABOVE EQUALS SIGNPRECEDES ABOVE NOT EQUAL TOSU" + - "CCEEDS ABOVE NOT EQUAL TOPRECEDES ABOVE ALMOST EQUAL TOSUCCEEDS ABOVE AL" + - "MOST EQUAL TOPRECEDES ABOVE NOT ALMOST EQUAL TOSUCCEEDS ABOVE NOT ALMOST" + - " EQUAL TODOUBLE PRECEDESDOUBLE SUCCEEDSSUBSET WITH DOTSUPERSET WITH DOTS" + - "UBSET WITH PLUS SIGN BELOWSUPERSET WITH PLUS SIGN BELOWSUBSET WITH MULTI" + - "PLICATION SIGN BELOWSUPERSET WITH MULTIPLICATION SIGN BELOWSUBSET OF OR " + - "EQUAL TO WITH DOT ABOVESUPERSET OF OR EQUAL TO WITH DOT ABOVESUBSET OF A" + - "BOVE EQUALS SIGNSUPERSET OF ABOVE EQUALS SIGNSUBSET OF ABOVE TILDE OPERA" + - "TORSUPERSET OF ABOVE TILDE OPERATORSUBSET OF ABOVE ALMOST EQUAL TOSUPERS" + - "ET OF ABOVE ALMOST EQUAL TOSUBSET OF ABOVE NOT EQUAL TOSUPERSET OF ABOVE" + - " NOT EQUAL TOSQUARE LEFT OPEN BOX OPERATORSQUARE RIGHT OPEN BOX OPERATOR" + - "CLOSED SUBSETCLOSED SUPERSETCLOSED SUBSET OR EQUAL TOCLOSED SUPERSET OR " + - "EQUAL TOSUBSET ABOVE SUPERSETSUPERSET ABOVE SUBSETSUBSET ABOVE SUBSETSUP" + - "ERSET ABOVE SUPERSETSUPERSET BESIDE SUBSETSUPERSET BESIDE AND JOINED BY " + - "DASH WITH SUBSETELEMENT OF OPENING DOWNWARDSPITCHFORK WITH TEE TOPTRANSV" + - "ERSAL INTERSECTIONFORKINGNONFORKINGSHORT LEFT TACKSHORT DOWN TACKSHORT U" + - "P TACKPERPENDICULAR WITH SVERTICAL BAR TRIPLE RIGHT TURNSTILEDOUBLE VERT" + - "ICAL BAR LEFT TURNSTILEVERTICAL BAR DOUBLE LEFT TURNSTILEDOUBLE VERTICAL" + - " BAR DOUBLE LEFT TURNSTILELONG DASH FROM LEFT MEMBER OF DOUBLE VERTICALS" + - "HORT DOWN TACK WITH OVERBARSHORT UP TACK WITH UNDERBARSHORT UP TACK ABOV" + - "E SHORT DOWN TACKDOUBLE DOWN TACKDOUBLE UP TACKDOUBLE STROKE NOT SIGNREV" + - "ERSED DOUBLE STROKE NOT SIGNDOES NOT DIVIDE WITH REVERSED NEGATION SLASH" + - "VERTICAL LINE WITH CIRCLE ABOVEVERTICAL LINE WITH CIRCLE BELOWDOWN TACK " + - "WITH CIRCLE BELOWPARALLEL WITH HORIZONTAL STROKEPARALLEL WITH TILDE OPER" + - "ATORTRIPLE VERTICAL BAR BINARY RELATIONTRIPLE VERTICAL BAR WITH HORIZONT" + - "AL STROKETRIPLE COLON OPERATORTRIPLE NESTED LESS-THANTRIPLE NESTED GREAT" + - "ER-THANDOUBLE-LINE SLANTED LESS-THAN OR EQUAL TODOUBLE-LINE SLANTED GREA" + - "TER-THAN OR EQUAL TOTRIPLE SOLIDUS BINARY RELATIONLARGE TRIPLE VERTICAL " + - "BAR OPERATORDOUBLE SOLIDUS OPERATORWHITE VERTICAL BARN-ARY WHITE VERTICA" + - "L BARNORTH EAST WHITE ARROWNORTH WEST WHITE ARROWSOUTH EAST WHITE ARROWS" + - "OUTH WEST WHITE ARROWLEFT RIGHT WHITE ARROWLEFTWARDS BLACK ARROWUPWARDS " + - "BLACK ARROWDOWNWARDS BLACK ARROWNORTH EAST BLACK ARROWNORTH WEST BLACK A" + - "RROWSOUTH EAST BLACK ARROWSOUTH WEST BLACK ARROWLEFT RIGHT BLACK ARROWUP" + - " DOWN BLACK ARROWRIGHTWARDS ARROW WITH TIP DOWNWARDSRIGHTWARDS ARROW WIT" + - "H TIP UPWARDSLEFTWARDS ARROW WITH TIP DOWNWARDSLEFTWARDS ARROW WITH TIP " + - "UPWARDSSQUARE WITH TOP HALF BLACKSQUARE WITH BOTTOM HALF BLACKSQUARE WIT" + - "H UPPER RIGHT DIAGONAL HALF BLACKSQUARE WITH LOWER LEFT DIAGONAL HALF BL" + - "ACKDIAMOND WITH LEFT HALF BLACKDIAMOND WITH RIGHT HALF BLACKDIAMOND WITH" + - " TOP HALF BLACKDIAMOND WITH BOTTOM HALF BLACKDOTTED SQUAREBLACK LARGE SQ" + - "UAREWHITE LARGE SQUAREBLACK VERY SMALL SQUAREWHITE VERY SMALL SQUAREBLAC" + - "K PENTAGONWHITE PENTAGONWHITE HEXAGONBLACK HEXAGONHORIZONTAL BLACK HEXAG" + - "ONBLACK LARGE CIRCLEBLACK MEDIUM DIAMONDWHITE MEDIUM DIAMONDBLACK MEDIUM" + - " LOZENGEWHITE MEDIUM LOZENGEBLACK SMALL DIAMONDBLACK SMALL LOZENGEWHITE " + - "SMALL LOZENGEBLACK HORIZONTAL ELLIPSEWHITE HORIZONTAL ELLIPSEBLACK VERTI" + - "CAL ELLIPSEWHITE VERTICAL ELLIPSELEFT ARROW WITH SMALL CIRCLETHREE LEFTW" + - "ARDS ARROWSLEFT ARROW WITH CIRCLED PLUSLONG LEFTWARDS SQUIGGLE ARROWLEFT" + - "WARDS TWO-HEADED ARROW WITH VERTICAL STROKELEFTWARDS TWO-HEADED ARROW WI" + - "TH DOUBLE VERTICAL STROKELEFTWARDS TWO-HEADED ARROW FROM BARLEFTWARDS TW" + - "O-HEADED TRIPLE DASH ARROWLEFTWARDS ARROW WITH DOTTED STEMLEFTWARDS ARRO" + - "W WITH TAIL WITH VERTICAL STROKELEFTWARDS ARROW WITH TAIL WITH DOUBLE VE" + - "RTICAL STROKELEFTWARDS TWO-HEADED ARROW WITH TAILLEFTWARDS TWO-HEADED AR" + - "ROW WITH TAIL WITH VERTICAL STROKELEFTWARDS TWO-HEADED ARROW WITH TAIL W" + - "ITH DOUBLE VERTICAL STROKELEFTWARDS ARROW THROUGH XWAVE ARROW POINTING D" + - "IRECTLY LEFTEQUALS SIGN ABOVE LEFTWARDS ARROWREVERSE TILDE OPERATOR ABOV" + - "E LEFTWARDS ARROWLEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TORIGHTWARDS" + - " ARROW THROUGH GREATER-THANRIGHTWARDS ARROW THROUGH SUPERSETLEFTWARDS QU" + - "ADRUPLE ARROWRIGHTWARDS QUADRUPLE ARROWREVERSE TILDE OPERATOR ABOVE RIGH" + - "TWARDS ARROWRIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TOTILDE OPERATOR" + - " ABOVE LEFTWARDS ARROWLEFTWARDS ARROW ABOVE ALMOST EQUAL TOLEFTWARDS ARR" + - "OW ABOVE REVERSE TILDE OPERATORRIGHTWARDS ARROW ABOVE REVERSE TILDE OPER") + ("" + - "ATORDOWNWARDS TRIANGLE-HEADED ZIGZAG ARROWSHORT SLANTED NORTH ARROWSHORT" + - " BACKSLANTED SOUTH ARROWWHITE MEDIUM STARBLACK SMALL STARWHITE SMALL STA" + - "RBLACK RIGHT-POINTING PENTAGONWHITE RIGHT-POINTING PENTAGONHEAVY LARGE C" + - "IRCLEHEAVY OVAL WITH OVAL INSIDEHEAVY CIRCLE WITH CIRCLE INSIDEHEAVY CIR" + - "CLEHEAVY CIRCLED SALTIRESLANTED NORTH ARROW WITH HOOKED HEADBACKSLANTED " + - "SOUTH ARROW WITH HOOKED TAILSLANTED NORTH ARROW WITH HORIZONTAL TAILBACK" + - "SLANTED SOUTH ARROW WITH HORIZONTAL TAILBENT ARROW POINTING DOWNWARDS TH" + - "EN NORTH EASTSHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EASTLEFTWARD" + - "S TRIANGLE-HEADED ARROWUPWARDS TRIANGLE-HEADED ARROWRIGHTWARDS TRIANGLE-" + - "HEADED ARROWDOWNWARDS TRIANGLE-HEADED ARROWLEFT RIGHT TRIANGLE-HEADED AR" + - "ROWUP DOWN TRIANGLE-HEADED ARROWNORTH WEST TRIANGLE-HEADED ARROWNORTH EA" + - "ST TRIANGLE-HEADED ARROWSOUTH EAST TRIANGLE-HEADED ARROWSOUTH WEST TRIAN" + - "GLE-HEADED ARROWLEFTWARDS TRIANGLE-HEADED DASHED ARROWUPWARDS TRIANGLE-H" + - "EADED DASHED ARROWRIGHTWARDS TRIANGLE-HEADED DASHED ARROWDOWNWARDS TRIAN" + - "GLE-HEADED DASHED ARROWCLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROWANTICL" + - "OCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROWLEFTWARDS TRIANGLE-HEADED ARROW" + - " TO BARUPWARDS TRIANGLE-HEADED ARROW TO BARRIGHTWARDS TRIANGLE-HEADED AR" + - "ROW TO BARDOWNWARDS TRIANGLE-HEADED ARROW TO BARNORTH WEST TRIANGLE-HEAD" + - "ED ARROW TO BARNORTH EAST TRIANGLE-HEADED ARROW TO BARSOUTH EAST TRIANGL" + - "E-HEADED ARROW TO BARSOUTH WEST TRIANGLE-HEADED ARROW TO BARLEFTWARDS TR" + - "IANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKEUPWARDS TRIANGLE-HEADED" + - " ARROW WITH DOUBLE HORIZONTAL STROKERIGHTWARDS TRIANGLE-HEADED ARROW WIT" + - "H DOUBLE HORIZONTAL STROKEDOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HO" + - "RIZONTAL STROKEHORIZONTAL TAB KEYVERTICAL TAB KEYLEFTWARDS TRIANGLE-HEAD" + - "ED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROWUPWARDS TRIANGLE-HEADED AR" + - "ROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROWRIGHTWARDS TRIANGLE-HEAD" + - "ED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROWDOWNWARDS TRIANGLE-HEADED A" + - "RROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROWLEFTWARDS TRIANGLE-HEADED" + - " PAIRED ARROWSUPWARDS TRIANGLE-HEADED PAIRED ARROWSRIGHTWARDS TRIANGLE-H" + - "EADED PAIRED ARROWSDOWNWARDS TRIANGLE-HEADED PAIRED ARROWSLEFTWARDS BLAC" + - "K CIRCLED WHITE ARROWUPWARDS BLACK CIRCLED WHITE ARROWRIGHTWARDS BLACK C" + - "IRCLED WHITE ARROWDOWNWARDS BLACK CIRCLED WHITE ARROWANTICLOCKWISE TRIAN" + - "GLE-HEADED RIGHT U-SHAPED ARROWANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SH" + - "APED ARROWANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROWANTICLOCKWISE" + - " TRIANGLE-HEADED TOP U-SHAPED ARROWRETURN LEFTRETURN RIGHTNEWLINE LEFTNE" + - "WLINE RIGHTFOUR CORNER ARROWS CIRCLING ANTICLOCKWISERIGHTWARDS BLACK ARR" + - "OWTHREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEADTHREE-D RIGHT-LIGHT" + - "ED UPWARDS EQUILATERAL ARROWHEADTHREE-D TOP-LIGHTED RIGHTWARDS EQUILATER" + - "AL ARROWHEADTHREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEADBLACK LE" + - "FTWARDS EQUILATERAL ARROWHEADBLACK UPWARDS EQUILATERAL ARROWHEADBLACK RI" + - "GHTWARDS EQUILATERAL ARROWHEADBLACK DOWNWARDS EQUILATERAL ARROWHEADDOWNW" + - "ARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDSDOWNWARDS TRIANGLE-HEA" + - "DED ARROW WITH LONG TIP RIGHTWARDSUPWARDS TRIANGLE-HEADED ARROW WITH LON" + - "G TIP LEFTWARDSUPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDSLEF" + - "TWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDSRIGHTWARDS TRIANGLE-HE" + - "ADED ARROW WITH LONG TIP UPWARDSLEFTWARDS TRIANGLE-HEADED ARROW WITH LON" + - "G TIP DOWNWARDSRIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDSB" + - "LACK CURVED DOWNWARDS AND LEFTWARDS ARROWBLACK CURVED DOWNWARDS AND RIGH" + - "TWARDS ARROWBLACK CURVED UPWARDS AND LEFTWARDS ARROWBLACK CURVED UPWARDS" + - " AND RIGHTWARDS ARROWBLACK CURVED LEFTWARDS AND UPWARDS ARROWBLACK CURVE" + - "D RIGHTWARDS AND UPWARDS ARROWBLACK CURVED LEFTWARDS AND DOWNWARDS ARROW" + - "BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROWRIBBON ARROW DOWN LEFTRIBBON " + - "ARROW DOWN RIGHTRIBBON ARROW UP LEFTRIBBON ARROW UP RIGHTRIBBON ARROW LE" + - "FT UPRIBBON ARROW RIGHT UPRIBBON ARROW LEFT DOWNRIBBON ARROW RIGHT DOWNU" + - "PWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BARUP ARROWHEAD IN A RECTANG" + - "LE BOXBALLOT BOX WITH LIGHT XCIRCLED XCIRCLED BOLD XBLACK SQUARE CENTRED" + - "BLACK DIAMOND CENTREDTURNED BLACK PENTAGONHORIZONTAL BLACK OCTAGONBLACK " + - "OCTAGONBLACK MEDIUM UP-POINTING TRIANGLE CENTREDBLACK MEDIUM DOWN-POINTI" + - "NG TRIANGLE CENTREDBLACK MEDIUM LEFT-POINTING TRIANGLE CENTREDBLACK MEDI" + - "UM RIGHT-POINTING TRIANGLE CENTREDTOP HALF BLACK CIRCLEBOTTOM HALF BLACK" + - " CIRCLELIGHT FOUR POINTED BLACK CUSPROTATED LIGHT FOUR POINTED BLACK CUS" + - "PWHITE FOUR POINTED CUSPROTATED WHITE FOUR POINTED CUSPSQUARE POSITION I" + - "NDICATORUNCERTAINTY SIGNLEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHE" + - "ADSUPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADSRIGHTWARDS TWO-HEADE") + ("" + - "D ARROW WITH TRIANGLE ARROWHEADSDOWNWARDS TWO-HEADED ARROW WITH TRIANGLE" + - " ARROWHEADSGLAGOLITIC CAPITAL LETTER AZUGLAGOLITIC CAPITAL LETTER BUKYGL" + - "AGOLITIC CAPITAL LETTER VEDEGLAGOLITIC CAPITAL LETTER GLAGOLIGLAGOLITIC " + - "CAPITAL LETTER DOBROGLAGOLITIC CAPITAL LETTER YESTUGLAGOLITIC CAPITAL LE" + - "TTER ZHIVETEGLAGOLITIC CAPITAL LETTER DZELOGLAGOLITIC CAPITAL LETTER ZEM" + - "LJAGLAGOLITIC CAPITAL LETTER IZHEGLAGOLITIC CAPITAL LETTER INITIAL IZHEG" + - "LAGOLITIC CAPITAL LETTER IGLAGOLITIC CAPITAL LETTER DJERVIGLAGOLITIC CAP" + - "ITAL LETTER KAKOGLAGOLITIC CAPITAL LETTER LJUDIJEGLAGOLITIC CAPITAL LETT" + - "ER MYSLITEGLAGOLITIC CAPITAL LETTER NASHIGLAGOLITIC CAPITAL LETTER ONUGL" + - "AGOLITIC CAPITAL LETTER POKOJIGLAGOLITIC CAPITAL LETTER RITSIGLAGOLITIC " + - "CAPITAL LETTER SLOVOGLAGOLITIC CAPITAL LETTER TVRIDOGLAGOLITIC CAPITAL L" + - "ETTER UKUGLAGOLITIC CAPITAL LETTER FRITUGLAGOLITIC CAPITAL LETTER HERUGL" + - "AGOLITIC CAPITAL LETTER OTUGLAGOLITIC CAPITAL LETTER PEGLAGOLITIC CAPITA" + - "L LETTER SHTAGLAGOLITIC CAPITAL LETTER TSIGLAGOLITIC CAPITAL LETTER CHRI" + - "VIGLAGOLITIC CAPITAL LETTER SHAGLAGOLITIC CAPITAL LETTER YERUGLAGOLITIC " + - "CAPITAL LETTER YERIGLAGOLITIC CAPITAL LETTER YATIGLAGOLITIC CAPITAL LETT" + - "ER SPIDERY HAGLAGOLITIC CAPITAL LETTER YUGLAGOLITIC CAPITAL LETTER SMALL" + - " YUSGLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAILGLAGOLITIC CAPITAL LETT" + - "ER YOGLAGOLITIC CAPITAL LETTER IOTATED SMALL YUSGLAGOLITIC CAPITAL LETTE" + - "R BIG YUSGLAGOLITIC CAPITAL LETTER IOTATED BIG YUSGLAGOLITIC CAPITAL LET" + - "TER FITAGLAGOLITIC CAPITAL LETTER IZHITSAGLAGOLITIC CAPITAL LETTER SHTAP" + - "ICGLAGOLITIC CAPITAL LETTER TROKUTASTI AGLAGOLITIC CAPITAL LETTER LATINA" + - "TE MYSLITEGLAGOLITIC SMALL LETTER AZUGLAGOLITIC SMALL LETTER BUKYGLAGOLI" + - "TIC SMALL LETTER VEDEGLAGOLITIC SMALL LETTER GLAGOLIGLAGOLITIC SMALL LET" + - "TER DOBROGLAGOLITIC SMALL LETTER YESTUGLAGOLITIC SMALL LETTER ZHIVETEGLA" + - "GOLITIC SMALL LETTER DZELOGLAGOLITIC SMALL LETTER ZEMLJAGLAGOLITIC SMALL" + - " LETTER IZHEGLAGOLITIC SMALL LETTER INITIAL IZHEGLAGOLITIC SMALL LETTER " + - "IGLAGOLITIC SMALL LETTER DJERVIGLAGOLITIC SMALL LETTER KAKOGLAGOLITIC SM" + - "ALL LETTER LJUDIJEGLAGOLITIC SMALL LETTER MYSLITEGLAGOLITIC SMALL LETTER" + - " NASHIGLAGOLITIC SMALL LETTER ONUGLAGOLITIC SMALL LETTER POKOJIGLAGOLITI" + - "C SMALL LETTER RITSIGLAGOLITIC SMALL LETTER SLOVOGLAGOLITIC SMALL LETTER" + - " TVRIDOGLAGOLITIC SMALL LETTER UKUGLAGOLITIC SMALL LETTER FRITUGLAGOLITI" + - "C SMALL LETTER HERUGLAGOLITIC SMALL LETTER OTUGLAGOLITIC SMALL LETTER PE" + - "GLAGOLITIC SMALL LETTER SHTAGLAGOLITIC SMALL LETTER TSIGLAGOLITIC SMALL " + - "LETTER CHRIVIGLAGOLITIC SMALL LETTER SHAGLAGOLITIC SMALL LETTER YERUGLAG" + - "OLITIC SMALL LETTER YERIGLAGOLITIC SMALL LETTER YATIGLAGOLITIC SMALL LET" + - "TER SPIDERY HAGLAGOLITIC SMALL LETTER YUGLAGOLITIC SMALL LETTER SMALL YU" + - "SGLAGOLITIC SMALL LETTER SMALL YUS WITH TAILGLAGOLITIC SMALL LETTER YOGL" + - "AGOLITIC SMALL LETTER IOTATED SMALL YUSGLAGOLITIC SMALL LETTER BIG YUSGL" + - "AGOLITIC SMALL LETTER IOTATED BIG YUSGLAGOLITIC SMALL LETTER FITAGLAGOLI" + - "TIC SMALL LETTER IZHITSAGLAGOLITIC SMALL LETTER SHTAPICGLAGOLITIC SMALL " + - "LETTER TROKUTASTI AGLAGOLITIC SMALL LETTER LATINATE MYSLITELATIN CAPITAL" + - " LETTER L WITH DOUBLE BARLATIN SMALL LETTER L WITH DOUBLE BARLATIN CAPIT" + - "AL LETTER L WITH MIDDLE TILDELATIN CAPITAL LETTER P WITH STROKELATIN CAP" + - "ITAL LETTER R WITH TAILLATIN SMALL LETTER A WITH STROKELATIN SMALL LETTE" + - "R T WITH DIAGONAL STROKELATIN CAPITAL LETTER H WITH DESCENDERLATIN SMALL" + - " LETTER H WITH DESCENDERLATIN CAPITAL LETTER K WITH DESCENDERLATIN SMALL" + - " LETTER K WITH DESCENDERLATIN CAPITAL LETTER Z WITH DESCENDERLATIN SMALL" + - " LETTER Z WITH DESCENDERLATIN CAPITAL LETTER ALPHALATIN CAPITAL LETTER M" + - " WITH HOOKLATIN CAPITAL LETTER TURNED ALATIN CAPITAL LETTER TURNED ALPHA" + - "LATIN SMALL LETTER V WITH RIGHT HOOKLATIN CAPITAL LETTER W WITH HOOKLATI" + - "N SMALL LETTER W WITH HOOKLATIN SMALL LETTER V WITH CURLLATIN CAPITAL LE" + - "TTER HALF HLATIN SMALL LETTER HALF HLATIN SMALL LETTER TAILLESS PHILATIN" + - " SMALL LETTER E WITH NOTCHLATIN SMALL LETTER TURNED R WITH TAILLATIN SMA" + - "LL LETTER O WITH LOW RING INSIDELATIN LETTER SMALL CAPITAL TURNED ELATIN" + - " SUBSCRIPT SMALL LETTER JMODIFIER LETTER CAPITAL VLATIN CAPITAL LETTER S" + - " WITH SWASH TAILLATIN CAPITAL LETTER Z WITH SWASH TAILCOPTIC CAPITAL LET" + - "TER ALFACOPTIC SMALL LETTER ALFACOPTIC CAPITAL LETTER VIDACOPTIC SMALL L" + - "ETTER VIDACOPTIC CAPITAL LETTER GAMMACOPTIC SMALL LETTER GAMMACOPTIC CAP" + - "ITAL LETTER DALDACOPTIC SMALL LETTER DALDACOPTIC CAPITAL LETTER EIECOPTI" + - "C SMALL LETTER EIECOPTIC CAPITAL LETTER SOUCOPTIC SMALL LETTER SOUCOPTIC" + - " CAPITAL LETTER ZATACOPTIC SMALL LETTER ZATACOPTIC CAPITAL LETTER HATECO" + - "PTIC SMALL LETTER HATECOPTIC CAPITAL LETTER THETHECOPTIC SMALL LETTER TH" + - "ETHECOPTIC CAPITAL LETTER IAUDACOPTIC SMALL LETTER IAUDACOPTIC CAPITAL L") + ("" + - "ETTER KAPACOPTIC SMALL LETTER KAPACOPTIC CAPITAL LETTER LAULACOPTIC SMAL" + - "L LETTER LAULACOPTIC CAPITAL LETTER MICOPTIC SMALL LETTER MICOPTIC CAPIT" + - "AL LETTER NICOPTIC SMALL LETTER NICOPTIC CAPITAL LETTER KSICOPTIC SMALL " + - "LETTER KSICOPTIC CAPITAL LETTER OCOPTIC SMALL LETTER OCOPTIC CAPITAL LET" + - "TER PICOPTIC SMALL LETTER PICOPTIC CAPITAL LETTER ROCOPTIC SMALL LETTER " + - "ROCOPTIC CAPITAL LETTER SIMACOPTIC SMALL LETTER SIMACOPTIC CAPITAL LETTE" + - "R TAUCOPTIC SMALL LETTER TAUCOPTIC CAPITAL LETTER UACOPTIC SMALL LETTER " + - "UACOPTIC CAPITAL LETTER FICOPTIC SMALL LETTER FICOPTIC CAPITAL LETTER KH" + - "ICOPTIC SMALL LETTER KHICOPTIC CAPITAL LETTER PSICOPTIC SMALL LETTER PSI" + - "COPTIC CAPITAL LETTER OOUCOPTIC SMALL LETTER OOUCOPTIC CAPITAL LETTER DI" + - "ALECT-P ALEFCOPTIC SMALL LETTER DIALECT-P ALEFCOPTIC CAPITAL LETTER OLD " + - "COPTIC AINCOPTIC SMALL LETTER OLD COPTIC AINCOPTIC CAPITAL LETTER CRYPTO" + - "GRAMMIC EIECOPTIC SMALL LETTER CRYPTOGRAMMIC EIECOPTIC CAPITAL LETTER DI" + - "ALECT-P KAPACOPTIC SMALL LETTER DIALECT-P KAPACOPTIC CAPITAL LETTER DIAL" + - "ECT-P NICOPTIC SMALL LETTER DIALECT-P NICOPTIC CAPITAL LETTER CRYPTOGRAM" + - "MIC NICOPTIC SMALL LETTER CRYPTOGRAMMIC NICOPTIC CAPITAL LETTER OLD COPT" + - "IC OOUCOPTIC SMALL LETTER OLD COPTIC OOUCOPTIC CAPITAL LETTER SAMPICOPTI" + - "C SMALL LETTER SAMPICOPTIC CAPITAL LETTER CROSSED SHEICOPTIC SMALL LETTE" + - "R CROSSED SHEICOPTIC CAPITAL LETTER OLD COPTIC SHEICOPTIC SMALL LETTER O" + - "LD COPTIC SHEICOPTIC CAPITAL LETTER OLD COPTIC ESHCOPTIC SMALL LETTER OL" + - "D COPTIC ESHCOPTIC CAPITAL LETTER AKHMIMIC KHEICOPTIC SMALL LETTER AKHMI" + - "MIC KHEICOPTIC CAPITAL LETTER DIALECT-P HORICOPTIC SMALL LETTER DIALECT-" + - "P HORICOPTIC CAPITAL LETTER OLD COPTIC HORICOPTIC SMALL LETTER OLD COPTI" + - "C HORICOPTIC CAPITAL LETTER OLD COPTIC HACOPTIC SMALL LETTER OLD COPTIC " + - "HACOPTIC CAPITAL LETTER L-SHAPED HACOPTIC SMALL LETTER L-SHAPED HACOPTIC" + - " CAPITAL LETTER OLD COPTIC HEICOPTIC SMALL LETTER OLD COPTIC HEICOPTIC C" + - "APITAL LETTER OLD COPTIC HATCOPTIC SMALL LETTER OLD COPTIC HATCOPTIC CAP" + - "ITAL LETTER OLD COPTIC GANGIACOPTIC SMALL LETTER OLD COPTIC GANGIACOPTIC" + - " CAPITAL LETTER OLD COPTIC DJACOPTIC SMALL LETTER OLD COPTIC DJACOPTIC C" + - "APITAL LETTER OLD COPTIC SHIMACOPTIC SMALL LETTER OLD COPTIC SHIMACOPTIC" + - " CAPITAL LETTER OLD NUBIAN SHIMACOPTIC SMALL LETTER OLD NUBIAN SHIMACOPT" + - "IC CAPITAL LETTER OLD NUBIAN NGICOPTIC SMALL LETTER OLD NUBIAN NGICOPTIC" + - " CAPITAL LETTER OLD NUBIAN NYICOPTIC SMALL LETTER OLD NUBIAN NYICOPTIC C" + - "APITAL LETTER OLD NUBIAN WAUCOPTIC SMALL LETTER OLD NUBIAN WAUCOPTIC SYM" + - "BOL KAICOPTIC SYMBOL MI ROCOPTIC SYMBOL PI ROCOPTIC SYMBOL STAUROSCOPTIC" + - " SYMBOL TAU ROCOPTIC SYMBOL KHI ROCOPTIC SYMBOL SHIMA SIMACOPTIC CAPITAL" + - " LETTER CRYPTOGRAMMIC SHEICOPTIC SMALL LETTER CRYPTOGRAMMIC SHEICOPTIC C" + - "APITAL LETTER CRYPTOGRAMMIC GANGIACOPTIC SMALL LETTER CRYPTOGRAMMIC GANG" + - "IACOPTIC COMBINING NI ABOVECOPTIC COMBINING SPIRITUS ASPERCOPTIC COMBINI" + - "NG SPIRITUS LENISCOPTIC CAPITAL LETTER BOHAIRIC KHEICOPTIC SMALL LETTER " + - "BOHAIRIC KHEICOPTIC OLD NUBIAN FULL STOPCOPTIC OLD NUBIAN DIRECT QUESTIO" + - "N MARKCOPTIC OLD NUBIAN INDIRECT QUESTION MARKCOPTIC OLD NUBIAN VERSE DI" + - "VIDERCOPTIC FRACTION ONE HALFCOPTIC FULL STOPCOPTIC MORPHOLOGICAL DIVIDE" + - "RGEORGIAN SMALL LETTER ANGEORGIAN SMALL LETTER BANGEORGIAN SMALL LETTER " + - "GANGEORGIAN SMALL LETTER DONGEORGIAN SMALL LETTER ENGEORGIAN SMALL LETTE" + - "R VINGEORGIAN SMALL LETTER ZENGEORGIAN SMALL LETTER TANGEORGIAN SMALL LE" + - "TTER INGEORGIAN SMALL LETTER KANGEORGIAN SMALL LETTER LASGEORGIAN SMALL " + - "LETTER MANGEORGIAN SMALL LETTER NARGEORGIAN SMALL LETTER ONGEORGIAN SMAL" + - "L LETTER PARGEORGIAN SMALL LETTER ZHARGEORGIAN SMALL LETTER RAEGEORGIAN " + - "SMALL LETTER SANGEORGIAN SMALL LETTER TARGEORGIAN SMALL LETTER UNGEORGIA" + - "N SMALL LETTER PHARGEORGIAN SMALL LETTER KHARGEORGIAN SMALL LETTER GHANG" + - "EORGIAN SMALL LETTER QARGEORGIAN SMALL LETTER SHINGEORGIAN SMALL LETTER " + - "CHINGEORGIAN SMALL LETTER CANGEORGIAN SMALL LETTER JILGEORGIAN SMALL LET" + - "TER CILGEORGIAN SMALL LETTER CHARGEORGIAN SMALL LETTER XANGEORGIAN SMALL" + - " LETTER JHANGEORGIAN SMALL LETTER HAEGEORGIAN SMALL LETTER HEGEORGIAN SM" + - "ALL LETTER HIEGEORGIAN SMALL LETTER WEGEORGIAN SMALL LETTER HARGEORGIAN " + - "SMALL LETTER HOEGEORGIAN SMALL LETTER YNGEORGIAN SMALL LETTER AENTIFINAG" + - "H LETTER YATIFINAGH LETTER YABTIFINAGH LETTER YABHTIFINAGH LETTER YAGTIF" + - "INAGH LETTER YAGHHTIFINAGH LETTER BERBER ACADEMY YAJTIFINAGH LETTER YAJT" + - "IFINAGH LETTER YADTIFINAGH LETTER YADHTIFINAGH LETTER YADDTIFINAGH LETTE" + - "R YADDHTIFINAGH LETTER YEYTIFINAGH LETTER YAFTIFINAGH LETTER YAKTIFINAGH" + - " LETTER TUAREG YAKTIFINAGH LETTER YAKHHTIFINAGH LETTER YAHTIFINAGH LETTE" + - "R BERBER ACADEMY YAHTIFINAGH LETTER TUAREG YAHTIFINAGH LETTER YAHHTIFINA" + - "GH LETTER YAATIFINAGH LETTER YAKHTIFINAGH LETTER TUAREG YAKHTIFINAGH LET") + ("" + - "TER YAQTIFINAGH LETTER TUAREG YAQTIFINAGH LETTER YITIFINAGH LETTER YAZHT" + - "IFINAGH LETTER AHAGGAR YAZHTIFINAGH LETTER TUAREG YAZHTIFINAGH LETTER YA" + - "LTIFINAGH LETTER YAMTIFINAGH LETTER YANTIFINAGH LETTER TUAREG YAGNTIFINA" + - "GH LETTER TUAREG YANGTIFINAGH LETTER YAPTIFINAGH LETTER YUTIFINAGH LETTE" + - "R YARTIFINAGH LETTER YARRTIFINAGH LETTER YAGHTIFINAGH LETTER TUAREG YAGH" + - "TIFINAGH LETTER AYER YAGHTIFINAGH LETTER YASTIFINAGH LETTER YASSTIFINAGH" + - " LETTER YASHTIFINAGH LETTER YATTIFINAGH LETTER YATHTIFINAGH LETTER YACHT" + - "IFINAGH LETTER YATTTIFINAGH LETTER YAVTIFINAGH LETTER YAWTIFINAGH LETTER" + - " YAYTIFINAGH LETTER YAZTIFINAGH LETTER TAWELLEMET YAZTIFINAGH LETTER YAZ" + - "ZTIFINAGH LETTER YETIFINAGH LETTER YOTIFINAGH MODIFIER LETTER LABIALIZAT" + - "ION MARKTIFINAGH SEPARATOR MARKTIFINAGH CONSONANT JOINERETHIOPIC SYLLABL" + - "E LOAETHIOPIC SYLLABLE MOAETHIOPIC SYLLABLE ROAETHIOPIC SYLLABLE SOAETHI" + - "OPIC SYLLABLE SHOAETHIOPIC SYLLABLE BOAETHIOPIC SYLLABLE TOAETHIOPIC SYL" + - "LABLE COAETHIOPIC SYLLABLE NOAETHIOPIC SYLLABLE NYOAETHIOPIC SYLLABLE GL" + - "OTTAL OAETHIOPIC SYLLABLE ZOAETHIOPIC SYLLABLE DOAETHIOPIC SYLLABLE DDOA" + - "ETHIOPIC SYLLABLE JOAETHIOPIC SYLLABLE THOAETHIOPIC SYLLABLE CHOAETHIOPI" + - "C SYLLABLE PHOAETHIOPIC SYLLABLE POAETHIOPIC SYLLABLE GGWAETHIOPIC SYLLA" + - "BLE GGWIETHIOPIC SYLLABLE GGWEEETHIOPIC SYLLABLE GGWEETHIOPIC SYLLABLE S" + - "SAETHIOPIC SYLLABLE SSUETHIOPIC SYLLABLE SSIETHIOPIC SYLLABLE SSAAETHIOP" + - "IC SYLLABLE SSEEETHIOPIC SYLLABLE SSEETHIOPIC SYLLABLE SSOETHIOPIC SYLLA" + - "BLE CCAETHIOPIC SYLLABLE CCUETHIOPIC SYLLABLE CCIETHIOPIC SYLLABLE CCAAE" + - "THIOPIC SYLLABLE CCEEETHIOPIC SYLLABLE CCEETHIOPIC SYLLABLE CCOETHIOPIC " + - "SYLLABLE ZZAETHIOPIC SYLLABLE ZZUETHIOPIC SYLLABLE ZZIETHIOPIC SYLLABLE " + - "ZZAAETHIOPIC SYLLABLE ZZEEETHIOPIC SYLLABLE ZZEETHIOPIC SYLLABLE ZZOETHI" + - "OPIC SYLLABLE CCHAETHIOPIC SYLLABLE CCHUETHIOPIC SYLLABLE CCHIETHIOPIC S" + - "YLLABLE CCHAAETHIOPIC SYLLABLE CCHEEETHIOPIC SYLLABLE CCHEETHIOPIC SYLLA" + - "BLE CCHOETHIOPIC SYLLABLE QYAETHIOPIC SYLLABLE QYUETHIOPIC SYLLABLE QYIE" + - "THIOPIC SYLLABLE QYAAETHIOPIC SYLLABLE QYEEETHIOPIC SYLLABLE QYEETHIOPIC" + - " SYLLABLE QYOETHIOPIC SYLLABLE KYAETHIOPIC SYLLABLE KYUETHIOPIC SYLLABLE" + - " KYIETHIOPIC SYLLABLE KYAAETHIOPIC SYLLABLE KYEEETHIOPIC SYLLABLE KYEETH" + - "IOPIC SYLLABLE KYOETHIOPIC SYLLABLE XYAETHIOPIC SYLLABLE XYUETHIOPIC SYL" + - "LABLE XYIETHIOPIC SYLLABLE XYAAETHIOPIC SYLLABLE XYEEETHIOPIC SYLLABLE X" + - "YEETHIOPIC SYLLABLE XYOETHIOPIC SYLLABLE GYAETHIOPIC SYLLABLE GYUETHIOPI" + - "C SYLLABLE GYIETHIOPIC SYLLABLE GYAAETHIOPIC SYLLABLE GYEEETHIOPIC SYLLA" + - "BLE GYEETHIOPIC SYLLABLE GYOCOMBINING CYRILLIC LETTER BECOMBINING CYRILL" + - "IC LETTER VECOMBINING CYRILLIC LETTER GHECOMBINING CYRILLIC LETTER DECOM" + - "BINING CYRILLIC LETTER ZHECOMBINING CYRILLIC LETTER ZECOMBINING CYRILLIC" + - " LETTER KACOMBINING CYRILLIC LETTER ELCOMBINING CYRILLIC LETTER EMCOMBIN" + - "ING CYRILLIC LETTER ENCOMBINING CYRILLIC LETTER OCOMBINING CYRILLIC LETT" + - "ER PECOMBINING CYRILLIC LETTER ERCOMBINING CYRILLIC LETTER ESCOMBINING C" + - "YRILLIC LETTER TECOMBINING CYRILLIC LETTER HACOMBINING CYRILLIC LETTER T" + - "SECOMBINING CYRILLIC LETTER CHECOMBINING CYRILLIC LETTER SHACOMBINING CY" + - "RILLIC LETTER SHCHACOMBINING CYRILLIC LETTER FITACOMBINING CYRILLIC LETT" + - "ER ES-TECOMBINING CYRILLIC LETTER ACOMBINING CYRILLIC LETTER IECOMBINING" + - " CYRILLIC LETTER DJERVCOMBINING CYRILLIC LETTER MONOGRAPH UKCOMBINING CY" + - "RILLIC LETTER YATCOMBINING CYRILLIC LETTER YUCOMBINING CYRILLIC LETTER I" + - "OTIFIED ACOMBINING CYRILLIC LETTER LITTLE YUSCOMBINING CYRILLIC LETTER B" + - "IG YUSCOMBINING CYRILLIC LETTER IOTIFIED BIG YUSRIGHT ANGLE SUBSTITUTION" + - " MARKERRIGHT ANGLE DOTTED SUBSTITUTION MARKERLEFT SUBSTITUTION BRACKETRI" + - "GHT SUBSTITUTION BRACKETLEFT DOTTED SUBSTITUTION BRACKETRIGHT DOTTED SUB" + - "STITUTION BRACKETRAISED INTERPOLATION MARKERRAISED DOTTED INTERPOLATION " + - "MARKERDOTTED TRANSPOSITION MARKERLEFT TRANSPOSITION BRACKETRIGHT TRANSPO" + - "SITION BRACKETRAISED SQUARELEFT RAISED OMISSION BRACKETRIGHT RAISED OMIS" + - "SION BRACKETEDITORIAL CORONISPARAGRAPHOSFORKED PARAGRAPHOSREVERSED FORKE" + - "D PARAGRAPHOSHYPODIASTOLEDOTTED OBELOSDOWNWARDS ANCORAUPWARDS ANCORADOTT" + - "ED RIGHT-POINTING ANGLEDOUBLE OBLIQUE HYPHENINVERTED INTERROBANGPALM BRA" + - "NCHHYPHEN WITH DIAERESISTILDE WITH RING ABOVELEFT LOW PARAPHRASE BRACKET" + - "RIGHT LOW PARAPHRASE BRACKETTILDE WITH DOT ABOVETILDE WITH DOT BELOWLEFT" + - " VERTICAL BAR WITH QUILLRIGHT VERTICAL BAR WITH QUILLTOP LEFT HALF BRACK" + - "ETTOP RIGHT HALF BRACKETBOTTOM LEFT HALF BRACKETBOTTOM RIGHT HALF BRACKE" + - "TLEFT SIDEWAYS U BRACKETRIGHT SIDEWAYS U BRACKETLEFT DOUBLE PARENTHESISR" + - "IGHT DOUBLE PARENTHESISTWO DOTS OVER ONE DOT PUNCTUATIONONE DOT OVER TWO" + - " DOTS PUNCTUATIONSQUARED FOUR DOT PUNCTUATIONFIVE DOT MARKREVERSED QUEST" + - "ION MARKVERTICAL TILDERING POINTWORD SEPARATOR MIDDLE DOTTURNED COMMARAI") + ("" + - "SED DOTRAISED COMMATURNED SEMICOLONDAGGER WITH LEFT GUARDDAGGER WITH RIG" + - "HT GUARDTURNED DAGGERTOP HALF SECTION SIGNTWO-EM DASHTHREE-EM DASHSTENOG" + - "RAPHIC FULL STOPVERTICAL SIX DOTSWIGGLY VERTICAL LINECAPITULUMDOUBLE HYP" + - "HENREVERSED COMMADOUBLE LOW-REVERSED-9 QUOTATION MARKDASH WITH LEFT UPTU" + - "RNDOUBLE SUSPENSION MARKCJK RADICAL REPEATCJK RADICAL CLIFFCJK RADICAL S" + - "ECOND ONECJK RADICAL SECOND TWOCJK RADICAL SECOND THREECJK RADICAL PERSO" + - "NCJK RADICAL BOXCJK RADICAL TABLECJK RADICAL KNIFE ONECJK RADICAL KNIFE " + - "TWOCJK RADICAL DIVINATIONCJK RADICAL SEALCJK RADICAL SMALL ONECJK RADICA" + - "L SMALL TWOCJK RADICAL LAME ONECJK RADICAL LAME TWOCJK RADICAL LAME THRE" + - "ECJK RADICAL LAME FOURCJK RADICAL SNAKECJK RADICAL THREADCJK RADICAL SNO" + - "UT ONECJK RADICAL SNOUT TWOCJK RADICAL HEART ONECJK RADICAL HEART TWOCJK" + - " RADICAL HANDCJK RADICAL RAPCJK RADICAL CHOKECJK RADICAL SUNCJK RADICAL " + - "MOONCJK RADICAL DEATHCJK RADICAL MOTHERCJK RADICAL CIVILIANCJK RADICAL W" + - "ATER ONECJK RADICAL WATER TWOCJK RADICAL FIRECJK RADICAL PAW ONECJK RADI" + - "CAL PAW TWOCJK RADICAL SIMPLIFIED HALF TREE TRUNKCJK RADICAL COWCJK RADI" + - "CAL DOGCJK RADICAL JADECJK RADICAL BOLT OF CLOTHCJK RADICAL EYECJK RADIC" + - "AL SPIRIT ONECJK RADICAL SPIRIT TWOCJK RADICAL BAMBOOCJK RADICAL SILKCJK" + - " RADICAL C-SIMPLIFIED SILKCJK RADICAL NET ONECJK RADICAL NET TWOCJK RADI" + - "CAL NET THREECJK RADICAL NET FOURCJK RADICAL MESHCJK RADICAL SHEEPCJK RA" + - "DICAL RAMCJK RADICAL EWECJK RADICAL OLDCJK RADICAL BRUSH ONECJK RADICAL " + - "BRUSH TWOCJK RADICAL MEATCJK RADICAL MORTARCJK RADICAL GRASS ONECJK RADI" + - "CAL GRASS TWOCJK RADICAL GRASS THREECJK RADICAL TIGERCJK RADICAL CLOTHES" + - "CJK RADICAL WEST ONECJK RADICAL WEST TWOCJK RADICAL C-SIMPLIFIED SEECJK " + - "RADICAL SIMPLIFIED HORNCJK RADICAL HORNCJK RADICAL C-SIMPLIFIED SPEECHCJ" + - "K RADICAL C-SIMPLIFIED SHELLCJK RADICAL FOOTCJK RADICAL C-SIMPLIFIED CAR" + - "TCJK RADICAL SIMPLIFIED WALKCJK RADICAL WALK ONECJK RADICAL WALK TWOCJK " + - "RADICAL CITYCJK RADICAL C-SIMPLIFIED GOLDCJK RADICAL LONG ONECJK RADICAL" + - " LONG TWOCJK RADICAL C-SIMPLIFIED LONGCJK RADICAL C-SIMPLIFIED GATECJK R" + - "ADICAL MOUND ONECJK RADICAL MOUND TWOCJK RADICAL RAINCJK RADICAL BLUECJK" + - " RADICAL C-SIMPLIFIED TANNED LEATHERCJK RADICAL C-SIMPLIFIED LEAFCJK RAD" + - "ICAL C-SIMPLIFIED WINDCJK RADICAL C-SIMPLIFIED FLYCJK RADICAL EAT ONECJK" + - " RADICAL EAT TWOCJK RADICAL EAT THREECJK RADICAL C-SIMPLIFIED EATCJK RAD" + - "ICAL HEADCJK RADICAL C-SIMPLIFIED HORSECJK RADICAL BONECJK RADICAL GHOST" + - "CJK RADICAL C-SIMPLIFIED FISHCJK RADICAL C-SIMPLIFIED BIRDCJK RADICAL C-" + - "SIMPLIFIED SALTCJK RADICAL SIMPLIFIED WHEATCJK RADICAL SIMPLIFIED YELLOW" + - "CJK RADICAL C-SIMPLIFIED FROGCJK RADICAL J-SIMPLIFIED EVENCJK RADICAL C-" + - "SIMPLIFIED EVENCJK RADICAL J-SIMPLIFIED TOOTHCJK RADICAL C-SIMPLIFIED TO" + - "OTHCJK RADICAL J-SIMPLIFIED DRAGONCJK RADICAL C-SIMPLIFIED DRAGONCJK RAD" + - "ICAL TURTLECJK RADICAL J-SIMPLIFIED TURTLECJK RADICAL C-SIMPLIFIED TURTL" + - "EKANGXI RADICAL ONEKANGXI RADICAL LINEKANGXI RADICAL DOTKANGXI RADICAL S" + - "LASHKANGXI RADICAL SECONDKANGXI RADICAL HOOKKANGXI RADICAL TWOKANGXI RAD" + - "ICAL LIDKANGXI RADICAL MANKANGXI RADICAL LEGSKANGXI RADICAL ENTERKANGXI " + - "RADICAL EIGHTKANGXI RADICAL DOWN BOXKANGXI RADICAL COVERKANGXI RADICAL I" + - "CEKANGXI RADICAL TABLEKANGXI RADICAL OPEN BOXKANGXI RADICAL KNIFEKANGXI " + - "RADICAL POWERKANGXI RADICAL WRAPKANGXI RADICAL SPOONKANGXI RADICAL RIGHT" + - " OPEN BOXKANGXI RADICAL HIDING ENCLOSUREKANGXI RADICAL TENKANGXI RADICAL" + - " DIVINATIONKANGXI RADICAL SEALKANGXI RADICAL CLIFFKANGXI RADICAL PRIVATE" + - "KANGXI RADICAL AGAINKANGXI RADICAL MOUTHKANGXI RADICAL ENCLOSUREKANGXI R" + - "ADICAL EARTHKANGXI RADICAL SCHOLARKANGXI RADICAL GOKANGXI RADICAL GO SLO" + - "WLYKANGXI RADICAL EVENINGKANGXI RADICAL BIGKANGXI RADICAL WOMANKANGXI RA" + - "DICAL CHILDKANGXI RADICAL ROOFKANGXI RADICAL INCHKANGXI RADICAL SMALLKAN" + - "GXI RADICAL LAMEKANGXI RADICAL CORPSEKANGXI RADICAL SPROUTKANGXI RADICAL" + - " MOUNTAINKANGXI RADICAL RIVERKANGXI RADICAL WORKKANGXI RADICAL ONESELFKA" + - "NGXI RADICAL TURBANKANGXI RADICAL DRYKANGXI RADICAL SHORT THREADKANGXI R" + - "ADICAL DOTTED CLIFFKANGXI RADICAL LONG STRIDEKANGXI RADICAL TWO HANDSKAN" + - "GXI RADICAL SHOOTKANGXI RADICAL BOWKANGXI RADICAL SNOUTKANGXI RADICAL BR" + - "ISTLEKANGXI RADICAL STEPKANGXI RADICAL HEARTKANGXI RADICAL HALBERDKANGXI" + - " RADICAL DOORKANGXI RADICAL HANDKANGXI RADICAL BRANCHKANGXI RADICAL RAPK" + - "ANGXI RADICAL SCRIPTKANGXI RADICAL DIPPERKANGXI RADICAL AXEKANGXI RADICA" + - "L SQUAREKANGXI RADICAL NOTKANGXI RADICAL SUNKANGXI RADICAL SAYKANGXI RAD" + - "ICAL MOONKANGXI RADICAL TREEKANGXI RADICAL LACKKANGXI RADICAL STOPKANGXI" + - " RADICAL DEATHKANGXI RADICAL WEAPONKANGXI RADICAL DO NOTKANGXI RADICAL C" + - "OMPAREKANGXI RADICAL FURKANGXI RADICAL CLANKANGXI RADICAL STEAMKANGXI RA" + - "DICAL WATERKANGXI RADICAL FIREKANGXI RADICAL CLAWKANGXI RADICAL FATHERKA") + ("" + - "NGXI RADICAL DOUBLE XKANGXI RADICAL HALF TREE TRUNKKANGXI RADICAL SLICEK" + - "ANGXI RADICAL FANGKANGXI RADICAL COWKANGXI RADICAL DOGKANGXI RADICAL PRO" + - "FOUNDKANGXI RADICAL JADEKANGXI RADICAL MELONKANGXI RADICAL TILEKANGXI RA" + - "DICAL SWEETKANGXI RADICAL LIFEKANGXI RADICAL USEKANGXI RADICAL FIELDKANG" + - "XI RADICAL BOLT OF CLOTHKANGXI RADICAL SICKNESSKANGXI RADICAL DOTTED TEN" + - "TKANGXI RADICAL WHITEKANGXI RADICAL SKINKANGXI RADICAL DISHKANGXI RADICA" + - "L EYEKANGXI RADICAL SPEARKANGXI RADICAL ARROWKANGXI RADICAL STONEKANGXI " + - "RADICAL SPIRITKANGXI RADICAL TRACKKANGXI RADICAL GRAINKANGXI RADICAL CAV" + - "EKANGXI RADICAL STANDKANGXI RADICAL BAMBOOKANGXI RADICAL RICEKANGXI RADI" + - "CAL SILKKANGXI RADICAL JARKANGXI RADICAL NETKANGXI RADICAL SHEEPKANGXI R" + - "ADICAL FEATHERKANGXI RADICAL OLDKANGXI RADICAL ANDKANGXI RADICAL PLOWKAN" + - "GXI RADICAL EARKANGXI RADICAL BRUSHKANGXI RADICAL MEATKANGXI RADICAL MIN" + - "ISTERKANGXI RADICAL SELFKANGXI RADICAL ARRIVEKANGXI RADICAL MORTARKANGXI" + - " RADICAL TONGUEKANGXI RADICAL OPPOSEKANGXI RADICAL BOATKANGXI RADICAL ST" + - "OPPINGKANGXI RADICAL COLORKANGXI RADICAL GRASSKANGXI RADICAL TIGERKANGXI" + - " RADICAL INSECTKANGXI RADICAL BLOODKANGXI RADICAL WALK ENCLOSUREKANGXI R" + - "ADICAL CLOTHESKANGXI RADICAL WESTKANGXI RADICAL SEEKANGXI RADICAL HORNKA" + - "NGXI RADICAL SPEECHKANGXI RADICAL VALLEYKANGXI RADICAL BEANKANGXI RADICA" + - "L PIGKANGXI RADICAL BADGERKANGXI RADICAL SHELLKANGXI RADICAL REDKANGXI R" + - "ADICAL RUNKANGXI RADICAL FOOTKANGXI RADICAL BODYKANGXI RADICAL CARTKANGX" + - "I RADICAL BITTERKANGXI RADICAL MORNINGKANGXI RADICAL WALKKANGXI RADICAL " + - "CITYKANGXI RADICAL WINEKANGXI RADICAL DISTINGUISHKANGXI RADICAL VILLAGEK" + - "ANGXI RADICAL GOLDKANGXI RADICAL LONGKANGXI RADICAL GATEKANGXI RADICAL M" + - "OUNDKANGXI RADICAL SLAVEKANGXI RADICAL SHORT TAILED BIRDKANGXI RADICAL R" + - "AINKANGXI RADICAL BLUEKANGXI RADICAL WRONGKANGXI RADICAL FACEKANGXI RADI" + - "CAL LEATHERKANGXI RADICAL TANNED LEATHERKANGXI RADICAL LEEKKANGXI RADICA" + - "L SOUNDKANGXI RADICAL LEAFKANGXI RADICAL WINDKANGXI RADICAL FLYKANGXI RA" + - "DICAL EATKANGXI RADICAL HEADKANGXI RADICAL FRAGRANTKANGXI RADICAL HORSEK" + - "ANGXI RADICAL BONEKANGXI RADICAL TALLKANGXI RADICAL HAIRKANGXI RADICAL F" + - "IGHTKANGXI RADICAL SACRIFICIAL WINEKANGXI RADICAL CAULDRONKANGXI RADICAL" + - " GHOSTKANGXI RADICAL FISHKANGXI RADICAL BIRDKANGXI RADICAL SALTKANGXI RA" + - "DICAL DEERKANGXI RADICAL WHEATKANGXI RADICAL HEMPKANGXI RADICAL YELLOWKA" + - "NGXI RADICAL MILLETKANGXI RADICAL BLACKKANGXI RADICAL EMBROIDERYKANGXI R" + - "ADICAL FROGKANGXI RADICAL TRIPODKANGXI RADICAL DRUMKANGXI RADICAL RATKAN" + - "GXI RADICAL NOSEKANGXI RADICAL EVENKANGXI RADICAL TOOTHKANGXI RADICAL DR" + - "AGONKANGXI RADICAL TURTLEKANGXI RADICAL FLUTEIDEOGRAPHIC DESCRIPTION CHA" + - "RACTER LEFT TO RIGHTIDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOWIDEO" + - "GRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHTIDEOGRAPHIC DESCRI" + - "PTION CHARACTER ABOVE TO MIDDLE AND BELOWIDEOGRAPHIC DESCRIPTION CHARACT" + - "ER FULL SURROUNDIDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVEIDE" + - "OGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOWIDEOGRAPHIC DESCRIPTIO" + - "N CHARACTER SURROUND FROM LEFTIDEOGRAPHIC DESCRIPTION CHARACTER SURROUND" + - " FROM UPPER LEFTIDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RI" + - "GHTIDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFTIDEOGRAPHIC" + - " DESCRIPTION CHARACTER OVERLAIDIDEOGRAPHIC SPACEIDEOGRAPHIC COMMAIDEOGRA" + - "PHIC FULL STOPDITTO MARKJAPANESE INDUSTRIAL STANDARD SYMBOLIDEOGRAPHIC I" + - "TERATION MARKIDEOGRAPHIC CLOSING MARKIDEOGRAPHIC NUMBER ZEROLEFT ANGLE B" + - "RACKETRIGHT ANGLE BRACKETLEFT DOUBLE ANGLE BRACKETRIGHT DOUBLE ANGLE BRA" + - "CKETLEFT CORNER BRACKETRIGHT CORNER BRACKETLEFT WHITE CORNER BRACKETRIGH" + - "T WHITE CORNER BRACKETLEFT BLACK LENTICULAR BRACKETRIGHT BLACK LENTICULA" + - "R BRACKETPOSTAL MARKGETA MARKLEFT TORTOISE SHELL BRACKETRIGHT TORTOISE S" + - "HELL BRACKETLEFT WHITE LENTICULAR BRACKETRIGHT WHITE LENTICULAR BRACKETL" + - "EFT WHITE TORTOISE SHELL BRACKETRIGHT WHITE TORTOISE SHELL BRACKETLEFT W" + - "HITE SQUARE BRACKETRIGHT WHITE SQUARE BRACKETWAVE DASHREVERSED DOUBLE PR" + - "IME QUOTATION MARKDOUBLE PRIME QUOTATION MARKLOW DOUBLE PRIME QUOTATION " + - "MARKPOSTAL MARK FACEHANGZHOU NUMERAL ONEHANGZHOU NUMERAL TWOHANGZHOU NUM" + - "ERAL THREEHANGZHOU NUMERAL FOURHANGZHOU NUMERAL FIVEHANGZHOU NUMERAL SIX" + - "HANGZHOU NUMERAL SEVENHANGZHOU NUMERAL EIGHTHANGZHOU NUMERAL NINEIDEOGRA" + - "PHIC LEVEL TONE MARKIDEOGRAPHIC RISING TONE MARKIDEOGRAPHIC DEPARTING TO" + - "NE MARKIDEOGRAPHIC ENTERING TONE MARKHANGUL SINGLE DOT TONE MARKHANGUL D" + - "OUBLE DOT TONE MARKWAVY DASHVERTICAL KANA REPEAT MARKVERTICAL KANA REPEA" + - "T WITH VOICED SOUND MARKVERTICAL KANA REPEAT MARK UPPER HALFVERTICAL KAN" + - "A REPEAT WITH VOICED SOUND MARK UPPER HALFVERTICAL KANA REPEAT MARK LOWE" + - "R HALFCIRCLED POSTAL MARKIDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBO") + ("" + - "LHANGZHOU NUMERAL TENHANGZHOU NUMERAL TWENTYHANGZHOU NUMERAL THIRTYVERTI" + - "CAL IDEOGRAPHIC ITERATION MARKMASU MARKPART ALTERNATION MARKIDEOGRAPHIC " + - "VARIATION INDICATORIDEOGRAPHIC HALF FILL SPACEHIRAGANA LETTER SMALL AHIR" + - "AGANA LETTER AHIRAGANA LETTER SMALL IHIRAGANA LETTER IHIRAGANA LETTER SM" + - "ALL UHIRAGANA LETTER UHIRAGANA LETTER SMALL EHIRAGANA LETTER EHIRAGANA L" + - "ETTER SMALL OHIRAGANA LETTER OHIRAGANA LETTER KAHIRAGANA LETTER GAHIRAGA" + - "NA LETTER KIHIRAGANA LETTER GIHIRAGANA LETTER KUHIRAGANA LETTER GUHIRAGA" + - "NA LETTER KEHIRAGANA LETTER GEHIRAGANA LETTER KOHIRAGANA LETTER GOHIRAGA" + - "NA LETTER SAHIRAGANA LETTER ZAHIRAGANA LETTER SIHIRAGANA LETTER ZIHIRAGA" + - "NA LETTER SUHIRAGANA LETTER ZUHIRAGANA LETTER SEHIRAGANA LETTER ZEHIRAGA" + - "NA LETTER SOHIRAGANA LETTER ZOHIRAGANA LETTER TAHIRAGANA LETTER DAHIRAGA" + - "NA LETTER TIHIRAGANA LETTER DIHIRAGANA LETTER SMALL TUHIRAGANA LETTER TU" + - "HIRAGANA LETTER DUHIRAGANA LETTER TEHIRAGANA LETTER DEHIRAGANA LETTER TO" + - "HIRAGANA LETTER DOHIRAGANA LETTER NAHIRAGANA LETTER NIHIRAGANA LETTER NU" + - "HIRAGANA LETTER NEHIRAGANA LETTER NOHIRAGANA LETTER HAHIRAGANA LETTER BA" + - "HIRAGANA LETTER PAHIRAGANA LETTER HIHIRAGANA LETTER BIHIRAGANA LETTER PI" + - "HIRAGANA LETTER HUHIRAGANA LETTER BUHIRAGANA LETTER PUHIRAGANA LETTER HE" + - "HIRAGANA LETTER BEHIRAGANA LETTER PEHIRAGANA LETTER HOHIRAGANA LETTER BO" + - "HIRAGANA LETTER POHIRAGANA LETTER MAHIRAGANA LETTER MIHIRAGANA LETTER MU" + - "HIRAGANA LETTER MEHIRAGANA LETTER MOHIRAGANA LETTER SMALL YAHIRAGANA LET" + - "TER YAHIRAGANA LETTER SMALL YUHIRAGANA LETTER YUHIRAGANA LETTER SMALL YO" + - "HIRAGANA LETTER YOHIRAGANA LETTER RAHIRAGANA LETTER RIHIRAGANA LETTER RU" + - "HIRAGANA LETTER REHIRAGANA LETTER ROHIRAGANA LETTER SMALL WAHIRAGANA LET" + - "TER WAHIRAGANA LETTER WIHIRAGANA LETTER WEHIRAGANA LETTER WOHIRAGANA LET" + - "TER NHIRAGANA LETTER VUHIRAGANA LETTER SMALL KAHIRAGANA LETTER SMALL KEC" + - "OMBINING KATAKANA-HIRAGANA VOICED SOUND MARKCOMBINING KATAKANA-HIRAGANA " + - "SEMI-VOICED SOUND MARKKATAKANA-HIRAGANA VOICED SOUND MARKKATAKANA-HIRAGA" + - "NA SEMI-VOICED SOUND MARKHIRAGANA ITERATION MARKHIRAGANA VOICED ITERATIO" + - "N MARKHIRAGANA DIGRAPH YORIKATAKANA-HIRAGANA DOUBLE HYPHENKATAKANA LETTE" + - "R SMALL AKATAKANA LETTER AKATAKANA LETTER SMALL IKATAKANA LETTER IKATAKA" + - "NA LETTER SMALL UKATAKANA LETTER UKATAKANA LETTER SMALL EKATAKANA LETTER" + - " EKATAKANA LETTER SMALL OKATAKANA LETTER OKATAKANA LETTER KAKATAKANA LET" + - "TER GAKATAKANA LETTER KIKATAKANA LETTER GIKATAKANA LETTER KUKATAKANA LET" + - "TER GUKATAKANA LETTER KEKATAKANA LETTER GEKATAKANA LETTER KOKATAKANA LET" + - "TER GOKATAKANA LETTER SAKATAKANA LETTER ZAKATAKANA LETTER SIKATAKANA LET" + - "TER ZIKATAKANA LETTER SUKATAKANA LETTER ZUKATAKANA LETTER SEKATAKANA LET" + - "TER ZEKATAKANA LETTER SOKATAKANA LETTER ZOKATAKANA LETTER TAKATAKANA LET" + - "TER DAKATAKANA LETTER TIKATAKANA LETTER DIKATAKANA LETTER SMALL TUKATAKA" + - "NA LETTER TUKATAKANA LETTER DUKATAKANA LETTER TEKATAKANA LETTER DEKATAKA" + - "NA LETTER TOKATAKANA LETTER DOKATAKANA LETTER NAKATAKANA LETTER NIKATAKA" + - "NA LETTER NUKATAKANA LETTER NEKATAKANA LETTER NOKATAKANA LETTER HAKATAKA" + - "NA LETTER BAKATAKANA LETTER PAKATAKANA LETTER HIKATAKANA LETTER BIKATAKA" + - "NA LETTER PIKATAKANA LETTER HUKATAKANA LETTER BUKATAKANA LETTER PUKATAKA" + - "NA LETTER HEKATAKANA LETTER BEKATAKANA LETTER PEKATAKANA LETTER HOKATAKA" + - "NA LETTER BOKATAKANA LETTER POKATAKANA LETTER MAKATAKANA LETTER MIKATAKA" + - "NA LETTER MUKATAKANA LETTER MEKATAKANA LETTER MOKATAKANA LETTER SMALL YA" + - "KATAKANA LETTER YAKATAKANA LETTER SMALL YUKATAKANA LETTER YUKATAKANA LET" + - "TER SMALL YOKATAKANA LETTER YOKATAKANA LETTER RAKATAKANA LETTER RIKATAKA" + - "NA LETTER RUKATAKANA LETTER REKATAKANA LETTER ROKATAKANA LETTER SMALL WA" + - "KATAKANA LETTER WAKATAKANA LETTER WIKATAKANA LETTER WEKATAKANA LETTER WO" + - "KATAKANA LETTER NKATAKANA LETTER VUKATAKANA LETTER SMALL KAKATAKANA LETT" + - "ER SMALL KEKATAKANA LETTER VAKATAKANA LETTER VIKATAKANA LETTER VEKATAKAN" + - "A LETTER VOKATAKANA MIDDLE DOTKATAKANA-HIRAGANA PROLONGED SOUND MARKKATA" + - "KANA ITERATION MARKKATAKANA VOICED ITERATION MARKKATAKANA DIGRAPH KOTOBO" + - "POMOFO LETTER BBOPOMOFO LETTER PBOPOMOFO LETTER MBOPOMOFO LETTER FBOPOMO" + - "FO LETTER DBOPOMOFO LETTER TBOPOMOFO LETTER NBOPOMOFO LETTER LBOPOMOFO L" + - "ETTER GBOPOMOFO LETTER KBOPOMOFO LETTER HBOPOMOFO LETTER JBOPOMOFO LETTE" + - "R QBOPOMOFO LETTER XBOPOMOFO LETTER ZHBOPOMOFO LETTER CHBOPOMOFO LETTER " + - "SHBOPOMOFO LETTER RBOPOMOFO LETTER ZBOPOMOFO LETTER CBOPOMOFO LETTER SBO" + - "POMOFO LETTER ABOPOMOFO LETTER OBOPOMOFO LETTER EBOPOMOFO LETTER EHBOPOM" + - "OFO LETTER AIBOPOMOFO LETTER EIBOPOMOFO LETTER AUBOPOMOFO LETTER OUBOPOM" + - "OFO LETTER ANBOPOMOFO LETTER ENBOPOMOFO LETTER ANGBOPOMOFO LETTER ENGBOP" + - "OMOFO LETTER ERBOPOMOFO LETTER IBOPOMOFO LETTER UBOPOMOFO LETTER IUBOPOM" + - "OFO LETTER VBOPOMOFO LETTER NGBOPOMOFO LETTER GNBOPOMOFO LETTER IHHANGUL") + ("" + - " LETTER KIYEOKHANGUL LETTER SSANGKIYEOKHANGUL LETTER KIYEOK-SIOSHANGUL L" + - "ETTER NIEUNHANGUL LETTER NIEUN-CIEUCHANGUL LETTER NIEUN-HIEUHHANGUL LETT" + - "ER TIKEUTHANGUL LETTER SSANGTIKEUTHANGUL LETTER RIEULHANGUL LETTER RIEUL" + - "-KIYEOKHANGUL LETTER RIEUL-MIEUMHANGUL LETTER RIEUL-PIEUPHANGUL LETTER R" + - "IEUL-SIOSHANGUL LETTER RIEUL-THIEUTHHANGUL LETTER RIEUL-PHIEUPHHANGUL LE" + - "TTER RIEUL-HIEUHHANGUL LETTER MIEUMHANGUL LETTER PIEUPHANGUL LETTER SSAN" + - "GPIEUPHANGUL LETTER PIEUP-SIOSHANGUL LETTER SIOSHANGUL LETTER SSANGSIOSH" + - "ANGUL LETTER IEUNGHANGUL LETTER CIEUCHANGUL LETTER SSANGCIEUCHANGUL LETT" + - "ER CHIEUCHHANGUL LETTER KHIEUKHHANGUL LETTER THIEUTHHANGUL LETTER PHIEUP" + - "HHANGUL LETTER HIEUHHANGUL LETTER AHANGUL LETTER AEHANGUL LETTER YAHANGU" + - "L LETTER YAEHANGUL LETTER EOHANGUL LETTER EHANGUL LETTER YEOHANGUL LETTE" + - "R YEHANGUL LETTER OHANGUL LETTER WAHANGUL LETTER WAEHANGUL LETTER OEHANG" + - "UL LETTER YOHANGUL LETTER UHANGUL LETTER WEOHANGUL LETTER WEHANGUL LETTE" + - "R WIHANGUL LETTER YUHANGUL LETTER EUHANGUL LETTER YIHANGUL LETTER IHANGU" + - "L FILLERHANGUL LETTER SSANGNIEUNHANGUL LETTER NIEUN-TIKEUTHANGUL LETTER " + - "NIEUN-SIOSHANGUL LETTER NIEUN-PANSIOSHANGUL LETTER RIEUL-KIYEOK-SIOSHANG" + - "UL LETTER RIEUL-TIKEUTHANGUL LETTER RIEUL-PIEUP-SIOSHANGUL LETTER RIEUL-" + - "PANSIOSHANGUL LETTER RIEUL-YEORINHIEUHHANGUL LETTER MIEUM-PIEUPHANGUL LE" + - "TTER MIEUM-SIOSHANGUL LETTER MIEUM-PANSIOSHANGUL LETTER KAPYEOUNMIEUMHAN" + - "GUL LETTER PIEUP-KIYEOKHANGUL LETTER PIEUP-TIKEUTHANGUL LETTER PIEUP-SIO" + - "S-KIYEOKHANGUL LETTER PIEUP-SIOS-TIKEUTHANGUL LETTER PIEUP-CIEUCHANGUL L" + - "ETTER PIEUP-THIEUTHHANGUL LETTER KAPYEOUNPIEUPHANGUL LETTER KAPYEOUNSSAN" + - "GPIEUPHANGUL LETTER SIOS-KIYEOKHANGUL LETTER SIOS-NIEUNHANGUL LETTER SIO" + - "S-TIKEUTHANGUL LETTER SIOS-PIEUPHANGUL LETTER SIOS-CIEUCHANGUL LETTER PA" + - "NSIOSHANGUL LETTER SSANGIEUNGHANGUL LETTER YESIEUNGHANGUL LETTER YESIEUN" + - "G-SIOSHANGUL LETTER YESIEUNG-PANSIOSHANGUL LETTER KAPYEOUNPHIEUPHHANGUL " + - "LETTER SSANGHIEUHHANGUL LETTER YEORINHIEUHHANGUL LETTER YO-YAHANGUL LETT" + - "ER YO-YAEHANGUL LETTER YO-IHANGUL LETTER YU-YEOHANGUL LETTER YU-YEHANGUL" + - " LETTER YU-IHANGUL LETTER ARAEAHANGUL LETTER ARAEAEIDEOGRAPHIC ANNOTATIO" + - "N LINKING MARKIDEOGRAPHIC ANNOTATION REVERSE MARKIDEOGRAPHIC ANNOTATION " + - "ONE MARKIDEOGRAPHIC ANNOTATION TWO MARKIDEOGRAPHIC ANNOTATION THREE MARK" + - "IDEOGRAPHIC ANNOTATION FOUR MARKIDEOGRAPHIC ANNOTATION TOP MARKIDEOGRAPH" + - "IC ANNOTATION MIDDLE MARKIDEOGRAPHIC ANNOTATION BOTTOM MARKIDEOGRAPHIC A" + - "NNOTATION FIRST MARKIDEOGRAPHIC ANNOTATION SECOND MARKIDEOGRAPHIC ANNOTA" + - "TION THIRD MARKIDEOGRAPHIC ANNOTATION FOURTH MARKIDEOGRAPHIC ANNOTATION " + - "HEAVEN MARKIDEOGRAPHIC ANNOTATION EARTH MARKIDEOGRAPHIC ANNOTATION MAN M" + - "ARKBOPOMOFO LETTER BUBOPOMOFO LETTER ZIBOPOMOFO LETTER JIBOPOMOFO LETTER" + - " GUBOPOMOFO LETTER EEBOPOMOFO LETTER ENNBOPOMOFO LETTER OOBOPOMOFO LETTE" + - "R ONNBOPOMOFO LETTER IRBOPOMOFO LETTER ANNBOPOMOFO LETTER INNBOPOMOFO LE" + - "TTER UNNBOPOMOFO LETTER IMBOPOMOFO LETTER NGGBOPOMOFO LETTER AINNBOPOMOF" + - "O LETTER AUNNBOPOMOFO LETTER AMBOPOMOFO LETTER OMBOPOMOFO LETTER ONGBOPO" + - "MOFO LETTER INNNBOPOMOFO FINAL LETTER PBOPOMOFO FINAL LETTER TBOPOMOFO F" + - "INAL LETTER KBOPOMOFO FINAL LETTER HBOPOMOFO LETTER GHBOPOMOFO LETTER LH" + - "BOPOMOFO LETTER ZYCJK STROKE TCJK STROKE WGCJK STROKE XGCJK STROKE BXGCJ" + - "K STROKE SWCJK STROKE HZZCJK STROKE HZGCJK STROKE HPCJK STROKE HZWGCJK S" + - "TROKE SZWGCJK STROKE HZTCJK STROKE HZZPCJK STROKE HPWGCJK STROKE HZWCJK " + - "STROKE HZZZCJK STROKE NCJK STROKE HCJK STROKE SCJK STROKE PCJK STROKE SP" + - "CJK STROKE DCJK STROKE HZCJK STROKE HGCJK STROKE SZCJK STROKE SWZCJK STR" + - "OKE STCJK STROKE SGCJK STROKE PDCJK STROKE PZCJK STROKE TNCJK STROKE SZZ" + - "CJK STROKE SWGCJK STROKE HXWGCJK STROKE HZZZGCJK STROKE PGCJK STROKE QKA" + - "TAKANA LETTER SMALL KUKATAKANA LETTER SMALL SIKATAKANA LETTER SMALL SUKA" + - "TAKANA LETTER SMALL TOKATAKANA LETTER SMALL NUKATAKANA LETTER SMALL HAKA" + - "TAKANA LETTER SMALL HIKATAKANA LETTER SMALL HUKATAKANA LETTER SMALL HEKA" + - "TAKANA LETTER SMALL HOKATAKANA LETTER SMALL MUKATAKANA LETTER SMALL RAKA" + - "TAKANA LETTER SMALL RIKATAKANA LETTER SMALL RUKATAKANA LETTER SMALL REKA" + - "TAKANA LETTER SMALL ROPARENTHESIZED HANGUL KIYEOKPARENTHESIZED HANGUL NI" + - "EUNPARENTHESIZED HANGUL TIKEUTPARENTHESIZED HANGUL RIEULPARENTHESIZED HA" + - "NGUL MIEUMPARENTHESIZED HANGUL PIEUPPARENTHESIZED HANGUL SIOSPARENTHESIZ" + - "ED HANGUL IEUNGPARENTHESIZED HANGUL CIEUCPARENTHESIZED HANGUL CHIEUCHPAR" + - "ENTHESIZED HANGUL KHIEUKHPARENTHESIZED HANGUL THIEUTHPARENTHESIZED HANGU" + - "L PHIEUPHPARENTHESIZED HANGUL HIEUHPARENTHESIZED HANGUL KIYEOK APARENTHE" + - "SIZED HANGUL NIEUN APARENTHESIZED HANGUL TIKEUT APARENTHESIZED HANGUL RI" + - "EUL APARENTHESIZED HANGUL MIEUM APARENTHESIZED HANGUL PIEUP APARENTHESIZ" + - "ED HANGUL SIOS APARENTHESIZED HANGUL IEUNG APARENTHESIZED HANGUL CIEUC A") + ("" + - "PARENTHESIZED HANGUL CHIEUCH APARENTHESIZED HANGUL KHIEUKH APARENTHESIZE" + - "D HANGUL THIEUTH APARENTHESIZED HANGUL PHIEUPH APARENTHESIZED HANGUL HIE" + - "UH APARENTHESIZED HANGUL CIEUC UPARENTHESIZED KOREAN CHARACTER OJEONPARE" + - "NTHESIZED KOREAN CHARACTER O HUPARENTHESIZED IDEOGRAPH ONEPARENTHESIZED " + - "IDEOGRAPH TWOPARENTHESIZED IDEOGRAPH THREEPARENTHESIZED IDEOGRAPH FOURPA" + - "RENTHESIZED IDEOGRAPH FIVEPARENTHESIZED IDEOGRAPH SIXPARENTHESIZED IDEOG" + - "RAPH SEVENPARENTHESIZED IDEOGRAPH EIGHTPARENTHESIZED IDEOGRAPH NINEPAREN" + - "THESIZED IDEOGRAPH TENPARENTHESIZED IDEOGRAPH MOONPARENTHESIZED IDEOGRAP" + - "H FIREPARENTHESIZED IDEOGRAPH WATERPARENTHESIZED IDEOGRAPH WOODPARENTHES" + - "IZED IDEOGRAPH METALPARENTHESIZED IDEOGRAPH EARTHPARENTHESIZED IDEOGRAPH" + - " SUNPARENTHESIZED IDEOGRAPH STOCKPARENTHESIZED IDEOGRAPH HAVEPARENTHESIZ" + - "ED IDEOGRAPH SOCIETYPARENTHESIZED IDEOGRAPH NAMEPARENTHESIZED IDEOGRAPH " + - "SPECIALPARENTHESIZED IDEOGRAPH FINANCIALPARENTHESIZED IDEOGRAPH CONGRATU" + - "LATIONPARENTHESIZED IDEOGRAPH LABORPARENTHESIZED IDEOGRAPH REPRESENTPARE" + - "NTHESIZED IDEOGRAPH CALLPARENTHESIZED IDEOGRAPH STUDYPARENTHESIZED IDEOG" + - "RAPH SUPERVISEPARENTHESIZED IDEOGRAPH ENTERPRISEPARENTHESIZED IDEOGRAPH " + - "RESOURCEPARENTHESIZED IDEOGRAPH ALLIANCEPARENTHESIZED IDEOGRAPH FESTIVAL" + - "PARENTHESIZED IDEOGRAPH RESTPARENTHESIZED IDEOGRAPH SELFPARENTHESIZED ID" + - "EOGRAPH REACHCIRCLED IDEOGRAPH QUESTIONCIRCLED IDEOGRAPH KINDERGARTENCIR" + - "CLED IDEOGRAPH SCHOOLCIRCLED IDEOGRAPH KOTOCIRCLED NUMBER TEN ON BLACK S" + - "QUARECIRCLED NUMBER TWENTY ON BLACK SQUARECIRCLED NUMBER THIRTY ON BLACK" + - " SQUARECIRCLED NUMBER FORTY ON BLACK SQUARECIRCLED NUMBER FIFTY ON BLACK" + - " SQUARECIRCLED NUMBER SIXTY ON BLACK SQUARECIRCLED NUMBER SEVENTY ON BLA" + - "CK SQUARECIRCLED NUMBER EIGHTY ON BLACK SQUAREPARTNERSHIP SIGNCIRCLED NU" + - "MBER TWENTY ONECIRCLED NUMBER TWENTY TWOCIRCLED NUMBER TWENTY THREECIRCL" + - "ED NUMBER TWENTY FOURCIRCLED NUMBER TWENTY FIVECIRCLED NUMBER TWENTY SIX" + - "CIRCLED NUMBER TWENTY SEVENCIRCLED NUMBER TWENTY EIGHTCIRCLED NUMBER TWE" + - "NTY NINECIRCLED NUMBER THIRTYCIRCLED NUMBER THIRTY ONECIRCLED NUMBER THI" + - "RTY TWOCIRCLED NUMBER THIRTY THREECIRCLED NUMBER THIRTY FOURCIRCLED NUMB" + - "ER THIRTY FIVECIRCLED HANGUL KIYEOKCIRCLED HANGUL NIEUNCIRCLED HANGUL TI" + - "KEUTCIRCLED HANGUL RIEULCIRCLED HANGUL MIEUMCIRCLED HANGUL PIEUPCIRCLED " + - "HANGUL SIOSCIRCLED HANGUL IEUNGCIRCLED HANGUL CIEUCCIRCLED HANGUL CHIEUC" + - "HCIRCLED HANGUL KHIEUKHCIRCLED HANGUL THIEUTHCIRCLED HANGUL PHIEUPHCIRCL" + - "ED HANGUL HIEUHCIRCLED HANGUL KIYEOK ACIRCLED HANGUL NIEUN ACIRCLED HANG" + - "UL TIKEUT ACIRCLED HANGUL RIEUL ACIRCLED HANGUL MIEUM ACIRCLED HANGUL PI" + - "EUP ACIRCLED HANGUL SIOS ACIRCLED HANGUL IEUNG ACIRCLED HANGUL CIEUC ACI" + - "RCLED HANGUL CHIEUCH ACIRCLED HANGUL KHIEUKH ACIRCLED HANGUL THIEUTH ACI" + - "RCLED HANGUL PHIEUPH ACIRCLED HANGUL HIEUH ACIRCLED KOREAN CHARACTER CHA" + - "MKOCIRCLED KOREAN CHARACTER JUEUICIRCLED HANGUL IEUNG UKOREAN STANDARD S" + - "YMBOLCIRCLED IDEOGRAPH ONECIRCLED IDEOGRAPH TWOCIRCLED IDEOGRAPH THREECI" + - "RCLED IDEOGRAPH FOURCIRCLED IDEOGRAPH FIVECIRCLED IDEOGRAPH SIXCIRCLED I" + - "DEOGRAPH SEVENCIRCLED IDEOGRAPH EIGHTCIRCLED IDEOGRAPH NINECIRCLED IDEOG" + - "RAPH TENCIRCLED IDEOGRAPH MOONCIRCLED IDEOGRAPH FIRECIRCLED IDEOGRAPH WA" + - "TERCIRCLED IDEOGRAPH WOODCIRCLED IDEOGRAPH METALCIRCLED IDEOGRAPH EARTHC" + - "IRCLED IDEOGRAPH SUNCIRCLED IDEOGRAPH STOCKCIRCLED IDEOGRAPH HAVECIRCLED" + - " IDEOGRAPH SOCIETYCIRCLED IDEOGRAPH NAMECIRCLED IDEOGRAPH SPECIALCIRCLED" + - " IDEOGRAPH FINANCIALCIRCLED IDEOGRAPH CONGRATULATIONCIRCLED IDEOGRAPH LA" + - "BORCIRCLED IDEOGRAPH SECRETCIRCLED IDEOGRAPH MALECIRCLED IDEOGRAPH FEMAL" + - "ECIRCLED IDEOGRAPH SUITABLECIRCLED IDEOGRAPH EXCELLENTCIRCLED IDEOGRAPH " + - "PRINTCIRCLED IDEOGRAPH ATTENTIONCIRCLED IDEOGRAPH ITEMCIRCLED IDEOGRAPH " + - "RESTCIRCLED IDEOGRAPH COPYCIRCLED IDEOGRAPH CORRECTCIRCLED IDEOGRAPH HIG" + - "HCIRCLED IDEOGRAPH CENTRECIRCLED IDEOGRAPH LOWCIRCLED IDEOGRAPH LEFTCIRC" + - "LED IDEOGRAPH RIGHTCIRCLED IDEOGRAPH MEDICINECIRCLED IDEOGRAPH RELIGIONC" + - "IRCLED IDEOGRAPH STUDYCIRCLED IDEOGRAPH SUPERVISECIRCLED IDEOGRAPH ENTER" + - "PRISECIRCLED IDEOGRAPH RESOURCECIRCLED IDEOGRAPH ALLIANCECIRCLED IDEOGRA" + - "PH NIGHTCIRCLED NUMBER THIRTY SIXCIRCLED NUMBER THIRTY SEVENCIRCLED NUMB" + - "ER THIRTY EIGHTCIRCLED NUMBER THIRTY NINECIRCLED NUMBER FORTYCIRCLED NUM" + - "BER FORTY ONECIRCLED NUMBER FORTY TWOCIRCLED NUMBER FORTY THREECIRCLED N" + - "UMBER FORTY FOURCIRCLED NUMBER FORTY FIVECIRCLED NUMBER FORTY SIXCIRCLED" + - " NUMBER FORTY SEVENCIRCLED NUMBER FORTY EIGHTCIRCLED NUMBER FORTY NINECI" + - "RCLED NUMBER FIFTYIDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARYIDEOGRAPHIC TE" + - "LEGRAPH SYMBOL FOR FEBRUARYIDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCHIDEOGRA" + - "PHIC TELEGRAPH SYMBOL FOR APRILIDEOGRAPHIC TELEGRAPH SYMBOL FOR MAYIDEOG" + - "RAPHIC TELEGRAPH SYMBOL FOR JUNEIDEOGRAPHIC TELEGRAPH SYMBOL FOR JULYIDE") + ("" + - "OGRAPHIC TELEGRAPH SYMBOL FOR AUGUSTIDEOGRAPHIC TELEGRAPH SYMBOL FOR SEP" + - "TEMBERIDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBERIDEOGRAPHIC TELEGRAPH SYMB" + - "OL FOR NOVEMBERIDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBERSQUARE HGSQUARE " + - "ERGSQUARE EVLIMITED LIABILITY SIGNCIRCLED KATAKANA ACIRCLED KATAKANA ICI" + - "RCLED KATAKANA UCIRCLED KATAKANA ECIRCLED KATAKANA OCIRCLED KATAKANA KAC" + - "IRCLED KATAKANA KICIRCLED KATAKANA KUCIRCLED KATAKANA KECIRCLED KATAKANA" + - " KOCIRCLED KATAKANA SACIRCLED KATAKANA SICIRCLED KATAKANA SUCIRCLED KATA" + - "KANA SECIRCLED KATAKANA SOCIRCLED KATAKANA TACIRCLED KATAKANA TICIRCLED " + - "KATAKANA TUCIRCLED KATAKANA TECIRCLED KATAKANA TOCIRCLED KATAKANA NACIRC" + - "LED KATAKANA NICIRCLED KATAKANA NUCIRCLED KATAKANA NECIRCLED KATAKANA NO" + - "CIRCLED KATAKANA HACIRCLED KATAKANA HICIRCLED KATAKANA HUCIRCLED KATAKAN" + - "A HECIRCLED KATAKANA HOCIRCLED KATAKANA MACIRCLED KATAKANA MICIRCLED KAT" + - "AKANA MUCIRCLED KATAKANA MECIRCLED KATAKANA MOCIRCLED KATAKANA YACIRCLED" + - " KATAKANA YUCIRCLED KATAKANA YOCIRCLED KATAKANA RACIRCLED KATAKANA RICIR" + - "CLED KATAKANA RUCIRCLED KATAKANA RECIRCLED KATAKANA ROCIRCLED KATAKANA W" + - "ACIRCLED KATAKANA WICIRCLED KATAKANA WECIRCLED KATAKANA WOSQUARE APAATOS" + - "QUARE ARUHUASQUARE ANPEASQUARE AARUSQUARE ININGUSQUARE INTISQUARE UONSQU" + - "ARE ESUKUUDOSQUARE EEKAASQUARE ONSUSQUARE OOMUSQUARE KAIRISQUARE KARATTO" + - "SQUARE KARORIISQUARE GARONSQUARE GANMASQUARE GIGASQUARE GINIISQUARE KYUR" + - "IISQUARE GIRUDAASQUARE KIROSQUARE KIROGURAMUSQUARE KIROMEETORUSQUARE KIR" + - "OWATTOSQUARE GURAMUSQUARE GURAMUTONSQUARE KURUZEIROSQUARE KUROONESQUARE " + - "KEESUSQUARE KORUNASQUARE KOOPOSQUARE SAIKURUSQUARE SANTIIMUSQUARE SIRING" + - "USQUARE SENTISQUARE SENTOSQUARE DAASUSQUARE DESISQUARE DORUSQUARE TONSQU" + - "ARE NANOSQUARE NOTTOSQUARE HAITUSQUARE PAASENTOSQUARE PAATUSQUARE BAARER" + - "USQUARE PIASUTORUSQUARE PIKURUSQUARE PIKOSQUARE BIRUSQUARE HUARADDOSQUAR" + - "E HUIITOSQUARE BUSSYERUSQUARE HURANSQUARE HEKUTAARUSQUARE PESOSQUARE PEN" + - "IHISQUARE HERUTUSQUARE PENSUSQUARE PEEZISQUARE BEETASQUARE POINTOSQUARE " + - "BORUTOSQUARE HONSQUARE PONDOSQUARE HOORUSQUARE HOONSQUARE MAIKUROSQUARE " + - "MAIRUSQUARE MAHHASQUARE MARUKUSQUARE MANSYONSQUARE MIKURONSQUARE MIRISQU" + - "ARE MIRIBAARUSQUARE MEGASQUARE MEGATONSQUARE MEETORUSQUARE YAADOSQUARE Y" + - "AARUSQUARE YUANSQUARE RITTORUSQUARE RIRASQUARE RUPIISQUARE RUUBURUSQUARE" + - " REMUSQUARE RENTOGENSQUARE WATTOIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZE" + - "ROIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONEIDEOGRAPHIC TELEGRAPH SYMBOL " + - "FOR HOUR TWOIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREEIDEOGRAPHIC TELEG" + - "RAPH SYMBOL FOR HOUR FOURIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVEIDEOG" + - "RAPHIC TELEGRAPH SYMBOL FOR HOUR SIXIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOU" + - "R SEVENIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTIDEOGRAPHIC TELEGRAPH " + - "SYMBOL FOR HOUR NINEIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TENIDEOGRAPHIC" + - " TELEGRAPH SYMBOL FOR HOUR ELEVENIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR T" + - "WELVEIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEENIDEOGRAPHIC TELEGRAPH" + - " SYMBOL FOR HOUR FOURTEENIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEENID" + - "EOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEENIDEOGRAPHIC TELEGRAPH SYMBOL " + - "FOR HOUR SEVENTEENIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEENIDEOGRAP" + - "HIC TELEGRAPH SYMBOL FOR HOUR NINETEENIDEOGRAPHIC TELEGRAPH SYMBOL FOR H" + - "OUR TWENTYIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONEIDEOGRAPHIC TE" + - "LEGRAPH SYMBOL FOR HOUR TWENTY-TWOIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR " + - "TWENTY-THREEIDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOURSQUARE HPAS" + - "QUARE DASQUARE AUSQUARE BARSQUARE OVSQUARE PCSQUARE DMSQUARE DM SQUAREDS" + - "QUARE DM CUBEDSQUARE IUSQUARE ERA NAME HEISEISQUARE ERA NAME SYOUWASQUAR" + - "E ERA NAME TAISYOUSQUARE ERA NAME MEIZISQUARE CORPORATIONSQUARE PA AMPSS" + - "QUARE NASQUARE MU ASQUARE MASQUARE KASQUARE KBSQUARE MBSQUARE GBSQUARE C" + - "ALSQUARE KCALSQUARE PFSQUARE NFSQUARE MU FSQUARE MU GSQUARE MGSQUARE KGS" + - "QUARE HZSQUARE KHZSQUARE MHZSQUARE GHZSQUARE THZSQUARE MU LSQUARE MLSQUA" + - "RE DLSQUARE KLSQUARE FMSQUARE NMSQUARE MU MSQUARE MMSQUARE CMSQUARE KMSQ" + - "UARE MM SQUAREDSQUARE CM SQUAREDSQUARE M SQUAREDSQUARE KM SQUAREDSQUARE " + - "MM CUBEDSQUARE CM CUBEDSQUARE M CUBEDSQUARE KM CUBEDSQUARE M OVER SSQUAR" + - "E M OVER S SQUAREDSQUARE PASQUARE KPASQUARE MPASQUARE GPASQUARE RADSQUAR" + - "E RAD OVER SSQUARE RAD OVER S SQUAREDSQUARE PSSQUARE NSSQUARE MU SSQUARE" + - " MSSQUARE PVSQUARE NVSQUARE MU VSQUARE MVSQUARE KVSQUARE MV MEGASQUARE P" + - "WSQUARE NWSQUARE MU WSQUARE MWSQUARE KWSQUARE MW MEGASQUARE K OHMSQUARE " + - "M OHMSQUARE AMSQUARE BQSQUARE CCSQUARE CDSQUARE C OVER KGSQUARE COSQUARE" + - " DBSQUARE GYSQUARE HASQUARE HPSQUARE INSQUARE KKSQUARE KM CAPITALSQUARE " + - "KTSQUARE LMSQUARE LNSQUARE LOGSQUARE LXSQUARE MB SMALLSQUARE MILSQUARE M" + - "OLSQUARE PHSQUARE PMSQUARE PPMSQUARE PRSQUARE SRSQUARE SVSQUARE WBSQUARE") + ("" + - " V OVER MSQUARE A OVER MIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONEIDEOGRAP" + - "HIC TELEGRAPH SYMBOL FOR DAY TWOIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THR" + - "EEIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURIDEOGRAPHIC TELEGRAPH SYMBOL " + - "FOR DAY FIVEIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXIDEOGRAPHIC TELEGRAP" + - "H SYMBOL FOR DAY SEVENIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTIDEOGRAP" + - "HIC TELEGRAPH SYMBOL FOR DAY NINEIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TE" + - "NIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVENIDEOGRAPHIC TELEGRAPH SYMBOL" + - " FOR DAY TWELVEIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEENIDEOGRAPHIC " + - "TELEGRAPH SYMBOL FOR DAY FOURTEENIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FI" + - "FTEENIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEENIDEOGRAPHIC TELEGRAPH S" + - "YMBOL FOR DAY SEVENTEENIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEENIDEO" + - "GRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEENIDEOGRAPHIC TELEGRAPH SYMBOL FO" + - "R DAY TWENTYIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONEIDEOGRAPHIC T" + - "ELEGRAPH SYMBOL FOR DAY TWENTY-TWOIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY T" + - "WENTY-THREEIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOURIDEOGRAPHIC T" + - "ELEGRAPH SYMBOL FOR DAY TWENTY-FIVEIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY " + - "TWENTY-SIXIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVENIDEOGRAPHIC T" + - "ELEGRAPH SYMBOL FOR DAY TWENTY-EIGHTIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY" + - " TWENTY-NINEIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTYIDEOGRAPHIC TELEG" + - "RAPH SYMBOL FOR DAY THIRTY-ONESQUARE GALHEXAGRAM FOR THE CREATIVE HEAVEN" + - "HEXAGRAM FOR THE RECEPTIVE EARTHHEXAGRAM FOR DIFFICULTY AT THE BEGINNING" + - "HEXAGRAM FOR YOUTHFUL FOLLYHEXAGRAM FOR WAITINGHEXAGRAM FOR CONFLICTHEXA" + - "GRAM FOR THE ARMYHEXAGRAM FOR HOLDING TOGETHERHEXAGRAM FOR SMALL TAMINGH" + - "EXAGRAM FOR TREADINGHEXAGRAM FOR PEACEHEXAGRAM FOR STANDSTILLHEXAGRAM FO" + - "R FELLOWSHIPHEXAGRAM FOR GREAT POSSESSIONHEXAGRAM FOR MODESTYHEXAGRAM FO" + - "R ENTHUSIASMHEXAGRAM FOR FOLLOWINGHEXAGRAM FOR WORK ON THE DECAYEDHEXAGR" + - "AM FOR APPROACHHEXAGRAM FOR CONTEMPLATIONHEXAGRAM FOR BITING THROUGHHEXA" + - "GRAM FOR GRACEHEXAGRAM FOR SPLITTING APARTHEXAGRAM FOR RETURNHEXAGRAM FO" + - "R INNOCENCEHEXAGRAM FOR GREAT TAMINGHEXAGRAM FOR MOUTH CORNERSHEXAGRAM F" + - "OR GREAT PREPONDERANCEHEXAGRAM FOR THE ABYSMAL WATERHEXAGRAM FOR THE CLI" + - "NGING FIREHEXAGRAM FOR INFLUENCEHEXAGRAM FOR DURATIONHEXAGRAM FOR RETREA" + - "THEXAGRAM FOR GREAT POWERHEXAGRAM FOR PROGRESSHEXAGRAM FOR DARKENING OF " + - "THE LIGHTHEXAGRAM FOR THE FAMILYHEXAGRAM FOR OPPOSITIONHEXAGRAM FOR OBST" + - "RUCTIONHEXAGRAM FOR DELIVERANCEHEXAGRAM FOR DECREASEHEXAGRAM FOR INCREAS" + - "EHEXAGRAM FOR BREAKTHROUGHHEXAGRAM FOR COMING TO MEETHEXAGRAM FOR GATHER" + - "ING TOGETHERHEXAGRAM FOR PUSHING UPWARDHEXAGRAM FOR OPPRESSIONHEXAGRAM F" + - "OR THE WELLHEXAGRAM FOR REVOLUTIONHEXAGRAM FOR THE CAULDRONHEXAGRAM FOR " + - "THE AROUSING THUNDERHEXAGRAM FOR THE KEEPING STILL MOUNTAINHEXAGRAM FOR " + - "DEVELOPMENTHEXAGRAM FOR THE MARRYING MAIDENHEXAGRAM FOR ABUNDANCEHEXAGRA" + - "M FOR THE WANDERERHEXAGRAM FOR THE GENTLE WINDHEXAGRAM FOR THE JOYOUS LA" + - "KEHEXAGRAM FOR DISPERSIONHEXAGRAM FOR LIMITATIONHEXAGRAM FOR INNER TRUTH" + - "HEXAGRAM FOR SMALL PREPONDERANCEHEXAGRAM FOR AFTER COMPLETIONHEXAGRAM FO" + - "R BEFORE COMPLETIONYI SYLLABLE ITYI SYLLABLE IXYI SYLLABLE IYI SYLLABLE " + - "IPYI SYLLABLE IETYI SYLLABLE IEXYI SYLLABLE IEYI SYLLABLE IEPYI SYLLABLE" + - " ATYI SYLLABLE AXYI SYLLABLE AYI SYLLABLE APYI SYLLABLE UOXYI SYLLABLE U" + - "OYI SYLLABLE UOPYI SYLLABLE OTYI SYLLABLE OXYI SYLLABLE OYI SYLLABLE OPY" + - "I SYLLABLE EXYI SYLLABLE EYI SYLLABLE WUYI SYLLABLE BITYI SYLLABLE BIXYI" + - " SYLLABLE BIYI SYLLABLE BIPYI SYLLABLE BIETYI SYLLABLE BIEXYI SYLLABLE B" + - "IEYI SYLLABLE BIEPYI SYLLABLE BATYI SYLLABLE BAXYI SYLLABLE BAYI SYLLABL" + - "E BAPYI SYLLABLE BUOXYI SYLLABLE BUOYI SYLLABLE BUOPYI SYLLABLE BOTYI SY" + - "LLABLE BOXYI SYLLABLE BOYI SYLLABLE BOPYI SYLLABLE BEXYI SYLLABLE BEYI S" + - "YLLABLE BEPYI SYLLABLE BUTYI SYLLABLE BUXYI SYLLABLE BUYI SYLLABLE BUPYI" + - " SYLLABLE BURXYI SYLLABLE BURYI SYLLABLE BYTYI SYLLABLE BYXYI SYLLABLE B" + - "YYI SYLLABLE BYPYI SYLLABLE BYRXYI SYLLABLE BYRYI SYLLABLE PITYI SYLLABL" + - "E PIXYI SYLLABLE PIYI SYLLABLE PIPYI SYLLABLE PIEXYI SYLLABLE PIEYI SYLL" + - "ABLE PIEPYI SYLLABLE PATYI SYLLABLE PAXYI SYLLABLE PAYI SYLLABLE PAPYI S" + - "YLLABLE PUOXYI SYLLABLE PUOYI SYLLABLE PUOPYI SYLLABLE POTYI SYLLABLE PO" + - "XYI SYLLABLE POYI SYLLABLE POPYI SYLLABLE PUTYI SYLLABLE PUXYI SYLLABLE " + - "PUYI SYLLABLE PUPYI SYLLABLE PURXYI SYLLABLE PURYI SYLLABLE PYTYI SYLLAB" + - "LE PYXYI SYLLABLE PYYI SYLLABLE PYPYI SYLLABLE PYRXYI SYLLABLE PYRYI SYL" + - "LABLE BBITYI SYLLABLE BBIXYI SYLLABLE BBIYI SYLLABLE BBIPYI SYLLABLE BBI" + - "ETYI SYLLABLE BBIEXYI SYLLABLE BBIEYI SYLLABLE BBIEPYI SYLLABLE BBATYI S" + - "YLLABLE BBAXYI SYLLABLE BBAYI SYLLABLE BBAPYI SYLLABLE BBUOXYI SYLLABLE " + - "BBUOYI SYLLABLE BBUOPYI SYLLABLE BBOTYI SYLLABLE BBOXYI SYLLABLE BBOYI S") + ("" + - "YLLABLE BBOPYI SYLLABLE BBEXYI SYLLABLE BBEYI SYLLABLE BBEPYI SYLLABLE B" + - "BUTYI SYLLABLE BBUXYI SYLLABLE BBUYI SYLLABLE BBUPYI SYLLABLE BBURXYI SY" + - "LLABLE BBURYI SYLLABLE BBYTYI SYLLABLE BBYXYI SYLLABLE BBYYI SYLLABLE BB" + - "YPYI SYLLABLE NBITYI SYLLABLE NBIXYI SYLLABLE NBIYI SYLLABLE NBIPYI SYLL" + - "ABLE NBIEXYI SYLLABLE NBIEYI SYLLABLE NBIEPYI SYLLABLE NBATYI SYLLABLE N" + - "BAXYI SYLLABLE NBAYI SYLLABLE NBAPYI SYLLABLE NBOTYI SYLLABLE NBOXYI SYL" + - "LABLE NBOYI SYLLABLE NBOPYI SYLLABLE NBUTYI SYLLABLE NBUXYI SYLLABLE NBU" + - "YI SYLLABLE NBUPYI SYLLABLE NBURXYI SYLLABLE NBURYI SYLLABLE NBYTYI SYLL" + - "ABLE NBYXYI SYLLABLE NBYYI SYLLABLE NBYPYI SYLLABLE NBYRXYI SYLLABLE NBY" + - "RYI SYLLABLE HMITYI SYLLABLE HMIXYI SYLLABLE HMIYI SYLLABLE HMIPYI SYLLA" + - "BLE HMIEXYI SYLLABLE HMIEYI SYLLABLE HMIEPYI SYLLABLE HMATYI SYLLABLE HM" + - "AXYI SYLLABLE HMAYI SYLLABLE HMAPYI SYLLABLE HMUOXYI SYLLABLE HMUOYI SYL" + - "LABLE HMUOPYI SYLLABLE HMOTYI SYLLABLE HMOXYI SYLLABLE HMOYI SYLLABLE HM" + - "OPYI SYLLABLE HMUTYI SYLLABLE HMUXYI SYLLABLE HMUYI SYLLABLE HMUPYI SYLL" + - "ABLE HMURXYI SYLLABLE HMURYI SYLLABLE HMYXYI SYLLABLE HMYYI SYLLABLE HMY" + - "PYI SYLLABLE HMYRXYI SYLLABLE HMYRYI SYLLABLE MITYI SYLLABLE MIXYI SYLLA" + - "BLE MIYI SYLLABLE MIPYI SYLLABLE MIEXYI SYLLABLE MIEYI SYLLABLE MIEPYI S" + - "YLLABLE MATYI SYLLABLE MAXYI SYLLABLE MAYI SYLLABLE MAPYI SYLLABLE MUOTY" + - "I SYLLABLE MUOXYI SYLLABLE MUOYI SYLLABLE MUOPYI SYLLABLE MOTYI SYLLABLE" + - " MOXYI SYLLABLE MOYI SYLLABLE MOPYI SYLLABLE MEXYI SYLLABLE MEYI SYLLABL" + - "E MUTYI SYLLABLE MUXYI SYLLABLE MUYI SYLLABLE MUPYI SYLLABLE MURXYI SYLL" + - "ABLE MURYI SYLLABLE MYTYI SYLLABLE MYXYI SYLLABLE MYYI SYLLABLE MYPYI SY" + - "LLABLE FITYI SYLLABLE FIXYI SYLLABLE FIYI SYLLABLE FIPYI SYLLABLE FATYI " + - "SYLLABLE FAXYI SYLLABLE FAYI SYLLABLE FAPYI SYLLABLE FOXYI SYLLABLE FOYI" + - " SYLLABLE FOPYI SYLLABLE FUTYI SYLLABLE FUXYI SYLLABLE FUYI SYLLABLE FUP" + - "YI SYLLABLE FURXYI SYLLABLE FURYI SYLLABLE FYTYI SYLLABLE FYXYI SYLLABLE" + - " FYYI SYLLABLE FYPYI SYLLABLE VITYI SYLLABLE VIXYI SYLLABLE VIYI SYLLABL" + - "E VIPYI SYLLABLE VIETYI SYLLABLE VIEXYI SYLLABLE VIEYI SYLLABLE VIEPYI S" + - "YLLABLE VATYI SYLLABLE VAXYI SYLLABLE VAYI SYLLABLE VAPYI SYLLABLE VOTYI" + - " SYLLABLE VOXYI SYLLABLE VOYI SYLLABLE VOPYI SYLLABLE VEXYI SYLLABLE VEP" + - "YI SYLLABLE VUTYI SYLLABLE VUXYI SYLLABLE VUYI SYLLABLE VUPYI SYLLABLE V" + - "URXYI SYLLABLE VURYI SYLLABLE VYTYI SYLLABLE VYXYI SYLLABLE VYYI SYLLABL" + - "E VYPYI SYLLABLE VYRXYI SYLLABLE VYRYI SYLLABLE DITYI SYLLABLE DIXYI SYL" + - "LABLE DIYI SYLLABLE DIPYI SYLLABLE DIEXYI SYLLABLE DIEYI SYLLABLE DIEPYI" + - " SYLLABLE DATYI SYLLABLE DAXYI SYLLABLE DAYI SYLLABLE DAPYI SYLLABLE DUO" + - "XYI SYLLABLE DUOYI SYLLABLE DOTYI SYLLABLE DOXYI SYLLABLE DOYI SYLLABLE " + - "DOPYI SYLLABLE DEXYI SYLLABLE DEYI SYLLABLE DEPYI SYLLABLE DUTYI SYLLABL" + - "E DUXYI SYLLABLE DUYI SYLLABLE DUPYI SYLLABLE DURXYI SYLLABLE DURYI SYLL" + - "ABLE TITYI SYLLABLE TIXYI SYLLABLE TIYI SYLLABLE TIPYI SYLLABLE TIEXYI S" + - "YLLABLE TIEYI SYLLABLE TIEPYI SYLLABLE TATYI SYLLABLE TAXYI SYLLABLE TAY" + - "I SYLLABLE TAPYI SYLLABLE TUOTYI SYLLABLE TUOXYI SYLLABLE TUOYI SYLLABLE" + - " TUOPYI SYLLABLE TOTYI SYLLABLE TOXYI SYLLABLE TOYI SYLLABLE TOPYI SYLLA" + - "BLE TEXYI SYLLABLE TEYI SYLLABLE TEPYI SYLLABLE TUTYI SYLLABLE TUXYI SYL" + - "LABLE TUYI SYLLABLE TUPYI SYLLABLE TURXYI SYLLABLE TURYI SYLLABLE DDITYI" + - " SYLLABLE DDIXYI SYLLABLE DDIYI SYLLABLE DDIPYI SYLLABLE DDIEXYI SYLLABL" + - "E DDIEYI SYLLABLE DDIEPYI SYLLABLE DDATYI SYLLABLE DDAXYI SYLLABLE DDAYI" + - " SYLLABLE DDAPYI SYLLABLE DDUOXYI SYLLABLE DDUOYI SYLLABLE DDUOPYI SYLLA" + - "BLE DDOTYI SYLLABLE DDOXYI SYLLABLE DDOYI SYLLABLE DDOPYI SYLLABLE DDEXY" + - "I SYLLABLE DDEYI SYLLABLE DDEPYI SYLLABLE DDUTYI SYLLABLE DDUXYI SYLLABL" + - "E DDUYI SYLLABLE DDUPYI SYLLABLE DDURXYI SYLLABLE DDURYI SYLLABLE NDITYI" + - " SYLLABLE NDIXYI SYLLABLE NDIYI SYLLABLE NDIPYI SYLLABLE NDIEXYI SYLLABL" + - "E NDIEYI SYLLABLE NDATYI SYLLABLE NDAXYI SYLLABLE NDAYI SYLLABLE NDAPYI " + - "SYLLABLE NDOTYI SYLLABLE NDOXYI SYLLABLE NDOYI SYLLABLE NDOPYI SYLLABLE " + - "NDEXYI SYLLABLE NDEYI SYLLABLE NDEPYI SYLLABLE NDUTYI SYLLABLE NDUXYI SY" + - "LLABLE NDUYI SYLLABLE NDUPYI SYLLABLE NDURXYI SYLLABLE NDURYI SYLLABLE H" + - "NITYI SYLLABLE HNIXYI SYLLABLE HNIYI SYLLABLE HNIPYI SYLLABLE HNIETYI SY" + - "LLABLE HNIEXYI SYLLABLE HNIEYI SYLLABLE HNIEPYI SYLLABLE HNATYI SYLLABLE" + - " HNAXYI SYLLABLE HNAYI SYLLABLE HNAPYI SYLLABLE HNUOXYI SYLLABLE HNUOYI " + - "SYLLABLE HNOTYI SYLLABLE HNOXYI SYLLABLE HNOPYI SYLLABLE HNEXYI SYLLABLE" + - " HNEYI SYLLABLE HNEPYI SYLLABLE HNUTYI SYLLABLE NITYI SYLLABLE NIXYI SYL" + - "LABLE NIYI SYLLABLE NIPYI SYLLABLE NIEXYI SYLLABLE NIEYI SYLLABLE NIEPYI" + - " SYLLABLE NAXYI SYLLABLE NAYI SYLLABLE NAPYI SYLLABLE NUOXYI SYLLABLE NU" + - "OYI SYLLABLE NUOPYI SYLLABLE NOTYI SYLLABLE NOXYI SYLLABLE NOYI SYLLABLE" + - " NOPYI SYLLABLE NEXYI SYLLABLE NEYI SYLLABLE NEPYI SYLLABLE NUTYI SYLLAB") + ("" + - "LE NUXYI SYLLABLE NUYI SYLLABLE NUPYI SYLLABLE NURXYI SYLLABLE NURYI SYL" + - "LABLE HLITYI SYLLABLE HLIXYI SYLLABLE HLIYI SYLLABLE HLIPYI SYLLABLE HLI" + - "EXYI SYLLABLE HLIEYI SYLLABLE HLIEPYI SYLLABLE HLATYI SYLLABLE HLAXYI SY" + - "LLABLE HLAYI SYLLABLE HLAPYI SYLLABLE HLUOXYI SYLLABLE HLUOYI SYLLABLE H" + - "LUOPYI SYLLABLE HLOXYI SYLLABLE HLOYI SYLLABLE HLOPYI SYLLABLE HLEXYI SY" + - "LLABLE HLEYI SYLLABLE HLEPYI SYLLABLE HLUTYI SYLLABLE HLUXYI SYLLABLE HL" + - "UYI SYLLABLE HLUPYI SYLLABLE HLURXYI SYLLABLE HLURYI SYLLABLE HLYTYI SYL" + - "LABLE HLYXYI SYLLABLE HLYYI SYLLABLE HLYPYI SYLLABLE HLYRXYI SYLLABLE HL" + - "YRYI SYLLABLE LITYI SYLLABLE LIXYI SYLLABLE LIYI SYLLABLE LIPYI SYLLABLE" + - " LIETYI SYLLABLE LIEXYI SYLLABLE LIEYI SYLLABLE LIEPYI SYLLABLE LATYI SY" + - "LLABLE LAXYI SYLLABLE LAYI SYLLABLE LAPYI SYLLABLE LUOTYI SYLLABLE LUOXY" + - "I SYLLABLE LUOYI SYLLABLE LUOPYI SYLLABLE LOTYI SYLLABLE LOXYI SYLLABLE " + - "LOYI SYLLABLE LOPYI SYLLABLE LEXYI SYLLABLE LEYI SYLLABLE LEPYI SYLLABLE" + - " LUTYI SYLLABLE LUXYI SYLLABLE LUYI SYLLABLE LUPYI SYLLABLE LURXYI SYLLA" + - "BLE LURYI SYLLABLE LYTYI SYLLABLE LYXYI SYLLABLE LYYI SYLLABLE LYPYI SYL" + - "LABLE LYRXYI SYLLABLE LYRYI SYLLABLE GITYI SYLLABLE GIXYI SYLLABLE GIYI " + - "SYLLABLE GIPYI SYLLABLE GIETYI SYLLABLE GIEXYI SYLLABLE GIEYI SYLLABLE G" + - "IEPYI SYLLABLE GATYI SYLLABLE GAXYI SYLLABLE GAYI SYLLABLE GAPYI SYLLABL" + - "E GUOTYI SYLLABLE GUOXYI SYLLABLE GUOYI SYLLABLE GUOPYI SYLLABLE GOTYI S" + - "YLLABLE GOXYI SYLLABLE GOYI SYLLABLE GOPYI SYLLABLE GETYI SYLLABLE GEXYI" + - " SYLLABLE GEYI SYLLABLE GEPYI SYLLABLE GUTYI SYLLABLE GUXYI SYLLABLE GUY" + - "I SYLLABLE GUPYI SYLLABLE GURXYI SYLLABLE GURYI SYLLABLE KITYI SYLLABLE " + - "KIXYI SYLLABLE KIYI SYLLABLE KIPYI SYLLABLE KIEXYI SYLLABLE KIEYI SYLLAB" + - "LE KIEPYI SYLLABLE KATYI SYLLABLE KAXYI SYLLABLE KAYI SYLLABLE KAPYI SYL" + - "LABLE KUOXYI SYLLABLE KUOYI SYLLABLE KUOPYI SYLLABLE KOTYI SYLLABLE KOXY" + - "I SYLLABLE KOYI SYLLABLE KOPYI SYLLABLE KETYI SYLLABLE KEXYI SYLLABLE KE" + - "YI SYLLABLE KEPYI SYLLABLE KUTYI SYLLABLE KUXYI SYLLABLE KUYI SYLLABLE K" + - "UPYI SYLLABLE KURXYI SYLLABLE KURYI SYLLABLE GGITYI SYLLABLE GGIXYI SYLL" + - "ABLE GGIYI SYLLABLE GGIEXYI SYLLABLE GGIEYI SYLLABLE GGIEPYI SYLLABLE GG" + - "ATYI SYLLABLE GGAXYI SYLLABLE GGAYI SYLLABLE GGAPYI SYLLABLE GGUOTYI SYL" + - "LABLE GGUOXYI SYLLABLE GGUOYI SYLLABLE GGUOPYI SYLLABLE GGOTYI SYLLABLE " + - "GGOXYI SYLLABLE GGOYI SYLLABLE GGOPYI SYLLABLE GGETYI SYLLABLE GGEXYI SY" + - "LLABLE GGEYI SYLLABLE GGEPYI SYLLABLE GGUTYI SYLLABLE GGUXYI SYLLABLE GG" + - "UYI SYLLABLE GGUPYI SYLLABLE GGURXYI SYLLABLE GGURYI SYLLABLE MGIEXYI SY" + - "LLABLE MGIEYI SYLLABLE MGATYI SYLLABLE MGAXYI SYLLABLE MGAYI SYLLABLE MG" + - "APYI SYLLABLE MGUOXYI SYLLABLE MGUOYI SYLLABLE MGUOPYI SYLLABLE MGOTYI S" + - "YLLABLE MGOXYI SYLLABLE MGOYI SYLLABLE MGOPYI SYLLABLE MGEXYI SYLLABLE M" + - "GEYI SYLLABLE MGEPYI SYLLABLE MGUTYI SYLLABLE MGUXYI SYLLABLE MGUYI SYLL" + - "ABLE MGUPYI SYLLABLE MGURXYI SYLLABLE MGURYI SYLLABLE HXITYI SYLLABLE HX" + - "IXYI SYLLABLE HXIYI SYLLABLE HXIPYI SYLLABLE HXIETYI SYLLABLE HXIEXYI SY" + - "LLABLE HXIEYI SYLLABLE HXIEPYI SYLLABLE HXATYI SYLLABLE HXAXYI SYLLABLE " + - "HXAYI SYLLABLE HXAPYI SYLLABLE HXUOTYI SYLLABLE HXUOXYI SYLLABLE HXUOYI " + - "SYLLABLE HXUOPYI SYLLABLE HXOTYI SYLLABLE HXOXYI SYLLABLE HXOYI SYLLABLE" + - " HXOPYI SYLLABLE HXEXYI SYLLABLE HXEYI SYLLABLE HXEPYI SYLLABLE NGIEXYI " + - "SYLLABLE NGIEYI SYLLABLE NGIEPYI SYLLABLE NGATYI SYLLABLE NGAXYI SYLLABL" + - "E NGAYI SYLLABLE NGAPYI SYLLABLE NGUOTYI SYLLABLE NGUOXYI SYLLABLE NGUOY" + - "I SYLLABLE NGOTYI SYLLABLE NGOXYI SYLLABLE NGOYI SYLLABLE NGOPYI SYLLABL" + - "E NGEXYI SYLLABLE NGEYI SYLLABLE NGEPYI SYLLABLE HITYI SYLLABLE HIEXYI S" + - "YLLABLE HIEYI SYLLABLE HATYI SYLLABLE HAXYI SYLLABLE HAYI SYLLABLE HAPYI" + - " SYLLABLE HUOTYI SYLLABLE HUOXYI SYLLABLE HUOYI SYLLABLE HUOPYI SYLLABLE" + - " HOTYI SYLLABLE HOXYI SYLLABLE HOYI SYLLABLE HOPYI SYLLABLE HEXYI SYLLAB" + - "LE HEYI SYLLABLE HEPYI SYLLABLE WATYI SYLLABLE WAXYI SYLLABLE WAYI SYLLA" + - "BLE WAPYI SYLLABLE WUOXYI SYLLABLE WUOYI SYLLABLE WUOPYI SYLLABLE WOXYI " + - "SYLLABLE WOYI SYLLABLE WOPYI SYLLABLE WEXYI SYLLABLE WEYI SYLLABLE WEPYI" + - " SYLLABLE ZITYI SYLLABLE ZIXYI SYLLABLE ZIYI SYLLABLE ZIPYI SYLLABLE ZIE" + - "XYI SYLLABLE ZIEYI SYLLABLE ZIEPYI SYLLABLE ZATYI SYLLABLE ZAXYI SYLLABL" + - "E ZAYI SYLLABLE ZAPYI SYLLABLE ZUOXYI SYLLABLE ZUOYI SYLLABLE ZUOPYI SYL" + - "LABLE ZOTYI SYLLABLE ZOXYI SYLLABLE ZOYI SYLLABLE ZOPYI SYLLABLE ZEXYI S" + - "YLLABLE ZEYI SYLLABLE ZEPYI SYLLABLE ZUTYI SYLLABLE ZUXYI SYLLABLE ZUYI " + - "SYLLABLE ZUPYI SYLLABLE ZURXYI SYLLABLE ZURYI SYLLABLE ZYTYI SYLLABLE ZY" + - "XYI SYLLABLE ZYYI SYLLABLE ZYPYI SYLLABLE ZYRXYI SYLLABLE ZYRYI SYLLABLE" + - " CITYI SYLLABLE CIXYI SYLLABLE CIYI SYLLABLE CIPYI SYLLABLE CIETYI SYLLA" + - "BLE CIEXYI SYLLABLE CIEYI SYLLABLE CIEPYI SYLLABLE CATYI SYLLABLE CAXYI " + - "SYLLABLE CAYI SYLLABLE CAPYI SYLLABLE CUOXYI SYLLABLE CUOYI SYLLABLE CUO") + ("" + - "PYI SYLLABLE COTYI SYLLABLE COXYI SYLLABLE COYI SYLLABLE COPYI SYLLABLE " + - "CEXYI SYLLABLE CEYI SYLLABLE CEPYI SYLLABLE CUTYI SYLLABLE CUXYI SYLLABL" + - "E CUYI SYLLABLE CUPYI SYLLABLE CURXYI SYLLABLE CURYI SYLLABLE CYTYI SYLL" + - "ABLE CYXYI SYLLABLE CYYI SYLLABLE CYPYI SYLLABLE CYRXYI SYLLABLE CYRYI S" + - "YLLABLE ZZITYI SYLLABLE ZZIXYI SYLLABLE ZZIYI SYLLABLE ZZIPYI SYLLABLE Z" + - "ZIETYI SYLLABLE ZZIEXYI SYLLABLE ZZIEYI SYLLABLE ZZIEPYI SYLLABLE ZZATYI" + - " SYLLABLE ZZAXYI SYLLABLE ZZAYI SYLLABLE ZZAPYI SYLLABLE ZZOXYI SYLLABLE" + - " ZZOYI SYLLABLE ZZOPYI SYLLABLE ZZEXYI SYLLABLE ZZEYI SYLLABLE ZZEPYI SY" + - "LLABLE ZZUXYI SYLLABLE ZZUYI SYLLABLE ZZUPYI SYLLABLE ZZURXYI SYLLABLE Z" + - "ZURYI SYLLABLE ZZYTYI SYLLABLE ZZYXYI SYLLABLE ZZYYI SYLLABLE ZZYPYI SYL" + - "LABLE ZZYRXYI SYLLABLE ZZYRYI SYLLABLE NZITYI SYLLABLE NZIXYI SYLLABLE N" + - "ZIYI SYLLABLE NZIPYI SYLLABLE NZIEXYI SYLLABLE NZIEYI SYLLABLE NZIEPYI S" + - "YLLABLE NZATYI SYLLABLE NZAXYI SYLLABLE NZAYI SYLLABLE NZAPYI SYLLABLE N" + - "ZUOXYI SYLLABLE NZUOYI SYLLABLE NZOXYI SYLLABLE NZOPYI SYLLABLE NZEXYI S" + - "YLLABLE NZEYI SYLLABLE NZUXYI SYLLABLE NZUYI SYLLABLE NZUPYI SYLLABLE NZ" + - "URXYI SYLLABLE NZURYI SYLLABLE NZYTYI SYLLABLE NZYXYI SYLLABLE NZYYI SYL" + - "LABLE NZYPYI SYLLABLE NZYRXYI SYLLABLE NZYRYI SYLLABLE SITYI SYLLABLE SI" + - "XYI SYLLABLE SIYI SYLLABLE SIPYI SYLLABLE SIEXYI SYLLABLE SIEYI SYLLABLE" + - " SIEPYI SYLLABLE SATYI SYLLABLE SAXYI SYLLABLE SAYI SYLLABLE SAPYI SYLLA" + - "BLE SUOXYI SYLLABLE SUOYI SYLLABLE SUOPYI SYLLABLE SOTYI SYLLABLE SOXYI " + - "SYLLABLE SOYI SYLLABLE SOPYI SYLLABLE SEXYI SYLLABLE SEYI SYLLABLE SEPYI" + - " SYLLABLE SUTYI SYLLABLE SUXYI SYLLABLE SUYI SYLLABLE SUPYI SYLLABLE SUR" + - "XYI SYLLABLE SURYI SYLLABLE SYTYI SYLLABLE SYXYI SYLLABLE SYYI SYLLABLE " + - "SYPYI SYLLABLE SYRXYI SYLLABLE SYRYI SYLLABLE SSITYI SYLLABLE SSIXYI SYL" + - "LABLE SSIYI SYLLABLE SSIPYI SYLLABLE SSIEXYI SYLLABLE SSIEYI SYLLABLE SS" + - "IEPYI SYLLABLE SSATYI SYLLABLE SSAXYI SYLLABLE SSAYI SYLLABLE SSAPYI SYL" + - "LABLE SSOTYI SYLLABLE SSOXYI SYLLABLE SSOYI SYLLABLE SSOPYI SYLLABLE SSE" + - "XYI SYLLABLE SSEYI SYLLABLE SSEPYI SYLLABLE SSUTYI SYLLABLE SSUXYI SYLLA" + - "BLE SSUYI SYLLABLE SSUPYI SYLLABLE SSYTYI SYLLABLE SSYXYI SYLLABLE SSYYI" + - " SYLLABLE SSYPYI SYLLABLE SSYRXYI SYLLABLE SSYRYI SYLLABLE ZHATYI SYLLAB" + - "LE ZHAXYI SYLLABLE ZHAYI SYLLABLE ZHAPYI SYLLABLE ZHUOXYI SYLLABLE ZHUOY" + - "I SYLLABLE ZHUOPYI SYLLABLE ZHOTYI SYLLABLE ZHOXYI SYLLABLE ZHOYI SYLLAB" + - "LE ZHOPYI SYLLABLE ZHETYI SYLLABLE ZHEXYI SYLLABLE ZHEYI SYLLABLE ZHEPYI" + - " SYLLABLE ZHUTYI SYLLABLE ZHUXYI SYLLABLE ZHUYI SYLLABLE ZHUPYI SYLLABLE" + - " ZHURXYI SYLLABLE ZHURYI SYLLABLE ZHYTYI SYLLABLE ZHYXYI SYLLABLE ZHYYI " + - "SYLLABLE ZHYPYI SYLLABLE ZHYRXYI SYLLABLE ZHYRYI SYLLABLE CHATYI SYLLABL" + - "E CHAXYI SYLLABLE CHAYI SYLLABLE CHAPYI SYLLABLE CHUOTYI SYLLABLE CHUOXY" + - "I SYLLABLE CHUOYI SYLLABLE CHUOPYI SYLLABLE CHOTYI SYLLABLE CHOXYI SYLLA" + - "BLE CHOYI SYLLABLE CHOPYI SYLLABLE CHETYI SYLLABLE CHEXYI SYLLABLE CHEYI" + - " SYLLABLE CHEPYI SYLLABLE CHUXYI SYLLABLE CHUYI SYLLABLE CHUPYI SYLLABLE" + - " CHURXYI SYLLABLE CHURYI SYLLABLE CHYTYI SYLLABLE CHYXYI SYLLABLE CHYYI " + - "SYLLABLE CHYPYI SYLLABLE CHYRXYI SYLLABLE CHYRYI SYLLABLE RRAXYI SYLLABL" + - "E RRAYI SYLLABLE RRUOXYI SYLLABLE RRUOYI SYLLABLE RROTYI SYLLABLE RROXYI" + - " SYLLABLE RROYI SYLLABLE RROPYI SYLLABLE RRETYI SYLLABLE RREXYI SYLLABLE" + - " RREYI SYLLABLE RREPYI SYLLABLE RRUTYI SYLLABLE RRUXYI SYLLABLE RRUYI SY" + - "LLABLE RRUPYI SYLLABLE RRURXYI SYLLABLE RRURYI SYLLABLE RRYTYI SYLLABLE " + - "RRYXYI SYLLABLE RRYYI SYLLABLE RRYPYI SYLLABLE RRYRXYI SYLLABLE RRYRYI S" + - "YLLABLE NRATYI SYLLABLE NRAXYI SYLLABLE NRAYI SYLLABLE NRAPYI SYLLABLE N" + - "ROXYI SYLLABLE NROYI SYLLABLE NROPYI SYLLABLE NRETYI SYLLABLE NREXYI SYL" + - "LABLE NREYI SYLLABLE NREPYI SYLLABLE NRUTYI SYLLABLE NRUXYI SYLLABLE NRU" + - "YI SYLLABLE NRUPYI SYLLABLE NRURXYI SYLLABLE NRURYI SYLLABLE NRYTYI SYLL" + - "ABLE NRYXYI SYLLABLE NRYYI SYLLABLE NRYPYI SYLLABLE NRYRXYI SYLLABLE NRY" + - "RYI SYLLABLE SHATYI SYLLABLE SHAXYI SYLLABLE SHAYI SYLLABLE SHAPYI SYLLA" + - "BLE SHUOXYI SYLLABLE SHUOYI SYLLABLE SHUOPYI SYLLABLE SHOTYI SYLLABLE SH" + - "OXYI SYLLABLE SHOYI SYLLABLE SHOPYI SYLLABLE SHETYI SYLLABLE SHEXYI SYLL" + - "ABLE SHEYI SYLLABLE SHEPYI SYLLABLE SHUTYI SYLLABLE SHUXYI SYLLABLE SHUY" + - "I SYLLABLE SHUPYI SYLLABLE SHURXYI SYLLABLE SHURYI SYLLABLE SHYTYI SYLLA" + - "BLE SHYXYI SYLLABLE SHYYI SYLLABLE SHYPYI SYLLABLE SHYRXYI SYLLABLE SHYR" + - "YI SYLLABLE RATYI SYLLABLE RAXYI SYLLABLE RAYI SYLLABLE RAPYI SYLLABLE R" + - "UOXYI SYLLABLE RUOYI SYLLABLE RUOPYI SYLLABLE ROTYI SYLLABLE ROXYI SYLLA" + - "BLE ROYI SYLLABLE ROPYI SYLLABLE REXYI SYLLABLE REYI SYLLABLE REPYI SYLL" + - "ABLE RUTYI SYLLABLE RUXYI SYLLABLE RUYI SYLLABLE RUPYI SYLLABLE RURXYI S" + - "YLLABLE RURYI SYLLABLE RYTYI SYLLABLE RYXYI SYLLABLE RYYI SYLLABLE RYPYI" + - " SYLLABLE RYRXYI SYLLABLE RYRYI SYLLABLE JITYI SYLLABLE JIXYI SYLLABLE J") + ("" + - "IYI SYLLABLE JIPYI SYLLABLE JIETYI SYLLABLE JIEXYI SYLLABLE JIEYI SYLLAB" + - "LE JIEPYI SYLLABLE JUOTYI SYLLABLE JUOXYI SYLLABLE JUOYI SYLLABLE JUOPYI" + - " SYLLABLE JOTYI SYLLABLE JOXYI SYLLABLE JOYI SYLLABLE JOPYI SYLLABLE JUT" + - "YI SYLLABLE JUXYI SYLLABLE JUYI SYLLABLE JUPYI SYLLABLE JURXYI SYLLABLE " + - "JURYI SYLLABLE JYTYI SYLLABLE JYXYI SYLLABLE JYYI SYLLABLE JYPYI SYLLABL" + - "E JYRXYI SYLLABLE JYRYI SYLLABLE QITYI SYLLABLE QIXYI SYLLABLE QIYI SYLL" + - "ABLE QIPYI SYLLABLE QIETYI SYLLABLE QIEXYI SYLLABLE QIEYI SYLLABLE QIEPY" + - "I SYLLABLE QUOTYI SYLLABLE QUOXYI SYLLABLE QUOYI SYLLABLE QUOPYI SYLLABL" + - "E QOTYI SYLLABLE QOXYI SYLLABLE QOYI SYLLABLE QOPYI SYLLABLE QUTYI SYLLA" + - "BLE QUXYI SYLLABLE QUYI SYLLABLE QUPYI SYLLABLE QURXYI SYLLABLE QURYI SY" + - "LLABLE QYTYI SYLLABLE QYXYI SYLLABLE QYYI SYLLABLE QYPYI SYLLABLE QYRXYI" + - " SYLLABLE QYRYI SYLLABLE JJITYI SYLLABLE JJIXYI SYLLABLE JJIYI SYLLABLE " + - "JJIPYI SYLLABLE JJIETYI SYLLABLE JJIEXYI SYLLABLE JJIEYI SYLLABLE JJIEPY" + - "I SYLLABLE JJUOXYI SYLLABLE JJUOYI SYLLABLE JJUOPYI SYLLABLE JJOTYI SYLL" + - "ABLE JJOXYI SYLLABLE JJOYI SYLLABLE JJOPYI SYLLABLE JJUTYI SYLLABLE JJUX" + - "YI SYLLABLE JJUYI SYLLABLE JJUPYI SYLLABLE JJURXYI SYLLABLE JJURYI SYLLA" + - "BLE JJYTYI SYLLABLE JJYXYI SYLLABLE JJYYI SYLLABLE JJYPYI SYLLABLE NJITY" + - "I SYLLABLE NJIXYI SYLLABLE NJIYI SYLLABLE NJIPYI SYLLABLE NJIETYI SYLLAB" + - "LE NJIEXYI SYLLABLE NJIEYI SYLLABLE NJIEPYI SYLLABLE NJUOXYI SYLLABLE NJ" + - "UOYI SYLLABLE NJOTYI SYLLABLE NJOXYI SYLLABLE NJOYI SYLLABLE NJOPYI SYLL" + - "ABLE NJUXYI SYLLABLE NJUYI SYLLABLE NJUPYI SYLLABLE NJURXYI SYLLABLE NJU" + - "RYI SYLLABLE NJYTYI SYLLABLE NJYXYI SYLLABLE NJYYI SYLLABLE NJYPYI SYLLA" + - "BLE NJYRXYI SYLLABLE NJYRYI SYLLABLE NYITYI SYLLABLE NYIXYI SYLLABLE NYI" + - "YI SYLLABLE NYIPYI SYLLABLE NYIETYI SYLLABLE NYIEXYI SYLLABLE NYIEYI SYL" + - "LABLE NYIEPYI SYLLABLE NYUOXYI SYLLABLE NYUOYI SYLLABLE NYUOPYI SYLLABLE" + - " NYOTYI SYLLABLE NYOXYI SYLLABLE NYOYI SYLLABLE NYOPYI SYLLABLE NYUTYI S" + - "YLLABLE NYUXYI SYLLABLE NYUYI SYLLABLE NYUPYI SYLLABLE XITYI SYLLABLE XI" + - "XYI SYLLABLE XIYI SYLLABLE XIPYI SYLLABLE XIETYI SYLLABLE XIEXYI SYLLABL" + - "E XIEYI SYLLABLE XIEPYI SYLLABLE XUOXYI SYLLABLE XUOYI SYLLABLE XOTYI SY" + - "LLABLE XOXYI SYLLABLE XOYI SYLLABLE XOPYI SYLLABLE XYTYI SYLLABLE XYXYI " + - "SYLLABLE XYYI SYLLABLE XYPYI SYLLABLE XYRXYI SYLLABLE XYRYI SYLLABLE YIT" + - "YI SYLLABLE YIXYI SYLLABLE YIYI SYLLABLE YIPYI SYLLABLE YIETYI SYLLABLE " + - "YIEXYI SYLLABLE YIEYI SYLLABLE YIEPYI SYLLABLE YUOTYI SYLLABLE YUOXYI SY" + - "LLABLE YUOYI SYLLABLE YUOPYI SYLLABLE YOTYI SYLLABLE YOXYI SYLLABLE YOYI" + - " SYLLABLE YOPYI SYLLABLE YUTYI SYLLABLE YUXYI SYLLABLE YUYI SYLLABLE YUP" + - "YI SYLLABLE YURXYI SYLLABLE YURYI SYLLABLE YYTYI SYLLABLE YYXYI SYLLABLE" + - " YYYI SYLLABLE YYPYI SYLLABLE YYRXYI SYLLABLE YYRYI RADICAL QOTYI RADICA" + - "L LIYI RADICAL KITYI RADICAL NYIPYI RADICAL CYPYI RADICAL SSIYI RADICAL " + - "GGOPYI RADICAL GEPYI RADICAL MIYI RADICAL HXITYI RADICAL LYRYI RADICAL B" + - "BUTYI RADICAL MOPYI RADICAL YOYI RADICAL PUTYI RADICAL HXUOYI RADICAL TA" + - "TYI RADICAL GAYI RADICAL ZUPYI RADICAL CYTYI RADICAL DDURYI RADICAL BURY" + - "I RADICAL GGUOYI RADICAL NYOPYI RADICAL TUYI RADICAL OPYI RADICAL JJUTYI" + - " RADICAL ZOTYI RADICAL PYTYI RADICAL HMOYI RADICAL YITYI RADICAL VURYI R" + - "ADICAL SHYYI RADICAL VEPYI RADICAL ZAYI RADICAL JOYI RADICAL NZUPYI RADI" + - "CAL JJYYI RADICAL GOTYI RADICAL JJIEYI RADICAL WOYI RADICAL DUYI RADICAL" + - " SHURYI RADICAL LIEYI RADICAL CYYI RADICAL CUOPYI RADICAL CIPYI RADICAL " + - "HXOPYI RADICAL SHATYI RADICAL ZURYI RADICAL SHOPYI RADICAL CHEYI RADICAL" + - " ZZIETYI RADICAL NBIEYI RADICAL KELISU LETTER BALISU LETTER PALISU LETTE" + - "R PHALISU LETTER DALISU LETTER TALISU LETTER THALISU LETTER GALISU LETTE" + - "R KALISU LETTER KHALISU LETTER JALISU LETTER CALISU LETTER CHALISU LETTE" + - "R DZALISU LETTER TSALISU LETTER TSHALISU LETTER MALISU LETTER NALISU LET" + - "TER LALISU LETTER SALISU LETTER ZHALISU LETTER ZALISU LETTER NGALISU LET" + - "TER HALISU LETTER XALISU LETTER HHALISU LETTER FALISU LETTER WALISU LETT" + - "ER SHALISU LETTER YALISU LETTER GHALISU LETTER ALISU LETTER AELISU LETTE" + - "R ELISU LETTER EULISU LETTER ILISU LETTER OLISU LETTER ULISU LETTER UELI" + - "SU LETTER UHLISU LETTER OELISU LETTER TONE MYA TILISU LETTER TONE NA POL" + - "ISU LETTER TONE MYA CYALISU LETTER TONE MYA BOLISU LETTER TONE MYA NALIS" + - "U LETTER TONE MYA JEULISU PUNCTUATION COMMALISU PUNCTUATION FULL STOPVAI" + - " SYLLABLE EEVAI SYLLABLE EENVAI SYLLABLE HEEVAI SYLLABLE WEEVAI SYLLABLE" + - " WEENVAI SYLLABLE PEEVAI SYLLABLE BHEEVAI SYLLABLE BEEVAI SYLLABLE MBEEV" + - "AI SYLLABLE KPEEVAI SYLLABLE MGBEEVAI SYLLABLE GBEEVAI SYLLABLE FEEVAI S" + - "YLLABLE VEEVAI SYLLABLE TEEVAI SYLLABLE THEEVAI SYLLABLE DHEEVAI SYLLABL" + - "E DHHEEVAI SYLLABLE LEEVAI SYLLABLE REEVAI SYLLABLE DEEVAI SYLLABLE NDEE" + - "VAI SYLLABLE SEEVAI SYLLABLE SHEEVAI SYLLABLE ZEEVAI SYLLABLE ZHEEVAI SY") + ("" + - "LLABLE CEEVAI SYLLABLE JEEVAI SYLLABLE NJEEVAI SYLLABLE YEEVAI SYLLABLE " + - "KEEVAI SYLLABLE NGGEEVAI SYLLABLE GEEVAI SYLLABLE MEEVAI SYLLABLE NEEVAI" + - " SYLLABLE NYEEVAI SYLLABLE IVAI SYLLABLE INVAI SYLLABLE HIVAI SYLLABLE H" + - "INVAI SYLLABLE WIVAI SYLLABLE WINVAI SYLLABLE PIVAI SYLLABLE BHIVAI SYLL" + - "ABLE BIVAI SYLLABLE MBIVAI SYLLABLE KPIVAI SYLLABLE MGBIVAI SYLLABLE GBI" + - "VAI SYLLABLE FIVAI SYLLABLE VIVAI SYLLABLE TIVAI SYLLABLE THIVAI SYLLABL" + - "E DHIVAI SYLLABLE DHHIVAI SYLLABLE LIVAI SYLLABLE RIVAI SYLLABLE DIVAI S" + - "YLLABLE NDIVAI SYLLABLE SIVAI SYLLABLE SHIVAI SYLLABLE ZIVAI SYLLABLE ZH" + - "IVAI SYLLABLE CIVAI SYLLABLE JIVAI SYLLABLE NJIVAI SYLLABLE YIVAI SYLLAB" + - "LE KIVAI SYLLABLE NGGIVAI SYLLABLE GIVAI SYLLABLE MIVAI SYLLABLE NIVAI S" + - "YLLABLE NYIVAI SYLLABLE AVAI SYLLABLE ANVAI SYLLABLE NGANVAI SYLLABLE HA" + - "VAI SYLLABLE HANVAI SYLLABLE WAVAI SYLLABLE WANVAI SYLLABLE PAVAI SYLLAB" + - "LE BHAVAI SYLLABLE BAVAI SYLLABLE MBAVAI SYLLABLE KPAVAI SYLLABLE KPANVA" + - "I SYLLABLE MGBAVAI SYLLABLE GBAVAI SYLLABLE FAVAI SYLLABLE VAVAI SYLLABL" + - "E TAVAI SYLLABLE THAVAI SYLLABLE DHAVAI SYLLABLE DHHAVAI SYLLABLE LAVAI " + - "SYLLABLE RAVAI SYLLABLE DAVAI SYLLABLE NDAVAI SYLLABLE SAVAI SYLLABLE SH" + - "AVAI SYLLABLE ZAVAI SYLLABLE ZHAVAI SYLLABLE CAVAI SYLLABLE JAVAI SYLLAB" + - "LE NJAVAI SYLLABLE YAVAI SYLLABLE KAVAI SYLLABLE KANVAI SYLLABLE NGGAVAI" + - " SYLLABLE GAVAI SYLLABLE MAVAI SYLLABLE NAVAI SYLLABLE NYAVAI SYLLABLE O" + - "OVAI SYLLABLE OONVAI SYLLABLE HOOVAI SYLLABLE WOOVAI SYLLABLE WOONVAI SY" + - "LLABLE POOVAI SYLLABLE BHOOVAI SYLLABLE BOOVAI SYLLABLE MBOOVAI SYLLABLE" + - " KPOOVAI SYLLABLE MGBOOVAI SYLLABLE GBOOVAI SYLLABLE FOOVAI SYLLABLE VOO" + - "VAI SYLLABLE TOOVAI SYLLABLE THOOVAI SYLLABLE DHOOVAI SYLLABLE DHHOOVAI " + - "SYLLABLE LOOVAI SYLLABLE ROOVAI SYLLABLE DOOVAI SYLLABLE NDOOVAI SYLLABL" + - "E SOOVAI SYLLABLE SHOOVAI SYLLABLE ZOOVAI SYLLABLE ZHOOVAI SYLLABLE COOV" + - "AI SYLLABLE JOOVAI SYLLABLE NJOOVAI SYLLABLE YOOVAI SYLLABLE KOOVAI SYLL" + - "ABLE NGGOOVAI SYLLABLE GOOVAI SYLLABLE MOOVAI SYLLABLE NOOVAI SYLLABLE N" + - "YOOVAI SYLLABLE UVAI SYLLABLE UNVAI SYLLABLE HUVAI SYLLABLE HUNVAI SYLLA" + - "BLE WUVAI SYLLABLE WUNVAI SYLLABLE PUVAI SYLLABLE BHUVAI SYLLABLE BUVAI " + - "SYLLABLE MBUVAI SYLLABLE KPUVAI SYLLABLE MGBUVAI SYLLABLE GBUVAI SYLLABL" + - "E FUVAI SYLLABLE VUVAI SYLLABLE TUVAI SYLLABLE THUVAI SYLLABLE DHUVAI SY" + - "LLABLE DHHUVAI SYLLABLE LUVAI SYLLABLE RUVAI SYLLABLE DUVAI SYLLABLE NDU" + - "VAI SYLLABLE SUVAI SYLLABLE SHUVAI SYLLABLE ZUVAI SYLLABLE ZHUVAI SYLLAB" + - "LE CUVAI SYLLABLE JUVAI SYLLABLE NJUVAI SYLLABLE YUVAI SYLLABLE KUVAI SY" + - "LLABLE NGGUVAI SYLLABLE GUVAI SYLLABLE MUVAI SYLLABLE NUVAI SYLLABLE NYU" + - "VAI SYLLABLE OVAI SYLLABLE ONVAI SYLLABLE NGONVAI SYLLABLE HOVAI SYLLABL" + - "E HONVAI SYLLABLE WOVAI SYLLABLE WONVAI SYLLABLE POVAI SYLLABLE BHOVAI S" + - "YLLABLE BOVAI SYLLABLE MBOVAI SYLLABLE KPOVAI SYLLABLE MGBOVAI SYLLABLE " + - "GBOVAI SYLLABLE GBONVAI SYLLABLE FOVAI SYLLABLE VOVAI SYLLABLE TOVAI SYL" + - "LABLE THOVAI SYLLABLE DHOVAI SYLLABLE DHHOVAI SYLLABLE LOVAI SYLLABLE RO" + - "VAI SYLLABLE DOVAI SYLLABLE NDOVAI SYLLABLE SOVAI SYLLABLE SHOVAI SYLLAB" + - "LE ZOVAI SYLLABLE ZHOVAI SYLLABLE COVAI SYLLABLE JOVAI SYLLABLE NJOVAI S" + - "YLLABLE YOVAI SYLLABLE KOVAI SYLLABLE NGGOVAI SYLLABLE GOVAI SYLLABLE MO" + - "VAI SYLLABLE NOVAI SYLLABLE NYOVAI SYLLABLE EVAI SYLLABLE ENVAI SYLLABLE" + - " NGENVAI SYLLABLE HEVAI SYLLABLE HENVAI SYLLABLE WEVAI SYLLABLE WENVAI S" + - "YLLABLE PEVAI SYLLABLE BHEVAI SYLLABLE BEVAI SYLLABLE MBEVAI SYLLABLE KP" + - "EVAI SYLLABLE KPENVAI SYLLABLE MGBEVAI SYLLABLE GBEVAI SYLLABLE GBENVAI " + - "SYLLABLE FEVAI SYLLABLE VEVAI SYLLABLE TEVAI SYLLABLE THEVAI SYLLABLE DH" + - "EVAI SYLLABLE DHHEVAI SYLLABLE LEVAI SYLLABLE REVAI SYLLABLE DEVAI SYLLA" + - "BLE NDEVAI SYLLABLE SEVAI SYLLABLE SHEVAI SYLLABLE ZEVAI SYLLABLE ZHEVAI" + - " SYLLABLE CEVAI SYLLABLE JEVAI SYLLABLE NJEVAI SYLLABLE YEVAI SYLLABLE K" + - "EVAI SYLLABLE NGGEVAI SYLLABLE NGGENVAI SYLLABLE GEVAI SYLLABLE GENVAI S" + - "YLLABLE MEVAI SYLLABLE NEVAI SYLLABLE NYEVAI SYLLABLE NGVAI SYLLABLE LEN" + - "GTHENERVAI COMMAVAI FULL STOPVAI QUESTION MARKVAI SYLLABLE NDOLE FAVAI S" + - "YLLABLE NDOLE KAVAI SYLLABLE NDOLE SOOVAI SYMBOL FEENGVAI SYMBOL KEENGVA" + - "I SYMBOL TINGVAI SYMBOL NIIVAI SYMBOL BANGVAI SYMBOL FAAVAI SYMBOL TAAVA" + - "I SYMBOL DANGVAI SYMBOL DOONGVAI SYMBOL KUNGVAI SYMBOL TONGVAI SYMBOL DO" + - "-OVAI SYMBOL JONGVAI DIGIT ZEROVAI DIGIT ONEVAI DIGIT TWOVAI DIGIT THREE" + - "VAI DIGIT FOURVAI DIGIT FIVEVAI DIGIT SIXVAI DIGIT SEVENVAI DIGIT EIGHTV" + - "AI DIGIT NINEVAI SYLLABLE NDOLE MAVAI SYLLABLE NDOLE DOCYRILLIC CAPITAL " + - "LETTER ZEMLYACYRILLIC SMALL LETTER ZEMLYACYRILLIC CAPITAL LETTER DZELOCY" + - "RILLIC SMALL LETTER DZELOCYRILLIC CAPITAL LETTER REVERSED DZECYRILLIC SM" + - "ALL LETTER REVERSED DZECYRILLIC CAPITAL LETTER IOTACYRILLIC SMALL LETTER" + - " IOTACYRILLIC CAPITAL LETTER DJERVCYRILLIC SMALL LETTER DJERVCYRILLIC CA") + ("" + - "PITAL LETTER MONOGRAPH UKCYRILLIC SMALL LETTER MONOGRAPH UKCYRILLIC CAPI" + - "TAL LETTER BROAD OMEGACYRILLIC SMALL LETTER BROAD OMEGACYRILLIC CAPITAL " + - "LETTER NEUTRAL YERCYRILLIC SMALL LETTER NEUTRAL YERCYRILLIC CAPITAL LETT" + - "ER YERU WITH BACK YERCYRILLIC SMALL LETTER YERU WITH BACK YERCYRILLIC CA" + - "PITAL LETTER IOTIFIED YATCYRILLIC SMALL LETTER IOTIFIED YATCYRILLIC CAPI" + - "TAL LETTER REVERSED YUCYRILLIC SMALL LETTER REVERSED YUCYRILLIC CAPITAL " + - "LETTER IOTIFIED ACYRILLIC SMALL LETTER IOTIFIED ACYRILLIC CAPITAL LETTER" + - " CLOSED LITTLE YUSCYRILLIC SMALL LETTER CLOSED LITTLE YUSCYRILLIC CAPITA" + - "L LETTER BLENDED YUSCYRILLIC SMALL LETTER BLENDED YUSCYRILLIC CAPITAL LE" + - "TTER IOTIFIED CLOSED LITTLE YUSCYRILLIC SMALL LETTER IOTIFIED CLOSED LIT" + - "TLE YUSCYRILLIC CAPITAL LETTER YNCYRILLIC SMALL LETTER YNCYRILLIC CAPITA" + - "L LETTER REVERSED TSECYRILLIC SMALL LETTER REVERSED TSECYRILLIC CAPITAL " + - "LETTER SOFT DECYRILLIC SMALL LETTER SOFT DECYRILLIC CAPITAL LETTER SOFT " + - "ELCYRILLIC SMALL LETTER SOFT ELCYRILLIC CAPITAL LETTER SOFT EMCYRILLIC S" + - "MALL LETTER SOFT EMCYRILLIC CAPITAL LETTER MONOCULAR OCYRILLIC SMALL LET" + - "TER MONOCULAR OCYRILLIC CAPITAL LETTER BINOCULAR OCYRILLIC SMALL LETTER " + - "BINOCULAR OCYRILLIC CAPITAL LETTER DOUBLE MONOCULAR OCYRILLIC SMALL LETT" + - "ER DOUBLE MONOCULAR OCYRILLIC LETTER MULTIOCULAR OCOMBINING CYRILLIC VZM" + - "ETCOMBINING CYRILLIC TEN MILLIONS SIGNCOMBINING CYRILLIC HUNDRED MILLION" + - "S SIGNCOMBINING CYRILLIC THOUSAND MILLIONS SIGNSLAVONIC ASTERISKCOMBININ" + - "G CYRILLIC LETTER UKRAINIAN IECOMBINING CYRILLIC LETTER ICOMBINING CYRIL" + - "LIC LETTER YICOMBINING CYRILLIC LETTER UCOMBINING CYRILLIC LETTER HARD S" + - "IGNCOMBINING CYRILLIC LETTER YERUCOMBINING CYRILLIC LETTER SOFT SIGNCOMB" + - "INING CYRILLIC LETTER OMEGACOMBINING CYRILLIC KAVYKACOMBINING CYRILLIC P" + - "AYEROKCYRILLIC KAVYKACYRILLIC PAYEROKCYRILLIC CAPITAL LETTER DWECYRILLIC" + - " SMALL LETTER DWECYRILLIC CAPITAL LETTER DZWECYRILLIC SMALL LETTER DZWEC" + - "YRILLIC CAPITAL LETTER ZHWECYRILLIC SMALL LETTER ZHWECYRILLIC CAPITAL LE" + - "TTER CCHECYRILLIC SMALL LETTER CCHECYRILLIC CAPITAL LETTER DZZECYRILLIC " + - "SMALL LETTER DZZECYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOKCYRILLIC SMA" + - "LL LETTER TE WITH MIDDLE HOOKCYRILLIC CAPITAL LETTER TWECYRILLIC SMALL L" + - "ETTER TWECYRILLIC CAPITAL LETTER TSWECYRILLIC SMALL LETTER TSWECYRILLIC " + - "CAPITAL LETTER TSSECYRILLIC SMALL LETTER TSSECYRILLIC CAPITAL LETTER TCH" + - "ECYRILLIC SMALL LETTER TCHECYRILLIC CAPITAL LETTER HWECYRILLIC SMALL LET" + - "TER HWECYRILLIC CAPITAL LETTER SHWECYRILLIC SMALL LETTER SHWECYRILLIC CA" + - "PITAL LETTER DOUBLE OCYRILLIC SMALL LETTER DOUBLE OCYRILLIC CAPITAL LETT" + - "ER CROSSED OCYRILLIC SMALL LETTER CROSSED OMODIFIER LETTER CYRILLIC HARD" + - " SIGNMODIFIER LETTER CYRILLIC SOFT SIGNCOMBINING CYRILLIC LETTER EFCOMBI" + - "NING CYRILLIC LETTER IOTIFIED EBAMUM LETTER ABAMUM LETTER KABAMUM LETTER" + - " UBAMUM LETTER KUBAMUM LETTER EEBAMUM LETTER REEBAMUM LETTER TAEBAMUM LE" + - "TTER OBAMUM LETTER NYIBAMUM LETTER IBAMUM LETTER LABAMUM LETTER PABAMUM " + - "LETTER RIIBAMUM LETTER RIEEBAMUM LETTER LEEEEBAMUM LETTER MEEEEBAMUM LET" + - "TER TAABAMUM LETTER NDAABAMUM LETTER NJAEMBAMUM LETTER MBAMUM LETTER SUU" + - "BAMUM LETTER MUBAMUM LETTER SHIIBAMUM LETTER SIBAMUM LETTER SHEUXBAMUM L" + - "ETTER SEUXBAMUM LETTER KYEEBAMUM LETTER KETBAMUM LETTER NUAEBAMUM LETTER" + - " NUBAMUM LETTER NJUAEBAMUM LETTER YOQBAMUM LETTER SHUBAMUM LETTER YUQBAM" + - "UM LETTER YABAMUM LETTER NSHABAMUM LETTER KEUXBAMUM LETTER PEUXBAMUM LET" + - "TER NJEEBAMUM LETTER NTEEBAMUM LETTER PUEBAMUM LETTER WUEBAMUM LETTER PE" + - "EBAMUM LETTER FEEBAMUM LETTER RUBAMUM LETTER LUBAMUM LETTER MIBAMUM LETT" + - "ER NIBAMUM LETTER REUXBAMUM LETTER RAEBAMUM LETTER KENBAMUM LETTER NGKWA" + - "ENBAMUM LETTER NGGABAMUM LETTER NGABAMUM LETTER SHOBAMUM LETTER PUAEBAMU" + - "M LETTER FUBAMUM LETTER FOMBAMUM LETTER WABAMUM LETTER NABAMUM LETTER LI" + - "BAMUM LETTER PIBAMUM LETTER LOQBAMUM LETTER KOBAMUM LETTER MBENBAMUM LET" + - "TER RENBAMUM LETTER MENBAMUM LETTER MABAMUM LETTER TIBAMUM LETTER KIBAMU" + - "M LETTER MOBAMUM LETTER MBAABAMUM LETTER TETBAMUM LETTER KPABAMUM LETTER" + - " TENBAMUM LETTER NTUUBAMUM LETTER SAMBABAMUM LETTER FAAMAEBAMUM LETTER K" + - "OVUUBAMUM LETTER KOGHOMBAMUM COMBINING MARK KOQNDONBAMUM COMBINING MARK " + - "TUKWENTISBAMUM NJAEMLIBAMUM FULL STOPBAMUM COLONBAMUM COMMABAMUM SEMICOL" + - "ONBAMUM QUESTION MARKMODIFIER LETTER CHINESE TONE YIN PINGMODIFIER LETTE" + - "R CHINESE TONE YANG PINGMODIFIER LETTER CHINESE TONE YIN SHANGMODIFIER L" + - "ETTER CHINESE TONE YANG SHANGMODIFIER LETTER CHINESE TONE YIN QUMODIFIER" + - " LETTER CHINESE TONE YANG QUMODIFIER LETTER CHINESE TONE YIN RUMODIFIER " + - "LETTER CHINESE TONE YANG RUMODIFIER LETTER EXTRA-HIGH DOTTED TONE BARMOD" + - "IFIER LETTER HIGH DOTTED TONE BARMODIFIER LETTER MID DOTTED TONE BARMODI" + - "FIER LETTER LOW DOTTED TONE BARMODIFIER LETTER EXTRA-LOW DOTTED TONE BAR") + ("" + - "MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BARMODIFIER LETTER HIGH" + - " DOTTED LEFT-STEM TONE BARMODIFIER LETTER MID DOTTED LEFT-STEM TONE BARM" + - "ODIFIER LETTER LOW DOTTED LEFT-STEM TONE BARMODIFIER LETTER EXTRA-LOW DO" + - "TTED LEFT-STEM TONE BARMODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BARMODI" + - "FIER LETTER HIGH LEFT-STEM TONE BARMODIFIER LETTER MID LEFT-STEM TONE BA" + - "RMODIFIER LETTER LOW LEFT-STEM TONE BARMODIFIER LETTER EXTRA-LOW LEFT-ST" + - "EM TONE BARMODIFIER LETTER DOT VERTICAL BARMODIFIER LETTER DOT SLASHMODI" + - "FIER LETTER DOT HORIZONTAL BARMODIFIER LETTER LOWER RIGHT CORNER ANGLEMO" + - "DIFIER LETTER RAISED UP ARROWMODIFIER LETTER RAISED DOWN ARROWMODIFIER L" + - "ETTER RAISED EXCLAMATION MARKMODIFIER LETTER RAISED INVERTED EXCLAMATION" + - " MARKMODIFIER LETTER LOW INVERTED EXCLAMATION MARKMODIFIER LETTER STRESS" + - " AND HIGH TONEMODIFIER LETTER STRESS AND LOW TONELATIN CAPITAL LETTER EG" + - "YPTOLOGICAL ALEFLATIN SMALL LETTER EGYPTOLOGICAL ALEFLATIN CAPITAL LETTE" + - "R EGYPTOLOGICAL AINLATIN SMALL LETTER EGYPTOLOGICAL AINLATIN CAPITAL LET" + - "TER HENGLATIN SMALL LETTER HENGLATIN CAPITAL LETTER TZLATIN SMALL LETTER" + - " TZLATIN CAPITAL LETTER TRESILLOLATIN SMALL LETTER TRESILLOLATIN CAPITAL" + - " LETTER CUATRILLOLATIN SMALL LETTER CUATRILLOLATIN CAPITAL LETTER CUATRI" + - "LLO WITH COMMALATIN SMALL LETTER CUATRILLO WITH COMMALATIN LETTER SMALL " + - "CAPITAL FLATIN LETTER SMALL CAPITAL SLATIN CAPITAL LETTER AALATIN SMALL " + - "LETTER AALATIN CAPITAL LETTER AOLATIN SMALL LETTER AOLATIN CAPITAL LETTE" + - "R AULATIN SMALL LETTER AULATIN CAPITAL LETTER AVLATIN SMALL LETTER AVLAT" + - "IN CAPITAL LETTER AV WITH HORIZONTAL BARLATIN SMALL LETTER AV WITH HORIZ" + - "ONTAL BARLATIN CAPITAL LETTER AYLATIN SMALL LETTER AYLATIN CAPITAL LETTE" + - "R REVERSED C WITH DOTLATIN SMALL LETTER REVERSED C WITH DOTLATIN CAPITAL" + - " LETTER K WITH STROKELATIN SMALL LETTER K WITH STROKELATIN CAPITAL LETTE" + - "R K WITH DIAGONAL STROKELATIN SMALL LETTER K WITH DIAGONAL STROKELATIN C" + - "APITAL LETTER K WITH STROKE AND DIAGONAL STROKELATIN SMALL LETTER K WITH" + - " STROKE AND DIAGONAL STROKELATIN CAPITAL LETTER BROKEN LLATIN SMALL LETT" + - "ER BROKEN LLATIN CAPITAL LETTER L WITH HIGH STROKELATIN SMALL LETTER L W" + - "ITH HIGH STROKELATIN CAPITAL LETTER O WITH LONG STROKE OVERLAYLATIN SMAL" + - "L LETTER O WITH LONG STROKE OVERLAYLATIN CAPITAL LETTER O WITH LOOPLATIN" + - " SMALL LETTER O WITH LOOPLATIN CAPITAL LETTER OOLATIN SMALL LETTER OOLAT" + - "IN CAPITAL LETTER P WITH STROKE THROUGH DESCENDERLATIN SMALL LETTER P WI" + - "TH STROKE THROUGH DESCENDERLATIN CAPITAL LETTER P WITH FLOURISHLATIN SMA" + - "LL LETTER P WITH FLOURISHLATIN CAPITAL LETTER P WITH SQUIRREL TAILLATIN " + - "SMALL LETTER P WITH SQUIRREL TAILLATIN CAPITAL LETTER Q WITH STROKE THRO" + - "UGH DESCENDERLATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDERLATIN CAP" + - "ITAL LETTER Q WITH DIAGONAL STROKELATIN SMALL LETTER Q WITH DIAGONAL STR" + - "OKELATIN CAPITAL LETTER R ROTUNDALATIN SMALL LETTER R ROTUNDALATIN CAPIT" + - "AL LETTER RUM ROTUNDALATIN SMALL LETTER RUM ROTUNDALATIN CAPITAL LETTER " + - "V WITH DIAGONAL STROKELATIN SMALL LETTER V WITH DIAGONAL STROKELATIN CAP" + - "ITAL LETTER VYLATIN SMALL LETTER VYLATIN CAPITAL LETTER VISIGOTHIC ZLATI" + - "N SMALL LETTER VISIGOTHIC ZLATIN CAPITAL LETTER THORN WITH STROKELATIN S" + - "MALL LETTER THORN WITH STROKELATIN CAPITAL LETTER THORN WITH STROKE THRO" + - "UGH DESCENDERLATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDERLATIN" + - " CAPITAL LETTER VENDLATIN SMALL LETTER VENDLATIN CAPITAL LETTER ETLATIN " + - "SMALL LETTER ETLATIN CAPITAL LETTER ISLATIN SMALL LETTER ISLATIN CAPITAL" + - " LETTER CONLATIN SMALL LETTER CONMODIFIER LETTER USLATIN SMALL LETTER DU" + - "MLATIN SMALL LETTER LUMLATIN SMALL LETTER MUMLATIN SMALL LETTER NUMLATIN" + - " SMALL LETTER RUMLATIN LETTER SMALL CAPITAL RUMLATIN SMALL LETTER TUMLAT" + - "IN SMALL LETTER UMLATIN CAPITAL LETTER INSULAR DLATIN SMALL LETTER INSUL" + - "AR DLATIN CAPITAL LETTER INSULAR FLATIN SMALL LETTER INSULAR FLATIN CAPI" + - "TAL LETTER INSULAR GLATIN CAPITAL LETTER TURNED INSULAR GLATIN SMALL LET" + - "TER TURNED INSULAR GLATIN CAPITAL LETTER TURNED LLATIN SMALL LETTER TURN" + - "ED LLATIN CAPITAL LETTER INSULAR RLATIN SMALL LETTER INSULAR RLATIN CAPI" + - "TAL LETTER INSULAR SLATIN SMALL LETTER INSULAR SLATIN CAPITAL LETTER INS" + - "ULAR TLATIN SMALL LETTER INSULAR TMODIFIER LETTER LOW CIRCUMFLEX ACCENTM" + - "ODIFIER LETTER COLONMODIFIER LETTER SHORT EQUALS SIGNLATIN CAPITAL LETTE" + - "R SALTILLOLATIN SMALL LETTER SALTILLOLATIN CAPITAL LETTER TURNED HLATIN " + - "SMALL LETTER L WITH RETROFLEX HOOK AND BELTLATIN LETTER SINOLOGICAL DOTL" + - "ATIN CAPITAL LETTER N WITH DESCENDERLATIN SMALL LETTER N WITH DESCENDERL" + - "ATIN CAPITAL LETTER C WITH BARLATIN SMALL LETTER C WITH BARLATIN SMALL L" + - "ETTER C WITH PALATAL HOOKLATIN SMALL LETTER H WITH PALATAL HOOKLATIN CAP" + - "ITAL LETTER B WITH FLOURISHLATIN SMALL LETTER B WITH FLOURISHLATIN CAPIT") + ("" + - "AL LETTER F WITH STROKELATIN SMALL LETTER F WITH STROKELATIN CAPITAL LET" + - "TER VOLAPUK AELATIN SMALL LETTER VOLAPUK AELATIN CAPITAL LETTER VOLAPUK " + - "OELATIN SMALL LETTER VOLAPUK OELATIN CAPITAL LETTER VOLAPUK UELATIN SMAL" + - "L LETTER VOLAPUK UELATIN CAPITAL LETTER G WITH OBLIQUE STROKELATIN SMALL" + - " LETTER G WITH OBLIQUE STROKELATIN CAPITAL LETTER K WITH OBLIQUE STROKEL" + - "ATIN SMALL LETTER K WITH OBLIQUE STROKELATIN CAPITAL LETTER N WITH OBLIQ" + - "UE STROKELATIN SMALL LETTER N WITH OBLIQUE STROKELATIN CAPITAL LETTER R " + - "WITH OBLIQUE STROKELATIN SMALL LETTER R WITH OBLIQUE STROKELATIN CAPITAL" + - " LETTER S WITH OBLIQUE STROKELATIN SMALL LETTER S WITH OBLIQUE STROKELAT" + - "IN CAPITAL LETTER H WITH HOOKLATIN CAPITAL LETTER REVERSED OPEN ELATIN C" + - "APITAL LETTER SCRIPT GLATIN CAPITAL LETTER L WITH BELTLATIN CAPITAL LETT" + - "ER SMALL CAPITAL ILATIN CAPITAL LETTER TURNED KLATIN CAPITAL LETTER TURN" + - "ED TLATIN CAPITAL LETTER J WITH CROSSED-TAILLATIN CAPITAL LETTER CHILATI" + - "N CAPITAL LETTER BETALATIN SMALL LETTER BETALATIN CAPITAL LETTER OMEGALA" + - "TIN SMALL LETTER OMEGALATIN EPIGRAPHIC LETTER SIDEWAYS IMODIFIER LETTER " + - "CAPITAL H WITH STROKEMODIFIER LETTER SMALL LIGATURE OELATIN LETTER SMALL" + - " CAPITAL TURNED MLATIN EPIGRAPHIC LETTER REVERSED FLATIN EPIGRAPHIC LETT" + - "ER REVERSED PLATIN EPIGRAPHIC LETTER INVERTED MLATIN EPIGRAPHIC LETTER I" + - " LONGALATIN EPIGRAPHIC LETTER ARCHAIC MSYLOTI NAGRI LETTER ASYLOTI NAGRI" + - " LETTER ISYLOTI NAGRI SIGN DVISVARASYLOTI NAGRI LETTER USYLOTI NAGRI LET" + - "TER ESYLOTI NAGRI LETTER OSYLOTI NAGRI SIGN HASANTASYLOTI NAGRI LETTER K" + - "OSYLOTI NAGRI LETTER KHOSYLOTI NAGRI LETTER GOSYLOTI NAGRI LETTER GHOSYL" + - "OTI NAGRI SIGN ANUSVARASYLOTI NAGRI LETTER COSYLOTI NAGRI LETTER CHOSYLO" + - "TI NAGRI LETTER JOSYLOTI NAGRI LETTER JHOSYLOTI NAGRI LETTER TTOSYLOTI N" + - "AGRI LETTER TTHOSYLOTI NAGRI LETTER DDOSYLOTI NAGRI LETTER DDHOSYLOTI NA" + - "GRI LETTER TOSYLOTI NAGRI LETTER THOSYLOTI NAGRI LETTER DOSYLOTI NAGRI L" + - "ETTER DHOSYLOTI NAGRI LETTER NOSYLOTI NAGRI LETTER POSYLOTI NAGRI LETTER" + - " PHOSYLOTI NAGRI LETTER BOSYLOTI NAGRI LETTER BHOSYLOTI NAGRI LETTER MOS" + - "YLOTI NAGRI LETTER ROSYLOTI NAGRI LETTER LOSYLOTI NAGRI LETTER RROSYLOTI" + - " NAGRI LETTER SOSYLOTI NAGRI LETTER HOSYLOTI NAGRI VOWEL SIGN ASYLOTI NA" + - "GRI VOWEL SIGN ISYLOTI NAGRI VOWEL SIGN USYLOTI NAGRI VOWEL SIGN ESYLOTI" + - " NAGRI VOWEL SIGN OOSYLOTI NAGRI POETRY MARK-1SYLOTI NAGRI POETRY MARK-2" + - "SYLOTI NAGRI POETRY MARK-3SYLOTI NAGRI POETRY MARK-4NORTH INDIC FRACTION" + - " ONE QUARTERNORTH INDIC FRACTION ONE HALFNORTH INDIC FRACTION THREE QUAR" + - "TERSNORTH INDIC FRACTION ONE SIXTEENTHNORTH INDIC FRACTION ONE EIGHTHNOR" + - "TH INDIC FRACTION THREE SIXTEENTHSNORTH INDIC QUARTER MARKNORTH INDIC PL" + - "ACEHOLDER MARKNORTH INDIC RUPEE MARKNORTH INDIC QUANTITY MARKPHAGS-PA LE" + - "TTER KAPHAGS-PA LETTER KHAPHAGS-PA LETTER GAPHAGS-PA LETTER NGAPHAGS-PA " + - "LETTER CAPHAGS-PA LETTER CHAPHAGS-PA LETTER JAPHAGS-PA LETTER NYAPHAGS-P" + - "A LETTER TAPHAGS-PA LETTER THAPHAGS-PA LETTER DAPHAGS-PA LETTER NAPHAGS-" + - "PA LETTER PAPHAGS-PA LETTER PHAPHAGS-PA LETTER BAPHAGS-PA LETTER MAPHAGS" + - "-PA LETTER TSAPHAGS-PA LETTER TSHAPHAGS-PA LETTER DZAPHAGS-PA LETTER WAP" + - "HAGS-PA LETTER ZHAPHAGS-PA LETTER ZAPHAGS-PA LETTER SMALL APHAGS-PA LETT" + - "ER YAPHAGS-PA LETTER RAPHAGS-PA LETTER LAPHAGS-PA LETTER SHAPHAGS-PA LET" + - "TER SAPHAGS-PA LETTER HAPHAGS-PA LETTER APHAGS-PA LETTER IPHAGS-PA LETTE" + - "R UPHAGS-PA LETTER EPHAGS-PA LETTER OPHAGS-PA LETTER QAPHAGS-PA LETTER X" + - "APHAGS-PA LETTER FAPHAGS-PA LETTER GGAPHAGS-PA LETTER EEPHAGS-PA SUBJOIN" + - "ED LETTER WAPHAGS-PA SUBJOINED LETTER YAPHAGS-PA LETTER TTAPHAGS-PA LETT" + - "ER TTHAPHAGS-PA LETTER DDAPHAGS-PA LETTER NNAPHAGS-PA LETTER ALTERNATE Y" + - "APHAGS-PA LETTER VOICELESS SHAPHAGS-PA LETTER VOICED HAPHAGS-PA LETTER A" + - "SPIRATED FAPHAGS-PA SUBJOINED LETTER RAPHAGS-PA SUPERFIXED LETTER RAPHAG" + - "S-PA LETTER CANDRABINDUPHAGS-PA SINGLE HEAD MARKPHAGS-PA DOUBLE HEAD MAR" + - "KPHAGS-PA MARK SHADPHAGS-PA MARK DOUBLE SHADSAURASHTRA SIGN ANUSVARASAUR" + - "ASHTRA SIGN VISARGASAURASHTRA LETTER ASAURASHTRA LETTER AASAURASHTRA LET" + - "TER ISAURASHTRA LETTER IISAURASHTRA LETTER USAURASHTRA LETTER UUSAURASHT" + - "RA LETTER VOCALIC RSAURASHTRA LETTER VOCALIC RRSAURASHTRA LETTER VOCALIC" + - " LSAURASHTRA LETTER VOCALIC LLSAURASHTRA LETTER ESAURASHTRA LETTER EESAU" + - "RASHTRA LETTER AISAURASHTRA LETTER OSAURASHTRA LETTER OOSAURASHTRA LETTE" + - "R AUSAURASHTRA LETTER KASAURASHTRA LETTER KHASAURASHTRA LETTER GASAURASH" + - "TRA LETTER GHASAURASHTRA LETTER NGASAURASHTRA LETTER CASAURASHTRA LETTER" + - " CHASAURASHTRA LETTER JASAURASHTRA LETTER JHASAURASHTRA LETTER NYASAURAS" + - "HTRA LETTER TTASAURASHTRA LETTER TTHASAURASHTRA LETTER DDASAURASHTRA LET" + - "TER DDHASAURASHTRA LETTER NNASAURASHTRA LETTER TASAURASHTRA LETTER THASA" + - "URASHTRA LETTER DASAURASHTRA LETTER DHASAURASHTRA LETTER NASAURASHTRA LE") + ("" + - "TTER PASAURASHTRA LETTER PHASAURASHTRA LETTER BASAURASHTRA LETTER BHASAU" + - "RASHTRA LETTER MASAURASHTRA LETTER YASAURASHTRA LETTER RASAURASHTRA LETT" + - "ER LASAURASHTRA LETTER VASAURASHTRA LETTER SHASAURASHTRA LETTER SSASAURA" + - "SHTRA LETTER SASAURASHTRA LETTER HASAURASHTRA LETTER LLASAURASHTRA CONSO" + - "NANT SIGN HAARUSAURASHTRA VOWEL SIGN AASAURASHTRA VOWEL SIGN ISAURASHTRA" + - " VOWEL SIGN IISAURASHTRA VOWEL SIGN USAURASHTRA VOWEL SIGN UUSAURASHTRA " + - "VOWEL SIGN VOCALIC RSAURASHTRA VOWEL SIGN VOCALIC RRSAURASHTRA VOWEL SIG" + - "N VOCALIC LSAURASHTRA VOWEL SIGN VOCALIC LLSAURASHTRA VOWEL SIGN ESAURAS" + - "HTRA VOWEL SIGN EESAURASHTRA VOWEL SIGN AISAURASHTRA VOWEL SIGN OSAURASH" + - "TRA VOWEL SIGN OOSAURASHTRA VOWEL SIGN AUSAURASHTRA SIGN VIRAMASAURASHTR" + - "A SIGN CANDRABINDUSAURASHTRA DANDASAURASHTRA DOUBLE DANDASAURASHTRA DIGI" + - "T ZEROSAURASHTRA DIGIT ONESAURASHTRA DIGIT TWOSAURASHTRA DIGIT THREESAUR" + - "ASHTRA DIGIT FOURSAURASHTRA DIGIT FIVESAURASHTRA DIGIT SIXSAURASHTRA DIG" + - "IT SEVENSAURASHTRA DIGIT EIGHTSAURASHTRA DIGIT NINECOMBINING DEVANAGARI " + - "DIGIT ZEROCOMBINING DEVANAGARI DIGIT ONECOMBINING DEVANAGARI DIGIT TWOCO" + - "MBINING DEVANAGARI DIGIT THREECOMBINING DEVANAGARI DIGIT FOURCOMBINING D" + - "EVANAGARI DIGIT FIVECOMBINING DEVANAGARI DIGIT SIXCOMBINING DEVANAGARI D" + - "IGIT SEVENCOMBINING DEVANAGARI DIGIT EIGHTCOMBINING DEVANAGARI DIGIT NIN" + - "ECOMBINING DEVANAGARI LETTER ACOMBINING DEVANAGARI LETTER UCOMBINING DEV" + - "ANAGARI LETTER KACOMBINING DEVANAGARI LETTER NACOMBINING DEVANAGARI LETT" + - "ER PACOMBINING DEVANAGARI LETTER RACOMBINING DEVANAGARI LETTER VICOMBINI" + - "NG DEVANAGARI SIGN AVAGRAHADEVANAGARI SIGN SPACING CANDRABINDUDEVANAGARI" + - " SIGN CANDRABINDU VIRAMADEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMADEVANAG" + - "ARI SIGN CANDRABINDU TWODEVANAGARI SIGN CANDRABINDU THREEDEVANAGARI SIGN" + - " CANDRABINDU AVAGRAHADEVANAGARI SIGN PUSHPIKADEVANAGARI GAP FILLERDEVANA" + - "GARI CARETDEVANAGARI HEADSTROKEDEVANAGARI SIGN SIDDHAMDEVANAGARI JAIN OM" + - "KAYAH LI DIGIT ZEROKAYAH LI DIGIT ONEKAYAH LI DIGIT TWOKAYAH LI DIGIT TH" + - "REEKAYAH LI DIGIT FOURKAYAH LI DIGIT FIVEKAYAH LI DIGIT SIXKAYAH LI DIGI" + - "T SEVENKAYAH LI DIGIT EIGHTKAYAH LI DIGIT NINEKAYAH LI LETTER KAKAYAH LI" + - " LETTER KHAKAYAH LI LETTER GAKAYAH LI LETTER NGAKAYAH LI LETTER SAKAYAH " + - "LI LETTER SHAKAYAH LI LETTER ZAKAYAH LI LETTER NYAKAYAH LI LETTER TAKAYA" + - "H LI LETTER HTAKAYAH LI LETTER NAKAYAH LI LETTER PAKAYAH LI LETTER PHAKA" + - "YAH LI LETTER MAKAYAH LI LETTER DAKAYAH LI LETTER BAKAYAH LI LETTER RAKA" + - "YAH LI LETTER YAKAYAH LI LETTER LAKAYAH LI LETTER WAKAYAH LI LETTER THAK" + - "AYAH LI LETTER HAKAYAH LI LETTER VAKAYAH LI LETTER CAKAYAH LI LETTER AKA" + - "YAH LI LETTER OEKAYAH LI LETTER IKAYAH LI LETTER OOKAYAH LI VOWEL UEKAYA" + - "H LI VOWEL EKAYAH LI VOWEL UKAYAH LI VOWEL EEKAYAH LI VOWEL OKAYAH LI TO" + - "NE PLOPHUKAYAH LI TONE CALYAKAYAH LI TONE CALYA PLOPHUKAYAH LI SIGN CWIK" + - "AYAH LI SIGN SHYAREJANG LETTER KAREJANG LETTER GAREJANG LETTER NGAREJANG" + - " LETTER TAREJANG LETTER DAREJANG LETTER NAREJANG LETTER PAREJANG LETTER " + - "BAREJANG LETTER MAREJANG LETTER CAREJANG LETTER JAREJANG LETTER NYAREJAN" + - "G LETTER SAREJANG LETTER RAREJANG LETTER LAREJANG LETTER YAREJANG LETTER" + - " WAREJANG LETTER HAREJANG LETTER MBAREJANG LETTER NGGAREJANG LETTER NDAR" + - "EJANG LETTER NYJAREJANG LETTER AREJANG VOWEL SIGN IREJANG VOWEL SIGN URE" + - "JANG VOWEL SIGN EREJANG VOWEL SIGN AIREJANG VOWEL SIGN OREJANG VOWEL SIG" + - "N AUREJANG VOWEL SIGN EUREJANG VOWEL SIGN EAREJANG CONSONANT SIGN NGREJA" + - "NG CONSONANT SIGN NREJANG CONSONANT SIGN RREJANG CONSONANT SIGN HREJANG " + - "VIRAMAREJANG SECTION MARKHANGUL CHOSEONG TIKEUT-MIEUMHANGUL CHOSEONG TIK" + - "EUT-PIEUPHANGUL CHOSEONG TIKEUT-SIOSHANGUL CHOSEONG TIKEUT-CIEUCHANGUL C" + - "HOSEONG RIEUL-KIYEOKHANGUL CHOSEONG RIEUL-SSANGKIYEOKHANGUL CHOSEONG RIE" + - "UL-TIKEUTHANGUL CHOSEONG RIEUL-SSANGTIKEUTHANGUL CHOSEONG RIEUL-MIEUMHAN" + - "GUL CHOSEONG RIEUL-PIEUPHANGUL CHOSEONG RIEUL-SSANGPIEUPHANGUL CHOSEONG " + - "RIEUL-KAPYEOUNPIEUPHANGUL CHOSEONG RIEUL-SIOSHANGUL CHOSEONG RIEUL-CIEUC" + - "HANGUL CHOSEONG RIEUL-KHIEUKHHANGUL CHOSEONG MIEUM-KIYEOKHANGUL CHOSEONG" + - " MIEUM-TIKEUTHANGUL CHOSEONG MIEUM-SIOSHANGUL CHOSEONG PIEUP-SIOS-THIEUT" + - "HHANGUL CHOSEONG PIEUP-KHIEUKHHANGUL CHOSEONG PIEUP-HIEUHHANGUL CHOSEONG" + - " SSANGSIOS-PIEUPHANGUL CHOSEONG IEUNG-RIEULHANGUL CHOSEONG IEUNG-HIEUHHA" + - "NGUL CHOSEONG SSANGCIEUC-HIEUHHANGUL CHOSEONG SSANGTHIEUTHHANGUL CHOSEON" + - "G PHIEUPH-HIEUHHANGUL CHOSEONG HIEUH-SIOSHANGUL CHOSEONG SSANGYEORINHIEU" + - "HJAVANESE SIGN PANYANGGAJAVANESE SIGN CECAKJAVANESE SIGN LAYARJAVANESE S" + - "IGN WIGNYANJAVANESE LETTER AJAVANESE LETTER I KAWIJAVANESE LETTER IJAVAN" + - "ESE LETTER IIJAVANESE LETTER UJAVANESE LETTER PA CEREKJAVANESE LETTER NG" + - "A LELETJAVANESE LETTER NGA LELET RASWADIJAVANESE LETTER EJAVANESE LETTER" + - " AIJAVANESE LETTER OJAVANESE LETTER KAJAVANESE LETTER KA SASAKJAVANESE L") + ("" + - "ETTER KA MURDAJAVANESE LETTER GAJAVANESE LETTER GA MURDAJAVANESE LETTER " + - "NGAJAVANESE LETTER CAJAVANESE LETTER CA MURDAJAVANESE LETTER JAJAVANESE " + - "LETTER NYA MURDAJAVANESE LETTER JA MAHAPRANAJAVANESE LETTER NYAJAVANESE " + - "LETTER TTAJAVANESE LETTER TTA MAHAPRANAJAVANESE LETTER DDAJAVANESE LETTE" + - "R DDA MAHAPRANAJAVANESE LETTER NA MURDAJAVANESE LETTER TAJAVANESE LETTER" + - " TA MURDAJAVANESE LETTER DAJAVANESE LETTER DA MAHAPRANAJAVANESE LETTER N" + - "AJAVANESE LETTER PAJAVANESE LETTER PA MURDAJAVANESE LETTER BAJAVANESE LE" + - "TTER BA MURDAJAVANESE LETTER MAJAVANESE LETTER YAJAVANESE LETTER RAJAVAN" + - "ESE LETTER RA AGUNGJAVANESE LETTER LAJAVANESE LETTER WAJAVANESE LETTER S" + - "A MURDAJAVANESE LETTER SA MAHAPRANAJAVANESE LETTER SAJAVANESE LETTER HAJ" + - "AVANESE SIGN CECAK TELUJAVANESE VOWEL SIGN TARUNGJAVANESE VOWEL SIGN TOL" + - "ONGJAVANESE VOWEL SIGN WULUJAVANESE VOWEL SIGN WULU MELIKJAVANESE VOWEL " + - "SIGN SUKUJAVANESE VOWEL SIGN SUKU MENDUTJAVANESE VOWEL SIGN TALINGJAVANE" + - "SE VOWEL SIGN DIRGA MUREJAVANESE VOWEL SIGN PEPETJAVANESE CONSONANT SIGN" + - " KERETJAVANESE CONSONANT SIGN PENGKALJAVANESE CONSONANT SIGN CAKRAJAVANE" + - "SE PANGKONJAVANESE LEFT RERENGGANJAVANESE RIGHT RERENGGANJAVANESE PADA A" + - "NDAPJAVANESE PADA MADYAJAVANESE PADA LUHURJAVANESE PADA WINDUJAVANESE PA" + - "DA PANGKATJAVANESE PADA LINGSAJAVANESE PADA LUNGSIJAVANESE PADA ADEGJAVA" + - "NESE PADA ADEG ADEGJAVANESE PADA PISELEHJAVANESE TURNED PADA PISELEHJAVA" + - "NESE PANGRANGKEPJAVANESE DIGIT ZEROJAVANESE DIGIT ONEJAVANESE DIGIT TWOJ" + - "AVANESE DIGIT THREEJAVANESE DIGIT FOURJAVANESE DIGIT FIVEJAVANESE DIGIT " + - "SIXJAVANESE DIGIT SEVENJAVANESE DIGIT EIGHTJAVANESE DIGIT NINEJAVANESE P" + - "ADA TIRTA TUMETESJAVANESE PADA ISEN-ISENMYANMAR LETTER SHAN GHAMYANMAR L" + - "ETTER SHAN CHAMYANMAR LETTER SHAN JHAMYANMAR LETTER SHAN NNAMYANMAR LETT" + - "ER SHAN BHAMYANMAR SIGN SHAN SAWMYANMAR MODIFIER LETTER SHAN REDUPLICATI" + - "ONMYANMAR LETTER TAI LAING NYAMYANMAR LETTER TAI LAING FAMYANMAR LETTER " + - "TAI LAING GAMYANMAR LETTER TAI LAING GHAMYANMAR LETTER TAI LAING JAMYANM" + - "AR LETTER TAI LAING JHAMYANMAR LETTER TAI LAING DDAMYANMAR LETTER TAI LA" + - "ING DDHAMYANMAR LETTER TAI LAING NNAMYANMAR TAI LAING DIGIT ZEROMYANMAR " + - "TAI LAING DIGIT ONEMYANMAR TAI LAING DIGIT TWOMYANMAR TAI LAING DIGIT TH" + - "REEMYANMAR TAI LAING DIGIT FOURMYANMAR TAI LAING DIGIT FIVEMYANMAR TAI L" + - "AING DIGIT SIXMYANMAR TAI LAING DIGIT SEVENMYANMAR TAI LAING DIGIT EIGHT" + - "MYANMAR TAI LAING DIGIT NINEMYANMAR LETTER TAI LAING LLAMYANMAR LETTER T" + - "AI LAING DAMYANMAR LETTER TAI LAING DHAMYANMAR LETTER TAI LAING BAMYANMA" + - "R LETTER TAI LAING BHACHAM LETTER ACHAM LETTER ICHAM LETTER UCHAM LETTER" + - " ECHAM LETTER AICHAM LETTER OCHAM LETTER KACHAM LETTER KHACHAM LETTER GA" + - "CHAM LETTER GHACHAM LETTER NGUECHAM LETTER NGACHAM LETTER CHACHAM LETTER" + - " CHHACHAM LETTER JACHAM LETTER JHACHAM LETTER NHUECHAM LETTER NHACHAM LE" + - "TTER NHJACHAM LETTER TACHAM LETTER THACHAM LETTER DACHAM LETTER DHACHAM " + - "LETTER NUECHAM LETTER NACHAM LETTER DDACHAM LETTER PACHAM LETTER PPACHAM" + - " LETTER PHACHAM LETTER BACHAM LETTER BHACHAM LETTER MUECHAM LETTER MACHA" + - "M LETTER BBACHAM LETTER YACHAM LETTER RACHAM LETTER LACHAM LETTER VACHAM" + - " LETTER SSACHAM LETTER SACHAM LETTER HACHAM VOWEL SIGN AACHAM VOWEL SIGN" + - " ICHAM VOWEL SIGN IICHAM VOWEL SIGN EICHAM VOWEL SIGN UCHAM VOWEL SIGN O" + - "ECHAM VOWEL SIGN OCHAM VOWEL SIGN AICHAM VOWEL SIGN AUCHAM VOWEL SIGN UE" + - "CHAM CONSONANT SIGN YACHAM CONSONANT SIGN RACHAM CONSONANT SIGN LACHAM C" + - "ONSONANT SIGN WACHAM LETTER FINAL KCHAM LETTER FINAL GCHAM LETTER FINAL " + - "NGCHAM CONSONANT SIGN FINAL NGCHAM LETTER FINAL CHCHAM LETTER FINAL TCHA" + - "M LETTER FINAL NCHAM LETTER FINAL PCHAM LETTER FINAL YCHAM LETTER FINAL " + - "RCHAM LETTER FINAL LCHAM LETTER FINAL SSCHAM CONSONANT SIGN FINAL MCHAM " + - "CONSONANT SIGN FINAL HCHAM DIGIT ZEROCHAM DIGIT ONECHAM DIGIT TWOCHAM DI" + - "GIT THREECHAM DIGIT FOURCHAM DIGIT FIVECHAM DIGIT SIXCHAM DIGIT SEVENCHA" + - "M DIGIT EIGHTCHAM DIGIT NINECHAM PUNCTUATION SPIRALCHAM PUNCTUATION DAND" + - "ACHAM PUNCTUATION DOUBLE DANDACHAM PUNCTUATION TRIPLE DANDAMYANMAR LETTE" + - "R KHAMTI GAMYANMAR LETTER KHAMTI CAMYANMAR LETTER KHAMTI CHAMYANMAR LETT" + - "ER KHAMTI JAMYANMAR LETTER KHAMTI JHAMYANMAR LETTER KHAMTI NYAMYANMAR LE" + - "TTER KHAMTI TTAMYANMAR LETTER KHAMTI TTHAMYANMAR LETTER KHAMTI DDAMYANMA" + - "R LETTER KHAMTI DDHAMYANMAR LETTER KHAMTI DHAMYANMAR LETTER KHAMTI NAMYA" + - "NMAR LETTER KHAMTI SAMYANMAR LETTER KHAMTI HAMYANMAR LETTER KHAMTI HHAMY" + - "ANMAR LETTER KHAMTI FAMYANMAR MODIFIER LETTER KHAMTI REDUPLICATIONMYANMA" + - "R LETTER KHAMTI XAMYANMAR LETTER KHAMTI ZAMYANMAR LETTER KHAMTI RAMYANMA" + - "R LOGOGRAM KHAMTI OAYMYANMAR LOGOGRAM KHAMTI QNMYANMAR LOGOGRAM KHAMTI H" + - "MMYANMAR SYMBOL AITON EXCLAMATIONMYANMAR SYMBOL AITON ONEMYANMAR SYMBOL " + - "AITON TWOMYANMAR LETTER AITON RAMYANMAR SIGN PAO KAREN TONEMYANMAR SIGN ") + ("" + - "TAI LAING TONE-2MYANMAR SIGN TAI LAING TONE-5MYANMAR LETTER SHWE PALAUNG" + - " CHAMYANMAR LETTER SHWE PALAUNG SHATAI VIET LETTER LOW KOTAI VIET LETTER" + - " HIGH KOTAI VIET LETTER LOW KHOTAI VIET LETTER HIGH KHOTAI VIET LETTER L" + - "OW KHHOTAI VIET LETTER HIGH KHHOTAI VIET LETTER LOW GOTAI VIET LETTER HI" + - "GH GOTAI VIET LETTER LOW NGOTAI VIET LETTER HIGH NGOTAI VIET LETTER LOW " + - "COTAI VIET LETTER HIGH COTAI VIET LETTER LOW CHOTAI VIET LETTER HIGH CHO" + - "TAI VIET LETTER LOW SOTAI VIET LETTER HIGH SOTAI VIET LETTER LOW NYOTAI " + - "VIET LETTER HIGH NYOTAI VIET LETTER LOW DOTAI VIET LETTER HIGH DOTAI VIE" + - "T LETTER LOW TOTAI VIET LETTER HIGH TOTAI VIET LETTER LOW THOTAI VIET LE" + - "TTER HIGH THOTAI VIET LETTER LOW NOTAI VIET LETTER HIGH NOTAI VIET LETTE" + - "R LOW BOTAI VIET LETTER HIGH BOTAI VIET LETTER LOW POTAI VIET LETTER HIG" + - "H POTAI VIET LETTER LOW PHOTAI VIET LETTER HIGH PHOTAI VIET LETTER LOW F" + - "OTAI VIET LETTER HIGH FOTAI VIET LETTER LOW MOTAI VIET LETTER HIGH MOTAI" + - " VIET LETTER LOW YOTAI VIET LETTER HIGH YOTAI VIET LETTER LOW ROTAI VIET" + - " LETTER HIGH ROTAI VIET LETTER LOW LOTAI VIET LETTER HIGH LOTAI VIET LET" + - "TER LOW VOTAI VIET LETTER HIGH VOTAI VIET LETTER LOW HOTAI VIET LETTER H" + - "IGH HOTAI VIET LETTER LOW OTAI VIET LETTER HIGH OTAI VIET MAI KANGTAI VI" + - "ET VOWEL AATAI VIET VOWEL ITAI VIET VOWEL UETAI VIET VOWEL UTAI VIET VOW" + - "EL ETAI VIET VOWEL OTAI VIET MAI KHITTAI VIET VOWEL IATAI VIET VOWEL UEA" + - "TAI VIET VOWEL UATAI VIET VOWEL AUETAI VIET VOWEL AYTAI VIET VOWEL ANTAI" + - " VIET VOWEL AMTAI VIET TONE MAI EKTAI VIET TONE MAI NUENGTAI VIET TONE M" + - "AI THOTAI VIET TONE MAI SONGTAI VIET SYMBOL KONTAI VIET SYMBOL NUENGTAI " + - "VIET SYMBOL SAMTAI VIET SYMBOL HO HOITAI VIET SYMBOL KOI KOIMEETEI MAYEK" + - " LETTER EMEETEI MAYEK LETTER OMEETEI MAYEK LETTER CHAMEETEI MAYEK LETTER" + - " NYAMEETEI MAYEK LETTER TTAMEETEI MAYEK LETTER TTHAMEETEI MAYEK LETTER D" + - "DAMEETEI MAYEK LETTER DDHAMEETEI MAYEK LETTER NNAMEETEI MAYEK LETTER SHA" + - "MEETEI MAYEK LETTER SSAMEETEI MAYEK VOWEL SIGN IIMEETEI MAYEK VOWEL SIGN" + - " UUMEETEI MAYEK VOWEL SIGN AAIMEETEI MAYEK VOWEL SIGN AUMEETEI MAYEK VOW" + - "EL SIGN AAUMEETEI MAYEK CHEIKHANMEETEI MAYEK AHANG KHUDAMMEETEI MAYEK AN" + - "JIMEETEI MAYEK SYLLABLE REPETITION MARKMEETEI MAYEK WORD REPETITION MARK" + - "MEETEI MAYEK VOWEL SIGN VISARGAMEETEI MAYEK VIRAMAETHIOPIC SYLLABLE TTHU" + - "ETHIOPIC SYLLABLE TTHIETHIOPIC SYLLABLE TTHAAETHIOPIC SYLLABLE TTHEEETHI" + - "OPIC SYLLABLE TTHEETHIOPIC SYLLABLE TTHOETHIOPIC SYLLABLE DDHUETHIOPIC S" + - "YLLABLE DDHIETHIOPIC SYLLABLE DDHAAETHIOPIC SYLLABLE DDHEEETHIOPIC SYLLA" + - "BLE DDHEETHIOPIC SYLLABLE DDHOETHIOPIC SYLLABLE DZUETHIOPIC SYLLABLE DZI" + - "ETHIOPIC SYLLABLE DZAAETHIOPIC SYLLABLE DZEEETHIOPIC SYLLABLE DZEETHIOPI" + - "C SYLLABLE DZOETHIOPIC SYLLABLE CCHHAETHIOPIC SYLLABLE CCHHUETHIOPIC SYL" + - "LABLE CCHHIETHIOPIC SYLLABLE CCHHAAETHIOPIC SYLLABLE CCHHEEETHIOPIC SYLL" + - "ABLE CCHHEETHIOPIC SYLLABLE CCHHOETHIOPIC SYLLABLE BBAETHIOPIC SYLLABLE " + - "BBUETHIOPIC SYLLABLE BBIETHIOPIC SYLLABLE BBAAETHIOPIC SYLLABLE BBEEETHI" + - "OPIC SYLLABLE BBEETHIOPIC SYLLABLE BBOLATIN SMALL LETTER BARRED ALPHALAT" + - "IN SMALL LETTER A REVERSED-SCHWALATIN SMALL LETTER BLACKLETTER ELATIN SM" + - "ALL LETTER BARRED ELATIN SMALL LETTER E WITH FLOURISHLATIN SMALL LETTER " + - "LENIS FLATIN SMALL LETTER SCRIPT G WITH CROSSED-TAILLATIN SMALL LETTER L" + - " WITH INVERTED LAZY SLATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDELATIN " + - "SMALL LETTER L WITH MIDDLE RINGLATIN SMALL LETTER M WITH CROSSED-TAILLAT" + - "IN SMALL LETTER N WITH CROSSED-TAILLATIN SMALL LETTER ENG WITH CROSSED-T" + - "AILLATIN SMALL LETTER BLACKLETTER OLATIN SMALL LETTER BLACKLETTER O WITH" + - " STROKELATIN SMALL LETTER OPEN O WITH STROKELATIN SMALL LETTER INVERTED " + - "OELATIN SMALL LETTER TURNED OE WITH STROKELATIN SMALL LETTER TURNED OE W" + - "ITH HORIZONTAL STROKELATIN SMALL LETTER TURNED O OPEN-OLATIN SMALL LETTE" + - "R TURNED O OPEN-O WITH STROKELATIN SMALL LETTER STIRRUP RLATIN LETTER SM" + - "ALL CAPITAL R WITH RIGHT LEGLATIN SMALL LETTER R WITHOUT HANDLELATIN SMA" + - "LL LETTER DOUBLE RLATIN SMALL LETTER R WITH CROSSED-TAILLATIN SMALL LETT" + - "ER DOUBLE R WITH CROSSED-TAILLATIN SMALL LETTER SCRIPT RLATIN SMALL LETT" + - "ER SCRIPT R WITH RINGLATIN SMALL LETTER BASELINE ESHLATIN SMALL LETTER U" + - " WITH SHORT RIGHT LEGLATIN SMALL LETTER U BAR WITH SHORT RIGHT LEGLATIN " + - "SMALL LETTER UILATIN SMALL LETTER TURNED UILATIN SMALL LETTER U WITH LEF" + - "T HOOKLATIN SMALL LETTER CHILATIN SMALL LETTER CHI WITH LOW RIGHT RINGLA" + - "TIN SMALL LETTER CHI WITH LOW LEFT SERIFLATIN SMALL LETTER X WITH LOW RI" + - "GHT RINGLATIN SMALL LETTER X WITH LONG LEFT LEGLATIN SMALL LETTER X WITH" + - " LONG LEFT LEG AND LOW RIGHT RINGLATIN SMALL LETTER X WITH LONG LEFT LEG" + - " WITH SERIFLATIN SMALL LETTER Y WITH SHORT RIGHT LEGMODIFIER BREVE WITH " + - "INVERTED BREVEMODIFIER LETTER SMALL HENGMODIFIER LETTER SMALL L WITH INV") + ("" + - "ERTED LAZY SMODIFIER LETTER SMALL L WITH MIDDLE TILDEMODIFIER LETTER SMA" + - "LL U WITH LEFT HOOKLATIN SMALL LETTER SAKHA YATLATIN SMALL LETTER IOTIFI" + - "ED ELATIN SMALL LETTER OPEN OELATIN SMALL LETTER UOLATIN SMALL LETTER IN" + - "VERTED ALPHAGREEK LETTER SMALL CAPITAL OMEGACHEROKEE SMALL LETTER ACHERO" + - "KEE SMALL LETTER ECHEROKEE SMALL LETTER ICHEROKEE SMALL LETTER OCHEROKEE" + - " SMALL LETTER UCHEROKEE SMALL LETTER VCHEROKEE SMALL LETTER GACHEROKEE S" + - "MALL LETTER KACHEROKEE SMALL LETTER GECHEROKEE SMALL LETTER GICHEROKEE S" + - "MALL LETTER GOCHEROKEE SMALL LETTER GUCHEROKEE SMALL LETTER GVCHEROKEE S" + - "MALL LETTER HACHEROKEE SMALL LETTER HECHEROKEE SMALL LETTER HICHEROKEE S" + - "MALL LETTER HOCHEROKEE SMALL LETTER HUCHEROKEE SMALL LETTER HVCHEROKEE S" + - "MALL LETTER LACHEROKEE SMALL LETTER LECHEROKEE SMALL LETTER LICHEROKEE S" + - "MALL LETTER LOCHEROKEE SMALL LETTER LUCHEROKEE SMALL LETTER LVCHEROKEE S" + - "MALL LETTER MACHEROKEE SMALL LETTER MECHEROKEE SMALL LETTER MICHEROKEE S" + - "MALL LETTER MOCHEROKEE SMALL LETTER MUCHEROKEE SMALL LETTER NACHEROKEE S" + - "MALL LETTER HNACHEROKEE SMALL LETTER NAHCHEROKEE SMALL LETTER NECHEROKEE" + - " SMALL LETTER NICHEROKEE SMALL LETTER NOCHEROKEE SMALL LETTER NUCHEROKEE" + - " SMALL LETTER NVCHEROKEE SMALL LETTER QUACHEROKEE SMALL LETTER QUECHEROK" + - "EE SMALL LETTER QUICHEROKEE SMALL LETTER QUOCHEROKEE SMALL LETTER QUUCHE" + - "ROKEE SMALL LETTER QUVCHEROKEE SMALL LETTER SACHEROKEE SMALL LETTER SCHE" + - "ROKEE SMALL LETTER SECHEROKEE SMALL LETTER SICHEROKEE SMALL LETTER SOCHE" + - "ROKEE SMALL LETTER SUCHEROKEE SMALL LETTER SVCHEROKEE SMALL LETTER DACHE" + - "ROKEE SMALL LETTER TACHEROKEE SMALL LETTER DECHEROKEE SMALL LETTER TECHE" + - "ROKEE SMALL LETTER DICHEROKEE SMALL LETTER TICHEROKEE SMALL LETTER DOCHE" + - "ROKEE SMALL LETTER DUCHEROKEE SMALL LETTER DVCHEROKEE SMALL LETTER DLACH" + - "EROKEE SMALL LETTER TLACHEROKEE SMALL LETTER TLECHEROKEE SMALL LETTER TL" + - "ICHEROKEE SMALL LETTER TLOCHEROKEE SMALL LETTER TLUCHEROKEE SMALL LETTER" + - " TLVCHEROKEE SMALL LETTER TSACHEROKEE SMALL LETTER TSECHEROKEE SMALL LET" + - "TER TSICHEROKEE SMALL LETTER TSOCHEROKEE SMALL LETTER TSUCHEROKEE SMALL " + - "LETTER TSVCHEROKEE SMALL LETTER WACHEROKEE SMALL LETTER WECHEROKEE SMALL" + - " LETTER WICHEROKEE SMALL LETTER WOCHEROKEE SMALL LETTER WUCHEROKEE SMALL" + - " LETTER WVCHEROKEE SMALL LETTER YAMEETEI MAYEK LETTER KOKMEETEI MAYEK LE" + - "TTER SAMMEETEI MAYEK LETTER LAIMEETEI MAYEK LETTER MITMEETEI MAYEK LETTE" + - "R PAMEETEI MAYEK LETTER NAMEETEI MAYEK LETTER CHILMEETEI MAYEK LETTER TI" + - "LMEETEI MAYEK LETTER KHOUMEETEI MAYEK LETTER NGOUMEETEI MAYEK LETTER THO" + - "UMEETEI MAYEK LETTER WAIMEETEI MAYEK LETTER YANGMEETEI MAYEK LETTER HUKM" + - "EETEI MAYEK LETTER UNMEETEI MAYEK LETTER IMEETEI MAYEK LETTER PHAMMEETEI" + - " MAYEK LETTER ATIYAMEETEI MAYEK LETTER GOKMEETEI MAYEK LETTER JHAMMEETEI" + - " MAYEK LETTER RAIMEETEI MAYEK LETTER BAMEETEI MAYEK LETTER JILMEETEI MAY" + - "EK LETTER DILMEETEI MAYEK LETTER GHOUMEETEI MAYEK LETTER DHOUMEETEI MAYE" + - "K LETTER BHAMMEETEI MAYEK LETTER KOK LONSUMMEETEI MAYEK LETTER LAI LONSU" + - "MMEETEI MAYEK LETTER MIT LONSUMMEETEI MAYEK LETTER PA LONSUMMEETEI MAYEK" + - " LETTER NA LONSUMMEETEI MAYEK LETTER TIL LONSUMMEETEI MAYEK LETTER NGOU " + - "LONSUMMEETEI MAYEK LETTER I LONSUMMEETEI MAYEK VOWEL SIGN ONAPMEETEI MAY" + - "EK VOWEL SIGN INAPMEETEI MAYEK VOWEL SIGN ANAPMEETEI MAYEK VOWEL SIGN YE" + - "NAPMEETEI MAYEK VOWEL SIGN SOUNAPMEETEI MAYEK VOWEL SIGN UNAPMEETEI MAYE" + - "K VOWEL SIGN CHEINAPMEETEI MAYEK VOWEL SIGN NUNGMEETEI MAYEK CHEIKHEIMEE" + - "TEI MAYEK LUM IYEKMEETEI MAYEK APUN IYEKMEETEI MAYEK DIGIT ZEROMEETEI MA" + - "YEK DIGIT ONEMEETEI MAYEK DIGIT TWOMEETEI MAYEK DIGIT THREEMEETEI MAYEK " + - "DIGIT FOURMEETEI MAYEK DIGIT FIVEMEETEI MAYEK DIGIT SIXMEETEI MAYEK DIGI" + - "T SEVENMEETEI MAYEK DIGIT EIGHTMEETEI MAYEK DIGIT NINEHANGUL JUNGSEONG O" + - "-YEOHANGUL JUNGSEONG O-O-IHANGUL JUNGSEONG YO-AHANGUL JUNGSEONG YO-AEHAN" + - "GUL JUNGSEONG YO-EOHANGUL JUNGSEONG U-YEOHANGUL JUNGSEONG U-I-IHANGUL JU" + - "NGSEONG YU-AEHANGUL JUNGSEONG YU-OHANGUL JUNGSEONG EU-AHANGUL JUNGSEONG " + - "EU-EOHANGUL JUNGSEONG EU-EHANGUL JUNGSEONG EU-OHANGUL JUNGSEONG I-YA-OHA" + - "NGUL JUNGSEONG I-YAEHANGUL JUNGSEONG I-YEOHANGUL JUNGSEONG I-YEHANGUL JU" + - "NGSEONG I-O-IHANGUL JUNGSEONG I-YOHANGUL JUNGSEONG I-YUHANGUL JUNGSEONG " + - "I-IHANGUL JUNGSEONG ARAEA-AHANGUL JUNGSEONG ARAEA-EHANGUL JONGSEONG NIEU" + - "N-RIEULHANGUL JONGSEONG NIEUN-CHIEUCHHANGUL JONGSEONG SSANGTIKEUTHANGUL " + - "JONGSEONG SSANGTIKEUT-PIEUPHANGUL JONGSEONG TIKEUT-PIEUPHANGUL JONGSEONG" + - " TIKEUT-SIOSHANGUL JONGSEONG TIKEUT-SIOS-KIYEOKHANGUL JONGSEONG TIKEUT-C" + - "IEUCHANGUL JONGSEONG TIKEUT-CHIEUCHHANGUL JONGSEONG TIKEUT-THIEUTHHANGUL" + - " JONGSEONG RIEUL-SSANGKIYEOKHANGUL JONGSEONG RIEUL-KIYEOK-HIEUHHANGUL JO" + - "NGSEONG SSANGRIEUL-KHIEUKHHANGUL JONGSEONG RIEUL-MIEUM-HIEUHHANGUL JONGS" + - "EONG RIEUL-PIEUP-TIKEUTHANGUL JONGSEONG RIEUL-PIEUP-PHIEUPHHANGUL JONGSE") + ("" + - "ONG RIEUL-YESIEUNGHANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUHHANGUL JONGSEO" + - "NG KAPYEOUNRIEULHANGUL JONGSEONG MIEUM-NIEUNHANGUL JONGSEONG MIEUM-SSANG" + - "NIEUNHANGUL JONGSEONG SSANGMIEUMHANGUL JONGSEONG MIEUM-PIEUP-SIOSHANGUL " + - "JONGSEONG MIEUM-CIEUCHANGUL JONGSEONG PIEUP-TIKEUTHANGUL JONGSEONG PIEUP" + - "-RIEUL-PHIEUPHHANGUL JONGSEONG PIEUP-MIEUMHANGUL JONGSEONG SSANGPIEUPHAN" + - "GUL JONGSEONG PIEUP-SIOS-TIKEUTHANGUL JONGSEONG PIEUP-CIEUCHANGUL JONGSE" + - "ONG PIEUP-CHIEUCHHANGUL JONGSEONG SIOS-MIEUMHANGUL JONGSEONG SIOS-KAPYEO" + - "UNPIEUPHANGUL JONGSEONG SSANGSIOS-KIYEOKHANGUL JONGSEONG SSANGSIOS-TIKEU" + - "THANGUL JONGSEONG SIOS-PANSIOSHANGUL JONGSEONG SIOS-CIEUCHANGUL JONGSEON" + - "G SIOS-CHIEUCHHANGUL JONGSEONG SIOS-THIEUTHHANGUL JONGSEONG SIOS-HIEUHHA" + - "NGUL JONGSEONG PANSIOS-PIEUPHANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUPHANGUL" + - " JONGSEONG YESIEUNG-MIEUMHANGUL JONGSEONG YESIEUNG-HIEUHHANGUL JONGSEONG" + - " CIEUC-PIEUPHANGUL JONGSEONG CIEUC-SSANGPIEUPHANGUL JONGSEONG SSANGCIEUC" + - "HANGUL JONGSEONG PHIEUPH-SIOSHANGUL JONGSEONG PHIEUPH-THIEUTHCJK COMPATI" + - "BILITY IDEOGRAPH-F900CJK COMPATIBILITY IDEOGRAPH-F901CJK COMPATIBILITY I" + - "DEOGRAPH-F902CJK COMPATIBILITY IDEOGRAPH-F903CJK COMPATIBILITY IDEOGRAPH" + - "-F904CJK COMPATIBILITY IDEOGRAPH-F905CJK COMPATIBILITY IDEOGRAPH-F906CJK" + - " COMPATIBILITY IDEOGRAPH-F907CJK COMPATIBILITY IDEOGRAPH-F908CJK COMPATI" + - "BILITY IDEOGRAPH-F909CJK COMPATIBILITY IDEOGRAPH-F90ACJK COMPATIBILITY I" + - "DEOGRAPH-F90BCJK COMPATIBILITY IDEOGRAPH-F90CCJK COMPATIBILITY IDEOGRAPH" + - "-F90DCJK COMPATIBILITY IDEOGRAPH-F90ECJK COMPATIBILITY IDEOGRAPH-F90FCJK" + - " COMPATIBILITY IDEOGRAPH-F910CJK COMPATIBILITY IDEOGRAPH-F911CJK COMPATI" + - "BILITY IDEOGRAPH-F912CJK COMPATIBILITY IDEOGRAPH-F913CJK COMPATIBILITY I" + - "DEOGRAPH-F914CJK COMPATIBILITY IDEOGRAPH-F915CJK COMPATIBILITY IDEOGRAPH" + - "-F916CJK COMPATIBILITY IDEOGRAPH-F917CJK COMPATIBILITY IDEOGRAPH-F918CJK" + - " COMPATIBILITY IDEOGRAPH-F919CJK COMPATIBILITY IDEOGRAPH-F91ACJK COMPATI" + - "BILITY IDEOGRAPH-F91BCJK COMPATIBILITY IDEOGRAPH-F91CCJK COMPATIBILITY I" + - "DEOGRAPH-F91DCJK COMPATIBILITY IDEOGRAPH-F91ECJK COMPATIBILITY IDEOGRAPH" + - "-F91FCJK COMPATIBILITY IDEOGRAPH-F920CJK COMPATIBILITY IDEOGRAPH-F921CJK" + - " COMPATIBILITY IDEOGRAPH-F922CJK COMPATIBILITY IDEOGRAPH-F923CJK COMPATI" + - "BILITY IDEOGRAPH-F924CJK COMPATIBILITY IDEOGRAPH-F925CJK COMPATIBILITY I" + - "DEOGRAPH-F926CJK COMPATIBILITY IDEOGRAPH-F927CJK COMPATIBILITY IDEOGRAPH" + - "-F928CJK COMPATIBILITY IDEOGRAPH-F929CJK COMPATIBILITY IDEOGRAPH-F92ACJK" + - " COMPATIBILITY IDEOGRAPH-F92BCJK COMPATIBILITY IDEOGRAPH-F92CCJK COMPATI" + - "BILITY IDEOGRAPH-F92DCJK COMPATIBILITY IDEOGRAPH-F92ECJK COMPATIBILITY I" + - "DEOGRAPH-F92FCJK COMPATIBILITY IDEOGRAPH-F930CJK COMPATIBILITY IDEOGRAPH" + - "-F931CJK COMPATIBILITY IDEOGRAPH-F932CJK COMPATIBILITY IDEOGRAPH-F933CJK" + - " COMPATIBILITY IDEOGRAPH-F934CJK COMPATIBILITY IDEOGRAPH-F935CJK COMPATI" + - "BILITY IDEOGRAPH-F936CJK COMPATIBILITY IDEOGRAPH-F937CJK COMPATIBILITY I" + - "DEOGRAPH-F938CJK COMPATIBILITY IDEOGRAPH-F939CJK COMPATIBILITY IDEOGRAPH" + - "-F93ACJK COMPATIBILITY IDEOGRAPH-F93BCJK COMPATIBILITY IDEOGRAPH-F93CCJK" + - " COMPATIBILITY IDEOGRAPH-F93DCJK COMPATIBILITY IDEOGRAPH-F93ECJK COMPATI" + - "BILITY IDEOGRAPH-F93FCJK COMPATIBILITY IDEOGRAPH-F940CJK COMPATIBILITY I" + - "DEOGRAPH-F941CJK COMPATIBILITY IDEOGRAPH-F942CJK COMPATIBILITY IDEOGRAPH" + - "-F943CJK COMPATIBILITY IDEOGRAPH-F944CJK COMPATIBILITY IDEOGRAPH-F945CJK" + - " COMPATIBILITY IDEOGRAPH-F946CJK COMPATIBILITY IDEOGRAPH-F947CJK COMPATI" + - "BILITY IDEOGRAPH-F948CJK COMPATIBILITY IDEOGRAPH-F949CJK COMPATIBILITY I" + - "DEOGRAPH-F94ACJK COMPATIBILITY IDEOGRAPH-F94BCJK COMPATIBILITY IDEOGRAPH" + - "-F94CCJK COMPATIBILITY IDEOGRAPH-F94DCJK COMPATIBILITY IDEOGRAPH-F94ECJK" + - " COMPATIBILITY IDEOGRAPH-F94FCJK COMPATIBILITY IDEOGRAPH-F950CJK COMPATI" + - "BILITY IDEOGRAPH-F951CJK COMPATIBILITY IDEOGRAPH-F952CJK COMPATIBILITY I" + - "DEOGRAPH-F953CJK COMPATIBILITY IDEOGRAPH-F954CJK COMPATIBILITY IDEOGRAPH" + - "-F955CJK COMPATIBILITY IDEOGRAPH-F956CJK COMPATIBILITY IDEOGRAPH-F957CJK" + - " COMPATIBILITY IDEOGRAPH-F958CJK COMPATIBILITY IDEOGRAPH-F959CJK COMPATI" + - "BILITY IDEOGRAPH-F95ACJK COMPATIBILITY IDEOGRAPH-F95BCJK COMPATIBILITY I" + - "DEOGRAPH-F95CCJK COMPATIBILITY IDEOGRAPH-F95DCJK COMPATIBILITY IDEOGRAPH" + - "-F95ECJK COMPATIBILITY IDEOGRAPH-F95FCJK COMPATIBILITY IDEOGRAPH-F960CJK" + - " COMPATIBILITY IDEOGRAPH-F961CJK COMPATIBILITY IDEOGRAPH-F962CJK COMPATI" + - "BILITY IDEOGRAPH-F963CJK COMPATIBILITY IDEOGRAPH-F964CJK COMPATIBILITY I" + - "DEOGRAPH-F965CJK COMPATIBILITY IDEOGRAPH-F966CJK COMPATIBILITY IDEOGRAPH" + - "-F967CJK COMPATIBILITY IDEOGRAPH-F968CJK COMPATIBILITY IDEOGRAPH-F969CJK" + - " COMPATIBILITY IDEOGRAPH-F96ACJK COMPATIBILITY IDEOGRAPH-F96BCJK COMPATI" + - "BILITY IDEOGRAPH-F96CCJK COMPATIBILITY IDEOGRAPH-F96DCJK COMPATIBILITY I" + - "DEOGRAPH-F96ECJK COMPATIBILITY IDEOGRAPH-F96FCJK COMPATIBILITY IDEOGRAPH") + ("" + - "-F970CJK COMPATIBILITY IDEOGRAPH-F971CJK COMPATIBILITY IDEOGRAPH-F972CJK" + - " COMPATIBILITY IDEOGRAPH-F973CJK COMPATIBILITY IDEOGRAPH-F974CJK COMPATI" + - "BILITY IDEOGRAPH-F975CJK COMPATIBILITY IDEOGRAPH-F976CJK COMPATIBILITY I" + - "DEOGRAPH-F977CJK COMPATIBILITY IDEOGRAPH-F978CJK COMPATIBILITY IDEOGRAPH" + - "-F979CJK COMPATIBILITY IDEOGRAPH-F97ACJK COMPATIBILITY IDEOGRAPH-F97BCJK" + - " COMPATIBILITY IDEOGRAPH-F97CCJK COMPATIBILITY IDEOGRAPH-F97DCJK COMPATI" + - "BILITY IDEOGRAPH-F97ECJK COMPATIBILITY IDEOGRAPH-F97FCJK COMPATIBILITY I" + - "DEOGRAPH-F980CJK COMPATIBILITY IDEOGRAPH-F981CJK COMPATIBILITY IDEOGRAPH" + - "-F982CJK COMPATIBILITY IDEOGRAPH-F983CJK COMPATIBILITY IDEOGRAPH-F984CJK" + - " COMPATIBILITY IDEOGRAPH-F985CJK COMPATIBILITY IDEOGRAPH-F986CJK COMPATI" + - "BILITY IDEOGRAPH-F987CJK COMPATIBILITY IDEOGRAPH-F988CJK COMPATIBILITY I" + - "DEOGRAPH-F989CJK COMPATIBILITY IDEOGRAPH-F98ACJK COMPATIBILITY IDEOGRAPH" + - "-F98BCJK COMPATIBILITY IDEOGRAPH-F98CCJK COMPATIBILITY IDEOGRAPH-F98DCJK" + - " COMPATIBILITY IDEOGRAPH-F98ECJK COMPATIBILITY IDEOGRAPH-F98FCJK COMPATI" + - "BILITY IDEOGRAPH-F990CJK COMPATIBILITY IDEOGRAPH-F991CJK COMPATIBILITY I" + - "DEOGRAPH-F992CJK COMPATIBILITY IDEOGRAPH-F993CJK COMPATIBILITY IDEOGRAPH" + - "-F994CJK COMPATIBILITY IDEOGRAPH-F995CJK COMPATIBILITY IDEOGRAPH-F996CJK" + - " COMPATIBILITY IDEOGRAPH-F997CJK COMPATIBILITY IDEOGRAPH-F998CJK COMPATI" + - "BILITY IDEOGRAPH-F999CJK COMPATIBILITY IDEOGRAPH-F99ACJK COMPATIBILITY I" + - "DEOGRAPH-F99BCJK COMPATIBILITY IDEOGRAPH-F99CCJK COMPATIBILITY IDEOGRAPH" + - "-F99DCJK COMPATIBILITY IDEOGRAPH-F99ECJK COMPATIBILITY IDEOGRAPH-F99FCJK" + - " COMPATIBILITY IDEOGRAPH-F9A0CJK COMPATIBILITY IDEOGRAPH-F9A1CJK COMPATI" + - "BILITY IDEOGRAPH-F9A2CJK COMPATIBILITY IDEOGRAPH-F9A3CJK COMPATIBILITY I" + - "DEOGRAPH-F9A4CJK COMPATIBILITY IDEOGRAPH-F9A5CJK COMPATIBILITY IDEOGRAPH" + - "-F9A6CJK COMPATIBILITY IDEOGRAPH-F9A7CJK COMPATIBILITY IDEOGRAPH-F9A8CJK" + - " COMPATIBILITY IDEOGRAPH-F9A9CJK COMPATIBILITY IDEOGRAPH-F9AACJK COMPATI" + - "BILITY IDEOGRAPH-F9ABCJK COMPATIBILITY IDEOGRAPH-F9ACCJK COMPATIBILITY I" + - "DEOGRAPH-F9ADCJK COMPATIBILITY IDEOGRAPH-F9AECJK COMPATIBILITY IDEOGRAPH" + - "-F9AFCJK COMPATIBILITY IDEOGRAPH-F9B0CJK COMPATIBILITY IDEOGRAPH-F9B1CJK" + - " COMPATIBILITY IDEOGRAPH-F9B2CJK COMPATIBILITY IDEOGRAPH-F9B3CJK COMPATI" + - "BILITY IDEOGRAPH-F9B4CJK COMPATIBILITY IDEOGRAPH-F9B5CJK COMPATIBILITY I" + - "DEOGRAPH-F9B6CJK COMPATIBILITY IDEOGRAPH-F9B7CJK COMPATIBILITY IDEOGRAPH" + - "-F9B8CJK COMPATIBILITY IDEOGRAPH-F9B9CJK COMPATIBILITY IDEOGRAPH-F9BACJK" + - " COMPATIBILITY IDEOGRAPH-F9BBCJK COMPATIBILITY IDEOGRAPH-F9BCCJK COMPATI" + - "BILITY IDEOGRAPH-F9BDCJK COMPATIBILITY IDEOGRAPH-F9BECJK COMPATIBILITY I" + - "DEOGRAPH-F9BFCJK COMPATIBILITY IDEOGRAPH-F9C0CJK COMPATIBILITY IDEOGRAPH" + - "-F9C1CJK COMPATIBILITY IDEOGRAPH-F9C2CJK COMPATIBILITY IDEOGRAPH-F9C3CJK" + - " COMPATIBILITY IDEOGRAPH-F9C4CJK COMPATIBILITY IDEOGRAPH-F9C5CJK COMPATI" + - "BILITY IDEOGRAPH-F9C6CJK COMPATIBILITY IDEOGRAPH-F9C7CJK COMPATIBILITY I" + - "DEOGRAPH-F9C8CJK COMPATIBILITY IDEOGRAPH-F9C9CJK COMPATIBILITY IDEOGRAPH" + - "-F9CACJK COMPATIBILITY IDEOGRAPH-F9CBCJK COMPATIBILITY IDEOGRAPH-F9CCCJK" + - " COMPATIBILITY IDEOGRAPH-F9CDCJK COMPATIBILITY IDEOGRAPH-F9CECJK COMPATI" + - "BILITY IDEOGRAPH-F9CFCJK COMPATIBILITY IDEOGRAPH-F9D0CJK COMPATIBILITY I" + - "DEOGRAPH-F9D1CJK COMPATIBILITY IDEOGRAPH-F9D2CJK COMPATIBILITY IDEOGRAPH" + - "-F9D3CJK COMPATIBILITY IDEOGRAPH-F9D4CJK COMPATIBILITY IDEOGRAPH-F9D5CJK" + - " COMPATIBILITY IDEOGRAPH-F9D6CJK COMPATIBILITY IDEOGRAPH-F9D7CJK COMPATI" + - "BILITY IDEOGRAPH-F9D8CJK COMPATIBILITY IDEOGRAPH-F9D9CJK COMPATIBILITY I" + - "DEOGRAPH-F9DACJK COMPATIBILITY IDEOGRAPH-F9DBCJK COMPATIBILITY IDEOGRAPH" + - "-F9DCCJK COMPATIBILITY IDEOGRAPH-F9DDCJK COMPATIBILITY IDEOGRAPH-F9DECJK" + - " COMPATIBILITY IDEOGRAPH-F9DFCJK COMPATIBILITY IDEOGRAPH-F9E0CJK COMPATI" + - "BILITY IDEOGRAPH-F9E1CJK COMPATIBILITY IDEOGRAPH-F9E2CJK COMPATIBILITY I" + - "DEOGRAPH-F9E3CJK COMPATIBILITY IDEOGRAPH-F9E4CJK COMPATIBILITY IDEOGRAPH" + - "-F9E5CJK COMPATIBILITY IDEOGRAPH-F9E6CJK COMPATIBILITY IDEOGRAPH-F9E7CJK" + - " COMPATIBILITY IDEOGRAPH-F9E8CJK COMPATIBILITY IDEOGRAPH-F9E9CJK COMPATI" + - "BILITY IDEOGRAPH-F9EACJK COMPATIBILITY IDEOGRAPH-F9EBCJK COMPATIBILITY I" + - "DEOGRAPH-F9ECCJK COMPATIBILITY IDEOGRAPH-F9EDCJK COMPATIBILITY IDEOGRAPH" + - "-F9EECJK COMPATIBILITY IDEOGRAPH-F9EFCJK COMPATIBILITY IDEOGRAPH-F9F0CJK" + - " COMPATIBILITY IDEOGRAPH-F9F1CJK COMPATIBILITY IDEOGRAPH-F9F2CJK COMPATI" + - "BILITY IDEOGRAPH-F9F3CJK COMPATIBILITY IDEOGRAPH-F9F4CJK COMPATIBILITY I" + - "DEOGRAPH-F9F5CJK COMPATIBILITY IDEOGRAPH-F9F6CJK COMPATIBILITY IDEOGRAPH" + - "-F9F7CJK COMPATIBILITY IDEOGRAPH-F9F8CJK COMPATIBILITY IDEOGRAPH-F9F9CJK" + - " COMPATIBILITY IDEOGRAPH-F9FACJK COMPATIBILITY IDEOGRAPH-F9FBCJK COMPATI" + - "BILITY IDEOGRAPH-F9FCCJK COMPATIBILITY IDEOGRAPH-F9FDCJK COMPATIBILITY I" + - "DEOGRAPH-F9FECJK COMPATIBILITY IDEOGRAPH-F9FFCJK COMPATIBILITY IDEOGRAPH") + ("" + - "-FA00CJK COMPATIBILITY IDEOGRAPH-FA01CJK COMPATIBILITY IDEOGRAPH-FA02CJK" + - " COMPATIBILITY IDEOGRAPH-FA03CJK COMPATIBILITY IDEOGRAPH-FA04CJK COMPATI" + - "BILITY IDEOGRAPH-FA05CJK COMPATIBILITY IDEOGRAPH-FA06CJK COMPATIBILITY I" + - "DEOGRAPH-FA07CJK COMPATIBILITY IDEOGRAPH-FA08CJK COMPATIBILITY IDEOGRAPH" + - "-FA09CJK COMPATIBILITY IDEOGRAPH-FA0ACJK COMPATIBILITY IDEOGRAPH-FA0BCJK" + - " COMPATIBILITY IDEOGRAPH-FA0CCJK COMPATIBILITY IDEOGRAPH-FA0DCJK COMPATI" + - "BILITY IDEOGRAPH-FA0ECJK COMPATIBILITY IDEOGRAPH-FA0FCJK COMPATIBILITY I" + - "DEOGRAPH-FA10CJK COMPATIBILITY IDEOGRAPH-FA11CJK COMPATIBILITY IDEOGRAPH" + - "-FA12CJK COMPATIBILITY IDEOGRAPH-FA13CJK COMPATIBILITY IDEOGRAPH-FA14CJK" + - " COMPATIBILITY IDEOGRAPH-FA15CJK COMPATIBILITY IDEOGRAPH-FA16CJK COMPATI" + - "BILITY IDEOGRAPH-FA17CJK COMPATIBILITY IDEOGRAPH-FA18CJK COMPATIBILITY I" + - "DEOGRAPH-FA19CJK COMPATIBILITY IDEOGRAPH-FA1ACJK COMPATIBILITY IDEOGRAPH" + - "-FA1BCJK COMPATIBILITY IDEOGRAPH-FA1CCJK COMPATIBILITY IDEOGRAPH-FA1DCJK" + - " COMPATIBILITY IDEOGRAPH-FA1ECJK COMPATIBILITY IDEOGRAPH-FA1FCJK COMPATI" + - "BILITY IDEOGRAPH-FA20CJK COMPATIBILITY IDEOGRAPH-FA21CJK COMPATIBILITY I" + - "DEOGRAPH-FA22CJK COMPATIBILITY IDEOGRAPH-FA23CJK COMPATIBILITY IDEOGRAPH" + - "-FA24CJK COMPATIBILITY IDEOGRAPH-FA25CJK COMPATIBILITY IDEOGRAPH-FA26CJK" + - " COMPATIBILITY IDEOGRAPH-FA27CJK COMPATIBILITY IDEOGRAPH-FA28CJK COMPATI" + - "BILITY IDEOGRAPH-FA29CJK COMPATIBILITY IDEOGRAPH-FA2ACJK COMPATIBILITY I" + - "DEOGRAPH-FA2BCJK COMPATIBILITY IDEOGRAPH-FA2CCJK COMPATIBILITY IDEOGRAPH" + - "-FA2DCJK COMPATIBILITY IDEOGRAPH-FA2ECJK COMPATIBILITY IDEOGRAPH-FA2FCJK" + - " COMPATIBILITY IDEOGRAPH-FA30CJK COMPATIBILITY IDEOGRAPH-FA31CJK COMPATI" + - "BILITY IDEOGRAPH-FA32CJK COMPATIBILITY IDEOGRAPH-FA33CJK COMPATIBILITY I" + - "DEOGRAPH-FA34CJK COMPATIBILITY IDEOGRAPH-FA35CJK COMPATIBILITY IDEOGRAPH" + - "-FA36CJK COMPATIBILITY IDEOGRAPH-FA37CJK COMPATIBILITY IDEOGRAPH-FA38CJK" + - " COMPATIBILITY IDEOGRAPH-FA39CJK COMPATIBILITY IDEOGRAPH-FA3ACJK COMPATI" + - "BILITY IDEOGRAPH-FA3BCJK COMPATIBILITY IDEOGRAPH-FA3CCJK COMPATIBILITY I" + - "DEOGRAPH-FA3DCJK COMPATIBILITY IDEOGRAPH-FA3ECJK COMPATIBILITY IDEOGRAPH" + - "-FA3FCJK COMPATIBILITY IDEOGRAPH-FA40CJK COMPATIBILITY IDEOGRAPH-FA41CJK" + - " COMPATIBILITY IDEOGRAPH-FA42CJK COMPATIBILITY IDEOGRAPH-FA43CJK COMPATI" + - "BILITY IDEOGRAPH-FA44CJK COMPATIBILITY IDEOGRAPH-FA45CJK COMPATIBILITY I" + - "DEOGRAPH-FA46CJK COMPATIBILITY IDEOGRAPH-FA47CJK COMPATIBILITY IDEOGRAPH" + - "-FA48CJK COMPATIBILITY IDEOGRAPH-FA49CJK COMPATIBILITY IDEOGRAPH-FA4ACJK" + - " COMPATIBILITY IDEOGRAPH-FA4BCJK COMPATIBILITY IDEOGRAPH-FA4CCJK COMPATI" + - "BILITY IDEOGRAPH-FA4DCJK COMPATIBILITY IDEOGRAPH-FA4ECJK COMPATIBILITY I" + - "DEOGRAPH-FA4FCJK COMPATIBILITY IDEOGRAPH-FA50CJK COMPATIBILITY IDEOGRAPH" + - "-FA51CJK COMPATIBILITY IDEOGRAPH-FA52CJK COMPATIBILITY IDEOGRAPH-FA53CJK" + - " COMPATIBILITY IDEOGRAPH-FA54CJK COMPATIBILITY IDEOGRAPH-FA55CJK COMPATI" + - "BILITY IDEOGRAPH-FA56CJK COMPATIBILITY IDEOGRAPH-FA57CJK COMPATIBILITY I" + - "DEOGRAPH-FA58CJK COMPATIBILITY IDEOGRAPH-FA59CJK COMPATIBILITY IDEOGRAPH" + - "-FA5ACJK COMPATIBILITY IDEOGRAPH-FA5BCJK COMPATIBILITY IDEOGRAPH-FA5CCJK" + - " COMPATIBILITY IDEOGRAPH-FA5DCJK COMPATIBILITY IDEOGRAPH-FA5ECJK COMPATI" + - "BILITY IDEOGRAPH-FA5FCJK COMPATIBILITY IDEOGRAPH-FA60CJK COMPATIBILITY I" + - "DEOGRAPH-FA61CJK COMPATIBILITY IDEOGRAPH-FA62CJK COMPATIBILITY IDEOGRAPH" + - "-FA63CJK COMPATIBILITY IDEOGRAPH-FA64CJK COMPATIBILITY IDEOGRAPH-FA65CJK" + - " COMPATIBILITY IDEOGRAPH-FA66CJK COMPATIBILITY IDEOGRAPH-FA67CJK COMPATI" + - "BILITY IDEOGRAPH-FA68CJK COMPATIBILITY IDEOGRAPH-FA69CJK COMPATIBILITY I" + - "DEOGRAPH-FA6ACJK COMPATIBILITY IDEOGRAPH-FA6BCJK COMPATIBILITY IDEOGRAPH" + - "-FA6CCJK COMPATIBILITY IDEOGRAPH-FA6DCJK COMPATIBILITY IDEOGRAPH-FA70CJK" + - " COMPATIBILITY IDEOGRAPH-FA71CJK COMPATIBILITY IDEOGRAPH-FA72CJK COMPATI" + - "BILITY IDEOGRAPH-FA73CJK COMPATIBILITY IDEOGRAPH-FA74CJK COMPATIBILITY I" + - "DEOGRAPH-FA75CJK COMPATIBILITY IDEOGRAPH-FA76CJK COMPATIBILITY IDEOGRAPH" + - "-FA77CJK COMPATIBILITY IDEOGRAPH-FA78CJK COMPATIBILITY IDEOGRAPH-FA79CJK" + - " COMPATIBILITY IDEOGRAPH-FA7ACJK COMPATIBILITY IDEOGRAPH-FA7BCJK COMPATI" + - "BILITY IDEOGRAPH-FA7CCJK COMPATIBILITY IDEOGRAPH-FA7DCJK COMPATIBILITY I" + - "DEOGRAPH-FA7ECJK COMPATIBILITY IDEOGRAPH-FA7FCJK COMPATIBILITY IDEOGRAPH" + - "-FA80CJK COMPATIBILITY IDEOGRAPH-FA81CJK COMPATIBILITY IDEOGRAPH-FA82CJK" + - " COMPATIBILITY IDEOGRAPH-FA83CJK COMPATIBILITY IDEOGRAPH-FA84CJK COMPATI" + - "BILITY IDEOGRAPH-FA85CJK COMPATIBILITY IDEOGRAPH-FA86CJK COMPATIBILITY I" + - "DEOGRAPH-FA87CJK COMPATIBILITY IDEOGRAPH-FA88CJK COMPATIBILITY IDEOGRAPH" + - "-FA89CJK COMPATIBILITY IDEOGRAPH-FA8ACJK COMPATIBILITY IDEOGRAPH-FA8BCJK" + - " COMPATIBILITY IDEOGRAPH-FA8CCJK COMPATIBILITY IDEOGRAPH-FA8DCJK COMPATI" + - "BILITY IDEOGRAPH-FA8ECJK COMPATIBILITY IDEOGRAPH-FA8FCJK COMPATIBILITY I" + - "DEOGRAPH-FA90CJK COMPATIBILITY IDEOGRAPH-FA91CJK COMPATIBILITY IDEOGRAPH") + ("" + - "-FA92CJK COMPATIBILITY IDEOGRAPH-FA93CJK COMPATIBILITY IDEOGRAPH-FA94CJK" + - " COMPATIBILITY IDEOGRAPH-FA95CJK COMPATIBILITY IDEOGRAPH-FA96CJK COMPATI" + - "BILITY IDEOGRAPH-FA97CJK COMPATIBILITY IDEOGRAPH-FA98CJK COMPATIBILITY I" + - "DEOGRAPH-FA99CJK COMPATIBILITY IDEOGRAPH-FA9ACJK COMPATIBILITY IDEOGRAPH" + - "-FA9BCJK COMPATIBILITY IDEOGRAPH-FA9CCJK COMPATIBILITY IDEOGRAPH-FA9DCJK" + - " COMPATIBILITY IDEOGRAPH-FA9ECJK COMPATIBILITY IDEOGRAPH-FA9FCJK COMPATI" + - "BILITY IDEOGRAPH-FAA0CJK COMPATIBILITY IDEOGRAPH-FAA1CJK COMPATIBILITY I" + - "DEOGRAPH-FAA2CJK COMPATIBILITY IDEOGRAPH-FAA3CJK COMPATIBILITY IDEOGRAPH" + - "-FAA4CJK COMPATIBILITY IDEOGRAPH-FAA5CJK COMPATIBILITY IDEOGRAPH-FAA6CJK" + - " COMPATIBILITY IDEOGRAPH-FAA7CJK COMPATIBILITY IDEOGRAPH-FAA8CJK COMPATI" + - "BILITY IDEOGRAPH-FAA9CJK COMPATIBILITY IDEOGRAPH-FAAACJK COMPATIBILITY I" + - "DEOGRAPH-FAABCJK COMPATIBILITY IDEOGRAPH-FAACCJK COMPATIBILITY IDEOGRAPH" + - "-FAADCJK COMPATIBILITY IDEOGRAPH-FAAECJK COMPATIBILITY IDEOGRAPH-FAAFCJK" + - " COMPATIBILITY IDEOGRAPH-FAB0CJK COMPATIBILITY IDEOGRAPH-FAB1CJK COMPATI" + - "BILITY IDEOGRAPH-FAB2CJK COMPATIBILITY IDEOGRAPH-FAB3CJK COMPATIBILITY I" + - "DEOGRAPH-FAB4CJK COMPATIBILITY IDEOGRAPH-FAB5CJK COMPATIBILITY IDEOGRAPH" + - "-FAB6CJK COMPATIBILITY IDEOGRAPH-FAB7CJK COMPATIBILITY IDEOGRAPH-FAB8CJK" + - " COMPATIBILITY IDEOGRAPH-FAB9CJK COMPATIBILITY IDEOGRAPH-FABACJK COMPATI" + - "BILITY IDEOGRAPH-FABBCJK COMPATIBILITY IDEOGRAPH-FABCCJK COMPATIBILITY I" + - "DEOGRAPH-FABDCJK COMPATIBILITY IDEOGRAPH-FABECJK COMPATIBILITY IDEOGRAPH" + - "-FABFCJK COMPATIBILITY IDEOGRAPH-FAC0CJK COMPATIBILITY IDEOGRAPH-FAC1CJK" + - " COMPATIBILITY IDEOGRAPH-FAC2CJK COMPATIBILITY IDEOGRAPH-FAC3CJK COMPATI" + - "BILITY IDEOGRAPH-FAC4CJK COMPATIBILITY IDEOGRAPH-FAC5CJK COMPATIBILITY I" + - "DEOGRAPH-FAC6CJK COMPATIBILITY IDEOGRAPH-FAC7CJK COMPATIBILITY IDEOGRAPH" + - "-FAC8CJK COMPATIBILITY IDEOGRAPH-FAC9CJK COMPATIBILITY IDEOGRAPH-FACACJK" + - " COMPATIBILITY IDEOGRAPH-FACBCJK COMPATIBILITY IDEOGRAPH-FACCCJK COMPATI" + - "BILITY IDEOGRAPH-FACDCJK COMPATIBILITY IDEOGRAPH-FACECJK COMPATIBILITY I" + - "DEOGRAPH-FACFCJK COMPATIBILITY IDEOGRAPH-FAD0CJK COMPATIBILITY IDEOGRAPH" + - "-FAD1CJK COMPATIBILITY IDEOGRAPH-FAD2CJK COMPATIBILITY IDEOGRAPH-FAD3CJK" + - " COMPATIBILITY IDEOGRAPH-FAD4CJK COMPATIBILITY IDEOGRAPH-FAD5CJK COMPATI" + - "BILITY IDEOGRAPH-FAD6CJK COMPATIBILITY IDEOGRAPH-FAD7CJK COMPATIBILITY I" + - "DEOGRAPH-FAD8CJK COMPATIBILITY IDEOGRAPH-FAD9LATIN SMALL LIGATURE FFLATI" + - "N SMALL LIGATURE FILATIN SMALL LIGATURE FLLATIN SMALL LIGATURE FFILATIN " + - "SMALL LIGATURE FFLLATIN SMALL LIGATURE LONG S TLATIN SMALL LIGATURE STAR" + - "MENIAN SMALL LIGATURE MEN NOWARMENIAN SMALL LIGATURE MEN ECHARMENIAN SMA" + - "LL LIGATURE MEN INIARMENIAN SMALL LIGATURE VEW NOWARMENIAN SMALL LIGATUR" + - "E MEN XEHHEBREW LETTER YOD WITH HIRIQHEBREW POINT JUDEO-SPANISH VARIKAHE" + - "BREW LIGATURE YIDDISH YOD YOD PATAHHEBREW LETTER ALTERNATIVE AYINHEBREW " + - "LETTER WIDE ALEFHEBREW LETTER WIDE DALETHEBREW LETTER WIDE HEHEBREW LETT" + - "ER WIDE KAFHEBREW LETTER WIDE LAMEDHEBREW LETTER WIDE FINAL MEMHEBREW LE" + - "TTER WIDE RESHHEBREW LETTER WIDE TAVHEBREW LETTER ALTERNATIVE PLUS SIGNH" + - "EBREW LETTER SHIN WITH SHIN DOTHEBREW LETTER SHIN WITH SIN DOTHEBREW LET" + - "TER SHIN WITH DAGESH AND SHIN DOTHEBREW LETTER SHIN WITH DAGESH AND SIN " + - "DOTHEBREW LETTER ALEF WITH PATAHHEBREW LETTER ALEF WITH QAMATSHEBREW LET" + - "TER ALEF WITH MAPIQHEBREW LETTER BET WITH DAGESHHEBREW LETTER GIMEL WITH" + - " DAGESHHEBREW LETTER DALET WITH DAGESHHEBREW LETTER HE WITH MAPIQHEBREW " + - "LETTER VAV WITH DAGESHHEBREW LETTER ZAYIN WITH DAGESHHEBREW LETTER TET W" + - "ITH DAGESHHEBREW LETTER YOD WITH DAGESHHEBREW LETTER FINAL KAF WITH DAGE" + - "SHHEBREW LETTER KAF WITH DAGESHHEBREW LETTER LAMED WITH DAGESHHEBREW LET" + - "TER MEM WITH DAGESHHEBREW LETTER NUN WITH DAGESHHEBREW LETTER SAMEKH WIT" + - "H DAGESHHEBREW LETTER FINAL PE WITH DAGESHHEBREW LETTER PE WITH DAGESHHE" + - "BREW LETTER TSADI WITH DAGESHHEBREW LETTER QOF WITH DAGESHHEBREW LETTER " + - "RESH WITH DAGESHHEBREW LETTER SHIN WITH DAGESHHEBREW LETTER TAV WITH DAG" + - "ESHHEBREW LETTER VAV WITH HOLAMHEBREW LETTER BET WITH RAFEHEBREW LETTER " + - "KAF WITH RAFEHEBREW LETTER PE WITH RAFEHEBREW LIGATURE ALEF LAMEDARABIC " + - "LETTER ALEF WASLA ISOLATED FORMARABIC LETTER ALEF WASLA FINAL FORMARABIC" + - " LETTER BEEH ISOLATED FORMARABIC LETTER BEEH FINAL FORMARABIC LETTER BEE" + - "H INITIAL FORMARABIC LETTER BEEH MEDIAL FORMARABIC LETTER PEH ISOLATED F" + - "ORMARABIC LETTER PEH FINAL FORMARABIC LETTER PEH INITIAL FORMARABIC LETT" + - "ER PEH MEDIAL FORMARABIC LETTER BEHEH ISOLATED FORMARABIC LETTER BEHEH F" + - "INAL FORMARABIC LETTER BEHEH INITIAL FORMARABIC LETTER BEHEH MEDIAL FORM" + - "ARABIC LETTER TTEHEH ISOLATED FORMARABIC LETTER TTEHEH FINAL FORMARABIC " + - "LETTER TTEHEH INITIAL FORMARABIC LETTER TTEHEH MEDIAL FORMARABIC LETTER " + - "TEHEH ISOLATED FORMARABIC LETTER TEHEH FINAL FORMARABIC LETTER TEHEH INI") + ("" + - "TIAL FORMARABIC LETTER TEHEH MEDIAL FORMARABIC LETTER TTEH ISOLATED FORM" + - "ARABIC LETTER TTEH FINAL FORMARABIC LETTER TTEH INITIAL FORMARABIC LETTE" + - "R TTEH MEDIAL FORMARABIC LETTER VEH ISOLATED FORMARABIC LETTER VEH FINAL" + - " FORMARABIC LETTER VEH INITIAL FORMARABIC LETTER VEH MEDIAL FORMARABIC L" + - "ETTER PEHEH ISOLATED FORMARABIC LETTER PEHEH FINAL FORMARABIC LETTER PEH" + - "EH INITIAL FORMARABIC LETTER PEHEH MEDIAL FORMARABIC LETTER DYEH ISOLATE" + - "D FORMARABIC LETTER DYEH FINAL FORMARABIC LETTER DYEH INITIAL FORMARABIC" + - " LETTER DYEH MEDIAL FORMARABIC LETTER NYEH ISOLATED FORMARABIC LETTER NY" + - "EH FINAL FORMARABIC LETTER NYEH INITIAL FORMARABIC LETTER NYEH MEDIAL FO" + - "RMARABIC LETTER TCHEH ISOLATED FORMARABIC LETTER TCHEH FINAL FORMARABIC " + - "LETTER TCHEH INITIAL FORMARABIC LETTER TCHEH MEDIAL FORMARABIC LETTER TC" + - "HEHEH ISOLATED FORMARABIC LETTER TCHEHEH FINAL FORMARABIC LETTER TCHEHEH" + - " INITIAL FORMARABIC LETTER TCHEHEH MEDIAL FORMARABIC LETTER DDAHAL ISOLA" + - "TED FORMARABIC LETTER DDAHAL FINAL FORMARABIC LETTER DAHAL ISOLATED FORM" + - "ARABIC LETTER DAHAL FINAL FORMARABIC LETTER DUL ISOLATED FORMARABIC LETT" + - "ER DUL FINAL FORMARABIC LETTER DDAL ISOLATED FORMARABIC LETTER DDAL FINA" + - "L FORMARABIC LETTER JEH ISOLATED FORMARABIC LETTER JEH FINAL FORMARABIC " + - "LETTER RREH ISOLATED FORMARABIC LETTER RREH FINAL FORMARABIC LETTER KEHE" + - "H ISOLATED FORMARABIC LETTER KEHEH FINAL FORMARABIC LETTER KEHEH INITIAL" + - " FORMARABIC LETTER KEHEH MEDIAL FORMARABIC LETTER GAF ISOLATED FORMARABI" + - "C LETTER GAF FINAL FORMARABIC LETTER GAF INITIAL FORMARABIC LETTER GAF M" + - "EDIAL FORMARABIC LETTER GUEH ISOLATED FORMARABIC LETTER GUEH FINAL FORMA" + - "RABIC LETTER GUEH INITIAL FORMARABIC LETTER GUEH MEDIAL FORMARABIC LETTE" + - "R NGOEH ISOLATED FORMARABIC LETTER NGOEH FINAL FORMARABIC LETTER NGOEH I" + - "NITIAL FORMARABIC LETTER NGOEH MEDIAL FORMARABIC LETTER NOON GHUNNA ISOL" + - "ATED FORMARABIC LETTER NOON GHUNNA FINAL FORMARABIC LETTER RNOON ISOLATE" + - "D FORMARABIC LETTER RNOON FINAL FORMARABIC LETTER RNOON INITIAL FORMARAB" + - "IC LETTER RNOON MEDIAL FORMARABIC LETTER HEH WITH YEH ABOVE ISOLATED FOR" + - "MARABIC LETTER HEH WITH YEH ABOVE FINAL FORMARABIC LETTER HEH GOAL ISOLA" + - "TED FORMARABIC LETTER HEH GOAL FINAL FORMARABIC LETTER HEH GOAL INITIAL " + - "FORMARABIC LETTER HEH GOAL MEDIAL FORMARABIC LETTER HEH DOACHASHMEE ISOL" + - "ATED FORMARABIC LETTER HEH DOACHASHMEE FINAL FORMARABIC LETTER HEH DOACH" + - "ASHMEE INITIAL FORMARABIC LETTER HEH DOACHASHMEE MEDIAL FORMARABIC LETTE" + - "R YEH BARREE ISOLATED FORMARABIC LETTER YEH BARREE FINAL FORMARABIC LETT" + - "ER YEH BARREE WITH HAMZA ABOVE ISOLATED FORMARABIC LETTER YEH BARREE WIT" + - "H HAMZA ABOVE FINAL FORMARABIC SYMBOL DOT ABOVEARABIC SYMBOL DOT BELOWAR" + - "ABIC SYMBOL TWO DOTS ABOVEARABIC SYMBOL TWO DOTS BELOWARABIC SYMBOL THRE" + - "E DOTS ABOVEARABIC SYMBOL THREE DOTS BELOWARABIC SYMBOL THREE DOTS POINT" + - "ING DOWNWARDS ABOVEARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOWARAB" + - "IC SYMBOL FOUR DOTS ABOVEARABIC SYMBOL FOUR DOTS BELOWARABIC SYMBOL DOUB" + - "LE VERTICAL BAR BELOWARABIC SYMBOL TWO DOTS VERTICALLY ABOVEARABIC SYMBO" + - "L TWO DOTS VERTICALLY BELOWARABIC SYMBOL RINGARABIC SYMBOL SMALL TAH ABO" + - "VEARABIC SYMBOL SMALL TAH BELOWARABIC LETTER NG ISOLATED FORMARABIC LETT" + - "ER NG FINAL FORMARABIC LETTER NG INITIAL FORMARABIC LETTER NG MEDIAL FOR" + - "MARABIC LETTER U ISOLATED FORMARABIC LETTER U FINAL FORMARABIC LETTER OE" + - " ISOLATED FORMARABIC LETTER OE FINAL FORMARABIC LETTER YU ISOLATED FORMA" + - "RABIC LETTER YU FINAL FORMARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM" + - "ARABIC LETTER VE ISOLATED FORMARABIC LETTER VE FINAL FORMARABIC LETTER K" + - "IRGHIZ OE ISOLATED FORMARABIC LETTER KIRGHIZ OE FINAL FORMARABIC LETTER " + - "KIRGHIZ YU ISOLATED FORMARABIC LETTER KIRGHIZ YU FINAL FORMARABIC LETTER" + - " E ISOLATED FORMARABIC LETTER E FINAL FORMARABIC LETTER E INITIAL FORMAR" + - "ABIC LETTER E MEDIAL FORMARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSUR" + - "A INITIAL FORMARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FO" + - "RMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORMARABIC LIG" + - "ATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORMARABIC LIGATURE YEH WITH " + - "HAMZA ABOVE WITH AE ISOLATED FORMARABIC LIGATURE YEH WITH HAMZA ABOVE WI" + - "TH AE FINAL FORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED F" + - "ORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORMARABIC LIGATU" + - "RE YEH WITH HAMZA ABOVE WITH U ISOLATED FORMARABIC LIGATURE YEH WITH HAM" + - "ZA ABOVE WITH U FINAL FORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE I" + - "SOLATED FORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORMARABI" + - "C LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORMARABIC LIGATURE YEH" + - " WITH HAMZA ABOVE WITH YU FINAL FORMARABIC LIGATURE YEH WITH HAMZA ABOVE" + - " WITH E ISOLATED FORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL F") + ("" + - "ORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORMARABIC LIGATU" + - "RE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORMAR" + - "ABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINA" + - "L FORMARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKS" + - "URA INITIAL FORMARABIC LETTER FARSI YEH ISOLATED FORMARABIC LETTER FARSI" + - " YEH FINAL FORMARABIC LETTER FARSI YEH INITIAL FORMARABIC LETTER FARSI Y" + - "EH MEDIAL FORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FO" + - "RMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORMARABIC LIGA" + - "TURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORMARABIC LIGATURE YEH WIT" + - "H HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORMARABIC LIGATURE YEH WITH HA" + - "MZA ABOVE WITH YEH ISOLATED FORMARABIC LIGATURE BEH WITH JEEM ISOLATED F" + - "ORMARABIC LIGATURE BEH WITH HAH ISOLATED FORMARABIC LIGATURE BEH WITH KH" + - "AH ISOLATED FORMARABIC LIGATURE BEH WITH MEEM ISOLATED FORMARABIC LIGATU" + - "RE BEH WITH ALEF MAKSURA ISOLATED FORMARABIC LIGATURE BEH WITH YEH ISOLA" + - "TED FORMARABIC LIGATURE TEH WITH JEEM ISOLATED FORMARABIC LIGATURE TEH W" + - "ITH HAH ISOLATED FORMARABIC LIGATURE TEH WITH KHAH ISOLATED FORMARABIC L" + - "IGATURE TEH WITH MEEM ISOLATED FORMARABIC LIGATURE TEH WITH ALEF MAKSURA" + - " ISOLATED FORMARABIC LIGATURE TEH WITH YEH ISOLATED FORMARABIC LIGATURE " + - "THEH WITH JEEM ISOLATED FORMARABIC LIGATURE THEH WITH MEEM ISOLATED FORM" + - "ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORMARABIC LIGATURE THEH" + - " WITH YEH ISOLATED FORMARABIC LIGATURE JEEM WITH HAH ISOLATED FORMARABIC" + - " LIGATURE JEEM WITH MEEM ISOLATED FORMARABIC LIGATURE HAH WITH JEEM ISOL" + - "ATED FORMARABIC LIGATURE HAH WITH MEEM ISOLATED FORMARABIC LIGATURE KHAH" + - " WITH JEEM ISOLATED FORMARABIC LIGATURE KHAH WITH HAH ISOLATED FORMARABI" + - "C LIGATURE KHAH WITH MEEM ISOLATED FORMARABIC LIGATURE SEEN WITH JEEM IS" + - "OLATED FORMARABIC LIGATURE SEEN WITH HAH ISOLATED FORMARABIC LIGATURE SE" + - "EN WITH KHAH ISOLATED FORMARABIC LIGATURE SEEN WITH MEEM ISOLATED FORMAR" + - "ABIC LIGATURE SAD WITH HAH ISOLATED FORMARABIC LIGATURE SAD WITH MEEM IS" + - "OLATED FORMARABIC LIGATURE DAD WITH JEEM ISOLATED FORMARABIC LIGATURE DA" + - "D WITH HAH ISOLATED FORMARABIC LIGATURE DAD WITH KHAH ISOLATED FORMARABI" + - "C LIGATURE DAD WITH MEEM ISOLATED FORMARABIC LIGATURE TAH WITH HAH ISOLA" + - "TED FORMARABIC LIGATURE TAH WITH MEEM ISOLATED FORMARABIC LIGATURE ZAH W" + - "ITH MEEM ISOLATED FORMARABIC LIGATURE AIN WITH JEEM ISOLATED FORMARABIC " + - "LIGATURE AIN WITH MEEM ISOLATED FORMARABIC LIGATURE GHAIN WITH JEEM ISOL" + - "ATED FORMARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORMARABIC LIGATURE FE" + - "H WITH JEEM ISOLATED FORMARABIC LIGATURE FEH WITH HAH ISOLATED FORMARABI" + - "C LIGATURE FEH WITH KHAH ISOLATED FORMARABIC LIGATURE FEH WITH MEEM ISOL" + - "ATED FORMARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORMARABIC LIGAT" + - "URE FEH WITH YEH ISOLATED FORMARABIC LIGATURE QAF WITH HAH ISOLATED FORM" + - "ARABIC LIGATURE QAF WITH MEEM ISOLATED FORMARABIC LIGATURE QAF WITH ALEF" + - " MAKSURA ISOLATED FORMARABIC LIGATURE QAF WITH YEH ISOLATED FORMARABIC L" + - "IGATURE KAF WITH ALEF ISOLATED FORMARABIC LIGATURE KAF WITH JEEM ISOLATE" + - "D FORMARABIC LIGATURE KAF WITH HAH ISOLATED FORMARABIC LIGATURE KAF WITH" + - " KHAH ISOLATED FORMARABIC LIGATURE KAF WITH LAM ISOLATED FORMARABIC LIGA" + - "TURE KAF WITH MEEM ISOLATED FORMARABIC LIGATURE KAF WITH ALEF MAKSURA IS" + - "OLATED FORMARABIC LIGATURE KAF WITH YEH ISOLATED FORMARABIC LIGATURE LAM" + - " WITH JEEM ISOLATED FORMARABIC LIGATURE LAM WITH HAH ISOLATED FORMARABIC" + - " LIGATURE LAM WITH KHAH ISOLATED FORMARABIC LIGATURE LAM WITH MEEM ISOLA" + - "TED FORMARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORMARABIC LIGATU" + - "RE LAM WITH YEH ISOLATED FORMARABIC LIGATURE MEEM WITH JEEM ISOLATED FOR" + - "MARABIC LIGATURE MEEM WITH HAH ISOLATED FORMARABIC LIGATURE MEEM WITH KH" + - "AH ISOLATED FORMARABIC LIGATURE MEEM WITH MEEM ISOLATED FORMARABIC LIGAT" + - "URE MEEM WITH ALEF MAKSURA ISOLATED FORMARABIC LIGATURE MEEM WITH YEH IS" + - "OLATED FORMARABIC LIGATURE NOON WITH JEEM ISOLATED FORMARABIC LIGATURE N" + - "OON WITH HAH ISOLATED FORMARABIC LIGATURE NOON WITH KHAH ISOLATED FORMAR" + - "ABIC LIGATURE NOON WITH MEEM ISOLATED FORMARABIC LIGATURE NOON WITH ALEF" + - " MAKSURA ISOLATED FORMARABIC LIGATURE NOON WITH YEH ISOLATED FORMARABIC " + - "LIGATURE HEH WITH JEEM ISOLATED FORMARABIC LIGATURE HEH WITH MEEM ISOLAT" + - "ED FORMARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORMARABIC LIGATUR" + - "E HEH WITH YEH ISOLATED FORMARABIC LIGATURE YEH WITH JEEM ISOLATED FORMA" + - "RABIC LIGATURE YEH WITH HAH ISOLATED FORMARABIC LIGATURE YEH WITH KHAH I" + - "SOLATED FORMARABIC LIGATURE YEH WITH MEEM ISOLATED FORMARABIC LIGATURE Y" + - "EH WITH ALEF MAKSURA ISOLATED FORMARABIC LIGATURE YEH WITH YEH ISOLATED " + - "FORMARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORMARABIC LIGAT") + ("" + - "URE REH WITH SUPERSCRIPT ALEF ISOLATED FORMARABIC LIGATURE ALEF MAKSURA " + - "WITH SUPERSCRIPT ALEF ISOLATED FORMARABIC LIGATURE SHADDA WITH DAMMATAN " + - "ISOLATED FORMARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORMARABIC LI" + - "GATURE SHADDA WITH FATHA ISOLATED FORMARABIC LIGATURE SHADDA WITH DAMMA " + - "ISOLATED FORMARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORMARABIC LIGAT" + - "URE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORMARABIC LIGATURE YEH WITH H" + - "AMZA ABOVE WITH REH FINAL FORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH " + - "ZAIN FINAL FORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM" + - "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORMARABIC LIGATURE" + - " YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE YEH WI" + - "TH HAMZA ABOVE WITH YEH FINAL FORMARABIC LIGATURE BEH WITH REH FINAL FOR" + - "MARABIC LIGATURE BEH WITH ZAIN FINAL FORMARABIC LIGATURE BEH WITH MEEM F" + - "INAL FORMARABIC LIGATURE BEH WITH NOON FINAL FORMARABIC LIGATURE BEH WIT" + - "H ALEF MAKSURA FINAL FORMARABIC LIGATURE BEH WITH YEH FINAL FORMARABIC L" + - "IGATURE TEH WITH REH FINAL FORMARABIC LIGATURE TEH WITH ZAIN FINAL FORMA" + - "RABIC LIGATURE TEH WITH MEEM FINAL FORMARABIC LIGATURE TEH WITH NOON FIN" + - "AL FORMARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE T" + - "EH WITH YEH FINAL FORMARABIC LIGATURE THEH WITH REH FINAL FORMARABIC LIG" + - "ATURE THEH WITH ZAIN FINAL FORMARABIC LIGATURE THEH WITH MEEM FINAL FORM" + - "ARABIC LIGATURE THEH WITH NOON FINAL FORMARABIC LIGATURE THEH WITH ALEF " + - "MAKSURA FINAL FORMARABIC LIGATURE THEH WITH YEH FINAL FORMARABIC LIGATUR" + - "E FEH WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE FEH WITH YEH FINAL FOR" + - "MARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE QAF WIT" + - "H YEH FINAL FORMARABIC LIGATURE KAF WITH ALEF FINAL FORMARABIC LIGATURE " + - "KAF WITH LAM FINAL FORMARABIC LIGATURE KAF WITH MEEM FINAL FORMARABIC LI" + - "GATURE KAF WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE KAF WITH YEH FINA" + - "L FORMARABIC LIGATURE LAM WITH MEEM FINAL FORMARABIC LIGATURE LAM WITH A" + - "LEF MAKSURA FINAL FORMARABIC LIGATURE LAM WITH YEH FINAL FORMARABIC LIGA" + - "TURE MEEM WITH ALEF FINAL FORMARABIC LIGATURE MEEM WITH MEEM FINAL FORMA" + - "RABIC LIGATURE NOON WITH REH FINAL FORMARABIC LIGATURE NOON WITH ZAIN FI" + - "NAL FORMARABIC LIGATURE NOON WITH MEEM FINAL FORMARABIC LIGATURE NOON WI" + - "TH NOON FINAL FORMARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORMARABI" + - "C LIGATURE NOON WITH YEH FINAL FORMARABIC LIGATURE ALEF MAKSURA WITH SUP" + - "ERSCRIPT ALEF FINAL FORMARABIC LIGATURE YEH WITH REH FINAL FORMARABIC LI" + - "GATURE YEH WITH ZAIN FINAL FORMARABIC LIGATURE YEH WITH MEEM FINAL FORMA" + - "RABIC LIGATURE YEH WITH NOON FINAL FORMARABIC LIGATURE YEH WITH ALEF MAK" + - "SURA FINAL FORMARABIC LIGATURE YEH WITH YEH FINAL FORMARABIC LIGATURE YE" + - "H WITH HAMZA ABOVE WITH JEEM INITIAL FORMARABIC LIGATURE YEH WITH HAMZA " + - "ABOVE WITH HAH INITIAL FORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHA" + - "H INITIAL FORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FOR" + - "MARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORMARABIC LIGATU" + - "RE BEH WITH JEEM INITIAL FORMARABIC LIGATURE BEH WITH HAH INITIAL FORMAR" + - "ABIC LIGATURE BEH WITH KHAH INITIAL FORMARABIC LIGATURE BEH WITH MEEM IN" + - "ITIAL FORMARABIC LIGATURE BEH WITH HEH INITIAL FORMARABIC LIGATURE TEH W" + - "ITH JEEM INITIAL FORMARABIC LIGATURE TEH WITH HAH INITIAL FORMARABIC LIG" + - "ATURE TEH WITH KHAH INITIAL FORMARABIC LIGATURE TEH WITH MEEM INITIAL FO" + - "RMARABIC LIGATURE TEH WITH HEH INITIAL FORMARABIC LIGATURE THEH WITH MEE" + - "M INITIAL FORMARABIC LIGATURE JEEM WITH HAH INITIAL FORMARABIC LIGATURE " + - "JEEM WITH MEEM INITIAL FORMARABIC LIGATURE HAH WITH JEEM INITIAL FORMARA" + - "BIC LIGATURE HAH WITH MEEM INITIAL FORMARABIC LIGATURE KHAH WITH JEEM IN" + - "ITIAL FORMARABIC LIGATURE KHAH WITH MEEM INITIAL FORMARABIC LIGATURE SEE" + - "N WITH JEEM INITIAL FORMARABIC LIGATURE SEEN WITH HAH INITIAL FORMARABIC" + - " LIGATURE SEEN WITH KHAH INITIAL FORMARABIC LIGATURE SEEN WITH MEEM INIT" + - "IAL FORMARABIC LIGATURE SAD WITH HAH INITIAL FORMARABIC LIGATURE SAD WIT" + - "H KHAH INITIAL FORMARABIC LIGATURE SAD WITH MEEM INITIAL FORMARABIC LIGA" + - "TURE DAD WITH JEEM INITIAL FORMARABIC LIGATURE DAD WITH HAH INITIAL FORM" + - "ARABIC LIGATURE DAD WITH KHAH INITIAL FORMARABIC LIGATURE DAD WITH MEEM " + - "INITIAL FORMARABIC LIGATURE TAH WITH HAH INITIAL FORMARABIC LIGATURE ZAH" + - " WITH MEEM INITIAL FORMARABIC LIGATURE AIN WITH JEEM INITIAL FORMARABIC " + - "LIGATURE AIN WITH MEEM INITIAL FORMARABIC LIGATURE GHAIN WITH JEEM INITI" + - "AL FORMARABIC LIGATURE GHAIN WITH MEEM INITIAL FORMARABIC LIGATURE FEH W" + - "ITH JEEM INITIAL FORMARABIC LIGATURE FEH WITH HAH INITIAL FORMARABIC LIG" + - "ATURE FEH WITH KHAH INITIAL FORMARABIC LIGATURE FEH WITH MEEM INITIAL FO" + - "RMARABIC LIGATURE QAF WITH HAH INITIAL FORMARABIC LIGATURE QAF WITH MEEM") + ("" + - " INITIAL FORMARABIC LIGATURE KAF WITH JEEM INITIAL FORMARABIC LIGATURE K" + - "AF WITH HAH INITIAL FORMARABIC LIGATURE KAF WITH KHAH INITIAL FORMARABIC" + - " LIGATURE KAF WITH LAM INITIAL FORMARABIC LIGATURE KAF WITH MEEM INITIAL" + - " FORMARABIC LIGATURE LAM WITH JEEM INITIAL FORMARABIC LIGATURE LAM WITH " + - "HAH INITIAL FORMARABIC LIGATURE LAM WITH KHAH INITIAL FORMARABIC LIGATUR" + - "E LAM WITH MEEM INITIAL FORMARABIC LIGATURE LAM WITH HEH INITIAL FORMARA" + - "BIC LIGATURE MEEM WITH JEEM INITIAL FORMARABIC LIGATURE MEEM WITH HAH IN" + - "ITIAL FORMARABIC LIGATURE MEEM WITH KHAH INITIAL FORMARABIC LIGATURE MEE" + - "M WITH MEEM INITIAL FORMARABIC LIGATURE NOON WITH JEEM INITIAL FORMARABI" + - "C LIGATURE NOON WITH HAH INITIAL FORMARABIC LIGATURE NOON WITH KHAH INIT" + - "IAL FORMARABIC LIGATURE NOON WITH MEEM INITIAL FORMARABIC LIGATURE NOON " + - "WITH HEH INITIAL FORMARABIC LIGATURE HEH WITH JEEM INITIAL FORMARABIC LI" + - "GATURE HEH WITH MEEM INITIAL FORMARABIC LIGATURE HEH WITH SUPERSCRIPT AL" + - "EF INITIAL FORMARABIC LIGATURE YEH WITH JEEM INITIAL FORMARABIC LIGATURE" + - " YEH WITH HAH INITIAL FORMARABIC LIGATURE YEH WITH KHAH INITIAL FORMARAB" + - "IC LIGATURE YEH WITH MEEM INITIAL FORMARABIC LIGATURE YEH WITH HEH INITI" + - "AL FORMARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORMARABIC " + - "LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORMARABIC LIGATURE BEH WI" + - "TH MEEM MEDIAL FORMARABIC LIGATURE BEH WITH HEH MEDIAL FORMARABIC LIGATU" + - "RE TEH WITH MEEM MEDIAL FORMARABIC LIGATURE TEH WITH HEH MEDIAL FORMARAB" + - "IC LIGATURE THEH WITH MEEM MEDIAL FORMARABIC LIGATURE THEH WITH HEH MEDI" + - "AL FORMARABIC LIGATURE SEEN WITH MEEM MEDIAL FORMARABIC LIGATURE SEEN WI" + - "TH HEH MEDIAL FORMARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORMARABIC LIGA" + - "TURE SHEEN WITH HEH MEDIAL FORMARABIC LIGATURE KAF WITH LAM MEDIAL FORMA" + - "RABIC LIGATURE KAF WITH MEEM MEDIAL FORMARABIC LIGATURE LAM WITH MEEM ME" + - "DIAL FORMARABIC LIGATURE NOON WITH MEEM MEDIAL FORMARABIC LIGATURE NOON " + - "WITH HEH MEDIAL FORMARABIC LIGATURE YEH WITH MEEM MEDIAL FORMARABIC LIGA" + - "TURE YEH WITH HEH MEDIAL FORMARABIC LIGATURE SHADDA WITH FATHA MEDIAL FO" + - "RMARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORMARABIC LIGATURE SHADDA WI" + - "TH KASRA MEDIAL FORMARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORMA" + - "RABIC LIGATURE TAH WITH YEH ISOLATED FORMARABIC LIGATURE AIN WITH ALEF M" + - "AKSURA ISOLATED FORMARABIC LIGATURE AIN WITH YEH ISOLATED FORMARABIC LIG" + - "ATURE GHAIN WITH ALEF MAKSURA ISOLATED FORMARABIC LIGATURE GHAIN WITH YE" + - "H ISOLATED FORMARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORMARABI" + - "C LIGATURE SEEN WITH YEH ISOLATED FORMARABIC LIGATURE SHEEN WITH ALEF MA" + - "KSURA ISOLATED FORMARABIC LIGATURE SHEEN WITH YEH ISOLATED FORMARABIC LI" + - "GATURE HAH WITH ALEF MAKSURA ISOLATED FORMARABIC LIGATURE HAH WITH YEH I" + - "SOLATED FORMARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORMARABIC L" + - "IGATURE JEEM WITH YEH ISOLATED FORMARABIC LIGATURE KHAH WITH ALEF MAKSUR" + - "A ISOLATED FORMARABIC LIGATURE KHAH WITH YEH ISOLATED FORMARABIC LIGATUR" + - "E SAD WITH ALEF MAKSURA ISOLATED FORMARABIC LIGATURE SAD WITH YEH ISOLAT" + - "ED FORMARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORMARABIC LIGATUR" + - "E DAD WITH YEH ISOLATED FORMARABIC LIGATURE SHEEN WITH JEEM ISOLATED FOR" + - "MARABIC LIGATURE SHEEN WITH HAH ISOLATED FORMARABIC LIGATURE SHEEN WITH " + - "KHAH ISOLATED FORMARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORMARABIC LI" + - "GATURE SHEEN WITH REH ISOLATED FORMARABIC LIGATURE SEEN WITH REH ISOLATE" + - "D FORMARABIC LIGATURE SAD WITH REH ISOLATED FORMARABIC LIGATURE DAD WITH" + - " REH ISOLATED FORMARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORMARABIC" + - " LIGATURE TAH WITH YEH FINAL FORMARABIC LIGATURE AIN WITH ALEF MAKSURA F" + - "INAL FORMARABIC LIGATURE AIN WITH YEH FINAL FORMARABIC LIGATURE GHAIN WI" + - "TH ALEF MAKSURA FINAL FORMARABIC LIGATURE GHAIN WITH YEH FINAL FORMARABI" + - "C LIGATURE SEEN WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE SEEN WITH YE" + - "H FINAL FORMARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORMARABIC LIG" + - "ATURE SHEEN WITH YEH FINAL FORMARABIC LIGATURE HAH WITH ALEF MAKSURA FIN" + - "AL FORMARABIC LIGATURE HAH WITH YEH FINAL FORMARABIC LIGATURE JEEM WITH " + - "ALEF MAKSURA FINAL FORMARABIC LIGATURE JEEM WITH YEH FINAL FORMARABIC LI" + - "GATURE KHAH WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE KHAH WITH YEH FI" + - "NAL FORMARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE " + - "SAD WITH YEH FINAL FORMARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORMA" + - "RABIC LIGATURE DAD WITH YEH FINAL FORMARABIC LIGATURE SHEEN WITH JEEM FI" + - "NAL FORMARABIC LIGATURE SHEEN WITH HAH FINAL FORMARABIC LIGATURE SHEEN W" + - "ITH KHAH FINAL FORMARABIC LIGATURE SHEEN WITH MEEM FINAL FORMARABIC LIGA" + - "TURE SHEEN WITH REH FINAL FORMARABIC LIGATURE SEEN WITH REH FINAL FORMAR" + - "ABIC LIGATURE SAD WITH REH FINAL FORMARABIC LIGATURE DAD WITH REH FINAL ") + ("" + - "FORMARABIC LIGATURE SHEEN WITH JEEM INITIAL FORMARABIC LIGATURE SHEEN WI" + - "TH HAH INITIAL FORMARABIC LIGATURE SHEEN WITH KHAH INITIAL FORMARABIC LI" + - "GATURE SHEEN WITH MEEM INITIAL FORMARABIC LIGATURE SEEN WITH HEH INITIAL" + - " FORMARABIC LIGATURE SHEEN WITH HEH INITIAL FORMARABIC LIGATURE TAH WITH" + - " MEEM INITIAL FORMARABIC LIGATURE SEEN WITH JEEM MEDIAL FORMARABIC LIGAT" + - "URE SEEN WITH HAH MEDIAL FORMARABIC LIGATURE SEEN WITH KHAH MEDIAL FORMA" + - "RABIC LIGATURE SHEEN WITH JEEM MEDIAL FORMARABIC LIGATURE SHEEN WITH HAH" + - " MEDIAL FORMARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORMARABIC LIGATURE T" + - "AH WITH MEEM MEDIAL FORMARABIC LIGATURE ZAH WITH MEEM MEDIAL FORMARABIC " + - "LIGATURE ALEF WITH FATHATAN FINAL FORMARABIC LIGATURE ALEF WITH FATHATAN" + - " ISOLATED FORMORNATE LEFT PARENTHESISORNATE RIGHT PARENTHESISARABIC LIGA" + - "TURE TEH WITH JEEM WITH MEEM INITIAL FORMARABIC LIGATURE TEH WITH HAH WI" + - "TH JEEM FINAL FORMARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORMARA" + - "BIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORMARABIC LIGATURE TEH WITH" + - " KHAH WITH MEEM INITIAL FORMARABIC LIGATURE TEH WITH MEEM WITH JEEM INIT" + - "IAL FORMARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORMARABIC LIGATU" + - "RE TEH WITH MEEM WITH KHAH INITIAL FORMARABIC LIGATURE JEEM WITH MEEM WI" + - "TH HAH FINAL FORMARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORMARA" + - "BIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORMARABIC LIGATURE HAH WITH M" + - "EEM WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE SEEN WITH HAH WITH JEEM " + - "INITIAL FORMARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORMARABIC L" + - "IGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE SEEN " + - "WITH MEEM WITH HAH FINAL FORMARABIC LIGATURE SEEN WITH MEEM WITH HAH INI" + - "TIAL FORMARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORMARABIC LIG" + - "ATURE SEEN WITH MEEM WITH MEEM FINAL FORMARABIC LIGATURE SEEN WITH MEEM " + - "WITH MEEM INITIAL FORMARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORMAR" + - "ABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORMARABIC LIGATURE SAD WITH" + - " MEEM WITH MEEM FINAL FORMARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL" + - " FORMARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORMARABIC LIGATUR" + - "E SHEEN WITH JEEM WITH YEH FINAL FORMARABIC LIGATURE SHEEN WITH MEEM WIT" + - "H KHAH FINAL FORMARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORMA" + - "RABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORMARABIC LIGATURE SHEEN" + - " WITH MEEM WITH MEEM INITIAL FORMARABIC LIGATURE DAD WITH HAH WITH ALEF " + - "MAKSURA FINAL FORMARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORMARAB" + - "IC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORMARABIC LIGATURE TAH WITH" + - " MEEM WITH HAH FINAL FORMARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL " + - "FORMARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORMARABIC LIGATURE " + - "TAH WITH MEEM WITH YEH FINAL FORMARABIC LIGATURE AIN WITH JEEM WITH MEEM" + - " FINAL FORMARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORMARABIC LIGA" + - "TURE AIN WITH MEEM WITH MEEM INITIAL FORMARABIC LIGATURE AIN WITH MEEM W" + - "ITH ALEF MAKSURA FINAL FORMARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FIN" + - "AL FORMARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORMARABIC LIGATUR" + - "E GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE FEH WITH K" + - "HAH WITH MEEM FINAL FORMARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL " + - "FORMARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORMARABIC LIGATURE QAF" + - " WITH MEEM WITH MEEM FINAL FORMARABIC LIGATURE LAM WITH HAH WITH MEEM FI" + - "NAL FORMARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORMARABIC LIGATURE " + - "LAM WITH HAH WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE LAM WITH JEEM W" + - "ITH JEEM INITIAL FORMARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORMA" + - "RABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORMARABIC LIGATURE LAM WIT" + - "H KHAH WITH MEEM INITIAL FORMARABIC LIGATURE LAM WITH MEEM WITH HAH FINA" + - "L FORMARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORMARABIC LIGATURE" + - " MEEM WITH HAH WITH JEEM INITIAL FORMARABIC LIGATURE MEEM WITH HAH WITH " + - "MEEM INITIAL FORMARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORMARABIC" + - " LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORMARABIC LIGATURE MEEM WITH " + - "JEEM WITH MEEM INITIAL FORMARABIC LIGATURE MEEM WITH KHAH WITH JEEM INIT" + - "IAL FORMARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORMARABIC LIGA" + - "TURE MEEM WITH JEEM WITH KHAH INITIAL FORMARABIC LIGATURE HEH WITH MEEM " + - "WITH JEEM INITIAL FORMARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FO" + - "RMARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORMARABIC LIGATURE NO" + - "ON WITH HAH WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE NOON WITH JEEM W" + - "ITH MEEM FINAL FORMARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM" + - "ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORMARABIC LIGATU" + - "RE NOON WITH MEEM WITH YEH FINAL FORMARABIC LIGATURE NOON WITH MEEM WITH") + ("" + - " ALEF MAKSURA FINAL FORMARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FO" + - "RMARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORMARABIC LIGATURE BE" + - "H WITH KHAH WITH YEH FINAL FORMARABIC LIGATURE TEH WITH JEEM WITH YEH FI" + - "NAL FORMARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORMARABIC" + - " LIGATURE TEH WITH KHAH WITH YEH FINAL FORMARABIC LIGATURE TEH WITH KHAH" + - " WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE TEH WITH MEEM WITH YEH FINA" + - "L FORMARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORMARABIC L" + - "IGATURE JEEM WITH MEEM WITH YEH FINAL FORMARABIC LIGATURE JEEM WITH HAH " + - "WITH ALEF MAKSURA FINAL FORMARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAK" + - "SURA FINAL FORMARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FO" + - "RMARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORMARABIC LIGATURE SHEEN " + - "WITH HAH WITH YEH FINAL FORMARABIC LIGATURE DAD WITH HAH WITH YEH FINAL " + - "FORMARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORMARABIC LIGATURE LAM" + - " WITH MEEM WITH YEH FINAL FORMARABIC LIGATURE YEH WITH HAH WITH YEH FINA" + - "L FORMARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORMARABIC LIGATURE Y" + - "EH WITH MEEM WITH YEH FINAL FORMARABIC LIGATURE MEEM WITH MEEM WITH YEH " + - "FINAL FORMARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORMARABIC LIGATU" + - "RE NOON WITH HAH WITH YEH FINAL FORMARABIC LIGATURE QAF WITH MEEM WITH H" + - "AH INITIAL FORMARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORMARABIC" + - " LIGATURE AIN WITH MEEM WITH YEH FINAL FORMARABIC LIGATURE KAF WITH MEEM" + - " WITH YEH FINAL FORMARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM" + - "ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORMARABIC LIGATURE LAM WI" + - "TH JEEM WITH MEEM INITIAL FORMARABIC LIGATURE KAF WITH MEEM WITH MEEM FI" + - "NAL FORMARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORMARABIC LIGATUR" + - "E NOON WITH JEEM WITH HAH FINAL FORMARABIC LIGATURE JEEM WITH HAH WITH Y" + - "EH FINAL FORMARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORMARABIC LIG" + - "ATURE MEEM WITH JEEM WITH YEH FINAL FORMARABIC LIGATURE FEH WITH MEEM WI" + - "TH YEH FINAL FORMARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORMARABIC " + - "LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORMARABIC LIGATURE AIN WITH JE" + - "EM WITH MEEM INITIAL FORMARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL" + - " FORMARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORMARABIC LIGATURE N" + - "OON WITH JEEM WITH YEH FINAL FORMARABIC LIGATURE SALLA USED AS KORANIC S" + - "TOP SIGN ISOLATED FORMARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISO" + - "LATED FORMARABIC LIGATURE ALLAH ISOLATED FORMARABIC LIGATURE AKBAR ISOLA" + - "TED FORMARABIC LIGATURE MOHAMMAD ISOLATED FORMARABIC LIGATURE SALAM ISOL" + - "ATED FORMARABIC LIGATURE RASOUL ISOLATED FORMARABIC LIGATURE ALAYHE ISOL" + - "ATED FORMARABIC LIGATURE WASALLAM ISOLATED FORMARABIC LIGATURE SALLA ISO" + - "LATED FORMARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAMARABIC LIGATURE JAL" + - "LAJALALOUHOURIAL SIGNARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEMVARIAT" + - "ION SELECTOR-1VARIATION SELECTOR-2VARIATION SELECTOR-3VARIATION SELECTOR" + - "-4VARIATION SELECTOR-5VARIATION SELECTOR-6VARIATION SELECTOR-7VARIATION " + - "SELECTOR-8VARIATION SELECTOR-9VARIATION SELECTOR-10VARIATION SELECTOR-11" + - "VARIATION SELECTOR-12VARIATION SELECTOR-13VARIATION SELECTOR-14VARIATION" + - " SELECTOR-15VARIATION SELECTOR-16PRESENTATION FORM FOR VERTICAL COMMAPRE" + - "SENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMAPRESENTATION FORM FOR VERTI" + - "CAL IDEOGRAPHIC FULL STOPPRESENTATION FORM FOR VERTICAL COLONPRESENTATIO" + - "N FORM FOR VERTICAL SEMICOLONPRESENTATION FORM FOR VERTICAL EXCLAMATION " + - "MARKPRESENTATION FORM FOR VERTICAL QUESTION MARKPRESENTATION FORM FOR VE" + - "RTICAL LEFT WHITE LENTICULAR BRACKETPRESENTATION FORM FOR VERTICAL RIGHT" + - " WHITE LENTICULAR BRAKCETPRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIP" + - "SISCOMBINING LIGATURE LEFT HALFCOMBINING LIGATURE RIGHT HALFCOMBINING DO" + - "UBLE TILDE LEFT HALFCOMBINING DOUBLE TILDE RIGHT HALFCOMBINING MACRON LE" + - "FT HALFCOMBINING MACRON RIGHT HALFCOMBINING CONJOINING MACRONCOMBINING L" + - "IGATURE LEFT HALF BELOWCOMBINING LIGATURE RIGHT HALF BELOWCOMBINING TILD" + - "E LEFT HALF BELOWCOMBINING TILDE RIGHT HALF BELOWCOMBINING MACRON LEFT H" + - "ALF BELOWCOMBINING MACRON RIGHT HALF BELOWCOMBINING CONJOINING MACRON BE" + - "LOWCOMBINING CYRILLIC TITLO LEFT HALFCOMBINING CYRILLIC TITLO RIGHT HALF" + - "PRESENTATION FORM FOR VERTICAL TWO DOT LEADERPRESENTATION FORM FOR VERTI" + - "CAL EM DASHPRESENTATION FORM FOR VERTICAL EN DASHPRESENTATION FORM FOR V" + - "ERTICAL LOW LINEPRESENTATION FORM FOR VERTICAL WAVY LOW LINEPRESENTATION" + - " FORM FOR VERTICAL LEFT PARENTHESISPRESENTATION FORM FOR VERTICAL RIGHT " + - "PARENTHESISPRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKETPRESENTATION" + - " FORM FOR VERTICAL RIGHT CURLY BRACKETPRESENTATION FORM FOR VERTICAL LEF" + - "T TORTOISE SHELL BRACKETPRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SH") + ("" + - "ELL BRACKETPRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKETP" + - "RESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKETPRESENTATION" + - " FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKETPRESENTATION FORM FOR VERTIC" + - "AL RIGHT DOUBLE ANGLE BRACKETPRESENTATION FORM FOR VERTICAL LEFT ANGLE B" + - "RACKETPRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKETPRESENTATION FOR" + - "M FOR VERTICAL LEFT CORNER BRACKETPRESENTATION FORM FOR VERTICAL RIGHT C" + - "ORNER BRACKETPRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKETPRE" + - "SENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKETSESAME DOTWHITE SE" + - "SAME DOTPRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKETPRESENTATION F" + - "ORM FOR VERTICAL RIGHT SQUARE BRACKETDASHED OVERLINECENTRELINE OVERLINEW" + - "AVY OVERLINEDOUBLE WAVY OVERLINEDASHED LOW LINECENTRELINE LOW LINEWAVY L" + - "OW LINESMALL COMMASMALL IDEOGRAPHIC COMMASMALL FULL STOPSMALL SEMICOLONS" + - "MALL COLONSMALL QUESTION MARKSMALL EXCLAMATION MARKSMALL EM DASHSMALL LE" + - "FT PARENTHESISSMALL RIGHT PARENTHESISSMALL LEFT CURLY BRACKETSMALL RIGHT" + - " CURLY BRACKETSMALL LEFT TORTOISE SHELL BRACKETSMALL RIGHT TORTOISE SHEL" + - "L BRACKETSMALL NUMBER SIGNSMALL AMPERSANDSMALL ASTERISKSMALL PLUS SIGNSM" + - "ALL HYPHEN-MINUSSMALL LESS-THAN SIGNSMALL GREATER-THAN SIGNSMALL EQUALS " + - "SIGNSMALL REVERSE SOLIDUSSMALL DOLLAR SIGNSMALL PERCENT SIGNSMALL COMMER" + - "CIAL ATARABIC FATHATAN ISOLATED FORMARABIC TATWEEL WITH FATHATAN ABOVEAR" + - "ABIC DAMMATAN ISOLATED FORMARABIC TAIL FRAGMENTARABIC KASRATAN ISOLATED " + - "FORMARABIC FATHA ISOLATED FORMARABIC FATHA MEDIAL FORMARABIC DAMMA ISOLA" + - "TED FORMARABIC DAMMA MEDIAL FORMARABIC KASRA ISOLATED FORMARABIC KASRA M" + - "EDIAL FORMARABIC SHADDA ISOLATED FORMARABIC SHADDA MEDIAL FORMARABIC SUK" + - "UN ISOLATED FORMARABIC SUKUN MEDIAL FORMARABIC LETTER HAMZA ISOLATED FOR" + - "MARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORMARABIC LETTER ALEF WIT" + - "H MADDA ABOVE FINAL FORMARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FOR" + - "MARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORMARABIC LETTER WAW WITH HA" + - "MZA ABOVE ISOLATED FORMARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORMARAB" + - "IC LETTER ALEF WITH HAMZA BELOW ISOLATED FORMARABIC LETTER ALEF WITH HAM" + - "ZA BELOW FINAL FORMARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORMARABI" + - "C LETTER YEH WITH HAMZA ABOVE FINAL FORMARABIC LETTER YEH WITH HAMZA ABO" + - "VE INITIAL FORMARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORMARABIC LETT" + - "ER ALEF ISOLATED FORMARABIC LETTER ALEF FINAL FORMARABIC LETTER BEH ISOL" + - "ATED FORMARABIC LETTER BEH FINAL FORMARABIC LETTER BEH INITIAL FORMARABI" + - "C LETTER BEH MEDIAL FORMARABIC LETTER TEH MARBUTA ISOLATED FORMARABIC LE" + - "TTER TEH MARBUTA FINAL FORMARABIC LETTER TEH ISOLATED FORMARABIC LETTER " + - "TEH FINAL FORMARABIC LETTER TEH INITIAL FORMARABIC LETTER TEH MEDIAL FOR" + - "MARABIC LETTER THEH ISOLATED FORMARABIC LETTER THEH FINAL FORMARABIC LET" + - "TER THEH INITIAL FORMARABIC LETTER THEH MEDIAL FORMARABIC LETTER JEEM IS" + - "OLATED FORMARABIC LETTER JEEM FINAL FORMARABIC LETTER JEEM INITIAL FORMA" + - "RABIC LETTER JEEM MEDIAL FORMARABIC LETTER HAH ISOLATED FORMARABIC LETTE" + - "R HAH FINAL FORMARABIC LETTER HAH INITIAL FORMARABIC LETTER HAH MEDIAL F" + - "ORMARABIC LETTER KHAH ISOLATED FORMARABIC LETTER KHAH FINAL FORMARABIC L" + - "ETTER KHAH INITIAL FORMARABIC LETTER KHAH MEDIAL FORMARABIC LETTER DAL I" + - "SOLATED FORMARABIC LETTER DAL FINAL FORMARABIC LETTER THAL ISOLATED FORM" + - "ARABIC LETTER THAL FINAL FORMARABIC LETTER REH ISOLATED FORMARABIC LETTE" + - "R REH FINAL FORMARABIC LETTER ZAIN ISOLATED FORMARABIC LETTER ZAIN FINAL" + - " FORMARABIC LETTER SEEN ISOLATED FORMARABIC LETTER SEEN FINAL FORMARABIC" + - " LETTER SEEN INITIAL FORMARABIC LETTER SEEN MEDIAL FORMARABIC LETTER SHE" + - "EN ISOLATED FORMARABIC LETTER SHEEN FINAL FORMARABIC LETTER SHEEN INITIA" + - "L FORMARABIC LETTER SHEEN MEDIAL FORMARABIC LETTER SAD ISOLATED FORMARAB" + - "IC LETTER SAD FINAL FORMARABIC LETTER SAD INITIAL FORMARABIC LETTER SAD " + - "MEDIAL FORMARABIC LETTER DAD ISOLATED FORMARABIC LETTER DAD FINAL FORMAR" + - "ABIC LETTER DAD INITIAL FORMARABIC LETTER DAD MEDIAL FORMARABIC LETTER T" + - "AH ISOLATED FORMARABIC LETTER TAH FINAL FORMARABIC LETTER TAH INITIAL FO" + - "RMARABIC LETTER TAH MEDIAL FORMARABIC LETTER ZAH ISOLATED FORMARABIC LET" + - "TER ZAH FINAL FORMARABIC LETTER ZAH INITIAL FORMARABIC LETTER ZAH MEDIAL" + - " FORMARABIC LETTER AIN ISOLATED FORMARABIC LETTER AIN FINAL FORMARABIC L" + - "ETTER AIN INITIAL FORMARABIC LETTER AIN MEDIAL FORMARABIC LETTER GHAIN I" + - "SOLATED FORMARABIC LETTER GHAIN FINAL FORMARABIC LETTER GHAIN INITIAL FO" + - "RMARABIC LETTER GHAIN MEDIAL FORMARABIC LETTER FEH ISOLATED FORMARABIC L" + - "ETTER FEH FINAL FORMARABIC LETTER FEH INITIAL FORMARABIC LETTER FEH MEDI" + - "AL FORMARABIC LETTER QAF ISOLATED FORMARABIC LETTER QAF FINAL FORMARABIC" + - " LETTER QAF INITIAL FORMARABIC LETTER QAF MEDIAL FORMARABIC LETTER KAF I") + ("" + - "SOLATED FORMARABIC LETTER KAF FINAL FORMARABIC LETTER KAF INITIAL FORMAR" + - "ABIC LETTER KAF MEDIAL FORMARABIC LETTER LAM ISOLATED FORMARABIC LETTER " + - "LAM FINAL FORMARABIC LETTER LAM INITIAL FORMARABIC LETTER LAM MEDIAL FOR" + - "MARABIC LETTER MEEM ISOLATED FORMARABIC LETTER MEEM FINAL FORMARABIC LET" + - "TER MEEM INITIAL FORMARABIC LETTER MEEM MEDIAL FORMARABIC LETTER NOON IS" + - "OLATED FORMARABIC LETTER NOON FINAL FORMARABIC LETTER NOON INITIAL FORMA" + - "RABIC LETTER NOON MEDIAL FORMARABIC LETTER HEH ISOLATED FORMARABIC LETTE" + - "R HEH FINAL FORMARABIC LETTER HEH INITIAL FORMARABIC LETTER HEH MEDIAL F" + - "ORMARABIC LETTER WAW ISOLATED FORMARABIC LETTER WAW FINAL FORMARABIC LET" + - "TER ALEF MAKSURA ISOLATED FORMARABIC LETTER ALEF MAKSURA FINAL FORMARABI" + - "C LETTER YEH ISOLATED FORMARABIC LETTER YEH FINAL FORMARABIC LETTER YEH " + - "INITIAL FORMARABIC LETTER YEH MEDIAL FORMARABIC LIGATURE LAM WITH ALEF W" + - "ITH MADDA ABOVE ISOLATED FORMARABIC LIGATURE LAM WITH ALEF WITH MADDA AB" + - "OVE FINAL FORMARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FO" + - "RMARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORMARABIC LIGATU" + - "RE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORMARABIC LIGATURE LAM WITH " + - "ALEF WITH HAMZA BELOW FINAL FORMARABIC LIGATURE LAM WITH ALEF ISOLATED F" + - "ORMARABIC LIGATURE LAM WITH ALEF FINAL FORMZERO WIDTH NO-BREAK SPACEFULL" + - "WIDTH EXCLAMATION MARKFULLWIDTH QUOTATION MARKFULLWIDTH NUMBER SIGNFULLW" + - "IDTH DOLLAR SIGNFULLWIDTH PERCENT SIGNFULLWIDTH AMPERSANDFULLWIDTH APOST" + - "ROPHEFULLWIDTH LEFT PARENTHESISFULLWIDTH RIGHT PARENTHESISFULLWIDTH ASTE" + - "RISKFULLWIDTH PLUS SIGNFULLWIDTH COMMAFULLWIDTH HYPHEN-MINUSFULLWIDTH FU" + - "LL STOPFULLWIDTH SOLIDUSFULLWIDTH DIGIT ZEROFULLWIDTH DIGIT ONEFULLWIDTH" + - " DIGIT TWOFULLWIDTH DIGIT THREEFULLWIDTH DIGIT FOURFULLWIDTH DIGIT FIVEF" + - "ULLWIDTH DIGIT SIXFULLWIDTH DIGIT SEVENFULLWIDTH DIGIT EIGHTFULLWIDTH DI" + - "GIT NINEFULLWIDTH COLONFULLWIDTH SEMICOLONFULLWIDTH LESS-THAN SIGNFULLWI" + - "DTH EQUALS SIGNFULLWIDTH GREATER-THAN SIGNFULLWIDTH QUESTION MARKFULLWID" + - "TH COMMERCIAL ATFULLWIDTH LATIN CAPITAL LETTER AFULLWIDTH LATIN CAPITAL " + - "LETTER BFULLWIDTH LATIN CAPITAL LETTER CFULLWIDTH LATIN CAPITAL LETTER D" + - "FULLWIDTH LATIN CAPITAL LETTER EFULLWIDTH LATIN CAPITAL LETTER FFULLWIDT" + - "H LATIN CAPITAL LETTER GFULLWIDTH LATIN CAPITAL LETTER HFULLWIDTH LATIN " + - "CAPITAL LETTER IFULLWIDTH LATIN CAPITAL LETTER JFULLWIDTH LATIN CAPITAL " + - "LETTER KFULLWIDTH LATIN CAPITAL LETTER LFULLWIDTH LATIN CAPITAL LETTER M" + - "FULLWIDTH LATIN CAPITAL LETTER NFULLWIDTH LATIN CAPITAL LETTER OFULLWIDT" + - "H LATIN CAPITAL LETTER PFULLWIDTH LATIN CAPITAL LETTER QFULLWIDTH LATIN " + - "CAPITAL LETTER RFULLWIDTH LATIN CAPITAL LETTER SFULLWIDTH LATIN CAPITAL " + - "LETTER TFULLWIDTH LATIN CAPITAL LETTER UFULLWIDTH LATIN CAPITAL LETTER V" + - "FULLWIDTH LATIN CAPITAL LETTER WFULLWIDTH LATIN CAPITAL LETTER XFULLWIDT" + - "H LATIN CAPITAL LETTER YFULLWIDTH LATIN CAPITAL LETTER ZFULLWIDTH LEFT S" + - "QUARE BRACKETFULLWIDTH REVERSE SOLIDUSFULLWIDTH RIGHT SQUARE BRACKETFULL" + - "WIDTH CIRCUMFLEX ACCENTFULLWIDTH LOW LINEFULLWIDTH GRAVE ACCENTFULLWIDTH" + - " LATIN SMALL LETTER AFULLWIDTH LATIN SMALL LETTER BFULLWIDTH LATIN SMALL" + - " LETTER CFULLWIDTH LATIN SMALL LETTER DFULLWIDTH LATIN SMALL LETTER EFUL" + - "LWIDTH LATIN SMALL LETTER FFULLWIDTH LATIN SMALL LETTER GFULLWIDTH LATIN" + - " SMALL LETTER HFULLWIDTH LATIN SMALL LETTER IFULLWIDTH LATIN SMALL LETTE" + - "R JFULLWIDTH LATIN SMALL LETTER KFULLWIDTH LATIN SMALL LETTER LFULLWIDTH" + - " LATIN SMALL LETTER MFULLWIDTH LATIN SMALL LETTER NFULLWIDTH LATIN SMALL" + - " LETTER OFULLWIDTH LATIN SMALL LETTER PFULLWIDTH LATIN SMALL LETTER QFUL" + - "LWIDTH LATIN SMALL LETTER RFULLWIDTH LATIN SMALL LETTER SFULLWIDTH LATIN" + - " SMALL LETTER TFULLWIDTH LATIN SMALL LETTER UFULLWIDTH LATIN SMALL LETTE" + - "R VFULLWIDTH LATIN SMALL LETTER WFULLWIDTH LATIN SMALL LETTER XFULLWIDTH" + - " LATIN SMALL LETTER YFULLWIDTH LATIN SMALL LETTER ZFULLWIDTH LEFT CURLY " + - "BRACKETFULLWIDTH VERTICAL LINEFULLWIDTH RIGHT CURLY BRACKETFULLWIDTH TIL" + - "DEFULLWIDTH LEFT WHITE PARENTHESISFULLWIDTH RIGHT WHITE PARENTHESISHALFW" + - "IDTH IDEOGRAPHIC FULL STOPHALFWIDTH LEFT CORNER BRACKETHALFWIDTH RIGHT C" + - "ORNER BRACKETHALFWIDTH IDEOGRAPHIC COMMAHALFWIDTH KATAKANA MIDDLE DOTHAL" + - "FWIDTH KATAKANA LETTER WOHALFWIDTH KATAKANA LETTER SMALL AHALFWIDTH KATA" + - "KANA LETTER SMALL IHALFWIDTH KATAKANA LETTER SMALL UHALFWIDTH KATAKANA L" + - "ETTER SMALL EHALFWIDTH KATAKANA LETTER SMALL OHALFWIDTH KATAKANA LETTER " + - "SMALL YAHALFWIDTH KATAKANA LETTER SMALL YUHALFWIDTH KATAKANA LETTER SMAL" + - "L YOHALFWIDTH KATAKANA LETTER SMALL TUHALFWIDTH KATAKANA-HIRAGANA PROLON" + - "GED SOUND MARKHALFWIDTH KATAKANA LETTER AHALFWIDTH KATAKANA LETTER IHALF" + - "WIDTH KATAKANA LETTER UHALFWIDTH KATAKANA LETTER EHALFWIDTH KATAKANA LET" + - "TER OHALFWIDTH KATAKANA LETTER KAHALFWIDTH KATAKANA LETTER KIHALFWIDTH K") + ("" + - "ATAKANA LETTER KUHALFWIDTH KATAKANA LETTER KEHALFWIDTH KATAKANA LETTER K" + - "OHALFWIDTH KATAKANA LETTER SAHALFWIDTH KATAKANA LETTER SIHALFWIDTH KATAK" + - "ANA LETTER SUHALFWIDTH KATAKANA LETTER SEHALFWIDTH KATAKANA LETTER SOHAL" + - "FWIDTH KATAKANA LETTER TAHALFWIDTH KATAKANA LETTER TIHALFWIDTH KATAKANA " + - "LETTER TUHALFWIDTH KATAKANA LETTER TEHALFWIDTH KATAKANA LETTER TOHALFWID" + - "TH KATAKANA LETTER NAHALFWIDTH KATAKANA LETTER NIHALFWIDTH KATAKANA LETT" + - "ER NUHALFWIDTH KATAKANA LETTER NEHALFWIDTH KATAKANA LETTER NOHALFWIDTH K" + - "ATAKANA LETTER HAHALFWIDTH KATAKANA LETTER HIHALFWIDTH KATAKANA LETTER H" + - "UHALFWIDTH KATAKANA LETTER HEHALFWIDTH KATAKANA LETTER HOHALFWIDTH KATAK" + - "ANA LETTER MAHALFWIDTH KATAKANA LETTER MIHALFWIDTH KATAKANA LETTER MUHAL" + - "FWIDTH KATAKANA LETTER MEHALFWIDTH KATAKANA LETTER MOHALFWIDTH KATAKANA " + - "LETTER YAHALFWIDTH KATAKANA LETTER YUHALFWIDTH KATAKANA LETTER YOHALFWID" + - "TH KATAKANA LETTER RAHALFWIDTH KATAKANA LETTER RIHALFWIDTH KATAKANA LETT" + - "ER RUHALFWIDTH KATAKANA LETTER REHALFWIDTH KATAKANA LETTER ROHALFWIDTH K" + - "ATAKANA LETTER WAHALFWIDTH KATAKANA LETTER NHALFWIDTH KATAKANA VOICED SO" + - "UND MARKHALFWIDTH KATAKANA SEMI-VOICED SOUND MARKHALFWIDTH HANGUL FILLER" + - "HALFWIDTH HANGUL LETTER KIYEOKHALFWIDTH HANGUL LETTER SSANGKIYEOKHALFWID" + - "TH HANGUL LETTER KIYEOK-SIOSHALFWIDTH HANGUL LETTER NIEUNHALFWIDTH HANGU" + - "L LETTER NIEUN-CIEUCHALFWIDTH HANGUL LETTER NIEUN-HIEUHHALFWIDTH HANGUL " + - "LETTER TIKEUTHALFWIDTH HANGUL LETTER SSANGTIKEUTHALFWIDTH HANGUL LETTER " + - "RIEULHALFWIDTH HANGUL LETTER RIEUL-KIYEOKHALFWIDTH HANGUL LETTER RIEUL-M" + - "IEUMHALFWIDTH HANGUL LETTER RIEUL-PIEUPHALFWIDTH HANGUL LETTER RIEUL-SIO" + - "SHALFWIDTH HANGUL LETTER RIEUL-THIEUTHHALFWIDTH HANGUL LETTER RIEUL-PHIE" + - "UPHHALFWIDTH HANGUL LETTER RIEUL-HIEUHHALFWIDTH HANGUL LETTER MIEUMHALFW" + - "IDTH HANGUL LETTER PIEUPHALFWIDTH HANGUL LETTER SSANGPIEUPHALFWIDTH HANG" + - "UL LETTER PIEUP-SIOSHALFWIDTH HANGUL LETTER SIOSHALFWIDTH HANGUL LETTER " + - "SSANGSIOSHALFWIDTH HANGUL LETTER IEUNGHALFWIDTH HANGUL LETTER CIEUCHALFW" + - "IDTH HANGUL LETTER SSANGCIEUCHALFWIDTH HANGUL LETTER CHIEUCHHALFWIDTH HA" + - "NGUL LETTER KHIEUKHHALFWIDTH HANGUL LETTER THIEUTHHALFWIDTH HANGUL LETTE" + - "R PHIEUPHHALFWIDTH HANGUL LETTER HIEUHHALFWIDTH HANGUL LETTER AHALFWIDTH" + - " HANGUL LETTER AEHALFWIDTH HANGUL LETTER YAHALFWIDTH HANGUL LETTER YAEHA" + - "LFWIDTH HANGUL LETTER EOHALFWIDTH HANGUL LETTER EHALFWIDTH HANGUL LETTER" + - " YEOHALFWIDTH HANGUL LETTER YEHALFWIDTH HANGUL LETTER OHALFWIDTH HANGUL " + - "LETTER WAHALFWIDTH HANGUL LETTER WAEHALFWIDTH HANGUL LETTER OEHALFWIDTH " + - "HANGUL LETTER YOHALFWIDTH HANGUL LETTER UHALFWIDTH HANGUL LETTER WEOHALF" + - "WIDTH HANGUL LETTER WEHALFWIDTH HANGUL LETTER WIHALFWIDTH HANGUL LETTER " + - "YUHALFWIDTH HANGUL LETTER EUHALFWIDTH HANGUL LETTER YIHALFWIDTH HANGUL L" + - "ETTER IFULLWIDTH CENT SIGNFULLWIDTH POUND SIGNFULLWIDTH NOT SIGNFULLWIDT" + - "H MACRONFULLWIDTH BROKEN BARFULLWIDTH YEN SIGNFULLWIDTH WON SIGNHALFWIDT" + - "H FORMS LIGHT VERTICALHALFWIDTH LEFTWARDS ARROWHALFWIDTH UPWARDS ARROWHA" + - "LFWIDTH RIGHTWARDS ARROWHALFWIDTH DOWNWARDS ARROWHALFWIDTH BLACK SQUAREH" + - "ALFWIDTH WHITE CIRCLEINTERLINEAR ANNOTATION ANCHORINTERLINEAR ANNOTATION" + - " SEPARATORINTERLINEAR ANNOTATION TERMINATOROBJECT REPLACEMENT CHARACTERR" + - "EPLACEMENT CHARACTERLINEAR B SYLLABLE B008 ALINEAR B SYLLABLE B038 ELINE" + - "AR B SYLLABLE B028 ILINEAR B SYLLABLE B061 OLINEAR B SYLLABLE B010 ULINE" + - "AR B SYLLABLE B001 DALINEAR B SYLLABLE B045 DELINEAR B SYLLABLE B007 DIL" + - "INEAR B SYLLABLE B014 DOLINEAR B SYLLABLE B051 DULINEAR B SYLLABLE B057 " + - "JALINEAR B SYLLABLE B046 JELINEAR B SYLLABLE B036 JOLINEAR B SYLLABLE B0" + - "65 JULINEAR B SYLLABLE B077 KALINEAR B SYLLABLE B044 KELINEAR B SYLLABLE" + - " B067 KILINEAR B SYLLABLE B070 KOLINEAR B SYLLABLE B081 KULINEAR B SYLLA" + - "BLE B080 MALINEAR B SYLLABLE B013 MELINEAR B SYLLABLE B073 MILINEAR B SY" + - "LLABLE B015 MOLINEAR B SYLLABLE B023 MULINEAR B SYLLABLE B006 NALINEAR B" + - " SYLLABLE B024 NELINEAR B SYLLABLE B030 NILINEAR B SYLLABLE B052 NOLINEA" + - "R B SYLLABLE B055 NULINEAR B SYLLABLE B003 PALINEAR B SYLLABLE B072 PELI" + - "NEAR B SYLLABLE B039 PILINEAR B SYLLABLE B011 POLINEAR B SYLLABLE B050 P" + - "ULINEAR B SYLLABLE B016 QALINEAR B SYLLABLE B078 QELINEAR B SYLLABLE B02" + - "1 QILINEAR B SYLLABLE B032 QOLINEAR B SYLLABLE B060 RALINEAR B SYLLABLE " + - "B027 RELINEAR B SYLLABLE B053 RILINEAR B SYLLABLE B002 ROLINEAR B SYLLAB" + - "LE B026 RULINEAR B SYLLABLE B031 SALINEAR B SYLLABLE B009 SELINEAR B SYL" + - "LABLE B041 SILINEAR B SYLLABLE B012 SOLINEAR B SYLLABLE B058 SULINEAR B " + - "SYLLABLE B059 TALINEAR B SYLLABLE B004 TELINEAR B SYLLABLE B037 TILINEAR" + - " B SYLLABLE B005 TOLINEAR B SYLLABLE B069 TULINEAR B SYLLABLE B054 WALIN" + - "EAR B SYLLABLE B075 WELINEAR B SYLLABLE B040 WILINEAR B SYLLABLE B042 WO" + - "LINEAR B SYLLABLE B017 ZALINEAR B SYLLABLE B074 ZELINEAR B SYLLABLE B020") + ("" + - " ZOLINEAR B SYLLABLE B025 A2LINEAR B SYLLABLE B043 A3LINEAR B SYLLABLE B" + - "085 AULINEAR B SYLLABLE B071 DWELINEAR B SYLLABLE B090 DWOLINEAR B SYLLA" + - "BLE B048 NWALINEAR B SYLLABLE B029 PU2LINEAR B SYLLABLE B062 PTELINEAR B" + - " SYLLABLE B076 RA2LINEAR B SYLLABLE B033 RA3LINEAR B SYLLABLE B068 RO2LI" + - "NEAR B SYLLABLE B066 TA2LINEAR B SYLLABLE B087 TWELINEAR B SYLLABLE B091" + - " TWOLINEAR B SYMBOL B018LINEAR B SYMBOL B019LINEAR B SYMBOL B022LINEAR B" + - " SYMBOL B034LINEAR B SYMBOL B047LINEAR B SYMBOL B049LINEAR B SYMBOL B056" + - "LINEAR B SYMBOL B063LINEAR B SYMBOL B064LINEAR B SYMBOL B079LINEAR B SYM" + - "BOL B082LINEAR B SYMBOL B083LINEAR B SYMBOL B086LINEAR B SYMBOL B089LINE" + - "AR B IDEOGRAM B100 MANLINEAR B IDEOGRAM B102 WOMANLINEAR B IDEOGRAM B104" + - " DEERLINEAR B IDEOGRAM B105 EQUIDLINEAR B IDEOGRAM B105F MARELINEAR B ID" + - "EOGRAM B105M STALLIONLINEAR B IDEOGRAM B106F EWELINEAR B IDEOGRAM B106M " + - "RAMLINEAR B IDEOGRAM B107F SHE-GOATLINEAR B IDEOGRAM B107M HE-GOATLINEAR" + - " B IDEOGRAM B108F SOWLINEAR B IDEOGRAM B108M BOARLINEAR B IDEOGRAM B109F" + - " COWLINEAR B IDEOGRAM B109M BULLLINEAR B IDEOGRAM B120 WHEATLINEAR B IDE" + - "OGRAM B121 BARLEYLINEAR B IDEOGRAM B122 OLIVELINEAR B IDEOGRAM B123 SPIC" + - "ELINEAR B IDEOGRAM B125 CYPERUSLINEAR B MONOGRAM B127 KAPOLINEAR B MONOG" + - "RAM B128 KANAKOLINEAR B IDEOGRAM B130 OILLINEAR B IDEOGRAM B131 WINELINE" + - "AR B IDEOGRAM B132LINEAR B MONOGRAM B133 AREPALINEAR B MONOGRAM B135 MER" + - "ILINEAR B IDEOGRAM B140 BRONZELINEAR B IDEOGRAM B141 GOLDLINEAR B IDEOGR" + - "AM B142LINEAR B IDEOGRAM B145 WOOLLINEAR B IDEOGRAM B146LINEAR B IDEOGRA" + - "M B150LINEAR B IDEOGRAM B151 HORNLINEAR B IDEOGRAM B152LINEAR B IDEOGRAM" + - " B153LINEAR B IDEOGRAM B154LINEAR B MONOGRAM B156 TURO2LINEAR B IDEOGRAM" + - " B157LINEAR B IDEOGRAM B158LINEAR B IDEOGRAM B159 CLOTHLINEAR B IDEOGRAM" + - " B160LINEAR B IDEOGRAM B161LINEAR B IDEOGRAM B162 GARMENTLINEAR B IDEOGR" + - "AM B163 ARMOURLINEAR B IDEOGRAM B164LINEAR B IDEOGRAM B165LINEAR B IDEOG" + - "RAM B166LINEAR B IDEOGRAM B167LINEAR B IDEOGRAM B168LINEAR B IDEOGRAM B1" + - "69LINEAR B IDEOGRAM B170LINEAR B IDEOGRAM B171LINEAR B IDEOGRAM B172LINE" + - "AR B IDEOGRAM B173 MONTHLINEAR B IDEOGRAM B174LINEAR B IDEOGRAM B176 TRE" + - "ELINEAR B IDEOGRAM B177LINEAR B IDEOGRAM B178LINEAR B IDEOGRAM B179LINEA" + - "R B IDEOGRAM B180LINEAR B IDEOGRAM B181LINEAR B IDEOGRAM B182LINEAR B ID" + - "EOGRAM B183LINEAR B IDEOGRAM B184LINEAR B IDEOGRAM B185LINEAR B IDEOGRAM" + - " B189LINEAR B IDEOGRAM B190LINEAR B IDEOGRAM B191 HELMETLINEAR B IDEOGRA" + - "M B220 FOOTSTOOLLINEAR B IDEOGRAM B225 BATHTUBLINEAR B IDEOGRAM B230 SPE" + - "ARLINEAR B IDEOGRAM B231 ARROWLINEAR B IDEOGRAM B232LINEAR B IDEOGRAM B2" + - "33 SWORDLINEAR B IDEOGRAM B234LINEAR B IDEOGRAM B236LINEAR B IDEOGRAM B2" + - "40 WHEELED CHARIOTLINEAR B IDEOGRAM B241 CHARIOTLINEAR B IDEOGRAM B242 C" + - "HARIOT FRAMELINEAR B IDEOGRAM B243 WHEELLINEAR B IDEOGRAM B245LINEAR B I" + - "DEOGRAM B246LINEAR B MONOGRAM B247 DIPTELINEAR B IDEOGRAM B248LINEAR B I" + - "DEOGRAM B249LINEAR B IDEOGRAM B251LINEAR B IDEOGRAM B252LINEAR B IDEOGRA" + - "M B253LINEAR B IDEOGRAM B254 DARTLINEAR B IDEOGRAM B255LINEAR B IDEOGRAM" + - " B256LINEAR B IDEOGRAM B257LINEAR B IDEOGRAM B258LINEAR B IDEOGRAM B259L" + - "INEAR B IDEOGRAM VESSEL B155LINEAR B IDEOGRAM VESSEL B200LINEAR B IDEOGR" + - "AM VESSEL B201LINEAR B IDEOGRAM VESSEL B202LINEAR B IDEOGRAM VESSEL B203" + - "LINEAR B IDEOGRAM VESSEL B204LINEAR B IDEOGRAM VESSEL B205LINEAR B IDEOG" + - "RAM VESSEL B206LINEAR B IDEOGRAM VESSEL B207LINEAR B IDEOGRAM VESSEL B20" + - "8LINEAR B IDEOGRAM VESSEL B209LINEAR B IDEOGRAM VESSEL B210LINEAR B IDEO" + - "GRAM VESSEL B211LINEAR B IDEOGRAM VESSEL B212LINEAR B IDEOGRAM VESSEL B2" + - "13LINEAR B IDEOGRAM VESSEL B214LINEAR B IDEOGRAM VESSEL B215LINEAR B IDE" + - "OGRAM VESSEL B216LINEAR B IDEOGRAM VESSEL B217LINEAR B IDEOGRAM VESSEL B" + - "218LINEAR B IDEOGRAM VESSEL B219LINEAR B IDEOGRAM VESSEL B221LINEAR B ID" + - "EOGRAM VESSEL B222LINEAR B IDEOGRAM VESSEL B226LINEAR B IDEOGRAM VESSEL " + - "B227LINEAR B IDEOGRAM VESSEL B228LINEAR B IDEOGRAM VESSEL B229LINEAR B I" + - "DEOGRAM VESSEL B250LINEAR B IDEOGRAM VESSEL B305AEGEAN WORD SEPARATOR LI" + - "NEAEGEAN WORD SEPARATOR DOTAEGEAN CHECK MARKAEGEAN NUMBER ONEAEGEAN NUMB" + - "ER TWOAEGEAN NUMBER THREEAEGEAN NUMBER FOURAEGEAN NUMBER FIVEAEGEAN NUMB" + - "ER SIXAEGEAN NUMBER SEVENAEGEAN NUMBER EIGHTAEGEAN NUMBER NINEAEGEAN NUM" + - "BER TENAEGEAN NUMBER TWENTYAEGEAN NUMBER THIRTYAEGEAN NUMBER FORTYAEGEAN" + - " NUMBER FIFTYAEGEAN NUMBER SIXTYAEGEAN NUMBER SEVENTYAEGEAN NUMBER EIGHT" + - "YAEGEAN NUMBER NINETYAEGEAN NUMBER ONE HUNDREDAEGEAN NUMBER TWO HUNDREDA" + - "EGEAN NUMBER THREE HUNDREDAEGEAN NUMBER FOUR HUNDREDAEGEAN NUMBER FIVE H" + - "UNDREDAEGEAN NUMBER SIX HUNDREDAEGEAN NUMBER SEVEN HUNDREDAEGEAN NUMBER " + - "EIGHT HUNDREDAEGEAN NUMBER NINE HUNDREDAEGEAN NUMBER ONE THOUSANDAEGEAN " + - "NUMBER TWO THOUSANDAEGEAN NUMBER THREE THOUSANDAEGEAN NUMBER FOUR THOUSA") + ("" + - "NDAEGEAN NUMBER FIVE THOUSANDAEGEAN NUMBER SIX THOUSANDAEGEAN NUMBER SEV" + - "EN THOUSANDAEGEAN NUMBER EIGHT THOUSANDAEGEAN NUMBER NINE THOUSANDAEGEAN" + - " NUMBER TEN THOUSANDAEGEAN NUMBER TWENTY THOUSANDAEGEAN NUMBER THIRTY TH" + - "OUSANDAEGEAN NUMBER FORTY THOUSANDAEGEAN NUMBER FIFTY THOUSANDAEGEAN NUM" + - "BER SIXTY THOUSANDAEGEAN NUMBER SEVENTY THOUSANDAEGEAN NUMBER EIGHTY THO" + - "USANDAEGEAN NUMBER NINETY THOUSANDAEGEAN WEIGHT BASE UNITAEGEAN WEIGHT F" + - "IRST SUBUNITAEGEAN WEIGHT SECOND SUBUNITAEGEAN WEIGHT THIRD SUBUNITAEGEA" + - "N WEIGHT FOURTH SUBUNITAEGEAN DRY MEASURE FIRST SUBUNITAEGEAN LIQUID MEA" + - "SURE FIRST SUBUNITAEGEAN MEASURE SECOND SUBUNITAEGEAN MEASURE THIRD SUBU" + - "NITGREEK ACROPHONIC ATTIC ONE QUARTERGREEK ACROPHONIC ATTIC ONE HALFGREE" + - "K ACROPHONIC ATTIC ONE DRACHMAGREEK ACROPHONIC ATTIC FIVEGREEK ACROPHONI" + - "C ATTIC FIFTYGREEK ACROPHONIC ATTIC FIVE HUNDREDGREEK ACROPHONIC ATTIC F" + - "IVE THOUSANDGREEK ACROPHONIC ATTIC FIFTY THOUSANDGREEK ACROPHONIC ATTIC " + - "FIVE TALENTSGREEK ACROPHONIC ATTIC TEN TALENTSGREEK ACROPHONIC ATTIC FIF" + - "TY TALENTSGREEK ACROPHONIC ATTIC ONE HUNDRED TALENTSGREEK ACROPHONIC ATT" + - "IC FIVE HUNDRED TALENTSGREEK ACROPHONIC ATTIC ONE THOUSAND TALENTSGREEK " + - "ACROPHONIC ATTIC FIVE THOUSAND TALENTSGREEK ACROPHONIC ATTIC FIVE STATER" + - "SGREEK ACROPHONIC ATTIC TEN STATERSGREEK ACROPHONIC ATTIC FIFTY STATERSG" + - "REEK ACROPHONIC ATTIC ONE HUNDRED STATERSGREEK ACROPHONIC ATTIC FIVE HUN" + - "DRED STATERSGREEK ACROPHONIC ATTIC ONE THOUSAND STATERSGREEK ACROPHONIC " + - "ATTIC TEN THOUSAND STATERSGREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERSG" + - "REEK ACROPHONIC ATTIC TEN MNASGREEK ACROPHONIC HERAEUM ONE PLETHRONGREEK" + - " ACROPHONIC THESPIAN ONEGREEK ACROPHONIC HERMIONIAN ONEGREEK ACROPHONIC " + - "EPIDAUREAN TWOGREEK ACROPHONIC THESPIAN TWOGREEK ACROPHONIC CYRENAIC TWO" + - " DRACHMASGREEK ACROPHONIC EPIDAUREAN TWO DRACHMASGREEK ACROPHONIC TROEZE" + - "NIAN FIVEGREEK ACROPHONIC TROEZENIAN TENGREEK ACROPHONIC TROEZENIAN TEN " + - "ALTERNATE FORMGREEK ACROPHONIC HERMIONIAN TENGREEK ACROPHONIC MESSENIAN " + - "TENGREEK ACROPHONIC THESPIAN TENGREEK ACROPHONIC THESPIAN THIRTYGREEK AC" + - "ROPHONIC TROEZENIAN FIFTYGREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FOR" + - "MGREEK ACROPHONIC HERMIONIAN FIFTYGREEK ACROPHONIC THESPIAN FIFTYGREEK A" + - "CROPHONIC THESPIAN ONE HUNDREDGREEK ACROPHONIC THESPIAN THREE HUNDREDGRE" + - "EK ACROPHONIC EPIDAUREAN FIVE HUNDREDGREEK ACROPHONIC TROEZENIAN FIVE HU" + - "NDREDGREEK ACROPHONIC THESPIAN FIVE HUNDREDGREEK ACROPHONIC CARYSTIAN FI" + - "VE HUNDREDGREEK ACROPHONIC NAXIAN FIVE HUNDREDGREEK ACROPHONIC THESPIAN " + - "ONE THOUSANDGREEK ACROPHONIC THESPIAN FIVE THOUSANDGREEK ACROPHONIC DELP" + - "HIC FIVE MNASGREEK ACROPHONIC STRATIAN FIFTY MNASGREEK ONE HALF SIGNGREE" + - "K ONE HALF SIGN ALTERNATE FORMGREEK TWO THIRDS SIGNGREEK THREE QUARTERS " + - "SIGNGREEK YEAR SIGNGREEK TALENT SIGNGREEK DRACHMA SIGNGREEK OBOL SIGNGRE" + - "EK TWO OBOLS SIGNGREEK THREE OBOLS SIGNGREEK FOUR OBOLS SIGNGREEK FIVE O" + - "BOLS SIGNGREEK METRETES SIGNGREEK KYATHOS BASE SIGNGREEK LITRA SIGNGREEK" + - " OUNKIA SIGNGREEK XESTES SIGNGREEK ARTABE SIGNGREEK AROURA SIGNGREEK GRA" + - "MMA SIGNGREEK TRYBLION BASE SIGNGREEK ZERO SIGNGREEK ONE QUARTER SIGNGRE" + - "EK SINUSOID SIGNGREEK INDICTION SIGNNOMISMA SIGNROMAN SEXTANS SIGNROMAN " + - "UNCIA SIGNROMAN SEMUNCIA SIGNROMAN SEXTULA SIGNROMAN DIMIDIA SEXTULA SIG" + - "NROMAN SILIQUA SIGNROMAN DENARIUS SIGNROMAN QUINARIUS SIGNROMAN SESTERTI" + - "US SIGNROMAN DUPONDIUS SIGNROMAN AS SIGNROMAN CENTURIAL SIGNGREEK SYMBOL" + - " TAU RHOPHAISTOS DISC SIGN PEDESTRIANPHAISTOS DISC SIGN PLUMED HEADPHAIS" + - "TOS DISC SIGN TATTOOED HEADPHAISTOS DISC SIGN CAPTIVEPHAISTOS DISC SIGN " + - "CHILDPHAISTOS DISC SIGN WOMANPHAISTOS DISC SIGN HELMETPHAISTOS DISC SIGN" + - " GAUNTLETPHAISTOS DISC SIGN TIARAPHAISTOS DISC SIGN ARROWPHAISTOS DISC S" + - "IGN BOWPHAISTOS DISC SIGN SHIELDPHAISTOS DISC SIGN CLUBPHAISTOS DISC SIG" + - "N MANACLESPHAISTOS DISC SIGN MATTOCKPHAISTOS DISC SIGN SAWPHAISTOS DISC " + - "SIGN LIDPHAISTOS DISC SIGN BOOMERANGPHAISTOS DISC SIGN CARPENTRY PLANEPH" + - "AISTOS DISC SIGN DOLIUMPHAISTOS DISC SIGN COMBPHAISTOS DISC SIGN SLINGPH" + - "AISTOS DISC SIGN COLUMNPHAISTOS DISC SIGN BEEHIVEPHAISTOS DISC SIGN SHIP" + - "PHAISTOS DISC SIGN HORNPHAISTOS DISC SIGN HIDEPHAISTOS DISC SIGN BULLS L" + - "EGPHAISTOS DISC SIGN CATPHAISTOS DISC SIGN RAMPHAISTOS DISC SIGN EAGLEPH" + - "AISTOS DISC SIGN DOVEPHAISTOS DISC SIGN TUNNYPHAISTOS DISC SIGN BEEPHAIS" + - "TOS DISC SIGN PLANE TREEPHAISTOS DISC SIGN VINEPHAISTOS DISC SIGN PAPYRU" + - "SPHAISTOS DISC SIGN ROSETTEPHAISTOS DISC SIGN LILYPHAISTOS DISC SIGN OX " + - "BACKPHAISTOS DISC SIGN FLUTEPHAISTOS DISC SIGN GRATERPHAISTOS DISC SIGN " + - "STRAINERPHAISTOS DISC SIGN SMALL AXEPHAISTOS DISC SIGN WAVY BANDPHAISTOS" + - " DISC SIGN COMBINING OBLIQUE STROKELYCIAN LETTER ALYCIAN LETTER ELYCIAN " + - "LETTER BLYCIAN LETTER BHLYCIAN LETTER GLYCIAN LETTER DLYCIAN LETTER ILYC") + ("" + - "IAN LETTER WLYCIAN LETTER ZLYCIAN LETTER THLYCIAN LETTER JLYCIAN LETTER " + - "KLYCIAN LETTER QLYCIAN LETTER LLYCIAN LETTER MLYCIAN LETTER NLYCIAN LETT" + - "ER MMLYCIAN LETTER NNLYCIAN LETTER ULYCIAN LETTER PLYCIAN LETTER KKLYCIA" + - "N LETTER RLYCIAN LETTER SLYCIAN LETTER TLYCIAN LETTER TTLYCIAN LETTER AN" + - "LYCIAN LETTER ENLYCIAN LETTER HLYCIAN LETTER XCARIAN LETTER ACARIAN LETT" + - "ER P2CARIAN LETTER DCARIAN LETTER LCARIAN LETTER UUUCARIAN LETTER RCARIA" + - "N LETTER LDCARIAN LETTER A2CARIAN LETTER QCARIAN LETTER BCARIAN LETTER M" + - "CARIAN LETTER OCARIAN LETTER D2CARIAN LETTER TCARIAN LETTER SHCARIAN LET" + - "TER SH2CARIAN LETTER SCARIAN LETTER C-18CARIAN LETTER UCARIAN LETTER NNC" + - "ARIAN LETTER XCARIAN LETTER NCARIAN LETTER TT2CARIAN LETTER PCARIAN LETT" + - "ER SSCARIAN LETTER ICARIAN LETTER ECARIAN LETTER UUUUCARIAN LETTER KCARI" + - "AN LETTER K2CARIAN LETTER NDCARIAN LETTER UUCARIAN LETTER GCARIAN LETTER" + - " G2CARIAN LETTER STCARIAN LETTER ST2CARIAN LETTER NGCARIAN LETTER IICARI" + - "AN LETTER C-39CARIAN LETTER TTCARIAN LETTER UUU2CARIAN LETTER RRCARIAN L" + - "ETTER MBCARIAN LETTER MB2CARIAN LETTER MB3CARIAN LETTER MB4CARIAN LETTER" + - " LD2CARIAN LETTER E2CARIAN LETTER UUU3COPTIC EPACT THOUSANDS MARKCOPTIC " + - "EPACT DIGIT ONECOPTIC EPACT DIGIT TWOCOPTIC EPACT DIGIT THREECOPTIC EPAC" + - "T DIGIT FOURCOPTIC EPACT DIGIT FIVECOPTIC EPACT DIGIT SIXCOPTIC EPACT DI" + - "GIT SEVENCOPTIC EPACT DIGIT EIGHTCOPTIC EPACT DIGIT NINECOPTIC EPACT NUM" + - "BER TENCOPTIC EPACT NUMBER TWENTYCOPTIC EPACT NUMBER THIRTYCOPTIC EPACT " + - "NUMBER FORTYCOPTIC EPACT NUMBER FIFTYCOPTIC EPACT NUMBER SIXTYCOPTIC EPA" + - "CT NUMBER SEVENTYCOPTIC EPACT NUMBER EIGHTYCOPTIC EPACT NUMBER NINETYCOP" + - "TIC EPACT NUMBER ONE HUNDREDCOPTIC EPACT NUMBER TWO HUNDREDCOPTIC EPACT " + - "NUMBER THREE HUNDREDCOPTIC EPACT NUMBER FOUR HUNDREDCOPTIC EPACT NUMBER " + - "FIVE HUNDREDCOPTIC EPACT NUMBER SIX HUNDREDCOPTIC EPACT NUMBER SEVEN HUN" + - "DREDCOPTIC EPACT NUMBER EIGHT HUNDREDCOPTIC EPACT NUMBER NINE HUNDREDOLD" + - " ITALIC LETTER AOLD ITALIC LETTER BEOLD ITALIC LETTER KEOLD ITALIC LETTE" + - "R DEOLD ITALIC LETTER EOLD ITALIC LETTER VEOLD ITALIC LETTER ZEOLD ITALI" + - "C LETTER HEOLD ITALIC LETTER THEOLD ITALIC LETTER IOLD ITALIC LETTER KAO" + - "LD ITALIC LETTER ELOLD ITALIC LETTER EMOLD ITALIC LETTER ENOLD ITALIC LE" + - "TTER ESHOLD ITALIC LETTER OOLD ITALIC LETTER PEOLD ITALIC LETTER SHEOLD " + - "ITALIC LETTER KUOLD ITALIC LETTER EROLD ITALIC LETTER ESOLD ITALIC LETTE" + - "R TEOLD ITALIC LETTER UOLD ITALIC LETTER EKSOLD ITALIC LETTER PHEOLD ITA" + - "LIC LETTER KHEOLD ITALIC LETTER EFOLD ITALIC LETTER ERSOLD ITALIC LETTER" + - " CHEOLD ITALIC LETTER IIOLD ITALIC LETTER UUOLD ITALIC LETTER ESSOLD ITA" + - "LIC NUMERAL ONEOLD ITALIC NUMERAL FIVEOLD ITALIC NUMERAL TENOLD ITALIC N" + - "UMERAL FIFTYGOTHIC LETTER AHSAGOTHIC LETTER BAIRKANGOTHIC LETTER GIBAGOT" + - "HIC LETTER DAGSGOTHIC LETTER AIHVUSGOTHIC LETTER QAIRTHRAGOTHIC LETTER I" + - "UJAGOTHIC LETTER HAGLGOTHIC LETTER THIUTHGOTHIC LETTER EISGOTHIC LETTER " + - "KUSMAGOTHIC LETTER LAGUSGOTHIC LETTER MANNAGOTHIC LETTER NAUTHSGOTHIC LE" + - "TTER JERGOTHIC LETTER URUSGOTHIC LETTER PAIRTHRAGOTHIC LETTER NINETYGOTH" + - "IC LETTER RAIDAGOTHIC LETTER SAUILGOTHIC LETTER TEIWSGOTHIC LETTER WINJA" + - "GOTHIC LETTER FAIHUGOTHIC LETTER IGGWSGOTHIC LETTER HWAIRGOTHIC LETTER O" + - "THALGOTHIC LETTER NINE HUNDREDOLD PERMIC LETTER ANOLD PERMIC LETTER BURO" + - "LD PERMIC LETTER GAIOLD PERMIC LETTER DOIOLD PERMIC LETTER EOLD PERMIC L" + - "ETTER ZHOIOLD PERMIC LETTER DZHOIOLD PERMIC LETTER ZATAOLD PERMIC LETTER" + - " DZITAOLD PERMIC LETTER IOLD PERMIC LETTER KOKEOLD PERMIC LETTER LEIOLD " + - "PERMIC LETTER MENOEOLD PERMIC LETTER NENOEOLD PERMIC LETTER VOOIOLD PERM" + - "IC LETTER PEEIOLD PERMIC LETTER REIOLD PERMIC LETTER SIIOLD PERMIC LETTE" + - "R TAIOLD PERMIC LETTER UOLD PERMIC LETTER CHERYOLD PERMIC LETTER SHOOIOL" + - "D PERMIC LETTER SHCHOOIOLD PERMIC LETTER YRYOLD PERMIC LETTER YERUOLD PE" + - "RMIC LETTER OOLD PERMIC LETTER OOOLD PERMIC LETTER EFOLD PERMIC LETTER H" + - "AOLD PERMIC LETTER TSIUOLD PERMIC LETTER VEROLD PERMIC LETTER YEROLD PER" + - "MIC LETTER YERIOLD PERMIC LETTER YATOLD PERMIC LETTER IEOLD PERMIC LETTE" + - "R YUOLD PERMIC LETTER YAOLD PERMIC LETTER IACOMBINING OLD PERMIC LETTER " + - "ANCOMBINING OLD PERMIC LETTER DOICOMBINING OLD PERMIC LETTER ZATACOMBINI" + - "NG OLD PERMIC LETTER NENOECOMBINING OLD PERMIC LETTER SIIUGARITIC LETTER" + - " ALPAUGARITIC LETTER BETAUGARITIC LETTER GAMLAUGARITIC LETTER KHAUGARITI" + - "C LETTER DELTAUGARITIC LETTER HOUGARITIC LETTER WOUGARITIC LETTER ZETAUG" + - "ARITIC LETTER HOTAUGARITIC LETTER TETUGARITIC LETTER YODUGARITIC LETTER " + - "KAFUGARITIC LETTER SHINUGARITIC LETTER LAMDAUGARITIC LETTER MEMUGARITIC " + - "LETTER DHALUGARITIC LETTER NUNUGARITIC LETTER ZUUGARITIC LETTER SAMKAUGA" + - "RITIC LETTER AINUGARITIC LETTER PUUGARITIC LETTER SADEUGARITIC LETTER QO" + - "PAUGARITIC LETTER RASHAUGARITIC LETTER THANNAUGARITIC LETTER GHAINUGARIT") + ("" + - "IC LETTER TOUGARITIC LETTER IUGARITIC LETTER UUGARITIC LETTER SSUUGARITI" + - "C WORD DIVIDEROLD PERSIAN SIGN AOLD PERSIAN SIGN IOLD PERSIAN SIGN UOLD " + - "PERSIAN SIGN KAOLD PERSIAN SIGN KUOLD PERSIAN SIGN GAOLD PERSIAN SIGN GU" + - "OLD PERSIAN SIGN XAOLD PERSIAN SIGN CAOLD PERSIAN SIGN JAOLD PERSIAN SIG" + - "N JIOLD PERSIAN SIGN TAOLD PERSIAN SIGN TUOLD PERSIAN SIGN DAOLD PERSIAN" + - " SIGN DIOLD PERSIAN SIGN DUOLD PERSIAN SIGN THAOLD PERSIAN SIGN PAOLD PE" + - "RSIAN SIGN BAOLD PERSIAN SIGN FAOLD PERSIAN SIGN NAOLD PERSIAN SIGN NUOL" + - "D PERSIAN SIGN MAOLD PERSIAN SIGN MIOLD PERSIAN SIGN MUOLD PERSIAN SIGN " + - "YAOLD PERSIAN SIGN VAOLD PERSIAN SIGN VIOLD PERSIAN SIGN RAOLD PERSIAN S" + - "IGN RUOLD PERSIAN SIGN LAOLD PERSIAN SIGN SAOLD PERSIAN SIGN ZAOLD PERSI" + - "AN SIGN SHAOLD PERSIAN SIGN SSAOLD PERSIAN SIGN HAOLD PERSIAN SIGN AURAM" + - "AZDAAOLD PERSIAN SIGN AURAMAZDAA-2OLD PERSIAN SIGN AURAMAZDAAHAOLD PERSI" + - "AN SIGN XSHAAYATHIYAOLD PERSIAN SIGN DAHYAAUSHOLD PERSIAN SIGN DAHYAAUSH" + - "-2OLD PERSIAN SIGN BAGAOLD PERSIAN SIGN BUUMISHOLD PERSIAN WORD DIVIDERO" + - "LD PERSIAN NUMBER ONEOLD PERSIAN NUMBER TWOOLD PERSIAN NUMBER TENOLD PER" + - "SIAN NUMBER TWENTYOLD PERSIAN NUMBER HUNDREDDESERET CAPITAL LETTER LONG " + - "IDESERET CAPITAL LETTER LONG EDESERET CAPITAL LETTER LONG ADESERET CAPIT" + - "AL LETTER LONG AHDESERET CAPITAL LETTER LONG ODESERET CAPITAL LETTER LON" + - "G OODESERET CAPITAL LETTER SHORT IDESERET CAPITAL LETTER SHORT EDESERET " + - "CAPITAL LETTER SHORT ADESERET CAPITAL LETTER SHORT AHDESERET CAPITAL LET" + - "TER SHORT ODESERET CAPITAL LETTER SHORT OODESERET CAPITAL LETTER AYDESER" + - "ET CAPITAL LETTER OWDESERET CAPITAL LETTER WUDESERET CAPITAL LETTER YEED" + - "ESERET CAPITAL LETTER HDESERET CAPITAL LETTER PEEDESERET CAPITAL LETTER " + - "BEEDESERET CAPITAL LETTER TEEDESERET CAPITAL LETTER DEEDESERET CAPITAL L" + - "ETTER CHEEDESERET CAPITAL LETTER JEEDESERET CAPITAL LETTER KAYDESERET CA" + - "PITAL LETTER GAYDESERET CAPITAL LETTER EFDESERET CAPITAL LETTER VEEDESER" + - "ET CAPITAL LETTER ETHDESERET CAPITAL LETTER THEEDESERET CAPITAL LETTER E" + - "SDESERET CAPITAL LETTER ZEEDESERET CAPITAL LETTER ESHDESERET CAPITAL LET" + - "TER ZHEEDESERET CAPITAL LETTER ERDESERET CAPITAL LETTER ELDESERET CAPITA" + - "L LETTER EMDESERET CAPITAL LETTER ENDESERET CAPITAL LETTER ENGDESERET CA" + - "PITAL LETTER OIDESERET CAPITAL LETTER EWDESERET SMALL LETTER LONG IDESER" + - "ET SMALL LETTER LONG EDESERET SMALL LETTER LONG ADESERET SMALL LETTER LO" + - "NG AHDESERET SMALL LETTER LONG ODESERET SMALL LETTER LONG OODESERET SMAL" + - "L LETTER SHORT IDESERET SMALL LETTER SHORT EDESERET SMALL LETTER SHORT A" + - "DESERET SMALL LETTER SHORT AHDESERET SMALL LETTER SHORT ODESERET SMALL L" + - "ETTER SHORT OODESERET SMALL LETTER AYDESERET SMALL LETTER OWDESERET SMAL" + - "L LETTER WUDESERET SMALL LETTER YEEDESERET SMALL LETTER HDESERET SMALL L" + - "ETTER PEEDESERET SMALL LETTER BEEDESERET SMALL LETTER TEEDESERET SMALL L" + - "ETTER DEEDESERET SMALL LETTER CHEEDESERET SMALL LETTER JEEDESERET SMALL " + - "LETTER KAYDESERET SMALL LETTER GAYDESERET SMALL LETTER EFDESERET SMALL L" + - "ETTER VEEDESERET SMALL LETTER ETHDESERET SMALL LETTER THEEDESERET SMALL " + - "LETTER ESDESERET SMALL LETTER ZEEDESERET SMALL LETTER ESHDESERET SMALL L" + - "ETTER ZHEEDESERET SMALL LETTER ERDESERET SMALL LETTER ELDESERET SMALL LE" + - "TTER EMDESERET SMALL LETTER ENDESERET SMALL LETTER ENGDESERET SMALL LETT" + - "ER OIDESERET SMALL LETTER EWSHAVIAN LETTER PEEPSHAVIAN LETTER TOTSHAVIAN" + - " LETTER KICKSHAVIAN LETTER FEESHAVIAN LETTER THIGHSHAVIAN LETTER SOSHAVI" + - "AN LETTER SURESHAVIAN LETTER CHURCHSHAVIAN LETTER YEASHAVIAN LETTER HUNG" + - "SHAVIAN LETTER BIBSHAVIAN LETTER DEADSHAVIAN LETTER GAGSHAVIAN LETTER VO" + - "WSHAVIAN LETTER THEYSHAVIAN LETTER ZOOSHAVIAN LETTER MEASURESHAVIAN LETT" + - "ER JUDGESHAVIAN LETTER WOESHAVIAN LETTER HA-HASHAVIAN LETTER LOLLSHAVIAN" + - " LETTER MIMESHAVIAN LETTER IFSHAVIAN LETTER EGGSHAVIAN LETTER ASHSHAVIAN" + - " LETTER ADOSHAVIAN LETTER ONSHAVIAN LETTER WOOLSHAVIAN LETTER OUTSHAVIAN" + - " LETTER AHSHAVIAN LETTER ROARSHAVIAN LETTER NUNSHAVIAN LETTER EATSHAVIAN" + - " LETTER AGESHAVIAN LETTER ICESHAVIAN LETTER UPSHAVIAN LETTER OAKSHAVIAN " + - "LETTER OOZESHAVIAN LETTER OILSHAVIAN LETTER AWESHAVIAN LETTER ARESHAVIAN" + - " LETTER ORSHAVIAN LETTER AIRSHAVIAN LETTER ERRSHAVIAN LETTER ARRAYSHAVIA" + - "N LETTER EARSHAVIAN LETTER IANSHAVIAN LETTER YEWOSMANYA LETTER ALEFOSMAN" + - "YA LETTER BAOSMANYA LETTER TAOSMANYA LETTER JAOSMANYA LETTER XAOSMANYA L" + - "ETTER KHAOSMANYA LETTER DEELOSMANYA LETTER RAOSMANYA LETTER SAOSMANYA LE" + - "TTER SHIINOSMANYA LETTER DHAOSMANYA LETTER CAYNOSMANYA LETTER GAOSMANYA " + - "LETTER FAOSMANYA LETTER QAAFOSMANYA LETTER KAAFOSMANYA LETTER LAANOSMANY" + - "A LETTER MIINOSMANYA LETTER NUUNOSMANYA LETTER WAWOSMANYA LETTER HAOSMAN" + - "YA LETTER YAOSMANYA LETTER AOSMANYA LETTER EOSMANYA LETTER IOSMANYA LETT" + - "ER OOSMANYA LETTER UOSMANYA LETTER AAOSMANYA LETTER EEOSMANYA LETTER OOO") + ("" + - "SMANYA DIGIT ZEROOSMANYA DIGIT ONEOSMANYA DIGIT TWOOSMANYA DIGIT THREEOS" + - "MANYA DIGIT FOUROSMANYA DIGIT FIVEOSMANYA DIGIT SIXOSMANYA DIGIT SEVENOS" + - "MANYA DIGIT EIGHTOSMANYA DIGIT NINEOSAGE CAPITAL LETTER AOSAGE CAPITAL L" + - "ETTER AIOSAGE CAPITAL LETTER AINOSAGE CAPITAL LETTER AHOSAGE CAPITAL LET" + - "TER BRAOSAGE CAPITAL LETTER CHAOSAGE CAPITAL LETTER EHCHAOSAGE CAPITAL L" + - "ETTER EOSAGE CAPITAL LETTER EINOSAGE CAPITAL LETTER HAOSAGE CAPITAL LETT" + - "ER HYAOSAGE CAPITAL LETTER IOSAGE CAPITAL LETTER KAOSAGE CAPITAL LETTER " + - "EHKAOSAGE CAPITAL LETTER KYAOSAGE CAPITAL LETTER LAOSAGE CAPITAL LETTER " + - "MAOSAGE CAPITAL LETTER NAOSAGE CAPITAL LETTER OOSAGE CAPITAL LETTER OINO" + - "SAGE CAPITAL LETTER PAOSAGE CAPITAL LETTER EHPAOSAGE CAPITAL LETTER SAOS" + - "AGE CAPITAL LETTER SHAOSAGE CAPITAL LETTER TAOSAGE CAPITAL LETTER EHTAOS" + - "AGE CAPITAL LETTER TSAOSAGE CAPITAL LETTER EHTSAOSAGE CAPITAL LETTER TSH" + - "AOSAGE CAPITAL LETTER DHAOSAGE CAPITAL LETTER UOSAGE CAPITAL LETTER WAOS" + - "AGE CAPITAL LETTER KHAOSAGE CAPITAL LETTER GHAOSAGE CAPITAL LETTER ZAOSA" + - "GE CAPITAL LETTER ZHAOSAGE SMALL LETTER AOSAGE SMALL LETTER AIOSAGE SMAL" + - "L LETTER AINOSAGE SMALL LETTER AHOSAGE SMALL LETTER BRAOSAGE SMALL LETTE" + - "R CHAOSAGE SMALL LETTER EHCHAOSAGE SMALL LETTER EOSAGE SMALL LETTER EINO" + - "SAGE SMALL LETTER HAOSAGE SMALL LETTER HYAOSAGE SMALL LETTER IOSAGE SMAL" + - "L LETTER KAOSAGE SMALL LETTER EHKAOSAGE SMALL LETTER KYAOSAGE SMALL LETT" + - "ER LAOSAGE SMALL LETTER MAOSAGE SMALL LETTER NAOSAGE SMALL LETTER OOSAGE" + - " SMALL LETTER OINOSAGE SMALL LETTER PAOSAGE SMALL LETTER EHPAOSAGE SMALL" + - " LETTER SAOSAGE SMALL LETTER SHAOSAGE SMALL LETTER TAOSAGE SMALL LETTER " + - "EHTAOSAGE SMALL LETTER TSAOSAGE SMALL LETTER EHTSAOSAGE SMALL LETTER TSH" + - "AOSAGE SMALL LETTER DHAOSAGE SMALL LETTER UOSAGE SMALL LETTER WAOSAGE SM" + - "ALL LETTER KHAOSAGE SMALL LETTER GHAOSAGE SMALL LETTER ZAOSAGE SMALL LET" + - "TER ZHAELBASAN LETTER AELBASAN LETTER BEELBASAN LETTER CEELBASAN LETTER " + - "CHEELBASAN LETTER DEELBASAN LETTER NDEELBASAN LETTER DHEELBASAN LETTER E" + - "IELBASAN LETTER EELBASAN LETTER FEELBASAN LETTER GEELBASAN LETTER GJEELB" + - "ASAN LETTER HEELBASAN LETTER IELBASAN LETTER JEELBASAN LETTER KEELBASAN " + - "LETTER LEELBASAN LETTER LLEELBASAN LETTER MEELBASAN LETTER NEELBASAN LET" + - "TER NAELBASAN LETTER NJEELBASAN LETTER OELBASAN LETTER PEELBASAN LETTER " + - "QEELBASAN LETTER REELBASAN LETTER RREELBASAN LETTER SEELBASAN LETTER SHE" + - "ELBASAN LETTER TEELBASAN LETTER THEELBASAN LETTER UELBASAN LETTER VEELBA" + - "SAN LETTER XEELBASAN LETTER YELBASAN LETTER ZEELBASAN LETTER ZHEELBASAN " + - "LETTER GHEELBASAN LETTER GHAMMAELBASAN LETTER KHECAUCASIAN ALBANIAN LETT" + - "ER ALTCAUCASIAN ALBANIAN LETTER BETCAUCASIAN ALBANIAN LETTER GIMCAUCASIA" + - "N ALBANIAN LETTER DATCAUCASIAN ALBANIAN LETTER EBCAUCASIAN ALBANIAN LETT" + - "ER ZARLCAUCASIAN ALBANIAN LETTER EYNCAUCASIAN ALBANIAN LETTER ZHILCAUCAS" + - "IAN ALBANIAN LETTER TASCAUCASIAN ALBANIAN LETTER CHACAUCASIAN ALBANIAN L" + - "ETTER YOWDCAUCASIAN ALBANIAN LETTER ZHACAUCASIAN ALBANIAN LETTER IRBCAUC" + - "ASIAN ALBANIAN LETTER SHACAUCASIAN ALBANIAN LETTER LANCAUCASIAN ALBANIAN" + - " LETTER INYACAUCASIAN ALBANIAN LETTER XEYNCAUCASIAN ALBANIAN LETTER DYAN" + - "CAUCASIAN ALBANIAN LETTER CARCAUCASIAN ALBANIAN LETTER JHOXCAUCASIAN ALB" + - "ANIAN LETTER KARCAUCASIAN ALBANIAN LETTER LYITCAUCASIAN ALBANIAN LETTER " + - "HEYTCAUCASIAN ALBANIAN LETTER QAYCAUCASIAN ALBANIAN LETTER AORCAUCASIAN " + - "ALBANIAN LETTER CHOYCAUCASIAN ALBANIAN LETTER CHICAUCASIAN ALBANIAN LETT" + - "ER CYAYCAUCASIAN ALBANIAN LETTER MAQCAUCASIAN ALBANIAN LETTER QARCAUCASI" + - "AN ALBANIAN LETTER NOWCCAUCASIAN ALBANIAN LETTER DZYAYCAUCASIAN ALBANIAN" + - " LETTER SHAKCAUCASIAN ALBANIAN LETTER JAYNCAUCASIAN ALBANIAN LETTER ONCA" + - "UCASIAN ALBANIAN LETTER TYAYCAUCASIAN ALBANIAN LETTER FAMCAUCASIAN ALBAN" + - "IAN LETTER DZAYCAUCASIAN ALBANIAN LETTER CHATCAUCASIAN ALBANIAN LETTER P" + - "ENCAUCASIAN ALBANIAN LETTER GHEYSCAUCASIAN ALBANIAN LETTER RATCAUCASIAN " + - "ALBANIAN LETTER SEYKCAUCASIAN ALBANIAN LETTER VEYZCAUCASIAN ALBANIAN LET" + - "TER TIWRCAUCASIAN ALBANIAN LETTER SHOYCAUCASIAN ALBANIAN LETTER IWNCAUCA" + - "SIAN ALBANIAN LETTER CYAWCAUCASIAN ALBANIAN LETTER CAYNCAUCASIAN ALBANIA" + - "N LETTER YAYDCAUCASIAN ALBANIAN LETTER PIWRCAUCASIAN ALBANIAN LETTER KIW" + - "CAUCASIAN ALBANIAN CITATION MARKLINEAR A SIGN AB001LINEAR A SIGN AB002LI" + - "NEAR A SIGN AB003LINEAR A SIGN AB004LINEAR A SIGN AB005LINEAR A SIGN AB0" + - "06LINEAR A SIGN AB007LINEAR A SIGN AB008LINEAR A SIGN AB009LINEAR A SIGN" + - " AB010LINEAR A SIGN AB011LINEAR A SIGN AB013LINEAR A SIGN AB016LINEAR A " + - "SIGN AB017LINEAR A SIGN AB020LINEAR A SIGN AB021LINEAR A SIGN AB021FLINE" + - "AR A SIGN AB021MLINEAR A SIGN AB022LINEAR A SIGN AB022FLINEAR A SIGN AB0" + - "22MLINEAR A SIGN AB023LINEAR A SIGN AB023MLINEAR A SIGN AB024LINEAR A SI" + - "GN AB026LINEAR A SIGN AB027LINEAR A SIGN AB028LINEAR A SIGN A028BLINEAR ") + ("" + - "A SIGN AB029LINEAR A SIGN AB030LINEAR A SIGN AB031LINEAR A SIGN AB034LIN" + - "EAR A SIGN AB037LINEAR A SIGN AB038LINEAR A SIGN AB039LINEAR A SIGN AB04" + - "0LINEAR A SIGN AB041LINEAR A SIGN AB044LINEAR A SIGN AB045LINEAR A SIGN " + - "AB046LINEAR A SIGN AB047LINEAR A SIGN AB048LINEAR A SIGN AB049LINEAR A S" + - "IGN AB050LINEAR A SIGN AB051LINEAR A SIGN AB053LINEAR A SIGN AB054LINEAR" + - " A SIGN AB055LINEAR A SIGN AB056LINEAR A SIGN AB057LINEAR A SIGN AB058LI" + - "NEAR A SIGN AB059LINEAR A SIGN AB060LINEAR A SIGN AB061LINEAR A SIGN AB0" + - "65LINEAR A SIGN AB066LINEAR A SIGN AB067LINEAR A SIGN AB069LINEAR A SIGN" + - " AB070LINEAR A SIGN AB073LINEAR A SIGN AB074LINEAR A SIGN AB076LINEAR A " + - "SIGN AB077LINEAR A SIGN AB078LINEAR A SIGN AB079LINEAR A SIGN AB080LINEA" + - "R A SIGN AB081LINEAR A SIGN AB082LINEAR A SIGN AB085LINEAR A SIGN AB086L" + - "INEAR A SIGN AB087LINEAR A SIGN A100-102LINEAR A SIGN AB118LINEAR A SIGN" + - " AB120LINEAR A SIGN A120BLINEAR A SIGN AB122LINEAR A SIGN AB123LINEAR A " + - "SIGN AB131ALINEAR A SIGN AB131BLINEAR A SIGN A131CLINEAR A SIGN AB164LIN" + - "EAR A SIGN AB171LINEAR A SIGN AB180LINEAR A SIGN AB188LINEAR A SIGN AB19" + - "1LINEAR A SIGN A301LINEAR A SIGN A302LINEAR A SIGN A303LINEAR A SIGN A30" + - "4LINEAR A SIGN A305LINEAR A SIGN A306LINEAR A SIGN A307LINEAR A SIGN A30" + - "8LINEAR A SIGN A309ALINEAR A SIGN A309BLINEAR A SIGN A309CLINEAR A SIGN " + - "A310LINEAR A SIGN A311LINEAR A SIGN A312LINEAR A SIGN A313ALINEAR A SIGN" + - " A313BLINEAR A SIGN A313CLINEAR A SIGN A314LINEAR A SIGN A315LINEAR A SI" + - "GN A316LINEAR A SIGN A317LINEAR A SIGN A318LINEAR A SIGN A319LINEAR A SI" + - "GN A320LINEAR A SIGN A321LINEAR A SIGN A322LINEAR A SIGN A323LINEAR A SI" + - "GN A324LINEAR A SIGN A325LINEAR A SIGN A326LINEAR A SIGN A327LINEAR A SI" + - "GN A328LINEAR A SIGN A329LINEAR A SIGN A330LINEAR A SIGN A331LINEAR A SI" + - "GN A332LINEAR A SIGN A333LINEAR A SIGN A334LINEAR A SIGN A335LINEAR A SI" + - "GN A336LINEAR A SIGN A337LINEAR A SIGN A338LINEAR A SIGN A339LINEAR A SI" + - "GN A340LINEAR A SIGN A341LINEAR A SIGN A342LINEAR A SIGN A343LINEAR A SI" + - "GN A344LINEAR A SIGN A345LINEAR A SIGN A346LINEAR A SIGN A347LINEAR A SI" + - "GN A348LINEAR A SIGN A349LINEAR A SIGN A350LINEAR A SIGN A351LINEAR A SI" + - "GN A352LINEAR A SIGN A353LINEAR A SIGN A354LINEAR A SIGN A355LINEAR A SI" + - "GN A356LINEAR A SIGN A357LINEAR A SIGN A358LINEAR A SIGN A359LINEAR A SI" + - "GN A360LINEAR A SIGN A361LINEAR A SIGN A362LINEAR A SIGN A363LINEAR A SI" + - "GN A364LINEAR A SIGN A365LINEAR A SIGN A366LINEAR A SIGN A367LINEAR A SI" + - "GN A368LINEAR A SIGN A369LINEAR A SIGN A370LINEAR A SIGN A371LINEAR A SI" + - "GN A400-VASLINEAR A SIGN A401-VASLINEAR A SIGN A402-VASLINEAR A SIGN A40" + - "3-VASLINEAR A SIGN A404-VASLINEAR A SIGN A405-VASLINEAR A SIGN A406-VASL" + - "INEAR A SIGN A407-VASLINEAR A SIGN A408-VASLINEAR A SIGN A409-VASLINEAR " + - "A SIGN A410-VASLINEAR A SIGN A411-VASLINEAR A SIGN A412-VASLINEAR A SIGN" + - " A413-VASLINEAR A SIGN A414-VASLINEAR A SIGN A415-VASLINEAR A SIGN A416-" + - "VASLINEAR A SIGN A417-VASLINEAR A SIGN A418-VASLINEAR A SIGN A501LINEAR " + - "A SIGN A502LINEAR A SIGN A503LINEAR A SIGN A504LINEAR A SIGN A505LINEAR " + - "A SIGN A506LINEAR A SIGN A508LINEAR A SIGN A509LINEAR A SIGN A510LINEAR " + - "A SIGN A511LINEAR A SIGN A512LINEAR A SIGN A513LINEAR A SIGN A515LINEAR " + - "A SIGN A516LINEAR A SIGN A520LINEAR A SIGN A521LINEAR A SIGN A523LINEAR " + - "A SIGN A524LINEAR A SIGN A525LINEAR A SIGN A526LINEAR A SIGN A527LINEAR " + - "A SIGN A528LINEAR A SIGN A529LINEAR A SIGN A530LINEAR A SIGN A531LINEAR " + - "A SIGN A532LINEAR A SIGN A534LINEAR A SIGN A535LINEAR A SIGN A536LINEAR " + - "A SIGN A537LINEAR A SIGN A538LINEAR A SIGN A539LINEAR A SIGN A540LINEAR " + - "A SIGN A541LINEAR A SIGN A542LINEAR A SIGN A545LINEAR A SIGN A547LINEAR " + - "A SIGN A548LINEAR A SIGN A549LINEAR A SIGN A550LINEAR A SIGN A551LINEAR " + - "A SIGN A552LINEAR A SIGN A553LINEAR A SIGN A554LINEAR A SIGN A555LINEAR " + - "A SIGN A556LINEAR A SIGN A557LINEAR A SIGN A559LINEAR A SIGN A563LINEAR " + - "A SIGN A564LINEAR A SIGN A565LINEAR A SIGN A566LINEAR A SIGN A568LINEAR " + - "A SIGN A569LINEAR A SIGN A570LINEAR A SIGN A571LINEAR A SIGN A572LINEAR " + - "A SIGN A573LINEAR A SIGN A574LINEAR A SIGN A575LINEAR A SIGN A576LINEAR " + - "A SIGN A577LINEAR A SIGN A578LINEAR A SIGN A579LINEAR A SIGN A580LINEAR " + - "A SIGN A581LINEAR A SIGN A582LINEAR A SIGN A583LINEAR A SIGN A584LINEAR " + - "A SIGN A585LINEAR A SIGN A586LINEAR A SIGN A587LINEAR A SIGN A588LINEAR " + - "A SIGN A589LINEAR A SIGN A591LINEAR A SIGN A592LINEAR A SIGN A594LINEAR " + - "A SIGN A595LINEAR A SIGN A596LINEAR A SIGN A598LINEAR A SIGN A600LINEAR " + - "A SIGN A601LINEAR A SIGN A602LINEAR A SIGN A603LINEAR A SIGN A604LINEAR " + - "A SIGN A606LINEAR A SIGN A608LINEAR A SIGN A609LINEAR A SIGN A610LINEAR " + - "A SIGN A611LINEAR A SIGN A612LINEAR A SIGN A613LINEAR A SIGN A614LINEAR " + - "A SIGN A615LINEAR A SIGN A616LINEAR A SIGN A617LINEAR A SIGN A618LINEAR ") + ("" + - "A SIGN A619LINEAR A SIGN A620LINEAR A SIGN A621LINEAR A SIGN A622LINEAR " + - "A SIGN A623LINEAR A SIGN A624LINEAR A SIGN A626LINEAR A SIGN A627LINEAR " + - "A SIGN A628LINEAR A SIGN A629LINEAR A SIGN A634LINEAR A SIGN A637LINEAR " + - "A SIGN A638LINEAR A SIGN A640LINEAR A SIGN A642LINEAR A SIGN A643LINEAR " + - "A SIGN A644LINEAR A SIGN A645LINEAR A SIGN A646LINEAR A SIGN A648LINEAR " + - "A SIGN A649LINEAR A SIGN A651LINEAR A SIGN A652LINEAR A SIGN A653LINEAR " + - "A SIGN A654LINEAR A SIGN A655LINEAR A SIGN A656LINEAR A SIGN A657LINEAR " + - "A SIGN A658LINEAR A SIGN A659LINEAR A SIGN A660LINEAR A SIGN A661LINEAR " + - "A SIGN A662LINEAR A SIGN A663LINEAR A SIGN A664LINEAR A SIGN A701 ALINEA" + - "R A SIGN A702 BLINEAR A SIGN A703 DLINEAR A SIGN A704 ELINEAR A SIGN A70" + - "5 FLINEAR A SIGN A706 HLINEAR A SIGN A707 JLINEAR A SIGN A708 KLINEAR A " + - "SIGN A709 LLINEAR A SIGN A709-2 L2LINEAR A SIGN A709-3 L3LINEAR A SIGN A" + - "709-4 L4LINEAR A SIGN A709-6 L6LINEAR A SIGN A710 WLINEAR A SIGN A711 XL" + - "INEAR A SIGN A712 YLINEAR A SIGN A713 OMEGALINEAR A SIGN A714 ABBLINEAR " + - "A SIGN A715 BBLINEAR A SIGN A717 DDLINEAR A SIGN A726 EYYYLINEAR A SIGN " + - "A732 JELINEAR A SIGN A800LINEAR A SIGN A801LINEAR A SIGN A802LINEAR A SI" + - "GN A803LINEAR A SIGN A804LINEAR A SIGN A805LINEAR A SIGN A806LINEAR A SI" + - "GN A807CYPRIOT SYLLABLE ACYPRIOT SYLLABLE ECYPRIOT SYLLABLE ICYPRIOT SYL" + - "LABLE OCYPRIOT SYLLABLE UCYPRIOT SYLLABLE JACYPRIOT SYLLABLE JOCYPRIOT S" + - "YLLABLE KACYPRIOT SYLLABLE KECYPRIOT SYLLABLE KICYPRIOT SYLLABLE KOCYPRI" + - "OT SYLLABLE KUCYPRIOT SYLLABLE LACYPRIOT SYLLABLE LECYPRIOT SYLLABLE LIC" + - "YPRIOT SYLLABLE LOCYPRIOT SYLLABLE LUCYPRIOT SYLLABLE MACYPRIOT SYLLABLE" + - " MECYPRIOT SYLLABLE MICYPRIOT SYLLABLE MOCYPRIOT SYLLABLE MUCYPRIOT SYLL" + - "ABLE NACYPRIOT SYLLABLE NECYPRIOT SYLLABLE NICYPRIOT SYLLABLE NOCYPRIOT " + - "SYLLABLE NUCYPRIOT SYLLABLE PACYPRIOT SYLLABLE PECYPRIOT SYLLABLE PICYPR" + - "IOT SYLLABLE POCYPRIOT SYLLABLE PUCYPRIOT SYLLABLE RACYPRIOT SYLLABLE RE" + - "CYPRIOT SYLLABLE RICYPRIOT SYLLABLE ROCYPRIOT SYLLABLE RUCYPRIOT SYLLABL" + - "E SACYPRIOT SYLLABLE SECYPRIOT SYLLABLE SICYPRIOT SYLLABLE SOCYPRIOT SYL" + - "LABLE SUCYPRIOT SYLLABLE TACYPRIOT SYLLABLE TECYPRIOT SYLLABLE TICYPRIOT" + - " SYLLABLE TOCYPRIOT SYLLABLE TUCYPRIOT SYLLABLE WACYPRIOT SYLLABLE WECYP" + - "RIOT SYLLABLE WICYPRIOT SYLLABLE WOCYPRIOT SYLLABLE XACYPRIOT SYLLABLE X" + - "ECYPRIOT SYLLABLE ZACYPRIOT SYLLABLE ZOIMPERIAL ARAMAIC LETTER ALEPHIMPE" + - "RIAL ARAMAIC LETTER BETHIMPERIAL ARAMAIC LETTER GIMELIMPERIAL ARAMAIC LE" + - "TTER DALETHIMPERIAL ARAMAIC LETTER HEIMPERIAL ARAMAIC LETTER WAWIMPERIAL" + - " ARAMAIC LETTER ZAYINIMPERIAL ARAMAIC LETTER HETHIMPERIAL ARAMAIC LETTER" + - " TETHIMPERIAL ARAMAIC LETTER YODHIMPERIAL ARAMAIC LETTER KAPHIMPERIAL AR" + - "AMAIC LETTER LAMEDHIMPERIAL ARAMAIC LETTER MEMIMPERIAL ARAMAIC LETTER NU" + - "NIMPERIAL ARAMAIC LETTER SAMEKHIMPERIAL ARAMAIC LETTER AYINIMPERIAL ARAM" + - "AIC LETTER PEIMPERIAL ARAMAIC LETTER SADHEIMPERIAL ARAMAIC LETTER QOPHIM" + - "PERIAL ARAMAIC LETTER RESHIMPERIAL ARAMAIC LETTER SHINIMPERIAL ARAMAIC L" + - "ETTER TAWIMPERIAL ARAMAIC SECTION SIGNIMPERIAL ARAMAIC NUMBER ONEIMPERIA" + - "L ARAMAIC NUMBER TWOIMPERIAL ARAMAIC NUMBER THREEIMPERIAL ARAMAIC NUMBER" + - " TENIMPERIAL ARAMAIC NUMBER TWENTYIMPERIAL ARAMAIC NUMBER ONE HUNDREDIMP" + - "ERIAL ARAMAIC NUMBER ONE THOUSANDIMPERIAL ARAMAIC NUMBER TEN THOUSANDPAL" + - "MYRENE LETTER ALEPHPALMYRENE LETTER BETHPALMYRENE LETTER GIMELPALMYRENE " + - "LETTER DALETHPALMYRENE LETTER HEPALMYRENE LETTER WAWPALMYRENE LETTER ZAY" + - "INPALMYRENE LETTER HETHPALMYRENE LETTER TETHPALMYRENE LETTER YODHPALMYRE" + - "NE LETTER KAPHPALMYRENE LETTER LAMEDHPALMYRENE LETTER MEMPALMYRENE LETTE" + - "R FINAL NUNPALMYRENE LETTER NUNPALMYRENE LETTER SAMEKHPALMYRENE LETTER A" + - "YINPALMYRENE LETTER PEPALMYRENE LETTER SADHEPALMYRENE LETTER QOPHPALMYRE" + - "NE LETTER RESHPALMYRENE LETTER SHINPALMYRENE LETTER TAWPALMYRENE LEFT-PO" + - "INTING FLEURONPALMYRENE RIGHT-POINTING FLEURONPALMYRENE NUMBER ONEPALMYR" + - "ENE NUMBER TWOPALMYRENE NUMBER THREEPALMYRENE NUMBER FOURPALMYRENE NUMBE" + - "R FIVEPALMYRENE NUMBER TENPALMYRENE NUMBER TWENTYNABATAEAN LETTER FINAL " + - "ALEPHNABATAEAN LETTER ALEPHNABATAEAN LETTER FINAL BETHNABATAEAN LETTER B" + - "ETHNABATAEAN LETTER GIMELNABATAEAN LETTER DALETHNABATAEAN LETTER FINAL H" + - "ENABATAEAN LETTER HENABATAEAN LETTER WAWNABATAEAN LETTER ZAYINNABATAEAN " + - "LETTER HETHNABATAEAN LETTER TETHNABATAEAN LETTER FINAL YODHNABATAEAN LET" + - "TER YODHNABATAEAN LETTER FINAL KAPHNABATAEAN LETTER KAPHNABATAEAN LETTER" + - " FINAL LAMEDHNABATAEAN LETTER LAMEDHNABATAEAN LETTER FINAL MEMNABATAEAN " + - "LETTER MEMNABATAEAN LETTER FINAL NUNNABATAEAN LETTER NUNNABATAEAN LETTER" + - " SAMEKHNABATAEAN LETTER AYINNABATAEAN LETTER PENABATAEAN LETTER SADHENAB" + - "ATAEAN LETTER QOPHNABATAEAN LETTER RESHNABATAEAN LETTER FINAL SHINNABATA" + - "EAN LETTER SHINNABATAEAN LETTER TAWNABATAEAN NUMBER ONENABATAEAN NUMBER ") + ("" + - "TWONABATAEAN NUMBER THREENABATAEAN NUMBER FOURNABATAEAN CRUCIFORM NUMBER" + - " FOURNABATAEAN NUMBER FIVENABATAEAN NUMBER TENNABATAEAN NUMBER TWENTYNAB" + - "ATAEAN NUMBER ONE HUNDREDHATRAN LETTER ALEPHHATRAN LETTER BETHHATRAN LET" + - "TER GIMELHATRAN LETTER DALETH-RESHHATRAN LETTER HEHATRAN LETTER WAWHATRA" + - "N LETTER ZAYNHATRAN LETTER HETHHATRAN LETTER TETHHATRAN LETTER YODHHATRA" + - "N LETTER KAPHHATRAN LETTER LAMEDHHATRAN LETTER MEMHATRAN LETTER NUNHATRA" + - "N LETTER SAMEKHHATRAN LETTER AYNHATRAN LETTER PEHATRAN LETTER SADHEHATRA" + - "N LETTER QOPHHATRAN LETTER SHINHATRAN LETTER TAWHATRAN NUMBER ONEHATRAN " + - "NUMBER FIVEHATRAN NUMBER TENHATRAN NUMBER TWENTYHATRAN NUMBER ONE HUNDRE" + - "DPHOENICIAN LETTER ALFPHOENICIAN LETTER BETPHOENICIAN LETTER GAMLPHOENIC" + - "IAN LETTER DELTPHOENICIAN LETTER HEPHOENICIAN LETTER WAUPHOENICIAN LETTE" + - "R ZAIPHOENICIAN LETTER HETPHOENICIAN LETTER TETPHOENICIAN LETTER YODPHOE" + - "NICIAN LETTER KAFPHOENICIAN LETTER LAMDPHOENICIAN LETTER MEMPHOENICIAN L" + - "ETTER NUNPHOENICIAN LETTER SEMKPHOENICIAN LETTER AINPHOENICIAN LETTER PE" + - "PHOENICIAN LETTER SADEPHOENICIAN LETTER QOFPHOENICIAN LETTER ROSHPHOENIC" + - "IAN LETTER SHINPHOENICIAN LETTER TAUPHOENICIAN NUMBER ONEPHOENICIAN NUMB" + - "ER TENPHOENICIAN NUMBER TWENTYPHOENICIAN NUMBER ONE HUNDREDPHOENICIAN NU" + - "MBER TWOPHOENICIAN NUMBER THREEPHOENICIAN WORD SEPARATORLYDIAN LETTER AL" + - "YDIAN LETTER BLYDIAN LETTER GLYDIAN LETTER DLYDIAN LETTER ELYDIAN LETTER" + - " VLYDIAN LETTER ILYDIAN LETTER YLYDIAN LETTER KLYDIAN LETTER LLYDIAN LET" + - "TER MLYDIAN LETTER NLYDIAN LETTER OLYDIAN LETTER RLYDIAN LETTER SSLYDIAN" + - " LETTER TLYDIAN LETTER ULYDIAN LETTER FLYDIAN LETTER QLYDIAN LETTER SLYD" + - "IAN LETTER TTLYDIAN LETTER ANLYDIAN LETTER ENLYDIAN LETTER LYLYDIAN LETT" + - "ER NNLYDIAN LETTER CLYDIAN TRIANGULAR MARKMEROITIC HIEROGLYPHIC LETTER A" + - "MEROITIC HIEROGLYPHIC LETTER EMEROITIC HIEROGLYPHIC LETTER IMEROITIC HIE" + - "ROGLYPHIC LETTER OMEROITIC HIEROGLYPHIC LETTER YAMEROITIC HIEROGLYPHIC L" + - "ETTER WAMEROITIC HIEROGLYPHIC LETTER BAMEROITIC HIEROGLYPHIC LETTER BA-2" + - "MEROITIC HIEROGLYPHIC LETTER PAMEROITIC HIEROGLYPHIC LETTER MAMEROITIC H" + - "IEROGLYPHIC LETTER NAMEROITIC HIEROGLYPHIC LETTER NA-2MEROITIC HIEROGLYP" + - "HIC LETTER NEMEROITIC HIEROGLYPHIC LETTER NE-2MEROITIC HIEROGLYPHIC LETT" + - "ER RAMEROITIC HIEROGLYPHIC LETTER RA-2MEROITIC HIEROGLYPHIC LETTER LAMER" + - "OITIC HIEROGLYPHIC LETTER KHAMEROITIC HIEROGLYPHIC LETTER HHAMEROITIC HI" + - "EROGLYPHIC LETTER SAMEROITIC HIEROGLYPHIC LETTER SA-2MEROITIC HIEROGLYPH" + - "IC LETTER SEMEROITIC HIEROGLYPHIC LETTER KAMEROITIC HIEROGLYPHIC LETTER " + - "QAMEROITIC HIEROGLYPHIC LETTER TAMEROITIC HIEROGLYPHIC LETTER TA-2MEROIT" + - "IC HIEROGLYPHIC LETTER TEMEROITIC HIEROGLYPHIC LETTER TE-2MEROITIC HIERO" + - "GLYPHIC LETTER TOMEROITIC HIEROGLYPHIC LETTER DAMEROITIC HIEROGLYPHIC SY" + - "MBOL VIDJMEROITIC HIEROGLYPHIC SYMBOL VIDJ-2MEROITIC CURSIVE LETTER AMER" + - "OITIC CURSIVE LETTER EMEROITIC CURSIVE LETTER IMEROITIC CURSIVE LETTER O" + - "MEROITIC CURSIVE LETTER YAMEROITIC CURSIVE LETTER WAMEROITIC CURSIVE LET" + - "TER BAMEROITIC CURSIVE LETTER PAMEROITIC CURSIVE LETTER MAMEROITIC CURSI" + - "VE LETTER NAMEROITIC CURSIVE LETTER NEMEROITIC CURSIVE LETTER RAMEROITIC" + - " CURSIVE LETTER LAMEROITIC CURSIVE LETTER KHAMEROITIC CURSIVE LETTER HHA" + - "MEROITIC CURSIVE LETTER SAMEROITIC CURSIVE LETTER ARCHAIC SAMEROITIC CUR" + - "SIVE LETTER SEMEROITIC CURSIVE LETTER KAMEROITIC CURSIVE LETTER QAMEROIT" + - "IC CURSIVE LETTER TAMEROITIC CURSIVE LETTER TEMEROITIC CURSIVE LETTER TO" + - "MEROITIC CURSIVE LETTER DAMEROITIC CURSIVE FRACTION ELEVEN TWELFTHSMEROI" + - "TIC CURSIVE FRACTION ONE HALFMEROITIC CURSIVE LOGOGRAM RMTMEROITIC CURSI" + - "VE LOGOGRAM IMNMEROITIC CURSIVE NUMBER ONEMEROITIC CURSIVE NUMBER TWOMER" + - "OITIC CURSIVE NUMBER THREEMEROITIC CURSIVE NUMBER FOURMEROITIC CURSIVE N" + - "UMBER FIVEMEROITIC CURSIVE NUMBER SIXMEROITIC CURSIVE NUMBER SEVENMEROIT" + - "IC CURSIVE NUMBER EIGHTMEROITIC CURSIVE NUMBER NINEMEROITIC CURSIVE NUMB" + - "ER TENMEROITIC CURSIVE NUMBER TWENTYMEROITIC CURSIVE NUMBER THIRTYMEROIT" + - "IC CURSIVE NUMBER FORTYMEROITIC CURSIVE NUMBER FIFTYMEROITIC CURSIVE NUM" + - "BER SIXTYMEROITIC CURSIVE NUMBER SEVENTYMEROITIC CURSIVE NUMBER ONE HUND" + - "REDMEROITIC CURSIVE NUMBER TWO HUNDREDMEROITIC CURSIVE NUMBER THREE HUND" + - "REDMEROITIC CURSIVE NUMBER FOUR HUNDREDMEROITIC CURSIVE NUMBER FIVE HUND" + - "REDMEROITIC CURSIVE NUMBER SIX HUNDREDMEROITIC CURSIVE NUMBER SEVEN HUND" + - "REDMEROITIC CURSIVE NUMBER EIGHT HUNDREDMEROITIC CURSIVE NUMBER NINE HUN" + - "DREDMEROITIC CURSIVE NUMBER ONE THOUSANDMEROITIC CURSIVE NUMBER TWO THOU" + - "SANDMEROITIC CURSIVE NUMBER THREE THOUSANDMEROITIC CURSIVE NUMBER FOUR T" + - "HOUSANDMEROITIC CURSIVE NUMBER FIVE THOUSANDMEROITIC CURSIVE NUMBER SIX " + - "THOUSANDMEROITIC CURSIVE NUMBER SEVEN THOUSANDMEROITIC CURSIVE NUMBER EI" + - "GHT THOUSANDMEROITIC CURSIVE NUMBER NINE THOUSANDMEROITIC CURSIVE NUMBER") + ("" + - " TEN THOUSANDMEROITIC CURSIVE NUMBER TWENTY THOUSANDMEROITIC CURSIVE NUM" + - "BER THIRTY THOUSANDMEROITIC CURSIVE NUMBER FORTY THOUSANDMEROITIC CURSIV" + - "E NUMBER FIFTY THOUSANDMEROITIC CURSIVE NUMBER SIXTY THOUSANDMEROITIC CU" + - "RSIVE NUMBER SEVENTY THOUSANDMEROITIC CURSIVE NUMBER EIGHTY THOUSANDMERO" + - "ITIC CURSIVE NUMBER NINETY THOUSANDMEROITIC CURSIVE NUMBER ONE HUNDRED T" + - "HOUSANDMEROITIC CURSIVE NUMBER TWO HUNDRED THOUSANDMEROITIC CURSIVE NUMB" + - "ER THREE HUNDRED THOUSANDMEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSANDME" + - "ROITIC CURSIVE NUMBER FIVE HUNDRED THOUSANDMEROITIC CURSIVE NUMBER SIX H" + - "UNDRED THOUSANDMEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSANDMEROITIC CU" + - "RSIVE NUMBER EIGHT HUNDRED THOUSANDMEROITIC CURSIVE NUMBER NINE HUNDRED " + - "THOUSANDMEROITIC CURSIVE FRACTION ONE TWELFTHMEROITIC CURSIVE FRACTION T" + - "WO TWELFTHSMEROITIC CURSIVE FRACTION THREE TWELFTHSMEROITIC CURSIVE FRAC" + - "TION FOUR TWELFTHSMEROITIC CURSIVE FRACTION FIVE TWELFTHSMEROITIC CURSIV" + - "E FRACTION SIX TWELFTHSMEROITIC CURSIVE FRACTION SEVEN TWELFTHSMEROITIC " + - "CURSIVE FRACTION EIGHT TWELFTHSMEROITIC CURSIVE FRACTION NINE TWELFTHSME" + - "ROITIC CURSIVE FRACTION TEN TWELFTHSKHAROSHTHI LETTER AKHAROSHTHI VOWEL " + - "SIGN IKHAROSHTHI VOWEL SIGN UKHAROSHTHI VOWEL SIGN VOCALIC RKHAROSHTHI V" + - "OWEL SIGN EKHAROSHTHI VOWEL SIGN OKHAROSHTHI VOWEL LENGTH MARKKHAROSHTHI" + - " SIGN DOUBLE RING BELOWKHAROSHTHI SIGN ANUSVARAKHAROSHTHI SIGN VISARGAKH" + - "AROSHTHI LETTER KAKHAROSHTHI LETTER KHAKHAROSHTHI LETTER GAKHAROSHTHI LE" + - "TTER GHAKHAROSHTHI LETTER CAKHAROSHTHI LETTER CHAKHAROSHTHI LETTER JAKHA" + - "ROSHTHI LETTER NYAKHAROSHTHI LETTER TTAKHAROSHTHI LETTER TTHAKHAROSHTHI " + - "LETTER DDAKHAROSHTHI LETTER DDHAKHAROSHTHI LETTER NNAKHAROSHTHI LETTER T" + - "AKHAROSHTHI LETTER THAKHAROSHTHI LETTER DAKHAROSHTHI LETTER DHAKHAROSHTH" + - "I LETTER NAKHAROSHTHI LETTER PAKHAROSHTHI LETTER PHAKHAROSHTHI LETTER BA" + - "KHAROSHTHI LETTER BHAKHAROSHTHI LETTER MAKHAROSHTHI LETTER YAKHAROSHTHI " + - "LETTER RAKHAROSHTHI LETTER LAKHAROSHTHI LETTER VAKHAROSHTHI LETTER SHAKH" + - "AROSHTHI LETTER SSAKHAROSHTHI LETTER SAKHAROSHTHI LETTER ZAKHAROSHTHI LE" + - "TTER HAKHAROSHTHI LETTER KKAKHAROSHTHI LETTER TTTHAKHAROSHTHI SIGN BAR A" + - "BOVEKHAROSHTHI SIGN CAUDAKHAROSHTHI SIGN DOT BELOWKHAROSHTHI VIRAMAKHARO" + - "SHTHI DIGIT ONEKHAROSHTHI DIGIT TWOKHAROSHTHI DIGIT THREEKHAROSHTHI DIGI" + - "T FOURKHAROSHTHI NUMBER TENKHAROSHTHI NUMBER TWENTYKHAROSHTHI NUMBER ONE" + - " HUNDREDKHAROSHTHI NUMBER ONE THOUSANDKHAROSHTHI PUNCTUATION DOTKHAROSHT" + - "HI PUNCTUATION SMALL CIRCLEKHAROSHTHI PUNCTUATION CIRCLEKHAROSHTHI PUNCT" + - "UATION CRESCENT BARKHAROSHTHI PUNCTUATION MANGALAMKHAROSHTHI PUNCTUATION" + - " LOTUSKHAROSHTHI PUNCTUATION DANDAKHAROSHTHI PUNCTUATION DOUBLE DANDAKHA" + - "ROSHTHI PUNCTUATION LINESOLD SOUTH ARABIAN LETTER HEOLD SOUTH ARABIAN LE" + - "TTER LAMEDHOLD SOUTH ARABIAN LETTER HETHOLD SOUTH ARABIAN LETTER MEMOLD " + - "SOUTH ARABIAN LETTER QOPHOLD SOUTH ARABIAN LETTER WAWOLD SOUTH ARABIAN L" + - "ETTER SHINOLD SOUTH ARABIAN LETTER RESHOLD SOUTH ARABIAN LETTER BETHOLD " + - "SOUTH ARABIAN LETTER TAWOLD SOUTH ARABIAN LETTER SATOLD SOUTH ARABIAN LE" + - "TTER KAPHOLD SOUTH ARABIAN LETTER NUNOLD SOUTH ARABIAN LETTER KHETHOLD S" + - "OUTH ARABIAN LETTER SADHEOLD SOUTH ARABIAN LETTER SAMEKHOLD SOUTH ARABIA" + - "N LETTER FEOLD SOUTH ARABIAN LETTER ALEFOLD SOUTH ARABIAN LETTER AYNOLD " + - "SOUTH ARABIAN LETTER DHADHEOLD SOUTH ARABIAN LETTER GIMELOLD SOUTH ARABI" + - "AN LETTER DALETHOLD SOUTH ARABIAN LETTER GHAYNOLD SOUTH ARABIAN LETTER T" + - "ETHOLD SOUTH ARABIAN LETTER ZAYNOLD SOUTH ARABIAN LETTER DHALETHOLD SOUT" + - "H ARABIAN LETTER YODHOLD SOUTH ARABIAN LETTER THAWOLD SOUTH ARABIAN LETT" + - "ER THETHOLD SOUTH ARABIAN NUMBER ONEOLD SOUTH ARABIAN NUMBER FIFTYOLD SO" + - "UTH ARABIAN NUMERIC INDICATOROLD NORTH ARABIAN LETTER HEHOLD NORTH ARABI" + - "AN LETTER LAMOLD NORTH ARABIAN LETTER HAHOLD NORTH ARABIAN LETTER MEEMOL" + - "D NORTH ARABIAN LETTER QAFOLD NORTH ARABIAN LETTER WAWOLD NORTH ARABIAN " + - "LETTER ES-2OLD NORTH ARABIAN LETTER REHOLD NORTH ARABIAN LETTER BEHOLD N" + - "ORTH ARABIAN LETTER TEHOLD NORTH ARABIAN LETTER ES-1OLD NORTH ARABIAN LE" + - "TTER KAFOLD NORTH ARABIAN LETTER NOONOLD NORTH ARABIAN LETTER KHAHOLD NO" + - "RTH ARABIAN LETTER SADOLD NORTH ARABIAN LETTER ES-3OLD NORTH ARABIAN LET" + - "TER FEHOLD NORTH ARABIAN LETTER ALEFOLD NORTH ARABIAN LETTER AINOLD NORT" + - "H ARABIAN LETTER DADOLD NORTH ARABIAN LETTER GEEMOLD NORTH ARABIAN LETTE" + - "R DALOLD NORTH ARABIAN LETTER GHAINOLD NORTH ARABIAN LETTER TAHOLD NORTH" + - " ARABIAN LETTER ZAINOLD NORTH ARABIAN LETTER THALOLD NORTH ARABIAN LETTE" + - "R YEHOLD NORTH ARABIAN LETTER THEHOLD NORTH ARABIAN LETTER ZAHOLD NORTH " + - "ARABIAN NUMBER ONEOLD NORTH ARABIAN NUMBER TENOLD NORTH ARABIAN NUMBER T" + - "WENTYMANICHAEAN LETTER ALEPHMANICHAEAN LETTER BETHMANICHAEAN LETTER BHET" + - "HMANICHAEAN LETTER GIMELMANICHAEAN LETTER GHIMELMANICHAEAN LETTER DALETH") + ("" + - "MANICHAEAN LETTER HEMANICHAEAN LETTER WAWMANICHAEAN SIGN UDMANICHAEAN LE" + - "TTER ZAYINMANICHAEAN LETTER ZHAYINMANICHAEAN LETTER JAYINMANICHAEAN LETT" + - "ER JHAYINMANICHAEAN LETTER HETHMANICHAEAN LETTER TETHMANICHAEAN LETTER Y" + - "ODHMANICHAEAN LETTER KAPHMANICHAEAN LETTER XAPHMANICHAEAN LETTER KHAPHMA" + - "NICHAEAN LETTER LAMEDHMANICHAEAN LETTER DHAMEDHMANICHAEAN LETTER THAMEDH" + - "MANICHAEAN LETTER MEMMANICHAEAN LETTER NUNMANICHAEAN LETTER SAMEKHMANICH" + - "AEAN LETTER AYINMANICHAEAN LETTER AAYINMANICHAEAN LETTER PEMANICHAEAN LE" + - "TTER FEMANICHAEAN LETTER SADHEMANICHAEAN LETTER QOPHMANICHAEAN LETTER XO" + - "PHMANICHAEAN LETTER QHOPHMANICHAEAN LETTER RESHMANICHAEAN LETTER SHINMAN" + - "ICHAEAN LETTER SSHINMANICHAEAN LETTER TAWMANICHAEAN ABBREVIATION MARK AB" + - "OVEMANICHAEAN ABBREVIATION MARK BELOWMANICHAEAN NUMBER ONEMANICHAEAN NUM" + - "BER FIVEMANICHAEAN NUMBER TENMANICHAEAN NUMBER TWENTYMANICHAEAN NUMBER O" + - "NE HUNDREDMANICHAEAN PUNCTUATION STARMANICHAEAN PUNCTUATION FLEURONMANIC" + - "HAEAN PUNCTUATION DOUBLE DOT WITHIN DOTMANICHAEAN PUNCTUATION DOT WITHIN" + - " DOTMANICHAEAN PUNCTUATION DOTMANICHAEAN PUNCTUATION TWO DOTSMANICHAEAN " + - "PUNCTUATION LINE FILLERAVESTAN LETTER AAVESTAN LETTER AAAVESTAN LETTER A" + - "OAVESTAN LETTER AAOAVESTAN LETTER ANAVESTAN LETTER AANAVESTAN LETTER AEA" + - "VESTAN LETTER AEEAVESTAN LETTER EAVESTAN LETTER EEAVESTAN LETTER OAVESTA" + - "N LETTER OOAVESTAN LETTER IAVESTAN LETTER IIAVESTAN LETTER UAVESTAN LETT" + - "ER UUAVESTAN LETTER KEAVESTAN LETTER XEAVESTAN LETTER XYEAVESTAN LETTER " + - "XVEAVESTAN LETTER GEAVESTAN LETTER GGEAVESTAN LETTER GHEAVESTAN LETTER C" + - "EAVESTAN LETTER JEAVESTAN LETTER TEAVESTAN LETTER THEAVESTAN LETTER DEAV" + - "ESTAN LETTER DHEAVESTAN LETTER TTEAVESTAN LETTER PEAVESTAN LETTER FEAVES" + - "TAN LETTER BEAVESTAN LETTER BHEAVESTAN LETTER NGEAVESTAN LETTER NGYEAVES" + - "TAN LETTER NGVEAVESTAN LETTER NEAVESTAN LETTER NYEAVESTAN LETTER NNEAVES" + - "TAN LETTER MEAVESTAN LETTER HMEAVESTAN LETTER YYEAVESTAN LETTER YEAVESTA" + - "N LETTER VEAVESTAN LETTER REAVESTAN LETTER LEAVESTAN LETTER SEAVESTAN LE" + - "TTER ZEAVESTAN LETTER SHEAVESTAN LETTER ZHEAVESTAN LETTER SHYEAVESTAN LE" + - "TTER SSHEAVESTAN LETTER HEAVESTAN ABBREVIATION MARKTINY TWO DOTS OVER ON" + - "E DOT PUNCTUATIONSMALL TWO DOTS OVER ONE DOT PUNCTUATIONLARGE TWO DOTS O" + - "VER ONE DOT PUNCTUATIONLARGE ONE DOT OVER TWO DOTS PUNCTUATIONLARGE TWO " + - "RINGS OVER ONE RING PUNCTUATIONLARGE ONE RING OVER TWO RINGS PUNCTUATION" + - "INSCRIPTIONAL PARTHIAN LETTER ALEPHINSCRIPTIONAL PARTHIAN LETTER BETHINS" + - "CRIPTIONAL PARTHIAN LETTER GIMELINSCRIPTIONAL PARTHIAN LETTER DALETHINSC" + - "RIPTIONAL PARTHIAN LETTER HEINSCRIPTIONAL PARTHIAN LETTER WAWINSCRIPTION" + - "AL PARTHIAN LETTER ZAYININSCRIPTIONAL PARTHIAN LETTER HETHINSCRIPTIONAL " + - "PARTHIAN LETTER TETHINSCRIPTIONAL PARTHIAN LETTER YODHINSCRIPTIONAL PART" + - "HIAN LETTER KAPHINSCRIPTIONAL PARTHIAN LETTER LAMEDHINSCRIPTIONAL PARTHI" + - "AN LETTER MEMINSCRIPTIONAL PARTHIAN LETTER NUNINSCRIPTIONAL PARTHIAN LET" + - "TER SAMEKHINSCRIPTIONAL PARTHIAN LETTER AYININSCRIPTIONAL PARTHIAN LETTE" + - "R PEINSCRIPTIONAL PARTHIAN LETTER SADHEINSCRIPTIONAL PARTHIAN LETTER QOP" + - "HINSCRIPTIONAL PARTHIAN LETTER RESHINSCRIPTIONAL PARTHIAN LETTER SHININS" + - "CRIPTIONAL PARTHIAN LETTER TAWINSCRIPTIONAL PARTHIAN NUMBER ONEINSCRIPTI" + - "ONAL PARTHIAN NUMBER TWOINSCRIPTIONAL PARTHIAN NUMBER THREEINSCRIPTIONAL" + - " PARTHIAN NUMBER FOURINSCRIPTIONAL PARTHIAN NUMBER TENINSCRIPTIONAL PART" + - "HIAN NUMBER TWENTYINSCRIPTIONAL PARTHIAN NUMBER ONE HUNDREDINSCRIPTIONAL" + - " PARTHIAN NUMBER ONE THOUSANDINSCRIPTIONAL PAHLAVI LETTER ALEPHINSCRIPTI" + - "ONAL PAHLAVI LETTER BETHINSCRIPTIONAL PAHLAVI LETTER GIMELINSCRIPTIONAL " + - "PAHLAVI LETTER DALETHINSCRIPTIONAL PAHLAVI LETTER HEINSCRIPTIONAL PAHLAV" + - "I LETTER WAW-AYIN-RESHINSCRIPTIONAL PAHLAVI LETTER ZAYININSCRIPTIONAL PA" + - "HLAVI LETTER HETHINSCRIPTIONAL PAHLAVI LETTER TETHINSCRIPTIONAL PAHLAVI " + - "LETTER YODHINSCRIPTIONAL PAHLAVI LETTER KAPHINSCRIPTIONAL PAHLAVI LETTER" + - " LAMEDHINSCRIPTIONAL PAHLAVI LETTER MEM-QOPHINSCRIPTIONAL PAHLAVI LETTER" + - " NUNINSCRIPTIONAL PAHLAVI LETTER SAMEKHINSCRIPTIONAL PAHLAVI LETTER PEIN" + - "SCRIPTIONAL PAHLAVI LETTER SADHEINSCRIPTIONAL PAHLAVI LETTER SHININSCRIP" + - "TIONAL PAHLAVI LETTER TAWINSCRIPTIONAL PAHLAVI NUMBER ONEINSCRIPTIONAL P" + - "AHLAVI NUMBER TWOINSCRIPTIONAL PAHLAVI NUMBER THREEINSCRIPTIONAL PAHLAVI" + - " NUMBER FOURINSCRIPTIONAL PAHLAVI NUMBER TENINSCRIPTIONAL PAHLAVI NUMBER" + - " TWENTYINSCRIPTIONAL PAHLAVI NUMBER ONE HUNDREDINSCRIPTIONAL PAHLAVI NUM" + - "BER ONE THOUSANDPSALTER PAHLAVI LETTER ALEPHPSALTER PAHLAVI LETTER BETHP" + - "SALTER PAHLAVI LETTER GIMELPSALTER PAHLAVI LETTER DALETHPSALTER PAHLAVI " + - "LETTER HEPSALTER PAHLAVI LETTER WAW-AYIN-RESHPSALTER PAHLAVI LETTER ZAYI" + - "NPSALTER PAHLAVI LETTER HETHPSALTER PAHLAVI LETTER YODHPSALTER PAHLAVI L" + - "ETTER KAPHPSALTER PAHLAVI LETTER LAMEDHPSALTER PAHLAVI LETTER MEM-QOPHPS") + ("" + - "ALTER PAHLAVI LETTER NUNPSALTER PAHLAVI LETTER SAMEKHPSALTER PAHLAVI LET" + - "TER PEPSALTER PAHLAVI LETTER SADHEPSALTER PAHLAVI LETTER SHINPSALTER PAH" + - "LAVI LETTER TAWPSALTER PAHLAVI SECTION MARKPSALTER PAHLAVI TURNED SECTIO" + - "N MARKPSALTER PAHLAVI FOUR DOTS WITH CROSSPSALTER PAHLAVI FOUR DOTS WITH" + - " DOTPSALTER PAHLAVI NUMBER ONEPSALTER PAHLAVI NUMBER TWOPSALTER PAHLAVI " + - "NUMBER THREEPSALTER PAHLAVI NUMBER FOURPSALTER PAHLAVI NUMBER TENPSALTER" + - " PAHLAVI NUMBER TWENTYPSALTER PAHLAVI NUMBER ONE HUNDREDOLD TURKIC LETTE" + - "R ORKHON AOLD TURKIC LETTER YENISEI AOLD TURKIC LETTER YENISEI AEOLD TUR" + - "KIC LETTER ORKHON IOLD TURKIC LETTER YENISEI IOLD TURKIC LETTER YENISEI " + - "EOLD TURKIC LETTER ORKHON OOLD TURKIC LETTER ORKHON OEOLD TURKIC LETTER " + - "YENISEI OEOLD TURKIC LETTER ORKHON ABOLD TURKIC LETTER YENISEI ABOLD TUR" + - "KIC LETTER ORKHON AEBOLD TURKIC LETTER YENISEI AEBOLD TURKIC LETTER ORKH" + - "ON AGOLD TURKIC LETTER YENISEI AGOLD TURKIC LETTER ORKHON AEGOLD TURKIC " + - "LETTER YENISEI AEGOLD TURKIC LETTER ORKHON ADOLD TURKIC LETTER YENISEI A" + - "DOLD TURKIC LETTER ORKHON AEDOLD TURKIC LETTER ORKHON EZOLD TURKIC LETTE" + - "R YENISEI EZOLD TURKIC LETTER ORKHON AYOLD TURKIC LETTER YENISEI AYOLD T" + - "URKIC LETTER ORKHON AEYOLD TURKIC LETTER YENISEI AEYOLD TURKIC LETTER OR" + - "KHON AEKOLD TURKIC LETTER YENISEI AEKOLD TURKIC LETTER ORKHON OEKOLD TUR" + - "KIC LETTER YENISEI OEKOLD TURKIC LETTER ORKHON ALOLD TURKIC LETTER YENIS" + - "EI ALOLD TURKIC LETTER ORKHON AELOLD TURKIC LETTER ORKHON ELTOLD TURKIC " + - "LETTER ORKHON EMOLD TURKIC LETTER ORKHON ANOLD TURKIC LETTER ORKHON AENO" + - "LD TURKIC LETTER YENISEI AENOLD TURKIC LETTER ORKHON ENTOLD TURKIC LETTE" + - "R YENISEI ENTOLD TURKIC LETTER ORKHON ENCOLD TURKIC LETTER YENISEI ENCOL" + - "D TURKIC LETTER ORKHON ENYOLD TURKIC LETTER YENISEI ENYOLD TURKIC LETTER" + - " YENISEI ANGOLD TURKIC LETTER ORKHON ENGOLD TURKIC LETTER YENISEI AENGOL" + - "D TURKIC LETTER ORKHON EPOLD TURKIC LETTER ORKHON OPOLD TURKIC LETTER OR" + - "KHON ICOLD TURKIC LETTER ORKHON ECOLD TURKIC LETTER YENISEI ECOLD TURKIC" + - " LETTER ORKHON AQOLD TURKIC LETTER YENISEI AQOLD TURKIC LETTER ORKHON IQ" + - "OLD TURKIC LETTER YENISEI IQOLD TURKIC LETTER ORKHON OQOLD TURKIC LETTER" + - " YENISEI OQOLD TURKIC LETTER ORKHON AROLD TURKIC LETTER YENISEI AROLD TU" + - "RKIC LETTER ORKHON AEROLD TURKIC LETTER ORKHON ASOLD TURKIC LETTER ORKHO" + - "N AESOLD TURKIC LETTER ORKHON ASHOLD TURKIC LETTER YENISEI ASHOLD TURKIC" + - " LETTER ORKHON ESHOLD TURKIC LETTER YENISEI ESHOLD TURKIC LETTER ORKHON " + - "ATOLD TURKIC LETTER YENISEI ATOLD TURKIC LETTER ORKHON AETOLD TURKIC LET" + - "TER YENISEI AETOLD TURKIC LETTER ORKHON OTOLD TURKIC LETTER ORKHON BASHO" + - "LD HUNGARIAN CAPITAL LETTER AOLD HUNGARIAN CAPITAL LETTER AAOLD HUNGARIA" + - "N CAPITAL LETTER EBOLD HUNGARIAN CAPITAL LETTER AMBOLD HUNGARIAN CAPITAL" + - " LETTER ECOLD HUNGARIAN CAPITAL LETTER ENCOLD HUNGARIAN CAPITAL LETTER E" + - "CSOLD HUNGARIAN CAPITAL LETTER EDOLD HUNGARIAN CAPITAL LETTER ANDOLD HUN" + - "GARIAN CAPITAL LETTER EOLD HUNGARIAN CAPITAL LETTER CLOSE EOLD HUNGARIAN" + - " CAPITAL LETTER EEOLD HUNGARIAN CAPITAL LETTER EFOLD HUNGARIAN CAPITAL L" + - "ETTER EGOLD HUNGARIAN CAPITAL LETTER EGYOLD HUNGARIAN CAPITAL LETTER EHO" + - "LD HUNGARIAN CAPITAL LETTER IOLD HUNGARIAN CAPITAL LETTER IIOLD HUNGARIA" + - "N CAPITAL LETTER EJOLD HUNGARIAN CAPITAL LETTER EKOLD HUNGARIAN CAPITAL " + - "LETTER AKOLD HUNGARIAN CAPITAL LETTER UNKOLD HUNGARIAN CAPITAL LETTER EL" + - "OLD HUNGARIAN CAPITAL LETTER ELYOLD HUNGARIAN CAPITAL LETTER EMOLD HUNGA" + - "RIAN CAPITAL LETTER ENOLD HUNGARIAN CAPITAL LETTER ENYOLD HUNGARIAN CAPI" + - "TAL LETTER OOLD HUNGARIAN CAPITAL LETTER OOOLD HUNGARIAN CAPITAL LETTER " + - "NIKOLSBURG OEOLD HUNGARIAN CAPITAL LETTER RUDIMENTA OEOLD HUNGARIAN CAPI" + - "TAL LETTER OEEOLD HUNGARIAN CAPITAL LETTER EPOLD HUNGARIAN CAPITAL LETTE" + - "R EMPOLD HUNGARIAN CAPITAL LETTER EROLD HUNGARIAN CAPITAL LETTER SHORT E" + - "ROLD HUNGARIAN CAPITAL LETTER ESOLD HUNGARIAN CAPITAL LETTER ESZOLD HUNG" + - "ARIAN CAPITAL LETTER ETOLD HUNGARIAN CAPITAL LETTER ENTOLD HUNGARIAN CAP" + - "ITAL LETTER ETYOLD HUNGARIAN CAPITAL LETTER ECHOLD HUNGARIAN CAPITAL LET" + - "TER UOLD HUNGARIAN CAPITAL LETTER UUOLD HUNGARIAN CAPITAL LETTER NIKOLSB" + - "URG UEOLD HUNGARIAN CAPITAL LETTER RUDIMENTA UEOLD HUNGARIAN CAPITAL LET" + - "TER EVOLD HUNGARIAN CAPITAL LETTER EZOLD HUNGARIAN CAPITAL LETTER EZSOLD" + - " HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGNOLD HUNGARIAN CAPITAL LETTER US" + - "OLD HUNGARIAN SMALL LETTER AOLD HUNGARIAN SMALL LETTER AAOLD HUNGARIAN S" + - "MALL LETTER EBOLD HUNGARIAN SMALL LETTER AMBOLD HUNGARIAN SMALL LETTER E" + - "COLD HUNGARIAN SMALL LETTER ENCOLD HUNGARIAN SMALL LETTER ECSOLD HUNGARI" + - "AN SMALL LETTER EDOLD HUNGARIAN SMALL LETTER ANDOLD HUNGARIAN SMALL LETT" + - "ER EOLD HUNGARIAN SMALL LETTER CLOSE EOLD HUNGARIAN SMALL LETTER EEOLD H" + - "UNGARIAN SMALL LETTER EFOLD HUNGARIAN SMALL LETTER EGOLD HUNGARIAN SMALL") + ("" + - " LETTER EGYOLD HUNGARIAN SMALL LETTER EHOLD HUNGARIAN SMALL LETTER IOLD " + - "HUNGARIAN SMALL LETTER IIOLD HUNGARIAN SMALL LETTER EJOLD HUNGARIAN SMAL" + - "L LETTER EKOLD HUNGARIAN SMALL LETTER AKOLD HUNGARIAN SMALL LETTER UNKOL" + - "D HUNGARIAN SMALL LETTER ELOLD HUNGARIAN SMALL LETTER ELYOLD HUNGARIAN S" + - "MALL LETTER EMOLD HUNGARIAN SMALL LETTER ENOLD HUNGARIAN SMALL LETTER EN" + - "YOLD HUNGARIAN SMALL LETTER OOLD HUNGARIAN SMALL LETTER OOOLD HUNGARIAN " + - "SMALL LETTER NIKOLSBURG OEOLD HUNGARIAN SMALL LETTER RUDIMENTA OEOLD HUN" + - "GARIAN SMALL LETTER OEEOLD HUNGARIAN SMALL LETTER EPOLD HUNGARIAN SMALL " + - "LETTER EMPOLD HUNGARIAN SMALL LETTER EROLD HUNGARIAN SMALL LETTER SHORT " + - "EROLD HUNGARIAN SMALL LETTER ESOLD HUNGARIAN SMALL LETTER ESZOLD HUNGARI" + - "AN SMALL LETTER ETOLD HUNGARIAN SMALL LETTER ENTOLD HUNGARIAN SMALL LETT" + - "ER ETYOLD HUNGARIAN SMALL LETTER ECHOLD HUNGARIAN SMALL LETTER UOLD HUNG" + - "ARIAN SMALL LETTER UUOLD HUNGARIAN SMALL LETTER NIKOLSBURG UEOLD HUNGARI" + - "AN SMALL LETTER RUDIMENTA UEOLD HUNGARIAN SMALL LETTER EVOLD HUNGARIAN S" + - "MALL LETTER EZOLD HUNGARIAN SMALL LETTER EZSOLD HUNGARIAN SMALL LETTER E" + - "NT-SHAPED SIGNOLD HUNGARIAN SMALL LETTER USOLD HUNGARIAN NUMBER ONEOLD H" + - "UNGARIAN NUMBER FIVEOLD HUNGARIAN NUMBER TENOLD HUNGARIAN NUMBER FIFTYOL" + - "D HUNGARIAN NUMBER ONE HUNDREDOLD HUNGARIAN NUMBER ONE THOUSANDRUMI DIGI" + - "T ONERUMI DIGIT TWORUMI DIGIT THREERUMI DIGIT FOURRUMI DIGIT FIVERUMI DI" + - "GIT SIXRUMI DIGIT SEVENRUMI DIGIT EIGHTRUMI DIGIT NINERUMI NUMBER TENRUM" + - "I NUMBER TWENTYRUMI NUMBER THIRTYRUMI NUMBER FORTYRUMI NUMBER FIFTYRUMI " + - "NUMBER SIXTYRUMI NUMBER SEVENTYRUMI NUMBER EIGHTYRUMI NUMBER NINETYRUMI " + - "NUMBER ONE HUNDREDRUMI NUMBER TWO HUNDREDRUMI NUMBER THREE HUNDREDRUMI N" + - "UMBER FOUR HUNDREDRUMI NUMBER FIVE HUNDREDRUMI NUMBER SIX HUNDREDRUMI NU" + - "MBER SEVEN HUNDREDRUMI NUMBER EIGHT HUNDREDRUMI NUMBER NINE HUNDREDRUMI " + - "FRACTION ONE HALFRUMI FRACTION ONE QUARTERRUMI FRACTION ONE THIRDRUMI FR" + - "ACTION TWO THIRDSBRAHMI SIGN CANDRABINDUBRAHMI SIGN ANUSVARABRAHMI SIGN " + - "VISARGABRAHMI SIGN JIHVAMULIYABRAHMI SIGN UPADHMANIYABRAHMI LETTER ABRAH" + - "MI LETTER AABRAHMI LETTER IBRAHMI LETTER IIBRAHMI LETTER UBRAHMI LETTER " + - "UUBRAHMI LETTER VOCALIC RBRAHMI LETTER VOCALIC RRBRAHMI LETTER VOCALIC L" + - "BRAHMI LETTER VOCALIC LLBRAHMI LETTER EBRAHMI LETTER AIBRAHMI LETTER OBR" + - "AHMI LETTER AUBRAHMI LETTER KABRAHMI LETTER KHABRAHMI LETTER GABRAHMI LE" + - "TTER GHABRAHMI LETTER NGABRAHMI LETTER CABRAHMI LETTER CHABRAHMI LETTER " + - "JABRAHMI LETTER JHABRAHMI LETTER NYABRAHMI LETTER TTABRAHMI LETTER TTHAB" + - "RAHMI LETTER DDABRAHMI LETTER DDHABRAHMI LETTER NNABRAHMI LETTER TABRAHM" + - "I LETTER THABRAHMI LETTER DABRAHMI LETTER DHABRAHMI LETTER NABRAHMI LETT" + - "ER PABRAHMI LETTER PHABRAHMI LETTER BABRAHMI LETTER BHABRAHMI LETTER MAB" + - "RAHMI LETTER YABRAHMI LETTER RABRAHMI LETTER LABRAHMI LETTER VABRAHMI LE" + - "TTER SHABRAHMI LETTER SSABRAHMI LETTER SABRAHMI LETTER HABRAHMI LETTER L" + - "LABRAHMI LETTER OLD TAMIL LLLABRAHMI LETTER OLD TAMIL RRABRAHMI LETTER O" + - "LD TAMIL NNNABRAHMI VOWEL SIGN AABRAHMI VOWEL SIGN BHATTIPROLU AABRAHMI " + - "VOWEL SIGN IBRAHMI VOWEL SIGN IIBRAHMI VOWEL SIGN UBRAHMI VOWEL SIGN UUB" + - "RAHMI VOWEL SIGN VOCALIC RBRAHMI VOWEL SIGN VOCALIC RRBRAHMI VOWEL SIGN " + - "VOCALIC LBRAHMI VOWEL SIGN VOCALIC LLBRAHMI VOWEL SIGN EBRAHMI VOWEL SIG" + - "N AIBRAHMI VOWEL SIGN OBRAHMI VOWEL SIGN AUBRAHMI VIRAMABRAHMI DANDABRAH" + - "MI DOUBLE DANDABRAHMI PUNCTUATION DOTBRAHMI PUNCTUATION DOUBLE DOTBRAHMI" + - " PUNCTUATION LINEBRAHMI PUNCTUATION CRESCENT BARBRAHMI PUNCTUATION LOTUS" + - "BRAHMI NUMBER ONEBRAHMI NUMBER TWOBRAHMI NUMBER THREEBRAHMI NUMBER FOURB" + - "RAHMI NUMBER FIVEBRAHMI NUMBER SIXBRAHMI NUMBER SEVENBRAHMI NUMBER EIGHT" + - "BRAHMI NUMBER NINEBRAHMI NUMBER TENBRAHMI NUMBER TWENTYBRAHMI NUMBER THI" + - "RTYBRAHMI NUMBER FORTYBRAHMI NUMBER FIFTYBRAHMI NUMBER SIXTYBRAHMI NUMBE" + - "R SEVENTYBRAHMI NUMBER EIGHTYBRAHMI NUMBER NINETYBRAHMI NUMBER ONE HUNDR" + - "EDBRAHMI NUMBER ONE THOUSANDBRAHMI DIGIT ZEROBRAHMI DIGIT ONEBRAHMI DIGI" + - "T TWOBRAHMI DIGIT THREEBRAHMI DIGIT FOURBRAHMI DIGIT FIVEBRAHMI DIGIT SI" + - "XBRAHMI DIGIT SEVENBRAHMI DIGIT EIGHTBRAHMI DIGIT NINEBRAHMI NUMBER JOIN" + - "ERKAITHI SIGN CANDRABINDUKAITHI SIGN ANUSVARAKAITHI SIGN VISARGAKAITHI L" + - "ETTER AKAITHI LETTER AAKAITHI LETTER IKAITHI LETTER IIKAITHI LETTER UKAI" + - "THI LETTER UUKAITHI LETTER EKAITHI LETTER AIKAITHI LETTER OKAITHI LETTER" + - " AUKAITHI LETTER KAKAITHI LETTER KHAKAITHI LETTER GAKAITHI LETTER GHAKAI" + - "THI LETTER NGAKAITHI LETTER CAKAITHI LETTER CHAKAITHI LETTER JAKAITHI LE" + - "TTER JHAKAITHI LETTER NYAKAITHI LETTER TTAKAITHI LETTER TTHAKAITHI LETTE" + - "R DDAKAITHI LETTER DDDHAKAITHI LETTER DDHAKAITHI LETTER RHAKAITHI LETTER" + - " NNAKAITHI LETTER TAKAITHI LETTER THAKAITHI LETTER DAKAITHI LETTER DHAKA" + - "ITHI LETTER NAKAITHI LETTER PAKAITHI LETTER PHAKAITHI LETTER BAKAITHI LE") + ("" + - "TTER BHAKAITHI LETTER MAKAITHI LETTER YAKAITHI LETTER RAKAITHI LETTER LA" + - "KAITHI LETTER VAKAITHI LETTER SHAKAITHI LETTER SSAKAITHI LETTER SAKAITHI" + - " LETTER HAKAITHI VOWEL SIGN AAKAITHI VOWEL SIGN IKAITHI VOWEL SIGN IIKAI" + - "THI VOWEL SIGN UKAITHI VOWEL SIGN UUKAITHI VOWEL SIGN EKAITHI VOWEL SIGN" + - " AIKAITHI VOWEL SIGN OKAITHI VOWEL SIGN AUKAITHI SIGN VIRAMAKAITHI SIGN " + - "NUKTAKAITHI ABBREVIATION SIGNKAITHI ENUMERATION SIGNKAITHI NUMBER SIGNKA" + - "ITHI SECTION MARKKAITHI DOUBLE SECTION MARKKAITHI DANDAKAITHI DOUBLE DAN" + - "DASORA SOMPENG LETTER SAHSORA SOMPENG LETTER TAHSORA SOMPENG LETTER BAHS" + - "ORA SOMPENG LETTER CAHSORA SOMPENG LETTER DAHSORA SOMPENG LETTER GAHSORA" + - " SOMPENG LETTER MAHSORA SOMPENG LETTER NGAHSORA SOMPENG LETTER LAHSORA S" + - "OMPENG LETTER NAHSORA SOMPENG LETTER VAHSORA SOMPENG LETTER PAHSORA SOMP" + - "ENG LETTER YAHSORA SOMPENG LETTER RAHSORA SOMPENG LETTER HAHSORA SOMPENG" + - " LETTER KAHSORA SOMPENG LETTER JAHSORA SOMPENG LETTER NYAHSORA SOMPENG L" + - "ETTER AHSORA SOMPENG LETTER EEHSORA SOMPENG LETTER IHSORA SOMPENG LETTER" + - " UHSORA SOMPENG LETTER OHSORA SOMPENG LETTER EHSORA SOMPENG LETTER MAESO" + - "RA SOMPENG DIGIT ZEROSORA SOMPENG DIGIT ONESORA SOMPENG DIGIT TWOSORA SO" + - "MPENG DIGIT THREESORA SOMPENG DIGIT FOURSORA SOMPENG DIGIT FIVESORA SOMP" + - "ENG DIGIT SIXSORA SOMPENG DIGIT SEVENSORA SOMPENG DIGIT EIGHTSORA SOMPEN" + - "G DIGIT NINECHAKMA SIGN CANDRABINDUCHAKMA SIGN ANUSVARACHAKMA SIGN VISAR" + - "GACHAKMA LETTER AACHAKMA LETTER ICHAKMA LETTER UCHAKMA LETTER ECHAKMA LE" + - "TTER KAACHAKMA LETTER KHAACHAKMA LETTER GAACHAKMA LETTER GHAACHAKMA LETT" + - "ER NGAACHAKMA LETTER CAACHAKMA LETTER CHAACHAKMA LETTER JAACHAKMA LETTER" + - " JHAACHAKMA LETTER NYAACHAKMA LETTER TTAACHAKMA LETTER TTHAACHAKMA LETTE" + - "R DDAACHAKMA LETTER DDHAACHAKMA LETTER NNAACHAKMA LETTER TAACHAKMA LETTE" + - "R THAACHAKMA LETTER DAACHAKMA LETTER DHAACHAKMA LETTER NAACHAKMA LETTER " + - "PAACHAKMA LETTER PHAACHAKMA LETTER BAACHAKMA LETTER BHAACHAKMA LETTER MA" + - "ACHAKMA LETTER YYAACHAKMA LETTER YAACHAKMA LETTER RAACHAKMA LETTER LAACH" + - "AKMA LETTER WAACHAKMA LETTER SAACHAKMA LETTER HAACHAKMA VOWEL SIGN ACHAK" + - "MA VOWEL SIGN ICHAKMA VOWEL SIGN IICHAKMA VOWEL SIGN UCHAKMA VOWEL SIGN " + - "UUCHAKMA VOWEL SIGN ECHAKMA VOWEL SIGN AICHAKMA VOWEL SIGN OCHAKMA VOWEL" + - " SIGN AUCHAKMA VOWEL SIGN OICHAKMA O MARKCHAKMA AU MARKCHAKMA VIRAMACHAK" + - "MA MAAYYAACHAKMA DIGIT ZEROCHAKMA DIGIT ONECHAKMA DIGIT TWOCHAKMA DIGIT " + - "THREECHAKMA DIGIT FOURCHAKMA DIGIT FIVECHAKMA DIGIT SIXCHAKMA DIGIT SEVE" + - "NCHAKMA DIGIT EIGHTCHAKMA DIGIT NINECHAKMA SECTION MARKCHAKMA DANDACHAKM" + - "A DOUBLE DANDACHAKMA QUESTION MARKMAHAJANI LETTER AMAHAJANI LETTER IMAHA" + - "JANI LETTER UMAHAJANI LETTER EMAHAJANI LETTER OMAHAJANI LETTER KAMAHAJAN" + - "I LETTER KHAMAHAJANI LETTER GAMAHAJANI LETTER GHAMAHAJANI LETTER CAMAHAJ" + - "ANI LETTER CHAMAHAJANI LETTER JAMAHAJANI LETTER JHAMAHAJANI LETTER NYAMA" + - "HAJANI LETTER TTAMAHAJANI LETTER TTHAMAHAJANI LETTER DDAMAHAJANI LETTER " + - "DDHAMAHAJANI LETTER NNAMAHAJANI LETTER TAMAHAJANI LETTER THAMAHAJANI LET" + - "TER DAMAHAJANI LETTER DHAMAHAJANI LETTER NAMAHAJANI LETTER PAMAHAJANI LE" + - "TTER PHAMAHAJANI LETTER BAMAHAJANI LETTER BHAMAHAJANI LETTER MAMAHAJANI " + - "LETTER RAMAHAJANI LETTER LAMAHAJANI LETTER VAMAHAJANI LETTER SAMAHAJANI " + - "LETTER HAMAHAJANI LETTER RRAMAHAJANI SIGN NUKTAMAHAJANI ABBREVIATION SIG" + - "NMAHAJANI SECTION MARKMAHAJANI LIGATURE SHRISHARADA SIGN CANDRABINDUSHAR" + - "ADA SIGN ANUSVARASHARADA SIGN VISARGASHARADA LETTER ASHARADA LETTER AASH" + - "ARADA LETTER ISHARADA LETTER IISHARADA LETTER USHARADA LETTER UUSHARADA " + - "LETTER VOCALIC RSHARADA LETTER VOCALIC RRSHARADA LETTER VOCALIC LSHARADA" + - " LETTER VOCALIC LLSHARADA LETTER ESHARADA LETTER AISHARADA LETTER OSHARA" + - "DA LETTER AUSHARADA LETTER KASHARADA LETTER KHASHARADA LETTER GASHARADA " + - "LETTER GHASHARADA LETTER NGASHARADA LETTER CASHARADA LETTER CHASHARADA L" + - "ETTER JASHARADA LETTER JHASHARADA LETTER NYASHARADA LETTER TTASHARADA LE" + - "TTER TTHASHARADA LETTER DDASHARADA LETTER DDHASHARADA LETTER NNASHARADA " + - "LETTER TASHARADA LETTER THASHARADA LETTER DASHARADA LETTER DHASHARADA LE" + - "TTER NASHARADA LETTER PASHARADA LETTER PHASHARADA LETTER BASHARADA LETTE" + - "R BHASHARADA LETTER MASHARADA LETTER YASHARADA LETTER RASHARADA LETTER L" + - "ASHARADA LETTER LLASHARADA LETTER VASHARADA LETTER SHASHARADA LETTER SSA" + - "SHARADA LETTER SASHARADA LETTER HASHARADA VOWEL SIGN AASHARADA VOWEL SIG" + - "N ISHARADA VOWEL SIGN IISHARADA VOWEL SIGN USHARADA VOWEL SIGN UUSHARADA" + - " VOWEL SIGN VOCALIC RSHARADA VOWEL SIGN VOCALIC RRSHARADA VOWEL SIGN VOC" + - "ALIC LSHARADA VOWEL SIGN VOCALIC LLSHARADA VOWEL SIGN ESHARADA VOWEL SIG" + - "N AISHARADA VOWEL SIGN OSHARADA VOWEL SIGN AUSHARADA SIGN VIRAMASHARADA " + - "SIGN AVAGRAHASHARADA SIGN JIHVAMULIYASHARADA SIGN UPADHMANIYASHARADA OMS" + - "HARADA DANDASHARADA DOUBLE DANDASHARADA ABBREVIATION SIGNSHARADA SEPARAT") + ("" + - "ORSHARADA SANDHI MARKSHARADA SIGN NUKTASHARADA VOWEL MODIFIER MARKSHARAD" + - "A EXTRA SHORT VOWEL MARKSHARADA SUTRA MARKSHARADA DIGIT ZEROSHARADA DIGI" + - "T ONESHARADA DIGIT TWOSHARADA DIGIT THREESHARADA DIGIT FOURSHARADA DIGIT" + - " FIVESHARADA DIGIT SIXSHARADA DIGIT SEVENSHARADA DIGIT EIGHTSHARADA DIGI" + - "T NINESHARADA EKAMSHARADA SIGN SIDDHAMSHARADA HEADSTROKESHARADA CONTINUA" + - "TION SIGNSHARADA SECTION MARK-1SHARADA SECTION MARK-2SINHALA ARCHAIC DIG" + - "IT ONESINHALA ARCHAIC DIGIT TWOSINHALA ARCHAIC DIGIT THREESINHALA ARCHAI" + - "C DIGIT FOURSINHALA ARCHAIC DIGIT FIVESINHALA ARCHAIC DIGIT SIXSINHALA A" + - "RCHAIC DIGIT SEVENSINHALA ARCHAIC DIGIT EIGHTSINHALA ARCHAIC DIGIT NINES" + - "INHALA ARCHAIC NUMBER TENSINHALA ARCHAIC NUMBER TWENTYSINHALA ARCHAIC NU" + - "MBER THIRTYSINHALA ARCHAIC NUMBER FORTYSINHALA ARCHAIC NUMBER FIFTYSINHA" + - "LA ARCHAIC NUMBER SIXTYSINHALA ARCHAIC NUMBER SEVENTYSINHALA ARCHAIC NUM" + - "BER EIGHTYSINHALA ARCHAIC NUMBER NINETYSINHALA ARCHAIC NUMBER ONE HUNDRE" + - "DSINHALA ARCHAIC NUMBER ONE THOUSANDKHOJKI LETTER AKHOJKI LETTER AAKHOJK" + - "I LETTER IKHOJKI LETTER UKHOJKI LETTER EKHOJKI LETTER AIKHOJKI LETTER OK" + - "HOJKI LETTER AUKHOJKI LETTER KAKHOJKI LETTER KHAKHOJKI LETTER GAKHOJKI L" + - "ETTER GGAKHOJKI LETTER GHAKHOJKI LETTER NGAKHOJKI LETTER CAKHOJKI LETTER" + - " CHAKHOJKI LETTER JAKHOJKI LETTER JJAKHOJKI LETTER NYAKHOJKI LETTER TTAK" + - "HOJKI LETTER TTHAKHOJKI LETTER DDAKHOJKI LETTER DDHAKHOJKI LETTER NNAKHO" + - "JKI LETTER TAKHOJKI LETTER THAKHOJKI LETTER DAKHOJKI LETTER DDDAKHOJKI L" + - "ETTER DHAKHOJKI LETTER NAKHOJKI LETTER PAKHOJKI LETTER PHAKHOJKI LETTER " + - "BAKHOJKI LETTER BBAKHOJKI LETTER BHAKHOJKI LETTER MAKHOJKI LETTER YAKHOJ" + - "KI LETTER RAKHOJKI LETTER LAKHOJKI LETTER VAKHOJKI LETTER SAKHOJKI LETTE" + - "R HAKHOJKI LETTER LLAKHOJKI VOWEL SIGN AAKHOJKI VOWEL SIGN IKHOJKI VOWEL" + - " SIGN IIKHOJKI VOWEL SIGN UKHOJKI VOWEL SIGN EKHOJKI VOWEL SIGN AIKHOJKI" + - " VOWEL SIGN OKHOJKI VOWEL SIGN AUKHOJKI SIGN ANUSVARAKHOJKI SIGN VIRAMAK" + - "HOJKI SIGN NUKTAKHOJKI SIGN SHADDAKHOJKI DANDAKHOJKI DOUBLE DANDAKHOJKI " + - "WORD SEPARATORKHOJKI SECTION MARKKHOJKI DOUBLE SECTION MARKKHOJKI ABBREV" + - "IATION SIGNKHOJKI SIGN SUKUNMULTANI LETTER AMULTANI LETTER IMULTANI LETT" + - "ER UMULTANI LETTER EMULTANI LETTER KAMULTANI LETTER KHAMULTANI LETTER GA" + - "MULTANI LETTER GHAMULTANI LETTER CAMULTANI LETTER CHAMULTANI LETTER JAMU" + - "LTANI LETTER JJAMULTANI LETTER NYAMULTANI LETTER TTAMULTANI LETTER TTHAM" + - "ULTANI LETTER DDAMULTANI LETTER DDDAMULTANI LETTER DDHAMULTANI LETTER NN" + - "AMULTANI LETTER TAMULTANI LETTER THAMULTANI LETTER DAMULTANI LETTER DHAM" + - "ULTANI LETTER NAMULTANI LETTER PAMULTANI LETTER PHAMULTANI LETTER BAMULT" + - "ANI LETTER BHAMULTANI LETTER MAMULTANI LETTER YAMULTANI LETTER RAMULTANI" + - " LETTER LAMULTANI LETTER VAMULTANI LETTER SAMULTANI LETTER HAMULTANI LET" + - "TER RRAMULTANI LETTER RHAMULTANI SECTION MARKKHUDAWADI LETTER AKHUDAWADI" + - " LETTER AAKHUDAWADI LETTER IKHUDAWADI LETTER IIKHUDAWADI LETTER UKHUDAWA" + - "DI LETTER UUKHUDAWADI LETTER EKHUDAWADI LETTER AIKHUDAWADI LETTER OKHUDA" + - "WADI LETTER AUKHUDAWADI LETTER KAKHUDAWADI LETTER KHAKHUDAWADI LETTER GA" + - "KHUDAWADI LETTER GGAKHUDAWADI LETTER GHAKHUDAWADI LETTER NGAKHUDAWADI LE" + - "TTER CAKHUDAWADI LETTER CHAKHUDAWADI LETTER JAKHUDAWADI LETTER JJAKHUDAW" + - "ADI LETTER JHAKHUDAWADI LETTER NYAKHUDAWADI LETTER TTAKHUDAWADI LETTER T" + - "THAKHUDAWADI LETTER DDAKHUDAWADI LETTER DDDAKHUDAWADI LETTER RRAKHUDAWAD" + - "I LETTER DDHAKHUDAWADI LETTER NNAKHUDAWADI LETTER TAKHUDAWADI LETTER THA" + - "KHUDAWADI LETTER DAKHUDAWADI LETTER DHAKHUDAWADI LETTER NAKHUDAWADI LETT" + - "ER PAKHUDAWADI LETTER PHAKHUDAWADI LETTER BAKHUDAWADI LETTER BBAKHUDAWAD" + - "I LETTER BHAKHUDAWADI LETTER MAKHUDAWADI LETTER YAKHUDAWADI LETTER RAKHU" + - "DAWADI LETTER LAKHUDAWADI LETTER VAKHUDAWADI LETTER SHAKHUDAWADI LETTER " + - "SAKHUDAWADI LETTER HAKHUDAWADI SIGN ANUSVARAKHUDAWADI VOWEL SIGN AAKHUDA" + - "WADI VOWEL SIGN IKHUDAWADI VOWEL SIGN IIKHUDAWADI VOWEL SIGN UKHUDAWADI " + - "VOWEL SIGN UUKHUDAWADI VOWEL SIGN EKHUDAWADI VOWEL SIGN AIKHUDAWADI VOWE" + - "L SIGN OKHUDAWADI VOWEL SIGN AUKHUDAWADI SIGN NUKTAKHUDAWADI SIGN VIRAMA" + - "KHUDAWADI DIGIT ZEROKHUDAWADI DIGIT ONEKHUDAWADI DIGIT TWOKHUDAWADI DIGI" + - "T THREEKHUDAWADI DIGIT FOURKHUDAWADI DIGIT FIVEKHUDAWADI DIGIT SIXKHUDAW" + - "ADI DIGIT SEVENKHUDAWADI DIGIT EIGHTKHUDAWADI DIGIT NINEGRANTHA SIGN COM" + - "BINING ANUSVARA ABOVEGRANTHA SIGN CANDRABINDUGRANTHA SIGN ANUSVARAGRANTH" + - "A SIGN VISARGAGRANTHA LETTER AGRANTHA LETTER AAGRANTHA LETTER IGRANTHA L" + - "ETTER IIGRANTHA LETTER UGRANTHA LETTER UUGRANTHA LETTER VOCALIC RGRANTHA" + - " LETTER VOCALIC LGRANTHA LETTER EEGRANTHA LETTER AIGRANTHA LETTER OOGRAN" + - "THA LETTER AUGRANTHA LETTER KAGRANTHA LETTER KHAGRANTHA LETTER GAGRANTHA" + - " LETTER GHAGRANTHA LETTER NGAGRANTHA LETTER CAGRANTHA LETTER CHAGRANTHA " + - "LETTER JAGRANTHA LETTER JHAGRANTHA LETTER NYAGRANTHA LETTER TTAGRANTHA L") + ("" + - "ETTER TTHAGRANTHA LETTER DDAGRANTHA LETTER DDHAGRANTHA LETTER NNAGRANTHA" + - " LETTER TAGRANTHA LETTER THAGRANTHA LETTER DAGRANTHA LETTER DHAGRANTHA L" + - "ETTER NAGRANTHA LETTER PAGRANTHA LETTER PHAGRANTHA LETTER BAGRANTHA LETT" + - "ER BHAGRANTHA LETTER MAGRANTHA LETTER YAGRANTHA LETTER RAGRANTHA LETTER " + - "LAGRANTHA LETTER LLAGRANTHA LETTER VAGRANTHA LETTER SHAGRANTHA LETTER SS" + - "AGRANTHA LETTER SAGRANTHA LETTER HAGRANTHA SIGN NUKTAGRANTHA SIGN AVAGRA" + - "HAGRANTHA VOWEL SIGN AAGRANTHA VOWEL SIGN IGRANTHA VOWEL SIGN IIGRANTHA " + - "VOWEL SIGN UGRANTHA VOWEL SIGN UUGRANTHA VOWEL SIGN VOCALIC RGRANTHA VOW" + - "EL SIGN VOCALIC RRGRANTHA VOWEL SIGN EEGRANTHA VOWEL SIGN AIGRANTHA VOWE" + - "L SIGN OOGRANTHA VOWEL SIGN AUGRANTHA SIGN VIRAMAGRANTHA OMGRANTHA AU LE" + - "NGTH MARKGRANTHA SIGN PLUTAGRANTHA LETTER VEDIC ANUSVARAGRANTHA LETTER V" + - "EDIC DOUBLE ANUSVARAGRANTHA LETTER VOCALIC RRGRANTHA LETTER VOCALIC LLGR" + - "ANTHA VOWEL SIGN VOCALIC LGRANTHA VOWEL SIGN VOCALIC LLCOMBINING GRANTHA" + - " DIGIT ZEROCOMBINING GRANTHA DIGIT ONECOMBINING GRANTHA DIGIT TWOCOMBINI" + - "NG GRANTHA DIGIT THREECOMBINING GRANTHA DIGIT FOURCOMBINING GRANTHA DIGI" + - "T FIVECOMBINING GRANTHA DIGIT SIXCOMBINING GRANTHA LETTER ACOMBINING GRA" + - "NTHA LETTER KACOMBINING GRANTHA LETTER NACOMBINING GRANTHA LETTER VICOMB" + - "INING GRANTHA LETTER PANEWA LETTER ANEWA LETTER AANEWA LETTER INEWA LETT" + - "ER IINEWA LETTER UNEWA LETTER UUNEWA LETTER VOCALIC RNEWA LETTER VOCALIC" + - " RRNEWA LETTER VOCALIC LNEWA LETTER VOCALIC LLNEWA LETTER ENEWA LETTER A" + - "INEWA LETTER ONEWA LETTER AUNEWA LETTER KANEWA LETTER KHANEWA LETTER GAN" + - "EWA LETTER GHANEWA LETTER NGANEWA LETTER NGHANEWA LETTER CANEWA LETTER C" + - "HANEWA LETTER JANEWA LETTER JHANEWA LETTER NYANEWA LETTER NYHANEWA LETTE" + - "R TTANEWA LETTER TTHANEWA LETTER DDANEWA LETTER DDHANEWA LETTER NNANEWA " + - "LETTER TANEWA LETTER THANEWA LETTER DANEWA LETTER DHANEWA LETTER NANEWA " + - "LETTER NHANEWA LETTER PANEWA LETTER PHANEWA LETTER BANEWA LETTER BHANEWA" + - " LETTER MANEWA LETTER MHANEWA LETTER YANEWA LETTER RANEWA LETTER RHANEWA" + - " LETTER LANEWA LETTER LHANEWA LETTER WANEWA LETTER SHANEWA LETTER SSANEW" + - "A LETTER SANEWA LETTER HANEWA VOWEL SIGN AANEWA VOWEL SIGN INEWA VOWEL S" + - "IGN IINEWA VOWEL SIGN UNEWA VOWEL SIGN UUNEWA VOWEL SIGN VOCALIC RNEWA V" + - "OWEL SIGN VOCALIC RRNEWA VOWEL SIGN VOCALIC LNEWA VOWEL SIGN VOCALIC LLN" + - "EWA VOWEL SIGN ENEWA VOWEL SIGN AINEWA VOWEL SIGN ONEWA VOWEL SIGN AUNEW" + - "A SIGN VIRAMANEWA SIGN CANDRABINDUNEWA SIGN ANUSVARANEWA SIGN VISARGANEW" + - "A SIGN NUKTANEWA SIGN AVAGRAHANEWA SIGN FINAL ANUSVARANEWA OMNEWA SIDDHI" + - "NEWA DANDANEWA DOUBLE DANDANEWA COMMANEWA GAP FILLERNEWA ABBREVIATION SI" + - "GNNEWA DIGIT ZERONEWA DIGIT ONENEWA DIGIT TWONEWA DIGIT THREENEWA DIGIT " + - "FOURNEWA DIGIT FIVENEWA DIGIT SIXNEWA DIGIT SEVENNEWA DIGIT EIGHTNEWA DI" + - "GIT NINENEWA PLACEHOLDER MARKNEWA INSERTION SIGNTIRHUTA ANJITIRHUTA LETT" + - "ER ATIRHUTA LETTER AATIRHUTA LETTER ITIRHUTA LETTER IITIRHUTA LETTER UTI" + - "RHUTA LETTER UUTIRHUTA LETTER VOCALIC RTIRHUTA LETTER VOCALIC RRTIRHUTA " + - "LETTER VOCALIC LTIRHUTA LETTER VOCALIC LLTIRHUTA LETTER ETIRHUTA LETTER " + - "AITIRHUTA LETTER OTIRHUTA LETTER AUTIRHUTA LETTER KATIRHUTA LETTER KHATI" + - "RHUTA LETTER GATIRHUTA LETTER GHATIRHUTA LETTER NGATIRHUTA LETTER CATIRH" + - "UTA LETTER CHATIRHUTA LETTER JATIRHUTA LETTER JHATIRHUTA LETTER NYATIRHU" + - "TA LETTER TTATIRHUTA LETTER TTHATIRHUTA LETTER DDATIRHUTA LETTER DDHATIR" + - "HUTA LETTER NNATIRHUTA LETTER TATIRHUTA LETTER THATIRHUTA LETTER DATIRHU" + - "TA LETTER DHATIRHUTA LETTER NATIRHUTA LETTER PATIRHUTA LETTER PHATIRHUTA" + - " LETTER BATIRHUTA LETTER BHATIRHUTA LETTER MATIRHUTA LETTER YATIRHUTA LE" + - "TTER RATIRHUTA LETTER LATIRHUTA LETTER VATIRHUTA LETTER SHATIRHUTA LETTE" + - "R SSATIRHUTA LETTER SATIRHUTA LETTER HATIRHUTA VOWEL SIGN AATIRHUTA VOWE" + - "L SIGN ITIRHUTA VOWEL SIGN IITIRHUTA VOWEL SIGN UTIRHUTA VOWEL SIGN UUTI" + - "RHUTA VOWEL SIGN VOCALIC RTIRHUTA VOWEL SIGN VOCALIC RRTIRHUTA VOWEL SIG" + - "N VOCALIC LTIRHUTA VOWEL SIGN VOCALIC LLTIRHUTA VOWEL SIGN ETIRHUTA VOWE" + - "L SIGN SHORT ETIRHUTA VOWEL SIGN AITIRHUTA VOWEL SIGN OTIRHUTA VOWEL SIG" + - "N SHORT OTIRHUTA VOWEL SIGN AUTIRHUTA SIGN CANDRABINDUTIRHUTA SIGN ANUSV" + - "ARATIRHUTA SIGN VISARGATIRHUTA SIGN VIRAMATIRHUTA SIGN NUKTATIRHUTA SIGN" + - " AVAGRAHATIRHUTA GVANGTIRHUTA ABBREVIATION SIGNTIRHUTA OMTIRHUTA DIGIT Z" + - "EROTIRHUTA DIGIT ONETIRHUTA DIGIT TWOTIRHUTA DIGIT THREETIRHUTA DIGIT FO" + - "URTIRHUTA DIGIT FIVETIRHUTA DIGIT SIXTIRHUTA DIGIT SEVENTIRHUTA DIGIT EI" + - "GHTTIRHUTA DIGIT NINESIDDHAM LETTER ASIDDHAM LETTER AASIDDHAM LETTER ISI" + - "DDHAM LETTER IISIDDHAM LETTER USIDDHAM LETTER UUSIDDHAM LETTER VOCALIC R" + - "SIDDHAM LETTER VOCALIC RRSIDDHAM LETTER VOCALIC LSIDDHAM LETTER VOCALIC " + - "LLSIDDHAM LETTER ESIDDHAM LETTER AISIDDHAM LETTER OSIDDHAM LETTER AUSIDD" + - "HAM LETTER KASIDDHAM LETTER KHASIDDHAM LETTER GASIDDHAM LETTER GHASIDDHA") + ("" + - "M LETTER NGASIDDHAM LETTER CASIDDHAM LETTER CHASIDDHAM LETTER JASIDDHAM " + - "LETTER JHASIDDHAM LETTER NYASIDDHAM LETTER TTASIDDHAM LETTER TTHASIDDHAM" + - " LETTER DDASIDDHAM LETTER DDHASIDDHAM LETTER NNASIDDHAM LETTER TASIDDHAM" + - " LETTER THASIDDHAM LETTER DASIDDHAM LETTER DHASIDDHAM LETTER NASIDDHAM L" + - "ETTER PASIDDHAM LETTER PHASIDDHAM LETTER BASIDDHAM LETTER BHASIDDHAM LET" + - "TER MASIDDHAM LETTER YASIDDHAM LETTER RASIDDHAM LETTER LASIDDHAM LETTER " + - "VASIDDHAM LETTER SHASIDDHAM LETTER SSASIDDHAM LETTER SASIDDHAM LETTER HA" + - "SIDDHAM VOWEL SIGN AASIDDHAM VOWEL SIGN ISIDDHAM VOWEL SIGN IISIDDHAM VO" + - "WEL SIGN USIDDHAM VOWEL SIGN UUSIDDHAM VOWEL SIGN VOCALIC RSIDDHAM VOWEL" + - " SIGN VOCALIC RRSIDDHAM VOWEL SIGN ESIDDHAM VOWEL SIGN AISIDDHAM VOWEL S" + - "IGN OSIDDHAM VOWEL SIGN AUSIDDHAM SIGN CANDRABINDUSIDDHAM SIGN ANUSVARAS" + - "IDDHAM SIGN VISARGASIDDHAM SIGN VIRAMASIDDHAM SIGN NUKTASIDDHAM SIGN SID" + - "DHAMSIDDHAM DANDASIDDHAM DOUBLE DANDASIDDHAM SEPARATOR DOTSIDDHAM SEPARA" + - "TOR BARSIDDHAM REPETITION MARK-1SIDDHAM REPETITION MARK-2SIDDHAM REPETIT" + - "ION MARK-3SIDDHAM END OF TEXT MARKSIDDHAM SECTION MARK WITH TRIDENT AND " + - "U-SHAPED ORNAMENTSSIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS" + - "SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTSSIDDHAM SECTION MARK " + - "WITH RAYS AND DOTTED DOUBLE CRESCENTSSIDDHAM SECTION MARK WITH RAYS AND " + - "DOTTED TRIPLE CRESCENTSSIDDHAM SECTION MARK DOUBLE RINGSIDDHAM SECTION M" + - "ARK DOUBLE RING WITH RAYSSIDDHAM SECTION MARK WITH DOUBLE CRESCENTSSIDDH" + - "AM SECTION MARK WITH TRIPLE CRESCENTSSIDDHAM SECTION MARK WITH QUADRUPLE" + - " CRESCENTSSIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTSSIDDHAM SECTION MA" + - "RK WITH CIRCLES AND RAYSSIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOS" + - "URESSIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURESSIDDHAM LETTER " + - "THREE-CIRCLE ALTERNATE ISIDDHAM LETTER TWO-CIRCLE ALTERNATE ISIDDHAM LET" + - "TER TWO-CIRCLE ALTERNATE IISIDDHAM LETTER ALTERNATE USIDDHAM VOWEL SIGN " + - "ALTERNATE USIDDHAM VOWEL SIGN ALTERNATE UUMODI LETTER AMODI LETTER AAMOD" + - "I LETTER IMODI LETTER IIMODI LETTER UMODI LETTER UUMODI LETTER VOCALIC R" + - "MODI LETTER VOCALIC RRMODI LETTER VOCALIC LMODI LETTER VOCALIC LLMODI LE" + - "TTER EMODI LETTER AIMODI LETTER OMODI LETTER AUMODI LETTER KAMODI LETTER" + - " KHAMODI LETTER GAMODI LETTER GHAMODI LETTER NGAMODI LETTER CAMODI LETTE" + - "R CHAMODI LETTER JAMODI LETTER JHAMODI LETTER NYAMODI LETTER TTAMODI LET" + - "TER TTHAMODI LETTER DDAMODI LETTER DDHAMODI LETTER NNAMODI LETTER TAMODI" + - " LETTER THAMODI LETTER DAMODI LETTER DHAMODI LETTER NAMODI LETTER PAMODI" + - " LETTER PHAMODI LETTER BAMODI LETTER BHAMODI LETTER MAMODI LETTER YAMODI" + - " LETTER RAMODI LETTER LAMODI LETTER VAMODI LETTER SHAMODI LETTER SSAMODI" + - " LETTER SAMODI LETTER HAMODI LETTER LLAMODI VOWEL SIGN AAMODI VOWEL SIGN" + - " IMODI VOWEL SIGN IIMODI VOWEL SIGN UMODI VOWEL SIGN UUMODI VOWEL SIGN V" + - "OCALIC RMODI VOWEL SIGN VOCALIC RRMODI VOWEL SIGN VOCALIC LMODI VOWEL SI" + - "GN VOCALIC LLMODI VOWEL SIGN EMODI VOWEL SIGN AIMODI VOWEL SIGN OMODI VO" + - "WEL SIGN AUMODI SIGN ANUSVARAMODI SIGN VISARGAMODI SIGN VIRAMAMODI SIGN " + - "ARDHACANDRAMODI DANDAMODI DOUBLE DANDAMODI ABBREVIATION SIGNMODI SIGN HU" + - "VAMODI DIGIT ZEROMODI DIGIT ONEMODI DIGIT TWOMODI DIGIT THREEMODI DIGIT " + - "FOURMODI DIGIT FIVEMODI DIGIT SIXMODI DIGIT SEVENMODI DIGIT EIGHTMODI DI" + - "GIT NINEMONGOLIAN BIRGA WITH ORNAMENTMONGOLIAN ROTATED BIRGAMONGOLIAN DO" + - "UBLE BIRGA WITH ORNAMENTMONGOLIAN TRIPLE BIRGA WITH ORNAMENTMONGOLIAN BI" + - "RGA WITH DOUBLE ORNAMENTMONGOLIAN ROTATED BIRGA WITH ORNAMENTMONGOLIAN R" + - "OTATED BIRGA WITH DOUBLE ORNAMENTMONGOLIAN INVERTED BIRGAMONGOLIAN INVER" + - "TED BIRGA WITH DOUBLE ORNAMENTMONGOLIAN SWIRL BIRGAMONGOLIAN SWIRL BIRGA" + - " WITH ORNAMENTMONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENTMONGOLIAN TURNED" + - " SWIRL BIRGA WITH DOUBLE ORNAMENTTAKRI LETTER ATAKRI LETTER AATAKRI LETT" + - "ER ITAKRI LETTER IITAKRI LETTER UTAKRI LETTER UUTAKRI LETTER ETAKRI LETT" + - "ER AITAKRI LETTER OTAKRI LETTER AUTAKRI LETTER KATAKRI LETTER KHATAKRI L" + - "ETTER GATAKRI LETTER GHATAKRI LETTER NGATAKRI LETTER CATAKRI LETTER CHAT" + - "AKRI LETTER JATAKRI LETTER JHATAKRI LETTER NYATAKRI LETTER TTATAKRI LETT" + - "ER TTHATAKRI LETTER DDATAKRI LETTER DDHATAKRI LETTER NNATAKRI LETTER TAT" + - "AKRI LETTER THATAKRI LETTER DATAKRI LETTER DHATAKRI LETTER NATAKRI LETTE" + - "R PATAKRI LETTER PHATAKRI LETTER BATAKRI LETTER BHATAKRI LETTER MATAKRI " + - "LETTER YATAKRI LETTER RATAKRI LETTER LATAKRI LETTER VATAKRI LETTER SHATA" + - "KRI LETTER SATAKRI LETTER HATAKRI LETTER RRATAKRI SIGN ANUSVARATAKRI SIG" + - "N VISARGATAKRI VOWEL SIGN AATAKRI VOWEL SIGN ITAKRI VOWEL SIGN IITAKRI V" + - "OWEL SIGN UTAKRI VOWEL SIGN UUTAKRI VOWEL SIGN ETAKRI VOWEL SIGN AITAKRI" + - " VOWEL SIGN OTAKRI VOWEL SIGN AUTAKRI SIGN VIRAMATAKRI SIGN NUKTATAKRI D" + - "IGIT ZEROTAKRI DIGIT ONETAKRI DIGIT TWOTAKRI DIGIT THREETAKRI DIGIT FOUR") + ("" + - "TAKRI DIGIT FIVETAKRI DIGIT SIXTAKRI DIGIT SEVENTAKRI DIGIT EIGHTTAKRI D" + - "IGIT NINEAHOM LETTER KAAHOM LETTER KHAAHOM LETTER NGAAHOM LETTER NAAHOM " + - "LETTER TAAHOM LETTER ALTERNATE TAAHOM LETTER PAAHOM LETTER PHAAHOM LETTE" + - "R BAAHOM LETTER MAAHOM LETTER JAAHOM LETTER CHAAHOM LETTER THAAHOM LETTE" + - "R RAAHOM LETTER LAAHOM LETTER SAAHOM LETTER NYAAHOM LETTER HAAHOM LETTER" + - " AAHOM LETTER DAAHOM LETTER DHAAHOM LETTER GAAHOM LETTER ALTERNATE GAAHO" + - "M LETTER GHAAHOM LETTER BHAAHOM LETTER JHAAHOM CONSONANT SIGN MEDIAL LAA" + - "HOM CONSONANT SIGN MEDIAL RAAHOM CONSONANT SIGN MEDIAL LIGATING RAAHOM V" + - "OWEL SIGN AAHOM VOWEL SIGN AAAHOM VOWEL SIGN IAHOM VOWEL SIGN IIAHOM VOW" + - "EL SIGN UAHOM VOWEL SIGN UUAHOM VOWEL SIGN EAHOM VOWEL SIGN AWAHOM VOWEL" + - " SIGN OAHOM VOWEL SIGN AIAHOM VOWEL SIGN AMAHOM SIGN KILLERAHOM DIGIT ZE" + - "ROAHOM DIGIT ONEAHOM DIGIT TWOAHOM DIGIT THREEAHOM DIGIT FOURAHOM DIGIT " + - "FIVEAHOM DIGIT SIXAHOM DIGIT SEVENAHOM DIGIT EIGHTAHOM DIGIT NINEAHOM NU" + - "MBER TENAHOM NUMBER TWENTYAHOM SIGN SMALL SECTIONAHOM SIGN SECTIONAHOM S" + - "IGN RULAIAHOM SYMBOL VIWARANG CITI CAPITAL LETTER NGAAWARANG CITI CAPITA" + - "L LETTER AWARANG CITI CAPITAL LETTER WIWARANG CITI CAPITAL LETTER YUWARA" + - "NG CITI CAPITAL LETTER YAWARANG CITI CAPITAL LETTER YOWARANG CITI CAPITA" + - "L LETTER IIWARANG CITI CAPITAL LETTER UUWARANG CITI CAPITAL LETTER EWARA" + - "NG CITI CAPITAL LETTER OWARANG CITI CAPITAL LETTER ANGWARANG CITI CAPITA" + - "L LETTER GAWARANG CITI CAPITAL LETTER KOWARANG CITI CAPITAL LETTER ENYWA" + - "RANG CITI CAPITAL LETTER YUJWARANG CITI CAPITAL LETTER UCWARANG CITI CAP" + - "ITAL LETTER ENNWARANG CITI CAPITAL LETTER ODDWARANG CITI CAPITAL LETTER " + - "TTEWARANG CITI CAPITAL LETTER NUNGWARANG CITI CAPITAL LETTER DAWARANG CI" + - "TI CAPITAL LETTER ATWARANG CITI CAPITAL LETTER AMWARANG CITI CAPITAL LET" + - "TER BUWARANG CITI CAPITAL LETTER PUWARANG CITI CAPITAL LETTER HIYOWARANG" + - " CITI CAPITAL LETTER HOLOWARANG CITI CAPITAL LETTER HORRWARANG CITI CAPI" + - "TAL LETTER HARWARANG CITI CAPITAL LETTER SSUUWARANG CITI CAPITAL LETTER " + - "SIIWARANG CITI CAPITAL LETTER VIYOWARANG CITI SMALL LETTER NGAAWARANG CI" + - "TI SMALL LETTER AWARANG CITI SMALL LETTER WIWARANG CITI SMALL LETTER YUW" + - "ARANG CITI SMALL LETTER YAWARANG CITI SMALL LETTER YOWARANG CITI SMALL L" + - "ETTER IIWARANG CITI SMALL LETTER UUWARANG CITI SMALL LETTER EWARANG CITI" + - " SMALL LETTER OWARANG CITI SMALL LETTER ANGWARANG CITI SMALL LETTER GAWA" + - "RANG CITI SMALL LETTER KOWARANG CITI SMALL LETTER ENYWARANG CITI SMALL L" + - "ETTER YUJWARANG CITI SMALL LETTER UCWARANG CITI SMALL LETTER ENNWARANG C" + - "ITI SMALL LETTER ODDWARANG CITI SMALL LETTER TTEWARANG CITI SMALL LETTER" + - " NUNGWARANG CITI SMALL LETTER DAWARANG CITI SMALL LETTER ATWARANG CITI S" + - "MALL LETTER AMWARANG CITI SMALL LETTER BUWARANG CITI SMALL LETTER PUWARA" + - "NG CITI SMALL LETTER HIYOWARANG CITI SMALL LETTER HOLOWARANG CITI SMALL " + - "LETTER HORRWARANG CITI SMALL LETTER HARWARANG CITI SMALL LETTER SSUUWARA" + - "NG CITI SMALL LETTER SIIWARANG CITI SMALL LETTER VIYOWARANG CITI DIGIT Z" + - "EROWARANG CITI DIGIT ONEWARANG CITI DIGIT TWOWARANG CITI DIGIT THREEWARA" + - "NG CITI DIGIT FOURWARANG CITI DIGIT FIVEWARANG CITI DIGIT SIXWARANG CITI" + - " DIGIT SEVENWARANG CITI DIGIT EIGHTWARANG CITI DIGIT NINEWARANG CITI NUM" + - "BER TENWARANG CITI NUMBER TWENTYWARANG CITI NUMBER THIRTYWARANG CITI NUM" + - "BER FORTYWARANG CITI NUMBER FIFTYWARANG CITI NUMBER SIXTYWARANG CITI NUM" + - "BER SEVENTYWARANG CITI NUMBER EIGHTYWARANG CITI NUMBER NINETYWARANG CITI" + - " OMPAU CIN HAU LETTER PAPAU CIN HAU LETTER KAPAU CIN HAU LETTER LAPAU CI" + - "N HAU LETTER MAPAU CIN HAU LETTER DAPAU CIN HAU LETTER ZAPAU CIN HAU LET" + - "TER VAPAU CIN HAU LETTER NGAPAU CIN HAU LETTER HAPAU CIN HAU LETTER GAPA" + - "U CIN HAU LETTER KHAPAU CIN HAU LETTER SAPAU CIN HAU LETTER BAPAU CIN HA" + - "U LETTER CAPAU CIN HAU LETTER TAPAU CIN HAU LETTER THAPAU CIN HAU LETTER" + - " NAPAU CIN HAU LETTER PHAPAU CIN HAU LETTER RAPAU CIN HAU LETTER FAPAU C" + - "IN HAU LETTER CHAPAU CIN HAU LETTER APAU CIN HAU LETTER EPAU CIN HAU LET" + - "TER IPAU CIN HAU LETTER OPAU CIN HAU LETTER UPAU CIN HAU LETTER UAPAU CI" + - "N HAU LETTER IAPAU CIN HAU LETTER FINAL PPAU CIN HAU LETTER FINAL KPAU C" + - "IN HAU LETTER FINAL TPAU CIN HAU LETTER FINAL MPAU CIN HAU LETTER FINAL " + - "NPAU CIN HAU LETTER FINAL LPAU CIN HAU LETTER FINAL WPAU CIN HAU LETTER " + - "FINAL NGPAU CIN HAU LETTER FINAL YPAU CIN HAU RISING TONE LONGPAU CIN HA" + - "U RISING TONEPAU CIN HAU SANDHI GLOTTAL STOPPAU CIN HAU RISING TONE LONG" + - " FINALPAU CIN HAU RISING TONE FINALPAU CIN HAU SANDHI GLOTTAL STOP FINAL" + - "PAU CIN HAU SANDHI TONE LONGPAU CIN HAU SANDHI TONEPAU CIN HAU SANDHI TO" + - "NE LONG FINALPAU CIN HAU SANDHI TONE FINALPAU CIN HAU MID-LEVEL TONEPAU " + - "CIN HAU GLOTTAL STOP VARIANTPAU CIN HAU MID-LEVEL TONE LONG FINALPAU CIN" + - " HAU MID-LEVEL TONE FINALPAU CIN HAU LOW-FALLING TONE LONGPAU CIN HAU LO") + ("" + - "W-FALLING TONEPAU CIN HAU GLOTTAL STOPPAU CIN HAU LOW-FALLING TONE LONG " + - "FINALPAU CIN HAU LOW-FALLING TONE FINALPAU CIN HAU GLOTTAL STOP FINALBHA" + - "IKSUKI LETTER ABHAIKSUKI LETTER AABHAIKSUKI LETTER IBHAIKSUKI LETTER IIB" + - "HAIKSUKI LETTER UBHAIKSUKI LETTER UUBHAIKSUKI LETTER VOCALIC RBHAIKSUKI " + - "LETTER VOCALIC RRBHAIKSUKI LETTER VOCALIC LBHAIKSUKI LETTER EBHAIKSUKI L" + - "ETTER AIBHAIKSUKI LETTER OBHAIKSUKI LETTER AUBHAIKSUKI LETTER KABHAIKSUK" + - "I LETTER KHABHAIKSUKI LETTER GABHAIKSUKI LETTER GHABHAIKSUKI LETTER NGAB" + - "HAIKSUKI LETTER CABHAIKSUKI LETTER CHABHAIKSUKI LETTER JABHAIKSUKI LETTE" + - "R JHABHAIKSUKI LETTER NYABHAIKSUKI LETTER TTABHAIKSUKI LETTER TTHABHAIKS" + - "UKI LETTER DDABHAIKSUKI LETTER DDHABHAIKSUKI LETTER NNABHAIKSUKI LETTER " + - "TABHAIKSUKI LETTER THABHAIKSUKI LETTER DABHAIKSUKI LETTER DHABHAIKSUKI L" + - "ETTER NABHAIKSUKI LETTER PABHAIKSUKI LETTER PHABHAIKSUKI LETTER BABHAIKS" + - "UKI LETTER BHABHAIKSUKI LETTER MABHAIKSUKI LETTER YABHAIKSUKI LETTER RAB" + - "HAIKSUKI LETTER LABHAIKSUKI LETTER VABHAIKSUKI LETTER SHABHAIKSUKI LETTE" + - "R SSABHAIKSUKI LETTER SABHAIKSUKI LETTER HABHAIKSUKI VOWEL SIGN AABHAIKS" + - "UKI VOWEL SIGN IBHAIKSUKI VOWEL SIGN IIBHAIKSUKI VOWEL SIGN UBHAIKSUKI V" + - "OWEL SIGN UUBHAIKSUKI VOWEL SIGN VOCALIC RBHAIKSUKI VOWEL SIGN VOCALIC R" + - "RBHAIKSUKI VOWEL SIGN VOCALIC LBHAIKSUKI VOWEL SIGN EBHAIKSUKI VOWEL SIG" + - "N AIBHAIKSUKI VOWEL SIGN OBHAIKSUKI VOWEL SIGN AUBHAIKSUKI SIGN CANDRABI" + - "NDUBHAIKSUKI SIGN ANUSVARABHAIKSUKI SIGN VISARGABHAIKSUKI SIGN VIRAMABHA" + - "IKSUKI SIGN AVAGRAHABHAIKSUKI DANDABHAIKSUKI DOUBLE DANDABHAIKSUKI WORD " + - "SEPARATORBHAIKSUKI GAP FILLER-1BHAIKSUKI GAP FILLER-2BHAIKSUKI DIGIT ZER" + - "OBHAIKSUKI DIGIT ONEBHAIKSUKI DIGIT TWOBHAIKSUKI DIGIT THREEBHAIKSUKI DI" + - "GIT FOURBHAIKSUKI DIGIT FIVEBHAIKSUKI DIGIT SIXBHAIKSUKI DIGIT SEVENBHAI" + - "KSUKI DIGIT EIGHTBHAIKSUKI DIGIT NINEBHAIKSUKI NUMBER ONEBHAIKSUKI NUMBE" + - "R TWOBHAIKSUKI NUMBER THREEBHAIKSUKI NUMBER FOURBHAIKSUKI NUMBER FIVEBHA" + - "IKSUKI NUMBER SIXBHAIKSUKI NUMBER SEVENBHAIKSUKI NUMBER EIGHTBHAIKSUKI N" + - "UMBER NINEBHAIKSUKI NUMBER TENBHAIKSUKI NUMBER TWENTYBHAIKSUKI NUMBER TH" + - "IRTYBHAIKSUKI NUMBER FORTYBHAIKSUKI NUMBER FIFTYBHAIKSUKI NUMBER SIXTYBH" + - "AIKSUKI NUMBER SEVENTYBHAIKSUKI NUMBER EIGHTYBHAIKSUKI NUMBER NINETYBHAI" + - "KSUKI HUNDREDS UNIT MARKMARCHEN HEAD MARKMARCHEN MARK SHADMARCHEN LETTER" + - " KAMARCHEN LETTER KHAMARCHEN LETTER GAMARCHEN LETTER NGAMARCHEN LETTER C" + - "AMARCHEN LETTER CHAMARCHEN LETTER JAMARCHEN LETTER NYAMARCHEN LETTER TAM" + - "ARCHEN LETTER THAMARCHEN LETTER DAMARCHEN LETTER NAMARCHEN LETTER PAMARC" + - "HEN LETTER PHAMARCHEN LETTER BAMARCHEN LETTER MAMARCHEN LETTER TSAMARCHE" + - "N LETTER TSHAMARCHEN LETTER DZAMARCHEN LETTER WAMARCHEN LETTER ZHAMARCHE" + - "N LETTER ZAMARCHEN LETTER -AMARCHEN LETTER YAMARCHEN LETTER RAMARCHEN LE" + - "TTER LAMARCHEN LETTER SHAMARCHEN LETTER SAMARCHEN LETTER HAMARCHEN LETTE" + - "R AMARCHEN SUBJOINED LETTER KAMARCHEN SUBJOINED LETTER KHAMARCHEN SUBJOI" + - "NED LETTER GAMARCHEN SUBJOINED LETTER NGAMARCHEN SUBJOINED LETTER CAMARC" + - "HEN SUBJOINED LETTER CHAMARCHEN SUBJOINED LETTER JAMARCHEN SUBJOINED LET" + - "TER NYAMARCHEN SUBJOINED LETTER TAMARCHEN SUBJOINED LETTER THAMARCHEN SU" + - "BJOINED LETTER DAMARCHEN SUBJOINED LETTER NAMARCHEN SUBJOINED LETTER PAM" + - "ARCHEN SUBJOINED LETTER PHAMARCHEN SUBJOINED LETTER BAMARCHEN SUBJOINED " + - "LETTER MAMARCHEN SUBJOINED LETTER TSAMARCHEN SUBJOINED LETTER TSHAMARCHE" + - "N SUBJOINED LETTER DZAMARCHEN SUBJOINED LETTER WAMARCHEN SUBJOINED LETTE" + - "R ZHAMARCHEN SUBJOINED LETTER ZAMARCHEN SUBJOINED LETTER YAMARCHEN SUBJO" + - "INED LETTER RAMARCHEN SUBJOINED LETTER LAMARCHEN SUBJOINED LETTER SHAMAR" + - "CHEN SUBJOINED LETTER SAMARCHEN SUBJOINED LETTER HAMARCHEN SUBJOINED LET" + - "TER AMARCHEN VOWEL SIGN AAMARCHEN VOWEL SIGN IMARCHEN VOWEL SIGN UMARCHE" + - "N VOWEL SIGN EMARCHEN VOWEL SIGN OMARCHEN SIGN ANUSVARAMARCHEN SIGN CAND" + - "RABINDUCUNEIFORM SIGN ACUNEIFORM SIGN A TIMES ACUNEIFORM SIGN A TIMES BA" + - "DCUNEIFORM SIGN A TIMES GAN2 TENUCUNEIFORM SIGN A TIMES HACUNEIFORM SIGN" + - " A TIMES IGICUNEIFORM SIGN A TIMES LAGAR GUNUCUNEIFORM SIGN A TIMES MUSH" + - "CUNEIFORM SIGN A TIMES SAGCUNEIFORM SIGN A2CUNEIFORM SIGN ABCUNEIFORM SI" + - "GN AB TIMES ASH2CUNEIFORM SIGN AB TIMES DUN3 GUNUCUNEIFORM SIGN AB TIMES" + - " GALCUNEIFORM SIGN AB TIMES GAN2 TENUCUNEIFORM SIGN AB TIMES HACUNEIFORM" + - " SIGN AB TIMES IGI GUNUCUNEIFORM SIGN AB TIMES IMINCUNEIFORM SIGN AB TIM" + - "ES LAGABCUNEIFORM SIGN AB TIMES SHESHCUNEIFORM SIGN AB TIMES U PLUS U PL" + - "US UCUNEIFORM SIGN AB GUNUCUNEIFORM SIGN AB2CUNEIFORM SIGN AB2 TIMES BAL" + - "AGCUNEIFORM SIGN AB2 TIMES GAN2 TENUCUNEIFORM SIGN AB2 TIMES ME PLUS ENC" + - "UNEIFORM SIGN AB2 TIMES SHA3CUNEIFORM SIGN AB2 TIMES TAK4CUNEIFORM SIGN " + - "ADCUNEIFORM SIGN AKCUNEIFORM SIGN AK TIMES ERIN2CUNEIFORM SIGN AK TIMES " + - "SHITA PLUS GISHCUNEIFORM SIGN ALCUNEIFORM SIGN AL TIMES ALCUNEIFORM SIGN") + ("" + - " AL TIMES DIM2CUNEIFORM SIGN AL TIMES GISHCUNEIFORM SIGN AL TIMES HACUNE" + - "IFORM SIGN AL TIMES KAD3CUNEIFORM SIGN AL TIMES KICUNEIFORM SIGN AL TIME" + - "S SHECUNEIFORM SIGN AL TIMES USHCUNEIFORM SIGN ALANCUNEIFORM SIGN ALEPHC" + - "UNEIFORM SIGN AMARCUNEIFORM SIGN AMAR TIMES SHECUNEIFORM SIGN ANCUNEIFOR" + - "M SIGN AN OVER ANCUNEIFORM SIGN AN THREE TIMESCUNEIFORM SIGN AN PLUS NAG" + - "A OPPOSING AN PLUS NAGACUNEIFORM SIGN AN PLUS NAGA SQUAREDCUNEIFORM SIGN" + - " ANSHECUNEIFORM SIGN APINCUNEIFORM SIGN ARADCUNEIFORM SIGN ARAD TIMES KU" + - "RCUNEIFORM SIGN ARKABCUNEIFORM SIGN ASAL2CUNEIFORM SIGN ASHCUNEIFORM SIG" + - "N ASH ZIDA TENUCUNEIFORM SIGN ASH KABA TENUCUNEIFORM SIGN ASH OVER ASH T" + - "UG2 OVER TUG2 TUG2 OVER TUG2 PAPCUNEIFORM SIGN ASH OVER ASH OVER ASHCUNE" + - "IFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASHCUNEIFORM" + - " SIGN ASH2CUNEIFORM SIGN ASHGABCUNEIFORM SIGN BACUNEIFORM SIGN BADCUNEIF" + - "ORM SIGN BAG3CUNEIFORM SIGN BAHAR2CUNEIFORM SIGN BALCUNEIFORM SIGN BAL O" + - "VER BALCUNEIFORM SIGN BALAGCUNEIFORM SIGN BARCUNEIFORM SIGN BARA2CUNEIFO" + - "RM SIGN BICUNEIFORM SIGN BI TIMES ACUNEIFORM SIGN BI TIMES GARCUNEIFORM " + - "SIGN BI TIMES IGI GUNUCUNEIFORM SIGN BUCUNEIFORM SIGN BU OVER BU ABCUNEI" + - "FORM SIGN BU OVER BU UNCUNEIFORM SIGN BU CROSSING BUCUNEIFORM SIGN BULUG" + - "CUNEIFORM SIGN BULUG OVER BULUGCUNEIFORM SIGN BURCUNEIFORM SIGN BUR2CUNE" + - "IFORM SIGN DACUNEIFORM SIGN DAGCUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MA" + - "SHCUNEIFORM SIGN DAG KISIM5 TIMES AMARCUNEIFORM SIGN DAG KISIM5 TIMES BA" + - "LAGCUNEIFORM SIGN DAG KISIM5 TIMES BICUNEIFORM SIGN DAG KISIM5 TIMES GAC" + - "UNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASHCUNEIFORM SIGN DAG KISIM5 TIM" + - "ES GICUNEIFORM SIGN DAG KISIM5 TIMES GIR2CUNEIFORM SIGN DAG KISIM5 TIMES" + - " GUDCUNEIFORM SIGN DAG KISIM5 TIMES HACUNEIFORM SIGN DAG KISIM5 TIMES IR" + - "CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LUCUNEIFORM SIGN DAG KISIM5 TIME" + - "S KAKCUNEIFORM SIGN DAG KISIM5 TIMES LACUNEIFORM SIGN DAG KISIM5 TIMES L" + - "UCUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2CUNEIFORM SIGN DAG KISIM5 " + - "TIMES LUMCUNEIFORM SIGN DAG KISIM5 TIMES NECUNEIFORM SIGN DAG KISIM5 TIM" + - "ES PAP PLUS PAPCUNEIFORM SIGN DAG KISIM5 TIMES SICUNEIFORM SIGN DAG KISI" + - "M5 TIMES TAK4CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2CUNEIFORM SIGN " + - "DAG KISIM5 TIMES USHCUNEIFORM SIGN DAMCUNEIFORM SIGN DARCUNEIFORM SIGN D" + - "ARA3CUNEIFORM SIGN DARA4CUNEIFORM SIGN DICUNEIFORM SIGN DIBCUNEIFORM SIG" + - "N DIMCUNEIFORM SIGN DIM TIMES SHECUNEIFORM SIGN DIM2CUNEIFORM SIGN DINCU" + - "NEIFORM SIGN DIN KASKAL U GUNU DISHCUNEIFORM SIGN DISHCUNEIFORM SIGN DUC" + - "UNEIFORM SIGN DU OVER DUCUNEIFORM SIGN DU GUNUCUNEIFORM SIGN DU SHESHIGC" + - "UNEIFORM SIGN DUBCUNEIFORM SIGN DUB TIMES ESH2CUNEIFORM SIGN DUB2CUNEIFO" + - "RM SIGN DUGCUNEIFORM SIGN DUGUDCUNEIFORM SIGN DUHCUNEIFORM SIGN DUNCUNEI" + - "FORM SIGN DUN3CUNEIFORM SIGN DUN3 GUNUCUNEIFORM SIGN DUN3 GUNU GUNUCUNEI" + - "FORM SIGN DUN4CUNEIFORM SIGN DUR2CUNEIFORM SIGN ECUNEIFORM SIGN E TIMES " + - "PAPCUNEIFORM SIGN E OVER E NUN OVER NUNCUNEIFORM SIGN E2CUNEIFORM SIGN E" + - "2 TIMES A PLUS HA PLUS DACUNEIFORM SIGN E2 TIMES GARCUNEIFORM SIGN E2 TI" + - "MES MICUNEIFORM SIGN E2 TIMES SALCUNEIFORM SIGN E2 TIMES SHECUNEIFORM SI" + - "GN E2 TIMES UCUNEIFORM SIGN EDINCUNEIFORM SIGN EGIRCUNEIFORM SIGN ELCUNE" + - "IFORM SIGN ENCUNEIFORM SIGN EN TIMES GAN2CUNEIFORM SIGN EN TIMES GAN2 TE" + - "NUCUNEIFORM SIGN EN TIMES MECUNEIFORM SIGN EN CROSSING ENCUNEIFORM SIGN " + - "EN OPPOSING ENCUNEIFORM SIGN EN SQUAREDCUNEIFORM SIGN ERENCUNEIFORM SIGN" + - " ERIN2CUNEIFORM SIGN ESH2CUNEIFORM SIGN EZENCUNEIFORM SIGN EZEN TIMES AC" + - "UNEIFORM SIGN EZEN TIMES A PLUS LALCUNEIFORM SIGN EZEN TIMES A PLUS LAL " + - "TIMES LALCUNEIFORM SIGN EZEN TIMES ANCUNEIFORM SIGN EZEN TIMES BADCUNEIF" + - "ORM SIGN EZEN TIMES DUN3 GUNUCUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNUCUN" + - "EIFORM SIGN EZEN TIMES HACUNEIFORM SIGN EZEN TIMES HA GUNUCUNEIFORM SIGN" + - " EZEN TIMES IGI GUNUCUNEIFORM SIGN EZEN TIMES KASKALCUNEIFORM SIGN EZEN " + - "TIMES KASKAL SQUAREDCUNEIFORM SIGN EZEN TIMES KU3CUNEIFORM SIGN EZEN TIM" + - "ES LACUNEIFORM SIGN EZEN TIMES LAL TIMES LALCUNEIFORM SIGN EZEN TIMES LI" + - "CUNEIFORM SIGN EZEN TIMES LUCUNEIFORM SIGN EZEN TIMES U2CUNEIFORM SIGN E" + - "ZEN TIMES UDCUNEIFORM SIGN GACUNEIFORM SIGN GA GUNUCUNEIFORM SIGN GA2CUN" + - "EIFORM SIGN GA2 TIMES A PLUS DA PLUS HACUNEIFORM SIGN GA2 TIMES A PLUS H" + - "ACUNEIFORM SIGN GA2 TIMES A PLUS IGICUNEIFORM SIGN GA2 TIMES AB2 TENU PL" + - "US TABCUNEIFORM SIGN GA2 TIMES ANCUNEIFORM SIGN GA2 TIMES ASHCUNEIFORM S" + - "IGN GA2 TIMES ASH2 PLUS GALCUNEIFORM SIGN GA2 TIMES BADCUNEIFORM SIGN GA" + - "2 TIMES BAR PLUS RACUNEIFORM SIGN GA2 TIMES BURCUNEIFORM SIGN GA2 TIMES " + - "BUR PLUS RACUNEIFORM SIGN GA2 TIMES DACUNEIFORM SIGN GA2 TIMES DICUNEIFO" + - "RM SIGN GA2 TIMES DIM TIMES SHECUNEIFORM SIGN GA2 TIMES DUBCUNEIFORM SIG" + - "N GA2 TIMES ELCUNEIFORM SIGN GA2 TIMES EL PLUS LACUNEIFORM SIGN GA2 TIME") + ("" + - "S ENCUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENUCUNEIFORM SIGN GA2 TIMES " + - "GAN2 TENUCUNEIFORM SIGN GA2 TIMES GARCUNEIFORM SIGN GA2 TIMES GICUNEIFOR" + - "M SIGN GA2 TIMES GI4CUNEIFORM SIGN GA2 TIMES GI4 PLUS ACUNEIFORM SIGN GA" + - "2 TIMES GIR2 PLUS SUCUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2CUNEIFO" + - "RM SIGN GA2 TIMES HALCUNEIFORM SIGN GA2 TIMES HAL PLUS LACUNEIFORM SIGN " + - "GA2 TIMES HI PLUS LICUNEIFORM SIGN GA2 TIMES HUB2CUNEIFORM SIGN GA2 TIME" + - "S IGI GUNUCUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASHCUNEIFORM SIGN GA" + - "2 TIMES KAKCUNEIFORM SIGN GA2 TIMES KASKALCUNEIFORM SIGN GA2 TIMES KIDCU" + - "NEIFORM SIGN GA2 TIMES KID PLUS LALCUNEIFORM SIGN GA2 TIMES KU3 PLUS ANC" + - "UNEIFORM SIGN GA2 TIMES LACUNEIFORM SIGN GA2 TIMES ME PLUS ENCUNEIFORM S" + - "IGN GA2 TIMES MICUNEIFORM SIGN GA2 TIMES NUNCUNEIFORM SIGN GA2 TIMES NUN" + - " OVER NUNCUNEIFORM SIGN GA2 TIMES PACUNEIFORM SIGN GA2 TIMES SALCUNEIFOR" + - "M SIGN GA2 TIMES SARCUNEIFORM SIGN GA2 TIMES SHECUNEIFORM SIGN GA2 TIMES" + - " SHE PLUS TURCUNEIFORM SIGN GA2 TIMES SHIDCUNEIFORM SIGN GA2 TIMES SUMCU" + - "NEIFORM SIGN GA2 TIMES TAK4CUNEIFORM SIGN GA2 TIMES UCUNEIFORM SIGN GA2 " + - "TIMES UDCUNEIFORM SIGN GA2 TIMES UD PLUS DUCUNEIFORM SIGN GA2 OVER GA2CU" + - "NEIFORM SIGN GABACUNEIFORM SIGN GABA CROSSING GABACUNEIFORM SIGN GADCUNE" + - "IFORM SIGN GAD OVER GAD GAR OVER GARCUNEIFORM SIGN GALCUNEIFORM SIGN GAL" + - " GAD OVER GAD GAR OVER GARCUNEIFORM SIGN GALAMCUNEIFORM SIGN GAMCUNEIFOR" + - "M SIGN GANCUNEIFORM SIGN GAN2CUNEIFORM SIGN GAN2 TENUCUNEIFORM SIGN GAN2" + - " OVER GAN2CUNEIFORM SIGN GAN2 CROSSING GAN2CUNEIFORM SIGN GARCUNEIFORM S" + - "IGN GAR3CUNEIFORM SIGN GASHANCUNEIFORM SIGN GESHTINCUNEIFORM SIGN GESHTI" + - "N TIMES KURCUNEIFORM SIGN GICUNEIFORM SIGN GI TIMES ECUNEIFORM SIGN GI T" + - "IMES UCUNEIFORM SIGN GI CROSSING GICUNEIFORM SIGN GI4CUNEIFORM SIGN GI4 " + - "OVER GI4CUNEIFORM SIGN GI4 CROSSING GI4CUNEIFORM SIGN GIDIMCUNEIFORM SIG" + - "N GIR2CUNEIFORM SIGN GIR2 GUNUCUNEIFORM SIGN GIR3CUNEIFORM SIGN GIR3 TIM" + - "ES A PLUS IGICUNEIFORM SIGN GIR3 TIMES GAN2 TENUCUNEIFORM SIGN GIR3 TIME" + - "S IGICUNEIFORM SIGN GIR3 TIMES LU PLUS IGICUNEIFORM SIGN GIR3 TIMES PACU" + - "NEIFORM SIGN GISALCUNEIFORM SIGN GISHCUNEIFORM SIGN GISH CROSSING GISHCU" + - "NEIFORM SIGN GISH TIMES BADCUNEIFORM SIGN GISH TIMES TAK4CUNEIFORM SIGN " + - "GISH TENUCUNEIFORM SIGN GUCUNEIFORM SIGN GU CROSSING GUCUNEIFORM SIGN GU" + - "2CUNEIFORM SIGN GU2 TIMES KAKCUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU" + - "CUNEIFORM SIGN GU2 TIMES NUNCUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2CUNEIF" + - "ORM SIGN GU2 GUNUCUNEIFORM SIGN GUDCUNEIFORM SIGN GUD TIMES A PLUS KURCU" + - "NEIFORM SIGN GUD TIMES KURCUNEIFORM SIGN GUD OVER GUD LUGALCUNEIFORM SIG" + - "N GULCUNEIFORM SIGN GUMCUNEIFORM SIGN GUM TIMES SHECUNEIFORM SIGN GURCUN" + - "EIFORM SIGN GUR7CUNEIFORM SIGN GURUNCUNEIFORM SIGN GURUSHCUNEIFORM SIGN " + - "HACUNEIFORM SIGN HA TENUCUNEIFORM SIGN HA GUNUCUNEIFORM SIGN HALCUNEIFOR" + - "M SIGN HICUNEIFORM SIGN HI TIMES ASHCUNEIFORM SIGN HI TIMES ASH2CUNEIFOR" + - "M SIGN HI TIMES BADCUNEIFORM SIGN HI TIMES DISHCUNEIFORM SIGN HI TIMES G" + - "ADCUNEIFORM SIGN HI TIMES KINCUNEIFORM SIGN HI TIMES NUNCUNEIFORM SIGN H" + - "I TIMES SHECUNEIFORM SIGN HI TIMES UCUNEIFORM SIGN HUCUNEIFORM SIGN HUB2" + - "CUNEIFORM SIGN HUB2 TIMES ANCUNEIFORM SIGN HUB2 TIMES HALCUNEIFORM SIGN " + - "HUB2 TIMES KASKALCUNEIFORM SIGN HUB2 TIMES LISHCUNEIFORM SIGN HUB2 TIMES" + - " UDCUNEIFORM SIGN HUL2CUNEIFORM SIGN ICUNEIFORM SIGN I ACUNEIFORM SIGN I" + - "BCUNEIFORM SIGN IDIMCUNEIFORM SIGN IDIM OVER IDIM BURCUNEIFORM SIGN IDIM" + - " OVER IDIM SQUAREDCUNEIFORM SIGN IGCUNEIFORM SIGN IGICUNEIFORM SIGN IGI " + - "DIBCUNEIFORM SIGN IGI RICUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OV" + - "ER UDCUNEIFORM SIGN IGI GUNUCUNEIFORM SIGN ILCUNEIFORM SIGN IL TIMES GAN" + - "2 TENUCUNEIFORM SIGN IL2CUNEIFORM SIGN IMCUNEIFORM SIGN IM TIMES TAK4CUN" + - "EIFORM SIGN IM CROSSING IMCUNEIFORM SIGN IM OPPOSING IMCUNEIFORM SIGN IM" + - " SQUAREDCUNEIFORM SIGN IMINCUNEIFORM SIGN INCUNEIFORM SIGN IRCUNEIFORM S" + - "IGN ISHCUNEIFORM SIGN KACUNEIFORM SIGN KA TIMES ACUNEIFORM SIGN KA TIMES" + - " ADCUNEIFORM SIGN KA TIMES AD PLUS KU3CUNEIFORM SIGN KA TIMES ASH2CUNEIF" + - "ORM SIGN KA TIMES BADCUNEIFORM SIGN KA TIMES BALAGCUNEIFORM SIGN KA TIME" + - "S BARCUNEIFORM SIGN KA TIMES BICUNEIFORM SIGN KA TIMES ERIN2CUNEIFORM SI" + - "GN KA TIMES ESH2CUNEIFORM SIGN KA TIMES GACUNEIFORM SIGN KA TIMES GALCUN" + - "EIFORM SIGN KA TIMES GAN2 TENUCUNEIFORM SIGN KA TIMES GARCUNEIFORM SIGN " + - "KA TIMES GAR PLUS SHA3 PLUS ACUNEIFORM SIGN KA TIMES GICUNEIFORM SIGN KA" + - " TIMES GIR2CUNEIFORM SIGN KA TIMES GISH PLUS SARCUNEIFORM SIGN KA TIMES " + - "GISH CROSSING GISHCUNEIFORM SIGN KA TIMES GUCUNEIFORM SIGN KA TIMES GUR7" + - "CUNEIFORM SIGN KA TIMES IGICUNEIFORM SIGN KA TIMES IMCUNEIFORM SIGN KA T" + - "IMES KAKCUNEIFORM SIGN KA TIMES KICUNEIFORM SIGN KA TIMES KIDCUNEIFORM S" + - "IGN KA TIMES LICUNEIFORM SIGN KA TIMES LUCUNEIFORM SIGN KA TIMES MECUNEI") + ("" + - "FORM SIGN KA TIMES ME PLUS DUCUNEIFORM SIGN KA TIMES ME PLUS GICUNEIFORM" + - " SIGN KA TIMES ME PLUS TECUNEIFORM SIGN KA TIMES MICUNEIFORM SIGN KA TIM" + - "ES MI PLUS NUNUZCUNEIFORM SIGN KA TIMES NECUNEIFORM SIGN KA TIMES NUNCUN" + - "EIFORM SIGN KA TIMES PICUNEIFORM SIGN KA TIMES RUCUNEIFORM SIGN KA TIMES" + - " SACUNEIFORM SIGN KA TIMES SARCUNEIFORM SIGN KA TIMES SHACUNEIFORM SIGN " + - "KA TIMES SHECUNEIFORM SIGN KA TIMES SHIDCUNEIFORM SIGN KA TIMES SHUCUNEI" + - "FORM SIGN KA TIMES SIGCUNEIFORM SIGN KA TIMES SUHURCUNEIFORM SIGN KA TIM" + - "ES TARCUNEIFORM SIGN KA TIMES UCUNEIFORM SIGN KA TIMES U2CUNEIFORM SIGN " + - "KA TIMES UDCUNEIFORM SIGN KA TIMES UMUM TIMES PACUNEIFORM SIGN KA TIMES " + - "USHCUNEIFORM SIGN KA TIMES ZICUNEIFORM SIGN KA2CUNEIFORM SIGN KA2 CROSSI" + - "NG KA2CUNEIFORM SIGN KABCUNEIFORM SIGN KAD2CUNEIFORM SIGN KAD3CUNEIFORM " + - "SIGN KAD4CUNEIFORM SIGN KAD5CUNEIFORM SIGN KAD5 OVER KAD5CUNEIFORM SIGN " + - "KAKCUNEIFORM SIGN KAK TIMES IGI GUNUCUNEIFORM SIGN KALCUNEIFORM SIGN KAL" + - " TIMES BADCUNEIFORM SIGN KAL CROSSING KALCUNEIFORM SIGN KAM2CUNEIFORM SI" + - "GN KAM4CUNEIFORM SIGN KASKALCUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAG" + - "AB TIMES UCUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIM" + - "ES UCUNEIFORM SIGN KESH2CUNEIFORM SIGN KICUNEIFORM SIGN KI TIMES BADCUNE" + - "IFORM SIGN KI TIMES UCUNEIFORM SIGN KI TIMES UDCUNEIFORM SIGN KIDCUNEIFO" + - "RM SIGN KINCUNEIFORM SIGN KISALCUNEIFORM SIGN KISHCUNEIFORM SIGN KISIM5C" + - "UNEIFORM SIGN KISIM5 OVER KISIM5CUNEIFORM SIGN KUCUNEIFORM SIGN KU OVER " + - "HI TIMES ASH2 KU OVER HI TIMES ASH2CUNEIFORM SIGN KU3CUNEIFORM SIGN KU4C" + - "UNEIFORM SIGN KU4 VARIANT FORMCUNEIFORM SIGN KU7CUNEIFORM SIGN KULCUNEIF" + - "ORM SIGN KUL GUNUCUNEIFORM SIGN KUNCUNEIFORM SIGN KURCUNEIFORM SIGN KUR " + - "OPPOSING KURCUNEIFORM SIGN KUSHU2CUNEIFORM SIGN KWU318CUNEIFORM SIGN LAC" + - "UNEIFORM SIGN LAGABCUNEIFORM SIGN LAGAB TIMES ACUNEIFORM SIGN LAGAB TIME" + - "S A PLUS DA PLUS HACUNEIFORM SIGN LAGAB TIMES A PLUS GARCUNEIFORM SIGN L" + - "AGAB TIMES A PLUS LALCUNEIFORM SIGN LAGAB TIMES ALCUNEIFORM SIGN LAGAB T" + - "IMES ANCUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENUCUNEIFORM SIGN LAGAB TIME" + - "S BADCUNEIFORM SIGN LAGAB TIMES BICUNEIFORM SIGN LAGAB TIMES DARCUNEIFOR" + - "M SIGN LAGAB TIMES ENCUNEIFORM SIGN LAGAB TIMES GACUNEIFORM SIGN LAGAB T" + - "IMES GARCUNEIFORM SIGN LAGAB TIMES GUDCUNEIFORM SIGN LAGAB TIMES GUD PLU" + - "S GUDCUNEIFORM SIGN LAGAB TIMES HACUNEIFORM SIGN LAGAB TIMES HALCUNEIFOR" + - "M SIGN LAGAB TIMES HI TIMES NUNCUNEIFORM SIGN LAGAB TIMES IGI GUNUCUNEIF" + - "ORM SIGN LAGAB TIMES IMCUNEIFORM SIGN LAGAB TIMES IM PLUS HACUNEIFORM SI" + - "GN LAGAB TIMES IM PLUS LUCUNEIFORM SIGN LAGAB TIMES KICUNEIFORM SIGN LAG" + - "AB TIMES KINCUNEIFORM SIGN LAGAB TIMES KU3CUNEIFORM SIGN LAGAB TIMES KUL" + - "CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS ACUNEIFORM SIGN LAGAB TIMES " + - "LAGABCUNEIFORM SIGN LAGAB TIMES LISHCUNEIFORM SIGN LAGAB TIMES LUCUNEIFO" + - "RM SIGN LAGAB TIMES LULCUNEIFORM SIGN LAGAB TIMES MECUNEIFORM SIGN LAGAB" + - " TIMES ME PLUS ENCUNEIFORM SIGN LAGAB TIMES MUSHCUNEIFORM SIGN LAGAB TIM" + - "ES NECUNEIFORM SIGN LAGAB TIMES SHE PLUS SUMCUNEIFORM SIGN LAGAB TIMES S" + - "HITA PLUS GISH PLUS ERIN2CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU" + - "CUNEIFORM SIGN LAGAB TIMES SHU2CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2" + - "CUNEIFORM SIGN LAGAB TIMES SUMCUNEIFORM SIGN LAGAB TIMES TAGCUNEIFORM SI" + - "GN LAGAB TIMES TAK4CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NAC" + - "UNEIFORM SIGN LAGAB TIMES UCUNEIFORM SIGN LAGAB TIMES U PLUS ACUNEIFORM " + - "SIGN LAGAB TIMES U PLUS U PLUS UCUNEIFORM SIGN LAGAB TIMES U2 PLUS ASHCU" + - "NEIFORM SIGN LAGAB TIMES UDCUNEIFORM SIGN LAGAB TIMES USHCUNEIFORM SIGN " + - "LAGAB SQUAREDCUNEIFORM SIGN LAGARCUNEIFORM SIGN LAGAR TIMES SHECUNEIFORM" + - " SIGN LAGAR TIMES SHE PLUS SUMCUNEIFORM SIGN LAGAR GUNUCUNEIFORM SIGN LA" + - "GAR GUNU OVER LAGAR GUNU SHECUNEIFORM SIGN LAHSHUCUNEIFORM SIGN LALCUNEI" + - "FORM SIGN LAL TIMES LALCUNEIFORM SIGN LAMCUNEIFORM SIGN LAM TIMES KURCUN" + - "EIFORM SIGN LAM TIMES KUR PLUS RUCUNEIFORM SIGN LICUNEIFORM SIGN LILCUNE" + - "IFORM SIGN LIMMU2CUNEIFORM SIGN LISHCUNEIFORM SIGN LUCUNEIFORM SIGN LU T" + - "IMES BADCUNEIFORM SIGN LU2CUNEIFORM SIGN LU2 TIMES ALCUNEIFORM SIGN LU2 " + - "TIMES BADCUNEIFORM SIGN LU2 TIMES ESH2CUNEIFORM SIGN LU2 TIMES ESH2 TENU" + - "CUNEIFORM SIGN LU2 TIMES GAN2 TENUCUNEIFORM SIGN LU2 TIMES HI TIMES BADC" + - "UNEIFORM SIGN LU2 TIMES IMCUNEIFORM SIGN LU2 TIMES KAD2CUNEIFORM SIGN LU" + - "2 TIMES KAD3CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASHCUNEIFORM SIGN LU2 TIM" + - "ES KICUNEIFORM SIGN LU2 TIMES LA PLUS ASHCUNEIFORM SIGN LU2 TIMES LAGABC" + - "UNEIFORM SIGN LU2 TIMES ME PLUS ENCUNEIFORM SIGN LU2 TIMES NECUNEIFORM S" + - "IGN LU2 TIMES NUCUNEIFORM SIGN LU2 TIMES SI PLUS ASHCUNEIFORM SIGN LU2 T" + - "IMES SIK2 PLUS BUCUNEIFORM SIGN LU2 TIMES TUG2CUNEIFORM SIGN LU2 TENUCUN" + - "EIFORM SIGN LU2 CROSSING LU2CUNEIFORM SIGN LU2 OPPOSING LU2CUNEIFORM SIG") + ("" + - "N LU2 SQUAREDCUNEIFORM SIGN LU2 SHESHIGCUNEIFORM SIGN LU3CUNEIFORM SIGN " + - "LUGALCUNEIFORM SIGN LUGAL OVER LUGALCUNEIFORM SIGN LUGAL OPPOSING LUGALC" + - "UNEIFORM SIGN LUGAL SHESHIGCUNEIFORM SIGN LUHCUNEIFORM SIGN LULCUNEIFORM" + - " SIGN LUMCUNEIFORM SIGN LUM OVER LUMCUNEIFORM SIGN LUM OVER LUM GAR OVER" + - " GARCUNEIFORM SIGN MACUNEIFORM SIGN MA TIMES TAK4CUNEIFORM SIGN MA GUNUC" + - "UNEIFORM SIGN MA2CUNEIFORM SIGN MAHCUNEIFORM SIGN MARCUNEIFORM SIGN MASH" + - "CUNEIFORM SIGN MASH2CUNEIFORM SIGN MECUNEIFORM SIGN MESCUNEIFORM SIGN MI" + - "CUNEIFORM SIGN MINCUNEIFORM SIGN MUCUNEIFORM SIGN MU OVER MUCUNEIFORM SI" + - "GN MUGCUNEIFORM SIGN MUG GUNUCUNEIFORM SIGN MUNSUBCUNEIFORM SIGN MURGU2C" + - "UNEIFORM SIGN MUSHCUNEIFORM SIGN MUSH TIMES ACUNEIFORM SIGN MUSH TIMES K" + - "URCUNEIFORM SIGN MUSH TIMES ZACUNEIFORM SIGN MUSH OVER MUSHCUNEIFORM SIG" + - "N MUSH OVER MUSH TIMES A PLUS NACUNEIFORM SIGN MUSH CROSSING MUSHCUNEIFO" + - "RM SIGN MUSH3CUNEIFORM SIGN MUSH3 TIMES ACUNEIFORM SIGN MUSH3 TIMES A PL" + - "US DICUNEIFORM SIGN MUSH3 TIMES DICUNEIFORM SIGN MUSH3 GUNUCUNEIFORM SIG" + - "N NACUNEIFORM SIGN NA2CUNEIFORM SIGN NAGACUNEIFORM SIGN NAGA INVERTEDCUN" + - "EIFORM SIGN NAGA TIMES SHU TENUCUNEIFORM SIGN NAGA OPPOSING NAGACUNEIFOR" + - "M SIGN NAGARCUNEIFORM SIGN NAM NUTILLUCUNEIFORM SIGN NAMCUNEIFORM SIGN N" + - "AM2CUNEIFORM SIGN NECUNEIFORM SIGN NE TIMES ACUNEIFORM SIGN NE TIMES UDC" + - "UNEIFORM SIGN NE SHESHIGCUNEIFORM SIGN NICUNEIFORM SIGN NI TIMES ECUNEIF" + - "ORM SIGN NI2CUNEIFORM SIGN NIMCUNEIFORM SIGN NIM TIMES GAN2 TENUCUNEIFOR" + - "M SIGN NIM TIMES GAR PLUS GAN2 TENUCUNEIFORM SIGN NINDA2CUNEIFORM SIGN N" + - "INDA2 TIMES ANCUNEIFORM SIGN NINDA2 TIMES ASHCUNEIFORM SIGN NINDA2 TIMES" + - " ASH PLUS ASHCUNEIFORM SIGN NINDA2 TIMES GUDCUNEIFORM SIGN NINDA2 TIMES " + - "ME PLUS GAN2 TENUCUNEIFORM SIGN NINDA2 TIMES NECUNEIFORM SIGN NINDA2 TIM" + - "ES NUNCUNEIFORM SIGN NINDA2 TIMES SHECUNEIFORM SIGN NINDA2 TIMES SHE PLU" + - "S A ANCUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASHCUNEIFORM SIGN NINDA2 TIME" + - "S SHE PLUS ASH PLUS ASHCUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASHCUNEIFORM " + - "SIGN NINDA2 TIMES USHCUNEIFORM SIGN NISAGCUNEIFORM SIGN NUCUNEIFORM SIGN" + - " NU11CUNEIFORM SIGN NUNCUNEIFORM SIGN NUN LAGAR TIMES GARCUNEIFORM SIGN " + - "NUN LAGAR TIMES MASHCUNEIFORM SIGN NUN LAGAR TIMES SALCUNEIFORM SIGN NUN" + - " LAGAR TIMES SAL OVER NUN LAGAR TIMES SALCUNEIFORM SIGN NUN LAGAR TIMES " + - "USHCUNEIFORM SIGN NUN TENUCUNEIFORM SIGN NUN OVER NUNCUNEIFORM SIGN NUN " + - "CROSSING NUNCUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGARCUNEIFORM SI" + - "GN NUNUZCUNEIFORM SIGN NUNUZ AB2 TIMES ASHGABCUNEIFORM SIGN NUNUZ AB2 TI" + - "MES BICUNEIFORM SIGN NUNUZ AB2 TIMES DUGCUNEIFORM SIGN NUNUZ AB2 TIMES G" + - "UDCUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNUCUNEIFORM SIGN NUNUZ AB2 TIMES " + - "KAD3CUNEIFORM SIGN NUNUZ AB2 TIMES LACUNEIFORM SIGN NUNUZ AB2 TIMES NECU" + - "NEIFORM SIGN NUNUZ AB2 TIMES SILA3CUNEIFORM SIGN NUNUZ AB2 TIMES U2CUNEI" + - "FORM SIGN NUNUZ KISIM5 TIMES BICUNEIFORM SIGN NUNUZ KISIM5 TIMES BI UCUN" + - "EIFORM SIGN PACUNEIFORM SIGN PADCUNEIFORM SIGN PANCUNEIFORM SIGN PAPCUNE" + - "IFORM SIGN PESH2CUNEIFORM SIGN PICUNEIFORM SIGN PI TIMES ACUNEIFORM SIGN" + - " PI TIMES ABCUNEIFORM SIGN PI TIMES BICUNEIFORM SIGN PI TIMES BUCUNEIFOR" + - "M SIGN PI TIMES ECUNEIFORM SIGN PI TIMES ICUNEIFORM SIGN PI TIMES IBCUNE" + - "IFORM SIGN PI TIMES UCUNEIFORM SIGN PI TIMES U2CUNEIFORM SIGN PI CROSSIN" + - "G PICUNEIFORM SIGN PIRIGCUNEIFORM SIGN PIRIG TIMES KALCUNEIFORM SIGN PIR" + - "IG TIMES UDCUNEIFORM SIGN PIRIG TIMES ZACUNEIFORM SIGN PIRIG OPPOSING PI" + - "RIGCUNEIFORM SIGN RACUNEIFORM SIGN RABCUNEIFORM SIGN RICUNEIFORM SIGN RU" + - "CUNEIFORM SIGN SACUNEIFORM SIGN SAG NUTILLUCUNEIFORM SIGN SAGCUNEIFORM S" + - "IGN SAG TIMES ACUNEIFORM SIGN SAG TIMES DUCUNEIFORM SIGN SAG TIMES DUBCU" + - "NEIFORM SIGN SAG TIMES HACUNEIFORM SIGN SAG TIMES KAKCUNEIFORM SIGN SAG " + - "TIMES KURCUNEIFORM SIGN SAG TIMES LUMCUNEIFORM SIGN SAG TIMES MICUNEIFOR" + - "M SIGN SAG TIMES NUNCUNEIFORM SIGN SAG TIMES SALCUNEIFORM SIGN SAG TIMES" + - " SHIDCUNEIFORM SIGN SAG TIMES TABCUNEIFORM SIGN SAG TIMES U2CUNEIFORM SI" + - "GN SAG TIMES UBCUNEIFORM SIGN SAG TIMES UMCUNEIFORM SIGN SAG TIMES URCUN" + - "EIFORM SIGN SAG TIMES USHCUNEIFORM SIGN SAG OVER SAGCUNEIFORM SIGN SAG G" + - "UNUCUNEIFORM SIGN SALCUNEIFORM SIGN SAL LAGAB TIMES ASH2CUNEIFORM SIGN S" + - "ANGA2CUNEIFORM SIGN SARCUNEIFORM SIGN SHACUNEIFORM SIGN SHA3CUNEIFORM SI" + - "GN SHA3 TIMES ACUNEIFORM SIGN SHA3 TIMES BADCUNEIFORM SIGN SHA3 TIMES GI" + - "SHCUNEIFORM SIGN SHA3 TIMES NECUNEIFORM SIGN SHA3 TIMES SHU2CUNEIFORM SI" + - "GN SHA3 TIMES TURCUNEIFORM SIGN SHA3 TIMES UCUNEIFORM SIGN SHA3 TIMES U " + - "PLUS ACUNEIFORM SIGN SHA6CUNEIFORM SIGN SHAB6CUNEIFORM SIGN SHAR2CUNEIFO" + - "RM SIGN SHECUNEIFORM SIGN SHE HUCUNEIFORM SIGN SHE OVER SHE GAD OVER GAD" + - " GAR OVER GARCUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GARCUNEIF" + - "ORM SIGN SHEG9CUNEIFORM SIGN SHENCUNEIFORM SIGN SHESHCUNEIFORM SIGN SHES") + ("" + - "H2CUNEIFORM SIGN SHESHLAMCUNEIFORM SIGN SHIDCUNEIFORM SIGN SHID TIMES AC" + - "UNEIFORM SIGN SHID TIMES IMCUNEIFORM SIGN SHIMCUNEIFORM SIGN SHIM TIMES " + - "ACUNEIFORM SIGN SHIM TIMES BALCUNEIFORM SIGN SHIM TIMES BULUGCUNEIFORM S" + - "IGN SHIM TIMES DINCUNEIFORM SIGN SHIM TIMES GARCUNEIFORM SIGN SHIM TIMES" + - " IGICUNEIFORM SIGN SHIM TIMES IGI GUNUCUNEIFORM SIGN SHIM TIMES KUSHU2CU" + - "NEIFORM SIGN SHIM TIMES LULCUNEIFORM SIGN SHIM TIMES MUGCUNEIFORM SIGN S" + - "HIM TIMES SALCUNEIFORM SIGN SHINIGCUNEIFORM SIGN SHIRCUNEIFORM SIGN SHIR" + - " TENUCUNEIFORM SIGN SHIR OVER SHIR BUR OVER BURCUNEIFORM SIGN SHITACUNEI" + - "FORM SIGN SHUCUNEIFORM SIGN SHU OVER INVERTED SHUCUNEIFORM SIGN SHU2CUNE" + - "IFORM SIGN SHUBURCUNEIFORM SIGN SICUNEIFORM SIGN SI GUNUCUNEIFORM SIGN S" + - "IGCUNEIFORM SIGN SIG4CUNEIFORM SIGN SIG4 OVER SIG4 SHU2CUNEIFORM SIGN SI" + - "K2CUNEIFORM SIGN SILA3CUNEIFORM SIGN SUCUNEIFORM SIGN SU OVER SUCUNEIFOR" + - "M SIGN SUDCUNEIFORM SIGN SUD2CUNEIFORM SIGN SUHURCUNEIFORM SIGN SUMCUNEI" + - "FORM SIGN SUMASHCUNEIFORM SIGN SURCUNEIFORM SIGN SUR9CUNEIFORM SIGN TACU" + - "NEIFORM SIGN TA ASTERISKCUNEIFORM SIGN TA TIMES HICUNEIFORM SIGN TA TIME" + - "S MICUNEIFORM SIGN TA GUNUCUNEIFORM SIGN TABCUNEIFORM SIGN TAB OVER TAB " + - "NI OVER NI DISH OVER DISHCUNEIFORM SIGN TAB SQUAREDCUNEIFORM SIGN TAGCUN" + - "EIFORM SIGN TAG TIMES BICUNEIFORM SIGN TAG TIMES GUDCUNEIFORM SIGN TAG T" + - "IMES SHECUNEIFORM SIGN TAG TIMES SHUCUNEIFORM SIGN TAG TIMES TUG2CUNEIFO" + - "RM SIGN TAG TIMES UDCUNEIFORM SIGN TAK4CUNEIFORM SIGN TARCUNEIFORM SIGN " + - "TECUNEIFORM SIGN TE GUNUCUNEIFORM SIGN TICUNEIFORM SIGN TI TENUCUNEIFORM" + - " SIGN TILCUNEIFORM SIGN TIRCUNEIFORM SIGN TIR TIMES TAK4CUNEIFORM SIGN T" + - "IR OVER TIRCUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GARCUNEIFOR" + - "M SIGN TUCUNEIFORM SIGN TUG2CUNEIFORM SIGN TUKCUNEIFORM SIGN TUMCUNEIFOR" + - "M SIGN TURCUNEIFORM SIGN TUR OVER TUR ZA OVER ZACUNEIFORM SIGN UCUNEIFOR" + - "M SIGN U GUDCUNEIFORM SIGN U U UCUNEIFORM SIGN U OVER U PA OVER PA GAR O" + - "VER GARCUNEIFORM SIGN U OVER U SUR OVER SURCUNEIFORM SIGN U OVER U U REV" + - "ERSED OVER U REVERSEDCUNEIFORM SIGN U2CUNEIFORM SIGN UBCUNEIFORM SIGN UD" + - "CUNEIFORM SIGN UD KUSHU2CUNEIFORM SIGN UD TIMES BADCUNEIFORM SIGN UD TIM" + - "ES MICUNEIFORM SIGN UD TIMES U PLUS U PLUS UCUNEIFORM SIGN UD TIMES U PL" + - "US U PLUS U GUNUCUNEIFORM SIGN UD GUNUCUNEIFORM SIGN UD SHESHIGCUNEIFORM" + - " SIGN UD SHESHIG TIMES BADCUNEIFORM SIGN UDUGCUNEIFORM SIGN UMCUNEIFORM " + - "SIGN UM TIMES LAGABCUNEIFORM SIGN UM TIMES ME PLUS DACUNEIFORM SIGN UM T" + - "IMES SHA3CUNEIFORM SIGN UM TIMES UCUNEIFORM SIGN UMBINCUNEIFORM SIGN UMU" + - "MCUNEIFORM SIGN UMUM TIMES KASKALCUNEIFORM SIGN UMUM TIMES PACUNEIFORM S" + - "IGN UNCUNEIFORM SIGN UN GUNUCUNEIFORM SIGN URCUNEIFORM SIGN UR CROSSING " + - "URCUNEIFORM SIGN UR SHESHIGCUNEIFORM SIGN UR2CUNEIFORM SIGN UR2 TIMES A " + - "PLUS HACUNEIFORM SIGN UR2 TIMES A PLUS NACUNEIFORM SIGN UR2 TIMES ALCUNE" + - "IFORM SIGN UR2 TIMES HACUNEIFORM SIGN UR2 TIMES NUNCUNEIFORM SIGN UR2 TI" + - "MES U2CUNEIFORM SIGN UR2 TIMES U2 PLUS ASHCUNEIFORM SIGN UR2 TIMES U2 PL" + - "US BICUNEIFORM SIGN UR4CUNEIFORM SIGN URICUNEIFORM SIGN URI3CUNEIFORM SI" + - "GN URUCUNEIFORM SIGN URU TIMES ACUNEIFORM SIGN URU TIMES ASHGABCUNEIFORM" + - " SIGN URU TIMES BARCUNEIFORM SIGN URU TIMES DUNCUNEIFORM SIGN URU TIMES " + - "GACUNEIFORM SIGN URU TIMES GALCUNEIFORM SIGN URU TIMES GAN2 TENUCUNEIFOR" + - "M SIGN URU TIMES GARCUNEIFORM SIGN URU TIMES GUCUNEIFORM SIGN URU TIMES " + - "HACUNEIFORM SIGN URU TIMES IGICUNEIFORM SIGN URU TIMES IMCUNEIFORM SIGN " + - "URU TIMES ISHCUNEIFORM SIGN URU TIMES KICUNEIFORM SIGN URU TIMES LUMCUNE" + - "IFORM SIGN URU TIMES MINCUNEIFORM SIGN URU TIMES PACUNEIFORM SIGN URU TI" + - "MES SHECUNEIFORM SIGN URU TIMES SIG4CUNEIFORM SIGN URU TIMES TUCUNEIFORM" + - " SIGN URU TIMES U PLUS GUDCUNEIFORM SIGN URU TIMES UDCUNEIFORM SIGN URU " + - "TIMES URUDACUNEIFORM SIGN URUDACUNEIFORM SIGN URUDA TIMES UCUNEIFORM SIG" + - "N USHCUNEIFORM SIGN USH TIMES ACUNEIFORM SIGN USH TIMES KUCUNEIFORM SIGN" + - " USH TIMES KURCUNEIFORM SIGN USH TIMES TAK4CUNEIFORM SIGN USHXCUNEIFORM " + - "SIGN USH2CUNEIFORM SIGN USHUMXCUNEIFORM SIGN UTUKICUNEIFORM SIGN UZ3CUNE" + - "IFORM SIGN UZ3 TIMES KASKALCUNEIFORM SIGN UZUCUNEIFORM SIGN ZACUNEIFORM " + - "SIGN ZA TENUCUNEIFORM SIGN ZA SQUARED TIMES KURCUNEIFORM SIGN ZAGCUNEIFO" + - "RM SIGN ZAMXCUNEIFORM SIGN ZE2CUNEIFORM SIGN ZICUNEIFORM SIGN ZI OVER ZI" + - "CUNEIFORM SIGN ZI3CUNEIFORM SIGN ZIBCUNEIFORM SIGN ZIB KABA TENUCUNEIFOR" + - "M SIGN ZIGCUNEIFORM SIGN ZIZ2CUNEIFORM SIGN ZUCUNEIFORM SIGN ZU5CUNEIFOR" + - "M SIGN ZU5 TIMES ACUNEIFORM SIGN ZUBURCUNEIFORM SIGN ZUMCUNEIFORM SIGN K" + - "AP ELAMITECUNEIFORM SIGN AB TIMES NUNCUNEIFORM SIGN AB2 TIMES ACUNEIFORM" + - " SIGN AMAR TIMES KUGCUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASHCUNEIFOR" + - "M SIGN DAG3CUNEIFORM SIGN DISH PLUS SHUCUNEIFORM SIGN DUB TIMES SHECUNEI" + - "FORM SIGN EZEN TIMES GUDCUNEIFORM SIGN EZEN TIMES SHECUNEIFORM SIGN GA2 ") + ("" + - "TIMES AN PLUS KAK PLUS ACUNEIFORM SIGN GA2 TIMES ASH2CUNEIFORM SIGN GE22" + - "CUNEIFORM SIGN GIGCUNEIFORM SIGN HUSHCUNEIFORM SIGN KA TIMES ANSHECUNEIF" + - "ORM SIGN KA TIMES ASH3CUNEIFORM SIGN KA TIMES GISHCUNEIFORM SIGN KA TIME" + - "S GUDCUNEIFORM SIGN KA TIMES HI TIMES ASH2CUNEIFORM SIGN KA TIMES LUMCUN" + - "EIFORM SIGN KA TIMES PACUNEIFORM SIGN KA TIMES SHULCUNEIFORM SIGN KA TIM" + - "ES TUCUNEIFORM SIGN KA TIMES UR2CUNEIFORM SIGN LAGAB TIMES GICUNEIFORM S" + - "IGN LU2 SHESHIG TIMES BADCUNEIFORM SIGN LU2 TIMES ESH2 PLUS LALCUNEIFORM" + - " SIGN LU2 TIMES SHUCUNEIFORM SIGN MESHCUNEIFORM SIGN MUSH3 TIMES ZACUNEI" + - "FORM SIGN NA4CUNEIFORM SIGN NINCUNEIFORM SIGN NIN9CUNEIFORM SIGN NINDA2 " + - "TIMES BALCUNEIFORM SIGN NINDA2 TIMES GICUNEIFORM SIGN NU11 ROTATED NINET" + - "Y DEGREESCUNEIFORM SIGN PESH2 ASTERISKCUNEIFORM SIGN PIR2CUNEIFORM SIGN " + - "SAG TIMES IGI GUNUCUNEIFORM SIGN TI2CUNEIFORM SIGN UM TIMES MECUNEIFORM " + - "SIGN U UCUNEIFORM NUMERIC SIGN TWO ASHCUNEIFORM NUMERIC SIGN THREE ASHCU" + - "NEIFORM NUMERIC SIGN FOUR ASHCUNEIFORM NUMERIC SIGN FIVE ASHCUNEIFORM NU" + - "MERIC SIGN SIX ASHCUNEIFORM NUMERIC SIGN SEVEN ASHCUNEIFORM NUMERIC SIGN" + - " EIGHT ASHCUNEIFORM NUMERIC SIGN NINE ASHCUNEIFORM NUMERIC SIGN THREE DI" + - "SHCUNEIFORM NUMERIC SIGN FOUR DISHCUNEIFORM NUMERIC SIGN FIVE DISHCUNEIF" + - "ORM NUMERIC SIGN SIX DISHCUNEIFORM NUMERIC SIGN SEVEN DISHCUNEIFORM NUME" + - "RIC SIGN EIGHT DISHCUNEIFORM NUMERIC SIGN NINE DISHCUNEIFORM NUMERIC SIG" + - "N FOUR UCUNEIFORM NUMERIC SIGN FIVE UCUNEIFORM NUMERIC SIGN SIX UCUNEIFO" + - "RM NUMERIC SIGN SEVEN UCUNEIFORM NUMERIC SIGN EIGHT UCUNEIFORM NUMERIC S" + - "IGN NINE UCUNEIFORM NUMERIC SIGN ONE GESH2CUNEIFORM NUMERIC SIGN TWO GES" + - "H2CUNEIFORM NUMERIC SIGN THREE GESH2CUNEIFORM NUMERIC SIGN FOUR GESH2CUN" + - "EIFORM NUMERIC SIGN FIVE GESH2CUNEIFORM NUMERIC SIGN SIX GESH2CUNEIFORM " + - "NUMERIC SIGN SEVEN GESH2CUNEIFORM NUMERIC SIGN EIGHT GESH2CUNEIFORM NUME" + - "RIC SIGN NINE GESH2CUNEIFORM NUMERIC SIGN ONE GESHUCUNEIFORM NUMERIC SIG" + - "N TWO GESHUCUNEIFORM NUMERIC SIGN THREE GESHUCUNEIFORM NUMERIC SIGN FOUR" + - " GESHUCUNEIFORM NUMERIC SIGN FIVE GESHUCUNEIFORM NUMERIC SIGN TWO SHAR2C" + - "UNEIFORM NUMERIC SIGN THREE SHAR2CUNEIFORM NUMERIC SIGN THREE SHAR2 VARI" + - "ANT FORMCUNEIFORM NUMERIC SIGN FOUR SHAR2CUNEIFORM NUMERIC SIGN FIVE SHA" + - "R2CUNEIFORM NUMERIC SIGN SIX SHAR2CUNEIFORM NUMERIC SIGN SEVEN SHAR2CUNE" + - "IFORM NUMERIC SIGN EIGHT SHAR2CUNEIFORM NUMERIC SIGN NINE SHAR2CUNEIFORM" + - " NUMERIC SIGN ONE SHARUCUNEIFORM NUMERIC SIGN TWO SHARUCUNEIFORM NUMERIC" + - " SIGN THREE SHARUCUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORMCUNEIFOR" + - "M NUMERIC SIGN FOUR SHARUCUNEIFORM NUMERIC SIGN FIVE SHARUCUNEIFORM NUME" + - "RIC SIGN SHAR2 TIMES GAL PLUS DISHCUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL" + - " PLUS MINCUNEIFORM NUMERIC SIGN ONE BURUCUNEIFORM NUMERIC SIGN TWO BURUC" + - "UNEIFORM NUMERIC SIGN THREE BURUCUNEIFORM NUMERIC SIGN THREE BURU VARIAN" + - "T FORMCUNEIFORM NUMERIC SIGN FOUR BURUCUNEIFORM NUMERIC SIGN FIVE BURUCU" + - "NEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16CUNEIFORM NUMERIC SIGN THRE" + - "E VARIANT FORM ESH21CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMUCUNEIF" + - "ORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4CUNEIFORM NUMERIC SIGN FOUR VAR" + - "IANT FORM LIMMU ACUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU BCUNEIFO" + - "RM NUMERIC SIGN SIX VARIANT FORM ASH9CUNEIFORM NUMERIC SIGN SEVEN VARIAN" + - "T FORM IMIN3CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN ACUNEIFORM NU" + - "MERIC SIGN SEVEN VARIANT FORM IMIN BCUNEIFORM NUMERIC SIGN EIGHT VARIANT" + - " FORM USSUCUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3CUNEIFORM NUMER" + - "IC SIGN NINE VARIANT FORM ILIMMUCUNEIFORM NUMERIC SIGN NINE VARIANT FORM" + - " ILIMMU3CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4CUNEIFORM NUMERI" + - "C SIGN NINE VARIANT FORM ILIMMU ACUNEIFORM NUMERIC SIGN TWO ASH TENUCUNE" + - "IFORM NUMERIC SIGN THREE ASH TENUCUNEIFORM NUMERIC SIGN FOUR ASH TENUCUN" + - "EIFORM NUMERIC SIGN FIVE ASH TENUCUNEIFORM NUMERIC SIGN SIX ASH TENUCUNE" + - "IFORM NUMERIC SIGN ONE BAN2CUNEIFORM NUMERIC SIGN TWO BAN2CUNEIFORM NUME" + - "RIC SIGN THREE BAN2CUNEIFORM NUMERIC SIGN FOUR BAN2CUNEIFORM NUMERIC SIG" + - "N FOUR BAN2 VARIANT FORMCUNEIFORM NUMERIC SIGN FIVE BAN2CUNEIFORM NUMERI" + - "C SIGN FIVE BAN2 VARIANT FORMCUNEIFORM NUMERIC SIGN NIGIDAMINCUNEIFORM N" + - "UMERIC SIGN NIGIDAESHCUNEIFORM NUMERIC SIGN ONE ESHE3CUNEIFORM NUMERIC S" + - "IGN TWO ESHE3CUNEIFORM NUMERIC SIGN ONE THIRD DISHCUNEIFORM NUMERIC SIGN" + - " TWO THIRDS DISHCUNEIFORM NUMERIC SIGN FIVE SIXTHS DISHCUNEIFORM NUMERIC" + - " SIGN ONE THIRD VARIANT FORM ACUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT " + - "FORM ACUNEIFORM NUMERIC SIGN ONE EIGHTH ASHCUNEIFORM NUMERIC SIGN ONE QU" + - "ARTER ASHCUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTHCUNEIFORM NUMERIC " + - "SIGN OLD ASSYRIAN ONE QUARTERCUNEIFORM NUMERIC SIGN ONE QUARTER GURCUNEI" + - "FORM NUMERIC SIGN ONE HALF GURCUNEIFORM NUMERIC SIGN ELAMITE ONE THIRDCU") + ("" + - "NEIFORM NUMERIC SIGN ELAMITE TWO THIRDSCUNEIFORM NUMERIC SIGN ELAMITE FO" + - "RTYCUNEIFORM NUMERIC SIGN ELAMITE FIFTYCUNEIFORM NUMERIC SIGN FOUR U VAR" + - "IANT FORMCUNEIFORM NUMERIC SIGN FIVE U VARIANT FORMCUNEIFORM NUMERIC SIG" + - "N SIX U VARIANT FORMCUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORMCUNEIFORM" + - " NUMERIC SIGN EIGHT U VARIANT FORMCUNEIFORM NUMERIC SIGN NINE U VARIANT " + - "FORMCUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDERCUNEIFORM PUNCTU" + - "ATION SIGN VERTICAL COLONCUNEIFORM PUNCTUATION SIGN DIAGONAL COLONCUNEIF" + - "ORM PUNCTUATION SIGN DIAGONAL TRICOLONCUNEIFORM PUNCTUATION SIGN DIAGONA" + - "L QUADCOLONCUNEIFORM SIGN AB TIMES NUN TENUCUNEIFORM SIGN AB TIMES SHU2C" + - "UNEIFORM SIGN AD TIMES ESH2CUNEIFORM SIGN BAD TIMES DISH TENUCUNEIFORM S" + - "IGN BAHAR2 TIMES AB2CUNEIFORM SIGN BAHAR2 TIMES NICUNEIFORM SIGN BAHAR2 " + - "TIMES ZACUNEIFORM SIGN BU OVER BU TIMES NA2CUNEIFORM SIGN DA TIMES TAK4C" + - "UNEIFORM SIGN DAG TIMES KURCUNEIFORM SIGN DIM TIMES IGICUNEIFORM SIGN DI" + - "M TIMES U U UCUNEIFORM SIGN DIM2 TIMES UDCUNEIFORM SIGN DUG TIMES ANSHEC" + - "UNEIFORM SIGN DUG TIMES ASHCUNEIFORM SIGN DUG TIMES ASH AT LEFTCUNEIFORM" + - " SIGN DUG TIMES DINCUNEIFORM SIGN DUG TIMES DUNCUNEIFORM SIGN DUG TIMES " + - "ERIN2CUNEIFORM SIGN DUG TIMES GACUNEIFORM SIGN DUG TIMES GICUNEIFORM SIG" + - "N DUG TIMES GIR2 GUNUCUNEIFORM SIGN DUG TIMES GISHCUNEIFORM SIGN DUG TIM" + - "ES HACUNEIFORM SIGN DUG TIMES HICUNEIFORM SIGN DUG TIMES IGI GUNUCUNEIFO" + - "RM SIGN DUG TIMES KASKALCUNEIFORM SIGN DUG TIMES KURCUNEIFORM SIGN DUG T" + - "IMES KUSHU2CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKALCUNEIFORM SIGN DUG" + - " TIMES LAK-020CUNEIFORM SIGN DUG TIMES LAMCUNEIFORM SIGN DUG TIMES LAM T" + - "IMES KURCUNEIFORM SIGN DUG TIMES LUH PLUS GISHCUNEIFORM SIGN DUG TIMES M" + - "ASHCUNEIFORM SIGN DUG TIMES MESCUNEIFORM SIGN DUG TIMES MICUNEIFORM SIGN" + - " DUG TIMES NICUNEIFORM SIGN DUG TIMES PICUNEIFORM SIGN DUG TIMES SHECUNE" + - "IFORM SIGN DUG TIMES SI GUNUCUNEIFORM SIGN E2 TIMES KURCUNEIFORM SIGN E2" + - " TIMES PAPCUNEIFORM SIGN ERIN2 XCUNEIFORM SIGN ESH2 CROSSING ESH2CUNEIFO" + - "RM SIGN EZEN SHESHIG TIMES ASHCUNEIFORM SIGN EZEN SHESHIG TIMES HICUNEIF" + - "ORM SIGN EZEN SHESHIG TIMES IGI GUNUCUNEIFORM SIGN EZEN SHESHIG TIMES LA" + - "CUNEIFORM SIGN EZEN SHESHIG TIMES LALCUNEIFORM SIGN EZEN SHESHIG TIMES M" + - "ECUNEIFORM SIGN EZEN SHESHIG TIMES MESCUNEIFORM SIGN EZEN SHESHIG TIMES " + - "SUCUNEIFORM SIGN EZEN TIMES SUCUNEIFORM SIGN GA2 TIMES BAHAR2CUNEIFORM S" + - "IGN GA2 TIMES DIM GUNUCUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNUCUNEIFO" + - "RM SIGN GA2 TIMES DUG TIMES KASKALCUNEIFORM SIGN GA2 TIMES ERENCUNEIFORM" + - " SIGN GA2 TIMES GACUNEIFORM SIGN GA2 TIMES GAR PLUS DICUNEIFORM SIGN GA2" + - " TIMES GAR PLUS NECUNEIFORM SIGN GA2 TIMES HA PLUS ACUNEIFORM SIGN GA2 T" + - "IMES KUSHU2 PLUS KASKALCUNEIFORM SIGN GA2 TIMES LAMCUNEIFORM SIGN GA2 TI" + - "MES LAM TIMES KURCUNEIFORM SIGN GA2 TIMES LUHCUNEIFORM SIGN GA2 TIMES MU" + - "SHCUNEIFORM SIGN GA2 TIMES NECUNEIFORM SIGN GA2 TIMES NE PLUS E2CUNEIFOR" + - "M SIGN GA2 TIMES NE PLUS GICUNEIFORM SIGN GA2 TIMES SHIMCUNEIFORM SIGN G" + - "A2 TIMES ZIZ2CUNEIFORM SIGN GABA ROTATED NINETY DEGREESCUNEIFORM SIGN GE" + - "SHTIN TIMES UCUNEIFORM SIGN GISH TIMES GISH CROSSING GISHCUNEIFORM SIGN " + - "GU2 TIMES IGI GUNUCUNEIFORM SIGN GUD PLUS GISH TIMES TAK4CUNEIFORM SIGN " + - "HA TENU GUNUCUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASHCUNEIFORM SIGN " + - "KA TIMES BUCUNEIFORM SIGN KA TIMES KACUNEIFORM SIGN KA TIMES U U UCUNEIF" + - "ORM SIGN KA TIMES URCUNEIFORM SIGN LAGAB TIMES ZU OVER ZUCUNEIFORM SIGN " + - "LAK-003CUNEIFORM SIGN LAK-021CUNEIFORM SIGN LAK-025CUNEIFORM SIGN LAK-03" + - "0CUNEIFORM SIGN LAK-050CUNEIFORM SIGN LAK-051CUNEIFORM SIGN LAK-062CUNEI" + - "FORM SIGN LAK-079 OVER LAK-079 GUNUCUNEIFORM SIGN LAK-080CUNEIFORM SIGN " + - "LAK-081 OVER LAK-081CUNEIFORM SIGN LAK-092CUNEIFORM SIGN LAK-130CUNEIFOR" + - "M SIGN LAK-142CUNEIFORM SIGN LAK-210CUNEIFORM SIGN LAK-219CUNEIFORM SIGN" + - " LAK-220CUNEIFORM SIGN LAK-225CUNEIFORM SIGN LAK-228CUNEIFORM SIGN LAK-2" + - "38CUNEIFORM SIGN LAK-265CUNEIFORM SIGN LAK-266CUNEIFORM SIGN LAK-343CUNE" + - "IFORM SIGN LAK-347CUNEIFORM SIGN LAK-348CUNEIFORM SIGN LAK-383CUNEIFORM " + - "SIGN LAK-384CUNEIFORM SIGN LAK-390CUNEIFORM SIGN LAK-441CUNEIFORM SIGN L" + - "AK-449CUNEIFORM SIGN LAK-449 TIMES GUCUNEIFORM SIGN LAK-449 TIMES IGICUN" + - "EIFORM SIGN LAK-449 TIMES PAP PLUS LU3CUNEIFORM SIGN LAK-449 TIMES PAP P" + - "LUS PAP PLUS LU3CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BACUNEIFORM SIGN LA" + - "K-450CUNEIFORM SIGN LAK-457CUNEIFORM SIGN LAK-470CUNEIFORM SIGN LAK-483C" + - "UNEIFORM SIGN LAK-490CUNEIFORM SIGN LAK-492CUNEIFORM SIGN LAK-493CUNEIFO" + - "RM SIGN LAK-495CUNEIFORM SIGN LAK-550CUNEIFORM SIGN LAK-608CUNEIFORM SIG" + - "N LAK-617CUNEIFORM SIGN LAK-617 TIMES ASHCUNEIFORM SIGN LAK-617 TIMES BA" + - "DCUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNUCUNEIFORM SIGN LAK-617 TIMES" + - " KU3CUNEIFORM SIGN LAK-617 TIMES LACUNEIFORM SIGN LAK-617 TIMES TARCUNEI") + ("" + - "FORM SIGN LAK-617 TIMES TECUNEIFORM SIGN LAK-617 TIMES U2CUNEIFORM SIGN " + - "LAK-617 TIMES UDCUNEIFORM SIGN LAK-617 TIMES URUDACUNEIFORM SIGN LAK-636" + - "CUNEIFORM SIGN LAK-648CUNEIFORM SIGN LAK-648 TIMES DUBCUNEIFORM SIGN LAK" + - "-648 TIMES GACUNEIFORM SIGN LAK-648 TIMES IGICUNEIFORM SIGN LAK-648 TIME" + - "S IGI GUNUCUNEIFORM SIGN LAK-648 TIMES NICUNEIFORM SIGN LAK-648 TIMES PA" + - "P PLUS PAP PLUS LU3CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KICUNEIFORM S" + - "IGN LAK-648 TIMES UDCUNEIFORM SIGN LAK-648 TIMES URUDACUNEIFORM SIGN LAK" + - "-724CUNEIFORM SIGN LAK-749CUNEIFORM SIGN LU2 GUNU TIMES ASHCUNEIFORM SIG" + - "N LU2 TIMES DISHCUNEIFORM SIGN LU2 TIMES HALCUNEIFORM SIGN LU2 TIMES PAP" + - "CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3CUNEIFORM SIGN LU2 TIMES T" + - "AK4CUNEIFORM SIGN MI PLUS ZA7CUNEIFORM SIGN MUSH OVER MUSH TIMES GACUNEI" + - "FORM SIGN MUSH OVER MUSH TIMES KAKCUNEIFORM SIGN NINDA2 TIMES DIM GUNUCU" + - "NEIFORM SIGN NINDA2 TIMES GISHCUNEIFORM SIGN NINDA2 TIMES GULCUNEIFORM S" + - "IGN NINDA2 TIMES HICUNEIFORM SIGN NINDA2 TIMES KESH2CUNEIFORM SIGN NINDA" + - "2 TIMES LAK-050CUNEIFORM SIGN NINDA2 TIMES MASHCUNEIFORM SIGN NINDA2 TIM" + - "ES PAP PLUS PAPCUNEIFORM SIGN NINDA2 TIMES UCUNEIFORM SIGN NINDA2 TIMES " + - "U PLUS UCUNEIFORM SIGN NINDA2 TIMES URUDACUNEIFORM SIGN SAG GUNU TIMES H" + - "ACUNEIFORM SIGN SAG TIMES ENCUNEIFORM SIGN SAG TIMES SHE AT LEFTCUNEIFOR" + - "M SIGN SAG TIMES TAK4CUNEIFORM SIGN SHA6 TENUCUNEIFORM SIGN SHE OVER SHE" + - "CUNEIFORM SIGN SHE PLUS HUB2CUNEIFORM SIGN SHE PLUS NAM2CUNEIFORM SIGN S" + - "HE PLUS SARCUNEIFORM SIGN SHU2 PLUS DUG TIMES NICUNEIFORM SIGN SHU2 PLUS" + - " E2 TIMES ANCUNEIFORM SIGN SI TIMES TAK4CUNEIFORM SIGN TAK4 PLUS SAGCUNE" + - "IFORM SIGN TUM TIMES GAN2 TENUCUNEIFORM SIGN TUM TIMES THREE DISHCUNEIFO" + - "RM SIGN UR2 INVERTEDCUNEIFORM SIGN UR2 TIMES UDCUNEIFORM SIGN URU TIMES " + - "DARA3CUNEIFORM SIGN URU TIMES LAK-668CUNEIFORM SIGN URU TIMES LU3CUNEIFO" + - "RM SIGN ZA7CUNEIFORM SIGN ZU OVER ZU PLUS SARCUNEIFORM SIGN ZU5 TIMES TH" + - "REE DISH TENUEGYPTIAN HIEROGLYPH A001EGYPTIAN HIEROGLYPH A002EGYPTIAN HI" + - "EROGLYPH A003EGYPTIAN HIEROGLYPH A004EGYPTIAN HIEROGLYPH A005EGYPTIAN HI" + - "EROGLYPH A005AEGYPTIAN HIEROGLYPH A006EGYPTIAN HIEROGLYPH A006AEGYPTIAN " + - "HIEROGLYPH A006BEGYPTIAN HIEROGLYPH A007EGYPTIAN HIEROGLYPH A008EGYPTIAN" + - " HIEROGLYPH A009EGYPTIAN HIEROGLYPH A010EGYPTIAN HIEROGLYPH A011EGYPTIAN" + - " HIEROGLYPH A012EGYPTIAN HIEROGLYPH A013EGYPTIAN HIEROGLYPH A014EGYPTIAN" + - " HIEROGLYPH A014AEGYPTIAN HIEROGLYPH A015EGYPTIAN HIEROGLYPH A016EGYPTIA" + - "N HIEROGLYPH A017EGYPTIAN HIEROGLYPH A017AEGYPTIAN HIEROGLYPH A018EGYPTI" + - "AN HIEROGLYPH A019EGYPTIAN HIEROGLYPH A020EGYPTIAN HIEROGLYPH A021EGYPTI" + - "AN HIEROGLYPH A022EGYPTIAN HIEROGLYPH A023EGYPTIAN HIEROGLYPH A024EGYPTI" + - "AN HIEROGLYPH A025EGYPTIAN HIEROGLYPH A026EGYPTIAN HIEROGLYPH A027EGYPTI" + - "AN HIEROGLYPH A028EGYPTIAN HIEROGLYPH A029EGYPTIAN HIEROGLYPH A030EGYPTI" + - "AN HIEROGLYPH A031EGYPTIAN HIEROGLYPH A032EGYPTIAN HIEROGLYPH A032AEGYPT" + - "IAN HIEROGLYPH A033EGYPTIAN HIEROGLYPH A034EGYPTIAN HIEROGLYPH A035EGYPT" + - "IAN HIEROGLYPH A036EGYPTIAN HIEROGLYPH A037EGYPTIAN HIEROGLYPH A038EGYPT" + - "IAN HIEROGLYPH A039EGYPTIAN HIEROGLYPH A040EGYPTIAN HIEROGLYPH A040AEGYP" + - "TIAN HIEROGLYPH A041EGYPTIAN HIEROGLYPH A042EGYPTIAN HIEROGLYPH A042AEGY" + - "PTIAN HIEROGLYPH A043EGYPTIAN HIEROGLYPH A043AEGYPTIAN HIEROGLYPH A044EG" + - "YPTIAN HIEROGLYPH A045EGYPTIAN HIEROGLYPH A045AEGYPTIAN HIEROGLYPH A046E" + - "GYPTIAN HIEROGLYPH A047EGYPTIAN HIEROGLYPH A048EGYPTIAN HIEROGLYPH A049E" + - "GYPTIAN HIEROGLYPH A050EGYPTIAN HIEROGLYPH A051EGYPTIAN HIEROGLYPH A052E" + - "GYPTIAN HIEROGLYPH A053EGYPTIAN HIEROGLYPH A054EGYPTIAN HIEROGLYPH A055E" + - "GYPTIAN HIEROGLYPH A056EGYPTIAN HIEROGLYPH A057EGYPTIAN HIEROGLYPH A058E" + - "GYPTIAN HIEROGLYPH A059EGYPTIAN HIEROGLYPH A060EGYPTIAN HIEROGLYPH A061E" + - "GYPTIAN HIEROGLYPH A062EGYPTIAN HIEROGLYPH A063EGYPTIAN HIEROGLYPH A064E" + - "GYPTIAN HIEROGLYPH A065EGYPTIAN HIEROGLYPH A066EGYPTIAN HIEROGLYPH A067E" + - "GYPTIAN HIEROGLYPH A068EGYPTIAN HIEROGLYPH A069EGYPTIAN HIEROGLYPH A070E" + - "GYPTIAN HIEROGLYPH B001EGYPTIAN HIEROGLYPH B002EGYPTIAN HIEROGLYPH B003E" + - "GYPTIAN HIEROGLYPH B004EGYPTIAN HIEROGLYPH B005EGYPTIAN HIEROGLYPH B005A" + - "EGYPTIAN HIEROGLYPH B006EGYPTIAN HIEROGLYPH B007EGYPTIAN HIEROGLYPH B008" + - "EGYPTIAN HIEROGLYPH B009EGYPTIAN HIEROGLYPH C001EGYPTIAN HIEROGLYPH C002" + - "EGYPTIAN HIEROGLYPH C002AEGYPTIAN HIEROGLYPH C002BEGYPTIAN HIEROGLYPH C0" + - "02CEGYPTIAN HIEROGLYPH C003EGYPTIAN HIEROGLYPH C004EGYPTIAN HIEROGLYPH C" + - "005EGYPTIAN HIEROGLYPH C006EGYPTIAN HIEROGLYPH C007EGYPTIAN HIEROGLYPH C" + - "008EGYPTIAN HIEROGLYPH C009EGYPTIAN HIEROGLYPH C010EGYPTIAN HIEROGLYPH C" + - "010AEGYPTIAN HIEROGLYPH C011EGYPTIAN HIEROGLYPH C012EGYPTIAN HIEROGLYPH " + - "C013EGYPTIAN HIEROGLYPH C014EGYPTIAN HIEROGLYPH C015EGYPTIAN HIEROGLYPH " + - "C016EGYPTIAN HIEROGLYPH C017EGYPTIAN HIEROGLYPH C018EGYPTIAN HIEROGLYPH ") + ("" + - "C019EGYPTIAN HIEROGLYPH C020EGYPTIAN HIEROGLYPH C021EGYPTIAN HIEROGLYPH " + - "C022EGYPTIAN HIEROGLYPH C023EGYPTIAN HIEROGLYPH C024EGYPTIAN HIEROGLYPH " + - "D001EGYPTIAN HIEROGLYPH D002EGYPTIAN HIEROGLYPH D003EGYPTIAN HIEROGLYPH " + - "D004EGYPTIAN HIEROGLYPH D005EGYPTIAN HIEROGLYPH D006EGYPTIAN HIEROGLYPH " + - "D007EGYPTIAN HIEROGLYPH D008EGYPTIAN HIEROGLYPH D008AEGYPTIAN HIEROGLYPH" + - " D009EGYPTIAN HIEROGLYPH D010EGYPTIAN HIEROGLYPH D011EGYPTIAN HIEROGLYPH" + - " D012EGYPTIAN HIEROGLYPH D013EGYPTIAN HIEROGLYPH D014EGYPTIAN HIEROGLYPH" + - " D015EGYPTIAN HIEROGLYPH D016EGYPTIAN HIEROGLYPH D017EGYPTIAN HIEROGLYPH" + - " D018EGYPTIAN HIEROGLYPH D019EGYPTIAN HIEROGLYPH D020EGYPTIAN HIEROGLYPH" + - " D021EGYPTIAN HIEROGLYPH D022EGYPTIAN HIEROGLYPH D023EGYPTIAN HIEROGLYPH" + - " D024EGYPTIAN HIEROGLYPH D025EGYPTIAN HIEROGLYPH D026EGYPTIAN HIEROGLYPH" + - " D027EGYPTIAN HIEROGLYPH D027AEGYPTIAN HIEROGLYPH D028EGYPTIAN HIEROGLYP" + - "H D029EGYPTIAN HIEROGLYPH D030EGYPTIAN HIEROGLYPH D031EGYPTIAN HIEROGLYP" + - "H D031AEGYPTIAN HIEROGLYPH D032EGYPTIAN HIEROGLYPH D033EGYPTIAN HIEROGLY" + - "PH D034EGYPTIAN HIEROGLYPH D034AEGYPTIAN HIEROGLYPH D035EGYPTIAN HIEROGL" + - "YPH D036EGYPTIAN HIEROGLYPH D037EGYPTIAN HIEROGLYPH D038EGYPTIAN HIEROGL" + - "YPH D039EGYPTIAN HIEROGLYPH D040EGYPTIAN HIEROGLYPH D041EGYPTIAN HIEROGL" + - "YPH D042EGYPTIAN HIEROGLYPH D043EGYPTIAN HIEROGLYPH D044EGYPTIAN HIEROGL" + - "YPH D045EGYPTIAN HIEROGLYPH D046EGYPTIAN HIEROGLYPH D046AEGYPTIAN HIEROG" + - "LYPH D047EGYPTIAN HIEROGLYPH D048EGYPTIAN HIEROGLYPH D048AEGYPTIAN HIERO" + - "GLYPH D049EGYPTIAN HIEROGLYPH D050EGYPTIAN HIEROGLYPH D050AEGYPTIAN HIER" + - "OGLYPH D050BEGYPTIAN HIEROGLYPH D050CEGYPTIAN HIEROGLYPH D050DEGYPTIAN H" + - "IEROGLYPH D050EEGYPTIAN HIEROGLYPH D050FEGYPTIAN HIEROGLYPH D050GEGYPTIA" + - "N HIEROGLYPH D050HEGYPTIAN HIEROGLYPH D050IEGYPTIAN HIEROGLYPH D051EGYPT" + - "IAN HIEROGLYPH D052EGYPTIAN HIEROGLYPH D052AEGYPTIAN HIEROGLYPH D053EGYP" + - "TIAN HIEROGLYPH D054EGYPTIAN HIEROGLYPH D054AEGYPTIAN HIEROGLYPH D055EGY" + - "PTIAN HIEROGLYPH D056EGYPTIAN HIEROGLYPH D057EGYPTIAN HIEROGLYPH D058EGY" + - "PTIAN HIEROGLYPH D059EGYPTIAN HIEROGLYPH D060EGYPTIAN HIEROGLYPH D061EGY" + - "PTIAN HIEROGLYPH D062EGYPTIAN HIEROGLYPH D063EGYPTIAN HIEROGLYPH D064EGY" + - "PTIAN HIEROGLYPH D065EGYPTIAN HIEROGLYPH D066EGYPTIAN HIEROGLYPH D067EGY" + - "PTIAN HIEROGLYPH D067AEGYPTIAN HIEROGLYPH D067BEGYPTIAN HIEROGLYPH D067C" + - "EGYPTIAN HIEROGLYPH D067DEGYPTIAN HIEROGLYPH D067EEGYPTIAN HIEROGLYPH D0" + - "67FEGYPTIAN HIEROGLYPH D067GEGYPTIAN HIEROGLYPH D067HEGYPTIAN HIEROGLYPH" + - " E001EGYPTIAN HIEROGLYPH E002EGYPTIAN HIEROGLYPH E003EGYPTIAN HIEROGLYPH" + - " E004EGYPTIAN HIEROGLYPH E005EGYPTIAN HIEROGLYPH E006EGYPTIAN HIEROGLYPH" + - " E007EGYPTIAN HIEROGLYPH E008EGYPTIAN HIEROGLYPH E008AEGYPTIAN HIEROGLYP" + - "H E009EGYPTIAN HIEROGLYPH E009AEGYPTIAN HIEROGLYPH E010EGYPTIAN HIEROGLY" + - "PH E011EGYPTIAN HIEROGLYPH E012EGYPTIAN HIEROGLYPH E013EGYPTIAN HIEROGLY" + - "PH E014EGYPTIAN HIEROGLYPH E015EGYPTIAN HIEROGLYPH E016EGYPTIAN HIEROGLY" + - "PH E016AEGYPTIAN HIEROGLYPH E017EGYPTIAN HIEROGLYPH E017AEGYPTIAN HIEROG" + - "LYPH E018EGYPTIAN HIEROGLYPH E019EGYPTIAN HIEROGLYPH E020EGYPTIAN HIEROG" + - "LYPH E020AEGYPTIAN HIEROGLYPH E021EGYPTIAN HIEROGLYPH E022EGYPTIAN HIERO" + - "GLYPH E023EGYPTIAN HIEROGLYPH E024EGYPTIAN HIEROGLYPH E025EGYPTIAN HIERO" + - "GLYPH E026EGYPTIAN HIEROGLYPH E027EGYPTIAN HIEROGLYPH E028EGYPTIAN HIERO" + - "GLYPH E028AEGYPTIAN HIEROGLYPH E029EGYPTIAN HIEROGLYPH E030EGYPTIAN HIER" + - "OGLYPH E031EGYPTIAN HIEROGLYPH E032EGYPTIAN HIEROGLYPH E033EGYPTIAN HIER" + - "OGLYPH E034EGYPTIAN HIEROGLYPH E034AEGYPTIAN HIEROGLYPH E036EGYPTIAN HIE" + - "ROGLYPH E037EGYPTIAN HIEROGLYPH E038EGYPTIAN HIEROGLYPH F001EGYPTIAN HIE" + - "ROGLYPH F001AEGYPTIAN HIEROGLYPH F002EGYPTIAN HIEROGLYPH F003EGYPTIAN HI" + - "EROGLYPH F004EGYPTIAN HIEROGLYPH F005EGYPTIAN HIEROGLYPH F006EGYPTIAN HI" + - "EROGLYPH F007EGYPTIAN HIEROGLYPH F008EGYPTIAN HIEROGLYPH F009EGYPTIAN HI" + - "EROGLYPH F010EGYPTIAN HIEROGLYPH F011EGYPTIAN HIEROGLYPH F012EGYPTIAN HI" + - "EROGLYPH F013EGYPTIAN HIEROGLYPH F013AEGYPTIAN HIEROGLYPH F014EGYPTIAN H" + - "IEROGLYPH F015EGYPTIAN HIEROGLYPH F016EGYPTIAN HIEROGLYPH F017EGYPTIAN H" + - "IEROGLYPH F018EGYPTIAN HIEROGLYPH F019EGYPTIAN HIEROGLYPH F020EGYPTIAN H" + - "IEROGLYPH F021EGYPTIAN HIEROGLYPH F021AEGYPTIAN HIEROGLYPH F022EGYPTIAN " + - "HIEROGLYPH F023EGYPTIAN HIEROGLYPH F024EGYPTIAN HIEROGLYPH F025EGYPTIAN " + - "HIEROGLYPH F026EGYPTIAN HIEROGLYPH F027EGYPTIAN HIEROGLYPH F028EGYPTIAN " + - "HIEROGLYPH F029EGYPTIAN HIEROGLYPH F030EGYPTIAN HIEROGLYPH F031EGYPTIAN " + - "HIEROGLYPH F031AEGYPTIAN HIEROGLYPH F032EGYPTIAN HIEROGLYPH F033EGYPTIAN" + - " HIEROGLYPH F034EGYPTIAN HIEROGLYPH F035EGYPTIAN HIEROGLYPH F036EGYPTIAN" + - " HIEROGLYPH F037EGYPTIAN HIEROGLYPH F037AEGYPTIAN HIEROGLYPH F038EGYPTIA" + - "N HIEROGLYPH F038AEGYPTIAN HIEROGLYPH F039EGYPTIAN HIEROGLYPH F040EGYPTI" + - "AN HIEROGLYPH F041EGYPTIAN HIEROGLYPH F042EGYPTIAN HIEROGLYPH F043EGYPTI") + ("" + - "AN HIEROGLYPH F044EGYPTIAN HIEROGLYPH F045EGYPTIAN HIEROGLYPH F045AEGYPT" + - "IAN HIEROGLYPH F046EGYPTIAN HIEROGLYPH F046AEGYPTIAN HIEROGLYPH F047EGYP" + - "TIAN HIEROGLYPH F047AEGYPTIAN HIEROGLYPH F048EGYPTIAN HIEROGLYPH F049EGY" + - "PTIAN HIEROGLYPH F050EGYPTIAN HIEROGLYPH F051EGYPTIAN HIEROGLYPH F051AEG" + - "YPTIAN HIEROGLYPH F051BEGYPTIAN HIEROGLYPH F051CEGYPTIAN HIEROGLYPH F052" + - "EGYPTIAN HIEROGLYPH F053EGYPTIAN HIEROGLYPH G001EGYPTIAN HIEROGLYPH G002" + - "EGYPTIAN HIEROGLYPH G003EGYPTIAN HIEROGLYPH G004EGYPTIAN HIEROGLYPH G005" + - "EGYPTIAN HIEROGLYPH G006EGYPTIAN HIEROGLYPH G006AEGYPTIAN HIEROGLYPH G00" + - "7EGYPTIAN HIEROGLYPH G007AEGYPTIAN HIEROGLYPH G007BEGYPTIAN HIEROGLYPH G" + - "008EGYPTIAN HIEROGLYPH G009EGYPTIAN HIEROGLYPH G010EGYPTIAN HIEROGLYPH G" + - "011EGYPTIAN HIEROGLYPH G011AEGYPTIAN HIEROGLYPH G012EGYPTIAN HIEROGLYPH " + - "G013EGYPTIAN HIEROGLYPH G014EGYPTIAN HIEROGLYPH G015EGYPTIAN HIEROGLYPH " + - "G016EGYPTIAN HIEROGLYPH G017EGYPTIAN HIEROGLYPH G018EGYPTIAN HIEROGLYPH " + - "G019EGYPTIAN HIEROGLYPH G020EGYPTIAN HIEROGLYPH G020AEGYPTIAN HIEROGLYPH" + - " G021EGYPTIAN HIEROGLYPH G022EGYPTIAN HIEROGLYPH G023EGYPTIAN HIEROGLYPH" + - " G024EGYPTIAN HIEROGLYPH G025EGYPTIAN HIEROGLYPH G026EGYPTIAN HIEROGLYPH" + - " G026AEGYPTIAN HIEROGLYPH G027EGYPTIAN HIEROGLYPH G028EGYPTIAN HIEROGLYP" + - "H G029EGYPTIAN HIEROGLYPH G030EGYPTIAN HIEROGLYPH G031EGYPTIAN HIEROGLYP" + - "H G032EGYPTIAN HIEROGLYPH G033EGYPTIAN HIEROGLYPH G034EGYPTIAN HIEROGLYP" + - "H G035EGYPTIAN HIEROGLYPH G036EGYPTIAN HIEROGLYPH G036AEGYPTIAN HIEROGLY" + - "PH G037EGYPTIAN HIEROGLYPH G037AEGYPTIAN HIEROGLYPH G038EGYPTIAN HIEROGL" + - "YPH G039EGYPTIAN HIEROGLYPH G040EGYPTIAN HIEROGLYPH G041EGYPTIAN HIEROGL" + - "YPH G042EGYPTIAN HIEROGLYPH G043EGYPTIAN HIEROGLYPH G043AEGYPTIAN HIEROG" + - "LYPH G044EGYPTIAN HIEROGLYPH G045EGYPTIAN HIEROGLYPH G045AEGYPTIAN HIERO" + - "GLYPH G046EGYPTIAN HIEROGLYPH G047EGYPTIAN HIEROGLYPH G048EGYPTIAN HIERO" + - "GLYPH G049EGYPTIAN HIEROGLYPH G050EGYPTIAN HIEROGLYPH G051EGYPTIAN HIERO" + - "GLYPH G052EGYPTIAN HIEROGLYPH G053EGYPTIAN HIEROGLYPH G054EGYPTIAN HIERO" + - "GLYPH H001EGYPTIAN HIEROGLYPH H002EGYPTIAN HIEROGLYPH H003EGYPTIAN HIERO" + - "GLYPH H004EGYPTIAN HIEROGLYPH H005EGYPTIAN HIEROGLYPH H006EGYPTIAN HIERO" + - "GLYPH H006AEGYPTIAN HIEROGLYPH H007EGYPTIAN HIEROGLYPH H008EGYPTIAN HIER" + - "OGLYPH I001EGYPTIAN HIEROGLYPH I002EGYPTIAN HIEROGLYPH I003EGYPTIAN HIER" + - "OGLYPH I004EGYPTIAN HIEROGLYPH I005EGYPTIAN HIEROGLYPH I005AEGYPTIAN HIE" + - "ROGLYPH I006EGYPTIAN HIEROGLYPH I007EGYPTIAN HIEROGLYPH I008EGYPTIAN HIE" + - "ROGLYPH I009EGYPTIAN HIEROGLYPH I009AEGYPTIAN HIEROGLYPH I010EGYPTIAN HI" + - "EROGLYPH I010AEGYPTIAN HIEROGLYPH I011EGYPTIAN HIEROGLYPH I011AEGYPTIAN " + - "HIEROGLYPH I012EGYPTIAN HIEROGLYPH I013EGYPTIAN HIEROGLYPH I014EGYPTIAN " + - "HIEROGLYPH I015EGYPTIAN HIEROGLYPH K001EGYPTIAN HIEROGLYPH K002EGYPTIAN " + - "HIEROGLYPH K003EGYPTIAN HIEROGLYPH K004EGYPTIAN HIEROGLYPH K005EGYPTIAN " + - "HIEROGLYPH K006EGYPTIAN HIEROGLYPH K007EGYPTIAN HIEROGLYPH K008EGYPTIAN " + - "HIEROGLYPH L001EGYPTIAN HIEROGLYPH L002EGYPTIAN HIEROGLYPH L002AEGYPTIAN" + - " HIEROGLYPH L003EGYPTIAN HIEROGLYPH L004EGYPTIAN HIEROGLYPH L005EGYPTIAN" + - " HIEROGLYPH L006EGYPTIAN HIEROGLYPH L006AEGYPTIAN HIEROGLYPH L007EGYPTIA" + - "N HIEROGLYPH L008EGYPTIAN HIEROGLYPH M001EGYPTIAN HIEROGLYPH M001AEGYPTI" + - "AN HIEROGLYPH M001BEGYPTIAN HIEROGLYPH M002EGYPTIAN HIEROGLYPH M003EGYPT" + - "IAN HIEROGLYPH M003AEGYPTIAN HIEROGLYPH M004EGYPTIAN HIEROGLYPH M005EGYP" + - "TIAN HIEROGLYPH M006EGYPTIAN HIEROGLYPH M007EGYPTIAN HIEROGLYPH M008EGYP" + - "TIAN HIEROGLYPH M009EGYPTIAN HIEROGLYPH M010EGYPTIAN HIEROGLYPH M010AEGY" + - "PTIAN HIEROGLYPH M011EGYPTIAN HIEROGLYPH M012EGYPTIAN HIEROGLYPH M012AEG" + - "YPTIAN HIEROGLYPH M012BEGYPTIAN HIEROGLYPH M012CEGYPTIAN HIEROGLYPH M012" + - "DEGYPTIAN HIEROGLYPH M012EEGYPTIAN HIEROGLYPH M012FEGYPTIAN HIEROGLYPH M" + - "012GEGYPTIAN HIEROGLYPH M012HEGYPTIAN HIEROGLYPH M013EGYPTIAN HIEROGLYPH" + - " M014EGYPTIAN HIEROGLYPH M015EGYPTIAN HIEROGLYPH M015AEGYPTIAN HIEROGLYP" + - "H M016EGYPTIAN HIEROGLYPH M016AEGYPTIAN HIEROGLYPH M017EGYPTIAN HIEROGLY" + - "PH M017AEGYPTIAN HIEROGLYPH M018EGYPTIAN HIEROGLYPH M019EGYPTIAN HIEROGL" + - "YPH M020EGYPTIAN HIEROGLYPH M021EGYPTIAN HIEROGLYPH M022EGYPTIAN HIEROGL" + - "YPH M022AEGYPTIAN HIEROGLYPH M023EGYPTIAN HIEROGLYPH M024EGYPTIAN HIEROG" + - "LYPH M024AEGYPTIAN HIEROGLYPH M025EGYPTIAN HIEROGLYPH M026EGYPTIAN HIERO" + - "GLYPH M027EGYPTIAN HIEROGLYPH M028EGYPTIAN HIEROGLYPH M028AEGYPTIAN HIER" + - "OGLYPH M029EGYPTIAN HIEROGLYPH M030EGYPTIAN HIEROGLYPH M031EGYPTIAN HIER" + - "OGLYPH M031AEGYPTIAN HIEROGLYPH M032EGYPTIAN HIEROGLYPH M033EGYPTIAN HIE" + - "ROGLYPH M033AEGYPTIAN HIEROGLYPH M033BEGYPTIAN HIEROGLYPH M034EGYPTIAN H" + - "IEROGLYPH M035EGYPTIAN HIEROGLYPH M036EGYPTIAN HIEROGLYPH M037EGYPTIAN H" + - "IEROGLYPH M038EGYPTIAN HIEROGLYPH M039EGYPTIAN HIEROGLYPH M040EGYPTIAN H" + - "IEROGLYPH M040AEGYPTIAN HIEROGLYPH M041EGYPTIAN HIEROGLYPH M042EGYPTIAN ") + ("" + - "HIEROGLYPH M043EGYPTIAN HIEROGLYPH M044EGYPTIAN HIEROGLYPH N001EGYPTIAN " + - "HIEROGLYPH N002EGYPTIAN HIEROGLYPH N003EGYPTIAN HIEROGLYPH N004EGYPTIAN " + - "HIEROGLYPH N005EGYPTIAN HIEROGLYPH N006EGYPTIAN HIEROGLYPH N007EGYPTIAN " + - "HIEROGLYPH N008EGYPTIAN HIEROGLYPH N009EGYPTIAN HIEROGLYPH N010EGYPTIAN " + - "HIEROGLYPH N011EGYPTIAN HIEROGLYPH N012EGYPTIAN HIEROGLYPH N013EGYPTIAN " + - "HIEROGLYPH N014EGYPTIAN HIEROGLYPH N015EGYPTIAN HIEROGLYPH N016EGYPTIAN " + - "HIEROGLYPH N017EGYPTIAN HIEROGLYPH N018EGYPTIAN HIEROGLYPH N018AEGYPTIAN" + - " HIEROGLYPH N018BEGYPTIAN HIEROGLYPH N019EGYPTIAN HIEROGLYPH N020EGYPTIA" + - "N HIEROGLYPH N021EGYPTIAN HIEROGLYPH N022EGYPTIAN HIEROGLYPH N023EGYPTIA" + - "N HIEROGLYPH N024EGYPTIAN HIEROGLYPH N025EGYPTIAN HIEROGLYPH N025AEGYPTI" + - "AN HIEROGLYPH N026EGYPTIAN HIEROGLYPH N027EGYPTIAN HIEROGLYPH N028EGYPTI" + - "AN HIEROGLYPH N029EGYPTIAN HIEROGLYPH N030EGYPTIAN HIEROGLYPH N031EGYPTI" + - "AN HIEROGLYPH N032EGYPTIAN HIEROGLYPH N033EGYPTIAN HIEROGLYPH N033AEGYPT" + - "IAN HIEROGLYPH N034EGYPTIAN HIEROGLYPH N034AEGYPTIAN HIEROGLYPH N035EGYP" + - "TIAN HIEROGLYPH N035AEGYPTIAN HIEROGLYPH N036EGYPTIAN HIEROGLYPH N037EGY" + - "PTIAN HIEROGLYPH N037AEGYPTIAN HIEROGLYPH N038EGYPTIAN HIEROGLYPH N039EG" + - "YPTIAN HIEROGLYPH N040EGYPTIAN HIEROGLYPH N041EGYPTIAN HIEROGLYPH N042EG" + - "YPTIAN HIEROGLYPH NL001EGYPTIAN HIEROGLYPH NL002EGYPTIAN HIEROGLYPH NL00" + - "3EGYPTIAN HIEROGLYPH NL004EGYPTIAN HIEROGLYPH NL005EGYPTIAN HIEROGLYPH N" + - "L005AEGYPTIAN HIEROGLYPH NL006EGYPTIAN HIEROGLYPH NL007EGYPTIAN HIEROGLY" + - "PH NL008EGYPTIAN HIEROGLYPH NL009EGYPTIAN HIEROGLYPH NL010EGYPTIAN HIERO" + - "GLYPH NL011EGYPTIAN HIEROGLYPH NL012EGYPTIAN HIEROGLYPH NL013EGYPTIAN HI" + - "EROGLYPH NL014EGYPTIAN HIEROGLYPH NL015EGYPTIAN HIEROGLYPH NL016EGYPTIAN" + - " HIEROGLYPH NL017EGYPTIAN HIEROGLYPH NL017AEGYPTIAN HIEROGLYPH NL018EGYP" + - "TIAN HIEROGLYPH NL019EGYPTIAN HIEROGLYPH NL020EGYPTIAN HIEROGLYPH NU001E" + - "GYPTIAN HIEROGLYPH NU002EGYPTIAN HIEROGLYPH NU003EGYPTIAN HIEROGLYPH NU0" + - "04EGYPTIAN HIEROGLYPH NU005EGYPTIAN HIEROGLYPH NU006EGYPTIAN HIEROGLYPH " + - "NU007EGYPTIAN HIEROGLYPH NU008EGYPTIAN HIEROGLYPH NU009EGYPTIAN HIEROGLY" + - "PH NU010EGYPTIAN HIEROGLYPH NU010AEGYPTIAN HIEROGLYPH NU011EGYPTIAN HIER" + - "OGLYPH NU011AEGYPTIAN HIEROGLYPH NU012EGYPTIAN HIEROGLYPH NU013EGYPTIAN " + - "HIEROGLYPH NU014EGYPTIAN HIEROGLYPH NU015EGYPTIAN HIEROGLYPH NU016EGYPTI" + - "AN HIEROGLYPH NU017EGYPTIAN HIEROGLYPH NU018EGYPTIAN HIEROGLYPH NU018AEG" + - "YPTIAN HIEROGLYPH NU019EGYPTIAN HIEROGLYPH NU020EGYPTIAN HIEROGLYPH NU02" + - "1EGYPTIAN HIEROGLYPH NU022EGYPTIAN HIEROGLYPH NU022AEGYPTIAN HIEROGLYPH " + - "O001EGYPTIAN HIEROGLYPH O001AEGYPTIAN HIEROGLYPH O002EGYPTIAN HIEROGLYPH" + - " O003EGYPTIAN HIEROGLYPH O004EGYPTIAN HIEROGLYPH O005EGYPTIAN HIEROGLYPH" + - " O005AEGYPTIAN HIEROGLYPH O006EGYPTIAN HIEROGLYPH O006AEGYPTIAN HIEROGLY" + - "PH O006BEGYPTIAN HIEROGLYPH O006CEGYPTIAN HIEROGLYPH O006DEGYPTIAN HIERO" + - "GLYPH O006EEGYPTIAN HIEROGLYPH O006FEGYPTIAN HIEROGLYPH O007EGYPTIAN HIE" + - "ROGLYPH O008EGYPTIAN HIEROGLYPH O009EGYPTIAN HIEROGLYPH O010EGYPTIAN HIE" + - "ROGLYPH O010AEGYPTIAN HIEROGLYPH O010BEGYPTIAN HIEROGLYPH O010CEGYPTIAN " + - "HIEROGLYPH O011EGYPTIAN HIEROGLYPH O012EGYPTIAN HIEROGLYPH O013EGYPTIAN " + - "HIEROGLYPH O014EGYPTIAN HIEROGLYPH O015EGYPTIAN HIEROGLYPH O016EGYPTIAN " + - "HIEROGLYPH O017EGYPTIAN HIEROGLYPH O018EGYPTIAN HIEROGLYPH O019EGYPTIAN " + - "HIEROGLYPH O019AEGYPTIAN HIEROGLYPH O020EGYPTIAN HIEROGLYPH O020AEGYPTIA" + - "N HIEROGLYPH O021EGYPTIAN HIEROGLYPH O022EGYPTIAN HIEROGLYPH O023EGYPTIA" + - "N HIEROGLYPH O024EGYPTIAN HIEROGLYPH O024AEGYPTIAN HIEROGLYPH O025EGYPTI" + - "AN HIEROGLYPH O025AEGYPTIAN HIEROGLYPH O026EGYPTIAN HIEROGLYPH O027EGYPT" + - "IAN HIEROGLYPH O028EGYPTIAN HIEROGLYPH O029EGYPTIAN HIEROGLYPH O029AEGYP" + - "TIAN HIEROGLYPH O030EGYPTIAN HIEROGLYPH O030AEGYPTIAN HIEROGLYPH O031EGY" + - "PTIAN HIEROGLYPH O032EGYPTIAN HIEROGLYPH O033EGYPTIAN HIEROGLYPH O033AEG" + - "YPTIAN HIEROGLYPH O034EGYPTIAN HIEROGLYPH O035EGYPTIAN HIEROGLYPH O036EG" + - "YPTIAN HIEROGLYPH O036AEGYPTIAN HIEROGLYPH O036BEGYPTIAN HIEROGLYPH O036" + - "CEGYPTIAN HIEROGLYPH O036DEGYPTIAN HIEROGLYPH O037EGYPTIAN HIEROGLYPH O0" + - "38EGYPTIAN HIEROGLYPH O039EGYPTIAN HIEROGLYPH O040EGYPTIAN HIEROGLYPH O0" + - "41EGYPTIAN HIEROGLYPH O042EGYPTIAN HIEROGLYPH O043EGYPTIAN HIEROGLYPH O0" + - "44EGYPTIAN HIEROGLYPH O045EGYPTIAN HIEROGLYPH O046EGYPTIAN HIEROGLYPH O0" + - "47EGYPTIAN HIEROGLYPH O048EGYPTIAN HIEROGLYPH O049EGYPTIAN HIEROGLYPH O0" + - "50EGYPTIAN HIEROGLYPH O050AEGYPTIAN HIEROGLYPH O050BEGYPTIAN HIEROGLYPH " + - "O051EGYPTIAN HIEROGLYPH P001EGYPTIAN HIEROGLYPH P001AEGYPTIAN HIEROGLYPH" + - " P002EGYPTIAN HIEROGLYPH P003EGYPTIAN HIEROGLYPH P003AEGYPTIAN HIEROGLYP" + - "H P004EGYPTIAN HIEROGLYPH P005EGYPTIAN HIEROGLYPH P006EGYPTIAN HIEROGLYP" + - "H P007EGYPTIAN HIEROGLYPH P008EGYPTIAN HIEROGLYPH P009EGYPTIAN HIEROGLYP" + - "H P010EGYPTIAN HIEROGLYPH P011EGYPTIAN HIEROGLYPH Q001EGYPTIAN HIEROGLYP") + ("" + - "H Q002EGYPTIAN HIEROGLYPH Q003EGYPTIAN HIEROGLYPH Q004EGYPTIAN HIEROGLYP" + - "H Q005EGYPTIAN HIEROGLYPH Q006EGYPTIAN HIEROGLYPH Q007EGYPTIAN HIEROGLYP" + - "H R001EGYPTIAN HIEROGLYPH R002EGYPTIAN HIEROGLYPH R002AEGYPTIAN HIEROGLY" + - "PH R003EGYPTIAN HIEROGLYPH R003AEGYPTIAN HIEROGLYPH R003BEGYPTIAN HIEROG" + - "LYPH R004EGYPTIAN HIEROGLYPH R005EGYPTIAN HIEROGLYPH R006EGYPTIAN HIEROG" + - "LYPH R007EGYPTIAN HIEROGLYPH R008EGYPTIAN HIEROGLYPH R009EGYPTIAN HIEROG" + - "LYPH R010EGYPTIAN HIEROGLYPH R010AEGYPTIAN HIEROGLYPH R011EGYPTIAN HIERO" + - "GLYPH R012EGYPTIAN HIEROGLYPH R013EGYPTIAN HIEROGLYPH R014EGYPTIAN HIERO" + - "GLYPH R015EGYPTIAN HIEROGLYPH R016EGYPTIAN HIEROGLYPH R016AEGYPTIAN HIER" + - "OGLYPH R017EGYPTIAN HIEROGLYPH R018EGYPTIAN HIEROGLYPH R019EGYPTIAN HIER" + - "OGLYPH R020EGYPTIAN HIEROGLYPH R021EGYPTIAN HIEROGLYPH R022EGYPTIAN HIER" + - "OGLYPH R023EGYPTIAN HIEROGLYPH R024EGYPTIAN HIEROGLYPH R025EGYPTIAN HIER" + - "OGLYPH R026EGYPTIAN HIEROGLYPH R027EGYPTIAN HIEROGLYPH R028EGYPTIAN HIER" + - "OGLYPH R029EGYPTIAN HIEROGLYPH S001EGYPTIAN HIEROGLYPH S002EGYPTIAN HIER" + - "OGLYPH S002AEGYPTIAN HIEROGLYPH S003EGYPTIAN HIEROGLYPH S004EGYPTIAN HIE" + - "ROGLYPH S005EGYPTIAN HIEROGLYPH S006EGYPTIAN HIEROGLYPH S006AEGYPTIAN HI" + - "EROGLYPH S007EGYPTIAN HIEROGLYPH S008EGYPTIAN HIEROGLYPH S009EGYPTIAN HI" + - "EROGLYPH S010EGYPTIAN HIEROGLYPH S011EGYPTIAN HIEROGLYPH S012EGYPTIAN HI" + - "EROGLYPH S013EGYPTIAN HIEROGLYPH S014EGYPTIAN HIEROGLYPH S014AEGYPTIAN H" + - "IEROGLYPH S014BEGYPTIAN HIEROGLYPH S015EGYPTIAN HIEROGLYPH S016EGYPTIAN " + - "HIEROGLYPH S017EGYPTIAN HIEROGLYPH S017AEGYPTIAN HIEROGLYPH S018EGYPTIAN" + - " HIEROGLYPH S019EGYPTIAN HIEROGLYPH S020EGYPTIAN HIEROGLYPH S021EGYPTIAN" + - " HIEROGLYPH S022EGYPTIAN HIEROGLYPH S023EGYPTIAN HIEROGLYPH S024EGYPTIAN" + - " HIEROGLYPH S025EGYPTIAN HIEROGLYPH S026EGYPTIAN HIEROGLYPH S026AEGYPTIA" + - "N HIEROGLYPH S026BEGYPTIAN HIEROGLYPH S027EGYPTIAN HIEROGLYPH S028EGYPTI" + - "AN HIEROGLYPH S029EGYPTIAN HIEROGLYPH S030EGYPTIAN HIEROGLYPH S031EGYPTI" + - "AN HIEROGLYPH S032EGYPTIAN HIEROGLYPH S033EGYPTIAN HIEROGLYPH S034EGYPTI" + - "AN HIEROGLYPH S035EGYPTIAN HIEROGLYPH S035AEGYPTIAN HIEROGLYPH S036EGYPT" + - "IAN HIEROGLYPH S037EGYPTIAN HIEROGLYPH S038EGYPTIAN HIEROGLYPH S039EGYPT" + - "IAN HIEROGLYPH S040EGYPTIAN HIEROGLYPH S041EGYPTIAN HIEROGLYPH S042EGYPT" + - "IAN HIEROGLYPH S043EGYPTIAN HIEROGLYPH S044EGYPTIAN HIEROGLYPH S045EGYPT" + - "IAN HIEROGLYPH S046EGYPTIAN HIEROGLYPH T001EGYPTIAN HIEROGLYPH T002EGYPT" + - "IAN HIEROGLYPH T003EGYPTIAN HIEROGLYPH T003AEGYPTIAN HIEROGLYPH T004EGYP" + - "TIAN HIEROGLYPH T005EGYPTIAN HIEROGLYPH T006EGYPTIAN HIEROGLYPH T007EGYP" + - "TIAN HIEROGLYPH T007AEGYPTIAN HIEROGLYPH T008EGYPTIAN HIEROGLYPH T008AEG" + - "YPTIAN HIEROGLYPH T009EGYPTIAN HIEROGLYPH T009AEGYPTIAN HIEROGLYPH T010E" + - "GYPTIAN HIEROGLYPH T011EGYPTIAN HIEROGLYPH T011AEGYPTIAN HIEROGLYPH T012" + - "EGYPTIAN HIEROGLYPH T013EGYPTIAN HIEROGLYPH T014EGYPTIAN HIEROGLYPH T015" + - "EGYPTIAN HIEROGLYPH T016EGYPTIAN HIEROGLYPH T016AEGYPTIAN HIEROGLYPH T01" + - "7EGYPTIAN HIEROGLYPH T018EGYPTIAN HIEROGLYPH T019EGYPTIAN HIEROGLYPH T02" + - "0EGYPTIAN HIEROGLYPH T021EGYPTIAN HIEROGLYPH T022EGYPTIAN HIEROGLYPH T02" + - "3EGYPTIAN HIEROGLYPH T024EGYPTIAN HIEROGLYPH T025EGYPTIAN HIEROGLYPH T02" + - "6EGYPTIAN HIEROGLYPH T027EGYPTIAN HIEROGLYPH T028EGYPTIAN HIEROGLYPH T02" + - "9EGYPTIAN HIEROGLYPH T030EGYPTIAN HIEROGLYPH T031EGYPTIAN HIEROGLYPH T03" + - "2EGYPTIAN HIEROGLYPH T032AEGYPTIAN HIEROGLYPH T033EGYPTIAN HIEROGLYPH T0" + - "33AEGYPTIAN HIEROGLYPH T034EGYPTIAN HIEROGLYPH T035EGYPTIAN HIEROGLYPH T" + - "036EGYPTIAN HIEROGLYPH U001EGYPTIAN HIEROGLYPH U002EGYPTIAN HIEROGLYPH U" + - "003EGYPTIAN HIEROGLYPH U004EGYPTIAN HIEROGLYPH U005EGYPTIAN HIEROGLYPH U" + - "006EGYPTIAN HIEROGLYPH U006AEGYPTIAN HIEROGLYPH U006BEGYPTIAN HIEROGLYPH" + - " U007EGYPTIAN HIEROGLYPH U008EGYPTIAN HIEROGLYPH U009EGYPTIAN HIEROGLYPH" + - " U010EGYPTIAN HIEROGLYPH U011EGYPTIAN HIEROGLYPH U012EGYPTIAN HIEROGLYPH" + - " U013EGYPTIAN HIEROGLYPH U014EGYPTIAN HIEROGLYPH U015EGYPTIAN HIEROGLYPH" + - " U016EGYPTIAN HIEROGLYPH U017EGYPTIAN HIEROGLYPH U018EGYPTIAN HIEROGLYPH" + - " U019EGYPTIAN HIEROGLYPH U020EGYPTIAN HIEROGLYPH U021EGYPTIAN HIEROGLYPH" + - " U022EGYPTIAN HIEROGLYPH U023EGYPTIAN HIEROGLYPH U023AEGYPTIAN HIEROGLYP" + - "H U024EGYPTIAN HIEROGLYPH U025EGYPTIAN HIEROGLYPH U026EGYPTIAN HIEROGLYP" + - "H U027EGYPTIAN HIEROGLYPH U028EGYPTIAN HIEROGLYPH U029EGYPTIAN HIEROGLYP" + - "H U029AEGYPTIAN HIEROGLYPH U030EGYPTIAN HIEROGLYPH U031EGYPTIAN HIEROGLY" + - "PH U032EGYPTIAN HIEROGLYPH U032AEGYPTIAN HIEROGLYPH U033EGYPTIAN HIEROGL" + - "YPH U034EGYPTIAN HIEROGLYPH U035EGYPTIAN HIEROGLYPH U036EGYPTIAN HIEROGL" + - "YPH U037EGYPTIAN HIEROGLYPH U038EGYPTIAN HIEROGLYPH U039EGYPTIAN HIEROGL" + - "YPH U040EGYPTIAN HIEROGLYPH U041EGYPTIAN HIEROGLYPH U042EGYPTIAN HIEROGL" + - "YPH V001EGYPTIAN HIEROGLYPH V001AEGYPTIAN HIEROGLYPH V001BEGYPTIAN HIERO" + - "GLYPH V001CEGYPTIAN HIEROGLYPH V001DEGYPTIAN HIEROGLYPH V001EEGYPTIAN HI") + ("" + - "EROGLYPH V001FEGYPTIAN HIEROGLYPH V001GEGYPTIAN HIEROGLYPH V001HEGYPTIAN" + - " HIEROGLYPH V001IEGYPTIAN HIEROGLYPH V002EGYPTIAN HIEROGLYPH V002AEGYPTI" + - "AN HIEROGLYPH V003EGYPTIAN HIEROGLYPH V004EGYPTIAN HIEROGLYPH V005EGYPTI" + - "AN HIEROGLYPH V006EGYPTIAN HIEROGLYPH V007EGYPTIAN HIEROGLYPH V007AEGYPT" + - "IAN HIEROGLYPH V007BEGYPTIAN HIEROGLYPH V008EGYPTIAN HIEROGLYPH V009EGYP" + - "TIAN HIEROGLYPH V010EGYPTIAN HIEROGLYPH V011EGYPTIAN HIEROGLYPH V011AEGY" + - "PTIAN HIEROGLYPH V011BEGYPTIAN HIEROGLYPH V011CEGYPTIAN HIEROGLYPH V012E" + - "GYPTIAN HIEROGLYPH V012AEGYPTIAN HIEROGLYPH V012BEGYPTIAN HIEROGLYPH V01" + - "3EGYPTIAN HIEROGLYPH V014EGYPTIAN HIEROGLYPH V015EGYPTIAN HIEROGLYPH V01" + - "6EGYPTIAN HIEROGLYPH V017EGYPTIAN HIEROGLYPH V018EGYPTIAN HIEROGLYPH V01" + - "9EGYPTIAN HIEROGLYPH V020EGYPTIAN HIEROGLYPH V020AEGYPTIAN HIEROGLYPH V0" + - "20BEGYPTIAN HIEROGLYPH V020CEGYPTIAN HIEROGLYPH V020DEGYPTIAN HIEROGLYPH" + - " V020EEGYPTIAN HIEROGLYPH V020FEGYPTIAN HIEROGLYPH V020GEGYPTIAN HIEROGL" + - "YPH V020HEGYPTIAN HIEROGLYPH V020IEGYPTIAN HIEROGLYPH V020JEGYPTIAN HIER" + - "OGLYPH V020KEGYPTIAN HIEROGLYPH V020LEGYPTIAN HIEROGLYPH V021EGYPTIAN HI" + - "EROGLYPH V022EGYPTIAN HIEROGLYPH V023EGYPTIAN HIEROGLYPH V023AEGYPTIAN H" + - "IEROGLYPH V024EGYPTIAN HIEROGLYPH V025EGYPTIAN HIEROGLYPH V026EGYPTIAN H" + - "IEROGLYPH V027EGYPTIAN HIEROGLYPH V028EGYPTIAN HIEROGLYPH V028AEGYPTIAN " + - "HIEROGLYPH V029EGYPTIAN HIEROGLYPH V029AEGYPTIAN HIEROGLYPH V030EGYPTIAN" + - " HIEROGLYPH V030AEGYPTIAN HIEROGLYPH V031EGYPTIAN HIEROGLYPH V031AEGYPTI" + - "AN HIEROGLYPH V032EGYPTIAN HIEROGLYPH V033EGYPTIAN HIEROGLYPH V033AEGYPT" + - "IAN HIEROGLYPH V034EGYPTIAN HIEROGLYPH V035EGYPTIAN HIEROGLYPH V036EGYPT" + - "IAN HIEROGLYPH V037EGYPTIAN HIEROGLYPH V037AEGYPTIAN HIEROGLYPH V038EGYP" + - "TIAN HIEROGLYPH V039EGYPTIAN HIEROGLYPH V040EGYPTIAN HIEROGLYPH V040AEGY" + - "PTIAN HIEROGLYPH W001EGYPTIAN HIEROGLYPH W002EGYPTIAN HIEROGLYPH W003EGY" + - "PTIAN HIEROGLYPH W003AEGYPTIAN HIEROGLYPH W004EGYPTIAN HIEROGLYPH W005EG" + - "YPTIAN HIEROGLYPH W006EGYPTIAN HIEROGLYPH W007EGYPTIAN HIEROGLYPH W008EG" + - "YPTIAN HIEROGLYPH W009EGYPTIAN HIEROGLYPH W009AEGYPTIAN HIEROGLYPH W010E" + - "GYPTIAN HIEROGLYPH W010AEGYPTIAN HIEROGLYPH W011EGYPTIAN HIEROGLYPH W012" + - "EGYPTIAN HIEROGLYPH W013EGYPTIAN HIEROGLYPH W014EGYPTIAN HIEROGLYPH W014" + - "AEGYPTIAN HIEROGLYPH W015EGYPTIAN HIEROGLYPH W016EGYPTIAN HIEROGLYPH W01" + - "7EGYPTIAN HIEROGLYPH W017AEGYPTIAN HIEROGLYPH W018EGYPTIAN HIEROGLYPH W0" + - "18AEGYPTIAN HIEROGLYPH W019EGYPTIAN HIEROGLYPH W020EGYPTIAN HIEROGLYPH W" + - "021EGYPTIAN HIEROGLYPH W022EGYPTIAN HIEROGLYPH W023EGYPTIAN HIEROGLYPH W" + - "024EGYPTIAN HIEROGLYPH W024AEGYPTIAN HIEROGLYPH W025EGYPTIAN HIEROGLYPH " + - "X001EGYPTIAN HIEROGLYPH X002EGYPTIAN HIEROGLYPH X003EGYPTIAN HIEROGLYPH " + - "X004EGYPTIAN HIEROGLYPH X004AEGYPTIAN HIEROGLYPH X004BEGYPTIAN HIEROGLYP" + - "H X005EGYPTIAN HIEROGLYPH X006EGYPTIAN HIEROGLYPH X006AEGYPTIAN HIEROGLY" + - "PH X007EGYPTIAN HIEROGLYPH X008EGYPTIAN HIEROGLYPH X008AEGYPTIAN HIEROGL" + - "YPH Y001EGYPTIAN HIEROGLYPH Y001AEGYPTIAN HIEROGLYPH Y002EGYPTIAN HIEROG" + - "LYPH Y003EGYPTIAN HIEROGLYPH Y004EGYPTIAN HIEROGLYPH Y005EGYPTIAN HIEROG" + - "LYPH Y006EGYPTIAN HIEROGLYPH Y007EGYPTIAN HIEROGLYPH Y008EGYPTIAN HIEROG" + - "LYPH Z001EGYPTIAN HIEROGLYPH Z002EGYPTIAN HIEROGLYPH Z002AEGYPTIAN HIERO" + - "GLYPH Z002BEGYPTIAN HIEROGLYPH Z002CEGYPTIAN HIEROGLYPH Z002DEGYPTIAN HI" + - "EROGLYPH Z003EGYPTIAN HIEROGLYPH Z003AEGYPTIAN HIEROGLYPH Z003BEGYPTIAN " + - "HIEROGLYPH Z004EGYPTIAN HIEROGLYPH Z004AEGYPTIAN HIEROGLYPH Z005EGYPTIAN" + - " HIEROGLYPH Z005AEGYPTIAN HIEROGLYPH Z006EGYPTIAN HIEROGLYPH Z007EGYPTIA" + - "N HIEROGLYPH Z008EGYPTIAN HIEROGLYPH Z009EGYPTIAN HIEROGLYPH Z010EGYPTIA" + - "N HIEROGLYPH Z011EGYPTIAN HIEROGLYPH Z012EGYPTIAN HIEROGLYPH Z013EGYPTIA" + - "N HIEROGLYPH Z014EGYPTIAN HIEROGLYPH Z015EGYPTIAN HIEROGLYPH Z015AEGYPTI" + - "AN HIEROGLYPH Z015BEGYPTIAN HIEROGLYPH Z015CEGYPTIAN HIEROGLYPH Z015DEGY" + - "PTIAN HIEROGLYPH Z015EEGYPTIAN HIEROGLYPH Z015FEGYPTIAN HIEROGLYPH Z015G" + - "EGYPTIAN HIEROGLYPH Z015HEGYPTIAN HIEROGLYPH Z015IEGYPTIAN HIEROGLYPH Z0" + - "16EGYPTIAN HIEROGLYPH Z016AEGYPTIAN HIEROGLYPH Z016BEGYPTIAN HIEROGLYPH " + - "Z016CEGYPTIAN HIEROGLYPH Z016DEGYPTIAN HIEROGLYPH Z016EEGYPTIAN HIEROGLY" + - "PH Z016FEGYPTIAN HIEROGLYPH Z016GEGYPTIAN HIEROGLYPH Z016HEGYPTIAN HIERO" + - "GLYPH AA001EGYPTIAN HIEROGLYPH AA002EGYPTIAN HIEROGLYPH AA003EGYPTIAN HI" + - "EROGLYPH AA004EGYPTIAN HIEROGLYPH AA005EGYPTIAN HIEROGLYPH AA006EGYPTIAN" + - " HIEROGLYPH AA007EGYPTIAN HIEROGLYPH AA007AEGYPTIAN HIEROGLYPH AA007BEGY" + - "PTIAN HIEROGLYPH AA008EGYPTIAN HIEROGLYPH AA009EGYPTIAN HIEROGLYPH AA010" + - "EGYPTIAN HIEROGLYPH AA011EGYPTIAN HIEROGLYPH AA012EGYPTIAN HIEROGLYPH AA" + - "013EGYPTIAN HIEROGLYPH AA014EGYPTIAN HIEROGLYPH AA015EGYPTIAN HIEROGLYPH" + - " AA016EGYPTIAN HIEROGLYPH AA017EGYPTIAN HIEROGLYPH AA018EGYPTIAN HIEROGL" + - "YPH AA019EGYPTIAN HIEROGLYPH AA020EGYPTIAN HIEROGLYPH AA021EGYPTIAN HIER") + ("" + - "OGLYPH AA022EGYPTIAN HIEROGLYPH AA023EGYPTIAN HIEROGLYPH AA024EGYPTIAN H" + - "IEROGLYPH AA025EGYPTIAN HIEROGLYPH AA026EGYPTIAN HIEROGLYPH AA027EGYPTIA" + - "N HIEROGLYPH AA028EGYPTIAN HIEROGLYPH AA029EGYPTIAN HIEROGLYPH AA030EGYP" + - "TIAN HIEROGLYPH AA031EGYPTIAN HIEROGLYPH AA032ANATOLIAN HIEROGLYPH A001A" + - "NATOLIAN HIEROGLYPH A002ANATOLIAN HIEROGLYPH A003ANATOLIAN HIEROGLYPH A0" + - "04ANATOLIAN HIEROGLYPH A005ANATOLIAN HIEROGLYPH A006ANATOLIAN HIEROGLYPH" + - " A007ANATOLIAN HIEROGLYPH A008ANATOLIAN HIEROGLYPH A009ANATOLIAN HIEROGL" + - "YPH A010ANATOLIAN HIEROGLYPH A010AANATOLIAN HIEROGLYPH A011ANATOLIAN HIE" + - "ROGLYPH A012ANATOLIAN HIEROGLYPH A013ANATOLIAN HIEROGLYPH A014ANATOLIAN " + - "HIEROGLYPH A015ANATOLIAN HIEROGLYPH A016ANATOLIAN HIEROGLYPH A017ANATOLI" + - "AN HIEROGLYPH A018ANATOLIAN HIEROGLYPH A019ANATOLIAN HIEROGLYPH A020ANAT" + - "OLIAN HIEROGLYPH A021ANATOLIAN HIEROGLYPH A022ANATOLIAN HIEROGLYPH A023A" + - "NATOLIAN HIEROGLYPH A024ANATOLIAN HIEROGLYPH A025ANATOLIAN HIEROGLYPH A0" + - "26ANATOLIAN HIEROGLYPH A026AANATOLIAN HIEROGLYPH A027ANATOLIAN HIEROGLYP" + - "H A028ANATOLIAN HIEROGLYPH A029ANATOLIAN HIEROGLYPH A030ANATOLIAN HIEROG" + - "LYPH A031ANATOLIAN HIEROGLYPH A032ANATOLIAN HIEROGLYPH A033ANATOLIAN HIE" + - "ROGLYPH A034ANATOLIAN HIEROGLYPH A035ANATOLIAN HIEROGLYPH A036ANATOLIAN " + - "HIEROGLYPH A037ANATOLIAN HIEROGLYPH A038ANATOLIAN HIEROGLYPH A039ANATOLI" + - "AN HIEROGLYPH A039AANATOLIAN HIEROGLYPH A040ANATOLIAN HIEROGLYPH A041ANA" + - "TOLIAN HIEROGLYPH A041AANATOLIAN HIEROGLYPH A042ANATOLIAN HIEROGLYPH A04" + - "3ANATOLIAN HIEROGLYPH A044ANATOLIAN HIEROGLYPH A045ANATOLIAN HIEROGLYPH " + - "A045AANATOLIAN HIEROGLYPH A046ANATOLIAN HIEROGLYPH A046AANATOLIAN HIEROG" + - "LYPH A046BANATOLIAN HIEROGLYPH A047ANATOLIAN HIEROGLYPH A048ANATOLIAN HI" + - "EROGLYPH A049ANATOLIAN HIEROGLYPH A050ANATOLIAN HIEROGLYPH A051ANATOLIAN" + - " HIEROGLYPH A052ANATOLIAN HIEROGLYPH A053ANATOLIAN HIEROGLYPH A054ANATOL" + - "IAN HIEROGLYPH A055ANATOLIAN HIEROGLYPH A056ANATOLIAN HIEROGLYPH A057ANA" + - "TOLIAN HIEROGLYPH A058ANATOLIAN HIEROGLYPH A059ANATOLIAN HIEROGLYPH A060" + - "ANATOLIAN HIEROGLYPH A061ANATOLIAN HIEROGLYPH A062ANATOLIAN HIEROGLYPH A" + - "063ANATOLIAN HIEROGLYPH A064ANATOLIAN HIEROGLYPH A065ANATOLIAN HIEROGLYP" + - "H A066ANATOLIAN HIEROGLYPH A066AANATOLIAN HIEROGLYPH A066BANATOLIAN HIER" + - "OGLYPH A066CANATOLIAN HIEROGLYPH A067ANATOLIAN HIEROGLYPH A068ANATOLIAN " + - "HIEROGLYPH A069ANATOLIAN HIEROGLYPH A070ANATOLIAN HIEROGLYPH A071ANATOLI" + - "AN HIEROGLYPH A072ANATOLIAN HIEROGLYPH A073ANATOLIAN HIEROGLYPH A074ANAT" + - "OLIAN HIEROGLYPH A075ANATOLIAN HIEROGLYPH A076ANATOLIAN HIEROGLYPH A077A" + - "NATOLIAN HIEROGLYPH A078ANATOLIAN HIEROGLYPH A079ANATOLIAN HIEROGLYPH A0" + - "80ANATOLIAN HIEROGLYPH A081ANATOLIAN HIEROGLYPH A082ANATOLIAN HIEROGLYPH" + - " A083ANATOLIAN HIEROGLYPH A084ANATOLIAN HIEROGLYPH A085ANATOLIAN HIEROGL" + - "YPH A086ANATOLIAN HIEROGLYPH A087ANATOLIAN HIEROGLYPH A088ANATOLIAN HIER" + - "OGLYPH A089ANATOLIAN HIEROGLYPH A090ANATOLIAN HIEROGLYPH A091ANATOLIAN H" + - "IEROGLYPH A092ANATOLIAN HIEROGLYPH A093ANATOLIAN HIEROGLYPH A094ANATOLIA" + - "N HIEROGLYPH A095ANATOLIAN HIEROGLYPH A096ANATOLIAN HIEROGLYPH A097ANATO" + - "LIAN HIEROGLYPH A097AANATOLIAN HIEROGLYPH A098ANATOLIAN HIEROGLYPH A098A" + - "ANATOLIAN HIEROGLYPH A099ANATOLIAN HIEROGLYPH A100ANATOLIAN HIEROGLYPH A" + - "100AANATOLIAN HIEROGLYPH A101ANATOLIAN HIEROGLYPH A101AANATOLIAN HIEROGL" + - "YPH A102ANATOLIAN HIEROGLYPH A102AANATOLIAN HIEROGLYPH A103ANATOLIAN HIE" + - "ROGLYPH A104ANATOLIAN HIEROGLYPH A104AANATOLIAN HIEROGLYPH A104BANATOLIA" + - "N HIEROGLYPH A104CANATOLIAN HIEROGLYPH A105ANATOLIAN HIEROGLYPH A105AANA" + - "TOLIAN HIEROGLYPH A105BANATOLIAN HIEROGLYPH A106ANATOLIAN HIEROGLYPH A10" + - "7ANATOLIAN HIEROGLYPH A107AANATOLIAN HIEROGLYPH A107BANATOLIAN HIEROGLYP" + - "H A107CANATOLIAN HIEROGLYPH A108ANATOLIAN HIEROGLYPH A109ANATOLIAN HIERO" + - "GLYPH A110ANATOLIAN HIEROGLYPH A110AANATOLIAN HIEROGLYPH A110BANATOLIAN " + - "HIEROGLYPH A111ANATOLIAN HIEROGLYPH A112ANATOLIAN HIEROGLYPH A113ANATOLI" + - "AN HIEROGLYPH A114ANATOLIAN HIEROGLYPH A115ANATOLIAN HIEROGLYPH A115AANA" + - "TOLIAN HIEROGLYPH A116ANATOLIAN HIEROGLYPH A117ANATOLIAN HIEROGLYPH A118" + - "ANATOLIAN HIEROGLYPH A119ANATOLIAN HIEROGLYPH A120ANATOLIAN HIEROGLYPH A" + - "121ANATOLIAN HIEROGLYPH A122ANATOLIAN HIEROGLYPH A123ANATOLIAN HIEROGLYP" + - "H A124ANATOLIAN HIEROGLYPH A125ANATOLIAN HIEROGLYPH A125AANATOLIAN HIERO" + - "GLYPH A126ANATOLIAN HIEROGLYPH A127ANATOLIAN HIEROGLYPH A128ANATOLIAN HI" + - "EROGLYPH A129ANATOLIAN HIEROGLYPH A130ANATOLIAN HIEROGLYPH A131ANATOLIAN" + - " HIEROGLYPH A132ANATOLIAN HIEROGLYPH A133ANATOLIAN HIEROGLYPH A134ANATOL" + - "IAN HIEROGLYPH A135ANATOLIAN HIEROGLYPH A135AANATOLIAN HIEROGLYPH A136AN" + - "ATOLIAN HIEROGLYPH A137ANATOLIAN HIEROGLYPH A138ANATOLIAN HIEROGLYPH A13" + - "9ANATOLIAN HIEROGLYPH A140ANATOLIAN HIEROGLYPH A141ANATOLIAN HIEROGLYPH " + - "A142ANATOLIAN HIEROGLYPH A143ANATOLIAN HIEROGLYPH A144ANATOLIAN HIEROGLY") + ("" + - "PH A145ANATOLIAN HIEROGLYPH A146ANATOLIAN HIEROGLYPH A147ANATOLIAN HIERO" + - "GLYPH A148ANATOLIAN HIEROGLYPH A149ANATOLIAN HIEROGLYPH A150ANATOLIAN HI" + - "EROGLYPH A151ANATOLIAN HIEROGLYPH A152ANATOLIAN HIEROGLYPH A153ANATOLIAN" + - " HIEROGLYPH A154ANATOLIAN HIEROGLYPH A155ANATOLIAN HIEROGLYPH A156ANATOL" + - "IAN HIEROGLYPH A157ANATOLIAN HIEROGLYPH A158ANATOLIAN HIEROGLYPH A159ANA" + - "TOLIAN HIEROGLYPH A160ANATOLIAN HIEROGLYPH A161ANATOLIAN HIEROGLYPH A162" + - "ANATOLIAN HIEROGLYPH A163ANATOLIAN HIEROGLYPH A164ANATOLIAN HIEROGLYPH A" + - "165ANATOLIAN HIEROGLYPH A166ANATOLIAN HIEROGLYPH A167ANATOLIAN HIEROGLYP" + - "H A168ANATOLIAN HIEROGLYPH A169ANATOLIAN HIEROGLYPH A170ANATOLIAN HIEROG" + - "LYPH A171ANATOLIAN HIEROGLYPH A172ANATOLIAN HIEROGLYPH A173ANATOLIAN HIE" + - "ROGLYPH A174ANATOLIAN HIEROGLYPH A175ANATOLIAN HIEROGLYPH A176ANATOLIAN " + - "HIEROGLYPH A177ANATOLIAN HIEROGLYPH A178ANATOLIAN HIEROGLYPH A179ANATOLI" + - "AN HIEROGLYPH A180ANATOLIAN HIEROGLYPH A181ANATOLIAN HIEROGLYPH A182ANAT" + - "OLIAN HIEROGLYPH A183ANATOLIAN HIEROGLYPH A184ANATOLIAN HIEROGLYPH A185A" + - "NATOLIAN HIEROGLYPH A186ANATOLIAN HIEROGLYPH A187ANATOLIAN HIEROGLYPH A1" + - "88ANATOLIAN HIEROGLYPH A189ANATOLIAN HIEROGLYPH A190ANATOLIAN HIEROGLYPH" + - " A191ANATOLIAN HIEROGLYPH A192ANATOLIAN HIEROGLYPH A193ANATOLIAN HIEROGL" + - "YPH A194ANATOLIAN HIEROGLYPH A195ANATOLIAN HIEROGLYPH A196ANATOLIAN HIER" + - "OGLYPH A197ANATOLIAN HIEROGLYPH A198ANATOLIAN HIEROGLYPH A199ANATOLIAN H" + - "IEROGLYPH A200ANATOLIAN HIEROGLYPH A201ANATOLIAN HIEROGLYPH A202ANATOLIA" + - "N HIEROGLYPH A202AANATOLIAN HIEROGLYPH A202BANATOLIAN HIEROGLYPH A203ANA" + - "TOLIAN HIEROGLYPH A204ANATOLIAN HIEROGLYPH A205ANATOLIAN HIEROGLYPH A206" + - "ANATOLIAN HIEROGLYPH A207ANATOLIAN HIEROGLYPH A207AANATOLIAN HIEROGLYPH " + - "A208ANATOLIAN HIEROGLYPH A209ANATOLIAN HIEROGLYPH A209AANATOLIAN HIEROGL" + - "YPH A210ANATOLIAN HIEROGLYPH A211ANATOLIAN HIEROGLYPH A212ANATOLIAN HIER" + - "OGLYPH A213ANATOLIAN HIEROGLYPH A214ANATOLIAN HIEROGLYPH A215ANATOLIAN H" + - "IEROGLYPH A215AANATOLIAN HIEROGLYPH A216ANATOLIAN HIEROGLYPH A216AANATOL" + - "IAN HIEROGLYPH A217ANATOLIAN HIEROGLYPH A218ANATOLIAN HIEROGLYPH A219ANA" + - "TOLIAN HIEROGLYPH A220ANATOLIAN HIEROGLYPH A221ANATOLIAN HIEROGLYPH A222" + - "ANATOLIAN HIEROGLYPH A223ANATOLIAN HIEROGLYPH A224ANATOLIAN HIEROGLYPH A" + - "225ANATOLIAN HIEROGLYPH A226ANATOLIAN HIEROGLYPH A227ANATOLIAN HIEROGLYP" + - "H A227AANATOLIAN HIEROGLYPH A228ANATOLIAN HIEROGLYPH A229ANATOLIAN HIERO" + - "GLYPH A230ANATOLIAN HIEROGLYPH A231ANATOLIAN HIEROGLYPH A232ANATOLIAN HI" + - "EROGLYPH A233ANATOLIAN HIEROGLYPH A234ANATOLIAN HIEROGLYPH A235ANATOLIAN" + - " HIEROGLYPH A236ANATOLIAN HIEROGLYPH A237ANATOLIAN HIEROGLYPH A238ANATOL" + - "IAN HIEROGLYPH A239ANATOLIAN HIEROGLYPH A240ANATOLIAN HIEROGLYPH A241ANA" + - "TOLIAN HIEROGLYPH A242ANATOLIAN HIEROGLYPH A243ANATOLIAN HIEROGLYPH A244" + - "ANATOLIAN HIEROGLYPH A245ANATOLIAN HIEROGLYPH A246ANATOLIAN HIEROGLYPH A" + - "247ANATOLIAN HIEROGLYPH A248ANATOLIAN HIEROGLYPH A249ANATOLIAN HIEROGLYP" + - "H A250ANATOLIAN HIEROGLYPH A251ANATOLIAN HIEROGLYPH A252ANATOLIAN HIEROG" + - "LYPH A253ANATOLIAN HIEROGLYPH A254ANATOLIAN HIEROGLYPH A255ANATOLIAN HIE" + - "ROGLYPH A256ANATOLIAN HIEROGLYPH A257ANATOLIAN HIEROGLYPH A258ANATOLIAN " + - "HIEROGLYPH A259ANATOLIAN HIEROGLYPH A260ANATOLIAN HIEROGLYPH A261ANATOLI" + - "AN HIEROGLYPH A262ANATOLIAN HIEROGLYPH A263ANATOLIAN HIEROGLYPH A264ANAT" + - "OLIAN HIEROGLYPH A265ANATOLIAN HIEROGLYPH A266ANATOLIAN HIEROGLYPH A267A" + - "NATOLIAN HIEROGLYPH A267AANATOLIAN HIEROGLYPH A268ANATOLIAN HIEROGLYPH A" + - "269ANATOLIAN HIEROGLYPH A270ANATOLIAN HIEROGLYPH A271ANATOLIAN HIEROGLYP" + - "H A272ANATOLIAN HIEROGLYPH A273ANATOLIAN HIEROGLYPH A274ANATOLIAN HIEROG" + - "LYPH A275ANATOLIAN HIEROGLYPH A276ANATOLIAN HIEROGLYPH A277ANATOLIAN HIE" + - "ROGLYPH A278ANATOLIAN HIEROGLYPH A279ANATOLIAN HIEROGLYPH A280ANATOLIAN " + - "HIEROGLYPH A281ANATOLIAN HIEROGLYPH A282ANATOLIAN HIEROGLYPH A283ANATOLI" + - "AN HIEROGLYPH A284ANATOLIAN HIEROGLYPH A285ANATOLIAN HIEROGLYPH A286ANAT" + - "OLIAN HIEROGLYPH A287ANATOLIAN HIEROGLYPH A288ANATOLIAN HIEROGLYPH A289A" + - "NATOLIAN HIEROGLYPH A289AANATOLIAN HIEROGLYPH A290ANATOLIAN HIEROGLYPH A" + - "291ANATOLIAN HIEROGLYPH A292ANATOLIAN HIEROGLYPH A293ANATOLIAN HIEROGLYP" + - "H A294ANATOLIAN HIEROGLYPH A294AANATOLIAN HIEROGLYPH A295ANATOLIAN HIERO" + - "GLYPH A296ANATOLIAN HIEROGLYPH A297ANATOLIAN HIEROGLYPH A298ANATOLIAN HI" + - "EROGLYPH A299ANATOLIAN HIEROGLYPH A299AANATOLIAN HIEROGLYPH A300ANATOLIA" + - "N HIEROGLYPH A301ANATOLIAN HIEROGLYPH A302ANATOLIAN HIEROGLYPH A303ANATO" + - "LIAN HIEROGLYPH A304ANATOLIAN HIEROGLYPH A305ANATOLIAN HIEROGLYPH A306AN" + - "ATOLIAN HIEROGLYPH A307ANATOLIAN HIEROGLYPH A308ANATOLIAN HIEROGLYPH A30" + - "9ANATOLIAN HIEROGLYPH A309AANATOLIAN HIEROGLYPH A310ANATOLIAN HIEROGLYPH" + - " A311ANATOLIAN HIEROGLYPH A312ANATOLIAN HIEROGLYPH A313ANATOLIAN HIEROGL" + - "YPH A314ANATOLIAN HIEROGLYPH A315ANATOLIAN HIEROGLYPH A316ANATOLIAN HIER") + ("" + - "OGLYPH A317ANATOLIAN HIEROGLYPH A318ANATOLIAN HIEROGLYPH A319ANATOLIAN H" + - "IEROGLYPH A320ANATOLIAN HIEROGLYPH A321ANATOLIAN HIEROGLYPH A322ANATOLIA" + - "N HIEROGLYPH A323ANATOLIAN HIEROGLYPH A324ANATOLIAN HIEROGLYPH A325ANATO" + - "LIAN HIEROGLYPH A326ANATOLIAN HIEROGLYPH A327ANATOLIAN HIEROGLYPH A328AN" + - "ATOLIAN HIEROGLYPH A329ANATOLIAN HIEROGLYPH A329AANATOLIAN HIEROGLYPH A3" + - "30ANATOLIAN HIEROGLYPH A331ANATOLIAN HIEROGLYPH A332AANATOLIAN HIEROGLYP" + - "H A332BANATOLIAN HIEROGLYPH A332CANATOLIAN HIEROGLYPH A333ANATOLIAN HIER" + - "OGLYPH A334ANATOLIAN HIEROGLYPH A335ANATOLIAN HIEROGLYPH A336ANATOLIAN H" + - "IEROGLYPH A336AANATOLIAN HIEROGLYPH A336BANATOLIAN HIEROGLYPH A336CANATO" + - "LIAN HIEROGLYPH A337ANATOLIAN HIEROGLYPH A338ANATOLIAN HIEROGLYPH A339AN" + - "ATOLIAN HIEROGLYPH A340ANATOLIAN HIEROGLYPH A341ANATOLIAN HIEROGLYPH A34" + - "2ANATOLIAN HIEROGLYPH A343ANATOLIAN HIEROGLYPH A344ANATOLIAN HIEROGLYPH " + - "A345ANATOLIAN HIEROGLYPH A346ANATOLIAN HIEROGLYPH A347ANATOLIAN HIEROGLY" + - "PH A348ANATOLIAN HIEROGLYPH A349ANATOLIAN HIEROGLYPH A350ANATOLIAN HIERO" + - "GLYPH A351ANATOLIAN HIEROGLYPH A352ANATOLIAN HIEROGLYPH A353ANATOLIAN HI" + - "EROGLYPH A354ANATOLIAN HIEROGLYPH A355ANATOLIAN HIEROGLYPH A356ANATOLIAN" + - " HIEROGLYPH A357ANATOLIAN HIEROGLYPH A358ANATOLIAN HIEROGLYPH A359ANATOL" + - "IAN HIEROGLYPH A359AANATOLIAN HIEROGLYPH A360ANATOLIAN HIEROGLYPH A361AN" + - "ATOLIAN HIEROGLYPH A362ANATOLIAN HIEROGLYPH A363ANATOLIAN HIEROGLYPH A36" + - "4ANATOLIAN HIEROGLYPH A364AANATOLIAN HIEROGLYPH A365ANATOLIAN HIEROGLYPH" + - " A366ANATOLIAN HIEROGLYPH A367ANATOLIAN HIEROGLYPH A368ANATOLIAN HIEROGL" + - "YPH A368AANATOLIAN HIEROGLYPH A369ANATOLIAN HIEROGLYPH A370ANATOLIAN HIE" + - "ROGLYPH A371ANATOLIAN HIEROGLYPH A371AANATOLIAN HIEROGLYPH A372ANATOLIAN" + - " HIEROGLYPH A373ANATOLIAN HIEROGLYPH A374ANATOLIAN HIEROGLYPH A375ANATOL" + - "IAN HIEROGLYPH A376ANATOLIAN HIEROGLYPH A377ANATOLIAN HIEROGLYPH A378ANA" + - "TOLIAN HIEROGLYPH A379ANATOLIAN HIEROGLYPH A380ANATOLIAN HIEROGLYPH A381" + - "ANATOLIAN HIEROGLYPH A381AANATOLIAN HIEROGLYPH A382ANATOLIAN HIEROGLYPH " + - "A383 RA OR RIANATOLIAN HIEROGLYPH A383AANATOLIAN HIEROGLYPH A384ANATOLIA" + - "N HIEROGLYPH A385ANATOLIAN HIEROGLYPH A386ANATOLIAN HIEROGLYPH A386AANAT" + - "OLIAN HIEROGLYPH A387ANATOLIAN HIEROGLYPH A388ANATOLIAN HIEROGLYPH A389A" + - "NATOLIAN HIEROGLYPH A390ANATOLIAN HIEROGLYPH A391ANATOLIAN HIEROGLYPH A3" + - "92ANATOLIAN HIEROGLYPH A393 EIGHTANATOLIAN HIEROGLYPH A394ANATOLIAN HIER" + - "OGLYPH A395ANATOLIAN HIEROGLYPH A396ANATOLIAN HIEROGLYPH A397ANATOLIAN H" + - "IEROGLYPH A398ANATOLIAN HIEROGLYPH A399ANATOLIAN HIEROGLYPH A400ANATOLIA" + - "N HIEROGLYPH A401ANATOLIAN HIEROGLYPH A402ANATOLIAN HIEROGLYPH A403ANATO" + - "LIAN HIEROGLYPH A404ANATOLIAN HIEROGLYPH A405ANATOLIAN HIEROGLYPH A406AN" + - "ATOLIAN HIEROGLYPH A407ANATOLIAN HIEROGLYPH A408ANATOLIAN HIEROGLYPH A40" + - "9ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARKANATOLIAN HIEROGLYPH A410A" + - " END LOGOGRAM MARKANATOLIAN HIEROGLYPH A411ANATOLIAN HIEROGLYPH A412ANAT" + - "OLIAN HIEROGLYPH A413ANATOLIAN HIEROGLYPH A414ANATOLIAN HIEROGLYPH A415A" + - "NATOLIAN HIEROGLYPH A416ANATOLIAN HIEROGLYPH A417ANATOLIAN HIEROGLYPH A4" + - "18ANATOLIAN HIEROGLYPH A419ANATOLIAN HIEROGLYPH A420ANATOLIAN HIEROGLYPH" + - " A421ANATOLIAN HIEROGLYPH A422ANATOLIAN HIEROGLYPH A423ANATOLIAN HIEROGL" + - "YPH A424ANATOLIAN HIEROGLYPH A425ANATOLIAN HIEROGLYPH A426ANATOLIAN HIER" + - "OGLYPH A427ANATOLIAN HIEROGLYPH A428ANATOLIAN HIEROGLYPH A429ANATOLIAN H" + - "IEROGLYPH A430ANATOLIAN HIEROGLYPH A431ANATOLIAN HIEROGLYPH A432ANATOLIA" + - "N HIEROGLYPH A433ANATOLIAN HIEROGLYPH A434ANATOLIAN HIEROGLYPH A435ANATO" + - "LIAN HIEROGLYPH A436ANATOLIAN HIEROGLYPH A437ANATOLIAN HIEROGLYPH A438AN" + - "ATOLIAN HIEROGLYPH A439ANATOLIAN HIEROGLYPH A440ANATOLIAN HIEROGLYPH A44" + - "1ANATOLIAN HIEROGLYPH A442ANATOLIAN HIEROGLYPH A443ANATOLIAN HIEROGLYPH " + - "A444ANATOLIAN HIEROGLYPH A445ANATOLIAN HIEROGLYPH A446ANATOLIAN HIEROGLY" + - "PH A447ANATOLIAN HIEROGLYPH A448ANATOLIAN HIEROGLYPH A449ANATOLIAN HIERO" + - "GLYPH A450ANATOLIAN HIEROGLYPH A450AANATOLIAN HIEROGLYPH A451ANATOLIAN H" + - "IEROGLYPH A452ANATOLIAN HIEROGLYPH A453ANATOLIAN HIEROGLYPH A454ANATOLIA" + - "N HIEROGLYPH A455ANATOLIAN HIEROGLYPH A456ANATOLIAN HIEROGLYPH A457ANATO" + - "LIAN HIEROGLYPH A457AANATOLIAN HIEROGLYPH A458ANATOLIAN HIEROGLYPH A459A" + - "NATOLIAN HIEROGLYPH A460ANATOLIAN HIEROGLYPH A461ANATOLIAN HIEROGLYPH A4" + - "62ANATOLIAN HIEROGLYPH A463ANATOLIAN HIEROGLYPH A464ANATOLIAN HIEROGLYPH" + - " A465ANATOLIAN HIEROGLYPH A466ANATOLIAN HIEROGLYPH A467ANATOLIAN HIEROGL" + - "YPH A468ANATOLIAN HIEROGLYPH A469ANATOLIAN HIEROGLYPH A470ANATOLIAN HIER" + - "OGLYPH A471ANATOLIAN HIEROGLYPH A472ANATOLIAN HIEROGLYPH A473ANATOLIAN H" + - "IEROGLYPH A474ANATOLIAN HIEROGLYPH A475ANATOLIAN HIEROGLYPH A476ANATOLIA" + - "N HIEROGLYPH A477ANATOLIAN HIEROGLYPH A478ANATOLIAN HIEROGLYPH A479ANATO" + - "LIAN HIEROGLYPH A480ANATOLIAN HIEROGLYPH A481ANATOLIAN HIEROGLYPH A482AN") + ("" + - "ATOLIAN HIEROGLYPH A483ANATOLIAN HIEROGLYPH A484ANATOLIAN HIEROGLYPH A48" + - "5ANATOLIAN HIEROGLYPH A486ANATOLIAN HIEROGLYPH A487ANATOLIAN HIEROGLYPH " + - "A488ANATOLIAN HIEROGLYPH A489ANATOLIAN HIEROGLYPH A490ANATOLIAN HIEROGLY" + - "PH A491ANATOLIAN HIEROGLYPH A492ANATOLIAN HIEROGLYPH A493ANATOLIAN HIERO" + - "GLYPH A494ANATOLIAN HIEROGLYPH A495ANATOLIAN HIEROGLYPH A496ANATOLIAN HI" + - "EROGLYPH A497ANATOLIAN HIEROGLYPH A501ANATOLIAN HIEROGLYPH A502ANATOLIAN" + - " HIEROGLYPH A503ANATOLIAN HIEROGLYPH A504ANATOLIAN HIEROGLYPH A505ANATOL" + - "IAN HIEROGLYPH A506ANATOLIAN HIEROGLYPH A507ANATOLIAN HIEROGLYPH A508ANA" + - "TOLIAN HIEROGLYPH A509ANATOLIAN HIEROGLYPH A510ANATOLIAN HIEROGLYPH A511" + - "ANATOLIAN HIEROGLYPH A512ANATOLIAN HIEROGLYPH A513ANATOLIAN HIEROGLYPH A" + - "514ANATOLIAN HIEROGLYPH A515ANATOLIAN HIEROGLYPH A516ANATOLIAN HIEROGLYP" + - "H A517ANATOLIAN HIEROGLYPH A518ANATOLIAN HIEROGLYPH A519ANATOLIAN HIEROG" + - "LYPH A520ANATOLIAN HIEROGLYPH A521ANATOLIAN HIEROGLYPH A522ANATOLIAN HIE" + - "ROGLYPH A523ANATOLIAN HIEROGLYPH A524ANATOLIAN HIEROGLYPH A525ANATOLIAN " + - "HIEROGLYPH A526ANATOLIAN HIEROGLYPH A527ANATOLIAN HIEROGLYPH A528ANATOLI" + - "AN HIEROGLYPH A529ANATOLIAN HIEROGLYPH A530BAMUM LETTER PHASE-A NGKUE MF" + - "ONBAMUM LETTER PHASE-A GBIEE FONBAMUM LETTER PHASE-A PON MFON PIPAEMGBIE" + - "EBAMUM LETTER PHASE-A PON MFON PIPAEMBABAMUM LETTER PHASE-A NAA MFONBAMU" + - "M LETTER PHASE-A SHUENSHUETBAMUM LETTER PHASE-A TITA MFONBAMUM LETTER PH" + - "ASE-A NZA MFONBAMUM LETTER PHASE-A SHINDA PA NJIBAMUM LETTER PHASE-A PON" + - " PA NJI PIPAEMGBIEEBAMUM LETTER PHASE-A PON PA NJI PIPAEMBABAMUM LETTER " + - "PHASE-A MAEMBGBIEEBAMUM LETTER PHASE-A TU MAEMBABAMUM LETTER PHASE-A NGA" + - "NGUBAMUM LETTER PHASE-A MAEMVEUXBAMUM LETTER PHASE-A MANSUAEBAMUM LETTER" + - " PHASE-A MVEUAENGAMBAMUM LETTER PHASE-A SEUNYAMBAMUM LETTER PHASE-A NTOQ" + - "PENBAMUM LETTER PHASE-A KEUKEUTNDABAMUM LETTER PHASE-A NKINDIBAMUM LETTE" + - "R PHASE-A SUUBAMUM LETTER PHASE-A NGKUENZEUMBAMUM LETTER PHASE-A LAPAQBA" + - "MUM LETTER PHASE-A LET KUTBAMUM LETTER PHASE-A NTAP MFAABAMUM LETTER PHA" + - "SE-A MAEKEUPBAMUM LETTER PHASE-A PASHAEBAMUM LETTER PHASE-A GHEUAERAEBAM" + - "UM LETTER PHASE-A PAMSHAEBAMUM LETTER PHASE-A MON NGGEUAETBAMUM LETTER P" + - "HASE-A NZUN MEUTBAMUM LETTER PHASE-A U YUQ NAEBAMUM LETTER PHASE-A GHEUA" + - "EGHEUAEBAMUM LETTER PHASE-A NTAP NTAABAMUM LETTER PHASE-A SISABAMUM LETT" + - "ER PHASE-A MGBASABAMUM LETTER PHASE-A MEUNJOMNDEUQBAMUM LETTER PHASE-A M" + - "OOMPUQBAMUM LETTER PHASE-A KAFABAMUM LETTER PHASE-A PA LEERAEWABAMUM LET" + - "TER PHASE-A NDA LEERAEWABAMUM LETTER PHASE-A PETBAMUM LETTER PHASE-A MAE" + - "MKPENBAMUM LETTER PHASE-A NIKABAMUM LETTER PHASE-A PUPBAMUM LETTER PHASE" + - "-A TUAEPBAMUM LETTER PHASE-A LUAEPBAMUM LETTER PHASE-A SONJAMBAMUM LETTE" + - "R PHASE-A TEUTEUWENBAMUM LETTER PHASE-A MAENYIBAMUM LETTER PHASE-A KETBA" + - "MUM LETTER PHASE-A NDAANGGEUAETBAMUM LETTER PHASE-A KUOQBAMUM LETTER PHA" + - "SE-A MOOMEUTBAMUM LETTER PHASE-A SHUMBAMUM LETTER PHASE-A LOMMAEBAMUM LE" + - "TTER PHASE-A FIRIBAMUM LETTER PHASE-A ROMBAMUM LETTER PHASE-A KPOQBAMUM " + - "LETTER PHASE-A SOQBAMUM LETTER PHASE-A MAP PIEETBAMUM LETTER PHASE-A SHI" + - "RAEBAMUM LETTER PHASE-A NTAPBAMUM LETTER PHASE-A SHOQ NSHUT YUMBAMUM LET" + - "TER PHASE-A NYIT MONGKEUAEQBAMUM LETTER PHASE-A PAARAEBAMUM LETTER PHASE" + - "-A NKAARAEBAMUM LETTER PHASE-A UNKNOWNBAMUM LETTER PHASE-A NGGENBAMUM LE" + - "TTER PHASE-A MAESIBAMUM LETTER PHASE-A NJAMBAMUM LETTER PHASE-A MBANYIBA" + - "MUM LETTER PHASE-A NYETBAMUM LETTER PHASE-A TEUAENBAMUM LETTER PHASE-A S" + - "OTBAMUM LETTER PHASE-A PAAMBAMUM LETTER PHASE-A NSHIEEBAMUM LETTER PHASE" + - "-A MAEMBAMUM LETTER PHASE-A NYIBAMUM LETTER PHASE-A KAQBAMUM LETTER PHAS" + - "E-A NSHABAMUM LETTER PHASE-A VEEBAMUM LETTER PHASE-A LUBAMUM LETTER PHAS" + - "E-A NENBAMUM LETTER PHASE-A NAQBAMUM LETTER PHASE-A MBAQBAMUM LETTER PHA" + - "SE-B NSHUETBAMUM LETTER PHASE-B TU MAEMGBIEEBAMUM LETTER PHASE-B SIEEBAM" + - "UM LETTER PHASE-B SET TUBAMUM LETTER PHASE-B LOM NTEUMBAMUM LETTER PHASE" + - "-B MBA MAELEEBAMUM LETTER PHASE-B KIEEMBAMUM LETTER PHASE-B YEURAEBAMUM " + - "LETTER PHASE-B MBAARAEBAMUM LETTER PHASE-B KAMBAMUM LETTER PHASE-B PEESH" + - "IBAMUM LETTER PHASE-B YAFU LEERAEWABAMUM LETTER PHASE-B LAM NSHUT NYAMBA" + - "MUM LETTER PHASE-B NTIEE SHEUOQBAMUM LETTER PHASE-B NDU NJAABAMUM LETTER" + - " PHASE-B GHEUGHEUAEMBAMUM LETTER PHASE-B PITBAMUM LETTER PHASE-B TU NSIE" + - "EBAMUM LETTER PHASE-B SHET NJAQBAMUM LETTER PHASE-B SHEUAEQTUBAMUM LETTE" + - "R PHASE-B MFON TEUAEQBAMUM LETTER PHASE-B MBIT MBAAKETBAMUM LETTER PHASE" + - "-B NYI NTEUMBAMUM LETTER PHASE-B KEUPUQBAMUM LETTER PHASE-B GHEUGHENBAMU" + - "M LETTER PHASE-B KEUYEUXBAMUM LETTER PHASE-B LAANAEBAMUM LETTER PHASE-B " + - "PARUMBAMUM LETTER PHASE-B VEUMBAMUM LETTER PHASE-B NGKINDI MVOPBAMUM LET" + - "TER PHASE-B NGGEU MBUBAMUM LETTER PHASE-B WUAETBAMUM LETTER PHASE-B SAKE" + - "UAEBAMUM LETTER PHASE-B TAAMBAMUM LETTER PHASE-B MEUQBAMUM LETTER PHASE-") + ("" + - "B NGGUOQBAMUM LETTER PHASE-B NGGUOQ LARGEBAMUM LETTER PHASE-B MFIYAQBAMU" + - "M LETTER PHASE-B SUEBAMUM LETTER PHASE-B MBEURIBAMUM LETTER PHASE-B MONT" + - "IEENBAMUM LETTER PHASE-B NYAEMAEBAMUM LETTER PHASE-B PUNGAAMBAMUM LETTER" + - " PHASE-B MEUT NGGEETBAMUM LETTER PHASE-B FEUXBAMUM LETTER PHASE-B MBUOQB" + - "AMUM LETTER PHASE-B FEEBAMUM LETTER PHASE-B KEUAEMBAMUM LETTER PHASE-B M" + - "A NJEUAENABAMUM LETTER PHASE-B MA NJUQABAMUM LETTER PHASE-B LETBAMUM LET" + - "TER PHASE-B NGGAAMBAMUM LETTER PHASE-B NSENBAMUM LETTER PHASE-B MABAMUM " + - "LETTER PHASE-B KIQBAMUM LETTER PHASE-B NGOMBAMUM LETTER PHASE-C NGKUE MA" + - "EMBABAMUM LETTER PHASE-C NZABAMUM LETTER PHASE-C YUMBAMUM LETTER PHASE-C" + - " WANGKUOQBAMUM LETTER PHASE-C NGGENBAMUM LETTER PHASE-C NDEUAEREEBAMUM L" + - "ETTER PHASE-C NGKAQBAMUM LETTER PHASE-C GHARAEBAMUM LETTER PHASE-C MBEEK" + - "EETBAMUM LETTER PHASE-C GBAYIBAMUM LETTER PHASE-C NYIR MKPARAQ MEUNBAMUM" + - " LETTER PHASE-C NTU MBITBAMUM LETTER PHASE-C MBEUMBAMUM LETTER PHASE-C P" + - "IRIEENBAMUM LETTER PHASE-C NDOMBUBAMUM LETTER PHASE-C MBAA CABBAGE-TREEB" + - "AMUM LETTER PHASE-C KEUSHEUAEPBAMUM LETTER PHASE-C GHAPBAMUM LETTER PHAS" + - "E-C KEUKAQBAMUM LETTER PHASE-C YU MUOMAEBAMUM LETTER PHASE-C NZEUMBAMUM " + - "LETTER PHASE-C MBUEBAMUM LETTER PHASE-C NSEUAENBAMUM LETTER PHASE-C MBIT" + - "BAMUM LETTER PHASE-C YEUQBAMUM LETTER PHASE-C KPARAQBAMUM LETTER PHASE-C" + - " KAABAMUM LETTER PHASE-C SEUXBAMUM LETTER PHASE-C NDIDABAMUM LETTER PHAS" + - "E-C TAASHAEBAMUM LETTER PHASE-C NJUEQBAMUM LETTER PHASE-C TITA YUEBAMUM " + - "LETTER PHASE-C SUAETBAMUM LETTER PHASE-C NGGUAEN NYAMBAMUM LETTER PHASE-" + - "C VEUXBAMUM LETTER PHASE-C NANSANAQBAMUM LETTER PHASE-C MA KEUAERIBAMUM " + - "LETTER PHASE-C NTAABAMUM LETTER PHASE-C NGGUONBAMUM LETTER PHASE-C LAPBA" + - "MUM LETTER PHASE-C MBIRIEENBAMUM LETTER PHASE-C MGBASAQBAMUM LETTER PHAS" + - "E-C NTEUNGBABAMUM LETTER PHASE-C TEUTEUXBAMUM LETTER PHASE-C NGGUMBAMUM " + - "LETTER PHASE-C FUEBAMUM LETTER PHASE-C NDEUTBAMUM LETTER PHASE-C NSABAMU" + - "M LETTER PHASE-C NSHAQBAMUM LETTER PHASE-C BUNGBAMUM LETTER PHASE-C VEUA" + - "EPENBAMUM LETTER PHASE-C MBERAEBAMUM LETTER PHASE-C RUBAMUM LETTER PHASE" + - "-C NJAEMBAMUM LETTER PHASE-C LAMBAMUM LETTER PHASE-C TITUAEPBAMUM LETTER" + - " PHASE-C NSUOT NGOMBAMUM LETTER PHASE-C NJEEEEBAMUM LETTER PHASE-C KETBA" + - "MUM LETTER PHASE-C NGGUBAMUM LETTER PHASE-C MAESIBAMUM LETTER PHASE-C MB" + - "UAEMBAMUM LETTER PHASE-C LUBAMUM LETTER PHASE-C KUTBAMUM LETTER PHASE-C " + - "NJAMBAMUM LETTER PHASE-C NGOMBAMUM LETTER PHASE-C WUPBAMUM LETTER PHASE-" + - "C NGGUEETBAMUM LETTER PHASE-C NSOMBAMUM LETTER PHASE-C NTENBAMUM LETTER " + - "PHASE-C KUOP NKAARAEBAMUM LETTER PHASE-C NSUNBAMUM LETTER PHASE-C NDAMBA" + - "MUM LETTER PHASE-C MA NSIEEBAMUM LETTER PHASE-C YAABAMUM LETTER PHASE-C " + - "NDAPBAMUM LETTER PHASE-C SHUEQBAMUM LETTER PHASE-C SETFONBAMUM LETTER PH" + - "ASE-C MBIBAMUM LETTER PHASE-C MAEMBABAMUM LETTER PHASE-C MBANYIBAMUM LET" + - "TER PHASE-C KEUSEUXBAMUM LETTER PHASE-C MBEUXBAMUM LETTER PHASE-C KEUMBA" + - "MUM LETTER PHASE-C MBAA PICKETBAMUM LETTER PHASE-C YUWOQBAMUM LETTER PHA" + - "SE-C NJEUXBAMUM LETTER PHASE-C MIEEBAMUM LETTER PHASE-C MUAEBAMUM LETTER" + - " PHASE-C SHIQBAMUM LETTER PHASE-C KEN LAWBAMUM LETTER PHASE-C KEN FATIGU" + - "EBAMUM LETTER PHASE-C NGAQBAMUM LETTER PHASE-C NAQBAMUM LETTER PHASE-C L" + - "IQBAMUM LETTER PHASE-C PINBAMUM LETTER PHASE-C PENBAMUM LETTER PHASE-C T" + - "ETBAMUM LETTER PHASE-D MBUOBAMUM LETTER PHASE-D WAPBAMUM LETTER PHASE-D " + - "NJIBAMUM LETTER PHASE-D MFONBAMUM LETTER PHASE-D NJIEEBAMUM LETTER PHASE" + - "-D LIEEBAMUM LETTER PHASE-D NJEUTBAMUM LETTER PHASE-D NSHEEBAMUM LETTER " + - "PHASE-D NGGAAMAEBAMUM LETTER PHASE-D NYAMBAMUM LETTER PHASE-D WUAENBAMUM" + - " LETTER PHASE-D NGKUNBAMUM LETTER PHASE-D SHEEBAMUM LETTER PHASE-D NGKAP" + - "BAMUM LETTER PHASE-D KEUAETMEUNBAMUM LETTER PHASE-D TEUTBAMUM LETTER PHA" + - "SE-D SHEUAEBAMUM LETTER PHASE-D NJAPBAMUM LETTER PHASE-D SUEBAMUM LETTER" + - " PHASE-D KETBAMUM LETTER PHASE-D YAEMMAEBAMUM LETTER PHASE-D KUOMBAMUM L" + - "ETTER PHASE-D SAPBAMUM LETTER PHASE-D MFEUTBAMUM LETTER PHASE-D NDEUXBAM" + - "UM LETTER PHASE-D MALEERIBAMUM LETTER PHASE-D MEUTBAMUM LETTER PHASE-D S" + - "EUAEQBAMUM LETTER PHASE-D YENBAMUM LETTER PHASE-D NJEUAEMBAMUM LETTER PH" + - "ASE-D KEUOT MBUAEBAMUM LETTER PHASE-D NGKEURIBAMUM LETTER PHASE-D TUBAMU" + - "M LETTER PHASE-D GHAABAMUM LETTER PHASE-D NGKYEEBAMUM LETTER PHASE-D FEU" + - "FEUAETBAMUM LETTER PHASE-D NDEEBAMUM LETTER PHASE-D MGBOFUMBAMUM LETTER " + - "PHASE-D LEUAEPBAMUM LETTER PHASE-D NDONBAMUM LETTER PHASE-D MONIBAMUM LE" + - "TTER PHASE-D MGBEUNBAMUM LETTER PHASE-D PUUTBAMUM LETTER PHASE-D MGBIEEB" + - "AMUM LETTER PHASE-D MFOBAMUM LETTER PHASE-D LUMBAMUM LETTER PHASE-D NSIE" + - "EPBAMUM LETTER PHASE-D MBAABAMUM LETTER PHASE-D KWAETBAMUM LETTER PHASE-" + - "D NYETBAMUM LETTER PHASE-D TEUAENBAMUM LETTER PHASE-D SOTBAMUM LETTER PH" + - "ASE-D YUWOQBAMUM LETTER PHASE-D KEUMBAMUM LETTER PHASE-D RAEMBAMUM LETTE") + ("" + - "R PHASE-D TEEEEBAMUM LETTER PHASE-D NGKEUAEQBAMUM LETTER PHASE-D MFEUAEB" + - "AMUM LETTER PHASE-D NSIEETBAMUM LETTER PHASE-D KEUPBAMUM LETTER PHASE-D " + - "PIPBAMUM LETTER PHASE-D PEUTAEBAMUM LETTER PHASE-D NYUEBAMUM LETTER PHAS" + - "E-D LETBAMUM LETTER PHASE-D NGGAAMBAMUM LETTER PHASE-D MFIEEBAMUM LETTER" + - " PHASE-D NGGWAENBAMUM LETTER PHASE-D YUOMBAMUM LETTER PHASE-D PAPBAMUM L" + - "ETTER PHASE-D YUOPBAMUM LETTER PHASE-D NDAMBAMUM LETTER PHASE-D NTEUMBAM" + - "UM LETTER PHASE-D SUAEBAMUM LETTER PHASE-D KUNBAMUM LETTER PHASE-D NGGEU" + - "XBAMUM LETTER PHASE-D NGKIEEBAMUM LETTER PHASE-D TUOTBAMUM LETTER PHASE-" + - "D MEUNBAMUM LETTER PHASE-D KUQBAMUM LETTER PHASE-D NSUMBAMUM LETTER PHAS" + - "E-D TEUNBAMUM LETTER PHASE-D MAENJETBAMUM LETTER PHASE-D NGGAPBAMUM LETT" + - "ER PHASE-D LEUMBAMUM LETTER PHASE-D NGGUOMBAMUM LETTER PHASE-D NSHUTBAMU" + - "M LETTER PHASE-D NJUEQBAMUM LETTER PHASE-D GHEUAEBAMUM LETTER PHASE-D KU" + - "BAMUM LETTER PHASE-D REN OLDBAMUM LETTER PHASE-D TAEBAMUM LETTER PHASE-D" + - " TOQBAMUM LETTER PHASE-D NYIBAMUM LETTER PHASE-D RIIBAMUM LETTER PHASE-D" + - " LEEEEBAMUM LETTER PHASE-D MEEEEBAMUM LETTER PHASE-D MBAMUM LETTER PHASE" + - "-D SUUBAMUM LETTER PHASE-D MUBAMUM LETTER PHASE-D SHIIBAMUM LETTER PHASE" + - "-D SHEUXBAMUM LETTER PHASE-D KYEEBAMUM LETTER PHASE-D NUBAMUM LETTER PHA" + - "SE-D SHUBAMUM LETTER PHASE-D NTEEBAMUM LETTER PHASE-D PEEBAMUM LETTER PH" + - "ASE-D NIBAMUM LETTER PHASE-D SHOQBAMUM LETTER PHASE-D PUQBAMUM LETTER PH" + - "ASE-D MVOPBAMUM LETTER PHASE-D LOQBAMUM LETTER PHASE-D REN MUCHBAMUM LET" + - "TER PHASE-D TIBAMUM LETTER PHASE-D NTUUBAMUM LETTER PHASE-D MBAA SEVENBA" + - "MUM LETTER PHASE-D SAQBAMUM LETTER PHASE-D FAABAMUM LETTER PHASE-E NDAPB" + - "AMUM LETTER PHASE-E TOONBAMUM LETTER PHASE-E MBEUMBAMUM LETTER PHASE-E L" + - "APBAMUM LETTER PHASE-E VOMBAMUM LETTER PHASE-E LOONBAMUM LETTER PHASE-E " + - "PAABAMUM LETTER PHASE-E SOMBAMUM LETTER PHASE-E RAQBAMUM LETTER PHASE-E " + - "NSHUOPBAMUM LETTER PHASE-E NDUNBAMUM LETTER PHASE-E PUAEBAMUM LETTER PHA" + - "SE-E TAMBAMUM LETTER PHASE-E NGKABAMUM LETTER PHASE-E KPEUXBAMUM LETTER " + - "PHASE-E WUOBAMUM LETTER PHASE-E SEEBAMUM LETTER PHASE-E NGGEUAETBAMUM LE" + - "TTER PHASE-E PAAMBAMUM LETTER PHASE-E TOOBAMUM LETTER PHASE-E KUOPBAMUM " + - "LETTER PHASE-E LOMBAMUM LETTER PHASE-E NSHIEEBAMUM LETTER PHASE-E NGOPBA" + - "MUM LETTER PHASE-E MAEMBAMUM LETTER PHASE-E NGKEUXBAMUM LETTER PHASE-E N" + - "GOQBAMUM LETTER PHASE-E NSHUEBAMUM LETTER PHASE-E RIMGBABAMUM LETTER PHA" + - "SE-E NJEUXBAMUM LETTER PHASE-E PEEMBAMUM LETTER PHASE-E SAABAMUM LETTER " + - "PHASE-E NGGURAEBAMUM LETTER PHASE-E MGBABAMUM LETTER PHASE-E GHEUXBAMUM " + - "LETTER PHASE-E NGKEUAEMBAMUM LETTER PHASE-E NJAEMLIBAMUM LETTER PHASE-E " + - "MAPBAMUM LETTER PHASE-E LOOTBAMUM LETTER PHASE-E NGGEEEEBAMUM LETTER PHA" + - "SE-E NDIQBAMUM LETTER PHASE-E TAEN NTEUMBAMUM LETTER PHASE-E SETBAMUM LE" + - "TTER PHASE-E PUMBAMUM LETTER PHASE-E NDAA SOFTNESSBAMUM LETTER PHASE-E N" + - "GGUAESHAE NYAMBAMUM LETTER PHASE-E YIEEBAMUM LETTER PHASE-E GHEUNBAMUM L" + - "ETTER PHASE-E TUAEBAMUM LETTER PHASE-E YEUAEBAMUM LETTER PHASE-E POBAMUM" + - " LETTER PHASE-E TUMAEBAMUM LETTER PHASE-E KEUAEBAMUM LETTER PHASE-E SUAE" + - "NBAMUM LETTER PHASE-E TEUAEQBAMUM LETTER PHASE-E VEUAEBAMUM LETTER PHASE" + - "-E WEUXBAMUM LETTER PHASE-E LAAMBAMUM LETTER PHASE-E PUBAMUM LETTER PHAS" + - "E-E TAAQBAMUM LETTER PHASE-E GHAAMAEBAMUM LETTER PHASE-E NGEUREUTBAMUM L" + - "ETTER PHASE-E SHEUAEQBAMUM LETTER PHASE-E MGBENBAMUM LETTER PHASE-E MBEE" + - "BAMUM LETTER PHASE-E NZAQBAMUM LETTER PHASE-E NKOMBAMUM LETTER PHASE-E G" + - "BETBAMUM LETTER PHASE-E TUMBAMUM LETTER PHASE-E KUETBAMUM LETTER PHASE-E" + - " YAPBAMUM LETTER PHASE-E NYI CLEAVERBAMUM LETTER PHASE-E YITBAMUM LETTER" + - " PHASE-E MFEUQBAMUM LETTER PHASE-E NDIAQBAMUM LETTER PHASE-E PIEEQBAMUM " + - "LETTER PHASE-E YUEQBAMUM LETTER PHASE-E LEUAEMBAMUM LETTER PHASE-E FUEBA" + - "MUM LETTER PHASE-E GBEUXBAMUM LETTER PHASE-E NGKUPBAMUM LETTER PHASE-E K" + - "ETBAMUM LETTER PHASE-E MAEBAMUM LETTER PHASE-E NGKAAMIBAMUM LETTER PHASE" + - "-E GHETBAMUM LETTER PHASE-E FABAMUM LETTER PHASE-E NTUMBAMUM LETTER PHAS" + - "E-E PEUTBAMUM LETTER PHASE-E YEUMBAMUM LETTER PHASE-E NGGEUAEBAMUM LETTE" + - "R PHASE-E NYI BETWEENBAMUM LETTER PHASE-E NZUQBAMUM LETTER PHASE-E POONB" + - "AMUM LETTER PHASE-E MIEEBAMUM LETTER PHASE-E FUETBAMUM LETTER PHASE-E NA" + - "EBAMUM LETTER PHASE-E MUAEBAMUM LETTER PHASE-E GHEUAEBAMUM LETTER PHASE-" + - "E FU IBAMUM LETTER PHASE-E MVIBAMUM LETTER PHASE-E PUAQBAMUM LETTER PHAS" + - "E-E NGKUMBAMUM LETTER PHASE-E KUTBAMUM LETTER PHASE-E PIETBAMUM LETTER P" + - "HASE-E NTAPBAMUM LETTER PHASE-E YEUAETBAMUM LETTER PHASE-E NGGUPBAMUM LE" + - "TTER PHASE-E PA PEOPLEBAMUM LETTER PHASE-E FU CALLBAMUM LETTER PHASE-E F" + - "OMBAMUM LETTER PHASE-E NJEEBAMUM LETTER PHASE-E ABAMUM LETTER PHASE-E TO" + - "QBAMUM LETTER PHASE-E OBAMUM LETTER PHASE-E IBAMUM LETTER PHASE-E LAQBAM" + - "UM LETTER PHASE-E PA PLURALBAMUM LETTER PHASE-E TAABAMUM LETTER PHASE-E ") + ("" + - "TAQBAMUM LETTER PHASE-E NDAA MY HOUSEBAMUM LETTER PHASE-E SHIQBAMUM LETT" + - "ER PHASE-E YEUXBAMUM LETTER PHASE-E NGUAEBAMUM LETTER PHASE-E YUAENBAMUM" + - " LETTER PHASE-E YOQ SWIMMINGBAMUM LETTER PHASE-E YOQ COVERBAMUM LETTER P" + - "HASE-E YUQBAMUM LETTER PHASE-E YUNBAMUM LETTER PHASE-E KEUXBAMUM LETTER " + - "PHASE-E PEUXBAMUM LETTER PHASE-E NJEE EPOCHBAMUM LETTER PHASE-E PUEBAMUM" + - " LETTER PHASE-E WUEBAMUM LETTER PHASE-E FEEBAMUM LETTER PHASE-E VEEBAMUM" + - " LETTER PHASE-E LUBAMUM LETTER PHASE-E MIBAMUM LETTER PHASE-E REUXBAMUM " + - "LETTER PHASE-E RAEBAMUM LETTER PHASE-E NGUAETBAMUM LETTER PHASE-E NGABAM" + - "UM LETTER PHASE-E SHOBAMUM LETTER PHASE-E SHOQBAMUM LETTER PHASE-E FU RE" + - "MEDYBAMUM LETTER PHASE-E NABAMUM LETTER PHASE-E PIBAMUM LETTER PHASE-E L" + - "OQBAMUM LETTER PHASE-E KOBAMUM LETTER PHASE-E MENBAMUM LETTER PHASE-E MA" + - "BAMUM LETTER PHASE-E MAQBAMUM LETTER PHASE-E TEUBAMUM LETTER PHASE-E KIB" + - "AMUM LETTER PHASE-E MONBAMUM LETTER PHASE-E TENBAMUM LETTER PHASE-E FAQB" + - "AMUM LETTER PHASE-E GHOMBAMUM LETTER PHASE-F KABAMUM LETTER PHASE-F UBAM" + - "UM LETTER PHASE-F KUBAMUM LETTER PHASE-F EEBAMUM LETTER PHASE-F REEBAMUM" + - " LETTER PHASE-F TAEBAMUM LETTER PHASE-F NYIBAMUM LETTER PHASE-F LABAMUM " + - "LETTER PHASE-F RIIBAMUM LETTER PHASE-F RIEEBAMUM LETTER PHASE-F MEEEEBAM" + - "UM LETTER PHASE-F TAABAMUM LETTER PHASE-F NDAABAMUM LETTER PHASE-F NJAEM" + - "BAMUM LETTER PHASE-F MBAMUM LETTER PHASE-F SUUBAMUM LETTER PHASE-F SHIIB" + - "AMUM LETTER PHASE-F SIBAMUM LETTER PHASE-F SEUXBAMUM LETTER PHASE-F KYEE" + - "BAMUM LETTER PHASE-F KETBAMUM LETTER PHASE-F NUAEBAMUM LETTER PHASE-F NU" + - "BAMUM LETTER PHASE-F NJUAEBAMUM LETTER PHASE-F YOQBAMUM LETTER PHASE-F S" + - "HUBAMUM LETTER PHASE-F YABAMUM LETTER PHASE-F NSHABAMUM LETTER PHASE-F P" + - "EUXBAMUM LETTER PHASE-F NTEEBAMUM LETTER PHASE-F WUEBAMUM LETTER PHASE-F" + - " PEEBAMUM LETTER PHASE-F RUBAMUM LETTER PHASE-F NIBAMUM LETTER PHASE-F R" + - "EUXBAMUM LETTER PHASE-F KENBAMUM LETTER PHASE-F NGKWAENBAMUM LETTER PHAS" + - "E-F NGGABAMUM LETTER PHASE-F SHOBAMUM LETTER PHASE-F PUAEBAMUM LETTER PH" + - "ASE-F FOMBAMUM LETTER PHASE-F WABAMUM LETTER PHASE-F LIBAMUM LETTER PHAS" + - "E-F LOQBAMUM LETTER PHASE-F KOBAMUM LETTER PHASE-F MBENBAMUM LETTER PHAS" + - "E-F RENBAMUM LETTER PHASE-F MABAMUM LETTER PHASE-F MOBAMUM LETTER PHASE-" + - "F MBAABAMUM LETTER PHASE-F TETBAMUM LETTER PHASE-F KPABAMUM LETTER PHASE" + - "-F SAMBABAMUM LETTER PHASE-F VUEQMRO LETTER TAMRO LETTER NGIMRO LETTER Y" + - "OMRO LETTER MIMMRO LETTER BAMRO LETTER DAMRO LETTER AMRO LETTER PHIMRO L" + - "ETTER KHAIMRO LETTER HAOMRO LETTER DAIMRO LETTER CHUMRO LETTER KEAAEMRO " + - "LETTER OLMRO LETTER MAEMMRO LETTER NINMRO LETTER PAMRO LETTER OOMRO LETT" + - "ER OMRO LETTER ROMRO LETTER SHIMRO LETTER THEAMRO LETTER EAMRO LETTER WA" + - "MRO LETTER EMRO LETTER KOMRO LETTER LANMRO LETTER LAMRO LETTER HAIMRO LE" + - "TTER RIMRO LETTER TEKMRO DIGIT ZEROMRO DIGIT ONEMRO DIGIT TWOMRO DIGIT T" + - "HREEMRO DIGIT FOURMRO DIGIT FIVEMRO DIGIT SIXMRO DIGIT SEVENMRO DIGIT EI" + - "GHTMRO DIGIT NINEMRO DANDAMRO DOUBLE DANDABASSA VAH LETTER ENNIBASSA VAH" + - " LETTER KABASSA VAH LETTER SEBASSA VAH LETTER FABASSA VAH LETTER MBEBASS" + - "A VAH LETTER YIEBASSA VAH LETTER GAHBASSA VAH LETTER DHIIBASSA VAH LETTE" + - "R KPAHBASSA VAH LETTER JOBASSA VAH LETTER HWAHBASSA VAH LETTER WABASSA V" + - "AH LETTER ZOBASSA VAH LETTER GBUBASSA VAH LETTER DOBASSA VAH LETTER CEBA" + - "SSA VAH LETTER UWUBASSA VAH LETTER TOBASSA VAH LETTER BABASSA VAH LETTER" + - " VUBASSA VAH LETTER YEINBASSA VAH LETTER PABASSA VAH LETTER WADDABASSA V" + - "AH LETTER ABASSA VAH LETTER OBASSA VAH LETTER OOBASSA VAH LETTER UBASSA " + - "VAH LETTER EEBASSA VAH LETTER EBASSA VAH LETTER IBASSA VAH COMBINING HIG" + - "H TONEBASSA VAH COMBINING LOW TONEBASSA VAH COMBINING MID TONEBASSA VAH " + - "COMBINING LOW-MID TONEBASSA VAH COMBINING HIGH-LOW TONEBASSA VAH FULL ST" + - "OPPAHAWH HMONG VOWEL KEEBPAHAWH HMONG VOWEL KEEVPAHAWH HMONG VOWEL KIBPA" + - "HAWH HMONG VOWEL KIVPAHAWH HMONG VOWEL KAUBPAHAWH HMONG VOWEL KAUVPAHAWH" + - " HMONG VOWEL KUBPAHAWH HMONG VOWEL KUVPAHAWH HMONG VOWEL KEBPAHAWH HMONG" + - " VOWEL KEVPAHAWH HMONG VOWEL KAIBPAHAWH HMONG VOWEL KAIVPAHAWH HMONG VOW" + - "EL KOOBPAHAWH HMONG VOWEL KOOVPAHAWH HMONG VOWEL KAWBPAHAWH HMONG VOWEL " + - "KAWVPAHAWH HMONG VOWEL KUABPAHAWH HMONG VOWEL KUAVPAHAWH HMONG VOWEL KOB" + - "PAHAWH HMONG VOWEL KOVPAHAWH HMONG VOWEL KIABPAHAWH HMONG VOWEL KIAVPAHA" + - "WH HMONG VOWEL KABPAHAWH HMONG VOWEL KAVPAHAWH HMONG VOWEL KWBPAHAWH HMO" + - "NG VOWEL KWVPAHAWH HMONG VOWEL KAABPAHAWH HMONG VOWEL KAAVPAHAWH HMONG C" + - "ONSONANT VAUPAHAWH HMONG CONSONANT NTSAUPAHAWH HMONG CONSONANT LAUPAHAWH" + - " HMONG CONSONANT HAUPAHAWH HMONG CONSONANT NLAUPAHAWH HMONG CONSONANT RA" + - "UPAHAWH HMONG CONSONANT NKAUPAHAWH HMONG CONSONANT QHAUPAHAWH HMONG CONS" + - "ONANT YAUPAHAWH HMONG CONSONANT HLAUPAHAWH HMONG CONSONANT MAUPAHAWH HMO" + - "NG CONSONANT CHAUPAHAWH HMONG CONSONANT NCHAUPAHAWH HMONG CONSONANT HNAU") + ("" + - "PAHAWH HMONG CONSONANT PLHAUPAHAWH HMONG CONSONANT NTHAUPAHAWH HMONG CON" + - "SONANT NAUPAHAWH HMONG CONSONANT AUPAHAWH HMONG CONSONANT XAUPAHAWH HMON" + - "G CONSONANT CAUPAHAWH HMONG MARK CIM TUBPAHAWH HMONG MARK CIM SOPAHAWH H" + - "MONG MARK CIM KESPAHAWH HMONG MARK CIM KHAVPAHAWH HMONG MARK CIM SUAMPAH" + - "AWH HMONG MARK CIM HOMPAHAWH HMONG MARK CIM TAUMPAHAWH HMONG SIGN VOS TH" + - "OMPAHAWH HMONG SIGN VOS TSHAB CEEBPAHAWH HMONG SIGN CIM CHEEMPAHAWH HMON" + - "G SIGN VOS THIABPAHAWH HMONG SIGN VOS FEEMPAHAWH HMONG SIGN XYEEM NTXIVP" + - "AHAWH HMONG SIGN XYEEM RHOPAHAWH HMONG SIGN XYEEM TOVPAHAWH HMONG SIGN X" + - "YEEM FAIBPAHAWH HMONG SIGN VOS SEEVPAHAWH HMONG SIGN MEEJ SUABPAHAWH HMO" + - "NG SIGN VOS NRUAPAHAWH HMONG SIGN IB YAMPAHAWH HMONG SIGN XAUSPAHAWH HMO" + - "NG SIGN CIM TSOV ROGPAHAWH HMONG DIGIT ZEROPAHAWH HMONG DIGIT ONEPAHAWH " + - "HMONG DIGIT TWOPAHAWH HMONG DIGIT THREEPAHAWH HMONG DIGIT FOURPAHAWH HMO" + - "NG DIGIT FIVEPAHAWH HMONG DIGIT SIXPAHAWH HMONG DIGIT SEVENPAHAWH HMONG " + - "DIGIT EIGHTPAHAWH HMONG DIGIT NINEPAHAWH HMONG NUMBER TENSPAHAWH HMONG N" + - "UMBER HUNDREDSPAHAWH HMONG NUMBER TEN THOUSANDSPAHAWH HMONG NUMBER MILLI" + - "ONSPAHAWH HMONG NUMBER HUNDRED MILLIONSPAHAWH HMONG NUMBER TEN BILLIONSP" + - "AHAWH HMONG NUMBER TRILLIONSPAHAWH HMONG SIGN VOS LUBPAHAWH HMONG SIGN X" + - "YOOPAHAWH HMONG SIGN HLIPAHAWH HMONG SIGN THIRD-STAGE HLIPAHAWH HMONG SI" + - "GN ZWJ THAJPAHAWH HMONG SIGN HNUBPAHAWH HMONG SIGN NQIGPAHAWH HMONG SIGN" + - " XIABPAHAWH HMONG SIGN NTUJPAHAWH HMONG SIGN AVPAHAWH HMONG SIGN TXHEEJ " + - "CEEVPAHAWH HMONG SIGN MEEJ TSEEBPAHAWH HMONG SIGN TAUPAHAWH HMONG SIGN L" + - "OSPAHAWH HMONG SIGN MUSPAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOGPAHAWH HM" + - "ONG SIGN CIM CUAM TSHOOJPAHAWH HMONG SIGN CIM TXWVPAHAWH HMONG SIGN CIM " + - "TXWV CHWVPAHAWH HMONG SIGN CIM PUB DAWBPAHAWH HMONG SIGN CIM NRES TOSPAH" + - "AWH HMONG CLAN SIGN TSHEEJPAHAWH HMONG CLAN SIGN YEEGPAHAWH HMONG CLAN S" + - "IGN LISPAHAWH HMONG CLAN SIGN LAUJPAHAWH HMONG CLAN SIGN XYOOJPAHAWH HMO" + - "NG CLAN SIGN KOOPAHAWH HMONG CLAN SIGN HAWJPAHAWH HMONG CLAN SIGN MUASPA" + - "HAWH HMONG CLAN SIGN THOJPAHAWH HMONG CLAN SIGN TSABPAHAWH HMONG CLAN SI" + - "GN PHABPAHAWH HMONG CLAN SIGN KHABPAHAWH HMONG CLAN SIGN HAMPAHAWH HMONG" + - " CLAN SIGN VAJPAHAWH HMONG CLAN SIGN FAJPAHAWH HMONG CLAN SIGN YAJPAHAWH" + - " HMONG CLAN SIGN TSWBPAHAWH HMONG CLAN SIGN KWMPAHAWH HMONG CLAN SIGN VW" + - "JMIAO LETTER PAMIAO LETTER BAMIAO LETTER YI PAMIAO LETTER PLAMIAO LETTER" + - " MAMIAO LETTER MHAMIAO LETTER ARCHAIC MAMIAO LETTER FAMIAO LETTER VAMIAO" + - " LETTER VFAMIAO LETTER TAMIAO LETTER DAMIAO LETTER YI TTAMIAO LETTER YI " + - "TAMIAO LETTER TTAMIAO LETTER DDAMIAO LETTER NAMIAO LETTER NHAMIAO LETTER" + - " YI NNAMIAO LETTER ARCHAIC NAMIAO LETTER NNAMIAO LETTER NNHAMIAO LETTER " + - "LAMIAO LETTER LYAMIAO LETTER LHAMIAO LETTER LHYAMIAO LETTER TLHAMIAO LET" + - "TER DLHAMIAO LETTER TLHYAMIAO LETTER DLHYAMIAO LETTER KAMIAO LETTER GAMI" + - "AO LETTER YI KAMIAO LETTER QAMIAO LETTER QGAMIAO LETTER NGAMIAO LETTER N" + - "GHAMIAO LETTER ARCHAIC NGAMIAO LETTER HAMIAO LETTER XAMIAO LETTER GHAMIA" + - "O LETTER GHHAMIAO LETTER TSSAMIAO LETTER DZZAMIAO LETTER NYAMIAO LETTER " + - "NYHAMIAO LETTER TSHAMIAO LETTER DZHAMIAO LETTER YI TSHAMIAO LETTER YI DZ" + - "HAMIAO LETTER REFORMED TSHAMIAO LETTER SHAMIAO LETTER SSAMIAO LETTER ZHA" + - "MIAO LETTER ZSHAMIAO LETTER TSAMIAO LETTER DZAMIAO LETTER YI TSAMIAO LET" + - "TER SAMIAO LETTER ZAMIAO LETTER ZSAMIAO LETTER ZZAMIAO LETTER ZZSAMIAO L" + - "ETTER ARCHAIC ZZAMIAO LETTER ZZYAMIAO LETTER ZZSYAMIAO LETTER WAMIAO LET" + - "TER AHMIAO LETTER HHAMIAO LETTER NASALIZATIONMIAO SIGN ASPIRATIONMIAO SI" + - "GN REFORMED VOICINGMIAO SIGN REFORMED ASPIRATIONMIAO VOWEL SIGN AMIAO VO" + - "WEL SIGN AAMIAO VOWEL SIGN AHHMIAO VOWEL SIGN ANMIAO VOWEL SIGN ANGMIAO " + - "VOWEL SIGN OMIAO VOWEL SIGN OOMIAO VOWEL SIGN WOMIAO VOWEL SIGN WMIAO VO" + - "WEL SIGN EMIAO VOWEL SIGN ENMIAO VOWEL SIGN ENGMIAO VOWEL SIGN OEYMIAO V" + - "OWEL SIGN IMIAO VOWEL SIGN IAMIAO VOWEL SIGN IANMIAO VOWEL SIGN IANGMIAO" + - " VOWEL SIGN IOMIAO VOWEL SIGN IEMIAO VOWEL SIGN IIMIAO VOWEL SIGN IUMIAO" + - " VOWEL SIGN INGMIAO VOWEL SIGN UMIAO VOWEL SIGN UAMIAO VOWEL SIGN UANMIA" + - "O VOWEL SIGN UANGMIAO VOWEL SIGN UUMIAO VOWEL SIGN UEIMIAO VOWEL SIGN UN" + - "GMIAO VOWEL SIGN YMIAO VOWEL SIGN YIMIAO VOWEL SIGN AEMIAO VOWEL SIGN AE" + - "EMIAO VOWEL SIGN ERRMIAO VOWEL SIGN ROUNDED ERRMIAO VOWEL SIGN ERMIAO VO" + - "WEL SIGN ROUNDED ERMIAO VOWEL SIGN AIMIAO VOWEL SIGN EIMIAO VOWEL SIGN A" + - "UMIAO VOWEL SIGN OUMIAO VOWEL SIGN NMIAO VOWEL SIGN NGMIAO TONE RIGHTMIA" + - "O TONE TOP RIGHTMIAO TONE ABOVEMIAO TONE BELOWMIAO LETTER TONE-2MIAO LET" + - "TER TONE-3MIAO LETTER TONE-4MIAO LETTER TONE-5MIAO LETTER TONE-6MIAO LET" + - "TER TONE-7MIAO LETTER TONE-8MIAO LETTER REFORMED TONE-1MIAO LETTER REFOR" + - "MED TONE-2MIAO LETTER REFORMED TONE-4MIAO LETTER REFORMED TONE-5MIAO LET" + - "TER REFORMED TONE-6MIAO LETTER REFORMED TONE-8TANGUT ITERATION MARKTANGU") + ("" + - "T COMPONENT-001TANGUT COMPONENT-002TANGUT COMPONENT-003TANGUT COMPONENT-" + - "004TANGUT COMPONENT-005TANGUT COMPONENT-006TANGUT COMPONENT-007TANGUT CO" + - "MPONENT-008TANGUT COMPONENT-009TANGUT COMPONENT-010TANGUT COMPONENT-011T" + - "ANGUT COMPONENT-012TANGUT COMPONENT-013TANGUT COMPONENT-014TANGUT COMPON" + - "ENT-015TANGUT COMPONENT-016TANGUT COMPONENT-017TANGUT COMPONENT-018TANGU" + - "T COMPONENT-019TANGUT COMPONENT-020TANGUT COMPONENT-021TANGUT COMPONENT-" + - "022TANGUT COMPONENT-023TANGUT COMPONENT-024TANGUT COMPONENT-025TANGUT CO" + - "MPONENT-026TANGUT COMPONENT-027TANGUT COMPONENT-028TANGUT COMPONENT-029T" + - "ANGUT COMPONENT-030TANGUT COMPONENT-031TANGUT COMPONENT-032TANGUT COMPON" + - "ENT-033TANGUT COMPONENT-034TANGUT COMPONENT-035TANGUT COMPONENT-036TANGU" + - "T COMPONENT-037TANGUT COMPONENT-038TANGUT COMPONENT-039TANGUT COMPONENT-" + - "040TANGUT COMPONENT-041TANGUT COMPONENT-042TANGUT COMPONENT-043TANGUT CO" + - "MPONENT-044TANGUT COMPONENT-045TANGUT COMPONENT-046TANGUT COMPONENT-047T" + - "ANGUT COMPONENT-048TANGUT COMPONENT-049TANGUT COMPONENT-050TANGUT COMPON" + - "ENT-051TANGUT COMPONENT-052TANGUT COMPONENT-053TANGUT COMPONENT-054TANGU" + - "T COMPONENT-055TANGUT COMPONENT-056TANGUT COMPONENT-057TANGUT COMPONENT-" + - "058TANGUT COMPONENT-059TANGUT COMPONENT-060TANGUT COMPONENT-061TANGUT CO" + - "MPONENT-062TANGUT COMPONENT-063TANGUT COMPONENT-064TANGUT COMPONENT-065T" + - "ANGUT COMPONENT-066TANGUT COMPONENT-067TANGUT COMPONENT-068TANGUT COMPON" + - "ENT-069TANGUT COMPONENT-070TANGUT COMPONENT-071TANGUT COMPONENT-072TANGU" + - "T COMPONENT-073TANGUT COMPONENT-074TANGUT COMPONENT-075TANGUT COMPONENT-" + - "076TANGUT COMPONENT-077TANGUT COMPONENT-078TANGUT COMPONENT-079TANGUT CO" + - "MPONENT-080TANGUT COMPONENT-081TANGUT COMPONENT-082TANGUT COMPONENT-083T" + - "ANGUT COMPONENT-084TANGUT COMPONENT-085TANGUT COMPONENT-086TANGUT COMPON" + - "ENT-087TANGUT COMPONENT-088TANGUT COMPONENT-089TANGUT COMPONENT-090TANGU" + - "T COMPONENT-091TANGUT COMPONENT-092TANGUT COMPONENT-093TANGUT COMPONENT-" + - "094TANGUT COMPONENT-095TANGUT COMPONENT-096TANGUT COMPONENT-097TANGUT CO" + - "MPONENT-098TANGUT COMPONENT-099TANGUT COMPONENT-100TANGUT COMPONENT-101T" + - "ANGUT COMPONENT-102TANGUT COMPONENT-103TANGUT COMPONENT-104TANGUT COMPON" + - "ENT-105TANGUT COMPONENT-106TANGUT COMPONENT-107TANGUT COMPONENT-108TANGU" + - "T COMPONENT-109TANGUT COMPONENT-110TANGUT COMPONENT-111TANGUT COMPONENT-" + - "112TANGUT COMPONENT-113TANGUT COMPONENT-114TANGUT COMPONENT-115TANGUT CO" + - "MPONENT-116TANGUT COMPONENT-117TANGUT COMPONENT-118TANGUT COMPONENT-119T" + - "ANGUT COMPONENT-120TANGUT COMPONENT-121TANGUT COMPONENT-122TANGUT COMPON" + - "ENT-123TANGUT COMPONENT-124TANGUT COMPONENT-125TANGUT COMPONENT-126TANGU" + - "T COMPONENT-127TANGUT COMPONENT-128TANGUT COMPONENT-129TANGUT COMPONENT-" + - "130TANGUT COMPONENT-131TANGUT COMPONENT-132TANGUT COMPONENT-133TANGUT CO" + - "MPONENT-134TANGUT COMPONENT-135TANGUT COMPONENT-136TANGUT COMPONENT-137T" + - "ANGUT COMPONENT-138TANGUT COMPONENT-139TANGUT COMPONENT-140TANGUT COMPON" + - "ENT-141TANGUT COMPONENT-142TANGUT COMPONENT-143TANGUT COMPONENT-144TANGU" + - "T COMPONENT-145TANGUT COMPONENT-146TANGUT COMPONENT-147TANGUT COMPONENT-" + - "148TANGUT COMPONENT-149TANGUT COMPONENT-150TANGUT COMPONENT-151TANGUT CO" + - "MPONENT-152TANGUT COMPONENT-153TANGUT COMPONENT-154TANGUT COMPONENT-155T" + - "ANGUT COMPONENT-156TANGUT COMPONENT-157TANGUT COMPONENT-158TANGUT COMPON" + - "ENT-159TANGUT COMPONENT-160TANGUT COMPONENT-161TANGUT COMPONENT-162TANGU" + - "T COMPONENT-163TANGUT COMPONENT-164TANGUT COMPONENT-165TANGUT COMPONENT-" + - "166TANGUT COMPONENT-167TANGUT COMPONENT-168TANGUT COMPONENT-169TANGUT CO" + - "MPONENT-170TANGUT COMPONENT-171TANGUT COMPONENT-172TANGUT COMPONENT-173T" + - "ANGUT COMPONENT-174TANGUT COMPONENT-175TANGUT COMPONENT-176TANGUT COMPON" + - "ENT-177TANGUT COMPONENT-178TANGUT COMPONENT-179TANGUT COMPONENT-180TANGU" + - "T COMPONENT-181TANGUT COMPONENT-182TANGUT COMPONENT-183TANGUT COMPONENT-" + - "184TANGUT COMPONENT-185TANGUT COMPONENT-186TANGUT COMPONENT-187TANGUT CO" + - "MPONENT-188TANGUT COMPONENT-189TANGUT COMPONENT-190TANGUT COMPONENT-191T" + - "ANGUT COMPONENT-192TANGUT COMPONENT-193TANGUT COMPONENT-194TANGUT COMPON" + - "ENT-195TANGUT COMPONENT-196TANGUT COMPONENT-197TANGUT COMPONENT-198TANGU" + - "T COMPONENT-199TANGUT COMPONENT-200TANGUT COMPONENT-201TANGUT COMPONENT-" + - "202TANGUT COMPONENT-203TANGUT COMPONENT-204TANGUT COMPONENT-205TANGUT CO" + - "MPONENT-206TANGUT COMPONENT-207TANGUT COMPONENT-208TANGUT COMPONENT-209T" + - "ANGUT COMPONENT-210TANGUT COMPONENT-211TANGUT COMPONENT-212TANGUT COMPON" + - "ENT-213TANGUT COMPONENT-214TANGUT COMPONENT-215TANGUT COMPONENT-216TANGU" + - "T COMPONENT-217TANGUT COMPONENT-218TANGUT COMPONENT-219TANGUT COMPONENT-" + - "220TANGUT COMPONENT-221TANGUT COMPONENT-222TANGUT COMPONENT-223TANGUT CO" + - "MPONENT-224TANGUT COMPONENT-225TANGUT COMPONENT-226TANGUT COMPONENT-227T" + - "ANGUT COMPONENT-228TANGUT COMPONENT-229TANGUT COMPONENT-230TANGUT COMPON") + ("" + - "ENT-231TANGUT COMPONENT-232TANGUT COMPONENT-233TANGUT COMPONENT-234TANGU" + - "T COMPONENT-235TANGUT COMPONENT-236TANGUT COMPONENT-237TANGUT COMPONENT-" + - "238TANGUT COMPONENT-239TANGUT COMPONENT-240TANGUT COMPONENT-241TANGUT CO" + - "MPONENT-242TANGUT COMPONENT-243TANGUT COMPONENT-244TANGUT COMPONENT-245T" + - "ANGUT COMPONENT-246TANGUT COMPONENT-247TANGUT COMPONENT-248TANGUT COMPON" + - "ENT-249TANGUT COMPONENT-250TANGUT COMPONENT-251TANGUT COMPONENT-252TANGU" + - "T COMPONENT-253TANGUT COMPONENT-254TANGUT COMPONENT-255TANGUT COMPONENT-" + - "256TANGUT COMPONENT-257TANGUT COMPONENT-258TANGUT COMPONENT-259TANGUT CO" + - "MPONENT-260TANGUT COMPONENT-261TANGUT COMPONENT-262TANGUT COMPONENT-263T" + - "ANGUT COMPONENT-264TANGUT COMPONENT-265TANGUT COMPONENT-266TANGUT COMPON" + - "ENT-267TANGUT COMPONENT-268TANGUT COMPONENT-269TANGUT COMPONENT-270TANGU" + - "T COMPONENT-271TANGUT COMPONENT-272TANGUT COMPONENT-273TANGUT COMPONENT-" + - "274TANGUT COMPONENT-275TANGUT COMPONENT-276TANGUT COMPONENT-277TANGUT CO" + - "MPONENT-278TANGUT COMPONENT-279TANGUT COMPONENT-280TANGUT COMPONENT-281T" + - "ANGUT COMPONENT-282TANGUT COMPONENT-283TANGUT COMPONENT-284TANGUT COMPON" + - "ENT-285TANGUT COMPONENT-286TANGUT COMPONENT-287TANGUT COMPONENT-288TANGU" + - "T COMPONENT-289TANGUT COMPONENT-290TANGUT COMPONENT-291TANGUT COMPONENT-" + - "292TANGUT COMPONENT-293TANGUT COMPONENT-294TANGUT COMPONENT-295TANGUT CO" + - "MPONENT-296TANGUT COMPONENT-297TANGUT COMPONENT-298TANGUT COMPONENT-299T" + - "ANGUT COMPONENT-300TANGUT COMPONENT-301TANGUT COMPONENT-302TANGUT COMPON" + - "ENT-303TANGUT COMPONENT-304TANGUT COMPONENT-305TANGUT COMPONENT-306TANGU" + - "T COMPONENT-307TANGUT COMPONENT-308TANGUT COMPONENT-309TANGUT COMPONENT-" + - "310TANGUT COMPONENT-311TANGUT COMPONENT-312TANGUT COMPONENT-313TANGUT CO" + - "MPONENT-314TANGUT COMPONENT-315TANGUT COMPONENT-316TANGUT COMPONENT-317T" + - "ANGUT COMPONENT-318TANGUT COMPONENT-319TANGUT COMPONENT-320TANGUT COMPON" + - "ENT-321TANGUT COMPONENT-322TANGUT COMPONENT-323TANGUT COMPONENT-324TANGU" + - "T COMPONENT-325TANGUT COMPONENT-326TANGUT COMPONENT-327TANGUT COMPONENT-" + - "328TANGUT COMPONENT-329TANGUT COMPONENT-330TANGUT COMPONENT-331TANGUT CO" + - "MPONENT-332TANGUT COMPONENT-333TANGUT COMPONENT-334TANGUT COMPONENT-335T" + - "ANGUT COMPONENT-336TANGUT COMPONENT-337TANGUT COMPONENT-338TANGUT COMPON" + - "ENT-339TANGUT COMPONENT-340TANGUT COMPONENT-341TANGUT COMPONENT-342TANGU" + - "T COMPONENT-343TANGUT COMPONENT-344TANGUT COMPONENT-345TANGUT COMPONENT-" + - "346TANGUT COMPONENT-347TANGUT COMPONENT-348TANGUT COMPONENT-349TANGUT CO" + - "MPONENT-350TANGUT COMPONENT-351TANGUT COMPONENT-352TANGUT COMPONENT-353T" + - "ANGUT COMPONENT-354TANGUT COMPONENT-355TANGUT COMPONENT-356TANGUT COMPON" + - "ENT-357TANGUT COMPONENT-358TANGUT COMPONENT-359TANGUT COMPONENT-360TANGU" + - "T COMPONENT-361TANGUT COMPONENT-362TANGUT COMPONENT-363TANGUT COMPONENT-" + - "364TANGUT COMPONENT-365TANGUT COMPONENT-366TANGUT COMPONENT-367TANGUT CO" + - "MPONENT-368TANGUT COMPONENT-369TANGUT COMPONENT-370TANGUT COMPONENT-371T" + - "ANGUT COMPONENT-372TANGUT COMPONENT-373TANGUT COMPONENT-374TANGUT COMPON" + - "ENT-375TANGUT COMPONENT-376TANGUT COMPONENT-377TANGUT COMPONENT-378TANGU" + - "T COMPONENT-379TANGUT COMPONENT-380TANGUT COMPONENT-381TANGUT COMPONENT-" + - "382TANGUT COMPONENT-383TANGUT COMPONENT-384TANGUT COMPONENT-385TANGUT CO" + - "MPONENT-386TANGUT COMPONENT-387TANGUT COMPONENT-388TANGUT COMPONENT-389T" + - "ANGUT COMPONENT-390TANGUT COMPONENT-391TANGUT COMPONENT-392TANGUT COMPON" + - "ENT-393TANGUT COMPONENT-394TANGUT COMPONENT-395TANGUT COMPONENT-396TANGU" + - "T COMPONENT-397TANGUT COMPONENT-398TANGUT COMPONENT-399TANGUT COMPONENT-" + - "400TANGUT COMPONENT-401TANGUT COMPONENT-402TANGUT COMPONENT-403TANGUT CO" + - "MPONENT-404TANGUT COMPONENT-405TANGUT COMPONENT-406TANGUT COMPONENT-407T" + - "ANGUT COMPONENT-408TANGUT COMPONENT-409TANGUT COMPONENT-410TANGUT COMPON" + - "ENT-411TANGUT COMPONENT-412TANGUT COMPONENT-413TANGUT COMPONENT-414TANGU" + - "T COMPONENT-415TANGUT COMPONENT-416TANGUT COMPONENT-417TANGUT COMPONENT-" + - "418TANGUT COMPONENT-419TANGUT COMPONENT-420TANGUT COMPONENT-421TANGUT CO" + - "MPONENT-422TANGUT COMPONENT-423TANGUT COMPONENT-424TANGUT COMPONENT-425T" + - "ANGUT COMPONENT-426TANGUT COMPONENT-427TANGUT COMPONENT-428TANGUT COMPON" + - "ENT-429TANGUT COMPONENT-430TANGUT COMPONENT-431TANGUT COMPONENT-432TANGU" + - "T COMPONENT-433TANGUT COMPONENT-434TANGUT COMPONENT-435TANGUT COMPONENT-" + - "436TANGUT COMPONENT-437TANGUT COMPONENT-438TANGUT COMPONENT-439TANGUT CO" + - "MPONENT-440TANGUT COMPONENT-441TANGUT COMPONENT-442TANGUT COMPONENT-443T" + - "ANGUT COMPONENT-444TANGUT COMPONENT-445TANGUT COMPONENT-446TANGUT COMPON" + - "ENT-447TANGUT COMPONENT-448TANGUT COMPONENT-449TANGUT COMPONENT-450TANGU" + - "T COMPONENT-451TANGUT COMPONENT-452TANGUT COMPONENT-453TANGUT COMPONENT-" + - "454TANGUT COMPONENT-455TANGUT COMPONENT-456TANGUT COMPONENT-457TANGUT CO" + - "MPONENT-458TANGUT COMPONENT-459TANGUT COMPONENT-460TANGUT COMPONENT-461T") + ("" + - "ANGUT COMPONENT-462TANGUT COMPONENT-463TANGUT COMPONENT-464TANGUT COMPON" + - "ENT-465TANGUT COMPONENT-466TANGUT COMPONENT-467TANGUT COMPONENT-468TANGU" + - "T COMPONENT-469TANGUT COMPONENT-470TANGUT COMPONENT-471TANGUT COMPONENT-" + - "472TANGUT COMPONENT-473TANGUT COMPONENT-474TANGUT COMPONENT-475TANGUT CO" + - "MPONENT-476TANGUT COMPONENT-477TANGUT COMPONENT-478TANGUT COMPONENT-479T" + - "ANGUT COMPONENT-480TANGUT COMPONENT-481TANGUT COMPONENT-482TANGUT COMPON" + - "ENT-483TANGUT COMPONENT-484TANGUT COMPONENT-485TANGUT COMPONENT-486TANGU" + - "T COMPONENT-487TANGUT COMPONENT-488TANGUT COMPONENT-489TANGUT COMPONENT-" + - "490TANGUT COMPONENT-491TANGUT COMPONENT-492TANGUT COMPONENT-493TANGUT CO" + - "MPONENT-494TANGUT COMPONENT-495TANGUT COMPONENT-496TANGUT COMPONENT-497T" + - "ANGUT COMPONENT-498TANGUT COMPONENT-499TANGUT COMPONENT-500TANGUT COMPON" + - "ENT-501TANGUT COMPONENT-502TANGUT COMPONENT-503TANGUT COMPONENT-504TANGU" + - "T COMPONENT-505TANGUT COMPONENT-506TANGUT COMPONENT-507TANGUT COMPONENT-" + - "508TANGUT COMPONENT-509TANGUT COMPONENT-510TANGUT COMPONENT-511TANGUT CO" + - "MPONENT-512TANGUT COMPONENT-513TANGUT COMPONENT-514TANGUT COMPONENT-515T" + - "ANGUT COMPONENT-516TANGUT COMPONENT-517TANGUT COMPONENT-518TANGUT COMPON" + - "ENT-519TANGUT COMPONENT-520TANGUT COMPONENT-521TANGUT COMPONENT-522TANGU" + - "T COMPONENT-523TANGUT COMPONENT-524TANGUT COMPONENT-525TANGUT COMPONENT-" + - "526TANGUT COMPONENT-527TANGUT COMPONENT-528TANGUT COMPONENT-529TANGUT CO" + - "MPONENT-530TANGUT COMPONENT-531TANGUT COMPONENT-532TANGUT COMPONENT-533T" + - "ANGUT COMPONENT-534TANGUT COMPONENT-535TANGUT COMPONENT-536TANGUT COMPON" + - "ENT-537TANGUT COMPONENT-538TANGUT COMPONENT-539TANGUT COMPONENT-540TANGU" + - "T COMPONENT-541TANGUT COMPONENT-542TANGUT COMPONENT-543TANGUT COMPONENT-" + - "544TANGUT COMPONENT-545TANGUT COMPONENT-546TANGUT COMPONENT-547TANGUT CO" + - "MPONENT-548TANGUT COMPONENT-549TANGUT COMPONENT-550TANGUT COMPONENT-551T" + - "ANGUT COMPONENT-552TANGUT COMPONENT-553TANGUT COMPONENT-554TANGUT COMPON" + - "ENT-555TANGUT COMPONENT-556TANGUT COMPONENT-557TANGUT COMPONENT-558TANGU" + - "T COMPONENT-559TANGUT COMPONENT-560TANGUT COMPONENT-561TANGUT COMPONENT-" + - "562TANGUT COMPONENT-563TANGUT COMPONENT-564TANGUT COMPONENT-565TANGUT CO" + - "MPONENT-566TANGUT COMPONENT-567TANGUT COMPONENT-568TANGUT COMPONENT-569T" + - "ANGUT COMPONENT-570TANGUT COMPONENT-571TANGUT COMPONENT-572TANGUT COMPON" + - "ENT-573TANGUT COMPONENT-574TANGUT COMPONENT-575TANGUT COMPONENT-576TANGU" + - "T COMPONENT-577TANGUT COMPONENT-578TANGUT COMPONENT-579TANGUT COMPONENT-" + - "580TANGUT COMPONENT-581TANGUT COMPONENT-582TANGUT COMPONENT-583TANGUT CO" + - "MPONENT-584TANGUT COMPONENT-585TANGUT COMPONENT-586TANGUT COMPONENT-587T" + - "ANGUT COMPONENT-588TANGUT COMPONENT-589TANGUT COMPONENT-590TANGUT COMPON" + - "ENT-591TANGUT COMPONENT-592TANGUT COMPONENT-593TANGUT COMPONENT-594TANGU" + - "T COMPONENT-595TANGUT COMPONENT-596TANGUT COMPONENT-597TANGUT COMPONENT-" + - "598TANGUT COMPONENT-599TANGUT COMPONENT-600TANGUT COMPONENT-601TANGUT CO" + - "MPONENT-602TANGUT COMPONENT-603TANGUT COMPONENT-604TANGUT COMPONENT-605T" + - "ANGUT COMPONENT-606TANGUT COMPONENT-607TANGUT COMPONENT-608TANGUT COMPON" + - "ENT-609TANGUT COMPONENT-610TANGUT COMPONENT-611TANGUT COMPONENT-612TANGU" + - "T COMPONENT-613TANGUT COMPONENT-614TANGUT COMPONENT-615TANGUT COMPONENT-" + - "616TANGUT COMPONENT-617TANGUT COMPONENT-618TANGUT COMPONENT-619TANGUT CO" + - "MPONENT-620TANGUT COMPONENT-621TANGUT COMPONENT-622TANGUT COMPONENT-623T" + - "ANGUT COMPONENT-624TANGUT COMPONENT-625TANGUT COMPONENT-626TANGUT COMPON" + - "ENT-627TANGUT COMPONENT-628TANGUT COMPONENT-629TANGUT COMPONENT-630TANGU" + - "T COMPONENT-631TANGUT COMPONENT-632TANGUT COMPONENT-633TANGUT COMPONENT-" + - "634TANGUT COMPONENT-635TANGUT COMPONENT-636TANGUT COMPONENT-637TANGUT CO" + - "MPONENT-638TANGUT COMPONENT-639TANGUT COMPONENT-640TANGUT COMPONENT-641T" + - "ANGUT COMPONENT-642TANGUT COMPONENT-643TANGUT COMPONENT-644TANGUT COMPON" + - "ENT-645TANGUT COMPONENT-646TANGUT COMPONENT-647TANGUT COMPONENT-648TANGU" + - "T COMPONENT-649TANGUT COMPONENT-650TANGUT COMPONENT-651TANGUT COMPONENT-" + - "652TANGUT COMPONENT-653TANGUT COMPONENT-654TANGUT COMPONENT-655TANGUT CO" + - "MPONENT-656TANGUT COMPONENT-657TANGUT COMPONENT-658TANGUT COMPONENT-659T" + - "ANGUT COMPONENT-660TANGUT COMPONENT-661TANGUT COMPONENT-662TANGUT COMPON" + - "ENT-663TANGUT COMPONENT-664TANGUT COMPONENT-665TANGUT COMPONENT-666TANGU" + - "T COMPONENT-667TANGUT COMPONENT-668TANGUT COMPONENT-669TANGUT COMPONENT-" + - "670TANGUT COMPONENT-671TANGUT COMPONENT-672TANGUT COMPONENT-673TANGUT CO" + - "MPONENT-674TANGUT COMPONENT-675TANGUT COMPONENT-676TANGUT COMPONENT-677T" + - "ANGUT COMPONENT-678TANGUT COMPONENT-679TANGUT COMPONENT-680TANGUT COMPON" + - "ENT-681TANGUT COMPONENT-682TANGUT COMPONENT-683TANGUT COMPONENT-684TANGU" + - "T COMPONENT-685TANGUT COMPONENT-686TANGUT COMPONENT-687TANGUT COMPONENT-" + - "688TANGUT COMPONENT-689TANGUT COMPONENT-690TANGUT COMPONENT-691TANGUT CO") + ("" + - "MPONENT-692TANGUT COMPONENT-693TANGUT COMPONENT-694TANGUT COMPONENT-695T" + - "ANGUT COMPONENT-696TANGUT COMPONENT-697TANGUT COMPONENT-698TANGUT COMPON" + - "ENT-699TANGUT COMPONENT-700TANGUT COMPONENT-701TANGUT COMPONENT-702TANGU" + - "T COMPONENT-703TANGUT COMPONENT-704TANGUT COMPONENT-705TANGUT COMPONENT-" + - "706TANGUT COMPONENT-707TANGUT COMPONENT-708TANGUT COMPONENT-709TANGUT CO" + - "MPONENT-710TANGUT COMPONENT-711TANGUT COMPONENT-712TANGUT COMPONENT-713T" + - "ANGUT COMPONENT-714TANGUT COMPONENT-715TANGUT COMPONENT-716TANGUT COMPON" + - "ENT-717TANGUT COMPONENT-718TANGUT COMPONENT-719TANGUT COMPONENT-720TANGU" + - "T COMPONENT-721TANGUT COMPONENT-722TANGUT COMPONENT-723TANGUT COMPONENT-" + - "724TANGUT COMPONENT-725TANGUT COMPONENT-726TANGUT COMPONENT-727TANGUT CO" + - "MPONENT-728TANGUT COMPONENT-729TANGUT COMPONENT-730TANGUT COMPONENT-731T" + - "ANGUT COMPONENT-732TANGUT COMPONENT-733TANGUT COMPONENT-734TANGUT COMPON" + - "ENT-735TANGUT COMPONENT-736TANGUT COMPONENT-737TANGUT COMPONENT-738TANGU" + - "T COMPONENT-739TANGUT COMPONENT-740TANGUT COMPONENT-741TANGUT COMPONENT-" + - "742TANGUT COMPONENT-743TANGUT COMPONENT-744TANGUT COMPONENT-745TANGUT CO" + - "MPONENT-746TANGUT COMPONENT-747TANGUT COMPONENT-748TANGUT COMPONENT-749T" + - "ANGUT COMPONENT-750TANGUT COMPONENT-751TANGUT COMPONENT-752TANGUT COMPON" + - "ENT-753TANGUT COMPONENT-754TANGUT COMPONENT-755KATAKANA LETTER ARCHAIC E" + - "HIRAGANA LETTER ARCHAIC YEDUPLOYAN LETTER HDUPLOYAN LETTER XDUPLOYAN LET" + - "TER PDUPLOYAN LETTER TDUPLOYAN LETTER FDUPLOYAN LETTER KDUPLOYAN LETTER " + - "LDUPLOYAN LETTER BDUPLOYAN LETTER DDUPLOYAN LETTER VDUPLOYAN LETTER GDUP" + - "LOYAN LETTER RDUPLOYAN LETTER P NDUPLOYAN LETTER D SDUPLOYAN LETTER F ND" + - "UPLOYAN LETTER K MDUPLOYAN LETTER R SDUPLOYAN LETTER THDUPLOYAN LETTER S" + - "LOAN DHDUPLOYAN LETTER DHDUPLOYAN LETTER KKDUPLOYAN LETTER SLOAN JDUPLOY" + - "AN LETTER HLDUPLOYAN LETTER LHDUPLOYAN LETTER RHDUPLOYAN LETTER MDUPLOYA" + - "N LETTER NDUPLOYAN LETTER JDUPLOYAN LETTER SDUPLOYAN LETTER M NDUPLOYAN " + - "LETTER N MDUPLOYAN LETTER J MDUPLOYAN LETTER S JDUPLOYAN LETTER M WITH D" + - "OTDUPLOYAN LETTER N WITH DOTDUPLOYAN LETTER J WITH DOTDUPLOYAN LETTER J " + - "WITH DOTS INSIDE AND ABOVEDUPLOYAN LETTER S WITH DOTDUPLOYAN LETTER S WI" + - "TH DOT BELOWDUPLOYAN LETTER M SDUPLOYAN LETTER N SDUPLOYAN LETTER J SDUP" + - "LOYAN LETTER S SDUPLOYAN LETTER M N SDUPLOYAN LETTER N M SDUPLOYAN LETTE" + - "R J M SDUPLOYAN LETTER S J SDUPLOYAN LETTER J S WITH DOTDUPLOYAN LETTER " + - "J NDUPLOYAN LETTER J N SDUPLOYAN LETTER S TDUPLOYAN LETTER S T RDUPLOYAN" + - " LETTER S PDUPLOYAN LETTER S P RDUPLOYAN LETTER T SDUPLOYAN LETTER T R S" + - "DUPLOYAN LETTER WDUPLOYAN LETTER WHDUPLOYAN LETTER W RDUPLOYAN LETTER S " + - "NDUPLOYAN LETTER S MDUPLOYAN LETTER K R SDUPLOYAN LETTER G R SDUPLOYAN L" + - "ETTER S KDUPLOYAN LETTER S K RDUPLOYAN LETTER ADUPLOYAN LETTER SLOAN OWD" + - "UPLOYAN LETTER OADUPLOYAN LETTER ODUPLOYAN LETTER AOUDUPLOYAN LETTER IDU" + - "PLOYAN LETTER EDUPLOYAN LETTER IEDUPLOYAN LETTER SHORT IDUPLOYAN LETTER " + - "UIDUPLOYAN LETTER EEDUPLOYAN LETTER SLOAN EHDUPLOYAN LETTER ROMANIAN IDU" + - "PLOYAN LETTER SLOAN EEDUPLOYAN LETTER LONG IDUPLOYAN LETTER YEDUPLOYAN L" + - "ETTER UDUPLOYAN LETTER EUDUPLOYAN LETTER XWDUPLOYAN LETTER U NDUPLOYAN L" + - "ETTER LONG UDUPLOYAN LETTER ROMANIAN UDUPLOYAN LETTER UHDUPLOYAN LETTER " + - "SLOAN UDUPLOYAN LETTER OOHDUPLOYAN LETTER OWDUPLOYAN LETTER OUDUPLOYAN L" + - "ETTER WADUPLOYAN LETTER WODUPLOYAN LETTER WIDUPLOYAN LETTER WEIDUPLOYAN " + - "LETTER WOWDUPLOYAN LETTER NASAL UDUPLOYAN LETTER NASAL ODUPLOYAN LETTER " + - "NASAL IDUPLOYAN LETTER NASAL ADUPLOYAN LETTER PERNIN ANDUPLOYAN LETTER P" + - "ERNIN AMDUPLOYAN LETTER SLOAN ENDUPLOYAN LETTER SLOAN ANDUPLOYAN LETTER " + - "SLOAN ONDUPLOYAN LETTER VOCALIC MDUPLOYAN AFFIX LEFT HORIZONTAL SECANTDU" + - "PLOYAN AFFIX MID HORIZONTAL SECANTDUPLOYAN AFFIX RIGHT HORIZONTAL SECANT" + - "DUPLOYAN AFFIX LOW VERTICAL SECANTDUPLOYAN AFFIX MID VERTICAL SECANTDUPL" + - "OYAN AFFIX HIGH VERTICAL SECANTDUPLOYAN AFFIX ATTACHED SECANTDUPLOYAN AF" + - "FIX ATTACHED LEFT-TO-RIGHT SECANTDUPLOYAN AFFIX ATTACHED TANGENTDUPLOYAN" + - " AFFIX ATTACHED TAILDUPLOYAN AFFIX ATTACHED E HOOKDUPLOYAN AFFIX ATTACHE" + - "D I HOOKDUPLOYAN AFFIX ATTACHED TANGENT HOOKDUPLOYAN AFFIX HIGH ACUTEDUP" + - "LOYAN AFFIX HIGH TIGHT ACUTEDUPLOYAN AFFIX HIGH GRAVEDUPLOYAN AFFIX HIGH" + - " LONG GRAVEDUPLOYAN AFFIX HIGH DOTDUPLOYAN AFFIX HIGH CIRCLEDUPLOYAN AFF" + - "IX HIGH LINEDUPLOYAN AFFIX HIGH WAVEDUPLOYAN AFFIX HIGH VERTICALDUPLOYAN" + - " AFFIX LOW ACUTEDUPLOYAN AFFIX LOW TIGHT ACUTEDUPLOYAN AFFIX LOW GRAVEDU" + - "PLOYAN AFFIX LOW LONG GRAVEDUPLOYAN AFFIX LOW DOTDUPLOYAN AFFIX LOW CIRC" + - "LEDUPLOYAN AFFIX LOW LINEDUPLOYAN AFFIX LOW WAVEDUPLOYAN AFFIX LOW VERTI" + - "CALDUPLOYAN AFFIX LOW ARROWDUPLOYAN SIGN O WITH CROSSDUPLOYAN THICK LETT" + - "ER SELECTORDUPLOYAN DOUBLE MARKDUPLOYAN PUNCTUATION CHINOOK FULL STOPSHO" + - "RTHAND FORMAT LETTER OVERLAPSHORTHAND FORMAT CONTINUING OVERLAPSHORTHAND") + ("" + - " FORMAT DOWN STEPSHORTHAND FORMAT UP STEPBYZANTINE MUSICAL SYMBOL PSILIB" + - "YZANTINE MUSICAL SYMBOL DASEIABYZANTINE MUSICAL SYMBOL PERISPOMENIBYZANT" + - "INE MUSICAL SYMBOL OXEIA EKFONITIKONBYZANTINE MUSICAL SYMBOL OXEIA DIPLI" + - "BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKONBYZANTINE MUSICAL SYMBOL VARE" + - "IA DIPLIBYZANTINE MUSICAL SYMBOL KATHISTIBYZANTINE MUSICAL SYMBOL SYRMAT" + - "IKIBYZANTINE MUSICAL SYMBOL PARAKLITIKIBYZANTINE MUSICAL SYMBOL YPOKRISI" + - "SBYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLIBYZANTINE MUSICAL SYMBOL KREMAS" + - "TIBYZANTINE MUSICAL SYMBOL APESO EKFONITIKONBYZANTINE MUSICAL SYMBOL EXO" + - " EKFONITIKONBYZANTINE MUSICAL SYMBOL TELEIABYZANTINE MUSICAL SYMBOL KENT" + - "IMATABYZANTINE MUSICAL SYMBOL APOSTROFOSBYZANTINE MUSICAL SYMBOL APOSTRO" + - "FOS DIPLIBYZANTINE MUSICAL SYMBOL SYNEVMABYZANTINE MUSICAL SYMBOL THITAB" + - "YZANTINE MUSICAL SYMBOL OLIGON ARCHAIONBYZANTINE MUSICAL SYMBOL GORGON A" + - "RCHAIONBYZANTINE MUSICAL SYMBOL PSILONBYZANTINE MUSICAL SYMBOL CHAMILONB" + - "YZANTINE MUSICAL SYMBOL VATHYBYZANTINE MUSICAL SYMBOL ISON ARCHAIONBYZAN" + - "TINE MUSICAL SYMBOL KENTIMA ARCHAIONBYZANTINE MUSICAL SYMBOL KENTIMATA A" + - "RCHAIONBYZANTINE MUSICAL SYMBOL SAXIMATABYZANTINE MUSICAL SYMBOL PARICHO" + - "NBYZANTINE MUSICAL SYMBOL STAVROS APODEXIABYZANTINE MUSICAL SYMBOL OXEIA" + - "I ARCHAIONBYZANTINE MUSICAL SYMBOL VAREIAI ARCHAIONBYZANTINE MUSICAL SYM" + - "BOL APODERMA ARCHAIONBYZANTINE MUSICAL SYMBOL APOTHEMABYZANTINE MUSICAL " + - "SYMBOL KLASMABYZANTINE MUSICAL SYMBOL REVMABYZANTINE MUSICAL SYMBOL PIAS" + - "MA ARCHAIONBYZANTINE MUSICAL SYMBOL TINAGMABYZANTINE MUSICAL SYMBOL ANAT" + - "RICHISMABYZANTINE MUSICAL SYMBOL SEISMABYZANTINE MUSICAL SYMBOL SYNAGMA " + - "ARCHAIONBYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROUBYZANTINE MUSICAL S" + - "YMBOL OYRANISMA ARCHAIONBYZANTINE MUSICAL SYMBOL THEMABYZANTINE MUSICAL " + - "SYMBOL LEMOIBYZANTINE MUSICAL SYMBOL DYOBYZANTINE MUSICAL SYMBOL TRIABYZ" + - "ANTINE MUSICAL SYMBOL TESSERABYZANTINE MUSICAL SYMBOL KRATIMATABYZANTINE" + - " MUSICAL SYMBOL APESO EXO NEOBYZANTINE MUSICAL SYMBOL FTHORA ARCHAIONBYZ" + - "ANTINE MUSICAL SYMBOL IMIFTHORABYZANTINE MUSICAL SYMBOL TROMIKON ARCHAIO" + - "NBYZANTINE MUSICAL SYMBOL KATAVA TROMIKONBYZANTINE MUSICAL SYMBOL PELAST" + - "ONBYZANTINE MUSICAL SYMBOL PSIFISTONBYZANTINE MUSICAL SYMBOL KONTEVMABYZ" + - "ANTINE MUSICAL SYMBOL CHOREVMA ARCHAIONBYZANTINE MUSICAL SYMBOL RAPISMAB" + - "YZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAIONBYZANTINE MUSICAL SYMBOL PAR" + - "AKLITIKI ARCHAIONBYZANTINE MUSICAL SYMBOL ICHADINBYZANTINE MUSICAL SYMBO" + - "L NANABYZANTINE MUSICAL SYMBOL PETASMABYZANTINE MUSICAL SYMBOL KONTEVMA " + - "ALLOBYZANTINE MUSICAL SYMBOL TROMIKON ALLOBYZANTINE MUSICAL SYMBOL STRAG" + - "GISMATABYZANTINE MUSICAL SYMBOL GRONTHISMATABYZANTINE MUSICAL SYMBOL ISO" + - "N NEOBYZANTINE MUSICAL SYMBOL OLIGON NEOBYZANTINE MUSICAL SYMBOL OXEIA N" + - "EOBYZANTINE MUSICAL SYMBOL PETASTIBYZANTINE MUSICAL SYMBOL KOUFISMABYZAN" + - "TINE MUSICAL SYMBOL PETASTOKOUFISMABYZANTINE MUSICAL SYMBOL KRATIMOKOUFI" + - "SMABYZANTINE MUSICAL SYMBOL PELASTON NEOBYZANTINE MUSICAL SYMBOL KENTIMA" + - "TA NEO ANOBYZANTINE MUSICAL SYMBOL KENTIMA NEO ANOBYZANTINE MUSICAL SYMB" + - "OL YPSILIBYZANTINE MUSICAL SYMBOL APOSTROFOS NEOBYZANTINE MUSICAL SYMBOL" + - " APOSTROFOI SYNDESMOS NEOBYZANTINE MUSICAL SYMBOL YPORROIBYZANTINE MUSIC" + - "AL SYMBOL KRATIMOYPORROONBYZANTINE MUSICAL SYMBOL ELAFRONBYZANTINE MUSIC" + - "AL SYMBOL CHAMILIBYZANTINE MUSICAL SYMBOL MIKRON ISONBYZANTINE MUSICAL S" + - "YMBOL VAREIA NEOBYZANTINE MUSICAL SYMBOL PIASMA NEOBYZANTINE MUSICAL SYM" + - "BOL PSIFISTON NEOBYZANTINE MUSICAL SYMBOL OMALONBYZANTINE MUSICAL SYMBOL" + - " ANTIKENOMABYZANTINE MUSICAL SYMBOL LYGISMABYZANTINE MUSICAL SYMBOL PARA" + - "KLITIKI NEOBYZANTINE MUSICAL SYMBOL PARAKALESMA NEOBYZANTINE MUSICAL SYM" + - "BOL ETERON PARAKALESMABYZANTINE MUSICAL SYMBOL KYLISMABYZANTINE MUSICAL " + - "SYMBOL ANTIKENOKYLISMABYZANTINE MUSICAL SYMBOL TROMIKON NEOBYZANTINE MUS" + - "ICAL SYMBOL EKSTREPTONBYZANTINE MUSICAL SYMBOL SYNAGMA NEOBYZANTINE MUSI" + - "CAL SYMBOL SYRMABYZANTINE MUSICAL SYMBOL CHOREVMA NEOBYZANTINE MUSICAL S" + - "YMBOL EPEGERMABYZANTINE MUSICAL SYMBOL SEISMA NEOBYZANTINE MUSICAL SYMBO" + - "L XIRON KLASMABYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTONBYZANTINE MUSICAL" + - " SYMBOL PSIFISTOLYGISMABYZANTINE MUSICAL SYMBOL TROMIKOLYGISMABYZANTINE " + - "MUSICAL SYMBOL TROMIKOPARAKALESMABYZANTINE MUSICAL SYMBOL PSIFISTOPARAKA" + - "LESMABYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMABYZANTINE MUSICAL SYMBOL PSI" + - "FISTOSYNAGMABYZANTINE MUSICAL SYMBOL GORGOSYNTHETONBYZANTINE MUSICAL SYM" + - "BOL ARGOSYNTHETONBYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETONBYZANTINE " + - "MUSICAL SYMBOL OYRANISMA NEOBYZANTINE MUSICAL SYMBOL THEMATISMOS ESOBYZA" + - "NTINE MUSICAL SYMBOL THEMATISMOS EXOBYZANTINE MUSICAL SYMBOL THEMA APLOU" + - "NBYZANTINE MUSICAL SYMBOL THES KAI APOTHESBYZANTINE MUSICAL SYMBOL KATAV" + - "ASMABYZANTINE MUSICAL SYMBOL ENDOFONONBYZANTINE MUSICAL SYMBOL YFEN KATO") + ("" + - "BYZANTINE MUSICAL SYMBOL YFEN ANOBYZANTINE MUSICAL SYMBOL STAVROSBYZANTI" + - "NE MUSICAL SYMBOL KLASMA ANOBYZANTINE MUSICAL SYMBOL DIPLI ARCHAIONBYZAN" + - "TINE MUSICAL SYMBOL KRATIMA ARCHAIONBYZANTINE MUSICAL SYMBOL KRATIMA ALL" + - "OBYZANTINE MUSICAL SYMBOL KRATIMA NEOBYZANTINE MUSICAL SYMBOL APODERMA N" + - "EOBYZANTINE MUSICAL SYMBOL APLIBYZANTINE MUSICAL SYMBOL DIPLIBYZANTINE M" + - "USICAL SYMBOL TRIPLIBYZANTINE MUSICAL SYMBOL TETRAPLIBYZANTINE MUSICAL S" + - "YMBOL KORONISBYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOUBYZANTINE MUSIC" + - "AL SYMBOL LEIMMA DYO CHRONONBYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONO" + - "NBYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONONBYZANTINE MUSICAL SYMBO" + - "L LEIMMA IMISEOS CHRONOUBYZANTINE MUSICAL SYMBOL GORGON NEO ANOBYZANTINE" + - " MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERABYZANTINE MUSICAL SYMBOL GO" + - "RGON PARESTIGMENON DEXIABYZANTINE MUSICAL SYMBOL DIGORGONBYZANTINE MUSIC" + - "AL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATOBYZANTINE MUSICAL SYMBOL D" + - "IGORGON PARESTIGMENON ARISTERA ANOBYZANTINE MUSICAL SYMBOL DIGORGON PARE" + - "STIGMENON DEXIABYZANTINE MUSICAL SYMBOL TRIGORGONBYZANTINE MUSICAL SYMBO" + - "L ARGONBYZANTINE MUSICAL SYMBOL IMIDIARGONBYZANTINE MUSICAL SYMBOL DIARG" + - "ONBYZANTINE MUSICAL SYMBOL AGOGI POLI ARGIBYZANTINE MUSICAL SYMBOL AGOGI" + - " ARGOTERIBYZANTINE MUSICAL SYMBOL AGOGI ARGIBYZANTINE MUSICAL SYMBOL AGO" + - "GI METRIABYZANTINE MUSICAL SYMBOL AGOGI MESIBYZANTINE MUSICAL SYMBOL AGO" + - "GI GORGIBYZANTINE MUSICAL SYMBOL AGOGI GORGOTERIBYZANTINE MUSICAL SYMBOL" + - " AGOGI POLI GORGIBYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOSBYZANTINE" + - " MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOSBYZANTINE MUSICAL SYMBOL MARTY" + - "RIA DEYTEROS ICHOSBYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOSB" + - "YZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOSBYZANTINE MUSICAL SYMBOL MA" + - "RTYRIA TRIFONIASBYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOSBYZANTIN" + - "E MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOSBYZANTINE MUSICAL SYMBOL" + - " MARTYRIA LEGETOS ICHOSBYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOSBY" + - "ZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOSBYZANTINE MUSICAL SYMBOL A" + - "POSTROFOI TELOUS ICHIMATOSBYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS" + - "BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIASBYZANTINE MUSICAL SYMBOL FA" + - "NEROSIS DIFONIASBYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOSBYZANTINE M" + - "USICAL SYMBOL MARTYRIA PROTOVARYS ICHOSBYZANTINE MUSICAL SYMBOL MARTYRIA" + - " PLAGIOS TETARTOS ICHOSBYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUNBYZAN" + - "TINE MUSICAL SYMBOL GORTHMIKON N DIPLOUNBYZANTINE MUSICAL SYMBOL ENARXIS" + - " KAI FTHORA VOUBYZANTINE MUSICAL SYMBOL IMIFONONBYZANTINE MUSICAL SYMBOL" + - " IMIFTHORONBYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOUBYZANT" + - "INE MUSICAL SYMBOL FTHORA DIATONIKI PABYZANTINE MUSICAL SYMBOL FTHORA DI" + - "ATONIKI NANABYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOSBYZANTINE MUSICAL " + - "SYMBOL FTHORA DIATONIKI DIBYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATON" + - "ON DIBYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KEBYZANTINE MUSICAL SYMBO" + - "L FTHORA DIATONIKI ZOBYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATOBY" + - "ZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANOBYZANTINE MUSICAL SYMBOL F" + - "THORA MALAKON CHROMA DIFONIASBYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHR" + - "OMA MONOFONIASBYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASISBYZANT" + - "INE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFIBYZANTINE MUSICAL SYMBOL " + - "FTHORA NENANOBYZANTINE MUSICAL SYMBOL CHROA ZYGOSBYZANTINE MUSICAL SYMBO" + - "L CHROA KLITONBYZANTINE MUSICAL SYMBOL CHROA SPATHIBYZANTINE MUSICAL SYM" + - "BOL FTHORA I YFESIS TETARTIMORIONBYZANTINE MUSICAL SYMBOL FTHORA ENARMON" + - "IOS ANTIFONIABYZANTINE MUSICAL SYMBOL YFESIS TRITIMORIONBYZANTINE MUSICA" + - "L SYMBOL DIESIS TRITIMORIONBYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION" + - "BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATABYZANTINE MUSICAL SYMBO" + - "L DIESIS MONOGRAMMOS TESSERA DODEKATABYZANTINE MUSICAL SYMBOL DIESIS DIG" + - "RAMMOS EX DODEKATABYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKA" + - "TABYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATABYZANTINE MUSICAL SYM" + - "BOL YFESIS MONOGRAMMOS TESSERA DODEKATABYZANTINE MUSICAL SYMBOL YFESIS D" + - "IGRAMMOS EX DODEKATABYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODE" + - "KATABYZANTINE MUSICAL SYMBOL GENIKI DIESISBYZANTINE MUSICAL SYMBOL GENIK" + - "I YFESISBYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRIBYZANTINE MUSICAL SY" + - "MBOL DIASTOLI APLI MEGALIBYZANTINE MUSICAL SYMBOL DIASTOLI DIPLIBYZANTIN" + - "E MUSICAL SYMBOL DIASTOLI THESEOSBYZANTINE MUSICAL SYMBOL SIMANSIS THESE" + - "OSBYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOUBYZANTINE MUSICAL SYM" + - "BOL SIMANSIS THESEOS TRISIMOUBYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS T" + - "ETRASIMOUBYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOSBYZANTINE MUSICAL SYMBO" + - "L SIMANSIS ARSEOS DISIMOUBYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIM") + ("" + - "OUBYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOUBYZANTINE MUSICAL S" + - "YMBOL DIGRAMMA GGBYZANTINE MUSICAL SYMBOL DIFTOGGOS OUBYZANTINE MUSICAL " + - "SYMBOL STIGMABYZANTINE MUSICAL SYMBOL ARKTIKO PABYZANTINE MUSICAL SYMBOL" + - " ARKTIKO VOUBYZANTINE MUSICAL SYMBOL ARKTIKO GABYZANTINE MUSICAL SYMBOL " + - "ARKTIKO DIBYZANTINE MUSICAL SYMBOL ARKTIKO KEBYZANTINE MUSICAL SYMBOL AR" + - "KTIKO ZOBYZANTINE MUSICAL SYMBOL ARKTIKO NIBYZANTINE MUSICAL SYMBOL KENT" + - "IMATA NEO MESOBYZANTINE MUSICAL SYMBOL KENTIMA NEO MESOBYZANTINE MUSICAL" + - " SYMBOL KENTIMATA NEO KATOBYZANTINE MUSICAL SYMBOL KENTIMA NEO KATOBYZAN" + - "TINE MUSICAL SYMBOL KLASMA KATOBYZANTINE MUSICAL SYMBOL GORGON NEO KATOM" + - "USICAL SYMBOL SINGLE BARLINEMUSICAL SYMBOL DOUBLE BARLINEMUSICAL SYMBOL " + - "FINAL BARLINEMUSICAL SYMBOL REVERSE FINAL BARLINEMUSICAL SYMBOL DASHED B" + - "ARLINEMUSICAL SYMBOL SHORT BARLINEMUSICAL SYMBOL LEFT REPEAT SIGNMUSICAL" + - " SYMBOL RIGHT REPEAT SIGNMUSICAL SYMBOL REPEAT DOTSMUSICAL SYMBOL DAL SE" + - "GNOMUSICAL SYMBOL DA CAPOMUSICAL SYMBOL SEGNOMUSICAL SYMBOL CODAMUSICAL " + - "SYMBOL REPEATED FIGURE-1MUSICAL SYMBOL REPEATED FIGURE-2MUSICAL SYMBOL R" + - "EPEATED FIGURE-3MUSICAL SYMBOL FERMATAMUSICAL SYMBOL FERMATA BELOWMUSICA" + - "L SYMBOL BREATH MARKMUSICAL SYMBOL CAESURAMUSICAL SYMBOL BRACEMUSICAL SY" + - "MBOL BRACKETMUSICAL SYMBOL ONE-LINE STAFFMUSICAL SYMBOL TWO-LINE STAFFMU" + - "SICAL SYMBOL THREE-LINE STAFFMUSICAL SYMBOL FOUR-LINE STAFFMUSICAL SYMBO" + - "L FIVE-LINE STAFFMUSICAL SYMBOL SIX-LINE STAFFMUSICAL SYMBOL SIX-STRING " + - "FRETBOARDMUSICAL SYMBOL FOUR-STRING FRETBOARDMUSICAL SYMBOL G CLEFMUSICA" + - "L SYMBOL G CLEF OTTAVA ALTAMUSICAL SYMBOL G CLEF OTTAVA BASSAMUSICAL SYM" + - "BOL C CLEFMUSICAL SYMBOL F CLEFMUSICAL SYMBOL F CLEF OTTAVA ALTAMUSICAL " + - "SYMBOL F CLEF OTTAVA BASSAMUSICAL SYMBOL DRUM CLEF-1MUSICAL SYMBOL DRUM " + - "CLEF-2MUSICAL SYMBOL MULTIPLE MEASURE RESTMUSICAL SYMBOL DOUBLE SHARPMUS" + - "ICAL SYMBOL DOUBLE FLATMUSICAL SYMBOL FLAT UPMUSICAL SYMBOL FLAT DOWNMUS" + - "ICAL SYMBOL NATURAL UPMUSICAL SYMBOL NATURAL DOWNMUSICAL SYMBOL SHARP UP" + - "MUSICAL SYMBOL SHARP DOWNMUSICAL SYMBOL QUARTER TONE SHARPMUSICAL SYMBOL" + - " QUARTER TONE FLATMUSICAL SYMBOL COMMON TIMEMUSICAL SYMBOL CUT TIMEMUSIC" + - "AL SYMBOL OTTAVA ALTAMUSICAL SYMBOL OTTAVA BASSAMUSICAL SYMBOL QUINDICES" + - "IMA ALTAMUSICAL SYMBOL QUINDICESIMA BASSAMUSICAL SYMBOL MULTI RESTMUSICA" + - "L SYMBOL WHOLE RESTMUSICAL SYMBOL HALF RESTMUSICAL SYMBOL QUARTER RESTMU" + - "SICAL SYMBOL EIGHTH RESTMUSICAL SYMBOL SIXTEENTH RESTMUSICAL SYMBOL THIR" + - "TY-SECOND RESTMUSICAL SYMBOL SIXTY-FOURTH RESTMUSICAL SYMBOL ONE HUNDRED" + - " TWENTY-EIGHTH RESTMUSICAL SYMBOL X NOTEHEADMUSICAL SYMBOL PLUS NOTEHEAD" + - "MUSICAL SYMBOL CIRCLE X NOTEHEADMUSICAL SYMBOL SQUARE NOTEHEAD WHITEMUSI" + - "CAL SYMBOL SQUARE NOTEHEAD BLACKMUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHIT" + - "EMUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACKMUSICAL SYMBOL TRIANGLE NOTEHE" + - "AD LEFT WHITEMUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACKMUSICAL SYMBOL T" + - "RIANGLE NOTEHEAD RIGHT WHITEMUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK" + - "MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITEMUSICAL SYMBOL TRIANGLE NOTEH" + - "EAD DOWN BLACKMUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITEMUSICAL SYM" + - "BOL TRIANGLE NOTEHEAD UP RIGHT BLACKMUSICAL SYMBOL MOON NOTEHEAD WHITEMU" + - "SICAL SYMBOL MOON NOTEHEAD BLACKMUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD D" + - "OWN WHITEMUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACKMUSICAL SYMBOL" + - " PARENTHESIS NOTEHEADMUSICAL SYMBOL VOID NOTEHEADMUSICAL SYMBOL NOTEHEAD" + - " BLACKMUSICAL SYMBOL NULL NOTEHEADMUSICAL SYMBOL CLUSTER NOTEHEAD WHITEM" + - "USICAL SYMBOL CLUSTER NOTEHEAD BLACKMUSICAL SYMBOL BREVEMUSICAL SYMBOL W" + - "HOLE NOTEMUSICAL SYMBOL HALF NOTEMUSICAL SYMBOL QUARTER NOTEMUSICAL SYMB" + - "OL EIGHTH NOTEMUSICAL SYMBOL SIXTEENTH NOTEMUSICAL SYMBOL THIRTY-SECOND " + - "NOTEMUSICAL SYMBOL SIXTY-FOURTH NOTEMUSICAL SYMBOL ONE HUNDRED TWENTY-EI" + - "GHTH NOTEMUSICAL SYMBOL COMBINING STEMMUSICAL SYMBOL COMBINING SPRECHGES" + - "ANG STEMMUSICAL SYMBOL COMBINING TREMOLO-1MUSICAL SYMBOL COMBINING TREMO" + - "LO-2MUSICAL SYMBOL COMBINING TREMOLO-3MUSICAL SYMBOL FINGERED TREMOLO-1M" + - "USICAL SYMBOL FINGERED TREMOLO-2MUSICAL SYMBOL FINGERED TREMOLO-3MUSICAL" + - " SYMBOL COMBINING AUGMENTATION DOTMUSICAL SYMBOL COMBINING FLAG-1MUSICAL" + - " SYMBOL COMBINING FLAG-2MUSICAL SYMBOL COMBINING FLAG-3MUSICAL SYMBOL CO" + - "MBINING FLAG-4MUSICAL SYMBOL COMBINING FLAG-5MUSICAL SYMBOL BEGIN BEAMMU" + - "SICAL SYMBOL END BEAMMUSICAL SYMBOL BEGIN TIEMUSICAL SYMBOL END TIEMUSIC" + - "AL SYMBOL BEGIN SLURMUSICAL SYMBOL END SLURMUSICAL SYMBOL BEGIN PHRASEMU" + - "SICAL SYMBOL END PHRASEMUSICAL SYMBOL COMBINING ACCENTMUSICAL SYMBOL COM" + - "BINING STACCATOMUSICAL SYMBOL COMBINING TENUTOMUSICAL SYMBOL COMBINING S" + - "TACCATISSIMOMUSICAL SYMBOL COMBINING MARCATOMUSICAL SYMBOL COMBINING MAR" + - "CATO-STACCATOMUSICAL SYMBOL COMBINING ACCENT-STACCATOMUSICAL SYMBOL COMB") + ("" + - "INING LOUREMUSICAL SYMBOL ARPEGGIATO UPMUSICAL SYMBOL ARPEGGIATO DOWNMUS" + - "ICAL SYMBOL COMBINING DOITMUSICAL SYMBOL COMBINING RIPMUSICAL SYMBOL COM" + - "BINING FLIPMUSICAL SYMBOL COMBINING SMEARMUSICAL SYMBOL COMBINING BENDMU" + - "SICAL SYMBOL COMBINING DOUBLE TONGUEMUSICAL SYMBOL COMBINING TRIPLE TONG" + - "UEMUSICAL SYMBOL RINFORZANDOMUSICAL SYMBOL SUBITOMUSICAL SYMBOL ZMUSICAL" + - " SYMBOL PIANOMUSICAL SYMBOL MEZZOMUSICAL SYMBOL FORTEMUSICAL SYMBOL CRES" + - "CENDOMUSICAL SYMBOL DECRESCENDOMUSICAL SYMBOL GRACE NOTE SLASHMUSICAL SY" + - "MBOL GRACE NOTE NO SLASHMUSICAL SYMBOL TRMUSICAL SYMBOL TURNMUSICAL SYMB" + - "OL INVERTED TURNMUSICAL SYMBOL TURN SLASHMUSICAL SYMBOL TURN UPMUSICAL S" + - "YMBOL ORNAMENT STROKE-1MUSICAL SYMBOL ORNAMENT STROKE-2MUSICAL SYMBOL OR" + - "NAMENT STROKE-3MUSICAL SYMBOL ORNAMENT STROKE-4MUSICAL SYMBOL ORNAMENT S" + - "TROKE-5MUSICAL SYMBOL ORNAMENT STROKE-6MUSICAL SYMBOL ORNAMENT STROKE-7M" + - "USICAL SYMBOL ORNAMENT STROKE-8MUSICAL SYMBOL ORNAMENT STROKE-9MUSICAL S" + - "YMBOL ORNAMENT STROKE-10MUSICAL SYMBOL ORNAMENT STROKE-11MUSICAL SYMBOL " + - "HAUPTSTIMMEMUSICAL SYMBOL NEBENSTIMMEMUSICAL SYMBOL END OF STIMMEMUSICAL" + - " SYMBOL DEGREE SLASHMUSICAL SYMBOL COMBINING DOWN BOWMUSICAL SYMBOL COMB" + - "INING UP BOWMUSICAL SYMBOL COMBINING HARMONICMUSICAL SYMBOL COMBINING SN" + - "AP PIZZICATOMUSICAL SYMBOL PEDAL MARKMUSICAL SYMBOL PEDAL UP MARKMUSICAL" + - " SYMBOL HALF PEDAL MARKMUSICAL SYMBOL GLISSANDO UPMUSICAL SYMBOL GLISSAN" + - "DO DOWNMUSICAL SYMBOL WITH FINGERNAILSMUSICAL SYMBOL DAMPMUSICAL SYMBOL " + - "DAMP ALLMUSICAL SYMBOL MAXIMAMUSICAL SYMBOL LONGAMUSICAL SYMBOL BREVISMU" + - "SICAL SYMBOL SEMIBREVIS WHITEMUSICAL SYMBOL SEMIBREVIS BLACKMUSICAL SYMB" + - "OL MINIMAMUSICAL SYMBOL MINIMA BLACKMUSICAL SYMBOL SEMIMINIMA WHITEMUSIC" + - "AL SYMBOL SEMIMINIMA BLACKMUSICAL SYMBOL FUSA WHITEMUSICAL SYMBOL FUSA B" + - "LACKMUSICAL SYMBOL LONGA PERFECTA RESTMUSICAL SYMBOL LONGA IMPERFECTA RE" + - "STMUSICAL SYMBOL BREVIS RESTMUSICAL SYMBOL SEMIBREVIS RESTMUSICAL SYMBOL" + - " MINIMA RESTMUSICAL SYMBOL SEMIMINIMA RESTMUSICAL SYMBOL TEMPUS PERFECTU" + - "M CUM PROLATIONE PERFECTAMUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE " + - "IMPERFECTAMUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINU" + - "TION-1MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTAMUSICAL S" + - "YMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTAMUSICAL SYMBOL TEMPUS " + - "IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1MUSICAL SYMBOL TEMPUS " + - "IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2MUSICAL SYMBOL TEMPUS " + - "IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3MUSICAL SYMBOL CROIXMU" + - "SICAL SYMBOL GREGORIAN C CLEFMUSICAL SYMBOL GREGORIAN F CLEFMUSICAL SYMB" + - "OL SQUARE BMUSICAL SYMBOL VIRGAMUSICAL SYMBOL PODATUSMUSICAL SYMBOL CLIV" + - "ISMUSICAL SYMBOL SCANDICUSMUSICAL SYMBOL CLIMACUSMUSICAL SYMBOL TORCULUS" + - "MUSICAL SYMBOL PORRECTUSMUSICAL SYMBOL PORRECTUS FLEXUSMUSICAL SYMBOL SC" + - "ANDICUS FLEXUSMUSICAL SYMBOL TORCULUS RESUPINUSMUSICAL SYMBOL PES SUBPUN" + - "CTISMUSICAL SYMBOL KIEVAN C CLEFMUSICAL SYMBOL KIEVAN END OF PIECEMUSICA" + - "L SYMBOL KIEVAN FINAL NOTEMUSICAL SYMBOL KIEVAN RECITATIVE MARKMUSICAL S" + - "YMBOL KIEVAN WHOLE NOTEMUSICAL SYMBOL KIEVAN HALF NOTEMUSICAL SYMBOL KIE" + - "VAN QUARTER NOTE STEM DOWNMUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UPMUSI" + - "CAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWNMUSICAL SYMBOL KIEVAN EIGHTH NOTE" + - " STEM UPMUSICAL SYMBOL KIEVAN FLAT SIGNGREEK VOCAL NOTATION SYMBOL-1GREE" + - "K VOCAL NOTATION SYMBOL-2GREEK VOCAL NOTATION SYMBOL-3GREEK VOCAL NOTATI" + - "ON SYMBOL-4GREEK VOCAL NOTATION SYMBOL-5GREEK VOCAL NOTATION SYMBOL-6GRE" + - "EK VOCAL NOTATION SYMBOL-7GREEK VOCAL NOTATION SYMBOL-8GREEK VOCAL NOTAT" + - "ION SYMBOL-9GREEK VOCAL NOTATION SYMBOL-10GREEK VOCAL NOTATION SYMBOL-11" + - "GREEK VOCAL NOTATION SYMBOL-12GREEK VOCAL NOTATION SYMBOL-13GREEK VOCAL " + - "NOTATION SYMBOL-14GREEK VOCAL NOTATION SYMBOL-15GREEK VOCAL NOTATION SYM" + - "BOL-16GREEK VOCAL NOTATION SYMBOL-17GREEK VOCAL NOTATION SYMBOL-18GREEK " + - "VOCAL NOTATION SYMBOL-19GREEK VOCAL NOTATION SYMBOL-20GREEK VOCAL NOTATI" + - "ON SYMBOL-21GREEK VOCAL NOTATION SYMBOL-22GREEK VOCAL NOTATION SYMBOL-23" + - "GREEK VOCAL NOTATION SYMBOL-24GREEK VOCAL NOTATION SYMBOL-50GREEK VOCAL " + - "NOTATION SYMBOL-51GREEK VOCAL NOTATION SYMBOL-52GREEK VOCAL NOTATION SYM" + - "BOL-53GREEK VOCAL NOTATION SYMBOL-54GREEK INSTRUMENTAL NOTATION SYMBOL-1" + - "GREEK INSTRUMENTAL NOTATION SYMBOL-2GREEK INSTRUMENTAL NOTATION SYMBOL-4" + - "GREEK INSTRUMENTAL NOTATION SYMBOL-5GREEK INSTRUMENTAL NOTATION SYMBOL-7" + - "GREEK INSTRUMENTAL NOTATION SYMBOL-8GREEK INSTRUMENTAL NOTATION SYMBOL-1" + - "1GREEK INSTRUMENTAL NOTATION SYMBOL-12GREEK INSTRUMENTAL NOTATION SYMBOL" + - "-13GREEK INSTRUMENTAL NOTATION SYMBOL-14GREEK INSTRUMENTAL NOTATION SYMB" + - "OL-17GREEK INSTRUMENTAL NOTATION SYMBOL-18GREEK INSTRUMENTAL NOTATION SY" + - "MBOL-19GREEK INSTRUMENTAL NOTATION SYMBOL-23GREEK INSTRUMENTAL NOTATION ") + ("" + - "SYMBOL-24GREEK INSTRUMENTAL NOTATION SYMBOL-25GREEK INSTRUMENTAL NOTATIO" + - "N SYMBOL-26GREEK INSTRUMENTAL NOTATION SYMBOL-27GREEK INSTRUMENTAL NOTAT" + - "ION SYMBOL-29GREEK INSTRUMENTAL NOTATION SYMBOL-30GREEK INSTRUMENTAL NOT" + - "ATION SYMBOL-32GREEK INSTRUMENTAL NOTATION SYMBOL-36GREEK INSTRUMENTAL N" + - "OTATION SYMBOL-37GREEK INSTRUMENTAL NOTATION SYMBOL-38GREEK INSTRUMENTAL" + - " NOTATION SYMBOL-39GREEK INSTRUMENTAL NOTATION SYMBOL-40GREEK INSTRUMENT" + - "AL NOTATION SYMBOL-42GREEK INSTRUMENTAL NOTATION SYMBOL-43GREEK INSTRUME" + - "NTAL NOTATION SYMBOL-45GREEK INSTRUMENTAL NOTATION SYMBOL-47GREEK INSTRU" + - "MENTAL NOTATION SYMBOL-48GREEK INSTRUMENTAL NOTATION SYMBOL-49GREEK INST" + - "RUMENTAL NOTATION SYMBOL-50GREEK INSTRUMENTAL NOTATION SYMBOL-51GREEK IN" + - "STRUMENTAL NOTATION SYMBOL-52GREEK INSTRUMENTAL NOTATION SYMBOL-53GREEK " + - "INSTRUMENTAL NOTATION SYMBOL-54COMBINING GREEK MUSICAL TRISEMECOMBINING " + - "GREEK MUSICAL TETRASEMECOMBINING GREEK MUSICAL PENTASEMEGREEK MUSICAL LE" + - "IMMAMONOGRAM FOR EARTHDIGRAM FOR HEAVENLY EARTHDIGRAM FOR HUMAN EARTHDIG" + - "RAM FOR EARTHLY HEAVENDIGRAM FOR EARTHLY HUMANDIGRAM FOR EARTHTETRAGRAM " + - "FOR CENTRETETRAGRAM FOR FULL CIRCLETETRAGRAM FOR MIREDTETRAGRAM FOR BARR" + - "IERTETRAGRAM FOR KEEPING SMALLTETRAGRAM FOR CONTRARIETYTETRAGRAM FOR ASC" + - "ENTTETRAGRAM FOR OPPOSITIONTETRAGRAM FOR BRANCHING OUTTETRAGRAM FOR DEFE" + - "CTIVENESS OR DISTORTIONTETRAGRAM FOR DIVERGENCETETRAGRAM FOR YOUTHFULNES" + - "STETRAGRAM FOR INCREASETETRAGRAM FOR PENETRATIONTETRAGRAM FOR REACHTETRA" + - "GRAM FOR CONTACTTETRAGRAM FOR HOLDING BACKTETRAGRAM FOR WAITINGTETRAGRAM" + - " FOR FOLLOWINGTETRAGRAM FOR ADVANCETETRAGRAM FOR RELEASETETRAGRAM FOR RE" + - "SISTANCETETRAGRAM FOR EASETETRAGRAM FOR JOYTETRAGRAM FOR CONTENTIONTETRA" + - "GRAM FOR ENDEAVOURTETRAGRAM FOR DUTIESTETRAGRAM FOR CHANGETETRAGRAM FOR " + - "DECISIVENESSTETRAGRAM FOR BOLD RESOLUTIONTETRAGRAM FOR PACKINGTETRAGRAM " + - "FOR LEGIONTETRAGRAM FOR CLOSENESSTETRAGRAM FOR KINSHIPTETRAGRAM FOR GATH" + - "ERINGTETRAGRAM FOR STRENGTHTETRAGRAM FOR PURITYTETRAGRAM FOR FULLNESSTET" + - "RAGRAM FOR RESIDENCETETRAGRAM FOR LAW OR MODELTETRAGRAM FOR RESPONSETETR" + - "AGRAM FOR GOING TO MEETTETRAGRAM FOR ENCOUNTERSTETRAGRAM FOR STOVETETRAG" + - "RAM FOR GREATNESSTETRAGRAM FOR ENLARGEMENTTETRAGRAM FOR PATTERNTETRAGRAM" + - " FOR RITUALTETRAGRAM FOR FLIGHTTETRAGRAM FOR VASTNESS OR WASTINGTETRAGRA" + - "M FOR CONSTANCYTETRAGRAM FOR MEASURETETRAGRAM FOR ETERNITYTETRAGRAM FOR " + - "UNITYTETRAGRAM FOR DIMINISHMENTTETRAGRAM FOR CLOSED MOUTHTETRAGRAM FOR G" + - "UARDEDNESSTETRAGRAM FOR GATHERING INTETRAGRAM FOR MASSINGTETRAGRAM FOR A" + - "CCUMULATIONTETRAGRAM FOR EMBELLISHMENTTETRAGRAM FOR DOUBTTETRAGRAM FOR W" + - "ATCHTETRAGRAM FOR SINKINGTETRAGRAM FOR INNERTETRAGRAM FOR DEPARTURETETRA" + - "GRAM FOR DARKENINGTETRAGRAM FOR DIMMINGTETRAGRAM FOR EXHAUSTIONTETRAGRAM" + - " FOR SEVERANCETETRAGRAM FOR STOPPAGETETRAGRAM FOR HARDNESSTETRAGRAM FOR " + - "COMPLETIONTETRAGRAM FOR CLOSURETETRAGRAM FOR FAILURETETRAGRAM FOR AGGRAV" + - "ATIONTETRAGRAM FOR COMPLIANCETETRAGRAM FOR ON THE VERGETETRAGRAM FOR DIF" + - "FICULTIESTETRAGRAM FOR LABOURINGTETRAGRAM FOR FOSTERINGCOUNTING ROD UNIT" + - " DIGIT ONECOUNTING ROD UNIT DIGIT TWOCOUNTING ROD UNIT DIGIT THREECOUNTI" + - "NG ROD UNIT DIGIT FOURCOUNTING ROD UNIT DIGIT FIVECOUNTING ROD UNIT DIGI" + - "T SIXCOUNTING ROD UNIT DIGIT SEVENCOUNTING ROD UNIT DIGIT EIGHTCOUNTING " + - "ROD UNIT DIGIT NINECOUNTING ROD TENS DIGIT ONECOUNTING ROD TENS DIGIT TW" + - "OCOUNTING ROD TENS DIGIT THREECOUNTING ROD TENS DIGIT FOURCOUNTING ROD T" + - "ENS DIGIT FIVECOUNTING ROD TENS DIGIT SIXCOUNTING ROD TENS DIGIT SEVENCO" + - "UNTING ROD TENS DIGIT EIGHTCOUNTING ROD TENS DIGIT NINEMATHEMATICAL BOLD" + - " CAPITAL AMATHEMATICAL BOLD CAPITAL BMATHEMATICAL BOLD CAPITAL CMATHEMAT" + - "ICAL BOLD CAPITAL DMATHEMATICAL BOLD CAPITAL EMATHEMATICAL BOLD CAPITAL " + - "FMATHEMATICAL BOLD CAPITAL GMATHEMATICAL BOLD CAPITAL HMATHEMATICAL BOLD" + - " CAPITAL IMATHEMATICAL BOLD CAPITAL JMATHEMATICAL BOLD CAPITAL KMATHEMAT" + - "ICAL BOLD CAPITAL LMATHEMATICAL BOLD CAPITAL MMATHEMATICAL BOLD CAPITAL " + - "NMATHEMATICAL BOLD CAPITAL OMATHEMATICAL BOLD CAPITAL PMATHEMATICAL BOLD" + - " CAPITAL QMATHEMATICAL BOLD CAPITAL RMATHEMATICAL BOLD CAPITAL SMATHEMAT" + - "ICAL BOLD CAPITAL TMATHEMATICAL BOLD CAPITAL UMATHEMATICAL BOLD CAPITAL " + - "VMATHEMATICAL BOLD CAPITAL WMATHEMATICAL BOLD CAPITAL XMATHEMATICAL BOLD" + - " CAPITAL YMATHEMATICAL BOLD CAPITAL ZMATHEMATICAL BOLD SMALL AMATHEMATIC" + - "AL BOLD SMALL BMATHEMATICAL BOLD SMALL CMATHEMATICAL BOLD SMALL DMATHEMA" + - "TICAL BOLD SMALL EMATHEMATICAL BOLD SMALL FMATHEMATICAL BOLD SMALL GMATH" + - "EMATICAL BOLD SMALL HMATHEMATICAL BOLD SMALL IMATHEMATICAL BOLD SMALL JM" + - "ATHEMATICAL BOLD SMALL KMATHEMATICAL BOLD SMALL LMATHEMATICAL BOLD SMALL" + - " MMATHEMATICAL BOLD SMALL NMATHEMATICAL BOLD SMALL OMATHEMATICAL BOLD SM" + - "ALL PMATHEMATICAL BOLD SMALL QMATHEMATICAL BOLD SMALL RMATHEMATICAL BOLD") + ("" + - " SMALL SMATHEMATICAL BOLD SMALL TMATHEMATICAL BOLD SMALL UMATHEMATICAL B" + - "OLD SMALL VMATHEMATICAL BOLD SMALL WMATHEMATICAL BOLD SMALL XMATHEMATICA" + - "L BOLD SMALL YMATHEMATICAL BOLD SMALL ZMATHEMATICAL ITALIC CAPITAL AMATH" + - "EMATICAL ITALIC CAPITAL BMATHEMATICAL ITALIC CAPITAL CMATHEMATICAL ITALI" + - "C CAPITAL DMATHEMATICAL ITALIC CAPITAL EMATHEMATICAL ITALIC CAPITAL FMAT" + - "HEMATICAL ITALIC CAPITAL GMATHEMATICAL ITALIC CAPITAL HMATHEMATICAL ITAL" + - "IC CAPITAL IMATHEMATICAL ITALIC CAPITAL JMATHEMATICAL ITALIC CAPITAL KMA" + - "THEMATICAL ITALIC CAPITAL LMATHEMATICAL ITALIC CAPITAL MMATHEMATICAL ITA" + - "LIC CAPITAL NMATHEMATICAL ITALIC CAPITAL OMATHEMATICAL ITALIC CAPITAL PM" + - "ATHEMATICAL ITALIC CAPITAL QMATHEMATICAL ITALIC CAPITAL RMATHEMATICAL IT" + - "ALIC CAPITAL SMATHEMATICAL ITALIC CAPITAL TMATHEMATICAL ITALIC CAPITAL U" + - "MATHEMATICAL ITALIC CAPITAL VMATHEMATICAL ITALIC CAPITAL WMATHEMATICAL I" + - "TALIC CAPITAL XMATHEMATICAL ITALIC CAPITAL YMATHEMATICAL ITALIC CAPITAL " + - "ZMATHEMATICAL ITALIC SMALL AMATHEMATICAL ITALIC SMALL BMATHEMATICAL ITAL" + - "IC SMALL CMATHEMATICAL ITALIC SMALL DMATHEMATICAL ITALIC SMALL EMATHEMAT" + - "ICAL ITALIC SMALL FMATHEMATICAL ITALIC SMALL GMATHEMATICAL ITALIC SMALL " + - "IMATHEMATICAL ITALIC SMALL JMATHEMATICAL ITALIC SMALL KMATHEMATICAL ITAL" + - "IC SMALL LMATHEMATICAL ITALIC SMALL MMATHEMATICAL ITALIC SMALL NMATHEMAT" + - "ICAL ITALIC SMALL OMATHEMATICAL ITALIC SMALL PMATHEMATICAL ITALIC SMALL " + - "QMATHEMATICAL ITALIC SMALL RMATHEMATICAL ITALIC SMALL SMATHEMATICAL ITAL" + - "IC SMALL TMATHEMATICAL ITALIC SMALL UMATHEMATICAL ITALIC SMALL VMATHEMAT" + - "ICAL ITALIC SMALL WMATHEMATICAL ITALIC SMALL XMATHEMATICAL ITALIC SMALL " + - "YMATHEMATICAL ITALIC SMALL ZMATHEMATICAL BOLD ITALIC CAPITAL AMATHEMATIC" + - "AL BOLD ITALIC CAPITAL BMATHEMATICAL BOLD ITALIC CAPITAL CMATHEMATICAL B" + - "OLD ITALIC CAPITAL DMATHEMATICAL BOLD ITALIC CAPITAL EMATHEMATICAL BOLD " + - "ITALIC CAPITAL FMATHEMATICAL BOLD ITALIC CAPITAL GMATHEMATICAL BOLD ITAL" + - "IC CAPITAL HMATHEMATICAL BOLD ITALIC CAPITAL IMATHEMATICAL BOLD ITALIC C" + - "APITAL JMATHEMATICAL BOLD ITALIC CAPITAL KMATHEMATICAL BOLD ITALIC CAPIT" + - "AL LMATHEMATICAL BOLD ITALIC CAPITAL MMATHEMATICAL BOLD ITALIC CAPITAL N" + - "MATHEMATICAL BOLD ITALIC CAPITAL OMATHEMATICAL BOLD ITALIC CAPITAL PMATH" + - "EMATICAL BOLD ITALIC CAPITAL QMATHEMATICAL BOLD ITALIC CAPITAL RMATHEMAT" + - "ICAL BOLD ITALIC CAPITAL SMATHEMATICAL BOLD ITALIC CAPITAL TMATHEMATICAL" + - " BOLD ITALIC CAPITAL UMATHEMATICAL BOLD ITALIC CAPITAL VMATHEMATICAL BOL" + - "D ITALIC CAPITAL WMATHEMATICAL BOLD ITALIC CAPITAL XMATHEMATICAL BOLD IT" + - "ALIC CAPITAL YMATHEMATICAL BOLD ITALIC CAPITAL ZMATHEMATICAL BOLD ITALIC" + - " SMALL AMATHEMATICAL BOLD ITALIC SMALL BMATHEMATICAL BOLD ITALIC SMALL C" + - "MATHEMATICAL BOLD ITALIC SMALL DMATHEMATICAL BOLD ITALIC SMALL EMATHEMAT" + - "ICAL BOLD ITALIC SMALL FMATHEMATICAL BOLD ITALIC SMALL GMATHEMATICAL BOL" + - "D ITALIC SMALL HMATHEMATICAL BOLD ITALIC SMALL IMATHEMATICAL BOLD ITALIC" + - " SMALL JMATHEMATICAL BOLD ITALIC SMALL KMATHEMATICAL BOLD ITALIC SMALL L" + - "MATHEMATICAL BOLD ITALIC SMALL MMATHEMATICAL BOLD ITALIC SMALL NMATHEMAT" + - "ICAL BOLD ITALIC SMALL OMATHEMATICAL BOLD ITALIC SMALL PMATHEMATICAL BOL" + - "D ITALIC SMALL QMATHEMATICAL BOLD ITALIC SMALL RMATHEMATICAL BOLD ITALIC" + - " SMALL SMATHEMATICAL BOLD ITALIC SMALL TMATHEMATICAL BOLD ITALIC SMALL U" + - "MATHEMATICAL BOLD ITALIC SMALL VMATHEMATICAL BOLD ITALIC SMALL WMATHEMAT" + - "ICAL BOLD ITALIC SMALL XMATHEMATICAL BOLD ITALIC SMALL YMATHEMATICAL BOL" + - "D ITALIC SMALL ZMATHEMATICAL SCRIPT CAPITAL AMATHEMATICAL SCRIPT CAPITAL" + - " CMATHEMATICAL SCRIPT CAPITAL DMATHEMATICAL SCRIPT CAPITAL GMATHEMATICAL" + - " SCRIPT CAPITAL JMATHEMATICAL SCRIPT CAPITAL KMATHEMATICAL SCRIPT CAPITA" + - "L NMATHEMATICAL SCRIPT CAPITAL OMATHEMATICAL SCRIPT CAPITAL PMATHEMATICA" + - "L SCRIPT CAPITAL QMATHEMATICAL SCRIPT CAPITAL SMATHEMATICAL SCRIPT CAPIT" + - "AL TMATHEMATICAL SCRIPT CAPITAL UMATHEMATICAL SCRIPT CAPITAL VMATHEMATIC" + - "AL SCRIPT CAPITAL WMATHEMATICAL SCRIPT CAPITAL XMATHEMATICAL SCRIPT CAPI" + - "TAL YMATHEMATICAL SCRIPT CAPITAL ZMATHEMATICAL SCRIPT SMALL AMATHEMATICA" + - "L SCRIPT SMALL BMATHEMATICAL SCRIPT SMALL CMATHEMATICAL SCRIPT SMALL DMA" + - "THEMATICAL SCRIPT SMALL FMATHEMATICAL SCRIPT SMALL HMATHEMATICAL SCRIPT " + - "SMALL IMATHEMATICAL SCRIPT SMALL JMATHEMATICAL SCRIPT SMALL KMATHEMATICA" + - "L SCRIPT SMALL LMATHEMATICAL SCRIPT SMALL MMATHEMATICAL SCRIPT SMALL NMA" + - "THEMATICAL SCRIPT SMALL PMATHEMATICAL SCRIPT SMALL QMATHEMATICAL SCRIPT " + - "SMALL RMATHEMATICAL SCRIPT SMALL SMATHEMATICAL SCRIPT SMALL TMATHEMATICA" + - "L SCRIPT SMALL UMATHEMATICAL SCRIPT SMALL VMATHEMATICAL SCRIPT SMALL WMA" + - "THEMATICAL SCRIPT SMALL XMATHEMATICAL SCRIPT SMALL YMATHEMATICAL SCRIPT " + - "SMALL ZMATHEMATICAL BOLD SCRIPT CAPITAL AMATHEMATICAL BOLD SCRIPT CAPITA" + - "L BMATHEMATICAL BOLD SCRIPT CAPITAL CMATHEMATICAL BOLD SCRIPT CAPITAL DM") + ("" + - "ATHEMATICAL BOLD SCRIPT CAPITAL EMATHEMATICAL BOLD SCRIPT CAPITAL FMATHE" + - "MATICAL BOLD SCRIPT CAPITAL GMATHEMATICAL BOLD SCRIPT CAPITAL HMATHEMATI" + - "CAL BOLD SCRIPT CAPITAL IMATHEMATICAL BOLD SCRIPT CAPITAL JMATHEMATICAL " + - "BOLD SCRIPT CAPITAL KMATHEMATICAL BOLD SCRIPT CAPITAL LMATHEMATICAL BOLD" + - " SCRIPT CAPITAL MMATHEMATICAL BOLD SCRIPT CAPITAL NMATHEMATICAL BOLD SCR" + - "IPT CAPITAL OMATHEMATICAL BOLD SCRIPT CAPITAL PMATHEMATICAL BOLD SCRIPT " + - "CAPITAL QMATHEMATICAL BOLD SCRIPT CAPITAL RMATHEMATICAL BOLD SCRIPT CAPI" + - "TAL SMATHEMATICAL BOLD SCRIPT CAPITAL TMATHEMATICAL BOLD SCRIPT CAPITAL " + - "UMATHEMATICAL BOLD SCRIPT CAPITAL VMATHEMATICAL BOLD SCRIPT CAPITAL WMAT" + - "HEMATICAL BOLD SCRIPT CAPITAL XMATHEMATICAL BOLD SCRIPT CAPITAL YMATHEMA" + - "TICAL BOLD SCRIPT CAPITAL ZMATHEMATICAL BOLD SCRIPT SMALL AMATHEMATICAL " + - "BOLD SCRIPT SMALL BMATHEMATICAL BOLD SCRIPT SMALL CMATHEMATICAL BOLD SCR" + - "IPT SMALL DMATHEMATICAL BOLD SCRIPT SMALL EMATHEMATICAL BOLD SCRIPT SMAL" + - "L FMATHEMATICAL BOLD SCRIPT SMALL GMATHEMATICAL BOLD SCRIPT SMALL HMATHE" + - "MATICAL BOLD SCRIPT SMALL IMATHEMATICAL BOLD SCRIPT SMALL JMATHEMATICAL " + - "BOLD SCRIPT SMALL KMATHEMATICAL BOLD SCRIPT SMALL LMATHEMATICAL BOLD SCR" + - "IPT SMALL MMATHEMATICAL BOLD SCRIPT SMALL NMATHEMATICAL BOLD SCRIPT SMAL" + - "L OMATHEMATICAL BOLD SCRIPT SMALL PMATHEMATICAL BOLD SCRIPT SMALL QMATHE" + - "MATICAL BOLD SCRIPT SMALL RMATHEMATICAL BOLD SCRIPT SMALL SMATHEMATICAL " + - "BOLD SCRIPT SMALL TMATHEMATICAL BOLD SCRIPT SMALL UMATHEMATICAL BOLD SCR" + - "IPT SMALL VMATHEMATICAL BOLD SCRIPT SMALL WMATHEMATICAL BOLD SCRIPT SMAL" + - "L XMATHEMATICAL BOLD SCRIPT SMALL YMATHEMATICAL BOLD SCRIPT SMALL ZMATHE" + - "MATICAL FRAKTUR CAPITAL AMATHEMATICAL FRAKTUR CAPITAL BMATHEMATICAL FRAK" + - "TUR CAPITAL DMATHEMATICAL FRAKTUR CAPITAL EMATHEMATICAL FRAKTUR CAPITAL " + - "FMATHEMATICAL FRAKTUR CAPITAL GMATHEMATICAL FRAKTUR CAPITAL JMATHEMATICA" + - "L FRAKTUR CAPITAL KMATHEMATICAL FRAKTUR CAPITAL LMATHEMATICAL FRAKTUR CA" + - "PITAL MMATHEMATICAL FRAKTUR CAPITAL NMATHEMATICAL FRAKTUR CAPITAL OMATHE" + - "MATICAL FRAKTUR CAPITAL PMATHEMATICAL FRAKTUR CAPITAL QMATHEMATICAL FRAK" + - "TUR CAPITAL SMATHEMATICAL FRAKTUR CAPITAL TMATHEMATICAL FRAKTUR CAPITAL " + - "UMATHEMATICAL FRAKTUR CAPITAL VMATHEMATICAL FRAKTUR CAPITAL WMATHEMATICA" + - "L FRAKTUR CAPITAL XMATHEMATICAL FRAKTUR CAPITAL YMATHEMATICAL FRAKTUR SM" + - "ALL AMATHEMATICAL FRAKTUR SMALL BMATHEMATICAL FRAKTUR SMALL CMATHEMATICA" + - "L FRAKTUR SMALL DMATHEMATICAL FRAKTUR SMALL EMATHEMATICAL FRAKTUR SMALL " + - "FMATHEMATICAL FRAKTUR SMALL GMATHEMATICAL FRAKTUR SMALL HMATHEMATICAL FR" + - "AKTUR SMALL IMATHEMATICAL FRAKTUR SMALL JMATHEMATICAL FRAKTUR SMALL KMAT" + - "HEMATICAL FRAKTUR SMALL LMATHEMATICAL FRAKTUR SMALL MMATHEMATICAL FRAKTU" + - "R SMALL NMATHEMATICAL FRAKTUR SMALL OMATHEMATICAL FRAKTUR SMALL PMATHEMA" + - "TICAL FRAKTUR SMALL QMATHEMATICAL FRAKTUR SMALL RMATHEMATICAL FRAKTUR SM" + - "ALL SMATHEMATICAL FRAKTUR SMALL TMATHEMATICAL FRAKTUR SMALL UMATHEMATICA" + - "L FRAKTUR SMALL VMATHEMATICAL FRAKTUR SMALL WMATHEMATICAL FRAKTUR SMALL " + - "XMATHEMATICAL FRAKTUR SMALL YMATHEMATICAL FRAKTUR SMALL ZMATHEMATICAL DO" + - "UBLE-STRUCK CAPITAL AMATHEMATICAL DOUBLE-STRUCK CAPITAL BMATHEMATICAL DO" + - "UBLE-STRUCK CAPITAL DMATHEMATICAL DOUBLE-STRUCK CAPITAL EMATHEMATICAL DO" + - "UBLE-STRUCK CAPITAL FMATHEMATICAL DOUBLE-STRUCK CAPITAL GMATHEMATICAL DO" + - "UBLE-STRUCK CAPITAL IMATHEMATICAL DOUBLE-STRUCK CAPITAL JMATHEMATICAL DO" + - "UBLE-STRUCK CAPITAL KMATHEMATICAL DOUBLE-STRUCK CAPITAL LMATHEMATICAL DO" + - "UBLE-STRUCK CAPITAL MMATHEMATICAL DOUBLE-STRUCK CAPITAL OMATHEMATICAL DO" + - "UBLE-STRUCK CAPITAL SMATHEMATICAL DOUBLE-STRUCK CAPITAL TMATHEMATICAL DO" + - "UBLE-STRUCK CAPITAL UMATHEMATICAL DOUBLE-STRUCK CAPITAL VMATHEMATICAL DO" + - "UBLE-STRUCK CAPITAL WMATHEMATICAL DOUBLE-STRUCK CAPITAL XMATHEMATICAL DO" + - "UBLE-STRUCK CAPITAL YMATHEMATICAL DOUBLE-STRUCK SMALL AMATHEMATICAL DOUB" + - "LE-STRUCK SMALL BMATHEMATICAL DOUBLE-STRUCK SMALL CMATHEMATICAL DOUBLE-S" + - "TRUCK SMALL DMATHEMATICAL DOUBLE-STRUCK SMALL EMATHEMATICAL DOUBLE-STRUC" + - "K SMALL FMATHEMATICAL DOUBLE-STRUCK SMALL GMATHEMATICAL DOUBLE-STRUCK SM" + - "ALL HMATHEMATICAL DOUBLE-STRUCK SMALL IMATHEMATICAL DOUBLE-STRUCK SMALL " + - "JMATHEMATICAL DOUBLE-STRUCK SMALL KMATHEMATICAL DOUBLE-STRUCK SMALL LMAT" + - "HEMATICAL DOUBLE-STRUCK SMALL MMATHEMATICAL DOUBLE-STRUCK SMALL NMATHEMA" + - "TICAL DOUBLE-STRUCK SMALL OMATHEMATICAL DOUBLE-STRUCK SMALL PMATHEMATICA" + - "L DOUBLE-STRUCK SMALL QMATHEMATICAL DOUBLE-STRUCK SMALL RMATHEMATICAL DO" + - "UBLE-STRUCK SMALL SMATHEMATICAL DOUBLE-STRUCK SMALL TMATHEMATICAL DOUBLE" + - "-STRUCK SMALL UMATHEMATICAL DOUBLE-STRUCK SMALL VMATHEMATICAL DOUBLE-STR" + - "UCK SMALL WMATHEMATICAL DOUBLE-STRUCK SMALL XMATHEMATICAL DOUBLE-STRUCK " + - "SMALL YMATHEMATICAL DOUBLE-STRUCK SMALL ZMATHEMATICAL BOLD FRAKTUR CAPIT" + - "AL AMATHEMATICAL BOLD FRAKTUR CAPITAL BMATHEMATICAL BOLD FRAKTUR CAPITAL") + ("" + - " CMATHEMATICAL BOLD FRAKTUR CAPITAL DMATHEMATICAL BOLD FRAKTUR CAPITAL E" + - "MATHEMATICAL BOLD FRAKTUR CAPITAL FMATHEMATICAL BOLD FRAKTUR CAPITAL GMA" + - "THEMATICAL BOLD FRAKTUR CAPITAL HMATHEMATICAL BOLD FRAKTUR CAPITAL IMATH" + - "EMATICAL BOLD FRAKTUR CAPITAL JMATHEMATICAL BOLD FRAKTUR CAPITAL KMATHEM" + - "ATICAL BOLD FRAKTUR CAPITAL LMATHEMATICAL BOLD FRAKTUR CAPITAL MMATHEMAT" + - "ICAL BOLD FRAKTUR CAPITAL NMATHEMATICAL BOLD FRAKTUR CAPITAL OMATHEMATIC" + - "AL BOLD FRAKTUR CAPITAL PMATHEMATICAL BOLD FRAKTUR CAPITAL QMATHEMATICAL" + - " BOLD FRAKTUR CAPITAL RMATHEMATICAL BOLD FRAKTUR CAPITAL SMATHEMATICAL B" + - "OLD FRAKTUR CAPITAL TMATHEMATICAL BOLD FRAKTUR CAPITAL UMATHEMATICAL BOL" + - "D FRAKTUR CAPITAL VMATHEMATICAL BOLD FRAKTUR CAPITAL WMATHEMATICAL BOLD " + - "FRAKTUR CAPITAL XMATHEMATICAL BOLD FRAKTUR CAPITAL YMATHEMATICAL BOLD FR" + - "AKTUR CAPITAL ZMATHEMATICAL BOLD FRAKTUR SMALL AMATHEMATICAL BOLD FRAKTU" + - "R SMALL BMATHEMATICAL BOLD FRAKTUR SMALL CMATHEMATICAL BOLD FRAKTUR SMAL" + - "L DMATHEMATICAL BOLD FRAKTUR SMALL EMATHEMATICAL BOLD FRAKTUR SMALL FMAT" + - "HEMATICAL BOLD FRAKTUR SMALL GMATHEMATICAL BOLD FRAKTUR SMALL HMATHEMATI" + - "CAL BOLD FRAKTUR SMALL IMATHEMATICAL BOLD FRAKTUR SMALL JMATHEMATICAL BO" + - "LD FRAKTUR SMALL KMATHEMATICAL BOLD FRAKTUR SMALL LMATHEMATICAL BOLD FRA" + - "KTUR SMALL MMATHEMATICAL BOLD FRAKTUR SMALL NMATHEMATICAL BOLD FRAKTUR S" + - "MALL OMATHEMATICAL BOLD FRAKTUR SMALL PMATHEMATICAL BOLD FRAKTUR SMALL Q" + - "MATHEMATICAL BOLD FRAKTUR SMALL RMATHEMATICAL BOLD FRAKTUR SMALL SMATHEM" + - "ATICAL BOLD FRAKTUR SMALL TMATHEMATICAL BOLD FRAKTUR SMALL UMATHEMATICAL" + - " BOLD FRAKTUR SMALL VMATHEMATICAL BOLD FRAKTUR SMALL WMATHEMATICAL BOLD " + - "FRAKTUR SMALL XMATHEMATICAL BOLD FRAKTUR SMALL YMATHEMATICAL BOLD FRAKTU" + - "R SMALL ZMATHEMATICAL SANS-SERIF CAPITAL AMATHEMATICAL SANS-SERIF CAPITA" + - "L BMATHEMATICAL SANS-SERIF CAPITAL CMATHEMATICAL SANS-SERIF CAPITAL DMAT" + - "HEMATICAL SANS-SERIF CAPITAL EMATHEMATICAL SANS-SERIF CAPITAL FMATHEMATI" + - "CAL SANS-SERIF CAPITAL GMATHEMATICAL SANS-SERIF CAPITAL HMATHEMATICAL SA" + - "NS-SERIF CAPITAL IMATHEMATICAL SANS-SERIF CAPITAL JMATHEMATICAL SANS-SER" + - "IF CAPITAL KMATHEMATICAL SANS-SERIF CAPITAL LMATHEMATICAL SANS-SERIF CAP" + - "ITAL MMATHEMATICAL SANS-SERIF CAPITAL NMATHEMATICAL SANS-SERIF CAPITAL O" + - "MATHEMATICAL SANS-SERIF CAPITAL PMATHEMATICAL SANS-SERIF CAPITAL QMATHEM" + - "ATICAL SANS-SERIF CAPITAL RMATHEMATICAL SANS-SERIF CAPITAL SMATHEMATICAL" + - " SANS-SERIF CAPITAL TMATHEMATICAL SANS-SERIF CAPITAL UMATHEMATICAL SANS-" + - "SERIF CAPITAL VMATHEMATICAL SANS-SERIF CAPITAL WMATHEMATICAL SANS-SERIF " + - "CAPITAL XMATHEMATICAL SANS-SERIF CAPITAL YMATHEMATICAL SANS-SERIF CAPITA" + - "L ZMATHEMATICAL SANS-SERIF SMALL AMATHEMATICAL SANS-SERIF SMALL BMATHEMA" + - "TICAL SANS-SERIF SMALL CMATHEMATICAL SANS-SERIF SMALL DMATHEMATICAL SANS" + - "-SERIF SMALL EMATHEMATICAL SANS-SERIF SMALL FMATHEMATICAL SANS-SERIF SMA" + - "LL GMATHEMATICAL SANS-SERIF SMALL HMATHEMATICAL SANS-SERIF SMALL IMATHEM" + - "ATICAL SANS-SERIF SMALL JMATHEMATICAL SANS-SERIF SMALL KMATHEMATICAL SAN" + - "S-SERIF SMALL LMATHEMATICAL SANS-SERIF SMALL MMATHEMATICAL SANS-SERIF SM" + - "ALL NMATHEMATICAL SANS-SERIF SMALL OMATHEMATICAL SANS-SERIF SMALL PMATHE" + - "MATICAL SANS-SERIF SMALL QMATHEMATICAL SANS-SERIF SMALL RMATHEMATICAL SA" + - "NS-SERIF SMALL SMATHEMATICAL SANS-SERIF SMALL TMATHEMATICAL SANS-SERIF S" + - "MALL UMATHEMATICAL SANS-SERIF SMALL VMATHEMATICAL SANS-SERIF SMALL WMATH" + - "EMATICAL SANS-SERIF SMALL XMATHEMATICAL SANS-SERIF SMALL YMATHEMATICAL S" + - "ANS-SERIF SMALL ZMATHEMATICAL SANS-SERIF BOLD CAPITAL AMATHEMATICAL SANS" + - "-SERIF BOLD CAPITAL BMATHEMATICAL SANS-SERIF BOLD CAPITAL CMATHEMATICAL " + - "SANS-SERIF BOLD CAPITAL DMATHEMATICAL SANS-SERIF BOLD CAPITAL EMATHEMATI" + - "CAL SANS-SERIF BOLD CAPITAL FMATHEMATICAL SANS-SERIF BOLD CAPITAL GMATHE" + - "MATICAL SANS-SERIF BOLD CAPITAL HMATHEMATICAL SANS-SERIF BOLD CAPITAL IM" + - "ATHEMATICAL SANS-SERIF BOLD CAPITAL JMATHEMATICAL SANS-SERIF BOLD CAPITA" + - "L KMATHEMATICAL SANS-SERIF BOLD CAPITAL LMATHEMATICAL SANS-SERIF BOLD CA" + - "PITAL MMATHEMATICAL SANS-SERIF BOLD CAPITAL NMATHEMATICAL SANS-SERIF BOL" + - "D CAPITAL OMATHEMATICAL SANS-SERIF BOLD CAPITAL PMATHEMATICAL SANS-SERIF" + - " BOLD CAPITAL QMATHEMATICAL SANS-SERIF BOLD CAPITAL RMATHEMATICAL SANS-S" + - "ERIF BOLD CAPITAL SMATHEMATICAL SANS-SERIF BOLD CAPITAL TMATHEMATICAL SA" + - "NS-SERIF BOLD CAPITAL UMATHEMATICAL SANS-SERIF BOLD CAPITAL VMATHEMATICA" + - "L SANS-SERIF BOLD CAPITAL WMATHEMATICAL SANS-SERIF BOLD CAPITAL XMATHEMA" + - "TICAL SANS-SERIF BOLD CAPITAL YMATHEMATICAL SANS-SERIF BOLD CAPITAL ZMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL AMATHEMATICAL SANS-SERIF BOLD SMALL BMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL CMATHEMATICAL SANS-SERIF BOLD SMALL DMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL EMATHEMATICAL SANS-SERIF BOLD SMALL FMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL GMATHEMATICAL SANS-SERIF BOLD SMALL HMAT") + ("" + - "HEMATICAL SANS-SERIF BOLD SMALL IMATHEMATICAL SANS-SERIF BOLD SMALL JMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL KMATHEMATICAL SANS-SERIF BOLD SMALL LMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL MMATHEMATICAL SANS-SERIF BOLD SMALL NMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL OMATHEMATICAL SANS-SERIF BOLD SMALL PMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL QMATHEMATICAL SANS-SERIF BOLD SMALL RMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL SMATHEMATICAL SANS-SERIF BOLD SMALL TMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL UMATHEMATICAL SANS-SERIF BOLD SMALL VMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL WMATHEMATICAL SANS-SERIF BOLD SMALL XMAT" + - "HEMATICAL SANS-SERIF BOLD SMALL YMATHEMATICAL SANS-SERIF BOLD SMALL ZMAT" + - "HEMATICAL SANS-SERIF ITALIC CAPITAL AMATHEMATICAL SANS-SERIF ITALIC CAPI" + - "TAL BMATHEMATICAL SANS-SERIF ITALIC CAPITAL CMATHEMATICAL SANS-SERIF ITA" + - "LIC CAPITAL DMATHEMATICAL SANS-SERIF ITALIC CAPITAL EMATHEMATICAL SANS-S" + - "ERIF ITALIC CAPITAL FMATHEMATICAL SANS-SERIF ITALIC CAPITAL GMATHEMATICA" + - "L SANS-SERIF ITALIC CAPITAL HMATHEMATICAL SANS-SERIF ITALIC CAPITAL IMAT" + - "HEMATICAL SANS-SERIF ITALIC CAPITAL JMATHEMATICAL SANS-SERIF ITALIC CAPI" + - "TAL KMATHEMATICAL SANS-SERIF ITALIC CAPITAL LMATHEMATICAL SANS-SERIF ITA" + - "LIC CAPITAL MMATHEMATICAL SANS-SERIF ITALIC CAPITAL NMATHEMATICAL SANS-S" + - "ERIF ITALIC CAPITAL OMATHEMATICAL SANS-SERIF ITALIC CAPITAL PMATHEMATICA" + - "L SANS-SERIF ITALIC CAPITAL QMATHEMATICAL SANS-SERIF ITALIC CAPITAL RMAT" + - "HEMATICAL SANS-SERIF ITALIC CAPITAL SMATHEMATICAL SANS-SERIF ITALIC CAPI" + - "TAL TMATHEMATICAL SANS-SERIF ITALIC CAPITAL UMATHEMATICAL SANS-SERIF ITA" + - "LIC CAPITAL VMATHEMATICAL SANS-SERIF ITALIC CAPITAL WMATHEMATICAL SANS-S" + - "ERIF ITALIC CAPITAL XMATHEMATICAL SANS-SERIF ITALIC CAPITAL YMATHEMATICA" + - "L SANS-SERIF ITALIC CAPITAL ZMATHEMATICAL SANS-SERIF ITALIC SMALL AMATHE" + - "MATICAL SANS-SERIF ITALIC SMALL BMATHEMATICAL SANS-SERIF ITALIC SMALL CM" + - "ATHEMATICAL SANS-SERIF ITALIC SMALL DMATHEMATICAL SANS-SERIF ITALIC SMAL" + - "L EMATHEMATICAL SANS-SERIF ITALIC SMALL FMATHEMATICAL SANS-SERIF ITALIC " + - "SMALL GMATHEMATICAL SANS-SERIF ITALIC SMALL HMATHEMATICAL SANS-SERIF ITA" + - "LIC SMALL IMATHEMATICAL SANS-SERIF ITALIC SMALL JMATHEMATICAL SANS-SERIF" + - " ITALIC SMALL KMATHEMATICAL SANS-SERIF ITALIC SMALL LMATHEMATICAL SANS-S" + - "ERIF ITALIC SMALL MMATHEMATICAL SANS-SERIF ITALIC SMALL NMATHEMATICAL SA" + - "NS-SERIF ITALIC SMALL OMATHEMATICAL SANS-SERIF ITALIC SMALL PMATHEMATICA" + - "L SANS-SERIF ITALIC SMALL QMATHEMATICAL SANS-SERIF ITALIC SMALL RMATHEMA" + - "TICAL SANS-SERIF ITALIC SMALL SMATHEMATICAL SANS-SERIF ITALIC SMALL TMAT" + - "HEMATICAL SANS-SERIF ITALIC SMALL UMATHEMATICAL SANS-SERIF ITALIC SMALL " + - "VMATHEMATICAL SANS-SERIF ITALIC SMALL WMATHEMATICAL SANS-SERIF ITALIC SM" + - "ALL XMATHEMATICAL SANS-SERIF ITALIC SMALL YMATHEMATICAL SANS-SERIF ITALI" + - "C SMALL ZMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL AMATHEMATICAL SANS-" + - "SERIF BOLD ITALIC CAPITAL BMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C" + - "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DMATHEMATICAL SANS-SERIF BOL" + - "D ITALIC CAPITAL EMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL FMATHEMATI" + - "CAL SANS-SERIF BOLD ITALIC CAPITAL GMATHEMATICAL SANS-SERIF BOLD ITALIC " + - "CAPITAL HMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IMATHEMATICAL SANS-" + - "SERIF BOLD ITALIC CAPITAL JMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K" + - "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LMATHEMATICAL SANS-SERIF BOL" + - "D ITALIC CAPITAL MMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NMATHEMATI" + - "CAL SANS-SERIF BOLD ITALIC CAPITAL OMATHEMATICAL SANS-SERIF BOLD ITALIC " + - "CAPITAL PMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL QMATHEMATICAL SANS-" + - "SERIF BOLD ITALIC CAPITAL RMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S" + - "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TMATHEMATICAL SANS-SERIF BOL" + - "D ITALIC CAPITAL UMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL VMATHEMATI" + - "CAL SANS-SERIF BOLD ITALIC CAPITAL WMATHEMATICAL SANS-SERIF BOLD ITALIC " + - "CAPITAL XMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL YMATHEMATICAL SANS-" + - "SERIF BOLD ITALIC CAPITAL ZMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL AMA" + - "THEMATICAL SANS-SERIF BOLD ITALIC SMALL BMATHEMATICAL SANS-SERIF BOLD IT" + - "ALIC SMALL CMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DMATHEMATICAL SANS" + - "-SERIF BOLD ITALIC SMALL EMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FMAT" + - "HEMATICAL SANS-SERIF BOLD ITALIC SMALL GMATHEMATICAL SANS-SERIF BOLD ITA" + - "LIC SMALL HMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IMATHEMATICAL SANS-" + - "SERIF BOLD ITALIC SMALL JMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KMATH" + - "EMATICAL SANS-SERIF BOLD ITALIC SMALL LMATHEMATICAL SANS-SERIF BOLD ITAL" + - "IC SMALL MMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NMATHEMATICAL SANS-S" + - "ERIF BOLD ITALIC SMALL OMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PMATHE" + - "MATICAL SANS-SERIF BOLD ITALIC SMALL QMATHEMATICAL SANS-SERIF BOLD ITALI") + ("" + - "C SMALL RMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SMATHEMATICAL SANS-SE" + - "RIF BOLD ITALIC SMALL TMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UMATHEM" + - "ATICAL SANS-SERIF BOLD ITALIC SMALL VMATHEMATICAL SANS-SERIF BOLD ITALIC" + - " SMALL WMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XMATHEMATICAL SANS-SER" + - "IF BOLD ITALIC SMALL YMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZMATHEMA" + - "TICAL MONOSPACE CAPITAL AMATHEMATICAL MONOSPACE CAPITAL BMATHEMATICAL MO" + - "NOSPACE CAPITAL CMATHEMATICAL MONOSPACE CAPITAL DMATHEMATICAL MONOSPACE " + - "CAPITAL EMATHEMATICAL MONOSPACE CAPITAL FMATHEMATICAL MONOSPACE CAPITAL " + - "GMATHEMATICAL MONOSPACE CAPITAL HMATHEMATICAL MONOSPACE CAPITAL IMATHEMA" + - "TICAL MONOSPACE CAPITAL JMATHEMATICAL MONOSPACE CAPITAL KMATHEMATICAL MO" + - "NOSPACE CAPITAL LMATHEMATICAL MONOSPACE CAPITAL MMATHEMATICAL MONOSPACE " + - "CAPITAL NMATHEMATICAL MONOSPACE CAPITAL OMATHEMATICAL MONOSPACE CAPITAL " + - "PMATHEMATICAL MONOSPACE CAPITAL QMATHEMATICAL MONOSPACE CAPITAL RMATHEMA" + - "TICAL MONOSPACE CAPITAL SMATHEMATICAL MONOSPACE CAPITAL TMATHEMATICAL MO" + - "NOSPACE CAPITAL UMATHEMATICAL MONOSPACE CAPITAL VMATHEMATICAL MONOSPACE " + - "CAPITAL WMATHEMATICAL MONOSPACE CAPITAL XMATHEMATICAL MONOSPACE CAPITAL " + - "YMATHEMATICAL MONOSPACE CAPITAL ZMATHEMATICAL MONOSPACE SMALL AMATHEMATI" + - "CAL MONOSPACE SMALL BMATHEMATICAL MONOSPACE SMALL CMATHEMATICAL MONOSPAC" + - "E SMALL DMATHEMATICAL MONOSPACE SMALL EMATHEMATICAL MONOSPACE SMALL FMAT" + - "HEMATICAL MONOSPACE SMALL GMATHEMATICAL MONOSPACE SMALL HMATHEMATICAL MO" + - "NOSPACE SMALL IMATHEMATICAL MONOSPACE SMALL JMATHEMATICAL MONOSPACE SMAL" + - "L KMATHEMATICAL MONOSPACE SMALL LMATHEMATICAL MONOSPACE SMALL MMATHEMATI" + - "CAL MONOSPACE SMALL NMATHEMATICAL MONOSPACE SMALL OMATHEMATICAL MONOSPAC" + - "E SMALL PMATHEMATICAL MONOSPACE SMALL QMATHEMATICAL MONOSPACE SMALL RMAT" + - "HEMATICAL MONOSPACE SMALL SMATHEMATICAL MONOSPACE SMALL TMATHEMATICAL MO" + - "NOSPACE SMALL UMATHEMATICAL MONOSPACE SMALL VMATHEMATICAL MONOSPACE SMAL" + - "L WMATHEMATICAL MONOSPACE SMALL XMATHEMATICAL MONOSPACE SMALL YMATHEMATI" + - "CAL MONOSPACE SMALL ZMATHEMATICAL ITALIC SMALL DOTLESS IMATHEMATICAL ITA" + - "LIC SMALL DOTLESS JMATHEMATICAL BOLD CAPITAL ALPHAMATHEMATICAL BOLD CAPI" + - "TAL BETAMATHEMATICAL BOLD CAPITAL GAMMAMATHEMATICAL BOLD CAPITAL DELTAMA" + - "THEMATICAL BOLD CAPITAL EPSILONMATHEMATICAL BOLD CAPITAL ZETAMATHEMATICA" + - "L BOLD CAPITAL ETAMATHEMATICAL BOLD CAPITAL THETAMATHEMATICAL BOLD CAPIT" + - "AL IOTAMATHEMATICAL BOLD CAPITAL KAPPAMATHEMATICAL BOLD CAPITAL LAMDAMAT" + - "HEMATICAL BOLD CAPITAL MUMATHEMATICAL BOLD CAPITAL NUMATHEMATICAL BOLD C" + - "APITAL XIMATHEMATICAL BOLD CAPITAL OMICRONMATHEMATICAL BOLD CAPITAL PIMA" + - "THEMATICAL BOLD CAPITAL RHOMATHEMATICAL BOLD CAPITAL THETA SYMBOLMATHEMA" + - "TICAL BOLD CAPITAL SIGMAMATHEMATICAL BOLD CAPITAL TAUMATHEMATICAL BOLD C" + - "APITAL UPSILONMATHEMATICAL BOLD CAPITAL PHIMATHEMATICAL BOLD CAPITAL CHI" + - "MATHEMATICAL BOLD CAPITAL PSIMATHEMATICAL BOLD CAPITAL OMEGAMATHEMATICAL" + - " BOLD NABLAMATHEMATICAL BOLD SMALL ALPHAMATHEMATICAL BOLD SMALL BETAMATH" + - "EMATICAL BOLD SMALL GAMMAMATHEMATICAL BOLD SMALL DELTAMATHEMATICAL BOLD " + - "SMALL EPSILONMATHEMATICAL BOLD SMALL ZETAMATHEMATICAL BOLD SMALL ETAMATH" + - "EMATICAL BOLD SMALL THETAMATHEMATICAL BOLD SMALL IOTAMATHEMATICAL BOLD S" + - "MALL KAPPAMATHEMATICAL BOLD SMALL LAMDAMATHEMATICAL BOLD SMALL MUMATHEMA" + - "TICAL BOLD SMALL NUMATHEMATICAL BOLD SMALL XIMATHEMATICAL BOLD SMALL OMI" + - "CRONMATHEMATICAL BOLD SMALL PIMATHEMATICAL BOLD SMALL RHOMATHEMATICAL BO" + - "LD SMALL FINAL SIGMAMATHEMATICAL BOLD SMALL SIGMAMATHEMATICAL BOLD SMALL" + - " TAUMATHEMATICAL BOLD SMALL UPSILONMATHEMATICAL BOLD SMALL PHIMATHEMATIC" + - "AL BOLD SMALL CHIMATHEMATICAL BOLD SMALL PSIMATHEMATICAL BOLD SMALL OMEG" + - "AMATHEMATICAL BOLD PARTIAL DIFFERENTIALMATHEMATICAL BOLD EPSILON SYMBOLM" + - "ATHEMATICAL BOLD THETA SYMBOLMATHEMATICAL BOLD KAPPA SYMBOLMATHEMATICAL " + - "BOLD PHI SYMBOLMATHEMATICAL BOLD RHO SYMBOLMATHEMATICAL BOLD PI SYMBOLMA" + - "THEMATICAL ITALIC CAPITAL ALPHAMATHEMATICAL ITALIC CAPITAL BETAMATHEMATI" + - "CAL ITALIC CAPITAL GAMMAMATHEMATICAL ITALIC CAPITAL DELTAMATHEMATICAL IT" + - "ALIC CAPITAL EPSILONMATHEMATICAL ITALIC CAPITAL ZETAMATHEMATICAL ITALIC " + - "CAPITAL ETAMATHEMATICAL ITALIC CAPITAL THETAMATHEMATICAL ITALIC CAPITAL " + - "IOTAMATHEMATICAL ITALIC CAPITAL KAPPAMATHEMATICAL ITALIC CAPITAL LAMDAMA" + - "THEMATICAL ITALIC CAPITAL MUMATHEMATICAL ITALIC CAPITAL NUMATHEMATICAL I" + - "TALIC CAPITAL XIMATHEMATICAL ITALIC CAPITAL OMICRONMATHEMATICAL ITALIC C" + - "APITAL PIMATHEMATICAL ITALIC CAPITAL RHOMATHEMATICAL ITALIC CAPITAL THET" + - "A SYMBOLMATHEMATICAL ITALIC CAPITAL SIGMAMATHEMATICAL ITALIC CAPITAL TAU" + - "MATHEMATICAL ITALIC CAPITAL UPSILONMATHEMATICAL ITALIC CAPITAL PHIMATHEM" + - "ATICAL ITALIC CAPITAL CHIMATHEMATICAL ITALIC CAPITAL PSIMATHEMATICAL ITA" + - "LIC CAPITAL OMEGAMATHEMATICAL ITALIC NABLAMATHEMATICAL ITALIC SMALL ALPH") + ("" + - "AMATHEMATICAL ITALIC SMALL BETAMATHEMATICAL ITALIC SMALL GAMMAMATHEMATIC" + - "AL ITALIC SMALL DELTAMATHEMATICAL ITALIC SMALL EPSILONMATHEMATICAL ITALI" + - "C SMALL ZETAMATHEMATICAL ITALIC SMALL ETAMATHEMATICAL ITALIC SMALL THETA" + - "MATHEMATICAL ITALIC SMALL IOTAMATHEMATICAL ITALIC SMALL KAPPAMATHEMATICA" + - "L ITALIC SMALL LAMDAMATHEMATICAL ITALIC SMALL MUMATHEMATICAL ITALIC SMAL" + - "L NUMATHEMATICAL ITALIC SMALL XIMATHEMATICAL ITALIC SMALL OMICRONMATHEMA" + - "TICAL ITALIC SMALL PIMATHEMATICAL ITALIC SMALL RHOMATHEMATICAL ITALIC SM" + - "ALL FINAL SIGMAMATHEMATICAL ITALIC SMALL SIGMAMATHEMATICAL ITALIC SMALL " + - "TAUMATHEMATICAL ITALIC SMALL UPSILONMATHEMATICAL ITALIC SMALL PHIMATHEMA" + - "TICAL ITALIC SMALL CHIMATHEMATICAL ITALIC SMALL PSIMATHEMATICAL ITALIC S" + - "MALL OMEGAMATHEMATICAL ITALIC PARTIAL DIFFERENTIALMATHEMATICAL ITALIC EP" + - "SILON SYMBOLMATHEMATICAL ITALIC THETA SYMBOLMATHEMATICAL ITALIC KAPPA SY" + - "MBOLMATHEMATICAL ITALIC PHI SYMBOLMATHEMATICAL ITALIC RHO SYMBOLMATHEMAT" + - "ICAL ITALIC PI SYMBOLMATHEMATICAL BOLD ITALIC CAPITAL ALPHAMATHEMATICAL " + - "BOLD ITALIC CAPITAL BETAMATHEMATICAL BOLD ITALIC CAPITAL GAMMAMATHEMATIC" + - "AL BOLD ITALIC CAPITAL DELTAMATHEMATICAL BOLD ITALIC CAPITAL EPSILONMATH" + - "EMATICAL BOLD ITALIC CAPITAL ZETAMATHEMATICAL BOLD ITALIC CAPITAL ETAMAT" + - "HEMATICAL BOLD ITALIC CAPITAL THETAMATHEMATICAL BOLD ITALIC CAPITAL IOTA" + - "MATHEMATICAL BOLD ITALIC CAPITAL KAPPAMATHEMATICAL BOLD ITALIC CAPITAL L" + - "AMDAMATHEMATICAL BOLD ITALIC CAPITAL MUMATHEMATICAL BOLD ITALIC CAPITAL " + - "NUMATHEMATICAL BOLD ITALIC CAPITAL XIMATHEMATICAL BOLD ITALIC CAPITAL OM" + - "ICRONMATHEMATICAL BOLD ITALIC CAPITAL PIMATHEMATICAL BOLD ITALIC CAPITAL" + - " RHOMATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOLMATHEMATICAL BOLD ITALI" + - "C CAPITAL SIGMAMATHEMATICAL BOLD ITALIC CAPITAL TAUMATHEMATICAL BOLD ITA" + - "LIC CAPITAL UPSILONMATHEMATICAL BOLD ITALIC CAPITAL PHIMATHEMATICAL BOLD" + - " ITALIC CAPITAL CHIMATHEMATICAL BOLD ITALIC CAPITAL PSIMATHEMATICAL BOLD" + - " ITALIC CAPITAL OMEGAMATHEMATICAL BOLD ITALIC NABLAMATHEMATICAL BOLD ITA" + - "LIC SMALL ALPHAMATHEMATICAL BOLD ITALIC SMALL BETAMATHEMATICAL BOLD ITAL" + - "IC SMALL GAMMAMATHEMATICAL BOLD ITALIC SMALL DELTAMATHEMATICAL BOLD ITAL" + - "IC SMALL EPSILONMATHEMATICAL BOLD ITALIC SMALL ZETAMATHEMATICAL BOLD ITA" + - "LIC SMALL ETAMATHEMATICAL BOLD ITALIC SMALL THETAMATHEMATICAL BOLD ITALI" + - "C SMALL IOTAMATHEMATICAL BOLD ITALIC SMALL KAPPAMATHEMATICAL BOLD ITALIC" + - " SMALL LAMDAMATHEMATICAL BOLD ITALIC SMALL MUMATHEMATICAL BOLD ITALIC SM" + - "ALL NUMATHEMATICAL BOLD ITALIC SMALL XIMATHEMATICAL BOLD ITALIC SMALL OM" + - "ICRONMATHEMATICAL BOLD ITALIC SMALL PIMATHEMATICAL BOLD ITALIC SMALL RHO" + - "MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMAMATHEMATICAL BOLD ITALIC SMALL" + - " SIGMAMATHEMATICAL BOLD ITALIC SMALL TAUMATHEMATICAL BOLD ITALIC SMALL U" + - "PSILONMATHEMATICAL BOLD ITALIC SMALL PHIMATHEMATICAL BOLD ITALIC SMALL C" + - "HIMATHEMATICAL BOLD ITALIC SMALL PSIMATHEMATICAL BOLD ITALIC SMALL OMEGA" + - "MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIALMATHEMATICAL BOLD ITALIC EP" + - "SILON SYMBOLMATHEMATICAL BOLD ITALIC THETA SYMBOLMATHEMATICAL BOLD ITALI" + - "C KAPPA SYMBOLMATHEMATICAL BOLD ITALIC PHI SYMBOLMATHEMATICAL BOLD ITALI" + - "C RHO SYMBOLMATHEMATICAL BOLD ITALIC PI SYMBOLMATHEMATICAL SANS-SERIF BO" + - "LD CAPITAL ALPHAMATHEMATICAL SANS-SERIF BOLD CAPITAL BETAMATHEMATICAL SA" + - "NS-SERIF BOLD CAPITAL GAMMAMATHEMATICAL SANS-SERIF BOLD CAPITAL DELTAMAT" + - "HEMATICAL SANS-SERIF BOLD CAPITAL EPSILONMATHEMATICAL SANS-SERIF BOLD CA" + - "PITAL ZETAMATHEMATICAL SANS-SERIF BOLD CAPITAL ETAMATHEMATICAL SANS-SERI" + - "F BOLD CAPITAL THETAMATHEMATICAL SANS-SERIF BOLD CAPITAL IOTAMATHEMATICA" + - "L SANS-SERIF BOLD CAPITAL KAPPAMATHEMATICAL SANS-SERIF BOLD CAPITAL LAMD" + - "AMATHEMATICAL SANS-SERIF BOLD CAPITAL MUMATHEMATICAL SANS-SERIF BOLD CAP" + - "ITAL NUMATHEMATICAL SANS-SERIF BOLD CAPITAL XIMATHEMATICAL SANS-SERIF BO" + - "LD CAPITAL OMICRONMATHEMATICAL SANS-SERIF BOLD CAPITAL PIMATHEMATICAL SA" + - "NS-SERIF BOLD CAPITAL RHOMATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMB" + - "OLMATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMAMATHEMATICAL SANS-SERIF BOLD" + - " CAPITAL TAUMATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILONMATHEMATICAL SAN" + - "S-SERIF BOLD CAPITAL PHIMATHEMATICAL SANS-SERIF BOLD CAPITAL CHIMATHEMAT" + - "ICAL SANS-SERIF BOLD CAPITAL PSIMATHEMATICAL SANS-SERIF BOLD CAPITAL OME" + - "GAMATHEMATICAL SANS-SERIF BOLD NABLAMATHEMATICAL SANS-SERIF BOLD SMALL A" + - "LPHAMATHEMATICAL SANS-SERIF BOLD SMALL BETAMATHEMATICAL SANS-SERIF BOLD " + - "SMALL GAMMAMATHEMATICAL SANS-SERIF BOLD SMALL DELTAMATHEMATICAL SANS-SER" + - "IF BOLD SMALL EPSILONMATHEMATICAL SANS-SERIF BOLD SMALL ZETAMATHEMATICAL" + - " SANS-SERIF BOLD SMALL ETAMATHEMATICAL SANS-SERIF BOLD SMALL THETAMATHEM" + - "ATICAL SANS-SERIF BOLD SMALL IOTAMATHEMATICAL SANS-SERIF BOLD SMALL KAPP" + - "AMATHEMATICAL SANS-SERIF BOLD SMALL LAMDAMATHEMATICAL SANS-SERIF BOLD SM") + ("" + - "ALL MUMATHEMATICAL SANS-SERIF BOLD SMALL NUMATHEMATICAL SANS-SERIF BOLD " + - "SMALL XIMATHEMATICAL SANS-SERIF BOLD SMALL OMICRONMATHEMATICAL SANS-SERI" + - "F BOLD SMALL PIMATHEMATICAL SANS-SERIF BOLD SMALL RHOMATHEMATICAL SANS-S" + - "ERIF BOLD SMALL FINAL SIGMAMATHEMATICAL SANS-SERIF BOLD SMALL SIGMAMATHE" + - "MATICAL SANS-SERIF BOLD SMALL TAUMATHEMATICAL SANS-SERIF BOLD SMALL UPSI" + - "LONMATHEMATICAL SANS-SERIF BOLD SMALL PHIMATHEMATICAL SANS-SERIF BOLD SM" + - "ALL CHIMATHEMATICAL SANS-SERIF BOLD SMALL PSIMATHEMATICAL SANS-SERIF BOL" + - "D SMALL OMEGAMATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIALMATHEMATIC" + - "AL SANS-SERIF BOLD EPSILON SYMBOLMATHEMATICAL SANS-SERIF BOLD THETA SYMB" + - "OLMATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOLMATHEMATICAL SANS-SERIF BOLD " + - "PHI SYMBOLMATHEMATICAL SANS-SERIF BOLD RHO SYMBOLMATHEMATICAL SANS-SERIF" + - " BOLD PI SYMBOLMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHAMATHEMAT" + - "ICAL SANS-SERIF BOLD ITALIC CAPITAL BETAMATHEMATICAL SANS-SERIF BOLD ITA" + - "LIC CAPITAL GAMMAMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTAMATHEM" + - "ATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILONMATHEMATICAL SANS-SERIF BOL" + - "D ITALIC CAPITAL ZETAMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETAMATH" + - "EMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETAMATHEMATICAL SANS-SERIF BOL" + - "D ITALIC CAPITAL IOTAMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPAMA" + - "THEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDAMATHEMATICAL SANS-SERIF B" + - "OLD ITALIC CAPITAL MUMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NUMATHE" + - "MATICAL SANS-SERIF BOLD ITALIC CAPITAL XIMATHEMATICAL SANS-SERIF BOLD IT" + - "ALIC CAPITAL OMICRONMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PIMATHEM" + - "ATICAL SANS-SERIF BOLD ITALIC CAPITAL RHOMATHEMATICAL SANS-SERIF BOLD IT" + - "ALIC CAPITAL THETA SYMBOLMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIG" + - "MAMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAUMATHEMATICAL SANS-SERIF" + - " BOLD ITALIC CAPITAL UPSILONMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL " + - "PHIMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHIMATHEMATICAL SANS-SERI" + - "F BOLD ITALIC CAPITAL PSIMATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OME" + - "GAMATHEMATICAL SANS-SERIF BOLD ITALIC NABLAMATHEMATICAL SANS-SERIF BOLD " + - "ITALIC SMALL ALPHAMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETAMATHEMAT" + - "ICAL SANS-SERIF BOLD ITALIC SMALL GAMMAMATHEMATICAL SANS-SERIF BOLD ITAL" + - "IC SMALL DELTAMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILONMATHEMATI" + - "CAL SANS-SERIF BOLD ITALIC SMALL ZETAMATHEMATICAL SANS-SERIF BOLD ITALIC" + - " SMALL ETAMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETAMATHEMATICAL SA" + - "NS-SERIF BOLD ITALIC SMALL IOTAMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL" + - " KAPPAMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDAMATHEMATICAL SANS-S" + - "ERIF BOLD ITALIC SMALL MUMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NUMAT" + - "HEMATICAL SANS-SERIF BOLD ITALIC SMALL XIMATHEMATICAL SANS-SERIF BOLD IT" + - "ALIC SMALL OMICRONMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PIMATHEMATIC" + - "AL SANS-SERIF BOLD ITALIC SMALL RHOMATHEMATICAL SANS-SERIF BOLD ITALIC S" + - "MALL FINAL SIGMAMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMAMATHEMATI" + - "CAL SANS-SERIF BOLD ITALIC SMALL TAUMATHEMATICAL SANS-SERIF BOLD ITALIC " + - "SMALL UPSILONMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHIMATHEMATICAL S" + - "ANS-SERIF BOLD ITALIC SMALL CHIMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL" + - " PSIMATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGAMATHEMATICAL SANS-SER" + - "IF BOLD ITALIC PARTIAL DIFFERENTIALMATHEMATICAL SANS-SERIF BOLD ITALIC E" + - "PSILON SYMBOLMATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOLMATHEMATICA" + - "L SANS-SERIF BOLD ITALIC KAPPA SYMBOLMATHEMATICAL SANS-SERIF BOLD ITALIC" + - " PHI SYMBOLMATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOLMATHEMATICAL SA" + - "NS-SERIF BOLD ITALIC PI SYMBOLMATHEMATICAL BOLD CAPITAL DIGAMMAMATHEMATI" + - "CAL BOLD SMALL DIGAMMAMATHEMATICAL BOLD DIGIT ZEROMATHEMATICAL BOLD DIGI" + - "T ONEMATHEMATICAL BOLD DIGIT TWOMATHEMATICAL BOLD DIGIT THREEMATHEMATICA" + - "L BOLD DIGIT FOURMATHEMATICAL BOLD DIGIT FIVEMATHEMATICAL BOLD DIGIT SIX" + - "MATHEMATICAL BOLD DIGIT SEVENMATHEMATICAL BOLD DIGIT EIGHTMATHEMATICAL B" + - "OLD DIGIT NINEMATHEMATICAL DOUBLE-STRUCK DIGIT ZEROMATHEMATICAL DOUBLE-S" + - "TRUCK DIGIT ONEMATHEMATICAL DOUBLE-STRUCK DIGIT TWOMATHEMATICAL DOUBLE-S" + - "TRUCK DIGIT THREEMATHEMATICAL DOUBLE-STRUCK DIGIT FOURMATHEMATICAL DOUBL" + - "E-STRUCK DIGIT FIVEMATHEMATICAL DOUBLE-STRUCK DIGIT SIXMATHEMATICAL DOUB" + - "LE-STRUCK DIGIT SEVENMATHEMATICAL DOUBLE-STRUCK DIGIT EIGHTMATHEMATICAL " + - "DOUBLE-STRUCK DIGIT NINEMATHEMATICAL SANS-SERIF DIGIT ZEROMATHEMATICAL S" + - "ANS-SERIF DIGIT ONEMATHEMATICAL SANS-SERIF DIGIT TWOMATHEMATICAL SANS-SE" + - "RIF DIGIT THREEMATHEMATICAL SANS-SERIF DIGIT FOURMATHEMATICAL SANS-SERIF" + - " DIGIT FIVEMATHEMATICAL SANS-SERIF DIGIT SIXMATHEMATICAL SANS-SERIF DIGI" + - "T SEVENMATHEMATICAL SANS-SERIF DIGIT EIGHTMATHEMATICAL SANS-SERIF DIGIT ") + ("" + - "NINEMATHEMATICAL SANS-SERIF BOLD DIGIT ZEROMATHEMATICAL SANS-SERIF BOLD " + - "DIGIT ONEMATHEMATICAL SANS-SERIF BOLD DIGIT TWOMATHEMATICAL SANS-SERIF B" + - "OLD DIGIT THREEMATHEMATICAL SANS-SERIF BOLD DIGIT FOURMATHEMATICAL SANS-" + - "SERIF BOLD DIGIT FIVEMATHEMATICAL SANS-SERIF BOLD DIGIT SIXMATHEMATICAL " + - "SANS-SERIF BOLD DIGIT SEVENMATHEMATICAL SANS-SERIF BOLD DIGIT EIGHTMATHE" + - "MATICAL SANS-SERIF BOLD DIGIT NINEMATHEMATICAL MONOSPACE DIGIT ZEROMATHE" + - "MATICAL MONOSPACE DIGIT ONEMATHEMATICAL MONOSPACE DIGIT TWOMATHEMATICAL " + - "MONOSPACE DIGIT THREEMATHEMATICAL MONOSPACE DIGIT FOURMATHEMATICAL MONOS" + - "PACE DIGIT FIVEMATHEMATICAL MONOSPACE DIGIT SIXMATHEMATICAL MONOSPACE DI" + - "GIT SEVENMATHEMATICAL MONOSPACE DIGIT EIGHTMATHEMATICAL MONOSPACE DIGIT " + - "NINESIGNWRITING HAND-FIST INDEXSIGNWRITING HAND-CIRCLE INDEXSIGNWRITING " + - "HAND-CUP INDEXSIGNWRITING HAND-OVAL INDEXSIGNWRITING HAND-HINGE INDEXSIG" + - "NWRITING HAND-ANGLE INDEXSIGNWRITING HAND-FIST INDEX BENTSIGNWRITING HAN" + - "D-CIRCLE INDEX BENTSIGNWRITING HAND-FIST THUMB UNDER INDEX BENTSIGNWRITI" + - "NG HAND-FIST INDEX RAISED KNUCKLESIGNWRITING HAND-FIST INDEX CUPPEDSIGNW" + - "RITING HAND-FIST INDEX HINGEDSIGNWRITING HAND-FIST INDEX HINGED LOWSIGNW" + - "RITING HAND-CIRCLE INDEX HINGESIGNWRITING HAND-FIST INDEX MIDDLESIGNWRIT" + - "ING HAND-CIRCLE INDEX MIDDLESIGNWRITING HAND-FIST INDEX MIDDLE BENTSIGNW" + - "RITING HAND-FIST INDEX MIDDLE RAISED KNUCKLESSIGNWRITING HAND-FIST INDEX" + - " MIDDLE HINGEDSIGNWRITING HAND-FIST INDEX UP MIDDLE HINGEDSIGNWRITING HA" + - "ND-FIST INDEX HINGED MIDDLE UPSIGNWRITING HAND-FIST INDEX MIDDLE CONJOIN" + - "EDSIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENTSIGNWRITING HAN" + - "D-FIST INDEX MIDDLE CONJOINED MIDDLE BENTSIGNWRITING HAND-FIST INDEX MID" + - "DLE CONJOINED CUPPEDSIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGEDS" + - "IGNWRITING HAND-FIST INDEX MIDDLE CROSSEDSIGNWRITING HAND-CIRCLE INDEX M" + - "IDDLE CROSSEDSIGNWRITING HAND-FIST MIDDLE BENT OVER INDEXSIGNWRITING HAN" + - "D-FIST INDEX BENT OVER MIDDLESIGNWRITING HAND-FIST INDEX MIDDLE THUMBSIG" + - "NWRITING HAND-CIRCLE INDEX MIDDLE THUMBSIGNWRITING HAND-FIST INDEX MIDDL" + - "E STRAIGHT THUMB BENTSIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAI" + - "GHTSIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENTSIGNWRITING HAND-FIST IN" + - "DEX MIDDLE HINGED SPREAD THUMB SIDESIGNWRITING HAND-FIST INDEX UP MIDDLE" + - " HINGED THUMB SIDESIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CON" + - "JOINEDSIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDESIGNWRITING" + - " HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARDSIGNWRITING HAND-FIST IND" + - "EX MIDDLE THUMB CUPPEDSIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLEDSI" + - "GNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKEDSIGNWRITING HAND-FIST INDEX" + - " MIDDLE THUMB HINGEDSIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STR" + - "AIGHTSIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDESIGNWRITING " + - "HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINEDSIGNWRITING HAND-FI" + - "ST INDEX MIDDLE CONJOINED THUMB SIDE BENTSIGNWRITING HAND-FIST MIDDLE TH" + - "UMB HOOKED INDEX UPSIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UPSIG" + - "NWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDESIGNWRITING H" + - "AND-FIST INDEX MIDDLE CROSSED THUMB SIDESIGNWRITING HAND-FIST INDEX MIDD" + - "LE CONJOINED THUMB FORWARDSIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED C" + - "UPPED THUMB FORWARDSIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UPSIG" + - "NWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UPSIGNWRITING HAND-FIST MID" + - "DLE THUMB CIRCLED INDEX UPSIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED IND" + - "EX HINGEDSIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UPSIGNWRITI" + - "NG HAND-FIST INDEX THUMB ANGLED IN MIDDLE UPSIGNWRITING HAND-FIST INDEX " + - "THUMB CIRCLED MIDDLE UPSIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINE" + - "D HINGEDSIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUTSIGNWRITING H" + - "AND-FIST INDEX MIDDLE THUMB ANGLEDSIGNWRITING HAND-FIST MIDDLE THUMB ANG" + - "LED OUT INDEX UPSIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROS" + - "SEDSIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UPSIGNWRITING HAND-FI" + - "ST INDEX THUMB HOOKED MIDDLE HINGEDSIGNWRITING HAND-FLAT FOUR FINGERSSIG" + - "NWRITING HAND-FLAT FOUR FINGERS BENTSIGNWRITING HAND-FLAT FOUR FINGERS H" + - "INGEDSIGNWRITING HAND-FLAT FOUR FINGERS CONJOINEDSIGNWRITING HAND-FLAT F" + - "OUR FINGERS CONJOINED SPLITSIGNWRITING HAND-CLAW FOUR FINGERS CONJOINEDS" + - "IGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENTSIGNWRITING HAND-HINGE F" + - "OUR FINGERS CONJOINEDSIGNWRITING HAND-FLAT FIVE FINGERS SPREADSIGNWRITIN" + - "G HAND-FLAT HEEL FIVE FINGERS SPREADSIGNWRITING HAND-FLAT FIVE FINGERS S" + - "PREAD FOUR BENTSIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENTS" + - "IGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENTSIGNWRITING HAND-FLAT HEEL " + - "FIVE FINGERS SPREAD BENTSIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB ") + ("" + - "FORWARDSIGNWRITING HAND-CUP FIVE FINGERS SPREADSIGNWRITING HAND-CUP FIVE" + - " FINGERS SPREAD OPENSIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPENSIGNW" + - "RITING HAND-OVAL FIVE FINGERS SPREADSIGNWRITING HAND-FLAT FIVE FINGERS S" + - "PREAD HINGEDSIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDES" + - "IGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMBSIGNWRITING HAND" + - "-FLATSIGNWRITING HAND-FLAT BETWEEN PALM FACINGSSIGNWRITING HAND-FLAT HEE" + - "LSIGNWRITING HAND-FLAT THUMB SIDESIGNWRITING HAND-FLAT HEEL THUMB SIDESI" + - "GNWRITING HAND-FLAT THUMB BENTSIGNWRITING HAND-FLAT THUMB FORWARDSIGNWRI" + - "TING HAND-FLAT SPLIT INDEX THUMB SIDESIGNWRITING HAND-FLAT SPLIT CENTRES" + - "IGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDESIGNWRITING HAND-FLAT SPLIT " + - "CENTRE THUMB SIDE BENTSIGNWRITING HAND-FLAT SPLIT LITTLESIGNWRITING HAND" + - "-CLAWSIGNWRITING HAND-CLAW THUMB SIDESIGNWRITING HAND-CLAW NO THUMBSIGNW" + - "RITING HAND-CLAW THUMB FORWARDSIGNWRITING HAND-HOOK CURLICUESIGNWRITING " + - "HAND-HOOKSIGNWRITING HAND-CUP OPENSIGNWRITING HAND-CUPSIGNWRITING HAND-C" + - "UP OPEN THUMB SIDESIGNWRITING HAND-CUP THUMB SIDESIGNWRITING HAND-CUP OP" + - "EN NO THUMBSIGNWRITING HAND-CUP NO THUMBSIGNWRITING HAND-CUP OPEN THUMB " + - "FORWARDSIGNWRITING HAND-CUP THUMB FORWARDSIGNWRITING HAND-CURLICUE OPENS" + - "IGNWRITING HAND-CURLICUESIGNWRITING HAND-CIRCLESIGNWRITING HAND-OVALSIGN" + - "WRITING HAND-OVAL THUMB SIDESIGNWRITING HAND-OVAL NO THUMBSIGNWRITING HA" + - "ND-OVAL THUMB FORWARDSIGNWRITING HAND-HINGE OPENSIGNWRITING HAND-HINGE O" + - "PEN THUMB FORWARDSIGNWRITING HAND-HINGESIGNWRITING HAND-HINGE SMALLSIGNW" + - "RITING HAND-HINGE OPEN THUMB SIDESIGNWRITING HAND-HINGE THUMB SIDESIGNWR" + - "ITING HAND-HINGE OPEN NO THUMBSIGNWRITING HAND-HINGE NO THUMBSIGNWRITING" + - " HAND-HINGE THUMB SIDE TOUCHING INDEXSIGNWRITING HAND-HINGE THUMB BETWEE" + - "N MIDDLE RINGSIGNWRITING HAND-ANGLESIGNWRITING HAND-FIST INDEX MIDDLE RI" + - "NGSIGNWRITING HAND-CIRCLE INDEX MIDDLE RINGSIGNWRITING HAND-HINGE INDEX " + - "MIDDLE RINGSIGNWRITING HAND-ANGLE INDEX MIDDLE RINGSIGNWRITING HAND-HING" + - "E LITTLESIGNWRITING HAND-FIST INDEX MIDDLE RING BENTSIGNWRITING HAND-FIS" + - "T INDEX MIDDLE RING CONJOINEDSIGNWRITING HAND-HINGE INDEX MIDDLE RING CO" + - "NJOINEDSIGNWRITING HAND-FIST LITTLE DOWNSIGNWRITING HAND-FIST LITTLE DOW" + - "N RIPPLE STRAIGHTSIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVEDSIGNWRIT" + - "ING HAND-FIST LITTLE DOWN OTHERS CIRCLEDSIGNWRITING HAND-FIST LITTLE UPS" + - "IGNWRITING HAND-FIST THUMB UNDER LITTLE UPSIGNWRITING HAND-CIRCLE LITTLE" + - " UPSIGNWRITING HAND-OVAL LITTLE UPSIGNWRITING HAND-ANGLE LITTLE UPSIGNWR" + - "ITING HAND-FIST LITTLE RAISED KNUCKLESIGNWRITING HAND-FIST LITTLE BENTSI" + - "GNWRITING HAND-FIST LITTLE TOUCHES THUMBSIGNWRITING HAND-FIST LITTLE THU" + - "MBSIGNWRITING HAND-HINGE LITTLE THUMBSIGNWRITING HAND-FIST LITTLE INDEX " + - "THUMBSIGNWRITING HAND-HINGE LITTLE INDEX THUMBSIGNWRITING HAND-ANGLE LIT" + - "TLE INDEX THUMB INDEX THUMB OUTSIGNWRITING HAND-ANGLE LITTLE INDEX THUMB" + - " INDEX THUMBSIGNWRITING HAND-FIST LITTLE INDEXSIGNWRITING HAND-CIRCLE LI" + - "TTLE INDEXSIGNWRITING HAND-HINGE LITTLE INDEXSIGNWRITING HAND-ANGLE LITT" + - "LE INDEXSIGNWRITING HAND-FIST INDEX MIDDLE LITTLESIGNWRITING HAND-CIRCLE" + - " INDEX MIDDLE LITTLESIGNWRITING HAND-HINGE INDEX MIDDLE LITTLESIGNWRITIN" + - "G HAND-HINGE RINGSIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLESIGNWRITING H" + - "AND-FIST INDEX MIDDLE CROSS LITTLESIGNWRITING HAND-CIRCLE INDEX MIDDLE C" + - "ROSS LITTLESIGNWRITING HAND-FIST RING DOWNSIGNWRITING HAND-HINGE RING DO" + - "WN INDEX THUMB HOOK MIDDLESIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB " + - "INDEX CROSSSIGNWRITING HAND-FIST RING UPSIGNWRITING HAND-FIST RING RAISE" + - "D KNUCKLESIGNWRITING HAND-FIST RING LITTLESIGNWRITING HAND-CIRCLE RING L" + - "ITTLESIGNWRITING HAND-OVAL RING LITTLESIGNWRITING HAND-ANGLE RING LITTLE" + - "SIGNWRITING HAND-FIST RING MIDDLESIGNWRITING HAND-FIST RING MIDDLE CONJO" + - "INEDSIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLESSIGNWRITING HAND-FI" + - "ST RING INDEXSIGNWRITING HAND-FIST RING THUMBSIGNWRITING HAND-HOOK RING " + - "THUMBSIGNWRITING HAND-FIST INDEX RING LITTLESIGNWRITING HAND-CIRCLE INDE" + - "X RING LITTLESIGNWRITING HAND-CURLICUE INDEX RING LITTLE ONSIGNWRITING H" + - "AND-HOOK INDEX RING LITTLE OUTSIGNWRITING HAND-HOOK INDEX RING LITTLE IN" + - "SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDERSIGNWRITING HAND-CUP INDEX " + - "RING LITTLESIGNWRITING HAND-HINGE INDEX RING LITTLESIGNWRITING HAND-ANGL" + - "E INDEX RING LITTLE OUTSIGNWRITING HAND-ANGLE INDEX RING LITTLESIGNWRITI" + - "NG HAND-FIST MIDDLE DOWNSIGNWRITING HAND-HINGE MIDDLESIGNWRITING HAND-FI" + - "ST MIDDLE UPSIGNWRITING HAND-CIRCLE MIDDLE UPSIGNWRITING HAND-FIST MIDDL" + - "E RAISED KNUCKLESIGNWRITING HAND-FIST MIDDLE UP THUMB SIDESIGNWRITING HA" + - "ND-HOOK MIDDLE THUMBSIGNWRITING HAND-FIST MIDDLE THUMB LITTLESIGNWRITING" + - " HAND-FIST MIDDLE LITTLESIGNWRITING HAND-FIST MIDDLE RING LITTLESIGNWRIT") + ("" + - "ING HAND-CIRCLE MIDDLE RING LITTLESIGNWRITING HAND-CURLICUE MIDDLE RING " + - "LITTLE ONSIGNWRITING HAND-CUP MIDDLE RING LITTLESIGNWRITING HAND-HINGE M" + - "IDDLE RING LITTLESIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUTSIGNWRITIN" + - "G HAND-ANGLE MIDDLE RING LITTLE INSIGNWRITING HAND-ANGLE MIDDLE RING LIT" + - "TLESIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENTSIGNWRITING HAND-CLAW " + - "MIDDLE RING LITTLE CONJOINEDSIGNWRITING HAND-CLAW MIDDLE RING LITTLE CON" + - "JOINED SIDESIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUTSIGNWRI" + - "TING HAND-HOOK MIDDLE RING LITTLE CONJOINED INSIGNWRITING HAND-HOOK MIDD" + - "LE RING LITTLE CONJOINEDSIGNWRITING HAND-HINGE INDEX HINGEDSIGNWRITING H" + - "AND-FIST INDEX THUMB SIDESIGNWRITING HAND-HINGE INDEX THUMB SIDESIGNWRIT" + - "ING HAND-FIST INDEX THUMB SIDE THUMB DIAGONALSIGNWRITING HAND-FIST INDEX" + - " THUMB SIDE THUMB CONJOINEDSIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB " + - "BENTSIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENTSIGNWRITING HAND-FI" + - "ST INDEX THUMB SIDE BOTH BENTSIGNWRITING HAND-FIST INDEX THUMB SIDE INDE" + - "X HINGESIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHTSIGNWRITI" + - "NG HAND-FIST INDEX THUMB FORWARD INDEX BENTSIGNWRITING HAND-FIST INDEX T" + - "HUMB HOOKSIGNWRITING HAND-FIST INDEX THUMB CURLICUESIGNWRITING HAND-FIST" + - " INDEX THUMB CURVE THUMB INSIDESIGNWRITING HAND-CLAW INDEX THUMB CURVE T" + - "HUMB INSIDESIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDERSIGNWRITIN" + - "G HAND-FIST INDEX THUMB CIRCLESIGNWRITING HAND-CUP INDEX THUMBSIGNWRITIN" + - "G HAND-CUP INDEX THUMB OPENSIGNWRITING HAND-HINGE INDEX THUMB OPENSIGNWR" + - "ITING HAND-HINGE INDEX THUMB LARGESIGNWRITING HAND-HINGE INDEX THUMBSIGN" + - "WRITING HAND-HINGE INDEX THUMB SMALLSIGNWRITING HAND-ANGLE INDEX THUMB O" + - "UTSIGNWRITING HAND-ANGLE INDEX THUMB INSIGNWRITING HAND-ANGLE INDEX THUM" + - "BSIGNWRITING HAND-FIST THUMBSIGNWRITING HAND-FIST THUMB HEELSIGNWRITING " + - "HAND-FIST THUMB SIDE DIAGONALSIGNWRITING HAND-FIST THUMB SIDE CONJOINEDS" + - "IGNWRITING HAND-FIST THUMB SIDE BENTSIGNWRITING HAND-FIST THUMB FORWARDS" + - "IGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLESIGNWRITING HAND-FIST THU" + - "MB BETWEEN MIDDLE RINGSIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLESIG" + - "NWRITING HAND-FIST THUMB UNDER TWO FINGERSSIGNWRITING HAND-FIST THUMB OV" + - "ER TWO FINGERSSIGNWRITING HAND-FIST THUMB UNDER THREE FINGERSSIGNWRITING" + - " HAND-FIST THUMB UNDER FOUR FINGERSSIGNWRITING HAND-FIST THUMB OVER FOUR" + - " RAISED KNUCKLESSIGNWRITING HAND-FISTSIGNWRITING HAND-FIST HEELSIGNWRITI" + - "NG TOUCH SINGLESIGNWRITING TOUCH MULTIPLESIGNWRITING TOUCH BETWEENSIGNWR" + - "ITING GRASP SINGLESIGNWRITING GRASP MULTIPLESIGNWRITING GRASP BETWEENSIG" + - "NWRITING STRIKE SINGLESIGNWRITING STRIKE MULTIPLESIGNWRITING STRIKE BETW" + - "EENSIGNWRITING BRUSH SINGLESIGNWRITING BRUSH MULTIPLESIGNWRITING BRUSH B" + - "ETWEENSIGNWRITING RUB SINGLESIGNWRITING RUB MULTIPLESIGNWRITING RUB BETW" + - "EENSIGNWRITING SURFACE SYMBOLSSIGNWRITING SURFACE BETWEENSIGNWRITING SQU" + - "EEZE LARGE SINGLESIGNWRITING SQUEEZE SMALL SINGLESIGNWRITING SQUEEZE LAR" + - "GE MULTIPLESIGNWRITING SQUEEZE SMALL MULTIPLESIGNWRITING SQUEEZE SEQUENT" + - "IALSIGNWRITING FLICK LARGE SINGLESIGNWRITING FLICK SMALL SINGLESIGNWRITI" + - "NG FLICK LARGE MULTIPLESIGNWRITING FLICK SMALL MULTIPLESIGNWRITING FLICK" + - " SEQUENTIALSIGNWRITING SQUEEZE FLICK ALTERNATINGSIGNWRITING MOVEMENT-HIN" + - "GE UP DOWN LARGESIGNWRITING MOVEMENT-HINGE UP DOWN SMALLSIGNWRITING MOVE" + - "MENT-HINGE UP SEQUENTIALSIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIALSIGNWR" + - "ITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGESIGNWRITING MOVEMENT-HINGE" + - " UP DOWN ALTERNATING SMALLSIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSO" + - "RSSIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACTSIGNWRITING MOVEMENT-FLOO" + - "RPLANE FINGER CONTACTSIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMAL" + - "LSIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUMSIGNWRITING MOVEME" + - "NT-WALLPLANE SINGLE STRAIGHT LARGESIGNWRITING MOVEMENT-WALLPLANE SINGLE " + - "STRAIGHT LARGESTSIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEXSIGNWRIT" + - "ING MOVEMENT-WALLPLANE DOUBLE STRAIGHTSIGNWRITING MOVEMENT-WALLPLANE DOU" + - "BLE WRIST FLEXSIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATINGSIGNWRITI" + - "NG MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEXSIGNWRITING MOVEMENT-" + - "WALLPLANE CROSSSIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENTSI" + - "GNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEXSIGNWRITING MOVEMENT-WALLP" + - "LANE TRIPLE ALTERNATINGSIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING" + - " WRIST FLEXSIGNWRITING MOVEMENT-WALLPLANE BEND SMALLSIGNWRITING MOVEMENT" + - "-WALLPLANE BEND MEDIUMSIGNWRITING MOVEMENT-WALLPLANE BEND LARGESIGNWRITI" + - "NG MOVEMENT-WALLPLANE CORNER SMALLSIGNWRITING MOVEMENT-WALLPLANE CORNER " + - "MEDIUMSIGNWRITING MOVEMENT-WALLPLANE CORNER LARGESIGNWRITING MOVEMENT-WA" + - "LLPLANE CORNER ROTATIONSIGNWRITING MOVEMENT-WALLPLANE CHECK SMALLSIGNWRI") + ("" + - "TING MOVEMENT-WALLPLANE CHECK MEDIUMSIGNWRITING MOVEMENT-WALLPLANE CHECK" + - " LARGESIGNWRITING MOVEMENT-WALLPLANE BOX SMALLSIGNWRITING MOVEMENT-WALLP" + - "LANE BOX MEDIUMSIGNWRITING MOVEMENT-WALLPLANE BOX LARGESIGNWRITING MOVEM" + - "ENT-WALLPLANE ZIGZAG SMALLSIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUMSI" + - "GNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGESIGNWRITING MOVEMENT-WALLPLANE " + - "PEAKS SMALLSIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUMSIGNWRITING MOVEME" + - "NT-WALLPLANE PEAKS LARGESIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE " + - "SINGLESIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLESIGNWRITING " + - "TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATINGSIGNWRITING TRAVEL-WALLPL" + - "ANE ROTATION-FLOORPLANE SINGLESIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOO" + - "RPLANE DOUBLESIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATIN" + - "GSIGNWRITING TRAVEL-WALLPLANE SHAKINGSIGNWRITING TRAVEL-WALLPLANE ARM SP" + - "IRAL SINGLESIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLESIGNWRITING TRA" + - "VEL-WALLPLANE ARM SPIRAL TRIPLESIGNWRITING MOVEMENT-DIAGONAL AWAY SMALLS" + - "IGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUMSIGNWRITING MOVEMENT-DIAGONAL AW" + - "AY LARGESIGNWRITING MOVEMENT-DIAGONAL AWAY LARGESTSIGNWRITING MOVEMENT-D" + - "IAGONAL TOWARDS SMALLSIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUMSIGNWRI" + - "TING MOVEMENT-DIAGONAL TOWARDS LARGESIGNWRITING MOVEMENT-DIAGONAL TOWARD" + - "S LARGESTSIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALLSIGNWRITING MOV" + - "EMENT-DIAGONAL BETWEEN AWAY MEDIUMSIGNWRITING MOVEMENT-DIAGONAL BETWEEN " + - "AWAY LARGESIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGESTSIGNWRITING " + - "MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALLSIGNWRITING MOVEMENT-DIAGONAL BET" + - "WEEN TOWARDS MEDIUMSIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGESI" + - "GNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGESTSIGNWRITING MOVEMENT-" + - "FLOORPLANE SINGLE STRAIGHT SMALLSIGNWRITING MOVEMENT-FLOORPLANE SINGLE S" + - "TRAIGHT MEDIUMSIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGESIGNW" + - "RITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGESTSIGNWRITING MOVEMENT-F" + - "LOORPLANE SINGLE WRIST FLEXSIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIG" + - "HTSIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEXSIGNWRITING MOVEMENT-" + - "FLOORPLANE DOUBLE ALTERNATINGSIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTE" + - "RNATING WRIST FLEXSIGNWRITING MOVEMENT-FLOORPLANE CROSSSIGNWRITING MOVEM" + - "ENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENTSIGNWRITING MOVEMENT-FLOORPLANE T" + - "RIPLE WRIST FLEXSIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEM" + - "ENTSIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEXSIGNWRIT" + - "ING MOVEMENT-FLOORPLANE BENDSIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL" + - "SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUMSIGNWRITING MOVEMENT-FLOORP" + - "LANE CORNER LARGESIGNWRITING MOVEMENT-FLOORPLANE CHECKSIGNWRITING MOVEME" + - "NT-FLOORPLANE BOX SMALLSIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUMSIGNWRI" + - "TING MOVEMENT-FLOORPLANE BOX LARGESIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG" + - " SMALLSIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUMSIGNWRITING MOVEMENT-" + - "FLOORPLANE ZIGZAG LARGESIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALLSIGNWR" + - "ITING MOVEMENT-FLOORPLANE PEAKS MEDIUMSIGNWRITING MOVEMENT-FLOORPLANE PE" + - "AKS LARGESIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLESIGNWRI" + - "TING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLESIGNWRITING TRAVEL-FLOO" + - "RPLANE ROTATION-FLOORPLANE ALTERNATINGSIGNWRITING TRAVEL-FLOORPLANE ROTA" + - "TION-WALLPLANE SINGLESIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DO" + - "UBLESIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATINGSIGNWRIT" + - "ING TRAVEL-FLOORPLANE SHAKINGSIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTE" + - "R SMALLSIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUMSIGNWRITING MO" + - "VEMENT-WALLPLANE CURVE QUARTER LARGESIGNWRITING MOVEMENT-WALLPLANE CURVE" + - " QUARTER LARGESTSIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALLSI" + - "GNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUMSIGNWRITING MOVEMEN" + - "T-WALLPLANE CURVE HALF-CIRCLE LARGESIGNWRITING MOVEMENT-WALLPLANE CURVE " + - "HALF-CIRCLE LARGESTSIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CI" + - "RCLE SMALLSIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDI" + - "UMSIGNWRITING MOVEMENT-WALLPLANE HUMP SMALLSIGNWRITING MOVEMENT-WALLPLAN" + - "E HUMP MEDIUMSIGNWRITING MOVEMENT-WALLPLANE HUMP LARGESIGNWRITING MOVEME" + - "NT-WALLPLANE LOOP SMALLSIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUMSIGNWRI" + - "TING MOVEMENT-WALLPLANE LOOP LARGESIGNWRITING MOVEMENT-WALLPLANE LOOP SM" + - "ALL DOUBLESIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALLSIGNWRIT" + - "ING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUMSIGNWRITING MOVEMENT-WALL" + - "PLANE WAVE CURVE DOUBLE LARGESIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE T" + - "RIPLE SMALLSIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUMSIGNWR" + - "ITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGESIGNWRITING MOVEMENT-WAL") + ("" + - "LPLANE CURVE THEN STRAIGHTSIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SM" + - "ALLSIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUMSIGNWRITING ROTATIO" + - "N-WALLPLANE SINGLESIGNWRITING ROTATION-WALLPLANE DOUBLESIGNWRITING ROTAT" + - "ION-WALLPLANE ALTERNATESIGNWRITING MOVEMENT-WALLPLANE SHAKINGSIGNWRITING" + - " MOVEMENT-WALLPLANE CURVE HITTING FRONT WALLSIGNWRITING MOVEMENT-WALLPLA" + - "NE HUMP HITTING FRONT WALLSIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FR" + - "ONT WALLSIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALLSIGNWRITIN" + - "G ROTATION-WALLPLANE SINGLE HITTING FRONT WALLSIGNWRITING ROTATION-WALLP" + - "LANE DOUBLE HITTING FRONT WALLSIGNWRITING ROTATION-WALLPLANE ALTERNATING" + - " HITTING FRONT WALLSIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHESTSIG" + - "NWRITING MOVEMENT-WALLPLANE HUMP HITTING CHESTSIGNWRITING MOVEMENT-WALLP" + - "LANE LOOP HITTING CHESTSIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST" + - "SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHESTSIGNWRITING ROTATION-" + - "WALLPLANE DOUBLE HITTING CHESTSIGNWRITING ROTATION-WALLPLANE ALTERNATING" + - " HITTING CHESTSIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALLSIG" + - "NWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUMSIGNWRITING MOVEMEN" + - "T-WALLPLANE WAVE DIAGONAL PATH LARGESIGNWRITING MOVEMENT-FLOORPLANE CURV" + - "E HITTING CEILING SMALLSIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEI" + - "LING LARGESIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOU" + - "BLESIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLESIGN" + - "WRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLESIGNWRITING" + - " MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLESIGNWRITING MOVEME" + - "NT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLESIGNWRITING MOVEMENT-FLOO" + - "RPLANE LOOP HITTING CEILING LARGE SINGLESIGNWRITING MOVEMENT-FLOORPLANE " + - "LOOP HITTING CEILING SMALL DOUBLESIGNWRITING MOVEMENT-FLOORPLANE LOOP HI" + - "TTING CEILING LARGE DOUBLESIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING C" + - "EILING SMALLSIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGESI" + - "GNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILINGSIGNWRITING ROTATION" + - "-FLOORPLANE DOUBLE HITTING CEILINGSIGNWRITING ROTATION-FLOORPLANE ALTERN" + - "ATING HITTING CEILINGSIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR" + - " SMALLSIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGESIGNWRITI" + - "NG MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLESIGNWRITING MOVEME" + - "NT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLESIGNWRITING MOVEMENT-FLOORP" + - "LANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLESIGNWRITING MOVEMENT-FLOORPLA" + - "NE HUMP HITTING FLOOR TRIPLE LARGE TRIPLESIGNWRITING MOVEMENT-FLOORPLANE" + - " LOOP HITTING FLOOR SMALL SINGLESIGNWRITING MOVEMENT-FLOORPLANE LOOP HIT" + - "TING FLOOR LARGE SINGLESIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOO" + - "R SMALL DOUBLESIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE D" + - "OUBLESIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALLSIGNWRITING" + - " MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGESIGNWRITING ROTATION-FLOORP" + - "LANE SINGLE HITTING FLOORSIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING " + - "FLOORSIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOORSIGNWRITIN" + - "G MOVEMENT-FLOORPLANE CURVE SMALLSIGNWRITING MOVEMENT-FLOORPLANE CURVE M" + - "EDIUMSIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGESIGNWRITING MOVEMENT-FLO" + - "ORPLANE CURVE LARGESTSIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINEDSIGNW" + - "RITING MOVEMENT-FLOORPLANE HUMP SMALLSIGNWRITING MOVEMENT-FLOORPLANE LOO" + - "P SMALLSIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKESIGNWRITING MOVEMENT-FL" + - "OORPLANE WAVE SMALLSIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGESIGNWRITING" + - " ROTATION-FLOORPLANE SINGLESIGNWRITING ROTATION-FLOORPLANE DOUBLESIGNWRI" + - "TING ROTATION-FLOORPLANE ALTERNATINGSIGNWRITING MOVEMENT-FLOORPLANE SHAK" + - "ING PARALLELSIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLESIGNWR" + - "ITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLESIGNWRITING MOVEMENT-WA" + - "LLPLANE ARM CIRCLE SMALL DOUBLESIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE" + - " MEDIUM DOUBLESIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SM" + - "ALL SINGLESIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM" + - " SINGLESIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SIN" + - "GLESIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLES" + - "IGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLESIGN" + - "WRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLESIGNWRIT" + - "ING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLESIGNWRITING MOVEMENT-WAL" + - "LPLANE WRIST CIRCLE FRONT DOUBLESIGNWRITING MOVEMENT-FLOORPLANE WRIST CI" + - "RCLE HITTING WALL SINGLESIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HIT" + - "TING WALL DOUBLESIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLESIGN" + - "WRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLESIGNWRITING MOVEMENT-FLO") + ("" + - "ORPLANE FINGER CIRCLES HITTING WALL SINGLESIGNWRITING MOVEMENT-FLOORPLAN" + - "E FINGER CIRCLES HITTING WALL DOUBLESIGNWRITING DYNAMIC ARROWHEAD SMALLS" + - "IGNWRITING DYNAMIC ARROWHEAD LARGESIGNWRITING DYNAMIC FASTSIGNWRITING DY" + - "NAMIC SLOWSIGNWRITING DYNAMIC TENSESIGNWRITING DYNAMIC RELAXEDSIGNWRITIN" + - "G DYNAMIC SIMULTANEOUSSIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATINGSIGNWR" + - "ITING DYNAMIC EVERY OTHER TIMESIGNWRITING DYNAMIC GRADUALSIGNWRITING HEA" + - "DSIGNWRITING HEAD RIMSIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHTSIGNWRI" + - "TING HEAD MOVEMENT-WALLPLANE TILTSIGNWRITING HEAD MOVEMENT-FLOORPLANE ST" + - "RAIGHTSIGNWRITING HEAD MOVEMENT-WALLPLANE CURVESIGNWRITING HEAD MOVEMENT" + - "-FLOORPLANE CURVESIGNWRITING HEAD MOVEMENT CIRCLESIGNWRITING FACE DIRECT" + - "ION POSITION NOSE FORWARD TILTINGSIGNWRITING FACE DIRECTION POSITION NOS" + - "E UP OR DOWNSIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTINGS" + - "IGNWRITING EYEBROWS STRAIGHT UPSIGNWRITING EYEBROWS STRAIGHT NEUTRALSIGN" + - "WRITING EYEBROWS STRAIGHT DOWNSIGNWRITING DREAMY EYEBROWS NEUTRAL DOWNSI" + - "GNWRITING DREAMY EYEBROWS DOWN NEUTRALSIGNWRITING DREAMY EYEBROWS UP NEU" + - "TRALSIGNWRITING DREAMY EYEBROWS NEUTRAL UPSIGNWRITING FOREHEAD NEUTRALSI" + - "GNWRITING FOREHEAD CONTACTSIGNWRITING FOREHEAD WRINKLEDSIGNWRITING EYES " + - "OPENSIGNWRITING EYES SQUEEZEDSIGNWRITING EYES CLOSEDSIGNWRITING EYE BLIN" + - "K SINGLESIGNWRITING EYE BLINK MULTIPLESIGNWRITING EYES HALF OPENSIGNWRIT" + - "ING EYES WIDE OPENSIGNWRITING EYES HALF CLOSEDSIGNWRITING EYES WIDENING " + - "MOVEMENTSIGNWRITING EYE WINKSIGNWRITING EYELASHES UPSIGNWRITING EYELASHE" + - "S DOWNSIGNWRITING EYELASHES FLUTTERINGSIGNWRITING EYEGAZE-WALLPLANE STRA" + - "IGHTSIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLESIGNWRITING EYEGAZE-WAL" + - "LPLANE STRAIGHT ALTERNATINGSIGNWRITING EYEGAZE-FLOORPLANE STRAIGHTSIGNWR" + - "ITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLESIGNWRITING EYEGAZE-FLOORPLANE S" + - "TRAIGHT ALTERNATINGSIGNWRITING EYEGAZE-WALLPLANE CURVEDSIGNWRITING EYEGA" + - "ZE-FLOORPLANE CURVEDSIGNWRITING EYEGAZE-WALLPLANE CIRCLINGSIGNWRITING CH" + - "EEKS PUFFEDSIGNWRITING CHEEKS NEUTRALSIGNWRITING CHEEKS SUCKEDSIGNWRITIN" + - "G TENSE CHEEKS HIGHSIGNWRITING TENSE CHEEKS MIDDLESIGNWRITING TENSE CHEE" + - "KS LOWSIGNWRITING EARSSIGNWRITING NOSE NEUTRALSIGNWRITING NOSE CONTACTSI" + - "GNWRITING NOSE WRINKLESSIGNWRITING NOSE WIGGLESSIGNWRITING AIR BLOWING O" + - "UTSIGNWRITING AIR SUCKING INSIGNWRITING AIR BLOW SMALL ROTATIONSSIGNWRIT" + - "ING AIR SUCK SMALL ROTATIONSSIGNWRITING BREATH INHALESIGNWRITING BREATH " + - "EXHALESIGNWRITING MOUTH CLOSED NEUTRALSIGNWRITING MOUTH CLOSED FORWARDSI" + - "GNWRITING MOUTH CLOSED CONTACTSIGNWRITING MOUTH SMILESIGNWRITING MOUTH S" + - "MILE WRINKLEDSIGNWRITING MOUTH SMILE OPENSIGNWRITING MOUTH FROWNSIGNWRIT" + - "ING MOUTH FROWN WRINKLEDSIGNWRITING MOUTH FROWN OPENSIGNWRITING MOUTH OP" + - "EN CIRCLESIGNWRITING MOUTH OPEN FORWARDSIGNWRITING MOUTH OPEN WRINKLEDSI" + - "GNWRITING MOUTH OPEN OVALSIGNWRITING MOUTH OPEN OVAL WRINKLEDSIGNWRITING" + - " MOUTH OPEN OVAL YAWNSIGNWRITING MOUTH OPEN RECTANGLESIGNWRITING MOUTH O" + - "PEN RECTANGLE WRINKLEDSIGNWRITING MOUTH OPEN RECTANGLE YAWNSIGNWRITING M" + - "OUTH KISSSIGNWRITING MOUTH KISS FORWARDSIGNWRITING MOUTH KISS WRINKLEDSI" + - "GNWRITING MOUTH TENSESIGNWRITING MOUTH TENSE FORWARDSIGNWRITING MOUTH TE" + - "NSE SUCKEDSIGNWRITING LIPS PRESSED TOGETHERSIGNWRITING LIP LOWER OVER UP" + - "PERSIGNWRITING LIP UPPER OVER LOWERSIGNWRITING MOUTH CORNERSSIGNWRITING " + - "MOUTH WRINKLES SINGLESIGNWRITING MOUTH WRINKLES DOUBLESIGNWRITING TONGUE" + - " STICKING OUT FARSIGNWRITING TONGUE LICKING LIPSSIGNWRITING TONGUE TIP B" + - "ETWEEN LIPSSIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTHSIGNWRITING TONGU" + - "E INSIDE MOUTH RELAXEDSIGNWRITING TONGUE MOVES AGAINST CHEEKSIGNWRITING " + - "TONGUE CENTRE STICKING OUTSIGNWRITING TONGUE CENTRE INSIDE MOUTHSIGNWRIT" + - "ING TEETHSIGNWRITING TEETH MOVEMENTSIGNWRITING TEETH ON TONGUESIGNWRITIN" + - "G TEETH ON TONGUE MOVEMENTSIGNWRITING TEETH ON LIPSSIGNWRITING TEETH ON " + - "LIPS MOVEMENTSIGNWRITING TEETH BITE LIPSSIGNWRITING MOVEMENT-WALLPLANE J" + - "AWSIGNWRITING MOVEMENT-FLOORPLANE JAWSIGNWRITING NECKSIGNWRITING HAIRSIG" + - "NWRITING EXCITEMENTSIGNWRITING SHOULDER HIP SPINESIGNWRITING SHOULDER HI" + - "P POSITIONSSIGNWRITING WALLPLANE SHOULDER HIP MOVESIGNWRITING FLOORPLANE" + - " SHOULDER HIP MOVESIGNWRITING SHOULDER TILTING FROM WAISTSIGNWRITING TOR" + - "SO-WALLPLANE STRAIGHT STRETCHSIGNWRITING TORSO-WALLPLANE CURVED BENDSIGN" + - "WRITING TORSO-FLOORPLANE TWISTINGSIGNWRITING UPPER BODY TILTING FROM HIP" + - " JOINTSSIGNWRITING LIMB COMBINATIONSIGNWRITING LIMB LENGTH-1SIGNWRITING " + - "LIMB LENGTH-2SIGNWRITING LIMB LENGTH-3SIGNWRITING LIMB LENGTH-4SIGNWRITI" + - "NG LIMB LENGTH-5SIGNWRITING LIMB LENGTH-6SIGNWRITING LIMB LENGTH-7SIGNWR" + - "ITING FINGERSIGNWRITING LOCATION-WALLPLANE SPACESIGNWRITING LOCATION-FLO" + - "ORPLANE SPACESIGNWRITING LOCATION HEIGHTSIGNWRITING LOCATION WIDTHSIGNWR") + ("" + - "ITING LOCATION DEPTHSIGNWRITING LOCATION HEAD NECKSIGNWRITING LOCATION T" + - "ORSOSIGNWRITING LOCATION LIMBS DIGITSSIGNWRITING COMMASIGNWRITING FULL S" + - "TOPSIGNWRITING SEMICOLONSIGNWRITING COLONSIGNWRITING PARENTHESISSIGNWRIT" + - "ING FILL MODIFIER-2SIGNWRITING FILL MODIFIER-3SIGNWRITING FILL MODIFIER-" + - "4SIGNWRITING FILL MODIFIER-5SIGNWRITING FILL MODIFIER-6SIGNWRITING ROTAT" + - "ION MODIFIER-2SIGNWRITING ROTATION MODIFIER-3SIGNWRITING ROTATION MODIFI" + - "ER-4SIGNWRITING ROTATION MODIFIER-5SIGNWRITING ROTATION MODIFIER-6SIGNWR" + - "ITING ROTATION MODIFIER-7SIGNWRITING ROTATION MODIFIER-8SIGNWRITING ROTA" + - "TION MODIFIER-9SIGNWRITING ROTATION MODIFIER-10SIGNWRITING ROTATION MODI" + - "FIER-11SIGNWRITING ROTATION MODIFIER-12SIGNWRITING ROTATION MODIFIER-13S" + - "IGNWRITING ROTATION MODIFIER-14SIGNWRITING ROTATION MODIFIER-15SIGNWRITI" + - "NG ROTATION MODIFIER-16COMBINING GLAGOLITIC LETTER AZUCOMBINING GLAGOLIT" + - "IC LETTER BUKYCOMBINING GLAGOLITIC LETTER VEDECOMBINING GLAGOLITIC LETTE" + - "R GLAGOLICOMBINING GLAGOLITIC LETTER DOBROCOMBINING GLAGOLITIC LETTER YE" + - "STUCOMBINING GLAGOLITIC LETTER ZHIVETECOMBINING GLAGOLITIC LETTER ZEMLJA" + - "COMBINING GLAGOLITIC LETTER IZHECOMBINING GLAGOLITIC LETTER INITIAL IZHE" + - "COMBINING GLAGOLITIC LETTER ICOMBINING GLAGOLITIC LETTER DJERVICOMBINING" + - " GLAGOLITIC LETTER KAKOCOMBINING GLAGOLITIC LETTER LJUDIJECOMBINING GLAG" + - "OLITIC LETTER MYSLITECOMBINING GLAGOLITIC LETTER NASHICOMBINING GLAGOLIT" + - "IC LETTER ONUCOMBINING GLAGOLITIC LETTER POKOJICOMBINING GLAGOLITIC LETT" + - "ER RITSICOMBINING GLAGOLITIC LETTER SLOVOCOMBINING GLAGOLITIC LETTER TVR" + - "IDOCOMBINING GLAGOLITIC LETTER UKUCOMBINING GLAGOLITIC LETTER FRITUCOMBI" + - "NING GLAGOLITIC LETTER HERUCOMBINING GLAGOLITIC LETTER SHTACOMBINING GLA" + - "GOLITIC LETTER TSICOMBINING GLAGOLITIC LETTER CHRIVICOMBINING GLAGOLITIC" + - " LETTER SHACOMBINING GLAGOLITIC LETTER YERUCOMBINING GLAGOLITIC LETTER Y" + - "ERICOMBINING GLAGOLITIC LETTER YATICOMBINING GLAGOLITIC LETTER YUCOMBINI" + - "NG GLAGOLITIC LETTER SMALL YUSCOMBINING GLAGOLITIC LETTER YOCOMBINING GL" + - "AGOLITIC LETTER IOTATED SMALL YUSCOMBINING GLAGOLITIC LETTER BIG YUSCOMB" + - "INING GLAGOLITIC LETTER IOTATED BIG YUSCOMBINING GLAGOLITIC LETTER FITAM" + - "ENDE KIKAKUI SYLLABLE M001 KIMENDE KIKAKUI SYLLABLE M002 KAMENDE KIKAKUI" + - " SYLLABLE M003 KUMENDE KIKAKUI SYLLABLE M065 KEEMENDE KIKAKUI SYLLABLE M" + - "095 KEMENDE KIKAKUI SYLLABLE M076 KOOMENDE KIKAKUI SYLLABLE M048 KOMENDE" + - " KIKAKUI SYLLABLE M179 KUAMENDE KIKAKUI SYLLABLE M004 WIMENDE KIKAKUI SY" + - "LLABLE M005 WAMENDE KIKAKUI SYLLABLE M006 WUMENDE KIKAKUI SYLLABLE M126 " + - "WEEMENDE KIKAKUI SYLLABLE M118 WEMENDE KIKAKUI SYLLABLE M114 WOOMENDE KI" + - "KAKUI SYLLABLE M045 WOMENDE KIKAKUI SYLLABLE M194 WUIMENDE KIKAKUI SYLLA" + - "BLE M143 WEIMENDE KIKAKUI SYLLABLE M061 WVIMENDE KIKAKUI SYLLABLE M049 W" + - "VAMENDE KIKAKUI SYLLABLE M139 WVEMENDE KIKAKUI SYLLABLE M007 MINMENDE KI" + - "KAKUI SYLLABLE M008 MANMENDE KIKAKUI SYLLABLE M009 MUNMENDE KIKAKUI SYLL" + - "ABLE M059 MENMENDE KIKAKUI SYLLABLE M094 MONMENDE KIKAKUI SYLLABLE M154 " + - "MUANMENDE KIKAKUI SYLLABLE M189 MUENMENDE KIKAKUI SYLLABLE M010 BIMENDE " + - "KIKAKUI SYLLABLE M011 BAMENDE KIKAKUI SYLLABLE M012 BUMENDE KIKAKUI SYLL" + - "ABLE M150 BEEMENDE KIKAKUI SYLLABLE M097 BEMENDE KIKAKUI SYLLABLE M103 B" + - "OOMENDE KIKAKUI SYLLABLE M138 BOMENDE KIKAKUI SYLLABLE M013 IMENDE KIKAK" + - "UI SYLLABLE M014 AMENDE KIKAKUI SYLLABLE M015 UMENDE KIKAKUI SYLLABLE M1" + - "63 EEMENDE KIKAKUI SYLLABLE M100 EMENDE KIKAKUI SYLLABLE M165 OOMENDE KI" + - "KAKUI SYLLABLE M147 OMENDE KIKAKUI SYLLABLE M137 EIMENDE KIKAKUI SYLLABL" + - "E M131 INMENDE KIKAKUI SYLLABLE M135 INMENDE KIKAKUI SYLLABLE M195 ANMEN" + - "DE KIKAKUI SYLLABLE M178 ENMENDE KIKAKUI SYLLABLE M019 SIMENDE KIKAKUI S" + - "YLLABLE M020 SAMENDE KIKAKUI SYLLABLE M021 SUMENDE KIKAKUI SYLLABLE M162" + - " SEEMENDE KIKAKUI SYLLABLE M116 SEMENDE KIKAKUI SYLLABLE M136 SOOMENDE K" + - "IKAKUI SYLLABLE M079 SOMENDE KIKAKUI SYLLABLE M196 SIAMENDE KIKAKUI SYLL" + - "ABLE M025 LIMENDE KIKAKUI SYLLABLE M026 LAMENDE KIKAKUI SYLLABLE M027 LU" + - "MENDE KIKAKUI SYLLABLE M084 LEEMENDE KIKAKUI SYLLABLE M073 LEMENDE KIKAK" + - "UI SYLLABLE M054 LOOMENDE KIKAKUI SYLLABLE M153 LOMENDE KIKAKUI SYLLABLE" + - " M110 LONG LEMENDE KIKAKUI SYLLABLE M016 DIMENDE KIKAKUI SYLLABLE M017 D" + - "AMENDE KIKAKUI SYLLABLE M018 DUMENDE KIKAKUI SYLLABLE M089 DEEMENDE KIKA" + - "KUI SYLLABLE M180 DOOMENDE KIKAKUI SYLLABLE M181 DOMENDE KIKAKUI SYLLABL" + - "E M022 TIMENDE KIKAKUI SYLLABLE M023 TAMENDE KIKAKUI SYLLABLE M024 TUMEN" + - "DE KIKAKUI SYLLABLE M091 TEEMENDE KIKAKUI SYLLABLE M055 TEMENDE KIKAKUI " + - "SYLLABLE M104 TOOMENDE KIKAKUI SYLLABLE M069 TOMENDE KIKAKUI SYLLABLE M0" + - "28 JIMENDE KIKAKUI SYLLABLE M029 JAMENDE KIKAKUI SYLLABLE M030 JUMENDE K" + - "IKAKUI SYLLABLE M157 JEEMENDE KIKAKUI SYLLABLE M113 JEMENDE KIKAKUI SYLL" + - "ABLE M160 JOOMENDE KIKAKUI SYLLABLE M063 JOMENDE KIKAKUI SYLLABLE M175 L") + ("" + - "ONG JOMENDE KIKAKUI SYLLABLE M031 YIMENDE KIKAKUI SYLLABLE M032 YAMENDE " + - "KIKAKUI SYLLABLE M033 YUMENDE KIKAKUI SYLLABLE M109 YEEMENDE KIKAKUI SYL" + - "LABLE M080 YEMENDE KIKAKUI SYLLABLE M141 YOOMENDE KIKAKUI SYLLABLE M121 " + - "YOMENDE KIKAKUI SYLLABLE M034 FIMENDE KIKAKUI SYLLABLE M035 FAMENDE KIKA" + - "KUI SYLLABLE M036 FUMENDE KIKAKUI SYLLABLE M078 FEEMENDE KIKAKUI SYLLABL" + - "E M075 FEMENDE KIKAKUI SYLLABLE M133 FOOMENDE KIKAKUI SYLLABLE M088 FOME" + - "NDE KIKAKUI SYLLABLE M197 FUAMENDE KIKAKUI SYLLABLE M101 FANMENDE KIKAKU" + - "I SYLLABLE M037 NINMENDE KIKAKUI SYLLABLE M038 NANMENDE KIKAKUI SYLLABLE" + - " M039 NUNMENDE KIKAKUI SYLLABLE M117 NENMENDE KIKAKUI SYLLABLE M169 NONM" + - "ENDE KIKAKUI SYLLABLE M176 HIMENDE KIKAKUI SYLLABLE M041 HAMENDE KIKAKUI" + - " SYLLABLE M186 HUMENDE KIKAKUI SYLLABLE M040 HEEMENDE KIKAKUI SYLLABLE M" + - "096 HEMENDE KIKAKUI SYLLABLE M042 HOOMENDE KIKAKUI SYLLABLE M140 HOMENDE" + - " KIKAKUI SYLLABLE M083 HEEIMENDE KIKAKUI SYLLABLE M128 HOOUMENDE KIKAKUI" + - " SYLLABLE M053 HINMENDE KIKAKUI SYLLABLE M130 HANMENDE KIKAKUI SYLLABLE " + - "M087 HUNMENDE KIKAKUI SYLLABLE M052 HENMENDE KIKAKUI SYLLABLE M193 HONME" + - "NDE KIKAKUI SYLLABLE M046 HUANMENDE KIKAKUI SYLLABLE M090 NGGIMENDE KIKA" + - "KUI SYLLABLE M043 NGGAMENDE KIKAKUI SYLLABLE M082 NGGUMENDE KIKAKUI SYLL" + - "ABLE M115 NGGEEMENDE KIKAKUI SYLLABLE M146 NGGEMENDE KIKAKUI SYLLABLE M1" + - "56 NGGOOMENDE KIKAKUI SYLLABLE M120 NGGOMENDE KIKAKUI SYLLABLE M159 NGGA" + - "AMENDE KIKAKUI SYLLABLE M127 NGGUAMENDE KIKAKUI SYLLABLE M086 LONG NGGEM" + - "ENDE KIKAKUI SYLLABLE M106 LONG NGGOOMENDE KIKAKUI SYLLABLE M183 LONG NG" + - "GOMENDE KIKAKUI SYLLABLE M155 GIMENDE KIKAKUI SYLLABLE M111 GAMENDE KIKA" + - "KUI SYLLABLE M168 GUMENDE KIKAKUI SYLLABLE M190 GEEMENDE KIKAKUI SYLLABL" + - "E M166 GUEIMENDE KIKAKUI SYLLABLE M167 GUANMENDE KIKAKUI SYLLABLE M184 N" + - "GENMENDE KIKAKUI SYLLABLE M057 NGONMENDE KIKAKUI SYLLABLE M177 NGUANMEND" + - "E KIKAKUI SYLLABLE M068 PIMENDE KIKAKUI SYLLABLE M099 PAMENDE KIKAKUI SY" + - "LLABLE M050 PUMENDE KIKAKUI SYLLABLE M081 PEEMENDE KIKAKUI SYLLABLE M051" + - " PEMENDE KIKAKUI SYLLABLE M102 POOMENDE KIKAKUI SYLLABLE M066 POMENDE KI" + - "KAKUI SYLLABLE M145 MBIMENDE KIKAKUI SYLLABLE M062 MBAMENDE KIKAKUI SYLL" + - "ABLE M122 MBUMENDE KIKAKUI SYLLABLE M047 MBEEMENDE KIKAKUI SYLLABLE M188" + - " MBEEMENDE KIKAKUI SYLLABLE M072 MBEMENDE KIKAKUI SYLLABLE M172 MBOOMEND" + - "E KIKAKUI SYLLABLE M174 MBOMENDE KIKAKUI SYLLABLE M187 MBUUMENDE KIKAKUI" + - " SYLLABLE M161 LONG MBEMENDE KIKAKUI SYLLABLE M105 LONG MBOOMENDE KIKAKU" + - "I SYLLABLE M142 LONG MBOMENDE KIKAKUI SYLLABLE M132 KPIMENDE KIKAKUI SYL" + - "LABLE M092 KPAMENDE KIKAKUI SYLLABLE M074 KPUMENDE KIKAKUI SYLLABLE M044" + - " KPEEMENDE KIKAKUI SYLLABLE M108 KPEMENDE KIKAKUI SYLLABLE M112 KPOOMEND" + - "E KIKAKUI SYLLABLE M158 KPOMENDE KIKAKUI SYLLABLE M124 GBIMENDE KIKAKUI " + - "SYLLABLE M056 GBAMENDE KIKAKUI SYLLABLE M148 GBUMENDE KIKAKUI SYLLABLE M" + - "093 GBEEMENDE KIKAKUI SYLLABLE M107 GBEMENDE KIKAKUI SYLLABLE M071 GBOOM" + - "ENDE KIKAKUI SYLLABLE M070 GBOMENDE KIKAKUI SYLLABLE M171 RAMENDE KIKAKU" + - "I SYLLABLE M123 NDIMENDE KIKAKUI SYLLABLE M129 NDAMENDE KIKAKUI SYLLABLE" + - " M125 NDUMENDE KIKAKUI SYLLABLE M191 NDEEMENDE KIKAKUI SYLLABLE M119 NDE" + - "MENDE KIKAKUI SYLLABLE M067 NDOOMENDE KIKAKUI SYLLABLE M064 NDOMENDE KIK" + - "AKUI SYLLABLE M152 NJAMENDE KIKAKUI SYLLABLE M192 NJUMENDE KIKAKUI SYLLA" + - "BLE M149 NJEEMENDE KIKAKUI SYLLABLE M134 NJOOMENDE KIKAKUI SYLLABLE M182" + - " VIMENDE KIKAKUI SYLLABLE M185 VAMENDE KIKAKUI SYLLABLE M151 VUMENDE KIK" + - "AKUI SYLLABLE M173 VEEMENDE KIKAKUI SYLLABLE M085 VEMENDE KIKAKUI SYLLAB" + - "LE M144 VOOMENDE KIKAKUI SYLLABLE M077 VOMENDE KIKAKUI SYLLABLE M164 NYI" + - "NMENDE KIKAKUI SYLLABLE M058 NYANMENDE KIKAKUI SYLLABLE M170 NYUNMENDE K" + - "IKAKUI SYLLABLE M098 NYENMENDE KIKAKUI SYLLABLE M060 NYONMENDE KIKAKUI D" + - "IGIT ONEMENDE KIKAKUI DIGIT TWOMENDE KIKAKUI DIGIT THREEMENDE KIKAKUI DI" + - "GIT FOURMENDE KIKAKUI DIGIT FIVEMENDE KIKAKUI DIGIT SIXMENDE KIKAKUI DIG" + - "IT SEVENMENDE KIKAKUI DIGIT EIGHTMENDE KIKAKUI DIGIT NINEMENDE KIKAKUI C" + - "OMBINING NUMBER TEENSMENDE KIKAKUI COMBINING NUMBER TENSMENDE KIKAKUI CO" + - "MBINING NUMBER HUNDREDSMENDE KIKAKUI COMBINING NUMBER THOUSANDSMENDE KIK" + - "AKUI COMBINING NUMBER TEN THOUSANDSMENDE KIKAKUI COMBINING NUMBER HUNDRE" + - "D THOUSANDSMENDE KIKAKUI COMBINING NUMBER MILLIONSADLAM CAPITAL LETTER A" + - "LIFADLAM CAPITAL LETTER DAALIADLAM CAPITAL LETTER LAAMADLAM CAPITAL LETT" + - "ER MIIMADLAM CAPITAL LETTER BAADLAM CAPITAL LETTER SINNYIIYHEADLAM CAPIT" + - "AL LETTER PEADLAM CAPITAL LETTER BHEADLAM CAPITAL LETTER RAADLAM CAPITAL" + - " LETTER EADLAM CAPITAL LETTER FAADLAM CAPITAL LETTER IADLAM CAPITAL LETT" + - "ER OADLAM CAPITAL LETTER DHAADLAM CAPITAL LETTER YHEADLAM CAPITAL LETTER" + - " WAWADLAM CAPITAL LETTER NUNADLAM CAPITAL LETTER KAFADLAM CAPITAL LETTER" + - " YAADLAM CAPITAL LETTER UADLAM CAPITAL LETTER JIIMADLAM CAPITAL LETTER C") + ("" + - "HIADLAM CAPITAL LETTER HAADLAM CAPITAL LETTER QAAFADLAM CAPITAL LETTER G" + - "AADLAM CAPITAL LETTER NYAADLAM CAPITAL LETTER TUADLAM CAPITAL LETTER NHA" + - "ADLAM CAPITAL LETTER VAADLAM CAPITAL LETTER KHAADLAM CAPITAL LETTER GBEA" + - "DLAM CAPITAL LETTER ZALADLAM CAPITAL LETTER KPOADLAM CAPITAL LETTER SHAA" + - "DLAM SMALL LETTER ALIFADLAM SMALL LETTER DAALIADLAM SMALL LETTER LAAMADL" + - "AM SMALL LETTER MIIMADLAM SMALL LETTER BAADLAM SMALL LETTER SINNYIIYHEAD" + - "LAM SMALL LETTER PEADLAM SMALL LETTER BHEADLAM SMALL LETTER RAADLAM SMAL" + - "L LETTER EADLAM SMALL LETTER FAADLAM SMALL LETTER IADLAM SMALL LETTER OA" + - "DLAM SMALL LETTER DHAADLAM SMALL LETTER YHEADLAM SMALL LETTER WAWADLAM S" + - "MALL LETTER NUNADLAM SMALL LETTER KAFADLAM SMALL LETTER YAADLAM SMALL LE" + - "TTER UADLAM SMALL LETTER JIIMADLAM SMALL LETTER CHIADLAM SMALL LETTER HA" + - "ADLAM SMALL LETTER QAAFADLAM SMALL LETTER GAADLAM SMALL LETTER NYAADLAM " + - "SMALL LETTER TUADLAM SMALL LETTER NHAADLAM SMALL LETTER VAADLAM SMALL LE" + - "TTER KHAADLAM SMALL LETTER GBEADLAM SMALL LETTER ZALADLAM SMALL LETTER K" + - "POADLAM SMALL LETTER SHAADLAM ALIF LENGTHENERADLAM VOWEL LENGTHENERADLAM" + - " GEMINATION MARKADLAM HAMZAADLAM CONSONANT MODIFIERADLAM GEMINATE CONSON" + - "ANT MODIFIERADLAM NUKTAADLAM DIGIT ZEROADLAM DIGIT ONEADLAM DIGIT TWOADL" + - "AM DIGIT THREEADLAM DIGIT FOURADLAM DIGIT FIVEADLAM DIGIT SIXADLAM DIGIT" + - " SEVENADLAM DIGIT EIGHTADLAM DIGIT NINEADLAM INITIAL EXCLAMATION MARKADL" + - "AM INITIAL QUESTION MARKARABIC MATHEMATICAL ALEFARABIC MATHEMATICAL BEHA" + - "RABIC MATHEMATICAL JEEMARABIC MATHEMATICAL DALARABIC MATHEMATICAL WAWARA" + - "BIC MATHEMATICAL ZAINARABIC MATHEMATICAL HAHARABIC MATHEMATICAL TAHARABI" + - "C MATHEMATICAL YEHARABIC MATHEMATICAL KAFARABIC MATHEMATICAL LAMARABIC M" + - "ATHEMATICAL MEEMARABIC MATHEMATICAL NOONARABIC MATHEMATICAL SEENARABIC M" + - "ATHEMATICAL AINARABIC MATHEMATICAL FEHARABIC MATHEMATICAL SADARABIC MATH" + - "EMATICAL QAFARABIC MATHEMATICAL REHARABIC MATHEMATICAL SHEENARABIC MATHE" + - "MATICAL TEHARABIC MATHEMATICAL THEHARABIC MATHEMATICAL KHAHARABIC MATHEM" + - "ATICAL THALARABIC MATHEMATICAL DADARABIC MATHEMATICAL ZAHARABIC MATHEMAT" + - "ICAL GHAINARABIC MATHEMATICAL DOTLESS BEHARABIC MATHEMATICAL DOTLESS NOO" + - "NARABIC MATHEMATICAL DOTLESS FEHARABIC MATHEMATICAL DOTLESS QAFARABIC MA" + - "THEMATICAL INITIAL BEHARABIC MATHEMATICAL INITIAL JEEMARABIC MATHEMATICA" + - "L INITIAL HEHARABIC MATHEMATICAL INITIAL HAHARABIC MATHEMATICAL INITIAL " + - "YEHARABIC MATHEMATICAL INITIAL KAFARABIC MATHEMATICAL INITIAL LAMARABIC " + - "MATHEMATICAL INITIAL MEEMARABIC MATHEMATICAL INITIAL NOONARABIC MATHEMAT" + - "ICAL INITIAL SEENARABIC MATHEMATICAL INITIAL AINARABIC MATHEMATICAL INIT" + - "IAL FEHARABIC MATHEMATICAL INITIAL SADARABIC MATHEMATICAL INITIAL QAFARA" + - "BIC MATHEMATICAL INITIAL SHEENARABIC MATHEMATICAL INITIAL TEHARABIC MATH" + - "EMATICAL INITIAL THEHARABIC MATHEMATICAL INITIAL KHAHARABIC MATHEMATICAL" + - " INITIAL DADARABIC MATHEMATICAL INITIAL GHAINARABIC MATHEMATICAL TAILED " + - "JEEMARABIC MATHEMATICAL TAILED HAHARABIC MATHEMATICAL TAILED YEHARABIC M" + - "ATHEMATICAL TAILED LAMARABIC MATHEMATICAL TAILED NOONARABIC MATHEMATICAL" + - " TAILED SEENARABIC MATHEMATICAL TAILED AINARABIC MATHEMATICAL TAILED SAD" + - "ARABIC MATHEMATICAL TAILED QAFARABIC MATHEMATICAL TAILED SHEENARABIC MAT" + - "HEMATICAL TAILED KHAHARABIC MATHEMATICAL TAILED DADARABIC MATHEMATICAL T" + - "AILED GHAINARABIC MATHEMATICAL TAILED DOTLESS NOONARABIC MATHEMATICAL TA" + - "ILED DOTLESS QAFARABIC MATHEMATICAL STRETCHED BEHARABIC MATHEMATICAL STR" + - "ETCHED JEEMARABIC MATHEMATICAL STRETCHED HEHARABIC MATHEMATICAL STRETCHE" + - "D HAHARABIC MATHEMATICAL STRETCHED TAHARABIC MATHEMATICAL STRETCHED YEHA" + - "RABIC MATHEMATICAL STRETCHED KAFARABIC MATHEMATICAL STRETCHED MEEMARABIC" + - " MATHEMATICAL STRETCHED NOONARABIC MATHEMATICAL STRETCHED SEENARABIC MAT" + - "HEMATICAL STRETCHED AINARABIC MATHEMATICAL STRETCHED FEHARABIC MATHEMATI" + - "CAL STRETCHED SADARABIC MATHEMATICAL STRETCHED QAFARABIC MATHEMATICAL ST" + - "RETCHED SHEENARABIC MATHEMATICAL STRETCHED TEHARABIC MATHEMATICAL STRETC" + - "HED THEHARABIC MATHEMATICAL STRETCHED KHAHARABIC MATHEMATICAL STRETCHED " + - "DADARABIC MATHEMATICAL STRETCHED ZAHARABIC MATHEMATICAL STRETCHED GHAINA" + - "RABIC MATHEMATICAL STRETCHED DOTLESS BEHARABIC MATHEMATICAL STRETCHED DO" + - "TLESS FEHARABIC MATHEMATICAL LOOPED ALEFARABIC MATHEMATICAL LOOPED BEHAR" + - "ABIC MATHEMATICAL LOOPED JEEMARABIC MATHEMATICAL LOOPED DALARABIC MATHEM" + - "ATICAL LOOPED HEHARABIC MATHEMATICAL LOOPED WAWARABIC MATHEMATICAL LOOPE" + - "D ZAINARABIC MATHEMATICAL LOOPED HAHARABIC MATHEMATICAL LOOPED TAHARABIC" + - " MATHEMATICAL LOOPED YEHARABIC MATHEMATICAL LOOPED LAMARABIC MATHEMATICA" + - "L LOOPED MEEMARABIC MATHEMATICAL LOOPED NOONARABIC MATHEMATICAL LOOPED S" + - "EENARABIC MATHEMATICAL LOOPED AINARABIC MATHEMATICAL LOOPED FEHARABIC MA" + - "THEMATICAL LOOPED SADARABIC MATHEMATICAL LOOPED QAFARABIC MATHEMATICAL L") + ("" + - "OOPED REHARABIC MATHEMATICAL LOOPED SHEENARABIC MATHEMATICAL LOOPED TEHA" + - "RABIC MATHEMATICAL LOOPED THEHARABIC MATHEMATICAL LOOPED KHAHARABIC MATH" + - "EMATICAL LOOPED THALARABIC MATHEMATICAL LOOPED DADARABIC MATHEMATICAL LO" + - "OPED ZAHARABIC MATHEMATICAL LOOPED GHAINARABIC MATHEMATICAL DOUBLE-STRUC" + - "K BEHARABIC MATHEMATICAL DOUBLE-STRUCK JEEMARABIC MATHEMATICAL DOUBLE-ST" + - "RUCK DALARABIC MATHEMATICAL DOUBLE-STRUCK WAWARABIC MATHEMATICAL DOUBLE-" + - "STRUCK ZAINARABIC MATHEMATICAL DOUBLE-STRUCK HAHARABIC MATHEMATICAL DOUB" + - "LE-STRUCK TAHARABIC MATHEMATICAL DOUBLE-STRUCK YEHARABIC MATHEMATICAL DO" + - "UBLE-STRUCK LAMARABIC MATHEMATICAL DOUBLE-STRUCK MEEMARABIC MATHEMATICAL" + - " DOUBLE-STRUCK NOONARABIC MATHEMATICAL DOUBLE-STRUCK SEENARABIC MATHEMAT" + - "ICAL DOUBLE-STRUCK AINARABIC MATHEMATICAL DOUBLE-STRUCK FEHARABIC MATHEM" + - "ATICAL DOUBLE-STRUCK SADARABIC MATHEMATICAL DOUBLE-STRUCK QAFARABIC MATH" + - "EMATICAL DOUBLE-STRUCK REHARABIC MATHEMATICAL DOUBLE-STRUCK SHEENARABIC " + - "MATHEMATICAL DOUBLE-STRUCK TEHARABIC MATHEMATICAL DOUBLE-STRUCK THEHARAB" + - "IC MATHEMATICAL DOUBLE-STRUCK KHAHARABIC MATHEMATICAL DOUBLE-STRUCK THAL" + - "ARABIC MATHEMATICAL DOUBLE-STRUCK DADARABIC MATHEMATICAL DOUBLE-STRUCK Z" + - "AHARABIC MATHEMATICAL DOUBLE-STRUCK GHAINARABIC MATHEMATICAL OPERATOR ME" + - "EM WITH HAH WITH TATWEELARABIC MATHEMATICAL OPERATOR HAH WITH DALMAHJONG" + - " TILE EAST WINDMAHJONG TILE SOUTH WINDMAHJONG TILE WEST WINDMAHJONG TILE" + - " NORTH WINDMAHJONG TILE RED DRAGONMAHJONG TILE GREEN DRAGONMAHJONG TILE " + - "WHITE DRAGONMAHJONG TILE ONE OF CHARACTERSMAHJONG TILE TWO OF CHARACTERS" + - "MAHJONG TILE THREE OF CHARACTERSMAHJONG TILE FOUR OF CHARACTERSMAHJONG T" + - "ILE FIVE OF CHARACTERSMAHJONG TILE SIX OF CHARACTERSMAHJONG TILE SEVEN O" + - "F CHARACTERSMAHJONG TILE EIGHT OF CHARACTERSMAHJONG TILE NINE OF CHARACT" + - "ERSMAHJONG TILE ONE OF BAMBOOSMAHJONG TILE TWO OF BAMBOOSMAHJONG TILE TH" + - "REE OF BAMBOOSMAHJONG TILE FOUR OF BAMBOOSMAHJONG TILE FIVE OF BAMBOOSMA" + - "HJONG TILE SIX OF BAMBOOSMAHJONG TILE SEVEN OF BAMBOOSMAHJONG TILE EIGHT" + - " OF BAMBOOSMAHJONG TILE NINE OF BAMBOOSMAHJONG TILE ONE OF CIRCLESMAHJON" + - "G TILE TWO OF CIRCLESMAHJONG TILE THREE OF CIRCLESMAHJONG TILE FOUR OF C" + - "IRCLESMAHJONG TILE FIVE OF CIRCLESMAHJONG TILE SIX OF CIRCLESMAHJONG TIL" + - "E SEVEN OF CIRCLESMAHJONG TILE EIGHT OF CIRCLESMAHJONG TILE NINE OF CIRC" + - "LESMAHJONG TILE PLUMMAHJONG TILE ORCHIDMAHJONG TILE BAMBOOMAHJONG TILE C" + - "HRYSANTHEMUMMAHJONG TILE SPRINGMAHJONG TILE SUMMERMAHJONG TILE AUTUMNMAH" + - "JONG TILE WINTERMAHJONG TILE JOKERMAHJONG TILE BACKDOMINO TILE HORIZONTA" + - "L BACKDOMINO TILE HORIZONTAL-00-00DOMINO TILE HORIZONTAL-00-01DOMINO TIL" + - "E HORIZONTAL-00-02DOMINO TILE HORIZONTAL-00-03DOMINO TILE HORIZONTAL-00-" + - "04DOMINO TILE HORIZONTAL-00-05DOMINO TILE HORIZONTAL-00-06DOMINO TILE HO" + - "RIZONTAL-01-00DOMINO TILE HORIZONTAL-01-01DOMINO TILE HORIZONTAL-01-02DO" + - "MINO TILE HORIZONTAL-01-03DOMINO TILE HORIZONTAL-01-04DOMINO TILE HORIZO" + - "NTAL-01-05DOMINO TILE HORIZONTAL-01-06DOMINO TILE HORIZONTAL-02-00DOMINO" + - " TILE HORIZONTAL-02-01DOMINO TILE HORIZONTAL-02-02DOMINO TILE HORIZONTAL" + - "-02-03DOMINO TILE HORIZONTAL-02-04DOMINO TILE HORIZONTAL-02-05DOMINO TIL" + - "E HORIZONTAL-02-06DOMINO TILE HORIZONTAL-03-00DOMINO TILE HORIZONTAL-03-" + - "01DOMINO TILE HORIZONTAL-03-02DOMINO TILE HORIZONTAL-03-03DOMINO TILE HO" + - "RIZONTAL-03-04DOMINO TILE HORIZONTAL-03-05DOMINO TILE HORIZONTAL-03-06DO" + - "MINO TILE HORIZONTAL-04-00DOMINO TILE HORIZONTAL-04-01DOMINO TILE HORIZO" + - "NTAL-04-02DOMINO TILE HORIZONTAL-04-03DOMINO TILE HORIZONTAL-04-04DOMINO" + - " TILE HORIZONTAL-04-05DOMINO TILE HORIZONTAL-04-06DOMINO TILE HORIZONTAL" + - "-05-00DOMINO TILE HORIZONTAL-05-01DOMINO TILE HORIZONTAL-05-02DOMINO TIL" + - "E HORIZONTAL-05-03DOMINO TILE HORIZONTAL-05-04DOMINO TILE HORIZONTAL-05-" + - "05DOMINO TILE HORIZONTAL-05-06DOMINO TILE HORIZONTAL-06-00DOMINO TILE HO" + - "RIZONTAL-06-01DOMINO TILE HORIZONTAL-06-02DOMINO TILE HORIZONTAL-06-03DO" + - "MINO TILE HORIZONTAL-06-04DOMINO TILE HORIZONTAL-06-05DOMINO TILE HORIZO" + - "NTAL-06-06DOMINO TILE VERTICAL BACKDOMINO TILE VERTICAL-00-00DOMINO TILE" + - " VERTICAL-00-01DOMINO TILE VERTICAL-00-02DOMINO TILE VERTICAL-00-03DOMIN" + - "O TILE VERTICAL-00-04DOMINO TILE VERTICAL-00-05DOMINO TILE VERTICAL-00-0" + - "6DOMINO TILE VERTICAL-01-00DOMINO TILE VERTICAL-01-01DOMINO TILE VERTICA" + - "L-01-02DOMINO TILE VERTICAL-01-03DOMINO TILE VERTICAL-01-04DOMINO TILE V" + - "ERTICAL-01-05DOMINO TILE VERTICAL-01-06DOMINO TILE VERTICAL-02-00DOMINO " + - "TILE VERTICAL-02-01DOMINO TILE VERTICAL-02-02DOMINO TILE VERTICAL-02-03D" + - "OMINO TILE VERTICAL-02-04DOMINO TILE VERTICAL-02-05DOMINO TILE VERTICAL-" + - "02-06DOMINO TILE VERTICAL-03-00DOMINO TILE VERTICAL-03-01DOMINO TILE VER" + - "TICAL-03-02DOMINO TILE VERTICAL-03-03DOMINO TILE VERTICAL-03-04DOMINO TI" + - "LE VERTICAL-03-05DOMINO TILE VERTICAL-03-06DOMINO TILE VERTICAL-04-00DOM") + ("" + - "INO TILE VERTICAL-04-01DOMINO TILE VERTICAL-04-02DOMINO TILE VERTICAL-04" + - "-03DOMINO TILE VERTICAL-04-04DOMINO TILE VERTICAL-04-05DOMINO TILE VERTI" + - "CAL-04-06DOMINO TILE VERTICAL-05-00DOMINO TILE VERTICAL-05-01DOMINO TILE" + - " VERTICAL-05-02DOMINO TILE VERTICAL-05-03DOMINO TILE VERTICAL-05-04DOMIN" + - "O TILE VERTICAL-05-05DOMINO TILE VERTICAL-05-06DOMINO TILE VERTICAL-06-0" + - "0DOMINO TILE VERTICAL-06-01DOMINO TILE VERTICAL-06-02DOMINO TILE VERTICA" + - "L-06-03DOMINO TILE VERTICAL-06-04DOMINO TILE VERTICAL-06-05DOMINO TILE V" + - "ERTICAL-06-06PLAYING CARD BACKPLAYING CARD ACE OF SPADESPLAYING CARD TWO" + - " OF SPADESPLAYING CARD THREE OF SPADESPLAYING CARD FOUR OF SPADESPLAYING" + - " CARD FIVE OF SPADESPLAYING CARD SIX OF SPADESPLAYING CARD SEVEN OF SPAD" + - "ESPLAYING CARD EIGHT OF SPADESPLAYING CARD NINE OF SPADESPLAYING CARD TE" + - "N OF SPADESPLAYING CARD JACK OF SPADESPLAYING CARD KNIGHT OF SPADESPLAYI" + - "NG CARD QUEEN OF SPADESPLAYING CARD KING OF SPADESPLAYING CARD ACE OF HE" + - "ARTSPLAYING CARD TWO OF HEARTSPLAYING CARD THREE OF HEARTSPLAYING CARD F" + - "OUR OF HEARTSPLAYING CARD FIVE OF HEARTSPLAYING CARD SIX OF HEARTSPLAYIN" + - "G CARD SEVEN OF HEARTSPLAYING CARD EIGHT OF HEARTSPLAYING CARD NINE OF H" + - "EARTSPLAYING CARD TEN OF HEARTSPLAYING CARD JACK OF HEARTSPLAYING CARD K" + - "NIGHT OF HEARTSPLAYING CARD QUEEN OF HEARTSPLAYING CARD KING OF HEARTSPL" + - "AYING CARD RED JOKERPLAYING CARD ACE OF DIAMONDSPLAYING CARD TWO OF DIAM" + - "ONDSPLAYING CARD THREE OF DIAMONDSPLAYING CARD FOUR OF DIAMONDSPLAYING C" + - "ARD FIVE OF DIAMONDSPLAYING CARD SIX OF DIAMONDSPLAYING CARD SEVEN OF DI" + - "AMONDSPLAYING CARD EIGHT OF DIAMONDSPLAYING CARD NINE OF DIAMONDSPLAYING" + - " CARD TEN OF DIAMONDSPLAYING CARD JACK OF DIAMONDSPLAYING CARD KNIGHT OF" + - " DIAMONDSPLAYING CARD QUEEN OF DIAMONDSPLAYING CARD KING OF DIAMONDSPLAY" + - "ING CARD BLACK JOKERPLAYING CARD ACE OF CLUBSPLAYING CARD TWO OF CLUBSPL" + - "AYING CARD THREE OF CLUBSPLAYING CARD FOUR OF CLUBSPLAYING CARD FIVE OF " + - "CLUBSPLAYING CARD SIX OF CLUBSPLAYING CARD SEVEN OF CLUBSPLAYING CARD EI" + - "GHT OF CLUBSPLAYING CARD NINE OF CLUBSPLAYING CARD TEN OF CLUBSPLAYING C" + - "ARD JACK OF CLUBSPLAYING CARD KNIGHT OF CLUBSPLAYING CARD QUEEN OF CLUBS" + - "PLAYING CARD KING OF CLUBSPLAYING CARD WHITE JOKERPLAYING CARD FOOLPLAYI" + - "NG CARD TRUMP-1PLAYING CARD TRUMP-2PLAYING CARD TRUMP-3PLAYING CARD TRUM" + - "P-4PLAYING CARD TRUMP-5PLAYING CARD TRUMP-6PLAYING CARD TRUMP-7PLAYING C" + - "ARD TRUMP-8PLAYING CARD TRUMP-9PLAYING CARD TRUMP-10PLAYING CARD TRUMP-1" + - "1PLAYING CARD TRUMP-12PLAYING CARD TRUMP-13PLAYING CARD TRUMP-14PLAYING " + - "CARD TRUMP-15PLAYING CARD TRUMP-16PLAYING CARD TRUMP-17PLAYING CARD TRUM" + - "P-18PLAYING CARD TRUMP-19PLAYING CARD TRUMP-20PLAYING CARD TRUMP-21DIGIT" + - " ZERO FULL STOPDIGIT ZERO COMMADIGIT ONE COMMADIGIT TWO COMMADIGIT THREE" + - " COMMADIGIT FOUR COMMADIGIT FIVE COMMADIGIT SIX COMMADIGIT SEVEN COMMADI" + - "GIT EIGHT COMMADIGIT NINE COMMADINGBAT CIRCLED SANS-SERIF DIGIT ZERODING" + - "BAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZEROPARENTHESIZED LATIN CAPITAL LE" + - "TTER APARENTHESIZED LATIN CAPITAL LETTER BPARENTHESIZED LATIN CAPITAL LE" + - "TTER CPARENTHESIZED LATIN CAPITAL LETTER DPARENTHESIZED LATIN CAPITAL LE" + - "TTER EPARENTHESIZED LATIN CAPITAL LETTER FPARENTHESIZED LATIN CAPITAL LE" + - "TTER GPARENTHESIZED LATIN CAPITAL LETTER HPARENTHESIZED LATIN CAPITAL LE" + - "TTER IPARENTHESIZED LATIN CAPITAL LETTER JPARENTHESIZED LATIN CAPITAL LE" + - "TTER KPARENTHESIZED LATIN CAPITAL LETTER LPARENTHESIZED LATIN CAPITAL LE" + - "TTER MPARENTHESIZED LATIN CAPITAL LETTER NPARENTHESIZED LATIN CAPITAL LE" + - "TTER OPARENTHESIZED LATIN CAPITAL LETTER PPARENTHESIZED LATIN CAPITAL LE" + - "TTER QPARENTHESIZED LATIN CAPITAL LETTER RPARENTHESIZED LATIN CAPITAL LE" + - "TTER SPARENTHESIZED LATIN CAPITAL LETTER TPARENTHESIZED LATIN CAPITAL LE" + - "TTER UPARENTHESIZED LATIN CAPITAL LETTER VPARENTHESIZED LATIN CAPITAL LE" + - "TTER WPARENTHESIZED LATIN CAPITAL LETTER XPARENTHESIZED LATIN CAPITAL LE" + - "TTER YPARENTHESIZED LATIN CAPITAL LETTER ZTORTOISE SHELL BRACKETED LATIN" + - " CAPITAL LETTER SCIRCLED ITALIC LATIN CAPITAL LETTER CCIRCLED ITALIC LAT" + - "IN CAPITAL LETTER RCIRCLED CDCIRCLED WZSQUARED LATIN CAPITAL LETTER ASQU" + - "ARED LATIN CAPITAL LETTER BSQUARED LATIN CAPITAL LETTER CSQUARED LATIN C" + - "APITAL LETTER DSQUARED LATIN CAPITAL LETTER ESQUARED LATIN CAPITAL LETTE" + - "R FSQUARED LATIN CAPITAL LETTER GSQUARED LATIN CAPITAL LETTER HSQUARED L" + - "ATIN CAPITAL LETTER ISQUARED LATIN CAPITAL LETTER JSQUARED LATIN CAPITAL" + - " LETTER KSQUARED LATIN CAPITAL LETTER LSQUARED LATIN CAPITAL LETTER MSQU" + - "ARED LATIN CAPITAL LETTER NSQUARED LATIN CAPITAL LETTER OSQUARED LATIN C" + - "APITAL LETTER PSQUARED LATIN CAPITAL LETTER QSQUARED LATIN CAPITAL LETTE" + - "R RSQUARED LATIN CAPITAL LETTER SSQUARED LATIN CAPITAL LETTER TSQUARED L" + - "ATIN CAPITAL LETTER USQUARED LATIN CAPITAL LETTER VSQUARED LATIN CAPITAL") + ("" + - " LETTER WSQUARED LATIN CAPITAL LETTER XSQUARED LATIN CAPITAL LETTER YSQU" + - "ARED LATIN CAPITAL LETTER ZSQUARED HVSQUARED MVSQUARED SDSQUARED SSSQUAR" + - "ED PPVSQUARED WCNEGATIVE CIRCLED LATIN CAPITAL LETTER ANEGATIVE CIRCLED " + - "LATIN CAPITAL LETTER BNEGATIVE CIRCLED LATIN CAPITAL LETTER CNEGATIVE CI" + - "RCLED LATIN CAPITAL LETTER DNEGATIVE CIRCLED LATIN CAPITAL LETTER ENEGAT" + - "IVE CIRCLED LATIN CAPITAL LETTER FNEGATIVE CIRCLED LATIN CAPITAL LETTER " + - "GNEGATIVE CIRCLED LATIN CAPITAL LETTER HNEGATIVE CIRCLED LATIN CAPITAL L" + - "ETTER INEGATIVE CIRCLED LATIN CAPITAL LETTER JNEGATIVE CIRCLED LATIN CAP" + - "ITAL LETTER KNEGATIVE CIRCLED LATIN CAPITAL LETTER LNEGATIVE CIRCLED LAT" + - "IN CAPITAL LETTER MNEGATIVE CIRCLED LATIN CAPITAL LETTER NNEGATIVE CIRCL" + - "ED LATIN CAPITAL LETTER ONEGATIVE CIRCLED LATIN CAPITAL LETTER PNEGATIVE" + - " CIRCLED LATIN CAPITAL LETTER QNEGATIVE CIRCLED LATIN CAPITAL LETTER RNE" + - "GATIVE CIRCLED LATIN CAPITAL LETTER SNEGATIVE CIRCLED LATIN CAPITAL LETT" + - "ER TNEGATIVE CIRCLED LATIN CAPITAL LETTER UNEGATIVE CIRCLED LATIN CAPITA" + - "L LETTER VNEGATIVE CIRCLED LATIN CAPITAL LETTER WNEGATIVE CIRCLED LATIN " + - "CAPITAL LETTER XNEGATIVE CIRCLED LATIN CAPITAL LETTER YNEGATIVE CIRCLED " + - "LATIN CAPITAL LETTER ZRAISED MC SIGNRAISED MD SIGNNEGATIVE SQUARED LATIN" + - " CAPITAL LETTER ANEGATIVE SQUARED LATIN CAPITAL LETTER BNEGATIVE SQUARED" + - " LATIN CAPITAL LETTER CNEGATIVE SQUARED LATIN CAPITAL LETTER DNEGATIVE S" + - "QUARED LATIN CAPITAL LETTER ENEGATIVE SQUARED LATIN CAPITAL LETTER FNEGA" + - "TIVE SQUARED LATIN CAPITAL LETTER GNEGATIVE SQUARED LATIN CAPITAL LETTER" + - " HNEGATIVE SQUARED LATIN CAPITAL LETTER INEGATIVE SQUARED LATIN CAPITAL " + - "LETTER JNEGATIVE SQUARED LATIN CAPITAL LETTER KNEGATIVE SQUARED LATIN CA" + - "PITAL LETTER LNEGATIVE SQUARED LATIN CAPITAL LETTER MNEGATIVE SQUARED LA" + - "TIN CAPITAL LETTER NNEGATIVE SQUARED LATIN CAPITAL LETTER ONEGATIVE SQUA" + - "RED LATIN CAPITAL LETTER PNEGATIVE SQUARED LATIN CAPITAL LETTER QNEGATIV" + - "E SQUARED LATIN CAPITAL LETTER RNEGATIVE SQUARED LATIN CAPITAL LETTER SN" + - "EGATIVE SQUARED LATIN CAPITAL LETTER TNEGATIVE SQUARED LATIN CAPITAL LET" + - "TER UNEGATIVE SQUARED LATIN CAPITAL LETTER VNEGATIVE SQUARED LATIN CAPIT" + - "AL LETTER WNEGATIVE SQUARED LATIN CAPITAL LETTER XNEGATIVE SQUARED LATIN" + - " CAPITAL LETTER YNEGATIVE SQUARED LATIN CAPITAL LETTER ZCROSSED NEGATIVE" + - " SQUARED LATIN CAPITAL LETTER PNEGATIVE SQUARED ICNEGATIVE SQUARED PANEG" + - "ATIVE SQUARED SANEGATIVE SQUARED ABNEGATIVE SQUARED WCSQUARE DJSQUARED C" + - "LSQUARED COOLSQUARED FREESQUARED IDSQUARED NEWSQUARED NGSQUARED OKSQUARE" + - "D SOSSQUARED UP WITH EXCLAMATION MARKSQUARED VSSQUARED THREE DSQUARED SE" + - "COND SCREENSQUARED TWO KSQUARED FOUR KSQUARED EIGHT KSQUARED FIVE POINT " + - "ONESQUARED SEVEN POINT ONESQUARED TWENTY-TWO POINT TWOSQUARED SIXTY PSQU" + - "ARED ONE HUNDRED TWENTY PSQUARED LATIN SMALL LETTER DSQUARED HCSQUARED H" + - "DRSQUARED HI-RESSQUARED LOSSLESSSQUARED SHVSQUARED UHDSQUARED VODREGIONA" + - "L INDICATOR SYMBOL LETTER AREGIONAL INDICATOR SYMBOL LETTER BREGIONAL IN" + - "DICATOR SYMBOL LETTER CREGIONAL INDICATOR SYMBOL LETTER DREGIONAL INDICA" + - "TOR SYMBOL LETTER EREGIONAL INDICATOR SYMBOL LETTER FREGIONAL INDICATOR " + - "SYMBOL LETTER GREGIONAL INDICATOR SYMBOL LETTER HREGIONAL INDICATOR SYMB" + - "OL LETTER IREGIONAL INDICATOR SYMBOL LETTER JREGIONAL INDICATOR SYMBOL L" + - "ETTER KREGIONAL INDICATOR SYMBOL LETTER LREGIONAL INDICATOR SYMBOL LETTE" + - "R MREGIONAL INDICATOR SYMBOL LETTER NREGIONAL INDICATOR SYMBOL LETTER OR" + - "EGIONAL INDICATOR SYMBOL LETTER PREGIONAL INDICATOR SYMBOL LETTER QREGIO" + - "NAL INDICATOR SYMBOL LETTER RREGIONAL INDICATOR SYMBOL LETTER SREGIONAL " + - "INDICATOR SYMBOL LETTER TREGIONAL INDICATOR SYMBOL LETTER UREGIONAL INDI" + - "CATOR SYMBOL LETTER VREGIONAL INDICATOR SYMBOL LETTER WREGIONAL INDICATO" + - "R SYMBOL LETTER XREGIONAL INDICATOR SYMBOL LETTER YREGIONAL INDICATOR SY" + - "MBOL LETTER ZSQUARE HIRAGANA HOKASQUARED KATAKANA KOKOSQUARED KATAKANA S" + - "ASQUARED CJK UNIFIED IDEOGRAPH-624BSQUARED CJK UNIFIED IDEOGRAPH-5B57SQU" + - "ARED CJK UNIFIED IDEOGRAPH-53CCSQUARED KATAKANA DESQUARED CJK UNIFIED ID" + - "EOGRAPH-4E8CSQUARED CJK UNIFIED IDEOGRAPH-591ASQUARED CJK UNIFIED IDEOGR" + - "APH-89E3SQUARED CJK UNIFIED IDEOGRAPH-5929SQUARED CJK UNIFIED IDEOGRAPH-" + - "4EA4SQUARED CJK UNIFIED IDEOGRAPH-6620SQUARED CJK UNIFIED IDEOGRAPH-7121" + - "SQUARED CJK UNIFIED IDEOGRAPH-6599SQUARED CJK UNIFIED IDEOGRAPH-524DSQUA" + - "RED CJK UNIFIED IDEOGRAPH-5F8CSQUARED CJK UNIFIED IDEOGRAPH-518DSQUARED " + - "CJK UNIFIED IDEOGRAPH-65B0SQUARED CJK UNIFIED IDEOGRAPH-521DSQUARED CJK " + - "UNIFIED IDEOGRAPH-7D42SQUARED CJK UNIFIED IDEOGRAPH-751FSQUARED CJK UNIF" + - "IED IDEOGRAPH-8CA9SQUARED CJK UNIFIED IDEOGRAPH-58F0SQUARED CJK UNIFIED " + - "IDEOGRAPH-5439SQUARED CJK UNIFIED IDEOGRAPH-6F14SQUARED CJK UNIFIED IDEO" + - "GRAPH-6295SQUARED CJK UNIFIED IDEOGRAPH-6355SQUARED CJK UNIFIED IDEOGRAP") + ("" + - "H-4E00SQUARED CJK UNIFIED IDEOGRAPH-4E09SQUARED CJK UNIFIED IDEOGRAPH-90" + - "4ASQUARED CJK UNIFIED IDEOGRAPH-5DE6SQUARED CJK UNIFIED IDEOGRAPH-4E2DSQ" + - "UARED CJK UNIFIED IDEOGRAPH-53F3SQUARED CJK UNIFIED IDEOGRAPH-6307SQUARE" + - "D CJK UNIFIED IDEOGRAPH-8D70SQUARED CJK UNIFIED IDEOGRAPH-6253SQUARED CJ" + - "K UNIFIED IDEOGRAPH-7981SQUARED CJK UNIFIED IDEOGRAPH-7A7ASQUARED CJK UN" + - "IFIED IDEOGRAPH-5408SQUARED CJK UNIFIED IDEOGRAPH-6E80SQUARED CJK UNIFIE" + - "D IDEOGRAPH-6709SQUARED CJK UNIFIED IDEOGRAPH-6708SQUARED CJK UNIFIED ID" + - "EOGRAPH-7533SQUARED CJK UNIFIED IDEOGRAPH-5272SQUARED CJK UNIFIED IDEOGR" + - "APH-55B6SQUARED CJK UNIFIED IDEOGRAPH-914DTORTOISE SHELL BRACKETED CJK U" + - "NIFIED IDEOGRAPH-672CTORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09" + - "TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8CTORTOISE SHELL BRACKE" + - "TED CJK UNIFIED IDEOGRAPH-5B89TORTOISE SHELL BRACKETED CJK UNIFIED IDEOG" + - "RAPH-70B9TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253TORTOISE SHE" + - "LL BRACKETED CJK UNIFIED IDEOGRAPH-76D7TORTOISE SHELL BRACKETED CJK UNIF" + - "IED IDEOGRAPH-52DDTORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557CIR" + - "CLED IDEOGRAPH ADVANTAGECIRCLED IDEOGRAPH ACCEPTCYCLONEFOGGYCLOSED UMBRE" + - "LLANIGHT WITH STARSSUNRISE OVER MOUNTAINSSUNRISECITYSCAPE AT DUSKSUNSET " + - "OVER BUILDINGSRAINBOWBRIDGE AT NIGHTWATER WAVEVOLCANOMILKY WAYEARTH GLOB" + - "E EUROPE-AFRICAEARTH GLOBE AMERICASEARTH GLOBE ASIA-AUSTRALIAGLOBE WITH " + - "MERIDIANSNEW MOON SYMBOLWAXING CRESCENT MOON SYMBOLFIRST QUARTER MOON SY" + - "MBOLWAXING GIBBOUS MOON SYMBOLFULL MOON SYMBOLWANING GIBBOUS MOON SYMBOL" + - "LAST QUARTER MOON SYMBOLWANING CRESCENT MOON SYMBOLCRESCENT MOONNEW MOON" + - " WITH FACEFIRST QUARTER MOON WITH FACELAST QUARTER MOON WITH FACEFULL MO" + - "ON WITH FACESUN WITH FACEGLOWING STARSHOOTING STARTHERMOMETERBLACK DROPL" + - "ETWHITE SUNWHITE SUN WITH SMALL CLOUDWHITE SUN BEHIND CLOUDWHITE SUN BEH" + - "IND CLOUD WITH RAINCLOUD WITH RAINCLOUD WITH SNOWCLOUD WITH LIGHTNINGCLO" + - "UD WITH TORNADOFOGWIND BLOWING FACEHOT DOGTACOBURRITOCHESTNUTSEEDLINGEVE" + - "RGREEN TREEDECIDUOUS TREEPALM TREECACTUSHOT PEPPERTULIPCHERRY BLOSSOMROS" + - "EHIBISCUSSUNFLOWERBLOSSOMEAR OF MAIZEEAR OF RICEHERBFOUR LEAF CLOVERMAPL" + - "E LEAFFALLEN LEAFLEAF FLUTTERING IN WINDMUSHROOMTOMATOAUBERGINEGRAPESMEL" + - "ONWATERMELONTANGERINELEMONBANANAPINEAPPLERED APPLEGREEN APPLEPEARPEACHCH" + - "ERRIESSTRAWBERRYHAMBURGERSLICE OF PIZZAMEAT ON BONEPOULTRY LEGRICE CRACK" + - "ERRICE BALLCOOKED RICECURRY AND RICESTEAMING BOWLSPAGHETTIBREADFRENCH FR" + - "IESROASTED SWEET POTATODANGOODENSUSHIFRIED SHRIMPFISH CAKE WITH SWIRL DE" + - "SIGNSOFT ICE CREAMSHAVED ICEICE CREAMDOUGHNUTCOOKIECHOCOLATE BARCANDYLOL" + - "LIPOPCUSTARDHONEY POTSHORTCAKEBENTO BOXPOT OF FOODCOOKINGFORK AND KNIFET" + - "EACUP WITHOUT HANDLESAKE BOTTLE AND CUPWINE GLASSCOCKTAIL GLASSTROPICAL " + - "DRINKBEER MUGCLINKING BEER MUGSBABY BOTTLEFORK AND KNIFE WITH PLATEBOTTL" + - "E WITH POPPING CORKPOPCORNRIBBONWRAPPED PRESENTBIRTHDAY CAKEJACK-O-LANTE" + - "RNCHRISTMAS TREEFATHER CHRISTMASFIREWORKSFIREWORK SPARKLERBALLOONPARTY P" + - "OPPERCONFETTI BALLTANABATA TREECROSSED FLAGSPINE DECORATIONJAPANESE DOLL" + - "SCARP STREAMERWIND CHIMEMOON VIEWING CEREMONYSCHOOL SATCHELGRADUATION CA" + - "PHEART WITH TIP ON THE LEFTBOUQUET OF FLOWERSMILITARY MEDALREMINDER RIBB" + - "ONMUSICAL KEYBOARD WITH JACKSSTUDIO MICROPHONELEVEL SLIDERCONTROL KNOBSB" + - "EAMED ASCENDING MUSICAL NOTESBEAMED DESCENDING MUSICAL NOTESFILM FRAMESA" + - "DMISSION TICKETSCAROUSEL HORSEFERRIS WHEELROLLER COASTERFISHING POLE AND" + - " FISHMICROPHONEMOVIE CAMERACINEMAHEADPHONEARTIST PALETTETOP HATCIRCUS TE" + - "NTTICKETCLAPPER BOARDPERFORMING ARTSVIDEO GAMEDIRECT HITSLOT MACHINEBILL" + - "IARDSGAME DIEBOWLINGFLOWER PLAYING CARDSMUSICAL NOTEMULTIPLE MUSICAL NOT" + - "ESSAXOPHONEGUITARMUSICAL KEYBOARDTRUMPETVIOLINMUSICAL SCORERUNNING SHIRT" + - " WITH SASHTENNIS RACQUET AND BALLSKI AND SKI BOOTBASKETBALL AND HOOPCHEQ" + - "UERED FLAGSNOWBOARDERRUNNERSURFERSPORTS MEDALTROPHYHORSE RACINGAMERICAN " + - "FOOTBALLRUGBY FOOTBALLSWIMMERWEIGHT LIFTERGOLFERRACING MOTORCYCLERACING " + - "CARCRICKET BAT AND BALLVOLLEYBALLFIELD HOCKEY STICK AND BALLICE HOCKEY S" + - "TICK AND PUCKTABLE TENNIS PADDLE AND BALLSNOW CAPPED MOUNTAINCAMPINGBEAC" + - "H WITH UMBRELLABUILDING CONSTRUCTIONHOUSE BUILDINGSCITYSCAPEDERELICT HOU" + - "SE BUILDINGCLASSICAL BUILDINGDESERTDESERT ISLANDNATIONAL PARKSTADIUMHOUS" + - "E BUILDINGHOUSE WITH GARDENOFFICE BUILDINGJAPANESE POST OFFICEEUROPEAN P" + - "OST OFFICEHOSPITALBANKAUTOMATED TELLER MACHINEHOTELLOVE HOTELCONVENIENCE" + - " STORESCHOOLDEPARTMENT STOREFACTORYIZAKAYA LANTERNJAPANESE CASTLEEUROPEA" + - "N CASTLEWHITE PENNANTBLACK PENNANTWAVING WHITE FLAGWAVING BLACK FLAGROSE" + - "TTEBLACK ROSETTELABELBADMINTON RACQUET AND SHUTTLECOCKBOW AND ARROWAMPHO" + - "RAEMOJI MODIFIER FITZPATRICK TYPE-1-2EMOJI MODIFIER FITZPATRICK TYPE-3EM" + - "OJI MODIFIER FITZPATRICK TYPE-4EMOJI MODIFIER FITZPATRICK TYPE-5EMOJI MO") + ("" + - "DIFIER FITZPATRICK TYPE-6RATMOUSEOXWATER BUFFALOCOWTIGERLEOPARDRABBITCAT" + - "DRAGONCROCODILEWHALESNAILSNAKEHORSERAMGOATSHEEPMONKEYROOSTERCHICKENDOGPI" + - "GBOARELEPHANTOCTOPUSSPIRAL SHELLBUGANTHONEYBEELADY BEETLEFISHTROPICAL FI" + - "SHBLOWFISHTURTLEHATCHING CHICKBABY CHICKFRONT-FACING BABY CHICKBIRDPENGU" + - "INKOALAPOODLEDROMEDARY CAMELBACTRIAN CAMELDOLPHINMOUSE FACECOW FACETIGER" + - " FACERABBIT FACECAT FACEDRAGON FACESPOUTING WHALEHORSE FACEMONKEY FACEDO" + - "G FACEPIG FACEFROG FACEHAMSTER FACEWOLF FACEBEAR FACEPANDA FACEPIG NOSEP" + - "AW PRINTSCHIPMUNKEYESEYEEARNOSEMOUTHTONGUEWHITE UP POINTING BACKHAND IND" + - "EXWHITE DOWN POINTING BACKHAND INDEXWHITE LEFT POINTING BACKHAND INDEXWH" + - "ITE RIGHT POINTING BACKHAND INDEXFISTED HAND SIGNWAVING HAND SIGNOK HAND" + - " SIGNTHUMBS UP SIGNTHUMBS DOWN SIGNCLAPPING HANDS SIGNOPEN HANDS SIGNCRO" + - "WNWOMANS HATEYEGLASSESNECKTIET-SHIRTJEANSDRESSKIMONOBIKINIWOMANS CLOTHES" + - "PURSEHANDBAGPOUCHMANS SHOEATHLETIC SHOEHIGH-HEELED SHOEWOMANS SANDALWOMA" + - "NS BOOTSFOOTPRINTSBUST IN SILHOUETTEBUSTS IN SILHOUETTEBOYGIRLMANWOMANFA" + - "MILYMAN AND WOMAN HOLDING HANDSTWO MEN HOLDING HANDSTWO WOMEN HOLDING HA" + - "NDSPOLICE OFFICERWOMAN WITH BUNNY EARSBRIDE WITH VEILPERSON WITH BLOND H" + - "AIRMAN WITH GUA PI MAOMAN WITH TURBANOLDER MANOLDER WOMANBABYCONSTRUCTIO" + - "N WORKERPRINCESSJAPANESE OGREJAPANESE GOBLINGHOSTBABY ANGELEXTRATERRESTR" + - "IAL ALIENALIEN MONSTERIMPSKULLINFORMATION DESK PERSONGUARDSMANDANCERLIPS" + - "TICKNAIL POLISHFACE MASSAGEHAIRCUTBARBER POLESYRINGEPILLKISS MARKLOVE LE" + - "TTERRINGGEM STONEKISSBOUQUETCOUPLE WITH HEARTWEDDINGBEATING HEARTBROKEN " + - "HEARTTWO HEARTSSPARKLING HEARTGROWING HEARTHEART WITH ARROWBLUE HEARTGRE" + - "EN HEARTYELLOW HEARTPURPLE HEARTHEART WITH RIBBONREVOLVING HEARTSHEART D" + - "ECORATIONDIAMOND SHAPE WITH A DOT INSIDEELECTRIC LIGHT BULBANGER SYMBOLB" + - "OMBSLEEPING SYMBOLCOLLISION SYMBOLSPLASHING SWEAT SYMBOLDROPLETDASH SYMB" + - "OLPILE OF POOFLEXED BICEPSDIZZY SYMBOLSPEECH BALLOONTHOUGHT BALLOONWHITE" + - " FLOWERHUNDRED POINTS SYMBOLMONEY BAGCURRENCY EXCHANGEHEAVY DOLLAR SIGNC" + - "REDIT CARDBANKNOTE WITH YEN SIGNBANKNOTE WITH DOLLAR SIGNBANKNOTE WITH E" + - "URO SIGNBANKNOTE WITH POUND SIGNMONEY WITH WINGSCHART WITH UPWARDS TREND" + - " AND YEN SIGNSEATPERSONAL COMPUTERBRIEFCASEMINIDISCFLOPPY DISKOPTICAL DI" + - "SCDVDFILE FOLDEROPEN FILE FOLDERPAGE WITH CURLPAGE FACING UPCALENDARTEAR" + - "-OFF CALENDARCARD INDEXCHART WITH UPWARDS TRENDCHART WITH DOWNWARDS TREN" + - "DBAR CHARTCLIPBOARDPUSHPINROUND PUSHPINPAPERCLIPSTRAIGHT RULERTRIANGULAR" + - " RULERBOOKMARK TABSLEDGERNOTEBOOKNOTEBOOK WITH DECORATIVE COVERCLOSED BO" + - "OKOPEN BOOKGREEN BOOKBLUE BOOKORANGE BOOKBOOKSNAME BADGESCROLLMEMOTELEPH" + - "ONE RECEIVERPAGERFAX MACHINESATELLITE ANTENNAPUBLIC ADDRESS LOUDSPEAKERC" + - "HEERING MEGAPHONEOUTBOX TRAYINBOX TRAYPACKAGEE-MAIL SYMBOLINCOMING ENVEL" + - "OPEENVELOPE WITH DOWNWARDS ARROW ABOVECLOSED MAILBOX WITH LOWERED FLAGCL" + - "OSED MAILBOX WITH RAISED FLAGOPEN MAILBOX WITH RAISED FLAGOPEN MAILBOX W" + - "ITH LOWERED FLAGPOSTBOXPOSTAL HORNNEWSPAPERMOBILE PHONEMOBILE PHONE WITH" + - " RIGHTWARDS ARROW AT LEFTVIBRATION MODEMOBILE PHONE OFFNO MOBILE PHONESA" + - "NTENNA WITH BARSCAMERACAMERA WITH FLASHVIDEO CAMERATELEVISIONRADIOVIDEOC" + - "ASSETTEFILM PROJECTORPORTABLE STEREOPRAYER BEADSTWISTED RIGHTWARDS ARROW" + - "SCLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWSCLOCKWISE RIGHTWAR" + - "DS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAYCLOCKWISE DO" + - "WNWARDS AND UPWARDS OPEN CIRCLE ARROWSANTICLOCKWISE DOWNWARDS AND UPWARD" + - "S OPEN CIRCLE ARROWSLOW BRIGHTNESS SYMBOLHIGH BRIGHTNESS SYMBOLSPEAKER W" + - "ITH CANCELLATION STROKESPEAKERSPEAKER WITH ONE SOUND WAVESPEAKER WITH TH" + - "REE SOUND WAVESBATTERYELECTRIC PLUGLEFT-POINTING MAGNIFYING GLASSRIGHT-P" + - "OINTING MAGNIFYING GLASSLOCK WITH INK PENCLOSED LOCK WITH KEYKEYLOCKOPEN" + - " LOCKBELLBELL WITH CANCELLATION STROKEBOOKMARKLINK SYMBOLRADIO BUTTONBAC" + - "K WITH LEFTWARDS ARROW ABOVEEND WITH LEFTWARDS ARROW ABOVEON WITH EXCLAM" + - "ATION MARK WITH LEFT RIGHT ARROW ABOVESOON WITH RIGHTWARDS ARROW ABOVETO" + - "P WITH UPWARDS ARROW ABOVENO ONE UNDER EIGHTEEN SYMBOLKEYCAP TENINPUT SY" + - "MBOL FOR LATIN CAPITAL LETTERSINPUT SYMBOL FOR LATIN SMALL LETTERSINPUT " + - "SYMBOL FOR NUMBERSINPUT SYMBOL FOR SYMBOLSINPUT SYMBOL FOR LATIN LETTERS" + - "FIREELECTRIC TORCHWRENCHHAMMERNUT AND BOLTHOCHOPISTOLMICROSCOPETELESCOPE" + - "CRYSTAL BALLSIX POINTED STAR WITH MIDDLE DOTJAPANESE SYMBOL FOR BEGINNER" + - "TRIDENT EMBLEMBLACK SQUARE BUTTONWHITE SQUARE BUTTONLARGE RED CIRCLELARG" + - "E BLUE CIRCLELARGE ORANGE DIAMONDLARGE BLUE DIAMONDSMALL ORANGE DIAMONDS" + - "MALL BLUE DIAMONDUP-POINTING RED TRIANGLEDOWN-POINTING RED TRIANGLEUP-PO" + - "INTING SMALL RED TRIANGLEDOWN-POINTING SMALL RED TRIANGLELOWER RIGHT SHA" + - "DOWED WHITE CIRCLEUPPER RIGHT SHADOWED WHITE CIRCLECIRCLED CROSS POMMEEC" + - "ROSS POMMEE WITH HALF-CIRCLE BELOWCROSS POMMEENOTCHED LEFT SEMICIRCLE WI") + ("" + - "TH THREE DOTSNOTCHED RIGHT SEMICIRCLE WITH THREE DOTSSYMBOL FOR MARKS CH" + - "APTERWHITE LATIN CROSSHEAVY LATIN CROSSCELTIC CROSSOM SYMBOLDOVE OF PEAC" + - "EKAABAMOSQUESYNAGOGUEMENORAH WITH NINE BRANCHESBOWL OF HYGIEIACLOCK FACE" + - " ONE OCLOCKCLOCK FACE TWO OCLOCKCLOCK FACE THREE OCLOCKCLOCK FACE FOUR O" + - "CLOCKCLOCK FACE FIVE OCLOCKCLOCK FACE SIX OCLOCKCLOCK FACE SEVEN OCLOCKC" + - "LOCK FACE EIGHT OCLOCKCLOCK FACE NINE OCLOCKCLOCK FACE TEN OCLOCKCLOCK F" + - "ACE ELEVEN OCLOCKCLOCK FACE TWELVE OCLOCKCLOCK FACE ONE-THIRTYCLOCK FACE" + - " TWO-THIRTYCLOCK FACE THREE-THIRTYCLOCK FACE FOUR-THIRTYCLOCK FACE FIVE-" + - "THIRTYCLOCK FACE SIX-THIRTYCLOCK FACE SEVEN-THIRTYCLOCK FACE EIGHT-THIRT" + - "YCLOCK FACE NINE-THIRTYCLOCK FACE TEN-THIRTYCLOCK FACE ELEVEN-THIRTYCLOC" + - "K FACE TWELVE-THIRTYRIGHT SPEAKERRIGHT SPEAKER WITH ONE SOUND WAVERIGHT " + - "SPEAKER WITH THREE SOUND WAVESBULLHORNBULLHORN WITH SOUND WAVESRINGING B" + - "ELLBOOKCANDLEMANTELPIECE CLOCKBLACK SKULL AND CROSSBONESNO PIRACYHOLEMAN" + - " IN BUSINESS SUIT LEVITATINGSLEUTH OR SPYDARK SUNGLASSESSPIDERSPIDER WEB" + - "JOYSTICKMAN DANCINGLEFT HAND TELEPHONE RECEIVERTELEPHONE RECEIVER WITH P" + - "AGERIGHT HAND TELEPHONE RECEIVERWHITE TOUCHTONE TELEPHONEBLACK TOUCHTONE" + - " TELEPHONETELEPHONE ON TOP OF MODEMCLAMSHELL MOBILE PHONEBACK OF ENVELOP" + - "ESTAMPED ENVELOPEENVELOPE WITH LIGHTNINGFLYING ENVELOPEPEN OVER STAMPED " + - "ENVELOPELINKED PAPERCLIPSBLACK PUSHPINLOWER LEFT PENCILLOWER LEFT BALLPO" + - "INT PENLOWER LEFT FOUNTAIN PENLOWER LEFT PAINTBRUSHLOWER LEFT CRAYONLEFT" + - " WRITING HANDTURNED OK HAND SIGNRAISED HAND WITH FINGERS SPLAYEDREVERSED" + - " RAISED HAND WITH FINGERS SPLAYEDREVERSED THUMBS UP SIGNREVERSED THUMBS " + - "DOWN SIGNREVERSED VICTORY HANDREVERSED HAND WITH MIDDLE FINGER EXTENDEDR" + - "AISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERSWHITE DOWN POINTING " + - "LEFT HAND INDEXSIDEWAYS WHITE LEFT POINTING INDEXSIDEWAYS WHITE RIGHT PO" + - "INTING INDEXSIDEWAYS BLACK LEFT POINTING INDEXSIDEWAYS BLACK RIGHT POINT" + - "ING INDEXBLACK LEFT POINTING BACKHAND INDEXBLACK RIGHT POINTING BACKHAND" + - " INDEXSIDEWAYS WHITE UP POINTING INDEXSIDEWAYS WHITE DOWN POINTING INDEX" + - "SIDEWAYS BLACK UP POINTING INDEXSIDEWAYS BLACK DOWN POINTING INDEXBLACK " + - "UP POINTING BACKHAND INDEXBLACK DOWN POINTING BACKHAND INDEXBLACK HEARTD" + - "ESKTOP COMPUTERKEYBOARD AND MOUSETHREE NETWORKED COMPUTERSPRINTERPOCKET " + - "CALCULATORBLACK HARD SHELL FLOPPY DISKWHITE HARD SHELL FLOPPY DISKSOFT S" + - "HELL FLOPPY DISKTAPE CARTRIDGEWIRED KEYBOARDONE BUTTON MOUSETWO BUTTON M" + - "OUSETHREE BUTTON MOUSETRACKBALLOLD PERSONAL COMPUTERHARD DISKSCREENPRINT" + - "ER ICONFAX ICONOPTICAL DISC ICONDOCUMENT WITH TEXTDOCUMENT WITH TEXT AND" + - " PICTUREDOCUMENT WITH PICTUREFRAME WITH PICTUREFRAME WITH TILESFRAME WIT" + - "H AN XBLACK FOLDERFOLDEROPEN FOLDERCARD INDEX DIVIDERSCARD FILE BOXFILE " + - "CABINETEMPTY NOTEEMPTY NOTE PAGEEMPTY NOTE PADNOTENOTE PAGENOTE PADEMPTY" + - " DOCUMENTEMPTY PAGEEMPTY PAGESDOCUMENTPAGEPAGESWASTEBASKETSPIRAL NOTE PA" + - "DSPIRAL CALENDAR PADDESKTOP WINDOWMINIMIZEMAXIMIZEOVERLAPCLOCKWISE RIGHT" + - " AND LEFT SEMICIRCLE ARROWSCANCELLATION XINCREASE FONT SIZE SYMBOLDECREA" + - "SE FONT SIZE SYMBOLCOMPRESSIONOLD KEYROLLED-UP NEWSPAPERPAGE WITH CIRCLE" + - "D TEXTSTOCK CHARTDAGGER KNIFELIPSSPEAKING HEAD IN SILHOUETTETHREE RAYS A" + - "BOVETHREE RAYS BELOWTHREE RAYS LEFTTHREE RAYS RIGHTLEFT SPEECH BUBBLERIG" + - "HT SPEECH BUBBLETWO SPEECH BUBBLESTHREE SPEECH BUBBLESLEFT THOUGHT BUBBL" + - "ERIGHT THOUGHT BUBBLELEFT ANGER BUBBLERIGHT ANGER BUBBLEMOOD BUBBLELIGHT" + - "NING MOOD BUBBLELIGHTNING MOODBALLOT BOX WITH BALLOTBALLOT SCRIPT XBALLO" + - "T BOX WITH SCRIPT XBALLOT BOLD SCRIPT XBALLOT BOX WITH BOLD SCRIPT XLIGH" + - "T CHECK MARKBALLOT BOX WITH BOLD CHECKWORLD MAPMOUNT FUJITOKYO TOWERSTAT" + - "UE OF LIBERTYSILHOUETTE OF JAPANMOYAIGRINNING FACEGRINNING FACE WITH SMI" + - "LING EYESFACE WITH TEARS OF JOYSMILING FACE WITH OPEN MOUTHSMILING FACE " + - "WITH OPEN MOUTH AND SMILING EYESSMILING FACE WITH OPEN MOUTH AND COLD SW" + - "EATSMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYESSMILING FACE WITH" + - " HALOSMILING FACE WITH HORNSWINKING FACESMILING FACE WITH SMILING EYESFA" + - "CE SAVOURING DELICIOUS FOODRELIEVED FACESMILING FACE WITH HEART-SHAPED E" + - "YESSMILING FACE WITH SUNGLASSESSMIRKING FACENEUTRAL FACEEXPRESSIONLESS F" + - "ACEUNAMUSED FACEFACE WITH COLD SWEATPENSIVE FACECONFUSED FACECONFOUNDED " + - "FACEKISSING FACEFACE THROWING A KISSKISSING FACE WITH SMILING EYESKISSIN" + - "G FACE WITH CLOSED EYESFACE WITH STUCK-OUT TONGUEFACE WITH STUCK-OUT TON" + - "GUE AND WINKING EYEFACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYESDIS" + - "APPOINTED FACEWORRIED FACEANGRY FACEPOUTING FACECRYING FACEPERSEVERING F" + - "ACEFACE WITH LOOK OF TRIUMPHDISAPPOINTED BUT RELIEVED FACEFROWNING FACE " + - "WITH OPEN MOUTHANGUISHED FACEFEARFUL FACEWEARY FACESLEEPY FACETIRED FACE" + - "GRIMACING FACELOUDLY CRYING FACEFACE WITH OPEN MOUTHHUSHED FACEFACE WITH") + ("" + - " OPEN MOUTH AND COLD SWEATFACE SCREAMING IN FEARASTONISHED FACEFLUSHED F" + - "ACESLEEPING FACEDIZZY FACEFACE WITHOUT MOUTHFACE WITH MEDICAL MASKGRINNI" + - "NG CAT FACE WITH SMILING EYESCAT FACE WITH TEARS OF JOYSMILING CAT FACE " + - "WITH OPEN MOUTHSMILING CAT FACE WITH HEART-SHAPED EYESCAT FACE WITH WRY " + - "SMILEKISSING CAT FACE WITH CLOSED EYESPOUTING CAT FACECRYING CAT FACEWEA" + - "RY CAT FACESLIGHTLY FROWNING FACESLIGHTLY SMILING FACEUPSIDE-DOWN FACEFA" + - "CE WITH ROLLING EYESFACE WITH NO GOOD GESTUREFACE WITH OK GESTUREPERSON " + - "BOWING DEEPLYSEE-NO-EVIL MONKEYHEAR-NO-EVIL MONKEYSPEAK-NO-EVIL MONKEYHA" + - "PPY PERSON RAISING ONE HANDPERSON RAISING BOTH HANDS IN CELEBRATIONPERSO" + - "N FROWNINGPERSON WITH POUTING FACEPERSON WITH FOLDED HANDSNORTH WEST POI" + - "NTING LEAFSOUTH WEST POINTING LEAFNORTH EAST POINTING LEAFSOUTH EAST POI" + - "NTING LEAFTURNED NORTH WEST POINTING LEAFTURNED SOUTH WEST POINTING LEAF" + - "TURNED NORTH EAST POINTING LEAFTURNED SOUTH EAST POINTING LEAFNORTH WEST" + - " POINTING VINE LEAFSOUTH WEST POINTING VINE LEAFNORTH EAST POINTING VINE" + - " LEAFSOUTH EAST POINTING VINE LEAFHEAVY NORTH WEST POINTING VINE LEAFHEA" + - "VY SOUTH WEST POINTING VINE LEAFHEAVY NORTH EAST POINTING VINE LEAFHEAVY" + - " SOUTH EAST POINTING VINE LEAFNORTH WEST POINTING BUDSOUTH WEST POINTING" + - " BUDNORTH EAST POINTING BUDSOUTH EAST POINTING BUDHEAVY NORTH WEST POINT" + - "ING BUDHEAVY SOUTH WEST POINTING BUDHEAVY NORTH EAST POINTING BUDHEAVY S" + - "OUTH EAST POINTING BUDHOLLOW QUILT SQUARE ORNAMENTHOLLOW QUILT SQUARE OR" + - "NAMENT IN BLACK SQUARESOLID QUILT SQUARE ORNAMENTSOLID QUILT SQUARE ORNA" + - "MENT IN BLACK SQUARELEFTWARDS ROCKETUPWARDS ROCKETRIGHTWARDS ROCKETDOWNW" + - "ARDS ROCKETSCRIPT LIGATURE ET ORNAMENTHEAVY SCRIPT LIGATURE ET ORNAMENTL" + - "IGATURE OPEN ET ORNAMENTHEAVY LIGATURE OPEN ET ORNAMENTHEAVY AMPERSAND O" + - "RNAMENTSWASH AMPERSAND ORNAMENTSANS-SERIF HEAVY DOUBLE TURNED COMMA QUOT" + - "ATION MARK ORNAMENTSANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT" + - "SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENTHEAVY INTERROBA" + - "NG ORNAMENTSANS-SERIF INTERROBANG ORNAMENTHEAVY SANS-SERIF INTERROBANG O" + - "RNAMENTVERY HEAVY SOLIDUSVERY HEAVY REVERSE SOLIDUSCHECKER BOARDREVERSE " + - "CHECKER BOARDROCKETHELICOPTERSTEAM LOCOMOTIVERAILWAY CARHIGH-SPEED TRAIN" + - "HIGH-SPEED TRAIN WITH BULLET NOSETRAINMETROLIGHT RAILSTATIONTRAMTRAM CAR" + - "BUSONCOMING BUSTROLLEYBUSBUS STOPMINIBUSAMBULANCEFIRE ENGINEPOLICE CARON" + - "COMING POLICE CARTAXIONCOMING TAXIAUTOMOBILEONCOMING AUTOMOBILERECREATIO" + - "NAL VEHICLEDELIVERY TRUCKARTICULATED LORRYTRACTORMONORAILMOUNTAIN RAILWA" + - "YSUSPENSION RAILWAYMOUNTAIN CABLEWAYAERIAL TRAMWAYSHIPROWBOATSPEEDBOATHO" + - "RIZONTAL TRAFFIC LIGHTVERTICAL TRAFFIC LIGHTCONSTRUCTION SIGNPOLICE CARS" + - " REVOLVING LIGHTTRIANGULAR FLAG ON POSTDOORNO ENTRY SIGNSMOKING SYMBOLNO" + - " SMOKING SYMBOLPUT LITTER IN ITS PLACE SYMBOLDO NOT LITTER SYMBOLPOTABLE" + - " WATER SYMBOLNON-POTABLE WATER SYMBOLBICYCLENO BICYCLESBICYCLISTMOUNTAIN" + - " BICYCLISTPEDESTRIANNO PEDESTRIANSCHILDREN CROSSINGMENS SYMBOLWOMENS SYM" + - "BOLRESTROOMBABY SYMBOLTOILETWATER CLOSETSHOWERBATHBATHTUBPASSPORT CONTRO" + - "LCUSTOMSBAGGAGE CLAIMLEFT LUGGAGETRIANGLE WITH ROUNDED CORNERSPROHIBITED" + - " SIGNCIRCLED INFORMATION SOURCEBOYS SYMBOLGIRLS SYMBOLCOUCH AND LAMPSLEE" + - "PING ACCOMMODATIONSHOPPING BAGSBELLHOP BELLBEDPLACE OF WORSHIPOCTAGONAL " + - "SIGNSHOPPING TROLLEYHAMMER AND WRENCHSHIELDOIL DRUMMOTORWAYRAILWAY TRACK" + - "MOTOR BOATUP-POINTING MILITARY AIRPLANEUP-POINTING AIRPLANEUP-POINTING S" + - "MALL AIRPLANESMALL AIRPLANENORTHEAST-POINTING AIRPLANEAIRPLANE DEPARTURE" + - "AIRPLANE ARRIVINGSATELLITEONCOMING FIRE ENGINEDIESEL LOCOMOTIVEPASSENGER" + - " SHIPSCOOTERMOTOR SCOOTERCANOEALCHEMICAL SYMBOL FOR QUINTESSENCEALCHEMIC" + - "AL SYMBOL FOR AIRALCHEMICAL SYMBOL FOR FIREALCHEMICAL SYMBOL FOR EARTHAL" + - "CHEMICAL SYMBOL FOR WATERALCHEMICAL SYMBOL FOR AQUAFORTISALCHEMICAL SYMB" + - "OL FOR AQUA REGIAALCHEMICAL SYMBOL FOR AQUA REGIA-2ALCHEMICAL SYMBOL FOR" + - " AQUA VITAEALCHEMICAL SYMBOL FOR AQUA VITAE-2ALCHEMICAL SYMBOL FOR VINEG" + - "ARALCHEMICAL SYMBOL FOR VINEGAR-2ALCHEMICAL SYMBOL FOR VINEGAR-3ALCHEMIC" + - "AL SYMBOL FOR SULFURALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFURALCHEMICAL " + - "SYMBOL FOR BLACK SULFURALCHEMICAL SYMBOL FOR MERCURY SUBLIMATEALCHEMICAL" + - " SYMBOL FOR MERCURY SUBLIMATE-2ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3" + - "ALCHEMICAL SYMBOL FOR CINNABARALCHEMICAL SYMBOL FOR SALTALCHEMICAL SYMBO" + - "L FOR NITREALCHEMICAL SYMBOL FOR VITRIOLALCHEMICAL SYMBOL FOR VITRIOL-2A" + - "LCHEMICAL SYMBOL FOR ROCK SALTALCHEMICAL SYMBOL FOR ROCK SALT-2ALCHEMICA" + - "L SYMBOL FOR GOLDALCHEMICAL SYMBOL FOR SILVERALCHEMICAL SYMBOL FOR IRON " + - "OREALCHEMICAL SYMBOL FOR IRON ORE-2ALCHEMICAL SYMBOL FOR CROCUS OF IRONA" + - "LCHEMICAL SYMBOL FOR REGULUS OF IRONALCHEMICAL SYMBOL FOR COPPER OREALCH" + - "EMICAL SYMBOL FOR IRON-COPPER OREALCHEMICAL SYMBOL FOR SUBLIMATE OF COPP") + ("" + - "ERALCHEMICAL SYMBOL FOR CROCUS OF COPPERALCHEMICAL SYMBOL FOR CROCUS OF " + - "COPPER-2ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATEALCHEMICAL SYMBOL FOR SA" + - "LT OF COPPER ANTIMONIATEALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPE" + - "RALCHEMICAL SYMBOL FOR VERDIGRISALCHEMICAL SYMBOL FOR TIN OREALCHEMICAL " + - "SYMBOL FOR LEAD OREALCHEMICAL SYMBOL FOR ANTIMONY OREALCHEMICAL SYMBOL F" + - "OR SUBLIMATE OF ANTIMONYALCHEMICAL SYMBOL FOR SALT OF ANTIMONYALCHEMICAL" + - " SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONYALCHEMICAL SYMBOL FOR VINEGAR O" + - "F ANTIMONYALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONYALCHEMICAL SYMBOL FOR" + - " REGULUS OF ANTIMONY-2ALCHEMICAL SYMBOL FOR REGULUSALCHEMICAL SYMBOL FOR" + - " REGULUS-2ALCHEMICAL SYMBOL FOR REGULUS-3ALCHEMICAL SYMBOL FOR REGULUS-4" + - "ALCHEMICAL SYMBOL FOR ALKALIALCHEMICAL SYMBOL FOR ALKALI-2ALCHEMICAL SYM" + - "BOL FOR MARCASITEALCHEMICAL SYMBOL FOR SAL-AMMONIACALCHEMICAL SYMBOL FOR" + - " ARSENICALCHEMICAL SYMBOL FOR REALGARALCHEMICAL SYMBOL FOR REALGAR-2ALCH" + - "EMICAL SYMBOL FOR AURIPIGMENTALCHEMICAL SYMBOL FOR BISMUTH OREALCHEMICAL" + - " SYMBOL FOR TARTARALCHEMICAL SYMBOL FOR TARTAR-2ALCHEMICAL SYMBOL FOR QU" + - "ICK LIMEALCHEMICAL SYMBOL FOR BORAXALCHEMICAL SYMBOL FOR BORAX-2ALCHEMIC" + - "AL SYMBOL FOR BORAX-3ALCHEMICAL SYMBOL FOR ALUMALCHEMICAL SYMBOL FOR OIL" + - "ALCHEMICAL SYMBOL FOR SPIRITALCHEMICAL SYMBOL FOR TINCTUREALCHEMICAL SYM" + - "BOL FOR GUMALCHEMICAL SYMBOL FOR WAXALCHEMICAL SYMBOL FOR POWDERALCHEMIC" + - "AL SYMBOL FOR CALXALCHEMICAL SYMBOL FOR TUTTYALCHEMICAL SYMBOL FOR CAPUT" + - " MORTUUMALCHEMICAL SYMBOL FOR SCEPTER OF JOVEALCHEMICAL SYMBOL FOR CADUC" + - "EUSALCHEMICAL SYMBOL FOR TRIDENTALCHEMICAL SYMBOL FOR STARRED TRIDENTALC" + - "HEMICAL SYMBOL FOR LODESTONEALCHEMICAL SYMBOL FOR SOAPALCHEMICAL SYMBOL " + - "FOR URINEALCHEMICAL SYMBOL FOR HORSE DUNGALCHEMICAL SYMBOL FOR ASHESALCH" + - "EMICAL SYMBOL FOR POT ASHESALCHEMICAL SYMBOL FOR BRICKALCHEMICAL SYMBOL " + - "FOR POWDERED BRICKALCHEMICAL SYMBOL FOR AMALGAMALCHEMICAL SYMBOL FOR STR" + - "ATUM SUPER STRATUMALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2ALCHEMICA" + - "L SYMBOL FOR SUBLIMATIONALCHEMICAL SYMBOL FOR PRECIPITATEALCHEMICAL SYMB" + - "OL FOR DISTILLALCHEMICAL SYMBOL FOR DISSOLVEALCHEMICAL SYMBOL FOR DISSOL" + - "VE-2ALCHEMICAL SYMBOL FOR PURIFYALCHEMICAL SYMBOL FOR PUTREFACTIONALCHEM" + - "ICAL SYMBOL FOR CRUCIBLEALCHEMICAL SYMBOL FOR CRUCIBLE-2ALCHEMICAL SYMBO" + - "L FOR CRUCIBLE-3ALCHEMICAL SYMBOL FOR CRUCIBLE-4ALCHEMICAL SYMBOL FOR CR" + - "UCIBLE-5ALCHEMICAL SYMBOL FOR ALEMBICALCHEMICAL SYMBOL FOR BATH OF MARYA" + - "LCHEMICAL SYMBOL FOR BATH OF VAPOURSALCHEMICAL SYMBOL FOR RETORTALCHEMIC" + - "AL SYMBOL FOR HOURALCHEMICAL SYMBOL FOR NIGHTALCHEMICAL SYMBOL FOR DAY-N" + - "IGHTALCHEMICAL SYMBOL FOR MONTHALCHEMICAL SYMBOL FOR HALF DRAMALCHEMICAL" + - " SYMBOL FOR HALF OUNCEBLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLEBLACK " + - "UP-POINTING ISOSCELES RIGHT TRIANGLEBLACK RIGHT-POINTING ISOSCELES RIGHT" + - " TRIANGLEBLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLEBLACK SLIGHTLY SMAL" + - "L CIRCLEMEDIUM BOLD WHITE CIRCLEBOLD WHITE CIRCLEHEAVY WHITE CIRCLEVERY " + - "HEAVY WHITE CIRCLEEXTREMELY HEAVY WHITE CIRCLEWHITE CIRCLE CONTAINING BL" + - "ACK SMALL CIRCLEROUND TARGETBLACK TINY SQUAREBLACK SLIGHTLY SMALL SQUARE" + - "LIGHT WHITE SQUAREMEDIUM WHITE SQUAREBOLD WHITE SQUAREHEAVY WHITE SQUARE" + - "VERY HEAVY WHITE SQUAREEXTREMELY HEAVY WHITE SQUAREWHITE SQUARE CONTAINI" + - "NG BLACK VERY SMALL SQUAREWHITE SQUARE CONTAINING BLACK MEDIUM SQUARESQU" + - "ARE TARGETBLACK TINY DIAMONDBLACK VERY SMALL DIAMONDBLACK MEDIUM SMALL D" + - "IAMONDWHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMONDWHITE DIAMOND CON" + - "TAINING BLACK MEDIUM DIAMONDDIAMOND TARGETBLACK TINY LOZENGEBLACK VERY S" + - "MALL LOZENGEBLACK MEDIUM SMALL LOZENGEWHITE LOZENGE CONTAINING BLACK SMA" + - "LL LOZENGETHIN GREEK CROSSLIGHT GREEK CROSSMEDIUM GREEK CROSSBOLD GREEK " + - "CROSSVERY BOLD GREEK CROSSVERY HEAVY GREEK CROSSEXTREMELY HEAVY GREEK CR" + - "OSSTHIN SALTIRELIGHT SALTIREMEDIUM SALTIREBOLD SALTIREHEAVY SALTIREVERY " + - "HEAVY SALTIREEXTREMELY HEAVY SALTIRELIGHT FIVE SPOKED ASTERISKMEDIUM FIV" + - "E SPOKED ASTERISKBOLD FIVE SPOKED ASTERISKHEAVY FIVE SPOKED ASTERISKVERY" + - " HEAVY FIVE SPOKED ASTERISKEXTREMELY HEAVY FIVE SPOKED ASTERISKLIGHT SIX" + - " SPOKED ASTERISKMEDIUM SIX SPOKED ASTERISKBOLD SIX SPOKED ASTERISKHEAVY " + - "SIX SPOKED ASTERISKVERY HEAVY SIX SPOKED ASTERISKEXTREMELY HEAVY SIX SPO" + - "KED ASTERISKLIGHT EIGHT SPOKED ASTERISKMEDIUM EIGHT SPOKED ASTERISKBOLD " + - "EIGHT SPOKED ASTERISKHEAVY EIGHT SPOKED ASTERISKVERY HEAVY EIGHT SPOKED " + - "ASTERISKLIGHT THREE POINTED BLACK STARMEDIUM THREE POINTED BLACK STARTHR" + - "EE POINTED BLACK STARMEDIUM THREE POINTED PINWHEEL STARLIGHT FOUR POINTE" + - "D BLACK STARMEDIUM FOUR POINTED BLACK STARFOUR POINTED BLACK STARMEDIUM " + - "FOUR POINTED PINWHEEL STARREVERSE LIGHT FOUR POINTED PINWHEEL STARLIGHT " + - "FIVE POINTED BLACK STARHEAVY FIVE POINTED BLACK STARMEDIUM SIX POINTED B") + ("" + - "LACK STARHEAVY SIX POINTED BLACK STARSIX POINTED PINWHEEL STARMEDIUM EIG" + - "HT POINTED BLACK STARHEAVY EIGHT POINTED BLACK STARVERY HEAVY EIGHT POIN" + - "TED BLACK STARHEAVY EIGHT POINTED PINWHEEL STARLIGHT TWELVE POINTED BLAC" + - "K STARHEAVY TWELVE POINTED BLACK STARHEAVY TWELVE POINTED PINWHEEL STARL" + - "EFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEADUPWARDS ARROW WITH SMALL TRI" + - "ANGLE ARROWHEADRIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEADDOWNWARDS A" + - "RROW WITH SMALL TRIANGLE ARROWHEADLEFTWARDS ARROW WITH MEDIUM TRIANGLE A" + - "RROWHEADUPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEADRIGHTWARDS ARROW WIT" + - "H MEDIUM TRIANGLE ARROWHEADDOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEA" + - "DLEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEADUPWARDS ARROW WITH LARGE T" + - "RIANGLE ARROWHEADRIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEADDOWNWARDS" + - " ARROW WITH LARGE TRIANGLE ARROWHEADLEFTWARDS ARROW WITH SMALL EQUILATER" + - "AL ARROWHEADUPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEADRIGHTWARDS ARR" + - "OW WITH SMALL EQUILATERAL ARROWHEADDOWNWARDS ARROW WITH SMALL EQUILATERA" + - "L ARROWHEADLEFTWARDS ARROW WITH EQUILATERAL ARROWHEADUPWARDS ARROW WITH " + - "EQUILATERAL ARROWHEADRIGHTWARDS ARROW WITH EQUILATERAL ARROWHEADDOWNWARD" + - "S ARROW WITH EQUILATERAL ARROWHEADHEAVY LEFTWARDS ARROW WITH EQUILATERAL" + - " ARROWHEADHEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEADHEAVY RIGHTWARDS" + - " ARROW WITH EQUILATERAL ARROWHEADHEAVY DOWNWARDS ARROW WITH EQUILATERAL " + - "ARROWHEADHEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEADHEAVY UPW" + - "ARDS ARROW WITH LARGE EQUILATERAL ARROWHEADHEAVY RIGHTWARDS ARROW WITH L" + - "ARGE EQUILATERAL ARROWHEADHEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL A" + - "RROWHEADLEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFTUPWARDS TRIANGL" + - "E-HEADED ARROW WITH NARROW SHAFTRIGHTWARDS TRIANGLE-HEADED ARROW WITH NA" + - "RROW SHAFTDOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFTLEFTWARDS TRI" + - "ANGLE-HEADED ARROW WITH MEDIUM SHAFTUPWARDS TRIANGLE-HEADED ARROW WITH M" + - "EDIUM SHAFTRIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFTDOWNWARDS T" + - "RIANGLE-HEADED ARROW WITH MEDIUM SHAFTLEFTWARDS TRIANGLE-HEADED ARROW WI" + - "TH BOLD SHAFTUPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFTRIGHTWARDS TRI" + - "ANGLE-HEADED ARROW WITH BOLD SHAFTDOWNWARDS TRIANGLE-HEADED ARROW WITH B" + - "OLD SHAFTLEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFTUPWARDS TRIANGL" + - "E-HEADED ARROW WITH HEAVY SHAFTRIGHTWARDS TRIANGLE-HEADED ARROW WITH HEA" + - "VY SHAFTDOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFTLEFTWARDS TRIANG" + - "LE-HEADED ARROW WITH VERY HEAVY SHAFTUPWARDS TRIANGLE-HEADED ARROW WITH " + - "VERY HEAVY SHAFTRIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFTDO" + - "WNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFTLEFTWARDS FINGER-POST" + - " ARROWUPWARDS FINGER-POST ARROWRIGHTWARDS FINGER-POST ARROWDOWNWARDS FIN" + - "GER-POST ARROWLEFTWARDS SQUARED ARROWUPWARDS SQUARED ARROWRIGHTWARDS SQU" + - "ARED ARROWDOWNWARDS SQUARED ARROWLEFTWARDS COMPRESSED ARROWUPWARDS COMPR" + - "ESSED ARROWRIGHTWARDS COMPRESSED ARROWDOWNWARDS COMPRESSED ARROWLEFTWARD" + - "S HEAVY COMPRESSED ARROWUPWARDS HEAVY COMPRESSED ARROWRIGHTWARDS HEAVY C" + - "OMPRESSED ARROWDOWNWARDS HEAVY COMPRESSED ARROWLEFTWARDS HEAVY ARROWUPWA" + - "RDS HEAVY ARROWRIGHTWARDS HEAVY ARROWDOWNWARDS HEAVY ARROWLEFTWARDS SANS" + - "-SERIF ARROWUPWARDS SANS-SERIF ARROWRIGHTWARDS SANS-SERIF ARROWDOWNWARDS" + - " SANS-SERIF ARROWNORTH WEST SANS-SERIF ARROWNORTH EAST SANS-SERIF ARROWS" + - "OUTH EAST SANS-SERIF ARROWSOUTH WEST SANS-SERIF ARROWLEFT RIGHT SANS-SER" + - "IF ARROWUP DOWN SANS-SERIF ARROWWIDE-HEADED LEFTWARDS LIGHT BARB ARROWWI" + - "DE-HEADED UPWARDS LIGHT BARB ARROWWIDE-HEADED RIGHTWARDS LIGHT BARB ARRO" + - "WWIDE-HEADED DOWNWARDS LIGHT BARB ARROWWIDE-HEADED NORTH WEST LIGHT BARB" + - " ARROWWIDE-HEADED NORTH EAST LIGHT BARB ARROWWIDE-HEADED SOUTH EAST LIGH" + - "T BARB ARROWWIDE-HEADED SOUTH WEST LIGHT BARB ARROWWIDE-HEADED LEFTWARDS" + - " BARB ARROWWIDE-HEADED UPWARDS BARB ARROWWIDE-HEADED RIGHTWARDS BARB ARR" + - "OWWIDE-HEADED DOWNWARDS BARB ARROWWIDE-HEADED NORTH WEST BARB ARROWWIDE-" + - "HEADED NORTH EAST BARB ARROWWIDE-HEADED SOUTH EAST BARB ARROWWIDE-HEADED" + - " SOUTH WEST BARB ARROWWIDE-HEADED LEFTWARDS MEDIUM BARB ARROWWIDE-HEADED" + - " UPWARDS MEDIUM BARB ARROWWIDE-HEADED RIGHTWARDS MEDIUM BARB ARROWWIDE-H" + - "EADED DOWNWARDS MEDIUM BARB ARROWWIDE-HEADED NORTH WEST MEDIUM BARB ARRO" + - "WWIDE-HEADED NORTH EAST MEDIUM BARB ARROWWIDE-HEADED SOUTH EAST MEDIUM B" + - "ARB ARROWWIDE-HEADED SOUTH WEST MEDIUM BARB ARROWWIDE-HEADED LEFTWARDS H" + - "EAVY BARB ARROWWIDE-HEADED UPWARDS HEAVY BARB ARROWWIDE-HEADED RIGHTWARD" + - "S HEAVY BARB ARROWWIDE-HEADED DOWNWARDS HEAVY BARB ARROWWIDE-HEADED NORT" + - "H WEST HEAVY BARB ARROWWIDE-HEADED NORTH EAST HEAVY BARB ARROWWIDE-HEADE" + - "D SOUTH EAST HEAVY BARB ARROWWIDE-HEADED SOUTH WEST HEAVY BARB ARROWWIDE" + - "-HEADED LEFTWARDS VERY HEAVY BARB ARROWWIDE-HEADED UPWARDS VERY HEAVY BA") + ("" + - "RB ARROWWIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROWWIDE-HEADED DOWNWARD" + - "S VERY HEAVY BARB ARROWWIDE-HEADED NORTH WEST VERY HEAVY BARB ARROWWIDE-" + - "HEADED NORTH EAST VERY HEAVY BARB ARROWWIDE-HEADED SOUTH EAST VERY HEAVY" + - " BARB ARROWWIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROWLEFTWARDS TRIANGL" + - "E ARROWHEADUPWARDS TRIANGLE ARROWHEADRIGHTWARDS TRIANGLE ARROWHEADDOWNWA" + - "RDS TRIANGLE ARROWHEADLEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEADUPW" + - "ARDS WHITE ARROW WITHIN TRIANGLE ARROWHEADRIGHTWARDS WHITE ARROW WITHIN " + - "TRIANGLE ARROWHEADDOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEADLEFTWAR" + - "DS ARROW WITH NOTCHED TAILUPWARDS ARROW WITH NOTCHED TAILRIGHTWARDS ARRO" + - "W WITH NOTCHED TAILDOWNWARDS ARROW WITH NOTCHED TAILHEAVY ARROW SHAFT WI" + - "DTH ONEHEAVY ARROW SHAFT WIDTH TWO THIRDSHEAVY ARROW SHAFT WIDTH ONE HAL" + - "FHEAVY ARROW SHAFT WIDTH ONE THIRDLEFTWARDS BOTTOM-SHADED WHITE ARROWRIG" + - "HTWARDS BOTTOM SHADED WHITE ARROWLEFTWARDS TOP SHADED WHITE ARROWRIGHTWA" + - "RDS TOP SHADED WHITE ARROWLEFTWARDS LEFT-SHADED WHITE ARROWRIGHTWARDS RI" + - "GHT-SHADED WHITE ARROWLEFTWARDS RIGHT-SHADED WHITE ARROWRIGHTWARDS LEFT-" + - "SHADED WHITE ARROWLEFTWARDS BACK-TILTED SHADOWED WHITE ARROWRIGHTWARDS B" + - "ACK-TILTED SHADOWED WHITE ARROWLEFTWARDS FRONT-TILTED SHADOWED WHITE ARR" + - "OWRIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROWWHITE ARROW SHAFT WIDTH ON" + - "EWHITE ARROW SHAFT WIDTH TWO THIRDSZIPPER-MOUTH FACEMONEY-MOUTH FACEFACE" + - " WITH THERMOMETERNERD FACETHINKING FACEFACE WITH HEAD-BANDAGEROBOT FACEH" + - "UGGING FACESIGN OF THE HORNSCALL ME HANDRAISED BACK OF HANDLEFT-FACING F" + - "ISTRIGHT-FACING FISTHANDSHAKEHAND WITH INDEX AND MIDDLE FINGERS CROSSEDF" + - "ACE WITH COWBOY HATCLOWN FACENAUSEATED FACEROLLING ON THE FLOOR LAUGHING" + - "DROOLING FACELYING FACEFACE PALMSNEEZING FACEPREGNANT WOMANSELFIEPRINCEM" + - "AN IN TUXEDOMOTHER CHRISTMASSHRUGPERSON DOING CARTWHEELJUGGLINGFENCERMOD" + - "ERN PENTATHLONWRESTLERSWATER POLOHANDBALLWILTED FLOWERDRUM WITH DRUMSTIC" + - "KSCLINKING GLASSESTUMBLER GLASSSPOONGOAL NETRIFLEFIRST PLACE MEDALSECOND" + - " PLACE MEDALTHIRD PLACE MEDALBOXING GLOVEMARTIAL ARTS UNIFORMCROISSANTAV" + - "OCADOCUCUMBERBACONPOTATOCARROTBAGUETTE BREADGREEN SALADSHALLOW PAN OF FO" + - "ODSTUFFED FLATBREADEGGGLASS OF MILKPEANUTSKIWIFRUITPANCAKESCRABLION FACE" + - "SCORPIONTURKEYUNICORN FACEEAGLEDUCKBATSHARKOWLFOX FACEBUTTERFLYDEERGORIL" + - "LALIZARDRHINOCEROSSHRIMPSQUIDCHEESE WEDGECJK COMPATIBILITY IDEOGRAPH-2F8" + - "00CJK COMPATIBILITY IDEOGRAPH-2F801CJK COMPATIBILITY IDEOGRAPH-2F802CJK " + - "COMPATIBILITY IDEOGRAPH-2F803CJK COMPATIBILITY IDEOGRAPH-2F804CJK COMPAT" + - "IBILITY IDEOGRAPH-2F805CJK COMPATIBILITY IDEOGRAPH-2F806CJK COMPATIBILIT" + - "Y IDEOGRAPH-2F807CJK COMPATIBILITY IDEOGRAPH-2F808CJK COMPATIBILITY IDEO" + - "GRAPH-2F809CJK COMPATIBILITY IDEOGRAPH-2F80ACJK COMPATIBILITY IDEOGRAPH-" + - "2F80BCJK COMPATIBILITY IDEOGRAPH-2F80CCJK COMPATIBILITY IDEOGRAPH-2F80DC" + - "JK COMPATIBILITY IDEOGRAPH-2F80ECJK COMPATIBILITY IDEOGRAPH-2F80FCJK COM" + - "PATIBILITY IDEOGRAPH-2F810CJK COMPATIBILITY IDEOGRAPH-2F811CJK COMPATIBI" + - "LITY IDEOGRAPH-2F812CJK COMPATIBILITY IDEOGRAPH-2F813CJK COMPATIBILITY I" + - "DEOGRAPH-2F814CJK COMPATIBILITY IDEOGRAPH-2F815CJK COMPATIBILITY IDEOGRA" + - "PH-2F816CJK COMPATIBILITY IDEOGRAPH-2F817CJK COMPATIBILITY IDEOGRAPH-2F8" + - "18CJK COMPATIBILITY IDEOGRAPH-2F819CJK COMPATIBILITY IDEOGRAPH-2F81ACJK " + - "COMPATIBILITY IDEOGRAPH-2F81BCJK COMPATIBILITY IDEOGRAPH-2F81CCJK COMPAT" + - "IBILITY IDEOGRAPH-2F81DCJK COMPATIBILITY IDEOGRAPH-2F81ECJK COMPATIBILIT" + - "Y IDEOGRAPH-2F81FCJK COMPATIBILITY IDEOGRAPH-2F820CJK COMPATIBILITY IDEO" + - "GRAPH-2F821CJK COMPATIBILITY IDEOGRAPH-2F822CJK COMPATIBILITY IDEOGRAPH-" + - "2F823CJK COMPATIBILITY IDEOGRAPH-2F824CJK COMPATIBILITY IDEOGRAPH-2F825C" + - "JK COMPATIBILITY IDEOGRAPH-2F826CJK COMPATIBILITY IDEOGRAPH-2F827CJK COM" + - "PATIBILITY IDEOGRAPH-2F828CJK COMPATIBILITY IDEOGRAPH-2F829CJK COMPATIBI" + - "LITY IDEOGRAPH-2F82ACJK COMPATIBILITY IDEOGRAPH-2F82BCJK COMPATIBILITY I" + - "DEOGRAPH-2F82CCJK COMPATIBILITY IDEOGRAPH-2F82DCJK COMPATIBILITY IDEOGRA" + - "PH-2F82ECJK COMPATIBILITY IDEOGRAPH-2F82FCJK COMPATIBILITY IDEOGRAPH-2F8" + - "30CJK COMPATIBILITY IDEOGRAPH-2F831CJK COMPATIBILITY IDEOGRAPH-2F832CJK " + - "COMPATIBILITY IDEOGRAPH-2F833CJK COMPATIBILITY IDEOGRAPH-2F834CJK COMPAT" + - "IBILITY IDEOGRAPH-2F835CJK COMPATIBILITY IDEOGRAPH-2F836CJK COMPATIBILIT" + - "Y IDEOGRAPH-2F837CJK COMPATIBILITY IDEOGRAPH-2F838CJK COMPATIBILITY IDEO" + - "GRAPH-2F839CJK COMPATIBILITY IDEOGRAPH-2F83ACJK COMPATIBILITY IDEOGRAPH-" + - "2F83BCJK COMPATIBILITY IDEOGRAPH-2F83CCJK COMPATIBILITY IDEOGRAPH-2F83DC" + - "JK COMPATIBILITY IDEOGRAPH-2F83ECJK COMPATIBILITY IDEOGRAPH-2F83FCJK COM" + - "PATIBILITY IDEOGRAPH-2F840CJK COMPATIBILITY IDEOGRAPH-2F841CJK COMPATIBI" + - "LITY IDEOGRAPH-2F842CJK COMPATIBILITY IDEOGRAPH-2F843CJK COMPATIBILITY I" + - "DEOGRAPH-2F844CJK COMPATIBILITY IDEOGRAPH-2F845CJK COMPATIBILITY IDEOGRA") + ("" + - "PH-2F846CJK COMPATIBILITY IDEOGRAPH-2F847CJK COMPATIBILITY IDEOGRAPH-2F8" + - "48CJK COMPATIBILITY IDEOGRAPH-2F849CJK COMPATIBILITY IDEOGRAPH-2F84ACJK " + - "COMPATIBILITY IDEOGRAPH-2F84BCJK COMPATIBILITY IDEOGRAPH-2F84CCJK COMPAT" + - "IBILITY IDEOGRAPH-2F84DCJK COMPATIBILITY IDEOGRAPH-2F84ECJK COMPATIBILIT" + - "Y IDEOGRAPH-2F84FCJK COMPATIBILITY IDEOGRAPH-2F850CJK COMPATIBILITY IDEO" + - "GRAPH-2F851CJK COMPATIBILITY IDEOGRAPH-2F852CJK COMPATIBILITY IDEOGRAPH-" + - "2F853CJK COMPATIBILITY IDEOGRAPH-2F854CJK COMPATIBILITY IDEOGRAPH-2F855C" + - "JK COMPATIBILITY IDEOGRAPH-2F856CJK COMPATIBILITY IDEOGRAPH-2F857CJK COM" + - "PATIBILITY IDEOGRAPH-2F858CJK COMPATIBILITY IDEOGRAPH-2F859CJK COMPATIBI" + - "LITY IDEOGRAPH-2F85ACJK COMPATIBILITY IDEOGRAPH-2F85BCJK COMPATIBILITY I" + - "DEOGRAPH-2F85CCJK COMPATIBILITY IDEOGRAPH-2F85DCJK COMPATIBILITY IDEOGRA" + - "PH-2F85ECJK COMPATIBILITY IDEOGRAPH-2F85FCJK COMPATIBILITY IDEOGRAPH-2F8" + - "60CJK COMPATIBILITY IDEOGRAPH-2F861CJK COMPATIBILITY IDEOGRAPH-2F862CJK " + - "COMPATIBILITY IDEOGRAPH-2F863CJK COMPATIBILITY IDEOGRAPH-2F864CJK COMPAT" + - "IBILITY IDEOGRAPH-2F865CJK COMPATIBILITY IDEOGRAPH-2F866CJK COMPATIBILIT" + - "Y IDEOGRAPH-2F867CJK COMPATIBILITY IDEOGRAPH-2F868CJK COMPATIBILITY IDEO" + - "GRAPH-2F869CJK COMPATIBILITY IDEOGRAPH-2F86ACJK COMPATIBILITY IDEOGRAPH-" + - "2F86BCJK COMPATIBILITY IDEOGRAPH-2F86CCJK COMPATIBILITY IDEOGRAPH-2F86DC" + - "JK COMPATIBILITY IDEOGRAPH-2F86ECJK COMPATIBILITY IDEOGRAPH-2F86FCJK COM" + - "PATIBILITY IDEOGRAPH-2F870CJK COMPATIBILITY IDEOGRAPH-2F871CJK COMPATIBI" + - "LITY IDEOGRAPH-2F872CJK COMPATIBILITY IDEOGRAPH-2F873CJK COMPATIBILITY I" + - "DEOGRAPH-2F874CJK COMPATIBILITY IDEOGRAPH-2F875CJK COMPATIBILITY IDEOGRA" + - "PH-2F876CJK COMPATIBILITY IDEOGRAPH-2F877CJK COMPATIBILITY IDEOGRAPH-2F8" + - "78CJK COMPATIBILITY IDEOGRAPH-2F879CJK COMPATIBILITY IDEOGRAPH-2F87ACJK " + - "COMPATIBILITY IDEOGRAPH-2F87BCJK COMPATIBILITY IDEOGRAPH-2F87CCJK COMPAT" + - "IBILITY IDEOGRAPH-2F87DCJK COMPATIBILITY IDEOGRAPH-2F87ECJK COMPATIBILIT" + - "Y IDEOGRAPH-2F87FCJK COMPATIBILITY IDEOGRAPH-2F880CJK COMPATIBILITY IDEO" + - "GRAPH-2F881CJK COMPATIBILITY IDEOGRAPH-2F882CJK COMPATIBILITY IDEOGRAPH-" + - "2F883CJK COMPATIBILITY IDEOGRAPH-2F884CJK COMPATIBILITY IDEOGRAPH-2F885C" + - "JK COMPATIBILITY IDEOGRAPH-2F886CJK COMPATIBILITY IDEOGRAPH-2F887CJK COM" + - "PATIBILITY IDEOGRAPH-2F888CJK COMPATIBILITY IDEOGRAPH-2F889CJK COMPATIBI" + - "LITY IDEOGRAPH-2F88ACJK COMPATIBILITY IDEOGRAPH-2F88BCJK COMPATIBILITY I" + - "DEOGRAPH-2F88CCJK COMPATIBILITY IDEOGRAPH-2F88DCJK COMPATIBILITY IDEOGRA" + - "PH-2F88ECJK COMPATIBILITY IDEOGRAPH-2F88FCJK COMPATIBILITY IDEOGRAPH-2F8" + - "90CJK COMPATIBILITY IDEOGRAPH-2F891CJK COMPATIBILITY IDEOGRAPH-2F892CJK " + - "COMPATIBILITY IDEOGRAPH-2F893CJK COMPATIBILITY IDEOGRAPH-2F894CJK COMPAT" + - "IBILITY IDEOGRAPH-2F895CJK COMPATIBILITY IDEOGRAPH-2F896CJK COMPATIBILIT" + - "Y IDEOGRAPH-2F897CJK COMPATIBILITY IDEOGRAPH-2F898CJK COMPATIBILITY IDEO" + - "GRAPH-2F899CJK COMPATIBILITY IDEOGRAPH-2F89ACJK COMPATIBILITY IDEOGRAPH-" + - "2F89BCJK COMPATIBILITY IDEOGRAPH-2F89CCJK COMPATIBILITY IDEOGRAPH-2F89DC" + - "JK COMPATIBILITY IDEOGRAPH-2F89ECJK COMPATIBILITY IDEOGRAPH-2F89FCJK COM" + - "PATIBILITY IDEOGRAPH-2F8A0CJK COMPATIBILITY IDEOGRAPH-2F8A1CJK COMPATIBI" + - "LITY IDEOGRAPH-2F8A2CJK COMPATIBILITY IDEOGRAPH-2F8A3CJK COMPATIBILITY I" + - "DEOGRAPH-2F8A4CJK COMPATIBILITY IDEOGRAPH-2F8A5CJK COMPATIBILITY IDEOGRA" + - "PH-2F8A6CJK COMPATIBILITY IDEOGRAPH-2F8A7CJK COMPATIBILITY IDEOGRAPH-2F8" + - "A8CJK COMPATIBILITY IDEOGRAPH-2F8A9CJK COMPATIBILITY IDEOGRAPH-2F8AACJK " + - "COMPATIBILITY IDEOGRAPH-2F8ABCJK COMPATIBILITY IDEOGRAPH-2F8ACCJK COMPAT" + - "IBILITY IDEOGRAPH-2F8ADCJK COMPATIBILITY IDEOGRAPH-2F8AECJK COMPATIBILIT" + - "Y IDEOGRAPH-2F8AFCJK COMPATIBILITY IDEOGRAPH-2F8B0CJK COMPATIBILITY IDEO" + - "GRAPH-2F8B1CJK COMPATIBILITY IDEOGRAPH-2F8B2CJK COMPATIBILITY IDEOGRAPH-" + - "2F8B3CJK COMPATIBILITY IDEOGRAPH-2F8B4CJK COMPATIBILITY IDEOGRAPH-2F8B5C" + - "JK COMPATIBILITY IDEOGRAPH-2F8B6CJK COMPATIBILITY IDEOGRAPH-2F8B7CJK COM" + - "PATIBILITY IDEOGRAPH-2F8B8CJK COMPATIBILITY IDEOGRAPH-2F8B9CJK COMPATIBI" + - "LITY IDEOGRAPH-2F8BACJK COMPATIBILITY IDEOGRAPH-2F8BBCJK COMPATIBILITY I" + - "DEOGRAPH-2F8BCCJK COMPATIBILITY IDEOGRAPH-2F8BDCJK COMPATIBILITY IDEOGRA" + - "PH-2F8BECJK COMPATIBILITY IDEOGRAPH-2F8BFCJK COMPATIBILITY IDEOGRAPH-2F8" + - "C0CJK COMPATIBILITY IDEOGRAPH-2F8C1CJK COMPATIBILITY IDEOGRAPH-2F8C2CJK " + - "COMPATIBILITY IDEOGRAPH-2F8C3CJK COMPATIBILITY IDEOGRAPH-2F8C4CJK COMPAT" + - "IBILITY IDEOGRAPH-2F8C5CJK COMPATIBILITY IDEOGRAPH-2F8C6CJK COMPATIBILIT" + - "Y IDEOGRAPH-2F8C7CJK COMPATIBILITY IDEOGRAPH-2F8C8CJK COMPATIBILITY IDEO" + - "GRAPH-2F8C9CJK COMPATIBILITY IDEOGRAPH-2F8CACJK COMPATIBILITY IDEOGRAPH-" + - "2F8CBCJK COMPATIBILITY IDEOGRAPH-2F8CCCJK COMPATIBILITY IDEOGRAPH-2F8CDC" + - "JK COMPATIBILITY IDEOGRAPH-2F8CECJK COMPATIBILITY IDEOGRAPH-2F8CFCJK COM" + - "PATIBILITY IDEOGRAPH-2F8D0CJK COMPATIBILITY IDEOGRAPH-2F8D1CJK COMPATIBI") + ("" + - "LITY IDEOGRAPH-2F8D2CJK COMPATIBILITY IDEOGRAPH-2F8D3CJK COMPATIBILITY I" + - "DEOGRAPH-2F8D4CJK COMPATIBILITY IDEOGRAPH-2F8D5CJK COMPATIBILITY IDEOGRA" + - "PH-2F8D6CJK COMPATIBILITY IDEOGRAPH-2F8D7CJK COMPATIBILITY IDEOGRAPH-2F8" + - "D8CJK COMPATIBILITY IDEOGRAPH-2F8D9CJK COMPATIBILITY IDEOGRAPH-2F8DACJK " + - "COMPATIBILITY IDEOGRAPH-2F8DBCJK COMPATIBILITY IDEOGRAPH-2F8DCCJK COMPAT" + - "IBILITY IDEOGRAPH-2F8DDCJK COMPATIBILITY IDEOGRAPH-2F8DECJK COMPATIBILIT" + - "Y IDEOGRAPH-2F8DFCJK COMPATIBILITY IDEOGRAPH-2F8E0CJK COMPATIBILITY IDEO" + - "GRAPH-2F8E1CJK COMPATIBILITY IDEOGRAPH-2F8E2CJK COMPATIBILITY IDEOGRAPH-" + - "2F8E3CJK COMPATIBILITY IDEOGRAPH-2F8E4CJK COMPATIBILITY IDEOGRAPH-2F8E5C" + - "JK COMPATIBILITY IDEOGRAPH-2F8E6CJK COMPATIBILITY IDEOGRAPH-2F8E7CJK COM" + - "PATIBILITY IDEOGRAPH-2F8E8CJK COMPATIBILITY IDEOGRAPH-2F8E9CJK COMPATIBI" + - "LITY IDEOGRAPH-2F8EACJK COMPATIBILITY IDEOGRAPH-2F8EBCJK COMPATIBILITY I" + - "DEOGRAPH-2F8ECCJK COMPATIBILITY IDEOGRAPH-2F8EDCJK COMPATIBILITY IDEOGRA" + - "PH-2F8EECJK COMPATIBILITY IDEOGRAPH-2F8EFCJK COMPATIBILITY IDEOGRAPH-2F8" + - "F0CJK COMPATIBILITY IDEOGRAPH-2F8F1CJK COMPATIBILITY IDEOGRAPH-2F8F2CJK " + - "COMPATIBILITY IDEOGRAPH-2F8F3CJK COMPATIBILITY IDEOGRAPH-2F8F4CJK COMPAT" + - "IBILITY IDEOGRAPH-2F8F5CJK COMPATIBILITY IDEOGRAPH-2F8F6CJK COMPATIBILIT" + - "Y IDEOGRAPH-2F8F7CJK COMPATIBILITY IDEOGRAPH-2F8F8CJK COMPATIBILITY IDEO" + - "GRAPH-2F8F9CJK COMPATIBILITY IDEOGRAPH-2F8FACJK COMPATIBILITY IDEOGRAPH-" + - "2F8FBCJK COMPATIBILITY IDEOGRAPH-2F8FCCJK COMPATIBILITY IDEOGRAPH-2F8FDC" + - "JK COMPATIBILITY IDEOGRAPH-2F8FECJK COMPATIBILITY IDEOGRAPH-2F8FFCJK COM" + - "PATIBILITY IDEOGRAPH-2F900CJK COMPATIBILITY IDEOGRAPH-2F901CJK COMPATIBI" + - "LITY IDEOGRAPH-2F902CJK COMPATIBILITY IDEOGRAPH-2F903CJK COMPATIBILITY I" + - "DEOGRAPH-2F904CJK COMPATIBILITY IDEOGRAPH-2F905CJK COMPATIBILITY IDEOGRA" + - "PH-2F906CJK COMPATIBILITY IDEOGRAPH-2F907CJK COMPATIBILITY IDEOGRAPH-2F9" + - "08CJK COMPATIBILITY IDEOGRAPH-2F909CJK COMPATIBILITY IDEOGRAPH-2F90ACJK " + - "COMPATIBILITY IDEOGRAPH-2F90BCJK COMPATIBILITY IDEOGRAPH-2F90CCJK COMPAT" + - "IBILITY IDEOGRAPH-2F90DCJK COMPATIBILITY IDEOGRAPH-2F90ECJK COMPATIBILIT" + - "Y IDEOGRAPH-2F90FCJK COMPATIBILITY IDEOGRAPH-2F910CJK COMPATIBILITY IDEO" + - "GRAPH-2F911CJK COMPATIBILITY IDEOGRAPH-2F912CJK COMPATIBILITY IDEOGRAPH-" + - "2F913CJK COMPATIBILITY IDEOGRAPH-2F914CJK COMPATIBILITY IDEOGRAPH-2F915C" + - "JK COMPATIBILITY IDEOGRAPH-2F916CJK COMPATIBILITY IDEOGRAPH-2F917CJK COM" + - "PATIBILITY IDEOGRAPH-2F918CJK COMPATIBILITY IDEOGRAPH-2F919CJK COMPATIBI" + - "LITY IDEOGRAPH-2F91ACJK COMPATIBILITY IDEOGRAPH-2F91BCJK COMPATIBILITY I" + - "DEOGRAPH-2F91CCJK COMPATIBILITY IDEOGRAPH-2F91DCJK COMPATIBILITY IDEOGRA" + - "PH-2F91ECJK COMPATIBILITY IDEOGRAPH-2F91FCJK COMPATIBILITY IDEOGRAPH-2F9" + - "20CJK COMPATIBILITY IDEOGRAPH-2F921CJK COMPATIBILITY IDEOGRAPH-2F922CJK " + - "COMPATIBILITY IDEOGRAPH-2F923CJK COMPATIBILITY IDEOGRAPH-2F924CJK COMPAT" + - "IBILITY IDEOGRAPH-2F925CJK COMPATIBILITY IDEOGRAPH-2F926CJK COMPATIBILIT" + - "Y IDEOGRAPH-2F927CJK COMPATIBILITY IDEOGRAPH-2F928CJK COMPATIBILITY IDEO" + - "GRAPH-2F929CJK COMPATIBILITY IDEOGRAPH-2F92ACJK COMPATIBILITY IDEOGRAPH-" + - "2F92BCJK COMPATIBILITY IDEOGRAPH-2F92CCJK COMPATIBILITY IDEOGRAPH-2F92DC" + - "JK COMPATIBILITY IDEOGRAPH-2F92ECJK COMPATIBILITY IDEOGRAPH-2F92FCJK COM" + - "PATIBILITY IDEOGRAPH-2F930CJK COMPATIBILITY IDEOGRAPH-2F931CJK COMPATIBI" + - "LITY IDEOGRAPH-2F932CJK COMPATIBILITY IDEOGRAPH-2F933CJK COMPATIBILITY I" + - "DEOGRAPH-2F934CJK COMPATIBILITY IDEOGRAPH-2F935CJK COMPATIBILITY IDEOGRA" + - "PH-2F936CJK COMPATIBILITY IDEOGRAPH-2F937CJK COMPATIBILITY IDEOGRAPH-2F9" + - "38CJK COMPATIBILITY IDEOGRAPH-2F939CJK COMPATIBILITY IDEOGRAPH-2F93ACJK " + - "COMPATIBILITY IDEOGRAPH-2F93BCJK COMPATIBILITY IDEOGRAPH-2F93CCJK COMPAT" + - "IBILITY IDEOGRAPH-2F93DCJK COMPATIBILITY IDEOGRAPH-2F93ECJK COMPATIBILIT" + - "Y IDEOGRAPH-2F93FCJK COMPATIBILITY IDEOGRAPH-2F940CJK COMPATIBILITY IDEO" + - "GRAPH-2F941CJK COMPATIBILITY IDEOGRAPH-2F942CJK COMPATIBILITY IDEOGRAPH-" + - "2F943CJK COMPATIBILITY IDEOGRAPH-2F944CJK COMPATIBILITY IDEOGRAPH-2F945C" + - "JK COMPATIBILITY IDEOGRAPH-2F946CJK COMPATIBILITY IDEOGRAPH-2F947CJK COM" + - "PATIBILITY IDEOGRAPH-2F948CJK COMPATIBILITY IDEOGRAPH-2F949CJK COMPATIBI" + - "LITY IDEOGRAPH-2F94ACJK COMPATIBILITY IDEOGRAPH-2F94BCJK COMPATIBILITY I" + - "DEOGRAPH-2F94CCJK COMPATIBILITY IDEOGRAPH-2F94DCJK COMPATIBILITY IDEOGRA" + - "PH-2F94ECJK COMPATIBILITY IDEOGRAPH-2F94FCJK COMPATIBILITY IDEOGRAPH-2F9" + - "50CJK COMPATIBILITY IDEOGRAPH-2F951CJK COMPATIBILITY IDEOGRAPH-2F952CJK " + - "COMPATIBILITY IDEOGRAPH-2F953CJK COMPATIBILITY IDEOGRAPH-2F954CJK COMPAT" + - "IBILITY IDEOGRAPH-2F955CJK COMPATIBILITY IDEOGRAPH-2F956CJK COMPATIBILIT" + - "Y IDEOGRAPH-2F957CJK COMPATIBILITY IDEOGRAPH-2F958CJK COMPATIBILITY IDEO" + - "GRAPH-2F959CJK COMPATIBILITY IDEOGRAPH-2F95ACJK COMPATIBILITY IDEOGRAPH-" + - "2F95BCJK COMPATIBILITY IDEOGRAPH-2F95CCJK COMPATIBILITY IDEOGRAPH-2F95DC") + ("" + - "JK COMPATIBILITY IDEOGRAPH-2F95ECJK COMPATIBILITY IDEOGRAPH-2F95FCJK COM" + - "PATIBILITY IDEOGRAPH-2F960CJK COMPATIBILITY IDEOGRAPH-2F961CJK COMPATIBI" + - "LITY IDEOGRAPH-2F962CJK COMPATIBILITY IDEOGRAPH-2F963CJK COMPATIBILITY I" + - "DEOGRAPH-2F964CJK COMPATIBILITY IDEOGRAPH-2F965CJK COMPATIBILITY IDEOGRA" + - "PH-2F966CJK COMPATIBILITY IDEOGRAPH-2F967CJK COMPATIBILITY IDEOGRAPH-2F9" + - "68CJK COMPATIBILITY IDEOGRAPH-2F969CJK COMPATIBILITY IDEOGRAPH-2F96ACJK " + - "COMPATIBILITY IDEOGRAPH-2F96BCJK COMPATIBILITY IDEOGRAPH-2F96CCJK COMPAT" + - "IBILITY IDEOGRAPH-2F96DCJK COMPATIBILITY IDEOGRAPH-2F96ECJK COMPATIBILIT" + - "Y IDEOGRAPH-2F96FCJK COMPATIBILITY IDEOGRAPH-2F970CJK COMPATIBILITY IDEO" + - "GRAPH-2F971CJK COMPATIBILITY IDEOGRAPH-2F972CJK COMPATIBILITY IDEOGRAPH-" + - "2F973CJK COMPATIBILITY IDEOGRAPH-2F974CJK COMPATIBILITY IDEOGRAPH-2F975C" + - "JK COMPATIBILITY IDEOGRAPH-2F976CJK COMPATIBILITY IDEOGRAPH-2F977CJK COM" + - "PATIBILITY IDEOGRAPH-2F978CJK COMPATIBILITY IDEOGRAPH-2F979CJK COMPATIBI" + - "LITY IDEOGRAPH-2F97ACJK COMPATIBILITY IDEOGRAPH-2F97BCJK COMPATIBILITY I" + - "DEOGRAPH-2F97CCJK COMPATIBILITY IDEOGRAPH-2F97DCJK COMPATIBILITY IDEOGRA" + - "PH-2F97ECJK COMPATIBILITY IDEOGRAPH-2F97FCJK COMPATIBILITY IDEOGRAPH-2F9" + - "80CJK COMPATIBILITY IDEOGRAPH-2F981CJK COMPATIBILITY IDEOGRAPH-2F982CJK " + - "COMPATIBILITY IDEOGRAPH-2F983CJK COMPATIBILITY IDEOGRAPH-2F984CJK COMPAT" + - "IBILITY IDEOGRAPH-2F985CJK COMPATIBILITY IDEOGRAPH-2F986CJK COMPATIBILIT" + - "Y IDEOGRAPH-2F987CJK COMPATIBILITY IDEOGRAPH-2F988CJK COMPATIBILITY IDEO" + - "GRAPH-2F989CJK COMPATIBILITY IDEOGRAPH-2F98ACJK COMPATIBILITY IDEOGRAPH-" + - "2F98BCJK COMPATIBILITY IDEOGRAPH-2F98CCJK COMPATIBILITY IDEOGRAPH-2F98DC" + - "JK COMPATIBILITY IDEOGRAPH-2F98ECJK COMPATIBILITY IDEOGRAPH-2F98FCJK COM" + - "PATIBILITY IDEOGRAPH-2F990CJK COMPATIBILITY IDEOGRAPH-2F991CJK COMPATIBI" + - "LITY IDEOGRAPH-2F992CJK COMPATIBILITY IDEOGRAPH-2F993CJK COMPATIBILITY I" + - "DEOGRAPH-2F994CJK COMPATIBILITY IDEOGRAPH-2F995CJK COMPATIBILITY IDEOGRA" + - "PH-2F996CJK COMPATIBILITY IDEOGRAPH-2F997CJK COMPATIBILITY IDEOGRAPH-2F9" + - "98CJK COMPATIBILITY IDEOGRAPH-2F999CJK COMPATIBILITY IDEOGRAPH-2F99ACJK " + - "COMPATIBILITY IDEOGRAPH-2F99BCJK COMPATIBILITY IDEOGRAPH-2F99CCJK COMPAT" + - "IBILITY IDEOGRAPH-2F99DCJK COMPATIBILITY IDEOGRAPH-2F99ECJK COMPATIBILIT" + - "Y IDEOGRAPH-2F99FCJK COMPATIBILITY IDEOGRAPH-2F9A0CJK COMPATIBILITY IDEO" + - "GRAPH-2F9A1CJK COMPATIBILITY IDEOGRAPH-2F9A2CJK COMPATIBILITY IDEOGRAPH-" + - "2F9A3CJK COMPATIBILITY IDEOGRAPH-2F9A4CJK COMPATIBILITY IDEOGRAPH-2F9A5C" + - "JK COMPATIBILITY IDEOGRAPH-2F9A6CJK COMPATIBILITY IDEOGRAPH-2F9A7CJK COM" + - "PATIBILITY IDEOGRAPH-2F9A8CJK COMPATIBILITY IDEOGRAPH-2F9A9CJK COMPATIBI" + - "LITY IDEOGRAPH-2F9AACJK COMPATIBILITY IDEOGRAPH-2F9ABCJK COMPATIBILITY I" + - "DEOGRAPH-2F9ACCJK COMPATIBILITY IDEOGRAPH-2F9ADCJK COMPATIBILITY IDEOGRA" + - "PH-2F9AECJK COMPATIBILITY IDEOGRAPH-2F9AFCJK COMPATIBILITY IDEOGRAPH-2F9" + - "B0CJK COMPATIBILITY IDEOGRAPH-2F9B1CJK COMPATIBILITY IDEOGRAPH-2F9B2CJK " + - "COMPATIBILITY IDEOGRAPH-2F9B3CJK COMPATIBILITY IDEOGRAPH-2F9B4CJK COMPAT" + - "IBILITY IDEOGRAPH-2F9B5CJK COMPATIBILITY IDEOGRAPH-2F9B6CJK COMPATIBILIT" + - "Y IDEOGRAPH-2F9B7CJK COMPATIBILITY IDEOGRAPH-2F9B8CJK COMPATIBILITY IDEO" + - "GRAPH-2F9B9CJK COMPATIBILITY IDEOGRAPH-2F9BACJK COMPATIBILITY IDEOGRAPH-" + - "2F9BBCJK COMPATIBILITY IDEOGRAPH-2F9BCCJK COMPATIBILITY IDEOGRAPH-2F9BDC" + - "JK COMPATIBILITY IDEOGRAPH-2F9BECJK COMPATIBILITY IDEOGRAPH-2F9BFCJK COM" + - "PATIBILITY IDEOGRAPH-2F9C0CJK COMPATIBILITY IDEOGRAPH-2F9C1CJK COMPATIBI" + - "LITY IDEOGRAPH-2F9C2CJK COMPATIBILITY IDEOGRAPH-2F9C3CJK COMPATIBILITY I" + - "DEOGRAPH-2F9C4CJK COMPATIBILITY IDEOGRAPH-2F9C5CJK COMPATIBILITY IDEOGRA" + - "PH-2F9C6CJK COMPATIBILITY IDEOGRAPH-2F9C7CJK COMPATIBILITY IDEOGRAPH-2F9" + - "C8CJK COMPATIBILITY IDEOGRAPH-2F9C9CJK COMPATIBILITY IDEOGRAPH-2F9CACJK " + - "COMPATIBILITY IDEOGRAPH-2F9CBCJK COMPATIBILITY IDEOGRAPH-2F9CCCJK COMPAT" + - "IBILITY IDEOGRAPH-2F9CDCJK COMPATIBILITY IDEOGRAPH-2F9CECJK COMPATIBILIT" + - "Y IDEOGRAPH-2F9CFCJK COMPATIBILITY IDEOGRAPH-2F9D0CJK COMPATIBILITY IDEO" + - "GRAPH-2F9D1CJK COMPATIBILITY IDEOGRAPH-2F9D2CJK COMPATIBILITY IDEOGRAPH-" + - "2F9D3CJK COMPATIBILITY IDEOGRAPH-2F9D4CJK COMPATIBILITY IDEOGRAPH-2F9D5C" + - "JK COMPATIBILITY IDEOGRAPH-2F9D6CJK COMPATIBILITY IDEOGRAPH-2F9D7CJK COM" + - "PATIBILITY IDEOGRAPH-2F9D8CJK COMPATIBILITY IDEOGRAPH-2F9D9CJK COMPATIBI" + - "LITY IDEOGRAPH-2F9DACJK COMPATIBILITY IDEOGRAPH-2F9DBCJK COMPATIBILITY I" + - "DEOGRAPH-2F9DCCJK COMPATIBILITY IDEOGRAPH-2F9DDCJK COMPATIBILITY IDEOGRA" + - "PH-2F9DECJK COMPATIBILITY IDEOGRAPH-2F9DFCJK COMPATIBILITY IDEOGRAPH-2F9" + - "E0CJK COMPATIBILITY IDEOGRAPH-2F9E1CJK COMPATIBILITY IDEOGRAPH-2F9E2CJK " + - "COMPATIBILITY IDEOGRAPH-2F9E3CJK COMPATIBILITY IDEOGRAPH-2F9E4CJK COMPAT" + - "IBILITY IDEOGRAPH-2F9E5CJK COMPATIBILITY IDEOGRAPH-2F9E6CJK COMPATIBILIT" + - "Y IDEOGRAPH-2F9E7CJK COMPATIBILITY IDEOGRAPH-2F9E8CJK COMPATIBILITY IDEO") + ("" + - "GRAPH-2F9E9CJK COMPATIBILITY IDEOGRAPH-2F9EACJK COMPATIBILITY IDEOGRAPH-" + - "2F9EBCJK COMPATIBILITY IDEOGRAPH-2F9ECCJK COMPATIBILITY IDEOGRAPH-2F9EDC" + - "JK COMPATIBILITY IDEOGRAPH-2F9EECJK COMPATIBILITY IDEOGRAPH-2F9EFCJK COM" + - "PATIBILITY IDEOGRAPH-2F9F0CJK COMPATIBILITY IDEOGRAPH-2F9F1CJK COMPATIBI" + - "LITY IDEOGRAPH-2F9F2CJK COMPATIBILITY IDEOGRAPH-2F9F3CJK COMPATIBILITY I" + - "DEOGRAPH-2F9F4CJK COMPATIBILITY IDEOGRAPH-2F9F5CJK COMPATIBILITY IDEOGRA" + - "PH-2F9F6CJK COMPATIBILITY IDEOGRAPH-2F9F7CJK COMPATIBILITY IDEOGRAPH-2F9" + - "F8CJK COMPATIBILITY IDEOGRAPH-2F9F9CJK COMPATIBILITY IDEOGRAPH-2F9FACJK " + - "COMPATIBILITY IDEOGRAPH-2F9FBCJK COMPATIBILITY IDEOGRAPH-2F9FCCJK COMPAT" + - "IBILITY IDEOGRAPH-2F9FDCJK COMPATIBILITY IDEOGRAPH-2F9FECJK COMPATIBILIT" + - "Y IDEOGRAPH-2F9FFCJK COMPATIBILITY IDEOGRAPH-2FA00CJK COMPATIBILITY IDEO" + - "GRAPH-2FA01CJK COMPATIBILITY IDEOGRAPH-2FA02CJK COMPATIBILITY IDEOGRAPH-" + - "2FA03CJK COMPATIBILITY IDEOGRAPH-2FA04CJK COMPATIBILITY IDEOGRAPH-2FA05C" + - "JK COMPATIBILITY IDEOGRAPH-2FA06CJK COMPATIBILITY IDEOGRAPH-2FA07CJK COM" + - "PATIBILITY IDEOGRAPH-2FA08CJK COMPATIBILITY IDEOGRAPH-2FA09CJK COMPATIBI" + - "LITY IDEOGRAPH-2FA0ACJK COMPATIBILITY IDEOGRAPH-2FA0BCJK COMPATIBILITY I" + - "DEOGRAPH-2FA0CCJK COMPATIBILITY IDEOGRAPH-2FA0DCJK COMPATIBILITY IDEOGRA" + - "PH-2FA0ECJK COMPATIBILITY IDEOGRAPH-2FA0FCJK COMPATIBILITY IDEOGRAPH-2FA" + - "10CJK COMPATIBILITY IDEOGRAPH-2FA11CJK COMPATIBILITY IDEOGRAPH-2FA12CJK " + - "COMPATIBILITY IDEOGRAPH-2FA13CJK COMPATIBILITY IDEOGRAPH-2FA14CJK COMPAT" + - "IBILITY IDEOGRAPH-2FA15CJK COMPATIBILITY IDEOGRAPH-2FA16CJK COMPATIBILIT" + - "Y IDEOGRAPH-2FA17CJK COMPATIBILITY IDEOGRAPH-2FA18CJK COMPATIBILITY IDEO" + - "GRAPH-2FA19CJK COMPATIBILITY IDEOGRAPH-2FA1ACJK COMPATIBILITY IDEOGRAPH-" + - "2FA1BCJK COMPATIBILITY IDEOGRAPH-2FA1CCJK COMPATIBILITY IDEOGRAPH-2FA1DL" + - "ANGUAGE TAGTAG SPACETAG EXCLAMATION MARKTAG QUOTATION MARKTAG NUMBER SIG" + - "NTAG DOLLAR SIGNTAG PERCENT SIGNTAG AMPERSANDTAG APOSTROPHETAG LEFT PARE" + - "NTHESISTAG RIGHT PARENTHESISTAG ASTERISKTAG PLUS SIGNTAG COMMATAG HYPHEN" + - "-MINUSTAG FULL STOPTAG SOLIDUSTAG DIGIT ZEROTAG DIGIT ONETAG DIGIT TWOTA" + - "G DIGIT THREETAG DIGIT FOURTAG DIGIT FIVETAG DIGIT SIXTAG DIGIT SEVENTAG" + - " DIGIT EIGHTTAG DIGIT NINETAG COLONTAG SEMICOLONTAG LESS-THAN SIGNTAG EQ" + - "UALS SIGNTAG GREATER-THAN SIGNTAG QUESTION MARKTAG COMMERCIAL ATTAG LATI" + - "N CAPITAL LETTER ATAG LATIN CAPITAL LETTER BTAG LATIN CAPITAL LETTER CTA" + - "G LATIN CAPITAL LETTER DTAG LATIN CAPITAL LETTER ETAG LATIN CAPITAL LETT" + - "ER FTAG LATIN CAPITAL LETTER GTAG LATIN CAPITAL LETTER HTAG LATIN CAPITA" + - "L LETTER ITAG LATIN CAPITAL LETTER JTAG LATIN CAPITAL LETTER KTAG LATIN " + - "CAPITAL LETTER LTAG LATIN CAPITAL LETTER MTAG LATIN CAPITAL LETTER NTAG " + - "LATIN CAPITAL LETTER OTAG LATIN CAPITAL LETTER PTAG LATIN CAPITAL LETTER" + - " QTAG LATIN CAPITAL LETTER RTAG LATIN CAPITAL LETTER STAG LATIN CAPITAL " + - "LETTER TTAG LATIN CAPITAL LETTER UTAG LATIN CAPITAL LETTER VTAG LATIN CA" + - "PITAL LETTER WTAG LATIN CAPITAL LETTER XTAG LATIN CAPITAL LETTER YTAG LA" + - "TIN CAPITAL LETTER ZTAG LEFT SQUARE BRACKETTAG REVERSE SOLIDUSTAG RIGHT " + - "SQUARE BRACKETTAG CIRCUMFLEX ACCENTTAG LOW LINETAG GRAVE ACCENTTAG LATIN" + - " SMALL LETTER ATAG LATIN SMALL LETTER BTAG LATIN SMALL LETTER CTAG LATIN" + - " SMALL LETTER DTAG LATIN SMALL LETTER ETAG LATIN SMALL LETTER FTAG LATIN" + - " SMALL LETTER GTAG LATIN SMALL LETTER HTAG LATIN SMALL LETTER ITAG LATIN" + - " SMALL LETTER JTAG LATIN SMALL LETTER KTAG LATIN SMALL LETTER LTAG LATIN" + - " SMALL LETTER MTAG LATIN SMALL LETTER NTAG LATIN SMALL LETTER OTAG LATIN" + - " SMALL LETTER PTAG LATIN SMALL LETTER QTAG LATIN SMALL LETTER RTAG LATIN" + - " SMALL LETTER STAG LATIN SMALL LETTER TTAG LATIN SMALL LETTER UTAG LATIN" + - " SMALL LETTER VTAG LATIN SMALL LETTER WTAG LATIN SMALL LETTER XTAG LATIN" + - " SMALL LETTER YTAG LATIN SMALL LETTER ZTAG LEFT CURLY BRACKETTAG VERTICA" + - "L LINETAG RIGHT CURLY BRACKETTAG TILDECANCEL TAGVARIATION SELECTOR-17VAR" + - "IATION SELECTOR-18VARIATION SELECTOR-19VARIATION SELECTOR-20VARIATION SE" + - "LECTOR-21VARIATION SELECTOR-22VARIATION SELECTOR-23VARIATION SELECTOR-24" + - "VARIATION SELECTOR-25VARIATION SELECTOR-26VARIATION SELECTOR-27VARIATION" + - " SELECTOR-28VARIATION SELECTOR-29VARIATION SELECTOR-30VARIATION SELECTOR" + - "-31VARIATION SELECTOR-32VARIATION SELECTOR-33VARIATION SELECTOR-34VARIAT" + - "ION SELECTOR-35VARIATION SELECTOR-36VARIATION SELECTOR-37VARIATION SELEC" + - "TOR-38VARIATION SELECTOR-39VARIATION SELECTOR-40VARIATION SELECTOR-41VAR" + - "IATION SELECTOR-42VARIATION SELECTOR-43VARIATION SELECTOR-44VARIATION SE" + - "LECTOR-45VARIATION SELECTOR-46VARIATION SELECTOR-47VARIATION SELECTOR-48" + - "VARIATION SELECTOR-49VARIATION SELECTOR-50VARIATION SELECTOR-51VARIATION" + - " SELECTOR-52VARIATION SELECTOR-53VARIATION SELECTOR-54VARIATION SELECTOR" + - "-55VARIATION SELECTOR-56VARIATION SELECTOR-57VARIATION SELECTOR-58VARIAT") + ("" + - "ION SELECTOR-59VARIATION SELECTOR-60VARIATION SELECTOR-61VARIATION SELEC" + - "TOR-62VARIATION SELECTOR-63VARIATION SELECTOR-64VARIATION SELECTOR-65VAR" + - "IATION SELECTOR-66VARIATION SELECTOR-67VARIATION SELECTOR-68VARIATION SE" + - "LECTOR-69VARIATION SELECTOR-70VARIATION SELECTOR-71VARIATION SELECTOR-72" + - "VARIATION SELECTOR-73VARIATION SELECTOR-74VARIATION SELECTOR-75VARIATION" + - " SELECTOR-76VARIATION SELECTOR-77VARIATION SELECTOR-78VARIATION SELECTOR" + - "-79VARIATION SELECTOR-80VARIATION SELECTOR-81VARIATION SELECTOR-82VARIAT" + - "ION SELECTOR-83VARIATION SELECTOR-84VARIATION SELECTOR-85VARIATION SELEC" + - "TOR-86VARIATION SELECTOR-87VARIATION SELECTOR-88VARIATION SELECTOR-89VAR" + - "IATION SELECTOR-90VARIATION SELECTOR-91VARIATION SELECTOR-92VARIATION SE" + - "LECTOR-93VARIATION SELECTOR-94VARIATION SELECTOR-95VARIATION SELECTOR-96" + - "VARIATION SELECTOR-97VARIATION SELECTOR-98VARIATION SELECTOR-99VARIATION" + - " SELECTOR-100VARIATION SELECTOR-101VARIATION SELECTOR-102VARIATION SELEC" + - "TOR-103VARIATION SELECTOR-104VARIATION SELECTOR-105VARIATION SELECTOR-10" + - "6VARIATION SELECTOR-107VARIATION SELECTOR-108VARIATION SELECTOR-109VARIA" + - "TION SELECTOR-110VARIATION SELECTOR-111VARIATION SELECTOR-112VARIATION S" + - "ELECTOR-113VARIATION SELECTOR-114VARIATION SELECTOR-115VARIATION SELECTO" + - "R-116VARIATION SELECTOR-117VARIATION SELECTOR-118VARIATION SELECTOR-119V" + - "ARIATION SELECTOR-120VARIATION SELECTOR-121VARIATION SELECTOR-122VARIATI" + - "ON SELECTOR-123VARIATION SELECTOR-124VARIATION SELECTOR-125VARIATION SEL" + - "ECTOR-126VARIATION SELECTOR-127VARIATION SELECTOR-128VARIATION SELECTOR-" + - "129VARIATION SELECTOR-130VARIATION SELECTOR-131VARIATION SELECTOR-132VAR" + - "IATION SELECTOR-133VARIATION SELECTOR-134VARIATION SELECTOR-135VARIATION" + - " SELECTOR-136VARIATION SELECTOR-137VARIATION SELECTOR-138VARIATION SELEC" + - "TOR-139VARIATION SELECTOR-140VARIATION SELECTOR-141VARIATION SELECTOR-14" + - "2VARIATION SELECTOR-143VARIATION SELECTOR-144VARIATION SELECTOR-145VARIA" + - "TION SELECTOR-146VARIATION SELECTOR-147VARIATION SELECTOR-148VARIATION S" + - "ELECTOR-149VARIATION SELECTOR-150VARIATION SELECTOR-151VARIATION SELECTO" + - "R-152VARIATION SELECTOR-153VARIATION SELECTOR-154VARIATION SELECTOR-155V" + - "ARIATION SELECTOR-156VARIATION SELECTOR-157VARIATION SELECTOR-158VARIATI" + - "ON SELECTOR-159VARIATION SELECTOR-160VARIATION SELECTOR-161VARIATION SEL" + - "ECTOR-162VARIATION SELECTOR-163VARIATION SELECTOR-164VARIATION SELECTOR-" + - "165VARIATION SELECTOR-166VARIATION SELECTOR-167VARIATION SELECTOR-168VAR" + - "IATION SELECTOR-169VARIATION SELECTOR-170VARIATION SELECTOR-171VARIATION" + - " SELECTOR-172VARIATION SELECTOR-173VARIATION SELECTOR-174VARIATION SELEC" + - "TOR-175VARIATION SELECTOR-176VARIATION SELECTOR-177VARIATION SELECTOR-17" + - "8VARIATION SELECTOR-179VARIATION SELECTOR-180VARIATION SELECTOR-181VARIA" + - "TION SELECTOR-182VARIATION SELECTOR-183VARIATION SELECTOR-184VARIATION S" + - "ELECTOR-185VARIATION SELECTOR-186VARIATION SELECTOR-187VARIATION SELECTO" + - "R-188VARIATION SELECTOR-189VARIATION SELECTOR-190VARIATION SELECTOR-191V" + - "ARIATION SELECTOR-192VARIATION SELECTOR-193VARIATION SELECTOR-194VARIATI" + - "ON SELECTOR-195VARIATION SELECTOR-196VARIATION SELECTOR-197VARIATION SEL" + - "ECTOR-198VARIATION SELECTOR-199VARIATION SELECTOR-200VARIATION SELECTOR-" + - "201VARIATION SELECTOR-202VARIATION SELECTOR-203VARIATION SELECTOR-204VAR" + - "IATION SELECTOR-205VARIATION SELECTOR-206VARIATION SELECTOR-207VARIATION" + - " SELECTOR-208VARIATION SELECTOR-209VARIATION SELECTOR-210VARIATION SELEC" + - "TOR-211VARIATION SELECTOR-212VARIATION SELECTOR-213VARIATION SELECTOR-21" + - "4VARIATION SELECTOR-215VARIATION SELECTOR-216VARIATION SELECTOR-217VARIA" + - "TION SELECTOR-218VARIATION SELECTOR-219VARIATION SELECTOR-220VARIATION S" + - "ELECTOR-221VARIATION SELECTOR-222VARIATION SELECTOR-223VARIATION SELECTO" + - "R-224VARIATION SELECTOR-225VARIATION SELECTOR-226VARIATION SELECTOR-227V" + - "ARIATION SELECTOR-228VARIATION SELECTOR-229VARIATION SELECTOR-230VARIATI" + - "ON SELECTOR-231VARIATION SELECTOR-232VARIATION SELECTOR-233VARIATION SEL" + - "ECTOR-234VARIATION SELECTOR-235VARIATION SELECTOR-236VARIATION SELECTOR-" + - "237VARIATION SELECTOR-238VARIATION SELECTOR-239VARIATION SELECTOR-240VAR" + - "IATION SELECTOR-241VARIATION SELECTOR-242VARIATION SELECTOR-243VARIATION" + - " SELECTOR-244VARIATION SELECTOR-245VARIATION SELECTOR-246VARIATION SELEC" + - "TOR-247VARIATION SELECTOR-248VARIATION SELECTOR-249VARIATION SELECTOR-25" + - "0VARIATION SELECTOR-251VARIATION SELECTOR-252VARIATION SELECTOR-253VARIA" + - "TION SELECTOR-254VARIATION SELECTOR-255VARIATION SELECTOR-256") - -// Total table size 855081 bytes (835KiB); checksum: 98E3EADD diff --git a/vendor/golang.org/x/text/width/common_test.go b/vendor/golang.org/x/text/width/common_test.go deleted file mode 100644 index 9ebb782c0..000000000 --- a/vendor/golang.org/x/text/width/common_test.go +++ /dev/null @@ -1,92 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package width - -// This code is shared between the main code generator and the test code. - -import ( - "flag" - "log" - "strconv" - "strings" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/ucd" -) - -var ( - outputFile = flag.String("out", "tables.go", "output file") -) - -var typeMap = map[string]elem{ - "A": tagAmbiguous, - "N": tagNeutral, - "Na": tagNarrow, - "W": tagWide, - "F": tagFullwidth, - "H": tagHalfwidth, -} - -// getWidthData calls f for every entry for which it is defined. -// -// f may be called multiple times for the same rune. The last call to f is the -// correct value. f is not called for all runes. The default tag type is -// Neutral. -func getWidthData(f func(r rune, tag elem, alt rune)) { - // Set the default values for Unified Ideographs. In line with Annex 11, - // we encode full ranges instead of the defined runes in Unified_Ideograph. - for _, b := range []struct{ lo, hi rune }{ - {0x4E00, 0x9FFF}, // the CJK Unified Ideographs block, - {0x3400, 0x4DBF}, // the CJK Unified Ideographs Externsion A block, - {0xF900, 0xFAFF}, // the CJK Compatibility Ideographs block, - {0x20000, 0x2FFFF}, // the Supplementary Ideographic Plane, - {0x30000, 0x3FFFF}, // the Tertiary Ideographic Plane, - } { - for r := b.lo; r <= b.hi; r++ { - f(r, tagWide, 0) - } - } - - inverse := map[rune]rune{} - maps := map[string]bool{ - "<wide>": true, - "<narrow>": true, - } - - // We cannot reuse package norm's decomposition, as we need an unexpanded - // decomposition. We make use of the opportunity to verify that the - // decomposition type is as expected. - ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - s := strings.SplitN(p.String(ucd.DecompMapping), " ", 2) - if !maps[s[0]] { - return - } - x, err := strconv.ParseUint(s[1], 16, 32) - if err != nil { - log.Fatalf("Error parsing rune %q", s[1]) - } - if inverse[r] != 0 || inverse[rune(x)] != 0 { - log.Fatalf("Circular dependency in mapping between %U and %U", r, x) - } - inverse[r] = rune(x) - inverse[rune(x)] = r - }) - - // <rune range>;<type> - ucd.Parse(gen.OpenUCDFile("EastAsianWidth.txt"), func(p *ucd.Parser) { - tag, ok := typeMap[p.String(1)] - if !ok { - log.Fatalf("Unknown width type %q", p.String(1)) - } - r := p.Rune(0) - alt, ok := inverse[r] - if tag == tagFullwidth || tag == tagHalfwidth && r != wonSign { - tag |= tagNeedsFold - if !ok { - log.Fatalf("Narrow or wide rune %U has no decomposition", r) - } - } - f(r, tag, alt) - }) -} diff --git a/vendor/golang.org/x/text/width/example_test.go b/vendor/golang.org/x/text/width/example_test.go deleted file mode 100644 index 62adba660..000000000 --- a/vendor/golang.org/x/text/width/example_test.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package width_test - -import ( - "fmt" - - "golang.org/x/text/width" -) - -func ExampleTransformer_fold() { - s := "abヲ₩○¥A" - f := width.Fold.String(s) - fmt.Printf("%U: %s\n", []rune(s), s) - fmt.Printf("%U: %s\n", []rune(f), f) - - // Output: - // [U+0061 U+0062 U+FF66 U+FFE6 U+FFEE U+FFE5 U+FF21]: abヲ₩○¥A - // [U+0061 U+0062 U+30F2 U+20A9 U+25CB U+00A5 U+0041]: abヲ₩○¥A -} - -func ExampleTransformer_widen() { - s := "ab¥ヲ₩○" - w := width.Widen.String(s) - fmt.Printf("%U: %s\n", []rune(s), s) - fmt.Printf("%U: %s\n", []rune(w), w) - - // Output: - // [U+0061 U+0062 U+00A5 U+FF66 U+20A9 U+FFEE]: ab¥ヲ₩○ - // [U+FF41 U+FF42 U+FFE5 U+30F2 U+FFE6 U+25CB]: ab¥ヲ₩○ -} - -func ExampleTransformer_narrow() { - s := "abヲ₩○¥A" - n := width.Narrow.String(s) - fmt.Printf("%U: %s\n", []rune(s), s) - fmt.Printf("%U: %s\n", []rune(n), n) - - // Ambiguous characters with a halfwidth equivalent get mapped as well. - s = "←" - n = width.Narrow.String(s) - fmt.Printf("%U: %s\n", []rune(s), s) - fmt.Printf("%U: %s\n", []rune(n), n) - - // Output: - // [U+0061 U+0062 U+30F2 U+FFE6 U+25CB U+FFE5 U+FF21]: abヲ₩○¥A - // [U+0061 U+0062 U+FF66 U+20A9 U+FFEE U+00A5 U+0041]: abヲ₩○¥A - // [U+2190]: ← - // [U+FFE9]: ← -} diff --git a/vendor/golang.org/x/text/width/gen.go b/vendor/golang.org/x/text/width/gen.go deleted file mode 100644 index 03d9f99ad..000000000 --- a/vendor/golang.org/x/text/width/gen.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// This program generates the trie for width operations. The generated table -// includes width category information as well as the normalization mappings. -package main - -import ( - "bytes" - "fmt" - "io" - "log" - "math" - "unicode/utf8" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" -) - -// See gen_common.go for flags. - -func main() { - gen.Init() - genTables() - genTests() - gen.Repackage("gen_trieval.go", "trieval.go", "width") - gen.Repackage("gen_common.go", "common_test.go", "width") -} - -func genTables() { - t := triegen.NewTrie("width") - // fold and inverse mappings. See mapComment for a description of the format - // of each entry. Add dummy value to make an index of 0 mean no mapping. - inverse := [][4]byte{{}} - mapping := map[[4]byte]int{[4]byte{}: 0} - - getWidthData(func(r rune, tag elem, alt rune) { - idx := 0 - if alt != 0 { - var buf [4]byte - buf[0] = byte(utf8.EncodeRune(buf[1:], alt)) - s := string(r) - buf[buf[0]] ^= s[len(s)-1] - var ok bool - if idx, ok = mapping[buf]; !ok { - idx = len(mapping) - if idx > math.MaxUint8 { - log.Fatalf("Index %d does not fit in a byte.", idx) - } - mapping[buf] = idx - inverse = append(inverse, buf) - } - } - t.Insert(r, uint64(tag|elem(idx))) - }) - - w := &bytes.Buffer{} - gen.WriteUnicodeVersion(w) - - sz, err := t.Gen(w) - if err != nil { - log.Fatal(err) - } - - sz += writeMappings(w, inverse) - - fmt.Fprintf(w, "// Total table size %d bytes (%dKiB)\n", sz, sz/1024) - - gen.WriteGoFile(*outputFile, "width", w.Bytes()) -} - -const inverseDataComment = ` -// inverseData contains 4-byte entries of the following format: -// <length> <modified UTF-8-encoded rune> <0 padding> -// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the -// UTF-8 encoding of the original rune. Mappings often have the following -// pattern: -// A -> A (U+FF21 -> U+0041) -// B -> B (U+FF22 -> U+0042) -// ... -// By xor-ing the last byte the same entry can be shared by many mappings. This -// reduces the total number of distinct entries by about two thirds. -// The resulting entry for the aforementioned mappings is -// { 0x01, 0xE0, 0x00, 0x00 } -// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get -// E0 ^ A1 = 41. -// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get -// E0 ^ A2 = 42. -// Note that because of the xor-ing, the byte sequence stored in the entry is -// not valid UTF-8.` - -func writeMappings(w io.Writer, data [][4]byte) int { - fmt.Fprintln(w, inverseDataComment) - fmt.Fprintf(w, "var inverseData = [%d][4]byte{\n", len(data)) - for _, x := range data { - fmt.Fprintf(w, "{ 0x%02x, 0x%02x, 0x%02x, 0x%02x },\n", x[0], x[1], x[2], x[3]) - } - fmt.Fprintln(w, "}") - return len(data) * 4 -} - -func genTests() { - w := &bytes.Buffer{} - fmt.Fprintf(w, "\nvar mapRunes = map[rune]struct{r rune; e elem}{\n") - getWidthData(func(r rune, tag elem, alt rune) { - if alt != 0 { - fmt.Fprintf(w, "\t0x%X: {0x%X, 0x%X},\n", r, alt, tag) - } - }) - fmt.Fprintln(w, "}") - gen.WriteGoFile("runes_test.go", "width", w.Bytes()) -} diff --git a/vendor/golang.org/x/text/width/gen_common.go b/vendor/golang.org/x/text/width/gen_common.go deleted file mode 100644 index 601e75268..000000000 --- a/vendor/golang.org/x/text/width/gen_common.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This code is shared between the main code generator and the test code. - -import ( - "flag" - "log" - "strconv" - "strings" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/ucd" -) - -var ( - outputFile = flag.String("out", "tables.go", "output file") -) - -var typeMap = map[string]elem{ - "A": tagAmbiguous, - "N": tagNeutral, - "Na": tagNarrow, - "W": tagWide, - "F": tagFullwidth, - "H": tagHalfwidth, -} - -// getWidthData calls f for every entry for which it is defined. -// -// f may be called multiple times for the same rune. The last call to f is the -// correct value. f is not called for all runes. The default tag type is -// Neutral. -func getWidthData(f func(r rune, tag elem, alt rune)) { - // Set the default values for Unified Ideographs. In line with Annex 11, - // we encode full ranges instead of the defined runes in Unified_Ideograph. - for _, b := range []struct{ lo, hi rune }{ - {0x4E00, 0x9FFF}, // the CJK Unified Ideographs block, - {0x3400, 0x4DBF}, // the CJK Unified Ideographs Externsion A block, - {0xF900, 0xFAFF}, // the CJK Compatibility Ideographs block, - {0x20000, 0x2FFFF}, // the Supplementary Ideographic Plane, - {0x30000, 0x3FFFF}, // the Tertiary Ideographic Plane, - } { - for r := b.lo; r <= b.hi; r++ { - f(r, tagWide, 0) - } - } - - inverse := map[rune]rune{} - maps := map[string]bool{ - "<wide>": true, - "<narrow>": true, - } - - // We cannot reuse package norm's decomposition, as we need an unexpanded - // decomposition. We make use of the opportunity to verify that the - // decomposition type is as expected. - ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - s := strings.SplitN(p.String(ucd.DecompMapping), " ", 2) - if !maps[s[0]] { - return - } - x, err := strconv.ParseUint(s[1], 16, 32) - if err != nil { - log.Fatalf("Error parsing rune %q", s[1]) - } - if inverse[r] != 0 || inverse[rune(x)] != 0 { - log.Fatalf("Circular dependency in mapping between %U and %U", r, x) - } - inverse[r] = rune(x) - inverse[rune(x)] = r - }) - - // <rune range>;<type> - ucd.Parse(gen.OpenUCDFile("EastAsianWidth.txt"), func(p *ucd.Parser) { - tag, ok := typeMap[p.String(1)] - if !ok { - log.Fatalf("Unknown width type %q", p.String(1)) - } - r := p.Rune(0) - alt, ok := inverse[r] - if tag == tagFullwidth || tag == tagHalfwidth && r != wonSign { - tag |= tagNeedsFold - if !ok { - log.Fatalf("Narrow or wide rune %U has no decomposition", r) - } - } - f(r, tag, alt) - }) -} diff --git a/vendor/golang.org/x/text/width/gen_trieval.go b/vendor/golang.org/x/text/width/gen_trieval.go deleted file mode 100644 index c17334aa6..000000000 --- a/vendor/golang.org/x/text/width/gen_trieval.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// elem is an entry of the width trie. The high byte is used to encode the type -// of the rune. The low byte is used to store the index to a mapping entry in -// the inverseData array. -type elem uint16 - -const ( - tagNeutral elem = iota << typeShift - tagAmbiguous - tagWide - tagNarrow - tagFullwidth - tagHalfwidth -) - -const ( - numTypeBits = 3 - typeShift = 16 - numTypeBits - - // tagNeedsFold is true for all fullwidth and halfwidth runes except for - // the Won sign U+20A9. - tagNeedsFold = 0x1000 - - // The Korean Won sign is halfwidth, but SHOULD NOT be mapped to a wide - // variant. - wonSign rune = 0x20A9 -) diff --git a/vendor/golang.org/x/text/width/kind_string.go b/vendor/golang.org/x/text/width/kind_string.go deleted file mode 100644 index 49bfbf726..000000000 --- a/vendor/golang.org/x/text/width/kind_string.go +++ /dev/null @@ -1,16 +0,0 @@ -// Code generated by "stringer -type=Kind"; DO NOT EDIT. - -package width - -import "fmt" - -const _Kind_name = "NeutralEastAsianAmbiguousEastAsianWideEastAsianNarrowEastAsianFullwidthEastAsianHalfwidth" - -var _Kind_index = [...]uint8{0, 7, 25, 38, 53, 71, 89} - -func (i Kind) String() string { - if i < 0 || i >= Kind(len(_Kind_index)-1) { - return fmt.Sprintf("Kind(%d)", i) - } - return _Kind_name[_Kind_index[i]:_Kind_index[i+1]] -} diff --git a/vendor/golang.org/x/text/width/runes_test.go b/vendor/golang.org/x/text/width/runes_test.go deleted file mode 100644 index 587dab4ed..000000000 --- a/vendor/golang.org/x/text/width/runes_test.go +++ /dev/null @@ -1,461 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package width - -var mapRunes = map[rune]struct { - r rune - e elem -}{ - 0x20: {0x3000, 0x6000}, - 0x21: {0xFF01, 0x6000}, - 0x22: {0xFF02, 0x6000}, - 0x23: {0xFF03, 0x6000}, - 0x24: {0xFF04, 0x6000}, - 0x25: {0xFF05, 0x6000}, - 0x26: {0xFF06, 0x6000}, - 0x27: {0xFF07, 0x6000}, - 0x28: {0xFF08, 0x6000}, - 0x29: {0xFF09, 0x6000}, - 0x2A: {0xFF0A, 0x6000}, - 0x2B: {0xFF0B, 0x6000}, - 0x2C: {0xFF0C, 0x6000}, - 0x2D: {0xFF0D, 0x6000}, - 0x2E: {0xFF0E, 0x6000}, - 0x2F: {0xFF0F, 0x6000}, - 0x30: {0xFF10, 0x6000}, - 0x31: {0xFF11, 0x6000}, - 0x32: {0xFF12, 0x6000}, - 0x33: {0xFF13, 0x6000}, - 0x34: {0xFF14, 0x6000}, - 0x35: {0xFF15, 0x6000}, - 0x36: {0xFF16, 0x6000}, - 0x37: {0xFF17, 0x6000}, - 0x38: {0xFF18, 0x6000}, - 0x39: {0xFF19, 0x6000}, - 0x3A: {0xFF1A, 0x6000}, - 0x3B: {0xFF1B, 0x6000}, - 0x3C: {0xFF1C, 0x6000}, - 0x3D: {0xFF1D, 0x6000}, - 0x3E: {0xFF1E, 0x6000}, - 0x3F: {0xFF1F, 0x6000}, - 0x40: {0xFF20, 0x6000}, - 0x41: {0xFF21, 0x6000}, - 0x42: {0xFF22, 0x6000}, - 0x43: {0xFF23, 0x6000}, - 0x44: {0xFF24, 0x6000}, - 0x45: {0xFF25, 0x6000}, - 0x46: {0xFF26, 0x6000}, - 0x47: {0xFF27, 0x6000}, - 0x48: {0xFF28, 0x6000}, - 0x49: {0xFF29, 0x6000}, - 0x4A: {0xFF2A, 0x6000}, - 0x4B: {0xFF2B, 0x6000}, - 0x4C: {0xFF2C, 0x6000}, - 0x4D: {0xFF2D, 0x6000}, - 0x4E: {0xFF2E, 0x6000}, - 0x4F: {0xFF2F, 0x6000}, - 0x50: {0xFF30, 0x6000}, - 0x51: {0xFF31, 0x6000}, - 0x52: {0xFF32, 0x6000}, - 0x53: {0xFF33, 0x6000}, - 0x54: {0xFF34, 0x6000}, - 0x55: {0xFF35, 0x6000}, - 0x56: {0xFF36, 0x6000}, - 0x57: {0xFF37, 0x6000}, - 0x58: {0xFF38, 0x6000}, - 0x59: {0xFF39, 0x6000}, - 0x5A: {0xFF3A, 0x6000}, - 0x5B: {0xFF3B, 0x6000}, - 0x5C: {0xFF3C, 0x6000}, - 0x5D: {0xFF3D, 0x6000}, - 0x5E: {0xFF3E, 0x6000}, - 0x5F: {0xFF3F, 0x6000}, - 0x60: {0xFF40, 0x6000}, - 0x61: {0xFF41, 0x6000}, - 0x62: {0xFF42, 0x6000}, - 0x63: {0xFF43, 0x6000}, - 0x64: {0xFF44, 0x6000}, - 0x65: {0xFF45, 0x6000}, - 0x66: {0xFF46, 0x6000}, - 0x67: {0xFF47, 0x6000}, - 0x68: {0xFF48, 0x6000}, - 0x69: {0xFF49, 0x6000}, - 0x6A: {0xFF4A, 0x6000}, - 0x6B: {0xFF4B, 0x6000}, - 0x6C: {0xFF4C, 0x6000}, - 0x6D: {0xFF4D, 0x6000}, - 0x6E: {0xFF4E, 0x6000}, - 0x6F: {0xFF4F, 0x6000}, - 0x70: {0xFF50, 0x6000}, - 0x71: {0xFF51, 0x6000}, - 0x72: {0xFF52, 0x6000}, - 0x73: {0xFF53, 0x6000}, - 0x74: {0xFF54, 0x6000}, - 0x75: {0xFF55, 0x6000}, - 0x76: {0xFF56, 0x6000}, - 0x77: {0xFF57, 0x6000}, - 0x78: {0xFF58, 0x6000}, - 0x79: {0xFF59, 0x6000}, - 0x7A: {0xFF5A, 0x6000}, - 0x7B: {0xFF5B, 0x6000}, - 0x7C: {0xFF5C, 0x6000}, - 0x7D: {0xFF5D, 0x6000}, - 0x7E: {0xFF5E, 0x6000}, - 0xA2: {0xFFE0, 0x6000}, - 0xA3: {0xFFE1, 0x6000}, - 0xA5: {0xFFE5, 0x6000}, - 0xA6: {0xFFE4, 0x6000}, - 0xAC: {0xFFE2, 0x6000}, - 0xAF: {0xFFE3, 0x6000}, - 0x20A9: {0xFFE6, 0xA000}, - 0x2190: {0xFFE9, 0x2000}, - 0x2191: {0xFFEA, 0x2000}, - 0x2192: {0xFFEB, 0x2000}, - 0x2193: {0xFFEC, 0x2000}, - 0x2502: {0xFFE8, 0x2000}, - 0x25A0: {0xFFED, 0x2000}, - 0x25CB: {0xFFEE, 0x2000}, - 0x2985: {0xFF5F, 0x6000}, - 0x2986: {0xFF60, 0x6000}, - 0x3000: {0x20, 0x9000}, - 0x3001: {0xFF64, 0x4000}, - 0x3002: {0xFF61, 0x4000}, - 0x300C: {0xFF62, 0x4000}, - 0x300D: {0xFF63, 0x4000}, - 0x3099: {0xFF9E, 0x4000}, - 0x309A: {0xFF9F, 0x4000}, - 0x30A1: {0xFF67, 0x4000}, - 0x30A2: {0xFF71, 0x4000}, - 0x30A3: {0xFF68, 0x4000}, - 0x30A4: {0xFF72, 0x4000}, - 0x30A5: {0xFF69, 0x4000}, - 0x30A6: {0xFF73, 0x4000}, - 0x30A7: {0xFF6A, 0x4000}, - 0x30A8: {0xFF74, 0x4000}, - 0x30A9: {0xFF6B, 0x4000}, - 0x30AA: {0xFF75, 0x4000}, - 0x30AB: {0xFF76, 0x4000}, - 0x30AD: {0xFF77, 0x4000}, - 0x30AF: {0xFF78, 0x4000}, - 0x30B1: {0xFF79, 0x4000}, - 0x30B3: {0xFF7A, 0x4000}, - 0x30B5: {0xFF7B, 0x4000}, - 0x30B7: {0xFF7C, 0x4000}, - 0x30B9: {0xFF7D, 0x4000}, - 0x30BB: {0xFF7E, 0x4000}, - 0x30BD: {0xFF7F, 0x4000}, - 0x30BF: {0xFF80, 0x4000}, - 0x30C1: {0xFF81, 0x4000}, - 0x30C3: {0xFF6F, 0x4000}, - 0x30C4: {0xFF82, 0x4000}, - 0x30C6: {0xFF83, 0x4000}, - 0x30C8: {0xFF84, 0x4000}, - 0x30CA: {0xFF85, 0x4000}, - 0x30CB: {0xFF86, 0x4000}, - 0x30CC: {0xFF87, 0x4000}, - 0x30CD: {0xFF88, 0x4000}, - 0x30CE: {0xFF89, 0x4000}, - 0x30CF: {0xFF8A, 0x4000}, - 0x30D2: {0xFF8B, 0x4000}, - 0x30D5: {0xFF8C, 0x4000}, - 0x30D8: {0xFF8D, 0x4000}, - 0x30DB: {0xFF8E, 0x4000}, - 0x30DE: {0xFF8F, 0x4000}, - 0x30DF: {0xFF90, 0x4000}, - 0x30E0: {0xFF91, 0x4000}, - 0x30E1: {0xFF92, 0x4000}, - 0x30E2: {0xFF93, 0x4000}, - 0x30E3: {0xFF6C, 0x4000}, - 0x30E4: {0xFF94, 0x4000}, - 0x30E5: {0xFF6D, 0x4000}, - 0x30E6: {0xFF95, 0x4000}, - 0x30E7: {0xFF6E, 0x4000}, - 0x30E8: {0xFF96, 0x4000}, - 0x30E9: {0xFF97, 0x4000}, - 0x30EA: {0xFF98, 0x4000}, - 0x30EB: {0xFF99, 0x4000}, - 0x30EC: {0xFF9A, 0x4000}, - 0x30ED: {0xFF9B, 0x4000}, - 0x30EF: {0xFF9C, 0x4000}, - 0x30F2: {0xFF66, 0x4000}, - 0x30F3: {0xFF9D, 0x4000}, - 0x30FB: {0xFF65, 0x4000}, - 0x30FC: {0xFF70, 0x4000}, - 0x3131: {0xFFA1, 0x4000}, - 0x3132: {0xFFA2, 0x4000}, - 0x3133: {0xFFA3, 0x4000}, - 0x3134: {0xFFA4, 0x4000}, - 0x3135: {0xFFA5, 0x4000}, - 0x3136: {0xFFA6, 0x4000}, - 0x3137: {0xFFA7, 0x4000}, - 0x3138: {0xFFA8, 0x4000}, - 0x3139: {0xFFA9, 0x4000}, - 0x313A: {0xFFAA, 0x4000}, - 0x313B: {0xFFAB, 0x4000}, - 0x313C: {0xFFAC, 0x4000}, - 0x313D: {0xFFAD, 0x4000}, - 0x313E: {0xFFAE, 0x4000}, - 0x313F: {0xFFAF, 0x4000}, - 0x3140: {0xFFB0, 0x4000}, - 0x3141: {0xFFB1, 0x4000}, - 0x3142: {0xFFB2, 0x4000}, - 0x3143: {0xFFB3, 0x4000}, - 0x3144: {0xFFB4, 0x4000}, - 0x3145: {0xFFB5, 0x4000}, - 0x3146: {0xFFB6, 0x4000}, - 0x3147: {0xFFB7, 0x4000}, - 0x3148: {0xFFB8, 0x4000}, - 0x3149: {0xFFB9, 0x4000}, - 0x314A: {0xFFBA, 0x4000}, - 0x314B: {0xFFBB, 0x4000}, - 0x314C: {0xFFBC, 0x4000}, - 0x314D: {0xFFBD, 0x4000}, - 0x314E: {0xFFBE, 0x4000}, - 0x314F: {0xFFC2, 0x4000}, - 0x3150: {0xFFC3, 0x4000}, - 0x3151: {0xFFC4, 0x4000}, - 0x3152: {0xFFC5, 0x4000}, - 0x3153: {0xFFC6, 0x4000}, - 0x3154: {0xFFC7, 0x4000}, - 0x3155: {0xFFCA, 0x4000}, - 0x3156: {0xFFCB, 0x4000}, - 0x3157: {0xFFCC, 0x4000}, - 0x3158: {0xFFCD, 0x4000}, - 0x3159: {0xFFCE, 0x4000}, - 0x315A: {0xFFCF, 0x4000}, - 0x315B: {0xFFD2, 0x4000}, - 0x315C: {0xFFD3, 0x4000}, - 0x315D: {0xFFD4, 0x4000}, - 0x315E: {0xFFD5, 0x4000}, - 0x315F: {0xFFD6, 0x4000}, - 0x3160: {0xFFD7, 0x4000}, - 0x3161: {0xFFDA, 0x4000}, - 0x3162: {0xFFDB, 0x4000}, - 0x3163: {0xFFDC, 0x4000}, - 0x3164: {0xFFA0, 0x4000}, - 0xFF01: {0x21, 0x9000}, - 0xFF02: {0x22, 0x9000}, - 0xFF03: {0x23, 0x9000}, - 0xFF04: {0x24, 0x9000}, - 0xFF05: {0x25, 0x9000}, - 0xFF06: {0x26, 0x9000}, - 0xFF07: {0x27, 0x9000}, - 0xFF08: {0x28, 0x9000}, - 0xFF09: {0x29, 0x9000}, - 0xFF0A: {0x2A, 0x9000}, - 0xFF0B: {0x2B, 0x9000}, - 0xFF0C: {0x2C, 0x9000}, - 0xFF0D: {0x2D, 0x9000}, - 0xFF0E: {0x2E, 0x9000}, - 0xFF0F: {0x2F, 0x9000}, - 0xFF10: {0x30, 0x9000}, - 0xFF11: {0x31, 0x9000}, - 0xFF12: {0x32, 0x9000}, - 0xFF13: {0x33, 0x9000}, - 0xFF14: {0x34, 0x9000}, - 0xFF15: {0x35, 0x9000}, - 0xFF16: {0x36, 0x9000}, - 0xFF17: {0x37, 0x9000}, - 0xFF18: {0x38, 0x9000}, - 0xFF19: {0x39, 0x9000}, - 0xFF1A: {0x3A, 0x9000}, - 0xFF1B: {0x3B, 0x9000}, - 0xFF1C: {0x3C, 0x9000}, - 0xFF1D: {0x3D, 0x9000}, - 0xFF1E: {0x3E, 0x9000}, - 0xFF1F: {0x3F, 0x9000}, - 0xFF20: {0x40, 0x9000}, - 0xFF21: {0x41, 0x9000}, - 0xFF22: {0x42, 0x9000}, - 0xFF23: {0x43, 0x9000}, - 0xFF24: {0x44, 0x9000}, - 0xFF25: {0x45, 0x9000}, - 0xFF26: {0x46, 0x9000}, - 0xFF27: {0x47, 0x9000}, - 0xFF28: {0x48, 0x9000}, - 0xFF29: {0x49, 0x9000}, - 0xFF2A: {0x4A, 0x9000}, - 0xFF2B: {0x4B, 0x9000}, - 0xFF2C: {0x4C, 0x9000}, - 0xFF2D: {0x4D, 0x9000}, - 0xFF2E: {0x4E, 0x9000}, - 0xFF2F: {0x4F, 0x9000}, - 0xFF30: {0x50, 0x9000}, - 0xFF31: {0x51, 0x9000}, - 0xFF32: {0x52, 0x9000}, - 0xFF33: {0x53, 0x9000}, - 0xFF34: {0x54, 0x9000}, - 0xFF35: {0x55, 0x9000}, - 0xFF36: {0x56, 0x9000}, - 0xFF37: {0x57, 0x9000}, - 0xFF38: {0x58, 0x9000}, - 0xFF39: {0x59, 0x9000}, - 0xFF3A: {0x5A, 0x9000}, - 0xFF3B: {0x5B, 0x9000}, - 0xFF3C: {0x5C, 0x9000}, - 0xFF3D: {0x5D, 0x9000}, - 0xFF3E: {0x5E, 0x9000}, - 0xFF3F: {0x5F, 0x9000}, - 0xFF40: {0x60, 0x9000}, - 0xFF41: {0x61, 0x9000}, - 0xFF42: {0x62, 0x9000}, - 0xFF43: {0x63, 0x9000}, - 0xFF44: {0x64, 0x9000}, - 0xFF45: {0x65, 0x9000}, - 0xFF46: {0x66, 0x9000}, - 0xFF47: {0x67, 0x9000}, - 0xFF48: {0x68, 0x9000}, - 0xFF49: {0x69, 0x9000}, - 0xFF4A: {0x6A, 0x9000}, - 0xFF4B: {0x6B, 0x9000}, - 0xFF4C: {0x6C, 0x9000}, - 0xFF4D: {0x6D, 0x9000}, - 0xFF4E: {0x6E, 0x9000}, - 0xFF4F: {0x6F, 0x9000}, - 0xFF50: {0x70, 0x9000}, - 0xFF51: {0x71, 0x9000}, - 0xFF52: {0x72, 0x9000}, - 0xFF53: {0x73, 0x9000}, - 0xFF54: {0x74, 0x9000}, - 0xFF55: {0x75, 0x9000}, - 0xFF56: {0x76, 0x9000}, - 0xFF57: {0x77, 0x9000}, - 0xFF58: {0x78, 0x9000}, - 0xFF59: {0x79, 0x9000}, - 0xFF5A: {0x7A, 0x9000}, - 0xFF5B: {0x7B, 0x9000}, - 0xFF5C: {0x7C, 0x9000}, - 0xFF5D: {0x7D, 0x9000}, - 0xFF5E: {0x7E, 0x9000}, - 0xFF5F: {0x2985, 0x9000}, - 0xFF60: {0x2986, 0x9000}, - 0xFF61: {0x3002, 0xB000}, - 0xFF62: {0x300C, 0xB000}, - 0xFF63: {0x300D, 0xB000}, - 0xFF64: {0x3001, 0xB000}, - 0xFF65: {0x30FB, 0xB000}, - 0xFF66: {0x30F2, 0xB000}, - 0xFF67: {0x30A1, 0xB000}, - 0xFF68: {0x30A3, 0xB000}, - 0xFF69: {0x30A5, 0xB000}, - 0xFF6A: {0x30A7, 0xB000}, - 0xFF6B: {0x30A9, 0xB000}, - 0xFF6C: {0x30E3, 0xB000}, - 0xFF6D: {0x30E5, 0xB000}, - 0xFF6E: {0x30E7, 0xB000}, - 0xFF6F: {0x30C3, 0xB000}, - 0xFF70: {0x30FC, 0xB000}, - 0xFF71: {0x30A2, 0xB000}, - 0xFF72: {0x30A4, 0xB000}, - 0xFF73: {0x30A6, 0xB000}, - 0xFF74: {0x30A8, 0xB000}, - 0xFF75: {0x30AA, 0xB000}, - 0xFF76: {0x30AB, 0xB000}, - 0xFF77: {0x30AD, 0xB000}, - 0xFF78: {0x30AF, 0xB000}, - 0xFF79: {0x30B1, 0xB000}, - 0xFF7A: {0x30B3, 0xB000}, - 0xFF7B: {0x30B5, 0xB000}, - 0xFF7C: {0x30B7, 0xB000}, - 0xFF7D: {0x30B9, 0xB000}, - 0xFF7E: {0x30BB, 0xB000}, - 0xFF7F: {0x30BD, 0xB000}, - 0xFF80: {0x30BF, 0xB000}, - 0xFF81: {0x30C1, 0xB000}, - 0xFF82: {0x30C4, 0xB000}, - 0xFF83: {0x30C6, 0xB000}, - 0xFF84: {0x30C8, 0xB000}, - 0xFF85: {0x30CA, 0xB000}, - 0xFF86: {0x30CB, 0xB000}, - 0xFF87: {0x30CC, 0xB000}, - 0xFF88: {0x30CD, 0xB000}, - 0xFF89: {0x30CE, 0xB000}, - 0xFF8A: {0x30CF, 0xB000}, - 0xFF8B: {0x30D2, 0xB000}, - 0xFF8C: {0x30D5, 0xB000}, - 0xFF8D: {0x30D8, 0xB000}, - 0xFF8E: {0x30DB, 0xB000}, - 0xFF8F: {0x30DE, 0xB000}, - 0xFF90: {0x30DF, 0xB000}, - 0xFF91: {0x30E0, 0xB000}, - 0xFF92: {0x30E1, 0xB000}, - 0xFF93: {0x30E2, 0xB000}, - 0xFF94: {0x30E4, 0xB000}, - 0xFF95: {0x30E6, 0xB000}, - 0xFF96: {0x30E8, 0xB000}, - 0xFF97: {0x30E9, 0xB000}, - 0xFF98: {0x30EA, 0xB000}, - 0xFF99: {0x30EB, 0xB000}, - 0xFF9A: {0x30EC, 0xB000}, - 0xFF9B: {0x30ED, 0xB000}, - 0xFF9C: {0x30EF, 0xB000}, - 0xFF9D: {0x30F3, 0xB000}, - 0xFF9E: {0x3099, 0xB000}, - 0xFF9F: {0x309A, 0xB000}, - 0xFFA0: {0x3164, 0xB000}, - 0xFFA1: {0x3131, 0xB000}, - 0xFFA2: {0x3132, 0xB000}, - 0xFFA3: {0x3133, 0xB000}, - 0xFFA4: {0x3134, 0xB000}, - 0xFFA5: {0x3135, 0xB000}, - 0xFFA6: {0x3136, 0xB000}, - 0xFFA7: {0x3137, 0xB000}, - 0xFFA8: {0x3138, 0xB000}, - 0xFFA9: {0x3139, 0xB000}, - 0xFFAA: {0x313A, 0xB000}, - 0xFFAB: {0x313B, 0xB000}, - 0xFFAC: {0x313C, 0xB000}, - 0xFFAD: {0x313D, 0xB000}, - 0xFFAE: {0x313E, 0xB000}, - 0xFFAF: {0x313F, 0xB000}, - 0xFFB0: {0x3140, 0xB000}, - 0xFFB1: {0x3141, 0xB000}, - 0xFFB2: {0x3142, 0xB000}, - 0xFFB3: {0x3143, 0xB000}, - 0xFFB4: {0x3144, 0xB000}, - 0xFFB5: {0x3145, 0xB000}, - 0xFFB6: {0x3146, 0xB000}, - 0xFFB7: {0x3147, 0xB000}, - 0xFFB8: {0x3148, 0xB000}, - 0xFFB9: {0x3149, 0xB000}, - 0xFFBA: {0x314A, 0xB000}, - 0xFFBB: {0x314B, 0xB000}, - 0xFFBC: {0x314C, 0xB000}, - 0xFFBD: {0x314D, 0xB000}, - 0xFFBE: {0x314E, 0xB000}, - 0xFFC2: {0x314F, 0xB000}, - 0xFFC3: {0x3150, 0xB000}, - 0xFFC4: {0x3151, 0xB000}, - 0xFFC5: {0x3152, 0xB000}, - 0xFFC6: {0x3153, 0xB000}, - 0xFFC7: {0x3154, 0xB000}, - 0xFFCA: {0x3155, 0xB000}, - 0xFFCB: {0x3156, 0xB000}, - 0xFFCC: {0x3157, 0xB000}, - 0xFFCD: {0x3158, 0xB000}, - 0xFFCE: {0x3159, 0xB000}, - 0xFFCF: {0x315A, 0xB000}, - 0xFFD2: {0x315B, 0xB000}, - 0xFFD3: {0x315C, 0xB000}, - 0xFFD4: {0x315D, 0xB000}, - 0xFFD5: {0x315E, 0xB000}, - 0xFFD6: {0x315F, 0xB000}, - 0xFFD7: {0x3160, 0xB000}, - 0xFFDA: {0x3161, 0xB000}, - 0xFFDB: {0x3162, 0xB000}, - 0xFFDC: {0x3163, 0xB000}, - 0xFFE0: {0xA2, 0x9000}, - 0xFFE1: {0xA3, 0x9000}, - 0xFFE2: {0xAC, 0x9000}, - 0xFFE3: {0xAF, 0x9000}, - 0xFFE4: {0xA6, 0x9000}, - 0xFFE5: {0xA5, 0x9000}, - 0xFFE6: {0x20A9, 0x9000}, - 0xFFE8: {0x2502, 0xB000}, - 0xFFE9: {0x2190, 0xB000}, - 0xFFEA: {0x2191, 0xB000}, - 0xFFEB: {0x2192, 0xB000}, - 0xFFEC: {0x2193, 0xB000}, - 0xFFED: {0x25A0, 0xB000}, - 0xFFEE: {0x25CB, 0xB000}, -} diff --git a/vendor/golang.org/x/text/width/tables.go b/vendor/golang.org/x/text/width/tables.go deleted file mode 100644 index e21f0b838..000000000 --- a/vendor/golang.org/x/text/width/tables.go +++ /dev/null @@ -1,1284 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package width - -// UnicodeVersion is the Unicode version from which the tables in this package are derived. -const UnicodeVersion = "9.0.0" - -// lookup returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *widthTrie) lookup(s []byte) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return widthValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := widthIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := widthIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = widthIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := widthIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = widthIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = widthIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *widthTrie) lookupUnsafe(s []byte) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return widthValues[c0] - } - i := widthIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = widthIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = widthIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// lookupString returns the trie value for the first UTF-8 encoding in s and -// the width in bytes of this encoding. The size will be 0 if s does not -// hold enough bytes to complete the encoding. len(s) must be greater than 0. -func (t *widthTrie) lookupString(s string) (v uint16, sz int) { - c0 := s[0] - switch { - case c0 < 0x80: // is ASCII - return widthValues[c0], 1 - case c0 < 0xC2: - return 0, 1 // Illegal UTF-8: not a starter, not ASCII. - case c0 < 0xE0: // 2-byte UTF-8 - if len(s) < 2 { - return 0, 0 - } - i := widthIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c1), 2 - case c0 < 0xF0: // 3-byte UTF-8 - if len(s) < 3 { - return 0, 0 - } - i := widthIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = widthIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c2), 3 - case c0 < 0xF8: // 4-byte UTF-8 - if len(s) < 4 { - return 0, 0 - } - i := widthIndex[c0] - c1 := s[1] - if c1 < 0x80 || 0xC0 <= c1 { - return 0, 1 // Illegal UTF-8: not a continuation byte. - } - o := uint32(i)<<6 + uint32(c1) - i = widthIndex[o] - c2 := s[2] - if c2 < 0x80 || 0xC0 <= c2 { - return 0, 2 // Illegal UTF-8: not a continuation byte. - } - o = uint32(i)<<6 + uint32(c2) - i = widthIndex[o] - c3 := s[3] - if c3 < 0x80 || 0xC0 <= c3 { - return 0, 3 // Illegal UTF-8: not a continuation byte. - } - return t.lookupValue(uint32(i), c3), 4 - } - // Illegal rune - return 0, 1 -} - -// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. -// s must start with a full and valid UTF-8 encoded rune. -func (t *widthTrie) lookupStringUnsafe(s string) uint16 { - c0 := s[0] - if c0 < 0x80 { // is ASCII - return widthValues[c0] - } - i := widthIndex[c0] - if c0 < 0xE0 { // 2-byte UTF-8 - return t.lookupValue(uint32(i), s[1]) - } - i = widthIndex[uint32(i)<<6+uint32(s[1])] - if c0 < 0xF0 { // 3-byte UTF-8 - return t.lookupValue(uint32(i), s[2]) - } - i = widthIndex[uint32(i)<<6+uint32(s[2])] - if c0 < 0xF8 { // 4-byte UTF-8 - return t.lookupValue(uint32(i), s[3]) - } - return 0 -} - -// widthTrie. Total size: 14080 bytes (13.75 KiB). Checksum: 3b8aeb3dc03667a3. -type widthTrie struct{} - -func newWidthTrie(i int) *widthTrie { - return &widthTrie{} -} - -// lookupValue determines the type of block n and looks up the value for b. -func (t *widthTrie) lookupValue(n uint32, b byte) uint16 { - switch { - default: - return uint16(widthValues[n<<6+uint32(b)]) - } -} - -// widthValues: 99 blocks, 6336 entries, 12672 bytes -// The third block is the zero block. -var widthValues = [6336]uint16{ - // Block 0x0, offset 0x0 - 0x20: 0x6001, 0x21: 0x6002, 0x22: 0x6002, 0x23: 0x6002, - 0x24: 0x6002, 0x25: 0x6002, 0x26: 0x6002, 0x27: 0x6002, 0x28: 0x6002, 0x29: 0x6002, - 0x2a: 0x6002, 0x2b: 0x6002, 0x2c: 0x6002, 0x2d: 0x6002, 0x2e: 0x6002, 0x2f: 0x6002, - 0x30: 0x6002, 0x31: 0x6002, 0x32: 0x6002, 0x33: 0x6002, 0x34: 0x6002, 0x35: 0x6002, - 0x36: 0x6002, 0x37: 0x6002, 0x38: 0x6002, 0x39: 0x6002, 0x3a: 0x6002, 0x3b: 0x6002, - 0x3c: 0x6002, 0x3d: 0x6002, 0x3e: 0x6002, 0x3f: 0x6002, - // Block 0x1, offset 0x40 - 0x40: 0x6003, 0x41: 0x6003, 0x42: 0x6003, 0x43: 0x6003, 0x44: 0x6003, 0x45: 0x6003, - 0x46: 0x6003, 0x47: 0x6003, 0x48: 0x6003, 0x49: 0x6003, 0x4a: 0x6003, 0x4b: 0x6003, - 0x4c: 0x6003, 0x4d: 0x6003, 0x4e: 0x6003, 0x4f: 0x6003, 0x50: 0x6003, 0x51: 0x6003, - 0x52: 0x6003, 0x53: 0x6003, 0x54: 0x6003, 0x55: 0x6003, 0x56: 0x6003, 0x57: 0x6003, - 0x58: 0x6003, 0x59: 0x6003, 0x5a: 0x6003, 0x5b: 0x6003, 0x5c: 0x6003, 0x5d: 0x6003, - 0x5e: 0x6003, 0x5f: 0x6003, 0x60: 0x6004, 0x61: 0x6004, 0x62: 0x6004, 0x63: 0x6004, - 0x64: 0x6004, 0x65: 0x6004, 0x66: 0x6004, 0x67: 0x6004, 0x68: 0x6004, 0x69: 0x6004, - 0x6a: 0x6004, 0x6b: 0x6004, 0x6c: 0x6004, 0x6d: 0x6004, 0x6e: 0x6004, 0x6f: 0x6004, - 0x70: 0x6004, 0x71: 0x6004, 0x72: 0x6004, 0x73: 0x6004, 0x74: 0x6004, 0x75: 0x6004, - 0x76: 0x6004, 0x77: 0x6004, 0x78: 0x6004, 0x79: 0x6004, 0x7a: 0x6004, 0x7b: 0x6004, - 0x7c: 0x6004, 0x7d: 0x6004, 0x7e: 0x6004, - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xe1: 0x2000, 0xe2: 0x6005, 0xe3: 0x6005, - 0xe4: 0x2000, 0xe5: 0x6006, 0xe6: 0x6005, 0xe7: 0x2000, 0xe8: 0x2000, - 0xea: 0x2000, 0xec: 0x6007, 0xed: 0x2000, 0xee: 0x2000, 0xef: 0x6008, - 0xf0: 0x2000, 0xf1: 0x2000, 0xf2: 0x2000, 0xf3: 0x2000, 0xf4: 0x2000, - 0xf6: 0x2000, 0xf7: 0x2000, 0xf8: 0x2000, 0xf9: 0x2000, 0xfa: 0x2000, - 0xfc: 0x2000, 0xfd: 0x2000, 0xfe: 0x2000, 0xff: 0x2000, - // Block 0x4, offset 0x100 - 0x106: 0x2000, - 0x110: 0x2000, - 0x117: 0x2000, - 0x118: 0x2000, - 0x11e: 0x2000, 0x11f: 0x2000, 0x120: 0x2000, 0x121: 0x2000, - 0x126: 0x2000, 0x128: 0x2000, 0x129: 0x2000, - 0x12a: 0x2000, 0x12c: 0x2000, 0x12d: 0x2000, - 0x130: 0x2000, 0x132: 0x2000, 0x133: 0x2000, - 0x137: 0x2000, 0x138: 0x2000, 0x139: 0x2000, 0x13a: 0x2000, - 0x13c: 0x2000, 0x13e: 0x2000, - // Block 0x5, offset 0x140 - 0x141: 0x2000, - 0x151: 0x2000, - 0x153: 0x2000, - 0x15b: 0x2000, - 0x166: 0x2000, 0x167: 0x2000, - 0x16b: 0x2000, - 0x171: 0x2000, 0x172: 0x2000, 0x173: 0x2000, - 0x178: 0x2000, - 0x17f: 0x2000, - // Block 0x6, offset 0x180 - 0x180: 0x2000, 0x181: 0x2000, 0x182: 0x2000, 0x184: 0x2000, - 0x188: 0x2000, 0x189: 0x2000, 0x18a: 0x2000, 0x18b: 0x2000, - 0x18d: 0x2000, - 0x192: 0x2000, 0x193: 0x2000, - 0x1a6: 0x2000, 0x1a7: 0x2000, - 0x1ab: 0x2000, - // Block 0x7, offset 0x1c0 - 0x1ce: 0x2000, 0x1d0: 0x2000, - 0x1d2: 0x2000, 0x1d4: 0x2000, 0x1d6: 0x2000, - 0x1d8: 0x2000, 0x1da: 0x2000, 0x1dc: 0x2000, - // Block 0x8, offset 0x200 - 0x211: 0x2000, - 0x221: 0x2000, - // Block 0x9, offset 0x240 - 0x244: 0x2000, - 0x247: 0x2000, 0x249: 0x2000, 0x24a: 0x2000, 0x24b: 0x2000, - 0x24d: 0x2000, 0x250: 0x2000, - 0x258: 0x2000, 0x259: 0x2000, 0x25a: 0x2000, 0x25b: 0x2000, 0x25d: 0x2000, - 0x25f: 0x2000, - // Block 0xa, offset 0x280 - 0x280: 0x2000, 0x281: 0x2000, 0x282: 0x2000, 0x283: 0x2000, 0x284: 0x2000, 0x285: 0x2000, - 0x286: 0x2000, 0x287: 0x2000, 0x288: 0x2000, 0x289: 0x2000, 0x28a: 0x2000, 0x28b: 0x2000, - 0x28c: 0x2000, 0x28d: 0x2000, 0x28e: 0x2000, 0x28f: 0x2000, 0x290: 0x2000, 0x291: 0x2000, - 0x292: 0x2000, 0x293: 0x2000, 0x294: 0x2000, 0x295: 0x2000, 0x296: 0x2000, 0x297: 0x2000, - 0x298: 0x2000, 0x299: 0x2000, 0x29a: 0x2000, 0x29b: 0x2000, 0x29c: 0x2000, 0x29d: 0x2000, - 0x29e: 0x2000, 0x29f: 0x2000, 0x2a0: 0x2000, 0x2a1: 0x2000, 0x2a2: 0x2000, 0x2a3: 0x2000, - 0x2a4: 0x2000, 0x2a5: 0x2000, 0x2a6: 0x2000, 0x2a7: 0x2000, 0x2a8: 0x2000, 0x2a9: 0x2000, - 0x2aa: 0x2000, 0x2ab: 0x2000, 0x2ac: 0x2000, 0x2ad: 0x2000, 0x2ae: 0x2000, 0x2af: 0x2000, - 0x2b0: 0x2000, 0x2b1: 0x2000, 0x2b2: 0x2000, 0x2b3: 0x2000, 0x2b4: 0x2000, 0x2b5: 0x2000, - 0x2b6: 0x2000, 0x2b7: 0x2000, 0x2b8: 0x2000, 0x2b9: 0x2000, 0x2ba: 0x2000, 0x2bb: 0x2000, - 0x2bc: 0x2000, 0x2bd: 0x2000, 0x2be: 0x2000, 0x2bf: 0x2000, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x2000, 0x2c1: 0x2000, 0x2c2: 0x2000, 0x2c3: 0x2000, 0x2c4: 0x2000, 0x2c5: 0x2000, - 0x2c6: 0x2000, 0x2c7: 0x2000, 0x2c8: 0x2000, 0x2c9: 0x2000, 0x2ca: 0x2000, 0x2cb: 0x2000, - 0x2cc: 0x2000, 0x2cd: 0x2000, 0x2ce: 0x2000, 0x2cf: 0x2000, 0x2d0: 0x2000, 0x2d1: 0x2000, - 0x2d2: 0x2000, 0x2d3: 0x2000, 0x2d4: 0x2000, 0x2d5: 0x2000, 0x2d6: 0x2000, 0x2d7: 0x2000, - 0x2d8: 0x2000, 0x2d9: 0x2000, 0x2da: 0x2000, 0x2db: 0x2000, 0x2dc: 0x2000, 0x2dd: 0x2000, - 0x2de: 0x2000, 0x2df: 0x2000, 0x2e0: 0x2000, 0x2e1: 0x2000, 0x2e2: 0x2000, 0x2e3: 0x2000, - 0x2e4: 0x2000, 0x2e5: 0x2000, 0x2e6: 0x2000, 0x2e7: 0x2000, 0x2e8: 0x2000, 0x2e9: 0x2000, - 0x2ea: 0x2000, 0x2eb: 0x2000, 0x2ec: 0x2000, 0x2ed: 0x2000, 0x2ee: 0x2000, 0x2ef: 0x2000, - // Block 0xc, offset 0x300 - 0x311: 0x2000, - 0x312: 0x2000, 0x313: 0x2000, 0x314: 0x2000, 0x315: 0x2000, 0x316: 0x2000, 0x317: 0x2000, - 0x318: 0x2000, 0x319: 0x2000, 0x31a: 0x2000, 0x31b: 0x2000, 0x31c: 0x2000, 0x31d: 0x2000, - 0x31e: 0x2000, 0x31f: 0x2000, 0x320: 0x2000, 0x321: 0x2000, 0x323: 0x2000, - 0x324: 0x2000, 0x325: 0x2000, 0x326: 0x2000, 0x327: 0x2000, 0x328: 0x2000, 0x329: 0x2000, - 0x331: 0x2000, 0x332: 0x2000, 0x333: 0x2000, 0x334: 0x2000, 0x335: 0x2000, - 0x336: 0x2000, 0x337: 0x2000, 0x338: 0x2000, 0x339: 0x2000, 0x33a: 0x2000, 0x33b: 0x2000, - 0x33c: 0x2000, 0x33d: 0x2000, 0x33e: 0x2000, 0x33f: 0x2000, - // Block 0xd, offset 0x340 - 0x340: 0x2000, 0x341: 0x2000, 0x343: 0x2000, 0x344: 0x2000, 0x345: 0x2000, - 0x346: 0x2000, 0x347: 0x2000, 0x348: 0x2000, 0x349: 0x2000, - // Block 0xe, offset 0x380 - 0x381: 0x2000, - 0x390: 0x2000, 0x391: 0x2000, - 0x392: 0x2000, 0x393: 0x2000, 0x394: 0x2000, 0x395: 0x2000, 0x396: 0x2000, 0x397: 0x2000, - 0x398: 0x2000, 0x399: 0x2000, 0x39a: 0x2000, 0x39b: 0x2000, 0x39c: 0x2000, 0x39d: 0x2000, - 0x39e: 0x2000, 0x39f: 0x2000, 0x3a0: 0x2000, 0x3a1: 0x2000, 0x3a2: 0x2000, 0x3a3: 0x2000, - 0x3a4: 0x2000, 0x3a5: 0x2000, 0x3a6: 0x2000, 0x3a7: 0x2000, 0x3a8: 0x2000, 0x3a9: 0x2000, - 0x3aa: 0x2000, 0x3ab: 0x2000, 0x3ac: 0x2000, 0x3ad: 0x2000, 0x3ae: 0x2000, 0x3af: 0x2000, - 0x3b0: 0x2000, 0x3b1: 0x2000, 0x3b2: 0x2000, 0x3b3: 0x2000, 0x3b4: 0x2000, 0x3b5: 0x2000, - 0x3b6: 0x2000, 0x3b7: 0x2000, 0x3b8: 0x2000, 0x3b9: 0x2000, 0x3ba: 0x2000, 0x3bb: 0x2000, - 0x3bc: 0x2000, 0x3bd: 0x2000, 0x3be: 0x2000, 0x3bf: 0x2000, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x2000, 0x3c1: 0x2000, 0x3c2: 0x2000, 0x3c3: 0x2000, 0x3c4: 0x2000, 0x3c5: 0x2000, - 0x3c6: 0x2000, 0x3c7: 0x2000, 0x3c8: 0x2000, 0x3c9: 0x2000, 0x3ca: 0x2000, 0x3cb: 0x2000, - 0x3cc: 0x2000, 0x3cd: 0x2000, 0x3ce: 0x2000, 0x3cf: 0x2000, 0x3d1: 0x2000, - // Block 0x10, offset 0x400 - 0x400: 0x4000, 0x401: 0x4000, 0x402: 0x4000, 0x403: 0x4000, 0x404: 0x4000, 0x405: 0x4000, - 0x406: 0x4000, 0x407: 0x4000, 0x408: 0x4000, 0x409: 0x4000, 0x40a: 0x4000, 0x40b: 0x4000, - 0x40c: 0x4000, 0x40d: 0x4000, 0x40e: 0x4000, 0x40f: 0x4000, 0x410: 0x4000, 0x411: 0x4000, - 0x412: 0x4000, 0x413: 0x4000, 0x414: 0x4000, 0x415: 0x4000, 0x416: 0x4000, 0x417: 0x4000, - 0x418: 0x4000, 0x419: 0x4000, 0x41a: 0x4000, 0x41b: 0x4000, 0x41c: 0x4000, 0x41d: 0x4000, - 0x41e: 0x4000, 0x41f: 0x4000, 0x420: 0x4000, 0x421: 0x4000, 0x422: 0x4000, 0x423: 0x4000, - 0x424: 0x4000, 0x425: 0x4000, 0x426: 0x4000, 0x427: 0x4000, 0x428: 0x4000, 0x429: 0x4000, - 0x42a: 0x4000, 0x42b: 0x4000, 0x42c: 0x4000, 0x42d: 0x4000, 0x42e: 0x4000, 0x42f: 0x4000, - 0x430: 0x4000, 0x431: 0x4000, 0x432: 0x4000, 0x433: 0x4000, 0x434: 0x4000, 0x435: 0x4000, - 0x436: 0x4000, 0x437: 0x4000, 0x438: 0x4000, 0x439: 0x4000, 0x43a: 0x4000, 0x43b: 0x4000, - 0x43c: 0x4000, 0x43d: 0x4000, 0x43e: 0x4000, 0x43f: 0x4000, - // Block 0x11, offset 0x440 - 0x440: 0x4000, 0x441: 0x4000, 0x442: 0x4000, 0x443: 0x4000, 0x444: 0x4000, 0x445: 0x4000, - 0x446: 0x4000, 0x447: 0x4000, 0x448: 0x4000, 0x449: 0x4000, 0x44a: 0x4000, 0x44b: 0x4000, - 0x44c: 0x4000, 0x44d: 0x4000, 0x44e: 0x4000, 0x44f: 0x4000, 0x450: 0x4000, 0x451: 0x4000, - 0x452: 0x4000, 0x453: 0x4000, 0x454: 0x4000, 0x455: 0x4000, 0x456: 0x4000, 0x457: 0x4000, - 0x458: 0x4000, 0x459: 0x4000, 0x45a: 0x4000, 0x45b: 0x4000, 0x45c: 0x4000, 0x45d: 0x4000, - 0x45e: 0x4000, 0x45f: 0x4000, - // Block 0x12, offset 0x480 - 0x490: 0x2000, - 0x493: 0x2000, 0x494: 0x2000, 0x495: 0x2000, 0x496: 0x2000, - 0x498: 0x2000, 0x499: 0x2000, 0x49c: 0x2000, 0x49d: 0x2000, - 0x4a0: 0x2000, 0x4a1: 0x2000, 0x4a2: 0x2000, - 0x4a4: 0x2000, 0x4a5: 0x2000, 0x4a6: 0x2000, 0x4a7: 0x2000, - 0x4b0: 0x2000, 0x4b2: 0x2000, 0x4b3: 0x2000, 0x4b5: 0x2000, - 0x4bb: 0x2000, - 0x4be: 0x2000, - // Block 0x13, offset 0x4c0 - 0x4f4: 0x2000, - 0x4ff: 0x2000, - // Block 0x14, offset 0x500 - 0x501: 0x2000, 0x502: 0x2000, 0x503: 0x2000, 0x504: 0x2000, - 0x529: 0xa009, - 0x52c: 0x2000, - // Block 0x15, offset 0x540 - 0x543: 0x2000, 0x545: 0x2000, - 0x549: 0x2000, - 0x553: 0x2000, 0x556: 0x2000, - 0x561: 0x2000, 0x562: 0x2000, - 0x566: 0x2000, - 0x56b: 0x2000, - // Block 0x16, offset 0x580 - 0x593: 0x2000, 0x594: 0x2000, - 0x59b: 0x2000, 0x59c: 0x2000, 0x59d: 0x2000, - 0x59e: 0x2000, 0x5a0: 0x2000, 0x5a1: 0x2000, 0x5a2: 0x2000, 0x5a3: 0x2000, - 0x5a4: 0x2000, 0x5a5: 0x2000, 0x5a6: 0x2000, 0x5a7: 0x2000, 0x5a8: 0x2000, 0x5a9: 0x2000, - 0x5aa: 0x2000, 0x5ab: 0x2000, - 0x5b0: 0x2000, 0x5b1: 0x2000, 0x5b2: 0x2000, 0x5b3: 0x2000, 0x5b4: 0x2000, 0x5b5: 0x2000, - 0x5b6: 0x2000, 0x5b7: 0x2000, 0x5b8: 0x2000, 0x5b9: 0x2000, - // Block 0x17, offset 0x5c0 - 0x5c9: 0x2000, - 0x5d0: 0x200a, 0x5d1: 0x200b, - 0x5d2: 0x200a, 0x5d3: 0x200c, 0x5d4: 0x2000, 0x5d5: 0x2000, 0x5d6: 0x2000, 0x5d7: 0x2000, - 0x5d8: 0x2000, 0x5d9: 0x2000, - 0x5f8: 0x2000, 0x5f9: 0x2000, - // Block 0x18, offset 0x600 - 0x612: 0x2000, 0x614: 0x2000, - 0x627: 0x2000, - // Block 0x19, offset 0x640 - 0x640: 0x2000, 0x642: 0x2000, 0x643: 0x2000, - 0x647: 0x2000, 0x648: 0x2000, 0x64b: 0x2000, - 0x64f: 0x2000, 0x651: 0x2000, - 0x655: 0x2000, - 0x65a: 0x2000, 0x65d: 0x2000, - 0x65e: 0x2000, 0x65f: 0x2000, 0x660: 0x2000, 0x663: 0x2000, - 0x665: 0x2000, 0x667: 0x2000, 0x668: 0x2000, 0x669: 0x2000, - 0x66a: 0x2000, 0x66b: 0x2000, 0x66c: 0x2000, 0x66e: 0x2000, - 0x674: 0x2000, 0x675: 0x2000, - 0x676: 0x2000, 0x677: 0x2000, - 0x67c: 0x2000, 0x67d: 0x2000, - // Block 0x1a, offset 0x680 - 0x688: 0x2000, - 0x68c: 0x2000, - 0x692: 0x2000, - 0x6a0: 0x2000, 0x6a1: 0x2000, - 0x6a4: 0x2000, 0x6a5: 0x2000, 0x6a6: 0x2000, 0x6a7: 0x2000, - 0x6aa: 0x2000, 0x6ab: 0x2000, 0x6ae: 0x2000, 0x6af: 0x2000, - // Block 0x1b, offset 0x6c0 - 0x6c2: 0x2000, 0x6c3: 0x2000, - 0x6c6: 0x2000, 0x6c7: 0x2000, - 0x6d5: 0x2000, - 0x6d9: 0x2000, - 0x6e5: 0x2000, - 0x6ff: 0x2000, - // Block 0x1c, offset 0x700 - 0x712: 0x2000, - 0x71a: 0x4000, 0x71b: 0x4000, - 0x729: 0x4000, - 0x72a: 0x4000, - // Block 0x1d, offset 0x740 - 0x769: 0x4000, - 0x76a: 0x4000, 0x76b: 0x4000, 0x76c: 0x4000, - 0x770: 0x4000, 0x773: 0x4000, - // Block 0x1e, offset 0x780 - 0x7a0: 0x2000, 0x7a1: 0x2000, 0x7a2: 0x2000, 0x7a3: 0x2000, - 0x7a4: 0x2000, 0x7a5: 0x2000, 0x7a6: 0x2000, 0x7a7: 0x2000, 0x7a8: 0x2000, 0x7a9: 0x2000, - 0x7aa: 0x2000, 0x7ab: 0x2000, 0x7ac: 0x2000, 0x7ad: 0x2000, 0x7ae: 0x2000, 0x7af: 0x2000, - 0x7b0: 0x2000, 0x7b1: 0x2000, 0x7b2: 0x2000, 0x7b3: 0x2000, 0x7b4: 0x2000, 0x7b5: 0x2000, - 0x7b6: 0x2000, 0x7b7: 0x2000, 0x7b8: 0x2000, 0x7b9: 0x2000, 0x7ba: 0x2000, 0x7bb: 0x2000, - 0x7bc: 0x2000, 0x7bd: 0x2000, 0x7be: 0x2000, 0x7bf: 0x2000, - // Block 0x1f, offset 0x7c0 - 0x7c0: 0x2000, 0x7c1: 0x2000, 0x7c2: 0x2000, 0x7c3: 0x2000, 0x7c4: 0x2000, 0x7c5: 0x2000, - 0x7c6: 0x2000, 0x7c7: 0x2000, 0x7c8: 0x2000, 0x7c9: 0x2000, 0x7ca: 0x2000, 0x7cb: 0x2000, - 0x7cc: 0x2000, 0x7cd: 0x2000, 0x7ce: 0x2000, 0x7cf: 0x2000, 0x7d0: 0x2000, 0x7d1: 0x2000, - 0x7d2: 0x2000, 0x7d3: 0x2000, 0x7d4: 0x2000, 0x7d5: 0x2000, 0x7d6: 0x2000, 0x7d7: 0x2000, - 0x7d8: 0x2000, 0x7d9: 0x2000, 0x7da: 0x2000, 0x7db: 0x2000, 0x7dc: 0x2000, 0x7dd: 0x2000, - 0x7de: 0x2000, 0x7df: 0x2000, 0x7e0: 0x2000, 0x7e1: 0x2000, 0x7e2: 0x2000, 0x7e3: 0x2000, - 0x7e4: 0x2000, 0x7e5: 0x2000, 0x7e6: 0x2000, 0x7e7: 0x2000, 0x7e8: 0x2000, 0x7e9: 0x2000, - 0x7eb: 0x2000, 0x7ec: 0x2000, 0x7ed: 0x2000, 0x7ee: 0x2000, 0x7ef: 0x2000, - 0x7f0: 0x2000, 0x7f1: 0x2000, 0x7f2: 0x2000, 0x7f3: 0x2000, 0x7f4: 0x2000, 0x7f5: 0x2000, - 0x7f6: 0x2000, 0x7f7: 0x2000, 0x7f8: 0x2000, 0x7f9: 0x2000, 0x7fa: 0x2000, 0x7fb: 0x2000, - 0x7fc: 0x2000, 0x7fd: 0x2000, 0x7fe: 0x2000, 0x7ff: 0x2000, - // Block 0x20, offset 0x800 - 0x800: 0x2000, 0x801: 0x2000, 0x802: 0x200d, 0x803: 0x2000, 0x804: 0x2000, 0x805: 0x2000, - 0x806: 0x2000, 0x807: 0x2000, 0x808: 0x2000, 0x809: 0x2000, 0x80a: 0x2000, 0x80b: 0x2000, - 0x80c: 0x2000, 0x80d: 0x2000, 0x80e: 0x2000, 0x80f: 0x2000, 0x810: 0x2000, 0x811: 0x2000, - 0x812: 0x2000, 0x813: 0x2000, 0x814: 0x2000, 0x815: 0x2000, 0x816: 0x2000, 0x817: 0x2000, - 0x818: 0x2000, 0x819: 0x2000, 0x81a: 0x2000, 0x81b: 0x2000, 0x81c: 0x2000, 0x81d: 0x2000, - 0x81e: 0x2000, 0x81f: 0x2000, 0x820: 0x2000, 0x821: 0x2000, 0x822: 0x2000, 0x823: 0x2000, - 0x824: 0x2000, 0x825: 0x2000, 0x826: 0x2000, 0x827: 0x2000, 0x828: 0x2000, 0x829: 0x2000, - 0x82a: 0x2000, 0x82b: 0x2000, 0x82c: 0x2000, 0x82d: 0x2000, 0x82e: 0x2000, 0x82f: 0x2000, - 0x830: 0x2000, 0x831: 0x2000, 0x832: 0x2000, 0x833: 0x2000, 0x834: 0x2000, 0x835: 0x2000, - 0x836: 0x2000, 0x837: 0x2000, 0x838: 0x2000, 0x839: 0x2000, 0x83a: 0x2000, 0x83b: 0x2000, - 0x83c: 0x2000, 0x83d: 0x2000, 0x83e: 0x2000, 0x83f: 0x2000, - // Block 0x21, offset 0x840 - 0x840: 0x2000, 0x841: 0x2000, 0x842: 0x2000, 0x843: 0x2000, 0x844: 0x2000, 0x845: 0x2000, - 0x846: 0x2000, 0x847: 0x2000, 0x848: 0x2000, 0x849: 0x2000, 0x84a: 0x2000, 0x84b: 0x2000, - 0x850: 0x2000, 0x851: 0x2000, - 0x852: 0x2000, 0x853: 0x2000, 0x854: 0x2000, 0x855: 0x2000, 0x856: 0x2000, 0x857: 0x2000, - 0x858: 0x2000, 0x859: 0x2000, 0x85a: 0x2000, 0x85b: 0x2000, 0x85c: 0x2000, 0x85d: 0x2000, - 0x85e: 0x2000, 0x85f: 0x2000, 0x860: 0x2000, 0x861: 0x2000, 0x862: 0x2000, 0x863: 0x2000, - 0x864: 0x2000, 0x865: 0x2000, 0x866: 0x2000, 0x867: 0x2000, 0x868: 0x2000, 0x869: 0x2000, - 0x86a: 0x2000, 0x86b: 0x2000, 0x86c: 0x2000, 0x86d: 0x2000, 0x86e: 0x2000, 0x86f: 0x2000, - 0x870: 0x2000, 0x871: 0x2000, 0x872: 0x2000, 0x873: 0x2000, - // Block 0x22, offset 0x880 - 0x880: 0x2000, 0x881: 0x2000, 0x882: 0x2000, 0x883: 0x2000, 0x884: 0x2000, 0x885: 0x2000, - 0x886: 0x2000, 0x887: 0x2000, 0x888: 0x2000, 0x889: 0x2000, 0x88a: 0x2000, 0x88b: 0x2000, - 0x88c: 0x2000, 0x88d: 0x2000, 0x88e: 0x2000, 0x88f: 0x2000, - 0x892: 0x2000, 0x893: 0x2000, 0x894: 0x2000, 0x895: 0x2000, - 0x8a0: 0x200e, 0x8a1: 0x2000, 0x8a3: 0x2000, - 0x8a4: 0x2000, 0x8a5: 0x2000, 0x8a6: 0x2000, 0x8a7: 0x2000, 0x8a8: 0x2000, 0x8a9: 0x2000, - 0x8b2: 0x2000, 0x8b3: 0x2000, - 0x8b6: 0x2000, 0x8b7: 0x2000, - 0x8bc: 0x2000, 0x8bd: 0x2000, - // Block 0x23, offset 0x8c0 - 0x8c0: 0x2000, 0x8c1: 0x2000, - 0x8c6: 0x2000, 0x8c7: 0x2000, 0x8c8: 0x2000, 0x8cb: 0x200f, - 0x8ce: 0x2000, 0x8cf: 0x2000, 0x8d0: 0x2000, 0x8d1: 0x2000, - 0x8e2: 0x2000, 0x8e3: 0x2000, - 0x8e4: 0x2000, 0x8e5: 0x2000, - 0x8ef: 0x2000, - 0x8fd: 0x4000, 0x8fe: 0x4000, - // Block 0x24, offset 0x900 - 0x905: 0x2000, - 0x906: 0x2000, 0x909: 0x2000, - 0x90e: 0x2000, 0x90f: 0x2000, - 0x914: 0x4000, 0x915: 0x4000, - 0x91c: 0x2000, - 0x91e: 0x2000, - // Block 0x25, offset 0x940 - 0x940: 0x2000, 0x942: 0x2000, - 0x948: 0x4000, 0x949: 0x4000, 0x94a: 0x4000, 0x94b: 0x4000, - 0x94c: 0x4000, 0x94d: 0x4000, 0x94e: 0x4000, 0x94f: 0x4000, 0x950: 0x4000, 0x951: 0x4000, - 0x952: 0x4000, 0x953: 0x4000, - 0x960: 0x2000, 0x961: 0x2000, 0x963: 0x2000, - 0x964: 0x2000, 0x965: 0x2000, 0x967: 0x2000, 0x968: 0x2000, 0x969: 0x2000, - 0x96a: 0x2000, 0x96c: 0x2000, 0x96d: 0x2000, 0x96f: 0x2000, - 0x97f: 0x4000, - // Block 0x26, offset 0x980 - 0x993: 0x4000, - 0x99e: 0x2000, 0x99f: 0x2000, 0x9a1: 0x4000, - 0x9aa: 0x4000, 0x9ab: 0x4000, - 0x9bd: 0x4000, 0x9be: 0x4000, 0x9bf: 0x2000, - // Block 0x27, offset 0x9c0 - 0x9c4: 0x4000, 0x9c5: 0x4000, - 0x9c6: 0x2000, 0x9c7: 0x2000, 0x9c8: 0x2000, 0x9c9: 0x2000, 0x9ca: 0x2000, 0x9cb: 0x2000, - 0x9cc: 0x2000, 0x9cd: 0x2000, 0x9ce: 0x4000, 0x9cf: 0x2000, 0x9d0: 0x2000, 0x9d1: 0x2000, - 0x9d2: 0x2000, 0x9d3: 0x2000, 0x9d4: 0x4000, 0x9d5: 0x2000, 0x9d6: 0x2000, 0x9d7: 0x2000, - 0x9d8: 0x2000, 0x9d9: 0x2000, 0x9da: 0x2000, 0x9db: 0x2000, 0x9dc: 0x2000, 0x9dd: 0x2000, - 0x9de: 0x2000, 0x9df: 0x2000, 0x9e0: 0x2000, 0x9e1: 0x2000, 0x9e3: 0x2000, - 0x9e8: 0x2000, 0x9e9: 0x2000, - 0x9ea: 0x4000, 0x9eb: 0x2000, 0x9ec: 0x2000, 0x9ed: 0x2000, 0x9ee: 0x2000, 0x9ef: 0x2000, - 0x9f0: 0x2000, 0x9f1: 0x2000, 0x9f2: 0x4000, 0x9f3: 0x4000, 0x9f4: 0x2000, 0x9f5: 0x4000, - 0x9f6: 0x2000, 0x9f7: 0x2000, 0x9f8: 0x2000, 0x9f9: 0x2000, 0x9fa: 0x4000, 0x9fb: 0x2000, - 0x9fc: 0x2000, 0x9fd: 0x4000, 0x9fe: 0x2000, 0x9ff: 0x2000, - // Block 0x28, offset 0xa00 - 0xa05: 0x4000, - 0xa0a: 0x4000, 0xa0b: 0x4000, - 0xa28: 0x4000, - 0xa3d: 0x2000, - // Block 0x29, offset 0xa40 - 0xa4c: 0x4000, 0xa4e: 0x4000, - 0xa53: 0x4000, 0xa54: 0x4000, 0xa55: 0x4000, 0xa57: 0x4000, - 0xa76: 0x2000, 0xa77: 0x2000, 0xa78: 0x2000, 0xa79: 0x2000, 0xa7a: 0x2000, 0xa7b: 0x2000, - 0xa7c: 0x2000, 0xa7d: 0x2000, 0xa7e: 0x2000, 0xa7f: 0x2000, - // Block 0x2a, offset 0xa80 - 0xa95: 0x4000, 0xa96: 0x4000, 0xa97: 0x4000, - 0xab0: 0x4000, - 0xabf: 0x4000, - // Block 0x2b, offset 0xac0 - 0xae6: 0x6000, 0xae7: 0x6000, 0xae8: 0x6000, 0xae9: 0x6000, - 0xaea: 0x6000, 0xaeb: 0x6000, 0xaec: 0x6000, 0xaed: 0x6000, - // Block 0x2c, offset 0xb00 - 0xb05: 0x6010, - 0xb06: 0x6011, - // Block 0x2d, offset 0xb40 - 0xb5b: 0x4000, 0xb5c: 0x4000, - // Block 0x2e, offset 0xb80 - 0xb90: 0x4000, - 0xb95: 0x4000, 0xb96: 0x2000, 0xb97: 0x2000, - 0xb98: 0x2000, 0xb99: 0x2000, - // Block 0x2f, offset 0xbc0 - 0xbc0: 0x4000, 0xbc1: 0x4000, 0xbc2: 0x4000, 0xbc3: 0x4000, 0xbc4: 0x4000, 0xbc5: 0x4000, - 0xbc6: 0x4000, 0xbc7: 0x4000, 0xbc8: 0x4000, 0xbc9: 0x4000, 0xbca: 0x4000, 0xbcb: 0x4000, - 0xbcc: 0x4000, 0xbcd: 0x4000, 0xbce: 0x4000, 0xbcf: 0x4000, 0xbd0: 0x4000, 0xbd1: 0x4000, - 0xbd2: 0x4000, 0xbd3: 0x4000, 0xbd4: 0x4000, 0xbd5: 0x4000, 0xbd6: 0x4000, 0xbd7: 0x4000, - 0xbd8: 0x4000, 0xbd9: 0x4000, 0xbdb: 0x4000, 0xbdc: 0x4000, 0xbdd: 0x4000, - 0xbde: 0x4000, 0xbdf: 0x4000, 0xbe0: 0x4000, 0xbe1: 0x4000, 0xbe2: 0x4000, 0xbe3: 0x4000, - 0xbe4: 0x4000, 0xbe5: 0x4000, 0xbe6: 0x4000, 0xbe7: 0x4000, 0xbe8: 0x4000, 0xbe9: 0x4000, - 0xbea: 0x4000, 0xbeb: 0x4000, 0xbec: 0x4000, 0xbed: 0x4000, 0xbee: 0x4000, 0xbef: 0x4000, - 0xbf0: 0x4000, 0xbf1: 0x4000, 0xbf2: 0x4000, 0xbf3: 0x4000, 0xbf4: 0x4000, 0xbf5: 0x4000, - 0xbf6: 0x4000, 0xbf7: 0x4000, 0xbf8: 0x4000, 0xbf9: 0x4000, 0xbfa: 0x4000, 0xbfb: 0x4000, - 0xbfc: 0x4000, 0xbfd: 0x4000, 0xbfe: 0x4000, 0xbff: 0x4000, - // Block 0x30, offset 0xc00 - 0xc00: 0x4000, 0xc01: 0x4000, 0xc02: 0x4000, 0xc03: 0x4000, 0xc04: 0x4000, 0xc05: 0x4000, - 0xc06: 0x4000, 0xc07: 0x4000, 0xc08: 0x4000, 0xc09: 0x4000, 0xc0a: 0x4000, 0xc0b: 0x4000, - 0xc0c: 0x4000, 0xc0d: 0x4000, 0xc0e: 0x4000, 0xc0f: 0x4000, 0xc10: 0x4000, 0xc11: 0x4000, - 0xc12: 0x4000, 0xc13: 0x4000, 0xc14: 0x4000, 0xc15: 0x4000, 0xc16: 0x4000, 0xc17: 0x4000, - 0xc18: 0x4000, 0xc19: 0x4000, 0xc1a: 0x4000, 0xc1b: 0x4000, 0xc1c: 0x4000, 0xc1d: 0x4000, - 0xc1e: 0x4000, 0xc1f: 0x4000, 0xc20: 0x4000, 0xc21: 0x4000, 0xc22: 0x4000, 0xc23: 0x4000, - 0xc24: 0x4000, 0xc25: 0x4000, 0xc26: 0x4000, 0xc27: 0x4000, 0xc28: 0x4000, 0xc29: 0x4000, - 0xc2a: 0x4000, 0xc2b: 0x4000, 0xc2c: 0x4000, 0xc2d: 0x4000, 0xc2e: 0x4000, 0xc2f: 0x4000, - 0xc30: 0x4000, 0xc31: 0x4000, 0xc32: 0x4000, 0xc33: 0x4000, - // Block 0x31, offset 0xc40 - 0xc40: 0x4000, 0xc41: 0x4000, 0xc42: 0x4000, 0xc43: 0x4000, 0xc44: 0x4000, 0xc45: 0x4000, - 0xc46: 0x4000, 0xc47: 0x4000, 0xc48: 0x4000, 0xc49: 0x4000, 0xc4a: 0x4000, 0xc4b: 0x4000, - 0xc4c: 0x4000, 0xc4d: 0x4000, 0xc4e: 0x4000, 0xc4f: 0x4000, 0xc50: 0x4000, 0xc51: 0x4000, - 0xc52: 0x4000, 0xc53: 0x4000, 0xc54: 0x4000, 0xc55: 0x4000, - 0xc70: 0x4000, 0xc71: 0x4000, 0xc72: 0x4000, 0xc73: 0x4000, 0xc74: 0x4000, 0xc75: 0x4000, - 0xc76: 0x4000, 0xc77: 0x4000, 0xc78: 0x4000, 0xc79: 0x4000, 0xc7a: 0x4000, 0xc7b: 0x4000, - // Block 0x32, offset 0xc80 - 0xc80: 0x9012, 0xc81: 0x4013, 0xc82: 0x4014, 0xc83: 0x4000, 0xc84: 0x4000, 0xc85: 0x4000, - 0xc86: 0x4000, 0xc87: 0x4000, 0xc88: 0x4000, 0xc89: 0x4000, 0xc8a: 0x4000, 0xc8b: 0x4000, - 0xc8c: 0x4015, 0xc8d: 0x4015, 0xc8e: 0x4000, 0xc8f: 0x4000, 0xc90: 0x4000, 0xc91: 0x4000, - 0xc92: 0x4000, 0xc93: 0x4000, 0xc94: 0x4000, 0xc95: 0x4000, 0xc96: 0x4000, 0xc97: 0x4000, - 0xc98: 0x4000, 0xc99: 0x4000, 0xc9a: 0x4000, 0xc9b: 0x4000, 0xc9c: 0x4000, 0xc9d: 0x4000, - 0xc9e: 0x4000, 0xc9f: 0x4000, 0xca0: 0x4000, 0xca1: 0x4000, 0xca2: 0x4000, 0xca3: 0x4000, - 0xca4: 0x4000, 0xca5: 0x4000, 0xca6: 0x4000, 0xca7: 0x4000, 0xca8: 0x4000, 0xca9: 0x4000, - 0xcaa: 0x4000, 0xcab: 0x4000, 0xcac: 0x4000, 0xcad: 0x4000, 0xcae: 0x4000, 0xcaf: 0x4000, - 0xcb0: 0x4000, 0xcb1: 0x4000, 0xcb2: 0x4000, 0xcb3: 0x4000, 0xcb4: 0x4000, 0xcb5: 0x4000, - 0xcb6: 0x4000, 0xcb7: 0x4000, 0xcb8: 0x4000, 0xcb9: 0x4000, 0xcba: 0x4000, 0xcbb: 0x4000, - 0xcbc: 0x4000, 0xcbd: 0x4000, 0xcbe: 0x4000, - // Block 0x33, offset 0xcc0 - 0xcc1: 0x4000, 0xcc2: 0x4000, 0xcc3: 0x4000, 0xcc4: 0x4000, 0xcc5: 0x4000, - 0xcc6: 0x4000, 0xcc7: 0x4000, 0xcc8: 0x4000, 0xcc9: 0x4000, 0xcca: 0x4000, 0xccb: 0x4000, - 0xccc: 0x4000, 0xccd: 0x4000, 0xcce: 0x4000, 0xccf: 0x4000, 0xcd0: 0x4000, 0xcd1: 0x4000, - 0xcd2: 0x4000, 0xcd3: 0x4000, 0xcd4: 0x4000, 0xcd5: 0x4000, 0xcd6: 0x4000, 0xcd7: 0x4000, - 0xcd8: 0x4000, 0xcd9: 0x4000, 0xcda: 0x4000, 0xcdb: 0x4000, 0xcdc: 0x4000, 0xcdd: 0x4000, - 0xcde: 0x4000, 0xcdf: 0x4000, 0xce0: 0x4000, 0xce1: 0x4000, 0xce2: 0x4000, 0xce3: 0x4000, - 0xce4: 0x4000, 0xce5: 0x4000, 0xce6: 0x4000, 0xce7: 0x4000, 0xce8: 0x4000, 0xce9: 0x4000, - 0xcea: 0x4000, 0xceb: 0x4000, 0xcec: 0x4000, 0xced: 0x4000, 0xcee: 0x4000, 0xcef: 0x4000, - 0xcf0: 0x4000, 0xcf1: 0x4000, 0xcf2: 0x4000, 0xcf3: 0x4000, 0xcf4: 0x4000, 0xcf5: 0x4000, - 0xcf6: 0x4000, 0xcf7: 0x4000, 0xcf8: 0x4000, 0xcf9: 0x4000, 0xcfa: 0x4000, 0xcfb: 0x4000, - 0xcfc: 0x4000, 0xcfd: 0x4000, 0xcfe: 0x4000, 0xcff: 0x4000, - // Block 0x34, offset 0xd00 - 0xd00: 0x4000, 0xd01: 0x4000, 0xd02: 0x4000, 0xd03: 0x4000, 0xd04: 0x4000, 0xd05: 0x4000, - 0xd06: 0x4000, 0xd07: 0x4000, 0xd08: 0x4000, 0xd09: 0x4000, 0xd0a: 0x4000, 0xd0b: 0x4000, - 0xd0c: 0x4000, 0xd0d: 0x4000, 0xd0e: 0x4000, 0xd0f: 0x4000, 0xd10: 0x4000, 0xd11: 0x4000, - 0xd12: 0x4000, 0xd13: 0x4000, 0xd14: 0x4000, 0xd15: 0x4000, 0xd16: 0x4000, - 0xd19: 0x4016, 0xd1a: 0x4017, 0xd1b: 0x4000, 0xd1c: 0x4000, 0xd1d: 0x4000, - 0xd1e: 0x4000, 0xd1f: 0x4000, 0xd20: 0x4000, 0xd21: 0x4018, 0xd22: 0x4019, 0xd23: 0x401a, - 0xd24: 0x401b, 0xd25: 0x401c, 0xd26: 0x401d, 0xd27: 0x401e, 0xd28: 0x401f, 0xd29: 0x4020, - 0xd2a: 0x4021, 0xd2b: 0x4022, 0xd2c: 0x4000, 0xd2d: 0x4010, 0xd2e: 0x4000, 0xd2f: 0x4023, - 0xd30: 0x4000, 0xd31: 0x4024, 0xd32: 0x4000, 0xd33: 0x4025, 0xd34: 0x4000, 0xd35: 0x4026, - 0xd36: 0x4000, 0xd37: 0x401a, 0xd38: 0x4000, 0xd39: 0x4027, 0xd3a: 0x4000, 0xd3b: 0x4028, - 0xd3c: 0x4000, 0xd3d: 0x4020, 0xd3e: 0x4000, 0xd3f: 0x4029, - // Block 0x35, offset 0xd40 - 0xd40: 0x4000, 0xd41: 0x402a, 0xd42: 0x4000, 0xd43: 0x402b, 0xd44: 0x402c, 0xd45: 0x4000, - 0xd46: 0x4017, 0xd47: 0x4000, 0xd48: 0x402d, 0xd49: 0x4000, 0xd4a: 0x402e, 0xd4b: 0x402f, - 0xd4c: 0x4030, 0xd4d: 0x4017, 0xd4e: 0x4016, 0xd4f: 0x4017, 0xd50: 0x4000, 0xd51: 0x4000, - 0xd52: 0x4031, 0xd53: 0x4000, 0xd54: 0x4000, 0xd55: 0x4031, 0xd56: 0x4000, 0xd57: 0x4000, - 0xd58: 0x4032, 0xd59: 0x4000, 0xd5a: 0x4000, 0xd5b: 0x4032, 0xd5c: 0x4000, 0xd5d: 0x4000, - 0xd5e: 0x4033, 0xd5f: 0x402e, 0xd60: 0x4034, 0xd61: 0x4035, 0xd62: 0x4034, 0xd63: 0x4036, - 0xd64: 0x4037, 0xd65: 0x4024, 0xd66: 0x4035, 0xd67: 0x4025, 0xd68: 0x4038, 0xd69: 0x4038, - 0xd6a: 0x4039, 0xd6b: 0x4039, 0xd6c: 0x403a, 0xd6d: 0x403a, 0xd6e: 0x4000, 0xd6f: 0x4035, - 0xd70: 0x4000, 0xd71: 0x4000, 0xd72: 0x403b, 0xd73: 0x403c, 0xd74: 0x4000, 0xd75: 0x4000, - 0xd76: 0x4000, 0xd77: 0x4000, 0xd78: 0x4000, 0xd79: 0x4000, 0xd7a: 0x4000, 0xd7b: 0x403d, - 0xd7c: 0x401c, 0xd7d: 0x4000, 0xd7e: 0x4000, 0xd7f: 0x4000, - // Block 0x36, offset 0xd80 - 0xd85: 0x4000, - 0xd86: 0x4000, 0xd87: 0x4000, 0xd88: 0x4000, 0xd89: 0x4000, 0xd8a: 0x4000, 0xd8b: 0x4000, - 0xd8c: 0x4000, 0xd8d: 0x4000, 0xd8e: 0x4000, 0xd8f: 0x4000, 0xd90: 0x4000, 0xd91: 0x4000, - 0xd92: 0x4000, 0xd93: 0x4000, 0xd94: 0x4000, 0xd95: 0x4000, 0xd96: 0x4000, 0xd97: 0x4000, - 0xd98: 0x4000, 0xd99: 0x4000, 0xd9a: 0x4000, 0xd9b: 0x4000, 0xd9c: 0x4000, 0xd9d: 0x4000, - 0xd9e: 0x4000, 0xd9f: 0x4000, 0xda0: 0x4000, 0xda1: 0x4000, 0xda2: 0x4000, 0xda3: 0x4000, - 0xda4: 0x4000, 0xda5: 0x4000, 0xda6: 0x4000, 0xda7: 0x4000, 0xda8: 0x4000, 0xda9: 0x4000, - 0xdaa: 0x4000, 0xdab: 0x4000, 0xdac: 0x4000, 0xdad: 0x4000, - 0xdb1: 0x403e, 0xdb2: 0x403e, 0xdb3: 0x403e, 0xdb4: 0x403e, 0xdb5: 0x403e, - 0xdb6: 0x403e, 0xdb7: 0x403e, 0xdb8: 0x403e, 0xdb9: 0x403e, 0xdba: 0x403e, 0xdbb: 0x403e, - 0xdbc: 0x403e, 0xdbd: 0x403e, 0xdbe: 0x403e, 0xdbf: 0x403e, - // Block 0x37, offset 0xdc0 - 0xdc0: 0x4037, 0xdc1: 0x4037, 0xdc2: 0x4037, 0xdc3: 0x4037, 0xdc4: 0x4037, 0xdc5: 0x4037, - 0xdc6: 0x4037, 0xdc7: 0x4037, 0xdc8: 0x4037, 0xdc9: 0x4037, 0xdca: 0x4037, 0xdcb: 0x4037, - 0xdcc: 0x4037, 0xdcd: 0x4037, 0xdce: 0x4037, 0xdcf: 0x400e, 0xdd0: 0x403f, 0xdd1: 0x4040, - 0xdd2: 0x4041, 0xdd3: 0x4040, 0xdd4: 0x403f, 0xdd5: 0x4042, 0xdd6: 0x4043, 0xdd7: 0x4044, - 0xdd8: 0x4040, 0xdd9: 0x4041, 0xdda: 0x4040, 0xddb: 0x4045, 0xddc: 0x4009, 0xddd: 0x4045, - 0xdde: 0x4046, 0xddf: 0x4045, 0xde0: 0x4047, 0xde1: 0x400b, 0xde2: 0x400a, 0xde3: 0x400c, - 0xde4: 0x4048, 0xde5: 0x4000, 0xde6: 0x4000, 0xde7: 0x4000, 0xde8: 0x4000, 0xde9: 0x4000, - 0xdea: 0x4000, 0xdeb: 0x4000, 0xdec: 0x4000, 0xded: 0x4000, 0xdee: 0x4000, 0xdef: 0x4000, - 0xdf0: 0x4000, 0xdf1: 0x4000, 0xdf2: 0x4000, 0xdf3: 0x4000, 0xdf4: 0x4000, 0xdf5: 0x4000, - 0xdf6: 0x4000, 0xdf7: 0x4000, 0xdf8: 0x4000, 0xdf9: 0x4000, 0xdfa: 0x4000, 0xdfb: 0x4000, - 0xdfc: 0x4000, 0xdfd: 0x4000, 0xdfe: 0x4000, 0xdff: 0x4000, - // Block 0x38, offset 0xe00 - 0xe00: 0x4000, 0xe01: 0x4000, 0xe02: 0x4000, 0xe03: 0x4000, 0xe04: 0x4000, 0xe05: 0x4000, - 0xe06: 0x4000, 0xe07: 0x4000, 0xe08: 0x4000, 0xe09: 0x4000, 0xe0a: 0x4000, 0xe0b: 0x4000, - 0xe0c: 0x4000, 0xe0d: 0x4000, 0xe0e: 0x4000, 0xe10: 0x4000, 0xe11: 0x4000, - 0xe12: 0x4000, 0xe13: 0x4000, 0xe14: 0x4000, 0xe15: 0x4000, 0xe16: 0x4000, 0xe17: 0x4000, - 0xe18: 0x4000, 0xe19: 0x4000, 0xe1a: 0x4000, 0xe1b: 0x4000, 0xe1c: 0x4000, 0xe1d: 0x4000, - 0xe1e: 0x4000, 0xe1f: 0x4000, 0xe20: 0x4000, 0xe21: 0x4000, 0xe22: 0x4000, 0xe23: 0x4000, - 0xe24: 0x4000, 0xe25: 0x4000, 0xe26: 0x4000, 0xe27: 0x4000, 0xe28: 0x4000, 0xe29: 0x4000, - 0xe2a: 0x4000, 0xe2b: 0x4000, 0xe2c: 0x4000, 0xe2d: 0x4000, 0xe2e: 0x4000, 0xe2f: 0x4000, - 0xe30: 0x4000, 0xe31: 0x4000, 0xe32: 0x4000, 0xe33: 0x4000, 0xe34: 0x4000, 0xe35: 0x4000, - 0xe36: 0x4000, 0xe37: 0x4000, 0xe38: 0x4000, 0xe39: 0x4000, 0xe3a: 0x4000, - // Block 0x39, offset 0xe40 - 0xe40: 0x4000, 0xe41: 0x4000, 0xe42: 0x4000, 0xe43: 0x4000, 0xe44: 0x4000, 0xe45: 0x4000, - 0xe46: 0x4000, 0xe47: 0x4000, 0xe48: 0x4000, 0xe49: 0x4000, 0xe4a: 0x4000, 0xe4b: 0x4000, - 0xe4c: 0x4000, 0xe4d: 0x4000, 0xe4e: 0x4000, 0xe4f: 0x4000, 0xe50: 0x4000, 0xe51: 0x4000, - 0xe52: 0x4000, 0xe53: 0x4000, 0xe54: 0x4000, 0xe55: 0x4000, 0xe56: 0x4000, 0xe57: 0x4000, - 0xe58: 0x4000, 0xe59: 0x4000, 0xe5a: 0x4000, 0xe5b: 0x4000, 0xe5c: 0x4000, 0xe5d: 0x4000, - 0xe5e: 0x4000, 0xe5f: 0x4000, 0xe60: 0x4000, 0xe61: 0x4000, 0xe62: 0x4000, 0xe63: 0x4000, - 0xe70: 0x4000, 0xe71: 0x4000, 0xe72: 0x4000, 0xe73: 0x4000, 0xe74: 0x4000, 0xe75: 0x4000, - 0xe76: 0x4000, 0xe77: 0x4000, 0xe78: 0x4000, 0xe79: 0x4000, 0xe7a: 0x4000, 0xe7b: 0x4000, - 0xe7c: 0x4000, 0xe7d: 0x4000, 0xe7e: 0x4000, 0xe7f: 0x4000, - // Block 0x3a, offset 0xe80 - 0xe80: 0x4000, 0xe81: 0x4000, 0xe82: 0x4000, 0xe83: 0x4000, 0xe84: 0x4000, 0xe85: 0x4000, - 0xe86: 0x4000, 0xe87: 0x4000, 0xe88: 0x4000, 0xe89: 0x4000, 0xe8a: 0x4000, 0xe8b: 0x4000, - 0xe8c: 0x4000, 0xe8d: 0x4000, 0xe8e: 0x4000, 0xe8f: 0x4000, 0xe90: 0x4000, 0xe91: 0x4000, - 0xe92: 0x4000, 0xe93: 0x4000, 0xe94: 0x4000, 0xe95: 0x4000, 0xe96: 0x4000, 0xe97: 0x4000, - 0xe98: 0x4000, 0xe99: 0x4000, 0xe9a: 0x4000, 0xe9b: 0x4000, 0xe9c: 0x4000, 0xe9d: 0x4000, - 0xe9e: 0x4000, 0xea0: 0x4000, 0xea1: 0x4000, 0xea2: 0x4000, 0xea3: 0x4000, - 0xea4: 0x4000, 0xea5: 0x4000, 0xea6: 0x4000, 0xea7: 0x4000, 0xea8: 0x4000, 0xea9: 0x4000, - 0xeaa: 0x4000, 0xeab: 0x4000, 0xeac: 0x4000, 0xead: 0x4000, 0xeae: 0x4000, 0xeaf: 0x4000, - 0xeb0: 0x4000, 0xeb1: 0x4000, 0xeb2: 0x4000, 0xeb3: 0x4000, 0xeb4: 0x4000, 0xeb5: 0x4000, - 0xeb6: 0x4000, 0xeb7: 0x4000, 0xeb8: 0x4000, 0xeb9: 0x4000, 0xeba: 0x4000, 0xebb: 0x4000, - 0xebc: 0x4000, 0xebd: 0x4000, 0xebe: 0x4000, 0xebf: 0x4000, - // Block 0x3b, offset 0xec0 - 0xec0: 0x4000, 0xec1: 0x4000, 0xec2: 0x4000, 0xec3: 0x4000, 0xec4: 0x4000, 0xec5: 0x4000, - 0xec6: 0x4000, 0xec7: 0x4000, 0xec8: 0x2000, 0xec9: 0x2000, 0xeca: 0x2000, 0xecb: 0x2000, - 0xecc: 0x2000, 0xecd: 0x2000, 0xece: 0x2000, 0xecf: 0x2000, 0xed0: 0x4000, 0xed1: 0x4000, - 0xed2: 0x4000, 0xed3: 0x4000, 0xed4: 0x4000, 0xed5: 0x4000, 0xed6: 0x4000, 0xed7: 0x4000, - 0xed8: 0x4000, 0xed9: 0x4000, 0xeda: 0x4000, 0xedb: 0x4000, 0xedc: 0x4000, 0xedd: 0x4000, - 0xede: 0x4000, 0xedf: 0x4000, 0xee0: 0x4000, 0xee1: 0x4000, 0xee2: 0x4000, 0xee3: 0x4000, - 0xee4: 0x4000, 0xee5: 0x4000, 0xee6: 0x4000, 0xee7: 0x4000, 0xee8: 0x4000, 0xee9: 0x4000, - 0xeea: 0x4000, 0xeeb: 0x4000, 0xeec: 0x4000, 0xeed: 0x4000, 0xeee: 0x4000, 0xeef: 0x4000, - 0xef0: 0x4000, 0xef1: 0x4000, 0xef2: 0x4000, 0xef3: 0x4000, 0xef4: 0x4000, 0xef5: 0x4000, - 0xef6: 0x4000, 0xef7: 0x4000, 0xef8: 0x4000, 0xef9: 0x4000, 0xefa: 0x4000, 0xefb: 0x4000, - 0xefc: 0x4000, 0xefd: 0x4000, 0xefe: 0x4000, 0xeff: 0x4000, - // Block 0x3c, offset 0xf00 - 0xf00: 0x4000, 0xf01: 0x4000, 0xf02: 0x4000, 0xf03: 0x4000, 0xf04: 0x4000, 0xf05: 0x4000, - 0xf06: 0x4000, 0xf07: 0x4000, 0xf08: 0x4000, 0xf09: 0x4000, 0xf0a: 0x4000, 0xf0b: 0x4000, - 0xf0c: 0x4000, 0xf0d: 0x4000, 0xf0e: 0x4000, 0xf0f: 0x4000, 0xf10: 0x4000, 0xf11: 0x4000, - 0xf12: 0x4000, 0xf13: 0x4000, 0xf14: 0x4000, 0xf15: 0x4000, 0xf16: 0x4000, 0xf17: 0x4000, - 0xf18: 0x4000, 0xf19: 0x4000, 0xf1a: 0x4000, 0xf1b: 0x4000, 0xf1c: 0x4000, 0xf1d: 0x4000, - 0xf1e: 0x4000, 0xf1f: 0x4000, 0xf20: 0x4000, 0xf21: 0x4000, 0xf22: 0x4000, 0xf23: 0x4000, - 0xf24: 0x4000, 0xf25: 0x4000, 0xf26: 0x4000, 0xf27: 0x4000, 0xf28: 0x4000, 0xf29: 0x4000, - 0xf2a: 0x4000, 0xf2b: 0x4000, 0xf2c: 0x4000, 0xf2d: 0x4000, 0xf2e: 0x4000, 0xf2f: 0x4000, - 0xf30: 0x4000, 0xf31: 0x4000, 0xf32: 0x4000, 0xf33: 0x4000, 0xf34: 0x4000, 0xf35: 0x4000, - 0xf36: 0x4000, 0xf37: 0x4000, 0xf38: 0x4000, 0xf39: 0x4000, 0xf3a: 0x4000, 0xf3b: 0x4000, - 0xf3c: 0x4000, 0xf3d: 0x4000, 0xf3e: 0x4000, - // Block 0x3d, offset 0xf40 - 0xf40: 0x4000, 0xf41: 0x4000, 0xf42: 0x4000, 0xf43: 0x4000, 0xf44: 0x4000, 0xf45: 0x4000, - 0xf46: 0x4000, 0xf47: 0x4000, 0xf48: 0x4000, 0xf49: 0x4000, 0xf4a: 0x4000, 0xf4b: 0x4000, - 0xf4c: 0x4000, 0xf50: 0x4000, 0xf51: 0x4000, - 0xf52: 0x4000, 0xf53: 0x4000, 0xf54: 0x4000, 0xf55: 0x4000, 0xf56: 0x4000, 0xf57: 0x4000, - 0xf58: 0x4000, 0xf59: 0x4000, 0xf5a: 0x4000, 0xf5b: 0x4000, 0xf5c: 0x4000, 0xf5d: 0x4000, - 0xf5e: 0x4000, 0xf5f: 0x4000, 0xf60: 0x4000, 0xf61: 0x4000, 0xf62: 0x4000, 0xf63: 0x4000, - 0xf64: 0x4000, 0xf65: 0x4000, 0xf66: 0x4000, 0xf67: 0x4000, 0xf68: 0x4000, 0xf69: 0x4000, - 0xf6a: 0x4000, 0xf6b: 0x4000, 0xf6c: 0x4000, 0xf6d: 0x4000, 0xf6e: 0x4000, 0xf6f: 0x4000, - 0xf70: 0x4000, 0xf71: 0x4000, 0xf72: 0x4000, 0xf73: 0x4000, 0xf74: 0x4000, 0xf75: 0x4000, - 0xf76: 0x4000, 0xf77: 0x4000, 0xf78: 0x4000, 0xf79: 0x4000, 0xf7a: 0x4000, 0xf7b: 0x4000, - 0xf7c: 0x4000, 0xf7d: 0x4000, 0xf7e: 0x4000, 0xf7f: 0x4000, - // Block 0x3e, offset 0xf80 - 0xf80: 0x4000, 0xf81: 0x4000, 0xf82: 0x4000, 0xf83: 0x4000, 0xf84: 0x4000, 0xf85: 0x4000, - 0xf86: 0x4000, - // Block 0x3f, offset 0xfc0 - 0xfe0: 0x4000, 0xfe1: 0x4000, 0xfe2: 0x4000, 0xfe3: 0x4000, - 0xfe4: 0x4000, 0xfe5: 0x4000, 0xfe6: 0x4000, 0xfe7: 0x4000, 0xfe8: 0x4000, 0xfe9: 0x4000, - 0xfea: 0x4000, 0xfeb: 0x4000, 0xfec: 0x4000, 0xfed: 0x4000, 0xfee: 0x4000, 0xfef: 0x4000, - 0xff0: 0x4000, 0xff1: 0x4000, 0xff2: 0x4000, 0xff3: 0x4000, 0xff4: 0x4000, 0xff5: 0x4000, - 0xff6: 0x4000, 0xff7: 0x4000, 0xff8: 0x4000, 0xff9: 0x4000, 0xffa: 0x4000, 0xffb: 0x4000, - 0xffc: 0x4000, - // Block 0x40, offset 0x1000 - 0x1000: 0x4000, 0x1001: 0x4000, 0x1002: 0x4000, 0x1003: 0x4000, 0x1004: 0x4000, 0x1005: 0x4000, - 0x1006: 0x4000, 0x1007: 0x4000, 0x1008: 0x4000, 0x1009: 0x4000, 0x100a: 0x4000, 0x100b: 0x4000, - 0x100c: 0x4000, 0x100d: 0x4000, 0x100e: 0x4000, 0x100f: 0x4000, 0x1010: 0x4000, 0x1011: 0x4000, - 0x1012: 0x4000, 0x1013: 0x4000, 0x1014: 0x4000, 0x1015: 0x4000, 0x1016: 0x4000, 0x1017: 0x4000, - 0x1018: 0x4000, 0x1019: 0x4000, 0x101a: 0x4000, 0x101b: 0x4000, 0x101c: 0x4000, 0x101d: 0x4000, - 0x101e: 0x4000, 0x101f: 0x4000, 0x1020: 0x4000, 0x1021: 0x4000, 0x1022: 0x4000, 0x1023: 0x4000, - // Block 0x41, offset 0x1040 - 0x1040: 0x2000, 0x1041: 0x2000, 0x1042: 0x2000, 0x1043: 0x2000, 0x1044: 0x2000, 0x1045: 0x2000, - 0x1046: 0x2000, 0x1047: 0x2000, 0x1048: 0x2000, 0x1049: 0x2000, 0x104a: 0x2000, 0x104b: 0x2000, - 0x104c: 0x2000, 0x104d: 0x2000, 0x104e: 0x2000, 0x104f: 0x2000, 0x1050: 0x4000, 0x1051: 0x4000, - 0x1052: 0x4000, 0x1053: 0x4000, 0x1054: 0x4000, 0x1055: 0x4000, 0x1056: 0x4000, 0x1057: 0x4000, - 0x1058: 0x4000, 0x1059: 0x4000, - 0x1070: 0x4000, 0x1071: 0x4000, 0x1072: 0x4000, 0x1073: 0x4000, 0x1074: 0x4000, 0x1075: 0x4000, - 0x1076: 0x4000, 0x1077: 0x4000, 0x1078: 0x4000, 0x1079: 0x4000, 0x107a: 0x4000, 0x107b: 0x4000, - 0x107c: 0x4000, 0x107d: 0x4000, 0x107e: 0x4000, 0x107f: 0x4000, - // Block 0x42, offset 0x1080 - 0x1080: 0x4000, 0x1081: 0x4000, 0x1082: 0x4000, 0x1083: 0x4000, 0x1084: 0x4000, 0x1085: 0x4000, - 0x1086: 0x4000, 0x1087: 0x4000, 0x1088: 0x4000, 0x1089: 0x4000, 0x108a: 0x4000, 0x108b: 0x4000, - 0x108c: 0x4000, 0x108d: 0x4000, 0x108e: 0x4000, 0x108f: 0x4000, 0x1090: 0x4000, 0x1091: 0x4000, - 0x1092: 0x4000, 0x1094: 0x4000, 0x1095: 0x4000, 0x1096: 0x4000, 0x1097: 0x4000, - 0x1098: 0x4000, 0x1099: 0x4000, 0x109a: 0x4000, 0x109b: 0x4000, 0x109c: 0x4000, 0x109d: 0x4000, - 0x109e: 0x4000, 0x109f: 0x4000, 0x10a0: 0x4000, 0x10a1: 0x4000, 0x10a2: 0x4000, 0x10a3: 0x4000, - 0x10a4: 0x4000, 0x10a5: 0x4000, 0x10a6: 0x4000, 0x10a8: 0x4000, 0x10a9: 0x4000, - 0x10aa: 0x4000, 0x10ab: 0x4000, - // Block 0x43, offset 0x10c0 - 0x10c1: 0x9012, 0x10c2: 0x9012, 0x10c3: 0x9012, 0x10c4: 0x9012, 0x10c5: 0x9012, - 0x10c6: 0x9012, 0x10c7: 0x9012, 0x10c8: 0x9012, 0x10c9: 0x9012, 0x10ca: 0x9012, 0x10cb: 0x9012, - 0x10cc: 0x9012, 0x10cd: 0x9012, 0x10ce: 0x9012, 0x10cf: 0x9012, 0x10d0: 0x9012, 0x10d1: 0x9012, - 0x10d2: 0x9012, 0x10d3: 0x9012, 0x10d4: 0x9012, 0x10d5: 0x9012, 0x10d6: 0x9012, 0x10d7: 0x9012, - 0x10d8: 0x9012, 0x10d9: 0x9012, 0x10da: 0x9012, 0x10db: 0x9012, 0x10dc: 0x9012, 0x10dd: 0x9012, - 0x10de: 0x9012, 0x10df: 0x9012, 0x10e0: 0x9049, 0x10e1: 0x9049, 0x10e2: 0x9049, 0x10e3: 0x9049, - 0x10e4: 0x9049, 0x10e5: 0x9049, 0x10e6: 0x9049, 0x10e7: 0x9049, 0x10e8: 0x9049, 0x10e9: 0x9049, - 0x10ea: 0x9049, 0x10eb: 0x9049, 0x10ec: 0x9049, 0x10ed: 0x9049, 0x10ee: 0x9049, 0x10ef: 0x9049, - 0x10f0: 0x9049, 0x10f1: 0x9049, 0x10f2: 0x9049, 0x10f3: 0x9049, 0x10f4: 0x9049, 0x10f5: 0x9049, - 0x10f6: 0x9049, 0x10f7: 0x9049, 0x10f8: 0x9049, 0x10f9: 0x9049, 0x10fa: 0x9049, 0x10fb: 0x9049, - 0x10fc: 0x9049, 0x10fd: 0x9049, 0x10fe: 0x9049, 0x10ff: 0x9049, - // Block 0x44, offset 0x1100 - 0x1100: 0x9049, 0x1101: 0x9049, 0x1102: 0x9049, 0x1103: 0x9049, 0x1104: 0x9049, 0x1105: 0x9049, - 0x1106: 0x9049, 0x1107: 0x9049, 0x1108: 0x9049, 0x1109: 0x9049, 0x110a: 0x9049, 0x110b: 0x9049, - 0x110c: 0x9049, 0x110d: 0x9049, 0x110e: 0x9049, 0x110f: 0x9049, 0x1110: 0x9049, 0x1111: 0x9049, - 0x1112: 0x9049, 0x1113: 0x9049, 0x1114: 0x9049, 0x1115: 0x9049, 0x1116: 0x9049, 0x1117: 0x9049, - 0x1118: 0x9049, 0x1119: 0x9049, 0x111a: 0x9049, 0x111b: 0x9049, 0x111c: 0x9049, 0x111d: 0x9049, - 0x111e: 0x9049, 0x111f: 0x904a, 0x1120: 0x904b, 0x1121: 0xb04c, 0x1122: 0xb04d, 0x1123: 0xb04d, - 0x1124: 0xb04e, 0x1125: 0xb04f, 0x1126: 0xb050, 0x1127: 0xb051, 0x1128: 0xb052, 0x1129: 0xb053, - 0x112a: 0xb054, 0x112b: 0xb055, 0x112c: 0xb056, 0x112d: 0xb057, 0x112e: 0xb058, 0x112f: 0xb059, - 0x1130: 0xb05a, 0x1131: 0xb05b, 0x1132: 0xb05c, 0x1133: 0xb05d, 0x1134: 0xb05e, 0x1135: 0xb05f, - 0x1136: 0xb060, 0x1137: 0xb061, 0x1138: 0xb062, 0x1139: 0xb063, 0x113a: 0xb064, 0x113b: 0xb065, - 0x113c: 0xb052, 0x113d: 0xb066, 0x113e: 0xb067, 0x113f: 0xb055, - // Block 0x45, offset 0x1140 - 0x1140: 0xb068, 0x1141: 0xb069, 0x1142: 0xb06a, 0x1143: 0xb06b, 0x1144: 0xb05a, 0x1145: 0xb056, - 0x1146: 0xb06c, 0x1147: 0xb06d, 0x1148: 0xb06b, 0x1149: 0xb06e, 0x114a: 0xb06b, 0x114b: 0xb06f, - 0x114c: 0xb06f, 0x114d: 0xb070, 0x114e: 0xb070, 0x114f: 0xb071, 0x1150: 0xb056, 0x1151: 0xb072, - 0x1152: 0xb073, 0x1153: 0xb072, 0x1154: 0xb074, 0x1155: 0xb073, 0x1156: 0xb075, 0x1157: 0xb075, - 0x1158: 0xb076, 0x1159: 0xb076, 0x115a: 0xb077, 0x115b: 0xb077, 0x115c: 0xb073, 0x115d: 0xb078, - 0x115e: 0xb079, 0x115f: 0xb067, 0x1160: 0xb07a, 0x1161: 0xb07b, 0x1162: 0xb07b, 0x1163: 0xb07b, - 0x1164: 0xb07b, 0x1165: 0xb07b, 0x1166: 0xb07b, 0x1167: 0xb07b, 0x1168: 0xb07b, 0x1169: 0xb07b, - 0x116a: 0xb07b, 0x116b: 0xb07b, 0x116c: 0xb07b, 0x116d: 0xb07b, 0x116e: 0xb07b, 0x116f: 0xb07b, - 0x1170: 0xb07c, 0x1171: 0xb07c, 0x1172: 0xb07c, 0x1173: 0xb07c, 0x1174: 0xb07c, 0x1175: 0xb07c, - 0x1176: 0xb07c, 0x1177: 0xb07c, 0x1178: 0xb07c, 0x1179: 0xb07c, 0x117a: 0xb07c, 0x117b: 0xb07c, - 0x117c: 0xb07c, 0x117d: 0xb07c, 0x117e: 0xb07c, - // Block 0x46, offset 0x1180 - 0x1182: 0xb07d, 0x1183: 0xb07e, 0x1184: 0xb07f, 0x1185: 0xb080, - 0x1186: 0xb07f, 0x1187: 0xb07e, 0x118a: 0xb081, 0x118b: 0xb082, - 0x118c: 0xb083, 0x118d: 0xb07f, 0x118e: 0xb080, 0x118f: 0xb07f, - 0x1192: 0xb084, 0x1193: 0xb085, 0x1194: 0xb084, 0x1195: 0xb086, 0x1196: 0xb084, 0x1197: 0xb087, - 0x119a: 0xb088, 0x119b: 0xb089, 0x119c: 0xb08a, - 0x11a0: 0x908b, 0x11a1: 0x908b, 0x11a2: 0x908c, 0x11a3: 0x908d, - 0x11a4: 0x908b, 0x11a5: 0x908e, 0x11a6: 0x908f, 0x11a8: 0xb090, 0x11a9: 0xb091, - 0x11aa: 0xb092, 0x11ab: 0xb091, 0x11ac: 0xb093, 0x11ad: 0xb094, 0x11ae: 0xb095, - 0x11bd: 0x2000, - // Block 0x47, offset 0x11c0 - 0x11e0: 0x4000, - // Block 0x48, offset 0x1200 - 0x1200: 0x4000, 0x1201: 0x4000, 0x1202: 0x4000, 0x1203: 0x4000, 0x1204: 0x4000, 0x1205: 0x4000, - 0x1206: 0x4000, 0x1207: 0x4000, 0x1208: 0x4000, 0x1209: 0x4000, 0x120a: 0x4000, 0x120b: 0x4000, - 0x120c: 0x4000, 0x120d: 0x4000, 0x120e: 0x4000, 0x120f: 0x4000, 0x1210: 0x4000, 0x1211: 0x4000, - 0x1212: 0x4000, 0x1213: 0x4000, 0x1214: 0x4000, 0x1215: 0x4000, 0x1216: 0x4000, 0x1217: 0x4000, - 0x1218: 0x4000, 0x1219: 0x4000, 0x121a: 0x4000, 0x121b: 0x4000, 0x121c: 0x4000, 0x121d: 0x4000, - 0x121e: 0x4000, 0x121f: 0x4000, 0x1220: 0x4000, 0x1221: 0x4000, 0x1222: 0x4000, 0x1223: 0x4000, - 0x1224: 0x4000, 0x1225: 0x4000, 0x1226: 0x4000, 0x1227: 0x4000, 0x1228: 0x4000, 0x1229: 0x4000, - 0x122a: 0x4000, 0x122b: 0x4000, 0x122c: 0x4000, - // Block 0x49, offset 0x1240 - 0x1240: 0x4000, 0x1241: 0x4000, 0x1242: 0x4000, 0x1243: 0x4000, 0x1244: 0x4000, 0x1245: 0x4000, - 0x1246: 0x4000, 0x1247: 0x4000, 0x1248: 0x4000, 0x1249: 0x4000, 0x124a: 0x4000, 0x124b: 0x4000, - 0x124c: 0x4000, 0x124d: 0x4000, 0x124e: 0x4000, 0x124f: 0x4000, 0x1250: 0x4000, 0x1251: 0x4000, - 0x1252: 0x4000, 0x1253: 0x4000, 0x1254: 0x4000, 0x1255: 0x4000, 0x1256: 0x4000, 0x1257: 0x4000, - 0x1258: 0x4000, 0x1259: 0x4000, 0x125a: 0x4000, 0x125b: 0x4000, 0x125c: 0x4000, 0x125d: 0x4000, - 0x125e: 0x4000, 0x125f: 0x4000, 0x1260: 0x4000, 0x1261: 0x4000, 0x1262: 0x4000, 0x1263: 0x4000, - 0x1264: 0x4000, 0x1265: 0x4000, 0x1266: 0x4000, 0x1267: 0x4000, 0x1268: 0x4000, 0x1269: 0x4000, - 0x126a: 0x4000, 0x126b: 0x4000, 0x126c: 0x4000, 0x126d: 0x4000, 0x126e: 0x4000, 0x126f: 0x4000, - 0x1270: 0x4000, 0x1271: 0x4000, 0x1272: 0x4000, - // Block 0x4a, offset 0x1280 - 0x1280: 0x4000, 0x1281: 0x4000, - // Block 0x4b, offset 0x12c0 - 0x12c4: 0x4000, - // Block 0x4c, offset 0x1300 - 0x130f: 0x4000, - // Block 0x4d, offset 0x1340 - 0x1340: 0x2000, 0x1341: 0x2000, 0x1342: 0x2000, 0x1343: 0x2000, 0x1344: 0x2000, 0x1345: 0x2000, - 0x1346: 0x2000, 0x1347: 0x2000, 0x1348: 0x2000, 0x1349: 0x2000, 0x134a: 0x2000, - 0x1350: 0x2000, 0x1351: 0x2000, - 0x1352: 0x2000, 0x1353: 0x2000, 0x1354: 0x2000, 0x1355: 0x2000, 0x1356: 0x2000, 0x1357: 0x2000, - 0x1358: 0x2000, 0x1359: 0x2000, 0x135a: 0x2000, 0x135b: 0x2000, 0x135c: 0x2000, 0x135d: 0x2000, - 0x135e: 0x2000, 0x135f: 0x2000, 0x1360: 0x2000, 0x1361: 0x2000, 0x1362: 0x2000, 0x1363: 0x2000, - 0x1364: 0x2000, 0x1365: 0x2000, 0x1366: 0x2000, 0x1367: 0x2000, 0x1368: 0x2000, 0x1369: 0x2000, - 0x136a: 0x2000, 0x136b: 0x2000, 0x136c: 0x2000, 0x136d: 0x2000, - 0x1370: 0x2000, 0x1371: 0x2000, 0x1372: 0x2000, 0x1373: 0x2000, 0x1374: 0x2000, 0x1375: 0x2000, - 0x1376: 0x2000, 0x1377: 0x2000, 0x1378: 0x2000, 0x1379: 0x2000, 0x137a: 0x2000, 0x137b: 0x2000, - 0x137c: 0x2000, 0x137d: 0x2000, 0x137e: 0x2000, 0x137f: 0x2000, - // Block 0x4e, offset 0x1380 - 0x1380: 0x2000, 0x1381: 0x2000, 0x1382: 0x2000, 0x1383: 0x2000, 0x1384: 0x2000, 0x1385: 0x2000, - 0x1386: 0x2000, 0x1387: 0x2000, 0x1388: 0x2000, 0x1389: 0x2000, 0x138a: 0x2000, 0x138b: 0x2000, - 0x138c: 0x2000, 0x138d: 0x2000, 0x138e: 0x2000, 0x138f: 0x2000, 0x1390: 0x2000, 0x1391: 0x2000, - 0x1392: 0x2000, 0x1393: 0x2000, 0x1394: 0x2000, 0x1395: 0x2000, 0x1396: 0x2000, 0x1397: 0x2000, - 0x1398: 0x2000, 0x1399: 0x2000, 0x139a: 0x2000, 0x139b: 0x2000, 0x139c: 0x2000, 0x139d: 0x2000, - 0x139e: 0x2000, 0x139f: 0x2000, 0x13a0: 0x2000, 0x13a1: 0x2000, 0x13a2: 0x2000, 0x13a3: 0x2000, - 0x13a4: 0x2000, 0x13a5: 0x2000, 0x13a6: 0x2000, 0x13a7: 0x2000, 0x13a8: 0x2000, 0x13a9: 0x2000, - 0x13b0: 0x2000, 0x13b1: 0x2000, 0x13b2: 0x2000, 0x13b3: 0x2000, 0x13b4: 0x2000, 0x13b5: 0x2000, - 0x13b6: 0x2000, 0x13b7: 0x2000, 0x13b8: 0x2000, 0x13b9: 0x2000, 0x13ba: 0x2000, 0x13bb: 0x2000, - 0x13bc: 0x2000, 0x13bd: 0x2000, 0x13be: 0x2000, 0x13bf: 0x2000, - // Block 0x4f, offset 0x13c0 - 0x13c0: 0x2000, 0x13c1: 0x2000, 0x13c2: 0x2000, 0x13c3: 0x2000, 0x13c4: 0x2000, 0x13c5: 0x2000, - 0x13c6: 0x2000, 0x13c7: 0x2000, 0x13c8: 0x2000, 0x13c9: 0x2000, 0x13ca: 0x2000, 0x13cb: 0x2000, - 0x13cc: 0x2000, 0x13cd: 0x2000, 0x13ce: 0x4000, 0x13cf: 0x2000, 0x13d0: 0x2000, 0x13d1: 0x4000, - 0x13d2: 0x4000, 0x13d3: 0x4000, 0x13d4: 0x4000, 0x13d5: 0x4000, 0x13d6: 0x4000, 0x13d7: 0x4000, - 0x13d8: 0x4000, 0x13d9: 0x4000, 0x13da: 0x4000, 0x13db: 0x2000, 0x13dc: 0x2000, 0x13dd: 0x2000, - 0x13de: 0x2000, 0x13df: 0x2000, 0x13e0: 0x2000, 0x13e1: 0x2000, 0x13e2: 0x2000, 0x13e3: 0x2000, - 0x13e4: 0x2000, 0x13e5: 0x2000, 0x13e6: 0x2000, 0x13e7: 0x2000, 0x13e8: 0x2000, 0x13e9: 0x2000, - 0x13ea: 0x2000, 0x13eb: 0x2000, 0x13ec: 0x2000, - // Block 0x50, offset 0x1400 - 0x1400: 0x4000, 0x1401: 0x4000, 0x1402: 0x4000, - 0x1410: 0x4000, 0x1411: 0x4000, - 0x1412: 0x4000, 0x1413: 0x4000, 0x1414: 0x4000, 0x1415: 0x4000, 0x1416: 0x4000, 0x1417: 0x4000, - 0x1418: 0x4000, 0x1419: 0x4000, 0x141a: 0x4000, 0x141b: 0x4000, 0x141c: 0x4000, 0x141d: 0x4000, - 0x141e: 0x4000, 0x141f: 0x4000, 0x1420: 0x4000, 0x1421: 0x4000, 0x1422: 0x4000, 0x1423: 0x4000, - 0x1424: 0x4000, 0x1425: 0x4000, 0x1426: 0x4000, 0x1427: 0x4000, 0x1428: 0x4000, 0x1429: 0x4000, - 0x142a: 0x4000, 0x142b: 0x4000, 0x142c: 0x4000, 0x142d: 0x4000, 0x142e: 0x4000, 0x142f: 0x4000, - 0x1430: 0x4000, 0x1431: 0x4000, 0x1432: 0x4000, 0x1433: 0x4000, 0x1434: 0x4000, 0x1435: 0x4000, - 0x1436: 0x4000, 0x1437: 0x4000, 0x1438: 0x4000, 0x1439: 0x4000, 0x143a: 0x4000, 0x143b: 0x4000, - // Block 0x51, offset 0x1440 - 0x1440: 0x4000, 0x1441: 0x4000, 0x1442: 0x4000, 0x1443: 0x4000, 0x1444: 0x4000, 0x1445: 0x4000, - 0x1446: 0x4000, 0x1447: 0x4000, 0x1448: 0x4000, - 0x1450: 0x4000, 0x1451: 0x4000, - // Block 0x52, offset 0x1480 - 0x1480: 0x4000, 0x1481: 0x4000, 0x1482: 0x4000, 0x1483: 0x4000, 0x1484: 0x4000, 0x1485: 0x4000, - 0x1486: 0x4000, 0x1487: 0x4000, 0x1488: 0x4000, 0x1489: 0x4000, 0x148a: 0x4000, 0x148b: 0x4000, - 0x148c: 0x4000, 0x148d: 0x4000, 0x148e: 0x4000, 0x148f: 0x4000, 0x1490: 0x4000, 0x1491: 0x4000, - 0x1492: 0x4000, 0x1493: 0x4000, 0x1494: 0x4000, 0x1495: 0x4000, 0x1496: 0x4000, 0x1497: 0x4000, - 0x1498: 0x4000, 0x1499: 0x4000, 0x149a: 0x4000, 0x149b: 0x4000, 0x149c: 0x4000, 0x149d: 0x4000, - 0x149e: 0x4000, 0x149f: 0x4000, 0x14a0: 0x4000, - 0x14ad: 0x4000, 0x14ae: 0x4000, 0x14af: 0x4000, - 0x14b0: 0x4000, 0x14b1: 0x4000, 0x14b2: 0x4000, 0x14b3: 0x4000, 0x14b4: 0x4000, 0x14b5: 0x4000, - 0x14b7: 0x4000, 0x14b8: 0x4000, 0x14b9: 0x4000, 0x14ba: 0x4000, 0x14bb: 0x4000, - 0x14bc: 0x4000, 0x14bd: 0x4000, 0x14be: 0x4000, 0x14bf: 0x4000, - // Block 0x53, offset 0x14c0 - 0x14c0: 0x4000, 0x14c1: 0x4000, 0x14c2: 0x4000, 0x14c3: 0x4000, 0x14c4: 0x4000, 0x14c5: 0x4000, - 0x14c6: 0x4000, 0x14c7: 0x4000, 0x14c8: 0x4000, 0x14c9: 0x4000, 0x14ca: 0x4000, 0x14cb: 0x4000, - 0x14cc: 0x4000, 0x14cd: 0x4000, 0x14ce: 0x4000, 0x14cf: 0x4000, 0x14d0: 0x4000, 0x14d1: 0x4000, - 0x14d2: 0x4000, 0x14d3: 0x4000, 0x14d4: 0x4000, 0x14d5: 0x4000, 0x14d6: 0x4000, 0x14d7: 0x4000, - 0x14d8: 0x4000, 0x14d9: 0x4000, 0x14da: 0x4000, 0x14db: 0x4000, 0x14dc: 0x4000, 0x14dd: 0x4000, - 0x14de: 0x4000, 0x14df: 0x4000, 0x14e0: 0x4000, 0x14e1: 0x4000, 0x14e2: 0x4000, 0x14e3: 0x4000, - 0x14e4: 0x4000, 0x14e5: 0x4000, 0x14e6: 0x4000, 0x14e7: 0x4000, 0x14e8: 0x4000, 0x14e9: 0x4000, - 0x14ea: 0x4000, 0x14eb: 0x4000, 0x14ec: 0x4000, 0x14ed: 0x4000, 0x14ee: 0x4000, 0x14ef: 0x4000, - 0x14f0: 0x4000, 0x14f1: 0x4000, 0x14f2: 0x4000, 0x14f3: 0x4000, 0x14f4: 0x4000, 0x14f5: 0x4000, - 0x14f6: 0x4000, 0x14f7: 0x4000, 0x14f8: 0x4000, 0x14f9: 0x4000, 0x14fa: 0x4000, 0x14fb: 0x4000, - 0x14fc: 0x4000, 0x14fe: 0x4000, 0x14ff: 0x4000, - // Block 0x54, offset 0x1500 - 0x1500: 0x4000, 0x1501: 0x4000, 0x1502: 0x4000, 0x1503: 0x4000, 0x1504: 0x4000, 0x1505: 0x4000, - 0x1506: 0x4000, 0x1507: 0x4000, 0x1508: 0x4000, 0x1509: 0x4000, 0x150a: 0x4000, 0x150b: 0x4000, - 0x150c: 0x4000, 0x150d: 0x4000, 0x150e: 0x4000, 0x150f: 0x4000, 0x1510: 0x4000, 0x1511: 0x4000, - 0x1512: 0x4000, 0x1513: 0x4000, - 0x1520: 0x4000, 0x1521: 0x4000, 0x1522: 0x4000, 0x1523: 0x4000, - 0x1524: 0x4000, 0x1525: 0x4000, 0x1526: 0x4000, 0x1527: 0x4000, 0x1528: 0x4000, 0x1529: 0x4000, - 0x152a: 0x4000, 0x152b: 0x4000, 0x152c: 0x4000, 0x152d: 0x4000, 0x152e: 0x4000, 0x152f: 0x4000, - 0x1530: 0x4000, 0x1531: 0x4000, 0x1532: 0x4000, 0x1533: 0x4000, 0x1534: 0x4000, 0x1535: 0x4000, - 0x1536: 0x4000, 0x1537: 0x4000, 0x1538: 0x4000, 0x1539: 0x4000, 0x153a: 0x4000, 0x153b: 0x4000, - 0x153c: 0x4000, 0x153d: 0x4000, 0x153e: 0x4000, 0x153f: 0x4000, - // Block 0x55, offset 0x1540 - 0x1540: 0x4000, 0x1541: 0x4000, 0x1542: 0x4000, 0x1543: 0x4000, 0x1544: 0x4000, 0x1545: 0x4000, - 0x1546: 0x4000, 0x1547: 0x4000, 0x1548: 0x4000, 0x1549: 0x4000, 0x154a: 0x4000, - 0x154f: 0x4000, 0x1550: 0x4000, 0x1551: 0x4000, - 0x1552: 0x4000, 0x1553: 0x4000, - 0x1560: 0x4000, 0x1561: 0x4000, 0x1562: 0x4000, 0x1563: 0x4000, - 0x1564: 0x4000, 0x1565: 0x4000, 0x1566: 0x4000, 0x1567: 0x4000, 0x1568: 0x4000, 0x1569: 0x4000, - 0x156a: 0x4000, 0x156b: 0x4000, 0x156c: 0x4000, 0x156d: 0x4000, 0x156e: 0x4000, 0x156f: 0x4000, - 0x1570: 0x4000, 0x1574: 0x4000, - 0x1578: 0x4000, 0x1579: 0x4000, 0x157a: 0x4000, 0x157b: 0x4000, - 0x157c: 0x4000, 0x157d: 0x4000, 0x157e: 0x4000, 0x157f: 0x4000, - // Block 0x56, offset 0x1580 - 0x1580: 0x4000, 0x1582: 0x4000, 0x1583: 0x4000, 0x1584: 0x4000, 0x1585: 0x4000, - 0x1586: 0x4000, 0x1587: 0x4000, 0x1588: 0x4000, 0x1589: 0x4000, 0x158a: 0x4000, 0x158b: 0x4000, - 0x158c: 0x4000, 0x158d: 0x4000, 0x158e: 0x4000, 0x158f: 0x4000, 0x1590: 0x4000, 0x1591: 0x4000, - 0x1592: 0x4000, 0x1593: 0x4000, 0x1594: 0x4000, 0x1595: 0x4000, 0x1596: 0x4000, 0x1597: 0x4000, - 0x1598: 0x4000, 0x1599: 0x4000, 0x159a: 0x4000, 0x159b: 0x4000, 0x159c: 0x4000, 0x159d: 0x4000, - 0x159e: 0x4000, 0x159f: 0x4000, 0x15a0: 0x4000, 0x15a1: 0x4000, 0x15a2: 0x4000, 0x15a3: 0x4000, - 0x15a4: 0x4000, 0x15a5: 0x4000, 0x15a6: 0x4000, 0x15a7: 0x4000, 0x15a8: 0x4000, 0x15a9: 0x4000, - 0x15aa: 0x4000, 0x15ab: 0x4000, 0x15ac: 0x4000, 0x15ad: 0x4000, 0x15ae: 0x4000, 0x15af: 0x4000, - 0x15b0: 0x4000, 0x15b1: 0x4000, 0x15b2: 0x4000, 0x15b3: 0x4000, 0x15b4: 0x4000, 0x15b5: 0x4000, - 0x15b6: 0x4000, 0x15b7: 0x4000, 0x15b8: 0x4000, 0x15b9: 0x4000, 0x15ba: 0x4000, 0x15bb: 0x4000, - 0x15bc: 0x4000, 0x15bd: 0x4000, 0x15be: 0x4000, 0x15bf: 0x4000, - // Block 0x57, offset 0x15c0 - 0x15c0: 0x4000, 0x15c1: 0x4000, 0x15c2: 0x4000, 0x15c3: 0x4000, 0x15c4: 0x4000, 0x15c5: 0x4000, - 0x15c6: 0x4000, 0x15c7: 0x4000, 0x15c8: 0x4000, 0x15c9: 0x4000, 0x15ca: 0x4000, 0x15cb: 0x4000, - 0x15cc: 0x4000, 0x15cd: 0x4000, 0x15ce: 0x4000, 0x15cf: 0x4000, 0x15d0: 0x4000, 0x15d1: 0x4000, - 0x15d2: 0x4000, 0x15d3: 0x4000, 0x15d4: 0x4000, 0x15d5: 0x4000, 0x15d6: 0x4000, 0x15d7: 0x4000, - 0x15d8: 0x4000, 0x15d9: 0x4000, 0x15da: 0x4000, 0x15db: 0x4000, 0x15dc: 0x4000, 0x15dd: 0x4000, - 0x15de: 0x4000, 0x15df: 0x4000, 0x15e0: 0x4000, 0x15e1: 0x4000, 0x15e2: 0x4000, 0x15e3: 0x4000, - 0x15e4: 0x4000, 0x15e5: 0x4000, 0x15e6: 0x4000, 0x15e7: 0x4000, 0x15e8: 0x4000, 0x15e9: 0x4000, - 0x15ea: 0x4000, 0x15eb: 0x4000, 0x15ec: 0x4000, 0x15ed: 0x4000, 0x15ee: 0x4000, 0x15ef: 0x4000, - 0x15f0: 0x4000, 0x15f1: 0x4000, 0x15f2: 0x4000, 0x15f3: 0x4000, 0x15f4: 0x4000, 0x15f5: 0x4000, - 0x15f6: 0x4000, 0x15f7: 0x4000, 0x15f8: 0x4000, 0x15f9: 0x4000, 0x15fa: 0x4000, 0x15fb: 0x4000, - 0x15fc: 0x4000, 0x15ff: 0x4000, - // Block 0x58, offset 0x1600 - 0x1600: 0x4000, 0x1601: 0x4000, 0x1602: 0x4000, 0x1603: 0x4000, 0x1604: 0x4000, 0x1605: 0x4000, - 0x1606: 0x4000, 0x1607: 0x4000, 0x1608: 0x4000, 0x1609: 0x4000, 0x160a: 0x4000, 0x160b: 0x4000, - 0x160c: 0x4000, 0x160d: 0x4000, 0x160e: 0x4000, 0x160f: 0x4000, 0x1610: 0x4000, 0x1611: 0x4000, - 0x1612: 0x4000, 0x1613: 0x4000, 0x1614: 0x4000, 0x1615: 0x4000, 0x1616: 0x4000, 0x1617: 0x4000, - 0x1618: 0x4000, 0x1619: 0x4000, 0x161a: 0x4000, 0x161b: 0x4000, 0x161c: 0x4000, 0x161d: 0x4000, - 0x161e: 0x4000, 0x161f: 0x4000, 0x1620: 0x4000, 0x1621: 0x4000, 0x1622: 0x4000, 0x1623: 0x4000, - 0x1624: 0x4000, 0x1625: 0x4000, 0x1626: 0x4000, 0x1627: 0x4000, 0x1628: 0x4000, 0x1629: 0x4000, - 0x162a: 0x4000, 0x162b: 0x4000, 0x162c: 0x4000, 0x162d: 0x4000, 0x162e: 0x4000, 0x162f: 0x4000, - 0x1630: 0x4000, 0x1631: 0x4000, 0x1632: 0x4000, 0x1633: 0x4000, 0x1634: 0x4000, 0x1635: 0x4000, - 0x1636: 0x4000, 0x1637: 0x4000, 0x1638: 0x4000, 0x1639: 0x4000, 0x163a: 0x4000, 0x163b: 0x4000, - 0x163c: 0x4000, 0x163d: 0x4000, - // Block 0x59, offset 0x1640 - 0x164b: 0x4000, - 0x164c: 0x4000, 0x164d: 0x4000, 0x164e: 0x4000, 0x1650: 0x4000, 0x1651: 0x4000, - 0x1652: 0x4000, 0x1653: 0x4000, 0x1654: 0x4000, 0x1655: 0x4000, 0x1656: 0x4000, 0x1657: 0x4000, - 0x1658: 0x4000, 0x1659: 0x4000, 0x165a: 0x4000, 0x165b: 0x4000, 0x165c: 0x4000, 0x165d: 0x4000, - 0x165e: 0x4000, 0x165f: 0x4000, 0x1660: 0x4000, 0x1661: 0x4000, 0x1662: 0x4000, 0x1663: 0x4000, - 0x1664: 0x4000, 0x1665: 0x4000, 0x1666: 0x4000, 0x1667: 0x4000, - 0x167a: 0x4000, - // Block 0x5a, offset 0x1680 - 0x1695: 0x4000, 0x1696: 0x4000, - 0x16a4: 0x4000, - // Block 0x5b, offset 0x16c0 - 0x16fb: 0x4000, - 0x16fc: 0x4000, 0x16fd: 0x4000, 0x16fe: 0x4000, 0x16ff: 0x4000, - // Block 0x5c, offset 0x1700 - 0x1700: 0x4000, 0x1701: 0x4000, 0x1702: 0x4000, 0x1703: 0x4000, 0x1704: 0x4000, 0x1705: 0x4000, - 0x1706: 0x4000, 0x1707: 0x4000, 0x1708: 0x4000, 0x1709: 0x4000, 0x170a: 0x4000, 0x170b: 0x4000, - 0x170c: 0x4000, 0x170d: 0x4000, 0x170e: 0x4000, 0x170f: 0x4000, - // Block 0x5d, offset 0x1740 - 0x1740: 0x4000, 0x1741: 0x4000, 0x1742: 0x4000, 0x1743: 0x4000, 0x1744: 0x4000, 0x1745: 0x4000, - 0x174c: 0x4000, 0x1750: 0x4000, 0x1751: 0x4000, - 0x1752: 0x4000, - 0x176b: 0x4000, 0x176c: 0x4000, - 0x1774: 0x4000, 0x1775: 0x4000, - 0x1776: 0x4000, - // Block 0x5e, offset 0x1780 - 0x1790: 0x4000, 0x1791: 0x4000, - 0x1792: 0x4000, 0x1793: 0x4000, 0x1794: 0x4000, 0x1795: 0x4000, 0x1796: 0x4000, 0x1797: 0x4000, - 0x1798: 0x4000, 0x1799: 0x4000, 0x179a: 0x4000, 0x179b: 0x4000, 0x179c: 0x4000, 0x179d: 0x4000, - 0x179e: 0x4000, 0x17a0: 0x4000, 0x17a1: 0x4000, 0x17a2: 0x4000, 0x17a3: 0x4000, - 0x17a4: 0x4000, 0x17a5: 0x4000, 0x17a6: 0x4000, 0x17a7: 0x4000, - 0x17b0: 0x4000, 0x17b3: 0x4000, 0x17b4: 0x4000, 0x17b5: 0x4000, - 0x17b6: 0x4000, 0x17b7: 0x4000, 0x17b8: 0x4000, 0x17b9: 0x4000, 0x17ba: 0x4000, 0x17bb: 0x4000, - 0x17bc: 0x4000, 0x17bd: 0x4000, 0x17be: 0x4000, - // Block 0x5f, offset 0x17c0 - 0x17c0: 0x4000, 0x17c1: 0x4000, 0x17c2: 0x4000, 0x17c3: 0x4000, 0x17c4: 0x4000, 0x17c5: 0x4000, - 0x17c6: 0x4000, 0x17c7: 0x4000, 0x17c8: 0x4000, 0x17c9: 0x4000, 0x17ca: 0x4000, 0x17cb: 0x4000, - 0x17d0: 0x4000, 0x17d1: 0x4000, - 0x17d2: 0x4000, 0x17d3: 0x4000, 0x17d4: 0x4000, 0x17d5: 0x4000, 0x17d6: 0x4000, 0x17d7: 0x4000, - 0x17d8: 0x4000, 0x17d9: 0x4000, 0x17da: 0x4000, 0x17db: 0x4000, 0x17dc: 0x4000, 0x17dd: 0x4000, - 0x17de: 0x4000, - // Block 0x60, offset 0x1800 - 0x1800: 0x4000, 0x1801: 0x4000, 0x1802: 0x4000, 0x1803: 0x4000, 0x1804: 0x4000, 0x1805: 0x4000, - 0x1806: 0x4000, 0x1807: 0x4000, 0x1808: 0x4000, 0x1809: 0x4000, 0x180a: 0x4000, 0x180b: 0x4000, - 0x180c: 0x4000, 0x180d: 0x4000, 0x180e: 0x4000, 0x180f: 0x4000, 0x1810: 0x4000, 0x1811: 0x4000, - // Block 0x61, offset 0x1840 - 0x1840: 0x4000, - // Block 0x62, offset 0x1880 - 0x1880: 0x2000, 0x1881: 0x2000, 0x1882: 0x2000, 0x1883: 0x2000, 0x1884: 0x2000, 0x1885: 0x2000, - 0x1886: 0x2000, 0x1887: 0x2000, 0x1888: 0x2000, 0x1889: 0x2000, 0x188a: 0x2000, 0x188b: 0x2000, - 0x188c: 0x2000, 0x188d: 0x2000, 0x188e: 0x2000, 0x188f: 0x2000, 0x1890: 0x2000, 0x1891: 0x2000, - 0x1892: 0x2000, 0x1893: 0x2000, 0x1894: 0x2000, 0x1895: 0x2000, 0x1896: 0x2000, 0x1897: 0x2000, - 0x1898: 0x2000, 0x1899: 0x2000, 0x189a: 0x2000, 0x189b: 0x2000, 0x189c: 0x2000, 0x189d: 0x2000, - 0x189e: 0x2000, 0x189f: 0x2000, 0x18a0: 0x2000, 0x18a1: 0x2000, 0x18a2: 0x2000, 0x18a3: 0x2000, - 0x18a4: 0x2000, 0x18a5: 0x2000, 0x18a6: 0x2000, 0x18a7: 0x2000, 0x18a8: 0x2000, 0x18a9: 0x2000, - 0x18aa: 0x2000, 0x18ab: 0x2000, 0x18ac: 0x2000, 0x18ad: 0x2000, 0x18ae: 0x2000, 0x18af: 0x2000, - 0x18b0: 0x2000, 0x18b1: 0x2000, 0x18b2: 0x2000, 0x18b3: 0x2000, 0x18b4: 0x2000, 0x18b5: 0x2000, - 0x18b6: 0x2000, 0x18b7: 0x2000, 0x18b8: 0x2000, 0x18b9: 0x2000, 0x18ba: 0x2000, 0x18bb: 0x2000, - 0x18bc: 0x2000, 0x18bd: 0x2000, -} - -// widthIndex: 22 blocks, 1408 entries, 1408 bytes -// Block 0 is the zero block. -var widthIndex = [1408]uint8{ - // Block 0x0, offset 0x0 - // Block 0x1, offset 0x40 - // Block 0x2, offset 0x80 - // Block 0x3, offset 0xc0 - 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc7: 0x05, - 0xc9: 0x06, 0xcb: 0x07, 0xcc: 0x08, 0xcd: 0x09, 0xce: 0x0a, 0xcf: 0x0b, - 0xd0: 0x0c, 0xd1: 0x0d, - 0xe1: 0x02, 0xe2: 0x03, 0xe3: 0x04, 0xe4: 0x05, 0xe5: 0x06, 0xe6: 0x06, 0xe7: 0x06, - 0xe8: 0x06, 0xe9: 0x06, 0xea: 0x07, 0xeb: 0x06, 0xec: 0x06, 0xed: 0x08, 0xee: 0x09, 0xef: 0x0a, - 0xf0: 0x0f, 0xf3: 0x12, 0xf4: 0x13, - // Block 0x4, offset 0x100 - 0x104: 0x0e, 0x105: 0x0f, - // Block 0x5, offset 0x140 - 0x140: 0x10, 0x141: 0x11, 0x142: 0x12, 0x144: 0x13, 0x145: 0x14, 0x146: 0x15, 0x147: 0x16, - 0x148: 0x17, 0x149: 0x18, 0x14a: 0x19, 0x14c: 0x1a, 0x14f: 0x1b, - 0x151: 0x1c, 0x152: 0x08, 0x153: 0x1d, 0x154: 0x1e, 0x155: 0x1f, 0x156: 0x20, 0x157: 0x21, - 0x158: 0x22, 0x159: 0x23, 0x15a: 0x24, 0x15b: 0x25, 0x15c: 0x26, 0x15d: 0x27, 0x15e: 0x28, 0x15f: 0x29, - 0x166: 0x2a, - 0x16c: 0x2b, 0x16d: 0x2c, - 0x17a: 0x2d, 0x17b: 0x2e, 0x17c: 0x0e, 0x17d: 0x0e, 0x17e: 0x0e, 0x17f: 0x2f, - // Block 0x6, offset 0x180 - 0x180: 0x30, 0x181: 0x31, 0x182: 0x32, 0x183: 0x33, 0x184: 0x34, 0x185: 0x35, 0x186: 0x36, 0x187: 0x37, - 0x188: 0x38, 0x189: 0x39, 0x18a: 0x0e, 0x18b: 0x3a, 0x18c: 0x0e, 0x18d: 0x0e, 0x18e: 0x0e, 0x18f: 0x0e, - 0x190: 0x0e, 0x191: 0x0e, 0x192: 0x0e, 0x193: 0x0e, 0x194: 0x0e, 0x195: 0x0e, 0x196: 0x0e, 0x197: 0x0e, - 0x198: 0x0e, 0x199: 0x0e, 0x19a: 0x0e, 0x19b: 0x0e, 0x19c: 0x0e, 0x19d: 0x0e, 0x19e: 0x0e, 0x19f: 0x0e, - 0x1a0: 0x0e, 0x1a1: 0x0e, 0x1a2: 0x0e, 0x1a3: 0x0e, 0x1a4: 0x0e, 0x1a5: 0x0e, 0x1a6: 0x0e, 0x1a7: 0x0e, - 0x1a8: 0x0e, 0x1a9: 0x0e, 0x1aa: 0x0e, 0x1ab: 0x0e, 0x1ac: 0x0e, 0x1ad: 0x0e, 0x1ae: 0x0e, 0x1af: 0x0e, - 0x1b0: 0x0e, 0x1b1: 0x0e, 0x1b2: 0x0e, 0x1b3: 0x0e, 0x1b4: 0x0e, 0x1b5: 0x0e, 0x1b6: 0x0e, 0x1b7: 0x0e, - 0x1b8: 0x0e, 0x1b9: 0x0e, 0x1ba: 0x0e, 0x1bb: 0x0e, 0x1bc: 0x0e, 0x1bd: 0x0e, 0x1be: 0x0e, 0x1bf: 0x0e, - // Block 0x7, offset 0x1c0 - 0x1c0: 0x0e, 0x1c1: 0x0e, 0x1c2: 0x0e, 0x1c3: 0x0e, 0x1c4: 0x0e, 0x1c5: 0x0e, 0x1c6: 0x0e, 0x1c7: 0x0e, - 0x1c8: 0x0e, 0x1c9: 0x0e, 0x1ca: 0x0e, 0x1cb: 0x0e, 0x1cc: 0x0e, 0x1cd: 0x0e, 0x1ce: 0x0e, 0x1cf: 0x0e, - 0x1d0: 0x0e, 0x1d1: 0x0e, 0x1d2: 0x0e, 0x1d3: 0x0e, 0x1d4: 0x0e, 0x1d5: 0x0e, 0x1d6: 0x0e, 0x1d7: 0x0e, - 0x1d8: 0x0e, 0x1d9: 0x0e, 0x1da: 0x0e, 0x1db: 0x0e, 0x1dc: 0x0e, 0x1dd: 0x0e, 0x1de: 0x0e, 0x1df: 0x0e, - 0x1e0: 0x0e, 0x1e1: 0x0e, 0x1e2: 0x0e, 0x1e3: 0x0e, 0x1e4: 0x0e, 0x1e5: 0x0e, 0x1e6: 0x0e, 0x1e7: 0x0e, - 0x1e8: 0x0e, 0x1e9: 0x0e, 0x1ea: 0x0e, 0x1eb: 0x0e, 0x1ec: 0x0e, 0x1ed: 0x0e, 0x1ee: 0x0e, 0x1ef: 0x0e, - 0x1f0: 0x0e, 0x1f1: 0x0e, 0x1f2: 0x0e, 0x1f3: 0x0e, 0x1f4: 0x0e, 0x1f5: 0x0e, 0x1f6: 0x0e, - 0x1f8: 0x0e, 0x1f9: 0x0e, 0x1fa: 0x0e, 0x1fb: 0x0e, 0x1fc: 0x0e, 0x1fd: 0x0e, 0x1fe: 0x0e, 0x1ff: 0x0e, - // Block 0x8, offset 0x200 - 0x200: 0x0e, 0x201: 0x0e, 0x202: 0x0e, 0x203: 0x0e, 0x204: 0x0e, 0x205: 0x0e, 0x206: 0x0e, 0x207: 0x0e, - 0x208: 0x0e, 0x209: 0x0e, 0x20a: 0x0e, 0x20b: 0x0e, 0x20c: 0x0e, 0x20d: 0x0e, 0x20e: 0x0e, 0x20f: 0x0e, - 0x210: 0x0e, 0x211: 0x0e, 0x212: 0x0e, 0x213: 0x0e, 0x214: 0x0e, 0x215: 0x0e, 0x216: 0x0e, 0x217: 0x0e, - 0x218: 0x0e, 0x219: 0x0e, 0x21a: 0x0e, 0x21b: 0x0e, 0x21c: 0x0e, 0x21d: 0x0e, 0x21e: 0x0e, 0x21f: 0x0e, - 0x220: 0x0e, 0x221: 0x0e, 0x222: 0x0e, 0x223: 0x0e, 0x224: 0x0e, 0x225: 0x0e, 0x226: 0x0e, 0x227: 0x0e, - 0x228: 0x0e, 0x229: 0x0e, 0x22a: 0x0e, 0x22b: 0x0e, 0x22c: 0x0e, 0x22d: 0x0e, 0x22e: 0x0e, 0x22f: 0x0e, - 0x230: 0x0e, 0x231: 0x0e, 0x232: 0x0e, 0x233: 0x0e, 0x234: 0x0e, 0x235: 0x0e, 0x236: 0x0e, 0x237: 0x0e, - 0x238: 0x0e, 0x239: 0x0e, 0x23a: 0x0e, 0x23b: 0x0e, 0x23c: 0x0e, 0x23d: 0x0e, 0x23e: 0x0e, 0x23f: 0x0e, - // Block 0x9, offset 0x240 - 0x240: 0x0e, 0x241: 0x0e, 0x242: 0x0e, 0x243: 0x0e, 0x244: 0x0e, 0x245: 0x0e, 0x246: 0x0e, 0x247: 0x0e, - 0x248: 0x0e, 0x249: 0x0e, 0x24a: 0x0e, 0x24b: 0x0e, 0x24c: 0x0e, 0x24d: 0x0e, 0x24e: 0x0e, 0x24f: 0x0e, - 0x250: 0x0e, 0x251: 0x0e, 0x252: 0x3b, 0x253: 0x3c, - 0x265: 0x3d, - 0x270: 0x0e, 0x271: 0x0e, 0x272: 0x0e, 0x273: 0x0e, 0x274: 0x0e, 0x275: 0x0e, 0x276: 0x0e, 0x277: 0x0e, - 0x278: 0x0e, 0x279: 0x0e, 0x27a: 0x0e, 0x27b: 0x0e, 0x27c: 0x0e, 0x27d: 0x0e, 0x27e: 0x0e, 0x27f: 0x0e, - // Block 0xa, offset 0x280 - 0x280: 0x0e, 0x281: 0x0e, 0x282: 0x0e, 0x283: 0x0e, 0x284: 0x0e, 0x285: 0x0e, 0x286: 0x0e, 0x287: 0x0e, - 0x288: 0x0e, 0x289: 0x0e, 0x28a: 0x0e, 0x28b: 0x0e, 0x28c: 0x0e, 0x28d: 0x0e, 0x28e: 0x0e, 0x28f: 0x0e, - 0x290: 0x0e, 0x291: 0x0e, 0x292: 0x0e, 0x293: 0x0e, 0x294: 0x0e, 0x295: 0x0e, 0x296: 0x0e, 0x297: 0x0e, - 0x298: 0x0e, 0x299: 0x0e, 0x29a: 0x0e, 0x29b: 0x0e, 0x29c: 0x0e, 0x29d: 0x0e, 0x29e: 0x3e, - // Block 0xb, offset 0x2c0 - 0x2c0: 0x08, 0x2c1: 0x08, 0x2c2: 0x08, 0x2c3: 0x08, 0x2c4: 0x08, 0x2c5: 0x08, 0x2c6: 0x08, 0x2c7: 0x08, - 0x2c8: 0x08, 0x2c9: 0x08, 0x2ca: 0x08, 0x2cb: 0x08, 0x2cc: 0x08, 0x2cd: 0x08, 0x2ce: 0x08, 0x2cf: 0x08, - 0x2d0: 0x08, 0x2d1: 0x08, 0x2d2: 0x08, 0x2d3: 0x08, 0x2d4: 0x08, 0x2d5: 0x08, 0x2d6: 0x08, 0x2d7: 0x08, - 0x2d8: 0x08, 0x2d9: 0x08, 0x2da: 0x08, 0x2db: 0x08, 0x2dc: 0x08, 0x2dd: 0x08, 0x2de: 0x08, 0x2df: 0x08, - 0x2e0: 0x08, 0x2e1: 0x08, 0x2e2: 0x08, 0x2e3: 0x08, 0x2e4: 0x08, 0x2e5: 0x08, 0x2e6: 0x08, 0x2e7: 0x08, - 0x2e8: 0x08, 0x2e9: 0x08, 0x2ea: 0x08, 0x2eb: 0x08, 0x2ec: 0x08, 0x2ed: 0x08, 0x2ee: 0x08, 0x2ef: 0x08, - 0x2f0: 0x08, 0x2f1: 0x08, 0x2f2: 0x08, 0x2f3: 0x08, 0x2f4: 0x08, 0x2f5: 0x08, 0x2f6: 0x08, 0x2f7: 0x08, - 0x2f8: 0x08, 0x2f9: 0x08, 0x2fa: 0x08, 0x2fb: 0x08, 0x2fc: 0x08, 0x2fd: 0x08, 0x2fe: 0x08, 0x2ff: 0x08, - // Block 0xc, offset 0x300 - 0x300: 0x08, 0x301: 0x08, 0x302: 0x08, 0x303: 0x08, 0x304: 0x08, 0x305: 0x08, 0x306: 0x08, 0x307: 0x08, - 0x308: 0x08, 0x309: 0x08, 0x30a: 0x08, 0x30b: 0x08, 0x30c: 0x08, 0x30d: 0x08, 0x30e: 0x08, 0x30f: 0x08, - 0x310: 0x08, 0x311: 0x08, 0x312: 0x08, 0x313: 0x08, 0x314: 0x08, 0x315: 0x08, 0x316: 0x08, 0x317: 0x08, - 0x318: 0x08, 0x319: 0x08, 0x31a: 0x08, 0x31b: 0x08, 0x31c: 0x08, 0x31d: 0x08, 0x31e: 0x08, 0x31f: 0x08, - 0x320: 0x08, 0x321: 0x08, 0x322: 0x08, 0x323: 0x08, 0x324: 0x0e, 0x325: 0x0e, 0x326: 0x0e, 0x327: 0x0e, - 0x328: 0x0e, 0x329: 0x0e, 0x32a: 0x0e, 0x32b: 0x0e, - 0x338: 0x3f, 0x339: 0x40, 0x33c: 0x41, 0x33d: 0x42, 0x33e: 0x43, 0x33f: 0x44, - // Block 0xd, offset 0x340 - 0x37f: 0x45, - // Block 0xe, offset 0x380 - 0x380: 0x0e, 0x381: 0x0e, 0x382: 0x0e, 0x383: 0x0e, 0x384: 0x0e, 0x385: 0x0e, 0x386: 0x0e, 0x387: 0x0e, - 0x388: 0x0e, 0x389: 0x0e, 0x38a: 0x0e, 0x38b: 0x0e, 0x38c: 0x0e, 0x38d: 0x0e, 0x38e: 0x0e, 0x38f: 0x0e, - 0x390: 0x0e, 0x391: 0x0e, 0x392: 0x0e, 0x393: 0x0e, 0x394: 0x0e, 0x395: 0x0e, 0x396: 0x0e, 0x397: 0x0e, - 0x398: 0x0e, 0x399: 0x0e, 0x39a: 0x0e, 0x39b: 0x0e, 0x39c: 0x0e, 0x39d: 0x0e, 0x39e: 0x0e, 0x39f: 0x46, - 0x3a0: 0x0e, 0x3a1: 0x0e, 0x3a2: 0x0e, 0x3a3: 0x0e, 0x3a4: 0x0e, 0x3a5: 0x0e, 0x3a6: 0x0e, 0x3a7: 0x0e, - 0x3a8: 0x0e, 0x3a9: 0x0e, 0x3aa: 0x0e, 0x3ab: 0x47, - // Block 0xf, offset 0x3c0 - 0x3c0: 0x48, - // Block 0x10, offset 0x400 - 0x400: 0x49, 0x403: 0x4a, 0x404: 0x4b, 0x405: 0x4c, 0x406: 0x4d, - 0x408: 0x4e, 0x409: 0x4f, 0x40c: 0x50, 0x40d: 0x51, 0x40e: 0x52, 0x40f: 0x53, - 0x410: 0x3a, 0x411: 0x54, 0x412: 0x0e, 0x413: 0x55, 0x414: 0x56, 0x415: 0x57, 0x416: 0x58, 0x417: 0x59, - 0x418: 0x0e, 0x419: 0x5a, 0x41a: 0x0e, 0x41b: 0x5b, - 0x424: 0x5c, 0x425: 0x5d, 0x426: 0x5e, 0x427: 0x5f, - // Block 0x11, offset 0x440 - 0x456: 0x0b, 0x457: 0x06, - 0x458: 0x0c, 0x45b: 0x0d, 0x45f: 0x0e, - 0x460: 0x06, 0x461: 0x06, 0x462: 0x06, 0x463: 0x06, 0x464: 0x06, 0x465: 0x06, 0x466: 0x06, 0x467: 0x06, - 0x468: 0x06, 0x469: 0x06, 0x46a: 0x06, 0x46b: 0x06, 0x46c: 0x06, 0x46d: 0x06, 0x46e: 0x06, 0x46f: 0x06, - 0x470: 0x06, 0x471: 0x06, 0x472: 0x06, 0x473: 0x06, 0x474: 0x06, 0x475: 0x06, 0x476: 0x06, 0x477: 0x06, - 0x478: 0x06, 0x479: 0x06, 0x47a: 0x06, 0x47b: 0x06, 0x47c: 0x06, 0x47d: 0x06, 0x47e: 0x06, 0x47f: 0x06, - // Block 0x12, offset 0x480 - 0x484: 0x08, 0x485: 0x08, 0x486: 0x08, 0x487: 0x09, - // Block 0x13, offset 0x4c0 - 0x4c0: 0x08, 0x4c1: 0x08, 0x4c2: 0x08, 0x4c3: 0x08, 0x4c4: 0x08, 0x4c5: 0x08, 0x4c6: 0x08, 0x4c7: 0x08, - 0x4c8: 0x08, 0x4c9: 0x08, 0x4ca: 0x08, 0x4cb: 0x08, 0x4cc: 0x08, 0x4cd: 0x08, 0x4ce: 0x08, 0x4cf: 0x08, - 0x4d0: 0x08, 0x4d1: 0x08, 0x4d2: 0x08, 0x4d3: 0x08, 0x4d4: 0x08, 0x4d5: 0x08, 0x4d6: 0x08, 0x4d7: 0x08, - 0x4d8: 0x08, 0x4d9: 0x08, 0x4da: 0x08, 0x4db: 0x08, 0x4dc: 0x08, 0x4dd: 0x08, 0x4de: 0x08, 0x4df: 0x08, - 0x4e0: 0x08, 0x4e1: 0x08, 0x4e2: 0x08, 0x4e3: 0x08, 0x4e4: 0x08, 0x4e5: 0x08, 0x4e6: 0x08, 0x4e7: 0x08, - 0x4e8: 0x08, 0x4e9: 0x08, 0x4ea: 0x08, 0x4eb: 0x08, 0x4ec: 0x08, 0x4ed: 0x08, 0x4ee: 0x08, 0x4ef: 0x08, - 0x4f0: 0x08, 0x4f1: 0x08, 0x4f2: 0x08, 0x4f3: 0x08, 0x4f4: 0x08, 0x4f5: 0x08, 0x4f6: 0x08, 0x4f7: 0x08, - 0x4f8: 0x08, 0x4f9: 0x08, 0x4fa: 0x08, 0x4fb: 0x08, 0x4fc: 0x08, 0x4fd: 0x08, 0x4fe: 0x08, 0x4ff: 0x60, - // Block 0x14, offset 0x500 - 0x520: 0x10, - 0x530: 0x09, 0x531: 0x09, 0x532: 0x09, 0x533: 0x09, 0x534: 0x09, 0x535: 0x09, 0x536: 0x09, 0x537: 0x09, - 0x538: 0x09, 0x539: 0x09, 0x53a: 0x09, 0x53b: 0x09, 0x53c: 0x09, 0x53d: 0x09, 0x53e: 0x09, 0x53f: 0x11, - // Block 0x15, offset 0x540 - 0x540: 0x09, 0x541: 0x09, 0x542: 0x09, 0x543: 0x09, 0x544: 0x09, 0x545: 0x09, 0x546: 0x09, 0x547: 0x09, - 0x548: 0x09, 0x549: 0x09, 0x54a: 0x09, 0x54b: 0x09, 0x54c: 0x09, 0x54d: 0x09, 0x54e: 0x09, 0x54f: 0x11, -} - -// inverseData contains 4-byte entries of the following format: -// <length> <modified UTF-8-encoded rune> <0 padding> -// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the -// UTF-8 encoding of the original rune. Mappings often have the following -// pattern: -// A -> A (U+FF21 -> U+0041) -// B -> B (U+FF22 -> U+0042) -// ... -// By xor-ing the last byte the same entry can be shared by many mappings. This -// reduces the total number of distinct entries by about two thirds. -// The resulting entry for the aforementioned mappings is -// { 0x01, 0xE0, 0x00, 0x00 } -// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get -// E0 ^ A1 = 41. -// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get -// E0 ^ A2 = 42. -// Note that because of the xor-ing, the byte sequence stored in the entry is -// not valid UTF-8. -var inverseData = [150][4]byte{ - {0x00, 0x00, 0x00, 0x00}, - {0x03, 0xe3, 0x80, 0xa0}, - {0x03, 0xef, 0xbc, 0xa0}, - {0x03, 0xef, 0xbc, 0xe0}, - {0x03, 0xef, 0xbd, 0xe0}, - {0x03, 0xef, 0xbf, 0x02}, - {0x03, 0xef, 0xbf, 0x00}, - {0x03, 0xef, 0xbf, 0x0e}, - {0x03, 0xef, 0xbf, 0x0c}, - {0x03, 0xef, 0xbf, 0x0f}, - {0x03, 0xef, 0xbf, 0x39}, - {0x03, 0xef, 0xbf, 0x3b}, - {0x03, 0xef, 0xbf, 0x3f}, - {0x03, 0xef, 0xbf, 0x2a}, - {0x03, 0xef, 0xbf, 0x0d}, - {0x03, 0xef, 0xbf, 0x25}, - {0x03, 0xef, 0xbd, 0x1a}, - {0x03, 0xef, 0xbd, 0x26}, - {0x01, 0xa0, 0x00, 0x00}, - {0x03, 0xef, 0xbd, 0x25}, - {0x03, 0xef, 0xbd, 0x23}, - {0x03, 0xef, 0xbd, 0x2e}, - {0x03, 0xef, 0xbe, 0x07}, - {0x03, 0xef, 0xbe, 0x05}, - {0x03, 0xef, 0xbd, 0x06}, - {0x03, 0xef, 0xbd, 0x13}, - {0x03, 0xef, 0xbd, 0x0b}, - {0x03, 0xef, 0xbd, 0x16}, - {0x03, 0xef, 0xbd, 0x0c}, - {0x03, 0xef, 0xbd, 0x15}, - {0x03, 0xef, 0xbd, 0x0d}, - {0x03, 0xef, 0xbd, 0x1c}, - {0x03, 0xef, 0xbd, 0x02}, - {0x03, 0xef, 0xbd, 0x1f}, - {0x03, 0xef, 0xbd, 0x1d}, - {0x03, 0xef, 0xbd, 0x17}, - {0x03, 0xef, 0xbd, 0x08}, - {0x03, 0xef, 0xbd, 0x09}, - {0x03, 0xef, 0xbd, 0x0e}, - {0x03, 0xef, 0xbd, 0x04}, - {0x03, 0xef, 0xbd, 0x05}, - {0x03, 0xef, 0xbe, 0x3f}, - {0x03, 0xef, 0xbe, 0x00}, - {0x03, 0xef, 0xbd, 0x2c}, - {0x03, 0xef, 0xbe, 0x06}, - {0x03, 0xef, 0xbe, 0x0c}, - {0x03, 0xef, 0xbe, 0x0f}, - {0x03, 0xef, 0xbe, 0x0d}, - {0x03, 0xef, 0xbe, 0x0b}, - {0x03, 0xef, 0xbe, 0x19}, - {0x03, 0xef, 0xbe, 0x15}, - {0x03, 0xef, 0xbe, 0x11}, - {0x03, 0xef, 0xbe, 0x31}, - {0x03, 0xef, 0xbe, 0x33}, - {0x03, 0xef, 0xbd, 0x0f}, - {0x03, 0xef, 0xbe, 0x30}, - {0x03, 0xef, 0xbe, 0x3e}, - {0x03, 0xef, 0xbe, 0x32}, - {0x03, 0xef, 0xbe, 0x36}, - {0x03, 0xef, 0xbd, 0x14}, - {0x03, 0xef, 0xbe, 0x2e}, - {0x03, 0xef, 0xbd, 0x1e}, - {0x03, 0xef, 0xbe, 0x10}, - {0x03, 0xef, 0xbf, 0x13}, - {0x03, 0xef, 0xbf, 0x15}, - {0x03, 0xef, 0xbf, 0x17}, - {0x03, 0xef, 0xbf, 0x1f}, - {0x03, 0xef, 0xbf, 0x1d}, - {0x03, 0xef, 0xbf, 0x1b}, - {0x03, 0xef, 0xbf, 0x09}, - {0x03, 0xef, 0xbf, 0x0b}, - {0x03, 0xef, 0xbf, 0x37}, - {0x03, 0xef, 0xbe, 0x04}, - {0x01, 0xe0, 0x00, 0x00}, - {0x03, 0xe2, 0xa6, 0x1a}, - {0x03, 0xe2, 0xa6, 0x26}, - {0x03, 0xe3, 0x80, 0x23}, - {0x03, 0xe3, 0x80, 0x2e}, - {0x03, 0xe3, 0x80, 0x25}, - {0x03, 0xe3, 0x83, 0x1e}, - {0x03, 0xe3, 0x83, 0x14}, - {0x03, 0xe3, 0x82, 0x06}, - {0x03, 0xe3, 0x82, 0x0b}, - {0x03, 0xe3, 0x82, 0x0c}, - {0x03, 0xe3, 0x82, 0x0d}, - {0x03, 0xe3, 0x82, 0x02}, - {0x03, 0xe3, 0x83, 0x0f}, - {0x03, 0xe3, 0x83, 0x08}, - {0x03, 0xe3, 0x83, 0x09}, - {0x03, 0xe3, 0x83, 0x2c}, - {0x03, 0xe3, 0x83, 0x0c}, - {0x03, 0xe3, 0x82, 0x13}, - {0x03, 0xe3, 0x82, 0x16}, - {0x03, 0xe3, 0x82, 0x15}, - {0x03, 0xe3, 0x82, 0x1c}, - {0x03, 0xe3, 0x82, 0x1f}, - {0x03, 0xe3, 0x82, 0x1d}, - {0x03, 0xe3, 0x82, 0x1a}, - {0x03, 0xe3, 0x82, 0x17}, - {0x03, 0xe3, 0x82, 0x08}, - {0x03, 0xe3, 0x82, 0x09}, - {0x03, 0xe3, 0x82, 0x0e}, - {0x03, 0xe3, 0x82, 0x04}, - {0x03, 0xe3, 0x82, 0x05}, - {0x03, 0xe3, 0x82, 0x3f}, - {0x03, 0xe3, 0x83, 0x00}, - {0x03, 0xe3, 0x83, 0x06}, - {0x03, 0xe3, 0x83, 0x05}, - {0x03, 0xe3, 0x83, 0x0d}, - {0x03, 0xe3, 0x83, 0x0b}, - {0x03, 0xe3, 0x83, 0x07}, - {0x03, 0xe3, 0x83, 0x19}, - {0x03, 0xe3, 0x83, 0x15}, - {0x03, 0xe3, 0x83, 0x11}, - {0x03, 0xe3, 0x83, 0x31}, - {0x03, 0xe3, 0x83, 0x33}, - {0x03, 0xe3, 0x83, 0x30}, - {0x03, 0xe3, 0x83, 0x3e}, - {0x03, 0xe3, 0x83, 0x32}, - {0x03, 0xe3, 0x83, 0x36}, - {0x03, 0xe3, 0x83, 0x2e}, - {0x03, 0xe3, 0x82, 0x07}, - {0x03, 0xe3, 0x85, 0x04}, - {0x03, 0xe3, 0x84, 0x10}, - {0x03, 0xe3, 0x85, 0x30}, - {0x03, 0xe3, 0x85, 0x0d}, - {0x03, 0xe3, 0x85, 0x13}, - {0x03, 0xe3, 0x85, 0x15}, - {0x03, 0xe3, 0x85, 0x17}, - {0x03, 0xe3, 0x85, 0x1f}, - {0x03, 0xe3, 0x85, 0x1d}, - {0x03, 0xe3, 0x85, 0x1b}, - {0x03, 0xe3, 0x85, 0x09}, - {0x03, 0xe3, 0x85, 0x0f}, - {0x03, 0xe3, 0x85, 0x0b}, - {0x03, 0xe3, 0x85, 0x37}, - {0x03, 0xe3, 0x85, 0x3b}, - {0x03, 0xe3, 0x85, 0x39}, - {0x03, 0xe3, 0x85, 0x3f}, - {0x02, 0xc2, 0x02, 0x00}, - {0x02, 0xc2, 0x0e, 0x00}, - {0x02, 0xc2, 0x0c, 0x00}, - {0x02, 0xc2, 0x00, 0x00}, - {0x03, 0xe2, 0x82, 0x0f}, - {0x03, 0xe2, 0x94, 0x2a}, - {0x03, 0xe2, 0x86, 0x39}, - {0x03, 0xe2, 0x86, 0x3b}, - {0x03, 0xe2, 0x86, 0x3f}, - {0x03, 0xe2, 0x96, 0x0d}, - {0x03, 0xe2, 0x97, 0x25}, -} - -// Total table size 14680 bytes (14KiB) diff --git a/vendor/golang.org/x/text/width/tables_test.go b/vendor/golang.org/x/text/width/tables_test.go deleted file mode 100644 index 189febd3c..000000000 --- a/vendor/golang.org/x/text/width/tables_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package width - -import ( - "testing" - - "golang.org/x/text/internal/testtext" -) - -const ( - loSurrogate = 0xD800 - hiSurrogate = 0xDFFF -) - -func TestTables(t *testing.T) { - testtext.SkipIfNotLong(t) - - runes := map[rune]Kind{} - getWidthData(func(r rune, tag elem, _ rune) { - runes[r] = tag.kind() - }) - for r := rune(0); r < 0x10FFFF; r++ { - if loSurrogate <= r && r <= hiSurrogate { - continue - } - p := LookupRune(r) - if got, want := p.Kind(), runes[r]; got != want { - t.Errorf("Kind of %U was %s; want %s.", r, got, want) - } - want, mapped := foldRune(r) - if got := p.Folded(); (got == 0) == mapped || got != 0 && got != want { - t.Errorf("Folded(%U) = %U; want %U", r, got, want) - } - want, mapped = widenRune(r) - if got := p.Wide(); (got == 0) == mapped || got != 0 && got != want { - t.Errorf("Wide(%U) = %U; want %U", r, got, want) - } - want, mapped = narrowRune(r) - if got := p.Narrow(); (got == 0) == mapped || got != 0 && got != want { - t.Errorf("Narrow(%U) = %U; want %U", r, got, want) - } - } -} - -// TestAmbiguous verifies that that ambiguous runes with a mapping always map to -// a halfwidth rune. -func TestAmbiguous(t *testing.T) { - for r, m := range mapRunes { - if m.e != tagAmbiguous { - continue - } - if k := mapRunes[m.r].e.kind(); k != EastAsianHalfwidth { - t.Errorf("Rune %U is ambiguous and maps to a rune of type %v", r, k) - } - } -} diff --git a/vendor/golang.org/x/text/width/transform.go b/vendor/golang.org/x/text/width/transform.go deleted file mode 100644 index 0049f700a..000000000 --- a/vendor/golang.org/x/text/width/transform.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package width - -import ( - "unicode/utf8" - - "golang.org/x/text/transform" -) - -type foldTransform struct { - transform.NopResetter -} - -func (foldTransform) Span(src []byte, atEOF bool) (n int, err error) { - for n < len(src) { - if src[n] < utf8.RuneSelf { - // ASCII fast path. - for n++; n < len(src) && src[n] < utf8.RuneSelf; n++ { - } - continue - } - v, size := trie.lookup(src[n:]) - if size == 0 { // incomplete UTF-8 encoding - if !atEOF { - err = transform.ErrShortSrc - } else { - n = len(src) - } - break - } - if elem(v)&tagNeedsFold != 0 { - err = transform.ErrEndOfSpan - break - } - n += size - } - return n, err -} - -func (foldTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - for nSrc < len(src) { - if src[nSrc] < utf8.RuneSelf { - // ASCII fast path. - start, end := nSrc, len(src) - if d := len(dst) - nDst; d < end-start { - end = nSrc + d - } - for nSrc++; nSrc < end && src[nSrc] < utf8.RuneSelf; nSrc++ { - } - n := copy(dst[nDst:], src[start:nSrc]) - if nDst += n; nDst == len(dst) { - nSrc = start + n - if nSrc == len(src) { - return nDst, nSrc, nil - } - if src[nSrc] < utf8.RuneSelf { - return nDst, nSrc, transform.ErrShortDst - } - } - continue - } - v, size := trie.lookup(src[nSrc:]) - if size == 0 { // incomplete UTF-8 encoding - if !atEOF { - return nDst, nSrc, transform.ErrShortSrc - } - size = 1 // gobble 1 byte - } - if elem(v)&tagNeedsFold == 0 { - if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { - return nDst, nSrc, transform.ErrShortDst - } - nDst += size - } else { - data := inverseData[byte(v)] - if len(dst)-nDst < int(data[0]) { - return nDst, nSrc, transform.ErrShortDst - } - i := 1 - for end := int(data[0]); i < end; i++ { - dst[nDst] = data[i] - nDst++ - } - dst[nDst] = data[i] ^ src[nSrc+size-1] - nDst++ - } - nSrc += size - } - return nDst, nSrc, nil -} - -type narrowTransform struct { - transform.NopResetter -} - -func (narrowTransform) Span(src []byte, atEOF bool) (n int, err error) { - for n < len(src) { - if src[n] < utf8.RuneSelf { - // ASCII fast path. - for n++; n < len(src) && src[n] < utf8.RuneSelf; n++ { - } - continue - } - v, size := trie.lookup(src[n:]) - if size == 0 { // incomplete UTF-8 encoding - if !atEOF { - err = transform.ErrShortSrc - } else { - n = len(src) - } - break - } - if k := elem(v).kind(); byte(v) == 0 || k != EastAsianFullwidth && k != EastAsianWide && k != EastAsianAmbiguous { - } else { - err = transform.ErrEndOfSpan - break - } - n += size - } - return n, err -} - -func (narrowTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - for nSrc < len(src) { - if src[nSrc] < utf8.RuneSelf { - // ASCII fast path. - start, end := nSrc, len(src) - if d := len(dst) - nDst; d < end-start { - end = nSrc + d - } - for nSrc++; nSrc < end && src[nSrc] < utf8.RuneSelf; nSrc++ { - } - n := copy(dst[nDst:], src[start:nSrc]) - if nDst += n; nDst == len(dst) { - nSrc = start + n - if nSrc == len(src) { - return nDst, nSrc, nil - } - if src[nSrc] < utf8.RuneSelf { - return nDst, nSrc, transform.ErrShortDst - } - } - continue - } - v, size := trie.lookup(src[nSrc:]) - if size == 0 { // incomplete UTF-8 encoding - if !atEOF { - return nDst, nSrc, transform.ErrShortSrc - } - size = 1 // gobble 1 byte - } - if k := elem(v).kind(); byte(v) == 0 || k != EastAsianFullwidth && k != EastAsianWide && k != EastAsianAmbiguous { - if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { - return nDst, nSrc, transform.ErrShortDst - } - nDst += size - } else { - data := inverseData[byte(v)] - if len(dst)-nDst < int(data[0]) { - return nDst, nSrc, transform.ErrShortDst - } - i := 1 - for end := int(data[0]); i < end; i++ { - dst[nDst] = data[i] - nDst++ - } - dst[nDst] = data[i] ^ src[nSrc+size-1] - nDst++ - } - nSrc += size - } - return nDst, nSrc, nil -} - -type wideTransform struct { - transform.NopResetter -} - -func (wideTransform) Span(src []byte, atEOF bool) (n int, err error) { - for n < len(src) { - // TODO: Consider ASCII fast path. Special-casing ASCII handling can - // reduce the ns/op of BenchmarkWideASCII by about 30%. This is probably - // not enough to warrant the extra code and complexity. - v, size := trie.lookup(src[n:]) - if size == 0 { // incomplete UTF-8 encoding - if !atEOF { - err = transform.ErrShortSrc - } else { - n = len(src) - } - break - } - if k := elem(v).kind(); byte(v) == 0 || k != EastAsianHalfwidth && k != EastAsianNarrow { - } else { - err = transform.ErrEndOfSpan - break - } - n += size - } - return n, err -} - -func (wideTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - for nSrc < len(src) { - // TODO: Consider ASCII fast path. Special-casing ASCII handling can - // reduce the ns/op of BenchmarkWideASCII by about 30%. This is probably - // not enough to warrant the extra code and complexity. - v, size := trie.lookup(src[nSrc:]) - if size == 0 { // incomplete UTF-8 encoding - if !atEOF { - return nDst, nSrc, transform.ErrShortSrc - } - size = 1 // gobble 1 byte - } - if k := elem(v).kind(); byte(v) == 0 || k != EastAsianHalfwidth && k != EastAsianNarrow { - if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { - return nDst, nSrc, transform.ErrShortDst - } - nDst += size - } else { - data := inverseData[byte(v)] - if len(dst)-nDst < int(data[0]) { - return nDst, nSrc, transform.ErrShortDst - } - i := 1 - for end := int(data[0]); i < end; i++ { - dst[nDst] = data[i] - nDst++ - } - dst[nDst] = data[i] ^ src[nSrc+size-1] - nDst++ - } - nSrc += size - } - return nDst, nSrc, nil -} diff --git a/vendor/golang.org/x/text/width/transform_test.go b/vendor/golang.org/x/text/width/transform_test.go deleted file mode 100644 index f9122d6db..000000000 --- a/vendor/golang.org/x/text/width/transform_test.go +++ /dev/null @@ -1,701 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package width - -import ( - "bytes" - "strings" - "testing" - - "golang.org/x/text/internal/testtext" - "golang.org/x/text/transform" -) - -func foldRune(r rune) (folded rune, ok bool) { - alt, ok := mapRunes[r] - if ok && alt.e&tagNeedsFold != 0 { - return alt.r, true - } - return r, false -} - -func widenRune(r rune) (wide rune, ok bool) { - alt, ok := mapRunes[r] - if k := alt.e.kind(); k == EastAsianHalfwidth || k == EastAsianNarrow { - return alt.r, true - } - return r, false -} - -func narrowRune(r rune) (narrow rune, ok bool) { - alt, ok := mapRunes[r] - if k := alt.e.kind(); k == EastAsianFullwidth || k == EastAsianWide || k == EastAsianAmbiguous { - return alt.r, true - } - return r, false -} - -func TestFoldSingleRunes(t *testing.T) { - for r := rune(0); r < 0x1FFFF; r++ { - if loSurrogate <= r && r <= hiSurrogate { - continue - } - x, _ := foldRune(r) - want := string(x) - got := Fold.String(string(r)) - if got != want { - t.Errorf("Fold().String(%U) = %+q; want %+q", r, got, want) - } - } -} - -type transformTest struct { - desc string - src string - nBuf int - nDst int - atEOF bool - dst string - nSrc int - err error - nSpan int - errSpan error -} - -func (tc *transformTest) doTest(t *testing.T, tr Transformer) { - testtext.Run(t, tc.desc, func(t *testing.T) { - b := make([]byte, tc.nBuf) - nDst, nSrc, err := tr.Transform(b, []byte(tc.src), tc.atEOF) - if got := string(b[:nDst]); got != tc.dst[:nDst] { - t.Errorf("dst was %+q; want %+q", got, tc.dst) - } - if nDst != tc.nDst { - t.Errorf("nDst was %d; want %d", nDst, tc.nDst) - } - if nSrc != tc.nSrc { - t.Errorf("nSrc was %d; want %d", nSrc, tc.nSrc) - } - if err != tc.err { - t.Errorf("error was %v; want %v", err, tc.err) - } - if got := tr.String(tc.src); got != tc.dst { - t.Errorf("String(%q) = %q; want %q", tc.src, got, tc.dst) - } - n, err := tr.Span([]byte(tc.src), tc.atEOF) - if n != tc.nSpan || err != tc.errSpan { - t.Errorf("Span: got %d, %v; want %d, %v", n, err, tc.nSpan, tc.errSpan) - } - }) -} - -func TestFold(t *testing.T) { - for _, tc := range []transformTest{{ - desc: "empty", - src: "", - nBuf: 10, - dst: "", - nDst: 0, - nSrc: 0, - atEOF: false, - err: nil, - nSpan: 0, - errSpan: nil, - }, { - desc: "short source 1", - src: "a\xc2", - nBuf: 10, - dst: "a\xc2", - nDst: 1, - nSrc: 1, - atEOF: false, - err: transform.ErrShortSrc, - nSpan: 1, - errSpan: transform.ErrShortSrc, - }, { - desc: "short source 2", - src: "a\xe0\x80", - nBuf: 10, - dst: "a\xe0\x80", - nDst: 1, - nSrc: 1, - atEOF: false, - err: transform.ErrShortSrc, - nSpan: 1, - errSpan: transform.ErrShortSrc, - }, { - desc: "incomplete but terminated source 1", - src: "a\xc2", - nBuf: 10, - dst: "a\xc2", - nDst: 2, - nSrc: 2, - atEOF: true, - err: nil, - nSpan: 2, - errSpan: nil, - }, { - desc: "incomplete but terminated source 2", - src: "a\xe0\x80", - nBuf: 10, - dst: "a\xe0\x80", - nDst: 3, - nSrc: 3, - atEOF: true, - err: nil, - nSpan: 3, - errSpan: nil, - }, { - desc: "exact fit dst", - src: "a\uff01", - nBuf: 2, - dst: "a!", - nDst: 2, - nSrc: 4, - atEOF: false, - err: nil, - nSpan: 1, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "exact fit dst and src ascii", - src: "ab", - nBuf: 2, - dst: "ab", - nDst: 2, - nSrc: 2, - atEOF: true, - err: nil, - nSpan: 2, - errSpan: nil, - }, { - desc: "empty dst", - src: "\u0300", - nBuf: 0, - dst: "\u0300", - nDst: 0, - nSrc: 0, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 2, - errSpan: nil, - }, { - desc: "empty dst ascii", - src: "a", - nBuf: 0, - dst: "a", - nDst: 0, - nSrc: 0, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 1, - errSpan: nil, - }, { - desc: "short dst 1", - src: "a\uffe0", // ¢ - nBuf: 2, - dst: "a\u00a2", // ¢ - nDst: 1, - nSrc: 1, - atEOF: false, - err: transform.ErrShortDst, - nSpan: 1, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "short dst 2", - src: "不夠", - nBuf: 3, - dst: "不夠", - nDst: 3, - nSrc: 3, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 6, - errSpan: nil, - }, { - desc: "short dst fast path", - src: "fast", - nDst: 3, - dst: "fast", - nBuf: 3, - nSrc: 3, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 4, - errSpan: nil, - }, { - desc: "short dst larger buffer", - src: "\uff21" + strings.Repeat("0", 127) + "B", - nBuf: 128, - dst: "A" + strings.Repeat("0", 127) + "B", - nDst: 128, - nSrc: 130, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "fast path alternation", - src: "fast路徑fast路徑", - nBuf: 20, - dst: "fast路徑fast路徑", - nDst: 20, - nSrc: 20, - atEOF: true, - err: nil, - nSpan: 20, - errSpan: nil, - }} { - tc.doTest(t, Fold) - } -} - -func TestWidenSingleRunes(t *testing.T) { - for r := rune(0); r < 0x1FFFF; r++ { - if loSurrogate <= r && r <= hiSurrogate { - continue - } - alt, _ := widenRune(r) - want := string(alt) - got := Widen.String(string(r)) - if got != want { - t.Errorf("Widen().String(%U) = %+q; want %+q", r, got, want) - } - } -} - -func TestWiden(t *testing.T) { - for _, tc := range []transformTest{{ - desc: "empty", - src: "", - nBuf: 10, - dst: "", - nDst: 0, - nSrc: 0, - atEOF: false, - err: nil, - nSpan: 0, - errSpan: nil, - }, { - desc: "short source 1", - src: "a\xc2", - nBuf: 10, - dst: "a\xc2", - nDst: 3, - nSrc: 1, - atEOF: false, - err: transform.ErrShortSrc, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "short source 2", - src: "a\xe0\x80", - nBuf: 10, - dst: "a\xe0\x80", - nDst: 3, - nSrc: 1, - atEOF: false, - err: transform.ErrShortSrc, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "incomplete but terminated source 1", - src: "a\xc2", - nBuf: 10, - dst: "a\xc2", - nDst: 4, - nSrc: 2, - atEOF: true, - err: nil, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "incomplete but terminated source 2", - src: "a\xe0\x80", - nBuf: 10, - dst: "a\xe0\x80", - nDst: 5, - nSrc: 3, - atEOF: true, - err: nil, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "short source 1 some span", - src: "a\xc2", - nBuf: 10, - dst: "a\xc2", - nDst: 3, - nSrc: 3, - atEOF: false, - err: transform.ErrShortSrc, - nSpan: 3, - errSpan: transform.ErrShortSrc, - }, { - desc: "short source 2 some span", - src: "a\xe0\x80", - nBuf: 10, - dst: "a\xe0\x80", - nDst: 3, - nSrc: 3, - atEOF: false, - err: transform.ErrShortSrc, - nSpan: 3, - errSpan: transform.ErrShortSrc, - }, { - desc: "incomplete but terminated source 1 some span", - src: "a\xc2", - nBuf: 10, - dst: "a\xc2", - nDst: 4, - nSrc: 4, - atEOF: true, - err: nil, - nSpan: 4, - errSpan: nil, - }, { - desc: "incomplete but terminated source 2 some span", - src: "a\xe0\x80", - nBuf: 10, - dst: "a\xe0\x80", - nDst: 5, - nSrc: 5, - atEOF: true, - err: nil, - nSpan: 5, - errSpan: nil, - }, { - desc: "exact fit dst", - src: "a!", - nBuf: 6, - dst: "a\uff01", - nDst: 6, - nSrc: 2, - atEOF: false, - err: nil, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "empty dst", - src: "\u0300", - nBuf: 0, - dst: "\u0300", - nDst: 0, - nSrc: 0, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 2, - errSpan: nil, - }, { - desc: "empty dst ascii", - src: "a", - nBuf: 0, - dst: "a", - nDst: 0, - nSrc: 0, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "short dst 1", - src: "a\uffe0", - nBuf: 4, - dst: "a\uffe0", - nDst: 3, - nSrc: 1, - atEOF: false, - err: transform.ErrShortDst, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "short dst 2", - src: "不夠", - nBuf: 3, - dst: "不夠", - nDst: 3, - nSrc: 3, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 6, - errSpan: nil, - }, { - desc: "short dst ascii", - src: "ascii", - nBuf: 3, - dst: "ascii", // U+ff41, ... - nDst: 3, - nSrc: 1, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "ambiguous", - src: "\uffe9", - nBuf: 4, - dst: "\u2190", - nDst: 3, - nSrc: 3, - atEOF: false, - err: nil, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }} { - tc.doTest(t, Widen) - } -} - -func TestNarrowSingleRunes(t *testing.T) { - for r := rune(0); r < 0x1FFFF; r++ { - if loSurrogate <= r && r <= hiSurrogate { - continue - } - alt, _ := narrowRune(r) - want := string(alt) - got := Narrow.String(string(r)) - if got != want { - t.Errorf("Narrow().String(%U) = %+q; want %+q", r, got, want) - } - } -} - -func TestNarrow(t *testing.T) { - for _, tc := range []transformTest{{ - desc: "empty", - src: "", - nBuf: 10, - dst: "", - nDst: 0, - nSrc: 0, - atEOF: false, - err: nil, - nSpan: 0, - errSpan: nil, - }, { - desc: "short source 1", - src: "a\xc2", - nBuf: 10, - dst: "a\xc2", - nDst: 1, - nSrc: 1, - atEOF: false, - err: transform.ErrShortSrc, - nSpan: 1, - errSpan: transform.ErrShortSrc, - }, { - desc: "short source 2", - src: "a\xe0\x80", - nBuf: 10, - dst: "a\xe0\x80", - nDst: 1, - nSrc: 3, - atEOF: false, - err: transform.ErrShortSrc, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "incomplete but terminated source 1", - src: "a\xc2", - nBuf: 10, - dst: "a\xc2", - nDst: 2, - nSrc: 4, - atEOF: true, - err: nil, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "incomplete but terminated source 2", - src: "a\xe0\x80", - nBuf: 10, - dst: "a\xe0\x80", - nDst: 3, - nSrc: 5, - atEOF: true, - err: nil, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "exact fit dst", - src: "a\uff01", - nBuf: 2, - dst: "a!", - nDst: 2, - nSrc: 6, - atEOF: false, - err: nil, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "exact fit dst some span", - src: "a\uff01", - nBuf: 2, - dst: "a!", - nDst: 2, - nSrc: 4, - atEOF: false, - err: nil, - nSpan: 1, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "empty dst", - src: "\u0300", - nBuf: 0, - dst: "\u0300", - nDst: 0, - nSrc: 0, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 2, - errSpan: nil, - }, { - desc: "empty dst ascii", - src: "a", - nBuf: 0, - dst: "a", - nDst: 0, - nSrc: 0, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 1, - errSpan: nil, - }, { - desc: "short dst 1", - src: "a\uffe0", // ¢ - nBuf: 2, - dst: "a\u00a2", // ¢ - nDst: 1, - nSrc: 3, - atEOF: false, - err: transform.ErrShortDst, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "short dst 2", - src: "不夠", - nBuf: 3, - dst: "不夠", - nDst: 3, - nSrc: 3, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 6, - errSpan: nil, - }, { - // Create a narrow variant of ambiguous runes, if they exist. - desc: "ambiguous", - src: "\u2190", - nBuf: 4, - dst: "\uffe9", - nDst: 3, - nSrc: 3, - atEOF: false, - err: nil, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "short dst fast path", - src: "fast", - nBuf: 3, - dst: "fast", - nDst: 3, - nSrc: 3, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 4, - errSpan: nil, - }, { - desc: "short dst larger buffer", - src: "\uff21" + strings.Repeat("0", 127) + "B", - nBuf: 128, - dst: "A" + strings.Repeat("0", 127) + "B", - nDst: 128, - nSrc: 130, - atEOF: true, - err: transform.ErrShortDst, - nSpan: 0, - errSpan: transform.ErrEndOfSpan, - }, { - desc: "fast path alternation", - src: "fast路徑fast路徑", - nBuf: 20, - dst: "fast路徑fast路徑", - nDst: 20, - nSrc: 20, - atEOF: true, - err: nil, - nSpan: 20, - errSpan: nil, - }} { - tc.doTest(t, Narrow) - } -} - -func bench(b *testing.B, t Transformer, s string) { - dst := make([]byte, 1024) - src := []byte(s) - b.SetBytes(int64(len(src))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - t.Transform(dst, src, true) - } -} - -func changingRunes(f func(r rune) (rune, bool)) string { - buf := &bytes.Buffer{} - for r := rune(0); r <= 0xFFFF; r++ { - if _, ok := foldRune(r); ok { - buf.WriteRune(r) - } - } - return buf.String() -} - -func BenchmarkFoldASCII(b *testing.B) { - bench(b, Fold, testtext.ASCII) -} - -func BenchmarkFoldCJK(b *testing.B) { - bench(b, Fold, testtext.CJK) -} - -func BenchmarkFoldNonCanonical(b *testing.B) { - bench(b, Fold, changingRunes(foldRune)) -} - -func BenchmarkFoldOther(b *testing.B) { - bench(b, Fold, testtext.TwoByteUTF8+testtext.ThreeByteUTF8) -} - -func BenchmarkWideASCII(b *testing.B) { - bench(b, Widen, testtext.ASCII) -} - -func BenchmarkWideCJK(b *testing.B) { - bench(b, Widen, testtext.CJK) -} - -func BenchmarkWideNonCanonical(b *testing.B) { - bench(b, Widen, changingRunes(widenRune)) -} - -func BenchmarkWideOther(b *testing.B) { - bench(b, Widen, testtext.TwoByteUTF8+testtext.ThreeByteUTF8) -} - -func BenchmarkNarrowASCII(b *testing.B) { - bench(b, Narrow, testtext.ASCII) -} - -func BenchmarkNarrowCJK(b *testing.B) { - bench(b, Narrow, testtext.CJK) -} - -func BenchmarkNarrowNonCanonical(b *testing.B) { - bench(b, Narrow, changingRunes(narrowRune)) -} - -func BenchmarkNarrowOther(b *testing.B) { - bench(b, Narrow, testtext.TwoByteUTF8+testtext.ThreeByteUTF8) -} diff --git a/vendor/golang.org/x/text/width/trieval.go b/vendor/golang.org/x/text/width/trieval.go deleted file mode 100644 index ca8e45fd1..000000000 --- a/vendor/golang.org/x/text/width/trieval.go +++ /dev/null @@ -1,30 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package width - -// elem is an entry of the width trie. The high byte is used to encode the type -// of the rune. The low byte is used to store the index to a mapping entry in -// the inverseData array. -type elem uint16 - -const ( - tagNeutral elem = iota << typeShift - tagAmbiguous - tagWide - tagNarrow - tagFullwidth - tagHalfwidth -) - -const ( - numTypeBits = 3 - typeShift = 16 - numTypeBits - - // tagNeedsFold is true for all fullwidth and halfwidth runes except for - // the Won sign U+20A9. - tagNeedsFold = 0x1000 - - // The Korean Won sign is halfwidth, but SHOULD NOT be mapped to a wide - // variant. - wonSign rune = 0x20A9 -) diff --git a/vendor/golang.org/x/text/width/width.go b/vendor/golang.org/x/text/width/width.go deleted file mode 100644 index f1639ca68..000000000 --- a/vendor/golang.org/x/text/width/width.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate stringer -type=Kind -//go:generate go run gen.go gen_common.go gen_trieval.go - -// Package width provides functionality for handling different widths in text. -// -// Wide characters behave like ideographs; they tend to allow line breaks after -// each character and remain upright in vertical text layout. Narrow characters -// are kept together in words or runs that are rotated sideways in vertical text -// layout. -// -// For more information, see http://unicode.org/reports/tr11/. -package width // import "golang.org/x/text/width" - -import ( - "unicode/utf8" - - "golang.org/x/text/transform" -) - -// TODO -// 1) Reduce table size by compressing blocks. -// 2) API proposition for computing display length -// (approximation, fixed pitch only). -// 3) Implement display length. - -// Kind indicates the type of width property as defined in http://unicode.org/reports/tr11/. -type Kind int - -const ( - // Neutral characters do not occur in legacy East Asian character sets. - Neutral Kind = iota - - // EastAsianAmbiguous characters that can be sometimes wide and sometimes - // narrow and require additional information not contained in the character - // code to further resolve their width. - EastAsianAmbiguous - - // EastAsianWide characters are wide in its usual form. They occur only in - // the context of East Asian typography. These runes may have explicit - // halfwidth counterparts. - EastAsianWide - - // EastAsianNarrow characters are narrow in its usual form. They often have - // fullwidth counterparts. - EastAsianNarrow - - // Note: there exist Narrow runes that do not have fullwidth or wide - // counterparts, despite what the definition says (e.g. U+27E6). - - // EastAsianFullwidth characters have a compatibility decompositions of type - // wide that map to a narrow counterpart. - EastAsianFullwidth - - // EastAsianHalfwidth characters have a compatibility decomposition of type - // narrow that map to a wide or ambiguous counterpart, plus U+20A9 ₩ WON - // SIGN. - EastAsianHalfwidth - - // Note: there exist runes that have a halfwidth counterparts but that are - // classified as Ambiguous, rather than wide (e.g. U+2190). -) - -// TODO: the generated tries need to return size 1 for invalid runes for the -// width to be computed correctly (each byte should render width 1) - -var trie = newWidthTrie(0) - -// Lookup reports the Properties of the first rune in b and the number of bytes -// of its UTF-8 encoding. -func Lookup(b []byte) (p Properties, size int) { - v, sz := trie.lookup(b) - return Properties{elem(v), b[sz-1]}, sz -} - -// LookupString reports the Properties of the first rune in s and the number of -// bytes of its UTF-8 encoding. -func LookupString(s string) (p Properties, size int) { - v, sz := trie.lookupString(s) - return Properties{elem(v), s[sz-1]}, sz -} - -// LookupRune reports the Properties of rune r. -func LookupRune(r rune) Properties { - var buf [4]byte - n := utf8.EncodeRune(buf[:], r) - v, _ := trie.lookup(buf[:n]) - last := byte(r) - if r >= utf8.RuneSelf { - last = 0x80 + byte(r&0x3f) - } - return Properties{elem(v), last} -} - -// Properties provides access to width properties of a rune. -type Properties struct { - elem elem - last byte -} - -func (e elem) kind() Kind { - return Kind(e >> typeShift) -} - -// Kind returns the Kind of a rune as defined in Unicode TR #11. -// See http://unicode.org/reports/tr11/ for more details. -func (p Properties) Kind() Kind { - return p.elem.kind() -} - -// Folded returns the folded variant of a rune or 0 if the rune is canonical. -func (p Properties) Folded() rune { - if p.elem&tagNeedsFold != 0 { - buf := inverseData[byte(p.elem)] - buf[buf[0]] ^= p.last - r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]]) - return r - } - return 0 -} - -// Narrow returns the narrow variant of a rune or 0 if the rune is already -// narrow or doesn't have a narrow variant. -func (p Properties) Narrow() rune { - if k := p.elem.kind(); byte(p.elem) != 0 && (k == EastAsianFullwidth || k == EastAsianWide || k == EastAsianAmbiguous) { - buf := inverseData[byte(p.elem)] - buf[buf[0]] ^= p.last - r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]]) - return r - } - return 0 -} - -// Wide returns the wide variant of a rune or 0 if the rune is already -// wide or doesn't have a wide variant. -func (p Properties) Wide() rune { - if k := p.elem.kind(); byte(p.elem) != 0 && (k == EastAsianHalfwidth || k == EastAsianNarrow) { - buf := inverseData[byte(p.elem)] - buf[buf[0]] ^= p.last - r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]]) - return r - } - return 0 -} - -// TODO for Properties: -// - Add Fullwidth/Halfwidth or Inverted methods for computing variants -// mapping. -// - Add width information (including information on non-spacing runes). - -// Transformer implements the transform.Transformer interface. -type Transformer struct { - t transform.SpanningTransformer -} - -// Reset implements the transform.Transformer interface. -func (t Transformer) Reset() { t.t.Reset() } - -// Transform implements the transform.Transformer interface. -func (t Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - return t.t.Transform(dst, src, atEOF) -} - -// Span implements the transform.SpanningTransformer interface. -func (t Transformer) Span(src []byte, atEOF bool) (n int, err error) { - return t.t.Span(src, atEOF) -} - -// Bytes returns a new byte slice with the result of applying t to b. -func (t Transformer) Bytes(b []byte) []byte { - b, _, _ = transform.Bytes(t, b) - return b -} - -// String returns a string with the result of applying t to s. -func (t Transformer) String(s string) string { - s, _, _ = transform.String(t, s) - return s -} - -var ( - // Fold is a transform that maps all runes to their canonical width. - // - // Note that the NFKC and NFKD transforms in golang.org/x/text/unicode/norm - // provide a more generic folding mechanism. - Fold Transformer = Transformer{foldTransform{}} - - // Widen is a transform that maps runes to their wide variant, if - // available. - Widen Transformer = Transformer{wideTransform{}} - - // Narrow is a transform that maps runes to their narrow variant, if - // available. - Narrow Transformer = Transformer{narrowTransform{}} -) - -// TODO: Consider the following options: -// - Treat Ambiguous runes that have a halfwidth counterpart as wide, or some -// generalized variant of this. -// - Consider a wide Won character to be the default width (or some generalized -// variant of this). -// - Filter the set of characters that gets converted (the preferred approach is -// to allow applying filters to transforms).